summaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 08:50:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 08:50:31 +0000
commitaed8ce9da277f5ecffe968b324f242c41c3b752a (patch)
treed2e538394cb7a8a7c42a4aac6ccf1a8e3256999b /runtime
parentInitial commit. (diff)
downloadvim-upstream.tar.xz
vim-upstream.zip
Adding upstream version 2:9.0.1378.upstream/2%9.0.1378upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'runtime')
-rw-r--r--runtime/autoload/README.txt22
-rw-r--r--runtime/autoload/RstFold.vim62
-rw-r--r--runtime/autoload/ada.vim637
-rw-r--r--runtime/autoload/adacomplete.vim109
-rw-r--r--runtime/autoload/bitbake.vim95
-rw-r--r--runtime/autoload/ccomplete.vim693
-rw-r--r--runtime/autoload/clojurecomplete.vim23
-rw-r--r--runtime/autoload/context.vim100
-rw-r--r--runtime/autoload/contextcomplete.vim25
-rw-r--r--runtime/autoload/csscomplete.vim742
-rw-r--r--runtime/autoload/decada.vim75
-rw-r--r--runtime/autoload/dist/ft.vim1108
-rw-r--r--runtime/autoload/dist/man.vim196
-rw-r--r--runtime/autoload/dist/script.vim434
-rw-r--r--runtime/autoload/dist/vimindent.vim1257
-rw-r--r--runtime/autoload/freebasic.vim40
-rw-r--r--runtime/autoload/getscript.vim667
-rw-r--r--runtime/autoload/gnat.vim147
-rw-r--r--runtime/autoload/gzip.vim220
-rw-r--r--runtime/autoload/haskellcomplete.vim3385
-rw-r--r--runtime/autoload/htmlcomplete.vim809
-rw-r--r--runtime/autoload/javascriptcomplete.vim647
-rw-r--r--runtime/autoload/netrw.vim12741
-rw-r--r--runtime/autoload/netrwFileHandlers.vim362
-rw-r--r--runtime/autoload/netrwSettings.vim249
-rw-r--r--runtime/autoload/netrw_gitignore.vim22
-rw-r--r--runtime/autoload/paste.vim25
-rw-r--r--runtime/autoload/phpcomplete.vim2988
-rw-r--r--runtime/autoload/python.vim249
-rw-r--r--runtime/autoload/python3complete.vim611
-rw-r--r--runtime/autoload/pythoncomplete.vim627
-rw-r--r--runtime/autoload/rubycomplete.vim872
-rw-r--r--runtime/autoload/rust.vim415
-rw-r--r--runtime/autoload/rustfmt.vim107
-rw-r--r--runtime/autoload/spellfile.vim206
-rw-r--r--runtime/autoload/sqlcomplete.vim996
-rw-r--r--runtime/autoload/syntaxcomplete.vim810
-rw-r--r--runtime/autoload/tar.vim818
-rw-r--r--runtime/autoload/tohtml.vim950
-rw-r--r--runtime/autoload/typeset.vim233
-rw-r--r--runtime/autoload/vimball.vim775
-rw-r--r--runtime/autoload/xml/html32.vim383
-rw-r--r--runtime/autoload/xml/html401f.vim468
-rw-r--r--runtime/autoload/xml/html401s.vim410
-rw-r--r--runtime/autoload/xml/html401t.vim460
-rw-r--r--runtime/autoload/xml/html40f.vim468
-rw-r--r--runtime/autoload/xml/html40s.vim410
-rw-r--r--runtime/autoload/xml/html40t.vim460
-rw-r--r--runtime/autoload/xml/xhtml10f.vim469
-rw-r--r--runtime/autoload/xml/xhtml10s.vim410
-rw-r--r--runtime/autoload/xml/xhtml10t.vim460
-rw-r--r--runtime/autoload/xml/xhtml11.vim434
-rw-r--r--runtime/autoload/xml/xsd.vim130
-rw-r--r--runtime/autoload/xml/xsl.vim38
-rw-r--r--runtime/autoload/xmlcomplete.vim539
-rw-r--r--runtime/autoload/xmlformat.vim203
-rw-r--r--runtime/autoload/zig/fmt.vim100
-rw-r--r--runtime/autoload/zip.vim470
-rw-r--r--runtime/bitmaps/vim.icobin0 -> 28786 bytes
-rw-r--r--runtime/bugreport.vim86
-rw-r--r--runtime/colors/README.txt145
-rw-r--r--runtime/colors/blue.vim586
-rw-r--r--runtime/colors/darkblue.vim470
-rw-r--r--runtime/colors/default.vim23
-rw-r--r--runtime/colors/delek.vim411
-rw-r--r--runtime/colors/desert.vim400
-rw-r--r--runtime/colors/elflord.vim449
-rw-r--r--runtime/colors/evening.vim531
-rw-r--r--runtime/colors/habamax.vim523
-rw-r--r--runtime/colors/industry.vim412
-rw-r--r--runtime/colors/koehler.vim426
-rw-r--r--runtime/colors/lists/csscolors.vim166
-rw-r--r--runtime/colors/lists/default.vim807
-rw-r--r--runtime/colors/lunaperche.vim1002
-rw-r--r--runtime/colors/morning.vim403
-rw-r--r--runtime/colors/murphy.vim397
-rw-r--r--runtime/colors/pablo.vim430
-rw-r--r--runtime/colors/peachpuff.vim408
-rw-r--r--runtime/colors/quiet.vim702
-rw-r--r--runtime/colors/ron.vim444
-rw-r--r--runtime/colors/shine.vim416
-rw-r--r--runtime/colors/slate.vim431
-rw-r--r--runtime/colors/tools/check_colors.vim221
-rw-r--r--runtime/colors/torte.vim423
-rw-r--r--runtime/colors/zellner.vim411
-rw-r--r--runtime/compiler/README.txt11
-rw-r--r--runtime/compiler/ant.vim38
-rw-r--r--runtime/compiler/bcc.vim19
-rw-r--r--runtime/compiler/bdf.vim22
-rw-r--r--runtime/compiler/cargo.vim35
-rw-r--r--runtime/compiler/checkstyle.vim29
-rw-r--r--runtime/compiler/cm3.vim26
-rw-r--r--runtime/compiler/context.vim48
-rw-r--r--runtime/compiler/cs.vim26
-rw-r--r--runtime/compiler/csslint.vim16
-rw-r--r--runtime/compiler/cucumber.vim29
-rw-r--r--runtime/compiler/dart.vim26
-rw-r--r--runtime/compiler/dart2js.vim28
-rw-r--r--runtime/compiler/dart2native.vim28
-rw-r--r--runtime/compiler/dartanalyser.vim23
-rw-r--r--runtime/compiler/dartdevc.vim28
-rw-r--r--runtime/compiler/dartdoc.vim26
-rw-r--r--runtime/compiler/dartfmt.vim25
-rw-r--r--runtime/compiler/decada.vim58
-rw-r--r--runtime/compiler/dot.vim15
-rw-r--r--runtime/compiler/dotnet.vim39
-rw-r--r--runtime/compiler/erlang.vim13
-rw-r--r--runtime/compiler/eruby.vim40
-rw-r--r--runtime/compiler/eslint.vim16
-rw-r--r--runtime/compiler/fbc.vim27
-rw-r--r--runtime/compiler/fortran_F.vim27
-rw-r--r--runtime/compiler/fortran_cv.vim30
-rw-r--r--runtime/compiler/fortran_elf90.vim33
-rw-r--r--runtime/compiler/fortran_g77.vim48
-rw-r--r--runtime/compiler/fortran_lf95.vim27
-rw-r--r--runtime/compiler/fpc.vim17
-rw-r--r--runtime/compiler/g95.vim28
-rw-r--r--runtime/compiler/gawk.vim34
-rw-r--r--runtime/compiler/gcc.vim43
-rw-r--r--runtime/compiler/gfortran.vim27
-rw-r--r--runtime/compiler/ghc.vim26
-rw-r--r--runtime/compiler/gjs.vim25
-rw-r--r--runtime/compiler/gnat.vim76
-rw-r--r--runtime/compiler/go.vim29
-rw-r--r--runtime/compiler/haml.vim28
-rw-r--r--runtime/compiler/hare.vim31
-rw-r--r--runtime/compiler/hp_acc.vim38
-rw-r--r--runtime/compiler/icc.vim18
-rw-r--r--runtime/compiler/icon.vim33
-rw-r--r--runtime/compiler/ifort.vim27
-rw-r--r--runtime/compiler/intel.vim26
-rw-r--r--runtime/compiler/irix5_c.vim26
-rw-r--r--runtime/compiler/irix5_cpp.vim26
-rw-r--r--runtime/compiler/javac.vim26
-rw-r--r--runtime/compiler/jest.vim32
-rw-r--r--runtime/compiler/jikes.vim18
-rw-r--r--runtime/compiler/jjs.vim24
-rw-r--r--runtime/compiler/jshint.vim25
-rw-r--r--runtime/compiler/jsonlint.vim25
-rw-r--r--runtime/compiler/mcs.vim30
-rw-r--r--runtime/compiler/mips_c.vim26
-rw-r--r--runtime/compiler/mipspro_c89.vim27
-rw-r--r--runtime/compiler/mipspro_cpp.vim26
-rw-r--r--runtime/compiler/modelsim_vcom.vim20
-rw-r--r--runtime/compiler/msbuild.vim21
-rw-r--r--runtime/compiler/msvc.vim13
-rw-r--r--runtime/compiler/neato.vim15
-rw-r--r--runtime/compiler/ocaml.vim56
-rw-r--r--runtime/compiler/onsgmls.vim24
-rw-r--r--runtime/compiler/pbx.vim20
-rw-r--r--runtime/compiler/perl.vim51
-rw-r--r--runtime/compiler/perlcritic.vim27
-rw-r--r--runtime/compiler/php.vim26
-rw-r--r--runtime/compiler/podchecker.vim28
-rw-r--r--runtime/compiler/powershell.vim84
-rw-r--r--runtime/compiler/pylint.vim16
-rw-r--r--runtime/compiler/pyunit.vim16
-rw-r--r--runtime/compiler/raco.vim14
-rw-r--r--runtime/compiler/racomake.vim14
-rw-r--r--runtime/compiler/racosetup.vim14
-rw-r--r--runtime/compiler/racotest.vim14
-rw-r--r--runtime/compiler/rake.vim40
-rw-r--r--runtime/compiler/rhino.vim30
-rw-r--r--runtime/compiler/rspec.vim36
-rw-r--r--runtime/compiler/rst.vim32
-rw-r--r--runtime/compiler/rubocop.vim23
-rw-r--r--runtime/compiler/ruby.vim45
-rw-r--r--runtime/compiler/rubyunit.vim36
-rw-r--r--runtime/compiler/rustc.vim46
-rw-r--r--runtime/compiler/sass.vim30
-rw-r--r--runtime/compiler/scdoc.vim17
-rw-r--r--runtime/compiler/se.vim30
-rw-r--r--runtime/compiler/shellcheck.vim25
-rw-r--r--runtime/compiler/sml.vim28
-rw-r--r--runtime/compiler/spectral.vim17
-rw-r--r--runtime/compiler/splint.vim71
-rw-r--r--runtime/compiler/stack.vim37
-rw-r--r--runtime/compiler/standard.vim16
-rw-r--r--runtime/compiler/stylelint.vim26
-rw-r--r--runtime/compiler/tcl.vim17
-rw-r--r--runtime/compiler/tex.vim67
-rw-r--r--runtime/compiler/tidy.vim26
-rw-r--r--runtime/compiler/ts-node.vim29
-rw-r--r--runtime/compiler/tsc.vim26
-rw-r--r--runtime/compiler/typedoc.vim28
-rw-r--r--runtime/compiler/xbuild.vim22
-rw-r--r--runtime/compiler/xmllint.vim28
-rw-r--r--runtime/compiler/xmlwf.vim23
-rw-r--r--runtime/compiler/xo.vim26
-rw-r--r--runtime/compiler/yamllint.vim16
-rw-r--r--runtime/compiler/zig.vim28
-rw-r--r--runtime/compiler/zig_build.vim29
-rw-r--r--runtime/compiler/zig_build_exe.vim27
-rw-r--r--runtime/compiler/zig_test.vim27
-rw-r--r--runtime/compiler/zsh.vim23
-rw-r--r--runtime/defaults.vim154
-rw-r--r--runtime/delmenu.vim57
-rwxr-xr-xruntime/doc.infobin0 -> 624 bytes
-rw-r--r--runtime/doc/Makefile549
-rw-r--r--runtime/doc/arabic.txt328
-rw-r--r--runtime/doc/autocmd.txt1921
-rw-r--r--runtime/doc/builtin.txt10873
-rw-r--r--runtime/doc/change.txt1973
-rw-r--r--runtime/doc/channel.txt1562
-rw-r--r--runtime/doc/cmdline.txt1301
-rw-r--r--runtime/doc/debug.txt170
-rw-r--r--runtime/doc/debugger.txt134
-rw-r--r--runtime/doc/develop.txt597
-rw-r--r--runtime/doc/diff.txt478
-rw-r--r--runtime/doc/digraph.txt1491
-rw-r--r--runtime/doc/doctags.c94
-rw-r--r--runtime/doc/doctags.vim13
-rw-r--r--runtime/doc/editing.txt1839
-rw-r--r--runtime/doc/eval.txt4763
-rw-r--r--runtime/doc/evim-fr.157
-rw-r--r--runtime/doc/evim-fr.UTF-8.157
-rw-r--r--runtime/doc/evim-it.154
-rw-r--r--runtime/doc/evim-it.UTF-8.154
-rw-r--r--runtime/doc/evim-ja.UTF-8.148
-rw-r--r--runtime/doc/evim-pl.153
-rw-r--r--runtime/doc/evim-pl.UTF-8.153
-rw-r--r--runtime/doc/evim-ru.159
-rw-r--r--runtime/doc/evim-ru.UTF-8.159
-rw-r--r--runtime/doc/evim-tr.148
-rw-r--r--runtime/doc/evim-tr.UTF-8.148
-rw-r--r--runtime/doc/evim.149
-rw-r--r--runtime/doc/evim.man52
-rw-r--r--runtime/doc/farsi.txt19
-rw-r--r--runtime/doc/filetype.txt803
-rw-r--r--runtime/doc/fold.txt628
-rw-r--r--runtime/doc/ft_ada.txt515
-rw-r--r--runtime/doc/ft_context.txt158
-rw-r--r--runtime/doc/ft_mp.txt151
-rw-r--r--runtime/doc/ft_ps1.txt64
-rw-r--r--runtime/doc/ft_raku.txt126
-rw-r--r--runtime/doc/ft_rust.txt239
-rw-r--r--runtime/doc/ft_sql.txt780
-rw-r--r--runtime/doc/gui.txt1257
-rw-r--r--runtime/doc/gui_w32.txt457
-rw-r--r--runtime/doc/gui_x11.txt731
-rw-r--r--runtime/doc/hangulin.txt17
-rw-r--r--runtime/doc/hebrew.txt139
-rw-r--r--runtime/doc/help.txt253
-rwxr-xr-xruntime/doc/help.txt.infobin0 -> 582 bytes
-rw-r--r--runtime/doc/helphelp.txt410
-rw-r--r--runtime/doc/howto.txt96
-rw-r--r--runtime/doc/if_cscop.txt486
-rw-r--r--runtime/doc/if_lua.txt550
-rw-r--r--runtime/doc/if_mzsch.txt318
-rw-r--r--runtime/doc/if_ole.txt199
-rw-r--r--runtime/doc/if_perl.txt310
-rw-r--r--runtime/doc/if_pyth.txt974
-rw-r--r--runtime/doc/if_ruby.txt254
-rw-r--r--runtime/doc/if_sniff.txt11
-rw-r--r--runtime/doc/if_tcl.txt546
-rw-r--r--runtime/doc/indent.txt1260
-rw-r--r--runtime/doc/index.txt1769
-rw-r--r--runtime/doc/insert.txt2138
-rw-r--r--runtime/doc/intro.txt908
-rw-r--r--runtime/doc/makehtml.awk787
-rw-r--r--runtime/doc/maketags.awk42
-rw-r--r--runtime/doc/map.txt1928
-rw-r--r--runtime/doc/mbyte.txt1452
-rw-r--r--runtime/doc/message.txt889
-rw-r--r--runtime/doc/mlang.txt222
-rw-r--r--runtime/doc/motion.txt1353
-rw-r--r--runtime/doc/netbeans.txt1027
-rw-r--r--runtime/doc/options.txt9541
-rw-r--r--runtime/doc/os_390.txt134
-rw-r--r--runtime/doc/os_amiga.txt147
-rw-r--r--runtime/doc/os_beos.txt13
-rw-r--r--runtime/doc/os_dos.txt383
-rw-r--r--runtime/doc/os_haiku.txt235
-rw-r--r--runtime/doc/os_mac.txt182
-rw-r--r--runtime/doc/os_mint.txt15
-rw-r--r--runtime/doc/os_msdos.txt15
-rw-r--r--runtime/doc/os_os2.txt13
-rw-r--r--runtime/doc/os_qnx.txt138
-rw-r--r--runtime/doc/os_risc.txt12
-rw-r--r--runtime/doc/os_unix.txt61
-rw-r--r--runtime/doc/os_vms.txt968
-rw-r--r--runtime/doc/os_win32.txt338
-rw-r--r--runtime/doc/pattern.txt1503
-rw-r--r--runtime/doc/pi_getscript.txt482
-rw-r--r--runtime/doc/pi_gzip.txt41
-rw-r--r--runtime/doc/pi_logipat.txt122
-rw-r--r--runtime/doc/pi_netrw.txt4419
-rw-r--r--runtime/doc/pi_paren.txt60
-rw-r--r--runtime/doc/pi_spec.txt111
-rw-r--r--runtime/doc/pi_tar.txt170
-rw-r--r--runtime/doc/pi_vimball.txt276
-rw-r--r--runtime/doc/pi_zip.txt160
-rw-r--r--runtime/doc/popup.txt1104
-rw-r--r--runtime/doc/print.txt758
-rw-r--r--runtime/doc/quickfix.txt2056
-rw-r--r--runtime/doc/quickref.txt1475
-rw-r--r--runtime/doc/quotes.txt275
-rw-r--r--runtime/doc/recover.txt238
-rw-r--r--runtime/doc/remote.txt209
-rw-r--r--runtime/doc/repeat.txt1177
-rw-r--r--runtime/doc/rileft.txt124
-rw-r--r--runtime/doc/russian.txt73
-rw-r--r--runtime/doc/scroll.txt338
-rw-r--r--runtime/doc/sign.txt776
-rw-r--r--runtime/doc/spell.txt1680
-rw-r--r--runtime/doc/sponsor.txt202
-rw-r--r--runtime/doc/starting.txt1707
-rw-r--r--runtime/doc/syntax.txt5961
-rw-r--r--runtime/doc/tabpage.txt483
-rw-r--r--runtime/doc/tags11241
-rw-r--r--runtime/doc/tagsrch.txt960
-rw-r--r--runtime/doc/term.txt1182
-rw-r--r--runtime/doc/terminal.txt1569
-rw-r--r--runtime/doc/test_urls.vim68
-rw-r--r--runtime/doc/testing.txt624
-rw-r--r--runtime/doc/textprop.txt509
-rw-r--r--runtime/doc/tips.txt559
-rw-r--r--runtime/doc/todo.txt6248
-rw-r--r--runtime/doc/uganda.txt259
-rw-r--r--runtime/doc/undo.txt411
-rw-r--r--runtime/doc/userfunc.txt546
-rw-r--r--runtime/doc/usr_01.txt192
-rw-r--r--runtime/doc/usr_02.txt702
-rw-r--r--runtime/doc/usr_03.txt661
-rw-r--r--runtime/doc/usr_04.txt516
-rw-r--r--runtime/doc/usr_05.txt776
-rw-r--r--runtime/doc/usr_06.txt302
-rw-r--r--runtime/doc/usr_07.txt479
-rw-r--r--runtime/doc/usr_08.txt601
-rw-r--r--runtime/doc/usr_09.txt290
-rw-r--r--runtime/doc/usr_10.txt825
-rw-r--r--runtime/doc/usr_11.txt318
-rw-r--r--runtime/doc/usr_12.txt358
-rw-r--r--runtime/doc/usr_20.txt384
-rw-r--r--runtime/doc/usr_21.txt502
-rw-r--r--runtime/doc/usr_22.txt414
-rw-r--r--runtime/doc/usr_23.txt345
-rw-r--r--runtime/doc/usr_24.txt606
-rw-r--r--runtime/doc/usr_25.txt583
-rw-r--r--runtime/doc/usr_26.txt221
-rw-r--r--runtime/doc/usr_27.txt563
-rw-r--r--runtime/doc/usr_28.txt426
-rw-r--r--runtime/doc/usr_29.txt614
-rw-r--r--runtime/doc/usr_30.txt643
-rw-r--r--runtime/doc/usr_31.txt272
-rw-r--r--runtime/doc/usr_32.txt180
-rw-r--r--runtime/doc/usr_40.txt668
-rw-r--r--runtime/doc/usr_41.txt1900
-rw-r--r--runtime/doc/usr_42.txt366
-rw-r--r--runtime/doc/usr_43.txt179
-rw-r--r--runtime/doc/usr_44.txt708
-rw-r--r--runtime/doc/usr_45.txt413
-rw-r--r--runtime/doc/usr_50.txt131
-rw-r--r--runtime/doc/usr_51.txt694
-rw-r--r--runtime/doc/usr_52.txt343
-rw-r--r--runtime/doc/usr_90.txt479
-rw-r--r--runtime/doc/usr_toc.txt378
-rw-r--r--runtime/doc/various.txt799
-rw-r--r--runtime/doc/version4.txt355
-rw-r--r--runtime/doc/version5.txt7813
-rw-r--r--runtime/doc/version6.txt14530
-rw-r--r--runtime/doc/version7.txt18312
-rw-r--r--runtime/doc/version8.txt41150
-rw-r--r--runtime/doc/version9.txt31671
-rw-r--r--runtime/doc/vi_diff.txt1365
-rw-r--r--runtime/doc/vim-da.1555
-rw-r--r--runtime/doc/vim-da.UTF-8.1555
-rw-r--r--runtime/doc/vim-de.1478
-rw-r--r--runtime/doc/vim-de.UTF-8.1478
-rw-r--r--runtime/doc/vim-fr.1589
-rw-r--r--runtime/doc/vim-fr.UTF-8.1589
-rw-r--r--runtime/doc/vim-it.1566
-rw-r--r--runtime/doc/vim-it.UTF-8.1566
-rw-r--r--runtime/doc/vim-ja.UTF-8.1492
-rw-r--r--runtime/doc/vim-pl.1558
-rw-r--r--runtime/doc/vim-pl.UTF-8.1558
-rw-r--r--runtime/doc/vim-ru.1489
-rw-r--r--runtime/doc/vim-ru.UTF-8.1489
-rw-r--r--runtime/doc/vim-tr.1544
-rw-r--r--runtime/doc/vim-tr.UTF-8.1544
-rw-r--r--runtime/doc/vim.1558
-rw-r--r--runtime/doc/vim.man435
-rwxr-xr-xruntime/doc/vim.man.infobin0 -> 582 bytes
-rw-r--r--runtime/doc/vim2html.pl228
-rw-r--r--runtime/doc/vim9.txt2246
-rw-r--r--runtime/doc/vim9class.txt900
-rw-r--r--runtime/doc/vimdiff-da.150
-rw-r--r--runtime/doc/vimdiff-da.UTF-8.150
-rw-r--r--runtime/doc/vimdiff-fr.154
-rw-r--r--runtime/doc/vimdiff-fr.UTF-8.154
-rw-r--r--runtime/doc/vimdiff-it.148
-rw-r--r--runtime/doc/vimdiff-it.UTF-8.148
-rw-r--r--runtime/doc/vimdiff-ja.UTF-8.139
-rw-r--r--runtime/doc/vimdiff-pl.146
-rw-r--r--runtime/doc/vimdiff-pl.UTF-8.146
-rw-r--r--runtime/doc/vimdiff-ru.150
-rw-r--r--runtime/doc/vimdiff-ru.UTF-8.150
-rw-r--r--runtime/doc/vimdiff-tr.145
-rw-r--r--runtime/doc/vimdiff-tr.UTF-8.145
-rw-r--r--runtime/doc/vimdiff.146
-rw-r--r--runtime/doc/vimdiff.man47
-rw-r--r--runtime/doc/vimtutor-da.153
-rw-r--r--runtime/doc/vimtutor-da.UTF-8.153
-rw-r--r--runtime/doc/vimtutor-fr.160
-rw-r--r--runtime/doc/vimtutor-fr.UTF-8.160
-rw-r--r--runtime/doc/vimtutor-it.158
-rw-r--r--runtime/doc/vimtutor-it.UTF-8.158
-rw-r--r--runtime/doc/vimtutor-ja.UTF-8.144
-rw-r--r--runtime/doc/vimtutor-pl.151
-rw-r--r--runtime/doc/vimtutor-pl.UTF-8.151
-rw-r--r--runtime/doc/vimtutor-ru.151
-rw-r--r--runtime/doc/vimtutor-ru.UTF-8.151
-rw-r--r--runtime/doc/vimtutor-tr.150
-rw-r--r--runtime/doc/vimtutor-tr.UTF-8.150
-rw-r--r--runtime/doc/vimtutor.157
-rw-r--r--runtime/doc/vimtutor.man50
-rw-r--r--runtime/doc/visual.txt559
-rw-r--r--runtime/doc/windows.txt1440
-rw-r--r--runtime/doc/workshop.txt14
-rw-r--r--runtime/doc/xxd-fr.1396
-rw-r--r--runtime/doc/xxd-fr.UTF-8.1396
-rw-r--r--runtime/doc/xxd-it.1402
-rw-r--r--runtime/doc/xxd-it.UTF-8.1402
-rw-r--r--runtime/doc/xxd-ja.UTF-8.1377
-rw-r--r--runtime/doc/xxd-pl.1389
-rw-r--r--runtime/doc/xxd-pl.UTF-8.1389
-rw-r--r--runtime/doc/xxd-ru.1408
-rw-r--r--runtime/doc/xxd-ru.UTF-8.1408
-rw-r--r--runtime/doc/xxd.1393
-rw-r--r--runtime/doc/xxd.man275
-rw-r--r--runtime/evim.vim74
-rw-r--r--runtime/filetype.vim2776
-rw-r--r--runtime/ftoff.vim11
-rw-r--r--runtime/ftplugin.vim43
-rw-r--r--runtime/ftplugin/8th.vim27
-rw-r--r--runtime/ftplugin/README.txt24
-rw-r--r--runtime/ftplugin/a2ps.vim20
-rw-r--r--runtime/ftplugin/aap.vim32
-rw-r--r--runtime/ftplugin/abap.vim29
-rw-r--r--runtime/ftplugin/abaqus.vim118
-rw-r--r--runtime/ftplugin/ada.vim211
-rw-r--r--runtime/ftplugin/alsaconf.vim19
-rw-r--r--runtime/ftplugin/ant.vim46
-rw-r--r--runtime/ftplugin/apache.vim16
-rw-r--r--runtime/ftplugin/arch.vim19
-rw-r--r--runtime/ftplugin/art.vim15
-rw-r--r--runtime/ftplugin/asm.vim11
-rw-r--r--runtime/ftplugin/aspvbs.vim62
-rw-r--r--runtime/ftplugin/automake.vim16
-rw-r--r--runtime/ftplugin/awk.vim56
-rw-r--r--runtime/ftplugin/bash.vim20
-rw-r--r--runtime/ftplugin/basic.vim57
-rw-r--r--runtime/ftplugin/bdf.vim20
-rw-r--r--runtime/ftplugin/bitbake.vim16
-rw-r--r--runtime/ftplugin/bst.vim15
-rw-r--r--runtime/ftplugin/btm.vim12
-rw-r--r--runtime/ftplugin/bzl.vim96
-rw-r--r--runtime/ftplugin/c.vim73
-rw-r--r--runtime/ftplugin/calendar.vim20
-rw-r--r--runtime/ftplugin/cdrdaoconf.vim18
-rw-r--r--runtime/ftplugin/cfg.vim19
-rw-r--r--runtime/ftplugin/ch.vim17
-rw-r--r--runtime/ftplugin/changelog.vim307
-rw-r--r--runtime/ftplugin/chatito.vim15
-rw-r--r--runtime/ftplugin/chicken.vim55
-rw-r--r--runtime/ftplugin/clojure.vim80
-rw-r--r--runtime/ftplugin/cmake.vim34
-rw-r--r--runtime/ftplugin/cobol.vim269
-rw-r--r--runtime/ftplugin/conf.vim19
-rw-r--r--runtime/ftplugin/config.vim44
-rw-r--r--runtime/ftplugin/confini.vim10
-rw-r--r--runtime/ftplugin/context.vim115
-rw-r--r--runtime/ftplugin/cpp.vim17
-rw-r--r--runtime/ftplugin/crm.vim19
-rw-r--r--runtime/ftplugin/crontab.vim16
-rw-r--r--runtime/ftplugin/cs.vim44
-rw-r--r--runtime/ftplugin/csc.vim29
-rw-r--r--runtime/ftplugin/csh.vim51
-rw-r--r--runtime/ftplugin/css.vim25
-rw-r--r--runtime/ftplugin/cucumber.vim150
-rw-r--r--runtime/ftplugin/cvsrc.vim19
-rw-r--r--runtime/ftplugin/debchangelog.vim394
-rw-r--r--runtime/ftplugin/debcontrol.vim70
-rw-r--r--runtime/ftplugin/denyhosts.vim18
-rw-r--r--runtime/ftplugin/desktop.vim13
-rw-r--r--runtime/ftplugin/dictconf.vim19
-rw-r--r--runtime/ftplugin/dictdconf.vim19
-rw-r--r--runtime/ftplugin/diff.vim23
-rw-r--r--runtime/ftplugin/dircolors.vim19
-rw-r--r--runtime/ftplugin/docbk.vim24
-rw-r--r--runtime/ftplugin/dockerfile.vim16
-rw-r--r--runtime/ftplugin/dosbatch.vim48
-rw-r--r--runtime/ftplugin/dosini.vim19
-rw-r--r--runtime/ftplugin/dtd.vim42
-rw-r--r--runtime/ftplugin/dtrace.vim40
-rw-r--r--runtime/ftplugin/dune.vim20
-rw-r--r--runtime/ftplugin/eiffel.vim96
-rw-r--r--runtime/ftplugin/elinks.vim19
-rw-r--r--runtime/ftplugin/elixir.vim33
-rw-r--r--runtime/ftplugin/elm.vim20
-rw-r--r--runtime/ftplugin/erlang.vim105
-rw-r--r--runtime/ftplugin/eruby.vim132
-rw-r--r--runtime/ftplugin/eterm.vim20
-rw-r--r--runtime/ftplugin/expect.vim24
-rw-r--r--runtime/ftplugin/falcon.vim49
-rw-r--r--runtime/ftplugin/fennel.vim18
-rw-r--r--runtime/ftplugin/fetchmail.vim16
-rw-r--r--runtime/ftplugin/fish.vim15
-rw-r--r--runtime/ftplugin/flexwiki.vim59
-rw-r--r--runtime/ftplugin/fortran.vim142
-rw-r--r--runtime/ftplugin/fpcmake.vim25
-rw-r--r--runtime/ftplugin/framescript.vim30
-rw-r--r--runtime/ftplugin/freebasic.vim81
-rw-r--r--runtime/ftplugin/fstab.vim19
-rw-r--r--runtime/ftplugin/fvwm.vim14
-rw-r--r--runtime/ftplugin/gdb.vim12
-rw-r--r--runtime/ftplugin/gdscript.vim59
-rw-r--r--runtime/ftplugin/gdshader.vim13
-rw-r--r--runtime/ftplugin/gitattributes.vim13
-rw-r--r--runtime/ftplugin/gitcommit.vim57
-rw-r--r--runtime/ftplugin/gitconfig.vim15
-rw-r--r--runtime/ftplugin/gitignore.vim13
-rw-r--r--runtime/ftplugin/gitrebase.vim45
-rw-r--r--runtime/ftplugin/gitsendemail.vim6
-rw-r--r--runtime/ftplugin/go.vim18
-rw-r--r--runtime/ftplugin/gpg.vim19
-rw-r--r--runtime/ftplugin/gprof.vim36
-rw-r--r--runtime/ftplugin/groovy.vim19
-rw-r--r--runtime/ftplugin/group.vim19
-rw-r--r--runtime/ftplugin/grub.vim19
-rw-r--r--runtime/ftplugin/gyp.vim14
-rw-r--r--runtime/ftplugin/haml.vim71
-rw-r--r--runtime/ftplugin/hamster.vim65
-rw-r--r--runtime/ftplugin/hare.vim27
-rw-r--r--runtime/ftplugin/haskell.vim22
-rw-r--r--runtime/ftplugin/heex.vim16
-rw-r--r--runtime/ftplugin/help.vim22
-rw-r--r--runtime/ftplugin/hgcommit.vim16
-rw-r--r--runtime/ftplugin/hog.vim39
-rw-r--r--runtime/ftplugin/hostconf.vim18
-rw-r--r--runtime/ftplugin/hostsaccess.vim19
-rw-r--r--runtime/ftplugin/html.vim55
-rw-r--r--runtime/ftplugin/htmldjango.vim13
-rw-r--r--runtime/ftplugin/i3config.vim13
-rw-r--r--runtime/ftplugin/icon.vim36
-rw-r--r--runtime/ftplugin/indent.vim21
-rw-r--r--runtime/ftplugin/initex.vim39
-rw-r--r--runtime/ftplugin/ishd.vim33
-rw-r--r--runtime/ftplugin/j.vim83
-rw-r--r--runtime/ftplugin/java.vim53
-rw-r--r--runtime/ftplugin/javascript.vim75
-rw-r--r--runtime/ftplugin/javascriptreact.vim7
-rw-r--r--runtime/ftplugin/jproperties.vim15
-rw-r--r--runtime/ftplugin/json.vim17
-rw-r--r--runtime/ftplugin/jsonc.vim21
-rw-r--r--runtime/ftplugin/jsonnet.vim17
-rw-r--r--runtime/ftplugin/jsp.vim69
-rw-r--r--runtime/ftplugin/julia.vim92
-rw-r--r--runtime/ftplugin/kconfig.vim27
-rw-r--r--runtime/ftplugin/kwt.vim32
-rw-r--r--runtime/ftplugin/ld.vim20
-rw-r--r--runtime/ftplugin/less.vim20
-rw-r--r--runtime/ftplugin/lftp.vim19
-rw-r--r--runtime/ftplugin/libao.vim19
-rw-r--r--runtime/ftplugin/limits.vim19
-rw-r--r--runtime/ftplugin/liquid.vim61
-rw-r--r--runtime/ftplugin/lisp.vim24
-rw-r--r--runtime/ftplugin/logcheck.vim17
-rw-r--r--runtime/ftplugin/loginaccess.vim19
-rw-r--r--runtime/ftplugin/logindefs.vim19
-rw-r--r--runtime/ftplugin/logtalk.dict262
-rw-r--r--runtime/ftplugin/logtalk.vim19
-rw-r--r--runtime/ftplugin/lprolog.vim37
-rw-r--r--runtime/ftplugin/lua.vim49
-rw-r--r--runtime/ftplugin/lynx.vim29
-rw-r--r--runtime/ftplugin/m3build.vim23
-rw-r--r--runtime/ftplugin/m3quake.vim35
-rw-r--r--runtime/ftplugin/m4.vim20
-rw-r--r--runtime/ftplugin/mail.vim46
-rw-r--r--runtime/ftplugin/mailaliases.vim18
-rw-r--r--runtime/ftplugin/mailcap.vim19
-rw-r--r--runtime/ftplugin/make.vim33
-rw-r--r--runtime/ftplugin/man.vim69
-rw-r--r--runtime/ftplugin/manconf.vim19
-rw-r--r--runtime/ftplugin/markdown.vim92
-rw-r--r--runtime/ftplugin/masm.vim32
-rw-r--r--runtime/ftplugin/matlab.vim34
-rw-r--r--runtime/ftplugin/mermaid.vim49
-rw-r--r--runtime/ftplugin/meson.vim39
-rw-r--r--runtime/ftplugin/mf.vim82
-rw-r--r--runtime/ftplugin/mma.vim16
-rw-r--r--runtime/ftplugin/modconf.vim20
-rw-r--r--runtime/ftplugin/modula2.vim39
-rw-r--r--runtime/ftplugin/modula3.vim42
-rw-r--r--runtime/ftplugin/mp.vim91
-rw-r--r--runtime/ftplugin/mplayerconf.vim20
-rw-r--r--runtime/ftplugin/mrxvtrc.vim22
-rw-r--r--runtime/ftplugin/msmessages.vim40
-rw-r--r--runtime/ftplugin/muttrc.vim22
-rw-r--r--runtime/ftplugin/nanorc.vim19
-rw-r--r--runtime/ftplugin/neomuttrc.vim23
-rw-r--r--runtime/ftplugin/netrc.vim19
-rw-r--r--runtime/ftplugin/nginx.vim6
-rw-r--r--runtime/ftplugin/nroff.vim17
-rw-r--r--runtime/ftplugin/nsis.vim43
-rw-r--r--runtime/ftplugin/objc.vim12
-rw-r--r--runtime/ftplugin/obse.vim70
-rw-r--r--runtime/ftplugin/ocaml.vim643
-rw-r--r--runtime/ftplugin/occam.vim49
-rw-r--r--runtime/ftplugin/octave.vim63
-rw-r--r--runtime/ftplugin/openvpn.vim14
-rw-r--r--runtime/ftplugin/pamconf.vim19
-rw-r--r--runtime/ftplugin/pascal.vim50
-rw-r--r--runtime/ftplugin/passwd.vim19
-rw-r--r--runtime/ftplugin/pbtxt.vim21
-rw-r--r--runtime/ftplugin/pdf.vim89
-rw-r--r--runtime/ftplugin/perl.vim109
-rw-r--r--runtime/ftplugin/php.vim153
-rw-r--r--runtime/ftplugin/pinfo.vim19
-rw-r--r--runtime/ftplugin/plaintex.vim37
-rw-r--r--runtime/ftplugin/pod.vim71
-rw-r--r--runtime/ftplugin/poefilter.vim13
-rw-r--r--runtime/ftplugin/poke.vim32
-rw-r--r--runtime/ftplugin/postscr.vim38
-rw-r--r--runtime/ftplugin/procmail.vim21
-rw-r--r--runtime/ftplugin/prolog.vim20
-rw-r--r--runtime/ftplugin/protocols.vim19
-rw-r--r--runtime/ftplugin/ps1.vim59
-rw-r--r--runtime/ftplugin/ps1xml.vim34
-rw-r--r--runtime/ftplugin/pyrex.vim27
-rw-r--r--runtime/ftplugin/python.vim189
-rw-r--r--runtime/ftplugin/qb64.vim26
-rw-r--r--runtime/ftplugin/qf.vim18
-rw-r--r--runtime/ftplugin/quake.vim19
-rw-r--r--runtime/ftplugin/quarto.vim1
-rw-r--r--runtime/ftplugin/r.vim32
-rw-r--r--runtime/ftplugin/racc.vim20
-rw-r--r--runtime/ftplugin/racket.vim82
-rw-r--r--runtime/ftplugin/raku.vim127
-rw-r--r--runtime/ftplugin/readline.vim36
-rw-r--r--runtime/ftplugin/registry.vim36
-rw-r--r--runtime/ftplugin/reva.vim27
-rw-r--r--runtime/ftplugin/rhelp.vim30
-rw-r--r--runtime/ftplugin/rmd.vim74
-rw-r--r--runtime/ftplugin/rnc.vim19
-rw-r--r--runtime/ftplugin/rnoweb.vim58
-rw-r--r--runtime/ftplugin/routeros.vim29
-rw-r--r--runtime/ftplugin/rpl.vim22
-rw-r--r--runtime/ftplugin/rrst.vim54
-rw-r--r--runtime/ftplugin/rst.vim47
-rw-r--r--runtime/ftplugin/ruby.vim445
-rw-r--r--runtime/ftplugin/rust.vim197
-rw-r--r--runtime/ftplugin/sass.vim37
-rw-r--r--runtime/ftplugin/sbt.vim15
-rw-r--r--runtime/ftplugin/scala.vim35
-rw-r--r--runtime/ftplugin/scdoc.vim22
-rw-r--r--runtime/ftplugin/scheme.vim58
-rw-r--r--runtime/ftplugin/screen.vim19
-rw-r--r--runtime/ftplugin/scss.vim13
-rw-r--r--runtime/ftplugin/sensors.vim19
-rw-r--r--runtime/ftplugin/services.vim19
-rw-r--r--runtime/ftplugin/setserial.vim19
-rw-r--r--runtime/ftplugin/sexplib.vim15
-rw-r--r--runtime/ftplugin/sgml.vim42
-rw-r--r--runtime/ftplugin/sh.vim48
-rw-r--r--runtime/ftplugin/sieve.vim20
-rw-r--r--runtime/ftplugin/slpconf.vim20
-rw-r--r--runtime/ftplugin/slpreg.vim20
-rw-r--r--runtime/ftplugin/slpspi.vim20
-rw-r--r--runtime/ftplugin/solution.vim37
-rw-r--r--runtime/ftplugin/spec.vim209
-rw-r--r--runtime/ftplugin/sql.vim548
-rw-r--r--runtime/ftplugin/ssa.vim13
-rw-r--r--runtime/ftplugin/sshconfig.vim19
-rw-r--r--runtime/ftplugin/sudoers.vim19
-rw-r--r--runtime/ftplugin/svg.vim42
-rw-r--r--runtime/ftplugin/swayconfig.vim16
-rw-r--r--runtime/ftplugin/swift.vim23
-rw-r--r--runtime/ftplugin/swiftgyb.vim11
-rw-r--r--runtime/ftplugin/sysctl.vim20
-rw-r--r--runtime/ftplugin/systemd.vim41
-rw-r--r--runtime/ftplugin/systemverilog.vim44
-rw-r--r--runtime/ftplugin/tap.vim27
-rw-r--r--runtime/ftplugin/tcl.vim37
-rw-r--r--runtime/ftplugin/tcsh.vim35
-rw-r--r--runtime/ftplugin/terminfo.vim19
-rw-r--r--runtime/ftplugin/tex.vim46
-rw-r--r--runtime/ftplugin/text.vim18
-rw-r--r--runtime/ftplugin/tidy.vim32
-rw-r--r--runtime/ftplugin/tmux.vim15
-rw-r--r--runtime/ftplugin/toml.vim23
-rw-r--r--runtime/ftplugin/treetop.vim19
-rw-r--r--runtime/ftplugin/tt2html.vim15
-rw-r--r--runtime/ftplugin/typescript.vim39
-rw-r--r--runtime/ftplugin/typescriptreact.vim33
-rw-r--r--runtime/ftplugin/udevconf.vim19
-rw-r--r--runtime/ftplugin/udevperm.vim19
-rw-r--r--runtime/ftplugin/udevrules.vim19
-rw-r--r--runtime/ftplugin/updatedb.vim19
-rw-r--r--runtime/ftplugin/vb.vim71
-rw-r--r--runtime/ftplugin/vdf.vim14
-rw-r--r--runtime/ftplugin/verilog.vim66
-rw-r--r--runtime/ftplugin/vhdl.vim88
-rw-r--r--runtime/ftplugin/vim.vim125
-rw-r--r--runtime/ftplugin/vroom.vim35
-rw-r--r--runtime/ftplugin/vue.vim24
-rw-r--r--runtime/ftplugin/wast.vim17
-rw-r--r--runtime/ftplugin/wget.vim29
-rw-r--r--runtime/ftplugin/wget2.vim29
-rw-r--r--runtime/ftplugin/xdefaults.vim20
-rw-r--r--runtime/ftplugin/xf86conf.vim19
-rw-r--r--runtime/ftplugin/xhtml.vim69
-rw-r--r--runtime/ftplugin/xinetd.vim20
-rw-r--r--runtime/ftplugin/xml.vim65
-rw-r--r--runtime/ftplugin/xmodmap.vim19
-rw-r--r--runtime/ftplugin/xs.vim15
-rw-r--r--runtime/ftplugin/xsd.vim41
-rw-r--r--runtime/ftplugin/xslt.vim18
-rw-r--r--runtime/ftplugin/yaml.vim25
-rw-r--r--runtime/ftplugin/zig.vim66
-rw-r--r--runtime/ftplugin/zimbu.vim206
-rw-r--r--runtime/ftplugin/zsh.vim42
-rw-r--r--runtime/ftplugof.vim15
-rw-r--r--runtime/gvim.desktop135
-rw-r--r--runtime/gvimrc_example.vim55
-rw-r--r--runtime/hi16-action-make.pngbin0 -> 454 bytes
-rw-r--r--runtime/hi22-action-make.pngbin0 -> 425 bytes
-rw-r--r--runtime/icons.infobin0 -> 624 bytes
-rw-r--r--runtime/icons/README.txt35
-rw-r--r--runtime/icons/README.txt.infobin0 -> 1191 bytes
-rw-r--r--runtime/icons/Vim_32Colors.infobin0 -> 2212 bytes
-rw-r--r--runtime/icons/Vim_4ColorsLace.infobin0 -> 358 bytes
-rw-r--r--runtime/icons/Vim_8Colors.infobin0 -> 4228 bytes
-rw-r--r--runtime/icons/Vim_8ColorsLace.infobin0 -> 2170 bytes
-rw-r--r--runtime/import/dist/vimhelp.vim31
-rw-r--r--runtime/indent.vim32
-rw-r--r--runtime/indent/Makefile14
-rw-r--r--runtime/indent/README.txt47
-rw-r--r--runtime/indent/aap.vim12
-rw-r--r--runtime/indent/ada.vim311
-rw-r--r--runtime/indent/ant.vim12
-rw-r--r--runtime/indent/automake.vim11
-rw-r--r--runtime/indent/awk.vim235
-rw-r--r--runtime/indent/bash.vim18
-rw-r--r--runtime/indent/basic.vim11
-rw-r--r--runtime/indent/bib.vim15
-rw-r--r--runtime/indent/bitbake.vim22
-rw-r--r--runtime/indent/bst.vim73
-rw-r--r--runtime/indent/bzl.vim105
-rw-r--r--runtime/indent/c.vim15
-rw-r--r--runtime/indent/cdl.vim136
-rw-r--r--runtime/indent/ch.vim18
-rw-r--r--runtime/indent/chaiscript.vim53
-rw-r--r--runtime/indent/changelog.vim14
-rw-r--r--runtime/indent/chatito.vim32
-rw-r--r--runtime/indent/clojure.vim427
-rw-r--r--runtime/indent/cmake.vim90
-rw-r--r--runtime/indent/cobol.vim226
-rw-r--r--runtime/indent/config.vim85
-rw-r--r--runtime/indent/context.vim65
-rw-r--r--runtime/indent/cpp.vim15
-rw-r--r--runtime/indent/cs.vim75
-rw-r--r--runtime/indent/css.vim86
-rw-r--r--runtime/indent/cucumber.vim75
-rw-r--r--runtime/indent/cuda.vim15
-rw-r--r--runtime/indent/d.vim24
-rw-r--r--runtime/indent/dictconf.vim15
-rw-r--r--runtime/indent/dictdconf.vim15
-rw-r--r--runtime/indent/docbk.vim15
-rw-r--r--runtime/indent/dosbatch.vim61
-rw-r--r--runtime/indent/dtd.vim334
-rw-r--r--runtime/indent/dtrace.vim17
-rw-r--r--runtime/indent/dune.vim13
-rw-r--r--runtime/indent/dylan.vim94
-rw-r--r--runtime/indent/eiffel.vim115
-rw-r--r--runtime/indent/elm.vim116
-rw-r--r--runtime/indent/erlang.vim1536
-rw-r--r--runtime/indent/eruby.vim111
-rw-r--r--runtime/indent/eterm.vim39
-rw-r--r--runtime/indent/expect.vim11
-rw-r--r--runtime/indent/falcon.vim454
-rw-r--r--runtime/indent/fennel.vim12
-rw-r--r--runtime/indent/fish.vim82
-rw-r--r--runtime/indent/fortran.vim224
-rw-r--r--runtime/indent/framescript.vim44
-rw-r--r--runtime/indent/freebasic.vim11
-rw-r--r--runtime/indent/gdscript.vim148
-rw-r--r--runtime/indent/gitconfig.vim38
-rw-r--r--runtime/indent/gitolite.vim51
-rw-r--r--runtime/indent/go.vim66
-rw-r--r--runtime/indent/gyp.vim7
-rw-r--r--runtime/indent/haml.vim76
-rw-r--r--runtime/indent/hamster.vim70
-rw-r--r--runtime/indent/hare.vim138
-rw-r--r--runtime/indent/hog.vim77
-rw-r--r--runtime/indent/html.vim1094
-rw-r--r--runtime/indent/htmldjango.vim12
-rw-r--r--runtime/indent/idlang.vim65
-rw-r--r--runtime/indent/ishd.vim68
-rw-r--r--runtime/indent/j.vim50
-rw-r--r--runtime/indent/java.vim150
-rw-r--r--runtime/indent/javascript.vim486
-rw-r--r--runtime/indent/javascriptreact.vim2
-rw-r--r--runtime/indent/json.vim173
-rw-r--r--runtime/indent/jsonc.vim189
-rw-r--r--runtime/indent/jsp.vim17
-rw-r--r--runtime/indent/julia.vim497
-rw-r--r--runtime/indent/krl.vim130
-rw-r--r--runtime/indent/ld.vim87
-rw-r--r--runtime/indent/less.vim13
-rw-r--r--runtime/indent/lifelines.vim24
-rw-r--r--runtime/indent/liquid.vim66
-rw-r--r--runtime/indent/lisp.vim15
-rw-r--r--runtime/indent/logtalk.vim64
-rw-r--r--runtime/indent/lua.vim66
-rw-r--r--runtime/indent/mail.vim15
-rw-r--r--runtime/indent/make.vim119
-rw-r--r--runtime/indent/matlab.vim123
-rw-r--r--runtime/indent/meson.vim183
-rw-r--r--runtime/indent/mf.vim6
-rw-r--r--runtime/indent/mma.vim79
-rw-r--r--runtime/indent/mp.vim320
-rw-r--r--runtime/indent/nginx.vim78
-rw-r--r--runtime/indent/nsis.vim93
-rw-r--r--runtime/indent/objc.vim79
-rw-r--r--runtime/indent/obse.vim55
-rw-r--r--runtime/indent/ocaml.vim274
-rw-r--r--runtime/indent/occam.vim190
-rw-r--r--runtime/indent/pascal.vim229
-rw-r--r--runtime/indent/perl.vim183
-rw-r--r--runtime/indent/php.vim957
-rw-r--r--runtime/indent/postscr.vim69
-rw-r--r--runtime/indent/pov.vim87
-rw-r--r--runtime/indent/prolog.vim71
-rw-r--r--runtime/indent/ps1.vim17
-rw-r--r--runtime/indent/pyrex.vim13
-rw-r--r--runtime/indent/python.vim33
-rw-r--r--runtime/indent/qb64.vim11
-rw-r--r--runtime/indent/quarto.vim1
-rw-r--r--runtime/indent/r.vim526
-rw-r--r--runtime/indent/racket.vim60
-rw-r--r--runtime/indent/raku.vim127
-rw-r--r--runtime/indent/raml.vim12
-rw-r--r--runtime/indent/readline.vim39
-rw-r--r--runtime/indent/rhelp.vim110
-rw-r--r--runtime/indent/rmd.vim88
-rw-r--r--runtime/indent/rnoweb.vim49
-rw-r--r--runtime/indent/rpl.vim63
-rw-r--r--runtime/indent/rrst.vim49
-rw-r--r--runtime/indent/rst.vim74
-rw-r--r--runtime/indent/ruby.vim990
-rw-r--r--runtime/indent/rust.vim213
-rw-r--r--runtime/indent/sas.vim140
-rw-r--r--runtime/indent/sass.vim40
-rw-r--r--runtime/indent/scala.vim612
-rw-r--r--runtime/indent/scheme.vim14
-rw-r--r--runtime/indent/scss.vim12
-rw-r--r--runtime/indent/sdl.vim95
-rw-r--r--runtime/indent/sh.vim303
-rw-r--r--runtime/indent/sml.vim220
-rw-r--r--runtime/indent/solidity.vim442
-rw-r--r--runtime/indent/sql.vim39
-rw-r--r--runtime/indent/sqlanywhere.vim399
-rw-r--r--runtime/indent/sshconfig.vim34
-rw-r--r--runtime/indent/systemverilog.vim279
-rw-r--r--runtime/indent/tcl.vim103
-rw-r--r--runtime/indent/tcsh.vim53
-rw-r--r--runtime/indent/teraterm.vim57
-rw-r--r--runtime/indent/testdir/README.txt97
-rw-r--r--runtime/indent/testdir/bitbake.in19
-rw-r--r--runtime/indent/testdir/bitbake.ok19
-rw-r--r--runtime/indent/testdir/html.in77
-rw-r--r--runtime/indent/testdir/html.ok77
-rw-r--r--runtime/indent/testdir/krl.in148
-rw-r--r--runtime/indent/testdir/krl.ok148
-rw-r--r--runtime/indent/testdir/matlab.in89
-rw-r--r--runtime/indent/testdir/matlab.ok89
-rw-r--r--runtime/indent/testdir/python.in94
-rw-r--r--runtime/indent/testdir/python.ok94
-rw-r--r--runtime/indent/testdir/runtest.vim145
-rw-r--r--runtime/indent/testdir/sshconfig.in53
-rw-r--r--runtime/indent/testdir/sshconfig.ok53
-rw-r--r--runtime/indent/testdir/tcl.in19
-rw-r--r--runtime/indent/testdir/tcl.ok19
-rw-r--r--runtime/indent/testdir/vb.in134
-rw-r--r--runtime/indent/testdir/vb.ok134
-rw-r--r--runtime/indent/testdir/vim.in941
-rw-r--r--runtime/indent/testdir/vim.ok941
-rw-r--r--runtime/indent/testdir/xml.in32
-rw-r--r--runtime/indent/testdir/xml.ok32
-rw-r--r--runtime/indent/testdir/yaml.in20
-rw-r--r--runtime/indent/testdir/yaml.ok20
-rw-r--r--runtime/indent/tex.vim423
-rw-r--r--runtime/indent/tf.vim74
-rw-r--r--runtime/indent/tilde.vim39
-rw-r--r--runtime/indent/treetop.vim41
-rw-r--r--runtime/indent/typescript.vim503
-rw-r--r--runtime/indent/vb.vim155
-rw-r--r--runtime/indent/verilog.vim229
-rw-r--r--runtime/indent/vhdl.vim435
-rw-r--r--runtime/indent/vim.vim22
-rw-r--r--runtime/indent/vroom.vim21
-rw-r--r--runtime/indent/vue.vim14
-rw-r--r--runtime/indent/wast.vim17
-rw-r--r--runtime/indent/xf86conf.vim40
-rw-r--r--runtime/indent/xhtml.vim12
-rw-r--r--runtime/indent/xinetd.vim58
-rw-r--r--runtime/indent/xml.vim218
-rw-r--r--runtime/indent/xsd.vim13
-rw-r--r--runtime/indent/xslt.vim13
-rw-r--r--runtime/indent/yacc.vim44
-rw-r--r--runtime/indent/yaml.vim156
-rw-r--r--runtime/indent/zig.vim80
-rw-r--r--runtime/indent/zimbu.vim128
-rw-r--r--runtime/indent/zsh.vim14
-rw-r--r--runtime/indoff.vim11
-rw-r--r--runtime/keymap/README.txt26
-rw-r--r--runtime/keymap/accents.vim78
-rw-r--r--runtime/keymap/arabic.vim2
-rw-r--r--runtime/keymap/arabic_utf-8.vim86
-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/belarusian-jcuken.vim87
-rw-r--r--runtime/keymap/bulgarian-bds.vim155
-rw-r--r--runtime/keymap/bulgarian-phonetic.vim135
-rw-r--r--runtime/keymap/canfr-win.vim91
-rw-r--r--runtime/keymap/croatian.vim16
-rw-r--r--runtime/keymap/croatian_cp1250.vim65
-rw-r--r--runtime/keymap/croatian_iso-8859-2.vim84
-rw-r--r--runtime/keymap/croatian_utf-8.vim68
-rw-r--r--runtime/keymap/czech.vim1
-rw-r--r--runtime/keymap/czech_utf-8.vim86
-rw-r--r--runtime/keymap/dvorak.vim82
-rw-r--r--runtime/keymap/esperanto.vim1
-rw-r--r--runtime/keymap/esperanto_utf-8.vim58
-rw-r--r--runtime/keymap/french-azerty.vim81
-rw-r--r--runtime/keymap/german-qwertz.vim76
-rw-r--r--runtime/keymap/greek.vim7
-rw-r--r--runtime/keymap/greek_cp1253.vim119
-rw-r--r--runtime/keymap/greek_cp737.vim104
-rw-r--r--runtime/keymap/greek_iso-8859-7.vim118
-rw-r--r--runtime/keymap/greek_utf-8.vim622
-rw-r--r--runtime/keymap/hebrew.vim16
-rw-r--r--runtime/keymap/hebrew_cp1255.vim62
-rw-r--r--runtime/keymap/hebrew_iso-8859-8.vim41
-rw-r--r--runtime/keymap/hebrew_utf-8.vim128
-rw-r--r--runtime/keymap/hebrewp.vim16
-rw-r--r--runtime/keymap/hebrewp_cp1255.vim58
-rw-r--r--runtime/keymap/hebrewp_iso-8859-8.vim36
-rw-r--r--runtime/keymap/hebrewp_utf-8.vim122
-rw-r--r--runtime/keymap/kana.vim727
-rw-r--r--runtime/keymap/kazakh-jcuken.vim102
-rw-r--r--runtime/keymap/korean-dubeolsik_utf-8.vim11237
-rw-r--r--runtime/keymap/korean.vim23
-rw-r--r--runtime/keymap/lithuanian-baltic.vim31
-rw-r--r--runtime/keymap/magyar_utf-8.vim37
-rw-r--r--runtime/keymap/mongolian_utf-8.vim101
-rw-r--r--runtime/keymap/oldturkic-orkhon_utf-8.vim143
-rw-r--r--runtime/keymap/oldturkic-yenisei_utf-8.vim159
-rw-r--r--runtime/keymap/persian-iranian_utf-8.vim113
-rw-r--r--runtime/keymap/persian.vim8
-rw-r--r--runtime/keymap/pinyin.vim54
-rw-r--r--runtime/keymap/polish-slash.vim27
-rw-r--r--runtime/keymap/polish-slash_cp1250.vim40
-rw-r--r--runtime/keymap/polish-slash_cp852.vim40
-rw-r--r--runtime/keymap/polish-slash_iso-8859-2.vim40
-rw-r--r--runtime/keymap/polish-slash_utf-8.vim40
-rw-r--r--runtime/keymap/russian-dvorak.vim89
-rw-r--r--runtime/keymap/russian-jcuken.vim87
-rw-r--r--runtime/keymap/russian-jcukenmac.vim94
-rw-r--r--runtime/keymap/russian-jcukenwin.vim87
-rw-r--r--runtime/keymap/russian-jcukenwintype.vim112
-rw-r--r--runtime/keymap/russian-typograph.vim190
-rw-r--r--runtime/keymap/russian-yawerty.vim79
-rw-r--r--runtime/keymap/serbian-latin.vim1
-rw-r--r--runtime/keymap/serbian-latin_utf-8.vim44
-rw-r--r--runtime/keymap/serbian.vim20
-rw-r--r--runtime/keymap/serbian_cp1250.vim40
-rw-r--r--runtime/keymap/serbian_cp1251.vim90
-rw-r--r--runtime/keymap/serbian_iso-8859-2.vim40
-rw-r--r--runtime/keymap/serbian_iso-8859-5.vim89
-rw-r--r--runtime/keymap/serbian_utf-8.vim93
-rw-r--r--runtime/keymap/sinhala-phonetic_utf-8.vim107
-rw-r--r--runtime/keymap/sinhala.vim3
-rw-r--r--runtime/keymap/slovak.vim16
-rw-r--r--runtime/keymap/slovak_cp1250.vim100
-rw-r--r--runtime/keymap/slovak_iso-8859-2.vim100
-rw-r--r--runtime/keymap/slovak_utf-8.vim100
-rw-r--r--runtime/keymap/tamil_tscii.vim572
-rw-r--r--runtime/keymap/thaana-phonetic_utf-8.vim86
-rw-r--r--runtime/keymap/thaana.vim3
-rw-r--r--runtime/keymap/turkish-f.vim113
-rw-r--r--runtime/keymap/turkish-q.vim62
-rw-r--r--runtime/keymap/ukrainian-dvorak.vim92
-rw-r--r--runtime/keymap/ukrainian-jcuken.vim92
-rw-r--r--runtime/keymap/vietnamese-telex_utf-8.vim196
-rw-r--r--runtime/keymap/vietnamese-viqr_utf-8.vim160
-rw-r--r--runtime/keymap/vietnamese-vni_utf-8.vim196
-rw-r--r--runtime/lang/Makefile211
-rw-r--r--runtime/lang/README.txt56
-rw-r--r--runtime/lang/menu_af.latin1.vim3
-rw-r--r--runtime/lang/menu_af.utf-8.vim3
-rw-r--r--runtime/lang/menu_af_af.latin1.vim158
-rw-r--r--runtime/lang/menu_af_af.utf-8.vim3
-rw-r--r--runtime/lang/menu_ca.latin1.vim3
-rw-r--r--runtime/lang/menu_ca.utf-8.vim7
-rw-r--r--runtime/lang/menu_ca_es.latin1.vim316
-rw-r--r--runtime/lang/menu_ca_es.utf-8.vim7
-rw-r--r--runtime/lang/menu_chinese(gb)_gb.936.vim7
-rw-r--r--runtime/lang/menu_chinese(taiwan)_taiwan.950.vim7
-rw-r--r--runtime/lang/menu_chinese_gb.936.vim571
-rw-r--r--runtime/lang/menu_chinese_taiwan.950.vim292
-rw-r--r--runtime/lang/menu_cs.cp1250.vim3
-rw-r--r--runtime/lang/menu_cs.latin1.vim3
-rw-r--r--runtime/lang/menu_cs_cz.cp1250.vim3
-rw-r--r--runtime/lang/menu_cs_cz.iso_8859-2.vim309
-rw-r--r--runtime/lang/menu_cs_cz.latin1.vim3
-rw-r--r--runtime/lang/menu_cs_cz.utf-8.vim309
-rw-r--r--runtime/lang/menu_czech_czech_republic.1250.vim309
-rw-r--r--runtime/lang/menu_czech_czech_republic.1252.vim3
-rw-r--r--runtime/lang/menu_czech_czech_republic.ascii.vim309
-rw-r--r--runtime/lang/menu_da.latin1.vim3
-rw-r--r--runtime/lang/menu_da.utf-8.vim464
-rw-r--r--runtime/lang/menu_de.latin1.vim3
-rw-r--r--runtime/lang/menu_de.utf-8.vim3
-rw-r--r--runtime/lang/menu_de_de.latin1.vim312
-rw-r--r--runtime/lang/menu_de_de.utf-8.vim3
-rw-r--r--runtime/lang/menu_en_gb.latin1.vim16
-rw-r--r--runtime/lang/menu_en_gb.utf-8.vim3
-rw-r--r--runtime/lang/menu_english_united_kingdom.1252.vim3
-rw-r--r--runtime/lang/menu_english_united_kingdom.ascii.vim3
-rw-r--r--runtime/lang/menu_eo.utf-8.vim463
-rw-r--r--runtime/lang/menu_eo_eo.utf-8.vim3
-rw-r--r--runtime/lang/menu_eo_xx.utf-8.vim3
-rw-r--r--runtime/lang/menu_es.latin1.vim3
-rw-r--r--runtime/lang/menu_es.utf-8.vim3
-rw-r--r--runtime/lang/menu_es_es.latin1.vim323
-rw-r--r--runtime/lang/menu_es_es.utf-8.vim3
-rw-r--r--runtime/lang/menu_fi.latin1.vim3
-rw-r--r--runtime/lang/menu_fi.utf-8.vim3
-rw-r--r--runtime/lang/menu_fi_fi.latin1.vim479
-rw-r--r--runtime/lang/menu_fi_fi.utf-8.vim3
-rw-r--r--runtime/lang/menu_finnish_finland.1252.vim3
-rw-r--r--runtime/lang/menu_fr.latin1.vim3
-rw-r--r--runtime/lang/menu_fr.utf-8.vim3
-rw-r--r--runtime/lang/menu_fr_fr.latin1.vim486
-rw-r--r--runtime/lang/menu_fr_fr.utf-8.vim3
-rw-r--r--runtime/lang/menu_french_france.1252.vim3
-rw-r--r--runtime/lang/menu_german_germany.1252.vim3
-rw-r--r--runtime/lang/menu_hu.iso_8859-2.vim3
-rw-r--r--runtime/lang/menu_hu.utf-8.vim3
-rw-r--r--runtime/lang/menu_hu_hu.iso_8859-2.vim248
-rw-r--r--runtime/lang/menu_hu_hu.utf-8.vim248
-rw-r--r--runtime/lang/menu_is.latin1.vim3
-rw-r--r--runtime/lang/menu_is.utf-8.vim3
-rw-r--r--runtime/lang/menu_is_is.latin1.vim306
-rw-r--r--runtime/lang/menu_is_is.utf-8.vim3
-rw-r--r--runtime/lang/menu_it.latin1.vim3
-rw-r--r--runtime/lang/menu_it.utf-8.vim3
-rw-r--r--runtime/lang/menu_it_it.latin1.vim409
-rw-r--r--runtime/lang/menu_it_it.utf-8.vim3
-rw-r--r--runtime/lang/menu_italian_italy.1252.vim3
-rw-r--r--runtime/lang/menu_ja.cp932.vim8
-rw-r--r--runtime/lang/menu_ja.euc-jp.vim9
-rw-r--r--runtime/lang/menu_ja.eucjp.vim9
-rw-r--r--runtime/lang/menu_ja.ujis.vim9
-rw-r--r--runtime/lang/menu_ja.utf-8.vim4
-rw-r--r--runtime/lang/menu_ja_jp.cp932.vim8
-rw-r--r--runtime/lang/menu_ja_jp.euc-jp.vim315
-rw-r--r--runtime/lang/menu_ja_jp.eucjp.vim9
-rw-r--r--runtime/lang/menu_ja_jp.ujis.vim9
-rw-r--r--runtime/lang/menu_ja_jp.utf-8.vim315
-rw-r--r--runtime/lang/menu_japanese_japan.932.vim315
-rw-r--r--runtime/lang/menu_ko.utf-8.vim3
-rw-r--r--runtime/lang/menu_ko_kr.euckr.vim266
-rw-r--r--runtime/lang/menu_ko_kr.utf-8.vim266
-rw-r--r--runtime/lang/menu_ko_kr.vim5
-rw-r--r--runtime/lang/menu_nl.latin1.vim3
-rw-r--r--runtime/lang/menu_nl.utf-8.vim3
-rw-r--r--runtime/lang/menu_nl_nl.latin1.vim246
-rw-r--r--runtime/lang/menu_nl_nl.utf-8.vim3
-rw-r--r--runtime/lang/menu_no.latin1.vim4
-rw-r--r--runtime/lang/menu_no.utf-8.vim4
-rw-r--r--runtime/lang/menu_no_no.latin1.vim239
-rw-r--r--runtime/lang/menu_no_no.utf-8.vim4
-rw-r--r--runtime/lang/menu_pl.cp1250.vim3
-rw-r--r--runtime/lang/menu_pl_pl.cp1250.vim3
-rw-r--r--runtime/lang/menu_pl_pl.iso_8859-2.vim293
-rw-r--r--runtime/lang/menu_pl_pl.utf-8.vim293
-rw-r--r--runtime/lang/menu_polish_poland.1250.vim293
-rw-r--r--runtime/lang/menu_pt_br.latin1.vim3
-rw-r--r--runtime/lang/menu_pt_br.utf-8.vim3
-rw-r--r--runtime/lang/menu_pt_br.vim290
-rw-r--r--runtime/lang/menu_pt_pt.latin1.vim3
-rw-r--r--runtime/lang/menu_pt_pt.utf-8.vim3
-rw-r--r--runtime/lang/menu_pt_pt.vim270
-rw-r--r--runtime/lang/menu_ru.utf-8.vim3
-rw-r--r--runtime/lang/menu_ru_ru.koi8-r.vim337
-rw-r--r--runtime/lang/menu_ru_ru.utf-8.vim337
-rw-r--r--runtime/lang/menu_ru_ru.vim3
-rw-r--r--runtime/lang/menu_sk.cp1250.vim3
-rw-r--r--runtime/lang/menu_sk_sk.1250.vim6
-rw-r--r--runtime/lang/menu_sk_sk.cp1250.vim3
-rw-r--r--runtime/lang/menu_sk_sk.iso_8859-2.vim238
-rw-r--r--runtime/lang/menu_sk_sk.vim9
-rw-r--r--runtime/lang/menu_sl_si.cp1250.vim300
-rw-r--r--runtime/lang/menu_sl_si.latin2.vim300
-rw-r--r--runtime/lang/menu_sl_si.utf-8.vim300
-rw-r--r--runtime/lang/menu_slovak_slovak_republic.1250.vim238
-rw-r--r--runtime/lang/menu_spanish_spain.850.vim1
-rw-r--r--runtime/lang/menu_sr.utf-8.vim3
-rw-r--r--runtime/lang/menu_sr_rs.ascii.vim297
-rw-r--r--runtime/lang/menu_sr_rs.iso_8859-2.vim297
-rw-r--r--runtime/lang/menu_sr_rs.iso_8859-5.vim297
-rw-r--r--runtime/lang/menu_sr_rs.utf-8.vim297
-rw-r--r--runtime/lang/menu_sr_yu.ascii.vim3
-rw-r--r--runtime/lang/menu_sr_yu.iso_8859-2.vim3
-rw-r--r--runtime/lang/menu_sr_yu.iso_8859-5.vim3
-rw-r--r--runtime/lang/menu_sr_yu.utf-8.vim3
-rw-r--r--runtime/lang/menu_sv.latin1.vim3
-rw-r--r--runtime/lang/menu_sv.utf-8.vim3
-rw-r--r--runtime/lang/menu_sv_se.latin1.vim256
-rw-r--r--runtime/lang/menu_sv_se.utf-8.vim3
-rw-r--r--runtime/lang/menu_tr.cp1254.vim3
-rw-r--r--runtime/lang/menu_tr.iso_8859-9.vim3
-rw-r--r--runtime/lang/menu_tr.utf-8.vim3
-rw-r--r--runtime/lang/menu_tr_tr.cp1254.vim309
-rw-r--r--runtime/lang/menu_tr_tr.iso_8859-9.vim309
-rw-r--r--runtime/lang/menu_tr_tr.utf-8.vim309
-rw-r--r--runtime/lang/menu_uk_ua.cp1251.vim252
-rw-r--r--runtime/lang/menu_uk_ua.koi8-u.vim252
-rw-r--r--runtime/lang/menu_uk_ua.utf-8.vim252
-rw-r--r--runtime/lang/menu_vi_vn.vim335
-rw-r--r--runtime/lang/menu_zh.big5.vim3
-rw-r--r--runtime/lang/menu_zh.cp936.vim3
-rw-r--r--runtime/lang/menu_zh.cp950.vim3
-rw-r--r--runtime/lang/menu_zh.gb2312.vim3
-rw-r--r--runtime/lang/menu_zh_cn.18030.vim3
-rw-r--r--runtime/lang/menu_zh_cn.cp936.vim3
-rw-r--r--runtime/lang/menu_zh_cn.gb2312.vim13
-rw-r--r--runtime/lang/menu_zh_cn.gbk.vim3
-rw-r--r--runtime/lang/menu_zh_cn.utf-8.vim571
-rw-r--r--runtime/lang/menu_zh_tw.big5.vim3
-rw-r--r--runtime/lang/menu_zh_tw.cp950.vim3
-rw-r--r--runtime/lang/menu_zh_tw.utf-8.vim292
-rw-r--r--runtime/macmap.vim75
-rwxr-xr-xruntime/macros.infobin0 -> 624 bytes
-rw-r--r--runtime/macros/README.txt33
-rw-r--r--runtime/macros/README.txt.infobin0 -> 734 bytes
-rw-r--r--runtime/macros/editexisting.vim3
-rw-r--r--runtime/macros/hanoi.infobin0 -> 624 bytes
-rw-r--r--runtime/macros/hanoi/click.me14
-rw-r--r--runtime/macros/hanoi/click.me.infobin0 -> 973 bytes
-rw-r--r--runtime/macros/hanoi/hanoi.vim64
-rw-r--r--runtime/macros/hanoi/poster36
-rw-r--r--runtime/macros/hanoi/poster.infobin0 -> 735 bytes
-rw-r--r--runtime/macros/justify.vim3
-rw-r--r--runtime/macros/less.bat10
-rwxr-xr-xruntime/macros/less.sh26
-rw-r--r--runtime/macros/less.vim292
-rw-r--r--runtime/macros/life/click.me9
-rw-r--r--runtime/macros/life/click.me.infobin0 -> 972 bytes
-rw-r--r--runtime/macros/life/life.vim262
-rw-r--r--runtime/macros/matchit.vim5
-rw-r--r--runtime/macros/maze.infobin0 -> 624 bytes
-rw-r--r--runtime/macros/maze/Makefile7
-rw-r--r--runtime/macros/maze/README.txt49
-rw-r--r--runtime/macros/maze/README.txt.infobin0 -> 734 bytes
-rw-r--r--runtime/macros/maze/maze.c7
-rw-r--r--runtime/macros/maze/maze_5.7816
-rw-r--r--runtime/macros/maze/maze_5.78.infobin0 -> 972 bytes
-rw-r--r--runtime/macros/maze/maze_mac271
-rw-r--r--runtime/macros/maze/mazeansi.c7
-rw-r--r--runtime/macros/maze/mazeclean.c22
-rw-r--r--runtime/macros/maze/poster37
-rw-r--r--runtime/macros/maze/poster.infobin0 -> 734 bytes
-rw-r--r--runtime/macros/shellmenu.vim3
-rw-r--r--runtime/macros/swapmous.vim3
-rw-r--r--runtime/macros/urm.infobin0 -> 624 bytes
-rw-r--r--runtime/macros/urm/README.txt47
-rw-r--r--runtime/macros/urm/README.txt.infobin0 -> 734 bytes
-rw-r--r--runtime/macros/urm/examples16
-rw-r--r--runtime/macros/urm/urm22
-rw-r--r--runtime/macros/urm/urm.vim5
-rw-r--r--runtime/makemenu.vim683
-rw-r--r--runtime/menu.vim1220
-rw-r--r--runtime/mswin.vim125
-rw-r--r--runtime/optwin.vim1491
-rw-r--r--runtime/pack/dist/opt/cfilter/plugin/cfilter.vim72
-rw-r--r--runtime/pack/dist/opt/dvorak/dvorak/disable.vim72
-rw-r--r--runtime/pack/dist/opt/dvorak/dvorak/enable.vim77
-rw-r--r--runtime/pack/dist/opt/dvorak/plugin/dvorak.vim16
-rw-r--r--runtime/pack/dist/opt/editexisting/plugin/editexisting.vim118
-rw-r--r--runtime/pack/dist/opt/justify/plugin/justify.vim316
-rw-r--r--runtime/pack/dist/opt/matchit/autoload/matchit.vim777
-rw-r--r--runtime/pack/dist/opt/matchit/doc/matchit.txt397
-rw-r--r--runtime/pack/dist/opt/matchit/doc/tags50
-rw-r--r--runtime/pack/dist/opt/matchit/plugin/matchit.vim98
-rw-r--r--runtime/pack/dist/opt/shellmenu/plugin/shellmenu.vim104
-rw-r--r--runtime/pack/dist/opt/swapmouse/plugin/swapmouse.vim22
-rw-r--r--runtime/pack/dist/opt/termdebug/plugin/termdebug.vim1527
-rw-r--r--runtime/plugin/README.txt21
-rw-r--r--runtime/plugin/getscriptPlugin.vim41
-rw-r--r--runtime/plugin/gzip.vim60
-rw-r--r--runtime/plugin/logiPat.vim339
-rw-r--r--runtime/plugin/manpager.vim51
-rw-r--r--runtime/plugin/matchparen.vim225
-rw-r--r--runtime/plugin/netrwPlugin.vim223
-rw-r--r--runtime/plugin/rrhelper.vim48
-rw-r--r--runtime/plugin/spellfile.vim15
-rw-r--r--runtime/plugin/tarPlugin.vim56
-rw-r--r--runtime/plugin/tohtml.vim235
-rw-r--r--runtime/plugin/vimballPlugin.vim43
-rw-r--r--runtime/plugin/zipPlugin.vim56
-rw-r--r--runtime/print/ascii.ps22
-rw-r--r--runtime/print/cidfont.ps26
-rw-r--r--runtime/print/cns_roman.ps23
-rw-r--r--runtime/print/cp1250.ps40
-rw-r--r--runtime/print/cp1251.ps40
-rw-r--r--runtime/print/cp1252.ps40
-rw-r--r--runtime/print/cp1253.ps40
-rw-r--r--runtime/print/cp1254.ps40
-rw-r--r--runtime/print/cp1255.ps40
-rw-r--r--runtime/print/cp1257.ps40
-rw-r--r--runtime/print/dec-mcs.ps40
-rw-r--r--runtime/print/ebcdic-uk.ps40
-rw-r--r--runtime/print/gb_roman.ps23
-rw-r--r--runtime/print/hp-roman8.ps40
-rw-r--r--runtime/print/iso-8859-10.ps40
-rw-r--r--runtime/print/iso-8859-11.ps40
-rw-r--r--runtime/print/iso-8859-13.ps40
-rw-r--r--runtime/print/iso-8859-14.ps40
-rw-r--r--runtime/print/iso-8859-15.ps40
-rw-r--r--runtime/print/iso-8859-2.ps40
-rw-r--r--runtime/print/iso-8859-3.ps40
-rw-r--r--runtime/print/iso-8859-4.ps40
-rw-r--r--runtime/print/iso-8859-5.ps40
-rw-r--r--runtime/print/iso-8859-7.ps40
-rw-r--r--runtime/print/iso-8859-8.ps40
-rw-r--r--runtime/print/iso-8859-9.ps40
-rw-r--r--runtime/print/jis_roman.ps23
-rw-r--r--runtime/print/koi8-r.ps40
-rw-r--r--runtime/print/koi8-u.ps40
-rw-r--r--runtime/print/ks_roman.ps23
-rw-r--r--runtime/print/latin1.ps40
-rw-r--r--runtime/print/mac-roman.ps40
-rw-r--r--runtime/print/prolog.ps44
-rw-r--r--runtime/scripts.vim30
-rw-r--r--runtime/spell/README.txt116
-rw-r--r--runtime/spell/README_en.txt12940
-rw-r--r--runtime/spell/af/af_ZA.diff35
-rw-r--r--runtime/spell/af/main.aap79
-rw-r--r--runtime/spell/am/am_ET.diff9
-rw-r--r--runtime/spell/am/main.aap63
-rw-r--r--runtime/spell/bg/bg_BG.diff186
-rw-r--r--runtime/spell/bg/main.aap80
-rw-r--r--runtime/spell/br/br_FR.diff0
-rw-r--r--runtime/spell/br/main.aap86
-rw-r--r--runtime/spell/ca/ca_ES.diff83
-rw-r--r--runtime/spell/ca/main.aap81
-rw-r--r--runtime/spell/check/check_aa.aff50
-rw-r--r--runtime/spell/check/check_aa.dic12
-rw-r--r--runtime/spell/check/check_bb.aff50
-rw-r--r--runtime/spell/check/check_bb.dic12
-rw-r--r--runtime/spell/check/main.aap15
-rw-r--r--runtime/spell/check_locales.vim21
-rw-r--r--runtime/spell/cleanadd.vim32
-rw-r--r--runtime/spell/cs/cs_CZ.diff783
-rw-r--r--runtime/spell/cs/main.aap81
-rw-r--r--runtime/spell/cy/cy_GB.diff9
-rw-r--r--runtime/spell/cy/main.aap82
-rw-r--r--runtime/spell/da/da_DK.diff140
-rw-r--r--runtime/spell/da/main.aap79
-rw-r--r--runtime/spell/de/de_19.diff514
-rw-r--r--runtime/spell/de/main.aap102
-rw-r--r--runtime/spell/el/el_GR.diff204
-rw-r--r--runtime/spell/el/main.aap78
-rw-r--r--runtime/spell/en.ascii.splbin0 -> 619043 bytes
-rw-r--r--runtime/spell/en.ascii.sugbin0 -> 597210 bytes
-rw-r--r--runtime/spell/en.latin1.splbin0 -> 621179 bytes
-rw-r--r--runtime/spell/en.latin1.sugbin0 -> 597971 bytes
-rw-r--r--runtime/spell/en.utf-8.splbin0 -> 621617 bytes
-rw-r--r--runtime/spell/en.utf-8.sugbin0 -> 597971 bytes
-rw-r--r--runtime/spell/en/en_AU.diff2713
-rw-r--r--runtime/spell/en/en_CA.diff238
-rw-r--r--runtime/spell/en/en_GB.diff214
-rw-r--r--runtime/spell/en/en_NZ.diff2733
-rw-r--r--runtime/spell/en/en_US.diff243
-rw-r--r--runtime/spell/en/main.aap245
-rw-r--r--runtime/spell/eo/eo_l3.diff0
-rw-r--r--runtime/spell/eo/main.aap80
-rw-r--r--runtime/spell/es/es_ES.diff38
-rw-r--r--runtime/spell/es/es_MX.diff6975
-rw-r--r--runtime/spell/es/main.aap92
-rw-r--r--runtime/spell/eu/main.aap81
-rw-r--r--runtime/spell/fixdup.vim30
-rw-r--r--runtime/spell/fo/fo_FO.diff142
-rw-r--r--runtime/spell/fo/main.aap78
-rw-r--r--runtime/spell/fr/fr_FR.diff176
-rw-r--r--runtime/spell/fr/main.aap126
-rw-r--r--runtime/spell/ga/ga_IE.diff308
-rw-r--r--runtime/spell/ga/main.aap79
-rw-r--r--runtime/spell/gd/gd_GB.diff304
-rw-r--r--runtime/spell/gd/main.aap77
-rw-r--r--runtime/spell/gl/gl_ES.diff72
-rw-r--r--runtime/spell/gl/main.aap78
-rw-r--r--runtime/spell/he.vim10
-rw-r--r--runtime/spell/he/he_IL.diff76
-rw-r--r--runtime/spell/he/main.aap78
-rw-r--r--runtime/spell/hr/hr_HR.diff11
-rw-r--r--runtime/spell/hr/main.aap81
-rw-r--r--runtime/spell/hu/hu_HU.diff183
-rw-r--r--runtime/spell/hu/main.aap82
-rw-r--r--runtime/spell/id/id_ID.diff22
-rw-r--r--runtime/spell/id/main.aap79
-rw-r--r--runtime/spell/it/it_IT.diff375
-rw-r--r--runtime/spell/it/main.aap79
-rw-r--r--runtime/spell/ku/ku_TR.diff104
-rw-r--r--runtime/spell/ku/main.aap82
-rw-r--r--runtime/spell/la/la.diff12
-rw-r--r--runtime/spell/la/main.aap81
-rw-r--r--runtime/spell/lt/lt_LT.diff0
-rw-r--r--runtime/spell/lt/main.aap78
-rw-r--r--runtime/spell/lv/lv_LV.diff0
-rw-r--r--runtime/spell/lv/main.aap83
-rw-r--r--runtime/spell/main.aap27
-rw-r--r--runtime/spell/mg/main.aap79
-rw-r--r--runtime/spell/mg/mg_MG.diff26
-rw-r--r--runtime/spell/mi/main.aap80
-rw-r--r--runtime/spell/mi/mi_NZ.diff10
-rw-r--r--runtime/spell/ms/main.aap81
-rw-r--r--runtime/spell/ms/ms_MY.diff24
-rw-r--r--runtime/spell/nb/main.aap78
-rw-r--r--runtime/spell/nb/nb_NO.diff63
-rw-r--r--runtime/spell/nl/main.aap96
-rw-r--r--runtime/spell/nl/nl_NL.diff228
-rw-r--r--runtime/spell/nn/main.aap78
-rw-r--r--runtime/spell/nn/nn_NO.diff25
-rw-r--r--runtime/spell/ny/main.aap82
-rw-r--r--runtime/spell/ny/ny_MW.diff0
-rw-r--r--runtime/spell/pl/main.aap92
-rw-r--r--runtime/spell/pl/pl_PL.diff10
-rw-r--r--runtime/spell/pt/main.aap168
-rw-r--r--runtime/spell/pt/pt_BR.diff88
-rw-r--r--runtime/spell/pt/pt_PT.diff45
-rw-r--r--runtime/spell/ro/main.aap101
-rw-r--r--runtime/spell/ro/ro_RO.diff34
-rw-r--r--runtime/spell/ru/main.aap84
-rw-r--r--runtime/spell/ru/ru_RU.diff50
-rw-r--r--runtime/spell/ru/ru_YO.diff32
-rw-r--r--runtime/spell/rw/main.aap79
-rw-r--r--runtime/spell/rw/rw_RW.diff13
-rw-r--r--runtime/spell/sk/main.aap81
-rw-r--r--runtime/spell/sk/sk_SK.diff18
-rw-r--r--runtime/spell/sl/main.aap81
-rw-r--r--runtime/spell/sl/sl_SI.diff11
-rw-r--r--runtime/spell/spell.vim4
-rw-r--r--runtime/spell/sr/README_sr.txt59
-rw-r--r--runtime/spell/sr/convert.vim30
-rw-r--r--runtime/spell/sr/main.aap23
-rw-r--r--runtime/spell/sv/main.aap93
-rw-r--r--runtime/spell/sv/sv_SE.diff205
-rw-r--r--runtime/spell/sw/main.aap79
-rw-r--r--runtime/spell/sw/sw_KE.diff13
-rw-r--r--runtime/spell/tet/main.aap79
-rw-r--r--runtime/spell/tet/tet_ID.diff26
-rw-r--r--runtime/spell/th/main.aap66
-rw-r--r--runtime/spell/th/th.diff247
-rw-r--r--runtime/spell/tl/main.aap77
-rw-r--r--runtime/spell/tl/tl_PH.diff18
-rw-r--r--runtime/spell/tn/main.aap82
-rw-r--r--runtime/spell/tn/tn_ZA.diff10
-rw-r--r--runtime/spell/tr/main.aap68
-rw-r--r--runtime/spell/uk/main.aap57
-rw-r--r--runtime/spell/uk/uk_UA.diff17
-rw-r--r--runtime/spell/yi.vim10
-rw-r--r--runtime/spell/yi/README.txt9
-rw-r--r--runtime/spell/yi/main.aap65
-rw-r--r--runtime/spell/yi/yi.diff19
-rw-r--r--runtime/spell/yi/yi_tr.diff18
-rw-r--r--runtime/spell/zu/main.aap83
-rw-r--r--runtime/spell/zu/zu_ZA.diff8
-rw-r--r--runtime/synmenu.vim666
-rw-r--r--runtime/syntax/2html.vim1995
-rw-r--r--runtime/syntax/8th.vim404
-rw-r--r--runtime/syntax/README.txt41
-rw-r--r--runtime/syntax/a2ps.vim71
-rw-r--r--runtime/syntax/a65.vim153
-rw-r--r--runtime/syntax/aap.vim158
-rw-r--r--runtime/syntax/abap.vim196
-rw-r--r--runtime/syntax/abaqus.vim34
-rw-r--r--runtime/syntax/abc.vim51
-rw-r--r--runtime/syntax/abel.vim161
-rw-r--r--runtime/syntax/acedb.vim110
-rw-r--r--runtime/syntax/ada.vim368
-rw-r--r--runtime/syntax/aflex.vim82
-rw-r--r--runtime/syntax/ahdl.vim81
-rw-r--r--runtime/syntax/aidl.vim23
-rw-r--r--runtime/syntax/alsaconf.vim49
-rw-r--r--runtime/syntax/amiga.vim88
-rw-r--r--runtime/syntax/aml.vim144
-rw-r--r--runtime/syntax/ampl.vim140
-rw-r--r--runtime/syntax/ant.vim97
-rw-r--r--runtime/syntax/antlr.vim54
-rw-r--r--runtime/syntax/apache.vim204
-rw-r--r--runtime/syntax/apachestyle.vim54
-rw-r--r--runtime/syntax/aptconf.vim577
-rw-r--r--runtime/syntax/arch.vim41
-rw-r--r--runtime/syntax/arduino.vim83
-rw-r--r--runtime/syntax/art.vim50
-rw-r--r--runtime/syntax/asciidoc.vim185
-rw-r--r--runtime/syntax/asm.vim164
-rw-r--r--runtime/syntax/asm68k.vim378
-rw-r--r--runtime/syntax/asmh8300.vim58
-rw-r--r--runtime/syntax/asn.vim73
-rw-r--r--runtime/syntax/aspperl.vim25
-rw-r--r--runtime/syntax/aspvbs.vim182
-rw-r--r--runtime/syntax/asterisk.vim88
-rw-r--r--runtime/syntax/asteriskvm.vim51
-rw-r--r--runtime/syntax/atlas.vim85
-rw-r--r--runtime/syntax/autodoc.vim101
-rw-r--r--runtime/syntax/autohotkey.vim325
-rw-r--r--runtime/syntax/autoit.vim1125
-rw-r--r--runtime/syntax/automake.vim77
-rw-r--r--runtime/syntax/ave.vim79
-rw-r--r--runtime/syntax/avra.vim71
-rw-r--r--runtime/syntax/awk.vim217
-rw-r--r--runtime/syntax/ayacc.vim75
-rw-r--r--runtime/syntax/b.vim114
-rw-r--r--runtime/syntax/baan.vim1917
-rw-r--r--runtime/syntax/bash.vim20
-rw-r--r--runtime/syntax/basic.vim380
-rw-r--r--runtime/syntax/bc.vim66
-rw-r--r--runtime/syntax/bdf.vim97
-rw-r--r--runtime/syntax/bib.vim121
-rw-r--r--runtime/syntax/bindzone.vim97
-rw-r--r--runtime/syntax/bitbake.vim126
-rw-r--r--runtime/syntax/blank.vim39
-rw-r--r--runtime/syntax/bsdl.vim17
-rw-r--r--runtime/syntax/bst.vim70
-rw-r--r--runtime/syntax/btm.vim216
-rw-r--r--runtime/syntax/bzl.vim16
-rw-r--r--runtime/syntax/bzr.vim50
-rw-r--r--runtime/syntax/c.vim519
-rw-r--r--runtime/syntax/cabal.vim278
-rw-r--r--runtime/syntax/cabalconfig.vim30
-rw-r--r--runtime/syntax/cabalproject.vim28
-rw-r--r--runtime/syntax/calendar.vim110
-rw-r--r--runtime/syntax/catalog.vim30
-rw-r--r--runtime/syntax/cdl.vim78
-rw-r--r--runtime/syntax/cdrdaoconf.vim139
-rw-r--r--runtime/syntax/cdrtoc.vim537
-rw-r--r--runtime/syntax/cf.vim1018
-rw-r--r--runtime/syntax/cfg.vim48
-rw-r--r--runtime/syntax/ch.vim38
-rw-r--r--runtime/syntax/chaiscript.vim94
-rw-r--r--runtime/syntax/change.vim29
-rw-r--r--runtime/syntax/changelog.vim58
-rw-r--r--runtime/syntax/chaskell.vim14
-rw-r--r--runtime/syntax/chatito.vim62
-rw-r--r--runtime/syntax/cheetah.vim47
-rw-r--r--runtime/syntax/chicken.vim94
-rw-r--r--runtime/syntax/chill.vim178
-rw-r--r--runtime/syntax/chordpro.vim173
-rw-r--r--runtime/syntax/cl.vim98
-rw-r--r--runtime/syntax/clean.vim90
-rw-r--r--runtime/syntax/clipper.vim135
-rw-r--r--runtime/syntax/clojure.vim218
-rw-r--r--runtime/syntax/cmake.vim477
-rw-r--r--runtime/syntax/cmod.vim144
-rw-r--r--runtime/syntax/cmusrc.vim309
-rw-r--r--runtime/syntax/cobol.vim260
-rw-r--r--runtime/syntax/coco.vim33
-rw-r--r--runtime/syntax/colortest.vim81
-rw-r--r--runtime/syntax/conaryrecipe.vim137
-rw-r--r--runtime/syntax/conf.vim26
-rw-r--r--runtime/syntax/config.vim54
-rw-r--r--runtime/syntax/confini.vim12
-rw-r--r--runtime/syntax/context.vim144
-rw-r--r--runtime/syntax/cpp.vim129
-rw-r--r--runtime/syntax/crm.vim41
-rw-r--r--runtime/syntax/crontab.vim67
-rw-r--r--runtime/syntax/cs.vim331
-rw-r--r--runtime/syntax/csc.vim191
-rw-r--r--runtime/syntax/csdl.vim536
-rw-r--r--runtime/syntax/csh.vim143
-rw-r--r--runtime/syntax/csp.vim182
-rw-r--r--runtime/syntax/css.vim665
-rw-r--r--runtime/syntax/cterm.vim177
-rw-r--r--runtime/syntax/ctrlh.vim23
-rw-r--r--runtime/syntax/cucumber.vim142
-rw-r--r--runtime/syntax/cuda.vim65
-rw-r--r--runtime/syntax/cupl.vim124
-rw-r--r--runtime/syntax/cuplsim.vim63
-rw-r--r--runtime/syntax/cvs.vim29
-rw-r--r--runtime/syntax/cvsrc.vim39
-rw-r--r--runtime/syntax/cweb.vim68
-rw-r--r--runtime/syntax/cynlib.vim74
-rw-r--r--runtime/syntax/cynpp.vim50
-rw-r--r--runtime/syntax/d.vim573
-rw-r--r--runtime/syntax/dart.vim90
-rw-r--r--runtime/syntax/datascript.vim102
-rw-r--r--runtime/syntax/dcd.vim51
-rw-r--r--runtime/syntax/dcl.vim152
-rw-r--r--runtime/syntax/debchangelog.vim77
-rw-r--r--runtime/syntax/debcontrol.vim145
-rw-r--r--runtime/syntax/debcopyright.vim33
-rw-r--r--runtime/syntax/debsources.vim61
-rw-r--r--runtime/syntax/def.vim44
-rw-r--r--runtime/syntax/denyhosts.vim289
-rw-r--r--runtime/syntax/dep3patch.vim57
-rw-r--r--runtime/syntax/desc.vim88
-rw-r--r--runtime/syntax/desktop.vim267
-rw-r--r--runtime/syntax/dictconf.vim80
-rw-r--r--runtime/syntax/dictdconf.vim146
-rw-r--r--runtime/syntax/diff.vim389
-rw-r--r--runtime/syntax/dircolors.vim222
-rw-r--r--runtime/syntax/dirpager.vim56
-rw-r--r--runtime/syntax/diva.vim96
-rw-r--r--runtime/syntax/django.vim84
-rw-r--r--runtime/syntax/dns.vim5
-rw-r--r--runtime/syntax/dnsmasq.vim242
-rw-r--r--runtime/syntax/docbk.vim186
-rw-r--r--runtime/syntax/docbksgml.vim7
-rw-r--r--runtime/syntax/docbkxml.vim7
-rw-r--r--runtime/syntax/dockerfile.vim45
-rw-r--r--runtime/syntax/dosbatch.vim152
-rw-r--r--runtime/syntax/dosini.vim40
-rw-r--r--runtime/syntax/dot.vim121
-rw-r--r--runtime/syntax/doxygen.vim633
-rw-r--r--runtime/syntax/dracula.vim72
-rw-r--r--runtime/syntax/dsl.vim38
-rw-r--r--runtime/syntax/dtd.vim161
-rw-r--r--runtime/syntax/dtml.vim208
-rw-r--r--runtime/syntax/dtrace.vim145
-rw-r--r--runtime/syntax/dts.vim79
-rw-r--r--runtime/syntax/dune.vim47
-rw-r--r--runtime/syntax/dylan.vim92
-rw-r--r--runtime/syntax/dylanintr.vim39
-rw-r--r--runtime/syntax/dylanlid.vim29
-rw-r--r--runtime/syntax/ecd.vim44
-rw-r--r--runtime/syntax/edif.vim45
-rw-r--r--runtime/syntax/editorconfig.vim21
-rw-r--r--runtime/syntax/eiffel.vim199
-rw-r--r--runtime/syntax/elf.vim82
-rw-r--r--runtime/syntax/elinks.vim188
-rw-r--r--runtime/syntax/elm.vim105
-rw-r--r--runtime/syntax/elmfilt.vim58
-rw-r--r--runtime/syntax/erlang.vim266
-rw-r--r--runtime/syntax/eruby.vim79
-rw-r--r--runtime/syntax/esmtprc.vim31
-rw-r--r--runtime/syntax/esqlc.vim58
-rw-r--r--runtime/syntax/esterel.vim78
-rw-r--r--runtime/syntax/eterm.vim429
-rw-r--r--runtime/syntax/euphoria3.vim133
-rw-r--r--runtime/syntax/euphoria4.vim245
-rw-r--r--runtime/syntax/eviews.vim87
-rw-r--r--runtime/syntax/exim.vim105
-rw-r--r--runtime/syntax/expect.vim103
-rw-r--r--runtime/syntax/exports.vim58
-rw-r--r--runtime/syntax/falcon.vim197
-rw-r--r--runtime/syntax/fan.vim132
-rw-r--r--runtime/syntax/fasm.vim151
-rw-r--r--runtime/syntax/fdcc.vim101
-rw-r--r--runtime/syntax/fetchmail.vim83
-rw-r--r--runtime/syntax/fgl.vim134
-rw-r--r--runtime/syntax/fish.vim225
-rw-r--r--runtime/syntax/flexwiki.vim133
-rw-r--r--runtime/syntax/focexec.vim88
-rw-r--r--runtime/syntax/form.vim145
-rw-r--r--runtime/syntax/forth.vim266
-rw-r--r--runtime/syntax/fortran.vim553
-rw-r--r--runtime/syntax/foxpro.vim716
-rw-r--r--runtime/syntax/fpcmake.vim58
-rw-r--r--runtime/syntax/framescript.vim491
-rw-r--r--runtime/syntax/freebasic.vim674
-rw-r--r--runtime/syntax/fstab.vim494
-rw-r--r--runtime/syntax/fvwm.vim642
-rw-r--r--runtime/syntax/fvwm2m4.vim32
-rw-r--r--runtime/syntax/gdb.vim104
-rw-r--r--runtime/syntax/gdmo.vim83
-rw-r--r--runtime/syntax/gdresource.vim65
-rw-r--r--runtime/syntax/gdscript.vim103
-rw-r--r--runtime/syntax/gdshader.vim57
-rw-r--r--runtime/syntax/gedcom.vim53
-rw-r--r--runtime/syntax/gemtext.vim24
-rw-r--r--runtime/syntax/gift.vim216
-rw-r--r--runtime/syntax/git.vim111
-rw-r--r--runtime/syntax/gitattributes.vim63
-rw-r--r--runtime/syntax/gitcommit.vim107
-rw-r--r--runtime/syntax/gitconfig.vim36
-rw-r--r--runtime/syntax/gitignore.vim29
-rw-r--r--runtime/syntax/gitolite.vim94
-rw-r--r--runtime/syntax/gitrebase.vim62
-rw-r--r--runtime/syntax/gitsendemail.vim23
-rw-r--r--runtime/syntax/gkrellmrc.vim75
-rw-r--r--runtime/syntax/gnash.vim96
-rw-r--r--runtime/syntax/gnuplot.vim549
-rw-r--r--runtime/syntax/go.vim550
-rw-r--r--runtime/syntax/godoc.vim19
-rw-r--r--runtime/syntax/gp.vim83
-rw-r--r--runtime/syntax/gpg.vim107
-rw-r--r--runtime/syntax/gprof.vim70
-rw-r--r--runtime/syntax/grads.vim73
-rw-r--r--runtime/syntax/gretl.vim85
-rw-r--r--runtime/syntax/groff.vim10
-rw-r--r--runtime/syntax/groovy.vim451
-rw-r--r--runtime/syntax/group.vim52
-rw-r--r--runtime/syntax/grub.vim93
-rw-r--r--runtime/syntax/gsp.vim54
-rw-r--r--runtime/syntax/gtkrc.vim126
-rw-r--r--runtime/syntax/gvpr.vim85
-rw-r--r--runtime/syntax/gyp.vim49
-rw-r--r--runtime/syntax/haml.vim109
-rw-r--r--runtime/syntax/hamster.vim370
-rw-r--r--runtime/syntax/hare.vim133
-rw-r--r--runtime/syntax/haskell.vim191
-rw-r--r--runtime/syntax/haste.vim142
-rw-r--r--runtime/syntax/hastepreproc.vim38
-rw-r--r--runtime/syntax/hb.vim89
-rw-r--r--runtime/syntax/help.vim229
-rw-r--r--runtime/syntax/help_ru.vim65
-rw-r--r--runtime/syntax/hercules.vim119
-rw-r--r--runtime/syntax/hex.vim89
-rw-r--r--runtime/syntax/hgcommit.vim30
-rw-r--r--runtime/syntax/hitest.vim149
-rw-r--r--runtime/syntax/hlsplaylist.vim120
-rw-r--r--runtime/syntax/hog.vim208
-rw-r--r--runtime/syntax/hollywood.vim180
-rw-r--r--runtime/syntax/hostconf.vim147
-rw-r--r--runtime/syntax/hostsaccess.vim23
-rw-r--r--runtime/syntax/html.vim359
-rw-r--r--runtime/syntax/htmlcheetah.vim24
-rw-r--r--runtime/syntax/htmldjango.vim26
-rw-r--r--runtime/syntax/htmlm4.vim31
-rw-r--r--runtime/syntax/htmlos.vim149
-rw-r--r--runtime/syntax/i3config.vim264
-rw-r--r--runtime/syntax/ia64.vim293
-rw-r--r--runtime/syntax/ibasic.vim176
-rw-r--r--runtime/syntax/icemenu.vim34
-rw-r--r--runtime/syntax/icon.vim211
-rw-r--r--runtime/syntax/idl.vim324
-rw-r--r--runtime/syntax/idlang.vim240
-rw-r--r--runtime/syntax/indent.vim153
-rw-r--r--runtime/syntax/inform.vim392
-rw-r--r--runtime/syntax/initex.vim376
-rw-r--r--runtime/syntax/initng.vim90
-rw-r--r--runtime/syntax/inittab.vim62
-rw-r--r--runtime/syntax/ipfilter.vim55
-rw-r--r--runtime/syntax/ishd.vim409
-rw-r--r--runtime/syntax/iss.vim136
-rw-r--r--runtime/syntax/ist.vim58
-rw-r--r--runtime/syntax/j.vim146
-rw-r--r--runtime/syntax/jal.vim236
-rw-r--r--runtime/syntax/jam.vim240
-rw-r--r--runtime/syntax/jargon.vim24
-rw-r--r--runtime/syntax/java.vim380
-rw-r--r--runtime/syntax/javacc.vim65
-rw-r--r--runtime/syntax/javascript.vim142
-rw-r--r--runtime/syntax/javascriptreact.vim3
-rw-r--r--runtime/syntax/jess.vim144
-rw-r--r--runtime/syntax/jgraph.vim45
-rw-r--r--runtime/syntax/jovial.vim110
-rw-r--r--runtime/syntax/jproperties.vim135
-rw-r--r--runtime/syntax/json.vim136
-rw-r--r--runtime/syntax/jsonc.vim44
-rw-r--r--runtime/syntax/jsp.vim68
-rw-r--r--runtime/syntax/julia.vim550
-rw-r--r--runtime/syntax/kconfig.vim739
-rw-r--r--runtime/syntax/kivy.vim36
-rw-r--r--runtime/syntax/kix.vim170
-rw-r--r--runtime/syntax/krl.vim458
-rw-r--r--runtime/syntax/kscript.vim57
-rw-r--r--runtime/syntax/kwt.vim70
-rw-r--r--runtime/syntax/lace.vim122
-rw-r--r--runtime/syntax/latte.vim81
-rw-r--r--runtime/syntax/lc.vim31
-rw-r--r--runtime/syntax/ld.vim81
-rw-r--r--runtime/syntax/ldapconf.vim338
-rw-r--r--runtime/syntax/ldif.vim33
-rw-r--r--runtime/syntax/less.vim78
-rw-r--r--runtime/syntax/lex.vim188
-rw-r--r--runtime/syntax/lftp.vim152
-rw-r--r--runtime/syntax/lhaskell.vim134
-rw-r--r--runtime/syntax/libao.vim27
-rw-r--r--runtime/syntax/lifelines.vim154
-rw-r--r--runtime/syntax/lilo.vim174
-rw-r--r--runtime/syntax/limits.vim44
-rw-r--r--runtime/syntax/liquid.vim138
-rw-r--r--runtime/syntax/lisp.vim622
-rw-r--r--runtime/syntax/lite.vim168
-rw-r--r--runtime/syntax/litestep.vim269
-rw-r--r--runtime/syntax/loginaccess.vim96
-rw-r--r--runtime/syntax/logindefs.vim174
-rw-r--r--runtime/syntax/logtalk.vim454
-rw-r--r--runtime/syntax/lotos.vim69
-rw-r--r--runtime/syntax/lout.vim135
-rw-r--r--runtime/syntax/lpc.vim447
-rw-r--r--runtime/syntax/lprolog.vim124
-rw-r--r--runtime/syntax/lscript.vim200
-rw-r--r--runtime/syntax/lsl.vim277
-rw-r--r--runtime/syntax/lss.vim123
-rw-r--r--runtime/syntax/lua.vim442
-rw-r--r--runtime/syntax/lynx.vim140
-rw-r--r--runtime/syntax/lyrics.vim43
-rw-r--r--runtime/syntax/m3build.vim177
-rw-r--r--runtime/syntax/m3quake.vim74
-rw-r--r--runtime/syntax/m4.vim62
-rw-r--r--runtime/syntax/mail.vim112
-rw-r--r--runtime/syntax/mailaliases.vim71
-rw-r--r--runtime/syntax/mailcap.vim35
-rw-r--r--runtime/syntax/make.vim144
-rw-r--r--runtime/syntax/mallard.vim37
-rw-r--r--runtime/syntax/man.vim56
-rw-r--r--runtime/syntax/manconf.vim117
-rw-r--r--runtime/syntax/manual.vim29
-rw-r--r--runtime/syntax/maple.vim622
-rw-r--r--runtime/syntax/markdown.vim200
-rw-r--r--runtime/syntax/masm.vim377
-rw-r--r--runtime/syntax/mason.vim85
-rw-r--r--runtime/syntax/master.vim37
-rw-r--r--runtime/syntax/matlab.vim119
-rw-r--r--runtime/syntax/maxima.vim261
-rw-r--r--runtime/syntax/mel.vim108
-rw-r--r--runtime/syntax/mermaid.vim155
-rw-r--r--runtime/syntax/meson.vim158
-rw-r--r--runtime/syntax/messages.vim74
-rw-r--r--runtime/syntax/mf.vim308
-rw-r--r--runtime/syntax/mgl.vim117
-rw-r--r--runtime/syntax/mgp.vim69
-rw-r--r--runtime/syntax/mib.vim57
-rw-r--r--runtime/syntax/mix.vim84
-rw-r--r--runtime/syntax/mma.vim321
-rw-r--r--runtime/syntax/mmix.vim152
-rw-r--r--runtime/syntax/mmp.vim49
-rw-r--r--runtime/syntax/modconf.vim44
-rw-r--r--runtime/syntax/model.vim44
-rw-r--r--runtime/syntax/modsim3.vim97
-rw-r--r--runtime/syntax/modula2.vim73
-rw-r--r--runtime/syntax/modula3.vim145
-rw-r--r--runtime/syntax/monk.vim217
-rw-r--r--runtime/syntax/moo.vim173
-rw-r--r--runtime/syntax/mp.vim273
-rw-r--r--runtime/syntax/mplayerconf.vim128
-rw-r--r--runtime/syntax/mrxvtrc.vim282
-rw-r--r--runtime/syntax/msidl.vim84
-rw-r--r--runtime/syntax/msmessages.vim132
-rw-r--r--runtime/syntax/msql.vim83
-rw-r--r--runtime/syntax/mupad.vim284
-rw-r--r--runtime/syntax/murphi.vim126
-rw-r--r--runtime/syntax/mush.vim215
-rw-r--r--runtime/syntax/muttrc.vim821
-rw-r--r--runtime/syntax/mysql.vim288
-rw-r--r--runtime/syntax/n1ql.vim434
-rw-r--r--runtime/syntax/named.vim229
-rw-r--r--runtime/syntax/nanorc.vim243
-rw-r--r--runtime/syntax/nasm.vim527
-rw-r--r--runtime/syntax/nastran.vim181
-rw-r--r--runtime/syntax/natural.vim201
-rw-r--r--runtime/syntax/ncf.vim247
-rw-r--r--runtime/syntax/neomuttrc.vim880
-rw-r--r--runtime/syntax/netrc.vim52
-rw-r--r--runtime/syntax/netrw.vim146
-rw-r--r--runtime/syntax/nginx.vim2338
-rw-r--r--runtime/syntax/ninja.vim87
-rw-r--r--runtime/syntax/nix.vim210
-rw-r--r--runtime/syntax/nosyntax.vim30
-rw-r--r--runtime/syntax/nqc.vim365
-rw-r--r--runtime/syntax/nroff.vim249
-rw-r--r--runtime/syntax/nsis.vim730
-rw-r--r--runtime/syntax/obj.vim83
-rw-r--r--runtime/syntax/objc.vim534
-rw-r--r--runtime/syntax/objcpp.vim20
-rw-r--r--runtime/syntax/obse.vim3360
-rw-r--r--runtime/syntax/ocaml.vim393
-rw-r--r--runtime/syntax/occam.vim116
-rw-r--r--runtime/syntax/omnimark.vim106
-rw-r--r--runtime/syntax/opam.vim38
-rw-r--r--runtime/syntax/openroad.vim252
-rw-r--r--runtime/syntax/openscad.vim129
-rw-r--r--runtime/syntax/openvpn.vim72
-rw-r--r--runtime/syntax/opl.vim89
-rw-r--r--runtime/syntax/ora.vim464
-rw-r--r--runtime/syntax/pamconf.vim131
-rw-r--r--runtime/syntax/pamenv.vim28
-rw-r--r--runtime/syntax/papp.vim76
-rw-r--r--runtime/syntax/pascal.vim384
-rw-r--r--runtime/syntax/passwd.vim71
-rw-r--r--runtime/syntax/pbtxt.vim44
-rw-r--r--runtime/syntax/pcap.vim48
-rw-r--r--runtime/syntax/pccts.vim89
-rw-r--r--runtime/syntax/pdf.vim73
-rw-r--r--runtime/syntax/perl.vim662
-rw-r--r--runtime/syntax/pf.vim333
-rw-r--r--runtime/syntax/pfmain.vim1835
-rw-r--r--runtime/syntax/php.vim978
-rw-r--r--runtime/syntax/phtml.vim6
-rw-r--r--runtime/syntax/pic.vim114
-rw-r--r--runtime/syntax/pike.vim386
-rw-r--r--runtime/syntax/pilrc.vim136
-rw-r--r--runtime/syntax/pine.vim355
-rw-r--r--runtime/syntax/pinfo.vim110
-rw-r--r--runtime/syntax/plaintex.vim170
-rw-r--r--runtime/syntax/pli.vim266
-rw-r--r--runtime/syntax/plm.vim134
-rw-r--r--runtime/syntax/plp.vim37
-rw-r--r--runtime/syntax/plsql.vim863
-rw-r--r--runtime/syntax/po.vim133
-rw-r--r--runtime/syntax/pod.vim222
-rw-r--r--runtime/syntax/poefilter.vim167
-rw-r--r--runtime/syntax/poke.vim151
-rw-r--r--runtime/syntax/postscr.vim780
-rw-r--r--runtime/syntax/pov.vim144
-rw-r--r--runtime/syntax/povini.vim56
-rw-r--r--runtime/syntax/ppd.vim35
-rw-r--r--runtime/syntax/ppwiz.vim84
-rw-r--r--runtime/syntax/prescribe.vim56
-rw-r--r--runtime/syntax/privoxy.vim71
-rw-r--r--runtime/syntax/procmail.vim54
-rw-r--r--runtime/syntax/progress.vim312
-rw-r--r--runtime/syntax/prolog.vim118
-rw-r--r--runtime/syntax/promela.vim53
-rw-r--r--runtime/syntax/proto.vim83
-rw-r--r--runtime/syntax/protocols.vim44
-rw-r--r--runtime/syntax/ps1.vim182
-rw-r--r--runtime/syntax/ps1xml.vim51
-rw-r--r--runtime/syntax/psf.vim91
-rw-r--r--runtime/syntax/psl.vim83
-rw-r--r--runtime/syntax/ptcap.vim95
-rw-r--r--runtime/syntax/purifylog.vim106
-rw-r--r--runtime/syntax/pyrex.vim51
-rw-r--r--runtime/syntax/python.vim340
-rw-r--r--runtime/syntax/python2.vim345
-rw-r--r--runtime/syntax/qb64.vim409
-rw-r--r--runtime/syntax/qf.vim24
-rw-r--r--runtime/syntax/quake.vim170
-rw-r--r--runtime/syntax/quarto.vim17
-rw-r--r--runtime/syntax/r.vim390
-rw-r--r--runtime/syntax/racc.vim142
-rw-r--r--runtime/syntax/racket.vim656
-rw-r--r--runtime/syntax/radiance.vim142
-rw-r--r--runtime/syntax/raku.vim1971
-rw-r--r--runtime/syntax/raml.vim106
-rw-r--r--runtime/syntax/ratpoison.vim275
-rw-r--r--runtime/syntax/rc.vim191
-rw-r--r--runtime/syntax/rcs.vim63
-rw-r--r--runtime/syntax/rcslog.vim25
-rw-r--r--runtime/syntax/readline.vim411
-rw-r--r--runtime/syntax/rebol.vim199
-rw-r--r--runtime/syntax/redif.vim970
-rw-r--r--runtime/syntax/registry.vim103
-rw-r--r--runtime/syntax/rego.vim120
-rw-r--r--runtime/syntax/remind.vim73
-rw-r--r--runtime/syntax/resolv.vim119
-rw-r--r--runtime/syntax/reva.vim191
-rw-r--r--runtime/syntax/rexx.vim318
-rw-r--r--runtime/syntax/rhelp.vim274
-rw-r--r--runtime/syntax/rib.vim62
-rw-r--r--runtime/syntax/rmd.vim177
-rw-r--r--runtime/syntax/rnc.vim68
-rw-r--r--runtime/syntax/rng.vim25
-rw-r--r--runtime/syntax/rnoweb.vim52
-rw-r--r--runtime/syntax/robots.vim57
-rw-r--r--runtime/syntax/routeros.vim91
-rw-r--r--runtime/syntax/rpcgen.vim46
-rw-r--r--runtime/syntax/rpl.vim483
-rw-r--r--runtime/syntax/rrst.vim43
-rw-r--r--runtime/syntax/rst.vim290
-rw-r--r--runtime/syntax/rtf.vim75
-rw-r--r--runtime/syntax/ruby.vim606
-rw-r--r--runtime/syntax/rust.vim295
-rw-r--r--runtime/syntax/samba.vim118
-rw-r--r--runtime/syntax/sas.vim265
-rw-r--r--runtime/syntax/sass.vim106
-rw-r--r--runtime/syntax/sather.vim92
-rw-r--r--runtime/syntax/sbt.vim32
-rw-r--r--runtime/syntax/scala.vim233
-rw-r--r--runtime/syntax/scdoc.vim63
-rw-r--r--runtime/syntax/scheme.vim467
-rw-r--r--runtime/syntax/scilab.vim102
-rw-r--r--runtime/syntax/screen.vim260
-rw-r--r--runtime/syntax/scss.vim25
-rw-r--r--runtime/syntax/sd.vim71
-rw-r--r--runtime/syntax/sdc.vim41
-rw-r--r--runtime/syntax/sdl.vim153
-rw-r--r--runtime/syntax/sed.vim123
-rw-r--r--runtime/syntax/sendpr.vim37
-rw-r--r--runtime/syntax/sensors.vim52
-rw-r--r--runtime/syntax/services.vim54
-rw-r--r--runtime/syntax/setserial.vim120
-rw-r--r--runtime/syntax/sexplib.vim88
-rw-r--r--runtime/syntax/sgml.vim334
-rw-r--r--runtime/syntax/sgmldecl.vim72
-rw-r--r--runtime/syntax/sgmllnx.vim54
-rw-r--r--runtime/syntax/sh.vim813
-rw-r--r--runtime/syntax/shared/README.txt2
-rw-r--r--runtime/syntax/shared/context-data-context.vim345
-rw-r--r--runtime/syntax/shared/context-data-interfaces.vim1183
-rw-r--r--runtime/syntax/shared/context-data-metafun.vim117
-rw-r--r--runtime/syntax/shared/context-data-tex.vim225
-rw-r--r--runtime/syntax/shared/hgcommitDiff.vim390
-rw-r--r--runtime/syntax/shared/typescriptcommon.vim2099
-rw-r--r--runtime/syntax/sicad.vim390
-rw-r--r--runtime/syntax/sieve.vim55
-rw-r--r--runtime/syntax/sil.vim179
-rw-r--r--runtime/syntax/simula.vim87
-rw-r--r--runtime/syntax/sinda.vim129
-rw-r--r--runtime/syntax/sindacmp.vim61
-rw-r--r--runtime/syntax/sindaout.vim83
-rw-r--r--runtime/syntax/sisu.vim275
-rw-r--r--runtime/syntax/skill.vim549
-rw-r--r--runtime/syntax/sl.vim107
-rw-r--r--runtime/syntax/slang.vim89
-rw-r--r--runtime/syntax/slice.vim78
-rw-r--r--runtime/syntax/slpconf.vim273
-rw-r--r--runtime/syntax/slpreg.vim122
-rw-r--r--runtime/syntax/slpspi.vim39
-rw-r--r--runtime/syntax/slrnrc.vim181
-rw-r--r--runtime/syntax/slrnsc.vim68
-rw-r--r--runtime/syntax/sm.vim80
-rw-r--r--runtime/syntax/smarty.vim76
-rw-r--r--runtime/syntax/smcl.vim307
-rw-r--r--runtime/syntax/smil.vim146
-rw-r--r--runtime/syntax/smith.vim39
-rw-r--r--runtime/syntax/sml.vim220
-rw-r--r--runtime/syntax/snnsnet.vim67
-rw-r--r--runtime/syntax/snnspat.vim62
-rw-r--r--runtime/syntax/snnsres.vim50
-rw-r--r--runtime/syntax/snobol4.vim113
-rw-r--r--runtime/syntax/solidity.vim173
-rw-r--r--runtime/syntax/spec.vim226
-rw-r--r--runtime/syntax/specman.vim169
-rw-r--r--runtime/syntax/spice.vim75
-rw-r--r--runtime/syntax/splint.vim243
-rw-r--r--runtime/syntax/spup.vim269
-rw-r--r--runtime/syntax/spyce.vim104
-rw-r--r--runtime/syntax/sql.vim36
-rw-r--r--runtime/syntax/sqlanywhere.vim905
-rw-r--r--runtime/syntax/sqlforms.vim152
-rw-r--r--runtime/syntax/sqlhana.vim290
-rw-r--r--runtime/syntax/sqlinformix.vim183
-rw-r--r--runtime/syntax/sqlj.vim91
-rw-r--r--runtime/syntax/sqloracle.vim150
-rw-r--r--runtime/syntax/sqr.vim262
-rw-r--r--runtime/syntax/squid.vim140
-rw-r--r--runtime/syntax/squirrel.vim50
-rw-r--r--runtime/syntax/srec.vim83
-rw-r--r--runtime/syntax/srt.vim62
-rw-r--r--runtime/syntax/ssa.vim63
-rw-r--r--runtime/syntax/sshconfig.vim296
-rw-r--r--runtime/syntax/sshdconfig.vim308
-rw-r--r--runtime/syntax/st.vim95
-rw-r--r--runtime/syntax/stata.vim450
-rw-r--r--runtime/syntax/stp.vim154
-rw-r--r--runtime/syntax/strace.vim52
-rw-r--r--runtime/syntax/structurizr.vim81
-rw-r--r--runtime/syntax/sudoers.vim390
-rw-r--r--runtime/syntax/svg.vim15
-rw-r--r--runtime/syntax/svn.vim56
-rw-r--r--runtime/syntax/swayconfig.vim106
-rw-r--r--runtime/syntax/swift.vim286
-rw-r--r--runtime/syntax/swiftgyb.vim24
-rw-r--r--runtime/syntax/syncolor.vim87
-rw-r--r--runtime/syntax/synload.vim83
-rw-r--r--runtime/syntax/syntax.vim44
-rw-r--r--runtime/syntax/sysctl.vim39
-rw-r--r--runtime/syntax/systemd.vim8
-rw-r--r--runtime/syntax/systemverilog.vim85
-rw-r--r--runtime/syntax/tads.vim171
-rw-r--r--runtime/syntax/tags.vim31
-rw-r--r--runtime/syntax/tak.vim119
-rw-r--r--runtime/syntax/takcmp.vim69
-rw-r--r--runtime/syntax/takout.vim85
-rw-r--r--runtime/syntax/tap.vim86
-rw-r--r--runtime/syntax/tar.vim19
-rw-r--r--runtime/syntax/taskdata.vim45
-rw-r--r--runtime/syntax/taskedit.vim37
-rw-r--r--runtime/syntax/tasm.vim115
-rw-r--r--runtime/syntax/tcl.vim274
-rw-r--r--runtime/syntax/tcsh.vim255
-rw-r--r--runtime/syntax/template.vim15
-rw-r--r--runtime/syntax/teraterm.vim140
-rw-r--r--runtime/syntax/terminfo.vim93
-rw-r--r--runtime/syntax/tex.vim1352
-rw-r--r--runtime/syntax/texinfo.vim46
-rw-r--r--runtime/syntax/texmf.vim74
-rw-r--r--runtime/syntax/tf.vim196
-rw-r--r--runtime/syntax/tidy.vim276
-rw-r--r--runtime/syntax/tilde.vim41
-rw-r--r--runtime/syntax/tli.vim58
-rw-r--r--runtime/syntax/tmux.vim154
-rw-r--r--runtime/syntax/toml.vim81
-rw-r--r--runtime/syntax/tpp.vim83
-rw-r--r--runtime/syntax/trasys.vim160
-rw-r--r--runtime/syntax/treetop.vim110
-rw-r--r--runtime/syntax/trustees.vim44
-rw-r--r--runtime/syntax/tsalt.vim206
-rw-r--r--runtime/syntax/tsscl.vim204
-rw-r--r--runtime/syntax/tssgm.vim98
-rw-r--r--runtime/syntax/tssop.vim74
-rw-r--r--runtime/syntax/tt2.vim209
-rw-r--r--runtime/syntax/tt2html.vim22
-rw-r--r--runtime/syntax/tt2js.vim22
-rw-r--r--runtime/syntax/typescript.vim47
-rw-r--r--runtime/syntax/typescriptreact.vim160
-rw-r--r--runtime/syntax/uc.vim165
-rw-r--r--runtime/syntax/udevconf.vim39
-rw-r--r--runtime/syntax/udevperm.vim69
-rw-r--r--runtime/syntax/udevrules.vim171
-rw-r--r--runtime/syntax/uil.vim75
-rw-r--r--runtime/syntax/updatedb.vim41
-rw-r--r--runtime/syntax/upstart.vim111
-rw-r--r--runtime/syntax/upstreamdat.vim305
-rw-r--r--runtime/syntax/upstreaminstalllog.vim27
-rw-r--r--runtime/syntax/upstreamlog.vim54
-rw-r--r--runtime/syntax/upstreamrpt.vim310
-rw-r--r--runtime/syntax/usserverlog.vim60
-rw-r--r--runtime/syntax/usw2kagtlog.vim54
-rw-r--r--runtime/syntax/valgrind.vim110
-rw-r--r--runtime/syntax/vb.vim375
-rw-r--r--runtime/syntax/vdf.vim54
-rw-r--r--runtime/syntax/vera.vim348
-rw-r--r--runtime/syntax/verilog.vim119
-rw-r--r--runtime/syntax/verilogams.vim132
-rw-r--r--runtime/syntax/vgrindefs.vim45
-rw-r--r--runtime/syntax/vhdl.vim268
-rw-r--r--runtime/syntax/vim.vim1046
-rw-r--r--runtime/syntax/viminfo.vim48
-rw-r--r--runtime/syntax/virata.vim207
-rw-r--r--runtime/syntax/vmasm.vim238
-rw-r--r--runtime/syntax/voscm.vim94
-rw-r--r--runtime/syntax/vrml.vim222
-rw-r--r--runtime/syntax/vroom.vim110
-rw-r--r--runtime/syntax/vsejcl.vim36
-rw-r--r--runtime/syntax/vue.vim14
-rw-r--r--runtime/syntax/wast.vim84
-rw-r--r--runtime/syntax/wdiff.vim29
-rw-r--r--runtime/syntax/wdl.vim41
-rw-r--r--runtime/syntax/web.vim32
-rw-r--r--runtime/syntax/webmacro.vim67
-rw-r--r--runtime/syntax/wget.vim243
-rw-r--r--runtime/syntax/wget2.vim250
-rw-r--r--runtime/syntax/whitespace.vim13
-rw-r--r--runtime/syntax/winbatch.vim174
-rw-r--r--runtime/syntax/wml.vim150
-rw-r--r--runtime/syntax/wsh.vim45
-rw-r--r--runtime/syntax/wsml.vim113
-rw-r--r--runtime/syntax/wvdial.vim28
-rw-r--r--runtime/syntax/xbl.vim29
-rw-r--r--runtime/syntax/xdefaults.vim132
-rw-r--r--runtime/syntax/xf86conf.vim207
-rw-r--r--runtime/syntax/xhtml.vim11
-rw-r--r--runtime/syntax/xinetd.vim347
-rw-r--r--runtime/syntax/xkb.vim79
-rw-r--r--runtime/syntax/xmath.vim225
-rw-r--r--runtime/syntax/xml.vim361
-rw-r--r--runtime/syntax/xmodmap.vim677
-rw-r--r--runtime/syntax/xpm.vim141
-rw-r--r--runtime/syntax/xpm2.vim153
-rw-r--r--runtime/syntax/xquery.vim82
-rw-r--r--runtime/syntax/xs.vim3680
-rw-r--r--runtime/syntax/xsd.vim61
-rw-r--r--runtime/syntax/xslt.vim71
-rw-r--r--runtime/syntax/xxd.vim30
-rw-r--r--runtime/syntax/yacc.vim120
-rw-r--r--runtime/syntax/yaml.vim243
-rw-r--r--runtime/syntax/z8a.vim101
-rw-r--r--runtime/syntax/zig.vim292
-rw-r--r--runtime/syntax/zimbu.vim160
-rw-r--r--runtime/syntax/zir.vim49
-rw-r--r--runtime/syntax/zsh.vim359
-rw-r--r--runtime/termcap135
-rwxr-xr-xruntime/tools.infobin0 -> 624 bytes
-rw-r--r--runtime/tools/README.txt37
-rw-r--r--runtime/tools/blink.c24
-rw-r--r--runtime/tools/ccfilter.193
-rw-r--r--runtime/tools/ccfilter.c328
-rw-r--r--runtime/tools/ccfilter_README.txt101
-rw-r--r--runtime/tools/demoserver.py107
-rwxr-xr-xruntime/tools/efm_filter.pl39
-rw-r--r--runtime/tools/efm_filter.txt31
-rwxr-xr-xruntime/tools/efm_perl.pl153
-rw-r--r--runtime/tools/emoji_list.vim23
-rwxr-xr-xruntime/tools/mve.awk23
-rw-r--r--runtime/tools/mve.txt20
-rwxr-xr-xruntime/tools/pltags.pl300
-rwxr-xr-xruntime/tools/ref11
-rw-r--r--runtime/tools/shtags.161
-rwxr-xr-xruntime/tools/shtags.pl144
-rw-r--r--runtime/tools/unicode.vim471
-rwxr-xr-xruntime/tools/vim13213
-rw-r--r--runtime/tools/vim_vs_net.cmd23
-rwxr-xr-xruntime/tools/vimm6
-rwxr-xr-xruntime/tools/vimspell.sh55
-rw-r--r--runtime/tools/vimspell.txt22
-rw-r--r--runtime/tools/xcmdsrv_client.c578
-rwxr-xr-xruntime/tutor.infobin0 -> 624 bytes
-rw-r--r--runtime/tutor/Makefile104
-rw-r--r--runtime/tutor/README.el.cp737.txt24
-rw-r--r--runtime/tutor/README.el.txt24
-rw-r--r--runtime/tutor/README.txt37
-rwxr-xr-xruntime/tutor/README.txt.infobin0 -> 738 bytes
-rw-r--r--runtime/tutor/tutor972
-rw-r--r--runtime/tutor/tutor.bar981
-rw-r--r--runtime/tutor/tutor.bar.utf-8981
-rw-r--r--runtime/tutor/tutor.bg.utf-81037
-rw-r--r--runtime/tutor/tutor.ca809
-rw-r--r--runtime/tutor/tutor.ca.utf-8809
-rw-r--r--runtime/tutor/tutor.cs812
-rw-r--r--runtime/tutor/tutor.cs.cp1250812
-rw-r--r--runtime/tutor/tutor.cs.utf-8812
-rw-r--r--runtime/tutor/tutor.da972
-rw-r--r--runtime/tutor/tutor.da.utf-8972
-rw-r--r--runtime/tutor/tutor.de982
-rw-r--r--runtime/tutor/tutor.de.utf-8982
-rw-r--r--runtime/tutor/tutor.el815
-rw-r--r--runtime/tutor/tutor.el.cp737815
-rw-r--r--runtime/tutor/tutor.el.utf-8815
-rw-r--r--runtime/tutor/tutor.eo991
-rw-r--r--runtime/tutor/tutor.eo.utf-8991
-rw-r--r--runtime/tutor/tutor.es1026
-rw-r--r--runtime/tutor/tutor.es.utf-81026
-rw-r--r--runtime/tutor/tutor.fr1038
-rw-r--r--runtime/tutor/tutor.fr.utf-81038
-rw-r--r--runtime/tutor/tutor.hr972
-rw-r--r--runtime/tutor/tutor.hr.cp1250972
-rw-r--r--runtime/tutor/tutor.hr.utf-8972
-rw-r--r--runtime/tutor/tutor.hu830
-rw-r--r--runtime/tutor/tutor.hu.cp1250830
-rw-r--r--runtime/tutor/tutor.hu.utf-8830
-rw-r--r--runtime/tutor/tutor.infobin0 -> 972 bytes
-rw-r--r--runtime/tutor/tutor.it967
-rw-r--r--runtime/tutor/tutor.it.utf-8967
-rw-r--r--runtime/tutor/tutor.ja.euc977
-rw-r--r--runtime/tutor/tutor.ja.sjis977
-rw-r--r--runtime/tutor/tutor.ja.utf-8977
-rw-r--r--runtime/tutor/tutor.ko968
-rw-r--r--runtime/tutor/tutor.ko.euc968
-rw-r--r--runtime/tutor/tutor.ko.utf-8968
-rw-r--r--runtime/tutor/tutor.lv.utf-81009
-rw-r--r--runtime/tutor/tutor.nb973
-rw-r--r--runtime/tutor/tutor.nb.utf-8973
-rw-r--r--runtime/tutor/tutor.nl950
-rw-r--r--runtime/tutor/tutor.nl.utf-8950
-rw-r--r--runtime/tutor/tutor.no973
-rw-r--r--runtime/tutor/tutor.no.utf-8973
-rw-r--r--runtime/tutor/tutor.pl995
-rw-r--r--runtime/tutor/tutor.pl.cp1250995
-rw-r--r--runtime/tutor/tutor.pl.utf-8995
-rw-r--r--runtime/tutor/tutor.pt1004
-rw-r--r--runtime/tutor/tutor.pt.utf-81004
-rw-r--r--runtime/tutor/tutor.ru1007
-rw-r--r--runtime/tutor/tutor.ru.cp12511007
-rw-r--r--runtime/tutor/tutor.ru.utf-81007
-rw-r--r--runtime/tutor/tutor.sk1008
-rw-r--r--runtime/tutor/tutor.sk.cp12501008
-rw-r--r--runtime/tutor/tutor.sk.utf-81008
-rw-r--r--runtime/tutor/tutor.sr.cp1250971
-rw-r--r--runtime/tutor/tutor.sr.utf-8971
-rw-r--r--runtime/tutor/tutor.sv830
-rw-r--r--runtime/tutor/tutor.sv.utf-8830
-rw-r--r--runtime/tutor/tutor.tr.iso9981
-rw-r--r--runtime/tutor/tutor.tr.utf-8981
-rw-r--r--runtime/tutor/tutor.uk.utf-8976
-rw-r--r--runtime/tutor/tutor.utf-8972
-rw-r--r--runtime/tutor/tutor.vi.utf-8812
-rw-r--r--runtime/tutor/tutor.vim202
-rw-r--r--runtime/tutor/tutor.zh.big5852
-rw-r--r--runtime/tutor/tutor.zh.euc996
-rw-r--r--runtime/tutor/tutor.zh.utf-8852
-rw-r--r--runtime/tutor/tutor.zh_cn.utf-8996
-rw-r--r--runtime/tutor/tutor.zh_tw.utf-8852
-rw-r--r--runtime/vim.desktop135
-rw-r--r--runtime/vim16x16.gifbin0 -> 166 bytes
-rw-r--r--runtime/vim16x16.pngbin0 -> 226 bytes
-rw-r--r--runtime/vim16x16.xpm27
-rw-r--r--runtime/vim32x32.gifbin0 -> 298 bytes
-rw-r--r--runtime/vim32x32.pngbin0 -> 347 bytes
-rw-r--r--runtime/vim32x32.xpm43
-rw-r--r--runtime/vim48x48.gifbin0 -> 504 bytes
-rw-r--r--runtime/vim48x48.pngbin0 -> 474 bytes
-rw-r--r--runtime/vim48x48.xpm59
-rw-r--r--runtime/vimlogo.cdrbin0 -> 15494 bytes
-rw-r--r--runtime/vimlogo.eps803
-rw-r--r--runtime/vimlogo.gifbin0 -> 1091 bytes
-rw-r--r--runtime/vimlogo.pdfbin0 -> 2254 bytes
-rw-r--r--runtime/vimlogo.xpm75
-rw-r--r--runtime/vimrc_example.vim52
2188 files changed, 652681 insertions, 0 deletions
diff --git a/runtime/autoload/README.txt b/runtime/autoload/README.txt
new file mode 100644
index 0000000..3b18d3d
--- /dev/null
+++ b/runtime/autoload/README.txt
@@ -0,0 +1,22 @@
+The autoload directory is for standard Vim autoload scripts.
+
+These are functions used by plugins and for general use. They will be loaded
+automatically when the function is invoked. See ":help autoload".
+
+gzip.vim for editing compressed files
+netrw*.vim browsing (remote) directories and editing remote files
+tar.vim browsing tar files
+zip.vim browsing zip files
+paste.vim common code for mswin.vim, menu.vim and macmap.vim
+spellfile.vim downloading of a missing spell file
+
+Omni completion files:
+ccomplete.vim C
+csscomplete.vim HTML / CSS
+htmlcomplete.vim HTML
+javascriptcomplete.vim Javascript
+phpcomplete.vim PHP
+pythoncomplete.vim Python
+rubycomplete.vim Ruby
+syntaxcomplete.vim from syntax highlighting
+xmlcomplete.vim XML (uses files in the xml directory)
diff --git a/runtime/autoload/RstFold.vim b/runtime/autoload/RstFold.vim
new file mode 100644
index 0000000..238b1e3
--- /dev/null
+++ b/runtime/autoload/RstFold.vim
@@ -0,0 +1,62 @@
+" Author: Antony Lee <anntzer.lee@gmail.com>
+" Description: Helper functions for reStructuredText syntax folding
+" Last Modified: 2018-12-29
+
+function s:CacheRstFold()
+ if !g:rst_fold_enabled
+ return
+ endif
+
+ 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()
+ let save_mark = getpos("'[")
+ 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)
+ call setpos("'[", save_mark)
+ let b:RstFoldCache = closure.levels
+endfunction
+
+function RstFold#GetRstFold()
+ if !g:rst_fold_enabled
+ return
+ endif
+
+ 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 !g:rst_fold_enabled
+ return
+ endif
+
+ 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
new file mode 100644
index 0000000..3f1b403
--- /dev/null
+++ b/runtime/autoload/ada.vim
@@ -0,0 +1,637 @@
+"------------------------------------------------------------------------------
+" Description: Perform Ada specific completion & tagging.
+" Language: Ada (2005)
+" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $
+" 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: 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 $
+" History: 24.05.2006 MK Unified Headers
+" 26.05.2006 MK ' should not be in iskeyword.
+" 16.07.2006 MK Ada-Mode as vim-ball
+" 02.10.2006 MK Better folding.
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 05.11.2006 MK Bram suggested not to use include protection for
+" autoload
+" 05.11.2006 MK Bram suggested to save on spaces
+" 08.07.2007 TV fix mapleader problems.
+" 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
+"------------------------------------------------------------------------------
+
+if version < 700
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Section: Constants {{{1
+"
+let g:ada#DotWordRegex = '\a\w*\(\_s*\.\_s*\a\w*\)*'
+let g:ada#WordRegex = '\a\w*'
+let g:ada#Comment = "\\v^(\"[^\"]*\"|'.'|[^\"']){-}\\zs\\s*--.*"
+let g:ada#Keywords = []
+
+" Section: g:ada#Keywords {{{1
+"
+" Section: add Ada keywords {{{2
+"
+for Item in ['abort', 'else', 'new', 'return', 'abs', 'elsif', 'not', 'reverse', 'abstract', 'end', 'null', 'accept', 'entry', 'select', 'access', 'exception', 'of', 'separate', 'aliased', 'exit', 'or', 'subtype', 'all', 'others', 'synchronized', 'and', 'for', 'out', 'array', 'function', 'overriding', 'tagged', 'at', 'task', 'generic', 'package', 'terminate', 'begin', 'goto', 'pragma', 'then', 'body', 'private', 'type', 'if', 'procedure', 'case', 'in', 'protected', 'until', 'constant', 'interface', 'use', 'is', 'raise', 'declare', 'range', 'when', 'delay', 'limited', 'record', 'while', 'delta', 'loop', 'rem', 'with', 'digits', 'renames', 'do', 'mod', 'requeue', 'xor']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'keyword',
+ \ 'info': 'Ada keyword.',
+ \ 'kind': 'k',
+ \ 'icase': 1}]
+endfor
+
+" Section: GNAT Project Files {{{3
+"
+if exists ('g:ada_with_gnat_project_files')
+ for Item in ['project']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'keyword',
+ \ 'info': 'GNAT projectfile keyword.',
+ \ 'kind': 'k',
+ \ 'icase': 1}]
+ endfor
+endif
+
+" Section: add standard exception {{{2
+"
+for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'exception',
+ \ 'info': 'Ada standard exception.',
+ \ 'kind': 'x',
+ \ 'icase': 1}]
+endfor
+
+" Section: add GNAT exception {{{3
+"
+if exists ('g:ada_gnat_extensions')
+ for Item in ['Assert_Failure']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'exception',
+ \ 'info': 'GNAT exception.',
+ \ 'kind': 'x',
+ \ 'icase': 1}]
+ endfor
+endif
+
+" Section: add Ada buildin types {{{2
+"
+for Item in ['Boolean', 'Integer', 'Natural', 'Positive', 'Float', 'Character', 'Wide_Character', 'Wide_Wide_Character', 'String', 'Wide_String', 'Wide_Wide_String', 'Duration']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'type',
+ \ 'info': 'Ada buildin type.',
+ \ 'kind': 't',
+ \ 'icase': 1}]
+endfor
+
+" Section: add GNAT buildin types {{{3
+"
+if exists ('g:ada_gnat_extensions')
+ for Item in ['Short_Integer', 'Short_Short_Integer', 'Long_Integer', 'Long_Long_Integer', 'Short_Float', 'Short_Short_Float', 'Long_Float', 'Long_Long_Float']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'type',
+ \ 'info': 'GNAT buildin type.',
+ \ 'kind': 't',
+ \ 'icase': 1}]
+ endfor
+endif
+
+" Section: add Ada Attributes {{{2
+"
+for Item in ['''Access', '''Address', '''Adjacent', '''Aft', '''Alignment', '''Base', '''Bit_Order', '''Body_Version', '''Callable', '''Caller', '''Ceiling', '''Class', '''Component_Size', '''Compose', '''Constrained', '''Copy_Sign', '''Count', '''Definite', '''Delta', '''Denorm', '''Digits', '''Emax', '''Exponent', '''External_Tag', '''Epsilon', '''First', '''First_Bit', '''Floor', '''Fore', '''Fraction', '''Identity', '''Image', '''Input', '''Large', '''Last', '''Last_Bit', '''Leading_Part', '''Length', '''Machine', '''Machine_Emax', '''Machine_Emin', '''Machine_Mantissa', '''Machine_Overflows', '''Machine_Radix', '''Machine_Rounding', '''Machine_Rounds', '''Mantissa', '''Max', '''Max_Size_In_Storage_Elements', '''Min', '''Mod', '''Model', '''Model_Emin', '''Model_Epsilon', '''Model_Mantissa', '''Model_Small', '''Modulus', '''Output', '''Partition_ID', '''Pos', '''Position', '''Pred', '''Priority', '''Range', '''Read', '''Remainder', '''Round', '''Rounding', '''Safe_Emax', '''Safe_First', '''Safe_Large', '''Safe_Last', '''Safe_Small', '''Scale', '''Scaling', '''Signed_Zeros', '''Size', '''Small', '''Storage_Pool', '''Storage_Size', '''Stream_Size', '''Succ', '''Tag', '''Terminated', '''Truncation', '''Unbiased_Rounding', '''Unchecked_Access', '''Val', '''Valid', '''Value', '''Version', '''Wide_Image', '''Wide_Value', '''Wide_Wide_Image', '''Wide_Wide_Value', '''Wide_Wide_Width', '''Wide_Width', '''Width', '''Write']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'attribute',
+ \ 'info': 'Ada attribute.',
+ \ 'kind': 'a',
+ \ 'icase': 1}]
+endfor
+
+" Section: add GNAT Attributes {{{3
+"
+if exists ('g:ada_gnat_extensions')
+ for Item in ['''Abort_Signal', '''Address_Size', '''Asm_Input', '''Asm_Output', '''AST_Entry', '''Bit', '''Bit_Position', '''Code_Address', '''Default_Bit_Order', '''Elaborated', '''Elab_Body', '''Elab_Spec', '''Emax', '''Enum_Rep', '''Epsilon', '''Fixed_Value', '''Has_Access_Values', '''Has_Discriminants', '''Img', '''Integer_Value', '''Machine_Size', '''Max_Interrupt_Priority', '''Max_Priority', '''Maximum_Alignment', '''Mechanism_Code', '''Null_Parameter', '''Object_Size', '''Passed_By_Reference', '''Range_Length', '''Storage_Unit', '''Target_Name', '''Tick', '''To_Address', '''Type_Class', '''UET_Address', '''Unconstrained_Array', '''Universal_Literal_String', '''Unrestricted_Access', '''VADS_Size', '''Value_Size', '''Wchar_T_Size', '''Word_Size']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'attribute',
+ \ 'info': 'GNAT attribute.',
+ \ 'kind': 'a',
+ \ 'icase': 1}]
+ endfor
+endif
+
+" Section: add Ada Pragmas {{{2
+"
+for Item in ['All_Calls_Remote', 'Assert', 'Assertion_Policy', 'Asynchronous', 'Atomic', 'Atomic_Components', 'Attach_Handler', 'Controlled', 'Convention', 'Detect_Blocking', 'Discard_Names', 'Elaborate', 'Elaborate_All', 'Elaborate_Body', 'Export', 'Import', 'Inline', 'Inspection_Point', 'Interface (Obsolescent)', 'Interrupt_Handler', 'Interrupt_Priority', 'Linker_Options', 'List', 'Locking_Policy', 'Memory_Size (Obsolescent)', 'No_Return', 'Normalize_Scalars', 'Optimize', 'Pack', 'Page', 'Partition_Elaboration_Policy', 'Preelaborable_Initialization', 'Preelaborate', 'Priority', 'Priority_Specific_Dispatching', 'Profile', 'Pure', 'Queueing_Policy', 'Relative_Deadline', 'Remote_Call_Interface', 'Remote_Types', 'Restrictions', 'Reviewable', 'Shared (Obsolescent)', 'Shared_Passive', 'Storage_Size', 'Storage_Unit (Obsolescent)', 'Suppress', 'System_Name (Obsolescent)', 'Task_Dispatching_Policy', 'Unchecked_Union', 'Unsuppress', 'Volatile', 'Volatile_Components']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'pragma',
+ \ 'info': 'Ada pragma.',
+ \ 'kind': 'p',
+ \ 'icase': 1}]
+endfor
+
+" Section: add GNAT Pragmas {{{3
+"
+if exists ('g:ada_gnat_extensions')
+ for Item in ['Abort_Defer', 'Ada_83', 'Ada_95', 'Ada_05', 'Annotate', 'Ast_Entry', 'C_Pass_By_Copy', 'Comment', 'Common_Object', 'Compile_Time_Warning', 'Complex_Representation', 'Component_Alignment', 'Convention_Identifier', 'CPP_Class', 'CPP_Constructor', 'CPP_Virtual', 'CPP_Vtable', 'Debug', 'Elaboration_Checks', 'Eliminate', 'Export_Exception', 'Export_Function', 'Export_Object', 'Export_Procedure', 'Export_Value', 'Export_Valued_Procedure', 'Extend_System', 'External', 'External_Name_Casing', 'Finalize_Storage_Only', 'Float_Representation', 'Ident', 'Import_Exception', 'Import_Function', 'Import_Object', 'Import_Procedure', 'Import_Valued_Procedure', 'Initialize_Scalars', 'Inline_Always', 'Inline_Generic', 'Interface_Name', 'Interrupt_State', 'Keep_Names', 'License', 'Link_With', 'Linker_Alias', 'Linker_Section', 'Long_Float', 'Machine_Attribute', 'Main_Storage', 'Obsolescent', 'Passive', 'Polling', 'Profile_Warnings', 'Propagate_Exceptions', 'Psect_Object', 'Pure_Function', 'Restriction_Warnings', 'Source_File_Name', 'Source_File_Name_Project', 'Source_Reference', 'Stream_Convert', 'Style_Checks', 'Subtitle', 'Suppress_All', 'Suppress_Exception_Locations', 'Suppress_Initialization', 'Task_Info', 'Task_Name', 'Task_Storage', 'Thread_Body', 'Time_Slice', 'Title', 'Unimplemented_Unit', 'Universal_Data', 'Unreferenced', 'Unreserve_All_Interrupts', 'Use_VADS_Size', 'Validity_Checks', 'Warnings', 'Weak_External']
+ let g:ada#Keywords += [{
+ \ 'word': Item,
+ \ 'menu': 'pragma',
+ \ 'info': 'GNAT pragma.',
+ \ 'kind': 'p',
+ \ 'icase': 1}]
+ endfor
+endif
+" 1}}}
+
+" Section: g:ada#Ctags_Kinds {{{1
+"
+let g:ada#Ctags_Kinds = {
+ \ 'P': ["packspec", "package specifications"],
+ \ 'p': ["package", "packages"],
+ \ 'T': ["typespec", "type specifications"],
+ \ 't': ["type", "types"],
+ \ 'U': ["subspec", "subtype specifications"],
+ \ 'u': ["subtype", "subtypes"],
+ \ 'c': ["component", "record type components"],
+ \ 'l': ["literal", "enum type literals"],
+ \ 'V': ["varspec", "variable specifications"],
+ \ 'v': ["variable", "variables"],
+ \ 'f': ["formal", "generic formal parameters"],
+ \ 'n': ["constant", "constants"],
+ \ 'x': ["exception", "user defined exceptions"],
+ \ 'R': ["subprogspec", "subprogram specifications"],
+ \ 'r': ["subprogram", "subprograms"],
+ \ 'K': ["taskspec", "task specifications"],
+ \ 'k': ["task", "tasks"],
+ \ 'O': ["protectspec", "protected data specifications"],
+ \ 'o': ["protected", "protected data"],
+ \ 'E': ["entryspec", "task/protected data entry specifications"],
+ \ 'e': ["entry", "task/protected data entries"],
+ \ 'b': ["label", "labels"],
+ \ 'i': ["identifier", "loop/declare identifiers"],
+ \ 'a': ["autovar", "automatic variables"],
+ \ 'y': ["annon", "loops and blocks with no identifier"]}
+
+" Section: ada#Word (...) {{{1
+"
+" Extract current Ada word across multiple lines
+" AdaWord ([line, column])\
+"
+function ada#Word (...)
+ if a:0 > 1
+ let l:Line_Nr = a:1
+ let l:Column_Nr = a:2 - 1
+ else
+ let l:Line_Nr = line('.')
+ let l:Column_Nr = col('.') - 1
+ endif
+
+ let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' )
+
+ " Cope with tag searching for items in comments; if we are, don't loop
+ " backwards looking for previous lines
+ if l:Column_Nr > strlen(l:Line)
+ " We were in a comment
+ let l:Line = getline(l:Line_Nr)
+ let l:Search_Prev_Lines = 0
+ else
+ let l:Search_Prev_Lines = 1
+ endif
+
+ " Go backwards until we find a match (Ada ID) that *doesn't* include our
+ " location - i.e., the previous ID. This is because the current 'correct'
+ " match will toggle matching/not matching as we traverse characters
+ " backwards. Thus, we have to find the previous unrelated match, exclude
+ " it, then use the next full match (ours).
+ " Remember to convert vim column 'l:Column_Nr' [1..n] to string offset [0..(n-1)]
+ " ... but start, here, one after the required char.
+ let l:New_Column = l:Column_Nr + 1
+ while 1
+ let l:New_Column = l:New_Column - 1
+ if l:New_Column < 0
+ " Have to include previous l:Line from file
+ let l:Line_Nr = l:Line_Nr - 1
+ if l:Line_Nr < 1 || !l:Search_Prev_Lines
+ " Start of file or matching in a comment
+ let l:Line_Nr = 1
+ let l:New_Column = 0
+ let l:Our_Match = match (l:Line, g:ada#WordRegex )
+ break
+ endif
+ " Get previous l:Line, and prepend it to our search string
+ let l:New_Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' )
+ let l:New_Column = strlen (l:New_Line) - 1
+ let l:Column_Nr = l:Column_Nr + l:New_Column
+ let l:Line = l:New_Line . l:Line
+ endif
+ " Check to see if this is a match excluding 'us'
+ let l:Match_End = l:New_Column +
+ \ matchend (strpart (l:Line,l:New_Column), g:ada#WordRegex ) - 1
+ if l:Match_End >= l:New_Column &&
+ \ l:Match_End < l:Column_Nr
+ " Yes
+ let l:Our_Match = l:Match_End+1 +
+ \ match (strpart (l:Line,l:Match_End+1), g:ada#WordRegex )
+ break
+ endif
+ endwhile
+
+ " Got anything?
+ if l:Our_Match < 0
+ return ''
+ else
+ let l:Line = strpart (l:Line, l:Our_Match)
+ endif
+
+ " Now simply add further lines until the match gets no bigger
+ let l:Match_String = matchstr (l:Line, g:ada#WordRegex)
+ let l:Last_Line = line ('$')
+ let l:Line_Nr = line ('.') + 1
+ while l:Line_Nr <= l:Last_Line
+ let l:Last_Match = l:Match_String
+ let l:Line = l:Line .
+ \ substitute (getline (l:Line_Nr), g:ada#Comment, '', '')
+ let l:Match_String = matchstr (l:Line, g:ada#WordRegex)
+ if l:Match_String == l:Last_Match
+ break
+ endif
+ endwhile
+
+ " Strip whitespace & return
+ return substitute (l:Match_String, '\s\+', '', 'g')
+endfunction ada#Word
+
+" Section: ada#List_Tag (...) {{{1
+"
+" List tags in quickfix window
+"
+function ada#List_Tag (...)
+ if a:0 > 1
+ let l:Tag_Word = ada#Word (a:1, a:2)
+ elseif a:0 > 0
+ let l:Tag_Word = a:1
+ else
+ let l:Tag_Word = ada#Word ()
+ endif
+
+ echo "Searching for" l:Tag_Word
+
+ let l:Pattern = '^' . l:Tag_Word . '$'
+ let l:Tag_List = taglist (l:Pattern)
+ let l:Error_List = []
+ "
+ " add symbols
+ "
+ for Tag_Item in l:Tag_List
+ if l:Tag_Item['kind'] == ''
+ let l:Tag_Item['kind'] = 's'
+ endif
+
+ let l:Error_List += [
+ \ l:Tag_Item['filename'] . '|' .
+ \ l:Tag_Item['cmd'] . '|' .
+ \ l:Tag_Item['kind'] . "\t" .
+ \ l:Tag_Item['name'] ]
+ endfor
+ set errorformat=%f\|%l\|%m
+ cexpr l:Error_List
+ cwindow
+endfunction ada#List_Tag
+
+" Section: ada#Jump_Tag (Word, Mode) {{{1
+"
+" Word tag - include '.' and if Ada make uppercase
+"
+function ada#Jump_Tag (Word, Mode)
+ if a:Word == ''
+ " Get current word
+ let l:Word = ada#Word()
+ if l:Word == ''
+ throw "NOT_FOUND: no identifier found."
+ endif
+ else
+ let l:Word = a:Word
+ endif
+
+ echo "Searching for " . l:Word
+
+ try
+ execute a:Mode l:Word
+ catch /.*:E426:.*/
+ let ignorecase = &ignorecase
+ set ignorecase
+ execute a:Mode l:Word
+ let &ignorecase = ignorecase
+ endtry
+
+ return
+endfunction ada#Jump_Tag
+
+" Section: ada#Insert_Backspace () {{{1
+"
+" Backspace at end of line after auto-inserted commentstring '-- ' wipes it
+"
+function ada#Insert_Backspace ()
+ let l:Line = getline ('.')
+ if col ('.') > strlen (l:Line) &&
+ \ match (l:Line, '-- $') != -1 &&
+ \ match (&comments,'--') != -1
+ return "\<bs>\<bs>\<bs>"
+ else
+ return "\<bs>"
+ endif
+
+ return
+endfunction ada#InsertBackspace
+
+" Section: Insert Completions {{{1
+"
+" Section: ada#User_Complete(findstart, base) {{{2
+"
+" This function is used for the 'complete' option.
+"
+function! ada#User_Complete(findstart, base)
+ if a:findstart == 1
+ "
+ " locate the start of the word
+ "
+ let line = getline ('.')
+ let start = col ('.') - 1
+ while start > 0 && line[start - 1] =~ '\i\|'''
+ let start -= 1
+ endwhile
+ return start
+ else
+ "
+ " look up matches
+ "
+ let l:Pattern = '^' . a:base . '.*$'
+ "
+ " add keywords
+ "
+ for Tag_Item in g:ada#Keywords
+ if l:Tag_Item['word'] =~? l:Pattern
+ if complete_add (l:Tag_Item) == 0
+ return []
+ endif
+ if complete_check ()
+ return []
+ endif
+ endif
+ endfor
+ return []
+ endif
+endfunction ada#User_Complete
+
+" Section: ada#Completion (cmd) {{{2
+"
+" Word completion (^N/^R/^X^]) - force '.' inclusion
+function ada#Completion (cmd)
+ set iskeyword+=46
+ return a:cmd . "\<C-R>=ada#Completion_End ()\<CR>"
+endfunction ada#Completion
+
+" Section: ada#Completion_End () {{{2
+"
+function ada#Completion_End ()
+ set iskeyword-=46
+ return ''
+endfunction ada#Completion_End
+
+" Section: ada#Create_Tags {{{1
+"
+function ada#Create_Tags (option)
+ if a:option == 'file'
+ let l:Filename = fnamemodify (bufname ('%'), ':p')
+ elseif a:option == 'dir'
+ let l:Filename =
+ \ fnamemodify (bufname ('%'), ':p:h') . "*.ada " .
+ \ fnamemodify (bufname ('%'), ':p:h') . "*.adb " .
+ \ fnamemodify (bufname ('%'), ':p:h') . "*.ads"
+ else
+ let l:Filename = a:option
+ endif
+ execute '!ctags --excmd=number ' . l:Filename
+endfunction ada#Create_Tags
+
+" Section: ada#Switch_Session {{{1
+"
+function ada#Switch_Session (New_Session)
+ "
+ " you should not save to much date into the seession since they will
+ " be sourced
+ "
+ let l:sessionoptions=&sessionoptions
+
+ try
+ set sessionoptions=buffers,curdir,folds,globals,resize,slash,tabpages,tabpages,unix,winpos,winsize
+
+ if a:New_Session != v:this_session
+ "
+ " We actually got a new session - otherwise there
+ " is nothing to do.
+ "
+ if strlen (v:this_session) > 0
+ execute 'mksession! ' . v:this_session
+ endif
+
+ let v:this_session = a:New_Session
+
+ "if filereadable (v:this_session)
+ "execute 'source ' . v:this_session
+ "endif
+
+ augroup ada_session
+ autocmd!
+ autocmd VimLeavePre * execute 'mksession! ' . v:this_session
+ augroup END
+
+ "if exists ("g:Tlist_Auto_Open") && g:Tlist_Auto_Open
+ "TlistOpen
+ "endif
+
+ endif
+ finally
+ let &sessionoptions=l:sessionoptions
+ endtry
+
+ return
+endfunction ada#Switch_Session
+
+" Section: GNAT Pretty Printer folding {{{1
+"
+if exists('g:ada_folding') && g:ada_folding[0] == 'g'
+ "
+ " Lines consisting only of ')' ';' are due to a gnat pretty bug and
+ " have the same level as the line above (can't happen in the first
+ " line).
+ "
+ let s:Fold_Collate = '^\([;)]*$\|'
+
+ "
+ " some lone statements are folded with the line above
+ "
+ if stridx (g:ada_folding, 'i') >= 0
+ let s:Fold_Collate .= '\s\+\<is\>$\|'
+ endif
+ if stridx (g:ada_folding, 'b') >= 0
+ let s:Fold_Collate .= '\s\+\<begin\>$\|'
+ endif
+ if stridx (g:ada_folding, 'p') >= 0
+ let s:Fold_Collate .= '\s\+\<private\>$\|'
+ endif
+ if stridx (g:ada_folding, 'x') >= 0
+ let s:Fold_Collate .= '\s\+\<exception\>$\|'
+ endif
+
+ " We also handle empty lines and
+ " comments here.
+ let s:Fold_Collate .= '--\)'
+
+ function ada#Pretty_Print_Folding (Line) " {{{2
+ let l:Text = getline (a:Line)
+
+ if l:Text =~ s:Fold_Collate
+ "
+ " fold with line above
+ "
+ let l:Level = "="
+ elseif l:Text =~ '^\s\+('
+ "
+ " gnat outdents a line which stards with a ( by one characters so
+ " that parameters which follow are aligned.
+ "
+ let l:Level = (indent (a:Line) + 1) / &shiftwidth
+ else
+ let l:Level = indent (a:Line) / &shiftwidth
+ endif
+
+ return l:Level
+ endfunction ada#Pretty_Print_Folding " }}}2
+endif
+
+" Section: Options and Menus {{{1
+"
+" Section: ada#Switch_Syntax_Options {{{2
+"
+function ada#Switch_Syntax_Option (option)
+ syntax off
+ if exists ('g:ada_' . a:option)
+ unlet g:ada_{a:option}
+ echo a:option . 'now off'
+ else
+ let g:ada_{a:option}=1
+ echo a:option . 'now on'
+ endif
+ syntax on
+endfunction ada#Switch_Syntax_Option
+
+" Section: ada#Map_Menu {{{2
+"
+function ada#Map_Menu (Text, Keys, Command)
+ if a:Keys[0] == ':'
+ execute
+ \ "50amenu " .
+ \ "Ada." . escape(a:Text, ' ') .
+ \ "<Tab>" . a:Keys .
+ \ " :" . a:Command . "<CR>"
+ execute
+ \ "command -buffer " .
+ \ a:Keys[1:] .
+ \" :" . a:Command . "<CR>"
+ elseif a:Keys[0] == '<'
+ execute
+ \ "50amenu " .
+ \ "Ada." . escape(a:Text, ' ') .
+ \ "<Tab>" . a:Keys .
+ \ " :" . a:Command . "<CR>"
+ execute
+ \ "nnoremap <buffer> " .
+ \ a:Keys .
+ \" :" . a:Command . "<CR>"
+ execute
+ \ "inoremap <buffer> " .
+ \ a:Keys .
+ \" <C-O>:" . a:Command . "<CR>"
+ else
+ if exists("g:mapleader")
+ let l:leader = g:mapleader
+ else
+ let l:leader = '\'
+ endif
+ execute
+ \ "50amenu " .
+ \ "Ada." . escape(a:Text, ' ') .
+ \ "<Tab>" . escape(l:leader . "a" . a:Keys , '\') .
+ \ " :" . a:Command . "<CR>"
+ execute
+ \ "nnoremap <buffer>" .
+ \ " <Leader>a" . a:Keys .
+ \" :" . a:Command
+ execute
+ \ "inoremap <buffer>" .
+ \ " <Leader>a" . a:Keys .
+ \" <C-O>:" . a:Command
+ endif
+ return
+endfunction
+
+" Section: ada#Map_Popup {{{2
+"
+function ada#Map_Popup (Text, Keys, Command)
+ if exists("g:mapleader")
+ let l:leader = g:mapleader
+ else
+ let l:leader = '\'
+ endif
+ execute
+ \ "50amenu " .
+ \ "PopUp." . escape(a:Text, ' ') .
+ \ "<Tab>" . escape(l:leader . "a" . a:Keys , '\') .
+ \ " :" . a:Command . "<CR>"
+
+ call ada#Map_Menu (a:Text, a:Keys, a:Command)
+ return
+endfunction ada#Map_Popup
+
+" }}}1
+
+lockvar g:ada#WordRegex
+lockvar g:ada#DotWordRegex
+lockvar g:ada#Comment
+lockvar! g:ada#Keywords
+lockvar! g:ada#Ctags_Kinds
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" vim: foldmethod=marker
diff --git a/runtime/autoload/adacomplete.vim b/runtime/autoload/adacomplete.vim
new file mode 100644
index 0000000..d7bba93
--- /dev/null
+++ b/runtime/autoload/adacomplete.vim
@@ -0,0 +1,109 @@
+"------------------------------------------------------------------------------
+" Description: Vim Ada omnicompletion file
+" Language: Ada (2005)
+" $Id: adacomplete.vim 887 2008-07-08 14:29:01Z krischik $
+" Maintainer: Martin Krischik
+" $Author: krischik $
+" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" Version: 4.6
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/adacomplete.vim $
+" History: 24.05.2006 MK Unified Headers
+" 26.05.2006 MK improved search for begin of word.
+" 16.07.2006 MK Ada-Mode as vim-ball
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 05.11.2006 MK Bram suggested not to use include protection for
+" autoload
+" 05.11.2006 MK Bram suggested against using setlocal omnifunc
+" 05.11.2006 MK Bram suggested to save on spaces
+" Help Page: ft-ada-omni
+"------------------------------------------------------------------------------
+
+if version < 700
+ finish
+endif
+
+" Section: adacomplete#Complete () {{{1
+"
+" This function is used for the 'omnifunc' option.
+"
+function! adacomplete#Complete (findstart, base)
+ if a:findstart == 1
+ return ada#User_Complete (a:findstart, a:base)
+ else
+ "
+ " look up matches
+ "
+ if exists ("g:ada_omni_with_keywords")
+ call ada#User_Complete (a:findstart, a:base)
+ endif
+ "
+ " search tag file for matches
+ "
+ let l:Pattern = '^' . a:base . '.*$'
+ let l:Tag_List = taglist (l:Pattern)
+ "
+ " add symbols
+ "
+ for Tag_Item in l:Tag_List
+ if l:Tag_Item['kind'] == ''
+ "
+ " Tag created by gnat xref
+ "
+ let l:Match_Item = {
+ \ 'word': l:Tag_Item['name'],
+ \ 'menu': l:Tag_Item['filename'],
+ \ 'info': "Symbol from file " . l:Tag_Item['filename'] . " line " . l:Tag_Item['cmd'],
+ \ 'kind': 's',
+ \ 'icase': 1}
+ else
+ "
+ " Tag created by ctags
+ "
+ let l:Info = 'Symbol : ' . l:Tag_Item['name'] . "\n"
+ let l:Info .= 'Of type : ' . g:ada#Ctags_Kinds[l:Tag_Item['kind']][1] . "\n"
+ let l:Info .= 'Defined in File : ' . l:Tag_Item['filename'] . "\n"
+
+ if has_key( l:Tag_Item, 'package')
+ let l:Info .= 'Package : ' . l:Tag_Item['package'] . "\n"
+ let l:Menu = l:Tag_Item['package']
+ elseif has_key( l:Tag_Item, 'separate')
+ let l:Info .= 'Separate from Package : ' . l:Tag_Item['separate'] . "\n"
+ let l:Menu = l:Tag_Item['separate']
+ elseif has_key( l:Tag_Item, 'packspec')
+ let l:Info .= 'Package Specification : ' . l:Tag_Item['packspec'] . "\n"
+ let l:Menu = l:Tag_Item['packspec']
+ elseif has_key( l:Tag_Item, 'type')
+ let l:Info .= 'Datetype : ' . l:Tag_Item['type'] . "\n"
+ let l:Menu = l:Tag_Item['type']
+ else
+ let l:Menu = l:Tag_Item['filename']
+ endif
+
+ let l:Match_Item = {
+ \ 'word': l:Tag_Item['name'],
+ \ 'menu': l:Menu,
+ \ 'info': l:Info,
+ \ 'kind': l:Tag_Item['kind'],
+ \ 'icase': 1}
+ endif
+ if complete_add (l:Match_Item) == 0
+ return []
+ endif
+ if complete_check ()
+ return []
+ endif
+ endfor
+ return []
+ endif
+endfunction adacomplete#Complete
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" vim: foldmethod=marker
diff --git a/runtime/autoload/bitbake.vim b/runtime/autoload/bitbake.vim
new file mode 100644
index 0000000..bb3fc5c
--- /dev/null
+++ b/runtime/autoload/bitbake.vim
@@ -0,0 +1,95 @@
+" Support for bitbake indenting, see runtime/indent/bitbake.vim
+
+function s:is_bb_python_func_def(lnum)
+ let stack = synstack(a:lnum, 1)
+ if len(stack) == 0
+ return 0
+ endif
+
+ return synIDattr(stack[0], "name") == "bbPyFuncDef"
+endfunction
+
+function bitbake#Indent(lnum)
+ if !has('syntax_items')
+ return -1
+ endif
+
+ let stack = synstack(a:lnum, 1)
+ if len(stack) == 0
+ return -1
+ endif
+
+ let name = synIDattr(stack[0], "name")
+
+ " TODO: support different styles of indentation for assignments. For now,
+ " we only support like this:
+ " VAR = " \
+ " value1 \
+ " value2 \
+ " "
+ "
+ " i.e. each value indented by shiftwidth(), with the final quote " completely unindented.
+ if name == "bbVarValue"
+ " Quote handling is tricky. kernel.bbclass has this line for instance:
+ " EXTRA_OEMAKE = " HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}" " HOSTCPP="${BUILD_CPP}""
+ " Instead of trying to handle crazy cases like that, just assume that a
+ " double-quote on a line by itself (following an assignment) means the
+ " user is closing the assignment, and de-dent.
+ if getline(a:lnum) =~ '^\s*"$'
+ return 0
+ endif
+
+ let prevstack = synstack(a:lnum - 1, 1)
+ if len(prevstack) == 0
+ return -1
+ endif
+
+ let prevname = synIDattr(prevstack[0], "name")
+
+ " Only indent if there was actually a continuation character on
+ " the previous line, to avoid misleading indentation.
+ let prevlinelastchar = synIDattr(synID(a:lnum - 1, col([a:lnum - 1, "$"]) - 1, 1), "name")
+ let prev_continued = prevlinelastchar == "bbContinue"
+
+ " Did the previous line introduce an assignment?
+ if index(["bbVarDef", "bbVarFlagDef"], prevname) != -1
+ if prev_continued
+ return shiftwidth()
+ endif
+ endif
+
+ if !prev_continued
+ return 0
+ endif
+
+ " Autoindent can take it from here
+ return -1
+ endif
+
+ if index(["bbPyDefRegion", "bbPyFuncRegion"], name) != -1
+ let ret = python#GetIndent(a:lnum, function('s:is_bb_python_func_def'))
+ " Should normally always be indented by at least one shiftwidth; but allow
+ " return of -1 (defer to autoindent) or -2 (force indent to 0)
+ if ret == 0
+ return shiftwidth()
+ elseif ret == -2
+ return 0
+ endif
+ return ret
+ endif
+
+ " TODO: GetShIndent doesn't detect tasks prepended with 'fakeroot'
+ " Need to submit a patch upstream to Vim to provide an extension point.
+ " Unlike the Python indenter, the Sh indenter is way too large to copy and
+ " modify here.
+ if name == "bbShFuncRegion"
+ return GetShIndent()
+ endif
+
+ " TODO:
+ " + heuristics for de-denting out of a bbPyDefRegion? e.g. when the user
+ " types an obvious BB keyword like addhandler or addtask, or starts
+ " writing a shell task. Maybe too hard to implement...
+
+ return -1
+endfunction
diff --git a/runtime/autoload/ccomplete.vim b/runtime/autoload/ccomplete.vim
new file mode 100644
index 0000000..3bddba7
--- /dev/null
+++ b/runtime/autoload/ccomplete.vim
@@ -0,0 +1,693 @@
+vim9script noclear
+
+# Vim completion script
+# Language: C
+# Maintainer: Bram Moolenaar <Bram@vim.org>
+# Rewritten in Vim9 script by github user lacygoill
+# Last Change: 2022 Jan 31
+
+var prepended: string
+var grepCache: dict<list<dict<any>>>
+
+# This function is used for the 'omnifunc' option.
+export def Complete(findstart: bool, abase: string): any # {{{1
+ if findstart
+ # Locate the start of the item, including ".", "->" and "[...]".
+ var line: string = getline('.')
+ var start: number = charcol('.') - 1
+ var lastword: number = -1
+ while start > 0
+ if line[start - 1] =~ '\w'
+ --start
+ elseif line[start - 1] =~ '\.'
+ if lastword == -1
+ lastword = start
+ endif
+ --start
+ elseif start > 1 && line[start - 2] == '-'
+ && line[start - 1] == '>'
+ if lastword == -1
+ lastword = start
+ endif
+ start -= 2
+ elseif line[start - 1] == ']'
+ # Skip over [...].
+ var n: number = 0
+ --start
+ while start > 0
+ --start
+ if line[start] == '['
+ if n == 0
+ break
+ endif
+ --n
+ elseif line[start] == ']' # nested []
+ ++n
+ endif
+ endwhile
+ else
+ break
+ endif
+ endwhile
+
+ # Return the column of the last word, which is going to be changed.
+ # Remember the text that comes before it in prepended.
+ if lastword == -1
+ prepended = ''
+ return byteidx(line, start)
+ endif
+ prepended = line[start : lastword - 1]
+ return byteidx(line, lastword)
+ endif
+
+ # Return list of matches.
+
+ var base: string = prepended .. abase
+
+ # Don't do anything for an empty base, would result in all the tags in the
+ # tags file.
+ if base == ''
+ return []
+ endif
+
+ # init cache for vimgrep to empty
+ grepCache = {}
+
+ # 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.
+ var items: list<string>
+ var s: number = 0
+ var arrays: number = 0
+ while 1
+ var e: number = base->charidx(match(base, '\.\|->\|\[', s))
+ if e < 0
+ if s == 0 || base[s - 1] != ']'
+ items->add(base[s :])
+ endif
+ break
+ endif
+ if s == 0 || base[s - 1] != ']'
+ items->add(base[s : e - 1])
+ endif
+ if base[e] == '.'
+ # skip over '.'
+ s = e + 1
+ elseif base[e] == '-'
+ # skip over '->'
+ s = e + 2
+ else
+ # Skip over [...].
+ var n: number = 0
+ s = e
+ ++e
+ while e < strcharlen(base)
+ if base[e] == ']'
+ if n == 0
+ break
+ endif
+ --n
+ elseif base[e] == '[' # nested [...]
+ ++n
+ endif
+ ++e
+ endwhile
+ ++e
+ items->add(base[s : e - 1])
+ ++arrays
+ s = e
+ endif
+ endwhile
+
+ # Find the variable items[0].
+ # 1. in current function (like with "gd")
+ # 2. in tags file(s) (like with ":tag")
+ # 3. in current file (like with "gD")
+ var res: list<dict<any>>
+ if items[0]->searchdecl(false, true) == 0
+ # Found, now figure out the type.
+ # TODO: join previous line if it makes sense
+ var line: string = getline('.')
+ var col: number = charcol('.')
+ if line[: col - 1]->stridx(';') >= 0
+ # Handle multiple declarations on the same line.
+ var col2: number = col - 1
+ while line[col2] != ';'
+ --col2
+ endwhile
+ line = line[col2 + 1 :]
+ col -= col2
+ endif
+ if line[: col - 1]->stridx(',') >= 0
+ # Handle multiple declarations on the same line in a function
+ # declaration.
+ var col2: number = col - 1
+ while line[col2] != ','
+ --col2
+ endwhile
+ if line[col2 + 1 : col - 1] =~ ' *[^ ][^ ]* *[^ ]'
+ line = line[col2 + 1 :]
+ col -= col2
+ endif
+ endif
+ if len(items) == 1
+ # Completing one word and it's a local variable: May add '[', '.' or
+ # '->'.
+ var match: string = items[0]
+ var kind: string = 'v'
+ if match(line, '\<' .. match .. '\s*\[') > 0
+ match ..= '['
+ else
+ res = line[: col - 1]->Nextitem([''], 0, true)
+ if len(res) > 0
+ # There are members, thus add "." or "->".
+ if match(line, '\*[ \t(]*' .. match .. '\>') > 0
+ match ..= '->'
+ else
+ match ..= '.'
+ endif
+ endif
+ endif
+ 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
+ var match: string = items[0]
+ var kind: string = 'v'
+ var tagline: string = "\t/^" .. line .. '$/'
+ res = [{match: match, tagline: tagline, kind: kind, info: line}]
+ else
+ # Completing "var.", "var.something", etc.
+ res = line[: col - 1]->Nextitem(items[1 :], 0, true)
+ endif
+ endif
+
+ if len(items) == 1 || len(items) == arrays + 1
+ # Only one part, no "." or "->": complete from tags file.
+ var tags: list<dict<any>>
+ if len(items) == 1
+ tags = taglist('^' .. base)
+ else
+ tags = taglist('^' .. items[0] .. '$')
+ endif
+
+ tags
+ # Remove members, these can't appear without something in front.
+ ->filter((_, v: dict<any>): bool =>
+ v->has_key('kind') ? v.kind != 'm' : true)
+ # Remove static matches in other files.
+ ->filter((_, v: dict<any>): bool =>
+ !v->has_key('static')
+ || !v['static']
+ || bufnr('%') == bufnr(v['filename']))
+
+ res = res->extend(tags->map((_, v: dict<any>) => Tag2item(v)))
+ endif
+
+ if len(res) == 0
+ # Find the variable in the tags file(s)
+ var diclist: list<dict<any>> = taglist('^' .. items[0] .. '$')
+ # Remove members, these can't appear without something in front.
+ ->filter((_, v: dict<string>): bool =>
+ v->has_key('kind') ? v.kind != 'm' : true)
+
+ res = []
+ for i: number in len(diclist)->range()
+ # New ctags has the "typeref" field. Patched version has "typename".
+ if diclist[i]->has_key('typename')
+ res = res->extend(diclist[i]['typename']->StructMembers(items[1 :], true))
+ elseif diclist[i]->has_key('typeref')
+ res = res->extend(diclist[i]['typeref']->StructMembers(items[1 :], true))
+ endif
+
+ # For a variable use the command, which must be a search pattern that
+ # shows the declaration of the variable.
+ if diclist[i]['kind'] == 'v'
+ var line: string = diclist[i]['cmd']
+ if line[: 1] == '/^'
+ var col: number = line->charidx(match(line, '\<' .. items[0] .. '\>'))
+ res = res->extend(line[2 : col - 1]->Nextitem(items[1 :], 0, true))
+ endif
+ endif
+ endfor
+ endif
+
+ if len(res) == 0 && items[0]->searchdecl(true) == 0
+ # Found, now figure out the type.
+ # TODO: join previous line if it makes sense
+ var line: string = getline('.')
+ var col: number = charcol('.')
+ res = line[: col - 1]->Nextitem(items[1 :], 0, true)
+ endif
+
+ # If the last item(s) are [...] they need to be added to the matches.
+ var last: number = len(items) - 1
+ var brackets: string = ''
+ while last >= 0
+ if items[last][0] != '['
+ break
+ endif
+ brackets = items[last] .. brackets
+ --last
+ endwhile
+
+ return res->map((_, v: dict<any>): dict<string> => Tagline2item(v, brackets))
+enddef
+
+def GetAddition( # {{{1
+ line: string,
+ match: string,
+ memarg: list<dict<any>>,
+ bracket: bool): string
+ # Guess if the item is an array.
+ if bracket && match(line, match .. '\s*\[') > 0
+ return '['
+ endif
+
+ # Check if the item has members.
+ if SearchMembers(memarg, [''], false)->len() > 0
+ # If there is a '*' before the name use "->".
+ if match(line, '\*[ \t(]*' .. match .. '\>') > 0
+ return '->'
+ else
+ return '.'
+ endif
+ endif
+ return ''
+enddef
+
+def Tag2item(val: dict<any>): dict<any> # {{{1
+# Turn the tag info "val" into an item for completion.
+# "val" is is an item in the list returned by taglist().
+# If it is a variable we may add "." or "->". Don't do it for other types,
+# such as a typedef, by not including the info that GetAddition() uses.
+ var res: dict<any> = {match: val['name']}
+
+ res['extra'] = Tagcmd2extra(val['cmd'], val['name'], val['filename'])
+
+ var s: string = Dict2info(val)
+ if s != ''
+ res['info'] = s
+ endif
+
+ res['tagline'] = ''
+ if val->has_key('kind')
+ var kind: string = val['kind']
+ res['kind'] = kind
+ if kind == 'v'
+ res['tagline'] = "\t" .. val['cmd']
+ res['dict'] = val
+ elseif kind == 'f'
+ res['match'] = val['name'] .. '('
+ endif
+ endif
+
+ return res
+enddef
+
+def Dict2info(dict: dict<any>): string # {{{1
+# Use all the items in dictionary for the "info" entry.
+ var info: string = ''
+ for k: string in dict->keys()->sort()
+ info ..= k .. repeat(' ', 10 - strlen(k))
+ if k == 'cmd'
+ info ..= dict['cmd']
+ ->matchstr('/^\s*\zs.*\ze$/')
+ ->substitute('\\\(.\)', '\1', 'g')
+ else
+ var dictk: any = dict[k]
+ if typename(dictk) != 'string'
+ info ..= dictk->string()
+ else
+ info ..= dictk
+ endif
+ endif
+ info ..= "\n"
+ endfor
+ return info
+enddef
+
+def ParseTagline(line: string): dict<any> # {{{1
+# Parse a tag line and return a dictionary with items like taglist()
+ var l: list<string> = split(line, "\t")
+ var d: dict<any>
+ if len(l) >= 3
+ d['name'] = l[0]
+ d['filename'] = l[1]
+ d['cmd'] = l[2]
+ var n: number = 2
+ if l[2] =~ '^/'
+ # Find end of cmd, it may contain Tabs.
+ while n < len(l) && l[n] !~ '/;"$'
+ ++n
+ d['cmd'] ..= ' ' .. l[n]
+ endwhile
+ endif
+ for i: number in range(n + 1, len(l) - 1)
+ if l[i] == 'file:'
+ d['static'] = 1
+ elseif l[i] !~ ':'
+ d['kind'] = l[i]
+ else
+ d[l[i]->matchstr('[^:]*')] = l[i]->matchstr(':\zs.*')
+ endif
+ endfor
+ endif
+
+ return d
+enddef
+
+def Tagline2item(val: dict<any>, brackets: string): dict<string> # {{{1
+# Turn a match item "val" into an item for completion.
+# "val['match']" is the matching item.
+# "val['tagline']" is the tagline in which the last part was found.
+ var line: string = val['tagline']
+ var add: string = GetAddition(line, val['match'], [val], brackets == '')
+ var res: dict<string> = {word: val['match'] .. brackets .. add}
+
+ if val->has_key('info')
+ # Use info from Tag2item().
+ res['info'] = val['info']
+ else
+ # Parse the tag line and add each part to the "info" entry.
+ var s: string = ParseTagline(line)->Dict2info()
+ if s != ''
+ res['info'] = s
+ endif
+ endif
+
+ if val->has_key('kind')
+ res['kind'] = val['kind']
+ elseif add == '('
+ res['kind'] = 'f'
+ else
+ var s: string = line->matchstr('\t\(kind:\)\=\zs\S\ze\(\t\|$\)')
+ if s != ''
+ res['kind'] = s
+ endif
+ endif
+
+ if val->has_key('extra')
+ res['menu'] = val['extra']
+ return res
+ endif
+
+ # Isolate the command after the tag and filename.
+ var s: string = line->matchstr('[^\t]*\t[^\t]*\t\zs\(/^.*$/\|[^\t]*\)\ze\(;"\t\|\t\|$\)')
+ if s != ''
+ res['menu'] = s->Tagcmd2extra(val['match'], line->matchstr('[^\t]*\t\zs[^\t]*\ze\t'))
+ endif
+ return res
+enddef
+
+def Tagcmd2extra( # {{{1
+ cmd: string,
+ name: string,
+ fname: string): string
+# Turn a command from a tag line to something that is useful in the menu
+ var x: string
+ if cmd =~ '^/^'
+ # The command is a search command, useful to see what it is.
+ x = cmd
+ ->matchstr('^/^\s*\zs.*\ze$/')
+ ->substitute('\<' .. name .. '\>', '@@', '')
+ ->substitute('\\\(.\)', '\1', 'g')
+ .. ' - ' .. fname
+ elseif cmd =~ '^\d*$'
+ # The command is a line number, the file name is more useful.
+ x = fname .. ' - ' .. cmd
+ else
+ # Not recognized, use command and file name.
+ x = cmd .. ' - ' .. fname
+ endif
+ return x
+enddef
+
+def Nextitem( # {{{1
+ lead: string,
+ items: list<string>,
+ depth: number,
+ all: bool): list<dict<string>>
+# Find composing type in "lead" and match items[0] with it.
+# Repeat this recursively for items[1], if it's there.
+# When resolving typedefs "depth" is used to avoid infinite recursion.
+# Return the list of matches.
+
+ # Use the text up to the variable name and split it in tokens.
+ var tokens: list<string> = split(lead, '\s\+\|\<')
+
+ # Try to recognize the type of the variable. This is rough guessing...
+ var res: list<dict<string>>
+ for tidx: number in len(tokens)->range()
+
+ # Skip tokens starting with a non-ID character.
+ if tokens[tidx] !~ '^\h'
+ continue
+ endif
+
+ # Recognize "struct foobar" and "union foobar".
+ # Also do "class foobar" when it's C++ after all (doesn't work very well
+ # though).
+ if (tokens[tidx] == 'struct'
+ || tokens[tidx] == 'union'
+ || tokens[tidx] == 'class')
+ && tidx + 1 < len(tokens)
+ res = StructMembers(tokens[tidx] .. ':' .. tokens[tidx + 1], items, all)
+ break
+ endif
+
+ # TODO: add more reserved words
+ if ['int', 'short', 'char', 'float',
+ 'double', 'static', 'unsigned', 'extern']->index(tokens[tidx]) >= 0
+ continue
+ endif
+
+ # Use the tags file to find out if this is a typedef.
+ var diclist: list<dict<any>> = taglist('^' .. tokens[tidx] .. '$')
+ for tagidx: number in len(diclist)->range()
+ var item: dict<any> = diclist[tagidx]
+
+ # New ctags has the "typeref" field. Patched version has "typename".
+ if item->has_key('typeref')
+ res = res->extend(item['typeref']->StructMembers(items, all))
+ continue
+ endif
+ if item->has_key('typename')
+ res = res->extend(item['typename']->StructMembers(items, all))
+ continue
+ endif
+
+ # Only handle typedefs here.
+ if item['kind'] != 't'
+ continue
+ endif
+
+ # Skip matches local to another file.
+ if item->has_key('static') && item['static']
+ && bufnr('%') != bufnr(item['filename'])
+ continue
+ endif
+
+ # For old ctags we recognize "typedef struct aaa" and
+ # "typedef union bbb" in the tags file command.
+ var cmd: string = item['cmd']
+ var ei: number = cmd->charidx(matchend(cmd, 'typedef\s\+'))
+ if ei > 1
+ var cmdtokens: list<string> = cmd[ei :]->split('\s\+\|\<')
+ if len(cmdtokens) > 1
+ if cmdtokens[0] == 'struct'
+ || cmdtokens[0] == 'union'
+ || cmdtokens[0] == 'class'
+ var name: string = ''
+ # Use the first identifier after the "struct" or "union"
+ for ti: number in (len(cmdtokens) - 1)->range()
+ if cmdtokens[ti] =~ '^\w'
+ name = cmdtokens[ti]
+ break
+ endif
+ endfor
+ if name != ''
+ res = res->extend(StructMembers(cmdtokens[0] .. ':' .. name, items, all))
+ endif
+ elseif depth < 10
+ # Could be "typedef other_T some_T".
+ res = res->extend(cmdtokens[0]->Nextitem(items, depth + 1, all))
+ endif
+ endif
+ endif
+ endfor
+ if len(res) > 0
+ break
+ endif
+ endfor
+
+ return res
+enddef
+
+def StructMembers( # {{{1
+ atypename: string,
+ items: list<string>,
+ all: bool): list<dict<string>>
+
+# Search for members of structure "typename" in tags files.
+# Return a list with resulting matches.
+# Each match is a dictionary with "match" and "tagline" entries.
+# When "all" is true find all, otherwise just return 1 if there is any member.
+
+ # Todo: What about local structures?
+ var fnames: string = tagfiles()
+ ->map((_, v: string) => escape(v, ' \#%'))
+ ->join()
+ if fnames == ''
+ return []
+ endif
+
+ var typename: string = atypename
+ var qflist: list<dict<any>>
+ var cached: number = 0
+ var n: string
+ if !all
+ n = '1' # stop at first found match
+ if grepCache->has_key(typename)
+ qflist = grepCache[typename]
+ cached = 1
+ endif
+ else
+ n = ''
+ endif
+ if !cached
+ while 1
+ execute 'silent! keepjumps noautocmd '
+ .. n .. 'vimgrep ' .. '/\t' .. typename .. '\(\t\|$\)/j '
+ .. fnames
+
+ qflist = getqflist()
+ if len(qflist) > 0 || match(typename, '::') < 0
+ break
+ endif
+ # No match for "struct:context::name", remove "context::" and try again.
+ typename = typename->substitute(':[^:]*::', ':', '')
+ endwhile
+
+ if !all
+ # Store the result to be able to use it again later.
+ grepCache[typename] = qflist
+ endif
+ endif
+
+ # Skip over [...] items
+ var idx: number = 0
+ var target: string
+ while 1
+ if idx >= len(items)
+ target = '' # No further items, matching all members
+ break
+ endif
+ if items[idx][0] != '['
+ target = items[idx]
+ break
+ endif
+ ++idx
+ endwhile
+ # Put matching members in matches[].
+ var matches: list<dict<string>>
+ for l: dict<any> in qflist
+ var memb: string = l['text']->matchstr('[^\t]*')
+ if memb =~ '^' .. target
+ # Skip matches local to another file.
+ if match(l['text'], "\tfile:") < 0
+ || bufnr('%') == l['text']->matchstr('\t\zs[^\t]*')->bufnr()
+ var item: dict<string> = {match: memb, tagline: l['text']}
+
+ # Add the kind of item.
+ var s: string = l['text']->matchstr('\t\(kind:\)\=\zs\S\ze\(\t\|$\)')
+ if s != ''
+ item['kind'] = s
+ if s == 'f'
+ item['match'] = memb .. '('
+ endif
+ endif
+
+ matches->add(item)
+ endif
+ endif
+ endfor
+
+ if len(matches) > 0
+ # Skip over next [...] items
+ ++idx
+ while 1
+ if idx >= len(items)
+ return matches # No further items, return the result.
+ endif
+ if items[idx][0] != '['
+ break
+ endif
+ ++idx
+ endwhile
+
+ # More items following. For each of the possible members find the
+ # matching following members.
+ return SearchMembers(matches, items[idx :], all)
+ endif
+
+ # Failed to find anything.
+ return []
+enddef
+
+def SearchMembers( # {{{1
+ matches: list<dict<any>>,
+ items: list<string>,
+ all: bool): list<dict<string>>
+
+# For matching members, find matches for following items.
+# When "all" is true find all, otherwise just return 1 if there is any member.
+ var res: list<dict<string>>
+ for i: number in len(matches)->range()
+ var typename: string = ''
+ var line: string
+ if matches[i]->has_key('dict')
+ if matches[i]['dict']->has_key('typename')
+ typename = matches[i]['dict']['typename']
+ elseif matches[i]['dict']->has_key('typeref')
+ typename = matches[i]['dict']['typeref']
+ endif
+ line = "\t" .. matches[i]['dict']['cmd']
+ else
+ line = matches[i]['tagline']
+ var eb: number = matchend(line, '\ttypename:')
+ var e: number = charidx(line, eb)
+ if e < 0
+ eb = matchend(line, '\ttyperef:')
+ e = charidx(line, eb)
+ endif
+ if e > 0
+ # Use typename field
+ typename = line->matchstr('[^\t]*', eb)
+ endif
+ endif
+
+ if typename != ''
+ res = res->extend(StructMembers(typename, items, all))
+ else
+ # Use the search command (the declaration itself).
+ var sb: number = line->match('\t\zs/^')
+ var s: number = charidx(line, sb)
+ if s > 0
+ var e: number = line
+ ->charidx(match(line, '\<' .. matches[i]['match'] .. '\>', sb))
+ if e > 0
+ res = res->extend(line[s : e - 1]->Nextitem(items, 0, all))
+ endif
+ endif
+ endif
+ if !all && len(res) > 0
+ break
+ endif
+ endfor
+ return res
+enddef
+#}}}1
+
+# vim: noet sw=2 sts=2
diff --git a/runtime/autoload/clojurecomplete.vim b/runtime/autoload/clojurecomplete.vim
new file mode 100644
index 0000000..02262a6
--- /dev/null
+++ b/runtime/autoload/clojurecomplete.vim
@@ -0,0 +1,23 @@
+" Vim completion script
+" Language: Clojure
+" Maintainer: Alex Vear <alex@vear.uk>
+" Former Maintainers: Sung Pae <self@sungpae.com>
+" URL: https://github.com/clojure-vim/clojure.vim
+" License: Vim (see :h license)
+" Last Change: 2022-03-24
+
+" -*- COMPLETION WORDS -*-
+" Generated from https://github.com/clojure-vim/clojure.vim/blob/fd280e33e84c88e97860930557dba3ff80b1a82d/clj/src/vim_clojure_static/generate.clj
+" Clojure version 1.11.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-namespace-maps*","*print-readably*","*read-eval*","*reader-resolver*","*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","Inst","NaN?","PrintWriter-on","StackTraceElement->vec","Throwable->map","abs","accessor","aclone","add-classpath","add-tap","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","any?","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","boolean?","booleans","bound-fn","bound-fn*","bound?","bounded-count","butlast","byte","byte-array","bytes","bytes?","case","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","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","double?","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-cause","ex-data","ex-info","ex-message","extend","extend-protocol","extend-type","extenders","extends?","false","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","halt-when","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","ident?","identical?","identity","if","if-let","if-not","if-some","ifn?","import","in-ns","inc","inc'","indexed?","infinite?","init-proxy","inst-ms","inst-ms*","inst?","instance?","int","int-array","int?","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iteration","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","let*","letfn","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","nat-int?","neg-int?","neg?","new","newline","next","nfirst","nil","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","parse-boolean","parse-double","parse-long","parse-uuid","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop","pop!","pop-thread-bindings","pos-int?","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","qualified-ident?","qualified-keyword?","qualified-symbol?","quot","quote","rand","rand-int","rand-nth","random-sample","random-uuid","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read+string","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","reify*","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-tap","remove-watch","repeat","repeatedly","replace","replicate","require","requiring-resolve","reset!","reset-meta!","reset-vals!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq-to-map-for-destructuring","seq?","seqable?","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","simple-ident?","simple-keyword?","simple-symbol?","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!","swap-vals!","symbol","symbol?","sync","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","tap>","test","the-ns","thread-bound?","throw","time","to-array","to-array-2d","trampoline","transduce","transient","tree-seq","true","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-keys","update-proxy","update-vals","uri?","use","uuid?","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)
+ if a:findstart
+ return searchpos('\<', 'bnW', line('.'))[1] - 1
+ else
+ return { 'words': filter(copy(s:words), 'v:val =~# "\\V\\^' . a:base . '"') }
+ endif
+endfunction
+
+" vim:sts=8:sw=8:ts=8:noet
diff --git a/runtime/autoload/context.vim b/runtime/autoload/context.vim
new file mode 100644
index 0000000..fc59309
--- /dev/null
+++ b/runtime/autoload/context.vim
@@ -0,0 +1,100 @@
+vim9script
+
+# Language: ConTeXt typesetting engine
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2022 Sep 19
+
+# Typesetting {{{
+import autoload './typeset.vim'
+
+export def ConTeXtCmd(path: string): list<string>
+ var cmd = ['mtxrun', '--script', 'context', '--nonstopmode', '--autogenerate']
+ if !empty(get(g:, 'context_extra_options', ''))
+ cmd += g:context_extra_options
+ endif
+ cmd->add(path)
+ return cmd
+enddef
+
+export def Typeset(bufname: string, env = {}, Cmd = ConTeXtCmd): bool
+ return typeset.TypesetBuffer(bufname, Cmd, env, 'ConTeXt')
+enddef
+
+export def JobStatus()
+ typeset.JobStatus('ConTeXt')
+enddef
+
+export def StopJobs()
+ typeset.StopJobs('ConTeXt')
+enddef
+
+export def Log(bufname: string)
+ execute 'edit' typeset.LogPath(bufname)
+enddef
+# }}}
+
+# Completion {{{
+def BinarySearch(base: string, keywords: list<string>): list<string>
+ const pat = '^' .. base
+ const len = len(keywords)
+ var res = []
+ var lft = 0
+ var rgt = len
+
+ # Find the leftmost index matching base
+ while lft < rgt
+ var i = (lft + rgt) / 2
+ if keywords[i] < base
+ lft = i + 1
+ else
+ rgt = i
+ endif
+ endwhile
+
+ while lft < len && keywords[lft] =~ pat
+ add(res, keywords[lft])
+ lft += 1
+ endwhile
+
+ return res
+enddef
+
+var isMetaPostBlock = false
+
+var MP_KEYWORDS: list<string> = []
+var CTX_KEYWORDS: list<string> = []
+
+# Complete only MetaPost keywords in MetaPost blocks, and complete only
+# ConTeXt keywords otherwise.
+export def Complete(findstart: number, base: string): any
+ if findstart == 1
+ if len(synstack(line("."), 1)) > 0 && synIDattr(synstack(line("."), 1)[0], "name") ==# 'contextMPGraphic'
+ isMetaPostBlock = true
+ return match(getline('.'), '\S\+\%' .. col('.') .. 'c')
+ endif
+
+ # Complete only \commands starting with a backslash
+ isMetaPostBlock = false
+ var pos = match(getline('.'), '\\\zs\S\+\%' .. col('.') .. 'c')
+ return (pos == -1) ? -3 : pos
+ endif
+
+ if isMetaPostBlock
+ if empty(MP_KEYWORDS)
+ MP_KEYWORDS = sort(syntaxcomplete#OmniSyntaxList(['mf\w\+', 'mp\w\+']))
+ endif
+ return BinarySearch(base, MP_KEYWORDS)
+ endif
+
+ if empty(CTX_KEYWORDS)
+ CTX_KEYWORDS = sort(syntaxcomplete#OmniSyntaxList([
+ 'context\w\+', 'texAleph', 'texEtex', 'texLuatex', 'texOmega',
+ 'texPdftex', 'texTex', 'texXeTeX'
+ ]))
+ endif
+ return BinarySearch(base, CTX_KEYWORDS)
+enddef
+# }}}
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/autoload/contextcomplete.vim b/runtime/autoload/contextcomplete.vim
new file mode 100644
index 0000000..5b93bb0
--- /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
new file mode 100644
index 0000000..4b673ac
--- /dev/null
+++ b/runtime/autoload/csscomplete.vim
@@ -0,0 +1,742 @@
+" Vim completion script
+" Language: CSS
+" Based on MDN CSS Reference at 2016 Jan <https://developer.mozilla.org/en-US/docs/Web/CSS/Reference>
+" 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: 2021 Sep 21
+
+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")
+
+
+function! csscomplete#CompleteCSS(findstart, base)
+
+ if a:findstart
+ " We need whole line to proper checking
+ let line = getline('.')
+ let start = col('.') - 1
+ let compl_begin = col('.') - 2
+ while start >= 0 && line[start - 1] =~ '\%(\k\|-\)'
+ let start -= 1
+ endwhile
+ let b:compl_context = line[0:compl_begin]
+ return start
+ endif
+
+ " There are few chars important for context:
+ " ^ ; : { } /* */
+ " Where ^ is start of line and /* */ are comment borders
+ " Depending on their relative position to cursor we will know what should
+ " be completed.
+ " 1. if nearest are ^ or { or ; current word is property
+ " 2. if : it is value (with exception of pseudo things)
+ " 3. if } we are outside of css definitions
+ " 4. for comments ignoring is be the easiest but assume they are the same
+ " as 1.
+ " 5. if @ complete at-rule
+ " 6. if ! complete important
+ if exists("b:compl_context")
+ let line = getline('.')
+ let compl_begin = col('.') - 2
+ let b:after = line[compl_begin:]
+ let line = b:compl_context
+ unlet! b:compl_context
+ else
+ let line = a:base
+ let b:after = ''
+ endif
+
+ let res = []
+ let res2 = []
+ let borders = {}
+
+ " Check last occurrence of sequence
+
+ let openbrace = strridx(line, '{')
+ let closebrace = strridx(line, '}')
+ let colon = strridx(line, ':')
+ let semicolon = strridx(line, ';')
+ let opencomm = strridx(line, '/*')
+ let closecomm = strridx(line, '*/')
+ let style = strridx(line, 'style\s*=')
+ let atrule = strridx(line, '@')
+ let exclam = strridx(line, '!')
+
+ if openbrace > -1
+ let borders[openbrace] = "openbrace"
+ endif
+ if closebrace > -1
+ let borders[closebrace] = "closebrace"
+ endif
+ if colon > -1
+ let borders[colon] = "colon"
+ endif
+ if semicolon > -1
+ let borders[semicolon] = "semicolon"
+ endif
+ if opencomm > -1
+ let borders[opencomm] = "opencomm"
+ endif
+ if closecomm > -1
+ let borders[closecomm] = "closecomm"
+ endif
+ if style > -1
+ let borders[style] = "style"
+ endif
+ if atrule > -1
+ let borders[atrule] = "atrule"
+ endif
+ if exclam > -1
+ let borders[exclam] = "exclam"
+ endif
+
+
+ if len(borders) == 0 || borders[max(keys(borders))] =~ '^\%(openbrace\|semicolon\|opencomm\|closecomm\|style\)$'
+ " Complete properties
+
+
+ let entered_property = matchstr(line, '.\{-}\zs[a-zA-Z-]*$')
+
+ for m in s:values
+ if m =~? '^'.entered_property
+ call add(res, m . ':')
+ elseif m =~? entered_property
+ call add(res2, m . ':')
+ endif
+ endfor
+
+ return res + res2
+
+ elseif borders[max(keys(borders))] == 'colon'
+ " Get name of property
+ let prop = tolower(matchstr(line, '\zs[a-zA-Z-]*\ze\s*:[^:]\{-}$'))
+
+ let wide_keywords = ["initial", "inherit", "unset"]
+ let color_values = ["transparent", "rgb(", "rgba(", "hsl(", "hsla(", "#"]
+ let border_style_values = ["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]
+ let border_width_values = ["thin", "thick", "medium"]
+ let list_style_type_values = ["decimal", "decimal-leading-zero", "arabic-indic", "armenian", "upper-armenian", "lower-armenian", "bengali", "cambodian", "khmer", "cjk-decimal", "devanagari", "georgian", "gujarati", "gurmukhi", "hebrew", "kannada", "lao", "malayalam", "mongolian", "myanmar", "oriya", "persian", "lower-roman", "upper-roman", "tamil", "telugu", "thai", "tibetan", "lower-alpha", "lower-latin", "upper-alpha", "upper-latin", "cjk-earthly-branch", "cjk-heavenly-stem", "lower-greek", "hiragana", "hiragana-iroha", "katakana", "katakana-iroha", "disc", "circle", "square", "disclosure-open", "disclosure-closed"]
+ let timing_functions = ["cubic-bezier(", "steps(", "linear", "ease", "ease-in", "ease-in-out", "ease-out", "step-start", "step-end"]
+
+ if prop == 'all'
+ let values = []
+ elseif prop == 'additive-symbols'
+ let values = []
+ elseif prop == 'align-content'
+ let values = ["flex-start", "flex-end", "center", "space-between", "space-around", "stretch"]
+ elseif prop == 'align-items'
+ let values = ["flex-start", "flex-end", "center", "baseline", "stretch"]
+ elseif prop == 'align-self'
+ let values = ["auto", "flex-start", "flex-end", "center", "baseline", "stretch"]
+ elseif prop == 'animation'
+ let values = timing_functions + ["normal", "reverse", "alternate", "alternate-reverse"] + ["none", "forwards", "backwards", "both"] + ["running", "paused"]
+ elseif prop == 'animation-delay'
+ let values = []
+ elseif prop == 'animation-direction'
+ let values = ["normal", "reverse", "alternate", "alternate-reverse"]
+ elseif prop == 'animation-duration'
+ let values = []
+ elseif prop == 'animation-fill-mode'
+ let values = ["none", "forwards", "backwards", "both"]
+ elseif prop == 'animation-iteration-count'
+ let values = []
+ elseif prop == 'animation-name'
+ let values = []
+ elseif prop == 'animation-play-state'
+ let values = ["running", "paused"]
+ elseif prop == 'animation-timing-function'
+ let values = timing_functions
+ elseif prop == 'background-attachment'
+ let values = ["scroll", "fixed"]
+ elseif prop == 'background-color'
+ let values = color_values
+ elseif prop == 'background-image'
+ let values = ["url(", "none"]
+ elseif prop == 'background-position'
+ let vals = matchstr(line, '.*:\s*\zs.*')
+ if vals =~ '^\%([a-zA-Z]\+\)\?$'
+ let values = ["top", "center", "bottom"]
+ elseif vals =~ '^[a-zA-Z]\+\s\+\%([a-zA-Z]\+\)\?$'
+ let values = ["left", "center", "right"]
+ else
+ return []
+ endif
+ elseif prop == 'background-repeat'
+ let values = ["repeat", "repeat-x", "repeat-y", "no-repeat"]
+ elseif prop == 'background-size'
+ let values = ["auto", "contain", "cover"]
+ elseif prop == 'background'
+ let values = ["scroll", "fixed"] + color_values + ["url(", "none"] + ["top", "center", "bottom", "left", "right"] + ["repeat", "repeat-x", "repeat-y", "no-repeat"] + ["auto", "contain", "cover"]
+ elseif prop =~ 'border\%(-top\|-right\|-bottom\|-left\|-block-start\|-block-end\)\?$'
+ let vals = matchstr(line, '.*:\s*\zs.*')
+ if vals =~ '^\%([a-zA-Z0-9.]\+\)\?$'
+ let values = border_width_values
+ elseif vals =~ '^[a-zA-Z0-9.]\+\s\+\%([a-zA-Z]\+\)\?$'
+ let values = border_style_values
+ elseif vals =~ '^[a-zA-Z0-9.]\+\s\+[a-zA-Z]\+\s\+\%([a-zA-Z(]\+\)\?$'
+ let values = color_values
+ else
+ return []
+ endif
+ elseif prop =~ 'border-\%(top\|right\|bottom\|left\|block-start\|block-end\)-color'
+ let values = color_values
+ elseif prop =~ 'border-\%(top\|right\|bottom\|left\|block-start\|block-end\)-style'
+ let values = border_style_values
+ elseif prop =~ 'border-\%(top\|right\|bottom\|left\|block-start\|block-end\)-width'
+ let values = border_width_values
+ elseif prop == 'border-color'
+ let values = color_values
+ elseif prop == 'border-style'
+ let values = border_style_values
+ elseif prop == 'border-width'
+ let values = border_width_values
+ elseif prop == 'bottom'
+ let values = ["auto"]
+ elseif prop == 'box-decoration-break'
+ let values = ["slice", "clone"]
+ elseif prop == 'box-shadow'
+ let values = ["inset"]
+ elseif prop == 'box-sizing'
+ let values = ["border-box", "content-box"]
+ elseif prop =~ 'break-\%(before\|after\)'
+ let values = ["auto", "always", "avoid", "left", "right", "page", "column", "region", "recto", "verso", "avoid-page", "avoid-column", "avoid-region"]
+ elseif prop == 'break-inside'
+ let values = ["auto", "avoid", "avoid-page", "avoid-column", "avoid-region"]
+ elseif prop == 'caption-side'
+ let values = ["top", "bottom"]
+ elseif prop == 'clear'
+ let values = ["none", "left", "right", "both"]
+ elseif prop == 'clip'
+ let values = ["auto", "rect("]
+ elseif prop == 'clip-path'
+ let values = ["fill-box", "stroke-box", "view-box", "none"]
+ elseif prop == 'color'
+ let values = color_values
+ elseif prop == 'columns'
+ let values = []
+ elseif prop == 'column-count'
+ let values = ['auto']
+ elseif prop == 'column-fill'
+ let values = ['auto', 'balance']
+ elseif prop == 'column-rule-color'
+ let values = color_values
+ elseif prop == 'column-rule-style'
+ let values = border_style_values
+ elseif prop == 'column-rule-width'
+ let values = border_width_values
+ elseif prop == 'column-rule'
+ let vals = matchstr(line, '.*:\s*\zs.*')
+ if vals =~ '^\%([a-zA-Z0-9.]\+\)\?$'
+ let values = border_width_values
+ elseif vals =~ '^[a-zA-Z0-9.]\+\s\+\%([a-zA-Z]\+\)\?$'
+ let values = border_style_values
+ elseif vals =~ '^[a-zA-Z0-9.]\+\s\+[a-zA-Z]\+\s\+\%([a-zA-Z(]\+\)\?$'
+ let values = color_values
+ else
+ return []
+ endif
+ elseif prop == 'column-span'
+ let values = ["none", "all"]
+ elseif prop == 'column-width'
+ let values = ["auto"]
+ elseif prop == 'content'
+ let values = ["normal", "attr(", "open-quote", "close-quote", "no-open-quote", "no-close-quote"]
+ elseif prop =~ 'counter-\%(increment\|reset\)$'
+ let values = ["none"]
+ elseif prop =~ 'cue\%(-after\|-before\)\=$'
+ let values = ["url("]
+ elseif prop == 'cursor'
+ let values = ["url(", "auto", "crosshair", "default", "pointer", "move", "e-resize", "ne-resize", "nw-resize", "n-resize", "se-resize", "sw-resize", "s-resize", "w-resize", "text", "wait", "help", "progress"]
+ elseif prop == 'direction'
+ let values = ["ltr", "rtl"]
+ elseif prop == 'display'
+ let values = ["inline", "block", "list-item", "inline-list-item", "run-in", "inline-block", "table", "inline-table", "table-row-group", "table-header-group", "table-footer-group", "table-row", "table-column-group", "table-column", "table-cell", "table-caption", "none", "flex", "inline-flex", "grid", "inline-grid", "ruby", "ruby-base", "ruby-text", "ruby-base-container", "ruby-text-container", "contents"]
+ elseif prop == 'elevation'
+ let values = ["below", "level", "above", "higher", "lower"]
+ elseif prop == 'empty-cells'
+ let values = ["show", "hide"]
+ elseif prop == 'fallback'
+ let values = list_style_type_values
+ elseif prop == 'filter'
+ let values = ["blur(", "brightness(", "contrast(", "drop-shadow(", "grayscale(", "hue-rotate(", "invert(", "opacity(", "sepia(", "saturate("]
+ elseif prop == 'flex-basis'
+ let values = ["auto", "content"]
+ elseif prop == 'flex-flow'
+ let values = ["row", "row-reverse", "column", "column-reverse", "nowrap", "wrap", "wrap-reverse"]
+ elseif prop == 'flex-grow'
+ let values = []
+ elseif prop == 'flex-shrink'
+ let values = []
+ elseif prop == 'flex-wrap'
+ let values = ["nowrap", "wrap", "wrap-reverse"]
+ elseif prop == 'flex'
+ let values = ["nowrap", "wrap", "wrap-reverse"] + ["row", "row-reverse", "column", "column-reverse", "nowrap", "wrap", "wrap-reverse"] + ["auto", "content"]
+ elseif prop == 'float'
+ let values = ["left", "right", "none"]
+ elseif prop == 'font-family'
+ let values = ["sans-serif", "serif", "monospace", "cursive", "fantasy"]
+ elseif prop == 'font-feature-settings'
+ let values = ["normal", '"aalt"', '"abvf"', '"abvm"', '"abvs"', '"afrc"', '"akhn"', '"blwf"', '"blwm"', '"blws"', '"calt"', '"case"', '"ccmp"', '"cfar"', '"cjct"', '"clig"', '"cpct"', '"cpsp"', '"cswh"', '"curs"', '"cv', '"c2pc"', '"c2sc"', '"dist"', '"dlig"', '"dnom"', '"dtls"', '"expt"', '"falt"', '"fin2"', '"fin3"', '"fina"', '"flac"', '"frac"', '"fwid"', '"half"', '"haln"', '"halt"', '"hist"', '"hkna"', '"hlig"', '"hngl"', '"hojo"', '"hwid"', '"init"', '"isol"', '"ital"', '"jalt"', '"jp78"', '"jp83"', '"jp90"', '"jp04"', '"kern"', '"lfbd"', '"liga"', '"ljmo"', '"lnum"', '"locl"', '"ltra"', '"ltrm"', '"mark"', '"med2"', '"medi"', '"mgrk"', '"mkmk"', '"mset"', '"nalt"', '"nlck"', '"nukt"', '"numr"', '"onum"', '"opbd"', '"ordn"', '"ornm"', '"palt"', '"pcap"', '"pkna"', '"pnum"', '"pref"', '"pres"', '"pstf"', '"psts"', '"pwid"', '"qwid"', '"rand"', '"rclt"', '"rkrf"', '"rlig"', '"rphf"', '"rtbd"', '"rtla"', '"rtlm"', '"ruby"', '"salt"', '"sinf"', '"size"', '"smcp"', '"smpl"', '"ss01"', '"ss02"', '"ss03"', '"ss04"', '"ss05"', '"ss06"', '"ss07"', '"ss08"', '"ss09"', '"ss10"', '"ss11"', '"ss12"', '"ss13"', '"ss14"', '"ss15"', '"ss16"', '"ss17"', '"ss18"', '"ss19"', '"ss20"', '"ssty"', '"stch"', '"subs"', '"sups"', '"swsh"', '"titl"', '"tjmo"', '"tnam"', '"tnum"', '"trad"', '"twid"', '"unic"', '"valt"', '"vatu"', '"vert"', '"vhal"', '"vjmo"', '"vkna"', '"vkrn"', '"vpal"', '"vrt2"', '"zero"']
+ elseif prop == 'font-kerning'
+ let values = ["auto", "normal", "none"]
+ elseif prop == 'font-language-override'
+ let values = ["normal"]
+ elseif prop == 'font-size'
+ let values = ["xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "larger", "smaller"]
+ elseif prop == 'font-size-adjust'
+ let values = []
+ elseif prop == 'font-stretch'
+ let values = ["normal", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded"]
+ elseif prop == 'font-style'
+ let values = ["normal", "italic", "oblique"]
+ elseif prop == 'font-synthesis'
+ let values = ["none", "weight", "style"]
+ elseif prop == 'font-variant-alternates'
+ let values = ["normal", "historical-forms", "stylistic(", "styleset(", "character-variant(", "swash(", "ornaments(", "annotation("]
+ elseif prop == 'font-variant-caps'
+ let values = ["normal", "small-caps", "all-small-caps", "petite-caps", "all-petite-caps", "unicase", "titling-caps"]
+ elseif prop == 'font-variant-asian'
+ let values = ["normal", "ruby", "jis78", "jis83", "jis90", "jis04", "simplified", "traditional"]
+ elseif prop == 'font-variant-ligatures'
+ let values = ["normal", "none", "common-ligatures", "no-common-ligatures", "discretionary-ligatures", "no-discretionary-ligatures", "historical-ligatures", "no-historical-ligatures", "contextual", "no-contextual"]
+ elseif prop == 'font-variant-numeric'
+ let values = ["normal", "ordinal", "slashed-zero", "lining-nums", "oldstyle-nums", "proportional-nums", "tabular-nums", "diagonal-fractions", "stacked-fractions"]
+ elseif prop == 'font-variant-position'
+ let values = ["normal", "sub", "super"]
+ elseif prop == 'font-variant'
+ let values = ["normal", "historical-forms", "stylistic(", "styleset(", "character-variant(", "swash(", "ornaments(", "annotation("] + ["small-caps", "all-small-caps", "petite-caps", "all-petite-caps", "unicase", "titling-caps"] + ["ruby", "jis78", "jis83", "jis90", "jis04", "simplified", "traditional"] + ["none", "common-ligatures", "no-common-ligatures", "discretionary-ligatures", "no-discretionary-ligatures", "historical-ligatures", "no-historical-ligatures", "contextual", "no-contextual"] + ["ordinal", "slashed-zero", "lining-nums", "oldstyle-nums", "proportional-nums", "tabular-nums", "diagonal-fractions", "stacked-fractions"] + ["sub", "super"]
+ elseif prop == 'font-weight'
+ let values = ["normal", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900"]
+ elseif prop == 'font'
+ let values = ["normal", "italic", "oblique", "small-caps", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900", "xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "larger", "smaller", "sans-serif", "serif", "monospace", "cursive", "fantasy", "caption", "icon", "menu", "message-box", "small-caption", "status-bar"]
+ elseif prop =~ '^\%(height\|width\)$'
+ let values = ["auto", "border-box", "content-box", "max-content", "min-content", "available", "fit-content"]
+ elseif prop =~ '^\%(left\|right\)$'
+ let values = ["auto"]
+ elseif prop == 'image-rendering'
+ let values = ["auto", "crisp-edges", "pixelated"]
+ elseif prop == 'image-orientation'
+ let values = ["from-image", "flip"]
+ elseif prop == 'ime-mode'
+ let values = ["auto", "normal", "active", "inactive", "disabled"]
+ elseif prop == 'inline-size'
+ let values = ["auto", "border-box", "content-box", "max-content", "min-content", "available", "fit-content"]
+ elseif prop == 'isolation'
+ let values = ["auto", "isolate"]
+ elseif prop == 'justify-content'
+ let values = ["flex-start", "flex-end", "center", "space-between", "space-around"]
+ elseif prop == 'letter-spacing'
+ let values = ["normal"]
+ elseif prop == 'line-break'
+ let values = ["auto", "loose", "normal", "strict"]
+ elseif prop == 'line-height'
+ let values = ["normal"]
+ elseif prop == 'list-style-image'
+ let values = ["url(", "none"]
+ elseif prop == 'list-style-position'
+ let values = ["inside", "outside"]
+ elseif prop == 'list-style-type'
+ let values = list_style_type_values
+ elseif prop == 'list-style'
+ let values = list_style_type_values + ["inside", "outside"] + ["url(", "none"]
+ elseif prop == 'margin'
+ let values = ["auto"]
+ elseif prop =~ 'margin-\%(right\|left\|top\|bottom\|block-start\|block-end\|inline-start\|inline-end\)$'
+ let values = ["auto"]
+ elseif prop == 'marks'
+ let values = ["crop", "cross", "none"]
+ elseif prop == 'mask'
+ let values = ["url("]
+ elseif prop == 'mask-type'
+ let values = ["luminance", "alpha"]
+ elseif prop == '\%(max\|min\)-\%(block\|inline\)-size'
+ let values = ["auto", "border-box", "content-box", "max-content", "min-content", "available", "fit-content"]
+ elseif prop == '\%(max\|min\)-\%(height\|width\)'
+ let values = ["auto", "border-box", "content-box", "max-content", "min-content", "available", "fit-content"]
+ elseif prop == '\%(max\|min\)-zoom'
+ let values = ["auto"]
+ elseif prop == 'mix-blend-mode'
+ let values = ["normal", "multiply", "screen", "overlay", "darken", "lighten", "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"]
+ elseif prop == 'opacity'
+ let values = []
+ elseif prop == 'orientation'
+ let values = ["auto", "portrait", "landscape"]
+ elseif prop == 'orphans'
+ let values = []
+ elseif prop == 'outline-offset'
+ let values = []
+ elseif prop == 'outline-color'
+ let values = color_values
+ elseif prop == 'outline-style'
+ let values = ["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]
+ elseif prop == 'outline-width'
+ let values = ["thin", "thick", "medium"]
+ elseif prop == 'outline'
+ let vals = matchstr(line, '.*:\s*\zs.*')
+ if vals =~ '^\%([a-zA-Z0-9,()#]\+\)\?$'
+ let values = color_values
+ elseif vals =~ '^[a-zA-Z0-9,()#]\+\s\+\%([a-zA-Z]\+\)\?$'
+ let values = ["none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"]
+ elseif vals =~ '^[a-zA-Z0-9,()#]\+\s\+[a-zA-Z]\+\s\+\%([a-zA-Z(]\+\)\?$'
+ let values = ["thin", "thick", "medium"]
+ else
+ return []
+ endif
+ elseif prop == 'overflow-wrap'
+ let values = ["normal", "break-word"]
+ elseif prop =~ 'overflow\%(-x\|-y\)\='
+ let values = ["visible", "hidden", "scroll", "auto"]
+ elseif prop == 'pad'
+ let values = []
+ elseif prop == 'padding'
+ let values = []
+ elseif prop =~ 'padding-\%(top\|right\|bottom\|left\|inline-start\|inline-end\|block-start\|block-end\)$'
+ let values = []
+ elseif prop =~ 'page-break-\%(after\|before\)$'
+ let values = ["auto", "always", "avoid", "left", "right", "recto", "verso"]
+ elseif prop == 'page-break-inside'
+ let values = ["auto", "avoid"]
+ elseif prop =~ 'pause\%(-after\|-before\)\=$'
+ let values = ["none", "x-weak", "weak", "medium", "strong", "x-strong"]
+ elseif prop == 'perspective'
+ let values = ["none"]
+ elseif prop == 'perspective-origin'
+ let values = ["top", "bottom", "left", "center", " right"]
+ elseif prop == 'pointer-events'
+ let values = ["auto", "none", "visiblePainted", "visibleFill", "visibleStroke", "visible", "painted", "fill", "stroke", "all"]
+ elseif prop == 'position'
+ let values = ["static", "relative", "absolute", "fixed", "sticky"]
+ elseif prop == 'prefix'
+ let values = []
+ elseif prop == 'quotes'
+ let values = ["none"]
+ elseif prop == 'range'
+ let values = ["auto", "infinite"]
+ elseif prop == 'resize'
+ let values = ["none", "both", "horizontal", "vertical"]
+ elseif prop =~ 'rest\%(-after\|-before\)\=$'
+ let values = ["none", "x-weak", "weak", "medium", "strong", "x-strong"]
+ elseif prop == 'ruby-align'
+ let values = ["start", "center", "space-between", "space-around"]
+ elseif prop == 'ruby-merge'
+ let values = ["separate", "collapse", "auto"]
+ elseif prop == 'ruby-position'
+ let values = ["over", "under", "inter-character"]
+ elseif prop == 'scroll-behavior'
+ let values = ["auto", "smooth"]
+ elseif prop == 'scroll-snap-coordinate'
+ let values = ["none"]
+ elseif prop == 'scroll-snap-destination'
+ return []
+ elseif prop == 'scroll-snap-points-\%(x\|y\)$'
+ let values = ["none", "repeat("]
+ elseif prop == 'scroll-snap-type\%(-x\|-y\)\=$'
+ let values = ["none", "mandatory", "proximity"]
+ elseif prop == 'shape-image-threshold'
+ let values = []
+ elseif prop == 'shape-margin'
+ let values = []
+ elseif prop == 'shape-outside'
+ let values = ["margin-box", "border-box", "padding-box", "content-box", 'inset(', 'circle(', 'ellipse(', 'polygon(', 'url(']
+ elseif prop == 'speak'
+ let values = ["auto", "none", "normal"]
+ elseif prop == 'speak-as'
+ let values = ["auto", "normal", "spell-out", "digits"]
+ elseif prop == 'src'
+ let values = ["url("]
+ elseif prop == 'suffix'
+ let values = []
+ elseif prop == 'symbols'
+ let values = []
+ elseif prop == 'system'
+ let vals = matchstr(line, '.*:\s*\zs.*')
+ if vals =~ '^extends'
+ let values = list_style_type_values
+ else
+ let values = ["cyclic", "numeric", "alphabetic", "symbolic", "additive", "fixed", "extends"]
+ endif
+ elseif prop == 'table-layout'
+ let values = ["auto", "fixed"]
+ elseif prop == 'tab-size'
+ let values = []
+ elseif prop == 'text-align'
+ let values = ["start", "end", "left", "right", "center", "justify", "match-parent"]
+ elseif prop == 'text-align-last'
+ let values = ["auto", "start", "end", "left", "right", "center", "justify"]
+ elseif prop == 'text-combine-upright'
+ let values = ["none", "all", "digits"]
+ elseif prop == 'text-decoration-line'
+ let values = ["none", "underline", "overline", "line-through", "blink"]
+ elseif prop == 'text-decoration-color'
+ let values = color_values
+ elseif prop == 'text-decoration-style'
+ let values = ["solid", "double", "dotted", "dashed", "wavy"]
+ elseif prop == 'text-decoration'
+ let values = ["none", "underline", "overline", "line-through", "blink"] + ["solid", "double", "dotted", "dashed", "wavy"] + color_values
+ elseif prop == 'text-emphasis-color'
+ let values = color_values
+ elseif prop == 'text-emphasis-position'
+ let values = ["over", "under", "left", "right"]
+ elseif prop == 'text-emphasis-style'
+ let values = ["none", "filled", "open", "dot", "circle", "double-circle", "triangle", "sesame"]
+ elseif prop == 'text-emphasis'
+ let values = color_values + ["over", "under", "left", "right"] + ["none", "filled", "open", "dot", "circle", "double-circle", "triangle", "sesame"]
+ elseif prop == 'text-indent'
+ let values = ["hanging", "each-line"]
+ elseif prop == 'text-orientation'
+ let values = ["mixed", "upright", "sideways", "sideways-right", "use-glyph-orientation"]
+ elseif prop == 'text-overflow'
+ let values = ["clip", "ellipsis"]
+ elseif prop == 'text-rendering'
+ let values = ["auto", "optimizeSpeed", "optimizeLegibility", "geometricPrecision"]
+ elseif prop == 'text-shadow'
+ let values = color_values
+ elseif prop == 'text-transform'
+ let values = ["capitalize", "uppercase", "lowercase", "full-width", "none"]
+ elseif prop == 'text-underline-position'
+ let values = ["auto", "under", "left", "right"]
+ elseif prop == 'touch-action'
+ let values = ["auto", "none", "pan-x", "pan-y", "manipulation", "pan-left", "pan-right", "pan-top", "pan-down"]
+ elseif prop == 'transform'
+ let values = ["matrix(", "translate(", "translateX(", "translateY(", "scale(", "scaleX(", "scaleY(", "rotate(", "skew(", "skewX(", "skewY(", "matrix3d(", "translate3d(", "translateZ(", "scale3d(", "scaleZ(", "rotate3d(", "rotateX(", "rotateY(", "rotateZ(", "perspective("]
+ elseif prop == 'transform-box'
+ let values = ["border-box", "fill-box", "view-box"]
+ elseif prop == 'transform-origin'
+ let values = ["left", "center", "right", "top", "bottom"]
+ elseif prop == 'transform-style'
+ let values = ["flat", "preserve-3d"]
+ elseif prop == 'top'
+ let values = ["auto"]
+ elseif prop == 'transition-property'
+ let values = ["all", "none"] + s:values
+ elseif prop == 'transition-duration'
+ let values = []
+ elseif prop == 'transition-delay'
+ let values = []
+ elseif prop == 'transition-timing-function'
+ let values = timing_functions
+ elseif prop == 'transition'
+ let values = ["all", "none"] + s:values + timing_functions
+ elseif prop == 'unicode-bidi'
+ let values = ["normal", "embed", "isolate", "bidi-override", "isolate-override", "plaintext"]
+ elseif prop == 'unicode-range'
+ let values = ["U+"]
+ elseif prop == 'user-zoom'
+ let values = ["zoom", "fixed"]
+ elseif prop == 'vertical-align'
+ let values = ["baseline", "sub", "super", "top", "text-top", "middle", "bottom", "text-bottom"]
+ elseif prop == 'visibility'
+ let values = ["visible", "hidden", "collapse"]
+ elseif prop == 'voice-volume'
+ let values = ["silent", "x-soft", "soft", "medium", "loud", "x-loud"]
+ elseif prop == 'voice-balance'
+ let values = ["left", "center", "right", "leftwards", "rightwards"]
+ elseif prop == 'voice-family'
+ let values = []
+ elseif prop == 'voice-rate'
+ let values = ["normal", "x-slow", "slow", "medium", "fast", "x-fast"]
+ elseif prop == 'voice-pitch'
+ let values = ["absolute", "x-low", "low", "medium", "high", "x-high"]
+ elseif prop == 'voice-range'
+ let values = ["absolute", "x-low", "low", "medium", "high", "x-high"]
+ elseif prop == 'voice-stress'
+ let values = ["normal", "strong", "moderate", "none", "reduced "]
+ elseif prop == 'voice-duration'
+ let values = ["auto"]
+ elseif prop == 'white-space'
+ let values = ["normal", "pre", "nowrap", "pre-wrap", "pre-line"]
+ elseif prop == 'widows'
+ let values = []
+ elseif prop == 'will-change'
+ let values = ["auto", "scroll-position", "contents"] + s:values
+ elseif prop == 'word-break'
+ let values = ["normal", "break-all", "keep-all"]
+ elseif prop == 'word-spacing'
+ let values = ["normal"]
+ elseif prop == 'word-wrap'
+ let values = ["normal", "break-word"]
+ elseif prop == 'writing-mode'
+ let values = ["horizontal-tb", "vertical-rl", "vertical-lr", "sideways-rl", "sideways-lr"]
+ elseif prop == 'z-index'
+ let values = ["auto"]
+ elseif prop == 'zoom'
+ let values = ["auto"]
+ else
+ " If no property match it is possible we are outside of {} and
+ " trying to complete pseudo-(class|element)
+ let element = tolower(matchstr(line, '\zs[a-zA-Z1-6]*\ze:[^:[:space:]]\{-}$'))
+ if stridx('a,abbr,address,area,article,aside,audio,b,base,bdi,bdo,bgsound,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,div,dl,dt,element,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,isindex,kbd,keygen,label,legend,li,link,main,map,mark,menu,menuitem,meta,meter,nav,nobr,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,pre,progress,q,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,span,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,u,ul,var,video,wbr', ','.element.',') > -1
+ let values = ["active", "any", "checked", "default", "dir(", "disabled", "empty", "enabled", "first", "first-child", "first-of-type", "fullscreen", "focus", "hover", "indeterminate", "in-range", "invalid", "lang(", "last-child", "last-of-type", "left", "link", "not(", "nth-child(", "nth-last-child(", "nth-last-of-type(", "nth-of-type(", "only-child", "only-of-type", "optional", "out-of-range", "read-only", "read-write", "required", "right", "root", "scope", "target", "valid", "visited", "first-line", "first-letter", "before", "after", "selection", "backdrop"]
+ else
+ return []
+ endif
+ endif
+
+ let values = wide_keywords + values
+ " Complete values
+ let entered_value = matchstr(line, '.\{-}\zs[a-zA-Z0-9#,.(_-]*$')
+
+ for m in values
+ if m =~? '^'.entered_value
+ call add(res, m)
+ elseif m =~? entered_value
+ call add(res2, m)
+ endif
+ endfor
+
+ return res + res2
+
+ elseif borders[max(keys(borders))] == 'closebrace'
+
+ return []
+
+ elseif borders[max(keys(borders))] == 'exclam'
+
+ " Complete values
+ let entered_imp = matchstr(line, '.\{-}!\s*\zs[a-zA-Z ]*$')
+
+ let values = ["important"]
+
+ for m in values
+ if m =~? '^'.entered_imp
+ call add(res, m)
+ endif
+ endfor
+
+ return res
+
+ elseif borders[max(keys(borders))] == 'atrule'
+
+ let afterat = matchstr(line, '.*@\zs.*')
+
+ if afterat =~ '\s'
+
+ let atrulename = matchstr(line, '.*@\zs[a-zA-Z-]\+\ze')
+
+ if atrulename == 'media'
+ let entered_atruleafter = matchstr(line, '.*@media\s\+\zs.*$')
+
+ if entered_atruleafter =~ "([^)]*$"
+ let entered_atruleafter = matchstr(entered_atruleafter, '(\s*\zs[^)]*$')
+ let values = ["max-width", "min-width", "width", "max-height", "min-height", "height", "max-aspect-ration", "min-aspect-ration", "aspect-ratio", "orientation", "max-resolution", "min-resolution", "resolution", "scan", "grid", "update-frequency", "overflow-block", "overflow-inline", "max-color", "min-color", "color", "max-color-index", "min-color-index", "color-index", "monochrome", "inverted-colors", "pointer", "hover", "any-pointer", "any-hover", "light-level", "scripting"]
+ else
+ let values = ["screen", "print", "speech", "all", "not", "and", "("]
+ endif
+
+ elseif atrulename == 'supports'
+ let entered_atruleafter = matchstr(line, '.*@supports\s\+\zs.*$')
+
+ if entered_atruleafter =~ "([^)]*$"
+ let entered_atruleafter = matchstr(entered_atruleafter, '(\s*\zs.*$')
+ let values = s:values
+ else
+ let values = ["("]
+ endif
+
+ elseif atrulename == 'charset'
+ let entered_atruleafter = matchstr(line, '.*@charset\s\+\zs.*$')
+ let values = [
+ \ '"UTF-8";', '"ANSI_X3.4-1968";', '"ISO_8859-1:1987";', '"ISO_8859-2:1987";', '"ISO_8859-3:1988";', '"ISO_8859-4:1988";', '"ISO_8859-5:1988";',
+ \ '"ISO_8859-6:1987";', '"ISO_8859-7:1987";', '"ISO_8859-8:1988";', '"ISO_8859-9:1989";', '"ISO-8859-10";', '"ISO_6937-2-add";', '"JIS_X0201";',
+ \ '"JIS_Encoding";', '"Shift_JIS";', '"Extended_UNIX_Code_Packed_Format_for_Japanese";', '"Extended_UNIX_Code_Fixed_Width_for_Japanese";',
+ \ '"BS_4730";', '"SEN_850200_C";', '"IT";', '"ES";', '"DIN_66003";', '"NS_4551-1";', '"NF_Z_62-010";', '"ISO-10646-UTF-1";', '"ISO_646.basic:1983";',
+ \ '"INVARIANT";', '"ISO_646.irv:1983";', '"NATS-SEFI";', '"NATS-SEFI-ADD";', '"NATS-DANO";', '"NATS-DANO-ADD";', '"SEN_850200_B";', '"KS_C_5601-1987";',
+ \ '"ISO-2022-KR";', '"EUC-KR";', '"ISO-2022-JP";', '"ISO-2022-JP-2";', '"JIS_C6220-1969-jp";', '"JIS_C6220-1969-ro";', '"PT";', '"greek7-old";',
+ \ '"latin-greek";', '"NF_Z_62-010_(1973)";', '"Latin-greek-1";', '"ISO_5427";', '"JIS_C6226-1978";', '"BS_viewdata";', '"INIS";', '"INIS-8";',
+ \ '"INIS-cyrillic";', '"ISO_5427:1981";', '"ISO_5428:1980";', '"GB_1988-80";', '"GB_2312-80";', '"NS_4551-2";', '"videotex-suppl";', '"PT2";',
+ \ '"ES2";', '"MSZ_7795.3";', '"JIS_C6226-1983";', '"greek7";', '"ASMO_449";', '"iso-ir-90";', '"JIS_C6229-1984-a";', '"JIS_C6229-1984-b";',
+ \ '"JIS_C6229-1984-b-add";', '"JIS_C6229-1984-hand";', '"JIS_C6229-1984-hand-add";', '"JIS_C6229-1984-kana";', '"ISO_2033-1983";',
+ \ '"ANSI_X3.110-1983";', '"T.61-7bit";', '"T.61-8bit";', '"ECMA-cyrillic";', '"CSA_Z243.4-1985-1";', '"CSA_Z243.4-1985-2";', '"CSA_Z243.4-1985-gr";',
+ \ '"ISO_8859-6-E";', '"ISO_8859-6-I";', '"T.101-G2";', '"ISO_8859-8-E";', '"ISO_8859-8-I";', '"CSN_369103";', '"JUS_I.B1.002";', '"IEC_P27-1";',
+ \ '"JUS_I.B1.003-serb";', '"JUS_I.B1.003-mac";', '"greek-ccitt";', '"NC_NC00-10:81";', '"ISO_6937-2-25";', '"GOST_19768-74";', '"ISO_8859-supp";',
+ \ '"ISO_10367-box";', '"latin-lap";', '"JIS_X0212-1990";', '"DS_2089";', '"us-dk";', '"dk-us";', '"KSC5636";', '"UNICODE-1-1-UTF-7";', '"ISO-2022-CN";',
+ \ '"ISO-2022-CN-EXT";', '"ISO-8859-13";', '"ISO-8859-14";', '"ISO-8859-15";', '"ISO-8859-16";', '"GBK";', '"GB18030";', '"OSD_EBCDIC_DF04_15";',
+ \ '"OSD_EBCDIC_DF03_IRV";', '"OSD_EBCDIC_DF04_1";', '"ISO-11548-1";', '"KZ-1048";', '"ISO-10646-UCS-2";', '"ISO-10646-UCS-4";', '"ISO-10646-UCS-Basic";',
+ \ '"ISO-10646-Unicode-Latin1";', '"ISO-10646-J-1";', '"ISO-Unicode-IBM-1261";', '"ISO-Unicode-IBM-1268";', '"ISO-Unicode-IBM-1276";',
+ \ '"ISO-Unicode-IBM-1264";', '"ISO-Unicode-IBM-1265";', '"UNICODE-1-1";', '"SCSU";', '"UTF-7";', '"UTF-16BE";', '"UTF-16LE";', '"UTF-16";', '"CESU-8";',
+ \ '"UTF-32";', '"UTF-32BE";', '"UTF-32LE";', '"BOCU-1";', '"ISO-8859-1-Windows-3.0-Latin-1";', '"ISO-8859-1-Windows-3.1-Latin-1";',
+ \ '"ISO-8859-2-Windows-Latin-2";', '"ISO-8859-9-Windows-Latin-5";', '"hp-roman8";', '"Adobe-Standard-Encoding";', '"Ventura-US";',
+ \ '"Ventura-International";', '"DEC-MCS";', '"IBM850";', '"PC8-Danish-Norwegian";', '"IBM862";', '"PC8-Turkish";', '"IBM-Symbols";', '"IBM-Thai";',
+ \ '"HP-Legal";', '"HP-Pi-font";', '"HP-Math8";', '"Adobe-Symbol-Encoding";', '"HP-DeskTop";', '"Ventura-Math";', '"Microsoft-Publishing";',
+ \ '"Windows-31J";', '"GB2312";', '"Big5";', '"macintosh";', '"IBM037";', '"IBM038";', '"IBM273";', '"IBM274";', '"IBM275";', '"IBM277";', '"IBM278";',
+ \ '"IBM280";', '"IBM281";', '"IBM284";', '"IBM285";', '"IBM290";', '"IBM297";', '"IBM420";', '"IBM423";', '"IBM424";', '"IBM437";', '"IBM500";', '"IBM851";',
+ \ '"IBM852";', '"IBM855";', '"IBM857";', '"IBM860";', '"IBM861";', '"IBM863";', '"IBM864";', '"IBM865";', '"IBM868";', '"IBM869";', '"IBM870";', '"IBM871";',
+ \ '"IBM880";', '"IBM891";', '"IBM903";', '"IBM904";', '"IBM905";', '"IBM918";', '"IBM1026";', '"EBCDIC-AT-DE";', '"EBCDIC-AT-DE-A";', '"EBCDIC-CA-FR";',
+ \ '"EBCDIC-DK-NO";', '"EBCDIC-DK-NO-A";', '"EBCDIC-FI-SE";', '"EBCDIC-FI-SE-A";', '"EBCDIC-FR";', '"EBCDIC-IT";', '"EBCDIC-PT";', '"EBCDIC-ES";',
+ \ '"EBCDIC-ES-A";', '"EBCDIC-ES-S";', '"EBCDIC-UK";', '"EBCDIC-US";', '"UNKNOWN-8BIT";', '"MNEMONIC";', '"MNEM";', '"VISCII";', '"VIQR";', '"KOI8-R";',
+ \ '"HZ-GB-2312";', '"IBM866";', '"IBM775";', '"KOI8-U";', '"IBM00858";', '"IBM00924";', '"IBM01140";', '"IBM01141";', '"IBM01142";', '"IBM01143";',
+ \ '"IBM01144";', '"IBM01145";', '"IBM01146";', '"IBM01147";', '"IBM01148";', '"IBM01149";', '"Big5-HKSCS";', '"IBM1047";', '"PTCP154";', '"Amiga-1251";',
+ \ '"KOI7-switched";', '"BRF";', '"TSCII";', '"windows-1250";', '"windows-1251";', '"windows-1252";', '"windows-1253";', '"windows-1254";', '"windows-1255";',
+ \ '"windows-1256";', '"windows-1257";', '"windows-1258";', '"TIS-620";']
+
+ elseif atrulename == 'namespace'
+ let entered_atruleafter = matchstr(line, '.*@namespace\s\+\zs.*$')
+ let values = ["url("]
+
+ elseif atrulename == 'document'
+ let entered_atruleafter = matchstr(line, '.*@document\s\+\zs.*$')
+ let values = ["url(", "url-prefix(", "domain(", "regexp("]
+
+ elseif atrulename == 'import'
+ let entered_atruleafter = matchstr(line, '.*@import\s\+\zs.*$')
+
+ if entered_atruleafter =~ "^[\"']"
+ let filestart = matchstr(entered_atruleafter, '^.\zs.*')
+ let files = split(glob(filestart.'*'), '\n')
+ let values = map(copy(files), '"\"".v:val')
+
+ elseif entered_atruleafter =~ "^url("
+ let filestart = matchstr(entered_atruleafter, "^url([\"']\\?\\zs.*")
+ let files = split(glob(filestart.'*'), '\n')
+ let values = map(copy(files), '"url(".v:val')
+
+ else
+ let values = ['"', 'url(']
+
+ endif
+
+ else
+ return []
+
+ endif
+
+ for m in values
+ if m =~? '^'.entered_atruleafter
+ if entered_atruleafter =~? '^"' && m =~? '^"'
+ let m = m[1:]
+ endif
+ if b:after =~? '"' && stridx(m, '"') > -1
+ let m = m[0:stridx(m, '"')-1]
+ endif
+ call add(res, m)
+ elseif m =~? entered_atruleafter
+ if m =~? '^"'
+ let m = m[1:]
+ endif
+ call add(res2, m)
+ endif
+ endfor
+
+ return res + res2
+
+ endif
+
+ let values = ["charset", "page", "media", "import", "font-face", "namespace", "supports", "keyframes", "viewport", "document"]
+
+ let entered_atrule = matchstr(line, '.*@\zs[a-zA-Z-]*$')
+
+ for m in values
+ if m =~? '^'.entered_atrule
+ call add(res, m .' ')
+ elseif m =~? entered_atrule
+ call add(res2, m .' ')
+ endif
+ endfor
+
+ return res + res2
+
+ endif
+
+ return []
+
+endfunction
diff --git a/runtime/autoload/decada.vim b/runtime/autoload/decada.vim
new file mode 100644
index 0000000..fda2b76
--- /dev/null
+++ b/runtime/autoload/decada.vim
@@ -0,0 +1,75 @@
+"------------------------------------------------------------------------------
+" Description: Vim Ada/Dec Ada compiler file
+" Language: Ada (Dec Ada)
+" $Id: decada.vim 887 2008-07-08 14:29:01Z krischik $
+" Copyright: Copyright (C) 2006 Martin Krischik
+" Maintainer: Martin Krischik <krischik@users.sourceforge.net>
+" $Author: krischik $
+" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" Version: 4.6
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/decada.vim $
+" History: 21.07.2006 MK New Dec Ada
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 05.11.2006 MK Bram suggested not to use include protection for
+" autoload
+" 05.11.2006 MK Bram suggested to save on spaces
+" Help Page: compiler-decada
+"------------------------------------------------------------------------------
+
+if version < 700
+ finish
+endif
+
+function decada#Unit_Name () dict " {{{1
+ " Convert filename into acs unit:
+ " 1: remove the file extension.
+ " 2: replace all double '_' or '-' with an dot (which denotes a separate)
+ " 3: remove a trailing '_' (which denotes a specification)
+ return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '')
+endfunction decada#Unit_Name " }}}1
+
+function decada#Make () dict " {{{1
+ let l:make_prg = substitute (g:self.Make_Command, '%<', self.Unit_Name(), '')
+ let &errorformat = g:self.Error_Format
+ let &makeprg = l:make_prg
+ wall
+ make
+ copen
+ set wrap
+ wincmd W
+endfunction decada#Build " }}}1
+
+function decada#Set_Session (...) dict " {{{1
+ if a:0 > 0
+ call ada#Switch_Session (a:1)
+ elseif argc() == 0 && strlen (v:servername) > 0
+ call ada#Switch_Session (
+ \ expand('~')[0:-2] . ".vimfiles.session]decada_" .
+ \ v:servername . ".vim")
+ endif
+ return
+endfunction decada#Set_Session " }}}1
+
+function decada#New () " }}}1
+ let Retval = {
+ \ 'Make' : function ('decada#Make'),
+ \ 'Unit_Name' : function ('decada#Unit_Name'),
+ \ 'Set_Session' : function ('decada#Set_Session'),
+ \ 'Project_Dir' : '',
+ \ 'Make_Command' : 'ACS COMPILE /Wait /Log /NoPreLoad /Optimize=Development /Debug %<',
+ \ 'Error_Format' : '%+A%%ADAC-%t-%m,%C %#%m,%Zat line number %l in file %f,' .
+ \ '%+I%%ada-I-%m,%C %#%m,%Zat line number %l in file %f'}
+
+ return Retval
+endfunction decada#New " }}}1
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" vim: foldmethod=marker
diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim
new file mode 100644
index 0000000..bfc325d
--- /dev/null
+++ b/runtime/autoload/dist/ft.vim
@@ -0,0 +1,1108 @@
+vim9script
+
+# Vim functions for file type detection
+#
+# Maintainer: Bram Moolenaar <Bram@vim.org>
+# Last Change: 2022 Dec 14
+
+# These functions are moved here from runtime/filetype.vim to make startup
+# faster.
+
+export def Check_inp()
+ if getline(1) =~ '^\*'
+ setf abaqus
+ else
+ var n = 1
+ var nmax = line("$") > 500 ? 500 : line("$")
+ while n <= nmax
+ if getline(n) =~? "^header surface data"
+ setf trasys
+ break
+ endif
+ n += 1
+ endwhile
+ endif
+enddef
+
+# 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.
+export def FTasm()
+ # make sure b:asmsyntax exists
+ if !exists("b:asmsyntax")
+ b:asmsyntax = ""
+ endif
+
+ if b:asmsyntax == ""
+ FTasmsyntax()
+ endif
+
+ # if b:asmsyntax still isn't set, default to asmsyntax or GNU
+ if b:asmsyntax == ""
+ if exists("g:asmsyntax")
+ b:asmsyntax = g:asmsyntax
+ else
+ b:asmsyntax = "asm"
+ endif
+ endif
+
+ exe "setf " .. fnameescape(b:asmsyntax)
+enddef
+
+export def FTasmsyntax()
+ # see if the file contains any asmsyntax=foo overrides. If so, change
+ # b:asmsyntax appropriately
+ var head = " " .. getline(1) .. " " .. getline(2) .. " "
+ .. getline(3) .. " " .. getline(4) .. " " .. getline(5) .. " "
+ var match = matchstr(head, '\sasmsyntax=\zs[a-zA-Z0-9]\+\ze\s')
+ if match != ''
+ b:asmsyntax = match
+ elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? '\.macro') || (head =~? '\.subtitle') || (head =~? '\.library'))
+ b:asmsyntax = "vmasm"
+ endif
+enddef
+
+var ft_visual_basic_content = '\cVB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
+
+# See FTfrm() for Visual Basic form file detection
+export def FTbas()
+ if exists("g:filetype_bas")
+ exe "setf " .. g:filetype_bas
+ return
+ endif
+
+ # most frequent FreeBASIC-specific keywords in distro files
+ var fb_keywords = '\c^\s*\%(extern\|var\|enum\|private\|scope\|union\|byref\|operator\|constructor\|delete\|namespace\|public\|property\|with\|destructor\|using\)\>\%(\s*[:=(]\)\@!'
+ var fb_preproc = '\c^\s*\%(' ..
+ # preprocessor
+ '#\s*\a\+\|' ..
+ # compiler option
+ 'option\s\+\%(byval\|dynamic\|escape\|\%(no\)\=gosub\|nokeyword\|private\|static\)\>\|' ..
+ # metacommand
+ '\%(''\|rem\)\s*\$lang\>\|' ..
+ # default datatype
+ 'def\%(byte\|longint\|short\|ubyte\|uint\|ulongint\|ushort\)\>' ..
+ '\)'
+ var fb_comment = "^\\s*/'"
+
+ # OPTION EXPLICIT, without the leading underscore, is common to many dialects
+ var qb64_preproc = '\c^\s*\%($\a\+\|option\s\+\%(_explicit\|_\=explicitarray\)\>\)'
+
+ for lnum in range(1, min([line("$"), 100]))
+ var line = getline(lnum)
+ if line =~ ft_visual_basic_content
+ setf vb
+ return
+ elseif line =~ fb_preproc || line =~ fb_comment || line =~ fb_keywords
+ setf freebasic
+ return
+ elseif line =~ qb64_preproc
+ setf qb64
+ return
+ endif
+ endfor
+ setf basic
+enddef
+
+export def FTbtm()
+ if exists("g:dosbatch_syntax_for_btm") && g:dosbatch_syntax_for_btm
+ setf dosbatch
+ else
+ setf btm
+ endif
+enddef
+
+export def BindzoneCheck(default = '')
+ if getline(1) .. getline(2) .. getline(3) .. getline(4)
+ =~ '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
+ setf bindzone
+ elseif default != ''
+ exe 'setf ' .. default
+ endif
+enddef
+
+# Returns true if file content looks like RAPID
+def IsRapid(sChkExt: string = ""): bool
+ if sChkExt == "cfg"
+ return getline(1) =~? '\v^%(EIO|MMC|MOC|PROC|SIO|SYS):CFG'
+ endif
+ # called from FTmod, FTprg or FTsys
+ return getline(nextnonblank(1)) =~? '\v^\s*%(\%{3}|module\s+\k+\s*%(\(|$))'
+enddef
+
+export def FTcfg()
+ if exists("g:filetype_cfg")
+ exe "setf " .. g:filetype_cfg
+ elseif IsRapid("cfg")
+ setf rapid
+ else
+ setf cfg
+ endif
+enddef
+
+export def FTcls()
+ if exists("g:filetype_cls")
+ exe "setf " .. g:filetype_cls
+ return
+ endif
+
+ if getline(1) =~ '^\v%(\%|\\)'
+ setf tex
+ elseif getline(1)[0] == '#' && getline(1) =~ 'rexx'
+ setf rexx
+ elseif getline(1) == 'VERSION 1.0 CLASS'
+ setf vb
+ else
+ setf st
+ endif
+enddef
+
+export def FTlpc()
+ if exists("g:lpc_syntax_for_c")
+ var lnum = 1
+ while lnum <= 12
+ if getline(lnum) =~# '^\(//\|inherit\|private\|protected\|nosave\|string\|object\|mapping\|mixed\)'
+ setf lpc
+ return
+ endif
+ lnum += 1
+ endwhile
+ endif
+ setf c
+enddef
+
+export def 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
+enddef
+
+# 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", "//" or "/*" it's probably ch.
+# Otherwise CHILL is assumed.
+export def FTchange()
+ var 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
+ lnum += 1
+ endwhile
+ setf chill
+enddef
+
+export def 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.
+ var lnum = 1
+ while lnum < 6
+ var 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
+ lnum += 1
+ endwhile
+ setf dtd
+enddef
+
+export def ExCheck()
+ var lines = getline(1, min([line("$"), 100]))
+ if exists('g:filetype_euphoria')
+ exe 'setf ' .. g:filetype_euphoria
+ elseif match(lines, '^--\|^ifdef\>\|^include\>') > -1
+ setf euphoria3
+ else
+ setf elixir
+ endif
+enddef
+
+export def EuphoriaCheck()
+ if exists('g:filetype_euphoria')
+ exe 'setf ' .. g:filetype_euphoria
+ else
+ setf euphoria3
+ endif
+enddef
+
+export def DtraceCheck()
+ if did_filetype()
+ # Filetype was already detected
+ return
+ endif
+ var 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
+enddef
+
+export def FTe()
+ if exists('g:filetype_euphoria')
+ exe 'setf ' .. g:filetype_euphoria
+ else
+ var n = 1
+ while n < 100 && n <= line("$")
+ if getline(n) =~ "^\\s*\\(<'\\|'>\\)\\s*$"
+ setf specman
+ return
+ endif
+ n += 1
+ endwhile
+ setf eiffel
+ endif
+enddef
+
+export def FTfrm()
+ if exists("g:filetype_frm")
+ exe "setf " .. g:filetype_frm
+ return
+ endif
+
+ var lines = getline(1, min([line("$"), 5]))
+
+ if match(lines, ft_visual_basic_content) > -1
+ setf vb
+ else
+ setf form
+ endif
+enddef
+
+# Distinguish between Forth and F#.
+# Provided by Doug Kearns.
+export def FTfs()
+ if exists("g:filetype_fs")
+ exe "setf " .. g:filetype_fs
+ else
+ var line = getline(nextnonblank(1))
+ # comments and colon definitions
+ if line =~ '^\s*\.\=( ' || line =~ '^\s*\\G\= ' || line =~ '^\\$'
+ \ || line =~ '^\s*: \S'
+ setf forth
+ else
+ setf fsharp
+ endif
+ endif
+enddef
+
+# Distinguish between HTML, XHTML and Django
+export def FThtml()
+ var 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
+ n += 1
+ endwhile
+ setf FALLBACK html
+enddef
+
+# Distinguish between standard IDL and MS-IDL
+export def FTidl()
+ var n = 1
+ while n < 50 && n <= line("$")
+ if getline(n) =~ '^\s*import\s\+"\(unknwn\|objidl\)\.idl"'
+ setf msidl
+ return
+ endif
+ n += 1
+ endwhile
+ setf idl
+enddef
+
+# Distinguish between "default", Prolog and Cproto prototype file.
+export def ProtoCheck(default: string)
+ # 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
+ # recognize Prolog by specific text in the first non-empty line
+ # require a blank after the '%' because Perl uses "%list" and "%translate"
+ var l = getline(nextnonblank(1))
+ if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
+ setf prolog
+ else
+ exe 'setf ' .. default
+ endif
+ endif
+enddef
+
+export def FTm()
+ if exists("g:filetype_m")
+ exe "setf " .. g:filetype_m
+ return
+ endif
+
+ # excluding end(for|function|if|switch|while) common to Murphi
+ var octave_block_terminators = '\<end\%(_try_catch\|classdef\|enumeration\|events\|methods\|parfor\|properties\)\>'
+
+ var objc_preprocessor = '^\s*#\s*\%(import\|include\|define\|if\|ifn\=def\|undef\|line\|error\|pragma\)\>'
+
+ var n = 1
+ var saw_comment = 0 # Whether we've seen a multiline comment leader.
+ while n < 100
+ var 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.
+ saw_comment = 1
+ endif
+ if line =~ '^\s*//' || line =~ '^\s*@import\>' || line =~ objc_preprocessor
+ setf objc
+ return
+ endif
+ if line =~ '^\s*\%(#\|%!\)' || line =~ '^\s*unwind_protect\>' ||
+ \ line =~ '\%(^\|;\)\s*' .. octave_block_terminators
+ setf octave
+ return
+ endif
+ # TODO: could be Matlab or Octave
+ if line =~ '^\s*%'
+ setf matlab
+ return
+ endif
+ if line =~ '^\s*(\*'
+ setf mma
+ return
+ endif
+ if line =~ '^\c\s*\(\(type\|var\)\>\|--\)'
+ setf murphi
+ return
+ endif
+ 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
+ else
+ # Default is Matlab
+ setf matlab
+ endif
+enddef
+
+export def FTmms()
+ var n = 1
+ while n < 20
+ var line = getline(n)
+ if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
+ setf mmix
+ return
+ endif
+ if line =~ '^\s*#'
+ setf make
+ return
+ endif
+ n += 1
+ endwhile
+ setf mmix
+enddef
+
+# 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.
+export def FTnroff(): number
+ if getline(1)[0] .. getline(2)[0] .. getline(3)[0]
+ .. getline(4)[0] .. getline(5)[0] =~ '\.'
+ setf nroff
+ return 1
+ endif
+ return 0
+enddef
+
+export def FTmm()
+ var n = 1
+ while n < 20
+ if getline(n) =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)'
+ setf objcpp
+ return
+ endif
+ n += 1
+ endwhile
+ setf nroff
+enddef
+
+# Returns true if file content looks like LambdaProlog module
+def IsLProlog(): bool
+ # skip apparent comments and blank lines, what looks like
+ # LambdaProlog comment may be RAPID header
+ var l: number = nextnonblank(1)
+ while l > 0 && l < line('$') && getline(l) =~ '^\s*%' # LambdaProlog comment
+ l = nextnonblank(l + 1)
+ endwhile
+ # this pattern must not catch a go.mod file
+ return getline(l) =~ '\<module\s\+\w\+\s*\.\s*\(%\|$\)'
+enddef
+
+# Determine if *.mod is ABB RAPID, LambdaProlog, Modula-2, Modsim III or go.mod
+export def FTmod()
+ if exists("g:filetype_mod")
+ exe "setf " .. g:filetype_mod
+ elseif IsLProlog()
+ setf lprolog
+ elseif getline(nextnonblank(1)) =~ '\%(\<MODULE\s\+\w\+\s*;\|^\s*(\*\)'
+ setf modula2
+ elseif IsRapid()
+ setf rapid
+ elseif expand("<afile>") =~ '\<go.mod$'
+ setf gomod
+ else
+ # Nothing recognized, assume modsim3
+ setf modsim3
+ endif
+enddef
+
+export def 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"
+ var l = getline(nextnonblank(1))
+ if l =~ '\<prolog\>' || l =~ '^\s*\(%\+\(\s\|$\)\|/\*\)' || l =~ ':-'
+ setf prolog
+ else
+ setf perl
+ endif
+ endif
+enddef
+
+export def FTinc()
+ if exists("g:filetype_inc")
+ exe "setf " .. g:filetype_inc
+ else
+ var lines = getline(1) .. getline(2) .. getline(3)
+ if lines =~? "perlscript"
+ setf aspperl
+ elseif lines =~ "<%"
+ setf aspvbs
+ elseif lines =~ "<?"
+ setf php
+ # Pascal supports // comments but they're vary rarely used for file
+ # headers so assume POV-Ray
+ elseif lines =~ '^\s*\%({\|(\*\)' || lines =~? ft_pascal_keywords
+ setf pascal
+ elseif lines =~# '\<\%(require\|inherit\)\>' || lines =~# '[A-Z][A-Za-z0-9_:${}]*\s\+\%(??\|[?:+]\)\?= '
+ setf bitbake
+ else
+ FTasmsyntax()
+ if exists("b:asmsyntax")
+ exe "setf " .. fnameescape(b:asmsyntax)
+ else
+ setf pov
+ endif
+ endif
+ endif
+enddef
+
+export def 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
+enddef
+
+export def 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.
+ var lnum = 1
+ while lnum <= 10 && lnum < line('$')
+ var line = getline(lnum)
+ if line =~ '^\s*;' || line =~ '^\*'
+ 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
+ lnum += 1
+ endwhile
+ setf progress
+enddef
+
+var ft_pascal_comments = '^\s*\%({\|(\*\|//\)'
+var ft_pascal_keywords = '^\s*\%(program\|unit\|library\|uses\|begin\|procedure\|function\|const\|type\|var\)\>'
+
+export def 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.
+ var lnum = 1
+ while lnum <= 10 && lnum < line('$')
+ var line = getline(lnum)
+ if line =~ ft_pascal_comments || line =~? ft_pascal_keywords
+ 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
+ lnum += 1
+ endwhile
+ setf progress
+enddef
+
+export def FTpp()
+ if exists("g:filetype_pp")
+ exe "setf " .. g:filetype_pp
+ else
+ var line = getline(nextnonblank(1))
+ if line =~ ft_pascal_comments || line =~? ft_pascal_keywords
+ setf pascal
+ else
+ setf puppet
+ endif
+ endif
+enddef
+
+# Determine if *.prg is ABB RAPID. Can also be Clipper, FoxPro or eviews
+export def FTprg()
+ if exists("g:filetype_prg")
+ exe "setf " .. g:filetype_prg
+ elseif IsRapid()
+ setf rapid
+ else
+ # Nothing recognized, assume Clipper
+ setf clipper
+ endif
+enddef
+
+export def FTr()
+ var 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
+enddef
+
+export def 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]))
+ var 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
+enddef
+
+# Called from filetype.vim and scripts.vim.
+export def SetFileTypeSH(name: string)
+ if did_filetype()
+ # Filetype was already detected
+ return
+ endif
+ if expand("<amatch>") =~ g:ft_ignore_pat
+ return
+ endif
+ if name =~ '\<csh\>'
+ # Some .sh scripts contain #!/bin/csh.
+ SetFileTypeShell("csh")
+ return
+ elseif name =~ '\<tcsh\>'
+ # Some .sh scripts contain #!/bin/tcsh.
+ SetFileTypeShell("tcsh")
+ return
+ elseif name =~ '\<zsh\>'
+ # Some .sh scripts contain #!/bin/zsh.
+ SetFileTypeShell("zsh")
+ return
+ elseif name =~ '\<ksh\>'
+ 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") || name =~ '\<bash\>' || name =~ '\<bash2\>'
+ 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 name =~ '\<sh\>' || name =~ '\<dash\>'
+ # Ubuntu links "sh" to "dash", thus it is expected to work the same way
+ 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
+ SetFileTypeShell("sh")
+enddef
+
+# 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.
+export def SetFileTypeShell(name: string)
+ if did_filetype()
+ # Filetype was already detected
+ return
+ endif
+ if expand("<amatch>") =~ g:ft_ignore_pat
+ return
+ endif
+ var l = 2
+ while l < 20 && l < line("$") && getline(l) =~ '^\s*\(#\|$\)'
+ # Skip empty and comment lines.
+ l += 1
+ endwhile
+ if l < line("$") && getline(l) =~ '\s*exec\s' && getline(l - 1) =~ '^\s*#.*\\$'
+ # Found an "exec" line after a comment with continuation
+ var n = substitute(getline(l), '\s*exec\s\+\([^ ]*/\)\=', '', '')
+ if n =~ '\<tclsh\|\<wish'
+ setf tcl
+ return
+ endif
+ endif
+ exe "setf " .. name
+enddef
+
+export def CSH()
+ if did_filetype()
+ # Filetype was already detected
+ return
+ endif
+ if exists("g:filetype_csh")
+ SetFileTypeShell(g:filetype_csh)
+ elseif &shell =~ "tcsh"
+ SetFileTypeShell("tcsh")
+ else
+ SetFileTypeShell("csh")
+ endif
+enddef
+
+var ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
+export def FTRules()
+ var path = expand('<amatch>:p')
+ if path =~ '/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|\%(usr/\)\=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
+ var config_lines: list<string>
+ try
+ config_lines = readfile('/etc/udev/udev.conf')
+ catch /^Vim\%((\a\+)\)\=:E484/
+ setf hog
+ return
+ endtry
+ var dir = expand('<amatch>:p:h')
+ for line in config_lines
+ if line =~ ft_rules_udev_rules_pattern
+ var udev_rules = substitute(line, ft_rules_udev_rules_pattern, '\1', "")
+ if dir == udev_rules
+ setf udevrules
+ endif
+ break
+ endif
+ endfor
+ setf hog
+enddef
+
+export def SQL()
+ if exists("g:filetype_sql")
+ exe "setf " .. g:filetype_sql
+ else
+ setf sql
+ endif
+enddef
+
+# This function checks the first 25 lines of file extension "sc" to resolve
+# detection between scala and SuperCollider.
+# NOTE: We don't check for 'Class : Method', as this can easily be confused
+# with valid Scala like `val x : Int = 3`. So we instead only rely on
+# checks that can't be confused.
+export def FTsc()
+ for lnum in range(1, min([line("$"), 25]))
+ if getline(lnum) =~# 'var\s<\|classvar\s<\|\^this.*\||\w\+|\|+\s\w*\s{\|\*ar\s'
+ setf supercollider
+ return
+ endif
+ endfor
+ setf scala
+enddef
+
+# This function checks the first line of file extension "scd" to resolve
+# detection between scdoc and SuperCollider
+export def FTscd()
+ if getline(1) =~# '\%^\S\+(\d[0-9A-Za-z]*)\%(\s\+\"[^"]*\"\%(\s\+\"[^"]*\"\)\=\)\=$'
+ setf scdoc
+ else
+ setf supercollider
+ endif
+enddef
+
+# 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.
+export def FTperl(): number
+ var 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
+ var save_cursor = getpos('.')
+ call cursor(1, 1)
+ var has_use = search('^use\s\s*\k', 'c', 30) > 0
+ call setpos('.', save_cursor)
+ if has_use
+ setf perl
+ return 1
+ endif
+ return 0
+enddef
+
+# LambdaProlog and Standard ML signature files
+export def FTsig()
+ if exists("g:filetype_sig")
+ exe "setf " .. g:filetype_sig
+ return
+ endif
+
+ var lprolog_comment = '^\s*\%(/\*\|%\)'
+ var lprolog_keyword = '^\s*sig\s\+\a'
+ var sml_comment = '^\s*(\*'
+ var sml_keyword = '^\s*\%(signature\|structure\)\s\+\a'
+
+ var line = getline(nextnonblank(1))
+
+ if line =~ lprolog_comment || line =~# lprolog_keyword
+ setf lprolog
+ elseif line =~ sml_comment || line =~# sml_keyword
+ setf sml
+ endif
+enddef
+
+# This function checks the first 100 lines of files matching "*.sil" to
+# resolve detection between Swift Intermediate Language and SILE.
+export def FTsil()
+ for lnum in range(1, [line('$'), 100]->min())
+ var line: string = getline(lnum)
+ if line =~ '^\s*[\\%]'
+ setf sile
+ return
+ elseif line =~ '^\s*\S'
+ setf sil
+ return
+ endif
+ endfor
+ # no clue, default to "sil"
+ setf sil
+enddef
+
+export def FTsys()
+ if exists("g:filetype_sys")
+ exe "setf " .. g:filetype_sys
+ elseif IsRapid()
+ setf rapid
+ else
+ setf bat
+ endif
+enddef
+
+# 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.
+export def FTtex()
+ var firstline = getline(1)
+ var format: string
+ if firstline =~ '^%&\s*\a\+'
+ format = tolower(matchstr(firstline, '\a\+'))
+ format = substitute(format, 'pdf', '', '')
+ if format == 'tex'
+ format = 'latex'
+ elseif format == 'plaintex'
+ format = 'plain'
+ endif
+ elseif expand('%') =~ 'tex/context/.*/.*.tex'
+ format = 'context'
+ else
+ # Default value, may be changed later:
+ format = exists("g:tex_flavor") ? g:tex_flavor : 'plain'
+ # Save position, go to the top of the file, find first non-comment line.
+ var save_cursor = getpos('.')
+ call cursor(1, 1)
+ var firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
+ if firstNC > 0
+ # Check the next thousand lines for a LaTeX or ConTeXt keyword.
+ var lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
+ var 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\>'
+ var kwline = search('^\s*\\\%(' .. lpat .. '\)\|^\s*\\\(' .. cpat .. '\)',
+ 'cnp', firstNC + 1000)
+ if kwline == 1 # lpat matched
+ format = 'latex'
+ elseif kwline == 2 # cpat matched
+ 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
+enddef
+
+export def FTxml()
+ var n = 1
+ while n < 100 && n <= line("$")
+ var line = getline(n)
+ # DocBook 4 or DocBook 5.
+ var is_docbook4 = line =~ '<!DOCTYPE.*DocBook'
+ var is_docbook5 = line =~ ' xmlns="http://docbook.org/ns/docbook"'
+ if is_docbook4 || is_docbook5
+ b:docbk_type = "xml"
+ if is_docbook5
+ b:docbk_ver = 5
+ else
+ b:docbk_ver = 4
+ endif
+ setf docbk
+ return
+ endif
+ if line =~ 'xmlns:xbl="http://www.mozilla.org/xbl"'
+ setf xbl
+ return
+ endif
+ n += 1
+ endwhile
+ setf xml
+enddef
+
+export def FTy()
+ var n = 1
+ while n < 100 && n <= line("$")
+ var line = getline(n)
+ if line =~ '^\s*%'
+ setf yacc
+ return
+ endif
+ if getline(n) =~ '^\s*\(#\|class\>\)' && getline(n) !~ '^\s*#\s*include'
+ setf racc
+ return
+ endif
+ n += 1
+ endwhile
+ setf yacc
+enddef
+
+export def Redif()
+ var lnum = 1
+ while lnum <= 5 && lnum < line('$')
+ if getline(lnum) =~ "^\ctemplate-type:"
+ setf redif
+ return
+ endif
+ lnum += 1
+ endwhile
+enddef
+
+# This function is called for all files under */debian/patches/*, make sure not
+# to non-dep3patch files, such as README and other text files.
+export def Dep3patch()
+ if expand('%:t') ==# 'series'
+ return
+ endif
+
+ for ln in getline(1, 100)
+ if ln =~# '^\%(Description\|Subject\|Origin\|Bug\|Forwarded\|Author\|From\|Reviewed-by\|Acked-by\|Last-Updated\|Applied-Upstream\):'
+ setf dep3patch
+ return
+ elseif ln =~# '^---'
+ # end of headers found. stop processing
+ return
+ endif
+ endfor
+enddef
+
+# This function checks the first 15 lines for appearance of 'FoamFile'
+# and then 'object' in a following line.
+# In that case, it's probably an OpenFOAM file
+export def FTfoam()
+ var ffile = 0
+ var lnum = 1
+ while lnum <= 15
+ if getline(lnum) =~# '^FoamFile'
+ ffile = 1
+ elseif ffile == 1 && getline(lnum) =~# '^\s*object'
+ setf foam
+ return
+ endif
+ lnum += 1
+ endwhile
+enddef
+
+# Determine if a *.tf file is TF mud client or terraform
+export def FTtf()
+ var numberOfLines = line('$')
+ for i in range(1, numberOfLines)
+ var currentLine = trim(getline(i))
+ var firstCharacter = currentLine[0]
+ if firstCharacter !=? ";" && firstCharacter !=? "/" && firstCharacter !=? ""
+ setf terraform
+ return
+ endif
+ endfor
+ setf tf
+enddef
+
+var ft_krl_header = '\&\w+'
+# Determine if a *.src file is Kuka Robot Language
+export def FTsrc()
+ var ft_krl_def_or_deffct = '%(global\s+)?def%(fct)?>'
+ if exists("g:filetype_src")
+ exe "setf " .. g:filetype_src
+ elseif getline(nextnonblank(1)) =~? '\v^\s*%(' .. ft_krl_header .. '|' .. ft_krl_def_or_deffct .. ')'
+ setf krl
+ endif
+enddef
+
+# Determine if a *.dat file is Kuka Robot Language
+export def FTdat()
+ var ft_krl_defdat = 'defdat>'
+ if exists("g:filetype_dat")
+ exe "setf " .. g:filetype_dat
+ elseif getline(nextnonblank(1)) =~? '\v^\s*%(' .. ft_krl_header .. '|' .. ft_krl_defdat .. ')'
+ setf krl
+ endif
+enddef
+
+export def FTlsl()
+ if exists("g:filetype_lsl")
+ exe "setf " .. g:filetype_lsl
+ endif
+
+ var line = getline(nextnonblank(1))
+ if line =~ '^\s*%' || line =~# ':\s*trait\s*$'
+ setf larch
+ else
+ setf lsl
+ endif
+enddef
+
+# Uncomment this line to check for compilation errors early
+# defcompile
diff --git a/runtime/autoload/dist/man.vim b/runtime/autoload/dist/man.vim
new file mode 100644
index 0000000..cd584aa
--- /dev/null
+++ b/runtime/autoload/dist/man.vim
@@ -0,0 +1,196 @@
+" Vim filetype plugin autoload file
+" Language: man
+" Maintainer: Jason Franklin <vim@justemail.net>
+" Maintainer: SungHyun Nam <goweol@gmail.com>
+" Autoload Split: Bram Moolenaar
+" Last Change: 2022 Jun 18
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+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
+
+func dist#man#PreGetPage(cnt)
+ if a:cnt == 0
+ let old_isk = &iskeyword
+ if &ft == 'man'
+ setl iskeyword+=(,)
+ endif
+ let str = expand("<cword>")
+ let &l:iskeyword = old_isk
+ let page = substitute(str, '(*\(\k\+\).*', '\1', '')
+ let sect = substitute(str, '\(\k\+\)(\([^()]*\)).*', '\2', '')
+ if match(sect, '^[0-9 ]\+$') == -1
+ let sect = ""
+ endif
+ if sect == page
+ let sect = ""
+ endif
+ else
+ let sect = a:cnt
+ let page = expand("<cword>")
+ endif
+ call dist#man#GetPage('', sect, page)
+endfunc
+
+func s:GetCmdArg(sect, page)
+
+ if empty(a:sect)
+ return shellescape(a:page)
+ endif
+
+ return s:man_sect_arg . ' ' . shellescape(a:sect) . ' ' . shellescape(a:page)
+endfunc
+
+func s:FindPage(sect, page)
+ let l:cmd = printf('man %s %s', s:man_find_arg, s:GetCmdArg(a:sect, a:page))
+ call system(l:cmd)
+
+ if v:shell_error
+ return 0
+ endif
+
+ return 1
+endfunc
+
+func dist#man#GetPage(cmdmods, ...)
+ if a:0 >= 2
+ let sect = a:1
+ let page = a:2
+ elseif a:0 >= 1
+ let sect = ""
+ let page = a:1
+ else
+ return
+ endif
+
+ " To support: nmap K :Man <cword>
+ if page == '<cword>'
+ let page = expand('<cword>')
+ endif
+
+ if !exists('g:ft_man_no_sect_fallback') || (g:ft_man_no_sect_fallback == 0)
+ if sect != "" && s:FindPage(sect, page) == 0
+ let sect = ""
+ endif
+ endif
+ if s:FindPage(sect, page) == 0
+ let msg = 'man.vim: no manual entry for "' . page . '"'
+ if !empty(sect)
+ let msg .= ' in section ' . sect
+ endif
+ echomsg msg
+ return
+ endif
+ 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 open_cmd = 'edit'
+
+ " Use an existing "man" window if it exists, otherwise open a new one.
+ if &filetype != "man"
+ let thiswin = winnr()
+ exe "norm! \<C-W>b"
+ if winnr() > 1
+ exe "norm! " . thiswin . "\<C-W>w"
+ while 1
+ if &filetype == "man"
+ break
+ endif
+ exe "norm! \<C-W>w"
+ if thiswin == winnr()
+ break
+ endif
+ endwhile
+ endif
+ if &filetype != "man"
+ if exists("g:ft_man_open_mode")
+ if g:ft_man_open_mode == 'vert'
+ let open_cmd = 'vsplit'
+ elseif g:ft_man_open_mode == 'tab'
+ let open_cmd = 'tabedit'
+ else
+ let open_cmd = 'split'
+ endif
+ else
+ let open_cmd = a:cmdmods . ' split'
+ endif
+ endif
+ endif
+
+ silent execute open_cmd . " $HOME/" . page . '.' . sect . '~'
+
+ " Avoid warning for editing the dummy file twice
+ setl buftype=nofile noswapfile
+
+ setl fdc=0 ma nofen nonu nornu
+ %delete _
+ let unsetwidth = 0
+ if empty($MANWIDTH)
+ let $MANWIDTH = winwidth(0)
+ let unsetwidth = 1
+ endif
+
+ " Ensure Vim is not recursively invoked (man-db does this) when doing ctrl-[
+ " on a man page reference by unsetting MANPAGER.
+ " Some versions of env(1) do not support the '-u' option, and in such case
+ " we set MANPAGER=cat.
+ if !exists('s:env_has_u')
+ call system('env -u x true')
+ let s:env_has_u = (v:shell_error == 0)
+ endif
+ let env_cmd = s:env_has_u ? 'env -u MANPAGER' : 'env MANPAGER=cat'
+ let env_cmd .= ' GROFF_NO_SGR=1'
+ let man_cmd = env_cmd . ' man ' . s:GetCmdArg(sect, page) . ' | col -b'
+ silent exec "r !" . man_cmd
+
+ if unsetwidth
+ let $MANWIDTH = ''
+ endif
+ " Remove blank lines from top and bottom.
+ while line('$') > 1 && getline(1) =~ '^\s*$'
+ 1delete _
+ endwhile
+ while line('$') > 1 && getline('$') =~ '^\s*$'
+ $delete _
+ endwhile
+ 1
+ setl ft=man nomod
+ setl bufhidden=hide
+ setl nobuflisted
+ setl noma
+endfunc
+
+func dist#man#PopPage()
+ 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
+ endif
+endfunc
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: set sw=2 ts=8 noet:
diff --git a/runtime/autoload/dist/script.vim b/runtime/autoload/dist/script.vim
new file mode 100644
index 0000000..f86c428
--- /dev/null
+++ b/runtime/autoload/dist/script.vim
@@ -0,0 +1,434 @@
+vim9script
+
+# Vim function for detecting a filetype from the file contents.
+# Invoked from "scripts.vim" in 'runtimepath'
+#
+# Maintainer: Bram Moolenaar <Bram@vim.org>
+# Last Change: 2022 Nov 24
+
+export def DetectFiletype()
+ var line1 = getline(1)
+ if line1[0] == '#' && line1[1] == '!'
+ # File that starts with "#!".
+ DetectFromHashBang(line1)
+ else
+ # File does not start with "#!".
+ DetectFromText(line1)
+ endif
+enddef
+
+# Called for a script that has "#!" in the first line.
+def DetectFromHashBang(firstline: string)
+ var line1 = firstline
+
+ # Check for a line like "#!/usr/bin/env {options} bash". Turn it into
+ # "#!/usr/bin/bash" to make matching easier.
+ # Recognize only a few {options} that are commonly used.
+ if line1 =~ '^#!\s*\S*\<env\s'
+ line1 = substitute(line1, '\S\+=\S\+', '', 'g')
+ line1 = substitute(line1, '\(-[iS]\|--ignore-environment\|--split-string\)', '', '')
+ line1 = substitute(line1, '\<env\s\+', '', '')
+ endif
+
+ # Get the program name.
+ # Only accept spaces in PC style paths: "#!c:/program files/perl [args]".
+ # If the word env is used, use the first word after the space:
+ # "#!/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]".
+ var name: string
+ if line1 =~ '^#!\s*\a:[/\\]'
+ name = substitute(line1, '^#!.*[/\\]\(\i\+\).*', '\1', '')
+ elseif line1 =~ '^#!.*\<env\>'
+ name = substitute(line1, '^#!.*\<env\>\s\+\(\i\+\).*', '\1', '')
+ elseif line1 =~ '^#!\s*[^/\\ ]*\>\([^/\\]\|$\)'
+ name = substitute(line1, '^#!\s*\([^/\\ ]*\>\).*', '\1', '')
+ else
+ name = substitute(line1, '^#!\s*\S*[/\\]\(\i\+\).*', '\1', '')
+ endif
+
+ # 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'
+ name = 'wish'
+ endif
+
+ # Bourne-like shell scripts: bash bash2 dash ksh ksh93 sh
+ if name =~ '^\(bash\d*\|dash\|ksh\d*\|sh\)\>'
+ call dist#ft#SetFileTypeSH(line1)
+
+ # csh scripts
+ elseif name =~ '^csh\>'
+ if exists("g:filetype_csh")
+ call dist#ft#SetFileTypeShell(g:filetype_csh)
+ else
+ call dist#ft#SetFileTypeShell("csh")
+ endif
+
+ # tcsh scripts
+ elseif name =~ '^tcsh\>'
+ call dist#ft#SetFileTypeShell("tcsh")
+
+ # Z shell scripts
+ elseif name =~ '^zsh\>'
+ set ft=zsh
+
+ # TCL scripts
+ elseif name =~ '^\(tclsh\|wish\|expectk\|itclsh\|itkwish\)\>'
+ set ft=tcl
+
+ # Expect scripts
+ elseif name =~ '^expect\>'
+ set ft=expect
+
+ # Gnuplot scripts
+ elseif name =~ '^gnuplot\>'
+ set ft=gnuplot
+
+ # Makefiles
+ elseif name =~ 'make\>'
+ set ft=make
+
+ # Pike
+ elseif name =~ '^pike\%(\>\|[0-9]\)'
+ set ft=pike
+
+ # Lua
+ elseif name =~ 'lua'
+ set ft=lua
+
+ # Perl
+ elseif name =~ 'perl'
+ set ft=perl
+
+ # PHP
+ elseif name =~ 'php'
+ set ft=php
+
+ # Python
+ elseif name =~ 'python'
+ set ft=python
+
+ # Groovy
+ elseif name =~ '^groovy\>'
+ set ft=groovy
+
+ # Raku
+ elseif name =~ 'raku'
+ set ft=raku
+
+ # Ruby
+ elseif name =~ 'ruby'
+ set ft=ruby
+
+ # JavaScript
+ elseif name =~ 'node\(js\)\=\>\|js\>' || name =~ 'rhino\>'
+ set ft=javascript
+
+ # BC calculator
+ elseif name =~ '^bc\>'
+ set ft=bc
+
+ # sed
+ elseif name =~ 'sed\>'
+ set ft=sed
+
+ # OCaml-scripts
+ elseif name =~ 'ocaml'
+ set ft=ocaml
+
+ # Awk scripts; also finds "gawk"
+ elseif name =~ 'awk\>'
+ set ft=awk
+
+ # Website MetaLanguage
+ elseif name =~ 'wml'
+ set ft=wml
+
+ # Scheme scripts
+ elseif name =~ 'scheme'
+ set ft=scheme
+
+ # CFEngine scripts
+ elseif name =~ 'cfengine'
+ set ft=cfengine
+
+ # Erlang scripts
+ elseif name =~ 'escript'
+ set ft=erlang
+
+ # Haskell
+ elseif name =~ 'haskell'
+ set ft=haskell
+
+ # Scala
+ elseif name =~ 'scala\>'
+ set ft=scala
+
+ # Clojure
+ elseif name =~ 'clojure'
+ set ft=clojure
+
+ # Free Pascal
+ elseif name =~ 'instantfpc\>'
+ set ft=pascal
+
+ # Fennel
+ elseif name =~ 'fennel\>'
+ set ft=fennel
+
+ # MikroTik RouterOS script
+ elseif name =~ 'rsc\>'
+ set ft=routeros
+
+ # Fish shell
+ elseif name =~ 'fish\>'
+ set ft=fish
+
+ # Gforth
+ elseif name =~ 'gforth\>'
+ set ft=forth
+
+ # Icon
+ elseif name =~ 'icon\>'
+ set ft=icon
+
+ # Guile
+ elseif name =~ 'guile'
+ set ft=scheme
+
+ endif
+enddef
+
+
+# Called for a script that does not have "#!" in the first line.
+def DetectFromText(line1: string)
+ var line2 = getline(2)
+ var line3 = getline(3)
+ var line4 = getline(4)
+ var line5 = getline(5)
+
+ # Bourne-like shell scripts: sh ksh bash bash2
+ if line1 =~ '^:$'
+ call dist#ft#SetFileTypeSH(line1)
+
+ # Z shell scripts
+ elseif line1 =~ '^#compdef\>'
+ || line1 =~ '^#autoload\>'
+ || "\n" .. line1 .. "\n" .. line2 .. "\n" .. line3 ..
+ "\n" .. line4 .. "\n" .. line5
+ =~ '\n\s*emulate\s\+\%(-[LR]\s\+\)\=[ckz]\=sh\>'
+ set ft=zsh
+
+ # ELM Mail files
+ elseif line1 =~ '^From \([a-zA-Z][a-zA-Z_0-9\.=-]*\(@[^ ]*\)\=\|-\) .* \(19\|20\)\d\d$'
+ set ft=mail
+
+ # Mason
+ elseif line1 =~ '^<[%&].*>'
+ set ft=mason
+
+ # Vim scripts (must have '" vim' as the first line to trigger this)
+ elseif line1 =~ '^" *[vV]im$'
+ set ft=vim
+
+ # libcxx and libstdc++ standard library headers like "iostream" do not have
+ # an extension, recognize the Emacs file mode.
+ elseif line1 =~? '-\*-.*C++.*-\*-'
+ set ft=cpp
+
+ # MOO
+ elseif line1 =~ '^\*\* LambdaMOO Database, Format Version \%([1-3]\>\)\@!\d\+ \*\*$'
+ set ft=moo
+
+ # Diff file:
+ # - "diff" in first line (context diff)
+ # - "Only in " in first line
+ # - "--- " in first line and "+++ " in second line (unified diff).
+ # - "*** " in first line and "--- " in second line (context diff).
+ # - "# It was generated by makepatch " in the second line (makepatch diff).
+ # - "Index: <filename>" in the first line (CVS file)
+ # - "=== ", line of "=", "---", "+++ " (SVK diff)
+ # - "=== ", "--- ", "+++ " (bzr diff, common case)
+ # - "=== (removed|added|renamed|modified)" (bzr diff, alternative)
+ # - "# HG changeset patch" in first line (Mercurial export format)
+ elseif 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\)'
+ || (line1 =~ '^--- ' && line2 =~ '^+++ ')
+ || (line1 =~ '^\* looking for ' && line2 =~ '^\* comparing to ')
+ || (line1 =~ '^\*\*\* ' && line2 =~ '^--- ')
+ || (line1 =~ '^=== ' && ((line2 =~ '^=\{66\}' && line3 =~ '^--- ' && line4 =~ '^+++') || (line2 =~ '^--- ' && line3 =~ '^+++ ')))
+ || (line1 =~ '^=== \(removed\|added\|renamed\|modified\)')
+ set ft=diff
+
+ # PostScript Files (must have %!PS as the first line, like a2ps output)
+ elseif line1 =~ '^%![ \t]*PS'
+ set ft=postscr
+
+ # M4 scripts: Guess there is a line that starts with "dnl".
+ elseif line1 =~ '^\s*dnl\>'
+ || line2 =~ '^\s*dnl\>'
+ || line3 =~ '^\s*dnl\>'
+ || line4 =~ '^\s*dnl\>'
+ || line5 =~ '^\s*dnl\>'
+ set ft=m4
+
+ # AmigaDos scripts
+ elseif $TERM == "amiga" && (line1 =~ "^;" || line1 =~? '^\.bra')
+ set ft=amiga
+
+ # SiCAD scripts (must have procn or procd as the first line to trigger this)
+ elseif line1 =~? '^ *proc[nd] *$'
+ set ft=sicad
+
+ # Purify log files start with "**** Purify"
+ elseif line1 =~ '^\*\*\*\* Purify'
+ set ft=purifylog
+
+ # XML
+ elseif line1 =~ '<?\s*xml.*?>'
+ set ft=xml
+
+ # XHTML (e.g.: PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN")
+ elseif line1 =~ '\<DTD\s\+XHTML\s'
+ set ft=xhtml
+
+ # HTML (e.g.: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN")
+ # Avoid "doctype html", used by slim.
+ elseif line1 =~? '<!DOCTYPE\s\+html\>'
+ set ft=html
+
+ # PDF
+ elseif line1 =~ '^%PDF-'
+ set ft=pdf
+
+ # XXD output
+ elseif line1 =~ '^\x\{7}: \x\{2} \=\x\{2} \=\x\{2} \=\x\{2} '
+ set ft=xxd
+
+ # RCS/CVS log output
+ elseif line1 =~ '^RCS file:' || line2 =~ '^RCS file:'
+ set ft=rcslog
+
+ # CVS commit
+ elseif line2 =~ '^CVS:' || getline("$") =~ '^CVS: '
+ set ft=cvs
+
+ # Prescribe
+ elseif line1 =~ '^!R!'
+ set ft=prescribe
+
+ # Send-pr
+ elseif line1 =~ '^SEND-PR:'
+ set ft=sendpr
+
+ # SNNS files
+ elseif line1 =~ '^SNNS network definition file'
+ set ft=snnsnet
+ elseif line1 =~ '^SNNS pattern definition file'
+ set ft=snnspat
+ elseif line1 =~ '^SNNS result file'
+ set ft=snnsres
+
+ # Virata
+ elseif line1 =~ '^%.\{-}[Vv]irata'
+ || line2 =~ '^%.\{-}[Vv]irata'
+ || line3 =~ '^%.\{-}[Vv]irata'
+ || line4 =~ '^%.\{-}[Vv]irata'
+ || line5 =~ '^%.\{-}[Vv]irata'
+ set ft=virata
+
+ # Strace
+ elseif line1 =~ '[0-9:.]* *execve(' || line1 =~ '^__libc_start_main'
+ set ft=strace
+
+ # VSE JCL
+ elseif line1 =~ '^\* $$ JOB\>' || line1 =~ '^// *JOB\>'
+ set ft=vsejcl
+
+ # TAK and SINDA
+ elseif line4 =~ 'K & K Associates' || line2 =~ 'TAK 2000'
+ set ft=takout
+ elseif line3 =~ 'S Y S T E M S I M P R O V E D '
+ set ft=sindaout
+ elseif getline(6) =~ 'Run Date: '
+ set ft=takcmp
+ elseif getline(9) =~ 'Node File 1'
+ set ft=sindacmp
+
+ # DNS zone files
+ elseif line1 .. line2 .. line3 .. line4 =~ '^; <<>> DiG [0-9.]\+.* <<>>\|$ORIGIN\|$TTL\|IN\s\+SOA'
+ set ft=bindzone
+
+ # BAAN
+ elseif line1 =~ '|\*\{1,80}' && line2 =~ 'VRC '
+ || line2 =~ '|\*\{1,80}' && line3 =~ 'VRC '
+ set ft=baan
+
+ # Valgrind
+ elseif line1 =~ '^==\d\+== valgrind' || line3 =~ '^==\d\+== Using valgrind'
+ set ft=valgrind
+
+ # Go docs
+ elseif line1 =~ '^PACKAGE DOCUMENTATION$'
+ set ft=godoc
+
+ # Renderman Interface Bytestream
+ elseif line1 =~ '^##RenderMan'
+ set ft=rib
+
+ # Scheme scripts
+ elseif line1 =~ 'exec\s\+\S*scheme' || line2 =~ 'exec\s\+\S*scheme'
+ set ft=scheme
+
+ # Git output
+ elseif line1 =~ '^\(commit\|tree\|object\) \x\{40,\}\>\|^tag \S\+$'
+ set ft=git
+
+ # Gprof (gnu profiler)
+ elseif line1 == 'Flat profile:'
+ && line2 == ''
+ && line3 =~ '^Each sample counts as .* seconds.$'
+ set ft=gprof
+
+ # Erlang terms
+ # (See also: http://www.gnu.org/software/emacs/manual/html_node/emacs/Choosing-Modes.html#Choosing-Modes)
+ elseif line1 =~? '-\*-.*erlang.*-\*-'
+ set ft=erlang
+
+ # YAML
+ elseif line1 =~ '^%YAML'
+ set ft=yaml
+
+ # MikroTik RouterOS script
+ elseif line1 =~ '^#.*by RouterOS.*$'
+ set ft=routeros
+
+ # Sed scripts
+ # #ncomment is allowed but most likely a false positive so require a space
+ # before any trailing comment text
+ elseif line1 =~ '^#n\%($\|\s\)'
+ set ft=sed
+
+ else
+ var lnum = 1
+ while getline(lnum) =~ "^? " && lnum < line("$")
+ lnum += 1
+ endwhile
+ if getline(lnum) =~ '^Index:\s\+\f\+$'
+ # CVS diff
+ 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_'
+ lnum = 1
+ while lnum < 100 && lnum < line("$")
+ if getline(lnum) =~ '^LC_\(IDENTIFICATION\|CTYPE\|COLLATE\|MONETARY\|NUMERIC\|TIME\|MESSAGES\|PAPER\|TELEPHONE\|MEASUREMENT\|NAME\|ADDRESS\)$'
+ setf fdcc
+ break
+ endif
+ lnum += 1
+ endwhile
+ endif
+ endif
+enddef
diff --git a/runtime/autoload/dist/vimindent.vim b/runtime/autoload/dist/vimindent.vim
new file mode 100644
index 0000000..1306d1e
--- /dev/null
+++ b/runtime/autoload/dist/vimindent.vim
@@ -0,0 +1,1257 @@
+vim9script
+
+# Language: Vim script
+# Maintainer: github user lacygoill
+# Last Change: 2023 Feb 01
+
+# NOTE: Whenever you change the code, make sure the tests are still passing:
+#
+# $ cd runtime/indent/
+# $ make clean; make test || vimdiff testdir/vim.{ok,fail}
+
+# Config {{{1
+
+const TIMEOUT: number = get(g:, 'vim_indent', {})
+ ->get('searchpair_timeout', 100)
+
+def IndentMoreInBracketBlock(): number # {{{2
+ if get(g:, 'vim_indent', {})
+ ->get('more_in_bracket_block', false)
+ return shiftwidth()
+ else
+ return 0
+ endif
+enddef
+
+def IndentMoreLineContinuation(): number # {{{2
+ var n: any = get(g:, 'vim_indent', {})
+ # We inspect `g:vim_indent_cont` to stay backward compatible.
+ ->get('line_continuation', get(g:, 'vim_indent_cont', shiftwidth() * 3))
+
+ if n->typename() == 'string'
+ return n->eval()
+ else
+ return n
+ endif
+enddef
+# }}}2
+
+# Init {{{1
+var patterns: list<string>
+# Tokens {{{2
+# BAR_SEPARATION {{{3
+
+const BAR_SEPARATION: string = '[^|\\]\@1<=|'
+
+# OPENING_BRACKET {{{3
+
+const OPENING_BRACKET: string = '[[{(]'
+
+# CLOSING_BRACKET {{{3
+
+const CLOSING_BRACKET: string = '[]})]'
+
+# NON_BRACKET {{{3
+
+const NON_BRACKET: string = '[^[\]{}()]'
+
+# LIST_OR_DICT_CLOSING_BRACKET {{{3
+
+const LIST_OR_DICT_CLOSING_BRACKET: string = '[]}]'
+
+# LIST_OR_DICT_OPENING_BRACKET {{{3
+
+const LIST_OR_DICT_OPENING_BRACKET: string = '[[{]'
+
+# CHARACTER_UNDER_CURSOR {{{3
+
+const CHARACTER_UNDER_CURSOR: string = '\%.c.'
+
+# INLINE_COMMENT {{{3
+
+# TODO: It is not required for an inline comment to be surrounded by whitespace.
+# But it might help against false positives.
+# To be more reliable, we should inspect the syntax, and only require whitespace
+# before the `#` comment leader. But that might be too costly (because of
+# `synstack()`).
+const INLINE_COMMENT: string = '\s[#"]\%(\s\|[{}]\{3}\)'
+
+# INLINE_VIM9_COMMENT {{{3
+
+const INLINE_VIM9_COMMENT: string = '\s#'
+
+# COMMENT {{{3
+
+# TODO: Technically, `"\s` is wrong.
+#
+# First, whitespace is not required.
+# Second, in Vim9, a string might appear at the start of the line.
+# To be sure, we should also inspect the syntax.
+# We can't use `INLINE_COMMENT` here. {{{
+#
+# const COMMENT: string = $'^\s*{INLINE_COMMENT}'
+# ^------------^
+# ✘
+#
+# Because `INLINE_COMMENT` asserts the presence of a whitespace before the
+# comment leader. This assertion is not satisfied for a comment starting at the
+# start of the line.
+#}}}
+const COMMENT: string = '^\s*\%(#\|"\\\=\s\).*$'
+
+# DICT_KEY {{{3
+
+const DICT_KEY: string = '^\s*\%('
+ .. '\%(\w\|-\)\+'
+ .. '\|'
+ .. '"[^"]*"'
+ .. '\|'
+ .. "'[^']*'"
+ .. '\|'
+ .. '\[[^]]\+\]'
+ .. '\)'
+ .. ':\%(\s\|$\)'
+
+# NOT_A_DICT_KEY {{{3
+
+const NOT_A_DICT_KEY: string = ':\@!'
+
+# END_OF_COMMAND {{{3
+
+const END_OF_COMMAND: string = $'\s*\%($\|||\@!\|{INLINE_COMMENT}\)'
+
+# END_OF_LINE {{{3
+
+const END_OF_LINE: string = $'\s*\%($\|{INLINE_COMMENT}\)'
+
+# END_OF_VIM9_LINE {{{3
+
+const END_OF_VIM9_LINE: string = $'\s*\%($\|{INLINE_VIM9_COMMENT}\)'
+
+# OPERATOR {{{3
+
+const OPERATOR: string = '\%(^\|\s\)\%([-+*/%]\|\.\.\|||\|&&\|??\|?\|<<\|>>\|\%([=!]=\|[<>]=\=\|[=!]\~\|is\|isnot\)[?#]\=\)\%(\s\|$\)\@=\%(\s*[|<]\)\@!'
+ # assignment operators
+ .. '\|' .. '\s\%([-+*/%]\|\.\.\)\==\%(\s\|$\)\@='
+ # support `:` when used inside conditional operator `?:`
+ .. '\|' .. '\%(\s\|^\):\%(\s\|$\)'
+
+# HEREDOC_OPERATOR {{{3
+
+const HEREDOC_OPERATOR: string = '\s=<<\s\@=\%(\s\+\%(trim\|eval\)\)\{,2}'
+
+# PATTERN_DELIMITER {{{3
+
+# A better regex would be:
+#
+# [^-+*/%.:# \t[:alnum:]\"|]\@=.\|->\@!\%(=\s\)\@!\|[+*/%]\%(=\s\)\@!
+#
+# But sometimes, it can be too costly and cause `E363` to be given.
+const PATTERN_DELIMITER: string = '[-+*/%]\%(=\s\)\@!'
+# }}}2
+# Syntaxes {{{2
+# BLOCKS {{{3
+
+const BLOCKS: list<list<string>> = [
+ ['if', 'el\%[se]', 'elseif\=', 'en\%[dif]'],
+ ['for', 'endfor\='],
+ ['wh\%[ile]', 'endw\%[hile]'],
+ ['try', 'cat\%[ch]', 'fina\|finally\=', 'endt\%[ry]'],
+ ['def', 'enddef'],
+ ['fu\%[nction](\@!', 'endf\%[unction]'],
+ ['class', 'endclass'],
+ ['interface', 'endinterface'],
+ ['enum', 'endenum'],
+ ['aug\%[roup]\%(\s\+[eE][nN][dD]\)\@!\s\+\S\+', 'aug\%[roup]\s\+[eE][nN][dD]'],
+]
+
+# MODIFIERS {{{3
+
+# some keywords can be prefixed by modifiers (e.g. `def` can be prefixed by `export`)
+const MODIFIERS: dict<string> = {
+ def: ['export', 'static'],
+ class: ['export', 'abstract', 'export abstract'],
+ interface: ['export'],
+}
+# ...
+# class: ['export', 'abstract', 'export abstract'],
+# ...
+# →
+# ...
+# class: '\%(export\|abstract\|export\s\+abstract\)\s\+',
+# ...
+->map((_, mods: list<string>): string =>
+ '\%(' .. mods
+ ->join('\|')
+ ->substitute('\s\+', '\\s\\+', 'g')
+ .. '\)' .. '\s\+')
+
+# HIGHER_ORDER_COMMAND {{{3
+
+patterns =<< trim eval END
+ argdo\>!\=
+ bufdo\>!\=
+ cdo\>!\=
+ folddoc\%[losed]\>
+ foldd\%[oopen]\>
+ ldo\=\>!\=
+ tabdo\=\>
+ windo\>
+ au\%[tocmd]\>.*
+ com\%[mand]\>.*
+ g\%[lobal]!\={PATTERN_DELIMITER}.*
+ v\%[global]!\={PATTERN_DELIMITER}.*
+END
+
+const HIGHER_ORDER_COMMAND: string = $'\%(^\|{BAR_SEPARATION}\)\s*\<\%({patterns->join('\|')}\){NOT_A_DICT_KEY}'
+
+# START_MIDDLE_END {{{3
+
+# Let's derive this constant from `BLOCKS`:
+#
+# [['if', 'el\%[se]', 'elseif\=', 'en\%[dif]'],
+# ['for', 'endfor\='],
+# ...,
+# [...]]
+# →
+# {
+# 'for': ['for', '', 'endfor\='],
+# 'endfor': ['for', '', 'endfor\='],
+# 'if': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
+# 'else': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
+# 'elseif': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
+# 'endif': ['if', 'el\%[se]\|elseif\=', 'en\%[dif]'],
+# ...
+# }
+var START_MIDDLE_END: dict<list<string>>
+
+def Unshorten(kwd: string): string
+ return BlockStartKeyword(kwd)
+enddef
+
+def BlockStartKeyword(line: string): string
+ var kwd: string = line->matchstr('\l\+')
+ return fullcommand(kwd, false)
+enddef
+
+{
+ for kwds: list<string> in BLOCKS
+ var [start: string, middle: string, end: string] = [kwds[0], '', kwds[-1]]
+ if MODIFIERS->has_key(start->Unshorten())
+ start = $'\%({MODIFIERS[start]}\)\={start}'
+ endif
+ if kwds->len() > 2
+ middle = kwds[1 : -2]->join('\|')
+ endif
+ for kwd: string in kwds
+ START_MIDDLE_END->extend({[kwd->Unshorten()]: [start, middle, end]})
+ endfor
+ endfor
+}
+
+START_MIDDLE_END = START_MIDDLE_END
+ ->map((_, kwds: list<string>) =>
+ kwds->map((_, kwd: string) => kwd == ''
+ ? ''
+ : $'\%(^\|{BAR_SEPARATION}\|\<sil\%[ent]\|{HIGHER_ORDER_COMMAND}\)\s*'
+ .. $'\<\%({kwd}\)\>\%(\s*{OPERATOR}\)\@!'))
+
+lockvar! START_MIDDLE_END
+
+# ENDS_BLOCK {{{3
+
+const ENDS_BLOCK: string = '^\s*\%('
+ .. BLOCKS
+ ->copy()
+ ->map((_, kwds: list<string>): string => kwds[-1])
+ ->join('\|')
+ .. '\|' .. CLOSING_BRACKET
+ .. $'\){END_OF_COMMAND}'
+
+# ENDS_BLOCK_OR_CLAUSE {{{3
+
+patterns = BLOCKS
+ ->copy()
+ ->map((_, kwds: list<string>) => kwds[1 :])
+ ->flattennew()
+ # `catch` and `elseif` need to be handled as special cases
+ ->filter((_, pat: string): bool => pat->Unshorten() !~ '^\%(catch\|elseif\)\>')
+
+const ENDS_BLOCK_OR_CLAUSE: string = '^\s*\%(' .. patterns->join('\|') .. $'\){END_OF_COMMAND}'
+ .. $'\|^\s*cat\%[ch]\%(\s\+\({PATTERN_DELIMITER}\).*\1\)\={END_OF_COMMAND}'
+ .. $'\|^\s*elseif\=\>\%({OPERATOR}\)\@!'
+
+# STARTS_NAMED_BLOCK {{{3
+
+patterns = []
+{
+ for kwds: list<string> in BLOCKS
+ for kwd: string in kwds[0 : -2]
+ if MODIFIERS->has_key(kwd->Unshorten())
+ patterns += [$'\%({MODIFIERS[kwd]}\)\={kwd}']
+ else
+ patterns += [kwd]
+ endif
+ endfor
+ endfor
+}
+
+const STARTS_NAMED_BLOCK: string = $'^\s*\%(sil\%[ent]\s\+\)\=\%({patterns->join('\|')}\)\>{NOT_A_DICT_KEY}'
+
+# STARTS_CURLY_BLOCK {{{3
+
+# TODO: `{` alone on a line is not necessarily the start of a block.
+# It could be a dictionary if the previous line ends with a binary/ternary
+# operator. This can cause an issue whenever we use `STARTS_CURLY_BLOCK` or
+# `LINE_CONTINUATION_AT_EOL`.
+const STARTS_CURLY_BLOCK: string = '\%('
+ .. '^\s*{'
+ .. '\|' .. '^.*\zs\s=>\s\+{'
+ .. '\|' .. $'^\%(\s*\|.*{BAR_SEPARATION}\s*\)\%(com\%[mand]\|au\%[tocmd]\).*\zs\s{{'
+ .. '\)' .. END_OF_COMMAND
+
+# STARTS_FUNCTION {{{3
+
+const STARTS_FUNCTION: string = $'^\s*\%({MODIFIERS.def}\)\=def\>{NOT_A_DICT_KEY}'
+
+# ENDS_FUNCTION {{{3
+
+const ENDS_FUNCTION: string = $'^\s*enddef\>{END_OF_COMMAND}'
+
+# ASSIGNS_HEREDOC {{{3
+
+const ASSIGNS_HEREDOC: string = $'^\%({COMMENT}\)\@!.*\%({HEREDOC_OPERATOR}\)\s\+\zs[A-Z]\+{END_OF_LINE}'
+
+# PLUS_MINUS_COMMAND {{{3
+
+# In legacy, the `:+` and `:-` commands are not required to be preceded by a colon.
+# As a result, when `+` or `-` is alone on a line, there is ambiguity.
+# It might be an operator or a command.
+# To not break the indentation in legacy scripts, we might need to consider such
+# lines as commands.
+const PLUS_MINUS_COMMAND: string = '^\s*[+-]\s*$'
+
+# TRICKY_COMMANDS {{{3
+
+# Some commands are tricky because they accept an argument which can be
+# conflated with an operator. Examples:
+#
+# argdelete *
+# cd -
+# normal! ==
+# nunmap <buffer> (
+#
+# TODO: Other commands might accept operators as argument. Handle them too.
+patterns =<< trim eval END
+ {'\'}<argd\%[elete]\s\+\*\s*$
+ \<[lt]\=cd!\=\s\+-\s*$
+ \<norm\%[al]!\=\s*\S\+$
+ \%(\<sil\%[ent]!\=\s\+\)\=\<[nvxsoilct]\=\%(nore\|un\)map!\=\s
+ {PLUS_MINUS_COMMAND}
+END
+
+const TRICKY_COMMANDS: string = patterns->join('\|')
+# }}}2
+# EOL {{{2
+# OPENING_BRACKET_AT_EOL {{{3
+
+const OPENING_BRACKET_AT_EOL: string = OPENING_BRACKET .. END_OF_VIM9_LINE
+
+# CLOSING_BRACKET_AT_EOL {{{3
+
+const CLOSING_BRACKET_AT_EOL: string = CLOSING_BRACKET .. END_OF_VIM9_LINE
+
+# COMMA_AT_EOL {{{3
+
+const COMMA_AT_EOL: string = $',{END_OF_VIM9_LINE}'
+
+# COMMA_OR_DICT_KEY_AT_EOL {{{3
+
+const COMMA_OR_DICT_KEY_AT_EOL: string = $'\%(,\|{DICT_KEY}\){END_OF_VIM9_LINE}'
+
+# LAMBDA_ARROW_AT_EOL {{{3
+
+const LAMBDA_ARROW_AT_EOL: string = $'\s=>{END_OF_VIM9_LINE}'
+
+# LINE_CONTINUATION_AT_EOL {{{3
+
+const LINE_CONTINUATION_AT_EOL: string = '\%('
+ .. ','
+ .. '\|' .. OPERATOR
+ .. '\|' .. '\s=>'
+ .. '\|' .. '[^=]\zs[[(]'
+ .. '\|' .. DICT_KEY
+ # `{` is ambiguous.
+ # It can be the start of a dictionary or a block.
+ # We only want to match the former.
+ .. '\|' .. $'^\%({STARTS_CURLY_BLOCK}\)\@!.*\zs{{'
+ .. '\)\s*\%(\s#.*\)\=$'
+# }}}2
+# SOL {{{2
+# BACKSLASH_AT_SOL {{{3
+
+const BACKSLASH_AT_SOL: string = '^\s*\%(\\\|[#"]\\ \)'
+
+# CLOSING_BRACKET_AT_SOL {{{3
+
+const CLOSING_BRACKET_AT_SOL: string = $'^\s*{CLOSING_BRACKET}'
+
+# LINE_CONTINUATION_AT_SOL {{{3
+
+const LINE_CONTINUATION_AT_SOL: string = '^\s*\%('
+ .. '\\'
+ .. '\|' .. '[#"]\\ '
+ .. '\|' .. OPERATOR
+ .. '\|' .. '->\s*\h'
+ .. '\|' .. '\.\h' # dict member
+ .. '\|' .. '|'
+ # TODO: `}` at the start of a line is not necessarily a line continuation.
+ # Could be the end of a block.
+ .. '\|' .. CLOSING_BRACKET
+ .. '\)'
+
+# RANGE_AT_SOL {{{3
+
+const RANGE_AT_SOL: string = '^\s*:\S'
+# }}}1
+# Interface {{{1
+export def Expr(lnum = v:lnum): number # {{{2
+ # line which is indented
+ var line_A: dict<any> = {text: getline(lnum), lnum: lnum}
+ # line above, on which we'll base the indent of line A
+ var line_B: dict<any>
+
+ if line_A->AtStartOf('HereDoc')
+ line_A->CacheHeredoc()
+ elseif line_A.lnum->IsInside('HereDoc')
+ return line_A.text->HereDocIndent()
+ elseif line_A.lnum->IsRightBelow('HereDoc')
+ var ind: number = b:vimindent.startindent
+ unlet! b:vimindent
+ return ind
+ endif
+
+ # Don't move this block after the function header one.
+ # Otherwise, we might clear the cache too early if the line following the
+ # header is a comment.
+ if line_A.text =~ COMMENT
+ return CommentIndent()
+ endif
+
+ line_B = PrevCodeLine(line_A.lnum)
+ if line_A.text =~ BACKSLASH_AT_SOL
+ if line_B.text =~ BACKSLASH_AT_SOL
+ return Indent(line_B.lnum)
+ else
+ return Indent(line_B.lnum) + IndentMoreLineContinuation()
+ endif
+ endif
+
+ if line_A->AtStartOf('FuncHeader')
+ && !IsInInterface()
+ line_A.lnum->CacheFuncHeader()
+ elseif line_A.lnum->IsInside('FuncHeader')
+ return b:vimindent.startindent + 2 * shiftwidth()
+ elseif line_A.lnum->IsRightBelow('FuncHeader')
+ var startindent: number = b:vimindent.startindent
+ unlet! b:vimindent
+ if line_A.text =~ ENDS_FUNCTION
+ return startindent
+ else
+ return startindent + shiftwidth()
+ endif
+ endif
+
+ var past_bracket_block: dict<any>
+ if exists('b:vimindent')
+ && b:vimindent->has_key('is_BracketBlock')
+ past_bracket_block = RemovePastBracketBlock(line_A)
+ endif
+ if line_A->AtStartOf('BracketBlock')
+ line_A->CacheBracketBlock()
+ endif
+ if line_A.lnum->IsInside('BracketBlock')
+ var is_in_curly_block: bool = IsInCurlyBlock()
+ for block: dict<any> in b:vimindent.block_stack
+ if line_A.lnum <= block.startlnum
+ continue
+ endif
+ if !block->has_key('startindent')
+ block.startindent = Indent(block.startlnum)
+ endif
+ if !is_in_curly_block
+ return BracketBlockIndent(line_A, block)
+ endif
+ endfor
+ endif
+ if line_A.text->ContinuesBelowBracketBlock(line_B, past_bracket_block)
+ && line_A.text !~ CLOSING_BRACKET_AT_SOL
+ return past_bracket_block.startindent
+ + (past_bracket_block.startline =~ STARTS_NAMED_BLOCK ? 2 * shiftwidth() : 0)
+ endif
+
+ # Problem: If we press `==` on the line right below the start of a multiline
+ # lambda (split after its arrow `=>`), the indent is not correct.
+ # Solution: Indent relative to the line above.
+ if line_B->EndsWithLambdaArrow()
+ return Indent(line_B.lnum) + shiftwidth() + IndentMoreInBracketBlock()
+ endif
+ # FIXME: Similar issue here:
+ #
+ # var x = []
+ # ->filter((_, _) =>
+ # true)
+ # ->items()
+ #
+ # Press `==` on last line.
+ # Expected: The `->items()` line is indented like `->filter(...)`.
+ # Actual: It's indented like `true)`.
+ # Is it worth fixing? `=ip` gives the correct indentation, because then the
+ # cache is used.
+
+ # Don't move this block before the heredoc one.{{{
+ #
+ # A heredoc might be assigned on the very first line.
+ # And if it is, we need to cache some info.
+ #}}}
+ # Don't move it before the function header and bracket block ones either.{{{
+ #
+ # You could, because these blocks of code deal with construct which can only
+ # appear in a Vim9 script. And in a Vim9 script, the first line is
+ # `vim9script`. Or maybe some legacy code/comment (see `:help vim9-mix`).
+ # But you can't find a Vim9 function header or Vim9 bracket block on the
+ # first line.
+ #
+ # Anyway, even if you could, don't. First, it would be inconsistent.
+ # Second, it could give unexpected results while we're trying to fix some
+ # failing test.
+ #}}}
+ if line_A.lnum == 1
+ return 0
+ endif
+
+ # Don't do that:
+ # if line_A.text !~ '\S'
+ # return -1
+ # endif
+ # It would prevent a line from being automatically indented when using the
+ # normal command `o`.
+ # TODO: Can we write a test for this?
+
+ if line_B.text =~ STARTS_CURLY_BLOCK
+ return Indent(line_B.lnum) + shiftwidth() + IndentMoreInBracketBlock()
+
+ elseif line_A.text =~ CLOSING_BRACKET_AT_SOL
+ var start: number = MatchingOpenBracket(line_A)
+ if start <= 0
+ return -1
+ endif
+ return Indent(start) + IndentMoreInBracketBlock()
+
+ elseif line_A.text =~ ENDS_BLOCK_OR_CLAUSE
+ && !line_B->EndsWithLineContinuation()
+ var kwd: string = BlockStartKeyword(line_A.text)
+ if !START_MIDDLE_END->has_key(kwd)
+ return -1
+ endif
+
+ # If the cursor is after the match for the end pattern, we won't find
+ # the start of the block. Let's make sure that doesn't happen.
+ cursor(line_A.lnum, 1)
+
+ var [start: string, middle: string, end: string] = START_MIDDLE_END[kwd]
+ var block_start: number = SearchPairStart(start, middle, end)
+ if block_start > 0
+ return Indent(block_start)
+ else
+ return -1
+ endif
+ endif
+
+ var base_ind: number
+ if line_A->IsFirstLineOfCommand(line_B)
+ line_A.isfirst = true
+ line_B = line_B->FirstLinePreviousCommand()
+ base_ind = Indent(line_B.lnum)
+
+ if line_B->EndsWithCurlyBlock()
+ && !line_A->IsInThisBlock(line_B.lnum)
+ return base_ind
+ endif
+
+ else
+ line_A.isfirst = false
+ base_ind = Indent(line_B.lnum)
+
+ var line_C: dict<any> = PrevCodeLine(line_B.lnum)
+ if !line_B->IsFirstLineOfCommand(line_C) || line_C.lnum <= 0
+ return base_ind
+ endif
+ endif
+
+ var ind: number = base_ind + Offset(line_A, line_B)
+ return [ind, 0]->max()
+enddef
+
+def g:GetVimIndent(): number # {{{2
+ # for backward compatibility
+ return Expr()
+enddef
+# }}}1
+# Core {{{1
+def Offset( # {{{2
+ # we indent this line ...
+ line_A: dict<any>,
+ # ... relatively to this line
+ line_B: dict<any>,
+ ): number
+
+ if line_B->AtStartOf('FuncHeader')
+ && IsInInterface()
+ return 0
+
+ # increase indentation inside a block
+ elseif line_B.text =~ STARTS_NAMED_BLOCK
+ || line_B->EndsWithCurlyBlock()
+ # But don't indent if the line starting the block also closes it.
+ if line_B->AlsoClosesBlock()
+ return 0
+ # Indent twice for a line continuation in the block header itself, so that
+ # we can easily distinguish the end of the block header from the start of
+ # the block body.
+ elseif (line_B->EndsWithLineContinuation()
+ && !line_A.isfirst)
+ || (line_A.text =~ LINE_CONTINUATION_AT_SOL
+ && line_A.text !~ PLUS_MINUS_COMMAND)
+ || line_A.text->Is_IN_KeywordForLoop(line_B.text)
+ return 2 * shiftwidth()
+ else
+ return shiftwidth()
+ endif
+
+ # increase indentation of a line if it's the continuation of a command which
+ # started on a previous line
+ elseif !line_A.isfirst
+ && (line_B->EndsWithLineContinuation()
+ || line_A.text =~ LINE_CONTINUATION_AT_SOL)
+ return shiftwidth()
+ endif
+
+ return 0
+enddef
+
+def HereDocIndent(line_A: string): number # {{{2
+ # at the end of a heredoc
+ if line_A =~ $'^\s*{b:vimindent.endmarker}$'
+ # `END` must be at the very start of the line if the heredoc is not trimmed
+ if !b:vimindent.is_trimmed
+ # We can't invalidate the cache just yet.
+ # The indent of `END` is meaningless; it's always 0. The next line
+ # will need to be indented relative to the start of the heredoc. It
+ # must know where it starts; it needs the cache.
+ return 0
+ else
+ var ind: number = b:vimindent.startindent
+ # invalidate the cache so that it's not used for the next heredoc
+ unlet! b:vimindent
+ return ind
+ endif
+ endif
+
+ # In a non-trimmed heredoc, all of leading whitespace is semantic.
+ # Leave it alone.
+ if !b:vimindent.is_trimmed
+ # But do save the indent of the assignment line.
+ if !b:vimindent->has_key('startindent')
+ b:vimindent.startindent = b:vimindent.startlnum->Indent()
+ endif
+ return -1
+ endif
+
+ # In a trimmed heredoc, *some* of the leading whitespace is semantic.
+ # We want to preserve it, so we can't just indent relative to the assignment
+ # line. That's because we're dealing with data, not with code.
+ # Instead, we need to compute by how much the indent of the assignment line
+ # was increased or decreased. Then, we need to apply that same change to
+ # every line inside the body.
+ var offset: number
+ if !b:vimindent->has_key('offset')
+ var old_startindent: number = b:vimindent.startindent
+ var new_startindent: number = b:vimindent.startlnum->Indent()
+ offset = new_startindent - old_startindent
+
+ # If all the non-empty lines in the body have a higher indentation relative
+ # to the assignment, there is no need to indent them more.
+ # But if at least one of them does have the same indentation level (or a
+ # lower one), then we want to indent it further (and the whole block with it).
+ # This way, we can clearly distinguish the heredoc block from the rest of
+ # the code.
+ var end: number = search($'^\s*{b:vimindent.endmarker}$', 'nW')
+ var should_indent_more: bool = range(v:lnum, end - 1)
+ ->indexof((_, lnum: number): bool => Indent(lnum) <= old_startindent && getline(lnum) != '') >= 0
+ if should_indent_more
+ offset += shiftwidth()
+ endif
+
+ b:vimindent.offset = offset
+ b:vimindent.startindent = new_startindent
+ endif
+
+ return [0, Indent(v:lnum) + b:vimindent.offset]->max()
+enddef
+
+def CommentIndent(): number # {{{2
+ var line_B: dict<any>
+ line_B.lnum = prevnonblank(v:lnum - 1)
+ line_B.text = getline(line_B.lnum)
+ if line_B.text =~ COMMENT
+ return Indent(line_B.lnum)
+ endif
+
+ var next: number = NextCodeLine()
+ if next == 0
+ return 0
+ endif
+ var vimindent_save: dict<any> = get(b:, 'vimindent', {})->deepcopy()
+ var ind: number = next->Expr()
+ # The previous `Expr()` might have set or deleted `b:vimindent`.
+ # This could cause issues (e.g. when indenting 2 commented lines above a
+ # heredoc). Let's make sure the state of the variable is not altered.
+ if vimindent_save->empty()
+ unlet! b:vimindent
+ else
+ b:vimindent = vimindent_save
+ endif
+ if getline(next) =~ ENDS_BLOCK
+ return ind + shiftwidth()
+ else
+ return ind
+ endif
+enddef
+
+def BracketBlockIndent(line_A: dict<any>, block: dict<any>): number # {{{2
+ var ind: number = block.startindent
+
+ if line_A.text =~ CLOSING_BRACKET_AT_SOL
+ if b:vimindent.is_on_named_block_line
+ ind += 2 * shiftwidth()
+ endif
+ return ind + IndentMoreInBracketBlock()
+ endif
+
+ var startline: dict<any> = {
+ text: block.startline,
+ lnum: block.startlnum
+ }
+ if startline->EndsWithComma()
+ || startline->EndsWithLambdaArrow()
+ || (startline->EndsWithOpeningBracket()
+ # TODO: Is that reliable?
+ && block.startline !~
+ $'^\s*{NON_BRACKET}\+{LIST_OR_DICT_CLOSING_BRACKET},\s\+{LIST_OR_DICT_OPENING_BRACKET}')
+ ind += shiftwidth() + IndentMoreInBracketBlock()
+ endif
+
+ if b:vimindent.is_on_named_block_line
+ ind += shiftwidth()
+ endif
+
+ if block.is_dict
+ && line_A.text !~ DICT_KEY
+ ind += shiftwidth()
+ endif
+
+ return ind
+enddef
+
+def CacheHeredoc(line_A: dict<any>) # {{{2
+ var endmarker: string = line_A.text->matchstr(ASSIGNS_HEREDOC)
+ var endlnum: number = search($'^\s*{endmarker}$', 'nW')
+ var is_trimmed: bool = line_A.text =~ $'.*\s\%(trim\%(\s\+eval\)\=\)\s\+[A-Z]\+{END_OF_LINE}'
+ b:vimindent = {
+ is_HereDoc: true,
+ startlnum: line_A.lnum,
+ endlnum: endlnum,
+ endmarker: endmarker,
+ is_trimmed: is_trimmed,
+ }
+ if is_trimmed
+ b:vimindent.startindent = Indent(line_A.lnum)
+ endif
+ RegisterCacheInvalidation()
+enddef
+
+def CacheFuncHeader(startlnum: number) # {{{2
+ var pos: list<number> = getcurpos()
+ cursor(startlnum, 1)
+ if search('(', 'W', startlnum) <= 0
+ return
+ endif
+ var endlnum: number = SearchPair('(', '', ')', 'nW')
+ setpos('.', pos)
+ if endlnum == startlnum
+ return
+ endif
+
+ b:vimindent = {
+ is_FuncHeader: true,
+ startindent: startlnum->Indent(),
+ endlnum: endlnum,
+ }
+ RegisterCacheInvalidation()
+enddef
+
+def CacheBracketBlock(line_A: dict<any>) # {{{2
+ var pos: list<number> = getcurpos()
+ var opening: string = line_A.text->matchstr(CHARACTER_UNDER_CURSOR)
+ var closing: string = {'[': ']', '{': '}', '(': ')'}[opening]
+ var endlnum: number = SearchPair(opening, '', closing, 'nW')
+ setpos('.', pos)
+ if endlnum <= line_A.lnum
+ return
+ endif
+
+ if !exists('b:vimindent')
+ b:vimindent = {
+ is_BracketBlock: true,
+ is_on_named_block_line: line_A.text =~ STARTS_NAMED_BLOCK,
+ block_stack: [],
+ }
+ endif
+
+ var is_dict: bool
+ var is_curly_block: bool
+ if opening == '{'
+ if line_A.text =~ STARTS_CURLY_BLOCK
+ [is_dict, is_curly_block] = [false, true]
+ else
+ [is_dict, is_curly_block] = [true, false]
+ endif
+ endif
+ b:vimindent.block_stack->insert({
+ is_dict: is_dict,
+ is_curly_block: is_curly_block,
+ startline: line_A.text,
+ startlnum: line_A.lnum,
+ endlnum: endlnum,
+ })
+
+ RegisterCacheInvalidation()
+enddef
+
+def RegisterCacheInvalidation() # {{{2
+ # invalidate the cache so that it's not used for the next `=` normal command
+ autocmd_add([{
+ cmd: 'unlet! b:vimindent',
+ event: 'ModeChanged',
+ group: '__VimIndent__',
+ once: true,
+ pattern: '*:n',
+ replace: true,
+ }])
+enddef
+
+def RemovePastBracketBlock(line_A: dict<any>): dict<any> # {{{2
+ var stack: list<dict<any>> = b:vimindent.block_stack
+
+ var removed: dict<any>
+ if line_A.lnum > stack[0].endlnum
+ removed = stack[0]
+ endif
+
+ stack->filter((_, block: dict<any>): bool => line_A.lnum <= block.endlnum)
+ if stack->empty()
+ unlet! b:vimindent
+ endif
+ return removed
+enddef
+# }}}1
+# Util {{{1
+# Get {{{2
+def Indent(lnum: number): number # {{{3
+ if lnum <= 0
+ # Don't return `-1`. It could cause `Expr()` to return a non-multiple of `'shiftwidth'`.{{{
+ #
+ # It would be OK if we were always returning `Indent()` directly. But
+ # we don't. Most of the time, we include it in some computation
+ # like `Indent(...) + shiftwidth()`. If `'shiftwidth'` is `4`, and
+ # `Indent()` returns `-1`, `Expr()` will end up returning `3`.
+ #}}}
+ return 0
+ endif
+ return indent(lnum)
+enddef
+
+def MatchingOpenBracket(line: dict<any>): number # {{{3
+ var end: string = line.text->matchstr(CLOSING_BRACKET)
+ var start: string = {']': '[', '}': '{', ')': '('}[end]
+ cursor(line.lnum, 1)
+ return SearchPairStart(start, '', end)
+enddef
+
+def FirstLinePreviousCommand(line: dict<any>): dict<any> # {{{3
+ var line_B: dict<any> = line
+
+ while line_B.lnum > 1
+ var code_line_above: dict<any> = PrevCodeLine(line_B.lnum)
+
+ if line_B.text =~ CLOSING_BRACKET_AT_SOL
+ var n: number = MatchingOpenBracket(line_B)
+
+ if n <= 0
+ break
+ endif
+
+ line_B.lnum = n
+ line_B.text = getline(line_B.lnum)
+ continue
+
+ elseif line_B->IsFirstLineOfCommand(code_line_above)
+ break
+ endif
+
+ line_B = code_line_above
+ endwhile
+
+ return line_B
+enddef
+
+def PrevCodeLine(lnum: number): dict<any> # {{{3
+ var line: string = getline(lnum)
+ if line =~ '^\s*[A-Z]\+$'
+ var endmarker: string = line->matchstr('[A-Z]\+')
+ var pos: list<number> = getcurpos()
+ cursor(lnum, 1)
+ var n: number = search(ASSIGNS_HEREDOC, 'bnW')
+ setpos('.', pos)
+ if n > 0
+ line = getline(n)
+ if line =~ $'{HEREDOC_OPERATOR}\s\+{endmarker}'
+ return {lnum: n, text: line}
+ endif
+ endif
+ endif
+
+ var n: number = prevnonblank(lnum - 1)
+ line = getline(n)
+ while line =~ COMMENT && n > 1
+ n = prevnonblank(n - 1)
+ line = getline(n)
+ endwhile
+ # If we get back to the first line, we return 1 no matter what; even if it's a
+ # commented line. That should not cause an issue though. We just want to
+ # avoid a commented line above which there is a line of code which is more
+ # relevant. There is nothing above the first line.
+ return {lnum: n, text: line}
+enddef
+
+def NextCodeLine(): number # {{{3
+ var last: number = line('$')
+ if v:lnum == last
+ return 0
+ endif
+
+ var lnum: number = v:lnum + 1
+ while lnum <= last
+ var line: string = getline(lnum)
+ if line != '' && line !~ COMMENT
+ return lnum
+ endif
+ ++lnum
+ endwhile
+ return 0
+enddef
+
+def SearchPair( # {{{3
+ start: string,
+ middle: string,
+ end: string,
+ flags: string,
+ stopline = 0,
+ ): number
+
+ var s: string = start
+ var e: string = end
+ if start == '[' || start == ']'
+ s = s->escape('[]')
+ endif
+ if end == '[' || end == ']'
+ e = e->escape('[]')
+ endif
+ return searchpair('\C' .. s, (middle == '' ? '' : '\C' .. middle), '\C' .. e,
+ flags, (): bool => InCommentOrString(), stopline, TIMEOUT)
+enddef
+
+def SearchPairStart( # {{{3
+ start: string,
+ middle: string,
+ end: string,
+ ): number
+ return SearchPair(start, middle, end, 'bnW')
+enddef
+
+def SearchPairEnd( # {{{3
+ start: string,
+ middle: string,
+ end: string,
+ stopline = 0,
+ ): number
+ return SearchPair(start, middle, end, 'nW', stopline)
+enddef
+# }}}2
+# Test {{{2
+def AtStartOf(line_A: dict<any>, syntax: string): bool # {{{3
+ if syntax == 'BracketBlock'
+ return AtStartOfBracketBlock(line_A)
+ endif
+
+ var pat: string = {
+ HereDoc: ASSIGNS_HEREDOC,
+ FuncHeader: STARTS_FUNCTION
+ }[syntax]
+ return line_A.text =~ pat
+ && (!exists('b:vimindent') || !b:vimindent->has_key('is_HereDoc'))
+enddef
+
+def AtStartOfBracketBlock(line_A: dict<any>): bool # {{{3
+ # We ignore bracket blocks while we're indenting a function header
+ # because it makes the logic simpler. It might mean that we don't
+ # indent correctly a multiline bracket block inside a function header,
+ # but that's a corner case for which it doesn't seem worth making the
+ # code more complex.
+ if exists('b:vimindent')
+ && !b:vimindent->has_key('is_BracketBlock')
+ return false
+ endif
+
+ var pos: list<number> = getcurpos()
+ cursor(line_A.lnum, [line_A.lnum, '$']->col())
+
+ if SearchPair(OPENING_BRACKET, '', CLOSING_BRACKET, 'bcW', line_A.lnum) <= 0
+ setpos('.', pos)
+ return false
+ endif
+ # Don't restore the cursor position.
+ # It needs to be on a bracket for `CacheBracketBlock()` to work as intended.
+
+ return line_A->EndsWithOpeningBracket()
+ || line_A->EndsWithCommaOrDictKey()
+ || line_A->EndsWithLambdaArrow()
+enddef
+
+def ContinuesBelowBracketBlock( # {{{3
+ line_A: string,
+ line_B: dict<any>,
+ block: dict<any>
+ ): bool
+
+ return !block->empty()
+ && (line_A =~ LINE_CONTINUATION_AT_SOL
+ || line_B->EndsWithLineContinuation())
+enddef
+
+def IsInside(lnum: number, syntax: string): bool # {{{3
+ if !exists('b:vimindent')
+ || !b:vimindent->has_key($'is_{syntax}')
+ return false
+ endif
+
+ if syntax == 'BracketBlock'
+ if !b:vimindent->has_key('block_stack')
+ || b:vimindent.block_stack->empty()
+ return false
+ endif
+ return lnum <= b:vimindent.block_stack[0].endlnum
+ endif
+
+ return lnum <= b:vimindent.endlnum
+enddef
+
+def IsRightBelow(lnum: number, syntax: string): bool # {{{3
+ return exists('b:vimindent')
+ && b:vimindent->has_key($'is_{syntax}')
+ && lnum > b:vimindent.endlnum
+enddef
+
+def IsInCurlyBlock(): bool # {{{3
+ return b:vimindent.block_stack
+ ->indexof((_, block: dict<any>): bool => block.is_curly_block) >= 0
+enddef
+
+def IsInThisBlock(line_A: dict<any>, lnum: number): bool # {{{3
+ var pos: list<number> = getcurpos()
+ cursor(lnum, [lnum, '$']->col())
+ var end: number = SearchPairEnd('{', '', '}')
+ setpos('.', pos)
+
+ return line_A.lnum <= end
+enddef
+
+def IsInInterface(): bool # {{{3
+ return SearchPair('interface', '', 'endinterface', 'nW') > 0
+enddef
+
+def IsFirstLineOfCommand(line_1: dict<any>, line_2: dict<any>): bool # {{{3
+ if line_1.text->Is_IN_KeywordForLoop(line_2.text)
+ return false
+ endif
+
+ if line_1.text =~ RANGE_AT_SOL
+ || line_1.text =~ PLUS_MINUS_COMMAND
+ return true
+ endif
+
+ if line_2.text =~ DICT_KEY
+ && !line_1->IsInThisBlock(line_2.lnum)
+ return true
+ endif
+
+ var line_1_is_good: bool = line_1.text !~ COMMENT
+ && line_1.text !~ DICT_KEY
+ && line_1.text !~ LINE_CONTINUATION_AT_SOL
+
+ var line_2_is_good: bool = !line_2->EndsWithLineContinuation()
+
+ return line_1_is_good && line_2_is_good
+enddef
+
+def Is_IN_KeywordForLoop(line_1: string, line_2: string): bool # {{{3
+ return line_2 =~ '^\s*for\s'
+ && line_1 =~ '^\s*in\s'
+enddef
+
+def InCommentOrString(): bool # {{{3
+ return synstack('.', col('.'))
+ ->indexof((_, id: number): bool => synIDattr(id, 'name') =~ '\ccomment\|string\|heredoc') >= 0
+enddef
+
+def AlsoClosesBlock(line_B: dict<any>): bool # {{{3
+ # We know that `line_B` opens a block.
+ # Let's see if it also closes that block.
+ var kwd: string = BlockStartKeyword(line_B.text)
+ if !START_MIDDLE_END->has_key(kwd)
+ return false
+ endif
+
+ var [start: string, middle: string, end: string] = START_MIDDLE_END[kwd]
+ var pos: list<number> = getcurpos()
+ cursor(line_B.lnum, 1)
+ var block_end: number = SearchPairEnd(start, middle, end, line_B.lnum)
+ setpos('.', pos)
+
+ return block_end > 0
+enddef
+
+def EndsWithComma(line: dict<any>): bool # {{{3
+ return NonCommentedMatch(line, COMMA_AT_EOL)
+enddef
+
+def EndsWithCommaOrDictKey(line_A: dict<any>): bool # {{{3
+ return NonCommentedMatch(line_A, COMMA_OR_DICT_KEY_AT_EOL)
+enddef
+
+def EndsWithCurlyBlock(line_B: dict<any>): bool # {{{3
+ return NonCommentedMatch(line_B, STARTS_CURLY_BLOCK)
+enddef
+
+def EndsWithLambdaArrow(line_A: dict<any>): bool # {{{3
+ return NonCommentedMatch(line_A, LAMBDA_ARROW_AT_EOL)
+enddef
+
+def EndsWithLineContinuation(line_B: dict<any>): bool # {{{3
+ return NonCommentedMatch(line_B, LINE_CONTINUATION_AT_EOL)
+enddef
+
+def EndsWithOpeningBracket(line: dict<any>): bool # {{{3
+ return NonCommentedMatch(line, OPENING_BRACKET_AT_EOL)
+enddef
+
+def EndsWithClosingBracket(line: dict<any>): bool # {{{3
+ return NonCommentedMatch(line, CLOSING_BRACKET_AT_EOL)
+enddef
+
+def NonCommentedMatch(line: dict<any>, pat: string): bool # {{{3
+ # Could happen if there is no code above us, and we're not on the 1st line.
+ # In that case, `PrevCodeLine()` returns `{lnum: 0, line: ''}`.
+ if line.lnum == 0
+ return false
+ endif
+
+ # Technically, that's wrong. A line might start with a range and end with a
+ # line continuation symbol. But it's unlikely. And it's useful to assume the
+ # opposite because it prevents us from conflating a mark with an operator or
+ # the start of a list:
+ #
+ # not a comparison operator
+ # v
+ # :'< mark <
+ # :'< mark [
+ # ^
+ # not the start of a list
+ if line.text =~ RANGE_AT_SOL
+ return false
+ endif
+
+ # that's not an arithmetic operator
+ # v
+ # catch /pattern /
+ #
+ # When `/` is used as a pattern delimiter, it's always present twice.
+ # And usually, the first occurrence is in the middle of a sequence of
+ # non-whitespace characters. If we can find such a `/`, we assume that the
+ # trailing `/` is not an operator.
+ # Warning: Here, don't use a too complex pattern.{{{
+ #
+ # In particular, avoid backreferences.
+ # For example, this would be too costly:
+ #
+ # if line.text =~ $'\%(\S*\({PATTERN_DELIMITER}\)\S\+\|\S\+\({PATTERN_DELIMITER}\)\S*\)'
+ # .. $'\s\+\1{END_OF_COMMAND}'
+ #
+ # Sometimes, it could even give `E363`.
+ #}}}
+ var delim: string = line.text
+ ->matchstr($'\s\+\zs{PATTERN_DELIMITER}\ze{END_OF_COMMAND}')
+ if !delim->empty()
+ delim = $'\V{delim}\m'
+ if line.text =~ $'\%(\S*{delim}\S\+\|\S\+{delim}\S*\)\s\+{delim}{END_OF_COMMAND}'
+ return false
+ endif
+ endif
+ # TODO: We might still miss some corner cases:{{{
+ #
+ # conflated with arithmetic division
+ # v
+ # substitute/pat / rep /
+ # echo
+ # ^--^
+ # ✘
+ #
+ # A better way to handle all these corner cases, would be to inspect the top
+ # of the syntax stack:
+ #
+ # :echo synID('.', col('.'), v:false)->synIDattr('name')
+ #
+ # Unfortunately, the legacy syntax plugin is not accurate enough.
+ # For example, it doesn't highlight a slash as an operator.
+ # }}}
+
+ # `%` at the end of a line is tricky.
+ # It might be the modulo operator or the current file (e.g. `edit %`).
+ # Let's assume it's the latter.
+ if line.text =~ $'%{END_OF_COMMAND}'
+ return false
+ endif
+
+ if line.text =~ TRICKY_COMMANDS
+ return false
+ endif
+
+ var pos: list<number> = getcurpos()
+ cursor(line.lnum, 1)
+ var match_lnum: number = search(pat, 'cnW', line.lnum, TIMEOUT, (): bool => InCommentOrString())
+ setpos('.', pos)
+ return match_lnum > 0
+enddef
+# }}}1
+# vim:sw=4
diff --git a/runtime/autoload/freebasic.vim b/runtime/autoload/freebasic.vim
new file mode 100644
index 0000000..6c94cd3
--- /dev/null
+++ b/runtime/autoload/freebasic.vim
@@ -0,0 +1,40 @@
+" Vim filetype plugin file
+" Language: FreeBASIC
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 June 24
+
+" Dialects can be one of fb, qb, fblite, or deprecated
+" Precedence is forcelang > #lang > lang
+function! freebasic#GetDialect() abort
+ if exists("g:freebasic_forcelang")
+ return g:freebasic_forcelang
+ endif
+
+ if exists("g:freebasic_lang")
+ let dialect = g:freebasic_lang
+ else
+ let dialect = "fb"
+ endif
+
+ " override with #lang directive or metacommand
+
+ let pat = '\c^\s*\%(#\s*lang\s\+\|''\s*$lang\s*:\s*\)"\([^"]*\)"'
+
+ let save_cursor = getcurpos()
+ call cursor(1, 1)
+ let lnum = search(pat, 'cn')
+ call setpos('.', save_cursor)
+
+ if lnum
+ let word = matchlist(getline(lnum), pat)[1]
+ if word =~? '\<\%(fb\|deprecated\|fblite\|qb\)\>'
+ let dialect = word
+ else
+ echomsg "freebasic#GetDialect: Invalid lang, found '" .. word .. "' at line " .. lnum .. " " .. getline(lnum)
+ endif
+ endif
+
+ return dialect
+endfunction
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/autoload/getscript.vim b/runtime/autoload/getscript.vim
new file mode 100644
index 0000000..1b14fe1
--- /dev/null
+++ b/runtime/autoload/getscript.vim
@@ -0,0 +1,667 @@
+" ---------------------------------------------------------------------
+" getscript.vim
+" Author: Charles E. Campbell
+" Date: Jan 21, 2014
+" Version: 36
+" Installing: :help glvs-install
+" Usage: :help glvs
+"
+" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim
+"redraw!|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+" ---------------------------------------------------------------------
+" Initialization: {{{1
+" if you're sourcing this file, surely you can't be
+" expecting vim to be in its vi-compatible mode!
+if exists("g:loaded_getscript")
+ finish
+endif
+let g:loaded_getscript= "v36"
+if &cp
+ echoerr "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)"
+ finish
+endif
+if v:version < 702
+ echohl WarningMsg
+ echo "***warning*** this version of GetLatestVimScripts needs vim 7.2"
+ echohl Normal
+ finish
+endif
+let s:keepcpo = &cpo
+set cpo&vim
+"DechoTabOn
+
+" ---------------------------
+" Global Variables: {{{1
+" ---------------------------
+" Cygwin Detection ------- {{{2
+if !exists("g:getscript_cygwin")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
+ let g:getscript_cygwin= 1
+ else
+ let g:getscript_cygwin= 0
+ endif
+ else
+ let g:getscript_cygwin= 0
+ endif
+endif
+
+" wget vs curl {{{2
+if !exists("g:GetLatestVimScripts_wget")
+ if executable("wget")
+ let g:GetLatestVimScripts_wget= "wget"
+ elseif executable("curl")
+ let g:GetLatestVimScripts_wget= "curl"
+ else
+ let g:GetLatestVimScripts_wget = 'echo "GetLatestVimScripts needs wget or curl"'
+ let g:GetLatestVimScripts_options = ""
+ endif
+endif
+
+" options that wget and curl require:
+if !exists("g:GetLatestVimScripts_options")
+ if g:GetLatestVimScripts_wget == "wget"
+ let g:GetLatestVimScripts_options= "-q -O"
+ elseif g:GetLatestVimScripts_wget == "curl"
+ let g:GetLatestVimScripts_options= "-s -O"
+ else
+ let g:GetLatestVimScripts_options= ""
+ endif
+endif
+
+" by default, allow autoinstall lines to work
+if !exists("g:GetLatestVimScripts_allowautoinstall")
+ let g:GetLatestVimScripts_allowautoinstall= 1
+endif
+
+" set up default scriptaddr address
+if !exists("g:GetLatestVimScripts_scriptaddr")
+ let g:GetLatestVimScripts_scriptaddr = 'http://vim.sourceforge.net/script.php?script_id='
+endif
+
+"" For debugging:
+"let g:GetLatestVimScripts_wget = "echo"
+"let g:GetLatestVimScripts_options = "options"
+
+" ---------------------------------------------------------------------
+" Check If AutoInstall Capable: {{{1
+let s:autoinstall= ""
+if g:GetLatestVimScripts_allowautoinstall
+
+ if (has("win32") || has("gui_win32") || has("gui_win32s") || has("win16") || has("win64") || has("win32unix") || has("win95")) && &shell != "bash"
+ " windows (but not cygwin/bash)
+ let s:dotvim= "vimfiles"
+ if !exists("g:GetLatestVimScripts_mv")
+ let g:GetLatestVimScripts_mv= "ren"
+ endif
+
+ else
+ " unix
+ let s:dotvim= ".vim"
+ if !exists("g:GetLatestVimScripts_mv")
+ let g:GetLatestVimScripts_mv= "mv"
+ endif
+ endif
+
+ if exists("g:GetLatestVimScripts_autoinstalldir") && isdirectory(g:GetLatestVimScripts_autoinstalldir)
+ let s:autoinstall= g:GetLatestVimScripts_autoinstalldir"
+ elseif exists('$HOME') && isdirectory(expand("$HOME")."/".s:dotvim)
+ let s:autoinstall= $HOME."/".s:dotvim
+ endif
+" call Decho("s:autoinstall<".s:autoinstall.">")
+"else "Decho
+" call Decho("g:GetLatestVimScripts_allowautoinstall=".g:GetLatestVimScripts_allowautoinstall.": :AutoInstall: disabled")
+endif
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+com! -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts()
+com! -nargs=0 GetScript call getscript#GetLatestVimScripts()
+silent! com -nargs=0 GLVS call getscript#GetLatestVimScripts()
+
+" ---------------------------------------------------------------------
+" GetLatestVimScripts: this function gets the latest versions of {{{1
+" scripts based on the list in
+" (first dir in runtimepath)/GetLatest/GetLatestVimScripts.dat
+fun! getscript#GetLatestVimScripts()
+" call Dfunc("GetLatestVimScripts() autoinstall<".s:autoinstall.">")
+
+" insure that wget is executable
+ if executable(g:GetLatestVimScripts_wget) != 1
+ echoerr "GetLatestVimScripts needs ".g:GetLatestVimScripts_wget." which apparently is not available on your system"
+" call Dret("GetLatestVimScripts : wget not executable/available")
+ return
+ endif
+
+ " insure that fnameescape() is available
+ if !exists("*fnameescape")
+ echoerr "GetLatestVimScripts needs fnameescape() (provided by 7.1.299 or later)"
+ return
+ endif
+
+ " Find the .../GetLatest subdirectory under the runtimepath
+ for datadir in split(&rtp,',') + ['']
+ if isdirectory(datadir."/GetLatest")
+" call Decho("found directory<".datadir.">")
+ let datadir= datadir . "/GetLatest"
+ break
+ endif
+ if filereadable(datadir."GetLatestVimScripts.dat")
+" call Decho("found ".datadir."/GetLatestVimScripts.dat")
+ break
+ endif
+ endfor
+
+ " Sanity checks: readability and writability
+ if datadir == ""
+ echoerr 'Missing "GetLatest/" on your runtimepath - see :help glvs-dist-install'
+" call Dret("GetLatestVimScripts : unable to find a GetLatest subdirectory")
+ return
+ endif
+ if filewritable(datadir) != 2
+ echoerr "(getLatestVimScripts) Your ".datadir." isn't writable"
+" call Dret("GetLatestVimScripts : non-writable directory<".datadir.">")
+ return
+ endif
+ let datafile= datadir."/GetLatestVimScripts.dat"
+ if !filereadable(datafile)
+ echoerr "Your data file<".datafile."> isn't readable"
+" call Dret("GetLatestVimScripts : non-readable datafile<".datafile.">")
+ return
+ endif
+ if !filewritable(datafile)
+ echoerr "Your data file<".datafile."> isn't writable"
+" call Dret("GetLatestVimScripts : non-writable datafile<".datafile.">")
+ return
+ endif
+ " --------------------
+ " Passed sanity checks
+ " --------------------
+
+" call Decho("datadir <".datadir.">")
+" call Decho("datafile <".datafile.">")
+
+ " don't let any event handlers interfere (like winmanager's, taglist's, etc)
+ let eikeep = &ei
+ let hlskeep = &hls
+ let acdkeep = &acd
+ set ei=all hls&vim noacd
+
+ " Edit the datafile (ie. GetLatestVimScripts.dat):
+ " 1. record current directory (origdir),
+ " 2. change directory to datadir,
+ " 3. split window
+ " 4. edit datafile
+ let origdir= getcwd()
+" call Decho("exe cd ".fnameescape(substitute(datadir,'\','/','ge')))
+ exe "cd ".fnameescape(substitute(datadir,'\','/','ge'))
+ split
+" call Decho("exe e ".fnameescape(substitute(datafile,'\','/','ge')))
+ exe "e ".fnameescape(substitute(datafile,'\','/','ge'))
+ res 1000
+ let s:downloads = 0
+ let s:downerrors= 0
+
+ " Check on dependencies mentioned in plugins
+" call Decho(" ")
+" call Decho("searching plugins for GetLatestVimScripts dependencies")
+ let lastline = line("$")
+" call Decho("lastline#".lastline)
+ let firstdir = substitute(&rtp,',.*$','','')
+ let plugins = split(globpath(firstdir,"plugin/**/*.vim"),'\n')
+ let plugins = plugins + split(globpath(firstdir,"AsNeeded/**/*.vim"),'\n')
+ let foundscript = 0
+
+ " this loop updates the GetLatestVimScripts.dat file
+ " with dependencies explicitly mentioned in the plugins
+ " via GetLatestVimScripts: ... lines
+ " It reads the plugin script at the end of the GetLatestVimScripts.dat
+ " file, examines it, and then removes it.
+ for plugin in plugins
+" call Decho(" ")
+" call Decho("plugin<".plugin.">")
+
+ " read plugin in
+ " evidently a :r creates a new buffer (the "#" buffer) that is subsequently unused -- bwiping it
+ $
+" call Decho(".dependency checking<".plugin."> line$=".line("$"))
+" call Decho("..exe silent r ".fnameescape(plugin))
+ exe "silent r ".fnameescape(plugin)
+ exe "silent bwipe ".bufnr("#")
+
+ while search('^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+','W') != 0
+ let depscript = substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\d\+\s\+\d\+\s\+\(.*\)$','\1','e')
+ let depscriptid = substitute(getline("."),'^"\s\+GetLatestVimScripts:\s\+\(\d\+\)\s\+.*$','\1','')
+ let llp1 = lastline+1
+" call Decho("..depscript<".depscript.">")
+
+ " found a "GetLatestVimScripts: # #" line in the script;
+ " check if it's already in the datafile by searching backwards from llp1,
+ " the (prior to reading in the plugin script) last line plus one of the GetLatestVimScripts.dat file,
+ " for the script-id with no wrapping allowed.
+ let curline = line(".")
+ let noai_script = substitute(depscript,'\s*:AutoInstall:\s*','','e')
+ exe llp1
+ let srchline = search('^\s*'.depscriptid.'\s\+\d\+\s\+.*$','bW')
+ if srchline == 0
+ " this second search is taken when, for example, a 0 0 scriptname is to be skipped over
+ let srchline= search('\<'.noai_script.'\>','bW')
+ endif
+" call Decho("..noai_script<".noai_script."> depscriptid#".depscriptid." srchline#".srchline." curline#".line(".")." lastline#".lastline)
+
+ if srchline == 0
+ " found a new script to permanently include in the datafile
+ let keep_rega = @a
+ let @a = substitute(getline(curline),'^"\s\+GetLatestVimScripts:\s\+','','')
+ echomsg "Appending <".@a."> to ".datafile." for ".depscript
+" call Decho("..Appending <".@a."> to ".datafile." for ".depscript)
+ exe lastline."put a"
+ let @a = keep_rega
+ let lastline = llp1
+ let curline = curline + 1
+ let foundscript = foundscript + 1
+" else " Decho
+" call Decho("..found <".noai_script."> (already in datafile at line#".srchline.")")
+ endif
+
+ let curline = curline + 1
+ exe curline
+ endwhile
+
+ " llp1: last line plus one
+ let llp1= lastline + 1
+" call Decho(".deleting lines: ".llp1.",$d")
+ exe "silent! ".llp1.",$d"
+ endfor
+" call Decho("--- end dependency checking loop --- foundscript=".foundscript)
+" call Decho(" ")
+" call Dredir("BUFFER TEST (GetLatestVimScripts 1)","ls!")
+
+ if foundscript == 0
+ setlocal nomod
+ endif
+
+ " --------------------------------------------------------------------
+ " Check on out-of-date scripts using GetLatest/GetLatestVimScripts.dat
+ " --------------------------------------------------------------------
+" call Decho("begin: checking out-of-date scripts using datafile<".datafile.">")
+ setlocal lz
+ 1
+" /^-----/,$g/^\s*\d/call Decho(getline("."))
+ 1
+ /^-----/,$g/^\s*\d/call s:GetOneScript()
+" call Decho("--- end out-of-date checking --- ")
+
+ " Final report (an echomsg)
+ try
+ silent! ?^-------?
+ catch /^Vim\%((\a\+)\)\=:E114/
+" call Dret("GetLatestVimScripts : nothing done!")
+ return
+ endtry
+ exe "norm! kz\<CR>"
+ redraw!
+ let s:msg = ""
+ if s:downloads == 1
+ let s:msg = "Downloaded one updated script to <".datadir.">"
+ elseif s:downloads == 2
+ let s:msg= "Downloaded two updated scripts to <".datadir.">"
+ elseif s:downloads > 1
+ let s:msg= "Downloaded ".s:downloads." updated scripts to <".datadir.">"
+ else
+ let s:msg= "Everything was already current"
+ endif
+ if s:downerrors > 0
+ let s:msg= s:msg." (".s:downerrors." downloading errors)"
+ endif
+ echomsg s:msg
+ " save the file
+ if &mod
+ silent! w!
+ endif
+ q!
+
+ " restore events and current directory
+ exe "cd ".fnameescape(substitute(origdir,'\','/','ge'))
+ let &ei = eikeep
+ let &hls = hlskeep
+ let &acd = acdkeep
+ setlocal nolz
+" call Dredir("BUFFER TEST (GetLatestVimScripts 2)","ls!")
+" call Dret("GetLatestVimScripts : did ".s:downloads." downloads")
+endfun
+
+" ---------------------------------------------------------------------
+" GetOneScript: (Get Latest Vim Script) this function operates {{{1
+" on the current line, interpreting two numbers and text as
+" ScriptID, SourceID, and Filename.
+" It downloads any scripts that have newer versions from vim.sourceforge.net.
+fun! s:GetOneScript(...)
+" call Dfunc("GetOneScript()")
+
+ " set options to allow progress to be shown on screen
+ let rega= @a
+ let t_ti= &t_ti
+ let t_te= &t_te
+ let rs = &rs
+ set t_ti= t_te= nors
+
+ " put current line on top-of-screen and interpret it into
+ " a script identifier : used to obtain webpage
+ " source identifier : used to identify current version
+ " and an associated comment: used to report on what's being considered
+ if a:0 >= 3
+ let scriptid = a:1
+ let srcid = a:2
+ let fname = a:3
+ let cmmnt = ""
+" call Decho("scriptid<".scriptid.">")
+" call Decho("srcid <".srcid.">")
+" call Decho("fname <".fname.">")
+ else
+ let curline = getline(".")
+ if curline =~ '^\s*#'
+ let @a= rega
+" call Dret("GetOneScript : skipping a pure comment line")
+ return
+ endif
+ let parsepat = '^\s*\(\d\+\)\s\+\(\d\+\)\s\+\(.\{-}\)\(\s*#.*\)\=$'
+ try
+ let scriptid = substitute(curline,parsepat,'\1','e')
+ catch /^Vim\%((\a\+)\)\=:E486/
+ let scriptid= 0
+ endtry
+ try
+ let srcid = substitute(curline,parsepat,'\2','e')
+ catch /^Vim\%((\a\+)\)\=:E486/
+ let srcid= 0
+ endtry
+ try
+ let fname= substitute(curline,parsepat,'\3','e')
+ catch /^Vim\%((\a\+)\)\=:E486/
+ let fname= ""
+ endtry
+ try
+ let cmmnt= substitute(curline,parsepat,'\4','e')
+ catch /^Vim\%((\a\+)\)\=:E486/
+ let cmmnt= ""
+ endtry
+" call Decho("curline <".curline.">")
+" call Decho("parsepat<".parsepat.">")
+" call Decho("scriptid<".scriptid.">")
+" call Decho("srcid <".srcid.">")
+" call Decho("fname <".fname.">")
+ endif
+
+ " plugin author protection from downloading his/her own scripts atop their latest work
+ if scriptid == 0 || srcid == 0
+ " When looking for :AutoInstall: lines, skip scripts that have 0 0 scriptname
+ let @a= rega
+" call Dret("GetOneScript : skipping a scriptid==srcid==0 line")
+ return
+ endif
+
+ let doautoinstall= 0
+ if fname =~ ":AutoInstall:"
+" call Decho("case AutoInstall: fname<".fname.">")
+ let aicmmnt= substitute(fname,'\s\+:AutoInstall:\s\+',' ','')
+" call Decho("aicmmnt<".aicmmnt."> s:autoinstall=".s:autoinstall)
+ if s:autoinstall != ""
+ let doautoinstall = g:GetLatestVimScripts_allowautoinstall
+ endif
+ else
+ let aicmmnt= fname
+ endif
+" call Decho("aicmmnt<".aicmmnt.">: doautoinstall=".doautoinstall)
+
+ exe "norm z\<CR>"
+ redraw!
+" call Decho('considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid)
+ echo 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid
+
+ " grab a copy of the plugin's vim.sourceforge.net webpage
+ let scriptaddr = g:GetLatestVimScripts_scriptaddr.scriptid
+ let tmpfile = tempname()
+ let v:errmsg = ""
+
+ " make up to three tries at downloading the description
+ let itry= 1
+ while itry <= 3
+" call Decho(".try#".itry." to download description of <".aicmmnt."> with addr=".scriptaddr)
+ if has("win32") || has("win16") || has("win95")
+" call Decho(".new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile).' '.shellescape(scriptaddr)."|bw!")
+ new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile).' '.shellescape(scriptaddr)|bw!
+ else
+" call Decho(".exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile)." ".shellescape(scriptaddr))
+ exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(tmpfile)." ".shellescape(scriptaddr)
+ endif
+ if itry == 1
+ exe "silent vsplit ".fnameescape(tmpfile)
+ else
+ silent! e %
+ endif
+ setlocal bh=wipe
+
+ " find the latest source-id in the plugin's webpage
+ silent! 1
+ let findpkg= search('Click on the package to download','W')
+ if findpkg > 0
+ break
+ endif
+ let itry= itry + 1
+ endwhile
+" call Decho(" --- end downloading tries while loop --- itry=".itry)
+
+ " testing: did finding "Click on the package..." fail?
+ if findpkg == 0 || itry >= 4
+ silent q!
+ call delete(tmpfile)
+ " restore options
+ let &t_ti = t_ti
+ let &t_te = t_te
+ let &rs = rs
+ let s:downerrors = s:downerrors + 1
+" call Decho("***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">")
+ echomsg "***warning*** couldn'".'t find "Click on the package..." in description page for <'.aicmmnt.">"
+" call Dret("GetOneScript : srch for /Click on the package/ failed")
+ let @a= rega
+ return
+ endif
+" call Decho('found "Click on the package to download"')
+
+ let findsrcid= search('src_id=','W')
+ if findsrcid == 0
+ silent q!
+ call delete(tmpfile)
+ " restore options
+ let &t_ti = t_ti
+ let &t_te = t_te
+ let &rs = rs
+ let s:downerrors = s:downerrors + 1
+" call Decho("***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">")
+ echomsg "***warning*** couldn'".'t find "src_id=" in description page for <'.aicmmnt.">"
+ let @a= rega
+" call Dret("GetOneScript : srch for /src_id/ failed")
+ return
+ endif
+" call Decho('found "src_id=" in description page')
+
+ let srcidpat = '^\s*<td class.*src_id=\(\d\+\)">\([^<]\+\)<.*$'
+ let latestsrcid= substitute(getline("."),srcidpat,'\1','')
+ let sname = substitute(getline("."),srcidpat,'\2','') " script name actually downloaded
+" call Decho("srcidpat<".srcidpat."> latestsrcid<".latestsrcid."> sname<".sname.">")
+ silent q!
+ call delete(tmpfile)
+
+ " convert the strings-of-numbers into numbers
+ let srcid = srcid + 0
+ let latestsrcid = latestsrcid + 0
+" call Decho("srcid=".srcid." latestsrcid=".latestsrcid." sname<".sname.">")
+
+ " has the plugin's most-recent srcid increased, which indicates that it has been updated
+ if latestsrcid > srcid
+" call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."]: need to update <".sname.">")
+
+ let s:downloads= s:downloads + 1
+ if sname == bufname("%")
+ " GetLatestVimScript has to be careful about downloading itself
+ let sname= "NEW_".sname
+ endif
+
+ " -----------------------------------------------------------------------------
+ " the plugin has been updated since we last obtained it, so download a new copy
+ " -----------------------------------------------------------------------------
+" call Decho(".downloading new <".sname.">")
+ echomsg ".downloading new <".sname.">"
+ if has("win32") || has("win16") || has("win95")
+" call Decho(".new|exe silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id='.latestsrcid)."|q")
+ new|exe "silent r!".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id='.latestsrcid)|q
+ else
+" call Decho(".exe silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id='))
+ exe "silent !".g:GetLatestVimScripts_wget." ".g:GetLatestVimScripts_options." ".shellescape(sname)." ".shellescape('http://vim.sourceforge.net/scripts/download_script.php?src_id=').latestsrcid
+ endif
+
+ " --------------------------------------------------------------------------
+ " AutoInstall: only if doautoinstall has been requested by the plugin itself
+ " --------------------------------------------------------------------------
+" call Decho("checking if plugin requested autoinstall: doautoinstall=".doautoinstall)
+ if doautoinstall
+" call Decho(" ")
+" call Decho("Autoinstall: getcwd<".getcwd()."> filereadable(".sname.")=".filereadable(sname))
+ if filereadable(sname)
+" call Decho("<".sname."> is readable")
+" call Decho("exe silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".shellescape(s:autoinstall))
+ exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".shellescape(s:autoinstall)
+ let curdir = fnameescape(substitute(getcwd(),'\','/','ge'))
+ let installdir= curdir."/Installed"
+ if !isdirectory(installdir)
+ call mkdir(installdir)
+ endif
+" call Decho("curdir<".curdir."> installdir<".installdir.">")
+" call Decho("exe cd ".fnameescape(s:autoinstall))
+ exe "cd ".fnameescape(s:autoinstall)
+
+ " determine target directory for moves
+ let firstdir= substitute(&rtp,',.*$','','')
+ let pname = substitute(sname,'\..*','.vim','')
+" call Decho("determine tgtdir: is <".firstdir.'/AsNeeded/'.pname." readable?")
+ if filereadable(firstdir.'/AsNeeded/'.pname)
+ let tgtdir= "AsNeeded"
+ else
+ let tgtdir= "plugin"
+ endif
+" call Decho("tgtdir<".tgtdir."> pname<".pname.">")
+
+ " decompress
+ if sname =~ '\.bz2$'
+" call Decho("decompress: attempt to bunzip2 ".sname)
+ exe "sil !bunzip2 ".shellescape(sname)
+ let sname= substitute(sname,'\.bz2$','','')
+" call Decho("decompress: new sname<".sname."> after bunzip2")
+ elseif sname =~ '\.gz$'
+" call Decho("decompress: attempt to gunzip ".sname)
+ exe "sil !gunzip ".shellescape(sname)
+ let sname= substitute(sname,'\.gz$','','')
+" call Decho("decompress: new sname<".sname."> after gunzip")
+ elseif sname =~ '\.xz$'
+" call Decho("decompress: attempt to unxz ".sname)
+ exe "sil !unxz ".shellescape(sname)
+ let sname= substitute(sname,'\.xz$','','')
+" call Decho("decompress: new sname<".sname."> after unxz")
+ else
+" call Decho("no decompression needed")
+ endif
+
+ " distribute archive(.zip, .tar, .vba, ...) contents
+ if sname =~ '\.zip$'
+" call Decho("dearchive: attempt to unzip ".sname)
+ exe "silent !unzip -o ".shellescape(sname)
+ elseif sname =~ '\.tar$'
+" call Decho("dearchive: attempt to untar ".sname)
+ exe "silent !tar -xvf ".shellescape(sname)
+ elseif sname =~ '\.tgz$'
+" call Decho("dearchive: attempt to untar+gunzip ".sname)
+ exe "silent !tar -zxvf ".shellescape(sname)
+ elseif sname =~ '\.taz$'
+" call Decho("dearchive: attempt to untar+uncompress ".sname)
+ exe "silent !tar -Zxvf ".shellescape(sname)
+ elseif sname =~ '\.tbz$'
+" call Decho("dearchive: attempt to untar+bunzip2 ".sname)
+ exe "silent !tar -jxvf ".shellescape(sname)
+ elseif sname =~ '\.txz$'
+" call Decho("dearchive: attempt to untar+xz ".sname)
+ exe "silent !tar -Jxvf ".shellescape(sname)
+ elseif sname =~ '\.vba$'
+" call Decho("dearchive: attempt to handle a vimball: ".sname)
+ silent 1split
+ if exists("g:vimball_home")
+ let oldvimballhome= g:vimball_home
+ endif
+ let g:vimball_home= s:autoinstall
+ exe "silent e ".fnameescape(sname)
+ silent so %
+ silent q
+ if exists("oldvimballhome")
+ let g:vimball_home= oldvimballhome
+ else
+ unlet g:vimball_home
+ endif
+ else
+" call Decho("no dearchiving needed")
+ endif
+
+ " ---------------------------------------------
+ " move plugin to plugin/ or AsNeeded/ directory
+ " ---------------------------------------------
+ if sname =~ '.vim$'
+" call Decho("dearchive: attempt to simply move ".sname." to ".tgtdir)
+ exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".tgtdir
+ else
+" call Decho("dearchive: move <".sname."> to installdir<".installdir.">")
+ exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".installdir
+ endif
+ if tgtdir != "plugin"
+" call Decho("exe silent !".g:GetLatestVimScripts_mv." plugin/".shellescape(pname)." ".tgtdir)
+ exe "silent !".g:GetLatestVimScripts_mv." plugin/".shellescape(pname)." ".tgtdir
+ endif
+
+ " helptags step
+ let docdir= substitute(&rtp,',.*','','e')."/doc"
+" call Decho("helptags: docdir<".docdir.">")
+ exe "helptags ".fnameescape(docdir)
+ exe "cd ".fnameescape(curdir)
+ endif
+ if fname !~ ':AutoInstall:'
+ let modline=scriptid." ".latestsrcid." :AutoInstall: ".fname.cmmnt
+ else
+ let modline=scriptid." ".latestsrcid." ".fname.cmmnt
+ endif
+ else
+ let modline=scriptid." ".latestsrcid." ".fname.cmmnt
+ endif
+
+ " update the data in the <GetLatestVimScripts.dat> file
+ call setline(line("."),modline)
+" call Decho("update data in ".expand("%")."#".line(".").": modline<".modline.">")
+" else " Decho
+" call Decho("[latestsrcid=".latestsrcid."] <= [srcid=".srcid."], no need to update")
+ endif
+
+ " restore options
+ let &t_ti = t_ti
+ let &t_te = t_te
+ let &rs = rs
+ let @a = rega
+" call Dredir("BUFFER TEST (GetOneScript)","ls!")
+
+" call Dret("GetOneScript")
+endfun
+
+" ---------------------------------------------------------------------
+" Restore Options: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+
+" ---------------------------------------------------------------------
+" Modelines: {{{1
+" vim: ts=8 sts=2 fdm=marker nowrap
diff --git a/runtime/autoload/gnat.vim b/runtime/autoload/gnat.vim
new file mode 100644
index 0000000..0def672
--- /dev/null
+++ b/runtime/autoload/gnat.vim
@@ -0,0 +1,147 @@
+"------------------------------------------------------------------------------
+" Description: Vim Ada/GNAT compiler file
+" Language: Ada (GNAT)
+" $Id: gnat.vim 887 2008-07-08 14:29:01Z krischik $
+" Copyright: Copyright (C) 2006 Martin Krischik
+" Maintainer: Martin Krischi <krischik@users.sourceforge.net>k
+" Ned Okie <nokie@radford.edu>
+" $Author: krischik $
+" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" Version: 4.6
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/autoload/gnat.vim $
+" History: 24.05.2006 MK Unified Headers
+" 16.07.2006 MK Ada-Mode as vim-ball
+" 05.08.2006 MK Add session support
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 05.11.2006 MK Bram suggested not to use include protection for
+" autoload
+" 05.11.2006 MK Bram suggested to save on spaces
+" 19.09.2007 NO use project file only when there is a project
+" Help Page: compiler-gnat
+"------------------------------------------------------------------------------
+
+if version < 700
+ finish
+endif
+
+function gnat#Make () dict " {{{1
+ let &l:makeprg = self.Get_Command('Make')
+ let &l:errorformat = self.Error_Format
+ wall
+ make
+ copen
+ set wrap
+ wincmd W
+endfunction gnat#Make " }}}1
+
+function gnat#Pretty () dict " {{{1
+ execute "!" . self.Get_Command('Pretty')
+endfunction gnat#Make " }}}1
+
+function gnat#Find () dict " {{{1
+ execute "!" . self.Get_Command('Find')
+endfunction gnat#Find " }}}1
+
+function gnat#Tags () dict " {{{1
+ execute "!" . self.Get_Command('Tags')
+ edit tags
+ call gnat#Insert_Tags_Header ()
+ update
+ quit
+endfunction gnat#Tags " }}}1
+
+function gnat#Set_Project_File (...) dict " {{{1
+ if a:0 > 0
+ let self.Project_File = a:1
+
+ if ! filereadable (self.Project_File)
+ let self.Project_File = findfile (
+ \ fnamemodify (self.Project_File, ':r'),
+ \ $ADA_PROJECT_PATH,
+ \ 1)
+ endif
+ elseif strlen (self.Project_File) > 0
+ let self.Project_File = browse (0, 'GNAT Project File?', '', self.Project_File)
+ elseif expand ("%:e") == 'gpr'
+ let self.Project_File = browse (0, 'GNAT Project File?', '', expand ("%:e"))
+ else
+ let self.Project_File = browse (0, 'GNAT Project File?', '', 'default.gpr')
+ endif
+
+ if strlen (v:this_session) > 0
+ execute 'mksession! ' . v:this_session
+ endif
+
+ "if strlen (self.Project_File) > 0
+ "if has("vms")
+ "call ada#Switch_Session (
+ "\ expand('~')[0:-2] . ".vimfiles.session]gnat_" .
+ "\ fnamemodify (self.Project_File, ":t:r") . ".vim")
+ "else
+ "call ada#Switch_Session (
+ "\ expand('~') . "/vimfiles/session/gnat_" .
+ "\ fnamemodify (self.Project_File, ":t:r") . ".vim")
+ "endif
+ "else
+ "call ada#Switch_Session ('')
+ "endif
+
+ return
+endfunction gnat#Set_Project_File " }}}1
+
+function gnat#Get_Command (Command) dict " {{{1
+ let l:Command = eval ('self.' . a:Command . '_Command')
+ return eval (l:Command)
+endfunction gnat#Get_Command " }}}1
+
+function gnat#Set_Session (...) dict " {{{1
+ if argc() == 1 && fnamemodify (argv(0), ':e') == 'gpr'
+ call self.Set_Project_File (argv(0))
+ elseif strlen (v:servername) > 0
+ call self.Set_Project_File (v:servername . '.gpr')
+ endif
+endfunction gnat#Set_Session " }}}1
+
+function gnat#New () " {{{1
+ let l:Retval = {
+ \ 'Make' : function ('gnat#Make'),
+ \ 'Pretty' : function ('gnat#Pretty'),
+ \ 'Find' : function ('gnat#Find'),
+ \ 'Tags' : function ('gnat#Tags'),
+ \ 'Set_Project_File' : function ('gnat#Set_Project_File'),
+ \ 'Set_Session' : function ('gnat#Set_Session'),
+ \ 'Get_Command' : function ('gnat#Get_Command'),
+ \ 'Project_File' : '',
+ \ 'Make_Command' : '"gnat make -P " . self.Project_File . " -F -gnatef "',
+ \ 'Pretty_Command' : '"gnat pretty -P " . self.Project_File . " "',
+ \ 'Find_Program' : '"gnat find -P " . self.Project_File . " -F "',
+ \ 'Tags_Command' : '"gnat xref -P " . self.Project_File . " -v *.AD*"',
+ \ 'Error_Format' : '%f:%l:%c: %trror: %m,' .
+ \ '%f:%l:%c: %tarning: %m,' .
+ \ '%f:%l:%c: (%ttyle) %m'}
+
+ return l:Retval
+endfunction gnat#New " }}}1
+
+function gnat#Insert_Tags_Header () " {{{1
+ 1insert
+!_TAG_FILE_FORMAT 1 /extended format; --format=1 will not append ;" to lines/
+!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
+!_TAG_PROGRAM_AUTHOR AdaCore /info@adacore.com/
+!_TAG_PROGRAM_NAME gnatxref //
+!_TAG_PROGRAM_URL http://www.adacore.com /official site/
+!_TAG_PROGRAM_VERSION 5.05w //
+.
+ return
+endfunction gnat#Insert_Tags_Header " }}}1
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" vim: foldmethod=marker
diff --git a/runtime/autoload/gzip.vim b/runtime/autoload/gzip.vim
new file mode 100644
index 0000000..e4adec0
--- /dev/null
+++ b/runtime/autoload/gzip.vim
@@ -0,0 +1,220 @@
+" Vim autoload file for editing compressed files.
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2016 Sep 28
+
+" These functions are used by the gzip plugin.
+
+" Function to check that executing "cmd [-f]" works.
+" The result is cached in s:have_"cmd" for speed.
+fun s:check(cmd)
+ let name = substitute(a:cmd, '\(\S*\).*', '\1', '')
+ if !exists("s:have_" . name)
+ let e = executable(name)
+ if e < 0
+ let r = system(name . " --version")
+ let e = (r !~ "not found" && r != "")
+ endif
+ exe "let s:have_" . name . "=" . e
+ endif
+ exe "return s:have_" . name
+endfun
+
+" Set b:gzip_comp_arg to the gzip argument to be used for compression, based on
+" the flags in the compressed file.
+" The only compression methods that can be detected are max speed (-1) and max
+" compression (-9).
+fun s:set_compression(line)
+ " get the Compression Method
+ let l:cm = char2nr(a:line[2])
+ " if it's 8 (DEFLATE), we can check for the compression level
+ if l:cm == 8
+ " get the eXtra FLags
+ let l:xfl = char2nr(a:line[8])
+ " max compression
+ if l:xfl == 2
+ let b:gzip_comp_arg = "-9"
+ " min compression
+ elseif l:xfl == 4
+ let b:gzip_comp_arg = "-1"
+ endif
+ endif
+endfun
+
+
+" After reading compressed file: Uncompress text in buffer with "cmd"
+fun gzip#read(cmd)
+ " don't do anything if the cmd is not supported
+ if !s:check(a:cmd)
+ return
+ endif
+
+ " for gzip check current compression level and set b:gzip_comp_arg.
+ silent! unlet b:gzip_comp_arg
+ if a:cmd[0] == 'g'
+ call s:set_compression(getline(1))
+ endif
+
+ " make 'patchmode' empty, we don't want a copy of the written file
+ let pm_save = &pm
+ set pm=
+ " remove 'a' and 'A' from 'cpo' to avoid the alternate file changes
+ let cpo_save = &cpo
+ set cpo-=a cpo-=A
+ " 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
+ setlocal nofen
+ endif
+
+ " when filtering the whole buffer, it will become empty
+ let empty = line("'[") == 1 && line("']") == line("$")
+ let tmp = tempname()
+ let tmpe = tmp . "." . expand("<afile>:e")
+ if exists('*fnameescape')
+ let tmp_esc = fnameescape(tmp)
+ let tmpe_esc = fnameescape(tmpe)
+ else
+ let tmp_esc = escape(tmp, ' ')
+ let tmpe_esc = escape(tmpe, ' ')
+ endif
+ " write the just read lines to a temp file "'[,']w tmp.gz"
+ execute "silent '[,']w " . tmpe_esc
+ " uncompress the temp file: call system("gzip -dn tmp.gz")
+ call system(a:cmd . " " . s:escape(tmpe))
+ if !filereadable(tmp)
+ " uncompress didn't work! Keep the compressed file then.
+ echoerr "Error: Could not read uncompressed file"
+ let ok = 0
+ else
+ let ok = 1
+ " delete the compressed lines; remember the line number
+ let l = line("'[") - 1
+ if exists(":lockmarks")
+ lockmarks '[,']d _
+ else
+ '[,']d _
+ endif
+ " read in the uncompressed lines "'[-1r tmp"
+ " Use ++edit if the buffer was empty, keep the 'ff' and 'fenc' options.
+ setlocal nobin
+ if exists(":lockmarks")
+ if empty
+ execute "silent lockmarks " . l . "r ++edit " . tmp_esc
+ else
+ execute "silent lockmarks " . l . "r " . tmp_esc
+ endif
+ else
+ execute "silent " . l . "r " . tmp_esc
+ endif
+
+ " if buffer became empty, delete trailing blank line
+ if empty
+ silent $delete _
+ 1
+ endif
+ " delete the temp file and the used buffers
+ call delete(tmp)
+ silent! exe "bwipe " . tmp_esc
+ silent! exe "bwipe " . tmpe_esc
+ endif
+ " Store the OK flag, so that we can use it when writing.
+ let b:uncompressOk = ok
+
+ " Restore saved option values.
+ 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
+
+ " When uncompressed the whole buffer, do autocommands
+ if ok && empty
+ if exists('*fnameescape')
+ let fname = fnameescape(expand("%:r"))
+ else
+ let fname = escape(expand("%:r"), " \t\n*?[{`$\\%#'\"|!<")
+ endif
+ if &verbose >= 8
+ execute "doau BufReadPost " . fname
+ else
+ execute "silent! doau BufReadPost " . fname
+ endif
+ endif
+endfun
+
+" After writing compressed file: Compress written file with "cmd"
+fun gzip#write(cmd)
+ if exists('b:uncompressOk') && !b:uncompressOk
+ echomsg "Not compressing file because uncompress failed; reset b:uncompressOk to compress anyway"
+ " don't do anything if the cmd is not supported
+ elseif s:check(a:cmd)
+ " Rename the file before compressing it.
+ let nm = resolve(expand("<afile>"))
+ let nmt = s:tempname(nm)
+ if rename(nm, nmt) == 0
+ if exists("b:gzip_comp_arg")
+ call system(a:cmd . " " . b:gzip_comp_arg . " -- " . s:escape(nmt))
+ else
+ call system(a:cmd . " -- " . s:escape(nmt))
+ endif
+ call rename(nmt . "." . expand("<afile>:e"), nm)
+ endif
+ endif
+endfun
+
+" Before appending to compressed file: Uncompress file with "cmd"
+fun gzip#appre(cmd)
+ " don't do anything if the cmd is not supported
+ if s:check(a:cmd)
+ let nm = expand("<afile>")
+
+ " for gzip check current compression level and set b:gzip_comp_arg.
+ silent! unlet b:gzip_comp_arg
+ if a:cmd[0] == 'g'
+ call s:set_compression(readfile(nm, "b", 1)[0])
+ endif
+
+ " Rename to a weird name to avoid the risk of overwriting another file
+ let nmt = expand("<afile>:p:h") . "/X~=@l9q5"
+ let nmte = nmt . "." . expand("<afile>:e")
+ if rename(nm, nmte) == 0
+ if &patchmode != "" && getfsize(nm . &patchmode) == -1
+ " Create patchmode file by creating the decompressed file new
+ call system(a:cmd . " -c -- " . s:escape(nmte) . " > " . s:escape(nmt))
+ call rename(nmte, nm . &patchmode)
+ else
+ call system(a:cmd . " -- " . s:escape(nmte))
+ endif
+ call rename(nmt, nm)
+ endif
+ endif
+endfun
+
+" find a file name for the file to be compressed. Use "name" without an
+" extension if possible. Otherwise use a weird name to avoid overwriting an
+" existing file.
+fun s:tempname(name)
+ let fn = fnamemodify(a:name, ":r")
+ if !filereadable(fn) && !isdirectory(fn)
+ return fn
+ endif
+ return fnamemodify(a:name, ":p:h") . "/X~=@l9q5"
+endfun
+
+fun s:escape(name)
+ " shellescape() was added by patch 7.0.111
+ if exists("*shellescape")
+ return shellescape(a:name)
+ endif
+ return "'" . a:name . "'"
+endfun
+
+" vim: set sw=2 :
diff --git a/runtime/autoload/haskellcomplete.vim b/runtime/autoload/haskellcomplete.vim
new file mode 100644
index 0000000..759ff87
--- /dev/null
+++ b/runtime/autoload/haskellcomplete.vim
@@ -0,0 +1,3385 @@
+" Vim completion script
+" Language: Haskell
+" Maintainer: Daniel Campoverde <alx@sillybytes.net>
+" URL: https://github.com/alx741/haskellcomplete.vim
+" Last Change: 2019 May 14
+
+" 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 possible 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
+ let b:completingLangExtension = 0
+ return l:matches
+ endif
+
+
+ elseif b:completingOptionsGHC
+ if a:base ==? ""
+ " Return all possible 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
+ let b:completingOptionsGHC = 0
+ return l:matches
+ endif
+
+
+ elseif b:completingModule
+ if a:base ==? ""
+ " Return all possible modules
+ return s:commonModules
+ else
+ let l:matches = []
+ for module in s:commonModules
+ if module =~? '^' . a:base
+ call add(l:matches, module)
+ endif
+ endfor
+ let b:completingModule = 0
+ 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/htmlcomplete.vim b/runtime/autoload/htmlcomplete.vim
new file mode 100644
index 0000000..267889d
--- /dev/null
+++ b/runtime/autoload/htmlcomplete.vim
@@ -0,0 +1,809 @@
+" Vim completion script
+" Language: HTML and XHTML
+" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Last Change: 2019 Sep 27
+
+" Distinguish between HTML versions.
+" To use with other HTML versions add another "elseif" condition to match
+" proper DOCTYPE.
+function! htmlcomplete#DetectOmniFlavor()
+ if &filetype == 'xhtml'
+ let b:html_omni_flavor = 'xhtml10s'
+ else
+ let b:html_omni_flavor = 'html401t'
+ endif
+ let i = 1
+ let line = ""
+ while i < 10 && i < line("$")
+ let line = getline(i)
+ if line =~ '<!DOCTYPE.*\<DTD '
+ break
+ endif
+ let i += 1
+ endwhile
+ if line =~ '<!DOCTYPE.*\<DTD ' " doctype line found above
+ if line =~ ' HTML 3\.2'
+ let b:html_omni_flavor = 'html32'
+ elseif line =~ ' XHTML 1\.1'
+ let b:html_omni_flavor = 'xhtml11'
+ else " two-step detection with strict/frameset/transitional
+ if line =~ ' XHTML 1\.0'
+ let b:html_omni_flavor = 'xhtml10'
+ elseif line =~ ' HTML 4\.01'
+ let b:html_omni_flavor = 'html401'
+ elseif line =~ ' HTML 4.0\>'
+ let b:html_omni_flavor = 'html40'
+ endif
+ if line =~ '\<Transitional\>'
+ let b:html_omni_flavor .= 't'
+ elseif line =~ '\<Frameset\>'
+ let b:html_omni_flavor .= 'f'
+ else
+ let b:html_omni_flavor .= 's'
+ endif
+ endif
+ endif
+endfunction
+
+function! htmlcomplete#CompleteTags(findstart, base)
+ if a:findstart
+ " locate the start of the word
+ let line = getline('.')
+ let start = col('.') - 1
+ let curline = line('.')
+ let compl_begin = col('.') - 2
+ while start >= 0 && line[start - 1] =~ '\(\k\|[!:.-]\)'
+ let start -= 1
+ endwhile
+ " Handling of entities {{{
+ if start >= 0 && line[start - 1] =~ '&'
+ let b:entitiescompl = 1
+ let b:compl_context = ''
+ return start
+ endif
+ " }}}
+ " Handling of <style> tag {{{
+ let stylestart = searchpair('<style\>', '', '<\/style\>', "bnW")
+ let styleend = searchpair('<style\>', '', '<\/style\>', "nW")
+ if stylestart != 0 && styleend != 0
+ if stylestart <= curline && styleend >= curline
+ let start = col('.') - 1
+ let b:csscompl = 1
+ while start >= 0 && line[start - 1] =~ '\(\k\|-\)'
+ let start -= 1
+ endwhile
+ endif
+ endif
+ " }}}
+ " Handling of <script> tag {{{
+ let scriptstart = searchpair('<script\>', '', '<\/script\>', "bnW")
+ let scriptend = searchpair('<script\>', '', '<\/script\>', "nW")
+ if scriptstart != 0 && scriptend != 0
+ if scriptstart <= curline && scriptend >= curline
+ let start = col('.') - 1
+ let b:jscompl = 1
+ let b:jsrange = [scriptstart, scriptend]
+ while start >= 0 && line[start - 1] =~ '\k'
+ let start -= 1
+ endwhile
+ " We are inside of <script> tag. But we should also get contents
+ " of all linked external files and (secondary, less probably) other <script> tags
+ " This logic could possible be done in separate function - may be
+ " reused in events scripting (also with option could be reused for
+ " CSS
+ let b:js_extfiles = []
+ let l = line('.')
+ let c = col('.')
+ call cursor(1,1)
+ while search('<\@<=script\>', 'W') && line('.') <= l
+ if synIDattr(synID(line('.'),col('.')-1,0),"name") !~? 'comment'
+ let sname = matchstr(getline('.'), '<script[^>]*src\s*=\s*\([''"]\)\zs.\{-}\ze\1')
+ if filereadable(sname)
+ let b:js_extfiles += readfile(sname)
+ endif
+ endif
+ endwhile
+ call cursor(1,1)
+ let js_scripttags = []
+ while search('<script\>', 'W') && line('.') < l
+ if matchstr(getline('.'), '<script[^>]*src') == ''
+ let js_scripttag = getline(line('.'), search('</script>', 'W'))
+ let js_scripttags += js_scripttag
+ endif
+ endwhile
+ let b:js_extfiles += js_scripttags
+ call cursor(l,c)
+ unlet! l c
+ endif
+ endif
+ " }}}
+ if !exists("b:csscompl") && !exists("b:jscompl")
+ let b:compl_context = getline('.')[0:(compl_begin)]
+ if b:compl_context !~ '<[^>]*$'
+ " Look like we may have broken tag. Check previous lines.
+ let i = 1
+ while 1
+ let context_line = getline(curline-i)
+ if context_line =~ '<[^>]*$'
+ " Yep, this is this line
+ let context_lines = getline(curline-i, curline-1) + [b:compl_context]
+ let b:compl_context = join(context_lines, ' ')
+ break
+ elseif context_line =~ '>[^<]*$' || i == curline
+ " We are in normal tag line, no need for completion at all
+ " OR reached first line without tag at all
+ let b:compl_context = ''
+ break
+ endif
+ let i += 1
+ endwhile
+ " Make sure we don't have counter
+ unlet! i
+ endif
+ let b:compl_context = matchstr(b:compl_context, '.*\zs<.*')
+
+ " Return proper start for on-events. Without that beginning of
+ " completion will be badly reported
+ if b:compl_context =~? 'on[a-z]*\s*=\s*\(''[^'']*\|"[^"]*\)$'
+ let start = col('.') - 1
+ while start >= 0 && line[start - 1] =~ '\k'
+ let start -= 1
+ endwhile
+ endif
+ " If b:compl_context begins with <? we are inside of PHP code. It
+ " wasn't closed so PHP completion passed it to HTML
+ if &filetype =~? 'php' && b:compl_context =~ '^<?'
+ let b:phpcompl = 1
+ let start = col('.') - 1
+ while start >= 0 && line[start - 1] =~ '[a-zA-Z_0-9\x7f-\xff$]'
+ let start -= 1
+ endwhile
+ endif
+ else
+ let b:compl_context = getline('.')[0:compl_begin]
+ endif
+ return start
+ else
+ " Initialize base return lists
+ let res = []
+ let res2 = []
+ " a:base is very short - we need context
+ let context = b:compl_context
+ " Check if we should do CSS completion inside of <style> tag
+ " or JS completion inside of <script> tag or PHP completion in case of <?
+ " tag AND &ft==php
+ if exists("b:csscompl")
+ unlet! b:csscompl
+ let context = b:compl_context
+ unlet! b:compl_context
+ return csscomplete#CompleteCSS(0, context)
+ elseif exists("b:jscompl")
+ unlet! b:jscompl
+ return javascriptcomplete#CompleteJS(0, a:base)
+ elseif exists("b:phpcompl")
+ unlet! b:phpcompl
+ let context = b:compl_context
+ return phpcomplete#CompletePHP(0, a:base)
+ else
+ if len(b:compl_context) == 0 && !exists("b:entitiescompl")
+ return []
+ endif
+ let context = matchstr(b:compl_context, '.\zs.*')
+ endif
+ unlet! b:compl_context
+ " Entities completion {{{
+ if exists("b:entitiescompl")
+ unlet! b:entitiescompl
+
+ if !exists("b:html_doctype")
+ call htmlcomplete#CheckDoctype()
+ endif
+ if !exists("b:html_omni")
+ "runtime! autoload/xml/xhtml10s.vim
+ call htmlcomplete#LoadData()
+ endif
+
+ let entities = b:html_omni['vimxmlentities']
+
+ if len(a:base) == 1
+ for m in entities
+ if m =~ '^'.a:base
+ call add(res, m.';')
+ endif
+ endfor
+ return res
+ else
+ for m in entities
+ if m =~? '^'.a:base
+ call add(res, m.';')
+ elseif m =~? a:base
+ call add(res2, m.';')
+ endif
+ endfor
+
+ return res + res2
+ endif
+
+
+ endif
+ " }}}
+ if context =~ '>'
+ " Generally if context contains > it means we are outside of tag and
+ " should abandon action - with one exception: <style> span { bo
+ if context =~ 'style[^>]\{-}>[^<]\{-}$'
+ return csscomplete#CompleteCSS(0, context)
+ elseif context =~ 'script[^>]\{-}>[^<]\{-}$'
+ let b:jsrange = [line('.'), search('<\/script\>', 'nW')]
+ return javascriptcomplete#CompleteJS(0, context)
+ else
+ return []
+ endif
+ endif
+
+ " If context contains > it means we are already outside of tag and we
+ " should abandon action
+ " If context contains white space it is attribute.
+ " It can be also value of attribute.
+ " We have to get first word to offer proper completions
+ if context =~ '^\s*$'
+ " empty or whitespace line
+ let tag = ''
+ else
+ let tag = split(context)[0]
+ " Detect if tag is uppercase to return in proper case,
+ " we need to make it lowercase for processing
+ if tag =~ '^[A-Z]*$'
+ let uppercase_tag = 1
+ let tag = tolower(tag)
+ else
+ let uppercase_tag = 0
+ endif
+ endif
+ " Get last word, it should be attr name
+ let attr = matchstr(context, '.*\s\zs.*')
+ " Possible situations where any prediction would be difficult:
+ " 1. Events attributes
+ if context =~ '\s'
+ " Sort out style, class, and on* cases
+ if context =~? "\\(on[a-z]*\\|id\\|style\\|class\\)\\s*=\\s*[\"']"
+ " Id, class completion {{{
+ if context =~? "\\(id\\|class\\)\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
+ if context =~? "class\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
+ let search_for = "class"
+ elseif context =~? "id\\s*=\\s*[\"'][a-zA-Z0-9_ -]*$"
+ let search_for = "id"
+ endif
+ " Handle class name completion
+ " 1. Find lines of <link stylesheet>
+ " 1a. Check file for @import
+ " 2. Extract filename(s?) of stylesheet,
+ call cursor(1,1)
+ let head = getline(search('<head\>'), search('<\/head>'))
+ let headjoined = join(copy(head), ' ')
+ if headjoined =~ '<style'
+ " Remove possibly confusing CSS operators
+ let stylehead = substitute(headjoined, '+>\*[,', ' ', 'g')
+ if search_for == 'class'
+ let styleheadlines = split(stylehead)
+ let headclasslines = filter(copy(styleheadlines), "v:val =~ '\\([a-zA-Z0-9:]\\+\\)\\?\\.[a-zA-Z0-9_-]\\+'")
+ else
+ let stylesheet = split(headjoined, '[{}]')
+ " Get all lines which fit id syntax
+ let classlines = filter(copy(stylesheet), "v:val =~ '#[a-zA-Z0-9_-]\\+'")
+ " Filter out possible color definitions
+ call filter(classlines, "v:val !~ ':\\s*#[a-zA-Z0-9_-]\\+'")
+ " Filter out complex border definitions
+ call filter(classlines, "v:val !~ '\\(none\\|hidden\\|dotted\\|dashed\\|solid\\|double\\|groove\\|ridge\\|inset\\|outset\\)\\s*#[a-zA-Z0-9_-]\\+'")
+ let templines = join(classlines, ' ')
+ let headclasslines = split(templines)
+ call filter(headclasslines, "v:val =~ '#[a-zA-Z0-9_-]\\+'")
+ endif
+ let internal = 1
+ else
+ let internal = 0
+ endif
+ let styletable = []
+ let secimportfiles = []
+ let filestable = filter(copy(head), "v:val =~ '\\(@import\\|link.*stylesheet\\)'")
+ for line in filestable
+ if line =~ "@import"
+ let styletable += [matchstr(line, "import\\s\\+\\(url(\\)\\?[\"']\\?\\zs\\f\\+\\ze")]
+ elseif line =~ "<link"
+ let styletable += [matchstr(line, "href\\s*=\\s*[\"']\\zs\\f\\+\\ze")]
+ endif
+ endfor
+ for file in styletable
+ if filereadable(file)
+ let stylesheet = readfile(file)
+ let secimport = filter(copy(stylesheet), "v:val =~ '@import'")
+ if len(secimport) > 0
+ for line in secimport
+ let secfile = matchstr(line, "import\\s\\+\\(url(\\)\\?[\"']\\?\\zs\\f\\+\\ze")
+ let secfile = fnamemodify(file, ":p:h").'/'.secfile
+ let secimportfiles += [secfile]
+ endfor
+ endif
+ endif
+ endfor
+ let cssfiles = styletable + secimportfiles
+ let classes = []
+ for file in cssfiles
+ let classlines = []
+ if filereadable(file)
+ let stylesheet = readfile(file)
+ let stylefile = join(stylesheet, ' ')
+ let stylefile = substitute(stylefile, '+>\*[,', ' ', 'g')
+ if search_for == 'class'
+ let stylesheet = split(stylefile)
+ let classlines = filter(copy(stylesheet), "v:val =~ '\\([a-zA-Z0-9:]\\+\\)\\?\\.[a-zA-Z0-9_-]\\+'")
+ else
+ let stylesheet = split(stylefile, '[{}]')
+ " Get all lines which fit id syntax
+ let classlines = filter(copy(stylesheet), "v:val =~ '#[a-zA-Z0-9_-]\\+'")
+ " Filter out possible color definitions
+ call filter(classlines, "v:val !~ ':\\s*#[a-zA-Z0-9_-]\\+'")
+ " Filter out complex border definitions
+ call filter(classlines, "v:val !~ '\\(none\\|hidden\\|dotted\\|dashed\\|solid\\|double\\|groove\\|ridge\\|inset\\|outset\\)\\s*#[a-zA-Z0-9_-]\\+'")
+ let templines = join(classlines, ' ')
+ let stylelines = split(templines)
+ let classlines = filter(stylelines, "v:val =~ '#[a-zA-Z0-9_-]\\+'")
+
+ endif
+ endif
+ " We gathered classes definitions from all external files
+ let classes += classlines
+ endfor
+ if internal == 1
+ let classes += headclasslines
+ endif
+
+ if search_for == 'class'
+ let elements = {}
+ for element in classes
+ if element =~ '^\.'
+ let class = matchstr(element, '^\.\zs[a-zA-Z][a-zA-Z0-9_-]*\ze')
+ let class = substitute(class, ':.*', '', '')
+ if has_key(elements, 'common')
+ let elements['common'] .= ' '.class
+ else
+ let elements['common'] = class
+ endif
+ else
+ let class = matchstr(element, '[a-zA-Z1-6]*\.\zs[a-zA-Z][a-zA-Z0-9_-]*\ze')
+ let tagname = tolower(matchstr(element, '[a-zA-Z1-6]*\ze.'))
+ if tagname != ''
+ if has_key(elements, tagname)
+ let elements[tagname] .= ' '.class
+ else
+ let elements[tagname] = class
+ endif
+ endif
+ endif
+ endfor
+
+ if has_key(elements, tag) && has_key(elements, 'common')
+ let values = split(elements[tag]." ".elements['common'])
+ elseif has_key(elements, tag) && !has_key(elements, 'common')
+ let values = split(elements[tag])
+ elseif !has_key(elements, tag) && has_key(elements, 'common')
+ let values = split(elements['common'])
+ else
+ return []
+ endif
+
+ elseif search_for == 'id'
+ " Find used IDs
+ " 1. Catch whole file
+ let filelines = getline(1, line('$'))
+ " 2. Find lines with possible id
+ let used_id_lines = filter(filelines, 'v:val =~ "id\\s*=\\s*[\"''][a-zA-Z0-9_-]\\+"')
+ " 3a. Join all filtered lines
+ let id_string = join(used_id_lines, ' ')
+ " 3b. And split them to be sure each id is in separate item
+ let id_list = split(id_string, 'id\s*=\s*')
+ " 4. Extract id values
+ let used_id = map(id_list, 'matchstr(v:val, "[\"'']\\zs[a-zA-Z0-9_-]\\+\\ze")')
+ let joined_used_id = ','.join(used_id, ',').','
+
+ let allvalues = map(classes, 'matchstr(v:val, ".*#\\zs[a-zA-Z0-9_-]\\+")')
+
+ let values = []
+
+ for element in classes
+ if joined_used_id !~ ','.element.','
+ let values += [element]
+ endif
+
+ endfor
+
+ endif
+
+ " We need special version of sbase
+ let classbase = matchstr(context, ".*[\"']")
+ let classquote = matchstr(classbase, '.$')
+
+ let entered_class = matchstr(attr, ".*=\\s*[\"']\\zs.*")
+
+ for m in sort(values)
+ if m =~? '^'.entered_class
+ call add(res, m . classquote)
+ elseif m =~? entered_class
+ call add(res2, m . classquote)
+ endif
+ endfor
+
+ return res + res2
+
+ elseif context =~? "style\\s*=\\s*[\"'][^\"']*$"
+ return csscomplete#CompleteCSS(0, context)
+
+ endif
+ " }}}
+ " Complete on-events {{{
+ if context =~? 'on[a-z]*\s*=\s*\(''[^'']*\|"[^"]*\)$'
+ " We have to:
+ " 1. Find external files
+ let b:js_extfiles = []
+ let l = line('.')
+ let c = col('.')
+ call cursor(1,1)
+ while search('<\@<=script\>', 'W') && line('.') <= l
+ if synIDattr(synID(line('.'),col('.')-1,0),"name") !~? 'comment'
+ let sname = matchstr(getline('.'), '<script[^>]*src\s*=\s*\([''"]\)\zs.\{-}\ze\1')
+ if filereadable(sname)
+ let b:js_extfiles += readfile(sname)
+ endif
+ endif
+ endwhile
+ " 2. Find at least one <script> tag
+ call cursor(1,1)
+ let js_scripttags = []
+ while search('<script\>', 'W') && line('.') < l
+ if matchstr(getline('.'), '<script[^>]*src') == ''
+ let js_scripttag = getline(line('.'), search('</script>', 'W'))
+ let js_scripttags += js_scripttag
+ endif
+ endwhile
+ let b:js_extfiles += js_scripttags
+
+ " 3. Proper call for javascriptcomplete#CompleteJS
+ call cursor(l,c)
+ let js_context = matchstr(a:base, '\k\+$')
+ let js_shortcontext = substitute(a:base, js_context.'$', '', '')
+ let b:compl_context = context
+ let b:jsrange = [l, l]
+ unlet! l c
+ return javascriptcomplete#CompleteJS(0, js_context)
+
+ endif
+
+ " }}}
+ let stripbase = matchstr(context, ".*\\(on[a-zA-Z]*\\|style\\|class\\)\\s*=\\s*[\"']\\zs.*")
+ " Now we have context stripped from all chars up to style/class.
+ " It may fail with some strange style value combinations.
+ if stripbase !~ "[\"']"
+ return []
+ endif
+ endif
+ " Value of attribute completion {{{
+ " If attr contains =\s*[\"'] we match value of attribute
+ if attr =~ "=\s*[\"']" || attr =~ "=\s*$"
+ " Let do attribute specific completion
+ let attrname = matchstr(attr, '.*\ze\s*=')
+ let entered_value = matchstr(attr, ".*=\\s*[\"']\\?\\zs.*")
+ let values = []
+ " Load data {{{
+ if !exists("b:html_doctype")
+ call htmlcomplete#CheckDoctype()
+ endif
+ if !exists("b:html_omni")
+ "runtime! autoload/xml/xhtml10s.vim
+ call htmlcomplete#LoadData()
+ endif
+ " }}}
+ if attrname == 'href'
+ " Now we are looking for local anchors defined by name or id
+ if entered_value =~ '^#'
+ let file = join(getline(1, line('$')), ' ')
+ " Split it be sure there will be one id/name element in
+ " item, it will be also first word [a-zA-Z0-9_-] in element
+ let oneelement = split(file, "\\(meta \\)\\@<!\\(name\\|id\\)\\s*=\\s*[\"']")
+ for i in oneelement
+ let values += ['#'.matchstr(i, "^[a-zA-Z][a-zA-Z0-9%_-]*")]
+ endfor
+ endif
+ else
+ if has_key(b:html_omni, tag) && has_key(b:html_omni[tag][1], attrname)
+ let values = b:html_omni[tag][1][attrname]
+ else
+ return []
+ endif
+ endif
+
+ if len(values) == 0
+ return []
+ endif
+
+ " We need special version of sbase
+ let attrbase = matchstr(context, ".*[\"']")
+ let attrquote = matchstr(attrbase, '.$')
+ if attrquote !~ "['\"]"
+ let attrquoteopen = '"'
+ let attrquote = '"'
+ else
+ let attrquoteopen = ''
+ endif
+
+ for m in values
+ " This if is needed to not offer all completions as-is
+ " alphabetically but sort them. Those beginning with entered
+ " part will be as first choices
+ if m =~ '^'.entered_value
+ call add(res, attrquoteopen . m . attrquote)
+ elseif m =~ entered_value
+ call add(res2, attrquoteopen . m . attrquote)
+ endif
+ endfor
+
+ return res + res2
+
+ endif
+ " }}}
+ " Attribute completion {{{
+ " Shorten context to not include last word
+ let sbase = matchstr(context, '.*\ze\s.*')
+
+ " Load data {{{
+ if !exists("b:html_doctype")
+ call htmlcomplete#CheckDoctype()
+ endif
+ if !exists("b:html_omni")
+ call htmlcomplete#LoadData()
+ endif
+ " }}}
+
+ if has_key(b:html_omni, tag)
+ let attrs = keys(b:html_omni[tag][1])
+ else
+ return []
+ endif
+
+ for m in sort(attrs)
+ if m =~ '^'.attr
+ call add(res, m)
+ elseif m =~ attr
+ call add(res2, m)
+ endif
+ endfor
+ let menu = res + res2
+ if has_key(b:html_omni, 'vimxmlattrinfo')
+ let final_menu = []
+ for i in range(len(menu))
+ let item = menu[i]
+ if has_key(b:html_omni['vimxmlattrinfo'], item)
+ let m_menu = b:html_omni['vimxmlattrinfo'][item][0]
+ let m_info = b:html_omni['vimxmlattrinfo'][item][1]
+ else
+ let m_menu = ''
+ let m_info = ''
+ endif
+ if len(b:html_omni[tag][1][item]) > 0 && b:html_omni[tag][1][item][0] =~ '^\(BOOL\|'.item.'\)$'
+ let item = item
+ let m_menu = 'Bool'
+ else
+ let item .= '="'
+ endif
+ let final_menu += [{'word':item, 'menu':m_menu, 'info':m_info}]
+ endfor
+ else
+ let final_menu = []
+ for i in range(len(menu))
+ let item = menu[i]
+ if len(b:html_omni[tag][1][item]) > 0 && b:html_omni[tag][1][item][0] =~ '^\(BOOL\|'.item.'\)$'
+ let item = item
+ else
+ let item .= '="'
+ endif
+ let final_menu += [item]
+ endfor
+ return final_menu
+
+ endif
+ return final_menu
+
+ endif
+ " }}}
+ " Close tag {{{
+ let b:unaryTagsStack = "base meta link hr br param img area input col"
+ if context =~ '^\/'
+ if context =~ '^\/.'
+ return []
+ else
+ let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
+ return [opentag.">"]
+ endif
+ endif
+ " }}}
+ " Load data {{{
+ if !exists("b:html_doctype")
+ call htmlcomplete#CheckDoctype()
+ endif
+ if !exists("b:html_omni")
+ "runtime! autoload/xml/xhtml10s.vim
+ call htmlcomplete#LoadData()
+ endif
+ " }}}
+ " Tag completion {{{
+ " Deal with tag completion.
+ let opentag = tolower(xmlcomplete#GetLastOpenTag("b:unaryTagsStack"))
+ " MM: TODO: GLOT works always the same but with some weird situation it
+ " behaves as intended in HTML but screws in PHP
+ if opentag == '' || &filetype == 'php' && !has_key(b:html_omni, opentag)
+ " Hack for sometimes failing GetLastOpenTag.
+ " As far as I tested fail isn't GLOT fault but problem
+ " of invalid document - not properly closed tags and other mish-mash.
+ " Also when document is empty. Return list of *all* tags.
+ let tags = keys(b:html_omni)
+ call filter(tags, 'v:val !~ "^vimxml"')
+ else
+ if has_key(b:html_omni, opentag)
+ let tags = b:html_omni[opentag][0]
+ else
+ return []
+ endif
+ endif
+ " }}}
+
+ if exists("uppercase_tag") && uppercase_tag == 1
+ let context = tolower(context)
+ endif
+ " Handle XML keywords: DOCTYPE
+ if opentag == ''
+ let tags += [
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN" "http://www.w3.org/TR/REC-html40/frameset.dtd">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
+ \ '!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/1999/xhtml">'
+ \ ]
+ endif
+
+ for m in sort(tags)
+ if m =~ '^'.context
+ call add(res, m)
+ elseif m =~ context
+ call add(res2, m)
+ endif
+ endfor
+ let menu = res + res2
+ if has_key(b:html_omni, 'vimxmltaginfo')
+ let final_menu = []
+ for i in range(len(menu))
+ let item = menu[i]
+ if has_key(b:html_omni['vimxmltaginfo'], item)
+ let m_menu = b:html_omni['vimxmltaginfo'][item][0]
+ let m_info = b:html_omni['vimxmltaginfo'][item][1]
+ else
+ let m_menu = ''
+ let m_info = ''
+ endif
+ if &filetype == 'html' && exists("uppercase_tag") && uppercase_tag == 1 && item !~ 'DOCTYPE'
+ let item = toupper(item)
+ endif
+ if item =~ 'DOCTYPE'
+ let abbr = 'DOCTYPE '.matchstr(item, 'DTD \zsX\?HTML .\{-}\ze\/\/')
+ else
+ let abbr = item
+ endif
+ let final_menu += [{'abbr':abbr, 'word':item, 'menu':m_menu, 'info':m_info}]
+ endfor
+ else
+ let final_menu = menu
+ endif
+ return final_menu
+
+ " }}}
+ endif
+endfunction
+
+function! htmlcomplete#LoadData() " {{{
+ if !exists("b:html_omni_flavor")
+ if &filetype == 'html'
+ let b:html_omni_flavor = 'html401t'
+ else
+ let b:html_omni_flavor = 'xhtml10s'
+ endif
+ endif
+ " With that if we still have bloated memory but create new buffer
+ " variables only by linking to existing g:variable, not sourcing whole
+ " file.
+ if exists('g:xmldata_'.b:html_omni_flavor)
+ exe 'let b:html_omni = g:xmldata_'.b:html_omni_flavor
+ else
+ exe 'runtime! autoload/xml/'.b:html_omni_flavor.'.vim'
+ exe 'let b:html_omni = g:xmldata_'.b:html_omni_flavor
+ endif
+endfunction
+" }}}
+function! htmlcomplete#CheckDoctype() " {{{
+ if exists('b:html_omni_flavor')
+ let old_flavor = b:html_omni_flavor
+ else
+ let old_flavor = ''
+ endif
+ let i = 1
+ while i < 10 && i < line("$")
+ let line = getline(i)
+ if line =~ '<!DOCTYPE.*\<DTD HTML 3\.2'
+ let b:html_omni_flavor = 'html32'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.0 Transitional'
+ let b:html_omni_flavor = 'html40t'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.0 Frameset'
+ let b:html_omni_flavor = 'html40f'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.0'
+ let b:html_omni_flavor = 'html40s'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.01 Transitional'
+ let b:html_omni_flavor = 'html401t'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.01 Frameset'
+ let b:html_omni_flavor = 'html401f'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD HTML 4\.01'
+ let b:html_omni_flavor = 'html401s'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD XHTML 1\.0 Transitional'
+ let b:html_omni_flavor = 'xhtml10t'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD XHTML 1\.0 Frameset'
+ let b:html_omni_flavor = 'xhtml10f'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD XHTML 1\.0 Strict'
+ let b:html_omni_flavor = 'xhtml10s'
+ let b:html_doctype = 1
+ break
+ elseif line =~ '<!DOCTYPE.*\<DTD XHTML 1\.1'
+ let b:html_omni_flavor = 'xhtml11'
+ let b:html_doctype = 1
+ break
+ endif
+ let i += 1
+ endwhile
+ if !exists("b:html_doctype")
+ return
+ else
+ " Tie g:xmldata with b:html_omni this way we need to sourca data file only
+ " once, not every time per buffer.
+ if old_flavor == b:html_omni_flavor
+ return
+ else
+ if exists('g:xmldata_'.b:html_omni_flavor)
+ exe 'let b:html_omni = g:xmldata_'.b:html_omni_flavor
+ else
+ exe 'runtime! autoload/xml/'.b:html_omni_flavor.'.vim'
+ exe 'let b:html_omni = g:xmldata_'.b:html_omni_flavor
+ endif
+ return
+ endif
+ endif
+endfunction
+" }}}
+" vim:set foldmethod=marker:
diff --git a/runtime/autoload/javascriptcomplete.vim b/runtime/autoload/javascriptcomplete.vim
new file mode 100644
index 0000000..29b6b16
--- /dev/null
+++ b/runtime/autoload/javascriptcomplete.vim
@@ -0,0 +1,647 @@
+" Vim completion script
+" Language: Java Script
+" Maintainer: Jay Sitter (jay@jaysitter.com)
+" URL: https://github.com/jsit/javascriptcomplete.vim/
+" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Last Change: 2020 Jul 30
+
+function! javascriptcomplete#CompleteJS(findstart, base)
+ if a:findstart
+ " locate the start of the word
+ let line = getline('.')
+ let start = col('.') - 1
+ let curline = line('.')
+ let compl_begin = col('.') - 2
+ " Bit risky but JS is rather limited language and local chars shouldn't
+ " fint way into names
+ while start >= 0 && line[start - 1] =~ '\k'
+ let start -= 1
+ endwhile
+ let b:compl_context = getline('.')[0:compl_begin]
+ return start
+ else
+ " Initialize base return lists
+ let res = []
+ let res2 = []
+ " a:base is very short - we need context
+ " Shortcontext is context without a:base, useful for checking if we are
+ " looking for objects and for what objects we are looking for
+ let context = b:compl_context
+ let shortcontext = substitute(context, a:base.'$', '', '')
+ unlet! b:compl_context
+
+ if exists("b:jsrange")
+ let file = getline(b:jsrange[0],b:jsrange[1])
+ unlet! b:jsrange
+
+ if len(b:js_extfiles) > 0
+ let file = b:js_extfiles + file
+ endif
+
+ else
+ let file = getline(1, '$')
+ endif
+
+
+ " Completion of properties, methods, etc. {{{
+ if shortcontext =~ '\.$'
+ " Complete methods and properties for objects
+ " DOM separate
+ let doms = ['style.']
+ " Arrays
+ let arrayprop = ['constructor', 'index', 'input', 'length', 'prototype']
+ let arraymeth = ['concat', 'join', 'pop', 'push', 'reverse', 'shift',
+ \ 'splice', 'sort', 'toSource', 'toString', 'unshift', 'valueOf',
+ \ 'watch', 'unwatch']
+ call map(arraymeth, 'v:val."("')
+ let arrays = arrayprop + arraymeth
+
+ " Boolean - complete subset of array values
+ " properties - constructor, prototype
+ " methods - toSource, toString, valueOf
+
+ " Date
+ " properties - constructor, prototype
+ let datemeth = ['getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds',
+ \ 'getMinutes', 'getMonth', 'getSeconds', 'getTime', 'getTimezoneOffset',
+ \ 'getUTCDate', 'getUTCDay', 'getUTCFullYear', 'getUTCHours', 'getUTCMilliseconds',
+ \ 'getUTCMinutes', 'getUTCMonth', 'getUTCSeconds',
+ \ 'getYear', 'parse', 'parse',
+ \ 'setDate', 'setDay', 'setFullYear', 'setHours', 'setMilliseconds',
+ \ 'setMinutes', 'setMonth', 'setSeconds',
+ \ 'setUTCDate', 'setUTCDay', 'setUTCFullYear', 'setUTCHours', 'setUTCMilliseconds',
+ \ 'setUTCMinutes', 'setUTCMonth', 'setUTCSeconds', 'setYear', 'setTime',
+ \ 'toGMTString', 'toLocaleString', 'toLocaleDateString', 'toLocaleTimeString',
+ \ 'toSource', 'toString', 'toUTCString', 'UTC', 'valueOf', 'watch', 'unwatch']
+ call map(datemeth, 'v:val."("')
+ let dates = datemeth
+
+ " Function
+ let funcprop = ['arguments', 'arguments.callee', 'arguments.caller', 'arguments.length',
+ \ 'arity', 'constructor', 'length', 'prototype']
+ let funcmeth = ['apply', 'call', 'toSource', 'toString', 'valueOf']
+ call map(funcmeth, 'v:val."("')
+ let funcs = funcprop + funcmeth
+
+ " Math
+ let mathprop = ['E', 'LN2', 'LN10', 'LOG2E', 'LOG10E', 'PI', 'SQRT1_2', 'SQRT']
+ let mathmeth = ['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor',
+ \ 'log', 'max', 'min', 'pow', 'random', 'round', 'sin', 'sqrt', 'tan',
+ \ 'watch', 'unwatch']
+ call map(mathmeth, 'v:val."("')
+ let maths = mathprop + mathmeth
+
+ " Number
+ let numbprop = ['MAX_VALUE', 'MIN_VALUE', 'NaN', 'NEGATIVE_INFINITY', 'POSITIVE_INFINITY',
+ \ 'constructor', 'prototype']
+ let numbmeth = ['toExponential', 'toFixed', 'toPrecision', 'toSource', 'toString', 'valueOf',
+ \ 'watch', 'unwatch']
+ call map(numbmeth, 'v:val."("')
+ let numbs = numbprop + numbmeth
+
+ " Object
+ let objeprop = ['constructor', 'prototype']
+ let objemeth = ['eval', 'toSource', 'toString', 'unwatch', 'watch', 'valueOf']
+ call map(objemeth, 'v:val."("')
+ let objes = objeprop + objemeth
+
+ " RegExp
+ let regeprop = ['constructor', 'global', 'ignoreCase', 'lastIndex', 'multiline', 'source', 'prototype']
+ let regemeth = ['exec', 'test', 'toSource', 'toString', 'watch', 'unwatch']
+ call map(regemeth, 'v:val."("')
+ let reges = regeprop + regemeth
+
+ " String
+ let striprop = ['constructor', 'length', 'prototype']
+ let strimeth = ['anchor', 'big', 'blink', 'bold', 'charAt', 'charCodeAt', 'concat',
+ \ 'fixed', 'fontcolor', 'fontsize', 'fromCharCode', 'indexOf', 'italics',
+ \ 'lastIndexOf', 'link', 'match', 'replace', 'search', 'slice', 'small',
+ \ 'split', 'strike', 'sub', 'substr', 'substring', 'sup', 'toLowerCase',
+ \ 'toSource', 'toString', 'toUpperCase', 'watch', 'unwatch']
+ call map(strimeth, 'v:val."("')
+ let stris = striprop + strimeth
+
+ " User created properties
+ let user_props1 = filter(copy(file), 'v:val =~ "this\\.\\k"')
+ let juser_props1 = join(user_props1, ' ')
+ let user_props1 = split(juser_props1, '\zethis\.')
+ unlet! juser_props1
+ call map(user_props1, 'matchstr(v:val, "this\\.\\zs\\k\\+\\ze")')
+
+ let user_props2 = filter(copy(file), 'v:val =~ "\\.prototype\\.\\k"')
+ let juser_props2 = join(user_props2, ' ')
+ let user_props2 = split(juser_props2, '\zeprototype\.')
+ unlet! juser_props2
+ call map(user_props2, 'matchstr(v:val, "prototype\\.\\zs\\k\\+\\ze")')
+ let user_props = user_props1 + user_props2
+
+ " HTML DOM properties
+ " Anchors - anchor.
+ let anchprop = ['accessKey', 'charset', 'coords', 'href', 'hreflang', 'id', 'innerHTML',
+ \ 'name', 'rel', 'rev', 'shape', 'tabIndex', 'target', 'type', 'onBlur', 'onFocus']
+ let anchmeth = ['blur', 'focus']
+ call map(anchmeth, 'v:val."("')
+ let anths = anchprop + anchmeth
+ " Area - area.
+ let areaprop = ['accessKey', 'alt', 'coords', 'hash', 'host', 'hostname', 'href', 'id',
+ \ 'noHref', 'pathname', 'port', 'protocol', 'search', 'shape', 'tabIndex', 'target']
+ let areameth = ['onClick', 'onDblClick', 'onMouseOut', 'onMouseOver']
+ call map(areameth, 'v:val."("')
+ let areas = areaprop + areameth
+ " Base - base.
+ let baseprop = ['href', 'id', 'target']
+ let bases = baseprop
+ " Body - body.
+ let bodyprop = ['aLink', 'background', 'gbColor', 'id', 'link', 'scrollLeft', 'scrollTop',
+ \ 'text', 'vLink']
+ let bodys = bodyprop
+ " Document - document.
+ let docuprop = ['anchors', 'body', 'characterSet', 'doctype',
+ \ 'documentElement', 'documentURI', 'embeds', 'fonts', 'forms',
+ \ 'head', 'hidden', 'images', 'implementation', 'lastStyleSheetSet',
+ \ 'links', 'plugins', 'preferredStyleSheetSet', 'scripts',
+ \ 'scrollingElement', 'selectedStyleSheetSet', 'styleSheetSets',
+ \ 'timeline', 'visibilityState', 'cookie', 'defaultView',
+ \ 'designMode', 'dir', 'domain', 'lastModified', 'location',
+ \ 'readyState', 'referrer', 'title', 'URL', 'activeElement',
+ \ 'fullscreenElement', 'styleSheets']
+ let documeth = ['adoptNode', 'close', 'createAttribute',
+ \ 'createAttributeNS', 'createCDATASection', 'createComment',
+ \ 'createDocumentFragment', 'createElement', 'createElementNS',
+ \ 'createEvent', 'createExpression', 'createNSResolver',
+ \ 'createNodeIterator', 'createProcessingInstruction', 'createRange',
+ \ 'createTextNode', 'createTouchList', 'createTreeWalker',
+ \ 'enableStyleSheetsForSet', 'evaluate', 'focus', 'getElementById',
+ \ 'getElementById', 'getElementsByClassName', 'getElementsByName',
+ \ 'getElementsByTagName', 'getElementsByTagNameNS',
+ \ 'hasStorageAccess', 'importNode', 'onClick', 'onDblClick',
+ \ 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onMouseDown',
+ \ 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp',
+ \ 'onResize', 'open', 'querySelector', 'querySelectorAll',
+ \ 'requestStorageAccess', 'write', 'writeln']
+
+ call map(documeth, 'v:val."("')
+ let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
+ \ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
+ \ 'nodeValue', 'ownerDocument', 'parentNode', 'previousSibling']
+ let docuxmeth = ['createAttribute', 'createCDATASection',
+ \ 'createComment', 'createDocument', 'createDocumentFragment',
+ \ 'createElement', 'createEntityReference', 'createProcessingInstruction',
+ \ 'createTextNode']
+ call map(docuxmeth, 'v:val."("')
+ let docus = docuprop + docuxprop + documeth + docuxmeth
+ " Form - form.
+ let formprop = ['elements', 'acceptCharset', 'action', 'encoding', 'enctype', 'id', 'length',
+ \ 'method', 'name', 'tabIndex', 'target']
+ let formmeth = ['reset', 'submit', 'onReset', 'onSubmit']
+ call map(formmeth, 'v:val."("')
+ let forms = formprop + formmeth
+ " Frame - frame.
+ let framprop = ['contentDocument', 'frameBorder', 'id', 'longDesc', 'marginHeight', 'marginWidth',
+ \ 'name', 'noResize', 'scrolling', 'src']
+ let frammeth = ['blur', 'focus']
+ call map(frammeth, 'v:val."("')
+ let frams = framprop + frammeth
+ " Frameset - frameset.
+ let fsetprop = ['cols', 'id', 'rows']
+ let fsetmeth = ['blur', 'focus']
+ call map(fsetmeth, 'v:val."("')
+ let fsets = fsetprop + fsetmeth
+ " History - history.
+ let histprop = ['length']
+ let histmeth = ['back', 'forward', 'go']
+ call map(histmeth, 'v:val."("')
+ let hists = histprop + histmeth
+ " Iframe - iframe.
+ let ifraprop = ['align', 'frameBorder', 'height', 'id', 'longDesc', 'marginHeight', 'marginWidth',
+ \ 'name', 'scrolling', 'src', 'width']
+ let ifras = ifraprop
+ " Image - image.
+ let imagprop = ['align', 'alt', 'border', 'complete', 'height', 'hspace', 'id', 'isMap', 'longDesc',
+ \ 'lowSrc', 'name', 'src', 'useMap', 'vspace', 'width']
+ let imagmeth = ['onAbort', 'onError', 'onLoad']
+ call map(imagmeth, 'v:val."("')
+ let imags = histprop + imagmeth
+ " Button - accessible only by other properties
+ let buttprop = ['accessKey', 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
+ let buttmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
+ call map(buttmeth, 'v:val."("')
+ let butts = buttprop + buttmeth
+ " Checkbox - accessible only by other properties
+ let checprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
+ \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
+ let checmeth = ['blur', 'click', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
+ call map(checmeth, 'v:val."("')
+ let checs = checprop + checmeth
+ " File upload - accessible only by other properties
+ let fileprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
+ \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
+ let filemeth = ['blur', 'focus', 'onBlur', 'onClick', 'onFocus', 'onMouseDown', 'onMouseUp']
+ call map(filemeth, 'v:val."("')
+ let files = fileprop + filemeth
+ " Hidden - accessible only by other properties
+ let hiddprop = ['defaultValue', 'form', 'id', 'name', 'type', 'value']
+ let hidds = hiddprop
+ " Password - accessible only by other properties
+ let passprop = ['accept', 'accessKey', 'defaultValue',
+ \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly', 'size', 'tabIndex',
+ \ 'type', 'value']
+ let passmeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus', 'onKeyDown',
+ \ 'onKeyPress', 'onKeyUp']
+ call map(passmeth, 'v:val."("')
+ let passs = passprop + passmeth
+ " Radio - accessible only by other properties
+ let radiprop = ['accept', 'accessKey', 'align', 'alt', 'checked', 'defaultChecked',
+ \ 'disabled', 'form', 'id', 'name', 'tabIndex', 'type', 'value']
+ let radimeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
+ call map(radimeth, 'v:val."("')
+ let radis = radiprop + radimeth
+ " Reset - accessible only by other properties
+ let reseprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
+ \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
+ let resemeth = ['blur', 'click', 'focus', 'select', 'onBlur', 'onFocus']
+ call map(resemeth, 'v:val."("')
+ let reses = reseprop + resemeth
+ " Submit - accessible only by other properties
+ let submprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
+ \ 'disabled', 'form', 'id', 'name', 'size', 'tabIndex', 'type', 'value']
+ let submmeth = ['blur', 'click', 'focus', 'select', 'onClick', 'onSelectStart']
+ call map(submmeth, 'v:val."("')
+ let subms = submprop + submmeth
+ " Text - accessible only by other properties
+ let textprop = ['accept', 'accessKey', 'align', 'alt', 'defaultValue',
+ \ 'disabled', 'form', 'id', 'maxLength', 'name', 'readOnly',
+ \ 'size', 'tabIndex', 'type', 'value']
+ let textmeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus', 'onKeyDown',
+ \ 'onKeyPress', 'onKeyUp', 'onSelect']
+ call map(textmeth, 'v:val."("')
+ let texts = textprop + textmeth
+ " Link - link.
+ let linkprop = ['charset', 'disabled', 'href', 'hreflang', 'id', 'media',
+ \ 'rel', 'rev', 'target', 'type']
+ let linkmeth = ['onLoad']
+ call map(linkmeth, 'v:val."("')
+ let links = linkprop + linkmeth
+ " Location - location.
+ let locaprop = ['href', 'hash', 'host', 'hostname', 'pathname', 'port', 'protocol',
+ \ 'search']
+ let locameth = ['assign', 'reload', 'replace']
+ call map(locameth, 'v:val."("')
+ let locas = locaprop + locameth
+ " Meta - meta.
+ let metaprop = ['charset', 'content', 'disabled', 'httpEquiv', 'name', 'scheme']
+ let metas = metaprop
+ " Navigator - navigator.
+ let naviprop = ['plugins', 'appCodeName', 'appName', 'appVersion', 'cookieEnabled',
+ \ 'platform', 'userAgent']
+ let navimeth = ['javaEnabled', 'taintEnabled']
+ call map(navimeth, 'v:val."("')
+ let navis = naviprop + navimeth
+ " Object - object.
+ let objeprop = ['align', 'archive', 'border', 'code', 'codeBase', 'codeType', 'data',
+ \ 'declare', 'form', 'height', 'hspace', 'id', 'name', 'standby', 'tabIndex',
+ \ 'type', 'useMap', 'vspace', 'width']
+ let objes = objeprop
+ " Option - accessible only by other properties
+ let optiprop = ['defaultSelected',
+ \ 'disabled', 'form', 'id', 'index', 'label', 'selected', 'text', 'value']
+ let optis = optiprop
+ " Screen - screen.
+ let screprop = ['availHeight', 'availWidth', 'colorDepth', 'height', 'width']
+ let scres = screprop
+ " Select - accessible only by other properties
+ let seleprop = ['options', 'disabled', 'form', 'id', 'length', 'multiple', 'name',
+ \ 'selectedIndex', 'size', 'tabIndex', 'type', 'value']
+ let selemeth = ['blur', 'focus', 'remove', 'onBlur', 'onChange', 'onFocus']
+ call map(selemeth, 'v:val."("')
+ let seles = seleprop + selemeth
+ " Style - style.
+ let stylprop = ['background', 'backgroundAttachment', 'backgroundColor', 'backgroundImage',
+ \ 'backgroundPosition', 'backgroundRepeat',
+ \ 'border', 'borderBottom', 'borderLeft', 'borderRight', 'borderTop',
+ \ 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor',
+ \ 'borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle',
+ \ 'borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth',
+ \ 'borderColor', 'borderStyle', 'borderWidth', 'margin', 'marginBottom',
+ \ 'marginLeft', 'marginRight', 'marginTop', 'outline', 'outlineStyle', 'outlineWidth',
+ \ 'outlineColor', 'outlineStyle', 'outlineWidth', 'padding', 'paddingBottom',
+ \ 'paddingLeft', 'paddingRight', 'paddingTop',
+ \ 'clear', 'clip', 'clipBottom', 'clipLeft', 'clipRight', 'clipTop', 'content',
+ \ 'counterIncrement', 'counterReset', 'cssFloat', 'cursor', 'direction',
+ \ 'display', 'markerOffset', 'marks', 'maxHeight', 'maxWidth', 'minHeight',
+ \ 'minWidth', 'overflow', 'overflowX', 'overflowY', 'verticalAlign', 'visibility',
+ \ 'width',
+ \ 'listStyle', 'listStyleImage', 'listStylePosition', 'listStyleType',
+ \ 'cssText', 'bottom', 'height', 'left', 'position', 'right', 'top', 'width', 'zindex',
+ \ 'orphans', 'widows', 'page', 'pageBreakAfter', 'pageBreakBefore', 'pageBreakInside',
+ \ 'borderCollapse', 'borderSpacing', 'captionSide', 'emptyCells', 'tableLayout',
+ \ 'color', 'font', 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch',
+ \ 'fontStyle', 'fontVariant', 'fontWeight', 'letterSpacing', 'lineHeight', 'quotes',
+ \ 'textAlign', 'textIndent', 'textShadow', 'textTransform', 'textUnderlinePosition',
+ \ 'unicodeBidi', 'whiteSpace', 'wordSpacing']
+ let styls = stylprop
+ " Table - table.
+ let tablprop = ['rows', 'tBodies', 'align', 'bgColor', 'border', 'caption', 'cellPadding',
+ \ 'cellSpacing', 'frame', 'height', 'rules', 'summary', 'tFoot', 'tHead', 'width']
+ let tablmeth = ['createCaption', 'createTFoot', 'createTHead', 'deleteCaption', 'deleteRow',
+ \ 'deleteTFoot', 'deleteTHead', 'insertRow']
+ call map(tablmeth, 'v:val."("')
+ let tabls = tablprop + tablmeth
+ " Table data - TableData.
+ let tdatprop = ['abbr', 'align', 'axis', 'bgColor', 'cellIndex', 'ch', 'chOff',
+ \ 'colSpan', 'headers', 'noWrap', 'rowSpan', 'scope', 'vAlign', 'width']
+ let tdats = tdatprop
+ " Table row - TableRow.
+ let trowprop = ['cells', 'align', 'bgColor', 'ch', 'chOff', 'rowIndex', 'sectionRowIndex',
+ \ 'vAlign']
+ let trowmeth = ['deleteCell', 'insertCell']
+ call map(trowmeth, 'v:val."("')
+ let trows = trowprop + trowmeth
+ " Textarea - accessible only by other properties
+ let tareprop = ['accessKey', 'cols', 'defaultValue',
+ \ 'disabled', 'form', 'id', 'name', 'readOnly', 'rows',
+ \ 'tabIndex', 'type', 'value', 'selectionStart', 'selectionEnd']
+ let taremeth = ['blur', 'focus', 'select', 'onBlur', 'onChange', 'onFocus']
+ call map(taremeth, 'v:val."("')
+ let tares = tareprop + taremeth
+ " Window - window.
+ let windprop = ['frames', 'closed', 'defaultStatus', 'encodeURI', 'event', 'history',
+ \ 'length', 'location', 'name', 'onload', 'opener', 'parent', 'screen', 'self',
+ \ 'status', 'top', 'XMLHttpRequest', 'ActiveXObject']
+ let windmeth = ['alert', 'blur', 'clearInterval', 'clearTimeout', 'close', 'confirm', 'focus',
+ \ 'moveBy', 'moveTo', 'open', 'print', 'prompt', 'scrollBy', 'scrollTo', 'setInterval',
+ \ 'setTimeout']
+ call map(windmeth, 'v:val."("')
+ let winds = windprop + windmeth
+ " XMLHttpRequest - access by new xxx()
+ let xmlhprop = ['onreadystatechange', 'readyState', 'responseText', 'responseXML',
+ \ 'status', 'statusText', 'parseError']
+ let xmlhmeth = ['abort', 'getAllResponseHeaders', 'getResponseHeaders', 'open',
+ \ 'send', 'setRequestHeader']
+ call map(xmlhmeth, 'v:val."("')
+ let xmlhs = xmlhprop + xmlhmeth
+
+ " XML DOM
+ " Attributes - element.attributes[x].
+ let xdomattrprop = ['name', 'specified', 'value']
+ " Element - anyelement.
+ let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
+ \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
+ \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
+ let xdomelemmeth = ['appendChild', 'addEventListener', 'cloneNode',
+ \ 'dispatchEvent', 'getAttribute', 'getAttributeNode',
+ \ 'getElementsByTagName', 'hasChildNodes', 'insertBefore',
+ \ 'normalize', 'removeAttribute', 'removeAttributeNode',
+ \ 'removeChild', 'removeEventListener', 'replaceChild',
+ \ 'setAttribute', 'setAttributeNode']
+ call map(xdomelemmeth, 'v:val."("')
+ let xdomelems = xdomelemprop + xdomelemmeth
+ " Node - anynode.
+ let xdomnodeprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
+ \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
+ \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling']
+ let xdomnodemeth = ['appendChild', 'cloneNode',
+ \ 'hasChildNodes', 'insertBefore', 'removeChild', 'replaceChild']
+ call map(xdomnodemeth, 'v:val."("')
+ let xdomnodes = xdomnodeprop + xdomnodemeth
+ " NodeList
+ let xdomnliss = ['length', 'item(']
+ " Error - parseError.
+ let xdomerror = ['errorCode', 'reason', 'line', 'linepos', 'srcText', 'url', 'filepos']
+
+ " Find object type declaration to reduce number of suggestions. {{{
+ " 1. Get object name
+ " 2. Find object declaration line
+ " 3. General declaration follows "= new Type" syntax, additional else
+ " for regexp "= /re/"
+ " 4. Make correction for Microsoft.XMLHTTP ActiveXObject
+ " 5. Repeat for external files
+ let object = matchstr(shortcontext, '\zs\k\+\ze\(\[.\{-}\]\)\?\.$')
+ if len(object) > 0
+ let decl_line = search(object.'.\{-}=\s*new\s*', 'bn')
+ if decl_line > 0
+ let object_type = matchstr(getline(decl_line), object.'.\{-}=\s*new\s*\zs\k\+\ze')
+ if object_type == 'ActiveXObject' && matchstr(getline(decl_line), object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
+ let object_type = 'XMLHttpRequest'
+ endif
+ else
+ let decl_line = search('var\s*'.object.'\s*=\s*\/', 'bn')
+ if decl_line > 0
+ let object_type = 'RegExp'
+ endif
+ endif
+ " We didn't find var declaration in current file but we may have
+ " something in external files.
+ if decl_line == 0 && exists("b:js_extfiles")
+ let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "'.object.'.\\{-}=\\s*new\\s*"')
+ if len(dext_line) > 0
+ let object_type = matchstr(dext_line[-1], object.'.\{-}=\s*new\s*\zs\k\+\ze')
+ if object_type == 'ActiveXObject' && matchstr(dext_line[-1], object.'.\{-}=\s*new\s*ActiveXObject\s*(.Microsoft\.XMLHTTP.)') != ''
+ let object_type = 'XMLHttpRequest'
+ endif
+ else
+ let dext_line = filter(copy(b:js_extfiles), 'v:val =~ "var\s*'.object.'\\s*=\\s*\\/"')
+ if len(dext_line) > 0
+ let object_type = 'RegExp'
+ endif
+ endif
+ endif
+ endif
+ " }}}
+
+ if !exists('object_type')
+ let object_type = ''
+ endif
+
+ if object_type == 'Date'
+ let values = dates
+ elseif object_type == 'Image'
+ let values = imags
+ elseif object_type == 'Array'
+ let values = arrays
+ elseif object_type == 'Boolean'
+ " TODO: a bit more than real boolean
+ let values = arrays
+ elseif object_type == 'XMLHttpRequest'
+ let values = xmlhs
+ elseif object_type == 'String'
+ let values = stris
+ elseif object_type == 'RegExp'
+ let values = reges
+ elseif object_type == 'Math'
+ let values = maths
+ endif
+
+ if !exists('values')
+ " List of properties
+ if shortcontext =~ 'Math\.$'
+ let values = maths
+ elseif shortcontext =~ 'anchors\(\[.\{-}\]\)\?\.$'
+ let values = anths
+ elseif shortcontext =~ 'area\.$'
+ let values = areas
+ elseif shortcontext =~ 'base\.$'
+ let values = bases
+ elseif shortcontext =~ 'body\.$'
+ let values = bodys
+ elseif shortcontext =~ 'document\.$'
+ let values = docus
+ elseif shortcontext =~ 'forms\(\[.\{-}\]\)\?\.$'
+ let values = forms
+ elseif shortcontext =~ 'frameset\.$'
+ let values = fsets
+ elseif shortcontext =~ 'history\.$'
+ let values = hists
+ elseif shortcontext =~ 'iframe\.$'
+ let values = ifras
+ elseif shortcontext =~ 'images\(\[.\{-}\]\)\?\.$'
+ let values = imags
+ elseif shortcontext =~ 'links\(\[.\{-}\]\)\?\.$'
+ let values = links
+ elseif shortcontext =~ 'location\.$'
+ let values = locas
+ elseif shortcontext =~ 'meta\.$'
+ let values = metas
+ elseif shortcontext =~ 'navigator\.$'
+ let values = navis
+ elseif shortcontext =~ 'object\.$'
+ let values = objes
+ elseif shortcontext =~ 'screen\.$'
+ let values = scres
+ elseif shortcontext =~ 'style\.$'
+ let values = styls
+ elseif shortcontext =~ 'table\.$'
+ let values = tabls
+ elseif shortcontext =~ 'TableData\.$'
+ let values = tdats
+ elseif shortcontext =~ 'TableRow\.$'
+ let values = trows
+ elseif shortcontext =~ 'window\.$'
+ let values = winds
+ elseif shortcontext =~ 'parseError\.$'
+ let values = xdomerror
+ elseif shortcontext =~ 'attributes\[\d\+\]\.$'
+ let values = xdomattrprop
+ else
+ let values = user_props + arrays + dates + funcs + maths + numbs + objes + reges + stris
+ let values += doms + anths + areas + bases + bodys + docus + forms + frams + fsets + hists
+ let values += ifras + imags + links + locas + metas + navis + objes + scres
+ let values += tabls + trows + tares + winds
+ let values += xdomnodes + xdomnliss + xdomelems
+ endif
+ endif
+
+ for m in values
+ if m =~? '^'.a:base
+ call add(res, m)
+ elseif m =~? a:base
+ call add(res2, m)
+ endif
+ endfor
+
+ unlet! values
+ return res + res2
+
+ endif
+ " }}}
+
+ " Get variables data.
+ let variables = filter(copy(file), 'v:val =~ "var\\s"')
+ call map(variables, 'matchstr(v:val, ".\\{-}var\\s\\+\\zs.*\\ze")')
+ call map(variables, 'substitute(v:val, ";\\|$", ",", "g")')
+ let vars = []
+ " This loop (and next one) is necessary to get variable names from
+ " constructs like: var var1, var2, var3 = "something";
+ for i in range(len(variables))
+ let comma_separated = split(variables[i], ',\s*')
+ call map(comma_separated, 'matchstr(v:val, "\\k\\+")')
+ let vars += comma_separated
+ endfor
+
+ let variables = sort(vars)
+ unlet! vars
+
+ " Add "no var" variables.
+ let undeclared_variables = filter(copy(file), 'v:val =~ "^\\s*\\k\\+\\s*="')
+ let u_vars = []
+ for i in range(len(undeclared_variables))
+ let split_equal = split(undeclared_variables[i], '\s*=')
+ call map(split_equal, 'matchstr(v:val, "\\k\\+$")')
+ let u_vars += split_equal
+ endfor
+
+ let variables += sort(u_vars)
+ unlet! u_vars
+
+ " Get functions
+ let functions = filter(copy(file), 'v:val =~ "^\\s*function\\s"')
+ let arguments = copy(functions)
+ call map(functions, 'matchstr(v:val, "^\\s*function\\s\\+\\zs\\k\\+")')
+ call map(functions, 'v:val."("')
+ let functions = sort(functions)
+
+ " Create table to keep arguments for additional 'menu' info
+ let b:js_menuinfo = {}
+ for i in arguments
+ let g:ia = i
+ let f_elements = matchlist(i, 'function\s\+\(\k\+\)\s*(\(.\{-}\))')
+ if len(f_elements) >= 3
+ let b:js_menuinfo[f_elements[1].'('] = f_elements[2]
+ endif
+ endfor
+
+ " Get functions arguments
+ call map(arguments, 'matchstr(v:val, "function.\\{-}(\\zs.\\{-}\\ze)")')
+ let jargs = join(arguments, ',')
+ let jargs = substitute(jargs, '\s', '', 'g')
+ let arguments = split(jargs, ',')
+ let arguments = sort(arguments)
+
+ " Built-in functions
+ let builtin = ['alert(', 'confirm(']
+
+ " Top-level HTML DOM objects
+ let htmldom = ['document', 'anchor', 'area', 'base', 'body', 'document', 'event', 'form', 'frame', 'frameset', 'history', 'iframe', 'image', 'input', 'link', 'location', 'meta', 'navigator', 'object', 'option', 'screen', 'select', 'table', 'tableData', 'tableHeader', 'tableRow', 'textarea', 'window']
+ call map(htmldom, 'v:val."."')
+
+ " Top-level properties
+ let properties = ['decodeURI', 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
+ \ 'eval', 'Infinity', 'isFinite', 'isNaN', 'NaN', 'Number', 'parseFloat',
+ \ 'parseInt', 'String', 'undefined', 'escape', 'unescape']
+
+ " Keywords
+ let keywords = ["Array", "Boolean", "Date", "Function", "Math", "Number", "Object", "RegExp", "String", "XMLHttpRequest", "ActiveXObject", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "debugger", "default", "delete", "do", "double ", "else", "enum", "export", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in ", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super ", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "typeof", "var", "void", "volatile", "while", "with"]
+
+ let values = variables + functions + htmldom + arguments + builtin + properties + keywords
+
+ for m in values
+ if m =~? '^'.a:base
+ call add(res, m)
+ elseif m =~? a:base
+ call add(res2, m)
+ endif
+ endfor
+
+ let menu = res + res2
+ let final_menu = []
+ for i in range(len(menu))
+ let item = menu[i]
+ if item =~ '($'
+ let kind = 'f'
+ if has_key(b:js_menuinfo, item)
+ let m_info = b:js_menuinfo[item]
+ else
+ let m_info = ''
+ endif
+ else
+ let kind = 'v'
+ let m_info = ''
+ endif
+ let final_menu += [{'word':item, 'menu':m_info, 'kind':kind}]
+ endfor
+ let g:fm = final_menu
+ return final_menu
+
+endfunction
+
+" vim:set foldmethod=marker:
diff --git a/runtime/autoload/netrw.vim b/runtime/autoload/netrw.vim
new file mode 100644
index 0000000..29310aa
--- /dev/null
+++ b/runtime/autoload/netrw.vim
@@ -0,0 +1,12741 @@
+" netrw.vim: Handles file transfer and remote directory listing across
+" AUTOLOAD SECTION
+" Date: Aug 16, 2021
+" Version: 171
+" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
+" Copyright: Copyright (C) 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,
+" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
+" *as is* and come with no warranty of any kind, either
+" 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.
+"
+" Note: the code here was started in 1999 under a much earlier version of vim. The directory browsing
+" code was written using vim v6, which did not have Lists (Lists were first offered with vim-v7).
+"
+"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)
+" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+" Load Once: {{{1
+if &cp || exists("g:loaded_netrw")
+ finish
+endif
+
+" Check that vim has patches that netrw requires.
+" Patches needed for v7.4: 1557, and 213.
+" (netrw will benefit from vim's having patch#656, too)
+let s:needspatches=[1557,213]
+if exists("s:needspatches")
+ for ptch in s:needspatches
+ if v:version < 704 || (v:version == 704 && !has("patch".ptch))
+ if !exists("s:needpatch{ptch}")
+ unsilent echomsg "***sorry*** this version of netrw requires vim v7.4 with patch#".ptch
+ endif
+ let s:needpatch{ptch}= 1
+ finish
+ endif
+ endfor
+endif
+
+let g:loaded_netrw = "v171"
+if !exists("s:NOTE")
+ let s:NOTE = 0
+ let s:WARNING = 1
+ let s:ERROR = 2
+endif
+
+let s:keepcpo= &cpo
+setl cpo&vim
+"DechoFuncName 1
+"DechoRemOn
+"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw,'~'.expand("<slnum>"))
+
+" ======================
+" Netrw Variables: {{{1
+" ======================
+
+" ---------------------------------------------------------------------
+" netrw#ErrorMsg: {{{2
+" 0=note = s:NOTE
+" 1=warning = s:WARNING
+" 2=error = s:ERROR
+" Usage: netrw#ErrorMsg(s:NOTE | s:WARNING | s:ERROR,"some message",error-number)
+" netrw#ErrorMsg(s:NOTE | s:WARNING | s:ERROR,["message1","message2",...],error-number)
+" (this function can optionally take a list of messages)
+" Dec 2, 2019 : max errnum currently is 106
+fun! netrw#ErrorMsg(level,msg,errnum)
+" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
+
+ if a:level < g:netrw_errorlvl
+" call Dret("netrw#ErrorMsg : suppressing level=".a:level." since g:netrw_errorlvl=".g:netrw_errorlvl)
+ return
+ endif
+
+ if a:level == 1
+ let level= "**warning** (netrw) "
+ elseif a:level == 2
+ let level= "**error** (netrw) "
+ else
+ let level= "**note** (netrw) "
+ endif
+" call Decho("level=".level,'~'.expand("<slnum>"))
+
+ if g:netrw_use_errorwindow == 2 && (v:version > 802 || (v:version == 802 && has("patch486")))
+ " use popup window
+ if type(a:msg) == 3
+ let msg = [level]+a:msg
+ else
+ let msg= level.a:msg
+ endif
+ let s:popuperr_id = popup_atcursor(msg,{})
+ let s:popuperr_text= ""
+ elseif g:netrw_use_errorwindow
+ " (default) netrw creates a one-line window to show error/warning
+ " messages (reliably displayed)
+
+ " record current window number
+ let s:winBeforeErr= winnr()
+" call Decho("s:winBeforeErr=".s:winBeforeErr,'~'.expand("<slnum>"))
+
+ " getting messages out reliably is just plain difficult!
+ " This attempt splits the current window, creating a one line window.
+ if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
+" call Decho("write to NetrwMessage buffer",'~'.expand("<slnum>"))
+ exe bufwinnr("NetrwMessage")."wincmd w"
+" call Decho("setl ma noro",'~'.expand("<slnum>"))
+ setl ma noro
+ if type(a:msg) == 3
+ for msg in a:msg
+ NetrwKeepj call setline(line("$")+1,level.msg)
+ endfor
+ else
+ NetrwKeepj call setline(line("$")+1,level.a:msg)
+ endif
+ NetrwKeepj $
+ else
+" call Decho("create a NetrwMessage buffer window",'~'.expand("<slnum>"))
+ bo 1split
+ sil! call s:NetrwEnew()
+ sil! NetrwKeepj call s:NetrwOptionsSafe(1)
+ setl bt=nofile
+ NetrwKeepj file NetrwMessage
+" call Decho("setl ma noro",'~'.expand("<slnum>"))
+ setl ma noro
+ if type(a:msg) == 3
+ for msg in a:msg
+ NetrwKeepj call setline(line("$")+1,level.msg)
+ endfor
+ else
+ NetrwKeepj call setline(line("$"),level.a:msg)
+ endif
+ NetrwKeepj $
+ endif
+" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr(),'~'.expand("<slnum>"))
+ if &fo !~ '[ta]'
+ syn clear
+ syn match netrwMesgNote "^\*\*note\*\*"
+ syn match netrwMesgWarning "^\*\*warning\*\*"
+ syn match netrwMesgError "^\*\*error\*\*"
+ hi link netrwMesgWarning WarningMsg
+ hi link netrwMesgError Error
+ endif
+" call Decho("setl noma ro bh=wipe",'~'.expand("<slnum>"))
+ setl ro nomod noma bh=wipe
+
+ else
+ " (optional) netrw will show messages using echomsg. Even if the
+ " message doesn't appear, at least it'll be recallable via :messages
+" redraw!
+ if a:level == s:WARNING
+ echohl WarningMsg
+ elseif a:level == s:ERROR
+ echohl Error
+ endif
+
+ if type(a:msg) == 3
+ for msg in a:msg
+ unsilent echomsg level.msg
+ endfor
+ else
+ unsilent echomsg level.a:msg
+ endif
+
+" call Decho("echomsg ***netrw*** ".a:msg,'~'.expand("<slnum>"))
+ echohl None
+ endif
+
+" call Dret("netrw#ErrorMsg")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwInit: initializes variables if they haven't been defined {{{2
+" Loosely, varname = value.
+fun s:NetrwInit(varname,value)
+" call Decho("varname<".a:varname."> value=".a:value,'~'.expand("<slnum>"))
+ if !exists(a:varname)
+ if type(a:value) == 0
+ exe "let ".a:varname."=".a:value
+ elseif type(a:value) == 1 && a:value =~ '^[{[]'
+ exe "let ".a:varname."=".a:value
+ elseif type(a:value) == 1
+ exe "let ".a:varname."="."'".a:value."'"
+ else
+ exe "let ".a:varname."=".a:value
+ endif
+ endif
+endfun
+
+" ---------------------------------------------------------------------
+" Netrw Constants: {{{2
+call s:NetrwInit("g:netrw_dirhistcnt",0)
+if !exists("s:LONGLIST")
+ call s:NetrwInit("s:THINLIST",0)
+ call s:NetrwInit("s:LONGLIST",1)
+ call s:NetrwInit("s:WIDELIST",2)
+ call s:NetrwInit("s:TREELIST",3)
+ call s:NetrwInit("s:MAXLIST" ,4)
+endif
+
+" ---------------------------------------------------------------------
+" Default option values: {{{2
+let g:netrw_localcopycmdopt = ""
+let g:netrw_localcopydircmdopt = ""
+let g:netrw_localmkdiropt = ""
+let g:netrw_localmovecmdopt = ""
+let g:netrw_localrmdiropt = ""
+
+" ---------------------------------------------------------------------
+" Default values for netrw's global protocol variables {{{2
+if (v:version > 802 || (v:version == 802 && has("patch486"))) && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on") && has("mouse")
+ call s:NetrwInit("g:netrw_use_errorwindow",2)
+else
+ call s:NetrwInit("g:netrw_use_errorwindow",1)
+endif
+
+if !exists("g:netrw_dav_cmd")
+ if executable("cadaver")
+ let g:netrw_dav_cmd = "cadaver"
+ elseif executable("curl")
+ let g:netrw_dav_cmd = "curl"
+ else
+ let g:netrw_dav_cmd = ""
+ endif
+endif
+if !exists("g:netrw_fetch_cmd")
+ if executable("fetch")
+ let g:netrw_fetch_cmd = "fetch -o"
+ else
+ let g:netrw_fetch_cmd = ""
+ endif
+endif
+if !exists("g:netrw_file_cmd")
+ if executable("elinks")
+ call s:NetrwInit("g:netrw_file_cmd","elinks")
+ elseif executable("links")
+ call s:NetrwInit("g:netrw_file_cmd","links")
+ endif
+endif
+if !exists("g:netrw_ftp_cmd")
+ let g:netrw_ftp_cmd = "ftp"
+endif
+let s:netrw_ftp_cmd= g:netrw_ftp_cmd
+if !exists("g:netrw_ftp_options")
+ let g:netrw_ftp_options= "-i -n"
+endif
+if !exists("g:netrw_http_cmd")
+ if executable("wget")
+ let g:netrw_http_cmd = "wget"
+ call s:NetrwInit("g:netrw_http_xcmd","-q -O")
+ elseif executable("curl")
+ let g:netrw_http_cmd = "curl"
+ call s:NetrwInit("g:netrw_http_xcmd","-L -o")
+ elseif executable("elinks")
+ let g:netrw_http_cmd = "elinks"
+ call s:NetrwInit("g:netrw_http_xcmd","-source >")
+ elseif executable("fetch")
+ let g:netrw_http_cmd = "fetch"
+ call s:NetrwInit("g:netrw_http_xcmd","-o")
+ elseif executable("links")
+ let g:netrw_http_cmd = "links"
+ call s:NetrwInit("g:netrw_http_xcmd","-http.extra-header ".shellescape("Accept-Encoding: identity", 1)." -source >")
+ else
+ let g:netrw_http_cmd = ""
+ endif
+endif
+call s:NetrwInit("g:netrw_http_put_cmd","curl -T")
+call s:NetrwInit("g:netrw_keepj","keepj")
+call s:NetrwInit("g:netrw_rcp_cmd" , "rcp")
+call s:NetrwInit("g:netrw_rsync_cmd", "rsync")
+call s:NetrwInit("g:netrw_rsync_sep", "/")
+if !exists("g:netrw_scp_cmd")
+ if executable("scp")
+ call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
+ elseif executable("pscp")
+ if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable('c:\private.ppk')
+ call s:NetrwInit("g:netrw_scp_cmd", 'pscp -i c:\private.ppk')
+ else
+ call s:NetrwInit("g:netrw_scp_cmd", 'pscp -q')
+ endif
+ else
+ call s:NetrwInit("g:netrw_scp_cmd" , "scp -q")
+ endif
+endif
+
+call s:NetrwInit("g:netrw_sftp_cmd" , "sftp")
+call s:NetrwInit("g:netrw_ssh_cmd" , "ssh")
+
+if (has("win32") || has("win95") || has("win64") || has("win16"))
+ \ && exists("g:netrw_use_nt_rcp")
+ \ && g:netrw_use_nt_rcp
+ \ && executable( $SystemRoot .'/system32/rcp.exe')
+ let s:netrw_has_nt_rcp = 1
+ let s:netrw_rcpmode = '-b'
+else
+ let s:netrw_has_nt_rcp = 0
+ let s:netrw_rcpmode = ''
+endif
+
+" ---------------------------------------------------------------------
+" Default values for netrw's global variables {{{2
+" Cygwin Detection ------- {{{3
+if !exists("g:netrw_cygwin")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if has("win32unix") && &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
+ let g:netrw_cygwin= 1
+ else
+ let g:netrw_cygwin= 0
+ endif
+ else
+ let g:netrw_cygwin= 0
+ endif
+endif
+" Default values - a-c ---------- {{{3
+call s:NetrwInit("g:netrw_alto" , &sb)
+call s:NetrwInit("g:netrw_altv" , &spr)
+call s:NetrwInit("g:netrw_banner" , 1)
+call s:NetrwInit("g:netrw_browse_split", 0)
+call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro nornu")
+call s:NetrwInit("g:netrw_chgwin" , -1)
+call s:NetrwInit("g:netrw_clipboard" , 1)
+call s:NetrwInit("g:netrw_compress" , "gzip")
+call s:NetrwInit("g:netrw_ctags" , "ctags")
+if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
+ call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77)
+ let g:netrw_cursor= g:netrw_cursorline
+endif
+call s:NetrwInit("g:netrw_cursor" , 2)
+let s:netrw_usercul = &cursorline
+let s:netrw_usercuc = &cursorcolumn
+"call Decho("(netrw) COMBAK: cuc=".&l:cuc." cul=".&l:cul." initialization of s:netrw_cu[cl]")
+call s:NetrwInit("g:netrw_cygdrive","/cygdrive")
+" Default values - d-g ---------- {{{3
+call s:NetrwInit("s:didstarstar",0)
+call s:NetrwInit("g:netrw_dirhistcnt" , 0)
+call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }')
+call s:NetrwInit("g:netrw_dirhistmax" , 10)
+call s:NetrwInit("g:netrw_errorlvl" , s:NOTE)
+call s:NetrwInit("g:netrw_fastbrowse" , 1)
+call s:NetrwInit("g:netrw_ftp_browse_reject", '^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$')
+if !exists("g:netrw_ftp_list_cmd")
+ if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
+ let g:netrw_ftp_list_cmd = "ls -lF"
+ let g:netrw_ftp_timelist_cmd = "ls -tlF"
+ let g:netrw_ftp_sizelist_cmd = "ls -slF"
+ else
+ let g:netrw_ftp_list_cmd = "dir"
+ let g:netrw_ftp_timelist_cmd = "dir"
+ let g:netrw_ftp_sizelist_cmd = "dir"
+ endif
+endif
+call s:NetrwInit("g:netrw_ftpmode",'binary')
+" Default values - h-lh ---------- {{{3
+call s:NetrwInit("g:netrw_hide",1)
+if !exists("g:netrw_ignorenetrc")
+ if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$'
+ let g:netrw_ignorenetrc= 1
+ else
+ let g:netrw_ignorenetrc= 0
+ endif
+endif
+call s:NetrwInit("g:netrw_keepdir",1)
+if !exists("g:netrw_list_cmd")
+ if g:netrw_scp_cmd =~ '^pscp' && executable("pscp")
+ if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk")
+ " provide a pscp-based listing command
+ let g:netrw_scp_cmd ="pscp -i C:\\private.ppk"
+ endif
+ if exists("g:netrw_list_cmd_options")
+ let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME: ".g:netrw_list_cmd_options
+ else
+ let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:"
+ endif
+ elseif executable(g:netrw_ssh_cmd)
+ " provide a scp-based default listing command
+ if exists("g:netrw_list_cmd_options")
+ let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa ".g:netrw_list_cmd_options
+ else
+ let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa"
+ endif
+ else
+" call Decho(g:netrw_ssh_cmd." is not executable",'~'.expand("<slnum>"))
+ let g:netrw_list_cmd= ""
+ endif
+endif
+call s:NetrwInit("g:netrw_list_hide","")
+" Default values - lh-lz ---------- {{{3
+if exists("g:netrw_local_copycmd")
+ let g:netrw_localcopycmd= g:netrw_local_copycmd
+ call netrw#ErrorMsg(s:NOTE,"g:netrw_local_copycmd is deprecated in favor of g:netrw_localcopycmd",84)
+endif
+if !exists("g:netrw_localcmdshell")
+ let g:netrw_localcmdshell= ""
+endif
+if !exists("g:netrw_localcopycmd")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if g:netrw_cygwin
+ let g:netrw_localcopycmd= "cp"
+ else
+ let g:netrw_localcopycmd = expand("$COMSPEC")
+ let g:netrw_localcopycmdopt= " /c copy"
+ endif
+ elseif has("unix") || has("macunix")
+ let g:netrw_localcopycmd= "cp"
+ else
+ let g:netrw_localcopycmd= ""
+ endif
+endif
+if !exists("g:netrw_localcopydircmd")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if g:netrw_cygwin
+ let g:netrw_localcopydircmd = "cp"
+ let g:netrw_localcopydircmdopt= " -R"
+ else
+ let g:netrw_localcopydircmd = expand("$COMSPEC")
+ let g:netrw_localcopydircmdopt= " /c xcopy /e /c /h /i /k"
+ endif
+ elseif has("unix")
+ let g:netrw_localcopydircmd = "cp"
+ let g:netrw_localcopydircmdopt= " -R"
+ elseif has("macunix")
+ let g:netrw_localcopydircmd = "cp"
+ let g:netrw_localcopydircmdopt= " -R"
+ else
+ let g:netrw_localcopydircmd= ""
+ endif
+endif
+if exists("g:netrw_local_mkdir")
+ let g:netrw_localmkdir= g:netrw_local_mkdir
+ call netrw#ErrorMsg(s:NOTE,"g:netrw_local_mkdir is deprecated in favor of g:netrw_localmkdir",87)
+endif
+if has("win32") || has("win95") || has("win64") || has("win16")
+ if g:netrw_cygwin
+ call s:NetrwInit("g:netrw_localmkdir","mkdir")
+ else
+ let g:netrw_localmkdir = expand("$COMSPEC")
+ let g:netrw_localmkdiropt= " /c mkdir"
+ endif
+else
+ call s:NetrwInit("g:netrw_localmkdir","mkdir")
+endif
+call s:NetrwInit("g:netrw_remote_mkdir","mkdir")
+if exists("g:netrw_local_movecmd")
+ let g:netrw_localmovecmd= g:netrw_local_movecmd
+ call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88)
+endif
+if !exists("g:netrw_localmovecmd")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if g:netrw_cygwin
+ let g:netrw_localmovecmd= "mv"
+ else
+ let g:netrw_localmovecmd = expand("$COMSPEC")
+ let g:netrw_localmovecmdopt= " /c move"
+ endif
+ elseif has("unix") || has("macunix")
+ let g:netrw_localmovecmd= "mv"
+ else
+ let g:netrw_localmovecmd= ""
+ endif
+endif
+" following serves as an example for how to insert a version&patch specific test
+"if v:version < 704 || (v:version == 704 && !has("patch1107"))
+"endif
+call s:NetrwInit("g:netrw_liststyle" , s:THINLIST)
+" sanity checks
+if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST
+ let g:netrw_liststyle= s:THINLIST
+endif
+if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp'
+ let g:netrw_list_cmd= g:netrw_list_cmd." -l"
+endif
+" Default values - m-r ---------- {{{3
+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_retmap" , 0)
+if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)
+ call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
+elseif has("win32") || has("win95") || has("win64") || has("win16")
+ call s:NetrwInit("g:netrw_chgperm" , "cacls FILENAME /e /p PERM")
+else
+ call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME")
+endif
+call s:NetrwInit("g:netrw_preview" , 0)
+call s:NetrwInit("g:netrw_scpport" , "-P")
+call s:NetrwInit("g:netrw_servername" , "NETRWSERVER")
+call s:NetrwInit("g:netrw_sshport" , "-p")
+call s:NetrwInit("g:netrw_rename_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mv")
+call s:NetrwInit("g:netrw_rm_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm")
+call s:NetrwInit("g:netrw_rmdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir")
+call s:NetrwInit("g:netrw_rmf_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f ")
+" Default values - q-s ---------- {{{3
+call s:NetrwInit("g:netrw_quickhelp",0)
+let s:QuickHelp= ["-:go up dir D:delete R:rename s:sort-by x:special",
+ \ "(create new) %:file d:directory",
+ \ "(windows split&open) o:horz v:vert p:preview",
+ \ "i:style qf:file info O:obtain r:reverse",
+ \ "(marks) mf:mark file mt:set target mm:move mc:copy",
+ \ "(bookmarks) mb:make mB:delete qb:list gb:go to",
+ \ "(history) qb:list u:go up U:go down",
+ \ "(targets) mt:target Tb:use bookmark Th:use history"]
+" g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename
+call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\<Char-0x01>" : "\<Char-0xff>")
+if !exists("g:netrw_keepj") || g:netrw_keepj == "keepj"
+ call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ")
+else
+ call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil " : " ")
+endif
+call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size
+call s:NetrwInit("g:netrw_sort_options" , "")
+call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...)
+if !exists("g:netrw_sort_sequence")
+ if has("unix")
+ let g:netrw_sort_sequence= '[\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
+ else
+ let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
+ endif
+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
+call s:NetrwInit("g:netrw_timefmt","%c")
+if !exists("g:netrw_xstrlen")
+ if exists("g:Align_xstrlen")
+ let g:netrw_xstrlen= g:Align_xstrlen
+ elseif exists("g:drawit_xstrlen")
+ let g:netrw_xstrlen= g:drawit_xstrlen
+ elseif &enc == "latin1" || !has("multi_byte")
+ let g:netrw_xstrlen= 0
+ else
+ let g:netrw_xstrlen= 1
+ endif
+endif
+call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.")
+call s:NetrwInit("g:netrw_win95ftp",1)
+call s:NetrwInit("g:netrw_winsize",50)
+call s:NetrwInit("g:netrw_wiw",1)
+if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif
+" ---------------------------------------------------------------------
+" Default values for netrw's script variables: {{{2
+call s:NetrwInit("g:netrw_fname_escape",' ?&;%')
+if has("win32") || has("win95") || has("win64") || has("win16")
+ call s:NetrwInit("g:netrw_glob_escape",'*?`{[]$')
+else
+ call s:NetrwInit("g:netrw_glob_escape",'*[]?`{~$\')
+endif
+call s:NetrwInit("g:netrw_menu_escape",'.&? \')
+call s:NetrwInit("g:netrw_tmpfile_escape",' &;')
+call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\<C-V>\"")
+if has("gui_running") && (&enc == 'utf-8' || &enc == 'utf-16' || &enc == 'ucs-4')
+ let s:treedepthstring= "│ "
+else
+ let s:treedepthstring= "| "
+endif
+call s:NetrwInit("s:netrw_posn",'{}')
+
+" BufEnter event ignored by decho when following variable is true
+" Has a side effect that doau BufReadPost doesn't work, so
+" files read by network transfer aren't appropriately highlighted.
+"let g:decho_bufenter = 1 "Decho
+
+" ======================
+" Netrw Initialization: {{{1
+" ======================
+if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
+" call Decho("installed beval events",'~'.expand("<slnum>"))
+ let &l:bexpr = "netrw#BalloonHelp()"
+" call Decho("&l:bexpr<".&l:bexpr."> buf#".bufnr())
+ au FileType netrw setl beval
+ au WinLeave * if &ft == "netrw" && exists("s:initbeval")|let &beval= s:initbeval|endif
+ au VimEnter * let s:initbeval= &beval
+"else " Decho
+" if v:version < 700 | call Decho("did not install beval events: v:version=".v:version." < 700","~".expand("<slnum>")) | endif
+" if !has("balloon_eval") | call Decho("did not install beval events: does not have balloon_eval","~".expand("<slnum>")) | endif
+" if exists("s:initbeval") | call Decho("did not install beval events: s:initbeval exists","~".expand("<slnum>")) | endif
+" if exists("g:netrw_nobeval") | call Decho("did not install beval events: g:netrw_nobeval exists","~".expand("<slnum>")) | endif
+" if !has("syntax") | call Decho("did not install beval events: does not have syntax highlighting","~".expand("<slnum>")) | endif
+" if exists("g:syntax_on") | call Decho("did not install beval events: g:syntax_on exists","~".expand("<slnum>")) | endif
+endif
+au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif
+
+if g:netrw_keepj =~# "keepj"
+ com! -nargs=* NetrwKeepj keepj <args>
+else
+ let g:netrw_keepj= ""
+ com! -nargs=* NetrwKeepj <args>
+endif
+
+" ==============================
+" Netrw Utility Functions: {{{1
+" ==============================
+
+" ---------------------------------------------------------------------
+" netrw#BalloonHelp: {{{2
+if v:version >= 700 && has("balloon_eval") && has("syntax") && exists("g:syntax_on") && !exists("g:netrw_nobeval")
+" call Decho("loading netrw#BalloonHelp()",'~'.expand("<slnum>"))
+ fun! netrw#BalloonHelp()
+ if &ft != "netrw"
+ return ""
+ endif
+ if exists("s:popuperr_id") && popup_getpos(s:popuperr_id) != {}
+ " popup error window is still showing
+ " s:pouperr_id and s:popuperr_text are set up in netrw#ErrorMsg()
+ if exists("s:popuperr_text") && s:popuperr_text != "" && v:beval_text != s:popuperr_text
+ " text under mouse hasn't changed; only close window when it changes
+ call popup_close(s:popuperr_id)
+ unlet s:popuperr_text
+ else
+ let s:popuperr_text= v:beval_text
+ endif
+ let mesg= ""
+ elseif !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval)
+ let mesg= ""
+ elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing"
+ let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file"
+ elseif getline(v:beval_lnum) =~ '^"\s*/'
+ let mesg = "<cr>: edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window"
+ elseif v:beval_text == "Sorted" || v:beval_text == "by"
+ let mesg = 's: sort by name, time, file size, extension r: reverse sorting order mt: mark target'
+ elseif v:beval_text == "Sort" || v:beval_text == "sequence"
+ let mesg = "S: edit sorting sequence"
+ elseif v:beval_text == "Hiding" || v:beval_text == "Showing"
+ let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix"
+ elseif v:beval_text == "Quick" || v:beval_text == "Help"
+ let mesg = "Help: press <F1>"
+ elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt"
+ let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target"
+ else
+ let mesg= ""
+ endif
+ return mesg
+ endfun
+"else " Decho
+" if v:version < 700 |call Decho("did not load netrw#BalloonHelp(): vim version ".v:version." < 700 -","~".expand("<slnum>"))|endif
+" if !has("balloon_eval") |call Decho("did not load netrw#BalloonHelp(): does not have balloon eval","~".expand("<slnum>")) |endif
+" if !has("syntax") |call Decho("did not load netrw#BalloonHelp(): syntax disabled","~".expand("<slnum>")) |endif
+" if !exists("g:syntax_on") |call Decho("did not load netrw#BalloonHelp(): g:syntax_on n/a","~".expand("<slnum>")) |endif
+" if exists("g:netrw_nobeval") |call Decho("did not load netrw#BalloonHelp(): g:netrw_nobeval exists","~".expand("<slnum>")) |endif
+endif
+
+" ------------------------------------------------------------------------
+" netrw#Explore: launch the local browser in the directory of the current file {{{2
+" indx: == -1: Nexplore
+" == -2: Pexplore
+" == +: this is overloaded:
+" * If Nexplore/Pexplore is in use, then this refers to the
+" indx'th item in the w:netrw_explore_list[] of items which
+" matched the */pattern **/pattern *//pattern **//pattern
+" * If Hexplore or Vexplore, then this will override
+" g:netrw_winsize to specify the qty of rows or columns the
+" newly split window should have.
+" dosplit==0: the window will be split iff the current file has been modified and hidden not set
+" dosplit==1: the window will be split before running the local browser
+" style == 0: Explore style == 1: Explore!
+" == 2: Hexplore style == 3: Hexplore!
+" == 4: Vexplore style == 5: Vexplore!
+" == 6: Texplore
+fun! netrw#Explore(indx,dosplit,style,...)
+" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." modifiable=".&modifiable." a:0=".a:0." win#".winnr()." buf#".bufnr("%")." ft=".&ft)
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
+ if !exists("b:netrw_curdir")
+ let b:netrw_curdir= getcwd()
+" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)",'~'.expand("<slnum>"))
+ endif
+
+ " record current file for Rexplore's benefit
+ if &ft != "netrw"
+ let w:netrw_rexfile= expand("%:p")
+ endif
+
+ " record current directory
+ let curdir = simplify(b:netrw_curdir)
+ let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
+ if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16"))
+ let curdir= substitute(curdir,'\','/','g')
+ endif
+" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">",'~'.expand("<slnum>"))
+
+ " using completion, directories with spaces in their names (thanks, Bill Gates, for a truly dumb idea)
+ " will end up with backslashes here. Solution: strip off backslashes that precede white space and
+ " try Explore again.
+ if a:0 > 0
+" call Decho('considering retry: a:1<'.a:1.'>: '.
+ \ ((a:1 =~ "\\\s")? 'has backslash whitespace' : 'does not have backslash whitespace').', '.
+ \ ((filereadable(s:NetrwFile(a:1)))? 'is readable' : 'is not readable').', '.
+ \ ((isdirectory(s:NetrwFile(a:1))))? 'is a directory' : 'is not a directory',
+ \ '~'.expand("<slnum>"))
+ if a:1 =~ "\\\s" && !filereadable(s:NetrwFile(a:1)) && !isdirectory(s:NetrwFile(a:1))
+" call Decho("re-trying Explore with <".substitute(a:1,'\\\(\s\)','\1','g').">",'~'.expand("<slnum>"))
+ call netrw#Explore(a:indx,a:dosplit,a:style,substitute(a:1,'\\\(\s\)','\1','g'))
+" call Dret("netrw#Explore : returning from retry")
+ return
+" else " Decho
+" call Decho("retry not needed",'~'.expand("<slnum>"))
+ endif
+ endif
+
+ " save registers
+ if has("clipboard") && g:netrw_clipboard
+" call Decho("(netrw#Explore) save @* and @+",'~'.expand("<slnum>"))
+ sil! let keepregstar = @*
+ sil! let keepregplus = @+
+ endif
+ sil! let keepregslash= @/
+
+ " if dosplit
+ " -or- file has been modified AND file not hidden when abandoned
+ " -or- Texplore used
+ if a:dosplit || (&modified && &hidden == 0 && &bufhidden != "hide") || a:style == 6
+" call Decho("case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified",'~'.expand("<slnum>"))
+ call s:SaveWinVars()
+ let winsz= g:netrw_winsize
+ if a:indx > 0
+ let winsz= a:indx
+ endif
+
+ if a:style == 0 " Explore, Sexplore
+" call Decho("style=0: Explore or Sexplore",'~'.expand("<slnum>"))
+ let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
+ if winsz == 0|let winsz= ""|endif
+ exe "noswapfile ".winsz."wincmd s"
+" call Decho("exe noswapfile ".winsz."wincmd s",'~'.expand("<slnum>"))
+
+ elseif a:style == 1 "Explore!, Sexplore!
+" call Decho("style=1: Explore! or Sexplore!",'~'.expand("<slnum>"))
+ let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
+ if winsz == 0|let winsz= ""|endif
+ exe "keepalt noswapfile ".winsz."wincmd v"
+" call Decho("exe keepalt noswapfile ".winsz."wincmd v",'~'.expand("<slnum>"))
+
+ elseif a:style == 2 " Hexplore
+" call Decho("style=2: Hexplore",'~'.expand("<slnum>"))
+ let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
+ if winsz == 0|let winsz= ""|endif
+ exe "keepalt noswapfile bel ".winsz."wincmd s"
+" call Decho("exe keepalt noswapfile bel ".winsz."wincmd s",'~'.expand("<slnum>"))
+
+ elseif a:style == 3 " Hexplore!
+" call Decho("style=3: Hexplore!",'~'.expand("<slnum>"))
+ let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz
+ if winsz == 0|let winsz= ""|endif
+ exe "keepalt noswapfile abo ".winsz."wincmd s"
+" call Decho("exe keepalt noswapfile abo ".winsz."wincmd s",'~'.expand("<slnum>"))
+
+ elseif a:style == 4 " Vexplore
+" call Decho("style=4: Vexplore",'~'.expand("<slnum>"))
+ let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
+ if winsz == 0|let winsz= ""|endif
+ exe "keepalt noswapfile lefta ".winsz."wincmd v"
+" call Decho("exe keepalt noswapfile lefta ".winsz."wincmd v",'~'.expand("<slnum>"))
+
+ elseif a:style == 5 " Vexplore!
+" call Decho("style=5: Vexplore!",'~'.expand("<slnum>"))
+ let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz
+ if winsz == 0|let winsz= ""|endif
+ exe "keepalt noswapfile rightb ".winsz."wincmd v"
+" call Decho("exe keepalt noswapfile rightb ".winsz."wincmd v",'~'.expand("<slnum>"))
+
+ elseif a:style == 6 " Texplore
+ call s:SaveBufVars()
+" call Decho("style = 6: Texplore",'~'.expand("<slnum>"))
+ exe "keepalt tabnew ".fnameescape(curdir)
+" call Decho("exe keepalt tabnew ".fnameescape(curdir),'~'.expand("<slnum>"))
+ call s:RestoreBufVars()
+ endif
+ call s:RestoreWinVars()
+" else " Decho
+" call Decho("case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6",'~'.expand("<slnum>"))
+ endif
+ NetrwKeepj norm! 0
+
+ if a:0 > 0
+" call Decho("case [a:0=".a:0."] > 0: a:1<".a:1.">",'~'.expand("<slnum>"))
+ if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
+" call Decho("..case a:1<".a:1.">: starts with ~ and unix or cygwin",'~'.expand("<slnum>"))
+ let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),''))
+" call Decho("..using dirname<".dirname."> (case: ~ && unix||cygwin)",'~'.expand("<slnum>"))
+ elseif a:1 == '.'
+" call Decho("..case a:1<".a:1.">: matches .",'~'.expand("<slnum>"))
+ let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd())
+ if dirname !~ '/$'
+ let dirname= dirname."/"
+ endif
+" call Decho("..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")",'~'.expand("<slnum>"))
+ elseif a:1 =~ '\$'
+" call Decho("..case a:1<".a:1.">: matches ending $",'~'.expand("<slnum>"))
+ let dirname= simplify(expand(a:1))
+" call Decho("..using user-specified dirname<".dirname."> with $env-var",'~'.expand("<slnum>"))
+ elseif a:1 !~ '^\*\{1,2}/' && a:1 !~ '^\a\{3,}://'
+" call Decho("..case a:1<".a:1.">: other, not pattern or filepattern",'~'.expand("<slnum>"))
+ let dirname= simplify(a:1)
+" call Decho("..using user-specified dirname<".dirname.">",'~'.expand("<slnum>"))
+ else
+" call Decho("..case a:1: pattern or filepattern",'~'.expand("<slnum>"))
+ let dirname= a:1
+ endif
+ else
+ " clear explore
+" call Decho("case a:0=".a:0.": clearing Explore list",'~'.expand("<slnum>"))
+ call s:NetrwClearExplore()
+" call Dret("netrw#Explore : cleared list")
+ return
+ endif
+
+" call Decho("dirname<".dirname.">",'~'.expand("<slnum>"))
+ if dirname =~ '\.\./\=$'
+ let dirname= simplify(fnamemodify(dirname,':p:h'))
+ elseif dirname =~ '\.\.' || dirname == '.'
+ let dirname= simplify(fnamemodify(dirname,':p'))
+ endif
+" call Decho("dirname<".dirname."> (after simplify)",'~'.expand("<slnum>"))
+
+ if dirname =~ '^\*//'
+ " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
+" call Decho("case starpat=1: Explore *//pattern",'~'.expand("<slnum>"))
+ let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
+ let starpat= 1
+" call Decho("..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">",'~'.expand("<slnum>"))
+ if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
+
+ elseif dirname =~ '^\*\*//'
+ " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
+" call Decho("case starpat=2: Explore **//pattern",'~'.expand("<slnum>"))
+ let pattern= substitute(dirname,'^\*\*//','','')
+ let starpat= 2
+" call Decho("..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">",'~'.expand("<slnum>"))
+
+ elseif dirname =~ '/\*\*/'
+ " handle .../**/.../filepat
+" call Decho("case starpat=4: Explore .../**/.../filepat",'~'.expand("<slnum>"))
+ let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
+ if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
+ let b:netrw_curdir = prefixdir
+ else
+ let b:netrw_curdir= getcwd().'/'.prefixdir
+ endif
+ let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
+ let starpat= 4
+" call Decho("..pwd<".getcwd()."> dirname<".dirname.">",'~'.expand("<slnum>"))
+" call Decho("..case Explore ../**/../filepat (starpat=".starpat.")",'~'.expand("<slnum>"))
+
+ elseif dirname =~ '^\*/'
+ " case starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
+ let starpat= 3
+" call Decho("case starpat=3: Explore */filepat (starpat=".starpat.")",'~'.expand("<slnum>"))
+
+ elseif dirname=~ '^\*\*/'
+ " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
+ let starpat= 4
+" call Decho("case starpat=4: Explore **/filepat (starpat=".starpat.")",'~'.expand("<slnum>"))
+
+ else
+ let starpat= 0
+" call Decho("case starpat=0: default",'~'.expand("<slnum>"))
+ endif
+
+ if starpat == 0 && a:indx >= 0
+ " [Explore Hexplore Vexplore Sexplore] [dirname]
+" call Decho("case starpat==0 && a:indx=".a:indx.": dirname<".dirname.">, handles Explore Hexplore Vexplore Sexplore",'~'.expand("<slnum>"))
+ if dirname == ""
+ let dirname= curfiledir
+" call Decho("..empty dirname, using current file's directory<".dirname.">",'~'.expand("<slnum>"))
+ endif
+ if dirname =~# '^scp://' || dirname =~ '^ftp://'
+ call netrw#Nread(2,dirname)
+ else
+ if dirname == ""
+ let dirname= getcwd()
+ elseif (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin
+ " Windows : check for a drive specifier, or else for a remote share name ('\\Foo' or '//Foo',
+ " depending on whether backslashes have been converted to forward slashes by earlier code).
+ if dirname !~ '^[a-zA-Z]:' && dirname !~ '^\\\\\w\+' && dirname !~ '^//\w\+'
+ let dirname= b:netrw_curdir."/".dirname
+ endif
+ elseif dirname !~ '^/'
+ let dirname= b:netrw_curdir."/".dirname
+ endif
+" call Decho("..calling LocalBrowseCheck(dirname<".dirname.">)",'~'.expand("<slnum>"))
+ call netrw#LocalBrowseCheck(dirname)
+" call Decho(" modified=".&modified." modifiable=".&modifiable." readonly=".&readonly,'~'.expand("<slnum>"))
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
+ endif
+ if exists("w:netrw_bannercnt")
+ " done to handle P08-Ingelrest. :Explore will _Always_ go to the line just after the banner.
+ " If one wants to return the same place in the netrw window, use :Rex instead.
+ exe w:netrw_bannercnt
+ endif
+
+" call Decho("curdir<".curdir.">",'~'.expand("<slnum>"))
+ " ---------------------------------------------------------------------
+ " Jan 24, 2013: not sure why the following was present. See P08-Ingelrest
+" if has("win32") || has("win95") || has("win64") || has("win16")
+" NetrwKeepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW')
+" else
+" NetrwKeepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW')
+" endif
+ " ---------------------------------------------------------------------
+
+ " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
+ " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
+ " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
+ " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
+ elseif a:indx <= 0
+ " Nexplore, Pexplore, Explore: handle starpat
+" call Decho("case a:indx<=0: Nexplore, Pexplore, <s-down>, <s-up> starpat=".starpat." a:indx=".a:indx,'~'.expand("<slnum>"))
+ if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
+" call Decho("..set up <s-up> and <s-down> maps",'~'.expand("<slnum>"))
+ let s:didstarstar= 1
+ nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
+ nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
+ endif
+
+ if has("path_extra")
+" call Decho("..starpat=".starpat.": has +path_extra",'~'.expand("<slnum>"))
+ if !exists("w:netrw_explore_indx")
+ let w:netrw_explore_indx= 0
+ endif
+
+ let indx = a:indx
+" call Decho("..starpat=".starpat.": set indx= [a:indx=".indx."]",'~'.expand("<slnum>"))
+
+ if indx == -1
+ " Nexplore
+" call Decho("..case Nexplore with starpat=".starpat.": (indx=".indx.")",'~'.expand("<slnum>"))
+ if !exists("w:netrw_explore_list") " sanity check
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
+ if has("clipboard") && g:netrw_clipboard
+" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
+ if @* != keepregstar | sil! let @* = keepregstar | endif
+ if @+ != keepregplus | sil! let @+ = keepregplus | endif
+ endif
+ sil! let @/ = keepregslash
+" call Dret("netrw#Explore")
+ return
+ endif
+ let indx= w:netrw_explore_indx
+ if indx < 0 | let indx= 0 | endif
+ if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
+ let curfile= w:netrw_explore_list[indx]
+" call Decho("....indx=".indx." curfile<".curfile.">",'~'.expand("<slnum>"))
+ while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
+ let indx= indx + 1
+" call Decho("....indx=".indx." (Nexplore while loop)",'~'.expand("<slnum>"))
+ endwhile
+ if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
+" call Decho("....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx,'~'.expand("<slnum>"))
+
+ elseif indx == -2
+ " Pexplore
+" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")",'~'.expand("<slnum>"))
+ if !exists("w:netrw_explore_list") " sanity check
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
+ if has("clipboard") && g:netrw_clipboard
+" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
+ if @* != keepregstar | sil! let @* = keepregstar | endif
+ if @+ != keepregplus | sil! let @+ = keepregplus | endif
+ endif
+ sil! let @/ = keepregslash
+" call Dret("netrw#Explore")
+ return
+ endif
+ let indx= w:netrw_explore_indx
+ if indx < 0 | let indx= 0 | endif
+ if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
+ let curfile= w:netrw_explore_list[indx]
+" call Decho("....indx=".indx." curfile<".curfile.">",'~'.expand("<slnum>"))
+ while indx >= 0 && curfile == w:netrw_explore_list[indx]
+ let indx= indx - 1
+" call Decho("....indx=".indx." (Pexplore while loop)",'~'.expand("<slnum>"))
+ endwhile
+ if indx < 0 | let indx= 0 | endif
+" call Decho("....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx,'~'.expand("<slnum>"))
+
+ else
+ " Explore -- initialize
+ " build list of files to Explore with Nexplore/Pexplore
+" call Decho("..starpat=".starpat.": case Explore: initialize (indx=".indx.")",'~'.expand("<slnum>"))
+ NetrwKeepj keepalt call s:NetrwClearExplore()
+ let w:netrw_explore_indx= 0
+ if !exists("b:netrw_curdir")
+ let b:netrw_curdir= getcwd()
+ endif
+" call Decho("....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
+
+ " switch on starpat to build the w:netrw_explore_list of files
+ if starpat == 1
+ " starpat=1: Explore *//pattern (current directory only search for files containing pattern)
+" call Decho("..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls,'~'.expand("<slnum>"))
+" call Decho("....pattern<".pattern.">",'~'.expand("<slnum>"))
+ try
+ exe "NetrwKeepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
+ catch /^Vim\%((\a\+)\)\=:E480/
+ keepalt call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76)
+" call Dret("netrw#Explore : unable to find pattern<".pattern.">")
+ return
+ endtry
+ let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)'))
+ if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
+
+ elseif starpat == 2
+ " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
+" call Decho("..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)",'~'.expand("<slnum>"))
+" call Decho("....pattern<".pattern.">",'~'.expand("<slnum>"))
+ try
+ exe "sil NetrwKeepj noautocmd keepalt vimgrep /".pattern."/gj "."**/*"
+ catch /^Vim\%((\a\+)\)\=:E480/
+ keepalt call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
+ if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
+ if has("clipboard") && g:netrw_clipboard
+" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
+ if @* != keepregstar | sil! let @* = keepregstar | endif
+ if @+ != keepregplus | sil! let @+ = keepregplus | endif
+ endif
+ sil! let @/ = keepregslash
+" call Dret("netrw#Explore : no files matched pattern")
+ return
+ endtry
+ let s:netrw_curdir = b:netrw_curdir
+ let w:netrw_explore_list = getqflist()
+ let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)'))
+ if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
+
+ elseif starpat == 3
+ " starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
+" call Decho("..case starpat=".starpat.": build */filepat list (curdir-only srch filenames matching filepat) &hls=".&hls,'~'.expand("<slnum>"))
+ let filepat= substitute(dirname,'^\*/','','')
+ let filepat= substitute(filepat,'^[%#<]','\\&','')
+" call Decho("....b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
+" call Decho("....filepat<".filepat.">",'~'.expand("<slnum>"))
+ let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n'))
+ if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif
+
+ elseif starpat == 4
+ " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
+" call Decho("..case starpat=".starpat.": build **/filepat list (recursive descent srch filenames matching filepat) &hls=".&hls,'~'.expand("<slnum>"))
+ let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n'))
+ if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
+ endif " switch on starpat to build w:netrw_explore_list
+
+ let w:netrw_explore_listlen = len(w:netrw_explore_list)
+" call Decho("....w:netrw_explore_list<".string(w:netrw_explore_list).">",'~'.expand("<slnum>"))
+" call Decho("....w:netrw_explore_listlen=".w:netrw_explore_listlen,'~'.expand("<slnum>"))
+
+ if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
+ keepalt NetrwKeepj call netrw#ErrorMsg(s:WARNING,"no files matched",42)
+ if has("clipboard") && g:netrw_clipboard
+" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
+ if @* != keepregstar | sil! let @* = keepregstar | endif
+ if @+ != keepregplus | sil! let @+ = keepregplus | endif
+ endif
+ sil! let @/ = keepregslash
+" call Dret("netrw#Explore : no files matched")
+ return
+ endif
+ endif " if indx ... endif
+
+ " NetrwStatusLine support - for exploring support
+ let w:netrw_explore_indx= indx
+" call Decho("....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen,'~'.expand("<slnum>"))
+
+ " wrap the indx around, but issue a note
+ if indx >= w:netrw_explore_listlen || indx < 0
+" call Decho("....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")",'~'.expand("<slnum>"))
+ let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
+ let w:netrw_explore_indx= indx
+ keepalt NetrwKeepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
+ endif
+
+ exe "let dirfile= w:netrw_explore_list[".indx."]"
+" call Decho("....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">",'~'.expand("<slnum>"))
+ let newdir= substitute(dirfile,'/[^/]*$','','e')
+" call Decho("....newdir<".newdir.">",'~'.expand("<slnum>"))
+
+" call Decho("....calling LocalBrowseCheck(newdir<".newdir.">)",'~'.expand("<slnum>"))
+ call netrw#LocalBrowseCheck(newdir)
+ if !exists("w:netrw_liststyle")
+ let w:netrw_liststyle= g:netrw_liststyle
+ endif
+ if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
+ keepalt NetrwKeepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
+ else
+ keepalt NetrwKeepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
+ endif
+ let w:netrw_explore_mtchcnt = indx + 1
+ let w:netrw_explore_bufnr = bufnr("%")
+ let w:netrw_explore_line = line(".")
+ keepalt NetrwKeepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
+" call Decho("....explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line,'~'.expand("<slnum>"))
+
+ else
+" call Decho("..your vim does not have +path_extra",'~'.expand("<slnum>"))
+ if !exists("g:netrw_quiet")
+ keepalt NetrwKeepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
+ endif
+ if has("clipboard") && g:netrw_clipboard
+" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
+ if @* != keepregstar | sil! let @* = keepregstar | endif
+ if @+ != keepregplus | sil! let @+ = keepregplus | endif
+ endif
+ sil! let @/ = keepregslash
+" call Dret("netrw#Explore : missing +path_extra")
+ return
+ endif
+
+ else
+" call Decho("..default case: Explore newdir<".dirname.">",'~'.expand("<slnum>"))
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
+ sil! unlet w:netrw_treedict
+ sil! unlet w:netrw_treetop
+ endif
+ let newdir= dirname
+ if !exists("b:netrw_curdir")
+ NetrwKeepj call netrw#LocalBrowseCheck(getcwd())
+ else
+ NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
+ endif
+ endif
+
+ " visual display of **/ **// */ Exploration files
+" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist"),'~'.expand("<slnum>"))
+" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">",'~'.expand("<slnum>"))
+ if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
+" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-"),'~'.expand("<slnum>"))
+ if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
+ " only update match list when current directory isn't the same as before
+" call Decho("only update match list when current directory not the same as before",'~'.expand("<slnum>"))
+ let s:explore_prvdir = b:netrw_curdir
+ let s:explore_match = ""
+ let dirlen = strlen(b:netrw_curdir)
+ if b:netrw_curdir !~ '/$'
+ let dirlen= dirlen + 1
+ endif
+ let prvfname= ""
+ for fname in w:netrw_explore_list
+" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
+ if fname =~ '^'.b:netrw_curdir
+ if s:explore_match == ""
+ let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
+ else
+ let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>'
+ endif
+ elseif fname !~ '^/' && fname != prvfname
+ if s:explore_match == ""
+ let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>'
+ else
+ let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>'
+ endif
+ endif
+ let prvfname= fname
+ endfor
+" call Decho("explore_match<".s:explore_match.">",'~'.expand("<slnum>"))
+ if has("syntax") && exists("g:syntax_on") && g:syntax_on
+ exe "2match netrwMarkFile /".s:explore_match."/"
+ endif
+ endif
+ echo "<s-up>==Pexplore <s-down>==Nexplore"
+ else
+ 2match none
+ if exists("s:explore_match") | unlet s:explore_match | endif
+ if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
+ echo " "
+" call Decho("cleared explore match list",'~'.expand("<slnum>"))
+ endif
+
+ " since Explore may be used to initialize netrw's browser,
+ " there's no danger of a late FocusGained event on initialization.
+ " Consequently, set s:netrw_events to 2.
+ let s:netrw_events= 2
+ if has("clipboard") && g:netrw_clipboard
+" call Decho("(netrw#Explore) restore @* and @+",'~'.expand("<slnum>"))
+ if @* != keepregstar | sil! let @* = keepregstar | endif
+ if @+ != keepregplus | sil! let @+ = keepregplus | endif
+ endif
+ sil! let @/ = keepregslash
+" call Dret("netrw#Explore : @/<".@/.">")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#Lexplore: toggle Explorer window, keeping it on the left of the current tab {{{2
+fun! netrw#Lexplore(count,rightside,...)
+" call Dfunc("netrw#Lexplore(count=".a:count." rightside=".a:rightside.",...) a:0=".a:0." ft=".&ft)
+ let curwin= winnr()
+
+ if a:0 > 0 && a:1 != ""
+ " if a netrw window is already on the left-side of the tab
+ " and a directory has been specified, explore with that
+ " directory.
+" call Decho("case has input argument(s) (a:1<".a:1.">)")
+ let a1 = expand(a:1)
+" call Decho("a:1<".a:1."> curwin#".curwin,'~'.expand("<slnum>"))
+ exe "1wincmd w"
+ if &ft == "netrw"
+" call Decho("exe Explore ".fnameescape(a:1),'~'.expand("<slnum>"))
+ exe "Explore ".fnameescape(a1)
+ exe curwin."wincmd w"
+ if exists("t:netrw_lexposn")
+" call Decho("forgetting t:netrw_lexposn",'~'.expand("<slnum>"))
+ unlet t:netrw_lexposn
+ endif
+" call Dret("netrw#Lexplore")
+ return
+ endif
+ exe curwin."wincmd w"
+ else
+ let a1= ""
+" call Decho("no input arguments")
+ endif
+
+ if exists("t:netrw_lexbufnr")
+ " check if t:netrw_lexbufnr refers to a netrw window
+ let lexwinnr = bufwinnr(t:netrw_lexbufnr)
+" call Decho("lexwinnr= bufwinnr(t:netrw_lexbufnr#".t:netrw_lexbufnr.")=".lexwinnr)
+ else
+ let lexwinnr= 0
+" call Decho("t:netrw_lexbufnr doesn't exist")
+ endif
+" call Decho("lexwinnr=".lexwinnr,'~'.expand("<slnum>"))
+
+ if lexwinnr > 0
+ " close down netrw explorer window
+" call Decho("t:netrw_lexbufnr#".t:netrw_lexbufnr.": close down netrw window",'~'.expand("<slnum>"))
+ exe lexwinnr."wincmd w"
+ let g:netrw_winsize = -winwidth(0)
+ let t:netrw_lexposn = winsaveview()
+" call Decho("saving posn to t:netrw_lexposn<".string(t:netrw_lexposn).">",'~'.expand("<slnum>"))
+" call Decho("saving t:netrw_lexposn",'~'.expand("<slnum>"))
+ close
+ if lexwinnr < curwin
+ let curwin= curwin - 1
+ endif
+ if lexwinnr != curwin
+ exe curwin."wincmd w"
+ endif
+ unlet t:netrw_lexbufnr
+" call Decho("unlet t:netrw_lexbufnr")
+
+ else
+ " open netrw explorer window
+" call Decho("t:netrw_lexbufnr<n/a>: open netrw explorer window",'~'.expand("<slnum>"))
+ exe "1wincmd w"
+ let keep_altv = g:netrw_altv
+ let g:netrw_altv = 0
+ if a:count != 0
+ let netrw_winsize = g:netrw_winsize
+ let g:netrw_winsize = a:count
+ endif
+ let curfile= expand("%")
+" call Decho("curfile<".curfile.">",'~'.expand("<slnum>"))
+ exe (a:rightside? "botright" : "topleft")." vertical ".((g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize) . " new"
+" call Decho("new buf#".bufnr("%")." win#".winnr())
+ if a:0 > 0 && a1 != ""
+" call Decho("case 1: Explore ".a1,'~'.expand("<slnum>"))
+ call netrw#Explore(0,0,0,a1)
+ exe "Explore ".fnameescape(a1)
+ elseif curfile =~ '^\a\{3,}://'
+" call Decho("case 2: Explore ".substitute(curfile,'[^/\\]*$','',''),'~'.expand("<slnum>"))
+ call netrw#Explore(0,0,0,substitute(curfile,'[^/\\]*$','',''))
+ else
+" call Decho("case 3: Explore .",'~'.expand("<slnum>"))
+ call netrw#Explore(0,0,0,".")
+ endif
+ if a:count != 0
+ let g:netrw_winsize = netrw_winsize
+ endif
+ setlocal winfixwidth
+ let g:netrw_altv = keep_altv
+ let t:netrw_lexbufnr = bufnr("%")
+ " done to prevent build-up of hidden buffers due to quitting and re-invocation of :Lexplore.
+ " Since the intended use of :Lexplore is to have an always-present explorer window, the extra
+ " effort to mis-use :Lex is warranted.
+ set bh=wipe
+" call Decho("let t:netrw_lexbufnr=".t:netrw_lexbufnr)
+" call Decho("t:netrw_lexposn".(exists("t:netrw_lexposn")? string(t:netrw_lexposn) : " n/a"))
+ if exists("t:netrw_lexposn")
+" call Decho("restoring to t:netrw_lexposn",'~'.expand("<slnum>"))
+" call Decho("restoring posn to t:netrw_lexposn<".string(t:netrw_lexposn).">",'~'.expand("<slnum>"))
+ call winrestview(t:netrw_lexposn)
+ unlet t:netrw_lexposn
+ endif
+ endif
+
+ " set up default window for editing via <cr>
+ if exists("g:netrw_chgwin") && g:netrw_chgwin == -1
+ if a:rightside
+ let g:netrw_chgwin= 1
+ else
+ let g:netrw_chgwin= 2
+ endif
+" call Decho("let g:netrw_chgwin=".g:netrw_chgwin)
+ endif
+
+" call Dret("netrw#Lexplore")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#Clean: remove netrw {{{2
+" supports :NetrwClean -- remove netrw from first directory on runtimepath
+" :NetrwClean! -- remove netrw from all directories on runtimepath
+fun! netrw#Clean(sys)
+" call Dfunc("netrw#Clean(sys=".a:sys.")")
+
+ if a:sys
+ let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No")
+ else
+ let choice= confirm("Remove personal copy of netrw?","&Yes\n&No")
+ endif
+" call Decho("choice=".choice,'~'.expand("<slnum>"))
+ let diddel= 0
+ let diddir= ""
+
+ if choice == 1
+ for dir in split(&rtp,',')
+ if filereadable(dir."/plugin/netrwPlugin.vim")
+" call Decho("removing netrw-related files from ".dir,'~'.expand("<slnum>"))
+ if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif
+ if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif
+ if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif
+ if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif
+ if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif
+ if s:NetrwDelete(dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif
+ let diddir= dir
+ let diddel= diddel + 1
+ if !a:sys|break|endif
+ endif
+ endfor
+ endif
+
+ echohl WarningMsg
+ if diddel == 0
+ echomsg "netrw is either not installed or not removable"
+ elseif diddel == 1
+ echomsg "removed one copy of netrw from <".diddir.">"
+ else
+ echomsg "removed ".diddel." copies of netrw"
+ endif
+ echohl None
+
+" call Dret("netrw#Clean")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#MakeTgt: make a target out of the directory name provided {{{2
+fun! netrw#MakeTgt(dname)
+" call Dfunc("netrw#MakeTgt(dname<".a:dname.">)")
+ " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let s:netrwmftgt_islocal= (a:dname !~ '^\a\{3,}://')
+" call Decho("s:netrwmftgt_islocal=".s:netrwmftgt_islocal,'~'.expand("<slnum>"))
+ if s:netrwmftgt_islocal
+ let netrwmftgt= simplify(a:dname)
+ else
+ let netrwmftgt= a:dname
+ endif
+ if exists("s:netrwmftgt") && netrwmftgt == s:netrwmftgt
+ " re-selected target, so just clear it
+ unlet s:netrwmftgt s:netrwmftgt_islocal
+ else
+ let s:netrwmftgt= netrwmftgt
+ endif
+ if g:netrw_fastbrowse <= 1
+ call s:NetrwRefresh((b:netrw_curdir !~ '\a\{3,}://'),b:netrw_curdir)
+ endif
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))"
+ call winrestview(svpos)
+" call Dret("netrw#MakeTgt")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#Obtain: {{{2
+" netrw#Obtain(islocal,fname[,tgtdirectory])
+" islocal=0 obtain from remote source
+" =1 obtain from local source
+" fname : a filename or a list of filenames
+" tgtdir : optional place where files are to go (not present, uses getcwd())
+fun! netrw#Obtain(islocal,fname,...)
+" call Dfunc("netrw#Obtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
+ " NetrwStatusLine support - for obtaining support
+
+ if type(a:fname) == 1
+ let fnamelist= [ a:fname ]
+ elseif type(a:fname) == 3
+ let fnamelist= a:fname
+ else
+ call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
+" call Dret("netrw#Obtain")
+ return
+ endif
+" call Decho("fnamelist<".string(fnamelist).">",'~'.expand("<slnum>"))
+ if a:0 > 0
+ let tgtdir= a:1
+ else
+ let tgtdir= getcwd()
+ endif
+" call Decho("tgtdir<".tgtdir.">",'~'.expand("<slnum>"))
+
+ if exists("b:netrw_islocal") && b:netrw_islocal
+ " obtain a file from local b:netrw_curdir to (local) tgtdir
+" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir,'~'.expand("<slnum>"))
+ if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
+ let topath= s:ComposePath(tgtdir,"")
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+ " transfer files one at time
+" call Decho("transfer files one at a time",'~'.expand("<slnum>"))
+ for fname in fnamelist
+" call Decho("system(".g:netrw_localcopycmd." ".s:ShellEscape(fname)." ".s:ShellEscape(topath).")",'~'.expand("<slnum>"))
+ call system(g:netrw_localcopycmd.g:netrw_localcopycmdopt." ".s:ShellEscape(fname)." ".s:ShellEscape(topath))
+ if v:shell_error != 0
+ call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
+" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".s:ShellEscape(fname)." ".s:ShellEscape(topath))
+ return
+ endif
+ endfor
+ else
+ " transfer files with one command
+" call Decho("transfer files with one command",'~'.expand("<slnum>"))
+ let filelist= join(map(deepcopy(fnamelist),"s:ShellEscape(v:val)"))
+" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".s:ShellEscape(topath).")",'~'.expand("<slnum>"))
+ call system(g:netrw_localcopycmd.g:netrw_localcopycmdopt." ".filelist." ".s:ShellEscape(topath))
+ if v:shell_error != 0
+ call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80)
+" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".filelist." ".s:ShellEscape(topath))
+ return
+ endif
+ endif
+ elseif !exists("b:netrw_curdir")
+ call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
+ else
+ call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37)
+ endif
+
+ else
+ " obtain files from remote b:netrw_curdir to local tgtdir
+" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir,'~'.expand("<slnum>"))
+ if type(a:fname) == 1
+ call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
+ endif
+ call s:NetrwMethod(b:netrw_curdir)
+
+ if b:netrw_method == 4
+ " obtain file using scp
+" call Decho("obtain via scp (method#4)",'~'.expand("<slnum>"))
+ if exists("g:netrw_port") && g:netrw_port != ""
+ let useport= " ".g:netrw_scpport." ".g:netrw_port
+ else
+ let useport= ""
+ endif
+ if b:netrw_fname =~ '/'
+ let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
+ else
+ let path= ""
+ endif
+ let filelist= join(map(deepcopy(fnamelist),'escape(s:ShellEscape(g:netrw_machine.":".path.v:val,1)," ")'))
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.s:ShellEscape(useport,1)." ".filelist." ".s:ShellEscape(tgtdir,1))
+
+ elseif b:netrw_method == 2
+ " obtain file using ftp + .netrc
+" call Decho("obtain via ftp+.netrc (method #2)",'~'.expand("<slnum>"))
+ call s:SaveBufVars()|sil NetrwKeepj new|call s:RestoreBufVars()
+ let tmpbufnr= bufnr("%")
+ setl ff=unix
+ if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
+ NetrwKeepj put =g:netrw_ftpmode
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ if exists("b:netrw_fname") && b:netrw_fname != ""
+ call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+ for fname in fnamelist
+ call setline(line("$")+1,'get "'.fname.'"')
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endfor
+ if exists("g:netrw_port") && g:netrw_port != ""
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1))
+ else
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
+ endif
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
+ let debugkeep= &debug
+ setl debug=msg
+ call netrw#ErrorMsg(s:ERROR,getline(1),4)
+ let &debug= debugkeep
+ endif
+
+ elseif b:netrw_method == 3
+ " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
+" call Decho("obtain via ftp+mipf (method #3)",'~'.expand("<slnum>"))
+ call s:SaveBufVars()|sil NetrwKeepj new|call s:RestoreBufVars()
+ let tmpbufnr= bufnr("%")
+ setl ff=unix
+
+ if exists("g:netrw_port") && g:netrw_port != ""
+ NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ else
+ NetrwKeepj put ='open '.g:netrw_machine
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ if exists("g:netrw_uid") && g:netrw_uid != ""
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ NetrwKeepj put =g:netrw_uid
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ if exists("s:netrw_passwd") && s:netrw_passwd != ""
+ NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
+ endif
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ elseif exists("s:netrw_passwd")
+ NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+ endif
+
+ if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
+ NetrwKeepj put =g:netrw_ftpmode
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ if exists("b:netrw_fname") && b:netrw_fname != ""
+ NetrwKeepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+ for fname in fnamelist
+ NetrwKeepj call setline(line("$")+1,'get "'.fname.'"')
+ endfor
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+ " Note: using "_dd to delete to the black hole register; avoids messing up @@
+ NetrwKeepj norm! 1G"_dd
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$"
+" call Decho("error<".getline(1).">",'~'.expand("<slnum>"))
+ if !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,getline(1),5)
+ endif
+ endif
+
+ elseif b:netrw_method == 9
+ " obtain file using sftp
+" call Decho("obtain via sftp (method #9)",'~'.expand("<slnum>"))
+ if a:fname =~ '/'
+ let localfile= substitute(a:fname,'^.*/','','')
+ else
+ let localfile= a:fname
+ endif
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1).s:ShellEscape(localfile)." ".s:ShellEscape(tgtdir))
+
+ elseif !exists("b:netrw_method") || b:netrw_method < 0
+ " probably a badly formed url; protocol not recognized
+" call Dret("netrw#Obtain : unsupported method")
+ return
+
+ else
+ " protocol recognized but not supported for Obtain (yet?)
+ if !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"current protocol not supported for obtaining file",97)
+ endif
+" call Dret("netrw#Obtain : current protocol not supported for obtaining file")
+ return
+ endif
+
+ " restore status line
+ if type(a:fname) == 1 && exists("s:netrw_users_stl")
+ NetrwKeepj call s:SetupNetrwStatusLine(s:netrw_users_stl)
+ endif
+
+ endif
+
+ " cleanup
+ if exists("tmpbufnr")
+ if bufnr("%") != tmpbufnr
+ exe tmpbufnr."bw!"
+ else
+ q!
+ endif
+ endif
+
+" call Dret("netrw#Obtain")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#Nread: save position, call netrw#NetRead(), and restore position {{{2
+fun! netrw#Nread(mode,fname)
+" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)")
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call netrw#NetRead(a:mode,a:fname)
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call winrestview(svpos)
+
+ if exists("w:netrw_liststyle") && w:netrw_liststyle != s:TREELIST
+ if exists("w:netrw_bannercnt")
+ " start with cursor just after the banner
+ exe w:netrw_bannercnt
+ endif
+ endif
+" call Dret("netrw#Nread")
+endfun
+
+" ------------------------------------------------------------------------
+" s:NetrwOptionsSave: save options prior to setting to "netrw-buffer-standard" form {{{2
+" Options get restored by s:NetrwOptionsRestore()
+"
+" Option handling:
+" * save user's options (s:NetrwOptionsSave)
+" * set netrw-safe options (s:NetrwOptionsSafe)
+" - change an option only when user option != safe option (s:netrwSetSafeSetting)
+" * restore user's options (s:netrwOPtionsRestore)
+" - restore a user option when != safe option (s:NetrwRestoreSetting)
+" vt: (variable type) normally its either "w:" or "s:"
+fun! s:NetrwOptionsSave(vt)
+" call Dfunc("s:NetrwOptionsSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$")." mod=".&mod." ma=".&ma)
+" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"),'~'.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." a:vt=".a:vt." hid=".&hid,'~'.expand("<slnum>"))
+" call Decho("(s:NetrwOptionsSave) lines=".&lines)
+
+ if !exists("{a:vt}netrw_optionsave")
+ let {a:vt}netrw_optionsave= 1
+ else
+" call Dret("s:NetrwOptionsSave : options already saved")
+ return
+ endif
+" call Decho("prior to save: fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff,'~'.expand("<slnum>"))
+
+ " Save current settings and current directory
+" call Decho("saving current settings and current directory",'~'.expand("<slnum>"))
+ let s:yykeep = @@
+ if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif
+ let {a:vt}netrw_aikeep = &l:ai
+ let {a:vt}netrw_awkeep = &l:aw
+ let {a:vt}netrw_bhkeep = &l:bh
+ let {a:vt}netrw_blkeep = &l:bl
+ let {a:vt}netrw_btkeep = &l:bt
+ let {a:vt}netrw_bombkeep = &l:bomb
+ let {a:vt}netrw_cedit = &cedit
+ let {a:vt}netrw_cikeep = &l:ci
+ let {a:vt}netrw_cinkeep = &l:cin
+ let {a:vt}netrw_cinokeep = &l:cino
+ let {a:vt}netrw_comkeep = &l:com
+ let {a:vt}netrw_cpokeep = &l:cpo
+ let {a:vt}netrw_cuckeep = &l:cuc
+ let {a:vt}netrw_culkeep = &l:cul
+" call Decho("(s:NetrwOptionsSave) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
+ let {a:vt}netrw_diffkeep = &l:diff
+ let {a:vt}netrw_fenkeep = &l:fen
+ if !exists("g:netrw_ffkeep") || g:netrw_ffkeep
+ let {a:vt}netrw_ffkeep = &l:ff
+ endif
+ let {a:vt}netrw_fokeep = &l:fo " formatoptions
+ let {a:vt}netrw_gdkeep = &l:gd " gdefault
+ let {a:vt}netrw_gokeep = &l:go " guioptions
+ let {a:vt}netrw_hidkeep = &l:hidden
+ let {a:vt}netrw_imkeep = &l:im
+ let {a:vt}netrw_iskkeep = &l:isk
+ let {a:vt}netrw_lines = &lines
+ let {a:vt}netrw_lskeep = &l:ls
+ let {a:vt}netrw_makeep = &l:ma
+ let {a:vt}netrw_magickeep = &l:magic
+ let {a:vt}netrw_modkeep = &l:mod
+ let {a:vt}netrw_nukeep = &l:nu
+ let {a:vt}netrw_rnukeep = &l:rnu
+ let {a:vt}netrw_repkeep = &l:report
+ let {a:vt}netrw_rokeep = &l:ro
+ let {a:vt}netrw_selkeep = &l:sel
+ let {a:vt}netrw_spellkeep = &l:spell
+ if !g:netrw_use_noswf
+ let {a:vt}netrw_swfkeep = &l:swf
+ endif
+ let {a:vt}netrw_tskeep = &l:ts
+ let {a:vt}netrw_twkeep = &l:tw " textwidth
+ let {a:vt}netrw_wigkeep = &l:wig " wildignore
+ let {a:vt}netrw_wrapkeep = &l:wrap
+ let {a:vt}netrw_writekeep = &l:write
+
+ " save a few selected netrw-related variables
+" call Decho("saving a few selected netrw-related variables",'~'.expand("<slnum>"))
+ if g:netrw_keepdir
+ let {a:vt}netrw_dirkeep = getcwd()
+" call Decho("saving to ".a:vt."netrw_dirkeep<".{a:vt}netrw_dirkeep.">",'~'.expand("<slnum>"))
+ endif
+ if has("clipboard") && g:netrw_clipboard
+ sil! let {a:vt}netrw_starkeep = @*
+ sil! let {a:vt}netrw_pluskeep = @+
+ endif
+ sil! let {a:vt}netrw_slashkeep= @/
+
+" call Decho("(s:NetrwOptionsSave) lines=".&lines)
+" 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 Dret("s:NetrwOptionsSave : tab#".tabpagenr()." win#".winnr())
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwOptionsSafe: sets options to help netrw do its job {{{2
+" Use s:NetrwSaveOptions() to save user settings
+" Use s:NetrwOptionsRestore() to restore user settings
+fun! s:NetrwOptionsSafe(islocal)
+" call Dfunc("s:NetrwOptionsSafe(islocal=".a:islocal.") win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$"))
+" call Decho("win#".winnr()."'s ft=".&ft,'~'.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>"))
+ if exists("+acd") | call s:NetrwSetSafeSetting("&l:acd",0)|endif
+ call s:NetrwSetSafeSetting("&l:ai",0)
+ call s:NetrwSetSafeSetting("&l:aw",0)
+ call s:NetrwSetSafeSetting("&l:bl",0)
+ call s:NetrwSetSafeSetting("&l:bomb",0)
+ if a:islocal
+ call s:NetrwSetSafeSetting("&l:bt","nofile")
+ else
+ call s:NetrwSetSafeSetting("&l:bt","acwrite")
+ endif
+ call s:NetrwSetSafeSetting("&l:ci",0)
+ call s:NetrwSetSafeSetting("&l:cin",0)
+ if g:netrw_fastbrowse > a:islocal
+ call s:NetrwSetSafeSetting("&l:bh","hide")
+ else
+ call s:NetrwSetSafeSetting("&l:bh","delete")
+ endif
+ call s:NetrwSetSafeSetting("&l:cino","")
+ call s:NetrwSetSafeSetting("&l:com","")
+ if &cpo =~ 'a' | call s:NetrwSetSafeSetting("&cpo",substitute(&cpo,'a','','g')) | endif
+ if &cpo =~ 'A' | call s:NetrwSetSafeSetting("&cpo",substitute(&cpo,'A','','g')) | endif
+ setl fo=nroql2
+ " call s:NetrwSetSafeSetting("&go","begmr")
+ if &go =~ '\ca' | call s:NetrwSetSafeSetting("&go",substitute(&go,'\ca','','g')) | endif
+ call s:NetrwSetSafeSetting("&l:hid",0)
+ call s:NetrwSetSafeSetting("&l:im",0)
+ setl isk+=@ isk+=* isk+=/
+ call s:NetrwSetSafeSetting("&l:magic",1)
+ if g:netrw_use_noswf
+ call s:NetrwSetSafeSetting("swf",0)
+ endif
+ call s:NetrwSetSafeSetting("&l:report",10000)
+ call s:NetrwSetSafeSetting("&l:sel","inclusive")
+ call s:NetrwSetSafeSetting("&l:spell",0)
+ call s:NetrwSetSafeSetting("&l:tw",0)
+ call s:NetrwSetSafeSetting("&l:wig","")
+ setl cedit&
+
+ " set up cuc and cul based on g:netrw_cursor and listing style
+ " COMBAK -- cuc cul related
+ call s:NetrwCursor(0)
+
+ " allow the user to override safe options
+" call Decho("ft<".&ft."> ei=".&ei,'~'.expand("<slnum>"))
+ if &ft == "netrw"
+" call Decho("do any netrw FileType autocmds (doau FileType netrw)",'~'.expand("<slnum>"))
+ keepalt NetrwKeepj doau FileType netrw
+ endif
+
+" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." bh=".&l:bh." bt<".&bt.">",'~'.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 Dret("s:NetrwOptionsSafe")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwOptionsRestore: restore options (based on prior s:NetrwOptionsSave) {{{2
+fun! s:NetrwOptionsRestore(vt)
+" call Dfunc("s:NetrwOptionsRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
+" call Decho("(s:NetrwOptionsRestore) lines=".&lines)
+" 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")
+" call Decho("case ".a:vt."netrw_optionsave : doesn't exist",'~'.expand("<slnum>"))
+ if !isdirectory(expand('%'))
+" call Decho("..doing filetype detect anyway")
+ filetype detect
+ endif
+" 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:NetrwOptionsRestore : ".a:vt."netrw_optionsave doesn't exist")
+ return
+ endif
+ unlet {a:vt}netrw_optionsave
+
+ if exists("+acd")
+ if exists("{a:vt}netrw_acdkeep")
+" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd,'~'.expand("<slnum>"))
+ let curdir = getcwd()
+ let &l:acd = {a:vt}netrw_acdkeep
+ unlet {a:vt}netrw_acdkeep
+ if &l:acd
+ call s:NetrwLcd(curdir)
+ endif
+ endif
+ endif
+" call Decho("(s:NetrwOptionsRestore) #1 lines=".&lines)
+ call s:NetrwRestoreSetting(a:vt."netrw_aikeep","&l:ai")
+ call s:NetrwRestoreSetting(a:vt."netrw_awkeep","&l:aw")
+ call s:NetrwRestoreSetting(a:vt."netrw_blkeep","&l:bl")
+ call s:NetrwRestoreSetting(a:vt."netrw_btkeep","&l:bt")
+ call s:NetrwRestoreSetting(a:vt."netrw_bombkeep","&l:bomb")
+" call Decho("(s:NetrwOptionsRestore) #2 lines=".&lines)
+ call s:NetrwRestoreSetting(a:vt."netrw_cedit","&cedit")
+ call s:NetrwRestoreSetting(a:vt."netrw_cikeep","&l:ci")
+ call s:NetrwRestoreSetting(a:vt."netrw_cinkeep","&l:cin")
+ call s:NetrwRestoreSetting(a:vt."netrw_cinokeep","&l:cino")
+ call s:NetrwRestoreSetting(a:vt."netrw_comkeep","&l:com")
+" call Decho("(s:NetrwOptionsRestore) #3 lines=".&lines)
+ call s:NetrwRestoreSetting(a:vt."netrw_cpokeep","&l:cpo")
+ call s:NetrwRestoreSetting(a:vt."netrw_diffkeep","&l:diff")
+ call s:NetrwRestoreSetting(a:vt."netrw_fenkeep","&l:fen")
+ if exists("g:netrw_ffkeep") && g:netrw_ffkeep
+ call s:NetrwRestoreSetting(a:vt."netrw_ffkeep")","&l:ff")
+ endif
+" call Decho("(s:NetrwOptionsRestore) #4 lines=".&lines)
+ call s:NetrwRestoreSetting(a:vt."netrw_fokeep" ,"&l:fo")
+ call s:NetrwRestoreSetting(a:vt."netrw_gdkeep" ,"&l:gd")
+ call s:NetrwRestoreSetting(a:vt."netrw_gokeep" ,"&l:go")
+ call s:NetrwRestoreSetting(a:vt."netrw_hidkeep" ,"&l:hidden")
+" call Decho("(s:NetrwOptionsRestore) #5 lines=".&lines)
+ call s:NetrwRestoreSetting(a:vt."netrw_imkeep" ,"&l:im")
+ call s:NetrwRestoreSetting(a:vt."netrw_iskkeep" ,"&l:isk")
+" call Decho("(s:NetrwOptionsRestore) #6 lines=".&lines)
+ call s:NetrwRestoreSetting(a:vt."netrw_lines" ,"&lines")
+" call Decho("(s:NetrwOptionsRestore) #7 lines=".&lines)
+ call s:NetrwRestoreSetting(a:vt."netrw_lskeep" ,"&l:ls")
+ call s:NetrwRestoreSetting(a:vt."netrw_makeep" ,"&l:ma")
+ call s:NetrwRestoreSetting(a:vt."netrw_magickeep","&l:magic")
+ call s:NetrwRestoreSetting(a:vt."netrw_modkeep" ,"&l:mod")
+ call s:NetrwRestoreSetting(a:vt."netrw_nukeep" ,"&l:nu")
+" call Decho("(s:NetrwOptionsRestore) #8 lines=".&lines)
+ call s:NetrwRestoreSetting(a:vt."netrw_rnukeep" ,"&l:rnu")
+ call s:NetrwRestoreSetting(a:vt."netrw_repkeep" ,"&l:report")
+ call s:NetrwRestoreSetting(a:vt."netrw_rokeep" ,"&l:ro")
+ call s:NetrwRestoreSetting(a:vt."netrw_selkeep" ,"&l:sel")
+" call Decho("(s:NetrwOptionsRestore) #9 lines=".&lines)
+ call s:NetrwRestoreSetting(a:vt."netrw_spellkeep","&l:spell")
+ call s:NetrwRestoreSetting(a:vt."netrw_twkeep" ,"&l:tw")
+ call s:NetrwRestoreSetting(a:vt."netrw_wigkeep" ,"&l:wig")
+ call s:NetrwRestoreSetting(a:vt."netrw_wrapkeep" ,"&l:wrap")
+ call s:NetrwRestoreSetting(a:vt."netrw_writekeep","&l:write")
+" call Decho("(s:NetrwOptionsRestore) #10 lines=".&lines)
+ call s:NetrwRestoreSetting("s:yykeep","@@")
+ " former problem: start with liststyle=0; press <i> : result, following line resets l:ts.
+ " Fixed; in s:PerformListing, when w:netrw_liststyle is s:LONGLIST, will use a printf to pad filename with spaces
+ " rather than by appending a tab which previously was using "&ts" to set the desired spacing. (Sep 28, 2018)
+ call s:NetrwRestoreSetting(a:vt."netrw_tskeep","&l:ts")
+
+ if exists("{a:vt}netrw_swfkeep")
+ if &directory == ""
+ " user hasn't specified a swapfile directory;
+ " netrw will temporarily set the swapfile directory
+ " to the current directory as returned by getcwd().
+ let &l:directory= getcwd()
+ sil! let &l:swf = {a:vt}netrw_swfkeep
+ setl directory=
+ unlet {a:vt}netrw_swfkeep
+ elseif &l:swf != {a:vt}netrw_swfkeep
+ if !g:netrw_use_noswf
+ " following line causes a Press ENTER in windows -- can't seem to work around it!!!
+ sil! let &l:swf= {a:vt}netrw_swfkeep
+ endif
+ unlet {a:vt}netrw_swfkeep
+ endif
+ endif
+ if exists("{a:vt}netrw_dirkeep") && isdirectory(s:NetrwFile({a:vt}netrw_dirkeep)) && g:netrw_keepdir
+ let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
+ if exists("{a:vt}netrw_dirkeep")
+ call s:NetrwLcd(dirkeep)
+ unlet {a:vt}netrw_dirkeep
+ endif
+ endif
+ if has("clipboard") && g:netrw_clipboard
+" call Decho("has clipboard",'~'.expand("<slnum>"))
+ call s:NetrwRestoreSetting(a:vt."netrw_starkeep","@*")
+ call s:NetrwRestoreSetting(a:vt."netrw_pluskeep","@+")
+ endif
+ call s:NetrwRestoreSetting(a:vt."netrw_slashkeep","@/")
+
+" 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>"))
+" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+" call Decho("diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist"),'~'.expand("<slnum>"))
+" call Decho("ts=".&l:ts,'~'.expand("<slnum>"))
+ " Moved the filetype detect here from NetrwGetFile() because remote files
+ " were having their filetype detect-generated settings overwritten by
+ " NetrwOptionRestore.
+ if &ft != "netrw"
+ if !isdirectory(expand('%'))
+" call Decho("before: filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
+ filetype detect
+" call Decho("after : filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
+ endif
+ endif
+" call Decho("(s:NetrwOptionsRestore) lines=".&lines)
+" 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 Dret("s:NetrwOptionsRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwSetSafeSetting: sets an option to a safe setting {{{2
+" but only when the options' value and the safe setting differ
+" Doing this means that netrw will not come up as having changed a
+" setting last when it really didn't actually change it.
+"
+" Called from s:NetrwOptionsSafe
+" ex. call s:NetrwSetSafeSetting("&l:sel","inclusive")
+fun! s:NetrwSetSafeSetting(setting,safesetting)
+" call Dfunc("s:NetrwSetSafeSetting(setting<".a:setting."> safesetting<".a:safesetting.">)")
+
+ if a:setting =~ '^&'
+" call Decho("fyi: a:setting starts with &")
+ exe "let settingval= ".a:setting
+" call Decho("fyi: settingval<".settingval.">")
+
+ if settingval != a:safesetting
+" call Decho("set setting<".a:setting."> to option value<".a:safesetting.">")
+ if type(a:safesetting) == 0
+ exe "let ".a:setting."=".a:safesetting
+ elseif type(a:safesetting) == 1
+ exe "let ".a:setting."= '".a:safesetting."'"
+ else
+ call netrw#ErrorMsg(s:ERROR,"(s:NetrwRestoreSetting) doesn't know how to restore ".a:setting." with a safesetting of type#".type(a:safesetting),105)
+ endif
+ endif
+ endif
+
+" call Dret("s:NetrwSetSafeSetting")
+endfun
+
+" ------------------------------------------------------------------------
+" s:NetrwRestoreSetting: restores specified setting using associated keepvar, {{{2
+" but only if the setting value differs from the associated keepvar.
+" Doing this means that netrw will not come up as having changed a
+" setting last when it really didn't actually change it.
+"
+" Used by s:NetrwOptionsRestore() to restore each netrw-senstive setting
+" keepvars are set up by s:NetrwOptionsSave
+fun! s:NetrwRestoreSetting(keepvar,setting)
+""" call Dfunc("s:NetrwRestoreSetting(a:keepvar<".a:keepvar."> a:setting<".a:setting.">)")
+
+ " typically called from s:NetrwOptionsRestore
+ " call s:NetrwRestoreSettings(keep-option-variable-name,'associated-option')
+ " ex. call s:NetrwRestoreSetting(a:vt."netrw_selkeep","&l:sel")
+ " Restores option (but only if different) from a:keepvar
+ if exists(a:keepvar)
+ exe "let keepvarval= ".a:keepvar
+ exe "let setting= ".a:setting
+
+"" call Decho("fyi: a:keepvar<".a:keepvar."> exists")
+"" call Decho("fyi: keepvarval=".keepvarval)
+"" call Decho("fyi: a:setting<".a:setting."> setting<".setting.">")
+
+ if setting != keepvarval
+"" call Decho("restore setting<".a:setting."> (currently=".setting.") to keepvarval<".keepvarval.">")
+ if type(a:setting) == 0
+ exe "let ".a:setting."= ".keepvarval
+ elseif type(a:setting) == 1
+ exe "let ".a:setting."= '".substitute(keepvarval,"'","''","g")."'"
+ else
+ call netrw#ErrorMsg(s:ERROR,"(s:NetrwRestoreSetting) doesn't know how to restore ".a:keepvar." with a setting of type#".type(a:setting),105)
+ endif
+ endif
+
+ exe "unlet ".a:keepvar
+ endif
+
+"" call Dret("s:NetrwRestoreSetting")
+endfun
+
+" ---------------------------------------------------------------------
+" NetrwStatusLine: {{{2
+fun! NetrwStatusLine()
+
+" vvv NetrwStatusLine() debugging vvv
+" let g:stlmsg=""
+" if !exists("w:netrw_explore_bufnr")
+" let g:stlmsg="!X<explore_bufnr>"
+" elseif w:netrw_explore_bufnr != bufnr("%")
+" let g:stlmsg="explore_bufnr!=".bufnr("%")
+" endif
+" if !exists("w:netrw_explore_line")
+" let g:stlmsg=" !X<explore_line>"
+" elseif w:netrw_explore_line != line(".")
+" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
+" endif
+" if !exists("w:netrw_explore_list")
+" let g:stlmsg=" !X<explore_list>"
+" endif
+" ^^^ NetrwStatusLine() debugging ^^^
+
+ if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
+ " restore user's status line
+ let &stl = s:netrw_users_stl
+ let &laststatus = s:netrw_users_ls
+ if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
+ if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
+ return ""
+ else
+ return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
+ endif
+endfun
+
+" ===============================
+" Netrw Transfer Functions: {{{1
+" ===============================
+
+" ------------------------------------------------------------------------
+" netrw#NetRead: responsible for reading a file over the net {{{2
+" mode: =0 read remote file and insert before current line
+" =1 read remote file and insert after current line
+" =2 replace with remote file
+" =3 obtain file, but leave in temporary format
+fun! netrw#NetRead(mode,...)
+" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw.((a:0 > 0)? " a:1<".a:1.">" : ""))
+
+ " NetRead: save options {{{3
+ call s:NetrwOptionsSave("w:")
+ call s:NetrwOptionsSafe(0)
+ call s:RestoreCursorline()
+ " NetrwSafeOptions sets a buffer up for a netrw listing, which includes buflisting off.
+ " However, this setting is not wanted for a remote editing session. The buffer should be "nofile", still.
+ setl bl
+" call Decho("buf#".bufnr("%")."<".bufname("%")."> bl=".&bl." bt=".&bt." bh=".&bh,'~'.expand("<slnum>"))
+
+ " NetRead: interpret mode into a readcmd {{{3
+ if a:mode == 0 " read remote file before current line
+ let readcmd = "0r"
+ elseif a:mode == 1 " read file after current line
+ let readcmd = "r"
+ elseif a:mode == 2 " replace with remote file
+ let readcmd = "%r"
+ elseif a:mode == 3 " skip read of file (leave as temporary)
+ let readcmd = "t"
+ else
+ exe a:mode
+ let readcmd = "r"
+ endif
+ let ichoice = (a:0 == 0)? 0 : 1
+" call Decho("readcmd<".readcmd."> ichoice=".ichoice,'~'.expand("<slnum>"))
+
+ " NetRead: get temporary filename {{{3
+ let tmpfile= s:GetTempfile("")
+ if tmpfile == ""
+" call Dret("netrw#NetRead : unable to get a tempfile!")
+ return
+ endif
+
+ while ichoice <= a:0
+
+ " attempt to repeat with previous host-file-etc
+ if exists("b:netrw_lastfile") && a:0 == 0
+" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">",'~'.expand("<slnum>"))
+ let choice = b:netrw_lastfile
+ let ichoice= ichoice + 1
+
+ else
+ exe "let choice= a:" . ichoice
+" call Decho("no lastfile: choice<" . choice . ">",'~'.expand("<slnum>"))
+
+ if match(choice,"?") == 0
+ " give help
+ echomsg 'NetRead Usage:'
+ echomsg ':Nread machine:path uses rcp'
+ echomsg ':Nread "machine path" uses ftp with <.netrc>'
+ echomsg ':Nread "machine id password path" uses ftp'
+ echomsg ':Nread dav://machine[:port]/path uses cadaver'
+ echomsg ':Nread fetch://machine/path uses fetch'
+ echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
+ echomsg ':Nread http://[user@]machine/path uses http wget'
+ echomsg ':Nread file:///path uses elinks'
+ echomsg ':Nread https://[user@]machine/path uses http wget'
+ echomsg ':Nread rcp://[user@]machine/path uses rcp'
+ echomsg ':Nread rsync://machine[:port]/path uses rsync'
+ echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp'
+ echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp'
+ sleep 4
+ break
+
+ elseif match(choice,'^"') != -1
+ " Reconstruct Choice if choice starts with '"'
+" call Decho("reconstructing choice",'~'.expand("<slnum>"))
+ if match(choice,'"$') != -1
+ " case "..."
+ let choice= strpart(choice,1,strlen(choice)-2)
+ else
+ " case "... ... ..."
+ let choice = strpart(choice,1,strlen(choice)-1)
+ let wholechoice = ""
+
+ while match(choice,'"$') == -1
+ let wholechoice = wholechoice . " " . choice
+ let ichoice = ichoice + 1
+ if ichoice > a:0
+ if !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3)
+ endif
+" call Dret("netrw#NetRead :2 getcwd<".getcwd().">")
+ return
+ endif
+ let choice= a:{ichoice}
+ endwhile
+ let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
+ endif
+ endif
+ endif
+
+" call Decho("choice<" . choice . ">",'~'.expand("<slnum>"))
+ let ichoice= ichoice + 1
+
+ " NetRead: Determine method of read (ftp, rcp, etc) {{{3
+ call s:NetrwMethod(choice)
+ if !exists("b:netrw_method") || b:netrw_method < 0
+" call Dret("netrw#NetRead : unsupported method")
+ return
+ endif
+ let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix
+
+ " Check whether or not NetrwBrowse() should be handling this request
+" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">",'~'.expand("<slnum>"))
+ if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://'
+" call Decho("yes, choice matches '^.*[\/]$'",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwBrowse(0,choice)
+" call Dret("netrw#NetRead :3 getcwd<".getcwd().">")
+ return
+ endif
+
+ " ============
+ " NetRead: Perform Protocol-Based Read {{{3
+ " ===========================
+ if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
+ echo "(netrw) Processing your read request..."
+ endif
+
+ ".........................................
+ " NetRead: (rcp) NetRead Method #1 {{{3
+ if b:netrw_method == 1 " read with rcp
+" call Decho("read via rcp (method #1)",'~'.expand("<slnum>"))
+ " ER: nothing done with g:netrw_uid yet?
+ " ER: on Win2K" rcp machine[.user]:file tmpfile
+ " ER: when machine contains '.' adding .user is required (use $USERNAME)
+ " ER: the tmpfile is full path: rcp sees C:\... as host C
+ if s:netrw_has_nt_rcp == 1
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_machine .'.'. g:netrw_uid
+ else
+ " Any way needed it machine contains a '.'
+ let uid_machine = g:netrw_machine .'.'. $USERNAME
+ endif
+ else
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_uid .'@'. g:netrw_machine
+ else
+ let uid_machine = g:netrw_machine
+ endif
+ endif
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".s:ShellEscape(uid_machine.":".b:netrw_fname,1)." ".s:ShellEscape(tmpfile,1))
+ let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3
+ elseif b:netrw_method == 2 " read with ftp + <.netrc>
+" call Decho("read via ftp+.netrc (method #2)",'~'.expand("<slnum>"))
+ let netrw_fname= b:netrw_fname
+ NetrwKeepj call s:SaveBufVars()|new|NetrwKeepj call s:RestoreBufVars()
+ let filtbuf= bufnr("%")
+ setl ff=unix
+ NetrwKeepj put =g:netrw_ftpmode
+" call Decho("filter input: ".getline(line("$")),'~'.expand("<slnum>"))
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline(line("$")),'~'.expand("<slnum>"))
+ endif
+ call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile)
+" call Decho("filter input: ".getline(line("$")),'~'.expand("<slnum>"))
+ if exists("g:netrw_port") && g:netrw_port != ""
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1))
+ else
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
+ endif
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
+ let debugkeep = &debug
+ setl debug=msg
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,getline(1),4)
+ let &debug = debugkeep
+ endif
+ call s:SaveBufVars()
+ keepj bd!
+ if bufname("%") == "" && getline("$") == "" && line('$') == 1
+ " needed when one sources a file in a nolbl setting window via ftp
+ q!
+ endif
+ call s:RestoreBufVars()
+ let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3
+ elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname
+ " Construct execution string (four lines) which will be passed through filter
+" call Decho("read via ftp+mipf (method #3)",'~'.expand("<slnum>"))
+ let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
+ NetrwKeepj call s:SaveBufVars()|new|NetrwKeepj call s:RestoreBufVars()
+ let filtbuf= bufnr("%")
+ setl ff=unix
+ if exists("g:netrw_port") && g:netrw_port != ""
+ NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ else
+ NetrwKeepj put ='open '.g:netrw_machine
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ endif
+
+ if exists("g:netrw_uid") && g:netrw_uid != ""
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ NetrwKeepj put =g:netrw_uid
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ if exists("s:netrw_passwd")
+ NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
+ endif
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ elseif exists("s:netrw_passwd")
+ NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ endif
+ endif
+
+ if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
+ NetrwKeepj put =g:netrw_ftpmode
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ endif
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ endif
+ NetrwKeepj put ='get \"'.netrw_fname.'\" '.tmpfile
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+ NetrwKeepj norm! 1G"_dd
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$"
+" call Decho("error<".getline(1).">",'~'.expand("<slnum>"))
+ if !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,getline(1),5)
+ endif
+ endif
+ call s:SaveBufVars()|keepj bd!|call s:RestoreBufVars()
+ let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetRead: (scp) NetRead Method #4 {{{3
+ elseif b:netrw_method == 4 " read with scp
+" call Decho("read via scp (method #4)",'~'.expand("<slnum>"))
+ if exists("g:netrw_port") && g:netrw_port != ""
+ let useport= " ".g:netrw_scpport." ".g:netrw_port
+ else
+ let useport= ""
+ endif
+ " 'C' in 'C:\path\to\file' is handled as hostname on windows.
+ " This is workaround to avoid mis-handle windows local-path:
+ if g:netrw_scp_cmd =~ '^scp' && (has("win32") || has("win95") || has("win64") || has("win16"))
+ let tmpfile_get = substitute(tr(tmpfile, '\', '/'), '^\(\a\):[/\\]\(.*\)$', '/\1/\2', '')
+ else
+ let tmpfile_get = tmpfile
+ endif
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".escape(s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1),' ')." ".s:ShellEscape(tmpfile_get,1))
+ let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetRead: (http) NetRead Method #5 (wget) {{{3
+ elseif b:netrw_method == 5
+" call Decho("read via http (method #5)",'~'.expand("<slnum>"))
+ if g:netrw_http_cmd == ""
+ if !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6)
+ endif
+" call Dret("netrw#NetRead :4 getcwd<".getcwd().">")
+ return
+ endif
+
+ if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd")
+ " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch)
+" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)",'~'.expand("<slnum>"))
+ if exists("g:netrw_http_xcmd")
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_http_cmd." ".s:ShellEscape(b:netrw_http."://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".s:ShellEscape(tmpfile,1))
+ else
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_http_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(b:netrw_http."://".g:netrw_machine.b:netrw_fname,1))
+ endif
+ let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
+
+ else
+ " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
+" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)",'~'.expand("<slnum>"))
+ let netrw_html= substitute(b:netrw_fname,"#.*$","","")
+ let netrw_tag = substitute(b:netrw_fname,"^.*#","","")
+" call Decho("netrw_html<".netrw_html.">",'~'.expand("<slnum>"))
+" call Decho("netrw_tag <".netrw_tag.">",'~'.expand("<slnum>"))
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_http_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(b:netrw_http."://".g:netrw_machine.netrw_html,1))
+ let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
+" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/','~'.expand("<slnum>"))
+ exe 'NetrwKeepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
+ endif
+ let b:netrw_lastfile = choice
+" call Decho("setl ro",'~'.expand("<slnum>"))
+ setl ro nomod
+
+ ".........................................
+ " NetRead: (dav) NetRead Method #6 {{{3
+ elseif b:netrw_method == 6
+" call Decho("read via cadaver (method #6)",'~'.expand("<slnum>"))
+
+ if !executable(g:netrw_dav_cmd)
+ call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73)
+" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable")
+ return
+ endif
+ if g:netrw_dav_cmd =~ "curl"
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_dav_cmd." ".s:ShellEscape("dav://".g:netrw_machine.b:netrw_fname,1)." ".s:ShellEscape(tmpfile,1))
+ else
+ " Construct execution string (four lines) which will be passed through filter
+ let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
+ new
+ setl ff=unix
+ if exists("g:netrw_port") && g:netrw_port != ""
+ NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
+ else
+ NetrwKeepj put ='open '.g:netrw_machine
+ endif
+ if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
+ NetrwKeepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
+ endif
+ NetrwKeepj put ='get '.netrw_fname.' '.tmpfile
+ NetrwKeepj put ='quit'
+
+ " perform cadaver operation:
+ NetrwKeepj norm! 1G"_dd
+ call s:NetrwExe(s:netrw_silentxfer."%!".g:netrw_dav_cmd)
+ keepj bd!
+ endif
+ let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetRead: (rsync) NetRead Method #7 {{{3
+ elseif b:netrw_method == 7
+" call Decho("read via rsync (method #7)",'~'.expand("<slnum>"))
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".s:ShellEscape(g:netrw_machine.g:netrw_rsync_sep.b:netrw_fname,1)." ".s:ShellEscape(tmpfile,1))
+ let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetRead: (fetch) NetRead Method #8 {{{3
+ " fetch://[user@]host[:http]/path
+ elseif b:netrw_method == 8
+" call Decho("read via fetch (method #8)",'~'.expand("<slnum>"))
+ if g:netrw_fetch_cmd == ""
+ if !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7)
+ endif
+" call Dret("NetRead")
+ return
+ endif
+ if exists("g:netrw_option") && g:netrw_option =~ ":https\="
+ let netrw_option= "http"
+ else
+ let netrw_option= "ftp"
+ endif
+" call Decho("read via fetch for ".netrw_option,'~'.expand("<slnum>"))
+
+ if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1))
+ else
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1))
+ endif
+
+ let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+" call Decho("setl ro",'~'.expand("<slnum>"))
+ setl ro nomod
+
+ ".........................................
+ " NetRead: (sftp) NetRead Method #9 {{{3
+ elseif b:netrw_method == 9
+" call Decho("read via sftp (method #9)",'~'.expand("<slnum>"))
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile)
+ let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetRead: (file) NetRead Method #10 {{{3
+ elseif b:netrw_method == 10 && exists("g:netrw_file_cmd")
+" " call Decho("read via ".b:netrw_file_cmd." (method #10)",'~'.expand("<slnum>"))
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_file_cmd." ".s:ShellEscape(b:netrw_fname,1)." ".tmpfile)
+ let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetRead: Complain {{{3
+ else
+ call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8)
+ endif
+ endwhile
+
+ " NetRead: cleanup {{{3
+ if exists("b:netrw_method")
+" call Decho("cleanup b:netrw_method and b:netrw_fname",'~'.expand("<slnum>"))
+ unlet b:netrw_method
+ unlet b:netrw_fname
+ endif
+ if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' && tmpfile !~ '.tar.xz$' && tmpfile !~ '.txz'
+" call Decho("cleanup by deleting tmpfile<".tmpfile.">",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwDelete(tmpfile)
+ endif
+ NetrwKeepj call s:NetrwOptionsRestore("w:")
+
+" call Dret("netrw#NetRead :5 getcwd<".getcwd().">")
+endfun
+
+" ------------------------------------------------------------------------
+" netrw#NetWrite: responsible for writing a file over the net {{{2
+fun! netrw#NetWrite(...) range
+" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw)
+
+ " NetWrite: option handling {{{3
+ let mod= 0
+ call s:NetrwOptionsSave("w:")
+ call s:NetrwOptionsSafe(0)
+
+ " NetWrite: Get Temporary Filename {{{3
+ let tmpfile= s:GetTempfile("")
+ if tmpfile == ""
+" call Dret("netrw#NetWrite : unable to get a tempfile!")
+ return
+ endif
+
+ if a:0 == 0
+ let ichoice = 0
+ else
+ let ichoice = 1
+ endif
+
+ let curbufname= expand("%")
+" call Decho("curbufname<".curbufname.">",'~'.expand("<slnum>"))
+ if &binary
+ " For binary writes, always write entire file.
+ " (line numbers don't really make sense for that).
+ " Also supports the writing of tar and zip files.
+" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile),'~'.expand("<slnum>"))
+ exe "sil NetrwKeepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
+ elseif g:netrw_cygwin
+ " write (selected portion of) file to temporary
+ let cygtmpfile= substitute(tmpfile,g:netrw_cygdrive.'/\(.\)','\1:','')
+" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile),'~'.expand("<slnum>"))
+ exe "sil NetrwKeepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)
+ else
+ " write (selected portion of) file to temporary
+" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile),'~'.expand("<slnum>"))
+ exe "sil NetrwKeepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)
+ endif
+
+ if curbufname == ""
+ " when the file is [No Name], and one attempts to Nwrite it, the buffer takes
+ " on the temporary file's name. Deletion of the temporary file during
+ " cleanup then causes an error message.
+ 0file!
+ endif
+
+ " NetWrite: while choice loop: {{{3
+ while ichoice <= a:0
+
+ " Process arguments: {{{4
+ " attempt to repeat with previous host-file-etc
+ if exists("b:netrw_lastfile") && a:0 == 0
+" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">",'~'.expand("<slnum>"))
+ let choice = b:netrw_lastfile
+ let ichoice= ichoice + 1
+ else
+ exe "let choice= a:" . ichoice
+
+ " Reconstruct Choice when choice starts with '"'
+ if match(choice,"?") == 0
+ echomsg 'NetWrite Usage:"'
+ echomsg ':Nwrite machine:path uses rcp'
+ echomsg ':Nwrite "machine path" uses ftp with <.netrc>'
+ echomsg ':Nwrite "machine id password path" uses ftp'
+ echomsg ':Nwrite dav://[user@]machine/path uses cadaver'
+ echomsg ':Nwrite fetch://[user@]machine/path uses fetch'
+ echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)'
+ echomsg ':Nwrite rcp://machine/path uses rcp'
+ echomsg ':Nwrite rsync://[user@]machine/path uses rsync'
+ echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp'
+ echomsg ':Nwrite sftp://[user@]machine/path uses sftp'
+ sleep 4
+ break
+
+ elseif match(choice,"^\"") != -1
+ if match(choice,"\"$") != -1
+ " case "..."
+ let choice=strpart(choice,1,strlen(choice)-2)
+ else
+ " case "... ... ..."
+ let choice = strpart(choice,1,strlen(choice)-1)
+ let wholechoice = ""
+
+ while match(choice,"\"$") == -1
+ let wholechoice= wholechoice . " " . choice
+ let ichoice = ichoice + 1
+ if choice > a:0
+ if !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13)
+ endif
+" call Dret("netrw#NetWrite")
+ return
+ endif
+ let choice= a:{ichoice}
+ endwhile
+ let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
+ endif
+ endif
+ endif
+ let ichoice= ichoice + 1
+" call Decho("choice<" . choice . "> ichoice=".ichoice,'~'.expand("<slnum>"))
+
+ " Determine method of write (ftp, rcp, etc) {{{4
+ NetrwKeepj call s:NetrwMethod(choice)
+ if !exists("b:netrw_method") || b:netrw_method < 0
+" call Dfunc("netrw#NetWrite : unsupported method")
+ return
+ endif
+
+ " =============
+ " NetWrite: Perform Protocol-Based Write {{{3
+ " ============================
+ if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
+ echo "(netrw) Processing your write request..."
+" call Decho("Processing your write request...",'~'.expand("<slnum>"))
+ endif
+
+ ".........................................
+ " NetWrite: (rcp) NetWrite Method #1 {{{3
+ if b:netrw_method == 1
+" call Decho("write via rcp (method #1)",'~'.expand("<slnum>"))
+ if s:netrw_has_nt_rcp == 1
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_machine .'.'. g:netrw_uid
+ else
+ let uid_machine = g:netrw_machine .'.'. $USERNAME
+ endif
+ else
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_uid .'@'. g:netrw_machine
+ else
+ let uid_machine = g:netrw_machine
+ endif
+ endif
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(uid_machine.":".b:netrw_fname,1))
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3
+ elseif b:netrw_method == 2
+" call Decho("write via ftp+.netrc (method #2)",'~'.expand("<slnum>"))
+ let netrw_fname = b:netrw_fname
+
+ " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
+ let bhkeep = &l:bh
+ let curbuf = bufnr("%")
+ setl bh=hide
+ keepj keepalt enew
+
+" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
+ setl ff=unix
+ NetrwKeepj put =g:netrw_ftpmode
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline("$"),'~'.expand("<slnum>"))
+ endif
+ NetrwKeepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"')
+" call Decho("filter input: ".getline("$"),'~'.expand("<slnum>"))
+ if exists("g:netrw_port") && g:netrw_port != ""
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1))
+ else
+" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
+ endif
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$"
+ if !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,getline(1),14)
+ endif
+ let mod=1
+ endif
+
+ " remove enew buffer (quietly)
+ let filtbuf= bufnr("%")
+ exe curbuf."b!"
+ let &l:bh = bhkeep
+ exe filtbuf."bw!"
+
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3
+ elseif b:netrw_method == 3
+ " Construct execution string (three or more lines) which will be passed through filter
+" call Decho("read via ftp+mipf (method #3)",'~'.expand("<slnum>"))
+ let netrw_fname = b:netrw_fname
+ let bhkeep = &l:bh
+
+ " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
+ let curbuf = bufnr("%")
+ setl bh=hide
+ keepj keepalt enew
+ setl ff=unix
+
+ if exists("g:netrw_port") && g:netrw_port != ""
+ NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ else
+ NetrwKeepj put ='open '.g:netrw_machine
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ endif
+ if exists("g:netrw_uid") && g:netrw_uid != ""
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ NetrwKeepj put =g:netrw_uid
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ if exists("s:netrw_passwd") && s:netrw_passwd != ""
+ NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
+ endif
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ elseif exists("s:netrw_passwd") && s:netrw_passwd != ""
+ NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ endif
+ endif
+ NetrwKeepj put =g:netrw_ftpmode
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline("$"),'~'.expand("<slnum>"))
+ endif
+ NetrwKeepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ " save choice/id/password for future use
+ let b:netrw_lastfile = choice
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+ NetrwKeepj norm! 1G"_dd
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ if getline(1) !~ "^$"
+ if !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,getline(1),15)
+ endif
+ let mod=1
+ endif
+
+ " remove enew buffer (quietly)
+ let filtbuf= bufnr("%")
+ exe curbuf."b!"
+ let &l:bh= bhkeep
+ exe filtbuf."bw!"
+
+ ".........................................
+ " NetWrite: (scp) NetWrite Method #4 {{{3
+ elseif b:netrw_method == 4
+" call Decho("write via scp (method #4)",'~'.expand("<slnum>"))
+ if exists("g:netrw_port") && g:netrw_port != ""
+ let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port)
+ else
+ let useport= ""
+ endif
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(g:netrw_machine.":".b:netrw_fname,1))
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetWrite: (http) NetWrite Method #5 {{{3
+ elseif b:netrw_method == 5
+" call Decho("write via http (method #5)",'~'.expand("<slnum>"))
+ let curl= substitute(g:netrw_http_put_cmd,'\s\+.*$',"","")
+ if executable(curl)
+ let url= g:netrw_choice
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_http_put_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(url,1) )
+ elseif !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,"can't write to http using <".g:netrw_http_put_cmd.">".",16)
+ endif
+
+ ".........................................
+ " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3
+ elseif b:netrw_method == 6
+" call Decho("write via cadaver (method #6)",'~'.expand("<slnum>"))
+
+ " Construct execution string (four lines) which will be passed through filter
+ let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape)
+ let bhkeep = &l:bh
+
+ " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
+ let curbuf = bufnr("%")
+ setl bh=hide
+ keepj keepalt enew
+
+ setl ff=unix
+ if exists("g:netrw_port") && g:netrw_port != ""
+ NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
+ else
+ NetrwKeepj put ='open '.g:netrw_machine
+ endif
+ if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != ""
+ NetrwKeepj put ='user '.g:netrw_uid.' '.s:netrw_passwd
+ endif
+ NetrwKeepj put ='put '.tmpfile.' '.netrw_fname
+
+ " perform cadaver operation:
+ NetrwKeepj norm! 1G"_dd
+ call s:NetrwExe(s:netrw_silentxfer."%!".g:netrw_dav_cmd)
+
+ " remove enew buffer (quietly)
+ let filtbuf= bufnr("%")
+ exe curbuf."b!"
+ let &l:bh = bhkeep
+ exe filtbuf."bw!"
+
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetWrite: (rsync) NetWrite Method #7 {{{3
+ elseif b:netrw_method == 7
+" call Decho("write via rsync (method #7)",'~'.expand("<slnum>"))
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".s:ShellEscape(tmpfile,1)." ".s:ShellEscape(g:netrw_machine.g:netrw_rsync_sep.b:netrw_fname,1))
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetWrite: (sftp) NetWrite Method #9 {{{3
+ elseif b:netrw_method == 9
+" call Decho("write via sftp (method #9)",'~'.expand("<slnum>"))
+ let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
+ if exists("g:netrw_uid") && ( g:netrw_uid != "" )
+ let uid_machine = g:netrw_uid .'@'. g:netrw_machine
+ else
+ let uid_machine = g:netrw_machine
+ endif
+
+ " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead
+ let bhkeep = &l:bh
+ let curbuf = bufnr("%")
+ setl bh=hide
+ keepj keepalt enew
+
+ setl ff=unix
+ call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname)
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ let sftpcmd= substitute(g:netrw_sftp_cmd,"%TEMPFILE%",escape(tmpfile,'\'),"g")
+ call s:NetrwExe(s:netrw_silentxfer."%!".sftpcmd.' '.s:ShellEscape(uid_machine,1))
+ let filtbuf= bufnr("%")
+ exe curbuf."b!"
+ let &l:bh = bhkeep
+ exe filtbuf."bw!"
+ let b:netrw_lastfile = choice
+
+ ".........................................
+ " NetWrite: Complain {{{3
+ else
+ call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17)
+ let leavemod= 1
+ endif
+ endwhile
+
+ " NetWrite: Cleanup: {{{3
+" call Decho("cleanup",'~'.expand("<slnum>"))
+ if s:FileReadable(tmpfile)
+" call Decho("tmpfile<".tmpfile."> readable, will now delete it",'~'.expand("<slnum>"))
+ call s:NetrwDelete(tmpfile)
+ endif
+ call s:NetrwOptionsRestore("w:")
+
+ if a:firstline == 1 && a:lastline == line("$")
+ " restore modifiability; usually equivalent to set nomod
+ let &mod= mod
+" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ elseif !exists("leavemod")
+ " indicate that the buffer has not been modified since last written
+" call Decho("set nomod",'~'.expand("<slnum>"))
+ setl nomod
+" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ endif
+
+" call Dret("netrw#NetWrite")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#NetSource: source a remotely hosted vim script {{{2
+" uses NetRead to get a copy of the file into a temporarily file,
+" then sources that file,
+" then removes that file.
+fun! netrw#NetSource(...)
+" call Dfunc("netrw#NetSource() a:0=".a:0)
+ if a:0 > 0 && a:1 == '?'
+ " give help
+ echomsg 'NetSource Usage:'
+ echomsg ':Nsource dav://machine[:port]/path uses cadaver'
+ echomsg ':Nsource fetch://machine/path uses fetch'
+ echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>'
+ echomsg ':Nsource http[s]://[user@]machine/path uses http wget'
+ echomsg ':Nsource rcp://[user@]machine/path uses rcp'
+ echomsg ':Nsource rsync://machine[:port]/path uses rsync'
+ echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp'
+ echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp'
+ sleep 4
+ else
+ let i= 1
+ while i <= a:0
+ call netrw#NetRead(3,a:{i})
+" call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">",'~'.expand("<slnum>"))
+ if s:FileReadable(s:netrw_tmpfile)
+" call Decho("exe so ".fnameescape(s:netrw_tmpfile),'~'.expand("<slnum>"))
+ exe "so ".fnameescape(s:netrw_tmpfile)
+" call Decho("delete(".s:netrw_tmpfile.")",'~'.expand("<slnum>"))
+ if delete(s:netrw_tmpfile)
+ call netrw#ErrorMsg(s:ERROR,"unable to delete directory <".s:netrw_tmpfile.">!",103)
+ endif
+ unlet s:netrw_tmpfile
+ else
+ call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48)
+ endif
+ let i= i + 1
+ endwhile
+ endif
+" call Dret("netrw#NetSource")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#SetTreetop: resets the tree top to the current directory/specified directory {{{2
+" (implements the :Ntree command)
+fun! netrw#SetTreetop(iscmd,...)
+" call Dfunc("netrw#SetTreetop(iscmd=".a:iscmd." ".((a:0 > 0)? a:1 : "").") a:0=".a:0)
+" call Decho("w:netrw_treetop<".w:netrw_treetop.">")
+
+ " iscmd==0: netrw#SetTreetop called using gn mapping
+ " iscmd==1: netrw#SetTreetop called using :Ntree from the command line
+" call Decho("(iscmd=".a:iscmd.": called using :Ntree from command line",'~'.expand("<slnum>"))
+ " clear out the current tree
+ if exists("w:netrw_treetop")
+" call Decho("clearing out current tree",'~'.expand("<slnum>"))
+ let inittreetop= w:netrw_treetop
+ unlet w:netrw_treetop
+ endif
+ if exists("w:netrw_treedict")
+" call Decho("freeing w:netrw_treedict",'~'.expand("<slnum>"))
+ unlet w:netrw_treedict
+ endif
+" call Decho("inittreetop<".(exists("inittreetop")? inittreetop : "n/a").">")
+
+ if (a:iscmd == 0 || a:1 == "") && exists("inittreetop")
+ let treedir = s:NetrwTreePath(inittreetop)
+" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
+ else
+ if isdirectory(s:NetrwFile(a:1))
+" call Decho("a:1<".a:1."> is a directory",'~'.expand("<slnum>"))
+ let treedir = a:1
+ let s:netrw_treetop = treedir
+ elseif exists("b:netrw_curdir") && (isdirectory(s:NetrwFile(b:netrw_curdir."/".a:1)) || a:1 =~ '^\a\{3,}://')
+ let treedir = b:netrw_curdir."/".a:1
+ let s:netrw_treetop = treedir
+" call Decho("a:1<".a:1."> is NOT a directory, using treedir<".treedir.">",'~'.expand("<slnum>"))
+ else
+ " normally the cursor is left in the message window.
+ " However, here this results in the directory being listed in the message window, which is not wanted.
+ let netrwbuf= bufnr("%")
+ call netrw#ErrorMsg(s:ERROR,"sorry, ".a:1." doesn't seem to be a directory!",95)
+ exe bufwinnr(netrwbuf)."wincmd w"
+ let treedir = "."
+ let s:netrw_treetop = getcwd()
+ endif
+ endif
+" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
+
+ " determine if treedir is remote or local
+ let islocal= expand("%") !~ '^\a\{3,}://'
+" call Decho("islocal=".islocal,'~'.expand("<slnum>"))
+
+ " browse the resulting directory
+ if islocal
+ call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(islocal,treedir))
+ else
+ call s:NetrwBrowse(islocal,s:NetrwBrowseChgDir(islocal,treedir))
+ endif
+
+" call Dret("netrw#SetTreetop")
+endfun
+
+" ===========================================
+" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2
+" readcmd == %r : replace buffer with newly read file
+" == 0r : read file at top of buffer
+" == r : read file after current line
+" == t : leave file in temporary form (ie. don't read into buffer)
+fun! s:NetrwGetFile(readcmd, tfile, method)
+" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)")
+
+ " readcmd=='t': simply do nothing
+ if a:readcmd == 't'
+" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+" call Dret("NetrwGetFile : skip read of tfile<".a:tfile.">")
+ return
+ endif
+
+ " get name of remote filename (ie. url and all)
+ let rfile= bufname("%")
+" call Decho("rfile<".rfile.">",'~'.expand("<slnum>"))
+
+ if exists("*NetReadFixup")
+ " for the use of NetReadFixup (not otherwise used internally)
+ let line2= line("$")
+ endif
+
+ if a:readcmd[0] == '%'
+ " get file into buffer
+" call Decho("get file into buffer",'~'.expand("<slnum>"))
+
+ " rename the current buffer to the temp file (ie. tfile)
+ if g:netrw_cygwin
+ let tfile= substitute(a:tfile,g:netrw_cygdrive.'/\(.\)','\1:','')
+ else
+ let tfile= a:tfile
+ endif
+ call s:NetrwBufRename(tfile)
+
+ " edit temporary file (ie. read the temporary file in)
+ if rfile =~ '\.zip$'
+" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)",'~'.expand("<slnum>"))
+ call zip#Browse(tfile)
+ elseif rfile =~ '\.tar$'
+" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)",'~'.expand("<slnum>"))
+ call tar#Browse(tfile)
+ elseif rfile =~ '\.tar\.gz$'
+" call Decho("handling remote gzip-compressed tar file",'~'.expand("<slnum>"))
+ call tar#Browse(tfile)
+ elseif rfile =~ '\.tar\.bz2$'
+" call Decho("handling remote bz2-compressed tar file",'~'.expand("<slnum>"))
+ call tar#Browse(tfile)
+ elseif rfile =~ '\.tar\.xz$'
+" call Decho("handling remote xz-compressed tar file",'~'.expand("<slnum>"))
+ call tar#Browse(tfile)
+ elseif rfile =~ '\.txz$'
+" call Decho("handling remote xz-compressed tar file (.txz)",'~'.expand("<slnum>"))
+ call tar#Browse(tfile)
+ else
+" call Decho("edit temporary file",'~'.expand("<slnum>"))
+ NetrwKeepj e!
+ endif
+
+ " rename buffer back to remote filename
+ call s:NetrwBufRename(rfile)
+
+ " Detect filetype of local version of remote file.
+ " Note that isk must not include a "/" for scripts.vim
+ " to process this detection correctly.
+" call Decho("detect filetype of local version of remote file",'~'.expand("<slnum>"))
+ let iskkeep= &l:isk
+ setl isk-=/
+ let &l:isk= iskkeep
+" call Dredir("ls!","NetrwGetFile (renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">)")
+ let line1 = 1
+ let line2 = line("$")
+
+ elseif !&ma
+ " attempting to read a file after the current line in the file, but the buffer is not modifiable
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"attempt to read<".a:tfile."> into a non-modifiable buffer!",94)
+" call Dret("NetrwGetFile : attempt to read<".a:tfile."> into a non-modifiable buffer!")
+ return
+
+ elseif s:FileReadable(a:tfile)
+ " read file after current line
+" call Decho("read file<".a:tfile."> after current line",'~'.expand("<slnum>"))
+ let curline = line(".")
+ let lastline= line("$")
+" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline,'~'.expand("<slnum>"))
+ exe "NetrwKeepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)
+ let line1= curline + 1
+ let line2= line("$") - lastline + 1
+
+ else
+ " not readable
+" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+" call Decho("tfile<".a:tfile."> not readable",'~'.expand("<slnum>"))
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
+" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
+ return
+ endif
+
+ " User-provided (ie. optional) fix-it-up command
+ if exists("*NetReadFixup")
+" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")",'~'.expand("<slnum>"))
+ NetrwKeepj call NetReadFixup(a:method, line1, line2)
+" else " Decho
+" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")",'~'.expand("<slnum>"))
+ endif
+
+ if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
+ " update the Buffers menu
+ NetrwKeepj call s:UpdateBuffersMenu()
+ endif
+
+" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile),'~'.expand("<slnum>"))
+
+ " make sure file is being displayed
+" redraw!
+
+" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+" call Dret("NetrwGetFile")
+endfun
+
+" ------------------------------------------------------------------------
+" s:NetrwMethod: determine method of transfer {{{2
+" Input:
+" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file]
+" Output:
+" b:netrw_method= 1: rcp
+" 2: ftp + <.netrc>
+" 3: ftp + machine, id, password, and [path]filename
+" 4: scp
+" 5: http[s] (wget)
+" 6: dav
+" 7: rsync
+" 8: fetch
+" 9: sftp
+" 10: file
+" g:netrw_machine= hostname
+" b:netrw_fname = filename
+" g:netrw_port = optional port number (for ftp)
+" g:netrw_choice = copy of input url (choice)
+fun! s:NetrwMethod(choice)
+" call Dfunc("s:NetrwMethod(a:choice<".a:choice.">)")
+
+ " sanity check: choice should have at least three slashes in it
+ if strlen(substitute(a:choice,'[^/]','','g')) < 3
+ call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78)
+ let b:netrw_method = -1
+" call Dret("s:NetrwMethod : incorrect url format<".a:choice.">")
+ return
+ endif
+
+ " record current g:netrw_machine, if any
+ " curmachine used if protocol == ftp and no .netrc
+ if exists("g:netrw_machine")
+ let curmachine= g:netrw_machine
+" call Decho("curmachine<".curmachine.">",'~'.expand("<slnum>"))
+ else
+ let curmachine= "N O T A HOST"
+ endif
+ if exists("g:netrw_port")
+ let netrw_port= g:netrw_port
+ endif
+
+ " insure that netrw_ftp_cmd starts off every method determination
+ " with the current g:netrw_ftp_cmd
+ let s:netrw_ftp_cmd= g:netrw_ftp_cmd
+
+ " initialization
+ let b:netrw_method = 0
+ let g:netrw_machine = ""
+ let b:netrw_fname = ""
+ let g:netrw_port = ""
+ let g:netrw_choice = a:choice
+
+ " Patterns:
+ " mipf : a:machine a:id password filename Use ftp
+ " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
+ " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd
+ " rcpurm : rcp://[user@]host/filename Use rcp
+ " rcphf : [user@]host:filename Use rcp
+ " scpurm : scp://[user@]host[[#:]port]/filename Use scp
+ " httpurm : http[s]://[user@]host/filename Use wget
+ " davurm : dav[s]://host[:port]/path Use cadaver/curl
+ " rsyncurm : rsync://host[:port]/path Use rsync
+ " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http)
+ " sftpurm : sftp://[user@]host/filename Use scp
+ " fileurm : file://[user@]host/filename Use elinks or links
+ let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$'
+ let mf = '^\(\S\+\)\s\+\(\S\+\)$'
+ let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$'
+ let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$'
+ let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
+ let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
+ let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$'
+ let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
+ let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
+ let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
+ let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
+ let fileurm = '^file\=://\(.*\)$'
+
+" call Decho("determine method:",'~'.expand("<slnum>"))
+ " Determine Method
+ " Method#1: rcp://user@hostname/...path-to-file {{{3
+ if match(a:choice,rcpurm) == 0
+" call Decho("rcp://...",'~'.expand("<slnum>"))
+ let b:netrw_method = 1
+ let userid = substitute(a:choice,rcpurm,'\1',"")
+ let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"")
+ let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"")
+ if userid != ""
+ let g:netrw_uid= userid
+ endif
+
+ " Method#4: scp://user@hostname/...path-to-file {{{3
+ elseif match(a:choice,scpurm) == 0
+" call Decho("scp://...",'~'.expand("<slnum>"))
+ let b:netrw_method = 4
+ let g:netrw_machine = substitute(a:choice,scpurm,'\1',"")
+ let g:netrw_port = substitute(a:choice,scpurm,'\2',"")
+ let b:netrw_fname = substitute(a:choice,scpurm,'\3',"")
+
+ " Method#5: http[s]://user@hostname/...path-to-file {{{3
+ elseif match(a:choice,httpurm) == 0
+" call Decho("http[s]://...",'~'.expand("<slnum>"))
+ let b:netrw_method = 5
+ let g:netrw_machine= substitute(a:choice,httpurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,httpurm,'\2',"")
+ let b:netrw_http = (a:choice =~ '^https:')? "https" : "http"
+
+ " Method#6: dav://hostname[:port]/..path-to-file.. {{{3
+ elseif match(a:choice,davurm) == 0
+" call Decho("dav://...",'~'.expand("<slnum>"))
+ let b:netrw_method= 6
+ if a:choice =~ 'davs:'
+ let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"")
+ else
+ let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"")
+ endif
+ let b:netrw_fname = substitute(a:choice,davurm,'\3',"")
+
+ " Method#7: rsync://user@hostname/...path-to-file {{{3
+ elseif match(a:choice,rsyncurm) == 0
+" call Decho("rsync://...",'~'.expand("<slnum>"))
+ let b:netrw_method = 7
+ let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"")
+
+ " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3
+ elseif match(a:choice,ftpurm) == 0
+" call Decho("ftp://...",'~'.expand("<slnum>"))
+ let userid = substitute(a:choice,ftpurm,'\2',"")
+ let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"")
+ let g:netrw_port = substitute(a:choice,ftpurm,'\4',"")
+ let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"")
+" call Decho("g:netrw_machine<".g:netrw_machine.">",'~'.expand("<slnum>"))
+ if userid != ""
+ let g:netrw_uid= userid
+ endif
+
+ if curmachine != g:netrw_machine
+ if exists("s:netrw_hup[".g:netrw_machine."]")
+ call NetUserPass("ftp:".g:netrw_machine)
+ elseif exists("s:netrw_passwd")
+ " if there's a change in hostname, require password re-entry
+ unlet s:netrw_passwd
+ endif
+ if exists("netrw_port")
+ unlet netrw_port
+ endif
+ endif
+
+ if exists("g:netrw_uid") && exists("s:netrw_passwd")
+ let b:netrw_method = 3
+ else
+ let host= substitute(g:netrw_machine,'\..*$','','')
+ if exists("s:netrw_hup[host]")
+ call NetUserPass("ftp:".host)
+
+ 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\>'
+ 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
+ let b:netrw_method= 2
+ elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc
+" call Decho("using <".expand("$HOME/.netrc")."> (readable)",'~'.expand("<slnum>"))
+ let b:netrw_method= 2
+ else
+ if !exists("g:netrw_uid") || g:netrw_uid == ""
+ call NetUserPass()
+ elseif !exists("s:netrw_passwd") || s:netrw_passwd == ""
+ call NetUserPass(g:netrw_uid)
+ " else just use current g:netrw_uid and s:netrw_passwd
+ endif
+ let b:netrw_method= 3
+ endif
+ endif
+
+ " Method#8: fetch {{{3
+ elseif match(a:choice,fetchurm) == 0
+" call Decho("fetch://...",'~'.expand("<slnum>"))
+ let b:netrw_method = 8
+ let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"")
+ let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"")
+ let b:netrw_option = substitute(a:choice,fetchurm,'\4',"")
+ let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"")
+
+ " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3
+ elseif match(a:choice,mipf) == 0
+" call Decho("(ftp) host id pass file",'~'.expand("<slnum>"))
+ let b:netrw_method = 3
+ let g:netrw_machine = substitute(a:choice,mipf,'\1',"")
+ let g:netrw_uid = substitute(a:choice,mipf,'\2',"")
+ let s:netrw_passwd = substitute(a:choice,mipf,'\3',"")
+ let b:netrw_fname = substitute(a:choice,mipf,'\4',"")
+ call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd)
+
+ " Method#3: Issue an ftp: "hostname [path/]filename" {{{3
+ elseif match(a:choice,mf) == 0
+" call Decho("(ftp) host file",'~'.expand("<slnum>"))
+ if exists("g:netrw_uid") && exists("s:netrw_passwd")
+ let b:netrw_method = 3
+ let g:netrw_machine = substitute(a:choice,mf,'\1',"")
+ let b:netrw_fname = substitute(a:choice,mf,'\2',"")
+
+ elseif s:FileReadable(expand("$HOME/.netrc"))
+ let b:netrw_method = 2
+ let g:netrw_machine = substitute(a:choice,mf,'\1',"")
+ let b:netrw_fname = substitute(a:choice,mf,'\2',"")
+ endif
+
+ " Method#9: sftp://user@hostname/...path-to-file {{{3
+ elseif match(a:choice,sftpurm) == 0
+" call Decho("sftp://...",'~'.expand("<slnum>"))
+ let b:netrw_method = 9
+ let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"")
+ let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"")
+
+ " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3
+ elseif match(a:choice,rcphf) == 0
+" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">",'~'.expand("<slnum>"))
+ let b:netrw_method = 1
+ let userid = substitute(a:choice,rcphf,'\2',"")
+ let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
+ let b:netrw_fname = substitute(a:choice,rcphf,'\4',"")
+" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">",'~'.expand("<slnum>"))
+" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">",'~'.expand("<slnum>"))
+" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">",'~'.expand("<slnum>"))
+" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">",'~'.expand("<slnum>"))
+ if userid != ""
+ let g:netrw_uid= userid
+ endif
+
+ " Method#10: file://user@hostname/...path-to-file {{{3
+ elseif match(a:choice,fileurm) == 0 && exists("g:netrw_file_cmd")
+" call Decho("http[s]://...",'~'.expand("<slnum>"))
+ let b:netrw_method = 10
+ let b:netrw_fname = substitute(a:choice,fileurm,'\1',"")
+" call Decho('\1<'.substitute(a:choice,fileurm,'\1',"").">",'~'.expand("<slnum>"))
+
+ " Cannot Determine Method {{{3
+ else
+ if !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45)
+ endif
+ let b:netrw_method = -1
+ endif
+ "}}}3
+
+ if g:netrw_port != ""
+ " remove any leading [:#] from port number
+ let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','')
+ elseif exists("netrw_port")
+ " retain port number as implicit for subsequent ftp operations
+ let g:netrw_port= netrw_port
+ endif
+
+" call Decho("a:choice <".a:choice.">",'~'.expand("<slnum>"))
+" call Decho("b:netrw_method <".b:netrw_method.">",'~'.expand("<slnum>"))
+" call Decho("g:netrw_machine<".g:netrw_machine.">",'~'.expand("<slnum>"))
+" call Decho("g:netrw_port <".g:netrw_port.">",'~'.expand("<slnum>"))
+" if exists("g:netrw_uid") "Decho
+" call Decho("g:netrw_uid <".g:netrw_uid.">",'~'.expand("<slnum>"))
+" endif "Decho
+" if exists("s:netrw_passwd") "Decho
+" call Decho("s:netrw_passwd <".s:netrw_passwd.">",'~'.expand("<slnum>"))
+" endif "Decho
+" call Decho("b:netrw_fname <".b:netrw_fname.">",'~'.expand("<slnum>"))
+" call Dret("s:NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port)
+endfun
+
+" ------------------------------------------------------------------------
+" NetReadFixup: this sort of function is typically written by the user {{{2
+" to handle extra junk that their system's ftp dumps
+" into the transfer. This function is provided as an
+" example and as a fix for a Windows 95 problem: in my
+" experience, win95's ftp always dumped four blank lines
+" at the end of the transfer.
+if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp
+ fun! NetReadFixup(method, line1, line2)
+" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")")
+
+ " sanity checks -- attempt to convert inputs to integers
+ let method = a:method + 0
+ let line1 = a:line1 + 0
+ let line2 = a:line2 + 0
+ if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0
+" call Dret("NetReadFixup")
+ return
+ endif
+
+ if method == 3 " ftp (no <.netrc>)
+ let fourblanklines= line2 - 3
+ if fourblanklines >= line1
+ exe "sil NetrwKeepj ".fourblanklines.",".line2."g/^\s*$/d"
+ call histdel("/",-1)
+ endif
+ endif
+
+" call Dret("NetReadFixup")
+ endfun
+endif
+
+" ---------------------------------------------------------------------
+" NetUserPass: set username and password for subsequent ftp transfer {{{2
+" Usage: :call NetUserPass() -- will prompt for userid and password
+" :call NetUserPass("uid") -- will prompt for password
+" :call NetUserPass("uid","password") -- sets global userid and password
+" :call NetUserPass("ftp:host") -- looks up userid and password using hup dictionary
+" :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password
+fun! NetUserPass(...)
+
+" call Dfunc("NetUserPass() a:0=".a:0)
+
+ if !exists('s:netrw_hup')
+ let s:netrw_hup= {}
+ endif
+
+ if a:0 == 0
+ " case: no input arguments
+
+ " change host and username if not previously entered; get new password
+ if !exists("g:netrw_machine")
+ let g:netrw_machine= input('Enter hostname: ')
+ endif
+ if !exists("g:netrw_uid") || g:netrw_uid == ""
+ " get username (user-id) via prompt
+ let g:netrw_uid= input('Enter username: ')
+ endif
+ " get password via prompting
+ let s:netrw_passwd= inputsecret("Enter Password: ")
+
+ " set up hup database
+ let host = substitute(g:netrw_machine,'\..*$','','')
+ if !exists('s:netrw_hup[host]')
+ let s:netrw_hup[host]= {}
+ endif
+ let s:netrw_hup[host].uid = g:netrw_uid
+ let s:netrw_hup[host].passwd = s:netrw_passwd
+
+ elseif a:0 == 1
+ " case: one input argument
+
+ if a:1 =~ '^ftp:'
+ " get host from ftp:... url
+ " access userid and password from hup (host-user-passwd) dictionary
+" call Decho("case a:0=1: a:1<".a:1."> (get host from ftp:... url)",'~'.expand("<slnum>"))
+ let host = substitute(a:1,'^ftp:','','')
+ let host = substitute(host,'\..*','','')
+ if exists("s:netrw_hup[host]")
+ let g:netrw_uid = s:netrw_hup[host].uid
+ let s:netrw_passwd = s:netrw_hup[host].passwd
+" call Decho("get s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">",'~'.expand("<slnum>"))
+" call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">",'~'.expand("<slnum>"))
+ else
+ let g:netrw_uid = input("Enter UserId: ")
+ let s:netrw_passwd = inputsecret("Enter Password: ")
+ endif
+
+ else
+ " case: one input argument, not an url. Using it as a new user-id.
+" call Decho("case a:0=1: a:1<".a:1."> (get host from input argument, not an url)",'~'.expand("<slnum>"))
+ if exists("g:netrw_machine")
+ if g:netrw_machine =~ '[0-9.]\+'
+ let host= g:netrw_machine
+ else
+ let host= substitute(g:netrw_machine,'\..*$','','')
+ endif
+ else
+ let g:netrw_machine= input('Enter hostname: ')
+ endif
+ let g:netrw_uid = a:1
+" call Decho("set g:netrw_uid= <".g:netrw_uid.">",'~'.expand("<slnum>"))
+ if exists("g:netrw_passwd")
+ " ask for password if one not previously entered
+ let s:netrw_passwd= g:netrw_passwd
+ else
+ let s:netrw_passwd = inputsecret("Enter Password: ")
+ endif
+ endif
+
+" call Decho("host<".host.">",'~'.expand("<slnum>"))
+ if exists("host")
+ if !exists('s:netrw_hup[host]')
+ let s:netrw_hup[host]= {}
+ endif
+ let s:netrw_hup[host].uid = g:netrw_uid
+ let s:netrw_hup[host].passwd = s:netrw_passwd
+ endif
+
+ elseif a:0 == 2
+ let g:netrw_uid = a:1
+ let s:netrw_passwd = a:2
+
+ elseif a:0 == 3
+ " enter hostname, user-id, and password into the hup dictionary
+ let host = substitute(a:1,'^\a\+:','','')
+ let host = substitute(host,'\..*$','','')
+ if !exists('s:netrw_hup[host]')
+ let s:netrw_hup[host]= {}
+ endif
+ let s:netrw_hup[host].uid = a:2
+ let s:netrw_hup[host].passwd = a:3
+ let g:netrw_uid = s:netrw_hup[host].uid
+ let s:netrw_passwd = s:netrw_hup[host].passwd
+" call Decho("set s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">",'~'.expand("<slnum>"))
+" call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">",'~'.expand("<slnum>"))
+ endif
+
+" call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">")
+endfun
+
+" =================================
+" Shared Browsing Support: {{{1
+" =================================
+
+" ---------------------------------------------------------------------
+" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
+fun! s:ExplorePatHls(pattern)
+" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
+ let repat= substitute(a:pattern,'^**/\{1,2}','','')
+" call Decho("repat<".repat.">",'~'.expand("<slnum>"))
+ let repat= escape(repat,'][.\')
+" call Decho("repat<".repat.">",'~'.expand("<slnum>"))
+ let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
+" call Dret("s:ExplorePatHls repat<".repat.">")
+ return repat
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBookHistHandler: {{{2
+" 0: (user: <mb>) bookmark current directory
+" 1: (user: <gb>) change to the bookmarked directory
+" 2: (user: <qb>) list bookmarks
+" 3: (browsing) records current directory history
+" 4: (user: <u>) go up (previous) directory, using history
+" 5: (user: <U>) go down (next) directory, using history
+" 6: (user: <mB>) delete bookmark
+fun! s:NetrwBookHistHandler(chg,curdir)
+" call Dfunc("s:NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhistcnt." histmax=".g:netrw_dirhistmax)
+ if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
+" " call Dret("s:NetrwBookHistHandler - suppressed due to g:netrw_dirhistmax")
+ return
+ endif
+
+ let ykeep = @@
+ let curbufnr = bufnr("%")
+
+ if a:chg == 0
+ " bookmark the current directory
+" call Decho("(user: <b>) bookmark the current directory",'~'.expand("<slnum>"))
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+ call s:NetrwBookmark(0)
+ echo "bookmarked marked files"
+ else
+ call s:MakeBookmark(a:curdir)
+ echo "bookmarked the current directory"
+ endif
+
+ elseif a:chg == 1
+ " change to the bookmarked directory
+" call Decho("(user: <".v:count."gb>) change to the bookmarked directory",'~'.expand("<slnum>"))
+ if exists("g:netrw_bookmarklist[v:count-1]")
+" call Decho("(user: <".v:count."gb>) bookmarklist=".string(g:netrw_bookmarklist),'~'.expand("<slnum>"))
+ exe "NetrwKeepj e ".fnameescape(g:netrw_bookmarklist[v:count-1])
+ else
+ echomsg "Sorry, bookmark#".v:count." doesn't exist!"
+ endif
+
+ elseif a:chg == 2
+" redraw!
+ let didwork= 0
+ " list user's bookmarks
+" call Decho("(user: <q>) list user's bookmarks",'~'.expand("<slnum>"))
+ if exists("g:netrw_bookmarklist")
+" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks','~'.expand("<slnum>"))
+ let cnt= 1
+ for bmd in g:netrw_bookmarklist
+" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1],'~'.expand("<slnum>"))
+ echo printf("Netrw Bookmark#%-2d: %s",cnt,g:netrw_bookmarklist[cnt-1])
+ let didwork = 1
+ let cnt = cnt + 1
+ endfor
+ endif
+
+ " list directory history
+ " Note: history is saved only when PerformListing is done;
+ " ie. when netrw can re-use a netrw buffer, the current directory is not saved in the history.
+ let cnt = g:netrw_dirhistcnt
+ let first = 1
+ let histcnt = 0
+ if g:netrw_dirhistmax > 0
+ while ( first || cnt != g:netrw_dirhistcnt )
+" call Decho("first=".first." cnt=".cnt." dirhistcnt=".g:netrw_dirhistcnt,'~'.expand("<slnum>"))
+ if exists("g:netrw_dirhist_{cnt}")
+" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt},'~'.expand("<slnum>"))
+ echo printf("Netrw History#%-2d: %s",histcnt,g:netrw_dirhist_{cnt})
+ let didwork= 1
+ endif
+ let histcnt = histcnt + 1
+ let first = 0
+ let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
+ if cnt < 0
+ let cnt= cnt + g:netrw_dirhistmax
+ endif
+ endwhile
+ else
+ let g:netrw_dirhistcnt= 0
+ endif
+ if didwork
+ call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ endif
+
+ elseif a:chg == 3
+ " saves most recently visited directories (when they differ)
+" call Decho("(browsing) record curdir history",'~'.expand("<slnum>"))
+ if !exists("g:netrw_dirhistcnt") || !exists("g:netrw_dirhist_{g:netrw_dirhistcnt}") || g:netrw_dirhist_{g:netrw_dirhistcnt} != a:curdir
+ if g:netrw_dirhistmax > 0
+ let g:netrw_dirhistcnt = ( g:netrw_dirhistcnt + 1 ) % g:netrw_dirhistmax
+ let g:netrw_dirhist_{g:netrw_dirhistcnt} = a:curdir
+ endif
+" call Decho("save dirhist#".g:netrw_dirhistcnt."<".g:netrw_dirhist_{g:netrw_dirhistcnt}.">",'~'.expand("<slnum>"))
+ endif
+
+ elseif a:chg == 4
+ " u: change to the previous directory stored on the history list
+" call Decho("(user: <u>) chg to prev dir from history",'~'.expand("<slnum>"))
+ if g:netrw_dirhistmax > 0
+ let g:netrw_dirhistcnt= ( g:netrw_dirhistcnt - v:count1 ) % g:netrw_dirhistmax
+ if g:netrw_dirhistcnt < 0
+ let g:netrw_dirhistcnt= g:netrw_dirhistcnt + g:netrw_dirhistmax
+ endif
+ else
+ let g:netrw_dirhistcnt= 0
+ endif
+ if exists("g:netrw_dirhist_{g:netrw_dirhistcnt}")
+" call Decho("changedir u#".g:netrw_dirhistcnt."<".g:netrw_dirhist_{g:netrw_dirhistcnt}.">",'~'.expand("<slnum>"))
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
+ setl ma noro
+" call Decho("setl ma noro",'~'.expand("<slnum>"))
+ sil! NetrwKeepj %d _
+ setl nomod
+" call Decho("setl nomod",'~'.expand("<slnum>"))
+" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ endif
+" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhistcnt}),'~'.expand("<slnum>"))
+ exe "NetrwKeepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhistcnt})
+ else
+ if g:netrw_dirhistmax > 0
+ let g:netrw_dirhistcnt= ( g:netrw_dirhistcnt + v:count1 ) % g:netrw_dirhistmax
+ else
+ let g:netrw_dirhistcnt= 0
+ endif
+ echo "Sorry, no predecessor directory exists yet"
+ endif
+
+ elseif a:chg == 5
+ " U: change to the subsequent directory stored on the history list
+" call Decho("(user: <U>) chg to next dir from history",'~'.expand("<slnum>"))
+ if g:netrw_dirhistmax > 0
+ let g:netrw_dirhistcnt= ( g:netrw_dirhistcnt + 1 ) % g:netrw_dirhistmax
+ if exists("g:netrw_dirhist_{g:netrw_dirhistcnt}")
+" call Decho("changedir U#".g:netrw_dirhistcnt."<".g:netrw_dirhist_{g:netrw_dirhistcnt}.">",'~'.expand("<slnum>"))
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
+" call Decho("setl ma noro",'~'.expand("<slnum>"))
+ setl ma noro
+ sil! NetrwKeepj %d _
+" call Decho("removed all lines from buffer (%d)",'~'.expand("<slnum>"))
+" call Decho("setl nomod",'~'.expand("<slnum>"))
+ setl nomod
+" call Decho("(set nomod) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ endif
+" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhistcnt}),'~'.expand("<slnum>"))
+ exe "NetrwKeepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhistcnt})
+ else
+ let g:netrw_dirhistcnt= ( g:netrw_dirhistcnt - 1 ) % g:netrw_dirhistmax
+ if g:netrw_dirhistcnt < 0
+ let g:netrw_dirhistcnt= g:netrw_dirhistcnt + g:netrw_dirhistmax
+ endif
+ echo "Sorry, no successor directory exists yet"
+ endif
+ else
+ let g:netrw_dirhistcnt= 0
+ echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")"
+ endif
+
+ elseif a:chg == 6
+" call Decho("(user: <mB>) delete bookmark'd directory",'~'.expand("<slnum>"))
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+ call s:NetrwBookmark(1)
+ echo "removed marked files from bookmarks"
+ else
+ " delete the v:count'th bookmark
+ let iremove = v:count
+ let dremove = g:netrw_bookmarklist[iremove - 1]
+" call Decho("delete bookmark#".iremove."<".g:netrw_bookmarklist[iremove - 1].">",'~'.expand("<slnum>"))
+ call s:MergeBookmarks()
+" call Decho("remove g:netrw_bookmarklist[".(iremove-1)."]<".g:netrw_bookmarklist[(iremove-1)].">",'~'.expand("<slnum>"))
+ NetrwKeepj call remove(g:netrw_bookmarklist,iremove-1)
+ echo "removed ".dremove." from g:netrw_bookmarklist"
+" call Decho("g:netrw_bookmarklist=".string(g:netrw_bookmarklist),'~'.expand("<slnum>"))
+ endif
+" call Decho("resulting g:netrw_bookmarklist=".string(g:netrw_bookmarklist),'~'.expand("<slnum>"))
+ endif
+ call s:NetrwBookmarkMenu()
+ call s:NetrwTgtMenu()
+ let @@= ykeep
+" call Dret("s:NetrwBookHistHandler")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBookHistRead: this function reads bookmarks and history {{{2
+" Will source the history file (.netrwhist) only if the g:netrw_disthistmax is > 0.
+" Sister function: s:NetrwBookHistSave()
+fun! s:NetrwBookHistRead()
+" call Dfunc("s:NetrwBookHistRead()")
+ if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
+" call Dret("s:NetrwBookHistRead - nothing read (suppressed due to dirhistmax=".(exists("g:netrw_dirhistmax")? g:netrw_dirhistmax : "n/a").")")
+ return
+ endif
+ let ykeep= @@
+
+ " read bookmarks
+ if !exists("s:netrw_initbookhist")
+ let home = s:NetrwHome()
+ let savefile= home."/.netrwbook"
+ if filereadable(s:NetrwFile(savefile))
+" call Decho("sourcing .netrwbook",'~'.expand("<slnum>"))
+ exe "keepalt NetrwKeepj so ".savefile
+ endif
+
+ " read history
+ if g:netrw_dirhistmax > 0
+ let savefile= home."/.netrwhist"
+ if filereadable(s:NetrwFile(savefile))
+" call Decho("sourcing .netrwhist",'~'.expand("<slnum>"))
+ exe "keepalt NetrwKeepj so ".savefile
+ endif
+ let s:netrw_initbookhist= 1
+ au VimLeave * call s:NetrwBookHistSave()
+ endif
+ endif
+
+ let @@= ykeep
+" call Decho("dirhistmax=".(exists("g:netrw_dirhistmax")? g:netrw_dirhistmax : "n/a"),'~'.expand("<slnum>"))
+" call Decho("dirhistcnt=".(exists("g:netrw_dirhistcnt")? g:netrw_dirhistcnt : "n/a"),'~'.expand("<slnum>"))
+" call Dret("s:NetrwBookHistRead")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBookHistSave: this function saves bookmarks and history to files {{{2
+" Sister function: s:NetrwBookHistRead()
+" I used to do this via viminfo but that appears to
+" be unreliable for long-term storage
+" If g:netrw_dirhistmax is <= 0, no history or bookmarks
+" will be saved.
+" (s:NetrwBookHistHandler(3,...) used to record history)
+fun! s:NetrwBookHistSave()
+" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax." dirhistcnt=".g:netrw_dirhistcnt)
+ if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0
+" call Dret("s:NetrwBookHistSave : nothing saved (dirhistmax=".g:netrw_dirhistmax.")")
+ return
+ endif
+
+ let savefile= s:NetrwHome()."/.netrwhist"
+" call Decho("savefile<".savefile.">",'~'.expand("<slnum>"))
+ 1split
+
+ " setting up a new buffer which will become .netrwhist
+ call s:NetrwEnew()
+" call Decho("case g:netrw_use_noswf=".g:netrw_use_noswf.(exists("+acd")? " +acd" : " -acd"),'~'.expand("<slnum>"))
+ if g:netrw_use_noswf
+ setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf
+ else
+ setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000
+ endif
+ setl nocin noai noci magic nospell nohid wig= noaw
+ setl ma noro write
+ if exists("+acd") | setl noacd | endif
+ sil! NetrwKeepj keepalt %d _
+
+ " rename enew'd file: .netrwhist -- no attempt to merge
+ " record dirhistmax and current dirhistcnt
+ " save history
+" call Decho("saving history: dirhistmax=".g:netrw_dirhistmax." dirhistcnt=".g:netrw_dirhistcnt." lastline=".line("$"),'~'.expand("<slnum>"))
+ sil! keepalt file .netrwhist
+ call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax)
+ call setline(2,"let g:netrw_dirhistcnt =".g:netrw_dirhistcnt)
+ if g:netrw_dirhistmax > 0
+ let lastline = line("$")
+ let cnt = g:netrw_dirhistcnt
+ let first = 1
+ while ( first || cnt != g:netrw_dirhistcnt )
+ let lastline= lastline + 1
+ if exists("g:netrw_dirhist_{cnt}")
+ call setline(lastline,'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'")
+" call Decho("..".lastline.'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'",'~'.expand("<slnum>"))
+ endif
+ let first = 0
+ let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
+ if cnt < 0
+ let cnt= cnt + g:netrw_dirhistmax
+ endif
+ endwhile
+ exe "sil! w! ".savefile
+" call Decho("exe sil! w! ".savefile,'~'.expand("<slnum>"))
+ endif
+
+ " save bookmarks
+ sil NetrwKeepj %d _
+ if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != []
+" call Decho("saving bookmarks",'~'.expand("<slnum>"))
+ " merge and write .netrwbook
+ let savefile= s:NetrwHome()."/.netrwbook"
+
+ if filereadable(s:NetrwFile(savefile))
+ let booklist= deepcopy(g:netrw_bookmarklist)
+ exe "sil NetrwKeepj keepalt so ".savefile
+ for bdm in booklist
+ if index(g:netrw_bookmarklist,bdm) == -1
+ call add(g:netrw_bookmarklist,bdm)
+ endif
+ endfor
+ call sort(g:netrw_bookmarklist)
+ endif
+
+ " construct and save .netrwbook
+ call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist))
+ exe "sil! w! ".savefile
+" call Decho("exe sil! w! ".savefile,'~'.expand("<slnum>"))
+ endif
+
+ " cleanup -- remove buffer used to construct history
+ let bgone= bufnr("%")
+ q!
+ exe "keepalt ".bgone."bwipe!"
+
+" call Dret("s:NetrwBookHistSave")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
+" list of the contents of a local or remote directory. It is assumed that the
+" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
+" with the requested remote hostname first.
+" Often called via: Explore/e dirname/etc -> netrw#LocalBrowseCheck() -> s:NetrwBrowse()
+fun! s:NetrwBrowse(islocal,dirname)
+ if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
+" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%")."> win#".winnr())
+" call Decho("fyi: modified=".&modified." modifiable=".&modifiable." readonly=".&readonly,'~'.expand("<slnum>"))
+" call Decho("fyi: tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
+" call Dredir("ls!","s:NetrwBrowse")
+
+ " save alternate-file's filename if w:netrw_rexlocal doesn't exist
+ " 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(),'~'.expand("<slnum>"))
+ endif
+
+ " s:NetrwBrowse : initialize history {{{3
+ if !exists("s:netrw_initbookhist")
+ NetrwKeepj call s:NetrwBookHistRead()
+ endif
+
+ " s:NetrwBrowse : simplify the dirname (especially for ".."s in dirnames) {{{3
+ if a:dirname !~ '^\a\{3,}://'
+ let dirname= simplify(a:dirname)
+" call Decho("simplified dirname<".dirname.">")
+ else
+ let dirname= a:dirname
+ endif
+
+ " repoint t:netrw_lexbufnr if appropriate
+ if exists("t:netrw_lexbufnr") && bufnr("%") == t:netrw_lexbufnr
+" call Decho("set repointlexbufnr to true!")
+ let repointlexbufnr= 1
+ endif
+
+ " s:NetrwBrowse : sanity checks: {{{3
+ if exists("s:netrw_skipbrowse")
+ unlet s:netrw_skipbrowse
+" 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:NetrwBrowse : s:netrw_skipbrowse existed")
+ return
+ endif
+ if !exists("*shellescape")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
+" call Dret("s:NetrwBrowse : missing shellescape()")
+ return
+ endif
+ if !exists("*fnameescape")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
+" call Dret("s:NetrwBrowse : missing fnameescape()")
+ return
+ endif
+
+ " s:NetrwBrowse : save options: {{{3
+ call s:NetrwOptionsSave("w:")
+
+ " s:NetrwBrowse : re-instate any marked files {{{3
+ if has("syntax") && exists("g:syntax_on") && g:syntax_on
+ if exists("s:netrwmarkfilelist_{bufnr('%')}")
+" call Decho("clearing marked files",'~'.expand("<slnum>"))
+ exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
+ endif
+ endif
+
+ if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
+ " s:NetrwBrowse : set up "safe" options for local directory/file {{{3
+" call Decho("handle w:netrw_acdkeep:",'~'.expand("<slnum>"))
+" call Decho("NetrwKeepj lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")",'~'.expand("<slnum>"))
+ if s:NetrwLcd(dirname)
+" call Dret("s:NetrwBrowse : lcd failure")
+ return
+ endif
+ " call s:NetrwOptionsSafe() " tst952 failed with this enabled.
+" call Decho("getcwd<".getcwd().">",'~'.expand("<slnum>"))
+
+ elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"'
+ " s:NetrwBrowse : remote regular file handler {{{3
+" call Decho("handle remote regular file: dirname<".dirname.">",'~'.expand("<slnum>"))
+ if bufname(dirname) != ""
+" call Decho("edit buf#".bufname(dirname)." in win#".winnr(),'~'.expand("<slnum>"))
+ exe "NetrwKeepj b ".bufname(dirname)
+ else
+ " attempt transfer of remote regular file
+" call Decho("attempt transfer as regular file<".dirname.">",'~'.expand("<slnum>"))
+
+ " remove any filetype indicator from end of dirname, except for the
+ " "this is a directory" indicator (/).
+ " There shouldn't be one of those here, anyway.
+ let path= substitute(dirname,'[*=@|]\r\=$','','e')
+" call Decho("new path<".path.">",'~'.expand("<slnum>"))
+ call s:RemotePathAnalysis(dirname)
+
+ " s:NetrwBrowse : remote-read the requested file into current buffer {{{3
+ call s:NetrwEnew(dirname)
+ call s:NetrwOptionsSafe(a:islocal)
+ setl ma noro
+" call Decho("setl ma noro",'~'.expand("<slnum>"))
+ let b:netrw_curdir = dirname
+ let url = s:method."://".((s:user == "")? "" : s:user."@").s:machine.(s:port ? ":".s:port : "")."/".s:path
+ call s:NetrwBufRename(url)
+ exe "sil! NetrwKeepj keepalt doau BufReadPre ".fnameescape(s:fname)
+ sil call netrw#NetRead(2,url)
+ " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error
+" call Decho("url<".url.">",'~'.expand("<slnum>"))
+" call Decho("s:path<".s:path.">",'~'.expand("<slnum>"))
+" call Decho("s:fname<".s:fname.">",'~'.expand("<slnum>"))
+ if s:path =~ '.bz2'
+ exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(substitute(s:fname,'\.bz2$','',''))
+ elseif s:path =~ '.gz'
+ exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(substitute(s:fname,'\.gz$','',''))
+ elseif s:path =~ '.gz'
+ exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(substitute(s:fname,'\.txz$','',''))
+ else
+ exe "sil NetrwKeepj keepalt doau BufReadPost ".fnameescape(s:fname)
+ endif
+ endif
+
+ " s:NetrwBrowse : save certain window-oriented variables into buffer-oriented variables {{{3
+ call s:SetBufWinVars()
+ call s:NetrwOptionsRestore("w:")
+" call Decho("setl ma nomod",'~'.expand("<slnum>"))
+ setl ma nomod noro
+" 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:NetrwBrowse : file<".s:fname.">")
+ return
+ endif
+
+ " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3
+ call s:UseBufWinVars()
+
+ " set up some variables {{{3
+ let b:netrw_browser_active = 1
+ let dirname = dirname
+ let s:last_sort_by = g:netrw_sort_by
+
+ " set up menu {{{3
+ NetrwKeepj call s:NetrwMenu(1)
+
+ " get/set-up buffer {{{3
+" call Decho("saving position across a buffer refresh",'~'.expand("<slnum>"))
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let reusing= s:NetrwGetBuffer(a:islocal,dirname)
+
+ " maintain markfile highlighting
+ if has("syntax") && exists("g:syntax_on") && g:syntax_on
+ if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
+" " call Decho("bufnr(%)=".bufnr('%'),'~'.expand("<slnum>"))
+" " call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/",'~'.expand("<slnum>"))
+ exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
+ else
+" " call Decho("2match none",'~'.expand("<slnum>"))
+ 2match none
+ endif
+ endif
+ if reusing && line("$") > 1
+ call s:NetrwOptionsRestore("w:")
+" call Decho("setl noma nomod nowrap",'~'.expand("<slnum>"))
+ setl noma nomod nowrap
+" call Decho("(set noma nomod nowrap) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+" call Dret("s:NetrwBrowse : re-using not-cleared buffer")
+ return
+ endif
+
+ " set b:netrw_curdir to the new directory name {{{3
+" call Decho("set b:netrw_curdir to the new directory name<".dirname."> (buf#".bufnr("%").")",'~'.expand("<slnum>"))
+ let b:netrw_curdir= dirname
+ if b:netrw_curdir =~ '[/\\]$'
+ let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e')
+ endif
+ if b:netrw_curdir =~ '\a:$' && (has("win32") || has("win95") || has("win64") || has("win16"))
+ let b:netrw_curdir= b:netrw_curdir."/"
+ endif
+ if b:netrw_curdir == ''
+ if has("amiga")
+ " On the Amiga, the empty string connotes the current directory
+ let b:netrw_curdir= getcwd()
+ else
+ " under unix, when the root directory is encountered, the result
+ " from the preceding substitute is an empty string.
+ let b:netrw_curdir= '/'
+ endif
+ endif
+ if !a:islocal && b:netrw_curdir !~ '/$'
+ let b:netrw_curdir= b:netrw_curdir.'/'
+ endif
+" call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
+
+ " ------------
+ " (local only) {{{3
+ " ------------
+ if a:islocal
+" call Decho("local only:",'~'.expand("<slnum>"))
+
+ " Set up ShellCmdPost handling. Append current buffer to browselist
+ call s:LocalFastBrowser()
+
+ " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
+ if !g:netrw_keepdir
+" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd,'~'.expand("<slnum>"))
+" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"),'~'.expand("<slnum>"))
+ if !exists("&l:acd") || !&l:acd
+ if s:NetrwLcd(b:netrw_curdir)
+" call Dret("s:NetrwBrowse : lcd failure")
+ return
+ endif
+ endif
+ endif
+
+ " --------------------------------
+ " remote handling: {{{3
+ " --------------------------------
+ else
+" call Decho("remote only:",'~'.expand("<slnum>"))
+
+ " 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\>"
+ 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")
+ let dirname= substitute(b:netrw_curdir,'\\','/','g')
+ if dirname !~ '/$'
+ let dirname= dirname.'/'
+ endif
+ let b:netrw_curdir = dirname
+" call Decho("(liststyle is TREELIST) dirname<".dirname.">",'~'.expand("<slnum>"))
+ else
+ let dirname = substitute(dirname,'\\','/','g')
+" call Decho("(normal) dirname<".dirname.">",'~'.expand("<slnum>"))
+ endif
+
+ let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$'
+ if dirname !~ dirpat
+ if !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
+ endif
+ NetrwKeepj call s:NetrwOptionsRestore("w:")
+" call Decho("setl noma nomod nowrap",'~'.expand("<slnum>"))
+ setl noma nomod nowrap
+" 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:NetrwBrowse : badly formatted dirname<".dirname.">")
+ return
+ endif
+ let b:netrw_curdir= dirname
+" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)",'~'.expand("<slnum>"))
+ endif " (additional remote handling)
+
+ " -------------------------------
+ " Perform Directory Listing: {{{3
+ " -------------------------------
+ NetrwKeepj call s:NetrwMaps(a:islocal)
+ NetrwKeepj call s:NetrwCommands(a:islocal)
+ NetrwKeepj call s:PerformListing(a:islocal)
+
+ " restore option(s)
+ call s:NetrwOptionsRestore("w:")
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
+
+ " If there is a rexposn: restore position with rexposn
+ " Otherwise : set rexposn
+ if exists("s:rexposn_".bufnr("%"))
+" call Decho("restoring posn to s:rexposn_".bufnr('%')."<".string(s:rexposn_{bufnr('%')}).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(s:rexposn_{bufnr('%')})
+ if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
+ NetrwKeepj exe w:netrw_bannercnt
+ endif
+ else
+ NetrwKeepj call s:SetRexDir(a:islocal,b:netrw_curdir)
+ endif
+ if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval")
+ let &l:bexpr= "netrw#BalloonHelp()"
+" call Decho("set up balloon help: l:bexpr=".&l:bexpr,'~'.expand("<slnum>"))
+ setl beval
+ endif
+
+ " repoint t:netrw_lexbufnr if appropriate
+ if exists("repointlexbufnr")
+ let t:netrw_lexbufnr= bufnr("%")
+" call Decho("repoint t:netrw_lexbufnr to #".t:netrw_lexbufnr)
+ endif
+
+ " restore position
+ if reusing
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call winrestview(svpos)
+ endif
+
+ " The s:LocalBrowseRefresh() function is called by an autocmd
+ " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow or medium speed).
+ " However, s:NetrwBrowse() causes the FocusGained event to fire the first time.
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.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:NetrwBrowse : did PerformListing ft<".&ft.">")
+ return
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwFile: because of g:netrw_keepdir, isdirectory(), type(), etc may or {{{2
+" may not apply correctly; ie. netrw's idea of the current directory may
+" differ from vim's. This function insures that netrw's idea of the current
+" directory is used.
+" Returns a path to the file specified by a:fname
+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'),'~'.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.">",'~'.expand("<slnum>"))
+ else
+ let fname= a:fname
+ endif
+
+ if g:netrw_keepdir
+ " vim's idea of the current directory possibly may differ from netrw's
+ if !exists("b:netrw_curdir")
+ let b:netrw_curdir= getcwd()
+ endif
+
+ if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16"))
+ if fname =~ '^\' || fname =~ '^\a:\'
+ " windows, but full path given
+ let ret= fname
+" "" call Decho("windows+full path: isdirectory(".fname.")",'~'.expand("<slnum>"))
+ else
+ " windows, relative path given
+ let ret= s:ComposePath(b:netrw_curdir,fname)
+" "" call Decho("windows+rltv path: isdirectory(".fname.")",'~'.expand("<slnum>"))
+ endif
+
+ elseif fname =~ '^/'
+ " not windows, full path given
+ let ret= fname
+" "" call Decho("unix+full path: isdirectory(".fname.")",'~'.expand("<slnum>"))
+ else
+ " not windows, relative path given
+ let ret= s:ComposePath(b:netrw_curdir,fname)
+" "" call Decho("unix+rltv path: isdirectory(".fname.")",'~'.expand("<slnum>"))
+ endif
+ else
+ " 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)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwFileInfo: supports qf (query for file information) {{{2
+fun! s:NetrwFileInfo(islocal,fname)
+" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">) b:netrw_curdir<".b:netrw_curdir.">")
+ let ykeep= @@
+ if a:islocal
+ let lsopt= "-lsad"
+ if g:netrw_sizestyle =~# 'H'
+ let lsopt= "-lsadh"
+ elseif g:netrw_sizestyle =~# 'h'
+ let lsopt= "-lsadh --si"
+ endif
+" call Decho("(s:NetrwFileInfo) lsopt<".lsopt.">")
+ if (has("unix") || has("macunix")) && executable("/bin/ls")
+
+ if getline(".") == "../"
+ echo system("/bin/ls ".lsopt." ".s:ShellEscape(".."))
+" call Decho("#1: echo system(/bin/ls -lsad ".s:ShellEscape(..).")",'~'.expand("<slnum>"))
+
+ elseif w:netrw_liststyle == s:TREELIST && getline(".") !~ '^'.s:treedepthstring
+ echo system("/bin/ls ".lsopt." ".s:ShellEscape(b:netrw_curdir))
+" call Decho("#2: echo system(/bin/ls -lsad ".s:ShellEscape(b:netrw_curdir).")",'~'.expand("<slnum>"))
+
+ elseif exists("b:netrw_curdir")
+ echo system("/bin/ls ".lsopt." ".s:ShellEscape(s:ComposePath(b:netrw_curdir,a:fname)))
+" call Decho("#3: echo system(/bin/ls -lsad ".s:ShellEscape(b:netrw_curdir.a:fname).")",'~'.expand("<slnum>"))
+
+ else
+" call Decho('using ls '.a:fname." using cwd<".getcwd().">",'~'.expand("<slnum>"))
+ echo system("/bin/ls ".lsopt." ".s:ShellEscape(s:NetrwFile(a:fname)))
+" call Decho("#5: echo system(/bin/ls -lsad ".s:ShellEscape(a:fname).")",'~'.expand("<slnum>"))
+ endif
+ else
+ " use vim functions to return information about file below cursor
+" call Decho("using vim functions to query for file info",'~'.expand("<slnum>"))
+ if !isdirectory(s:NetrwFile(a:fname)) && !filereadable(s:NetrwFile(a:fname)) && a:fname =~ '[*@/]'
+ let fname= substitute(a:fname,".$","","")
+ else
+ let fname= a:fname
+ endif
+ let t = getftime(s:NetrwFile(fname))
+ let sz = getfsize(s:NetrwFile(fname))
+ if g:netrw_sizestyle =~# "[hH]"
+ let sz= s:NetrwHumanReadable(sz)
+ endif
+ echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(s:NetrwFile(fname)))
+" call Decho("fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)),'~'.expand("<slnum>"))
+ endif
+ else
+ echo "sorry, \"qf\" not supported yet for remote files"
+ endif
+ let @@= ykeep
+" call Dret("s:NetrwFileInfo")
+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: [get a new|find an old netrw] buffer for a netrw listing {{{2
+" returns 0=cleared buffer
+" 1=re-used buffer (buffer not cleared)
+" Nov 09, 2020: tst952 shows that when user does :set hidden that NetrwGetBuffer will come up with a [No Name] buffer (hid fix)
+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." hid=".&hid,'~'.expand("<slnum>"))
+" call Decho("netrwbuf dictionary=".(exists("s:netrwbuf")? string(s:netrwbuf) : 'n/a'),'~'.expand("<slnum>"))
+" call Dredir("ls!","s:NetrwGetBuffer")
+ let dirname= a:dirname
+
+ " re-use buffer if possible {{{3
+" call Decho("--re-use a buffer if possible--",'~'.expand("<slnum>"))
+ if !exists("s:netrwbuf")
+" call Decho(" s:netrwbuf initialized to {}",'~'.expand("<slnum>"))
+ let s:netrwbuf= {}
+ endif
+" call Decho(" s:netrwbuf =".string(s:netrwbuf),'~'.expand("<slnum>"))
+" call Decho(" w:netrw_liststyle =".(exists("w:netrw_liststyle")? w:netrw_liststyle : "n/a"),'~'.expand("<slnum>"))
+
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+ let bufnum = -1
+
+ if !empty(s:netrwbuf) && has_key(s:netrwbuf,s:NetrwFullPath(dirname))
+ if has_key(s:netrwbuf,"NetrwTreeListing")
+ let bufnum= s:netrwbuf["NetrwTreeListing"]
+ else
+ let bufnum= s:netrwbuf[s:NetrwFullPath(dirname)]
+ endif
+" call Decho(" NetrwTreeListing: bufnum#".bufnum,'~'.expand("<slnum>"))
+ if !bufexists(bufnum)
+ call remove(s:netrwbuf,"NetrwTreeListing"])
+ let bufnum= -1
+ endif
+ elseif bufnr("NetrwTreeListing") != -1
+ let bufnum= bufnr("NetrwTreeListing")
+" call Decho(" NetrwTreeListing".": bufnum#".bufnum,'~'.expand("<slnum>"))
+ else
+" call Decho(" did not find a NetrwTreeListing buffer",'~'.expand("<slnum>"))
+ let bufnum= -1
+ endif
+
+ elseif 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,'~'.expand("<slnum>"))
+ if !bufexists(bufnum)
+ call remove(s:netrwbuf,s:NetrwFullPath(dirname))
+ let bufnum= -1
+ endif
+
+ else
+" call Decho(" lookup netrwbuf dictionary: s:netrwbuf[".s:NetrwFullPath(dirname)."] not a key",'~'.expand("<slnum>"))
+ let bufnum= -1
+ endif
+" call Decho(" bufnum#".bufnum,'~'.expand("<slnum>"))
+
+ " hijack the current buffer
+ " IF the buffer already has the desired name
+ " AND it is empty
+ let curbuf = bufname("%")
+ if curbuf == '.'
+ let curbuf = getcwd()
+ endif
+" call Dredir("ls!","NetrwGetFile (renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">)")
+" call Decho("deciding if netrw may hijack the current buffer#".bufnr("%")."<".curbuf.">",'~'.expand("<slnum>"))
+" call Decho("..dirname<".dirname."> IF dirname == bufname",'~'.expand("<slnum>"))
+" call Decho("..curbuf<".curbuf.">",'~'.expand("<slnum>"))
+" call Decho("..line($)=".line("$")." AND this is 1",'~'.expand("<slnum>"))
+" call Decho("..getline(%)<".getline("%")."> AND this line is empty",'~'.expand("<slnum>"))
+ if dirname == curbuf && line("$") == 1 && getline("%") == ""
+" call Dret("s:NetrwGetBuffer 0<cleared buffer> : highjacking buffer#".bufnr("%"))
+ return 0
+ else " DEBUG
+" call Decho("..did NOT hijack buffer",'~'.expand("<slnum>"))
+ endif
+ " Aug 14, 2021: was thinking about looking for a [No Name] buffer here and using it, but that might cause problems
+
+ " get enew buffer and name it -or- re-use buffer {{{3
+ 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>"))
+ " name the buffer
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+ " Got enew buffer; transform into a NetrwTreeListing
+" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --",'~'.expand("<slnum>"))
+ let w:netrw_treebufnr = bufnr("%")
+ call s:NetrwBufRename("NetrwTreeListing")
+ if g:netrw_use_noswf
+ setl nobl bt=nofile noswf
+ else
+ setl nobl bt=nofile
+ endif
+ nnoremap <silent> <buffer> [[ :sil call <SID>TreeListMove('[[')<cr>
+ nnoremap <silent> <buffer> ]] :sil call <SID>TreeListMove(']]')<cr>
+ nnoremap <silent> <buffer> [] :sil call <SID>TreeListMove('[]')<cr>
+ nnoremap <silent> <buffer> ][ :sil call <SID>TreeListMove('][')<cr>
+" call Decho(" tree listing bufnr=".w:netrw_treebufnr,'~'.expand("<slnum>"))
+ else
+ call s:NetrwBufRename(dirname)
+ " 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>"))
+
+ else " Re-use the buffer
+" 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'
+" call Decho(" getline(2)<".getline(2).'> matches "Netrw Directory Listing" : using keepalt b '.bufnum,'~'.expand("<slnum>"))
+ exe "sil! NetrwKeepj noswapfile keepalt b ".bufnum
+ else
+" call Decho(" getline(2)<".getline(2).'> does not match "Netrw Directory Listing" : using b '.bufnum,'~'.expand("<slnum>"))
+ exe "sil! NetrwKeepj noswapfile keepalt b ".bufnum
+ endif
+" call Decho(" line($)=".line("$"),'~'.expand("<slnum>"))
+ if bufname("%") == '.'
+ call s:NetrwBufRename(getcwd())
+ endif
+ let &ei= eikeep
+
+ if line("$") <= 1 && getline(1) == ""
+ " empty buffer
+ NetrwKeepj call s:NetrwListSettings(a:islocal)
+" 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 empty> : re-using buffer#".bufnr("%").", but its empty, so refresh it")
+ return 0
+
+ elseif g:netrw_fastbrowse == 0 || (a:islocal && g:netrw_fastbrowse == 1)
+" call Decho("g:netrw_fastbrowse=".g:netrw_fastbrowse." a:islocal=".a:islocal.": clear buffer",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwListSettings(a:islocal)
+ 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<cleared buffer> : re-using buffer#".bufnr("%").", but refreshing due to g:netrw_fastbrowse=".g:netrw_fastbrowse)
+ return 0
+
+ elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+" call Decho("--re-use tree listing--",'~'.expand("<slnum>"))
+" call Decho(" clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
+ setl ma
+ sil NetrwKeepj %d _
+ NetrwKeepj call s:NetrwListSettings(a:islocal)
+" 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<cleared buffer> : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
+ return 0
+
+ else
+" 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 1<buffer not cleared>")
+ return 1
+ endif
+ endif
+
+ " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3
+ " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast)
+ " slow 0 D D Deleting a buffer implies it will not be re-used (slow)
+ " med 1 D H
+ " fast 2 H H
+" call Decho("--do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--",'~'.expand("<slnum>"))
+ let fname= expand("%")
+ NetrwKeepj call s:NetrwListSettings(a:islocal)
+ call s:NetrwBufRename(fname)
+
+ " delete all lines from buffer {{{3
+" call Decho("--delete all lines from buffer--",'~'.expand("<slnum>"))
+" call Decho(" clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
+ sil! keepalt 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<cleared buffer>")
+ return 0
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwGetcwd: get the current directory. {{{2
+" Change backslashes to forward slashes, if any.
+" If doesc is true, escape certain troublesome characters
+fun! s:NetrwGetcwd(doesc)
+" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
+ let curdir= substitute(getcwd(),'\\','/','ge')
+ if curdir !~ '[\/]$'
+ let curdir= curdir.'/'
+ endif
+ if a:doesc
+ let curdir= fnameescape(curdir)
+ endif
+" call Dret("NetrwGetcwd <".curdir.">")
+ return curdir
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
+fun! s:NetrwGetWord()
+" call Dfunc("s:NetrwGetWord() liststyle=".s:ShowStyle()." virtcol=".virtcol("."))
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
+ let keepsol= &l:sol
+ setl nosol
+
+ call s:UseBufWinVars()
+
+ " insure that w:netrw_liststyle is set up
+ if !exists("w:netrw_liststyle")
+ if exists("g:netrw_liststyle")
+ let w:netrw_liststyle= g:netrw_liststyle
+ else
+ let w:netrw_liststyle= s:THINLIST
+ endif
+" call Decho("w:netrw_liststyle=".w:netrw_liststyle,'~'.expand("<slnum>"))
+ endif
+
+ if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt
+ " Active Banner support
+" call Decho("active banner handling",'~'.expand("<slnum>"))
+ NetrwKeepj norm! 0
+ let dirname= "./"
+ let curline= getline('.')
+
+ if curline =~# '"\s*Sorted by\s'
+ NetrwKeepj norm! "_s
+ let s:netrw_skipbrowse= 1
+ echo 'Pressing "s" also works'
+
+ elseif curline =~# '"\s*Sort sequence:'
+ let s:netrw_skipbrowse= 1
+ echo 'Press "S" to edit sorting sequence'
+
+ elseif curline =~# '"\s*Quick Help:'
+ NetrwKeepj norm! ?
+ let s:netrw_skipbrowse= 1
+
+ elseif curline =~# '"\s*\%(Hiding\|Showing\):'
+ NetrwKeepj norm! a
+ let s:netrw_skipbrowse= 1
+ echo 'Pressing "a" also works'
+
+ elseif line("$") > w:netrw_bannercnt
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt
+ endif
+
+ elseif w:netrw_liststyle == s:THINLIST
+" call Decho("thin column handling",'~'.expand("<slnum>"))
+ NetrwKeepj norm! 0
+ let dirname= substitute(getline('.'),'\t -->.*$','','')
+
+ elseif w:netrw_liststyle == s:LONGLIST
+" call Decho("long column handling",'~'.expand("<slnum>"))
+ NetrwKeepj norm! 0
+ let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
+
+ elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+" call Decho("treelist handling",'~'.expand("<slnum>"))
+ let dirname= substitute(getline('.'),'^\('.s:treedepthstring.'\)*','','e')
+ let dirname= substitute(dirname,'\t -->.*$','','')
+
+ else
+" call Decho("obtain word from wide listing",'~'.expand("<slnum>"))
+ let dirname= getline('.')
+
+ if !exists("b:netrw_cpf")
+ let b:netrw_cpf= 0
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
+ call histdel("/",-1)
+" "call Decho("computed cpf=".b:netrw_cpf,'~'.expand("<slnum>"))
+ endif
+
+" call Decho("buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
+ let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
+" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
+" call Decho("1: dirname<".dirname.">",'~'.expand("<slnum>"))
+ if filestart == 0
+ NetrwKeepj norm! 0ma
+ else
+ call cursor(line("."),filestart+1)
+ NetrwKeepj norm! ma
+ endif
+ let rega= @a
+ let eofname= filestart + b:netrw_cpf + 1
+ if eofname <= col("$")
+ call cursor(line("."),filestart+b:netrw_cpf+1)
+ NetrwKeepj norm! "ay`a
+ else
+ NetrwKeepj norm! "ay$
+ endif
+ let dirname = @a
+ let @a = rega
+" call Decho("2: dirname<".dirname.">",'~'.expand("<slnum>"))
+ let dirname= substitute(dirname,'\s\+$','','e')
+" call Decho("3: dirname<".dirname.">",'~'.expand("<slnum>"))
+ endif
+
+ " symlinks are indicated by a trailing "@". Remove it before further processing.
+ let dirname= substitute(dirname,"@$","","")
+
+ " executables are indicated by a trailing "*". Remove it before further processing.
+ let dirname= substitute(dirname,"\*$","","")
+
+ let &l:sol= keepsol
+
+" call Dret("s:NetrwGetWord <".dirname.">")
+ return dirname
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwListSettings: make standard settings for making a netrw listing {{{2
+" g:netrw_bufsettings will be used after the listing is produced.
+" Called by s:NetrwGetBuffer()
+fun! s:NetrwListSettings(islocal)
+" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
+" 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>"))
+ let fname= bufname("%")
+" " call Decho("setl bt=nofile nobl ma nonu nowrap noro nornu",'~'.expand("<slnum>"))
+ " nobl noma nomod nonu noma nowrap ro nornu (std g:netrw_bufsettings)
+ setl bt=nofile nobl ma nonu nowrap noro nornu
+ call s:NetrwBufRename(fname)
+ if g:netrw_use_noswf
+ setl noswf
+ endif
+" call Dredir("ls!","s:NetrwListSettings")
+" call Decho("exe setl ts=".(g:netrw_maxfilenamelen+1),'~'.expand("<slnum>"))
+ exe "setl ts=".(g:netrw_maxfilenamelen+1)
+ setl isk+=.,~,-
+ if g:netrw_fastbrowse > a:islocal
+ setl bh=hide
+ else
+ setl bh=delete
+ endif
+" 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 Dret("s:NetrwListSettings")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwListStyle: change list style (thin - long - wide - tree) {{{2
+" islocal=0: remote browsing
+" =1: local browsing
+fun! s:NetrwListStyle(islocal)
+" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
+
+ let ykeep = @@
+ let fname = s:NetrwGetWord()
+ if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
+" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
+" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle,'~'.expand("<slnum>"))
+" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">",'~'.expand("<slnum>"))
+
+ " repoint t:netrw_lexbufnr if appropriate
+ if exists("t:netrw_lexbufnr") && bufnr("%") == t:netrw_lexbufnr
+" call Decho("set repointlexbufnr to true!")
+ let repointlexbufnr= 1
+ endif
+
+ if w:netrw_liststyle == s:THINLIST
+ " use one column listing
+" call Decho("use one column list",'~'.expand("<slnum>"))
+ let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
+
+ elseif w:netrw_liststyle == s:LONGLIST
+ " use long list
+" call Decho("use long list",'~'.expand("<slnum>"))
+ let g:netrw_list_cmd = g:netrw_list_cmd." -l"
+
+ elseif w:netrw_liststyle == s:WIDELIST
+ " give wide list
+" call Decho("use wide list",'~'.expand("<slnum>"))
+ let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
+
+ elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+" call Decho("use tree list",'~'.expand("<slnum>"))
+ let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
+
+ else
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
+ let g:netrw_liststyle = s:THINLIST
+ let w:netrw_liststyle = g:netrw_liststyle
+ let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
+ endif
+ setl ma noro
+" call Decho("setl ma noro",'~'.expand("<slnum>"))
+
+ " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
+" call Decho("clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
+ sil! NetrwKeepj %d _
+ " following prevents tree listing buffer from being marked "modified"
+" call Decho("setl nomod",'~'.expand("<slnum>"))
+ setl nomod
+" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+
+ " refresh the listing
+" call Decho("refresh the listing",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+ NetrwKeepj call s:NetrwCursor(0)
+
+ " repoint t:netrw_lexbufnr if appropriate
+ if exists("repointlexbufnr")
+ let t:netrw_lexbufnr= bufnr("%")
+" call Decho("repoint t:netrw_lexbufnr to #".t:netrw_lexbufnr)
+ endif
+
+ " restore position; keep cursor on the filename
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ let @@= ykeep
+
+" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBannerCtrl: toggles the display of the banner {{{2
+fun! s:NetrwBannerCtrl(islocal)
+" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner)
+
+ let ykeep= @@
+ " toggle the banner (enable/suppress)
+ let g:netrw_banner= !g:netrw_banner
+
+ " refresh the listing
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+
+ " keep cursor on the filename
+ if g:netrw_banner && exists("w:netrw_bannercnt") && line(".") >= w:netrw_bannercnt
+ let fname= s:NetrwGetWord()
+ sil NetrwKeepj $
+ let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
+" " call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'),'~'.expand("<slnum>"))
+ if result <= 0 && exists("w:netrw_bannercnt")
+ exe "NetrwKeepj ".w:netrw_bannercnt
+ endif
+ endif
+ let @@= ykeep
+" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner)
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBookmark: supports :NetrwMB[!] [file]s {{{2
+"
+" No bang: enters files/directories into Netrw's bookmark system
+" No argument and in netrw buffer:
+" if there are marked files: bookmark marked files
+" otherwise : bookmark file/directory under cursor
+" No argument and not in netrw buffer: bookmarks current open file
+" Has arguments: globs them individually and bookmarks them
+"
+" With bang: deletes files/directories from Netrw's bookmark system
+fun! s:NetrwBookmark(del,...)
+" call Dfunc("s:NetrwBookmark(del=".a:del.",...) a:0=".a:0)
+ if a:0 == 0
+ if &ft == "netrw"
+ let curbufnr = bufnr("%")
+
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+ " for every filename in the marked list
+" call Decho("bookmark every filename in marked list",'~'.expand("<slnum>"))
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let islocal= expand("%") !~ '^\a\{3,}://'
+ for fname in s:netrwmarkfilelist_{curbufnr}
+ if a:del|call s:DeleteBookmark(fname)|else|call s:MakeBookmark(fname)|endif
+ endfor
+ let curdir = exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
+ call s:NetrwUnmarkList(curbufnr,curdir)
+ NetrwKeepj call s:NetrwRefresh(islocal,s:NetrwBrowseChgDir(islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ else
+ let fname= s:NetrwGetWord()
+ if a:del|call s:DeleteBookmark(fname)|else|call s:MakeBookmark(fname)|endif
+ endif
+
+ else
+ " bookmark currently open file
+" call Decho("bookmark currently open file",'~'.expand("<slnum>"))
+ let fname= expand("%")
+ if a:del|call s:DeleteBookmark(fname)|else|call s:MakeBookmark(fname)|endif
+ endif
+
+ else
+ " bookmark specified files
+ " attempts to infer if working remote or local
+ " by deciding if the current file begins with an url
+ " Globbing cannot be done remotely.
+ let islocal= expand("%") !~ '^\a\{3,}://'
+" call Decho("bookmark specified file".((a:0>1)? "s" : ""),'~'.expand("<slnum>"))
+ let i = 1
+ while i <= a:0
+ if islocal
+ if v:version > 704 || (v:version == 704 && has("patch656"))
+ let mbfiles= glob(fnameescape(a:{i}),0,1,1)
+ else
+ let mbfiles= glob(fnameescape(a:{i}),0,1)
+ endif
+ else
+ let mbfiles= [a:{i}]
+ endif
+" call Decho("mbfiles".string(mbfiles),'~'.expand("<slnum>"))
+ for mbfile in mbfiles
+" call Decho("mbfile<".mbfile.">",'~'.expand("<slnum>"))
+ if a:del|call s:DeleteBookmark(mbfile)|else|call s:MakeBookmark(mbfile)|endif
+ endfor
+ let i= i + 1
+ endwhile
+ endif
+
+ " update the menu
+ call s:NetrwBookmarkMenu()
+
+" call Dret("s:NetrwBookmark")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBookmarkMenu: Uses menu priorities {{{2
+" .2.[cnt] for bookmarks, and
+" .3.[cnt] for history
+" (see s:NetrwMenu())
+fun! s:NetrwBookmarkMenu()
+ if !exists("s:netrw_menucnt")
+ return
+ endif
+" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhistcnt." menucnt=".s:netrw_menucnt)
+
+ " the following test assures that gvim is running, has menus available, and has menus enabled.
+ if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
+ if exists("g:NetrwTopLvlMenu")
+" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)",'~'.expand("<slnum>"))
+ exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
+ exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete'
+ endif
+ if !exists("s:netrw_initbookhist")
+ call s:NetrwBookHistRead()
+ endif
+
+ " show bookmarked places
+ if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
+ let cnt= 1
+ for bmd in g:netrw_bookmarklist
+" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd,'~'.expand("<slnum>"))
+ let bmd= escape(bmd,g:netrw_menu_escape)
+
+ " show bookmarks for goto menu
+ exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\<cr>"
+
+ " show bookmarks for deletion menu
+ exe 'sil! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.bmd.' '.cnt."mB"
+ let cnt= cnt + 1
+ endfor
+
+ endif
+
+ " show directory browsing history
+ if g:netrw_dirhistmax > 0
+ let cnt = g:netrw_dirhistcnt
+ let first = 1
+ let histcnt = 0
+ while ( first || cnt != g:netrw_dirhistcnt )
+ let histcnt = histcnt + 1
+ let priority = g:netrw_dirhistcnt + histcnt
+ if exists("g:netrw_dirhist_{cnt}")
+ let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape)
+" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir,'~'.expand("<slnum>"))
+ exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\<cr>"
+ endif
+ let first = 0
+ let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
+ if cnt < 0
+ let cnt= cnt + g:netrw_dirhistmax
+ endif
+ endwhile
+ endif
+
+ endif
+" call Dret("NetrwBookmarkMenu")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2
+" directory and a new directory name. Also, if the
+" "new directory name" is actually a file,
+" NetrwBrowseChgDir() edits the file.
+fun! s:NetrwBrowseChgDir(islocal,newdir,...)
+" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." win#".winnr()." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">")
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
+
+ let ykeep= @@
+ if !exists("b:netrw_curdir")
+ " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
+ " and the current window is the NetrwMessage window.
+ let @@= ykeep
+" call Decho("b:netrw_curdir doesn't exist!",'~'.expand("<slnum>"))
+" call Decho("getcwd<".getcwd().">",'~'.expand("<slnum>"))
+" call Dredir("ls!","s:NetrwBrowseChgDir")
+" 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_posn)
+ NetrwKeepj call s:NetrwOptionsSave("s:")
+ NetrwKeepj call s:NetrwOptionsSafe(a:islocal)
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+ let dirname = substitute(b:netrw_curdir,'\\','/','ge')
+ else
+ let dirname = b:netrw_curdir
+ endif
+ let newdir = a:newdir
+ let dolockout = 0
+ let dorestore = 1
+" call Decho("win#".winnr(),'~'.expand("<slnum>"))
+" call Decho("dirname<".dirname.">",'~'.expand("<slnum>"))
+" call Decho("newdir<".newdir.">",'~'.expand("<slnum>"))
+
+ " ignore <cr>s when done in the banner
+" call Decho('(s:NetrwBrowseChgDir) ignore [return]s when done in banner (g:netrw_banner='.g:netrw_banner.")",'~'.expand("<slnum>"))
+ if g:netrw_banner
+" call Decho("win#".winnr()." 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'
+" 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
+ NetrwKeepj call s:NetrwOptionsRestore("s:")
+" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ endif
+ endif
+" else " Decho
+" call Decho("g:netrw_banner=".g:netrw_banner." (no banner)",'~'.expand("<slnum>"))
+ endif
+
+ " set up o/s-dependent directory recognition pattern
+ if has("amiga")
+ let dirpat= '[\/:]$'
+ else
+ let dirpat= '[\/]$'
+ endif
+" call Decho("set up o/s-dependent directory recognition pattern: dirname<".dirname."> dirpat<".dirpat.">",'~'.expand("<slnum>"))
+
+ if dirname !~ dirpat
+ " apparently vim is "recognizing" that it is in a directory and
+ " is removing the trailing "/". Bad idea, so let's put it back.
+ let dirname= dirname.'/'
+" 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>"))
+ if newdir !~ dirpat && !(a:islocal && isdirectory(s:NetrwFile(s:ComposePath(dirname,newdir))))
+ " ------------------------------
+ " NetrwBrowseChgDir: edit a file {{{3
+ " ------------------------------
+" call Decho('edit-a-file: case "handling a file": win#'.winnr().' newdir<'.newdir.'> !~ dirpat<'.dirpat.">",'~'.expand("<slnum>"))
+
+ " save position for benefit of Rexplore
+ let s:rexposn_{bufnr("%")}= winsaveview()
+" call Decho("edit-a-file: saving posn to s:rexposn_".bufnr("%")."<".string(s:rexposn_{bufnr("%")}).">",'~'.expand("<slnum>"))
+" call Decho("edit-a-file: win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> ft=".&ft,'~'.expand("<slnum>"))
+" call Decho("edit-a-file: w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a')." w:netrw_treedict:".(exists("w:netrw_treedict")? "exists" : 'n/a')." newdir<".newdir.">",'~'.expand("<slnum>"))
+
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
+" call Decho("edit-a-file: handle tree listing: w:netrw_treedict<".(exists("w:netrw_treedict")? string(w:netrw_treedict) : 'n/a').">",'~'.expand("<slnum>"))
+" call Decho("edit-a-file: newdir<".newdir.">",'~'.expand("<slnum>"))
+" let newdir = s:NetrwTreePath(s:netrw_treetop)
+" call Decho("edit-a-file: COMBAK why doesn't this recognize file1's directory???")
+ let dirname= s:NetrwTreeDir(a:islocal)
+ "COMBAK : not working for a symlink -- but what about a regular file? a directory?
+" call Decho("COMBAK : not working for a symlink -- but what about a regular file? a directory?")
+ " Feb 17, 2019: following if-else-endif restored -- wasn't editing a file in tree mode
+ if dirname =~ '/$'
+ let dirname= dirname.newdir
+ else
+ let dirname= dirname."/".newdir
+ endif
+" 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.">",'~'.expand("<slnum>"))
+ let dirname= newdir
+ else
+ let dirname= s:ComposePath(dirname,newdir)
+ endif
+" call Decho("edit-a-file: handling a file: dirname<".dirname."> (a:0=".a:0.")",'~'.expand("<slnum>"))
+ " this lets netrw#BrowseX avoid the edit
+ if a:0 < 1
+" call Decho("edit-a-file: (a:0=".a:0."<1) set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"),'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwOptionsRestore("s:")
+ let curdir= b:netrw_curdir
+ if !exists("s:didsplit")
+" " call Decho("edit-a-file: s:didsplit does not exist; g:netrw_browse_split=".string(g:netrw_browse_split)." win#".winnr()." g:netrw_chgwin=".g:netrw_chgwin",'~'.expand("<slnum>"))
+ if type(g:netrw_browse_split) == 3
+ " open file in server
+ " Note that g:netrw_browse_split is a List: [servername,tabnr,winnr]
+" call Decho("edit-a-file: open file in server",'~'.expand("<slnum>"))
+ call s:NetrwServerEdit(a:islocal,dirname)
+" call Dret("s:NetrwBrowseChgDir")
+ return
+
+ elseif g:netrw_browse_split == 1
+ " horizontally splitting the window first
+" call Decho("edit-a-file: horizontally splitting window prior to edit",'~'.expand("<slnum>"))
+ let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
+ exe "keepalt ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
+ if !&ea
+ keepalt wincmd _
+ endif
+ 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>"))
+ let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
+ exe "keepalt ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
+ if !&ea
+ keepalt wincmd |
+ endif
+ 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
+ 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>"))
+ if s:NetrwPrevWinOpen(2) == 3
+ let @@= ykeep
+" call Dret("s:NetrwBrowseChgDir")
+ return
+ endif
+ 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>"))
+ call s:NetrwMenu(0)
+ " optional change to window
+ if g:netrw_chgwin >= 1
+" call Decho("edit-a-file: changing window to #".g:netrw_chgwin.": (due to g:netrw_chgwin)",'~'.expand("<slnum>"))
+ if winnr("$")+1 == g:netrw_chgwin
+ " if g:netrw_chgwin is set to one more than the last window, then
+ " vertically split the last window to make that window available.
+ let curwin= winnr()
+ exe "NetrwKeepj keepalt ".winnr("$")."wincmd w"
+ vs
+ exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd ".curwin
+ endif
+ exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd w"
+ endif
+ call s:SetRexDir(a:islocal,curdir)
+ endif
+
+ endif
+
+ " the point where netrw actually edits the (local) file
+ " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
+ " no keepalt to support :e # to return to a directory listing
+ if !&mod
+ " if e the new file would fail due to &mod, then don't change any of the flags
+ let dolockout= 1
+ endif
+ if a:islocal
+" call Decho("edit-a-file: edit local file: exe e! ".fnameescape(dirname),'~'.expand("<slnum>"))
+ " some like c-^ to return to the last edited file
+ " others like c-^ to return to the netrw buffer
+ " Apr 30, 2020: used to have e! here. That can cause loss of a modified file,
+ " so emit error E37 instead.
+ if exists("g:netrw_altfile") && g:netrw_altfile
+ exe "NetrwKeepj keepalt e ".fnameescape(dirname)
+ else
+ exe "NetrwKeepj e ".fnameescape(dirname)
+ endif
+" call Decho("edit-a-file: after e! ".dirname.": hidden=".&hidden." bufhidden<".&bufhidden."> mod=".&mod,'~'.expand("<slnum>"))
+ " COMBAK -- cuc cul related
+ call s:NetrwCursor(1)
+ if &hidden || &bufhidden == "hide"
+ " file came from vim's hidden storage. Don't "restore" options with it.
+ let dorestore= 0
+ endif
+ else
+" call Decho("edit-a-file: remote file: NetrwBrowse will edit it",'~'.expand("<slnum>"))
+ endif
+
+ " handle g:Netrw_funcref -- call external-to-netrw functions
+ " This code will handle g:Netrw_funcref as an individual function reference
+ " or as a list of function references. It will ignore anything that's not
+ " a function reference. See :help Funcref for information about function references.
+ if exists("g:Netrw_funcref")
+" call Decho("edit-a-file: handle optional Funcrefs",'~'.expand("<slnum>"))
+ if type(g:Netrw_funcref) == 2
+" call Decho("edit-a-file: handling a g:Netrw_funcref",'~'.expand("<slnum>"))
+ NetrwKeepj call g:Netrw_funcref()
+ elseif type(g:Netrw_funcref) == 3
+" call Decho("edit-a-file: handling a list of g:Netrw_funcrefs",'~'.expand("<slnum>"))
+ for Fncref in g:Netrw_funcref
+ if type(Fncref) == 2
+ NetrwKeepj call Fncref()
+ endif
+ endfor
+ endif
+ endif
+ endif
+
+ elseif newdir =~ '^/'
+ " ----------------------------------------------------
+ " NetrwBrowseChgDir: just go to the new directory spec {{{3
+ " ----------------------------------------------------
+" call Decho('goto-newdir: case "just go to new directory spec": newdir<'.newdir.'>','~'.expand("<slnum>"))
+ let dirname = newdir
+ NetrwKeepj call s:SetRexDir(a:islocal,dirname)
+ NetrwKeepj call s:NetrwOptionsRestore("s:")
+ norm! m`
+
+ elseif newdir == './'
+ " ---------------------------------------------
+ " NetrwBrowseChgDir: refresh the directory list {{{3
+ " ---------------------------------------------
+" call Decho('(s:NetrwBrowseChgDir)refresh-dirlist: case "refresh directory listing": newdir == "./"','~'.expand("<slnum>"))
+ NetrwKeepj call s:SetRexDir(a:islocal,dirname)
+ norm! m`
+
+ elseif newdir == '../'
+ " --------------------------------------
+ " NetrwBrowseChgDir: go up one directory {{{3
+ " --------------------------------------
+" call Decho('(s:NetrwBrowseChgDir)go-up: case "go up one directory": newdir == "../"','~'.expand("<slnum>"))
+
+ if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
+ " force a refresh
+" call Decho("go-up: clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
+" call Decho("go-up: setl noro ma",'~'.expand("<slnum>"))
+ setl noro ma
+ NetrwKeepj %d _
+ endif
+
+ if has("amiga")
+ " amiga
+" call Decho('go-up: case "go up one directory": newdir == "../" and amiga','~'.expand("<slnum>"))
+ if a:islocal
+ let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','')
+ let dirname= substitute(dirname,'/$','','')
+ else
+ let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','')
+ endif
+" call Decho("go-up: amiga: dirname<".dirname."> (go up one dir)",'~'.expand("<slnum>"))
+
+ elseif !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
+ " windows
+ if a:islocal
+ let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
+ if dirname == ""
+ let dirname= '/'
+ endif
+ else
+ let dirname= substitute(dirname,'^\(\a\{3,}://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
+ endif
+ if dirname =~ '^\a:$'
+ let dirname= dirname.'/'
+ endif
+" call Decho("go-up: windows: dirname<".dirname."> (go up one dir)",'~'.expand("<slnum>"))
+
+ else
+ " unix or cygwin
+" call Decho('(s:NetrwBrowseChgDir)go-up: case "go up one directory": newdir == "../" and unix or cygwin','~'.expand("<slnum>"))
+ if a:islocal
+ let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','')
+ if dirname == ""
+ let dirname= '/'
+ endif
+ else
+ let dirname= substitute(dirname,'^\(\a\{3,}://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','')
+ endif
+" call Decho("go-up: unix: dirname<".dirname."> (go up one dir)",'~'.expand("<slnum>"))
+ endif
+ NetrwKeepj call s:SetRexDir(a:islocal,dirname)
+ norm! m`
+
+ elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
+ " --------------------------------------
+ " NetrwBrowseChgDir: Handle Tree Listing {{{3
+ " --------------------------------------
+" call Decho('(s:NetrwBrowseChgDir)tree-list: case liststyle is TREELIST and w:netrw_treedict exists','~'.expand("<slnum>"))
+ " force a refresh (for TREELIST, NetrwTreeDir() will force the refresh)
+" call Decho("tree-list: setl noro ma",'~'.expand("<slnum>"))
+ setl noro ma
+ if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
+" call Decho("tree-list: clear buffer<".expand("%")."> with :%d (force refresh)",'~'.expand("<slnum>"))
+ NetrwKeepj %d _
+ endif
+ let treedir = s:NetrwTreeDir(a:islocal)
+" call Decho("tree-list: treedir<".treedir.">",'~'.expand("<slnum>"))
+ let s:treecurpos = winsaveview()
+ let haskey = 0
+" call Decho("tree-list: w:netrw_treedict<".string(w:netrw_treedict).">",'~'.expand("<slnum>"))
+
+ " search treedict for tree dir as-is
+" call Decho("tree-list: search treedict for tree dir as-is",'~'.expand("<slnum>"))
+ if has_key(w:netrw_treedict,treedir)
+" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched for treedir<'.treedir.'> : found it!','~'.expand("<slnum>"))
+ let haskey= 1
+ else
+" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched for treedir<'.treedir.'> : not found','~'.expand("<slnum>"))
+ endif
+
+ " search treedict for treedir with a [/@] appended
+" call Decho("tree-list: search treedict for treedir with a [/@] appended",'~'.expand("<slnum>"))
+ if !haskey && treedir !~ '[/@]$'
+ if has_key(w:netrw_treedict,treedir."/")
+ let treedir= treedir."/"
+" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched.for treedir<'.treedir.'> found it!','~'.expand("<slnum>"))
+ let haskey = 1
+ else
+" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched for treedir<'.treedir.'/> : not found','~'.expand("<slnum>"))
+ endif
+ endif
+
+ " search treedict for treedir with any trailing / elided
+" call Decho("tree-list: search treedict for treedir with any trailing / elided",'~'.expand("<slnum>"))
+ if !haskey && treedir =~ '/$'
+ let treedir= substitute(treedir,'/$','','')
+ if has_key(w:netrw_treedict,treedir)
+" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched.for treedir<'.treedir.'> found it!','~'.expand("<slnum>"))
+ let haskey = 1
+ else
+" call Decho('(s:NetrwBrowseChgDir)tree-list: ....searched for treedir<'.treedir.'> : not found','~'.expand("<slnum>"))
+ endif
+ endif
+
+" call Decho("haskey=".haskey,'~'.expand("<slnum>"))
+ if haskey
+ " close tree listing for selected subdirectory
+" call Decho("tree-list: closing selected subdirectory<".dirname.">",'~'.expand("<slnum>"))
+ call remove(w:netrw_treedict,treedir)
+" call Decho("tree-list: removed entry<".treedir."> from treedict",'~'.expand("<slnum>"))
+" call Decho("tree-list: yielding treedict<".string(w:netrw_treedict).">",'~'.expand("<slnum>"))
+ let dirname= w:netrw_treetop
+ else
+ " go down one directory
+ let dirname= substitute(treedir,'/*$','/','')
+" call Decho("tree-list: go down one dir: treedir<".treedir.">",'~'.expand("<slnum>"))
+" call Decho("tree-list: ... : dirname<".dirname.">",'~'.expand("<slnum>"))
+ endif
+ NetrwKeepj call s:SetRexDir(a:islocal,dirname)
+" call Decho("setting s:treeforceredraw to true",'~'.expand("<slnum>"))
+ let s:treeforceredraw = 1
+
+ else
+ " ----------------------------------------
+ " NetrwBrowseChgDir: Go down one directory {{{3
+ " ----------------------------------------
+ let dirname = s:ComposePath(dirname,newdir)
+" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">",'~'.expand("<slnum>"))
+ NetrwKeepj call s:SetRexDir(a:islocal,dirname)
+ norm! m`
+ endif
+
+ " --------------------------------------
+ " NetrwBrowseChgDir: Restore and Cleanup {{{3
+ " --------------------------------------
+ if dorestore
+ " dorestore is zero'd when a local file was hidden or bufhidden;
+ " in such a case, we want to keep whatever settings it may have.
+" call Decho("doing option restore (dorestore=".dorestore.")",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwOptionsRestore("s:")
+" else " Decho
+" call Decho("skipping option restore (dorestore==0): hidden=".&hidden." bufhidden=".&bufhidden." mod=".&mod,'~'.expand("<slnum>"))
+ endif
+ if dolockout && dorestore
+" call Decho("restore: filewritable(dirname<".dirname.">)=".filewritable(dirname),'~'.expand("<slnum>"))
+ if filewritable(dirname)
+" call Decho("restore: doing modification lockout settings: ma nomod noro",'~'.expand("<slnum>"))
+" call Decho("restore: setl ma nomod noro",'~'.expand("<slnum>"))
+ setl ma noro nomod
+" call Decho("restore: ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ else
+" call Decho("restore: doing modification lockout settings: ma nomod ro",'~'.expand("<slnum>"))
+" call Decho("restore: setl ma nomod noro",'~'.expand("<slnum>"))
+ setl ma ro nomod
+" call Decho("restore: ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ endif
+ endif
+ call s:RestorePosn(s:netrw_posn)
+ let @@= ykeep
+
+" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
+ return dirname
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBrowseUpDir: implements the "-" mappings {{{2
+" for thin, long, and wide: cursor placed just after banner
+" for tree, keeps cursor on current filename
+fun! s:NetrwBrowseUpDir(islocal)
+" call Dfunc("s:NetrwBrowseUpDir(islocal=".a:islocal.")")
+ if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt-1
+ " this test needed because occasionally this function seems to be incorrectly called
+ " when multiple leftmouse clicks are taken when atop the one line help in the banner.
+ " I'm allowing the very bottom line to permit a "-" exit so that one may escape empty
+ " directories.
+" call Dret("s:NetrwBrowseUpDir : cursor not in file area")
+ return
+ endif
+
+ norm! 0
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
+" call Decho("case: treestyle",'~'.expand("<slnum>"))
+ let curline= getline(".")
+ let swwline= winline() - 1
+ if exists("w:netrw_treetop")
+ let b:netrw_curdir= w:netrw_treetop
+ elseif exists("b:netrw_curdir")
+ let w:netrw_treetop= b:netrw_curdir
+ else
+ let w:netrw_treetop= getcwd()
+ let b:netrw_curdir = w:netrw_treetop
+ endif
+ let curfile = getline(".")
+ let curpath = s:NetrwTreePath(w:netrw_treetop)
+ if a:islocal
+ call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,'../'))
+ else
+ call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,'../'))
+ endif
+" call Decho("looking for curfile<^".s:treedepthstring.curfile.">",'~'.expand("<slnum>"))
+" call Decho("having curpath<".curpath.">",'~'.expand("<slnum>"))
+ if w:netrw_treetop == '/'
+ keepj call search('^\M'.curfile,"w")
+ elseif curfile == '../'
+ keepj call search('^\M'.curfile,"wb")
+ else
+" call Decho("search(^\\M".s:treedepthstring.curfile.") backwards"))
+ while 1
+ keepj call search('^\M'.s:treedepthstring.curfile,"wb")
+ let treepath= s:NetrwTreePath(w:netrw_treetop)
+" call Decho("..current treepath<".treepath.">",'~'.expand("<slnum>"))
+ if treepath == curpath
+ break
+ endif
+ endwhile
+ endif
+
+ else
+" call Decho("case: not treestyle",'~'.expand("<slnum>"))
+ call s:SavePosn(s:netrw_posn)
+ if exists("b:netrw_curdir")
+ let curdir= b:netrw_curdir
+ else
+ let curdir= expand(getcwd())
+ endif
+ if a:islocal
+ call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,'../'))
+ else
+ call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,'../'))
+ endif
+ call s:RestorePosn(s:netrw_posn)
+ let curdir= substitute(curdir,'^.*[\/]','','')
+ call search('\<'.curdir.'/','wc')
+ endif
+" call Dret("s:NetrwBrowseUpDir")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#BrowseX: (implements "x" and "gx") executes a special "viewer" script or program for the {{{2
+" given filename; typically this means given their extension.
+" 0=local, 1=remote
+fun! netrw#BrowseX(fname,remote)
+ let use_ctrlo= 1
+" call Dfunc("netrw#BrowseX(fname<".a:fname."> remote=".a:remote.") implements x and gx maps")
+
+ if a:remote == 0 && isdirectory(a:fname)
+ " if its really just a local directory, then do a "gf" instead
+" call Decho("remote≡0 and a:fname<".a:fname."> ".(isdirectory(a:fname)? "is a directory" : "is not a directory"),'~'.expand("<slnum>"))
+" call Decho("..appears to be a local directory; using e ".a:fname." instead",'~'.expand("<slnum>"))
+ exe "e ".a:fname
+" call Dret("netrw#BrowseX")
+ return
+ elseif a:remote == 1 && a:fname !~ '^https\=:' && a:fname =~ '/$'
+ " remote directory, not a webpage access, looks like an attempt to do a directory listing
+" call Decho("remote≡1 and a:fname<".a:fname.">",'~'.expand("<slnum>"))
+" call Decho("..and fname ".((a:fname =~ '^https\=:')? 'matches' : 'does not match').'^https\=:','~'.expand("<slnum>"))
+" call Decho("..and fname ".((a:fname =~ '/$')? 'matches' : 'does not match').' /$','~'.expand("<slnum>"))
+" call Decho("..appears to be a remote directory listing request; using gf instead",'~'.expand("<slnum>"))
+ norm! gf
+" call Dret("netrw#BrowseX")
+ return
+ endif
+" call Decho("not a local file nor a webpage request",'~'.expand("<slnum>"))
+
+ if exists("g:netrw_browsex_viewer") && exists("g:netrw_browsex_support_remote") && !g:netrw_browsex_support_remote
+ let remote = a:remote
+ else
+ let remote = 0
+ endif
+
+ let ykeep = @@
+ let screenposn = winsaveview()
+" call Decho("saving posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
+
+ " need to save and restore aw setting as gx can invoke this function from non-netrw buffers
+ let awkeep = &aw
+ set noaw
+
+ " special core dump handler
+ if a:fname =~ '/core\(\.\d\+\)\=$'
+ if exists("g:Netrw_corehandler")
+ if type(g:Netrw_corehandler) == 2
+ " g:Netrw_corehandler is a function reference (see :help Funcref)
+" call Decho("g:Netrw_corehandler is a funcref",'~'.expand("<slnum>"))
+ call g:Netrw_corehandler(s:NetrwFile(a:fname))
+ elseif type(g:Netrw_corehandler) == 3
+ " g:Netrw_corehandler is a List of function references (see :help Funcref)
+" call Decho("g:Netrw_corehandler is a List",'~'.expand("<slnum>"))
+ for Fncref in g:Netrw_corehandler
+ if type(FncRef) == 2
+ call FncRef(a:fname)
+ endif
+ endfor
+ endif
+" call Decho("restoring posn: screenposn<".string(screenposn).">,'~'.expand("<slnum>"))"
+ call winrestview(screenposn)
+ let @@= ykeep
+ let &aw= awkeep
+" call Dret("netrw#BrowseX : coredump handler invoked")
+ return
+ endif
+ endif
+
+ " set up the filename
+ " (lower case the extension, make a local copy of a remote file)
+ let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ let exten= substitute(exten,'^.*$','\L&\E','')
+ endif
+ if exten =~ "[\\/]"
+ let exten= ""
+ endif
+" call Decho("exten<".exten.">",'~'.expand("<slnum>"))
+
+ if remote == 1
+ " create a local copy
+" call Decho("remote: remote=".remote.": create a local copy of <".a:fname.">",'~'.expand("<slnum>"))
+ setl bh=delete
+ call netrw#NetRead(3,a:fname)
+ " attempt to rename tempfile
+ let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','')
+ let newname = substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','')
+" call Decho("basename<".basename.">",'~'.expand("<slnum>"))
+" call Decho("newname <".newname.">",'~'.expand("<slnum>"))
+ if s:netrw_tmpfile != newname && newname != ""
+ if rename(s:netrw_tmpfile,newname) == 0
+ " renaming succeeded
+" call Decho("renaming succeeded (tmpfile<".s:netrw_tmpfile."> to <".newname.">)")
+ let fname= newname
+ else
+ " renaming failed
+" call Decho("renaming failed (tmpfile<".s:netrw_tmpfile."> to <".newname.">)")
+ let fname= s:netrw_tmpfile
+ endif
+ else
+ let fname= s:netrw_tmpfile
+ endif
+ else
+" call Decho("local: remote=".remote.": handling local copy of <".a:fname.">",'~'.expand("<slnum>"))
+ let fname= a:fname
+ " special ~ handler for local
+ if fname =~ '^\~' && expand("$HOME") != ""
+" call Decho('invoking special ~ handler','~'.expand("<slnum>"))
+ let fname= s:NetrwFile(substitute(fname,'^\~',expand("$HOME"),''))
+ endif
+ endif
+" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
+" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten),'~'.expand("<slnum>"))
+
+ " 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= &srr . "/dev/null"
+ endif
+ endif
+" call Decho("set up redirection: redir{".redir."} srr{".&srr."}",'~'.expand("<slnum>"))
+
+ " extract any viewing options. Assumes that they're set apart by spaces.
+ if exists("g:netrw_browsex_viewer")
+" call Decho("extract any viewing options from g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
+ if g:netrw_browsex_viewer =~ '\s'
+ let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
+ let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
+ let oviewer = ''
+ let cnt = 1
+ while !executable(viewer) && viewer != oviewer
+ let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
+ let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
+ let cnt = cnt + 1
+ let oviewer = viewer
+" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">",'~'.expand("<slnum>"))
+ endwhile
+ else
+ let viewer = g:netrw_browsex_viewer
+ let viewopt = ""
+ endif
+" call Decho("viewer<".viewer."> viewopt<".viewopt.">",'~'.expand("<slnum>"))
+ endif
+
+ " execute the file handler
+" call Decho("execute the file handler (if any)",'~'.expand("<slnum>"))
+ if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
+" call Decho("(netrw#BrowseX) g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
+ let ret= netrwFileHandlers#Invoke(exten,fname)
+
+ elseif exists("g:netrw_browsex_viewer") && executable(viewer)
+" call Decho("(netrw#BrowseX) g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">",'~'.expand("<slnum>"))
+ call s:NetrwExe("sil !".viewer." ".viewopt.s:ShellEscape(fname,1).redir)
+ let ret= v:shell_error
+
+ elseif has("win32") || has("win64")
+" call Decho("(netrw#BrowseX) win".(has("win32")? "32" : "64"),'~'.expand("<slnum>"))
+ if executable("start")
+ call s:NetrwExe('sil! !start rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(fname,1))
+ elseif executable("rundll32")
+ call s:NetrwExe('sil! !rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(fname,1))
+ else
+ call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
+ endif
+ let ret= v:shell_error
+
+ elseif has("win32unix")
+ let winfname= 'c:\cygwin'.substitute(fname,'/','\\','g')
+" call Decho("(netrw#BrowseX) cygwin: winfname<".s:ShellEscape(winfname,1).">",'~'.expand("<slnum>"))
+ if executable("start")
+" call Decho("(netrw#BrowseX) win32unix+start",'~'.expand("<slnum>"))
+ call s:NetrwExe('sil !start rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(winfname,1))
+ elseif executable("rundll32")
+" call Decho("(netrw#BrowseX) win32unix+rundll32",'~'.expand("<slnum>"))
+ call s:NetrwExe('sil !rundll32 url.dll,FileProtocolHandler '.s:ShellEscape(winfname,1))
+ elseif executable("cygstart")
+" call Decho("(netrw#BrowseX) win32unix+cygstart",'~'.expand("<slnum>"))
+ call s:NetrwExe('sil !cygstart '.s:ShellEscape(fname,1))
+ else
+ call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74)
+ endif
+ let ret= v:shell_error
+
+ elseif has("unix") && $DESKTOP_SESSION == "mate" && executable("atril")
+" call Decho("(netrw#BrowseX) unix and atril",'~'.expand("<slnum>"))
+ if a:fname =~ '^https\=://'
+ " atril does not appear to understand how to handle html -- so use gvim to edit the document
+ let use_ctrlo= 0
+" call Decho("fname<".fname.">")
+" call Decho("a:fname<".a:fname.">")
+ call s:NetrwExe("sil! !gvim ".fname.' -c "keepj keepalt file '.fnameescape(a:fname).'"')
+
+ else
+ call s:NetrwExe("sil !atril ".s:ShellEscape(fname,1).redir)
+ endif
+ let ret= v:shell_error
+
+ elseif has("unix") && executable("kfmclient") && s:CheckIfKde()
+" call Decho("(netrw#BrowseX) unix and kfmclient",'~'.expand("<slnum>"))
+ call s:NetrwExe("sil !kfmclient exec ".s:ShellEscape(fname,1)." ".redir)
+ let ret= v:shell_error
+
+ elseif has("unix") && executable("exo-open") && executable("xdg-open") && executable("setsid")
+" call Decho("(netrw#BrowseX) unix, exo-open, xdg-open",'~'.expand("<slnum>"))
+ call s:NetrwExe("sil !setsid xdg-open ".s:ShellEscape(fname,1).redir.'&')
+ let ret= v:shell_error
+
+ elseif has("unix") && executable("xdg-open")
+" call Decho("(netrw#BrowseX) unix and xdg-open",'~'.expand("<slnum>"))
+ call s:NetrwExe("sil !xdg-open ".s:ShellEscape(fname,1).redir.'&')
+ let ret= v:shell_error
+
+ elseif has("macunix") && executable("open")
+" call Decho("(netrw#BrowseX) macunix and open",'~'.expand("<slnum>"))
+ call s:NetrwExe("sil !open ".s:ShellEscape(fname,1)." ".redir)
+ let ret= v:shell_error
+
+ else
+ " netrwFileHandlers#Invoke() always returns 0
+" call Decho("(netrw#BrowseX) use netrwFileHandlers",'~'.expand("<slnum>"))
+ let ret= netrwFileHandlers#Invoke(exten,fname)
+ endif
+
+ " if unsuccessful, attempt netrwFileHandlers#Invoke()
+ if ret
+" call Decho("(netrw#BrowseX) ret=".ret," indicates unsuccessful thus far",'~'.expand("<slnum>"))
+ let ret= netrwFileHandlers#Invoke(exten,fname)
+ endif
+
+ " restoring redraw! after external file handlers
+ redraw!
+
+ " cleanup: remove temporary file,
+ " delete current buffer if success with handler,
+ " return to prior buffer (directory listing)
+ " Feb 12, 2008: had to de-activiate removal of
+ " temporary file because it wasn't getting seen.
+" if remote == 1 && fname != a:fname
+"" call Decho("deleting temporary file<".fname.">",'~'.expand("<slnum>"))
+" call s:NetrwDelete(fname)
+" endif
+
+ if remote == 1
+ setl bh=delete bt=nofile
+ if g:netrw_use_noswf
+ setl noswf
+ endif
+ if use_ctrlo
+ exe "sil! NetrwKeepj norm! \<c-o>"
+ endif
+ endif
+" call Decho("restoring posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
+ call winrestview(screenposn)
+ let @@ = ykeep
+ let &aw= awkeep
+
+" call Dret("netrw#BrowseX")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#GX: gets word under cursor for gx support {{{2
+" See also: netrw#BrowseXVis
+" netrw#BrowseX
+fun! netrw#GX()
+" call Dfunc("netrw#GX()")
+ if &ft == "netrw"
+ let fname= s:NetrwGetWord()
+ else
+ let fname= expand((exists("g:netrw_gx")? g:netrw_gx : '<cfile>'))
+ endif
+" call Dret("netrw#GX <".fname.">")
+ return fname
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#BrowseXVis: used by gx in visual mode to select a file for browsing {{{2
+fun! netrw#BrowseXVis()
+" call Dfunc("netrw#BrowseXVis()")
+ let akeep = @a
+ norm! gv"ay
+ let gxfile= @a
+ let @a = akeep
+ call netrw#BrowseX(gxfile,netrw#CheckIfRemote(gxfile))
+" call Dret("netrw#BrowseXVis")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBufRename: renames a buffer without the side effect of retaining an unlisted buffer having the old name {{{2
+" Using the file command on a "[No Name]" buffer does not seem to cause the old "[No Name]" buffer
+" to become an unlisted buffer, so in that case don't bwipe it.
+fun! s:NetrwBufRename(newname)
+" call Dfunc("s:NetrwBufRename(newname<".a:newname.">) buf(%)#".bufnr("%")."<".bufname(bufnr("%")).">")
+" call Dredir("ls!","s:NetrwBufRename (before rename)")
+ let oldbufname= bufname(bufnr("%"))
+" call Decho("buf#".bufnr("%").": oldbufname<".oldbufname.">",'~'.expand("<slnum>"))
+
+ if oldbufname != a:newname
+" call Decho("do buffer rename: oldbufname<".oldbufname."> ≠ a:newname<".a:newname.">",'~'.expand("<slnum>"))
+ let b:junk= 1
+" call Decho("rename buffer: sil! keepj keepalt file ".fnameescape(a:newname),'~'.expand("<slnum>"))
+ exe 'sil! keepj keepalt file '.fnameescape(a:newname)
+" call Dredir("ls!","s:NetrwBufRename (before bwipe)~".expand("<slnum>"))
+ let oldbufnr= bufnr(oldbufname)
+" call Decho("oldbufname<".oldbufname."> oldbufnr#".oldbufnr,'~'.expand("<slnum>"))
+" call Decho("bufnr(%)=".bufnr("%"),'~'.expand("<slnum>"))
+ if oldbufname != "" && oldbufnr != -1 && oldbufnr != bufnr("%")
+" call Decho("bwipe ".oldbufnr,'~'.expand("<slnum>"))
+ exe "bwipe! ".oldbufnr
+" else " Decho
+" call Decho("did *not* bwipe buf#".oldbufnr,'~'.expand("<slnum>"))
+" call Decho("..reason: if oldbufname<".oldbufname."> is empty",'~'.expand("<slnum>"))"
+" call Decho("..reason: if oldbufnr#".oldbufnr." is -1",'~'.expand("<slnum>"))"
+" call Decho("..reason: if oldbufnr#".oldbufnr." != bufnr(%)#".bufnr("%"),'~'.expand("<slnum>"))"
+ endif
+" call Dredir("ls!","s:NetrwBufRename (after rename)")
+" else " Decho
+" call Decho("oldbufname<".oldbufname."> == a:newname: did *not* rename",'~'.expand("<slnum>"))
+ endif
+
+" call Dret("s:NetrwBufRename : buf#".bufnr("%").": oldname<".oldbufname."> newname<".a:newname."> expand(%)<".expand("%").">")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#CheckIfRemote: returns 1 if current file looks like an url, 0 else {{{2
+fun! netrw#CheckIfRemote(...)
+" call Dfunc("netrw#CheckIfRemote() a:0=".a:0)
+ if a:0 > 0
+ let curfile= a:1
+ else
+ let curfile= expand("%")
+ endif
+" call Decho("curfile<".curfile.">")
+ if curfile =~ '^\a\{3,}://'
+" call Dret("netrw#CheckIfRemote 1")
+ return 1
+ else
+" call Dret("netrw#CheckIfRemote 0")
+ return 0
+ endif
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwChgPerm: (implements "gp") change file permission {{{2
+fun! s:NetrwChgPerm(islocal,curdir)
+" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)")
+ let ykeep = @@
+ call inputsave()
+ let newperm= input("Enter new permission: ")
+ call inputrestore()
+ let chgperm= substitute(g:netrw_chgperm,'\<FILENAME\>',s:ShellEscape(expand("<cfile>")),'')
+ let chgperm= substitute(chgperm,'\<PERM\>',s:ShellEscape(newperm),'')
+" call Decho("chgperm<".chgperm.">",'~'.expand("<slnum>"))
+ call system(chgperm)
+ if v:shell_error != 0
+ NetrwKeepj call netrw#ErrorMsg(1,"changing permission on file<".expand("<cfile>")."> seems to have failed",75)
+ endif
+ if a:islocal
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+ endif
+ let @@= ykeep
+" call Dret("s:NetrwChgPerm")
+endfun
+
+" ---------------------------------------------------------------------
+" s:CheckIfKde: checks if kdeinit is running {{{2
+" Returns 0: kdeinit not running
+" 1: kdeinit is running
+fun! s:CheckIfKde()
+" call Dfunc("s:CheckIfKde()")
+ " seems kde systems often have gnome-open due to dependencies, even though
+ " gnome-open's subsidiary display tools are largely absent. Kde systems
+ " usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
+ if !exists("s:haskdeinit")
+ if has("unix") && executable("ps") && !has("win32unix")
+ let s:haskdeinit= system("ps -e") =~ '\<kdeinit'
+ if v:shell_error
+ let s:haskdeinit = 0
+ endif
+ else
+ let s:haskdeinit= 0
+ endif
+" call Decho("setting s:haskdeinit=".s:haskdeinit,'~'.expand("<slnum>"))
+ endif
+
+" call Dret("s:CheckIfKde ".s:haskdeinit)
+ return s:haskdeinit
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwClearExplore: clear explore variables (if any) {{{2
+fun! s:NetrwClearExplore()
+" call Dfunc("s:NetrwClearExplore()")
+ 2match none
+ if exists("s:explore_match") |unlet s:explore_match |endif
+ if exists("s:explore_indx") |unlet s:explore_indx |endif
+ if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif
+ if exists("s:dirstarstar") |unlet s:dirstarstar |endif
+ if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif
+ if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
+ if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
+ if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
+ if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
+" redraw!
+ echo " "
+ echo " "
+" call Dret("s:NetrwClearExplore")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwExploreListUniq: {{{2
+fun! s:NetrwExploreListUniq(explist)
+" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)")
+
+ " this assumes that the list is already sorted
+ let newexplist= []
+ for member in a:explist
+ if !exists("uniqmember") || member != uniqmember
+ let uniqmember = member
+ let newexplist = newexplist + [ member ]
+ endif
+ endfor
+
+" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">")
+ return newexplist
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2
+fun! s:NetrwForceChgDir(islocal,newdir)
+" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)")
+ let ykeep= @@
+ if a:newdir !~ '/$'
+ " ok, looks like force is needed to get directory-style treatment
+ if a:newdir =~ '@$'
+ let newdir= substitute(a:newdir,'@$','/','')
+ elseif a:newdir =~ '[*=|\\]$'
+ let newdir= substitute(a:newdir,'.$','/','')
+ else
+ let newdir= a:newdir.'/'
+ endif
+" call Decho("adjusting newdir<".newdir."> due to gd",'~'.expand("<slnum>"))
+ else
+ " should already be getting treatment as a directory
+ let newdir= a:newdir
+ endif
+ let newdir= s:NetrwBrowseChgDir(a:islocal,newdir)
+ call s:NetrwBrowse(a:islocal,newdir)
+ let @@= ykeep
+" call Dret("s:NetrwForceChgDir")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwGlob: does glob() if local, remote listing otherwise {{{2
+" 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
+ let keep_liststyle = w:netrw_liststyle
+ let w:netrw_liststyle = s:THINLIST
+ if s:NetrwRemoteListing() == 0
+ keepj keepalt %s@/@@
+ let filelist= getline(1,$)
+ q!
+ else
+ " remote listing error -- leave treedict unchanged
+ 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(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
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwForceFile: (gf support) Force treatment as a file {{{2
+fun! s:NetrwForceFile(islocal,newfile)
+" call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newfile.">)")
+ if a:newfile =~ '[/@*=|\\]$'
+ let newfile= substitute(a:newfile,'.$','','')
+ else
+ let newfile= a:newfile
+ endif
+ if a:islocal
+ call s:NetrwBrowseChgDir(a:islocal,newfile)
+ else
+ call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,newfile))
+ endif
+" call Dret("s:NetrwForceFile")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
+" and switches the hiding mode. The actual hiding is done by
+" s:NetrwListHide().
+" g:netrw_hide= 0: show all
+" 1: show not-hidden files
+" 2: show hidden files only
+fun! s:NetrwHide(islocal)
+" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
+ let ykeep= @@
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+
+ if exists("s:netrwmarkfilelist_{bufnr('%')}")
+" call Decho("((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">",'~'.expand("<slnum>"))
+" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
+
+ " hide the files in the markfile list
+ for fname in s:netrwmarkfilelist_{bufnr("%")}
+" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." l:isk=".&l:isk,'~'.expand("<slnum>"))
+ if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
+ " remove fname from hiding list
+ let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','')
+ let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g')
+ let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','')
+" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
+ else
+ " append fname to hiding list
+ if exists("g:netrw_list_hide") && g:netrw_list_hide != ""
+ let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>'
+ else
+ let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>'
+ endif
+" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
+ endif
+ endfor
+ NetrwKeepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
+ let g:netrw_hide= 1
+
+ else
+
+ " switch between show-all/show-not-hidden/show-hidden
+ let g:netrw_hide=(g:netrw_hide+1)%3
+ exe "NetrwKeepj norm! 0"
+ if g:netrw_hide && g:netrw_list_hide == ""
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49)
+ let @@= ykeep
+" call Dret("NetrwHide")
+ return
+ endif
+ endif
+
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ let @@= ykeep
+" call Dret("NetrwHide")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwHideEdit: allows user to edit the file/directory hiding list {{{2
+fun! s:NetrwHideEdit(islocal)
+" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")")
+
+ let ykeep= @@
+ " save current cursor position
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+
+ " get new hiding list from user
+ call inputsave()
+ let newhide= input("Edit Hiding List: ",g:netrw_list_hide)
+ call inputrestore()
+ let g:netrw_list_hide= newhide
+" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
+
+ " refresh the listing
+ sil NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./"))
+
+ " restore cursor position
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call winrestview(svpos)
+ let @@= ykeep
+
+" call Dret("NetrwHideEdit")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwHidden: invoked by "gh" {{{2
+fun! s:NetrwHidden(islocal)
+" call Dfunc("s:NetrwHidden()")
+ let ykeep= @@
+ " save current position
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+
+ if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
+ " remove .file pattern from hiding list
+" call Decho("remove .file pattern from hiding list",'~'.expand("<slnum>"))
+ let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
+ elseif s:Strlen(g:netrw_list_hide) >= 1
+" call Decho("add .file pattern from hiding list",'~'.expand("<slnum>"))
+ let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
+ else
+" call Decho("set .file pattern as hiding list",'~'.expand("<slnum>"))
+ let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
+ endif
+ if g:netrw_list_hide =~ '^,'
+ let g:netrw_list_hide= strpart(g:netrw_list_hide,1)
+ endif
+
+ " refresh screen and return to saved position
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ let @@= ykeep
+" call Dret("s:NetrwHidden")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwHome: this function determines a "home" for saving bookmarks and history {{{2
+fun! s:NetrwHome()
+ if exists("g:netrw_home")
+ let home= expand(g:netrw_home)
+ else
+ " go to vim plugin home
+ for home in split(&rtp,',') + ['']
+ if isdirectory(s:NetrwFile(home)) && filewritable(s:NetrwFile(home)) | break | endif
+ let basehome= substitute(home,'[/\\]\.vim$','','')
+ if isdirectory(s:NetrwFile(basehome)) && filewritable(s:NetrwFile(basehome))
+ let home= basehome."/.vim"
+ break
+ endif
+ endfor
+ if home == ""
+ " just pick the first directory
+ let home= substitute(&rtp,',.*$','','')
+ endif
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+ let home= substitute(home,'/','\\','g')
+ endif
+ endif
+ " insure that the home directory exists
+ if g:netrw_dirhistmax > 0 && !isdirectory(s:NetrwFile(home))
+" call Decho("insure that the home<".home."> directory exists")
+ if exists("g:netrw_mkdir")
+" call Decho("call system(".g:netrw_mkdir." ".s:ShellEscape(s:NetrwFile(home)).")")
+ call system(g:netrw_mkdir." ".s:ShellEscape(s:NetrwFile(home)))
+ else
+" call Decho("mkdir(".home.")")
+ call mkdir(home)
+ endif
+ endif
+ let g:netrw_home= home
+ return home
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
+fun! s:NetrwLeftmouse(islocal)
+ if exists("s:netrwdrag")
+ return
+ endif
+ if &ft != "netrw"
+ return
+ endif
+" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
+
+ let ykeep= @@
+ " check if the status bar was clicked on instead of a file/directory name
+ while getchar(0) != 0
+ "clear the input stream
+ endwhile
+ call feedkeys("\<LeftMouse>")
+ let c = getchar()
+ let mouse_lnum = v:mouse_lnum
+ let wlastline = line('w$')
+ let lastline = line('$')
+" call Decho("v:mouse_lnum=".mouse_lnum." line(w$)=".wlastline." line($)=".lastline." v:mouse_win=".v:mouse_win." winnr#".winnr(),'~'.expand("<slnum>"))
+" call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0),'~'.expand("<slnum>"))
+ if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr()
+ " appears to be a status bar leftmouse click
+ let @@= ykeep
+" call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click")
+ return
+ endif
+ " Dec 04, 2013: following test prevents leftmouse selection/deselection of directories and files in treelist mode
+ " Windows are separated by vertical separator bars - but the mouse seems to be doing what it should when dragging that bar
+ " without this test when its disabled.
+ " May 26, 2014: edit file, :Lex, resize window -- causes refresh. Reinstated a modified test. See if problems develop.
+" call Decho("v:mouse_col=".v:mouse_col." col#".col('.')." virtcol#".virtcol('.')." col($)#".col("$")." virtcol($)#".virtcol("$"),'~'.expand("<slnum>"))
+ if v:mouse_col > virtcol('.')
+ let @@= ykeep
+" call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click")
+ return
+ endif
+
+ if a:islocal
+ if exists("b:netrw_curdir")
+ NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
+ endif
+ else
+ if exists("b:netrw_curdir")
+ NetrwKeepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
+ endif
+ endif
+ let @@= ykeep
+" call Dret("s:NetrwLeftmouse")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwCLeftmouse: used to select a file/directory for a target {{{2
+fun! s:NetrwCLeftmouse(islocal)
+ if &ft != "netrw"
+ return
+ endif
+" call Dfunc("s:NetrwCLeftmouse(islocal=".a:islocal.")")
+ call s:NetrwMarkFileTgt(a:islocal)
+" call Dret("s:NetrwCLeftmouse")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwServerEdit: edit file in a server gvim, usually NETRWSERVER (implements <c-r>){{{2
+" a:islocal=0 : <c-r> not used, remote
+" a:islocal=1 : <c-r> not used, local
+" a:islocal=2 : <c-r> used, remote
+" a:islocal=3 : <c-r> used, local
+fun! s:NetrwServerEdit(islocal,fname)
+" call Dfunc("s:NetrwServerEdit(islocal=".a:islocal.",fname<".a:fname.">)")
+ let islocal = a:islocal%2 " =0: remote =1: local
+ let ctrlr = a:islocal >= 2 " =0: <c-r> not used =1: <c-r> used
+" call Decho("islocal=".islocal." ctrlr=".ctrlr,'~'.expand("<slnum>"))
+
+ if (islocal && isdirectory(s:NetrwFile(a:fname))) || (!islocal && a:fname =~ '/$')
+ " handle directories in the local window -- not in the remote vim server
+ " user must have closed the NETRWSERVER window. Treat as normal editing from netrw.
+" call Decho("handling directory in client window",'~'.expand("<slnum>"))
+ let g:netrw_browse_split= 0
+ if exists("s:netrw_browse_split") && exists("s:netrw_browse_split_".winnr())
+ let g:netrw_browse_split= s:netrw_browse_split_{winnr()}
+ unlet s:netrw_browse_split_{winnr()}
+ endif
+ call s:NetrwBrowse(islocal,s:NetrwBrowseChgDir(islocal,a:fname))
+" call Dret("s:NetrwServerEdit")
+ return
+ endif
+
+" call Decho("handling file in server window",'~'.expand("<slnum>"))
+ if has("clientserver") && executable("gvim")
+" call Decho("has clientserver and gvim",'~'.expand("<slnum>"))
+
+ if exists("g:netrw_browse_split") && type(g:netrw_browse_split) == 3
+" call Decho("g:netrw_browse_split=".string(g:netrw_browse_split),'~'.expand("<slnum>"))
+ let srvrname = g:netrw_browse_split[0]
+ let tabnum = g:netrw_browse_split[1]
+ let winnum = g:netrw_browse_split[2]
+
+ if serverlist() !~ '\<'.srvrname.'\>'
+" call Decho("server not available; ctrlr=".ctrlr,'~'.expand("<slnum>"))
+
+ if !ctrlr
+ " user must have closed the server window and the user did not use <c-r>, but
+ " used something like <cr>.
+" call Decho("user must have closed server AND did not use ctrl-r",'~'.expand("<slnum>"))
+ if exists("g:netrw_browse_split")
+ unlet g:netrw_browse_split
+ endif
+ let g:netrw_browse_split= 0
+ if exists("s:netrw_browse_split_".winnr())
+ let g:netrw_browse_split= s:netrw_browse_split_{winnr()}
+ endif
+ call s:NetrwBrowseChgDir(islocal,a:fname)
+" call Dret("s:NetrwServerEdit")
+ return
+
+ elseif has("win32") && executable("start")
+ " start up remote netrw server under windows
+" call Decho("starting up gvim server<".srvrname."> for windows",'~'.expand("<slnum>"))
+ call system("start gvim --servername ".srvrname)
+
+ else
+ " start up remote netrw server under linux
+" call Decho("starting up gvim server<".srvrname.">",'~'.expand("<slnum>"))
+ call system("gvim --servername ".srvrname)
+ endif
+ endif
+
+" call Decho("srvrname<".srvrname."> tabnum=".tabnum." winnum=".winnum." server-editing<".a:fname.">",'~'.expand("<slnum>"))
+ call remote_send(srvrname,":tabn ".tabnum."\<cr>")
+ call remote_send(srvrname,":".winnum."wincmd w\<cr>")
+ call remote_send(srvrname,":e ".fnameescape(s:NetrwFile(a:fname))."\<cr>")
+
+ else
+
+ if serverlist() !~ '\<'.g:netrw_servername.'\>'
+
+ if !ctrlr
+" call Decho("server<".g:netrw_servername."> not available and ctrl-r not used",'~'.expand("<slnum>"))
+ if exists("g:netrw_browse_split")
+ unlet g:netrw_browse_split
+ endif
+ let g:netrw_browse_split= 0
+ call s:NetrwBrowse(islocal,s:NetrwBrowseChgDir(islocal,a:fname))
+" call Dret("s:NetrwServerEdit")
+ return
+
+ else
+" call Decho("server<".g:netrw_servername."> not available but ctrl-r used",'~'.expand("<slnum>"))
+ if has("win32") && executable("start")
+ " start up remote netrw server under windows
+" call Decho("starting up gvim server<".g:netrw_servername."> for windows",'~'.expand("<slnum>"))
+ call system("start gvim --servername ".g:netrw_servername)
+ else
+ " start up remote netrw server under linux
+" call Decho("starting up gvim server<".g:netrw_servername.">",'~'.expand("<slnum>"))
+ call system("gvim --servername ".g:netrw_servername)
+ endif
+ endif
+ endif
+
+ while 1
+ try
+" call Decho("remote-send: e ".a:fname,'~'.expand("<slnum>"))
+ call remote_send(g:netrw_servername,":e ".fnameescape(s:NetrwFile(a:fname))."\<cr>")
+ break
+ catch /^Vim\%((\a\+)\)\=:E241/
+ sleep 200m
+ endtry
+ endwhile
+
+ if exists("g:netrw_browse_split")
+ if type(g:netrw_browse_split) != 3
+ let s:netrw_browse_split_{winnr()}= g:netrw_browse_split
+ endif
+ unlet g:netrw_browse_split
+ endif
+ let g:netrw_browse_split= [g:netrw_servername,1,1]
+ endif
+
+ else
+ call netrw#ErrorMsg(s:ERROR,"you need a gui-capable vim and client-server to use <ctrl-r>",98)
+ endif
+
+" call Dret("s:NetrwServerEdit")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwSLeftmouse: marks the file under the cursor. May be dragged to select additional files {{{2
+fun! s:NetrwSLeftmouse(islocal)
+ if &ft != "netrw"
+ return
+ endif
+" call Dfunc("s:NetrwSLeftmouse(islocal=".a:islocal.")")
+
+ let s:ngw= s:NetrwGetWord()
+ call s:NetrwMarkFile(a:islocal,s:ngw)
+
+" call Dret("s:NetrwSLeftmouse")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwSLeftdrag: invoked via a shift-leftmouse and dragging {{{2
+" Used to mark multiple files.
+fun! s:NetrwSLeftdrag(islocal)
+" call Dfunc("s:NetrwSLeftdrag(islocal=".a:islocal.")")
+ if !exists("s:netrwdrag")
+ let s:netrwdrag = winnr()
+ if a:islocal
+ nno <silent> <s-leftrelease> <leftmouse>:<c-u>call <SID>NetrwSLeftrelease(1)<cr>
+ else
+ nno <silent> <s-leftrelease> <leftmouse>:<c-u>call <SID>NetrwSLeftrelease(0)<cr>
+ endif
+ endif
+ let ngw = s:NetrwGetWord()
+ if !exists("s:ngw") || s:ngw != ngw
+ call s:NetrwMarkFile(a:islocal,ngw)
+ endif
+ let s:ngw= ngw
+" call Dret("s:NetrwSLeftdrag : s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwSLeftrelease: terminates shift-leftmouse dragging {{{2
+fun! s:NetrwSLeftrelease(islocal)
+" call Dfunc("s:NetrwSLeftrelease(islocal=".a:islocal.") s:netrwdrag=".s:netrwdrag." buf#".bufnr("%"))
+ if exists("s:netrwdrag")
+ nunmap <s-leftrelease>
+ let ngw = s:NetrwGetWord()
+ if !exists("s:ngw") || s:ngw != ngw
+ call s:NetrwMarkFile(a:islocal,ngw)
+ endif
+ if exists("s:ngw")
+ unlet s:ngw
+ endif
+ unlet s:netrwdrag
+ endif
+" call Dret("s:NetrwSLeftrelease")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwListHide: uses [range]g~...~d to delete files that match {{{2
+" comma-separated patterns given in g:netrw_list_hide
+fun! s:NetrwListHide()
+" call Dfunc("s:NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
+" call Decho("initial: ".string(getline(w:netrw_bannercnt,'$')))
+ let ykeep= @@
+
+ " find a character not in the "hide" string to use as a separator for :g and :v commands
+ " How-it-works: take the hiding command, convert it into a range.
+ " Duplicate characters don't matter.
+ " Remove all such characters from the '/~@#...890' string.
+ " Use the first character left as a separator character.
+" call Decho("find a character not in the hide string to use as a separator",'~'.expand("<slnum>"))
+ let listhide= g:netrw_list_hide
+ let sep = strpart(substitute('~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1)
+" call Decho("sep<".sep."> (sep not in hide string)",'~'.expand("<slnum>"))
+
+ while listhide != ""
+ if listhide =~ ','
+ let hide = substitute(listhide,',.*$','','e')
+ let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e')
+ else
+ let hide = listhide
+ let listhide = ""
+ endif
+" call Decho("..extracted pattern from listhide: hide<".hide."> g:netrw_sort_by<".g:netrw_sort_by.'>','~'.expand("<slnum>"))
+ if g:netrw_sort_by =~ '^[ts]'
+ if hide =~ '^\^'
+" call Decho("..modify hide to handle a \"^...\" pattern",'~'.expand("<slnum>"))
+ let hide= substitute(hide,'^\^','^\(\\d\\+/\)','')
+ elseif hide =~ '^\\(\^'
+ let hide= substitute(hide,'^\\(\^','\\(^\\(\\d\\+/\\)','')
+ endif
+" call Decho("..hide<".hide."> listhide<".listhide.'>','~'.expand("<slnum>"))
+ endif
+
+ " Prune the list by hiding any files which match
+" call Decho("..prune the list by hiding any files which ".((g:netrw_hide == 1)? "" : "don't")."match hide<".hide.">")
+ if g:netrw_hide == 1
+" call Decho("..hiding<".hide.">",'~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d'
+ elseif g:netrw_hide == 2
+" call Decho("..showing<".hide.">",'~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @'
+ endif
+" call Decho("..result: ".string(getline(w:netrw_bannercnt,'$')),'~'.expand("<slnum>"))
+ endwhile
+
+ if g:netrw_hide == 2
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d'
+" call Decho("..v KEEP: ".string(getline(w:netrw_bannercnt,'$')),'~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e'
+" call Decho("..g KEEP: ".string(getline(w:netrw_bannercnt,'$')),'~'.expand("<slnum>"))
+ endif
+
+ " remove any blank lines that have somehow remained.
+ " This seems to happen under Windows.
+ exe 'sil! NetrwKeepj 1,$g@^\s*$@d'
+
+ let @@= ykeep
+" call Dret("s:NetrwListHide")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
+" implements the "d" mapping.
+fun! s:NetrwMakeDir(usrhost)
+" call Dfunc("s:NetrwMakeDir(usrhost<".a:usrhost.">)")
+
+ let ykeep= @@
+ " get name of new directory from user. A bare <CR> will skip.
+ " if its currently a directory, also request will be skipped, but with
+ " a message.
+ call inputsave()
+ let newdirname= input("Please give directory name: ")
+ call inputrestore()
+" call Decho("newdirname<".newdirname.">",'~'.expand("<slnum>"))
+
+ if newdirname == ""
+ let @@= ykeep
+" call Dret("s:NetrwMakeDir : user aborted with bare <cr>")
+ return
+ endif
+
+ if a:usrhost == ""
+" call Decho("local mkdir",'~'.expand("<slnum>"))
+
+ " Local mkdir:
+ " sanity checks
+ let fullnewdir= b:netrw_curdir.'/'.newdirname
+" call Decho("fullnewdir<".fullnewdir.">",'~'.expand("<slnum>"))
+ if isdirectory(s:NetrwFile(fullnewdir))
+ if !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
+ endif
+ let @@= ykeep
+" call Dret("s:NetrwMakeDir : directory<".newdirname."> exists previously")
+ return
+ endif
+ if s:FileReadable(fullnewdir)
+ if !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
+ endif
+ let @@= ykeep
+" call Dret("s:NetrwMakeDir : file<".newdirname."> exists previously")
+ return
+ endif
+
+ " requested new local directory is neither a pre-existing file or
+ " directory, so make it!
+ if exists("*mkdir")
+ if has("unix")
+ call mkdir(fullnewdir,"p",xor(0777, system("umask")))
+ else
+ call mkdir(fullnewdir,"p")
+ endif
+ else
+ let netrw_origdir= s:NetrwGetcwd(1)
+ if s:NetrwLcd(b:netrw_curdir)
+" call Dret("s:NetrwMakeDir : lcd failure")
+ return
+ endif
+" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">",'~'.expand("<slnum>"))
+ call s:NetrwExe("sil! !".g:netrw_localmkdir.g:netrw_localmkdiropt.' '.s:ShellEscape(newdirname,1))
+ if v:shell_error != 0
+ let @@= ykeep
+ call netrw#ErrorMsg(s:ERROR,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
+" call Dret("s:NetrwMakeDir : failed: sil! !".g:netrw_localmkdir.' '.s:ShellEscape(newdirname,1))
+ return
+ endif
+ if !g:netrw_keepdir
+" call Decho("restoring netrw_origdir since g:netrw_keepdir=".g:netrw_keepdir,'~'.expand("<slnum>"))
+ if s:NetrwLcd(netrw_origdir)
+" call Dret("s:NetrwBrowse : lcd failure")
+ return
+ endif
+ endif
+ endif
+
+ if v:shell_error == 0
+ " refresh listing
+" call Decho("refresh listing",'~'.expand("<slnum>"))
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call winrestview(svpos)
+ elseif !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
+ endif
+" redraw!
+
+ elseif !exists("b:netrw_method") || b:netrw_method == 4
+ " Remote mkdir: using ssh
+" call Decho("remote mkdir",'~'.expand("<slnum>"))
+ let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
+ let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
+ call s:NetrwExe("sil! !".mkdircmd." ".s:ShellEscape(newdirname,1))
+ if v:shell_error == 0
+ " refresh listing
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ elseif !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
+ endif
+" redraw!
+
+ elseif b:netrw_method == 2
+ " Remote mkdir: using ftp+.netrc
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+" call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
+ if exists("b:netrw_fname")
+" call Decho("b:netrw_fname<".b:netrw_fname.">",'~'.expand("<slnum>"))
+ let remotepath= b:netrw_fname
+ else
+ let remotepath= ""
+ endif
+ call s:NetrwRemoteFtpCmd(remotepath,g:netrw_remote_mkdir.' "'.newdirname.'"')
+ NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+
+ elseif b:netrw_method == 3
+ " Remote mkdir: using ftp + machine, id, passwd, and fname (ie. no .netrc)
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+" call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
+ if exists("b:netrw_fname")
+" call Decho("b:netrw_fname<".b:netrw_fname.">",'~'.expand("<slnum>"))
+ let remotepath= b:netrw_fname
+ else
+ let remotepath= ""
+ endif
+ call s:NetrwRemoteFtpCmd(remotepath,g:netrw_remote_mkdir.' "'.newdirname.'"')
+ NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ endif
+
+ let @@= ykeep
+" call Dret("s:NetrwMakeDir")
+endfun
+
+" ---------------------------------------------------------------------
+" s:TreeSqueezeDir: allows a shift-cr (gvim only) to squeeze the current tree-listing directory {{{2
+fun! s:TreeSqueezeDir(islocal)
+" call Dfunc("s:TreeSqueezeDir(islocal=".a:islocal.")")
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
+ " its a tree-listing style
+ let curdepth = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
+ let stopline = (exists("w:netrw_bannercnt")? (w:netrw_bannercnt + 1) : 1)
+ let depth = strchars(substitute(curdepth,' ','','g'))
+ let srch = -1
+" call Decho("curdepth<".curdepth.'>','~'.expand("<slnum>"))
+" call Decho("depth =".depth,'~'.expand("<slnum>"))
+" call Decho("stopline#".stopline,'~'.expand("<slnum>"))
+" call Decho("curline#".line(".")."<".getline('.').'>','~'.expand("<slnum>"))
+ if depth >= 2
+ NetrwKeepj norm! 0
+ let curdepthm1= substitute(curdepth,'^'.s:treedepthstring,'','')
+ let srch = search('^'.curdepthm1.'\%('.s:treedepthstring.'\)\@!','bW',stopline)
+" call Decho("curdepthm1<".curdepthm1.'>','~'.expand("<slnum>"))
+" call Decho("case depth>=2: srch<".srch.'>','~'.expand("<slnum>"))
+ elseif depth == 1
+ NetrwKeepj norm! 0
+ let treedepthchr= substitute(s:treedepthstring,' ','','')
+ let srch = search('^[^'.treedepthchr.']','bW',stopline)
+" call Decho("case depth==1: srch<".srch.'>','~'.expand("<slnum>"))
+ endif
+ if srch > 0
+" call Decho("squeezing at line#".line(".").": ".getline('.'),'~'.expand("<slnum>"))
+ call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,s:NetrwGetWord()))
+ exe srch
+ endif
+ endif
+" call Dret("s:TreeSqueezeDir")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMaps: {{{2
+fun! s:NetrwMaps(islocal)
+" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
+
+ " mouse <Plug> maps: {{{3
+ if g:netrw_mousemaps && g:netrw_retmap
+" call Decho("set up Rexplore 2-leftmouse",'~'.expand("<slnum>"))
+ if !hasmapto("<Plug>NetrwReturn")
+ if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$'
+" call Decho("making map for 2-leftmouse",'~'.expand("<slnum>"))
+ nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn
+ elseif maparg("<c-leftmouse>","n") == ""
+" call Decho("making map for c-leftmouse",'~'.expand("<slnum>"))
+ nmap <unique> <silent> <c-leftmouse> <Plug>NetrwReturn
+ endif
+ endif
+ nno <silent> <Plug>NetrwReturn :Rexplore<cr>
+" call Decho("made <Plug>NetrwReturn map",'~'.expand("<slnum>"))
+ endif
+
+ " generate default <Plug> maps {{{3
+ if !hasmapto('<Plug>NetrwHide') |nmap <buffer> <silent> <nowait> a <Plug>NetrwHide_a|endif
+ if !hasmapto('<Plug>NetrwBrowseUpDir') |nmap <buffer> <silent> <nowait> - <Plug>NetrwBrowseUpDir|endif
+ if !hasmapto('<Plug>NetrwOpenFile') |nmap <buffer> <silent> <nowait> % <Plug>NetrwOpenFile|endif
+ if !hasmapto('<Plug>NetrwBadd_cb') |nmap <buffer> <silent> <nowait> cb <Plug>NetrwBadd_cb|endif
+ if !hasmapto('<Plug>NetrwBadd_cB') |nmap <buffer> <silent> <nowait> cB <Plug>NetrwBadd_cB|endif
+ if !hasmapto('<Plug>NetrwLcd') |nmap <buffer> <silent> <nowait> cd <Plug>NetrwLcd|endif
+ if !hasmapto('<Plug>NetrwSetChgwin') |nmap <buffer> <silent> <nowait> C <Plug>NetrwSetChgwin|endif
+ if !hasmapto('<Plug>NetrwRefresh') |nmap <buffer> <silent> <nowait> <c-l> <Plug>NetrwRefresh|endif
+ if !hasmapto('<Plug>NetrwLocalBrowseCheck') |nmap <buffer> <silent> <nowait> <cr> <Plug>NetrwLocalBrowseCheck|endif
+ if !hasmapto('<Plug>NetrwServerEdit') |nmap <buffer> <silent> <nowait> <c-r> <Plug>NetrwServerEdit|endif
+ if !hasmapto('<Plug>NetrwMakeDir') |nmap <buffer> <silent> <nowait> d <Plug>NetrwMakeDir|endif
+ if !hasmapto('<Plug>NetrwBookHistHandler_gb')|nmap <buffer> <silent> <nowait> gb <Plug>NetrwBookHistHandler_gb|endif
+" ---------------------------------------------------------------------
+" if !hasmapto('<Plug>NetrwForceChgDir') |nmap <buffer> <silent> <nowait> gd <Plug>NetrwForceChgDir|endif
+" if !hasmapto('<Plug>NetrwForceFile') |nmap <buffer> <silent> <nowait> gf <Plug>NetrwForceFile|endif
+" if !hasmapto('<Plug>NetrwHidden') |nmap <buffer> <silent> <nowait> gh <Plug>NetrwHidden|endif
+" if !hasmapto('<Plug>NetrwSetTreetop') |nmap <buffer> <silent> <nowait> gn <Plug>NetrwSetTreetop|endif
+" if !hasmapto('<Plug>NetrwChgPerm') |nmap <buffer> <silent> <nowait> gp <Plug>NetrwChgPerm|endif
+" if !hasmapto('<Plug>NetrwBannerCtrl') |nmap <buffer> <silent> <nowait> I <Plug>NetrwBannerCtrl|endif
+" if !hasmapto('<Plug>NetrwListStyle') |nmap <buffer> <silent> <nowait> i <Plug>NetrwListStyle|endif
+" if !hasmapto('<Plug>NetrwMarkMoveMF2Arglist')|nmap <buffer> <silent> <nowait> ma <Plug>NetrwMarkMoveMF2Arglist|endif
+" if !hasmapto('<Plug>NetrwMarkMoveArglist2MF')|nmap <buffer> <silent> <nowait> mA <Plug>NetrwMarkMoveArglist2MF|endif
+" if !hasmapto('<Plug>NetrwBookHistHandler_mA')|nmap <buffer> <silent> <nowait> mb <Plug>NetrwBookHistHandler_mA|endif
+" if !hasmapto('<Plug>NetrwBookHistHandler_mB')|nmap <buffer> <silent> <nowait> mB <Plug>NetrwBookHistHandler_mB|endif
+" if !hasmapto('<Plug>NetrwMarkFileCopy') |nmap <buffer> <silent> <nowait> mc <Plug>NetrwMarkFileCopy|endif
+" if !hasmapto('<Plug>NetrwMarkFileDiff') |nmap <buffer> <silent> <nowait> md <Plug>NetrwMarkFileDiff|endif
+" if !hasmapto('<Plug>NetrwMarkFileEdit') |nmap <buffer> <silent> <nowait> me <Plug>NetrwMarkFileEdit|endif
+" if !hasmapto('<Plug>NetrwMarkFile') |nmap <buffer> <silent> <nowait> mf <Plug>NetrwMarkFile|endif
+" if !hasmapto('<Plug>NetrwUnmarkList') |nmap <buffer> <silent> <nowait> mF <Plug>NetrwUnmarkList|endif
+" if !hasmapto('<Plug>NetrwMarkFileGrep') |nmap <buffer> <silent> <nowait> mg <Plug>NetrwMarkFileGrep|endif
+" if !hasmapto('<Plug>NetrwMarkHideSfx') |nmap <buffer> <silent> <nowait> mh <Plug>NetrwMarkHideSfx|endif
+" if !hasmapto('<Plug>NetrwMarkFileMove') |nmap <buffer> <silent> <nowait> mm <Plug>NetrwMarkFileMove|endif
+" if !hasmapto('<Plug>NetrwMarkFilePrint') |nmap <buffer> <silent> <nowait> mp <Plug>NetrwMarkFilePrint|endif
+" if !hasmapto('<Plug>NetrwMarkFileRegexp') |nmap <buffer> <silent> <nowait> mr <Plug>NetrwMarkFileRegexp|endif
+" if !hasmapto('<Plug>NetrwMarkFileSource') |nmap <buffer> <silent> <nowait> ms <Plug>NetrwMarkFileSource|endif
+" if !hasmapto('<Plug>NetrwMarkFileTag') |nmap <buffer> <silent> <nowait> mT <Plug>NetrwMarkFileTag|endif
+" if !hasmapto('<Plug>NetrwMarkFileTgt') |nmap <buffer> <silent> <nowait> mt <Plug>NetrwMarkFileTgt|endif
+" if !hasmapto('<Plug>NetrwUnMarkFile') |nmap <buffer> <silent> <nowait> mu <Plug>NetrwUnMarkFile|endif
+" if !hasmapto('<Plug>NetrwMarkFileVimCmd') |nmap <buffer> <silent> <nowait> mv <Plug>NetrwMarkFileVimCmd|endif
+" if !hasmapto('<Plug>NetrwMarkFileExe_mx') |nmap <buffer> <silent> <nowait> mx <Plug>NetrwMarkFileExe_mx|endif
+" if !hasmapto('<Plug>NetrwMarkFileExe_mX') |nmap <buffer> <silent> <nowait> mX <Plug>NetrwMarkFileExe_mX|endif
+" if !hasmapto('<Plug>NetrwMarkFileCompress') |nmap <buffer> <silent> <nowait> mz <Plug>NetrwMarkFileCompress|endif
+" if !hasmapto('<Plug>NetrwObtain') |nmap <buffer> <silent> <nowait> O <Plug>NetrwObtain|endif
+" if !hasmapto('<Plug>NetrwSplit_o') |nmap <buffer> <silent> <nowait> o <Plug>NetrwSplit_o|endif
+" if !hasmapto('<Plug>NetrwPreview') |nmap <buffer> <silent> <nowait> p <Plug>NetrwPreview|endif
+" if !hasmapto('<Plug>NetrwPrevWinOpen') |nmap <buffer> <silent> <nowait> P <Plug>NetrwPrevWinOpen|endif
+" if !hasmapto('<Plug>NetrwBookHistHandler_qb')|nmap <buffer> <silent> <nowait> qb <Plug>NetrwBookHistHandler_qb|endif
+" if !hasmapto('<Plug>NetrwFileInfo') |nmap <buffer> <silent> <nowait> qf <Plug>NetrwFileInfo|endif
+" if !hasmapto('<Plug>NetrwMarkFileQFEL_qF') |nmap <buffer> <silent> <nowait> qF <Plug>NetrwMarkFileQFEL_qF|endif
+" if !hasmapto('<Plug>NetrwMarkFileQFEL_qL') |nmap <buffer> <silent> <nowait> qL <Plug>NetrwMarkFileQFEL_qL|endif
+" if !hasmapto('<Plug>NetrwSortStyle') |nmap <buffer> <silent> <nowait> s <Plug>NetrwSortStyle|endif
+" if !hasmapto('<Plug>NetSortSequence') |nmap <buffer> <silent> <nowait> S <Plug>NetSortSequence|endif
+" if !hasmapto('<Plug>NetrwSetTgt_Tb') |nmap <buffer> <silent> <nowait> Tb <Plug>NetrwSetTgt_Tb|endif
+" if !hasmapto('<Plug>NetrwSetTgt_Th') |nmap <buffer> <silent> <nowait> Th <Plug>NetrwSetTgt_Th|endif
+" if !hasmapto('<Plug>NetrwSplit_t') |nmap <buffer> <silent> <nowait> t <Plug>NetrwSplit_t|endif
+" if !hasmapto('<Plug>NetrwBookHistHandler_u') |nmap <buffer> <silent> <nowait> u <Plug>NetrwBookHistHandler_u|endif
+" if !hasmapto('<Plug>NetrwBookHistHandler_U') |nmap <buffer> <silent> <nowait> U <Plug>NetrwBookHistHandler_U|endif
+" if !hasmapto('<Plug>NetrwSplit_v') |nmap <buffer> <silent> <nowait> v <Plug>NetrwSplit_v|endif
+" if !hasmapto('<Plug>NetrwBrowseX') |nmap <buffer> <silent> <nowait> x <Plug>NetrwBrowseX|endif
+" if !hasmapto('<Plug>NetrwLocalExecute') |nmap <buffer> <silent> <nowait> X <Plug>NetrwLocalExecute|endif
+
+ if a:islocal
+" call Decho("make local maps",'~'.expand("<slnum>"))
+ " local normal-mode maps {{{3
+ nnoremap <buffer> <silent> <Plug>NetrwHide_a :<c-u>call <SID>NetrwHide(1)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwBrowseUpDir :<c-u>call <SID>NetrwBrowseUpDir(1)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwOpenFile :<c-u>call <SID>NetrwOpenFile(1)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwBadd_cb :<c-u>call <SID>NetrwBadd(1,0)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwBadd_cB :<c-u>call <SID>NetrwBadd(1,1)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwLcd :<c-u>call <SID>NetrwLcd(b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwSetChgwin :<c-u>call <SID>NetrwSetChgwin()<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwLocalBrowseCheck :<c-u>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwServerEdit :<c-u>call <SID>NetrwServerEdit(3,<SID>NetrwGetWord())<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwMakeDir :<c-u>call <SID>NetrwMakeDir("")<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwBookHistHandler_gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
+" ---------------------------------------------------------------------
+ nnoremap <buffer> <silent> <nowait> gd :<c-u>call <SID>NetrwForceChgDir(1,<SID>NetrwGetWord())<cr>
+ nnoremap <buffer> <silent> <nowait> gf :<c-u>call <SID>NetrwForceFile(1,<SID>NetrwGetWord())<cr>
+ nnoremap <buffer> <silent> <nowait> gh :<c-u>call <SID>NetrwHidden(1)<cr>
+ nnoremap <buffer> <silent> <nowait> gn :<c-u>call netrw#SetTreetop(0,<SID>NetrwGetWord())<cr>
+ nnoremap <buffer> <silent> <nowait> gp :<c-u>call <SID>NetrwChgPerm(1,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> I :<c-u>call <SID>NetrwBannerCtrl(1)<cr>
+ nnoremap <buffer> <silent> <nowait> i :<c-u>call <SID>NetrwListStyle(1)<cr>
+ nnoremap <buffer> <silent> <nowait> ma :<c-u>call <SID>NetrwMarkFileArgList(1,0)<cr>
+ nnoremap <buffer> <silent> <nowait> mA :<c-u>call <SID>NetrwMarkFileArgList(1,1)<cr>
+ nnoremap <buffer> <silent> <nowait> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr>
+ nnoremap <buffer> <silent> <nowait> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
+ nnoremap <buffer> <silent> <nowait> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
+ nnoremap <buffer> <silent> <nowait> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
+ nnoremap <buffer> <silent> <nowait> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mv :<c-u>call <SID>NetrwMarkFileVimCmd(1)<cr>
+ nnoremap <buffer> <silent> <nowait> mx :<c-u>call <SID>NetrwMarkFileExe(1,0)<cr>
+ nnoremap <buffer> <silent> <nowait> mX :<c-u>call <SID>NetrwMarkFileExe(1,1)<cr>
+ nnoremap <buffer> <silent> <nowait> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
+ nnoremap <buffer> <silent> <nowait> O :<c-u>call <SID>NetrwObtain(1)<cr>
+ nnoremap <buffer> <silent> <nowait> o :call <SID>NetrwSplit(3)<cr>
+ nnoremap <buffer> <silent> <nowait> p :<c-u>call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
+ nnoremap <buffer> <silent> <nowait> P :<c-u>call <SID>NetrwPrevWinOpen(1)<cr>
+ nnoremap <buffer> <silent> <nowait> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
+ 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> 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>
+ nnoremap <buffer> <silent> <nowait> t :call <SID>NetrwSplit(4)<cr>
+ nnoremap <buffer> <silent> <nowait> Th :<c-u>call <SID>NetrwSetTgt(1,'h',v:count)<cr>
+ nnoremap <buffer> <silent> <nowait> u :<c-u>call <SID>NetrwBookHistHandler(4,expand("%"))<cr>
+ nnoremap <buffer> <silent> <nowait> U :<c-u>call <SID>NetrwBookHistHandler(5,expand("%"))<cr>
+ nnoremap <buffer> <silent> <nowait> v :call <SID>NetrwSplit(5)<cr>
+ nnoremap <buffer> <silent> <nowait> x :<c-u>call netrw#BrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr>
+ nnoremap <buffer> <silent> <nowait> X :<c-u>call <SID>NetrwLocalExecute(expand("<cword>"))"<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>
+ if !hasmapto('<Plug>NetrwHideEdit')
+ nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit
+ endif
+ nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr>
+ if !hasmapto('<Plug>NetrwRefresh')
+ nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
+ endif
+ nnoremap <buffer> <silent> <Plug>NetrwRefresh <c-l>:call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,(exists("w:netrw_liststyle") && exists("w:netrw_treetop") && w:netrw_liststyle == 3)? w:netrw_treetop : './'))<cr>
+ if s:didstarstar || !mapcheck("<s-down>","n")
+ nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
+ endif
+ if s:didstarstar || !mapcheck("<s-up>","n")
+ nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
+ endif
+ if !hasmapto('<Plug>NetrwTreeSqueeze')
+ nmap <buffer> <silent> <nowait> <s-cr> <Plug>NetrwTreeSqueeze
+ endif
+ nnoremap <buffer> <silent> <Plug>NetrwTreeSqueeze :call <SID>TreeSqueezeDir(1)<cr>
+ let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape)
+ if g:netrw_mousemaps == 1
+ nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
+ nmap <buffer> <c-leftmouse> <Plug>NetrwCLeftmouse
+ nmap <buffer> <middlemouse> <Plug>NetrwMiddlemouse
+ nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
+ nmap <buffer> <s-leftdrag> <Plug>NetrwSLeftdrag
+ nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
+ imap <buffer> <leftmouse> <Plug>ILeftmouse
+ imap <buffer> <middlemouse> <Plug>IMiddlemouse
+ nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
+ nno <buffer> <silent> <Plug>NetrwCLeftmouse <leftmouse>:call <SID>NetrwCLeftmouse(1)<cr>
+ nno <buffer> <silent> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
+ nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwSLeftmouse(1)<cr>
+ nno <buffer> <silent> <Plug>NetrwSLeftdrag <leftmouse>:call <SID>NetrwSLeftdrag(1)<cr>
+ nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
+ exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+ exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+ endif
+ exe 'nnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+ exe 'nnoremap <buffer> <silent> <nowait> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+ exe 'nnoremap <buffer> <silent> <nowait> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
+ exe 'nnoremap <buffer> <silent> <nowait> d :call <SID>NetrwMakeDir("")<cr>'
+ exe 'vnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+ exe 'vnoremap <buffer> <silent> <nowait> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>'
+ exe 'vnoremap <buffer> <silent> <nowait> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>'
+ nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
+
+ " support user-specified maps
+ call netrw#UserMaps(1)
+
+ else
+ " remote normal-mode maps {{{3
+" call Decho("make remote maps",'~'.expand("<slnum>"))
+ call s:RemotePathAnalysis(b:netrw_curdir)
+ nnoremap <buffer> <silent> <Plug>NetrwHide_a :<c-u>call <SID>NetrwHide(0)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwBrowseUpDir :<c-u>call <SID>NetrwBrowseUpDir(0)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwOpenFile :<c-u>call <SID>NetrwOpenFile(0)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwBadd_cb :<c-u>call <SID>NetrwBadd(0,0)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwBadd_cB :<c-u>call <SID>NetrwBadd(0,1)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwLcd :<c-u>call <SID>NetrwLcd(b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwSetChgwin :<c-u>call <SID>NetrwSetChgwin()<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwRefresh :<c-u>call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwLocalBrowseCheck :<c-u>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwServerEdit :<c-u>call <SID>NetrwServerEdit(2,<SID>NetrwGetWord())<cr>
+ nnoremap <buffer> <silent> <Plug>NetrwBookHistHandler_gb :<c-u>call <SID>NetrwBookHistHandler(1,b:netrw_curdir)<cr>
+" ---------------------------------------------------------------------
+ nnoremap <buffer> <silent> <nowait> gd :<c-u>call <SID>NetrwForceChgDir(0,<SID>NetrwGetWord())<cr>
+ nnoremap <buffer> <silent> <nowait> gf :<c-u>call <SID>NetrwForceFile(0,<SID>NetrwGetWord())<cr>
+ nnoremap <buffer> <silent> <nowait> gh :<c-u>call <SID>NetrwHidden(0)<cr>
+ nnoremap <buffer> <silent> <nowait> gp :<c-u>call <SID>NetrwChgPerm(0,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> I :<c-u>call <SID>NetrwBannerCtrl(1)<cr>
+ nnoremap <buffer> <silent> <nowait> i :<c-u>call <SID>NetrwListStyle(0)<cr>
+ nnoremap <buffer> <silent> <nowait> ma :<c-u>call <SID>NetrwMarkFileArgList(0,0)<cr>
+ nnoremap <buffer> <silent> <nowait> mA :<c-u>call <SID>NetrwMarkFileArgList(0,1)<cr>
+ nnoremap <buffer> <silent> <nowait> mb :<c-u>call <SID>NetrwBookHistHandler(0,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> mB :<c-u>call <SID>NetrwBookHistHandler(6,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr>
+ nnoremap <buffer> <silent> <nowait> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
+ nnoremap <buffer> <silent> <nowait> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
+ nnoremap <buffer> <silent> <nowait> mF :<c-u>call <SID>NetrwUnmarkList(bufnr("%"),b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
+ nnoremap <buffer> <silent> <nowait> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mv :<c-u>call <SID>NetrwMarkFileVimCmd(0)<cr>
+ nnoremap <buffer> <silent> <nowait> mx :<c-u>call <SID>NetrwMarkFileExe(0,0)<cr>
+ nnoremap <buffer> <silent> <nowait> mX :<c-u>call <SID>NetrwMarkFileExe(0,1)<cr>
+ nnoremap <buffer> <silent> <nowait> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
+ nnoremap <buffer> <silent> <nowait> O :<c-u>call <SID>NetrwObtain(0)<cr>
+ nnoremap <buffer> <silent> <nowait> o :call <SID>NetrwSplit(0)<cr>
+ nnoremap <buffer> <silent> <nowait> p :<c-u>call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
+ nnoremap <buffer> <silent> <nowait> P :<c-u>call <SID>NetrwPrevWinOpen(0)<cr>
+ nnoremap <buffer> <silent> <nowait> qb :<c-u>call <SID>NetrwBookHistHandler(2,b:netrw_curdir)<cr>
+ 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> 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>
+ nnoremap <buffer> <silent> <nowait> t :call <SID>NetrwSplit(1)<cr>
+ nnoremap <buffer> <silent> <nowait> Th :<c-u>call <SID>NetrwSetTgt(0,'h',v:count)<cr>
+ nnoremap <buffer> <silent> <nowait> u :<c-u>call <SID>NetrwBookHistHandler(4,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> U :<c-u>call <SID>NetrwBookHistHandler(5,b:netrw_curdir)<cr>
+ nnoremap <buffer> <silent> <nowait> v :call <SID>NetrwSplit(2)<cr>
+ nnoremap <buffer> <silent> <nowait> x :<c-u>call netrw#BrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr>
+ if !hasmapto('<Plug>NetrwHideEdit')
+ nmap <buffer> <c-h> <Plug>NetrwHideEdit
+ endif
+ nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr>
+ if !hasmapto('<Plug>NetrwRefresh')
+ nmap <buffer> <c-l> <Plug>NetrwRefresh
+ endif
+ if !hasmapto('<Plug>NetrwTreeSqueeze')
+ nmap <buffer> <silent> <nowait> <s-cr> <Plug>NetrwTreeSqueeze
+ endif
+ nnoremap <buffer> <silent> <Plug>NetrwTreeSqueeze :call <SID>TreeSqueezeDir(0)<cr>
+
+ let mapsafepath = escape(s:path, s:netrw_map_escape)
+ let mapsafeusermach = escape(((s:user == "")? "" : s:user."@").s:machine, s:netrw_map_escape)
+
+ nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
+ if g:netrw_mousemaps == 1
+ nmap <buffer> <leftmouse> <Plug>NetrwLeftmouse
+ nno <buffer> <silent> <Plug>NetrwLeftmouse <leftmouse>:call <SID>NetrwLeftmouse(0)<cr>
+ nmap <buffer> <c-leftmouse> <Plug>NetrwCLeftmouse
+ nno <buffer> <silent> <Plug>NetrwCLeftmouse <leftmouse>:call <SID>NetrwCLeftmouse(0)<cr>
+ nmap <buffer> <s-leftmouse> <Plug>NetrwSLeftmouse
+ nno <buffer> <silent> <Plug>NetrwSLeftmouse <leftmouse>:call <SID>NetrwSLeftmouse(0)<cr>
+ nmap <buffer> <s-leftdrag> <Plug>NetrwSLeftdrag
+ nno <buffer> <silent> <Plug>NetrwSLeftdrag <leftmouse>:call <SID>NetrwSLeftdrag(0)<cr>
+ nmap <middlemouse> <Plug>NetrwMiddlemouse
+ nno <buffer> <silent> <middlemouse> <Plug>NetrwMiddlemouse <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr>
+ nmap <buffer> <2-leftmouse> <Plug>Netrw2Leftmouse
+ nmap <buffer> <silent> <Plug>Netrw2Leftmouse -
+ imap <buffer> <leftmouse> <Plug>ILeftmouse
+ imap <buffer> <middlemouse> <Plug>IMiddlemouse
+ imap <buffer> <s-leftmouse> <Plug>ISLeftmouse
+ exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+ exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+ endif
+ exe 'nnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+ exe 'nnoremap <buffer> <silent> <nowait> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>'
+ exe 'nnoremap <buffer> <silent> <nowait> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+ exe 'nnoremap <buffer> <silent> <nowait> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+ exe 'vnoremap <buffer> <silent> <nowait> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+ exe 'vnoremap <buffer> <silent> <nowait> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+ exe 'vnoremap <buffer> <silent> <nowait> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>'
+ nnoremap <buffer> <F1> :he netrw-quickhelp<cr>
+
+ " support user-specified maps
+ call netrw#UserMaps(0)
+ endif " }}}3
+
+" call Dret("s:NetrwMaps")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwCommands: set up commands {{{2
+" If -buffer, the command is only available from within netrw buffers
+" Otherwise, the command is available from any window, so long as netrw
+" has been used at least once in the session.
+fun! s:NetrwCommands(islocal)
+" call Dfunc("s:NetrwCommands(islocal=".a:islocal.")")
+
+ com! -nargs=* -complete=file -bang NetrwMB call s:NetrwBookmark(<bang>0,<f-args>)
+ com! -nargs=* NetrwC call s:NetrwSetChgwin(<q-args>)
+ com! Rexplore if exists("w:netrw_rexlocal")|call s:NetrwRexplore(w:netrw_rexlocal,exists("w:netrw_rexdir")? w:netrw_rexdir : ".")|else|call netrw#ErrorMsg(s:WARNING,"win#".winnr()." not a former netrw window",79)|endif
+ if a:islocal
+ com! -buffer -nargs=+ -complete=file MF call s:NetrwMarkFiles(1,<f-args>)
+ else
+ com! -buffer -nargs=+ -complete=file MF call s:NetrwMarkFiles(0,<f-args>)
+ endif
+ com! -buffer -nargs=? -complete=file MT call s:NetrwMarkTarget(<q-args>)
+
+" call Dret("s:NetrwCommands")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFiles: apply s:NetrwMarkFile() to named file(s) {{{2
+" glob()ing only works with local files
+fun! s:NetrwMarkFiles(islocal,...)
+" call Dfunc("s:NetrwMarkFiles(islocal=".a:islocal."...) a:0=".a:0)
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let i = 1
+ while i <= a:0
+ if a:islocal
+ if v:version > 704 || (v:version == 704 && has("patch656"))
+ let mffiles= glob(a:{i},0,1,1)
+ else
+ let mffiles= glob(a:{i},0,1)
+ endif
+ else
+ let mffiles= [a:{i}]
+ endif
+" call Decho("mffiles".string(mffiles),'~'.expand("<slnum>"))
+ for mffile in mffiles
+" call Decho("mffile<".mffile.">",'~'.expand("<slnum>"))
+ call s:NetrwMarkFile(a:islocal,mffile)
+ endfor
+ let i= i + 1
+ endwhile
+" call Dret("s:NetrwMarkFiles")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkTarget: implements :MT (mark target) {{{2
+fun! s:NetrwMarkTarget(...)
+" call Dfunc("s:NetrwMarkTarget() a:0=".a:0)
+ if a:0 == 0 || (a:0 == 1 && a:1 == "")
+ let curdir = s:NetrwGetCurdir(1)
+ let tgt = b:netrw_curdir
+ else
+ let curdir = s:NetrwGetCurdir((a:1 =~ '^\a\{3,}://')? 0 : 1)
+ let tgt = a:1
+ endif
+" call Decho("tgt<".tgt.">",'~'.expand("<slnum>"))
+ let s:netrwmftgt = tgt
+ let s:netrwmftgt_islocal = tgt !~ '^\a\{3,}://'
+ let curislocal = b:netrw_curdir !~ '^\a\{3,}://'
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call s:NetrwRefresh(curislocal,s:NetrwBrowseChgDir(curislocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call winrestview(svpos)
+" call Dret("s:NetrwMarkTarget")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
+" mark and unmark files. If a markfile list exists,
+" then the rename and delete functions will use it instead
+" of whatever may happen to be under the cursor at that
+" moment. When the mouse and gui are available,
+" shift-leftmouse may also be used to mark files.
+"
+" Creates two lists
+" s:netrwmarkfilelist -- holds complete paths to all marked files
+" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
+"
+" Creates a marked file match string
+" s:netrwmarfilemtch_# -- used with 2match to display marked files
+"
+" Creates a buffer version of islocal
+" b:netrw_islocal
+fun! s:NetrwMarkFile(islocal,fname)
+" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
+" call Decho("bufnr(%)=".bufnr("%").": ".bufname("%"),'~'.expand("<slnum>"))
+
+ " sanity check
+ if empty(a:fname)
+" call Dret("s:NetrwMarkFile : empty fname")
+ return
+ endif
+ let curdir = s:NetrwGetCurdir(a:islocal)
+
+ let ykeep = @@
+ let curbufnr= bufnr("%")
+ if a:fname =~ '^\a'
+ let leader= '\<'
+ else
+ let leader= ''
+ endif
+ if a:fname =~ '\a$'
+ let trailer = '\>[@=|\/\*]\=\ze\%( \|\t\|$\)'
+ else
+ let trailer = '[@=|\/\*]\=\ze\%( \|\t\|$\)'
+ endif
+
+ if exists("s:netrwmarkfilelist_".curbufnr)
+ " markfile list pre-exists
+" call Decho("case s:netrwmarkfilelist_".curbufnr." already exists",'~'.expand("<slnum>"))
+" call Decho("starting s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
+" call Decho("starting s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">",'~'.expand("<slnum>"))
+ let b:netrw_islocal= a:islocal
+
+ if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
+ " append filename to buffer's markfilelist
+" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
+ call add(s:netrwmarkfilelist_{curbufnr},a:fname)
+ let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|'.leader.escape(a:fname,g:netrw_markfileesc).trailer
+
+ else
+ " remove filename from buffer's markfilelist
+" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
+ call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
+ if s:netrwmarkfilelist_{curbufnr} == []
+ " local markfilelist is empty; remove it entirely
+" call Decho("markfile list now empty",'~'.expand("<slnum>"))
+ call s:NetrwUnmarkList(curbufnr,curdir)
+ else
+ " rebuild match list to display markings correctly
+" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr,'~'.expand("<slnum>"))
+ let s:netrwmarkfilemtch_{curbufnr}= ""
+ let first = 1
+ for fname in s:netrwmarkfilelist_{curbufnr}
+ if first
+ let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.leader.escape(fname,g:netrw_markfileesc).trailer
+ else
+ let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|'.leader.escape(fname,g:netrw_markfileesc).trailer
+ endif
+ let first= 0
+ endfor
+" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
+ endif
+ endif
+
+ else
+ " initialize new markfilelist
+" call Decho("case: initialize new markfilelist",'~'.expand("<slnum>"))
+
+" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr,'~'.expand("<slnum>"))
+ let s:netrwmarkfilelist_{curbufnr}= []
+ call add(s:netrwmarkfilelist_{curbufnr},substitute(a:fname,'[|@]$','',''))
+" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">",'~'.expand("<slnum>"))
+
+ " build initial markfile matching pattern
+ if a:fname =~ '/$'
+ let s:netrwmarkfilemtch_{curbufnr}= leader.escape(a:fname,g:netrw_markfileesc)
+ else
+ let s:netrwmarkfilemtch_{curbufnr}= leader.escape(a:fname,g:netrw_markfileesc).trailer
+ endif
+" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">",'~'.expand("<slnum>"))
+ endif
+
+ " handle global markfilelist
+ if exists("s:netrwmarkfilelist")
+ let dname= s:ComposePath(b:netrw_curdir,a:fname)
+ if index(s:netrwmarkfilelist,dname) == -1
+ " append new filename to global markfilelist
+ call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
+" call Decho("append filename<".a:fname."> to global s:markfilelist<".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
+ else
+ " remove new filename from global markfilelist
+" call Decho("remove new filename from global s:markfilelist",'~'.expand("<slnum>"))
+" call Decho("..filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")",'~'.expand("<slnum>"))
+ call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
+" call Decho("..ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
+ if s:netrwmarkfilelist == []
+" call Decho("s:netrwmarkfilelist is empty; unlet it",'~'.expand("<slnum>"))
+ unlet s:netrwmarkfilelist
+ endif
+ endif
+ else
+ " initialize new global-directory markfilelist
+ let s:netrwmarkfilelist= []
+ call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
+" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
+ endif
+
+ " set up 2match'ing to netrwmarkfilemtch_# list
+ if has("syntax") && exists("g:syntax_on") && g:syntax_on
+ if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
+" " call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/",'~'.expand("<slnum>"))
+ if exists("g:did_drchip_netrwlist_syntax")
+ exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
+ endif
+ else
+" " call Decho("2match none",'~'.expand("<slnum>"))
+ 2match none
+ endif
+ endif
+ let @@= ykeep
+" call Decho("s:netrwmarkfilelist[".(exists("s:netrwmarkfilelist")? string(s:netrwmarkfilelist) : "")."] (avail in all buffers)",'~'.expand("<slnum>"))
+" call Dret("s:NetrwMarkFile : s:netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist")."> (buf#".curbufnr."list)")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileArgList: ma: move the marked file list to the argument list (tomflist=0) {{{2
+" mA: move the argument list to marked file list (tomflist=1)
+" Uses the global marked file list
+fun! s:NetrwMarkFileArgList(islocal,tomflist)
+" call Dfunc("s:NetrwMarkFileArgList(islocal=".a:islocal.",tomflist=".a:tomflist.")")
+
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let curbufnr = bufnr("%")
+
+ if a:tomflist
+ " mA: move argument list to marked file list
+ while argc()
+ let fname= argv(0)
+" call Decho("exe argdel ".fname,'~'.expand("<slnum>"))
+ exe "argdel ".fnameescape(fname)
+ call s:NetrwMarkFile(a:islocal,fname)
+ endwhile
+
+ else
+ " ma: move marked file list to argument list
+ if exists("s:netrwmarkfilelist")
+
+ " for every filename in the marked list
+ for fname in s:netrwmarkfilelist
+" call Decho("exe argadd ".fname,'~'.expand("<slnum>"))
+ exe "argadd ".fnameescape(fname)
+ endfor " for every file in the marked list
+
+ " unmark list and refresh
+ call s:NetrwUnmarkList(curbufnr,curdir)
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ endif
+ endif
+
+" call Dret("s:NetrwMarkFileArgList")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2
+" compress/decompress files using the programs
+" in g:netrw_compress and g:netrw_uncompress,
+" using g:netrw_compress_suffix to know which to
+" do. By default:
+" g:netrw_compress = "gzip"
+" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf", ".xz" : "unxz"}
+fun! s:NetrwMarkFileCompress(islocal)
+" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let curbufnr = bufnr("%")
+
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFileCompress")
+ return
+ endif
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+
+ if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
+
+ " for every filename in the marked list
+ for fname in s:netrwmarkfilelist_{curbufnr}
+ let sfx= substitute(fname,'^.\{-}\(\.\a\+\)$','\1','')
+" call Decho("extracted sfx<".sfx.">",'~'.expand("<slnum>"))
+ if exists("g:netrw_decompress['".sfx."']")
+ " fname has a suffix indicating that its compressed; apply associated decompression routine
+ let exe= g:netrw_decompress[sfx]
+" call Decho("fname<".fname."> is compressed so decompress with <".exe.">",'~'.expand("<slnum>"))
+ let exe= netrw#WinPath(exe)
+ if a:islocal
+ if g:netrw_keepdir
+ let fname= s:ShellEscape(s:ComposePath(curdir,fname))
+ endif
+ call system(exe." ".fname)
+ if v:shell_error
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50)
+ endif
+ else
+ let fname= s:ShellEscape(b:netrw_curdir.fname,1)
+ NetrwKeepj call s:RemoteSystem(exe." ".fname)
+ endif
+
+ endif
+ unlet sfx
+
+ if exists("exe")
+ unlet exe
+ elseif a:islocal
+ " fname not a compressed file, so compress it
+ call system(netrw#WinPath(g:netrw_compress)." ".s:ShellEscape(s:ComposePath(b:netrw_curdir,fname)))
+ if v:shell_error
+ call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_compress<".g:netrw_compress."> to something that works",104)
+ endif
+ else
+ " fname not a compressed file, so compress it
+ NetrwKeepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".s:ShellEscape(fname))
+ endif
+ endfor " for every file in the marked list
+
+ call s:NetrwUnmarkList(curbufnr,curdir)
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ endif
+" call Dret("s:NetrwMarkFileCompress")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
+" If no marked files, then set up directory as the
+" target. Currently does not support copying entire
+" directories. Uses the local-buffer marked file list.
+" Returns 1=success (used by NetrwMarkFileMove())
+" 0=failure
+fun! s:NetrwMarkFileCopy(islocal,...)
+" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---')."> a:0=".a:0)
+
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let curbufnr = bufnr("%")
+ if b:netrw_curdir !~ '/$'
+ if !exists("b:netrw_curdir")
+ let b:netrw_curdir= curdir
+ endif
+ let b:netrw_curdir= b:netrw_curdir."/"
+ endif
+
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFileCopy")
+ return
+ endif
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+
+ if !exists("s:netrwmftgt")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67)
+" call Dret("s:NetrwMarkFileCopy 0")
+ return 0
+ endif
+" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
+
+ if a:islocal && s:netrwmftgt_islocal
+ " Copy marked files, local directory to local directory
+" call Decho("copy from local to local",'~'.expand("<slnum>"))
+ if !executable(g:netrw_localcopycmd)
+ call netrw#ErrorMsg(s:ERROR,"g:netrw_localcopycmd<".g:netrw_localcopycmd."> not executable on your system, aborting",91)
+" call Dfunc("s:NetrwMarkFileMove : g:netrw_localcopycmd<".g:netrw_localcopycmd."> n/a!")
+ return
+ endif
+
+ " copy marked files while within the same directory (ie. allow renaming)
+ if simplify(s:netrwmftgt) == simplify(b:netrw_curdir)
+ if len(s:netrwmarkfilelist_{bufnr('%')}) == 1
+ " only one marked file
+" call Decho("case: only one marked file",'~'.expand("<slnum>"))
+ let args = s:ShellEscape(b:netrw_curdir.s:netrwmarkfilelist_{bufnr('%')}[0])
+ let oldname = s:netrwmarkfilelist_{bufnr('%')}[0]
+ elseif a:0 == 1
+" call Decho("case: handling one input argument",'~'.expand("<slnum>"))
+ " this happens when the next case was used to recursively call s:NetrwMarkFileCopy()
+ let args = s:ShellEscape(b:netrw_curdir.a:1)
+ let oldname = a:1
+ else
+ " copy multiple marked files inside the same directory
+" call Decho("case: handling a multiple marked files",'~'.expand("<slnum>"))
+ let s:recursive= 1
+ for oldname in s:netrwmarkfilelist_{bufnr("%")}
+ let ret= s:NetrwMarkFileCopy(a:islocal,oldname)
+ if ret == 0
+ break
+ endif
+ endfor
+ unlet s:recursive
+ call s:NetrwUnmarkList(curbufnr,curdir)
+" call Dret("s:NetrwMarkFileCopy ".ret)
+ return ret
+ endif
+
+ call inputsave()
+ let newname= input("Copy ".oldname." to : ",oldname,"file")
+ call inputrestore()
+ if newname == ""
+" call Dret("s:NetrwMarkFileCopy 0")
+ return 0
+ endif
+ let args= s:ShellEscape(oldname)
+ let tgt = s:ShellEscape(s:netrwmftgt.'/'.newname)
+ else
+ let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"s:ShellEscape(b:netrw_curdir.\"/\".v:val)"))
+ let tgt = s:ShellEscape(s:netrwmftgt)
+ endif
+ if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
+ let args= substitute(args,'/','\\','g')
+ let tgt = substitute(tgt, '/','\\','g')
+ endif
+ if args =~ "'" |let args= substitute(args,"'\\(.*\\)'",'\1','')|endif
+ if tgt =~ "'" |let tgt = substitute(tgt ,"'\\(.*\\)'",'\1','')|endif
+ if args =~ '//'|let args= substitute(args,'//','/','g')|endif
+ if tgt =~ '//'|let tgt = substitute(tgt ,'//','/','g')|endif
+" call Decho("args <".args.">",'~'.expand("<slnum>"))
+" call Decho("tgt <".tgt.">",'~'.expand("<slnum>"))
+ if isdirectory(s:NetrwFile(args))
+" call Decho("args<".args."> is a directory",'~'.expand("<slnum>"))
+ let copycmd= g:netrw_localcopydircmd
+" call Decho("using copydircmd<".copycmd.">",'~'.expand("<slnum>"))
+ if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
+ " window's xcopy doesn't copy a directory to a target properly. Instead, it copies a directory's
+ " contents to a target. One must append the source directory name to the target to get xcopy to
+ " do the right thing.
+ let tgt= tgt.'\'.substitute(a:1,'^.*[\\/]','','')
+" call Decho("modified tgt for xcopy",'~'.expand("<slnum>"))
+ endif
+ else
+ let copycmd= g:netrw_localcopycmd
+ endif
+ if g:netrw_localcopycmd =~ '\s'
+ let copycmd = substitute(copycmd,'\s.*$','','')
+ let copycmdargs = substitute(copycmd,'^.\{-}\(\s.*\)$','\1','')
+ let copycmd = netrw#WinPath(copycmd).copycmdargs
+ else
+ let copycmd = netrw#WinPath(copycmd)
+ endif
+" call Decho("args <".args.">",'~'.expand("<slnum>"))
+" call Decho("tgt <".tgt.">",'~'.expand("<slnum>"))
+" call Decho("copycmd<".copycmd.">",'~'.expand("<slnum>"))
+" call Decho("system(".copycmd." '".args."' '".tgt."')",'~'.expand("<slnum>"))
+ call system(copycmd.g:netrw_localcopycmdopt." '".args."' '".tgt."'")
+ if v:shell_error != 0
+ if exists("b:netrw_curdir") && b:netrw_curdir != getcwd() && !g:netrw_keepdir
+ call netrw#ErrorMsg(s:ERROR,"copy failed; perhaps due to vim's current directory<".getcwd()."> not matching netrw's (".b:netrw_curdir.") (see :help netrw-cd)",101)
+ else
+ call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localcopycmd<".g:netrw_localcopycmd.">; it doesn't work!",80)
+ endif
+" call Dret("s:NetrwMarkFileCopy 0 : failed: system(".g:netrw_localcopycmd." ".args." ".s:ShellEscape(s:netrwmftgt))
+ return 0
+ endif
+
+ elseif a:islocal && !s:netrwmftgt_islocal
+ " Copy marked files, local directory to remote directory
+" call Decho("copy from local to remote",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
+
+ elseif !a:islocal && s:netrwmftgt_islocal
+ " Copy marked files, remote directory to local directory
+" call Decho("copy from remote to local",'~'.expand("<slnum>"))
+ NetrwKeepj call netrw#Obtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
+
+ elseif !a:islocal && !s:netrwmftgt_islocal
+ " Copy marked files, remote directory to remote directory
+" call Decho("copy from remote to remote",'~'.expand("<slnum>"))
+ let curdir = getcwd()
+ let tmpdir = s:GetTempfile("")
+ if tmpdir !~ '/'
+ let tmpdir= curdir."/".tmpdir
+ endif
+ if exists("*mkdir")
+ call mkdir(tmpdir)
+ else
+ call s:NetrwExe("sil! !".g:netrw_localmkdir.g:netrw_localmkdiropt.' '.s:ShellEscape(tmpdir,1))
+ if v:shell_error != 0
+ call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80)
+" call Dret("s:NetrwMarkFileCopy : failed: sil! !".g:netrw_localmkdir.' '.s:ShellEscape(tmpdir,1) )
+ return
+ endif
+ endif
+ if isdirectory(s:NetrwFile(tmpdir))
+ if s:NetrwLcd(tmpdir)
+" call Dret("s:NetrwMarkFileCopy : lcd failure")
+ return
+ endif
+ NetrwKeepj call netrw#Obtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
+ let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
+ NetrwKeepj call s:NetrwUpload(localfiles,s:netrwmftgt)
+ if getcwd() == tmpdir
+ for fname in s:netrwmarkfilelist_{bufnr('%')}
+ NetrwKeepj call s:NetrwDelete(fname)
+ endfor
+ if s:NetrwLcd(curdir)
+" call Dret("s:NetrwMarkFileCopy : lcd failure")
+ return
+ endif
+ if delete(tmpdir,"d")
+ call netrw#ErrorMsg(s:ERROR,"unable to delete directory <".tmpdir.">!",103)
+ endif
+ else
+ if s:NetrwLcd(curdir)
+" call Dret("s:NetrwMarkFileCopy : lcd failure")
+ return
+ endif
+ endif
+ endif
+ endif
+
+ " -------
+ " 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>"))
+" call Decho(" curdir =".curdir,'~'.expand("<slnum>"))
+" call Decho(" a:islocal =".a:islocal,'~'.expand("<slnum>"))
+" call Decho(" curbufnr =".curbufnr,'~'.expand("<slnum>"))
+ if exists("s:recursive")
+" call Decho(" s:recursive =".s:recursive,'~'.expand("<slnum>"))
+ else
+" call Decho(" s:recursive =n/a",'~'.expand("<slnum>"))
+ endif
+ " see s:LocalFastBrowser() for g:netrw_fastbrowse interpretation (refreshing done for both slow and medium)
+ if g:netrw_fastbrowse <= 1
+ NetrwKeepj call s:LocalBrowseRefresh()
+ else
+ " refresh local and targets for fast browsing
+ if !exists("s:recursive")
+ " remove markings from local buffer
+" call Decho(" remove markings from local buffer",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwUnmarkList(curbufnr,curdir)
+ endif
+
+ " refresh buffers
+ if s:netrwmftgt_islocal
+" call Decho(" refresh s:netrwmftgt=".s:netrwmftgt,'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
+ endif
+ if a:islocal && s:netrwmftgt != curdir
+" call Decho(" refresh curdir=".curdir,'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwRefreshDir(a:islocal,curdir)
+ endif
+ endif
+
+" call Dret("s:NetrwMarkFileCopy 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
+" invoke vim's diff mode on the marked files.
+" Either two or three files can be so handled.
+" Uses the global marked file list.
+fun! s:NetrwMarkFileDiff(islocal)
+" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
+ let curbufnr= bufnr("%")
+
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFileDiff")
+ return
+ endif
+ let curdir= s:NetrwGetCurdir(a:islocal)
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+
+ if exists("s:netrwmarkfilelist_{".curbufnr."}")
+ let cnt = 0
+ for fname in s:netrwmarkfilelist
+ let cnt= cnt + 1
+ if cnt == 1
+" call Decho("diffthis: fname<".fname.">",'~'.expand("<slnum>"))
+ exe "NetrwKeepj e ".fnameescape(fname)
+ diffthis
+ elseif cnt == 2 || cnt == 3
+ vsplit
+ wincmd l
+" call Decho("diffthis: ".fname,'~'.expand("<slnum>"))
+ exe "NetrwKeepj e ".fnameescape(fname)
+ diffthis
+ else
+ break
+ endif
+ endfor
+ call s:NetrwUnmarkList(curbufnr,curdir)
+ endif
+
+" call Dret("s:NetrwMarkFileDiff")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
+" Uses global markfilelist
+fun! s:NetrwMarkFileEdit(islocal)
+" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
+
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let curbufnr = bufnr("%")
+
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFileEdit")
+ return
+ endif
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+ call s:SetRexDir(a:islocal,curdir)
+ let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
+ " unmark markedfile list
+" call s:NetrwUnmarkList(curbufnr,curdir)
+ call s:NetrwUnmarkAll()
+" call Decho("exe sil args ".flist,'~'.expand("<slnum>"))
+ exe "sil args ".flist
+ endif
+ echo "(use :bn, :bp to navigate files; :Rex to return)"
+
+" call Dret("s:NetrwMarkFileEdit")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileQFEL: convert a quickfix-error or location list into a marked file list {{{2
+fun! s:NetrwMarkFileQFEL(islocal,qfel)
+" call Dfunc("s:NetrwMarkFileQFEL(islocal=".a:islocal.",qfel)")
+ call s:NetrwUnmarkAll()
+ let curbufnr= bufnr("%")
+
+ if !empty(a:qfel)
+ for entry in a:qfel
+ let bufnmbr= entry["bufnr"]
+" call Decho("bufname(".bufnmbr.")<".bufname(bufnmbr)."> line#".entry["lnum"]." text=".entry["text"],'~'.expand("<slnum>"))
+ if !exists("s:netrwmarkfilelist_{curbufnr}")
+" call Decho("case: no marked file list",'~'.expand("<slnum>"))
+ call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
+ elseif index(s:netrwmarkfilelist_{curbufnr},bufname(bufnmbr)) == -1
+ " s:NetrwMarkFile will remove duplicate entries from the marked file list.
+ " So, this test lets two or more hits on the same pattern to be ignored.
+" call Decho("case: ".bufname(bufnmbr)." not currently in marked file list",'~'.expand("<slnum>"))
+ call s:NetrwMarkFile(a:islocal,bufname(bufnmbr))
+ else
+" call Decho("case: ".bufname(bufnmbr)." already in marked file list",'~'.expand("<slnum>"))
+ endif
+ endfor
+ echo "(use me to edit marked files)"
+ else
+ call netrw#ErrorMsg(s:WARNING,"can't convert quickfix error list; its empty!",92)
+ endif
+
+" call Dret("s:NetrwMarkFileQFEL")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileExe: (invoked by mx and mX) execute arbitrary system command on marked files {{{2
+" mx enbloc=0: Uses the local marked-file list, applies command to each file individually
+" mX enbloc=1: Uses the global marked-file list, applies command to entire list
+fun! s:NetrwMarkFileExe(islocal,enbloc)
+" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.",enbloc=".a:enbloc.")")
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let curbufnr = bufnr("%")
+
+ if a:enbloc == 0
+ " individually apply command to files, one at a time
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFileExe")
+ return
+ endif
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+ " get the command
+ call inputsave()
+ let cmd= input("Enter command: ","","file")
+ call inputrestore()
+" call Decho("cmd<".cmd.">",'~'.expand("<slnum>"))
+ if cmd == ""
+" call Dret("s:NetrwMarkFileExe : early exit, empty command")
+ return
+ endif
+
+ " apply command to marked files, individually. Substitute: filename -> %
+ " If no %, then append a space and the filename to the command
+ for fname in s:netrwmarkfilelist_{curbufnr}
+ if a:islocal
+ if g:netrw_keepdir
+ let fname= s:ShellEscape(netrw#WinPath(s:ComposePath(curdir,fname)))
+ endif
+ else
+ let fname= s:ShellEscape(netrw#WinPath(b:netrw_curdir.fname))
+ endif
+ if cmd =~ '%'
+ let xcmd= substitute(cmd,'%',fname,'g')
+ else
+ let xcmd= cmd.' '.fname
+ endif
+ if a:islocal
+" call Decho("local: xcmd<".xcmd.">",'~'.expand("<slnum>"))
+ let ret= system(xcmd)
+ else
+" call Decho("remote: xcmd<".xcmd.">",'~'.expand("<slnum>"))
+ let ret= s:RemoteSystem(xcmd)
+ endif
+ if v:shell_error < 0
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
+ break
+ else
+ echo ret
+ endif
+ endfor
+
+ " unmark marked file list
+ call s:NetrwUnmarkList(curbufnr,curdir)
+
+ " refresh the listing
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ else
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
+ endif
+
+ else " apply command to global list of files, en bloc
+
+ call inputsave()
+ let cmd= input("Enter command: ","","file")
+ call inputrestore()
+" call Decho("cmd<".cmd.">",'~'.expand("<slnum>"))
+ if cmd == ""
+" call Dret("s:NetrwMarkFileExe : early exit, empty command")
+ return
+ endif
+ if cmd =~ '%'
+ let cmd= substitute(cmd,'%',join(map(s:netrwmarkfilelist,'s:ShellEscape(v:val)'),' '),'g')
+ else
+ let cmd= cmd.' '.join(map(s:netrwmarkfilelist,'s:ShellEscape(v:val)'),' ')
+ endif
+ if a:islocal
+ call system(cmd)
+ if v:shell_error < 0
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
+ endif
+ else
+ let ret= s:RemoteSystem(cmd)
+ endif
+ call s:NetrwUnmarkAll()
+
+ " refresh the listing
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+
+ endif
+
+" call Dret("s:NetrwMarkFileExe")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
+" as the marked file(s) (toggles suffix presence)
+" Uses the local marked file list.
+fun! s:NetrwMarkHideSfx(islocal)
+" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curbufnr = bufnr("%")
+
+ " s:netrwmarkfilelist_{curbufnr}: the List of marked files
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+
+ for fname in s:netrwmarkfilelist_{curbufnr}
+" call Decho("s:NetrwMarkFileCopy: fname<".fname.">",'~'.expand("<slnum>"))
+ " construct suffix pattern
+ if fname =~ '\.'
+ let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
+ else
+ let sfxpat= '^\%(\%(\.\)\@!.\)*$'
+ endif
+ " determine if its in the hiding list or not
+ let inhidelist= 0
+ if g:netrw_list_hide != ""
+ let itemnum = 0
+ let hidelist= split(g:netrw_list_hide,',')
+ for hidepat in hidelist
+ if sfxpat == hidepat
+ let inhidelist= 1
+ break
+ endif
+ let itemnum= itemnum + 1
+ endfor
+ endif
+" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">",'~'.expand("<slnum>"))
+ if inhidelist
+ " remove sfxpat from list
+ call remove(hidelist,itemnum)
+ let g:netrw_list_hide= join(hidelist,",")
+ elseif g:netrw_list_hide != ""
+ " append sfxpat to non-empty list
+ let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
+ else
+ " set hiding list to sfxpat
+ let g:netrw_list_hide= sfxpat
+ endif
+ endfor
+
+ " refresh the listing
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ else
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
+ endif
+
+" call Dret("s:NetrwMarkHideSfx")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileVimCmd: (invoked by mv) execute arbitrary vim command on marked files, one at a time {{{2
+" Uses the local marked-file list.
+fun! s:NetrwMarkFileVimCmd(islocal)
+" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")")
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let curbufnr = bufnr("%")
+
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFileVimCmd")
+ return
+ endif
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+ " get the command
+ call inputsave()
+ let cmd= input("Enter vim command: ","","file")
+ call inputrestore()
+" call Decho("cmd<".cmd.">",'~'.expand("<slnum>"))
+ if cmd == ""
+" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command")
+ return
+ endif
+
+ " apply command to marked files. Substitute: filename -> %
+ " If no %, then append a space and the filename to the command
+ for fname in s:netrwmarkfilelist_{curbufnr}
+" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
+ if a:islocal
+ 1split
+ exe "sil! NetrwKeepj keepalt e ".fnameescape(fname)
+" call Decho("local<".fname.">: exe ".cmd,'~'.expand("<slnum>"))
+ exe cmd
+ exe "sil! keepalt wq!"
+ else
+" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET",'~'.expand("<slnum>"))
+ echo "sorry, \"mv\" not supported yet for remote files"
+ endif
+ endfor
+
+ " unmark marked file list
+ call s:NetrwUnmarkList(curbufnr,curdir)
+
+ " refresh the listing
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ else
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
+ endif
+
+" call Dret("s:NetrwMarkFileVimCmd")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
+" as the marked file(s) (toggles suffix presence)
+" Uses the local marked file list.
+fun! s:NetrwMarkHideSfx(islocal)
+" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curbufnr = bufnr("%")
+
+ " s:netrwmarkfilelist_{curbufnr}: the List of marked files
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+
+ for fname in s:netrwmarkfilelist_{curbufnr}
+" call Decho("s:NetrwMarkFileCopy: fname<".fname.">",'~'.expand("<slnum>"))
+ " construct suffix pattern
+ if fname =~ '\.'
+ let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
+ else
+ let sfxpat= '^\%(\%(\.\)\@!.\)*$'
+ endif
+ " determine if its in the hiding list or not
+ let inhidelist= 0
+ if g:netrw_list_hide != ""
+ let itemnum = 0
+ let hidelist= split(g:netrw_list_hide,',')
+ for hidepat in hidelist
+ if sfxpat == hidepat
+ let inhidelist= 1
+ break
+ endif
+ let itemnum= itemnum + 1
+ endfor
+ endif
+" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">",'~'.expand("<slnum>"))
+ if inhidelist
+ " remove sfxpat from list
+ call remove(hidelist,itemnum)
+ let g:netrw_list_hide= join(hidelist,",")
+ elseif g:netrw_list_hide != ""
+ " append sfxpat to non-empty list
+ let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
+ else
+ " set hiding list to sfxpat
+ let g:netrw_list_hide= sfxpat
+ endif
+ endfor
+
+ " refresh the listing
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ else
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
+ endif
+
+" call Dret("s:NetrwMarkHideSfx")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
+" Uses the global markfilelist
+fun! s:NetrwMarkFileGrep(islocal)
+" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curbufnr = bufnr("%")
+ let curdir = s:NetrwGetCurdir(a:islocal)
+
+ if exists("s:netrwmarkfilelist")
+" call Decho("using s:netrwmarkfilelist".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
+ let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)"))
+" call Decho("keeping copy of s:netrwmarkfilelist in function-local variable,'~'.expand("<slnum>"))"
+ call s:NetrwUnmarkAll()
+ else
+" call Decho('no marked files, using "*"','~'.expand("<slnum>"))
+ let netrwmarkfilelist= "*"
+ endif
+
+ " ask user for pattern
+" call Decho("ask user for search pattern",'~'.expand("<slnum>"))
+ call inputsave()
+ let pat= input("Enter pattern: ","")
+ call inputrestore()
+ let patbang = ""
+ if pat =~ '^!'
+ let patbang = "!"
+ let pat = strpart(pat,2)
+ endif
+ if pat =~ '^\i'
+ let pat = escape(pat,'/')
+ let pat = '/'.pat.'/'
+ else
+ let nonisi = pat[0]
+ endif
+
+ " use vimgrep for both local and remote
+" call Decho("exe vimgrep".patbang." ".pat." ".netrwmarkfilelist,'~'.expand("<slnum>"))
+ try
+ exe "NetrwKeepj noautocmd vimgrep".patbang." ".pat." ".netrwmarkfilelist
+ catch /^Vim\%((\a\+)\)\=:E480/
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pat.">",76)
+" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pat.">")
+ return
+ endtry
+ echo "(use :cn, :cp to navigate, :Rex to return)"
+
+ 2match none
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+
+ 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$'
+ call s:NetrwMarkFileQFEL(a:islocal,getqflist())
+ endif
+ endif
+
+" call Dret("s:NetrwMarkFileGrep")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
+" uses the global marked file list
+" s:netrwmfloc= 0: target directory is remote
+" = 1: target directory is local
+fun! s:NetrwMarkFileMove(islocal)
+" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let curbufnr = bufnr("%")
+
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFileMove")
+ return
+ endif
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+
+ if !exists("s:netrwmftgt")
+ NetrwKeepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
+" call Dret("s:NetrwMarkFileCopy 0")
+ return 0
+ endif
+" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
+
+ if a:islocal && s:netrwmftgt_islocal
+ " move: local -> local
+" call Decho("move from local to local",'~'.expand("<slnum>"))
+" call Decho("local to local move",'~'.expand("<slnum>"))
+ if !executable(g:netrw_localmovecmd)
+ call netrw#ErrorMsg(s:ERROR,"g:netrw_localmovecmd<".g:netrw_localmovecmd."> not executable on your system, aborting",90)
+" call Dfunc("s:NetrwMarkFileMove : g:netrw_localmovecmd<".g:netrw_localmovecmd."> n/a!")
+ return
+ endif
+ let tgt = s:ShellEscape(s:netrwmftgt)
+" call Decho("tgt<".tgt.">",'~'.expand("<slnum>"))
+ if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
+ let tgt= substitute(tgt, '/','\\','g')
+" call Decho("windows exception: tgt<".tgt.">",'~'.expand("<slnum>"))
+ if g:netrw_localmovecmd =~ '\s'
+ let movecmd = substitute(g:netrw_localmovecmd,'\s.*$','','')
+ let movecmdargs = substitute(g:netrw_localmovecmd,'^.\{-}\(\s.*\)$','\1','')
+ let movecmd = netrw#WinPath(movecmd).movecmdargs
+" call Decho("windows exception: movecmd<".movecmd."> (#1: had a space)",'~'.expand("<slnum>"))
+ else
+ let movecmd = netrw#WinPath(movecmd)
+" call Decho("windows exception: movecmd<".movecmd."> (#2: no space)",'~'.expand("<slnum>"))
+ endif
+ else
+ let movecmd = netrw#WinPath(g:netrw_localmovecmd)
+" call Decho("movecmd<".movecmd."> (#3 linux or cygwin)",'~'.expand("<slnum>"))
+ endif
+ for fname in s:netrwmarkfilelist_{bufnr("%")}
+ if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
+ let fname= substitute(fname,'/','\\','g')
+ endif
+" call Decho("system(".movecmd." ".s:ShellEscape(fname)." ".tgt.")",'~'.expand("<slnum>"))
+ let ret= system(movecmd.g:netrw_localmovecmdopt." ".s:ShellEscape(fname)." ".tgt)
+ if v:shell_error != 0
+ if exists("b:netrw_curdir") && b:netrw_curdir != getcwd() && !g:netrw_keepdir
+ call netrw#ErrorMsg(s:ERROR,"move failed; perhaps due to vim's current directory<".getcwd()."> not matching netrw's (".b:netrw_curdir.") (see :help netrw-cd)",100)
+ else
+ call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localmovecmd<".g:netrw_localmovecmd.">; it doesn't work!",54)
+ endif
+ break
+ endif
+ endfor
+
+ elseif a:islocal && !s:netrwmftgt_islocal
+ " move: local -> remote
+" call Decho("move from local to remote",'~'.expand("<slnum>"))
+" call Decho("copy",'~'.expand("<slnum>"))
+ let mflist= s:netrwmarkfilelist_{bufnr("%")}
+ NetrwKeepj call s:NetrwMarkFileCopy(a:islocal)
+" call Decho("remove",'~'.expand("<slnum>"))
+ for fname in mflist
+ let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
+ let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
+ endfor
+ unlet mflist
+
+ elseif !a:islocal && s:netrwmftgt_islocal
+ " move: remote -> local
+" call Decho("move from remote to local",'~'.expand("<slnum>"))
+" call Decho("copy",'~'.expand("<slnum>"))
+ let mflist= s:netrwmarkfilelist_{bufnr("%")}
+ NetrwKeepj call s:NetrwMarkFileCopy(a:islocal)
+" call Decho("remove",'~'.expand("<slnum>"))
+ for fname in mflist
+ let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
+ let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
+ endfor
+ unlet mflist
+
+ elseif !a:islocal && !s:netrwmftgt_islocal
+ " move: remote -> remote
+" call Decho("move from remote to remote",'~'.expand("<slnum>"))
+" call Decho("copy",'~'.expand("<slnum>"))
+ let mflist= s:netrwmarkfilelist_{bufnr("%")}
+ NetrwKeepj call s:NetrwMarkFileCopy(a:islocal)
+" call Decho("remove",'~'.expand("<slnum>"))
+ for fname in mflist
+ let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
+ let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
+ endfor
+ unlet mflist
+ endif
+
+ " -------
+ " cleanup
+ " -------
+" call Decho("cleanup",'~'.expand("<slnum>"))
+
+ " remove markings from local buffer
+ call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
+
+ " refresh buffers
+ if !s:netrwmftgt_islocal
+" call Decho("refresh netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
+ endif
+ if a:islocal
+" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
+ endif
+ if g:netrw_fastbrowse <= 1
+" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh",'~'.expand("<slnum>"))
+ NetrwKeepj call s:LocalBrowseRefresh()
+ endif
+
+" call Dret("s:NetrwMarkFileMove")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
+" using the hardcopy command. Local marked-file list only.
+fun! s:NetrwMarkFilePrint(islocal)
+" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
+ let curbufnr= bufnr("%")
+
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFilePrint")
+ return
+ endif
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+ let curdir= s:NetrwGetCurdir(a:islocal)
+
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+ let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
+ call s:NetrwUnmarkList(curbufnr,curdir)
+ for fname in netrwmarkfilelist
+ if a:islocal
+ if g:netrw_keepdir
+ let fname= s:ComposePath(curdir,fname)
+ endif
+ else
+ let fname= curdir.fname
+ endif
+ 1split
+ " the autocmds will handle both local and remote files
+" call Decho("exe sil e ".escape(fname,' '),'~'.expand("<slnum>"))
+ exe "sil NetrwKeepj e ".fnameescape(fname)
+" call Decho("hardcopy",'~'.expand("<slnum>"))
+ hardcopy
+ q
+ endfor
+ 2match none
+ endif
+" call Dret("s:NetrwMarkFilePrint")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
+" files when given a regexp (for which a prompt is
+" issued) (matches to name of files).
+fun! s:NetrwMarkFileRegexp(islocal)
+" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
+
+ " get the regular expression
+ call inputsave()
+ let regexp= input("Enter regexp: ","","file")
+ call inputrestore()
+
+ if a:islocal
+ let curdir= s:NetrwGetCurdir(a:islocal)
+" call Decho("curdir<".fnameescape(curdir).">")
+ " 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 || (v:version == 704 && has("patch656"))
+ let filelist= glob(s:ComposePath(dirname,regexp),0,1,1)
+ else
+ let files = glob(s:ComposePath(dirname,regexp),0,0)
+ let filelist= split(files,"\n")
+ endif
+" call Decho("files<".string(filelist).">",'~'.expand("<slnum>"))
+
+ " mark the list of files
+ for fname in filelist
+ if fname =~ '^'.fnameescape(curdir)
+" call Decho("fname<".substitute(fname,'^'.fnameescape(curdir).'/','','').">",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^'.fnameescape(curdir).'/','',''))
+ else
+" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','',''))
+ endif
+ endfor
+
+ else
+" call Decho("handle remote regexp",'~'.expand("<slnum>"))
+
+ " convert displayed listing into a filelist
+ let eikeep = &ei
+ let areg = @a
+ sil NetrwKeepj %y a
+ setl ei=all ma
+" call Decho("setl ei=all ma",'~'.expand("<slnum>"))
+ 1split
+ NetrwKeepj call s:NetrwEnew()
+ NetrwKeepj call s:NetrwOptionsSafe(a:islocal)
+ sil NetrwKeepj norm! "ap
+ NetrwKeepj 2
+ let bannercnt= search('^" =====','W')
+ exe "sil NetrwKeepj 1,".bannercnt."d"
+ setl bt=nofile
+ if g:netrw_liststyle == s:LONGLIST
+ sil NetrwKeepj %s/\s\{2,}\S.*$//e
+ call histdel("/",-1)
+ elseif g:netrw_liststyle == s:WIDELIST
+ sil NetrwKeepj %s/\s\{2,}/\r/ge
+ call histdel("/",-1)
+ elseif g:netrw_liststyle == s:TREELIST
+ exe 'sil NetrwKeepj %s/^'.s:treedepthstring.' //e'
+ sil! NetrwKeepj g/^ .*$/d
+ call histdel("/",-1)
+ call histdel("/",-1)
+ endif
+ " convert regexp into the more usual glob-style format
+ let regexp= substitute(regexp,'\*','.*','g')
+" call Decho("regexp<".regexp.">",'~'.expand("<slnum>"))
+ exe "sil! NetrwKeepj v/".escape(regexp,'/')."/d"
+ call histdel("/",-1)
+ let filelist= getline(1,line("$"))
+ q!
+ for filename in filelist
+ NetrwKeepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','',''))
+ endfor
+ unlet filelist
+ let @a = areg
+ let &ei = eikeep
+ endif
+ echo " (use me to edit marked files)"
+
+" call Dret("s:NetrwMarkFileRegexp")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
+" Uses the local marked file list.
+fun! s:NetrwMarkFileSource(islocal)
+" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
+ let curbufnr= bufnr("%")
+
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFileSource")
+ return
+ endif
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+ let curdir= s:NetrwGetCurdir(a:islocal)
+
+ if exists("s:netrwmarkfilelist_{curbufnr}")
+ let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
+ call s:NetrwUnmarkList(curbufnr,curdir)
+ for fname in netrwmarkfilelist
+ if a:islocal
+ if g:netrw_keepdir
+ let fname= s:ComposePath(curdir,fname)
+ endif
+ else
+ let fname= curdir.fname
+ endif
+ " the autocmds will handle sourcing both local and remote files
+" call Decho("exe so ".fnameescape(fname),'~'.expand("<slnum>"))
+ exe "so ".fnameescape(fname)
+ endfor
+ 2match none
+ endif
+" call Dret("s:NetrwMarkFileSource")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
+" Uses the global markfilelist
+fun! s:NetrwMarkFileTag(islocal)
+" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let curbufnr = bufnr("%")
+
+ " sanity check
+ if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr})
+ NetrwKeepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
+" call Dret("s:NetrwMarkFileTag")
+ return
+ endif
+" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}),'~'.expand("<slnum>"))
+
+ if exists("s:netrwmarkfilelist")
+" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">",'~'.expand("<slnum>"))
+ let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "s:ShellEscape(v:val,".!a:islocal.")"))
+ call s:NetrwUnmarkAll()
+
+ if a:islocal
+
+" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")",'~'.expand("<slnum>"))
+ call system(g:netrw_ctags." ".netrwmarkfilelist)
+ if v:shell_error
+ call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51)
+ endif
+
+ else
+ let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist)
+ call netrw#Obtain(a:islocal,"tags")
+ let curdir= b:netrw_curdir
+ 1split
+ NetrwKeepj e tags
+ let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','')
+" call Decho("curdir<".curdir."> path<".path.">",'~'.expand("<slnum>"))
+ exe 'NetrwKeepj %s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e'
+ call histdel("/",-1)
+ wq!
+ endif
+ 2match none
+ call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call winrestview(svpos)
+ endif
+
+" call Dret("s:NetrwMarkFileTag")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
+" Sets up two variables,
+" s:netrwmftgt : holds the target directory
+" s:netrwmftgt_islocal : 0=target directory is remote
+" 1=target directory is local
+fun! s:NetrwMarkFileTgt(islocal)
+" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ let hadtgt = exists("s:netrwmftgt")
+ if !exists("w:netrw_bannercnt")
+ let w:netrw_bannercnt= b:netrw_bannercnt
+ endif
+
+ " set up target
+ if line(".") < w:netrw_bannercnt
+" call Decho("set up target: line(.) < w:netrw_bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
+ " if cursor in banner region, use b:netrw_curdir for the target unless its already the target
+ if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") && s:netrwmftgt == b:netrw_curdir
+" call Decho("cursor in banner region, and target already is <".b:netrw_curdir.">: removing target",'~'.expand("<slnum>"))
+ unlet s:netrwmftgt s:netrwmftgt_islocal
+ if g:netrw_fastbrowse <= 1
+ call s:LocalBrowseRefresh()
+ endif
+ call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call winrestview(svpos)
+" call Dret("s:NetrwMarkFileTgt : removed target")
+ return
+ else
+ let s:netrwmftgt= b:netrw_curdir
+" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
+ endif
+
+ else
+ " get word under cursor.
+ " * If directory, use it for the target.
+ " * If file, use b:netrw_curdir for the target
+" call Decho("get word under cursor",'~'.expand("<slnum>"))
+ let curword= s:NetrwGetWord()
+ let tgtdir = s:ComposePath(curdir,curword)
+ if a:islocal && isdirectory(s:NetrwFile(tgtdir))
+ let s:netrwmftgt = tgtdir
+" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
+ elseif !a:islocal && tgtdir =~ '/$'
+ let s:netrwmftgt = tgtdir
+" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
+ else
+ let s:netrwmftgt = curdir
+" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
+ endif
+ endif
+ if a:islocal
+ " simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
+ let s:netrwmftgt= simplify(s:netrwmftgt)
+" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">",'~'.expand("<slnum>"))
+ endif
+ if g:netrw_cygwin
+ let s:netrwmftgt= substitute(system("cygpath ".s:ShellEscape(s:netrwmftgt)),'\n$','','')
+ let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
+ endif
+ let s:netrwmftgt_islocal= a: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",'~'.expand("<slnum>"))
+ call s:LocalBrowseRefresh()
+ endif
+" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+ call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,w:netrw_treetop))
+ else
+ call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+ endif
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call winrestview(svpos)
+ if !hadtgt
+ sil! NetrwKeepj norm! j
+ endif
+
+" call Decho("getmatches=".string(getmatches()),'~'.expand("<slnum>"))
+" call Decho("s:netrwmarkfilelist=".(exists("s:netrwmarkfilelist")? string(s:netrwmarkfilelist) : 'n/a'),'~'.expand("<slnum>"))
+" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwGetCurdir: gets current directory and sets up b:netrw_curdir if necessary {{{2
+fun! s:NetrwGetCurdir(islocal)
+" call Dfunc("s:NetrwGetCurdir(islocal=".a:islocal.")")
+
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+ let b:netrw_curdir = s:NetrwTreePath(w:netrw_treetop)
+" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used s:NetrwTreeDir)",'~'.expand("<slnum>"))
+ elseif !exists("b:netrw_curdir")
+ let b:netrw_curdir= getcwd()
+" 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",'~'.expand("<slnum>"))
+ if b:netrw_curdir !~ '\<\a\{3,}://'
+ let curdir= b:netrw_curdir
+" call Decho("g:netrw_keepdir=".g:netrw_keepdir,'~'.expand("<slnum>"))
+ if g:netrw_keepdir == 0
+ call s:NetrwLcd(curdir)
+ endif
+ endif
+
+" call Dret("s:NetrwGetCurdir <".curdir.">")
+ return b:netrw_curdir
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwOpenFile: query user for a filename and open it {{{2
+fun! s:NetrwOpenFile(islocal)
+" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")")
+ let ykeep= @@
+ call inputsave()
+ let fname= input("Enter filename: ")
+ call inputrestore()
+" call Decho("(s:NetrwOpenFile) fname<".fname.">",'~'.expand("<slnum>"))
+
+ " determine if Lexplore is in use
+ if exists("t:netrw_lexbufnr")
+ " check if t:netrw_lexbufnr refers to a netrw window
+" call Decho("(s:netrwOpenFile) ..t:netrw_lexbufnr=".t:netrw_lexbufnr,'~'.expand("<slnum>"))
+ let lexwinnr = bufwinnr(t:netrw_lexbufnr)
+ if lexwinnr != -1 && exists("g:netrw_chgwin") && g:netrw_chgwin != -1
+" call Decho("(s:netrwOpenFile) ..Lexplore in use",'~'.expand("<slnum>"))
+ exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd w"
+ exe "NetrwKeepj e ".fnameescape(fname)
+ let @@= ykeep
+" call Dret("s:NetrwOpenFile : creating a file with Lexplore mode")
+ endif
+ endif
+
+ " Does the filename contain a path?
+ if fname !~ '[/\\]'
+ if exists("b:netrw_curdir")
+ if exists("g:netrw_quiet")
+ let netrw_quiet_keep = g:netrw_quiet
+ endif
+ let g:netrw_quiet = 1
+ " save position for benefit of Rexplore
+ let s:rexposn_{bufnr("%")}= winsaveview()
+" call Decho("saving posn to s:rexposn_".bufnr("%")."<".string(s:rexposn_{bufnr("%")}).">",'~'.expand("<slnum>"))
+ if b:netrw_curdir =~ '/$'
+ exe "NetrwKeepj e ".fnameescape(b:netrw_curdir.fname)
+ else
+ exe "e ".fnameescape(b:netrw_curdir."/".fname)
+ endif
+ if exists("netrw_quiet_keep")
+ let g:netrw_quiet= netrw_quiet_keep
+ else
+ unlet g:netrw_quiet
+ endif
+ endif
+ else
+ exe "NetrwKeepj e ".fnameescape(fname)
+ endif
+ let @@= ykeep
+" call Dret("s:NetrwOpenFile")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#Shrink: shrinks/expands a netrw or Lexplorer window {{{2
+" For the mapping to this function be made via
+" netrwPlugin, you'll need to have had
+" g:netrw_usetab set to non-zero.
+fun! netrw#Shrink()
+" call Dfunc("netrw#Shrink() ft<".&ft."> winwidth=".winwidth(0)." lexbuf#".((exists("t:netrw_lexbufnr"))? t:netrw_lexbufnr : 'n/a'))
+ let curwin = winnr()
+ let wiwkeep = &wiw
+ set wiw=1
+
+ if &ft == "netrw"
+ if winwidth(0) > g:netrw_wiw
+ let t:netrw_winwidth= winwidth(0)
+ exe "vert resize ".g:netrw_wiw
+ wincmd l
+ if winnr() == curwin
+ wincmd h
+ endif
+" call Decho("vert resize 0",'~'.expand("<slnum>"))
+ else
+ exe "vert resize ".t:netrw_winwidth
+" call Decho("vert resize ".t:netrw_winwidth,'~'.expand("<slnum>"))
+ endif
+
+ elseif exists("t:netrw_lexbufnr")
+ exe bufwinnr(t:netrw_lexbufnr)."wincmd w"
+ if winwidth(bufwinnr(t:netrw_lexbufnr)) > g:netrw_wiw
+ let t:netrw_winwidth= winwidth(0)
+ exe "vert resize ".g:netrw_wiw
+ wincmd l
+ if winnr() == curwin
+ wincmd h
+ endif
+" call Decho("vert resize 0",'~'.expand("<slnum>"))
+ elseif winwidth(bufwinnr(t:netrw_lexbufnr)) >= 0
+ exe "vert resize ".t:netrw_winwidth
+" call Decho("vert resize ".t:netrw_winwidth,'~'.expand("<slnum>"))
+ else
+ call netrw#Lexplore(0,0)
+ endif
+
+ else
+ call netrw#Lexplore(0,0)
+ endif
+ let wiw= wiwkeep
+
+" call Dret("netrw#Shrink")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetSortSequence: allows user to edit the sorting sequence {{{2
+fun! s:NetSortSequence(islocal)
+" call Dfunc("NetSortSequence(islocal=".a:islocal.")")
+
+ let ykeep= @@
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ call inputsave()
+ let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence)
+ call inputrestore()
+
+ " refresh the listing
+ let g:netrw_sort_sequence= newsortseq
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ let @@= ykeep
+
+" call Dret("NetSortSequence")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwUnmarkList: delete local marked file list and remove their contents from the global marked-file list {{{2
+" User access provided by the <mF> mapping. (see :help netrw-mF)
+" Used by many MarkFile functions.
+fun! s:NetrwUnmarkList(curbufnr,curdir)
+" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
+
+ " remove all files in local marked-file list from global list
+ if exists("s:netrwmarkfilelist")
+ for mfile in s:netrwmarkfilelist_{a:curbufnr}
+ let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
+ let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
+ call remove(s:netrwmarkfilelist,idx) " remove from global list
+ endfor
+ if s:netrwmarkfilelist == []
+ unlet s:netrwmarkfilelist
+ endif
+
+ " getting rid of the local marked-file lists is easy
+ unlet s:netrwmarkfilelist_{a:curbufnr}
+ endif
+ if exists("s:netrwmarkfilemtch_{a:curbufnr}")
+ unlet s:netrwmarkfilemtch_{a:curbufnr}
+ endif
+ 2match none
+" call Dret("s:NetrwUnmarkList")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
+fun! s:NetrwUnmarkAll()
+" call Dfunc("s:NetrwUnmarkAll()")
+ if exists("s:netrwmarkfilelist")
+ unlet s:netrwmarkfilelist
+ endif
+ sil call s:NetrwUnmarkAll2()
+ 2match none
+" call Dret("s:NetrwUnmarkAll")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwUnmarkAll2: unmark all files from all buffers {{{2
+fun! s:NetrwUnmarkAll2()
+" call Dfunc("s:NetrwUnmarkAll2()")
+ redir => netrwmarkfilelist_let
+ let
+ redir END
+ let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
+ call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
+ call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
+ for flist in netrwmarkfilelist_list
+ let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
+ unlet s:netrwmarkfilelist_{curbufnr}
+ unlet s:netrwmarkfilemtch_{curbufnr}
+ endfor
+" call Dret("s:NetrwUnmarkAll2")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwUnMarkFile: called via mu map; unmarks *all* marked files, both global and buffer-local {{{2
+"
+" Marked files are in two types of lists:
+" s:netrwmarkfilelist -- holds complete paths to all marked files
+" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr())
+"
+" Marked files suitable for use with 2match are in:
+" s:netrwmarkfilemtch_# -- used with 2match to display marked files
+fun! s:NetrwUnMarkFile(islocal)
+" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let curbufnr = bufnr("%")
+
+ " unmark marked file list
+ " (although I expect s:NetrwUpload() to do it, I'm just making sure)
+ if exists("s:netrwmarkfilelist")
+" " call Decho("unlet'ing: s:netrwmarkfilelist",'~'.expand("<slnum>"))
+ unlet s:netrwmarkfilelist
+ endif
+
+ let ibuf= 1
+ while ibuf < bufnr("$")
+ if exists("s:netrwmarkfilelist_".ibuf)
+ unlet s:netrwmarkfilelist_{ibuf}
+ unlet s:netrwmarkfilemtch_{ibuf}
+ endif
+ let ibuf = ibuf + 1
+ endwhile
+ 2match none
+
+" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+"call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+call winrestview(svpos)
+" call Dret("s:NetrwUnMarkFile")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwMenu: generates the menu for gvim and netrw {{{2
+fun! s:NetrwMenu(domenu)
+
+ if !exists("g:NetrwMenuPriority")
+ let g:NetrwMenuPriority= 80
+ endif
+
+ if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
+" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
+
+ if !exists("s:netrw_menu_enabled") && a:domenu
+" call Decho("initialize menu",'~'.expand("<slnum>"))
+ let s:netrw_menu_enabled= 1
+ exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
+ if g:netrw_dirhistmax > 0
+ exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
+ else
+ exe 'sil! menu '.g:NetrwMenuPriority.'.8 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History :echo "(disabled)"'."\<cr>"
+ endif
+ exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Horizontal\ Split<tab>o o'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Vertical\ Split<tab>v v'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.New\ Tab<tab>t t'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Preview<tab>p p'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab><ctrl-h>'." \<c-h>'"
+ exe 'sil! menu '.g:NetrwMenuPriority.'.9.6 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.9.7 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
+ exe 'sil! menu '.g:NetrwMenuPriority.'.9.8 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<c-l>"
+ exe 'sil! menu '.g:NetrwMenuPriority.'.9.9 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
+ exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File<tab>% %'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
+ exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Tab<tab>t t'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
+ exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.thin<tab>i :let w:netrw_liststyle=0<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.long<tab>i :let w:netrw_liststyle=1<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.wide<tab>i :let w:netrw_liststyle=2<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.tree<tab>i :let w:netrw_liststyle=3<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.1 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Show\ All<tab>a :let g:netrw_hide=0<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.3 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Normal<tab>a :let g:netrw_hide=1<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Hidden\ Only<tab>a :let g:netrw_hide=2<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.1 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Name<tab>s :let g:netrw_sort_by="name"<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.2 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Time<tab>s :let g:netrw_sort_by="time"<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.3 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Size<tab>s :let g:netrw_sort_by="size"<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.3 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Exten<tab>s :let g:netrw_sort_by="exten"<cr><c-L>'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
+ exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
+ let s:netrw_menucnt= 28
+ call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x
+ call s:NetrwTgtMenu() " let bookmarks and history be easy targets
+
+ elseif !a:domenu
+ let s:netrwcnt = 0
+ let curwin = winnr()
+ windo if getline(2) =~# "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
+ exe curwin."wincmd w"
+
+ if s:netrwcnt <= 1
+" call Decho("clear menus",'~'.expand("<slnum>"))
+ exe 'sil! unmenu '.g:NetrwTopLvlMenu
+" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*','~'.expand("<slnum>"))
+ sil! unlet s:netrw_menu_enabled
+ endif
+ endif
+" call Dret("NetrwMenu")
+ return
+ endif
+
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
+" Used by the O maps (as <SID>NetrwObtain())
+fun! s:NetrwObtain(islocal)
+" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
+
+ let ykeep= @@
+ if exists("s:netrwmarkfilelist_{bufnr('%')}")
+ let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\{3,}://'
+ call netrw#Obtain(islocal,s:netrwmarkfilelist_{bufnr('%')})
+ call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
+ else
+ call netrw#Obtain(a:islocal,s:NetrwGetWord())
+ endif
+ let @@= ykeep
+
+" call Dret("NetrwObtain")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
+" If there's only one window, then the window will first be split.
+" Returns:
+" choice = 0 : didn't have to choose
+" choice = 1 : saved modified file in window first
+" choice = 2 : didn't save modified file, opened window
+" choice = 3 : cancel open
+fun! s:NetrwPrevWinOpen(islocal)
+" call Dfunc("s:NetrwPrevWinOpen(islocal=".a:islocal.")")
+
+ let ykeep= @@
+ " grab a copy of the b:netrw_curdir to pass it along to newly split windows
+ let curdir = b:netrw_curdir
+
+ " get last window number and the word currently under the cursor
+ let origwin = winnr()
+ let lastwinnr = winnr("$")
+ let curword = s:NetrwGetWord()
+ let choice = 0
+ let s:prevwinopen= 1 " lets s:NetrwTreeDir() know that NetrwPrevWinOpen called it
+ let s:treedir = s:NetrwTreeDir(a:islocal)
+ let curdir = s:treedir
+" call Decho("winnr($)#".lastwinnr." curword<".curword.">",'~'.expand("<slnum>"))
+
+ let didsplit = 0
+ if lastwinnr == 1
+ " if only one window, open a new one first
+" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")",'~'.expand("<slnum>"))
+ " g:netrw_preview=0: preview window shown in a horizontally split window
+ " g:netrw_preview=1: preview window shown in a vertically split window
+ if g:netrw_preview
+ " vertically split preview window
+ let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
+" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s",'~'.expand("<slnum>"))
+ exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s"
+ else
+ " horizontally split preview window
+ let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
+" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s",'~'.expand("<slnum>"))
+ exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
+ endif
+ let didsplit = 1
+" call Decho("did split",'~'.expand("<slnum>"))
+
+ else
+ NetrwKeepj call s:SaveBufVars()
+ let eikeep= &ei
+ setl ei=all
+ wincmd p
+" call Decho("wincmd p (now in win#".winnr().") curdir<".curdir.">",'~'.expand("<slnum>"))
+
+ " prevwinnr: the window number of the "prev" window
+ " prevbufnr: the buffer number of the buffer in the "prev" window
+ " bnrcnt : the qty of windows open on the "prev" buffer
+ let prevwinnr = winnr()
+ let prevbufnr = bufnr("%")
+ let prevbufname = bufname("%")
+ let prevmod = &mod
+ let bnrcnt = 0
+ NetrwKeepj call s:RestoreBufVars()
+" call Decho("after wincmd p: win#".winnr()." win($)#".winnr("$")." origwin#".origwin." &mod=".&mod." bufname(%)<".bufname("%")."> prevbufnr=".prevbufnr,'~'.expand("<slnum>"))
+
+ " if the previous window's buffer has been changed (ie. its modified flag is set),
+ " and it doesn't appear in any other extant window, then ask the
+ " user if s/he wants to abandon modifications therein.
+ if prevmod
+" call Decho("detected that prev window's buffer has been modified: prevbufnr=".prevbufnr." winnr()#".winnr(),'~'.expand("<slnum>"))
+ windo if winbufnr(0) == prevbufnr | let bnrcnt=bnrcnt+1 | endif
+" call Decho("prevbufnr=".prevbufnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr()=".winnr()." prevwinnr#".prevwinnr,'~'.expand("<slnum>"))
+ exe prevwinnr."wincmd w"
+
+ if bnrcnt == 1 && &hidden == 0
+ " only one copy of the modified buffer in a window, and
+ " hidden not set, so overwriting will lose the modified file. Ask first...
+ let choice = confirm("Save modified buffer<".prevbufname."> first?","&Yes\n&No\n&Cancel")
+" call Decho("prevbufname<".prevbufname."> choice=".choice." current-winnr#".winnr(),'~'.expand("<slnum>"))
+ let &ei= eikeep
+
+ if choice == 1
+ " Yes -- write file & then browse
+ let v:errmsg= ""
+ sil w
+ if v:errmsg != ""
+ call netrw#ErrorMsg(s:ERROR,"unable to write <".(exists("prevbufname")? prevbufname : 'n/a').">!",30)
+ exe origwin."wincmd w"
+ let &ei = eikeep
+ let @@ = ykeep
+" call Dret("s:NetrwPrevWinOpen ".choice." : unable to write <".prevbufname.">")
+ return choice
+ endif
+
+ elseif choice == 2
+ " No -- don't worry about changed file, just browse anyway
+" call Decho("don't worry about chgd file, just browse anyway (winnr($)#".winnr("$").")",'~'.expand("<slnum>"))
+ echomsg "**note** changes to ".prevbufname." abandoned"
+
+ else
+ " Cancel -- don't do this
+" call Decho("cancel, don't browse, switch to win#".origwin,'~'.expand("<slnum>"))
+ exe origwin."wincmd w"
+ let &ei= eikeep
+ let @@ = ykeep
+" call Dret("s:NetrwPrevWinOpen ".choice." : cancelled")
+ return choice
+ endif
+ endif
+ endif
+ let &ei= eikeep
+ endif
+
+ " restore b:netrw_curdir (window split/enew may have lost it)
+ let b:netrw_curdir= curdir
+ if a:islocal < 2
+ if a:islocal
+ call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
+ else
+ call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
+ endif
+ endif
+ let @@= ykeep
+" call Dret("s:NetrwPrevWinOpen ".choice)
+ return choice
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
+" Always assumed to be local -> remote
+" call s:NetrwUpload(filename, target)
+" call s:NetrwUpload(filename, target, fromdirectory)
+fun! s:NetrwUpload(fname,tgt,...)
+" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
+
+ if a:tgt =~ '^\a\{3,}://'
+ let tgtdir= substitute(a:tgt,'^\a\{3,}://[^/]\+/\(.\{-}\)$','\1','')
+ else
+ let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
+ endif
+" call Decho("tgtdir<".tgtdir.">",'~'.expand("<slnum>"))
+
+ if a:0 > 0
+ let fromdir= a:1
+ else
+ let fromdir= getcwd()
+ endif
+" call Decho("fromdir<".fromdir.">",'~'.expand("<slnum>"))
+
+ if type(a:fname) == 1
+ " handle uploading a single file using NetWrite
+" call Decho("handle uploading a single file via NetWrite",'~'.expand("<slnum>"))
+ 1split
+" call Decho("exe e ".fnameescape(s:NetrwFile(a:fname)),'~'.expand("<slnum>"))
+ exe "NetrwKeepj e ".fnameescape(s:NetrwFile(a:fname))
+" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines",'~'.expand("<slnum>"))
+ if a:tgt =~ '/$'
+ let wfname= substitute(a:fname,'^.*/','','')
+" call Decho("exe w! ".fnameescape(wfname),'~'.expand("<slnum>"))
+ exe "w! ".fnameescape(a:tgt.wfname)
+ else
+" call Decho("writing local->remote: exe w ".fnameescape(a:tgt),'~'.expand("<slnum>"))
+ exe "w ".fnameescape(a:tgt)
+" call Decho("done writing local->remote",'~'.expand("<slnum>"))
+ endif
+ q!
+
+ elseif type(a:fname) == 3
+ " handle uploading a list of files via scp
+" call Decho("handle uploading a list of files via scp",'~'.expand("<slnum>"))
+ let curdir= getcwd()
+ if a:tgt =~ '^scp:'
+ if s:NetrwLcd(fromdir)
+" call Dret("s:NetrwUpload : lcd failure")
+ return
+ endif
+ let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')})
+ let args = join(map(filelist,"s:ShellEscape(v:val, 1)"))
+ if exists("g:netrw_port") && g:netrw_port != ""
+ let useport= " ".g:netrw_scpport." ".g:netrw_port
+ else
+ let useport= ""
+ endif
+ let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
+ let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
+ call s:NetrwExe(s:netrw_silentxfer."!".g:netrw_scp_cmd.s:ShellEscape(useport,1)." ".args." ".s:ShellEscape(machine.":".tgt,1))
+ if s:NetrwLcd(curdir)
+" call Dret("s:NetrwUpload : lcd failure")
+ return
+ endif
+
+ elseif a:tgt =~ '^ftp:'
+ call s:NetrwMethod(a:tgt)
+
+ if b:netrw_method == 2
+ " handle uploading a list of files via ftp+.netrc
+ let netrw_fname = b:netrw_fname
+ sil NetrwKeepj new
+" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
+
+ NetrwKeepj put =g:netrw_ftpmode
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ NetrwKeepj call setline(line("$")+1,'lcd "'.fromdir.'"')
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+
+ if tgtdir == ""
+ let tgtdir= '/'
+ endif
+ NetrwKeepj call setline(line("$")+1,'cd "'.tgtdir.'"')
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+
+ for fname in a:fname
+ NetrwKeepj call setline(line("$")+1,'put "'.s:NetrwFile(fname).'"')
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endfor
+
+ if exists("g:netrw_port") && g:netrw_port != ""
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1))
+ else
+" call Decho("filter input window#".winnr(),'~'.expand("<slnum>"))
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1))
+ endif
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ sil NetrwKeepj g/Local directory now/d
+ call histdel("/",-1)
+ if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
+ call netrw#ErrorMsg(s:ERROR,getline(1),14)
+ else
+ bw!|q
+ endif
+
+ elseif b:netrw_method == 3
+ " upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
+ let netrw_fname= b:netrw_fname
+ NetrwKeepj call s:SaveBufVars()|sil NetrwKeepj new|NetrwKeepj call s:RestoreBufVars()
+ let tmpbufnr= bufnr("%")
+ setl ff=unix
+
+ if exists("g:netrw_port") && g:netrw_port != ""
+ NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ else
+ NetrwKeepj put ='open '.g:netrw_machine
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ if exists("g:netrw_uid") && g:netrw_uid != ""
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ NetrwKeepj put =g:netrw_uid
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ if exists("s:netrw_passwd")
+ NetrwKeepj call setline(line("$")+1,'"'.s:netrw_passwd.'"')
+ endif
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ elseif exists("s:netrw_passwd")
+ NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+ endif
+
+ NetrwKeepj call setline(line("$")+1,'lcd "'.fromdir.'"')
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+
+ if exists("b:netrw_fname") && b:netrw_fname != ""
+ NetrwKeepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endif
+
+ for fname in a:fname
+ NetrwKeepj call setline(line("$")+1,'put "'.fname.'"')
+" call Decho("filter input: ".getline('$'),'~'.expand("<slnum>"))
+ endfor
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+ NetrwKeepj norm! 1G"_dd
+ call s:NetrwExe(s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
+ " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
+ sil NetrwKeepj g/Local directory now/d
+ call histdel("/",-1)
+ if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
+ let debugkeep= &debug
+ setl debug=msg
+ call netrw#ErrorMsg(s:ERROR,getline(1),15)
+ let &debug = debugkeep
+ let mod = 1
+ else
+ bw!|q
+ endif
+ elseif !exists("b:netrw_method") || b:netrw_method < 0
+" call Dret("s:#NetrwUpload : unsupported method")
+ return
+ endif
+ else
+ call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
+ endif
+ endif
+
+" call Dret("s:NetrwUpload")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwPreview: supports netrw's "p" map {{{2
+fun! s:NetrwPreview(path) range
+" call Dfunc("NetrwPreview(path<".a:path.">)")
+" call Decho("g:netrw_alto =".(exists("g:netrw_alto")? g:netrw_alto : 'n/a'),'~'.expand("<slnum>"))
+" call Decho("g:netrw_preview=".(exists("g:netrw_preview")? g:netrw_preview : 'n/a'),'~'.expand("<slnum>"))
+ let ykeep= @@
+ NetrwKeepj call s:NetrwOptionsSave("s:")
+ if a:path !~ '^\*\{1,2}/' && a:path !~ '^\a\{3,}://'
+ NetrwKeepj call s:NetrwOptionsSafe(1)
+ else
+ NetrwKeepj call s:NetrwOptionsSafe(0)
+ endif
+ if has("quickfix")
+" call Decho("has quickfix",'~'.expand("<slnum>"))
+ if !isdirectory(s:NetrwFile(a:path))
+" call Decho("good; not previewing a directory",'~'.expand("<slnum>"))
+ if g:netrw_preview
+ " vertical split
+ let pvhkeep = &pvh
+ let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
+ let &pvh = winwidth(0) - winsz
+" call Decho("g:netrw_preview: winsz=".winsz." &pvh=".&pvh." (temporarily) g:netrw_winsize=".g:netrw_winsize,'~'.expand("<slnum>"))
+ else
+ " horizontal split
+ let pvhkeep = &pvh
+ let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
+ let &pvh = winheight(0) - winsz
+" call Decho("!g:netrw_preview: winsz=".winsz." &pvh=".&pvh." (temporarily) g:netrw_winsize=".g:netrw_winsize,'~'.expand("<slnum>"))
+ endif
+ " g:netrw_preview g:netrw_alto
+ " 1 : vert 1: top -- preview window is vertically split off and on the left
+ " 1 : vert 0: bot -- preview window is vertically split off and on the right
+ " 0 : 1: top -- preview window is horizontally split off and on the top
+ " 0 : 0: bot -- preview window is horizontally split off and on the bottom
+ "
+ " Note that the file being previewed is already known to not be a directory, hence we can avoid doing a LocalBrowseCheck() check via
+ " the BufEnter event set up in netrwPlugin.vim
+" call Decho("exe ".(g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path),'~'.expand("<slnum>"))
+ let eikeep = &ei
+ set ei=BufEnter
+ exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
+ let &ei= eikeep
+" call Decho("winnr($)=".winnr("$"),'~'.expand("<slnum>"))
+ if exists("pvhkeep")
+ let &pvh= pvhkeep
+ endif
+ elseif !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38)
+ endif
+ elseif !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39)
+ endif
+ NetrwKeepj call s:NetrwOptionsRestore("s:")
+ let @@= ykeep
+" call Dret("NetrwPreview")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwRefresh: {{{2
+fun! s:NetrwRefresh(islocal,dirname)
+" call Dfunc("s:NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") g:netrw_hide=".g:netrw_hide." g:netrw_sort_direction=".g:netrw_sort_direction)
+ " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first.
+ setl ma noro
+" call Decho("setl ma noro",'~'.expand("<slnum>"))
+" call Decho("clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
+ let ykeep = @@
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+ if !exists("w:netrw_treetop")
+ if exists("b:netrw_curdir")
+ let w:netrw_treetop= b:netrw_curdir
+ else
+ let w:netrw_treetop= getcwd()
+ endif
+ endif
+ NetrwKeepj call s:NetrwRefreshTreeDict(w:netrw_treetop)
+ endif
+
+ " save the cursor position before refresh.
+ let screenposn = winsaveview()
+" call Decho("saving posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
+
+" call Decho("win#".winnr().": ".winheight(0)."x".winwidth(0)." curfile<".expand("%").">",'~'.expand("<slnum>"))
+" call Decho("clearing buffer prior to refresh",'~'.expand("<slnum>"))
+ sil! NetrwKeepj %d _
+ if a:islocal
+ NetrwKeepj call netrw#LocalBrowseCheck(a:dirname)
+ else
+ NetrwKeepj call s:NetrwBrowse(a:islocal,a:dirname)
+ endif
+
+ " restore position
+" call Decho("restoring posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(screenposn)
+
+ " restore file marks
+ if has("syntax") && exists("g:syntax_on") && g:syntax_on
+ if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
+" " call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/",'~'.expand("<slnum>"))
+ exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
+ else
+" " call Decho("2match none (bufnr(%)=".bufnr("%")."<".bufname("%").">)",'~'.expand("<slnum>"))
+ 2match none
+ endif
+ endif
+
+" restore
+ let @@= ykeep
+" call Dret("s:NetrwRefresh")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwRefreshDir: refreshes a directory by name {{{2
+" Called by NetrwMarkFileCopy()
+" Interfaces to s:NetrwRefresh() and s:LocalBrowseRefresh()
+fun! s:NetrwRefreshDir(islocal,dirname)
+" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) g:netrw_fastbrowse=".g:netrw_fastbrowse)
+ if g:netrw_fastbrowse == 0
+ " slowest mode (keep buffers refreshed, local or remote)
+" call Decho("slowest mode: keep buffers refreshed, local or remote",'~'.expand("<slnum>"))
+ let tgtwin= bufwinnr(a:dirname)
+" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin,'~'.expand("<slnum>"))
+
+ if tgtwin > 0
+ " tgtwin is being displayed, so refresh it
+ let curwin= winnr()
+" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")",'~'.expand("<slnum>"))
+ exe tgtwin."wincmd w"
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+ exe curwin."wincmd w"
+
+ elseif bufnr(a:dirname) > 0
+ let bn= bufnr(a:dirname)
+" call Decho("bd bufnr(".a:dirname.")=".bn,'~'.expand("<slnum>"))
+ exe "sil keepj bd ".bn
+ endif
+
+ elseif g:netrw_fastbrowse <= 1
+" call Decho("medium-speed mode: refresh local buffers only",'~'.expand("<slnum>"))
+ NetrwKeepj call s:LocalBrowseRefresh()
+ endif
+" call Dret("s:NetrwRefreshDir")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwSetChgwin: set g:netrw_chgwin; a <cr> will use the specified
+" window number to do its editing in.
+" Supports [count]C where the count, if present, is used to specify
+" a window to use for editing via the <cr> mapping.
+fun! s:NetrwSetChgwin(...)
+" call Dfunc("s:NetrwSetChgwin() v:count=".v:count)
+ if a:0 > 0
+" call Decho("a:1<".a:1.">",'~'.expand("<slnum>"))
+ if a:1 == "" " :NetrwC win#
+ let g:netrw_chgwin= winnr()
+ else " :NetrwC
+ let g:netrw_chgwin= a:1
+ endif
+ elseif v:count > 0 " [count]C
+ let g:netrw_chgwin= v:count
+ else " C
+ let g:netrw_chgwin= winnr()
+ endif
+ echo "editing window now set to window#".g:netrw_chgwin
+" call Dret("s:NetrwSetChgwin : g:netrw_chgwin=".g:netrw_chgwin)
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
+" What this function does is to compute a priority for the patterns
+" in the g:netrw_sort_sequence. It applies a substitute to any
+" "files" that satisfy each pattern, putting the priority / in
+" front. An "*" pattern handles the default priority.
+fun! s:NetrwSetSort()
+" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
+ let ykeep= @@
+ if w:netrw_liststyle == s:LONGLIST
+ let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
+ else
+ let seqlist = g:netrw_sort_sequence
+ endif
+ " sanity check -- insure that * appears somewhere
+ if seqlist == ""
+ let seqlist= '*'
+ elseif seqlist !~ '\*'
+ let seqlist= seqlist.',*'
+ endif
+ let priority = 1
+ while seqlist != ""
+ if seqlist =~ ','
+ let seq = substitute(seqlist,',.*$','','e')
+ let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
+ else
+ let seq = seqlist
+ let seqlist = ""
+ endif
+ if priority < 10
+ let spriority= "00".priority.g:netrw_sepchr
+ elseif priority < 100
+ let spriority= "0".priority.g:netrw_sepchr
+ else
+ let spriority= priority.g:netrw_sepchr
+ endif
+" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">",'~'.expand("<slnum>"))
+
+ " sanity check
+ if w:netrw_bannercnt > line("$")
+ " apparently no files were left after a Hiding pattern was used
+" call Dret("SetSort : no files left after hiding")
+ return
+ endif
+ if seq == '*'
+ let starpriority= spriority
+ else
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
+ call histdel("/",-1)
+ " sometimes multiple sorting patterns will match the same file or directory.
+ " The following substitute is intended to remove the excess matches.
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/^\d\{3}'.g:netrw_sepchr.'\d\{3}\//s/^\d\{3}'.g:netrw_sepchr.'\(\d\{3}\/\).\@=/\1/e'
+ NetrwKeepj call histdel("/",-1)
+ endif
+ let priority = priority + 1
+ endwhile
+ if exists("starpriority")
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/e'
+ NetrwKeepj call histdel("/",-1)
+ endif
+
+ " Following line associated with priority -- items that satisfy a priority
+ " pattern get prefixed by ###/ which permits easy sorting by priority.
+ " Sometimes files can satisfy multiple priority patterns -- only the latest
+ " priority pattern needs to be retained. So, at this point, these excess
+ " priority prefixes need to be removed, but not directories that happen to
+ " be just digits themselves.
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\d\{3}'.g:netrw_sepchr.'\)\%(\d\{3}'.g:netrw_sepchr.'\)\+\ze./\1/e'
+ NetrwKeepj call histdel("/",-1)
+ let @@= ykeep
+
+" call Dret("SetSort")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwSetTgt: sets the target to the specified choice index {{{2
+" Implements [count]Tb (bookhist<b>)
+" [count]Th (bookhist<h>)
+" See :help netrw-qb for how to make the choice.
+fun! s:NetrwSetTgt(islocal,bookhist,choice)
+" call Dfunc("s:NetrwSetTgt(islocal=".a:islocal." bookhist<".a:bookhist."> choice#".a:choice.")")
+
+ if a:bookhist == 'b'
+ " supports choosing a bookmark as a target using a qb-generated list
+ let choice= a:choice - 1
+ if exists("g:netrw_bookmarklist[".choice."]")
+ call netrw#MakeTgt(g:netrw_bookmarklist[choice])
+ else
+ echomsg "Sorry, bookmark#".a:choice." doesn't exist!"
+ endif
+
+ elseif a:bookhist == 'h'
+ " supports choosing a history stack entry as a target using a qb-generated list
+ let choice= (a:choice % g:netrw_dirhistmax) + 1
+ if exists("g:netrw_dirhist_".choice)
+ let histentry = g:netrw_dirhist_{choice}
+ call netrw#MakeTgt(histentry)
+ else
+ echomsg "Sorry, history#".a:choice." not available!"
+ endif
+ endif
+
+ " refresh the display
+ if !exists("b:netrw_curdir")
+ let b:netrw_curdir= getcwd()
+ endif
+ call s:NetrwRefresh(a:islocal,b:netrw_curdir)
+
+" call Dret("s:NetrwSetTgt")
+endfun
+
+" =====================================================================
+" s:NetrwSortStyle: change sorting style (name - time - size - exten) and refresh display {{{2
+fun! s:NetrwSortStyle(islocal)
+" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
+ NetrwKeepj call s:NetrwSaveWordPosn()
+ 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'
+ NetrwKeepj norm! 0
+ NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+
+" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwSplit: mode {{{2
+" =0 : net and o
+" =1 : net and t
+" =2 : net and v
+" =3 : local and o
+" =4 : local and t
+" =5 : local and v
+fun! s:NetrwSplit(mode)
+" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
+
+ let ykeep= @@
+ call s:SaveWinVars()
+
+ if a:mode == 0
+ " remote and o
+ let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
+ if winsz == 0|let winsz= ""|endif
+" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s",'~'.expand("<slnum>"))
+ exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
+ let s:didsplit= 1
+ NetrwKeepj call s:RestoreWinVars()
+ NetrwKeepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
+ unlet s:didsplit
+
+ elseif a:mode == 1
+ " remote and t
+ let newdir = s:NetrwBrowseChgDir(0,s:NetrwGetWord())
+" call Decho("tabnew",'~'.expand("<slnum>"))
+ tabnew
+ let s:didsplit= 1
+ NetrwKeepj call s:RestoreWinVars()
+ NetrwKeepj call s:NetrwBrowse(0,newdir)
+ unlet s:didsplit
+
+ elseif a:mode == 2
+ " remote and v
+ let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
+ if winsz == 0|let winsz= ""|endif
+" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v",'~'.expand("<slnum>"))
+ exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
+ let s:didsplit= 1
+ NetrwKeepj call s:RestoreWinVars()
+ NetrwKeepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord()))
+ unlet s:didsplit
+
+ elseif a:mode == 3
+ " local and o
+ let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize
+ if winsz == 0|let winsz= ""|endif
+" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s",'~'.expand("<slnum>"))
+ exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s"
+ let s:didsplit= 1
+ NetrwKeepj call s:RestoreWinVars()
+ NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
+ unlet s:didsplit
+
+ elseif a:mode == 4
+ " local and t
+ let cursorword = s:NetrwGetWord()
+ let eikeep = &ei
+ let netrw_winnr = winnr()
+ let netrw_line = line(".")
+ let netrw_col = virtcol(".")
+ NetrwKeepj norm! H0
+ let netrw_hline = line(".")
+ setl ei=all
+ exe "NetrwKeepj norm! ".netrw_hline."G0z\<CR>"
+ exe "NetrwKeepj norm! ".netrw_line."G0".netrw_col."\<bar>"
+ let &ei = eikeep
+ let netrw_curdir = s:NetrwTreeDir(0)
+" call Decho("tabnew",'~'.expand("<slnum>"))
+ tabnew
+ let b:netrw_curdir = netrw_curdir
+ let s:didsplit = 1
+ NetrwKeepj call s:RestoreWinVars()
+ NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword))
+ if &ft == "netrw"
+ setl ei=all
+ exe "NetrwKeepj norm! ".netrw_hline."G0z\<CR>"
+ exe "NetrwKeepj norm! ".netrw_line."G0".netrw_col."\<bar>"
+ let &ei= eikeep
+ endif
+ unlet s:didsplit
+
+ elseif a:mode == 5
+ " local and v
+ let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize
+ if winsz == 0|let winsz= ""|endif
+" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v",'~'.expand("<slnum>"))
+ exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v"
+ let s:didsplit= 1
+ NetrwKeepj call s:RestoreWinVars()
+ NetrwKeepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord()))
+ unlet s:didsplit
+
+ else
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
+ endif
+
+ let @@= ykeep
+" call Dret("s:NetrwSplit")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwTgtMenu: {{{2
+fun! s:NetrwTgtMenu()
+ if !exists("s:netrw_menucnt")
+ return
+ endif
+" call Dfunc("s:NetrwTgtMenu()")
+
+ " the following test assures that gvim is running, has menus available, and has menus enabled.
+ if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
+ if exists("g:NetrwTopLvlMenu")
+" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)",'~'.expand("<slnum>"))
+ exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Targets'
+ endif
+ if !exists("s:netrw_initbookhist")
+ call s:NetrwBookHistRead()
+ endif
+
+ " try to cull duplicate entries
+ let tgtdict={}
+
+ " target bookmarked places
+ if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0
+" call Decho("installing bookmarks as easy targets",'~'.expand("<slnum>"))
+ let cnt= 1
+ for bmd in g:netrw_bookmarklist
+ if has_key(tgtdict,bmd)
+ let cnt= cnt + 1
+ continue
+ endif
+ let tgtdict[bmd]= cnt
+ let ebmd= escape(bmd,g:netrw_menu_escape)
+ " show bookmarks for goto menu
+" call Decho("menu: Targets: ".bmd,'~'.expand("<slnum>"))
+ exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.1.".cnt." ".g:NetrwTopLvlMenu.'Targets.'.ebmd." :call netrw#MakeTgt('".bmd."')\<cr>"
+ let cnt= cnt + 1
+ endfor
+ endif
+
+ " target directory browsing history
+ if exists("g:netrw_dirhistmax") && g:netrw_dirhistmax > 0
+" call Decho("installing history as easy targets (histmax=".g:netrw_dirhistmax.")",'~'.expand("<slnum>"))
+ let histcnt = 1
+ while histcnt <= g:netrw_dirhistmax
+ let priority = g:netrw_dirhistcnt + histcnt
+ if exists("g:netrw_dirhist_{histcnt}")
+ let histentry = g:netrw_dirhist_{histcnt}
+ if has_key(tgtdict,histentry)
+ let histcnt = histcnt + 1
+ continue
+ endif
+ let tgtdict[histentry] = histcnt
+ let ehistentry = escape(histentry,g:netrw_menu_escape)
+" call Decho("menu: Targets: ".histentry,'~'.expand("<slnum>"))
+ exe 'sil! menu <silent> '.g:NetrwMenuPriority.".19.2.".priority." ".g:NetrwTopLvlMenu.'Targets.'.ehistentry." :call netrw#MakeTgt('".histentry."')\<cr>"
+ endif
+ let histcnt = histcnt + 1
+ endwhile
+ endif
+ endif
+" call Dret("s:NetrwTgtMenu")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
+" (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("Determine tree directory given current cursor position")
+" 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>"))
+" call Decho("current line<".getline(".").">")
+
+ if exists("s:treedir") && exists("s:prevwinopen")
+ " s:NetrwPrevWinOpen opens a "previous" window -- and thus needs to and does call s:NetrwTreeDir early
+" call Decho('s:NetrwPrevWinOpen opens a "previous" window -- and thus needs to and does call s:NetrwTreeDir early')
+ let treedir= s:treedir
+ unlet s:treedir
+ unlet s:prevwinopen
+" call Dret("s:NetrwTreeDir ".treedir.": early return since s:treedir existed previously")
+ return treedir
+ endif
+ if exists("s:prevwinopen")
+ unlet s:prevwinopen
+ endif
+
+ if !exists("b:netrw_curdir") || b:netrw_curdir == ""
+ let b:netrw_curdir= getcwd()
+ endif
+ let treedir = b:netrw_curdir
+" call Decho("set initial treedir<".treedir.">",'~'.expand("<slnum>"))
+
+ let s:treecurpos= winsaveview()
+" call Decho("saving posn to s:treecurpos<".string(s:treecurpos).">",'~'.expand("<slnum>"))
+
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+" call Decho("w:netrw_liststyle is TREELIST:",'~'.expand("<slnum>"))
+" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">",'~'.expand("<slnum>"))
+
+ " extract tree directory if on a line specifying a subdirectory (ie. ends with "/")
+ let curline= substitute(getline('.'),"\t -->.*$",'','')
+ if curline =~ '/$'
+" call Decho("extract tree subdirectory from current line",'~'.expand("<slnum>"))
+ let treedir= substitute(getline('.'),'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
+" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
+ elseif curline =~ '@$'
+" call Decho("handle symbolic link from current line",'~'.expand("<slnum>"))
+ let treedir= resolve(substitute(substitute(getline('.'),'@.*$','','e'),'^|*\s*','','e'))
+" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
+ else
+" call Decho("do not extract tree subdirectory from current line and set treedir to empty",'~'.expand("<slnum>"))
+ let treedir= ""
+ endif
+
+ " 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>"))
+ if curline !~ '^'.s:treedepthstring && getline('.') != '..'
+" call Decho(".user may have attempted to close treeroot",'~'.expand("<slnum>"))
+ " now force a refresh
+" call Decho(".force refresh: clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
+ sil! NetrwKeepj %d _
+" call Dret("s:NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".(exists("s:treecurpos")? string(s:treecurpos) : 'n/a').">")
+ return b:netrw_curdir
+" else " Decho
+" call Decho(".user not attempting to close treeroot",'~'.expand("<slnum>"))
+ endif
+
+" call Decho("islocal=".a:islocal." curline<".curline.">",'~'.expand("<slnum>"))
+ let potentialdir= s:NetrwFile(substitute(curline,'^'.s:treedepthstring.'\+ \(.*\)@$','\1',''))
+" call Decho("potentialdir<".potentialdir."> isdir=".isdirectory(potentialdir),'~'.expand("<slnum>"))
+
+ " COMBAK: a symbolic link may point anywhere -- so it will be used to start a new treetop
+" if a:islocal && curline =~ '@$' && isdirectory(s:NetrwFile(potentialdir))
+" let newdir = w:netrw_treetop.'/'.potentialdir
+" " call Decho("apply NetrwTreePath to newdir<".newdir.">",'~'.expand("<slnum>"))
+" let treedir = s:NetrwTreePath(newdir)
+" let w:netrw_treetop = newdir
+" " call Decho("newdir <".newdir.">",'~'.expand("<slnum>"))
+" else
+" call Decho("apply NetrwTreePath to treetop<".w:netrw_treetop.">",'~'.expand("<slnum>"))
+ let treedir = s:NetrwTreePath(w:netrw_treetop)
+" endif
+ endif
+
+ " sanity maintenance: keep those //s away...
+ let treedir= substitute(treedir,'//$','/','')
+" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
+
+" call Dret("s:NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".(exists("s:treecurpos")? string(s:treecurpos) : 'n/a').">")
+ return treedir
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwTreeDisplay: recursive tree display {{{2
+fun! s:NetrwTreeDisplay(dir,depth)
+" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
+
+ " insure that there are no folds
+ setl nofen
+
+ " install ../ and shortdir
+ if a:depth == ""
+ call setline(line("$")+1,'../')
+" call Decho("setline#".line("$")." ../ (depth is zero)",'~'.expand("<slnum>"))
+ endif
+ if a:dir =~ '^\a\{3,}://'
+ if a:dir == w:netrw_treetop
+ let shortdir= a:dir
+ else
+ let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
+ endif
+ call setline(line("$")+1,a:depth.shortdir)
+ else
+ let shortdir= substitute(a:dir,'^.*/','','e')
+ call setline(line("$")+1,a:depth.shortdir.'/')
+ endif
+" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">",'~'.expand("<slnum>"))
+ " append a / to dir if its missing one
+ let dir= a:dir
+
+ " display subtrees (if any)
+ let depth= s:treedepthstring.a:depth
+" call Decho("display subtrees with depth<".depth."> and current leaves",'~'.expand("<slnum>"))
+
+ " implement g:netrw_hide for tree listings (uses g:netrw_list_hide)
+ if g:netrw_hide == 1
+ " hide given patterns
+ let listhide= split(g:netrw_list_hide,',')
+" call Decho("listhide=".string(listhide))
+ for pat in listhide
+ call filter(w:netrw_treedict[dir],'v:val !~ "'.escape(pat,'\\').'"')
+ endfor
+
+ elseif g:netrw_hide == 2
+ " show given patterns (only)
+ let listhide= split(g:netrw_list_hide,',')
+" call Decho("listhide=".string(listhide))
+ let entries=[]
+ for entry in w:netrw_treedict[dir]
+ for pat in listhide
+ if entry =~ pat
+ call add(entries,entry)
+ break
+ endif
+ endfor
+ endfor
+ let w:netrw_treedict[dir]= entries
+ endif
+ if depth != ""
+ " always remove "." and ".." entries when there's depth
+ call filter(w:netrw_treedict[dir],'v:val !~ "\\.\\.$"')
+ call filter(w:netrw_treedict[dir],'v:val !~ "\\.$"')
+ endif
+
+" call Decho("for every entry in w:netrw_treedict[".dir."]=".string(w:netrw_treedict[dir]),'~'.expand("<slnum>"))
+ for entry in w:netrw_treedict[dir]
+ if dir =~ '/$'
+ let direntry= substitute(dir.entry,'[@/]$','','e')
+ else
+ let direntry= substitute(dir.'/'.entry,'[@/]$','','e')
+ endif
+" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">",'~'.expand("<slnum>"))
+ 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:NetrwTreeDisplay(direntry,depth)
+ 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:NetrwTreeDisplay(direntry.'/',depth)
+ 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:NetrwTreeDisplay(direntry.'/',depth)
+ else
+" call Decho("<".entry."> is not a key in treedict (no subtree)",'~'.expand("<slnum>"))
+ sil! NetrwKeepj call setline(line("$")+1,depth.entry)
+ endif
+ endfor
+" call Decho("displaying: ".string(getline(w:netrw_bannercnt,'$')))
+
+" call Dret("NetrwTreeDisplay")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwRefreshTreeDict: updates the contents information for a tree (w:netrw_treedict) {{{2
+fun! s:NetrwRefreshTreeDict(dir)
+" call Dfunc("s:NetrwRefreshTreeDict(dir<".a:dir.">)")
+ if !exists("w:netrw_treedict")
+" call Dret("s:NetrwRefreshTreeDict : w:netrw_treedict doesn't exist")
+ return
+ endif
+
+ for entry in w:netrw_treedict[a:dir]
+ let direntry= substitute(a:dir.'/'.entry,'[@/]$','','e')
+" call Decho("a:dir<".a:dir."> entry<".entry."> direntry<".direntry.">",'~'.expand("<slnum>"))
+
+ 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,'*',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.'/','*',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.'/','*',1)
+ let listdotstar= s:NetrwGlob(direntry.'/','.*',1)
+" call Decho("updating w:netrw_treedict[".direntry.']='.string(w:netrw_treedict[direntry]),'~'.expand("<slnum>"))
+
+ else
+" call Decho('not updating w:netrw_treedict['.string(direntry).'] with entry<'.string(entry).'> (no subtree)','~'.expand("<slnum>"))
+ endif
+ endfor
+" call Dret("s:NetrwRefreshTreeDict")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
+" Called by s:PerformListing()
+fun! s:NetrwTreeListing(dirname)
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+" call Dfunc("s:NetrwTreeListing() bufname<".expand("%").">")
+" call Decho("curdir<".a:dirname.">",'~'.expand("<slnum>"))
+" call Decho("win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exist")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit"),'~'.expand("<slnum>"))
+" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
+
+ " update the treetop
+ if !exists("w:netrw_treetop")
+" call Decho("update the treetop (w:netrw_treetop doesn't exist yet)",'~'.expand("<slnum>"))
+ let w:netrw_treetop= a:dirname
+ let s:netrw_treetop= w:netrw_treetop
+" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)",'~'.expand("<slnum>"))
+ elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
+" call Decho("update the treetop (override w:netrw_treetop with a:dirname<".a:dirname.">)",'~'.expand("<slnum>"))
+ let w:netrw_treetop= a:dirname
+ let s:netrw_treetop= w:netrw_treetop
+" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)",'~'.expand("<slnum>"))
+ endif
+ if exists("w:netrw_treetop")
+ let s:netrw_treetop= w:netrw_treetop
+ else
+ let w:netrw_treetop= getcwd()
+ let s:netrw_treetop= w:netrw_treetop
+ endif
+
+ if !exists("w:netrw_treedict")
+ " insure that we have a treedict, albeit empty
+" call Decho("initializing w:netrw_treedict to empty",'~'.expand("<slnum>"))
+ let w:netrw_treedict= {}
+ endif
+
+ " update the dictionary for the current directory
+" call Decho("updating: w:netrw_treedict[".a:dirname.'] -> [directory listing]','~'.expand("<slnum>"))
+" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." line($)=".line("$"),'~'.expand("<slnum>"))
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$g@^\.\.\=/$@d _'
+ let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
+" call Decho("w:treedict[".a:dirname."]= ".string(w:netrw_treedict[a:dirname]),'~'.expand("<slnum>"))
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt.",$d _"
+
+ " if past banner, record word
+ if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
+ let fname= expand("<cword>")
+ else
+ let fname= ""
+ endif
+" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
+" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
+
+ " display from treetop on down
+" call Decho("(s:NetrwTreeListing) w:netrw_treetop<".w:netrw_treetop.">")
+ NetrwKeepj call s:NetrwTreeDisplay(w:netrw_treetop,"")
+" call Decho("s:NetrwTreeDisplay) setl noma nomod ro",'~'.expand("<slnum>"))
+
+ " remove any blank line remaining as line#1 (happens in treelisting mode with banner suppressed)
+ while getline(1) =~ '^\s*$' && byte2line(1) > 0
+" call Decho("deleting blank line",'~'.expand("<slnum>"))
+ 1d
+ endwhile
+
+ exe "setl ".g:netrw_bufsettings
+
+" call Dret("s:NetrwTreeListing : bufname<".expand("%").">")
+ return
+ endif
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwTreePath: returns path to current file/directory in tree listing {{{2
+" Normally, treetop is w:netrw_treetop, but a
+" user of the function ( netrw#SetTreetop() )
+" wipes that out prior to calling this function
+fun! s:NetrwTreePath(treetop)
+" call Dfunc("s:NetrwTreePath(treetop<".a:treetop.">) line#".line(".")."<".getline(".").">")
+ if line(".") < w:netrw_bannercnt + 2
+ let treedir= a:treetop
+ if treedir !~ '/$'
+ let treedir= treedir.'/'
+ endif
+" call Dret("s:NetrwTreePath ".treedir." : line#".line(".")." ≤ ".(w:netrw_bannercnt+2))
+ return treedir
+ endif
+
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let depth = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
+" call Decho("depth<".depth."> 1st subst",'~'.expand("<slnum>"))
+ let depth = substitute(depth,'^'.s:treedepthstring,'','')
+" call Decho("depth<".depth."> 2nd subst (first depth removed)",'~'.expand("<slnum>"))
+ let curline= getline('.')
+" call Decho("curline<".curline.'>','~'.expand("<slnum>"))
+ if curline =~ '/$'
+" call Decho("extract tree directory from current line",'~'.expand("<slnum>"))
+ let treedir= substitute(curline,'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
+" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
+ elseif curline =~ '@\s\+-->'
+" call Decho("extract tree directory using symbolic link",'~'.expand("<slnum>"))
+ let treedir= substitute(curline,'^\%('.s:treedepthstring.'\)*\([^'.s:treedepthstring.'].\{-}\)$','\1','e')
+ let treedir= substitute(treedir,'@\s\+-->.*$','','e')
+" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
+ else
+" call Decho("do not extract tree directory from current line and set treedir to empty",'~'.expand("<slnum>"))
+ let treedir= ""
+ endif
+ " construct treedir by searching backwards at correct depth
+" call Decho("construct treedir by searching backwards for correct depth",'~'.expand("<slnum>"))
+" call Decho("initial treedir<".treedir."> depth<".depth.">",'~'.expand("<slnum>"))
+ while depth != "" && search('^'.depth.'[^'.s:treedepthstring.'].\{-}/$','bW')
+ let dirname= substitute(getline('.'),'^\('.s:treedepthstring.'\)*','','e')
+ let treedir= dirname.treedir
+ let depth = substitute(depth,'^'.s:treedepthstring,'','')
+" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">",'~'.expand("<slnum>"))
+ endwhile
+" call Decho("treedir#1<".treedir.">",'~'.expand("<slnum>"))
+ if a:treetop =~ '/$'
+ let treedir= a:treetop.treedir
+ else
+ let treedir= a:treetop.'/'.treedir
+ endif
+" call Decho("treedir#2<".treedir.">",'~'.expand("<slnum>"))
+ let treedir= substitute(treedir,'//$','/','')
+" call Decho("treedir#3<".treedir.">",'~'.expand("<slnum>"))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))"
+ call winrestview(svpos)
+" call Dret("s:NetrwTreePath <".treedir.">")
+ return treedir
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwWideListing: {{{2
+fun! s:NetrwWideListing()
+
+ if w:netrw_liststyle == s:WIDELIST
+" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
+ " look for longest filename (cpf=characters per filename)
+ " cpf: characters per filename
+ " fpl: filenames per line
+ " fpc: filenames per column
+ setl ma noro
+ let keepa= @a
+" call Decho("setl ma noro",'~'.expand("<slnum>"))
+ let b:netrw_cpf= 0
+ if line("$") >= w:netrw_bannercnt
+ " determine the maximum filename size; use that to set cpf
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
+ NetrwKeepj call histdel("/",-1)
+ else
+ let @a= keepa
+" call Dret("NetrwWideListing")
+ return
+ endif
+ " allow for two spaces to separate columns
+ let b:netrw_cpf= b:netrw_cpf + 2
+" call Decho("b:netrw_cpf=max_filename_length+2=".b:netrw_cpf,'~'.expand("<slnum>"))
+
+ " determine qty files per line (fpl)
+ let w:netrw_fpl= winwidth(0)/b:netrw_cpf
+ if w:netrw_fpl <= 0
+ let w:netrw_fpl= 1
+ endif
+" call Decho("fpl= [winwidth=".winwidth(0)."]/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl,'~'.expand("<slnum>"))
+
+ " make wide display
+ " fpc: files per column of wide listing
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'S",submatch(0)),"\\")/'
+ NetrwKeepj call histdel("/",-1)
+ let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
+ let newcolstart = w:netrw_bannercnt + fpc
+ let newcolend = newcolstart + fpc - 1
+" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]",'~'.expand("<slnum>"))
+ if has("clipboard") && g:netrw_clipboard
+" call Decho("(s:NetrwWideListing) save @* and @+",'~'.expand("<slnum>"))
+ sil! let keepregstar = @*
+ sil! let keepregplus = @+
+ endif
+ while line("$") >= newcolstart
+ if newcolend > line("$") | let newcolend= line("$") | endif
+ let newcolqty= newcolend - newcolstart
+ exe newcolstart
+ " COMBAK: both of the visual-mode using lines below are problematic vis-a-vis @*
+ if newcolqty == 0
+ exe "sil! NetrwKeepj norm! 0\<c-v>$h\"ax".w:netrw_bannercnt."G$\"ap"
+ else
+ exe "sil! NetrwKeepj norm! 0\<c-v>".newcolqty.'j$h"ax'.w:netrw_bannercnt.'G$"ap'
+ endif
+ exe "sil! NetrwKeepj ".newcolstart.','.newcolend.'d _'
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt
+ endwhile
+ if has("clipboard")
+" call Decho("(s:NetrwWideListing) restore @* and @+",'~'.expand("<slnum>"))
+ if @* != keepregstar | sil! let @* = keepregstar | endif
+ if @+ != keepregplus | sil! let @+ = keepregplus | endif
+ endif
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$s/\s\+$//e'
+ NetrwKeepj call histdel("/",-1)
+ exe 'nno <buffer> <silent> w :call search(''^.\\|\s\s\zs\S'',''W'')'."\<cr>"
+ exe 'nno <buffer> <silent> b :call search(''^.\\|\s\s\zs\S'',''bW'')'."\<cr>"
+" call Decho("NetrwWideListing) setl noma nomod ro",'~'.expand("<slnum>"))
+ exe "setl ".g:netrw_bufsettings
+ let @a= keepa
+" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+" call Dret("NetrwWideListing")
+ return
+ else
+ if hasmapto("w","n")
+ sil! nunmap <buffer> w
+ endif
+ if hasmapto("b","n")
+ sil! nunmap <buffer> b
+ endif
+ endif
+
+endfun
+
+" ---------------------------------------------------------------------
+" s:PerformListing: {{{2
+fun! s:PerformListing(islocal)
+" call Dfunc("s:PerformListing(islocal=".a:islocal.")")
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
+" call Decho("settings: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo. " (enter)"." ei<".&ei.">",'~'.expand("<slnum>"))
+ sil! NetrwKeepj %d _
+" call DechoBuf(bufnr("%"))
+
+ " set up syntax highlighting {{{3
+" call Decho("--set up syntax highlighting (ie. setl ft=netrw)",'~'.expand("<slnum>"))
+ sil! setl ft=netrw
+
+ NetrwKeepj call s:NetrwOptionsSafe(a:islocal)
+ setl noro ma
+" call Decho("setl noro ma bh=".&bh,'~'.expand("<slnum>"))
+
+" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
+" call Decho("Processing your browsing request...",'~'.expand("<slnum>"))
+" endif " Decho
+
+" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
+ " force a refresh for tree listings
+" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d",'~'.expand("<slnum>"))
+ sil! NetrwKeepj %d _
+ endif
+
+ " save current directory on directory history list
+ NetrwKeepj call s:NetrwBookHistHandler(3,b:netrw_curdir)
+
+ " Set up the banner {{{3
+ if g:netrw_banner
+" call Decho("--set up banner",'~'.expand("<slnum>"))
+ NetrwKeepj call setline(1,'" ============================================================================')
+ if exists("g:netrw_pchk")
+ " this undocumented option allows pchk to run with different versions of netrw without causing spurious
+ " failure detections.
+ NetrwKeepj call setline(2,'" Netrw Directory Listing')
+ else
+ NetrwKeepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')')
+ endif
+ if exists("g:netrw_pchk")
+ let curdir= substitute(b:netrw_curdir,expand("$HOME"),'~','')
+ else
+ let curdir= b:netrw_curdir
+ endif
+ if exists("g:netrw_bannerbackslash") && g:netrw_bannerbackslash
+ NetrwKeepj call setline(3,'" '.substitute(curdir,'/','\\','g'))
+ else
+ NetrwKeepj call setline(3,'" '.curdir)
+ endif
+ let w:netrw_bannercnt= 3
+ NetrwKeepj exe "sil! NetrwKeepj ".w:netrw_bannercnt
+ else
+" call Decho("--no banner",'~'.expand("<slnum>"))
+ NetrwKeepj 1
+ let w:netrw_bannercnt= 1
+ endif
+" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." win#".winnr(),'~'.expand("<slnum>"))
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
+
+ " construct sortby string: [name|time|size|exten] [reversed]
+ let sortby= g:netrw_sort_by
+ 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"
+" call Decho("directories will be sorted by name",'~'.expand("<slnum>"))
+ " sorted by name (also includes the sorting sequence in the banner)
+ NetrwKeepj put ='\" Sorted by '.sortby
+ NetrwKeepj put ='\" Sort sequence: '.g:netrw_sort_sequence
+ let w:netrw_bannercnt= w:netrw_bannercnt + 2
+ else
+" call Decho("directories will be sorted by size or time",'~'.expand("<slnum>"))
+ " sorted by time, size, exten
+ NetrwKeepj put ='\" Sorted by '.sortby
+ let w:netrw_bannercnt= w:netrw_bannercnt + 1
+ endif
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt
+" else " Decho
+" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
+ endif
+
+ " show copy/move target, if any {{{3
+ if g:netrw_banner
+ if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
+" call Decho("--show copy/move target<".s:netrwmftgt.">",'~'.expand("<slnum>"))
+ NetrwKeepj put =''
+ if s:netrwmftgt_islocal
+ sil! NetrwKeepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
+ else
+ sil! NetrwKeepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
+ endif
+ let w:netrw_bannercnt= w:netrw_bannercnt + 1
+ else
+" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt",'~'.expand("<slnum>"))
+ endif
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt
+ endif
+
+ " Hiding... -or- Showing... {{{3
+ if g:netrw_banner
+" call Decho("--handle hiding/showing in banner (g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">)",'~'.expand("<slnum>"))
+ if g:netrw_list_hide != "" && g:netrw_hide
+ if g:netrw_hide == 1
+ NetrwKeepj put ='\" Hiding: '.g:netrw_list_hide
+ else
+ NetrwKeepj put ='\" Showing: '.g:netrw_list_hide
+ endif
+ let w:netrw_bannercnt= w:netrw_bannercnt + 1
+ endif
+ exe "NetrwKeepj ".w:netrw_bannercnt
+
+" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ let quickhelp = g:netrw_quickhelp%len(s:QuickHelp)
+" call Decho("quickhelp =".quickhelp,'~'.expand("<slnum>"))
+ NetrwKeepj put ='\" Quick Help: <F1>:help '.s:QuickHelp[quickhelp]
+" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ NetrwKeepj put ='\" =============================================================================='
+ let w:netrw_bannercnt= w:netrw_bannercnt + 2
+" else " Decho
+" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
+ endif
+
+ " bannercnt should index the line just after the banner
+ if g:netrw_banner
+ let w:netrw_bannercnt= w:netrw_bannercnt + 1
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt
+" call Decho("--w:netrw_bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"),'~'.expand("<slnum>"))
+" else " Decho
+" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
+ endif
+
+ " get list of files
+" call Decho("--Get list of files - islocal=".a:islocal,'~'.expand("<slnum>"))
+ if a:islocal
+ NetrwKeepj call s:LocalListing()
+ else " remote
+ NetrwKeepj let badresult= s:NetrwRemoteListing()
+ if badresult
+" call Decho("w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'n/a')." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
+" call Dret("s:PerformListing : error detected by NetrwRemoteListing")
+ return
+ endif
+ endif
+
+ " manipulate the directory listing (hide, sort) {{{3
+ if !exists("w:netrw_bannercnt")
+ let w:netrw_bannercnt= 0
+ endif
+" call Decho("--manipulate directory listing (hide, sort)",'~'.expand("<slnum>"))
+" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)",'~'.expand("<slnum>"))
+" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
+
+ if !g:netrw_banner || line("$") >= w:netrw_bannercnt
+" call Decho("manipulate directory listing (support hide)",'~'.expand("<slnum>"))
+" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">",'~'.expand("<slnum>"))
+ if g:netrw_hide && g:netrw_list_hide != ""
+ NetrwKeepj call s:NetrwListHide()
+ endif
+ 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"
+ " sort by name
+" call Decho("sort by name",'~'.expand("<slnum>"))
+ 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'
+ " name: sort by name of file
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
+ else
+ " reverse direction sorting
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
+ endif
+ endif
+
+ " remove priority pattern prefix
+" call Decho("remove priority pattern prefix",'~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e'
+ NetrwKeepj call histdel("/",-1)
+
+ elseif g:netrw_sort_by =~# "^ext"
+ " exten: sort by extension
+ " The histdel(...,-1) calls remove the last search from the search history
+" call Decho("sort by extension",'~'.expand("<slnum>"))
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$g+/+s/^/001'.g:netrw_sepchr.'/'
+ NetrwKeepj call histdel("/",-1)
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$v+[./]+s/^/002'.g:netrw_sepchr.'/'
+ NetrwKeepj call histdel("/",-1)
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$v+['.g:netrw_sepchr.'/]+s/^\(.*\.\)\(.\{-\}\)$/\2'.g:netrw_sepchr.'&/e'
+ 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'
+ " normal direction sorting
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
+ else
+ " reverse direction sorting
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
+ endif
+ endif
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^.\{-}'.g:netrw_sepchr.'//e'
+ NetrwKeepj call histdel("/",-1)
+
+ 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'
+" call Decho('exe sil NetrwKeepj '.w:netrw_bannercnt.',$sort','~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options
+ else
+" call Decho('exe sil NetrwKeepj '.w:netrw_bannercnt.',$sort!','~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options
+ endif
+" call Decho("remove leading digits/ (sorting) information from listing",'~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
+ NetrwKeepj call histdel("/",-1)
+ endif
+ endif
+
+ 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
+ call histdel("/",-1)
+ endif
+ endif
+ endif
+" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
+
+ " convert to wide/tree listing {{{3
+" call Decho("--modify display if wide/tree listing style",'~'.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. " (internal#1)",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwWideListing()
+" 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. " (internal#2)",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwTreeListing(b:netrw_curdir)
+" 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. " (internal#3)",'~'.expand("<slnum>"))
+
+ " resolve symbolic links if local and (thin or tree)
+ if a:islocal && (w:netrw_liststyle == s:THINLIST || (exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST))
+" call Decho("--resolve symbolic links if local and thin|tree",'~'.expand("<slnum>"))
+ sil! g/@$/call s:ShowLink()
+ endif
+
+ if exists("w:netrw_bannercnt") && (line("$") >= w:netrw_bannercnt || !g:netrw_banner)
+ " place cursor on the top-left corner of the file listing
+" call Decho("--place cursor on top-left corner of file listing",'~'.expand("<slnum>"))
+ exe 'sil! '.w:netrw_bannercnt
+ sil! NetrwKeepj norm! 0
+" call Decho(" tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
+ else
+" call Decho("--did NOT place cursor on top-left corner",'~'.expand("<slnum>"))
+" call Decho(" w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'n/a'),'~'.expand("<slnum>"))
+" call Decho(" line($)=".line("$"),'~'.expand("<slnum>"))
+" call Decho(" g:netrw_banner=".(exists("g:netrw_banner")? g:netrw_banner : 'n/a'),'~'.expand("<slnum>"))
+ endif
+
+ " record previous current directory
+ let w:netrw_prvdir= b:netrw_curdir
+" call Decho("--record netrw_prvdir<".w:netrw_prvdir.">",'~'.expand("<slnum>"))
+
+ " save certain window-oriented variables into buffer-oriented variables {{{3
+" call Decho("--save some window-oriented variables into buffer oriented variables",'~'.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. " (internal#4)",'~'.expand("<slnum>"))
+ NetrwKeepj call s:SetBufWinVars()
+" 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. " (internal#5)",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwOptionsRestore("w:")
+" 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. " (internal#6)",'~'.expand("<slnum>"))
+
+ " set display to netrw display settings
+" call Decho("--set display to netrw display settings (".g:netrw_bufsettings.")",'~'.expand("<slnum>"))
+ exe "setl ".g:netrw_bufsettings
+" 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. " (internal#7)",'~'.expand("<slnum>"))
+ if g:netrw_liststyle == s:LONGLIST
+" call Decho("exe setl ts=".(g:netrw_maxfilenamelen+1),'~'.expand("<slnum>"))
+ exe "setl ts=".(g:netrw_maxfilenamelen+1)
+ endif
+" call Decho("PerformListing buffer:",'~'.expand("<slnum>"))
+" call DechoBuf(bufnr("%"))
+
+ if exists("s:treecurpos")
+" call Decho("s:treecurpos exists; restore posn",'~'.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. " (internal#8)",'~'.expand("<slnum>"))
+" call Decho("restoring posn to s:treecurpos<".string(s:treecurpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(s:treecurpos)
+ unlet s:treecurpos
+ endif
+
+" 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. " (return)",'~'.expand("<slnum>"))
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()." line($)=".line("$"),'~'.expand("<slnum>"))
+" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
+endfun
+
+" ---------------------------------------------------------------------
+" s:SetupNetrwStatusLine: {{{2
+fun! s:SetupNetrwStatusLine(statline)
+" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
+
+ if !exists("s:netrw_setup_statline")
+ let s:netrw_setup_statline= 1
+" call Decho("do first-time status line setup",'~'.expand("<slnum>"))
+
+ if !exists("s:netrw_users_stl")
+ let s:netrw_users_stl= &stl
+ endif
+ if !exists("s:netrw_users_ls")
+ let s:netrw_users_ls= &laststatus
+ endif
+
+ " set up User9 highlighting as needed
+ let keepa= @a
+ redir @a
+ try
+ hi User9
+ catch /^Vim\%((\a\{3,})\)\=:E411/
+ if &bg == "dark"
+ hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
+ else
+ hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
+ endif
+ endtry
+ redir END
+ let @a= keepa
+ endif
+
+ " set up status line (may use User9 highlighting)
+ " insure that windows have a statusline
+ " make sure statusline is displayed
+ let &stl=a:statline
+ setl laststatus=2
+" call Decho("stl=".&stl,'~'.expand("<slnum>"))
+ redraw
+
+" call Dret("SetupNetrwStatusLine : stl=".&stl)
+endfun
+
+" =========================================
+" Remote Directory Browsing Support: {{{1
+" =========================================
+
+" ---------------------------------------------------------------------
+" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2
+" This function assumes that a long listing will be received. Size, time,
+" and reverse sorts will be requested of the server but not otherwise
+" enforced here.
+fun! s:NetrwRemoteFtpCmd(path,listcmd)
+" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) w:netrw_method=".(exists("w:netrw_method")? w:netrw_method : (exists("b:netrw_method")? b:netrw_method : "???")))
+" call Decho("line($)=".line("$")." win#".winnr()." w:netrw_bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
+ " sanity check: {{{3
+ if !exists("w:netrw_method")
+ if exists("b:netrw_method")
+ let w:netrw_method= b:netrw_method
+ else
+ call netrw#ErrorMsg(2,"(s:NetrwRemoteFtpCmd) internal netrw error",93)
+" call Dret("NetrwRemoteFtpCmd")
+ return
+ endif
+ endif
+
+ " WinXX ftp uses unix style input, so set ff to unix " {{{3
+ let ffkeep= &ff
+ setl ma ff=unix noro
+" call Decho("setl ma ff=unix noro",'~'.expand("<slnum>"))
+
+ " clear off any older non-banner lines " {{{3
+ " note that w:netrw_bannercnt indexes the line after the banner
+" call Decho('exe sil! NetrwKeepj '.w:netrw_bannercnt.",$d _ (clear off old non-banner lines)",'~'.expand("<slnum>"))
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt.",$d _"
+
+ ".........................................
+ if w:netrw_method == 2 || w:netrw_method == 5 " {{{3
+ " ftp + <.netrc>: Method #2
+ if a:path != ""
+ NetrwKeepj put ='cd \"'.a:path.'\"'
+ endif
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ endif
+ NetrwKeepj call setline(line("$")+1,a:listcmd)
+" exe "NetrwKeepj ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."),''~''.expand("<slnum>"))'
+ if exists("g:netrw_port") && g:netrw_port != ""
+" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1),'~'.expand("<slnum>"))
+ exe s:netrw_silentxfer." NetrwKeepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)." ".s:ShellEscape(g:netrw_port,1)
+ else
+" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1),'~'.expand("<slnum>"))
+ exe s:netrw_silentxfer." NetrwKeepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".s:ShellEscape(g:netrw_machine,1)
+ endif
+
+ ".........................................
+ elseif w:netrw_method == 3 " {{{3
+ " ftp + machine,id,passwd,filename: Method #3
+ setl ff=unix
+ if exists("g:netrw_port") && g:netrw_port != ""
+ NetrwKeepj put ='open '.g:netrw_machine.' '.g:netrw_port
+ else
+ NetrwKeepj put ='open '.g:netrw_machine
+ endif
+
+ " handle userid and password
+ let host= substitute(g:netrw_machine,'\..*$','','')
+" call Decho("host<".host.">",'~'.expand("<slnum>"))
+ if exists("s:netrw_hup") && exists("s:netrw_hup[host]")
+ call NetUserPass("ftp:".host)
+ endif
+ if exists("g:netrw_uid") && g:netrw_uid != ""
+ if exists("g:netrw_ftp") && g:netrw_ftp == 1
+ NetrwKeepj put =g:netrw_uid
+ if exists("s:netrw_passwd") && s:netrw_passwd != ""
+ NetrwKeepj put ='\"'.s:netrw_passwd.'\"'
+ endif
+ elseif exists("s:netrw_passwd")
+ NetrwKeepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
+ endif
+ endif
+
+ if a:path != ""
+ NetrwKeepj put ='cd \"'.a:path.'\"'
+ endif
+ if exists("g:netrw_ftpextracmd")
+ NetrwKeepj put =g:netrw_ftpextracmd
+" call Decho("filter input: ".getline('.'),'~'.expand("<slnum>"))
+ endif
+ NetrwKeepj call setline(line("$")+1,a:listcmd)
+
+ " perform ftp:
+ " -i : turns off interactive prompting from ftp
+ " -n unix : DON'T use <.netrc>, even though it exists
+ " -n win32: quit being obnoxious about password
+ if exists("w:netrw_bannercnt")
+" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."),''~''.expand("<slnum>"))'
+ call s:NetrwExe(s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options)
+" else " Decho
+" call Decho("WARNING: w:netrw_bannercnt doesn't exist!",'~'.expand("<slnum>"))
+" g/^./call Decho("SKIPPING ftp#".line(".").": ".getline("."),'~'.expand("<slnum>"))
+ endif
+
+ ".........................................
+ elseif w:netrw_method == 9 " {{{3
+ " sftp username@machine: Method #9
+ " s:netrw_sftp_cmd
+ setl ff=unix
+
+ " restore settings
+ let &ff= ffkeep
+" call Dret("NetrwRemoteFtpCmd")
+ return
+
+ ".........................................
+ else " {{{3
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . bufname("%") . ">",23)
+ endif
+
+ " cleanup for Windows " {{{3
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ sil! NetrwKeepj %s/\r$//e
+ NetrwKeepj call histdel("/",-1)
+ endif
+ if a:listcmd == "dir"
+ " infer directory/link based on the file permission string
+ sil! NetrwKeepj g/d\%([-r][-w][-x]\)\{3}/NetrwKeepj s@$@/@e
+ sil! NetrwKeepj g/l\%([-r][-w][-x]\)\{3}/NetrwKeepj s/$/@/e
+ NetrwKeepj call histdel("/",-1)
+ NetrwKeepj call histdel("/",-1)
+ if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || (exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST)
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e'
+ NetrwKeepj call histdel("/",-1)
+ endif
+ endif
+
+ " ftp's listing doesn't seem to include ./ or ../ " {{{3
+ if !search('^\.\/$\|\s\.\/$','wn')
+ exe 'NetrwKeepj '.w:netrw_bannercnt
+ NetrwKeepj put ='./'
+ endif
+ if !search('^\.\.\/$\|\s\.\.\/$','wn')
+ exe 'NetrwKeepj '.w:netrw_bannercnt
+ NetrwKeepj put ='../'
+ endif
+
+ " restore settings " {{{3
+ let &ff= ffkeep
+" call Dret("NetrwRemoteFtpCmd")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwRemoteListing: {{{2
+fun! s:NetrwRemoteListing()
+" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">) win#".winnr())
+
+ if !exists("w:netrw_bannercnt") && exists("s:bannercnt")
+ let w:netrw_bannercnt= s:bannercnt
+ endif
+ if !exists("w:netrw_bannercnt") && exists("b:bannercnt")
+ let w:netrw_bannercnt= s:bannercnt
+ endif
+
+ call s:RemotePathAnalysis(b:netrw_curdir)
+
+ " sanity check:
+ if exists("b:netrw_method") && b:netrw_method =~ '[235]'
+" call Decho("b:netrw_method=".b:netrw_method,'~'.expand("<slnum>"))
+ if !executable("ftp")
+" call Decho("ftp is not executable",'~'.expand("<slnum>"))
+ if !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18)
+ endif
+ call s:NetrwOptionsRestore("w:")
+" call Dret("s:NetrwRemoteListing -1")
+ return -1
+ endif
+
+ elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == ''
+" call Decho("g:netrw_list_cmd<",(exists("g:netrw_list_cmd")? 'n/a' : "-empty-").">",'~'.expand("<slnum>"))
+ if !exists("g:netrw_quiet")
+ if g:netrw_list_cmd == ""
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"your g:netrw_list_cmd is empty; perhaps ".g:netrw_ssh_cmd." is not executable on your system",47)
+ else
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19)
+ endif
+ endif
+
+ NetrwKeepj call s:NetrwOptionsRestore("w:")
+" call Dret("s:NetrwRemoteListing -1")
+ return -1
+ endif " (remote handling sanity check)
+" call Decho("passed remote listing sanity checks",'~'.expand("<slnum>"))
+
+ if exists("b:netrw_method")
+" call Decho("setting w:netrw_method to b:netrw_method<".b:netrw_method.">",'~'.expand("<slnum>"))
+ let w:netrw_method= b:netrw_method
+ endif
+
+ if s:method == "ftp"
+ " use ftp to get remote file listing {{{3
+" 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'
+ let listcmd= g:netrw_ftp_timelist_cmd
+ 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>"))
+ call s:NetrwRemoteFtpCmd(s:path,listcmd)
+" exe "sil! keepalt NetrwKeepj ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."),''~''.expand("<slnum>"))'
+
+ " report on missing file or directory messages
+ if search('[Nn]o such file or directory\|Failed to change directory')
+ let mesg= getline(".")
+ if exists("w:netrw_bannercnt")
+ setl ma
+ exe w:netrw_bannercnt.",$d _"
+ setl noma
+ endif
+ NetrwKeepj call s:NetrwOptionsRestore("w:")
+ call netrw#ErrorMsg(s:WARNING,mesg,96)
+" call Dret("s:NetrwRemoteListing : -1")
+ return -1
+ endif
+
+ if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || (exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST)
+ " shorten the listing
+" call Decho("generate short listing",'~'.expand("<slnum>"))
+ exe "sil! keepalt NetrwKeepj ".w:netrw_bannercnt
+
+ " cleanup
+ if g:netrw_ftp_browse_reject != ""
+ exe "sil! keepalt NetrwKeepj g/".g:netrw_ftp_browse_reject."/NetrwKeepj d"
+ NetrwKeepj call histdel("/",-1)
+ endif
+ sil! NetrwKeepj %s/\r$//e
+ NetrwKeepj call histdel("/",-1)
+
+ " if there's no ../ listed, then put ../ in
+ let line1= line(".")
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt
+ let line2= search('\.\.\/\%(\s\|$\)','cnW')
+" call Decho("search(".'\.\.\/\%(\s\|$\)'."','cnW')=".line2." w:netrw_bannercnt=".w:netrw_bannercnt,'~'.expand("<slnum>"))
+ if line2 == 0
+" call Decho("netrw is putting ../ into listing",'~'.expand("<slnum>"))
+ sil! NetrwKeepj put='../'
+ endif
+ exe "sil! NetrwKeepj ".line1
+ sil! NetrwKeepj norm! 0
+
+" call Decho("line1=".line1." line2=".line2." line(.)=".line("."),'~'.expand("<slnum>"))
+ if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
+" call Decho("M$ ftp cleanup",'~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//'
+ NetrwKeepj call histdel("/",-1)
+ else " normal ftp cleanup
+" call Decho("normal ftp cleanup",'~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e'
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e'
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e'
+ NetrwKeepj call histdel("/",-1)
+ NetrwKeepj call histdel("/",-1)
+ NetrwKeepj call histdel("/",-1)
+ endif
+ endif
+
+ else
+ " use ssh to get remote file listing {{{3
+" call Decho("use ssh to get remote file listing: s:path<".s:path.">",'~'.expand("<slnum>"))
+ let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
+" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)",'~'.expand("<slnum>"))
+ if g:netrw_scp_cmd =~ '^pscp'
+" call Decho("1: exe r! ".s:ShellEscape(listcmd.s:path, 1),'~'.expand("<slnum>"))
+ exe "NetrwKeepj r! ".listcmd.s:ShellEscape(s:path, 1)
+ " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
+ sil! NetrwKeepj g/^Listing directory/NetrwKeepj d
+ sil! NetrwKeepj g/^d[-rwx][-rwx][-rwx]/NetrwKeepj s+$+/+e
+ sil! NetrwKeepj g/^l[-rwx][-rwx][-rwx]/NetrwKeepj s+$+@+e
+ NetrwKeepj call histdel("/",-1)
+ NetrwKeepj call histdel("/",-1)
+ NetrwKeepj call histdel("/",-1)
+ if g:netrw_liststyle != s:LONGLIST
+ sil! NetrwKeepj g/^[dlsp-][-rwx][-rwx][-rwx]/NetrwKeepj s/^.*\s\(\S\+\)$/\1/e
+ NetrwKeepj call histdel("/",-1)
+ endif
+ else
+ if s:path == ""
+" call Decho("2: exe r! ".listcmd,'~'.expand("<slnum>"))
+ exe "NetrwKeepj keepalt r! ".listcmd
+ else
+" call Decho("3: exe r! ".listcmd.' '.s:ShellEscape(fnameescape(s:path),1),'~'.expand("<slnum>"))
+ exe "NetrwKeepj keepalt r! ".listcmd.' '.s:ShellEscape(fnameescape(s:path),1)
+" call Decho("listcmd<".listcmd."> path<".s:path.">",'~'.expand("<slnum>"))
+ endif
+ endif
+
+ " cleanup
+ if g:netrw_ssh_browse_reject != ""
+" call Decho("cleanup: exe sil! g/".g:netrw_ssh_browse_reject."/NetrwKeepj d",'~'.expand("<slnum>"))
+ exe "sil! g/".g:netrw_ssh_browse_reject."/NetrwKeepj d"
+ NetrwKeepj call histdel("/",-1)
+ endif
+ endif
+
+ if w:netrw_liststyle == s:LONGLIST
+ " do a long listing; these substitutions need to be done prior to sorting {{{3
+" call Decho("fix long listing:",'~'.expand("<slnum>"))
+
+ if s:method == "ftp"
+ " cleanup
+ exe "sil! NetrwKeepj ".w:netrw_bannercnt
+ while getline('.') =~# g:netrw_ftp_browse_reject
+ sil! NetrwKeepj d
+ endwhile
+ " if there's no ../ listed, then put ../ in
+ let line1= line(".")
+ sil! NetrwKeepj 1
+ sil! NetrwKeepj call search('^\.\.\/\%(\s\|$\)','W')
+ let line2= line(".")
+ if line2 == 0
+ if b:netrw_curdir != '/'
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt."put='../'"
+ endif
+ endif
+ exe "sil! NetrwKeepj ".line1
+ sil! NetrwKeepj norm! 0
+ endif
+
+ if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup
+" call Decho("M$ ftp site listing cleanup",'~'.expand("<slnum>"))
+ exe 'sil! NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/'
+ elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$")
+" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$"),'~'.expand("<slnum>"))
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/ -> .*$//e'
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2 \t\1/e'
+ exe 'sil NetrwKeepj '.w:netrw_bannercnt
+ NetrwKeepj call histdel("/",-1)
+ NetrwKeepj call histdel("/",-1)
+ NetrwKeepj call histdel("/",-1)
+ endif
+ endif
+
+" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho
+" exe "NetrwKeepj ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."),''~''.expand("<slnum>"))'
+" endif " Decho
+
+" call Dret("s:NetrwRemoteListing 0")
+ return 0
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2
+fun! s:NetrwRemoteRm(usrhost,path) range
+" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol("."))
+" call Decho("firstline=".a:firstline." lastline=".a:lastline,'~'.expand("<slnum>"))
+ let svpos= winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+
+ let all= 0
+ if exists("s:netrwmarkfilelist_{bufnr('%')}")
+ " remove all marked files
+" 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]'
+ break
+ elseif ok =~# 'a\%[ll]'
+ let all= 1
+ endif
+ endfor
+ call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
+
+ else
+ " remove files specified by range
+" call Decho("remove files specified by range",'~'.expand("<slnum>"))
+
+ " preparation for removing multiple files/directories
+ let keepsol = &l:sol
+ setl nosol
+ let ctr = a:firstline
+
+ " remove multiple files and directories
+ while ctr <= a:lastline
+ exe "NetrwKeepj ".ctr
+ let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all)
+ if ok =~# 'q\%[uit]'
+ break
+ elseif ok =~# 'a\%[ll]'
+ let all= 1
+ endif
+ let ctr= ctr + 1
+ endwhile
+ let &l:sol = keepsol
+ endif
+
+ " refresh the (remote) directory listing
+" call Decho("refresh remote directory listing",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+
+" call Dret("s:NetrwRemoteRm")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwRemoteRmFile: {{{2
+fun! s:NetrwRemoteRmFile(path,rmfile,all)
+" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all)
+
+ let all= a:all
+ let ok = ""
+
+ if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$')
+ " attempt to remove file
+" call Decho("attempt to remove file (all=".all.")",'~'.expand("<slnum>"))
+ if !all
+ echohl Statement
+" call Decho("case all=0:",'~'.expand("<slnum>"))
+ call inputsave()
+ let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
+ call inputrestore()
+ echohl NONE
+ if ok == ""
+ let ok="no"
+ endif
+ let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
+ if ok =~# 'a\%[ll]'
+ let all= 1
+ endif
+ endif
+
+ 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>"))
+ let path= a:path
+ if path =~ '^\a\{3,}://'
+ let path= substitute(path,'^\a\{3,}://[^/]\+/','','')
+ endif
+ sil! NetrwKeepj .,$d _
+ call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
+ else
+" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">",'~'.expand("<slnum>"))
+ let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
+" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">",'~'.expand("<slnum>"))
+ if !exists("b:netrw_curdir")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
+ let ok="q"
+ else
+ let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
+" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">",'~'.expand("<slnum>"))
+" call Decho("remotedir<".remotedir.">",'~'.expand("<slnum>"))
+" call Decho("rmfile<".a:rmfile.">",'~'.expand("<slnum>"))
+ if remotedir != ""
+ let netrw_rm_cmd= netrw_rm_cmd." ".s:ShellEscape(fnameescape(remotedir.a:rmfile))
+ else
+ let netrw_rm_cmd= netrw_rm_cmd." ".s:ShellEscape(fnameescape(a:rmfile))
+ endif
+" call Decho("call system(".netrw_rm_cmd.")",'~'.expand("<slnum>"))
+ let ret= system(netrw_rm_cmd)
+ if v:shell_error != 0
+ if exists("b:netrw_curdir") && b:netrw_curdir != getcwd() && !g:netrw_keepdir
+ call netrw#ErrorMsg(s:ERROR,"remove failed; perhaps due to vim's current directory<".getcwd()."> not matching netrw's (".b:netrw_curdir.") (see :help netrw-cd)",102)
+ else
+ call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60)
+ endif
+ 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]'
+" call Decho("ok==".ok,'~'.expand("<slnum>"))
+ endif
+
+ else
+ " attempt to remove directory
+" call Decho("attempt to remove directory",'~'.expand("<slnum>"))
+ if !all
+ call inputsave()
+ let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
+ call inputrestore()
+ if ok == ""
+ let ok="no"
+ endif
+ let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
+ if ok =~# 'a\%[ll]'
+ let all= 1
+ endif
+ endif
+
+ 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
+ let rmfile = substitute(a:path.a:rmfile,'/$','','')
+ let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.s:ShellEscape(netrw#WinPath(rmfile))
+" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")",'~'.expand("<slnum>"))
+ let ret= system(netrw_rmdir_cmd)
+" call Decho("returned=".ret." errcode=".v:shell_error,'~'.expand("<slnum>"))
+
+ if v:shell_error != 0
+" call Decho("v:shell_error not 0",'~'.expand("<slnum>"))
+ let netrw_rmf_cmd= s:MakeSshCmd(netrw#WinPath(g:netrw_rmf_cmd)).' '.s:ShellEscape(netrw#WinPath(substitute(rmfile,'[\/]$','','e')))
+" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")",'~'.expand("<slnum>"))
+ let ret= system(netrw_rmf_cmd)
+" call Decho("returned=".ret." errcode=".v:shell_error,'~'.expand("<slnum>"))
+
+ if v:shell_error != 0 && !exists("g:netrw_quiet")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22)
+ endif
+ endif
+ endif
+
+ elseif ok =~# 'q\%[uit]'
+" call Decho("ok==".ok,'~'.expand("<slnum>"))
+ endif
+ endif
+
+" call Dret("s:NetrwRemoteRmFile ".ok)
+ return ok
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwRemoteRename: rename a remote file or directory {{{2
+fun! s:NetrwRemoteRename(usrhost,path) range
+" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)")
+
+ " preparation for removing multiple files/directories
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ let ctr = a:firstline
+ let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
+
+ " rename files given by the markfilelist
+ if exists("s:netrwmarkfilelist_{bufnr('%')}")
+ for oldname in s:netrwmarkfilelist_{bufnr("%")}
+" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
+ if exists("subfrom")
+ let newname= substitute(oldname,subfrom,subto,'')
+" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
+ else
+ call inputsave()
+ let newname= input("Moving ".oldname." to : ",oldname)
+ call inputrestore()
+ if newname =~ '^s/'
+ let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
+ let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
+ let newname = substitute(oldname,subfrom,subto,'')
+" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
+ endif
+ endif
+
+ if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
+ NetrwKeepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
+ else
+ let oldname= s:ShellEscape(a:path.oldname)
+ let newname= s:ShellEscape(a:path.newname)
+" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")",'~'.expand("<slnum>"))
+ let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
+ endif
+
+ endfor
+ call s:NetrwUnMarkFile(1)
+
+ else
+
+ " attempt to rename files/directories
+ let keepsol= &l:sol
+ setl nosol
+ while ctr <= a:lastline
+ exe "NetrwKeepj ".ctr
+
+ let oldname= s:NetrwGetWord()
+" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
+
+ call inputsave()
+ let newname= input("Moving ".oldname." to : ",oldname)
+ call inputrestore()
+
+ if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
+ call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname)
+ else
+ let oldname= s:ShellEscape(a:path.oldname)
+ let newname= s:ShellEscape(a:path.newname)
+" call Decho("system(netrw#WinPath(".rename_cmd.") ".oldname.' '.newname.")",'~'.expand("<slnum>"))
+ let ret = system(netrw#WinPath(rename_cmd).' '.oldname.' '.newname)
+ endif
+
+ let ctr= ctr + 1
+ endwhile
+ let &l:sol= keepsol
+ endif
+
+ " refresh the directory
+ NetrwKeepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+
+" call Dret("NetrwRemoteRename")
+endfun
+
+" ==========================================
+" Local Directory Browsing Support: {{{1
+" ==========================================
+
+" ---------------------------------------------------------------------
+" netrw#FileUrlEdit: handles editing file://* files {{{2
+" Should accept: file://localhost/etc/fstab
+" file:///etc/fstab
+" file:///c:/WINDOWS/clock.avi
+" file:///c|/WINDOWS/clock.avi
+" file://localhost/c:/WINDOWS/clock.avi
+" file://localhost/c|/WINDOWS/clock.avi
+" file://c:/foo.txt
+" file:///c:/foo.txt
+" and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value
+fun! netrw#FileUrlEdit(fname)
+" call Dfunc("netrw#FileUrlEdit(fname<".a:fname.">)")
+ let fname = a:fname
+ if fname =~ '^file://localhost/'
+" call Decho('converting file://localhost/ -to- file:///','~'.expand("<slnum>"))
+ let fname= substitute(fname,'^file://localhost/','file:///','')
+" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
+ endif
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+ if fname =~ '^file:///\=\a[|:]/'
+" call Decho('converting file:///\a|/ -to- file://\a:/','~'.expand("<slnum>"))
+ let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','')
+" call Decho("fname<".fname.">",'~'.expand("<slnum>"))
+ endif
+ endif
+ let fname2396 = netrw#RFC2396(fname)
+ let fname2396e= fnameescape(fname2396)
+ let plainfname= substitute(fname2396,'file://\(.*\)','\1',"")
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+" call Decho("windows exception for plainfname",'~'.expand("<slnum>"))
+ if plainfname =~ '^/\+\a:'
+" call Decho('removing leading "/"s','~'.expand("<slnum>"))
+ let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','')
+ endif
+ endif
+
+" call Decho("fname2396<".fname2396.">",'~'.expand("<slnum>"))
+" call Decho("plainfname<".plainfname.">",'~'.expand("<slnum>"))
+ exe "sil doau BufReadPre ".fname2396e
+ exe 'NetrwKeepj keepalt edit '.plainfname
+ exe 'sil! NetrwKeepj keepalt bdelete '.fnameescape(a:fname)
+
+" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+" call Dret("netrw#FileUrlEdit")
+ exe "sil doau BufReadPost ".fname2396e
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#LocalBrowseCheck: {{{2
+fun! netrw#LocalBrowseCheck(dirname)
+ " This function is called by netrwPlugin.vim's s:LocalBrowseCheck(), s:NetrwRexplore(),
+ " and by <cr> when atop a listed file/directory (via a buffer-local map)
+ "
+ " unfortunate interaction -- split window debugging can't be used here, must use
+ " D-echoRemOn or D-echoTabOn as the BufEnter event triggers
+ " another call to LocalBrowseCheck() when attempts to write
+ " to the DBG buffer are made.
+ "
+ " The &ft == "netrw" test was installed because the BufEnter event
+ " 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("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!","netrw#LocalBrowseCheck")
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
+" call Decho("current buffer#".bufnr("%")."<".bufname("%")."> ft=".&ft,'~'.expand("<slnum>"))
+
+ let ykeep= @@
+ if isdirectory(s:NetrwFile(a:dirname))
+" call Decho("is-directory ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$")." ft<".&ft."> g:netrw_fastbrowse=".g:netrw_fastbrowse,'~'.expand("<slnum>"))
+
+ if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) || g:netrw_fastbrowse <= 1
+" call Decho("case 1 : ft=".&ft,'~'.expand("<slnum>"))
+" call Decho("s:rexposn_".bufnr("%")."<".bufname("%")."> ".(exists("s:rexposn_".bufnr("%"))? "exists" : "does not exist"),'~'.expand("<slnum>"))
+ sil! NetrwKeepj keepalt call s:NetrwBrowse(1,a:dirname)
+
+ elseif &ft == "netrw" && line("$") == 1
+" call Decho("case 2 (ft≡netrw && line($)≡1)",'~'.expand("<slnum>"))
+ sil! NetrwKeepj keepalt call s:NetrwBrowse(1,a:dirname)
+
+ elseif exists("s:treeforceredraw")
+" call Decho("case 3 (treeforceredraw)",'~'.expand("<slnum>"))
+ 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
+ endif
+
+ " The following code wipes out currently unused netrw buffers
+ " IF g:netrw_fastbrowse is zero (ie. slow browsing selected)
+ " AND IF the listing style is not a tree listing
+ if exists("g:netrw_fastbrowse") && g:netrw_fastbrowse == 0 && g:netrw_liststyle != s:TREELIST
+" call Decho("wiping out currently unused netrw buffers",'~'.expand("<slnum>"))
+ let ibuf = 1
+ let buflast = bufnr("$")
+ while ibuf <= buflast
+ if bufwinnr(ibuf) == -1 && isdirectory(s:NetrwFile(bufname(ibuf)))
+ exe "sil! keepj keepalt ".ibuf."bw!"
+ endif
+ let ibuf= ibuf + 1
+ endwhile
+ endif
+ let @@= ykeep
+" 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>"))
+ " not a directory, ignore it
+" call Dret("netrw#LocalBrowseCheck : not a directory, ignoring it; dirname<".a:dirname.">")
+endfun
+
+" ---------------------------------------------------------------------
+" s:LocalBrowseRefresh: this function is called after a user has {{{2
+" performed any shell command. The idea is to cause all local-browsing
+" buffers to be refreshed after a user has executed some shell command,
+" on the chance that s/he removed/created a file/directory with it.
+fun! s:LocalBrowseRefresh()
+" call Dfunc("s:LocalBrowseRefresh() tabpagenr($)=".tabpagenr("$"))
+" call Decho("s:netrw_browselist =".(exists("s:netrw_browselist")? string(s:netrw_browselist) : '<n/a>'),'~'.expand("<slnum>"))
+" call Decho("w:netrw_bannercnt =".(exists("w:netrw_bannercnt")? string(w:netrw_bannercnt) : '<n/a>'),'~'.expand("<slnum>"))
+
+ " determine which buffers currently reside in a tab
+ if !exists("s:netrw_browselist")
+" call Dret("s:LocalBrowseRefresh : browselist is empty")
+ return
+ endif
+ if !exists("w:netrw_bannercnt")
+" call Dret("s:LocalBrowseRefresh : don't refresh when focus not on netrw window")
+ return
+ endif
+ if exists("s:netrw_events") && s:netrw_events == 1
+ " s:LocalFastBrowser gets called (indirectly) from a
+ let s:netrw_events= 2
+" call Dret("s:LocalBrowseRefresh : avoid initial double refresh")
+ return
+ endif
+ let itab = 1
+ let buftablist = []
+ let ykeep = @@
+ while itab <= tabpagenr("$")
+ let buftablist = buftablist + tabpagebuflist()
+ let itab = itab + 1
+ sil! tabn
+ endwhile
+" call Decho("buftablist".string(buftablist),'~'.expand("<slnum>"))
+" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">",'~'.expand("<slnum>"))
+ " GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
+ " | refresh any netrw window
+ " | wipe out any non-displaying netrw buffer
+ let curwinid = win_getid(winnr())
+ let ibl = 0
+ for ibuf in s:netrw_browselist
+" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf),'~'.expand("<slnum>"))
+ if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
+ " wipe out any non-displaying netrw buffer
+ " (ibuf not shown in a current window AND
+ " ibuf not in any tab)
+" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">",'~'.expand("<slnum>"))
+ exe "sil! keepj bd ".fnameescape(ibuf)
+ call remove(s:netrw_browselist,ibl)
+" call Decho("browselist=".string(s:netrw_browselist),'~'.expand("<slnum>"))
+ continue
+ elseif index(tabpagebuflist(),ibuf) != -1
+ " refresh any netrw buffer
+" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf),'~'.expand("<slnum>"))
+ exe bufwinnr(ibuf)."wincmd w"
+ 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
+ endif
+" call Decho("#3: quickhelp=".g:netrw_quickhelp,'~'.expand("<slnum>"))
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+ NetrwKeepj call s:NetrwRefreshTreeDict(w:netrw_treetop)
+ endif
+ NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
+ endif
+ let ibl= ibl + 1
+" call Decho("bottom of s:netrw_browselist for loop: ibl=".ibl,'~'.expand("<slnum>"))
+ endfor
+" call Decho("restore window: win_gotoid(".curwinid.")")
+ call win_gotoid(curwinid)
+ let @@= ykeep
+
+" call Dret("s:LocalBrowseRefresh")
+endfun
+
+" ---------------------------------------------------------------------
+" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
+"
+" g:netrw_ Directory Is
+" fastbrowse Local Remote
+" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow)
+" med 1 D H H=Hiding a buffer implies it may be re-used (fast)
+" fast 2 H H
+"
+" Deleting a buffer means that it will be re-loaded when examined, hence "slow".
+" Hiding a buffer means that it will be re-used when examined, hence "fast".
+" (re-using a buffer may not be as accurate)
+"
+" s:netrw_events : doesn't exist, s:LocalFastBrowser() will install autocmds with medium-speed or fast browsing
+" =1: autocmds installed, but ignore next FocusGained event to avoid initial double-refresh of listing.
+" BufEnter may be first event, then a FocusGained event. Ignore the first FocusGained event.
+" If :Explore used: it sets s:netrw_events to 2, so no FocusGained events are ignored.
+" =2: autocmds installed (doesn't ignore any FocusGained events)
+fun! s:LocalFastBrowser()
+" call Dfunc("s:LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
+" call Decho("s:netrw_events ".(exists("s:netrw_events")? "exists" : 'n/a'),'~'.expand("<slnum>"))
+" call Decho("autocmd: ShellCmdPost ".(exists("#ShellCmdPost")? "already installed" : "not installed"),'~'.expand("<slnum>"))
+" call Decho("autocmd: FocusGained ".(exists("#FocusGained")? "already installed" : "not installed"),'~'.expand("<slnum>"))
+
+ " initialize browselist, a list of buffer numbers that the local browser has used
+ if !exists("s:netrw_browselist")
+" call Decho("initialize s:netrw_browselist",'~'.expand("<slnum>"))
+ let s:netrw_browselist= []
+ endif
+
+ " append current buffer to fastbrowse list
+ if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
+" call Decho("appendng current buffer to browselist",'~'.expand("<slnum>"))
+ call add(s:netrw_browselist,bufnr("%"))
+" call Decho("browselist=".string(s:netrw_browselist),'~'.expand("<slnum>"))
+ endif
+
+ " enable autocmd events to handle refreshing/removing local browser buffers
+ " If local browse buffer is currently showing: refresh it
+ " If local browse buffer is currently hidden : wipe it
+ " g:netrw_fastbrowse=0 : slow speed, never re-use directory listing
+ " =1 : medium speed, re-use directory listing for remote only
+ " =2 : fast speed, always re-use directory listing when possible
+ if g:netrw_fastbrowse <= 1 && !exists("#ShellCmdPost") && !exists("s:netrw_events")
+ let s:netrw_events= 1
+ augroup AuNetrwEvent
+ au!
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+" call Decho("installing autocmd: ShellCmdPost",'~'.expand("<slnum>"))
+ au ShellCmdPost * call s:LocalBrowseRefresh()
+ else
+" call Decho("installing autocmds: ShellCmdPost FocusGained",'~'.expand("<slnum>"))
+ au ShellCmdPost,FocusGained * call s:LocalBrowseRefresh()
+ endif
+ augroup END
+
+ " user must have changed fastbrowse to its fast setting, so remove
+ " the associated autocmd events
+ elseif g:netrw_fastbrowse > 1 && exists("#ShellCmdPost") && exists("s:netrw_events")
+" call Decho("remove AuNetrwEvent autcmd group",'~'.expand("<slnum>"))
+ unlet s:netrw_events
+ augroup AuNetrwEvent
+ au!
+ augroup END
+ augroup! AuNetrwEvent
+ endif
+
+" call Dret("s:LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
+endfun
+
+" ---------------------------------------------------------------------
+" s:LocalListing: does the job of "ls" for local directories {{{2
+fun! s:LocalListing()
+" call Dfunc("s:LocalListing()")
+" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+" call Decho("modified=".&modified." modifiable=".&modifiable." readonly=".&readonly,'~'.expand("<slnum>"))
+" call Decho("tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol(),'~'.expand("<slnum>"))
+
+" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist",'~'.expand("<slnum>")) |endif
+" if exists("g:netrw_sort_by")|call Decho('g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("g:netrw_sort_by doesn't exist",'~'.expand("<slnum>"))|endif
+" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
+
+ " get the list of files contained in the current directory
+ let dirname = b:netrw_curdir
+ let dirnamelen = strlen(b:netrw_curdir)
+ 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"))
+" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
+ elseif index(filelist,'..') == -1 && b:netrw_curdir !~ '/'
+ " include ../ in the glob() entry if its missing
+" call Decho("forcibly including on \"..\"",'~'.expand("<slnum>"))
+ let filelist= filelist+[s:ComposePath(b:netrw_curdir,"../")]
+" call Decho("filelist=".string(filelist),'~'.expand("<slnum>"))
+ endif
+
+" 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>"))
+
+ if get(g:, 'netrw_dynamic_maxfilenamelen', 0)
+ let filelistcopy = map(deepcopy(filelist),'fnamemodify(v:val, ":t")')
+ let g:netrw_maxfilenamelen = max(map(filelistcopy,'len(v:val)')) + 1
+" call Decho("dynamic_maxfilenamelen: filenames =".string(filelistcopy),'~'.expand("<slnum>"))
+" call Decho("dynamic_maxfilenamelen: g:netrw_maxfilenamelen=".g:netrw_maxfilenamelen,'~'.expand("<slnum>"))
+ endif
+" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
+
+ for filename in filelist
+" call Decho(" ",'~'.expand("<slnum>"))
+" call Decho("for filename in filelist: filename<".filename.">",'~'.expand("<slnum>"))
+
+ if getftype(filename) == "link"
+ " indicate a symbolic link
+" call Decho("indicate <".filename."> is a symbolic link with trailing @",'~'.expand("<slnum>"))
+ let pfile= filename."@"
+
+ elseif getftype(filename) == "socket"
+ " indicate a socket
+" call Decho("indicate <".filename."> is a socket with trailing =",'~'.expand("<slnum>"))
+ let pfile= filename."="
+
+ elseif getftype(filename) == "fifo"
+ " indicate a fifo
+" call Decho("indicate <".filename."> is a fifo with trailing |",'~'.expand("<slnum>"))
+ let pfile= filename."|"
+
+ elseif isdirectory(s:NetrwFile(filename))
+ " indicate a directory
+" call Decho("indicate <".filename."> is a directory with trailing /",'~'.expand("<slnum>"))
+ let pfile= filename."/"
+
+ elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(s:NetrwFile(filename))
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+ if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
+ " indicate an executable
+" call Decho("indicate <".filename."> is executable with trailing *",'~'.expand("<slnum>"))
+ let pfile= filename."*"
+ else
+ " normal file
+ let pfile= filename
+ endif
+ elseif executable(filename)
+ " indicate an executable
+" call Decho("indicate <".filename."> is executable with trailing *",'~'.expand("<slnum>"))
+ let pfile= filename."*"
+ else
+ " normal file
+ let pfile= filename
+ endif
+
+ else
+ " normal file
+ let pfile= filename
+ endif
+" call Decho("pfile<".pfile."> (after *@/ appending)",'~'.expand("<slnum>"))
+
+ if pfile =~ '//$'
+ let pfile= substitute(pfile,'//$','/','e')
+" call Decho("change // to /: pfile<".pfile.">",'~'.expand("<slnum>"))
+ endif
+ let pfile= strpart(pfile,dirnamelen)
+ let pfile= substitute(pfile,'^[/\\]','','e')
+" call Decho("filename<".filename.">",'~'.expand("<slnum>"))
+" call Decho("pfile <".pfile.">",'~'.expand("<slnum>"))
+
+ if w:netrw_liststyle == s:LONGLIST
+ let sz = getfsize(filename)
+ let fsz = strpart(" ",1,15-strlen(sz)).sz
+ if g:netrw_sizestyle =~# "[hH]"
+ let sz= s:NetrwHumanReadable(sz)
+ endif
+ let longfile= printf("%-".(g:netrw_maxfilenamelen+1)."s",pfile)
+ let pfile = longfile.sz." ".strftime(g:netrw_timefmt,getftime(filename))
+" call Decho("longlist support: sz=".sz." fsz=".fsz,'~'.expand("<slnum>"))
+ endif
+
+ if g:netrw_sort_by =~# "^t"
+ " sort by time (handles time up to 1 quintillion seconds, US)
+ " Decorate listing by prepending a timestamp/ . Sorting will then be done based on time.
+" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (time)")
+" call Decho("getftime(".filename.")=".getftime(filename),'~'.expand("<slnum>"))
+ let t = getftime(filename)
+ let ft = strpart("000000000000000000",1,18-strlen(t)).t
+" call Decho("exe NetrwKeepj put ='".ft.'/'.pfile."'",'~'.expand("<slnum>"))
+ let ftpfile= ft.'/'.pfile
+ sil! NetrwKeepj put=ftpfile
+
+ elseif g:netrw_sort_by =~ "^s"
+ " sort by size (handles file sizes up to 1 quintillion bytes, US)
+" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (size)")
+" call Decho("getfsize(".filename.")=".getfsize(filename),'~'.expand("<slnum>"))
+ let sz = getfsize(filename)
+ if g:netrw_sizestyle =~# "[hH]"
+ let sz= s:NetrwHumanReadable(sz)
+ endif
+ let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz
+" call Decho("exe NetrwKeepj put ='".fsz.'/'.filename."'",'~'.expand("<slnum>"))
+ let fszpfile= fsz.'/'.pfile
+ sil! NetrwKeepj put =fszpfile
+
+ else
+ " sort by name
+" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (name)")
+" call Decho("exe NetrwKeepj put ='".pfile."'",'~'.expand("<slnum>"))
+ sil! NetrwKeepj put=pfile
+ endif
+" call DechoBuf(bufnr("%"),"bufnr(%)")
+ endfor
+
+ " cleanup any windows mess at end-of-line
+ sil! NetrwKeepj g/^$/d
+ sil! NetrwKeepj %s/\r$//e
+ call histdel("/",-1)
+" call Decho("exe setl ts=".(g:netrw_maxfilenamelen+1),'~'.expand("<slnum>"))
+ exe "setl ts=".(g:netrw_maxfilenamelen+1)
+
+" call Dret("s:LocalListing")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwLocalExecute: uses system() to execute command under cursor ("X" command support) {{{2
+fun! s:NetrwLocalExecute(cmd)
+" call Dfunc("s:NetrwLocalExecute(cmd<".a:cmd.">)")
+ let ykeep= @@
+ " sanity check
+ if !executable(a:cmd)
+ call netrw#ErrorMsg(s:ERROR,"the file<".a:cmd."> is not executable!",89)
+ let @@= ykeep
+" call Dret("s:NetrwLocalExecute")
+ return
+ endif
+
+ let optargs= input(":!".a:cmd,"","file")
+" call Decho("optargs<".optargs.">",'~'.expand("<slnum>"))
+ let result= system(a:cmd.optargs)
+" call Decho("result,'~'.expand("<slnum>"))
+
+ " strip any ansi escape sequences off
+ let result = substitute(result,"\e\\[[0-9;]*m","","g")
+
+ " show user the result(s)
+ echomsg result
+ let @@= ykeep
+
+" call Dret("s:NetrwLocalExecute")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwLocalRename: rename a local file or directory {{{2
+fun! s:NetrwLocalRename(path) range
+" call Dfunc("NetrwLocalRename(path<".a:path.">)")
+
+ " preparation for removing multiple files/directories
+ let ykeep = @@
+ let ctr = a:firstline
+ let svpos = winsaveview()
+ let all = 0
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+
+ " rename files given by the markfilelist
+ if exists("s:netrwmarkfilelist_{bufnr('%')}")
+ for oldname in s:netrwmarkfilelist_{bufnr("%")}
+" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
+ if exists("subfrom")
+ let newname= substitute(oldname,subfrom,subto,'')
+" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
+ else
+ call inputsave()
+ let newname= input("Moving ".oldname." to : ",oldname,"file")
+ call inputrestore()
+ if newname =~ ''
+ " two ctrl-x's : ignore all of string preceding the ctrl-x's
+ let newname = substitute(newname,'^.*','','')
+ elseif newname =~ ''
+ " one ctrl-x : ignore portion of string preceding ctrl-x but after last /
+ let newname = substitute(newname,'[^/]*','','')
+ endif
+ if newname =~ '^s/'
+ let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','')
+ let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','')
+" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">",'~'.expand("<slnum>"))
+ let newname = substitute(oldname,subfrom,subto,'')
+ endif
+ endif
+ if !all && filereadable(newname)
+ call inputsave()
+ let response= input("File<".newname."> already exists; do you want to overwrite it? (y/all/n) ")
+ call inputrestore()
+ if response == "all"
+ let all= 1
+ elseif response != "y" && response != "yes"
+ " refresh the directory
+" call Decho("refresh the directory listing",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ let @@= ykeep
+" call Dret("NetrwLocalRename")
+ return
+ endif
+ endif
+ call rename(oldname,newname)
+ endfor
+ call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir)
+
+ else
+
+ " attempt to rename files/directories
+ while ctr <= a:lastline
+ exe "NetrwKeepj ".ctr
+
+ " sanity checks
+ if line(".") < w:netrw_bannercnt
+ let ctr= ctr + 1
+ continue
+ endif
+ let curword= s:NetrwGetWord()
+ if curword == "./" || curword == "../"
+ let ctr= ctr + 1
+ continue
+ endif
+
+ NetrwKeepj norm! 0
+ let oldname= s:ComposePath(a:path,curword)
+" call Decho("oldname<".oldname.">",'~'.expand("<slnum>"))
+
+ call inputsave()
+ let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e'))
+ call inputrestore()
+
+ call rename(oldname,newname)
+" call Decho("renaming <".oldname."> to <".newname.">",'~'.expand("<slnum>"))
+
+ let ctr= ctr + 1
+ endwhile
+ endif
+
+ " refresh the directory
+" call Decho("refresh the directory listing",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ let @@= ykeep
+
+" call Dret("NetrwLocalRename")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwLocalRm: {{{2
+fun! s:NetrwLocalRm(path) range
+" call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
+" call Decho("firstline=".a:firstline." lastline=".a:lastline,'~'.expand("<slnum>"))
+
+ " preparation for removing multiple files/directories
+ let ykeep = @@
+ let ret = 0
+ let all = 0
+ let svpos = winsaveview()
+" call Decho("saving posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+
+ if exists("s:netrwmarkfilelist_{bufnr('%')}")
+ " remove all marked files
+" 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"
+ break
+ elseif ok =~# 'a\%[ll]'
+ let all= 1
+ endif
+ endfor
+ call s:NetrwUnMarkFile(1)
+
+ else
+ " remove (multiple) files and directories
+" call Decho("remove files in range [".a:firstline.",".a:lastline."]",'~'.expand("<slnum>"))
+
+ let keepsol= &l:sol
+ setl nosol
+ let ctr = a:firstline
+ while ctr <= a:lastline
+ exe "NetrwKeepj ".ctr
+
+ " sanity checks
+ if line(".") < w:netrw_bannercnt
+ let ctr= ctr + 1
+ continue
+ endif
+ let curword= s:NetrwGetWord()
+ if curword == "./" || curword == "../"
+ let ctr= ctr + 1
+ continue
+ endif
+ let ok= s:NetrwLocalRmFile(a:path,curword,all)
+ if ok =~# 'q\%[uit]' || ok == "no"
+ break
+ elseif ok =~# 'a\%[ll]'
+ let all= 1
+ endif
+ let ctr= ctr + 1
+ endwhile
+ let &l:sol= keepsol
+ endif
+
+ " refresh the directory
+" call Decho("bufname<".bufname("%").">",'~'.expand("<slnum>"))
+ if bufname("%") != "NetrwMessage"
+ NetrwKeepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
+" call Decho("restoring posn to svpos<".string(svpos).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(svpos)
+ endif
+ let @@= ykeep
+
+" call Dret("s:NetrwLocalRm")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwLocalRmFile: remove file fname given the path {{{2
+" Give confirmation prompt unless all==1
+fun! s:NetrwLocalRmFile(path,fname,all)
+" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all)
+
+ let all= a:all
+ let ok = ""
+ NetrwKeepj norm! 0
+ let rmfile= s:NetrwFile(s:ComposePath(a:path,a:fname))
+" call Decho("rmfile<".rmfile.">",'~'.expand("<slnum>"))
+
+ if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
+ " attempt to remove file
+" call Decho("attempt to remove file<".rmfile.">",'~'.expand("<slnum>"))
+ if !all
+ echohl Statement
+ call inputsave()
+ let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
+ call inputrestore()
+ echohl NONE
+ if ok == ""
+ let ok="no"
+ endif
+" 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]'
+ let all= 1
+ endif
+ endif
+
+ if all || ok =~# 'y\%[es]' || ok == ""
+ let ret= s:NetrwDelete(rmfile)
+" call Decho("errcode=".v:shell_error." ret=".ret,'~'.expand("<slnum>"))
+ endif
+
+ else
+ " attempt to remove directory
+ if !all
+ echohl Statement
+ call inputsave()
+ let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
+ call inputrestore()
+ let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
+ if ok == ""
+ let ok="no"
+ endif
+ if ok =~# 'a\%[ll]'
+ let all= 1
+ endif
+ endif
+ let rmfile= substitute(rmfile,'[\/]$','','e')
+
+ if all || ok =~# 'y\%[es]' || ok == ""
+ if v:version < 704 || (v:version == 704 && !has("patch1107"))
+" " 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))
+" " call Decho("v:shell_error=".v:shell_error,'~'.expand("<slnum>"))
+
+ if v:shell_error != 0
+" " call Decho("2nd attempt to remove directory<".rmfile.">",'~'.expand("<slnum>"))
+ let errcode= s:NetrwDelete(rmfile)
+" " call Decho("errcode=".errcode,'~'.expand("<slnum>"))
+
+ if errcode != 0
+ if has("unix")
+" " call Decho("3rd attempt to remove directory<".rmfile.">",'~'.expand("<slnum>"))
+ call system("rm ".s:ShellEscape(rmfile))
+ if v:shell_error != 0 && !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
+ let ok="no"
+ endif
+ elseif !exists("g:netrw_quiet")
+ call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
+ let ok="no"
+ endif
+ endif
+ endif
+ else
+ if delete(rmfile,"d")
+ call netrw#ErrorMsg(s:ERROR,"unable to delete directory <".rmfile.">!",103)
+ endif
+ endif
+ endif
+ endif
+
+" call Dret("s:NetrwLocalRmFile ".ok)
+ return ok
+endfun
+
+" =====================================================================
+" Support Functions: {{{1
+
+" ---------------------------------------------------------------------
+" 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
+fun! netrw#Access(ilist)
+ if a:ilist == 0
+ if exists("s:netrwmarkfilelist_".bufnr('%'))
+ return s:netrwmarkfilelist_{bufnr('%')}
+ else
+ return "no-list-buf#".bufnr('%')
+ endif
+ elseif a:ilist == 1
+ return s:netrwmftgt
+ endif
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#Call: allows user-specified mappings to call internal netrw functions {{{2
+fun! netrw#Call(funcname,...)
+ return call("s:".a:funcname,a:000)
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#Expose: allows UserMaps and pchk to look at otherwise script-local variables {{{2
+" I expect this function to be used in
+" :PChkAssert netrw#Expose("netrwmarkfilelist")
+" for example.
+fun! netrw#Expose(varname)
+" call Dfunc("netrw#Expose(varname<".a:varname.">)")
+ if exists("s:".a:varname)
+ exe "let retval= s:".a:varname
+" call Decho("retval=".retval,'~'.expand("<slnum>"))
+ if exists("g:netrw_pchk")
+" call Decho("type(g:netrw_pchk=".g:netrw_pchk.")=".type(retval),'~'.expand("<slnum>"))
+ 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)),'~'.expand("<slnum>"))
+ return string(retval)
+ else
+" call Decho("g:netrw_pchk doesn't exist",'~'.expand("<slnum>"))
+ endif
+ else
+" call Decho("s:".a:varname." doesn't exist",'~'.expand("<slnum>"))
+ let retval= "n/a"
+ endif
+
+" call Dret("netrw#Expose ".string(retval))
+ return retval
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#Modify: allows UserMaps to set (modify) script-local variables {{{2
+fun! netrw#Modify(varname,newvalue)
+" call Dfunc("netrw#Modify(varname<".a:varname.">,newvalue<".string(a:newvalue).">)")
+ exe "let s:".a:varname."= ".string(a:newvalue)
+" call Dret("netrw#Modify")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#RFC2396: converts %xx into characters {{{2
+fun! netrw#RFC2396(fname)
+" call Dfunc("netrw#RFC2396(fname<".a:fname.">)")
+ let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t")
+" call Dret("netrw#RFC2396 ".fname)
+ return fname
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#UserMaps: supports user-specified maps {{{2
+" see :help function()
+"
+" g:Netrw_UserMaps is a List with members such as:
+" [[keymap sequence, function reference],...]
+"
+" The referenced function may return a string,
+" refresh : refresh the display
+" -other- : this string will be executed
+" or it may return a List of strings.
+"
+" Each keymap-sequence will be set up with a nnoremap
+" to invoke netrw#UserMaps(a:islocal).
+" Related functions:
+" netrw#Expose(varname) -- see s:varname variables
+" netrw#Modify(varname,newvalue) -- modify value of s:varname variable
+" netrw#Call(funcname,...) -- call internal netrw function with optional arguments
+fun! netrw#UserMaps(islocal)
+" call Dfunc("netrw#UserMaps(islocal=".a:islocal.")")
+" call Decho("g:Netrw_UserMaps ".(exists("g:Netrw_UserMaps")? "exists" : "does NOT exist"),'~'.expand("<slnum>"))
+
+ " set up usermaplist
+ if exists("g:Netrw_UserMaps") && type(g:Netrw_UserMaps) == 3
+" call Decho("g:Netrw_UserMaps has type 3<List>",'~'.expand("<slnum>"))
+ for umap in g:Netrw_UserMaps
+" call Decho("type(umap[0]<".string(umap[0]).">)=".type(umap[0])." (should be 1=string)",'~'.expand("<slnum>"))
+" call Decho("type(umap[1])=".type(umap[1])." (should be 1=string)",'~'.expand("<slnum>"))
+ " if umap[0] is a string and umap[1] is a string holding a function name
+ if type(umap[0]) == 1 && type(umap[1]) == 1
+" call Decho("nno <buffer> <silent> ".umap[0]." :call s:UserMaps(".a:islocal.",".string(umap[1]).")<cr>",'~'.expand("<slnum>"))
+ exe "nno <buffer> <silent> ".umap[0]." :call <SID>UserMaps(".a:islocal.",'".umap[1]."')<cr>"
+ else
+ call netrw#ErrorMsg(s:WARNING,"ignoring usermap <".string(umap[0])."> -- not a [string,funcref] entry",99)
+ endif
+ endfor
+ endif
+" call Dret("netrw#UserMaps")
+endfun
+
+" ---------------------------------------------------------------------
+" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2
+fun! netrw#WinPath(path)
+" call Dfunc("netrw#WinPath(path<".a:path.">)")
+ if (!g:netrw_cygwin || &shell !~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16"))
+ " remove cygdrive prefix, if present
+ let path = substitute(a:path,g:netrw_cygdrive.'/\(.\)','\1:','')
+ " remove trailing slash (Win95)
+ let path = substitute(path, '\(\\\|/\)$', '', 'g')
+ " remove escaped spaces
+ let path = substitute(path, '\ ', ' ', 'g')
+ " convert slashes to backslashes
+ let path = substitute(path, '/', '\', 'g')
+ else
+ let path= a:path
+ endif
+" call Dret("netrw#WinPath <".path.">")
+ return path
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBadd: adds marked files to buffer list or vice versa {{{2
+" cb : bl2mf=0 add marked files to buffer list
+" cB : bl2mf=1 use bufferlist to mark files
+" (mnemonic: cb = copy (marked files) to buffer list)
+fun! s:NetrwBadd(islocal,bl2mf)
+" " call Dfunc("s:NetrwBadd(islocal=".a:islocal." mf2bl=".mf2bl.")")
+ if a:bl2mf
+ " cB: add buffer list to marked files
+ redir => bufl
+ ls
+ redir END
+ let bufl = map(split(bufl,"\n"),'substitute(v:val,''^.\{-}"\(.*\)".\{-}$'',''\1'','''')')
+ for fname in bufl
+ call s:NetrwMarkFile(a:islocal,fname)
+ endfor
+ else
+ " cb: add marked files to buffer list
+ for fname in s:netrwmarkfilelist_{bufnr("%")}
+" " call Decho("badd ".fname,'~'.expand("<slnum>"))
+ exe "badd ".fnameescape(fname)
+ endfor
+ let curbufnr = bufnr("%")
+ let curdir = s:NetrwGetCurdir(a:islocal)
+ call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
+ endif
+" call Dret("s:NetrwBadd")
+endfun
+
+" ---------------------------------------------------------------------
+" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
+fun! s:ComposePath(base,subdir)
+" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
+
+ if has("amiga")
+" call Decho("amiga",'~'.expand("<slnum>"))
+ let ec = a:base[s:Strlen(a:base)-1]
+ if ec != '/' && ec != ':'
+ let ret = a:base."/" . a:subdir
+ else
+ let ret = a:base.a:subdir
+ endif
+
+ " COMBAK: test on windows with changing to root directory: :e C:/
+ elseif a:subdir =~ '^\a:[/\\]\([^/\\]\|$\)' && (has("win32") || has("win95") || has("win64") || has("win16"))
+" call Decho("windows",'~'.expand("<slnum>"))
+ let ret= a:subdir
+
+ elseif a:base =~ '^\a:[/\\]\([^/\\]\|$\)' && (has("win32") || has("win95") || has("win64") || has("win16"))
+" call Decho("windows",'~'.expand("<slnum>"))
+ if a:base =~ '[/\\]$'
+ let ret= a:base.a:subdir
+ else
+ let ret= a:base.'/'.a:subdir
+ endif
+
+ elseif a:base =~ '^\a\{3,}://'
+" call Decho("remote linux/macos",'~'.expand("<slnum>"))
+ let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
+ let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
+ if a:subdir == '../'
+ if curpath =~ '[^/]/[^/]\+/$'
+ let curpath= substitute(curpath,'[^/]\+/$','','')
+ else
+ let curpath=""
+ endif
+ let ret= urlbase.curpath
+ else
+ let ret= urlbase.curpath.a:subdir
+ endif
+" call Decho("urlbase<".urlbase.">",'~'.expand("<slnum>"))
+" call Decho("curpath<".curpath.">",'~'.expand("<slnum>"))
+" call Decho("ret<".ret.">",'~'.expand("<slnum>"))
+
+ else
+" call Decho("local linux/macos",'~'.expand("<slnum>"))
+ let ret = substitute(a:base."/".a:subdir,"//","/","g")
+ if a:base =~ '^//'
+ " keeping initial '//' for the benefit of network share listing support
+ let ret= '/'.ret
+ endif
+ let ret= simplify(ret)
+ endif
+
+" call Dret("s:ComposePath ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" s:DeleteBookmark: deletes a file/directory from Netrw's bookmark system {{{2
+" Related Functions: s:MakeBookmark() s:NetrwBookHistHandler() s:NetrwBookmark()
+fun! s:DeleteBookmark(fname)
+" call Dfunc("s:DeleteBookmark(fname<".a:fname.">)")
+ call s:MergeBookmarks()
+
+ if exists("g:netrw_bookmarklist")
+ let indx= index(g:netrw_bookmarklist,a:fname)
+ if indx == -1
+ let indx= 0
+ while indx < len(g:netrw_bookmarklist)
+ if g:netrw_bookmarklist[indx] =~ a:fname
+ call remove(g:netrw_bookmarklist,indx)
+ let indx= indx - 1
+ endif
+ let indx= indx + 1
+ endwhile
+ else
+ " remove exact match
+ call remove(g:netrw_bookmarklist,indx)
+ endif
+ endif
+
+" call Dret("s:DeleteBookmark")
+endfun
+
+" ---------------------------------------------------------------------
+" s:FileReadable: o/s independent filereadable {{{2
+fun! s:FileReadable(fname)
+" call Dfunc("s:FileReadable(fname<".a:fname.">)")
+
+ if g:netrw_cygwin
+ let ret= filereadable(s:NetrwFile(substitute(a:fname,g:netrw_cygdrive.'/\(.\)','\1:/','')))
+ else
+ let ret= filereadable(s:NetrwFile(a:fname))
+ endif
+
+" call Dret("s:FileReadable ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2
+" Places correct suffix on end of temporary filename,
+" using the suffix provided with fname
+fun! s:GetTempfile(fname)
+" call Dfunc("s:GetTempfile(fname<".a:fname.">)")
+
+ if !exists("b:netrw_tmpfile")
+ " get a brand new temporary filename
+ let tmpfile= tempname()
+" call Decho("tmpfile<".tmpfile."> : from tempname()",'~'.expand("<slnum>"))
+
+ let tmpfile= substitute(tmpfile,'\','/','ge')
+" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /",'~'.expand("<slnum>"))
+
+ " sanity check -- does the temporary file's directory exist?
+ if !isdirectory(s:NetrwFile(substitute(tmpfile,'[^/]\+$','','e')))
+" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
+" call Dret("s:GetTempfile getcwd<".getcwd().">")
+ return ""
+ endif
+
+ " let netrw#NetSource() know about the tmpfile
+ let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() and netrw#BrowseX()
+" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">",'~'.expand("<slnum>"))
+
+ " o/s dependencies
+ if g:netrw_cygwin != 0
+ let tmpfile = substitute(tmpfile,'^\(\a\):',g:netrw_cygdrive.'/\1','e')
+ elseif has("win32") || has("win95") || has("win64") || has("win16")
+ if !exists("+shellslash") || !&ssl
+ let tmpfile = substitute(tmpfile,'/','\','g')
+ endif
+ else
+ let tmpfile = tmpfile
+ endif
+ let b:netrw_tmpfile= tmpfile
+" call Decho("o/s dependent fixed tempname<".tmpfile.">",'~'.expand("<slnum>"))
+ else
+ " re-use temporary filename
+ let tmpfile= b:netrw_tmpfile
+" call Decho("tmpfile<".tmpfile."> re-using",'~'.expand("<slnum>"))
+ endif
+
+ " use fname's suffix for the temporary file
+ if a:fname != ""
+ if a:fname =~ '\.[^./]\+$'
+" call Decho("using fname<".a:fname.">'s suffix",'~'.expand("<slnum>"))
+ if a:fname =~ '\.tar\.gz$' || a:fname =~ '\.tar\.bz2$' || a:fname =~ '\.tar\.xz$'
+ let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
+ elseif a:fname =~ '.txz$'
+ let suffix = ".txz".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
+ else
+ let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e')
+ endif
+" call Decho("suffix<".suffix.">",'~'.expand("<slnum>"))
+ let tmpfile= substitute(tmpfile,'\.tmp$','','e')
+" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)",'~'.expand("<slnum>"))
+ let tmpfile .= suffix
+" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">",'~'.expand("<slnum>"))
+ let s:netrw_tmpfile= tmpfile " supports netrw#NetSource()
+ endif
+ endif
+
+" 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:GetTempfile <".tmpfile.">")
+ return tmpfile
+endfun
+
+" ---------------------------------------------------------------------
+" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
+" a correct command for use with a system() call
+fun! s:MakeSshCmd(sshcmd)
+" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
+ if s:user == ""
+ let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:machine,'')
+ else
+ let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user."@".s:machine,'')
+ endif
+ if exists("g:netrw_port") && g:netrw_port != ""
+ let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
+ elseif exists("s:port") && s:port != ""
+ let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'')
+ else
+ let sshcmd= substitute(sshcmd,"USEPORT ",'','')
+ endif
+" call Dret("s:MakeSshCmd <".sshcmd.">")
+ return sshcmd
+endfun
+
+" ---------------------------------------------------------------------
+" s:MakeBookmark: enters a bookmark into Netrw's bookmark system {{{2
+fun! s:MakeBookmark(fname)
+" call Dfunc("s:MakeBookmark(fname<".a:fname.">)")
+
+ if !exists("g:netrw_bookmarklist")
+ let g:netrw_bookmarklist= []
+ endif
+
+ if index(g:netrw_bookmarklist,a:fname) == -1
+ " curdir not currently in g:netrw_bookmarklist, so include it
+ if isdirectory(s:NetrwFile(a:fname)) && a:fname !~ '/$'
+ call add(g:netrw_bookmarklist,a:fname.'/')
+ elseif a:fname !~ '/'
+ call add(g:netrw_bookmarklist,getcwd()."/".a:fname)
+ else
+ call add(g:netrw_bookmarklist,a:fname)
+ endif
+ call sort(g:netrw_bookmarklist)
+ endif
+
+" call Dret("s:MakeBookmark")
+endfun
+
+" ---------------------------------------------------------------------
+" s:MergeBookmarks: merge current bookmarks with saved bookmarks {{{2
+fun! s:MergeBookmarks()
+" call Dfunc("s:MergeBookmarks() : merge current bookmarks into .netrwbook")
+ " get bookmarks from .netrwbook file
+ let savefile= s:NetrwHome()."/.netrwbook"
+ if filereadable(s:NetrwFile(savefile))
+" call Decho("merge bookmarks (active and file)",'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwBookHistSave()
+" call Decho("bookmark delete savefile<".savefile.">",'~'.expand("<slnum>"))
+ NetrwKeepj call delete(savefile)
+ endif
+" call Dret("s:MergeBookmarks")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBMShow: {{{2
+fun! s:NetrwBMShow()
+" call Dfunc("s:NetrwBMShow()")
+ redir => bmshowraw
+ menu
+ redir END
+ let bmshowlist = split(bmshowraw,'\n')
+ if bmshowlist != []
+ let bmshowfuncs= filter(bmshowlist,'v:val =~# "<SNR>\\d\\+_BMShow()"')
+ if bmshowfuncs != []
+ let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
+ if bmshowfunc =~# '^call.*BMShow()'
+ exe "sil! NetrwKeepj ".bmshowfunc
+ endif
+ endif
+ endif
+" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
+fun! s:NetrwCursor(editfile)
+ if !exists("w:netrw_liststyle")
+ let w:netrw_liststyle= g:netrw_liststyle
+ endif
+" call Dfunc("s:NetrwCursor() ft<".&ft."> liststyle=".w:netrw_liststyle." g:netrw_cursor=".g:netrw_cursor." s:netrw_usercuc=".s:netrw_usercuc." s:netrw_usercul=".s:netrw_usercul)
+
+" call Decho("(s:NetrwCursor) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
+
+ if &ft != "netrw"
+ " if the current window isn't a netrw directory listing window, then use user cursorline/column
+ " settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
+" call Decho("case ft!=netrw: use user cul,cuc",'~'.expand("<slnum>"))
+
+ elseif g:netrw_cursor == 8
+ if w:netrw_liststyle == s:WIDELIST
+ setl cursorline
+ setl cursorcolumn
+ else
+ setl cursorline
+ endif
+ elseif g:netrw_cursor == 7
+ setl cursorline
+ elseif g:netrw_cursor == 6
+ if w:netrw_liststyle == s:WIDELIST
+ setl cursorline
+ endif
+ elseif g:netrw_cursor == 4
+ " all styles: cursorline, cursorcolumn
+" call Decho("case g:netrw_cursor==4: setl cul cuc",'~'.expand("<slnum>"))
+ setl cursorline
+ setl cursorcolumn
+
+ elseif g:netrw_cursor == 3
+ " thin-long-tree: cursorline, user's cursorcolumn
+ " wide : cursorline, cursorcolumn
+ if w:netrw_liststyle == s:WIDELIST
+" call Decho("case g:netrw_cursor==3 and wide: setl cul cuc",'~'.expand("<slnum>"))
+ setl cursorline
+ setl cursorcolumn
+ else
+" call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)",'~'.expand("<slnum>"))
+ setl cursorline
+ endif
+
+ elseif g:netrw_cursor == 2
+ " thin-long-tree: cursorline, user's cursorcolumn
+ " wide : cursorline, user's cursorcolumn
+" call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)",'~'.expand("<slnum>"))
+ setl cursorline
+
+ elseif g:netrw_cursor == 1
+ " thin-long-tree: user's cursorline, user's cursorcolumn
+ " wide : cursorline, user's cursorcolumn
+ if w:netrw_liststyle == s:WIDELIST
+" call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)",'~'.expand("<slnum>"))
+ setl cursorline
+ else
+" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)",'~'.expand("<slnum>"))
+ endif
+
+ else
+ " all styles: user's cursorline, user's cursorcolumn
+" call Decho("default: (use user's cul,cuc)",'~'.expand("<slnum>"))
+ let &l:cursorline = s:netrw_usercul
+ let &l:cursorcolumn = s:netrw_usercuc
+ endif
+
+" call Decho("(s:NetrwCursor) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
+" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
+endfun
+
+" ---------------------------------------------------------------------
+" s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2
+fun! s:RestoreCursorline()
+" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%"))
+ if exists("s:netrw_usercul")
+ let &l:cursorline = s:netrw_usercul
+ endif
+ if exists("s:netrw_usercuc")
+ let &l:cursorcolumn = s:netrw_usercuc
+ endif
+" call Decho("(s:RestoreCursorline) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
+" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwDelete: Deletes a file. {{{2
+" Uses Steve Hall's idea to insure that Windows paths stay
+" acceptable. No effect on Unix paths.
+" Examples of use: let result= s:NetrwDelete(path)
+fun! s:NetrwDelete(path)
+" call Dfunc("s:NetrwDelete(path<".a:path.">)")
+
+ let path = netrw#WinPath(a:path)
+ if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
+ if exists("+shellslash")
+ let sskeep= &shellslash
+ setl noshellslash
+ let result = delete(path)
+ let &shellslash = sskeep
+ else
+" call Decho("exe let result= ".a:cmd."('".path."')",'~'.expand("<slnum>"))
+ let result= delete(path)
+ endif
+ else
+" call Decho("let result= delete(".path.")",'~'.expand("<slnum>"))
+ let result= delete(path)
+ endif
+ if result < 0
+ NetrwKeepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71)
+ endif
+
+" call Dret("s:NetrwDelete ".result)
+ return result
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwBufRemover: removes a buffer that: {{{2s
+" has buffer-id > 1
+" is unlisted
+" is unnamed
+" does not appear in any window
+fun! s:NetrwBufRemover(bufid)
+" call Dfunc("s:NetrwBufRemover(".a:bufid.")")
+" call Decho("buf#".a:bufid." ".((a:bufid > 1)? ">" : "≯")." must be >1 for removal","~".expand("<slnum>"))
+" call Decho("buf#".a:bufid." is ".(buflisted(a:bufid)? "listed" : "unlisted"),"~".expand("<slnum>"))
+" call Decho("buf#".a:bufid." has name <".bufname(a:bufid).">","~".expand("<slnum>"))
+" call Decho("buf#".a:bufid." has winid#".bufwinid(a:bufid),"~".expand("<slnum>"))
+
+ if a:bufid > 1 && !buflisted(a:bufid) && bufname(a:bufid) == "" && bufwinid(a:bufid) == -1
+" call Decho("(s:NetrwBufRemover) removing buffer#".a:bufid,"~".expand("<slnum>"))
+ exe "bd! ".a:bufid
+ endif
+
+" call Dret("s:NetrwBufRemover")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
+fun! s:NetrwEnew(...)
+" call Dfunc("s:NetrwEnew() a:0=".a:0." win#".winnr()." winnr($)=".winnr("$")." bufnr($)=".bufnr("$")." expand(%)<".expand("%").">")
+" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
+
+ " Clean out the last buffer:
+ " Check if the last buffer has # > 1, is unlisted, is unnamed, and does not appear in a window
+ " If so, delete it.
+ call s:NetrwBufRemover(bufnr("$"))
+
+ " grab a function-local-variable copy of buffer variables
+" call Decho("make function-local copy of netrw variables",'~'.expand("<slnum>"))
+ if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
+ if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif
+ if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif
+ if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif
+ if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif
+ if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif
+ if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif
+ if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif
+ if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif
+ if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
+ if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif
+ if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif
+ if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif
+ if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif
+ if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif
+ if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif
+
+ NetrwKeepj call s:NetrwOptionsRestore("w:")
+" 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.
+ " 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("$")."<".bufname(bufnr("$"))."> winnr($)=".winnr("$"),'~'.expand("<slnum>"))
+ NetrwKeepj call s:NetrwOptionsSave("w:")
+
+ " copy function-local-variables to buffer variable equivalents
+" call Decho("copy function-local variables back to buffer netrw variables",'~'.expand("<slnum>"))
+ if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif
+ if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif
+ if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif
+ if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif
+ if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif
+ if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif
+ if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif
+ if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif
+ if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif
+ if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif
+ if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif
+ if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif
+ if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif
+ if exists("netrw_method") |let b:netrw_method = netrw_method |endif
+ if exists("netrw_option") |let b:netrw_option = netrw_option |endif
+ if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif
+
+ if a:0 > 0
+ let b:netrw_curdir= a:1
+ if b:netrw_curdir =~ '/$'
+ if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
+ setl nobl
+ file NetrwTreeListing
+ setl nobl bt=nowrite bh=hide
+ nno <silent> <buffer> [ :sil call <SID>TreeListMove('[')<cr>
+ nno <silent> <buffer> ] :sil call <SID>TreeListMove(']')<cr>
+ else
+ call s:NetrwBufRename(b:netrw_curdir)
+ endif
+ endif
+ endif
+ if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on")
+ let &l:bexpr = "netrw#BalloonHelp()"
+ endif
+
+" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#")."> bh=".&bh." win#".winnr()." winnr($)#".winnr("$"))
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwExe: executes a string using "!" {{{2
+fun! s:NetrwExe(cmd)
+" call Dfunc("s:NetrwExe(a:cmd<".a:cmd.">)")
+ if has("win32") && &shell !~? 'cmd' && !g:netrw_cygwin
+" call Decho("using win32:",expand("<slnum>"))
+ let savedShell=[&shell,&shellcmdflag,&shellxquote,&shellxescape,&shellquote,&shellpipe,&shellredir,&shellslash]
+ set shell& shellcmdflag& shellxquote& shellxescape&
+ set shellquote& shellpipe& shellredir& shellslash&
+ exe a:cmd
+ let [&shell,&shellcmdflag,&shellxquote,&shellxescape,&shellquote,&shellpipe,&shellredir,&shellslash] = savedShell
+ else
+" call Decho("exe ".a:cmd,'~'.expand("<slnum>"))
+ exe a:cmd
+ endif
+ if v:shell_error
+ call netrw#ErrorMsg(s:WARNING,"shell signalled an error",106)
+ endif
+" call Dret("s:NetrwExe : v:shell_error=".v:shell_error)
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2
+fun! s:NetrwInsureWinVars()
+ if !exists("w:netrw_liststyle")
+" call Dfunc("s:NetrwInsureWinVars() win#".winnr())
+ let curbuf = bufnr("%")
+ let curwin = winnr()
+ let iwin = 1
+ while iwin <= winnr("$")
+ exe iwin."wincmd w"
+ if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle")
+ " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer
+ let winvars= w:
+ break
+ endif
+ let iwin= iwin + 1
+ endwhile
+ exe "keepalt ".curwin."wincmd w"
+ if exists("winvars")
+" call Decho("copying w#".iwin." window variables to w#".curwin,'~'.expand("<slnum>"))
+ for k in keys(winvars)
+ let w:{k}= winvars[k]
+ endfor
+ endif
+" call Dret("s:NetrwInsureWinVars win#".winnr())
+ endif
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwLcd: handles changing the (local) directory {{{2
+" Returns: 0=success
+" -1=failed
+fun! s:NetrwLcd(newdir)
+" call Dfunc("s:NetrwLcd(newdir<".a:newdir.">)")
+" call Decho("changing local directory",'~'.expand("<slnum>"))
+
+ let err472= 0
+ try
+ exe 'NetrwKeepj sil lcd '.fnameescape(a:newdir)
+ catch /^Vim\%((\a\+)\)\=:E344/
+ " Vim's lcd fails with E344 when attempting to go above the 'root' of a Windows share.
+ " Therefore, detect if a Windows share is present, and if E344 occurs, just settle at
+ " 'root' (ie. '\'). The share name may start with either backslashes ('\\Foo') or
+ " forward slashes ('//Foo'), depending on whether backslashes have been converted to
+ " forward slashes by earlier code; so check for both.
+ if (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin
+ if a:newdir =~ '^\\\\\w\+' || a:newdir =~ '^//\w\+'
+ let dirname = '\'
+ exe 'NetrwKeepj sil lcd '.fnameescape(dirname)
+ endif
+ endif
+ catch /^Vim\%((\a\+)\)\=:E472/
+ let err472= 1
+ endtry
+
+ if err472
+ call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".a:newdir."> (permissions?)",61)
+ if exists("w:netrw_prvdir")
+ let a:newdir= w:netrw_prvdir
+ else
+ call s:NetrwOptionsRestore("w:")
+" call Decho("setl noma nomod nowrap",'~'.expand("<slnum>"))
+ exe "setl ".g:netrw_bufsettings
+" call Decho(" ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
+ let a:newdir= dirname
+ endif
+" call Dret("s:NetrwBrowse -1 : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
+ return -1
+ endif
+
+" call Decho("getcwd <".getcwd().">")
+" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
+" call Dret("s:NetrwLcd 0")
+ return 0
+endfun
+
+" ------------------------------------------------------------------------
+" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
+" changed sorting, etc. Also see s:NetrwRestoreWordPosn().
+fun! s:NetrwSaveWordPosn()
+" call Dfunc("NetrwSaveWordPosn()")
+ let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
+" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwHumanReadable: takes a number and makes it "human readable" {{{2
+" 1000 -> 1K, 1000000 -> 1M, 1000000000 -> 1G
+fun! s:NetrwHumanReadable(sz)
+" call Dfunc("s:NetrwHumanReadable(sz=".a:sz.") type=".type(a:sz)." style=".g:netrw_sizestyle )
+
+ if g:netrw_sizestyle == 'h'
+ if a:sz >= 1000000000
+ let sz = printf("%.1f",a:sz/1000000000.0)."g"
+ elseif a:sz >= 10000000
+ let sz = printf("%d",a:sz/1000000)."m"
+ elseif a:sz >= 1000000
+ let sz = printf("%.1f",a:sz/1000000.0)."m"
+ elseif a:sz >= 10000
+ let sz = printf("%d",a:sz/1000)."k"
+ elseif a:sz >= 1000
+ let sz = printf("%.1f",a:sz/1000.0)."k"
+ else
+ let sz= a:sz
+ endif
+
+ elseif g:netrw_sizestyle == 'H'
+ if a:sz >= 1073741824
+ let sz = printf("%.1f",a:sz/1073741824.0)."G"
+ elseif a:sz >= 10485760
+ let sz = printf("%d",a:sz/1048576)."M"
+ elseif a:sz >= 1048576
+ let sz = printf("%.1f",a:sz/1048576.0)."M"
+ elseif a:sz >= 10240
+ let sz = printf("%d",a:sz/1024)."K"
+ elseif a:sz >= 1024
+ let sz = printf("%.1f",a:sz/1024.0)."K"
+ else
+ let sz= a:sz
+ endif
+
+ else
+ let sz= a:sz
+ endif
+
+" call Dret("s:NetrwHumanReadable ".sz)
+ return sz
+endfun
+
+" ---------------------------------------------------------------------
+" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
+" changed sorting, etc. Also see s:NetrwSaveWordPosn().
+fun! s:NetrwRestoreWordPosn()
+" call Dfunc("NetrwRestoreWordPosn()")
+ sil! call search(s:netrw_saveword,'w')
+" call Dret("NetrwRestoreWordPosn")
+endfun
+
+" ---------------------------------------------------------------------
+" s:RestoreBufVars: {{{2
+fun! s:RestoreBufVars()
+" call Dfunc("s:RestoreBufVars()")
+
+ if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif
+ if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif
+ if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif
+ if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif
+ if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif
+ if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif
+
+" call Dret("s:RestoreBufVars")
+endfun
+
+" ---------------------------------------------------------------------
+" s:RemotePathAnalysis: {{{2
+fun! s:RemotePathAnalysis(dirname)
+" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)")
+
+ " method :// user @ machine :port /path
+ let dirpat = '^\(\w\{-}\)://\(\(\w\+\)@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$'
+ let s:method = substitute(a:dirname,dirpat,'\1','')
+ let s:user = substitute(a:dirname,dirpat,'\3','')
+ let s:machine = substitute(a:dirname,dirpat,'\4','')
+ let s:port = substitute(a:dirname,dirpat,'\5','')
+ let s:path = substitute(a:dirname,dirpat,'\6','')
+ let s:fname = substitute(s:path,'^.*/\ze.','','')
+ if s:machine =~ '@'
+ let dirpat = '^\(.*\)@\(.\{-}\)$'
+ let s:user = s:user.'@'.substitute(s:machine,dirpat,'\1','')
+ let s:machine = substitute(s:machine,dirpat,'\2','')
+ endif
+
+" call Decho("set up s:method <".s:method .">",'~'.expand("<slnum>"))
+" call Decho("set up s:user <".s:user .">",'~'.expand("<slnum>"))
+" call Decho("set up s:machine<".s:machine.">",'~'.expand("<slnum>"))
+" call Decho("set up s:port <".s:port.">",'~'.expand("<slnum>"))
+" call Decho("set up s:path <".s:path .">",'~'.expand("<slnum>"))
+" call Decho("set up s:fname <".s:fname .">",'~'.expand("<slnum>"))
+
+" call Dret("s:RemotePathAnalysis")
+endfun
+
+" ---------------------------------------------------------------------
+" s:RemoteSystem: runs a command on a remote host using ssh {{{2
+" Returns status
+" Runs system() on
+" [cd REMOTEDIRPATH;] a:cmd
+" Note that it doesn't do s:ShellEscape(a:cmd)!
+fun! s:RemoteSystem(cmd)
+" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)")
+ if !executable(g:netrw_ssh_cmd)
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52)
+ elseif !exists("b:netrw_curdir")
+ NetrwKeepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53)
+ else
+ let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
+ let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
+ if remotedir != ""
+ let cmd= cmd.' cd '.s:ShellEscape(remotedir).";"
+ else
+ let cmd= cmd.' '
+ endif
+ let cmd= cmd.a:cmd
+" call Decho("call system(".cmd.")",'~'.expand("<slnum>"))
+ let ret= system(cmd)
+ endif
+" call Dret("s:RemoteSystem ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2
+fun! s:RestoreWinVars()
+" call Dfunc("s:RestoreWinVars()")
+ if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif
+ if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif
+ if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif
+ if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif
+ if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif
+ if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif
+ if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif
+ if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif
+ if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif
+ if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif
+ if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif
+ if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif
+ if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif
+ if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif
+ if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif
+ if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif
+ if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif
+ if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif
+" call Dret("s:RestoreWinVars")
+endfun
+
+" ---------------------------------------------------------------------
+" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
+"
+" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
+" is true) and a command, :Rexplore, which call this function.
+"
+" s:netrw_posn is set up by s:NetrwBrowseChgDir()
+"
+" s:rexposn_BUFNR used to save/restore cursor position
+fun! s:NetrwRexplore(islocal,dirname)
+ if exists("s:netrwdrag")
+ return
+ endif
+" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir."> win#".winnr())
+" call Decho("currently in bufname<".bufname("%").">",'~'.expand("<slnum>"))
+" call Decho("ft=".&ft." win#".winnr()." w:netrw_rexfile<".(exists("w:netrw_rexfile")? w:netrw_rexfile : 'n/a').">",'~'.expand("<slnum>"))
+
+ if &ft == "netrw" && exists("w:netrw_rexfile") && w:netrw_rexfile != ""
+ " a :Rex while in a netrw buffer means: edit the file in w:netrw_rexfile
+" call Decho("in netrw buffer, will edit file<".w:netrw_rexfile.">",'~'.expand("<slnum>"))
+ exe "NetrwKeepj e ".w:netrw_rexfile
+ unlet w:netrw_rexfile
+" call Dret("s:NetrwRexplore returning from netrw to buf#".bufnr("%")."<".bufname("%")."> (ft=".&ft.")")
+ return
+" else " Decho
+" call Decho("treating as not-netrw-buffer: ft=".&ft.((&ft == "netrw")? " == netrw" : "!= netrw"),'~'.expand("<slnum>"))
+" call Decho("treating as not-netrw-buffer: w:netrw_rexfile<".((exists("w:netrw_rexfile"))? w:netrw_rexfile : 'n/a').">",'~'.expand("<slnum>"))
+ endif
+
+ " ---------------------------
+ " :Rex issued while in a file
+ " ---------------------------
+
+ " record current file so :Rex can return to it from netrw
+ let w:netrw_rexfile= expand("%")
+" call Decho("set w:netrw_rexfile<".w:netrw_rexfile."> (win#".winnr().")",'~'.expand("<slnum>"))
+
+ if !exists("w:netrw_rexlocal")
+" call Dret("s:NetrwRexplore w:netrw_rexlocal doesn't exist (".&ft." win#".winnr().")")
+ return
+ endif
+" 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>"))
+ if w:netrw_rexlocal
+ NetrwKeepj call netrw#LocalBrowseCheck(w:netrw_rexdir)
+ else
+ NetrwKeepj call s:NetrwBrowse(0,w:netrw_rexdir)
+ endif
+ if exists("s:initbeval")
+ setl beval
+ endif
+ if exists("s:rexposn_".bufnr("%"))
+" call Decho("restore posn, then unlet s:rexposn_".bufnr('%')."<".bufname("%").">",'~'.expand("<slnum>"))
+ " restore position in directory listing
+" call Decho("restoring posn to s:rexposn_".bufnr('%')."<".string(s:rexposn_{bufnr('%')}).">",'~'.expand("<slnum>"))
+ NetrwKeepj call winrestview(s:rexposn_{bufnr('%')})
+ if exists("s:rexposn_".bufnr('%'))
+ unlet s:rexposn_{bufnr('%')}
+ endif
+ else
+" call Decho("s:rexposn_".bufnr('%')."<".bufname("%")."> doesn't exist",'~'.expand("<slnum>"))
+ endif
+
+ if has("syntax") && exists("g:syntax_on") && g:syntax_on
+ if exists("s:explore_match")
+ exe "2match netrwMarkFile /".s:explore_match."/"
+ endif
+ endif
+
+" 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 Dret("s:NetrwRexplore : ft=".&ft)
+endfun
+
+" ---------------------------------------------------------------------
+" s:SaveBufVars: save selected b: variables to s: variables {{{2
+" use s:RestoreBufVars() to restore b: variables from s: variables
+fun! s:SaveBufVars()
+" call Dfunc("s:SaveBufVars() buf#".bufnr("%"))
+
+ if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif
+ if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif
+ if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif
+ if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif
+ if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif
+ if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif
+
+" call Dret("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("%").">")
+
+ if !exists("a:posndict[bufnr('%')]")
+ let a:posndict[bufnr("%")]= []
+ endif
+" call Decho("before push: a:posndict[buf#".bufnr("%")."]=".string(a:posndict[bufnr('%')]))
+ call add(a:posndict[bufnr("%")],winsaveview())
+" call Decho("after push: a:posndict[buf#".bufnr("%")."]=".string(a:posndict[bufnr('%')]))
+
+" 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 exists("a:posndict")
+ if has_key(a:posndict,bufnr("%"))
+" call Decho("before pop: a:posndict[buf#".bufnr("%")."]=".string(a:posndict[bufnr('%')]))
+ let posnlen= len(a:posndict[bufnr("%")])
+ if posnlen > 0
+ let posnlen= posnlen - 1
+" call Decho("restoring posn posndict[".bufnr("%")."][".posnlen."]=".string(a:posndict[bufnr("%")][posnlen]),'~'.expand("<slnum>"))
+ call winrestview(a:posndict[bufnr("%")][posnlen])
+ call remove(a:posndict[bufnr("%")],posnlen)
+" call Decho("after pop: a:posndict[buf#".bufnr("%")."]=".string(a:posndict[bufnr('%')]))
+ endif
+ endif
+ endif
+" call Dret("s:RestorePosn")
+endfun
+
+" ---------------------------------------------------------------------
+" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2
+fun! s:SaveWinVars()
+" call Dfunc("s:SaveWinVars() win#".winnr())
+ if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif
+ if exists("w:netrw_col") |let s:col = w:netrw_col |endif
+ if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif
+ if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif
+ if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif
+ if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif
+ if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif
+ if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif
+ if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif
+ if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif
+ if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif
+ if exists("w:netrw_line") |let s:line = w:netrw_line |endif
+ if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif
+ if exists("w:netrw_method") |let s:method = w:netrw_method |endif
+ if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif
+ if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif
+ if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif
+ if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif
+" call Dret("s:SaveWinVars")
+endfun
+
+" ---------------------------------------------------------------------
+" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2
+" To allow separate windows to have their own activities, such as
+" Explore **/pattern, several variables have been made window-oriented.
+" However, when the user splits a browser window (ex: ctrl-w s), these
+" variables are not inherited by the new window. SetBufWinVars() and
+" UseBufWinVars() get around that.
+fun! s:SetBufWinVars()
+" call Dfunc("s:SetBufWinVars() win#".winnr())
+ if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif
+ if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif
+ if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif
+ if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif
+ if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif
+ if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif
+ if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif
+ if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif
+ if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif
+ if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif
+" call Dret("s:SetBufWinVars")
+endfun
+
+" ---------------------------------------------------------------------
+" s:SetRexDir: set directory for :Rexplore {{{2
+fun! s:SetRexDir(islocal,dirname)
+" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">) win#".winnr())
+ 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,'~'.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 ".string(winsaveview()),'~'.expand("<slnum>"))
+" call Dret("s:SetRexDir : win#".winnr()." ".(a:islocal? "local" : "remote")." dir: ".a:dirname)
+endfun
+
+" ---------------------------------------------------------------------
+" s:ShowLink: used to modify thin and tree listings to show links {{{2
+fun! s:ShowLink()
+" " call Dfunc("s:ShowLink()")
+" " call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">",'~'.expand("<slnum>"))
+" " call Decho(printf("line#%4d: %s",line("."),getline(".")),'~'.expand("<slnum>"))
+ if exists("b:netrw_curdir")
+ norm! $?\a
+ let fname = b:netrw_curdir.'/'.s:NetrwGetWord()
+ let resname = resolve(fname)
+" " call Decho("fname <".fname.">",'~'.expand("<slnum>"))
+" " call Decho("resname <".resname.">",'~'.expand("<slnum>"))
+" " call Decho("b:netrw_curdir<".b:netrw_curdir.">",'~'.expand("<slnum>"))
+ if resname =~ '^\M'.b:netrw_curdir.'/'
+ let dirlen = strlen(b:netrw_curdir)
+ let resname = strpart(resname,dirlen+1)
+" " call Decho("resname<".resname."> (b:netrw_curdir elided)",'~'.expand("<slnum>"))
+ endif
+ let modline = getline(".")."\t --> ".resname
+" " call Decho("fname <".fname.">",'~'.expand("<slnum>"))
+" " call Decho("modline<".modline.">",'~'.expand("<slnum>"))
+ setl noro ma
+ call setline(".",modline)
+ setl ro noma nomod
+ endif
+" " call Dret("s:ShowLink".((exists("fname")? ' : '.fname : 'n/a')))
+endfun
+
+" ---------------------------------------------------------------------
+" s:ShowStyle: {{{2
+fun! s:ShowStyle()
+ if !exists("w:netrw_liststyle")
+ let liststyle= g:netrw_liststyle
+ else
+ let liststyle= w:netrw_liststyle
+ endif
+ if liststyle == s:THINLIST
+ return s:THINLIST.":thin"
+ elseif liststyle == s:LONGLIST
+ return s:LONGLIST.":long"
+ elseif liststyle == s:WIDELIST
+ return s:WIDELIST.":wide"
+ elseif liststyle == s:TREELIST
+ return s:TREELIST.":tree"
+ else
+ return 'n/a'
+ endif
+endfun
+
+" ---------------------------------------------------------------------
+" s:Strlen: this function returns the length of a string, even if its using multi-byte characters. {{{2
+" Solution from Nicolai Weibull, vim docs (:help strlen()),
+" Tony Mechelynck, and my own invention.
+fun! s:Strlen(x)
+" "" call Dfunc("s:Strlen(x<".a:x."> g:Align_xstrlen=".g:Align_xstrlen.")")
+
+ if v:version >= 703 && exists("*strdisplaywidth")
+ let ret= strdisplaywidth(a:x)
+
+ elseif type(g:Align_xstrlen) == 1
+ " allow user to specify a function to compute the string length (ie. let g:Align_xstrlen="mystrlenfunc")
+ exe "let ret= ".g:Align_xstrlen."('".substitute(a:x,"'","''","g")."')"
+
+ elseif g:Align_xstrlen == 1
+ " number of codepoints (Latin a + combining circumflex is two codepoints)
+ " (comment from TM, solution from NW)
+ let ret= strlen(substitute(a:x,'.','c','g'))
+
+ elseif g:Align_xstrlen == 2
+ " number of spacing codepoints (Latin a + combining circumflex is one spacing
+ " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
+ " (comment from TM, solution from TM)
+ let ret=strlen(substitute(a:x, '.\Z', 'x', 'g'))
+
+ elseif g:Align_xstrlen == 3
+ " virtual length (counting, for instance, tabs as anything between 1 and
+ " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately
+ " preceded by lam, one otherwise, etc.)
+ " (comment from TM, solution from me)
+ let modkeep= &l:mod
+ exe "norm! o\<esc>"
+ call setline(line("."),a:x)
+ let ret= virtcol("$") - 1
+ d
+ NetrwKeepj norm! k
+ let &l:mod= modkeep
+
+ else
+ " at least give a decent default
+ let ret= strlen(a:x)
+ endif
+" "" call Dret("s:Strlen ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" s:ShellEscape: shellescape(), or special windows handling {{{2
+fun! s:ShellEscape(s, ...)
+ if (has('win32') || has('win64')) && $SHELL == '' && &shellslash
+ return printf('"%s"', substitute(a:s, '"', '""', 'g'))
+ endif
+ let f = a:0 > 0 ? a:1 : 0
+ return shellescape(a:s, f)
+endfun
+
+" ---------------------------------------------------------------------
+" s:TreeListMove: supports [[, ]], [], and ][ in tree mode {{{2
+fun! s:TreeListMove(dir)
+" call Dfunc("s:TreeListMove(dir<".a:dir.">)")
+ let curline = getline('.')
+ let prvline = (line(".") > 1)? getline(line(".")-1) : ''
+ let nxtline = (line(".") < line("$"))? getline(line(".")+1) : ''
+ let curindent = substitute(getline('.'),'^\(\%('.s:treedepthstring.'\)*\)[^'.s:treedepthstring.'].\{-}$','\1','e')
+ let indentm1 = substitute(curindent,'^'.s:treedepthstring,'','')
+ let treedepthchr = substitute(s:treedepthstring,' ','','g')
+ let stopline = exists("w:netrw_bannercnt")? w:netrw_bannercnt : 1
+" call Decho("prvline <".prvline."> #".(line(".")-1), '~'.expand("<slnum>"))
+" call Decho("curline <".curline."> #".line(".") , '~'.expand("<slnum>"))
+" call Decho("nxtline <".nxtline."> #".(line(".")+1), '~'.expand("<slnum>"))
+" call Decho("curindent<".curindent.">" , '~'.expand("<slnum>"))
+" call Decho("indentm1 <".indentm1.">" , '~'.expand("<slnum>"))
+ " COMBAK : need to handle when on a directory
+ " COMBAK : need to handle ]] and ][. In general, needs work!!!
+ if curline !~ '/$'
+ if a:dir == '[[' && prvline != ''
+ NetrwKeepj norm! 0
+ let nl = search('^'.indentm1.'\%('.s:treedepthstring.'\)\@!','bWe',stopline) " search backwards
+" call Decho("regfile srch back: ".nl,'~'.expand("<slnum>"))
+ elseif a:dir == '[]' && nxtline != ''
+ NetrwKeepj norm! 0
+" call Decho('srchpat<'.'^\%('.curindent.'\)\@!'.'>','~'.expand("<slnum>"))
+ let nl = search('^\%('.curindent.'\)\@!','We') " search forwards
+ if nl != 0
+ NetrwKeepj norm! k
+ else
+ NetrwKeepj norm! G
+ endif
+" call Decho("regfile srch fwd: ".nl,'~'.expand("<slnum>"))
+ endif
+ endif
+
+" call Dret("s:TreeListMove")
+endfun
+
+" ---------------------------------------------------------------------
+" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
+" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
+" can't be called except via emenu. But due to locale, that menu line may not be called
+" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
+fun! s:UpdateBuffersMenu()
+" call Dfunc("s:UpdateBuffersMenu()")
+ if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu
+ try
+ sil emenu Buffers.Refresh\ menu
+ catch /^Vim\%((\a\+)\)\=:E/
+ let v:errmsg= ""
+ sil NetrwKeepj call s:NetrwBMShow()
+ endtry
+ endif
+" call Dret("s:UpdateBuffersMenu")
+endfun
+
+" ---------------------------------------------------------------------
+" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2
+" Matching function to s:SetBufWinVars()
+fun! s:UseBufWinVars()
+" call Dfunc("s:UseBufWinVars()")
+ if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif
+ if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif
+ if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif
+ if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif
+ if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif
+ if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif
+ if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif
+ if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif
+ if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif
+ if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif
+" call Dret("s:UseBufWinVars")
+endfun
+
+" ---------------------------------------------------------------------
+" s:UserMaps: supports user-defined UserMaps {{{2
+" * calls a user-supplied funcref(islocal,curdir)
+" * interprets result
+" See netrw#UserMaps()
+fun! s:UserMaps(islocal,funcname)
+" call Dfunc("s:UserMaps(islocal=".a:islocal.",funcname<".a:funcname.">)")
+
+ if !exists("b:netrw_curdir")
+ let b:netrw_curdir= getcwd()
+ endif
+ let Funcref = function(a:funcname)
+ let result = Funcref(a:islocal)
+
+ if type(result) == 1
+ " if result from user's funcref is a string...
+" call Decho("result string from user funcref<".result.">",'~'.expand("<slnum>"))
+ if result == "refresh"
+" call Decho("refreshing display",'~'.expand("<slnum>"))
+ call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+ elseif result != ""
+" call Decho("executing result<".result.">",'~'.expand("<slnum>"))
+ exe result
+ endif
+
+ elseif type(result) == 3
+ " if result from user's funcref is a List...
+" call Decho("result List from user funcref<".string(result).">",'~'.expand("<slnum>"))
+ for action in result
+ if action == "refresh"
+" call Decho("refreshing display",'~'.expand("<slnum>"))
+ call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
+ elseif action != ""
+" call Decho("executing action<".action.">",'~'.expand("<slnum>"))
+ exe action
+ endif
+ endfor
+ endif
+
+" call Dret("s:UserMaps")
+endfun
+
+" ==========================
+" Settings Restoration: {{{1
+" ==========================
+let &cpo= s:keepcpo
+unlet s:keepcpo
+
+" ===============
+" Modelines: {{{1
+" ===============
+" vim:ts=8 fdm=marker
diff --git a/runtime/autoload/netrwFileHandlers.vim b/runtime/autoload/netrwFileHandlers.vim
new file mode 100644
index 0000000..d07235c
--- /dev/null
+++ b/runtime/autoload/netrwFileHandlers.vim
@@ -0,0 +1,362 @@
+" netrwFileHandlers: contains various extension-based file handlers for
+" netrw's browsers' x command ("eXecute launcher")
+" Author: Charles E. Campbell
+" Date: Sep 18, 2020
+" Version: 11
+" Copyright: Copyright (C) 1999-2012 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,
+" netrwFileHandlers.vim is provided *as is* and comes with no
+" warranty of any kind, either expressed or implied. In no
+" event will the copyright holder be liable for any damages
+" resulting from the use of this software.
+"
+" Rom 6:23 (WEB) For the wages of sin is death, but the free gift of God {{{1
+" is eternal life in Christ Jesus our Lord.
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if exists("g:loaded_netrwFileHandlers") || &cp
+ finish
+endif
+let g:loaded_netrwFileHandlers= "v11"
+if v:version < 702
+ echohl WarningMsg
+ echo "***warning*** this version of netrwFileHandlers needs vim 7.2"
+ echohl Normal
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" netrwFileHandlers#Invoke: {{{1
+fun! netrwFileHandlers#Invoke(exten,fname)
+" call Dfunc("netrwFileHandlers#Invoke(exten<".a:exten."> fname<".a:fname.">)")
+ let exten= a:exten
+ " list of supported special characters. Consider rcs,v --- that can be
+ " supported with a NFH_rcsCOMMAv() handler
+ if exten =~ '[@:,$!=\-+%?;~]'
+ let specials= {
+\ '@' : 'AT',
+\ ':' : 'COLON',
+\ ',' : 'COMMA',
+\ '$' : 'DOLLAR',
+\ '!' : 'EXCLAMATION',
+\ '=' : 'EQUAL',
+\ '-' : 'MINUS',
+\ '+' : 'PLUS',
+\ '%' : 'PERCENT',
+\ '?' : 'QUESTION',
+\ ';' : 'SEMICOLON',
+\ '~' : 'TILDE'}
+ let exten= substitute(a:exten,'[@:,$!=\-+%?;~]','\=specials[submatch(0)]','ge')
+" call Decho('fname<'.fname.'> done with dictionary')
+ endif
+
+ if a:exten != "" && exists("*NFH_".exten)
+ " support user NFH_*() functions
+" call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")')
+ exe "let ret= NFH_".exten.'("'.a:fname.'")'
+ elseif a:exten != "" && exists("*s:NFH_".exten)
+ " use builtin-NFH_*() functions
+" call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")')
+ exe "let ret= s:NFH_".a:exten.'("'.a:fname.'")'
+ endif
+
+" call Dret("netrwFileHandlers#Invoke 0 : ret=".ret)
+ return 0
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_html: handles html when the user hits "x" when the {{{1
+" cursor is atop a *.html file
+fun! s:NFH_html(pagefile)
+" call Dfunc("s:NFH_html(".a:pagefile.")")
+
+ let page= substitute(a:pagefile,'^','file://','')
+
+ if executable("mozilla")
+" call Decho("executing !mozilla ".page)
+ exe "!mozilla ".shellescape(page,1)
+ elseif executable("netscape")
+" call Decho("executing !netscape ".page)
+ exe "!netscape ".shellescape(page,1)
+ else
+" call Dret("s:NFH_html 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_html 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_htm: handles html when the user hits "x" when the {{{1
+" cursor is atop a *.htm file
+fun! s:NFH_htm(pagefile)
+" call Dfunc("s:NFH_htm(".a:pagefile.")")
+
+ let page= substitute(a:pagefile,'^','file://','')
+
+ if executable("mozilla")
+" call Decho("executing !mozilla ".page)
+ exe "!mozilla ".shellescape(page,1)
+ elseif executable("netscape")
+" call Decho("executing !netscape ".page)
+ exe "!netscape ".shellescape(page,1)
+ else
+" call Dret("s:NFH_htm 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_htm 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_jpg: {{{1
+fun! s:NFH_jpg(jpgfile)
+" call Dfunc("s:NFH_jpg(jpgfile<".a:jpgfile.">)")
+
+ if executable("gimp")
+ exe "silent! !gimp -s ".shellescape(a:jpgfile,1)
+ elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
+" call Decho("silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".escape(a:jpgfile," []|'"))
+ exe "!".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:jpgfile,1)
+ else
+" call Dret("s:NFH_jpg 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_jpg 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_gif: {{{1
+fun! s:NFH_gif(giffile)
+" call Dfunc("s:NFH_gif(giffile<".a:giffile.">)")
+
+ if executable("gimp")
+ exe "silent! !gimp -s ".shellescape(a:giffile,1)
+ elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
+ exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:giffile,1)
+ else
+" call Dret("s:NFH_gif 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_gif 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_png: {{{1
+fun! s:NFH_png(pngfile)
+" call Dfunc("s:NFH_png(pngfile<".a:pngfile.">)")
+
+ if executable("gimp")
+ exe "silent! !gimp -s ".shellescape(a:pngfile,1)
+ elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
+ exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:pngfile,1)
+ else
+" call Dret("s:NFH_png 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_png 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_pnm: {{{1
+fun! s:NFH_pnm(pnmfile)
+" call Dfunc("s:NFH_pnm(pnmfile<".a:pnmfile.">)")
+
+ if executable("gimp")
+ exe "silent! !gimp -s ".shellescape(a:pnmfile,1)
+ elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
+ exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:pnmfile,1)
+ else
+" call Dret("s:NFH_pnm 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_pnm 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_bmp: visualize bmp files {{{1
+fun! s:NFH_bmp(bmpfile)
+" call Dfunc("s:NFH_bmp(bmpfile<".a:bmpfile.">)")
+
+ if executable("gimp")
+ exe "silent! !gimp -s ".a:bmpfile
+ elseif executable(expand("$SystemRoot")."/SYSTEM32/MSPAINT.EXE")
+ exe "silent! !".expand("$SystemRoot")."/SYSTEM32/MSPAINT ".shellescape(a:bmpfile,1)
+ else
+" call Dret("s:NFH_bmp 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_bmp 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_pdf: visualize pdf files {{{1
+fun! s:NFH_pdf(pdf)
+" call Dfunc("s:NFH_pdf(pdf<".a:pdf.">)")
+ if executable("gs")
+ exe 'silent! !gs '.shellescape(a:pdf,1)
+ elseif executable("pdftotext")
+ exe 'silent! pdftotext -nopgbrk '.shellescape(a:pdf,1)
+ else
+" call Dret("s:NFH_pdf 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_pdf 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_doc: visualize doc files {{{1
+fun! s:NFH_doc(doc)
+" call Dfunc("s:NFH_doc(doc<".a:doc.">)")
+
+ if executable("oowriter")
+ exe 'silent! !oowriter '.shellescape(a:doc,1)
+ redraw!
+ else
+" call Dret("s:NFH_doc 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_doc 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_sxw: visualize sxw files {{{1
+fun! s:NFH_sxw(sxw)
+" call Dfunc("s:NFH_sxw(sxw<".a:sxw.">)")
+
+ if executable("oowriter")
+ exe 'silent! !oowriter '.shellescape(a:sxw,1)
+ redraw!
+ else
+" call Dret("s:NFH_sxw 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_sxw 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_xls: visualize xls files {{{1
+fun! s:NFH_xls(xls)
+" call Dfunc("s:NFH_xls(xls<".a:xls.">)")
+
+ if executable("oocalc")
+ exe 'silent! !oocalc '.shellescape(a:xls,1)
+ redraw!
+ else
+" call Dret("s:NFH_xls 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_xls 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_ps: handles PostScript files {{{1
+fun! s:NFH_ps(ps)
+" call Dfunc("s:NFH_ps(ps<".a:ps.">)")
+ if executable("gs")
+" call Decho("exe silent! !gs ".a:ps)
+ exe "silent! !gs ".shellescape(a:ps,1)
+ redraw!
+ elseif executable("ghostscript")
+" call Decho("exe silent! !ghostscript ".a:ps)
+ exe "silent! !ghostscript ".shellescape(a:ps,1)
+ redraw!
+ elseif executable("gswin32")
+" call Decho("exe silent! !gswin32 ".shellescape(a:ps,1))
+ exe "silent! !gswin32 ".shellescape(a:ps,1)
+ redraw!
+ else
+" call Dret("s:NFH_ps 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_ps 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_eps: handles encapsulated PostScript files {{{1
+fun! s:NFH_eps(eps)
+" call Dfunc("s:NFH_eps()")
+ if executable("gs")
+ exe "silent! !gs ".shellescape(a:eps,1)
+ redraw!
+ elseif executable("ghostscript")
+ exe "silent! !ghostscript ".shellescape(a:eps,1)
+ redraw!
+ elseif executable("ghostscript")
+ exe "silent! !ghostscript ".shellescape(a:eps,1)
+ redraw!
+ elseif executable("gswin32")
+ exe "silent! !gswin32 ".shellescape(a:eps,1)
+ redraw!
+ else
+" call Dret("s:NFH_eps 0")
+ return 0
+ endif
+" call Dret("s:NFH_eps 0")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_fig: handles xfig files {{{1
+fun! s:NFH_fig(fig)
+" call Dfunc("s:NFH_fig()")
+ if executable("xfig")
+ exe "silent! !xfig ".a:fig
+ redraw!
+ else
+" call Dret("s:NFH_fig 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_fig 1")
+ return 1
+endfun
+
+" ---------------------------------------------------------------------
+" s:NFH_obj: handles tgif's obj files {{{1
+fun! s:NFH_obj(obj)
+" call Dfunc("s:NFH_obj()")
+ if has("unix") && executable("tgif")
+ exe "silent! !tgif ".a:obj
+ redraw!
+ else
+" call Dret("s:NFH_obj 0")
+ return 0
+ endif
+
+" call Dret("s:NFH_obj 1")
+ return 1
+endfun
+
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" ---------------------------------------------------------------------
+" Modelines: {{{1
+" vim: fdm=marker
diff --git a/runtime/autoload/netrwSettings.vim b/runtime/autoload/netrwSettings.vim
new file mode 100644
index 0000000..61c0ef7
--- /dev/null
+++ b/runtime/autoload/netrwSettings.vim
@@ -0,0 +1,249 @@
+" netrwSettings.vim: makes netrw settings simpler
+" Date: Aug 12, 2021
+" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Version: 17 ASTRO-ONLY
+" Copyright: Copyright (C) 1999-2007 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,
+" netrwSettings.vim is provided *as is* and comes with no
+" warranty of any kind, either 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.
+"
+" Mat 4:23 (WEB) Jesus went about in all Galilee, teaching in their {{{1
+" synagogues, preaching the gospel of the kingdom, and healing
+" every disease and every sickness among the people.
+" Load Once: {{{1
+if exists("g:loaded_netrwSettings") || &cp
+ finish
+endif
+let g:loaded_netrwSettings = "v17"
+if v:version < 700
+ echohl WarningMsg
+ echo "***warning*** this version of netrwSettings needs vim 7.0"
+ echohl Normal
+ finish
+endif
+
+" ---------------------------------------------------------------------
+" NetrwSettings: {{{1
+fun! netrwSettings#NetrwSettings()
+ " this call is here largely just to insure that netrw has been loaded
+ call netrw#WinPath("")
+ if !exists("g:loaded_netrw")
+ echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None
+ return
+ endif
+
+ above wincmd s
+ enew
+ setlocal noswapfile bh=wipe
+ set ft=vim
+ file Netrw\ Settings
+
+ " these variables have the following default effects when they don't
+ " exist (ie. have not been set by the user in his/her .vimrc)
+ if !exists("g:netrw_liststyle")
+ let g:netrw_liststyle= 0
+ let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa"
+ endif
+ if !exists("g:netrw_silent")
+ let g:netrw_silent= 0
+ endif
+ if !exists("g:netrw_use_nt_rcp")
+ let g:netrw_use_nt_rcp= 0
+ endif
+ if !exists("g:netrw_ftp")
+ let g:netrw_ftp= 0
+ endif
+ if !exists("g:netrw_ignorenetrc")
+ let g:netrw_ignorenetrc= 0
+ endif
+
+ put ='+ ---------------------------------------------'
+ put ='+ NetrwSettings: by Charles E. Campbell'
+ put ='+ Press <F1> with cursor atop any line for help'
+ put ='+ ---------------------------------------------'
+ let s:netrw_settings_stop= line(".")
+
+ put =''
+ put ='+ Netrw Protocol Commands'
+ put = 'let g:netrw_dav_cmd = '.g:netrw_dav_cmd
+ put = 'let g:netrw_fetch_cmd = '.g:netrw_fetch_cmd
+ put = 'let g:netrw_ftp_cmd = '.g:netrw_ftp_cmd
+ put = 'let g:netrw_http_cmd = '.g:netrw_http_cmd
+ put = 'let g:netrw_rcp_cmd = '.g:netrw_rcp_cmd
+ put = 'let g:netrw_rsync_cmd = '.g:netrw_rsync_cmd
+ put = 'let g:netrw_scp_cmd = '.g:netrw_scp_cmd
+ put = 'let g:netrw_sftp_cmd = '.g:netrw_sftp_cmd
+ put = 'let g:netrw_ssh_cmd = '.g:netrw_ssh_cmd
+ let s:netrw_protocol_stop= line(".")
+ put = ''
+
+ put ='+Netrw Transfer Control'
+ put = 'let g:netrw_cygwin = '.g:netrw_cygwin
+ put = 'let g:netrw_ftp = '.g:netrw_ftp
+ put = 'let g:netrw_ftpmode = '.g:netrw_ftpmode
+ put = 'let g:netrw_ignorenetrc = '.g:netrw_ignorenetrc
+ put = 'let g:netrw_sshport = '.g:netrw_sshport
+ put = 'let g:netrw_silent = '.g:netrw_silent
+ put = 'let g:netrw_use_nt_rcp = '.g:netrw_use_nt_rcp
+ put = 'let g:netrw_win95ftp = '.g:netrw_win95ftp
+ let s:netrw_xfer_stop= line(".")
+ put =''
+ put ='+ Netrw Messages'
+ put ='let g:netrw_use_errorwindow = '.g:netrw_use_errorwindow
+
+ put = ''
+ put ='+ Netrw Browser Control'
+ if exists("g:netrw_altfile")
+ put = 'let g:netrw_altfile = '.g:netrw_altfile
+ else
+ put = 'let g:netrw_altfile = 0'
+ endif
+ put = 'let g:netrw_alto = '.g:netrw_alto
+ put = 'let g:netrw_altv = '.g:netrw_altv
+ put = 'let g:netrw_banner = '.g:netrw_banner
+ if exists("g:netrw_bannerbackslash")
+ put = 'let g:netrw_bannerbackslash = '.g:netrw_bannerbackslash
+ else
+ put = '\" let g:netrw_bannerbackslash = (not defined)'
+ endif
+ put = 'let g:netrw_browse_split = '.g:netrw_browse_split
+ if exists("g:netrw_browsex_viewer")
+ put = 'let g:netrw_browsex_viewer = '.g:netrw_browsex_viewer
+ else
+ put = '\" let g:netrw_browsex_viewer = (not defined)'
+ endif
+ put = 'let g:netrw_compress = '.g:netrw_compress
+ if exists("g:Netrw_corehandler")
+ put = 'let g:Netrw_corehandler = '.g:Netrw_corehandler
+ else
+ put = '\" let g:Netrw_corehandler = (not defined)'
+ endif
+ put = 'let g:netrw_ctags = '.g:netrw_ctags
+ put = 'let g:netrw_cursor = '.g:netrw_cursor
+ let decompressline= line("$")
+ put = 'let g:netrw_decompress = '.string(g:netrw_decompress)
+ if exists("g:netrw_dynamic_maxfilenamelen")
+ put = 'let g:netrw_dynamic_maxfilenamelen='.g:netrw_dynamic_maxfilenamelen
+ else
+ put = '\" let g:netrw_dynamic_maxfilenamelen= (not defined)'
+ endif
+ put = 'let g:netrw_dirhistmax = '.g:netrw_dirhistmax
+ put = 'let g:netrw_errorlvl = '.g:netrw_errorlvl
+ put = 'let g:netrw_fastbrowse = '.g:netrw_fastbrowse
+ let fnameescline= line("$")
+ put = 'let g:netrw_fname_escape = '.string(g:netrw_fname_escape)
+ put = 'let g:netrw_ftp_browse_reject = '.g:netrw_ftp_browse_reject
+ put = 'let g:netrw_ftp_list_cmd = '.g:netrw_ftp_list_cmd
+ put = 'let g:netrw_ftp_sizelist_cmd = '.g:netrw_ftp_sizelist_cmd
+ put = 'let g:netrw_ftp_timelist_cmd = '.g:netrw_ftp_timelist_cmd
+ let globescline= line("$")
+ put = 'let g:netrw_glob_escape = '.string(g:netrw_glob_escape)
+ put = 'let g:netrw_hide = '.g:netrw_hide
+ if exists("g:netrw_home")
+ put = 'let g:netrw_home = '.g:netrw_home
+ else
+ put = '\" let g:netrw_home = (not defined)'
+ endif
+ put = 'let g:netrw_keepdir = '.g:netrw_keepdir
+ put = 'let g:netrw_list_cmd = '.g:netrw_list_cmd
+ put = 'let g:netrw_list_hide = '.g:netrw_list_hide
+ put = 'let g:netrw_liststyle = '.g:netrw_liststyle
+ put = 'let g:netrw_localcopycmd = '.g:netrw_localcopycmd
+ put = 'let g:netrw_localcopycmdopt = '.g:netrw_localcopycmdopt
+ put = 'let g:netrw_localmkdir = '.g:netrw_localmkdir
+ put = 'let g:netrw_localmkdiropt = '.g:netrw_localmkdiropt
+ put = 'let g:netrw_localmovecmd = '.g:netrw_localmovecmd
+ put = 'let g:netrw_localmovecmdopt = '.g:netrw_localmovecmdopt
+ put = 'let g:netrw_localrmdir = '.g:netrw_localrmdir
+ put = 'let g:netrw_localrmdiropt = '.g:netrw_localrmdiropt
+ put = 'let g:netrw_maxfilenamelen = '.g:netrw_maxfilenamelen
+ put = 'let g:netrw_menu = '.g:netrw_menu
+ put = 'let g:netrw_mousemaps = '.g:netrw_mousemaps
+ put = 'let g:netrw_mkdir_cmd = '.g:netrw_mkdir_cmd
+ if exists("g:netrw_nobeval")
+ put = 'let g:netrw_nobeval = '.g:netrw_nobeval
+ else
+ put = '\" let g:netrw_nobeval = (not defined)'
+ endif
+ put = 'let g:netrw_remote_mkdir = '.g:netrw_remote_mkdir
+ put = 'let g:netrw_preview = '.g:netrw_preview
+ put = 'let g:netrw_rename_cmd = '.g:netrw_rename_cmd
+ put = 'let g:netrw_retmap = '.g:netrw_retmap
+ put = 'let g:netrw_rm_cmd = '.g:netrw_rm_cmd
+ put = 'let g:netrw_rmdir_cmd = '.g:netrw_rmdir_cmd
+ put = 'let g:netrw_rmf_cmd = '.g:netrw_rmf_cmd
+ put = 'let g:netrw_sort_by = '.g:netrw_sort_by
+ put = 'let g:netrw_sort_direction = '.g:netrw_sort_direction
+ put = 'let g:netrw_sort_options = '.g:netrw_sort_options
+ put = 'let g:netrw_sort_sequence = '.g:netrw_sort_sequence
+ put = 'let g:netrw_servername = '.g:netrw_servername
+ put = 'let g:netrw_special_syntax = '.g:netrw_special_syntax
+ put = 'let g:netrw_ssh_browse_reject = '.g:netrw_ssh_browse_reject
+ put = 'let g:netrw_ssh_cmd = '.g:netrw_ssh_cmd
+ put = 'let g:netrw_scpport = '.g:netrw_scpport
+ put = 'let g:netrw_sepchr = '.g:netrw_sepchr
+ put = 'let g:netrw_sshport = '.g:netrw_sshport
+ put = 'let g:netrw_timefmt = '.g:netrw_timefmt
+ let tmpfileescline= line("$")
+ put ='let g:netrw_tmpfile_escape...'
+ put = 'let g:netrw_use_noswf = '.g:netrw_use_noswf
+ put = 'let g:netrw_xstrlen = '.g:netrw_xstrlen
+ put = 'let g:netrw_winsize = '.g:netrw_winsize
+
+ put =''
+ put ='+ For help, place cursor on line and press <F1>'
+
+ 1d
+ silent %s/^+/"/e
+ res 99
+ silent %s/= \([^0-9].*\)$/= '\1'/e
+ silent %s/= $/= ''/e
+ 1
+
+ call setline(decompressline,"let g:netrw_decompress = ".substitute(string(g:netrw_decompress),"^'\\(.*\\)'$",'\1',''))
+ call setline(fnameescline, "let g:netrw_fname_escape = '".escape(g:netrw_fname_escape,"'")."'")
+ call setline(globescline, "let g:netrw_glob_escape = '".escape(g:netrw_glob_escape,"'")."'")
+ call setline(tmpfileescline,"let g:netrw_tmpfile_escape = '".escape(g:netrw_tmpfile_escape,"'")."'")
+
+ set nomod
+
+ nmap <buffer> <silent> <F1> :call NetrwSettingHelp()<cr>
+ nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call NetrwSettingHelp()<cr>
+ let tmpfile= tempname()
+ exe 'au BufWriteCmd Netrw\ Settings silent w! '.tmpfile.'|so '.tmpfile.'|call delete("'.tmpfile.'")|set nomod'
+endfun
+
+" ---------------------------------------------------------------------
+" NetrwSettingHelp: {{{2
+fun! NetrwSettingHelp()
+" call Dfunc("NetrwSettingHelp()")
+ let curline = getline(".")
+ if curline =~ '='
+ let varhelp = substitute(curline,'^\s*let ','','e')
+ let varhelp = substitute(varhelp,'\s*=.*$','','e')
+" call Decho("trying help ".varhelp)
+ try
+ exe "he ".varhelp
+ catch /^Vim\%((\a\+)\)\=:E149/
+ echo "***sorry*** no help available for <".varhelp.">"
+ endtry
+ elseif line(".") < s:netrw_settings_stop
+ he netrw-settings
+ elseif line(".") < s:netrw_protocol_stop
+ he netrw-externapp
+ elseif line(".") < s:netrw_xfer_stop
+ he netrw-variables
+ else
+ he netrw-browse-var
+ endif
+" call Dret("NetrwSettingHelp")
+endfun
+
+" ---------------------------------------------------------------------
+" Modelines: {{{1
+" vim:ts=8 fdm=marker
diff --git a/runtime/autoload/netrw_gitignore.vim b/runtime/autoload/netrw_gitignore.vim
new file mode 100644
index 0000000..1b55e24
--- /dev/null
+++ b/runtime/autoload/netrw_gitignore.vim
@@ -0,0 +1,22 @@
+" netrw_gitignore#Hide: gitignore-based hiding
+" Function returns a string of comma separated patterns convenient for
+" assignment to `g:netrw_list_hide` option.
+" Function can take additional filenames as arguments, example:
+" netrw_gitignore#Hide('custom_gitignore1', 'custom_gitignore2')
+"
+" Usage examples:
+" let g:netrw_list_hide = netrw_gitignore#Hide()
+" let g:netrw_list_hide = netrw_gitignore#Hide() . 'more,hide,patterns'
+"
+" Copyright: Copyright (C) 2013 Bruno Sutic {{{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,
+" netrw_gitignore.vim is provided *as is* and comes with no
+" warranty of any kind, either 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.
+function! netrw_gitignore#Hide(...)
+ return substitute(substitute(system('git ls-files --other --ignored --exclude-standard --directory'), '\n', ',', 'g'), ',$', '', '')
+endfunction
diff --git a/runtime/autoload/paste.vim b/runtime/autoload/paste.vim
new file mode 100644
index 0000000..2d787e7
--- /dev/null
+++ b/runtime/autoload/paste.vim
@@ -0,0 +1,25 @@
+" Vim support file to help with paste mappings and menus
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2019 Jan 27
+
+" 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.
+
+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'] = "\<c-\>\<c-o>\"+gP"
+
+func! paste#Paste()
+ let ove = &ve
+ set ve=all
+ normal! `^
+ if @+ != ''
+ normal! "+gP
+ endif
+ let c = col(".")
+ normal! i
+ if col(".") < c " compensate for i<ESC> moving the cursor left
+ normal! l
+ endif
+ let &ve = ove
+endfunc
diff --git a/runtime/autoload/phpcomplete.vim b/runtime/autoload/phpcomplete.vim
new file mode 100644
index 0000000..f9448cb
--- /dev/null
+++ b/runtime/autoload/phpcomplete.vim
@@ -0,0 +1,2988 @@
+" Vim completion script
+" Language: PHP
+" 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: 2021 Feb 08
+"
+" OPTIONS:
+"
+" let g:phpcomplete_relax_static_constraint = 1/0 [default 0]
+" Enables completion for non-static methods when completing for static context (::).
+" This generates E_STRICT level warning, but php calls these methods nonetheless.
+"
+" let g:phpcomplete_complete_for_unknown_classes = 1/0 [default 0]
+" Enables completion of variables and functions in "everything under the sun" fashion
+" when completing for an instance or static class context but the code can't tell the class
+" or locate the file that it lives in.
+" The completion list generated this way is only filtered by the completion base
+" and generally not much more accurate then simple keyword completion.
+"
+" let g:phpcomplete_search_tags_for_variables = 1/0 [default 0]
+" Enables use of tags when the plugin tries to find variables.
+" When enabled the plugin will search for the variables in the tag files with kind 'v',
+" lines like $some_var = new Foo; but these usually yield highly inaccurate results and
+" can be fairly slow.
+"
+" let g:phpcomplete_min_num_of_chars_for_namespace_completion = n [default 1]
+" This option controls the number of characters the user needs to type before
+" the tags will be searched for namespaces and classes in typed out namespaces in
+" "use ..." context. Setting this to 0 is not recommended because that means the code
+" have to scan every tag, and vim's taglist() function runs extremely slow with a
+" "match everything" pattern.
+"
+" let g:phpcomplete_parse_docblock_comments = 1/0 [default 0]
+" When enabled the preview window's content will include information
+" extracted from docblock comments of the completions.
+" Enabling this option will add return types to the completion menu for functions too.
+"
+" let g:phpcomplete_cache_taglists = 1/0 [default 1]
+" When enabled the taglist() lookups will be cached and subsequent searches
+" for the same pattern will not check the tagfiles any more, thus making the
+" lookups faster. Cache expiration is based on the mtimes of the tag files.
+"
+" TODO:
+" - Switching to HTML (XML?) completion (SQL) inside of phpStrings
+" - allow also for XML completion <- better do html_flavor for HTML
+" completion
+" - outside of <?php?> getting parent tag may cause problems. Heh, even in
+" perfect conditions GetLastOpenTag doesn't cooperate... Inside of
+" phpStrings this can be even a bonus but outside of <?php?> it is not the
+" best situation
+
+if !exists('g:phpcomplete_relax_static_constraint')
+ let g:phpcomplete_relax_static_constraint = 0
+endif
+
+if !exists('g:phpcomplete_complete_for_unknown_classes')
+ let g:phpcomplete_complete_for_unknown_classes = 0
+endif
+
+if !exists('g:phpcomplete_search_tags_for_variables')
+ let g:phpcomplete_search_tags_for_variables = 0
+endif
+
+if !exists('g:phpcomplete_min_num_of_chars_for_namespace_completion')
+ let g:phpcomplete_min_num_of_chars_for_namespace_completion = 1
+endif
+
+if !exists('g:phpcomplete_parse_docblock_comments')
+ let g:phpcomplete_parse_docblock_comments = 0
+endif
+
+if !exists('g:phpcomplete_cache_taglists')
+ let g:phpcomplete_cache_taglists = 1
+endif
+
+if !exists('s:cache_classstructures')
+ let s:cache_classstructures = {}
+endif
+
+if !exists('s:cache_tags')
+ let s:cache_tags = {}
+endif
+
+if !exists('s:cache_tags_checksum')
+ let s:cache_tags_checksum = ''
+endif
+
+let s:script_path = fnamemodify(resolve(expand('<sfile>:p')), ':h')
+
+function! phpcomplete#CompletePHP(findstart, base) " {{{
+ if a:findstart
+ unlet! b:php_menu
+ " Check if we are inside of PHP markup
+ let pos = getpos('.')
+ let phpbegin = searchpairpos('<?', '', '?>', 'bWn',
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')
+ let phpend = searchpairpos('<?', '', '?>', 'Wn',
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')
+
+ if phpbegin == [0,0] && phpend == [0,0]
+ " We are outside of any PHP markup. Complete HTML
+ let htmlbegin = htmlcomplete#CompleteTags(1, '')
+ let cursor_col = pos[2]
+ let base = getline('.')[htmlbegin : cursor_col]
+ let b:php_menu = htmlcomplete#CompleteTags(0, base)
+ return htmlbegin
+ else
+ " locate the start of the word
+ let line = getline('.')
+ let start = col('.') - 1
+ let compl_begin = col('.') - 2
+ while start >= 0 && line[start - 1] =~ '[\\a-zA-Z_0-9\x7f-\xff$]'
+ let start -= 1
+ endwhile
+ let b:phpbegin = phpbegin
+ let b:compl_context = phpcomplete#GetCurrentInstruction(line('.'), max([0, col('.') - 2]), phpbegin)
+
+ return start
+ " We can be also inside of phpString with HTML tags. Deal with
+ " it later (time, not lines).
+ endif
+ endif
+
+ " If exists b:php_menu it means completion was already constructed we
+ " don't need to do anything more
+ if exists("b:php_menu")
+ return b:php_menu
+ endif
+
+ if !exists('g:php_builtin_functions')
+ call phpcomplete#LoadData()
+ endif
+
+ " a:base is very short - we need context
+ if exists("b:compl_context")
+ let context = b:compl_context
+ unlet! b:compl_context
+ " chop of the "base" from the end of the current instruction
+ if a:base != ""
+ let context = substitute(context, '\s*[$a-zA-Z_0-9\x7f-\xff]*$', '', '')
+ end
+ else
+ let context = ''
+ end
+
+ try
+ let eventignore = &eventignore
+ let &eventignore = 'all'
+
+ let [current_namespace, imports] = phpcomplete#GetCurrentNameSpace(getline(0, line('.')))
+
+ if context =~? '^use\s' || context ==? 'use'
+ return phpcomplete#CompleteUse(a:base)
+ endif
+
+ if context =~ '\(->\|::\)$'
+ " {{{
+ " Get name of the class
+ let classname = phpcomplete#GetClassName(line('.'), context, current_namespace, imports)
+
+ " Get location of class definition, we have to iterate through all
+ if classname != ''
+ if classname =~ '\'
+ " split the last \ segment as a classname, everything else is the namespace
+ let classname_parts = split(classname, '\')
+ let namespace = join(classname_parts[0:-2], '\')
+ let classname = classname_parts[-1]
+ else
+ let namespace = '\'
+ endif
+ let classlocation = phpcomplete#GetClassLocation(classname, namespace)
+ else
+ let classlocation = ''
+ endif
+
+ if classlocation != ''
+ if classlocation == 'VIMPHP_BUILTINOBJECT' && has_key(g:php_builtin_classes, tolower(classname))
+ return phpcomplete#CompleteBuiltInClass(context, classname, a:base)
+ endif
+
+ if filereadable(classlocation)
+ let classcontent = ''
+ let classcontent .= "\n".phpcomplete#GetClassContents(classlocation, classname)
+ let sccontent = split(classcontent, "\n")
+ let visibility = expand('%:p') == fnamemodify(classlocation, ':p') ? 'private' : 'public'
+
+ return phpcomplete#CompleteUserClass(context, a:base, sccontent, visibility)
+ endif
+ endif
+
+ return phpcomplete#CompleteUnknownClass(a:base, context)
+ " }}}
+ 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'
+ let kinds = context =~? 'class\s' ? ['c'] : ['i']
+ return phpcomplete#CompleteClassName(a:base, kinds, current_namespace, imports)
+ elseif context =~? 'class [a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*'
+ " special case when you've typed the class keyword and the name too, only extends and implements allowed there
+ return filter(['extends', 'implements'], 'stridx(v:val, a:base) == 0')
+ elseif context =~? 'new'
+ return phpcomplete#CompleteClassName(a:base, ['c'], current_namespace, imports)
+ endif
+
+ if a:base =~ '^\$'
+ return phpcomplete#CompleteVariable(a:base)
+ else
+ return phpcomplete#CompleteGeneral(a:base, current_namespace, imports)
+ endif
+ finally
+ let &eventignore = eventignore
+ endtry
+endfunction
+" }}}
+
+function! phpcomplete#CompleteUse(base) " {{{
+ " completes builtin class names regadless of g:phpcomplete_min_num_of_chars_for_namespace_completion
+ " completes namespaces from tags
+ " * requires patched ctags
+ " completes classnames from tags within the already typed out namespace using the "namespace" field of tags
+ " * requires patched ctags
+
+ let res = []
+
+ " class and namespace names are always considered absoltute in use ... expressions, leading slash is not recommended
+ " by the php manual, so we gonna get rid of that
+ if a:base =~? '^\'
+ let base = substitute(a:base, '^\', '', '')
+ else
+ let base = a:base
+ endif
+
+ let namespace_match_pattern = substitute(base, '\\', '\\\\', 'g')
+ let classname_match_pattern = matchstr(base, '[^\\]\+$')
+ let namespace_for_class = substitute(substitute(namespace_match_pattern, '\\\\', '\\', 'g'), '\\*'.classname_match_pattern.'$', '', '')
+
+ if len(namespace_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion
+ if len(classname_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion
+ let tags = phpcomplete#GetTaglist('^\('.namespace_match_pattern.'\|'.classname_match_pattern.'\)')
+ else
+ let tags = phpcomplete#GetTaglist('^'.namespace_match_pattern)
+ endif
+
+ let patched_ctags_detected = 0
+ let namespaced_matches = []
+ let no_namespace_matches = []
+ for tag in tags
+ if has_key(tag, 'namespace')
+ let patched_ctags_detected = 1
+ endif
+
+ if tag.kind ==? 'n' && tag.name =~? '^'.namespace_match_pattern
+ let patched_ctags_detected = 1
+ call add(namespaced_matches, {'word': tag.name, 'kind': 'n', 'menu': tag.filename, 'info': tag.filename })
+ elseif has_key(tag, 'namespace') && (tag.kind ==? 'c' || tag.kind ==? 'i' || tag.kind ==? 't') && tag.namespace ==? namespace_for_class
+ call add(namespaced_matches, {'word': namespace_for_class.'\'.tag.name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename })
+ elseif (tag.kind ==? 'c' || tag.kind ==? 'i' || tag.kind ==? 't')
+ call add(no_namespace_matches, {'word': namespace_for_class.'\'.tag.name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename })
+ endif
+ endfor
+ " if it seems that the tags file have namespace information we can safely throw
+ " away namespaceless tag matches since we can be sure they are invalid
+ if patched_ctags_detected
+ no_namespace_matches = []
+ endif
+ let res += namespaced_matches + no_namespace_matches
+ endif
+
+ if base !~ '\'
+ let builtin_classnames = filter(keys(copy(g:php_builtin_classnames)), 'v:val =~? "^'.classname_match_pattern.'"')
+ for classname in builtin_classnames
+ call add(res, {'word': g:php_builtin_classes[tolower(classname)].name, 'kind': 'c'})
+ endfor
+ let builtin_interfacenames = filter(keys(copy(g:php_builtin_interfacenames)), 'v:val =~? "^'.classname_match_pattern.'"')
+ for interfacename in builtin_interfacenames
+ call add(res, {'word': g:php_builtin_interfaces[tolower(interfacename)].name, 'kind': 'i'})
+ endfor
+ endif
+
+ for comp in res
+ let comp.word = substitute(comp.word, '^\\', '', '')
+ endfor
+
+ return res
+endfunction
+" }}}
+
+function! phpcomplete#CompleteGeneral(base, current_namespace, imports) " {{{
+ " Complete everything
+ " + functions, DONE
+ " + keywords of language DONE
+ " + defines (constant definitions), DONE
+ " + extend keywords for predefined constants, DONE
+ " + classes (after new), DONE
+ " + limit choice after -> and :: to funcs and vars DONE
+
+ " Internal solution for finding functions in current file.
+
+ if a:base =~? '^\'
+ let leading_slash = '\'
+ else
+ let leading_slash = ''
+ endif
+
+ let file = getline(1, '$')
+ call filter(file,
+ \ 'v:val =~ "function\\s\\+&\\?[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*("')
+ let jfile = join(file, ' ')
+ let int_values = split(jfile, 'function\s\+')
+ let int_functions = {}
+ for i in int_values
+ let f_name = matchstr(i,
+ \ '^&\?\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze')
+ if f_name =~? '^'.substitute(a:base, '\\', '\\\\', 'g')
+ let f_args = matchstr(i,
+ \ '^&\?[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\s*(\zs.\{-}\ze)\_s*\(;\|{\|$\)')
+ let int_functions[f_name.'('] = f_args.')'
+ endif
+ endfor
+
+ " Internal solution for finding constants in current file
+ let file = getline(1, '$')
+ call filter(file, 'v:val =~ "define\\s*("')
+ let jfile = join(file, ' ')
+ let int_values = split(jfile, 'define\s*(\s*')
+ let int_constants = {}
+ for i in int_values
+ let c_name = matchstr(i, '\(["'']\)\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze\1')
+ if c_name != '' && c_name =~# '^'.substitute(a:base, '\\', '\\\\', 'g')
+ let int_constants[leading_slash.c_name] = ''
+ endif
+ endfor
+
+ " Prepare list of functions from tags file
+ let ext_functions = {}
+ let ext_constants = {}
+ let ext_classes = {}
+ let ext_traits = {}
+ let ext_interfaces = {}
+ let ext_namespaces = {}
+
+ let base = substitute(a:base, '^\\', '', '')
+ let [tag_match_pattern, namespace_for_tag] = phpcomplete#ExpandClassName(a:base, a:current_namespace, a:imports)
+ let namespace_match_pattern = substitute((namespace_for_tag == '' ? '' : namespace_for_tag.'\').tag_match_pattern, '\\', '\\\\', 'g')
+
+ let tags = []
+ if len(namespace_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion && len(tag_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion && tag_match_pattern != namespace_match_pattern
+ let tags = phpcomplete#GetTaglist('\c^\('.tag_match_pattern.'\|'.namespace_match_pattern.'\)')
+ elseif len(namespace_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion
+ let tags = phpcomplete#GetTaglist('\c^'.namespace_match_pattern)
+ elseif len(tag_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion
+ let tags = phpcomplete#GetTaglist('\c^'.tag_match_pattern)
+ endif
+
+ for tag in tags
+ if !has_key(tag, 'namespace') || tag.namespace ==? a:current_namespace || tag.namespace ==? namespace_for_tag
+ if has_key(tag, 'namespace')
+ let full_name = tag.namespace.'\'.tag.name " absolute namespaced name (without leading '\')
+
+ let base_parts = split(a:base, '\')
+ if len(base_parts) > 1
+ let namespace_part = join(base_parts[0:-2], '\')
+ else
+ let namespace_part = ''
+ endif
+ let relative_name = (namespace_part == '' ? '' : namespace_part.'\').tag.name
+ endif
+
+ if tag.kind ==? 'n' && tag.name =~? '^'.namespace_match_pattern
+ let info = tag.name.' - '.tag.filename
+ " patched ctag provides absolute namespace names as tag name, namespace tags dont have namespace fields
+ let full_name = tag.name
+
+ let base_parts = split(a:base, '\')
+ let full_name_parts = split(full_name, '\')
+ if len(base_parts) > 1
+ " the first segment could be a renamed import, take the first segment from the user provided input
+ " so if it's a sub namespace of a renamed namespace, just use the typed in segments in place of the absolute path
+ " for example:
+ " you have a namespace NS1\SUBNS as SUB
+ " you have a sub-sub-namespace NS1\SUBNS\SUBSUB
+ " typed in SUB\SU
+ " the tags will return NS1\SUBNS\SUBSUB
+ " the completion should be: SUB\SUBSUB by replacing the NS1\SUBSN to SUB as in the import
+ if has_key(a:imports, base_parts[0]) && a:imports[base_parts[0]].kind == 'n'
+ let import = a:imports[base_parts[0]]
+ let relative_name = substitute(full_name, '^'.substitute(import.name, '\\', '\\\\', 'g'), base_parts[0], '')
+ else
+ let relative_name = strpart(full_name, stridx(full_name, a:base))
+ endif
+ else
+ let relative_name = strpart(full_name, stridx(full_name, a:base))
+ endif
+
+ if leading_slash == ''
+ let ext_namespaces[relative_name.'\'] = info
+ else
+ let ext_namespaces['\'.full_name.'\'] = info
+ endif
+ elseif tag.kind ==? 'f' && !has_key(tag, 'class') " class related functions (methods) completed elsewhere, only works with patched ctags
+ if has_key(tag, 'signature')
+ let prototype = tag.signature[1:-2] " drop the ()s around the string
+ else
+ let prototype = matchstr(tag.cmd,
+ \ 'function\s\+&\?[^[:space:]]\+\s*(\s*\zs.\{-}\ze\s*)\s*{\?')
+ endif
+ let info = prototype.') - '.tag.filename
+
+ if !has_key(tag, 'namespace')
+ let ext_functions[tag.name.'('] = info
+ else
+ if tag.namespace ==? namespace_for_tag
+ if leading_slash == ''
+ let ext_functions[relative_name.'('] = info
+ else
+ let ext_functions['\'.full_name.'('] = info
+ endif
+ endif
+ endif
+ elseif tag.kind ==? 'd'
+ let info = ' - '.tag.filename
+ if !has_key(tag, 'namespace')
+ let ext_constants[tag.name] = info
+ else
+ if tag.namespace ==? namespace_for_tag
+ if leading_slash == ''
+ let ext_constants[relative_name] = info
+ else
+ let ext_constants['\'.full_name] = info
+ endif
+ endif
+ endif
+ elseif tag.kind ==? 'c' || tag.kind ==? 'i' || tag.kind ==? 't'
+ let info = ' - '.tag.filename
+
+ let key = ''
+ if !has_key(tag, 'namespace')
+ let key = tag.name
+ else
+ if tag.namespace ==? namespace_for_tag
+ if leading_slash == ''
+ let key = relative_name
+ else
+ let key = '\'.full_name
+ endif
+ endif
+ endif
+
+ if key != ''
+ if tag.kind ==? 'c'
+ let ext_classes[key] = info
+ elseif tag.kind ==? 'i'
+ let ext_interfaces[key] = info
+ elseif tag.kind ==? 't'
+ let ext_traits[key] = info
+ endif
+ endif
+ endif
+ endif
+ endfor
+
+ let builtin_constants = {}
+ let builtin_classnames = {}
+ let builtin_interfaces = {}
+ let builtin_functions = {}
+ let builtin_keywords = {}
+ let base = substitute(a:base, '^\', '', '')
+ if a:current_namespace == '\' || (a:base =~ '^\\' && a:base =~ '^\\[^\\]*$')
+
+ " Add builtin class names
+ for [classname, info] in items(g:php_builtin_classnames)
+ if classname =~? '^'.base
+ let builtin_classnames[leading_slash.g:php_builtin_classes[tolower(classname)].name] = info
+ endif
+ endfor
+ for [interfacename, info] in items(g:php_builtin_interfacenames)
+ if interfacename =~? '^'.base
+ let builtin_interfaces[leading_slash.g:php_builtin_interfaces[tolower(interfacename)].name] = info
+ endif
+ endfor
+ endif
+
+ " Prepare list of constants from built-in constants
+ for [constant, info] in items(g:php_constants)
+ if constant =~# '^'.base
+ let builtin_constants[leading_slash.constant] = info
+ endif
+ endfor
+
+ if leading_slash == '' " keywords should not be completed when base starts with '\'
+ " Treat keywords as constants
+ for [constant, info] in items(g:php_keywords)
+ if constant =~? '^'.a:base
+ let builtin_keywords[constant] = info
+ endif
+ endfor
+ endif
+
+ for [function_name, info] in items(g:php_builtin_functions)
+ if function_name =~? '^'.base
+ let builtin_functions[leading_slash.function_name] = info
+ endif
+ endfor
+
+ " All constants
+ call extend(int_constants, ext_constants)
+
+ " All functions
+ call extend(int_functions, ext_functions)
+ call extend(int_functions, builtin_functions)
+
+ for [imported_name, import] in items(a:imports)
+ if imported_name =~? '^'.base
+ if import.kind ==? 'c'
+ if import.builtin
+ let builtin_classnames[imported_name] = ' '.import.name
+ else
+ let ext_classes[imported_name] = ' '.import.name.' - '.import.filename
+ endif
+ elseif import.kind ==? 'i'
+ if import.builtin
+ let builtin_interfaces[imported_name] = ' '.import.name
+ else
+ let ext_interfaces[imported_name] = ' '.import.name.' - '.import.filename
+ endif
+ elseif import.kind ==? 't'
+ let ext_traits[imported_name] = ' '.import.name.' - '.import.filename
+ endif
+
+ " no builtin interfaces
+ if import.kind == 'n'
+ let ext_namespaces[imported_name.'\'] = ' '.import.name.' - '.import.filename
+ endif
+ end
+ endfor
+
+ let all_values = {}
+
+ " Add functions found in this file
+ call extend(all_values, int_functions)
+
+ " Add namespaces from tags
+ call extend(all_values, ext_namespaces)
+
+ " Add constants from the current file
+ call extend(all_values, int_constants)
+
+ " Add built-in constants
+ call extend(all_values, builtin_constants)
+
+ " Add external classes
+ call extend(all_values, ext_classes)
+
+ " Add external interfaces
+ call extend(all_values, ext_interfaces)
+
+ " Add external traits
+ call extend(all_values, ext_traits)
+
+ " Add built-in classes
+ call extend(all_values, builtin_classnames)
+
+ " Add built-in interfaces
+ call extend(all_values, builtin_interfaces)
+
+ " Add php keywords
+ call extend(all_values, builtin_keywords)
+
+ let final_list = []
+ let int_list = sort(keys(all_values))
+ for i in int_list
+ if has_key(ext_namespaces, i)
+ let final_list += [{'word':i, 'kind':'n', 'menu': ext_namespaces[i], 'info': ext_namespaces[i]}]
+ elseif has_key(int_functions, i)
+ let final_list +=
+ \ [{'word':i,
+ \ 'info':i.int_functions[i],
+ \ 'menu':int_functions[i],
+ \ 'kind':'f'}]
+ elseif has_key(ext_classes, i) || has_key(builtin_classnames, i)
+ let info = has_key(ext_classes, i) ? ext_classes[i] : builtin_classnames[i].' - builtin'
+ let final_list += [{'word':i, 'kind': 'c', 'menu': info, 'info': i.info}]
+ elseif has_key(ext_interfaces, i) || has_key(builtin_interfaces, i)
+ let info = has_key(ext_interfaces, i) ? ext_interfaces[i] : builtin_interfaces[i].' - builtin'
+ let final_list += [{'word':i, 'kind': 'i', 'menu': info, 'info': i.info}]
+ elseif has_key(ext_traits, i)
+ let final_list += [{'word':i, 'kind': 't', 'menu': ext_traits[i], 'info': ext_traits[i]}]
+ elseif has_key(int_constants, i) || has_key(builtin_constants, i)
+ let info = has_key(int_constants, i) ? int_constants[i] : ' - builtin'
+ let final_list += [{'word':i, 'kind': 'd', 'menu': info, 'info': i.info}]
+ else
+ let final_list += [{'word':i}]
+ endif
+ endfor
+
+ return final_list
+endfunction
+" }}}
+
+function! phpcomplete#CompleteUnknownClass(base, context) " {{{
+ let res = []
+
+ if g:phpcomplete_complete_for_unknown_classes != 1
+ return []
+ endif
+
+ if a:base =~ '^\$'
+ let adddollar = '$'
+ else
+ let adddollar = ''
+ endif
+
+ let file = getline(1, '$')
+
+ " Internal solution for finding object properties in current file.
+ if a:context =~ '::'
+ let variables = filter(deepcopy(file),
+ \ 'v:val =~ "^\\s*\\(static\\|static\\s\\+\\(public\\|var\\)\\|\\(public\\|var\\)\\s\\+static\\)\\s\\+\\$"')
+ elseif a:context =~ '->'
+ let variables = filter(deepcopy(file),
+ \ 'v:val =~ "^\\s*\\(public\\|var\\)\\s\\+\\$"')
+ endif
+ let jvars = join(variables, ' ')
+ let svars = split(jvars, '\$')
+ let int_vars = {}
+ for i in svars
+ let c_var = matchstr(i,
+ \ '^\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze')
+ if c_var != ''
+ let int_vars[adddollar.c_var] = ''
+ endif
+ endfor
+
+ " Internal solution for finding functions in current file.
+ call filter(deepcopy(file),
+ \ 'v:val =~ "function\\s\\+&\\?[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*("')
+ let jfile = join(file, ' ')
+ let int_values = split(jfile, 'function\s\+')
+ let int_functions = {}
+ for i in int_values
+ let f_name = matchstr(i,
+ \ '^&\?\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze')
+ let f_args = matchstr(i,
+ \ '^&\?[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\s*(\zs.\{-}\ze)\_s*\(;\|{\|$\)')
+
+ let int_functions[f_name.'('] = f_args.')'
+ endfor
+
+ " collect external functions from tags
+ let ext_functions = {}
+ let tags = phpcomplete#GetTaglist('^'.substitute(a:base, '^\$', '', ''))
+ for tag in tags
+ if tag.kind ==? 'f'
+ let item = tag.name
+ if has_key(tag, 'signature')
+ let prototype = tag.signature[1:-2]
+ else
+ let prototype = matchstr(tag.cmd,
+ \ 'function\s\+&\?[^[:space:]]\+\s*(\s*\zs.\{-}\ze\s*)\s*{\?')
+ endif
+ let ext_functions[item.'('] = prototype.') - '.tag['filename']
+ endif
+ endfor
+
+ " All functions to one hash for later reference when deciding kind
+ call extend(int_functions, ext_functions)
+
+ let all_values = {}
+ call extend(all_values, int_functions)
+ call extend(all_values, int_vars) " external variables are already in
+ call extend(all_values, g:php_builtin_object_functions)
+
+ for m in sort(keys(all_values))
+ if m =~ '\(^\|::\)'.a:base
+ call add(res, m)
+ endif
+ endfor
+
+ let start_list = res
+
+ let final_list = []
+ for i in start_list
+ if has_key(int_vars, i)
+ let class = ' '
+ if all_values[i] != ''
+ let class = i.' class '
+ endif
+ let final_list += [{'word':i, 'info':class.all_values[i], 'kind':'v'}]
+ else
+ let final_list +=
+ \ [{'word':substitute(i, '.*::', '', ''),
+ \ 'info':i.all_values[i],
+ \ 'menu':all_values[i],
+ \ 'kind':'f'}]
+ endif
+ endfor
+ return final_list
+endfunction
+" }}}
+
+function! phpcomplete#CompleteVariable(base) " {{{
+ let res = []
+
+ " Internal solution for current file.
+ let file = getline(1, '$')
+ let jfile = join(file, ' ')
+ let int_vals = split(jfile, '\ze\$')
+ let int_vars = {}
+ for i in int_vals
+ if i =~? '^\$[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\s*=\s*new'
+ let val = matchstr(i,
+ \ '^\$[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*')
+ else
+ let val = matchstr(i,
+ \ '^\$[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*')
+ endif
+ if val != ''
+ let int_vars[val] = ''
+ endif
+ endfor
+
+ call extend(int_vars, g:php_builtin_vars)
+
+ " ctags has support for PHP, use tags file for external variables
+ if g:phpcomplete_search_tags_for_variables
+ let ext_vars = {}
+ let tags = phpcomplete#GetTaglist('\C^'.substitute(a:base, '^\$', '', ''))
+ for tag in tags
+ if tag.kind ==? 'v'
+ let item = tag.name
+ let m_menu = ''
+ if tag.cmd =~? tag['name'].'\s*=\s*new\s\+'
+ let m_menu = matchstr(tag.cmd,
+ \ '\c=\s*new\s\+\zs[a-zA-Z_0-9\x7f-\xff]\+\ze')
+ endif
+ let ext_vars['$'.item] = m_menu
+ endif
+ endfor
+ call extend(int_vars, ext_vars)
+ endif
+
+ for m in sort(keys(int_vars))
+ if m =~# '^\'.a:base
+ call add(res, m)
+ endif
+ endfor
+
+ let int_list = res
+
+ let int_dict = []
+ for i in int_list
+ if int_vars[i] != ''
+ let class = ' '
+ if int_vars[i] != ''
+ let class = i.' class '
+ endif
+ let int_dict += [{'word':i, 'info':class.int_vars[i], 'menu':int_vars[i], 'kind':'v'}]
+ else
+ let int_dict += [{'word':i, 'kind':'v'}]
+ endif
+ endfor
+
+ return int_dict
+endfunction
+" }}}
+
+function! phpcomplete#CompleteClassName(base, kinds, current_namespace, imports) " {{{
+ let kinds = sort(a:kinds)
+ " Complete class name
+ let res = []
+ if a:base =~? '^\'
+ let leading_slash = '\'
+ let base = substitute(a:base, '^\', '', '')
+ else
+ let leading_slash = ''
+ let base = a:base
+ endif
+
+ " Internal solution for finding classes in current file.
+ let file = getline(1, '$')
+ let filterstr = ''
+
+ 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']
+ let filterstr = 'v:val =~? "interface\\s\\+[a-zA-Z_\\x7f-\\xff][a-zA-Z_0-9\\x7f-\\xff]*\\s*"'
+ endif
+
+ call filter(file, filterstr)
+
+ for line in file
+ let c_name = matchstr(line, '\c\(class\|interface\)\s*\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*')
+ let kind = (line =~? '^\s*class' ? 'c' : 'i')
+ if c_name != '' && c_name =~? '^'.base
+ call add(res, {'word': c_name, 'kind': kind})
+ endif
+ endfor
+
+ " resolve the typed in part with namespaces (if there's a \ in it)
+ let [tag_match_pattern, namespace_for_class] = phpcomplete#ExpandClassName(a:base, a:current_namespace, a:imports)
+
+ let tags = []
+ if len(tag_match_pattern) >= g:phpcomplete_min_num_of_chars_for_namespace_completion
+ let tags = phpcomplete#GetTaglist('^\c'.tag_match_pattern)
+ endif
+
+ if len(tags)
+ let base_parts = split(a:base, '\')
+ if len(base_parts) > 1
+ let namespace_part = join(base_parts[0:-2], '\').'\'
+ else
+ let namespace_part = ''
+ endif
+ let no_namespace_matches = []
+ let namespaced_matches = []
+ let seen_namespaced_tag = 0
+ for tag in tags
+ if has_key(tag, 'namespace')
+ let seen_namespaced_tag = 1
+ endif
+ let relative_name = namespace_part.tag.name
+ " match base without the namespace part for namespaced base but not namespaced tags, for tagfiles with old ctags
+ if !has_key(tag, 'namespace') && index(kinds, tag.kind) != -1 && stridx(tolower(tag.name), tolower(base[len(namespace_part):])) == 0
+ call add(no_namespace_matches, {'word': leading_slash.relative_name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename })
+ endif
+ if has_key(tag, 'namespace') && index(kinds, tag.kind) != -1 && tag.namespace ==? namespace_for_class
+ let full_name = tag.namespace.'\'.tag.name " absolute namespaced name (without leading '\')
+ call add(namespaced_matches, {'word': leading_slash == '\' ? leading_slash.full_name : relative_name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename })
+ endif
+ endfor
+ " if there was a tag with namespace field, assume tag files with namespace support, so the matches
+ " without a namespace field are in the global namespace so if there were namespace in the base
+ " we should not add them to the matches
+ if seen_namespaced_tag && namespace_part != ''
+ let no_namespace_matches = []
+ endif
+ let res += no_namespace_matches + namespaced_matches
+ endif
+
+ " look for built in classnames and interfaces
+ let base_parts = split(base, '\')
+ if a:current_namespace == '\' || (leading_slash == '\' && len(base_parts) < 2)
+ if index(kinds, 'c') != -1
+ let builtin_classnames = filter(keys(copy(g:php_builtin_classnames)), 'v:val =~? "^'.substitute(a:base, '\\', '', 'g').'"')
+ for classname in builtin_classnames
+ let menu = ''
+ " if we have a constructor for this class, add parameters as to the info
+ if has_key(g:php_builtin_classes[tolower(classname)].methods, '__construct')
+ let menu = g:php_builtin_classes[tolower(classname)]['methods']['__construct']['signature']
+ endif
+ call add(res, {'word': leading_slash.g:php_builtin_classes[tolower(classname)].name, 'kind': 'c', 'menu': menu})
+ endfor
+ endif
+
+ if index(kinds, 'i') != -1
+ let builtin_interfaces = filter(keys(copy(g:php_builtin_interfaces)), 'v:val =~? "^'.substitute(a:base, '\\', '', 'g').'"')
+ for interfacename in builtin_interfaces
+ call add(res, {'word': leading_slash.g:php_builtin_interfaces[interfacename]['name'], 'kind': 'i', 'menu': ''})
+ endfor
+ endif
+ endif
+
+ " add matching imported things
+ for [imported_name, import] in items(a:imports)
+ if imported_name =~? '^'.base && index(kinds, import.kind) != -1
+ let menu = import.name.(import.builtin ? ' - builtin' : '')
+ call add(res, {'word': imported_name, 'kind': import.kind, 'menu': menu})
+ endif
+ endfor
+
+ let res = sort(res, 'phpcomplete#CompareCompletionRow')
+ return res
+endfunction
+" }}}
+
+function! phpcomplete#CompareCompletionRow(i1, i2) " {{{
+ return a:i1.word == a:i2.word ? 0 : a:i1.word > a:i2.word ? 1 : -1
+endfunction
+" }}}
+
+function! s:getNextCharWithPos(filelines, current_pos) " {{{
+ let line_no = a:current_pos[0]
+ let col_no = a:current_pos[1]
+ let last_line = a:filelines[len(a:filelines) - 1]
+ let end_pos = [len(a:filelines) - 1, strlen(last_line) - 1]
+ if line_no > end_pos[0] || line_no == end_pos[0] && col_no > end_pos[1]
+ return ['EOF', 'EOF']
+ endif
+
+ " we've not reached the end of the current line break
+ if col_no + 1 < strlen(a:filelines[line_no])
+ let col_no += 1
+ else
+ " we've reached the end of the current line, jump to the next
+ " non-blank line (blank lines have no position where we can read from,
+ " not even a whitespace. The newline char does not positionable by vim
+ let line_no += 1
+ while strlen(a:filelines[line_no]) == 0
+ let line_no += 1
+ endwhile
+
+ let col_no = 0
+ endif
+
+ " return 'EOF' string to signal end of file, normal results only one char
+ " in length
+ if line_no == end_pos[0] && col_no > end_pos[1]
+ return ['EOF', 'EOF']
+ endif
+
+ return [[line_no, col_no], a:filelines[line_no][col_no]]
+endfunction " }}}
+
+function! phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) " {{{
+ " if there's no modifier, and no modifier is allowed and no modifier is required
+ if len(a:modifiers) == 0 && len(a:required_modifiers) == 0
+ return 1
+ else
+ " check if every required modifier is present
+ for required_modifier in a:required_modifiers
+ if index(a:modifiers, required_modifier) == -1
+ return 0
+ endif
+ endfor
+
+ for modifier in a:modifiers
+ " if the modifier is prohibited it's a no match
+ if index(a:prohibited_modifiers, modifier) != -1
+ return 0
+ endif
+ endfor
+
+ " anything that is not explicitly required or prohibited is allowed
+ return 1
+ endif
+endfunction
+" }}}
+
+function! phpcomplete#CompleteUserClass(context, base, sccontent, visibility) " {{{
+ let final_list = []
+ let res = []
+
+ let required_modifiers = []
+ let prohibited_modifiers = []
+
+ if a:visibility == 'public'
+ let prohibited_modifiers += ['private', 'protected']
+ endif
+
+ " limit based on context to static or normal methods
+ let static_con = ''
+ if a:context =~ '::$' && a:context !~? 'parent::$'
+ if g:phpcomplete_relax_static_constraint != 1
+ let required_modifiers += ['static']
+ endif
+ elseif a:context =~ '->$'
+ let prohibited_modifiers += ['static']
+ endif
+
+ let all_function = filter(deepcopy(a:sccontent),
+ \ 'v:val =~ "^\\s*\\(public\\s\\+\\|protected\\s\\+\\|private\\s\\+\\|final\\s\\+\\|abstract\\s\\+\\|static\\s\\+\\)*function"')
+
+ let functions = []
+ for i in all_function
+ let modifiers = split(matchstr(tolower(i), '\zs.\+\zefunction'), '\s\+')
+ if phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) == 1
+ call add(functions, i)
+ endif
+ endfor
+
+ let c_functions = {}
+ let c_doc = {}
+ for i in functions
+ let f_name = matchstr(i,
+ \ 'function\s*&\?\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze')
+ let f_args = matchstr(i,
+ \ 'function\s*&\?[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\s*(\zs.\{-}\ze)\_s*\(;\|{\|\_$\)')
+ if f_name != '' && stridx(f_name, '__') != 0
+ let c_functions[f_name.'('] = f_args
+ if g:phpcomplete_parse_docblock_comments
+ let c_doc[f_name.'('] = phpcomplete#GetDocBlock(a:sccontent, 'function\s*&\?\<'.f_name.'\>')
+ endif
+ endif
+ endfor
+
+ " limit based on context to static or normal attributes
+ if a:context =~ '::$' && a:context !~? 'parent::$'
+ " variables must have static to be accessed as static unlike functions
+ 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\\+\\)\\+\\$\\|^\\s*\\(\\/\\|\\*\\)*\\s*@property\\s\\+\\S\\+\\s\\S\\{-}\\s*$\\)"')
+
+ let variables = []
+ for i in all_variable
+ let modifiers = split(matchstr(tolower(i), '\zs.\+\ze\$'), '\s\+')
+ if phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) == 1
+ call add(variables, i)
+ endif
+ endfor
+
+ let static_vars = split(join(variables, ' '), '\$')
+ let c_variables = {}
+
+ let var_index = 0
+ for i in static_vars
+ let c_var = matchstr(i,
+ \ '^\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze')
+ if c_var != ''
+ if a:context =~ '::$'
+ let c_var = '$'.c_var
+ endif
+ let c_variables[c_var] = ''
+ if g:phpcomplete_parse_docblock_comments && len(get(variables, var_index, '')) > 0
+ let c_doc[c_var] = phpcomplete#GetDocBlock(a:sccontent, variables[var_index])
+ endif
+ let var_index += 1
+ endif
+ endfor
+
+ let constants = filter(deepcopy(a:sccontent),
+ \ 'v:val =~ "^\\s*const\\s\\+"')
+
+ let jcons = join(constants, ' ')
+ let scons = split(jcons, 'const')
+
+ let c_constants = {}
+ let const_index = 0
+ for i in scons
+ let c_con = matchstr(i,
+ \ '^\s*\zs[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*\ze')
+ if c_con != ''
+ let c_constants[c_con] = ''
+ if g:phpcomplete_parse_docblock_comments && len(get(constants, const_index)) > 0
+ let c_doc[c_con] = phpcomplete#GetDocBlock(a:sccontent, constants[const_index])
+ endif
+ let const_index += 1
+ endif
+ endfor
+
+ let all_values = {}
+ call extend(all_values, c_functions)
+ call extend(all_values, c_variables)
+ call extend(all_values, c_constants)
+
+ for m in sort(keys(all_values))
+ if stridx(m, a:base) == 0
+ call add(res, m)
+ endif
+ endfor
+
+ let start_list = res
+
+ let final_list = []
+ for i in start_list
+ let docblock = phpcomplete#ParseDocBlock(get(c_doc, i, ''))
+ if has_key(c_variables, i)
+ let final_list +=
+ \ [{'word': i,
+ \ 'info':phpcomplete#FormatDocBlock(docblock),
+ \ 'menu':get(docblock.var, 'type', ''),
+ \ 'kind':'v'}]
+ elseif has_key(c_constants, i)
+ let info = phpcomplete#FormatDocBlock(docblock)
+ if info != ''
+ let info = "\n".info
+ endif
+ let final_list +=
+ \ [{'word':i,
+ \ 'info':i.info,
+ \ 'menu':all_values[i],
+ \ 'kind':'d'}]
+ else
+ let return_type = get(docblock.return, 'type', '')
+ if return_type != ''
+ let return_type = ' | '.return_type
+ endif
+ let info = phpcomplete#FormatDocBlock(docblock)
+ if info != ''
+ let info = "\n".info
+ endif
+ let final_list +=
+ \ [{'word':substitute(i, '.*::', '', ''),
+ \ 'info':i.all_values[i].')'.info,
+ \ 'menu':all_values[i].')'.return_type,
+ \ 'kind':'f'}]
+ endif
+ endfor
+
+ return final_list
+endfunction
+" }}}
+
+function! phpcomplete#CompleteBuiltInClass(context, classname, base) " {{{
+ let class_info = g:php_builtin_classes[tolower(a:classname)]
+ let res = []
+ if a:context =~ '->$' " complete for everything instance related
+ " methods
+ for [method_name, method_info] in items(class_info.methods)
+ if stridx(method_name, '__') != 0 && (a:base == '' || method_name =~? '^'.a:base)
+ call add(res, {'word':method_name.'(', 'kind': 'f', 'menu': method_info.signature, 'info': method_info.signature })
+ endif
+ endfor
+ " properties
+ for [property_name, property_info] in items(class_info.properties)
+ if a:base == '' || property_name =~? '^'.a:base
+ call add(res, {'word':property_name, 'kind': 'v', 'menu': property_info.type, 'info': property_info.type })
+ endif
+ endfor
+ elseif a:context =~ '::$' " complete for everything static
+ " methods
+ for [method_name, method_info] in items(class_info.static_methods)
+ if a:base == '' || method_name =~? '^'.a:base
+ call add(res, {'word':method_name.'(', 'kind': 'f', 'menu': method_info.signature, 'info': method_info.signature })
+ endif
+ endfor
+ " properties
+ for [property_name, property_info] in items(class_info.static_properties)
+ if a:base == '' || property_name =~? '^'.a:base
+ call add(res, {'word':property_name, 'kind': 'v', 'menu': property_info.type, 'info': property_info.type })
+ endif
+ endfor
+ " constants
+ for [constant_name, constant_info] in items(class_info.constants)
+ if a:base == '' || constant_name =~? '^'.a:base
+ call add(res, {'word':constant_name, 'kind': 'd', 'menu': constant_info, 'info': constant_info})
+ endif
+ endfor
+ endif
+ return res
+endfunction
+" }}}
+
+function! phpcomplete#GetTaglist(pattern) " {{{
+ let cache_checksum = ''
+ if g:phpcomplete_cache_taglists == 1
+ " build a string with format of "<tagfile>:<mtime>$<tagfile2>:<mtime2>..."
+ " to validate that the tags are not changed since the time we saved the results in cache
+ for tagfile in sort(tagfiles())
+ let cache_checksum .= fnamemodify(tagfile, ':p').':'.getftime(tagfile).'$'
+ endfor
+
+ if s:cache_tags_checksum != cache_checksum
+ " tag file(s) changed
+ " since we don't know where individual tags coming from when calling taglist() we zap the whole cache
+ " no way to clear only the entries originating from the changed tag file
+ let s:cache_tags = {}
+ endif
+
+ if has_key(s:cache_tags, a:pattern)
+ return s:cache_tags[a:pattern]
+ endif
+ 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
+ return tags
+endfunction
+" }}}
+
+function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) " {{{
+ " locate the current instruction (up until the previous non comment or string ";" or php region start (<?php or <?) without newlines
+ let col_number = a:col_number
+ let line_number = a:line_number
+ let line = getline(a:line_number)
+ let current_char = -1
+ let instruction = ''
+ let parent_depth = 0
+ let bracket_depth = 0
+ let stop_chars = [
+ \ '!', '@', '%', '^', '&',
+ \ '*', '/', '-', '+', '=',
+ \ ':', '>', '<', '.', '?',
+ \ ';', '(', '|', '['
+ \ ]
+
+ let phpbegin_length = len(matchstr(getline(a:phpbegin[0]), '\zs<?\(php\)\?\ze'))
+ let phpbegin_end = [a:phpbegin[0], a:phpbegin[1] - 1 + phpbegin_length]
+
+ " will hold the first place where a coma could have ended the match
+ let first_coma_break_pos = -1
+ let next_char = len(line) < col_number ? line[col_number + 1] : ''
+
+ while !(line_number == 1 && col_number == 1)
+ if current_char != -1
+ let next_char = current_char
+ endif
+
+ let current_char = line[col_number]
+ let synIDName = synIDattr(synID(line_number, col_number + 1, 0), 'name')
+
+ if col_number - 1 == -1
+ let prev_line_number = line_number - 1
+ let prev_line = getline(line_number - 1)
+ let prev_col_number = strlen(prev_line)
+ else
+ let prev_line_number = line_number
+ let prev_col_number = col_number - 1
+ let prev_line = line
+ endif
+ let prev_char = prev_line[prev_col_number]
+
+ " skip comments
+ if synIDName =~? 'comment\|phpDocTags'
+ let current_char = ''
+ endif
+
+ " break on the last char of the "and" and "or" operators
+ if synIDName == 'phpOperator' && (current_char == 'r' || current_char == 'd')
+ break
+ endif
+
+ " break on statements as "return" or "throws"
+ if synIDName == 'phpStatement' || synIDName == 'phpException'
+ break
+ endif
+
+ " if the current char should be considered
+ if current_char != '' && parent_depth >= 0 && bracket_depth >= 0 && synIDName !~? 'comment\|string'
+ " break if we are on a "naked" stop_char (operators, colon, openparent...)
+ if index(stop_chars, current_char) != -1
+ let do_break = 1
+ " dont break if it does look like a "->"
+ if (prev_char == '-' && current_char == '>') || (current_char == '-' && next_char == '>')
+ let do_break = 0
+ endif
+ " dont break if it does look like a "::"
+ if (prev_char == ':' && current_char == ':') || (current_char == ':' && next_char == ':')
+ let do_break = 0
+ endif
+
+ if do_break
+ break
+ endif
+ endif
+
+ " save the coma position for later use if there's a "naked" , possibly separating a parameter and it is not in a parented part
+ if first_coma_break_pos == -1 && current_char == ','
+ let first_coma_break_pos = len(instruction)
+ endif
+ endif
+
+ " count nested darenthesis and brackets so we can tell if we need to break on a ';' or not (think of for (;;) loops)
+ if synIDName =~? 'phpBraceFunc\|phpParent\|Delimiter'
+ if current_char == '('
+ let parent_depth += 1
+ elseif current_char == ')'
+ let parent_depth -= 1
+
+ elseif current_char == '['
+ let bracket_depth += 1
+ elseif current_char == ']'
+ let bracket_depth -= 1
+ endif
+ endif
+
+ " stop collecting chars if we see a function start { (think of first line in a function)
+ if (current_char == '{' || current_char == '}') && synIDName =~? 'phpBraceFunc\|phpParent\|Delimiter'
+ break
+ endif
+
+ " break if we are reached the php block start (<?php or <?)
+ if [line_number, col_number] == phpbegin_end
+ break
+ endif
+
+ let instruction = current_char.instruction
+
+ " step a char or a line back if we are on the first column of the line already
+ let col_number -= 1
+ if col_number == -1
+ let line_number -= 1
+ let line = getline(line_number)
+ let col_number = strlen(line)
+ endif
+ endwhile
+
+ " strip leading whitespace
+ let instruction = substitute(instruction, '^\s\+', '', '')
+
+ " there were a "naked" coma in the instruction
+ if first_coma_break_pos != -1
+ if instruction !~? '^use' && instruction !~? '^class' " use ... statements and class declarations should not be broken up by comas
+ let pos = (-1 * first_coma_break_pos) + 1
+ let instruction = instruction[pos :]
+ endif
+ endif
+
+ " HACK to remove one line conditionals from code like "if ($foo) echo 'bar'"
+ " what the plugin really need is a proper php tokenizer
+ if instruction =~? '\c^\(if\|while\|foreach\|for\)\s*('
+ " clear everything up until the first (
+ let instruction = substitute(instruction, '^\(if\|while\|foreach\|for\)\s*(\s*', '', '')
+
+ " lets iterate through the instruction until we can find the pair for the opening (
+ let i = 0
+ let depth = 1
+ while i < len(instruction)
+ if instruction[i] == '('
+ let depth += 1
+ endif
+ if instruction[i] == ')'
+ let depth -= 1
+ endif
+ if depth == 0
+ break
+ end
+ let i += 1
+ endwhile
+ let instruction = instruction[i + 1 : len(instruction)]
+ endif
+
+ " trim whitespace from the ends
+ let instruction = substitute(instruction, '\v^(^\s+)|(\s+)$', '', 'g')
+
+ return instruction
+endfunction " }}}
+
+function! phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, imports, methodstack) " {{{
+ " Tries to get the classname and namespace for a chained method call like:
+ " $this->foo()->bar()->baz()->
+
+ let classname_candidate = a:classname_candidate
+ let class_candidate_namespace = a:class_candidate_namespace
+ let methodstack = a:methodstack
+ let unknown_result = ['', '']
+ let prev_method_is_array = (methodstack[0] =~ '\v^[^([]+\[' ? 1 : 0)
+ let classname_candidate_is_array = (classname_candidate =~ '\[\]$' ? 1 : 0)
+
+ if prev_method_is_array
+ if classname_candidate_is_array
+ let classname_candidate = substitute(classname_candidate, '\[\]$', '', '')
+ else
+ return unknown_result
+ endif
+ endif
+
+ if (len(methodstack) == 1)
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, a:imports)
+ return [classname_candidate, class_candidate_namespace]
+ else
+ call remove(methodstack, 0)
+ let method_is_array = (methodstack[0] =~ '\v^[^[]+\[' ? 1 : 0)
+ let method = matchstr(methodstack[0], '\v^\$*\zs[^[(]+\ze')
+
+ let classlocation = phpcomplete#GetClassLocation(classname_candidate, class_candidate_namespace)
+
+ if classlocation == 'VIMPHP_BUILTINOBJECT' && has_key(g:php_builtin_classes, tolower(classname_candidate))
+ let class_info = g:php_builtin_classes[tolower(classname_candidate)]
+ if has_key(class_info['methods'], method)
+ return phpcomplete#GetCallChainReturnType(class_info['methods'][method].return_type, '\', a:imports, methodstack)
+ endif
+ if has_key(class_info['properties'], method)
+ return phpcomplete#GetCallChainReturnType(class_info['properties'][method].type, '\', a:imports, methodstack)
+ endif
+ if has_key(class_info['static_methods'], method)
+ return phpcomplete#GetCallChainReturnType(class_info['static_methods'][method].return_type, '\', a:imports, methodstack)
+ endif
+ if has_key(class_info['static_properties'], method)
+ return phpcomplete#GetCallChainReturnType(class_info['static_properties'][method].type, '\', a:imports, methodstack)
+ endif
+
+ return unknown_result
+
+ elseif classlocation != '' && filereadable(classlocation)
+ " Read the next method from the stack and extract only the name
+
+ let classcontents = phpcomplete#GetCachedClassContents(classlocation, classname_candidate)
+
+ " 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.'\>\|@property.\+\$'.method.'\>'
+ let doc_str = phpcomplete#GetDocBlock(split(classstructure.content, '\n'), docblock_target_pattern)
+ 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 != '' || return_type_hint != ''
+ let docblock = phpcomplete#ParseDocBlock(doc_str)
+ 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 =~ '\\'
+ let parts = split(substitute(type, '^\\', '', ''), '\')
+ let class_candidate_namespace = join(parts[0:-2], '\')
+ let classname_candidate = parts[-1]
+ " check for renamed namespace in imports
+ if has_key(classstructure.imports, class_candidate_namespace)
+ let class_candidate_namespace = classstructure.imports[class_candidate_namespace].name
+ endif
+ else
+ " no namespace in the type, threat it as a relative classname
+ let returnclass = type
+ if has_key(classstructure.imports, returnclass)
+ if has_key(classstructure.imports[returnclass], 'namespace')
+ let fullnamespace = classstructure.imports[returnclass].namespace
+ else
+ let fullnamespace = class_candidate_namespace
+ endif
+ else
+ let fullnamespace = class_candidate_namespace
+ endif
+ " make @return self, static, $this the same way
+ " (not exactly what php means by these)
+ if returnclass == 'self' || returnclass == 'static' || returnclass == '$this' || returnclass == 'self[]' || returnclass == 'static[]' || returnclass == '$this[]'
+ if returnclass =~ '\[\]$'
+ let classname_candidate = a:classname_candidate.'[]'
+ else
+ let classname_candidate = a:classname_candidate
+ endif
+ let class_candidate_namespace = a:class_candidate_namespace
+ else
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(returnclass, fullnamespace, a:imports)
+ endif
+ endif
+
+ return phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, a:imports, methodstack)
+ endif
+ endif
+
+ return unknown_result
+ else
+ return unknown_result
+ endif
+ endif
+endfunction " }}}
+
+function! phpcomplete#GetMethodStack(line) " {{{
+ let methodstack = []
+ let i = 0
+ let end = len(a:line)
+
+ let current_part = ''
+
+ let parent_depth = 0
+ let in_string = 0
+ let string_start = ''
+
+ let next_char = ''
+
+ while i < end
+ let current_char = a:line[i]
+ let next_char = i + 1 < end ? a:line[i + 1] : ''
+ let prev_char = i >= 1 ? a:line[i - 1] : ''
+ let prev_prev_char = i >= 2 ? a:line[i - 2] : ''
+
+ if in_string == 0 && parent_depth == 0 && ((current_char == '-' && next_char == '>') || (current_char == ':' && next_char == ':'))
+ call add(methodstack, current_part)
+ let current_part = ''
+ let i += 2
+ continue
+ endif
+
+ " if it looks like a string
+ if current_char == "'" || current_char == '"'
+ " and it is not escaped
+ if prev_char != '\' || (prev_char == '\' && prev_prev_char == '\')
+ " and we are in a string already
+ if in_string
+ " and that string started with this char too
+ if current_char == string_start
+ " clear the string mark
+ let in_string = 0
+ endif
+ else " ... and we are not in a string
+ " set the string mark
+ let in_string = 1
+ let string_start = current_char
+ endif
+ endif
+ endif
+
+ if !in_string && a:line[i] == '('
+ let parent_depth += 1
+ endif
+ if !in_string && a:line[i] == ')'
+ let parent_depth -= 1
+ endif
+
+ let current_part .= current_char
+ let i += 1
+ endwhile
+
+ " add the last remaining part, this can be an empty string and this is expected
+ " the empty string represents the completion base (which happen to be an empty string)
+ if current_part != ''
+ call add(methodstack, current_part)
+ endif
+
+ return methodstack
+endfunction
+" }}}
+
+function! phpcomplete#GetClassName(start_line, context, current_namespace, imports) " {{{
+ " Get class name
+ " Class name can be detected in few ways:
+ " @var $myVar class
+ " @var class $myVar
+ " in the same line (php 5.4 (new Class)-> syntax)
+ " line above
+ " or line in tags file
+
+ let class_name_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*'
+ let function_name_pattern = '[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*'
+ let function_invocation_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*('
+ let variable_name_pattern = '\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
+
+ let classname_candidate = ''
+ let class_candidate_namespace = a:current_namespace
+ let class_candidate_imports = a:imports
+ let methodstack = phpcomplete#GetMethodStack(a:context)
+
+ if a:context =~? '\$this->' || a:context =~? '\(self\|static\)::' || a:context =~? 'parent::'
+ let i = 1
+ while i < a:start_line
+ let line = getline(a:start_line - i)
+
+ " Don't complete self:: or $this if outside of a class
+ " (assumes correct indenting)
+ if line =~ '^}'
+ return ''
+ endif
+
+ if line =~? '\v^\s*(abstract\s+|final\s+)*\s*class\s'
+ let class_name = matchstr(line, '\cclass\s\+\zs'.class_name_pattern.'\ze')
+ let extended_class = matchstr(line, '\cclass\s\+'.class_name_pattern.'\s\+extends\s\+\zs'.class_name_pattern.'\ze')
+
+ let classname_candidate = a:context =~? 'parent::' ? extended_class : class_name
+ if classname_candidate != ''
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack)
+ " return absolute classname, without leading \
+ return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate
+ endif
+ endif
+
+ let i += 1
+ endwhile
+ elseif a:context =~? '(\s*new\s\+'.class_name_pattern.'\s*)->'
+ let classname_candidate = matchstr(a:context, '\cnew\s\+\zs'.class_name_pattern.'\ze')
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack)
+ " return absolute classname, without leading \
+ return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate
+ 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
+ let return_type = matchstr(g:php_builtin_functions[function_name.'('], '\v\|\s+\zs.+$')
+ let classname_candidate = return_type
+ let class_candidate_namespace = '\'
+ 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)
+ 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, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
+ endif
+ endif
+ if classname_candidate != ''
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack)
+ " return absolute classname, without leading \
+ return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate
+ endif
+ else
+ " extract the variable name from the context
+ let object = methodstack[0]
+ let object_is_array = (object =~ '\v^[^[]+\[' ? 1 : 0)
+ let object = matchstr(object, variable_name_pattern)
+
+ let function_boundary = phpcomplete#GetCurrentFunctionBoundaries()
+ let search_end_line = max([1, function_boundary[0][0]])
+ " -1 makes us ignore the current line (where the completion was invoked
+ let lines = reverse(getline(search_end_line, a:start_line - 1))
+
+ " check Constant lookup
+ let constant_object = matchstr(a:context, '\zs'.class_name_pattern.'\ze::')
+ if constant_object != ''
+ let classname_candidate = constant_object
+ endif
+
+ if classname_candidate == ''
+ " scan the file backwards from current line for explicit type declaration (@var $variable Classname)
+ for line in lines
+ " in file lookup for /* @var $foo Class */
+ if line =~# '@var\s\+'.object.'\s\+'.class_name_pattern
+ let classname_candidate = matchstr(line, '@var\s\+'.object.'\s\+\zs'.class_name_pattern.'\(\[\]\)\?')
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports)
+ break
+ endif
+ " in file lookup for /* @var Class $foo */
+ if line =~# '@var\s\+'.class_name_pattern.'\s\+'.object
+ let classname_candidate = matchstr(line, '@var\s\+\zs'.class_name_pattern.'\(\[\]\)\?\ze'.'\s\+'.object)
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports)
+ break
+ endif
+ endfor
+ endif
+
+ if classname_candidate != ''
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack)
+ " return absolute classname, without leading \
+ return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate
+ endif
+ " scan the file backwards from the current line
+ let i = 1
+ for line in lines " {{{
+ " do in-file lookup of $var = new Class
+ if line =~# '^\s*'.object.'\s*=\s*new\s\+'.class_name_pattern && !object_is_array
+ let classname_candidate = matchstr(line, object.'\c\s*=\s*new\s*\zs'.class_name_pattern.'\ze')
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports)
+ break
+ endif
+
+ " in-file lookup for Class::getInstance()
+ if line =~# '^\s*'.object.'\s*=&\?\s*'.class_name_pattern.'\s*::\s*getInstance' && !object_is_array
+ let classname_candidate = matchstr(line, object.'\s*=&\?\s*\zs'.class_name_pattern.'\ze\s*::\s*getInstance')
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports)
+ break
+ endif
+
+ " do in-file lookup for static method invocation of a built-in class, like: $d = DateTime::createFromFormat()
+ if line =~# '^\s*'.object.'\s*=&\?\s*'.class_name_pattern.'\s*::\s*$\?[a-zA-Z_0-9\x7f-\xff]\+'
+ let classname = matchstr(line, '^\s*'.object.'\s*=&\?\s*\zs'.class_name_pattern.'\ze\s*::')
+ if has_key(a:imports, classname) && a:imports[classname].kind == 'c'
+ let classname = a:imports[classname].name
+ endif
+ if has_key(g:php_builtin_classes, tolower(classname))
+ let sub_methodstack = phpcomplete#GetMethodStack(matchstr(line, '^\s*'.object.'\s*=&\?\s*\s\+\zs.*'))
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname, '\', {}, sub_methodstack)
+ return classname_candidate
+ else
+ " try to get the class name from the static method's docblock
+ let [classname, namespace_for_class] = phpcomplete#ExpandClassName(classname, a:current_namespace, a:imports)
+ let sub_methodstack = phpcomplete#GetMethodStack(matchstr(line, '^\s*'.object.'\s*=&\?\s*\s\+\zs.*'))
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(
+ \ classname,
+ \ namespace_for_class,
+ \ a:imports,
+ \ sub_methodstack)
+
+ return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate
+ endif
+ endif
+
+ " function declaration line
+ if line =~? 'function\(\s\+'.function_name_pattern.'\)\?\s*('
+ let function_lines = join(reverse(copy(lines)), " ")
+ " search for type hinted arguments
+ if function_lines =~? 'function\(\s\+'.function_name_pattern.'\)\?\s*(.\{-}'.class_name_pattern.'\s\+'.object && !object_is_array
+ let f_args = matchstr(function_lines, '\cfunction\(\s\+'.function_name_pattern.'\)\?\s*(\zs.\{-}\ze)')
+ let args = split(f_args, '\s*\zs,\ze\s*')
+ for arg in args
+ if arg =~# object.'\(,\|$\)'
+ let classname_candidate = matchstr(arg, '\s*\zs'.class_name_pattern.'\ze\s\+'.object)
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports)
+ break
+ endif
+ endfor
+ if classname_candidate != ''
+ break
+ endif
+ endif
+
+ " search for docblock for the function
+ let match_line = substitute(line, '\\', '\\\\', 'g')
+ let sccontent = getline(0, a:start_line - i)
+ let doc_str = phpcomplete#GetDocBlock(sccontent, match_line)
+ if doc_str != ''
+ let docblock = phpcomplete#ParseDocBlock(doc_str)
+ for param in docblock.params
+ if param.name =~? object
+ let classname_candidate = matchstr(param.type, class_name_pattern.'\(\[\]\)\?')
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, a:current_namespace, a:imports)
+ break
+ endif
+ endfor
+ if classname_candidate != ''
+ break
+ endif
+ endif
+ endif
+
+ " assignment for the variable in question with a variable on the right hand side
+ if line =~# '^\s*'.object.'\s*=&\?\s\+\(clone\)\?\s*'.variable_name_pattern
+
+ " try to find the next non-comment or string ";" char
+ let start_col = match(line, '^\s*'.object.'\C\s*=\zs&\?\s\+\(clone\)\?\s*'.variable_name_pattern)
+ let filelines = reverse(copy(lines))
+ let [pos, char] = s:getNextCharWithPos(filelines, [len(filelines) - i, start_col])
+ let chars_read = 1
+ let last_pos = pos
+ " function_boundary == 0 if we are not in a function
+ let real_lines_offset = len(function_boundary) == 1 ? 1 : function_boundary[0][0]
+ " read while end of the file
+ while char != 'EOF' && chars_read < 1000
+ let last_pos = pos
+ let [pos, char] = s:getNextCharWithPos(filelines, pos)
+ let chars_read += 1
+ " we got a candidate
+ if char == ';'
+ " pos values is relative to the function's lines,
+ " line 0 need to be offsetted with the line number
+ " where te function was started to get the line number
+ " in real buffer terms
+ let synIDName = synIDattr(synID(real_lines_offset + pos[0], pos[1] + 1, 0), 'name')
+ " it's not a comment or string, end search
+ if synIDName !~? 'comment\|string'
+ break
+ endif
+ endif
+ endwhile
+
+ let prev_context = phpcomplete#GetCurrentInstruction(real_lines_offset + last_pos[0], last_pos[1], b:phpbegin)
+ if prev_context == ''
+ " cannot get previous context give up
+ return
+ endif
+ let prev_class = phpcomplete#GetClassName(a:start_line - i, prev_context, a:current_namespace, a:imports)
+
+ if stridx(prev_class, '\') != -1
+ let classname_parts = split(prev_class, '\\\+')
+ let classname_candidate = classname_parts[-1]
+ let class_candidate_namespace = join(classname_parts[0:-2], '\')
+ else
+ let classname_candidate = prev_class
+ let class_candidate_namespace = '\'
+ endif
+ break
+ endif
+
+ " assignment for the variable in question with a function on the right hand side
+ if line =~# '^\s*'.object.'\s*=&\?\s*'.function_invocation_pattern
+ " try to find the next non-comment or string ";" char
+ let start_col = match(line, '\C^\s*'.object.'\s*=\zs&\?\s*'.function_invocation_pattern)
+ let filelines = reverse(copy(lines))
+ let [pos, char] = s:getNextCharWithPos(filelines, [len(filelines) - i, start_col])
+ let chars_read = 1
+ let last_pos = pos
+ " function_boundary == 0 if we are not in a function
+ let real_lines_offset = len(function_boundary) == 1 ? 1 : function_boundary[0][0]
+ " read while end of the file
+ while char != 'EOF' && chars_read < 1000
+ let last_pos = pos
+ let [pos, char] = s:getNextCharWithPos(filelines, pos)
+ let chars_read += 1
+ " we got a candidate
+ if char == ';'
+ " pos values is relative to the function's lines,
+ " line 0 need to be offsetted with the line number
+ " where te function was started to get the line number
+ " in real buffer terms
+ let synIDName = synIDattr(synID(real_lines_offset + pos[0], pos[1] + 1, 0), 'name')
+ " it's not a comment or string, end search
+ if synIDName !~? 'comment\|string'
+ break
+ endif
+ endif
+ endwhile
+
+ let prev_context = phpcomplete#GetCurrentInstruction(real_lines_offset + last_pos[0], last_pos[1], b:phpbegin)
+ if prev_context == ''
+ " cannot get previous context give up
+ return
+ endif
+
+ let function_name = matchstr(prev_context, '^'.function_invocation_pattern.'\ze')
+ let function_name = matchstr(function_name, '^\zs.\+\ze\s*($') " strip the trailing (
+ 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
+ let return_type = matchstr(g:php_builtin_functions[function_name.'('], '\v\|\s+\zs.+$')
+ let classname_candidate = return_type
+ let class_candidate_namespace = '\'
+ break
+ 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)
+ 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, class_candidate_namespace] = phpcomplete#ExpandClassName(classname_candidate, class_candidate_namespace, function_imports)
+ break
+ endif
+ endif
+ endif
+
+ " foreach with the variable in question
+ if line =~? 'foreach\s*(.\{-}\s\+'.object.'\s*)'
+ let sub_context = matchstr(line, 'foreach\s*(\s*\zs.\{-}\ze\s\+as')
+ let prev_class = phpcomplete#GetClassName(a:start_line - i, sub_context, a:current_namespace, a:imports)
+
+ " the iterated expression should return an array type
+ if prev_class =~ '\[\]$'
+ let prev_class = matchstr(prev_class, '\v^[^[]+')
+ else
+ return
+ endif
+
+ if stridx(prev_class, '\') != -1
+ let classname_parts = split(prev_class, '\\\+')
+ let classname_candidate = classname_parts[-1]
+ let class_candidate_namespace = join(classname_parts[0:-2], '\')
+ else
+ let classname_candidate = prev_class
+ let class_candidate_namespace = '\'
+ endif
+ break
+ endif
+
+ " catch clause with the variable in question
+ if line =~? 'catch\s*(\zs'.class_name_pattern.'\ze\s\+'.object
+ let classname = matchstr(line, 'catch\s*(\zs'.class_name_pattern.'\ze\s\+'.object)
+ if stridx(classname, '\') != -1
+ let classname_parts = split(classname, '\\\+')
+ let classname_candidate = classname_parts[-1]
+ let class_candidate_namespace = join(classname_parts[0:-2], '\')
+ else
+ let classname_candidate = classname
+ let class_candidate_namespace = '\'
+ endif
+ break
+ endif
+
+ let i += 1
+ endfor " }}}
+
+ if classname_candidate != ''
+ let [classname_candidate, class_candidate_namespace] = phpcomplete#GetCallChainReturnType(classname_candidate, class_candidate_namespace, class_candidate_imports, methodstack)
+ " return absolute classname, without leading \
+ return (class_candidate_namespace == '\' || class_candidate_namespace == '') ? classname_candidate : class_candidate_namespace.'\'.classname_candidate
+ endif
+
+ " OK, first way failed, now check tags file(s)
+ " This method is useless when local variables are not indexed by ctags and
+ " pretty inaccurate even if it is
+ if g:phpcomplete_search_tags_for_variables
+ let tags = phpcomplete#GetTaglist('^'.substitute(object, '^\$', '', ''))
+ if len(tags) == 0
+ return
+ else
+ 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
+ endif
+ endif
+ endif
+endfunction
+" }}}
+
+function! phpcomplete#GetClassLocation(classname, namespace) " {{{
+ " Check classname may be name of built in object
+ if has_key(g:php_builtin_classes, tolower(a:classname)) && (a:namespace == '' || a:namespace == '\')
+ return 'VIMPHP_BUILTINOBJECT'
+ endif
+ if has_key(g:php_builtin_interfaces, tolower(a:classname)) && (a:namespace == '' || a:namespace == '\')
+ return 'VIMPHP_BUILTINOBJECT'
+ endif
+
+ if a:namespace == '' || a:namespace == '\'
+ let search_namespace = '\'
+ else
+ let search_namespace = tolower(a:namespace)
+ endif
+ let [current_namespace, imports] = phpcomplete#GetCurrentNameSpace(getline(0, line('.')))
+
+ " do in-file lookup for class definition
+ let i = 1
+ while i < line('.')
+ let line = getline(line('.')-i)
+ if line =~? '^\s*\(abstract\s\+\|final\s\+\)*\s*\(class\|interface\|trait\)\s*'.a:classname.'\(\s\+\|$\|{\)' && tolower(current_namespace) == search_namespace
+ return expand('%:p')
+ else
+ let i += 1
+ continue
+ endif
+ endwhile
+
+ " Get class location from tags
+ let no_namespace_candidate = ''
+ let tags = phpcomplete#GetTaglist('^'.a:classname.'$')
+ for tag in tags
+ " We'll allow interfaces and traits to be handled classes since you
+ " can't have colliding names with different kinds anyway
+ if tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't'
+ if !has_key(tag, 'namespace')
+ let no_namespace_candidate = tag.filename
+ else
+ if search_namespace == tolower(tag.namespace)
+ return tag.filename
+ endif
+ endif
+ endif
+ endfor
+ if no_namespace_candidate != ''
+ return no_namespace_candidate
+ endif
+
+ return ''
+endfunction
+" }}}
+
+function! phpcomplete#GetFunctionLocation(function_name, namespace) " {{{
+ " builtin functions doesn't need explicit \ in front of them even in namespaces,
+ " aliased built-in function names are not handled
+ if has_key(g:php_builtin_functions, a:function_name.'(')
+ return 'VIMPHP_BUILTINFUNCTION'
+ endif
+
+
+ " do in-file lookup for function definition
+ let i = 1
+ let buffer_lines = getline(1, line('$'))
+ for line in buffer_lines
+ if line =~? '^\s*function\s\+&\?'.a:function_name.'\s*('
+ return expand('%:p')
+ endif
+ endfor
+
+
+ if a:namespace == '' || a:namespace == '\'
+ let search_namespace = '\'
+ else
+ let search_namespace = tolower(a:namespace)
+ endif
+ let no_namespace_candidate = ''
+ let tags = phpcomplete#GetTaglist('\c^'.a:function_name.'$')
+
+ for tag in tags
+ if tag.kind == 'f'
+ if !has_key(tag, 'namespace')
+ let no_namespace_candidate = tag.filename
+ else
+ if search_namespace == tolower(tag.namespace)
+ return tag.filename
+ endif
+ endif
+ endif
+ endfor
+ if no_namespace_candidate != ''
+ return no_namespace_candidate
+ endif
+
+ return ''
+endfunction
+" }}}
+
+function! phpcomplete#GetCachedClassContents(classlocation, class_name) " {{{
+ let full_file_path = fnamemodify(a:classlocation, ':p')
+ let cache_key = full_file_path.'#'.a:class_name.'#'.getftime(full_file_path)
+
+ " try to read from the cache first
+ if has_key(s:cache_classstructures, cache_key)
+ let classcontents = s:cache_classstructures[cache_key]
+ " cached class contents can contain content from multiple files (superclasses) so we have to
+ " validate cached result's validness by the filemtimes used to create the cached value
+ let valid = 1
+ for classstructure in classcontents
+ if getftime(classstructure.file) != classstructure.mtime
+ let valid = 0
+ " we could break here, but the time required for checking probably worth
+ " the the memory we can free by checking every file in the cached hierarchy
+ call phpcomplete#ClearCachedClassContents(classstructure.file)
+ endif
+ endfor
+
+ if valid
+ " cache hit, we found an entry for this file + class pair and every
+ " file in the response is also valid
+ return classcontents
+ else
+ " clear the outdated cached value from the cache store
+ call remove(s:cache_classstructures, cache_key)
+ call phpcomplete#ClearCachedClassContents(full_file_path)
+
+ " fall through for the read from files path
+ endif
+ else
+ call phpcomplete#ClearCachedClassContents(full_file_path)
+ endif
+
+ " cache miss, fetch the content from the files itself
+ let classfile = readfile(a:classlocation)
+ let classcontents = phpcomplete#GetClassContentsStructure(full_file_path, classfile, a:class_name)
+ let s:cache_classstructures[cache_key] = classcontents
+
+ return classcontents
+endfunction " }}}
+
+function! phpcomplete#ClearCachedClassContents(full_file_path) " {{{
+ for [cache_key, cached_value] in items(s:cache_classstructures)
+ if stridx(cache_key, a:full_file_path.'#') == 0
+ call remove(s:cache_classstructures, cache_key)
+ endif
+ endfor
+endfunction " }}}
+
+function! phpcomplete#GetClassContentsStructure(file_path, file_lines, class_name) " {{{
+ " returns dictionary containing content, namespace and imports for the class and all parent classes.
+ " Example:
+ " [
+ " {
+ " class: 'foo',
+ " content: '... class foo extends bar ... ',
+ " namespace: 'NS\Foo',
+ " imports : { ... },
+ " file: '/foo.php',
+ " mtime: 42,
+ " },
+ " {
+ " class: 'bar',
+ " content: '... class bar extends baz ... ',
+ " namespace: 'NS\Bar',
+ " imports : { ... }
+ " file: '/bar.php',
+ " mtime: 42,
+ " },
+ " ...
+ " ]
+ "
+ let class_name_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*'
+ let full_file_path = fnamemodify(a:file_path, ':p')
+ let result = []
+ let popup_id = popup_create(a:file_lines, {'hidden': v:true})
+
+ call win_execute(popup_id, 'call search(''\c\(class\|interface\|trait\)\_s\+'.a:class_name.'\(\>\|$\)'')')
+ call win_execute(popup_id, "let cfline = line('.')")
+ call win_execute(popup_id, "call search('{')")
+ call win_execute(popup_id, "let endline = line('.')")
+
+ call win_execute(popup_id, 'let content = join(getline('.cfline.', '.endline.'), "\n")')
+ " Catch extends
+ if content =~? 'extends'
+ let extends_string = matchstr(content, '\(class\|interface\)\_s\+'.a:class_name.'\_.\+extends\_s\+\zs\('.class_name_pattern.'\(,\|\_s\)*\)\+\ze\(extends\|{\)')
+ let extended_classes = map(split(extends_string, '\(,\|\_s\)\+'), 'substitute(v:val, "\\_s\\+", "", "g")')
+ else
+ let extended_classes = ''
+ endif
+
+ " Catch implements
+ if content =~? 'implements'
+ let implements_string = matchstr(content, 'class\_s\+'.a:class_name.'\_.\+implements\_s\+\zs\('.class_name_pattern.'\(,\|\_s\)*\)\+\ze')
+ let implemented_interfaces = map(split(implements_string, '\(,\|\_s\)\+'), 'substitute(v:val, "\\_s\\+", "", "g")')
+ else
+ let implemented_interfaces = []
+ endif
+
+ call win_execute(popup_id, 'let [class_closing_bracket_line, class_closing_bracket_col] = searchpairpos("{", "", "}", "W")')
+
+ " Include class docblock
+ let doc_line = cfline - 1
+ call win_execute(popup_id, 'let l = getline('.doc_line.')')
+ if l =~? '^\s*\*/'
+ while doc_line != 0
+ call win_execute(popup_id, 'let l = getline('.doc_line.')')
+ if l =~? '^\s*/\*\*'
+ let cfline = doc_line
+ break
+ endif
+ let doc_line -= 1
+ endwhile
+ endif
+
+ call win_execute(popup_id, 'let classcontent = join(getline('.cfline.', '.class_closing_bracket_line.'), "\n")')
+
+ let used_traits = []
+ " move back to the line next to the class's definition
+ call win_execute(popup_id, 'call cursor('.(endline + 1).', 1)')
+ let keep_searching = 1
+ while keep_searching != 0
+ " try to grab "use..." keywords
+ call win_execute(popup_id, 'let [lnum, col] = searchpos(''\c^\s\+use\s\+'.class_name_pattern.''', "cW", '.class_closing_bracket_line.')')
+ call win_execute(popup_id, 'let syn_name = synIDattr(synID('.lnum.', '.col.', 0), "name")')
+ if syn_name =~? 'string\|comment'
+ call win_execute(popup_id, 'call cursor('.(lnum + 1).', 1)')
+ continue
+ endif
+
+ call win_execute(popup_id, 'let trait_line = getline('.lnum.')')
+ if trait_line !~? ';'
+ " try to find the next line containing ';'
+ let l = lnum
+ let search_line = trait_line
+
+ " add lines from the file until there's no ';' in them
+ while search_line !~? ';' && l > 0
+ " file lines are reversed so we need to go backwards
+ let l += 1
+ call win_execute(popup_id, 'let search_line = getline('.l.')')
+ let trait_line .= ' '.substitute(search_line, '\(^\s\+\|\s\+$\)', '', 'g')
+ endwhile
+ endif
+ let use_expression = matchstr(trait_line, '^\s*use\s\+\zs.\{-}\ze;')
+ let use_parts = map(split(use_expression, '\s*,\s*'), 'substitute(v:val, "\\s+", " ", "g")')
+ let used_traits += map(use_parts, 'substitute(v:val, "\\s", "", "g")')
+ call win_execute(popup_id, 'call cursor('.(lnum + 1).', 1)')
+
+ if [lnum, col] == [0, 0]
+ let keep_searching = 0
+ endif
+ endwhile
+
+ call popup_close(popup_id)
+
+ let [current_namespace, imports] = phpcomplete#GetCurrentNameSpace(a:file_lines[0:cfline])
+ call add(result, {
+ \ 'class': a:class_name,
+ \ 'content': classcontent,
+ \ 'namespace': current_namespace,
+ \ 'imports': imports,
+ \ 'file': full_file_path,
+ \ 'mtime': getftime(full_file_path),
+ \ })
+
+ let all_extends = used_traits
+ if len(extended_classes) > 0
+ call extend(all_extends, extended_classes)
+ endif
+ if len(implemented_interfaces) > 0
+ call extend(all_extends, implemented_interfaces)
+ endif
+ if len(all_extends) > 0
+ for class in all_extends
+ let [class, namespace] = phpcomplete#ExpandClassName(class, current_namespace, imports)
+ if namespace == ''
+ let namespace = '\'
+ endif
+ let classlocation = phpcomplete#GetClassLocation(class, namespace)
+ if classlocation == "VIMPHP_BUILTINOBJECT"
+ if has_key(g:php_builtin_classes, tolower(class))
+ let result += [phpcomplete#GenerateBuiltinClassStub('class', g:php_builtin_classes[tolower(class)])]
+ endif
+ if has_key(g:php_builtin_interfaces, tolower(class))
+ let result += [phpcomplete#GenerateBuiltinClassStub('interface', g:php_builtin_interfaces[tolower(class)])]
+ endif
+ elseif classlocation != '' && filereadable(classlocation)
+ let full_file_path = fnamemodify(classlocation, ':p')
+ let result += phpcomplete#GetClassContentsStructure(full_file_path, readfile(full_file_path), class)
+ elseif tolower(current_namespace) == tolower(namespace) && match(join(a:file_lines, "\n"), '\c\(class\|interface\|trait\)\_s\+'.class.'\(\>\|$\)') != -1
+ " try to find the declaration in the same file.
+ let result += phpcomplete#GetClassContentsStructure(full_file_path, a:file_lines, class)
+ endif
+ endfor
+ endif
+
+ return result
+endfunction
+" }}}
+
+function! phpcomplete#GetClassContents(classlocation, class_name) " {{{
+ let classcontents = phpcomplete#GetCachedClassContents(a:classlocation, a:class_name)
+ let result = []
+ for classstructure in classcontents
+ call add(result, classstructure.content)
+ endfor
+ return join(result, "\n")
+endfunction
+" }}}
+
+function! phpcomplete#GenerateBuiltinClassStub(type, class_info) " {{{
+ let re = a:type.' '.a:class_info['name']." {"
+ if has_key(a:class_info, 'constants')
+ for [name, initializer] in items(a:class_info.constants)
+ let re .= "\n\tconst ".name." = ".initializer.";"
+ endfor
+ endif
+ if has_key(a:class_info, 'properties')
+ for [name, info] in items(a:class_info.properties)
+ let re .= "\n\t// @var $".name." ".info.type
+ let re .= "\n\tpublic $".name.";"
+ endfor
+ endif
+ if has_key(a:class_info, 'static_properties')
+ for [name, info] in items(a:class_info.static_properties)
+ let re .= "\n\t// @var ".name." ".info.type
+ let re .= "\n\tpublic static ".name." = ".info.initializer.";"
+ endfor
+ endif
+ if has_key(a:class_info, 'methods')
+ for [name, info] in items(a:class_info.methods)
+ if name =~ '^__'
+ continue
+ endif
+ let re .= "\n\t/**"
+ let re .= "\n\t * ".name
+ let re .= "\n\t *"
+ let re .= "\n\t * @return ".info.return_type
+ let re .= "\n\t */"
+ let re .= "\n\tpublic function ".name."(".info.signature."){"
+ let re .= "\n\t}"
+ endfor
+ endif
+ if has_key(a:class_info, 'static_methods')
+ for [name, info] in items(a:class_info.static_methods)
+ let re .= "\n\t/**"
+ let re .= "\n\t * ".name
+ let re .= "\n\t *"
+ let re .= "\n\t * @return ".info.return_type
+ let re .= "\n\t */"
+ let re .= "\n\tpublic static function ".name."(".info.signature."){"
+ let re .= "\n\t}"
+ endfor
+ endif
+ let re .= "\n}"
+
+ return { a:type : a:class_info['name'],
+ \ 'content': re,
+ \ 'namespace': '',
+ \ 'imports': {},
+ \ 'file': 'VIMPHP_BUILTINOBJECT',
+ \ 'mtime': 0,
+ \ }
+endfunction " }}}
+
+function! phpcomplete#GetDocBlock(sccontent, search) " {{{
+ let i = 0
+ let l = 0
+ let comment_start = -1
+ let comment_end = -1
+ let sccontent_len = len(a:sccontent)
+
+ while (i < sccontent_len)
+ let line = a:sccontent[i]
+ " search for a function declaration
+ if line =~? a:search
+ 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
+ if line =~? '^\s*\/\*\*.\+\*\/\s*$'
+ return substitute(line, '\v^\s*(\/\*\*\s*)|(\s*\*\/)\s*$', '', 'g')
+ "... or if comment end found save line position and end search
+ elseif line =~? '^\s*\*/'
+ let comment_end = l
+ break
+ " ... or the line doesn't blank (only whitespace or nothing) end search
+ elseif line !~? '^\s*$'
+ break
+ endif
+ let l -= 1
+ endwhile
+ " no comment found
+ if comment_end == -1
+ return ''
+ end
+
+ while l >= 0
+ let line = a:sccontent[l]
+ if line =~? '^\s*/\*\*'
+ let comment_start = l
+ break
+ endif
+ let l -= 1
+ endwhile
+
+ " no docblock comment start found
+ if comment_start == -1
+ return ''
+ end
+
+ let comment_start += 1 " we dont need the /**
+ let comment_end -= 1 " we dont need the */
+
+ " remove leading whitespace and '*'s
+ let docblock = join(map(copy(a:sccontent[comment_start :comment_end]), 'substitute(v:val, "^\\s*\\*\\s*", "", "")'), "\n")
+ return docblock
+ endif
+ let i += 1
+ endwhile
+ return ''
+endfunction
+" }}}
+
+function! phpcomplete#ParseDocBlock(docblock) " {{{
+ let res = {
+ \ 'description': '',
+ \ 'params': [],
+ \ 'return': {},
+ \ 'throws': [],
+ \ 'var': {},
+ \ 'properties': [],
+ \ }
+
+ 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"')
+ for param_line in param_lines
+ let parts = matchlist(param_line, '@param\s\+\(\S\+\)\s\+\(\S\+\)\s*\(.*\)')
+ if len(parts) > 0
+ call add(res.params, {
+ \ 'line': parts[0],
+ \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(parts, 1, '')),
+ \ 'name': get(parts, 2, ''),
+ \ 'description': get(parts, 3, '')})
+ endif
+ endfor
+
+ let return_line = filter(copy(docblock_lines), 'v:val =~? "^@return"')
+ if len(return_line) > 0
+ let return_parts = matchlist(return_line[0], '@return\s\+\(\S\+\)\s*\(.*\)')
+ let res['return'] = {
+ \ 'line': return_parts[0],
+ \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(return_parts, 1, '')),
+ \ 'description': get(return_parts, 2, '')}
+ endif
+
+ let exception_lines = filter(copy(docblock_lines), 'v:val =~? "^\\(@throws\\|@exception\\)"')
+ for exception_line in exception_lines
+ let parts = matchlist(exception_line, '^\(@throws\|@exception\)\s\+\(\S\+\)\s*\(.*\)')
+ if len(parts) > 0
+ call add(res.throws, {
+ \ 'line': parts[0],
+ \ 'type': phpcomplete#GetTypeFromDocBlockParam(get(parts, 2, '')),
+ \ 'description': get(parts, 3, '')})
+ endif
+ endfor
+
+ let var_line = filter(copy(docblock_lines), 'v:val =~? "^\\(@var\\|@type\\)"')
+ if len(var_line) > 0
+ 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, 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
+ endif
+
+ let primitive_types = [
+ \ 'string', 'float', 'double', 'int',
+ \ 'scalar', 'array', 'bool', 'void', 'mixed',
+ \ 'null', 'callable', 'resource', 'object']
+
+ " add array of primitives to the list too, like string[]
+ let primitive_types += map(copy(primitive_types), 'v:val."[]"')
+ let types = split(a:docblock_type, '|')
+ for type in types
+ if index(primitive_types, type) == -1
+ return type
+ endif
+ endfor
+
+ " only primitive types found, return the first one
+ return types[0]
+
+endfunction
+" }}}
+
+function! phpcomplete#FormatDocBlock(info) " {{{
+ let res = ''
+ if len(a:info.description)
+ let res .= "Description:\n".join(map(split(a:info['description'], "\n"), '"\t".v:val'), "\n")."\n"
+ endif
+
+ if len(a:info.params)
+ let res .= "\nArguments:\n"
+ for arginfo in a:info.params
+ let res .= "\t".arginfo['name'].' '.arginfo['type']
+ if len(arginfo.description) > 0
+ let res .= ': '.arginfo['description']
+ endif
+ let res .= "\n"
+ endfor
+ endif
+
+ if has_key(a:info.return, 'type')
+ let res .= "\nReturn:\n\t".a:info['return']['type']
+ if len(a:info.return.description) > 0
+ let res .= ": ".a:info['return']['description']
+ endif
+ let res .= "\n"
+ endif
+
+ if len(a:info.throws)
+ let res .= "\nThrows:\n"
+ for excinfo in a:info.throws
+ let res .= "\t".excinfo['type']
+ if len(excinfo['description']) > 0
+ let res .= ": ".excinfo['description']
+ endif
+ let res .= "\n"
+ endfor
+ endif
+
+ if has_key(a:info.var, 'type')
+ let res .= "Type:\n\t".a:info['var']['type']."\n"
+ if len(a:info['var']['description']) > 0
+ let res .= ': '.a:info['var']['description']
+ endif
+ endif
+
+ return res
+endfunction
+" }}}
+
+function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
+ let popup_id = popup_create(a:file_lines, {'hidden': v:true})
+ call win_execute(popup_id, 'normal! G')
+
+ " clear out classes, functions and other blocks
+ while 1
+ call win_execute(popup_id, 'let block_start_pos = searchpos(''\c\(class\|trait\|function\|interface\)\s\+\_.\{-}\zs{'', "Web")')
+ if block_start_pos == [0, 0]
+ break
+ endif
+ call win_execute(popup_id, 'let block_end_pos = searchpairpos("{", "", ''}\|\%$'', "W", ''synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'')')
+
+ let popup_lines = winbufnr(popup_id)->getbufline(1, '$')
+ if block_end_pos != [0, 0]
+ " end of the block found, just delete it
+ call remove(popup_lines, block_start_pos[0] - 1, block_end_pos[0] - 1)
+ else
+ " block pair not found, use block start as beginning and the end
+ " of the buffer instead
+ call remove(popup_lines, block_start_pos[0] - 1, -1)
+ endif
+ call popup_settext(popup_id, popup_lines)
+ endwhile
+ call win_execute(popup_id, 'normal! G', 'silent!')
+
+ " grab the remains
+ call win_execute(popup_id, "let file_lines = reverse(getline(1, line('.')-1))")
+ call popup_close(popup_id)
+
+ let namespace_name_pattern = '[a-zA-Z_\x7f-\xff\\][a-zA-Z_0-9\x7f-\xff\\]*'
+ let i = 0
+ let file_length = len(file_lines)
+ let imports = {}
+ let current_namespace = '\'
+
+ while i < file_length
+ let line = file_lines[i]
+
+ if line =~? '^\(<?php\)\?\s*namespace\s*'.namespace_name_pattern
+ let current_namespace = matchstr(line, '\c^\(<?php\)\?\s*namespace\s*\zs'.namespace_name_pattern.'\ze')
+ break
+ endif
+
+ if line =~? '^\s*use\>'
+ if line =~? ';'
+ let use_line = line
+ else
+ " try to find the next line containing ';'
+ let l = i
+ let search_line = line
+ let use_line = line
+
+ " add lines from the file until there's no ';' in them
+ while search_line !~? ';' && l > 0
+ " file lines are reversed so we need to go backwards
+ let l -= 1
+ let search_line = file_lines[l]
+ let use_line .= ' '.substitute(search_line, '\(^\s\+\|\s\+$\)', '', 'g')
+ endwhile
+ endif
+ let use_expression = matchstr(use_line, '^\c\s*use\s\+\zs.\{-}\ze;')
+ let use_parts = map(split(use_expression, '\s*,\s*'), 'substitute(v:val, "\\s+", " ", "g")')
+ for part in use_parts
+ if part =~? '\s\+as\s\+'
+ let [object, name] = split(part, '\s\+as\s\+\c')
+ let object = substitute(object, '^\\', '', '')
+ let name = substitute(name, '^\\', '', '')
+ else
+ let object = part
+ let name = part
+ let object = substitute(object, '^\\', '', '')
+ let name = substitute(name, '^\\', '', '')
+ if name =~? '\\'
+ 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
+
+ " 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 there's 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, '\', {})
+ let namespace_name_candidate = substitute(import.name, '\\', '\\\\', 'g')
+ " can be a namespace name as is, or can be a tagname at the end with a namespace
+ let tags = phpcomplete#GetTaglist('^\('.namespace_name_candidate.'\|'.classname.'\)$')
+ if len(tags) > 0
+ for tag in tags
+ " if there's a namespace with the name of the import
+ if tag.kind == 'n' && tag.name == import.name
+ call extend(import, tag)
+ let import['builtin'] = 0
+ let patched_ctags_detected = 1
+ break
+ endif
+ " if the name matches with the extracted classname and namespace
+ if (tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't') && tag.name == classname
+ if has_key(tag, 'namespace')
+ let patched_ctags_detected = 1
+ if tag.namespace == namespace_for_classes
+ call extend(import, tag)
+ let import['builtin'] = 0
+ break
+ endif
+ 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
+ endfor
+ " there were a namespacless class name match, if we think that the
+ " tags are not generated with patched ctags we will take it as a match
+ if exists('no_namespace_candidate') && !patched_ctags_detected
+ call extend(import, no_namespace_candidate)
+ let import['builtin'] = 0
+ endif
+ else
+ " if no tags are found, extract the namespace from the name
+ let ns = matchstr(import.name, '\c\zs[a-zA-Z0-9\\]\+\ze\\' . name)
+ if len(ns) > 0
+ let import['name'] = name
+ let import['namespace'] = ns
+ let import['builtin'] = 0
+ endif
+ endif
+ else
+ " if no \ in the name, it can be a built in class
+ if has_key(g:php_builtin_classnames, tolower(import.name))
+ let import['kind'] = 'c'
+ let import['builtin'] = 1
+ elseif has_key(g:php_builtin_interfacenames, tolower(import.name))
+ let import['kind'] = 'i'
+ let import['builtin'] = 1
+ else
+ " or can be a tag with exactly matching name
+ let tags = phpcomplete#GetTaglist('^'.import['name'].'$')
+ for tag in tags
+ " search for the first matching namespace, class, interface with no namespace
+ if !has_key(tag, 'namespace') && (tag.kind == 'n' || tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't')
+ call extend(import, tag)
+ let import['builtin'] = 0
+ break
+ endif
+ endfor
+ endif
+ endif
+ if exists('no_namespace_candidate')
+ unlet no_namespace_candidate
+ endif
+ endfor
+ endif
+ let i += 1
+ endwhile
+ let sorted_imports = {}
+ for name in sort(keys(imports))
+ let sorted_imports[name] = imports[name]
+ endfor
+ return [current_namespace, sorted_imports]
+endfunction
+" }}}
+
+function! phpcomplete#GetCurrentFunctionBoundaries() " {{{
+ let old_cursor_pos = [line('.'), col('.')]
+ let current_line_no = old_cursor_pos[0]
+ let function_pattern = '\c\(.*\%#\)\@!\_^\s*\zs\(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function\_.\{-}(\_.\{-})\_.\{-}{'
+
+ let func_start_pos = searchpos(function_pattern, 'Wbc')
+ if func_start_pos == [0, 0]
+ call cursor(old_cursor_pos[0], old_cursor_pos[1])
+ return 0
+ endif
+
+ " get the line where the function declaration actually started
+ call search('\cfunction\_.\{-}(\_.\{-})\_.\{-}{', 'Wce')
+
+ " get the position of the function block's closing "}"
+ let func_end_pos = searchpairpos('{', '', '}', 'W')
+ if func_end_pos == [0, 0]
+ " there is a function start but no end found, assume that we are in a
+ " function but the user did not typed the closing "}" yet and the
+ " function runs to the end of the file
+ let func_end_pos = [line('$'), len(getline(line('$')))]
+ endif
+
+ " Decho func_start_pos[0].' <= '.current_line_no.' && '.current_line_no.' <= '.func_end_pos[0]
+ if func_start_pos[0] <= current_line_no && current_line_no <= func_end_pos[0]
+ call cursor(old_cursor_pos[0], old_cursor_pos[1])
+ return [func_start_pos, func_end_pos]
+ endif
+
+ call cursor(old_cursor_pos[0], old_cursor_pos[1])
+ return 0
+endfunction
+" }}}
+
+function! phpcomplete#ExpandClassName(classname, current_namespace, imports) " {{{
+ " if there's an imported class, just use that class's information
+ if has_key(a:imports, a:classname) && (a:imports[a:classname].kind == 'c' || a:imports[a:classname].kind == 'i' || a:imports[a:classname].kind == 't')
+ let namespace = has_key(a:imports[a:classname], 'namespace') ? a:imports[a:classname].namespace : ''
+ return [a:imports[a:classname].name, namespace]
+ endif
+
+ " try to find relative namespace in imports, imported names takes precedence over
+ " current namespace when resolving relative namespaced class names
+ if a:classname !~ '^\' && a:classname =~ '\\'
+ let classname_parts = split(a:classname, '\\\+')
+ if has_key(a:imports, classname_parts[0]) && a:imports[classname_parts[0]].kind == 'n'
+ let classname_parts[0] = a:imports[classname_parts[0]].name
+ let namespace = join(classname_parts[0:-2], '\')
+ let classname = classname_parts[-1]
+ return [classname, namespace]
+ endif
+ endif
+
+ " no imported class or namespace matched, expand with the current namespace
+ let namespace = ''
+ let classname = a:classname
+ " if the classname have namespaces in in or we are in a namespace
+ if a:classname =~ '\\' || (a:current_namespace != '\' && a:current_namespace != '')
+ " add current namespace to the a:classname
+ if a:classname !~ '^\'
+ let classname = a:current_namespace.'\'.substitute(a:classname, '^\\', '', '')
+ else
+ " remove leading \, tag files doesn't have those
+ let classname = substitute(a:classname, '^\\', '', '')
+ endif
+ " split classname to classname and namespace
+ let classname_parts = split(classname, '\\\+')
+ if len(classname_parts) > 1
+ let namespace = join(classname_parts[0:-2], '\')
+ let classname = classname_parts[-1]
+ endif
+ endif
+ return [classname, namespace]
+endfunction
+" }}}
+
+function! phpcomplete#LoadData() " {{{
+" Keywords/reserved words, all other special things
+" Later it is possible to add some help to values, or type of defined variable
+let g:php_keywords={'PHP_SELF':'','argv':'','argc':'','GATEWAY_INTERFACE':'','SERVER_ADDR':'','SERVER_NAME':'','SERVER_SOFTWARE':'','SERVER_PROTOCOL':'','REQUEST_METHOD':'','REQUEST_TIME':'','QUERY_STRING':'','DOCUMENT_ROOT':'','HTTP_ACCEPT':'','HTTP_ACCEPT_CHARSET':'','HTTP_ACCEPT_ENCODING':'','HTTP_ACCEPT_LANGUAGE':'','HTTP_CONNECTION':'','HTTP_POST':'','HTTP_REFERER':'','HTTP_USER_AGENT':'','HTTPS':'','REMOTE_ADDR':'','REMOTE_HOST':'','REMOTE_PORT':'','SCRIPT_FILENAME':'','SERVER_ADMIN':'','SERVER_PORT':'','SERVER_SIGNATURE':'','PATH_TRANSLATED':'','SCRIPT_NAME':'','REQUEST_URI':'','PHP_AUTH_DIGEST':'','PHP_AUTH_USER':'','PHP_AUTH_PW':'','AUTH_TYPE':'','and':'','or':'','xor':'','__FILE__':'','exception':'','__LINE__':'','as':'','break':'','case':'','class':'','const':'','continue':'','declare':'','default':'','do':'','echo':'','else':'','elseif':'','enddeclare':'','endfor':'','endforeach':'','endif':'','endswitch':'','endwhile':'','extends':'','for':'','foreach':'','function':'','global':'','if':'','new':'','static':'','switch':'','use':'','var':'','while':'','final':'','php_user_filter':'','interface':'','implements':'','public':'','private':'','protected':'','abstract':'','clone':'','try':'','catch':'','throw':'','cfunction':'','old_function':'','this':'','INI_USER': '','INI_PERDIR': '','INI_SYSTEM': '','INI_ALL': '','ABDAY_1': '','ABDAY_2': '','ABDAY_3': '','ABDAY_4': '','ABDAY_5': '','ABDAY_6': '','ABDAY_7': '','DAY_1': '','DAY_2': '','DAY_3': '','DAY_4': '','DAY_5': '','DAY_6': '','DAY_7': '','ABMON_1': '','ABMON_2': '','ABMON_3': '','ABMON_4': '','ABMON_5': '','ABMON_6': '','ABMON_7': '','ABMON_8': '','ABMON_9': '','ABMON_10': '','ABMON_11': '','ABMON_12': '','MON_1': '','MON_2': '','MON_3': '','MON_4': '','MON_5': '','MON_6': '','MON_7': '','MON_8': '','MON_9': '','MON_10': '','MON_11': '','MON_12': '','AM_STR': '','D_T_FMT': '','ALT_DIGITS': '',}
+" One giant hash of all built-in function, class, interface and constant grouped by extension
+let php_builtin = {'functions':{},'classes':{},'interfaces':{},'constants':{},}
+let php_builtin['functions']['math']={'abs(':'mixed $number | number','acos(':'float $arg | float','acosh(':'float $arg | float','asin(':'float $arg | float','asinh(':'float $arg | float','atan(':'float $arg | float','atan2(':'float $y, float $x | float','atanh(':'float $arg | float','base_convert(':'string $number, int $frombase, int $tobase | string','bindec(':'string $binary_string | number','ceil(':'float $value | float','cos(':'float $arg | float','cosh(':'float $arg | float','decbin(':'int $number | string','dechex(':'int $number | string','decoct(':'int $number | string','deg2rad(':'float $number | float','exp(':'float $arg | float','expm1(':'float $arg | float','floor(':'float $value | float','fmod(':'float $x, float $y | float','getrandmax(':'void | int','hexdec(':'string $hex_string | number','hypot(':'float $x, float $y | float','is_finite(':'float $val | bool','is_infinite(':'float $val | bool','is_nan(':'float $val | bool','lcg_value(':'void | float','log(':'float $arg [, float $base = M_E] | float','log10(':'float $arg | float','log1p(':'float $number | float','max(':'array $values | mixed','min(':'array $values | mixed','mt_getrandmax(':'void | int','mt_rand(':'void | int','mt_srand(':'[ int $seed] | void','octdec(':'string $octal_string | number','pi(':'void | float','pow(':'number $base, number $exp | number','rad2deg(':'float $number | float','rand(':'void | int','round(':'float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP]] | float','sin(':'float $arg | float','sinh(':'float $arg | float','sqrt(':'float $arg | float','srand(':'[ int $seed] | void','tan(':'float $arg | float','tanh(':'float $arg | float',}
+let php_builtin['functions']['strings']={'addcslashes(':'string $str, string $charlist | string','addslashes(':'string $str | string','bin2hex(':'string $str | string','chop(':'chop — Alias of rtrim()','chr(':'int $ascii | string','chunk_split(':'string $body [, int $chunklen = 76 [, string $end = "\r\n"]] | string','convert_cyr_string(':'string $str, string $from, string $to | string','convert_uudecode(':'string $data | string','convert_uuencode(':'string $data | string','count_chars(':'string $string [, int $mode = 0] | mixed','crc32(':'string $str | int','crypt(':'string $str [, string $salt] | string','echo(':'string $arg1 [, string $...] | void','explode(':'string $delimiter, string $string [, int $limit] | array','fprintf(':'resource $handle, string $format [, mixed $args [, mixed $...]] | int','get_html_translation_table(':'[ int $table = HTML_SPECIALCHARS [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ''UTF-8'']]] | array','hebrev(':'string $hebrew_text [, int $max_chars_per_line = 0] | string','hebrevc(':'string $hebrew_text [, int $max_chars_per_line = 0] | string','hex2bin(':'string $data | string','html_entity_decode(':'string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ''UTF-8'']] | string','htmlentities(':'string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ''UTF-8'' [, bool $double_encode = true]]] | string','htmlspecialchars_decode(':'string $string [, int $flags = ENT_COMPAT | ENT_HTML401] | string','htmlspecialchars(':'string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ''UTF-8'' [, bool $double_encode = true]]] | string','implode(':'string $glue, array $pieces | string','join(':'join — Alias of implode()','lcfirst(':'string $str | string','levenshtein(':'string $str1, string $str2 | int','localeconv(':'void | array','ltrim(':'string $str [, string $character_mask] | string','md5_file(':'string $filename [, bool $raw_output = false] | string','md5(':'string $str [, bool $raw_output = false] | string','metaphone(':'string $str [, int $phonemes = 0] | string','money_format(':'string $format, float $number | string','nl_langinfo(':'int $item | string','nl2br(':'string $string [, bool $is_xhtml = true] | string','number_format(':'float $number [, int $decimals = 0] | string','ord(':'string $string | int','parse_str(':'string $str [, array &$arr] | void','print(':'string $arg | int','printf(':'string $format [, mixed $args [, mixed $...]] | int','quoted_printable_decode(':'string $str | string','quoted_printable_encode(':'string $str | string','quotemeta(':'string $str | string','rtrim(':'string $str [, string $character_mask] | string','setlocale(':'int $category, string $locale [, string $...] | string','sha1_file(':'string $filename [, bool $raw_output = false] | string','sha1(':'string $str [, bool $raw_output = false] | string','similar_text(':'string $first, string $second [, float &$percent] | int','soundex(':'string $str | string','sprintf(':'string $format [, mixed $args [, mixed $...]] | string','sscanf(':'string $str, string $format [, mixed &$...] | mixed','str_getcsv(':'string $input [, string $delimiter = '','' [, string $enclosure = ''"'' [, string $escape = ''\\'']]] | array','str_ireplace(':'mixed $search, mixed $replace, mixed $subject [, int &$count] | mixed','str_pad(':'string $input, int $pad_length [, string $pad_string = " " [, int $pad_type = STR_PAD_RIGHT]] | string','str_repeat(':'string $input, int $multiplier | string','str_replace(':'mixed $search, mixed $replace, mixed $subject [, int &$count] | mixed','str_rot13(':'string $str | string','str_shuffle(':'string $str | string','str_split(':'string $string [, int $split_length = 1] | array','str_word_count(':'string $string [, int $format = 0 [, string $charlist]] | mixed','strcasecmp(':'string $str1, string $str2 | int','strchr(':'strchr — Alias of strstr()','strcmp(':'string $str1, string $str2 | int','strcoll(':'string $str1, string $str2 | int','strcspn(':'string $str1, string $str2 [, int $start [, int $length]] | int','strip_tags(':'string $str [, string $allowable_tags] | string','stripcslashes(':'string $str | string','stripos(':'string $haystack, string $needle [, int $offset = 0] | int','stripslashes(':'string $str | string','stristr(':'string $haystack, mixed $needle [, bool $before_needle = false] | string','strlen(':'string $string | int','strnatcasecmp(':'string $str1, string $str2 | int','strnatcmp(':'string $str1, string $str2 | int','strncasecmp(':'string $str1, string $str2, int $len | int','strncmp(':'string $str1, string $str2, int $len | int','strpbrk(':'string $haystack, string $char_list | string','strpos(':'string $haystack, mixed $needle [, int $offset = 0] | mixed','strrchr(':'string $haystack, mixed $needle | string','strrev(':'string $string | string','strripos(':'string $haystack, string $needle [, int $offset = 0] | int','strrpos(':'string $haystack, string $needle [, int $offset = 0] | int','strspn(':'string $subject, string $mask [, int $start [, int $length]] | int','strstr(':'string $haystack, mixed $needle [, bool $before_needle = false] | string','strtok(':'string $str, string $token | string','strtolower(':'string $str | string','strtoupper(':'string $string | string','strtr(':'string $str, string $from, string $to | string','substr_compare(':'string $main_str, string $str, int $offset [, int $length [, bool $case_insensitivity = false]] | int','substr_count(':'string $haystack, string $needle [, int $offset = 0 [, int $length]] | int','substr_replace(':'mixed $string, mixed $replacement, mixed $start [, mixed $length] | mixed','substr(':'string $string, int $start [, int $length] | string','trim(':'string $str [, string $character_mask = " \t\n\r\0\x0B"] | string','ucfirst(':'string $str | string','ucwords(':'string $str | string','vfprintf(':'resource $handle, string $format, array $args | int','vprintf(':'string $format, array $args | int','vsprintf(':'string $format, array $args | string','wordwrap(':'string $str [, int $width = 75 [, string $break = "\n" [, bool $cut = false]]] | string',}
+let php_builtin['functions']['apache']={'apache_child_terminate(':'void | bool','apache_get_modules(':'void | array','apache_get_version(':'void | string','apache_getenv(':'string $variable [, bool $walk_to_top = false] | string','apache_lookup_uri(':'string $filename | object','apache_note(':'string $note_name [, string $note_value = ""] | string','apache_request_headers(':'void | array','apache_reset_timeout(':'void | bool','apache_response_headers(':'void | array','apache_setenv(':'string $variable, string $value [, bool $walk_to_top = false] | bool','getallheaders(':'void | array','virtual(':'string $filename | bool',}
+let php_builtin['functions']['arrays']={'array_change_key_case(':'array $array [, int $case = CASE_LOWER] | array','array_chunk(':'array $array, int $size [, bool $preserve_keys = false] | array','array_column(':'array $array, mixed $column_key [, mixed $index_key = null] | array','array_combine(':'array $keys, array $values | array','array_count_values(':'array $array | array','array_diff_assoc(':'array $array1, array $array2 [, array $...] | array','array_diff_key(':'array $array1, array $array2 [, array $...] | array','array_diff_uassoc(':'array $array1, array $array2 [, array $... [, callable $key_compare_func]] | array','array_diff_ukey(':'array $array1, array $array2 [, array $... [, callable $key_compare_func]] | array','array_diff(':'array $array1, array $array2 [, array $...] | array','array_fill_keys(':'array $keys, mixed $value | array','array_fill(':'int $start_index, int $num, mixed $value | array','array_filter(':'array $array [, callable $callback] | array','array_flip(':'array $array | array','array_intersect_assoc(':'array $array1, array $array2 [, array $...] | array','array_intersect_key(':'array $array1, array $array2 [, array $...] | array','array_intersect_uassoc(':'array $array1, array $array2 [, array $... [, callable $key_compare_func]] | array','array_intersect_ukey(':'array $array1, array $array2 [, array $... [, callable $key_compare_func]] | array','array_intersect(':'array $array1, array $array2 [, array $...] | array','array_key_exists(':'mixed $key, array $array | bool','array_keys(':'array $array [, mixed $search_value [, bool $strict = false]] | array','array_map(':'callable $callback, array $array1 [, array $...] | array','array_merge_recursive(':'array $array1 [, array $...] | array','array_merge(':'array $array1 [, array $...] | array','array_multisort(':'array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR [, mixed $...]]] | bool','array_pad(':'array $array, int $size, mixed $value | array','array_pop(':'array &$array | mixed','array_product(':'array $array | number','array_push(':'array &$array, mixed $value1 [, mixed $...] | int','array_rand(':'array $array [, int $num = 1] | mixed','array_reduce(':'array $array, callable $callback [, mixed $initial = NULL] | mixed','array_replace_recursive(':'array $array1, array $array2 [, array $...] | array','array_replace(':'array $array1, array $array2 [, array $...] | array','array_reverse(':'array $array [, bool $preserve_keys = false] | array','array_search(':'mixed $needle, array $haystack [, bool $strict = false] | mixed','array_shift(':'array &$array | mixed','array_slice(':'array $array, int $offset [, int $length = NULL [, bool $preserve_keys = false]] | array','array_splice(':'array &$input, int $offset [, int $length [, mixed $replacement = array()]] | array','array_sum(':'array $array | number','array_udiff_assoc(':'array $array1, array $array2 [, array $... [, callable $value_compare_func]] | array','array_udiff_uassoc(':'array $array1, array $array2 [, array $... [, callable $value_compare_func [, callable $key_compare_func]]] | array','array_udiff(':'array $array1, array $array2 [, array $... [, callable $value_compare_func]] | array','array_uintersect_assoc(':'array $array1, array $array2 [, array $... [, callable $value_compare_func]] | array','array_uintersect_uassoc(':'array $array1, array $array2 [, array $... [, callable $value_compare_func [, callable $key_compare_func]]] | array','array_uintersect(':'array $array1, array $array2 [, array $... [, callable $value_compare_func]] | array','array_unique(':'array $array [, int $sort_flags = SORT_STRING] | array','array_unshift(':'array &$array, mixed $value1 [, mixed $...] | int','array_values(':'array $array | array','array_walk_recursive(':'array &$array, callable $callback [, mixed $userdata = NULL] | bool','array_walk(':'array &$array, callable $callback [, mixed $userdata = NULL] | bool','array(':'[ mixed $...] | array','arsort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','asort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','compact(':'mixed $varname1 [, mixed $...] | array','count(':'mixed $array_or_countable [, int $mode = COUNT_NORMAL] | int','current(':'array &$array | mixed','each(':'array &$array | array','end(':'array &$array | mixed','extract(':'array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL]] | int','in_array(':'mixed $needle, array $haystack [, bool $strict = FALSE] | bool','key_exists(':'key_exists — Alias of array_key_exists()','key(':'array &$array | mixed','krsort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','ksort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','list(':'mixed $var1 [, mixed $...] | array','natcasesort(':'array &$array | bool','natsort(':'array &$array | bool','next(':'array &$array | mixed','pos(':'pos — Alias of current()','prev(':'array &$array | mixed','range(':'mixed $start, mixed $end [, number $step = 1] | array','reset(':'array &$array | mixed','rsort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','shuffle(':'array &$array | bool','sizeof(':'sizeof — Alias of count()','sort(':'array &$array [, int $sort_flags = SORT_REGULAR] | bool','uasort(':'array &$array, callable $value_compare_func | bool','uksort(':'array &$array, callable $key_compare_func | bool','usort(':'array &$array, callable $value_compare_func | bool',}
+let php_builtin['functions']['php_options_info']={'assert_options(':'int $what [, mixed $value] | mixed','assert(':'mixed $assertion [, string $description] | bool','cli_get_process_title(':'void | string','cli_set_process_title(':'string $title | bool','dl(':'string $library | bool','extension_loaded(':'string $name | bool','gc_collect_cycles(':'void | int','gc_disable(':'void | void','gc_enable(':'void | void','gc_enabled(':'void | bool','get_cfg_var(':'string $option | string','get_current_user(':'void | string','get_defined_constants(':'[ bool $categorize = false] | array','get_extension_funcs(':'string $module_name | array','get_include_path(':'void | string','get_included_files(':'void | array','get_loaded_extensions(':'[ bool $zend_extensions = false] | array','get_magic_quotes_gpc(':'void | bool','get_magic_quotes_runtime(':'void | bool','get_required_files(':'get_required_files — Alias of get_included_files()','getenv(':'string $varname | string','getlastmod(':'void | int','getmygid(':'void | int','getmyinode(':'void | int','getmypid(':'void | int','getmyuid(':'void | int','getopt(':'string $options [, array $longopts] | array','getrusage(':'[ int $who = 0] | array','ini_alter(':'ini_alter — Alias of ini_set()','ini_get_all(':'[ string $extension [, bool $details = true]] | array','ini_get(':'string $varname | string','ini_restore(':'string $varname | void','ini_set(':'string $varname, string $newvalue | string','magic_quotes_runtime(':'magic_quotes_runtime — Alias of set_magic_quotes_runtime()','memory_get_peak_usage(':'[ bool $real_usage = false] | int','memory_get_usage(':'[ bool $real_usage = false] | int','php_ini_loaded_file(':'void | string','php_ini_scanned_files(':'void | string','php_logo_guid(':'void | string','php_sapi_name(':'void | string','php_uname(':'[ string $mode = "a"] | string','phpcredits(':'[ int $flag = CREDITS_ALL] | bool','phpinfo(':'[ int $what = INFO_ALL] | bool','phpversion(':'[ string $extension] | string','putenv(':'string $setting | bool','restore_include_path(':'void | void','set_include_path(':'string $new_include_path | string','set_magic_quotes_runtime(':'bool $new_setting | bool','set_time_limit(':'int $seconds | void','sys_get_temp_dir(':'void | string','version_compare(':'string $version1, string $version2 [, string $operator] | mixed','zend_logo_guid(':'void | string','zend_thread_id(':'void | int','zend_version(':'void | string',}
+let php_builtin['functions']['classes_objects']={'__autoload(':'string $class | void','call_user_method_array(':'string $method_name, object &$obj, array $params | mixed','call_user_method(':'string $method_name, object &$obj [, mixed $parameter [, mixed $...]] | mixed','class_alias(':'string $original, string $alias [, bool $autoload = TRUE] | bool','class_exists(':'string $class_name [, bool $autoload = true] | bool','get_called_class(':'void | string','get_class_methods(':'mixed $class_name | array','get_class_vars(':'string $class_name | array','get_class(':'[ object $object = NULL] | string','get_declared_classes(':'void | array','get_declared_interfaces(':'void | array','get_declared_traits(':'void | array','get_object_vars(':'object $object | array','get_parent_class(':'[ mixed $object] | string','interface_exists(':'string $interface_name [, bool $autoload = true] | bool','is_a(':'object $object, string $class_name [, bool $allow_string = FALSE] | bool','is_subclass_of(':'mixed $object, string $class_name [, bool $allow_string = TRUE] | bool','method_exists(':'mixed $object, string $method_name | bool','property_exists(':'mixed $class, string $property | bool','trait_exists(':'string $traitname [, bool $autoload] | bool',}
+let php_builtin['functions']['urls']={'base64_decode(':'string $data [, bool $strict = false] | string','base64_encode(':'string $data | string','get_headers(':'string $url [, int $format = 0] | array','get_meta_tags(':'string $filename [, bool $use_include_path = false] | array','http_build_query(':'mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738]]] | string','parse_url(':'string $url [, int $component = -1] | mixed','rawurldecode(':'string $str | string','rawurlencode(':'string $str | string','urldecode(':'string $str | string','urlencode(':'string $str | string',}
+let php_builtin['functions']['filesystem']={'basename(':'string $path [, string $suffix] | string','chgrp(':'string $filename, mixed $group | bool','chmod(':'string $filename, int $mode | bool','chown(':'string $filename, mixed $user | bool','clearstatcache(':'[ bool $clear_realpath_cache = false [, string $filename]] | void','copy(':'string $source, string $dest [, resource $context] | bool','dirname(':'string $path | string','disk_free_space(':'string $directory | float','disk_total_space(':'string $directory | float','diskfreespace(':'diskfreespace — Alias of disk_free_space()','fclose(':'resource $handle | bool','feof(':'resource $handle | bool','fflush(':'resource $handle | bool','fgetc(':'resource $handle | string','fgetcsv(':'resource $handle [, int $length = 0 [, string $delimiter = '','' [, string $enclosure = ''"'' [, string $escape = ''\\'']]]] | array','fgets(':'resource $handle [, int $length] | string','fgetss(':'resource $handle [, int $length [, string $allowable_tags]] | string','file_exists(':'string $filename | bool','file_get_contents(':'string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen]]]] | string','file_put_contents(':'string $filename, mixed $data [, int $flags = 0 [, resource $context]] | int','file(':'string $filename [, int $flags = 0 [, resource $context]] | array','fileatime(':'string $filename | int','filectime(':'string $filename | int','filegroup(':'string $filename | int','fileinode(':'string $filename | int','filemtime(':'string $filename | int','fileowner(':'string $filename | int','fileperms(':'string $filename | int','filesize(':'string $filename | int','filetype(':'string $filename | string','flock(':'resource $handle, int $operation [, int &$wouldblock] | bool','fnmatch(':'string $pattern, string $string [, int $flags = 0] | bool','fopen(':'string $filename, string $mode [, bool $use_include_path = false [, resource $context]] | resource','fpassthru(':'resource $handle | int','fputcsv(':'resource $handle, array $fields [, string $delimiter = '','' [, string $enclosure = ''"'']] | int','fputs(':'fputs — Alias of fwrite()','fread(':'resource $handle, int $length | string','fscanf(':'resource $handle, string $format [, mixed &$...] | mixed','fseek(':'resource $handle, int $offset [, int $whence = SEEK_SET] | int','fstat(':'resource $handle | array','ftell(':'resource $handle | int','ftruncate(':'resource $handle, int $size | bool','fwrite(':'resource $handle, string $string [, int $length] | int','glob(':'string $pattern [, int $flags = 0] | array','is_dir(':'string $filename | bool','is_executable(':'string $filename | bool','is_file(':'string $filename | bool','is_link(':'string $filename | bool','is_readable(':'string $filename | bool','is_uploaded_file(':'string $filename | bool','is_writable(':'string $filename | bool','is_writeable(':'is_writeable — Alias of is_writable()','lchgrp(':'string $filename, mixed $group | bool','lchown(':'string $filename, mixed $user | bool','link(':'string $target, string $link | bool','linkinfo(':'string $path | int','lstat(':'string $filename | array','mkdir(':'string $pathname [, int $mode = 0777 [, bool $recursive = false [, resource $context]]] | bool','move_uploaded_file(':'string $filename, string $destination | bool','parse_ini_file(':'string $filename [, bool $process_sections = false [, int $scanner_mode = INI_SCANNER_NORMAL]] | array','parse_ini_string(':'string $ini [, bool $process_sections = false [, int $scanner_mode = INI_SCANNER_NORMAL]] | array','pathinfo(':'string $path [, int $options = PATHINFO_DIRNAME | PATHINFO_BASENAME | PATHINFO_EXTENSION | PATHINFO_FILENAME] | mixed','pclose(':'resource $handle | int','popen(':'string $command, string $mode | resource','readfile(':'string $filename [, bool $use_include_path = false [, resource $context]] | int','readlink(':'string $path | string','realpath_cache_get(':'void | array','realpath_cache_size(':'void | int','realpath(':'string $path | string','rename(':'string $oldname, string $newname [, resource $context] | bool','rewind(':'resource $handle | bool','rmdir(':'string $dirname [, resource $context] | bool','set_file_buffer(':'set_file_buffer — Alias of stream_set_write_buffer()','stat(':'string $filename | array','symlink(':'string $target, string $link | bool','tempnam(':'string $dir, string $prefix | string','tmpfile(':'void | resource','touch(':'string $filename [, int $time = time() [, int $atime]] | bool','umask(':'[ int $mask] | int','unlink(':'string $filename [, resource $context] | bool',}
+let php_builtin['functions']['variable_handling']={'boolval(':'mixed $var | boolean','debug_zval_dump(':'mixed $variable [, mixed $...] | void','doubleval(':'doubleval — Alias of floatval()','empty(':'mixed $var | bool','floatval(':'mixed $var | float','get_defined_vars(':'void | array','get_resource_type(':'resource $handle | string','gettype(':'mixed $var | string','import_request_variables(':'string $types [, string $prefix] | bool','intval(':'mixed $var [, int $base = 10] | int','is_array(':'mixed $var | bool','is_bool(':'mixed $var | bool','is_callable(':'callable $name [, bool $syntax_only = false [, string &$callable_name]] | bool','is_double(':'is_double — Alias of is_float()','is_float(':'mixed $var | bool','is_int(':'mixed $var | bool','is_integer(':'is_integer — Alias of is_int()','is_long(':'is_long — Alias of is_int()','is_null(':'mixed $var | bool','is_numeric(':'mixed $var | bool','is_object(':'mixed $var | bool','is_real(':'is_real — Alias of is_float()','is_resource(':'mixed $var | bool','is_scalar(':'mixed $var | bool','is_string(':'mixed $var | bool','isset(':'mixed $var [, mixed $...] | bool','print_r(':'mixed $expression [, bool $return = false] | mixed','serialize(':'mixed $value | string','settype(':'mixed &$var, string $type | bool','strval(':'mixed $var | string','unserialize(':'string $str | mixed','unset(':'mixed $var [, mixed $...] | void','var_dump(':'mixed $expression [, mixed $...] | void','var_export(':'mixed $expression [, bool $return = false] | mixed',}
+let php_builtin['functions']['calendar']={'cal_days_in_month(':'int $calendar, int $month, int $year | int','cal_from_jd(':'int $jd, int $calendar | array','cal_info(':'[ int $calendar = -1] | array','cal_to_jd(':'int $calendar, int $month, int $day, int $year | int','easter_date(':'[ int $year] | int','easter_days(':'[ int $year [, int $method = CAL_EASTER_DEFAULT]] | int','frenchtojd(':'int $month, int $day, int $year | int','gregoriantojd(':'int $month, int $day, int $year | int','jddayofweek(':'int $julianday [, int $mode = CAL_DOW_DAYNO] | mixed','jdmonthname(':'int $julianday, int $mode | string','jdtofrench(':'int $juliandaycount | string','jdtogregorian(':'int $julianday | string','jdtojewish(':'int $juliandaycount [, bool $hebrew = false [, int $fl = 0]] | string','jdtojulian(':'int $julianday | string','jdtounix(':'int $jday | int','jewishtojd(':'int $month, int $day, int $year | int','juliantojd(':'int $month, int $day, int $year | int','unixtojd(':'[ int $timestamp = time()] | int',}
+let php_builtin['functions']['function_handling']={'call_user_func_array(':'callable $callback, array $param_arr | mixed','call_user_func(':'callable $callback [, mixed $parameter [, mixed $...]] | mixed','create_function(':'string $args, string $code | string','forward_static_call_array(':'callable $function, array $parameters | mixed','forward_static_call(':'callable $function [, mixed $parameter [, mixed $...]] | mixed','func_get_arg(':'int $arg_num | mixed','func_get_args(':'void | array','func_num_args(':'void | int','function_exists(':'string $function_name | bool','get_defined_functions(':'void | array','register_shutdown_function(':'callable $callback [, mixed $parameter [, mixed $...]] | void','register_tick_function(':'callable $function [, mixed $arg [, mixed $...]] | bool','unregister_tick_function(':'string $function_name | void',}
+let php_builtin['functions']['directories']={'chdir(':'string $directory | bool','chroot(':'string $directory | bool','closedir(':'[ resource $dir_handle] | void','dir(':'string $directory [, resource $context] | Directory','getcwd(':'void | string','opendir(':'string $path [, resource $context] | resource','readdir(':'[ resource $dir_handle] | string','rewinddir(':'[ resource $dir_handle] | void','scandir(':'string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context]] | array',}
+let php_builtin['functions']['date_time']={'checkdate(':'int $month, int $day, int $year | bool','date_default_timezone_get(':'void | string','date_default_timezone_set(':'string $timezone_identifier | bool','date_parse_from_format(':'string $format, string $date | array','date_parse(':'string $date | array','date_sun_info(':'int $time, float $latitude, float $longitude | array','date_sunrise(':'int $timestamp [, int $format = SUNFUNCS_RET_STRING [, float $latitude = ini_get("date.default_latitude") [, float $longitude = ini_get("date.default_longitude") [, float $zenith = ini_get("date.sunrise_zenith") [, float $gmt_offset = 0]]]]] | mixed','date_sunset(':'int $timestamp [, int $format = SUNFUNCS_RET_STRING [, float $latitude = ini_get("date.default_latitude") [, float $longitude = ini_get("date.default_longitude") [, float $zenith = ini_get("date.sunset_zenith") [, float $gmt_offset = 0]]]]] | mixed','date(':'string $format [, int $timestamp = time()] | string','getdate(':'[ int $timestamp = time()] | array','gettimeofday(':'[ bool $return_float = false] | mixed','gmdate(':'string $format [, int $timestamp = time()] | string','gmmktime(':'[ int $hour = gmdate("H") [, int $minute = gmdate("i") [, int $second = gmdate("s") [, int $month = gmdate("n") [, int $day = gmdate("j") [, int $year = gmdate("Y") [, int $is_dst = -1]]]]]]] | int','gmstrftime(':'string $format [, int $timestamp = time()] | string','idate(':'string $format [, int $timestamp = time()] | int','localtime(':'[ int $timestamp = time() [, bool $is_associative = false]] | array','microtime(':'[ bool $get_as_float = false] | mixed','mktime(':'[ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1]]]]]]] | int','strftime(':'string $format [, int $timestamp = time()] | string','strptime(':'string $date, string $format | array','strtotime(':'string $time [, int $now = time()] | int','time(':'void | int','timezone_name_from_abbr(':'string $abbr [, int $gmtOffset = -1 [, int $isdst = -1]] | string','timezone_version_get(':'void | string',}
+let php_builtin['functions']['network']={'checkdnsrr(':'string $host [, string $type = "MX"] | bool','closelog(':'void | bool','define_syslog_variables(':'void | void','dns_get_record(':'string $hostname [, int $type = DNS_ANY [, array &$authns [, array &$addtl [, bool &$raw = false]]]] | array','fsockopen(':'string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout")]]]] | resource','gethostbyaddr(':'string $ip_address | string','gethostbyname(':'string $hostname | string','gethostbynamel(':'string $hostname | array','gethostname(':'void | string','getmxrr(':'string $hostname, array &$mxhosts [, array &$weight] | bool','getprotobyname(':'string $name | int','getprotobynumber(':'int $number | string','getservbyname(':'string $service, string $protocol | int','getservbyport(':'int $port, string $protocol | string','header_register_callback(':'callable $callback | bool','header_remove(':'[ string $name] | void','header(':'string $string [, bool $replace = true [, int $http_response_code]] | void','headers_list(':'void | array','headers_sent(':'[ string &$file [, int &$line]] | bool','http_response_code(':'[ int $response_code] | int','inet_ntop(':'string $in_addr | string','inet_pton(':'string $address | string','ip2long(':'string $ip_address | int','long2ip(':'string $proper_address | string','openlog(':'string $ident, int $option, int $facility | bool','pfsockopen(':'string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout")]]]] | resource','setcookie(':'string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false]]]]]] | bool','setrawcookie(':'string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false]]]]]] | bool','socket_get_status(':'socket_get_status — Alias of stream_get_meta_data()','socket_set_blocking(':'socket_set_blocking — Alias of stream_set_blocking()','socket_set_timeout(':'socket_set_timeout — Alias of stream_set_timeout()','syslog(':'int $priority, string $message | bool',}
+let php_builtin['functions']['spl']={'class_implements(':'mixed $class [, bool $autoload = true] | array','class_parents(':'mixed $class [, bool $autoload = true] | array','class_uses(':'mixed $class [, bool $autoload = true] | array','iterator_apply(':'Traversable $iterator, callable $function [, array $args] | int','iterator_count(':'Traversable $iterator | int','iterator_to_array(':'Traversable $iterator [, bool $use_keys = true] | array','spl_autoload_call(':'string $class_name | void','spl_autoload_extensions(':'[ string $file_extensions] | string','spl_autoload_functions(':'void | array','spl_autoload_register(':'[ callable $autoload_function [, bool $throw = true [, bool $prepend = false]]] | bool','spl_autoload_unregister(':'mixed $autoload_function | bool','spl_autoload(':'string $class_name [, string $file_extensions = spl_autoload_extensions()] | void','spl_classes(':'void | array','spl_object_hash(':'object $obj | string',}
+let php_builtin['functions']['misc']={'connection_aborted(':'void | int','connection_status(':'void | int','connection_timeout(':'void | int','constant(':'string $name | mixed','define(':'string $name, mixed $value [, bool $case_insensitive = false] | bool','defined(':'string $name | bool','eval(':'string $code | mixed','exit(':'[ string $status] | void','get_browser(':'[ string $user_agent [, bool $return_array = false]] | mixed','__halt_compiler(':'void | void','highlight_file(':'string $filename [, bool $return = false] | mixed','highlight_string(':'string $str [, bool $return = false] | mixed','ignore_user_abort(':'[ string $value] | int','pack(':'string $format [, mixed $args [, mixed $...]] | string','php_check_syntax(':'string $filename [, string &$error_message] | bool','php_strip_whitespace(':'string $filename | string','show_source(':'show_source — Alias of highlight_file()','sleep(':'int $seconds | int','sys_getloadavg(':'void | array','time_nanosleep(':'int $seconds, int $nanoseconds | mixed','time_sleep_until(':'float $timestamp | bool','uniqid(':'[ string $prefix = "" [, bool $more_entropy = false]] | string','unpack(':'string $format, string $data | array','usleep(':'int $micro_seconds | void',}
+let php_builtin['functions']['curl']={'curl_close(':'resource $ch | void','curl_copy_handle(':'resource $ch | resource','curl_errno(':'resource $ch | int','curl_error(':'resource $ch | string','curl_escape(':'resource $ch, string $str | string','curl_exec(':'resource $ch | mixed','curl_getinfo(':'resource $ch [, int $opt = 0] | mixed','curl_init(':'[ string $url = NULL] | resource','curl_multi_add_handle(':'resource $mh, resource $ch | int','curl_multi_close(':'resource $mh | void','curl_multi_exec(':'resource $mh, int &$still_running | int','curl_multi_getcontent(':'resource $ch | string','curl_multi_info_read(':'resource $mh [, int &$msgs_in_queue = NULL] | array','curl_multi_init(':'void | resource','curl_multi_remove_handle(':'resource $mh, resource $ch | int','curl_multi_select(':'resource $mh [, float $timeout = 1.0] | int','curl_multi_setopt(':'resource $mh, int $option, mixed $value | bool','curl_multi_strerror(':'int $errornum | string','curl_pause(':'resource $ch, int $bitmask | int','curl_reset(':'resource $ch | void','curl_setopt_array(':'resource $ch, array $options | bool','curl_setopt(':'resource $ch, int $option, mixed $value | bool','curl_share_close(':'resource $sh | void','curl_share_init(':'void | resource','curl_share_setopt(':'resource $sh, int $option, string $value | bool','curl_strerror(':'int $errornum | string','curl_unescape(':'resource $ch, string $str | string','curl_version(':'[ int $age = CURLVERSION_NOW] | array',}
+let php_builtin['functions']['error_handling']={'debug_backtrace(':'[ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0]] | array','debug_print_backtrace(':'[ int $options = 0 [, int $limit = 0]] | void','error_get_last(':'void | array','error_log(':'string $message [, int $message_type = 0 [, string $destination [, string $extra_headers]]] | bool','error_reporting(':'[ int $level] | int','restore_error_handler(':'void | bool','restore_exception_handler(':'void | bool','set_error_handler(':'callable $error_handler [, int $error_types = E_ALL | E_STRICT] | mixed','set_exception_handler(':'callable $exception_handler | callable','trigger_error(':'string $error_msg [, int $error_type = E_USER_NOTICE] | bool',}
+let php_builtin['functions']['dom']={'dom_import_simplexml(':'SimpleXMLElement $node | DOMElement',}
+let php_builtin['functions']['program_execution']={'escapeshellarg(':'string $arg | string','escapeshellcmd(':'string $command | string','exec(':'string $command [, array &$output [, int &$return_var]] | string','passthru(':'string $command [, int &$return_var] | void','proc_close(':'resource $process | int','proc_get_status(':'resource $process | array','proc_nice(':'int $increment | bool','proc_open(':'string $cmd, array $descriptorspec, array &$pipes [, string $cwd [, array $env [, array $other_options]]] | resource','proc_terminate(':'resource $process [, int $signal = 15] | bool','shell_exec(':'string $cmd | string','system(':'string $command [, int &$return_var] | string',}
+let php_builtin['functions']['mail']={'ezmlm_hash(':'string $addr | int','mail(':'string $to, string $subject, string $message [, string $additional_headers [, string $additional_parameters]] | bool',}
+let php_builtin['functions']['fastcgi_process_manager']={'fastcgi_finish_request(':'void | boolean',}
+let php_builtin['functions']['filter']={'filter_has_var(':'int $type, string $variable_name | bool','filter_id(':'string $filtername | int','filter_input_array(':'int $type [, mixed $definition [, bool $add_empty = true]] | mixed','filter_input(':'int $type, string $variable_name [, int $filter = FILTER_DEFAULT [, mixed $options]] | mixed','filter_list(':'void | array','filter_var_array(':'array $data [, mixed $definition [, bool $add_empty = true]] | mixed','filter_var(':'mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options]] | mixed',}
+let php_builtin['functions']['fileinfo']={'finfo_buffer(':'resource $finfo [, string $string = NULL [, int $options = FILEINFO_NONE [, resource $context = NULL]]] | string','finfo_close(':'resource $finfo | bool','finfo_file(':'resource $finfo [, string $file_name = NULL [, int $options = FILEINFO_NONE [, resource $context = NULL]]] | string','finfo_open(':'[ int $options = FILEINFO_NONE [, string $magic_file = NULL]] | resource','finfo_set_flags(':'resource $finfo, int $options | bool','mime_content_type(':'string $filename | string',}
+let php_builtin['functions']['output_control']={'flush(':'void | void','ob_clean(':'void | void','ob_end_clean(':'void | bool','ob_end_flush(':'void | bool','ob_flush(':'void | void','ob_get_clean(':'void | string','ob_get_contents(':'void | string','ob_get_flush(':'void | string','ob_get_length(':'void | int','ob_get_level(':'void | int','ob_get_status(':'[ bool $full_status = FALSE] | array','ob_gzhandler(':'string $buffer, int $mode | string','ob_implicit_flush(':'[ int $flag = true] | void','ob_list_handlers(':'void | array','ob_start(':'[ callable $output_callback = NULL [, int $chunk_size = 0 [, int $flags = PHP_OUTPUT_HANDLER_STDFLAGS]]] | bool','output_add_rewrite_var(':'string $name, string $value | bool','output_reset_rewrite_vars(':'void | bool',}
+let php_builtin['functions']['gd']={'gd_info(':'void | array','getimagesize(':'string $filename [, array &$imageinfo] | array','getimagesizefromstring(':'string $imagedata [, array &$imageinfo] | array','image_type_to_extension(':'int $imagetype [, bool $include_dot = TRUE] | string','image_type_to_mime_type(':'int $imagetype | string','image2wbmp(':'resource $image [, string $filename [, int $threshold]] | bool','imageaffine(':'resource $image, array $affine [, array $clip] | resource','imageaffinematrixconcat(':'array $m1, array $m2 | array','imageaffinematrixget(':'int $type [, mixed $options] | array','imagealphablending(':'resource $image, bool $blendmode | bool','imageantialias(':'resource $image, bool $enabled | bool','imagearc(':'resource $image, int $cx, int $cy, int $width, int $height, int $start, int $end, int $color | bool','imagechar(':'resource $image, int $font, int $x, int $y, string $c, int $color | bool','imagecharup(':'resource $image, int $font, int $x, int $y, string $c, int $color | bool','imagecolorallocate(':'resource $image, int $red, int $green, int $blue | int','imagecolorallocatealpha(':'resource $image, int $red, int $green, int $blue, int $alpha | int','imagecolorat(':'resource $image, int $x, int $y | int','imagecolorclosest(':'resource $image, int $red, int $green, int $blue | int','imagecolorclosestalpha(':'resource $image, int $red, int $green, int $blue, int $alpha | int','imagecolorclosesthwb(':'resource $image, int $red, int $green, int $blue | int','imagecolordeallocate(':'resource $image, int $color | bool','imagecolorexact(':'resource $image, int $red, int $green, int $blue | int','imagecolorexactalpha(':'resource $image, int $red, int $green, int $blue, int $alpha | int','imagecolormatch(':'resource $image1, resource $image2 | bool','imagecolorresolve(':'resource $image, int $red, int $green, int $blue | int','imagecolorresolvealpha(':'resource $image, int $red, int $green, int $blue, int $alpha | int','imagecolorset(':'resource $image, int $index, int $red, int $green, int $blue [, int $alpha = 0] | void','imagecolorsforindex(':'resource $image, int $index | array','imagecolorstotal(':'resource $image | int','imagecolortransparent(':'resource $image [, int $color] | int','imageconvolution(':'resource $image, array $matrix, float $div, float $offset | bool','imagecopy(':'resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h | bool','imagecopymerge(':'resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct | bool','imagecopymergegray(':'resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct | bool','imagecopyresampled(':'resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h | bool','imagecopyresized(':'resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src_x, int $src_y, int $dst_w, int $dst_h, int $src_w, int $src_h | bool','imagecreate(':'int $width, int $height | resource','imagecreatefromgd(':'string $filename | resource','imagecreatefromgd2(':'string $filename | resource','imagecreatefromgd2part(':'string $filename, int $srcX, int $srcY, int $width, int $height | resource','imagecreatefromgif(':'string $filename | resource','imagecreatefromjpeg(':'string $filename | resource','imagecreatefrompng(':'string $filename | resource','imagecreatefromstring(':'string $image | resource','imagecreatefromwbmp(':'string $filename | resource','imagecreatefromwebp(':'string $filename | resource','imagecreatefromxbm(':'string $filename | resource','imagecreatefromxpm(':'string $filename | resource','imagecreatetruecolor(':'int $width, int $height | resource','imagecrop(':'resource $image, array $rect | resource','imagecropauto(':'resource $image [, int $mode = -1 [, float $threshold = .5 [, int $color = -1]]] | resource','imagedashedline(':'resource $image, int $x1, int $y1, int $x2, int $y2, int $color | bool','imagedestroy(':'resource $image | bool','imageellipse(':'resource $image, int $cx, int $cy, int $width, int $height, int $color | bool','imagefill(':'resource $image, int $x, int $y, int $color | bool','imagefilledarc(':'resource $image, int $cx, int $cy, int $width, int $height, int $start, int $end, int $color, int $style | bool','imagefilledellipse(':'resource $image, int $cx, int $cy, int $width, int $height, int $color | bool','imagefilledpolygon(':'resource $image, array $points, int $num_points, int $color | bool','imagefilledrectangle(':'resource $image, int $x1, int $y1, int $x2, int $y2, int $color | bool','imagefilltoborder(':'resource $image, int $x, int $y, int $border, int $color | bool','imagefilter(':'resource $image, int $filtertype [, int $arg1 [, int $arg2 [, int $arg3 [, int $arg4]]]] | bool','imageflip(':'resource $image, int $mode | bool','imagefontheight(':'int $font | int','imagefontwidth(':'int $font | int','imageftbbox(':'float $size, float $angle, string $fontfile, string $text [, array $extrainfo] | array','imagefttext(':'resource $image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text [, array $extrainfo] | array','imagegammacorrect(':'resource $image, float $inputgamma, float $outputgamma | bool','imagegd(':'resource $image [, string $filename] | bool','imagegd2(':'resource $image [, string $filename [, int $chunk_size [, int $type = IMG_GD2_RAW]]] | bool','imagegif(':'resource $image [, string $filename] | bool','imagegrabscreen(':'void | resource','imagegrabwindow(':'int $window_handle [, int $client_area = 0] | resource','imageinterlace(':'resource $image [, int $interlace = 0] | int','imageistruecolor(':'resource $image | bool','imagejpeg(':'resource $image [, string $filename [, int $quality]] | bool','imagelayereffect(':'resource $image, int $effect | bool','imageline(':'resource $image, int $x1, int $y1, int $x2, int $y2, int $color | bool','imageloadfont(':'string $file | int','imagepalettecopy(':'resource $destination, resource $source | void','imagepalettetotruecolor(':'resource $src | bool','imagepng(':'resource $image [, string $filename [, int $quality [, int $filters]]] | bool','imagepolygon(':'resource $image, array $points, int $num_points, int $color | bool','imagepsbbox(':'string $text, resource $font, int $size | array','imagepsencodefont(':'resource $font_index, string $encodingfile | bool','imagepsextendfont(':'resource $font_index, float $extend | bool','imagepsfreefont(':'resource $font_index | bool','imagepsloadfont(':'string $filename | resource','imagepsslantfont(':'resource $font_index, float $slant | bool','imagepstext(':'resource $image, string $text, resource $font_index, int $size, int $foreground, int $background, int $x, int $y [, int $space = 0 [, int $tightness = 0 [, float $angle = 0.0 [, int $antialias_steps = 4]]]] | array','imagerectangle(':'resource $image, int $x1, int $y1, int $x2, int $y2, int $color | bool','imagerotate(':'resource $image, float $angle, int $bgd_color [, int $ignore_transparent = 0] | resource','imagesavealpha(':'resource $image, bool $saveflag | bool','imagescale(':'resource $image, int $new_width [, int $new_height = -1 [, int $mode = IMG_BILINEAR_FIXED]] | resource','imagesetbrush(':'resource $image, resource $brush | bool','imagesetinterpolation(':'resource $image [, int $method = IMG_BILINEAR_FIXED] | bool','imagesetpixel(':'resource $image, int $x, int $y, int $color | bool','imagesetstyle(':'resource $image, array $style | bool','imagesetthickness(':'resource $image, int $thickness | bool','imagesettile(':'resource $image, resource $tile | bool','imagestring(':'resource $image, int $font, int $x, int $y, string $string, int $color | bool','imagestringup(':'resource $image, int $font, int $x, int $y, string $string, int $color | bool','imagesx(':'resource $image | int','imagesy(':'resource $image | int','imagetruecolortopalette(':'resource $image, bool $dither, int $ncolors | bool','imagettfbbox(':'float $size, float $angle, string $fontfile, string $text | array','imagettftext(':'resource $image, float $size, float $angle, int $x, int $y, int $color, string $fontfile, string $text | array','imagetypes(':'void | int','imagewbmp(':'resource $image [, string $filename [, int $foreground]] | bool','imagewebp(':'resource $image, string $filename | bool','imagexbm(':'resource $image, string $filename [, int $foreground] | bool','iptcembed(':'string $iptcdata, string $jpeg_file_name [, int $spool] | mixed','iptcparse(':'string $iptcblock | array','jpeg2wbmp(':'string $jpegname, string $wbmpname, int $dest_height, int $dest_width, int $threshold | bool','png2wbmp(':'string $pngname, string $wbmpname, int $dest_height, int $dest_width, int $threshold | bool',}
+let php_builtin['functions']['iconv']={'iconv_get_encoding(':'[ string $type = "all"] | mixed','iconv_mime_decode_headers(':'string $encoded_headers [, int $mode = 0 [, string $charset = ini_get("iconv.internal_encoding")]] | array','iconv_mime_decode(':'string $encoded_header [, int $mode = 0 [, string $charset = ini_get("iconv.internal_encoding")]] | string','iconv_mime_encode(':'string $field_name, string $field_value [, array $preferences = NULL] | string','iconv_set_encoding(':'string $type, string $charset | bool','iconv_strlen(':'string $str [, string $charset = ini_get("iconv.internal_encoding")] | int','iconv_strpos(':'string $haystack, string $needle [, int $offset = 0 [, string $charset = ini_get("iconv.internal_encoding")]] | int','iconv_strrpos(':'string $haystack, string $needle [, string $charset = ini_get("iconv.internal_encoding")] | int','iconv_substr(':'string $str, int $offset [, int $length = iconv_strlen($str, $charset) [, string $charset = ini_get("iconv.internal_encoding")]] | string','iconv(':'string $in_charset, string $out_charset, string $str | string','ob_iconv_handler(':'string $contents, int $status | string',}
+let php_builtin['functions']['json']={'json_decode(':'string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0]]] | mixed','json_encode(':'mixed $value [, int $options = 0 [, int $depth = 512]] | string','json_last_error_msg(':'void | string','json_last_error(':'void | int',}
+let php_builtin['functions']['libxml']={'libxml_clear_errors(':'void | void','libxml_disable_entity_loader(':'[ bool $disable = true] | bool','libxml_get_errors(':'void | array','libxml_get_last_error(':'void | LibXMLError','libxml_set_external_entity_loader(':'callable $resolver_function | void','libxml_set_streams_context(':'resource $streams_context | void','libxml_use_internal_errors(':'[ bool $use_errors = false] | bool',}
+let php_builtin['functions']['multibyte_string']={'mb_check_encoding(':'[ string $var = NULL [, string $encoding = mb_internal_encoding()]] | bool','mb_convert_case(':'string $str, int $mode [, string $encoding = mb_internal_encoding()] | string','mb_convert_encoding(':'string $str, string $to_encoding [, mixed $from_encoding = mb_internal_encoding()] | string','mb_convert_kana(':'string $str [, string $option = "KV" [, string $encoding = mb_internal_encoding()]] | string','mb_convert_variables(':'string $to_encoding, mixed $from_encoding, mixed &$vars [, mixed &$...] | string','mb_decode_mimeheader(':'string $str | string','mb_decode_numericentity(':'string $str, array $convmap [, string $encoding = mb_internal_encoding()] | string','mb_detect_encoding(':'string $str [, mixed $encoding_list = mb_detect_order() [, bool $strict = false]] | string','mb_detect_order(':'[ mixed $encoding_list = mb_detect_order()] | mixed','mb_encode_mimeheader(':'string $str [, string $charset = mb_internal_encoding() [, string $transfer_encoding = "B" [, string $linefeed = "\r\n" [, int $indent = 0]]]] | string','mb_encode_numericentity(':'string $str, array $convmap [, string $encoding = mb_internal_encoding() [, bool $is_hex = FALSE]] | string','mb_encoding_aliases(':'string $encoding | array','mb_ereg_match(':'string $pattern, string $string [, string $option = "msr"] | bool','mb_ereg_replace_callback(':'string $pattern, callable $callback, string $string [, string $option = "msr"] | string','mb_ereg_replace(':'string $pattern, string $replacement, string $string [, string $option = "msr"] | string','mb_ereg_search_getpos(':'void | int','mb_ereg_search_getregs(':'void | array','mb_ereg_search_init(':'string $string [, string $pattern [, string $option = "msr"]] | bool','mb_ereg_search_pos(':'[ string $pattern [, string $option = "ms"]] | array','mb_ereg_search_regs(':'[ string $pattern [, string $option = "ms"]] | array','mb_ereg_search_setpos(':'int $position | bool','mb_ereg_search(':'[ string $pattern [, string $option = "ms"]] | bool','mb_ereg(':'string $pattern, string $string [, array $regs] | int','mb_eregi_replace(':'string $pattern, string $replace, string $string [, string $option = "msri"] | string','mb_eregi(':'string $pattern, string $string [, array $regs] | int','mb_get_info(':'[ string $type = "all"] | mixed','mb_http_input(':'[ string $type = ""] | mixed','mb_http_output(':'[ string $encoding = mb_http_output()] | mixed','mb_internal_encoding(':'[ string $encoding = mb_internal_encoding()] | mixed','mb_language(':'[ string $language = mb_language()] | mixed','mb_list_encodings(':'void | array','mb_output_handler(':'string $contents, int $status | string','mb_parse_str(':'string $encoded_string [, array &$result] | bool','mb_preferred_mime_name(':'string $encoding | string','mb_regex_encoding(':'[ string $encoding = mb_regex_encoding()] | mixed','mb_regex_set_options(':'[ string $options = mb_regex_set_options()] | string','mb_send_mail(':'string $to, string $subject, string $message [, string $additional_headers = NULL [, string $additional_parameter = NULL]] | bool','mb_split(':'string $pattern, string $string [, int $limit = -1] | array','mb_strcut(':'string $str, int $start [, int $length = NULL [, string $encoding = mb_internal_encoding()]] | string','mb_strimwidth(':'string $str, int $start, int $width [, string $trimmarker = "" [, string $encoding = mb_internal_encoding()]] | string','mb_stripos(':'string $haystack, string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding()]] | int','mb_stristr(':'string $haystack, string $needle [, bool $before_needle = false [, string $encoding = mb_internal_encoding()]] | string','mb_strlen(':'string $str [, string $encoding = mb_internal_encoding()] | mixed','mb_strpos(':'string $haystack, string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding()]] | int','mb_strrchr(':'string $haystack, string $needle [, bool $part = false [, string $encoding = mb_internal_encoding()]] | string','mb_strrichr(':'string $haystack, string $needle [, bool $part = false [, string $encoding = mb_internal_encoding()]] | string','mb_strripos(':'string $haystack, string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding()]] | int','mb_strrpos(':'string $haystack, string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding()]] | int','mb_strstr(':'string $haystack, string $needle [, bool $before_needle = false [, string $encoding = mb_internal_encoding()]] | string','mb_strtolower(':'string $str [, string $encoding = mb_internal_encoding()] | string','mb_strtoupper(':'string $str [, string $encoding = mb_internal_encoding()] | string','mb_strwidth(':'string $str [, string $encoding = mb_internal_encoding()] | int','mb_substitute_character(':'[ mixed $substrchar = mb_substitute_character()] | mixed','mb_substr_count(':'string $haystack, string $needle [, string $encoding = mb_internal_encoding()] | int','mb_substr(':'string $str, int $start [, int $length = NULL [, string $encoding = mb_internal_encoding()]] | string',}
+let php_builtin['functions']['mssql']={'mssql_bind(':'resource $stmt, string $param_name, mixed &$var, int $type [, bool $is_output = false [, bool $is_null = false [, int $maxlen = -1]]] | bool','mssql_close(':'[ resource $link_identifier] | bool','mssql_connect(':'[ string $servername [, string $username [, string $password [, bool $new_link = false]]]] | resource','mssql_data_seek(':'resource $result_identifier, int $row_number | bool','mssql_execute(':'resource $stmt [, bool $skip_results = false] | mixed','mssql_fetch_array(':'resource $result [, int $result_type = MSSQL_BOTH] | array','mssql_fetch_assoc(':'resource $result_id | array','mssql_fetch_batch(':'resource $result | int','mssql_fetch_field(':'resource $result [, int $field_offset = -1] | object','mssql_fetch_object(':'resource $result | object','mssql_fetch_row(':'resource $result | array','mssql_field_length(':'resource $result [, int $offset = -1] | int','mssql_field_name(':'resource $result [, int $offset = -1] | string','mssql_field_seek(':'resource $result, int $field_offset | bool','mssql_field_type(':'resource $result [, int $offset = -1] | string','mssql_free_result(':'resource $result | bool','mssql_free_statement(':'resource $stmt | bool','mssql_get_last_message(':'void | string','mssql_guid_string(':'string $binary [, bool $short_format = false] | string','mssql_init(':'string $sp_name [, resource $link_identifier] | resource','mssql_min_error_severity(':'int $severity | void','mssql_min_message_severity(':'int $severity | void','mssql_next_result(':'resource $result_id | bool','mssql_num_fields(':'resource $result | int','mssql_num_rows(':'resource $result | int','mssql_pconnect(':'[ string $servername [, string $username [, string $password [, bool $new_link = false]]]] | resource','mssql_query(':'string $query [, resource $link_identifier [, int $batch_size = 0]] | mixed','mssql_result(':'resource $result, int $row, mixed $field | string','mssql_rows_affected(':'resource $link_identifier | int','mssql_select_db(':'string $database_name [, resource $link_identifier] | bool',}
+let php_builtin['functions']['mysql']={'mysql_affected_rows(':'[ resource $link_identifier = NULL] | int','mysql_client_encoding(':'[ resource $link_identifier = NULL] | string','mysql_close(':'[ resource $link_identifier = NULL] | bool','mysql_connect(':'[ string $server = ini_get("mysql.default_host") [, string $username = ini_get("mysql.default_user") [, string $password = ini_get("mysql.default_password") [, bool $new_link = false [, int $client_flags = 0]]]]] | resource','mysql_create_db(':'string $database_name [, resource $link_identifier = NULL] | bool','mysql_data_seek(':'resource $result, int $row_number | bool','mysql_db_name(':'resource $result, int $row [, mixed $field = NULL] | string','mysql_db_query(':'string $database, string $query [, resource $link_identifier = NULL] | resource','mysql_drop_db(':'string $database_name [, resource $link_identifier = NULL] | bool','mysql_errno(':'[ resource $link_identifier = NULL] | int','mysql_error(':'[ resource $link_identifier = NULL] | string','mysql_escape_string(':'string $unescaped_string | string','mysql_fetch_array(':'resource $result [, int $result_type = MYSQL_BOTH] | array','mysql_fetch_assoc(':'resource $result | array','mysql_fetch_field(':'resource $result [, int $field_offset = 0] | object','mysql_fetch_lengths(':'resource $result | array','mysql_fetch_object(':'resource $result [, string $class_name [, array $params]] | object','mysql_fetch_row(':'resource $result | array','mysql_field_flags(':'resource $result, int $field_offset | string','mysql_field_len(':'resource $result, int $field_offset | int','mysql_field_name(':'resource $result, int $field_offset | string','mysql_field_seek(':'resource $result, int $field_offset | bool','mysql_field_table(':'resource $result, int $field_offset | string','mysql_field_type(':'resource $result, int $field_offset | string','mysql_free_result(':'resource $result | bool','mysql_get_client_info(':'void | string','mysql_get_host_info(':'[ resource $link_identifier = NULL] | string','mysql_get_proto_info(':'[ resource $link_identifier = NULL] | int','mysql_get_server_info(':'[ resource $link_identifier = NULL] | string','mysql_info(':'[ resource $link_identifier = NULL] | string','mysql_insert_id(':'[ resource $link_identifier = NULL] | int','mysql_list_dbs(':'[ resource $link_identifier = NULL] | resource','mysql_list_fields(':'string $database_name, string $table_name [, resource $link_identifier = NULL] | resource','mysql_list_processes(':'[ resource $link_identifier = NULL] | resource','mysql_list_tables(':'string $database [, resource $link_identifier = NULL] | resource','mysql_num_fields(':'resource $result | int','mysql_num_rows(':'resource $result | int','mysql_pconnect(':'[ string $server = ini_get("mysql.default_host") [, string $username = ini_get("mysql.default_user") [, string $password = ini_get("mysql.default_password") [, int $client_flags = 0]]]] | resource','mysql_ping(':'[ resource $link_identifier = NULL] | bool','mysql_query(':'string $query [, resource $link_identifier = NULL] | mixed','mysql_real_escape_string(':'string $unescaped_string [, resource $link_identifier = NULL] | string','mysql_result(':'resource $result, int $row [, mixed $field = 0] | string','mysql_select_db(':'string $database_name [, resource $link_identifier = NULL] | bool','mysql_set_charset(':'string $charset [, resource $link_identifier = NULL] | bool','mysql_stat(':'[ resource $link_identifier = NULL] | string','mysql_tablename(':'resource $result, int $i | string','mysql_thread_id(':'[ resource $link_identifier = NULL] | int','mysql_unbuffered_query(':'string $query [, resource $link_identifier = NULL] | resource',}
+let php_builtin['functions']['mysqli']={'mysqli_disable_reads_from_master(':'mysqli $link | bool','mysqli_disable_rpl_parse(':'mysqli $link | bool','mysqli_enable_reads_from_master(':'mysqli $link | bool','mysqli_enable_rpl_parse(':'mysqli $link | bool','mysqli_get_cache_stats(':'void | array','mysqli_master_query(':'mysqli $link, string $query | bool','mysqli_rpl_parse_enabled(':'mysqli $link | int','mysqli_rpl_probe(':'mysqli $link | bool','mysqli_slave_query(':'mysqli $link, string $query | bool',}
+let php_builtin['functions']['password_hashing']={'password_get_info(':'string $hash | array','password_hash(':'string $password, integer $algo [, array $options] | string','password_needs_rehash(':'string $hash, string $algo [, string $options] | boolean','password_verify(':'string $password, string $hash | boolean',}
+let php_builtin['functions']['postgresql']={'pg_affected_rows(':'resource $result | int','pg_cancel_query(':'resource $connection | bool','pg_client_encoding(':'[ resource $connection] | string','pg_close(':'[ resource $connection] | bool','pg_connect(':'string $connection_string [, int $connect_type] | resource','pg_connection_busy(':'resource $connection | bool','pg_connection_reset(':'resource $connection | bool','pg_connection_status(':'resource $connection | int','pg_convert(':'resource $connection, string $table_name, array $assoc_array [, int $options = 0] | array','pg_copy_from(':'resource $connection, string $table_name, array $rows [, string $delimiter [, string $null_as]] | bool','pg_copy_to(':'resource $connection, string $table_name [, string $delimiter [, string $null_as]] | array','pg_dbname(':'[ resource $connection] | string','pg_delete(':'resource $connection, string $table_name, array $assoc_array [, int $options = PGSQL_DML_EXEC] | mixed','pg_end_copy(':'[ resource $connection] | bool','pg_escape_bytea(':'[ resource $connection [, string $data]] | string','pg_escape_identifier(':'[ resource $connection [, string $data]] | string','pg_escape_literal(':'[ resource $connection [, string $data]] | string','pg_escape_string(':'[ resource $connection [, string $data]] | string','pg_execute(':'[ resource $connection [, string $stmtname [, array $params]]] | resource','pg_fetch_all_columns(':'resource $result [, int $column = 0] | array','pg_fetch_all(':'resource $result | array','pg_fetch_array(':'resource $result [, int $row [, int $result_type = PGSQL_BOTH]] | array','pg_fetch_assoc(':'resource $result [, int $row] | array','pg_fetch_object(':'resource $result [, int $row [, int $result_type = PGSQL_ASSOC]] | object','pg_fetch_result(':'resource $result, int $row, mixed $field | string','pg_fetch_row(':'resource $result [, int $row] | array','pg_field_is_null(':'resource $result, int $row, mixed $field | int','pg_field_name(':'resource $result, int $field_number | string','pg_field_num(':'resource $result, string $field_name | int','pg_field_prtlen(':'resource $result, int $row_number, mixed $field_name_or_number | int','pg_field_size(':'resource $result, int $field_number | int','pg_field_table(':'resource $result, int $field_number [, bool $oid_only = false] | mixed','pg_field_type_oid(':'resource $result, int $field_number | int','pg_field_type(':'resource $result, int $field_number | string','pg_free_result(':'resource $result | bool','pg_get_notify(':'resource $connection [, int $result_type] | array','pg_get_pid(':'resource $connection | int','pg_get_result(':'[ resource $connection] | resource','pg_host(':'[ resource $connection] | string','pg_insert(':'resource $connection, string $table_name, array $assoc_array [, int $options = PGSQL_DML_EXEC] | mixed','pg_last_error(':'[ resource $connection] | string','pg_last_notice(':'resource $connection | string','pg_last_oid(':'resource $result | string','pg_lo_close(':'resource $large_object | bool','pg_lo_create(':'[ resource $connection [, mixed $object_id]] | int','pg_lo_export(':'[ resource $connection [, int $oid [, string $pathname]]] | bool','pg_lo_import(':'[ resource $connection [, string $pathname [, mixed $object_id]]] | int','pg_lo_open(':'resource $connection, int $oid, string $mode | resource','pg_lo_read_all(':'resource $large_object | int','pg_lo_read(':'resource $large_object [, int $len = 8192] | string','pg_lo_seek(':'resource $large_object, int $offset [, int $whence = PGSQL_SEEK_CUR] | bool','pg_lo_tell(':'resource $large_object | int','pg_lo_truncate(':'resource $large_object, int $size | bool','pg_lo_unlink(':'resource $connection, int $oid | bool','pg_lo_write(':'resource $large_object, string $data [, int $len] | int','pg_meta_data(':'resource $connection, string $table_name [, bool $extended] | array','pg_num_fields(':'resource $result | int','pg_num_rows(':'resource $result | int','pg_options(':'[ resource $connection] | string','pg_parameter_status(':'[ resource $connection [, string $param_name]] | string','pg_pconnect(':'string $connection_string [, int $connect_type] | resource','pg_ping(':'[ resource $connection] | bool','pg_port(':'[ resource $connection] | int','pg_prepare(':'[ resource $connection [, string $stmtname [, string $query]]] | resource','pg_put_line(':'[ resource $connection [, string $data]] | bool','pg_query_params(':'[ resource $connection [, string $query [, array $params]]] | resource','pg_query(':'[ resource $connection [, string $query]] | resource','pg_result_error_field(':'resource $result, int $fieldcode | string','pg_result_error(':'resource $result | string','pg_result_seek(':'resource $result, int $offset | bool','pg_result_status(':'resource $result [, int $type = PGSQL_STATUS_LONG] | mixed','pg_select(':'resource $connection, string $table_name, array $assoc_array [, int $options = PGSQL_DML_EXEC] | mixed','pg_send_execute(':'resource $connection, string $stmtname, array $params | bool','pg_send_prepare(':'resource $connection, string $stmtname, string $query | bool','pg_send_query_params(':'resource $connection, string $query, array $params | bool','pg_send_query(':'resource $connection, string $query | bool','pg_set_client_encoding(':'[ resource $connection [, string $encoding]] | int','pg_set_error_verbosity(':'[ resource $connection [, int $verbosity]] | int','pg_trace(':'string $pathname [, string $mode = "w" [, resource $connection]] | bool','pg_transaction_status(':'resource $connection | int','pg_tty(':'[ resource $connection] | string','pg_unescape_bytea(':'string $data | string','pg_untrace(':'[ resource $connection] | bool','pg_update(':'resource $connection, string $table_name, array $data, array $condition [, int $options = PGSQL_DML_EXEC] | mixed','pg_version(':'[ resource $connection] | array',}
+let php_builtin['functions']['pcre']={'preg_filter(':'mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int &$count]] | mixed','preg_grep(':'string $pattern, array $input [, int $flags = 0] | array','preg_last_error(':'void | int','preg_match_all(':'string $pattern, string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0]]] | int','preg_match(':'string $pattern, string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0]]] | int','preg_quote(':'string $str [, string $delimiter = NULL] | string','preg_replace_callback(':'mixed $pattern, callable $callback, mixed $subject [, int $limit = -1 [, int &$count]] | mixed','preg_replace(':'mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int &$count]] | mixed','preg_split(':'string $pattern, string $subject [, int $limit = -1 [, int $flags = 0]] | array',}
+let php_builtin['functions']['sessions']={'session_cache_expire(':'[ string $new_cache_expire] | int','session_cache_limiter(':'[ string $cache_limiter] | string','session_commit(':'session_commit — Alias of session_write_close()','session_decode(':'string $data | bool','session_destroy(':'void | bool','session_encode(':'void | string','session_get_cookie_params(':'void | array','session_id(':'[ string $id] | string','session_is_registered(':'string $name | bool','session_module_name(':'[ string $module] | string','session_name(':'[ string $name] | string','session_regenerate_id(':'[ bool $delete_old_session = false] | bool','session_register_shutdown(':'void | void','session_register(':'mixed $name [, mixed $...] | bool','session_save_path(':'[ string $path] | string','session_set_cookie_params(':'int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false]]]] | void','session_set_save_handler(':'callable $open, callable $close, callable $read, callable $write, callable $destroy, callable $gc | bool','session_start(':'void | bool','session_status(':'void | int','session_unregister(':'string $name | bool','session_unset(':'void | void','session_write_close(':'void | void',}
+let php_builtin['functions']['streams']={'set_socket_blocking(':'set_socket_blocking — Alias of stream_set_blocking()','stream_bucket_append(':'resource $brigade, resource $bucket | void','stream_bucket_make_writeable(':'resource $brigade | object','stream_bucket_new(':'resource $stream, string $buffer | object','stream_bucket_prepend(':'resource $brigade, resource $bucket | void','stream_context_create(':'[ array $options [, array $params]] | resource','stream_context_get_default(':'[ array $options] | resource','stream_context_get_options(':'resource $stream_or_context | array','stream_context_get_params(':'resource $stream_or_context | array','stream_context_set_default(':'array $options | resource','stream_context_set_option(':'resource $stream_or_context, string $wrapper, string $option, mixed $value | bool','stream_context_set_params(':'resource $stream_or_context, array $params | bool','stream_copy_to_stream(':'resource $source, resource $dest [, int $maxlength = -1 [, int $offset = 0]] | int','stream_encoding(':'resource $stream [, string $encoding] | bool','stream_filter_append(':'resource $stream, string $filtername [, int $read_write [, mixed $params]] | resource','stream_filter_prepend(':'resource $stream, string $filtername [, int $read_write [, mixed $params]] | resource','stream_filter_register(':'string $filtername, string $classname | bool','stream_filter_remove(':'resource $stream_filter | bool','stream_get_contents(':'resource $handle [, int $maxlength = -1 [, int $offset = -1]] | string','stream_get_filters(':'void | array','stream_get_line(':'resource $handle, int $length [, string $ending] | string','stream_get_meta_data(':'resource $stream | array','stream_get_transports(':'void | array','stream_get_wrappers(':'void | array','stream_is_local(':'mixed $stream_or_url | bool','stream_notification_callback(':'int $notification_code, int $severity, string $message, int $message_code, int $bytes_transferred, int $bytes_max | void','stream_resolve_include_path(':'string $filename | string','stream_select(':'array &$read, array &$write, array &$except, int $tv_sec [, int $tv_usec = 0] | int','stream_set_blocking(':'resource $stream, int $mode | bool','stream_set_chunk_size(':'resource $fp, int $chunk_size | int','stream_set_read_buffer(':'resource $stream, int $buffer | int','stream_set_timeout(':'resource $stream, int $seconds [, int $microseconds = 0] | bool','stream_set_write_buffer(':'resource $stream, int $buffer | int','stream_socket_accept(':'resource $server_socket [, float $timeout = ini_get("default_socket_timeout") [, string &$peername]] | resource','stream_socket_client(':'string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context]]]]] | resource','stream_socket_enable_crypto(':'resource $stream, bool $enable [, int $crypto_type [, resource $session_stream]] | mixed','stream_socket_get_name(':'resource $handle, bool $want_peer | string','stream_socket_pair(':'int $domain, int $type, int $protocol | array','stream_socket_recvfrom(':'resource $socket, int $length [, int $flags = 0 [, string &$address]] | string','stream_socket_sendto(':'resource $socket, string $data [, int $flags = 0 [, string $address]] | int','stream_socket_server(':'string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context]]]] | resource','stream_socket_shutdown(':'resource $stream, int $how | bool','stream_supports_lock(':'resource $stream | bool','stream_wrapper_register(':'string $protocol, string $classname [, int $flags = 0] | bool','stream_wrapper_restore(':'string $protocol | bool','stream_wrapper_unregister(':'string $protocol | bool',}
+let php_builtin['functions']['simplexml']={'simplexml_import_dom(':'DOMNode $node [, string $class_name = "SimpleXMLElement"] | SimpleXMLElement','simplexml_load_file(':'string $filename [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false]]]] | SimpleXMLElement','simplexml_load_string(':'string $data [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false]]]] | SimpleXMLElement',}
+let php_builtin['functions']['xmlwriter']={'xmlwriter_end_attribute(':'resource $xmlwriter | bool','xmlwriter_end_cdata(':'resource $xmlwriter | bool','xmlwriter_end_comment(':'resource $xmlwriter | bool','xmlwriter_end_document(':'resource $xmlwriter | bool','xmlwriter_end_dtd_attlist(':'resource $xmlwriter | bool','xmlwriter_end_dtd_element(':'resource $xmlwriter | bool','xmlwriter_end_dtd_entity(':'resource $xmlwriter | bool','xmlwriter_end_dtd(':'resource $xmlwriter | bool','xmlwriter_end_element(':'resource $xmlwriter | bool','xmlwriter_end_pi(':'resource $xmlwriter | bool','xmlwriter_flush(':'resource $xmlwriter [, bool $empty = true] | mixed','xmlwriter_full_end_element(':'resource $xmlwriter | bool','xmlwriter_open_memory(':'void | resource','xmlwriter_open_uri(':'string $uri | resource','xmlwriter_output_memory(':'resource $xmlwriter [, bool $flush = true] | string','xmlwriter_set_indent_string(':'resource $xmlwriter, string $indentString | bool','xmlwriter_set_indent(':'resource $xmlwriter, bool $indent | bool','xmlwriter_start_attribute_ns(':'resource $xmlwriter, string $prefix, string $name, string $uri | bool','xmlwriter_start_attribute(':'resource $xmlwriter, string $name | bool','xmlwriter_start_cdata(':'resource $xmlwriter | bool','xmlwriter_start_comment(':'resource $xmlwriter | bool','xmlwriter_start_document(':'resource $xmlwriter [, string $version = 1.0 [, string $encoding = NULL [, string $standalone]]] | bool','xmlwriter_start_dtd_attlist(':'resource $xmlwriter, string $name | bool','xmlwriter_start_dtd_element(':'resource $xmlwriter, string $qualifiedName | bool','xmlwriter_start_dtd_entity(':'resource $xmlwriter, string $name, bool $isparam | bool','xmlwriter_start_dtd(':'resource $xmlwriter, string $qualifiedName [, string $publicId [, string $systemId]] | bool','xmlwriter_start_element_ns(':'resource $xmlwriter, string $prefix, string $name, string $uri | bool','xmlwriter_start_element(':'resource $xmlwriter, string $name | bool','xmlwriter_start_pi(':'resource $xmlwriter, string $target | bool','xmlwriter_text(':'resource $xmlwriter, string $content | bool','xmlwriter_write_attribute_ns(':'resource $xmlwriter, string $prefix, string $name, string $uri, string $content | bool','xmlwriter_write_attribute(':'resource $xmlwriter, string $name, string $value | bool','xmlwriter_write_cdata(':'resource $xmlwriter, string $content | bool','xmlwriter_write_comment(':'resource $xmlwriter, string $content | bool','xmlwriter_write_dtd_attlist(':'resource $xmlwriter, string $name, string $content | bool','xmlwriter_write_dtd_element(':'resource $xmlwriter, string $name, string $content | bool','xmlwriter_write_dtd_entity(':'resource $xmlwriter, string $name, string $content, bool $pe, string $pubid, string $sysid, string $ndataid | bool','xmlwriter_write_dtd(':'resource $xmlwriter, string $name [, string $publicId [, string $systemId [, string $subset]]] | bool','xmlwriter_write_element_ns(':'resource $xmlwriter, string $prefix, string $name, string $uri [, string $content] | bool','xmlwriter_write_element(':'resource $xmlwriter, string $name [, string $content] | bool','xmlwriter_write_pi(':'resource $xmlwriter, string $target, string $content | bool','xmlwriter_write_raw(':'resource $xmlwriter, string $content | bool',}
+let php_builtin['functions']['zip']={'zip_close(':'resource $zip | void','zip_entry_close(':'resource $zip_entry | bool','zip_entry_compressedsize(':'resource $zip_entry | int','zip_entry_compressionmethod(':'resource $zip_entry | string','zip_entry_filesize(':'resource $zip_entry | int','zip_entry_name(':'resource $zip_entry | string','zip_entry_open(':'resource $zip, resource $zip_entry [, string $mode] | bool','zip_entry_read(':'resource $zip_entry [, int $length = 1024] | string','zip_open(':'string $filename | resource','zip_read(':'resource $zip | resource',}
+let php_builtin['classes']['spl']={'appenditerator':{'name':'AppendIterator','methods':{'__construct':{'signature':'Traversable $iterator','return_type':''},'append':{'signature':'Iterator $iterator | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'getArrayIterator':{'signature':'void | void','return_type':'void'},'getInnerIterator':{'signature':'void | Traversable','return_type':'Traversable'},'getIteratorIndex':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'arrayiterator':{'name':'ArrayIterator','methods':{'append':{'signature':'mixed $value | void','return_type':'void'},'asort':{'signature':'void | void','return_type':'void'},'__construct':{'signature':'[ mixed $array = array() [, int $flags = 0]]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getArrayCopy':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | mixed','return_type':'mixed'},'ksort':{'signature':'void | void','return_type':'void'},'natcasesort':{'signature':'void | void','return_type':'void'},'natsort':{'signature':'void | void','return_type':'void'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'string $index | void','return_type':'void'},'offsetGet':{'signature':'string $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'string $index, string $newval | void','return_type':'void'},'offsetUnset':{'signature':'string $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $position | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'setFlags':{'signature':'string $flags | void','return_type':'void'},'uasort':{'signature':'string $cmp_function | void','return_type':'void'},'uksort':{'signature':'string $cmp_function | void','return_type':'void'},'unserialize':{'signature':'string $serialized | string','return_type':'string'},'valid':{'signature':'void | bool','return_type':'bool'},},},'arrayobject':{'name':'ArrayObject','constants':{'STD_PROP_LIST':'1','ARRAY_AS_PROPS':'2',},'methods':{'__construct':{'signature':'[ mixed $input = [] [, int $flags = 0 [, string $iterator_class = "ArrayIterator"]]]','return_type':''},'append':{'signature':'mixed $value | void','return_type':'void'},'asort':{'signature':'void | void','return_type':'void'},'count':{'signature':'void | int','return_type':'int'},'exchangeArray':{'signature':'mixed $input | array','return_type':'array'},'getArrayCopy':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | int','return_type':'int'},'getIterator':{'signature':'void | ArrayIterator','return_type':'ArrayIterator'},'getIteratorClass':{'signature':'void | string','return_type':'string'},'ksort':{'signature':'void | void','return_type':'void'},'natcasesort':{'signature':'void | void','return_type':'void'},'natsort':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'mixed $index | bool','return_type':'bool'},'offsetGet':{'signature':'mixed $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'mixed $index | void','return_type':'void'},'serialize':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setIteratorClass':{'signature':'string $iterator_class | void','return_type':'void'},'uasort':{'signature':'callable $cmp_function | void','return_type':'void'},'uksort':{'signature':'callable $cmp_function | void','return_type':'void'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},},},'badfunctioncallexception':{'name':'BadFunctionCallException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'badmethodcallexception':{'name':'BadMethodCallException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'cachingiterator':{'name':'CachingIterator','constants':{'CALL_TOSTRING':'1','CATCH_GET_CHILD':'16','TOSTRING_USE_KEY':'2','TOSTRING_USE_CURRENT':'4','TOSTRING_USE_INNER':'8','FULL_CACHE':'256',},'methods':{'__construct':{'signature':'Iterator $iterator [, string $flags = self::CALL_TOSTRING]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | void','return_type':'void'},'getCache':{'signature':'void | void','return_type':'void'},'getFlags':{'signature':'void | void','return_type':'void'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'hasNext':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'string $index | void','return_type':'void'},'offsetGet':{'signature':'string $index | void','return_type':'void'},'offsetSet':{'signature':'string $index, string $newval | void','return_type':'void'},'offsetUnset':{'signature':'string $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'bitmask $flags | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | void','return_type':'void'},},},'callbackfilteriterator':{'name':'CallbackFilterIterator','methods':{'__construct':{'signature':'Iterator $iterator','return_type':''},'accept':{'signature':'void | bool','return_type':'bool'},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'directoryiterator':{'name':'DirectoryIterator','methods':{'__construct':{'signature':'string $path','return_type':''},'current':{'signature':'void | DirectoryIterator','return_type':'DirectoryIterator'},'getATime':{'signature':'void | int','return_type':'int'},'getBasename':{'signature':'[ string $suffix] | string','return_type':'string'},'getCTime':{'signature':'void | int','return_type':'int'},'getExtension':{'signature':'void | string','return_type':'string'},'getFilename':{'signature':'void | string','return_type':'string'},'getGroup':{'signature':'void | int','return_type':'int'},'getInode':{'signature':'void | int','return_type':'int'},'getMTime':{'signature':'void | int','return_type':'int'},'getOwner':{'signature':'void | int','return_type':'int'},'getPath':{'signature':'void | string','return_type':'string'},'getPathname':{'signature':'void | string','return_type':'string'},'getPerms':{'signature':'void | int','return_type':'int'},'getSize':{'signature':'void | int','return_type':'int'},'getType':{'signature':'void | string','return_type':'string'},'isDir':{'signature':'void | bool','return_type':'bool'},'isDot':{'signature':'void | bool','return_type':'bool'},'isExecutable':{'signature':'void | bool','return_type':'bool'},'isFile':{'signature':'void | bool','return_type':'bool'},'isLink':{'signature':'void | bool','return_type':'bool'},'isReadable':{'signature':'void | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | string','return_type':'string'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $position | void','return_type':'void'},'__toString':{'signature':'void | string','return_type':'string'},'valid':{'signature':'void | bool','return_type':'bool'},},},'domainexception':{'name':'DomainException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'emptyiterator':{'name':'EmptyIterator','methods':{'current':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | void','return_type':'void'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | void','return_type':'void'},},},'filesystemiterator':{'name':'FilesystemIterator','constants':{'CURRENT_AS_PATHNAME':'32','CURRENT_AS_FILEINFO':'0','CURRENT_AS_SELF':'16','CURRENT_MODE_MASK':'240','KEY_AS_PATHNAME':'0','KEY_AS_FILENAME':'256','FOLLOW_SYMLINKS':'512','KEY_MODE_MASK':'3840','NEW_CURRENT_AND_KEY':'256','SKIP_DOTS':'4096','UNIX_PATHS':'8192',},'methods':{'__construct':{'signature':'string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS]','return_type':''},'current':{'signature':'void | DirectoryIterator','return_type':'DirectoryIterator'},'getFlags':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | string','return_type':'string'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'[ int $flags] | void','return_type':'void'},'getATime':{'signature':'void | int','return_type':'int'},'getBasename':{'signature':'[ string $suffix] | string','return_type':'string'},'getCTime':{'signature':'void | int','return_type':'int'},'getExtension':{'signature':'void | string','return_type':'string'},'getFilename':{'signature':'void | string','return_type':'string'},'getGroup':{'signature':'void | int','return_type':'int'},'getInode':{'signature':'void | int','return_type':'int'},'getMTime':{'signature':'void | int','return_type':'int'},'getOwner':{'signature':'void | int','return_type':'int'},'getPath':{'signature':'void | string','return_type':'string'},'getPathname':{'signature':'void | string','return_type':'string'},'getPerms':{'signature':'void | int','return_type':'int'},'getSize':{'signature':'void | int','return_type':'int'},'getType':{'signature':'void | string','return_type':'string'},'isDir':{'signature':'void | bool','return_type':'bool'},'isDot':{'signature':'void | bool','return_type':'bool'},'isExecutable':{'signature':'void | bool','return_type':'bool'},'isFile':{'signature':'void | bool','return_type':'bool'},'isLink':{'signature':'void | bool','return_type':'bool'},'isReadable':{'signature':'void | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'seek':{'signature':'int $position | void','return_type':'void'},'__toString':{'signature':'void | string','return_type':'string'},'valid':{'signature':'void | bool','return_type':'bool'},},},'filteriterator':{'name':'FilterIterator','methods':{'accept':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'Iterator $iterator','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'globiterator':{'name':'GlobIterator','methods':{'__construct':{'signature':'string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getFlags':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | string','return_type':'string'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'[ int $flags] | void','return_type':'void'},},},'infiniteiterator':{'name':'InfiniteIterator','methods':{'__construct':{'signature':'Traversable $iterator','return_type':''},'next':{'signature':'void | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Traversable','return_type':'Traversable'},'key':{'signature':'void | scalar','return_type':'scalar'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'invalidargumentexception':{'name':'InvalidArgumentException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'iteratoriterator':{'name':'IteratorIterator','methods':{'__construct':{'signature':'Traversable $iterator','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Traversable','return_type':'Traversable'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'lengthexception':{'name':'LengthException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'limititerator':{'name':'LimitIterator','methods':{'__construct':{'signature':'Iterator $iterator [, int $offset = 0 [, int $count = -1]]','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'getPosition':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $position | int','return_type':'int'},'valid':{'signature':'void | bool','return_type':'bool'},},},'logicexception':{'name':'LogicException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'multipleiterator':{'name':'MultipleIterator','constants':{'MIT_NEED_ANY':'0','MIT_NEED_ALL':'1','MIT_KEYS_NUMERIC':'0','MIT_KEYS_ASSOC':'2',},'methods':{'__construct':{'signature':'[ int $flags = MultipleIterator::MIT_NEED_ALL|MultipleIterator::MIT_KEYS_NUMERIC]','return_type':''},'attachIterator':{'signature':'Iterator $iterator [, string $infos] | void','return_type':'void'},'containsIterator':{'signature':'Iterator $iterator | void','return_type':'void'},'countIterators':{'signature':'void | void','return_type':'void'},'current':{'signature':'void | array','return_type':'array'},'detachIterator':{'signature':'Iterator $iterator | void','return_type':'void'},'getFlags':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | array','return_type':'array'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'valid':{'signature':'void | void','return_type':'void'},},},'norewinditerator':{'name':'NoRewindIterator','methods':{'__construct':{'signature':'Traversable $iterator','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Traversable','return_type':'Traversable'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'outofboundsexception':{'name':'OutOfBoundsException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'outofrangeexception':{'name':'OutOfRangeException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'overflowexception':{'name':'OverflowException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'parentiterator':{'name':'ParentIterator','methods':{'accept':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'RecursiveIterator $iterator','return_type':''},'getChildren':{'signature':'void | ParentIterator','return_type':'ParentIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},},},'rangeexception':{'name':'RangeException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'recursivearrayiterator':{'name':'RecursiveArrayIterator','methods':{'getChildren':{'signature':'void | RecursiveArrayIterator','return_type':'RecursiveArrayIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'append':{'signature':'mixed $value | void','return_type':'void'},'asort':{'signature':'void | void','return_type':'void'},'__construct':{'signature':'[ mixed $array = array() [, int $flags = 0]]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getArrayCopy':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | mixed','return_type':'mixed'},'ksort':{'signature':'void | void','return_type':'void'},'natcasesort':{'signature':'void | void','return_type':'void'},'natsort':{'signature':'void | void','return_type':'void'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'string $index | void','return_type':'void'},'offsetGet':{'signature':'string $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'string $index, string $newval | void','return_type':'void'},'offsetUnset':{'signature':'string $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $position | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'setFlags':{'signature':'string $flags | void','return_type':'void'},'uasort':{'signature':'string $cmp_function | void','return_type':'void'},'uksort':{'signature':'string $cmp_function | void','return_type':'void'},'unserialize':{'signature':'string $serialized | string','return_type':'string'},'valid':{'signature':'void | bool','return_type':'bool'},},},'recursivecachingiterator':{'name':'RecursiveCachingIterator','methods':{'__construct':{'signature':'Iterator $iterator [, string $flags = self::CALL_TOSTRING]','return_type':''},'getChildren':{'signature':'void | RecursiveCachingIterator','return_type':'RecursiveCachingIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | void','return_type':'void'},'getCache':{'signature':'void | void','return_type':'void'},'getFlags':{'signature':'void | void','return_type':'void'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'hasNext':{'signature':'void | void','return_type':'void'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'string $index | void','return_type':'void'},'offsetGet':{'signature':'string $index | void','return_type':'void'},'offsetSet':{'signature':'string $index, string $newval | void','return_type':'void'},'offsetUnset':{'signature':'string $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setFlags':{'signature':'bitmask $flags | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | void','return_type':'void'},},},'recursivecallbackfilteriterator':{'name':'RecursiveCallbackFilterIterator','methods':{'__construct':{'signature':'RecursiveIterator $iterator, string $callback','return_type':''},'getChildren':{'signature':'void | RecursiveCallbackFilterIterator','return_type':'RecursiveCallbackFilterIterator'},'hasChildren':{'signature':'void | void','return_type':'void'},'accept':{'signature':'void | string','return_type':'string'},},},'recursivedirectoryiterator':{'name':'RecursiveDirectoryIterator','methods':{'__construct':{'signature':'string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS]','return_type':''},'getChildren':{'signature':'void | mixed','return_type':'mixed'},'getSubPath':{'signature':'void | string','return_type':'string'},'getSubPathname':{'signature':'void | string','return_type':'string'},'hasChildren':{'signature':'[ bool $allow_links = false] | bool','return_type':'bool'},'key':{'signature':'void | string','return_type':'string'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'getFlags':{'signature':'void | int','return_type':'int'},'setFlags':{'signature':'[ int $flags] | void','return_type':'void'},},},'recursivefilteriterator':{'name':'RecursiveFilterIterator','methods':{'__construct':{'signature':'Iterator $iterator','return_type':''},'getChildren':{'signature':'void | void','return_type':'void'},'hasChildren':{'signature':'void | void','return_type':'void'},'accept':{'signature':'void | bool','return_type':'bool'},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'recursiveiteratoriterator':{'name':'RecursiveIteratorIterator','constants':{'LEAVES_ONLY':'0','SELF_FIRST':'1','CHILD_FIRST':'2','CATCH_GET_CHILD':'16',},'methods':{'beginChildren':{'signature':'void | void','return_type':'void'},'beginIteration':{'signature':'void | void','return_type':'void'},'callGetChildren':{'signature':'void | RecursiveIterator','return_type':'RecursiveIterator'},'callHasChildren':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'Traversable $iterator [, int $mode = RecursiveIteratorIterator::LEAVES_ONLY [, int $flags = 0]]','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'endChildren':{'signature':'void | void','return_type':'void'},'endIteration':{'signature':'void | void','return_type':'void'},'getDepth':{'signature':'void | int','return_type':'int'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'getMaxDepth':{'signature':'void | mixed','return_type':'mixed'},'getSubIterator':{'signature':'[ int $level] | RecursiveIterator','return_type':'RecursiveIterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'nextElement':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setMaxDepth':{'signature':'[ string $max_depth = -1] | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'recursiveregexiterator':{'name':'RecursiveRegexIterator','methods':{'__construct':{'signature':'RecursiveIterator $iterator, string $regex [, int $mode = self::MATCH [, int $flags = 0 [, int $preg_flags = 0]]]','return_type':''},'getChildren':{'signature':'void | RecursiveIterator','return_type':'RecursiveIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'accept':{'signature':'void | bool','return_type':'bool'},'getFlags':{'signature':'void | int','return_type':'int'},'getMode':{'signature':'void | int','return_type':'int'},'getPregFlags':{'signature':'void | int','return_type':'int'},'getRegex':{'signature':'void | string','return_type':'string'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setMode':{'signature':'int $mode | void','return_type':'void'},'setPregFlags':{'signature':'int $preg_flags | void','return_type':'void'},},},'recursivetreeiterator':{'name':'RecursiveTreeIterator','constants':{'BYPASS_CURRENT':'4','BYPASS_KEY':'8','PREFIX_LEFT':'0','PREFIX_MID_HAS_NEXT':'1','PREFIX_MID_LAST':'2','PREFIX_END_HAS_NEXT':'3','PREFIX_END_LAST':'4','PREFIX_RIGHT':'5',},'methods':{'beginChildren':{'signature':'void | void','return_type':'void'},'beginIteration':{'signature':'void | void','return_type':'void'},'callGetChildren':{'signature':'void | RecursiveIterator','return_type':'RecursiveIterator'},'callHasChildren':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'Traversable $iterator [, int $mode = RecursiveIteratorIterator::LEAVES_ONLY [, int $flags = 0]]','return_type':''},'current':{'signature':'void | mixed','return_type':'mixed'},'endChildren':{'signature':'void | void','return_type':'void'},'endIteration':{'signature':'void | void','return_type':'void'},'getEntry':{'signature':'void | string','return_type':'string'},'getPostfix':{'signature':'void | void','return_type':'void'},'getPrefix':{'signature':'void | string','return_type':'string'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'nextElement':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setPrefixPart':{'signature':'int $part, string $value | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},'getDepth':{'signature':'void | int','return_type':'int'},'getInnerIterator':{'signature':'void | iterator','return_type':'iterator'},'getMaxDepth':{'signature':'void | mixed','return_type':'mixed'},'getSubIterator':{'signature':'[ int $level] | RecursiveIterator','return_type':'RecursiveIterator'},'setMaxDepth':{'signature':'[ string $max_depth = -1] | void','return_type':'void'},},},'regexiterator':{'name':'RegexIterator','constants':{'MATCH':'0','GET_MATCH':'1','ALL_MATCHES':'2','SPLIT':'3','REPLACE':'4','USE_KEY':'1',},'methods':{'__construct':{'signature':'Iterator $iterator','return_type':''},'accept':{'signature':'void | bool','return_type':'bool'},'getFlags':{'signature':'void | int','return_type':'int'},'getMode':{'signature':'void | int','return_type':'int'},'getPregFlags':{'signature':'void | int','return_type':'int'},'getRegex':{'signature':'void | string','return_type':'string'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setMode':{'signature':'int $mode | void','return_type':'void'},'setPregFlags':{'signature':'int $preg_flags | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'runtimeexception':{'name':'RuntimeException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'spldoublylinkedlist':{'name':'SplDoublyLinkedList','methods':{'__construct':{'signature':'void','return_type':''},'bottom':{'signature':'void | mixed','return_type':'mixed'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getIteratorMode':{'signature':'void | int','return_type':'int'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'mixed $index | bool','return_type':'bool'},'offsetGet':{'signature':'mixed $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'mixed $index | void','return_type':'void'},'pop':{'signature':'void | mixed','return_type':'mixed'},'prev':{'signature':'void | void','return_type':'void'},'push':{'signature':'mixed $value | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'setIteratorMode':{'signature':'int $mode | void','return_type':'void'},'shift':{'signature':'void | mixed','return_type':'mixed'},'top':{'signature':'void | mixed','return_type':'mixed'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},'unshift':{'signature':'mixed $value | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splfileinfo':{'name':'SplFileInfo','methods':{'__construct':{'signature':'string $file_name','return_type':''},'getATime':{'signature':'void | int','return_type':'int'},'getBasename':{'signature':'[ string $suffix] | string','return_type':'string'},'getCTime':{'signature':'void | int','return_type':'int'},'getExtension':{'signature':'void | string','return_type':'string'},'getFileInfo':{'signature':'[ string $class_name] | SplFileInfo','return_type':'SplFileInfo'},'getFilename':{'signature':'void | string','return_type':'string'},'getGroup':{'signature':'void | int','return_type':'int'},'getInode':{'signature':'void | int','return_type':'int'},'getLinkTarget':{'signature':'void | string','return_type':'string'},'getMTime':{'signature':'void | int','return_type':'int'},'getOwner':{'signature':'void | int','return_type':'int'},'getPath':{'signature':'void | string','return_type':'string'},'getPathInfo':{'signature':'[ string $class_name] | SplFileInfo','return_type':'SplFileInfo'},'getPathname':{'signature':'void | string','return_type':'string'},'getPerms':{'signature':'void | int','return_type':'int'},'getRealPath':{'signature':'void | string','return_type':'string'},'getSize':{'signature':'void | int','return_type':'int'},'getType':{'signature':'void | string','return_type':'string'},'isDir':{'signature':'void | bool','return_type':'bool'},'isExecutable':{'signature':'void | bool','return_type':'bool'},'isFile':{'signature':'void | bool','return_type':'bool'},'isLink':{'signature':'void | bool','return_type':'bool'},'isReadable':{'signature':'void | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'openFile':{'signature':'[ string $open_mode = r [, bool $use_include_path = false [, resource $context = NULL]]] | SplFileObject','return_type':'SplFileObject'},'setFileClass':{'signature':'[ string $class_name] | void','return_type':'void'},'setInfoClass':{'signature':'[ string $class_name] | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},},},'splfileobject':{'name':'SplFileObject','constants':{'DROP_NEW_LINE':'1','READ_AHEAD':'2','SKIP_EMPTY':'4','READ_CSV':'8',},'methods':{'__construct':{'signature':'string $file_name','return_type':''},'current':{'signature':'void | string|array','return_type':'string|array'},'eof':{'signature':'void | bool','return_type':'bool'},'fflush':{'signature':'void | bool','return_type':'bool'},'fgetc':{'signature':'void | string','return_type':'string'},'fgetcsv':{'signature':'[ string $delimiter = "," [, string $enclosure = "\"" [, string $escape = "\\"]]] | array','return_type':'array'},'fgets':{'signature':'void | string','return_type':'string'},'fgetss':{'signature':'[ string $allowable_tags] | string','return_type':'string'},'flock':{'signature':'int $operation [, int &$wouldblock] | bool','return_type':'bool'},'fpassthru':{'signature':'void | int','return_type':'int'},'fputcsv':{'signature':'array $fields [, string $delimiter = '','' [, string $enclosure = ''"'']] | int','return_type':'int'},'fscanf':{'signature':'string $format [, mixed &$...] | mixed','return_type':'mixed'},'fseek':{'signature':'int $offset [, int $whence = SEEK_SET] | int','return_type':'int'},'fstat':{'signature':'void | array','return_type':'array'},'ftell':{'signature':'void | int','return_type':'int'},'ftruncate':{'signature':'int $size | bool','return_type':'bool'},'fwrite':{'signature':'string $str [, int $length] | int','return_type':'int'},'getChildren':{'signature':'void | void','return_type':'void'},'getCsvControl':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | int','return_type':'int'},'getMaxLineLen':{'signature':'void | int','return_type':'int'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | int','return_type':'int'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $line_pos | void','return_type':'void'},'setCsvControl':{'signature':'[ string $delimiter = "," [, string $enclosure = "\"" [, string $escape = "\\"]]] | void','return_type':'void'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setMaxLineLen':{'signature':'int $max_len | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},'getATime':{'signature':'void | int','return_type':'int'},'getBasename':{'signature':'[ string $suffix] | string','return_type':'string'},'getCTime':{'signature':'void | int','return_type':'int'},'getExtension':{'signature':'void | string','return_type':'string'},'getFileInfo':{'signature':'[ string $class_name] | SplFileInfo','return_type':'SplFileInfo'},'getFilename':{'signature':'void | string','return_type':'string'},'getGroup':{'signature':'void | int','return_type':'int'},'getInode':{'signature':'void | int','return_type':'int'},'getLinkTarget':{'signature':'void | string','return_type':'string'},'getMTime':{'signature':'void | int','return_type':'int'},'getOwner':{'signature':'void | int','return_type':'int'},'getPath':{'signature':'void | string','return_type':'string'},'getPathInfo':{'signature':'[ string $class_name] | SplFileInfo','return_type':'SplFileInfo'},'getPathname':{'signature':'void | string','return_type':'string'},'getPerms':{'signature':'void | int','return_type':'int'},'getRealPath':{'signature':'void | string','return_type':'string'},'getSize':{'signature':'void | int','return_type':'int'},'getType':{'signature':'void | string','return_type':'string'},'isDir':{'signature':'void | bool','return_type':'bool'},'isExecutable':{'signature':'void | bool','return_type':'bool'},'isFile':{'signature':'void | bool','return_type':'bool'},'isLink':{'signature':'void | bool','return_type':'bool'},'isReadable':{'signature':'void | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'openFile':{'signature':'[ string $open_mode = r [, bool $use_include_path = false [, resource $context = NULL]]] | SplFileObject','return_type':'SplFileObject'},'setFileClass':{'signature':'[ string $class_name] | void','return_type':'void'},'setInfoClass':{'signature':'[ string $class_name] | void','return_type':'void'},},},'splfixedarray':{'name':'SplFixedArray','methods':{'__construct':{'signature':'[ int $size = 0]','return_type':''},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getSize':{'signature':'void | int','return_type':'int'},'key':{'signature':'void | int','return_type':'int'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'int $index | bool','return_type':'bool'},'offsetGet':{'signature':'int $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'int $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'int $index | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setSize':{'signature':'int $size | int','return_type':'int'},'toArray':{'signature':'void | array','return_type':'array'},'valid':{'signature':'void | bool','return_type':'bool'},'__wakeup':{'signature':'void | void','return_type':'void'},},'static_methods':{'fromArray':{'signature':'array $array [, bool $save_indexes = true] | SplFixedArray','return_type':'SplFixedArray'},},},'splheap':{'name':'SplHeap','methods':{'__construct':{'signature':'void','return_type':''},'compare':{'signature':'mixed $value1, mixed $value2 | int','return_type':'int'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'extract':{'signature':'void | mixed','return_type':'mixed'},'insert':{'signature':'mixed $value | void','return_type':'void'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'recoverFromCorruption':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'top':{'signature':'void | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splmaxheap':{'name':'SplMaxHeap','methods':{'compare':{'signature':'mixed $value1, mixed $value2 | int','return_type':'int'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'extract':{'signature':'void | mixed','return_type':'mixed'},'insert':{'signature':'mixed $value | void','return_type':'void'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'recoverFromCorruption':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'top':{'signature':'void | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splminheap':{'name':'SplMinHeap','methods':{'compare':{'signature':'mixed $value1, mixed $value2 | int','return_type':'int'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'extract':{'signature':'void | mixed','return_type':'mixed'},'insert':{'signature':'mixed $value | void','return_type':'void'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'recoverFromCorruption':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'top':{'signature':'void | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splobjectstorage':{'name':'SplObjectStorage','methods':{'addAll':{'signature':'SplObjectStorage $storage | void','return_type':'void'},'attach':{'signature':'object $object [, mixed $data = NULL] | void','return_type':'void'},'contains':{'signature':'object $object | bool','return_type':'bool'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | object','return_type':'object'},'detach':{'signature':'object $object | void','return_type':'void'},'getHash':{'signature':'object $object | string','return_type':'string'},'getInfo':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | int','return_type':'int'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'object $object | bool','return_type':'bool'},'offsetGet':{'signature':'object $object | mixed','return_type':'mixed'},'offsetSet':{'signature':'object $object [, mixed $data = NULL] | void','return_type':'void'},'offsetUnset':{'signature':'object $object | void','return_type':'void'},'removeAll':{'signature':'SplObjectStorage $storage | void','return_type':'void'},'removeAllExcept':{'signature':'SplObjectStorage $storage | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'setInfo':{'signature':'mixed $data | void','return_type':'void'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splpriorityqueue':{'name':'SplPriorityQueue','methods':{'__construct':{'signature':'void','return_type':''},'compare':{'signature':'mixed $priority1, mixed $priority2 | int','return_type':'int'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'extract':{'signature':'void | mixed','return_type':'mixed'},'insert':{'signature':'mixed $value, mixed $priority | void','return_type':'void'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'recoverFromCorruption':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'setExtractFlags':{'signature':'int $flags | void','return_type':'void'},'top':{'signature':'void | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splqueue':{'name':'SplQueue','methods':{'__construct':{'signature':'void','return_type':''},'dequeue':{'signature':'void | mixed','return_type':'mixed'},'enqueue':{'signature':'mixed $value | void','return_type':'void'},'setIteratorMode':{'signature':'int $mode | void','return_type':'void'},'bottom':{'signature':'void | mixed','return_type':'mixed'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getIteratorMode':{'signature':'void | int','return_type':'int'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'mixed $index | bool','return_type':'bool'},'offsetGet':{'signature':'mixed $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'mixed $index | void','return_type':'void'},'pop':{'signature':'void | mixed','return_type':'mixed'},'prev':{'signature':'void | void','return_type':'void'},'push':{'signature':'mixed $value | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'shift':{'signature':'void | mixed','return_type':'mixed'},'top':{'signature':'void | mixed','return_type':'mixed'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},'unshift':{'signature':'mixed $value | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'splstack':{'name':'SplStack','methods':{'__construct':{'signature':'void','return_type':''},'setIteratorMode':{'signature':'int $mode | void','return_type':'void'},'bottom':{'signature':'void | mixed','return_type':'mixed'},'count':{'signature':'void | int','return_type':'int'},'current':{'signature':'void | mixed','return_type':'mixed'},'getIteratorMode':{'signature':'void | int','return_type':'int'},'isEmpty':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'offsetExists':{'signature':'mixed $index | bool','return_type':'bool'},'offsetGet':{'signature':'mixed $index | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $index, mixed $newval | void','return_type':'void'},'offsetUnset':{'signature':'mixed $index | void','return_type':'void'},'pop':{'signature':'void | mixed','return_type':'mixed'},'prev':{'signature':'void | void','return_type':'void'},'push':{'signature':'mixed $value | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'serialize':{'signature':'void | string','return_type':'string'},'shift':{'signature':'void | mixed','return_type':'mixed'},'top':{'signature':'void | mixed','return_type':'mixed'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},'unshift':{'signature':'mixed $value | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'spltempfileobject':{'name':'SplTempFileObject','methods':{'__construct':{'signature':'string $filename [, string $open_mode = "r" [, bool $use_include_path = false [, resource $context]]]','return_type':''},'current':{'signature':'void | string|array','return_type':'string|array'},'eof':{'signature':'void | bool','return_type':'bool'},'fflush':{'signature':'void | bool','return_type':'bool'},'fgetc':{'signature':'void | string','return_type':'string'},'fgetcsv':{'signature':'[ string $delimiter = "," [, string $enclosure = "\"" [, string $escape = "\\"]]] | array','return_type':'array'},'fgets':{'signature':'void | string','return_type':'string'},'fgetss':{'signature':'[ string $allowable_tags] | string','return_type':'string'},'flock':{'signature':'int $operation [, int &$wouldblock] | bool','return_type':'bool'},'fpassthru':{'signature':'void | int','return_type':'int'},'fputcsv':{'signature':'array $fields [, string $delimiter = '','' [, string $enclosure = ''"'']] | int','return_type':'int'},'fscanf':{'signature':'string $format [, mixed &$...] | mixed','return_type':'mixed'},'fseek':{'signature':'int $offset [, int $whence = SEEK_SET] | int','return_type':'int'},'fstat':{'signature':'void | array','return_type':'array'},'ftell':{'signature':'void | int','return_type':'int'},'ftruncate':{'signature':'int $size | bool','return_type':'bool'},'fwrite':{'signature':'string $str [, int $length] | int','return_type':'int'},'getChildren':{'signature':'void | void','return_type':'void'},'getCsvControl':{'signature':'void | array','return_type':'array'},'getFlags':{'signature':'void | int','return_type':'int'},'getMaxLineLen':{'signature':'void | int','return_type':'int'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | int','return_type':'int'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'seek':{'signature':'int $line_pos | void','return_type':'void'},'setCsvControl':{'signature':'[ string $delimiter = "," [, string $enclosure = "\"" [, string $escape = "\\"]]] | void','return_type':'void'},'setFlags':{'signature':'int $flags | void','return_type':'void'},'setMaxLineLen':{'signature':'int $max_len | void','return_type':'void'},'__toString':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},},},'underflowexception':{'name':'UnderflowException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'unexpectedvalueexception':{'name':'UnexpectedValueException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},}
+let php_builtin['classes']['predefined_interfaces_and_classes']={'closure':{'name':'Closure','methods':{'__construct':{'signature':'void','return_type':''},'bindTo':{'signature':'object $newthis [, mixed $newscope = ''static''] | Closure','return_type':'Closure'},},'static_methods':{'bind':{'signature':'Closure $closure, object $newthis [, mixed $newscope = ''static''] | Closure','return_type':'Closure'},},},'generator':{'name':'Generator','methods':{'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'send':{'signature':'mixed $value | mixed','return_type':'mixed'},'throw':{'signature':'Exception $exception | mixed','return_type':'mixed'},'valid':{'signature':'void | bool','return_type':'bool'},'__wakeup':{'signature':'void | void','return_type':'void'},},},}
+let php_builtin['classes']['curl']={'curlfile':{'name':'CURLFile','properties': {'name':{'initializer':'','type':''},'mime':{'initializer':'','type':''},'postname':{'initializer':'','type':''},},'methods':{'__construct':{'signature':'string $filename [, string $mimetype [, string $postname]]','return_type':''},'getFilename':{'signature':'void | string','return_type':'string'},'getMimeType':{'signature':'void | string','return_type':'string'},'getPostFilename':{'signature':'void | string','return_type':'string'},'setMimeType':{'signature':'string $mime | void','return_type':'void'},'setPostFilename':{'signature':'string $postname | void','return_type':'void'},'__wakeup':{'signature':'void | void','return_type':'void'},},},}
+let php_builtin['classes']['date_time']={'dateinterval':{'name':'DateInterval','properties': {'y':{'initializer':'','type':'integer'},'m':{'initializer':'','type':'integer'},'d':{'initializer':'','type':'integer'},'h':{'initializer':'','type':'integer'},'i':{'initializer':'','type':'integer'},'s':{'initializer':'','type':'integer'},'invert':{'initializer':'','type':'integer'},'days':{'initializer':'','type':'mixed'},},'methods':{'__construct':{'signature':'string $interval_spec','return_type':''},'format':{'signature':'string $format | string','return_type':'string'},},'static_methods':{'createFromDateString':{'signature':'string $time | DateInterval','return_type':'DateInterval'},},},'dateperiod':{'name':'DatePeriod','constants':{'EXCLUDE_START_DATE':'1',},'methods':{'__construct':{'signature':'string $isostr [, int $options]','return_type':''},},},'datetime':{'name':'DateTime','constants':{'ATOM':'"Y-m-d\TH:i:sP"','COOKIE':'"l, d-M-y H:i:s T"','ISO8601':'"Y-m-d\TH:i:sO"','RFC822':'"D, d M y H:i:s O"','RFC850':'"l, d-M-y H:i:s T"','RFC1036':'"D, d M y H:i:s O"','RFC1123':'"D, d M Y H:i:s O"','RFC2822':'"D, d M Y H:i:s O"','RFC3339':'"Y-m-d\TH:i:sP"','RSS':'"D, d M Y H:i:s O"','W3C':'"Y-m-d\TH:i:sP"',},'methods':{'__construct':{'signature':'[ string $time = "now" [, DateTimeZone $timezone = NULL]]','return_type':''},'add':{'signature':'DateInterval $interval | DateTime','return_type':'DateTime'},'modify':{'signature':'string $modify | DateTime','return_type':'DateTime'},'setDate':{'signature':'int $year, int $month, int $day | DateTime','return_type':'DateTime'},'setISODate':{'signature':'int $year, int $week [, int $day = 1] | DateTime','return_type':'DateTime'},'setTime':{'signature':'int $hour, int $minute [, int $second = 0] | DateTime','return_type':'DateTime'},'setTimestamp':{'signature':'int $unixtimestamp | DateTime','return_type':'DateTime'},'setTimezone':{'signature':'DateTimeZone $timezone | DateTime','return_type':'DateTime'},'sub':{'signature':'DateInterval $interval | DateTime','return_type':'DateTime'},'diff':{'signature':'DateTimeInterface $datetime2 [, bool $absolute = false] | DateInterval','return_type':'DateInterval'},'format':{'signature':'string $format | string','return_type':'string'},'getOffset':{'signature':'void | int','return_type':'int'},'getTimestamp':{'signature':'void | int','return_type':'int'},'getTimezone':{'signature':'void | DateTimeZone','return_type':'DateTimeZone'},'__wakeup':{'signature':'void','return_type':''},},'static_methods':{'createFromFormat':{'signature':'string $format, string $time [, DateTimeZone $timezone] | DateTime','return_type':'DateTime'},'getLastErrors':{'signature':'void | array','return_type':'array'},'__set_state':{'signature':'array $array | DateTime','return_type':'DateTime'},},},'datetimeimmutable':{'name':'DateTimeImmutable','methods':{'__construct':{'signature':'[ string $time = "now" [, DateTimeZone $timezone = NULL]]','return_type':''},'add':{'signature':'DateInterval $interval | DateTimeImmutable','return_type':'DateTimeImmutable'},'modify':{'signature':'string $modify | DateTimeImmutable','return_type':'DateTimeImmutable'},'setDate':{'signature':'int $year, int $month, int $day | DateTimeImmutable','return_type':'DateTimeImmutable'},'setISODate':{'signature':'int $year, int $week [, int $day = 1] | DateTimeImmutable','return_type':'DateTimeImmutable'},'setTime':{'signature':'int $hour, int $minute [, int $second = 0] | DateTimeImmutable','return_type':'DateTimeImmutable'},'setTimestamp':{'signature':'int $unixtimestamp | DateTimeImmutable','return_type':'DateTimeImmutable'},'setTimezone':{'signature':'DateTimeZone $timezone | DateTimeImmutable','return_type':'DateTimeImmutable'},'sub':{'signature':'DateInterval $interval | DateTimeImmutable','return_type':'DateTimeImmutable'},'diff':{'signature':'DateTimeInterface $datetime2 [, bool $absolute = false] | DateInterval','return_type':'DateInterval'},'format':{'signature':'string $format | string','return_type':'string'},'getOffset':{'signature':'void | int','return_type':'int'},'getTimestamp':{'signature':'void | int','return_type':'int'},'getTimezone':{'signature':'void | DateTimeZone','return_type':'DateTimeZone'},'__wakeup':{'signature':'void','return_type':''},},'static_methods':{'createFromFormat':{'signature':'string $format, string $time [, DateTimeZone $timezone] | DateTimeImmutable','return_type':'DateTimeImmutable'},'getLastErrors':{'signature':'void | array','return_type':'array'},'__set_state':{'signature':'array $array | DateTimeImmutable','return_type':'DateTimeImmutable'},},},'datetimezone':{'name':'DateTimeZone','constants':{'AFRICA':'1','AMERICA':'2','ANTARCTICA':'4','ARCTIC':'8','ASIA':'16','ATLANTIC':'32','AUSTRALIA':'64','EUROPE':'128','INDIAN':'256','PACIFIC':'512','UTC':'1024','ALL':'2047','ALL_WITH_BC':'4095','PER_COUNTRY':'4096',},'methods':{'__construct':{'signature':'string $timezone','return_type':''},'getLocation':{'signature':'void | array','return_type':'array'},'getName':{'signature':'void | string','return_type':'string'},'getOffset':{'signature':'DateTime $datetime | int','return_type':'int'},'getTransitions':{'signature':'[ int $timestamp_begin [, int $timestamp_end]] | array','return_type':'array'},},'static_methods':{'listAbbreviations':{'signature':'void | array','return_type':'array'},'listIdentifiers':{'signature':'[ int $what = DateTimeZone::ALL [, string $country = NULL]] | array','return_type':'array'},},},}
+let php_builtin['classes']['directories']={'directory':{'name':'Directory','properties': {'path':{'initializer':'','type':'string'},'handle':{'initializer':'','type':'resource'},},'methods':{'close':{'signature':'[ resource $dir_handle] | void','return_type':'void'},'read':{'signature':'[ resource $dir_handle] | string','return_type':'string'},'rewind':{'signature':'[ resource $dir_handle] | void','return_type':'void'},},},}
+let php_builtin['classes']['dom']={'domattr':{'name':'DOMAttr','properties': {'name':{'initializer':'','type':'string'},'ownerElement':{'initializer':'','type':'DOMElement'},'schemaTypeInfo':{'initializer':'','type':'bool'},'specified':{'initializer':'','type':'bool'},'value':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'string $name [, string $value]','return_type':''},'isId':{'signature':'void | bool','return_type':'bool'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domcdatasection':{'name':'DOMCdataSection','methods':{'__construct':{'signature':'string $value','return_type':''},'isWhitespaceInElementContent':{'signature':'void | bool','return_type':'bool'},'splitText':{'signature':'int $offset | DOMText','return_type':'DOMText'},},},'domcharacterdata':{'name':'DOMCharacterData','properties': {'data':{'initializer':'','type':'string'},'length':{'initializer':'','type':'int'},},'methods':{'appendData':{'signature':'string $data | void','return_type':'void'},'deleteData':{'signature':'int $offset, int $count | void','return_type':'void'},'insertData':{'signature':'int $offset, string $data | void','return_type':'void'},'replaceData':{'signature':'int $offset, int $count, string $data | void','return_type':'void'},'substringData':{'signature':'int $offset, int $count | string','return_type':'string'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domcomment':{'name':'DOMComment','methods':{'__construct':{'signature':'[ string $value]','return_type':''},'appendData':{'signature':'string $data | void','return_type':'void'},'deleteData':{'signature':'int $offset, int $count | void','return_type':'void'},'insertData':{'signature':'int $offset, string $data | void','return_type':'void'},'replaceData':{'signature':'int $offset, int $count, string $data | void','return_type':'void'},'substringData':{'signature':'int $offset, int $count | string','return_type':'string'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domdocument':{'name':'DOMDocument','properties': {'actualEncoding':{'initializer':'','type':'string'},'config':{'initializer':'','type':'DOMConfiguration'},'doctype':{'initializer':'','type':'DOMDocumentType'},'documentElement':{'initializer':'','type':'DOMElement'},'documentURI':{'initializer':'','type':'string'},'encoding':{'initializer':'','type':'string'},'formatOutput':{'initializer':'','type':'bool'},'implementation':{'initializer':'','type':'DOMImplementation'},'preserveWhiteSpace':{'initializer':'true','type':'bool'},'recover':{'initializer':'','type':'bool'},'resolveExternals':{'initializer':'','type':'bool'},'standalone':{'initializer':'','type':'bool'},'strictErrorChecking':{'initializer':'true','type':'bool'},'substituteEntities':{'initializer':'','type':'bool'},'validateOnParse':{'initializer':'false','type':'bool'},'version':{'initializer':'','type':'string'},'xmlEncoding':{'initializer':'','type':'string'},'xmlStandalone':{'initializer':'','type':'bool'},'xmlVersion':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'[ string $version [, string $encoding]]','return_type':''},'createAttribute':{'signature':'string $name | DOMAttr','return_type':'DOMAttr'},'createAttributeNS':{'signature':'string $namespaceURI, string $qualifiedName | DOMAttr','return_type':'DOMAttr'},'createCDATASection':{'signature':'string $data | DOMCDATASection','return_type':'DOMCDATASection'},'createComment':{'signature':'string $data | DOMComment','return_type':'DOMComment'},'createDocumentFragment':{'signature':'void | DOMDocumentFragment','return_type':'DOMDocumentFragment'},'createElement':{'signature':'string $name [, string $value] | DOMElement','return_type':'DOMElement'},'createElementNS':{'signature':'string $namespaceURI, string $qualifiedName [, string $value] | DOMElement','return_type':'DOMElement'},'createEntityReference':{'signature':'string $name | DOMEntityReference','return_type':'DOMEntityReference'},'createProcessingInstruction':{'signature':'string $target [, string $data] | DOMProcessingInstruction','return_type':'DOMProcessingInstruction'},'createTextNode':{'signature':'string $content | DOMText','return_type':'DOMText'},'getElementById':{'signature':'string $elementId | DOMElement','return_type':'DOMElement'},'getElementsByTagName':{'signature':'string $name | DOMNodeList','return_type':'DOMNodeList'},'getElementsByTagNameNS':{'signature':'string $namespaceURI, string $localName | DOMNodeList','return_type':'DOMNodeList'},'importNode':{'signature':'DOMNode $importedNode [, bool $deep] | DOMNode','return_type':'DOMNode'},'load':{'signature':'string $filename [, int $options = 0] | mixed','return_type':'mixed'},'loadHTML':{'signature':'string $source [, int $options = 0] | bool','return_type':'bool'},'loadHTMLFile':{'signature':'string $filename [, int $options = 0] | bool','return_type':'bool'},'loadXML':{'signature':'string $source [, int $options = 0] | mixed','return_type':'mixed'},'normalizeDocument':{'signature':'void | void','return_type':'void'},'registerNodeClass':{'signature':'string $baseclass, string $extendedclass | bool','return_type':'bool'},'relaxNGValidate':{'signature':'string $filename | bool','return_type':'bool'},'relaxNGValidateSource':{'signature':'string $source | bool','return_type':'bool'},'save':{'signature':'string $filename [, int $options] | int','return_type':'int'},'saveHTML':{'signature':'[ DOMNode $node = NULL] | string','return_type':'string'},'saveHTMLFile':{'signature':'string $filename | int','return_type':'int'},'saveXML':{'signature':'[ DOMNode $node [, int $options]] | string','return_type':'string'},'schemaValidate':{'signature':'string $filename [, int $flags] | bool','return_type':'bool'},'schemaValidateSource':{'signature':'string $source [, int $flags] | bool','return_type':'bool'},'validate':{'signature':'void | bool','return_type':'bool'},'xinclude':{'signature':'[ int $options] | int','return_type':'int'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domdocumentfragment':{'name':'DOMDocumentFragment','methods':{'appendXML':{'signature':'string $data | bool','return_type':'bool'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domdocumenttype':{'name':'DOMDocumentType','properties': {'publicId':{'initializer':'','type':'string'},'systemId':{'initializer':'','type':'string'},'name':{'initializer':'','type':'string'},'entities':{'initializer':'','type':'DOMNamedNodeMap'},'notations':{'initializer':'','type':'DOMNamedNodeMap'},'internalSubset':{'initializer':'','type':'string'},},'methods':{'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domelement':{'name':'DOMElement','properties': {'schemaTypeInfo':{'initializer':'','type':'bool'},'tagName':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'string $name [, string $value [, string $namespaceURI]]','return_type':''},'getAttribute':{'signature':'string $name | string','return_type':'string'},'getAttributeNode':{'signature':'string $name | DOMAttr','return_type':'DOMAttr'},'getAttributeNodeNS':{'signature':'string $namespaceURI, string $localName | DOMAttr','return_type':'DOMAttr'},'getAttributeNS':{'signature':'string $namespaceURI, string $localName | string','return_type':'string'},'getElementsByTagName':{'signature':'string $name | DOMNodeList','return_type':'DOMNodeList'},'getElementsByTagNameNS':{'signature':'string $namespaceURI, string $localName | DOMNodeList','return_type':'DOMNodeList'},'hasAttribute':{'signature':'string $name | bool','return_type':'bool'},'hasAttributeNS':{'signature':'string $namespaceURI, string $localName | bool','return_type':'bool'},'removeAttribute':{'signature':'string $name | bool','return_type':'bool'},'removeAttributeNode':{'signature':'DOMAttr $oldnode | bool','return_type':'bool'},'removeAttributeNS':{'signature':'string $namespaceURI, string $localName | bool','return_type':'bool'},'setAttribute':{'signature':'string $name, string $value | DOMAttr','return_type':'DOMAttr'},'setAttributeNode':{'signature':'DOMAttr $attr | DOMAttr','return_type':'DOMAttr'},'setAttributeNodeNS':{'signature':'DOMAttr $attr | DOMAttr','return_type':'DOMAttr'},'setAttributeNS':{'signature':'string $namespaceURI, string $qualifiedName, string $value | void','return_type':'void'},'setIdAttribute':{'signature':'string $name, bool $isId | void','return_type':'void'},'setIdAttributeNode':{'signature':'DOMAttr $attr, bool $isId | void','return_type':'void'},'setIdAttributeNS':{'signature':'string $namespaceURI, string $localName, bool $isId | void','return_type':'void'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domentity':{'name':'DOMEntity','properties': {'publicId':{'initializer':'','type':'string'},'systemId':{'initializer':'','type':'string'},'notationName':{'initializer':'','type':'string'},'actualEncoding':{'initializer':'','type':'string'},'encoding':{'initializer':'','type':'string'},'version':{'initializer':'','type':'string'},},'methods':{'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domentityreference':{'name':'DOMEntityReference','methods':{'__construct':{'signature':'string $name','return_type':''},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domexception':{'name':'DOMException','properties': {'code':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'domimplementation':{'name':'DOMImplementation','methods':{'__construct':{'signature':'void','return_type':''},'createDocument':{'signature':'[ string $namespaceURI = NULL [, string $qualifiedName = NULL [, DOMDocumentType $doctype = NULL]]] | DOMDocument','return_type':'DOMDocument'},'createDocumentType':{'signature':'[ string $qualifiedName = NULL [, string $publicId = NULL [, string $systemId = NULL]]] | DOMDocumentType','return_type':'DOMDocumentType'},'hasFeature':{'signature':'string $feature, string $version | bool','return_type':'bool'},},},'domnamednodemap':{'name':'DOMNamedNodeMap','properties': {'length':{'initializer':'','type':'int'},},'methods':{'getNamedItem':{'signature':'string $name | DOMNode','return_type':'DOMNode'},'getNamedItemNS':{'signature':'string $namespaceURI, string $localName | DOMNode','return_type':'DOMNode'},'item':{'signature':'int $index | DOMNode','return_type':'DOMNode'},},},'domnode':{'name':'DOMNode','properties': {'nodeName':{'initializer':'','type':'string'},'nodeValue':{'initializer':'','type':'string'},'nodeType':{'initializer':'','type':'int'},'parentNode':{'initializer':'','type':'DOMNode'},'childNodes':{'initializer':'','type':'DOMNodeList'},'firstChild':{'initializer':'','type':'DOMNode'},'lastChild':{'initializer':'','type':'DOMNode'},'previousSibling':{'initializer':'','type':'DOMNode'},'nextSibling':{'initializer':'','type':'DOMNode'},'attributes':{'initializer':'','type':'DOMNamedNodeMap'},'ownerDocument':{'initializer':'','type':'DOMDocument'},'namespaceURI':{'initializer':'','type':'string'},'prefix':{'initializer':'','type':'string'},'localName':{'initializer':'','type':'string'},'baseURI':{'initializer':'','type':'string'},'textContent':{'initializer':'','type':'string'},},'methods':{'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domnodelist':{'name':'DOMNodeList','properties': {'length':{'initializer':'','type':'int'},},'methods':{'item':{'signature':'int $index | DOMNode','return_type':'DOMNode'},},},'domnotation':{'name':'DOMNotation','properties': {'publicId':{'initializer':'','type':'string'},'systemId':{'initializer':'','type':'string'},},'methods':{'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domprocessinginstruction':{'name':'DOMProcessingInstruction','properties': {'target':{'initializer':'','type':'string'},'data':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'string $name [, string $value]','return_type':''},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domtext':{'name':'DOMText','properties': {'wholeText':{'initializer':'','type':'string'},},'methods':{'__construct':{'signature':'[ string $value]','return_type':''},'isWhitespaceInElementContent':{'signature':'void | bool','return_type':'bool'},'splitText':{'signature':'int $offset | DOMText','return_type':'DOMText'},'appendChild':{'signature':'DOMNode $newnode | DOMNode','return_type':'DOMNode'},'C14N':{'signature':'[ bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | string','return_type':'string'},'C14NFile':{'signature':'string $uri [, bool $exclusive [, bool $with_comments [, array $xpath [, array $ns_prefixes]]]] | int','return_type':'int'},'cloneNode':{'signature':'[ bool $deep] | DOMNode','return_type':'DOMNode'},'getLineNo':{'signature':'void | int','return_type':'int'},'getNodePath':{'signature':'void | string','return_type':'string'},'hasAttributes':{'signature':'void | bool','return_type':'bool'},'hasChildNodes':{'signature':'void | bool','return_type':'bool'},'insertBefore':{'signature':'DOMNode $newnode [, DOMNode $refnode] | DOMNode','return_type':'DOMNode'},'isDefaultNamespace':{'signature':'string $namespaceURI | bool','return_type':'bool'},'isSameNode':{'signature':'DOMNode $node | bool','return_type':'bool'},'isSupported':{'signature':'string $feature, string $version | bool','return_type':'bool'},'lookupNamespaceURI':{'signature':'string $prefix | string','return_type':'string'},'lookupPrefix':{'signature':'string $namespaceURI | string','return_type':'string'},'normalize':{'signature':'void | void','return_type':'void'},'removeChild':{'signature':'DOMNode $oldnode | DOMNode','return_type':'DOMNode'},'replaceChild':{'signature':'DOMNode $newnode, DOMNode $oldnode | DOMNode','return_type':'DOMNode'},},},'domxpath':{'name':'DOMXPath','properties': {'document':{'initializer':'','type':'DOMDocument'},},'methods':{'__construct':{'signature':'DOMDocument $doc','return_type':''},'evaluate':{'signature':'string $expression [, DOMNode $contextnode [, bool $registerNodeNS = true]] | mixed','return_type':'mixed'},'query':{'signature':'string $expression [, DOMNode $contextnode [, bool $registerNodeNS = true]] | DOMNodeList','return_type':'DOMNodeList'},'registerNamespace':{'signature':'string $prefix, string $namespaceURI | bool','return_type':'bool'},'registerPhpFunctions':{'signature':'[ mixed $restrict] | void','return_type':'void'},},},}
+let php_builtin['classes']['predefined_exceptions']={'errorexception':{'name':'ErrorException','properties': {'severity':{'initializer':'','type':'int'},'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'__construct':{'signature':'[ string $message = "" [, int $code = 0 [, int $severity = 1 [, string $filename = __FILE__ [, int $lineno = __LINE__ [, Exception $previous = NULL]]]]]]','return_type':''},'getSeverity':{'signature':'void | int','return_type':'int'},'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'exception':{'name':'Exception','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'__construct':{'signature':'[ string $message = "" [, int $code = 0 [, Exception $previous = NULL]]]','return_type':''},'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},}
+let php_builtin['classes']['libxml']={'libxmlerror':{'name':'libXMLError','properties': {'level':{'initializer':'','type':'int'},'code':{'initializer':'','type':'int'},'column':{'initializer':'','type':'int'},'message':{'initializer':'','type':'string'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},},}
+let php_builtin['classes']['mysqli']={'mysqli_driver':{'name':'mysqli_driver','properties': {'client_info':{'initializer':'','type':'string'},'client_version':{'initializer':'','type':'string'},'driver_version':{'initializer':'','type':'string'},'embedded':{'initializer':'','type':'string'},'reconnect':{'initializer':'','type':'bool'},'report_mode':{'initializer':'','type':'int'},},'methods':{'embedded_server_end':{'signature':'void | void','return_type':'void'},'embedded_server_start':{'signature':'bool $start, array $arguments, array $groups | bool','return_type':'bool'},},},'mysqli_result':{'name':'mysqli_result','properties': {'current_field':{'initializer':'','type':'int'},'field_count':{'initializer':'','type':'int'},'lengths':{'initializer':'','type':'array'},'num_rows':{'initializer':'','type':'int'},},'methods':{'data_seek':{'signature':'int $offset | bool','return_type':'bool'},'fetch_all':{'signature':'[ int $resulttype = MYSQLI_NUM] | mixed','return_type':'mixed'},'fetch_array':{'signature':'[ int $resulttype = MYSQLI_BOTH] | mixed','return_type':'mixed'},'fetch_assoc':{'signature':'void | array','return_type':'array'},'fetch_field_direct':{'signature':'int $fieldnr | object','return_type':'object'},'fetch_field':{'signature':'void | object','return_type':'object'},'fetch_fields':{'signature':'void | array','return_type':'array'},'fetch_object':{'signature':'[ string $class_name [, array $params]] | object','return_type':'object'},'fetch_row':{'signature':'void | mixed','return_type':'mixed'},'field_seek':{'signature':'int $fieldnr | bool','return_type':'bool'},'free':{'signature':'void | void','return_type':'void'},},},'mysqli_sql_exception':{'name':'mysqli_sql_exception','properties': {'sqlstate':{'initializer':'','type':'string'},'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},},'mysqli_stmt':{'name':'mysqli_stmt','properties': {'affected_rows':{'initializer':'','type':'int'},'errno':{'initializer':'','type':'int'},'error_list':{'initializer':'','type':'array'},'error':{'initializer':'','type':'string'},'field_count':{'initializer':'','type':'int'},'insert_id':{'initializer':'','type':'int'},'num_rows':{'initializer':'','type':'int'},'param_count':{'initializer':'','type':'int'},'sqlstate':{'initializer':'','type':'string'},},'methods':{'attr_get':{'signature':'int $attr | int','return_type':'int'},'attr_set':{'signature':'int $attr, int $mode | bool','return_type':'bool'},'bind_param':{'signature':'string $types, mixed &$var1 [, mixed &$...] | bool','return_type':'bool'},'bind_result':{'signature':'mixed &$var1 [, mixed &$...] | bool','return_type':'bool'},'close':{'signature':'void | bool','return_type':'bool'},'data_seek':{'signature':'int $offset | void','return_type':'void'},'execute':{'signature':'void | bool','return_type':'bool'},'fetch':{'signature':'void | bool','return_type':'bool'},'free_result':{'signature':'void | void','return_type':'void'},'get_result':{'signature':'void | mysqli_result','return_type':'mysqli_result'},'get_warnings':{'signature':'mysqli_stmt $stmt | object','return_type':'object'},'prepare':{'signature':'string $query | mixed','return_type':'mixed'},'reset':{'signature':'void | bool','return_type':'bool'},'result_metadata':{'signature':'void | mysqli_result','return_type':'mysqli_result'},'send_long_data':{'signature':'int $param_nr, string $data | bool','return_type':'bool'},'store_result':{'signature':'void | bool','return_type':'bool'},},},'mysqli_warning':{'name':'mysqli_warning','properties': {'message':{'initializer':'','type':''},'sqlstate':{'initializer':'','type':''},'errno':{'initializer':'','type':''},},'methods':{'__construct':{'signature':'void','return_type':''},'next':{'signature':'void | void','return_type':'void'},},},'mysqli':{'name':'mysqli','properties': {'affected_rows':{'initializer':'','type':'int'},'client_info':{'initializer':'','type':'string'},'client_version':{'initializer':'','type':'int'},'connect_errno':{'initializer':'','type':'string'},'connect_error':{'initializer':'','type':'string'},'errno':{'initializer':'','type':'int'},'error_list':{'initializer':'','type':'array'},'error':{'initializer':'','type':'string'},'field_count':{'initializer':'','type':'int'},'host_info':{'initializer':'','type':'string'},'protocol_version':{'initializer':'','type':'string'},'server_info':{'initializer':'','type':'string'},'server_version':{'initializer':'','type':'int'},'info':{'initializer':'','type':'string'},'insert_id':{'initializer':'','type':'mixed'},'sqlstate':{'initializer':'','type':'string'},'thread_id':{'initializer':'','type':'int'},'warning_count':{'initializer':'','type':'int'},},'methods':{'__construct':{'signature':'[ string $host = ini_get("mysqli.default_host") [, string $username = ini_get("mysqli.default_user") [, string $passwd = ini_get("mysqli.default_pw") [, string $dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket = ini_get("mysqli.default_socket")]]]]]]','return_type':''},'autocommit':{'signature':'bool $mode | bool','return_type':'bool'},'change_user':{'signature':'string $user, string $password, string $database | bool','return_type':'bool'},'character_set_name':{'signature':'void | string','return_type':'string'},'close':{'signature':'void | bool','return_type':'bool'},'commit':{'signature':'[ int $flags [, string $name]] | bool','return_type':'bool'},'debug':{'signature':'string $message | bool','return_type':'bool'},'dump_debug_info':{'signature':'void | bool','return_type':'bool'},'get_charset':{'signature':'void | object','return_type':'object'},'get_client_info':{'signature':'void | string','return_type':'string'},'get_connection_stats':{'signature':'void | bool','return_type':'bool'},'get_warnings':{'signature':'void | mysqli_warning','return_type':'mysqli_warning'},'init':{'signature':'void | mysqli','return_type':'mysqli'},'kill':{'signature':'int $processid | bool','return_type':'bool'},'more_results':{'signature':'void | bool','return_type':'bool'},'multi_query':{'signature':'string $query | bool','return_type':'bool'},'next_result':{'signature':'void | bool','return_type':'bool'},'options':{'signature':'int $option, mixed $value | bool','return_type':'bool'},'ping':{'signature':'void | bool','return_type':'bool'},'prepare':{'signature':'string $query | mysqli_stmt','return_type':'mysqli_stmt'},'query':{'signature':'string $query [, int $resultmode = MYSQLI_STORE_RESULT] | mixed','return_type':'mixed'},'real_connect':{'signature':'[ string $host [, string $username [, string $passwd [, string $dbname [, int $port [, string $socket [, int $flags]]]]]]] | bool','return_type':'bool'},'escape_string':{'signature':'string $escapestr | string','return_type':'string'},'real_query':{'signature':'string $query | bool','return_type':'bool'},'reap_async_query':{'signature':'void | mysqli_result','return_type':'mysqli_result'},'refresh':{'signature':'int $options | bool','return_type':'bool'},'rollback':{'signature':'[ int $flags [, string $name]] | bool','return_type':'bool'},'rpl_query_type':{'signature':'string $query | int','return_type':'int'},'select_db':{'signature':'string $dbname | bool','return_type':'bool'},'send_query':{'signature':'string $query | bool','return_type':'bool'},'set_charset':{'signature':'string $charset | bool','return_type':'bool'},'set_local_infile_handler':{'signature':'mysqli $link, callable $read_func | bool','return_type':'bool'},'ssl_set':{'signature':'string $key, string $cert, string $ca, string $capath, string $cipher | bool','return_type':'bool'},'stat':{'signature':'void | string','return_type':'string'},'stmt_init':{'signature':'void | mysqli_stmt','return_type':'mysqli_stmt'},'store_result':{'signature':'void | mysqli_result','return_type':'mysqli_result'},'use_result':{'signature':'void | mysqli_result','return_type':'mysqli_result'},},'static_methods':{'poll':{'signature':'array &$read, array &$error, array &$reject, int $sec [, int $usec] | int','return_type':'int'},},},}
+let php_builtin['classes']['pdo']={'pdo':{'name':'PDO','constants':{'FETCH_ORI_ABS':'','ATTR_PERSISTENT':'','CLASS_CONSTANT':'','ATTR_DEFAULT_FETCH_MODE':'','FETCH_PROPS_LATE':'','FETCH_KEY_PAIR':'','FB_ATTR_DATE_FORMAT':'','FB_ATTR_TIME_FORMAT':'','FB_ATTR_TIMESTAMP_FORMAT':'','MYSQL_ATTR_READ_DEFAULT_FILE':'','MYSQL_ATTR_READ_DEFAULT_GROUP':'','ATTR_AUTOCOMMIT':'','FOURD_ATTR_CHARSET':'','FOURD_ATTR_PREFERRED_IMAGE_TYPES':'','PARAM_LOB':'','PARAM_BOOL':'','PARAM_NULL':'','PARAM_INT':'','PARAM_STR':'','PARAM_STMT':'','PARAM_INPUT_OUTPUT':'','FETCH_LAZY':'','FETCH_ASSOC':'','FETCH_NAMED':'','FETCH_NUM':'','FETCH_BOTH':'','FETCH_OBJ':'','FETCH_BOUND':'','FETCH_COLUMN':'','FETCH_CLASS':'','FETCH_INTO':'','FETCH_FUNC':'','FETCH_GROUP':'','FETCH_UNIQUE':'','FETCH_CLASSTYPE':'','FETCH_SERIALIZE':'','ATTR_PREFETCH':'','ATTR_TIMEOUT':'','ATTR_ERRMODE':'','ATTR_SERVER_VERSION':'','ATTR_CLIENT_VERSION':'','ATTR_SERVER_INFO':'','ATTR_CONNECTION_STATUS':'','ATTR_CASE':'','ATTR_CURSOR_NAME':'','ATTR_CURSOR':'','CURSOR_FWDONLY':'','CURSOR_SCROLL':'','ATTR_DRIVER_NAME':'','ATTR_ORACLE_NULLS':'','ATTR_STATEMENT_CLASS':'','ATTR_FETCH_CATALOG_NAMES':'','ATTR_FETCH_TABLE_NAMES':'','ATTR_STRINGIFY_FETCHES':'','ATTR_MAX_COLUMN_LEN':'','ATTR_EMULATE_PREPARES':'','ERRMODE_SILENT':'','ERRMODE_WARNING':'','ERRMODE_EXCEPTION':'','CASE_NATURAL':'','CASE_LOWER':'','CASE_UPPER':'','NULL_NATURAL':'','NULL_EMPTY_STRING':'','NULL_TO_STRING':'','FETCH_ORI_NEXT':'','FETCH_ORI_PRIOR':'','FETCH_ORI_FIRST':'','FETCH_ORI_LAST':'','FETCH_ORI_REL':'','ERR_NONE':'','PARAM_EVT_ALLOC':'','PARAM_EVT_FREE':'','PARAM_EVT_EXEC_PRE':'','PARAM_EVT_EXEC_POST':'','PARAM_EVT_FETCH_PRE':'','PARAM_EVT_FETCH_POST':'','PARAM_EVT_NORMALIZE':'','MYSQL_ATTR_INIT_COMMAND':'','MYSQL_ATTR_USE_BUFFERED_QUERY':'','MYSQL_ATTR_LOCAL_INFILE':'','MYSQL_ATTR_MAX_BUFFER_SIZE':'','MYSQL_ATTR_DIRECT_QUERY':'','MYSQL_ATTR_FOUND_ROWS':'','MYSQL_ATTR_IGNORE_SPACE':'','MYSQL_ATTR_COMPRESS':'','MYSQL_ATTR_SSL_CA':'','MYSQL_ATTR_SSL_CAPATH':'','MYSQL_ATTR_SSL_CERT':'','MYSQL_ATTR_SSL_CIPHER':'','MYSQL_ATTR_SSL_KEY':'','SQLSRV_TXN_READ_UNCOMMITTED':'','SQLSRV_TXN_READ_COMMITTED':'','SQLSRV_TXN_REPEATABLE_READ':'','SQLSRV_TXN_SNAPSHOT':'','SQLSRV_TXN_SERIALIZABLE':'','SQLSRV_ENCODING_BINARY':'','SQLSRV_ENCODING_SYSTEM':'','SQLSRV_ENCODING_UTF8':'','SQLSRV_ENCODING_DEFAULT':'','SQLSRV_ATTR_QUERY_TIMEOUT':'','SQLSRV_ATTR_DIRECT_QUERY':'',},'methods':{'__construct':{'signature':'string $dsn [, string $username [, string $password [, array $driver_options]]]','return_type':''},'beginTransaction':{'signature':'void | bool','return_type':'bool'},'commit':{'signature':'void | bool','return_type':'bool'},'errorCode':{'signature':'void | mixed','return_type':'mixed'},'errorInfo':{'signature':'void | array','return_type':'array'},'exec':{'signature':'string $statement | int','return_type':'int'},'getAttribute':{'signature':'int $attribute | mixed','return_type':'mixed'},'inTransaction':{'signature':'void | bool','return_type':'bool'},'lastInsertId':{'signature':'[ string $name = NULL] | string','return_type':'string'},'prepare':{'signature':'string $statement [, array $driver_options = array()] | PDOStatement','return_type':'PDOStatement'},'query':{'signature':'string $statement | PDOStatement','return_type':'PDOStatement'},'quote':{'signature':'string $string [, int $parameter_type = PDO::PARAM_STR] | string','return_type':'string'},'rollBack':{'signature':'void | bool','return_type':'bool'},'setAttribute':{'signature':'int $attribute, mixed $value | bool','return_type':'bool'},},'static_methods':{'getAvailableDrivers':{'signature':'void | array','return_type':'array'},},},'pdoexception':{'name':'PDOException','properties': {'errorInfo':{'initializer':'','type':'array'},'code':{'initializer':'','type':'int'},'message':{'initializer':'','type':'string'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'pdostatement':{'name':'PDOStatement','properties': {'queryString':{'initializer':'','type':'string'},},'methods':{'bindColumn':{'signature':'mixed $column, mixed &$param [, int $type [, int $maxlen [, mixed $driverdata]]] | bool','return_type':'bool'},'bindParam':{'signature':'mixed $parameter, mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options]]] | bool','return_type':'bool'},'bindValue':{'signature':'mixed $parameter, mixed $value [, int $data_type = PDO::PARAM_STR] | bool','return_type':'bool'},'closeCursor':{'signature':'void | bool','return_type':'bool'},'columnCount':{'signature':'void | int','return_type':'int'},'debugDumpParams':{'signature':'void | void','return_type':'void'},'errorCode':{'signature':'void | string','return_type':'string'},'errorInfo':{'signature':'void | array','return_type':'array'},'execute':{'signature':'[ array $input_parameters] | bool','return_type':'bool'},'fetch':{'signature':'[ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0]]] | mixed','return_type':'mixed'},'fetchAll':{'signature':'[ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array()]]] | array','return_type':'array'},'fetchColumn':{'signature':'[ int $column_number = 0] | string','return_type':'string'},'fetchObject':{'signature':'[ string $class_name = "stdClass" [, array $ctor_args]] | mixed','return_type':'mixed'},'getAttribute':{'signature':'int $attribute | mixed','return_type':'mixed'},'getColumnMeta':{'signature':'int $column | array','return_type':'array'},'nextRowset':{'signature':'void | bool','return_type':'bool'},'rowCount':{'signature':'void | int','return_type':'int'},'setAttribute':{'signature':'int $attribute, mixed $value | bool','return_type':'bool'},'setFetchMode':{'signature':'int $mode | bool','return_type':'bool'},},},}
+let php_builtin['classes']['phar']={'phar':{'name':'Phar','methods':{'addEmptyDir':{'signature':'string $dirname | void','return_type':'void'},'addFile':{'signature':'string $file [, string $localname] | void','return_type':'void'},'addFromString':{'signature':'string $localname, string $contents | void','return_type':'void'},'buildFromDirectory':{'signature':'string $base_dir [, string $regex] | array','return_type':'array'},'buildFromIterator':{'signature':'Iterator $iter [, string $base_directory] | array','return_type':'array'},'compress':{'signature':'int $compression [, string $extension] | object','return_type':'object'},'compressAllFilesBZIP2':{'signature':'void | bool','return_type':'bool'},'compressAllFilesGZ':{'signature':'void | bool','return_type':'bool'},'compressFiles':{'signature':'int $compression | void','return_type':'void'},'__construct':{'signature':'string $fname [, int $flags [, string $alias]]','return_type':''},'convertToData':{'signature':'[ int $format = 9021976 [, int $compression = 9021976 [, string $extension]]] | PharData','return_type':'PharData'},'convertToExecutable':{'signature':'[ int $format = 9021976 [, int $compression = 9021976 [, string $extension]]] | Phar','return_type':'Phar'},'copy':{'signature':'string $oldfile, string $newfile | bool','return_type':'bool'},'count':{'signature':'void | int','return_type':'int'},'decompress':{'signature':'[ string $extension] | object','return_type':'object'},'decompressFiles':{'signature':'void | bool','return_type':'bool'},'delMetadata':{'signature':'void | bool','return_type':'bool'},'delete':{'signature':'string $entry | bool','return_type':'bool'},'extractTo':{'signature':'string $pathto [, string|array $files [, bool $overwrite = false]] | bool','return_type':'bool'},'getMetadata':{'signature':'void | mixed','return_type':'mixed'},'getModified':{'signature':'void | bool','return_type':'bool'},'getSignature':{'signature':'void | array','return_type':'array'},'getStub':{'signature':'void | string','return_type':'string'},'getVersion':{'signature':'void | string','return_type':'string'},'hasMetadata':{'signature':'void | bool','return_type':'bool'},'isBuffering':{'signature':'void | bool','return_type':'bool'},'isCompressed':{'signature':'void | mixed','return_type':'mixed'},'isFileFormat':{'signature':'int $format | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'offsetExists':{'signature':'string $offset | bool','return_type':'bool'},'offsetGet':{'signature':'string $offset | int','return_type':'int'},'offsetSet':{'signature':'string $offset, string $value | void','return_type':'void'},'offsetUnset':{'signature':'string $offset | bool','return_type':'bool'},'setAlias':{'signature':'string $alias | bool','return_type':'bool'},'setDefaultStub':{'signature':'[ string $index [, string $webindex]] | bool','return_type':'bool'},'setMetadata':{'signature':'mixed $metadata | void','return_type':'void'},'setSignatureAlgorithm':{'signature':'int $sigtype [, string $privatekey] | void','return_type':'void'},'setStub':{'signature':'string $stub [, int $len = -1] | bool','return_type':'bool'},'startBuffering':{'signature':'void | void','return_type':'void'},'stopBuffering':{'signature':'void | void','return_type':'void'},'uncompressAllFiles':{'signature':'void | bool','return_type':'bool'},},'static_methods':{'apiVersion':{'signature':'void | string','return_type':'string'},'canCompress':{'signature':'[ int $type = 0] | bool','return_type':'bool'},'canWrite':{'signature':'void | bool','return_type':'bool'},'createDefaultStub':{'signature':'[ string $indexfile [, string $webindexfile]] | string','return_type':'string'},'getSupportedCompression':{'signature':'void | array','return_type':'array'},'getSupportedSignatures':{'signature':'void | array','return_type':'array'},'interceptFileFuncs':{'signature':'void | void','return_type':'void'},'isValidPharFilename':{'signature':'string $filename [, bool $executable = true] | bool','return_type':'bool'},'loadPhar':{'signature':'string $filename [, string $alias] | bool','return_type':'bool'},'mapPhar':{'signature':'[ string $alias [, int $dataoffset = 0]] | bool','return_type':'bool'},'mount':{'signature':'string $pharpath, string $externalpath | void','return_type':'void'},'mungServer':{'signature':'array $munglist | void','return_type':'void'},'running':{'signature':'[ bool $retphar = true] | string','return_type':'string'},'unlinkArchive':{'signature':'string $archive | bool','return_type':'bool'},'webPhar':{'signature':'[ string $alias [, string $index = "index.php" [, string $f404 [, array $mimetypes [, callable $rewrites]]]]] | void','return_type':'void'},},},'phardata':{'name':'PharData','methods':{'addEmptyDir':{'signature':'string $dirname | void','return_type':'void'},'addFile':{'signature':'string $file [, string $localname] | void','return_type':'void'},'addFromString':{'signature':'string $localname, string $contents | void','return_type':'void'},'buildFromDirectory':{'signature':'string $base_dir [, string $regex] | array','return_type':'array'},'buildFromIterator':{'signature':'Iterator $iter [, string $base_directory] | array','return_type':'array'},'compress':{'signature':'int $compression [, string $extension] | object','return_type':'object'},'compressFiles':{'signature':'int $compression | void','return_type':'void'},'__construct':{'signature':'string $fname [, int $flags [, string $alias]]','return_type':''},'convertToData':{'signature':'[ int $format = 9021976 [, int $compression = 9021976 [, string $extension]]] | PharData','return_type':'PharData'},'convertToExecutable':{'signature':'[ int $format = 9021976 [, int $compression = 9021976 [, string $extension]]] | Phar','return_type':'Phar'},'copy':{'signature':'string $oldfile, string $newfile | bool','return_type':'bool'},'decompress':{'signature':'[ string $extension] | object','return_type':'object'},'decompressFiles':{'signature':'void | bool','return_type':'bool'},'delMetadata':{'signature':'void | bool','return_type':'bool'},'delete':{'signature':'string $entry | bool','return_type':'bool'},'extractTo':{'signature':'string $pathto [, string|array $files [, bool $overwrite = false]] | bool','return_type':'bool'},'isWritable':{'signature':'void | bool','return_type':'bool'},'offsetSet':{'signature':'string $offset, string $value | void','return_type':'void'},'offsetUnset':{'signature':'string $offset | bool','return_type':'bool'},'setAlias':{'signature':'string $alias | bool','return_type':'bool'},'setDefaultStub':{'signature':'[ string $index [, string $webindex]] | bool','return_type':'bool'},'setMetadata':{'signature':'mixed $metadata | void','return_type':'void'},'setSignatureAlgorithm':{'signature':'int $sigtype [, string $privatekey] | void','return_type':'void'},'setStub':{'signature':'string $stub [, int $len = -1] | bool','return_type':'bool'},'compressAllFilesBZIP2':{'signature':'void | bool','return_type':'bool'},'compressAllFilesGZ':{'signature':'void | bool','return_type':'bool'},'count':{'signature':'void | int','return_type':'int'},'getMetadata':{'signature':'void | mixed','return_type':'mixed'},'getModified':{'signature':'void | bool','return_type':'bool'},'getSignature':{'signature':'void | array','return_type':'array'},'getStub':{'signature':'void | string','return_type':'string'},'getVersion':{'signature':'void | string','return_type':'string'},'hasMetadata':{'signature':'void | bool','return_type':'bool'},'isBuffering':{'signature':'void | bool','return_type':'bool'},'isCompressed':{'signature':'void | mixed','return_type':'mixed'},'isFileFormat':{'signature':'int $format | bool','return_type':'bool'},'offsetExists':{'signature':'string $offset | bool','return_type':'bool'},'offsetGet':{'signature':'string $offset | int','return_type':'int'},'startBuffering':{'signature':'void | void','return_type':'void'},'stopBuffering':{'signature':'void | void','return_type':'void'},'uncompressAllFiles':{'signature':'void | bool','return_type':'bool'},},'static_methods':{'apiVersion':{'signature':'void | string','return_type':'string'},'canCompress':{'signature':'[ int $type = 0] | bool','return_type':'bool'},'canWrite':{'signature':'void | bool','return_type':'bool'},'createDefaultStub':{'signature':'[ string $indexfile [, string $webindexfile]] | string','return_type':'string'},'getSupportedCompression':{'signature':'void | array','return_type':'array'},'getSupportedSignatures':{'signature':'void | array','return_type':'array'},'interceptFileFuncs':{'signature':'void | void','return_type':'void'},'isValidPharFilename':{'signature':'string $filename [, bool $executable = true] | bool','return_type':'bool'},'loadPhar':{'signature':'string $filename [, string $alias] | bool','return_type':'bool'},'mapPhar':{'signature':'[ string $alias [, int $dataoffset = 0]] | bool','return_type':'bool'},'mount':{'signature':'string $pharpath, string $externalpath | void','return_type':'void'},'mungServer':{'signature':'array $munglist | void','return_type':'void'},'running':{'signature':'[ bool $retphar = true] | string','return_type':'string'},'unlinkArchive':{'signature':'string $archive | bool','return_type':'bool'},'webPhar':{'signature':'[ string $alias [, string $index = "index.php" [, string $f404 [, array $mimetypes [, callable $rewrites]]]]] | void','return_type':'void'},},},'pharexception':{'name':'PharException','properties': {'message':{'initializer':'','type':'string'},'code':{'initializer':'','type':'int'},'file':{'initializer':'','type':'string'},'line':{'initializer':'','type':'int'},},'methods':{'getMessage':{'signature':'void | string','return_type':'string'},'getPrevious':{'signature':'void | Exception','return_type':'Exception'},'getCode':{'signature':'void | mixed','return_type':'mixed'},'getFile':{'signature':'void | string','return_type':'string'},'getLine':{'signature':'void | int','return_type':'int'},'getTrace':{'signature':'void | array','return_type':'array'},'getTraceAsString':{'signature':'void | string','return_type':'string'},'__toString':{'signature':'void | string','return_type':'string'},'__clone':{'signature':'void | void','return_type':'void'},},},'pharfileinfo':{'name':'PharFileInfo','methods':{'chmod':{'signature':'int $permissions | void','return_type':'void'},'compress':{'signature':'int $compression | bool','return_type':'bool'},'__construct':{'signature':'string $entry','return_type':''},'decompress':{'signature':'void | bool','return_type':'bool'},'delMetadata':{'signature':'void | bool','return_type':'bool'},'getCRC32':{'signature':'void | int','return_type':'int'},'getCompressedSize':{'signature':'void | int','return_type':'int'},'getMetadata':{'signature':'void | mixed','return_type':'mixed'},'getPharFlags':{'signature':'void | int','return_type':'int'},'hasMetadata':{'signature':'void | bool','return_type':'bool'},'isCRCChecked':{'signature':'void | bool','return_type':'bool'},'isCompressed':{'signature':'[ int $compression_type = 9021976] | bool','return_type':'bool'},'isCompressedBZIP2':{'signature':'void | bool','return_type':'bool'},'isCompressedGZ':{'signature':'void | bool','return_type':'bool'},'setCompressedBZIP2':{'signature':'void | bool','return_type':'bool'},'setCompressedGZ':{'signature':'void | bool','return_type':'bool'},'setMetadata':{'signature':'mixed $metadata | void','return_type':'void'},'setUncompressed':{'signature':'void | bool','return_type':'bool'},},},}
+let php_builtin['classes']['streams']={'php_user_filter':{'name':'php_user_filter','properties': {'filtername':{'initializer':'','type':''},'params':{'initializer':'','type':''},},'methods':{'filter':{'signature':'resource $in, resource $out, int &$consumed, bool $closing | int','return_type':'int'},'onClose':{'signature':'void | void','return_type':'void'},'onCreate':{'signature':'void | bool','return_type':'bool'},},},}
+let php_builtin['classes']['sessions']={'sessionhandler':{'name':'SessionHandler','methods':{'close':{'signature':'void | bool','return_type':'bool'},'destroy':{'signature':'string $session_id | bool','return_type':'bool'},'gc':{'signature':'int $maxlifetime | bool','return_type':'bool'},'open':{'signature':'string $save_path, string $session_id | bool','return_type':'bool'},'read':{'signature':'string $session_id | string','return_type':'string'},'write':{'signature':'string $session_id, string $session_data | bool','return_type':'bool'},},},'sessionhandlerinterface':{'name':'SessionHandlerInterface','methods':{'close':{'signature':'void | bool','return_type':'bool'},'destroy':{'signature':'string $session_id | bool','return_type':'bool'},'gc':{'signature':'string $maxlifetime | bool','return_type':'bool'},'open':{'signature':'string $save_path, string $name | bool','return_type':'bool'},'read':{'signature':'string $session_id | string','return_type':'string'},'write':{'signature':'string $session_id, string $session_data | bool','return_type':'bool'},},},}
+let php_builtin['classes']['simplexml']={'simplexmlelement':{'name':'SimpleXMLElement','methods':{'__construct':{'signature':'string $data [, int $options = 0 [, bool $data_is_url = false [, string $ns = "" [, bool $is_prefix = false]]]]','return_type':''},'addAttribute':{'signature':'string $name [, string $value [, string $namespace]] | void','return_type':'void'},'addChild':{'signature':'string $name [, string $value [, string $namespace]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'asXML':{'signature':'[ string $filename] | mixed','return_type':'mixed'},'attributes':{'signature':'[ string $ns = NULL [, bool $is_prefix = false]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'children':{'signature':'[ string $ns [, bool $is_prefix = false]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'count':{'signature':'void | int','return_type':'int'},'getDocNamespaces':{'signature':'[ bool $recursive = false [, bool $from_root = true]] | array','return_type':'array'},'getName':{'signature':'void | string','return_type':'string'},'getNamespaces':{'signature':'[ bool $recursive = false] | array','return_type':'array'},'registerXPathNamespace':{'signature':'string $prefix, string $ns | bool','return_type':'bool'},'__toString':{'signature':'void | string','return_type':'string'},'xpath':{'signature':'string $path | array','return_type':'array'},},},'simplexmliterator':{'name':'SimpleXMLIterator','methods':{'current':{'signature':'void | mixed','return_type':'mixed'},'getChildren':{'signature':'void | SimpleXMLIterator','return_type':'SimpleXMLIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'key':{'signature':'void | mixed','return_type':'mixed'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | bool','return_type':'bool'},'__construct':{'signature':'string $data [, int $options = 0 [, bool $data_is_url = false [, string $ns = "" [, bool $is_prefix = false]]]]','return_type':''},'addAttribute':{'signature':'string $name [, string $value [, string $namespace]] | void','return_type':'void'},'addChild':{'signature':'string $name [, string $value [, string $namespace]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'asXML':{'signature':'[ string $filename] | mixed','return_type':'mixed'},'attributes':{'signature':'[ string $ns = NULL [, bool $is_prefix = false]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'children':{'signature':'[ string $ns [, bool $is_prefix = false]] | SimpleXMLElement','return_type':'SimpleXMLElement'},'count':{'signature':'void | int','return_type':'int'},'getDocNamespaces':{'signature':'[ bool $recursive = false [, bool $from_root = true]] | array','return_type':'array'},'getName':{'signature':'void | string','return_type':'string'},'getNamespaces':{'signature':'[ bool $recursive = false] | array','return_type':'array'},'registerXPathNamespace':{'signature':'string $prefix, string $ns | bool','return_type':'bool'},'__toString':{'signature':'void | string','return_type':'string'},'xpath':{'signature':'string $path | array','return_type':'array'},},},}
+let php_builtin['classes']['spl_types']={'splbool':{'name':'SplBool','constants':{'__default':'false','false':'false','true':'true',},'methods':{'getConstList':{'signature':'[ bool $include_default = false] | array','return_type':'array'},},},'splenum':{'name':'SplEnum','constants':{'__default':'null',},'methods':{'getConstList':{'signature':'[ bool $include_default = false] | array','return_type':'array'},'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},'splfloat':{'name':'SplFloat','constants':{'__default':'0',},'methods':{'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},'splint':{'name':'SplInt','constants':{'__default':'0',},'methods':{'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},'splstring':{'name':'SplString','constants':{'__default':'0',},'methods':{'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},'spltype':{'name':'SplType','constants':{'__default':'null',},'methods':{'__construct':{'signature':'[ mixed $initial_value [, bool $strict]]','return_type':''},},},}
+let php_builtin['classes']['xmlreader']={'xmlreader':{'name':'XMLReader','constants':{'NONE':'0','ELEMENT':'1','ATTRIBUTE':'2','TEXT':'3','CDATA':'4','ENTITY_REF':'5','ENTITY':'6','PI':'7','COMMENT':'8','DOC':'9','DOC_TYPE':'10','DOC_FRAGMENT':'11','NOTATION':'12','WHITESPACE':'13','SIGNIFICANT_WHITESPACE':'14','END_ELEMENT':'15','END_ENTITY':'16','XML_DECLARATION':'17','LOADDTD':'1','DEFAULTATTRS':'2','VALIDATE':'3','SUBST_ENTITIES':'4',},'properties': {'attributeCount':{'initializer':'','type':'int'},'baseURI':{'initializer':'','type':'string'},'depth':{'initializer':'','type':'int'},'hasAttributes':{'initializer':'','type':'bool'},'hasValue':{'initializer':'','type':'bool'},'isDefault':{'initializer':'','type':'bool'},'isEmptyElement':{'initializer':'','type':'bool'},'localName':{'initializer':'','type':'string'},'name':{'initializer':'','type':'string'},'namespaceURI':{'initializer':'','type':'string'},'nodeType':{'initializer':'','type':'int'},'prefix':{'initializer':'','type':'string'},'value':{'initializer':'','type':'string'},'xmlLang':{'initializer':'','type':'string'},},'methods':{'close':{'signature':'void | bool','return_type':'bool'},'expand':{'signature':'[ DOMNode $basenode] | DOMNode','return_type':'DOMNode'},'getAttribute':{'signature':'string $name | string','return_type':'string'},'getAttributeNo':{'signature':'int $index | string','return_type':'string'},'getAttributeNs':{'signature':'string $localName, string $namespaceURI | string','return_type':'string'},'getParserProperty':{'signature':'int $property | bool','return_type':'bool'},'isValid':{'signature':'void | bool','return_type':'bool'},'lookupNamespace':{'signature':'string $prefix | bool','return_type':'bool'},'moveToAttribute':{'signature':'string $name | bool','return_type':'bool'},'moveToAttributeNo':{'signature':'int $index | bool','return_type':'bool'},'moveToAttributeNs':{'signature':'string $localName, string $namespaceURI | bool','return_type':'bool'},'moveToElement':{'signature':'void | bool','return_type':'bool'},'moveToFirstAttribute':{'signature':'void | bool','return_type':'bool'},'moveToNextAttribute':{'signature':'void | bool','return_type':'bool'},'next':{'signature':'[ string $localname] | bool','return_type':'bool'},'open':{'signature':'string $URI [, string $encoding [, int $options = 0]] | bool','return_type':'bool'},'read':{'signature':'void | bool','return_type':'bool'},'readInnerXML':{'signature':'void | string','return_type':'string'},'readOuterXML':{'signature':'void | string','return_type':'string'},'readString':{'signature':'void | string','return_type':'string'},'setParserProperty':{'signature':'int $property, bool $value | bool','return_type':'bool'},'setRelaxNGSchema':{'signature':'string $filename | bool','return_type':'bool'},'setRelaxNGSchemaSource':{'signature':'string $source | bool','return_type':'bool'},'setSchema':{'signature':'string $filename | bool','return_type':'bool'},'xml':{'signature':'string $source [, string $encoding [, int $options = 0]] | bool','return_type':'bool'},},},}
+let php_builtin['classes']['xmlwriter'] = {'xmlwriter':{'name':'XMLWriter','methods':{'endAttribute':{'signature':'void | bool','return_type':'bool'},'endCData':{'signature':'void | bool','return_type':'bool'},'endComment':{'signature':'void | bool','return_type':'bool'},'endDocument':{'signature':'void | bool','return_type':'bool'},'endDTDAttlist':{'signature':'void | bool','return_type':'bool'},'endDTDElement':{'signature':'void | bool','return_type':'bool'},'endDTDEntity':{'signature':'void | bool','return_type':'bool'},'endDTD':{'signature':'void | bool','return_type':'bool'},'endElement':{'signature':'void | bool','return_type':'bool'},'endPI':{'signature':'void | bool','return_type':'bool'},'flush':{'signature':'[bool $empty = true] | bool','return_type':'bool'},'fullEndElement':{'signature':'void | bool','return_type':'bool'},'openMemory':{'signature':'void | bool','return_type':'bool'},'openURI':{'signature':'string $uri | bool','return_type':'bool'},'outputMemory':{'signature':'[bool $flush = true] | bool','return_type':'bool'},'setIndentString':{'signature':'string $indentString | bool','return_type':'bool'},'setIndent':{'signature':'bool $indent | bool','return_type':'bool'},'startAttributeNS':{'signature':'string $prefix, string $name, string $uri | bool','return_type':'bool'},'startAttribute':{'signature':'string $name | bool','return_type':'bool'},'startCData':{'signature':'void | bool','return_type':'bool'},'startComment':{'signature':'void | bool','return_type':'bool'},'startDocument':{'signature':'[string $version = 1.0 [, string $encoding = NULL [, string $standalone ]]] | bool','return_type':'bool'},'startDTDAttlist':{'signature':'string $name | bool','return_type':'bool'},'startDTDElement':{'signature':'string $qualifiedName | bool','return_type':'bool'},'startDTDEntity':{'signature':'string $name, bool $isparam | bool','return_type':'bool'},'startDTD':{'signature':'string $qualifiedName [, string $publicId [, string $systemId ]] | bool','return_type':'bool'},'startElementNS':{'signature':'string $prefix, string $name, string $uri | bool','return_type':'bool'},'startElement':{'signature':'string $name | bool','return_type':'bool'},'startPI':{'signature':'string $target | bool','return_type':'bool'},'text':{'signature':'string $content | bool','return_type':'bool'},'writeAttributeNS':{'signature':'string $prefix, string $name, string $uri, string $content | bool','return_type':'bool'},'writeAttribute':{'signature':'string $name, string $value | bool','return_type':'bool'},'writeCData':{'signature':'string $content | bool','return_type':'bool'},'writeComment':{'signature':'string $content | bool','return_type':'bool'},'writeDTDAttlist':{'signature':'string $name, string $content | bool','return_type':'bool'},'writeDTDElement':{'signature':'string $name, string $content | bool','return_type':'bool'},'writeDTDEntity':{'signature':'string $name, string $content, bool $pe, string $pubid, string $sysid, string $ndataid | bool','return_type':'bool'},'writeDTD':{'signature':'string $name [, string $publicId [, string $systemId [, string $subset ]]] | bool','return_type':'bool'},'writeElementNS':{'signature':'string $prefix, string $name, string $uri [, string $content ] | bool','return_type':'bool'},'writeElement':{'signature':'string $name [, string $content ] | bool','return_type':'bool'},'writePI':{'signature':'string $target, string $content | bool','return_type':'bool'},'writeRaw':{'signature':'string $content | bool','return_type':'bool'},},},}
+let php_builtin['classes']['zip']={'ziparchive':{'name':'ZipArchive','properties': {'status':{'initializer':'','type':'int'},'statusSys':{'initializer':'','type':'int'},'numFiles':{'initializer':'','type':'int'},'filename':{'initializer':'','type':'string'},'comment':{'initializer':'','type':'string'},},'methods':{'addEmptyDir':{'signature':'string $dirname | bool','return_type':'bool'},'addFile':{'signature':'string $filename [, string $localname = NULL [, int $start = 0 [, int $length = 0]]] | bool','return_type':'bool'},'addFromString':{'signature':'string $localname, string $contents | bool','return_type':'bool'},'addGlob':{'signature':'string $pattern [, int $flags = 0 [, array $options = array()]] | bool','return_type':'bool'},'addPattern':{'signature':'string $pattern [, string $path = ''.'' [, array $options = array()]] | bool','return_type':'bool'},'close':{'signature':'void | bool','return_type':'bool'},'deleteIndex':{'signature':'int $index | bool','return_type':'bool'},'deleteName':{'signature':'string $name | bool','return_type':'bool'},'extractTo':{'signature':'string $destination [, mixed $entries] | bool','return_type':'bool'},'getArchiveComment':{'signature':'[ int $flags] | string','return_type':'string'},'getCommentIndex':{'signature':'int $index [, int $flags] | string','return_type':'string'},'getCommentName':{'signature':'string $name [, int $flags] | string','return_type':'string'},'getFromIndex':{'signature':'int $index [, int $length = 0 [, int $flags]] | string','return_type':'string'},'getFromName':{'signature':'string $name [, int $length = 0 [, int $flags]] | string','return_type':'string'},'getNameIndex':{'signature':'int $index [, int $flags] | string','return_type':'string'},'getStatusString':{'signature':'void | string','return_type':'string'},'getStream':{'signature':'string $name | resource','return_type':'resource'},'locateName':{'signature':'string $name [, int $flags] | int','return_type':'int'},'open':{'signature':'string $filename [, int $flags] | mixed','return_type':'mixed'},'renameIndex':{'signature':'int $index, string $newname | bool','return_type':'bool'},'renameName':{'signature':'string $name, string $newname | bool','return_type':'bool'},'setArchiveComment':{'signature':'string $comment | bool','return_type':'bool'},'setCommentIndex':{'signature':'int $index, string $comment | bool','return_type':'bool'},'setCommentName':{'signature':'string $name, string $comment | bool','return_type':'bool'},'statIndex':{'signature':'int $index [, int $flags] | array','return_type':'array'},'statName':{'signature':'string $name [, int $flags] | array','return_type':'array'},'unchangeAll':{'signature':'void | bool','return_type':'bool'},'unchangeArchive':{'signature':'void | bool','return_type':'bool'},'unchangeIndex':{'signature':'int $index | bool','return_type':'bool'},'unchangeName':{'signature':'string $name | bool','return_type':'bool'},},},}
+let php_builtin['interfaces']['predefined_interfaces_and_classes']={'arrayaccess':{'name':'ArrayAccess','methods':{'offsetExists':{'signature':'mixed $offset | boolean','return_type':'boolean'},'offsetGet':{'signature':'mixed $offset | mixed','return_type':'mixed'},'offsetSet':{'signature':'mixed $offset, mixed $value | void','return_type':'void'},'offsetUnset':{'signature':'mixed $offset | void','return_type':'void'},},},'iterator':{'name':'Iterator','methods':{'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | boolean','return_type':'boolean'},},},'iteratoraggregate':{'name':'IteratorAggregate','methods':{'getIterator':{'signature':'void | Traversable','return_type':'Traversable'},},},'serializable':{'name':'Serializable','methods':{'serialize':{'signature':'void | string','return_type':'string'},'unserialize':{'signature':'string $serialized | void','return_type':'void'},},},'traversable':{'name':'Traversable',},}
+let php_builtin['interfaces']['spl']={'countable':{'name':'Countable','methods':{'count':{'signature':'void | int','return_type':'int'},},},'outeriterator':{'name':'OuterIterator','methods':{'getInnerIterator':{'signature':'void | Iterator','return_type':'Iterator'},'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | boolean','return_type':'boolean'},},},'recursiveiterator':{'name':'RecursiveIterator','methods':{'getChildren':{'signature':'void | RecursiveIterator','return_type':'RecursiveIterator'},'hasChildren':{'signature':'void | bool','return_type':'bool'},'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | boolean','return_type':'boolean'},},},'seekableiterator':{'name':'SeekableIterator','methods':{'seek':{'signature':'int $position | void','return_type':'void'},'current':{'signature':'void | mixed','return_type':'mixed'},'key':{'signature':'void | scalar','return_type':'scalar'},'next':{'signature':'void | void','return_type':'void'},'rewind':{'signature':'void | void','return_type':'void'},'valid':{'signature':'void | boolean','return_type':'boolean'},},},'splobserver':{'name':'SplObserver','methods':{'update':{'signature':'SplSubject $subject | void','return_type':'void'},},},'splsubject':{'name':'SplSubject','methods':{'attach':{'signature':'SplObserver $observer | void','return_type':'void'},'detach':{'signature':'SplObserver $observer | void','return_type':'void'},'notify':{'signature':'void | void','return_type':'void'},},},}
+let php_builtin['interfaces']['date_time']={'datetimeinterface':{'name':'DateTimeInterface','methods':{'diff':{'signature':'DateTimeInterface $datetime2 [, bool $absolute = false] | DateInterval','return_type':'DateInterval'},'format':{'signature':'string $format | string','return_type':'string'},'getOffset':{'signature':'void | int','return_type':'int'},'getTimestamp':{'signature':'void | int','return_type':'int'},'getTimezone':{'signature':'void | DateTimeZone','return_type':'DateTimeZone'},'__wakeup':{'signature':'void','return_type':''},},},}
+let php_builtin['interfaces']['json']={'jsonserializable':{'name':'JsonSerializable','methods':{'jsonSerialize':{'signature':'void | mixed','return_type':'mixed'},},},}
+let php_builtin['constants']['common']={'TRUE':'','FALSE':'','NULL':'','E_NOTICE':'','E_DEPRECATED':'','E_RECOVERABLE_ERROR':'','E_ALL':'','E_STRICT':'','E_WARNING':'','E_ERROR':'','E_PARSE':'','E_CORE_ERROR':'','E_CORE_WARNING':'','E_COMPILE_ERROR':'','E_COMPILE_WARNING':'','E_USER_ERROR':'','E_USER_WARNING':'','E_USER_NOTICE':'','E_USER_DEPRECATED':'','__COMPILER_HALT_OFFSET__':'','__FILE__':'','__LINE__':'','__DIR__':'','__FUNCTION__':'','__CLASS__':'','__TRAIT__':'','__METHOD__':'','__NAMESPACE__':'',}
+let php_builtin['constants']['arrays']={'CASE_LOWER':'','CASE_UPPER':'','SORT_ASC':'','SORT_DESC':'','SORT_REGULAR':'','SORT_NUMERIC':'','SORT_STRING':'','SORT_LOCALE_STRING':'','SORT_NATURAL':'','SORT_FLAG_CASE':'','COUNT_NORMAL':'','COUNT_RECURSIVE':'','EXTR_OVERWRITE':'','EXTR_SKIP':'','EXTR_PREFIX_SAME':'','EXTR_PREFIX_ALL':'','EXTR_PREFIX_INVALID':'','EXTR_PREFIX_IF_EXISTS':'','EXTR_IF_EXISTS':'','EXTR_REFS':'',}
+let php_builtin['constants']['calendar']={'CAL_GREGORIAN':'','CAL_JULIAN':'','CAL_JEWISH':'','CAL_FRENCH':'','CAL_NUM_CALS':'','CAL_DOW_DAYNO':'','CAL_DOW_SHORT':'','CAL_DOW_LONG':'','CAL_MONTH_GREGORIAN_SHORT':'','CAL_MONTH_GREGORIAN_LONG':'','CAL_MONTH_JULIAN_SHORT':'','CAL_MONTH_JULIAN_LONG':'','CAL_MONTH_JEWISH':'','CAL_MONTH_FRENCH':'','CAL_EASTER_DEFAULT':'','CAL_EASTER_ROMAN':'','CAL_EASTER_ALWAYS_GREGORIAN':'','CAL_EASTER_ALWAYS_JULIAN':'','CAL_JEWISH_ADD_ALAFIM_GERESH':'','CAL_JEWISH_ADD_ALAFIM':'','CAL_JEWISH_ADD_GERESHAYIM':'',}
+let php_builtin['constants']['curl']={'CURLOPT_POSTFIELDS':'','CURLOPT_CAINFO':'','CURLOPT_AUTOREFERER':'','CURLOPT_COOKIESESSION':'','CURLOPT_DNS_USE_GLOBAL_CACHE':'','CURLOPT_DNS_CACHE_TIMEOUT':'','CURLOPT_FTP_SSL':'','CURLFTPSSL_TRY':'','CURLFTPSSL_ALL':'','CURLFTPSSL_CONTROL':'','CURLFTPSSL_NONE':'','CURLOPT_PRIVATE':'','CURLOPT_FTPSSLAUTH':'','CURLOPT_PORT':'','CURLOPT_FILE':'','CURLOPT_INFILE':'','CURLOPT_INFILESIZE':'','CURLOPT_URL':'','CURLOPT_PROXY':'','CURLOPT_VERBOSE':'','CURLOPT_HEADER':'','CURLOPT_HTTPHEADER':'','CURLOPT_NOPROGRESS':'','CURLOPT_NOBODY':'','CURLOPT_FAILONERROR':'','CURLOPT_UPLOAD':'','CURLOPT_POST':'','CURLOPT_FTPLISTONLY':'','CURLOPT_FTPAPPEND':'','CURLOPT_FTP_CREATE_MISSING_DIRS':'','CURLOPT_NETRC':'','CURLOPT_FOLLOWLOCATION':'','CURLOPT_FTPASCII':'','CURLOPT_PUT':'','CURLOPT_MUTE':'','CURLOPT_USERPWD':'','CURLOPT_PROXYUSERPWD':'','CURLOPT_RANGE':'','CURLOPT_TIMEOUT':'','CURLOPT_TIMEOUT_MS':'','CURLOPT_TCP_NODELAY':'','CURLOPT_PROGRESSFUNCTION':'','CURLOPT_REFERER':'','CURLOPT_USERAGENT':'','CURLOPT_FTPPORT':'','CURLOPT_FTP_USE_EPSV':'','CURLOPT_LOW_SPEED_LIMIT':'','CURLOPT_LOW_SPEED_TIME':'','CURLOPT_RESUME_FROM':'','CURLOPT_COOKIE':'','CURLOPT_SSLCERT':'','CURLOPT_SSLCERTPASSWD':'','CURLOPT_WRITEHEADER':'','CURLOPT_SSL_VERIFYHOST':'','CURLOPT_COOKIEFILE':'','CURLOPT_SSLVERSION':'','CURLOPT_TIMECONDITION':'','CURLOPT_TIMEVALUE':'','CURLOPT_CUSTOMREQUEST':'','CURLOPT_STDERR':'','CURLOPT_TRANSFERTEXT':'','CURLOPT_RETURNTRANSFER':'','CURLOPT_QUOTE':'','CURLOPT_POSTQUOTE':'','CURLOPT_INTERFACE':'','CURLOPT_KRB4LEVEL':'','CURLOPT_HTTPPROXYTUNNEL':'','CURLOPT_FILETIME':'','CURLOPT_WRITEFUNCTION':'','CURLOPT_READFUNCTION':'','CURLOPT_PASSWDFUNCTION':'','CURLOPT_HEADERFUNCTION':'','CURLOPT_MAXREDIRS':'','CURLOPT_MAXCONNECTS':'','CURLOPT_CLOSEPOLICY':'','CURLOPT_FRESH_CONNECT':'','CURLOPT_FORBID_REUSE':'','CURLOPT_RANDOM_FILE':'','CURLOPT_EGDSOCKET':'','CURLOPT_CONNECTTIMEOUT':'','CURLOPT_CONNECTTIMEOUT_MS':'','CURLOPT_SSL_VERIFYPEER':'','CURLOPT_CAPATH':'','CURLOPT_COOKIEJAR':'','CURLOPT_SSL_CIPHER_LIST':'','CURLOPT_BINARYTRANSFER':'','CURLOPT_NOSIGNAL':'','CURLOPT_PROXYTYPE':'','CURLOPT_BUFFERSIZE':'','CURLOPT_HTTPGET':'','CURLOPT_HTTP_VERSION':'','CURLOPT_SSLKEY':'','CURLOPT_SSLKEYTYPE':'','CURLOPT_SSLKEYPASSWD':'','CURLOPT_SSLENGINE':'','CURLOPT_SSLENGINE_DEFAULT':'','CURLOPT_SSLCERTTYPE':'','CURLOPT_CRLF':'','CURLOPT_ENCODING':'','CURLOPT_PROXYPORT':'','CURLOPT_UNRESTRICTED_AUTH':'','CURLOPT_FTP_USE_EPRT':'','CURLOPT_HTTP200ALIASES':'','CURLOPT_HTTPAUTH':'','CURLAUTH_BASIC':'','CURLAUTH_DIGEST':'','CURLAUTH_GSSNEGOTIATE':'','CURLAUTH_NTLM':'','CURLAUTH_ANY':'','CURLAUTH_ANYSAFE':'','CURLOPT_PROXYAUTH':'','CURLOPT_MAX_RECV_SPEED_LARGE':'','CURLOPT_MAX_SEND_SPEED_LARGE':'','CURLCLOSEPOLICY_LEAST_RECENTLY_USED':'','CURLCLOSEPOLICY_LEAST_TRAFFIC':'','CURLCLOSEPOLICY_SLOWEST':'','CURLCLOSEPOLICY_CALLBACK':'','CURLCLOSEPOLICY_OLDEST':'','CURLINFO_PRIVATE':'','CURLINFO_EFFECTIVE_URL':'','CURLINFO_HTTP_CODE':'','CURLINFO_HEADER_OUT':'','CURLINFO_HEADER_SIZE':'','CURLINFO_REQUEST_SIZE':'','CURLINFO_TOTAL_TIME':'','CURLINFO_NAMELOOKUP_TIME':'','CURLINFO_CONNECT_TIME':'','CURLINFO_PRETRANSFER_TIME':'','CURLINFO_SIZE_UPLOAD':'','CURLINFO_SIZE_DOWNLOAD':'','CURLINFO_SPEED_DOWNLOAD':'','CURLINFO_SPEED_UPLOAD':'','CURLINFO_FILETIME':'','CURLINFO_SSL_VERIFYRESULT':'','CURLINFO_CONTENT_LENGTH_DOWNLOAD':'','CURLINFO_CONTENT_LENGTH_UPLOAD':'','CURLINFO_STARTTRANSFER_TIME':'','CURLINFO_CONTENT_TYPE':'','CURLINFO_REDIRECT_TIME':'','CURLINFO_REDIRECT_COUNT':'','CURL_TIMECOND_IFMODSINCE':'','CURL_TIMECOND_IFUNMODSINCE':'','CURL_TIMECOND_LASTMOD':'','CURL_VERSION_IPV6':'','CURL_VERSION_KERBEROS4':'','CURL_VERSION_SSL':'','CURL_VERSION_LIBZ':'','CURLVERSION_NOW':'','CURLE_OK':'','CURLE_UNSUPPORTED_PROTOCOL':'','CURLE_FAILED_INIT':'','CURLE_URL_MALFORMAT':'','CURLE_URL_MALFORMAT_USER':'','CURLE_COULDNT_RESOLVE_PROXY':'','CURLE_COULDNT_RESOLVE_HOST':'','CURLE_COULDNT_CONNECT':'','CURLE_FTP_WEIRD_SERVER_REPLY':'','CURLE_FTP_ACCESS_DENIED':'','CURLE_FTP_USER_PASSWORD_INCORRECT':'','CURLE_FTP_WEIRD_PASS_REPLY':'','CURLE_FTP_WEIRD_USER_REPLY':'','CURLE_FTP_WEIRD_PASV_REPLY':'','CURLE_FTP_WEIRD_227_FORMAT':'','CURLE_FTP_CANT_GET_HOST':'','CURLE_FTP_CANT_RECONNECT':'','CURLE_FTP_COULDNT_SET_BINARY':'','CURLE_PARTIAL_FILE':'','CURLE_FTP_COULDNT_RETR_FILE':'','CURLE_FTP_WRITE_ERROR':'','CURLE_FTP_QUOTE_ERROR':'','CURLE_HTTP_NOT_FOUND':'','CURLE_WRITE_ERROR':'','CURLE_MALFORMAT_USER':'','CURLE_FTP_COULDNT_STOR_FILE':'','CURLE_READ_ERROR':'','CURLE_OUT_OF_MEMORY':'','CURLE_OPERATION_TIMEOUTED':'','CURLE_FTP_COULDNT_SET_ASCII':'','CURLE_FTP_PORT_FAILED':'','CURLE_FTP_COULDNT_USE_REST':'','CURLE_FTP_COULDNT_GET_SIZE':'','CURLE_HTTP_RANGE_ERROR':'','CURLE_HTTP_POST_ERROR':'','CURLE_SSL_CONNECT_ERROR':'','CURLE_FTP_BAD_DOWNLOAD_RESUME':'','CURLE_FILE_COULDNT_READ_FILE':'','CURLE_LDAP_CANNOT_BIND':'','CURLE_LDAP_SEARCH_FAILED':'','CURLE_LIBRARY_NOT_FOUND':'','CURLE_FUNCTION_NOT_FOUND':'','CURLE_ABORTED_BY_CALLBACK':'','CURLE_BAD_FUNCTION_ARGUMENT':'','CURLE_BAD_CALLING_ORDER':'','CURLE_HTTP_PORT_FAILED':'','CURLE_BAD_PASSWORD_ENTERED':'','CURLE_TOO_MANY_REDIRECTS':'','CURLE_UNKNOWN_TELNET_OPTION':'','CURLE_TELNET_OPTION_SYNTAX':'','CURLE_OBSOLETE':'','CURLE_SSL_PEER_CERTIFICATE':'','CURLE_GOT_NOTHING':'','CURLE_SSL_ENGINE_NOTFOUND':'','CURLE_SSL_ENGINE_SETFAILED':'','CURLE_SEND_ERROR':'','CURLE_RECV_ERROR':'','CURLE_SHARE_IN_USE':'','CURLE_SSL_CERTPROBLEM':'','CURLE_SSL_CIPHER':'','CURLE_SSL_CACERT':'','CURLE_BAD_CONTENT_ENCODING':'','CURLE_LDAP_INVALID_URL':'','CURLE_FILESIZE_EXCEEDED':'','CURLE_FTP_SSL_FAILED':'','CURLFTPAUTH_DEFAULT':'','CURLFTPAUTH_SSL':'','CURLFTPAUTH_TLS':'','CURLPROXY_HTTP':'','CURLPROXY_SOCKS5':'','CURL_NETRC_OPTIONAL':'','CURL_NETRC_IGNORED':'','CURL_NETRC_REQUIRED':'','CURL_HTTP_VERSION_NONE':'','CURL_HTTP_VERSION_1_0':'','CURL_HTTP_VERSION_1_1':'','CURLM_CALL_MULTI_PERFORM':'','CURLM_OK':'','CURLM_BAD_HANDLE':'','CURLM_BAD_EASY_HANDLE':'','CURLM_OUT_OF_MEMORY':'','CURLM_INTERNAL_ERROR':'','CURLMSG_DONE':'','CURLOPT_KEYPASSWD':'','CURLOPT_SSH_AUTH_TYPES':'','CURLOPT_SSH_HOST_PUBLIC_KEY_MD5':'','CURLOPT_SSH_PRIVATE_KEYFILE':'','CURLOPT_SSH_PUBLIC_KEYFILE':'','CURLMOPT_PIPELINING':'','CURLMOPT_MAXCONNECTS':'','CURLSSH_AUTH_ANY':'','CURLSSH_AUTH_DEFAULT':'','CURLSSH_AUTH_HOST':'','CURLSSH_AUTH_KEYBOARD':'','CURLSSH_AUTH_NONE':'','CURLSSH_AUTH_PASSWORD':'','CURLSSH_AUTH_PUBLICKEY':'','CURL_WRAPPERS_ENABLED':'','CURLPAUSE_ALL':'','CURLPAUSE_CONT':'','CURLPAUSE_RECV':'','CURLPAUSE_RECV_CONT':'','CURLPAUSE_SEND':'','CURLPAUSE_SEND_CONT':'','CURLM_XXX':'','CURLOPT_CERTINFO':'','CURLOPT_CONNECT_ONLY':'','CURLINFO_':'','CURLOPT_PROTOCOLS':'','CURLOPT_REDIR_PROTOCOLS':'','CURLOPT_IPRESOLVE':'','CURL_IPRESOLVE_WHATEVER':'','CURL_IPRESOLVE_V4':'','CURL_IPRESOLVE_V6':'','CURLOPT_SHARE':'','CURLSHOPT_SHARE':'','CURLSHOPT_UNSHARE':'','CURL_LOCK_DATA_COOKIE':'','CURL_LOCK_DATA_DNS':'','CURL_LOCK_DATA_SSL_SESSION':'',}
+let php_builtin['constants']['date_time']={'DATE_ATOM':'','DATE_COOKIE':'','DATE_ISO8601':'','DATE_RFC822':'','DATE_RFC850':'','DATE_RFC1036':'','DATE_RFC1123':'','DATE_RFC2822':'','DATE_RFC3339':'','DATE_RSS':'','DATE_W3C':'','SUNFUNCS_RET_TIMESTAMP':'','SUNFUNCS_RET_STRING':'','SUNFUNCS_RET_DOUBLE':'','LC_TIME':'',}
+let php_builtin['constants']['libxml']={'LIBXML_ERR_WARNING':'','LIBXML_ERR_ERROR':'','LIBXML_ERR_FATAL':'','LIBXML_NONET':'','LIBXML_COMPACT':'','LIBXML_DTDATTR':'','LIBXML_DTDLOAD':'','LIBXML_DTDVALID':'','LIBXML_HTML_NOIMPLIED':'','LIBXML_HTML_NODEFDTD':'','LIBXML_NOBLANKS':'','LIBXML_NOCDATA':'','LIBXML_NOEMPTYTAG':'','LIBXML_NOENT':'','LIBXML_NOERROR':'','LIBXML_NOWARNING':'','LIBXML_NOXMLDECL':'','LIBXML_NSCLEAN':'','LIBXML_PARSEHUGE':'','LIBXML_PEDANTIC':'','LIBXML_XINCLUDE':'','LIBXML_ERR_NONE':'','LIBXML_VERSION':'','LIBXML_DOTTED_VERSION':'','LIBXML_SCHEMA_CREATE':'',}
+let php_builtin['constants']['mysqli']={'MYSQLI_REPORT_OFF':'','MYSQLI_REPORT_ALL':'','MYSQLI_REPORT_STRICT':'','MYSQLI_REPORT_ERROR':'','MYSQLI_REPORT_INDEX':'','MYSQLI_ASSOC':'','MYSQLI_NUM':'','MYSQLI_BOTH':'','PHP_INT_MAX':'','MYSQLI_READ_DEFAULT_GROUP':'','MYSQLI_READ_DEFAULT_FILE':'','MYSQLI_OPT_CONNECT_TIMEOUT':'','MYSQLI_OPT_LOCAL_INFILE':'','MYSQLI_INIT_COMMAND':'','MYSQLI_CLIENT_SSL':'','MYSQLI_CLIENT_COMPRESS':'','MYSQLI_CLIENT_INTERACTIVE':'','MYSQLI_CLIENT_IGNORE_SPACE':'','MYSQLI_CLIENT_NO_SCHEMA':'','MYSQLI_CLIENT_MULTI_QUERIES':'','MYSQLI_STORE_RESULT':'','MYSQLI_USE_RESULT':'','MYSQLI_NOT_NULL_FLAG':'','MYSQLI_PRI_KEY_FLAG':'','MYSQLI_UNIQUE_KEY_FLAG':'','MYSQLI_MULTIPLE_KEY_FLAG':'','MYSQLI_BLOB_FLAG':'','MYSQLI_UNSIGNED_FLAG':'','MYSQLI_ZEROFILL_FLAG':'','MYSQLI_AUTO_INCREMENT_FLAG':'','MYSQLI_TIMESTAMP_FLAG':'','MYSQLI_SET_FLAG':'','MYSQLI_NUM_FLAG':'','MYSQLI_PART_KEY_FLAG':'','MYSQLI_GROUP_FLAG':'','MYSQLI_TYPE_DECIMAL':'','MYSQLI_TYPE_NEWDECIMAL':'','MYSQLI_TYPE_BIT':'','MYSQLI_TYPE_TINY':'','MYSQLI_TYPE_SHORT':'','MYSQLI_TYPE_LONG':'','MYSQLI_TYPE_FLOAT':'','MYSQLI_TYPE_DOUBLE':'','MYSQLI_TYPE_NULL':'','MYSQLI_TYPE_TIMESTAMP':'','MYSQLI_TYPE_LONGLONG':'','MYSQLI_TYPE_INT24':'','MYSQLI_TYPE_DATE':'','MYSQLI_TYPE_TIME':'','MYSQLI_TYPE_DATETIME':'','MYSQLI_TYPE_YEAR':'','MYSQLI_TYPE_NEWDATE':'','MYSQLI_TYPE_INTERVAL':'','MYSQLI_TYPE_ENUM':'','MYSQLI_TYPE_SET':'','MYSQLI_TYPE_TINY_BLOB':'','MYSQLI_TYPE_MEDIUM_BLOB':'','MYSQLI_TYPE_LONG_BLOB':'','MYSQLI_TYPE_BLOB':'','MYSQLI_TYPE_VAR_STRING':'','MYSQLI_TYPE_STRING':'','MYSQLI_TYPE_CHAR':'','MYSQLI_TYPE_GEOMETRY':'','MYSQLI_NEED_DATA':'','MYSQLI_NO_DATA':'','MYSQLI_DATA_TRUNCATED':'','MYSQLI_ENUM_FLAG':'','MYSQLI_BINARY_FLAG':'','MYSQLI_CURSOR_TYPE_FOR_UPDATE':'','MYSQLI_CURSOR_TYPE_NO_CURSOR':'','MYSQLI_CURSOR_TYPE_READ_ONLY':'','MYSQLI_CURSOR_TYPE_SCROLLABLE':'','MYSQLI_STMT_ATTR_CURSOR_TYPE':'','MYSQLI_STMT_ATTR_PREFETCH_ROWS':'','MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH':'','MYSQLI_SET_CHARSET_NAME':'','MYSQLI_DEBUG_TRACE_ENABLED':'','MYSQLI_SERVER_QUERY_NO_GOOD_INDEX_USED':'','MYSQLI_SERVER_QUERY_NO_INDEX_USED':'','MYSQLI_REFRESH_GRANT':'','MYSQLI_REFRESH_LOG':'','MYSQLI_REFRESH_TABLES':'','MYSQLI_REFRESH_HOSTS':'','MYSQLI_REFRESH_STATUS':'','MYSQLI_REFRESH_THREADS':'','MYSQLI_REFRESH_SLAVE':'','MYSQLI_REFRESH_MASTER':'','MYSQLI_TRANS_COR_AND_CHAIN':'','MYSQLI_TRANS_COR_AND_NO_CHAIN':'','MYSQLI_TRANS_COR_RELEASE':'','MYSQLI_TRANS_COR_NO_RELEASE':'','MYSQL_READ_DEFAULT_FILE':'','MYSQLI_SERVER_PUBLIC_KEY':'','MYSQLI_NO_CHANGE_USER_ON_PCONNECT':'','MYSQLI_ASYNC':'','MYSQLI_OPT_INT_AND_FLOAT_NATIVE':'','MYSQLI_CLIENT_FOUND_ROWS':'','MULTI_STATEMENT':'','MYSQLI_RPL_MASTER':'','MYSQLI_RPL_SLAVE':'','MYSQLI_RPL_ADMIN':'',}
+let php_builtin['constants']['spl']={'READ_AHEAD':'','MIT_NEED_ALL':'','MIT_KEYS_ASSOC':'','CALL_TOSTRING':'','CATCH_GET_CHILD':'','RIT_LEAVES_ONLY':'','LOCK_SH':'','LOCK_EX':'','LOCK_UN':'','LOCK_NB':'','SEEK_SET':'','SEEK_CUR':'','SEEK_END':'','PHP_INT_MAX':'',}
+let php_builtin['constants']['unknow']={'PHP_INI_ALL':'','PHP_INI_PERDIR':'','PHP_INI_SYSTEM':'','PHP_INI_USER':'','COUNTER_FLAG_PERSIST':'','COUNTER_FLAG_SAVE':'','COUNTER_FLAG_NO_OVERWRITE':'','COUNTER_META_NAME':'','COUNTER_META_IS_PERISTENT':'','COUNTER_RESET_NEVER':'','COUNTER_RESET_PER_LOAD':'','COUNTER_RESET_PER_REQUEST':'','PDO_PLACEHOLDER_NAMED':'','PDO_PLACEHOLDER_POSITIONAL':'','PDO_PLACEHOLDER_NONE':'','PDO_CASE_NATURAL':'','PDO_CASE_UPPER':'','PDO_CASE_LOWER':'','PDO_ATTR_CASE':'','PHP_COUNTER_API':'','PHPAPI':'','COMPILE_DL_COUNTER':'','ZEND_GET_MODULE':'','HAVE_COUNTER':'','COUNTER_G':'','TSRMLS_DC':'','TSRMLS_FETCH':'','STANDARD_MODULE_HEADER':'','STANDARD_MODULE_HEADER_EX':'','STANDARD_MODULE_PROPERTIES':'','STANDARD_MODULE_PROPERTIES_EX':'','ZEND_MODULE_API_NO':'','ZEND_DEBUG':'','USING_ZTS':'','NO_VERSION_YET':'','NO_MODULE_GLOBALS':'','PHP_MODULE_GLOBALS':'','IGNORE_PATH':'','USE_PATH':'','IGNORE_URL':'','IGNORE_URL_WIN':'','ENFORCE_SAFE_MODE':'','REPORT_ERRORS':'','STREAM_MUST_SEEK':'','STREAM_WILL_CAST':'',}
+let php_builtin['constants']['directories']={'DIRECTORY_SEPARATOR':'','PATH_SEPARATOR':'','SCANDIR_SORT_ASCENDING':'','SCANDIR_SORT_DESCENDING':'','SCANDIR_SORT_NONE':'',}
+let php_builtin['constants']['dom']={'XML_ELEMENT_NODE':'','XML_ATTRIBUTE_NODE':'','XML_TEXT_NODE':'','XML_CDATA_SECTION_NODE':'','XML_ENTITY_REF_NODE':'','XML_ENTITY_NODE':'','XML_PI_NODE':'','XML_COMMENT_NODE':'','XML_DOCUMENT_NODE':'','XML_DOCUMENT_TYPE_NODE':'','XML_DOCUMENT_FRAG_NODE':'','XML_NOTATION_NODE':'','XML_HTML_DOCUMENT_NODE':'','XML_DTD_NODE':'','XML_ELEMENT_DECL_NODE':'','XML_ATTRIBUTE_DECL_NODE':'','XML_ENTITY_DECL_NODE':'','XML_NAMESPACE_DECL_NODE':'','XML_ATTRIBUTE_CDATA':'','XML_ATTRIBUTE_ID':'','XML_ATTRIBUTE_IDREF':'','XML_ATTRIBUTE_IDREFS':'','XML_ATTRIBUTE_ENTITY':'','XML_ATTRIBUTE_NMTOKEN':'','XML_ATTRIBUTE_NMTOKENS':'','XML_ATTRIBUTE_ENUMERATION':'','XML_ATTRIBUTE_NOTATION':'','DOM_PHP_ERR':'','DOM_INDEX_SIZE_ERR':'','DOMSTRING_SIZE_ERR':'','DOM_HIERARCHY_REQUEST_ERR':'','DOM_WRONG_DOCUMENT_ERR':'','DOM_INVALID_CHARACTER_ERR':'','DOM_NO_DATA_ALLOWED_ERR':'','DOM_NO_MODIFICATION_ALLOWED_ERR':'','DOM_NOT_FOUND_ERR':'','DOM_NOT_SUPPORTED_ERR':'','DOM_INUSE_ATTRIBUTE_ERR':'','DOM_INVALID_STATE_ERR':'','DOM_SYNTAX_ERR':'','DOM_INVALID_MODIFICATION_ERR':'','DOM_NAMESPACE_ERR':'','DOM_INVALID_ACCESS_ERR':'','DOM_VALIDATION_ERR':'','DOM_NOT_FOUND_ERROR':'','DOM_NOT_FOUND':'',}
+let php_builtin['constants']['command_line_usage']={'PHP_SAPI':'','STDIN':'','STDOUT':'','STDERR':'',}
+let php_builtin['constants']['handling_file_uploads']={'UPLOAD_ERR_OK':'','UPLOAD_ERR_INI_SIZE':'','UPLOAD_ERR_FORM_SIZE':'','UPLOAD_ERR_PARTIAL':'','UPLOAD_ERR_NO_FILE':'','UPLOAD_ERR_NO_TMP_DIR':'','UPLOAD_ERR_CANT_WRITE':'','UPLOAD_ERR_EXTENSION':'',}
+let php_builtin['constants']['fileinfo']={'FILEINFO_NONE':'','FILEINFO_SYMLINK':'','FILEINFO_MIME_TYPE':'','FILEINFO_MIME_ENCODING':'','FILEINFO_MIME':'','FILEINFO_COMPRESS':'','FILEINFO_DEVICES':'','FILEINFO_CONTINUE':'','FILEINFO_PRESERVE_ATIME':'','FILEINFO_RAW':'',}
+let php_builtin['constants']['filesystem']={'SEEK_SET':'','SEEK_CUR':'','SEEK_END':'','LOCK_SH':'','LOCK_EX':'','LOCK_UN':'','LOCK_NB':'','GLOB_BRACE':'','GLOB_ONLYDIR':'','GLOB_MARK':'','GLOB_NOSORT':'','GLOB_NOCHECK':'','GLOB_NOESCAPE':'','GLOB_AVAILABLE_FLAGS':'','PATHINFO_DIRNAME':'','PATHINFO_BASENAME':'','PATHINFO_EXTENSION':'','PATHINFO_FILENAME':'','FILE_USE_INCLUDE_PATH':'','FILE_NO_DEFAULT_CONTEXT':'','FILE_APPEND':'','FILE_IGNORE_NEW_LINES':'','FILE_SKIP_EMPTY_LINES':'','FILE_BINARY':'','FILE_TEXT':'','INI_SCANNER_NORMAL':'','INI_SCANNER_RAW':'','FNM_NOESCAPE':'','FNM_PATHNAME':'','FNM_PERIOD':'','FNM_CASEFOLD':'','GLOB_ERR':'',}
+let php_builtin['constants']['filter']={'FILTER_FLAG_NO_ENCODE_QUOTES':'','INPUT_POST':'','INPUT_GET':'','INPUT_COOKIE':'','INPUT_ENV':'','INPUT_SERVER':'','INPUT_SESSION':'','INPUT_REQUEST':'','FILTER_FLAG_NONE':'','FILTER_REQUIRE_SCALAR':'','FILTER_REQUIRE_ARRAY':'','FILTER_FORCE_ARRAY':'','FILTER_NULL_ON_FAILURE':'','FILTER_VALIDATE_INT':'','FILTER_VALIDATE_BOOLEAN':'','FILTER_VALIDATE_FLOAT':'','FILTER_VALIDATE_REGEXP':'','FILTER_VALIDATE_URL':'','FILTER_VALIDATE_EMAIL':'','FILTER_VALIDATE_IP':'','FILTER_DEFAULT':'','FILTER_UNSAFE_RAW':'','FILTER_SANITIZE_STRING':'','FILTER_SANITIZE_STRIPPED':'','FILTER_SANITIZE_ENCODED':'','FILTER_SANITIZE_SPECIAL_CHARS':'','FILTER_SANITIZE_EMAIL':'','FILTER_SANITIZE_URL':'','FILTER_SANITIZE_NUMBER_INT':'','FILTER_SANITIZE_NUMBER_FLOAT':'','FILTER_SANITIZE_MAGIC_QUOTES':'','FILTER_CALLBACK':'','FILTER_FLAG_ALLOW_OCTAL':'','FILTER_FLAG_ALLOW_HEX':'','FILTER_FLAG_STRIP_LOW':'','FILTER_FLAG_STRIP_HIGH':'','FILTER_FLAG_ENCODE_LOW':'','FILTER_FLAG_ENCODE_HIGH':'','FILTER_FLAG_ENCODE_AMP':'','FILTER_FLAG_EMPTY_STRING_NULL':'','FILTER_FLAG_ALLOW_FRACTION':'','FILTER_FLAG_ALLOW_THOUSAND':'','FILTER_FLAG_ALLOW_SCIENTIFIC':'','FILTER_FLAG_PATH_REQUIRED':'','FILTER_FLAG_QUERY_REQUIRED':'','FILTER_FLAG_IPV4':'','FILTER_FLAG_IPV6':'','FILTER_FLAG_NO_RES_RANGE':'','FILTER_FLAG_NO_PRIV_RANGE':'','FILTER_SANITIZE_RAW':'','FILTER_SANITIZE_FULL_SPECIAL_CHARS':'','ENT_QUOTES':'',}
+let php_builtin['constants']['php_options_info']={'ASSERT_CALLBACK':'','RUSAGE_CHILDREN':'','PHP_SAPI':'','PHP_OS':'','CREDITS_DOCS':'','CREDITS_GENERAL':'','CREDITS_GROUP':'','CREDITS_MODULES':'','CREDITS_FULLPAGE':'','PHP_VERSION_ID':'','PHP_VERSION':'','PATH_SEPARATOR':'','CREDITS_SAPI':'','CREDITS_QA':'','CREDITS_ALL':'','INFO_GENERAL':'','INFO_CREDITS':'','INFO_CONFIGURATION':'','INFO_MODULES':'','INFO_ENVIRONMENT':'','INFO_VARIABLES':'','INFO_LICENSE':'','INFO_ALL':'','ASSERT_ACTIVE':'','ASSERT_BAIL':'','ASSERT_WARNING':'','ASSERT_QUIET_EVAL':'','PHP_WINDOWS_VERSION_MAJOR':'','PHP_WINDOWS_VERSION_MINOR':'','PHP_WINDOWS_VERSION_BUILD':'','PHP_WINDOWS_VERSION_PLATFORM':'','PHP_WINDOWS_VERSION_SP_MAJOR':'','PHP_WINDOWS_VERSION_SP_MINOR':'','PHP_WINDOWS_VERSION_SUITEMASK':'','PHP_WINDOWS_VERSION_PRODUCTTYPE':'','PHP_WINDOWS_NT_DOMAIN_CONTROLLER':'','PHP_WINDOWS_NT_SERVER':'','PHP_WINDOWS_NT_WORKSTATION':'',}
+let php_builtin['constants']['strings']={'CRYPT_SALT_LENGTH':'','CRYPT_STD_DES':'','CRYPT_EXT_DES':'','CRYPT_MD5':'','CRYPT_BLOWFISH':'','CRYPT_SHA256':'','CRYPT_SHA512':'','HTML_ENTITIES':'','HTML_SPECIALCHARS':'','ENT_COMPAT':'','ENT_QUOTES':'','ENT_NOQUOTES':'','ENT_HTML401':'','ENT_XML1':'','ENT_XHTML':'','ENT_HTML5':'','ENT_IGNORE':'','ENT_SUBSTITUTE':'','ENT_DISALLOWED':'','CHAR_MAX':'','LC_MONETARY':'','AM_STR':'','PM_STR':'','D_T_FMT':'','D_FMT':'','T_FMT':'','T_FMT_AMPM':'','ERA':'','ERA_YEAR':'','ERA_D_T_FMT':'','ERA_D_FMT':'','ERA_T_FMT':'','INT_CURR_SYMBOL':'','CURRENCY_SYMBOL':'','CRNCYSTR':'','MON_DECIMAL_POINT':'','MON_THOUSANDS_SEP':'','MON_GROUPING':'','POSITIVE_SIGN':'','NEGATIVE_SIGN':'','INT_FRAC_DIGITS':'','FRAC_DIGITS':'','P_CS_PRECEDES':'','P_SEP_BY_SPACE':'','N_CS_PRECEDES':'','N_SEP_BY_SPACE':'','P_SIGN_POSN':'','N_SIGN_POSN':'','DECIMAL_POINT':'','RADIXCHAR':'','THOUSANDS_SEP':'','THOUSEP':'','GROUPING':'','YESEXPR':'','NOEXPR':'','YESSTR':'','NOSTR':'','CODESET':'','LC_ALL':'','LC_COLLATE':'','LC_CTYPE':'','LC_NUMERIC':'','LC_TIME':'','LC_MESSAGES':'','PHP_INT_MAX':'','STR_PAD_RIGHT':'','STR_PAD_LEFT':'','STR_PAD_BOTH':'',}
+let php_builtin['constants']['error_handling']={'DEBUG_BACKTRACE_PROVIDE_OBJECT':'','DEBUG_BACKTRACE_IGNORE_ARGS':'',}
+let php_builtin['constants']['math']={'PHP_INT_MAX':'','M_PI':'','PHP_ROUND_HALF_UP':'','PHP_ROUND_HALF_DOWN':'','PHP_ROUND_HALF_EVEN':'','PHP_ROUND_HALF_ODD':'','M_E':'','M_LOG2E':'','M_LOG10E':'','M_LN2':'','M_LN10':'','M_PI_2':'','M_PI_4':'','M_1_PI':'','M_2_PI':'','M_SQRTPI':'','M_2_SQRTPI':'','M_SQRT2':'','M_SQRT3':'','M_SQRT1_2':'','M_LNPI':'','M_EULER':'','NAN':'','INF':'',}
+let php_builtin['constants']['network']={'LOG_EMERG':'','LOG_ALERT':'','LOG_CRIT':'','LOG_ERR':'','LOG_WARNING':'','LOG_NOTICE':'','LOG_INFO':'','LOG_DEBUG':'','LOG_KERN':'','LOG_USER':'','LOG_MAIL':'','LOG_DAEMON':'','LOG_AUTH':'','LOG_SYSLOG':'','LOG_LPR':'','LOG_NEWS':'','LOG_CRON':'','LOG_AUTHPRIV':'','LOG_LOCAL0':'','LOG_LOCAL1':'','LOG_LOCAL2':'','LOG_LOCAL3':'','LOG_LOCAL4':'','LOG_LOCAL5':'','LOG_LOCAL6':'','LOG_LOCAL7':'','LOG_PID':'','LOG_CONS':'','LOG_ODELAY':'','LOG_NDELAY':'','LOG_NOWAIT':'','LOG_PERROR':'','DNS_A':'','DNS_CNAME':'','DNS_HINFO':'','DNS_MX':'','DNS_NS':'','DNS_PTR':'','DNS_SOA':'','DNS_TXT':'','DNS_AAAA':'','DNS_SRV':'','DNS_NAPTR':'','DNS_A6':'','DNS_ALL':'','DNS_ANY':'','SID':'','LOG_UUCP':'',}
+let php_builtin['constants']['urls']={'PHP_QUERY_RFC1738':'','PHP_QUERY_RFC3986':'','PHP_URL_SCHEME':'','PHP_URL_HOST':'','PHP_URL_PORT':'','PHP_URL_USER':'','PHP_URL_PASS':'','PHP_URL_PATH':'','PHP_URL_QUERY':'','PHP_URL_FRAGMENT':'',}
+let php_builtin['constants']['gd']={'IMAGETYPE_GIF':'','IMAGETYPE_JPEG':'','IMAGETYPE_PNG':'','IMAGETYPE_SWF':'','IMAGETYPE_PSD':'','IMAGETYPE_BMP':'','IMAGETYPE_TIFF_II':'','IMAGETYPE_TIFF_MM':'','IMAGETYPE_JPC':'','IMAGETYPE_JP2':'','IMAGETYPE_JPX':'','IMAGETYPE_JB2':'','IMAGETYPE_SWC':'','IMAGETYPE_IFF':'','IMAGETYPE_WBMP':'','IMAGETYPE_XBM':'','IMAGETYPE_ICO':'','IMG_CROP_THRESHOLD':'','IMG_ARC_PIE':'','IMG_ARC_CHORD':'','IMG_ARC_NOFILL':'','IMG_ARC_EDGED':'','IMG_FILTER_NEGATE':'','IMG_FILTER_GRAYSCALE':'','IMG_FILTER_BRIGHTNESS':'','IMG_FILTER_CONTRAST':'','IMG_FILTER_COLORIZE':'','IMG_FILTER_EDGEDETECT':'','IMG_FILTER_EMBOSS':'','IMG_FILTER_GAUSSIAN_BLUR':'','IMG_FILTER_SELECTIVE_BLUR':'','IMG_FILTER_MEAN_REMOVAL':'','IMG_FILTER_SMOOTH':'','IMG_FILTER_PIXELATE':'','IMG_FLIP_HORIZONTAL':'','IMG_FLIP_VERTICAL':'','IMG_FLIP_BOTH':'','IMG_GD2_RAW':'','IMG_GD2_COMPRESSED':'','IMG_EFFECT_REPLACE':'','IMG_EFFECT_ALPHABLEND':'','IMG_EFFECT_NORMAL':'','IMG_EFFECT_OVERLAY':'','PNG_NO_FILTER':'','PNG_ALL_FILTERS':'','IMG_NEAREST_NEIGHBOUR':'','IMG_BILINEAR_FIXED':'','IMG_BICUBIC':'','IMG_BICUBIC_FIXED':'','IMG_COLOR_BRUSHED':'','IMG_COLOR_STYLEDBRUSHED':'','IMG_BELL':'','IMG_BESSEL':'','IMG_BLACKMAN':'','IMG_BOX':'','IMG_BSPLINE':'','IMG_CATMULLROM':'','IMG_GAUSSIAN':'','IMG_GENERALIZED_CUBIC':'','IMG_HERMITE':'','IMG_HAMMING':'','IMG_HANNING':'','IMG_MITCHELL':'','IMG_POWER':'','IMG_QUADRATIC':'','IMG_SINC':'','IMG_WEIGHTED4':'','IMG_TRIANGLE':'','IMG_COLOR_STYLED':'','IMG_COLOR_TRANSPARENT':'','IMG_COLOR_TILED':'','IMG_GIF':'','IMG_JPG':'','IMG_PNG':'','IMG_WBMP':'','IMG_XPM':'','GD_VERSION':'','GD_MAJOR_VERSION':'','GD_MINOR_VERSION':'','GD_RELEASE_VERSION':'','GD_EXTRA_VERSION':'','GD_BUNDLED':'','IMG_JPEG':'','IMG_ARC_ROUNDED':'','IMAGETYPE_JPEG2000':'','PNG_FILTER_NONE':'','PNG_FILTER_SUB':'','PNG_FILTER_UP':'','PNG_FILTER_AVG':'','PNG_FILTER_PAETH':'',}
+let php_builtin['constants']['json']={'JSON_BIGINT_AS_STRING':'','JSON_HEX_QUOT':'','JSON_HEX_TAG':'','JSON_HEX_AMP':'','JSON_HEX_APOS':'','JSON_NUMERIC_CHECK':'','JSON_PRETTY_PRINT':'','JSON_UNESCAPED_SLASHES':'','JSON_FORCE_OBJECT':'','JSON_UNESCAPED_UNICODE':'','JSON_ERROR_NONE':'','JSON_ERROR_DEPTH':'','JSON_ERROR_STATE_MISMATCH':'','JSON_ERROR_CTRL_CHAR':'','JSON_ERROR_SYNTAX':'','JSON_ERROR_UTF8':'','JSON_ERROR_RECURSION':'','JSON_ERROR_INF_OR_NAN':'','NAN':'','INF':'','JSON_ERROR_UNSUPPORTED_TYPE':'','JSON_PARTIAL_OUTPUT_ON_ERROR':'',}
+let php_builtin['constants']['multibyte_string']={'MB_CASE_UPPER':'','MB_CASE_LOWER':'','MB_CASE_TITLE':'','MB_OVERLOAD_MAIL':'','MB_OVERLOAD_STRING':'','MB_OVERLOAD_REGEX':'',}
+let php_builtin['constants']['mssql']={'SQLTEXT':'','SQLVARCHAR':'','SQLCHAR':'','SQLINT1':'','SQLINT2':'','SQLINT4':'','SQLBIT':'','SQLFLT4':'','SQLFLT8':'','SQLFLTN':'','MSSQL_ASSOC':'','MSSQL_NUM':'','MSSQL_BOTH':'',}
+let php_builtin['constants']['mysql']={'MYSQL_CLIENT_SSL':'','MYSQL_CLIENT_COMPRESS':'','MYSQL_CLIENT_IGNORE_SPACE':'','MYSQL_CLIENT_INTERACTIVE':'','MYSQL_ASSOC':'','MYSQL_NUM':'','MYSQL_BOTH':'','MYSQL_PORT':'',}
+let php_builtin['constants']['output_control']={'PHP_OUTPUT_HANDLER_STDFLAGS':'','PHP_OUTPUT_HANDLER_CLEANABLE':'','PHP_OUTPUT_HANDLER_FLUSHABLE':'','PHP_OUTPUT_HANDLER_REMOVABLE':'','PHP_OUTPUT_HANDLER_START':'','PHP_OUTPUT_HANDLER_WRITE':'','PHP_OUTPUT_HANDLER_FLUSH':'','PHP_OUTPUT_HANDLER_CLEAN':'','PHP_OUTPUT_HANDLER_FINAL':'','PHP_OUTPUT_HANDLER_CONT':'','PHP_OUTPUT_HANDLER_END':'',}
+let php_builtin['constants']['password_hashing']={'PASSWORD_DEFAULT':'','PASSWORD_BCRYPT':'','CRYPT_BLOWFISH':'',}
+let php_builtin['constants']['postgresql']={'PGSQL_CONNECT_FORCE_NEW':'','PGSQL_CONNECTION_OK':'','PGSQL_CONNECTION_BAD':'','PGSQL_CONV_IGNORE_DEFAULT':'','PGSQL_CONV_FORCE_NULL':'','PGSQL_CONV_IGNORE_NOT_NULL':'','PGSQL_DML_NO_CONV':'','PGSQL_DML_ESCAPE':'','PGSQL_DML_EXEC':'','PGSQL_DML_ASYNC':'','PGSQL_DML_STRING':'','PGSQL_ASSOC':'','PGSQL_NUM':'','PGSQL_BOTH':'','PGSQL_CONV_OPTS':'','INV_READ':'','INV_WRITE':'','INV_ARCHIVE':'','PGSQL_SEEK_SET':'','PGSQL_SEEK_CUR':'','PGSQL_SEEK_END':'','PGSQL_DIAG_SEVERITY':'','PGSQL_DIAG_SQLSTATE':'','PGSQL_DIAG_MESSAGE_PRIMARY':'','PGSQL_DIAG_MESSAGE_DETAIL':'','PGSQL_DIAG_MESSAGE_HINT':'','PGSQL_DIAG_STATEMENT_POSITION':'','PGSQL_DIAG_INTERNAL_POSITION':'','PGSQL_DIAG_INTERNAL_QUERY':'','PGSQL_DIAG_CONTEXT':'','PGSQL_DIAG_SOURCE_FILE':'','PGSQL_DIAG_SOURCE_LINE':'','PGSQL_DIAG_SOURCE_FUNCTION':'','PGSQL_STATUS_LONG':'','PGSQL_STATUS_STRING':'','PGSQL_EMPTY_QUERY':'','PGSQL_COMMAND_OK':'','PGSQL_TUPLES_OK':'','PGSQL_COPY_OUT':'','PGSQL_COPY_IN':'','PGSQL_BAD_RESPONSE':'','PGSQL_NONFATAL_ERROR':'','PGSQL_FATAL_ERROR':'','PGSQL_ERRORS_TERSE':'','PGSQL_ERRORS_DEFAULT':'','PGSQL_ERRORS_VERBOSE':'','PGSQL_TRANSACTION_IDLE':'','PGSQL_TRANSACTION_ACTIVE':'','PGSQL_TRANSACTION_INTRANS':'','PGSQL_TRANSACTION_INERROR':'','PGSQL_TRANSACTION_UNKNOWN':'','PG_DIAG_STATEMENT_POSITION':'','PG_DIAG_INTERNAL_QUERY':'',}
+let php_builtin['constants']['pcre']={'PREG_GREP_INVERT':'','PREG_NO_ERROR':'','PREG_INTERNAL_ERROR':'','PREG_BACKTRACK_LIMIT_ERROR':'','PREG_RECURSION_LIMIT_ERROR':'','PREG_BAD_UTF8_ERROR':'','PREG_BAD_UTF8_OFFSET_ERROR':'','PREG_PATTERN_ORDER':'','PREG_SET_ORDER':'','PREG_OFFSET_CAPTURE':'','PREG_SPLIT_NO_EMPTY':'','PREG_SPLIT_DELIM_CAPTURE':'','PREG_SPLIT_OFFSET_CAPTURE':'','PCRE_VERSION':'',}
+let php_builtin['constants']['program_execution']={'STDIN':'',}
+let php_builtin['constants']['sessions']={'SID':'','PHP_SESSION_DISABLED':'','PHP_SESSION_NONE':'','PHP_SESSION_ACTIVE':'','UPLOAD_ERR_EXTENSION':'',}
+let php_builtin['constants']['variable_handling']={'PHP_INT_MAX':'',}
+let php_builtin['constants']['misc']={'WAIT_IO_COMPLETION':'','CONNECTION_ABORTED':'','CONNECTION_NORMAL':'','CONNECTION_TIMEOUT':'',}
+let php_builtin['constants']['streams']={'STREAM_FILTER_READ':'','STREAM_FILTER_WRITE':'','STREAM_FILTER_ALL':'','PHP_INT_MAX':'','STREAM_CLIENT_CONNECT':'','STREAM_CLIENT_ASYNC_CONNECT':'','STREAM_CLIENT_PERSISTENT':'','STREAM_CRYPTO_METHOD_TLS_CLIENT':'','STREAM_CRYPTO_METHOD_TLS_SERVER':'','STREAM_PF_INET':'','STREAM_PF_INET6':'','STREAM_PF_UNIX':'','STREAM_SOCK_DGRAM':'','STREAM_SOCK_RAW':'','STREAM_SOCK_RDM':'','STREAM_SOCK_SEQPACKET':'','STREAM_SOCK_STREAM':'','STREAM_IPPROTO_ICMP':'','STREAM_IPPROTO_IP':'','STREAM_IPPROTO_RAW':'','STREAM_IPPROTO_TCP':'','STREAM_IPPROTO_UDP':'','STREAM_OOB':'','STREAM_PEEK':'','AF_INET':'','STREAM_SERVER_BIND':'','STREAM_SHUT_RD':'','STREAM_SHUT_WR':'','STREAM_SHUT_RDWR':'','STREAM_IS_URL':'','PSFS_PASS_ON':'','PSFS_FEED_ME':'','PSFS_ERR_FATAL':'','PSFS_FLAG_NORMAL':'','PSFS_FLAG_FLUSH_INC':'','PSFS_FLAG_FLUSH_CLOSE':'','STREAM_USE_PATH':'','STREAM_REPORT_ERRORS':'','STREAM_SERVER_LISTEN':'','STREAM_NOTIFY_RESOLVE':'','STREAM_NOTIFY_CONNECT':'','STREAM_NOTIFY_AUTH_REQUIRED':'','STREAM_NOTIFY_SEVERITY_ERR':'','STREAM_NOTIFY_MIME_TYPE_IS':'','STREAM_NOTIFY_FILE_SIZE_IS':'','STREAM_NOTIFY_REDIRECTED':'','STREAM_NOTIFY_PROGRESS':'','STREAM_NOTIFY_COMPLETED':'','STREAM_NOTIFY_FAILURE':'','STREAM_NOTIFY_AUTH_RESULT':'','STREAM_NOTIFY_SEVERITY_INFO':'','STREAM_NOTIFY_SEVERITY_WARN':'','STREAM_CAST_FOR_SELECT':'','STREAM_CAST_AS_STREAM':'','STREAM_META_TOUCH':'','STREAM_META_OWNER':'','STREAM_META_OWNER_NAME':'','STREAM_META_GROUP':'','STREAM_META_GROUP_NAME':'','STREAM_META_ACCESS':'','STREAM_MKDIR_RECURSIVE':'','LOCK_EX':'','LOCK_UN':'','LOCK_SH':'','LOCK_NB':'','SEEK_SET':'','SEEK_CUR':'','SEEK_END':'','STREAM_OPTION_BLOCKING':'','STREAM_OPTION_READ_TIMEOUT':'','STREAM_OPTION_WRITE_BUFFER':'','STREAM_BUFFER_NONE':'','STREAM_BUFFER_FULL':'',}
+let php_builtin['constants']['iconv']={'ICONV_IMPL':'','ICONV_VERSION':'','ICONV_MIME_DECODE_STRICT':'','ICONV_MIME_DECODE_CONTINUE_ON_ERROR':'',}
+let php_builtin['constants']['phpini_directives']={'PATH_SEPARATOR':'','PHP_INI_SYSTEM':'',}
+let php_builtin['constants']['types']={'NAN':'','PHP_INT_SIZE':'','PHP_INT_MAX':'',}
+let php_builtin['constants']['pdo']={'PDO_PARAM_BOOL':'',}
+let php_builtin['constants']['list_of_reserved_words']={'PHP_VERSION':'','PHP_MAJOR_VERSION':'','PHP_MINOR_VERSION':'','PHP_RELEASE_VERSION':'','PHP_VERSION_ID':'','PHP_EXTRA_VERSION':'','PHP_ZTS':'','PHP_DEBUG':'','PHP_MAXPATHLEN':'','PHP_OS':'','PHP_SAPI':'','PHP_EOL':'','PHP_INT_MAX':'','PHP_INT_SIZE':'','DEFAULT_INCLUDE_PATH':'','PEAR_INSTALL_DIR':'','PEAR_EXTENSION_DIR':'','PHP_EXTENSION_DIR':'','PHP_PREFIX':'','PHP_BINDIR':'','PHP_BINARY':'','PHP_MANDIR':'','PHP_LIBDIR':'','PHP_DATADIR':'','PHP_SYSCONFDIR':'','PHP_LOCALSTATEDIR':'','PHP_CONFIG_FILE_PATH':'','PHP_CONFIG_FILE_SCAN_DIR':'','PHP_SHLIB_SUFFIX':'',}
+let php_builtin['constants']['php_type_comparison_tables']={'NAN':'',}
+
+" Built in functions
+let g:php_builtin_functions = {}
+for [ext, data] in items(php_builtin['functions'])
+ call extend(g:php_builtin_functions, data)
+endfor
+
+" Built in class
+let g:php_builtin_classes = {}
+for [ext, data] in items(php_builtin['classes'])
+ call extend(g:php_builtin_classes, data)
+endfor
+
+" Built in interfaces
+let g:php_builtin_interfaces = {}
+for [ext, data] in items(php_builtin['interfaces'])
+ call extend(g:php_builtin_interfaces, data)
+endfor
+
+" Built in constants
+let g:php_constants = {}
+for [ext, data] in items(php_builtin['constants'])
+ call extend(g:php_constants, data)
+endfor
+
+" When the classname not found or found but the tags doesn't contain that
+" class we will try to complete any method of any builtin class. To speed up
+" that lookup we compile a 'ClassName::MethodName':'info' dictionary from the
+" builtin class information
+let g:php_builtin_object_functions = {}
+
+" When completing for 'everyting imaginable' (no class context, not a
+" variable) we need a list of built-in classes in a format of {'classname':''}
+" for performance reasons we precompile this too
+let g:php_builtin_classnames = {}
+
+" In order to reduce file size, empty keys are omitted from class structures.
+" To make the structure of in-memory hashes normalized we will add them in runtime
+let required_class_hash_keys = ['constants', 'properties', 'static_properties', 'methods', 'static_methods']
+
+for [classname, class_info] in items(g:php_builtin_classes)
+ for property_name in required_class_hash_keys
+ if !has_key(class_info, property_name)
+ let class_info[property_name] = {}
+ endif
+ endfor
+
+ let g:php_builtin_classnames[classname] = ''
+ for [method_name, method_info] in items(class_info.methods)
+ let g:php_builtin_object_functions[classname.'::'.method_name.'('] = method_info.signature
+ endfor
+ for [method_name, method_info] in items(class_info.static_methods)
+ let g:php_builtin_object_functions[classname.'::'.method_name.'('] = method_info.signature
+ endfor
+endfor
+
+let g:php_builtin_interfacenames = {}
+for [interfacename, info] in items(g:php_builtin_interfaces)
+ for property_name in required_class_hash_keys
+ if !has_key(class_info, property_name)
+ let class_info[property_name] = {}
+ endif
+ endfor
+
+ let g:php_builtin_interfacenames[interfacename] = ''
+ for [method_name, method_info] in items(class_info.methods)
+ let g:php_builtin_object_functions[interfacename.'::'.method_name.'('] = method_info.signature
+ endfor
+ for [method_name, method_info] in items(class_info.static_methods)
+ let g:php_builtin_object_functions[interfacename.'::'.method_name.'('] = method_info.signature
+ endfor
+endfor
+
+
+" Add control structures (they are outside regular pattern of PHP functions)
+let php_control = {
+ \ 'include(': 'string filename | resource',
+ \ 'include_once(': 'string filename | resource',
+ \ 'require(': 'string filename | resource',
+ \ 'require_once(': 'string filename | resource',
+ \ }
+call extend(g:php_builtin_functions, php_control)
+
+
+" Built-in variables " {{{
+let g:php_builtin_vars ={
+ \ '$GLOBALS':'',
+ \ '$_SERVER':'',
+ \ '$_GET':'',
+ \ '$_POST':'',
+ \ '$_COOKIE':'',
+ \ '$_FILES':'',
+ \ '$_ENV':'',
+ \ '$_REQUEST':'',
+ \ '$_SESSION':'',
+ \ '$HTTP_SERVER_VARS':'',
+ \ '$HTTP_ENV_VARS':'',
+ \ '$HTTP_COOKIE_VARS':'',
+ \ '$HTTP_GET_VARS':'',
+ \ '$HTTP_POST_VARS':'',
+ \ '$HTTP_POST_FILES':'',
+ \ '$HTTP_SESSION_VARS':'',
+ \ '$php_errormsg':'',
+ \ '$this':'',
+ \ }
+" }}}
+endfunction
+" }}}
+
+" vim: foldmethod=marker:noexpandtab:ts=8:sts=4
diff --git a/runtime/autoload/python.vim b/runtime/autoload/python.vim
new file mode 100644
index 0000000..d5f4862
--- /dev/null
+++ b/runtime/autoload/python.vim
@@ -0,0 +1,249 @@
+" Support for Python indenting, see runtime/indent/python.vim
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+" need to inspect some old g:pyindent_* variables to be backward compatible
+let g:python_indent = extend(get(g:, 'python_indent', {}), #{
+ \ closed_paren_align_last_line: v:true,
+ \ open_paren: get(g:, 'pyindent_open_paren', 'shiftwidth() * 2'),
+ \ nested_paren: get(g:, 'pyindent_nested_paren', 'shiftwidth()'),
+ \ continue: get(g:, 'pyindent_continue', 'shiftwidth() * 2'),
+ "\ searchpair() can be slow, limit the time to 150 msec or what is put in
+ "\ g:python_indent.searchpair_timeout
+ \ searchpair_timeout: get(g:, 'pyindent_searchpair_timeout', 150),
+ "\ Identing inside parentheses can be very slow, regardless of the searchpair()
+ "\ timeout, so let the user disable this feature if he doesn't need it
+ \ disable_parentheses_indenting: get(g:, 'pyindent_disable_parentheses_indenting', v:false),
+ \ }, 'keep')
+
+let s:maxoff = 50 " maximum number of lines to look backwards for ()
+
+function s:SearchBracket(fromlnum, flags)
+ return searchpairpos('[[({]', '', '[])}]', a:flags,
+ \ {-> synstack('.', col('.'))
+ \ ->indexof({_, id -> synIDattr(id, 'name') =~ '\%(Comment\|Todo\|String\)$'}) >= 0},
+ \ [0, a:fromlnum - s:maxoff]->max(), g:python_indent.searchpair_timeout)
+endfunction
+
+" See if the specified line is already user-dedented from the expected value.
+function s:Dedented(lnum, expected)
+ return indent(a:lnum) <= a:expected - shiftwidth()
+endfunction
+
+" Some other filetypes which embed Python have slightly different indent
+" rules (e.g. bitbake). Those filetypes can pass an extra funcref to this
+" function which is evaluated below.
+function python#GetIndent(lnum, ...)
+ let ExtraFunc = a:0 > 0 ? a:1 : 0
+
+ " 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) + get(g:, 'pyindent_continue', g:python_indent.continue)->eval()
+ endif
+
+ " If the start of the line is in a string don't change the indent.
+ if has('syntax_items')
+ \ && synIDattr(synID(a:lnum, 1, 1), "name") =~ "String$"
+ return -1
+ endif
+
+ " Search backwards for the previous non-empty line.
+ let plnum = prevnonblank(v:lnum - 1)
+
+ if plnum == 0
+ " This is the first non-empty line, use zero indent.
+ return 0
+ endif
+
+ if g:python_indent.disable_parentheses_indenting == 1
+ let plindent = indent(plnum)
+ let plnumstart = plnum
+ else
+ " Indent inside parens.
+ " Align with the open paren unless it is at the end of the line.
+ " E.g.
+ " open_paren_not_at_EOL(100,
+ " (200,
+ " 300),
+ " 400)
+ " open_paren_at_EOL(
+ " 100, 200, 300, 400)
+ call cursor(a:lnum, 1)
+ let [parlnum, parcol] = s:SearchBracket(a:lnum, 'nbW')
+ if parlnum > 0
+ if parcol != col([parlnum, '$']) - 1
+ return parcol
+ elseif getline(a:lnum) =~ '^\s*[])}]' && !g:python_indent.closed_paren_align_last_line
+ return indent(parlnum)
+ endif
+ endif
+
+ call cursor(plnum, 1)
+
+ " If the previous line is inside parenthesis, use the indent of the starting
+ " line.
+ let [parlnum, _] = s:SearchBracket(plnum, 'nbW')
+ if parlnum > 0
+ if a:0 > 0 && ExtraFunc(parlnum)
+ " We may have found the opening brace of a bitbake Python task, e.g. 'python do_task {'
+ " If so, ignore it here - it will be handled later.
+ let parlnum = 0
+ let plindent = indent(plnum)
+ let plnumstart = plnum
+ else
+ let plindent = indent(parlnum)
+ let plnumstart = parlnum
+ endif
+ else
+ let plindent = indent(plnum)
+ let plnumstart = plnum
+ endif
+
+ " When inside parenthesis: If at the first line below the parenthesis add
+ " two 'shiftwidth', otherwise same as previous line.
+ " i = (a
+ " + b
+ " + c)
+ call cursor(a:lnum, 1)
+ let [p, _] = s:SearchBracket(a:lnum, 'bW')
+ if p > 0
+ if a:0 > 0 && ExtraFunc(p)
+ " Currently only used by bitbake
+ " Handle first non-empty line inside a bitbake Python task
+ if p == plnum
+ return shiftwidth()
+ endif
+
+ " Handle the user actually trying to close a bitbake Python task
+ let line = getline(a:lnum)
+ if line =~ '^\s*}'
+ return -2
+ endif
+
+ " Otherwise ignore the brace
+ let p = 0
+ else
+ if p == plnum
+ " When the start is inside parenthesis, only indent one 'shiftwidth'.
+ let [pp, _] = s:SearchBracket(a:lnum, 'bW')
+ if pp > 0
+ return indent(plnum)
+ \ + get(g:, 'pyindent_nested_paren', g:python_indent.nested_paren)->eval()
+ endif
+ return indent(plnum)
+ \ + get(g:, 'pyindent_open_paren', g:python_indent.open_paren)->eval()
+ endif
+ if plnumstart == p
+ return indent(plnum)
+ endif
+ return plindent
+ endif
+ endif
+ endif
+
+
+ " Get the line and remove a trailing comment.
+ " Use syntax highlighting attributes when possible.
+ let pline = getline(plnum)
+ let pline_len = strlen(pline)
+ 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 synstack(plnum, pline_len)
+ \ ->indexof({_, id -> synIDattr(id, 'name') =~ '\%(Comment\|Todo\)$'}) >= 0
+ let min = 1
+ let max = pline_len
+ while min < max
+ let col = (min + max) / 2
+ if synstack(plnum, col)
+ \ ->indexof({_, id -> synIDattr(id, 'name') =~ '\%(Comment\|Todo\)$'}) >= 0
+ let max = col
+ else
+ let min = col + 1
+ endif
+ endwhile
+ let pline = strpart(pline, 0, min - 1)
+ endif
+ else
+ let col = 0
+ while col < pline_len
+ if pline[col] == '#'
+ let pline = strpart(pline, 0, col)
+ break
+ endif
+ let col = col + 1
+ endwhile
+ endif
+
+ " If the previous line ended with a colon, indent this line
+ if pline =~ ':\s*$'
+ return plindent + shiftwidth()
+ endif
+
+ " If the previous line was a stop-execution statement...
+ if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>'
+ " See if the user has already dedented
+ if s:Dedented(a:lnum, indent(plnum))
+ " If so, trust the user
+ return -1
+ endif
+ " If not, recommend one dedent
+ return indent(plnum) - shiftwidth()
+ endif
+
+ " If the current line begins with a keyword that lines up with "try"
+ if getline(a:lnum) =~ '^\s*\(except\|finally\)\>'
+ let lnum = a:lnum - 1
+ while lnum >= 1
+ if getline(lnum) =~ '^\s*\(try\|except\)\>'
+ let ind = indent(lnum)
+ if ind >= indent(a:lnum)
+ return -1 " indent is already less than this
+ endif
+ return ind " line up with previous try or except
+ endif
+ let lnum = lnum - 1
+ endwhile
+ return -1 " no matching "try"!
+ endif
+
+ " If the current line begins with a header keyword, dedent
+ if getline(a:lnum) =~ '^\s*\(elif\|else\)\>'
+
+ " Unless the previous line was a one-liner
+ if getline(plnumstart) =~ '^\s*\(for\|if\|elif\|try\)\>'
+ return plindent
+ endif
+
+ " Or the user has already dedented
+ if s:Dedented(a:lnum, plindent)
+ return -1
+ endif
+
+ return plindent - shiftwidth()
+ endif
+
+ " When after a () construct we probably want to go back to the start line.
+ " a = (b
+ " + c)
+ " here
+ if parlnum > 0
+ " ...unless the user has already dedented
+ if s:Dedented(a:lnum, plindent)
+ return -1
+ else
+ return plindent
+ endif
+ endif
+
+ return -1
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/autoload/python3complete.vim b/runtime/autoload/python3complete.vim
new file mode 100644
index 0000000..ea0a331
--- /dev/null
+++ b/runtime/autoload/python3complete.vim
@@ -0,0 +1,611 @@
+"python3complete.vim - Omni Completion for python
+" Maintainer: <vacancy>
+" Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
+" Version: 0.9
+" Last Updated: 2022 Mar 30
+"
+" Roland Puntaier: this file contains adaptations for python3 and is parallel to pythoncomplete.vim
+"
+" Changes
+" TODO:
+" 'info' item output can use some formatting work
+" Add an "unsafe eval" mode, to allow for return type evaluation
+" Complete basic syntax along with import statements
+" i.e. "import url<c-x,c-o>"
+" Continue parsing on invalid line??
+"
+" v 0.9
+" * Fixed docstring parsing for classes and functions
+" * Fixed parsing of *args and **kwargs type arguments
+" * Better function param parsing to handle things like tuples and
+" lambda defaults args
+"
+" v 0.8
+" * Fixed an issue where the FIRST assignment was always used instead of
+" using a subsequent assignment for a variable
+" * Fixed a scoping issue when working inside a parameterless function
+"
+"
+" v 0.7
+" * Fixed function list sorting (_ and __ at the bottom)
+" * Removed newline removal from docs. It appears vim handles these better in
+" recent patches
+"
+" v 0.6:
+" * Fixed argument completion
+" * Removed the 'kind' completions, as they are better indicated
+" with real syntax
+" * Added tuple assignment parsing (whoops, that was forgotten)
+" * Fixed import handling when flattening scope
+"
+" v 0.5:
+" Yeah, I skipped a version number - 0.4 was never public.
+" It was a bugfix version on top of 0.3. This is a complete
+" rewrite.
+"
+
+if !has('python3')
+ echo "Error: Required vim compiled with +python3"
+ finish
+endif
+
+function! python3complete#Complete(findstart, base)
+ "findstart = 1 when we need to get the text length
+ if a:findstart == 1
+ let line = getline('.')
+ let idx = col('.')
+ while idx > 0
+ let idx -= 1
+ let c = line[idx]
+ if c =~ '\w'
+ continue
+ elseif ! c =~ '\.'
+ let idx = -1
+ break
+ else
+ break
+ endif
+ endwhile
+
+ return idx
+ "findstart = 0 when we need to return the list of completions
+ else
+ "vim no longer moves the cursor upon completion... fix that
+ let line = getline('.')
+ let idx = col('.')
+ let cword = ''
+ while idx > 0
+ let idx -= 1
+ let c = line[idx]
+ if c =~ '\w' || c =~ '\.'
+ let cword = c . cword
+ continue
+ elseif strlen(cword) > 0 || idx == 0
+ break
+ endif
+ endwhile
+ execute "py3 vimpy3complete('" . escape(cword, "'") . "', '" . escape(a:base, "'") . "')"
+ return g:python3complete_completions
+ endif
+endfunction
+
+function! s:DefPython()
+py3 << PYTHONEOF
+import warnings
+warnings.simplefilter(action='ignore', category=FutureWarning)
+
+import sys, tokenize, io, types
+from token import NAME, DEDENT, NEWLINE, STRING
+
+debugstmts=[]
+def dbg(s): debugstmts.append(s)
+def showdbg():
+ for d in debugstmts: print("DBG: %s " % d)
+
+def vimpy3complete(context,match):
+ global debugstmts
+ debugstmts = []
+ try:
+ import vim
+ cmpl = Completer()
+ cmpl.evalsource('\n'.join(vim.current.buffer),vim.eval("line('.')"))
+ all = cmpl.get_completions(context,match)
+ all.sort(key=lambda x:x['abbr'].replace('_','z'))
+ dictstr = '['
+ # have to do this for double quoting
+ for cmpl in all:
+ dictstr += '{'
+ for x in cmpl: dictstr += '"%s":"%s",' % (x,cmpl[x])
+ dictstr += '"icase":0},'
+ if dictstr[-1] == ',': dictstr = dictstr[:-1]
+ dictstr += ']'
+ #dbg("dict: %s" % dictstr)
+ vim.command("silent let g:python3complete_completions = %s" % dictstr)
+ #dbg("Completion dict:\n%s" % all)
+ except vim.error:
+ dbg("VIM Error: %s" % vim.error)
+
+class Completer(object):
+ def __init__(self):
+ self.compldict = {}
+ self.parser = PyParser()
+
+ def evalsource(self,text,line=0):
+ sc = self.parser.parse(text,line)
+ src = sc.get_code()
+ dbg("source: %s" % src)
+ try: exec(src,self.compldict)
+ except: dbg("parser: %s, %s" % (sys.exc_info()[0],sys.exc_info()[1]))
+ for l in sc.locals:
+ try: exec(l,self.compldict)
+ except: dbg("locals: %s, %s [%s]" % (sys.exc_info()[0],sys.exc_info()[1],l))
+
+ def _cleanstr(self,doc):
+ return doc.replace('"',' ').replace("'",' ')
+
+ def get_arguments(self,func_obj):
+ def _ctor(class_ob):
+ try: return class_ob.__init__
+ except AttributeError:
+ for base in class_ob.__bases__:
+ rc = _ctor(base)
+ if rc is not None: return rc
+ return None
+
+ arg_offset = 1
+ if type(func_obj) == type: func_obj = _ctor(func_obj)
+ elif type(func_obj) == types.MethodType: arg_offset = 1
+ else: arg_offset = 0
+
+ arg_text=''
+ if type(func_obj) in [types.FunctionType, types.LambdaType,types.MethodType]:
+ try:
+ cd = func_obj.__code__
+ real_args = cd.co_varnames[arg_offset:cd.co_argcount]
+ defaults = func_obj.__defaults__ or []
+ defaults = ["=%s" % name for name in defaults]
+ defaults = [""] * (len(real_args)-len(defaults)) + defaults
+ items = [a+d for a,d in zip(real_args,defaults)]
+ if func_obj.__code__.co_flags & 0x4:
+ items.append("...")
+ if func_obj.__code__.co_flags & 0x8:
+ items.append("***")
+ arg_text = (','.join(items)) + ')'
+ except:
+ dbg("arg completion: %s: %s" % (sys.exc_info()[0],sys.exc_info()[1]))
+ pass
+ if len(arg_text) == 0:
+ # The doc string sometimes contains the function signature
+ # this works for a lot of C modules that are part of the
+ # standard library
+ doc = func_obj.__doc__
+ if doc:
+ doc = doc.lstrip()
+ pos = doc.find('\n')
+ if pos > 0:
+ sigline = doc[:pos]
+ lidx = sigline.find('(')
+ ridx = sigline.find(')')
+ if lidx > 0 and ridx > 0:
+ arg_text = sigline[lidx+1:ridx] + ')'
+ if len(arg_text) == 0: arg_text = ')'
+ return arg_text
+
+ def get_completions(self,context,match):
+ #dbg("get_completions('%s','%s')" % (context,match))
+ stmt = ''
+ if context: stmt += str(context)
+ if match: stmt += str(match)
+ try:
+ result = None
+ all = {}
+ ridx = stmt.rfind('.')
+ if len(stmt) > 0 and stmt[-1] == '(':
+ result = eval(_sanitize(stmt[:-1]), self.compldict)
+ doc = result.__doc__
+ if doc is None: doc = ''
+ args = self.get_arguments(result)
+ return [{'word':self._cleanstr(args),'info':self._cleanstr(doc)}]
+ elif ridx == -1:
+ match = stmt
+ all = self.compldict
+ else:
+ match = stmt[ridx+1:]
+ stmt = _sanitize(stmt[:ridx])
+ result = eval(stmt, self.compldict)
+ all = dir(result)
+
+ dbg("completing: stmt:%s" % stmt)
+ completions = []
+
+ try: maindoc = result.__doc__
+ except: maindoc = ' '
+ if maindoc is None: maindoc = ' '
+ for m in all:
+ if m == "_PyCmplNoType": continue #this is internal
+ try:
+ dbg('possible completion: %s' % m)
+ if m.find(match) == 0:
+ if result is None: inst = all[m]
+ else: inst = getattr(result,m)
+ try: doc = inst.__doc__
+ except: doc = maindoc
+ typestr = str(inst)
+ if doc is None or doc == '': doc = maindoc
+
+ wrd = m[len(match):]
+ c = {'word':wrd, 'abbr':m, 'info':self._cleanstr(doc)}
+ if "function" in typestr:
+ c['word'] += '('
+ c['abbr'] += '(' + self._cleanstr(self.get_arguments(inst))
+ elif "method" in typestr:
+ c['word'] += '('
+ c['abbr'] += '(' + self._cleanstr(self.get_arguments(inst))
+ elif "module" in typestr:
+ c['word'] += '.'
+ elif "type" in typestr:
+ c['word'] += '('
+ c['abbr'] += '('
+ completions.append(c)
+ except:
+ i = sys.exc_info()
+ dbg("inner completion: %s,%s [stmt='%s']" % (i[0],i[1],stmt))
+ return completions
+ except:
+ i = sys.exc_info()
+ dbg("completion: %s,%s [stmt='%s']" % (i[0],i[1],stmt))
+ return []
+
+class Scope(object):
+ def __init__(self,name,indent,docstr=''):
+ self.subscopes = []
+ self.docstr = docstr
+ self.locals = []
+ self.parent = None
+ self.name = name
+ self.indent = indent
+
+ def add(self,sub):
+ #print('push scope: [%s@%s]' % (sub.name,sub.indent))
+ sub.parent = self
+ self.subscopes.append(sub)
+ return sub
+
+ def doc(self,str):
+ """ Clean up a docstring """
+ d = str.replace('\n',' ')
+ d = d.replace('\t',' ')
+ while d.find(' ') > -1: d = d.replace(' ',' ')
+ while d[0] in '"\'\t ': d = d[1:]
+ while d[-1] in '"\'\t ': d = d[:-1]
+ dbg("Scope(%s)::docstr = %s" % (self,d))
+ self.docstr = d
+
+ def local(self,loc):
+ self._checkexisting(loc)
+ self.locals.append(loc)
+
+ def copy_decl(self,indent=0):
+ """ Copy a scope's declaration only, at the specified indent level - not local variables """
+ return Scope(self.name,indent,self.docstr)
+
+ def _checkexisting(self,test):
+ "Convienance function... keep out duplicates"
+ if test.find('=') > -1:
+ var = test.split('=')[0].strip()
+ for l in self.locals:
+ if l.find('=') > -1 and var == l.split('=')[0].strip():
+ self.locals.remove(l)
+
+ def get_code(self):
+ str = ""
+ if len(self.docstr) > 0: str += '"""'+self.docstr+'"""\n'
+ for l in self.locals:
+ if l.startswith('import'): str += l+'\n'
+ str += 'class _PyCmplNoType:\n def __getattr__(self,name):\n return None\n'
+ for sub in self.subscopes:
+ str += sub.get_code()
+ for l in self.locals:
+ if not l.startswith('import'): str += l+'\n'
+
+ return str
+
+ def pop(self,indent):
+ #print('pop scope: [%s] to [%s]' % (self.indent,indent))
+ outer = self
+ while outer.parent != None and outer.indent >= indent:
+ outer = outer.parent
+ return outer
+
+ def currentindent(self):
+ #print('parse current indent: %s' % self.indent)
+ return ' '*self.indent
+
+ def childindent(self):
+ #print('parse child indent: [%s]' % (self.indent+1))
+ return ' '*(self.indent+1)
+
+class Class(Scope):
+ def __init__(self, name, supers, indent, docstr=''):
+ Scope.__init__(self,name,indent, docstr)
+ self.supers = supers
+ def copy_decl(self,indent=0):
+ c = Class(self.name,self.supers,indent, self.docstr)
+ for s in self.subscopes:
+ c.add(s.copy_decl(indent+1))
+ return c
+ def get_code(self):
+ str = '%sclass %s' % (self.currentindent(),self.name)
+ if len(self.supers) > 0: str += '(%s)' % ','.join(self.supers)
+ str += ':\n'
+ if len(self.docstr) > 0: str += self.childindent()+'"""'+self.docstr+'"""\n'
+ if len(self.subscopes) > 0:
+ for s in self.subscopes: str += s.get_code()
+ else:
+ str += '%spass\n' % self.childindent()
+ return str
+
+
+class Function(Scope):
+ def __init__(self, name, params, indent, docstr=''):
+ Scope.__init__(self,name,indent, docstr)
+ self.params = params
+ def copy_decl(self,indent=0):
+ return Function(self.name,self.params,indent, self.docstr)
+ def get_code(self):
+ str = "%sdef %s(%s):\n" % \
+ (self.currentindent(),self.name,','.join(self.params))
+ if len(self.docstr) > 0: str += self.childindent()+'"""'+self.docstr+'"""\n'
+ str += "%spass\n" % self.childindent()
+ return str
+
+class PyParser:
+ def __init__(self):
+ self.top = Scope('global',0)
+ self.scope = self.top
+ self.parserline = 0
+
+ def _parsedotname(self,pre=None):
+ #returns (dottedname, nexttoken)
+ name = []
+ if pre is None:
+ tokentype, token, indent = self.donext()
+ if tokentype != NAME and token != '*':
+ return ('', token)
+ else: token = pre
+ name.append(token)
+ while True:
+ tokentype, token, indent = self.donext()
+ if token != '.': break
+ tokentype, token, indent = self.donext()
+ if tokentype != NAME: break
+ name.append(token)
+ return (".".join(name), token)
+
+ def _parseimportlist(self):
+ imports = []
+ while True:
+ name, token = self._parsedotname()
+ if not name: break
+ name2 = ''
+ if token == 'as': name2, token = self._parsedotname()
+ imports.append((name, name2))
+ while token != "," and "\n" not in token:
+ tokentype, token, indent = self.donext()
+ if token != ",": break
+ return imports
+
+ def _parenparse(self):
+ name = ''
+ names = []
+ level = 1
+ while True:
+ tokentype, token, indent = self.donext()
+ if token in (')', ',') and level == 1:
+ if '=' not in name: name = name.replace(' ', '')
+ names.append(name.strip())
+ name = ''
+ if token == '(':
+ level += 1
+ name += "("
+ elif token == ')':
+ level -= 1
+ if level == 0: break
+ else: name += ")"
+ elif token == ',' and level == 1:
+ pass
+ else:
+ name += "%s " % str(token)
+ return names
+
+ def _parsefunction(self,indent):
+ self.scope=self.scope.pop(indent)
+ tokentype, fname, ind = self.donext()
+ if tokentype != NAME: return None
+
+ tokentype, open, ind = self.donext()
+ if open != '(': return None
+ params=self._parenparse()
+
+ tokentype, colon, ind = self.donext()
+ if colon != ':': return None
+
+ return Function(fname,params,indent)
+
+ def _parseclass(self,indent):
+ self.scope=self.scope.pop(indent)
+ tokentype, cname, ind = self.donext()
+ if tokentype != NAME: return None
+
+ super = []
+ tokentype, thenext, ind = self.donext()
+ if thenext == '(':
+ super=self._parenparse()
+ elif thenext != ':': return None
+
+ return Class(cname,super,indent)
+
+ def _parseassignment(self):
+ assign=''
+ tokentype, token, indent = self.donext()
+ if tokentype == tokenize.STRING or token == 'str':
+ return '""'
+ elif token == '(' or token == 'tuple':
+ return '()'
+ elif token == '[' or token == 'list':
+ return '[]'
+ elif token == '{' or token == 'dict':
+ return '{}'
+ elif tokentype == tokenize.NUMBER:
+ return '0'
+ elif token == 'open' or token == 'file':
+ return 'file'
+ elif token == 'None':
+ return '_PyCmplNoType()'
+ elif token == 'type':
+ return 'type(_PyCmplNoType)' #only for method resolution
+ else:
+ assign += token
+ level = 0
+ while True:
+ tokentype, token, indent = self.donext()
+ if token in ('(','{','['):
+ level += 1
+ elif token in (']','}',')'):
+ level -= 1
+ if level == 0: break
+ elif level == 0:
+ if token in (';','\n'): break
+ assign += token
+ return "%s" % assign
+
+ def donext(self):
+ type, token, (lineno, indent), end, self.parserline = next(self.gen)
+ if lineno == self.curline:
+ #print('line found [%s] scope=%s' % (line.replace('\n',''),self.scope.name))
+ self.currentscope = self.scope
+ return (type, token, indent)
+
+ def _adjustvisibility(self):
+ newscope = Scope('result',0)
+ scp = self.currentscope
+ while scp != None:
+ if type(scp) == Function:
+ slice = 0
+ #Handle 'self' params
+ if scp.parent != None and type(scp.parent) == Class:
+ slice = 1
+ newscope.local('%s = %s' % (scp.params[0],scp.parent.name))
+ for p in scp.params[slice:]:
+ i = p.find('=')
+ if len(p) == 0: continue
+ pvar = ''
+ ptype = ''
+ if i == -1:
+ pvar = p
+ ptype = '_PyCmplNoType()'
+ else:
+ pvar = p[:i]
+ ptype = _sanitize(p[i+1:])
+ if pvar.startswith('**'):
+ pvar = pvar[2:]
+ ptype = '{}'
+ elif pvar.startswith('*'):
+ pvar = pvar[1:]
+ ptype = '[]'
+
+ newscope.local('%s = %s' % (pvar,ptype))
+
+ for s in scp.subscopes:
+ ns = s.copy_decl(0)
+ newscope.add(ns)
+ for l in scp.locals: newscope.local(l)
+ scp = scp.parent
+
+ self.currentscope = newscope
+ return self.currentscope
+
+ #p.parse(vim.current.buffer[:],vim.eval("line('.')"))
+ def parse(self,text,curline=0):
+ self.curline = int(curline)
+ buf = io.StringIO(''.join(text) + '\n')
+ self.gen = tokenize.generate_tokens(buf.readline)
+ self.currentscope = self.scope
+
+ try:
+ freshscope=True
+ while True:
+ tokentype, token, indent = self.donext()
+ #dbg( 'main: token=[%s] indent=[%s]' % (token,indent))
+
+ if tokentype == DEDENT or token == "pass":
+ self.scope = self.scope.pop(indent)
+ elif token == 'def':
+ func = self._parsefunction(indent)
+ if func is None:
+ print("function: syntax error...")
+ continue
+ dbg("new scope: function")
+ freshscope = True
+ self.scope = self.scope.add(func)
+ elif token == 'class':
+ cls = self._parseclass(indent)
+ if cls is None:
+ print("class: syntax error...")
+ continue
+ freshscope = True
+ dbg("new scope: class")
+ self.scope = self.scope.add(cls)
+
+ elif token == 'import':
+ imports = self._parseimportlist()
+ for mod, alias in imports:
+ loc = "import %s" % mod
+ if len(alias) > 0: loc += " as %s" % alias
+ self.scope.local(loc)
+ freshscope = False
+ elif token == 'from':
+ mod, token = self._parsedotname()
+ if not mod or token != "import":
+ print("from: syntax error...")
+ continue
+ names = self._parseimportlist()
+ for name, alias in names:
+ loc = "from %s import %s" % (mod,name)
+ if len(alias) > 0: loc += " as %s" % alias
+ self.scope.local(loc)
+ freshscope = False
+ elif tokentype == STRING:
+ if freshscope: self.scope.doc(token)
+ elif tokentype == NAME:
+ name,token = self._parsedotname(token)
+ if token == '=':
+ stmt = self._parseassignment()
+ dbg("parseassignment: %s = %s" % (name, stmt))
+ if stmt != None:
+ self.scope.local("%s = %s" % (name,stmt))
+ freshscope = False
+ except StopIteration: #thrown on EOF
+ pass
+ except:
+ dbg("parse error: %s, %s @ %s" %
+ (sys.exc_info()[0], sys.exc_info()[1], self.parserline))
+ return self._adjustvisibility()
+
+def _sanitize(str):
+ val = ''
+ level = 0
+ for c in str:
+ if c in ('(','{','['):
+ level += 1
+ elif c in (']','}',')'):
+ level -= 1
+ elif level == 0:
+ val += c
+ return val
+
+sys.path.extend(['.','..'])
+PYTHONEOF
+endfunction
+
+call s:DefPython()
diff --git a/runtime/autoload/pythoncomplete.vim b/runtime/autoload/pythoncomplete.vim
new file mode 100644
index 0000000..aa28bb7
--- /dev/null
+++ b/runtime/autoload/pythoncomplete.vim
@@ -0,0 +1,627 @@
+"pythoncomplete.vim - Omni Completion for python
+" Maintainer: <vacancy>
+" Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
+" Version: 0.9
+" Last Updated: 2020 Oct 9
+"
+" Changes
+" TODO:
+" 'info' item output can use some formatting work
+" Add an "unsafe eval" mode, to allow for return type evaluation
+" Complete basic syntax along with import statements
+" i.e. "import url<c-x,c-o>"
+" Continue parsing on invalid line??
+"
+" v 0.9
+" * Fixed docstring parsing for classes and functions
+" * Fixed parsing of *args and **kwargs type arguments
+" * Better function param parsing to handle things like tuples and
+" lambda defaults args
+"
+" v 0.8
+" * Fixed an issue where the FIRST assignment was always used instead of
+" using a subsequent assignment for a variable
+" * Fixed a scoping issue when working inside a parameterless function
+"
+"
+" v 0.7
+" * Fixed function list sorting (_ and __ at the bottom)
+" * Removed newline removal from docs. It appears vim handles these better in
+" recent patches
+"
+" v 0.6:
+" * Fixed argument completion
+" * Removed the 'kind' completions, as they are better indicated
+" with real syntax
+" * Added tuple assignment parsing (whoops, that was forgotten)
+" * Fixed import handling when flattening scope
+"
+" v 0.5:
+" Yeah, I skipped a version number - 0.4 was never public.
+" It was a bugfix version on top of 0.3. This is a complete
+" rewrite.
+"
+
+if !has('python')
+ echo "Error: Required vim compiled with +python"
+ finish
+endif
+
+function! pythoncomplete#Complete(findstart, base)
+ "findstart = 1 when we need to get the text length
+ if a:findstart == 1
+ let line = getline('.')
+ let idx = col('.')
+ while idx > 0
+ let idx -= 1
+ let c = line[idx]
+ if c =~ '\w'
+ continue
+ elseif ! c =~ '\.'
+ let idx = -1
+ break
+ else
+ break
+ endif
+ endwhile
+
+ return idx
+ "findstart = 0 when we need to return the list of completions
+ else
+ "vim no longer moves the cursor upon completion... fix that
+ let line = getline('.')
+ let idx = col('.')
+ let cword = ''
+ while idx > 0
+ let idx -= 1
+ let c = line[idx]
+ if c =~ '\w' || c =~ '\.'
+ let cword = c . cword
+ continue
+ elseif strlen(cword) > 0 || idx == 0
+ break
+ endif
+ endwhile
+ execute "python vimcomplete('" . escape(cword, "'") . "', '" . escape(a:base, "'") . "')"
+ return g:pythoncomplete_completions
+ endif
+endfunction
+
+function! s:DefPython()
+python << PYTHONEOF
+import sys, tokenize, cStringIO, types
+from token import NAME, DEDENT, NEWLINE, STRING
+
+debugstmts=[]
+def dbg(s): debugstmts.append(s)
+def showdbg():
+ for d in debugstmts: print "DBG: %s " % d
+
+def vimcomplete(context,match):
+ global debugstmts
+ debugstmts = []
+ try:
+ import vim
+ def complsort(x,y):
+ try:
+ xa = x['abbr']
+ ya = y['abbr']
+ if xa[0] == '_':
+ if xa[1] == '_' and ya[0:2] == '__':
+ return xa > ya
+ elif ya[0:2] == '__':
+ return -1
+ elif y[0] == '_':
+ return xa > ya
+ else:
+ return 1
+ elif ya[0] == '_':
+ return -1
+ else:
+ return xa > ya
+ except:
+ return 0
+ cmpl = Completer()
+ cmpl.evalsource('\n'.join(vim.current.buffer),vim.eval("line('.')"))
+ all = cmpl.get_completions(context,match)
+ all.sort(complsort)
+ dictstr = '['
+ # have to do this for double quoting
+ for cmpl in all:
+ dictstr += '{'
+ for x in cmpl: dictstr += '"%s":"%s",' % (x,cmpl[x])
+ dictstr += '"icase":0},'
+ if dictstr[-1] == ',': dictstr = dictstr[:-1]
+ dictstr += ']'
+ #dbg("dict: %s" % dictstr)
+ vim.command("silent let g:pythoncomplete_completions = %s" % dictstr)
+ #dbg("Completion dict:\n%s" % all)
+ except vim.error:
+ dbg("VIM Error: %s" % vim.error)
+
+class Completer(object):
+ def __init__(self):
+ self.compldict = {}
+ self.parser = PyParser()
+
+ def evalsource(self,text,line=0):
+ sc = self.parser.parse(text,line)
+ src = sc.get_code()
+ dbg("source: %s" % src)
+ try: exec(src) in self.compldict
+ except: dbg("parser: %s, %s" % (sys.exc_info()[0],sys.exc_info()[1]))
+ for l in sc.locals:
+ try: exec(l) in self.compldict
+ except: dbg("locals: %s, %s [%s]" % (sys.exc_info()[0],sys.exc_info()[1],l))
+
+ def _cleanstr(self,doc):
+ return doc.replace('"',' ').replace("'",' ')
+
+ def get_arguments(self,func_obj):
+ def _ctor(obj):
+ try: return class_ob.__init__.im_func
+ except AttributeError:
+ for base in class_ob.__bases__:
+ rc = _find_constructor(base)
+ if rc is not None: return rc
+ return None
+
+ arg_offset = 1
+ if type(func_obj) == types.ClassType: func_obj = _ctor(func_obj)
+ elif type(func_obj) == types.MethodType: func_obj = func_obj.im_func
+ else: arg_offset = 0
+
+ arg_text=''
+ if type(func_obj) in [types.FunctionType, types.LambdaType]:
+ try:
+ cd = func_obj.func_code
+ real_args = cd.co_varnames[arg_offset:cd.co_argcount]
+ defaults = func_obj.func_defaults or ''
+ defaults = map(lambda name: "=%s" % name, defaults)
+ defaults = [""] * (len(real_args)-len(defaults)) + defaults
+ items = map(lambda a,d: a+d, real_args, defaults)
+ if func_obj.func_code.co_flags & 0x4:
+ items.append("...")
+ if func_obj.func_code.co_flags & 0x8:
+ items.append("***")
+ arg_text = (','.join(items)) + ')'
+
+ except:
+ dbg("arg completion: %s: %s" % (sys.exc_info()[0],sys.exc_info()[1]))
+ pass
+ if len(arg_text) == 0:
+ # The doc string sometimes contains the function signature
+ # this works for a lot of C modules that are part of the
+ # standard library
+ doc = func_obj.__doc__
+ if doc:
+ doc = doc.lstrip()
+ pos = doc.find('\n')
+ if pos > 0:
+ sigline = doc[:pos]
+ lidx = sigline.find('(')
+ ridx = sigline.find(')')
+ if lidx > 0 and ridx > 0:
+ arg_text = sigline[lidx+1:ridx] + ')'
+ if len(arg_text) == 0: arg_text = ')'
+ return arg_text
+
+ def get_completions(self,context,match):
+ dbg("get_completions('%s','%s')" % (context,match))
+ stmt = ''
+ if context: stmt += str(context)
+ if match: stmt += str(match)
+ try:
+ result = None
+ all = {}
+ ridx = stmt.rfind('.')
+ if len(stmt) > 0 and stmt[-1] == '(':
+ result = eval(_sanitize(stmt[:-1]), self.compldict)
+ doc = result.__doc__
+ if doc is None: doc = ''
+ args = self.get_arguments(result)
+ return [{'word':self._cleanstr(args),'info':self._cleanstr(doc)}]
+ elif ridx == -1:
+ match = stmt
+ all = self.compldict
+ else:
+ match = stmt[ridx+1:]
+ stmt = _sanitize(stmt[:ridx])
+ result = eval(stmt, self.compldict)
+ all = dir(result)
+
+ dbg("completing: stmt:%s" % stmt)
+ completions = []
+
+ try: maindoc = result.__doc__
+ except: maindoc = ' '
+ if maindoc is None: maindoc = ' '
+ for m in all:
+ if m == "_PyCmplNoType": continue #this is internal
+ try:
+ dbg('possible completion: %s' % m)
+ if m.find(match) == 0:
+ if result is None: inst = all[m]
+ else: inst = getattr(result,m)
+ try: doc = inst.__doc__
+ except: doc = maindoc
+ typestr = str(inst)
+ if doc is None or doc == '': doc = maindoc
+
+ wrd = m[len(match):]
+ c = {'word':wrd, 'abbr':m, 'info':self._cleanstr(doc)}
+ if "function" in typestr:
+ c['word'] += '('
+ c['abbr'] += '(' + self._cleanstr(self.get_arguments(inst))
+ elif "method" in typestr:
+ c['word'] += '('
+ c['abbr'] += '(' + self._cleanstr(self.get_arguments(inst))
+ elif "module" in typestr:
+ c['word'] += '.'
+ elif "class" in typestr:
+ c['word'] += '('
+ c['abbr'] += '('
+ completions.append(c)
+ except:
+ i = sys.exc_info()
+ dbg("inner completion: %s,%s [stmt='%s']" % (i[0],i[1],stmt))
+ return completions
+ except:
+ i = sys.exc_info()
+ dbg("completion: %s,%s [stmt='%s']" % (i[0],i[1],stmt))
+ return []
+
+class Scope(object):
+ def __init__(self,name,indent,docstr=''):
+ self.subscopes = []
+ self.docstr = docstr
+ self.locals = []
+ self.parent = None
+ self.name = name
+ self.indent = indent
+
+ def add(self,sub):
+ #print 'push scope: [%s@%s]' % (sub.name,sub.indent)
+ sub.parent = self
+ self.subscopes.append(sub)
+ return sub
+
+ def doc(self,str):
+ """ Clean up a docstring """
+ d = str.replace('\n',' ')
+ d = d.replace('\t',' ')
+ while d.find(' ') > -1: d = d.replace(' ',' ')
+ while d[0] in '"\'\t ': d = d[1:]
+ while d[-1] in '"\'\t ': d = d[:-1]
+ dbg("Scope(%s)::docstr = %s" % (self,d))
+ self.docstr = d
+
+ def local(self,loc):
+ self._checkexisting(loc)
+ self.locals.append(loc)
+
+ def copy_decl(self,indent=0):
+ """ Copy a scope's declaration only, at the specified indent level - not local variables """
+ return Scope(self.name,indent,self.docstr)
+
+ def _checkexisting(self,test):
+ "Convienance function... keep out duplicates"
+ if test.find('=') > -1:
+ var = test.split('=')[0].strip()
+ for l in self.locals:
+ if l.find('=') > -1 and var == l.split('=')[0].strip():
+ self.locals.remove(l)
+
+ def get_code(self):
+ str = ""
+ if len(self.docstr) > 0: str += '"""'+self.docstr+'"""\n'
+ for l in self.locals:
+ if l.startswith('import'): str += l+'\n'
+ str += 'class _PyCmplNoType:\n def __getattr__(self,name):\n return None\n'
+ for sub in self.subscopes:
+ str += sub.get_code()
+ for l in self.locals:
+ if not l.startswith('import'): str += l+'\n'
+
+ return str
+
+ def pop(self,indent):
+ #print 'pop scope: [%s] to [%s]' % (self.indent,indent)
+ outer = self
+ while outer.parent != None and outer.indent >= indent:
+ outer = outer.parent
+ return outer
+
+ def currentindent(self):
+ #print 'parse current indent: %s' % self.indent
+ return ' '*self.indent
+
+ def childindent(self):
+ #print 'parse child indent: [%s]' % (self.indent+1)
+ return ' '*(self.indent+1)
+
+class Class(Scope):
+ def __init__(self, name, supers, indent, docstr=''):
+ Scope.__init__(self,name,indent, docstr)
+ self.supers = supers
+ def copy_decl(self,indent=0):
+ c = Class(self.name,self.supers,indent, self.docstr)
+ for s in self.subscopes:
+ c.add(s.copy_decl(indent+1))
+ return c
+ def get_code(self):
+ str = '%sclass %s' % (self.currentindent(),self.name)
+ if len(self.supers) > 0: str += '(%s)' % ','.join(self.supers)
+ str += ':\n'
+ if len(self.docstr) > 0: str += self.childindent()+'"""'+self.docstr+'"""\n'
+ if len(self.subscopes) > 0:
+ for s in self.subscopes: str += s.get_code()
+ else:
+ str += '%spass\n' % self.childindent()
+ return str
+
+
+class Function(Scope):
+ def __init__(self, name, params, indent, docstr=''):
+ Scope.__init__(self,name,indent, docstr)
+ self.params = params
+ def copy_decl(self,indent=0):
+ return Function(self.name,self.params,indent, self.docstr)
+ def get_code(self):
+ str = "%sdef %s(%s):\n" % \
+ (self.currentindent(),self.name,','.join(self.params))
+ if len(self.docstr) > 0: str += self.childindent()+'"""'+self.docstr+'"""\n'
+ str += "%spass\n" % self.childindent()
+ return str
+
+class PyParser:
+ def __init__(self):
+ self.top = Scope('global',0)
+ self.scope = self.top
+ self.parserline = 0
+
+ def _parsedotname(self,pre=None):
+ #returns (dottedname, nexttoken)
+ name = []
+ if pre is None:
+ tokentype, token, indent = self.next()
+ if tokentype != NAME and token != '*':
+ return ('', token)
+ else: token = pre
+ name.append(token)
+ while True:
+ tokentype, token, indent = self.next()
+ if token != '.': break
+ tokentype, token, indent = self.next()
+ if tokentype != NAME: break
+ name.append(token)
+ return (".".join(name), token)
+
+ def _parseimportlist(self):
+ imports = []
+ while True:
+ name, token = self._parsedotname()
+ if not name: break
+ name2 = ''
+ if token == 'as': name2, token = self._parsedotname()
+ imports.append((name, name2))
+ while token != "," and "\n" not in token:
+ tokentype, token, indent = self.next()
+ if token != ",": break
+ return imports
+
+ def _parenparse(self):
+ name = ''
+ names = []
+ level = 1
+ while True:
+ tokentype, token, indent = self.next()
+ if token in (')', ',') and level == 1:
+ if '=' not in name: name = name.replace(' ', '')
+ names.append(name.strip())
+ name = ''
+ if token == '(':
+ level += 1
+ name += "("
+ elif token == ')':
+ level -= 1
+ if level == 0: break
+ else: name += ")"
+ elif token == ',' and level == 1:
+ pass
+ else:
+ name += "%s " % str(token)
+ return names
+
+ def _parsefunction(self,indent):
+ self.scope=self.scope.pop(indent)
+ tokentype, fname, ind = self.next()
+ if tokentype != NAME: return None
+
+ tokentype, open, ind = self.next()
+ if open != '(': return None
+ params=self._parenparse()
+
+ tokentype, colon, ind = self.next()
+ if colon != ':': return None
+
+ return Function(fname,params,indent)
+
+ def _parseclass(self,indent):
+ self.scope=self.scope.pop(indent)
+ tokentype, cname, ind = self.next()
+ if tokentype != NAME: return None
+
+ super = []
+ tokentype, next, ind = self.next()
+ if next == '(':
+ super=self._parenparse()
+ elif next != ':': return None
+
+ return Class(cname,super,indent)
+
+ def _parseassignment(self):
+ assign=''
+ tokentype, token, indent = self.next()
+ if tokentype == tokenize.STRING or token == 'str':
+ return '""'
+ elif token == '(' or token == 'tuple':
+ return '()'
+ elif token == '[' or token == 'list':
+ return '[]'
+ elif token == '{' or token == 'dict':
+ return '{}'
+ elif tokentype == tokenize.NUMBER:
+ return '0'
+ elif token == 'open' or token == 'file':
+ return 'file'
+ elif token == 'None':
+ return '_PyCmplNoType()'
+ elif token == 'type':
+ return 'type(_PyCmplNoType)' #only for method resolution
+ else:
+ assign += token
+ level = 0
+ while True:
+ tokentype, token, indent = self.next()
+ if token in ('(','{','['):
+ level += 1
+ elif token in (']','}',')'):
+ level -= 1
+ if level == 0: break
+ elif level == 0:
+ if token in (';','\n'): break
+ assign += token
+ return "%s" % assign
+
+ def next(self):
+ type, token, (lineno, indent), end, self.parserline = self.gen.next()
+ if lineno == self.curline:
+ #print 'line found [%s] scope=%s' % (line.replace('\n',''),self.scope.name)
+ self.currentscope = self.scope
+ return (type, token, indent)
+
+ def _adjustvisibility(self):
+ newscope = Scope('result',0)
+ scp = self.currentscope
+ while scp != None:
+ if type(scp) == Function:
+ slice = 0
+ #Handle 'self' params
+ if scp.parent != None and type(scp.parent) == Class:
+ slice = 1
+ newscope.local('%s = %s' % (scp.params[0],scp.parent.name))
+ for p in scp.params[slice:]:
+ i = p.find('=')
+ if len(p) == 0: continue
+ pvar = ''
+ ptype = ''
+ if i == -1:
+ pvar = p
+ ptype = '_PyCmplNoType()'
+ else:
+ pvar = p[:i]
+ ptype = _sanitize(p[i+1:])
+ if pvar.startswith('**'):
+ pvar = pvar[2:]
+ ptype = '{}'
+ elif pvar.startswith('*'):
+ pvar = pvar[1:]
+ ptype = '[]'
+
+ newscope.local('%s = %s' % (pvar,ptype))
+
+ for s in scp.subscopes:
+ ns = s.copy_decl(0)
+ newscope.add(ns)
+ for l in scp.locals: newscope.local(l)
+ scp = scp.parent
+
+ self.currentscope = newscope
+ return self.currentscope
+
+ #p.parse(vim.current.buffer[:],vim.eval("line('.')"))
+ def parse(self,text,curline=0):
+ self.curline = int(curline)
+ buf = cStringIO.StringIO(''.join(text) + '\n')
+ self.gen = tokenize.generate_tokens(buf.readline)
+ self.currentscope = self.scope
+
+ try:
+ freshscope=True
+ while True:
+ tokentype, token, indent = self.next()
+ #dbg( 'main: token=[%s] indent=[%s]' % (token,indent))
+
+ if tokentype == DEDENT or token == "pass":
+ self.scope = self.scope.pop(indent)
+ elif token == 'def':
+ func = self._parsefunction(indent)
+ if func is None:
+ print "function: syntax error..."
+ continue
+ dbg("new scope: function")
+ freshscope = True
+ self.scope = self.scope.add(func)
+ elif token == 'class':
+ cls = self._parseclass(indent)
+ if cls is None:
+ print "class: syntax error..."
+ continue
+ freshscope = True
+ dbg("new scope: class")
+ self.scope = self.scope.add(cls)
+
+ elif token == 'import':
+ imports = self._parseimportlist()
+ for mod, alias in imports:
+ loc = "import %s" % mod
+ if len(alias) > 0: loc += " as %s" % alias
+ self.scope.local(loc)
+ freshscope = False
+ elif token == 'from':
+ mod, token = self._parsedotname()
+ if not mod or token != "import":
+ print "from: syntax error..."
+ continue
+ names = self._parseimportlist()
+ for name, alias in names:
+ loc = "from %s import %s" % (mod,name)
+ if len(alias) > 0: loc += " as %s" % alias
+ self.scope.local(loc)
+ freshscope = False
+ elif tokentype == STRING:
+ if freshscope: self.scope.doc(token)
+ elif tokentype == NAME:
+ name,token = self._parsedotname(token)
+ if token == '=':
+ stmt = self._parseassignment()
+ dbg("parseassignment: %s = %s" % (name, stmt))
+ if stmt != None:
+ self.scope.local("%s = %s" % (name,stmt))
+ freshscope = False
+ except StopIteration: #thrown on EOF
+ pass
+ except:
+ dbg("parse error: %s, %s @ %s" %
+ (sys.exc_info()[0], sys.exc_info()[1], self.parserline))
+ return self._adjustvisibility()
+
+def _sanitize(str):
+ val = ''
+ level = 0
+ for c in str:
+ if c in ('(','{','['):
+ level += 1
+ elif c in (']','}',')'):
+ level -= 1
+ elif level == 0:
+ val += c
+ return val
+
+sys.path.extend(['.','..'])
+PYTHONEOF
+endfunction
+
+call s:DefPython()
+" vim: set et ts=4:
diff --git a/runtime/autoload/rubycomplete.vim b/runtime/autoload/rubycomplete.vim
new file mode 100644
index 0000000..3677b25
--- /dev/null
+++ b/runtime/autoload/rubycomplete.vim
@@ -0,0 +1,872 @@
+" Vim completion script
+" Language: Ruby
+" Maintainer: Mark Guzman <segfault@hasno.info>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Apr 12
+" ----------------------------------------------------------------------------
+"
+" Ruby IRB/Complete author: Keiju ISHITSUKA(keiju@ishitsuka.com)
+" ----------------------------------------------------------------------------
+
+" {{{ requirement checks
+
+function! s:ErrMsg(msg)
+ echohl ErrorMsg
+ echo a:msg
+ echohl None
+endfunction
+
+if !has('ruby')
+ call s:ErrMsg( "Error: Rubycomplete requires vim compiled with +ruby" )
+ call s:ErrMsg( "Error: falling back to syntax completion" )
+ " lets fall back to syntax completion
+ setlocal omnifunc=syntaxcomplete#Complete
+ finish
+endif
+
+if version < 700
+ call s:ErrMsg( "Error: Required vim >= 7.0" )
+ finish
+endif
+" }}} requirement checks
+
+" {{{ configuration failsafe initialization
+if !exists("g:rubycomplete_rails")
+ let g:rubycomplete_rails = 0
+endif
+
+if !exists("g:rubycomplete_classes_in_global")
+ let g:rubycomplete_classes_in_global = 0
+endif
+
+if !exists("g:rubycomplete_buffer_loading")
+ let g:rubycomplete_buffer_loading = 0
+endif
+
+if !exists("g:rubycomplete_include_object")
+ let g:rubycomplete_include_object = 0
+endif
+
+if !exists("g:rubycomplete_include_objectspace")
+ let g:rubycomplete_include_objectspace = 0
+endif
+" }}} configuration failsafe initialization
+
+" {{{ regex patterns
+
+" Regex that defines the start-match for the 'end' keyword.
+let s:end_start_regex =
+ \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' .
+ \ '\<\%(module\|class\|if\|for\|while\|until\|case\|unless\|begin' .
+ \ '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
+ \ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'
+
+" Regex that defines the middle-match for the 'end' keyword.
+let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue:\@!\>\|when\|elsif\):\@!\>'
+
+" Regex that defines the end-match for the 'end' keyword.
+let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end:\@!\>'
+
+" }}} regex patterns
+
+" {{{ vim-side support functions
+let s:rubycomplete_debug = 0
+
+function! s:dprint(msg)
+ if s:rubycomplete_debug == 1
+ echom a:msg
+ endif
+endfunction
+
+function! s:GetBufferRubyModule(name, ...)
+ if a:0 == 1
+ let [snum,enum] = s:GetBufferRubyEntity(a:name, "module", a:1)
+ else
+ let [snum,enum] = s:GetBufferRubyEntity(a:name, "module")
+ endif
+ return snum . '..' . enum
+endfunction
+
+function! s:GetBufferRubyClass(name, ...)
+ if a:0 >= 1
+ let [snum,enum] = s:GetBufferRubyEntity(a:name, "class", a:1)
+ else
+ let [snum,enum] = s:GetBufferRubyEntity(a:name, "class")
+ endif
+ return snum . '..' . enum
+endfunction
+
+function! s:GetBufferRubySingletonMethods(name)
+endfunction
+
+function! s:GetBufferRubyEntity( name, type, ... )
+ let lastpos = getpos(".")
+ let lastline = lastpos
+ if (a:0 >= 1)
+ let lastline = [ 0, a:1, 0, 0 ]
+ call cursor( a:1, 0 )
+ endif
+
+ let stopline = 1
+
+ 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' )
+
+ if lnum == 0 && lcol == 0
+ call cursor(lastpos[1], lastpos[2])
+ return [0,0]
+ endif
+
+ let curpos = getpos(".")
+ let [enum,ecol] = searchpairpos( s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'W' )
+ call cursor(lastpos[1], lastpos[2])
+
+ if lnum > enum
+ return [0,0]
+ endif
+ " we found a the class def
+ return [lnum,enum]
+endfunction
+
+function! s:IsInClassDef()
+ return s:IsPosInClassDef( line('.') )
+endfunction
+
+function! s:IsPosInClassDef(pos)
+ let [snum,enum] = s:GetBufferRubyEntity( '.*', "class" )
+ let ret = 'nil'
+
+ if snum < a:pos && a:pos < enum
+ let ret = snum . '..' . enum
+ endif
+
+ return ret
+endfunction
+
+function! s:IsInComment(pos)
+ let stack = synstack(a:pos[0], a:pos[1])
+ if !empty(stack)
+ return synIDattr(stack[0], 'name') =~ 'ruby\%(.*Comment\|Documentation\)'
+ else
+ return 0
+ endif
+endfunction
+
+function! s:GetRubyVarType(v)
+ let stopline = 1
+ let vtp = ''
+ let curpos = getpos('.')
+ let sstr = '^\s*#\s*@var\s*'.escape(a:v, '*').'\>\s\+[^ \t]\+\s*$'
+ let [lnum,lcol] = searchpos(sstr,'nb',stopline)
+ if lnum != 0 && lcol != 0
+ call setpos('.',curpos)
+ let str = getline(lnum)
+ let vtp = substitute(str,sstr,'\1','')
+ return vtp
+ endif
+ call setpos('.',curpos)
+ let ctors = '\(now\|new\|open\|get_instance'
+ if exists('g:rubycomplete_rails') && g:rubycomplete_rails == 1 && s:rubycomplete_rails_loaded == 1
+ let ctors = ctors.'\|find\|create'
+ else
+ endif
+ let ctors = ctors.'\)'
+
+ let fstr = '=\s*\([^ \t]\+.' . ctors .'\>\|[\[{"''/]\|%[xwQqr][(\[{@]\|[A-Za-z0-9@:\-()\.]\+...\?\|lambda\|&\)'
+ let sstr = ''.escape(a:v, '*').'\>\s*[+\-*/]*'.fstr
+ let pos = searchpos(sstr,'bW')
+ while pos != [0,0] && s:IsInComment(pos)
+ let pos = searchpos(sstr,'bW')
+ endwhile
+ if pos != [0,0]
+ let [lnum, col] = pos
+ let str = matchstr(getline(lnum),fstr,col)
+ let str = substitute(str,'^=\s*','','')
+
+ call setpos('.',pos)
+ if str == '"' || str == '''' || stridx(tolower(str), '%q[') != -1
+ return 'String'
+ elseif str == '[' || stridx(str, '%w[') != -1
+ return 'Array'
+ elseif str == '{'
+ return 'Hash'
+ elseif str == '/' || str == '%r{'
+ return 'Regexp'
+ elseif strlen(str) >= 4 && stridx(str,'..') != -1
+ return 'Range'
+ elseif stridx(str, 'lambda') != -1 || str == '&'
+ return 'Proc'
+ elseif strlen(str) > 4
+ let l = stridx(str,'.')
+ return str[0:l-1]
+ end
+ return ''
+ endif
+ call setpos('.',curpos)
+ return ''
+endfunction
+
+"}}} vim-side support functions
+
+"{{{ vim-side completion function
+function! rubycomplete#Init()
+ execute "ruby VimRubyCompletion.preload_rails"
+endfunction
+
+function! rubycomplete#Complete(findstart, base)
+ "findstart = 1 when we need to get the text length
+ if a:findstart
+ let line = getline('.')
+ let idx = col('.')
+ while idx > 0
+ let idx -= 1
+ let c = line[idx-1]
+ if c =~ '\w'
+ continue
+ elseif ! c =~ '\.'
+ let idx = -1
+ break
+ else
+ break
+ endif
+ endwhile
+
+ return idx
+ "findstart = 0 when we need to return the list of completions
+ else
+ let g:rubycomplete_completions = []
+ execute "ruby VimRubyCompletion.get_completions('" . a:base . "')"
+ return g:rubycomplete_completions
+ endif
+endfunction
+"}}} vim-side completion function
+
+"{{{ ruby-side code
+function! s:DefRuby()
+ruby << RUBYEOF
+# {{{ ruby completion
+
+begin
+ require 'rubygems' # let's assume this is safe...?
+rescue Exception
+ #ignore?
+end
+class VimRubyCompletion
+# {{{ constants
+ @@debug = false
+ @@ReservedWords = [
+ "BEGIN", "END",
+ "alias", "and",
+ "begin", "break",
+ "case", "class",
+ "def", "defined", "do",
+ "else", "elsif", "end", "ensure",
+ "false", "for",
+ "if", "in",
+ "module",
+ "next", "nil", "not",
+ "or",
+ "redo", "rescue", "retry", "return",
+ "self", "super",
+ "then", "true",
+ "undef", "unless", "until",
+ "when", "while",
+ "yield",
+ ]
+
+ @@Operators = [ "%", "&", "*", "**", "+", "-", "/",
+ "<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", ">>",
+ "[]", "[]=", "^", ]
+# }}} constants
+
+# {{{ buffer analysis magic
+ def load_requires
+
+ custom_paths = VIM::evaluate("get(g:, 'rubycomplete_load_paths', [])")
+
+ if !custom_paths.empty?
+ $LOAD_PATH.concat(custom_paths).uniq!
+ end
+
+ buf = VIM::Buffer.current
+ enum = buf.line_number
+ nums = Range.new( 1, enum )
+ nums.each do |x|
+
+ ln = buf[x]
+ begin
+ if /.*require_relative\s*(.*)$/.match( ln )
+ eval( "require %s" % File.expand_path($1) )
+ elsif /.*require\s*(["'].*?["'])/.match( ln )
+ eval( "require %s" % $1 )
+ end
+ rescue Exception => e
+ dprint e.inspect
+ end
+ 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")')
+ return if classdef == nil
+
+ pare = /^\s*class\s*(.*)\s*<\s*(.*)\s*\n/.match( classdef )
+ load_buffer_class( $2 ) if pare != nil && $2 != name # load parent class if needed
+
+ mixre = /.*\n\s*(include|prepend)\s*(.*)\s*\n/.match( classdef )
+ load_buffer_module( $2 ) if mixre != nil && $2 != name # load mixins if needed
+
+ begin
+ eval classdef
+ rescue Exception
+ VIM::evaluate( "s:ErrMsg( 'Problem loading class \"%s\", was it already completed?' )" % name )
+ end
+ dprint "load_buffer_class(%s) END" % name
+ end
+
+ def load_buffer_module(name)
+ dprint "load_buffer_module(%s) START" % name
+ classdef = get_buffer_entity(name, 's:GetBufferRubyModule("%s")')
+ return if classdef == nil
+
+ begin
+ eval classdef
+ rescue Exception
+ VIM::evaluate( "s:ErrMsg( 'Problem loading module \"%s\", was it already completed?' )" % name )
+ end
+ dprint "load_buffer_module(%s) END" % name
+ end
+
+ def get_buffer_entity(name, vimfun)
+ loading_allowed = VIM::evaluate("exists('g:rubycomplete_buffer_loading') && g:rubycomplete_buffer_loading")
+ return nil if loading_allowed.to_i.zero?
+ return nil if /(\"|\')+/.match( name )
+ buf = VIM::Buffer.current
+ nums = eval( VIM::evaluate( vimfun % name ) )
+ return nil if nums == nil
+ return nil if nums.min == nums.max && nums.min == 0
+
+ dprint "get_buffer_entity START"
+ visited = []
+ clscnt = 0
+ bufname = VIM::Buffer.current.name
+ classdef = ""
+ cur_line = VIM::Buffer.current.line_number
+ while (nums != nil && !(nums.min == 0 && nums.max == 0) )
+ dprint "visited: %s" % visited.to_s
+ break if visited.index( nums )
+ visited << nums
+
+ nums.each do |x|
+ if x != cur_line
+ next if x == 0
+ ln = buf[x]
+ is_const = false
+ if /^\s*(module|class|def|include)\s+/.match(ln) || is_const = /^\s*?[A-Z]([A-z]|[1-9])*\s*?[|]{0,2}=\s*?.+\s*?/.match(ln)
+ clscnt += 1 if /class|module/.match($1)
+ # We must make sure to load each constant only once to avoid errors
+ if is_const
+ ln.gsub!(/\s*?[|]{0,2}=\s*?/, '||=')
+ end
+ #dprint "\$1$1
+ classdef += "%s\n" % ln
+ classdef += "end\n" if /def\s+/.match(ln)
+ dprint ln
+ end
+ end
+ end
+
+ nm = "%s(::.*)*\", %s, \"" % [ name, nums.last ]
+ nums = eval( VIM::evaluate( vimfun % nm ) )
+ dprint "nm: \"%s\"" % nm
+ dprint "vimfun: %s" % (vimfun % nm)
+ dprint "got nums: %s" % nums.to_s
+ end
+ if classdef.length > 1
+ classdef += "end\n"*clscnt
+ # classdef = "class %s\n%s\nend\n" % [ bufname.gsub( /\/|\\/, "_" ), classdef ]
+ end
+
+ dprint "get_buffer_entity END"
+ dprint "classdef====start"
+ lns = classdef.split( "\n" )
+ lns.each { |x| dprint x }
+ dprint "classdef====end"
+ return classdef
+ end
+
+ def get_var_type( receiver )
+ if /(\"|\')+/.match( receiver )
+ "String"
+ else
+ VIM::evaluate("s:GetRubyVarType('%s')" % receiver)
+ end
+ end
+
+ def dprint( txt )
+ print txt if @@debug
+ end
+
+ def escape_vim_singlequote_string(str)
+ str.to_s.gsub(/'/,"\\'")
+ end
+
+ def get_buffer_entity_list( type )
+ # this will be a little expensive.
+ loading_allowed = VIM::evaluate("exists('g:rubycomplete_buffer_loading') && g:rubycomplete_buffer_loading")
+ allow_aggressive_load = VIM::evaluate("exists('g:rubycomplete_classes_in_global') && g:rubycomplete_classes_in_global")
+ return [] if allow_aggressive_load.to_i.zero? || loading_allowed.to_i.zero?
+
+ buf = VIM::Buffer.current
+ eob = buf.length
+ ret = []
+ rg = 1..eob
+ re = eval( "/^\s*%s\s*([A-Za-z0-9_:-]*)(\s*<\s*([A-Za-z0-9_:-]*))?\s*/" % type )
+
+ rg.each do |x|
+ if re.match( buf[x] )
+ next if type == "def" && eval( VIM::evaluate("s:IsPosInClassDef(%s)" % x) ) != nil
+ ret.push $1
+ end
+ end
+
+ return ret
+ end
+
+ def get_buffer_modules
+ return get_buffer_entity_list( "modules" )
+ end
+
+ def get_buffer_methods
+ return get_buffer_entity_list( "def" )
+ end
+
+ def get_buffer_classes
+ return get_buffer_entity_list( "class" )
+ end
+
+ def load_rails
+ allow_rails = VIM::evaluate("exists('g:rubycomplete_rails') && g:rubycomplete_rails")
+ return if allow_rails.to_i.zero?
+
+ buf_path = VIM::evaluate('expand("%:p")')
+ file_name = VIM::evaluate('expand("%:t")')
+ vim_dir = VIM::evaluate('getcwd()')
+ file_dir = buf_path.gsub( file_name, '' )
+ file_dir.gsub!( /\\/, "/" )
+ vim_dir.gsub!( /\\/, "/" )
+ vim_dir << "/"
+ dirs = [ vim_dir, file_dir ]
+ sdirs = [ "", "./", "../", "../../", "../../../", "../../../../" ]
+ rails_base = nil
+
+ dirs.each do |dir|
+ sdirs.each do |sub|
+ trail = "%s%s" % [ dir, sub ]
+ tcfg = "%sconfig" % trail
+
+ if File.exists?( tcfg )
+ rails_base = trail
+ break
+ end
+ end
+ break if rails_base
+ end
+
+ return if rails_base == nil
+ $:.push rails_base unless $:.index( rails_base )
+
+ bootfile = rails_base + "config/boot.rb"
+ envfile = rails_base + "config/environment.rb"
+ if File.exists?( bootfile ) && File.exists?( envfile )
+ begin
+ require bootfile
+ require envfile
+ begin
+ require 'console_app'
+ require 'console_with_helpers'
+ rescue Exception
+ dprint "Rails 1.1+ Error %s" % $!
+ # assume 1.0
+ end
+ #eval( "Rails::Initializer.run" ) #not necessary?
+ VIM::command('let s:rubycomplete_rails_loaded = 1')
+ dprint "rails loaded"
+ rescue Exception
+ dprint "Rails Error %s" % $!
+ VIM::evaluate( "s:ErrMsg('Error loading rails environment')" )
+ end
+ end
+ end
+
+ def get_rails_helpers
+ allow_rails = VIM::evaluate("exists('g:rubycomplete_rails') && g:rubycomplete_rails")
+ rails_loaded = VIM::evaluate('s:rubycomplete_rails_loaded')
+ return [] if allow_rails.to_i.zero? || rails_loaded.to_i.zero?
+
+ buf_path = VIM::evaluate('expand("%:p")')
+ buf_path.gsub!( /\\/, "/" )
+ path_elm = buf_path.split( "/" )
+ dprint "buf_path: %s" % buf_path
+ types = [ "app", "db", "lib", "test", "components", "script" ]
+
+ i = nil
+ ret = []
+ type = nil
+ types.each do |t|
+ i = path_elm.index( t )
+ break if i
+ end
+ type = path_elm[i]
+ type.downcase!
+
+ dprint "type: %s" % type
+ case type
+ when "app"
+ i += 1
+ subtype = path_elm[i]
+ subtype.downcase!
+
+ dprint "subtype: %s" % subtype
+ case subtype
+ when "views"
+ ret += ActionView::Base.instance_methods
+ ret += ActionView::Base.methods
+ when "controllers"
+ ret += ActionController::Base.instance_methods
+ ret += ActionController::Base.methods
+ when "models"
+ ret += ActiveRecord::Base.instance_methods
+ ret += ActiveRecord::Base.methods
+ end
+
+ when "db"
+ ret += ActiveRecord::ConnectionAdapters::SchemaStatements.instance_methods
+ ret += ActiveRecord::ConnectionAdapters::SchemaStatements.methods
+ end
+
+ return ret
+ end
+
+ def add_rails_columns( cls )
+ allow_rails = VIM::evaluate("exists('g:rubycomplete_rails') && g:rubycomplete_rails")
+ rails_loaded = VIM::evaluate('s:rubycomplete_rails_loaded')
+ return [] if allow_rails.to_i.zero? || rails_loaded.to_i.zero?
+
+ begin
+ eval( "#{cls}.establish_connection" )
+ return [] unless eval( "#{cls}.ancestors.include?(ActiveRecord::Base).to_s" )
+ col = eval( "#{cls}.column_names" )
+ return col if col
+ rescue
+ dprint "add_rails_columns err: (cls: %s) %s" % [ cls, $! ]
+ return []
+ end
+ return []
+ end
+
+ def clean_sel(sel, msg)
+ ret = sel.reject{|x|x.nil?}.uniq
+ ret = ret.grep(/^#{Regexp.quote(msg)}/) if msg != nil
+ ret
+ end
+
+ def get_rails_view_methods
+ allow_rails = VIM::evaluate("exists('g:rubycomplete_rails') && g:rubycomplete_rails")
+ rails_loaded = VIM::evaluate('s:rubycomplete_rails_loaded')
+ return [] if allow_rails.to_i.zero? || rails_loaded.to_i.zero?
+
+ buf_path = VIM::evaluate('expand("%:p")')
+ buf_path.gsub!( /\\/, "/" )
+ pelm = buf_path.split( "/" )
+ idx = pelm.index( "views" )
+
+ return [] unless idx
+ idx += 1
+
+ clspl = pelm[idx].camelize.pluralize
+ cls = clspl.singularize
+
+ ret = []
+ begin
+ ret += eval( "#{cls}.instance_methods" )
+ ret += eval( "#{clspl}Helper.instance_methods" )
+ rescue Exception
+ dprint "Error: Unable to load rails view helpers for %s: %s" % [ cls, $! ]
+ end
+
+ return ret
+ end
+# }}} buffer analysis magic
+
+# {{{ main completion code
+ def self.preload_rails
+ a = VimRubyCompletion.new
+ if VIM::evaluate("has('nvim')") == 0
+ require 'thread'
+ Thread.new(a) do |b|
+ begin
+ b.load_rails
+ rescue
+ end
+ end
+ end
+ a.load_rails
+ rescue
+ end
+
+ def self.get_completions(base)
+ b = VimRubyCompletion.new
+ b.get_completions base
+ end
+
+ def get_completions(base)
+ loading_allowed = VIM::evaluate("exists('g:rubycomplete_buffer_loading') && g:rubycomplete_buffer_loading")
+ if loading_allowed.to_i == 1
+ load_requires
+ 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]
+ input += base
+ input.sub!(/.*[ \t\n\"\\'`><=;|&{(]/, '') # Readline.basic_word_break_characters
+ input.sub!(/self\./, '')
+ input.sub!(/.*((\.\.[\[(]?)|([\[(]))/, '')
+
+ dprint 'input %s' % input
+ message = nil
+ receiver = nil
+ methods = []
+ variables = []
+ classes = []
+ constants = []
+
+ case input
+ when /^(\/[^\/]*\/)\.([^.]*)$/ # Regexp
+ receiver = $1
+ message = Regexp.quote($2)
+ methods = Regexp.instance_methods(true)
+
+ when /^([^\]]*\])\.([^.]*)$/ # Array
+ receiver = $1
+ message = Regexp.quote($2)
+ methods = Array.instance_methods(true)
+
+ when /^([^\}]*\})\.([^.]*)$/ # Proc or Hash
+ receiver = $1
+ message = Regexp.quote($2)
+ methods = Proc.instance_methods(true) | Hash.instance_methods(true)
+
+ when /^(:[^:.]*)$/ # Symbol
+ dprint "symbol"
+ if Symbol.respond_to?(:all_symbols)
+ receiver = $1
+ message = $1.sub( /:/, '' )
+ methods = Symbol.all_symbols.collect{|s| s.id2name}
+ methods.delete_if { |c| c.match( /'/ ) }
+ end
+
+ when /^::([A-Z][^:\.\(]*)?$/ # Absolute Constant or class methods
+ dprint "const or cls"
+ receiver = $1
+ methods = Object.constants.collect{ |c| c.to_s }.grep(/^#{receiver}/)
+
+ when /^(((::)?[A-Z][^:.\(]*)+?)::?([^:.]*)$/ # Constant or class methods
+ receiver = $1
+ message = Regexp.quote($4)
+ dprint "const or cls 2 [recv: \'%s\', msg: \'%s\']" % [ receiver, message ]
+ load_buffer_class( receiver )
+ load_buffer_module( receiver )
+ begin
+ constants = eval("#{receiver}.constants").collect{ |c| c.to_s }.grep(/^#{message}/)
+ methods = eval("#{receiver}.methods").collect{ |m| m.to_s }.grep(/^#{message}/)
+ rescue Exception
+ dprint "exception: %s" % $!
+ constants = []
+ methods = []
+ end
+
+ when /^(:[^:.]+)\.([^.]*)$/ # Symbol
+ dprint "symbol"
+ receiver = $1
+ message = Regexp.quote($2)
+ methods = Symbol.instance_methods(true)
+
+ when /^([0-9_]+(\.[0-9_]+)?(e[0-9]+)?)\.([^.]*)$/ # Numeric
+ dprint "numeric"
+ receiver = $1
+ message = Regexp.quote($4)
+ begin
+ methods = eval(receiver).methods
+ rescue Exception
+ methods = []
+ end
+
+ when /^(\$[^.]*)$/ #global
+ dprint "global"
+ methods = global_variables.grep(Regexp.new(Regexp.quote($1)))
+
+ when /^((\.?[^.]+)+?)\.([^.]*)$/ # variable
+ dprint "variable"
+ receiver = $1
+ message = Regexp.quote($3)
+ load_buffer_class( receiver )
+
+ cv = eval("self.class.constants")
+ vartype = get_var_type( receiver )
+ dprint "vartype: %s" % vartype
+
+ invalid_vartype = ['', "gets"]
+ if !invalid_vartype.include?(vartype)
+ load_buffer_class( vartype )
+
+ begin
+ methods = eval("#{vartype}.instance_methods")
+ variables = eval("#{vartype}.instance_variables")
+ rescue Exception
+ dprint "load_buffer_class err: %s" % $!
+ end
+ elsif (cv).include?(receiver)
+ # foo.func and foo is local var.
+ methods = eval("#{receiver}.methods")
+ vartype = receiver
+ elsif /^[A-Z]/ =~ receiver and /\./ !~ receiver
+ vartype = receiver
+ # Foo::Bar.func
+ begin
+ methods = eval("#{receiver}.methods")
+ rescue Exception
+ end
+ else
+ # func1.func2
+ ObjectSpace.each_object(Module){|m|
+ next if m.name != "IRB::Context" and
+ /^(IRB|SLex|RubyLex|RubyToken)/ =~ m.name
+ methods.concat m.instance_methods(false)
+ }
+ end
+ variables += add_rails_columns( "#{vartype}" ) if vartype && !invalid_vartype.include?(vartype)
+
+ when /^\(?\s*[A-Za-z0-9:^@.%\/+*\(\)]+\.\.\.?[A-Za-z0-9:^@.%\/+*\(\)]+\s*\)?\.([^.]*)/
+ message = $1
+ methods = Range.instance_methods(true)
+
+ when /^\.([^.]*)$/ # unknown(maybe String)
+ message = Regexp.quote($1)
+ methods = String.instance_methods(true)
+
+ else
+ dprint "default/other"
+ inclass = eval( VIM::evaluate("s:IsInClassDef()") )
+
+ if inclass != nil
+ dprint "inclass"
+ classdef = "%s\n" % VIM::Buffer.current[ inclass.min ]
+ found = /^\s*class\s*([A-Za-z0-9_-]*)(\s*<\s*([A-Za-z0-9_:-]*))?\s*\n$/.match( classdef )
+
+ if found != nil
+ receiver = $1
+ message = input
+ load_buffer_class( receiver )
+ begin
+ methods = eval( "#{receiver}.instance_methods" )
+ variables += add_rails_columns( "#{receiver}" )
+ rescue Exception
+ found = nil
+ end
+ end
+ end
+
+ if inclass == nil || found == nil
+ dprint "inclass == nil"
+ methods = get_buffer_methods
+ methods += get_rails_view_methods
+
+ cls_const = Class.constants
+ constants = cls_const.select { |c| /^[A-Z_-]+$/.match( c ) }
+ classes = eval("self.class.constants") - constants
+ classes += get_buffer_classes
+ classes += get_buffer_modules
+
+ include_objectspace = VIM::evaluate("exists('g:rubycomplete_include_objectspace') && g:rubycomplete_include_objectspace")
+ ObjectSpace.each_object(Class) { |cls| classes << cls.to_s } if include_objectspace == "1"
+ message = receiver = input
+ end
+
+ methods += get_rails_helpers
+ methods += Kernel.public_methods
+ end
+
+ include_object = VIM::evaluate("exists('g:rubycomplete_include_object') && g:rubycomplete_include_object")
+ methods = clean_sel( methods, message )
+ methods = (methods-Object.instance_methods) if include_object == "0"
+ rbcmeth = (VimRubyCompletion.instance_methods-Object.instance_methods) # lets remove those rubycomplete methods
+ methods = (methods-rbcmeth)
+
+ variables = clean_sel( variables, message )
+ classes = clean_sel( classes, message ) - ["VimRubyCompletion"]
+ constants = clean_sel( constants, message )
+
+ valid = []
+ valid += methods.collect { |m| { :name => m.to_s, :type => 'm' } }
+ valid += variables.collect { |v| { :name => v.to_s, :type => 'v' } }
+ valid += classes.collect { |c| { :name => c.to_s, :type => 't' } }
+ valid += constants.collect { |d| { :name => d.to_s, :type => 'd' } }
+ valid.sort! { |x,y| x[:name] <=> y[:name] }
+
+ outp = ""
+
+ rg = 0..valid.length
+ rg.step(150) do |x|
+ stpos = 0+x
+ enpos = 150+x
+ valid[stpos..enpos].each { |c| outp += "{'word':'%s','item':'%s','kind':'%s'}," % [ c[:name], c[:name], c[:type] ].map{|x|escape_vim_singlequote_string(x)} }
+ outp.sub!(/,$/, '')
+
+ VIM::command("call extend(g:rubycomplete_completions, [%s])" % outp)
+ outp = ""
+ end
+ end
+# }}} main completion code
+
+end # VimRubyCompletion
+# }}} ruby completion
+RUBYEOF
+endfunction
+
+let s:rubycomplete_rails_loaded = 0
+
+call s:DefRuby()
+"}}} ruby-side code
+
+" vim:tw=78:sw=4:ts=8:et:fdm=marker:ft=vim:norl:
diff --git a/runtime/autoload/rust.vim b/runtime/autoload/rust.vim
new file mode 100644
index 0000000..34a3b41
--- /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 0000000..a689b5e
--- /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/spellfile.vim b/runtime/autoload/spellfile.vim
new file mode 100644
index 0000000..6f9b1e0
--- /dev/null
+++ b/runtime/autoload/spellfile.vim
@@ -0,0 +1,206 @@
+" Vim script to download a missing spell file
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2020 Jul 10
+
+if !exists('g:spellfile_URL')
+ " Always use https:// because it's secure. The certificate is for nluug.nl,
+ " thus we can't use the alias ftp.vim.org here.
+ let g:spellfile_URL = 'https://ftp.nluug.nl/pub/vim/runtime/spell'
+endif
+let s:spellfile_URL = '' " Start with nothing so that s:donedict is reset.
+
+" This function is used for the spellfile plugin.
+function! spellfile#LoadFile(lang)
+ " If the netrw plugin isn't loaded we silently skip everything.
+ if !exists(":Nread")
+ if &verbose
+ echomsg 'spellfile#LoadFile(): Nread command is not available.'
+ endif
+ return
+ endif
+ let lang = tolower(a:lang)
+
+ " If the URL changes we try all files again.
+ if s:spellfile_URL != g:spellfile_URL
+ let s:donedict = {}
+ let s:spellfile_URL = g:spellfile_URL
+ endif
+
+ " I will say this only once!
+ if has_key(s:donedict, lang . &enc)
+ if &verbose
+ echomsg 'spellfile#LoadFile(): Tried this language/encoding before.'
+ endif
+ return
+ endif
+ let s:donedict[lang . &enc] = 1
+
+ " Find spell directories we can write in.
+ let [dirlist, dirchoices] = spellfile#GetDirChoices()
+ if len(dirlist) == 0
+ let dir_to_create = spellfile#WritableSpellDir()
+ if &verbose || dir_to_create != ''
+ echomsg 'spellfile#LoadFile(): There is no writable spell directory.'
+ endif
+ if dir_to_create != ''
+ if confirm("Shall I create " . dir_to_create, "&Yes\n&No", 2) == 1
+ " After creating the directory it should show up in the list.
+ call mkdir(dir_to_create, "p")
+ let [dirlist, dirchoices] = spellfile#GetDirChoices()
+ endif
+ endif
+ if len(dirlist) == 0
+ return
+ endif
+ endif
+
+ let msg = 'Cannot find spell file for "' . lang . '" in ' . &enc
+ let msg .= "\nDo you want me to try downloading it?"
+ if confirm(msg, "&Yes\n&No", 2) == 1
+ let enc = &encoding
+ if enc == 'iso-8859-15'
+ let enc = 'latin1'
+ endif
+ let fname = lang . '.' . enc . '.spl'
+
+ " Split the window, read the file into a new buffer.
+ " Remember the buffer number, we check it below.
+ new
+ let newbufnr = winbufnr(0)
+ setlocal bin fenc=
+ echo 'Downloading ' . fname . '...'
+ call spellfile#Nread(fname)
+ if getline(2) !~ 'VIMspell'
+ " Didn't work, perhaps there is an ASCII one.
+ " Careful: Nread() may have opened a new window for the error message,
+ " we need to go back to our own buffer and window.
+ if newbufnr != winbufnr(0)
+ let winnr = bufwinnr(newbufnr)
+ if winnr == -1
+ " Our buffer has vanished!? Open a new window.
+ echomsg "download buffer disappeared, opening a new one"
+ new
+ setlocal bin fenc=
+ else
+ exe winnr . "wincmd w"
+ endif
+ endif
+ if newbufnr == winbufnr(0)
+ " We are back the old buffer, remove any (half-finished) download.
+ g/^/d
+ else
+ let newbufnr = winbufnr(0)
+ endif
+
+ let fname = lang . '.ascii.spl'
+ echo 'Could not find it, trying ' . fname . '...'
+ call spellfile#Nread(fname)
+ if getline(2) !~ 'VIMspell'
+ echo 'Sorry, downloading failed'
+ exe newbufnr . "bwipe!"
+ return
+ endif
+ endif
+
+ " Delete the empty first line and mark the file unmodified.
+ 1d
+ set nomod
+
+ let msg = "In which directory do you want to write the file:"
+ for i in range(len(dirlist))
+ let msg .= "\n" . (i + 1) . '. ' . dirlist[i]
+ endfor
+ let dirchoice = confirm(msg, dirchoices) - 2
+ if dirchoice >= 0
+ if exists('*fnameescape')
+ let dirname = fnameescape(dirlist[dirchoice])
+ else
+ let dirname = escape(dirlist[dirchoice], ' ')
+ endif
+ setlocal fenc=
+ exe "write " . dirname . '/' . fname
+
+ " Also download the .sug file, if the user wants to.
+ let msg = "Do you want me to try getting the .sug file?\n"
+ let msg .= "This will improve making suggestions for spelling mistakes,\n"
+ let msg .= "but it uses quite a bit of memory."
+ if confirm(msg, "&No\n&Yes") == 2
+ g/^/d
+ let fname = substitute(fname, '\.spl$', '.sug', '')
+ echo 'Downloading ' . fname . '...'
+ call spellfile#Nread(fname)
+ if getline(2) =~ 'VIMsug'
+ 1d
+ exe "write " . dirname . '/' . fname
+ set nomod
+ else
+ echo 'Sorry, downloading failed'
+ " Go back to our own buffer/window, Nread() may have taken us to
+ " another window.
+ if newbufnr != winbufnr(0)
+ let winnr = bufwinnr(newbufnr)
+ if winnr != -1
+ exe winnr . "wincmd w"
+ endif
+ endif
+ if newbufnr == winbufnr(0)
+ set nomod
+ endif
+ endif
+ endif
+ endif
+
+ " Wipe out the buffer we used.
+ exe newbufnr . "bwipe"
+ endif
+endfunc
+
+" Read "fname" from the server.
+function! spellfile#Nread(fname)
+ " We do our own error handling, don't want a window for it.
+ if exists("g:netrw_use_errorwindow")
+ let save_ew = g:netrw_use_errorwindow
+ endif
+ let g:netrw_use_errorwindow=0
+
+ if g:spellfile_URL =~ '^ftp://'
+ " for an ftp server use a default login and password to avoid a prompt
+ let machine = substitute(g:spellfile_URL, 'ftp://\([^/]*\).*', '\1', '')
+ let dir = substitute(g:spellfile_URL, 'ftp://[^/]*/\(.*\)', '\1', '')
+ exe 'Nread "' . machine . ' anonymous vim7user ' . dir . '/' . a:fname . '"'
+ else
+ exe 'Nread ' g:spellfile_URL . '/' . a:fname
+ endif
+
+ if exists("save_ew")
+ let g:netrw_use_errorwindow = save_ew
+ else
+ unlet g:netrw_use_errorwindow
+ endif
+endfunc
+
+" Get a list of writable spell directories and choices for confirm().
+function! spellfile#GetDirChoices()
+ let dirlist = []
+ let dirchoices = '&Cancel'
+ for dir in split(globpath(&rtp, 'spell'), "\n")
+ if filewritable(dir) == 2
+ call add(dirlist, dir)
+ let dirchoices .= "\n&" . len(dirlist)
+ endif
+ endfor
+ return [dirlist, dirchoices]
+endfunc
+
+function! spellfile#WritableSpellDir()
+ if has("unix")
+ " For Unix always use the $HOME/.vim directory
+ return $HOME . "/.vim/spell"
+ endif
+ for dir in split(&rtp, ',')
+ if filewritable(dir) == 2
+ return dir . "/spell"
+ endif
+ endfor
+ return ''
+endfunction
diff --git a/runtime/autoload/sqlcomplete.vim b/runtime/autoload/sqlcomplete.vim
new file mode 100644
index 0000000..adbdbab
--- /dev/null
+++ b/runtime/autoload/sqlcomplete.vim
@@ -0,0 +1,996 @@
+" Vim OMNI completion script for SQL
+" Language: SQL
+" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
+" Version: 16.0
+" Last Change: 2017 Oct 15
+" Homepage: http://www.vim.org/scripts/script.php?script_id=1572
+" Usage: For detailed help
+" ":help sql.txt"
+" or ":help ft-sql-omni"
+" or read $VIMRUNTIME/doc/sql.txt
+
+" History
+"
+" TODO
+" - Jonas Enberg - if no table is found when using column completion
+" look backwards to a FROM clause and find the first table
+" and complete it.
+"
+" Version 16.0 (Dec 2015)
+" - NF: If resetting the cache and table, procedure or view completion
+" had been used via dbext, have dbext delete or recreate the
+" dictionary so that new objects are picked up for the
+" next completion.
+"
+" Version 15.0 (May 2013)
+" - NF: Changed the SQL precached syntax items, omni_sql_precache_syntax_groups,
+" to use regular expressions to pick up extended syntax group names.
+" This requires an updated SyntaxComplete plugin version 13.0.
+" If the required versions have not been installed, previous
+" behaviour will not be impacted.
+"
+" Version 14.0 (Dec 2012)
+" - BF: Added check for cpo
+"
+" Version 13.0 (Dec 2012)
+" - NF: When completing column lists or drilling into a table
+" and g:omni_sql_include_owner is enabled, the
+" only the table name would be replaced with the column
+" list instead of the table name and owner (if specified).
+" - NF: When completing column lists using table aliases
+" and g:omni_sql_include_owner is enabled, account
+" for the owner name when looking up the table
+" list instead of the table name and owner (if specified).
+" - BF: When completing column lists or drilling into a table
+" and g:omni_sql_include_owner is enabled, the
+" column list could often not be found for the table.
+" - BF: When OMNI popped up, possibly the wrong word
+" would be replaced for column and column list options.
+"
+" Version 12.0 (Feb 2012)
+" - Partial column name completion did not work when a table
+" name or table alias was provided (Jonas Enberg).
+" - Improved the handling of column completion. First we match any
+" columns from a previous completion. If not matches are found, we
+" consider the partial name to be a table or table alias for the
+" query and attempt to match on it.
+"
+" Version 11.0 (Jan 2012)
+" Added g:omni_sql_default_compl_type variable
+" - You can specify which type of completion to default to
+" when pressing <C-X><C-O>. The entire list of available
+" choices can be found in the calls to sqlcomplete#Map in:
+" ftplugin/sql.vim
+"
+" Version 10.0
+" Updated PreCacheSyntax()
+" - Now returns a List of the syntax items it finds.
+" This allows other plugins / scripts to use this list for their own
+" purposes. In this case XPTemplate can use them for a Choose list.
+" - Verifies the parameters are the correct type and displays a
+" warning if not.
+" - Verifies the parameters are the correct type and displays a
+" warning if not.
+" Updated SQLCWarningMsg()
+" - Prepends warning message with SQLComplete so you know who issued
+" the warning.
+" Updated SQLCErrorMsg()
+" - Prepends error message with SQLComplete so you know who issued
+" the error.
+"
+" Version 9.0 (May 2010)
+" This change removes some of the support for tables with spaces in their
+" names in order to simplify the regexes used to pull out query table
+" aliases for more robust table name and column name code completion.
+" Full support for "table names with spaces" can be added in again
+" after 7.3.
+"
+" Version 8.0
+" Incorrectly re-executed the g:ftplugin_sql_omni_key_right and g:ftplugin_sql_omni_key_left
+" when drilling in and out of a column list for a table.
+"
+" Version 7.0 (Jan 2010)
+" Better handling of object names
+"
+" Version 6.0 (Apr 2008)
+" Supports object names with spaces "my table name"
+"
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+" This check is in place in case this script is
+" sourced directly instead of using the autoload feature.
+if exists('&omnifunc')
+ " Do not set the option if already set since this
+ " results in an E117 warning.
+ if &omnifunc == ""
+ setlocal omnifunc=sqlcomplete#Complete
+ endif
+endif
+
+if exists('g:loaded_sql_completion')
+ finish
+endif
+let g:loaded_sql_completion = 160
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Maintains filename of dictionary
+let s:sql_file_table = ""
+let s:sql_file_procedure = ""
+let s:sql_file_view = ""
+
+" Define various arrays to be used for caching
+let s:tbl_name = []
+let s:tbl_alias = []
+let s:tbl_cols = []
+let s:syn_list = []
+let s:syn_value = []
+
+" Used in conjunction with the syntaxcomplete plugin
+let s:save_inc = ""
+let s:save_exc = ""
+if !exists('g:omni_syntax_group_include_sql')
+ let g:omni_syntax_group_include_sql = ''
+endif
+if !exists('g:omni_syntax_group_exclude_sql')
+ let g:omni_syntax_group_exclude_sql = ''
+endif
+let s:save_inc = g:omni_syntax_group_include_sql
+let s:save_exc = g:omni_syntax_group_exclude_sql
+
+" Used with the column list
+let s:save_prev_table = ""
+
+" Default the option to verify table alias
+if !exists('g:omni_sql_use_tbl_alias')
+ let g:omni_sql_use_tbl_alias = 'a'
+endif
+" Default syntax items to precache
+if !exists('g:omni_sql_precache_syntax_groups')
+ let g:omni_sql_precache_syntax_groups = [
+ \ 'syntax\w*',
+ \ 'sqlKeyword\w*',
+ \ 'sqlFunction\w*',
+ \ 'sqlOption\w*',
+ \ 'sqlType\w*',
+ \ 'sqlStatement\w*'
+ \ ]
+endif
+" Set ignorecase to the ftplugin standard
+if !exists('g:omni_sql_ignorecase')
+ let g:omni_sql_ignorecase = &ignorecase
+endif
+" During table completion, should the table list also
+" include the owner name
+if !exists('g:omni_sql_include_owner')
+ let g:omni_sql_include_owner = 0
+ if exists('g:loaded_dbext')
+ if g:loaded_dbext >= 300
+ " New to dbext 3.00, by default the table lists include the owner
+ " name of the table. This is used when determining how much of
+ " whatever has been typed should be replaced as part of the
+ " code replacement.
+ let g:omni_sql_include_owner = 1
+ endif
+ endif
+endif
+" Default type of completion used when <C-X><C-O> is pressed
+if !exists('g:omni_sql_default_compl_type')
+ let g:omni_sql_default_compl_type = 'table'
+endif
+
+" This function is used for the 'omnifunc' option.
+" It is called twice by omni and it is responsible
+" for returning the completion list of items.
+" But it must also determine context of what to complete
+" and what to "replace" with the completion.
+" The a:base, is replaced directly with what the user
+" chooses from the choices.
+" The s:prepend provides context for the completion.
+function! sqlcomplete#Complete(findstart, base)
+
+ " Default to table name completion
+ let compl_type = 'table'
+ " Allow maps to specify what type of object completion they want
+ if exists('b:sql_compl_type')
+ let compl_type = b:sql_compl_type
+ endif
+ let begindot = 0
+
+ " First pass through this function determines how much of the line should
+ " be replaced by whatever is chosen from the completion list
+ if a:findstart
+ " Locate the start of the item, including "."
+ let line = getline('.')
+ let start = col('.') - 1
+ let lastword = -1
+ " Check if the first character is a ".", for column completion
+ if line[start - 1] == '.'
+ let begindot = 1
+ endif
+ while start > 0
+ " Additional code was required to handle objects which
+ " can contain spaces like "my table name".
+ if line[start - 1] !~ '\(\w\|\.\)'
+ " If the previous character is not a period or word character
+ break
+ " elseif line[start - 1] =~ '\(\w\|\s\+\)'
+ " let start -= 1
+ elseif line[start - 1] =~ '\w'
+ " If the previous character is word character continue back
+ let start -= 1
+ elseif line[start - 1] =~ '\.' &&
+ \ compl_type =~ 'column\|table\|view\|procedure'
+ " If the previous character is a period and we are completing
+ " an object which can be specified with a period like this:
+ " table_name.column_name
+ " owner_name.table_name
+
+ " If lastword has already been set for column completion
+ " break from the loop, since we do not also want to pickup
+ " a table name if it was also supplied.
+ " Unless g:omni_sql_include_owner == 1, then we can
+ " include the ownername.
+ if lastword != -1 && compl_type == 'column'
+ \ && g:omni_sql_include_owner == 0
+ break
+ endif
+ " If column completion was specified stop at the "." if
+ " a . was specified, otherwise, replace all the way up
+ " to the owner name (if included).
+ if lastword == -1 && compl_type == 'column' && begindot == 1
+ let lastword = start
+ endif
+ " If omni_sql_include_owner = 0, do not include the table
+ " name as part of the substitution, so break here
+ if lastword == -1 &&
+ \ compl_type =~ '\<\(table\|view\|procedure\|column\|column_csv\)\>' &&
+ \ g:omni_sql_include_owner == 0
+ let lastword = start
+ break
+ endif
+ let start -= 1
+ else
+ break
+ endif
+ endwhile
+
+ " Return the column of the last word, which is going to be changed.
+ " Remember the text that comes before it in s:prepended.
+ if lastword == -1
+ let s:prepended = ''
+ return start
+ endif
+ let s:prepended = strpart(line, start, lastword - start)
+ return lastword
+ endif
+
+ " Second pass through this function will determine what data to put inside
+ " of the completion list
+ " s:prepended is set by the first pass
+ let base = s:prepended . a:base
+
+ " Default the completion list to an empty list
+ let compl_list = []
+
+ " Default to table name completion
+ let compl_type = g:omni_sql_default_compl_type
+ " Allow maps to specify what type of object completion they want
+ if exists('b:sql_compl_type')
+ let compl_type = b:sql_compl_type
+ unlet b:sql_compl_type
+ endif
+
+ if compl_type == 'tableReset'
+ let compl_type = 'table'
+ let base = ''
+ endif
+
+ if compl_type == 'table' ||
+ \ compl_type == 'procedure' ||
+ \ compl_type == 'view'
+
+ " This type of completion relies upon the dbext.vim plugin
+ if s:SQLCCheck4dbext() == -1
+ return []
+ endif
+
+ " Allow the user to override the dbext plugin to specify whether
+ " the owner/creator should be included in the list
+ if g:loaded_dbext >= 300
+ let saveSetting = DB_listOption('dict_show_owner')
+ exec 'DBSetOption dict_show_owner='.(g:omni_sql_include_owner==1?'1':'0')
+ endif
+
+ let compl_type_uc = substitute(compl_type, '\w\+', '\u&', '')
+ " Same call below, no need to do it twice
+ " if s:sql_file_{compl_type} == ""
+ " let s:sql_file_{compl_type} = DB_getDictionaryName(compl_type_uc)
+ " endif
+ let s:sql_file_{compl_type} = DB_getDictionaryName(compl_type_uc)
+ if s:sql_file_{compl_type} != ""
+ if filereadable(s:sql_file_{compl_type})
+ let compl_list = readfile(s:sql_file_{compl_type})
+ endif
+ endif
+
+ if g:loaded_dbext > 300
+ exec 'DBSetOption dict_show_owner='.saveSetting
+ endif
+ elseif compl_type =~? 'column'
+
+ " This type of completion relies upon the dbext.vim plugin
+ if s:SQLCCheck4dbext() == -1
+ return []
+ endif
+
+ if base == ""
+ " The last time we displayed a column list we stored
+ " the table name. If the user selects a column list
+ " without a table name of alias present, assume they want
+ " the previous column list displayed.
+ let base = s:save_prev_table
+ endif
+
+ let owner = ''
+ let column = ''
+
+ if base =~ '\.'
+ " Check if the owner/creator has been specified
+ let owner = matchstr( base, '^\zs.*\ze\..*\..*' )
+ let table = matchstr( base, '^\(.*\.\)\?\zs.*\ze\..*' )
+ let column = matchstr( base, '.*\.\zs.*' )
+
+ if g:omni_sql_include_owner == 1 && owner == '' && table != '' && column != ''
+ let owner = table
+ let table = column
+ let column = ''
+ endif
+
+ " It is pretty well impossible to determine if the user
+ " has entered:
+ " owner.table
+ " table.column_prefix
+ " So there are a couple of things we can do to mitigate
+ " this issue.
+ " 1. Check if the dbext plugin has the option turned
+ " on to even allow owners
+ " 2. Based on 1, if the user is showing a table list
+ " and the DrillIntoTable (using <Right>) then
+ " this will be owner.table. In this case, we can
+ " check to see the table.column exists in the
+ " cached table list. If it does, then we have
+ " determined the user has actually chosen
+ " owner.table, not table.column_prefix.
+ let found = -1
+ if g:omni_sql_include_owner == 1 && owner == ''
+ if filereadable(s:sql_file_table)
+ let tbl_list = readfile(s:sql_file_table)
+ let found = index( tbl_list, ((table != '')?(table.'.'):'').column)
+ endif
+ endif
+ " If the table.column was found in the table list, we can safely assume
+ " the owner was not provided and shift the items appropriately.
+ " OR
+ " If the user has indicated not to use table owners at all and
+ " the base ends in a '.' we know they are not providing a column
+ " name, so we can shift the items appropriately.
+ " if found != -1 || (g:omni_sql_include_owner == 0 && base !~ '\.$')
+ " let owner = table
+ " let table = column
+ " let column = ''
+ " endif
+ else
+ " If no "." was provided and the user asked for
+ " column level completion, first attempt the match
+ " on any previous column lists. If the user asked
+ " for a list of columns comma separated, continue as usual.
+ if compl_type == 'column' && s:save_prev_table != ''
+ " The last time we displayed a column list we stored
+ " the table name. If the user selects a column list
+ " without a table name of alias present, assume they want
+ " the previous column list displayed.
+ let table = s:save_prev_table
+ let list_type = ''
+
+ let compl_list = s:SQLCGetColumns(table, list_type)
+ if ! empty(compl_list)
+ " If no column prefix has been provided and the table
+ " name was provided, append it to each of the items
+ " returned.
+ let compl_list = filter(deepcopy(compl_list), 'v:val=~"^'.base.'"' )
+
+ " If not empty, we have a match on columns
+ " return the list
+ if ! empty(compl_list)
+ return compl_list
+ endif
+ endif
+ endif
+ " Since no columns were found to match the base supplied
+ " assume the user is trying to complete the column list
+ " for a table (and or an alias to a table).
+ let table = base
+ endif
+
+ " Get anything after the . and consider this the table name
+ " If an owner has been specified, then we must consider the
+ " base to be a partial column name
+ " let base = matchstr( base, '^\(.*\.\)\?\zs.*' )
+
+ if table != ""
+ let s:save_prev_table = base
+ let list_type = ''
+
+ if compl_type == 'column_csv'
+ " Return one array element, with a comma separated
+ " list of values instead of multiple array entries
+ " for each column in the table.
+ let list_type = 'csv'
+ endif
+
+ " If we are including the OWNER for the objects, then for
+ " table completion, if we have it, it should be included
+ " as there can be the same table names in a database yet
+ " with different owner names.
+ if g:omni_sql_include_owner == 1 && owner != '' && table != ''
+ let compl_list = s:SQLCGetColumns(owner.'.'.table, list_type)
+ else
+ let compl_list = s:SQLCGetColumns(table, list_type)
+ endif
+
+ if column != ''
+ " If no column prefix has been provided and the table
+ " name was provided, append it to each of the items
+ " returned.
+ let compl_list = map(compl_list, 'table.".".v:val')
+ if owner != ''
+ " If an owner has been provided append it to each of the
+ " items returned.
+ let compl_list = map(compl_list, 'owner.".".v:val')
+ endif
+ else
+ let base = ''
+ endif
+
+ if compl_type == 'column_csv'
+ " Join the column array into 1 single element array
+ " but make the columns column separated
+ let compl_list = [join(compl_list, ', ')]
+ endif
+ endif
+ elseif compl_type == 'resetCache'
+ " Reset all cached items
+ let s:tbl_name = []
+ let s:tbl_alias = []
+ let s:tbl_cols = []
+ let s:syn_list = []
+ let s:syn_value = []
+
+ if s:sql_file_table != ""
+ if g:loaded_dbext >= 2300
+ call DB_DictionaryDelete("table")
+ else
+ DBCompleteTables!
+ endif
+ endif
+ if s:sql_file_procedure != ""
+ if g:loaded_dbext >= 2300
+ call DB_DictionaryDelete("procedure")
+ else
+ DBCompleteProcedures!
+ endif
+ endif
+ if s:sql_file_view != ""
+ if g:loaded_dbext >= 2300
+ call DB_DictionaryDelete("view")
+ else
+ DBCompleteViews!
+ endif
+ endif
+
+ let s:sql_file_table = ""
+ let s:sql_file_procedure = ""
+ let s:sql_file_view = ""
+
+ let msg = "All SQL cached items have been removed."
+ call s:SQLCWarningMsg(msg)
+ " Leave time for the user to read the error message
+ :sleep 2
+ else
+ let compl_list = s:SQLCGetSyntaxList(compl_type)
+ endif
+
+ if base != ''
+ " Filter the list based on the first few characters the user entered.
+ " Check if the text matches at the beginning
+ " \\(^.base.'\\)
+ " or
+ " Match to a owner.table or alias.column type match
+ " ^\\(\\w\\+\\.\\)\\?'.base.'\\)
+ " or
+ " Handle names with spaces "my table name"
+ " "\\(^'.base.'\\|^\\(\\w\\+\\.\\)\\?'.base.'\\)"'
+ "
+ let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|^\\(\\w\\+\\.\\)\\?'.base.'\\)"'
+ " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\)"'
+ " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|\\(\\.\\)\\?'.base.'\\)"'
+ " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|\\([^.]*\\)\\?'.base.'\\)"'
+ let compl_list = filter(deepcopy(compl_list), expr)
+
+ if empty(compl_list) && compl_type == 'table' && base =~ '\.$'
+ " It is possible we could be looking for column name completion
+ " and the user simply hit C-X C-O to lets try it as well
+ " since we had no hits with the tables.
+ " If the base ends with a . it is hard to know if we are
+ " completing table names or column names.
+ let list_type = ''
+
+ let compl_list = s:SQLCGetColumns(base, list_type)
+ endif
+ endif
+
+ if exists('b:sql_compl_savefunc') && b:sql_compl_savefunc != ""
+ let &omnifunc = b:sql_compl_savefunc
+ endif
+
+ if empty(compl_list)
+ call s:SQLCWarningMsg( 'Could not find type['.compl_type.'] using prepend[.'.s:prepended.'] base['.a:base.']' )
+ endif
+
+ return compl_list
+endfunc
+
+function! sqlcomplete#PreCacheSyntax(...)
+ let syn_group_arr = []
+ let syn_items = []
+
+ if a:0 > 0
+ if type(a:1) != 3
+ call s:SQLCWarningMsg("Parameter is not a list. Example:['syntaxGroup1', 'syntaxGroup2']")
+ return ''
+ endif
+ let syn_group_arr = a:1
+ else
+ let syn_group_arr = g:omni_sql_precache_syntax_groups
+ endif
+ " For each group specified in the list, precache all
+ " the syntax items.
+ if !empty(syn_group_arr)
+ for group_name in syn_group_arr
+ let syn_items = extend( syn_items, s:SQLCGetSyntaxList(group_name) )
+ endfor
+ endif
+
+ return syn_items
+endfunction
+
+function! sqlcomplete#ResetCacheSyntax(...)
+ let syn_group_arr = []
+
+ if a:0 > 0
+ if type(a:1) != 3
+ call s:SQLCWarningMsg("Parameter is not a list. Example:['syntaxGroup1', 'syntaxGroup2']")
+ return ''
+ endif
+ let syn_group_arr = a:1
+ else
+ let syn_group_arr = g:omni_sql_precache_syntax_groups
+ endif
+ " For each group specified in the list, precache all
+ " the syntax items.
+ if !empty(syn_group_arr)
+ for group_name in syn_group_arr
+ let list_idx = index(s:syn_list, group_name, 0, &ignorecase)
+ if list_idx > -1
+ " Remove from list of groups
+ call remove( s:syn_list, list_idx )
+ " Remove from list of keywords
+ call remove( s:syn_value, list_idx )
+ endif
+ endfor
+ endif
+endfunction
+
+function! sqlcomplete#Map(type)
+ " Tell the SQL plugin what you want to complete
+ let b:sql_compl_type=a:type
+ " Record previous omnifunc, if the SQL completion
+ " is being used in conjunction with other filetype
+ " completion plugins
+ if &omnifunc != "" && &omnifunc != 'sqlcomplete#Complete'
+ " Record the previous omnifunc, the plugin
+ " will automatically set this back so that it
+ " does not interfere with other ftplugins settings
+ let b:sql_compl_savefunc=&omnifunc
+ endif
+ " Set the OMNI func for the SQL completion plugin
+ let &omnifunc='sqlcomplete#Complete'
+endfunction
+
+function! sqlcomplete#DrillIntoTable()
+ " If the omni popup window is visible
+ if pumvisible()
+ call sqlcomplete#Map('column')
+ " C-Y, makes the currently highlighted entry active
+ " and trigger the omni popup to be redisplayed
+ call feedkeys("\<C-Y>\<C-X>\<C-O>", 'n')
+ else
+ " If the popup is not visible, simple perform the normal
+ " key behaviour.
+ " Must use exec since the key must be preceded by "\"
+ " or feedkeys will simply push each character of the string
+ " rather than the "key press".
+ exec 'call feedkeys("\'.g:ftplugin_sql_omni_key_right.'", "n")'
+ endif
+ return ""
+endfunction
+
+function! sqlcomplete#DrillOutOfColumns()
+ " If the omni popup window is visible
+ if pumvisible()
+ call sqlcomplete#Map('tableReset')
+ " Trigger the omni popup to be redisplayed
+ call feedkeys("\<C-X>\<C-O>")
+ else
+ " If the popup is not visible, simple perform the normal
+ " key behaviour.
+ " Must use exec since the key must be preceded by "\"
+ " or feedkeys will simply push each character of the string
+ " rather than the "key press".
+ exec 'call feedkeys("\'.g:ftplugin_sql_omni_key_left.'", "n")'
+ endif
+ return ""
+endfunction
+
+function! s:SQLCWarningMsg(msg)
+ echohl WarningMsg
+ echomsg 'SQLComplete:'.a:msg
+ echohl None
+endfunction
+
+function! s:SQLCErrorMsg(msg)
+ echohl ErrorMsg
+ echomsg 'SQLComplete:'.a:msg
+ echohl None
+endfunction
+
+function! s:SQLCGetSyntaxList(syn_group)
+ let syn_group = a:syn_group
+ let compl_list = []
+
+ " Check if we have already cached the syntax list
+ let list_idx = index(s:syn_list, syn_group, 0, &ignorecase)
+ if list_idx > -1
+ " Return previously cached value
+ let compl_list = s:syn_value[list_idx]
+ else
+ let s:save_inc = g:omni_syntax_group_include_sql
+ let s:save_exc = g:omni_syntax_group_exclude_sql
+ let g:omni_syntax_group_include_sql = ''
+ let g:omni_syntax_group_exclude_sql = ''
+
+ " Request the syntax list items from the
+ " syntax completion plugin
+ if syn_group == 'syntax'
+ " Handle this special case. This allows the user
+ " to indicate they want all the syntax items available,
+ " so do not specify a specific include list.
+ let syn_value = syntaxcomplete#OmniSyntaxList()
+ else
+ " The user has specified a specific syntax group
+ let g:omni_syntax_group_include_sql = syn_group
+ let syn_value = syntaxcomplete#OmniSyntaxList(syn_group)
+ endif
+ let g:omni_syntax_group_include_sql = s:save_inc
+ let g:omni_syntax_group_exclude_sql = s:save_exc
+ " Cache these values for later use
+ let s:syn_list = add( s:syn_list, syn_group )
+ let s:syn_value = add( s:syn_value, syn_value )
+ let compl_list = syn_value
+ endif
+
+ return compl_list
+endfunction
+
+function! s:SQLCCheck4dbext()
+ if !exists('g:loaded_dbext')
+ let msg = "The dbext plugin must be loaded for dynamic SQL completion"
+ call s:SQLCErrorMsg(msg)
+ " Leave time for the user to read the error message
+ :sleep 2
+ return -1
+ elseif g:loaded_dbext < 600
+ let msg = "The dbext plugin must be at least version 5.30 " .
+ \ " for dynamic SQL completion"
+ call s:SQLCErrorMsg(msg)
+ " Leave time for the user to read the error message
+ :sleep 2
+ return -1
+ endif
+ return 1
+endfunction
+
+function! s:SQLCAddAlias(table_name, table_alias, cols)
+ " Strip off the owner if included
+ let table_name = matchstr(a:table_name, '\%(.\{-}\.\)\?\zs\(.*\)' )
+ let table_alias = a:table_alias
+ let cols = a:cols
+
+ if g:omni_sql_use_tbl_alias != 'n'
+ if table_alias == ''
+ if 'da' =~? g:omni_sql_use_tbl_alias
+ if table_name =~ '_'
+ " Treat _ as separators since people often use these
+ " for word separators
+ let save_keyword = &iskeyword
+ setlocal iskeyword-=_
+
+ " Get the first letter of each word
+ " [[:alpha:]] is used instead of \w
+ " to catch extended accented characters
+ "
+ let table_alias = substitute(
+ \ table_name,
+ \ '\<[[:alpha:]]\+\>_\?',
+ \ '\=strpart(submatch(0), 0, 1)',
+ \ 'g'
+ \ )
+ " Restore original value
+ let &iskeyword = save_keyword
+ elseif table_name =~ '\u\U'
+ let table_alias = substitute(
+ \ table_name, '\(\u\)\U*', '\1', 'g')
+ else
+ let table_alias = strpart(table_name, 0, 1)
+ endif
+ endif
+ endif
+ if table_alias != ''
+ " Following a word character, make sure there is a . and no spaces
+ let table_alias = substitute(table_alias, '\w\zs\.\?\s*$', '.', '')
+ if 'a' =~? g:omni_sql_use_tbl_alias && a:table_alias == ''
+ let table_alias = inputdialog("Enter table alias:", table_alias)
+ endif
+ endif
+ if table_alias != ''
+ let cols = substitute(cols, '\<\w', table_alias.'&', 'g')
+ endif
+ endif
+
+ return cols
+endfunction
+
+function! s:SQLCGetObjectOwner(object)
+ " The owner regex matches a word at the start of the string which is
+ " followed by a dot, but doesn't include the dot in the result.
+ " ^ - from beginning of line
+ " \("\|\[\)\? - ignore any quotes
+ " \zs - start the match now
+ " .\{-} - get owner name
+ " \ze - end the match
+ " \("\|\[\)\? - ignore any quotes
+ " \. - must by followed by a .
+ " let owner = matchstr( a:object, '^\s*\zs.*\ze\.' )
+ let owner = matchstr( a:object, '^\("\|\[\)\?\zs\.\{-}\ze\("\|\]\)\?\.' )
+ return owner
+endfunction
+
+function! s:SQLCGetColumns(table_name, list_type)
+ if a:table_name =~ '\.'
+ " Check if the owner/creator has been specified
+ let owner = matchstr( a:table_name, '^\zs.*\ze\..*\..*' )
+ let table = matchstr( a:table_name, '^\(.*\.\)\?\zs.*\ze\..*' )
+ let column = matchstr( a:table_name, '.*\.\zs.*' )
+
+ if g:omni_sql_include_owner == 1 && owner == '' && table != '' && column != ''
+ let owner = table
+ let table = column
+ let column = ''
+ endif
+ else
+ let owner = ''
+ let table = matchstr(a:table_name, '^["\[\]a-zA-Z0-9_ ]\+\ze\.\?')
+ let column = ''
+ endif
+
+ " Check if the table name was provided as part of the column name
+ " let table_name = matchstr(a:table_name, '^["\[\]a-zA-Z0-9_ ]\+\ze\.\?')
+ let table_name = table
+ let table_cols = []
+ let table_alias = ''
+ let move_to_top = 1
+
+ let table_name = substitute(table_name, '\s*\(.\{-}\)\s*$', '\1', 'g')
+
+ " If the table name was given as:
+ " where c.
+ let table_name = substitute(table_name, '^\c\(WHERE\|AND\|OR\)\s\+', '', '')
+ if g:loaded_dbext >= 300
+ let saveSettingAlias = DB_listOption('use_tbl_alias')
+ exec 'DBSetOption use_tbl_alias=n'
+ endif
+
+ let table_name_stripped = substitute(table_name, '["\[\]]*', '', 'g')
+
+ " Check if we have already cached the column list for this table
+ " by its name
+ let list_idx = index(s:tbl_name, table_name_stripped, 0, &ignorecase)
+ if list_idx > -1
+ let table_cols = split(s:tbl_cols[list_idx], '\n')
+ else
+ " Check if we have already cached the column list for this table
+ " by its alias, assuming the table_name provided was actually
+ " the alias for the table instead
+ " select *
+ " from area a
+ " where a.
+ let list_idx = index(s:tbl_alias, table_name_stripped, 0, &ignorecase)
+ if list_idx > -1
+ let table_alias = table_name_stripped
+ let table_name = s:tbl_name[list_idx]
+ let table_cols = split(s:tbl_cols[list_idx], '\n')
+ endif
+ endif
+
+ " If we have not found a cached copy of the table
+ " And the table ends in a "." or we are looking for a column list
+ " if list_idx == -1 && (a:table_name =~ '\.' || b:sql_compl_type =~ 'column')
+ " if list_idx == -1 && (a:table_name =~ '\.' || a:list_type =~ 'csv')
+ if list_idx == -1
+ let saveY = @y
+ let saveSearch = @/
+ let saveWScan = &wrapscan
+ let curline = line(".")
+ let curcol = col(".")
+
+ " Do not let searches wrap
+ setlocal nowrapscan
+ " If . was entered, look at the word just before the .
+ " We are looking for something like this:
+ " select *
+ " from customer c
+ " where c.
+ " So when . is pressed, we need to find 'c'
+ "
+
+ " Search backwards to the beginning of the statement
+ " and do NOT wrap
+ " exec 'silent! normal! v?\<\(select\|update\|delete\|;\)\>'."\n".'"yy'
+ exec 'silent! normal! ?\<\c\(select\|update\|delete\|;\)\>'."\n"
+
+ " Start characterwise visual mode
+ " Advance right one character
+ " Search forward until one of the following:
+ " 1. Another select/update/delete statement
+ " 2. A ; at the end of a line (the delimiter)
+ " 3. The end of the file (in case no delimiter)
+ " Yank the visually selected text into the "y register.
+ exec 'silent! normal! vl/\c\(\<select\>\|\<update\>\|\<delete\>\|;\s*$\|\%$\)'."\n".'"yy'
+
+ let query = @y
+ let query = substitute(query, "\n", ' ', 'g')
+ let found = 0
+
+ " if query =~? '^\c\(select\)'
+ if query =~? '^\(select\|update\|delete\)'
+ let found = 1
+ " \(\(\<\w\+\>\)\.\)\? -
+ " '\c\(from\|join\|,\).\{-}' - Starting at the from clause (case insensitive)
+ " '\zs\(\(\<\w\+\>\)\.\)\?' - Get the owner name (optional)
+ " '\<\w\+\>\ze' - Get the table name
+ " '\s\+\<'.table_name.'\>' - Followed by the alias
+ " '\s*\.\@!.*' - Cannot be followed by a .
+ " '\(\<where\>\|$\)' - Must be followed by a WHERE clause
+ " '.*' - Exclude the rest of the line in the match
+ " let table_name_new = matchstr(@y,
+ " \ '\c\(from\|join\|,\).\{-}'.
+ " \ '\zs\(\("\|\[\)\?.\{-}\("\|\]\)\.\)\?'.
+ " \ '\("\|\[\)\?.\{-}\("\|\]\)\?\ze'.
+ " \ '\s\+\%(as\s\+\)\?\<'.
+ " \ matchstr(table_name, '.\{-}\ze\.\?$').
+ " \ '\>'.
+ " \ '\s*\.\@!.*'.
+ " \ '\(\<where\>\|$\)'.
+ " \ '.*'
+ " \ )
+ "
+ "
+ " ''\c\(\<from\>\|\<join\>\|,\)\s*' - Starting at the from clause (case insensitive)
+ " '\zs\(\("\|\[\)\?\w\+\("\|\]\)\?\.\)\?' - Get the owner name (optional)
+ " '\("\|\[\)\?\w\+\("\|\]\)\?\ze' - Get the table name
+ " '\s\+\%(as\s\+\)\?\<'.matchstr(table_name, '.\{-}\ze\.\?$').'\>' - Followed by the alias
+ " '\s*\.\@!.*' - Cannot be followed by a .
+ " '\(\<where\>\|$\)' - Must be followed by a WHERE clause
+ " '.*' - Exclude the rest of the line in the match
+ let table_name_new = matchstr(@y,
+ \ '\c\(\<from\>\|\<join\>\|,\)\s*'.
+ \ '\zs\(\("\|\[\)\?\w\+\("\|\]\)\?\.\)\?'.
+ \ '\("\|\[\)\?\w\+\("\|\]\)\?\ze'.
+ \ '\s\+\%(as\s\+\)\?\<'.
+ \ matchstr(table_name, '.\{-}\ze\.\?$').
+ \ '\>'.
+ \ '\s*\.\@!.*'.
+ \ '\(\<where\>\|$\)'.
+ \ '.*'
+ \ )
+
+ if table_name_new != ''
+ let table_alias = table_name
+ if g:omni_sql_include_owner == 1
+ let table_name = matchstr( table_name_new, '^\zs\(.\{-}\.\)\?\(.\{-}\.\)\?.*\ze' )
+ else
+ " let table_name = matchstr( table_name_new, '^\(.*\.\)\?\zs.*\ze' )
+ let table_name = matchstr( table_name_new, '^\(.\{-}\.\)\?\zs\(.\{-}\.\)\?.*\ze' )
+ endif
+
+ let list_idx = index(s:tbl_name, table_name, 0, &ignorecase)
+ if list_idx > -1
+ let table_cols = split(s:tbl_cols[list_idx])
+ let s:tbl_name[list_idx] = table_name
+ let s:tbl_alias[list_idx] = table_alias
+ else
+ let list_idx = index(s:tbl_alias, table_name, 0, &ignorecase)
+ if list_idx > -1
+ let table_cols = split(s:tbl_cols[list_idx])
+ let s:tbl_name[list_idx] = table_name
+ let s:tbl_alias[list_idx] = table_alias
+ endif
+ endif
+
+ endif
+ else
+ " Simply assume it is a table name provided with a . on the end
+ let found = 1
+ endif
+
+ let @y = saveY
+ let @/ = saveSearch
+ let &wrapscan = saveWScan
+
+ " Return to previous location
+ call cursor(curline, curcol)
+
+ if found == 0
+ if g:loaded_dbext > 300
+ exec 'DBSetOption use_tbl_alias='.saveSettingAlias
+ endif
+
+ " Not a SQL statement, do not display a list
+ return []
+ endif
+ endif
+
+ if empty(table_cols)
+ " Specify silent mode, no messages to the user (tbl, 1)
+ " Specify do not comma separate (tbl, 1, 1)
+ " let table_cols_str = DB_getListColumn(table_name, 1, 1)
+ let table_cols_str = DB_getListColumn((owner!=''?owner.'.':'').table_name, 1, 1)
+
+ if table_cols_str != ""
+ let s:tbl_name = add( s:tbl_name, table_name )
+ let s:tbl_alias = add( s:tbl_alias, table_alias )
+ let s:tbl_cols = add( s:tbl_cols, table_cols_str )
+ let table_cols = split(table_cols_str, '\n')
+ endif
+
+ endif
+
+ if g:loaded_dbext > 300
+ exec 'DBSetOption use_tbl_alias='.saveSettingAlias
+ endif
+
+ " If the user has asked for a comma separate list of column
+ " values, ask the user if they want to prepend each column
+ " with a tablename alias.
+ if a:list_type == 'csv' && !empty(table_cols)
+ let cols = join(table_cols, ', ')
+ let cols = s:SQLCAddAlias(table_name, table_alias, cols)
+ let table_cols = [cols]
+ endif
+
+ return table_cols
+endfunction
+" Restore:
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim: ts=4 fdm=marker
diff --git a/runtime/autoload/syntaxcomplete.vim b/runtime/autoload/syntaxcomplete.vim
new file mode 100644
index 0000000..396193d
--- /dev/null
+++ b/runtime/autoload/syntaxcomplete.vim
@@ -0,0 +1,810 @@
+" Vim completion script
+" Language: All languages, uses existing syntax highlighting rules
+" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
+" Version: 15.0
+" Last Change: 2021 Apr 27
+" Usage: For detailed help, ":help ft-syntax-omni"
+
+" History
+"
+" Version 15.0
+" - SyntaxComplete ignored all buffer specific overrides, always used global
+" https://github.com/vim/vim/issues/8153
+"
+" Version 14.0
+" - Fixed issue with single quotes and is_keyword
+" https://github.com/vim/vim/issues/7463
+"
+" Version 13.0
+" - Extended the option omni_syntax_group_include_{filetype}
+" to accept a comma separated list of regex's rather than
+" string. For example, for the javascript filetype you could
+" use:
+" let g:omni_syntax_group_include_javascript = 'javascript\w\+,jquery\w\+'
+" - Some syntax files (perl.vim) use the match // syntax as a mechanism
+" to identify keywords. This update attempts to parse the
+" match syntax and pull out syntax items which are at least
+" 3 words or more.
+"
+" Version 12.0
+" - It is possible to have '-' as part of iskeyword, when
+" checking for character ranges, tighten up the regex.
+" E688: More targets than List items.
+"
+" Version 11.0
+" - Corrected which characters required escaping during
+" substitution calls.
+"
+" Version 10.0
+" - Cycle through all the character ranges specified in the
+" iskeyword option and build a list of valid word separators.
+" Prior to this change, only actual characters were used,
+" where for example ASCII "45" == "-". If "45" were used
+" in iskeyword the hyphen would not be picked up.
+" This introduces a new option, since the character ranges
+" specified could be multibyte:
+" let g:omni_syntax_use_single_byte = 1
+" - This by default will only allow single byte ASCII
+" characters to be added and an additional check to ensure
+" the character is printable (see documentation for isprint).
+"
+" Version 9.0
+" - Add the check for cpo.
+"
+" Version 8.0
+" - Updated SyntaxCSyntaxGroupItems()
+" - Some additional syntax items were also allowed
+" on nextgroup= lines which were ignored by default.
+" Now these lines are processed independently.
+"
+" Version 7.0
+" - Updated syntaxcomplete#OmniSyntaxList()
+" - Looking up the syntax groups defined from a syntax file
+" looked for only 1 format of {filetype}GroupName, but some
+" syntax writers use this format as well:
+" {b:current_syntax}GroupName
+" - OmniSyntaxList() will now check for both if the first
+" method does not find a match.
+"
+" Version 6.0
+" - Added syntaxcomplete#OmniSyntaxList()
+" - Allows other plugins to use this for their own
+" purposes.
+" - It will return a List of all syntax items for the
+" syntax group name passed in.
+" - XPTemplate for SQL will use this function via the
+" sqlcomplete plugin to populate a Choose box.
+"
+" Version 5.0
+" - Updated SyntaxCSyntaxGroupItems()
+" - When processing a list of syntax groups, the final group
+" was missed in function SyntaxCSyntaxGroupItems.
+"
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+" This check is in place in case this script is
+" sourced directly instead of using the autoload feature.
+if exists('+omnifunc')
+ " Do not set the option if already set since this
+ " results in an E117 warning.
+ if &omnifunc == ""
+ setlocal omnifunc=syntaxcomplete#Complete
+ endif
+endif
+
+if exists('g:loaded_syntax_completion')
+ finish
+endif
+let g:loaded_syntax_completion = 150
+
+" Turn on support for line continuations when creating the script
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Set ignorecase to the ftplugin standard
+" This is the default setting, but if you define a buffer local
+" variable you can override this on a per filetype.
+if !exists('g:omni_syntax_ignorecase')
+ let g:omni_syntax_ignorecase = &ignorecase
+endif
+
+" Indicates whether we should use the iskeyword option to determine
+" how to split words.
+" This is the default setting, but if you define a buffer local
+" variable you can override this on a per filetype.
+if !exists('g:omni_syntax_use_iskeyword')
+ let g:omni_syntax_use_iskeyword = 1
+endif
+
+" When using iskeyword, this setting controls whether the characters
+" should be limited to single byte characters.
+if !exists('g:omni_syntax_use_single_byte')
+ let g:omni_syntax_use_single_byte = 1
+endif
+
+" When using iskeyword, this setting controls whether the characters
+" should be limited to single byte characters.
+if !exists('g:omni_syntax_use_iskeyword_numeric')
+ let g:omni_syntax_use_iskeyword_numeric = 1
+endif
+
+" Only display items in the completion window that are at least
+" this many characters in length.
+" This is the default setting, but if you define a buffer local
+" variable you can override this on a per filetype.
+if !exists('g:omni_syntax_minimum_length')
+ let g:omni_syntax_minimum_length = 0
+endif
+
+" This script will build a completion list based on the syntax
+" elements defined by the files in $VIMRUNTIME/syntax.
+" let s:syn_remove_words = 'match,matchgroup=,contains,'.
+let s:syn_remove_words = 'matchgroup=,contains,'.
+ \ 'links to,start=,end='
+ " \ 'links to,start=,end=,nextgroup='
+
+let s:cache_name = []
+let s:cache_list = []
+let s:prepended = ''
+
+" This function is used for the 'omnifunc' option.
+function! syntaxcomplete#Complete(findstart, base)
+
+ " Allow user to override ignorecase per buffer
+ let l:omni_syntax_ignorecase = g:omni_syntax_ignorecase
+ if exists('b:omni_syntax_ignorecase')
+ let l:omni_syntax_ignorecase = b:omni_syntax_ignorecase
+ endif
+
+ if a:findstart
+ " Locate the start of the item, including "."
+ let line = getline('.')
+ let start = col('.') - 1
+ let lastword = -1
+ while start > 0
+ " if line[start - 1] =~ '\S'
+ " let start -= 1
+ " elseif line[start - 1] =~ '\.'
+ if line[start - 1] =~ '\k'
+ let start -= 1
+ let lastword = a:findstart
+ else
+ break
+ endif
+ endwhile
+
+ " Return the column of the last word, which is going to be changed.
+ " Remember the text that comes before it in s:prepended.
+ if lastword == -1
+ let s:prepended = ''
+ return start
+ endif
+ let s:prepended = strpart(line, start, (col('.') - 1) - start)
+ return start
+ endif
+
+ " let base = s:prepended . a:base
+ let base = substitute(s:prepended, "'", "''", 'g')
+
+ let filetype = substitute(&filetype, '\.', '_', 'g')
+ let list_idx = index(s:cache_name, filetype, 0, &ignorecase)
+ if list_idx > -1
+ let compl_list = s:cache_list[list_idx]
+ else
+ let compl_list = OmniSyntaxList()
+ let s:cache_name = add( s:cache_name, filetype )
+ let s:cache_list = add( s:cache_list, compl_list )
+ endif
+
+ " Return list of matches.
+
+ if base != ''
+ " let compstr = join(compl_list, ' ')
+ " let expr = (l:omni_syntax_ignorecase==0?'\C':'').'\<\%('.base.'\)\@!\w\+\s*'
+ " let compstr = substitute(compstr, expr, '', 'g')
+ " let compl_list = split(compstr, '\s\+')
+
+ " Filter the list based on the first few characters the user
+ " entered
+ let expr = 'v:val '.(l:omni_syntax_ignorecase==1?'=~?':'=~#')." '^".escape(base, '\\/.*$^~[]').".*'"
+ let compl_list = filter(deepcopy(compl_list), expr)
+ endif
+
+ return compl_list
+endfunc
+
+function! syntaxcomplete#OmniSyntaxList(...)
+ if a:0 > 0
+ let parms = []
+ if 3 == type(a:1)
+ let parms = a:1
+ elseif 1 == type(a:1)
+ let parms = split(a:1, ',')
+ endif
+ return OmniSyntaxList( parms )
+ else
+ return OmniSyntaxList()
+ endif
+endfunc
+
+function! syntaxcomplete#OmniSyntaxClearCache()
+ let s:cache_name = []
+ let s:cache_list = []
+endfunction
+
+" To retrieve all syntax items regardless of syntax group:
+" echo OmniSyntaxList( [] )
+"
+" To retrieve only the syntax items for the sqlOperator syntax group:
+" echo OmniSyntaxList( ['sqlOperator'] )
+"
+" To retrieve all syntax items for both the sqlOperator and sqlType groups:
+" echo OmniSyntaxList( ['sqlOperator', 'sqlType'] )
+"
+" A regular expression can also be used:
+" echo OmniSyntaxList( ['sql\w\+'] )
+"
+" From within a plugin, you would typically assign the output to a List: >
+" let myKeywords = []
+" let myKeywords = OmniSyntaxList( ['sqlKeyword'] )
+function! OmniSyntaxList(...)
+ let list_parms = []
+ if a:0 > 0
+ if 3 == type(a:1)
+ let list_parms = a:1
+ elseif 1 == type(a:1)
+ let list_parms = split(a:1, ',')
+ endif
+ endif
+
+ " Default to returning a dictionary, if use_dictionary is set to 0
+ " a list will be returned.
+ " let use_dictionary = 1
+ " if a:0 > 0 && a:1 != ''
+ " let use_dictionary = a:1
+ " endif
+
+ let saveL = @l
+ let filetype = substitute(&filetype, '\.', '_', 'g')
+
+ if empty(list_parms)
+ " Allow user to override per buffer
+ if exists('g:omni_syntax_group_include_'.filetype)
+ let l:omni_syntax_group_include_{filetype} = g:omni_syntax_group_include_{filetype}
+ endif
+ if exists('b:omni_syntax_group_include_'.filetype)
+ let l:omni_syntax_group_include_{filetype} = b:omni_syntax_group_include_{filetype}
+ endif
+
+ " Default the include group to include the requested syntax group
+ let syntax_group_include_{filetype} = ''
+ " Check if there are any overrides specified for this filetype
+ if exists('l:omni_syntax_group_include_'.filetype)
+ let syntax_group_include_{filetype} =
+ \ substitute( l:omni_syntax_group_include_{filetype},'\s\+','','g')
+ let list_parms = split(l:omni_syntax_group_include_{filetype}, ',')
+ if syntax_group_include_{filetype} =~ '\w'
+ let syntax_group_include_{filetype} =
+ \ substitute( syntax_group_include_{filetype},
+ \ '\s*,\s*', '\\|', 'g'
+ \ )
+ endif
+ endif
+ else
+ " A specific list was provided, use it
+ endif
+
+ " Loop through all the syntax groupnames, and build a
+ " syntax file which contains these names. This can
+ " work generically for any filetype that does not already
+ " have a plugin defined.
+ " This ASSUMES the syntax groupname BEGINS with the name
+ " of the filetype. From my casual viewing of the vim7\syntax
+ " directory this is true for almost all syntax definitions.
+ " As an example, the SQL syntax groups have this pattern:
+ " sqlType
+ " sqlOperators
+ " sqlKeyword ...
+ if !empty(list_parms) && empty(substitute(join(list_parms), '[a-zA-Z ]', '', 'g'))
+ " If list_parms only includes word characters, use it to limit
+ " the syntax elements.
+ " If using regex syntax list will fail to find those items, so
+ " simply grab the who syntax list.
+ redir @l
+ silent! exec 'syntax list '.join(list_parms)
+ redir END
+ else
+ redir @l
+ silent! exec 'syntax list'
+ redir END
+ endif
+
+ let syntax_full = "\n".@l
+ let @l = saveL
+
+ if syntax_full =~ 'E28'
+ \ || syntax_full =~ 'E411'
+ \ || syntax_full =~ 'E415'
+ \ || syntax_full =~ 'No Syntax items'
+ return []
+ endif
+
+ let filetype = substitute(&filetype, '\.', '_', 'g')
+
+ let list_exclude_groups = []
+ if a:0 > 0
+ " Do nothing since we have specific a specific list of groups
+ else
+ " Default the exclude group to nothing
+ let syntax_group_exclude_{filetype} = ''
+
+ " Allow user to override per buffer
+ if exists('g:omni_syntax_group_exclude_'.filetype)
+ let l:omni_syntax_group_exclude_{filetype} = g:omni_syntax_group_exclude_{filetype}
+ endif
+ if exists('b:omni_syntax_group_exclude_'.filetype)
+ let l:omni_syntax_group_exclude_{filetype} = b:omni_syntax_group_exclude_{filetype}
+ endif
+
+ " Check if there are any overrides specified for this filetype
+ if exists('l:omni_syntax_group_exclude_'.filetype)
+ let syntax_group_exclude_{filetype} =
+ \ substitute( l:omni_syntax_group_exclude_{filetype},'\s\+','','g')
+ let list_exclude_groups = split(l:omni_syntax_group_exclude_{filetype}, ',')
+ if syntax_group_exclude_{filetype} =~ '\w'
+ let syntax_group_exclude_{filetype} =
+ \ substitute( syntax_group_exclude_{filetype},
+ \ '\s*,\s*', '\\|', 'g'
+ \ )
+ endif
+ endif
+ endif
+
+ if empty(list_parms)
+ let list_parms = [&filetype.'\w\+']
+ endif
+
+ let syn_list = ''
+ let index = 0
+ for group_regex in list_parms
+ " Sometimes filetypes can be composite names, like c.doxygen
+ " Loop through each individual part looking for the syntax
+ " items specific to each individual filetype.
+ " let ftindex = 0
+ " let ftindex = match(syntax_full, group_regex, ftindex)
+
+ " while ftindex > -1
+ " let ft_part_name = matchstr( syntax_full, '\w\+', ftindex )
+
+ " Syntax rules can contain items for more than just the current
+ " filetype. They can contain additional items added by the user
+ " via autocmds or their vimrc.
+ " Some syntax files can be combined (html, php, jsp).
+ " We want only items that begin with the filetype we are interested in.
+ let next_group_regex = '\n' .
+ \ '\zs'.group_regex.'\ze'.
+ \ '\s\+xxx\s\+'
+ let index = match(syntax_full, next_group_regex, index)
+
+ " For the matched group name, strip off any of the regex special
+ " characters and see if we get a match with the current syntax
+ if index == -1 && exists('b:current_syntax') && substitute(group_regex, '[^a-zA-Z ]\+.*', '', 'g') !~ '^'.b:current_syntax
+ " There appears to be two standards when writing syntax files.
+ " Either items begin as:
+ " syn keyword {filetype}Keyword values ...
+ " let b:current_syntax = "sql"
+ " let b:current_syntax = "sqlanywhere"
+ " Or
+ " syn keyword {syntax_filename}Keyword values ...
+ " let b:current_syntax = "mysql"
+ " So, we will make the format of finding the syntax group names
+ " a bit more flexible and look for both if the first fails to
+ " find a match.
+ let next_group_regex = '\n' .
+ \ '\zs'.b:current_syntax.'\w\+\ze'.
+ \ '\s\+xxx\s\+'
+ let index = 0
+ let index = match(syntax_full, next_group_regex, index)
+ endif
+
+ while index > -1
+ let group_name = matchstr( syntax_full, '\w\+', index )
+
+ let get_syn_list = 1
+ for exclude_group_name in list_exclude_groups
+ if '\<'.exclude_group_name.'\>' =~ '\<'.group_name.'\>'
+ let get_syn_list = 0
+ endif
+ endfor
+
+ " This code is no longer needed in version 6.0 since we have
+ " augmented the syntax list command to only retrieve the syntax
+ " groups we are interested in.
+ "
+ " if get_syn_list == 1
+ " if syntax_group_include_{filetype} != ''
+ " if '\<'.syntax_group_include_{filetype}.'\>' !~ '\<'.group_name.'\>'
+ " let get_syn_list = 0
+ " endif
+ " endif
+ " endif
+
+ if get_syn_list == 1
+ " Pass in the full syntax listing, plus the group name we
+ " are interested in.
+ let extra_syn_list = s:SyntaxCSyntaxGroupItems(group_name, syntax_full)
+ let syn_list = syn_list . extra_syn_list . "\n"
+ endif
+
+ let index = index + strlen(group_name)
+ let index = match(syntax_full, next_group_regex, index)
+ endwhile
+
+ " let ftindex = ftindex + len(ft_part_name)
+ " let ftindex = match( syntax_full, group_regex, ftindex )
+ " endwhile
+ endfor
+
+" " Sometimes filetypes can be composite names, like c.doxygen
+" " Loop through each individual part looking for the syntax
+" " items specific to each individual filetype.
+" let syn_list = ''
+" let ftindex = 0
+" let ftindex = match(&filetype, '\w\+', ftindex)
+
+" while ftindex > -1
+" let ft_part_name = matchstr( &filetype, '\w\+', ftindex )
+
+" " Syntax rules can contain items for more than just the current
+" " filetype. They can contain additional items added by the user
+" " via autocmds or their vimrc.
+" " Some syntax files can be combined (html, php, jsp).
+" " We want only items that begin with the filetype we are interested in.
+" let next_group_regex = '\n' .
+" \ '\zs'.ft_part_name.'\w\+\ze'.
+" \ '\s\+xxx\s\+'
+" let index = 0
+" let index = match(syntax_full, next_group_regex, index)
+
+" if index == -1 && exists('b:current_syntax') && ft_part_name != b:current_syntax
+" " There appears to be two standards when writing syntax files.
+" " Either items begin as:
+" " syn keyword {filetype}Keyword values ...
+" " let b:current_syntax = "sql"
+" " let b:current_syntax = "sqlanywhere"
+" " Or
+" " syn keyword {syntax_filename}Keyword values ...
+" " let b:current_syntax = "mysql"
+" " So, we will make the format of finding the syntax group names
+" " a bit more flexible and look for both if the first fails to
+" " find a match.
+" let next_group_regex = '\n' .
+" \ '\zs'.b:current_syntax.'\w\+\ze'.
+" \ '\s\+xxx\s\+'
+" let index = 0
+" let index = match(syntax_full, next_group_regex, index)
+" endif
+
+" while index > -1
+" let group_name = matchstr( syntax_full, '\w\+', index )
+
+" let get_syn_list = 1
+" for exclude_group_name in list_exclude_groups
+" if '\<'.exclude_group_name.'\>' =~ '\<'.group_name.'\>'
+" let get_syn_list = 0
+" endif
+" endfor
+
+" " This code is no longer needed in version 6.0 since we have
+" " augmented the syntax list command to only retrieve the syntax
+" " groups we are interested in.
+" "
+" " if get_syn_list == 1
+" " if syntax_group_include_{filetype} != ''
+" " if '\<'.syntax_group_include_{filetype}.'\>' !~ '\<'.group_name.'\>'
+" " let get_syn_list = 0
+" " endif
+" " endif
+" " endif
+
+" if get_syn_list == 1
+" " Pass in the full syntax listing, plus the group name we
+" " are interested in.
+" let extra_syn_list = s:SyntaxCSyntaxGroupItems(group_name, syntax_full)
+" let syn_list = syn_list . extra_syn_list . "\n"
+" endif
+
+" let index = index + strlen(group_name)
+" let index = match(syntax_full, next_group_regex, index)
+" endwhile
+
+" let ftindex = ftindex + len(ft_part_name)
+" let ftindex = match( &filetype, '\w\+', ftindex )
+" endwhile
+
+ " Convert the string to a List and sort it.
+ let compl_list = sort(split(syn_list))
+
+ if &filetype == 'vim'
+ let short_compl_list = []
+ for i in range(len(compl_list))
+ if i == len(compl_list)-1
+ let next = i
+ else
+ let next = i + 1
+ endif
+ if compl_list[next] !~ '^'.compl_list[i].'.$'
+ let short_compl_list += [compl_list[i]]
+ endif
+ endfor
+
+ return short_compl_list
+ else
+ return compl_list
+ endif
+endfunction
+
+function! s:SyntaxCSyntaxGroupItems( group_name, syntax_full )
+
+ " Allow user to override iskeyword per buffer
+ let l:omni_syntax_use_iskeyword = g:omni_syntax_use_iskeyword
+ if exists('b:omni_syntax_use_iskeyword')
+ let l:omni_syntax_use_iskeyword = b:omni_syntax_use_iskeyword
+ endif
+
+ " Allow user to override iskeyword_numeric per buffer
+ let l:omni_syntax_use_iskeyword_numeric = g:omni_syntax_use_iskeyword_numeric
+ if exists('b:omni_syntax_use_iskeyword_numeric')
+ let l:omni_syntax_use_iskeyword_numeric = b:omni_syntax_use_iskeyword_numeric
+ endif
+
+ " Allow user to override iskeyword_numeric per buffer
+ let l:omni_syntax_use_single_byte = g:omni_syntax_use_single_byte
+ if exists('b:omni_syntax_use_single_byte')
+ let l:omni_syntax_use_single_byte = b:omni_syntax_use_single_byte
+ endif
+
+ " Allow user to override minimum_length per buffer
+ let l:omni_syntax_minimum_length = g:omni_syntax_minimum_length
+ if exists('b:omni_syntax_minimum_length')
+ let l:omni_syntax_minimum_length = b:omni_syntax_minimum_length
+ endif
+
+ let syn_list = ""
+
+ " From the full syntax listing, strip out the portion for the
+ " request group.
+ " Query:
+ " \n - must begin with a newline
+ " a:group_name - the group name we are interested in
+ " \s\+xxx\s\+ - group names are always followed by xxx
+ " \zs - start the match
+ " .\{-} - everything ...
+ " \ze - end the match
+ " \( - start a group or 2 potential matches
+ " \n\w - at the first newline starting with a character
+ " \| - 2nd potential match
+ " \%$ - matches end of the file or string
+ " \) - end a group
+ let syntax_group = matchstr(a:syntax_full,
+ \ "\n".a:group_name.'\s\+xxx\s\+\zs.\{-}\ze\(\n\w\|\%$\)'
+ \ )
+
+ if syntax_group != ""
+ " let syn_list = substitute( @l, '^.*xxx\s*\%(contained\s*\)\?', "", '' )
+ " let syn_list = substitute( @l, '^.*xxx\s*', "", '' )
+
+ " We only want the words for the lines beginning with
+ " containedin, but there could be other items.
+
+ " Tried to remove all lines that do not begin with contained
+ " but this does not work in all cases since you can have
+ " contained nextgroup=...
+ " So this will strip off the ending of lines with known
+ " keywords.
+ let syn_list = substitute(
+ \ syntax_group, '\<\('.
+ \ substitute(
+ \ escape(s:syn_remove_words, '\\/.*$^~[]')
+ \ , ',', '\\|', 'g'
+ \ ).
+ \ '\).\{-}\%($\|'."\n".'\)'
+ \ , "\n", 'g'
+ \ )
+
+ " Attempt to deal with lines using the match syntax
+ " javaScriptDocTags xxx match /@\(param\|argument\|requires\|file\)\>/
+ " Though it can use any types of regex, so this plugin will attempt
+ " to restrict it
+ " 1. Only use \( or \%( constructs remove all else
+ " 2 Remove and []s
+ " 3. Account for match //constructs
+ " \%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?
+ " 4. Hope for the best
+ "
+ "
+ let syn_list_old = syn_list
+ while syn_list =~ '\<match\>\s\+\/'
+ if syn_list =~ 'perlElseIfError'
+ let syn_list = syn_list
+ endif
+ " Check if the match has words at least 3 characters long
+ if syn_list =~ '\<match \/\zs.\{-}\<\w\{3,}\>.\{-}\ze\\\@<!\/\%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?\s\+'
+ " Remove everything after / and before the first \(
+ let syn_list = substitute( syn_list, '\<match \/\zs.\{-}\ze\\%\?(.\{-}\\\@<!\/\%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?\s\+', '', 'g' )
+ " Remove everything after \) and up to the ending /
+ let syn_list = substitute( syn_list, '\<match \/.\{-}\\)\zs.\{-}\ze\/\%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?\s\+', '', 'g' )
+
+ " Remove any character classes
+ " let syn_list = substitute( syn_list, '\<match /\zs.\{-}\[[^]]*\].\{-}\ze\/ ', '', 'g' )
+ let syn_list = substitute( syn_list, '\%(\<match \/[^/]\{-}\)\@<=\[[^]]*\]\ze.\{-}\\\@<!\/\%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?', '', 'g' )
+ " Remove any words < 3 characters
+ let syn_list = substitute( syn_list, '\%(\<match \/[^/]\{-}\)\@<=\<\w\{1,2}\>\ze.\{-}\\\@<!\/\%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?\s\+', '', 'g' )
+ " Remove all non-word characters
+ " let syn_list = substitute( syn_list, '\<match /\zs.\{-}\<\W\+\>.\{-}\ze\/ ', "", 'g' )
+ " let syn_list = substitute( syn_list, '\%(\<match \/[^/]\{-}\)\@<=\W\+\ze.\{-}\/ ', ' ', 'g' )
+ " Do this by using the outer substitute() call to gather all
+ " text between the match /.../ tags.
+ " The inner substitute() call operates on the text selected
+ " and replaces all non-word characters.
+ let syn_list = substitute( syn_list, '\<match \/\zs\(.\{-}\)\ze\\\@<!\/\%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?\s\+'
+ \ , '\=substitute(submatch(1), "\\W\\+", " ", "g")'
+ \ , 'g' )
+ " Remove the match / / syntax
+ let syn_list = substitute( syn_list, '\<match \/\(.\{-}\)\/\%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?\s\+', '\1', 'g' )
+ else
+ " No words long enough, remove the match
+ " Remove the match syntax
+ " let syn_list = substitute( syn_list, '\<match \/[^\/]*\/\%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?\s\+', '', 'g' )
+ let syn_list = substitute( syn_list, '\<match \/\%(.\{-}\)\?\/\%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\?\s\+', '', 'g' )
+ endif
+ if syn_list =~ '\<match\>\s\+\/'
+ " Problem removing the match / / tags
+ let syn_list = ''
+ endif
+ endwhile
+
+
+ " Now strip off the newline + blank space + contained.
+ " Also include lines with nextgroup=@someName skip_key_words syntax_element
+ " \ syn_list, '\%(^\|\n\)\@<=\s*\<\(contained\|nextgroup=\)'
+ " \ syn_list, '\%(^\|\n\)\@<=\s*\<\(contained\|nextgroup=[@a-zA-Z,]*\)'
+ let syn_list = substitute(
+ \ syn_list, '\<\(contained\|nextgroup=[@a-zA-Z,]*\)'
+ \ , "", 'g'
+ \ )
+
+ " This can leave lines like this
+ " =@vimMenuList skipwhite onoremenu
+ " Strip the special option keywords first
+ " :h :syn-skipwhite*
+ let syn_list = substitute(
+ \ syn_list, '\<\(skipwhite\|skipnl\|skipempty\)\>'
+ \ , "", 'g'
+ \ )
+
+ " Now remove the remainder of the nextgroup=@someName lines
+ let syn_list = substitute(
+ \ syn_list, '\%(^\|\n\)\@<=\s*\(@\w\+\)'
+ \ , "", 'g'
+ \ )
+
+ if l:omni_syntax_use_iskeyword == 0
+ " There are a number of items which have non-word characters in
+ " them, *'T_F1'*. vim.vim is one such file.
+ " This will replace non-word characters with spaces.
+ " setlocal filetype=forth
+ " let g:omni_syntax_use_iskeyword = 1
+ " let g:omni_syntax_use_iskeyword_numeric = 1
+ " You will see entries like
+ " #>>
+ " (.local)
+ " These were found doing a grep in vim82\syntax
+ " grep iskeyword *
+ " forth.vim:setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+ let syn_list = substitute( syn_list, '[^0-9A-Za-z_ ]', ' ', 'g' )
+ else
+ if l:omni_syntax_use_iskeyword_numeric == 1
+ " iskeyword can contain value like this
+ " 38,42,43,45,47-58,60-62,64-90,97-122,_,+,-,*,/,%,<,=,>,:,$,?,!,@-@,94
+ " Numeric values convert to their ASCII equivalent using the
+ " nr2char() function.
+ " & 38
+ " * 42
+ " + 43
+ " - 45
+ " ^ 94
+ " Iterate through all numeric specifications and convert those
+ " to their ascii equivalent ensuring the character is printable.
+ " If so, add it to the list.
+ let accepted_chars = ''
+ for item in split(&iskeyword, ',')
+ if item =~ '\d-\d'
+ " This is a character range (ie 47-58),
+ " cycle through each character within the range
+ let [b:start, b:end] = split(item, '-')
+ for range_item in range( b:start, b:end )
+ if range_item <= 127 || l:omni_syntax_use_single_byte == 0
+ if nr2char(range_item) =~ '\p'
+ let accepted_chars = accepted_chars . nr2char(range_item)
+ endif
+ endif
+ endfor
+ elseif item =~ '^\d\+$'
+ " Only numeric, translate to a character
+ if item < 127 || l:omni_syntax_use_single_byte == 0
+ if nr2char(item) =~ '\p'
+ let accepted_chars = accepted_chars . nr2char(item)
+ endif
+ endif
+ else
+ if char2nr(item) < 127 || l:omni_syntax_use_single_byte == 0
+ if item =~ '\p'
+ let accepted_chars = accepted_chars . item
+ endif
+ endif
+ endif
+ endfor
+ " Escape special regex characters
+ " Looks like the wrong chars are escaped. In a collection,
+ " :h /[]
+ " only `]', `\', `-' and `^' are special:
+ " let accepted_chars = escape(accepted_chars, '\\/.*$^~[]' )
+ let accepted_chars = escape(accepted_chars, ']\-^' )
+ " Remove all characters that are not acceptable
+ let syn_list = substitute( syn_list, '[^A-Za-z'.accepted_chars.']', ' ', 'g' )
+ else
+ let accept_chars = ','.&iskeyword.','
+ " Remove all character ranges
+ " let accept_chars = substitute(accept_chars, ',[^,]\+-[^,]\+,', ',', 'g')
+ let accept_chars = substitute(accept_chars, ',\@<=[^,]\+-[^,]\+,', '', 'g')
+ " Remove all numeric specifications
+ " let accept_chars = substitute(accept_chars, ',\d\{-},', ',', 'g')
+ let accept_chars = substitute(accept_chars, ',\@<=\d\{-},', '', 'g')
+ " Remove all commas
+ let accept_chars = substitute(accept_chars, ',', '', 'g')
+ " Escape special regex characters
+ " Looks like the wrong chars are escaped. In a collection,
+ " :h /[]
+ " only `]', `\', `-' and `^' are special:
+ " let accept_chars = escape(accept_chars, '\\/.*$^~[]' )
+ let accept_chars = escape(accept_chars, ']\-^' )
+ " Remove all characters that are not acceptable
+ let syn_list = substitute( syn_list, '[^0-9A-Za-z_'.accept_chars.']', ' ', 'g' )
+ endif
+ endif
+
+ if l:omni_syntax_minimum_length > 0
+ " If the user specified a minimum length, enforce it
+ let syn_list = substitute(' '.syn_list.' ', ' \S\{,'.l:omni_syntax_minimum_length.'}\ze ', ' ', 'g')
+ endif
+ else
+ let syn_list = ''
+ endif
+
+ return syn_list
+endfunction
+
+function! OmniSyntaxShowChars(spec)
+ let result = []
+ for item in split(a:spec, ',')
+ if len(item) > 1
+ if item == '@-@'
+ call add(result, char2nr(item))
+ else
+ call extend(result, call('range', split(item, '-')))
+ endif
+ else
+ if item == '@' " assume this is [A-Za-z]
+ for [c1, c2] in [['A', 'Z'], ['a', 'z']]
+ call extend(result, range(char2nr(c1), char2nr(c2)))
+ endfor
+ else
+ call add(result, char2nr(item))
+ endif
+ endif
+ endfor
+ return join(map(result, 'nr2char(v:val)'), ', ')
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/autoload/tar.vim b/runtime/autoload/tar.vim
new file mode 100644
index 0000000..e495e82
--- /dev/null
+++ b/runtime/autoload/tar.vim
@@ -0,0 +1,818 @@
+" tar.vim: Handles browsing tarfiles
+" AUTOLOAD PORTION
+" Date: Jan 07, 2020
+" Version: 32
+" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" License: Vim License (see vim's :help license)
+"
+" Contains many ideas from Michael Toren's <tar.vim>
+"
+" Copyright: Copyright (C) 2005-2017 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,
+" tar.vim and tarPlugin.vim are provided *as is* and comes
+" with no warranty of any kind, either 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.
+" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_tar")
+ finish
+endif
+let g:loaded_tar= "v32"
+if v:version < 702
+ echohl WarningMsg
+ echo "***warning*** this version of tar needs vim 7.2"
+ echohl Normal
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+"DechoTabOn
+"call Decho("loading autoload/tar.vim")
+
+" ---------------------------------------------------------------------
+" Default Settings: {{{1
+if !exists("g:tar_browseoptions")
+ let g:tar_browseoptions= "Ptf"
+endif
+if !exists("g:tar_readoptions")
+ let g:tar_readoptions= "OPxf"
+endif
+if !exists("g:tar_cmd")
+ let g:tar_cmd= "tar"
+endif
+if !exists("g:tar_writeoptions")
+ let g:tar_writeoptions= "uf"
+endif
+if !exists("g:tar_delfile")
+ let g:tar_delfile="--delete -f"
+endif
+if !exists("g:netrw_cygwin")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
+ let g:netrw_cygwin= 1
+ else
+ let g:netrw_cygwin= 0
+ endif
+ else
+ let g:netrw_cygwin= 0
+ endif
+endif
+if !exists("g:tar_copycmd")
+ if !exists("g:netrw_localcopycmd")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if g:netrw_cygwin
+ let g:netrw_localcopycmd= "cp"
+ else
+ let g:netrw_localcopycmd= "copy"
+ endif
+ elseif has("unix") || has("macunix")
+ let g:netrw_localcopycmd= "cp"
+ else
+ let g:netrw_localcopycmd= ""
+ endif
+ endif
+ let g:tar_copycmd= g:netrw_localcopycmd
+endif
+if !exists("g:tar_extractcmd")
+ let g:tar_extractcmd= "tar -xf"
+endif
+
+" set up shell quoting character
+if !exists("g:tar_shq")
+ if exists("+shq") && exists("&shq") && &shq != ""
+ let g:tar_shq= &shq
+ elseif has("win32") || has("win95") || has("win64") || has("win16")
+ if exists("g:netrw_cygwin") && g:netrw_cygwin
+ let g:tar_shq= "'"
+ else
+ let g:tar_shq= '"'
+ endif
+ else
+ let g:tar_shq= "'"
+ endif
+" call Decho("g:tar_shq<".g:tar_shq.">")
+endif
+
+" ----------------
+" Functions: {{{1
+" ----------------
+
+" ---------------------------------------------------------------------
+" tar#Browse: {{{2
+fun! tar#Browse(tarfile)
+" call Dfunc("tar#Browse(tarfile<".a:tarfile.">)")
+ let repkeep= &report
+ set report=10
+
+ " sanity checks
+ if !executable(g:tar_cmd)
+ redraw!
+" call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system')
+ echohl Error | echo '***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system'
+ let &report= repkeep
+" call Dret("tar#Browse")
+ return
+ endif
+ if !filereadable(a:tarfile)
+" call Decho('a:tarfile<'.a:tarfile.'> not filereadable')
+ if a:tarfile !~# '^\a\+://'
+ " if it's an url, don't complain, let url-handlers such as vim do its thing
+ redraw!
+" call Decho("***error*** (tar#Browse) File not readable<".a:tarfile.">")
+ echohl Error | echo "***error*** (tar#Browse) File not readable<".a:tarfile.">" | echohl None
+ endif
+ let &report= repkeep
+" call Dret("tar#Browse : file<".a:tarfile."> not readable")
+ return
+ endif
+ if &ma != 1
+ set ma
+ endif
+ let b:tarfile= a:tarfile
+
+ setlocal noswapfile
+ setlocal buftype=nofile
+ setlocal bufhidden=hide
+ setlocal nobuflisted
+ setlocal nowrap
+ set ft=tar
+
+ " give header
+" call Decho("printing header")
+ let lastline= line("$")
+ call setline(lastline+1,'" tar.vim version '.g:loaded_tar)
+ call setline(lastline+2,'" Browsing tarfile '.a:tarfile)
+ call setline(lastline+3,'" Select a file with cursor and press ENTER')
+ keepj $put =''
+ keepj sil! 0d
+ keepj $
+
+ let tarfile= a:tarfile
+ if has("win32unix") && executable("cygpath")
+ " assuming cygwin
+ let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
+ endif
+ let curlast= line("$")
+
+ if tarfile =~# '\.\(gz\)$'
+" 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." - "
+
+ elseif tarfile =~# '\.\(tgz\)$' || tarfile =~# '\.\(tbz\)$' || tarfile =~# '\.\(txz\)$' || tarfile =~# '\.\(tzs\)$'
+ if has("unix") && executable("file")
+ let filekind= system("file ".shellescape(tarfile,1)) =~ "bzip2"
+ else
+ let filekind= ""
+ endif
+
+ if filekind =~ "bzip2"
+ exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
+ elseif filekind =~ "XZ"
+ exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
+ elseif filekind =~ "Zstandard"
+ exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
+ else
+ exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
+ endif
+
+ 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." - "
+ elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$'
+" call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
+ exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
+ elseif tarfile =~# '\.\(lzma\|tlz\)$'
+" call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
+ exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
+ elseif tarfile =~# '\.\(xz\|txz\)$'
+" call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ")
+ exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
+ elseif tarfile =~# '\.\(zst\|tzs\)$'
+ exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - "
+ else
+ if tarfile =~ '^\s*-'
+ " A file name starting with a dash is taken as an option. Prepend ./ to avoid that.
+ let tarfile = substitute(tarfile, '-', './-', '')
+ endif
+" call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0))
+ exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1)
+ endif
+ if v:shell_error != 0
+ redraw!
+ echohl WarningMsg | echo "***warning*** (tar#Browse) please check your g:tar_browseoptions<".g:tar_browseoptions.">"
+" call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
+ return
+ endif
+ if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~# '\c\%(warning\|error\|inappropriate\|unrecognized\)')
+ redraw!
+ echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None
+ keepj sil! %d
+ let eikeep= &ei
+ set ei=BufReadCmd,FileReadCmd
+ exe "r ".fnameescape(a:tarfile)
+ let &ei= eikeep
+ keepj sil! 1d
+" call Dret("tar#Browse : a:tarfile<".a:tarfile.">")
+ return
+ endif
+
+ " set up maps supported for tar
+ setlocal noma nomod ro
+ noremap <silent> <buffer> <cr> :call <SID>TarBrowseSelect()<cr>
+ noremap <silent> <buffer> x :call tar#Extract()<cr>
+ if &mouse != ""
+ noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>TarBrowseSelect()<cr>
+ endif
+
+ let &report= repkeep
+" call Dret("tar#Browse : b:tarfile<".b:tarfile.">")
+endfun
+
+" ---------------------------------------------------------------------
+" TarBrowseSelect: {{{2
+fun! s:TarBrowseSelect()
+" call Dfunc("TarBrowseSelect() b:tarfile<".b:tarfile."> curfile<".expand("%").">")
+ let repkeep= &report
+ set report=10
+ let fname= getline(".")
+" call Decho("fname<".fname.">")
+
+ if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
+ redraw!
+ echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
+" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
+ return
+ endif
+
+ " sanity check
+ if fname =~ '^"'
+ let &report= repkeep
+" call Dret("TarBrowseSelect")
+ return
+ endif
+
+ " about to make a new window, need to use b:tarfile
+ let tarfile= b:tarfile
+ let curfile= expand("%")
+ if has("win32unix") && executable("cygpath")
+ " assuming cygwin
+ let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
+ endif
+
+ " open a new window (tar#Read will read a file into it)
+ noswapfile new
+ if !exists("g:tar_nomax") || g:tar_nomax == 0
+ wincmd _
+ endif
+ let s:tblfile_{winnr()}= curfile
+ call tar#Read("tarfile:".tarfile.'::'.fname,1)
+ filetype detect
+ set nomod
+ exe 'com! -buffer -nargs=? -complete=file TarDiff :call tar#Diff(<q-args>,"'.fnameescape(fname).'")'
+
+ let &report= repkeep
+" call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
+endfun
+
+" ---------------------------------------------------------------------
+" tar#Read: {{{2
+fun! tar#Read(fname,mode)
+" call Dfunc("tar#Read(fname<".a:fname.">,mode=".a:mode.")")
+ let repkeep= &report
+ set report=10
+ let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','')
+ let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','')
+ if has("win32unix") && executable("cygpath")
+ " assuming cygwin
+ let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e')
+ endif
+" call Decho("tarfile<".tarfile.">")
+" call Decho("fname<".fname.">")
+
+ if fname =~ '\.bz2$' && executable("bzcat")
+ let decmp= "|bzcat"
+ let doro = 1
+ elseif fname =~ '\.t\=gz$' && executable("zcat")
+ let decmp= "|zcat"
+ let doro = 1
+ elseif fname =~ '\.lzma$' && executable("lzcat")
+ let decmp= "|lzcat"
+ let doro = 1
+ elseif fname =~ '\.xz$' && executable("xzcat")
+ let decmp= "|xzcat"
+ let doro = 1
+ elseif fname =~ '\.zst$' && executable("zstdcat")
+ let decmp= "|zstdcat"
+ let doro = 1
+ else
+ let decmp=""
+ let doro = 0
+ if fname =~ '\.bz2$\|\.gz$\|\.lzma$\|\.xz$\|\.zip$\|\.Z$'
+ setlocal bin
+ endif
+ endif
+
+ if exists("g:tar_secure")
+ let tar_secure= " -- "
+ else
+ let tar_secure= " "
+ endif
+
+ if tarfile =~# '\.bz2$'
+ exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+ elseif tarfile =~# '\.\(gz\)$'
+ exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+
+ elseif tarfile =~# '\(\.tgz\|\.tbz\|\.txz\)'
+ if has("unix") && executable("file")
+ let filekind= system("file ".shellescape(tarfile,1))
+ else
+ let filekind= ""
+ endif
+ if filekind =~ "bzip2"
+ exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+ elseif filekind =~ "XZ"
+ exe "sil! r! xz -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+ elseif filekind =~ "Zstandard"
+ exe "sil! r! zstd --decompress --stdout -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+ else
+ exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+ endif
+
+ elseif tarfile =~# '\.lrp$'
+ exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+ elseif tarfile =~# '\.lzma$'
+ exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+ elseif tarfile =~# '\.\(xz\|txz\)$'
+ exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp
+ else
+ if tarfile =~ '^\s*-'
+ " A file name starting with a dash is taken as an option. Prepend ./ to avoid that.
+ let tarfile = substitute(tarfile, '-', './-', '')
+ endif
+" call Decho("8: exe silent r! ".g:tar_cmd." -".g:tar_readoptions.tar_secure.shellescape(tarfile,1)." ".shellescape(fname,1).decmp)
+ exe "silent r! ".g:tar_cmd." -".g:tar_readoptions.shellescape(tarfile,1)." ".tar_secure.shellescape(fname,1).decmp
+ endif
+
+ if doro
+ " because the reverse process of compressing changed files back into the tarball is not currently supported
+ setlocal ro
+ endif
+
+ let b:tarfile= a:fname
+ exe "file tarfile::".fnameescape(fname)
+
+ " cleanup
+ keepj sil! 0d
+ set nomod
+
+ let &report= repkeep
+" call Dret("tar#Read : b:tarfile<".b:tarfile.">")
+endfun
+
+" ---------------------------------------------------------------------
+" tar#Write: {{{2
+fun! tar#Write(fname)
+" call Dfunc("tar#Write(fname<".a:fname.">) b:tarfile<".b:tarfile."> tblfile_".winnr()."<".s:tblfile_{winnr()}.">")
+ let repkeep= &report
+ set report=10
+
+ if !exists("g:tar_secure") && a:fname =~ '^\s*-\|\s\+-'
+ redraw!
+ echohl WarningMsg | echo '***warning*** (tar#Write) rejecting tarfile member<'.a:fname.'> because of embedded "-"'
+" call Dret('tar#Write : rejecting tarfile member<'.fname.'> because of embedded "-"')
+ return
+ endif
+
+ " sanity checks
+ if !executable(g:tar_cmd)
+ redraw!
+" call Decho('***error*** (tar#Browse) "'.g:tar_cmd.'" not available on your system')
+ let &report= repkeep
+" call Dret("tar#Write")
+ return
+ endif
+ if !exists("*mkdir")
+ redraw!
+" call Decho("***error*** (tar#Write) sorry, mkdir() doesn't work on your system")
+ echohl Error | echo "***error*** (tar#Write) sorry, mkdir() doesn't work on your system" | echohl None
+ let &report= repkeep
+" call Dret("tar#Write")
+ return
+ endif
+
+ let curdir= getcwd()
+ let tmpdir= tempname()
+" call Decho("orig tempname<".tmpdir.">")
+ if tmpdir =~ '\.'
+ let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
+ endif
+" call Decho("tmpdir<".tmpdir.">")
+ call mkdir(tmpdir,"p")
+
+ " attempt to change to the indicated directory
+ try
+ exe "cd ".fnameescape(tmpdir)
+ catch /^Vim\%((\a\+)\)\=:E344/
+ redraw!
+" call Decho("***error*** (tar#Write) cannot cd to temporary directory")
+ echohl Error | echo "***error*** (tar#Write) cannot cd to temporary directory" | Echohl None
+ let &report= repkeep
+" call Dret("tar#Write")
+ return
+ endtry
+" call Decho("current directory now: ".getcwd())
+
+ " place temporary files under .../_ZIPVIM_/
+ if isdirectory("_ZIPVIM_")
+ call s:Rmdir("_ZIPVIM_")
+ endif
+ call mkdir("_ZIPVIM_")
+ cd _ZIPVIM_
+" call Decho("current directory now: ".getcwd())
+
+ let tarfile = substitute(b:tarfile,'tarfile:\(.\{-}\)::.*$','\1','')
+ let fname = substitute(b:tarfile,'tarfile:.\{-}::\(.*\)$','\1','')
+
+ " handle compressed archives
+ if tarfile =~# '\.bz2'
+ call system("bzip2 -d -- ".shellescape(tarfile,0))
+ let tarfile = substitute(tarfile,'\.bz2','','e')
+ let compress= "bzip2 -- ".shellescape(tarfile,0)
+" call Decho("compress<".compress.">")
+ elseif tarfile =~# '\.gz'
+ call system("gzip -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))
+ let tarfile = substitute(tarfile,'\.tgz','.tar','e')
+ let compress= "gzip -- ".shellescape(tarfile,0)
+ let tgz = 1
+" call Decho("compress<".compress.">")
+ elseif tarfile =~# '\.xz'
+ call system("xz -d -- ".shellescape(tarfile,0))
+ let tarfile = substitute(tarfile,'\.xz','','e')
+ let compress= "xz -- ".shellescape(tarfile,0)
+" call Decho("compress<".compress.">")
+ elseif tarfile =~# '\.zst'
+ call system("zstd --decompress -- ".shellescape(tarfile,0))
+ let tarfile = substitute(tarfile,'\.zst','','e')
+ let compress= "zstd -- ".shellescape(tarfile,0)
+ elseif tarfile =~# '\.lzma'
+ call system("lzma -d -- ".shellescape(tarfile,0))
+ let tarfile = substitute(tarfile,'\.lzma','','e')
+ let compress= "lzma -- ".shellescape(tarfile,0)
+" call Decho("compress<".compress.">")
+ endif
+" call Decho("tarfile<".tarfile.">")
+
+ if v:shell_error != 0
+ redraw!
+" call Decho("***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname)
+ echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".tarfile." with ".fname | echohl None
+ else
+
+" call Decho("tarfile<".tarfile."> fname<".fname.">")
+
+ if fname =~ '/'
+ let dirpath = substitute(fname,'/[^/]\+$','','e')
+ if has("win32unix") && executable("cygpath")
+ let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e')
+ endif
+ call mkdir(dirpath,"p")
+ endif
+ if tarfile !~ '/'
+ let tarfile= curdir.'/'.tarfile
+ endif
+ if tarfile =~ '^\s*-'
+ " A file name starting with a dash may be taken as an option. Prepend ./ to avoid that.
+ let tarfile = substitute(tarfile, '-', './-', '')
+ endif
+" call Decho("tarfile<".tarfile."> fname<".fname.">")
+
+ if exists("g:tar_secure")
+ let tar_secure= " -- "
+ else
+ let tar_secure= " "
+ endif
+ exe "w! ".fnameescape(fname)
+ if has("win32unix") && executable("cygpath")
+ let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e')
+ endif
+
+ " delete old file from tarfile
+" call Decho("system(".g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0)." -- ".shellescape(fname,0).")")
+ call system(g:tar_cmd." ".g:tar_delfile." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
+ if v:shell_error != 0
+ redraw!
+" call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname))
+ echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
+ else
+
+ " update tarfile with new file
+" call Decho(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
+ call system(g:tar_cmd." -".g:tar_writeoptions." ".shellescape(tarfile,0).tar_secure.shellescape(fname,0))
+ if v:shell_error != 0
+ redraw!
+" call Decho("***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname))
+ echohl Error | echo "***error*** (tar#Write) sorry, unable to update ".fnameescape(tarfile)." with ".fnameescape(fname) | echohl None
+ elseif exists("compress")
+" call Decho("call system(".compress.")")
+ call system(compress)
+ if exists("tgz")
+" call Decho("rename(".tarfile.".gz,".substitute(tarfile,'\.tar$','.tgz','e').")")
+ call rename(tarfile.".gz",substitute(tarfile,'\.tar$','.tgz','e'))
+ endif
+ endif
+ endif
+
+ " support writing tarfiles across a network
+ if s:tblfile_{winnr()} =~ '^\a\+://'
+" call Decho("handle writing <".tarfile."> across network to <".s:tblfile_{winnr()}.">")
+ let tblfile= s:tblfile_{winnr()}
+ 1split|noswapfile enew
+ let binkeep= &l:binary
+ let eikeep = &ei
+ set binary ei=all
+ exe "noswapfile e! ".fnameescape(tarfile)
+ call netrw#NetWrite(tblfile)
+ let &ei = eikeep
+ let &l:binary = binkeep
+ q!
+ unlet s:tblfile_{winnr()}
+ endif
+ endif
+
+ " cleanup and restore current directory
+ cd ..
+ call s:Rmdir("_ZIPVIM_")
+ exe "cd ".fnameescape(curdir)
+ setlocal nomod
+
+ let &report= repkeep
+" call Dret("tar#Write")
+endfun
+
+" ---------------------------------------------------------------------
+" tar#Diff: {{{2
+fun! tar#Diff(userfname,fname)
+" call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")")
+ let fname= a:fname
+ if a:userfname != ""
+ let fname= a:userfname
+ endif
+ if filereadable(fname)
+ " sets current file (from tarball) for diff'ing
+ " splits window vertically
+ " opens original file, sets it for diff'ing
+ " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes)
+ diffthis
+ wincmd v
+ exe "noswapfile e ".fnameescape(fname)
+ diffthis
+ else
+ redraw!
+ echo "***warning*** unable to read file<".fname.">"
+ endif
+" call Dret("tar#Diff")
+endfun
+
+" ---------------------------------------------------------------------
+" tar#Extract: extract a file from a (possibly compressed) tar archive {{{2
+fun! tar#Extract()
+" call Dfunc("tar#Extract()")
+
+ let repkeep= &report
+ set report=10
+ let fname= getline(".")
+" call Decho("fname<".fname.">")
+
+ if !exists("g:tar_secure") && fname =~ '^\s*-\|\s\+-'
+ redraw!
+ echohl WarningMsg | echo '***warning*** (tar#BrowseSelect) rejecting tarfile member<'.fname.'> because of embedded "-"'
+" call Dret('tar#BrowseSelect : rejecting tarfile member<'.fname.'> because of embedded "-"')
+ return
+ endif
+
+ " sanity check
+ if fname =~ '^"'
+ let &report= repkeep
+" call Dret("TarBrowseSelect")
+ return
+ endif
+
+ let tarball = expand("%")
+" call Decho("tarball<".tarball.">")
+ let tarbase = substitute(tarball,'\..*$','','')
+" call Decho("tarbase<".tarbase.">")
+
+ let extractcmd= netrw#WinPath(g:tar_extractcmd)
+ if filereadable(tarbase.".tar")
+" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname).")")
+ call system(extractcmd." ".shellescape(tarbase).".tar ".shellescape(fname))
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!" | echohl NONE
+" call Decho("***error*** ".extractcmd." ".tarbase.".tar ".fname.": failed!")
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ elseif filereadable(tarbase.".tgz")
+ let extractcmd= substitute(extractcmd,"-","-z","")
+" call Decho("system(".extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname).")")
+ call system(extractcmd." ".shellescape(tarbase).".tgz ".shellescape(fname))
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tgz ".fname.": failed!" | echohl NONE
+" call Decho("***error*** ".extractcmd."t ".tarbase.".tgz ".fname.": failed!")
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ elseif filereadable(tarbase.".tar.gz")
+ let extractcmd= substitute(extractcmd,"-","-z","")
+" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname).")")
+ call system(extractcmd." ".shellescape(tarbase).".tar.gz ".shellescape(fname))
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!" | echohl NONE
+" call Decho("***error*** ".extractcmd." ".tarbase.".tar.gz ".fname.": failed!")
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ elseif filereadable(tarbase.".tbz")
+ let extractcmd= substitute(extractcmd,"-","-j","")
+" call Decho("system(".extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname).")")
+ call system(extractcmd." ".shellescape(tarbase).".tbz ".shellescape(fname))
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!" | echohl NONE
+" call Decho("***error*** ".extractcmd."j ".tarbase.".tbz ".fname.": failed!")
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ elseif filereadable(tarbase.".tar.bz2")
+ let extractcmd= substitute(extractcmd,"-","-j","")
+" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname).")")
+ call system(extractcmd." ".shellescape(tarbase).".tar.bz2 ".shellescape(fname))
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!" | echohl NONE
+" call Decho("***error*** ".extractcmd."j ".tarbase.".tar.bz2 ".fname.": failed!")
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ elseif filereadable(tarbase.".txz")
+ let extractcmd= substitute(extractcmd,"-","-J","")
+" call Decho("system(".extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname).")")
+ call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname))
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!" | echohl NONE
+" call Decho("***error*** ".extractcmd." ".tarbase.".txz ".fname.": failed!")
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ elseif filereadable(tarbase.".tar.xz")
+ let extractcmd= substitute(extractcmd,"-","-J","")
+" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname).")")
+ call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname))
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!" | echohl NONE
+" call Decho("***error*** ".extractcmd." ".tarbase.".tar.xz ".fname.": failed!")
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ elseif filereadable(tarbase.".tzs")
+ let extractcmd= substitute(extractcmd,"-","--zstd","")
+" call Decho("system(".extractcmd." ".shellescape(tarbase).".tzs ".shellescape(fname).")")
+ call system(extractcmd." ".shellescape(tarbase).".txz ".shellescape(fname))
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tzs ".fname.": failed!" | echohl NONE
+" call Decho("***error*** ".extractcmd." ".tarbase.".tzs ".fname.": failed!")
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+
+ elseif filereadable(tarbase.".tar.zst")
+ let extractcmd= substitute(extractcmd,"-","--zstd","")
+" call Decho("system(".extractcmd." ".shellescape(tarbase).".tar.zst ".shellescape(fname).")")
+ call system(extractcmd." ".shellescape(tarbase).".tar.xz ".shellescape(fname))
+ if v:shell_error != 0
+ echohl Error | echo "***error*** ".extractcmd." ".tarbase.".tar.zst ".fname.": failed!" | echohl NONE
+" call Decho("***error*** ".extractcmd." ".tarbase.".tar.zst ".fname.": failed!")
+ else
+ echo "***note*** successfully extracted ".fname
+ endif
+ endif
+
+ " restore option
+ let &report= repkeep
+
+" call Dret("tar#Extract")
+endfun
+
+" ---------------------------------------------------------------------
+" s:Rmdir: {{{2
+fun! s:Rmdir(fname)
+" call Dfunc("Rmdir(fname<".a:fname.">)")
+ if has("unix")
+ call system("/bin/rm -rf -- ".shellescape(a:fname,0))
+ elseif has("win32") || has("win95") || has("win64") || has("win16")
+ if &shell =~? "sh$"
+ call system("/bin/rm -rf -- ".shellescape(a:fname,0))
+ else
+ call system("del /S ".shellescape(a:fname,0))
+ endif
+ endif
+" call Dret("Rmdir")
+endfun
+
+" ---------------------------------------------------------------------
+" tar#Vimuntar: installs a tarball in the user's .vim / vimfiles directory {{{2
+fun! tar#Vimuntar(...)
+" call Dfunc("tar#Vimuntar() a:0=".a:0." a:1<".(exists("a:1")? a:1 : "-n/a-").">")
+ let tarball = expand("%")
+" call Decho("tarball<".tarball.">")
+ let tarbase = substitute(tarball,'\..*$','','')
+" call Decho("tarbase<".tarbase.">")
+ let tarhome = expand("%:p")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ let tarhome= substitute(tarhome,'\\','/','g')
+ endif
+ let tarhome= substitute(tarhome,'/[^/]*$','','')
+" call Decho("tarhome<".tarhome.">")
+ let tartail = expand("%:t")
+" call Decho("tartail<".tartail.">")
+ let curdir = getcwd()
+" call Decho("curdir <".curdir.">")
+ " set up vimhome
+ if a:0 > 0 && a:1 != ""
+ let vimhome= a:1
+ else
+ let vimhome= vimball#VimballHome()
+ endif
+" call Decho("vimhome<".vimhome.">")
+
+" call Decho("curdir<".curdir."> vimhome<".vimhome.">")
+ if simplify(curdir) != simplify(vimhome)
+ " copy (possibly compressed) tarball to .vim/vimfiles
+" call Decho(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
+ call system(netrw#WinPath(g:tar_copycmd)." ".shellescape(tartail)." ".shellescape(vimhome))
+" call Decho("exe cd ".fnameescape(vimhome))
+ exe "cd ".fnameescape(vimhome)
+ endif
+" call Decho("getcwd<".getcwd().">")
+
+ " if necessary, decompress the tarball; then, extract it
+ if tartail =~ '\.tgz'
+ if executable("gunzip")
+ silent exe "!gunzip ".shellescape(tartail)
+ elseif executable("gzip")
+ silent exe "!gzip -d ".shellescape(tartail)
+ else
+ echoerr "unable to decompress<".tartail."> on this system"
+ if simplify(curdir) != simplify(tarhome)
+ " remove decompressed tarball, restore directory
+" call Decho("delete(".tartail.".tar)")
+ call delete(tartail.".tar")
+" call Decho("exe cd ".fnameescape(curdir))
+ exe "cd ".fnameescape(curdir)
+ endif
+" call Dret("tar#Vimuntar")
+ return
+ endif
+ else
+ call vimball#Decompress(tartail,0)
+ endif
+ let extractcmd= netrw#WinPath(g:tar_extractcmd)
+" call Decho("system(".extractcmd." ".shellescape(tarbase.".tar").")")
+ call system(extractcmd." ".shellescape(tarbase.".tar"))
+
+ " set up help
+ if filereadable("doc/".tarbase.".txt")
+" call Decho("exe helptags ".getcwd()."/doc")
+ exe "helptags ".getcwd()."/doc"
+ endif
+
+ if simplify(tarhome) != simplify(vimhome)
+ " remove decompressed tarball, restore directory
+ call delete(vimhome."/".tarbase.".tar")
+ exe "cd ".fnameescape(curdir)
+ endif
+
+" call Dret("tar#Vimuntar")
+endfun
+
+" =====================================================================
+" Modelines And Restoration: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim:ts=8 fdm=marker
diff --git a/runtime/autoload/tohtml.vim b/runtime/autoload/tohtml.vim
new file mode 100644
index 0000000..1086347
--- /dev/null
+++ b/runtime/autoload/tohtml.vim
@@ -0,0 +1,950 @@
+" Vim autoload file for the tohtml plugin.
+" Maintainer: Ben Fritz <fritzophrenic@gmail.com>
+" Last Change: 2023 Jan 01
+"
+" Additional contributors:
+"
+" Original by Bram Moolenaar <Bram@vim.org>
+" Diff2HTML() added by Christian Brabandt <cb@256bit.org>
+"
+" See Mercurial change logs for more!
+
+" this file uses line continuations
+let s:cpo_sav = &cpo
+set cpo&vim
+
+" Automatically find charsets from all encodings supported natively by Vim. With
+" the 8bit- and 2byte- prefixes, Vim can actually support more encodings than
+" this. Let the user specify these however since they won't be supported on
+" every system.
+"
+" Note, not all of Vim's supported encodings have a charset to use.
+"
+" Names in this list are from:
+" http://www.iana.org/assignments/character-sets
+" g:tohtml#encoding_to_charset: {{{
+let g:tohtml#encoding_to_charset = {
+ \ 'latin1' : 'ISO-8859-1',
+ \ 'iso-8859-2' : 'ISO-8859-2',
+ \ 'iso-8859-3' : 'ISO-8859-3',
+ \ 'iso-8859-4' : 'ISO-8859-4',
+ \ 'iso-8859-5' : 'ISO-8859-5',
+ \ 'iso-8859-6' : 'ISO-8859-6',
+ \ 'iso-8859-7' : 'ISO-8859-7',
+ \ 'iso-8859-8' : 'ISO-8859-8',
+ \ 'iso-8859-9' : 'ISO-8859-9',
+ \ 'iso-8859-10' : '',
+ \ 'iso-8859-13' : 'ISO-8859-13',
+ \ 'iso-8859-14' : '',
+ \ 'iso-8859-15' : 'ISO-8859-15',
+ \ 'koi8-r' : 'KOI8-R',
+ \ 'koi8-u' : 'KOI8-U',
+ \ 'macroman' : 'macintosh',
+ \ 'cp437' : '',
+ \ 'cp775' : '',
+ \ 'cp850' : '',
+ \ 'cp852' : '',
+ \ 'cp855' : '',
+ \ 'cp857' : '',
+ \ 'cp860' : '',
+ \ 'cp861' : '',
+ \ 'cp862' : '',
+ \ 'cp863' : '',
+ \ 'cp865' : '',
+ \ 'cp866' : 'IBM866',
+ \ 'cp869' : '',
+ \ 'cp874' : '',
+ \ 'cp1250' : 'windows-1250',
+ \ 'cp1251' : 'windows-1251',
+ \ 'cp1253' : 'windows-1253',
+ \ 'cp1254' : 'windows-1254',
+ \ 'cp1255' : 'windows-1255',
+ \ 'cp1256' : 'windows-1256',
+ \ 'cp1257' : 'windows-1257',
+ \ 'cp1258' : 'windows-1258',
+ \ 'euc-jp' : 'EUC-JP',
+ \ 'sjis' : 'Shift_JIS',
+ \ 'cp932' : 'Shift_JIS',
+ \ 'cp949' : '',
+ \ 'euc-kr' : 'EUC-KR',
+ \ 'cp936' : 'GBK',
+ \ 'euc-cn' : 'GB2312',
+ \ 'big5' : 'Big5',
+ \ 'cp950' : 'Big5',
+ \ 'utf-8' : 'UTF-8',
+ \ 'ucs-2' : 'UTF-8',
+ \ 'ucs-2le' : 'UTF-8',
+ \ 'utf-16' : 'UTF-8',
+ \ 'utf-16le' : 'UTF-8',
+ \ 'ucs-4' : 'UTF-8',
+ \ 'ucs-4le' : 'UTF-8',
+ \ }
+lockvar g:tohtml#encoding_to_charset
+" Notes:
+" 1. All UCS/UTF are converted to UTF-8 because it is much better supported
+" 2. Any blank spaces are there because Vim supports it but at least one major
+" web browser does not according to http://wiki.whatwg.org/wiki/Web_Encodings.
+" }}}
+
+" Only automatically find encodings supported natively by Vim, let the user
+" specify the encoding if it's not natively supported. This function is only
+" used when the user specifies the charset, they better know what they are
+" doing!
+"
+" Names in this list are from:
+" http://www.iana.org/assignments/character-sets
+" g:tohtml#charset_to_encoding: {{{
+let g:tohtml#charset_to_encoding = {
+ \ 'iso_8859-1:1987' : 'latin1',
+ \ 'iso-ir-100' : 'latin1',
+ \ 'iso_8859-1' : 'latin1',
+ \ 'iso-8859-1' : 'latin1',
+ \ 'latin1' : 'latin1',
+ \ 'l1' : 'latin1',
+ \ 'ibm819' : 'latin1',
+ \ 'cp819' : 'latin1',
+ \ 'csisolatin1' : 'latin1',
+ \ 'iso_8859-2:1987' : 'iso-8859-2',
+ \ 'iso-ir-101' : 'iso-8859-2',
+ \ 'iso_8859-2' : 'iso-8859-2',
+ \ 'iso-8859-2' : 'iso-8859-2',
+ \ 'latin2' : 'iso-8859-2',
+ \ 'l2' : 'iso-8859-2',
+ \ 'csisolatin2' : 'iso-8859-2',
+ \ 'iso_8859-3:1988' : 'iso-8859-3',
+ \ 'iso-ir-109' : 'iso-8859-3',
+ \ 'iso_8859-3' : 'iso-8859-3',
+ \ 'iso-8859-3' : 'iso-8859-3',
+ \ 'latin3' : 'iso-8859-3',
+ \ 'l3' : 'iso-8859-3',
+ \ 'csisolatin3' : 'iso-8859-3',
+ \ 'iso_8859-4:1988' : 'iso-8859-4',
+ \ 'iso-ir-110' : 'iso-8859-4',
+ \ 'iso_8859-4' : 'iso-8859-4',
+ \ 'iso-8859-4' : 'iso-8859-4',
+ \ 'latin4' : 'iso-8859-4',
+ \ 'l4' : 'iso-8859-4',
+ \ 'csisolatin4' : 'iso-8859-4',
+ \ 'iso_8859-5:1988' : 'iso-8859-5',
+ \ 'iso-ir-144' : 'iso-8859-5',
+ \ 'iso_8859-5' : 'iso-8859-5',
+ \ 'iso-8859-5' : 'iso-8859-5',
+ \ 'cyrillic' : 'iso-8859-5',
+ \ 'csisolatincyrillic' : 'iso-8859-5',
+ \ 'iso_8859-6:1987' : 'iso-8859-6',
+ \ 'iso-ir-127' : 'iso-8859-6',
+ \ 'iso_8859-6' : 'iso-8859-6',
+ \ 'iso-8859-6' : 'iso-8859-6',
+ \ 'ecma-114' : 'iso-8859-6',
+ \ 'asmo-708' : 'iso-8859-6',
+ \ 'arabic' : 'iso-8859-6',
+ \ 'csisolatinarabic' : 'iso-8859-6',
+ \ 'iso_8859-7:1987' : 'iso-8859-7',
+ \ 'iso-ir-126' : 'iso-8859-7',
+ \ 'iso_8859-7' : 'iso-8859-7',
+ \ 'iso-8859-7' : 'iso-8859-7',
+ \ 'elot_928' : 'iso-8859-7',
+ \ 'ecma-118' : 'iso-8859-7',
+ \ 'greek' : 'iso-8859-7',
+ \ 'greek8' : 'iso-8859-7',
+ \ 'csisolatingreek' : 'iso-8859-7',
+ \ 'iso_8859-8:1988' : 'iso-8859-8',
+ \ 'iso-ir-138' : 'iso-8859-8',
+ \ 'iso_8859-8' : 'iso-8859-8',
+ \ 'iso-8859-8' : 'iso-8859-8',
+ \ 'hebrew' : 'iso-8859-8',
+ \ 'csisolatinhebrew' : 'iso-8859-8',
+ \ 'iso_8859-9:1989' : 'iso-8859-9',
+ \ 'iso-ir-148' : 'iso-8859-9',
+ \ 'iso_8859-9' : 'iso-8859-9',
+ \ 'iso-8859-9' : 'iso-8859-9',
+ \ 'latin5' : 'iso-8859-9',
+ \ 'l5' : 'iso-8859-9',
+ \ 'csisolatin5' : 'iso-8859-9',
+ \ 'iso-8859-10' : 'iso-8859-10',
+ \ 'iso-ir-157' : 'iso-8859-10',
+ \ 'l6' : 'iso-8859-10',
+ \ 'iso_8859-10:1992' : 'iso-8859-10',
+ \ 'csisolatin6' : 'iso-8859-10',
+ \ 'latin6' : 'iso-8859-10',
+ \ 'iso-8859-13' : 'iso-8859-13',
+ \ 'iso-8859-14' : 'iso-8859-14',
+ \ 'iso-ir-199' : 'iso-8859-14',
+ \ 'iso_8859-14:1998' : 'iso-8859-14',
+ \ 'iso_8859-14' : 'iso-8859-14',
+ \ 'latin8' : 'iso-8859-14',
+ \ 'iso-celtic' : 'iso-8859-14',
+ \ 'l8' : 'iso-8859-14',
+ \ 'iso-8859-15' : 'iso-8859-15',
+ \ 'iso_8859-15' : 'iso-8859-15',
+ \ 'latin-9' : 'iso-8859-15',
+ \ 'koi8-r' : 'koi8-r',
+ \ 'cskoi8r' : 'koi8-r',
+ \ 'koi8-u' : 'koi8-u',
+ \ 'macintosh' : 'macroman',
+ \ 'mac' : 'macroman',
+ \ 'csmacintosh' : 'macroman',
+ \ 'ibm437' : 'cp437',
+ \ 'cp437' : 'cp437',
+ \ '437' : 'cp437',
+ \ 'cspc8codepage437' : 'cp437',
+ \ 'ibm775' : 'cp775',
+ \ 'cp775' : 'cp775',
+ \ 'cspc775baltic' : 'cp775',
+ \ 'ibm850' : 'cp850',
+ \ 'cp850' : 'cp850',
+ \ '850' : 'cp850',
+ \ 'cspc850multilingual' : 'cp850',
+ \ 'ibm852' : 'cp852',
+ \ 'cp852' : 'cp852',
+ \ '852' : 'cp852',
+ \ 'cspcp852' : 'cp852',
+ \ 'ibm855' : 'cp855',
+ \ 'cp855' : 'cp855',
+ \ '855' : 'cp855',
+ \ 'csibm855' : 'cp855',
+ \ 'ibm857' : 'cp857',
+ \ 'cp857' : 'cp857',
+ \ '857' : 'cp857',
+ \ 'csibm857' : 'cp857',
+ \ 'ibm860' : 'cp860',
+ \ 'cp860' : 'cp860',
+ \ '860' : 'cp860',
+ \ 'csibm860' : 'cp860',
+ \ 'ibm861' : 'cp861',
+ \ 'cp861' : 'cp861',
+ \ '861' : 'cp861',
+ \ 'cp-is' : 'cp861',
+ \ 'csibm861' : 'cp861',
+ \ 'ibm862' : 'cp862',
+ \ 'cp862' : 'cp862',
+ \ '862' : 'cp862',
+ \ 'cspc862latinhebrew' : 'cp862',
+ \ 'ibm863' : 'cp863',
+ \ 'cp863' : 'cp863',
+ \ '863' : 'cp863',
+ \ 'csibm863' : 'cp863',
+ \ 'ibm865' : 'cp865',
+ \ 'cp865' : 'cp865',
+ \ '865' : 'cp865',
+ \ 'csibm865' : 'cp865',
+ \ 'ibm866' : 'cp866',
+ \ 'cp866' : 'cp866',
+ \ '866' : 'cp866',
+ \ 'csibm866' : 'cp866',
+ \ 'ibm869' : 'cp869',
+ \ 'cp869' : 'cp869',
+ \ '869' : 'cp869',
+ \ 'cp-gr' : 'cp869',
+ \ 'csibm869' : 'cp869',
+ \ 'windows-1250' : 'cp1250',
+ \ 'windows-1251' : 'cp1251',
+ \ 'windows-1253' : 'cp1253',
+ \ 'windows-1254' : 'cp1254',
+ \ 'windows-1255' : 'cp1255',
+ \ 'windows-1256' : 'cp1256',
+ \ 'windows-1257' : 'cp1257',
+ \ 'windows-1258' : 'cp1258',
+ \ 'extended_unix_code_packed_format_for_japanese' : 'euc-jp',
+ \ 'cseucpkdfmtjapanese' : 'euc-jp',
+ \ 'euc-jp' : 'euc-jp',
+ \ 'shift_jis' : 'sjis',
+ \ 'ms_kanji' : 'sjis',
+ \ 'sjis' : 'sjis',
+ \ 'csshiftjis' : 'sjis',
+ \ 'ibm-thai' : 'cp874',
+ \ 'csibmthai' : 'cp874',
+ \ 'ks_c_5601-1987' : 'cp949',
+ \ 'iso-ir-149' : 'cp949',
+ \ 'ks_c_5601-1989' : 'cp949',
+ \ 'ksc_5601' : 'cp949',
+ \ 'korean' : 'cp949',
+ \ 'csksc56011987' : 'cp949',
+ \ 'euc-kr' : 'euc-kr',
+ \ 'cseuckr' : 'euc-kr',
+ \ 'gbk' : 'cp936',
+ \ 'cp936' : 'cp936',
+ \ 'ms936' : 'cp936',
+ \ 'windows-936' : 'cp936',
+ \ 'gb_2312-80' : 'euc-cn',
+ \ 'iso-ir-58' : 'euc-cn',
+ \ 'chinese' : 'euc-cn',
+ \ 'csiso58gb231280' : 'euc-cn',
+ \ 'big5' : 'big5',
+ \ 'csbig5' : 'big5',
+ \ 'utf-8' : 'utf-8',
+ \ 'iso-10646-ucs-2' : 'ucs-2',
+ \ 'csunicode' : 'ucs-2',
+ \ 'utf-16' : 'utf-16',
+ \ 'utf-16be' : 'utf-16',
+ \ 'utf-16le' : 'utf-16le',
+ \ 'utf-32' : 'ucs-4',
+ \ 'utf-32be' : 'ucs-4',
+ \ 'utf-32le' : 'ucs-4le',
+ \ 'iso-10646-ucs-4' : 'ucs-4',
+ \ 'csucs4' : 'ucs-4'
+ \ }
+lockvar g:tohtml#charset_to_encoding
+"}}}
+
+func! tohtml#Convert2HTML(line1, line2) "{{{
+ let s:settings = tohtml#GetUserSettings()
+
+ if !&diff || s:settings.diff_one_file "{{{
+ if a:line2 >= a:line1
+ let g:html_start_line = a:line1
+ let g:html_end_line = a:line2
+ else
+ let g:html_start_line = a:line2
+ let g:html_end_line = a:line1
+ endif
+ runtime syntax/2html.vim "}}}
+ else "{{{
+ let win_list = []
+ let buf_list = []
+ windo if &diff | call add(win_list, winbufnr(0)) | endif
+ let s:settings.whole_filler = 1
+ let g:html_diff_win_num = 0
+ for window in win_list
+ " switch to the next buffer to convert
+ exe ":" . bufwinnr(window) . "wincmd w"
+
+ " figure out whether current charset and encoding will work, if not
+ " default to UTF-8
+ if !exists('g:html_use_encoding') &&
+ \ (((&l:fileencoding=='' || (&l:buftype!='' && &l:buftype!=?'help'))
+ \ && &encoding!=?s:settings.vim_encoding)
+ \ || &l:fileencoding!='' && &l:fileencoding!=?s:settings.vim_encoding)
+ echohl WarningMsg
+ echomsg "TOhtml: mismatched file encodings in Diff buffers, using UTF-8"
+ echohl None
+ let s:settings.vim_encoding = 'utf-8'
+ let s:settings.encoding = 'UTF-8'
+ endif
+
+ " set up for diff-mode conversion
+ let g:html_start_line = 1
+ let g:html_end_line = line('$')
+ let g:html_diff_win_num += 1
+
+ " convert this file
+ runtime syntax/2html.vim
+
+ " remember the HTML buffer for later combination
+ call add(buf_list, bufnr('%'))
+ endfor
+ unlet g:html_diff_win_num
+ call tohtml#Diff2HTML(win_list, buf_list)
+ endif "}}}
+
+ unlet g:html_start_line
+ unlet g:html_end_line
+ unlet s:settings
+endfunc "}}}
+
+func! tohtml#Diff2HTML(win_list, buf_list) "{{{
+ let xml_line = ""
+ let tag_close = '>'
+
+ let s:old_paste = &paste
+ set paste
+ let s:old_magic = &magic
+ set magic
+
+ let html = []
+ if !s:settings.no_doc
+ if s:settings.use_xhtml
+ if s:settings.encoding != ""
+ let xml_line = "<?xml version=\"1.0\" encoding=\"" . s:settings.encoding . "\"?>"
+ else
+ let xml_line = "<?xml version=\"1.0\"?>"
+ endif
+ let tag_close = ' />'
+ endif
+
+ let style = [s:settings.use_xhtml ? "" : '-->']
+ let body_line = ''
+
+ let s:html5 = 0
+ if s:settings.use_xhtml
+ call add(html, xml_line)
+ endif
+ if s:settings.use_xhtml
+ call add(html, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
+ call add(html, '<html xmlns="http://www.w3.org/1999/xhtml">')
+ elseif s:settings.use_css && !s:settings.no_pre
+ call add(html, "<!DOCTYPE html>")
+ call add(html, '<html>')
+ let s:html5 = 1
+ else
+ call add(html, '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"')
+ call add(html, ' "http://www.w3.org/TR/html4/loose.dtd">')
+ call add(html, '<html>')
+ endif
+ call add(html, '<head>')
+
+ " include encoding as close to the top as possible, but only if not already
+ " contained in XML information
+ if s:settings.encoding != "" && !s:settings.use_xhtml
+ if s:html5
+ call add(html, '<meta charset="' . s:settings.encoding . '"' . tag_close)
+ else
+ call add(html, "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . s:settings.encoding . '"' . tag_close)
+ endif
+ endif
+
+ call add(html, '<title>diff</title>')
+ call add(html, '<meta name="Generator" content="Vim/'.v:version/100.'.'.v:version%100.'"'.tag_close)
+ call add(html, '<meta name="plugin-version" content="'.g:loaded_2html_plugin.'"'.tag_close)
+ call add(html, '<meta name="settings" content="'.
+ \ join(filter(keys(s:settings),'s:settings[v:val]'),',').
+ \ ',prevent_copy='.s:settings.prevent_copy.
+ \ ',use_input_for_pc='.s:settings.use_input_for_pc.
+ \ '"'.tag_close)
+ call add(html, '<meta name="colorscheme" content="'.
+ \ (exists('g:colors_name')
+ \ ? g:colors_name
+ \ : 'none'). '"'.tag_close)
+
+ call add(html, '</head>')
+ let body_line_num = len(html)
+ call add(html, '<body'.(s:settings.line_ids ? ' onload="JumpToLine();"' : '').'>')
+ endif
+ call add(html, "<table ".(s:settings.use_css? "" : "border='1' width='100%' ")."id='vimCodeElement".s:settings.id_suffix."'>")
+
+ call add(html, '<tr>')
+ for buf in a:win_list
+ call add(html, '<th>'.bufname(buf).'</th>')
+ endfor
+ call add(html, '</tr><tr>')
+
+ let diff_style_start = 0
+ let insert_index = 0
+
+ for buf in a:buf_list
+ let temp = []
+ exe bufwinnr(buf) . 'wincmd w'
+
+ " If text is folded because of user foldmethod settings, etc. we don't want
+ " to act on everything in a fold by mistake.
+ setlocal nofoldenable
+
+ " When not using CSS or when using xhtml, the <body> line can be important.
+ " Assume it will be the same for all buffers and grab it from the first
+ " buffer. Similarly, need to grab the body end line as well.
+ if !s:settings.no_doc
+ if body_line == ''
+ 1
+ call search('<body')
+ let body_line = getline('.')
+ $
+ call search('</body>', 'b')
+ let s:body_end_line = getline('.')
+ endif
+
+ " Grab the style information. Some of this will be duplicated so only insert
+ " it if it's not already there. {{{
+ 1
+ let style_start = search('^<style\( type="text/css"\)\?>')
+ 1
+ let style_end = search('^</style>')
+ if style_start > 0 && style_end > 0
+ let buf_styles = getline(style_start + 1, style_end - 1)
+ for a_style in buf_styles
+ if index(style, a_style) == -1
+ if diff_style_start == 0
+ if a_style =~ '\<Diff\(Change\|Text\|Add\|Delete\)'
+ let diff_style_start = len(style)-1
+ endif
+ endif
+ call insert(style, a_style, insert_index)
+ let insert_index += 1
+ endif
+ endfor
+ endif " }}}
+
+ " everything new will get added before the diff styles so diff highlight
+ " properly overrides normal highlight
+ if diff_style_start != 0
+ let insert_index = diff_style_start
+ endif
+
+ " Delete those parts that are not needed so we can include the rest into the
+ " resulting table.
+ 1,/^<body.*\%(\n<!--.*-->\_s\+.*id='oneCharWidth'.*\_s\+.*id='oneInputWidth'.*\_s\+.*id='oneEmWidth'\)\?\zs/d_
+ $
+ ?</body>?,$d_
+ elseif !s:settings.no_modeline
+ " remove modeline from source files if it is included and we haven't deleted
+ " due to removing html footer already
+ $d
+ endif
+ let temp = getline(1,'$')
+ " clean out id on the main content container because we already set it on
+ " the table
+ let temp[0] = substitute(temp[0], " id='vimCodeElement[^']*'", "", "")
+ " undo deletion of start and end part
+ " so we can later save the file as valid html
+ " TODO: restore using grabbed lines if undolevel is 1?
+ if !s:settings.no_doc
+ normal! 2u
+ elseif !s:settings.no_modeline
+ normal! u
+ endif
+ if s:settings.use_css
+ call add(html, '<td><div>')
+ elseif s:settings.use_xhtml
+ call add(html, '<td nowrap="nowrap" valign="top"><div>')
+ else
+ call add(html, '<td nowrap valign="top"><div>')
+ endif
+ let html += temp
+ call add(html, '</div></td>')
+
+ " Close this buffer
+ " TODO: the comment above says we're going to allow saving the file
+ " later...but here we discard it?
+ quit!
+ endfor
+
+ if !s:settings.no_doc
+ let html[body_line_num] = body_line
+ endif
+
+ call add(html, '</tr>')
+ call add(html, '</table>')
+ if !s:settings.no_doc
+ call add(html, s:body_end_line)
+ call add(html, '</html>')
+ endif
+
+ " The generated HTML is admittedly ugly and takes a LONG time to fold.
+ " Make sure the user doesn't do syntax folding when loading a generated file,
+ " using a modeline.
+ if !s:settings.no_modeline
+ call add(html, '<!-- vim: set foldmethod=manual : -->')
+ endif
+
+ let i = 1
+ let name = "Diff" . (s:settings.use_xhtml ? ".xhtml" : ".html")
+ " Find an unused file name if current file name is already in use
+ while filereadable(name)
+ let name = substitute(name, '\d*\.x\?html$', '', '') . i . '.' . fnamemodify(copy(name), ":t:e")
+ let i += 1
+ endwhile
+
+ let s:ei_sav = &eventignore
+ set eventignore+=FileType
+ exe "topleft new " . name
+ let &eventignore=s:ei_sav
+ unlet s:ei_sav
+
+ setlocal modifiable
+
+ " just in case some user autocmd creates content in the new buffer, make sure
+ " it is empty before proceeding
+ %d
+
+ " set the fileencoding to match the charset we'll be using
+ let &l:fileencoding=s:settings.vim_encoding
+
+ " According to http://www.w3.org/TR/html4/charset.html#doc-char-set, the byte
+ " order mark is highly recommend on the web when using multibyte encodings. But,
+ " it is not a good idea to include it on UTF-8 files. Otherwise, let Vim
+ " determine when it is actually inserted.
+ if s:settings.vim_encoding == 'utf-8'
+ setlocal nobomb
+ else
+ setlocal bomb
+ endif
+
+ call append(0, html)
+
+ if !s:settings.no_doc
+ if len(style) > 0
+ 1
+ let style_start = search('^</head>')-1
+
+ " add required javascript in reverse order so we can just call append again
+ " and again without adjusting {{{
+
+ let s:uses_script = s:settings.dynamic_folds || s:settings.line_ids
+
+ " insert script closing tag if needed
+ if s:uses_script
+ call append(style_start, [
+ \ '',
+ \ s:settings.use_xhtml ? '//]]>' : '-->',
+ \ "</script>"
+ \ ])
+ endif
+
+ " insert javascript to get IDs from line numbers, and to open a fold before
+ " jumping to any lines contained therein
+ if s:settings.line_ids
+ call append(style_start, [
+ \ " /* Always jump to new location even if the line was hidden inside a fold, or",
+ \ " * we corrected the raw number to a line ID.",
+ \ " */",
+ \ " if (lineElem) {",
+ \ " lineElem.scrollIntoView(true);",
+ \ " }",
+ \ " return true;",
+ \ "}",
+ \ "if ('onhashchange' in window) {",
+ \ " window.onhashchange = JumpToLine;",
+ \ "}"
+ \ ])
+
+ if s:settings.dynamic_folds
+ call append(style_start, [
+ \ "",
+ \ " /* navigate upwards in the DOM tree to open all folds containing the line */",
+ \ " var node = lineElem;",
+ \ " while (node && node.id != 'vimCodeElement".s:settings.id_suffix."')",
+ \ " {",
+ \ " if (node.className == 'closed-fold')",
+ \ " {",
+ \ " /* toggle open the fold ID (remove window ID) */",
+ \ " toggleFold(node.id.substr(4));",
+ \ " }",
+ \ " node = node.parentNode;",
+ \ " }",
+ \ ])
+ endif
+ endif
+
+ if s:settings.line_ids
+ call append(style_start, [
+ \ "",
+ \ "/* function to open any folds containing a jumped-to line before jumping to it */",
+ \ "function JumpToLine()",
+ \ "{",
+ \ " var lineNum;",
+ \ " lineNum = window.location.hash;",
+ \ " lineNum = lineNum.substr(1); /* strip off '#' */",
+ \ "",
+ \ " if (lineNum.indexOf('L') == -1) {",
+ \ " lineNum = 'L'+lineNum;",
+ \ " }",
+ \ " if (lineNum.indexOf('W') == -1) {",
+ \ " lineNum = 'W1'+lineNum;",
+ \ " }",
+ \ " var lineElem = document.getElementById(lineNum);"
+ \ ])
+ endif
+
+ " Insert javascript to toggle matching folds open and closed in all windows,
+ " if dynamic folding is active.
+ if s:settings.dynamic_folds
+ call append(style_start, [
+ \ " function toggleFold(objID)",
+ \ " {",
+ \ " for (win_num = 1; win_num <= ".len(a:buf_list)."; win_num++)",
+ \ " {",
+ \ " var fold;",
+ \ ' fold = document.getElementById("win"+win_num+objID);',
+ \ " if(fold.className == 'closed-fold')",
+ \ " {",
+ \ " fold.className = 'open-fold';",
+ \ " }",
+ \ " else if (fold.className == 'open-fold')",
+ \ " {",
+ \ " fold.className = 'closed-fold';",
+ \ " }",
+ \ " }",
+ \ " }",
+ \ ])
+ endif
+
+ if s:uses_script
+ " insert script tag if needed
+ call append(style_start, [
+ \ "<script" . (s:html5 ? "" : " type='text/javascript'") . ">",
+ \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
+ endif
+
+ " Insert styles from all the generated html documents and additional styles
+ " for the table-based layout of the side-by-side diff. The diff should take
+ " up the full browser window (but not more), and be static in size,
+ " horizontally scrollable when the lines are too long. Otherwise, the diff
+ " is pretty useless for really long lines. {{{
+ if s:settings.use_css
+ call append(style_start,
+ \ ['<style' . (s:html5 ? '' : 'type="text/css"') . '>']+
+ \ style+
+ \ [ s:settings.use_xhtml ? '' : '<!--',
+ \ 'table { table-layout: fixed; }',
+ \ 'html, body, table, tbody { width: 100%; margin: 0; padding: 0; }',
+ \ 'table, td, th { border: 1px solid; }',
+ \ 'td { vertical-align: top; }',
+ \ 'th, td { width: '.printf("%.1f",100.0/len(a:win_list)).'%; }',
+ \ 'td div { overflow: auto; }',
+ \ s:settings.use_xhtml ? '' : '-->',
+ \ '</style>'
+ \])
+ endif "}}}
+ endif
+ endif
+
+ let &paste = s:old_paste
+ let &magic = s:old_magic
+endfunc "}}}
+
+" Gets a single user option and sets it in the passed-in Dict, or gives it the
+" default value if the option doesn't actually exist.
+func! tohtml#GetOption(settings, option, default) "{{{
+ if exists('g:html_'.a:option)
+ let a:settings[a:option] = g:html_{a:option}
+ else
+ let a:settings[a:option] = a:default
+ endif
+endfunc "}}}
+
+" returns a Dict containing the values of all user options for 2html, including
+" default values for those not given an explicit value by the user. Discards the
+" html_ prefix of the option for nicer looking code.
+func! tohtml#GetUserSettings() "{{{
+ if exists('s:settings')
+ " just restore the known options if we've already retrieved them
+ return s:settings
+ else
+ " otherwise figure out which options are set
+ let user_settings = {}
+
+ " Define the correct option if the old option name exists and we haven't
+ " already defined the correct one. Maybe I'll put out a warning message about
+ " this sometime and remove the old option entirely at some even later time,
+ " but for now just silently accept the old option.
+ if exists('g:use_xhtml') && !exists("g:html_use_xhtml")
+ let g:html_use_xhtml = g:use_xhtml
+ endif
+
+ " get current option settings with appropriate defaults {{{
+ call tohtml#GetOption(user_settings, 'no_progress', !has("statusline") )
+ call tohtml#GetOption(user_settings, 'diff_one_file', 0 )
+ call tohtml#GetOption(user_settings, 'number_lines', &number )
+ call tohtml#GetOption(user_settings, 'pre_wrap', &wrap )
+ call tohtml#GetOption(user_settings, 'use_css', 1 )
+ call tohtml#GetOption(user_settings, 'ignore_conceal', 0 )
+ call tohtml#GetOption(user_settings, 'ignore_folding', 0 )
+ call tohtml#GetOption(user_settings, 'dynamic_folds', 0 )
+ call tohtml#GetOption(user_settings, 'no_foldcolumn', user_settings.ignore_folding)
+ call tohtml#GetOption(user_settings, 'hover_unfold', 0 )
+ call tohtml#GetOption(user_settings, 'no_pre', 0 )
+ call tohtml#GetOption(user_settings, 'no_doc', 0 )
+ call tohtml#GetOption(user_settings, 'no_links', 0 )
+ call tohtml#GetOption(user_settings, 'no_modeline', 0 )
+ call tohtml#GetOption(user_settings, 'no_invalid', 0 )
+ call tohtml#GetOption(user_settings, 'whole_filler', 0 )
+ call tohtml#GetOption(user_settings, 'use_xhtml', 0 )
+ call tohtml#GetOption(user_settings, 'line_ids', user_settings.number_lines )
+ call tohtml#GetOption(user_settings, 'use_input_for_pc', 'fallback')
+ " }}}
+
+ " override those settings that need it {{{
+
+ " hover opening implies dynamic folding
+ if user_settings.hover_unfold
+ let user_settings.dynamic_folds = 1
+ endif
+
+ " ignore folding overrides dynamic folding
+ if user_settings.ignore_folding && user_settings.dynamic_folds
+ let user_settings.dynamic_folds = 0
+ let user_settings.hover_unfold = 0
+ endif
+
+ " dynamic folding with no foldcolumn implies hover opens
+ if user_settings.dynamic_folds && user_settings.no_foldcolumn
+ let user_settings.hover_unfold = 1
+ endif
+
+ " dynamic folding implies css
+ if user_settings.dynamic_folds
+ let user_settings.use_css = 1
+ else
+ let user_settings.no_foldcolumn = 1 " won't do anything but for consistency and for the test suite
+ endif
+
+ " if we're not using CSS we cannot use a pre section because <font> tags
+ " aren't allowed inside a <pre> block
+ if !user_settings.use_css
+ let user_settings.no_pre = 1
+ endif
+
+ " pre_wrap doesn't do anything if not using pre or not using CSS
+ if user_settings.no_pre || !user_settings.use_css
+ let user_settings.pre_wrap = 0
+ endif
+ "}}}
+
+ " set up expand_tabs option after all the overrides so we know the
+ " appropriate defaults {{{
+ if user_settings.no_pre == 0
+ call tohtml#GetOption(user_settings,
+ \ 'expand_tabs',
+ \ &expandtab || &ts != 8 || &vts != '' || user_settings.number_lines ||
+ \ (user_settings.dynamic_folds && !user_settings.no_foldcolumn))
+ else
+ let user_settings.expand_tabs = 1
+ endif
+ " }}}
+
+ " textual options
+ if exists("g:html_use_encoding") "{{{
+ " user specified the desired MIME charset, figure out proper
+ " 'fileencoding' from it or warn the user if we cannot
+ let user_settings.encoding = g:html_use_encoding
+ let user_settings.vim_encoding = tohtml#EncodingFromCharset(g:html_use_encoding)
+ if user_settings.vim_encoding == ''
+ echohl WarningMsg
+ echomsg "TOhtml: file encoding for"
+ \ g:html_use_encoding
+ \ "unknown, please set 'fileencoding'"
+ echohl None
+ endif
+ else
+ " Figure out proper MIME charset from 'fileencoding' if possible
+ if &l:fileencoding != ''
+ " If the buffer is not a "normal" type, the 'fileencoding' value may not
+ " be trusted; since the buffer should not be written the fileencoding is
+ " not intended to be used.
+ if &l:buftype=='' || &l:buftype==?'help'
+ let user_settings.vim_encoding = &l:fileencoding
+ call tohtml#CharsetFromEncoding(user_settings)
+ else
+ let user_settings.encoding = '' " trigger detection using &encoding
+ endif
+ endif
+
+ " else from 'encoding' if possible
+ if &l:fileencoding == '' || user_settings.encoding == ''
+ let user_settings.vim_encoding = &encoding
+ call tohtml#CharsetFromEncoding(user_settings)
+ endif
+
+ " else default to UTF-8 and warn user
+ if user_settings.encoding == ''
+ let user_settings.vim_encoding = 'utf-8'
+ let user_settings.encoding = 'UTF-8'
+ echohl WarningMsg
+ echomsg "TOhtml: couldn't determine MIME charset, using UTF-8"
+ echohl None
+ endif
+ endif "}}}
+
+ " Default to making nothing uncopyable, because we default to
+ " not-standards way of doing things, and also because Microsoft Word and
+ " others paste the <input> elements anyway.
+ "
+ " html_prevent_copy only has an effect when using CSS.
+ "
+ " All options:
+ " f - fold column
+ " n - line numbers (also within fold text)
+ " t - fold text
+ " d - diff filler
+ " c - concealed text (reserved future)
+ " l - listchars (reserved possible future)
+ " s - signs (reserved possible future)
+ "
+ " Normal text is always selectable.
+ let user_settings.prevent_copy = ""
+ if user_settings.use_css
+ if exists("g:html_prevent_copy")
+ if user_settings.dynamic_folds && !user_settings.no_foldcolumn && g:html_prevent_copy =~# 'f'
+ let user_settings.prevent_copy .= 'f'
+ endif
+ if user_settings.number_lines && g:html_prevent_copy =~# 'n'
+ let user_settings.prevent_copy .= 'n'
+ endif
+ if &diff && g:html_prevent_copy =~# 'd'
+ let user_settings.prevent_copy .= 'd'
+ endif
+ if !user_settings.ignore_folding && g:html_prevent_copy =~# 't'
+ let user_settings.prevent_copy .= 't'
+ endif
+ else
+ let user_settings.prevent_copy = ""
+ endif
+ endif
+ if empty(user_settings.prevent_copy)
+ let user_settings.no_invalid = 0
+ endif
+
+ " enforce valid values for use_input_for_pc
+ if user_settings.use_input_for_pc !~# 'fallback\|none\|all'
+ let user_settings.use_input_for_pc = 'fallback'
+ echohl WarningMsg
+ echomsg '2html: "' . g:html_use_input_for_pc . '" is not valid for g:html_use_input_for_pc'
+ echomsg '2html: defaulting to "' . user_settings.use_input_for_pc . '"'
+ echohl None
+ sleep 3
+ endif
+
+ if exists('g:html_id_expr')
+ let user_settings.id_suffix = eval(g:html_id_expr)
+ if user_settings.id_suffix !~ '^[-_:.A-Za-z0-9]*$'
+ echohl WarningMsg
+ echomsg '2html: g:html_id_expr evaluated to invalid string for HTML id attributes'
+ echomsg '2html: Omitting user-specified suffix'
+ echohl None
+ sleep 3
+ let user_settings.id_suffix=""
+ endif
+ else
+ let user_settings.id_suffix=""
+ endif
+
+ " TODO: font
+
+ return user_settings
+ endif
+endfunc "}}}
+
+" get the proper HTML charset name from a Vim encoding option.
+function! tohtml#CharsetFromEncoding(settings) "{{{
+ let l:vim_encoding = a:settings.vim_encoding
+ if exists('g:html_charset_override') && has_key(g:html_charset_override, l:vim_encoding)
+ let a:settings.encoding = g:html_charset_override[l:vim_encoding]
+ else
+ if l:vim_encoding =~ '^8bit\|^2byte'
+ " 8bit- and 2byte- prefixes are to indicate encodings available on the
+ " system that Vim will convert with iconv(), look up just the encoding name,
+ " not Vim's prefix.
+ let l:vim_encoding = substitute(l:vim_encoding, '^8bit-\|^2byte-', '', '')
+ endif
+ if has_key(g:tohtml#encoding_to_charset, l:vim_encoding)
+ let a:settings.encoding = g:tohtml#encoding_to_charset[l:vim_encoding]
+ else
+ let a:settings.encoding = ""
+ endif
+ endif
+ if a:settings.encoding != ""
+ let l:vim_encoding = tohtml#EncodingFromCharset(a:settings.encoding)
+ if l:vim_encoding != ""
+ " if the Vim encoding to HTML encoding conversion is set up (by default or
+ " by the user) to convert to a different encoding, we need to also change
+ " the Vim encoding of the new buffer
+ let a:settings.vim_encoding = l:vim_encoding
+ endif
+ endif
+endfun "}}}
+
+" Get the proper Vim encoding option setting from an HTML charset name.
+function! tohtml#EncodingFromCharset(encoding) "{{{
+ if exists('g:html_encoding_override') && has_key(g:html_encoding_override, a:encoding)
+ return g:html_encoding_override[a:encoding]
+ elseif has_key(g:tohtml#charset_to_encoding, tolower(a:encoding))
+ return g:tohtml#charset_to_encoding[tolower(a:encoding)]
+ else
+ return ""
+ endif
+endfun "}}}
+
+let &cpo = s:cpo_sav
+unlet s:cpo_sav
+
+" Make sure any patches will probably use consistent indent
+" vim: ts=8 sw=2 sts=2 noet fdm=marker
diff --git a/runtime/autoload/typeset.vim b/runtime/autoload/typeset.vim
new file mode 100644
index 0000000..35cf17b
--- /dev/null
+++ b/runtime/autoload/typeset.vim
@@ -0,0 +1,233 @@
+vim9script
+
+# Language: Generic TeX typesetting engine
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Latest Revision: 2022 Aug 12
+
+# Constants and helpers {{{
+const SLASH = !exists("+shellslash") || &shellslash ? '/' : '\'
+
+def Echo(msg: string, mode: string, label: string)
+ redraw
+ echo "\r"
+ execute 'echohl' mode
+ echomsg printf('[%s] %s', label, msg)
+ echohl None
+enddef
+
+def EchoMsg(msg: string, label = 'Notice')
+ Echo(msg, 'ModeMsg', label)
+enddef
+
+def EchoWarn(msg: string, label = 'Warning')
+ Echo(msg, 'WarningMsg', label)
+enddef
+
+def EchoErr(msg: string, label = 'Error')
+ Echo(msg, 'ErrorMsg', label)
+enddef
+# }}}
+
+# Track jobs {{{
+var running_jobs = {} # Dictionary of job IDs of jobs currently executing
+
+def AddJob(label: string, j: job)
+ if !has_key(running_jobs, label)
+ running_jobs[label] = []
+ endif
+
+ add(running_jobs[label], j)
+enddef
+
+def RemoveJob(label: string, j: job)
+ if has_key(running_jobs, label) && index(running_jobs[label], j) != -1
+ remove(running_jobs[label], index(running_jobs[label], j))
+ endif
+enddef
+
+def GetRunningJobs(label: string): list<job>
+ return has_key(running_jobs, label) ? running_jobs[label] : []
+enddef
+# }}}
+
+# Callbacks {{{
+def ProcessOutput(qfid: number, wd: string, efm: string, ch: channel, msg: string)
+ # Make sure the quickfix list still exists
+ if getqflist({'id': qfid}).id != qfid
+ EchoErr("Quickfix list not found, stopping the job")
+ call job_stop(ch_getjob(ch))
+ return
+ endif
+
+ # Make sure the working directory is correct
+ silent execute "lcd" wd
+ setqflist([], 'a', {'id': qfid, 'lines': [msg], 'efm': efm})
+ silent lcd -
+enddef
+
+def CloseCb(ch: channel)
+ job_status(ch_getjob(ch)) # Trigger exit_cb's callback
+enddef
+
+def ExitCb(label: string, jobid: job, exitStatus: number)
+ RemoveJob(label, jobid)
+
+ if exitStatus == 0
+ botright cwindow
+ EchoMsg('Success!', label)
+ elseif exitStatus < 0
+ EchoWarn('Job terminated', label)
+ else
+ botright copen
+ wincmd p
+ EchoWarn('There are errors.', label)
+ endif
+enddef
+# }}}
+
+# Create a new empty quickfix list at the end of the stack and return its id {{{
+def NewQuickfixList(path: string): number
+ if setqflist([], ' ', {'nr': '$', 'title': path}) == -1
+ return -1
+ endif
+
+ return getqflist({'nr': '$', 'id': 0}).id
+enddef
+# }}}
+
+# Public interface {{{
+# When a TeX document is split into several source files, each source file
+# may contain a "magic line" specifiying the "root" file, e.g.:
+#
+# % !TEX root = main.tex
+#
+# Using this line, Vim can know which file to typeset even if the current
+# buffer is different from main.tex.
+#
+# This function searches for the magic line in the first ten lines of the
+# given buffer, and returns the full path of the root document.
+#
+# NOTE: the value of "% !TEX root" *must* be a relative path.
+export def FindRootDocument(bufname: string = bufname("%")): string
+ const bufnr = bufnr(bufname)
+
+ if !bufexists(bufnr)
+ return bufname
+ endif
+
+ var rootpath = fnamemodify(bufname(bufnr), ':p')
+
+ # Search for magic line `% !TEX root = ...` in the first ten lines
+ const header = getbufline(bufnr, 1, 10)
+ const idx = match(header, '^\s*%\s\+!TEX\s\+root\s*=\s*\S')
+ if idx > -1
+ const main = matchstr(header[idx], '!TEX\s\+root\s*=\s*\zs.*$')
+ rootpath = simplify(fnamemodify(rootpath, ":h") .. SLASH .. main)
+ endif
+
+ return rootpath
+enddef
+
+export def LogPath(bufname: string): string
+ const logfile = FindRootDocument(bufname)
+ return fnamemodify(logfile, ":r") .. ".log"
+enddef
+
+# Typeset the specified path
+#
+# Parameters:
+# label: a descriptive string used in messages to identify the kind of job
+# Cmd: a function that takes the path of a document and returns the typesetting command
+# path: the path of the document to be typeset. To avoid ambiguities, pass a *full* path.
+# efm: the error format string to parse the output of the command.
+# env: environment variables for the process (passed to job_start())
+#
+# Returns:
+# true if the job is started successfully;
+# false otherwise.
+export def Typeset(
+ label: string,
+ Cmd: func(string): list<string>,
+ path: string,
+ efm: string,
+ env: dict<string> = {}
+): bool
+ var fp = fnamemodify(path, ":p")
+ var wd = fnamemodify(fp, ":h")
+ var qfid = NewQuickfixList(fp)
+
+ if qfid == -1
+ EchoErr('Could not create quickfix list', label)
+ return false
+ endif
+
+ if !filereadable(fp)
+ EchoErr(printf('File not readable: %s', fp), label)
+ return false
+ endif
+
+ var jobid = job_start(Cmd(path), {
+ env: env,
+ cwd: wd,
+ in_io: "null",
+ callback: (c, m) => ProcessOutput(qfid, wd, efm, c, m),
+ close_cb: CloseCb,
+ exit_cb: (j, e) => ExitCb(label, j, e),
+ })
+
+ if job_status(jobid) ==# "fail"
+ EchoErr("Failed to start job", label)
+ return false
+ endif
+
+ AddJob(label, jobid)
+
+ EchoMsg('Typesetting...', label)
+
+ return true
+enddef
+
+export def JobStatus(label: string)
+ EchoMsg('Jobs still running: ' .. string(len(GetRunningJobs(label))), label)
+enddef
+
+export def StopJobs(label: string)
+ for job in GetRunningJobs(label)
+ job_stop(job)
+ endfor
+
+ EchoMsg('Done.', label)
+enddef
+
+# Typeset the specified buffer
+#
+# Parameters:
+# name: a buffer's name. this may be empty to indicate the current buffer.
+# cmd: a function that takes the path of a document and returns the typesetting command
+# label: a descriptive string used in messages to identify the kind of job
+# env: environment variables for the process (passed to job_start())
+#
+# Returns:
+# true if the job is started successfully;
+# false otherwise.
+export def TypesetBuffer(
+ name: string,
+ Cmd: func(string): list<string>,
+ env = {},
+ label = 'Typeset'
+): bool
+ const bufname = bufname(name)
+
+ if empty(bufname)
+ EchoErr('Please save the buffer first.', label)
+ return false
+ endif
+
+ const efm = getbufvar(bufnr(bufname), "&efm")
+ const rootpath = FindRootDocument(bufname)
+
+ return Typeset('ConTeXt', Cmd, rootpath, efm, env)
+enddef
+# }}}
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/autoload/vimball.vim b/runtime/autoload/vimball.vim
new file mode 100644
index 0000000..9c7dcbd
--- /dev/null
+++ b/runtime/autoload/vimball.vim
@@ -0,0 +1,775 @@
+" vimball.vim : construct a file containing both paths and files
+" Author: Charles E. Campbell
+" Date: Apr 11, 2016
+" Version: 37
+" GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim
+" Copyright: (c) 2004-2011 by Charles E. Campbell
+" The VIM LICENSE applies to Vimball.vim, and Vimball.txt
+" (see |copyright|) except use "Vimball" instead of "Vim".
+" No warranty, express or implied.
+" *** *** Use At-Your-Own-Risk! *** ***
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_vimball")
+ finish
+endif
+let g:loaded_vimball = "v37"
+if v:version < 702
+ echohl WarningMsg
+ echo "***warning*** this version of vimball needs vim 7.2"
+ echohl Normal
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+"DechoTabOn
+
+" =====================================================================
+" Constants: {{{1
+if !exists("s:USAGE")
+ let s:USAGE = 0
+ let s:WARNING = 1
+ let s:ERROR = 2
+
+ " determine if cygwin is in use or not
+ if !exists("g:netrw_cygwin")
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$'
+ let g:netrw_cygwin= 1
+ else
+ let g:netrw_cygwin= 0
+ endif
+ else
+ let g:netrw_cygwin= 0
+ endif
+ endif
+
+ " set up g:vimball_mkdir if the mkdir() call isn't defined
+ if !exists("*mkdir")
+ if exists("g:netrw_local_mkdir")
+ let g:vimball_mkdir= g:netrw_local_mkdir
+ elseif executable("mkdir")
+ let g:vimball_mkdir= "mkdir"
+ elseif executable("makedir")
+ let g:vimball_mkdir= "makedir"
+ endif
+ if !exists(g:vimball_mkdir)
+ call vimball#ShowMesg(s:WARNING,"(vimball) g:vimball_mkdir undefined")
+ endif
+ endif
+endif
+
+" =====================================================================
+" Functions: {{{1
+
+" ---------------------------------------------------------------------
+" vimball#MkVimball: creates a vimball given a list of paths to files {{{2
+" Input:
+" line1,line2: a range of lines containing paths to files to be included in the vimball
+" writelevel : if true, force a write to filename.vmb, even if it exists
+" (usually accomplished with :MkVimball! ...
+" filename : base name of file to be created (ie. filename.vmb)
+" Output: a filename.vmb using vimball format:
+" path
+" filesize
+" [file]
+" path
+" filesize
+" [file]
+fun! vimball#MkVimball(line1,line2,writelevel,...) range
+" call Dfunc("MkVimball(line1=".a:line1." line2=".a:line2." writelevel=".a:writelevel." vimballname<".a:1.">) a:0=".a:0)
+ if a:1 =~ '\.vim$' || a:1 =~ '\.txt$'
+ let vbname= substitute(a:1,'\.\a\{3}$','.vmb','')
+ else
+ let vbname= a:1
+ endif
+ if vbname !~ '\.vmb$'
+ let vbname= vbname.'.vmb'
+ endif
+" call Decho("vbname<".vbname.">")
+ if !a:writelevel && a:1 =~ '[\/]'
+ call vimball#ShowMesg(s:ERROR,"(MkVimball) vimball name<".a:1."> should not include slashes; use ! to insist")
+" call Dret("MkVimball : vimball name<".a:1."> should not include slashes")
+ return
+ endif
+ if !a:writelevel && filereadable(vbname)
+ call vimball#ShowMesg(s:ERROR,"(MkVimball) file<".vbname."> exists; use ! to insist")
+" call Dret("MkVimball : file<".vbname."> already exists; use ! to insist")
+ return
+ endif
+
+ " user option bypass
+ call vimball#SaveSettings()
+
+ if a:0 >= 2
+ " allow user to specify where to get the files
+ let home= expand(a:2)
+ else
+ " use first existing directory from rtp
+ let home= vimball#VimballHome()
+ endif
+
+ " save current directory
+ let curdir = getcwd()
+ call s:ChgDir(home)
+
+ " record current tab, initialize while loop index
+ let curtabnr = tabpagenr()
+ let linenr = a:line1
+" call Decho("curtabnr=".curtabnr)
+
+ while linenr <= a:line2
+ let svfile = getline(linenr)
+" call Decho("svfile<".svfile.">")
+
+ if !filereadable(svfile)
+ call vimball#ShowMesg(s:ERROR,"unable to read file<".svfile.">")
+ call s:ChgDir(curdir)
+ call vimball#RestoreSettings()
+" call Dret("MkVimball")
+ return
+ endif
+
+ " create/switch to mkvimball tab
+ if !exists("vbtabnr")
+ tabnew
+ sil! file Vimball
+ let vbtabnr= tabpagenr()
+ else
+ exe "tabn ".vbtabnr
+ endif
+
+ let lastline= line("$") + 1
+ if lastline == 2 && getline("$") == ""
+ call setline(1,'" Vimball Archiver by Charles E. Campbell')
+ call setline(2,'UseVimball')
+ call setline(3,'finish')
+ let lastline= line("$") + 1
+ endif
+ call setline(lastline ,substitute(svfile,'$',' [[[1',''))
+ call setline(lastline+1,0)
+
+ " write the file from the tab
+" call Decho("exe $r ".fnameescape(svfile))
+ exe "$r ".fnameescape(svfile)
+
+ call setline(lastline+1,line("$") - lastline - 1)
+" call Decho("lastline=".lastline." line$=".line("$"))
+
+ " restore to normal tab
+ exe "tabn ".curtabnr
+ let linenr= linenr + 1
+ endwhile
+
+ " write the vimball
+ exe "tabn ".vbtabnr
+ call s:ChgDir(curdir)
+ setlocal ff=unix
+ if a:writelevel
+" call Decho("exe w! ".fnameescape(vbname))
+ exe "w! ".fnameescape(vbname)
+ else
+" call Decho("exe w ".fnameescape(vbname))
+ exe "w ".fnameescape(vbname)
+ endif
+" call Decho("Vimball<".vbname."> created")
+ echo "Vimball<".vbname."> created"
+
+ " remove the evidence
+ setlocal nomod bh=wipe
+ exe "tabn ".curtabnr
+ exe "tabc! ".vbtabnr
+
+ " restore options
+ call vimball#RestoreSettings()
+
+" call Dret("MkVimball")
+endfun
+
+" ---------------------------------------------------------------------
+" vimball#Vimball: extract and distribute contents from a vimball {{{2
+" (invoked the the UseVimball command embedded in
+" vimballs' prologue)
+fun! vimball#Vimball(really,...)
+" call Dfunc("vimball#Vimball(really=".a:really.") a:0=".a:0)
+
+ if v:version < 701 || (v:version == 701 && !exists('*fnameescape'))
+ echoerr "your vim is missing the fnameescape() function (pls upgrade to vim 7.2 or later)"
+" call Dret("vimball#Vimball : needs 7.1 with patch 299 or later")
+ return
+ endif
+
+ if getline(1) !~ '^" Vimball Archiver'
+ echoerr "(Vimball) The current file does not appear to be a Vimball!"
+" call Dret("vimball#Vimball")
+ return
+ endif
+
+ " set up standard settings
+ call vimball#SaveSettings()
+ let curtabnr = tabpagenr()
+ let vimballfile = expand("%:tr")
+
+ " set up vimball tab
+" call Decho("setting up vimball tab")
+ tabnew
+ sil! file Vimball
+ let vbtabnr= tabpagenr()
+ let didhelp= ""
+
+ " go to vim plugin home
+ if a:0 > 0
+ " let user specify the directory where the vimball is to be unpacked.
+ " If, however, the user did not specify a full path, set the home to be below the current directory
+ let home= expand(a:1)
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ if home !~ '^\a:[/\\]'
+ let home= getcwd().'/'.a:1
+ endif
+ elseif home !~ '^/'
+ let home= getcwd().'/'.a:1
+ endif
+ else
+ let home= vimball#VimballHome()
+ endif
+" call Decho("home<".home.">")
+
+ " save current directory and remove older same-named vimball, if any
+ let curdir = getcwd()
+" call Decho("home<".home.">")
+" call Decho("curdir<".curdir.">")
+
+ call s:ChgDir(home)
+ let s:ok_unablefind= 1
+ call vimball#RmVimball(vimballfile)
+ unlet s:ok_unablefind
+
+ let linenr = 4
+ let filecnt = 0
+
+ " give title to listing of (extracted) files from Vimball Archive
+ if a:really
+ echohl Title | echomsg "Vimball Archive" | echohl None
+ else
+ echohl Title | echomsg "Vimball Archive Listing" | echohl None
+ echohl Statement | echomsg "files would be placed under: ".home | echohl None
+ endif
+
+ " apportion vimball contents to various files
+" call Decho("exe tabn ".curtabnr)
+ exe "tabn ".curtabnr
+" call Decho("linenr=".linenr." line$=".line("$"))
+ while 1 < linenr && linenr < line("$")
+ let fname = substitute(getline(linenr),'\t\[\[\[1$','','')
+ let fname = substitute(fname,'\\','/','g')
+ let fsize = substitute(getline(linenr+1),'^\(\d\+\).\{-}$','\1','')+0
+ let fenc = substitute(getline(linenr+1),'^\d\+\s*\(\S\{-}\)$','\1','')
+ let filecnt = filecnt + 1
+" call Decho("fname<".fname."> fsize=".fsize." filecnt=".filecnt. " fenc=".fenc)
+
+ if a:really
+ echomsg "extracted <".fname.">: ".fsize." lines"
+ else
+ echomsg "would extract <".fname.">: ".fsize." lines"
+ endif
+" call Decho("using L#".linenr.": will extract file<".fname.">")
+" call Decho("using L#".(linenr+1).": fsize=".fsize)
+
+ " Allow AsNeeded/ directory to take place of plugin/ directory
+ " when AsNeeded/filename is filereadable or was present in VimballRecord
+ if fname =~ '\<plugin/'
+ let anfname= substitute(fname,'\<plugin/','AsNeeded/','')
+ if filereadable(anfname) || (exists("s:VBRstring") && s:VBRstring =~# anfname)
+" call Decho("using anfname<".anfname."> instead of <".fname.">")
+ let fname= anfname
+ endif
+ endif
+
+ " make directories if they don't exist yet
+ if a:really
+" call Decho("making directories if they don't exist yet (fname<".fname.">)")
+ let fnamebuf= substitute(fname,'\\','/','g')
+ let dirpath = substitute(home,'\\','/','g')
+" call Decho("init: fnamebuf<".fnamebuf.">")
+" call Decho("init: dirpath <".dirpath.">")
+ while fnamebuf =~ '/'
+ let dirname = dirpath."/".substitute(fnamebuf,'/.*$','','')
+ let dirpath = dirname
+ let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','')
+" call Decho("dirname<".dirname.">")
+" call Decho("dirpath<".dirpath.">")
+ if !isdirectory(dirname)
+" call Decho("making <".dirname.">")
+ if exists("g:vimball_mkdir")
+ call system(g:vimball_mkdir." ".shellescape(dirname))
+ else
+ call mkdir(dirname)
+ endif
+ call s:RecordInVar(home,"rmdir('".dirname."')")
+ endif
+ endwhile
+ endif
+ call s:ChgDir(home)
+
+ " grab specified qty of lines and place into "a" buffer
+ " (skip over path/filename and qty-lines)
+ let linenr = linenr + 2
+ let lastline = linenr + fsize - 1
+" call Decho("exe ".linenr.",".lastline."yank a")
+ " no point in handling a zero-length file
+ if lastline >= linenr
+ exe "silent ".linenr.",".lastline."yank a"
+
+ " copy "a" buffer into tab
+" call Decho('copy "a buffer into tab#'.vbtabnr)
+ exe "tabn ".vbtabnr
+ setlocal ma
+ sil! %d
+ silent put a
+ 1
+ sil! d
+
+ " write tab to file
+ if a:really
+ let fnamepath= home."/".fname
+" call Decho("exe w! ".fnameescape(fnamepath))
+ if fenc != ""
+ exe "silent w! ++enc=".fnameescape(fenc)." ".fnameescape(fnamepath)
+ else
+ exe "silent w! ".fnameescape(fnamepath)
+ endif
+ echo "wrote ".fnameescape(fnamepath)
+ call s:RecordInVar(home,"call delete('".fnamepath."')")
+ endif
+
+ " return to tab with vimball
+" call Decho("exe tabn ".curtabnr)
+ exe "tabn ".curtabnr
+
+ " 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','')
+" call Decho("didhelp<".didhelp.">")
+ endif
+ endif
+
+ " update for next file
+" call Decho("update linenr= [linenr=".linenr."] + [fsize=".fsize."] = ".(linenr+fsize))
+ let linenr= linenr + fsize
+ endwhile
+
+ " set up help
+" call Decho("about to set up help: didhelp<".didhelp.">")
+ if didhelp != ""
+ let htpath= home."/".didhelp
+" call Decho("exe helptags ".htpath)
+ exe "helptags ".fnameescape(htpath)
+ echo "did helptags"
+ endif
+
+ " make sure a "Press ENTER..." prompt appears to keep the messages showing!
+ while filecnt <= &ch
+ echomsg " "
+ let filecnt= filecnt + 1
+ endwhile
+
+ " record actions in <.VimballRecord>
+ call s:RecordInFile(home)
+
+ " restore events, delete tab and buffer
+ exe "sil! tabn ".vbtabnr
+ setlocal nomod bh=wipe
+ exe "sil! tabn ".curtabnr
+ exe "sil! tabc! ".vbtabnr
+ call vimball#RestoreSettings()
+ call s:ChgDir(curdir)
+
+" call Dret("vimball#Vimball")
+endfun
+
+" ---------------------------------------------------------------------
+" vimball#RmVimball: remove any files, remove any directories made by any {{{2
+" previous vimball extraction based on a file of the current
+" name.
+" Usage: RmVimball (assume current file is a vimball; remove)
+" RmVimball vimballname
+fun! vimball#RmVimball(...)
+" call Dfunc("vimball#RmVimball() a:0=".a:0)
+ if exists("g:vimball_norecord")
+" call Dret("vimball#RmVimball : (g:vimball_norecord)")
+ return
+ endif
+
+ if a:0 == 0
+ let curfile= expand("%:tr")
+" call Decho("case a:0=0: curfile<".curfile."> (used expand(%:tr))")
+ else
+ if a:1 =~ '[\/]'
+ call vimball#ShowMesg(s:USAGE,"RmVimball vimballname [path]")
+" call Dret("vimball#RmVimball : suspect a:1<".a:1.">")
+ return
+ endif
+ let curfile= a:1
+" call Decho("case a:0=".a:0.": curfile<".curfile.">")
+ endif
+ if curfile =~ '\.vmb$'
+ let curfile= substitute(curfile,'\.vmb','','')
+ elseif curfile =~ '\.vba$'
+ let curfile= substitute(curfile,'\.vba','','')
+ endif
+ if a:0 >= 2
+ let home= expand(a:2)
+ else
+ let home= vimball#VimballHome()
+ endif
+ let curdir = getcwd()
+" call Decho("home <".home.">")
+" call Decho("curfile<".curfile.">")
+" call Decho("curdir <".curdir.">")
+
+ call s:ChgDir(home)
+ if filereadable(".VimballRecord")
+" call Decho(".VimballRecord is readable")
+" call Decho("curfile<".curfile.">")
+ keepalt keepjumps 1split
+ sil! keepalt keepjumps e .VimballRecord
+ let keepsrch= @/
+" call Decho('search for ^\M'.curfile.'.\m: ')
+" call Decho('search for ^\M'.curfile.'.\m{vba|vmb}: ')
+" call Decho('search for ^\M'.curfile.'\m[-0-9.]*\.{vba|vmb}: ')
+ if search('^\M'.curfile."\m: ".'cw')
+ let foundit= 1
+ elseif search('^\M'.curfile.".\mvmb: ",'cw')
+ let foundit= 2
+ elseif search('^\M'.curfile.'\m[-0-9.]*\.vmb: ','cw')
+ let foundit= 2
+ elseif search('^\M'.curfile.".\mvba: ",'cw')
+ let foundit= 1
+ elseif search('^\M'.curfile.'\m[-0-9.]*\.vba: ','cw')
+ let foundit= 1
+ else
+ let foundit = 0
+ endif
+ if foundit
+ if foundit == 1
+ let exestring = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vba: ','','')
+ else
+ let exestring = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vmb: ','','')
+ endif
+ let s:VBRstring= substitute(exestring,'call delete(','','g')
+ let s:VBRstring= substitute(s:VBRstring,"[')]",'','g')
+" call Decho("exe ".exestring)
+ sil! keepalt keepjumps exe exestring
+ sil! keepalt keepjumps d
+ let exestring= strlen(substitute(exestring,'call delete(.\{-})|\=',"D","g"))
+" call Decho("exestring<".exestring.">")
+ echomsg "removed ".exestring." files"
+ else
+ let s:VBRstring= ''
+ let curfile = substitute(curfile,'\.vmb','','')
+" call Decho("unable to find <".curfile."> in .VimballRecord")
+ if !exists("s:ok_unablefind")
+ call vimball#ShowMesg(s:WARNING,"(RmVimball) unable to find <".curfile."> in .VimballRecord")
+ endif
+ endif
+ sil! keepalt keepjumps g/^\s*$/d
+ sil! keepalt keepjumps wq!
+ let @/= keepsrch
+ endif
+ call s:ChgDir(curdir)
+
+" call Dret("vimball#RmVimball")
+endfun
+
+" ---------------------------------------------------------------------
+" vimball#Decompress: attempts to automatically decompress vimballs {{{2
+fun! vimball#Decompress(fname,...)
+" call Dfunc("Decompress(fname<".a:fname.">) a:0=".a:0)
+
+ " decompression:
+ if expand("%") =~ '.*\.gz' && executable("gunzip")
+ " handle *.gz with gunzip
+ silent exe "!gunzip ".shellescape(a:fname)
+ if v:shell_error != 0
+ call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) gunzip may have failed with <".a:fname.">")
+ endif
+ let fname= substitute(a:fname,'\.gz$','','')
+ exe "e ".escape(fname,' \')
+ if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
+
+ elseif expand("%") =~ '.*\.gz' && executable("gzip")
+ " handle *.gz with gzip -d
+ silent exe "!gzip -d ".shellescape(a:fname)
+ if v:shell_error != 0
+ call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "gzip -d" may have failed with <'.a:fname.">")
+ endif
+ let fname= substitute(a:fname,'\.gz$','','')
+ exe "e ".escape(fname,' \')
+ if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
+
+ elseif expand("%") =~ '.*\.bz2' && executable("bunzip2")
+ " handle *.bz2 with bunzip2
+ silent exe "!bunzip2 ".shellescape(a:fname)
+ if v:shell_error != 0
+ call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip2 may have failed with <".a:fname.">")
+ endif
+ let fname= substitute(a:fname,'\.bz2$','','')
+ exe "e ".escape(fname,' \')
+ if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
+
+ elseif expand("%") =~ '.*\.bz2' && executable("bzip2")
+ " handle *.bz2 with bzip2 -d
+ silent exe "!bzip2 -d ".shellescape(a:fname)
+ if v:shell_error != 0
+ call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip2 -d" may have failed with <'.a:fname.">")
+ endif
+ let fname= substitute(a:fname,'\.bz2$','','')
+ exe "e ".escape(fname,' \')
+ if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
+
+ elseif expand("%") =~ '.*\.zip' && executable("unzip")
+ " handle *.zip with unzip
+ silent exe "!unzip ".shellescape(a:fname)
+ if v:shell_error != 0
+ call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) unzip may have failed with <".a:fname.">")
+ endif
+ let fname= substitute(a:fname,'\.zip$','','')
+ exe "e ".escape(fname,' \')
+ if a:0 == 0| call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") | endif
+ endif
+
+ if a:0 == 0| setlocal noma bt=nofile fmr=[[[,]]] fdm=marker | endif
+
+" call Dret("Decompress")
+endfun
+
+" ---------------------------------------------------------------------
+" vimball#ShowMesg: {{{2
+fun! vimball#ShowMesg(level,msg)
+" call Dfunc("vimball#ShowMesg(level=".a:level." msg<".a:msg.">)")
+
+ let rulerkeep = &ruler
+ let showcmdkeep = &showcmd
+ set noruler noshowcmd
+ redraw!
+
+ if &fo =~# '[ta]'
+ echomsg "***vimball*** ".a:msg
+ else
+ if a:level == s:WARNING || a:level == s:USAGE
+ echohl WarningMsg
+ elseif a:level == s:ERROR
+ echohl Error
+ endif
+ echomsg "***vimball*** ".a:msg
+ echohl None
+ endif
+
+ if a:level != s:USAGE
+ call inputsave()|let ok= input("Press <cr> to continue")|call inputrestore()
+ endif
+
+ let &ruler = rulerkeep
+ let &showcmd = showcmdkeep
+
+" call Dret("vimball#ShowMesg")
+endfun
+" =====================================================================
+" s:ChgDir: change directory (in spite of Windoze) {{{2
+fun! s:ChgDir(newdir)
+" call Dfunc("ChgDir(newdir<".a:newdir.">)")
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+ try
+ exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g'))
+ catch /^Vim\%((\a\+)\)\=:E/
+ call mkdir(fnameescape(substitute(a:newdir,'/','\\','g')))
+ exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g'))
+ endtry
+ else
+ try
+ exe 'silent cd '.fnameescape(a:newdir)
+ catch /^Vim\%((\a\+)\)\=:E/
+ call mkdir(fnameescape(a:newdir))
+ exe 'silent cd '.fnameescape(a:newdir)
+ endtry
+ endif
+" call Dret("ChgDir : curdir<".getcwd().">")
+endfun
+
+" ---------------------------------------------------------------------
+" s:RecordInVar: record a un-vimball command in the .VimballRecord file {{{2
+fun! s:RecordInVar(home,cmd)
+" call Dfunc("RecordInVar(home<".a:home."> cmd<".a:cmd.">)")
+ if a:cmd =~ '^rmdir'
+" if !exists("s:recorddir")
+" let s:recorddir= substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
+" else
+" let s:recorddir= s:recorddir."|".substitute(a:cmd,'^rmdir',"call s:Rmdir",'')
+" endif
+ elseif !exists("s:recordfile")
+ let s:recordfile= a:cmd
+ else
+ let s:recordfile= s:recordfile."|".a:cmd
+ endif
+" call Dret("RecordInVar : s:recordfile<".(exists("s:recordfile")? s:recordfile : "")."> s:recorddir<".(exists("s:recorddir")? s:recorddir : "").">")
+endfun
+
+" ---------------------------------------------------------------------
+" s:RecordInFile: {{{2
+fun! s:RecordInFile(home)
+" call Dfunc("s:RecordInFile()")
+ if exists("g:vimball_norecord")
+" call Dret("s:RecordInFile : g:vimball_norecord")
+ return
+ endif
+
+ if exists("s:recordfile") || exists("s:recorddir")
+ let curdir= getcwd()
+ call s:ChgDir(a:home)
+ keepalt keepjumps 1split
+
+ let cmd= expand("%:tr").": "
+" call Decho("cmd<".cmd.">")
+
+ sil! keepalt keepjumps e .VimballRecord
+ setlocal ma
+ $
+ if exists("s:recordfile") && exists("s:recorddir")
+ let cmd= cmd.s:recordfile."|".s:recorddir
+ elseif exists("s:recorddir")
+ let cmd= cmd.s:recorddir
+ elseif exists("s:recordfile")
+ let cmd= cmd.s:recordfile
+ else
+" call Dret("s:RecordInFile : neither recordfile nor recorddir exist")
+ return
+ endif
+" call Decho("cmd<".cmd.">")
+
+ " put command into buffer, write .VimballRecord `file
+ keepalt keepjumps put=cmd
+ sil! keepalt keepjumps g/^\s*$/d
+ sil! keepalt keepjumps wq!
+ call s:ChgDir(curdir)
+
+ if exists("s:recorddir")
+" call Decho("unlet s:recorddir<".s:recorddir.">")
+ unlet s:recorddir
+ endif
+ if exists("s:recordfile")
+" call Decho("unlet s:recordfile<".s:recordfile.">")
+ unlet s:recordfile
+ endif
+ else
+" call Decho("s:record[file|dir] doesn't exist")
+ endif
+
+" call Dret("s:RecordInFile")
+endfun
+
+" ---------------------------------------------------------------------
+" vimball#VimballHome: determine/get home directory path (usually from rtp) {{{2
+fun! vimball#VimballHome()
+" call Dfunc("vimball#VimballHome()")
+ if exists("g:vimball_home")
+ let home= g:vimball_home
+ else
+ " go to vim plugin home
+ for home in split(&rtp,',') + ['']
+ if isdirectory(home) && filewritable(home) | break | endif
+ let basehome= substitute(home,'[/\\]\.vim$','','')
+ if isdirectory(basehome) && filewritable(basehome)
+ let home= basehome."/.vim"
+ break
+ endif
+ endfor
+ if home == ""
+ " just pick the first directory
+ let home= substitute(&rtp,',.*$','','')
+ endif
+ if (has("win32") || has("win95") || has("win64") || has("win16"))
+ let home= substitute(home,'/','\\','g')
+ endif
+ endif
+ " insure that the home directory exists
+" call Decho("picked home<".home.">")
+ if !isdirectory(home)
+ if exists("g:vimball_mkdir")
+" call Decho("home<".home."> isn't a directory -- making it now with g:vimball_mkdir<".g:vimball_mkdir.">")
+" call Decho("system(".g:vimball_mkdir." ".shellescape(home).")")
+ call system(g:vimball_mkdir." ".shellescape(home))
+ else
+" call Decho("home<".home."> isn't a directory -- making it now with mkdir()")
+ call mkdir(home)
+ endif
+ endif
+" call Dret("vimball#VimballHome <".home.">")
+ return home
+endfun
+
+" ---------------------------------------------------------------------
+" vimball#SaveSettings: {{{2
+fun! vimball#SaveSettings()
+" call Dfunc("SaveSettings()")
+ let s:makeep = getpos("'a")
+ let s:regakeep= @a
+ if exists("+acd")
+ let s:acdkeep = &acd
+ endif
+ let s:eikeep = &ei
+ let s:fenkeep = &l:fen
+ let s:hidkeep = &hidden
+ let s:ickeep = &ic
+ let s:lzkeep = &lz
+ let s:pmkeep = &pm
+ let s:repkeep = &report
+ let s:vekeep = &ve
+ let s:ffkeep = &l:ff
+ let s:swfkeep = &l:swf
+ if exists("+acd")
+ setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf
+ else
+ setlocal ei=all ve=all nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf
+ endif
+ " vimballs should be in unix format
+ setlocal ff=unix
+" call Dret("SaveSettings")
+endfun
+
+" ---------------------------------------------------------------------
+" vimball#RestoreSettings: {{{2
+fun! vimball#RestoreSettings()
+" call Dfunc("RestoreSettings()")
+ let @a = s:regakeep
+ if exists("+acd")
+ let &acd = s:acdkeep
+ endif
+ let &l:fen = s:fenkeep
+ let &hidden = s:hidkeep
+ let &ic = s:ickeep
+ let &lz = s:lzkeep
+ let &pm = s:pmkeep
+ let &report = s:repkeep
+ let &ve = s:vekeep
+ let &ei = s:eikeep
+ let &l:ff = s:ffkeep
+ if s:makeep[0] != 0
+ " restore mark a
+" call Decho("restore mark-a: makeep=".string(makeep))
+ call setpos("'a",s:makeep)
+ endif
+ if exists("+acd")
+ unlet s:acdkeep
+ endif
+ unlet s:regakeep s:eikeep s:fenkeep s:hidkeep s:ickeep s:repkeep s:vekeep s:makeep s:lzkeep s:pmkeep s:ffkeep
+" call Dret("RestoreSettings")
+endfun
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" ---------------------------------------------------------------------
+" Modelines: {{{1
+" vim: fdm=marker
diff --git a/runtime/autoload/xml/html32.vim b/runtime/autoload/xml/html32.vim
new file mode 100644
index 0000000..242f52b
--- /dev/null
+++ b/runtime/autoload/xml/html32.vim
@@ -0,0 +1,383 @@
+let g:xmldata_html32 = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Aring', 'Atilde', 'Auml', 'Ccedil', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Euml', 'Iacute', 'Icirc', 'Igrave', 'Iuml', 'Ntilde', 'Oacute', 'Ocirc', 'Ograve', 'Oslash', 'Otilde', 'Ouml', 'THORN', 'Uacute', 'Ucirc', 'Ugrave', 'Uuml', 'Yacute', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'amp', 'aring', 'atilde', 'auml', 'brvbar', 'ccedil', 'cedil', 'cent', 'copy', 'curren', 'deg', 'divide', 'eacute', 'ecirc', 'egrave', 'eth', 'euml', 'frac12', 'frac14', 'frac34', 'gt', 'iacute', 'icirc', 'iexcl', 'igrave', 'iquest', 'iuml', 'laquo', 'lt', 'macr', 'micro', 'middot', 'nbsp', 'not', 'ntilde', 'oacute', 'ocirc', 'ograve', 'ordf', 'ordm', 'oslash', 'otilde', 'ouml', 'para', 'plusmn', 'pound', 'raquo', 'reg', 'sect', 'shy', 'sup1', 'sup2', 'sup3', 'szlig', 'thorn', 'times', 'uacute', 'ucirc', 'ugrave', 'uml', 'uuml', 'yacute', 'yen', 'yuml'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'rel': [], 'href': [], 'name': [], 'rev': [], 'title': []}
+\ ],
+\ 'address': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p'],
+\ { }
+\ ],
+\ 'applet': [
+\ ['param', 'tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'width': [], 'vspace': [], 'alt': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'name': [], 'height': [], 'hspace': [], 'codebase': [], 'code': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'alt': [], 'coords': [], 'nohref': ['BOOL'], 'href': [], 'shape': ['rect', 'circle', 'poly']}
+\ ],
+\ 'b': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'base': [
+\ [],
+\ { 'href': []}
+\ ],
+\ 'basefont': [
+\ [],
+\ { 'size': []}
+\ ],
+\ 'big': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'blockquote': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p', 'ul', 'ol', 'dir', 'menu', 'pre', 'xmp', 'listing', 'dl', 'div', 'center', 'blockquote', 'form', 'isindex', 'hr', 'table', 'address'],
+\ { }
+\ ],
+\ 'body': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p', 'ul', 'ol', 'dir', 'menu', 'pre', 'xmp', 'listing', 'dl', 'div', 'center', 'blockquote', 'form', 'isindex', 'hr', 'table', 'address'],
+\ { 'link': [], 'vlink': [], 'background': [], 'alink': [], 'bgcolor': [], 'text': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'clear': ['none', 'left', 'all', 'right', 'none']}
+\ ],
+\ 'caption': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'align': ['top', 'bottom']}
+\ ],
+\ 'center': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p', 'ul', 'ol', 'dir', 'menu', 'pre', 'xmp', 'listing', 'dl', 'div', 'center', 'blockquote', 'form', 'isindex', 'hr', 'table', 'address'],
+\ { }
+\ ],
+\ 'cite': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'code': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'dd': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p', 'ul', 'ol', 'dir', 'menu', 'pre', 'xmp', 'listing', 'dl', 'div', 'center', 'blockquote', 'form', 'isindex', 'hr', 'table'],
+\ { }
+\ ],
+\ 'dfn': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'dir': [
+\ ['li'],
+\ { 'compact': ['BOOL']}
+\ ],
+\ 'div': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p', 'ul', 'ol', 'dir', 'menu', 'pre', 'xmp', 'listing', 'dl', 'div', 'center', 'blockquote', 'form', 'isindex', 'hr', 'table', 'address'],
+\ { 'align': ['left', 'center', 'right']}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'compact': ['BOOL']}
+\ ],
+\ 'dt': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'em': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'font': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'size': [], 'color': []}
+\ ],
+\ 'form': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p', 'ul', 'ol', 'dir', 'menu', 'pre', 'xmp', 'listing', 'dl', 'div', 'center', 'blockquote', 'isindex', 'hr', 'table', 'address'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'action': [], 'method': ['GET', 'POST']}
+\ ],
+\ 'h1': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'align': ['left', 'center', 'right']}
+\ ],
+\ 'h2': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'align': ['left', 'center', 'right']}
+\ ],
+\ 'h3': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'align': ['left', 'center', 'right']}
+\ ],
+\ 'h4': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'align': ['left', 'center', 'right']}
+\ ],
+\ 'h5': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'align': ['left', 'center', 'right']}
+\ ],
+\ 'h6': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'align': ['left', 'center', 'right']}
+\ ],
+\ 'head': [
+\ ['title', 'isindex', 'base', 'script', 'style', 'meta', 'link'],
+\ { }
+\ ],
+\ 'hr': [
+\ [],
+\ { 'width': [], 'align': ['left', 'right', 'center'], 'size': [], 'noshade': ['BOOL']}
+\ ],
+\ 'html': [
+\ ['head', 'body', 'plaintext'],
+\ { 'version': ['-//W3C//DTD HTML 3.2 Final//EN']}
+\ ],
+\ 'i': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'vspace': [], 'alt': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'usemap': [], 'ismap': ['BOOL'], 'src': [], 'height': [], 'border': [], 'hspace': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'maxlength': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'value': [], 'src': [], 'name': [], 'size': [], 'checked': ['BOOL'], 'type': ['TEXT', 'PASSWORD', 'CHECKBOX', 'RADIO', 'SUBMIT', 'RESET', 'FILE', 'IMAGE']}
+\ ],
+\ 'isindex': [
+\ [],
+\ { 'prompt': []}
+\ ],
+\ 'kbd': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'li': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p', 'ul', 'ol', 'dir', 'menu', 'pre', 'xmp', 'listing', 'dl', 'div', 'center', 'blockquote', 'form', 'isindex', 'hr', 'table'],
+\ { 'value': [], 'type': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'href': [], 'rev': [], 'title': []}
+\ ],
+\ 'listing': [
+\ [],
+\ { }
+\ ],
+\ 'map': [
+\ ['area'],
+\ { 'name': []}
+\ ],
+\ 'menu': [
+\ ['li'],
+\ { 'compact': ['BOOL']}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'name': [], 'content': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'compact': ['BOOL'], 'type': [], 'start': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'value': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'align': ['left', 'center', 'right']}
+\ ],
+\ 'param': [
+\ [],
+\ { 'value': [], 'name': []}
+\ ],
+\ 'plaintext': [
+\ [],
+\ { }
+\ ],
+\ 'pre': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'applet', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { 'width': ['#implied']}
+\ ],
+\ 'samp': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'script': [
+\ [],
+\ { }
+\ ],
+\ 'select': [
+\ ['option'],
+\ { 'name': [], 'size': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'strike': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'strong': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'style': [
+\ [],
+\ { }
+\ ],
+\ 'sub': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'sup': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'table': [
+\ ['caption', 'tr'],
+\ { 'width': [], 'align': ['left', 'center', 'right'], 'border': [], 'cellspacing': [], 'cellpadding': []}
+\ ],
+\ 'td': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p', 'ul', 'ol', 'dir', 'menu', 'pre', 'xmp', 'listing', 'dl', 'div', 'center', 'blockquote', 'form', 'isindex', 'hr', 'table', 'address'],
+\ { 'width': [], 'align': ['left', 'center', 'right'], 'nowrap': ['BOOL'], 'valign': ['top', 'middle', 'bottom'], 'height': [], 'rowspan': ['1'], 'colspan': ['1']}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'name': [], 'rows': [], 'cols': []}
+\ ],
+\ 'th': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea', 'p', 'ul', 'ol', 'dir', 'menu', 'pre', 'xmp', 'listing', 'dl', 'div', 'center', 'blockquote', 'form', 'isindex', 'hr', 'table', 'address'],
+\ { 'width': [], 'align': ['left', 'center', 'right'], 'nowrap': ['BOOL'], 'valign': ['top', 'middle', 'bottom'], 'height': [], 'rowspan': ['1'], 'colspan': ['1']}
+\ ],
+\ 'title': [
+\ [''],
+\ { }
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'align': ['left', 'center', 'right'], 'valign': ['top', 'middle', 'bottom']}
+\ ],
+\ 'tt': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'u': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'compact': ['BOOL'], 'type': ['disc', 'square', 'circle']}
+\ ],
+\ 'var': [
+\ ['tt', 'i', 'b', 'u', 'strike', 'big', 'small', 'sub', 'sup', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'a', 'img', 'applet', 'font', 'basefont', 'br', 'script', 'map', 'input', 'select', 'textarea'],
+\ { }
+\ ],
+\ 'xmp': [
+\ [],
+\ { }
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'basefont': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'isindex': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/html401f.vim b/runtime/autoload/xml/html401f.vim
new file mode 100644
index 0000000..1797a5a
--- /dev/null
+++ b/runtime/autoload/xml/html401f.vim
@@ -0,0 +1,468 @@
+let g:xmldata_html401t = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'rel': [], 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'target': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'acronym': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button', 'p'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'applet': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'width': [], 'object': [], 'id': [], 'code': [], 'vspace': [], 'archive': [], 'alt': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'style': [], 'name': [], 'height': [], 'hspace': [], 'title': [], 'class': [], 'codebase': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'target': [], 'nohref': ['BOOL'], 'onfocus': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'alt': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'shape': ['rect', 'circle', 'poly', 'default'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'b': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'target': [], 'href': []}
+\ ],
+\ 'basefont': [
+\ [],
+\ { 'size': [], 'face': [], 'color': [], 'id': []}
+\ ],
+\ 'bdo': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'big': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del'],
+\ { 'vlink': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'alink': [], 'onkeyup': [], 'bgcolor': [], 'text': [], 'onmouseup': [], 'id': [], 'link': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'background': [], 'onunload': [], 'onkeypress': [], 'onmousedown': [], 'onload': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'clear': ['none', 'left', 'all', 'right', 'none'], 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'hr', 'table', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo'],
+\ { 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'tabindex': [], 'value': [], 'name': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'center': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dir': [
+\ ['li'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'font': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'size': [], 'face': [], 'color': [], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'form': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'onsubmit': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'target': [], 'onkeyup': [], 'onmouseup': [], 'onreset': [], 'id': [], 'method': ['GET', 'POST'], 'onmouseover': [], 'lang': [], 'accept': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h1': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h2': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h3': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h4': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h5': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h6': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'head': [
+\ ['title', 'isindex', 'base', 'script', 'style', 'meta', 'link', 'object'],
+\ { 'profile': [], 'dir': ['ltr', 'rtl'], 'lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'size': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'noshade': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'html': [
+\ ['head', 'frameset'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'xml:lang': []}
+\ ],
+\ 'frameset': [
+\ ['frameset', 'frame', 'noframes'],
+\ { 'rows': [], 'cols': [], 'id': [], 'style': [], 'onunload': [], 'onload': [], 'class': [], 'title': []}
+\ ],
+\ 'frame': [
+\ [],
+\ { 'scrolling': ['auto', 'yes', 'no', 'auto'], 'noresize': ['BOOL'], 'marginwidth': [], 'id': [], 'marginheight': [], 'longdesc': [], 'src': [], 'style': [], 'name': [], 'frameborder': ['1', '0'], 'title': [], 'class': []}
+\ ],
+\ 'i': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'iframe': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'width': [], 'scrolling': ['auto', 'yes', 'no', 'auto'], 'marginwidth': [], 'id': [], 'marginheight': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'longdesc': [], 'src': [], 'style': [], 'name': [], 'height': [], 'frameborder': ['1', '0'], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'usemap': [], 'ismap': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'vspace': [], 'onmouseover': [], 'alt': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'src': [], 'longdesc': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'height': [], 'border': [], 'hspace': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'value': [], 'src': [], 'name': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'type': ['TEXT', 'PASSWORD', 'CHECKBOX', 'RADIO', 'SUBMIT', 'RESET', 'FILE', 'IMAGE', 'BUTTON'], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'usemap': [], 'ismap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'maxlength': [], 'onselect': [], 'tabindex': [], 'accept': [], 'alt': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ins': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'cite': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'isindex': [
+\ [],
+\ { 'id': [], 'lang': [], 'prompt': [], 'class': [], 'title': [], 'dir': ['ltr', 'rtl'], 'style': []}
+\ ],
+\ 'kbd': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'label': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'for': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'legend': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'li': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'ondblclick': [], 'onkeydown': [], 'target': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'map': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'area'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'menu': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'content': [], 'lang': [], 'name': [], 'scheme': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'noframes': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'noscript': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'object': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'name': [], 'data': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'width': [], 'usemap': [], 'dir': ['ltr', 'rtl'], 'vspace': [], 'tabindex': [], 'standby': [], 'archive': [], 'classid': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'height': [], 'border': [], 'codetype': [], 'hspace': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'start': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'id': [], 'value': [], 'name': [], 'type': [], 'valuetype': ['DATA', 'REF', 'OBJECT']}
+\ ],
+\ 'pre': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'br', 'script', 'map', 'q', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'width': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'q': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'cite': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 's': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'samp': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'script': [
+\ [],
+\ { 'src': [], 'for': [], 'charset': [], 'event': [], 'type': [], 'defer': ['BOOL'], 'language': []}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'span': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strike': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strong': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'style': [
+\ [],
+\ { 'media': [], 'lang': [], 'type': [], 'title': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'sub': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'sup': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'datapagesize': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'summary': [], 'bgcolor': [], 'cellspacing': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'border': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'td': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'char': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'ondblclick': [], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'rows': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onselect': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'th': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'char': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'lang': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'tt': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'u': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': ['disc', 'square', 'circle'], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'var': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'basefont': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'isindex': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/html401s.vim b/runtime/autoload/xml/html401s.vim
new file mode 100644
index 0000000..37f581b
--- /dev/null
+++ b/runtime/autoload/xml/html401s.vim
@@ -0,0 +1,410 @@
+let g:xmldata_html401s = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'rel': [], 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onkeydown': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'name': [], 'style': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'acronym': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'nohref': ['BOOL'], 'onfocus': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'alt': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'shape': ['rect', 'circle', 'poly', 'default'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'b': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'href': []}
+\ ],
+\ 'bdo': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'big': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'script', 'ins', 'del'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onunload': [], 'onkeypress': [], 'onmousedown': [], 'onload': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'hr', 'table', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo'],
+\ { 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'tabindex': [], 'value': [], 'name': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'form': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'hr', 'table', 'fieldset', 'address', 'script'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'onsubmit': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'onreset': [], 'id': [], 'method': ['GET', 'POST'], 'onmouseover': [], 'lang': [], 'accept': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h1': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h2': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h3': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h4': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h5': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h6': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'head': [
+\ ['title', 'base', 'script', 'style', 'meta', 'link', 'object'],
+\ { 'profile': [], 'dir': ['ltr', 'rtl'], 'lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'html': [
+\ ['head', 'body'],
+\ { 'dir': ['ltr', 'rtl'], 'lang': []}
+\ ],
+\ 'i': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'usemap': [], 'ismap': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'alt': [], 'lang': [], 'src': [], 'longdesc': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'height': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'src': [], 'name': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'type': ['TEXT', 'PASSWORD', 'CHECKBOX', 'RADIO', 'SUBMIT', 'RESET', 'FILE', 'IMAGE', 'BUTTON'], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'usemap': [], 'ismap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'maxlength': [], 'onselect': [], 'accept': [], 'alt': [], 'tabindex': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ins': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'cite': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'kbd': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'label': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'for': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'legend': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'li': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'map': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'area'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'content': [], 'lang': [], 'name': [], 'scheme': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'noscript': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'object': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'data': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'width': [], 'usemap': [], 'dir': ['ltr', 'rtl'], 'archive': [], 'standby': [], 'tabindex': [], 'classid': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'codetype': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'id': [], 'value': [], 'name': [], 'type': [], 'valuetype': ['DATA', 'REF', 'OBJECT']}
+\ ],
+\ 'pre': [
+\ ['tt', 'i', 'b', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'br', 'script', 'map', 'q', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'q': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'cite': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'samp': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'script': [
+\ [],
+\ { 'src': [], 'for': [], 'charset': [], 'event': [], 'type': [], 'defer': ['BOOL']}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'span': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strong': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'style': [
+\ [],
+\ { 'media': [], 'lang': [], 'type': [], 'title': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'sub': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'sup': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'datapagesize': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'summary': [], 'cellspacing': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'border': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'td': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'headers': [], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'ondblclick': [], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'rows': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onselect': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'th': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'headers': [], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'lang': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'tt': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'var': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/html401t.vim b/runtime/autoload/xml/html401t.vim
new file mode 100644
index 0000000..ae6c63f
--- /dev/null
+++ b/runtime/autoload/xml/html401t.vim
@@ -0,0 +1,460 @@
+let g:xmldata_html401t = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'rel': [], 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'target': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'acronym': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button', 'p'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'applet': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'width': [], 'object': [], 'id': [], 'code': [], 'vspace': [], 'archive': [], 'alt': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'style': [], 'name': [], 'height': [], 'hspace': [], 'title': [], 'class': [], 'codebase': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'target': [], 'nohref': ['BOOL'], 'onfocus': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'alt': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'shape': ['rect', 'circle', 'poly', 'default'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'b': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'target': [], 'href': []}
+\ ],
+\ 'basefont': [
+\ [],
+\ { 'size': [], 'face': [], 'color': [], 'id': []}
+\ ],
+\ 'bdo': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'big': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del'],
+\ { 'vlink': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'alink': [], 'onkeyup': [], 'bgcolor': [], 'text': [], 'onmouseup': [], 'id': [], 'link': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'background': [], 'onunload': [], 'onkeypress': [], 'onmousedown': [], 'onload': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'clear': ['none', 'left', 'all', 'right', 'none'], 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'hr', 'table', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo'],
+\ { 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'tabindex': [], 'value': [], 'name': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'center': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dir': [
+\ ['li'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'font': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'size': [], 'face': [], 'color': [], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'form': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'onsubmit': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'target': [], 'onkeyup': [], 'onmouseup': [], 'onreset': [], 'id': [], 'method': ['GET', 'POST'], 'onmouseover': [], 'lang': [], 'accept': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h1': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h2': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h3': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h4': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h5': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h6': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'head': [
+\ ['title', 'isindex', 'base', 'script', 'style', 'meta', 'link', 'object'],
+\ { 'profile': [], 'dir': ['ltr', 'rtl'], 'lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'size': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'noshade': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'html': [
+\ ['head', 'body'],
+\ { 'dir': ['ltr', 'rtl'], 'lang': [], 'version': ['-//W3C//DTD HTML 4.01 Transitional//EN']}
+\ ],
+\ 'i': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'iframe': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'width': [], 'scrolling': ['auto', 'yes', 'no', 'auto'], 'marginwidth': [], 'id': [], 'marginheight': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'longdesc': [], 'src': [], 'style': [], 'name': [], 'height': [], 'frameborder': ['1', '0'], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'usemap': [], 'ismap': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'vspace': [], 'onmouseover': [], 'alt': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'src': [], 'longdesc': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'height': [], 'border': [], 'hspace': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'value': [], 'src': [], 'name': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'type': ['TEXT', 'PASSWORD', 'CHECKBOX', 'RADIO', 'SUBMIT', 'RESET', 'FILE', 'IMAGE', 'BUTTON'], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'usemap': [], 'ismap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'maxlength': [], 'onselect': [], 'tabindex': [], 'accept': [], 'alt': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ins': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'cite': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'isindex': [
+\ [],
+\ { 'id': [], 'lang': [], 'prompt': [], 'class': [], 'title': [], 'dir': ['ltr', 'rtl'], 'style': []}
+\ ],
+\ 'kbd': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'label': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'for': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'legend': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'li': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'ondblclick': [], 'onkeydown': [], 'target': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'map': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'area'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'menu': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'content': [], 'lang': [], 'name': [], 'scheme': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'noframes': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'noscript': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'object': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'name': [], 'data': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'width': [], 'usemap': [], 'dir': ['ltr', 'rtl'], 'vspace': [], 'tabindex': [], 'standby': [], 'archive': [], 'classid': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'height': [], 'border': [], 'codetype': [], 'hspace': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'start': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'id': [], 'value': [], 'name': [], 'type': [], 'valuetype': ['DATA', 'REF', 'OBJECT']}
+\ ],
+\ 'pre': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'br', 'script', 'map', 'q', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'width': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'q': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'cite': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 's': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'samp': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'script': [
+\ [],
+\ { 'src': [], 'for': [], 'charset': [], 'event': [], 'type': [], 'defer': ['BOOL'], 'language': []}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'span': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strike': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strong': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'style': [
+\ [],
+\ { 'media': [], 'lang': [], 'type': [], 'title': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'sub': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'sup': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'datapagesize': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'summary': [], 'bgcolor': [], 'cellspacing': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'border': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'td': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'char': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'ondblclick': [], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'rows': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onselect': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'th': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'char': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'lang': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'tt': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'u': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': ['disc', 'square', 'circle'], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'var': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'basefont': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'isindex': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/html40f.vim b/runtime/autoload/xml/html40f.vim
new file mode 100644
index 0000000..b5ba99f
--- /dev/null
+++ b/runtime/autoload/xml/html40f.vim
@@ -0,0 +1,468 @@
+let g:xmldata_html40t = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'rel': [], 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'target': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'acronym': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button', 'p'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'applet': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'width': [], 'object': [], 'id': [], 'code': [], 'vspace': [], 'archive': [], 'alt': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'style': [], 'name': [], 'height': [], 'hspace': [], 'title': [], 'class': [], 'codebase': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'target': [], 'nohref': ['BOOL'], 'onfocus': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'alt': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'shape': ['rect', 'circle', 'poly', 'default'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'b': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'target': [], 'href': []}
+\ ],
+\ 'basefont': [
+\ [],
+\ { 'size': [], 'face': [], 'color': [], 'id': []}
+\ ],
+\ 'bdo': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'big': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del'],
+\ { 'vlink': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'alink': [], 'onkeyup': [], 'bgcolor': [], 'text': [], 'onmouseup': [], 'id': [], 'link': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'background': [], 'onunload': [], 'onkeypress': [], 'onmousedown': [], 'onload': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'clear': ['none', 'left', 'all', 'right', 'none'], 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'hr', 'table', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo'],
+\ { 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'tabindex': [], 'value': [], 'name': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'center': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dir': [
+\ ['li'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'font': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'size': [], 'face': [], 'color': [], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'form': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'onsubmit': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'target': [], 'onkeyup': [], 'onmouseup': [], 'onreset': [], 'id': [], 'method': ['GET', 'POST'], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h1': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h2': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h3': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h4': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h5': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h6': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'head': [
+\ ['title', 'isindex', 'base', 'script', 'style', 'meta', 'link', 'object'],
+\ { 'profile': [], 'dir': ['ltr', 'rtl'], 'lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'size': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'noshade': ['BOOL'], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'html': [
+\ ['head', 'frameset'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'xml:lang': []}
+\ ],
+\ 'frameset': [
+\ ['frameset', 'frame', 'noframes'],
+\ { 'rows': [], 'cols': [], 'id': [], 'style': [], 'onunload': [], 'onload': [], 'class': [], 'title': []}
+\ ],
+\ 'frame': [
+\ [],
+\ { 'scrolling': ['auto', 'yes', 'no', 'auto'], 'noresize': ['BOOL'], 'marginwidth': [], 'id': [], 'marginheight': [], 'longdesc': [], 'src': [], 'style': [], 'name': [], 'frameborder': ['1', '0'], 'title': [], 'class': []}
+\ ],
+\ 'i': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'iframe': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'width': [], 'scrolling': ['auto', 'yes', 'no', 'auto'], 'marginwidth': [], 'id': [], 'marginheight': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'longdesc': [], 'src': [], 'style': [], 'name': [], 'height': [], 'frameborder': ['1', '0'], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'usemap': [], 'ismap': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'vspace': [], 'onmouseover': [], 'alt': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'src': [], 'longdesc': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'border': [], 'hspace': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'value': [], 'src': [], 'name': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'type': ['TEXT', 'PASSWORD', 'CHECKBOX', 'RADIO', 'SUBMIT', 'RESET', 'FILE', 'IMAGE', 'BUTTON'], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'usemap': [], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'maxlength': [], 'onselect': [], 'accept': [], 'alt': [], 'tabindex': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ins': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'cite': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'isindex': [
+\ [],
+\ { 'id': [], 'lang': [], 'prompt': [], 'class': [], 'title': [], 'dir': ['ltr', 'rtl'], 'style': []}
+\ ],
+\ 'kbd': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'label': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'for': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'legend': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'li': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'ondblclick': [], 'onkeydown': [], 'target': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'map': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'area'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'menu': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'content': [], 'lang': [], 'name': [], 'scheme': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'noframes': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'noscript': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'object': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'name': [], 'data': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'width': [], 'usemap': [], 'dir': ['ltr', 'rtl'], 'vspace': [], 'tabindex': [], 'standby': [], 'archive': [], 'classid': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'height': [], 'border': [], 'codetype': [], 'hspace': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'start': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'id': [], 'value': [], 'name': [], 'type': [], 'valuetype': ['DATA', 'REF', 'OBJECT']}
+\ ],
+\ 'pre': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'br', 'script', 'map', 'q', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'width': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'q': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'cite': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 's': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'samp': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'script': [
+\ [],
+\ { 'src': [], 'for': [], 'charset': [], 'event': [], 'type': [], 'defer': ['BOOL'], 'language': []}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'span': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strike': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strong': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'style': [
+\ [],
+\ { 'media': [], 'lang': [], 'type': [], 'title': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'sub': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'sup': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'datapagesize': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'summary': [], 'bgcolor': [], 'cellspacing': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'border': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'td': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'char': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'ondblclick': [], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'rows': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onselect': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'th': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'char': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'lang': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'tt': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'u': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': ['disc', 'square', 'circle'], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'var': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'basefont': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'isindex': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/html40s.vim b/runtime/autoload/xml/html40s.vim
new file mode 100644
index 0000000..bb3a45b
--- /dev/null
+++ b/runtime/autoload/xml/html40s.vim
@@ -0,0 +1,410 @@
+let g:xmldata_html40s = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'rel': [], 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onkeydown': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'name': [], 'style': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'acronym': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'nohref': ['BOOL'], 'onfocus': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'alt': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'shape': ['rect', 'circle', 'poly', 'default'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'b': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'href': []}
+\ ],
+\ 'bdo': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'big': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'script', 'ins', 'del'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onunload': [], 'onkeypress': [], 'onmousedown': [], 'onload': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'hr', 'table', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo'],
+\ { 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'tabindex': [], 'value': [], 'name': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'form': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'hr', 'table', 'fieldset', 'address', 'script'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'onsubmit': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'onreset': [], 'id': [], 'method': ['GET', 'POST'], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h1': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h2': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h3': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h4': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h5': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h6': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'head': [
+\ ['title', 'base', 'script', 'style', 'meta', 'link', 'object'],
+\ { 'profile': [], 'dir': ['ltr', 'rtl'], 'lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'html': [
+\ ['head', 'body'],
+\ { 'dir': ['ltr', 'rtl'], 'lang': []}
+\ ],
+\ 'i': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'usemap': [], 'ismap': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'alt': [], 'lang': [], 'src': [], 'longdesc': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'src': [], 'name': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'type': ['TEXT', 'PASSWORD', 'CHECKBOX', 'RADIO', 'SUBMIT', 'RESET', 'FILE', 'IMAGE', 'BUTTON'], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'usemap': [], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'maxlength': [], 'onselect': [], 'accept': [], 'alt': [], 'tabindex': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ins': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'cite': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'kbd': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'label': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'for': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'legend': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'li': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'map': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'area'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'content': [], 'lang': [], 'name': [], 'scheme': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'noscript': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'object': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'data': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'width': [], 'usemap': [], 'dir': ['ltr', 'rtl'], 'archive': [], 'standby': [], 'tabindex': [], 'classid': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'codetype': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'id': [], 'value': [], 'name': [], 'type': [], 'valuetype': ['DATA', 'REF', 'OBJECT']}
+\ ],
+\ 'pre': [
+\ ['tt', 'i', 'b', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'br', 'script', 'map', 'q', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'q': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'cite': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'samp': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'script': [
+\ [],
+\ { 'src': [], 'for': [], 'charset': [], 'event': [], 'type': [], 'defer': ['BOOL']}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'span': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strong': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'style': [
+\ [],
+\ { 'media': [], 'lang': [], 'type': [], 'title': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'sub': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'sup': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'datapagesize': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'summary': [], 'cellspacing': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'border': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'td': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'headers': [], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'ondblclick': [], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'rows': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onselect': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'th': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'pre', 'dl', 'div', 'noscript', 'blockquote', 'form', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'headers': [], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'lang': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'tt': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'var': [
+\ ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'object', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/html40t.vim b/runtime/autoload/xml/html40t.vim
new file mode 100644
index 0000000..2d73246
--- /dev/null
+++ b/runtime/autoload/xml/html40t.vim
@@ -0,0 +1,460 @@
+let g:xmldata_html40t = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'rel': [], 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'target': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'acronym': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button', 'p'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'applet': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'width': [], 'object': [], 'id': [], 'code': [], 'vspace': [], 'archive': [], 'alt': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'style': [], 'name': [], 'height': [], 'hspace': [], 'title': [], 'class': [], 'codebase': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'target': [], 'nohref': ['BOOL'], 'onfocus': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'alt': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'shape': ['rect', 'circle', 'poly', 'default'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'b': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'target': [], 'href': []}
+\ ],
+\ 'basefont': [
+\ [],
+\ { 'size': [], 'face': [], 'color': [], 'id': []}
+\ ],
+\ 'bdo': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'big': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del'],
+\ { 'vlink': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'alink': [], 'onkeyup': [], 'bgcolor': [], 'text': [], 'onmouseup': [], 'id': [], 'link': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'background': [], 'onunload': [], 'onkeypress': [], 'onmousedown': [], 'onload': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'clear': ['none', 'left', 'all', 'right', 'none'], 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'hr', 'table', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo'],
+\ { 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'tabindex': [], 'value': [], 'name': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'center': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dir': [
+\ ['li'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'font': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'dir': ['ltr', 'rtl'], 'size': [], 'face': [], 'color': [], 'id': [], 'lang': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'form': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'onsubmit': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'target': [], 'onkeyup': [], 'onmouseup': [], 'onreset': [], 'id': [], 'method': ['GET', 'POST'], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h1': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h2': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h3': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h4': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h5': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h6': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'head': [
+\ ['title', 'isindex', 'base', 'script', 'style', 'meta', 'link', 'object'],
+\ { 'profile': [], 'dir': ['ltr', 'rtl'], 'lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'size': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'noshade': ['BOOL'], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'html': [
+\ ['head', 'body'],
+\ { 'dir': ['ltr', 'rtl'], 'lang': [], 'version': ['-//W3C//DTD HTML 4.0 Transitional//EN']}
+\ ],
+\ 'i': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'iframe': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'width': [], 'scrolling': ['auto', 'yes', 'no', 'auto'], 'marginwidth': [], 'id': [], 'marginheight': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'longdesc': [], 'src': [], 'style': [], 'name': [], 'height': [], 'frameborder': ['1', '0'], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'usemap': [], 'ismap': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'vspace': [], 'onmouseover': [], 'alt': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'src': [], 'longdesc': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'border': [], 'hspace': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'value': [], 'src': [], 'name': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'type': ['TEXT', 'PASSWORD', 'CHECKBOX', 'RADIO', 'SUBMIT', 'RESET', 'FILE', 'IMAGE', 'BUTTON'], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'usemap': [], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'maxlength': [], 'onselect': [], 'accept': [], 'alt': [], 'tabindex': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ins': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'cite': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'isindex': [
+\ [],
+\ { 'id': [], 'lang': [], 'prompt': [], 'class': [], 'title': [], 'dir': ['ltr', 'rtl'], 'style': []}
+\ ],
+\ 'kbd': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'label': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'for': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'legend': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'li': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'ondblclick': [], 'onkeydown': [], 'target': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'map': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'area'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'menu': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'content': [], 'lang': [], 'name': [], 'scheme': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'noframes': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'noscript': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'object': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'name': [], 'data': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'width': [], 'usemap': [], 'dir': ['ltr', 'rtl'], 'vspace': [], 'tabindex': [], 'standby': [], 'archive': [], 'classid': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'height': [], 'border': [], 'codetype': [], 'hspace': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'start': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'id': [], 'value': [], 'name': [], 'type': [], 'valuetype': ['DATA', 'REF', 'OBJECT']}
+\ ],
+\ 'pre': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'br', 'script', 'map', 'q', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'width': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'q': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'cite': [], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 's': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'samp': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'script': [
+\ [],
+\ { 'src': [], 'for': [], 'charset': [], 'event': [], 'type': [], 'defer': ['BOOL'], 'language': []}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'span': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strike': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'strong': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'style': [
+\ [],
+\ { 'media': [], 'lang': [], 'type': [], 'title': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'sub': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'sup': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'datapagesize': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'summary': [], 'bgcolor': [], 'cellspacing': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'border': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'td': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'char': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'ondblclick': [], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'rows': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onselect': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'th': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dir', 'menu', 'pre', 'dl', 'div', 'center', 'noscript', 'noframes', 'blockquote', 'form', 'isindex', 'hr', 'table', 'fieldset', 'address', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'height': [], 'char': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'lang': [], 'dir': ['ltr', 'rtl']}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'char': []}
+\ ],
+\ 'tt': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'u': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': ['disc', 'square', 'circle'], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': []}
+\ ],
+\ 'var': [
+\ ['tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'a', 'img', 'applet', 'object', 'font', 'basefont', 'br', 'script', 'map', 'q', 'sub', 'sup', 'span', 'bdo', 'iframe', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'basefont': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'isindex': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/xhtml10f.vim b/runtime/autoload/xml/xhtml10f.vim
new file mode 100644
index 0000000..0bfa30c
--- /dev/null
+++ b/runtime/autoload/xml/xhtml10f.vim
@@ -0,0 +1,469 @@
+let g:xmldata_xhtml10f = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'accesskey': [], 'rel': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'target': [], 'onfocus': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'charset': [], 'xml:lang': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'acronym': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script', 'p'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'applet': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'width': [], 'object': [], 'id': [], 'code': [], 'vspace': [], 'archive': [], 'alt': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'style': [], 'name': [], 'height': [], 'hspace': [], 'title': [], 'class': [], 'codebase': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'nohref': ['BOOL'], 'target': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'alt': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'b': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'target': [], 'href': [], 'id': []}
+\ ],
+\ 'basefont': [
+\ [],
+\ { 'size': [], 'face': [], 'color': [], 'id': []}
+\ ],
+\ 'bdo': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'big': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'vlink': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'alink': [], 'onkeyup': [], 'bgcolor': [], 'text': [], 'onmouseup': [], 'id': [], 'link': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'background': [], 'xml:lang': [], 'onunload': [], 'onkeypress': [], 'onmousedown': [], 'onload': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'clear': ['none', 'left', 'all', 'right', 'none'], 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'table', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'noscript', 'ins', 'del', 'script'],
+\ { 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'value': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'center': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dir': [
+\ ['li'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'font': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'dir': ['ltr', 'rtl'], 'size': [], 'face': [], 'color': [], 'id': [], 'lang': [], 'style': [], 'xml:lang': [], 'title': [], 'class': []}
+\ ],
+\ 'form': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'onsubmit': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'target': [], 'onkeyup': [], 'onmouseup': [], 'onreset': [], 'id': [], 'method': ['get', 'post'], 'onmouseover': [], 'lang': [], 'accept': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'xml:lang': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'frame': [
+\ [],
+\ { 'scrolling': ['auto', 'yes', 'no', 'auto'], 'noresize': ['BOOL'], 'marginwidth': [], 'id': [], 'marginheight': [], 'longdesc': [], 'src': [], 'style': [], 'name': [], 'frameborder': ['1', '0'], 'title': [], 'class': []}
+\ ],
+\ 'frameset': [
+\ ['frameset', 'frame', 'noframes'],
+\ { 'rows': [], 'cols': [], 'id': [], 'style': [], 'onunload': [], 'onload': [], 'class': [], 'title': []}
+\ ],
+\ 'h1': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h2': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h3': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h4': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h5': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h6': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'head': [
+\ ['script', 'style', 'meta', 'link', 'object', 'isindex', 'title', 'script', 'style', 'meta', 'link', 'object', 'isindex', 'base', 'script', 'style', 'meta', 'link', 'object', 'isindex', 'base', 'script', 'style', 'meta', 'link', 'object', 'isindex', 'title', 'script', 'style', 'meta', 'link', 'object', 'isindex'],
+\ { 'profile': [], 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'xml:lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'size': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'noshade': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'html': [
+\ ['head', 'frameset'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'xml:lang': []}
+\ ],
+\ 'i': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'iframe': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'width': [], 'scrolling': ['auto', 'yes', 'no', 'auto'], 'marginwidth': [], 'id': [], 'marginheight': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'longdesc': [], 'src': [], 'style': [], 'name': [], 'height': [], 'frameborder': ['1', '0'], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'usemap': [], 'ismap': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'vspace': [], 'onmouseover': [], 'alt': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'src': [], 'longdesc': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'xml:lang': [], 'height': [], 'border': [], 'hspace': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'value': [], 'src': [], 'name': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['text', 'password', 'checkbox', 'radio', 'submit', 'reset', 'file', 'hidden', 'image', 'button'], 'accesskey': [], 'disabled': ['BOOL'], 'usemap': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'size': [], 'onfocus': [], 'maxlength': [], 'onselect': [], 'accept': [], 'tabindex': [], 'alt': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'ins': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'cite': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'isindex': [
+\ [],
+\ { 'id': [], 'lang': [], 'prompt': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'xml:lang': []}
+\ ],
+\ 'kbd': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'label': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'for': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'legend': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'li': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'ondblclick': [], 'onkeydown': [], 'target': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'map': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'noscript', 'ins', 'del', 'script', 'area'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'onclick': [], 'title': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmouseout': [], 'onmousemove': [], 'xml:lang': []}
+\ ],
+\ 'menu': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'content': [], 'id': [], 'lang': [], 'name': [], 'scheme': [], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'noframes': [
+\ ['body'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'noscript': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'object': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'name': [], 'data': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'width': [], 'usemap': [], 'dir': ['ltr', 'rtl'], 'vspace': [], 'tabindex': [], 'standby': [], 'archive': [], 'classid': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'height': [], 'xml:lang': [], 'border': [], 'codetype': [], 'hspace': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'start': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'id': [], 'value': [], 'name': [], 'type': [], 'valuetype': ['data', 'ref', 'object']}
+\ ],
+\ 'pre': [
+\ ['a', 'br', 'span', 'bdo', 'tt', 'i', 'b', 'u', 's', 'strike', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'xml:space': ['preserve'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'q': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'cite': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 's': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'samp': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'script': [
+\ [''],
+\ { 'id': [], 'src': [], 'charset': [], 'xml:space': ['preserve'], 'type': ['text/javascript'], 'defer': ['BOOL'], 'language': []}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'span': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'strike': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'strong': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'style': [
+\ [''],
+\ { 'media': [], 'id': [], 'lang': [], 'xml:space': ['preserve'], 'title': [], 'type': ['text/css'], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'sub': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'sup': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody', 'tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'summary': [], 'bgcolor': [], 'cellspacing': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'border': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'td': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'height': [], 'char': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'ondblclick': [], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'rows': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onselect': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'th': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'height': [], 'char': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'id': [], 'lang': [], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'tt': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'u': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': ['disc', 'square', 'circle'], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'var': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'basefont': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'frame': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'isindex': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/xhtml10s.vim b/runtime/autoload/xml/xhtml10s.vim
new file mode 100644
index 0000000..3fb7cf8
--- /dev/null
+++ b/runtime/autoload/xml/xhtml10s.vim
@@ -0,0 +1,410 @@
+let g:xmldata_xhtml10s = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'accesskey': [], 'rel': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onkeydown': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'name': [], 'style': [], 'charset': [], 'xml:lang': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'acronym': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'nohref': ['BOOL'], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'alt': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'b': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'href': [], 'id': []}
+\ ],
+\ 'bdo': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'big': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onunload': [], 'onkeypress': [], 'onmousedown': [], 'onload': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'table', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'noscript', 'ins', 'del', 'script'],
+\ { 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'value': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'form': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'noscript', 'ins', 'del', 'script'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'onsubmit': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'onreset': [], 'id': [], 'method': ['get', 'post'], 'onmouseover': [], 'lang': [], 'accept': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h1': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h2': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h3': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h4': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h5': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h6': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'head': [
+\ ['script', 'style', 'meta', 'link', 'object', 'title', 'script', 'style', 'meta', 'link', 'object', 'base', 'script', 'style', 'meta', 'link', 'object', 'base', 'script', 'style', 'meta', 'link', 'object', 'title', 'script', 'style', 'meta', 'link', 'object'],
+\ { 'profile': [], 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'xml:lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'html': [
+\ ['head', 'body'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'xml:lang': []}
+\ ],
+\ 'i': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'usemap': [], 'ismap': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'alt': [], 'lang': [], 'src': [], 'longdesc': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'height': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'src': [], 'name': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['text', 'password', 'checkbox', 'radio', 'submit', 'reset', 'file', 'hidden', 'image', 'button'], 'accesskey': [], 'disabled': ['BOOL'], 'usemap': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'size': [], 'onfocus': [], 'maxlength': [], 'onselect': [], 'accept': [], 'tabindex': [], 'alt': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'ins': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'cite': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'kbd': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'label': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'for': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'legend': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'li': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'map': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'noscript', 'ins', 'del', 'script', 'area'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'onclick': [], 'title': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmouseout': [], 'onmousemove': [], 'xml:lang': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'content': [], 'id': [], 'lang': [], 'name': [], 'scheme': [], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'noscript': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'object': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'data': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'width': [], 'usemap': [], 'dir': ['ltr', 'rtl'], 'archive': [], 'standby': [], 'tabindex': [], 'classid': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'height': [], 'codetype': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'id': [], 'value': [], 'name': [], 'type': [], 'valuetype': ['data', 'ref', 'object']}
+\ ],
+\ 'pre': [
+\ ['a', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'br', 'span', 'bdo', 'map', 'ins', 'del', 'script', 'input', 'select', 'textarea', 'label', 'button'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'xml:space': ['preserve'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'q': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'cite': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'samp': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'script': [
+\ [''],
+\ { 'id': [], 'src': [], 'charset': [], 'xml:space': ['preserve'], 'type': ['text/javascript'], 'defer': ['BOOL']}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'span': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'strong': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'style': [
+\ [''],
+\ { 'media': [], 'id': [], 'lang': [], 'xml:space': ['preserve'], 'title': [], 'type': ['text/css'], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'sub': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'sup': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody', 'tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'summary': [], 'cellspacing': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'border': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'td': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'headers': [], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'ondblclick': [], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'rows': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onselect': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'th': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'pre', 'hr', 'blockquote', 'address', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'headers': [], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'id': [], 'lang': [], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'tt': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'var': [
+\ ['a', 'br', 'span', 'bdo', 'map', 'object', 'img', 'tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/xhtml10t.vim b/runtime/autoload/xml/xhtml10t.vim
new file mode 100644
index 0000000..0e857ac
--- /dev/null
+++ b/runtime/autoload/xml/xhtml10t.vim
@@ -0,0 +1,460 @@
+let g:xmldata_xhtml10t = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'accesskey': [], 'rel': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'target': [], 'onfocus': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'charset': [], 'xml:lang': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'acronym': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script', 'p'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'applet': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'width': [], 'object': [], 'id': [], 'code': [], 'vspace': [], 'archive': [], 'alt': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'style': [], 'name': [], 'height': [], 'hspace': [], 'title': [], 'class': [], 'codebase': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'nohref': ['BOOL'], 'target': [], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'alt': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'b': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'target': [], 'href': [], 'id': []}
+\ ],
+\ 'basefont': [
+\ [],
+\ { 'size': [], 'face': [], 'color': [], 'id': []}
+\ ],
+\ 'bdo': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'big': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'vlink': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'alink': [], 'onkeyup': [], 'bgcolor': [], 'text': [], 'onmouseup': [], 'id': [], 'link': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'background': [], 'xml:lang': [], 'onunload': [], 'onkeypress': [], 'onmousedown': [], 'onload': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'clear': ['none', 'left', 'all', 'right', 'none'], 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'table', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'noscript', 'ins', 'del', 'script'],
+\ { 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onkeydown': [], 'onfocus': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'lang': [], 'value': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'center': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dir': [
+\ ['li'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'font': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'dir': ['ltr', 'rtl'], 'size': [], 'face': [], 'color': [], 'id': [], 'lang': [], 'style': [], 'xml:lang': [], 'title': [], 'class': []}
+\ ],
+\ 'form': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'enctype': ['application/x-www-form-urlencoded'], 'onsubmit': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'target': [], 'onkeyup': [], 'onmouseup': [], 'onreset': [], 'id': [], 'method': ['get', 'post'], 'onmouseover': [], 'lang': [], 'accept': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'xml:lang': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h1': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h2': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h3': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h4': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h5': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h6': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'head': [
+\ ['script', 'style', 'meta', 'link', 'object', 'isindex', 'title', 'script', 'style', 'meta', 'link', 'object', 'isindex', 'base', 'script', 'style', 'meta', 'link', 'object', 'isindex', 'base', 'script', 'style', 'meta', 'link', 'object', 'isindex', 'title', 'script', 'style', 'meta', 'link', 'object', 'isindex'],
+\ { 'profile': [], 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'xml:lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'size': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right'], 'lang': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'noshade': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'html': [
+\ ['head', 'body'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'dir': ['ltr', 'rtl'], 'id': [], 'lang': [], 'xml:lang': []}
+\ ],
+\ 'i': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'iframe': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'width': [], 'scrolling': ['auto', 'yes', 'no', 'auto'], 'marginwidth': [], 'id': [], 'marginheight': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'longdesc': [], 'src': [], 'style': [], 'name': [], 'height': [], 'frameborder': ['1', '0'], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'width': [], 'usemap': [], 'ismap': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'vspace': [], 'onmouseover': [], 'alt': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'src': [], 'longdesc': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'xml:lang': [], 'height': [], 'border': [], 'hspace': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'input': [
+\ [],
+\ { 'ondblclick': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'value': [], 'src': [], 'name': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['text', 'password', 'checkbox', 'radio', 'submit', 'reset', 'file', 'hidden', 'image', 'button'], 'accesskey': [], 'disabled': ['BOOL'], 'usemap': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'size': [], 'onfocus': [], 'maxlength': [], 'onselect': [], 'accept': [], 'tabindex': [], 'alt': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'ins': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'cite': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'isindex': [
+\ [],
+\ { 'id': [], 'lang': [], 'prompt': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'xml:lang': []}
+\ ],
+\ 'kbd': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'label': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'for': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'legend': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['top', 'bottom', 'left', 'right'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'li': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'rel': [], 'ondblclick': [], 'onkeydown': [], 'target': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'charset': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'map': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'noscript', 'ins', 'del', 'script', 'area'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'onclick': [], 'title': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmouseout': [], 'onmousemove': [], 'xml:lang': []}
+\ ],
+\ 'menu': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'http-equiv': [], 'content': [], 'id': [], 'lang': [], 'name': [], 'scheme': [], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'noframes': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'noscript': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'object': [
+\ ['param', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['top', 'middle', 'bottom', 'left', 'right'], 'name': [], 'data': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'width': [], 'usemap': [], 'dir': ['ltr', 'rtl'], 'vspace': [], 'tabindex': [], 'standby': [], 'archive': [], 'classid': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'height': [], 'xml:lang': [], 'border': [], 'codetype': [], 'hspace': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': [], 'class': [], 'title': [], 'onclick': [], 'start': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'value': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify'], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'id': [], 'value': [], 'name': [], 'type': [], 'valuetype': ['data', 'ref', 'object']}
+\ ],
+\ 'pre': [
+\ ['a', 'br', 'span', 'bdo', 'tt', 'i', 'b', 'u', 's', 'strike', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'xml:space': ['preserve'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'q': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'cite': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 's': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'samp': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'script': [
+\ [''],
+\ { 'id': [], 'src': [], 'charset': [], 'xml:space': ['preserve'], 'type': ['text/javascript'], 'defer': ['BOOL'], 'language': []}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'disabled': ['BOOL'], 'dir': ['ltr', 'rtl'], 'size': [], 'onblur': [], 'onfocus': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'span': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'strike': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'strong': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'style': [
+\ [''],
+\ { 'media': [], 'id': [], 'lang': [], 'xml:space': ['preserve'], 'title': [], 'type': ['text/css'], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'sub': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'sup': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody', 'tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'summary': [], 'bgcolor': [], 'cellspacing': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'border': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'td': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'height': [], 'char': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'ondblclick': [], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onchange': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'name': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'accesskey': [], 'disabled': ['BOOL'], 'rows': [], 'dir': ['ltr', 'rtl'], 'onblur': [], 'onfocus': [], 'onselect': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'th': [
+\ ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'ul', 'ol', 'dl', 'menu', 'dir', 'pre', 'hr', 'blockquote', 'address', 'center', 'noframes', 'isindex', 'fieldset', 'table', 'form', 'a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'noscript', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'axis': [], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'lang': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'width': [], 'headers': [], 'nowrap': ['BOOL'], 'dir': ['ltr', 'rtl'], 'rowspan': ['1'], 'colspan': ['1'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'height': [], 'char': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'id': [], 'lang': [], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'lang': [], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'bgcolor': [], 'charoff': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': []}
+\ ],
+\ 'tt': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'u': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'compact': ['BOOL'], 'onmouseover': [], 'lang': [], 'onkeypress': [], 'onmousedown': [], 'type': ['disc', 'square', 'circle'], 'class': [], 'title': [], 'onclick': [], 'dir': ['ltr', 'rtl'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': []}
+\ ],
+\ 'var': [
+\ ['a', 'br', 'span', 'bdo', 'object', 'applet', 'img', 'map', 'iframe', 'tt', 'i', 'b', 'u', 's', 'strike', 'big', 'small', 'font', 'basefont', 'em', 'strong', 'dfn', 'code', 'q', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script'],
+\ { 'ondblclick': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': [], 'dir': ['ltr', 'rtl'], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'basefont': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'isindex': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/xhtml11.vim b/runtime/autoload/xml/xhtml11.vim
new file mode 100644
index 0000000..ef79fd7
--- /dev/null
+++ b/runtime/autoload/xml/xhtml11.vim
@@ -0,0 +1,434 @@
+let g:xmldata_xhtml11 = {
+\ 'vimxmlentities': ['AElig', 'Aacute', 'Acirc', 'Agrave', 'Alpha', 'Aring', 'Atilde', 'Auml', 'Beta', 'Ccedil', 'Chi', 'Dagger', 'Delta', 'ETH', 'Eacute', 'Ecirc', 'Egrave', 'Epsilon', 'Eta', 'Euml', 'Gamma', 'Iacute', 'Icirc', 'Igrave', 'Iota', 'Iuml', 'Kappa', 'Lambda', 'Mu', 'Ntilde', 'Nu', 'OElig', 'Oacute', 'Ocirc', 'Ograve', 'Omega', 'Omicron', 'Oslash', 'Otilde', 'Ouml', 'Phi', 'Pi', 'Prime', 'Psi', 'Rho', 'Scaron', 'Sigma', 'THORN', 'Tau', 'Theta', 'Uacute', 'Ucirc', 'Ugrave', 'Upsilon', 'Uuml', 'Xi', 'Yacute', 'Yuml', 'Zeta', 'aacute', 'acirc', 'acute', 'aelig', 'agrave', 'alefsym', 'alpha', 'amp', 'and', 'ang', 'apos', 'aring', 'asymp', 'atilde', 'auml', 'bdquo', 'beta', 'brvbar', 'bull', 'cap', 'ccedil', 'cedil', 'cent', 'chi', 'circ', 'clubs', 'cong', 'copy', 'crarr', 'cup', 'curren', 'dArr', 'dagger', 'darr', 'deg', 'delta', 'diams', 'divide', 'eacute', 'ecirc', 'egrave', 'empty', 'emsp', 'ensp', 'epsilon', 'equiv', 'eta', 'eth', 'euml', 'euro', 'exist', 'fnof', 'forall', 'frac12', 'frac14', 'frac34', 'frasl', 'gamma', 'ge', 'gt', 'hArr', 'harr', 'hearts', 'hellip', 'iacute', 'icirc', 'iexcl', 'igrave', 'image', 'infin', 'int', 'iota', 'iquest', 'isin', 'iuml', 'kappa', 'lArr', 'lambda', 'lang', 'laquo', 'larr', 'lceil', 'ldquo', 'le', 'lfloor', 'lowast', 'loz', 'lrm', 'lsaquo', 'lsquo', 'lt', 'macr', 'mdash', 'micro', 'middot', 'minus', 'mu', 'nabla', 'nbsp', 'ndash', 'ne', 'ni', 'not', 'notin', 'nsub', 'ntilde', 'nu', 'oacute', 'ocirc', 'oelig', 'ograve', 'oline', 'omega', 'omicron', 'oplus', 'or', 'ordf', 'ordm', 'oslash', 'otilde', 'otimes', 'ouml', 'para', 'part', 'permil', 'perp', 'phi', 'pi', 'piv', 'plusmn', 'pound', 'prime', 'prod', 'prop', 'psi', 'quot', 'rArr', 'radic', 'rang', 'raquo', 'rarr', 'rceil', 'rdquo', 'real', 'reg', 'rfloor', 'rho', 'rlm', 'rsaquo', 'rsquo', 'sbquo', 'scaron', 'sdot', 'sect', 'shy', 'sigma', 'sigmaf', 'sim', 'spades', 'sub', 'sube', 'sum', 'sup', 'sup1', 'sup2', 'sup3', 'supe', 'szlig', 'tau', 'there4', 'theta', 'thetasym', 'thinsp', 'thorn', 'tilde', 'times', 'trade', 'uArr', 'uacute', 'uarr', 'ucirc', 'ugrave', 'uml', 'upsih', 'upsilon', 'uuml', 'weierp', 'xi', 'yacute', 'yen', 'yuml', 'zeta', 'zwj', 'zwnj'],
+\ 'vimxmlroot': ['html'],
+\ 'a': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'coords': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'abbr': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'onclick': [], 'class': [], 'title': []}
+\ ],
+\ 'acronym': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'address': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'area': [
+\ [],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'accesskey': [], 'coords': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'nohref': ['BOOL'], 'onkeyup': [], 'href': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'alt': [], 'tabindex': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'shape': ['rect', 'circle', 'poly', 'default']}
+\ ],
+\ 'b': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'base': [
+\ [],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'href': []}
+\ ],
+\ 'bdo': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'dir': ['ltr', 'rtl'], 'id': [], 'style': [], 'xml:lang': [], 'class': [], 'title': []}
+\ ],
+\ 'big': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'blockquote': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'body': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'br': [
+\ [],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'id': [], 'style': [], 'class': [], 'title': []}
+\ ],
+\ 'button': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'ins', 'del', 'script', 'noscript', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'img', 'map', 'object'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'value': [], 'name': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': ['submit', 'button', 'submit', 'reset']}
+\ ],
+\ 'caption': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'cite': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'code': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'col': [
+\ [],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'colgroup': [
+\ ['col'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'span': ['1'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dd': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'del': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'dfn': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'div': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dl': [
+\ ['dt', 'dd'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'dt': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'em': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'fieldset': [
+\ ['legend', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'form': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'ins', 'del', 'script', 'noscript', 'fieldset'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'enctype': ['application/x-www-form-urlencoded'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'method': ['get', 'post'], 'onmouseover': [], 'accept': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'accept-charset': [], 'onkeypress': [], 'onmousedown': [], 'action': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'h1': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h2': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h3': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h4': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h5': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'h6': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'head': [
+\ ['script', 'style', 'meta', 'link', 'object', 'title', 'script', 'style', 'meta', 'link', 'object', 'base', 'script', 'style', 'meta', 'link', 'object', 'base', 'script', 'style', 'meta', 'link', 'object', 'title', 'script', 'style', 'meta', 'link', 'object'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'profile': [''], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'hr': [
+\ [],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'html': [
+\ ['head', 'body'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'dir': ['ltr', 'rtl'], 'version': ['-//W3C//DTD XHTML 1.1//EN'], 'xml:lang': []}
+\ ],
+\ 'i': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'img': [
+\ [],
+\ { 'ismap': ['BOOL']}
+\ ],
+\ 'input': [
+\ [],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'size': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onkeyup': [], 'onmouseup': [], 'id': [], 'maxlength': [], 'onmouseover': [], 'alt': [], 'tabindex': [], 'accept': [], 'value': [], 'src': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'xml:lang': [], 'checked': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'type': ['text', 'password', 'checkbox', 'radio', 'submit', 'reset', 'file', 'hidden', 'image', 'button'], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'ins': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'datetime': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'kbd': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'label': [
+\ ['input', 'select', 'textarea', 'button', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'bdo', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'a', 'img', 'map', 'object', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'accesskey': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'for': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'legend': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'accesskey': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'li': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'link': [
+\ [],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'rel': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'href': [], 'media': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'charset': [], 'xml:lang': [], 'hreflang': [], 'onkeypress': [], 'onmousedown': [], 'rev': [], 'class': [], 'title': [], 'onclick': [], 'type': []}
+\ ],
+\ 'map': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'ins', 'del', 'script', 'noscript', 'area'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'meta': [
+\ [],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'http-equiv': [], 'content': [], 'dir': ['ltr', 'rtl'], 'name': [], 'scheme': [], 'xml:lang': []}
+\ ],
+\ 'noscript': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'object': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript', 'param'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'width': [], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'archive': [], 'standby': [], 'tabindex': [], 'classid': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'name': [], 'data': [], 'xml:lang': [], 'height': [], 'codetype': [], 'declare': ['BOOL'], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'type': [], 'codebase': []}
+\ ],
+\ 'ol': [
+\ ['li'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'optgroup': [
+\ ['option'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': []}
+\ ],
+\ 'option': [
+\ [''],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'value': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'label': [], 'selected': ['BOOL']}
+\ ],
+\ 'p': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'param': [
+\ [],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'id': [], 'value': [], 'name': [], 'valuetype': ['data', 'ref', 'object'], 'type': []}
+\ ],
+\ 'pre': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'bdo', 'a', 'script', 'map'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:space': ['preserve'], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'q': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'cite': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'rb': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'rbc': [
+\ ['rb'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'rp': [
+\ [''],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'rt': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'rtc': [
+\ ['rt'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'ruby': [
+\ ['rb', 'rt', 'rp', 'rt', 'rp', 'rbc', 'rtc'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'samp': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'script': [
+\ [''],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'defer': ['BOOL'], 'src': [], 'charset': [], 'xml:space': ['preserve'], 'type': ['text/javascript']}
+\ ],
+\ 'select': [
+\ ['optgroup', 'option'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'disabled': ['BOOL'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'size': [], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'name': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'multiple': ['BOOL']}
+\ ],
+\ 'small': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'span': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'strong': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'style': [
+\ [''],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'dir': ['ltr', 'rtl'], 'media': [], 'xml:lang': [], 'xml:space': ['preserve'], 'title': [], 'type': ['text/css']}
+\ ],
+\ 'sub': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'sup': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'table': [
+\ ['caption', 'col', 'colgroup', 'thead', 'tfoot', 'tbody', 'tr'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'width': [], 'ondblclick': [], 'frame': ['void', 'above', 'below', 'hsides', 'lhs', 'rhs', 'vsides', 'box', 'border'], 'rules': ['none', 'groups', 'rows', 'cols', 'all'], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'summary': [], 'onmouseup': [], 'cellspacing': [], 'id': [], 'onmouseover': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'border': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': [], 'cellpadding': []}
+\ ],
+\ 'tbody': [
+\ ['tr'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'td': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'headers': [], 'ondblclick': [], 'axis': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'rowspan': ['1'], 'colspan': ['1'], 'onmouseup': [], 'id': [], 'charoff': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'textarea': [
+\ [''],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'accesskey': [], 'disabled': ['BOOL'], 'ondblclick': [], 'rows': [], 'dir': ['ltr', 'rtl'], 'cols': [], 'onkeydown': [], 'readonly': ['BOOL'], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'tabindex': [], 'name': [], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'tfoot': [
+\ ['tr'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'th': [
+\ ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ul', 'ol', 'dl', 'p', 'div', 'pre', 'blockquote', 'address', 'hr', 'table', 'form', 'fieldset', 'br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'headers': [], 'ondblclick': [], 'axis': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'abbr': [], 'onkeyup': [], 'rowspan': ['1'], 'colspan': ['1'], 'onmouseup': [], 'id': [], 'charoff': [], 'scope': ['row', 'col', 'rowgroup', 'colgroup'], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'onkeypress': [], 'onmousedown': [], 'char': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'thead': [
+\ ['tr'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'title': [
+\ [''],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'dir': ['ltr', 'rtl'], 'xml:lang': []}
+\ ],
+\ 'tr': [
+\ ['th', 'td'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'charoff': [], 'onmouseover': [], 'align': ['left', 'center', 'right', 'justify', 'char'], 'valign': ['top', 'middle', 'bottom', 'baseline'], 'onmouseout': [], 'onmousemove': [], 'style': [], 'xml:lang': [], 'char': [], 'onkeypress': [], 'onmousedown': [], 'class': [], 'title': [], 'onclick': []}
+\ ],
+\ 'tt': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'ul': [
+\ ['li'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'var': [
+\ ['br', 'span', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'tt', 'i', 'b', 'big', 'small', 'sub', 'sup', 'bdo', 'a', 'img', 'map', 'object', 'input', 'select', 'textarea', 'label', 'button', 'ruby', 'ins', 'del', 'script', 'noscript'],
+\ { 'xmlns': ['http://www.w3.org/1999/xhtml'], 'ondblclick': [], 'dir': ['ltr', 'rtl'], 'onkeydown': [], 'onkeyup': [], 'onmouseup': [], 'id': [], 'onmouseover': [], 'style': [], 'onmousemove': [], 'onmouseout': [], 'xml:lang': [], 'onmousedown': [], 'onkeypress': [], 'onclick': [], 'title': [], 'class': []}
+\ ],
+\ 'vimxmlattrinfo' : {
+\ 'accept' : ['ContentType', ''],
+\ 'accesskey' : ['Character', ''],
+\ 'action' : ['*URI', ''],
+\ 'align' : ['String', ''],
+\ 'alt' : ['*Text', ''],
+\ 'archive' : ['UriList', ''],
+\ 'axis' : ['CDATA', ''],
+\ 'border' : ['Pixels', ''],
+\ 'cellpadding' : ['Length', ''],
+\ 'cellspacing' : ['Length', ''],
+\ 'char' : ['Character', ''],
+\ 'charoff' : ['Length', ''],
+\ 'charset' : ['LangCode', ''],
+\ 'checked' : ['Bool', ''],
+\ 'class' : ['CDATA', ''],
+\ 'codetype' : ['ContentType', ''],
+\ 'cols' : ['*Number', ''],
+\ 'colspan' : ['Number', ''],
+\ 'content' : ['*CDATA', ''],
+\ 'coords' : ['Coords', ''],
+\ 'data' : ['URI', ''],
+\ 'datetime' : ['DateTime', ''],
+\ 'declare' : ['Bool', ''],
+\ 'defer' : ['Bool', ''],
+\ 'dir' : ['String', ''],
+\ 'disabled' : ['Bool', ''],
+\ 'enctype' : ['ContentType', ''],
+\ 'for' : ['ID', ''],
+\ 'headers' : ['IDREFS', ''],
+\ 'height' : ['Number', ''],
+\ 'href' : ['*URI', ''],
+\ 'hreflang' : ['LangCode', ''],
+\ 'id' : ['ID', ''],
+\ 'ismap' : ['Bool', ''],
+\ 'label' : ['*Text', ''],
+\ 'lang' : ['LangCode', ''],
+\ 'longdesc' : ['URI', ''],
+\ 'maxlength' : ['Number', ''],
+\ 'media' : ['MediaDesc', ''],
+\ 'method' : ['String', ''],
+\ 'multiple' : ['Bool', ''],
+\ 'name' : ['CDATA', ''],
+\ 'nohref' : ['Bool', ''],
+\ 'onblur' : ['Script', ''],
+\ 'onchange' : ['Script', ''],
+\ 'onclick' : ['Script', ''],
+\ 'ondblclick' : ['Script', ''],
+\ 'onfocus' : ['Script', ''],
+\ 'onkeydown' : ['Script', ''],
+\ 'onkeypress' : ['Script', ''],
+\ 'onkeyup' : ['Script', ''],
+\ 'onload' : ['Script', ''],
+\ 'onmousedown' : ['Script', ''],
+\ 'onmousemove' : ['Script', ''],
+\ 'onmouseout' : ['Script', ''],
+\ 'onmouseover' : ['Script', ''],
+\ 'onmouseup' : ['Script', ''],
+\ 'onreset' : ['Script', ''],
+\ 'onselect' : ['Script', ''],
+\ 'onsubmit' : ['Script', ''],
+\ 'onunload' : ['Script', ''],
+\ 'profile' : ['URI', ''],
+\ 'readonly' : ['Bool', ''],
+\ 'rel' : ['LinkTypes', ''],
+\ 'rev' : ['LinkTypes', ''],
+\ 'rows' : ['*Number', ''],
+\ 'rules' : ['String', ''],
+\ 'scheme' : ['CDATA', ''],
+\ 'selected' : ['Bool', ''],
+\ 'shape' : ['Shape', ''],
+\ 'size' : ['CDATA', ''],
+\ 'span' : ['Number', ''],
+\ 'src' : ['*URI', ''],
+\ 'standby' : ['Text', ''],
+\ 'style' : ['StyleSheet', ''],
+\ 'summary' : ['*Text', ''],
+\ 'tabindex' : ['Number', ''],
+\ 'title' : ['Text', ''],
+\ 'type' : ['*ContentType', ''],
+\ 'usemap' : ['URI', ''],
+\ 'valign' : ['String', ''],
+\ 'valuetype' : ['String', ''],
+\ 'width' : ['Number', ''],
+\ 'xmlns' : ['URI', '']
+\ },
+\ 'vimxmltaginfo': {
+\ 'area': ['/>', ''],
+\ 'base': ['/>', ''],
+\ 'br': ['/>', ''],
+\ 'col': ['/>', ''],
+\ 'hr': ['/>', ''],
+\ 'img': ['/>', ''],
+\ 'input': ['/>', ''],
+\ 'link': ['/>', ''],
+\ 'meta': ['/>', ''],
+\ 'param': ['/>', ''],
+\ }
+\ }
diff --git a/runtime/autoload/xml/xsd.vim b/runtime/autoload/xml/xsd.vim
new file mode 100644
index 0000000..8a673ea
--- /dev/null
+++ b/runtime/autoload/xml/xsd.vim
@@ -0,0 +1,130 @@
+" Author: Thomas Barthel
+" Last change: 2007 May 8
+let g:xmldata_xsd = {
+ \ 'schema': [
+ \ [ 'include', 'import', 'redefine', 'annotation', 'simpleType', 'complexType', 'element', 'attribute', 'attributeGroup', 'group', 'notation', 'annotation'],
+ \ { 'targetNamespace' : [], 'version' : [], 'xmlns' : [], 'finalDefault' : [], 'blockDefault' : [], 'id' : [], 'elementFormDefault' : [], 'attributeFormDefault' : [], 'xml:lang' : [] }],
+ \ 'redefine' : [
+ \ ['annotation', 'simpleType', 'complexType', 'attributeGroup', 'group'],
+ \ {'schemaLocation' : [], 'id' : []} ],
+ \ 'include' : [
+ \ ['annotation'],
+ \ {'namespace' : [], 'id' : []} ],
+ \ 'import' : [
+ \ ['annotation'],
+ \ {'namespace' : [], 'schemaLocation' : [], 'id' : []} ],
+ \ 'complexType' : [
+ \ ['annotation', 'simpleContent', 'complexContent', 'all', 'choice', 'sequence', 'group', 'attribute', 'attributeGroup', 'anyAttribute'],
+ \ {'name' : [], 'id' : [], 'abstract' : [], 'final' : [], 'block' : [], 'mixed' : []} ],
+ \ 'complexContent' : [
+ \ ['annotation', 'restriction', 'extension'],
+ \ {'mixed' : [], 'id' : [] } ],
+ \ 'simpleType' : [
+ \ ['annotation', 'restriction', 'list', 'union'],
+ \ {'name' : [], 'final' : [], 'id' : []} ],
+ \ 'simpleContent' : [
+ \ ['annotation', 'restriction', 'extension'],
+ \ {'id' : []} ],
+ \ 'element' : [
+ \ ['annotation', 'complexType', 'simpleType', 'unique', 'key', 'keyref'],
+ \ {'name' : [], 'id' : [], 'ref' : [], 'type' : [], 'minOccurs' : [], 'maxOccurs' : [], 'nillable' : [], 'substitutionGroup' : [], 'abstract' : [], 'final' : [], 'block' : [], 'default' : [], 'fixed' : [], 'form' : []} ],
+ \ 'attribute' : [
+ \ ['annotation', 'simpleType'],
+ \ {'name' : [], 'id' : [], 'ref' : [], 'type' : [], 'use' : [], 'default' : [], 'fixed' : [], 'form' : []} ],
+ \ 'group' : [
+ \ ['annotation', 'all', 'choice', 'sequence'],
+ \ {'name' : [], 'ref' : [], 'minOccurs' : [], 'maxOccurs' : [], 'id' : []} ],
+ \ 'choice' : [
+ \ ['annotation', 'element', 'group', 'choice', 'sequence', 'any'],
+ \ {'minOccurs' : [], 'maxOccurs' : [], 'id' : []} ],
+ \ 'sequence' : [
+ \ ['annotation', 'element', 'group', 'choice', 'sequence', 'any'],
+ \ {'minOccurs' : [], 'maxOccurs' : [], 'id' : []} ],
+ \ 'all' : [
+ \ ['annotation', 'element'],
+ \ {'minOccurs' : [], 'maxOccurs' : [], 'id' : []} ],
+ \ 'any' : [
+ \ ['annotation'],
+ \ {'namespace' : [], 'processContents' : [], 'minOccurs' : [], 'maxOccurs' : [], 'id' : []} ],
+ \ 'unique' : [
+ \ ['annotation', 'selector', 'field'],
+ \ {'name' : [], 'id' : []} ],
+ \ 'key' : [
+ \ ['annotation', 'selector', 'field'],
+ \ {'name' : [], 'id' : []} ],
+ \ 'keyref' : [
+ \ ['annotation', 'selector', 'field'],
+ \ {'name' : [], 'refer' : [], 'id' : []} ],
+ \ 'selector' : [
+ \ ['annotation'],
+ \ {'xpath' : [], 'id' : []} ],
+ \ 'field' : [
+ \ ['annotation'],
+ \ {'xpath' : [], 'id' : []} ],
+ \ 'restriction' : [
+ \ ['annotation', 'simpleType', 'minExclusive', 'maxExclusive', 'minInclusive', 'maxInclusive', 'totalDigits', 'fractionDigits', 'length', 'minLength', 'maxLength', 'enumeration', 'whiteSpace', 'pattern'],
+ \ {'base' : [], 'id' : []} ],
+ \ 'minExclusive' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'maxExclusive' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'minInclusive' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'maxInclusive' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'totalDigits' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'fractionDigits' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'length' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'minLength' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'maxLength' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'enumeration' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : []}],
+ \ 'whiteSpace' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : [], 'fixed' : []}],
+ \ 'pattern' : [
+ \ ['annotation'],
+ \ {'value' : [], 'id' : []}],
+ \ 'extension' : [
+ \ ['annotation', 'all', 'choice', 'sequence', 'group', 'attribute', 'attributeGroup', 'anyAttribute'],
+ \ {'base' : [], 'id' : []} ],
+ \ 'attributeGroup' : [
+ \ ['annotation', 'attribute', 'attributeGroup', 'anyAttribute'],
+ \ {'name' : [], 'id' : [], 'ref' : []} ],
+ \ 'anyAttribute' : [
+ \ ['annotation'],
+ \ {'namespace' : [], 'processContents' : [], 'id' : []} ],
+ \ 'list' : [
+ \ ['annotation', 'simpleType'],
+ \ {'itemType' : [], 'id' : []} ],
+ \ 'union' : [
+ \ ['annotation', 'simpleType'],
+ \ {'id' : [], 'memberTypes' : []} ],
+ \ 'notation' : [
+ \ ['annotation'],
+ \ {'name' : [], 'id' : [], 'public' : [], 'system' : []} ],
+ \ 'annotation' : [
+ \ ['appinfo', 'documentation'],
+ \ {} ],
+ \ 'appinfo' : [
+ \ [],
+ \ {'source' : [], 'id' : []} ],
+ \ 'documentation' : [
+ \ [],
+ \ {'source' : [], 'id' : [], 'xml' : []} ]
+ \ }
diff --git a/runtime/autoload/xml/xsl.vim b/runtime/autoload/xml/xsl.vim
new file mode 100644
index 0000000..b8aa29d
--- /dev/null
+++ b/runtime/autoload/xml/xsl.vim
@@ -0,0 +1,38 @@
+" Author: Mikolaj Machowski, Thomas Bartel
+" Last change: 2007 May 8
+let g:xmldata_xsl = {
+ \ 'apply-imports' : [[], {}],
+ \ 'apply-templates' : [['sort', 'with-param'], {'select' : [], 'mode' : []}],
+ \ 'attribute' : [['apply-imports', 'apply-templates', 'attribute', 'call-template', 'choose', 'comment', 'copy', 'copy-of', 'element', 'fallback', 'for-each', 'if', 'message', 'number', 'processing-instruction', 'text', 'value-of', 'variable'], {'name' : [], 'namespace' : []}],
+ \ 'attribute-set' : [['attribute'], {'name' : [], 'use-attribute-sets' : []}],
+ \ 'call-template' : [['with-param'], {'name' : []}],
+ \ 'choose' : [['when', 'otherwise'], {}],
+ \ 'comment' : [[], {}],
+ \ 'copy' : [[], {'use-attribute-sets' : []}],
+ \ 'copy-of' : [[], {'select' : []}],
+ \ 'decimal-format' : [[], {'name' : [], 'decimal-separator' : [], 'grouping-separator' : [], 'infinity' : [], 'minus-sign' : [], 'NaN' : [], 'percent' : [], 'per-mille' : [], 'zero-digit' : [], 'digit' : [], 'pattern-separator' : []}],
+ \ 'element' : [['apply-imports', 'apply-templates', 'attribute', 'call-template', 'choose', 'comment', 'copy', 'copy-of', 'element', 'fallback', 'for-each', 'if', 'message', 'number', 'processing-instruction', 'text', 'value-of', 'variable'], {'name' : [], 'namespace' : [], 'use-attribute-sets' : []}],
+ \ 'fallback' : [[], {}],
+ \ 'for-each' : [['sort'], {'select' : []}],
+ \ 'if' : [['apply-imports', 'apply-templates', 'attribute', 'call-template', 'choose', 'comment', 'copy', 'copy-of', 'element', 'fallback', 'for-each', 'if', 'message', 'number', 'processing-instruction', 'text', 'value-of', 'variable'], {'test' : []}],
+ \ 'import' : [[], {'href' : []}],
+ \ 'include' : [[], {'href' : []}],
+ \ 'key' : [[], {'name' : [], 'match' : [], 'use' : []}],
+ \ 'message' : [[], {'terminate' : ['yes', 'no']}],
+ \ 'namespace-alias' : [[], {'stylesheet-prefix' : ['#default'], 'result-prefix' : ['#default']}],
+ \ 'number' : [[], {'level' : ['single', 'multiple', 'any'], 'count' : [], 'from' : [], 'value' : [], 'format' : [], 'lang' : [], 'letter-value' : ['alphabetic', 'traditional'], 'grouping-separator' : [], 'grouping-size' : []}],
+ \ 'otherwise' : [[], {}],
+ \ 'output' : [[], {'method' : ['xml', 'html', 'text'], 'version' : [], 'encoding' : [], 'omit-xml-declaration' : ['yes', 'no'], 'standalone' : ['yes', 'no'], 'doctype-public' : [], 'doctype-system' : [], 'cdata-section-elements' : [], 'indent' : ['yes', 'no'], 'media-type' : []}],
+ \ 'param' : [['apply-imports', 'apply-templates', 'attribute', 'call-template', 'choose', 'comment', 'copy', 'copy-of', 'element', 'fallback', 'for-each', 'if', 'message', 'number', 'processing-instruction', 'text', 'value-of', 'variable'], {'name' : [], 'select' : []}],
+ \ 'preserve-space' : [[], {'elements' : []}],
+ \ 'processing-instructionruction' : [[], {'name' : []}],
+ \ 'sort' : [[], {'select' : [], 'lang' : [], 'data-type' : ['text', 'number'], 'order' : ['ascending', 'descending'], 'case-order' : ['upper-first', 'lower-first']}],
+ \ 'strip-space' : [[], {'elements' : []}],
+ \ 'stylesheet' : [['import', 'attribute-set', 'decimal-format', 'include', 'key', 'namespace-alias', 'output', 'param', 'preserve-space', 'strip-space', 'template'], {'id' : [], 'extension-element-prefixes' : [], 'version' : []}],
+ \ 'template' : [['apply-imports', 'apply-templates', 'attribute', 'call-template', 'choose', 'comment', 'copy', 'copy-of', 'element', 'fallback', 'for-each', 'if', 'message', 'number', 'processing-instruction', 'text', 'value-of', 'variable'], {'match' : [], 'name' : [], 'priority' : [], 'mode' : []}],
+ \ 'text' : [[], {'disable-output-escaping' : ['yes', 'no']}],
+ \ 'transform' : [['import', 'attribute-set', 'decimal-format', 'include', 'key', 'namespace-alias', 'output', 'param', 'preserve-space', 'strip-space', 'template'], {'id' : [], 'extension-element-prefixes' : [], 'exclude-result-prefixes' : [], 'version' : []}],
+ \ 'value-of' : [[], {'select' : [], 'disable-output-escaping' : ['yes', 'no']}],
+ \ 'variable' : [['apply-imports', 'apply-templates', 'attribute', 'call-template', 'choose', 'comment', 'copy', 'copy-of', 'element', 'fallback', 'for-each', 'if', 'message', 'number', 'processing-instruction', 'text', 'value-of', 'variable'], {'name' : [], 'select' : []}],
+ \ 'when' : [[], {'test' : []}],
+ \ 'with-param' : [['apply-imports', 'apply-templates', 'attribute', 'call-template', 'choose', 'comment', 'copy', 'copy-of', 'element', 'fallback', 'for-each', 'if', 'message', 'number', 'processing-instruction', 'text', 'value-of', 'variable'], {'name' : [], 'select' : []}]}
diff --git a/runtime/autoload/xmlcomplete.vim b/runtime/autoload/xmlcomplete.vim
new file mode 100644
index 0000000..55fb031
--- /dev/null
+++ b/runtime/autoload/xmlcomplete.vim
@@ -0,0 +1,539 @@
+" Vim completion script
+" Language: XML
+" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Last Change: 2013 Jun 29
+" Version: 1.9
+"
+" Changelog:
+" 1.9 - 2007 Aug 15
+" - fix closing of namespaced tags (Johannes Weiss)
+" 1.8 - 2006 Jul 18
+" - allow for closing of xml tags even when data file isn't available
+
+" This function will create Dictionary with users namespace strings and values
+" canonical (system) names of data files. Names should be lowercase,
+" descriptive to avoid any future conflicts. For example 'xhtml10s' should be
+" name for data of XHTML 1.0 Strict and 'xhtml10t' for XHTML 1.0 Transitional
+" User interface will be provided by XMLns command defined in ftplugin/xml.vim
+" Currently supported canonicals are:
+" xhtml10s - XHTML 1.0 Strict
+" xsl - XSL
+function! xmlcomplete#CreateConnection(canonical, ...) " {{{
+
+ " When only one argument provided treat name as default namespace (without
+ " 'prefix:').
+ if exists("a:1")
+ let users = a:1
+ else
+ let users = 'DEFAULT'
+ endif
+
+ " Source data file. Due to suspected errors in autoload do it with
+ " :runtime.
+ " TODO: make it properly (using autoload, that is) later
+ exe "runtime autoload/xml/".a:canonical.".vim"
+
+ " Remove all traces of unexisting files to return [] when trying
+ " omnicomplete something
+ " TODO: give warning about non-existing canonicals - should it be?
+ if !exists("g:xmldata_".a:canonical)
+ unlet! g:xmldata_connection
+ return 0
+ endif
+
+ " We need to initialize Dictionary to add key-value pair
+ if !exists("g:xmldata_connection")
+ let g:xmldata_connection = {}
+ endif
+
+ let g:xmldata_connection[users] = a:canonical
+
+endfunction
+" }}}
+
+function! xmlcomplete#CreateEntConnection(...) " {{{
+ if a:0 > 0
+ let g:xmldata_entconnect = a:1
+ else
+ let g:xmldata_entconnect = 'DEFAULT'
+ endif
+endfunction
+" }}}
+
+function! xmlcomplete#CompleteTags(findstart, base)
+ if a:findstart
+ " locate the start of the word
+ let curline = line('.')
+ let line = getline('.')
+ let start = col('.') - 1
+ let compl_begin = col('.') - 2
+
+ while start >= 0 && line[start - 1] =~ '\(\k\|[:.-]\)'
+ let start -= 1
+ endwhile
+
+ if start >= 0 && line[start - 1] =~ '&'
+ let b:entitiescompl = 1
+ let b:compl_context = ''
+ return start
+ endif
+
+ let b:compl_context = getline('.')[0:(compl_begin)]
+ if b:compl_context !~ '<[^>]*$'
+ " Look like we may have broken tag. Check previous lines. Up to
+ " 10?
+ let i = 1
+ while 1
+ let context_line = getline(curline-i)
+ if context_line =~ '<[^>]*$'
+ " Yep, this is this line
+ let context_lines = getline(curline-i, curline-1) + [b:compl_context]
+ let b:compl_context = join(context_lines, ' ')
+ break
+ elseif context_line =~ '>[^<]*$' || i == curline
+ " Normal tag line, no need for completion at all
+ " OR reached first line without tag at all
+ let b:compl_context = ''
+ break
+ endif
+ let i += 1
+ endwhile
+ " Make sure we don't have counter
+ unlet! i
+ endif
+ let b:compl_context = matchstr(b:compl_context, '.*\zs<.*')
+
+ " Make sure we will have only current namespace
+ unlet! b:xml_namespace
+ let b:xml_namespace = matchstr(b:compl_context, '^<\zs\k*\ze:')
+ if b:xml_namespace == ''
+ let b:xml_namespace = 'DEFAULT'
+ endif
+
+ return start
+
+ else
+ " Initialize base return lists
+ let res = []
+ let res2 = []
+ " a:base is very short - we need context
+ if len(b:compl_context) == 0 && !exists("b:entitiescompl")
+ return []
+ endif
+ let context = matchstr(b:compl_context, '^<\zs.*')
+ unlet! b:compl_context
+ " There is no connection of namespace and data file.
+ if !exists("g:xmldata_connection") || g:xmldata_connection == {}
+ " There is still possibility we may do something - eg. close tag
+ let b:unaryTagsStack = "base meta link hr br param img area input col"
+ if context =~ '^\/'
+ let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
+ return [opentag.">"]
+ else
+ return []
+ endif
+ endif
+
+ " Make entities completion
+ if exists("b:entitiescompl")
+ unlet! b:entitiescompl
+
+ if !exists("g:xmldata_entconnect") || g:xmldata_entconnect == 'DEFAULT'
+ let values = g:xmldata{'_'.g:xmldata_connection['DEFAULT']}['vimxmlentities']
+ else
+ let values = g:xmldata{'_'.g:xmldata_entconnect}['vimxmlentities']
+ endif
+
+ " Get only lines with entity declarations but throw out
+ " parameter-entities - they may be completed in future
+ let entdecl = filter(getline(1, "$"), 'v:val =~ "<!ENTITY\\s\\+[^%]"')
+
+ if len(entdecl) > 0
+ let intent = map(copy(entdecl), 'matchstr(v:val, "<!ENTITY\\s\\+\\zs\\(\\k\\|[.-:]\\)\\+\\ze")')
+ let values = intent + values
+ endif
+
+ if len(a:base) == 1
+ for m in values
+ if m =~ '^'.a:base
+ call add(res, m.';')
+ endif
+ endfor
+ return res
+ else
+ for m in values
+ if m =~? '^'.a:base
+ call add(res, m.';')
+ elseif m =~? a:base
+ call add(res2, m.';')
+ endif
+ endfor
+
+ return res + res2
+ endif
+
+ endif
+ if context =~ '>'
+ " Generally if context contains > it means we are outside of tag and
+ " should abandon action
+ return []
+ endif
+
+ " find tags matching with "a:base"
+ " If a:base contains white space it is attribute.
+ " It could be also value of attribute...
+ " We have to get first word to offer
+ " proper completions
+ if context == ''
+ let tag = ''
+ else
+ let tag = split(context)[0]
+ endif
+ " Get rid of namespace
+ let tag = substitute(tag, '^'.b:xml_namespace.':', '', '')
+
+
+ " Get last word, it should be attr name
+ let attr = matchstr(context, '.*\s\zs.*')
+ " Possible situations where any prediction would be difficult:
+ " 1. Events attributes
+ if context =~ '\s'
+
+ " If attr contains =\s*[\"'] we catch value of attribute
+ if attr =~ "=\s*[\"']" || attr =~ "=\s*$"
+ " Let do attribute specific completion
+ let attrname = matchstr(attr, '.*\ze\s*=')
+ let entered_value = matchstr(attr, ".*=\\s*[\"']\\?\\zs.*")
+
+ if tag =~ '^[?!]'
+ " Return nothing if we are inside of ! or ? tag
+ return []
+ else
+ if has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}, tag) && has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1], attrname)
+ let values = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][attrname]
+ else
+ return []
+ endif
+ endif
+
+ if len(values) == 0
+ return []
+ endif
+
+ " We need special version of sbase
+ let attrbase = matchstr(context, ".*[\"']")
+ let attrquote = matchstr(attrbase, '.$')
+ if attrquote !~ "['\"]"
+ let attrquoteopen = '"'
+ let attrquote = '"'
+ else
+ let attrquoteopen = ''
+ endif
+
+ for m in values
+ " This if is needed to not offer all completions as-is
+ " alphabetically but sort them. Those beginning with entered
+ " part will be as first choices
+ if m =~ '^'.entered_value
+ call add(res, attrquoteopen . m . attrquote.' ')
+ elseif m =~ entered_value
+ call add(res2, attrquoteopen . m . attrquote.' ')
+ endif
+ endfor
+
+ return res + res2
+
+ endif
+
+ if tag =~ '?xml'
+ " Two possible arguments for <?xml> plus variation
+ let attrs = ['encoding', 'version="1.0"', 'version']
+ elseif tag =~ '^!'
+ " Don't make completion at all
+ "
+ return []
+ else
+ if !has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}, tag)
+ " Abandon when data file isn't complete
+ return []
+ endif
+ let attrs = keys(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1])
+ endif
+
+ for m in sort(attrs)
+ if m =~ '^'.attr
+ call add(res, m)
+ elseif m =~ attr
+ call add(res2, m)
+ endif
+ endfor
+ let menu = res + res2
+ let final_menu = []
+ if has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}, 'vimxmlattrinfo')
+ for i in range(len(menu))
+ let item = menu[i]
+ if has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmlattrinfo'], item)
+ let m_menu = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmlattrinfo'][item][0]
+ let m_info = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmlattrinfo'][item][1]
+ else
+ let m_menu = ''
+ let m_info = ''
+ endif
+ if tag !~ '^[?!]' && len(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][item]) > 0 && g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][item][0] =~ '^\(BOOL\|'.item.'\)$'
+ let item = item
+ else
+ let item .= '="'
+ endif
+ let final_menu += [{'word':item, 'menu':m_menu, 'info':m_info}]
+ endfor
+ else
+ for i in range(len(menu))
+ let item = menu[i]
+ if tag !~ '^[?!]' && len(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][item]) > 0 && g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[tag][1][item][0] =~ '^\(BOOL\|'.item.'\)$'
+ let item = item
+ else
+ let item .= '="'
+ endif
+ let final_menu += [item]
+ endfor
+ endif
+ return final_menu
+
+ endif
+ " Close tag
+ let b:unaryTagsStack = "base meta link hr br param img area input col"
+ if context =~ '^\/'
+ let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
+ return [opentag.">"]
+ endif
+
+ " Complete elements of XML structure
+ " TODO: #REQUIRED, #IMPLIED, #FIXED, #PCDATA - but these should be detected like
+ " entities - in first run
+ " keywords: CDATA, ID, IDREF, IDREFS, ENTITY, ENTITIES, NMTOKEN, NMTOKENS
+ " are hardly recognizable but keep it in reserve
+ " also: EMPTY ANY SYSTEM PUBLIC DATA
+ if context =~ '^!'
+ let tags = ['!ELEMENT', '!DOCTYPE', '!ATTLIST', '!ENTITY', '!NOTATION', '![CDATA[', '![INCLUDE[', '![IGNORE[']
+
+ for m in tags
+ if m =~ '^'.context
+ let m = substitute(m, '^!\[\?', '', '')
+ call add(res, m)
+ elseif m =~ context
+ let m = substitute(m, '^!\[\?', '', '')
+ call add(res2, m)
+ endif
+ endfor
+
+ return res + res2
+
+ endif
+
+ " Complete text declaration
+ if context =~ '^?'
+ let tags = ['?xml']
+
+ for m in tags
+ if m =~ '^'.context
+ call add(res, substitute(m, '^?', '', ''))
+ elseif m =~ context
+ call add(res, substitute(m, '^?', '', ''))
+ endif
+ endfor
+
+ return res + res2
+
+ endif
+
+ " Deal with tag completion.
+ let opentag = xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
+ let opentag = substitute(opentag, '^\k*:', '', '')
+ if opentag == ''
+ "return []
+ let tags = keys(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]})
+ call filter(tags, 'v:val !~ "^vimxml"')
+ else
+ if !has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}, opentag)
+ " Abandon when data file isn't complete
+ return []
+ endif
+ let tags = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}[opentag][0]
+ endif
+
+ let context = substitute(context, '^\k*:', '', '')
+
+ for m in tags
+ if m =~ '^'.context
+ call add(res, m)
+ elseif m =~ context
+ call add(res2, m)
+ endif
+ endfor
+ let menu = res + res2
+ if b:xml_namespace == 'DEFAULT'
+ let xml_namespace = ''
+ else
+ let xml_namespace = b:xml_namespace.':'
+ endif
+ if has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}, 'vimxmltaginfo')
+ let final_menu = []
+ for i in range(len(menu))
+ let item = menu[i]
+ if has_key(g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmltaginfo'], item)
+ let m_menu = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmltaginfo'][item][0]
+ let m_info = g:xmldata{'_'.g:xmldata_connection[b:xml_namespace]}['vimxmltaginfo'][item][1]
+ else
+ let m_menu = ''
+ let m_info = ''
+ endif
+ let final_menu += [{'word':xml_namespace.item, 'menu':m_menu, 'info':m_info}]
+ endfor
+ else
+ let final_menu = map(menu, 'xml_namespace.v:val')
+ endif
+
+ return final_menu
+
+ endif
+endfunction
+
+" MM: This is severely reduced closetag.vim used with kind permission of Steven
+" Mueller
+" Changes: strip all comments; delete error messages; add checking for
+" namespace
+" Author: Steven Mueller <diffusor@ugcs.caltech.edu>
+" Last Modified: Tue May 24 13:29:48 PDT 2005
+" Version: 0.9.1
+
+function! xmlcomplete#GetLastOpenTag(unaryTagsStack)
+ let linenum=line('.')
+ let lineend=col('.') - 1 " start: cursor position
+ let first=1 " flag for first line searched
+ let b:TagStack='' " main stack of tags
+ let startInComment=s:InComment()
+
+ if exists("b:xml_namespace")
+ if b:xml_namespace == 'DEFAULT'
+ let tagpat='</\=\(\k\|[.:-]\)\+\|/>'
+ else
+ let tagpat='</\='.b:xml_namespace.':\(\k\|[.-]\)\+\|/>'
+ endif
+ else
+ let tagpat='</\=\(\k\|[.:-]\)\+\|/>'
+ endif
+ while (linenum>0)
+ let line=getline(linenum)
+ if first
+ let line=strpart(line,0,lineend)
+ else
+ let lineend=strlen(line)
+ endif
+ let b:lineTagStack=''
+ let mpos=0
+ let b:TagCol=0
+ while (mpos > -1)
+ let mpos=matchend(line,tagpat)
+ if mpos > -1
+ let b:TagCol=b:TagCol+mpos
+ let tag=matchstr(line,tagpat)
+
+ if exists('b:closetag_disable_synID') || startInComment==s:InCommentAt(linenum, b:TagCol)
+ let b:TagLine=linenum
+ call s:Push(matchstr(tag,'[^<>]\+'),'b:lineTagStack')
+ endif
+ let lineend=lineend-mpos
+ let line=strpart(line,mpos,lineend)
+ endif
+ endwhile
+ while (!s:EmptystackP('b:lineTagStack'))
+ let tag=s:Pop('b:lineTagStack')
+ if match(tag, '^/') == 0 "found end tag
+ call s:Push(tag,'b:TagStack')
+ elseif s:EmptystackP('b:TagStack') && !s:Instack(tag, a:unaryTagsStack) "found unclosed tag
+ return tag
+ else
+ let endtag=s:Peekstack('b:TagStack')
+ if endtag == '/'.tag || endtag == '/'
+ call s:Pop('b:TagStack') "found a open/close tag pair
+ elseif !s:Instack(tag, a:unaryTagsStack) "we have a mismatch error
+ return ''
+ endif
+ endif
+ endwhile
+ let linenum=linenum-1 | let first=0
+ endwhile
+return ''
+endfunction
+
+function! s:InComment()
+ return synIDattr(synID(line('.'), col('.'), 0), 'name') =~ 'Comment\|String'
+endfunction
+
+function! s:InCommentAt(line, col)
+ return synIDattr(synID(a:line, a:col, 0), 'name') =~ 'Comment\|String'
+endfunction
+
+function! s:SetKeywords()
+ let s:IsKeywordBak=&l:iskeyword
+ let &l:iskeyword='33-255'
+endfunction
+
+function! s:RestoreKeywords()
+ let &l:iskeyword=s:IsKeywordBak
+endfunction
+
+function! s:Push(el, sname)
+ if !s:EmptystackP(a:sname)
+ exe 'let '.a:sname."=a:el.' '.".a:sname
+ else
+ exe 'let '.a:sname.'=a:el'
+ endif
+endfunction
+
+function! s:EmptystackP(sname)
+ exe 'let stack='.a:sname
+ if match(stack,'^ *$') == 0
+ return 1
+ else
+ return 0
+ endif
+endfunction
+
+function! s:Instack(el, sname)
+ exe 'let stack='.a:sname
+ call s:SetKeywords()
+ let m=match(stack, '\<'.a:el.'\>')
+ call s:RestoreKeywords()
+ if m < 0
+ return 0
+ else
+ return 1
+ endif
+endfunction
+
+function! s:Peekstack(sname)
+ call s:SetKeywords()
+ exe 'let stack='.a:sname
+ let top=matchstr(stack, '\<.\{-1,}\>')
+ call s:RestoreKeywords()
+ return top
+endfunction
+
+function! s:Pop(sname)
+ if s:EmptystackP(a:sname)
+ return ''
+ endif
+ exe 'let stack='.a:sname
+ call s:SetKeywords()
+ let loc=matchend(stack,'\<.\{-1,}\>')
+ exe 'let '.a:sname.'=strpart(stack, loc+1, strlen(stack))'
+ let top=strpart(stack, match(stack, '\<'), loc)
+ call s:RestoreKeywords()
+ return top
+endfunction
+
+function! s:Clearstack(sname)
+ exe 'let '.a:sname."=''"
+endfunction
+" vim:set foldmethod=marker:
diff --git a/runtime/autoload/xmlformat.vim b/runtime/autoload/xmlformat.vim
new file mode 100644
index 0000000..c89c878
--- /dev/null
+++ b/runtime/autoload/xmlformat.vim
@@ -0,0 +1,203 @@
+" Vim plugin for formatting XML
+" Last Change: 2020 Jan 06
+" Version: 0.3
+" 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() abort
+ " 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 count_orig = v:count
+ 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
+ " go through every line, but don't join all content together and join it
+ " back. We might lose empty lines
+ let list = getline(v:lnum, (v:lnum + count_orig - 1))
+ let current = 0
+ for line in list
+ " Keep empty input lines?
+ if empty(line)
+ call add(result, '')
+ continue
+ elseif line !~# '<[/]\?[^>]*>'
+ let nextmatch = match(list, '<[/]\?[^>]*>', current)
+ if nextmatch > -1
+ let line .= ' '. join(list[(current + 1):(nextmatch-1)], " ")
+ call remove(list, current+1, nextmatch-1)
+ endif
+ endif
+ " split on `>`, but don't split on very first opening <
+ " this means, items can be like ['<tag>', 'tag content</tag>']
+ for item in split(line, '.\@<=[>]\zs')
+ if s:EndTag(item)
+ call 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 '<', if there is one,
+ " but reformat according to &textwidth
+ let t=split(item, '.<\@=\zs')
+
+ " if the content fits well within a single line, add it there
+ " so that the output looks like this:
+ "
+ " <foobar>1</foobar>
+ if s:TagContent(lastitem) is# s:TagContent(t[1]) && strlen(result[-1]) + strlen(item) <= s:Textwidth()
+ let result[-1] .= item
+ let lastitem = t[1]
+ continue
+ endif
+ " t should only contain 2 items, but just be safe here
+ if s:IsTag(lastitem)
+ let s:indent+=1
+ endif
+ let result+=s:FormatContent([t[0]])
+ if s:EndTag(t[1])
+ call s:DecreaseIndent()
+ endif
+ "for y in t[1:]
+ let result+=s:FormatContent(t[1:])
+ "endfor
+ else
+ call add(result, s:Indent(item))
+ endif
+ endif
+ let lastitem = item
+ endfor
+ let current += 1
+ endfor
+
+ if !empty(result)
+ let lastprevline = getline(v:lnum + count_orig)
+ let delete_lastline = v:lnum + count_orig - 1 == line('$')
+ exe v:lnum. ",". (v:lnum + count_orig - 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)
+ " do not use empty(), it returns true for `empty(0)`
+ if getline(last) is '' && lastprevline is '' && delete_lastline
+ 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) abort
+ return a:tag =~? '^\s*<?xml\s\?\%(version="[^"]*"\)\?\s\?\%(encoding="[^"]*"\)\? ?>\s*$'
+endfunc
+" Return tag indented by current level {{{1
+func! s:Indent(item) abort
+ return repeat(' ', shiftwidth()*s:indent). s:Trim(a:item)
+endfu
+" Return item trimmed from leading whitespace {{{1
+func! s:Trim(item) abort
+ 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) abort
+ let is_comment = s:IsComment(a:tag)
+ return a:tag =~? '^\s*<[^/?]' && !is_comment
+endfunc
+" Check if tag is a Comment start {{{1
+func! s:IsComment(tag) abort
+ return a:tag =~? '<!--'
+endfunc
+" Remove one level of indentation {{{1
+func! s:DecreaseIndent() abort
+ let s:indent = (s:indent > 0 ? s:indent - 1 : 0)
+endfunc
+" Check if tag is a closing tag </tag> {{{1
+func! s:EndTag(tag) abort
+ return a:tag =~? '^\s*</'
+endfunc
+" Check that the tag is actually a tag and not {{{1
+" something like "foobar</foobar>"
+func! s:IsTag(tag) abort
+ return s:Trim(a:tag)[0] == '<'
+endfunc
+" Check if tag is empty <tag/> {{{1
+func! s:EmptyTag(tag) abort
+ return a:tag =~ '/>\s*$'
+endfunc
+func! s:TagContent(tag) abort "{{{1
+ " Return content of a tag
+ return substitute(a:tag, '^\s*<[/]\?\([^>]*\)>\s*$', '\1', '')
+endfunc
+func! s:Textwidth() abort "{{{1
+ " return textwidth (or 80 if not set)
+ return &textwidth == 0 ? 80 : &textwidth
+endfunc
+" Format input line according to textwidth {{{1
+func! s:FormatContent(list) abort
+ let result=[]
+ let limit = s:Textwidth()
+ let column=0
+ let idx = -1
+ let add_indent = 0
+ let cnt = 0
+ for item in a:list
+ for word in split(item, '\s\+\S\+\zs')
+ if match(word, '^\s\+$') > -1
+ " skip empty words
+ continue
+ endif
+ let column += strdisplaywidth(word, column)
+ if match(word, "^\\s*\n\\+\\s*$") > -1
+ call add(result, '')
+ let idx += 1
+ let column = 0
+ let add_indent = 1
+ elseif column > limit || cnt == 0
+ let add = s:Indent(s:Trim(word))
+ call add(result, add)
+ let column = strdisplaywidth(add)
+ let idx += 1
+ else
+ if add_indent
+ let result[idx] = s:Indent(s:Trim(word))
+ else
+ let result[idx] .= ' '. s:Trim(word)
+ endif
+ let add_indent = 0
+ endif
+ let cnt += 1
+ endfor
+ endfor
+ return result
+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/zig/fmt.vim b/runtime/autoload/zig/fmt.vim
new file mode 100644
index 0000000..b78c199
--- /dev/null
+++ b/runtime/autoload/zig/fmt.vim
@@ -0,0 +1,100 @@
+" Adapted from fatih/vim-go: autoload/go/fmt.vim
+"
+" Copyright 2011 The Go Authors. All rights reserved.
+" Use of this source code is governed by a BSD-style
+" license that can be found in the LICENSE file.
+"
+" Upstream: https://github.com/ziglang/zig.vim
+
+function! zig#fmt#Format() abort
+ " Save cursor position and many other things.
+ let view = winsaveview()
+
+ if !executable('zig')
+ echohl Error | echomsg "no zig binary found in PATH" | echohl None
+ return
+ endif
+
+ let cmdline = 'zig fmt --stdin --ast-check'
+ let current_buf = bufnr('')
+
+ " The formatted code is output on stdout, the errors go on stderr.
+ if exists('*systemlist')
+ silent let out = systemlist(cmdline, current_buf)
+ else
+ silent let out = split(system(cmdline, current_buf))
+ endif
+ if len(out) == 1
+ if out[0] == "error: unrecognized parameter: '--ast-check'"
+ let cmdline = 'zig fmt --stdin'
+ if exists('*systemlist')
+ silent let out = systemlist(cmdline, current_buf)
+ else
+ silent let out = split(system(cmdline, current_buf))
+ endif
+ endif
+ endif
+ let err = v:shell_error
+
+
+ if err == 0
+ " remove undo point caused via BufWritePre.
+ try | silent undojoin | catch | endtry
+
+ " Replace the file content with the formatted version.
+ if exists('*deletebufline')
+ call deletebufline(current_buf, len(out), line('$'))
+ else
+ silent execute ':' . len(out) . ',' . line('$') . ' delete _'
+ endif
+ call setline(1, out)
+
+ " No errors detected, close the loclist.
+ call setloclist(0, [], 'r')
+ lclose
+ elseif get(g:, 'zig_fmt_parse_errors', 1)
+ let errors = s:parse_errors(expand('%'), out)
+
+ call setloclist(0, [], 'r', {
+ \ 'title': 'Errors',
+ \ 'items': errors,
+ \ })
+
+ let max_win_height = get(g:, 'zig_fmt_max_window_height', 5)
+ " Prevent the loclist from becoming too long.
+ let win_height = min([max_win_height, len(errors)])
+ " Open the loclist, but only if there's at least one error to show.
+ execute 'silent! lwindow ' . win_height
+ endif
+
+ call winrestview(view)
+
+ if err != 0
+ echohl Error | echomsg "zig fmt returned error" | echohl None
+ return
+ endif
+
+ " Run the syntax highlighter on the updated content and recompute the folds if
+ " needed.
+ syntax sync fromstart
+endfunction
+
+" parse_errors parses the given errors and returns a list of parsed errors
+function! s:parse_errors(filename, lines) abort
+ " list of errors to be put into location list
+ let errors = []
+ for line in a:lines
+ let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)')
+ if !empty(tokens)
+ call add(errors,{
+ \"filename": a:filename,
+ \"lnum": tokens[2],
+ \"col": tokens[3],
+ \"text": tokens[4],
+ \ })
+ endif
+ endfor
+
+ return errors
+endfunction
+" vim: sw=2 ts=2 et
diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim
new file mode 100644
index 0000000..bc9b62d
--- /dev/null
+++ b/runtime/autoload/zip.vim
@@ -0,0 +1,470 @@
+" zip.vim: Handles browsing zipfiles
+" AUTOLOAD PORTION
+" Date: Nov 08, 2021
+" Version: 32
+" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" License: Vim License (see vim's :help license)
+" Copyright: Copyright (C) 2005-2019 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,
+" zip.vim and zipPlugin.vim are provided *as is* and comes with
+" no warranty of any kind, either 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()
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_zip")
+ finish
+endif
+let g:loaded_zip= "v32"
+if v:version < 702
+ echohl WarningMsg
+ echo "***warning*** this version of zip needs vim 7.2 or later"
+ echohl Normal
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+"DechoTabOn
+
+let s:zipfile_escape = ' ?&;\'
+let s:ERROR = 2
+let s:WARNING = 1
+let s:NOTE = 0
+
+" ---------------------------------------------------------------------
+" Global Values: {{{1
+if !exists("g:zip_shq")
+ if &shq != ""
+ let g:zip_shq= &shq
+ elseif has("unix")
+ let g:zip_shq= "'"
+ else
+ let g:zip_shq= '"'
+ endif
+endif
+if !exists("g:zip_zipcmd")
+ let g:zip_zipcmd= "zip"
+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
+" ----------------
+
+" ---------------------------------------------------------------------
+" 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
+ " (zipped files have a leading PK as a "magic cookie")
+ if !filereadable(a:zipfile) || readfile(a:zipfile, "", 1)[0] !~ '^PK'
+ exe "noswapfile noautocmd noswapfile 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 - it's a zip file")
+ endif
+
+ let repkeep= &report
+ set report=10
+
+ " sanity checks
+ if !exists("*fnameescape")
+ if &verbose > 1
+ echoerr "the zip plugin is not available (your vim doesn't support fnameescape())"
+ endif
+ return
+ endif
+ if !executable(g:zip_unzipcmd)
+ redraw!
+ echohl Error | echo "***error*** (zip#Browse) unzip not available on your system"
+" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ let &report= repkeep
+" call Dret("zip#Browse")
+ return
+ endif
+ if !filereadable(a:zipfile)
+ if a:zipfile !~# '^\a\+://'
+ " 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()
+ endif
+ let &report= repkeep
+" call Dret("zip#Browse : file<".a:zipfile."> not readable")
+ return
+ endif
+" call Decho("passed sanity checks")
+ if &ma != 1
+ set ma
+ endif
+ let b:zipfile= a:zipfile
+
+ setlocal noswapfile
+ setlocal buftype=nofile
+ setlocal bufhidden=hide
+ setlocal nobuflisted
+ setlocal nowrap
+
+ " Oct 12, 2021: need to re-use Bram's syntax/tar.vim.
+ " Setting the filetype to zip doesn't do anything (currently),
+ " but it is perhaps less confusing to curious perusers who do
+ " a :echo &ft
+ setf zip
+ run! syntax/tar.vim
+
+ " give header
+ call append(0, ['" zip.vim version '.g:loaded_zip,
+ \ '" Browsing zipfile '.a:zipfile,
+ \ '" Select a file with cursor and press ENTER'])
+ keepj $
+
+" call Decho("exe silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1))
+ exe "keepj sil! r! ".g:zip_unzipcmd." -Z -1 -- ".s:Escape(a:zipfile,1)
+ if v:shell_error != 0
+ redraw!
+ echohl WarningMsg | echo "***warning*** (zip#Browse) ".fnameescape(a:zipfile)." is not a zip file" | echohl None
+" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ keepj sil! %d
+ let eikeep= &ei
+ set ei=BufReadCmd,FileReadCmd
+ exe "keepj r ".fnameescape(a:zipfile)
+ let &ei= eikeep
+ keepj 1d
+" call Dret("zip#Browse")
+ return
+ endif
+
+ " Maps associated with zip plugin
+ setlocal noma nomod ro
+ noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
+ noremap <silent> <buffer> x :call zip#Extract()<cr>
+ if &mouse != ""
+ noremap <silent> <buffer> <leftmouse> <leftmouse>:call <SID>ZipBrowseSelect()<cr>
+ endif
+
+ let &report= repkeep
+" call Dret("zip#Browse")
+endfun
+
+" ---------------------------------------------------------------------
+" ZipBrowseSelect: {{{2
+fun! s:ZipBrowseSelect()
+" call Dfunc("ZipBrowseSelect() zipfile<".b:zipfile."> curfile<".expand("%").">")
+ let repkeep= &report
+ set report=10
+ let fname= getline(".")
+
+ " sanity check
+ if fname =~ '^"'
+ let &report= repkeep
+" call Dret("ZipBrowseSelect")
+ return
+ endif
+ if fname =~ '/$'
+ redraw!
+ echohl Error | echo "***error*** (zip#Browse) Please specify a file, not a directory" | echohl None
+" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ let &report= repkeep
+" call Dret("ZipBrowseSelect")
+ return
+ endif
+
+" call Decho("fname<".fname.">")
+
+ " get zipfile to the new-window
+ let zipfile = b:zipfile
+ let curfile = expand("%")
+" call Decho("zipfile<".zipfile.">")
+" call Decho("curfile<".curfile.">")
+
+ noswapfile new
+ if !exists("g:zip_nomax") || g:zip_nomax == 0
+ wincmd _
+ endif
+ let s:zipfile_{winnr()}= curfile
+" call Decho("exe e ".fnameescape("zipfile://".zipfile.'::'.fname))
+ exe "noswapfile e ".fnameescape("zipfile://".zipfile.'::'.fname)
+ filetype detect
+
+ let &report= repkeep
+" call Dret("ZipBrowseSelect : s:zipfile_".winnr()."<".s:zipfile_{winnr()}.">")
+endfun
+
+" ---------------------------------------------------------------------
+" zip#Read: {{{2
+fun! zip#Read(fname,mode)
+" call Dfunc("zip#Read(fname<".a:fname.">,mode=".a:mode.")")
+ let repkeep= &report
+ set report=10
+
+ if has("unix")
+ let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
+ let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
+ else
+ let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
+ let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
+ let fname = substitute(fname, '[', '[[]', 'g')
+ 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)
+ " but allows zipfile://... entries in quickfix lists
+ let temp = tempname()
+" call Decho("using temp file<".temp.">")
+ let fn = expand('%:p')
+ exe "sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp
+" call Decho("exe sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp)
+ sil exe 'keepalt file '.temp
+ sil keepj e!
+ sil exe 'keepalt file '.fnameescape(fn)
+ call delete(temp)
+
+ filetype detect
+
+ " cleanup
+ " keepj 0d " used to be needed for the ...r! ... method
+ set nomod
+
+ let &report= repkeep
+" call Dret("zip#Read")
+endfun
+
+" ---------------------------------------------------------------------
+" zip#Write: {{{2
+fun! zip#Write(fname)
+" call Dfunc("zip#Write(fname<".a:fname.">) zipfile_".winnr()."<".s:zipfile_{winnr()}.">")
+ let repkeep= &report
+ set report=10
+
+ " sanity checks
+ if !executable(substitute(g:zip_zipcmd,'\s\+.*$','',''))
+ redraw!
+ 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")
+ return
+ endif
+ if !exists("*mkdir")
+ redraw!
+ echohl Error | echo "***error*** (zip#Write) sorry, mkdir() doesn't work on your system" | echohl None
+" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+ let &report= repkeep
+" call Dret("zip#Write")
+ return
+ endif
+
+ let curdir= getcwd()
+ let tmpdir= tempname()
+" call Decho("orig tempname<".tmpdir.">")
+ if tmpdir =~ '\.'
+ let tmpdir= substitute(tmpdir,'\.[^.]*$','','e')
+ endif
+" call Decho("tmpdir<".tmpdir.">")
+ call mkdir(tmpdir,"p")
+
+ " attempt to change to the indicated directory
+ if s:ChgDir(tmpdir,s:ERROR,"(zip#Write) cannot cd to temporary directory")
+ let &report= repkeep
+" call Dret("zip#Write")
+ return
+ endif
+" call Decho("current directory now: ".getcwd())
+
+ " place temporary files under .../_ZIPVIM_/
+ if isdirectory("_ZIPVIM_")
+ call s:Rmdir("_ZIPVIM_")
+ endif
+ call mkdir("_ZIPVIM_")
+ cd _ZIPVIM_
+" call Decho("current directory now: ".getcwd())
+
+ if has("unix")
+ let zipfile = substitute(a:fname,'zipfile://\(.\{-}\)::[^\\].*$','\1','')
+ let fname = substitute(a:fname,'zipfile://.\{-}::\([^\\].*\)$','\1','')
+ else
+ let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
+ let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
+ endif
+" call Decho("zipfile<".zipfile.">")
+" call Decho("fname <".fname.">")
+
+ if fname =~ '/'
+ let dirpath = substitute(fname,'/[^/]\+$','','e')
+ if has("win32unix") && executable("cygpath")
+ let dirpath = substitute(system("cygpath ".s:Escape(dirpath,0)),'\n','','e')
+ endif
+" call Decho("mkdir(dirpath<".dirpath.">,p)")
+ call mkdir(dirpath,"p")
+ endif
+ if zipfile !~ '/'
+ let zipfile= curdir.'/'.zipfile
+ endif
+" call Decho("zipfile<".zipfile."> fname<".fname.">")
+
+ exe "w! ".fnameescape(fname)
+ if has("win32unix") && executable("cygpath")
+ let zipfile = substitute(system("cygpath ".s:Escape(zipfile,0)),'\n','','e')
+ endif
+
+ if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$'
+ let fname = substitute(fname, '[', '[[]', 'g')
+ endif
+
+" call Decho(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
+ call system(g:zip_zipcmd." -u ".s:Escape(fnamemodify(zipfile,":p"),0)." ".s:Escape(fname,0))
+ if v:shell_error != 0
+ redraw!
+ echohl Error | echo "***error*** (zip#Write) sorry, unable to update ".zipfile." with ".fname | echohl None
+" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+
+ elseif s:zipfile_{winnr()} =~ '^\a\+://'
+ " support writing zipfiles across a network
+ let netzipfile= s:zipfile_{winnr()}
+" call Decho("handle writing <".zipfile."> across network as <".netzipfile.">")
+ 1split|enew
+ let binkeep= &binary
+ let eikeep = &ei
+ set binary ei=all
+ exe "noswapfile e! ".fnameescape(zipfile)
+ call netrw#NetWrite(netzipfile)
+ let &ei = eikeep
+ let &binary = binkeep
+ q!
+ unlet s:zipfile_{winnr()}
+ endif
+
+ " cleanup and restore current directory
+ cd ..
+ call s:Rmdir("_ZIPVIM_")
+ call s:ChgDir(curdir,s:WARNING,"(zip#Write) unable to return to ".curdir."!")
+ call s:Rmdir(tmpdir)
+ setlocal nomod
+
+ let &report= repkeep
+" call Dret("zip#Write")
+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.")")
+ if exists("*shellescape")
+ if a:isfilt
+ let qnameq= shellescape(a:fname,1)
+ else
+ let qnameq= shellescape(a:fname)
+ endif
+ else
+ let qnameq= g:zip_shq.escape(a:fname,g:zip_shq).g:zip_shq
+ endif
+" call Dret("QuoteFileDir <".qnameq.">")
+ return qnameq
+endfun
+
+" ---------------------------------------------------------------------
+" ChgDir: {{{2
+fun! s:ChgDir(newdir,errlvl,errmsg)
+" call Dfunc("ChgDir(newdir<".a:newdir."> errlvl=".a:errlvl." errmsg<".a:errmsg.">)")
+
+ try
+ exe "cd ".fnameescape(a:newdir)
+ catch /^Vim\%((\a\+)\)\=:E344/
+ redraw!
+ if a:errlvl == s:NOTE
+ echo "***note*** ".a:errmsg
+ elseif a:errlvl == s:WARNING
+ echohl WarningMsg | echo "***warning*** ".a:errmsg | echohl NONE
+ elseif a:errlvl == s:ERROR
+ echohl Error | echo "***error*** ".a:errmsg | echohl NONE
+ endif
+" call inputsave()|call input("Press <cr> to continue")|call inputrestore()
+" call Dret("ChgDir 1")
+ return 1
+ endtry
+
+" call Dret("ChgDir 0")
+ return 0
+endfun
+
+" ---------------------------------------------------------------------
+" s:Rmdir: {{{2
+fun! s:Rmdir(fname)
+" call Dfunc("Rmdir(fname<".a:fname.">)")
+ if (has("win32") || has("win95") || has("win64") || has("win16")) && &shell !~? 'sh$'
+ call system("rmdir /S/Q ".s:Escape(a:fname,0))
+ else
+ call system("/bin/rm -rf ".s:Escape(a:fname,0))
+ endif
+" call Dret("Rmdir")
+endfun
+
+" ------------------------------------------------------------------------
+" Modelines And Restoration: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim:ts=8 fdm=marker
diff --git a/runtime/bitmaps/vim.ico b/runtime/bitmaps/vim.ico
new file mode 100644
index 0000000..6e998b7
--- /dev/null
+++ b/runtime/bitmaps/vim.ico
Binary files differ
diff --git a/runtime/bugreport.vim b/runtime/bugreport.vim
new file mode 100644
index 0000000..f7886a9
--- /dev/null
+++ b/runtime/bugreport.vim
@@ -0,0 +1,86 @@
+:" Use this script to create the file "bugreport.txt", which contains
+:" information about the environment of a possible bug in Vim.
+:"
+:" Maintainer: Bram Moolenaar <Bram@vim.org>
+:" Last change: 2019 Jan 27
+:"
+:" To use inside Vim:
+:" :so $VIMRUNTIME/bugreport.vim
+:" Or, from the command line:
+:" vim -s $VIMRUNTIME/bugreport.vim
+:"
+:" The "if 1" lines are to avoid error messages when expression evaluation is
+:" not compiled in.
+:"
+:if 1
+: let more_save = &more
+:endif
+:set nomore
+:if has("unix")
+: !echo "uname -a" >bugreport.txt
+: !uname -a >>bugreport.txt
+:endif
+:redir >>bugreport.txt
+:version
+:if 1
+: func <SID>CheckDir(n)
+: if isdirectory(a:n)
+: echo 'directory "' . a:n . '" exists'
+: else
+: echo 'directory "' . a:n . '" does NOT exist'
+: endif
+: endfun
+: func <SID>CheckFile(n)
+: if filereadable(a:n)
+: echo '"' . a:n . '" is readable'
+: else
+: echo '"' . a:n . '" is NOT readable'
+: endif
+: endfun
+: echo "--- Directories and Files ---"
+: echo '$VIM = "' . $VIM . '"'
+: call <SID>CheckDir($VIM)
+: echo '$VIMRUNTIME = "' . $VIMRUNTIME . '"'
+: call <SID>CheckDir($VIMRUNTIME)
+: call <SID>CheckFile(&helpfile)
+: call <SID>CheckFile(fnamemodify(&helpfile, ":h") . "/tags")
+: call <SID>CheckFile($VIMRUNTIME . "/menu.vim")
+: call <SID>CheckFile($VIMRUNTIME . "/filetype.vim")
+: call <SID>CheckFile($VIMRUNTIME . "/syntax/synload.vim")
+: delfun <SID>CheckDir
+: delfun <SID>CheckFile
+: echo "--- Scripts sourced ---"
+: scriptnames
+:endif
+:set all
+:set termcap
+:au
+:if 1
+: echo "--- Normal/Visual mode mappings ---"
+:endif
+:map
+:if 1
+: echo "--- Insert/Command-line mode mappings ---"
+:endif
+:map!
+:if 1
+: echo "--- Abbreviations ---"
+:endif
+:ab
+:if 1
+: echo "--- Highlighting ---"
+:endif
+:highlight
+:if 1
+: echo "--- Variables ---"
+:endif
+:if 1
+: let
+:endif
+:redir END
+:set more&
+:if 1
+: let &more = more_save
+: unlet more_save
+:endif
+:e bugreport.txt
diff --git a/runtime/colors/README.txt b/runtime/colors/README.txt
new file mode 100644
index 0000000..e4af1b9
--- /dev/null
+++ b/runtime/colors/README.txt
@@ -0,0 +1,145 @@
+README.txt for color scheme files
+
+These files are used for the `:colorscheme` command. They appear in the
+"Edit/Color Scheme" menu in the GUI.
+
+The colorschemes were updated for the Vim 9 release. If you don't like the
+changes you can find the old ones here:
+https://github.com/vim/colorschemes/tree/master/legacy_colors
+
+
+Hints for writing a color scheme file:
+
+There are two basic ways to define a color scheme:
+
+1. Define a new Normal color and set the 'background' option accordingly. >
+
+ set background={light or dark}
+ highlight clear
+ highlight Normal ...
+ ...
+
+2. Use the default Normal color and automatically adjust to the value of
+ 'background'. >
+
+ highlight clear Normal
+ set background&
+ highlight clear
+ if &background == "light"
+ highlight Error ...
+ ...
+ else
+ highlight Error ...
+ ...
+ endif
+
+You can use `:highlight clear` to reset everything to the defaults, and then
+change the groups that you want differently. This will also work for groups
+that are added in later versions of Vim.
+Note that `:highlight clear` uses the value of 'background', thus set it
+before this command.
+Some attributes (e.g., bold) might be set in the defaults that you want
+removed in your color scheme. Use something like "gui=NONE" to remove the
+attributes.
+
+In case you want to set 'background' depending on the colorscheme selected,
+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 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, see `:help highlight-groups` and
+`:help group-name` .
+
+You can use ":highlight" to find out the current colors. Exception: the
+ctermfg and ctermbg values are numbers, which are only valid for the current
+terminal. Use the color names instead for better portability. See
+`:help cterm-colors` .
+
+The default color settings can be found in the source file src/syntax.c.
+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/colors/tools/check_colors.vim script to check for
+ common mistakes.
+
+- Does it work in a color terminal as well as in the GUI? Is it consistent?
+
+- Is "g:colors_name" set to a meaningful value? In case of doubt you can do
+ it this way: >
+
+ let g:colors_name = expand('<sfile>:t:r')
+
+- Is 'background' either used or appropriately set to "light" or "dark"?
+
+- Try setting 'hlsearch' and searching for a pattern, is the match easy to
+ spot?
+
+- Split a window with ":split" and ":vsplit". Are the status lines and
+ vertical separators clearly visible?
+
+- In the GUI, is it easy to find the cursor, also in a file with lots of
+ syntax highlighting?
+
+- In general, test your color scheme against as many filetypes, Vim features,
+ environments, etc. as possible.
+
+- Do not use hard coded escape sequences, these will not work in other
+ terminals. Always use #RRGGBB for the GUI.
+
+- When targetting 8-16 colors terminals, don't count on "darkblue" to be blue
+ and dark, or on "2" to be even vaguely reddish. Names are more portable
+ than numbers, though.
+
+- When targetting 256 colors terminals, prefer colors 16-255 to colors 0-15
+ for the same reason.
+
+- Typographic attributes (bold, italic, underline, reverse, etc.) are not
+ universally supported. Don't count on any of them.
+
+- Is "g:terminal_ansi_colors" set to a list of 16 #RRGGBB values?
+
+- Try to keep your color scheme simple by avoiding unnecessary logic and
+ refraining from adding options. The best color scheme is one that only
+ requires: >
+
+ colorscheme foobar
+
+The color schemes distributed with Vim are built with lifepillar/colortemplate
+(https://github.com/lifepillar/vim-colortemplate). It is therefore highly
+recommended.
+
+If you would like your color scheme to be distributed with Vim, make sure
+that:
+
+- it satisfies the guidelines above,
+- it was made with colortemplate,
+
+and join us at vim/colorschemes: (https://github.com/vim/colorschemes).
+
+
+vim: set ft=help :
diff --git a/runtime/colors/blue.vim b/runtime/colors/blue.vim
new file mode 100644
index 0000000..7ac44c8
--- /dev/null
+++ b/runtime/colors/blue.vim
@@ -0,0 +1,586 @@
+" Name: blue
+" Description: Colorscheme with a blue background
+" Author: Original author Steven Vertigan <steven@vertigan.wattle.id.au>
+" Maintainer: Original maintainer Steven Vertigan <steven@vertigan.wattle.id.au>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:41:44 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'blue'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi Normal guifg=#ffd700 guibg=#000087 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#005faf gui=NONE cterm=NONE
+hi Pmenu guifg=#ffffff guibg=#008787 gui=NONE cterm=NONE
+hi PmenuSel guifg=#008787 guibg=#ffffff gui=NONE cterm=NONE
+hi QuickFixLine guifg=#000000 guibg=#d787d7 gui=NONE cterm=NONE
+hi ColorColumn guifg=NONE guibg=#870087 gui=NONE cterm=NONE
+hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Cursor guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#005faf gui=NONE cterm=NONE
+hi CursorIM guifg=#000000 guibg=#ffd700 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffd700 guibg=#005faf gui=bold cterm=NONE
+hi EndOfBuffer guifg=#ffd700 guibg=#000087 gui=NONE cterm=NONE
+hi Error guifg=#ff7f50 guibg=#000087 gui=reverse cterm=reverse
+hi ErrorMsg guifg=#ffffff guibg=#d70000 gui=NONE cterm=NONE
+hi FoldColumn guifg=#008787 guibg=NONE gui=NONE cterm=NONE
+hi Folded guifg=#000087 guibg=#878700 gui=NONE cterm=NONE
+hi IncSearch guifg=#d787d7 guibg=#000000 gui=standout cterm=reverse
+hi LineNr guifg=#5fffff guibg=NONE gui=NONE cterm=NONE
+hi MatchParen guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+hi ModeMsg guifg=#000087 guibg=#00ff00 gui=NONE cterm=NONE
+hi MoreMsg guifg=#5fffff guibg=NONE gui=NONE cterm=NONE
+hi NonText guifg=#d787d7 guibg=NONE gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE
+hi Question guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE
+hi Search guifg=#ffd700 guibg=#000000 gui=reverse cterm=reverse
+hi SignColumn guifg=#008787 guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#5fffff guibg=NONE gui=NONE cterm=NONE
+hi SpellBad guifg=#d70000 guibg=NONE guisp=#d70000 gui=undercurl cterm=underline
+hi SpellCap guifg=#00ff00 guibg=NONE guisp=#00ff00 gui=undercurl cterm=underline
+hi SpellLocal guifg=#ffffff guibg=NONE guisp=#ffffff gui=undercurl cterm=underline
+hi SpellRare guifg=#d787d7 guibg=NONE guisp=#d787d7 gui=undercurl cterm=underline
+hi StatusLine guifg=#000087 guibg=#5fffff gui=NONE cterm=NONE
+hi StatusLineNC guifg=#000087 guibg=#008787 gui=NONE cterm=NONE
+hi ToolbarButton guifg=#ffffff guibg=#005faf gui=NONE cterm=NONE
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi VertSplit guifg=#008787 guibg=NONE gui=NONE cterm=NONE
+hi Visual guifg=#ffffff guibg=#008787 gui=NONE cterm=NONE
+hi VisualNOS guifg=#008787 guibg=#ffffff gui=NONE cterm=NONE
+hi WarningMsg guifg=#d787d7 guibg=NONE gui=NONE cterm=NONE
+hi WildMenu guifg=#000087 guibg=#ffd700 gui=NONE cterm=NONE
+hi debugBreakpoint guifg=#00ff00 guibg=#000087 gui=reverse cterm=reverse
+hi debugPC guifg=#5fffff guibg=#000087 gui=reverse cterm=reverse
+hi Directory guifg=#5fffff guibg=NONE gui=NONE cterm=NONE
+hi Title guifg=#d787d7 guibg=NONE gui=NONE cterm=NONE
+hi Comment guifg=#878787 guibg=NONE gui=bold cterm=NONE
+hi Constant guifg=#5fffff guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=#878787 guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#d787d7 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#ffffff guibg=NONE gui=NONE cterm=NONE
+hi Todo guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+hi Type guifg=#ffa500 guibg=NONE gui=bold cterm=NONE
+hi Underlined guifg=NONE guibg=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline
+hi Label guifg=#ffd700 guibg=NONE gui=NONE cterm=NONE
+hi! link Terminal Normal
+hi! link Debug Special
+hi! link diffAdded String
+hi! link diffRemoved WarningMsg
+hi! link diffOnly WarningMsg
+hi! link diffNoEOL WarningMsg
+hi! link diffIsA WarningMsg
+hi! link diffIdentical WarningMsg
+hi! link diffDiffer WarningMsg
+hi! link diffCommon WarningMsg
+hi! link diffBDiffer WarningMsg
+hi! link lCursor Cursor
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineNr CursorLine
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link TabLine StatusLineNC
+hi! link TabLineFill StatusLineNC
+hi! link TabLineSel StatusLine
+hi! link Boolean Constant
+hi! link Character Constant
+hi! link Conditional Statement
+hi! link Define PreProc
+hi! link Delimiter Special
+hi! link Exception Statement
+hi! link Float Constant
+hi! link Function Identifier
+hi! link Include PreProc
+hi! link Keyword Statement
+hi! link Macro PreProc
+hi! link Number Constant
+hi! link Operator Type
+hi! link PreCondit PreProc
+hi! link Repeat Statement
+hi! link SpecialChar Special
+hi! link SpecialComment Special
+hi! link StorageClass Type
+hi! link String Constant
+hi! link Structure Type
+hi! link Tag Special
+hi! link Typedef Type
+hi! link Terminal Normal
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi Normal ctermfg=220 ctermbg=18 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=25 cterm=NONE
+ hi Pmenu ctermfg=231 ctermbg=30 cterm=NONE
+ hi PmenuSel ctermfg=30 ctermbg=231 cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=176 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=90 cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=16 ctermbg=46 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=25 cterm=NONE
+ hi CursorIM ctermfg=16 ctermbg=220 cterm=NONE
+ hi CursorLineNr ctermfg=220 ctermbg=25 cterm=NONE
+ hi EndOfBuffer ctermfg=220 ctermbg=18 cterm=NONE
+ hi Error ctermfg=209 ctermbg=18 cterm=reverse
+ hi ErrorMsg ctermfg=231 ctermbg=160 cterm=NONE
+ hi FoldColumn ctermfg=30 ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=18 ctermbg=100 cterm=NONE
+ hi IncSearch ctermfg=176 ctermbg=16 cterm=reverse
+ hi LineNr ctermfg=87 ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ModeMsg ctermfg=18 ctermbg=46 cterm=NONE
+ hi MoreMsg ctermfg=87 ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=176 ctermbg=NONE cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE
+ hi Question ctermfg=46 ctermbg=NONE cterm=NONE
+ hi Search ctermfg=220 ctermbg=16 cterm=reverse
+ hi SignColumn ctermfg=30 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=87 ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=160 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=46 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=231 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=176 ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=18 ctermbg=87 cterm=NONE
+ hi StatusLineNC ctermfg=18 ctermbg=30 cterm=NONE
+ hi ToolbarButton ctermfg=231 ctermbg=25 cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=30 ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=231 ctermbg=30 cterm=NONE
+ hi VisualNOS ctermfg=30 ctermbg=231 cterm=NONE
+ hi WarningMsg ctermfg=176 ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=18 ctermbg=220 cterm=NONE
+ hi debugBreakpoint ctermfg=46 ctermbg=18 cterm=reverse
+ hi debugPC ctermfg=87 ctermbg=18 cterm=reverse
+ hi Directory ctermfg=87 ctermbg=NONE cterm=NONE
+ hi Title ctermfg=176 ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=102 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=87 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=250 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=102 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=46 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=176 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=231 ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Type ctermfg=214 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Label ctermfg=220 ctermbg=NONE cterm=NONE
+ hi! link Terminal Normal
+ hi! link Debug Special
+ hi! link diffAdded String
+ hi! link diffRemoved WarningMsg
+ hi! link diffOnly WarningMsg
+ hi! link diffNoEOL WarningMsg
+ hi! link diffIsA WarningMsg
+ hi! link diffIdentical WarningMsg
+ hi! link diffDiffer WarningMsg
+ hi! link diffCommon WarningMsg
+ hi! link diffBDiffer WarningMsg
+ hi! link lCursor Cursor
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineNr CursorLine
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi! link TabLine StatusLineNC
+ hi! link TabLineFill StatusLineNC
+ hi! link TabLineSel StatusLine
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Conditional Statement
+ hi! link Define PreProc
+ hi! link Delimiter Special
+ hi! link Exception Statement
+ hi! link Float Constant
+ hi! link Function Identifier
+ hi! link Include PreProc
+ hi! link Keyword Statement
+ hi! link Macro PreProc
+ hi! link Number Constant
+ hi! link Operator Type
+ hi! link PreCondit PreProc
+ hi! link Repeat Statement
+ hi! link SpecialChar Special
+ hi! link SpecialComment Special
+ hi! link StorageClass Type
+ hi! link String Constant
+ hi! link Structure Type
+ hi! link Tag Special
+ hi! link Typedef Type
+ hi! link Terminal Normal
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=yellow ctermbg=darkblue cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=white cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=magenta cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=darkmagenta cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=black ctermbg=green cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=blue cterm=NONE
+ hi CursorIM ctermfg=black ctermbg=yellow cterm=NONE
+ hi CursorLineNr ctermfg=yellow ctermbg=blue cterm=NONE
+ hi EndOfBuffer ctermfg=yellow ctermbg=darkblue cterm=NONE
+ hi Error ctermfg=red ctermbg=darkblue cterm=reverse
+ hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=darkyellow cterm=NONE
+ hi IncSearch ctermfg=magenta ctermbg=black cterm=reverse
+ hi LineNr ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ModeMsg ctermfg=darkblue ctermbg=green cterm=NONE
+ hi MoreMsg ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE
+ hi Question ctermfg=green ctermbg=NONE cterm=NONE
+ hi Search ctermfg=yellow ctermbg=black cterm=reverse
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=green ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=white ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=darkblue ctermbg=cyan cterm=NONE
+ hi StatusLineNC ctermfg=darkblue ctermbg=darkcyan cterm=NONE
+ hi ToolbarButton ctermfg=white ctermbg=blue cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=white ctermbg=darkcyan cterm=NONE
+ hi VisualNOS ctermfg=darkcyan ctermbg=white cterm=NONE
+ hi WarningMsg ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=darkblue ctermbg=yellow cterm=NONE
+ hi debugBreakpoint ctermfg=green ctermbg=darkblue cterm=reverse
+ hi debugPC ctermfg=cyan ctermbg=darkblue cterm=reverse
+ hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Title ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=darkgray ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=gray ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=darkgray ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=green ctermbg=NONE cterm=NONE
+ hi Special ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=white ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Type ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Label ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi! link Terminal Normal
+ hi! link Debug Special
+ hi! link diffAdded String
+ hi! link diffRemoved WarningMsg
+ hi! link diffOnly WarningMsg
+ hi! link diffNoEOL WarningMsg
+ hi! link diffIsA WarningMsg
+ hi! link diffIdentical WarningMsg
+ hi! link diffDiffer WarningMsg
+ hi! link diffCommon WarningMsg
+ hi! link diffBDiffer WarningMsg
+ hi! link lCursor Cursor
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineNr CursorLine
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi! link TabLine StatusLineNC
+ hi! link TabLineFill StatusLineNC
+ hi! link TabLineSel StatusLine
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Conditional Statement
+ hi! link Define PreProc
+ hi! link Delimiter Special
+ hi! link Exception Statement
+ hi! link Float Constant
+ hi! link Function Identifier
+ hi! link Include PreProc
+ hi! link Keyword Statement
+ hi! link Macro PreProc
+ hi! link Number Constant
+ hi! link Operator Type
+ hi! link PreCondit PreProc
+ hi! link Repeat Statement
+ hi! link SpecialChar Special
+ hi! link SpecialComment Special
+ hi! link StorageClass Type
+ hi! link String Constant
+ hi! link Structure Type
+ hi! link Tag Special
+ hi! link Typedef Type
+ hi! link Terminal Normal
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=darkyellow ctermbg=blue cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Pmenu ctermfg=black ctermbg=cyan cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=gray cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=magenta cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=magenta cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=black ctermbg=green cterm=NONE
+ hi CursorColumn ctermfg=blue ctermbg=yellow cterm=bold,reverse
+ hi CursorIM ctermfg=black ctermbg=yellow cterm=NONE
+ hi EndOfBuffer ctermfg=yellow ctermbg=blue cterm=NONE
+ hi Error ctermfg=red ctermbg=blue cterm=reverse
+ hi ErrorMsg ctermfg=gray ctermbg=red cterm=NONE
+ hi FoldColumn ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=blue ctermbg=yellow cterm=NONE
+ hi IncSearch ctermfg=magenta ctermbg=black cterm=reverse
+ hi LineNr ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ModeMsg ctermfg=blue ctermbg=green cterm=NONE
+ hi MoreMsg ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE
+ hi Question ctermfg=green ctermbg=NONE cterm=NONE
+ hi Search ctermfg=yellow ctermbg=black cterm=reverse
+ hi SignColumn ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=yellow cterm=reverse
+ hi SpellCap ctermfg=green ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=gray ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=magenta ctermbg=yellow cterm=reverse
+ hi StatusLine ctermfg=cyan ctermbg=blue cterm=bold,reverse
+ hi StatusLineNC ctermfg=blue ctermbg=cyan cterm=NONE
+ hi ToolbarButton ctermfg=blue ctermbg=gray cterm=bold,reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=black ctermbg=cyan cterm=NONE
+ hi VisualNOS ctermfg=cyan ctermbg=gray cterm=NONE
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=blue ctermbg=yellow cterm=NONE
+ hi debugBreakpoint ctermfg=green ctermbg=blue cterm=reverse
+ hi debugPC ctermfg=cyan ctermbg=blue cterm=reverse
+ hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Title ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=black ctermbg=NONE cterm=bold
+ hi Constant ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=gray ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=gray ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=green ctermbg=NONE cterm=NONE
+ hi Special ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=gray ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Type ctermfg=red ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Label ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi! link Terminal Normal
+ hi! link Debug Special
+ hi! link diffAdded String
+ hi! link diffRemoved WarningMsg
+ hi! link diffOnly WarningMsg
+ hi! link diffNoEOL WarningMsg
+ hi! link diffIsA WarningMsg
+ hi! link diffIdentical WarningMsg
+ hi! link diffDiffer WarningMsg
+ hi! link diffCommon WarningMsg
+ hi! link diffBDiffer WarningMsg
+ hi! link lCursor Cursor
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineNr CursorLine
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi! link TabLine StatusLineNC
+ hi! link TabLineFill StatusLineNC
+ hi! link TabLineSel StatusLine
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Conditional Statement
+ hi! link Define PreProc
+ hi! link Delimiter Special
+ hi! link Exception Statement
+ hi! link Float Constant
+ hi! link Function Identifier
+ hi! link Include PreProc
+ hi! link Keyword Statement
+ hi! link Macro PreProc
+ hi! link Number Constant
+ hi! link Operator Type
+ hi! link PreCondit PreProc
+ hi! link Repeat Statement
+ hi! link SpecialChar Special
+ hi! link SpecialComment Special
+ hi! link StorageClass Type
+ hi! link String Constant
+ hi! link Structure Type
+ hi! link Tag Special
+ hi! link Typedef Type
+ hi! link Terminal Normal
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: x_black #000000 16 black
+" Color: x_darkred #cd0000 160 darkred
+" Color: x_darkgreen #00cd00 40 darkgreen
+" Color: x_darkyellow #cdcd00 184 darkyellow
+" Color: x_darkblue #0000ee 21 darkblue
+" Color: x_darkmagenta #cd00cd 164 darkmagenta
+" Color: x_darkcyan #00cdcd 44 darkcyan
+" Color: x_gray #e5e5e5 254 gray
+" Color: x_darkgray #7f7f7f 244 darkgray
+" Color: x_red #ff0000 196 red
+" Color: x_green #00ff00 46 green
+" Color: x_yellow #ffff00 226 yellow
+" Color: x_blue #5c5cff 63 blue
+" Color: x_magenta #ff00ff 201 magenta
+" Color: x_cyan #00ffff 51 cyan
+" Color: x_white #ffffff 231 white
+" Color: black #000000 16 black
+" Color: darkred #870000 88 darkred
+" Color: darkyellow #878700 100 darkyellow
+" Color: darkblue #000087 18 darkblue
+" Color: darkmagenta #870087 90 darkmagenta
+" Color: darkcyan #008787 30 darkcyan
+" Color: gray #bcbcbc 250 gray
+" Color: comment #878787 102 darkgray
+" Color: darkgray #878787 102 darkgray
+" Color: red #d70000 160 red
+" Color: green #00ff00 46 green
+" Color: yellow #ffd700 220 yellow
+" Color: blue #005faf 25 blue
+" Color: magenta #d787d7 176 magenta
+" Color: cyan #5fffff 87 cyan
+" Color: white #ffffff 231 white
+" Color: xtermblue #5fafff 75 blue
+" Color: xtermdarkblue #0087af 31 darkblue
+" Color: orange #ffa500 214 darkyellow
+" Color: darkgreen #006400 22 darkgreen
+" Color: coral #ff7f50 209 red
+" Color: olivedrab #6b8e23 64 green
+" Color: slateblue #6a5acd 62 darkmagenta
+" Term colors: x_black x_darkred x_darkgreen x_darkyellow x_darkblue x_darkmagenta x_darkcyan x_gray
+" Term colors: x_darkgray x_red x_green x_yellow x_blue x_magenta x_cyan x_white
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/darkblue.vim b/runtime/colors/darkblue.vim
new file mode 100644
index 0000000..140e7d4
--- /dev/null
+++ b/runtime/colors/darkblue.vim
@@ -0,0 +1,470 @@
+" Name: darkblue
+" Description: For those who prefer dark background
+" Author: Original author Bohdan Vlasyuk <bohdan@vstu.edu.ua>
+" Maintainer: Original author Bohdan Vlasyuk <bohdan@vstu.edu.ua>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:40:36 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'darkblue'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#8b0000', '#90f020', '#ffa500', '#00008b', '#8b008b', '#008b8b', '#c0c0c0', '#808080', '#ffa0a0', '#90f020', '#ffff60', '#0030ff', '#ff00ff', '#90fff0', '#ffffff']
+endif
+hi! link Terminal Normal
+hi! link CursorColumn CursorLine
+hi! link CursorIM Cursor
+hi! link EndOfBuffer NonText
+hi! link ErrorMsg Error
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link TabLineFill TabLine
+hi! link Boolean Constant
+hi! link Character Constant
+hi! link Conditional Statement
+hi! link Define PreProc
+hi! link Delimiter Special
+hi! link Exception Statement
+hi! link Float Constant
+hi! link Function Identifier
+hi! link Include PreProc
+hi! link Keyword Statement
+hi! link Label Statement
+hi! link Macro PreProc
+hi! link Number Constant
+hi! link Operator Statement
+hi! link PreCondit PreProc
+hi! link Repeat Statement
+hi! link SpecialChar Special
+hi! link SpecialComment Special
+hi! link StorageClass Type
+hi! link String Constant
+hi! link Structure Type
+hi! link Tag Special
+hi! link Typedef Type
+hi! link Debug Special
+hi! link diffAdded String
+hi! link diffRemoved WarningMsg
+hi! link diffOnly WarningMsg
+hi! link diffNoEOL WarningMsg
+hi! link diffIsA WarningMsg
+hi! link diffIdentical WarningMsg
+hi! link diffDiffer WarningMsg
+hi! link diffCommon WarningMsg
+hi! link diffBDiffer WarningMsg
+hi! link lCursor Cursor
+hi! link CurSearch Search
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#c0c0c0 guibg=#000040 gui=NONE cterm=NONE
+hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi ColorColumn guifg=#c0c0c0 guibg=#8b0000 gui=NONE cterm=NONE
+hi Cursor guifg=#000000 guibg=#ffff60 gui=NONE cterm=NONE
+hi QuickFixLine guifg=#000000 guibg=#ff80ff gui=NONE cterm=NONE
+hi Error guifg=#ffa0a0 guibg=NONE gui=reverse cterm=reverse
+hi FoldColumn guifg=#808080 guibg=NONE gui=bold cterm=NONE
+hi Folded guifg=#808080 guibg=NONE gui=bold cterm=NONE
+hi IncSearch guifg=#ffffff guibg=#0030ff gui=reverse cterm=reverse
+hi LineNr guifg=#90f020 guibg=NONE gui=NONE cterm=NONE
+hi MatchParen guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+hi ModeMsg guifg=#90fff0 guibg=NONE gui=NONE cterm=NONE
+hi MoreMsg guifg=#006400 guibg=NONE gui=NONE cterm=NONE
+hi NonText guifg=#0030ff guibg=NONE gui=NONE cterm=NONE
+hi Pmenu guifg=#ffffff guibg=#0030ff gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi PmenuSel guifg=#0030ff guibg=#ffffff gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE
+hi Question guifg=#90f020 guibg=NONE gui=NONE cterm=NONE
+hi SignColumn guifg=#808080 guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#008b8b guibg=NONE gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#90f020 guibg=NONE guisp=#90f020 gui=undercurl cterm=underline
+hi SpellLocal guifg=#90fff0 guibg=NONE guisp=#90fff0 gui=undercurl cterm=underline
+hi SpellRare guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline
+hi StatusLine guifg=#000040 guibg=#c0c0c0 gui=NONE cterm=NONE
+hi StatusLineNC guifg=#000000 guibg=#808080 gui=NONE cterm=NONE
+hi TabLine guifg=#000000 guibg=#808080 gui=NONE cterm=NONE
+hi ToolbarButton guifg=#ffffff guibg=#0030ff gui=NONE cterm=NONE
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi VertSplit guifg=#000000 guibg=#808080 gui=NONE cterm=NONE
+hi Visual guifg=#8080ff guibg=#ffffff gui=reverse cterm=reverse
+hi VisualNOS guifg=#8080ff guibg=#c0c0c0 gui=reverse,underline cterm=reverse,underline
+hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi WildMenu guifg=#ffff60 guibg=#000000 gui=NONE cterm=NONE
+hi debugBreakpoint guifg=#90f020 guibg=#00008b gui=reverse cterm=reverse
+hi debugPC guifg=#90fff0 guibg=#00008b gui=reverse cterm=reverse
+hi Directory guifg=#008b8b guibg=NONE gui=NONE cterm=NONE
+hi Title guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE
+hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#90fff0 guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=#000040 guibg=#c0c0c0 gui=NONE cterm=NONE
+hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#ffff60 guibg=NONE gui=NONE cterm=NONE
+hi Todo guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+hi Type guifg=#90f020 guibg=NONE gui=NONE cterm=NONE
+hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline
+hi TabLineSel guifg=#000040 guibg=#c0c0c0 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffff60 guibg=#666666 gui=NONE cterm=NONE
+hi Search guifg=#90fff0 guibg=#0030ff gui=NONE cterm=NONE
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link CursorColumn CursorLine
+ hi! link CursorIM Cursor
+ hi! link EndOfBuffer NonText
+ hi! link ErrorMsg Error
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link TabLineFill TabLine
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Conditional Statement
+ hi! link Define PreProc
+ hi! link Delimiter Special
+ hi! link Exception Statement
+ hi! link Float Constant
+ hi! link Function Identifier
+ hi! link Include PreProc
+ hi! link Keyword Statement
+ hi! link Label Statement
+ hi! link Macro PreProc
+ hi! link Number Constant
+ hi! link Operator Statement
+ hi! link PreCondit PreProc
+ hi! link Repeat Statement
+ hi! link SpecialChar Special
+ hi! link SpecialComment Special
+ hi! link StorageClass Type
+ hi! link String Constant
+ hi! link Structure Type
+ hi! link Tag Special
+ hi! link Typedef Type
+ hi! link Debug Special
+ hi! link diffAdded String
+ hi! link diffRemoved WarningMsg
+ hi! link diffOnly WarningMsg
+ hi! link diffNoEOL WarningMsg
+ hi! link diffIsA WarningMsg
+ hi! link diffIdentical WarningMsg
+ hi! link diffDiffer WarningMsg
+ hi! link diffCommon WarningMsg
+ hi! link diffBDiffer WarningMsg
+ hi! link lCursor Cursor
+ hi! link CurSearch Search
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=252 ctermbg=17 cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=252 ctermbg=88 cterm=NONE
+ hi Cursor ctermfg=16 ctermbg=227 cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=213 cterm=NONE
+ hi Error ctermfg=217 ctermbg=NONE cterm=reverse
+ hi FoldColumn ctermfg=102 ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=102 ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=231 ctermbg=27 cterm=reverse
+ hi LineNr ctermfg=118 ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ModeMsg ctermfg=123 ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=22 ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=27 ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=231 ctermbg=27 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=27 ctermbg=231 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE
+ hi Question ctermfg=118 ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=102 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=30 ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=118 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=123 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=17 ctermbg=252 cterm=NONE
+ hi StatusLineNC ctermfg=16 ctermbg=102 cterm=NONE
+ hi TabLine ctermfg=16 ctermbg=102 cterm=NONE
+ hi ToolbarButton ctermfg=231 ctermbg=27 cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=16 ctermbg=102 cterm=NONE
+ hi Visual ctermfg=105 ctermbg=231 cterm=reverse
+ hi VisualNOS ctermfg=105 ctermbg=252 cterm=reverse,underline
+ hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=227 ctermbg=16 cterm=NONE
+ hi debugBreakpoint ctermfg=118 ctermbg=18 cterm=reverse
+ hi debugPC ctermfg=123 ctermbg=18 cterm=reverse
+ hi Directory ctermfg=30 ctermbg=NONE cterm=NONE
+ hi Title ctermfg=201 ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=111 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=217 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=123 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=17 ctermbg=252 cterm=NONE
+ hi PreProc ctermfg=213 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=214 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=227 ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Type ctermfg=118 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=111 ctermbg=NONE cterm=underline
+ hi TabLineSel ctermfg=17 ctermbg=252 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=59 cterm=NONE
+ hi CursorLineNr ctermfg=227 ctermbg=59 cterm=NONE
+ hi Search ctermfg=123 ctermbg=27 cterm=NONE
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=grey ctermbg=darkred cterm=NONE
+ hi Cursor ctermfg=black ctermbg=yellow cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=magenta cterm=NONE
+ hi Error ctermfg=red ctermbg=NONE cterm=reverse
+ hi FoldColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=white ctermbg=blue cterm=reverse
+ hi LineNr ctermfg=green ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ModeMsg ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=white ctermbg=blue cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=blue ctermbg=white cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE
+ hi Question ctermfg=green ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=green ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=cyan ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkmagenta ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=black ctermbg=grey cterm=NONE
+ hi StatusLineNC ctermfg=black ctermbg=darkgrey cterm=NONE
+ hi TabLine ctermfg=black ctermbg=darkgrey cterm=NONE
+ hi ToolbarButton ctermfg=white ctermbg=blue cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=black ctermbg=darkgrey cterm=NONE
+ hi Visual ctermfg=blue ctermbg=white cterm=reverse
+ hi VisualNOS ctermfg=blue ctermbg=grey cterm=reverse,underline
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=yellow ctermbg=black cterm=NONE
+ hi debugBreakpoint ctermfg=green ctermbg=darkblue cterm=reverse
+ hi debugPC ctermfg=cyan ctermbg=darkblue cterm=reverse
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=red ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=black ctermbg=grey cterm=NONE
+ hi PreProc ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Type ctermfg=green ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=blue ctermbg=NONE cterm=underline
+ hi TabLineSel ctermfg=white ctermbg=black cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline
+ hi Search ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=grey ctermbg=darkred cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=grey ctermbg=darkmagenta cterm=NONE
+ hi Error ctermfg=darkred ctermbg=grey cterm=reverse
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=bold,reverse
+ hi IncSearch ctermfg=grey ctermbg=darkblue cterm=reverse
+ hi LineNr ctermfg=green ctermbg=NONE cterm=bold
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ModeMsg ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=grey ctermbg=blue cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=blue ctermbg=grey cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE
+ hi Question ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Search ctermfg=darkcyan ctermbg=blue cterm=NONE
+ hi SignColumn ctermfg=grey ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi StatusLine ctermfg=darkblue ctermbg=grey cterm=bold,reverse
+ hi StatusLineNC ctermfg=grey ctermbg=black cterm=reverse
+ hi VertSplit ctermfg=grey ctermbg=black cterm=reverse
+ hi TabLine ctermfg=grey ctermbg=black cterm=reverse
+ hi TabLineSel ctermfg=darkblue ctermbg=grey cterm=bold,reverse
+ hi ToolbarButton ctermfg=darkblue ctermbg=grey cterm=bold,reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=blue ctermbg=grey cterm=reverse
+ hi VisualNOS ctermfg=blue ctermbg=grey cterm=reverse,underline
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=yellow ctermbg=black cterm=NONE
+ hi debugBreakpoint ctermfg=darkgreen ctermbg=darkblue cterm=reverse
+ hi debugPC ctermfg=darkcyan ctermbg=darkblue cterm=reverse
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: white #FFFFFF 231 white
+" Color: black #000000 16 black
+" Color: diffc #0087af 31 darkcyan
+" Color: difft #005f87 24 cyan
+" Color: cursorl #666666 59 darkgrey
+" Color: ogDeepBlue #000040 17 black
+" Color: ogDarkBlue #00008b 18 darkblue
+" Color: ogBlue #0030ff 27 blue
+" Color: ogLightBlue #287eff 33 blue
+" Color: ogDarkGrey #a9a9a9 248 grey
+" Color: ogGrey #808080 102 darkgrey
+" Color: ogLightGrey #c0c0c0 252 grey
+" Color: ogDarkViolet #404080 61 darkblue
+" Color: ogViolet #8080ff 105 blue
+" Color: ogLightViolet #80a0ff 111 blue
+" Color: ogDarkGreen #006400 22 darkgreen
+" Color: ogGreen #90f020 118 green
+" Color: ogDarkCyan #008b8b 30 darkcyan
+" Color: ogCyan #90fff0 123 cyan
+" Color: ogLightCyan #b0ffff 159 cyan
+" Color: ogDarkerRed #8b0000 88 darkred
+" Color: ogDarkRed #d14a14 166 darkred
+" Color: ogRed #ff0000 196 red
+" Color: ogLightRed #ffa0a0 217 red
+" Color: ogDarkMag #8b008b 90 darkmagenta
+" Color: ogMagenta #ff00ff 201 darkmagenta
+" Color: ogLightMag #ff80ff 213 magenta
+" Color: ogOrange #ffa500 214 darkyellow
+" Color: ogYellow #ffff60 227 yellow
+" Term colors: black ogDarkerRed ogGreen ogOrange ogDarkBlue ogDarkMag ogDarkCyan ogLightGrey
+" Term colors: ogGrey ogLightRed ogGreen ogYellow ogBlue ogMagenta ogCyan white
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/default.vim b/runtime/colors/default.vim
new file mode 100644
index 0000000..7031157
--- /dev/null
+++ b/runtime/colors/default.vim
@@ -0,0 +1,23 @@
+" Vim color file
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2001 Jul 23
+
+" This is the default color scheme. It doesn't define the Normal
+" highlighting, it uses whatever the colors used to be.
+
+" Set 'background' back to the default. The value can't always be estimated
+" and is then guessed.
+hi clear Normal
+set bg&
+
+" Remove all existing highlighting and set the defaults.
+hi clear
+
+" Load the syntax highlighting defaults, if it's enabled.
+if exists("syntax_on")
+ syntax reset
+endif
+
+let colors_name = "default"
+
+" vim: sw=2
diff --git a/runtime/colors/delek.vim b/runtime/colors/delek.vim
new file mode 100644
index 0000000..9543b56
--- /dev/null
+++ b/runtime/colors/delek.vim
@@ -0,0 +1,411 @@
+" Name: delek
+" Description: Light background colorscheme.
+" Author: Original author David Schweikert <david@schweikert.ch>
+" Maintainer: Original maintainer David Schweikert <david@schweikert.ch>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Sun 04 Sep 2022 09:31:26 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=light
+
+hi clear
+let g:colors_name = 'delek'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#ffffff', '#0000ff', '#00cd00', '#cd00cd', '#008b8b', '#0000ff', '#ff1493', '#bcbcbc', '#ee0000', '#0000ff', '#00cd00', '#cd00cd', '#008b8b', '#0000ff', '#ff1493', '#000000']
+endif
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link ErrorMsg Error
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE
+hi StatusLine guifg=#ffff00 guibg=#00008b gui=bold cterm=bold
+hi StatusLineNC guifg=#ffd700 guibg=#00008b gui=NONE cterm=NONE
+hi StatusLineTerm guifg=#ffff00 guibg=#0000ff gui=bold cterm=bold
+hi StatusLineTermNC guifg=#e4e4e4 guibg=#0000ff gui=NONE cterm=NONE
+hi VertSplit guifg=#e4e4e4 guibg=#00008b gui=NONE cterm=NONE
+hi Pmenu guifg=#000000 guibg=#add8e6 gui=NONE cterm=NONE
+hi PmenuSel guifg=#ffffff guibg=#00008b gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=#ffffff gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#008b8b gui=NONE cterm=NONE
+hi TabLine guifg=#000000 guibg=#e4e4e4 gui=NONE cterm=NONE
+hi TabLineFill guifg=NONE guibg=#bcbcbc gui=NONE cterm=NONE
+hi TabLineSel guifg=#000000 guibg=#ffffff gui=bold cterm=bold
+hi ToolbarLine guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE
+hi ToolbarButton guifg=#ffffff guibg=#bcbcbc gui=bold cterm=bold
+hi NonText guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE
+hi Folded guifg=#00008b guibg=#e4e4e4 gui=NONE cterm=NONE
+hi Visual guifg=#000000 guibg=#d0d0d0 gui=NONE cterm=NONE
+hi VisualNOS guifg=NONE guibg=#ee0000 gui=NONE cterm=NONE
+hi LineNr guifg=#a52a2a guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#00008b guibg=NONE gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#a52a2a guibg=NONE gui=bold cterm=bold
+hi QuickFixLine guifg=#ffffff guibg=#008b8b gui=NONE cterm=NONE
+hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Underlined guifg=#6a5acd guibg=NONE gui=underline cterm=underline
+hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi WarningMsg guifg=#cd00cd guibg=#ffffff gui=NONE cterm=NONE
+hi MoreMsg guifg=#000000 guibg=#ffffff gui=bold cterm=bold
+hi ModeMsg guifg=#000000 guibg=#ffffff gui=bold cterm=bold
+hi Question guifg=#008700 guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi MatchParen guifg=#ffffff guibg=#ff1493 gui=NONE cterm=NONE
+hi Search guifg=#ffffff guibg=#cd00cd gui=NONE cterm=NONE
+hi IncSearch guifg=#00cd00 guibg=NONE gui=reverse cterm=reverse
+hi WildMenu guifg=#00008b guibg=#ffd700 gui=bold cterm=bold
+hi ColorColumn guifg=#000000 guibg=#e4e4e4 gui=NONE cterm=NONE
+hi Cursor guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE
+hi lCursor guifg=#000000 guibg=#00cd00 gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#008b8b guibg=NONE guisp=#008b8b gui=undercurl cterm=underline
+hi SpellLocal guifg=#0000ff guibg=NONE guisp=#0000ff gui=undercurl cterm=underline
+hi SpellRare guifg=#cd00cd guibg=NONE guisp=#cd00cd gui=undercurl cterm=underline
+hi debugBreakpoint guifg=#ffff00 guibg=#0000ff gui=NONE cterm=NONE
+hi debugPC guifg=#ff1493 guibg=#0000ff gui=NONE cterm=NONE
+hi Comment guifg=#ee0000 guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#00cd00 guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#008b8b guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#0000ff guibg=NONE gui=bold cterm=bold
+hi PreProc guifg=#cd00cd guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#0000ff guibg=NONE gui=bold cterm=bold
+hi Special guifg=#ff1493 guibg=NONE gui=NONE cterm=NONE
+hi Directory guifg=#008b8b guibg=NONE gui=bold cterm=bold
+hi Conceal guifg=#ee0000 guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Title guifg=#cd00cd guibg=NONE gui=bold cterm=bold
+hi CursorLine guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link ErrorMsg Error
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=16 ctermbg=231 cterm=NONE
+ hi EndOfBuffer ctermfg=250 ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=226 ctermbg=18 cterm=bold
+ hi StatusLineNC ctermfg=220 ctermbg=18 cterm=NONE
+ hi StatusLineTerm ctermfg=226 ctermbg=21 cterm=bold
+ hi StatusLineTermNC ctermfg=254 ctermbg=21 cterm=NONE
+ hi VertSplit ctermfg=254 ctermbg=18 cterm=NONE
+ hi Pmenu ctermfg=16 ctermbg=152 cterm=NONE
+ hi PmenuSel ctermfg=231 ctermbg=18 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=231 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=30 cterm=NONE
+ hi TabLine ctermfg=16 ctermbg=254 cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=250 cterm=NONE
+ hi TabLineSel ctermfg=16 ctermbg=231 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=254 cterm=NONE
+ hi ToolbarButton ctermfg=231 ctermbg=250 cterm=bold
+ hi NonText ctermfg=250 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=250 ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=18 ctermbg=254 cterm=NONE
+ hi Visual ctermfg=16 ctermbg=252 cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=196 cterm=NONE
+ hi LineNr ctermfg=124 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=18 ctermbg=NONE cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=254 cterm=NONE
+ hi CursorLineNr ctermfg=124 ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=231 ctermbg=30 cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=62 ctermbg=NONE cterm=underline
+ hi Error ctermfg=196 ctermbg=231 cterm=reverse
+ hi WarningMsg ctermfg=164 ctermbg=231 cterm=NONE
+ hi MoreMsg ctermfg=16 ctermbg=231 cterm=bold
+ hi ModeMsg ctermfg=16 ctermbg=231 cterm=bold
+ hi Question ctermfg=28 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=16 ctermbg=226 cterm=NONE
+ hi MatchParen ctermfg=231 ctermbg=198 cterm=NONE
+ hi Search ctermfg=231 ctermbg=164 cterm=NONE
+ hi IncSearch ctermfg=40 ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=18 ctermbg=220 cterm=bold
+ hi ColorColumn ctermfg=16 ctermbg=254 cterm=NONE
+ hi Cursor ctermfg=231 ctermbg=16 cterm=NONE
+ hi lCursor ctermfg=16 ctermbg=40 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=30 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=21 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=164 ctermbg=NONE cterm=underline
+ hi debugBreakpoint ctermfg=226 ctermbg=21 cterm=NONE
+ hi debugPC ctermfg=198 ctermbg=21 cterm=NONE
+ hi Comment ctermfg=196 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=40 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=30 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=21 ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=164 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=21 ctermbg=NONE cterm=bold
+ hi Special ctermfg=198 ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=30 ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=196 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=164 ctermbg=NONE cterm=bold
+ hi CursorLine ctermfg=NONE ctermbg=254 cterm=NONE
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=black ctermbg=white cterm=NONE
+ hi EndOfBuffer ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=yellow ctermbg=darkblue cterm=bold
+ hi StatusLineNC ctermfg=darkyellow ctermbg=darkblue cterm=NONE
+ hi StatusLineTerm ctermfg=yellow ctermbg=blue cterm=bold
+ hi StatusLineTermNC ctermfg=grey ctermbg=blue cterm=NONE
+ hi VertSplit ctermfg=grey ctermbg=darkblue cterm=NONE
+ hi Pmenu ctermfg=black ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=white ctermbg=darkblue cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=white cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi TabLineSel ctermfg=black ctermbg=white cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=grey cterm=NONE
+ hi ToolbarButton ctermfg=white ctermbg=darkgrey cterm=bold
+ hi NonText ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=grey cterm=NONE
+ hi Visual ctermfg=black ctermbg=darkgrey cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=darkred cterm=NONE
+ hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=grey cterm=NONE
+ hi CursorLineNr ctermfg=darkgrey ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=white ctermbg=darkcyan cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=blue ctermbg=NONE cterm=underline
+ hi Error ctermfg=red ctermbg=white cterm=reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=white cterm=NONE
+ hi MoreMsg ctermfg=black ctermbg=white cterm=bold
+ hi ModeMsg ctermfg=black ctermbg=white cterm=bold
+ hi Question ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Todo ctermfg=black ctermbg=yellow cterm=NONE
+ hi MatchParen ctermfg=white ctermbg=magenta cterm=NONE
+ hi Search ctermfg=white ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=darkblue ctermbg=darkyellow cterm=bold
+ hi ColorColumn ctermfg=black ctermbg=grey cterm=NONE
+ hi Cursor ctermfg=white ctermbg=black cterm=NONE
+ hi lCursor ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkmagenta ctermbg=NONE cterm=underline
+ hi debugBreakpoint ctermfg=yellow ctermbg=darkblue cterm=NONE
+ hi debugPC ctermfg=magenta ctermbg=darkblue cterm=NONE
+ hi Comment ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Type ctermfg=blue ctermbg=NONE cterm=bold
+ hi Special ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Visual ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=black ctermbg=gray cterm=NONE
+ hi EndOfBuffer ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=darkblue ctermbg=darkyellow cterm=bold,reverse
+ hi StatusLineNC ctermfg=darkblue ctermbg=darkyellow cterm=reverse
+ hi StatusLineTerm ctermfg=darkblue ctermbg=darkyellow cterm=bold,reverse
+ hi StatusLineTermNC ctermfg=darkblue ctermbg=darkyellow cterm=reverse
+ hi VertSplit ctermfg=darkblue ctermbg=darkyellow cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkgreen cterm=NONE
+ hi TabLine ctermfg=gray ctermbg=black cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=black cterm=NONE
+ hi TabLineSel ctermfg=black ctermbg=gray cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=gray cterm=bold,reverse
+ hi NonText ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi LineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi Error ctermfg=red ctermbg=gray cterm=reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Question ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkmagenta cterm=bold
+ hi Search ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkred cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=reverse
+ hi SpellCap ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi SpellLocal ctermfg=darkblue ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkmagenta ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=darkyellow ctermbg=darkblue cterm=NONE
+ hi debugPC ctermfg=darkmagenta ctermbg=darkblue cterm=NONE
+ hi Comment ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: light
+" Color: comment #ee0000 196 darkred
+" Color: constant #00cd00 40 darkgreen
+" Color: identifier #008b8b 30 darkcyan
+" Color: statement #0000ff 21 darkblue
+" Color: preproc #cd00cd 164 darkmagenta
+" Color: type #0000ff 21 blue
+" Color: special #ff1493 198 magenta
+" Color: fg0 #000000 16 black
+" Color: bg0 #ffffff 231 white
+" Color: bg1 #bcbcbc 250 darkgrey
+" Color: visual #d0d0d0 252 darkgrey
+" Color: folded #e4e4e4 254 grey
+" Color: pmenu #add8e6 152 grey
+" Color: wildmenu #00008b 18 darkblue
+" Color: error #ff0000 196 red
+" Color: status_fg #ffd700 220 darkyellow
+" Color: linenr #a52a2a 124 darkgrey
+" Color: Yellow #ffff00 226 yellow
+" Color: SlateBlue #6a5acd 62 blue
+" Color: black #000000 16 black
+" Color: darkred #870000 88 darkred
+" Color: darkgreen #008700 28 darkgreen
+" Color: darkyellow #878700 100 darkyellow
+" Color: darkblue #000087 18 darkblue
+" Color: darkmagenta #870087 18 darkmagenta
+" Color: darkcyan #008787 30 darkcyan
+" Color: gray #878787 102 gray
+" Term colors: bg0 statement constant preproc identifier type special bg1
+" Term colors: comment statement constant preproc identifier type special fg0
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/desert.vim b/runtime/colors/desert.vim
new file mode 100644
index 0000000..41ed976
--- /dev/null
+++ b/runtime/colors/desert.vim
@@ -0,0 +1,400 @@
+" Name: desert
+" Description: Light background colorscheme.
+" Author: Original author Hans Fugal <hans@fugal.net>
+" Maintainer: Original maintainer Hans Fugal <hans@fugal.net>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:39:21 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'desert'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#7f7f8c', '#cd5c5c', '#9acd32', '#bdb76b', '#75a0ff', '#eeee00', '#cd853f', '#666666', '#8a7f7f', '#ff0000', '#89fb98', '#f0e68c', '#6dceeb', '#ffde9b', '#ffa0a0', '#c2bfa5']
+endif
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link EndOfBuffer NonText
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#ffffff guibg=#333333 gui=NONE cterm=NONE
+hi StatusLine guifg=#333333 guibg=#c2bfa5 gui=NONE cterm=NONE
+hi StatusLineNC guifg=#7f7f8c guibg=#c2bfa5 gui=NONE cterm=NONE
+hi StatusLineTerm guifg=#333333 guibg=#c2bfa5 gui=NONE cterm=NONE
+hi StatusLineTermNC guifg=#ffffff guibg=#c2bfa5 gui=NONE cterm=NONE
+hi VertSplit guifg=#7f7f8c guibg=#c2bfa5 gui=NONE cterm=NONE
+hi Pmenu guifg=#ffffff guibg=#666666 gui=NONE cterm=NONE
+hi PmenuSel guifg=#333333 guibg=#f0e68c gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=#333333 gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#c2bfa5 gui=NONE cterm=NONE
+hi TabLine guifg=#333333 guibg=#c2bfa5 gui=NONE cterm=NONE
+hi TabLineFill guifg=NONE guibg=#c2bfa5 gui=NONE cterm=NONE
+hi TabLineSel guifg=#333333 guibg=#f0e68c gui=NONE cterm=NONE
+hi ToolbarLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE
+hi ToolbarButton guifg=#333333 guibg=#ffde9b gui=bold cterm=bold
+hi NonText guifg=#6dceeb guibg=#4d4d4d gui=NONE cterm=NONE
+hi SpecialKey guifg=#9acd32 guibg=NONE gui=NONE cterm=NONE
+hi Folded guifg=#eeee00 guibg=#4d4d4d gui=NONE cterm=NONE
+hi Visual guifg=#f0e68c guibg=#6b8e24 gui=NONE cterm=NONE
+hi VisualNOS guifg=#f0e68c guibg=#6dceeb gui=NONE cterm=NONE
+hi LineNr guifg=#eeee00 guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#eeee00 guibg=#4d4d4d gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#666666 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#eeee00 guibg=NONE gui=bold cterm=bold
+hi QuickFixLine guifg=#333333 guibg=#f0e68c gui=NONE cterm=NONE
+hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Underlined guifg=#75a0ff guibg=NONE gui=underline cterm=underline
+hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi ErrorMsg guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi ModeMsg guifg=#ffde9b guibg=NONE gui=bold cterm=bold
+hi WarningMsg guifg=#cd5c5c guibg=NONE gui=bold cterm=bold
+hi MoreMsg guifg=#9acd32 guibg=NONE gui=bold cterm=bold
+hi Question guifg=#89fb98 guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#ff0000 guibg=#eeee00 gui=NONE cterm=NONE
+hi MatchParen guifg=#7f7f8c guibg=#bdb76b gui=NONE cterm=NONE
+hi Search guifg=#f0e68c guibg=#7f7f8c gui=NONE cterm=NONE
+hi IncSearch guifg=#f0e68c guibg=#cd853f gui=NONE cterm=NONE
+hi WildMenu guifg=#333333 guibg=#eeee00 gui=NONE cterm=NONE
+hi ColorColumn guifg=#ffffff guibg=#cd5c5c gui=NONE cterm=NONE
+hi Cursor guifg=#333333 guibg=#f0e68c gui=NONE cterm=NONE
+hi lCursor guifg=#333333 guibg=#ff0000 gui=NONE cterm=NONE
+hi debugPC guifg=#666666 guibg=NONE gui=reverse cterm=reverse
+hi debugBreakpoint guifg=#ffa0a0 guibg=NONE gui=reverse cterm=reverse
+hi SpellBad guifg=#cd5c5c guibg=NONE guisp=#cd5c5c gui=undercurl cterm=underline
+hi SpellCap guifg=#75a0ff guibg=NONE guisp=#75a0ff gui=undercurl cterm=underline
+hi SpellLocal guifg=#ffde9b guibg=NONE guisp=#ffde9b gui=undercurl cterm=underline
+hi SpellRare guifg=#9acd32 guibg=NONE guisp=#9acd32 gui=undercurl cterm=underline
+hi Comment guifg=#6dceeb guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#89fb98 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#f0e68c guibg=NONE gui=bold cterm=bold
+hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#cd5c5c guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#bdb76b guibg=NONE gui=bold cterm=bold
+hi Special guifg=#ffde9b guibg=NONE gui=NONE cterm=NONE
+hi Directory guifg=#6dceeb guibg=NONE gui=NONE cterm=NONE
+hi Conceal guifg=#666666 guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Title guifg=#cd5c5c guibg=NONE gui=bold cterm=bold
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link EndOfBuffer NonText
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=231 ctermbg=236 cterm=NONE
+ hi StatusLine ctermfg=236 ctermbg=144 cterm=NONE
+ hi StatusLineNC ctermfg=242 ctermbg=144 cterm=NONE
+ hi StatusLineTerm ctermfg=236 ctermbg=144 cterm=NONE
+ hi StatusLineTermNC ctermfg=231 ctermbg=144 cterm=NONE
+ hi VertSplit ctermfg=242 ctermbg=144 cterm=NONE
+ hi Pmenu ctermfg=231 ctermbg=241 cterm=NONE
+ hi PmenuSel ctermfg=236 ctermbg=186 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=236 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=144 cterm=NONE
+ hi TabLine ctermfg=236 ctermbg=144 cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=144 cterm=NONE
+ hi TabLineSel ctermfg=236 ctermbg=186 cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=241 cterm=NONE
+ hi ToolbarButton ctermfg=236 ctermbg=222 cterm=bold
+ hi NonText ctermfg=81 ctermbg=239 cterm=NONE
+ hi SpecialKey ctermfg=112 ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=226 ctermbg=239 cterm=NONE
+ hi Visual ctermfg=186 ctermbg=64 cterm=NONE
+ hi VisualNOS ctermfg=186 ctermbg=81 cterm=NONE
+ hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=226 ctermbg=239 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=241 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=241 cterm=NONE
+ hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=236 ctermbg=186 cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=111 ctermbg=NONE cterm=underline
+ hi Error ctermfg=196 ctermbg=231 cterm=reverse
+ hi ErrorMsg ctermfg=196 ctermbg=231 cterm=reverse
+ hi ModeMsg ctermfg=222 ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=167 ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=112 ctermbg=NONE cterm=bold
+ hi Question ctermfg=120 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=196 ctermbg=226 cterm=NONE
+ hi MatchParen ctermfg=242 ctermbg=143 cterm=NONE
+ hi Search ctermfg=186 ctermbg=242 cterm=NONE
+ hi IncSearch ctermfg=186 ctermbg=172 cterm=NONE
+ hi WildMenu ctermfg=236 ctermbg=226 cterm=NONE
+ hi ColorColumn ctermfg=231 ctermbg=167 cterm=NONE
+ hi debugPC ctermfg=241 ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=217 ctermbg=NONE cterm=reverse
+ hi SpellBad ctermfg=167 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=111 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=222 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=112 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=81 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=120 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=186 ctermbg=NONE cterm=bold
+ hi Constant ctermfg=217 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=167 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=143 ctermbg=NONE cterm=bold
+ hi Special ctermfg=222 ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=81 ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=241 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=167 ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=white ctermbg=black cterm=NONE
+ hi StatusLine ctermfg=black ctermbg=grey cterm=NONE
+ hi StatusLineNC ctermfg=darkgrey ctermbg=grey cterm=NONE
+ hi StatusLineTerm ctermfg=black ctermbg=grey cterm=NONE
+ hi StatusLineTermNC ctermfg=darkgrey ctermbg=grey cterm=NONE
+ hi VertSplit ctermfg=darkgrey ctermbg=grey cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=white cterm=NONE
+ hi TabLineSel ctermfg=white ctermbg=black cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi NonText ctermfg=blue ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkyellow ctermbg=darkgrey cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=black ctermbg=yellow cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi Error ctermfg=red ctermbg=white cterm=reverse
+ hi ErrorMsg ctermfg=red ctermbg=white cterm=reverse
+ hi ModeMsg ctermfg=magenta ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Question ctermfg=green ctermbg=NONE cterm=bold
+ hi Todo ctermfg=red ctermbg=darkmagenta cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Search ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=yellow cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi ColorColumn ctermfg=white ctermbg=darkred cterm=NONE
+ hi debugPC ctermfg=grey ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=cyan ctermbg=NONE cterm=reverse
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkblue ctermbg=grey cterm=reverse
+ hi SpellLocal ctermfg=darkyellow ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi Comment ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=green ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=yellow ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Special ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkred ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi StatusLine ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi StatusLineNC ctermfg=grey ctermbg=black cterm=reverse
+ hi StatusLineTerm ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi StatusLineTermNC ctermfg=grey ctermbg=black cterm=reverse
+ hi VertSplit ctermfg=grey ctermbg=black cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLineSel ctermfg=grey ctermbg=black cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi NonText ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Error ctermfg=darkred ctermbg=grey cterm=reverse
+ hi ErrorMsg ctermfg=darkred ctermbg=grey cterm=reverse
+ hi ModeMsg ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Question ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Todo ctermfg=darkred ctermbg=darkmagenta cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Search ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi ColorColumn ctermfg=grey ctermbg=darkred cterm=NONE
+ hi debugPC ctermfg=grey ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkblue ctermbg=grey cterm=reverse
+ hi SpellLocal ctermfg=darkyellow ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi Comment ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Identifier ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Special ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi Directory ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkred ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: foreground #ffffff 231 white
+" Color: background #333333 236 black
+" Color: color00 #7f7f8c 242 black
+" Color: color08 #8a7f7f 244 darkgrey
+" Color: color01 #cd5c5c 167 darkred
+" Color: color09 #ff0000 196 red
+" Color: color02 #9acd32 112 darkgreen
+" Color: color10 #89fb98 120 green
+" Color: color03 #bdb76b 143 darkyellow
+" Color: color11 #f0e68c 186 yellow
+" Color: color04 #75a0ff 111 darkblue
+" Color: color12 #6dceeb 81 blue
+" Color: color05 #eeee00 226 darkmagenta
+" Color: color13 #ffde9b 222 magenta
+" Color: color06 #cd853f 172 darkcyan
+" Color: color14 #ffa0a0 217 cyan
+" Color: color07 #666666 241 grey
+" Color: color15 #c2bfa5 144 white
+" Color: color16 #6b8e24 64 darkgreen
+" Color: color17 #4d4d4d 239 grey
+" Term colors: color00 color01 color02 color03 color04 color05 color06 color07
+" Term colors: color08 color09 color10 color11 color12 color13 color14 color15
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/elflord.vim b/runtime/colors/elflord.vim
new file mode 100644
index 0000000..e9efd3d
--- /dev/null
+++ b/runtime/colors/elflord.vim
@@ -0,0 +1,449 @@
+" Name: elflord
+" Author: original author Ron Aaron <ron@ronware.org>
+" Maintainer: original maintainer Ron Aaron <ron@ronware.org>
+" Website: https://www.github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:44:22 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'elflord'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+hi! link Terminal Normal
+hi! link Boolean Constant
+hi! link Character Constant
+hi! link Conditional Repeat
+hi! link Debug Special
+hi! link Define PreProc
+hi! link Delimiter Special
+hi! link Exception Statement
+hi! link Float Number
+hi! link Include PreProc
+hi! link Keyword Statement
+hi! link Label Statement
+hi! link Macro PreProc
+hi! link Number Constant
+hi! link PopupSelected PmenuSel
+hi! link PreCondit PreProc
+hi! link SpecialChar Special
+hi! link SpecialComment Special
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link StorageClass Type
+hi! link String Constant
+hi! link Structure Type
+hi! link Tag Special
+hi! link Typedef Type
+hi! link lCursor Cursor
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi Normal guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE
+hi QuickFixLine guifg=#ffffff guibg=#2e8b57 gui=NONE cterm=NONE
+hi ColorColumn guifg=NONE guibg=#cd0000 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#3a3a3a gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#3a3a3a gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=bold
+hi Folded guifg=#00ffff guibg=#666666 gui=NONE cterm=NONE
+hi Conceal guifg=#666666 guibg=NONE gui=NONE cterm=NONE
+hi Cursor guifg=#000000 guibg=#00ffff gui=NONE cterm=NONE
+hi Directory guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#0000ff guibg=#000000 gui=bold cterm=NONE
+hi ErrorMsg guifg=#ffffff guibg=#cd0000 gui=NONE cterm=NONE
+hi FoldColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi IncSearch guifg=NONE guibg=#000000 gui=reverse cterm=reverse
+hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE
+hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold
+hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=bold
+hi NonText guifg=#0000ff guibg=NONE gui=bold cterm=bold
+hi Pmenu guifg=#ffffff guibg=#444444 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=#bebebe gui=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE
+hi Question guifg=#00ff00 guibg=NONE gui=bold cterm=bold
+hi Search guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi SignColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#0000ff guibg=NONE guisp=#0000ff gui=undercurl cterm=underline
+hi SpellLocal guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline
+hi SpellRare guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline
+hi StatusLine guifg=#000000 guibg=#00ffff gui=bold cterm=bold
+hi StatusLineNC guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE
+hi TabLine guifg=#000000 guibg=#008b8b gui=NONE cterm=NONE
+hi TabLineFill guifg=NONE guibg=#000000 gui=reverse cterm=reverse
+hi TabLineSel guifg=#00ffff guibg=#000000 gui=bold cterm=bold
+hi Terminal guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE
+hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=bold
+hi VertSplit guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE
+hi Visual guifg=#000000 guibg=#a9a9a9 gui=NONE cterm=NONE
+hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline
+hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE
+hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE
+hi Function guifg=#ffffff guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#40ffff guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE
+hi Operator guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE
+hi Repeat guifg=#ffffff guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#aa4444 guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#0000ff guibg=#ffff00 gui=NONE cterm=NONE
+hi Type guifg=#60ff60 guibg=NONE gui=bold cterm=bold
+hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline
+hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=bold
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi Normal ctermfg=51 ctermbg=16 cterm=NONE
+ hi QuickFixLine ctermfg=231 ctermbg=29 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=160 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=237 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=237 cterm=NONE
+ hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=bold
+ hi Folded ctermfg=51 ctermbg=59 cterm=NONE
+ hi Conceal ctermfg=59 ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=16 ctermbg=51 cterm=NONE
+ hi Directory ctermfg=51 ctermbg=16 cterm=NONE
+ hi EndOfBuffer ctermfg=21 ctermbg=16 cterm=NONE
+ hi ErrorMsg ctermfg=231 ctermbg=160 cterm=NONE
+ hi FoldColumn ctermfg=51 ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=NONE ctermbg=16 cterm=reverse
+ hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=30 cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=29 ctermbg=NONE cterm=bold
+ hi NonText ctermfg=21 ctermbg=NONE cterm=bold
+ hi Pmenu ctermfg=231 ctermbg=238 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=250 cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=44 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE
+ hi Question ctermfg=46 ctermbg=NONE cterm=bold
+ hi Search ctermfg=16 ctermbg=226 cterm=NONE
+ hi SignColumn ctermfg=51 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=51 ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=21 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=226 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=16 ctermbg=51 cterm=bold
+ hi StatusLineNC ctermfg=16 ctermbg=44 cterm=NONE
+ hi TabLine ctermfg=16 ctermbg=30 cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=16 cterm=reverse
+ hi TabLineSel ctermfg=51 ctermbg=16 cterm=bold
+ hi Terminal ctermfg=51 ctermbg=16 cterm=NONE
+ hi Title ctermfg=201 ctermbg=NONE cterm=bold
+ hi VertSplit ctermfg=16 ctermbg=44 cterm=NONE
+ hi Visual ctermfg=16 ctermbg=145 cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline
+ hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE
+ hi Comment ctermfg=111 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=201 ctermbg=NONE cterm=NONE
+ hi Error ctermfg=231 ctermbg=196 cterm=NONE
+ hi Function ctermfg=231 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=87 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=16 ctermbg=16 cterm=NONE
+ hi Operator ctermfg=196 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=213 ctermbg=NONE cterm=NONE
+ hi Repeat ctermfg=231 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=196 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=131 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=21 ctermbg=226 cterm=NONE
+ hi Type ctermfg=83 ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=111 ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=16 ctermbg=254 cterm=bold
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=cyan ctermbg=black cterm=NONE
+ hi QuickFixLine ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi ColorColumn ctermfg=cyan ctermbg=darkred cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=black ctermbg=cyan cterm=NONE
+ hi Directory ctermfg=cyan ctermbg=black cterm=NONE
+ hi EndOfBuffer ctermfg=darkblue ctermbg=black cterm=NONE
+ hi ErrorMsg ctermfg=white ctermbg=darkred cterm=NONE
+ hi FoldColumn ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=NONE ctermbg=black cterm=reverse
+ hi LineNr ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi NonText ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE
+ hi Question ctermfg=green ctermbg=NONE cterm=bold
+ hi Search ctermfg=black ctermbg=yellow cterm=NONE
+ hi SignColumn ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=yellow ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=black ctermbg=cyan cterm=bold
+ hi StatusLineNC ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi TabLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=black cterm=reverse
+ hi TabLineSel ctermfg=cyan ctermbg=black cterm=bold
+ hi Terminal ctermfg=cyan ctermbg=black cterm=NONE
+ hi Title ctermfg=magenta ctermbg=NONE cterm=bold
+ hi VertSplit ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi Visual ctermfg=black ctermbg=darkgrey cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE
+ hi Comment ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Error ctermfg=white ctermbg=red cterm=NONE
+ hi Function ctermfg=white ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=black ctermbg=black cterm=NONE
+ hi Operator ctermfg=red ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Repeat ctermfg=white ctermbg=NONE cterm=NONE
+ hi Special ctermfg=red ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Todo ctermfg=blue ctermbg=yellow cterm=NONE
+ hi Type ctermfg=green ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=blue ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=grey cterm=bold
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=darkcyan ctermbg=black cterm=NONE
+ hi QuickFixLine ctermfg=grey ctermbg=darkgreen cterm=NONE
+ hi ColorColumn ctermfg=darkcyan ctermbg=darkred cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=underline
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=grey ctermbg=darkred cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=grey ctermbg=NONE cterm=NONE
+ hi PmenuSbar ctermfg=grey ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi Question ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Search ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkblue ctermbg=darkyellow cterm=reverse
+ hi SpellLocal ctermfg=darkyellow ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi StatusLine ctermfg=darkcyan ctermbg=NONE cterm=bold,reverse
+ hi StatusLineNC ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi TabLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Terminal ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi Visual ctermfg=black ctermbg=grey cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Comment ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Error ctermfg=grey ctermbg=darkred cterm=NONE
+ hi Function ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=black ctermbg=NONE cterm=NONE
+ hi Operator ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Repeat ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=darkblue ctermbg=darkyellow cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=grey cterm=NONE
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: xterm0 #000000 16 black
+" Color: xterm1 #cd0000 160 darkred
+" Color: xterm2 #00cd00 40 darkgreen
+" Color: xterm3 #cdcd00 184 darkyellow
+" Color: xterm4 #0000ee 20 darkblue
+" Color: xterm5 #cd00cd 164 darkmagenta
+" Color: xterm6 #00cdcd 44 darkcyan
+" Color: xterm7 #e5e5e5 254 grey
+" Color: xterm8 #7f7f7f 102 darkgrey
+" Color: xterm9 #ff0000 196 red
+" Color: xterm10 #00ff00 46 green
+" Color: xterm11 #ffff00 226 yellow
+" Color: xterm12 #5c5cff 63 blue
+" Color: xterm13 #ff00ff 201 magenta
+" Color: xterm14 #00ffff 51 cyan
+" Color: xterm15 #ffffff 231 white
+" Color: Pmenu #444444 238 darkgrey
+" Color: CursorLine #3a3a3a 237 darkgrey
+" Color: rgbGrey40 #666666 59 darkgrey
+" Color: rgbDarkGrey #a9a9a9 145 darkgrey
+" Color: rgbBlue #0000ff 21 darkblue
+" Color: rgbDarkCyan #008b8b 30 darkcyan
+" Color: Directory #00ffff 51 cyan
+" Color: rgbSeaGreen #2e8b57 29 darkgreen
+" Color: rgbGrey #bebebe 250 grey
+" Color: Question #00ff00 46 green
+" Color: SignColumn #a9a9a9 248 grey
+" Color: SpecialKey #00ffff 51 cyan
+" Color: Title #ff00ff 201 magenta
+" Color: WarningMsg #ff0000 196 red
+" Color: ToolbarLine #7f7f7f 244 darkgrey
+" Color: Underlined #80a0ff 111 blue
+" Color: elfComment #80a0ff 111 blue
+" Color: elfIdentifier #40ffff 87 cyan
+" Color: elfStatement #aa4444 131 darkred
+" Color: elfPreProc #ff80ff 213 magenta
+" Color: elfType #60ff60 83 green
+" Color: elfBlue #0000ff 21 blue
+" Term colors: xterm0 xterm1 xterm2 xterm3 xterm4 xterm5 xterm6 xterm7
+" Term colors: xterm8 xterm9 xterm10 xterm11 xterm12 xterm13
+" Term colors: xterm14 xterm15
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/evening.vim b/runtime/colors/evening.vim
new file mode 100644
index 0000000..be6c43f
--- /dev/null
+++ b/runtime/colors/evening.vim
@@ -0,0 +1,531 @@
+" Name: evening
+" Description: This color scheme uses a dark grey background.
+" Author: Original author Bram Moolenaar <Bram@vim.org>
+" Maintainer: Original maintainer Steven Vertigan <steven@vertigan.wattle.id.au>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Sun 04 Sep 2022 09:48:34 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'evening'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0087ff', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi! link VertSplit StatusLineNC
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link TabLineFill TabLine
+hi! link Terminal Normal
+hi! link CursorColumn CursorLine
+hi! link CursorIM Cursor
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link Debug Special
+hi! link diffAdded String
+hi! link diffRemoved WarningMsg
+hi! link diffOnly WarningMsg
+hi! link diffNoEOL WarningMsg
+hi! link diffIsA WarningMsg
+hi! link diffIdentical WarningMsg
+hi! link diffDiffer WarningMsg
+hi! link diffCommon WarningMsg
+hi! link diffBDiffer WarningMsg
+hi! link lCursor Cursor
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link Boolean Constant
+hi! link Character Constant
+hi! link Conditional Statement
+hi! link Define PreProc
+hi! link Delimiter Special
+hi! link Exception Statement
+hi! link Float Constant
+hi! link Function Identifier
+hi! link Include PreProc
+hi! link Keyword Statement
+hi! link Label Statement
+hi! link Macro PreProc
+hi! link Number Constant
+hi! link Operator Statement
+hi! link PreCondit PreProc
+hi! link Repeat Statement
+hi! link SpecialChar Special
+hi! link SpecialComment Special
+hi! link StorageClass Type
+hi! link String Constant
+hi! link Structure Type
+hi! link Tag Special
+hi! link Typedef Type
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#ffffff guibg=#333333 gui=NONE cterm=NONE
+hi ColorColumn guifg=NONE guibg=#8b0000 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffff00 guibg=#666666 gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#add8e6 guibg=#4d4d4d gui=NONE cterm=NONE
+hi StatusLine guifg=#333333 guibg=#ffffff gui=bold cterm=bold
+hi StatusLineNC guifg=#333333 guibg=#d3d3d3 gui=NONE cterm=NONE
+hi TabLineSel guifg=#333333 guibg=#ffffff gui=bold cterm=bold
+hi TabLine guifg=#333333 guibg=#d3d3d3 gui=NONE cterm=NONE
+hi Pmenu guifg=#ffffff guibg=#4d4d4d gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#bebebe gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE
+hi QuickFixLine guifg=#ffffff guibg=#8b008b gui=NONE cterm=NONE
+hi Cursor guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE
+hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi ErrorMsg guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE
+hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi FoldColumn guifg=#add8e6 guibg=NONE gui=NONE cterm=NONE
+hi Folded guifg=#00008b guibg=#d3d3d3 gui=bold cterm=bold
+hi IncSearch guifg=#00ff00 guibg=NONE gui=reverse cterm=reverse
+hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE
+hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold
+hi MoreMsg guifg=#2e8b57 guibg=NONE gui=NONE cterm=NONE
+hi NonText guifg=#add8e6 guibg=#4d4d4d gui=NONE cterm=NONE
+hi Question guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE
+hi Search guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi SignColumn guifg=#008b8b guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi ToolbarButton guifg=NONE guibg=#999999 gui=bold cterm=bold
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Visual guifg=#ffffff guibg=#999999 gui=NONE cterm=NONE
+hi VisualNOS guifg=NONE guibg=NONE gui=bold,underline ctermfg=NONE ctermbg=NONE cterm=bold,underline
+hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=bold cterm=bold
+hi debugBreakpoint guifg=#00008b guibg=#ff0000 gui=NONE cterm=NONE
+hi debugPC guifg=#00008b guibg=#0000ff gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#00ff00 guibg=NONE guisp=#00ff00 gui=undercurl cterm=underline
+hi SpellLocal guifg=#00ffff guibg=NONE guisp=#00ffff gui=undercurl cterm=underline
+hi SpellRare guifg=#ff80ff guibg=NONE guisp=#ff80ff gui=undercurl cterm=underline
+hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi Title guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE
+hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=#333333 guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#ffff60 guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#ffff00 guibg=#0000ff gui=reverse cterm=reverse
+hi Type guifg=#00ff00 guibg=NONE gui=bold cterm=bold
+hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link VertSplit StatusLineNC
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi! link TabLineFill TabLine
+ hi! link Terminal Normal
+ hi! link CursorColumn CursorLine
+ hi! link CursorIM Cursor
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link Debug Special
+ hi! link diffAdded String
+ hi! link diffRemoved WarningMsg
+ hi! link diffOnly WarningMsg
+ hi! link diffNoEOL WarningMsg
+ hi! link diffIsA WarningMsg
+ hi! link diffIdentical WarningMsg
+ hi! link diffDiffer WarningMsg
+ hi! link diffCommon WarningMsg
+ hi! link diffBDiffer WarningMsg
+ hi! link lCursor Cursor
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Conditional Statement
+ hi! link Define PreProc
+ hi! link Delimiter Special
+ hi! link Exception Statement
+ hi! link Float Constant
+ hi! link Function Identifier
+ hi! link Include PreProc
+ hi! link Keyword Statement
+ hi! link Label Statement
+ hi! link Macro PreProc
+ hi! link Number Constant
+ hi! link Operator Statement
+ hi! link PreCondit PreProc
+ hi! link Repeat Statement
+ hi! link SpecialChar Special
+ hi! link SpecialComment Special
+ hi! link StorageClass Type
+ hi! link String Constant
+ hi! link Structure Type
+ hi! link Tag Special
+ hi! link Typedef Type
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=231 ctermbg=236 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=88 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=241 cterm=NONE
+ hi CursorLineNr ctermfg=226 ctermbg=241 cterm=NONE
+ hi EndOfBuffer ctermfg=153 ctermbg=239 cterm=NONE
+ hi StatusLine ctermfg=236 ctermbg=231 cterm=bold
+ hi StatusLineNC ctermfg=236 ctermbg=252 cterm=NONE
+ hi TabLineSel ctermfg=236 ctermbg=231 cterm=bold
+ hi TabLine ctermfg=236 ctermbg=252 cterm=NONE
+ hi Pmenu ctermfg=231 ctermbg=239 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=250 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE
+ hi QuickFixLine ctermfg=231 ctermbg=90 cterm=NONE
+ hi Cursor ctermfg=16 ctermbg=46 cterm=NONE
+ hi Error ctermfg=196 ctermbg=231 cterm=reverse
+ hi ErrorMsg ctermfg=231 ctermbg=196 cterm=NONE
+ hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=153 ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=18 ctermbg=252 cterm=bold
+ hi IncSearch ctermfg=46 ctermbg=NONE cterm=reverse
+ hi MatchParen ctermfg=NONE ctermbg=30 cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=153 ctermbg=239 cterm=NONE
+ hi Question ctermfg=46 ctermbg=NONE cterm=NONE
+ hi Search ctermfg=16 ctermbg=226 cterm=NONE
+ hi SignColumn ctermfg=30 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=51 ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=NONE ctermbg=246 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=231 ctermbg=246 cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=bold
+ hi debugBreakpoint ctermfg=18 ctermbg=196 cterm=NONE
+ hi debugPC ctermfg=18 ctermbg=21 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=46 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=51 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline
+ hi Directory ctermfg=51 ctermbg=NONE cterm=NONE
+ hi Title ctermfg=201 ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=111 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=217 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=51 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=236 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=201 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=214 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=227 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=226 ctermbg=21 cterm=reverse
+ hi Type ctermfg=46 ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=111 ctermbg=NONE cterm=underline
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi! link VertSplit StatusLineNC
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi! link TabLineFill TabLine
+ hi! link Terminal Normal
+ hi! link CursorColumn CursorLine
+ hi! link CursorIM Cursor
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link Debug Special
+ hi! link diffAdded String
+ hi! link diffRemoved WarningMsg
+ hi! link diffOnly WarningMsg
+ hi! link diffNoEOL WarningMsg
+ hi! link diffIsA WarningMsg
+ hi! link diffIdentical WarningMsg
+ hi! link diffDiffer WarningMsg
+ hi! link diffCommon WarningMsg
+ hi! link diffBDiffer WarningMsg
+ hi! link lCursor Cursor
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link Boolean Constant
+ hi! link Character Constant
+ hi! link Conditional Statement
+ hi! link Define PreProc
+ hi! link Delimiter Special
+ hi! link Exception Statement
+ hi! link Float Constant
+ hi! link Function Identifier
+ hi! link Include PreProc
+ hi! link Keyword Statement
+ hi! link Label Statement
+ hi! link Macro PreProc
+ hi! link Number Constant
+ hi! link Operator Statement
+ hi! link PreCondit PreProc
+ hi! link Repeat Statement
+ hi! link SpecialChar Special
+ hi! link SpecialComment Special
+ hi! link StorageClass Type
+ hi! link String Constant
+ hi! link Structure Type
+ hi! link Tag Special
+ hi! link Typedef Type
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=white ctermbg=black cterm=NONE
+ hi ColorColumn ctermfg=white ctermbg=darkred cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=underline
+ hi EndOfBuffer ctermfg=lightblue ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=black ctermbg=white cterm=NONE
+ hi StatusLineNC ctermfg=black ctermbg=gray cterm=NONE
+ hi TabLineSel ctermfg=black ctermbg=white cterm=NONE
+ hi TabLine ctermfg=black ctermbg=gray cterm=NONE
+ hi Pmenu ctermfg=white ctermbg=darkgray cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=gray cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE
+ hi QuickFixLine ctermfg=white ctermbg=darkmagenta cterm=NONE
+ hi Cursor ctermfg=black ctermbg=green cterm=NONE
+ hi Error ctermfg=red ctermbg=white cterm=reverse
+ hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=lightblue ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=gray cterm=bold
+ hi IncSearch ctermfg=green ctermbg=NONE cterm=reverse
+ hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=lightblue ctermbg=darkgray cterm=NONE
+ hi Question ctermfg=green ctermbg=NONE cterm=NONE
+ hi Search ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=NONE ctermbg=darkgray cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=white ctermbg=darkgray cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=bold
+ hi debugBreakpoint ctermfg=darkblue ctermbg=red cterm=NONE
+ hi debugPC ctermfg=darkblue ctermbg=blue cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=green ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=cyan ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkmagenta ctermbg=NONE cterm=underline
+ hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=lightblue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=gray ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=yellow ctermbg=NONE cterm=bold
+ hi Todo ctermfg=darkyellow ctermbg=blue cterm=reverse
+ hi Type ctermfg=green ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=lightblue ctermbg=NONE cterm=underline
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=gray ctermbg=black cterm=NONE
+ hi ColorColumn ctermfg=gray ctermbg=darkred cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi EndOfBuffer ctermfg=blue ctermbg=NONE cterm=bold
+ hi StatusLine ctermfg=gray ctermbg=black cterm=bold,reverse
+ hi StatusLineNC ctermfg=gray ctermbg=black cterm=reverse
+ hi TabLineSel ctermfg=gray ctermbg=black cterm=bold,reverse
+ hi TabLine ctermfg=gray ctermbg=black cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=gray cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=gray cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=black cterm=NONE
+ hi QuickFixLine ctermfg=gray ctermbg=darkmagenta cterm=NONE
+ hi Error ctermfg=red ctermbg=gray cterm=reverse
+ hi ErrorMsg ctermfg=gray ctermbg=red cterm=NONE
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=gray cterm=NONE
+ hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=blue ctermbg=NONE cterm=bold
+ hi Question ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Search ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=gray ctermbg=black cterm=bold,reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi debugBreakpoint ctermfg=darkblue ctermbg=darkred cterm=NONE
+ hi debugPC ctermfg=darkblue ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=gray ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi Special ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Todo ctermfg=darkyellow ctermbg=blue cterm=reverse
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: lightmagenta #ffa0a0 217 magenta
+" Color: blue #0000ff 21 blue
+" Color: cyan #00ffff 51 cyan
+" Color: yellow #ffff00 226 darkyellow
+" Color: white #ffffff 231 white
+" Color: black #000000 16 black
+" Color: green #00ff00 46 green
+" Color: magenta #ff80ff 201 darkmagenta
+" Color: red #ff0000 196 red
+" Color: lightyellow #ffff60 227 yellow
+" Color: darkblue #00008b 18 darkblue
+" Color: darkcyan #008b8b 30 darkcyan
+" Color: darkmagenta #8b008b 90 darkmagenta
+" Color: lightblue #add8e6 153 lightblue
+" Color: orange #ffa500 214 darkred
+" Color: seagreen #2e8b57 29 darkgreen
+" Color: lightgrey #d3d3d3 252 gray
+" Color: grey #bebebe 250 gray
+" Color: grey20 #333333 236 gray
+" Color: grey30 #4d4d4d 239 darkgray
+" Color: grey40 #666666 241 darkgray
+" Color: grey60 #999999 246 darkgray
+" Color: comment #80a0ff 111 lightblue
+" Color: darkred #8b0000 88 darkred
+" Color: x_black #000000 16 black
+" Color: x_darkred #cd0000 160 darkred
+" Color: x_darkgreen #00cd00 40 darkgreen
+" Color: x_darkyellow #cdcd00 184 darkyellow
+" Color: x_darkblue_m #0087ff 33 darkblue
+" Color: x_darkmagenta #cd00cd 164 darkmagenta
+" Color: x_darkcyan #00cdcd 44 darkcyan
+" Color: x_gray #e5e5e5 254 gray
+" Color: x_darkgray #7f7f7f 244 darkgray
+" Color: x_red #ff0000 196 red
+" Color: x_green #00ff00 46 green
+" Color: x_yellow #ffff00 226 yellow
+" Color: x_blue #5c5cff 63 blue
+" Color: x_magenta #ff00ff 201 magenta
+" Color: x_cyan #00ffff 51 cyan
+" Color: x_white #ffffff 231 white
+" Term colors: x_black x_darkred x_darkgreen x_darkyellow x_darkblue_m x_darkmagenta x_darkcyan x_gray
+" Term colors: x_darkgray x_red x_green x_yellow x_blue x_magenta x_cyan x_white
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/habamax.vim b/runtime/colors/habamax.vim
new file mode 100644
index 0000000..e3e7202
--- /dev/null
+++ b/runtime/colors/habamax.vim
@@ -0,0 +1,523 @@
+" Name: habamax
+" Description: Hubba hubba hubba.
+" Author: Maxim Kim <habamax@gmail.com>
+" Maintainer: Maxim Kim <habamax@gmail.com>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:45:11 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'habamax'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#1c1c1c', '#d75f5f', '#87af87', '#afaf87', '#5f87af', '#af87af', '#5f8787', '#9e9e9e', '#767676', '#d7875f', '#afd7af', '#d7d787', '#87afd7', '#d7afd7', '#87afaf', '#bcbcbc']
+endif
+hi! link Terminal Normal
+hi! link StatuslineTerm Statusline
+hi! link StatuslineTermNC StatuslineNC
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi! link javaScriptFunction Statement
+hi! link javaScriptIdentifier Statement
+hi! link sqlKeyword Statement
+hi! link yamlBlockMappingKey Statement
+hi! link rubyMacro Statement
+hi! link rubyDefine Statement
+hi! link vimVar Normal
+hi! link vimOper Normal
+hi! link vimSep Normal
+hi! link vimParenSep Normal
+hi! link vimCommentString Comment
+hi! link gitCommitSummary Title
+hi! link markdownUrl String
+hi! link elixirOperator Statement
+hi! link elixirKeyword Statement
+hi! link elixirBlockDefinition Statement
+hi! link elixirDefine Statement
+hi! link elixirPrivateDefine Statement
+hi! link elixirGuard Statement
+hi! link elixirPrivateGuard Statement
+hi! link elixirModuleDefine Statement
+hi! link elixirProtocolDefine Statement
+hi! link elixirImplDefine Statement
+hi! link elixirRecordDefine Statement
+hi! link elixirPrivateRecordDefine Statement
+hi! link elixirMacroDefine Statement
+hi! link elixirPrivateMacroDefine Statement
+hi! link elixirDelegateDefine Statement
+hi! link elixirOverridableDefine Statement
+hi! link elixirExceptionDefine Statement
+hi! link elixirCallbackDefine Statement
+hi! link elixirStructDefine Statement
+hi! link elixirExUnitMacro Statement
+hi! link elixirInclude Statement
+hi! link elixirAtom PreProc
+hi! link elixirDocTest String
+hi ALEErrorSign guifg=#d75f5f guibg=NONE gui=NONE cterm=NONE
+hi ALEInfoSign guifg=#d7d787 guibg=NONE gui=NONE cterm=NONE
+hi ALEWarningSign guifg=#af87af guibg=NONE gui=NONE cterm=NONE
+hi ALEError guifg=#1c1c1c guibg=#d75f5f gui=NONE cterm=NONE
+hi ALEVirtualTextError guifg=#1c1c1c guibg=#d75f5f gui=NONE cterm=NONE
+hi ALEWarning guifg=#1c1c1c guibg=#af87af gui=NONE cterm=NONE
+hi ALEVirtualTextWarning guifg=#1c1c1c guibg=#af87af gui=NONE cterm=NONE
+hi ALEInfo guifg=#d7d787 guibg=NONE gui=NONE cterm=NONE
+hi ALEVirtualTextInfo guifg=#d7d787 guibg=NONE gui=NONE cterm=NONE
+hi Normal guifg=#bcbcbc guibg=#1c1c1c gui=NONE cterm=NONE
+hi Statusline guifg=#1c1c1c guibg=#9e9e9e gui=NONE cterm=NONE
+hi StatuslineNC guifg=#1c1c1c guibg=#767676 gui=NONE cterm=NONE
+hi VertSplit guifg=#767676 guibg=#767676 gui=NONE cterm=NONE
+hi TabLine guifg=#1c1c1c guibg=#767676 gui=NONE cterm=NONE
+hi TabLineFill guifg=#1c1c1c guibg=#767676 gui=NONE cterm=NONE
+hi TabLineSel guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi ToolbarButton guifg=#9e9e9e guibg=#1c1c1c gui=bold,reverse cterm=bold,reverse
+hi QuickFixLine guifg=#1c1c1c guibg=#5f87af gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffaf5f guibg=NONE gui=bold cterm=bold
+hi LineNr guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+hi LineNrAbove guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+hi LineNrBelow guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+hi NonText guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+hi Visual guifg=#1c1c1c guibg=#87afaf gui=NONE cterm=NONE
+hi VisualNOS guifg=#1c1c1c guibg=#5f8787 gui=NONE cterm=NONE
+hi Pmenu guifg=NONE guibg=#262626 gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#767676 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi PmenuSel guifg=#1c1c1c guibg=#afaf87 gui=NONE cterm=NONE
+hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Error guifg=#d75f5f guibg=#1c1c1c gui=reverse cterm=reverse
+hi ErrorMsg guifg=#d75f5f guibg=#1c1c1c gui=reverse cterm=reverse
+hi ModeMsg guifg=#1c1c1c guibg=#d7d787 gui=NONE cterm=NONE
+hi MoreMsg guifg=#87af87 guibg=NONE gui=NONE cterm=NONE
+hi Question guifg=#afaf87 guibg=NONE gui=NONE cterm=NONE
+hi WarningMsg guifg=#d7875f guibg=NONE gui=NONE cterm=NONE
+hi Todo guifg=#d7d787 guibg=#1c1c1c gui=reverse cterm=reverse
+hi MatchParen guifg=#5f8787 guibg=#1c1c1c gui=reverse cterm=reverse
+hi Search guifg=#1c1c1c guibg=#87af87 gui=NONE cterm=NONE
+hi IncSearch guifg=#1c1c1c guibg=#ffaf5f gui=NONE cterm=NONE
+hi CurSearch guifg=#1c1c1c guibg=#afaf87 gui=NONE cterm=NONE
+hi WildMenu guifg=#1c1c1c guibg=#d7d787 gui=NONE cterm=NONE
+hi debugPC guifg=#1c1c1c guibg=#5f87af gui=NONE cterm=NONE
+hi debugBreakpoint guifg=#1c1c1c guibg=#d7875f gui=NONE cterm=NONE
+hi Cursor guifg=#1c1c1c guibg=#ffaf5f gui=NONE cterm=NONE
+hi lCursor guifg=#1c1c1c guibg=#5fff00 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#303030 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#303030 gui=NONE cterm=NONE
+hi Folded guifg=#9e9e9e guibg=#262626 gui=NONE cterm=NONE
+hi ColorColumn guifg=NONE guibg=#262626 gui=NONE cterm=NONE
+hi SpellBad guifg=NONE guibg=NONE guisp=#d75f5f gui=undercurl ctermfg=NONE ctermbg=NONE cterm=underline
+hi SpellCap guifg=NONE guibg=NONE guisp=#5f87af gui=undercurl ctermfg=NONE ctermbg=NONE cterm=underline
+hi SpellLocal guifg=NONE guibg=NONE guisp=#87af87 gui=undercurl ctermfg=NONE ctermbg=NONE cterm=underline
+hi SpellRare guifg=NONE guibg=NONE guisp=#d7afd7 gui=undercurl ctermfg=NONE ctermbg=NONE cterm=underline
+hi Comment guifg=#767676 guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#d7875f guibg=NONE gui=NONE cterm=NONE
+hi String guifg=#87af87 guibg=NONE gui=NONE cterm=NONE
+hi Character guifg=#afd7af guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#87afaf guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#af87af guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#afaf87 guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#87afd7 guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#5f8787 guibg=NONE gui=NONE cterm=NONE
+hi Underlined guifg=NONE guibg=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline
+hi Title guifg=#d7d787 guibg=NONE gui=bold cterm=bold
+hi Directory guifg=#87afaf guibg=NONE gui=bold cterm=bold
+hi Conceal guifg=#767676 guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Debug guifg=#5f8787 guibg=NONE gui=NONE cterm=NONE
+hi DiffAdd guifg=#000000 guibg=#87af87 gui=NONE cterm=NONE
+hi DiffDelete guifg=#af875f guibg=NONE gui=NONE cterm=NONE
+hi diffAdded guifg=#87af87 guibg=NONE gui=NONE cterm=NONE
+hi diffRemoved guifg=#d75f5f guibg=NONE gui=NONE cterm=NONE
+hi diffSubname guifg=#af87af guibg=NONE gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#d7d7d7 gui=NONE cterm=NONE
+hi DiffChange guifg=#000000 guibg=#afafaf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link StatuslineTerm Statusline
+ hi! link StatuslineTermNC StatuslineNC
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi! link javaScriptFunction Statement
+ hi! link javaScriptIdentifier Statement
+ hi! link sqlKeyword Statement
+ hi! link yamlBlockMappingKey Statement
+ hi! link rubyMacro Statement
+ hi! link rubyDefine Statement
+ hi! link vimVar Normal
+ hi! link vimOper Normal
+ hi! link vimSep Normal
+ hi! link vimParenSep Normal
+ hi! link vimCommentString Comment
+ hi! link gitCommitSummary Title
+ hi! link markdownUrl String
+ hi! link elixirOperator Statement
+ hi! link elixirKeyword Statement
+ hi! link elixirBlockDefinition Statement
+ hi! link elixirDefine Statement
+ hi! link elixirPrivateDefine Statement
+ hi! link elixirGuard Statement
+ hi! link elixirPrivateGuard Statement
+ hi! link elixirModuleDefine Statement
+ hi! link elixirProtocolDefine Statement
+ hi! link elixirImplDefine Statement
+ hi! link elixirRecordDefine Statement
+ hi! link elixirPrivateRecordDefine Statement
+ hi! link elixirMacroDefine Statement
+ hi! link elixirPrivateMacroDefine Statement
+ hi! link elixirDelegateDefine Statement
+ hi! link elixirOverridableDefine Statement
+ hi! link elixirExceptionDefine Statement
+ hi! link elixirCallbackDefine Statement
+ hi! link elixirStructDefine Statement
+ hi! link elixirExUnitMacro Statement
+ hi! link elixirInclude Statement
+ hi! link elixirAtom PreProc
+ hi! link elixirDocTest String
+ hi ALEErrorSign ctermfg=167 ctermbg=NONE cterm=NONE
+ hi ALEInfoSign ctermfg=186 ctermbg=NONE cterm=NONE
+ hi ALEWarningSign ctermfg=139 ctermbg=NONE cterm=NONE
+ hi ALEError ctermfg=234 ctermbg=167 cterm=NONE
+ hi ALEVirtualTextError ctermfg=234 ctermbg=167 cterm=NONE
+ hi ALEWarning ctermfg=234 ctermbg=139 cterm=NONE
+ hi ALEVirtualTextWarning ctermfg=234 ctermbg=139 cterm=NONE
+ hi ALEInfo ctermfg=186 ctermbg=NONE cterm=NONE
+ hi ALEVirtualTextInfo ctermfg=186 ctermbg=NONE cterm=NONE
+ hi Normal ctermfg=250 ctermbg=234 cterm=NONE
+ hi Statusline ctermfg=234 ctermbg=247 cterm=NONE
+ hi StatuslineNC ctermfg=234 ctermbg=243 cterm=NONE
+ hi VertSplit ctermfg=243 ctermbg=243 cterm=NONE
+ hi TabLine ctermfg=234 ctermbg=243 cterm=NONE
+ hi TabLineFill ctermfg=234 ctermbg=243 cterm=NONE
+ hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=247 ctermbg=234 cterm=bold,reverse
+ hi QuickFixLine ctermfg=234 ctermbg=67 cterm=NONE
+ hi CursorLineNr ctermfg=215 ctermbg=NONE cterm=bold
+ hi LineNr ctermfg=240 ctermbg=NONE cterm=NONE
+ hi LineNrAbove ctermfg=240 ctermbg=NONE cterm=NONE
+ hi LineNrBelow ctermfg=240 ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=240 ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=240 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=240 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=240 ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=234 ctermbg=109 cterm=NONE
+ hi VisualNOS ctermfg=234 ctermbg=66 cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=235 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=243 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=234 ctermbg=144 cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=167 ctermbg=234 cterm=reverse
+ hi ErrorMsg ctermfg=167 ctermbg=234 cterm=reverse
+ hi ModeMsg ctermfg=234 ctermbg=186 cterm=NONE
+ hi MoreMsg ctermfg=108 ctermbg=NONE cterm=NONE
+ hi Question ctermfg=144 ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=173 ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=186 ctermbg=234 cterm=reverse
+ hi MatchParen ctermfg=66 ctermbg=234 cterm=reverse
+ hi Search ctermfg=234 ctermbg=108 cterm=NONE
+ hi IncSearch ctermfg=234 ctermbg=215 cterm=NONE
+ hi CurSearch ctermfg=234 ctermbg=144 cterm=NONE
+ hi WildMenu ctermfg=234 ctermbg=186 cterm=NONE
+ hi debugPC ctermfg=234 ctermbg=67 cterm=NONE
+ hi debugBreakpoint ctermfg=234 ctermbg=173 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=236 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=236 cterm=NONE
+ hi Folded ctermfg=247 ctermbg=235 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=235 cterm=NONE
+ hi SpellBad ctermfg=167 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=67 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=108 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=182 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=243 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=173 ctermbg=NONE cterm=NONE
+ hi String ctermfg=108 ctermbg=NONE cterm=NONE
+ hi Character ctermfg=151 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=109 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=139 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=144 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=110 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=66 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=186 ctermbg=NONE cterm=bold
+ hi Directory ctermfg=109 ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=243 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Debug ctermfg=66 ctermbg=NONE cterm=NONE
+ hi DiffAdd ctermfg=16 ctermbg=108 cterm=NONE
+ hi DiffDelete ctermfg=137 ctermbg=NONE cterm=NONE
+ hi diffAdded ctermfg=108 ctermbg=NONE cterm=NONE
+ hi diffRemoved ctermfg=167 ctermbg=NONE cterm=NONE
+ hi diffSubname ctermfg=139 ctermbg=NONE cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=188 cterm=NONE
+ hi DiffChange ctermfg=16 ctermbg=145 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi ALEErrorSign ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi ALEInfoSign ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi ALEWarningSign ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi ALEError ctermfg=black ctermbg=darkred cterm=NONE
+ hi ALEVirtualTextError ctermfg=black ctermbg=darkred cterm=NONE
+ hi ALEWarning ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi ALEVirtualTextWarning ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi ALEInfo ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi ALEVirtualTextInfo ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi Normal ctermfg=white ctermbg=black cterm=NONE
+ hi Statusline ctermfg=black ctermbg=gray cterm=NONE
+ hi StatuslineNC ctermfg=black ctermbg=darkgray cterm=NONE
+ hi VertSplit ctermfg=darkgray ctermbg=darkgray cterm=NONE
+ hi TabLine ctermfg=black ctermbg=darkgray cterm=NONE
+ hi TabLineFill ctermfg=black ctermbg=darkgray cterm=NONE
+ hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=gray ctermbg=black cterm=bold,reverse
+ hi QuickFixLine ctermfg=black ctermbg=blue cterm=NONE
+ hi CursorLineNr ctermfg=red ctermbg=NONE cterm=bold
+ hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi LineNrAbove ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi LineNrBelow ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=black ctermbg=cyan cterm=NONE
+ hi VisualNOS ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkgray cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=darkred ctermbg=black cterm=reverse
+ hi ErrorMsg ctermfg=darkred ctermbg=black cterm=reverse
+ hi ModeMsg ctermfg=black ctermbg=yellow cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Question ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=yellow ctermbg=black cterm=reverse
+ hi MatchParen ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi Search ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=red cterm=NONE
+ hi CurSearch ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE
+ hi debugPC ctermfg=black ctermbg=blue cterm=NONE
+ hi debugBreakpoint ctermfg=black ctermbg=red cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Folded ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkgreen ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline
+ hi Comment ctermfg=darkgray ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=red ctermbg=NONE cterm=NONE
+ hi String ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Character ctermfg=green ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Type ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=yellow ctermbg=NONE cterm=bold
+ hi Directory ctermfg=cyan ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=darkgray ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Debug ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi DiffAdd ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi DiffDelete ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi diffAdded ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi diffRemoved ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi diffSubname ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi DiffText ctermfg=black ctermbg=lightgrey cterm=NONE
+ hi DiffChange ctermfg=black ctermbg=darkgray cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=gray ctermbg=black cterm=NONE
+ hi Statusline ctermfg=gray ctermbg=black cterm=bold,reverse
+ hi StatuslineNC ctermfg=gray ctermbg=black cterm=reverse
+ hi VertSplit ctermfg=gray ctermbg=black cterm=reverse
+ hi TabLine ctermfg=black ctermbg=gray cterm=NONE
+ hi TabLineFill ctermfg=black ctermbg=gray cterm=NONE
+ hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=gray ctermbg=black cterm=bold,reverse
+ hi QuickFixLine ctermfg=black ctermbg=blue cterm=NONE
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi LineNr ctermfg=gray ctermbg=NONE cterm=bold
+ hi LineNrAbove ctermfg=gray ctermbg=NONE cterm=bold
+ hi LineNrBelow ctermfg=gray ctermbg=NONE cterm=bold
+ hi NonText ctermfg=gray ctermbg=NONE cterm=bold
+ hi EndOfBuffer ctermfg=gray ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=gray ctermbg=NONE cterm=bold
+ hi FoldColumn ctermfg=gray ctermbg=NONE cterm=bold
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=gray cterm=NONE
+ hi PmenuThumb ctermfg=gray ctermbg=black cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=gray cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=darkred ctermbg=gray cterm=bold,reverse
+ hi ErrorMsg ctermfg=darkred ctermbg=gray cterm=bold,reverse
+ hi ModeMsg ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Question ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=darkyellow ctermbg=black cterm=reverse
+ hi MatchParen ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi Search ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi CurSearch ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi debugPC ctermfg=black ctermbg=blue cterm=NONE
+ hi debugBreakpoint ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Folded ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=gray cterm=reverse
+ hi SpellCap ctermfg=blue ctermbg=gray cterm=reverse
+ hi SpellLocal ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi SpellRare ctermfg=darkmagenta ctermbg=gray cterm=reverse
+ hi Comment ctermfg=gray ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi String ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Character ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=gray ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Type ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=gray ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Debug ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi DiffAdd ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi DiffDelete ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi diffAdded ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi diffRemoved ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi diffSubname ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi DiffText ctermfg=white ctermbg=black cterm=bold,reverse
+ hi DiffChange ctermfg=black ctermbg=white cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: color00 #1C1C1C 234 black
+" Color: color08 #767676 243 darkgray
+" Color: color01 #D75F5F 167 darkred
+" Color: color09 #D7875F 173 red
+" Color: color02 #87AF87 108 darkgreen
+" Color: color10 #AFD7AF 151 green
+" Color: color03 #AFAF87 144 darkyellow
+" Color: color11 #D7D787 186 yellow
+" Color: color04 #5F87AF 67 blue
+" Color: color12 #87AFD7 110 blue
+" Color: color05 #AF87AF 139 darkmagenta
+" Color: color13 #D7AFD7 182 magenta
+" Color: color06 #5F8787 66 darkcyan
+" Color: color14 #87AFAF 109 cyan
+" Color: color07 #9E9E9E 247 gray
+" Color: color15 #BCBCBC 250 white
+" Color: colorLine #303030 236 darkgrey
+" Color: colorB #262626 235 darkgrey
+" Color: colorNonT #585858 240 darkgrey
+" Color: colorC #FFAF5F 215 red
+" Color: colorlC #5FFF00 82 green
+" Color: colorV #1F3F5F 109 cyan
+" Color: diffAdd #87AF87 108 darkgreen
+" Color: diffDelete #af875f 137 darkyellow
+" Color: diffChange #AFAFAF 145 darkgray
+" Color: diffText #D7D7D7 188 lightgrey
+" Color: black #000000 16 black
+" Color: white #FFFFFF 231 white
+" Term colors: color00 color01 color02 color03 color04 color05 color06 color07
+" Term colors: color08 color09 color10 color11 color12 color13 color14 color15
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/industry.vim b/runtime/colors/industry.vim
new file mode 100644
index 0000000..0946fe9
--- /dev/null
+++ b/runtime/colors/industry.vim
@@ -0,0 +1,412 @@
+" Name: industry
+" Description: "industry" stands for 'industrial' color scheme.
+" Author: Original author Shian Lee.
+" Maintainer: Original maintainer Shian Lee.
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Sun 04 Sep 2022 09:50:04 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'industry'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#303030', '#870000', '#5fd75f', '#afaf00', '#87afff', '#af00af', '#00afaf', '#6c6c6c', '#444444', '#ff0000', '#00ff00', '#ffff00', '#005fff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi Normal guifg=#dadada guibg=#000000 gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#444444 guibg=#000000 gui=NONE cterm=NONE
+hi StatusLine guifg=#000000 guibg=#dadada gui=bold cterm=bold
+hi StatusLineNC guifg=#000000 guibg=#6c6c6c gui=NONE cterm=NONE
+hi StatusLineTerm guifg=#000000 guibg=#00ff00 gui=bold cterm=bold
+hi StatusLineTermNC guifg=#000000 guibg=#5fd75f gui=NONE cterm=NONE
+hi VertSplit guifg=#000000 guibg=#6c6c6c gui=NONE cterm=NONE
+hi Pmenu guifg=#dadada guibg=#444444 gui=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=#000000 gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#6c6c6c gui=NONE cterm=NONE
+hi TabLine guifg=#dadada guibg=#444444 gui=NONE cterm=NONE
+hi TabLineFill guifg=NONE guibg=#6c6c6c gui=NONE cterm=NONE
+hi TabLineSel guifg=#ffffff guibg=#000000 gui=bold cterm=bold
+hi ToolbarButton guifg=#dadada guibg=#6c6c6c gui=bold cterm=bold
+hi ToolbarLine guifg=NONE guibg=#303030 gui=NONE cterm=NONE
+hi NonText guifg=#00afaf guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#00afaf guibg=NONE gui=NONE cterm=NONE
+hi Folded guifg=#00afaf guibg=#303030 gui=NONE cterm=NONE
+hi Visual guifg=#dadada guibg=#6c6c6c gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#6c6c6c gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#6c6c6c gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=bold
+hi ColorColumn guifg=NONE guibg=#444444 gui=NONE cterm=NONE
+hi QuickFixLine guifg=#000000 guibg=#ff00ff gui=NONE cterm=NONE
+hi VisualNOS guifg=#dadada guibg=#6c6c6c gui=NONE cterm=NONE
+hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#00afaf guibg=NONE gui=NONE cterm=NONE
+hi SignColumn guifg=#00afaf guibg=NONE gui=NONE cterm=NONE
+hi Underlined guifg=#87afff guibg=NONE gui=underline cterm=underline
+hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE
+hi ErrorMsg guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE
+hi ModeMsg guifg=#ffffff guibg=NONE gui=bold cterm=bold
+hi WarningMsg guifg=#ff0000 guibg=NONE gui=bold cterm=bold
+hi MoreMsg guifg=#5fd75f guibg=NONE gui=bold cterm=bold
+hi Question guifg=#00ff00 guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#005fff guibg=#ffff00 gui=NONE cterm=NONE
+hi MatchParen guifg=#303030 guibg=#afaf00 gui=NONE cterm=NONE
+hi Search guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi IncSearch guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi Cursor guifg=#000000 guibg=#dadada gui=NONE cterm=NONE
+hi lCursor guifg=#000000 guibg=#ff0000 gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#005fff guibg=NONE guisp=#005fff gui=undercurl cterm=underline
+hi SpellLocal guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline
+hi SpellRare guifg=#00ff00 guibg=NONE guisp=#00ff00 gui=undercurl cterm=underline
+hi Comment guifg=#00afaf guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE
+hi Function guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#ffffff guibg=NONE gui=bold cterm=bold
+hi Constant guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#00ff00 guibg=NONE gui=bold cterm=bold
+hi Special guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi Delimiter guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi Conceal guifg=#6c6c6c guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=bold
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi Normal ctermfg=253 ctermbg=16 cterm=NONE
+ hi EndOfBuffer ctermfg=238 ctermbg=16 cterm=NONE
+ hi StatusLine ctermfg=16 ctermbg=253 cterm=bold
+ hi StatusLineNC ctermfg=16 ctermbg=242 cterm=NONE
+ hi StatusLineTerm ctermfg=16 ctermbg=46 cterm=bold
+ hi StatusLineTermNC ctermfg=16 ctermbg=77 cterm=NONE
+ hi VertSplit ctermfg=16 ctermbg=242 cterm=NONE
+ hi Pmenu ctermfg=253 ctermbg=238 cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=16 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=242 cterm=NONE
+ hi TabLine ctermfg=253 ctermbg=238 cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=242 cterm=NONE
+ hi TabLineSel ctermfg=231 ctermbg=16 cterm=bold
+ hi ToolbarButton ctermfg=253 ctermbg=242 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=236 cterm=NONE
+ hi NonText ctermfg=37 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=37 ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=37 ctermbg=236 cterm=NONE
+ hi Visual ctermfg=253 ctermbg=242 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=242 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=242 cterm=NONE
+ hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=bold
+ hi ColorColumn ctermfg=NONE ctermbg=238 cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=201 cterm=NONE
+ hi VisualNOS ctermfg=253 ctermbg=242 cterm=NONE
+ hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=37 ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=37 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=111 ctermbg=NONE cterm=underline
+ hi Error ctermfg=231 ctermbg=196 cterm=NONE
+ hi ErrorMsg ctermfg=231 ctermbg=196 cterm=NONE
+ hi ModeMsg ctermfg=231 ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=196 ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=77 ctermbg=NONE cterm=bold
+ hi Question ctermfg=46 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=27 ctermbg=226 cterm=NONE
+ hi MatchParen ctermfg=236 ctermbg=142 cterm=NONE
+ hi Search ctermfg=16 ctermbg=226 cterm=NONE
+ hi IncSearch ctermfg=16 ctermbg=46 cterm=NONE
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE
+ hi Cursor ctermfg=16 ctermbg=253 cterm=NONE
+ hi lCursor ctermfg=16 ctermbg=196 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=27 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=201 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=46 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=37 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=201 ctermbg=NONE cterm=NONE
+ hi Function ctermfg=46 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=231 ctermbg=NONE cterm=bold
+ hi Constant ctermfg=51 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=226 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=46 ctermbg=NONE cterm=bold
+ hi Special ctermfg=196 ctermbg=NONE cterm=NONE
+ hi Delimiter ctermfg=226 ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=51 ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=242 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=201 ctermbg=NONE cterm=bold
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=white ctermbg=black cterm=NONE
+ hi EndOfBuffer ctermfg=darkgrey ctermbg=black cterm=NONE
+ hi StatusLine ctermfg=black ctermbg=white cterm=bold
+ hi StatusLineNC ctermfg=black ctermbg=grey cterm=NONE
+ hi StatusLineTerm ctermfg=black ctermbg=green cterm=bold
+ hi StatusLineTermNC ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi VertSplit ctermfg=black ctermbg=grey cterm=NONE
+ hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLine ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLineSel ctermfg=white ctermbg=black cterm=bold
+ hi ToolbarButton ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE
+ hi NonText ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=black ctermbg=grey cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline
+ hi ColorColumn ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=magenta cterm=NONE
+ hi VisualNOS ctermfg=white ctermbg=grey cterm=NONE
+ hi LineNr ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi Error ctermfg=white ctermbg=red cterm=NONE
+ hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE
+ hi ModeMsg ctermfg=white ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Question ctermfg=green ctermbg=NONE cterm=bold
+ hi Todo ctermfg=blue ctermbg=yellow cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Search ctermfg=black ctermbg=yellow cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=green cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE
+ hi Cursor ctermfg=black ctermbg=white cterm=NONE
+ hi lCursor ctermfg=black ctermbg=red cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=magenta ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=green ctermbg=NONE cterm=underline
+ hi Comment ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Function ctermfg=green ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=white ctermbg=NONE cterm=bold
+ hi Constant ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi Type ctermfg=green ctermbg=NONE cterm=bold
+ hi Special ctermfg=red ctermbg=NONE cterm=NONE
+ hi Delimiter ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=magenta ctermbg=NONE cterm=bold
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi EndOfBuffer ctermfg=grey ctermbg=black cterm=bold
+ hi StatusLine ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi StatusLineNC ctermfg=grey ctermbg=black cterm=reverse
+ hi StatusLineTerm ctermfg=darkgreen ctermbg=black cterm=bold,reverse
+ hi StatusLineTermNC ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi VertSplit ctermfg=grey ctermbg=black cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLineSel ctermfg=grey ctermbg=black cterm=NONE
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE
+ hi NonText ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi VisualNOS ctermfg=black ctermbg=grey cterm=NONE
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Error ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ErrorMsg ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ModeMsg ctermfg=grey ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Question ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=darkblue ctermbg=darkyellow cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Search ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkblue ctermbg=darkyellow cterm=reverse
+ hi SpellLocal ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi SpellRare ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi Comment ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Identifier ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Function ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=grey ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Special ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Delimiter ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: foreground #dadada 253 white
+" Color: background #000000 16 black
+" Color: color00 #303030 236 black
+" Color: color08 #444444 238 darkgrey
+" Color: color01 #870000 88 darkred
+" Color: color09 #FF0000 196 red
+" Color: color02 #5FD75F 77 darkgreen
+" Color: color10 #00FF00 46 green
+" Color: color03 #AFAF00 142 darkyellow
+" Color: color11 #FFFF00 226 yellow
+" Color: color04 #87AFFF 111 darkblue
+" Color: color12 #005FFF 27 blue
+" Color: color05 #AF00AF 127 darkmagenta
+" Color: color13 #FF00FF 201 magenta
+" Color: color06 #00AFAF 37 darkcyan
+" Color: color14 #00FFFF 51 cyan
+" Color: color07 #6C6C6C 242 grey
+" Color: color15 #FFFFFF 231 white
+" Term colors: color00 color01 color02 color03 color04 color05 color06 color07
+" Term colors: color08 color09 color10 color11 color12 color13 color14 color15
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/koehler.vim b/runtime/colors/koehler.vim
new file mode 100644
index 0000000..2505e8e
--- /dev/null
+++ b/runtime/colors/koehler.vim
@@ -0,0 +1,426 @@
+" Name: koehler
+" Author: original author Ron Aaron <ron@ronware.org>
+" Maintainer: original maintainer Ron Aaron <ron@ronware.org>
+" Website: https://www.github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:23:56 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'koehler'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+hi! link Terminal Normal
+hi! link Boolean Constant
+hi! link Character Constant
+hi! link Conditional Statement
+hi! link Debug Special
+hi! link Define PreProc
+hi! link Delimiter Special
+hi! link Exception Statement
+hi! link Float Number
+hi! link Function Identifier
+hi! link Include PreProc
+hi! link IncSearch Visual
+hi! link Keyword Statement
+hi! link Label Statement
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link Macro PreProc
+hi! link Number Constant
+hi! link Operator Statement
+hi! link PopupSelected PmenuSel
+hi! link PreCondit PreProc
+hi! link Repeat Statement
+hi! link SpecialChar Special
+hi! link SpecialComment Special
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link StorageClass Type
+hi! link String Constant
+hi! link Structure Type
+hi! link Tag Special
+hi! link Typedef Type
+hi! link lCursor Cursor
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi Normal guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE
+hi ColorColumn guifg=NONE guibg=#8b0000 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#555555 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#555555 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=bold
+hi Folded guifg=#00cdcd guibg=#666666 gui=NONE cterm=NONE
+hi QuickFixLine guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi Conceal guifg=#e5e5e5 guibg=#a9a9a9 gui=NONE cterm=NONE
+hi Cursor guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE
+hi Directory guifg=#cc8000 guibg=NONE gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#cd0000 guibg=NONE gui=bold cterm=bold
+hi ErrorMsg guifg=#cd0000 guibg=#ffffff gui=reverse cterm=reverse
+hi FoldColumn guifg=#00cdcd guibg=NONE gui=NONE cterm=NONE
+hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi MatchParen guifg=NONE guibg=#0000ff gui=NONE cterm=NONE
+hi ModeMsg guifg=#ffffff guibg=#0000ff gui=bold cterm=bold
+hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=bold
+hi NonText guifg=#cd0000 guibg=NONE gui=bold cterm=bold
+hi Pmenu guifg=#ffffff guibg=#444444 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE
+hi Question guifg=#5c5cff guibg=NONE gui=bold cterm=bold
+hi Search guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE
+hi SignColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#cd0000 guibg=NONE gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#60ff60 guibg=NONE guisp=#60ff60 gui=undercurl cterm=underline
+hi SpellLocal guifg=#00ffff guibg=NONE guisp=#00ffff gui=undercurl cterm=underline
+hi SpellRare guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline
+hi StatusLine guifg=#0000ff guibg=#ffffff gui=bold cterm=bold
+hi StatusLineNC guifg=#0000ff guibg=#e5e5e5 gui=NONE cterm=NONE
+hi TabLine guifg=#0000ff guibg=#ffffff gui=bold cterm=bold
+hi TabLineFill guifg=#0000ff guibg=#ffffff gui=bold cterm=bold
+hi TabLineSel guifg=#ffffff guibg=#0000ff gui=bold cterm=bold
+hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=bold
+hi VertSplit guifg=#0000ff guibg=#e5e5e5 gui=NONE cterm=NONE
+hi Visual guifg=NONE guibg=#666666 gui=reverse cterm=reverse
+hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline
+hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE
+hi Error guifg=#cd0000 guibg=#ffffff gui=reverse cterm=reverse
+hi Identifier guifg=#40ffff guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE
+hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#ffff60 guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#0000ff guibg=#ffff00 gui=NONE cterm=NONE
+hi Type guifg=#60ff60 guibg=NONE gui=bold cterm=bold
+hi Underlined guifg=#add8e6 guibg=NONE gui=bold,underline cterm=underline
+hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=bold
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi Normal ctermfg=231 ctermbg=16 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=88 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=240 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=240 cterm=NONE
+ hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=bold
+ hi Folded ctermfg=44 ctermbg=59 cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=226 cterm=NONE
+ hi Conceal ctermfg=254 ctermbg=145 cterm=NONE
+ hi Cursor ctermfg=16 ctermbg=46 cterm=NONE
+ hi Directory ctermfg=172 ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=160 ctermbg=NONE cterm=bold
+ hi ErrorMsg ctermfg=160 ctermbg=231 cterm=reverse
+ hi FoldColumn ctermfg=44 ctermbg=NONE cterm=NONE
+ hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=21 cterm=NONE
+ hi ModeMsg ctermfg=231 ctermbg=21 cterm=bold
+ hi MoreMsg ctermfg=29 ctermbg=NONE cterm=bold
+ hi NonText ctermfg=160 ctermbg=NONE cterm=bold
+ hi Pmenu ctermfg=231 ctermbg=238 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=44 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE
+ hi Question ctermfg=63 ctermbg=NONE cterm=bold
+ hi Search ctermfg=231 ctermbg=196 cterm=NONE
+ hi SignColumn ctermfg=51 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=160 ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=83 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=51 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=21 ctermbg=231 cterm=bold
+ hi StatusLineNC ctermfg=21 ctermbg=254 cterm=NONE
+ hi TabLine ctermfg=21 ctermbg=231 cterm=bold
+ hi TabLineFill ctermfg=21 ctermbg=231 cterm=bold
+ hi TabLineSel ctermfg=231 ctermbg=21 cterm=bold
+ hi Title ctermfg=201 ctermbg=NONE cterm=bold
+ hi VertSplit ctermfg=21 ctermbg=254 cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=59 cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline
+ hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE
+ hi Comment ctermfg=111 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=217 ctermbg=NONE cterm=NONE
+ hi Error ctermfg=160 ctermbg=231 cterm=reverse
+ hi Identifier ctermfg=87 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=16 ctermbg=16 cterm=NONE
+ hi PreProc ctermfg=213 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=214 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=227 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=21 ctermbg=226 cterm=NONE
+ hi Type ctermfg=83 ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=153 ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=16 ctermbg=254 cterm=bold
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=white ctermbg=black cterm=NONE
+ hi ColorColumn ctermfg=white ctermbg=darkred cterm=NONE
+ hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=yellow cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=grey cterm=NONE
+ hi Cursor ctermfg=black ctermbg=green cterm=NONE
+ hi Directory ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=darkred ctermbg=NONE cterm=bold
+ hi ErrorMsg ctermfg=darkred ctermbg=white cterm=reverse
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi LineNr ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=darkblue cterm=NONE
+ hi ModeMsg ctermfg=white ctermbg=darkblue cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi NonText ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE
+ hi Question ctermfg=blue ctermbg=NONE cterm=bold
+ hi Search ctermfg=white ctermbg=red cterm=NONE
+ hi SignColumn ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=green ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=cyan ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=darkblue ctermbg=white cterm=bold
+ hi StatusLineNC ctermfg=darkblue ctermbg=grey cterm=NONE
+ hi TabLine ctermfg=darkblue ctermbg=white cterm=bold
+ hi TabLineFill ctermfg=darkblue ctermbg=white cterm=bold
+ hi TabLineSel ctermfg=white ctermbg=darkblue cterm=bold
+ hi Title ctermfg=magenta ctermbg=NONE cterm=bold
+ hi VertSplit ctermfg=darkblue ctermbg=grey cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=darkgrey cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE
+ hi Comment ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Error ctermfg=darkred ctermbg=white cterm=reverse
+ hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=black ctermbg=black cterm=NONE
+ hi PreProc ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=yellow ctermbg=NONE cterm=bold
+ hi Todo ctermfg=darkblue ctermbg=yellow cterm=NONE
+ hi Type ctermfg=green ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=blue ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=grey cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi ColorColumn ctermfg=grey ctermbg=darkred cterm=NONE
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=darkred ctermbg=NONE cterm=bold
+ hi ErrorMsg ctermfg=darkred ctermbg=grey cterm=bold,reverse
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=darkblue cterm=NONE
+ hi ModeMsg ctermfg=white ctermbg=darkblue cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi NonText ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Pmenu ctermfg=grey ctermbg=darkgrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi Question ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Search ctermfg=grey ctermbg=darkred cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi StatusLine ctermfg=grey ctermbg=darkblue cterm=bold,reverse
+ hi StatusLineNC ctermfg=grey ctermbg=darkblue cterm=reverse
+ hi TabLine ctermfg=grey ctermbg=darkblue cterm=bold,reverse
+ hi TabLineFill ctermfg=darkblue ctermbg=grey cterm=bold
+ hi TabLineSel ctermfg=grey ctermbg=darkblue cterm=bold
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi VertSplit ctermfg=darkblue ctermbg=grey cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Comment ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Error ctermfg=darkred ctermbg=grey cterm=reverse
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=black ctermbg=black cterm=NONE
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Todo ctermfg=darkblue ctermbg=darkyellow cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: xterm0 #000000 16 black
+" Color: xterm1 #cd0000 160 darkred
+" Color: xterm2 #00cd00 40 darkgreen
+" Color: xterm3 #cdcd00 184 darkyellow
+" Color: xterm4 #0000ee 20 darkblue
+" Color: xterm5 #cd00cd 164 darkmagenta
+" Color: xterm6 #00cdcd 44 darkcyan
+" Color: xterm7 #e5e5e5 254 grey
+" Color: xterm8 #7f7f7f 102 darkgrey
+" Color: xterm9 #ff0000 196 red
+" Color: xterm10 #00ff00 46 green
+" Color: xterm11 #ffff00 226 yellow
+" Color: xterm12 #5c5cff 63 blue
+" Color: xterm13 #ff00ff 201 magenta
+" Color: xterm14 #00ffff 51 cyan
+" Color: xterm15 #ffffff 231 white
+" Color: Pmenu #444444 238 darkgrey
+" Color: rgbGrey40 #666666 59 darkgrey
+" Color: rgbDarkGrey #a9a9a9 145 grey
+" Color: rgbDarkBlue #00008b 20 darkblue
+" Color: rgbDarkMagenta #8b008b 90 darkmagenta
+" Color: rgbBlue #0000ff 21 darkblue
+" Color: rgbDarkCyan #008b8b 44 darkcyan
+" Color: rgbSeaGreen #2e8b57 29 darkgreen
+" Color: rgbGrey #bebebe 250 grey
+" Color: StatusLineTerm #90ee90 120 darkgreen
+" Color: ToolbarLine #7f7f7f 244 darkgrey
+" Color: Comment #80a0ff 111 blue
+" Color: Constant #ffa0a0 217 darkred
+" Color: Special #ffa500 214 darkyellow
+" Color: Identifier #40ffff 87 cyan
+" Color: Statement #ffff60 227 yellow
+" Color: PreProc #ff80ff 213 magenta
+" Color: Type #60ff60 83 green
+" Color: koeDirectory #cc8000 172 darkyellow
+" Color: koeCursorLine #555555 240 black
+" Color: koeLightBlue #ADD8E6 153 blue
+" Color: koeDarkRed #8b0000 88 darkred
+" Term colors: xterm0 xterm1 xterm2 xterm3 xterm4 xterm5 xterm6 xterm7
+" Term colors: xterm8 xterm9 xterm10 xterm11 xterm12 xterm13
+" Term colors: xterm14 xterm15
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/lists/csscolors.vim b/runtime/colors/lists/csscolors.vim
new file mode 100644
index 0000000..7495522
--- /dev/null
+++ b/runtime/colors/lists/csscolors.vim
@@ -0,0 +1,166 @@
+" Maintainer: Drew Vogel <dvogel@sidejump.org>
+" Last Change: 2021 Jul 25
+
+" Similar in spirit to rgb.txt, this plugin establishes a human-friendly name
+" for every color listed in the CSS standard:
+"
+" https://www.w3.org/TR/css-color-3/
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+call extend(v:colornames, {
+ \ 'css_black': '#000000',
+ \ 'css_silver': '#c0c0c0',
+ \ 'css_gray': '#808080',
+ \ 'css_white': '#FFFFFF',
+ \ 'css_maroon': '#800000',
+ \ 'css_red': '#FF0000',
+ \ 'css_purple': '#800080',
+ \ 'css_fuchsia': '#FF00FF',
+ \ 'css_green': '#008000',
+ \ 'css_lime': '#00FF00',
+ \ 'css_olive': '#808000',
+ \ 'css_yellow': '#FFFF00',
+ \ 'css_navy': '#000080',
+ \ 'css_blue': '#0000FF',
+ \ 'css_teal': '#008080',
+ \ 'css_aqua': '#00FFFF',
+ \
+ \ 'css_aliceblue': '#f0f8ff',
+ \ 'css_antiquewhite': '#faebd7',
+ \ 'css_aquamarine': '#7fffd4',
+ \ 'css_azure': '#f0ffff',
+ \ 'css_beige': '#f5f5dc',
+ \ 'css_bisque': '#ffe4c4',
+ \ 'css_blanchedalmond': '#ffebcd',
+ \ 'css_blueviolet': '#8a2be2',
+ \ 'css_brown': '#a52a2a',
+ \ 'css_burlywood': '#deb887',
+ \ 'css_cadetblue': '#5f9ea0',
+ \ 'css_chartreuse': '#7fff00',
+ \ 'css_chocolate': '#d2691e',
+ \ 'css_coral': '#ff7f50',
+ \ 'css_cornflowerblue': '#6495ed',
+ \ 'css_cornsilk': '#fff8dc',
+ \ 'css_crimson': '#dc143c',
+ \ 'css_cyan': '#00ffff',
+ \ 'css_darkblue': '#00008b',
+ \ 'css_darkcyan': '#008b8b',
+ \ 'css_darkgoldenrod': '#b8860b',
+ \ 'css_darkgray': '#a9a9a9',
+ \ 'css_darkgreen': '#006400',
+ \ 'css_darkgrey': '#a9a9a9',
+ \ 'css_darkkhaki': '#bdb76b',
+ \ 'css_darkmagenta': '#8b008b',
+ \ 'css_darkolivegreen': '#556b2f',
+ \ 'css_darkorange': '#ff8c00',
+ \ 'css_darkorchid': '#9932cc',
+ \ 'css_darkred': '#8b0000',
+ \ 'css_darksalmon': '#e9967a',
+ \ 'css_darkseagreen': '#8fbc8f',
+ \ 'css_darkslateblue': '#483d8b',
+ \ 'css_darkslategray': '#2f4f4f',
+ \ 'css_darkslategrey': '#2f4f4f',
+ \ 'css_darkturquoise': '#00ced1',
+ \ 'css_darkviolet': '#9400d3',
+ \ 'css_deeppink': '#ff1493',
+ \ 'css_deepskyblue': '#00bfff',
+ \ 'css_dimgray': '#696969',
+ \ 'css_dimgrey': '#696969',
+ \ 'css_dodgerblue': '#1e90ff',
+ \ 'css_firebrick': '#b22222',
+ \ 'css_floralwhite': '#fffaf0',
+ \ 'css_forestgreen': '#228b22',
+ \ 'css_gainsboro': '#dcdcdc',
+ \ 'css_ghostwhite': '#f8f8ff',
+ \ 'css_gold': '#ffd700',
+ \ 'css_goldenrod': '#daa520',
+ \ 'css_greenyellow': '#adff2f',
+ \ 'css_grey': '#808080',
+ \ 'css_honeydew': '#f0fff0',
+ \ 'css_hotpink': '#ff69b4',
+ \ 'css_indianred': '#cd5c5c',
+ \ 'css_indigo': '#4b0082',
+ \ 'css_ivory': '#fffff0',
+ \ 'css_khaki': '#f0e68c',
+ \ 'css_lavender': '#e6e6fa',
+ \ 'css_lavenderblush': '#fff0f5',
+ \ 'css_lawngreen': '#7cfc00',
+ \ 'css_lemonchiffon': '#fffacd',
+ \ 'css_lightblue': '#add8e6',
+ \ 'css_lightcoral': '#f08080',
+ \ 'css_lightcyan': '#e0ffff',
+ \ 'css_lightgoldenrodyellow': '#fafad2',
+ \ 'css_lightgray': '#d3d3d3',
+ \ 'css_lightgreen': '#90ee90',
+ \ 'css_lightgrey': '#d3d3d3',
+ \ 'css_lightpink': '#ffb6c1',
+ \ 'css_lightsalmon': '#ffa07a',
+ \ 'css_lightseagreen': '#20b2aa',
+ \ 'css_lightskyblue': '#87cefa',
+ \ 'css_lightslategray': '#778899',
+ \ 'css_lightslategrey': '#778899',
+ \ 'css_lightsteelblue': '#b0c4de',
+ \ 'css_lightyellow': '#ffffe0',
+ \ 'css_limegreen': '#32cd32',
+ \ 'css_linen': '#faf0e6',
+ \ 'css_magenta': '#ff00ff',
+ \ 'css_mediumaquamarine': '#66cdaa',
+ \ 'css_mediumblue': '#0000cd',
+ \ 'css_mediumorchid': '#ba55d3',
+ \ 'css_mediumpurple': '#9370db',
+ \ 'css_mediumseagreen': '#3cb371',
+ \ 'css_mediumslateblue': '#7b68ee',
+ \ 'css_mediumspringgreen': '#00fa9a',
+ \ 'css_mediumturquoise': '#48d1cc',
+ \ 'css_mediumvioletred': '#c71585',
+ \ 'css_midnightblue': '#191970',
+ \ 'css_mintcream': '#f5fffa',
+ \ 'css_mistyrose': '#ffe4e1',
+ \ 'css_moccasin': '#ffe4b5',
+ \ 'css_navajowhite': '#ffdead',
+ \ 'css_oldlace': '#fdf5e6',
+ \ 'css_olivedrab': '#6b8e23',
+ \ 'css_orange': '#ffa500',
+ \ 'css_orangered': '#ff4500',
+ \ 'css_orchid': '#da70d6',
+ \ 'css_palegoldenrod': '#eee8aa',
+ \ 'css_palegreen': '#98fb98',
+ \ 'css_paleturquoise': '#afeeee',
+ \ 'css_palevioletred': '#db7093',
+ \ 'css_papayawhip': '#ffefd5',
+ \ 'css_peachpuff': '#ffdab9',
+ \ 'css_peru': '#cd853f',
+ \ 'css_pink': '#ffc0cb',
+ \ 'css_plum': '#dda0dd',
+ \ 'css_powderblue': '#b0e0e6',
+ \ 'css_rosybrown': '#bc8f8f',
+ \ 'css_royalblue': '#4169e1',
+ \ 'css_saddlebrown': '#8b4513',
+ \ 'css_salmon': '#fa8072',
+ \ 'css_sandybrown': '#f4a460',
+ \ 'css_seagreen': '#2e8b57',
+ \ 'css_seashell': '#fff5ee',
+ \ 'css_sienna': '#a0522d',
+ \ 'css_skyblue': '#87ceeb',
+ \ 'css_slateblue': '#6a5acd',
+ \ 'css_slategray': '#708090',
+ \ 'css_slategrey': '#708090',
+ \ 'css_snow': '#fffafa',
+ \ 'css_springgreen': '#00ff7f',
+ \ 'css_steelblue': '#4682b4',
+ \ 'css_tan': '#d2b48c',
+ \ 'css_thistle': '#d8bfd8',
+ \ 'css_tomato': '#ff6347',
+ \ 'css_turquoise': '#40e0d0',
+ \ 'css_violet': '#ee82ee',
+ \ 'css_wheat': '#f5deb3',
+ \ 'css_whitesmoke': '#f5f5f5',
+ \ 'css_yellowgreen': '#9acd32',
+ \ }, 'keep')
+
+let &cpo= s:keepcpo
+unlet s:keepcpo
+
+"vim: sw=4
diff --git a/runtime/colors/lists/default.vim b/runtime/colors/lists/default.vim
new file mode 100644
index 0000000..f05a1ce
--- /dev/null
+++ b/runtime/colors/lists/default.vim
@@ -0,0 +1,807 @@
+" Maintainer: Drew Vogel <dvogel@sidejump.org>
+" Last Change: 2022 Mar 20
+"
+" Replaced rgb.txt as the source of de facto standard color names. This is
+" sourced each time the colorscheme command is run. It is also sourced each
+" time the highlight command fails to recognize a gui color. You can override
+" these colors by introducing a new colors/lists/default.vim file earlier in
+" the runtimepath.
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+call extend(v:colornames, {
+ \ 'snow': '#fffafa',
+ \ 'ghost white': '#f8f8ff',
+ \ 'ghostwhite': '#f8f8ff',
+ \ 'white smoke': '#f5f5f5',
+ \ 'whitesmoke': '#f5f5f5',
+ \ 'gainsboro': '#dcdcdc',
+ \ 'floral white': '#fffaf0',
+ \ 'floralwhite': '#fffaf0',
+ \ 'old lace': '#fdf5e6',
+ \ 'oldlace': '#fdf5e6',
+ \ 'linen': '#faf0e6',
+ \ 'antique white': '#faebd7',
+ \ 'antiquewhite': '#faebd7',
+ \ 'papaya whip': '#ffefd5',
+ \ 'papayawhip': '#ffefd5',
+ \ 'blanched almond': '#ffebcd',
+ \ 'blanchedalmond': '#ffebcd',
+ \ 'bisque': '#ffe4c4',
+ \ 'peach puff': '#ffdab9',
+ \ 'peachpuff': '#ffdab9',
+ \ 'navajo white': '#ffdead',
+ \ 'navajowhite': '#ffdead',
+ \ 'moccasin': '#ffe4b5',
+ \ 'cornsilk': '#fff8dc',
+ \ 'ivory': '#fffff0',
+ \ 'lemon chiffon': '#fffacd',
+ \ 'lemonchiffon': '#fffacd',
+ \ 'seashell': '#fff5ee',
+ \ 'honeydew': '#f0fff0',
+ \ 'mint cream': '#f5fffa',
+ \ 'mintcream': '#f5fffa',
+ \ 'azure': '#f0ffff',
+ \ 'alice blue': '#f0f8ff',
+ \ 'aliceblue': '#f0f8ff',
+ \ 'lavender': '#e6e6fa',
+ \ 'lavender blush': '#fff0f5',
+ \ 'lavenderblush': '#fff0f5',
+ \ 'misty rose': '#ffe4e1',
+ \ 'mistyrose': '#ffe4e1',
+ \ 'white': '#ffffff',
+ \ 'black': '#000000',
+ \ 'dark slate gray': '#2f4f4f',
+ \ 'darkslategray': '#2f4f4f',
+ \ 'dark slate grey': '#2f4f4f',
+ \ 'darkslategrey': '#2f4f4f',
+ \ 'dim gray': '#696969',
+ \ 'dimgray': '#696969',
+ \ 'dim grey': '#696969',
+ \ 'dimgrey': '#696969',
+ \ 'slate gray': '#708090',
+ \ 'slategray': '#708090',
+ \ 'slate grey': '#708090',
+ \ 'slategrey': '#708090',
+ \ 'light slate gray': '#778899',
+ \ 'lightslategray': '#778899',
+ \ 'light slate grey': '#778899',
+ \ 'lightslategrey': '#778899',
+ \ 'gray': '#bebebe',
+ \ 'grey': '#bebebe',
+ \ 'x11 gray': '#bebebe',
+ \ 'x11gray': '#bebebe',
+ \ 'x11 grey': '#bebebe',
+ \ 'x11grey': '#bebebe',
+ \ 'web gray': '#808080',
+ \ 'webgray': '#808080',
+ \ 'web grey': '#808080',
+ \ 'webgrey': '#808080',
+ \ 'light grey': '#d3d3d3',
+ \ 'lightgrey': '#d3d3d3',
+ \ 'light gray': '#d3d3d3',
+ \ 'lightgray': '#d3d3d3',
+ \ 'midnight blue': '#191970',
+ \ 'midnightblue': '#191970',
+ \ 'navy': '#000080',
+ \ 'navy blue': '#000080',
+ \ 'navyblue': '#000080',
+ \ 'cornflower blue': '#6495ed',
+ \ 'cornflowerblue': '#6495ed',
+ \ 'dark slate blue': '#483d8b',
+ \ 'darkslateblue': '#483d8b',
+ \ 'slate blue': '#6a5acd',
+ \ 'slateblue': '#6a5acd',
+ \ 'medium slate blue': '#7b68ee',
+ \ 'mediumslateblue': '#7b68ee',
+ \ 'light slate blue': '#8470ff',
+ \ 'lightslateblue': '#8470ff',
+ \ 'medium blue': '#0000cd',
+ \ 'mediumblue': '#0000cd',
+ \ 'royal blue': '#4169e1',
+ \ 'royalblue': '#4169e1',
+ \ 'blue': '#0000ff',
+ \ 'dodger blue': '#1e90ff',
+ \ 'dodgerblue': '#1e90ff',
+ \ 'deep sky blue': '#00bfff',
+ \ 'deepskyblue': '#00bfff',
+ \ 'sky blue': '#87ceeb',
+ \ 'skyblue': '#87ceeb',
+ \ 'light sky blue': '#87cefa',
+ \ 'lightskyblue': '#87cefa',
+ \ 'steel blue': '#4682b4',
+ \ 'steelblue': '#4682b4',
+ \ 'light steel blue': '#b0c4de',
+ \ 'lightsteelblue': '#b0c4de',
+ \ 'light blue': '#add8e6',
+ \ 'lightblue': '#add8e6',
+ \ 'powder blue': '#b0e0e6',
+ \ 'powderblue': '#b0e0e6',
+ \ 'pale turquoise': '#afeeee',
+ \ 'paleturquoise': '#afeeee',
+ \ 'dark turquoise': '#00ced1',
+ \ 'darkturquoise': '#00ced1',
+ \ 'medium turquoise': '#48d1cc',
+ \ 'mediumturquoise': '#48d1cc',
+ \ 'turquoise': '#40e0d0',
+ \ 'cyan': '#00ffff',
+ \ 'aqua': '#00ffff',
+ \ 'light cyan': '#e0ffff',
+ \ 'lightcyan': '#e0ffff',
+ \ 'cadet blue': '#5f9ea0',
+ \ 'cadetblue': '#5f9ea0',
+ \ 'medium aquamarine': '#66cdaa',
+ \ 'mediumaquamarine': '#66cdaa',
+ \ 'aquamarine': '#7fffd4',
+ \ 'dark green': '#006400',
+ \ 'darkgreen': '#006400',
+ \ 'dark olive green': '#556b2f',
+ \ 'darkolivegreen': '#556b2f',
+ \ 'dark sea green': '#8fbc8f',
+ \ 'darkseagreen': '#8fbc8f',
+ \ 'sea green': '#2e8b57',
+ \ 'seagreen': '#2e8b57',
+ \ 'medium sea green': '#3cb371',
+ \ 'mediumseagreen': '#3cb371',
+ \ 'light sea green': '#20b2aa',
+ \ 'lightseagreen': '#20b2aa',
+ \ 'pale green': '#98fb98',
+ \ 'palegreen': '#98fb98',
+ \ 'spring green': '#00ff7f',
+ \ 'springgreen': '#00ff7f',
+ \ 'lawn green': '#7cfc00',
+ \ 'lawngreen': '#7cfc00',
+ \ 'green': '#00ff00',
+ \ 'lime': '#00ff00',
+ \ 'x11 green': '#00ff00',
+ \ 'x11green': '#00ff00',
+ \ 'web green': '#008000',
+ \ 'webgreen': '#008000',
+ \ 'chartreuse': '#7fff00',
+ \ 'medium spring green': '#00fa9a',
+ \ 'mediumspringgreen': '#00fa9a',
+ \ 'green yellow': '#adff2f',
+ \ 'greenyellow': '#adff2f',
+ \ 'lime green': '#32cd32',
+ \ 'limegreen': '#32cd32',
+ \ 'yellow green': '#9acd32',
+ \ 'yellowgreen': '#9acd32',
+ \ 'forest green': '#228b22',
+ \ 'forestgreen': '#228b22',
+ \ 'olive drab': '#6b8e23',
+ \ 'olivedrab': '#6b8e23',
+ \ 'dark khaki': '#bdb76b',
+ \ 'darkkhaki': '#bdb76b',
+ \ 'khaki': '#f0e68c',
+ \ 'pale goldenrod': '#eee8aa',
+ \ 'palegoldenrod': '#eee8aa',
+ \ 'light goldenrod yellow': '#fafad2',
+ \ 'lightgoldenrodyellow': '#fafad2',
+ \ 'light yellow': '#ffffe0',
+ \ 'lightyellow': '#ffffe0',
+ \ 'yellow': '#ffff00',
+ \ 'gold': '#ffd700',
+ \ 'light goldenrod': '#eedd82',
+ \ 'lightgoldenrod': '#eedd82',
+ \ 'goldenrod': '#daa520',
+ \ 'dark goldenrod': '#b8860b',
+ \ 'darkgoldenrod': '#b8860b',
+ \ 'rosy brown': '#bc8f8f',
+ \ 'rosybrown': '#bc8f8f',
+ \ 'indian red': '#cd5c5c',
+ \ 'indianred': '#cd5c5c',
+ \ 'saddle brown': '#8b4513',
+ \ 'saddlebrown': '#8b4513',
+ \ 'sienna': '#a0522d',
+ \ 'peru': '#cd853f',
+ \ 'burlywood': '#deb887',
+ \ 'beige': '#f5f5dc',
+ \ 'wheat': '#f5deb3',
+ \ 'sandy brown': '#f4a460',
+ \ 'sandybrown': '#f4a460',
+ \ 'tan': '#d2b48c',
+ \ 'chocolate': '#d2691e',
+ \ 'firebrick': '#b22222',
+ \ 'brown': '#a52a2a',
+ \ 'dark salmon': '#e9967a',
+ \ 'darksalmon': '#e9967a',
+ \ 'salmon': '#fa8072',
+ \ 'light salmon': '#ffa07a',
+ \ 'lightsalmon': '#ffa07a',
+ \ 'orange': '#ffa500',
+ \ 'dark orange': '#ff8c00',
+ \ 'darkorange': '#ff8c00',
+ \ 'coral': '#ff7f50',
+ \ 'light coral': '#f08080',
+ \ 'lightcoral': '#f08080',
+ \ 'tomato': '#ff6347',
+ \ 'orange red': '#ff4500',
+ \ 'orangered': '#ff4500',
+ \ 'red': '#ff0000',
+ \ 'hot pink': '#ff69b4',
+ \ 'hotpink': '#ff69b4',
+ \ 'deep pink': '#ff1493',
+ \ 'deeppink': '#ff1493',
+ \ 'pink': '#ffc0cb',
+ \ 'light pink': '#ffb6c1',
+ \ 'lightpink': '#ffb6c1',
+ \ 'pale violet red': '#db7093',
+ \ 'palevioletred': '#db7093',
+ \ 'maroon': '#b03060',
+ \ 'x11 maroon': '#b03060',
+ \ 'x11maroon': '#b03060',
+ \ 'web maroon': '#800000',
+ \ 'webmaroon': '#800000',
+ \ 'medium violet red': '#c71585',
+ \ 'mediumvioletred': '#c71585',
+ \ 'violet red': '#d02090',
+ \ 'violetred': '#d02090',
+ \ 'magenta': '#ff00ff',
+ \ 'fuchsia': '#ff00ff',
+ \ 'violet': '#ee82ee',
+ \ 'plum': '#dda0dd',
+ \ 'orchid': '#da70d6',
+ \ 'medium orchid': '#ba55d3',
+ \ 'mediumorchid': '#ba55d3',
+ \ 'dark orchid': '#9932cc',
+ \ 'darkorchid': '#9932cc',
+ \ 'dark violet': '#9400d3',
+ \ 'darkviolet': '#9400d3',
+ \ 'blue violet': '#8a2be2',
+ \ 'blueviolet': '#8a2be2',
+ \ 'purple': '#a020f0',
+ \ 'x11 purple': '#a020f0',
+ \ 'x11purple': '#a020f0',
+ \ 'web purple': '#800080',
+ \ 'webpurple': '#800080',
+ \ 'medium purple': '#9370db',
+ \ 'mediumpurple': '#9370db',
+ \ 'thistle': '#d8bfd8',
+ \ 'snow1': '#fffafa',
+ \ 'snow2': '#eee9e9',
+ \ 'snow3': '#cdc9c9',
+ \ 'snow4': '#8b8989',
+ \ 'seashell1': '#fff5ee',
+ \ 'seashell2': '#eee5de',
+ \ 'seashell3': '#cdc5bf',
+ \ 'seashell4': '#8b8682',
+ \ 'antiquewhite1': '#ffefdb',
+ \ 'antiquewhite2': '#eedfcc',
+ \ 'antiquewhite3': '#cdc0b0',
+ \ 'antiquewhite4': '#8b8378',
+ \ 'bisque1': '#ffe4c4',
+ \ 'bisque2': '#eed5b7',
+ \ 'bisque3': '#cdb79e',
+ \ 'bisque4': '#8b7d6b',
+ \ 'peachpuff1': '#ffdab9',
+ \ 'peachpuff2': '#eecbad',
+ \ 'peachpuff3': '#cdaf95',
+ \ 'peachpuff4': '#8b7765',
+ \ 'navajowhite1': '#ffdead',
+ \ 'navajowhite2': '#eecfa1',
+ \ 'navajowhite3': '#cdb38b',
+ \ 'navajowhite4': '#8b795e',
+ \ 'lemonchiffon1': '#fffacd',
+ \ 'lemonchiffon2': '#eee9bf',
+ \ 'lemonchiffon3': '#cdc9a5',
+ \ 'lemonchiffon4': '#8b8970',
+ \ 'cornsilk1': '#fff8dc',
+ \ 'cornsilk2': '#eee8cd',
+ \ 'cornsilk3': '#cdc8b1',
+ \ 'cornsilk4': '#8b8878',
+ \ 'ivory1': '#fffff0',
+ \ 'ivory2': '#eeeee0',
+ \ 'ivory3': '#cdcdc1',
+ \ 'ivory4': '#8b8b83',
+ \ 'honeydew1': '#f0fff0',
+ \ 'honeydew2': '#e0eee0',
+ \ 'honeydew3': '#c1cdc1',
+ \ 'honeydew4': '#838b83',
+ \ 'lavenderblush1': '#fff0f5',
+ \ 'lavenderblush2': '#eee0e5',
+ \ 'lavenderblush3': '#cdc1c5',
+ \ 'lavenderblush4': '#8b8386',
+ \ 'mistyrose1': '#ffe4e1',
+ \ 'mistyrose2': '#eed5d2',
+ \ 'mistyrose3': '#cdb7b5',
+ \ 'mistyrose4': '#8b7d7b',
+ \ 'azure1': '#f0ffff',
+ \ 'azure2': '#e0eeee',
+ \ 'azure3': '#c1cdcd',
+ \ 'azure4': '#838b8b',
+ \ 'slateblue1': '#836fff',
+ \ 'slateblue2': '#7a67ee',
+ \ 'slateblue3': '#6959cd',
+ \ 'slateblue4': '#473c8b',
+ \ 'royalblue1': '#4876ff',
+ \ 'royalblue2': '#436eee',
+ \ 'royalblue3': '#3a5fcd',
+ \ 'royalblue4': '#27408b',
+ \ 'blue1': '#0000ff',
+ \ 'blue2': '#0000ee',
+ \ 'blue3': '#0000cd',
+ \ 'blue4': '#00008b',
+ \ 'dodgerblue1': '#1e90ff',
+ \ 'dodgerblue2': '#1c86ee',
+ \ 'dodgerblue3': '#1874cd',
+ \ 'dodgerblue4': '#104e8b',
+ \ 'steelblue1': '#63b8ff',
+ \ 'steelblue2': '#5cacee',
+ \ 'steelblue3': '#4f94cd',
+ \ 'steelblue4': '#36648b',
+ \ 'deepskyblue1': '#00bfff',
+ \ 'deepskyblue2': '#00b2ee',
+ \ 'deepskyblue3': '#009acd',
+ \ 'deepskyblue4': '#00688b',
+ \ 'skyblue1': '#87ceff',
+ \ 'skyblue2': '#7ec0ee',
+ \ 'skyblue3': '#6ca6cd',
+ \ 'skyblue4': '#4a708b',
+ \ 'lightskyblue1': '#b0e2ff',
+ \ 'lightskyblue2': '#a4d3ee',
+ \ 'lightskyblue3': '#8db6cd',
+ \ 'lightskyblue4': '#607b8b',
+ \ 'slategray1': '#c6e2ff',
+ \ 'slategray2': '#b9d3ee',
+ \ 'slategray3': '#9fb6cd',
+ \ 'slategray4': '#6c7b8b',
+ \ 'lightsteelblue1': '#cae1ff',
+ \ 'lightsteelblue2': '#bcd2ee',
+ \ 'lightsteelblue3': '#a2b5cd',
+ \ 'lightsteelblue4': '#6e7b8b',
+ \ 'lightblue1': '#bfefff',
+ \ 'lightblue2': '#b2dfee',
+ \ 'lightblue3': '#9ac0cd',
+ \ 'lightblue4': '#68838b',
+ \ 'lightcyan1': '#e0ffff',
+ \ 'lightcyan2': '#d1eeee',
+ \ 'lightcyan3': '#b4cdcd',
+ \ 'lightcyan4': '#7a8b8b',
+ \ 'paleturquoise1': '#bbffff',
+ \ 'paleturquoise2': '#aeeeee',
+ \ 'paleturquoise3': '#96cdcd',
+ \ 'paleturquoise4': '#668b8b',
+ \ 'cadetblue1': '#98f5ff',
+ \ 'cadetblue2': '#8ee5ee',
+ \ 'cadetblue3': '#7ac5cd',
+ \ 'cadetblue4': '#53868b',
+ \ 'turquoise1': '#00f5ff',
+ \ 'turquoise2': '#00e5ee',
+ \ 'turquoise3': '#00c5cd',
+ \ 'turquoise4': '#00868b',
+ \ 'cyan1': '#00ffff',
+ \ 'cyan2': '#00eeee',
+ \ 'cyan3': '#00cdcd',
+ \ 'cyan4': '#008b8b',
+ \ 'darkslategray1': '#97ffff',
+ \ 'darkslategray2': '#8deeee',
+ \ 'darkslategray3': '#79cdcd',
+ \ 'darkslategray4': '#528b8b',
+ \ 'aquamarine1': '#7fffd4',
+ \ 'aquamarine2': '#76eec6',
+ \ 'aquamarine3': '#66cdaa',
+ \ 'aquamarine4': '#458b74',
+ \ 'darkseagreen1': '#c1ffc1',
+ \ 'darkseagreen2': '#b4eeb4',
+ \ 'darkseagreen3': '#9bcd9b',
+ \ 'darkseagreen4': '#698b69',
+ \ 'seagreen1': '#54ff9f',
+ \ 'seagreen2': '#4eee94',
+ \ 'seagreen3': '#43cd80',
+ \ 'seagreen4': '#2e8b57',
+ \ 'palegreen1': '#9aff9a',
+ \ 'palegreen2': '#90ee90',
+ \ 'palegreen3': '#7ccd7c',
+ \ 'palegreen4': '#548b54',
+ \ 'springgreen1': '#00ff7f',
+ \ 'springgreen2': '#00ee76',
+ \ 'springgreen3': '#00cd66',
+ \ 'springgreen4': '#008b45',
+ \ 'green1': '#00ff00',
+ \ 'green2': '#00ee00',
+ \ 'green3': '#00cd00',
+ \ 'green4': '#008b00',
+ \ 'chartreuse1': '#7fff00',
+ \ 'chartreuse2': '#76ee00',
+ \ 'chartreuse3': '#66cd00',
+ \ 'chartreuse4': '#458b00',
+ \ 'olivedrab1': '#c0ff3e',
+ \ 'olivedrab2': '#b3ee3a',
+ \ 'olivedrab3': '#9acd32',
+ \ 'olivedrab4': '#698b22',
+ \ 'darkolivegreen1': '#caff70',
+ \ 'darkolivegreen2': '#bcee68',
+ \ 'darkolivegreen3': '#a2cd5a',
+ \ 'darkolivegreen4': '#6e8b3d',
+ \ 'khaki1': '#fff68f',
+ \ 'khaki2': '#eee685',
+ \ 'khaki3': '#cdc673',
+ \ 'khaki4': '#8b864e',
+ \ 'lightgoldenrod1': '#ffec8b',
+ \ 'lightgoldenrod2': '#eedc82',
+ \ 'lightgoldenrod3': '#cdbe70',
+ \ 'lightgoldenrod4': '#8b814c',
+ \ 'lightyellow1': '#ffffe0',
+ \ 'lightyellow2': '#eeeed1',
+ \ 'lightyellow3': '#cdcdb4',
+ \ 'lightyellow4': '#8b8b7a',
+ \ 'yellow1': '#ffff00',
+ \ 'yellow2': '#eeee00',
+ \ 'yellow3': '#cdcd00',
+ \ 'yellow4': '#8b8b00',
+ \ 'dark yellow': '#8b8b00',
+ \ 'darkyellow': '#8b8b00',
+ \ 'gold1': '#ffd700',
+ \ 'gold2': '#eec900',
+ \ 'gold3': '#cdad00',
+ \ 'gold4': '#8b7500',
+ \ 'goldenrod1': '#ffc125',
+ \ 'goldenrod2': '#eeb422',
+ \ 'goldenrod3': '#cd9b1d',
+ \ 'goldenrod4': '#8b6914',
+ \ 'darkgoldenrod1': '#ffb90f',
+ \ 'darkgoldenrod2': '#eead0e',
+ \ 'darkgoldenrod3': '#cd950c',
+ \ 'darkgoldenrod4': '#8b6508',
+ \ 'rosybrown1': '#ffc1c1',
+ \ 'rosybrown2': '#eeb4b4',
+ \ 'rosybrown3': '#cd9b9b',
+ \ 'rosybrown4': '#8b6969',
+ \ 'indianred1': '#ff6a6a',
+ \ 'indianred2': '#ee6363',
+ \ 'indianred3': '#cd5555',
+ \ 'indianred4': '#8b3a3a',
+ \ 'sienna1': '#ff8247',
+ \ 'sienna2': '#ee7942',
+ \ 'sienna3': '#cd6839',
+ \ 'sienna4': '#8b4726',
+ \ 'burlywood1': '#ffd39b',
+ \ 'burlywood2': '#eec591',
+ \ 'burlywood3': '#cdaa7d',
+ \ 'burlywood4': '#8b7355',
+ \ 'wheat1': '#ffe7ba',
+ \ 'wheat2': '#eed8ae',
+ \ 'wheat3': '#cdba96',
+ \ 'wheat4': '#8b7e66',
+ \ 'tan1': '#ffa54f',
+ \ 'tan2': '#ee9a49',
+ \ 'tan3': '#cd853f',
+ \ 'tan4': '#8b5a2b',
+ \ 'chocolate1': '#ff7f24',
+ \ 'chocolate2': '#ee7621',
+ \ 'chocolate3': '#cd661d',
+ \ 'chocolate4': '#8b4513',
+ \ 'firebrick1': '#ff3030',
+ \ 'firebrick2': '#ee2c2c',
+ \ 'firebrick3': '#cd2626',
+ \ 'firebrick4': '#8b1a1a',
+ \ 'brown1': '#ff4040',
+ \ 'brown2': '#ee3b3b',
+ \ 'brown3': '#cd3333',
+ \ 'brown4': '#8b2323',
+ \ 'salmon1': '#ff8c69',
+ \ 'salmon2': '#ee8262',
+ \ 'salmon3': '#cd7054',
+ \ 'salmon4': '#8b4c39',
+ \ 'lightsalmon1': '#ffa07a',
+ \ 'lightsalmon2': '#ee9572',
+ \ 'lightsalmon3': '#cd8162',
+ \ 'lightsalmon4': '#8b5742',
+ \ 'orange1': '#ffa500',
+ \ 'orange2': '#ee9a00',
+ \ 'orange3': '#cd8500',
+ \ 'orange4': '#8b5a00',
+ \ 'darkorange1': '#ff7f00',
+ \ 'darkorange2': '#ee7600',
+ \ 'darkorange3': '#cd6600',
+ \ 'darkorange4': '#8b4500',
+ \ 'coral1': '#ff7256',
+ \ 'coral2': '#ee6a50',
+ \ 'coral3': '#cd5b45',
+ \ 'coral4': '#8b3e2f',
+ \ 'tomato1': '#ff6347',
+ \ 'tomato2': '#ee5c42',
+ \ 'tomato3': '#cd4f39',
+ \ 'tomato4': '#8b3626',
+ \ 'orangered1': '#ff4500',
+ \ 'orangered2': '#ee4000',
+ \ 'orangered3': '#cd3700',
+ \ 'orangered4': '#8b2500',
+ \ 'light red': '#ff8b8b',
+ \ 'lightred': '#ff8b8b',
+ \ 'red1': '#ff0000',
+ \ 'red2': '#ee0000',
+ \ 'red3': '#cd0000',
+ \ 'red4': '#8b0000',
+ \ 'deeppink1': '#ff1493',
+ \ 'deeppink2': '#ee1289',
+ \ 'deeppink3': '#cd1076',
+ \ 'deeppink4': '#8b0a50',
+ \ 'hotpink1': '#ff6eb4',
+ \ 'hotpink2': '#ee6aa7',
+ \ 'hotpink3': '#cd6090',
+ \ 'hotpink4': '#8b3a62',
+ \ 'pink1': '#ffb5c5',
+ \ 'pink2': '#eea9b8',
+ \ 'pink3': '#cd919e',
+ \ 'pink4': '#8b636c',
+ \ 'lightpink1': '#ffaeb9',
+ \ 'lightpink2': '#eea2ad',
+ \ 'lightpink3': '#cd8c95',
+ \ 'lightpink4': '#8b5f65',
+ \ 'palevioletred1': '#ff82ab',
+ \ 'palevioletred2': '#ee799f',
+ \ 'palevioletred3': '#cd6889',
+ \ 'palevioletred4': '#8b475d',
+ \ 'maroon1': '#ff34b3',
+ \ 'maroon2': '#ee30a7',
+ \ 'maroon3': '#cd2990',
+ \ 'maroon4': '#8b1c62',
+ \ 'violetred1': '#ff3e96',
+ \ 'violetred2': '#ee3a8c',
+ \ 'violetred3': '#cd3278',
+ \ 'violetred4': '#8b2252',
+ \ 'light magenta': '#ff8bff',
+ \ 'lightmagenta': '#ff8bff',
+ \ 'magenta1': '#ff00ff',
+ \ 'magenta2': '#ee00ee',
+ \ 'magenta3': '#cd00cd',
+ \ 'magenta4': '#8b008b',
+ \ 'orchid1': '#ff83fa',
+ \ 'orchid2': '#ee7ae9',
+ \ 'orchid3': '#cd69c9',
+ \ 'orchid4': '#8b4789',
+ \ 'plum1': '#ffbbff',
+ \ 'plum2': '#eeaeee',
+ \ 'plum3': '#cd96cd',
+ \ 'plum4': '#8b668b',
+ \ 'mediumorchid1': '#e066ff',
+ \ 'mediumorchid2': '#d15fee',
+ \ 'mediumorchid3': '#b452cd',
+ \ 'mediumorchid4': '#7a378b',
+ \ 'darkorchid1': '#bf3eff',
+ \ 'darkorchid2': '#b23aee',
+ \ 'darkorchid3': '#9a32cd',
+ \ 'darkorchid4': '#68228b',
+ \ 'purple1': '#9b30ff',
+ \ 'purple2': '#912cee',
+ \ 'purple3': '#7d26cd',
+ \ 'purple4': '#551a8b',
+ \ 'mediumpurple1': '#ab82ff',
+ \ 'mediumpurple2': '#9f79ee',
+ \ 'mediumpurple3': '#8968cd',
+ \ 'mediumpurple4': '#5d478b',
+ \ 'thistle1': '#ffe1ff',
+ \ 'thistle2': '#eed2ee',
+ \ 'thistle3': '#cdb5cd',
+ \ 'thistle4': '#8b7b8b',
+ \ 'gray0': '#000000',
+ \ 'grey0': '#000000',
+ \ 'gray1': '#030303',
+ \ 'grey1': '#030303',
+ \ 'gray2': '#050505',
+ \ 'grey2': '#050505',
+ \ 'gray3': '#080808',
+ \ 'grey3': '#080808',
+ \ 'gray4': '#0a0a0a',
+ \ 'grey4': '#0a0a0a',
+ \ 'gray5': '#0d0d0d',
+ \ 'grey5': '#0d0d0d',
+ \ 'gray6': '#0f0f0f',
+ \ 'grey6': '#0f0f0f',
+ \ 'gray7': '#121212',
+ \ 'grey7': '#121212',
+ \ 'gray8': '#141414',
+ \ 'grey8': '#141414',
+ \ 'gray9': '#171717',
+ \ 'grey9': '#171717',
+ \ 'gray10': '#1a1a1a',
+ \ 'grey10': '#1a1a1a',
+ \ 'gray11': '#1c1c1c',
+ \ 'grey11': '#1c1c1c',
+ \ 'gray12': '#1f1f1f',
+ \ 'grey12': '#1f1f1f',
+ \ 'gray13': '#212121',
+ \ 'grey13': '#212121',
+ \ 'gray14': '#242424',
+ \ 'grey14': '#242424',
+ \ 'gray15': '#262626',
+ \ 'grey15': '#262626',
+ \ 'gray16': '#292929',
+ \ 'grey16': '#292929',
+ \ 'gray17': '#2b2b2b',
+ \ 'grey17': '#2b2b2b',
+ \ 'gray18': '#2e2e2e',
+ \ 'grey18': '#2e2e2e',
+ \ 'gray19': '#303030',
+ \ 'grey19': '#303030',
+ \ 'gray20': '#333333',
+ \ 'grey20': '#333333',
+ \ 'gray21': '#363636',
+ \ 'grey21': '#363636',
+ \ 'gray22': '#383838',
+ \ 'grey22': '#383838',
+ \ 'gray23': '#3b3b3b',
+ \ 'grey23': '#3b3b3b',
+ \ 'gray24': '#3d3d3d',
+ \ 'grey24': '#3d3d3d',
+ \ 'gray25': '#404040',
+ \ 'grey25': '#404040',
+ \ 'gray26': '#424242',
+ \ 'grey26': '#424242',
+ \ 'gray27': '#454545',
+ \ 'grey27': '#454545',
+ \ 'gray28': '#474747',
+ \ 'grey28': '#474747',
+ \ 'gray29': '#4a4a4a',
+ \ 'grey29': '#4a4a4a',
+ \ 'gray30': '#4d4d4d',
+ \ 'grey30': '#4d4d4d',
+ \ 'gray31': '#4f4f4f',
+ \ 'grey31': '#4f4f4f',
+ \ 'gray32': '#525252',
+ \ 'grey32': '#525252',
+ \ 'gray33': '#545454',
+ \ 'grey33': '#545454',
+ \ 'gray34': '#575757',
+ \ 'grey34': '#575757',
+ \ 'gray35': '#595959',
+ \ 'grey35': '#595959',
+ \ 'gray36': '#5c5c5c',
+ \ 'grey36': '#5c5c5c',
+ \ 'gray37': '#5e5e5e',
+ \ 'grey37': '#5e5e5e',
+ \ 'gray38': '#616161',
+ \ 'grey38': '#616161',
+ \ 'gray39': '#636363',
+ \ 'grey39': '#636363',
+ \ 'gray40': '#666666',
+ \ 'grey40': '#666666',
+ \ 'gray41': '#696969',
+ \ 'grey41': '#696969',
+ \ 'gray42': '#6b6b6b',
+ \ 'grey42': '#6b6b6b',
+ \ 'gray43': '#6e6e6e',
+ \ 'grey43': '#6e6e6e',
+ \ 'gray44': '#707070',
+ \ 'grey44': '#707070',
+ \ 'gray45': '#737373',
+ \ 'grey45': '#737373',
+ \ 'gray46': '#757575',
+ \ 'grey46': '#757575',
+ \ 'gray47': '#787878',
+ \ 'grey47': '#787878',
+ \ 'gray48': '#7a7a7a',
+ \ 'grey48': '#7a7a7a',
+ \ 'gray49': '#7d7d7d',
+ \ 'grey49': '#7d7d7d',
+ \ 'gray50': '#7f7f7f',
+ \ 'grey50': '#7f7f7f',
+ \ 'gray51': '#828282',
+ \ 'grey51': '#828282',
+ \ 'gray52': '#858585',
+ \ 'grey52': '#858585',
+ \ 'gray53': '#878787',
+ \ 'grey53': '#878787',
+ \ 'gray54': '#8a8a8a',
+ \ 'grey54': '#8a8a8a',
+ \ 'gray55': '#8c8c8c',
+ \ 'grey55': '#8c8c8c',
+ \ 'gray56': '#8f8f8f',
+ \ 'grey56': '#8f8f8f',
+ \ 'gray57': '#919191',
+ \ 'grey57': '#919191',
+ \ 'gray58': '#949494',
+ \ 'grey58': '#949494',
+ \ 'gray59': '#969696',
+ \ 'grey59': '#969696',
+ \ 'gray60': '#999999',
+ \ 'grey60': '#999999',
+ \ 'gray61': '#9c9c9c',
+ \ 'grey61': '#9c9c9c',
+ \ 'gray62': '#9e9e9e',
+ \ 'grey62': '#9e9e9e',
+ \ 'gray63': '#a1a1a1',
+ \ 'grey63': '#a1a1a1',
+ \ 'gray64': '#a3a3a3',
+ \ 'grey64': '#a3a3a3',
+ \ 'gray65': '#a6a6a6',
+ \ 'grey65': '#a6a6a6',
+ \ 'gray66': '#a8a8a8',
+ \ 'grey66': '#a8a8a8',
+ \ 'gray67': '#ababab',
+ \ 'grey67': '#ababab',
+ \ 'gray68': '#adadad',
+ \ 'grey68': '#adadad',
+ \ 'gray69': '#b0b0b0',
+ \ 'grey69': '#b0b0b0',
+ \ 'gray70': '#b3b3b3',
+ \ 'grey70': '#b3b3b3',
+ \ 'gray71': '#b5b5b5',
+ \ 'grey71': '#b5b5b5',
+ \ 'gray72': '#b8b8b8',
+ \ 'grey72': '#b8b8b8',
+ \ 'gray73': '#bababa',
+ \ 'grey73': '#bababa',
+ \ 'gray74': '#bdbdbd',
+ \ 'grey74': '#bdbdbd',
+ \ 'gray75': '#bfbfbf',
+ \ 'grey75': '#bfbfbf',
+ \ 'gray76': '#c2c2c2',
+ \ 'grey76': '#c2c2c2',
+ \ 'gray77': '#c4c4c4',
+ \ 'grey77': '#c4c4c4',
+ \ 'gray78': '#c7c7c7',
+ \ 'grey78': '#c7c7c7',
+ \ 'gray79': '#c9c9c9',
+ \ 'grey79': '#c9c9c9',
+ \ 'gray80': '#cccccc',
+ \ 'grey80': '#cccccc',
+ \ 'gray81': '#cfcfcf',
+ \ 'grey81': '#cfcfcf',
+ \ 'gray82': '#d1d1d1',
+ \ 'grey82': '#d1d1d1',
+ \ 'gray83': '#d4d4d4',
+ \ 'grey83': '#d4d4d4',
+ \ 'gray84': '#d6d6d6',
+ \ 'grey84': '#d6d6d6',
+ \ 'gray85': '#d9d9d9',
+ \ 'grey85': '#d9d9d9',
+ \ 'gray86': '#dbdbdb',
+ \ 'grey86': '#dbdbdb',
+ \ 'gray87': '#dedede',
+ \ 'grey87': '#dedede',
+ \ 'gray88': '#e0e0e0',
+ \ 'grey88': '#e0e0e0',
+ \ 'gray89': '#e3e3e3',
+ \ 'grey89': '#e3e3e3',
+ \ 'gray90': '#e5e5e5',
+ \ 'grey90': '#e5e5e5',
+ \ 'gray91': '#e8e8e8',
+ \ 'grey91': '#e8e8e8',
+ \ 'gray92': '#ebebeb',
+ \ 'grey92': '#ebebeb',
+ \ 'gray93': '#ededed',
+ \ 'grey93': '#ededed',
+ \ 'gray94': '#f0f0f0',
+ \ 'grey94': '#f0f0f0',
+ \ 'gray95': '#f2f2f2',
+ \ 'grey95': '#f2f2f2',
+ \ 'gray96': '#f5f5f5',
+ \ 'grey96': '#f5f5f5',
+ \ 'gray97': '#f7f7f7',
+ \ 'grey97': '#f7f7f7',
+ \ 'gray98': '#fafafa',
+ \ 'grey98': '#fafafa',
+ \ 'gray99': '#fcfcfc',
+ \ 'grey99': '#fcfcfc',
+ \ 'gray100': '#ffffff',
+ \ 'grey100': '#ffffff',
+ \ 'dark grey': '#a9a9a9',
+ \ 'darkgrey': '#a9a9a9',
+ \ 'dark gray': '#a9a9a9',
+ \ 'darkgray': '#a9a9a9',
+ \ 'dark blue': '#00008b',
+ \ 'darkblue': '#00008b',
+ \ 'dark cyan': '#008b8b',
+ \ 'darkcyan': '#008b8b',
+ \ 'dark magenta': '#8b008b',
+ \ 'darkmagenta': '#8b008b',
+ \ 'dark red': '#8b0000',
+ \ 'darkred': '#8b0000',
+ \ 'light green': '#90ee90',
+ \ 'lightgreen': '#90ee90',
+ \ 'crimson': '#dc143c',
+ \ 'indigo': '#4b0082',
+ \ 'olive': '#808000',
+ \ 'rebecca purple': '#663399',
+ \ 'rebeccapurple': '#663399',
+ \ 'silver': '#c0c0c0',
+ \ 'teal': '#008080'
+ \ }, 'keep')
+
+let &cpo= s:keepcpo
+unlet s:keepcpo
+
+"vim: sw=4
diff --git a/runtime/colors/lunaperche.vim b/runtime/colors/lunaperche.vim
new file mode 100644
index 0000000..6278177
--- /dev/null
+++ b/runtime/colors/lunaperche.vim
@@ -0,0 +1,1002 @@
+" Name: Perchè il sole a Milano? Portofino? Dimmi la luna perchè?
+" Description: White(perchè il sole)/Black(la luna perchè?) background colorscheme.
+" Author: Maxim Kim <habamax@gmail.com>
+" Maintainer: Maxim Kim <habamax@gmail.com>
+" Website: https://www.github.com/vim/colorschemes
+" License: Vim License (see `:help license`)
+" Last Updated: Fri 16 Sep 2022 13:15:33 MSK
+
+" Generated by Colortemplate v2.2.0
+
+hi clear
+let g:colors_name = 'lunaperche'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+hi! link helpVim Title
+hi! link helpHeader Title
+hi! link helpHyperTextJump Underlined
+hi! link fugitiveSymbolicRef PreProc
+hi! link fugitiveHeading Statement
+hi! link fugitiveStagedHeading Statement
+hi! link fugitiveUnstagedHeading Statement
+hi! link fugitiveUntrackedHeading Statement
+hi! link fugitiveStagedModifier PreProc
+hi! link fugitiveUnstagedModifier PreProc
+hi! link fugitiveHash Constant
+hi! link diffFile PreProc
+hi! link markdownHeadingDelimiter Special
+hi! link rstSectionDelimiter Statement
+hi! link rstDirective PreProc
+hi! link rstHyperlinkReference Special
+hi! link rstFieldName Constant
+hi! link rstDelimiter Special
+hi! link rstInterpretedText Special
+hi! link rstCodeBlock Normal
+hi! link rstLiteralBlock rstCodeBlock
+hi! link markdownUrl String
+hi! link colortemplateKey Statement
+hi! link xmlTagName Statement
+hi! link javaScriptFunction Statement
+hi! link javaScriptIdentifier Statement
+hi! link sqlKeyword Statement
+hi! link yamlBlockMappingKey Statement
+hi! link rubyMacro Statement
+hi! link rubyDefine Statement
+hi! link vimGroup Normal
+hi! link vimVar Normal
+hi! link vimOper Normal
+hi! link vimSep Normal
+hi! link vimParenSep Normal
+hi! link vimOption Normal
+hi! link vimCommentString Comment
+hi! link pythonInclude Statement
+hi! link elixirOperator Statement
+hi! link elixirKeyword Statement
+hi! link elixirBlockDefinition Statement
+hi! link elixirDefine Statement
+hi! link elixirPrivateDefine Statement
+hi! link elixirGuard Statement
+hi! link elixirPrivateGuard Statement
+hi! link elixirModuleDefine Statement
+hi! link elixirProtocolDefine Statement
+hi! link elixirImplDefine Statement
+hi! link elixirRecordDefine Statement
+hi! link elixirPrivateRecordDefine Statement
+hi! link elixirMacroDefine Statement
+hi! link elixirPrivateMacroDefine Statement
+hi! link elixirDelegateDefine Statement
+hi! link elixirOverridableDefine Statement
+hi! link elixirExceptionDefine Statement
+hi! link elixirCallbackDefine Statement
+hi! link elixirStructDefine Statement
+hi! link elixirExUnitMacro Statement
+hi! link elixirInclude Statement
+hi! link elixirVariable Special
+hi! link elixirAtom Constant
+hi! link elixirDocTest String
+hi! link shQuote Constant
+hi! link shNoQuote Normal
+hi! link shTestOpr Normal
+hi! link shOperator Normal
+hi! link shSetOption Normal
+hi! link shOption Normal
+hi! link shCommandSub Normal
+hi! link shDerefPattern shQuote
+hi! link shDerefOp Special
+hi! link phpStorageClass Statement
+hi! link phpStructure Statement
+hi! link phpInclude Statement
+hi! link phpDefine Statement
+hi! link phpSpecialFunction Normal
+hi! link phpParent Normal
+hi! link phpComparison Normal
+hi! link phpOperator Normal
+hi! link phpVarSelector Special
+hi! link phpMemberSelector Special
+hi! link phpDocCustomTags phpDocTags
+hi! link javaExternal Statement
+hi! link javaType Statement
+hi! link javaScopeDecl Statement
+hi! link javaClassDecl Statement
+hi! link javaStorageClass Statement
+hi! link javaDocParam PreProc
+hi! link csStorage Statement
+hi! link csAccessModifier Statement
+hi! link csClass Statement
+hi! link csModifier Statement
+hi! link csAsyncModifier Statement
+hi! link csLogicSymbols Normal
+hi! link csClassType Normal
+hi! link csType Statement
+hi! link Terminal Normal
+hi! link StatuslineTerm Statusline
+hi! link StatuslineTermNC StatuslineNC
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link MessageWindow PMenu
+hi! link PopupNotification Todo
+if &background ==# 'dark'
+ if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#af5f5f', '#5faf5f', '#af875f', '#5f87af', '#d787d7', '#5fafaf', '#c6c6c6', '#767676', '#ff5f5f', '#5fd75f', '#ffd787', '#5fafff', '#ff87ff', '#5fd7d7', '#ffffff']
+ endif
+ hi Normal guifg=#c6c6c6 guibg=#000000 gui=NONE cterm=NONE
+ hi Statusline guifg=#c6c6c6 guibg=#000000 gui=bold,reverse cterm=bold,reverse
+ hi StatuslineNC guifg=#767676 guibg=#000000 gui=reverse cterm=reverse
+ hi VertSplit guifg=#767676 guibg=#767676 gui=NONE cterm=NONE
+ hi TabLine guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+ hi TabLineFill guifg=NONE guibg=#767676 gui=NONE cterm=NONE
+ hi TabLineSel guifg=#ffffff guibg=#000000 gui=bold cterm=bold
+ hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+ hi QuickFixLine guifg=#000000 guibg=#5fafff gui=NONE cterm=NONE
+ hi CursorLineNr guifg=#ffffff guibg=NONE gui=bold cterm=bold
+ hi LineNr guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+ hi NonText guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+ hi FoldColumn guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+ hi EndOfBuffer guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+ hi SpecialKey guifg=#585858 guibg=NONE gui=NONE cterm=NONE
+ hi Pmenu guifg=NONE guibg=#1c1c1c gui=NONE cterm=NONE
+ hi PmenuSel guifg=NONE guibg=#444444 gui=NONE cterm=NONE
+ hi PmenuThumb guifg=NONE guibg=#c6c6c6 gui=NONE cterm=NONE
+ hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error guifg=#ffffff guibg=#ff5f5f gui=NONE cterm=NONE
+ hi ErrorMsg guifg=#ffffff guibg=#ff5f5f gui=NONE cterm=NONE
+ hi ModeMsg guifg=#ffd787 guibg=NONE gui=reverse cterm=reverse
+ hi MoreMsg guifg=#5fd75f guibg=NONE gui=NONE cterm=NONE
+ hi Question guifg=#ff87ff guibg=NONE gui=NONE cterm=NONE
+ hi WarningMsg guifg=#ff5f5f guibg=NONE gui=NONE cterm=NONE
+ hi Todo guifg=#5fd7d7 guibg=#000000 gui=reverse cterm=reverse
+ hi Search guifg=#000000 guibg=#ffd787 gui=NONE cterm=NONE
+ hi IncSearch guifg=#000000 guibg=#5fd75f gui=NONE cterm=NONE
+ hi CurSearch guifg=#000000 guibg=#5fd75f gui=NONE cterm=NONE
+ hi WildMenu guifg=#000000 guibg=#ffd787 gui=bold cterm=bold
+ hi debugPC guifg=#5f87af guibg=NONE gui=reverse cterm=reverse
+ hi debugBreakpoint guifg=#5fafaf guibg=NONE gui=reverse cterm=reverse
+ hi Cursor guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi lCursor guifg=#ff5fff guibg=#000000 gui=reverse cterm=reverse
+ hi Visual guifg=#ffffff guibg=#005f87 gui=NONE cterm=NONE
+ hi MatchParen guifg=#c5e7c5 guibg=#000000 gui=reverse cterm=reverse
+ hi VisualNOS guifg=#000000 guibg=#5fafaf gui=NONE cterm=NONE
+ hi CursorLine guifg=NONE guibg=#262626 gui=NONE cterm=NONE
+ hi CursorColumn guifg=NONE guibg=#262626 gui=NONE cterm=NONE
+ hi Folded guifg=#767676 guibg=#1c1c1c gui=NONE cterm=NONE
+ hi ColorColumn guifg=NONE guibg=#1c1c1c gui=NONE cterm=NONE
+ hi SpellBad guifg=NONE guibg=NONE guisp=#ff5f5f gui=undercurl ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellCap guifg=NONE guibg=NONE guisp=#5fafaf gui=undercurl ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellLocal guifg=NONE guibg=NONE guisp=#5faf5f gui=undercurl ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellRare guifg=NONE guibg=NONE guisp=#ff87ff gui=undercurl ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Comment guifg=#5fafff guibg=NONE gui=NONE cterm=NONE
+ hi Constant guifg=#ff87ff guibg=NONE gui=NONE cterm=NONE
+ hi String guifg=#ffd787 guibg=NONE gui=NONE cterm=NONE
+ hi Identifier guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement guifg=#e4e4e4 guibg=NONE gui=bold cterm=bold
+ hi Type guifg=#5fd75f guibg=NONE gui=NONE cterm=NONE
+ hi PreProc guifg=#5fd7d7 guibg=NONE gui=NONE cterm=NONE
+ hi Special guifg=#5fafaf guibg=NONE gui=NONE cterm=NONE
+ hi Underlined guifg=NONE guibg=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Directory guifg=#5fafff guibg=NONE gui=bold cterm=bold
+ hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi DiffAdd guifg=#000000 guibg=#af87af gui=NONE cterm=NONE
+ hi DiffChange guifg=#000000 guibg=#d0d0d0 gui=NONE cterm=NONE
+ hi DiffText guifg=#000000 guibg=#5fd7d7 gui=NONE cterm=NONE
+ hi DiffDelete guifg=#d78787 guibg=NONE gui=NONE cterm=NONE
+ hi diffAdded guifg=#5fd75f guibg=NONE gui=NONE cterm=NONE
+ hi diffRemoved guifg=#d78787 guibg=NONE gui=NONE cterm=NONE
+ hi diffSubname guifg=#ff87ff guibg=NONE gui=NONE cterm=NONE
+ hi dirType guifg=#d787d7 guibg=NONE gui=NONE cterm=NONE
+ hi dirPermissionUser guifg=#5faf5f guibg=NONE gui=NONE cterm=NONE
+ hi dirPermissionGroup guifg=#af875f guibg=NONE gui=NONE cterm=NONE
+ hi dirPermissionOther guifg=#5fafaf guibg=NONE gui=NONE cterm=NONE
+ hi dirOwner guifg=#767676 guibg=NONE gui=NONE cterm=NONE
+ hi dirGroup guifg=#767676 guibg=NONE gui=NONE cterm=NONE
+ hi dirTime guifg=#767676 guibg=NONE gui=NONE cterm=NONE
+ hi dirSize guifg=#ffd787 guibg=NONE gui=NONE cterm=NONE
+ hi dirSizeMod guifg=#d787d7 guibg=NONE gui=NONE cterm=NONE
+ hi FilterMenuDirectorySubtle guifg=#878787 guibg=NONE gui=NONE cterm=NONE
+ hi dirFilterMenuBookmarkPath guifg=#878787 guibg=NONE gui=NONE cterm=NONE
+ hi dirFilterMenuHistoryPath guifg=#878787 guibg=NONE gui=NONE cterm=NONE
+ hi FilterMenuLineNr guifg=#878787 guibg=NONE gui=NONE cterm=NONE
+ hi CocSearch guifg=#ffd787 guibg=NONE gui=NONE cterm=NONE
+else
+ " Light background
+ if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#af0000', '#008700', '#af5f00', '#005fd7', '#af00af', '#005f5f', '#808080', '#767676', '#d70000', '#87d787', '#ffd787', '#0087d7', '#ff00ff', '#008787', '#ffffff']
+ endif
+ hi Normal guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+ hi Statusline guifg=#ffffff guibg=#000000 gui=bold cterm=bold
+ hi StatuslineNC guifg=#ffffff guibg=#767676 gui=NONE cterm=NONE
+ hi VertSplit guifg=#767676 guibg=#767676 gui=NONE cterm=NONE
+ hi TabLine guifg=#000000 guibg=#bcbcbc gui=NONE cterm=NONE
+ hi TabLineFill guifg=NONE guibg=#767676 gui=NONE cterm=NONE
+ hi TabLineSel guifg=#ffffff guibg=#000000 gui=bold,reverse cterm=bold,reverse
+ hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE
+ hi QuickFixLine guifg=#ffffff guibg=#0087d7 gui=NONE cterm=NONE
+ hi CursorLineNr guifg=#000000 guibg=NONE gui=bold cterm=bold
+ hi LineNr guifg=#9e9e9e guibg=NONE gui=NONE cterm=NONE
+ hi NonText guifg=#9e9e9e guibg=NONE gui=NONE cterm=NONE
+ hi FoldColumn guifg=#9e9e9e guibg=NONE gui=NONE cterm=NONE
+ hi EndOfBuffer guifg=#9e9e9e guibg=NONE gui=NONE cterm=NONE
+ hi SpecialKey guifg=#9e9e9e guibg=NONE gui=NONE cterm=NONE
+ hi Pmenu guifg=NONE guibg=#eeeeee gui=NONE cterm=NONE
+ hi PmenuSel guifg=NONE guibg=#c6c6c6 gui=NONE cterm=NONE
+ hi PmenuThumb guifg=NONE guibg=#767676 gui=NONE cterm=NONE
+ hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error guifg=#ffffff guibg=#d70000 gui=NONE cterm=NONE
+ hi ErrorMsg guifg=#ffffff guibg=#d70000 gui=NONE cterm=NONE
+ hi ModeMsg guifg=#ffd787 guibg=#000000 gui=reverse cterm=reverse
+ hi MoreMsg guifg=#008700 guibg=NONE gui=bold cterm=bold
+ hi Question guifg=#af00af guibg=NONE gui=bold cterm=bold
+ hi WarningMsg guifg=#d70000 guibg=NONE gui=bold cterm=bold
+ hi Todo guifg=#008787 guibg=#ffffff gui=reverse cterm=reverse
+ hi Search guifg=#000000 guibg=#ffd787 gui=NONE cterm=NONE
+ hi IncSearch guifg=#000000 guibg=#87d787 gui=NONE cterm=NONE
+ hi CurSearch guifg=#000000 guibg=#87d787 gui=NONE cterm=NONE
+ hi WildMenu guifg=#000000 guibg=#ffd787 gui=bold cterm=bold
+ hi debugPC guifg=#005fd7 guibg=NONE gui=reverse cterm=reverse
+ hi debugBreakpoint guifg=#005f5f guibg=NONE gui=reverse cterm=reverse
+ hi Cursor guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi lCursor guifg=#ff00ff guibg=#000000 gui=reverse cterm=reverse
+ hi Visual guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+ hi MatchParen guifg=NONE guibg=#c5e7c5 gui=NONE cterm=NONE
+ hi VisualNOS guifg=#ffffff guibg=#008787 gui=NONE cterm=NONE
+ hi CursorLine guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE
+ hi CursorColumn guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE
+ hi Folded guifg=#767676 guibg=#eeeeee gui=NONE cterm=NONE
+ hi ColorColumn guifg=NONE guibg=#eeeeee gui=NONE cterm=NONE
+ hi SpellBad guifg=NONE guibg=NONE guisp=#af0000 gui=undercurl ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellCap guifg=NONE guibg=NONE guisp=#005f5f gui=undercurl ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellLocal guifg=NONE guibg=NONE guisp=#008700 gui=undercurl ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SpellRare guifg=NONE guibg=NONE guisp=#ff00ff gui=undercurl ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Comment guifg=#005fd7 guibg=NONE gui=NONE cterm=NONE
+ hi Constant guifg=#af00af guibg=NONE gui=NONE cterm=NONE
+ hi String guifg=#af5f00 guibg=NONE gui=NONE cterm=NONE
+ hi Identifier guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement guifg=#000000 guibg=NONE gui=bold cterm=bold
+ hi Type guifg=#008700 guibg=NONE gui=NONE cterm=NONE
+ hi PreProc guifg=#005f5f guibg=NONE gui=NONE cterm=NONE
+ hi Special guifg=#008787 guibg=NONE gui=NONE cterm=NONE
+ hi Underlined guifg=NONE guibg=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Directory guifg=#005fd7 guibg=NONE gui=bold cterm=bold
+ hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi DiffAdd guifg=#000000 guibg=#d7afd7 gui=NONE cterm=NONE
+ hi DiffChange guifg=#000000 guibg=#d0d0d0 gui=NONE cterm=NONE
+ hi DiffText guifg=#000000 guibg=#5fd7d7 gui=NONE cterm=NONE
+ hi DiffDelete guifg=#870000 guibg=NONE gui=NONE cterm=NONE
+ hi diffAdded guifg=#008700 guibg=NONE gui=NONE cterm=NONE
+ hi diffRemoved guifg=#d70000 guibg=NONE gui=NONE cterm=NONE
+ hi diffSubname guifg=#af00af guibg=NONE gui=NONE cterm=NONE
+ hi dirType guifg=#005f5f guibg=NONE gui=NONE cterm=NONE
+ hi dirPermissionUser guifg=#af5f00 guibg=NONE gui=NONE cterm=NONE
+ hi dirPermissionGroup guifg=#008700 guibg=NONE gui=NONE cterm=NONE
+ hi dirPermissionOther guifg=#af00af guibg=NONE gui=NONE cterm=NONE
+ hi dirOwner guifg=#808080 guibg=NONE gui=NONE cterm=NONE
+ hi dirGroup guifg=#808080 guibg=NONE gui=NONE cterm=NONE
+ hi dirTime guifg=#808080 guibg=NONE gui=NONE cterm=NONE
+ hi dirSize guifg=#af0000 guibg=NONE gui=NONE cterm=NONE
+ hi dirSizeMod guifg=#005f5f guibg=NONE gui=NONE cterm=NONE
+ hi dirLink guifg=#008700 guibg=NONE gui=bold cterm=bold
+ hi dirFilterMenuBookmarkPath guifg=#626262 guibg=NONE gui=NONE cterm=NONE
+ hi dirFilterMenuHistoryPath guifg=#626262 guibg=NONE gui=NONE cterm=NONE
+ hi FilterMenuDirectorySubtle guifg=#626262 guibg=NONE gui=NONE cterm=NONE
+ hi FilterMenuLineNr guifg=#626262 guibg=NONE gui=NONE cterm=NONE
+ hi CocSearch guifg=#af0000 guibg=NONE gui=NONE cterm=NONE
+endif
+
+if s:t_Co >= 256
+ hi! link helpVim Title
+ hi! link helpHeader Title
+ hi! link helpHyperTextJump Underlined
+ hi! link fugitiveSymbolicRef PreProc
+ hi! link fugitiveHeading Statement
+ hi! link fugitiveStagedHeading Statement
+ hi! link fugitiveUnstagedHeading Statement
+ hi! link fugitiveUntrackedHeading Statement
+ hi! link fugitiveStagedModifier PreProc
+ hi! link fugitiveUnstagedModifier PreProc
+ hi! link fugitiveHash Constant
+ hi! link diffFile PreProc
+ hi! link markdownHeadingDelimiter Special
+ hi! link rstSectionDelimiter Statement
+ hi! link rstDirective PreProc
+ hi! link rstHyperlinkReference Special
+ hi! link rstFieldName Constant
+ hi! link rstDelimiter Special
+ hi! link rstInterpretedText Special
+ hi! link rstCodeBlock Normal
+ hi! link rstLiteralBlock rstCodeBlock
+ hi! link markdownUrl String
+ hi! link colortemplateKey Statement
+ hi! link xmlTagName Statement
+ hi! link javaScriptFunction Statement
+ hi! link javaScriptIdentifier Statement
+ hi! link sqlKeyword Statement
+ hi! link yamlBlockMappingKey Statement
+ hi! link rubyMacro Statement
+ hi! link rubyDefine Statement
+ hi! link vimGroup Normal
+ hi! link vimVar Normal
+ hi! link vimOper Normal
+ hi! link vimSep Normal
+ hi! link vimParenSep Normal
+ hi! link vimOption Normal
+ hi! link vimCommentString Comment
+ hi! link pythonInclude Statement
+ hi! link elixirOperator Statement
+ hi! link elixirKeyword Statement
+ hi! link elixirBlockDefinition Statement
+ hi! link elixirDefine Statement
+ hi! link elixirPrivateDefine Statement
+ hi! link elixirGuard Statement
+ hi! link elixirPrivateGuard Statement
+ hi! link elixirModuleDefine Statement
+ hi! link elixirProtocolDefine Statement
+ hi! link elixirImplDefine Statement
+ hi! link elixirRecordDefine Statement
+ hi! link elixirPrivateRecordDefine Statement
+ hi! link elixirMacroDefine Statement
+ hi! link elixirPrivateMacroDefine Statement
+ hi! link elixirDelegateDefine Statement
+ hi! link elixirOverridableDefine Statement
+ hi! link elixirExceptionDefine Statement
+ hi! link elixirCallbackDefine Statement
+ hi! link elixirStructDefine Statement
+ hi! link elixirExUnitMacro Statement
+ hi! link elixirInclude Statement
+ hi! link elixirVariable Special
+ hi! link elixirAtom Constant
+ hi! link elixirDocTest String
+ hi! link shQuote Constant
+ hi! link shNoQuote Normal
+ hi! link shTestOpr Normal
+ hi! link shOperator Normal
+ hi! link shSetOption Normal
+ hi! link shOption Normal
+ hi! link shCommandSub Normal
+ hi! link shDerefPattern shQuote
+ hi! link shDerefOp Special
+ hi! link phpStorageClass Statement
+ hi! link phpStructure Statement
+ hi! link phpInclude Statement
+ hi! link phpDefine Statement
+ hi! link phpSpecialFunction Normal
+ hi! link phpParent Normal
+ hi! link phpComparison Normal
+ hi! link phpOperator Normal
+ hi! link phpVarSelector Special
+ hi! link phpMemberSelector Special
+ hi! link phpDocCustomTags phpDocTags
+ hi! link javaExternal Statement
+ hi! link javaType Statement
+ hi! link javaScopeDecl Statement
+ hi! link javaClassDecl Statement
+ hi! link javaStorageClass Statement
+ hi! link javaDocParam PreProc
+ hi! link csStorage Statement
+ hi! link csAccessModifier Statement
+ hi! link csClass Statement
+ hi! link csModifier Statement
+ hi! link csAsyncModifier Statement
+ hi! link csLogicSymbols Normal
+ hi! link csClassType Normal
+ hi! link csType Statement
+ hi! link Terminal Normal
+ hi! link StatuslineTerm Statusline
+ hi! link StatuslineTermNC StatuslineNC
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link MessageWindow PMenu
+ hi! link PopupNotification Todo
+ if &background ==# 'dark'
+ hi Normal ctermfg=251 ctermbg=16 cterm=NONE
+ hi Statusline ctermfg=251 ctermbg=16 cterm=bold,reverse
+ hi StatuslineNC ctermfg=243 ctermbg=16 cterm=reverse
+ hi VertSplit ctermfg=243 ctermbg=243 cterm=NONE
+ hi TabLine ctermfg=16 ctermbg=251 cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=243 cterm=NONE
+ hi TabLineSel ctermfg=231 ctermbg=16 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=16 ctermbg=231 cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=75 cterm=NONE
+ hi CursorLineNr ctermfg=231 ctermbg=NONE cterm=bold
+ hi LineNr ctermfg=240 ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=240 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=240 ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=240 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=240 ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=234 cterm=NONE
+ hi PmenuSel ctermfg=NONE ctermbg=238 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=251 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=231 ctermbg=203 cterm=NONE
+ hi ErrorMsg ctermfg=231 ctermbg=203 cterm=NONE
+ hi ModeMsg ctermfg=222 ctermbg=NONE cterm=reverse
+ hi MoreMsg ctermfg=77 ctermbg=NONE cterm=NONE
+ hi Question ctermfg=213 ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=203 ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=116 ctermbg=16 cterm=reverse
+ hi Search ctermfg=16 ctermbg=222 cterm=NONE
+ hi IncSearch ctermfg=16 ctermbg=77 cterm=NONE
+ hi CurSearch ctermfg=16 ctermbg=77 cterm=NONE
+ hi WildMenu ctermfg=16 ctermbg=222 cterm=bold
+ hi debugPC ctermfg=67 ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=73 ctermbg=NONE cterm=reverse
+ hi Visual ctermfg=231 ctermbg=24 cterm=NONE
+ hi MatchParen ctermfg=30 ctermbg=16 cterm=reverse
+ hi VisualNOS ctermfg=16 ctermbg=73 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=235 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=235 cterm=NONE
+ hi Folded ctermfg=243 ctermbg=234 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=234 cterm=NONE
+ hi SpellBad ctermfg=203 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=73 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=77 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=213 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=75 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=213 ctermbg=NONE cterm=NONE
+ hi String ctermfg=222 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=254 ctermbg=NONE cterm=bold
+ hi Type ctermfg=77 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=116 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=73 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Directory ctermfg=75 ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi DiffAdd ctermfg=16 ctermbg=139 cterm=NONE
+ hi DiffChange ctermfg=16 ctermbg=252 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=80 cterm=NONE
+ hi DiffDelete ctermfg=174 ctermbg=NONE cterm=NONE
+ hi diffAdded ctermfg=77 ctermbg=NONE cterm=NONE
+ hi diffRemoved ctermfg=174 ctermbg=NONE cterm=NONE
+ hi diffSubname ctermfg=213 ctermbg=NONE cterm=NONE
+ hi dirType ctermfg=176 ctermbg=NONE cterm=NONE
+ hi dirPermissionUser ctermfg=71 ctermbg=NONE cterm=NONE
+ hi dirPermissionGroup ctermfg=137 ctermbg=NONE cterm=NONE
+ hi dirPermissionOther ctermfg=73 ctermbg=NONE cterm=NONE
+ hi dirOwner ctermfg=243 ctermbg=NONE cterm=NONE
+ hi dirGroup ctermfg=243 ctermbg=NONE cterm=NONE
+ hi dirTime ctermfg=243 ctermbg=NONE cterm=NONE
+ hi dirSize ctermfg=222 ctermbg=NONE cterm=NONE
+ hi dirSizeMod ctermfg=176 ctermbg=NONE cterm=NONE
+ hi FilterMenuDirectorySubtle ctermfg=102 ctermbg=NONE cterm=NONE
+ hi dirFilterMenuBookmarkPath ctermfg=102 ctermbg=NONE cterm=NONE
+ hi dirFilterMenuHistoryPath ctermfg=102 ctermbg=NONE cterm=NONE
+ hi FilterMenuLineNr ctermfg=102 ctermbg=NONE cterm=NONE
+ hi CocSearch ctermfg=222 ctermbg=NONE cterm=NONE
+ else
+ " Light background
+ hi Normal ctermfg=16 ctermbg=231 cterm=NONE
+ hi Statusline ctermfg=231 ctermbg=16 cterm=bold
+ hi StatuslineNC ctermfg=231 ctermbg=243 cterm=NONE
+ hi VertSplit ctermfg=243 ctermbg=243 cterm=NONE
+ hi TabLine ctermfg=16 ctermbg=250 cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=243 cterm=NONE
+ hi TabLineSel ctermfg=231 ctermbg=16 cterm=bold,reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=231 ctermbg=16 cterm=NONE
+ hi QuickFixLine ctermfg=231 ctermbg=32 cterm=NONE
+ hi CursorLineNr ctermfg=16 ctermbg=NONE cterm=bold
+ hi LineNr ctermfg=247 ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=247 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=247 ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=247 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=247 ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=255 cterm=NONE
+ hi PmenuSel ctermfg=NONE ctermbg=251 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=243 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=231 ctermbg=160 cterm=NONE
+ hi ErrorMsg ctermfg=231 ctermbg=160 cterm=NONE
+ hi ModeMsg ctermfg=222 ctermbg=16 cterm=reverse
+ hi MoreMsg ctermfg=28 ctermbg=NONE cterm=bold
+ hi Question ctermfg=127 ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=160 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=30 ctermbg=231 cterm=reverse
+ hi Search ctermfg=16 ctermbg=222 cterm=NONE
+ hi IncSearch ctermfg=16 ctermbg=114 cterm=NONE
+ hi CurSearch ctermfg=16 ctermbg=114 cterm=NONE
+ hi WildMenu ctermfg=16 ctermbg=222 cterm=bold
+ hi debugPC ctermfg=26 ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=23 ctermbg=NONE cterm=reverse
+ hi Visual ctermfg=231 ctermbg=67 cterm=NONE
+ hi MatchParen ctermfg=30 ctermbg=231 cterm=reverse
+ hi VisualNOS ctermfg=231 ctermbg=30 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=254 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=254 cterm=NONE
+ hi Folded ctermfg=243 ctermbg=255 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=255 cterm=NONE
+ hi SpellBad ctermfg=124 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=23 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=28 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=133 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=26 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=127 ctermbg=NONE cterm=NONE
+ hi String ctermfg=130 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=16 ctermbg=NONE cterm=bold
+ hi Type ctermfg=28 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=23 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=30 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Directory ctermfg=26 ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi DiffAdd ctermfg=16 ctermbg=182 cterm=NONE
+ hi DiffChange ctermfg=16 ctermbg=252 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=80 cterm=NONE
+ hi DiffDelete ctermfg=88 ctermbg=NONE cterm=NONE
+ hi diffAdded ctermfg=28 ctermbg=NONE cterm=NONE
+ hi diffRemoved ctermfg=160 ctermbg=NONE cterm=NONE
+ hi diffSubname ctermfg=127 ctermbg=NONE cterm=NONE
+ hi dirType ctermfg=23 ctermbg=NONE cterm=NONE
+ hi dirPermissionUser ctermfg=130 ctermbg=NONE cterm=NONE
+ hi dirPermissionGroup ctermfg=28 ctermbg=NONE cterm=NONE
+ hi dirPermissionOther ctermfg=127 ctermbg=NONE cterm=NONE
+ hi dirOwner ctermfg=244 ctermbg=NONE cterm=NONE
+ hi dirGroup ctermfg=244 ctermbg=NONE cterm=NONE
+ hi dirTime ctermfg=244 ctermbg=NONE cterm=NONE
+ hi dirSize ctermfg=124 ctermbg=NONE cterm=NONE
+ hi dirSizeMod ctermfg=23 ctermbg=NONE cterm=NONE
+ hi dirLink ctermfg=28 ctermbg=NONE cterm=bold
+ hi dirFilterMenuBookmarkPath ctermfg=241 ctermbg=NONE cterm=NONE
+ hi dirFilterMenuHistoryPath ctermfg=241 ctermbg=NONE cterm=NONE
+ hi FilterMenuDirectorySubtle ctermfg=241 ctermbg=NONE cterm=NONE
+ hi FilterMenuLineNr ctermfg=241 ctermbg=NONE cterm=NONE
+ hi CocSearch ctermfg=124 ctermbg=NONE cterm=NONE
+ endif
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ if &background ==# 'dark'
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi Statusline ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi StatuslineNC ctermfg=darkgrey ctermbg=black cterm=reverse
+ hi VertSplit ctermfg=darkgrey ctermbg=darkgrey cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi TabLineSel ctermfg=white ctermbg=black cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=white cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=blue cterm=NONE
+ hi CursorLineNr ctermfg=white ctermbg=NONE cterm=bold
+ hi LineNr ctermfg=grey ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=grey ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=grey ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=grey ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=black ctermbg=darkgrey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=white ctermbg=red cterm=NONE
+ hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE
+ hi ModeMsg ctermfg=yellow ctermbg=NONE cterm=reverse
+ hi MoreMsg ctermfg=green ctermbg=NONE cterm=NONE
+ hi Question ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=cyan ctermbg=black cterm=reverse
+ hi Search ctermfg=black ctermbg=yellow cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=green cterm=NONE
+ hi CurSearch ctermfg=black ctermbg=green cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=bold
+ hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi Visual ctermfg=white ctermbg=darkblue cterm=NONE
+ hi MatchParen ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi VisualNOS ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=black ctermbg=yellow cterm=NONE
+ hi Folded ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=green ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline
+ hi Comment ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi String ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=grey ctermbg=NONE cterm=bold
+ hi Type ctermfg=green ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Directory ctermfg=blue ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi DiffAdd ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi DiffChange ctermfg=black ctermbg=lightgray cterm=NONE
+ hi DiffText ctermfg=black ctermbg=cyan cterm=NONE
+ hi DiffDelete ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi diffAdded ctermfg=green ctermbg=NONE cterm=NONE
+ hi diffRemoved ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi diffSubname ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi dirType ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi dirPermissionUser ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi dirPermissionGroup ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi dirPermissionOther ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi dirOwner ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi dirGroup ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi dirTime ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi dirSize ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi dirSizeMod ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi FilterMenuDirectorySubtle ctermfg=grey ctermbg=NONE cterm=NONE
+ hi dirFilterMenuBookmarkPath ctermfg=grey ctermbg=NONE cterm=NONE
+ hi dirFilterMenuHistoryPath ctermfg=grey ctermbg=NONE cterm=NONE
+ hi FilterMenuLineNr ctermfg=grey ctermbg=NONE cterm=NONE
+ hi CocSearch ctermfg=yellow ctermbg=NONE cterm=NONE
+ else
+ " Light background
+ hi Normal ctermfg=black ctermbg=white cterm=NONE
+ hi Statusline ctermfg=white ctermbg=black cterm=bold
+ hi StatuslineNC ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi VertSplit ctermfg=darkgrey ctermbg=darkgrey cterm=NONE
+ hi TabLine ctermfg=black ctermbg=lightgrey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi TabLineSel ctermfg=white ctermbg=black cterm=bold,reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=white ctermbg=black cterm=NONE
+ hi QuickFixLine ctermfg=white ctermbg=blue cterm=NONE
+ hi CursorLineNr ctermfg=black ctermbg=NONE cterm=bold
+ hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=black ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=white ctermbg=red cterm=NONE
+ hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE
+ hi ModeMsg ctermfg=yellow ctermbg=black cterm=reverse
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Question ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=bold
+ hi Todo ctermfg=cyan ctermbg=white cterm=reverse
+ hi Search ctermfg=black ctermbg=yellow cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=green cterm=NONE
+ hi CurSearch ctermfg=black ctermbg=green cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=bold
+ hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi Visual ctermfg=white ctermbg=darkblue cterm=NONE
+ hi MatchParen ctermfg=darkcyan ctermbg=white cterm=reverse
+ hi VisualNOS ctermfg=black ctermbg=cyan cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=black ctermbg=yellow cterm=NONE
+ hi Folded ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkgreen ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline
+ hi Comment ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi String ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=black ctermbg=NONE cterm=bold
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Special ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Directory ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi DiffAdd ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi DiffChange ctermfg=black ctermbg=lightgray cterm=NONE
+ hi DiffText ctermfg=black ctermbg=cyan cterm=NONE
+ hi DiffDelete ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi diffAdded ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi diffRemoved ctermfg=red ctermbg=NONE cterm=NONE
+ hi diffSubname ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi dirType ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi dirPermissionUser ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi dirPermissionGroup ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi dirPermissionOther ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi dirOwner ctermfg=grey ctermbg=NONE cterm=NONE
+ hi dirGroup ctermfg=grey ctermbg=NONE cterm=NONE
+ hi dirTime ctermfg=grey ctermbg=NONE cterm=NONE
+ hi dirSize ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi dirSizeMod ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi dirLink ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi dirFilterMenuBookmarkPath ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi dirFilterMenuHistoryPath ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi FilterMenuDirectorySubtle ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi FilterMenuLineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi CocSearch ctermfg=darkred ctermbg=NONE cterm=NONE
+ endif
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ if &background ==# 'dark'
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi Statusline ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi StatuslineNC ctermfg=black ctermbg=grey cterm=NONE
+ hi VertSplit ctermfg=grey ctermbg=grey cterm=NONE
+ hi TabLine ctermfg=grey ctermbg=black cterm=reverse
+ hi TabLineFill ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLineSel ctermfg=grey ctermbg=black cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi QuickFixLine ctermfg=grey ctermbg=darkblue cterm=bold
+ hi CursorLineNr ctermfg=black ctermbg=NONE cterm=bold
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=black ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=black ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=black ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=black ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=grey cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkgreen cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ErrorMsg ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ModeMsg ctermfg=darkyellow ctermbg=black cterm=reverse
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Question ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi Search ctermfg=darkyellow ctermbg=black cterm=reverse
+ hi IncSearch ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi CurSearch ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=bold
+ hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi MatchParen ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi VisualNOS ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Folded ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=reverse,underline
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=reverse,underline
+ hi SpellLocal ctermfg=darkgreen ctermbg=black cterm=reverse,underline
+ hi SpellRare ctermfg=darkmagenta ctermbg=NONE cterm=reverse,underline
+ hi Comment ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=grey ctermbg=NONE cterm=bold
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Directory ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi DiffAdd ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi DiffChange ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=darkred ctermbg=NONE cterm=NONE
+ else
+ " Light background
+ hi Normal ctermfg=black ctermbg=grey cterm=NONE
+ hi Statusline ctermfg=grey ctermbg=black cterm=bold
+ hi StatuslineNC ctermfg=grey ctermbg=darkgrey cterm=NONE
+ hi VertSplit ctermfg=black ctermbg=black cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=reverse
+ hi TabLineFill ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi TabLineSel ctermfg=black ctermbg=grey cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold
+ hi QuickFixLine ctermfg=grey ctermbg=darkblue cterm=bold
+ hi CursorLineNr ctermfg=black ctermbg=NONE cterm=bold
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=black ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=black ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=black ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=black ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkgreen cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ErrorMsg ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ModeMsg ctermfg=darkyellow ctermbg=black cterm=reverse
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Question ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi Search ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi CurSearch ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=bold
+ hi debugPC ctermfg=darkblue ctermbg=NONE cterm=reverse
+ hi debugBreakpoint ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi MatchParen ctermfg=darkcyan ctermbg=grey cterm=reverse
+ hi VisualNOS ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Folded ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=reverse,underline
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=reverse,underline
+ hi SpellLocal ctermfg=darkgreen ctermbg=black cterm=reverse,underline
+ hi SpellRare ctermfg=darkmagenta ctermbg=NONE cterm=reverse,underline
+ hi Comment ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=black ctermbg=NONE cterm=bold
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Title ctermfg=black ctermbg=NONE cterm=bold
+ hi Directory ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi DiffAdd ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi DiffChange ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi DiffText ctermfg=grey ctermbg=black cterm=NONE
+ hi DiffDelete ctermfg=darkred ctermbg=NONE cterm=NONE
+ endif
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: any
+" Background: dark
+" Color: color00 #000000 16 black
+" Color: color08 #767676 243 darkgrey
+" Color: color01 #AF5F5F 131 darkred
+" Color: color09 #FF5F5F 203 red
+" Color: color02 #5FAF5F 71 darkgreen
+" Color: color10 #5FD75F 77 green
+" Color: color03 #AF875F 137 darkyellow
+" Color: color11 #FFD787 222 yellow
+" Color: color04 #5F87AF 67 darkblue
+" Color: color12 #5FAFFF 75 blue
+" Color: color05 #D787D7 176 darkmagenta
+" Color: color13 #FF87FF 213 magenta
+" Color: color06 #5FAFAF 73 darkcyan
+" Color: color14 #5FD7D7 116 cyan
+" Color: color07 #C6C6C6 251 grey
+" Color: color15 #FFFFFF 231 white
+" Color: colorDimWhite #E4E4E4 254 grey
+" Color: colorLine #262626 235 darkgrey
+" Color: colorB #1C1C1C 234 darkgrey
+" Color: colorNonT #585858 240 grey
+" Color: colorTab #585858 240 grey
+" Color: colorC #FFFFFF 231 white
+" Color: colorlC #FF5FFF 207 magenta
+" Color: colorV #005F87 24 darkblue
+" Color: colorMP #C5E7C5 30 darkcyan
+" Color: colorPMenuSel #444444 238 darkcyan
+" Color: colorDim #878787 102 grey
+" Color: diffAdd #AF87AF 139 darkmagenta
+" Color: diffDelete #D78787 174 darkred
+" Color: diffChange #D0D0D0 252 lightgray
+" Color: diffText #5FD7D7 80 cyan
+" Color: fgDiff #000000 16 black
+" Term colors: color00 color01 color02 color03 color04 color05 color06 color07
+" Term colors: color08 color09 color10 color11 color12 color13 color14 color15
+" Background: light
+" Color: color00 #000000 16 black
+" Color: color08 #767676 243 darkgrey
+" Color: color01 #AF0000 124 darkred
+" Color: color09 #D70000 160 red
+" Color: color02 #008700 28 darkgreen
+" Color: color10 #87D787 114 green
+" Color: color03 #AF5F00 130 darkyellow
+" Color: color11 #FFD787 222 yellow
+" Color: color04 #005FD7 26 darkblue
+" Color: color12 #0087D7 32 blue
+" Color: color05 #AF00AF 127 darkmagenta
+" Color: color13 #FF00FF 133 magenta
+" Color: color06 #005F5F 23 darkcyan
+" Color: color14 #008787 30 cyan
+" Color: color07 #808080 244 grey
+" Color: color15 #FFFFFF 231 white
+" Color: colorLine #E4E4E4 254 grey
+" Color: colorB #EEEEEE 255 grey
+" Color: colorNonT #9E9E9E 247 darkgrey
+" Color: colorTab #BCBCBC 250 lightgrey
+" Color: colorC #000000 16 black
+" Color: colorlC #FF00FF 201 magenta
+" Color: colorV #5F87AF 67 darkblue
+" Color: colorMP #C5E7C5 30 darkcyan
+" Color: colorPMenuSel #C6C6C6 251 darkcyan
+" Color: colorDim #626262 241 darkgrey
+" Color: diffAdd #D7AFD7 182 darkmagenta
+" Color: diffDelete #870000 88 darkred
+" Color: diffChange #D0D0D0 252 lightgray
+" Color: diffText #5FD7D7 80 cyan
+" Color: fgDiff #000000 16 black
+" Term colors: color00 color01 color02 color03 color04 color05 color06 color07
+" Term colors: color08 color09 color10 color11 color12 color13 color14 color15
+" Background: any
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/morning.vim b/runtime/colors/morning.vim
new file mode 100644
index 0000000..f1ac73f
--- /dev/null
+++ b/runtime/colors/morning.vim
@@ -0,0 +1,403 @@
+" Name: morning
+" Description: Colorscheme with light grey background.
+" Author: Original author Bram Moolenaar <Bram@vim.org>
+" Maintainer: Original maintainer Bram Moolenaar <Bram@vim.org>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:46:24 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=light
+
+hi clear
+let g:colors_name = 'morning'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#e4e4e4', '#a52a2a', '#ff00ff', '#6a0dad', '#008787', '#2e8b57', '#6a5acd', '#bcbcbc', '#0000ff', '#a52a2a', '#ff00ff', '#6a0dad', '#008787', '#2e8b57', '#6a5acd', '#000000']
+endif
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link StatuslineTerm Statusline
+hi! link StatuslineTermNC StatuslineNC
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#000000 guibg=#e4e4e4 gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#0000ff guibg=#cccccc gui=bold cterm=bold
+hi Folded guifg=#00008b guibg=#d3d3d3 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#d3d3d3 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#d3d3d3 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#a52a2a guibg=NONE gui=bold cterm=bold
+hi QuickFixLine guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi StatusLine guifg=#eeeeee guibg=#000000 gui=bold cterm=bold
+hi StatusLineNC guifg=#bcbcbc guibg=#000000 gui=NONE cterm=NONE
+hi VertSplit guifg=#bcbcbc guibg=#000000 gui=NONE cterm=NONE
+hi Pmenu guifg=#000000 guibg=#b2b2b2 gui=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#000000 gui=NONE cterm=NONE
+hi TabLine guifg=#000000 guibg=#bcbcbc gui=underline cterm=underline
+hi TabLineFill guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+hi TabLineSel guifg=#000000 guibg=#e4e4e4 gui=bold cterm=bold
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi ToolbarButton guifg=NONE guibg=#bcbcbc gui=bold cterm=bold
+hi NonText guifg=#0000ff guibg=#bcbcbc gui=bold cterm=bold
+hi SpecialKey guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE
+hi Visual guifg=NONE guibg=#d0d0d0 gui=NONE cterm=NONE
+hi VisualNOS guifg=NONE guibg=#0000ff gui=NONE cterm=NONE
+hi LineNr guifg=#a52a2a guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#00008b guibg=NONE gui=NONE cterm=NONE
+hi SignColumn guifg=#00008b guibg=NONE gui=NONE cterm=NONE
+hi Underlined guifg=#6a5acd guibg=NONE gui=underline cterm=underline
+hi Error guifg=#ff0000 guibg=#e4e4e4 gui=reverse cterm=reverse
+hi ErrorMsg guifg=#ff0000 guibg=#e4e4e4 gui=reverse cterm=reverse
+hi WarningMsg guifg=#6a0dad guibg=NONE gui=bold cterm=bold
+hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=bold
+hi ModeMsg guifg=#000000 guibg=NONE gui=bold cterm=bold
+hi Question guifg=#008787 guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi MatchParen guifg=#e4e4e4 guibg=#6a5acd gui=NONE cterm=NONE
+hi Search guifg=#e4e4e4 guibg=#6a0dad gui=NONE cterm=NONE
+hi IncSearch guifg=#2e8b57 guibg=NONE gui=reverse cterm=reverse
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=bold cterm=bold
+hi ColorColumn guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+hi Cursor guifg=#e4e4e4 guibg=#2e8b57 gui=NONE cterm=NONE
+hi lCursor guifg=#e4e4e4 guibg=#a52a2a gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#00d700 guibg=NONE guisp=#00d700 gui=undercurl cterm=underline
+hi SpellLocal guifg=#a52a2a guibg=NONE guisp=#a52a2a gui=undercurl cterm=underline
+hi SpellRare guifg=#2e8b57 guibg=NONE guisp=#2e8b57 gui=undercurl cterm=underline
+hi Comment guifg=#0000ff guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#ff00ff guibg=#eeeeee gui=NONE cterm=NONE
+hi Identifier guifg=#008787 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#a52a2a guibg=NONE gui=bold cterm=bold
+hi PreProc guifg=#6a0dad guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#2e8b57 guibg=NONE gui=bold cterm=bold
+hi Special guifg=#6a5acd guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Directory guifg=#008787 guibg=NONE gui=bold cterm=bold
+hi Conceal guifg=#0000ff guibg=NONE gui=NONE cterm=NONE
+hi Title guifg=#a52a2a guibg=NONE gui=bold cterm=bold
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link StatuslineTerm Statusline
+ hi! link StatuslineTermNC StatuslineNC
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=16 ctermbg=254 cterm=NONE
+ hi EndOfBuffer ctermfg=21 ctermbg=252 cterm=bold
+ hi Folded ctermfg=18 ctermbg=252 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=252 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=252 cterm=NONE
+ hi CursorLineNr ctermfg=124 ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=16 ctermbg=226 cterm=NONE
+ hi StatusLine ctermfg=255 ctermbg=16 cterm=bold
+ hi StatusLineNC ctermfg=250 ctermbg=16 cterm=NONE
+ hi VertSplit ctermfg=250 ctermbg=16 cterm=NONE
+ hi Pmenu ctermfg=16 ctermbg=249 cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=254 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=16 cterm=NONE
+ hi TabLine ctermfg=16 ctermbg=250 cterm=underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=16 ctermbg=254 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=NONE ctermbg=250 cterm=bold
+ hi NonText ctermfg=21 ctermbg=250 cterm=bold
+ hi SpecialKey ctermfg=250 ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=252 cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=21 cterm=NONE
+ hi LineNr ctermfg=124 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=18 ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=18 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=62 ctermbg=NONE cterm=underline
+ hi Error ctermfg=196 ctermbg=254 cterm=reverse
+ hi ErrorMsg ctermfg=196 ctermbg=254 cterm=reverse
+ hi WarningMsg ctermfg=55 ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=29 ctermbg=NONE cterm=bold
+ hi ModeMsg ctermfg=16 ctermbg=NONE cterm=bold
+ hi Question ctermfg=30 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=16 ctermbg=226 cterm=NONE
+ hi MatchParen ctermfg=254 ctermbg=62 cterm=NONE
+ hi Search ctermfg=254 ctermbg=55 cterm=NONE
+ hi IncSearch ctermfg=29 ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=bold
+ hi ColorColumn ctermfg=16 ctermbg=231 cterm=NONE
+ hi Cursor ctermfg=254 ctermbg=29 cterm=NONE
+ hi lCursor ctermfg=254 ctermbg=124 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=40 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=124 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=29 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=21 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=201 ctermbg=255 cterm=NONE
+ hi Identifier ctermfg=30 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=124 ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=55 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=29 ctermbg=NONE cterm=bold
+ hi Special ctermfg=62 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=30 ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=21 ctermbg=NONE cterm=NONE
+ hi Title ctermfg=124 ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=black ctermbg=grey cterm=NONE
+ hi EndOfBuffer ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkred ctermbg=NONE cterm=underline
+ hi QuickFixLine ctermfg=black ctermbg=yellow cterm=NONE
+ hi StatusLine ctermfg=white ctermbg=black cterm=bold
+ hi StatusLineNC ctermfg=darkgrey ctermbg=black cterm=NONE
+ hi VertSplit ctermfg=darkgrey ctermbg=black cterm=NONE
+ hi Pmenu ctermfg=black ctermbg=white cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=grey cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=black cterm=NONE
+ hi TabLine ctermfg=black ctermbg=white cterm=underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=black ctermbg=grey cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=NONE ctermbg=white cterm=bold
+ hi NonText ctermfg=blue ctermbg=white cterm=bold
+ hi SpecialKey ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=white cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=blue cterm=NONE
+ hi LineNr ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi Error ctermfg=red ctermbg=grey cterm=reverse
+ hi ErrorMsg ctermfg=red ctermbg=grey cterm=reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi ModeMsg ctermfg=black ctermbg=NONE cterm=bold
+ hi Question ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Todo ctermfg=black ctermbg=yellow cterm=NONE
+ hi MatchParen ctermfg=grey ctermbg=darkblue cterm=NONE
+ hi Search ctermfg=grey ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=bold
+ hi ColorColumn ctermfg=black ctermbg=white cterm=NONE
+ hi Cursor ctermfg=grey ctermbg=darkgreen cterm=NONE
+ hi lCursor ctermfg=grey ctermbg=darkred cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkred ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkgreen ctermbg=NONE cterm=underline
+ hi Comment ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=magenta ctermbg=white cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkred ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Special ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkred ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=black ctermbg=gray cterm=NONE
+ hi EndOfBuffer ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi StatusLine ctermfg=black ctermbg=gray cterm=bold,reverse
+ hi StatusLineNC ctermfg=black ctermbg=gray cterm=reverse
+ hi VertSplit ctermfg=black ctermbg=gray cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkgreen cterm=NONE
+ hi TabLine ctermfg=gray ctermbg=black cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=black ctermbg=gray cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=gray cterm=bold,reverse
+ hi NonText ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi LineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Error ctermfg=darkred ctermbg=gray cterm=reverse
+ hi ErrorMsg ctermfg=darkred ctermbg=gray cterm=reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi MatchParen ctermfg=gray ctermbg=darkblue cterm=NONE
+ hi Search ctermfg=gray ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkred cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=reverse
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkmagenta ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi Comment ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkred ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkred ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: light
+" Color: comment #0000ff 21 blue
+" Color: constant #ff00ff 201 magenta
+" Color: identifier #008787 30 darkcyan
+" Color: statement #a52a2a 124 darkred
+" Color: preproc #6a0dad 55 darkmagenta
+" Color: type #2e8b57 29 darkgreen
+" Color: special #6a5acd 62 darkblue
+" Color: fg0 #000000 16 black
+" Color: bg0 #e4e4e4 254 grey
+" Color: bg1 #bcbcbc 250 white
+" Color: status #bcbcbc 250 darkgrey
+" Color: bg2 #eeeeee 255 white
+" Color: endofbuffer #cccccc 252 darkgrey
+" Color: visual #d0d0d0 252 white
+" Color: folded #d3d3d3 252 darkgrey
+" Color: folded_fg #00008b 18 darkblue
+" Color: pmenu #b2b2b2 249 white
+" Color: wildmenu #ffff00 226 yellow
+" Color: error #ff0000 196 red
+" Color: colorcolumn #ffffff 231 white
+" Color: spellcap #00d700 40 green
+" Color: black #000000 16 black
+" Color: darkred #870000 88 darkred
+" Color: darkgreen #008700 28 darkgreen
+" Color: darkyellow #878700 100 darkyellow
+" Color: darkblue #000087 18 darkblue
+" Color: darkmagenta #870087 18 darkmagenta
+" Color: darkcyan #008787 30 darkcyan
+" Color: gray #878787 102 gray
+" Term colors: bg0 statement constant preproc identifier type special bg1
+" Term colors: comment statement constant preproc identifier type special fg0
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/murphy.vim b/runtime/colors/murphy.vim
new file mode 100644
index 0000000..3dcff2c
--- /dev/null
+++ b/runtime/colors/murphy.vim
@@ -0,0 +1,397 @@
+" Name: murphy
+" Description: Green foreground black background.
+" Author: Original author Ron Aaron <ron@ronware.org>.
+" Maintainer: Original maintainer Ron Aaron <ron@ronware.org>.
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:47:20 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'murphy'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#303030', '#ffa700', '#005f00', '#ffd7af', '#87afff', '#ffafaf', '#00afaf', '#bcbcbc', '#444444', '#ff0000', '#00875f', '#ffff00', '#005fff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#87ff87 guibg=#000000 gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#0000ff guibg=#000000 gui=NONE cterm=NONE
+hi StatusLine guifg=#ffffff guibg=#00008b gui=NONE cterm=NONE
+hi StatusLineNC guifg=#ffffff guibg=#3a3a3a gui=NONE cterm=NONE
+hi VertSplit guifg=#ffffff guibg=#3a3a3a gui=NONE cterm=NONE
+hi Pmenu guifg=#ffffff guibg=#444444 gui=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=#303030 gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#bcbcbc gui=NONE cterm=NONE
+hi TabLineFill guifg=NONE guibg=#303030 gui=NONE cterm=NONE
+hi TabLine guifg=#87ff87 guibg=#444444 gui=NONE cterm=NONE
+hi TabLineSel guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE
+hi ToolbarLine guifg=NONE guibg=#303030 gui=NONE cterm=NONE
+hi ToolbarButton guifg=#ffffff guibg=#444444 gui=bold cterm=bold
+hi NonText guifg=#00afaf guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#00afaf guibg=NONE gui=NONE cterm=NONE
+hi QuickFixLine guifg=#303030 guibg=#00afaf gui=NONE cterm=NONE
+hi Folded guifg=#00afaf guibg=#303030 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#444444 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#444444 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=bold
+hi ColorColumn guifg=NONE guibg=#262626 gui=NONE cterm=NONE
+hi Visual guifg=#ffffff guibg=#005f00 gui=NONE cterm=NONE
+hi VisualNOS guifg=#ffffff guibg=#005f00 gui=NONE cterm=NONE
+hi LineNr guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#00afaf guibg=NONE gui=NONE cterm=NONE
+hi SignColumn guifg=#00afaf guibg=NONE gui=NONE cterm=NONE
+hi Underlined guifg=#00afaf guibg=NONE gui=underline cterm=underline
+hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE
+hi ErrorMsg guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE
+hi ModeMsg guifg=#87ff87 guibg=NONE gui=bold cterm=bold
+hi WarningMsg guifg=#ffa700 guibg=NONE gui=bold cterm=bold
+hi MoreMsg guifg=#005f00 guibg=NONE gui=bold cterm=bold
+hi Question guifg=#00ffff guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#0000ff guibg=#ffff00 gui=NONE cterm=NONE
+hi MatchParen guifg=#303030 guibg=#ffd7af gui=NONE cterm=NONE
+hi Search guifg=#ffffff guibg=#0000ff gui=NONE cterm=NONE
+hi IncSearch guifg=#ffa700 guibg=NONE gui=reverse cterm=reverse
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi Cursor guifg=#000000 guibg=#87ff87 gui=NONE cterm=NONE
+hi lCursor guifg=#000000 guibg=#ff0000 gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#00ffff guibg=NONE guisp=#00ffff gui=undercurl cterm=underline
+hi SpellLocal guifg=#ffd7af guibg=NONE guisp=#ffd7af gui=undercurl cterm=underline
+hi SpellRare guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline
+hi Comment guifg=#ffa700 guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#ffffff guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#ffd7af guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE
+hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi Conceal guifg=#bcbcbc guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=bold
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=120 ctermbg=16 cterm=NONE
+ hi EndOfBuffer ctermfg=21 ctermbg=16 cterm=NONE
+ hi StatusLine ctermfg=231 ctermbg=18 cterm=NONE
+ hi StatusLineNC ctermfg=231 ctermbg=237 cterm=NONE
+ hi VertSplit ctermfg=231 ctermbg=237 cterm=NONE
+ hi Pmenu ctermfg=231 ctermbg=238 cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=236 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=250 cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=236 cterm=NONE
+ hi TabLine ctermfg=120 ctermbg=238 cterm=NONE
+ hi TabLineSel ctermfg=231 ctermbg=16 cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=236 cterm=NONE
+ hi ToolbarButton ctermfg=231 ctermbg=238 cterm=bold
+ hi NonText ctermfg=37 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=37 ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=236 ctermbg=37 cterm=NONE
+ hi Folded ctermfg=37 ctermbg=236 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=238 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=238 cterm=NONE
+ hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=bold
+ hi ColorColumn ctermfg=NONE ctermbg=235 cterm=NONE
+ hi Visual ctermfg=231 ctermbg=22 cterm=NONE
+ hi VisualNOS ctermfg=231 ctermbg=22 cterm=NONE
+ hi LineNr ctermfg=226 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=37 ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=37 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=37 ctermbg=NONE cterm=underline
+ hi Error ctermfg=231 ctermbg=196 cterm=NONE
+ hi ErrorMsg ctermfg=231 ctermbg=196 cterm=NONE
+ hi ModeMsg ctermfg=120 ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=214 ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=22 ctermbg=NONE cterm=bold
+ hi Question ctermfg=51 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=21 ctermbg=226 cterm=NONE
+ hi MatchParen ctermfg=236 ctermbg=223 cterm=NONE
+ hi Search ctermfg=231 ctermbg=21 cterm=NONE
+ hi IncSearch ctermfg=214 ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE
+ hi Cursor ctermfg=16 ctermbg=120 cterm=NONE
+ hi lCursor ctermfg=16 ctermbg=196 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=51 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=223 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=226 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=214 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=51 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=226 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=231 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=223 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=250 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=201 ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=51 ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=250 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=201 ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=green ctermbg=black cterm=NONE
+ hi EndOfBuffer ctermfg=blue ctermbg=black cterm=NONE
+ hi StatusLine ctermfg=white ctermbg=darkblue cterm=NONE
+ hi StatusLineNC ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi VertSplit ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLine ctermfg=green ctermbg=darkgrey cterm=NONE
+ hi TabLineSel ctermfg=white ctermbg=black cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE
+ hi ToolbarButton ctermfg=white ctermbg=darkgrey cterm=bold
+ hi NonText ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline
+ hi ColorColumn ctermfg=green ctermbg=darkgrey cterm=NONE
+ hi Visual ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi VisualNOS ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi LineNr ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi Error ctermfg=white ctermbg=red cterm=NONE
+ hi ErrorMsg ctermfg=white ctermbg=red cterm=NONE
+ hi ModeMsg ctermfg=green ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Question ctermfg=cyan ctermbg=NONE cterm=bold
+ hi Todo ctermfg=blue ctermbg=yellow cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Search ctermfg=white ctermbg=blue cterm=NONE
+ hi IncSearch ctermfg=darkred ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE
+ hi Cursor ctermfg=black ctermbg=green cterm=NONE
+ hi lCursor ctermfg=black ctermbg=red cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=cyan ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkyellow ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=yellow ctermbg=NONE cterm=underline
+ hi Comment ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=white ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Type ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Special ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=magenta ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=darkgreen ctermbg=black cterm=NONE
+ hi EndOfBuffer ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi StatusLine ctermfg=darkblue ctermbg=grey cterm=bold,reverse
+ hi StatusLineNC ctermfg=grey ctermbg=black cterm=reverse
+ hi VertSplit ctermfg=grey ctermbg=black cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLine ctermfg=grey ctermbg=black cterm=reverse
+ hi TabLineSel ctermfg=grey ctermbg=black cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi NonText ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi ColorColumn ctermfg=grey ctermbg=darkred cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=reverse,underline
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Error ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ErrorMsg ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ModeMsg ctermfg=grey ctermbg=NONE cterm=bold
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Question ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Todo ctermfg=darkblue ctermbg=darkyellow cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Search ctermfg=grey ctermbg=darkblue cterm=NONE
+ hi IncSearch ctermfg=darkred ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkyellow ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi Comment ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=grey ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi Type ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: foreground #87FF87 120 green
+" Color: background #000000 16 black
+" Color: color00 #303030 236 black
+" Color: color08 #444444 238 darkgrey
+" Color: color01 #FFA700 214 darkred
+" Color: color09 #FF0000 196 red
+" Color: color02 #005F00 22 darkgreen
+" Color: color10 #00875F 29 green
+" Color: color03 #FFD7AF 223 darkyellow
+" Color: color11 #FFFF00 226 yellow
+" Color: color04 #00008B 18 darkblue
+" Color: color12 #0000FF 21 blue
+" Color: color05 #FFAFAF 217 darkmagenta
+" Color: color13 #FF00FF 201 magenta
+" Color: color06 #00AFAF 37 darkcyan
+" Color: color14 #00FFFF 51 cyan
+" Color: color07 #BCBCBC 250 grey
+" Color: color15 #FFFFFF 231 white
+" Color: color16 #262626 235 black
+" Color: color17 #3A3A3A 237 darkgrey
+" Color: color04t #87AFFF 111 darkblue
+" Color: color12t #005FFF 27 blue
+" Term colors: color00 color01 color02 color03 color04t color05 color06 color07
+" Term colors: color08 color09 color10 color11 color12t color13 color14 color15
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/pablo.vim b/runtime/colors/pablo.vim
new file mode 100644
index 0000000..17e3d77
--- /dev/null
+++ b/runtime/colors/pablo.vim
@@ -0,0 +1,430 @@
+" Name: pablo
+" Author: Ron Aaron <ron@ronware.org>
+" Maintainer: Original maintainerRon Aaron <ron@ronware.org>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Wed 14 Sep 2022 19:05:27 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'pablo'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi! link Terminal Normal
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE
+hi Comment guifg=#808080 guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#00c0c0 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#c0c000 guibg=NONE gui=bold cterm=bold
+hi PreProc guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#00c000 guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#0000ff guibg=NONE gui=NONE cterm=NONE
+hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline
+hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE
+hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE
+hi Todo guifg=#000000 guibg=#c0c000 gui=NONE cterm=NONE
+hi Conceal guifg=#e5e5e5 guibg=#a9a9a9 gui=NONE cterm=NONE
+hi Cursor guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+hi lCursor guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE
+hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=bold
+hi Directory guifg=#00c000 guibg=NONE gui=NONE cterm=NONE
+hi Search guifg=#000000 guibg=#c0c000 gui=NONE cterm=NONE
+hi IncSearch guifg=#ffffff guibg=NONE gui=reverse cterm=reverse
+hi NonText guifg=#0000ff guibg=NONE gui=bold cterm=bold
+hi EndOfBuffer guifg=#0000ff guibg=NONE gui=bold cterm=bold
+hi ErrorMsg guifg=#ffffff guibg=#cd0000 gui=NONE cterm=NONE
+hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi SignColumn guifg=#00ffff guibg=#a9a9a9 gui=NONE cterm=NONE
+hi ColorColumn guifg=NONE guibg=#4d4d4d gui=NONE cterm=NONE
+hi FoldColumn guifg=#7f7f7f guibg=#303030 gui=NONE cterm=NONE
+hi Folded guifg=#7f7f7f guibg=#303030 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#3a3a3a gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#3a3a3a gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffff00 guibg=#3a3a3a gui=bold cterm=bold
+hi Visual guifg=#00008b guibg=#a9a9a9 gui=NONE cterm=NONE
+hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline
+hi LineNr guifg=#7f7f7f guibg=NONE gui=NONE cterm=NONE
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE
+hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold
+hi MoreMsg guifg=#5c5cff guibg=NONE gui=bold cterm=bold
+hi Question guifg=#00ff00 guibg=NONE gui=bold cterm=bold
+hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi QuickFixLine guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#5c5cff guibg=NONE guisp=#5c5cff gui=undercurl cterm=underline
+hi SpellLocal guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline
+hi SpellRare guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline
+hi StatusLine guifg=#ffff00 guibg=#0000ee gui=NONE cterm=NONE
+hi StatusLineNC guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+hi VertSplit guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+hi TabLine guifg=#ffffff guibg=#7f7f7f gui=NONE cterm=NONE
+hi TabLineFill guifg=NONE guibg=#000000 gui=reverse cterm=reverse
+hi TabLineSel guifg=#ffffff guibg=#000000 gui=bold cterm=bold
+hi ToolbarLine guifg=NONE guibg=#000000 gui=NONE cterm=NONE
+hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=bold
+hi Pmenu guifg=fg guibg=#303030 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#e5e5e5 gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#ffffff gui=NONE cterm=NONE
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=231 ctermbg=16 cterm=NONE
+ hi Comment ctermfg=244 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=51 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=37 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=142 ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=46 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=34 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=21 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=111 ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=16 ctermbg=16 cterm=NONE
+ hi Error ctermfg=231 ctermbg=196 cterm=NONE
+ hi Todo ctermfg=16 ctermbg=142 cterm=NONE
+ hi Conceal ctermfg=254 ctermbg=248 cterm=NONE
+ hi Cursor ctermfg=16 ctermbg=231 cterm=NONE
+ hi lCursor ctermfg=16 ctermbg=231 cterm=NONE
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi Title ctermfg=225 ctermbg=NONE cterm=bold
+ hi Directory ctermfg=34 ctermbg=NONE cterm=NONE
+ hi Search ctermfg=16 ctermbg=142 cterm=NONE
+ hi IncSearch ctermfg=231 ctermbg=NONE cterm=reverse
+ hi NonText ctermfg=63 ctermbg=NONE cterm=bold
+ hi EndOfBuffer ctermfg=63 ctermbg=NONE cterm=bold
+ hi ErrorMsg ctermfg=231 ctermbg=160 cterm=NONE
+ hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=51 ctermbg=248 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=239 cterm=NONE
+ hi FoldColumn ctermfg=102 ctermbg=236 cterm=NONE
+ hi Folded ctermfg=102 ctermbg=236 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=237 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=237 cterm=NONE
+ hi CursorLineNr ctermfg=226 ctermbg=237 cterm=bold
+ hi Visual ctermfg=20 ctermbg=248 cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline
+ hi LineNr ctermfg=102 ctermbg=NONE cterm=NONE
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi MatchParen ctermfg=NONE ctermbg=44 cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=63 ctermbg=NONE cterm=bold
+ hi Question ctermfg=121 ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=81 ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=44 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=63 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=201 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=226 ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=226 ctermbg=20 cterm=NONE
+ hi StatusLineNC ctermfg=16 ctermbg=231 cterm=NONE
+ hi VertSplit ctermfg=16 ctermbg=231 cterm=NONE
+ hi TabLine ctermfg=231 ctermbg=102 cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=16 cterm=reverse
+ hi TabLineSel ctermfg=231 ctermbg=16 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=16 cterm=NONE
+ hi ToolbarButton ctermfg=16 ctermbg=254 cterm=bold
+ hi Pmenu ctermfg=fg ctermbg=236 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=254 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=231 cterm=NONE
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=white ctermbg=black cterm=NONE
+ hi Comment ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=green ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Special ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=darkgreen ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=black ctermbg=black cterm=NONE
+ hi Error ctermfg=white ctermbg=red cterm=NONE
+ hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=grey cterm=NONE
+ hi Cursor ctermfg=black ctermbg=white cterm=NONE
+ hi lCursor ctermfg=black ctermbg=white cterm=NONE
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi Title ctermfg=magenta ctermbg=NONE cterm=bold
+ hi Directory ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Search ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi IncSearch ctermfg=white ctermbg=NONE cterm=reverse
+ hi NonText ctermfg=blue ctermbg=NONE cterm=bold
+ hi EndOfBuffer ctermfg=blue ctermbg=NONE cterm=bold
+ hi ErrorMsg ctermfg=white ctermbg=darkred cterm=NONE
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=cyan ctermbg=black cterm=NONE
+ hi ColorColumn ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=blue ctermbg=NONE cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline
+ hi Visual ctermfg=darkblue ctermbg=grey cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline
+ hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=blue ctermbg=NONE cterm=bold
+ hi Question ctermfg=green ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=magenta ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=yellow ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=yellow ctermbg=darkblue cterm=NONE
+ hi StatusLineNC ctermfg=black ctermbg=white cterm=NONE
+ hi VertSplit ctermfg=black ctermbg=white cterm=NONE
+ hi TabLine ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=black cterm=reverse
+ hi TabLineSel ctermfg=white ctermbg=black cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=grey cterm=bold
+ hi Pmenu ctermfg=fg ctermbg=darkgrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=grey cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=white cterm=NONE
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi EndOfBuffer ctermfg=grey ctermbg=black cterm=bold
+ hi StatusLine ctermfg=darkblue ctermbg=grey cterm=reverse
+ hi StatusLineNC ctermfg=grey ctermbg=black cterm=reverse
+ hi StatusLineTerm ctermfg=darkblue ctermbg=grey cterm=reverse
+ hi StatusLineTermNC ctermfg=grey ctermbg=black cterm=reverse
+ hi VertSplit ctermfg=grey ctermbg=black cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=grey cterm=NONE
+ hi TabLineSel ctermfg=grey ctermbg=black cterm=NONE
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE
+ hi NonText ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi ColorColumn ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi VisualNOS ctermfg=black ctermbg=grey cterm=NONE
+ hi LineNr ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Error ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ErrorMsg ctermfg=grey ctermbg=darkred cterm=NONE
+ hi ModeMsg ctermfg=grey ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Question ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi Search ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkblue ctermbg=darkyellow cterm=reverse
+ hi SpellLocal ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi SpellRare ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi Comment ctermfg=grey ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Special ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=grey ctermbg=darkred cterm=NONE
+ hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Directory ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: color00 #000000 16 black
+" Color: color08 #7f7f7f 102 darkgrey
+" Color: color01 #cd0000 160 darkred
+" Color: color09 #ff0000 196 red
+" Color: color02 #00cd00 40 darkgreen
+" Color: color10 #00ff00 46 green
+" Color: color03 #cdcd00 184 darkyellow
+" Color: color11 #ffff00 226 yellow
+" Color: color04 #0000ee 20 darkblue
+" Color: color12 #5c5cff 63 blue
+" Color: color05 #cd00cd 164 darkmagenta
+" Color: color13 #ff00ff 201 magenta
+" Color: color06 #00cdcd 44 darkcyan
+" Color: color14 #00ffff 51 cyan
+" Color: color07 #e5e5e5 254 grey
+" Color: color15 #ffffff 231 white
+" Term colors: color00 color01 color02 color03 color04 color05 color06 color07
+" Term colors: color08 color09 color10 color11 color12 color13 color14 color15
+" Color: rgbGrey30 #4d4d4d 239 darkgrey
+" Color: rgbGrey40 #666666 241 darkgrey
+" Color: rgbDarkGrey #a9a9a9 248 grey
+" Color: rgbDarkBlue #00008b 20 darkblue
+" Color: rgbDarkMagenta #8b008b 164 darkmagenta
+" Color: rgbBlue #0000ff 63 blue
+" Color: rgbDarkCyan #008b8b 44 darkcyan
+" Color: rgbSeaGreen #2e8b57 121 darkgreen
+" Color: rgbGrey #bebebe 248 grey
+" Color: Question #00ff00 121 green
+" Color: SignColumn #a9a9a9 248 black
+" Color: SpecialKey #00ffff 81 cyan
+" Color: StatusLineTerm #90ee90 121 darkgreen
+" Color: Title #ff00ff 225 magenta
+" Color: WarningMsg #ff0000 196 red
+" Color: ToolbarLine #7f7f7f 242 darkgrey
+" Color: ToolbarButton #d3d3d3 254 grey
+" Color: Underlined #80a0ff 111 darkgreen
+" Color: Comment #808080 244 darkgrey
+" Color: Constant #00ffff 51 cyan
+" Color: Special #0000ff 21 blue
+" Color: Identifier #00c0c0 37 darkcyan
+" Color: Search #c0c000 142 darkyellow
+" Color: Statement #c0c000 142 darkyellow
+" Color: Todo #c0c000 142 darkyellow
+" Color: PreProc #00ff00 46 green
+" Color: Type #00c000 34 darkgreen
+" Color: Directory #00c000 34 darkgreen
+" Color: Pmenu #303030 236 darkgrey
+" Color: Folded #303030 236 darkgrey
+" Color: Cursorline #3a3a3a 237 darkgrey
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/peachpuff.vim b/runtime/colors/peachpuff.vim
new file mode 100644
index 0000000..0622ce6
--- /dev/null
+++ b/runtime/colors/peachpuff.vim
@@ -0,0 +1,408 @@
+" Name: peachpuff
+" Description: This color scheme uses a peachpuff background (what you've expected when it's " called peachpuff?).
+" Author: Original author David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Maintainer: Original maintainer David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:50:02 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=light
+
+hi clear
+let g:colors_name = 'peachpuff'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#ffdab9', '#a52a2a', '#c00058', '#cd00cd', '#008b8b', '#2e8b57', '#6a5acd', '#737373', '#406090', '#a52a2a', '#c00058', '#cd00cd', '#008b8b', '#2e8b57', '#6a5acd', '#000000']
+endif
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#000000 guibg=#ffdab9 gui=NONE cterm=NONE
+hi Folded guifg=#000000 guibg=#e3c1a5 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#f5c195 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#f5c195 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#cd0000 guibg=NONE gui=bold cterm=bold
+hi QuickFixLine guifg=#000000 guibg=#ffaf87 gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#737373 guibg=NONE gui=NONE cterm=NONE
+hi StatusLine guifg=#ffffff guibg=#000000 gui=bold cterm=bold
+hi StatusLineNC guifg=#ffdab9 guibg=#737373 gui=bold cterm=bold
+hi StatusLineTerm guifg=#ffffff guibg=#2e8b57 gui=bold cterm=bold
+hi StatusLineTermNC guifg=#ffdab9 guibg=#008b8b gui=bold cterm=bold
+hi VertSplit guifg=#ffdab9 guibg=#737373 gui=NONE cterm=NONE
+hi Pmenu guifg=#000000 guibg=#ffaf87 gui=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#f5c195 gui=bold cterm=bold
+hi PmenuSbar guifg=NONE guibg=#ffdab9 gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#737373 gui=NONE cterm=NONE
+hi TabLine guifg=#ffdab9 guibg=#737373 gui=underline cterm=underline
+hi TabLineFill guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+hi TabLineSel guifg=#000000 guibg=#ffdab9 gui=bold cterm=bold
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi ToolbarButton guifg=#ffdab9 guibg=#737373 gui=bold cterm=bold
+hi NonText guifg=#737373 guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#737373 guibg=NONE gui=NONE cterm=NONE
+hi Visual guifg=#000000 guibg=#cccccc gui=NONE cterm=NONE
+hi VisualNOS guifg=NONE guibg=#406090 gui=NONE cterm=NONE
+hi LineNr guifg=#cd0000 guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#406090 guibg=NONE gui=NONE cterm=NONE
+hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Underlined guifg=#6a5acd guibg=NONE gui=underline cterm=underline
+hi Error guifg=#ff0000 guibg=#ffffff gui=bold,reverse cterm=bold,reverse
+hi ErrorMsg guifg=#ff0000 guibg=#ffffff gui=bold,reverse cterm=bold,reverse
+hi WarningMsg guifg=#cd00cd guibg=#ffdab9 gui=bold cterm=bold
+hi MoreMsg guifg=#2e8b57 guibg=#ffdab9 gui=bold cterm=bold
+hi ModeMsg guifg=#000000 guibg=#ffdab9 gui=bold cterm=bold
+hi Question guifg=#c00058 guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#6a5acd guibg=#ffff00 gui=NONE cterm=NONE
+hi MatchParen guifg=#ffdab9 guibg=#6a5acd gui=NONE cterm=NONE
+hi Search guifg=#ffdab9 guibg=#cd00cd gui=NONE cterm=NONE
+hi IncSearch guifg=#2e8b57 guibg=NONE gui=reverse cterm=reverse
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=bold cterm=bold
+hi ColorColumn guifg=NONE guibg=#eeeeee gui=NONE cterm=NONE
+hi Cursor guifg=#ffdab9 guibg=#000000 gui=NONE cterm=NONE
+hi lCursor guifg=#000000 guibg=#c00058 gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#008b8b guibg=NONE guisp=#008b8b gui=undercurl cterm=underline
+hi SpellLocal guifg=#cd00cd guibg=NONE guisp=#cd00cd gui=undercurl cterm=underline
+hi SpellRare guifg=#6a5acd guibg=NONE guisp=#6a5acd gui=undercurl cterm=underline
+hi Comment guifg=#406090 guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#c00058 guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#008b8b guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#a52a2a guibg=NONE gui=bold cterm=bold
+hi PreProc guifg=#cd00cd guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#2e8b57 guibg=NONE gui=bold cterm=bold
+hi Special guifg=#6a5acd guibg=NONE gui=NONE cterm=NONE
+hi Directory guifg=#008b8b guibg=NONE gui=bold cterm=bold
+hi Conceal guifg=#406090 guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Title guifg=#cd00cd guibg=NONE gui=bold cterm=bold
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=16 ctermbg=223 cterm=NONE
+ hi Folded ctermfg=16 ctermbg=252 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=180 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=180 cterm=NONE
+ hi CursorLineNr ctermfg=160 ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=16 ctermbg=216 cterm=NONE
+ hi EndOfBuffer ctermfg=243 ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=231 ctermbg=16 cterm=bold
+ hi StatusLineNC ctermfg=223 ctermbg=243 cterm=bold
+ hi StatusLineTerm ctermfg=231 ctermbg=29 cterm=bold
+ hi StatusLineTermNC ctermfg=223 ctermbg=30 cterm=bold
+ hi VertSplit ctermfg=223 ctermbg=243 cterm=NONE
+ hi Pmenu ctermfg=16 ctermbg=216 cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=180 cterm=bold
+ hi PmenuSbar ctermfg=NONE ctermbg=223 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=243 cterm=NONE
+ hi TabLine ctermfg=223 ctermbg=243 cterm=underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=16 ctermbg=223 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=223 ctermbg=243 cterm=bold
+ hi NonText ctermfg=243 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=243 ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=16 ctermbg=252 cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=25 cterm=NONE
+ hi LineNr ctermfg=160 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=25 ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=62 ctermbg=NONE cterm=underline
+ hi Error ctermfg=196 ctermbg=231 cterm=bold,reverse
+ hi ErrorMsg ctermfg=196 ctermbg=231 cterm=bold,reverse
+ hi WarningMsg ctermfg=164 ctermbg=223 cterm=bold
+ hi MoreMsg ctermfg=29 ctermbg=223 cterm=bold
+ hi ModeMsg ctermfg=16 ctermbg=223 cterm=bold
+ hi Question ctermfg=161 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=62 ctermbg=226 cterm=NONE
+ hi MatchParen ctermfg=223 ctermbg=62 cterm=NONE
+ hi Search ctermfg=223 ctermbg=164 cterm=NONE
+ hi IncSearch ctermfg=29 ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=bold
+ hi ColorColumn ctermfg=NONE ctermbg=255 cterm=NONE
+ hi Cursor ctermfg=223 ctermbg=16 cterm=NONE
+ hi lCursor ctermfg=16 ctermbg=161 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=30 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=164 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=62 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=25 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=161 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=30 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=124 ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=164 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=29 ctermbg=NONE cterm=bold
+ hi Special ctermfg=62 ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=30 ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=25 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=164 ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=black ctermbg=white cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=underline
+ hi QuickFixLine ctermfg=black ctermbg=grey cterm=NONE
+ hi EndOfBuffer ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=white ctermbg=black cterm=bold
+ hi StatusLineNC ctermfg=white ctermbg=darkgrey cterm=bold
+ hi StatusLineTerm ctermfg=white ctermbg=darkgreen cterm=bold
+ hi StatusLineTermNC ctermfg=white ctermbg=darkcyan cterm=bold
+ hi VertSplit ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi Pmenu ctermfg=black ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=yellow cterm=bold
+ hi PmenuSbar ctermfg=NONE ctermbg=white cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi TabLine ctermfg=white ctermbg=darkgrey cterm=underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=black ctermbg=white cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=white ctermbg=darkgrey cterm=bold
+ hi NonText ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=black ctermbg=grey cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi LineNr ctermfg=red ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi Error ctermfg=darkred ctermbg=white cterm=bold,reverse
+ hi ErrorMsg ctermfg=darkred ctermbg=white cterm=bold,reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=white cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=white cterm=bold
+ hi ModeMsg ctermfg=black ctermbg=white cterm=bold
+ hi Question ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Todo ctermfg=darkblue ctermbg=yellow cterm=NONE
+ hi MatchParen ctermfg=white ctermbg=darkblue cterm=NONE
+ hi Search ctermfg=white ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=bold
+ hi ColorColumn ctermfg=NONE ctermbg=grey cterm=NONE
+ hi Cursor ctermfg=white ctermbg=black cterm=NONE
+ hi lCursor ctermfg=black ctermbg=darkred cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkmagenta ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi Comment ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkred ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Special ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=black ctermbg=gray cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=underline
+ hi QuickFixLine ctermfg=gray ctermbg=darkcyan cterm=NONE
+ hi EndOfBuffer ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi StatusLine ctermfg=black ctermbg=gray cterm=bold,reverse
+ hi StatusLineNC ctermfg=black ctermbg=gray cterm=reverse
+ hi StatusLineTerm ctermfg=black ctermbg=gray cterm=bold,reverse
+ hi StatusLineTermNC ctermfg=black ctermbg=gray cterm=reverse
+ hi VertSplit ctermfg=black ctermbg=gray cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkgreen cterm=NONE
+ hi TabLine ctermfg=gray ctermbg=black cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=black ctermbg=white cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=gray cterm=bold,reverse
+ hi NonText ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi LineNr ctermfg=black ctermbg=NONE cterm=bold
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Error ctermfg=darkred ctermbg=gray cterm=bold,reverse
+ hi ErrorMsg ctermfg=darkred ctermbg=gray cterm=bold,reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi ModeMsg ctermfg=black ctermbg=NONE cterm=bold
+ hi Question ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Todo ctermfg=darkblue ctermbg=darkyellow cterm=NONE
+ hi MatchParen ctermfg=gray ctermbg=darkblue cterm=NONE
+ hi Search ctermfg=gray ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkred cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=reverse
+ hi SpellCap ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkmagenta ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkblue ctermbg=NONE cterm=reverse
+ hi Comment ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkred ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: light
+" Color: comment #406090 25 darkgrey
+" Color: constant #c00058 161 darkred
+" Color: identifier #008b8b 30 darkcyan
+" Color: statement #a52a2a 124 darkred
+" Color: preproc #cd00cd 164 darkmagenta
+" Color: type #2e8b57 29 darkgreen
+" Color: special #6a5acd 62 darkblue
+" Color: fg0 #000000 16 black
+" Color: bg0 #ffdab9 223 white
+" Color: fg1 #ffffff 231 white
+" Color: bg1 #737373 243 darkgrey
+" Color: visual #cccccc 252 grey
+" Color: folded #e3c1a5 252 cyan
+" Color: folded_fg #000000 16 black
+" Color: cursorline #f5c195 180 yellow
+" Color: pmenu #ffaf87 216 grey
+" Color: wildmenu #ffff00 226 yellow
+" Color: error #ff0000 196 darkred
+" Color: linenr #cd0000 160 red
+" Color: blue #0000ff 21 darkblue
+" Color: red #ff0000 196 darkred
+" Color: colorcolumn #eeeeee 255 grey
+" Color: black #000000 16 black
+" Color: darkred #870000 88 darkred
+" Color: darkgreen #008700 28 darkgreen
+" Color: darkyellow #878700 100 darkyellow
+" Color: darkblue #000087 18 darkblue
+" Color: darkmagenta #870087 18 darkmagenta
+" Color: darkcyan #008787 30 darkcyan
+" Color: gray #878787 102 gray
+" Term colors: bg0 statement constant preproc identifier type special bg1
+" Term colors: comment statement constant preproc identifier type special fg0
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/quiet.vim b/runtime/colors/quiet.vim
new file mode 100644
index 0000000..e4d045a
--- /dev/null
+++ b/runtime/colors/quiet.vim
@@ -0,0 +1,702 @@
+" Name: quiet
+" Description: `monochrome`, but less ugly, with diffs, searches, a few other niceties, and both light and dark versions.
+" Author: neutaaaaan <neutaaaaan-gh@protonmail.com>
+" Maintainer: neutaaaaan <neutaaaaan-gh@protonmail.com>
+" Website: https://github.com/vim/colorschemes
+" License: Vim License (see `:help license`)`
+" Last Updated: Fri 16 Sep 2022 09:52:50 MSK
+
+" Generated by Colortemplate v2.2.0
+
+hi clear
+let g:colors_name = 'quiet'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+hi! link Terminal Normal
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi! link Boolean Constant
+hi! link Character Constant
+hi! link Conditional Statement
+hi! link Define PreProc
+hi! link Debug Special
+hi! link Delimiter Special
+hi! link Exception Statement
+hi! link Float Constant
+hi! link Function Identifier
+hi! link Include PreProc
+hi! link Keyword Statement
+hi! link Label Statement
+hi! link Macro PreProc
+hi! link Number Constant
+hi! link Operator Statement
+hi! link PreCondit PreProc
+hi! link Repeat Statement
+hi! link SpecialChar Special
+hi! link SpecialComment Special
+hi! link StorageClass Type
+hi! link String Constant
+hi! link Structure Type
+hi! link Tag Special
+hi! link Typedef Type
+hi! link lCursor Cursor
+hi! link debugBreakpoint ModeMsg
+hi! link debugPC CursorLine
+
+if &background ==# 'dark'
+ if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#080808', '#d7005f', '#00af5f', '#d78700', '#0087d7', '#d787d7', '#00afaf', '#dadada', '#707070', '#ff005f', '#00d75f', '#ffaf00', '#5fafff', '#ff87ff', '#00d7d7', '#ffffff']
+ endif
+ hi Normal guifg=#dadada guibg=#080808 gui=NONE cterm=NONE
+ hi ColorColumn guifg=NONE guibg=#1c1c1c gui=NONE cterm=NONE
+ hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorColumn guifg=NONE guibg=#303030 gui=NONE cterm=NONE
+ hi CursorLine guifg=NONE guibg=#303030 gui=NONE cterm=NONE
+ hi CursorLineNr guifg=#dadada guibg=#303030 gui=NONE cterm=NONE
+ hi DiffAdd guifg=#00af00 guibg=#080808 gui=reverse cterm=reverse
+ hi DiffChange guifg=#87afd7 guibg=#080808 gui=reverse cterm=reverse
+ hi DiffDelete guifg=#d75f5f guibg=#080808 gui=reverse cterm=reverse
+ hi DiffText guifg=#d787d7 guibg=#080808 gui=reverse cterm=reverse
+ hi Directory guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi EndOfBuffer guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi ErrorMsg guifg=#dadada guibg=#080808 gui=reverse cterm=reverse
+ hi FoldColumn guifg=#707070 guibg=NONE gui=NONE cterm=NONE
+ hi Folded guifg=#707070 guibg=#080808 gui=NONE cterm=NONE
+ hi IncSearch guifg=#ffaf00 guibg=#080808 gui=reverse cterm=reverse
+ hi LineNr guifg=#444444 guibg=NONE gui=NONE cterm=NONE
+ hi MatchParen guifg=#ff00af guibg=NONE gui=bold cterm=bold
+ hi ModeMsg guifg=#dadada guibg=NONE gui=bold cterm=bold
+ hi MoreMsg guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi NonText guifg=#707070 guibg=NONE gui=NONE cterm=NONE
+ hi Pmenu guifg=#080808 guibg=#87afd7 gui=NONE cterm=NONE
+ hi PmenuSbar guifg=#dadada guibg=#707070 gui=NONE cterm=NONE
+ hi PmenuSel guifg=#080808 guibg=#d787d7 gui=NONE cterm=NONE
+ hi PmenuThumb guifg=#dadada guibg=#d787d7 gui=NONE cterm=NONE
+ hi Question guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi QuickFixLine guifg=#d787d7 guibg=#080808 gui=reverse cterm=reverse
+ hi Search guifg=#00afff guibg=#080808 gui=reverse cterm=reverse
+ hi SignColumn guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi SpecialKey guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi SpellBad guifg=#d7005f guibg=NONE guisp=#d7005f gui=undercurl cterm=underline
+ hi SpellCap guifg=#0087d7 guibg=NONE guisp=#0087d7 gui=undercurl cterm=underline
+ hi SpellLocal guifg=#d787d7 guibg=NONE guisp=#d787d7 gui=undercurl cterm=underline
+ hi SpellRare guifg=#00afaf guibg=NONE guisp=#00afaf gui=undercurl cterm=underline
+ hi StatusLine guifg=#080808 guibg=#dadada gui=bold cterm=bold
+ hi StatusLineNC guifg=#707070 guibg=#080808 gui=reverse cterm=reverse
+ hi TabLine guifg=#707070 guibg=#080808 gui=reverse cterm=reverse
+ hi TabLineFill guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi TabLineSel guifg=#080808 guibg=#dadada gui=bold cterm=bold
+ hi Title guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit guifg=#707070 guibg=#080808 gui=NONE cterm=NONE
+ hi Visual guifg=#ffaf00 guibg=#080808 gui=reverse cterm=reverse
+ hi VisualNOS guifg=NONE guibg=#303030 gui=NONE cterm=NONE
+ hi WarningMsg guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi WildMenu guifg=#00afff guibg=#080808 gui=bold cterm=bold
+ hi Comment guifg=#707070 guibg=NONE gui=bold cterm=bold
+ hi Constant guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi Error guifg=#ff005f guibg=#080808 gui=bold,reverse cterm=bold,reverse
+ hi Identifier guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi Ignore guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi PreProc guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi Special guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi Statement guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi Todo guifg=#00ffaf guibg=NONE gui=bold,reverse cterm=bold,reverse
+ hi Type guifg=#dadada guibg=NONE gui=NONE cterm=NONE
+ hi Underlined guifg=#dadada guibg=NONE gui=underline cterm=underline
+ hi CursorIM guifg=#080808 guibg=#afff00 gui=NONE cterm=NONE
+ hi ToolbarLine guifg=NONE guibg=#080808 gui=NONE cterm=NONE
+ hi ToolbarButton guifg=#dadada guibg=#080808 gui=bold cterm=bold
+else
+ " Light background
+ if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#080808', '#af0000', '#005f00', '#af5f00', '#005faf', '#870087', '#008787', '#d7d7d7', '#626262', '#d70000', '#008700', '#d78700', '#0087d7', '#af00af', '#00afaf', '#ffffff']
+ endif
+ hi Normal guifg=#080808 guibg=#d7d7d7 gui=NONE cterm=NONE
+ hi ColorColumn guifg=NONE guibg=#e4e4e4 gui=NONE cterm=NONE
+ hi Conceal guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorColumn guifg=NONE guibg=#eeeeee gui=NONE cterm=NONE
+ hi CursorLine guifg=NONE guibg=#eeeeee gui=NONE cterm=NONE
+ hi CursorLineNr guifg=#080808 guibg=#eeeeee gui=NONE cterm=NONE
+ hi DiffAdd guifg=#87d787 guibg=#080808 gui=reverse cterm=reverse
+ hi DiffChange guifg=#afafd7 guibg=#080808 gui=reverse cterm=reverse
+ hi DiffDelete guifg=#d78787 guibg=#080808 gui=reverse cterm=reverse
+ hi DiffText guifg=#d787d7 guibg=#080808 gui=reverse cterm=reverse
+ hi Directory guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi EndOfBuffer guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi ErrorMsg guifg=#080808 guibg=#d7d7d7 gui=reverse cterm=reverse
+ hi FoldColumn guifg=#626262 guibg=NONE gui=NONE cterm=NONE
+ hi Folded guifg=#626262 guibg=#d7d7d7 gui=NONE cterm=NONE
+ hi IncSearch guifg=#ffaf00 guibg=#080808 gui=reverse cterm=reverse
+ hi LineNr guifg=#a8a8a8 guibg=NONE gui=NONE cterm=NONE
+ hi MatchParen guifg=#ff00af guibg=#d7d7d7 gui=bold cterm=bold
+ hi ModeMsg guifg=#080808 guibg=NONE gui=bold cterm=bold
+ hi MoreMsg guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi NonText guifg=#626262 guibg=NONE gui=NONE cterm=NONE
+ hi Pmenu guifg=#080808 guibg=#afafd7 gui=NONE cterm=NONE
+ hi PmenuSbar guifg=#080808 guibg=#626262 gui=NONE cterm=NONE
+ hi PmenuSel guifg=#080808 guibg=#d787d7 gui=NONE cterm=NONE
+ hi PmenuThumb guifg=#080808 guibg=#d787d7 gui=NONE cterm=NONE
+ hi Question guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi QuickFixLine guifg=#d787d7 guibg=#080808 gui=reverse cterm=reverse
+ hi Search guifg=#00afff guibg=#080808 gui=reverse cterm=reverse
+ hi SignColumn guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi SpecialKey guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi SpellBad guifg=#af0000 guibg=#d7d7d7 guisp=#af0000 gui=undercurl cterm=underline
+ hi SpellCap guifg=#005faf guibg=#d7d7d7 guisp=#005faf gui=undercurl cterm=underline
+ hi SpellLocal guifg=#870087 guibg=#d7d7d7 guisp=#870087 gui=undercurl cterm=underline
+ hi SpellRare guifg=#008787 guibg=#d7d7d7 guisp=#008787 gui=undercurl cterm=underline
+ hi StatusLine guifg=#eeeeee guibg=#080808 gui=bold cterm=bold
+ hi StatusLineNC guifg=#080808 guibg=#a8a8a8 gui=NONE cterm=NONE
+ hi TabLine guifg=#080808 guibg=#a8a8a8 gui=NONE cterm=NONE
+ hi TabLineFill guifg=#080808 guibg=#d7d7d7 gui=NONE cterm=NONE
+ hi TabLineSel guifg=#eeeeee guibg=#080808 gui=bold cterm=bold
+ hi Title guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit guifg=#626262 guibg=#d7d7d7 gui=NONE cterm=NONE
+ hi Visual guifg=#ffaf00 guibg=#080808 gui=reverse cterm=reverse
+ hi VisualNOS guifg=NONE guibg=#eeeeee gui=NONE cterm=NONE
+ hi WarningMsg guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi WildMenu guifg=#080808 guibg=#eeeeee gui=bold cterm=bold
+ hi Comment guifg=#080808 guibg=NONE gui=bold cterm=bold
+ hi Constant guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi Error guifg=#ff005f guibg=#080808 gui=bold,reverse cterm=bold,reverse
+ hi Identifier guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi Ignore guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi PreProc guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi Special guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi Statement guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi Todo guifg=#00ffaf guibg=#080808 gui=bold,reverse cterm=bold,reverse
+ hi Type guifg=#080808 guibg=NONE gui=NONE cterm=NONE
+ hi Underlined guifg=#080808 guibg=NONE gui=underline cterm=underline
+ hi CursorIM guifg=#080808 guibg=#afff00 gui=NONE cterm=NONE
+ hi ToolbarLine guifg=NONE guibg=#d7d7d7 gui=NONE cterm=NONE
+ hi ToolbarButton guifg=#080808 guibg=#d7d7d7 gui=bold cterm=bold
+endif
+
+if s:t_Co >= 256
+ if &background ==# 'dark'
+ hi Normal ctermfg=253 ctermbg=232 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=234 cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorColumn ctermfg=NONE ctermbg=236 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=236 cterm=NONE
+ hi CursorLineNr ctermfg=253 ctermbg=236 cterm=NONE
+ hi DiffAdd ctermfg=34 ctermbg=232 cterm=reverse
+ hi DiffChange ctermfg=110 ctermbg=232 cterm=reverse
+ hi DiffDelete ctermfg=167 ctermbg=232 cterm=reverse
+ hi DiffText ctermfg=176 ctermbg=232 cterm=reverse
+ hi Directory ctermfg=253 ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=253 ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=253 ctermbg=232 cterm=reverse
+ hi FoldColumn ctermfg=242 ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=242 ctermbg=232 cterm=NONE
+ hi IncSearch ctermfg=214 ctermbg=232 cterm=reverse
+ hi LineNr ctermfg=238 ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=199 ctermbg=NONE cterm=bold
+ hi ModeMsg ctermfg=253 ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=253 ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=242 ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=232 ctermbg=110 cterm=NONE
+ hi PmenuSbar ctermfg=253 ctermbg=242 cterm=NONE
+ hi PmenuSel ctermfg=232 ctermbg=176 cterm=NONE
+ hi PmenuThumb ctermfg=253 ctermbg=176 cterm=NONE
+ hi Question ctermfg=253 ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=176 ctermbg=232 cterm=reverse
+ hi Search ctermfg=39 ctermbg=232 cterm=reverse
+ hi SignColumn ctermfg=253 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=253 ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=161 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=32 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=176 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=37 ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=232 ctermbg=253 cterm=bold
+ hi StatusLineNC ctermfg=242 ctermbg=232 cterm=reverse
+ hi TabLine ctermfg=242 ctermbg=232 cterm=reverse
+ hi TabLineFill ctermfg=253 ctermbg=NONE cterm=NONE
+ hi TabLineSel ctermfg=232 ctermbg=253 cterm=bold
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=242 ctermbg=232 cterm=NONE
+ hi Visual ctermfg=214 ctermbg=232 cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=236 cterm=NONE
+ hi WarningMsg ctermfg=253 ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=39 ctermbg=232 cterm=bold
+ hi Comment ctermfg=242 ctermbg=NONE cterm=bold
+ hi Constant ctermfg=253 ctermbg=NONE cterm=NONE
+ hi Error ctermfg=197 ctermbg=232 cterm=bold,reverse
+ hi Identifier ctermfg=253 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=253 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=253 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=253 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=253 ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=49 ctermbg=NONE cterm=bold,reverse
+ hi Type ctermfg=253 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=253 ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=232 ctermbg=154 cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=232 cterm=NONE
+ hi ToolbarButton ctermfg=253 ctermbg=232 cterm=bold
+ else
+ " Light background
+ hi Normal ctermfg=232 ctermbg=188 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=254 cterm=NONE
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorColumn ctermfg=NONE ctermbg=255 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=255 cterm=NONE
+ hi CursorLineNr ctermfg=232 ctermbg=255 cterm=NONE
+ hi DiffAdd ctermfg=114 ctermbg=232 cterm=reverse
+ hi DiffChange ctermfg=146 ctermbg=232 cterm=reverse
+ hi DiffDelete ctermfg=174 ctermbg=232 cterm=reverse
+ hi DiffText ctermfg=176 ctermbg=232 cterm=reverse
+ hi Directory ctermfg=232 ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=232 ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=232 ctermbg=188 cterm=reverse
+ hi FoldColumn ctermfg=241 ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=241 ctermbg=188 cterm=NONE
+ hi IncSearch ctermfg=214 ctermbg=232 cterm=reverse
+ hi LineNr ctermfg=248 ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=199 ctermbg=188 cterm=bold
+ hi ModeMsg ctermfg=232 ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=232 ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=241 ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=232 ctermbg=146 cterm=NONE
+ hi PmenuSbar ctermfg=232 ctermbg=241 cterm=NONE
+ hi PmenuSel ctermfg=232 ctermbg=176 cterm=NONE
+ hi PmenuThumb ctermfg=232 ctermbg=176 cterm=NONE
+ hi Question ctermfg=232 ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=176 ctermbg=232 cterm=reverse
+ hi Search ctermfg=39 ctermbg=232 cterm=reverse
+ hi SignColumn ctermfg=232 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=232 ctermbg=NONE cterm=NONE
+ hi SpellBad ctermfg=124 ctermbg=188 cterm=underline
+ hi SpellCap ctermfg=25 ctermbg=188 cterm=underline
+ hi SpellLocal ctermfg=90 ctermbg=188 cterm=underline
+ hi SpellRare ctermfg=30 ctermbg=188 cterm=underline
+ hi StatusLine ctermfg=255 ctermbg=232 cterm=bold
+ hi StatusLineNC ctermfg=232 ctermbg=248 cterm=NONE
+ hi TabLine ctermfg=232 ctermbg=248 cterm=NONE
+ hi TabLineFill ctermfg=232 ctermbg=188 cterm=NONE
+ hi TabLineSel ctermfg=255 ctermbg=232 cterm=bold
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=241 ctermbg=188 cterm=NONE
+ hi Visual ctermfg=214 ctermbg=232 cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=255 cterm=NONE
+ hi WarningMsg ctermfg=232 ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=232 ctermbg=255 cterm=bold
+ hi Comment ctermfg=232 ctermbg=NONE cterm=bold
+ hi Constant ctermfg=232 ctermbg=NONE cterm=NONE
+ hi Error ctermfg=197 ctermbg=232 cterm=bold,reverse
+ hi Identifier ctermfg=232 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=232 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=232 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=232 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=232 ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=49 ctermbg=232 cterm=bold,reverse
+ hi Type ctermfg=232 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=232 ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=232 ctermbg=154 cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=188 cterm=NONE
+ hi ToolbarButton ctermfg=232 ctermbg=188 cterm=bold
+ endif
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ if &background ==# 'dark'
+ hi Normal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi DiffChange ctermfg=darkblue ctermbg=black cterm=reverse
+ hi DiffDelete ctermfg=darkred ctermbg=black cterm=reverse
+ hi DiffText ctermfg=darkmagenta ctermbg=black cterm=reverse
+ hi Directory ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=darkyellow ctermbg=black cterm=bold,reverse,underline
+ hi LineNr ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=bold
+ hi PmenuThumb ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question ctermfg=NONE ctermbg=NONE cterm=standout
+ hi QuickFixLine ctermfg=darkmagenta ctermbg=black cterm=reverse
+ hi Search ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi SpecialKey ctermfg=NONE ctermbg=NONE cterm=bold
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkmagenta ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi StatusLineNC ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi TabLine ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=darkyellow ctermbg=black cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=standout
+ hi WildMenu ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Comment ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Constant ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Special ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Type ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarButton ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ else
+ " Light background
+ hi Normal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi DiffChange ctermfg=darkblue ctermbg=black cterm=reverse
+ hi DiffDelete ctermfg=darkred ctermbg=black cterm=reverse
+ hi DiffText ctermfg=darkmagenta ctermbg=black cterm=reverse
+ hi Directory ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=darkyellow ctermbg=black cterm=bold,reverse,underline
+ hi LineNr ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=bold
+ hi PmenuThumb ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question ctermfg=NONE ctermbg=NONE cterm=standout
+ hi QuickFixLine ctermfg=darkmagenta ctermbg=black cterm=reverse
+ hi Search ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi SpecialKey ctermfg=NONE ctermbg=NONE cterm=bold
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkmagenta ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi StatusLineNC ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi TabLine ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=darkyellow ctermbg=black cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=standout
+ hi WildMenu ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Comment ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Constant ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Special ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Type ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarButton ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ endif
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ if &background ==# 'dark'
+ hi Normal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi DiffChange ctermfg=darkblue ctermbg=black cterm=reverse
+ hi DiffDelete ctermfg=darkred ctermbg=black cterm=reverse
+ hi DiffText ctermfg=darkmagenta ctermbg=black cterm=reverse
+ hi Directory ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=darkyellow ctermbg=black cterm=bold,reverse,underline
+ hi LineNr ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=bold
+ hi PmenuThumb ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question ctermfg=NONE ctermbg=NONE cterm=standout
+ hi QuickFixLine ctermfg=darkmagenta ctermbg=black cterm=reverse
+ hi Search ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi SpecialKey ctermfg=NONE ctermbg=NONE cterm=bold
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkmagenta ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi StatusLineNC ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi TabLine ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=darkyellow ctermbg=black cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=standout
+ hi WildMenu ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Comment ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Constant ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Special ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Type ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarButton ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ else
+ " Light background
+ hi Normal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Cursor ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi DiffChange ctermfg=darkblue ctermbg=black cterm=reverse
+ hi DiffDelete ctermfg=darkred ctermbg=black cterm=reverse
+ hi DiffText ctermfg=darkmagenta ctermbg=black cterm=reverse
+ hi Directory ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi FoldColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi IncSearch ctermfg=darkyellow ctermbg=black cterm=bold,reverse,underline
+ hi LineNr ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi PmenuSel ctermfg=NONE ctermbg=NONE cterm=bold
+ hi PmenuThumb ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Question ctermfg=NONE ctermbg=NONE cterm=standout
+ hi QuickFixLine ctermfg=darkmagenta ctermbg=black cterm=reverse
+ hi Search ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi SpecialKey ctermfg=NONE ctermbg=NONE cterm=bold
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkmagenta ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi StatusLineNC ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi TabLine ctermfg=NONE ctermbg=NONE cterm=bold,underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi TabLineSel ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Title ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VertSplit ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=darkyellow ctermbg=black cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi WarningMsg ctermfg=NONE ctermbg=NONE cterm=standout
+ hi WildMenu ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Comment ctermfg=NONE ctermbg=NONE cterm=bold
+ hi Constant ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Error ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Identifier ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Special ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ hi Type ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi ToolbarButton ctermfg=NONE ctermbg=NONE cterm=bold,reverse
+ endif
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: dark0 #080808 232 black
+" Color: dark1 #d7005f 161 darkred
+" Color: dark2 #00af5f 35 darkgreen
+" Color: dark3 #d78700 172 darkyellow
+" Color: dark4 #0087d7 32 darkblue
+" Color: dark5 #d787d7 176 darkmagenta
+" Color: dark6 #00afaf 37 darkcyan
+" Color: dark7 #dadada 253 grey
+" Color: dark8 #707070 242 darkgrey
+" Color: dark9 #ff005f 197 red
+" Color: dark10 #00d75f 41 green
+" Color: dark11 #ffaf00 214 yellow
+" Color: dark12 #5fafff 75 blue
+" Color: dark13 #ff87ff 213 magenta
+" Color: dark14 #00d7d7 44 cyan
+" Color: dark15 #ffffff 231 white
+" Color: diffred #d75f5f 167 darkred
+" Color: diffgreen #00af00 34 darkgreen
+" Color: diffblue #87afd7 110 darkblue
+" Color: diffpink #d787d7 176 darkmagenta
+" Color: uipink #ff00af 199 magenta
+" Color: uilime #afff00 154 green
+" Color: uiteal #00ffaf 49 green
+" Color: uiblue #00afff 39 blue
+" Color: uipurple #af00ff 129 darkmagenta
+" Color: uiamber #ffaf00 214 darkyellow
+" Color: uiblack #303030 236 darkgrey
+" Color: yasogrey #1c1c1c 234 black
+" Color: linenrblack #444444 238 darkgrey
+" Color: errorred #ff005f 197 red
+" Term colors: dark0 dark1 dark2 dark3 dark4 dark5 dark6 dark7
+" Term colors: dark8 dark9 dark10 dark11 dark12 dark13 dark14 dark15
+" Background: light
+" Color: brightwhite #eeeeee 255 grey
+" Color: light0 #080808 232 black
+" Color: light1 #af0000 124 darkred
+" Color: light2 #005f00 22 darkgreen
+" Color: light3 #af5f00 130 darkyellow
+" Color: light4 #005faf 25 darkblue
+" Color: light5 #870087 90 darkmagenta
+" Color: light6 #008787 30 darkcyan
+" Color: light7 #d7d7d7 188 grey
+" Color: light8 #626262 241 darkgrey
+" Color: light9 #d70000 160 red
+" Color: light10 #008700 28 green
+" Color: light11 #d78700 172 yellow
+" Color: light12 #0087d7 32 blue
+" Color: light13 #af00af 127 magenta
+" Color: light14 #00afaf 37 cyan
+" Color: light15 #ffffff 231 white
+" Color: diffred #d78787 174 red
+" Color: diffgreen #87d787 114 green
+" Color: diffblue #afafd7 146 blue
+" Color: diffpink #d787d7 176 magenta
+" Color: uipink #ff00af 199 magenta
+" Color: uilime #afff00 154 green
+" Color: uiteal #00ffaf 49 cyan
+" Color: uiblue #00afff 39 blue
+" Color: uipurple #af00ff 129 darkmagenta
+" Color: uiamber #ffaf00 214 yellow
+" Color: invisigrey #a8a8a8 248 darkgrey
+" Color: yasogrey #e4e4e4 254 grey
+" Color: errorred #ff005f 197 red
+" Term colors: light0 light1 light2 light3 light4 light5 light6 light7
+" Term colors: light8 light9 light10 light11 light12 light13 light14 light15
+" Background: any
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/ron.vim b/runtime/colors/ron.vim
new file mode 100644
index 0000000..a7302a4
--- /dev/null
+++ b/runtime/colors/ron.vim
@@ -0,0 +1,444 @@
+" Name: ron
+" Author: original author Ron Aaron <ron@ronware.org>
+" Maintainer: original maintainer Ron Aaron <ron@ronware.org>
+" Website: https://www.github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:50:56 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'ron'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+hi! link Terminal Normal
+hi! link Boolean Constant
+hi! link Character Constant
+hi! link Conditional Statement
+hi! link Debug Special
+hi! link Define PreProc
+hi! link Delimiter Special
+hi! link Exception Statement
+hi! link Float Constant
+hi! link Function Identifier
+hi! link Include PreProc
+hi! link Keyword Statement
+hi! link Macro PreProc
+hi! link Number Constant
+hi! link PopupSelected PmenuSel
+hi! link PreCondit PreProc
+hi! link Repeat Statement
+hi! link SpecialChar Special
+hi! link SpecialComment Special
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link StorageClass Type
+hi! link String Constant
+hi! link Structure Type
+hi! link Tag Special
+hi! link Typedef Type
+hi! link lCursor Cursor
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi Normal guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE
+hi ColorColumn guifg=NONE guibg=#cd0000 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#666666 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffff00 guibg=NONE gui=bold cterm=NONE
+hi QuickFixLine guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE
+hi Conceal guifg=#e5e5e5 guibg=#a9a9a9 gui=NONE cterm=NONE
+hi Cursor guifg=#ffffff guibg=#60a060 gui=NONE cterm=NONE
+hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#ffff00 guibg=#303030 gui=NONE cterm=NONE
+hi ErrorMsg guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi FoldColumn guifg=#ffffff guibg=NONE gui=NONE cterm=NONE
+hi Folded guifg=NONE guibg=#4d4d4d gui=NONE cterm=NONE
+hi IncSearch guifg=NONE guibg=#4682b4 gui=NONE cterm=NONE
+hi LineNr guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE
+hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE
+hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=NONE
+hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE
+hi NonText guifg=#ffff00 guibg=#303030 gui=NONE cterm=NONE
+hi Pmenu guifg=#ffffff guibg=#444444 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=#000000 gui=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#00cdcd gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#e5e5e5 gui=NONE cterm=NONE
+hi Question guifg=#00ff00 guibg=#000000 gui=bold cterm=NONE
+hi Search guifg=#000000 guibg=#a9a9a9 gui=bold cterm=NONE
+hi SignColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi StatusLine guifg=#00ffff guibg=#0000ff gui=bold cterm=NONE
+hi StatusLineNC guifg=#add8e6 guibg=#00008b gui=NONE cterm=NONE
+hi VertSplit guifg=#add8e6 guibg=#00008b gui=NONE cterm=NONE
+hi TabLine guifg=#000000 guibg=#008b8b gui=NONE cterm=NONE
+hi TabLineFill guifg=#a9a9a9 guibg=#7f7f7f gui=NONE cterm=NONE
+hi TabLineSel guifg=#00ffff guibg=#000000 gui=bold cterm=NONE
+hi Terminal guifg=#00ffff guibg=#000000 gui=NONE cterm=NONE
+hi Title guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE
+hi Visual guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline
+hi WarningMsg guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#ffffff guibg=NONE guisp=#ffffff gui=undercurl cterm=underline
+hi SpellLocal guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline
+hi SpellRare guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline
+hi Comment guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#00ffff guibg=NONE gui=bold cterm=NONE
+hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi Identifier guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE
+hi Label guifg=#eec900 guibg=NONE gui=NONE cterm=NONE
+hi Operator guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#eea9b8 guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#ffff00 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#add8e6 guibg=NONE gui=NONE cterm=NONE
+hi Todo guifg=#000000 guibg=#ffa500 gui=NONE cterm=NONE
+hi Type guifg=#2e8b57 guibg=NONE gui=bold cterm=NONE
+hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline
+hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=NONE
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi Normal ctermfg=51 ctermbg=16 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=160 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=59 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=59 cterm=NONE
+ hi CursorLineNr ctermfg=226 ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=44 cterm=NONE
+ hi Conceal ctermfg=254 ctermbg=145 cterm=NONE
+ hi Cursor ctermfg=231 ctermbg=71 cterm=NONE
+ hi Directory ctermfg=51 ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=226 ctermbg=236 cterm=NONE
+ hi ErrorMsg ctermfg=196 ctermbg=231 cterm=reverse
+ hi FoldColumn ctermfg=231 ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=239 cterm=NONE
+ hi IncSearch ctermfg=NONE ctermbg=67 cterm=NONE
+ hi LineNr ctermfg=145 ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=44 cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=226 ctermbg=236 cterm=NONE
+ hi Pmenu ctermfg=231 ctermbg=238 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=16 cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=44 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=254 cterm=NONE
+ hi Question ctermfg=46 ctermbg=16 cterm=NONE
+ hi Search ctermfg=16 ctermbg=145 cterm=NONE
+ hi SignColumn ctermfg=51 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=51 ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=51 ctermbg=21 cterm=NONE
+ hi StatusLineNC ctermfg=152 ctermbg=20 cterm=NONE
+ hi VertSplit ctermfg=152 ctermbg=20 cterm=NONE
+ hi TabLine ctermfg=16 ctermbg=44 cterm=NONE
+ hi TabLineFill ctermfg=145 ctermbg=102 cterm=NONE
+ hi TabLineSel ctermfg=51 ctermbg=16 cterm=NONE
+ hi Terminal ctermfg=51 ctermbg=16 cterm=NONE
+ hi Title ctermfg=145 ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline
+ hi WarningMsg ctermfg=226 ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=231 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=226 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=201 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=46 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=51 ctermbg=NONE cterm=NONE
+ hi Error ctermfg=196 ctermbg=231 cterm=reverse
+ hi Identifier ctermfg=51 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=16 ctermbg=16 cterm=NONE
+ hi Label ctermfg=220 ctermbg=NONE cterm=NONE
+ hi Operator ctermfg=214 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=217 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=226 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=152 ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=16 ctermbg=214 cterm=NONE
+ hi Type ctermfg=29 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=111 ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=16 ctermbg=254 cterm=NONE
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=cyan ctermbg=black cterm=NONE
+ hi ColorColumn ctermfg=cyan ctermbg=darkred cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=underline
+ hi QuickFixLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=grey cterm=NONE
+ hi Cursor ctermfg=white ctermbg=green cterm=NONE
+ hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=yellow ctermbg=darkgrey cterm=NONE
+ hi ErrorMsg ctermfg=red ctermbg=white cterm=reverse
+ hi FoldColumn ctermfg=white ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi IncSearch ctermfg=NONE ctermbg=blue cterm=NONE
+ hi LineNr ctermfg=grey ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=yellow ctermbg=darkgrey cterm=NONE
+ hi Pmenu ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE
+ hi Question ctermfg=green ctermbg=black cterm=NONE
+ hi Search ctermfg=black ctermbg=grey cterm=NONE
+ hi SignColumn ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=cyan ctermbg=darkblue cterm=NONE
+ hi StatusLineNC ctermfg=darkcyan ctermbg=darkblue cterm=NONE
+ hi VertSplit ctermfg=darkcyan ctermbg=darkblue cterm=NONE
+ hi TabLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi TabLineFill ctermfg=grey ctermbg=darkgrey cterm=NONE
+ hi TabLineSel ctermfg=cyan ctermbg=black cterm=NONE
+ hi Terminal ctermfg=cyan ctermbg=black cterm=NONE
+ hi Title ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline
+ hi WarningMsg ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=white ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=yellow ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=magenta ctermbg=NONE cterm=underline
+ hi Comment ctermfg=green ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Error ctermfg=red ctermbg=white cterm=reverse
+ hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=black ctermbg=black cterm=NONE
+ hi Label ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi Operator ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Special ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=blue ctermbg=NONE cterm=underline
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=darkcyan ctermbg=black cterm=NONE
+ hi ColorColumn ctermfg=darkcyan ctermbg=darkred cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=underline
+ hi QuickFixLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=grey cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi EndOfBuffer ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=darkred ctermbg=grey cterm=reverse
+ hi FoldColumn ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Folded ctermfg=darkcyan ctermbg=black cterm=reverse
+ hi IncSearch ctermfg=darkyellow ctermbg=darkblue cterm=NONE
+ hi LineNr ctermfg=grey ctermbg=NONE cterm=bold
+ hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=bold
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi NonText ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Pmenu ctermfg=grey ctermbg=darkgrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE
+ hi Question ctermfg=darkgreen ctermbg=black cterm=bold
+ hi Search ctermfg=black ctermbg=grey cterm=NONE
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=darkblue ctermbg=grey cterm=bold,reverse
+ hi StatusLineNC ctermfg=darkblue ctermbg=grey cterm=reverse
+ hi VertSplit ctermfg=darkblue ctermbg=darkblue cterm=NONE
+ hi TabLine ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi TabLineFill ctermfg=darkblue ctermbg=darkblue cterm=NONE
+ hi TabLineSel ctermfg=darkcyan ctermbg=black cterm=bold
+ hi Terminal ctermfg=darkcyan ctermbg=black cterm=NONE
+ hi Title ctermfg=grey ctermbg=NONE cterm=bold
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline
+ hi WarningMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkyellow ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi Comment ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Error ctermfg=darkred ctermbg=grey cterm=bold,reverse
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=black ctermbg=black cterm=NONE
+ hi Label ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Operator ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Statement ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Todo ctermfg=black ctermbg=darkyellow cterm=bold
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: xterm0 #000000 16 black
+" Color: xterm1 #cd0000 160 darkred
+" Color: xterm2 #00cd00 40 darkgreen
+" Color: xterm3 #cdcd00 184 darkyellow
+" Color: xterm4 #0000ee 20 darkblue
+" Color: xterm5 #cd00cd 164 darkmagenta
+" Color: xterm6 #00cdcd 44 darkcyan
+" Color: xterm7 #e5e5e5 254 grey
+" Color: xterm8 #7f7f7f 102 darkgrey
+" Color: xterm9 #ff0000 196 red
+" Color: xterm10 #00ff00 46 green
+" Color: xterm11 #ffff00 226 yellow
+" Color: xterm12 #5c5cff 63 blue
+" Color: xterm13 #ff00ff 201 magenta
+" Color: xterm14 #00ffff 51 cyan
+" Color: xterm15 #ffffff 231 white
+" Color: rgbGrey40 #666666 59 darkgrey
+" Color: rgbDarkGrey #a9a9a9 145 grey
+" Color: rgbDarkBlue #00008b 20 darkblue
+" Color: rgbBlue #0000ff 21 darkblue
+" Color: rgbDarkCyan #008b8b 44 darkcyan
+" Color: Directory #00ffff 51 cyan
+" Color: rgbSeaGreen #2e8b57 29 darkgreen
+" Color: rgbGrey #bebebe 250 grey
+" Color: Question #00ff00 46 green
+" Color: SignColumn #a9a9a9 248 grey
+" Color: SpecialKey #00ffff 51 cyan
+" Color: StatusLineTerm #90ee90 120 darkgreen
+" Color: ToolbarLine #7f7f7f 244 darkgrey
+" Color: Underlined #80a0ff 111 blue
+" Color: Pmenu #444444 238 darkgrey
+" Color: ron303030 #303030 236 darkgrey
+" Color: ronLightBlue #add8e6 152 darkcyan
+" Color: ronPink2 #eea9b8 217 darkmagenta
+" Color: ronOrange #ffa500 214 darkyellow
+" Color: ronCursor #60a060 71 green
+" Color: ronSteelBlue #4682b4 67 blue
+" Color: ronGold2 #eec900 220 yellow
+" Color: ronDarkGreen #006400 22 darkgreen
+" Color: ronSlateBlue #6a5acd 62 blue
+" Color: ronOliveDrab #6b8e23 64 green
+" Color: ronCoral #ff7f50 209 red
+" Color: ronGray30 #4d4d4d 239 darkgrey
+" Term colors: xterm0 xterm1 xterm2 xterm3 xterm4 xterm5 xterm6 xterm7
+" Term colors: xterm8 xterm9 xterm10 xterm11 xterm12 xterm13
+" Term colors: xterm14 xterm15
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/shine.vim b/runtime/colors/shine.vim
new file mode 100644
index 0000000..fe1ee15
--- /dev/null
+++ b/runtime/colors/shine.vim
@@ -0,0 +1,416 @@
+" Name: shine
+" Description: Light colorscheme inspired by normal text editors.
+" Author: Original author is Yasuhiro Matsumoto <mattn@mail.goo.ne.jp>
+" Maintainer: Original maintainer is Yasuhiro Matsumoto <mattn@mail.goo.ne.jp>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:51:42 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=light
+
+hi clear
+let g:colors_name = 'shine'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#8b0000', '#006400', '#ffff00', '#00008b', '#6a0dad', '#008b8b', '#dadada', '#767676', '#ffafaf', '#90ee90', '#ffff60', '#add8e6', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link EndOfBuffer NonText
+hi! link ErrorMsg Error
+hi! link Tag Special
+hi! link Operator Statement
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+hi Folded guifg=#00008b guibg=#dadada gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#dadada gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#dadada gui=NONE cterm=NONE
+hi CursorLineNr guifg=NONE guibg=#dadada gui=NONE cterm=NONE
+hi QuickFixLine guifg=#000000 guibg=#ff8c00 gui=NONE cterm=NONE
+hi StatusLine guifg=#ffffff guibg=#000000 gui=bold cterm=bold
+hi StatusLineNC guifg=#ffffff guibg=#a8a8a8 gui=NONE cterm=NONE
+hi StatusLineTerm guifg=#000000 guibg=#90ee90 gui=bold cterm=bold
+hi StatusLineTermNC guifg=#dadada guibg=#006400 gui=NONE cterm=NONE
+hi VertSplit guifg=#a8a8a8 guibg=#a8a8a8 gui=NONE cterm=NONE
+hi Pmenu guifg=#000000 guibg=#a8a8a8 gui=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#ffff60 gui=NONE cterm=NONE
+hi PmenuSbar guifg=#ffffff guibg=#ffffff gui=NONE cterm=NONE
+hi PmenuThumb guifg=#767676 guibg=#767676 gui=NONE cterm=NONE
+hi TabLine guifg=#000000 guibg=#dadada gui=underline cterm=underline
+hi TabLineFill guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+hi TabLineSel guifg=#000000 guibg=#ffffff gui=bold cterm=bold
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi ToolbarButton guifg=NONE guibg=#a8a8a8 gui=bold cterm=bold
+hi NonText guifg=#add8e6 guibg=#ffffff gui=NONE cterm=NONE
+hi SpecialKey guifg=#add8e6 guibg=NONE gui=NONE cterm=NONE
+hi Visual guifg=#000000 guibg=#a8a8a8 gui=NONE cterm=NONE
+hi VisualNOS guifg=NONE guibg=NONE gui=bold,underline ctermfg=NONE ctermbg=NONE cterm=underline
+hi LineNr guifg=#767676 guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#767676 guibg=NONE gui=NONE cterm=NONE
+hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Underlined guifg=#6a0dad guibg=NONE gui=underline cterm=underline
+hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi WarningMsg guifg=#6a0dad guibg=#ffffff gui=NONE cterm=NONE
+hi MoreMsg guifg=#006400 guibg=#ffffff gui=NONE cterm=NONE
+hi ModeMsg guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+hi Question guifg=#a07070 guibg=NONE gui=NONE cterm=NONE
+hi Todo guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi MatchParen guifg=#ffffff guibg=#ffafaf gui=NONE cterm=NONE
+hi Search guifg=#ffffff guibg=#6a0dad gui=NONE cterm=NONE
+hi IncSearch guifg=#008b8b guibg=#ffff00 gui=reverse cterm=reverse
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=bold cterm=bold
+hi ColorColumn guifg=#000000 guibg=#ffafaf gui=NONE cterm=NONE
+hi Cursor guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE
+hi lCursor guifg=#000000 guibg=#a07070 gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#2e8b57 guibg=NONE guisp=#2e8b57 gui=undercurl cterm=underline
+hi SpellLocal guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline
+hi SpellRare guifg=#00008b guibg=NONE guisp=#00008b gui=undercurl cterm=underline
+hi Statement guifg=#2e8b57 guibg=NONE gui=bold cterm=bold
+hi Type guifg=#2e8b57 guibg=NONE gui=bold cterm=bold
+hi Comment guifg=#a8a8a8 guibg=NONE gui=bold cterm=NONE
+hi StorageClass guifg=#ff0000 guibg=NONE gui=bold cterm=bold
+hi Conceal guifg=#dadada guibg=#767676 gui=NONE cterm=NONE
+hi Identifier guifg=#008b8b guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#a07070 guibg=NONE gui=NONE cterm=NONE
+hi Number guifg=#a07070 guibg=NONE gui=bold cterm=bold
+hi Float guifg=#a07070 guibg=NONE gui=bold cterm=bold
+hi PreProc guifg=#6a0dad guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#ff8c00 guibg=NONE gui=NONE cterm=NONE
+hi SpecialChar guifg=#00008b guibg=NONE gui=NONE cterm=NONE
+hi Directory guifg=#008b8b guibg=NONE gui=bold cterm=bold
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Title guifg=#006400 guibg=NONE gui=bold cterm=bold
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link EndOfBuffer NonText
+ hi! link ErrorMsg Error
+ hi! link Tag Special
+ hi! link Operator Statement
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=16 ctermbg=231 cterm=NONE
+ hi Folded ctermfg=18 ctermbg=253 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=253 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=253 cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=253 cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=208 cterm=NONE
+ hi StatusLine ctermfg=231 ctermbg=16 cterm=bold
+ hi StatusLineNC ctermfg=231 ctermbg=248 cterm=NONE
+ hi StatusLineTerm ctermfg=16 ctermbg=120 cterm=bold
+ hi StatusLineTermNC ctermfg=253 ctermbg=22 cterm=NONE
+ hi VertSplit ctermfg=248 ctermbg=248 cterm=NONE
+ hi Pmenu ctermfg=16 ctermbg=248 cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=228 cterm=NONE
+ hi PmenuSbar ctermfg=231 ctermbg=231 cterm=NONE
+ hi PmenuThumb ctermfg=243 ctermbg=243 cterm=NONE
+ hi TabLine ctermfg=16 ctermbg=253 cterm=underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=16 ctermbg=231 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=NONE ctermbg=248 cterm=bold
+ hi NonText ctermfg=153 ctermbg=231 cterm=NONE
+ hi SpecialKey ctermfg=153 ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=16 ctermbg=248 cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi LineNr ctermfg=243 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=243 ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=55 ctermbg=NONE cterm=underline
+ hi Error ctermfg=196 ctermbg=231 cterm=reverse
+ hi WarningMsg ctermfg=55 ctermbg=231 cterm=NONE
+ hi MoreMsg ctermfg=22 ctermbg=231 cterm=NONE
+ hi ModeMsg ctermfg=16 ctermbg=231 cterm=NONE
+ hi Question ctermfg=95 ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=16 ctermbg=226 cterm=NONE
+ hi MatchParen ctermfg=231 ctermbg=217 cterm=NONE
+ hi Search ctermfg=231 ctermbg=55 cterm=NONE
+ hi IncSearch ctermfg=30 ctermbg=226 cterm=reverse
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=bold
+ hi ColorColumn ctermfg=16 ctermbg=217 cterm=NONE
+ hi Cursor ctermfg=231 ctermbg=16 cterm=NONE
+ hi lCursor ctermfg=16 ctermbg=95 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=29 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=201 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=18 ctermbg=NONE cterm=underline
+ hi Statement ctermfg=29 ctermbg=NONE cterm=bold
+ hi Type ctermfg=29 ctermbg=NONE cterm=bold
+ hi Comment ctermfg=248 ctermbg=NONE cterm=NONE
+ hi StorageClass ctermfg=196 ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=253 ctermbg=243 cterm=NONE
+ hi Identifier ctermfg=30 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=95 ctermbg=NONE cterm=NONE
+ hi Number ctermfg=95 ctermbg=NONE cterm=bold
+ hi Float ctermfg=95 ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=55 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=208 ctermbg=NONE cterm=NONE
+ hi SpecialChar ctermfg=18 ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=30 ctermbg=NONE cterm=bold
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=22 ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=black ctermbg=white cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi StatusLine ctermfg=white ctermbg=black cterm=bold
+ hi StatusLineNC ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi StatusLineTerm ctermfg=black ctermbg=green cterm=bold
+ hi StatusLineTermNC ctermfg=grey ctermbg=darkgreen cterm=NONE
+ hi VertSplit ctermfg=darkgrey ctermbg=darkgrey cterm=NONE
+ hi Pmenu ctermfg=black ctermbg=darkgrey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE
+ hi PmenuSbar ctermfg=white ctermbg=white cterm=NONE
+ hi PmenuThumb ctermfg=darkgrey ctermbg=darkgrey cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=black ctermbg=white cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=NONE ctermbg=darkgrey cterm=bold
+ hi NonText ctermfg=blue ctermbg=white cterm=NONE
+ hi SpecialKey ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=black ctermbg=darkgrey cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=darkmagenta ctermbg=NONE cterm=underline
+ hi Error ctermfg=red ctermbg=white cterm=reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=white cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=white cterm=NONE
+ hi ModeMsg ctermfg=black ctermbg=white cterm=NONE
+ hi Question ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=black ctermbg=yellow cterm=NONE
+ hi MatchParen ctermfg=white ctermbg=red cterm=NONE
+ hi Search ctermfg=white ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=darkcyan ctermbg=yellow cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=bold
+ hi ColorColumn ctermfg=black ctermbg=red cterm=NONE
+ hi Cursor ctermfg=white ctermbg=black cterm=NONE
+ hi lCursor ctermfg=black ctermbg=darkred cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkgreen ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=magenta ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkblue ctermbg=NONE cterm=underline
+ hi Statement ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Comment ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi StorageClass ctermfg=red ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=grey ctermbg=darkgrey cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Number ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Float ctermfg=darkred ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi SpecialChar ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=black ctermbg=grey cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi StatusLine ctermfg=black ctermbg=grey cterm=bold,reverse
+ hi StatusLineNC ctermfg=black ctermbg=grey cterm=reverse
+ hi StatusLineTerm ctermfg=black ctermbg=darkgreen cterm=bold,reverse
+ hi StatusLineTermNC ctermfg=grey ctermbg=darkgreen cterm=reverse
+ hi VertSplit ctermfg=black ctermbg=grey cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuSbar ctermfg=grey ctermbg=grey cterm=NONE
+ hi PmenuThumb ctermfg=black ctermbg=black cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=reverse
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=grey ctermbg=black cterm=reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=grey cterm=bold,reverse
+ hi NonText ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi LineNr ctermfg=NONE ctermbg=NONE cterm=bold
+ hi FoldColumn ctermfg=grey ctermbg=NONE cterm=bold
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Error ctermfg=darkred ctermbg=NONE cterm=bold,reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi ModeMsg ctermfg=black ctermbg=NONE cterm=NONE
+ hi Question ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi MatchParen ctermfg=grey ctermbg=darkred cterm=NONE
+ hi Search ctermfg=grey ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=darkcyan ctermbg=darkyellow cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=bold
+ hi ColorColumn ctermfg=black ctermbg=darkred cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=reverse
+ hi SpellCap ctermfg=darkgreen ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkmagenta ctermbg=NONE cterm=reverse
+ hi SpellRare ctermfg=darkblue ctermbg=NONE cterm=reverse
+ hi Statement ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Comment ctermfg=black ctermbg=NONE cterm=bold
+ hi StorageClass ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Number ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Float ctermfg=darkred ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi SpecialChar ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: light
+" Color: Black #000000 16 black
+" Color: DarkGrey #767676 243 darkgrey
+" Color: MediumGrey #A8A8A8 248 darkgrey
+" Color: LightGrey #DADADA 253 grey
+" Color: White #ffffff 231 white
+" Color: Cyan #00ffff 51 cyan
+" Color: Magenta #ff00ff 201 magenta
+" Color: Red #ff0000 196 red
+" Color: Yellow #ffff00 226 yellow
+" Color: SeaGreen #2e8b57 29 darkgreen
+" Color: DarkBlue #00008b 18 darkblue
+" Color: DarkCyan #008b8b 30 darkcyan
+" Color: DarkGreen #006400 22 darkgreen
+" Color: DarkOrange #ff8c00 208 darkyellow
+" Color: DarkRed #8b0000 88 darkred
+" Color: LightBlue #add8e6 153 blue
+" Color: LightGreen #90ee90 120 green
+" Color: LightMagenta#ff83fa 213 magenta
+" Color: LightRed #ffafaf 217 red
+" Color: MutedRed #a07070 95 darkred
+" Color: MutedYellow #ffff60 228 yellow
+" Color: Purple #6a0dad 55 darkmagenta
+" Term colors: Black DarkRed DarkGreen Yellow DarkBlue Purple DarkCyan LightGrey
+" Term colors: DarkGrey LightRed LightGreen MutedYellow LightBlue Magenta Cyan White
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/slate.vim b/runtime/colors/slate.vim
new file mode 100644
index 0000000..8c43fb6
--- /dev/null
+++ b/runtime/colors/slate.vim
@@ -0,0 +1,431 @@
+" Name: slate
+" Description: Remake of slate
+" Author: Original maintainer Ralph Amissah <ralph@amissah.com>
+" Maintainer: Original maintainer Ralph Amissah <ralph@amissah.com>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:52:25 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'slate'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#ffffff guibg=#262626 gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#5f87d7 guibg=NONE gui=NONE cterm=NONE
+hi StatusLine guifg=#000000 guibg=#afaf87 gui=NONE cterm=NONE
+hi StatusLineNC guifg=#666666 guibg=#afaf87 gui=NONE cterm=NONE
+hi StatusLineTerm guifg=#000000 guibg=#afaf87 gui=NONE cterm=NONE
+hi StatusLineTermNC guifg=#666666 guibg=#afaf87 gui=NONE cterm=NONE
+hi VertSplit guifg=#666666 guibg=#afaf87 gui=NONE cterm=NONE
+hi PmenuSel guifg=#262626 guibg=#d7d787 gui=NONE cterm=NONE
+hi Pmenu guifg=NONE guibg=#4a4a4a gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=#262626 gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#ffd700 gui=NONE cterm=NONE
+hi TabLineSel guifg=#000000 guibg=#afaf87 gui=NONE cterm=NONE
+hi TabLine guifg=#666666 guibg=#333333 gui=NONE cterm=NONE
+hi TabLineFill guifg=#ff8787 guibg=#333333 gui=NONE cterm=NONE
+hi ToolbarLine guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi ToolbarButton guifg=#262626 guibg=#d7d787 gui=NONE cterm=NONE
+hi NonText guifg=#5f87d7 guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#00875f guibg=NONE gui=NONE cterm=NONE
+hi QuickFixLine guifg=#000000 guibg=#5f87d7 gui=NONE cterm=NONE
+hi Folded guifg=#666666 guibg=#000000 gui=NONE cterm=NONE
+hi FoldColumn guifg=#5f87d7 guibg=#000000 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#333333 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#333333 gui=NONE cterm=NONE
+hi ColorColumn guifg=NONE guibg=#000000 gui=NONE cterm=NONE
+hi CursorLineNr guifg=NONE guibg=#333333 gui=NONE cterm=NONE
+hi Visual guifg=#d7d787 guibg=#5f8700 gui=NONE cterm=NONE
+hi SignColumn guifg=NONE guibg=#262626 gui=NONE cterm=NONE
+hi VisualNOS guifg=#d7d787 guibg=#5f8700 gui=NONE cterm=NONE
+hi LineNr guifg=#666666 guibg=NONE gui=NONE cterm=NONE
+hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi ErrorMsg guifg=#ff0000 guibg=#000000 gui=reverse cterm=reverse
+hi ModeMsg guifg=#262626 guibg=#ffd700 gui=NONE cterm=NONE
+hi WarningMsg guifg=#ff8787 guibg=NONE gui=NONE cterm=NONE
+hi MoreMsg guifg=#00875f guibg=NONE gui=NONE cterm=NONE
+hi Question guifg=#ffd700 guibg=NONE gui=NONE cterm=NONE
+hi MatchParen guifg=#000000 guibg=#ffd700 gui=NONE cterm=NONE
+hi Search guifg=#000000 guibg=#d7875f gui=NONE cterm=NONE
+hi IncSearch guifg=#000000 guibg=#00ff00 gui=NONE cterm=NONE
+hi Todo guifg=#ff0000 guibg=#ffff00 gui=NONE cterm=NONE
+hi WildMenu guifg=#262626 guibg=#d7d787 gui=NONE cterm=NONE
+hi Underlined guifg=#5f87d7 guibg=NONE gui=underline cterm=underline
+hi Cursor guifg=#333333 guibg=#d7d787 gui=NONE cterm=NONE
+hi lCursor guifg=#262626 guibg=#ffafaf gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#ffff00 guibg=NONE guisp=#ffff00 gui=undercurl cterm=underline
+hi SpellLocal guifg=#ffafaf guibg=NONE guisp=#ffafaf gui=undercurl cterm=underline
+hi SpellRare guifg=#ffd7af guibg=NONE guisp=#ffd7af gui=undercurl cterm=underline
+hi Comment guifg=#666666 guibg=NONE gui=NONE cterm=NONE
+hi String guifg=#87d7ff guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#ff8787 guibg=NONE gui=NONE cterm=NONE
+hi Function guifg=#ffd7af guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#d7d787 guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#5f87d7 guibg=NONE gui=bold cterm=bold
+hi Constant guifg=#ffafaf guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#d7875f guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#5f87d7 guibg=NONE gui=bold cterm=bold
+hi Operator guifg=#d7875f guibg=NONE gui=NONE cterm=NONE
+hi Define guifg=#ffd700 guibg=NONE gui=bold cterm=bold
+hi Structure guifg=#00ff00 guibg=NONE gui=NONE cterm=NONE
+hi Directory guifg=#00875f guibg=NONE gui=bold cterm=bold
+hi Conceal guifg=#666666 guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Title guifg=#ffd700 guibg=NONE gui=bold cterm=bold
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=231 ctermbg=235 cterm=NONE
+ hi EndOfBuffer ctermfg=68 ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=16 ctermbg=144 cterm=NONE
+ hi StatusLineNC ctermfg=241 ctermbg=144 cterm=NONE
+ hi StatusLineTerm ctermfg=16 ctermbg=144 cterm=NONE
+ hi StatusLineTermNC ctermfg=241 ctermbg=144 cterm=NONE
+ hi VertSplit ctermfg=241 ctermbg=144 cterm=NONE
+ hi PmenuSel ctermfg=235 ctermbg=186 cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=239 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=235 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=220 cterm=NONE
+ hi TabLineSel ctermfg=16 ctermbg=144 cterm=NONE
+ hi TabLine ctermfg=241 ctermbg=236 cterm=NONE
+ hi TabLineFill ctermfg=210 ctermbg=236 cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=235 ctermbg=186 cterm=NONE
+ hi NonText ctermfg=68 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=29 ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=68 cterm=NONE
+ hi Folded ctermfg=241 ctermbg=16 cterm=NONE
+ hi FoldColumn ctermfg=68 ctermbg=16 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=236 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=236 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=16 cterm=NONE
+ hi CursorLineNr ctermfg=NONE ctermbg=236 cterm=NONE
+ hi Visual ctermfg=186 ctermbg=64 cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=235 cterm=NONE
+ hi VisualNOS ctermfg=186 ctermbg=64 cterm=NONE
+ hi LineNr ctermfg=241 ctermbg=NONE cterm=NONE
+ hi Error ctermfg=196 ctermbg=231 cterm=reverse
+ hi ErrorMsg ctermfg=196 ctermbg=16 cterm=reverse
+ hi ModeMsg ctermfg=235 ctermbg=220 cterm=NONE
+ hi WarningMsg ctermfg=210 ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=29 ctermbg=NONE cterm=NONE
+ hi Question ctermfg=220 ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=16 ctermbg=220 cterm=NONE
+ hi Search ctermfg=16 ctermbg=173 cterm=NONE
+ hi IncSearch ctermfg=16 ctermbg=46 cterm=NONE
+ hi Todo ctermfg=196 ctermbg=226 cterm=NONE
+ hi WildMenu ctermfg=235 ctermbg=186 cterm=NONE
+ hi Underlined ctermfg=68 ctermbg=NONE cterm=underline
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=226 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=217 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=223 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=241 ctermbg=NONE cterm=NONE
+ hi String ctermfg=117 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=210 ctermbg=NONE cterm=NONE
+ hi Function ctermfg=223 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=186 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=68 ctermbg=NONE cterm=bold
+ hi Constant ctermfg=217 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=173 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=68 ctermbg=NONE cterm=bold
+ hi Operator ctermfg=173 ctermbg=NONE cterm=NONE
+ hi Define ctermfg=220 ctermbg=NONE cterm=bold
+ hi Structure ctermfg=46 ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=29 ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=241 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=220 ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi EndOfBuffer ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi StatusLine ctermfg=white ctermbg=black cterm=bold,reverse
+ hi StatusLineNC ctermfg=black ctermbg=grey cterm=NONE
+ hi StatusLineTerm ctermfg=white ctermbg=black cterm=bold,reverse
+ hi StatusLineTermNC ctermfg=black ctermbg=grey cterm=NONE
+ hi VertSplit ctermfg=darkgrey ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Pmenu ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=yellow cterm=NONE
+ hi TabLineSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi TabLine ctermfg=grey ctermbg=darkgrey cterm=NONE
+ hi TabLineFill ctermfg=cyan ctermbg=darkgrey cterm=NONE
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi NonText ctermfg=blue ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=green ctermbg=NONE cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=blue cterm=NONE
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=bold
+ hi ColorColumn ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi Visual ctermfg=yellow ctermbg=darkgreen cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=black cterm=NONE
+ hi VisualNOS ctermfg=darkmagenta ctermbg=darkgreen cterm=NONE
+ hi LineNr ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Error ctermfg=darkred ctermbg=white cterm=reverse
+ hi ErrorMsg ctermfg=darkred ctermbg=black cterm=reverse
+ hi ModeMsg ctermfg=black ctermbg=yellow cterm=NONE
+ hi WarningMsg ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=green ctermbg=NONE cterm=NONE
+ hi Question ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=yellow cterm=NONE
+ hi Search ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi Todo ctermfg=black ctermbg=yellow cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Underlined ctermfg=blue ctermbg=NONE cterm=underline
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=darkyellow ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi Statement ctermfg=blue ctermbg=NONE cterm=bold
+ hi Identifier ctermfg=red ctermbg=NONE cterm=bold
+ hi Comment ctermfg=darkgray ctermbg=NONE cterm=NONE
+ hi Operator ctermfg=red ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=red ctermbg=NONE cterm=NONE
+ hi Structure ctermfg=green ctermbg=NONE cterm=NONE
+ hi Function ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi Type ctermfg=blue ctermbg=NONE cterm=bold
+ hi Define ctermfg=yellow ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi String ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi EndOfBuffer ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi StatusLine ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi StatusLineNC ctermfg=grey ctermbg=black cterm=reverse
+ hi StatusLineTerm ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi StatusLineTermNC ctermfg=grey ctermbg=black cterm=reverse
+ hi VertSplit ctermfg=grey ctermbg=black cterm=reverse
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkyellow cterm=NONE
+ hi TabLineSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi TabLine ctermfg=grey ctermbg=black cterm=reverse
+ hi TabLineFill ctermfg=grey ctermbg=black cterm=reverse
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi NonText ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=black ctermbg=darkblue cterm=NONE
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi ColorColumn ctermfg=grey ctermbg=darkred cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi VisualNOS ctermfg=darkmagenta ctermbg=darkgreen cterm=underline
+ hi LineNr ctermfg=grey ctermbg=NONE cterm=bold
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Error ctermfg=darkred ctermbg=grey cterm=reverse
+ hi ErrorMsg ctermfg=darkred ctermbg=black cterm=reverse
+ hi ModeMsg ctermfg=NONE ctermbg=darkyellow cterm=NONE
+ hi WarningMsg ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Question ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Search ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=darkgreen cterm=NONE
+ hi Todo ctermfg=black ctermbg=yellow cterm=NONE
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi Underlined ctermfg=blue ctermbg=NONE cterm=underline
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkyellow ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi Statement ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Identifier ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Comment ctermfg=darkgray ctermbg=NONE cterm=bold
+ hi Operator ctermfg=darkred ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkred ctermbg=NONE cterm=bold
+ hi Structure ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Function ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Type ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Define ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi Constant ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi String ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkyellow ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: x_black #000000 16 black
+" Color: x_darkred #cd0000 160 darkred
+" Color: x_darkgreen #00cd00 40 darkgreen
+" Color: x_darkyellow #cdcd00 184 darkyellow
+" Color: x_darkblue #0000ee 21 darkblue
+" Color: x_darkmagenta #cd00cd 164 darkmagenta
+" Color: x_darkcyan #00cdcd 44 darkcyan
+" Color: x_gray #e5e5e5 254 gray
+" Color: x_darkgray #7f7f7f 244 darkgray
+" Color: x_red #ff0000 196 red
+" Color: x_green #00ff00 46 green
+" Color: x_yellow #ffff00 226 yellow
+" Color: x_blue #5c5cff 63 blue
+" Color: x_magenta #ff00ff 201 magenta
+" Color: x_cyan #00ffff 51 cyan
+" Color: x_white #ffffff 231 white
+" Color: foreground #FFFFFF 231 white
+" Color: background #262626 235 black
+" Color: color00 #000000 16 black
+" Color: color08 #333333 236 darkgrey
+" Color: color01 #FF0000 196 darkred
+" Color: color09 #FFAFAF 217 red
+" Color: color02 #5F8700 64 darkgreen
+" Color: color10 #00875F 29 green
+" Color: color03 #ffff00 226 darkyellow
+" Color: color11 #FFD700 220 yellow
+" Color: color04 #87d7FF 117 darkblue
+" Color: color12 #5F87D7 68 blue
+" Color: color05 #d7d787 186 darkmagenta
+" Color: color13 #AFAF87 144 magenta
+" Color: color06 #FFD7AF 223 darkcyan
+" Color: color14 #FF8787 210 cyan
+" Color: color07 #666666 241 grey
+" Color: color15 #FFFFFF 231 white
+" Color: color16 #D7875F 173 darkmagenta
+" Color: color17 #00FF00 46 darkgreen
+" Color: Pmenu #4A4A4A 239 darkgrey
+" Term colors: x_black x_darkred x_darkgreen x_darkyellow x_darkblue x_darkmagenta x_darkcyan x_gray
+" Term colors: x_darkgray x_red x_green x_yellow x_blue x_magenta x_cyan x_white
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/tools/check_colors.vim b/runtime/colors/tools/check_colors.vim
new file mode 100644
index 0000000..c3fb226
--- /dev/null
+++ b/runtime/colors/tools/check_colors.vim
@@ -0,0 +1,221 @@
+vim9script
+# This script tests a color scheme for some errors and lists potential errors.
+# Load the scheme and source this script, like this:
+# :edit colors/desert.vim | :ru colors/tools/check_colors.vim
+
+def Test_check_colors()
+ const savedview = winsaveview()
+ cursor(1, 1)
+
+ # err is
+ # {
+ # colors_name: "message",
+ # init: "message",
+ # background: "message",
+ # ....etc
+ # highlight: {
+ # 'Normal': "Missing ...",
+ # 'Conceal': "Missing ..."
+ # ....etc
+ # }
+ # }
+ var err: dict<any> = {}
+
+ # 1) Check g:colors_name is existing
+ if search('\<\%(g:\)\?colors_name\>', 'cnW') == 0
+ err['colors_name'] = 'g:colors_name not set'
+ else
+ err['colors_name'] = 'OK'
+ endif
+
+ # 2) Check for some well-defined highlighting groups
+ const hi_groups = [
+ 'ColorColumn',
+ 'Comment',
+ 'Conceal',
+ 'Constant',
+ 'CurSearch',
+ 'Cursor',
+ 'CursorColumn',
+ 'CursorLine',
+ 'CursorLineNr',
+ 'CursorLineFold',
+ 'CursorLineSign',
+ 'DiffAdd',
+ 'DiffChange',
+ 'DiffDelete',
+ 'DiffText',
+ 'Directory',
+ 'EndOfBuffer',
+ 'Error',
+ 'ErrorMsg',
+ 'FoldColumn',
+ 'Folded',
+ 'Identifier',
+ 'Ignore',
+ 'IncSearch',
+ 'LineNr',
+ 'LineNrAbove',
+ 'LineNrBelow',
+ 'MatchParen',
+ 'ModeMsg',
+ 'MoreMsg',
+ 'NonText',
+ 'Normal',
+ 'Pmenu',
+ 'PmenuSbar',
+ 'PmenuSel',
+ 'PmenuThumb',
+ 'PreProc',
+ 'Question',
+ 'QuickFixLine',
+ 'Search',
+ 'SignColumn',
+ 'Special',
+ 'SpecialKey',
+ 'SpellBad',
+ 'SpellCap',
+ 'SpellLocal',
+ 'SpellRare',
+ 'Statement',
+ 'StatusLine',
+ 'StatusLineNC',
+ 'StatusLineTerm',
+ 'StatusLineTermNC',
+ 'TabLine',
+ 'TabLineFill',
+ 'TabLineSel',
+ 'Title',
+ 'Todo',
+ 'ToolbarButton',
+ 'ToolbarLine',
+ 'Type',
+ 'Underlined',
+ 'VertSplit',
+ 'Visual',
+ 'VisualNOS',
+ 'WarningMsg',
+ 'WildMenu',
+ 'debugPC',
+ 'debugBreakpoint',
+ ]
+ var groups = {}
+ for group in hi_groups
+ if search('\c@suppress\s\+\<' .. group .. '\>', 'cnW') != 0
+ # skip check, if the script contains a line like
+ # @suppress Visual:
+ continue
+ endif
+ if search('hi\%[ghlight]!\= \+link \+' .. group, 'cnW') != 0 # Linked group
+ continue
+ endif
+ if search('hi\%[ghlight] \+\<' .. group .. '\>', 'cnW') == 0
+ groups[group] = 'No highlight definition for ' .. group
+ continue
+ endif
+ if search('hi\%[ghlight] \+\<' .. group .. '\>.*[bf]g=', 'cnW') == 0
+ groups[group] = 'Missing foreground or background color for ' .. group
+ continue
+ endif
+ if search('hi\%[ghlight] \+\<' .. group .. '\>.*guibg=', 'cnW') != 0
+ && search('hi\%[ghlight] \+\<' .. group .. '\>.*ctermbg=', 'cnW') == 0
+ && group != 'Cursor'
+ groups[group] = 'Missing bg terminal color for ' .. group
+ continue
+ endif
+ if search('hi\%[ghlight] \+\<' .. group .. '\>.*guifg=', 'cnW') == 0
+ && group !~ '^Diff'
+ groups[group] = 'Missing guifg definition for ' .. group
+ continue
+ endif
+ if search('hi\%[ghlight] \+\<' .. group .. '\>.*ctermfg=', 'cnW') == 0
+ && group !~ '^Diff'
+ && group != 'Cursor'
+ groups[group] = 'Missing ctermfg definition for ' .. group
+ continue
+ endif
+ # do not check for background colors, they could be intentionally left out
+ cursor(1, 1)
+ endfor
+ 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?
+ const bg_set = '\(set\?\|setl\(ocal\)\?\) .*\(background\|bg\)=\(dark\|light\)'
+ const bg_let = 'let \%([&]\%([lg]:\)\?\)\%(background\|bg\)\s*=\s*\([''"]\?\)\w\+\1'
+ const bg_pat = '\%(' .. bg_set .. '\|' .. bg_let .. '\)'
+ const line = search(bg_pat, 'cnW')
+ if search(bg_pat, 'cnW') != 0
+ exe ":" .. line
+ if search('hi \U\w\+\s\+\S', 'cbnW') != 0
+ err['background'] = 'Should not set background option after :hi statement'
+ endif
+ else
+ err['background'] = 'OK'
+ endif
+ cursor(1, 1)
+
+ # 4) Check, that t_Co is checked
+ var pat = '[&]t_Co\s*[<>=]=\?\s*\d\+'
+ if search(pat, 'ncW') == 0
+ err['t_Co'] = 'Does not check terminal for capable colors'
+ endif
+
+ # 5) Initializes correctly, e.g. should have at least:
+ # hi clear
+ pat = '^\s*hi\%[ghlight]\s*clear\s*$'
+ if search(pat, 'cnW') == 0
+ err['init'] = 'No initialization'
+ endif
+
+ # 6) Does not use :syn on
+ if search('syn\%[tax]\s\+on', 'cnW') != 0
+ err['background'] = 'Should not issue :syn on'
+ endif
+
+ # 7) Normal should be defined first, not use reverse, fg or bg
+ cursor(1, 1)
+ pat = 'hi\%[light] \+\%(link\|clear\)\@!\w\+\>'
+ search(pat, 'cW') # Look for the first hi def, skipping `hi link` and `hi clear`
+ if getline('.') !~# '\m\<Normal\>'
+ err['highlight']['Normal'] = 'Should be defined first'
+ elseif getline('.') =~# '\m\%(=\%(fg\|bg\)\)'
+ err['highlight']['Normal'] = "Should not use 'fg' or 'bg'"
+ elseif getline('.') =~# '\m=\%(inv\|rev\)erse'
+ err['highlight']['Normal'] = 'Should not use reverse mode'
+ endif
+
+ # 8) TODO: XXX: Check if g:terminal_ansi_colors are defined
+
+ winrestview(savedview)
+ g:err = err
+
+ Result(err)
+enddef
+
+
+def Result(err: dict<any>)
+ var do_groups: bool = v:false
+ echohl Title | echomsg "---------------" | echohl Normal
+ for key in sort(keys(err))
+ if key == 'highlight'
+ do_groups = !empty(err[key])
+ continue
+ else
+ if err[key] !~ 'OK'
+ echohl Title
+ endif
+ echomsg printf("%15s: %s", key, 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(err['highlight']))
+ echomsg printf("%25s: %s", v1, err['highlight'][v1])
+ endfor
+ endif
+enddef
+
+Test_check_colors()
diff --git a/runtime/colors/torte.vim b/runtime/colors/torte.vim
new file mode 100644
index 0000000..7ea5a69
--- /dev/null
+++ b/runtime/colors/torte.vim
@@ -0,0 +1,423 @@
+" Name: torte
+" Description: Remake of torte (grey on black)
+" Author: Original maintainer Thorsten Maerz <info@netztorte.de>
+" Maintainer: Original maintainer Thorsten Maerz <info@netztorte.de>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:53:21 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=dark
+
+hi clear
+let g:colors_name = 'torte'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#000000', '#cd0000', '#00cd00', '#cdcd00', '#0000ee', '#cd00cd', '#00cdcd', '#e5e5e5', '#7f7f7f', '#ff0000', '#00ff00', '#ffff00', '#5c5cff', '#ff00ff', '#00ffff', '#ffffff']
+endif
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link StatusLineTerm StatusLine
+hi! link StatusLineTermNC StatusLineNC
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#cccccc guibg=#000000 gui=NONE cterm=NONE
+hi Comment guifg=#80a0ff guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#ffa0a0 guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#40ffff guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#ffff60 guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#ff80ff guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#60ff60 guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#ffa500 guibg=NONE gui=NONE cterm=NONE
+hi Underlined guifg=#80a0ff guibg=NONE gui=underline cterm=underline
+hi Ignore guifg=#000000 guibg=#000000 gui=NONE cterm=NONE
+hi Error guifg=#ffffff guibg=#ff0000 gui=NONE cterm=NONE
+hi Todo guifg=#ffff00 guibg=#000000 gui=reverse cterm=reverse
+hi Folded guifg=#00cdcd guibg=#3a3a3a gui=NONE cterm=NONE
+hi Visual guifg=#000000 guibg=#a9a9a9 gui=bold cterm=NONE
+hi CursorColumn guifg=NONE guibg=#666666 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#666666 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#ffff00 guibg=#666666 gui=NONE cterm=NONE
+hi SignColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi ColorColumn guifg=#cccccc guibg=#8b0000 gui=NONE cterm=NONE
+hi Conceal guifg=#e5e5e5 guibg=#a9a9a9 gui=NONE cterm=NONE
+hi Cursor guifg=#000000 guibg=#00ff00 gui=bold cterm=NONE
+hi lCursor guifg=#000000 guibg=#e5e5e5 gui=NONE cterm=NONE
+hi CursorIM guifg=NONE guibg=fg gui=NONE cterm=NONE
+hi Title guifg=#ff00ff guibg=NONE gui=bold cterm=bold
+hi Directory guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi Search guifg=#ff0000 guibg=#000000 gui=reverse cterm=reverse
+hi IncSearch guifg=#00cd00 guibg=#000000 gui=reverse cterm=reverse
+hi NonText guifg=#0000ff guibg=NONE gui=bold cterm=NONE
+hi EndOfBuffer guifg=#0000ff guibg=NONE gui=bold cterm=NONE
+hi ErrorMsg guifg=#ffffff guibg=#cd0000 gui=NONE cterm=NONE
+hi WarningMsg guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi LineNr guifg=#7f7f7f guibg=NONE gui=NONE cterm=NONE
+hi MatchParen guifg=NONE guibg=#008b8b gui=NONE cterm=NONE
+hi ModeMsg guifg=NONE guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=bold
+hi MoreMsg guifg=#2e8b57 guibg=NONE gui=bold cterm=bold
+hi Question guifg=#00ff00 guibg=NONE gui=bold cterm=bold
+hi SpecialKey guifg=#00ffff guibg=NONE gui=NONE cterm=NONE
+hi VisualNOS guifg=NONE guibg=#000000 gui=bold,underline cterm=underline
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi QuickFixLine guifg=#000000 guibg=#cdcd00 gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#5c5cff guibg=NONE guisp=#5c5cff gui=undercurl cterm=underline
+hi SpellLocal guifg=#ff00ff guibg=NONE guisp=#ff00ff gui=undercurl cterm=underline
+hi SpellRare guifg=#00ffff guibg=NONE guisp=#00ffff gui=undercurl cterm=underline
+hi StatusLine guifg=#ffffff guibg=#0000ee gui=bold cterm=bold
+hi StatusLineNC guifg=#000000 guibg=#e5e5e5 gui=NONE cterm=NONE
+hi VertSplit guifg=#000000 guibg=#e5e5e5 gui=NONE cterm=NONE
+hi TabLine guifg=#ffffff guibg=#7f7f7f gui=NONE cterm=NONE
+hi TabLineFill guifg=NONE guibg=#000000 gui=reverse cterm=reverse
+hi TabLineSel guifg=#cccccc guibg=#000000 gui=bold cterm=bold
+hi ToolbarLine guifg=NONE guibg=#000000 gui=NONE cterm=NONE
+hi ToolbarButton guifg=#000000 guibg=#e5e5e5 gui=bold cterm=bold
+hi Pmenu guifg=fg guibg=#303030 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#bebebe gui=NONE cterm=NONE
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link StatusLineTerm StatusLine
+ hi! link StatusLineTermNC StatusLineNC
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=251 ctermbg=16 cterm=NONE
+ hi Comment ctermfg=111 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=217 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=87 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=227 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=213 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=83 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=214 ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=111 ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=16 ctermbg=16 cterm=NONE
+ hi Error ctermfg=231 ctermbg=196 cterm=NONE
+ hi Todo ctermfg=226 ctermbg=16 cterm=reverse
+ hi Folded ctermfg=44 ctermbg=237 cterm=NONE
+ hi Visual ctermfg=16 ctermbg=248 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=242 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=242 cterm=NONE
+ hi CursorLineNr ctermfg=226 ctermbg=242 cterm=NONE
+ hi SignColumn ctermfg=51 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=51 ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=251 ctermbg=88 cterm=NONE
+ hi Conceal ctermfg=254 ctermbg=248 cterm=NONE
+ hi Cursor ctermfg=16 ctermbg=46 cterm=NONE
+ hi lCursor ctermfg=16 ctermbg=254 cterm=NONE
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi Title ctermfg=201 ctermbg=NONE cterm=bold
+ hi Directory ctermfg=51 ctermbg=NONE cterm=NONE
+ hi Search ctermfg=196 ctermbg=16 cterm=reverse
+ hi IncSearch ctermfg=40 ctermbg=16 cterm=reverse
+ hi NonText ctermfg=21 ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=21 ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=231 ctermbg=160 cterm=NONE
+ hi WarningMsg ctermfg=196 ctermbg=NONE cterm=NONE
+ hi LineNr ctermfg=102 ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=30 cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=29 ctermbg=NONE cterm=bold
+ hi Question ctermfg=46 ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=51 ctermbg=NONE cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=16 cterm=underline
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE
+ hi QuickFixLine ctermfg=16 ctermbg=184 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=63 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=201 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=51 ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=231 ctermbg=20 cterm=bold
+ hi StatusLineNC ctermfg=16 ctermbg=254 cterm=NONE
+ hi VertSplit ctermfg=16 ctermbg=254 cterm=NONE
+ hi TabLine ctermfg=231 ctermbg=102 cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=16 cterm=reverse
+ hi TabLineSel ctermfg=251 ctermbg=16 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=16 cterm=NONE
+ hi ToolbarButton ctermfg=16 ctermbg=254 cterm=bold
+ hi Pmenu ctermfg=fg ctermbg=236 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=250 cterm=NONE
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=white ctermbg=black cterm=NONE
+ hi Comment ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=yellow ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Type ctermfg=green ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=blue ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=black ctermbg=black cterm=NONE
+ hi Error ctermfg=white ctermbg=red cterm=NONE
+ hi Todo ctermfg=yellow ctermbg=black cterm=reverse
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=black ctermbg=grey cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=yellow ctermbg=NONE cterm=bold
+ hi SignColumn ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=white ctermbg=darkred cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=grey cterm=NONE
+ hi Cursor ctermfg=black ctermbg=green cterm=NONE
+ hi lCursor ctermfg=black ctermbg=grey cterm=NONE
+ hi CursorIM ctermfg=NONE ctermbg=fg cterm=NONE
+ hi Title ctermfg=magenta ctermbg=NONE cterm=bold
+ hi Directory ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi Search ctermfg=red ctermbg=black cterm=reverse
+ hi IncSearch ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi NonText ctermfg=blue ctermbg=NONE cterm=NONE
+ hi EndOfBuffer ctermfg=blue ctermbg=NONE cterm=NONE
+ hi ErrorMsg ctermfg=white ctermbg=darkred cterm=NONE
+ hi WarningMsg ctermfg=red ctermbg=NONE cterm=NONE
+ hi LineNr ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi MatchParen ctermfg=NONE ctermbg=darkcyan cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Question ctermfg=green ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=cyan ctermbg=NONE cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=magenta ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=cyan ctermbg=NONE cterm=underline
+ hi StatusLine ctermfg=white ctermbg=darkblue cterm=bold
+ hi StatusLineNC ctermfg=black ctermbg=grey cterm=NONE
+ hi VertSplit ctermfg=black ctermbg=grey cterm=NONE
+ hi TabLine ctermfg=white ctermbg=darkgrey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=black cterm=reverse
+ hi TabLineSel ctermfg=white ctermbg=black cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=grey cterm=bold
+ hi Pmenu ctermfg=fg ctermbg=darkgrey cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=grey cterm=NONE
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=grey ctermbg=black cterm=NONE
+ hi Comment ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkyellow ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Type ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Special ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Ignore ctermfg=black ctermbg=black cterm=NONE
+ hi Error ctermfg=grey ctermbg=darkred cterm=NONE
+ hi Todo ctermfg=darkyellow ctermbg=black cterm=reverse
+ hi Folded ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkyellow ctermbg=NONE cterm=bold,underline
+ hi SignColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi ColorColumn ctermfg=white ctermbg=darkred cterm=NONE
+ hi Conceal ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi Directory ctermfg=darkcyan ctermbg=NONE cterm=bold
+ hi Search ctermfg=darkred ctermbg=black cterm=bold,reverse
+ hi IncSearch ctermfg=darkgreen ctermbg=black cterm=reverse
+ hi NonText ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi EndOfBuffer ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi ErrorMsg ctermfg=grey ctermbg=darkred cterm=NONE
+ hi WarningMsg ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi LineNr ctermfg=grey ctermbg=NONE cterm=bold
+ hi MatchParen ctermfg=grey ctermbg=darkcyan cterm=NONE
+ hi ModeMsg ctermfg=NONE ctermbg=NONE cterm=bold
+ hi MoreMsg ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi Question ctermfg=darkgreen ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=darkcyan ctermbg=NONE cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=black cterm=underline
+ hi WildMenu ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi QuickFixLine ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=darkyellow cterm=reverse
+ hi SpellCap ctermfg=darkblue ctermbg=darkyellow cterm=reverse
+ hi SpellLocal ctermfg=darkmagenta ctermbg=darkyellow cterm=reverse
+ hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi StatusLine ctermfg=grey ctermbg=darkblue cterm=bold
+ hi StatusLineNC ctermfg=black ctermbg=grey cterm=NONE
+ hi VertSplit ctermfg=black ctermbg=grey cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=NONE
+ hi TabLineFill ctermfg=NONE ctermbg=black cterm=reverse
+ hi TabLineSel ctermfg=white ctermbg=black cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=grey ctermbg=black cterm=bold,reverse
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkmagenta cterm=NONE
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: dark
+" Color: foreground #CCCCCC 251 white
+" Color: background #000000 16 black
+" Color: color00 #000000 16 black
+" Color: color08 #7f7f7f 102 darkgrey
+" Color: color01 #cd0000 160 darkred
+" Color: color09 #ff0000 196 red
+" Color: color02 #00cd00 40 darkgreen
+" Color: color10 #00ff00 46 green
+" Color: color03 #cdcd00 184 darkyellow
+" Color: color11 #ffff00 226 yellow
+" Color: color04 #0000ee 20 darkblue
+" Color: color12 #5c5cff 63 blue
+" Color: color05 #cd00cd 164 darkmagenta
+" Color: color13 #ff00ff 201 magenta
+" Color: color06 #00cdcd 44 darkcyan
+" Color: color14 #00ffff 51 cyan
+" Color: color07 #e5e5e5 254 grey
+" Color: color15 #ffffff 231 white
+" Term colors: color00 color01 color02 color03 color04 color05 color06 color07
+" Term colors: color08 color09 color10 color11 color12 color13 color14 color15
+" Color: rgbGrey40 #666666 242 grey
+" Color: rgbDarkGrey #a9a9a9 248 grey
+" Color: rgbDarkBlue #00008b 18 darkblue
+" Color: rgbDarkMagenta #8b008b 90 darkmagenta
+" Color: rgbBlue #0000ff 21 blue
+" Color: rgbDarkCyan #008b8b 30 darkcyan
+" Color: Directory #00ffff 51 cyan
+" Color: rgbSeaGreen #2e8b57 29 darkgreen
+" Color: rgbGrey #bebebe 250 grey
+" Color: Question #00ff00 46 green
+" Color: SignColumn #a9a9a9 248 black
+" Color: SpecialKey #00ffff 51 cyan
+" Color: StatusLineTerm #90ee90 120 darkgreen
+" Color: Title #ff00ff 201 magenta
+" Color: WarningMsg #ff0000 196 red
+" Color: ToolbarLine #7f7f7f 243 black
+" Color: ToolbarButton #d3d3d3 252 darkgrey
+" Color: Comment #80a0ff 111 blue
+" Color: Constant #ffa0a0 217 darkmagenta
+" Color: Special #ffa500 214 darkred
+" Color: Identifier #40ffff 87 cyan
+" Color: Statement #ffff60 227 yellow
+" Color: PreProc #ff80ff 213 darkcyan
+" Color: Type #60ff60 83 green
+" Color: Underlined #80a0ff 111 blue
+" Color: FoldedBG #3a3a3a 237 darkgrey
+" Color: Pmenu #303030 236 darkgrey
+" Color: rgbDarkRed #8b0000 88 darkred
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/colors/zellner.vim b/runtime/colors/zellner.vim
new file mode 100644
index 0000000..86340eb
--- /dev/null
+++ b/runtime/colors/zellner.vim
@@ -0,0 +1,411 @@
+" Name: zellner
+" Description: Light background colorscheme.
+" Author: Original author Ron Aaron <ron@ronware.org>
+" Maintainer: Original maintainer Ron Aaron <ron@ronware.org>
+" Website: https://github.com/vim/colorschemes
+" License: Same as Vim
+" Last Updated: Fri 02 Sep 2022 09:54:15 MSK
+
+" Generated by Colortemplate v2.2.0
+
+set background=light
+
+hi clear
+let g:colors_name = 'zellner'
+
+let s:t_Co = exists('&t_Co') && !has('gui_running') ? (&t_Co ?? 0) : -1
+
+if (has('termguicolors') && &termguicolors) || has('gui_running')
+ let g:terminal_ansi_colors = ['#ffffff', '#a52a2a', '#ff00ff', '#a020f0', '#0000ff', '#0000ff', '#ff00ff', '#a9a9a9', '#ff0000', '#a52a2a', '#ff00ff', '#a020f0', '#0000ff', '#0000ff', '#ff00ff', '#000000']
+endif
+hi! link Terminal Normal
+hi! link LineNrAbove LineNr
+hi! link LineNrBelow LineNr
+hi! link CurSearch Search
+hi! link CursorLineFold CursorLine
+hi! link CursorLineSign CursorLine
+hi! link MessageWindow Pmenu
+hi! link PopupNotification Todo
+hi Normal guifg=#000000 guibg=#ffffff gui=NONE cterm=NONE
+hi Folded guifg=#00008b guibg=#d3d3d3 gui=NONE cterm=NONE
+hi CursorLine guifg=NONE guibg=#e5e5e5 gui=NONE cterm=NONE
+hi CursorColumn guifg=NONE guibg=#e5e5e5 gui=NONE cterm=NONE
+hi CursorLineNr guifg=#a52a2a guibg=NONE gui=bold cterm=bold
+hi QuickFixLine guifg=#ffffff guibg=#6a5acd gui=NONE cterm=NONE
+hi EndOfBuffer guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE
+hi StatusLine guifg=#ffff00 guibg=#a9a9a9 gui=NONE cterm=NONE
+hi StatusLineNC guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE
+hi StatusLineTerm guifg=#ffffff guibg=#006400 gui=NONE cterm=NONE
+hi StatusLineTermNC guifg=#ffffff guibg=#0000ff gui=NONE cterm=NONE
+hi VertSplit guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE
+hi Pmenu guifg=#000000 guibg=#dadada gui=NONE cterm=NONE
+hi PmenuSel guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi PmenuSbar guifg=NONE guibg=#ffffff gui=NONE cterm=NONE
+hi PmenuThumb guifg=NONE guibg=#a9a9a9 gui=NONE cterm=NONE
+hi TabLine guifg=#000000 guibg=#a9a9a9 gui=underline cterm=underline
+hi TabLineFill guifg=NONE guibg=NONE gui=reverse ctermfg=NONE ctermbg=NONE cterm=reverse
+hi TabLineSel guifg=#000000 guibg=#ffffff gui=bold cterm=bold
+hi ToolbarLine guifg=NONE guibg=#d3d3d3 gui=NONE cterm=NONE
+hi ToolbarButton guifg=NONE guibg=#a9a9a9 gui=bold cterm=bold
+hi NonText guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE
+hi SpecialKey guifg=#a9a9a9 guibg=NONE gui=NONE cterm=NONE
+hi Visual guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi VisualNOS guifg=NONE guibg=#ff0000 gui=NONE cterm=NONE
+hi LineNr guifg=#a52a2a guibg=NONE gui=NONE cterm=NONE
+hi FoldColumn guifg=#00008b guibg=NONE gui=NONE cterm=NONE
+hi SignColumn guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Underlined guifg=#6a5acd guibg=NONE gui=underline cterm=underline
+hi Error guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi ErrorMsg guifg=#ff0000 guibg=#ffffff gui=reverse cterm=reverse
+hi WarningMsg guifg=#a020f0 guibg=#ffffff gui=NONE cterm=NONE
+hi MoreMsg guifg=#000000 guibg=#ffffff gui=bold cterm=bold
+hi ModeMsg guifg=#000000 guibg=#ffffff gui=bold cterm=bold
+hi Question guifg=#ff00ff guibg=NONE gui=bold cterm=bold
+hi Todo guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi MatchParen guifg=#ffffff guibg=#ff00ff gui=NONE cterm=NONE
+hi Search guifg=#ffffff guibg=#a020f0 gui=NONE cterm=NONE
+hi IncSearch guifg=#000000 guibg=NONE gui=reverse cterm=reverse
+hi WildMenu guifg=#000000 guibg=#ffff00 gui=NONE cterm=NONE
+hi ColorColumn guifg=NONE guibg=#eeeeee gui=NONE cterm=NONE
+hi Cursor guifg=#ffffff guibg=#000000 gui=NONE cterm=NONE
+hi lCursor guifg=#000000 guibg=#ff00ff gui=NONE cterm=NONE
+hi SpellBad guifg=#ff0000 guibg=NONE guisp=#ff0000 gui=undercurl cterm=underline
+hi SpellCap guifg=#0000ff guibg=NONE guisp=#0000ff gui=undercurl cterm=underline
+hi SpellLocal guifg=#878700 guibg=NONE guisp=#878700 gui=undercurl cterm=underline
+hi SpellRare guifg=#008787 guibg=NONE guisp=#008787 gui=undercurl cterm=underline
+hi Comment guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi Constant guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE
+hi Identifier guifg=#0000ff guibg=NONE gui=NONE cterm=NONE
+hi Statement guifg=#a52a2a guibg=NONE gui=NONE cterm=NONE
+hi PreProc guifg=#a020f0 guibg=NONE gui=NONE cterm=NONE
+hi Type guifg=#0000ff guibg=NONE gui=NONE cterm=NONE
+hi Special guifg=#ff00ff guibg=NONE gui=NONE cterm=NONE
+hi Tag guifg=#006400 guibg=NONE gui=NONE cterm=NONE
+hi Directory guifg=#0000ff guibg=NONE gui=bold cterm=bold
+hi Conceal guifg=#ff0000 guibg=NONE gui=NONE cterm=NONE
+hi Ignore guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE
+hi Title guifg=#a020f0 guibg=NONE gui=bold cterm=bold
+hi DiffAdd guifg=#ffffff guibg=#5f875f gui=NONE cterm=NONE
+hi DiffChange guifg=#ffffff guibg=#5f87af gui=NONE cterm=NONE
+hi DiffText guifg=#000000 guibg=#c6c6c6 gui=NONE cterm=NONE
+hi DiffDelete guifg=#ffffff guibg=#af5faf gui=NONE cterm=NONE
+
+if s:t_Co >= 256
+ hi! link Terminal Normal
+ hi! link LineNrAbove LineNr
+ hi! link LineNrBelow LineNr
+ hi! link CurSearch Search
+ hi! link CursorLineFold CursorLine
+ hi! link CursorLineSign CursorLine
+ hi! link MessageWindow Pmenu
+ hi! link PopupNotification Todo
+ hi Normal ctermfg=16 ctermbg=231 cterm=NONE
+ hi Folded ctermfg=18 ctermbg=252 cterm=NONE
+ hi CursorLine ctermfg=NONE ctermbg=254 cterm=NONE
+ hi CursorColumn ctermfg=NONE ctermbg=254 cterm=NONE
+ hi CursorLineNr ctermfg=124 ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=231 ctermbg=62 cterm=NONE
+ hi EndOfBuffer ctermfg=248 ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=226 ctermbg=248 cterm=NONE
+ hi StatusLineNC ctermfg=231 ctermbg=16 cterm=NONE
+ hi StatusLineTerm ctermfg=231 ctermbg=22 cterm=NONE
+ hi StatusLineTermNC ctermfg=231 ctermbg=21 cterm=NONE
+ hi VertSplit ctermfg=231 ctermbg=16 cterm=NONE
+ hi Pmenu ctermfg=16 ctermbg=253 cterm=NONE
+ hi PmenuSel ctermfg=16 ctermbg=226 cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=231 cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=248 cterm=NONE
+ hi TabLine ctermfg=16 ctermbg=248 cterm=underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=16 ctermbg=231 cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=252 cterm=NONE
+ hi ToolbarButton ctermfg=NONE ctermbg=248 cterm=bold
+ hi NonText ctermfg=248 ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=248 ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=16 ctermbg=226 cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=196 cterm=NONE
+ hi LineNr ctermfg=124 ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=18 ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=62 ctermbg=NONE cterm=underline
+ hi Error ctermfg=196 ctermbg=231 cterm=reverse
+ hi ErrorMsg ctermfg=196 ctermbg=231 cterm=reverse
+ hi WarningMsg ctermfg=129 ctermbg=231 cterm=NONE
+ hi MoreMsg ctermfg=16 ctermbg=231 cterm=bold
+ hi ModeMsg ctermfg=16 ctermbg=231 cterm=bold
+ hi Question ctermfg=201 ctermbg=NONE cterm=bold
+ hi Todo ctermfg=16 ctermbg=226 cterm=NONE
+ hi MatchParen ctermfg=231 ctermbg=201 cterm=NONE
+ hi Search ctermfg=231 ctermbg=129 cterm=NONE
+ hi IncSearch ctermfg=16 ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=16 ctermbg=226 cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=255 cterm=NONE
+ hi Cursor ctermfg=231 ctermbg=16 cterm=NONE
+ hi lCursor ctermfg=16 ctermbg=201 cterm=NONE
+ hi SpellBad ctermfg=196 ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=21 ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=100 ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=30 ctermbg=NONE cterm=underline
+ hi Comment ctermfg=196 ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=201 ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=21 ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=124 ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=129 ctermbg=NONE cterm=NONE
+ hi Type ctermfg=21 ctermbg=NONE cterm=NONE
+ hi Special ctermfg=201 ctermbg=NONE cterm=NONE
+ hi Tag ctermfg=22 ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=21 ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=196 ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=129 ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=231 ctermbg=65 cterm=NONE
+ hi DiffChange ctermfg=231 ctermbg=67 cterm=NONE
+ hi DiffText ctermfg=16 ctermbg=251 cterm=NONE
+ hi DiffDelete ctermfg=231 ctermbg=133 cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 16
+ hi Normal ctermfg=black ctermbg=white cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorLineNr ctermfg=darkred ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=white ctermbg=blue cterm=NONE
+ hi EndOfBuffer ctermfg=darkgrey ctermbg=NONE cterm=NONE
+ hi StatusLine ctermfg=yellow ctermbg=darkgrey cterm=NONE
+ hi StatusLineNC ctermfg=white ctermbg=black cterm=NONE
+ hi StatusLineTerm ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi StatusLineTermNC ctermfg=white ctermbg=blue cterm=NONE
+ hi VertSplit ctermfg=white ctermbg=black cterm=NONE
+ hi Pmenu ctermfg=black ctermbg=grey cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=yellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=white cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkgrey cterm=NONE
+ hi TabLine ctermfg=black ctermbg=grey cterm=underline
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=black ctermbg=white cterm=bold
+ hi ToolbarLine ctermfg=NONE ctermbg=black cterm=NONE
+ hi ToolbarButton ctermfg=NONE ctermbg=grey cterm=bold
+ hi NonText ctermfg=grey ctermbg=NONE cterm=NONE
+ hi SpecialKey ctermfg=grey ctermbg=NONE cterm=NONE
+ hi Visual ctermfg=black ctermbg=yellow cterm=NONE
+ hi VisualNOS ctermfg=NONE ctermbg=red cterm=NONE
+ hi LineNr ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=blue ctermbg=NONE cterm=underline
+ hi Error ctermfg=red ctermbg=white cterm=reverse
+ hi ErrorMsg ctermfg=red ctermbg=white cterm=reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=white cterm=NONE
+ hi MoreMsg ctermfg=black ctermbg=white cterm=bold
+ hi ModeMsg ctermfg=black ctermbg=white cterm=bold
+ hi Question ctermfg=magenta ctermbg=NONE cterm=bold
+ hi Todo ctermfg=black ctermbg=yellow cterm=NONE
+ hi MatchParen ctermfg=white ctermbg=magenta cterm=NONE
+ hi Search ctermfg=white ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=black ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=black ctermbg=yellow cterm=NONE
+ hi ColorColumn ctermfg=NONE ctermbg=grey cterm=NONE
+ hi Cursor ctermfg=white ctermbg=black cterm=NONE
+ hi lCursor ctermfg=black ctermbg=magenta cterm=NONE
+ hi SpellBad ctermfg=red ctermbg=NONE cterm=underline
+ hi SpellCap ctermfg=blue ctermbg=NONE cterm=underline
+ hi SpellLocal ctermfg=darkyellow ctermbg=NONE cterm=underline
+ hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=underline
+ hi Comment ctermfg=red ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Type ctermfg=blue ctermbg=NONE cterm=NONE
+ hi Special ctermfg=magenta ctermbg=NONE cterm=NONE
+ hi Tag ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=blue ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=red ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=blue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=magenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 8
+ hi Normal ctermfg=black ctermbg=gray cterm=NONE
+ hi Folded ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi CursorLine ctermfg=NONE ctermbg=NONE cterm=underline
+ hi CursorColumn ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi CursorLineNr ctermfg=darkred ctermbg=NONE cterm=bold
+ hi QuickFixLine ctermfg=gray ctermbg=darkblue cterm=NONE
+ hi EndOfBuffer ctermfg=darkgrey ctermbg=NONE cterm=bold
+ hi StatusLine ctermfg=black ctermbg=gray cterm=bold,reverse
+ hi StatusLineNC ctermfg=black ctermbg=gray cterm=reverse
+ hi StatusLineTerm ctermfg=black ctermbg=gray cterm=bold,reverse
+ hi StatusLineTermNC ctermfg=black ctermbg=gray cterm=reverse
+ hi VertSplit ctermfg=black ctermbg=gray cterm=reverse
+ hi Pmenu ctermfg=black ctermbg=darkcyan cterm=NONE
+ hi PmenuSel ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi PmenuSbar ctermfg=NONE ctermbg=black cterm=NONE
+ hi PmenuThumb ctermfg=NONE ctermbg=darkmagenta cterm=NONE
+ hi TabLine ctermfg=black ctermbg=gray cterm=reverse
+ hi TabLineFill ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi TabLineSel ctermfg=gray ctermbg=black cterm=bold,reverse
+ hi ToolbarLine ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi ToolbarButton ctermfg=black ctermbg=gray cterm=bold,reverse
+ hi NonText ctermfg=gray ctermbg=NONE cterm=bold
+ hi SpecialKey ctermfg=gray ctermbg=NONE cterm=bold
+ hi Visual ctermfg=NONE ctermbg=NONE cterm=reverse
+ hi VisualNOS ctermfg=NONE ctermbg=NONE cterm=underline
+ hi LineNr ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi FoldColumn ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi SignColumn ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Underlined ctermfg=NONE ctermbg=NONE cterm=underline
+ hi Error ctermfg=darkred ctermbg=black cterm=reverse
+ hi ErrorMsg ctermfg=darkred ctermbg=black cterm=reverse
+ hi WarningMsg ctermfg=darkmagenta ctermbg=black cterm=NONE
+ hi MoreMsg ctermfg=gray ctermbg=black cterm=bold
+ hi ModeMsg ctermfg=gray ctermbg=black cterm=bold
+ hi Question ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi Todo ctermfg=black ctermbg=darkyellow cterm=NONE
+ hi MatchParen ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi Search ctermfg=black ctermbg=darkmagenta cterm=NONE
+ hi IncSearch ctermfg=gray ctermbg=NONE cterm=reverse
+ hi WildMenu ctermfg=gray ctermbg=darkyellow cterm=NONE
+ hi ColorColumn ctermfg=black ctermbg=darkred cterm=NONE
+ hi SpellBad ctermfg=darkred ctermbg=NONE cterm=reverse
+ hi SpellCap ctermfg=darkblue ctermbg=NONE cterm=reverse
+ hi SpellLocal ctermfg=darkyellow ctermbg=darkblue cterm=reverse
+ hi SpellRare ctermfg=darkcyan ctermbg=NONE cterm=reverse
+ hi Comment ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Constant ctermfg=darkmagenta ctermbg=NONE cterm=NONE
+ hi Identifier ctermfg=darkblue ctermbg=NONE cterm=NONE
+ hi Statement ctermfg=darkred ctermbg=NONE cterm=bold
+ hi PreProc ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi Type ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Special ctermfg=darkgreen ctermbg=NONE cterm=NONE
+ hi Directory ctermfg=darkblue ctermbg=NONE cterm=bold
+ hi Conceal ctermfg=darkred ctermbg=NONE cterm=NONE
+ hi Ignore ctermfg=NONE ctermbg=NONE cterm=NONE
+ hi Title ctermfg=darkmagenta ctermbg=NONE cterm=bold
+ hi DiffAdd ctermfg=white ctermbg=darkgreen cterm=NONE
+ hi DiffChange ctermfg=white ctermbg=darkblue cterm=NONE
+ hi DiffText ctermfg=black ctermbg=grey cterm=NONE
+ hi DiffDelete ctermfg=white ctermbg=darkmagenta cterm=NONE
+ unlet s:t_Co
+ finish
+endif
+
+if s:t_Co >= 0
+ hi Normal term=NONE
+ hi ColorColumn term=reverse
+ hi Conceal term=NONE
+ hi Cursor term=reverse
+ hi CursorColumn term=NONE
+ hi CursorLine term=underline
+ hi CursorLineNr term=bold
+ hi DiffAdd term=reverse
+ hi DiffChange term=NONE
+ hi DiffDelete term=reverse
+ hi DiffText term=reverse
+ hi Directory term=NONE
+ hi EndOfBuffer term=NONE
+ hi ErrorMsg term=bold,reverse
+ hi FoldColumn term=NONE
+ hi Folded term=NONE
+ hi IncSearch term=bold,reverse,underline
+ hi LineNr term=NONE
+ hi MatchParen term=bold,underline
+ hi ModeMsg term=bold
+ hi MoreMsg term=NONE
+ hi NonText term=NONE
+ hi Pmenu term=reverse
+ hi PmenuSbar term=reverse
+ hi PmenuSel term=bold
+ hi PmenuThumb term=NONE
+ hi Question term=standout
+ hi Search term=reverse
+ hi SignColumn term=reverse
+ hi SpecialKey term=bold
+ hi SpellBad term=underline
+ hi SpellCap term=underline
+ hi SpellLocal term=underline
+ hi SpellRare term=underline
+ hi StatusLine term=bold,reverse
+ hi StatusLineNC term=bold,underline
+ hi TabLine term=bold,underline
+ hi TabLineFill term=NONE
+ hi Terminal term=NONE
+ hi TabLineSel term=bold,reverse
+ hi Title term=NONE
+ hi VertSplit term=NONE
+ hi Visual term=reverse
+ hi VisualNOS term=NONE
+ hi WarningMsg term=standout
+ hi WildMenu term=bold
+ hi CursorIM term=NONE
+ hi ToolbarLine term=reverse
+ hi ToolbarButton term=bold,reverse
+ hi CurSearch term=reverse
+ hi CursorLineFold term=underline
+ hi CursorLineSign term=underline
+ hi Comment term=bold
+ hi Constant term=NONE
+ hi Error term=bold,reverse
+ hi Identifier term=NONE
+ hi Ignore term=NONE
+ hi PreProc term=NONE
+ hi Special term=NONE
+ hi Statement term=NONE
+ hi Todo term=bold,reverse
+ hi Type term=NONE
+ hi Underlined term=underline
+ unlet s:t_Co
+ finish
+endif
+
+" Background: light
+" Color: comment #ff0000 196 red
+" Color: constant #ff00ff 201 magenta
+" Color: identifier #0000ff 21 blue
+" Color: statement #a52a2a 124 darkred
+" Color: preproc #a020f0 129 darkmagenta
+" Color: type #0000ff 21 blue
+" Color: special #ff00ff 201 magenta
+" Color: tag #006400 22 darkgreen
+" Color: fg0 #000000 16 black
+" Color: bg0 #ffffff 231 white
+" Color: bg1 #a9a9a9 248 grey
+" Color: status #a9a9a9 248 darkgrey
+" Color: visual #ffff00 226 yellow
+" Color: folded #d3d3d3 252 black
+" Color: folded_fg #00008b 18 darkblue
+" Color: cursorline #e5e5e5 254 black
+" Color: pmenu #dadada 253 grey
+" Color: wildmenu #ffff00 226 yellow
+" Color: error #ff0000 196 red
+" Color: linenr #a52a2a 124 darkred
+" Color: colorcolumn #eeeeee 255 grey
+" Color: slateblue #6a5acd 62 blue
+" Color: black #000000 16 black
+" Color: darkred #870000 88 darkred
+" Color: darkgreen #008700 28 darkgreen
+" Color: darkyellow #878700 100 darkyellow
+" Color: darkblue #000087 18 darkblue
+" Color: darkmagenta #870087 18 darkmagenta
+" Color: darkcyan #008787 30 darkcyan
+" Color: gray #878787 102 gray
+" Term colors: bg0 statement constant preproc identifier type special bg1
+" Term colors: comment statement constant preproc identifier type special fg0
+" Color: bgDiffA #5F875F 65 darkgreen
+" Color: bgDiffC #5F87AF 67 blue
+" Color: bgDiffD #AF5FAF 133 magenta
+" Color: bgDiffT #C6C6C6 251 grey
+" Color: fgDiffW #FFFFFF 231 white
+" Color: fgDiffB #000000 16 black
+" Color: bgDiffC8 #5F87AF 67 darkblue
+" Color: bgDiffD8 #AF5FAF 133 darkmagenta
+" vim: et ts=2 sw=2
diff --git a/runtime/compiler/README.txt b/runtime/compiler/README.txt
new file mode 100644
index 0000000..3f0b97b
--- /dev/null
+++ b/runtime/compiler/README.txt
@@ -0,0 +1,11 @@
+This directory contains Vim scripts to be used with a specific compiler.
+They are used with the ":compiler" command.
+
+These scripts usually set options, for example 'errorformat'.
+See ":help write-compiler-plugin".
+
+If you want to write your own compiler plugin, have a look at the other files
+for how to do it, the format is simple.
+
+If you think a compiler plugin you have written is useful for others, please
+send it to Bram@vim.org.
diff --git a/runtime/compiler/ant.vim b/runtime/compiler/ant.vim
new file mode 100644
index 0000000..0605c69
--- /dev/null
+++ b/runtime/compiler/ant.vim
@@ -0,0 +1,38 @@
+" Vim Compiler File
+" Compiler: ant
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Mi, 13 Apr 2005 22:50:07 CEST
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "ant"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=ant
+
+" first line:
+" ant with jikes +E, which assumes the following
+" two property lines in your 'build.xml':
+"
+" <property name = "build.compiler" value = "jikes"/>
+" <property name = "build.compiler.emacs" value = "true"/>
+"
+" second line:
+" ant with javac
+"
+" note that this will work also for tasks like [wtkbuild]
+"
+CompilerSet errorformat=\ %#[%.%#]\ %#%f:%l:%v:%*\\d:%*\\d:\ %t%[%^:]%#:%m,
+ \%A\ %#[%.%#]\ %f:%l:\ %m,%-Z\ %#[%.%#]\ %p^,%C\ %#[%.%#]\ %#%m
+
+" ,%-C%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/bcc.vim b/runtime/compiler/bcc.vim
new file mode 100644
index 0000000..5bd284a
--- /dev/null
+++ b/runtime/compiler/bcc.vim
@@ -0,0 +1,19 @@
+" Vim compiler file
+" Compiler: bcc - Borland C
+" Maintainer: Emile van Raaij (eraaij@xs4all.nl)
+" Last Change: 2004 Mar 27
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "bcc"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+" A workable errorformat for Borland C
+CompilerSet errorformat=%*[^0-9]%n\ %f\ %l:\ %m
+
+" default make
+CompilerSet makeprg=make
diff --git a/runtime/compiler/bdf.vim b/runtime/compiler/bdf.vim
new file mode 100644
index 0000000..b062e84
--- /dev/null
+++ b/runtime/compiler/bdf.vim
@@ -0,0 +1,22 @@
+" Vim compiler file
+" Compiler: BDF to PCF Conversion
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "bdf"
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+setlocal makeprg=bdftopcf\ $*
+
+setlocal errorformat=%ABDF\ %trror\ on\ line\ %l:\ %m,
+ \%-Z%p^,
+ \%Cbdftopcf:\ bdf\ input\\,\ %f\\,\ corrupt,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/cargo.vim b/runtime/compiler/cargo.vim
new file mode 100644
index 0000000..bd48666
--- /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/checkstyle.vim b/runtime/compiler/checkstyle.vim
new file mode 100644
index 0000000..4ebd9e1
--- /dev/null
+++ b/runtime/compiler/checkstyle.vim
@@ -0,0 +1,29 @@
+" Vim compiler file
+" Compiler: Checkstyle
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Aug 2
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "checkstyle"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=java\ com.puppycrawl.tools.checkstyle.Main\ -f\ plain\ -c\ /sun_checks.xml
+" CompilerSet makeprg=java\ -jar\ checkstyle-X.XX-all.jar\ -f\ plain\ -c\ /sun_checks.xml
+
+CompilerSet makeprg=checkstyle\ -f\ plain
+CompilerSet errorformat=[%tRROR]\ %f:%l:%v:\ %m,
+ \[%tARN]\ %f:%l:%v:\ %m,
+ \[%tRROR]\ %f:%l:\ %m,
+ \[%tARN]\ %f:%l:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/cm3.vim b/runtime/compiler/cm3.vim
new file mode 100644
index 0000000..3de5128
--- /dev/null
+++ b/runtime/compiler/cm3.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: Critical Mass Modula-3 Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Apr 08
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "cm3"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" TODO: better handling of Quake errors
+CompilerSet makeprg=cm3
+CompilerSet errorformat=%D---\ building\ in\ %f\ ---,
+ \%W\"%f\"\\,\ line\ %l:\ warning:\ %m,
+ \%E\"%f\"\\,\ line\ %l:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/context.vim b/runtime/compiler/context.vim
new file mode 100644
index 0000000..4cabf14
--- /dev/null
+++ b/runtime/compiler/context.vim
@@ -0,0 +1,48 @@
+vim9script
+
+# Language: ConTeXt typesetting engine
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2022 Aug 12
+
+if exists("g:current_compiler")
+ finish
+endif
+
+import autoload '../autoload/context.vim'
+
+if exists(":CompilerSet") != 2 # Older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+g:current_compiler = 'context'
+
+if get(b:, 'context_ignore_makefile', get(g:, 'context_ignore_makefile', 0)) ||
+ (!filereadable('Makefile') && !filereadable('makefile'))
+ &l:makeprg = join(context.ConTeXtCmd(shellescape(expand('%:p:t'))), ' ')
+else
+ g:current_compiler = 'make'
+endif
+
+const context_errorformat = join([
+ "%-Popen source%.%#> %f",
+ "%-Qclose source%.%#> %f",
+ "%-Popen source%.%#name '%f'",
+ "%-Qclose source%.%#name '%f'",
+ "tex %trror%.%#error on line %l in file %f: %m",
+ "%Elua %trror%.%#error on line %l in file %f:",
+ "%+Emetapost %#> error: %#",
+ "%Emetafun%.%#error: %m",
+ "! error: %#%m",
+ "%-C %#",
+ "%C! %m",
+ "%Z[ctxlua]%m",
+ "%+C<*> %.%#",
+ "%-C%.%#",
+ "%Z...%m",
+ "%-Zno-error",
+ "%-G%.%#"], ",")
+
+execute 'CompilerSet errorformat=' .. escape(context_errorformat, ' ')
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/compiler/cs.vim b/runtime/compiler/cs.vim
new file mode 100644
index 0000000..4f6dd3c
--- /dev/null
+++ b/runtime/compiler/cs.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: Microsoft Visual Studio C#
+" Maintainer: Yichao Zhou (broken.zhou@gmail.com)
+" Previous Maintainer: Joseph H. Yao (hyao@sina.com)
+" Last Change: Jul 22, 2019
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "cs"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat&
+CompilerSet errorformat+=%f(%l\\,%v):\ %t%*[^:]:\ %m,
+ \%trror%*[^:]:\ %m,
+ \%tarning%*[^:]:\ %m
+
+CompilerSet makeprg=csc\ %:S
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/csslint.vim b/runtime/compiler/csslint.vim
new file mode 100644
index 0000000..14c4289
--- /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
new file mode 100644
index 0000000..17ce362
--- /dev/null
+++ b/runtime/compiler/cucumber.vim
@@ -0,0 +1,29 @@
+" Vim compiler file
+" Compiler: Cucumber
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2016 Aug 29
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "cucumber"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+CompilerSet makeprg=cucumber
+
+CompilerSet errorformat=
+ \%W%m\ (Cucumber::Undefined),
+ \%E%m\ (%\\S%#),
+ \%Z%f:%l,
+ \%Z%f:%l:%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2:
diff --git a/runtime/compiler/dart.vim b/runtime/compiler/dart.vim
new file mode 100644
index 0000000..f9ebfe1
--- /dev/null
+++ b/runtime/compiler/dart.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: Dart VM
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 May 08
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dart"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=dart
+CompilerSet errorformat=%E%f:%l:%c:\ Error:\ %m,
+ \%CTry\ %.%#,
+ \%Z\ %#^%\\+,
+ \%C%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/dart2js.vim b/runtime/compiler/dart2js.vim
new file mode 100644
index 0000000..b6a4e4d
--- /dev/null
+++ b/runtime/compiler/dart2js.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: Dart to JavaScript Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 May 08
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dart2js"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=dart2js
+CompilerSet errorformat=%E%f:%l:%c:,
+ \%-GError:\ Compilation\ failed.,
+ \%CError:\ %m,
+ \%Z\ %#^%\\+,
+ \%C%.%#,
+ \%trror:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/dart2native.vim b/runtime/compiler/dart2native.vim
new file mode 100644
index 0000000..51bdab0
--- /dev/null
+++ b/runtime/compiler/dart2native.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: Dart to Native Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 May 08
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dart2native"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=dart2native
+CompilerSet errorformat=%E%f:%l:%c:\ Error:\ %m,
+ \%CTry\ %.%#,
+ \%Z\ %#^%\\+,
+ \%Z%$,
+ \%C%.%#,
+ \%E%f:\ %trror:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/dartanalyser.vim b/runtime/compiler/dartanalyser.vim
new file mode 100644
index 0000000..e691d80
--- /dev/null
+++ b/runtime/compiler/dartanalyser.vim
@@ -0,0 +1,23 @@
+" Vim compiler file
+" Compiler: Dart Analyzer
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 May 08
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dartanalyzer"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=dartanalyzer\ --format\ machine
+CompilerSet errorformat=%t%\\w%\\+\|%\\w%\\+\|%\\w%\\+\|%f\|%l\|%c\|%\\d%\\+\|%m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/dartdevc.vim b/runtime/compiler/dartdevc.vim
new file mode 100644
index 0000000..e8d1988
--- /dev/null
+++ b/runtime/compiler/dartdevc.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: Dart Development Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 May 08
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dartdevc"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=dartdevc
+CompilerSet errorformat=%E%f:%l:%c:\ Error:\ %m,
+ \%CTry\ %.%#,
+ \%Z\ %#^%\\+,
+ \%Z%$,
+ \%C%.%#,
+ \%E%f:\ %trror:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/dartdoc.vim b/runtime/compiler/dartdoc.vim
new file mode 100644
index 0000000..26b38d8
--- /dev/null
+++ b/runtime/compiler/dartdoc.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: Dart Documentation Generator
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 May 08
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dartdoc"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=dartdoc
+CompilerSet errorformat=\ \ %tarning:\ %m,
+ \\ \ %trror:\ %m,
+ \%+EGeneration\ failed:\ %m,
+ \%+ISuccess!\ Docs\ generated\ into\ %f,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/dartfmt.vim b/runtime/compiler/dartfmt.vim
new file mode 100644
index 0000000..2e4ab02
--- /dev/null
+++ b/runtime/compiler/dartfmt.vim
@@ -0,0 +1,25 @@
+" Vim compiler file
+" Compiler: Dart Formatter
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 May 08
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dartfmt"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=dartfmt
+CompilerSet errorformat=%Eline\ %l\\,\ column\ %c\ of\ %f:\ %m,
+ \%Z\ %\\{3}│\ %\\+^%\\+,
+ \%C%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/decada.vim b/runtime/compiler/decada.vim
new file mode 100644
index 0000000..0bf5487
--- /dev/null
+++ b/runtime/compiler/decada.vim
@@ -0,0 +1,58 @@
+"------------------------------------------------------------------------------
+" Description: Vim Ada/Dec Ada compiler file
+" Language: Ada (Dec Ada)
+" $Id: decada.vim 887 2008-07-08 14:29:01Z krischik $
+" Copyright: Copyright (C) 2006 Martin Krischik
+" Maintainer: Martin Krischik <krischik@users.sourceforge.net>
+" $Author: krischik $
+" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" Version: 4.6
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/decada.vim $
+" History: 21.07.2006 MK New Dec Ada
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 08.09.2006 MK Correct double load protection.
+" Help Page: compiler-decada
+"------------------------------------------------------------------------------
+
+if (exists("current_compiler") && current_compiler == "decada") || version < 700
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+let current_compiler = "decada"
+
+if !exists("g:decada")
+ let g:decada = decada#New ()
+
+ call ada#Map_Menu (
+ \'Dec Ada.Build',
+ \'<F7>',
+ \'call decada.Make ()')
+
+ call g:decada.Set_Session ()
+endif
+
+if exists(":CompilerSet") != 2
+ "
+ " plugin loaded by other means then the "compiler" command
+ "
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+execute "CompilerSet makeprg=" . escape (g:decada.Make_Command, ' ')
+execute "CompilerSet errorformat=" . escape (g:decada.Error_Format, ' ')
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" vim: foldmethod=marker
diff --git a/runtime/compiler/dot.vim b/runtime/compiler/dot.vim
new file mode 100644
index 0000000..0327739
--- /dev/null
+++ b/runtime/compiler/dot.vim
@@ -0,0 +1,15 @@
+" Vim compiler file
+" Compiler: ATT dot
+" Maintainer: Marcos Macedo <bar4ka@bol.com.br>
+" Last Change: 2004 May 16
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dot"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=dot\ -T$*\ \"%:p\"\ -o\ \"%:p:r.$*\"
diff --git a/runtime/compiler/dotnet.vim b/runtime/compiler/dotnet.vim
new file mode 100644
index 0000000..ac64084
--- /dev/null
+++ b/runtime/compiler/dotnet.vim
@@ -0,0 +1,39 @@
+" Vim compiler file
+" Compiler: dotnet build (.NET CLI)
+" Maintainer: Nick Jensen <nickspoon@gmail.com>
+" Last Change: 2022-12-06
+" License: Vim (see :h license)
+" Repository: https://github.com/nickspoons/vim-cs
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "dotnet"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if get(g:, "dotnet_errors_only", v:false)
+ CompilerSet makeprg=dotnet\ build\ -nologo
+ \\ -consoleloggerparameters:NoSummary
+ \\ -consoleloggerparameters:ErrorsOnly
+else
+ CompilerSet makeprg=dotnet\ build\ -nologo\ -consoleloggerparameters:NoSummary
+endif
+
+if get(g:, "dotnet_show_project_file", v:true)
+ CompilerSet errorformat=%E%f(%l\\,%c):\ %trror\ %m,
+ \%W%f(%l\\,%c):\ %tarning\ %m,
+ \%-G%.%#
+else
+ CompilerSet errorformat=%E%f(%l\\,%c):\ %trror\ %m\ [%.%#],
+ \%W%f(%l\\,%c):\ %tarning\ %m\ [%.%#],
+ \%-G%.%#
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/erlang.vim b/runtime/compiler/erlang.vim
new file mode 100644
index 0000000..e22887e
--- /dev/null
+++ b/runtime/compiler/erlang.vim
@@ -0,0 +1,13 @@
+" Vim compiler file
+" Compiler: Erlang
+" Maintainer: Dmitry Vasiliev <dima at hlabs dot org>
+" Last Change: 2019 Jul 23
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "erlang"
+
+CompilerSet makeprg=erlc\ -Wall\ %:S
+
+CompilerSet errorformat=%f:%l:\ %m
diff --git a/runtime/compiler/eruby.vim b/runtime/compiler/eruby.vim
new file mode 100644
index 0000000..a81a3f3
--- /dev/null
+++ b/runtime/compiler/eruby.vim
@@ -0,0 +1,40 @@
+" Vim compiler file
+" Language: eRuby
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2018 Jan 25
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "eruby"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+if exists("eruby_compiler") && eruby_compiler == "eruby"
+ CompilerSet makeprg=eruby
+else
+ CompilerSet makeprg=erb
+endif
+
+CompilerSet errorformat=
+ \eruby:\ %f:%l:%m,
+ \%+E%f:%l:\ parse\ error,
+ \%W%f:%l:\ warning:\ %m,
+ \%E%f:%l:in\ %*[^:]:\ %m,
+ \%E%f:%l:\ %m,
+ \%-C%\t%\\d%#:%#\ %#from\ %f:%l:in\ %.%#,
+ \%-Z%\t%\\d%#:%#\ %#from\ %f:%l,
+ \%-Z%p^,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8:
diff --git a/runtime/compiler/eslint.vim b/runtime/compiler/eslint.vim
new file mode 100644
index 0000000..7d57acb
--- /dev/null
+++ b/runtime/compiler/eslint.vim
@@ -0,0 +1,16 @@
+" Vim compiler file
+" Compiler: ESLint for JavaScript
+" Maintainer: Romain Lafourcade <romainlafourcade@gmail.com>
+" Last Change: 2020 August 20
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "eslint"
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=npx\ eslint\ --format\ compact
+CompilerSet errorformat=%f:\ line\ %l\\,\ col\ %c\\,\ %m,%-G%.%#
diff --git a/runtime/compiler/fbc.vim b/runtime/compiler/fbc.vim
new file mode 100644
index 0000000..1c29392
--- /dev/null
+++ b/runtime/compiler/fbc.vim
@@ -0,0 +1,27 @@
+" Vim compiler file
+" Compiler: FreeBASIC Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2015 Jan 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "fbc"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=fbc
+CompilerSet errorformat=%-G%.%#Too\ many\ errors\\,\ exiting,
+ \%f(%l)\ %tarning\ %n(%\\d%\\+):\ %m,
+ \%E%f(%l)\ error\ %n:\ %m,
+ \%-Z%p^,
+ \%-C%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/fortran_F.vim b/runtime/compiler/fortran_F.vim
new file mode 100644
index 0000000..d9cb47c
--- /dev/null
+++ b/runtime/compiler/fortran_F.vim
@@ -0,0 +1,27 @@
+" Vim compiler file
+" Compiler: Fortran Company/NAGWare F compiler
+" URL: http://www.unb.ca/chem/ajit/compiler/fortran_F.vim
+" Maintainer: Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
+" Version: 0.2
+" Last Change: 2004 Mar 27
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "fortran_F"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cposet=&cpoptions
+set cpoptions-=C
+
+CompilerSet errorformat=%trror:\ %f\\,\ line\ %l:%m,
+ \%tarning:\ %f\\,\ line\ %l:%m,
+ \%tatal\ Error:\ %f\\,\ line\ %l:%m,
+ \%-G%.%#
+CompilerSet makeprg=F
+
+let &cpoptions=s:cposet
+unlet s:cposet
diff --git a/runtime/compiler/fortran_cv.vim b/runtime/compiler/fortran_cv.vim
new file mode 100644
index 0000000..bc217bd
--- /dev/null
+++ b/runtime/compiler/fortran_cv.vim
@@ -0,0 +1,30 @@
+" Vim compiler file
+" Compiler: Compaq Visual Fortran
+" Maintainer: Joh.-G. Simon (johann-guenter.simon@linde-le.com)
+" Last Change: 11/05/2002
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "fortran_cv"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cposet = &cpoptions
+set cpoptions-=C
+
+" A workable errorformat for Compaq Visual Fortran
+CompilerSet errorformat=
+ \%E%f(%l)\ :\ Error:%m,
+ \%W%f(%l)\ :\ Warning:%m,
+ \%-Z%p%^%.%#,
+ \%-G%.%#,
+" Compiler call
+CompilerSet makeprg=df\ /nologo\ /noobj\ /c\ %:S
+" Visual fortran defaults to printing output on stderr
+" Adjust option shellpipe accordingly
+
+let &cpoptions = s:cposet
+unlet s:cposet
diff --git a/runtime/compiler/fortran_elf90.vim b/runtime/compiler/fortran_elf90.vim
new file mode 100644
index 0000000..34c33cf
--- /dev/null
+++ b/runtime/compiler/fortran_elf90.vim
@@ -0,0 +1,33 @@
+" Vim compiler file
+" Compiler: Essential Lahey Fortran 90
+" Probably also works for Lahey Fortran 90
+" URL: http://www.unb.ca/chem/ajit/compiler/fortran_elf90.vim
+" Maintainer: Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
+" Version: 0.2
+" Last Change: 2004 Mar 27
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "fortran_elf90"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cposet=&cpoptions
+set cpoptions-=C
+
+CompilerSet errorformat=\%ALine\ %l\\,\ file\ %f,
+ \%C%tARNING\ --%m,
+ \%C%tATAL\ --%m,
+ \%C%tBORT\ --%m,
+ \%+C%\\l%.%#\.,
+ \%C%p\|,
+ \%C%.%#,
+ \%Z%$,
+ \%-G%.%#
+CompilerSet makeprg=elf90
+
+let &cpoptions=s:cposet
+unlet s:cposet
diff --git a/runtime/compiler/fortran_g77.vim b/runtime/compiler/fortran_g77.vim
new file mode 100644
index 0000000..744ce6a
--- /dev/null
+++ b/runtime/compiler/fortran_g77.vim
@@ -0,0 +1,48 @@
+" Vim compiler file
+" Compiler: g77 (GNU Fortran)
+" Maintainer: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+" Last Change: $Date: 2004/06/13 18:17:36 $
+" $Revision: 1.1 $
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "fortran_g77"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" Note: The errorformat assumes GNU make
+
+" sample multiline errors (besides gcc backend one-liners):
+" gev.f:14:
+" parameter UPLO = 'Upper-triangle'
+" ^
+" Unsupported VXT statement at (^)
+" gev.f:6:
+" integer desca( * ), descb( * )
+" 1
+" gev.f:19: (continued):
+" end subroutine
+" 2
+" Invalid declaration of or reference to symbol `desca' at (2) [initially seen at (1)]
+
+CompilerSet errorformat=
+ \%Omake:\ %r,
+ \%f:%l:\ warning:\ %m,
+ \%A%f:%l:\ (continued):,
+ \%W%f:%l:\ warning:,
+ \%A%f:%l:\ ,
+ \%-C\ \ \ %p%*[0123456789^]%.%#,
+ \%-C\ \ \ %.%#,
+ \%D%*\\a[%*\\d]:\ Entering\ directory\ `%f',
+ \%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f',
+ \%DMaking\ %*\\a\ in\ %f,
+ \%Z%m
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/fortran_lf95.vim b/runtime/compiler/fortran_lf95.vim
new file mode 100644
index 0000000..685fee7
--- /dev/null
+++ b/runtime/compiler/fortran_lf95.vim
@@ -0,0 +1,27 @@
+" Vim compiler file
+" Compiler: Lahey/Fujitsu Fortran 95
+" URL: http://www.unb.ca/chem/ajit/compiler/fortran_lf95.vim
+" Maintainer: Ajit J. Thakkar (ajit AT unb.ca); <http://www.unb.ca/chem/ajit/>
+" Version: 0.2
+" Last Change: 2004 Mar 27
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "fortran_lf95"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cposet=&cpoptions
+set cpoptions-=C
+
+CompilerSet errorformat=\ %#%n-%t:\ \"%f\"\\,\ line\ %l:%m,
+ \Error\ LINK\.%n:%m,
+ \Warning\ LINK\.%n:%m,
+ \%-G%.%#
+CompilerSet makeprg=lf95
+
+let &cpoptions=s:cposet
+unlet s:cposet
diff --git a/runtime/compiler/fpc.vim b/runtime/compiler/fpc.vim
new file mode 100644
index 0000000..de8e2fe
--- /dev/null
+++ b/runtime/compiler/fpc.vim
@@ -0,0 +1,17 @@
+" Vim compiler file
+" Compiler: FPC 2.1
+" Maintainer: Jaroslaw Blasiok <jaro3000@o2.pl>
+" Last Change: 2005 October 07
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "fpc"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+" NOTE: compiler must be run with -vb to write whole source path, not only file
+" name.
+CompilerSet errorformat=%f(%l\\,%c)\ %m
diff --git a/runtime/compiler/g95.vim b/runtime/compiler/g95.vim
new file mode 100644
index 0000000..ecb3212
--- /dev/null
+++ b/runtime/compiler/g95.vim
@@ -0,0 +1,28 @@
+" Compiler: G95
+" Maintainer: H Xu <xuhdev@gmail.com>
+" Version: 0.1.3
+" Last Change: 2012 Apr 30
+" Homepage: http://www.vim.org/scripts/script.php?script_id=3492
+" https://bitbucket.org/xuhdev/compiler-g95.vim
+" License: Same as Vim
+
+if exists('current_compiler')
+ finish
+endif
+let current_compiler = 'g95'
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=
+ \%AIn\ file\ %f:%l,
+ \%-C%p1,
+ \%-Z%trror:\ %m,
+ \%-Z%tarning\ (%n):\ %m,
+ \%-C%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/gawk.vim b/runtime/compiler/gawk.vim
new file mode 100644
index 0000000..a109eb8
--- /dev/null
+++ b/runtime/compiler/gawk.vim
@@ -0,0 +1,34 @@
+" Vim compiler file
+" Compiler: GNU Awk
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Feb 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "gawk"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=gawk
+CompilerSet errorformat=%Z%.awk:\ %f:%l:\ %p^\ %m,
+ \%Eg%\\=awk:\ %f:%l:\ fatal:\ %m,
+ \%Egawk:\ %f:%l:\ error:\ %m,
+ \%Wgawk:\ %f:%l:\ warning:\ %m,
+ \%Egawk:\ %f:%l:\ %.%#,
+ \gawk:\ %f:%l:\ %tatal:\ %m,
+ \gawk:\ %f:%l:\ %trror:\ %m,
+ \gawk:\ %f:%l:\ %tarning:\ %m,
+ \gawk:\ %tatal:\ %m,
+ \gawk:\ %trror:\ %m,
+ \gawk:\ %tarning:\ %m,
+ \%+C%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/gcc.vim b/runtime/compiler/gcc.vim
new file mode 100644
index 0000000..30e5149
--- /dev/null
+++ b/runtime/compiler/gcc.vim
@@ -0,0 +1,43 @@
+" Vim compiler file
+" Compiler: GNU C Compiler
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-10-14
+" changed pattern for entering/leaving directories
+" by Daniel Hahler, 2019 Jul 12
+" added line suggested by Anton Lindqvist 2016 Mar 31
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "gcc"
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet errorformat=
+ \%*[^\"]\"%f\"%*\\D%l:%c:\ %m,
+ \%*[^\"]\"%f\"%*\\D%l:\ %m,
+ \\"%f\"%*\\D%l:%c:\ %m,
+ \\"%f\"%*\\D%l:\ %m,
+ \%-G%f:%l:\ %trror:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once,
+ \%-G%f:%l:\ %trror:\ for\ each\ function\ it\ appears\ in.),
+ \%f:%l:%c:\ %trror:\ %m,
+ \%f:%l:%c:\ %tarning:\ %m,
+ \%f:%l:%c:\ %m,
+ \%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',
+ \%D%*\\a:\ Entering\ directory\ %*[`']%f',
+ \%X%*\\a:\ Leaving\ directory\ %*[`']%f',
+ \%DMaking\ %*\\a\ in\ %f
+
+if exists('g:compiler_gcc_ignore_unmatched_lines')
+ CompilerSet errorformat+=%-G%.%#
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/gfortran.vim b/runtime/compiler/gfortran.vim
new file mode 100644
index 0000000..1e4e5cf
--- /dev/null
+++ b/runtime/compiler/gfortran.vim
@@ -0,0 +1,27 @@
+" Compiler: GNU Fortran Compiler
+" Maintainer: H Xu <xuhdev@gmail.com>
+" Version: 0.1.3
+" Last Change: 2012 Apr 30
+" Homepage: http://www.vim.org/scripts/script.php?script_id=3496
+" https://bitbucket.org/xuhdev/compiler-gfortran.vim
+" License: Same as Vim
+
+if exists('current_compiler')
+ finish
+endif
+let current_compiler = 'gfortran'
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=
+ \%A%f:%l.%c:,
+ \%-Z%trror:\ %m,
+ \%-Z%tarning:\ %m,
+ \%-C%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/ghc.vim b/runtime/compiler/ghc.vim
new file mode 100644
index 0000000..c98ae30
--- /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/gjs.vim b/runtime/compiler/gjs.vim
new file mode 100644
index 0000000..e033764
--- /dev/null
+++ b/runtime/compiler/gjs.vim
@@ -0,0 +1,25 @@
+" Vim compiler file
+" Compiler: GJS (Gnome JavaScript Bindings)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Jul 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "gjs"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=gjs
+CompilerSet errorformat=%.%#JS\ %tRROR:\ %m\ @\ %f:%c,
+ \%E%.%#JS\ ERROR:\ %m,
+ \%Z@%f:%l:%c,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/gnat.vim b/runtime/compiler/gnat.vim
new file mode 100644
index 0000000..3ad1eb4
--- /dev/null
+++ b/runtime/compiler/gnat.vim
@@ -0,0 +1,76 @@
+"------------------------------------------------------------------------------
+" Description: Vim Ada/GNAT compiler file
+" Language: Ada (GNAT)
+" $Id: gnat.vim 887 2008-07-08 14:29:01Z krischik $
+" Copyright: Copyright (C) 2006 Martin Krischik
+" Maintainer: Martin Krischi <krischik@users.sourceforge.net>k
+" Ned Okie <nokie@radford.edu>
+" $Author: krischik $
+" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" Version: 4.6
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/compiler/gnat.vim $
+" History: 24.05.2006 MK Unified Headers
+" 16.07.2006 MK Ada-Mode as vim-ball
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 19.09.2007 NO use project file only when there is a project
+" Help Page: compiler-gnat
+"------------------------------------------------------------------------------
+
+if (exists("current_compiler")&& current_compiler == "gnat") || version < 700
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+let current_compiler = "gnat"
+
+if !exists("g:gnat")
+ let g:gnat = gnat#New ()
+
+ call ada#Map_Menu (
+ \ 'GNAT.Build',
+ \ '<F7>',
+ \ 'call gnat.Make ()')
+ call ada#Map_Menu (
+ \ 'GNAT.Pretty Print',
+ \ ':GnatPretty',
+ \ 'call gnat.Pretty ()')
+ call ada#Map_Menu (
+ \ 'GNAT.Tags',
+ \ ':GnatTags',
+ \ 'call gnat.Tags ()')
+ call ada#Map_Menu (
+ \ 'GNAT.Find',
+ \ ':GnatFind',
+ \ 'call gnat.Find ()')
+ call ada#Map_Menu (
+ \ 'GNAT.Set Projectfile\.\.\.',
+ \ ':SetProject',
+ \ 'call gnat.Set_Project_File ()')
+
+ call g:gnat.Set_Session ()
+endif
+
+if exists(":CompilerSet") != 2
+ "
+ " plugin loaded by other means then the "compiler" command
+ "
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+execute "CompilerSet makeprg=" . escape (g:gnat.Get_Command('Make'), ' ')
+execute "CompilerSet errorformat=" . escape (g:gnat.Error_Format, ' ')
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" vim: textwidth=0 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" vim: foldmethod=marker
diff --git a/runtime/compiler/go.vim b/runtime/compiler/go.vim
new file mode 100644
index 0000000..cf638f2
--- /dev/null
+++ b/runtime/compiler/go.vim
@@ -0,0 +1,29 @@
+" Vim compiler file
+" Compiler: Go
+" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
+" Last Change: 2014 Aug 16
+
+if exists('current_compiler')
+ finish
+endif
+let current_compiler = 'go'
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+CompilerSet makeprg=go\ build
+CompilerSet errorformat=
+ \%-G#\ %.%#,
+ \%A%f:%l:%c:\ %m,
+ \%A%f:%l:\ %m,
+ \%C%*\\s%m,
+ \%-G%.%#
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: sw=2 sts=2 et
diff --git a/runtime/compiler/haml.vim b/runtime/compiler/haml.vim
new file mode 100644
index 0000000..9464c3d
--- /dev/null
+++ b/runtime/compiler/haml.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: Haml
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2016 Aug 29
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "haml"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+CompilerSet makeprg=haml
+
+CompilerSet errorformat=
+ \Haml\ %trror\ on\ line\ %l:\ %m,
+ \Syntax\ %trror\ on\ line\ %l:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2:
diff --git a/runtime/compiler/hare.vim b/runtime/compiler/hare.vim
new file mode 100644
index 0000000..c0fa68c
--- /dev/null
+++ b/runtime/compiler/hare.vim
@@ -0,0 +1,31 @@
+" Vim compiler file
+" Compiler: Hare Compiler
+" Maintainer: Amelia Clarke <me@rsaihe.dev>
+" Last Change: 2022-09-21
+
+if exists("g:current_compiler")
+ finish
+endif
+let g:current_compiler = "hare"
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+if filereadable("Makefile") || filereadable("makefile")
+ CompilerSet makeprg=make
+else
+ CompilerSet makeprg=hare\ build
+endif
+
+CompilerSet errorformat=
+ \Error\ %f:%l:%c:\ %m,
+ \Syntax\ error:\ %.%#\ at\ %f:%l:%c\\,\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: tabstop=2 shiftwidth=2 expandtab
diff --git a/runtime/compiler/hp_acc.vim b/runtime/compiler/hp_acc.vim
new file mode 100644
index 0000000..15d5ce5
--- /dev/null
+++ b/runtime/compiler/hp_acc.vim
@@ -0,0 +1,38 @@
+" Vim compiler file
+" Compiler: HP aCC
+" Maintainer: Matthias Ulrich <matthias-ulrich@web.de>
+" URL: http://www.subhome.de/vim/hp_acc.vim
+" Last Change: 2012 Apr 30
+"
+" aCC --version says: "HP ANSI C++ B3910B A.03.13"
+" This compiler has been tested on:
+" hp-ux 10.20, hp-ux 11.0 and hp-ux 11.11 (64bit)
+"
+" Tim Brown's aCC is: "HP ANSI C++ B3910B A.03.33"
+" and it also works fine...
+"
+" Now suggestions by aCC are supported (compile flag aCC +w).
+" Thanks to Tim Brown again!!
+"
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "hp_acc"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=%A%trror\ %n\:\ \"%f\"\\,\ line\ %l\ \#\ %m,
+ \%A%tarning\ (suggestion)\ %n\:\ \"%f\"\\,\ line\ %l\ \#\ %m\ %#,
+ \%A%tarning\ %n\:\ \"%f\"\\,\ line\ %l\ \#\ %m\ %#,
+ \%Z\ \ \ \ %p^%.%#,
+ \%-C%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:ts=8:sw=4:cindent
diff --git a/runtime/compiler/icc.vim b/runtime/compiler/icc.vim
new file mode 100644
index 0000000..751fba6
--- /dev/null
+++ b/runtime/compiler/icc.vim
@@ -0,0 +1,18 @@
+" Vim compiler file
+" Compiler: icc - Intel C++
+" Maintainer: Peter Puck <PtrPck@netscape.net>
+" Last Change: 2004 Mar 27
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "icc"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+" I think that Intel is calling the compiler icl under Windows
+
+CompilerSet errorformat=%-Z%p^,%f(%l):\ remark\ #%n:%m,%f(%l)\ :\ (col.\ %c)\ remark:\ %m,%E%f(%l):\ error:\ %m,%E%f(%l):\ error:\ #%n:\ %m,%W%f(%l):\ warning\ #%n:\ %m,%W%f(%l):\ warning:\ %m,%-C%.%#
+
diff --git a/runtime/compiler/icon.vim b/runtime/compiler/icon.vim
new file mode 100644
index 0000000..40f6793
--- /dev/null
+++ b/runtime/compiler/icon.vim
@@ -0,0 +1,33 @@
+" Vim compiler file
+" Compiler: Icon Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jun 16
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "icont"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=icont\ -s
+CompilerSet errorformat=%-G%\\d%\\+\ errors%\\=,
+ \%ERun-time\ error\ %n,
+ \%ERun-time\ error\ %n\ in\ %m,
+ \%ZTraceback:,
+ \%+Coffending\ value:\ %.%#,
+ \%CFile\ %f;\ Line\ %l,
+ \%EFile\ %f;\ Line\ %l\ #\ %m,
+ \%EFile\ %f;\ %m,
+ \%E%f:%l:\ #\ %m,
+ \%E%f:\ %m,
+ \%+C%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/ifort.vim b/runtime/compiler/ifort.vim
new file mode 100644
index 0000000..3a60d0c
--- /dev/null
+++ b/runtime/compiler/ifort.vim
@@ -0,0 +1,27 @@
+" Compiler: Intel Fortran Compiler
+" Maintainer: H Xu <xuhdev@gmail.com>
+" Version: 0.1.1
+" Last Change: 2012 Apr 30
+" Homepage: http://www.vim.org/scripts/script.php?script_id=3497
+" https://bitbucket.org/xuhdev/compiler-ifort.vim
+" License: Same as Vim
+
+if exists('current_compiler')
+ finish
+endif
+let current_compiler = 'ifort'
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=
+ \%A%f(%l):\ %trror\ \#%n:\ %m,
+ \%A%f(%l):\ %tarning\ \#%n:\ %m,
+ \%-Z%p^,
+ \%-G%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/intel.vim b/runtime/compiler/intel.vim
new file mode 100644
index 0000000..254d13b
--- /dev/null
+++ b/runtime/compiler/intel.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: Intel C++ 7.1
+" Maintainer: David Harrison <david_jr@users.sourceforge.net>
+" Last Change: 2012 Apr 30
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "intel"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=%E%f(%l):\ error:\ %m,
+ \%W%f(%l):\ warning:\ %m,
+ \%I%f(%l):\ remark\ #%n:\ %m,
+ \%+C\ \ %m.,
+ \%-Z\ \ %p^,
+ \%-G\\s%#,
+ \%-G%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/irix5_c.vim b/runtime/compiler/irix5_c.vim
new file mode 100644
index 0000000..f440e74
--- /dev/null
+++ b/runtime/compiler/irix5_c.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: SGI IRIX 5.3 cc
+" Maintainer: David Harrison <david_jr@users.sourceforge.net>
+" Last Change: 2012 Apr 30
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "irix5_c"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=\%Ecfe:\ Error:\ %f\\,\ line\ %l:\ %m,
+ \%Wcfe:\ Warning:\ %n:\ %f\\,\ line\ %l:\ %m,
+ \%Wcfe:\ Warning\ %n:\ %f\\,\ line\ %l:\ %m,
+ \%W(%l)\ \ Warning\ %n:\ %m,
+ \%-Z\ %p^,
+ \-G\\s%#,
+ \%-G%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/irix5_cpp.vim b/runtime/compiler/irix5_cpp.vim
new file mode 100644
index 0000000..0112dc1
--- /dev/null
+++ b/runtime/compiler/irix5_cpp.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: SGI IRIX 5.3 CC or NCC
+" Maintainer: David Harrison <david_jr@users.sourceforge.net>
+" Last Change: 2012 Apr 30
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "irix5_cpp"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=%E\"%f\"\\,\ line\ %l:\ error(%n):\ ,
+ \%E\"%f\"\\,\ line\ %l:\ error(%n):\ %m,
+ \%W\"%f\"\\,\ line\ %l:\ warning(%n):\ %m,
+ \%+IC++\ prelinker:\ %m,
+ \%-Z\ \ %p%^,
+ \%+C\ %\\{10}%.%#,
+ \%-G%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/javac.vim b/runtime/compiler/javac.vim
new file mode 100644
index 0000000..8507efd
--- /dev/null
+++ b/runtime/compiler/javac.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: Java Development Kit Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Oct 21
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "javac"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=javac
+CompilerSet errorformat=%E%f:%l:\ error:\ %m,
+ \%W%f:%l:\ warning:\ %m,
+ \%-Z%p^,
+ \%-C%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/jest.vim b/runtime/compiler/jest.vim
new file mode 100644
index 0000000..a4bb549
--- /dev/null
+++ b/runtime/compiler/jest.vim
@@ -0,0 +1,32 @@
+" Vim compiler file
+" Compiler: Jest
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Nov 20
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "jest"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ --no-install\ jest\ --no-colors
+
+CompilerSet makeprg=jest\ --no-colors
+CompilerSet errorformat=%-A\ \ ●\ Console,
+ \%E\ \ ●\ %m,
+ \%Z\ %\\{4}%.%#Error:\ %f:\ %m\ (%l:%c):%\\=,
+ \%Z\ %\\{6}at\ %\\S%#\ (%f:%l:%c),
+ \%Z\ %\\{6}at\ %\\S%#\ %f:%l:%c,
+ \%+C\ %\\{4}%\\w%.%#,
+ \%+C\ %\\{4}%[-+]%.%#,
+ \%-C%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/jikes.vim b/runtime/compiler/jikes.vim
new file mode 100644
index 0000000..2d4500e
--- /dev/null
+++ b/runtime/compiler/jikes.vim
@@ -0,0 +1,18 @@
+" Vim Compiler File
+" Compiler: Jikes
+" Maintainer: Dan Sharp <dwsharp at hotmail dot com>
+" Last Change: 2019 Jul 23
+" URL: http://dwsharp.users.sourceforge.net/vim/compiler
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "jikes"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+" Jikes defaults to printing output on stderr
+CompilerSet makeprg=jikes\ -Xstdout\ +E\ \"%:S\"
+CompilerSet errorformat=%f:%l:%v:%*\\d:%*\\d:%*\\s%m
diff --git a/runtime/compiler/jjs.vim b/runtime/compiler/jjs.vim
new file mode 100644
index 0000000..09a9736
--- /dev/null
+++ b/runtime/compiler/jjs.vim
@@ -0,0 +1,24 @@
+" Vim compiler file
+" Compiler: Nashorn Shell
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2018 Jan 9
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "jjs"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=jjs
+CompilerSet errorformat=%f:%l:%c\ %m,
+ \%f:%l\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/jshint.vim b/runtime/compiler/jshint.vim
new file mode 100644
index 0000000..865591c
--- /dev/null
+++ b/runtime/compiler/jshint.vim
@@ -0,0 +1,25 @@
+" Vim compiler file
+" Compiler: JSHint
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Jul 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "jshint"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ jshint\ --verbose
+
+CompilerSet makeprg=jshint\ --verbose
+CompilerSet errorformat=%f:\ line\ %l\\,\ col\ %c\\,\ %m\ (%t%n),
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/jsonlint.vim b/runtime/compiler/jsonlint.vim
new file mode 100644
index 0000000..5466dcc
--- /dev/null
+++ b/runtime/compiler/jsonlint.vim
@@ -0,0 +1,25 @@
+" Vim compiler file
+" Compiler: JSON Lint
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Jul 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "jsonlint"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ jsonlint\ --compact\ --quiet
+
+CompilerSet makeprg=jsonlint\ --compact\ --quiet
+CompilerSet errorformat=%f:\ line\ %l\\,\ col\ %c\\,\ found:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/mcs.vim b/runtime/compiler/mcs.vim
new file mode 100644
index 0000000..c606586
--- /dev/null
+++ b/runtime/compiler/mcs.vim
@@ -0,0 +1,30 @@
+" Vim compiler file
+" Compiler: Mono C# Compiler
+" Maintainer: Jarek Sobiecki <harijari@go2.pl>
+" Last Updated By: Peter Collingbourne
+" Latest Revision: 2012 Jul 19
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "mcs"
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+setlocal errorformat=
+ \%D%.%#Project\ \"%f/%[%^/\"]%#\"%.%#,
+ \%X%.%#Done\ building\ project\ \"%f/%[%^/\"]%#\"%.%#,
+ \%-G%\\s%.%#,
+ \%E%f(%l):\ error\ CS%n:%m,
+ \%W%f(%l):\ warning\ CS%n:%m,
+ \%E%f(%l\\,%c):\ error\ CS%n:%m,
+ \%W%f(%l\\,%c):\ warning\ CS%n:%m,
+ \%E%>syntax\ error\\,%m,%Z%f(%l\\,%c):\ error\ CS%n:%m,
+ \%D%*\\a[%*\\d]:\ Entering\ directory\ `%f',
+ \%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f',
+ \%DMaking\ %*\\a\ in\ %f,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/mips_c.vim b/runtime/compiler/mips_c.vim
new file mode 100644
index 0000000..a0ebfe7
--- /dev/null
+++ b/runtime/compiler/mips_c.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: SGI IRIX 6.5 MIPS C (cc)
+" Maintainer: David Harrison <david_jr@users.sourceforge.net>
+" Last Change: 2012 Apr 30
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "mips_c"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=%Ecc\-%n\ %.%#:\ ERROR\ File\ =\ %f\%\\,\ Line\ =\ %l,
+ \%Wcc\-%n\ %.%#:\ WARNING\ File\ =\ %f\%\\,\ Line\ =\ %l,
+ \%Icc\-%n\ %.%#:\ REMARK\ File\ =\ %f\%\\,\ Line\ =\ %l,
+ \%+C\ \ %m.,
+ \%-Z\ \ %p^,
+ \%-G\\s%#,
+ \%-G%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/mipspro_c89.vim b/runtime/compiler/mipspro_c89.vim
new file mode 100644
index 0000000..20eb70d
--- /dev/null
+++ b/runtime/compiler/mipspro_c89.vim
@@ -0,0 +1,27 @@
+" Vim compiler file
+" Compiler: SGI IRIX 6.5 MIPSPro C (c89)
+" Maintainer: David Harrison <david_jr@users.sourceforge.net>
+" Last Change: 2012 Apr 30
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "mipspro_c89"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=%Ecc\-%n\ %.%#:\ ERROR\ File\ =\ %f\%\\,\ Line\ =\ %l,
+ \%Wcc\-%n\ %.%#:\ WARNING\ File\ =\ %f\%\\,\ Line\ =\ %l,
+ \%Icc\-%n\ %.%#:\ REMARK\ File\ =\ %f\%\\,\ Line\ =\ %l,
+ \%-Z%p%^,
+ \%+C\ %\\{10}%m%.,
+ \%+C\ \ %m,
+ \%-G\\s%#,
+ \%-G%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/mipspro_cpp.vim b/runtime/compiler/mipspro_cpp.vim
new file mode 100644
index 0000000..2f43af8
--- /dev/null
+++ b/runtime/compiler/mipspro_cpp.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: SGI IRIX 6.5 MIPSPro C++ (CC)
+" Maintainer: David Harrison <david_jr@users.sourceforge.net>
+" Last Change: 2012 Apr 30
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "mipspro_cpp"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=%Ecc\-%n\ %.%#:\ ERROR\ File\ =\ %f\%\\,\ Line\ =\ %l,
+ \%Wcc\-%n\ %.%#:\ WARNING\ File\ =\ %f\%\\,\ Line\ =\ %l,
+ \%Icc\-%n\ %.%#:\ REMARK\ File\ =\ %f\%\\,\ Line\ =\ %l,
+ \%+C\ \ %m.,
+ \%-Z\ \ %p^,
+ \%-G\\s%#,
+ \%-G%.%#
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/modelsim_vcom.vim b/runtime/compiler/modelsim_vcom.vim
new file mode 100644
index 0000000..6aa1bde
--- /dev/null
+++ b/runtime/compiler/modelsim_vcom.vim
@@ -0,0 +1,20 @@
+" Vim Compiler File
+" Compiler: Modelsim Vcom
+" Maintainer: Paul Baleme <pbaleme@mail.com>
+" Last Change: September 8, 2003
+" Thanks to: allanherriman@hotmail.com
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "modelsim_vcom"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+"setlocal errorformat=\*\*\ %tRROR:\ %f(%l):\ %m,%tRROR:\ %f(%l):\ %m,%tARNING\[%*[0-9]\]:\ %f(%l):\ %m,\*\*\ %tRROR:\ %m,%tRROR:\ %m,%tARNING\[%*[0-9]\]:\ %m
+
+"setlocal errorformat=%tRROR:\ %f(%l):\ %m,%tARNING\[%*[0-9]\]:\ %m
+CompilerSet errorformat=\*\*\ %tRROR:\ %f(%l):\ %m,\*\*\ %tRROR:\ %m,\*\*\ %tARNING:\ %m,\*\*\ %tOTE:\ %m,%tRROR:\ %f(%l):\ %m,%tARNING\[%*[0-9]\]:\ %f(%l):\ %m,%tRROR:\ %m,%tARNING\[%*[0-9]\]:\ %m
+
diff --git a/runtime/compiler/msbuild.vim b/runtime/compiler/msbuild.vim
new file mode 100644
index 0000000..3652ca0
--- /dev/null
+++ b/runtime/compiler/msbuild.vim
@@ -0,0 +1,21 @@
+" Vim compiler file
+" Compiler: Microsoft Visual Studio C#
+" Maintainer: Chiel ten Brinke (ctje92@gmail.com)
+" Last Change: 2013 May 13
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "msbuild"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=\ %#%f(%l\\\,%c):\ %m
+CompilerSet makeprg=msbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/msvc.vim b/runtime/compiler/msvc.vim
new file mode 100644
index 0000000..efe36c4
--- /dev/null
+++ b/runtime/compiler/msvc.vim
@@ -0,0 +1,13 @@
+" Vim compiler file
+" Compiler: Microsoft Visual C
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2014 Sep 20
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "msvc"
+
+" The errorformat for MSVC is the default.
+CompilerSet errorformat&
+CompilerSet makeprg=nmake
diff --git a/runtime/compiler/neato.vim b/runtime/compiler/neato.vim
new file mode 100644
index 0000000..bd184b7
--- /dev/null
+++ b/runtime/compiler/neato.vim
@@ -0,0 +1,15 @@
+" Vim compiler file
+" Compiler: ATT neato
+" Maintainer: Marcos Macedo <bar4ka@bol.com.br>
+" Last Change: 2004 May 16
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "neato"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=neato\ -T$*\ \"%:p\"\ -o\ \"%:p:r.$*\"
diff --git a/runtime/compiler/ocaml.vim b/runtime/compiler/ocaml.vim
new file mode 100644
index 0000000..faa8af1
--- /dev/null
+++ b/runtime/compiler/ocaml.vim
@@ -0,0 +1,56 @@
+" Vim Compiler File
+" Compiler: ocaml
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" URL: https://github.com/ocaml/vim-ocaml
+" Last Change:
+" 2020 Mar 28 - Improved error format (Thomas Leonard)
+" 2017 Nov 26 - Improved error format (Markus Mottl)
+" 2013 Aug 27 - Added a new OCaml error format (Markus Mottl)
+"
+" Marc Weber's comments:
+" Setting makeprg doesn't make sense, because there is ocamlc, ocamlopt,
+" ocamake and whatnot. So which one to use?
+"
+" This error format was moved from ftplugin/ocaml.vim to this file,
+" because ftplugin is the wrong file to set an error format
+" and the error format itself is annoying because it joins many lines in this
+" error case:
+"
+" Error: The implementation foo.ml does not match the interface foo.cmi:
+" Modules do not match case.
+"
+" So having it here makes people opt-in
+
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "ocaml"
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet errorformat =
+ \%EFile\ \"%f\"\\,\ lines\ %*\\d-%l\\,\ characters\ %c-%*\\d:,
+ \%EFile\ \"%f\"\\,\ line\ %l\\,\ characters\ %c-%*\\d:,
+ \%EFile\ \"%f\"\\,\ line\ %l\\,\ characters\ %c-%*\\d\ %.%#,
+ \%EFile\ \"%f\"\\,\ line\ %l\\,\ character\ %c:%m,
+ \%+EReference\ to\ unbound\ regexp\ name\ %m,
+ \%Eocamlyacc:\ e\ -\ line\ %l\ of\ \"%f\"\\,\ %m,
+ \%Wocamlyacc:\ w\ -\ %m,
+ \%-Zmake%.%#,
+ \%C%m,
+ \%D%*\\a[%*\\d]:\ Entering\ directory\ `%f',
+ \%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f',
+ \%D%*\\a:\ Entering\ directory\ `%f',
+ \%X%*\\a:\ Leaving\ directory\ `%f',
+ \%D%*\\a[%*\\d]:\ Entering\ directory\ '%f',
+ \%X%*\\a[%*\\d]:\ Leaving\ directory\ '%f',
+ \%D%*\\a:\ Entering\ directory\ '%f',
+ \%X%*\\a:\ Leaving\ directory\ '%f',
+ \%DEntering\ directory\ '%f',
+ \%XLeaving\ directory\ '%f',
+ \%DMaking\ %*\\a\ in\ %f
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/onsgmls.vim b/runtime/compiler/onsgmls.vim
new file mode 100644
index 0000000..68925ef
--- /dev/null
+++ b/runtime/compiler/onsgmls.vim
@@ -0,0 +1,24 @@
+" Vim compiler file
+" Compiler: onsgmls
+" Maintainer: Robert Rowsome <rowsome@wam.umd.edu>
+" Last Change: 2019 Jul 23
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "onsgmls"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+CompilerSet makeprg=onsgmls\ -s\ %:S
+
+CompilerSet errorformat=onsgmls:%f:%l:%c:%t:%m,
+ \onsgmls:%f:%l:%c:%m
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/pbx.vim b/runtime/compiler/pbx.vim
new file mode 100644
index 0000000..9e81ea7
--- /dev/null
+++ b/runtime/compiler/pbx.vim
@@ -0,0 +1,20 @@
+" Vim compiler file
+" Compiler: Apple Project Builder
+" Maintainer: Alexander von Below (public@vonBelow.Com)
+" Last Change: 2004 Mar 27
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "pbx"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+" The compiler actually is gcc, so the errorformat is unchanged
+CompilerSet errorformat&
+
+" default make
+CompilerSet makeprg=pbxbuild
+
diff --git a/runtime/compiler/perl.vim b/runtime/compiler/perl.vim
new file mode 100644
index 0000000..21e384f
--- /dev/null
+++ b/runtime/compiler/perl.vim
@@ -0,0 +1,51 @@
+" Vim compiler file
+" Compiler: Perl syntax checks (perl -Wc)
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Author: Christian J. Robinson <heptite@gmail.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2021 Nov 2
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "perl"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:savecpo = &cpo
+set cpo&vim
+
+if get(g:, 'perl_compiler_force_warnings', 1)
+ let s:warnopt = 'W'
+else
+ let s:warnopt = 'w'
+endif
+
+if getline(1) =~# '-[^ ]*T'
+ let s:taintopt = 'T'
+else
+ let s:taintopt = ''
+endif
+
+exe 'CompilerSet makeprg=perl\ -' . s:warnopt . s:taintopt . 'c\ %:S'
+
+CompilerSet errorformat=
+ \%-G%.%#had\ compilation\ errors.,
+ \%-G%.%#syntax\ OK,
+ \%m\ at\ %f\ line\ %l.,
+ \%+A%.%#\ at\ %f\ line\ %l\\,%.%#,
+ \%+C%.%#
+
+" Explanation:
+" %-G%.%#had\ compilation\ errors., - Ignore the obvious.
+" %-G%.%#syntax\ OK, - Don't include the 'a-okay' message.
+" %m\ at\ %f\ line\ %l., - Most errors...
+" %+A%.%#\ at\ %f\ line\ %l\\,%.%#, - As above, including ', near ...'
+" %+C%.%# - ... Which can be multi-line.
+
+let &cpo = s:savecpo
+unlet s:savecpo
diff --git a/runtime/compiler/perlcritic.vim b/runtime/compiler/perlcritic.vim
new file mode 100644
index 0000000..cf0678e
--- /dev/null
+++ b/runtime/compiler/perlcritic.vim
@@ -0,0 +1,27 @@
+" Vim compiler file
+" Compiler: perlcritic
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Author: Doug Kearns <dougkearns@gmail.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2021 Oct 20
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "perlcritic"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=perlcritic\ --nocolor\ --quiet\ --verbose\ \"\\%f:\\%l:\\%c:\\%s:\\%m\\n\"
+CompilerSet errorformat=%f:%l:%c:%n:%m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/php.vim b/runtime/compiler/php.vim
new file mode 100644
index 0000000..92f93b8
--- /dev/null
+++ b/runtime/compiler/php.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: PHP CLI
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2013 Jun 25
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "php"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+CompilerSet makeprg=php\ -lq
+CompilerSet errorformat=%E<b>%.%#Parse\ error</b>:\ %m\ in\ <b>%f</b>\ on\ line\ <b>%l</b><br\ />,
+ \%W<b>%.%#Notice</b>:\ %m\ in\ <b>%f</b>\ on\ line\ <b>%l</b><br\ />,
+ \%E%.%#Parse\ error:\ %m\ in\ %f\ on\ line\ %l,
+ \%W%.%#Notice:\ %m\ in\ %f\ on\ line\ %l,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/podchecker.vim b/runtime/compiler/podchecker.vim
new file mode 100644
index 0000000..2cd4e13
--- /dev/null
+++ b/runtime/compiler/podchecker.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: podchecker
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Author: Doug Kearns <dougkearns@gmail.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2021 Oct 20
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "podchecker"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=podchecker\ -w
+CompilerSet errorformat=\*\*\*\ %tRROR:\ %m\ at\ line\ %l\ in\ file\ %f,
+ \\*\*\*\ %tARNING:\ %m\ at\ line\ %l\ in\ file\ %f,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/powershell.vim b/runtime/compiler/powershell.vim
new file mode 100644
index 0000000..45d5ec2
--- /dev/null
+++ b/runtime/compiler/powershell.vim
@@ -0,0 +1,84 @@
+" Vim compiler file
+" Compiler: powershell
+" URL: https://github.com/PProvost/vim-ps1
+" Last Change: 2020 Mar 30
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "powershell"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+if !exists("g:ps1_makeprg_cmd")
+ if executable('pwsh')
+ " pwsh is the future
+ let g:ps1_makeprg_cmd = 'pwsh'
+ elseif executable('pwsh.exe')
+ let g:ps1_makeprg_cmd = 'pwsh.exe'
+ elseif executable('powershell.exe')
+ let g:ps1_makeprg_cmd = 'powershell.exe'
+ else
+ let g:ps1_makeprg_cmd = ''
+ endif
+endif
+
+if !executable(g:ps1_makeprg_cmd)
+ echoerr "To use the powershell compiler, please set g:ps1_makeprg_cmd to the powershell executable!"
+endif
+
+" Show CategoryInfo, FullyQualifiedErrorId, etc?
+let g:ps1_efm_show_error_categories = get(g:, 'ps1_efm_show_error_categories', 0)
+
+" Use absolute path because powershell requires explicit relative paths
+" (./file.ps1 is okay, but # expands to file.ps1)
+let &l:makeprg = g:ps1_makeprg_cmd .' %:p:S'
+
+" Parse file, line, char from callstacks:
+" Write-Ouput : The term 'Write-Ouput' is not recognized as the name of a
+" cmdlet, function, script file, or operable program. Check the spelling
+" of the name, or if a path was included, verify that the path is correct
+" and try again.
+" At C:\script.ps1:11 char:5
+" + Write-Ouput $content
+" + ~~~~~~~~~~~
+" + CategoryInfo : ObjectNotFound: (Write-Ouput:String) [], CommandNotFoundException
+" + FullyQualifiedErrorId : CommandNotFoundException
+
+" Showing error in context with underlining.
+CompilerSet errorformat=%+G+%m
+" Error summary.
+CompilerSet errorformat+=%E%*\\S\ :\ %m
+" Error location.
+CompilerSet errorformat+=%CAt\ %f:%l\ char:%c
+" Errors that span multiple lines (may be wrapped to width of terminal).
+CompilerSet errorformat+=%C%m
+" Ignore blank/whitespace-only lines.
+CompilerSet errorformat+=%Z\\s%#
+
+if g:ps1_efm_show_error_categories
+ CompilerSet errorformat^=%+G\ \ \ \ +\ %.%#\\s%#:\ %m
+else
+ CompilerSet errorformat^=%-G\ \ \ \ +\ %.%#\\s%#:\ %m
+endif
+
+
+" Parse file, line, char from of parse errors:
+" At C:\script.ps1:22 char:16
+" + Stop-Process -Name "invalidprocess
+" + ~~~~~~~~~~~~~~~
+" The string is missing the terminator: ".
+" + CategoryInfo : ParserError: (:) [], ParseException
+" + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
+CompilerSet errorformat+=At\ %f:%l\ char:%c
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2:
diff --git a/runtime/compiler/pylint.vim b/runtime/compiler/pylint.vim
new file mode 100644
index 0000000..93079ce
--- /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/pyunit.vim b/runtime/compiler/pyunit.vim
new file mode 100644
index 0000000..2a4ea92
--- /dev/null
+++ b/runtime/compiler/pyunit.vim
@@ -0,0 +1,16 @@
+" Vim compiler file
+" Compiler: Unit testing tool for Python
+" Maintainer: Max Ischenko <mfi@ukr.net>
+" Last Change: 2004 Mar 27
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "pyunit"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
+
diff --git a/runtime/compiler/raco.vim b/runtime/compiler/raco.vim
new file mode 100644
index 0000000..bd10859
--- /dev/null
+++ b/runtime/compiler/raco.vim
@@ -0,0 +1,14 @@
+" Vim compiler file
+" Compiler: raco (Racket command-line tools)
+" Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com>
+" URL: https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+let current_compiler = 'raco'
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=raco
+CompilerSet errorformat=%f:%l:%c:%m
diff --git a/runtime/compiler/racomake.vim b/runtime/compiler/racomake.vim
new file mode 100644
index 0000000..dae95fe
--- /dev/null
+++ b/runtime/compiler/racomake.vim
@@ -0,0 +1,14 @@
+" Vim compiler file
+" Compiler: raco make (Racket command-line tools)
+" Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com>
+" URL: https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+let current_compiler = 'racomake'
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=raco\ make\ --\ %
+CompilerSet errorformat=%f:%l:%c:%m
diff --git a/runtime/compiler/racosetup.vim b/runtime/compiler/racosetup.vim
new file mode 100644
index 0000000..1efe8a1
--- /dev/null
+++ b/runtime/compiler/racosetup.vim
@@ -0,0 +1,14 @@
+" Vim compiler file
+" Compiler: raco setup (Racket command-line tools)
+" Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com>
+" URL: https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+let current_compiler = 'racosetup'
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=raco\ setup
+CompilerSet errorformat=%f:%l:%c:%m
diff --git a/runtime/compiler/racotest.vim b/runtime/compiler/racotest.vim
new file mode 100644
index 0000000..d2a1a3c
--- /dev/null
+++ b/runtime/compiler/racotest.vim
@@ -0,0 +1,14 @@
+" Vim compiler file
+" Compiler: raco test (Racket command-line tools)
+" Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com>
+" URL: https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+let current_compiler = 'racotest'
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=raco\ test\ %
+CompilerSet errorformat=location:%f:%l:%c
diff --git a/runtime/compiler/rake.vim b/runtime/compiler/rake.vim
new file mode 100644
index 0000000..3d11a31
--- /dev/null
+++ b/runtime/compiler/rake.vim
@@ -0,0 +1,40 @@
+" Vim compiler file
+" Language: Rake
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2018 Mar 02
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "rake"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+CompilerSet makeprg=rake
+
+CompilerSet errorformat=
+ \%D(in\ %f),
+ \%\\s%#%\\d%#:%#\ %#from\ %f:%l:%m,
+ \%\\s%#%\\d%#:%#\ %#from\ %f:%l:,
+ \%\\s%##\ %f:%l:%m%\\&%.%#%\\D:%\\d%\\+:%.%#,
+ \%\\s%##\ %f:%l%\\&%.%#%\\D:%\\d%\\+,
+ \%\\s%#[%f:%l:\ %#%m%\\&%.%#%\\D:%\\d%\\+:%.%#,
+ \%\\s%#%f:%l:\ %#%m%\\&%.%#%\\D:%\\d%\\+:%.%#,
+ \%\\s%#%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
+
+" vim: nowrap sw=2 sts=2 ts=8:
diff --git a/runtime/compiler/rhino.vim b/runtime/compiler/rhino.vim
new file mode 100644
index 0000000..30f3dd3
--- /dev/null
+++ b/runtime/compiler/rhino.vim
@@ -0,0 +1,30 @@
+" Vim compiler file
+" Compiler: Rhino Shell (JavaScript in Java)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Jul 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "rhino"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=java\ -jar\ lib/rhino-X.X.XX.jar\ -w\ -strict
+
+CompilerSet makeprg=rhino
+CompilerSet errorformat=%-Gjs:\ %.%#Compilation\ produced%.%#,
+ \%Ejs:\ \"%f\"\\,\ line\ %l:\ %m,
+ \%Ejs:\ uncaught\ JavaScript\ runtime\ exception:\ %m,
+ \%Wjs:\ warning:\ \"%f\"\\,\ line\ %l:\ %m,
+ \%Zjs:\ %p^,
+ \%Cjs:\ %.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/rspec.vim b/runtime/compiler/rspec.vim
new file mode 100644
index 0000000..0cfce04
--- /dev/null
+++ b/runtime/compiler/rspec.vim
@@ -0,0 +1,36 @@
+" Vim compiler file
+" Language: RSpec
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2018 Aug 07
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "rspec"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+CompilerSet makeprg=rspec
+
+CompilerSet errorformat=
+ \%f:%l:\ %tarning:\ %m,
+ \%E%.%#:in\ `load':\ %f:%l:%m,
+ \%E%f:%l:in\ `%*[^']':\ %m,
+ \%-Z\ \ \ \ \ %\\+\#\ %f:%l:%.%#,
+ \%E\ \ \ \ \ Failure/Error:\ %m,
+ \%E\ \ \ \ \ Failure/Error:,
+ \%C\ \ \ \ \ %m,
+ \%C%\\s%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8:
diff --git a/runtime/compiler/rst.vim b/runtime/compiler/rst.vim
new file mode 100644
index 0000000..392bea6
--- /dev/null
+++ b/runtime/compiler/rst.vim
@@ -0,0 +1,32 @@
+" Vim compiler file
+" 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
+endif
+let current_compiler = "rst"
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+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
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/rubocop.vim b/runtime/compiler/rubocop.vim
new file mode 100644
index 0000000..7764b4a
--- /dev/null
+++ b/runtime/compiler/rubocop.vim
@@ -0,0 +1,23 @@
+" Vim compiler file
+" Compiler: RuboCop
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Jul 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "rubocop"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=rubocop\ --format\ emacs
+CompilerSet errorformat=%f:%l:%c:\ %t:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/ruby.vim b/runtime/compiler/ruby.vim
new file mode 100644
index 0000000..82d4d1c
--- /dev/null
+++ b/runtime/compiler/ruby.vim
@@ -0,0 +1,45 @@
+" Vim compiler file
+" Language: Ruby
+" Function: Syntax check and/or error reporting
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Jan 06
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "ruby"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" default settings runs script normally
+" add '-c' switch to run syntax check only:
+"
+" CompilerSet makeprg=ruby\ -c
+"
+" or add '-c' at :make command line:
+"
+" :make -c %<CR>
+"
+CompilerSet makeprg=ruby
+
+CompilerSet errorformat=
+ \%+E%f:%l:\ parse\ error,
+ \%W%f:%l:\ warning:\ %m,
+ \%E%f:%l:in\ %*[^:]:\ %m,
+ \%E%f:%l:\ %m,
+ \%-C%\t%\\d%#:%#\ %#from\ %f:%l:in\ %.%#,
+ \%-Z%\t%\\d%#:%#\ %#from\ %f:%l,
+ \%-Z%p^,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8:
diff --git a/runtime/compiler/rubyunit.vim b/runtime/compiler/rubyunit.vim
new file mode 100644
index 0000000..48e8fa4
--- /dev/null
+++ b/runtime/compiler/rubyunit.vim
@@ -0,0 +1,36 @@
+" Vim compiler file
+" Language: Test::Unit - Ruby Unit Testing Framework
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2014 Mar 23
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "rubyunit"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+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]:,
+ \%E\ %\\+%\\d%\\+)\ Error:,
+ \%C%m:,
+ \%C\ \ \ \ %f:%l:%.%#,
+ \%C%m,
+ \%Z\ %#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8:
diff --git a/runtime/compiler/rustc.vim b/runtime/compiler/rustc.vim
new file mode 100644
index 0000000..5e5b9a4
--- /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\ \%:S
+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
new file mode 100644
index 0000000..9c540ac
--- /dev/null
+++ b/runtime/compiler/sass.vim
@@ -0,0 +1,30 @@
+" Vim compiler file
+" Compiler: Sass
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2016 Aug 29
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "sass"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+CompilerSet makeprg=sass
+
+CompilerSet errorformat=
+ \%f:%l:%m\ (Sass::Syntax%trror),
+ \%ESyntax\ %trror:%m,
+ \%C%\\s%\\+on\ line\ %l\ of\ %f,
+ \%Z%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2:
diff --git a/runtime/compiler/scdoc.vim b/runtime/compiler/scdoc.vim
new file mode 100644
index 0000000..c37969f
--- /dev/null
+++ b/runtime/compiler/scdoc.vim
@@ -0,0 +1,17 @@
+" scdoc compiler for Vim
+" Compiler: scdoc
+" Maintainer: Gregory Anders <contact@gpanders.com>
+" Last Updated: 2019-10-24
+" Upstream: https://github.com/gpanders/vim-scdoc
+
+if exists('current_compiler')
+ finish
+endif
+let current_compiler = 'scdoc'
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=scdoc\ <\ %\ 2>&1
+CompilerSet errorformat=Error\ at\ %l:%c:\ %m,%-G%.%#
diff --git a/runtime/compiler/se.vim b/runtime/compiler/se.vim
new file mode 100644
index 0000000..38fd10c
--- /dev/null
+++ b/runtime/compiler/se.vim
@@ -0,0 +1,30 @@
+" Vim compiler file
+" Compiler: se (Liberty Eiffel Compiler)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2013 Jun 29
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "se"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+CompilerSet makeprg=se\ c
+
+CompilerSet errorformat=%W******\ Warning:\ %m,
+ \%E******\ Fatal\ Error:\ %m,
+ \%E******\ Error:\ %m,
+ \%ZLine\ %l\ column\ %c\ in\ %.%#\ (%f)\ %\\=:,
+ \%ZLine\ %l\ columns\ %c\\,\ %\\d%\\+\ %.%#\ (%f)\ %\\=:,
+ \%+C%*[^\ ]%.%#,
+ \%-GThe\ source\ lines\ involved,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/shellcheck.vim b/runtime/compiler/shellcheck.vim
new file mode 100644
index 0000000..7550439
--- /dev/null
+++ b/runtime/compiler/shellcheck.vim
@@ -0,0 +1,25 @@
+" Vim compiler file
+" Compiler: ShellCheck
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Sep 4
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "shellcheck"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=shellcheck\ -f\ gcc
+CompilerSet errorformat=%f:%l:%c:\ %trror:\ %m\ [SC%n],
+ \%f:%l:%c:\ %tarning:\ %m\ [SC%n],
+ \%f:%l:%c:\ %tote:\ %m\ [SC%n],
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/sml.vim b/runtime/compiler/sml.vim
new file mode 100644
index 0000000..a0b13b6
--- /dev/null
+++ b/runtime/compiler/sml.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: SML/NJ Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Feb 09
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "sml"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=sml
+CompilerSet errorformat=%f:%l.%c-%e.%k\ %trror:\ %m,
+ \%f:%l.%c\ %trror:\ %m,
+ \%trror:\ %m,
+ \%f:%l.%c-%e.%k\ %tarning:\ %m,
+ \%f:%l.%c\ %tarning:\ %m,
+ \%tarning:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/spectral.vim b/runtime/compiler/spectral.vim
new file mode 100644
index 0000000..bd13c51
--- /dev/null
+++ b/runtime/compiler/spectral.vim
@@ -0,0 +1,17 @@
+" Vim compiler file
+" Compiler: Spectral for YAML
+" Maintainer: Romain Lafourcade <romainlafourcade@gmail.com>
+" Last Change: 2021 July 21
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "spectral"
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=spectral\ lint\ %\ -f\ text
+CompilerSet errorformat=%f:%l:%c\ %t%.%\\{-}\ %m
+
diff --git a/runtime/compiler/splint.vim b/runtime/compiler/splint.vim
new file mode 100644
index 0000000..3d7ada6
--- /dev/null
+++ b/runtime/compiler/splint.vim
@@ -0,0 +1,71 @@
+" Vim compiler file
+" Compiler: splint/lclint (C source code checker)
+" Maintainer: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+" Splint Home: http://www.splint.org/
+" Last Change: 2019 Jul 23
+" $Revision: 1.3 $
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "splint"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" adapt this if you want to check more than one file at a time.
+" put command line options in .splintrc or ~/.splintrc
+CompilerSet makeprg=splint\ %:S
+
+" Note: when using the new array bounds checking flags: Each warning
+" usually has several lines and several references to source code mostly
+" within one or two lines (see sample warning below). The easiest way
+" not to mess up file name detection and not to jump to all positions is
+" to add something like
+" -linelen 500 +boundscompacterrormessages
+" to your .splintrc and 'set cmdheight=4' or more.
+" TODO: reliable way to distinguish file names and constraints.
+"
+" sample warning (generic):
+"
+"foo.c:1006:12: Clauses exit with var referencing local storage in one
+" case, fresh storage in other case
+" foo.c:1003:2: Fresh storage var allocated
+"
+" sample warning (bounds checking):
+"
+"bounds.c: (in function updateEnv)
+"bounds.c:10:5: Possible out-of-bounds store:
+" strcpy(str, tmp)
+" Unable to resolve constraint:
+" requires maxSet(str @ bounds.c:10:13) >= maxRead(getenv("MYENV") @
+" bounds.c:6:9)
+" needed to satisfy precondition:
+" requires maxSet(str @ bounds.c:10:13) >= maxRead(tmp @ bounds.c:10:18)
+" derived from strcpy precondition: requires maxSet(<parameter 1>) >=
+" maxRead(<parameter 2>)
+" A memory write may write to an address beyond the allocated buffer. (Use
+" -boundswrite to inhibit warning)
+
+CompilerSet errorformat=%OLCLint*m,
+ \%OSplint*m,
+ \%f(%l\\,%c):\ %m,
+ \%*[\ ]%f:%l:%c:\ %m,
+ \%*[\ ]%f:%l:\ %m,
+ \%*[^\"]\"%f\"%*\\D%l:\ %m,
+ \\"%f\"%*\\D%l:\ %m,
+ \%A%f:%l:%c:\ %m,
+ \%A%f:%l:%m,
+ \\"%f\"\\,
+ \\ line\ %l%*\\D%c%*[^\ ]\ %m,
+ \%D%*\\a[%*\\d]:\ Entering\ directory\ `%f',
+ \%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f',
+ \%DMaking\ %*\\a\ in\ %f,
+ \%C\ %#%m
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/stack.vim b/runtime/compiler/stack.vim
new file mode 100644
index 0000000..4236b4c
--- /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/standard.vim b/runtime/compiler/standard.vim
new file mode 100644
index 0000000..50b7c97
--- /dev/null
+++ b/runtime/compiler/standard.vim
@@ -0,0 +1,16 @@
+" Vim compiler file
+" Compiler: Standard for JavaScript
+" Maintainer: Romain Lafourcade <romainlafourcade@gmail.com>
+" Last Change: 2020 August 20
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "standard"
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=npx\ standard
+CompilerSet errorformat=%f:%l:%c:\ %m,%-G%.%#
diff --git a/runtime/compiler/stylelint.vim b/runtime/compiler/stylelint.vim
new file mode 100644
index 0000000..784a61d
--- /dev/null
+++ b/runtime/compiler/stylelint.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: Stylelint
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Jun 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "stylelint"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ stylelint\ --formatter\ compact
+
+CompilerSet makeprg=stylelint\ --formatter\ compact
+CompilerSet errorformat=%f:\ line\ %l\\,\ col\ %c\\,\ %trror\ -\ %m,
+ \%f:\ line\ %l\\,\ col\ %c\\,\ %tarning\ -\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/tcl.vim b/runtime/compiler/tcl.vim
new file mode 100644
index 0000000..81af185
--- /dev/null
+++ b/runtime/compiler/tcl.vim
@@ -0,0 +1,17 @@
+" Vim compiler file
+" Compiler: tcl
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2004 Nov 27
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "tcl"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=tcl
+
+CompilerSet errorformat=%EError:\ %m,%+Z\ %\\{4}(file\ \"%f\"\ line\ %l),%-G%.%#
diff --git a/runtime/compiler/tex.vim b/runtime/compiler/tex.vim
new file mode 100644
index 0000000..65e15cf
--- /dev/null
+++ b/runtime/compiler/tex.vim
@@ -0,0 +1,67 @@
+" Vim compiler file
+" Compiler: TeX
+" Maintainer: Artem Chuprina <ran@ran.pp.ru>
+" Last Change: 2012 Apr 30
+
+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 exists('b:tex_ignore_makefile') || exists('g:tex_ignore_makefile') ||
+ \(!filereadable('Makefile') && !filereadable('makefile'))
+ " If buffer-local variable 'tex_flavor' exists, it defines TeX flavor,
+ " otherwise the same for global variable with same name, else it will be
+ " LaTeX
+ if exists("b:tex_flavor")
+ let current_compiler = b:tex_flavor
+ elseif exists("g:tex_flavor")
+ let current_compiler = g:tex_flavor
+ else
+ let current_compiler = "latex"
+ endif
+ let &l:makeprg=current_compiler.' -interaction=nonstopmode'
+else
+ let current_compiler = 'make'
+endif
+
+" Value errorformat are taken from vim help, see :help errorformat-LaTeX, with
+" addition from Srinath Avadhanula <srinath@fastmail.fm>
+CompilerSet errorformat=%E!\ LaTeX\ %trror:\ %m,
+ \%E!\ %m,
+ \%+WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#,
+ \%+W%.%#\ at\ lines\ %l--%*\\d,
+ \%WLaTeX\ %.%#Warning:\ %m,
+ \%Cl.%l\ %m,
+ \%+C\ \ %m.,
+ \%+C%.%#-%.%#,
+ \%+C%.%#[]%.%#,
+ \%+C[]%.%#,
+ \%+C%.%#%[{}\\]%.%#,
+ \%+C<%.%#>%.%#,
+ \%C\ \ %m,
+ \%-GSee\ the\ LaTeX%m,
+ \%-GType\ \ H\ <return>%m,
+ \%-G\ ...%.%#,
+ \%-G%.%#\ (C)\ %.%#,
+ \%-G(see\ the\ transcript%.%#),
+ \%-G\\s%#,
+ \%+O(%*[^()])%r,
+ \%+O%*[^()](%*[^()])%r,
+ \%+P(%f%r,
+ \%+P\ %\\=(%f%r,
+ \%+P%*[^()](%f%r,
+ \%+P[%\\d%[^()]%#(%f%r,
+ \%+Q)%r,
+ \%+Q%*[^()])%r,
+ \%+Q[%\\d%*[^()])%r
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/tidy.vim b/runtime/compiler/tidy.vim
new file mode 100644
index 0000000..3f8e68e
--- /dev/null
+++ b/runtime/compiler/tidy.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: HTML Tidy
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Sep 4
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "tidy"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=tidy\ -quiet\ -errors\ --gnu-emacs\ yes
+CompilerSet errorformat=%f:%l:%c:\ %trror:\ %m,
+ \%f:%l:%c:\ %tarning:\ %m,
+ \%f:%l:%c:\ %tnfo:\ %m,
+ \%f:%l:%c:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/ts-node.vim b/runtime/compiler/ts-node.vim
new file mode 100644
index 0000000..14f0ea7
--- /dev/null
+++ b/runtime/compiler/ts-node.vim
@@ -0,0 +1,29 @@
+" Vim compiler file
+" Compiler: TypeScript Runner
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Feb 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "node"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ ts-node
+
+CompilerSet makeprg=ts-node
+CompilerSet errorformat=%f\ %#(%l\\,%c):\ %trror\ TS%n:\ %m,
+ \%E%f:%l,
+ \%+Z%\\w%\\+Error:\ %.%#,
+ \%C%p^%\\+,
+ \%C%.%#,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/tsc.vim b/runtime/compiler/tsc.vim
new file mode 100644
index 0000000..a246fc7
--- /dev/null
+++ b/runtime/compiler/tsc.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: TypeScript Compiler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Feb 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "tsc"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ tsc
+
+CompilerSet makeprg=tsc
+CompilerSet errorformat=%f\ %#(%l\\,%c):\ %trror\ TS%n:\ %m,
+ \%trror\ TS%n:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/typedoc.vim b/runtime/compiler/typedoc.vim
new file mode 100644
index 0000000..3be06f3
--- /dev/null
+++ b/runtime/compiler/typedoc.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: TypeDoc
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Feb 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "typedoc"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ typedoc
+
+CompilerSet makeprg=typedoc
+CompilerSet errorformat=%EError:\ %f(%l),
+ \%WWarning:\ %f(%l),
+ \%+IDocumentation\ generated\ at\ %f,
+ \%Z\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/xbuild.vim b/runtime/compiler/xbuild.vim
new file mode 100644
index 0000000..b508a46
--- /dev/null
+++ b/runtime/compiler/xbuild.vim
@@ -0,0 +1,22 @@
+" Vim compiler file
+" Compiler: Mono C#
+" Maintainer: Chiel ten Brinke (ctje92@gmail.com)
+" Last Change: 2013 May 13
+
+if exists("current_compiler")
+ finish
+endif
+
+let current_compiler = "xbuild"
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=\ %#%f(%l\\\,%c):\ %m
+CompilerSet makeprg=xbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/compiler/xmllint.vim b/runtime/compiler/xmllint.vim
new file mode 100644
index 0000000..79d38b4
--- /dev/null
+++ b/runtime/compiler/xmllint.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: Libxml2 Command-Line Tool
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Jul 30
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "xmllint"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=xmllint\ --valid\ --noout
+CompilerSet errorformat=%E%f:%l:\ %.%#\ error\ :\ %m,
+ \%W%f:%l:\ %.%#\ warning\ :\ %m,
+ \%-Z%p^,
+ \%C%.%#,
+ \%terror:\ %m,
+ \%tarning:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/xmlwf.vim b/runtime/compiler/xmlwf.vim
new file mode 100644
index 0000000..3de9d08
--- /dev/null
+++ b/runtime/compiler/xmlwf.vim
@@ -0,0 +1,23 @@
+" Vim Compiler File
+" Compiler: xmlwf
+" Maintainer: Robert Rowsome <rowsome@wam.umd.edu>
+" Last Change: 2019 Jul 23
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "xmlwf"
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=xmlwf\ %:S
+
+CompilerSet errorformat=%f:%l%c:%m
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/xo.vim b/runtime/compiler/xo.vim
new file mode 100644
index 0000000..525657d
--- /dev/null
+++ b/runtime/compiler/xo.vim
@@ -0,0 +1,26 @@
+" Vim compiler file
+" Compiler: XO
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Jul 10
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "xo"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" CompilerSet makeprg=npx\ xo\ --reporter\ compact
+
+CompilerSet makeprg=xo\ --reporter\ compact
+CompilerSet errorformat=%f:\ line\ %l\\,\ col\ %c\\,\ %trror\ %m,
+ \%f:\ line\ %l\\,\ col\ %c\\,\ %tarning\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/compiler/yamllint.vim b/runtime/compiler/yamllint.vim
new file mode 100644
index 0000000..889b04b
--- /dev/null
+++ b/runtime/compiler/yamllint.vim
@@ -0,0 +1,16 @@
+" Vim compiler file
+" Compiler: Yamllint for YAML
+" Maintainer: Romain Lafourcade <romainlafourcade@gmail.com>
+" Last Change: 2021 July 21
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "yamllint"
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet makeprg=yamllint\ -f\ parsable
+
diff --git a/runtime/compiler/zig.vim b/runtime/compiler/zig.vim
new file mode 100644
index 0000000..2cc6831
--- /dev/null
+++ b/runtime/compiler/zig.vim
@@ -0,0 +1,28 @@
+" Vim compiler file
+" Compiler: Zig Compiler
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "zig"
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+" a subcommand must be provided for the this compiler (test, build-exe, etc)
+if has('patch-7.4.191')
+ CompilerSet makeprg=zig\ \$*\ \%:S
+else
+ CompilerSet makeprg=zig\ \$*\ \"%\"
+endif
+
+" TODO: improve errorformat as needed.
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/compiler/zig_build.vim b/runtime/compiler/zig_build.vim
new file mode 100644
index 0000000..0441267
--- /dev/null
+++ b/runtime/compiler/zig_build.vim
@@ -0,0 +1,29 @@
+" Vim compiler file
+" Compiler: Zig Compiler (zig build)
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists('current_compiler')
+ finish
+endif
+runtime compiler/zig.vim
+let current_compiler = 'zig_build'
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+if exists('g:zig_build_makeprg_params')
+ execute 'CompilerSet makeprg=zig\ build\ '.escape(g:zig_build_makeprg_params, ' \|"').'\ $*'
+else
+ CompilerSet makeprg=zig\ build\ $*
+endif
+
+" TODO: anything to add to errorformat for zig build specifically?
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/compiler/zig_build_exe.vim b/runtime/compiler/zig_build_exe.vim
new file mode 100644
index 0000000..20f0bb3
--- /dev/null
+++ b/runtime/compiler/zig_build_exe.vim
@@ -0,0 +1,27 @@
+" Vim compiler file
+" Compiler: Zig Compiler (zig build-exe)
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists('current_compiler')
+ finish
+endif
+runtime compiler/zig.vim
+let current_compiler = 'zig_build_exe'
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+if has('patch-7.4.191')
+ CompilerSet makeprg=zig\ build-exe\ \%:S\ \$*
+else
+ CompilerSet makeprg=zig\ build-exe\ \"%\"\ \$*
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/compiler/zig_test.vim b/runtime/compiler/zig_test.vim
new file mode 100644
index 0000000..a82d2a6
--- /dev/null
+++ b/runtime/compiler/zig_test.vim
@@ -0,0 +1,27 @@
+" Vim compiler file
+" Compiler: Zig Compiler (zig test)
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists('current_compiler')
+ finish
+endif
+runtime compiler/zig.vim
+let current_compiler = 'zig_test'
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+
+if exists(':CompilerSet') != 2
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+if has('patch-7.4.191')
+ CompilerSet makeprg=zig\ test\ \%:S\ \$*
+else
+ CompilerSet makeprg=zig\ test\ \"%\"\ \$*
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/compiler/zsh.vim b/runtime/compiler/zsh.vim
new file mode 100644
index 0000000..5703c1f
--- /dev/null
+++ b/runtime/compiler/zsh.vim
@@ -0,0 +1,23 @@
+" Vim compiler file
+" Compiler: Zsh
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Sep 6
+
+if exists("current_compiler")
+ finish
+endif
+let current_compiler = "zsh"
+
+if exists(":CompilerSet") != 2 " older Vim always used :setlocal
+ command -nargs=* CompilerSet setlocal <args>
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+CompilerSet makeprg=zsh\ -n\ --\ %:S
+CompilerSet errorformat=%f:\ line\ %l:\ %m,
+ \%-G%.%#
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/defaults.vim b/runtime/defaults.vim
new file mode 100644
index 0000000..f1d5cd1
--- /dev/null
+++ b/runtime/defaults.vim
@@ -0,0 +1,154 @@
+" The default vimrc file.
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last change: 2022 Mar 03
+"
+" This is loaded if no vimrc file was found.
+" Except when Vim is run with "-u NONE" or "-C".
+" Individual settings can be reverted with ":set option&".
+" Other commands can be reverted as mentioned below.
+
+" When started as "evim", evim.vim will already have done these settings.
+if v:progname =~? "evim"
+ finish
+endif
+
+" Bail out if something that ran earlier, e.g. a system wide vimrc, does not
+" want Vim to use these default values.
+if exists('skip_defaults_vim')
+ finish
+endif
+
+" Use Vim settings, rather than Vi settings (much better!).
+" This must be first, because it changes other options as a side effect.
+" Avoid side effects when it was already reset.
+if &compatible
+ set nocompatible
+endif
+
+" When the +eval feature is missing, the set command above will be skipped.
+" Use a trick to reset compatible only when the +eval feature is missing.
+silent! while 0
+ set nocompatible
+silent! endwhile
+
+" Allow backspacing over everything in insert mode.
+set backspace=indent,eol,start
+
+set history=200 " keep 200 lines of command line history
+set ruler " show the cursor position all the time
+set showcmd " display incomplete commands
+set wildmenu " display completion matches in a status line
+
+set ttimeout " time out for key codes
+set ttimeoutlen=100 " wait up to 100ms after Esc for special key
+
+" Show @@@ in the last line if it is truncated.
+set display=truncate
+
+" Show a few lines of context around the cursor. Note that this makes the
+" text scroll if you mouse-click near the start or end of the window.
+set scrolloff=5
+
+" Do incremental searching when it's possible to timeout.
+if has('reltime')
+ set incsearch
+endif
+
+" Do not recognize octal numbers for Ctrl-A and Ctrl-X, most users find it
+" confusing.
+set nrformats-=octal
+
+" For Win32 GUI: remove 't' flag from 'guioptions': no tearoff menu entries.
+if has('win32')
+ set guioptions-=t
+endif
+
+" Don't use Q for Ex mode, use it for formatting. Except for Select mode.
+" Revert with ":unmap Q".
+map Q gq
+sunmap Q
+
+" 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.
+" Revert with ":iunmap <C-U>".
+inoremap <C-U> <C-G>u<C-U>
+
+" In many terminal emulators the mouse works just fine. By enabling it you
+" can position the cursor, Visually select and scroll with the mouse.
+" Only xterm can grab the mouse events when using the shift key, for other
+" terminals use ":", select text and press Esc.
+if has('mouse')
+ if &term =~ 'xterm'
+ set mouse=a
+ else
+ set mouse=nvi
+ endif
+endif
+
+" Only do this part when Vim was compiled with the +eval feature.
+if 1
+
+ " Enable file type detection.
+ " Use the default filetype settings, so that mail gets 'tw' set to 72,
+ " 'cindent' is on in C files, etc.
+ " Also load indent files, to automatically do language-dependent indenting.
+ " Revert with ":filetype off".
+ filetype plugin indent on
+
+ " Put these in an autocmd group, so that you can revert them with:
+ " ":augroup vimStartup | exe 'au!' | augroup END"
+ augroup vimStartup
+ au!
+
+ " When editing a file, always jump to the last known cursor position.
+ " Don't do it when the position is invalid, when inside an event handler
+ " (happens when dropping a file on gvim) and for a commit message (it's
+ " likely a different one than last time).
+ autocmd BufReadPost *
+ \ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit'
+ \ | exe "normal! g`\""
+ \ | endif
+
+ augroup END
+
+ " Quite a few people accidentally type "q:" instead of ":q" and get confused
+ " by the command line window. Give a hint about how to get out.
+ " If you don't like this you can put this in your vimrc:
+ " ":augroup vimHints | exe 'au!' | augroup END"
+ augroup vimHints
+ au!
+ autocmd CmdwinEnter *
+ \ echohl Todo |
+ \ echo 'You discovered the command-line window! You can close it with ":q".' |
+ \ echohl None
+ augroup END
+
+endif
+
+" Switch syntax highlighting on when the terminal has colors or when using the
+" GUI (which always has colors).
+if &t_Co > 2 || has("gui_running")
+ " Revert with ":syntax off".
+ syntax on
+
+ " I like highlighting strings inside C comments.
+ " Revert with ":unlet c_comment_strings".
+ let c_comment_strings=1
+endif
+
+" 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.
+" Revert with: ":delcommand DiffOrig".
+if !exists(":DiffOrig")
+ command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis
+ \ | wincmd p | diffthis
+endif
+
+if has('langmap') && exists('+langremap')
+ " Prevent that the langmap option applies to characters that result from a
+ " mapping. If set (default), this may break plugins (but it's backward
+ " compatible).
+ set nolangremap
+endif
diff --git a/runtime/delmenu.vim b/runtime/delmenu.vim
new file mode 100644
index 0000000..ef663c7
--- /dev/null
+++ b/runtime/delmenu.vim
@@ -0,0 +1,57 @@
+" This Vim script deletes all the menus, so that they can be redefined.
+" Warning: This also deletes all menus defined by the user!
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2019 Dec 10
+
+aunmenu *
+tlunmenu *
+
+if exists('#SetupLazyloadMenus')
+ au! SetupLazyloadMenus
+ augroup! SetupLazyloadMenus
+endif
+
+if exists('#buffer_list')
+ au! buffer_list
+ augroup! buffer_list
+endif
+
+if exists('#LoadBufferMenu')
+ au! LoadBufferMenu
+ augroup! LoadBufferMenu
+endif
+
+if exists('#spellmenu')
+ au! spellmenu
+ augroup! spellmenu
+endif
+
+if exists('#SpellPopupMenu')
+ au! SpellPopupMenu
+ augroup! SpellPopupMenu
+endif
+
+unlet! g:did_install_default_menus
+unlet! g:did_install_syntax_menu
+
+if exists('g:did_menu_trans')
+ menutrans clear
+ unlet g:did_menu_trans
+endif
+
+unlet! g:find_help_dialog
+
+unlet! g:menutrans_fileformat_choices
+unlet! g:menutrans_fileformat_dialog
+unlet! g:menutrans_help_dialog
+unlet! g:menutrans_no_file
+unlet! g:menutrans_path_dialog
+unlet! g:menutrans_set_lang_to
+unlet! g:menutrans_spell_add_ARG_to_word_list
+unlet! g:menutrans_spell_change_ARG_to
+unlet! g:menutrans_spell_ignore_ARG
+unlet! g:menutrans_tags_dialog
+unlet! g:menutrans_textwidth_dialog
+
+" vim: set sw=2 :
diff --git a/runtime/doc.info b/runtime/doc.info
new file mode 100755
index 0000000..a836031
--- /dev/null
+++ b/runtime/doc.info
Binary files differ
diff --git a/runtime/doc/Makefile b/runtime/doc/Makefile
new file mode 100644
index 0000000..2ac337a
--- /dev/null
+++ b/runtime/doc/Makefile
@@ -0,0 +1,549 @@
+#
+# Makefile for the Vim documentation on Unix
+#
+# If you get "don't know how to make scratch", first run make in the source
+# directory. Or remove the include below.
+
+AWK = awk
+
+# Set to $(VIMTARGET) when executed from src/Makefile.
+VIMEXE = vim
+
+# include the config.mk from the source directory. It's only needed to set
+# AWK, used for "make html". Comment this out if the include gives problems.
+include ../../src/auto/config.mk
+
+DOCS = \
+ arabic.txt \
+ autocmd.txt \
+ builtin.txt \
+ change.txt \
+ channel.txt \
+ cmdline.txt \
+ debug.txt \
+ debugger.txt \
+ develop.txt \
+ diff.txt \
+ digraph.txt \
+ editing.txt \
+ eval.txt \
+ farsi.txt \
+ filetype.txt \
+ fold.txt \
+ ft_ada.txt \
+ ft_context.txt \
+ ft_mp.txt \
+ ft_ps1.txt \
+ ft_raku.txt \
+ ft_rust.txt \
+ ft_sql.txt \
+ gui.txt \
+ gui_w32.txt \
+ gui_x11.txt \
+ hangulin.txt \
+ hebrew.txt \
+ help.txt \
+ helphelp.txt \
+ howto.txt \
+ if_cscop.txt \
+ if_lua.txt \
+ if_mzsch.txt \
+ if_ole.txt \
+ if_perl.txt \
+ if_pyth.txt \
+ if_ruby.txt \
+ if_sniff.txt \
+ if_tcl.txt \
+ indent.txt \
+ index.txt \
+ insert.txt \
+ intro.txt \
+ map.txt \
+ mbyte.txt \
+ message.txt \
+ mlang.txt \
+ motion.txt \
+ netbeans.txt \
+ options.txt \
+ os_390.txt \
+ os_amiga.txt \
+ os_beos.txt \
+ os_dos.txt \
+ os_haiku.txt \
+ os_mac.txt \
+ os_mint.txt \
+ os_msdos.txt \
+ os_os2.txt \
+ os_qnx.txt \
+ os_risc.txt \
+ os_unix.txt \
+ os_vms.txt \
+ os_win32.txt \
+ pattern.txt \
+ pi_getscript.txt \
+ pi_gzip.txt \
+ pi_logipat.txt \
+ pi_netrw.txt \
+ pi_paren.txt \
+ pi_spec.txt \
+ pi_tar.txt \
+ pi_vimball.txt \
+ pi_zip.txt \
+ popup.txt \
+ print.txt \
+ quickfix.txt \
+ quickref.txt \
+ quotes.txt \
+ recover.txt \
+ remote.txt \
+ repeat.txt \
+ rileft.txt \
+ russian.txt \
+ scroll.txt \
+ sign.txt \
+ spell.txt \
+ sponsor.txt \
+ starting.txt \
+ syntax.txt \
+ tabpage.txt \
+ tagsrch.txt \
+ term.txt \
+ terminal.txt \
+ testing.txt \
+ textprop.txt \
+ tips.txt \
+ todo.txt \
+ uganda.txt \
+ undo.txt \
+ userfunc.txt \
+ usr_01.txt \
+ usr_02.txt \
+ usr_03.txt \
+ usr_04.txt \
+ usr_05.txt \
+ usr_06.txt \
+ usr_07.txt \
+ usr_08.txt \
+ usr_09.txt \
+ usr_10.txt \
+ usr_11.txt \
+ usr_12.txt \
+ usr_20.txt \
+ usr_21.txt \
+ usr_22.txt \
+ usr_23.txt \
+ usr_24.txt \
+ usr_25.txt \
+ usr_26.txt \
+ usr_27.txt \
+ usr_28.txt \
+ usr_29.txt \
+ usr_30.txt \
+ usr_31.txt \
+ usr_32.txt \
+ usr_40.txt \
+ usr_41.txt \
+ usr_42.txt \
+ usr_43.txt \
+ usr_44.txt \
+ usr_45.txt \
+ usr_50.txt \
+ usr_51.txt \
+ usr_52.txt \
+ usr_90.txt \
+ usr_toc.txt \
+ various.txt \
+ version4.txt \
+ version5.txt \
+ version6.txt \
+ version7.txt \
+ version8.txt \
+ version9.txt \
+ vi_diff.txt \
+ vim9.txt \
+ vim9class.txt \
+ visual.txt \
+ windows.txt \
+ workshop.txt
+
+HTMLS = \
+ arabic.html \
+ autocmd.html \
+ builtin.html \
+ change.html \
+ channel.html \
+ cmdline.html \
+ debug.html \
+ debugger.html \
+ develop.html \
+ diff.html \
+ digraph.html \
+ editing.html \
+ eval.html \
+ farsi.html \
+ filetype.html \
+ fold.html \
+ ft_ada.html \
+ ft_context.html \
+ ft_mp.html \
+ ft_ps1.html \
+ ft_raku.html \
+ ft_rust.html \
+ ft_sql.html \
+ gui.html \
+ gui_w32.html \
+ gui_x11.html \
+ hangulin.html \
+ hebrew.html \
+ helphelp.html \
+ howto.html \
+ if_cscop.html \
+ if_lua.html \
+ if_mzsch.html \
+ if_ole.html \
+ if_perl.html \
+ if_pyth.html \
+ if_ruby.html \
+ if_sniff.html \
+ if_tcl.html \
+ indent.html \
+ index.html \
+ insert.html \
+ intro.html \
+ map.html \
+ mbyte.html \
+ message.html \
+ mlang.html \
+ motion.html \
+ netbeans.html \
+ options.html \
+ os_390.html \
+ os_amiga.html \
+ os_beos.html \
+ os_dos.html \
+ os_haiku.html \
+ os_mac.html \
+ os_mint.html \
+ os_msdos.html \
+ os_os2.html \
+ os_qnx.html \
+ os_risc.html \
+ os_unix.html \
+ os_vms.html \
+ os_win32.html \
+ pattern.html \
+ pi_getscript.html \
+ pi_gzip.html \
+ pi_logipat.html \
+ pi_netrw.html \
+ pi_paren.html \
+ pi_spec.html \
+ pi_tar.html \
+ pi_vimball.html \
+ pi_zip.html \
+ popup.html \
+ print.html \
+ quickfix.html \
+ quickref.html \
+ quotes.html \
+ recover.html \
+ remote.html \
+ repeat.html \
+ rileft.html \
+ russian.html \
+ scroll.html \
+ sign.html \
+ spell.html \
+ sponsor.html \
+ starting.html \
+ syntax.html \
+ tabpage.html \
+ tagsrch.html \
+ term.html \
+ terminal.html \
+ testing.html \
+ textprop.html \
+ tips.html \
+ todo.html \
+ uganda.html \
+ undo.html \
+ userfunc.html \
+ usr_01.html \
+ usr_02.html \
+ usr_03.html \
+ usr_04.html \
+ usr_05.html \
+ usr_06.html \
+ usr_07.html \
+ usr_08.html \
+ usr_09.html \
+ usr_10.html \
+ usr_11.html \
+ usr_12.html \
+ usr_20.html \
+ usr_21.html \
+ usr_22.html \
+ usr_23.html \
+ usr_24.html \
+ usr_25.html \
+ usr_26.html \
+ usr_27.html \
+ usr_28.html \
+ usr_29.html \
+ usr_30.html \
+ usr_31.html \
+ usr_32.html \
+ usr_40.html \
+ usr_41.html \
+ usr_42.html \
+ usr_43.html \
+ usr_44.html \
+ usr_45.html \
+ usr_50.html \
+ usr_51.html \
+ usr_52.html \
+ usr_90.html \
+ usr_toc.html \
+ various.html \
+ version4.html \
+ version5.html \
+ version6.html \
+ version7.html \
+ version8.html \
+ version9.html \
+ vi_diff.html \
+ vimindex.html \
+ vim9.html \
+ vim9class.html \
+ visual.html \
+ windows.html \
+ workshop.html
+
+CONVERTED = \
+ vim-fr.UTF-8.1 \
+ evim-fr.UTF-8.1 \
+ vimdiff-fr.UTF-8.1 \
+ vimtutor-fr.UTF-8.1 \
+ xxd-fr.UTF-8.1 \
+ vim-it.UTF-8.1 \
+ evim-it.UTF-8.1 \
+ vimdiff-it.UTF-8.1 \
+ vimtutor-it.UTF-8.1 \
+ xxd-it.UTF-8.1 \
+ vim-pl.UTF-8.1 \
+ evim-pl.UTF-8.1 \
+ vimdiff-pl.UTF-8.1 \
+ vimtutor-pl.UTF-8.1 \
+ xxd-pl.UTF-8.1 \
+ vim-ru.UTF-8.1 \
+ evim-ru.UTF-8.1 \
+ vimdiff-ru.UTF-8.1 \
+ vimtutor-ru.UTF-8.1 \
+ xxd-ru.UTF-8.1 \
+ vim-tr.UTF-8.1 \
+ evim-tr.UTF-8.1 \
+ vimdiff-tr.UTF-8.1 \
+ vimtutor-tr.UTF-8.1
+
+.SUFFIXES:
+.SUFFIXES: .c .o .txt .html
+
+all: tags vim.man evim.man vimdiff.man vimtutor.man xxd.man $(CONVERTED)
+
+# Use Vim to generate the tags file. Can only be used when Vim has been
+# compiled and installed. Supports multiple languages.
+vimtags: $(DOCS)
+ @$(VIMEXE) --clean -esX -V1 -u doctags.vim
+
+# Use "doctags" to generate the tags file. Only works for English!
+tags: doctags $(DOCS)
+ ./doctags $(DOCS) | LANG=C LC_ALL=C sort >tags
+ uniq -d -2 tags
+
+doctags: doctags.c
+ $(CC) doctags.c -o doctags
+
+vim.man: vim.1
+ nroff -man vim.1 | sed -e s/.//g > vim.man
+
+evim.man: evim.1
+ nroff -man evim.1 | sed -e s/.//g > evim.man
+
+vimdiff.man: vimdiff.1
+ nroff -man vimdiff.1 | sed -e s/.//g > vimdiff.man
+
+vimtutor.man: vimtutor.1
+ nroff -man vimtutor.1 | sed -e s/.//g > vimtutor.man
+
+xxd.man: xxd.1
+ nroff -man xxd.1 | sed -e s/.//g > xxd.man
+
+uganda.nsis.txt: uganda.txt
+ sed -e 's/[ ]*\*[-a-zA-Z0-9.]*\*//g' -e 's/vim:tw=78:.*//' \
+ uganda.txt | uniq >uganda.nsis.txt
+
+# Awk version of .txt to .html conversion.
+html: noerrors tags $(HTMLS)
+ @if test -f errors.log; then more errors.log; fi
+
+noerrors:
+ -rm -f errors.log
+
+$(HTMLS): tags.ref
+
+.txt.html:
+ $(AWK) -f makehtml.awk $< >$@
+
+# index.html is the starting point for HTML, but for the help files it is
+# help.txt. Therefore use vimindex.html for index.txt.
+index.html: help.txt
+ $(AWK) -f makehtml.awk help.txt >index.html
+
+vimindex.html: index.txt
+ $(AWK) -f makehtml.awk index.txt >vimindex.html
+
+tags.ref tags.html: tags
+ $(AWK) -f maketags.awk tags >tags.html
+
+# Perl version of .txt to .html conversion.
+# There can't be two rules to produce a .html from a .txt file.
+# Just run over all .txt files each time one changes. It's fast anyway.
+perlhtml: tags $(DOCS)
+ ./vim2html.pl tags $(DOCS)
+
+# Check URLs in the help with "curl".
+test_urls:
+ vim -S test_urls.vim
+
+clean:
+ -rm -f doctags *.html tags.ref
+
+# These files are in the extra archive, skip if not present
+
+arabic.txt:
+ touch arabic.txt
+
+farsi.txt:
+ touch farsi.txt
+
+hebrew.txt:
+ touch hebrew.txt
+
+russian.txt:
+ touch russian.txt
+
+gui_w32.txt:
+ touch gui_w32.txt
+
+if_ole.txt:
+ touch if_ole.txt
+
+os_390.txt:
+ touch os_390.txt
+
+os_amiga.txt:
+ touch os_amiga.txt
+
+os_beos.txt:
+ touch os_beos.txt
+
+os_dos.txt:
+ touch os_dos.txt
+
+os_haiku.txt:
+ touch os_haiku.txt
+
+os_mac.txt:
+ touch os_mac.txt
+
+os_mint.txt:
+ touch os_mint.txt
+
+os_msdos.txt:
+ touch os_msdos.txt
+
+os_os2.txt:
+ touch os_os2.txt
+
+os_qnx.txt:
+ touch os_qnx.txt
+
+os_risc.txt:
+ touch os_risc.txt
+
+os_win32.txt:
+ touch os_win32.txt
+
+# Note that $< works with GNU make while $> works for BSD make.
+# Is there a solution that works for both??
+vim-fr.UTF-8.1: vim-fr.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+evim-fr.UTF-8.1: evim-fr.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+vimdiff-fr.UTF-8.1: vimdiff-fr.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+vimtutor-fr.UTF-8.1: vimtutor-fr.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+xxd-fr.UTF-8.1: xxd-fr.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+vim-it.UTF-8.1: vim-it.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+evim-it.UTF-8.1: evim-it.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+vimdiff-it.UTF-8.1: vimdiff-it.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+vimtutor-it.UTF-8.1: vimtutor-it.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+xxd-it.UTF-8.1: xxd-it.1
+ iconv -f latin1 -t utf-8 $< >$@
+
+vim-pl.UTF-8.1: vim-pl.1
+ iconv -f latin2 -t utf-8 $< >$@
+
+evim-pl.UTF-8.1: evim-pl.1
+ iconv -f latin2 -t utf-8 $< >$@
+
+vimdiff-pl.UTF-8.1: vimdiff-pl.1
+ iconv -f latin2 -t utf-8 $< >$@
+
+vimtutor-pl.UTF-8.1: vimtutor-pl.1
+ iconv -f latin2 -t utf-8 $< >$@
+
+xxd-pl.UTF-8.1: xxd-pl.1
+ iconv -f latin2 -t utf-8 $< >$@
+
+vim-ru.UTF-8.1: vim-ru.1
+ iconv -f KOI8-R -t utf-8 $< >$@
+
+evim-ru.UTF-8.1: evim-ru.1
+ iconv -f KOI8-R -t utf-8 $< >$@
+
+vimdiff-ru.UTF-8.1: vimdiff-ru.1
+ iconv -f KOI8-R -t utf-8 $< >$@
+
+vimtutor-ru.UTF-8.1: vimtutor-ru.1
+ iconv -f KOI8-R -t utf-8 $< >$@
+
+xxd-ru.UTF-8.1: xxd-ru.1
+ iconv -f KOI8-R -t utf-8 $< >$@
+
+vim-tr.UTF-8.1: vim-tr.1
+ iconv -f latin5 -t utf-8 $< >$@
+
+evim-tr.UTF-8.1: evim-tr.1
+ iconv -f latin5 -t utf-8 $< >$@
+
+vimdiff-tr.UTF-8.1: vimdiff-tr.1
+ iconv -f latin5 -t utf-8 $< >$@
+
+vimtutor-tr.UTF-8.1: vimtutor-tr.1
+ iconv -f latin5 -t utf-8 $< >$@
diff --git a/runtime/doc/arabic.txt b/runtime/doc/arabic.txt
new file mode 100644
index 0000000..ff1cac4
--- /dev/null
+++ b/runtime/doc/arabic.txt
@@ -0,0 +1,328 @@
+*arabic.txt* For Vim version 9.0. Last change: 2021 Jun 22
+
+
+ VIM REFERENCE MANUAL by Nadim Shaikli
+
+
+Arabic Language support (options & mappings) for Vim *Arabic*
+
+
+ *E800*
+In order to use right-to-left and Arabic mapping support, it is
+necessary to compile Vim with the |+arabic| feature.
+
+These functions have been created by Nadim Shaikli <nadim-at-arabeyes.org>
+
+It is best to view this file with these settings within Vim's GUI: >
+
+ :set encoding=utf-8
+ :set arabicshape
+
+
+Introduction
+------------
+Arabic is a rather demanding language in which a number of special
+features are required. Characters are right-to-left oriented and
+ought to appear as such on the screen (i.e. from right to left).
+Arabic also requires shaping of its characters, meaning the same
+character has a different visual form based on its relative location
+within a word (initial, medial, final or stand-alone). Arabic also
+requires two different forms of combining and the ability, in
+certain instances, to either superimpose up to two characters on top
+of another (composing) or the actual substitution of two characters
+into one (combining). Lastly, to display Arabic properly one will
+require not only ISO-8859-6 (U+0600-U+06FF) fonts, but will also
+require Presentation Form-B (U+FE70-U+FEFF) fonts both of which are
+subsets within a so-called ISO-10646-1 font.
+
+The commands, prompts and help files are not in Arabic, therefore
+the user interface remains the standard Vi interface.
+
+
+Highlights
+----------
+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
+ file in right-to-left and left-to-right modes, simultaneously.
+
+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
+ right-to-left mode (there are liable to be bugs).
+
+o Changing keyboard mapping and reverse insert modes using a single
+ command.
+
+o Toggling complete Arabic support via a single command.
+
+o While in Arabic mode, numbers are entered from left to right. Upon
+ entering a none number character, that character will be inserted
+ just into the left of the last number.
+
+o Arabic keymapping on the command line in reverse insert mode.
+
+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.
+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.
+Do an Internet search or check www.arabeyes.org for further
+info on where to obtain the necessary Arabic fonts.
+
+
+Font Installation
+-----------------
+
+o Installation of fonts for X Window systems (Unix/Linux)
+
+ Depending on your system, copy your_ARABIC_FONT file into a
+ directory of your choice. Change to the directory containing
+ the Arabic fonts and execute the following commands:
+
+ % mkfontdir
+ % xset +fp path_name_of_arabic_fonts_directory
+
+
+Usage
+-----
+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.
+>
+ :set guifont=your_ARABIC_FONT
+<
+ NOTE: the string 'your_ARABIC_FONT' is used to denote a complete
+ font name akin to that used in Linux/Unix systems.
+ (e.g. -misc-fixed-medium-r-normal--20-200-75-75-c-100-iso10646-1)
+
+ You can append the 'guifont' set command to your .vimrc file
+ in order to get the same above noted results. In other words,
+ you can include ':set guifont=your_ARABIC_FONT' to your .vimrc
+ file.
+
+ + Under the X Window environment, you can also start Vim with
+ '-fn your_ARABIC_FONT' option.
+
+o Setting the appropriate character Encoding
+ To enable the correct Arabic encoding the following command needs
+ to be appended,
+>
+ :set encoding=utf-8
+<
+ to your .vimrc file (entering the command manually into your Vim
+ window is highly discouraged). In short, include ':set
+ encoding=utf-8' to your .vimrc file.
+
+ Attempts to use Arabic without UTF-8 will result the following
+ warning message,
+
+ *W17* >
+ Arabic requires UTF-8, do ':set encoding=utf-8'
+
+o Enable Arabic settings [short-cut]
+
+ In order to simplify and streamline things, you can either invoke
+ Vim with the command-line option,
+
+ % vim -A my_utf8_arabic_file ...
+
+ or enable 'arabic' via the following command within Vim
+>
+ :set arabic
+<
+ The two above noted possible invocations are the preferred manner
+ in which users are instructed to proceed. Barring an enabled 'termbidi'
+ setting, both command options:
+
+ 1. set the appropriate keymap
+ 2. enable the deletion of a single combined pair character
+ 3. enable rightleft mode
+ 4. enable rightleftcmd mode (affecting the command-line)
+ 5. enable arabicshape mode (do visual character alterations)
+
+ You may also append the command to your .vimrc file and simply
+ include ':set arabic' to it.
+
+ You are also capable of disabling Arabic support via
+>
+ :set noarabic
+<
+ which resets everything that the command had enabled without touching
+ the global settings as they could affect other possible open buffers.
+ In short the 'noarabic' command,
+
+ 1. resets to the alternate keymap
+ 2. disables the deletion of a single combined pair character
+ 3. disables rightleft mode
+
+ NOTE: the 'arabic' command takes into consideration 'termbidi' for
+ possible external bi-directional (bidi) support from the
+ terminal ("mlterm" for instance offers such support).
+ 'termbidi', if available, is superior to rightleft support
+ and its support is preferred due to its level of offerings.
+ 'arabic' when 'termbidi' is enabled only sets the keymap.
+
+ For vertical window isolation while setting 'termbidi' an LTR
+ vertical separator like "l" or "𝖨" may be used. It may also be
+ hidden by changing its color to the foreground color: >
+ :set fillchars=vert:l
+ :hi VertSplit ctermbg=White
+< Note that this is a workaround, not a proper solution.
+
+ If, on the other hand, you'd like to be verbose and explicit and
+ are opting not to use the 'arabic' short-cut command, here's what
+ is needed (i.e. if you use ':set arabic' you can skip this section) -
+
+ + Arabic Keymapping Activation
+
+ To activate the Arabic keymap (i.e. to remap your English/Latin
+ keyboard to look-n-feel like a standard Arabic one), set the
+ 'keymap' command to "arabic". This is done by entering
+>
+ :set keymap=arabic
+<
+ in your Vim window. You can also append the 'keymap' set command to
+ your .vimrc file. In other words, you can include ':set keymap=arabic'
+ to your .vimrc file.
+
+ To turn toggle (or switch) your keymapping between Arabic and the
+ default mapping (English), it is advised that users use the 'CTRL-^'
+ key press while in insert (or add/replace) mode. The command-line
+ will display your current mapping by displaying an "Arabic" string
+ next to your insertion mode (e.g. -- INSERT Arabic --) indicating
+ your current keymap.
+
+ + Arabic deletion of a combined pair character
+
+ 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
+ to harakat and their combined forms). You can enable this option
+ by entering
+>
+ :set delcombine
+<
+ in our Vim window. You can also append the 'delcombine' set command
+ to your .vimrc file. In other words, you can include ':set delcombine'
+ to your .vimrc file.
+
+ + Arabic right-to-left Mode
+
+ By default Vim starts in Left-to-right mode. 'rightleft' is the
+ command that allows one to alter a window's orientation - that can
+ be accomplished via,
+
+ - Toggling between left-to-right and right-to-left modes is
+ accomplished through ':set rightleft' and ':set norightleft'.
+
+ - While in Left-to-right mode, enter ':set rl' in the command line
+ ('rl' is the abbreviation for rightleft).
+
+ - Put the ':set rl' line in your '.vimrc' file to start Vim in
+ right-to-left mode permanently.
+
+ + Arabic right-to-left command-line Mode
+
+ For certain commands the editing can be done in right-to-left mode.
+ Currently this is only applicable to search commands.
+
+ This is controlled with the 'rightleftcmd' option. The default is
+ "search", which means that windows in which 'rightleft' is set will
+ edit search commands in right-left mode. To disable this behavior,
+>
+ :set rightleftcmd=
+<
+ To enable right-left editing of search commands again,
+>
+ :set rightleftcmd&
+<
+ + Arabic Shaping Mode
+
+ To activate the required visual characters alterations (shaping,
+ composing, combining) which the Arabic language requires, enable
+ the 'arabicshape' command. This is done by entering
+>
+ :set arabicshape
+<
+ in our Vim window. You can also append the 'arabicshape' set
+ command to your .vimrc file. In other words, you can include
+ ':set arabicshape' to your .vimrc file.
+
+
+Keymap/Keyboard *arabickeymap*
+---------------
+
+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.
+
+Note: UTF-8 is an all encompassing encoding and as such is
+ the only supported (and encouraged) encoding with
+ regard to Arabic (all other proprietary encodings
+ should be discouraged and frowned upon).
+
+o Keyboard
+
+ + CTRL-^ in insert/replace mode toggles between Arabic/Latin mode
+
+ + Keyboard mapping is based on the Microsoft's Arabic keymap (the
+ de facto standard in the Arab world):
+
+ +---------------------------------------------------------------------+
+ |! |@ |# |$ |% |^ |& |* |( |) |_ |+ || |~ ّ |
+ |1 ١ |2 ٢ |3 ٣ |4 ٤ |5 ٥ |6 ٦ |7 ٧ |8 ٨ |9 ٩ |0 ٠ |- |= |\ |` ذ |
+ +---------------------------------------------------------------------+
+ |Q َ |W ً |E ُ |R ٌ |T لإ |Y إ |U ` |I ÷ |O x |P ؛ |{ < |} > |
+ |q ض |w ص |e ث |r ق |t ف |y غ |u ع |i ه |o خ |p ح |[ ج |] د |
+ +-----------------------------------------------------------+
+ |A ِ |S ٍ |D [ |F ] |G لأ |H أ |J ـ |K ، |L / |: |" |
+ |a ش |s س |d ي |f ب |g ل |h ا |j ت |k ن |l م |; ك |' ط |
+ +------------------------------------------------------+
+ |Z ~ |X ْ |C { |V } |B لآ |N آ |M ' |< , |> . |? ؟ |
+ |z ئ |x ء |c ؤ |v ر |b لا |n ى |m ة |, و |. ز |/ ظ |
+ +-------------------------------------------------+
+
+Restrictions
+------------
+
+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).
+
+
+Known Bugs
+----------
+
+There is one known minor bug,
+
+ 1. If you insert a haraka (e.g. Fatha (U+064E)) after a LAM (U+0644)
+ and then insert an ALEF (U+0627), the appropriate combining will
+ not happen due to the sandwiched haraka resulting in something
+ that will NOT be displayed correctly.
+
+ WORK-AROUND: Don't include harakats between LAM and ALEF combos.
+ In general, don't anticipate to see correct visual
+ representation with regard to harakats and LAM+ALEF
+ combined characters (even those entered after both
+ characters). The problem noted is strictly a visual
+ one, meaning saving such a file will contain all the
+ appropriate info/encodings - nothing is lost.
+
+No other bugs are known to exist.
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
new file mode 100644
index 0000000..04f0191
--- /dev/null
+++ b/runtime/doc/autocmd.txt
@@ -0,0 +1,1921 @@
+*autocmd.txt* For Vim version 9.0. Last change: 2023 Feb 18
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Automatic commands *autocommand* *autocommands*
+
+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|
+
+
+==============================================================================
+1. Introduction *autocmd-intro*
+
+You can specify commands to be executed automatically when reading or writing
+a file, when entering or leaving a buffer or window, and when exiting Vim.
+For example, you can create an autocommand to set the 'cindent' option for
+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 or .exrc file.
+
+ *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.
+ For example: If you use autocommands to decompress a file when starting to
+ edit it, make sure that the autocommands for compressing when writing work
+ correctly.
+- Be prepared for an error halfway through (e.g., disk full). Vim will mostly
+ be able to undo the changes to the buffer, but you may have to clean up the
+ changes to other files by hand (e.g., compress a file that has been
+ decompressed).
+- If the BufRead* events allow you to edit a compressed file, the FileRead*
+ events should do the same (this makes recovery possible in some rare cases).
+ It's a good idea to use the same autocommands for the File* and Buf* events
+ when possible.
+
+Recommended use:
+- Always use a group, so that it's easy to delete the autocommand.
+- Keep the command itself short, call a function to do more work.
+- Make it so that the script it is defined in can be sourced several times
+ without the autocommand being repeated.
+
+Example in Vim9 script: >
+ autocmd_add({replace: true,
+ group: 'DemoGroup',
+ event: 'BufEnter',
+ pattern: '*.txt',
+ cmd: 'call DemoBufEnter()'
+ })
+
+In legacy script: >
+ call autocmd_add(#{replace: v:true,
+ \ group: 'DemoGroup',
+ \ event: 'BufEnter',
+ \ pattern: '*.txt',
+ \ cmd: 'call DemoBufEnter()'
+ \ })
+
+==============================================================================
+2. Defining autocommands *autocmd-define*
+
+ *:au* *:autocmd*
+:au[tocmd] [group] {event} {aupat} [++once] [++nested] {cmd}
+ Add {cmd} to the list of commands that Vim will
+ execute automatically on {event} for a file matching
+ {aupat} |autocmd-patterns|.
+ Here {event} cannot be "*". *E1155*
+ 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]. "nested"
+ (without the ++) can also be used, for backwards
+ compatibility, but not in |Vim9| script. *E1078*
+ *autocmd-once*
+ If [++once] is supplied the command is executed once,
+ then removed ("one shot").
+
+The special pattern <buffer> or <buffer=N> defines a buffer-local autocommand.
+See |autocmd-buflocal|.
+
+If the `:autocmd` is in Vim9 script (a script that starts with `:vim9script`
+and in a `:def` function) then {cmd} will be executed as in Vim9
+script. Thus this depends on where the autocmd is defined, not where it is
+triggered.
+ *:autocmd-block*
+{cmd} can be a block, like with `:command`, see |:command-repl|. Example: >
+ au BufReadPost *.xml {
+ setlocal matchpairs+=<:>
+ /<start
+ }
+
+The |autocmd_add()| function can be used to add a list of autocmds and autocmd
+groups from a Vim script. It is preferred if you have anything that would
+require using `:execute` with `:autocmd`.
+
+Note: The ":autocmd" command can only be followed by another command when the
+'|' appears where the pattern is expected. 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
+
+< *autocmd-expand*
+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
+exception is that "<sfile>" is expanded when the autocmd is defined. Example:
+>
+ :au BufNewFile,BufRead *.html so <sfile>:h/html.vim
+
+Here Vim expands <sfile> to the name of the file containing this line.
+
+`: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: >
+
+ 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: >
+
+ :if !exists("autocommands_loaded")
+ : let autocommands_loaded = 1
+ : au ...
+ :endif
+
+When the [group] argument is not given, Vim uses the current group (as defined
+with ":augroup"); otherwise, Vim uses the group defined with [group]. Note
+that [group] must have been defined before. You cannot define a new group
+with ":au group ..."; use ":augroup" for that.
+
+While testing autocommands, you might find the 'verbose' option to be useful: >
+ :set verbose=9
+This setting makes Vim echo the autocommands as it executes them.
+
+When defining an autocommand in a script, it will be able to call functions
+local to the script and use mappings local to the script. When the event is
+triggered and the command executed, it will run in the context of the script
+it was defined in. This matters if |<SID>| is used in a command.
+
+When executing the commands, the message from one command overwrites a
+previous message. This is different from when executing the commands
+manually. Mostly the screen will not scroll up, thus there is no hit-enter
+prompt. When one command outputs two messages this can happen anyway.
+
+==============================================================================
+3. Removing autocommands *autocmd-remove*
+
+In addition to the below described commands, the |autocmd_delete()| function can
+be used to remove a list of autocmds and autocmd groups from a Vim script.
+
+:au[tocmd]! [group] {event} {aupat} [++once] [++nested] {cmd}
+ Remove all autocommands associated with {event} and
+ {aupat}, and add the command {cmd}.
+ See |autocmd-once| for [++once].
+ See |autocmd-nested| for [++nested].
+
+:au[tocmd]! [group] {event} {aupat}
+ Remove all autocommands associated with {event} and
+ {aupat}.
+
+:au[tocmd]! [group] * {aupat}
+ Remove all autocommands associated with {aupat} for
+ all events.
+
+: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].
+
+==============================================================================
+4. Listing autocommands *autocmd-list*
+
+:au[tocmd] [group] {event} {aupat}
+ Show the autocommands associated with {event} and
+ {aupat}.
+
+:au[tocmd] [group] * {aupat}
+ Show the autocommands associated with {aupat} for all
+ events.
+
+:au[tocmd] [group] {event}
+ Show all autocommands for {event}.
+
+:au[tocmd] [group] Show all autocommands.
+
+If you provide the [group] argument, Vim lists only the autocommands for
+[group]; otherwise, Vim lists the autocommands for ALL groups. Note that this
+argument behavior differs from that for defining and removing autocommands.
+
+In order to list buffer-local autocommands, use a pattern in the form <buffer>
+or <buffer=N>. See |autocmd-buflocal|.
+
+The |autocmd_get()| function can be used from a Vim script to get a list of
+autocmds.
+
+ *:autocmd-verbose*
+When 'verbose' is non-zero, listing an autocommand will also display where it
+was last defined. Example: >
+
+ :verbose autocmd BufEnter
+ FileExplorer BufEnter
+ * call s:LocalBrowse(expand("<amatch>"))
+ Last set from /usr/share/vim/vim-7.0/plugin/NetrwPlugin.vim
+<
+See |:verbose-cmd| for more information.
+
+==============================================================================
+5. Events *autocmd-events* *E215* *E216*
+
+You can specify a comma-separated list of event names. No white space can be
+used in this list. The command applies to all the events in the list.
+
+For READING FILES there are four kinds of events possible:
+ BufNewFile starting to edit a non-existent file
+ BufReadPre BufReadPost starting to edit an existing file
+ FilterReadPre FilterReadPost read the temp file with filter output
+ FileReadPre FileReadPost any other file read
+Vim uses only one of these four kinds when reading a file. The "Pre" and
+"Post" events are both triggered, before and after reading the file.
+
+Note that the autocommands for the *ReadPre events and all the Filter events
+are not allowed to change the current buffer (you will get an error message if
+this happens). This is to prevent the file to be read into the wrong buffer.
+
+Note that the 'modified' flag is reset AFTER executing the BufReadPost
+and BufNewFile autocommands. But when the 'modified' option was set by the
+autocommands, this doesn't happen.
+
+You can use the 'eventignore' option to ignore a number of events or all
+events.
+ *autocommand-events* *{event}*
+Vim recognizes the following events. Vim ignores the case of event names
+(e.g., you can use "BUFread" or "bufread" instead of "BufRead").
+
+First an overview by function with a short explanation. Then the list
+alphabetically with full explanations |autocmd-events-abc|.
+
+Name triggered by ~
+
+ Reading
+|BufNewFile| starting to edit a file that doesn't exist
+|BufReadPre| starting to edit a new buffer, before reading the file
+|BufRead| starting to edit a new buffer, after reading the file
+|BufReadPost| starting to edit a new buffer, after reading the file
+|BufReadCmd| before starting to edit a new buffer |Cmd-event|
+
+|FileReadPre| before reading a file with a ":read" command
+|FileReadPost| after reading a file with a ":read" command
+|FileReadCmd| before reading a file with a ":read" command |Cmd-event|
+
+|FilterReadPre| before reading a file from a filter command
+|FilterReadPost| after reading a file from a filter command
+
+|StdinReadPre| before reading from stdin into the buffer
+|StdinReadPost| After reading from the stdin into the buffer
+
+ Writing
+|BufWrite| starting to write the whole buffer to a file
+|BufWritePre| starting to write the whole buffer to a file
+|BufWritePost| after writing the whole buffer to a file
+|BufWriteCmd| before writing the whole buffer to a file |Cmd-event|
+
+|FileWritePre| starting to write part of a buffer to a file
+|FileWritePost| after writing part of a buffer to a file
+|FileWriteCmd| before writing part of a buffer to a file |Cmd-event|
+
+|FileAppendPre| starting to append to a file
+|FileAppendPost| after appending to a file
+|FileAppendCmd| before appending to a file |Cmd-event|
+
+|FilterWritePre| starting to write a file for a filter command or diff
+|FilterWritePost| after writing a file for a filter command or diff
+
+ Buffers
+|BufAdd| just after adding a buffer to the buffer list
+|BufCreate| just after adding a buffer to the buffer list
+|BufDelete| before deleting a buffer from the buffer list
+|BufWipeout| before completely deleting a buffer
+
+|BufFilePre| before changing the name of the current buffer
+|BufFilePost| after changing the name of the current buffer
+
+|BufEnter| after entering a buffer
+|BufLeave| before leaving to another buffer
+|BufWinEnter| after a buffer is displayed in a window
+|BufWinLeave| before a buffer is removed from a window
+
+|BufUnload| before unloading a buffer
+|BufHidden| just before a buffer becomes hidden
+|BufNew| just after creating a new buffer
+
+|SwapExists| detected an existing swap file
+
+ 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 exit
+|ExitPre| when using a command that may make Vim exit
+|VimLeavePre| before exiting Vim, before writing the viminfo file
+|VimLeave| before exiting Vim, after writing the viminfo file
+
+|VimSuspend| when suspending Vim
+|VimResume| when Vim is resumed after being suspended
+
+ Terminal
+|TerminalOpen| after a terminal buffer was created
+|TerminalWinOpen| after a terminal buffer was created in a new window
+
+ Various
+|FileChangedShell| Vim notices that 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
+
+|DiffUpdated| after diffs have been updated
+|DirChangedPre| before the working directory will change
+|DirChanged| after the working directory has changed
+
+|ShellCmdPost| after executing a shell command
+|ShellFilterPost| after filtering with a shell command
+
+|CmdUndefined| a user command is used but it isn't defined
+|FuncUndefined| a user function is used but it isn't defined
+|SpellFileMissing| a spell file is used but it can't be found
+|SourcePre| before sourcing a Vim script
+|SourcePost| after sourcing a Vim script
+|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
+|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
+|TabNew| after creating a new tab page
+|WinClosed| after closing a window
+|TabClosed| after closing a tab page
+|WinEnter| after entering another window
+|WinLeave| before leaving a window
+|TabEnter| after entering another tab page
+|TabLeave| before leaving a tab page
+|CmdwinEnter| after entering the command-line window
+|CmdwinLeave| before leaving the command-line window
+
+|CmdlineChanged| after a change was made to the command-line text
+|CmdlineEnter| after the cursor moves to the command line
+|CmdlineLeave| before the cursor leaves the command line
+
+|InsertEnter| starting Insert mode
+|InsertChange| when typing <Insert> while in Insert or Replace mode
+|InsertLeave| when leaving Insert mode
+|InsertLeavePre| just before leaving Insert mode
+|InsertCharPre| when a character was typed in Insert mode, before
+ inserting it
+
+|ModeChanged| after changing the mode
+
+|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
+|TextChangedT| after a change was made to the text in Terminal mode
+|TextYankPost| after text has been yanked or deleted
+
+|SafeState| nothing pending, going to wait for the user to type a
+ character
+|SafeStateAgain| repeated SafeState
+
+|ColorSchemePre| before loading a color scheme
+|ColorScheme| after loading a color scheme
+
+|RemoteReply| a reply from a server Vim was received
+
+|QuickFixCmdPre| before a quickfix command is run
+|QuickFixCmdPost| after a quickfix command is run
+
+|SessionLoadPost| after loading a session file
+
+|MenuPopup| just before showing the popup menu
+|CompleteChanged| after Insert mode completion menu changed
+|CompleteDonePre| after Insert mode completion is done, before clearing
+ info
+|CompleteDone| after Insert mode completion is done, after clearing
+ info
+
+|User| to be used in combination with ":doautocmd"
+|SigUSR1| after the SIGUSR1 signal has been detected
+
+|WinScrolled| after scrolling or resizing a window
+
+
+The alphabetical list of autocommand events: *autocmd-events-abc*
+
+ *BufCreate* *BufAdd*
+BufAdd or BufCreate Just after creating a new buffer which is
+ added to the buffer list, or adding a buffer
+ to the buffer list.
+ Also used just after a buffer in the buffer
+ list has been renamed.
+ Not triggered for the initial buffers created
+ during startup.
+ The BufCreate event is for historic reasons.
+ NOTE: When this autocommand is executed, the
+ current buffer "%" may be different from the
+ buffer being created "<afile>".
+ *BufDelete*
+BufDelete Before deleting a buffer from the buffer list.
+ The BufUnload may be called first (if the
+ buffer was loaded).
+ Also used just before a buffer in the buffer
+ list is renamed.
+ NOTE: When this autocommand is executed, the
+ current buffer "%" may be different from the
+ buffer being deleted "<afile>" and "<abuf>".
+ Don't change to another buffer, it will cause
+ problems.
+ *BufEnter*
+BufEnter After entering a buffer. Useful for setting
+ options for a file type. Also executed when
+ starting to edit a buffer, after the
+ BufReadPost autocommands.
+ *BufFilePost*
+BufFilePost After changing the name of the current buffer
+ with the ":file" or ":saveas" command.
+ *BufFilePre*
+BufFilePre Before changing the name of the current buffer
+ with the ":file" or ":saveas" command.
+ *BufHidden*
+BufHidden Just before a buffer becomes hidden. That is,
+ when there are no longer windows that show
+ the buffer, but the buffer is not unloaded or
+ deleted. Not used for ":qa" or ":q" when
+ exiting Vim.
+ NOTE: When this autocommand is executed, the
+ current buffer "%" may be different from the
+ buffer being unloaded "<afile>".
+ *BufLeave*
+BufLeave Before leaving to another buffer. Also when
+ leaving or closing the current window and the
+ new current window is not for the same buffer.
+ Not used for ":qa" or ":q" when exiting Vim.
+ *BufNew*
+BufNew Just after creating a new buffer. Also used
+ just after a buffer has been renamed. When
+ the buffer is added to the buffer list BufAdd
+ will be triggered too.
+ NOTE: When this autocommand is executed, the
+ current buffer "%" may be different from the
+ buffer being created "<afile>".
+ *BufNewFile*
+BufNewFile When starting to edit a file that doesn't
+ exist. Can be used to read in a skeleton
+ file.
+ *BufRead* *BufReadPost*
+BufRead or BufReadPost When starting to edit a new buffer, after
+ reading the file into the buffer, before
+ executing the modelines. See |BufWinEnter|
+ for when you need to do something after
+ processing the modelines.
+ Also triggered:
+ - when writing an unnamed buffer in a way that
+ the buffer gets a name
+ - after successfully recovering a file
+ - for the filetypedetect group when executing
+ ":filetype detect"
+ Not triggered:
+ - for the `:read file` command
+ - when the file doesn't exist
+ *BufReadCmd*
+BufReadCmd Before starting to edit a new buffer. Should
+ read the file into the buffer. |Cmd-event|
+ *BufReadPre* *E200* *E201*
+BufReadPre When starting to edit a new buffer, before
+ reading the file into the buffer. Not used
+ if the file doesn't exist.
+ *BufUnload*
+BufUnload Before unloading a buffer. This is when the
+ text in the buffer is going to be freed. This
+ may be after a BufWritePost and before a
+ BufDelete. Also used for all buffers that are
+ loaded when Vim is going to exit.
+ NOTE: When this autocommand is executed, the
+ current buffer "%" may be different from the
+ buffer being unloaded "<afile>".
+ 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*
+BufWinEnter After a buffer is displayed in a window. This
+ can be when the buffer is loaded (after
+ processing the modelines) or when a hidden
+ buffer is displayed in a window (and is no
+ longer hidden).
+ Does not happen for |:split| without
+ arguments, since you keep editing the same
+ buffer, or ":split" with a file that's already
+ open in a window, because it re-uses an
+ existing buffer. But it does happen for a
+ ":split" with the name of the current buffer,
+ since it reloads that buffer.
+ Does not happen for a terminal window, because
+ it starts in Terminal-Job mode and Normal mode
+ commands won't work. Use |TerminalOpen| instead.
+ *BufWinLeave*
+BufWinLeave Before a buffer is removed from a window.
+ Not when it's still visible in another window.
+ Also triggered when exiting. It's triggered
+ before BufUnload or BufHidden.
+ NOTE: When this autocommand is executed, the
+ current buffer "%" may be different from the
+ buffer being unloaded "<afile>".
+ When exiting and v:dying is 2 or more this
+ event is not triggered.
+ *BufWipeout*
+BufWipeout Before completely deleting a buffer. The
+ BufUnload and BufDelete events may be called
+ first (if the buffer was loaded and was in the
+ buffer list). Also used just before a buffer
+ is renamed (also when it's not in the buffer
+ list).
+ NOTE: When this autocommand is executed, the
+ current buffer "%" may be different from the
+ buffer being deleted "<afile>".
+ Don't change to another buffer, it will cause
+ problems.
+ *BufWrite* *BufWritePre*
+BufWrite or BufWritePre Before writing the whole buffer to a file.
+ *BufWriteCmd*
+BufWriteCmd Before writing the whole buffer to a file.
+ Should do the writing of the file and reset
+ 'modified' if successful, unless '+' is in
+ 'cpo' and writing to another file |cpo-+|.
+ The buffer contents should not be changed.
+ When the command resets 'modified' the undo
+ information is adjusted to mark older undo
+ states as 'modified', like |:write| does.
+ |Cmd-event|
+ *BufWritePost*
+BufWritePost After writing the whole buffer to a file
+ (should undo the commands for BufWritePre).
+ *CmdUndefined*
+CmdUndefined When a user command is used but it isn't
+ defined. Useful for defining a command only
+ when it's used. The pattern is matched
+ against the command name. Both <amatch> and
+ <afile> are set to the name of the command.
+ NOTE: Autocompletion won't work until the
+ 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 in the
+ command line. Be careful not to mess up
+ the command line, it may cause Vim to lock up.
+ <afile> is set to a single character,
+ indicating the type of command-line.
+ |cmdwin-char|
+ *CmdlineEnter*
+CmdlineEnter After moving the cursor to the command line,
+ where the user can type a command or search
+ string; including non-interactive use of ":"
+ in a mapping, but not when using |<Cmd>|.
+ The pattern is matched against the character
+ representing the type of command-line.
+ |cmdwin-char|
+ <afile> is set to a single character,
+ indicating the type of command-line.
+ *CmdlineLeave*
+CmdlineLeave Before leaving the command line; including
+ non-interactive use of ":" in a mapping, but
+ not when using |<Cmd>|.
+ Also when abandoning the command line, after
+ typing CTRL-C or <Esc>.
+ When the commands result in an error the
+ command line is still executed.
+ <afile> is set to a single character,
+ indicating the type of command-line.
+ |cmdwin-char|
+ *CmdwinEnter*
+CmdwinEnter After entering the command-line window.
+ Useful for setting options specifically for
+ this special type of window.
+ <afile> is set to a single character,
+ indicating the type of command-line.
+ |cmdwin-char|
+ *CmdwinLeave*
+CmdwinLeave Before leaving the command-line window.
+ Useful to clean up any global setting done
+ with CmdwinEnter.
+ <afile> is set to a single character,
+ indicating the type of command-line.
+ |cmdwin-char|
+ *ColorScheme*
+ColorScheme After loading a color scheme. |:colorscheme|
+ Not triggered if the color scheme is not
+ found.
+ The pattern is matched against the
+ colorscheme name. <afile> can be used for the
+ name of the actual file where this option was
+ 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.
+CompleteChanged *CompleteChanged*
+ After each time the Insert mode completion
+ menu changed. Not fired on popup menu hide,
+ use |CompleteDonePre| or |CompleteDone| for
+ that. Never triggered recursively.
+
+ Sets these |v:event| keys:
+ completed_item See |complete-items|.
+ height nr of items visible
+ width screen cells
+ row top screen row
+ col leftmost screen column
+ size total nr of items
+ scrollbar TRUE if visible
+
+ It is not allowed to change the text |textlock|.
+
+ The size and position of the popup are also
+ available by calling |pum_getpos()|.
+
+ *CompleteDonePre*
+CompleteDonePre After Insert mode completion is done. Either
+ when something was completed or abandoning
+ completion. |ins-completion|
+ |complete_info()| can be used, the info is
+ cleared after triggering CompleteDonePre.
+ The |v:completed_item| variable contains
+ information about the completed item.
+
+ *CompleteDone*
+CompleteDone After Insert mode completion is done. Either
+ when something was completed or abandoning
+ completion. |ins-completion|
+ |complete_info()| cannot be used, the info is
+ cleared before triggering CompleteDone. Use
+ CompleteDonePre if you need it.
+ The |v:completed_item| variable contains
+ information about the completed item.
+
+ *CursorHold*
+CursorHold When the user doesn't press a key for the time
+ specified with 'updatetime'. Not triggered
+ until the user has pressed a key (i.e. doesn't
+ fire every 'updatetime' ms if you leave Vim to
+ make some coffee. :) See |CursorHold-example|
+ for previewing tags.
+ This event is only triggered in Normal mode.
+ It is not triggered when waiting for a command
+ argument to be typed, or a movement after an
+ operator.
+ While recording the CursorHold event is not
+ triggered. |q|
+ *<CursorHold>*
+ Internally the autocommand is triggered by the
+ <CursorHold> key. In an expression mapping
+ |getchar()| may see this character.
+
+ Note: Interactive commands cannot be used for
+ this event. There is no hit-enter prompt,
+ the screen is updated directly (when needed).
+ Note: In the future there will probably be
+ another option to set the time.
+ Hint: to force an update of the status lines
+ use: >
+ :let &ro = &ro
+< {only on Amiga, Unix, Win32 and all GUI
+ versions}
+ *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
+ mode. Also when the text of the cursor line
+ has been changed, e.g., with "x", "rx" or "p".
+ Not always triggered when there is typeahead,
+ while executing commands in a script file,
+ when an operator is pending or when moving to
+ another window while remaining at the same
+ cursor position.
+ For an example see |match-parens|.
+ Note: This can not be skipped with
+ `:noautocmd`.
+ Careful: This is triggered very often, don't
+ do anything that the user does not expect or
+ that is slow.
+ *CursorMovedI*
+CursorMovedI After the cursor was moved in Insert mode.
+ Not triggered when the popup menu is visible.
+ Otherwise the same as CursorMoved.
+ *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|.
+ *DirChangedPre*
+DirChangedPre The working directory is going to be changed,
+ as with |DirChanged|. The pattern is like
+ with |DirChanged|. The new directory can be
+ found in v:event.directory.
+ *DirChanged*
+DirChanged The working directory has changed in response
+ to the |:cd| or |:tcd| or |:lcd| commands, or
+ as a result of the 'autochdir' option.
+ The pattern can be:
+ "window" to trigger on `:lcd`
+ "tabpage" to trigger on `:tcd`
+ "global" to trigger on `:cd`
+ "auto" to trigger on 'autochdir'.
+ "drop" to trigger on editing a file
+ <afile> is set to the new directory name.
+ *EncodingChanged*
+EncodingChanged Fires off after the 'encoding' option has been
+ changed. Useful to set up fonts, for example.
+ *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.
+ *FileAppendCmd*
+FileAppendCmd Before appending to a file. Should do the
+ appending to the file. Use the '[ and ']
+ marks for the range of lines. |Cmd-event|
+ *FileAppendPost*
+FileAppendPost After appending to a file.
+ *FileAppendPre*
+FileAppendPre Before appending to a file. Use the '[ and ']
+ marks for the range of lines.
+ *FileChangedRO*
+FileChangedRO Before making the first change to a read-only
+ file. Can be used to check-out the file from
+ a source control system. Not triggered when
+ the change was caused by an autocommand.
+ This event is triggered when making the first
+ change in a buffer or the first change after
+ 'readonly' was set, just before the change is
+ applied to the text.
+ WARNING: If the autocommand moves the cursor
+ the effect of the change is undefined.
+ *E788*
+ It is not allowed to change to another buffer
+ here. You can reload the buffer but not edit
+ another one.
+ *E881*
+ If the number of lines changes saving for undo
+ may fail and the change will be aborted.
+ *FileChangedShell*
+FileChangedShell When Vim notices that the modification time of
+ a file has changed since editing started.
+ Also when the file attributes of the file
+ change or when the size of the file changes.
+ |timestamp|
+ Mostly triggered after executing a shell
+ command, but also with a |:checktime| command
+ 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
+ FileChangedShell autocommand is present the
+ warning message and prompt is not given.
+ The |v:fcs_reason| variable is set to indicate
+ what happened and |v:fcs_choice| can be used
+ 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, which is in "<afile>".
+ NOTE: The commands must not change the current
+ buffer, jump to another buffer or delete a
+ buffer. *E246* *E811*
+ NOTE: This event never nests, to avoid an
+ endless loop. This means that while executing
+ commands for the FileChangedShell event no
+ other FileChangedShell event will be
+ triggered.
+ *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|
+ *FileReadPost*
+FileReadPost After reading a file with a ":read" command.
+ Note that Vim sets the '[ and '] marks to the
+ first and last line of the read. This can be
+ used to operate on the lines just read.
+ *FileReadPre*
+FileReadPre Before reading a file with a ":read" command.
+ *FileType*
+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'. Navigating to
+ another window or buffer is not allowed.
+ See |filetypes|.
+ *FileWriteCmd*
+FileWriteCmd Before writing to a file, when not writing the
+ whole buffer. Should do the writing to the
+ file. Should not change the buffer. Use the
+ '[ and '] marks for the range of lines.
+ |Cmd-event|
+ *FileWritePost*
+FileWritePost After writing to a file, when not writing the
+ whole buffer.
+ *FileWritePre*
+FileWritePre Before writing to a file, when not writing the
+ whole buffer. Use the '[ and '] marks for the
+ range of lines.
+ *FilterReadPost*
+FilterReadPost After reading a file from a filter command.
+ Vim checks the pattern against the name of
+ the current buffer as with FilterReadPre.
+ Not triggered when 'shelltemp' is off.
+ *FilterReadPre* *E135*
+FilterReadPre Before reading a file from a filter command.
+ Vim checks the pattern against the name of
+ the current buffer, not the name of the
+ temporary file that is the output of the
+ filter command.
+ Not triggered when 'shelltemp' is off.
+ *FilterWritePost*
+FilterWritePost After writing a file for a filter command or
+ making a diff with an external diff (see
+ |DiffUpdated| for internal diff).
+ Vim checks the pattern against the name of
+ the current buffer as with FilterWritePre.
+ Not triggered when 'shelltemp' is off.
+ *FilterWritePre*
+FilterWritePre Before writing a file for a filter command or
+ making a diff with an external diff.
+ Vim checks the pattern against the name of
+ the current buffer, not the name of the
+ temporary file that is the output of the
+ 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.
+ *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.
+ *FuncUndefined*
+FuncUndefined When a user function is used but it isn't
+ defined. Useful for defining a function only
+ when it's used. The pattern is matched
+ against the function name. Both <amatch> and
+ <afile> are set to the name of the function.
+ Not triggered when compiling a |Vim9|
+ function.
+ NOTE: When writing Vim scripts a better
+ alternative is to use an autoloaded function.
+ See |autoload-functions|.
+ *GUIEnter*
+GUIEnter After starting the GUI successfully, and after
+ opening the window. It is triggered before
+ VimEnter when using gvim. Can be used to
+ position the window from a .gvimrc file: >
+ :autocmd GUIEnter * winpos 100 50
+< *GUIFailed*
+GUIFailed After starting the GUI failed. Vim may
+ continue to run in the terminal, if possible
+ (only on Unix and alikes, when connecting the
+ X server fails). You may want to quit Vim: >
+ :autocmd GUIFailed * qall
+< *InsertChange*
+InsertChange When typing <Insert> while in Insert or
+ Replace mode. The |v:insertmode| variable
+ indicates the new mode.
+ Be careful not to move the cursor or do
+ anything else that the user does not expect.
+ *InsertCharPre*
+InsertCharPre When a character is typed in Insert mode,
+ before inserting the char.
+ The |v:char| variable indicates the char typed
+ and can be changed during the event to insert
+ a different character. When |v:char| is set
+ to more than one character this text is
+ inserted literally.
+ It is not allowed to change the text |textlock|.
+ The event is not triggered when 'paste' is
+ set. {only with the +eval feature}
+ *InsertEnter*
+InsertEnter Just before starting Insert mode. Also for
+ Replace mode and Virtual Replace mode. The
+ |v:insertmode| variable indicates the mode.
+ Be careful not to do anything else that the
+ user does not expect.
+ The cursor is restored afterwards. If you do
+ not want that set |v:char| to a non-empty
+ string.
+ *InsertLeavePre*
+InsertLeavePre Just before leaving Insert mode. Also when
+ using CTRL-O |i_CTRL-O|. Be careful not to
+ change mode or use `:normal`, it will likely
+ cause trouble.
+ *InsertLeave*
+InsertLeave Just after leaving Insert mode. Also when
+ using CTRL-O |i_CTRL-O|. But not for |i_CTRL-C|.
+ *MenuPopup*
+MenuPopup Just before showing the popup menu (under the
+ right mouse button). Useful for adjusting the
+ menu for what is under the cursor or mouse
+ pointer.
+ The pattern is matched against one or two
+ characters representing the mode:
+ n Normal
+ v Visual
+ o Operator-pending
+ i Insert
+ c Command line
+ tl Terminal
+ *ModeChanged*
+ModeChanged After changing the mode. The pattern is
+ matched against `'old_mode:new_mode'`, for
+ example match against `*:c*` to simulate
+ |CmdlineEnter|.
+ The following values of |v:event| are set:
+ old_mode The mode before it changed.
+ new_mode The new mode as also returned
+ by |mode()| called with a
+ non-zero argument.
+ When ModeChanged is triggered, old_mode will
+ have the value of new_mode when the event was
+ last triggered.
+ This will be triggered on every minor mode
+ change.
+ Usage example to use relative line numbers
+ when entering Visual mode: >
+ :au ModeChanged [vV\x16]*:* let &l:rnu = mode() =~# '^[vV\x16]'
+ :au ModeChanged *:[vV\x16]* let &l:rnu = mode() =~# '^[vV\x16]'
+ :au WinEnter,WinLeave * let &l:rnu = mode() =~# '^[vV\x16]'
+< *OptionSet*
+OptionSet After setting an option. The pattern is
+ matched against the long option name.
+ |<amatch>| indicates what option has been set.
+
+ |v:option_type| indicates whether it's global
+ or local scoped.
+ |v:option_command| indicates what type of
+ set/let command was used (follow the tag to
+ see the table).
+ |v:option_new| indicates the newly set value.
+ |v:option_oldlocal| has the old local value.
+ |v:option_oldglobal| has the old global value.
+ |v:option_old| indicates the old option value.
+
+ |v:option_oldlocal| is only set when |:set|
+ or |:setlocal| or a |modeline| was used to set
+ the option. Similarly |v:option_oldglobal| is
+ only set when |:set| or |:setglobal| was used.
+
+ Note that when setting a |global-local| string
+ option with |:set|, then |v:option_old| is the
+ old global value. However, for all other kinds
+ of options (local string options, global-local
+ number options, ...) it is the old local
+ value.
+
+ OptionSet is not triggered on startup and for
+ the 'key' option for obvious reasons.
+
+ Usage example: Check for the existence of the
+ directory in the 'backupdir' and 'undodir'
+ options, create the directory if it doesn't
+ exist yet.
+
+ Note: It's a bad idea to reset an option
+ during this autocommand, this may break a
+ 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|,
+ |:lgrepadd|, |:vimgrep|, |:lvimgrep|,
+ |:vimgrepadd|, |:lvimgrepadd|, |:cscope|,
+ |:cfile|, |:cgetfile|, |:caddfile|, |:lfile|,
+ |:lgetfile|, |:laddfile|, |:helpgrep|,
+ |: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".
+ This command cannot be used to set the
+ 'makeprg' and 'grepprg' variables.
+ If this command causes an error, the quickfix
+ command is not executed.
+ *QuickFixCmdPost*
+QuickFixCmdPost Like QuickFixCmdPre, but after a quickfix
+ command is run, before jumping to the first
+ location. For |:cfile| and |:lfile| commands
+ it is run after the error file is read and
+ before moving to the first error.
+ See |QuickFixCmdPost-example|.
+ *QuitPre*
+QuitPre When using `:quit`, `:wq` or `:qall`, before
+ deciding whether it closes the current window
+ or quits Vim. For `:wq` the buffer is written
+ before QuitPre is triggered. 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
+ pattern is matched against the {serverid}.
+ <amatch> is equal to the {serverid} from which
+ the reply was sent, and <afile> is the actual
+ reply string.
+ Note that even if an autocommand is defined,
+ the reply should be read with |remote_read()|
+ to consume it.
+ *SafeState*
+SafeState When nothing is pending, going to wait for the
+ user to type a character.
+ This will not be triggered when:
+ - an operator is pending
+ - a register was entered with "r
+ - halfway executing a command
+ - executing a mapping
+ - there is typeahead
+ - Insert mode completion is active
+ - Command line completion is active
+ You can use `mode()` to find out what state
+ Vim is in. That may be:
+ - VIsual mode
+ - Normal mode
+ - Insert mode
+ - Command-line mode
+ Depending on what you want to do, you may also
+ check more with `state()`, e.g. whether the
+ screen was scrolled for messages.
+ *SafeStateAgain*
+SafeStateAgain Like SafeState but after processing any
+ messages and invoking callbacks. This may be
+ triggered often, don't do something that takes
+ time.
+
+ *SessionLoadPost*
+SessionLoadPost After loading the session file created using
+ the |:mksession| command.
+ *ShellCmdPost*
+ShellCmdPost After executing a shell command with |:!cmd|,
+ |:shell|, |:make| and |:grep|. Can be used to
+ check for any changed files.
+ *ShellFilterPost*
+ShellFilterPost After executing a shell command with
+ ":{range}!cmd", ":w !cmd" or ":r !cmd".
+ Can be used to check for any changed files.
+ *SourcePre*
+SourcePre Before sourcing a Vim script. |:source|
+ <afile> is the name of the file being sourced.
+ *SourcePost*
+SourcePost After sourcing a Vim script. |:source|
+ <afile> is the name of the file being sourced.
+ Not triggered when sourcing was interrupted.
+ Also triggered after a SourceCmd autocommand
+ was triggered.
+ *SourceCmd*
+SourceCmd When sourcing a Vim script. |:source|
+ <afile> is the name of the file being sourced.
+ The autocommand must source this file.
+ |Cmd-event|
+ *SpellFileMissing*
+SpellFileMissing When trying to load a spell checking file and
+ it can't be found. The pattern is matched
+ against the language. <amatch> is the
+ 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 |--|.
+ *StdinReadPre*
+StdinReadPre Before reading from stdin into the buffer.
+ Only used when the "-" argument was used when
+ Vim was started |--|.
+ *SwapExists*
+SwapExists Detected an existing swap file when starting
+ to edit a file. Only when it is possible to
+ select a way to handle the situation, when Vim
+ would ask the user what to do.
+ The |v:swapname| variable holds the name of
+ the swap file found, <afile> the file being
+ edited. |v:swapcommand| may contain a command
+ to be executed in the opened file.
+ The commands should set the |v:swapchoice|
+ variable to a string with one character to
+ tell Vim what should be done next:
+ 'o' open read-only
+ 'e' edit the file anyway
+ 'r' recover
+ 'd' delete the swap file
+ 'q' quit, don't edit the file
+ 'a' abort, like hitting CTRL-C
+ When set to an empty string the user will be
+ asked, as if there was no SwapExists autocmd.
+ *E812*
+ 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.
+ <afile> can be used for the name of the file
+ where this option was set, and <amatch> for
+ the new value of 'syntax'.
+ See |:syn-on|.
+ *TabClosed*
+TabClosed After closing a tab page.
+ *TabEnter*
+TabEnter Just after entering a tab page. |tab-page|
+ After triggering the WinEnter and before
+ triggering the BufEnter event.
+ *TabLeave*
+TabLeave Just before leaving a tab page. |tab-page|
+ A WinLeave event will have been triggered
+ first.
+ *TabNew*
+TabNew When a tab page was created. |tab-page|
+ A WinEnter event will have been triggered
+ first, TabEnter follows.
+ *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.
+ *TerminalOpen*
+TerminalOpen Just after a terminal buffer was created, with
+ `:terminal` or |term_start()|. This event is
+ triggered even if the buffer is created
+ without a window, with the ++hidden option.
+ *TerminalWinOpen*
+TerminalWinOpen Just after a terminal buffer was created, with
+ `:terminal` or |term_start()|. This event is
+ triggered only if the buffer is created
+ with a window. Can be used to set window
+ local options for the terminal window.
+ *TermResponse*
+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
+ triggered halfway executing another event,
+ especially if file I/O, a shell command or
+ anything else that takes time is involved.
+ *TextChanged*
+TextChanged After a change was made to the text in the
+ current buffer in Normal mode. That is after
+ |b:changedtick| has changed (also when that
+ happened before the TextChanged autocommand
+ was defined).
+ Not triggered when there is typeahead or when
+ an operator is pending.
+ Note: This can not be skipped with
+ `:noautocmd`.
+ Careful: This is triggered very often, don't
+ do anything that the user does not expect or
+ that is slow.
+ *TextChangedI*
+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.
+ *TextChangedT*
+TextChangedT After a change was made to the text in the
+ current buffer in Terminal mode.
+ Otherwise the same as TextChanged.
+ *TextYankPost*
+TextYankPost After text has been yanked or deleted in the
+ current buffer. The following values of
+ |v:event| can be used to determine the operation
+ that triggered this autocmd:
+ inclusive TRUE if the motion is
+ |inclusive| else the motion is
+ |exclusive|.
+ operator The operation performed.
+ regcontents Text that was stored in the
+ register, as a list of lines,
+ like with: >
+ getreg(r, 1, 1)
+< regname Name of the register or empty
+ string for the unnamed
+ register, see |registers|.
+ regtype Type of the register, see
+ |getregtype()|.
+ visual True if the operation is
+ performed on a |Visual| area.
+ Not triggered when |quote_| is used nor when
+ called recursively.
+ It is not allowed to change the buffer text,
+ see |textlock|. *E1064*
+ {only when compiled with the +eval feature}
+
+ *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, either check whether an autocommand is
+ defined using `exists('#User#MyEvent')` or
+ define a dummy autocommand yourself.
+ Example: >
+ if exists('#User#MyEvent')
+ doautocmd User MyEvent
+ endif
+<
+ *SigUSR1*
+SigUSR1 After the SIGUSR1 signal has been detected.
+ Could be used if other ways of notifying Vim
+ are not feasible. E.g. to check for the
+ result of a build that takes a long time, or
+ when a motion sensor is triggered.
+ {only on Unix}
+
+ *UserGettingBored*
+UserGettingBored When the user presses the same key 42 times.
+ Just kidding! :-)
+ *VimEnter*
+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.
+ 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
+ .viminfo 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.
+ To get the exit code use |v:exiting|.
+ *VimLeavePre*
+VimLeavePre Before exiting Vim, just before writing the
+ .viminfo file. This is executed only once,
+ if there is a match with the name of what
+ 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.
+ To get the exit code use |v:exiting|.
+ *VimResized*
+VimResized After the Vim window was resized, thus 'lines'
+ and/or 'columns' changed. Not when starting
+ up though.
+ *VimResume*
+VimResume When the Vim instance is resumed after being
+ suspended and |VimSuspend| was triggered.
+ Useful for triggering |:checktime| and ensure
+ the buffers content did not change while Vim
+ was suspended: >
+ :autocmd VimResume * checktime
+< *VimSuspend*
+VimSuspend When the Vim instance is suspended. Only when
+ CTRL-Z was typed inside Vim, or when the SIGTSTP
+ signal was sent to Vim, but not for SIGSTOP.
+ *WinClosed*
+WinClosed When closing a window, just before it is
+ removed from the window layout. The pattern
+ is matched against the |window-ID|. Both
+ <amatch> and <afile> are set to the
+ |window-ID|. Non-recursive (event cannot
+ trigger itself).
+ *WinEnter*
+WinEnter After entering another window. Not done for
+ the first window, when Vim has just started.
+ Useful for setting the window height.
+ If the window is for another buffer, Vim
+ executes the BufEnter autocommands after the
+ WinEnter autocommands.
+ 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
+ executes the BufLeave autocommands before the
+ 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.
+
+ *WinScrolled*
+WinScrolled After any window in the current tab page
+ scrolled the text (horizontally or vertically)
+ or changed width or height. See
+ |win-scrolled-resized|.
+
+ The pattern is matched against the |window-ID|
+ of the first window that scrolled or resized.
+ Both <amatch> and <afile> are set to the
+ |window-ID|.
+
+ |v:event| is set with information about size
+ and scroll changes. |WinScrolled-event|
+
+ Only starts triggering after startup finished
+ and the first screen redraw was done.
+ Does not trigger when defining the first
+ WinScrolled or WinResized event, but may
+ trigger when adding more.
+
+ Non-recursive: the event will not trigger
+ while executing commands for the WinScrolled
+ event. However, if the command causes a
+ window to scroll or change size, then another
+ WinScrolled event will be triggered later.
+
+
+ *WinResized*
+WinResized After a window in the current tab page changed
+ width or height.
+ See |win-scrolled-resized|.
+
+ |v:event| is set with information about size
+ changes. |WinResized-event|
+
+ Same behavior as |WinScrolled| for the
+ pattern, triggering and recursiveness.
+
+==============================================================================
+6. Patterns *autocmd-patterns* *{aupat}*
+
+The {aupat} argument of `:autocmd` can be a comma-separated list. This works as
+if the command was given with each pattern separately. Thus this command: >
+ :autocmd BufRead *.txt,*.info set et
+Is equivalent to: >
+ :autocmd BufRead *.txt set et
+ :autocmd BufRead *.info set et
+
+The file pattern {aupat} is tested for a match against the file name in one of
+two ways:
+1. When there is no '/' in the pattern, Vim checks for a match against only
+ the tail part of the file name (without its leading directory path).
+2. When there is a '/' in the pattern, Vim checks for a match against both the
+ short file name (as you typed it) and the full file name (after expanding
+ it to a full path and resolving symbolic links).
+
+The special pattern <buffer> or <buffer=N> is used for buffer-local
+autocommands |autocmd-buflocal|. This pattern is not matched against the name
+of a buffer.
+
+Examples: >
+ :autocmd BufRead *.txt set et
+Set the 'et' option for all text files. >
+
+ :autocmd BufRead /vim/src/*.c set cindent
+Set the 'cindent' option for C files in the /vim/src directory. >
+
+ :autocmd BufRead /tmp/*.c set ts=5
+If you have a link from "/tmp/test.c" to "/home/nobody/vim/src/test.c", and
+you start editing "/tmp/test.c", this autocommand will match.
+
+Note: To match part of a path, but not from the root directory, use a '*' as
+the first character. Example: >
+ :autocmd BufRead */doc/*.txt set tw=78
+This autocommand will for example be executed for "/tmp/doc/xx.txt" and
+"/usr/home/piet/doc/yy.txt". The number of directories does not matter here.
+
+
+The file name that the pattern is matched against is after expanding
+wildcards. Thus if you issue this command: >
+ :e $ROOTDIR/main.$EXT
+The argument is first expanded to: >
+ /usr/root/main.py
+Before it's matched with the pattern of the autocommand. Careful with this
+when using events like FileReadCmd, the value of <amatch> may not be what you
+expect.
+
+
+Environment variables can be used in a pattern: >
+ :autocmd BufRead $VIMRUNTIME/doc/*.txt set expandtab
+And ~ can be used for the home directory (if $HOME is defined): >
+ :autocmd BufWritePost ~/.vimrc so ~/.vimrc
+ :autocmd BufRead ~archive/* set readonly
+The environment variable is expanded when the autocommand is defined, not when
+the autocommand is executed. This is different from the command!
+
+ *file-pattern*
+The pattern is interpreted like mostly used in file names:
+ * matches any sequence of characters; Unusual: includes path
+ separators
+ ? matches any single character
+ \? matches a '?'
+ . matches a '.'
+ ~ matches a '~'
+ , separates patterns
+ \, matches a ','
+ { } like \( \) in a |pattern|
+ , inside { }: like \| in a |pattern|
+ \} literal }
+ \{ literal {
+ \\\{n,m\} like \{n,m} in a |pattern|
+ \ special meaning like in a |pattern|
+ [ch] matches 'c' or 'h'
+ [^ch] match any character but 'c' and 'h'
+
+Note that for all systems the '/' character is used for path separator (even
+for MS-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
+change which autocommands will be executed. Example: >
+
+ au BufEnter *.foo bdel
+ au BufEnter *.foo set modified
+
+This will delete the current buffer and then set 'modified' in what has become
+the current buffer instead. Vim doesn't take into account that "*.foo"
+doesn't match with that buffer name. It matches "*.foo" with the name of the
+buffer at the moment the event was triggered.
+
+However, buffer-local autocommands will not be executed for a buffer that has
+been wiped out with |:bwipe|. After deleting the buffer with |:bdel| the
+buffer actually still exists (it becomes unlisted), thus the autocommands are
+still executed.
+
+==============================================================================
+7. Buffer-local autocommands *autocmd-buflocal* *autocmd-buffer-local*
+ *<buffer=N>* *<buffer=abuf>* *E680*
+
+Buffer-local autocommands are attached to a specific buffer. They are useful
+if the buffer does not have a name and when the name does not match a specific
+pattern. But it also means they must be explicitly added to each buffer.
+
+Instead of a pattern buffer-local autocommands use one of these forms:
+ <buffer> current buffer
+ <buffer=99> buffer number 99
+ <buffer=abuf> using <abuf> (only when executing autocommands)
+ |<abuf>|
+
+Examples: >
+ :au CursorHold <buffer> echo 'hold'
+ :au CursorHold <buffer=33> echo 'hold'
+ :au BufNewFile * au CursorHold <buffer=abuf> echo 'hold'
+
+All the commands for autocommands also work with buffer-local autocommands,
+simply use the special string instead of the pattern. Examples: >
+ :au! * <buffer> " remove buffer-local autocommands for
+ " current buffer
+ :au! * <buffer=33> " remove buffer-local autocommands for
+ " buffer #33
+ :bufdo :au! CursorHold <buffer> " remove autocmd for given event for all
+ " buffers
+ :au * <buffer> " list buffer-local autocommands for
+ " current buffer
+
+Note that when an autocommand is defined for the current buffer, it is stored
+with the buffer number. Thus it uses the form "<buffer=12>", where 12 is the
+number of the current buffer. You will see this when listing autocommands,
+for example.
+
+To test for presence of buffer-local autocommands use the |exists()| function
+as follows: >
+ :if exists("#CursorHold#<buffer=12>") | ... | endif
+ :if exists("#CursorHold#<buffer>") | ... | endif " for current buffer
+
+When a buffer is wiped out its buffer-local autocommands are also gone, of
+course. Note that when deleting a buffer, e.g., with ":bdel", it is only
+unlisted, the autocommands are still present. In order to see the removal of
+buffer-local autocommands: >
+ :set verbose=6
+
+It is not possible to define buffer-local autocommands for a non-existent
+buffer.
+
+==============================================================================
+8. Groups *autocmd-groups*
+
+Autocommands can be put together in a group. This is useful for removing or
+executing a group of autocommands. For example, all the autocommands for
+syntax highlighting are put in the "highlight" group, to be able to execute
+":doautoall highlight BufRead" when the GUI starts.
+
+When no specific group is selected, Vim uses the default group. The default
+group does not have a name. You cannot execute the autocommands from the
+default group separately; you can execute them only by executing autocommands
+for all groups.
+
+Normally, when executing autocommands automatically, Vim uses the autocommands
+for all groups. The group only matters when executing autocommands with
+":doautocmd" or ":doautoall", or when defining or deleting autocommands.
+
+The group name can contain any characters except white space. The group name
+"end" is reserved (also in uppercase).
+
+The group name is case sensitive. Note that this is different from the event
+name!
+
+ *:aug* *:augroup*
+:aug[roup] {name} Define the autocmd group name for the
+ following ":autocmd" commands. The name "end"
+ or "END" selects the default group.
+ To avoid confusion, the name should be
+ different from existing {event} names, as this
+ most likely will not do what you intended.
+
+ *: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! 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}".
+2. Delete any old autocommands with ":au!".
+3. Define the autocommands.
+4. Go back to the default group with "augroup END".
+
+Example: >
+ :augroup uncompress
+ : au!
+ : au BufEnter *.gz %!gunzip
+ :augroup END
+
+This prevents having the autocommands defined twice (e.g., after sourcing the
+.vimrc file again).
+
+ *FileExplorer*
+There is one group that is recognized by Vim: FileExplorer. If this group
+exists Vim assumes that editing a directory is possible and will trigger a
+plugin that lists the files in that directory. This is used by the |netrw|
+plugin. This allows you to do: >
+ browse edit
+
+==============================================================================
+9. Executing autocommands *autocmd-execute*
+
+Vim can also execute Autocommands non-automatically. This is useful if you
+have changed autocommands, or when Vim has executed the wrong autocommands
+(e.g., the file pattern match was wrong).
+
+Note that the 'eventignore' option applies here too. Events listed in this
+option will not cause any commands to be executed.
+
+ *:do* *:doau* *:doaut* *:doautocmd* *E217*
+:do[autocmd] [<nomodeline>] [group] {event} [fname]
+ Apply the autocommands matching [fname] (default:
+ current file name) for {event} to the current buffer.
+ You can use this when the current file name does not
+ match the right pattern, after changing settings, or
+ to execute autocommands for a certain event.
+ It's possible to use this inside an autocommand too,
+ so you can base the autocommands for one extension on
+ another extension. Example: >
+ :au BufEnter *.cpp so ~/.vimrc_cpp
+ :au BufEnter *.cpp doau BufEnter x.c
+< Be careful to avoid endless loops. See
+ |autocmd-nested|.
+
+ When the [group] argument is not given, Vim executes
+ the autocommands for all groups. When the [group]
+ argument is included, Vim executes only the matching
+ autocommands for that group. Note: if you use an
+ undefined group name, Vim gives you an error message.
+ *<nomodeline>*
+ After applying the autocommands the modelines are
+ processed, so that their settings overrule the
+ settings from autocommands, like what happens when
+ editing a file. This is skipped when the <nomodeline>
+ 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]
+ Like ":doautocmd", but apply the autocommands to each
+ loaded buffer. The current buffer is done last.
+
+ Note that [fname] is used to select the autocommands,
+ not the buffers to which they are applied. Example: >
+ augroup mine
+ autocmd!
+ autocmd FileType * echo expand('<amatch>')
+ augroup END
+ doautoall mine FileType Loaded-Buffer
+< Sourcing this script, you'll see as many
+ "Loaded-Buffer" echoed as there are loaded buffers.
+
+ Careful: Don't use this for autocommands that delete a
+ buffer, change to another buffer or change the
+ contents of a buffer; the result is unpredictable.
+ This command is intended for autocommands that set
+ options, change highlighting, and things like that.
+
+==============================================================================
+10. Using autocommands *autocmd-use*
+
+For WRITING FILES there are four possible sets of events. Vim uses only one
+of these sets for a write command:
+
+BufWriteCmd BufWritePre BufWritePost writing the whole buffer
+ FilterWritePre FilterWritePost writing to filter temp file
+FileAppendCmd FileAppendPre FileAppendPost appending to a file
+FileWriteCmd FileWritePre FileWritePost any other file write
+
+When there is a matching "*Cmd" autocommand, it is assumed it will do the
+writing. No further writing is done and the other events are not triggered.
+|Cmd-event|
+
+Note that the *WritePost commands should undo any changes to the buffer that
+were caused by the *WritePre commands; otherwise, writing the file will have
+the side effect of changing the buffer.
+
+Before executing the autocommands, the buffer from which the lines are to be
+written temporarily becomes the current buffer. Unless the autocommands
+change the current buffer or delete the previously current buffer, the
+previously current buffer is made the current buffer again.
+
+The *WritePre and *AppendPre autocommands must not delete the buffer from
+which the lines are to be written.
+
+The '[ and '] marks have a special position:
+- Before the *ReadPre event the '[ mark is set to the line just above where
+ the new lines will be inserted.
+- Before the *ReadPost event the '[ mark is set to the first line that was
+ just read, the '] mark to the last line.
+- Before executing the *WriteCmd, *WritePre and *AppendPre autocommands the '[
+ mark is set to the first line that will be written, the '] mark to the last
+ line.
+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 don't have a name. But it doesn't
+work for files without a buffer (e.g., with ":r file").
+
+ *gzip-example*
+Examples for reading and writing compressed files: >
+ :augroup gzip
+ : autocmd!
+ : autocmd BufReadPre,FileReadPre *.gz set bin
+ : autocmd BufReadPost,FileReadPost *.gz '[,']!gunzip
+ : autocmd BufReadPost,FileReadPost *.gz set nobin
+ : autocmd BufReadPost,FileReadPost *.gz execute ":doautocmd BufReadPost " .. expand("%:r")
+ : autocmd BufWritePost,FileWritePost *.gz !mv <afile> <afile>:r
+ : autocmd BufWritePost,FileWritePost *.gz !gzip <afile>:r
+
+ : autocmd FileAppendPre *.gz !gunzip <afile>
+ : autocmd FileAppendPre *.gz !mv <afile>:r <afile>
+ : autocmd FileAppendPost *.gz !mv <afile> <afile>:r
+ : autocmd FileAppendPost *.gz !gzip <afile>:r
+ :augroup END
+
+The "gzip" group is used to be able to delete any existing autocommands with
+":autocmd!", for when the file is sourced twice.
+
+("<afile>:r" is the file name without the extension, see |:_%:|)
+
+The commands executed for the BufNewFile, BufRead/BufReadPost, BufWritePost,
+FileAppendPost and VimLeave events do not set or reset the changed flag of the
+buffer. When you decompress the buffer with the BufReadPost autocommands, you
+can still exit with ":q". When you use ":undo" in BufWritePost to undo the
+changes made by BufWritePre commands, you can still do ":q" (this also makes
+"ZZ" work). If you do want the buffer to be marked as modified, set the
+'modified' option.
+
+To execute Normal mode commands from an autocommand, use the ":normal"
+command. Use with care! If the Normal mode command is not finished, the user
+needs to type characters (e.g., after ":normal m" you need to type a mark
+name).
+
+If you want the buffer to be unmodified after changing it, reset the
+'modified' option. This makes it possible to exit the buffer with ":q"
+instead of ":q!".
+
+ *autocmd-nested* *E218*
+By default, autocommands do not nest. For example, if you use ":e" or ":w" in
+an autocommand, Vim does not execute the BufRead and BufWrite autocommands for
+those commands. If you do want this, use the "nested" flag for those commands
+in which you want nesting. For example: >
+ :autocmd FileChangedShell *.c ++nested e!
+The nesting is limited to 10 levels to get out of recursive loops.
+
+It's possible to use the ":au" command in an autocommand. This can be a
+self-modifying command! This can be useful for an autocommand that should
+execute only once.
+
+If you want to skip autocommands for one command, use the |:noautocmd| command
+modifier or the 'eventignore' option.
+
+Note: When reading a file (with ":read file" or with a filter command) and the
+last line in the file does not have an <EOL>, Vim remembers this. At the next
+write (with ":write file" or with a filter command), if the same line is
+written again as the last line in a file AND 'binary' is set, Vim does not
+supply an <EOL>. This makes a filter command on the just read lines write the
+same file as was read, and makes a write command on just filtered lines write
+the same file as was read from the filter. For example, another way to write
+a compressed file: >
+
+ :autocmd FileWritePre *.gz set bin|'[,']!gzip
+ :autocmd FileWritePost *.gz undo|set nobin
+<
+ *autocommand-pattern*
+You can specify multiple patterns, separated by commas. Here are some
+examples: >
+
+ :autocmd BufRead * set tw=79 nocin ic infercase fo=2croq
+ :autocmd BufRead .letter set tw=72 fo=2tcrq
+ :autocmd BufEnter .letter set dict=/usr/lib/dict/words
+ :autocmd BufLeave .letter set dict=
+ :autocmd BufRead,BufNewFile *.c,*.h set tw=0 cin noic
+ :autocmd BufEnter *.c,*.h abbr FOR for (i = 0; i < 3; ++i)<CR>{<CR>}<Esc>O
+ :autocmd BufLeave *.c,*.h unabbr FOR
+
+For makefiles (makefile, Makefile, imakefile, makefile.unix, etc.): >
+
+ :autocmd BufEnter ?akefile* set include=^s\=include
+ :autocmd BufLeave ?akefile* set include&
+
+To always start editing C files at the first function: >
+
+ :autocmd BufRead *.c,*.h 1;/^{
+
+Without the "1;" above, the search would start from wherever the file was
+entered, rather than from the start of the file.
+
+ *skeleton* *template*
+To read a skeleton (template) file when opening a new file: >
+
+ :autocmd BufNewFile *.c 0r ~/vim/skeleton.c
+ :autocmd BufNewFile *.h 0r ~/vim/skeleton.h
+ :autocmd BufNewFile *.java 0r ~/vim/skeleton.java
+
+To insert the current date and time in a *.html file when writing it: >
+
+ :autocmd BufWritePre,FileWritePre *.html ks|call LastMod()|'s
+ :fun LastMod()
+ : if line("$") > 20
+ : let l = 20
+ : else
+ : let l = line("$")
+ : endif
+ : exe "1," .. l .. "g/Last modified: /s/Last modified: .*/Last modified: " ..
+ : \ strftime("%Y %b %d")
+ :endfun
+
+You need to have a line "Last modified: <date time>" in the first 20 lines
+of the file for this to work. Vim replaces <date time> (and anything in the
+same line after it) with the current date and time. Explanation:
+ ks mark current position with mark 's'
+ call LastMod() call the LastMod() function to do the work
+ 's return the cursor to the old position
+The LastMod() function checks if the file is shorter than 20 lines, and then
+uses the ":g" command to find lines that contain "Last modified: ". For those
+lines the ":s" command is executed to replace the existing date with the
+current one. The ":execute" command is used to be able to use an expression
+for the ":g" and ":s" commands. The date is obtained with the strftime()
+function. You can change its argument to get another date string.
+
+When entering :autocmd on the command-line, completion of events and command
+names may be done (with <Tab>, CTRL-D, etc.) where appropriate.
+
+Vim executes all matching autocommands in the order that you specify them.
+It is recommended that your first autocommand be used for all files by using
+"*" as the file pattern. This means that you can define defaults you like
+here for any settings, and if there is another matching autocommand it will
+override these. But if there is no other matching autocommand, then at least
+your default settings are recovered (if entering this file from another for
+which autocommands did match). Note that "*" will also match files starting
+with ".", unlike Unix shells.
+
+ *autocmd-searchpat*
+Autocommands do not change the current search patterns. Vim saves the current
+search patterns before executing autocommands then restores them after the
+autocommands finish. This means that autocommands do not affect the strings
+highlighted with the 'hlsearch' option. Within autocommands, you can still
+use search patterns normally, e.g., with the "n" command.
+If you want an autocommand to set the search pattern, such that it is used
+after the autocommand finishes, use the ":let @/ =" command.
+The search-highlighting cannot be switched off with ":nohlsearch" in an
+autocommand. Use the 'h' flag in the 'viminfo' option to disable search-
+highlighting when starting Vim.
+
+ *Cmd-event*
+When using one of the "*Cmd" events, the matching autocommands are expected to
+do the file reading, writing or sourcing. This can be used when working with
+a special kind of file, for example on a remote system.
+CAREFUL: If you use these events in a wrong way, it may have the effect of
+making it impossible to read or write the matching files! Make sure you test
+your autocommands properly. Best is to use a pattern that will never match a
+normal file name, for example "ftp://*".
+
+When defining a BufReadCmd it will be difficult for Vim to recover a crashed
+editing session. When recovering from the original file, Vim reads only those
+parts of a file that are not found in the swap file. Since that is not
+possible with a BufReadCmd, use the |:preserve| command to make sure the
+original file isn't needed for recovery. You might want to do this only when
+you expect the file to be modified.
+
+For file read and write commands the |v:cmdarg| variable holds the "++enc="
+and "++ff=" argument that are effective. These should be used for the command
+that reads/writes the file. The |v:cmdbang| variable is one when "!" was
+used, zero otherwise.
+
+See the $VIMRUNTIME/plugin/netrwPlugin.vim for examples.
+
+==============================================================================
+11. Disabling autocommands *autocmd-disable*
+
+To disable autocommands for some time use the 'eventignore' option. Note that
+this may cause unexpected behavior, make sure you restore 'eventignore'
+afterwards, using a |:try| block with |:finally|.
+
+ *:noautocmd* *:noa*
+To disable autocommands for just one command use the ":noautocmd" command
+modifier. This will set 'eventignore' to "all" for the duration of the
+following command. Example: >
+
+ :noautocmd w fname.gz
+
+This will write the file without triggering the autocommands defined by the
+gzip plugin.
+
+Note that some autocommands are not triggered right away, but only later.
+This specifically applies to |CursorMoved| and |TextChanged|.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt
new file mode 100644
index 0000000..a695547
--- /dev/null
+++ b/runtime/doc/builtin.txt
@@ -0,0 +1,10873 @@
+*builtin.txt* For Vim version 9.0. Last change: 2023 Feb 27
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Builtin functions *builtin-functions*
+
+Note: Expression evaluation can be disabled at compile time, the builtin
+functions are not available then. See |+eval| and |no-eval-feature|.
+
+For functions grouped by what they are used for see |function-list|.
+
+1. Overview |builtin-function-list|
+2. Details |builtin-function-details|
+3. Feature list |feature-list|
+4. Matching a pattern in a String |string-match|
+
+==============================================================================
+1. Overview *builtin-function-list*
+
+Use CTRL-] on the function name to jump to the full explanation.
+
+USAGE RESULT DESCRIPTION ~
+
+abs({expr}) Float or Number absolute value of {expr}
+acos({expr}) Float arc cosine of {expr}
+add({object}, {item}) List/Blob append {item} to {object}
+and({expr}, {expr}) Number bitwise AND
+append({lnum}, {text}) Number append {text} below line {lnum}
+appendbufline({expr}, {lnum}, {text})
+ Number append {text} below line {lnum}
+ in buffer {expr}
+argc([{winid}]) Number number of files in the argument list
+argidx() Number current index in the argument list
+arglistid([{winnr} [, {tabnr}]]) Number argument list id
+argv({nr} [, {winid}]) String {nr} entry of the argument list
+argv([-1, {winid}]) List the argument list
+asin({expr}) Float arc sine of {expr}
+assert_beeps({cmd}) Number assert {cmd} causes a beep
+assert_equal({exp}, {act} [, {msg}])
+ Number assert {exp} is equal to {act}
+assert_equalfile({fname-one}, {fname-two} [, {msg}])
+ Number assert file contents are equal
+assert_exception({error} [, {msg}])
+ Number assert {error} is in v:exception
+assert_fails({cmd} [, {error} [, {msg} [, {lnum} [, {context}]]]])
+ Number assert {cmd} fails
+assert_false({actual} [, {msg}])
+ Number assert {actual} is false
+assert_inrange({lower}, {upper}, {actual} [, {msg}])
+ Number assert {actual} is inside the range
+assert_match({pat}, {text} [, {msg}])
+ Number assert {pat} matches {text}
+assert_nobeep({cmd}) Number assert {cmd} does not cause a beep
+assert_notequal({exp}, {act} [, {msg}])
+ Number assert {exp} is not equal {act}
+assert_notmatch({pat}, {text} [, {msg}])
+ Number assert {pat} not matches {text}
+assert_report({msg}) Number report a test failure
+assert_true({actual} [, {msg}]) Number assert {actual} is true
+atan({expr}) Float arc tangent of {expr}
+atan2({expr1}, {expr2}) Float arc tangent of {expr1} / {expr2}
+autocmd_add({acmds}) Bool add a list of autocmds and groups
+autocmd_delete({acmds}) Bool delete a list of autocmds and groups
+autocmd_get([{opts}]) List return a list of autocmds
+balloon_gettext() String current text in the balloon
+balloon_show({expr}) none show {expr} inside the balloon
+balloon_split({msg}) List split {msg} as used for a balloon
+blob2list({blob}) List convert {blob} into a list of numbers
+browse({save}, {title}, {initdir}, {default})
+ String put up a file requester
+browsedir({title}, {initdir}) String put up a directory requester
+bufadd({name}) Number add a buffer to the buffer list
+bufexists({buf}) Number |TRUE| if buffer {buf} exists
+buflisted({buf}) Number |TRUE| if buffer {buf} is listed
+bufload({buf}) Number load buffer {buf} if not loaded yet
+bufloaded({buf}) Number |TRUE| if buffer {buf} is loaded
+bufname([{buf}]) String Name of the buffer {buf}
+bufnr([{buf} [, {create}]]) Number Number of the buffer {buf}
+bufwinid({buf}) Number window ID of buffer {buf}
+bufwinnr({buf}) Number window number of buffer {buf}
+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}
+ceil({expr}) Float round {expr} up
+ch_canread({handle}) Number check if there is something to read
+ch_close({handle}) none close {handle}
+ch_close_in({handle}) none close in part of {handle}
+ch_evalexpr({handle}, {expr} [, {options}])
+ any evaluate {expr} on JSON {handle}
+ch_evalraw({handle}, {string} [, {options}])
+ any evaluate {string} on raw {handle}
+ch_getbufnr({handle}, {what}) Number get buffer number for {handle}/{what}
+ch_getjob({channel}) Job get the Job of {channel}
+ch_info({handle}) String info about channel {handle}
+ch_log({msg} [, {handle}]) none write {msg} in the channel log file
+ch_logfile({fname} [, {mode}]) none start logging channel activity
+ch_open({address} [, {options}])
+ Channel open a channel to {address}
+ch_read({handle} [, {options}]) String read from {handle}
+ch_readblob({handle} [, {options}])
+ Blob read Blob from {handle}
+ch_readraw({handle} [, {options}])
+ String read raw from {handle}
+ch_sendexpr({handle}, {expr} [, {options}])
+ any send {expr} over JSON {handle}
+ch_sendraw({handle}, {expr} [, {options}])
+ any send {expr} over raw {handle}
+ch_setoptions({handle}, {options})
+ none set options for {handle}
+ch_status({handle} [, {options}])
+ String status of channel {handle}
+changenr() Number current change number
+char2nr({expr} [, {utf8}]) Number ASCII/UTF-8 value of first char in {expr}
+charclass({string}) Number character class of {string}
+charcol({expr} [, {winid}]) Number column number of cursor or mark
+charidx({string}, {idx} [, {countcc}])
+ Number char index of byte {idx} in {string}
+chdir({dir}) String change current working directory
+cindent({lnum}) Number C indent for line {lnum}
+clearmatches([{win}]) none clear all matches
+col({expr} [, {winid}]) Number column byte index of cursor or mark
+complete({startcol}, {matches}) none set Insert mode completion
+complete_add({expr}) Number add completion match
+complete_check() Number check for key typed during completion
+complete_info([{what}]) Dict get current completion information
+confirm({msg} [, {choices} [, {default} [, {type}]]])
+ Number number of choice picked by user
+copy({expr}) any make a shallow copy of {expr}
+cos({expr}) Float cosine of {expr}
+cosh({expr}) Float hyperbolic cosine of {expr}
+count({comp}, {expr} [, {ic} [, {start}]])
+ Number count how many {expr} are in {comp}
+cscope_connection([{num}, {dbpath} [, {prepend}]])
+ Number checks existence of cscope connection
+cursor({lnum}, {col} [, {off}])
+ Number move cursor to {lnum}, {col}, {off}
+cursor({list}) Number move cursor to position in {list}
+debugbreak({pid}) Number interrupt process being debugged
+deepcopy({expr} [, {noref}]) any make a full copy of {expr}
+delete({fname} [, {flags}]) Number delete the file or directory {fname}
+deletebufline({buf}, {first} [, {last}])
+ Number delete lines from buffer {buf}
+did_filetype() Number |TRUE| if FileType autocmd event used
+diff_filler({lnum}) Number diff filler lines about {lnum}
+diff_hlID({lnum}, {col}) Number diff highlighting at {lnum}/{col}
+digraph_get({chars}) String get the |digraph| of {chars}
+digraph_getlist([{listall}]) List get all |digraph|s
+digraph_set({chars}, {digraph}) Boolean register |digraph|
+digraph_setlist({digraphlist}) Boolean register multiple |digraph|s
+echoraw({expr}) none output {expr} as-is
+empty({expr}) Number |TRUE| if {expr} is empty
+environ() Dict return environment variables
+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
+executable({expr}) Number 1 if executable {expr} exists
+execute({command}) String execute {command} and get the output
+exepath({expr}) String full path of the command {expr}
+exists({expr}) Number |TRUE| if {expr} exists
+exists_compiled({expr}) Number |TRUE| if {expr} exists at compile time
+exp({expr}) Float exponential of {expr}
+expand({expr} [, {nosuf} [, {list}]])
+ any expand special keywords in {expr}
+expandcmd({string} [, {options}])
+ String expand {string} like with `:edit`
+extend({expr1}, {expr2} [, {expr3}])
+ List/Dict insert items of {expr2} into {expr1}
+extendnew({expr1}, {expr2} [, {expr3}])
+ List/Dict like |extend()| but creates a new
+ List or Dictionary
+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({expr1}, {expr2}) List/Dict/Blob/String
+ remove items from {expr1} where
+ {expr2} is 0
+finddir({name} [, {path} [, {count}]])
+ String find directory {name} in {path}
+findfile({name} [, {path} [, {count}]])
+ String find file {name} in {path}
+flatten({list} [, {maxdepth}]) List flatten {list} up to {maxdepth} levels
+flattennew({list} [, {maxdepth}])
+ List flatten a copy of {list}
+float2nr({expr}) Number convert Float {expr} to a Number
+floor({expr}) Float round {expr} down
+fmod({expr1}, {expr2}) Float remainder of {expr1} / {expr2}
+fnameescape({fname}) String escape special characters in {fname}
+fnamemodify({fname}, {mods}) String modify file name
+foldclosed({lnum}) Number first line of fold at {lnum} if closed
+foldclosedend({lnum}) Number last line of fold at {lnum} if closed
+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
+fullcommand({name} [, {vim9}]) String get full command from {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([{buf}]) List information about buffers
+getbufline({buf}, {lnum} [, {end}])
+ List lines {lnum} to {end} of buffer {buf}
+getbufoneline({buf}, {lnum}) String line {lnum} of buffer {buf}
+getbufvar({buf}, {varname} [, {def}])
+ any variable {varname} in buffer {buf}
+getcellwidths() List get character cell width overrides
+getchangelist([{buf}]) List list of change list items
+getchar([expr]) Number or String
+ get one character from the user
+getcharmod() Number modifiers for the last typed character
+getcharpos({expr}) List position of cursor, mark, etc.
+getcharsearch() Dict last character search
+getcharstr([expr]) String get one character from the user
+getcmdcompltype() String return the type of the current
+ command-line completion
+getcmdline() String return the current command-line
+getcmdpos() Number return cursor position in command-line
+getcmdscreenpos() Number return cursor screen 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([{winnr}]) List position of the cursor
+getcursorcharpos([{winnr}]) List character position of the cursor
+getcwd([{winnr} [, {tabnr}]]) String get the current working directory
+getenv({name}) String return environment variable
+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}
+getimstatus() Number |TRUE| if the IME status is active
+getjumplist([{winnr} [, {tabnr}]])
+ List list of jump list items
+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}) Dict get specific location list properties
+getmarklist([{buf}]) List list of global/local marks
+getmatches([{win}]) List list of current matches
+getmousepos() Dict last known mouse position
+getmouseshape() String current mouse shape name
+getpid() Number process ID of Vim
+getpos({expr}) List position of cursor, mark, etc.
+getqflist() List list of quickfix items
+getqflist({what}) Dict get specific quickfix list properties
+getreg([{regname} [, 1 [, {list}]]])
+ String or List contents of a register
+getreginfo([{regname}]) Dict information about a register
+getregtype([{regname}]) String type of a register
+getscriptinfo([{opts}]) List list of sourced scripts
+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}
+gettagstack([{nr}]) Dict get the tag stack of window {nr}
+gettext({text}) String lookup translation of {text}
+getwininfo([{winid}]) List list of info about each window
+getwinpos([{timeout}]) List X and Y coord in pixels of Vim window
+getwinposx() Number X coord in pixels of the Vim window
+getwinposy() Number Y coord in pixels of the 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
+globpath({path}, {expr} [, {nosuf} [, {list} [, {alllinks}]]])
+ String do glob({expr}) for all dirs in {path}
+has({feature} [, {check}]) Number |TRUE| if feature {feature} supported
+has_key({dict}, {key}) Number |TRUE| if {dict} has entry {key}
+haslocaldir([{winnr} [, {tabnr}]])
+ Number |TRUE| if the window executed |:lcd|
+ or |:tcd|
+hasmapto({what} [, {mode} [, {abbr}]])
+ Number |TRUE| if mapping to {what} exists
+histadd({history}, {item}) Number add an item to a history
+histdel({history} [, {item}]) Number 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
+hlID({name}) Number syntax ID of highlight group {name}
+hlexists({name}) Number |TRUE| if highlight group {name} exists
+hlget([{name} [, {resolve}]]) List get highlight group attributes
+hlset({list}) Number set highlight group attributes
+hostname() String name of the machine Vim is running on
+iconv({expr}, {from}, {to}) String convert encoding of {expr}
+indent({lnum}) Number indent of line {lnum}
+index({object}, {expr} [, {start} [, {ic}]])
+ Number index in {object} where {expr} appears
+indexof({object}, {expr} [, {opts}]])
+ Number index in {object} where {expr} is true
+input({prompt} [, {text} [, {completion}]])
+ String get input from the user
+inputdialog({prompt} [, {text} [, {cancelreturn}]])
+ 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
+inputsecret({prompt} [, {text}]) String like input() but hiding the text
+insert({object}, {item} [, {idx}]) List insert {item} in {object} [before {idx}]
+interrupt() none interrupt script execution
+invert({expr}) Number bitwise invert
+isabsolutepath({path}) Number |TRUE| if {path} is an absolute path
+isdirectory({directory}) Number |TRUE| if {directory} is a directory
+isinf({expr}) Number determine if {expr} is infinity value
+ (positive or negative)
+islocked({expr}) Number |TRUE| if {expr} is locked
+isnan({expr}) Number |TRUE| if {expr} is NaN
+items({dict}) List key-value pairs in {dict}
+job_getchannel({job}) Channel get the channel handle for {job}
+job_info([{job}]) Dict get information about {job}
+job_setoptions({job}, {options}) none set options for {job}
+job_start({command} [, {options}])
+ Job start a job
+job_status({job}) String get the status of {job}
+job_stop({job} [, {how}]) Number stop {job}
+join({list} [, {sep}]) String join {list} items into one String
+js_decode({string}) any decode JS style JSON
+js_encode({expr}) String encode JS style JSON
+json_decode({string}) any decode JSON
+json_encode({expr}) String encode JSON
+keys({dict}) List keys in {dict}
+keytrans({string}) String translate internal keycodes to a form
+ that can be used by |:map|
+len({expr}) Number the length of {expr}
+libcall({lib}, {func}, {arg}) String call {func} in library {lib} with {arg}
+libcallnr({lib}, {func}, {arg}) Number idem, but return a Number
+line({expr} [, {winid}]) Number line nr of cursor, last line or mark
+line2byte({lnum}) Number byte count of line {lnum}
+lispindent({lnum}) Number Lisp indent for line {lnum}
+list2blob({list}) Blob turn {list} of numbers into a Blob
+list2str({list} [, {utf8}]) String turn {list} of numbers into a String
+listener_add({callback} [, {buf}])
+ Number add a callback to listen to changes
+listener_flush([{buf}]) none invoke listener callbacks
+listener_remove({id}) none remove a listener callback
+localtime() Number current time
+log({expr}) Float natural logarithm (base e) of {expr}
+log10({expr}) Float logarithm of Float {expr} to base 10
+luaeval({expr} [, {expr}]) any evaluate |Lua| expression
+map({expr1}, {expr2}) List/Dict/Blob/String
+ change each item in {expr1} to {expr2}
+maparg({name} [, {mode} [, {abbr} [, {dict}]]])
+ String or Dict
+ rhs of mapping {name} in mode {mode}
+mapcheck({name} [, {mode} [, {abbr}]])
+ String check for mappings matching {name}
+maplist([{abbr}]) List list of all mappings, a dict for each
+mapnew({expr1}, {expr2}) List/Dict/Blob/String
+ like |map()| but creates a new List or
+ Dictionary
+mapset({mode}, {abbr}, {dict}) none restore mapping from |maparg()| result
+match({expr}, {pat} [, {start} [, {count}]])
+ Number position where {pat} matches in {expr}
+matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]])
+ Number highlight {pattern} with {group}
+matchaddpos({group}, {pos} [, {priority} [, {id} [, {dict}]]])
+ Number highlight positions with {group}
+matcharg({nr}) List arguments of |:match|
+matchdelete({id} [, {win}]) Number delete match identified by {id}
+matchend({expr}, {pat} [, {start} [, {count}]])
+ Number position where {pat} ends in {expr}
+matchfuzzy({list}, {str} [, {dict}])
+ List fuzzy match {str} in {list}
+matchfuzzypos({list}, {str} [, {dict}])
+ List fuzzy match {str} in {list}
+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}
+matchstrpos({expr}, {pat} [, {start} [, {count}]])
+ List {count}'th match of {pat} in {expr}
+max({expr}) Number maximum value of items in {expr}
+menu_info({name} [, {mode}]) Dict get menu item information
+min({expr}) Number minimum value of items in {expr}
+mkdir({name} [, {flags} [, {prot}]])
+ Number create directory {name}
+mode([expr]) String current editing mode
+mzeval({expr}) any evaluate |MzScheme| expression
+nextnonblank({lnum}) Number line nr of non-blank line >= {lnum}
+nr2char({expr} [, {utf8}]) String single char with ASCII/UTF-8 value {expr}
+or({expr}, {expr}) Number bitwise OR
+pathshorten({expr} [, {len}]) String shorten directory names in a path
+perleval({expr}) any evaluate |Perl| expression
+popup_atcursor({what}, {options}) Number create popup window near the cursor
+popup_beval({what}, {options}) Number create popup window for 'ballooneval'
+popup_clear() none close all popup windows
+popup_close({id} [, {result}]) none close popup window {id}
+popup_create({what}, {options}) Number create a popup window
+popup_dialog({what}, {options}) Number create a popup window used as a dialog
+popup_filter_menu({id}, {key}) Number filter for a menu popup window
+popup_filter_yesno({id}, {key}) Number filter for a dialog popup window
+popup_findecho() Number get window ID of popup for `:echowin`
+popup_findinfo() Number get window ID of info popup window
+popup_findpreview() Number get window ID of preview popup window
+popup_getoptions({id}) Dict get options of popup window {id}
+popup_getpos({id}) Dict get position of popup window {id}
+popup_hide({id}) none hide popup menu {id}
+popup_list() List get a list of window IDs of all popups
+popup_locate({row}, {col}) Number get window ID of popup at position
+popup_menu({what}, {options}) Number create a popup window used as a menu
+popup_move({id}, {options}) none set position of popup window {id}
+popup_notification({what}, {options})
+ Number create a notification popup window
+popup_setoptions({id}, {options})
+ none set options for popup window {id}
+popup_settext({id}, {text}) none set the text of popup window {id}
+popup_show({id}) none unhide popup window {id}
+pow({x}, {y}) Float {x} to the power of {y}
+prevnonblank({lnum}) Number line nr of non-blank line <= {lnum}
+printf({fmt}, {expr1}...) String format text
+prompt_getprompt({buf}) String get prompt text
+prompt_setcallback({buf}, {expr}) none set prompt callback function
+prompt_setinterrupt({buf}, {text}) none set prompt interrupt function
+prompt_setprompt({buf}, {text}) none set prompt text
+prop_add({lnum}, {col}, {props}) none add one text property
+prop_add_list({props}, [[{lnum}, {col}, {end-lnum}, {end-col}], ...])
+ none add multiple text properties
+prop_clear({lnum} [, {lnum-end} [, {props}]])
+ none remove all text properties
+prop_find({props} [, {direction}])
+ Dict search for a text property
+prop_list({lnum} [, {props}]) List text properties in {lnum}
+prop_remove({props} [, {lnum} [, {lnum-end}]])
+ Number remove a text property
+prop_type_add({name}, {props}) none define a new property type
+prop_type_change({name}, {props})
+ none change an existing property type
+prop_type_delete({name} [, {props}])
+ none delete a property type
+prop_type_get({name} [, {props}])
+ Dict get property type values
+prop_type_list([{props}]) List get list of property types
+pum_getpos() Dict position and size of pum if visible
+pumvisible() Number whether popup menu is visible
+py3eval({expr}) any evaluate |python3| expression
+pyeval({expr}) any evaluate |Python| expression
+pyxeval({expr}) any evaluate |python_x| expression
+rand([{expr}]) Number get pseudo-random number
+range({expr} [, {max} [, {stride}]])
+ List items from {expr} to {max}
+readblob({fname} [, {offset} [, {size}]])
+ Blob read a |Blob| from {fname}
+readdir({dir} [, {expr} [, {dict}]])
+ List file names in {dir} selected by {expr}
+readdirex({dir} [, {expr} [, {dict}]])
+ List file info in {dir} selected by {expr}
+readfile({fname} [, {type} [, {max}]])
+ List get list of lines from file {fname}
+reduce({object}, {func} [, {initial}])
+ any reduce {object} using {func}
+reg_executing() String get the executing register name
+reg_recording() String get the recording register name
+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} [, {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} [, {timeout}])
+ String read reply string
+remote_send({server}, {string} [, {idvar}])
+ String send key sequence
+remote_startserver({name}) none become server {name}
+remove({list}, {idx} [, {end}]) any/List
+ remove items {idx}-{end} from {list}
+remove({blob}, {idx} [, {end}]) Number/Blob
+ remove bytes {idx}-{end} from {blob}
+remove({dict}, {key}) any remove entry {key} from {dict}
+rename({from}, {to}) Number rename (move) file from {from} to {to}
+repeat({expr}, {count}) List/Blob/String
+ repeat {expr} {count} times
+resolve({filename}) String get filename a shortcut points to
+reverse({list}) List reverse {list} in-place
+round({expr}) Float round off {expr}
+rubyeval({expr}) any evaluate |Ruby| expression
+screenattr({row}, {col}) Number attribute at screen position
+screenchar({row}, {col}) Number character at screen position
+screenchars({row}, {col}) List List of characters at screen position
+screencol() Number current cursor column
+screenpos({winid}, {lnum}, {col}) Dict screen row and col of a text character
+screenrow() Number current cursor row
+screenstring({row}, {col}) String characters at screen position
+search({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
+ Number search for {pattern}
+searchcount([{options}]) Dict get or update search stats
+searchdecl({name} [, {global} [, {thisblock}]])
+ Number search for variable declaration
+searchpair({start}, {middle}, {end} [, {flags} [, {skip} [...]]])
+ Number search for other end of start/end pair
+searchpairpos({start}, {middle}, {end} [, {flags} [, {skip} [...]]])
+ List search for other end of start/end pair
+searchpos({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
+ List search for {pattern}
+server2client({clientid}, {string})
+ Number send reply string
+serverlist() String get a list of available servers
+setbufline({expr}, {lnum}, {text})
+ Number set line {lnum} to {text} in buffer
+ {expr}
+setbufvar({buf}, {varname}, {val})
+ none set {varname} in buffer {buf} to {val}
+setcellwidths({list}) none set character cell width overrides
+setcharpos({expr}, {list}) Number set the {expr} position to {list}
+setcharsearch({dict}) Dict set character search from {dict}
+setcmdline({str} [, {pos}]) Number set command-line
+setcmdpos({pos}) Number set cursor position in command-line
+setcursorcharpos({list}) Number move cursor to position in {list}
+setenv({name}, {val}) none set environment variable
+setfperm({fname}, {mode}) Number set {fname} file permissions to {mode}
+setline({lnum}, {line}) Number set line {lnum} to {line}
+setloclist({nr}, {list} [, {action}])
+ Number modify location list using {list}
+setloclist({nr}, {list}, {action}, {what})
+ Number modify specific location list props
+setmatches({list} [, {win}]) Number restore a list of matches
+setpos({expr}, {list}) Number set the {expr} position to {list}
+setqflist({list} [, {action}]) Number modify quickfix list using {list}
+setqflist({list}, {action}, {what})
+ Number modify specific quickfix list props
+setreg({n}, {v} [, {opt}]) Number set register to value and type
+settabvar({nr}, {varname}, {val}) none set {varname} in tab page {nr} to {val}
+settabwinvar({tabnr}, {winnr}, {varname}, {val})
+ none set {varname} in window {winnr} in tab
+ page {tabnr} to {val}
+settagstack({nr}, {dict} [, {action}])
+ Number modify tag stack using {dict}
+setwinvar({nr}, {varname}, {val}) none set {varname} in window {nr} to {val}
+sha256({string}) String SHA256 checksum of {string}
+shellescape({string} [, {special}])
+ String escape {string} for use as shell
+ command argument
+shiftwidth([{col}]) Number effective value of 'shiftwidth'
+sign_define({name} [, {dict}]) Number define or update a sign
+sign_define({list}) List define or update a list of signs
+sign_getdefined([{name}]) List get a list of defined signs
+sign_getplaced([{buf} [, {dict}]])
+ List get a list of placed signs
+sign_jump({id}, {group}, {buf})
+ Number jump to a sign
+sign_place({id}, {group}, {name}, {buf} [, {dict}])
+ Number place a sign
+sign_placelist({list}) List place a list of signs
+sign_undefine([{name}]) Number undefine a sign
+sign_undefine({list}) List undefine a list of signs
+sign_unplace({group} [, {dict}])
+ Number unplace a sign
+sign_unplacelist({list}) List unplace a list of signs
+simplify({filename}) String simplify filename as much as possible
+sin({expr}) Float sine of {expr}
+sinh({expr}) Float hyperbolic sine of {expr}
+slice({expr}, {start} [, {end}]) String, List or Blob
+ slice of a String, List or Blob
+sort({list} [, {how} [, {dict}]])
+ List sort {list}, compare with {how}
+sound_clear() none stop playing all sounds
+sound_playevent({name} [, {callback}])
+ Number play an event sound
+sound_playfile({path} [, {callback}])
+ Number play sound file {path}
+sound_stop({id}) none stop playing sound {id}
+soundfold({word}) String sound-fold {word}
+spellbadword() String badly spelled word at cursor
+spellsuggest({word} [, {max} [, {capital}]])
+ List spelling suggestions
+split({expr} [, {pat} [, {keepempty}]])
+ List make |List| from {pat} separated {expr}
+sqrt({expr}) Float square root of {expr}
+srand([{expr}]) List get seed for |rand()|
+state([{what}]) String current state of Vim
+str2float({expr} [, {quoted}]) Float convert String to Float
+str2list({expr} [, {utf8}]) List convert each character of {expr} to
+ ASCII/UTF-8 value
+str2nr({expr} [, {base} [, {quoted}]])
+ Number convert String to Number
+strcharlen({expr}) Number character length of the String {expr}
+strcharpart({str}, {start} [, {len} [, {skipcc}]])
+ String {len} characters of {str} at
+ character {start}
+strchars({expr} [, {skipcc}]) Number character count of the String {expr}
+strdisplaywidth({expr} [, {col}]) Number display length of the String {expr}
+strftime({format} [, {time}]) String format time with a 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({str}, {start} [, {len} [, {chars}]])
+ String {len} bytes/chars of {str} at
+ byte {start}
+strptime({format}, {timestring})
+ Number Convert {timestring} to unix timestamp
+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
+ specific match in ":s" or substitute()
+substitute({expr}, {pat}, {sub}, {flags})
+ String all {pat} in {expr} replaced with {sub}
+swapfilelist() List swap files found in 'directory'
+swapinfo({fname}) Dict information about swap file {fname}
+swapname({buf}) String swap file of buffer {buf}
+synID({lnum}, {col}, {trans}) Number syntax ID at {lnum} and {col}
+synIDattr({synID}, {what} [, {mode}])
+ String attribute {what} of syntax ID {synID}
+synIDtrans({synID}) Number translated syntax ID of {synID}
+synconcealed({lnum}, {col}) List info about concealing
+synstack({lnum}, {col}) List stack of syntax IDs at {lnum} and {col}
+system({expr} [, {input}]) String output of shell command/filter {expr}
+systemlist({expr} [, {input}]) List output of shell command/filter {expr}
+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
+tagfiles() List tags files used
+taglist({expr} [, {filename}]) List list of tags matching {expr}
+tan({expr}) Float tangent of {expr}
+tanh({expr}) Float hyperbolic tangent of {expr}
+tempname() String name for a temporary file
+term_dumpdiff({filename}, {filename} [, {options}])
+ Number display difference between two dumps
+term_dumpload({filename} [, {options}])
+ Number displaying a screen dump
+term_dumpwrite({buf}, {filename} [, {options}])
+ none dump terminal window contents
+term_getaltscreen({buf}) Number get the alternate screen flag
+term_getansicolors({buf}) List get ANSI palette in GUI color mode
+term_getattr({attr}, {what}) Number get the value of attribute {what}
+term_getcursor({buf}) List get the cursor position of a terminal
+term_getjob({buf}) Job get the job associated with a terminal
+term_getline({buf}, {row}) String get a line of text from a terminal
+term_getscrolled({buf}) Number get the scroll count of a terminal
+term_getsize({buf}) List get the size of a terminal
+term_getstatus({buf}) String get the status of a terminal
+term_gettitle({buf}) String get the title of a terminal
+term_gettty({buf}, [{input}]) String get the tty name of a terminal
+term_list() List get the list of terminal buffers
+term_scrape({buf}, {row}) List get row of a terminal screen
+term_sendkeys({buf}, {keys}) none send keystrokes to a terminal
+term_setansicolors({buf}, {colors})
+ none set ANSI palette in GUI color mode
+term_setapi({buf}, {expr}) none set |terminal-api| function name prefix
+term_setkill({buf}, {how}) none set signal to stop job in terminal
+term_setrestore({buf}, {command}) none set command to restore terminal
+term_setsize({buf}, {rows}, {cols})
+ none set the size of a terminal
+term_start({cmd} [, {options}]) Number open a terminal window and run a job
+term_wait({buf} [, {time}]) Number wait for screen to be updated
+terminalprops() Dict properties of the terminal
+test_alloc_fail({id}, {countdown}, {repeat})
+ none make memory allocation fail
+test_autochdir() none enable 'autochdir' during startup
+test_feedinput({string}) none add key sequence to input buffer
+test_garbagecollect_now() none free memory right now for testing
+test_garbagecollect_soon() none free memory soon for testing
+test_getvalue({string}) any get value of an internal variable
+test_gui_event({event}, {args}) bool generate a GUI event for testing
+test_ignore_error({expr}) none ignore a specific error
+test_mswin_event({event}, {args})
+ bool generate MS-Windows event for testing
+test_null_blob() Blob null value for testing
+test_null_channel() Channel null value for testing
+test_null_dict() Dict null value for testing
+test_null_function() Funcref null value for testing
+test_null_job() Job null value for testing
+test_null_list() List null value for testing
+test_null_partial() Funcref null value for testing
+test_null_string() String null value for testing
+test_option_not_set({name}) none reset flag indicating option was set
+test_override({expr}, {val}) none test with Vim internal overrides
+test_refcount({expr}) Number get the reference count of {expr}
+test_setmouse({row}, {col}) none set the mouse position for testing
+test_settime({expr}) none set current time for testing
+test_srand_seed([seed]) none set seed for testing srand()
+test_unknown() any unknown value for testing
+test_void() any void value 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
+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} [, {dir}]])
+ String trim characters in {mask} from {text}
+trunc({expr}) Float truncate Float {expr}
+type({expr}) Number type of value {expr}
+typename({expr}) String representation of the type of {expr}
+undofile({name}) String undo file name for {name}
+undotree() List undo file tree
+uniq({list} [, {func} [, {dict}]])
+ List remove adjacent duplicates from a list
+values({dict}) List values in {dict}
+virtcol({expr} [, {list}]) Number or List
+ screen column of cursor or mark
+virtcol2col({winid}, {lnum}, {col})
+ Number byte index of a character on screen
+visualmode([expr]) String last visual mode used
+wildmenumode() Number whether 'wildmenu' mode is active
+win_execute({id}, {command} [, {silent}])
+ String execute {command} in window {id}
+win_findbuf({bufnr}) List find windows containing {bufnr}
+win_getid([{win} [, {tab}]]) Number get window ID for {win} in {tab}
+win_gettype([{nr}]) String type of window {nr}
+win_gotoid({expr}) Number go to window with 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_move_separator({nr}) Number move window vertical separator
+win_move_statusline({nr}) Number move window status line
+win_screenpos({nr}) List get screen position of window {nr}
+win_splitmove({nr}, {target} [, {options}])
+ Number move window {nr} to split of {target}
+winbufnr({nr}) Number buffer number of window {nr}
+wincol() Number window column of the cursor
+windowsversion() String MS-Windows OS version
+winheight({nr}) Number height of window {nr}
+winlayout([{tabnr}]) List layout of windows in tab {tabnr}
+winline() Number window line of the cursor
+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
+winwidth({nr}) Number width of window {nr}
+wordcount() Dict get byte/char/word statistics
+writefile({object}, {fname} [, {flags}])
+ Number write |Blob| or |List| of lines to file
+xor({expr}, {expr}) Number bitwise XOR
+
+==============================================================================
+2. Details *builtin-function-details*
+
+Not all functions are here, some have been moved to a help file covering the
+specific functionality.
+
+abs({expr}) *abs()*
+ Return the absolute value of {expr}. When {expr} evaluates to
+ a |Float| abs() returns a |Float|. When {expr} can be
+ converted to a |Number| abs() returns a |Number|. Otherwise
+ abs() gives an error message and returns -1.
+ Examples: >
+ echo abs(1.456)
+< 1.456 >
+ echo abs(-5.456)
+< 5.456 >
+ echo abs(-4)
+< 4
+
+ Can also be used as a |method|: >
+ Compute()->abs()
+
+
+acos({expr}) *acos()*
+ Return the arc cosine of {expr} measured in radians, as a
+ |Float| in the range of [0, pi].
+ {expr} must evaluate to a |Float| or a |Number| in the range
+ [-1, 1]. Otherwise acos() returns "nan".
+ Examples: >
+ :echo acos(0)
+< 1.570796 >
+ :echo acos(-0.5)
+< 2.094395
+
+ Can also be used as a |method|: >
+ Compute()->acos()
+
+
+add({object}, {expr}) *add()*
+ Append the item {expr} to |List| or |Blob| {object}. Returns
+ the resulting |List| or |Blob|. Examples: >
+ :let alist = add([1, 2, 3], item)
+ :call add(mylist, "woodstock")
+< Note that when {expr} is a |List| it is appended as a single
+ item. Use |extend()| to concatenate |Lists|.
+ When {object} is a |Blob| then {expr} must be a number.
+ Use |insert()| to add an item at another position.
+ Returns 1 if {object} is not a |List| or a |Blob|.
+
+ Can also be used as a |method|: >
+ mylist->add(val1)->add(val2)
+
+
+and({expr}, {expr}) *and()*
+ Bitwise AND on the two arguments. The arguments are converted
+ to a number. A List, Dict or Float argument causes an error.
+ Also see `or()` and `xor()`.
+ Example: >
+ :let flag = and(bits, 0x80)
+< Can also be used as a |method|: >
+ :let flag = bits->and(0x80)
+
+
+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 {text} as one text line below line {lnum} in
+ the current buffer.
+ Any type of item is accepted and converted to a String.
+ {lnum} can be zero to insert a line before the first one.
+ {lnum} is used like with |getline()|.
+ Returns 1 for failure ({lnum} out of range or out of memory),
+ 0 for success. When {text} is an empty list zero is returned,
+ no matter the value of {lnum}.
+ In |Vim9| script an invalid argument or negative number
+ results in an error. Example: >
+ :let failed = append(line('$'), "# THE END")
+ :let failed = append(0, ["Chapter 1", "the beginning"])
+
+< Can also be used as a |method| after a List, the base is
+ passed as the second argument: >
+ mylist->append(lnum)
+
+
+appendbufline({buf}, {lnum}, {text}) *appendbufline()*
+ Like |append()| but append the text in buffer {buf}.
+
+ This function works only for loaded buffers. First call
+ |bufload()| if needed.
+
+ For the use of {buf}, see |bufname()|.
+
+ {lnum} is the line number to append below. Note that using
+ |line()| would use the current buffer, not the one appending
+ to. Use "$" to append at the end of the buffer. Other string
+ values are not supported.
+
+ On success 0 is returned, on failure 1 is returned.
+ In |Vim9| script an error is given for an invalid {lnum}.
+
+ If {buf} is not a valid buffer or {lnum} is not valid, an
+ error message is given. Example: >
+ :let failed = appendbufline(13, 0, "# THE START")
+< However, when {text} is an empty list then no error is given
+ for an invalid {lnum}, since {lnum} isn't actually used.
+
+ Can also be used as a |method| after a List, the base is
+ passed as the second argument: >
+ mylist->appendbufline(buf, lnum)
+
+
+argc([{winid}]) *argc()*
+ The result is the number of files in the argument list. See
+ |arglist|.
+ If {winid} is not supplied, the argument list of the current
+ window is used.
+ If {winid} is -1, the global argument list is used.
+ Otherwise {winid} specifies the window of which the argument
+ list is used: either the window number or the window ID.
+ Returns -1 if the {winid} argument is invalid.
+
+ *argidx()*
+argidx() The result is the current index in the argument list. 0 is
+ the first file. argc() - 1 is the last one. See |arglist|.
+
+ *arglistid()*
+arglistid([{winnr} [, {tabnr}]])
+ Return the argument list ID. This is a number which
+ identifies the argument list being used. Zero is used for the
+ global argument list. See |arglist|.
+ Returns -1 if the arguments are invalid.
+
+ Without arguments use the current window.
+ 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} [, {winid}]])
+ The result is the {nr}th file in the argument list. See
+ |arglist|. "argv(0)" is the first one. Example: >
+ :let i = 0
+ :while i < argc()
+ : let f = escape(fnameescape(argv(i)), '.')
+ : exe 'amenu Arg.' .. f .. ' :e ' .. f .. '<CR>'
+ : let i = i + 1
+ :endwhile
+< Without the {nr} argument, or when {nr} is -1, a |List| with
+ the whole |arglist| is returned.
+
+ The {winid} argument specifies the window ID, see |argc()|.
+ For the Vim command line arguments see |v:argv|.
+
+ Returns an empty string if {nr}th argument is not present in
+ the argument list. Returns an empty List if the {winid}
+ argument is invalid.
+
+asin({expr}) *asin()*
+ Return the arc sine of {expr} measured in radians, as a |Float|
+ in the range of [-pi/2, pi/2].
+ {expr} must evaluate to a |Float| or a |Number| in the range
+ [-1, 1].
+ Returns "nan" if {expr} is outside the range [-1, 1]. Returns
+ 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo asin(0.8)
+< 0.927295 >
+ :echo asin(-0.5)
+< -0.523599
+
+ Can also be used as a |method|: >
+ Compute()->asin()
+
+
+assert_ functions are documented here: |assert-functions-details|
+
+
+
+atan({expr}) *atan()*
+ Return the principal value of the arc tangent of {expr}, in
+ the range [-pi/2, +pi/2] radians, as a |Float|.
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo atan(100)
+< 1.560797 >
+ :echo atan(-4.01)
+< -1.326405
+
+ Can also be used as a |method|: >
+ Compute()->atan()
+
+
+atan2({expr1}, {expr2}) *atan2()*
+ Return the arc tangent of {expr1} / {expr2}, measured in
+ radians, as a |Float| in the range [-pi, pi].
+ {expr1} and {expr2} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr1} or {expr2} is not a |Float| or a
+ |Number|.
+ Examples: >
+ :echo atan2(-1, 1)
+< -0.785398 >
+ :echo atan2(1, -1)
+< 2.356194
+
+ Can also be used as a |method|: >
+ Compute()->atan2(1)
+
+
+autocmd_add({acmds}) *autocmd_add()*
+ Adds a List of autocmds and autocmd groups.
+
+ The {acmds} argument is a List where each item is a Dict with
+ the following optional items:
+ bufnr buffer number to add a buffer-local autocmd.
+ If this item is specified, then the "pattern"
+ item is ignored.
+ cmd Ex command to execute for this autocmd event
+ event autocmd event name. Refer to |autocmd-events|.
+ This can be either a String with a single
+ event name or a List of event names.
+ group autocmd group name. Refer to |autocmd-groups|.
+ If this group doesn't exist then it is
+ created. If not specified or empty, then the
+ default group is used.
+ nested boolean flag, set to v:true to add a nested
+ autocmd. Refer to |autocmd-nested|.
+ once boolean flag, set to v:true to add an autocmd
+ which executes only once. Refer to
+ |autocmd-once|.
+ pattern autocmd pattern string. Refer to
+ |autocmd-patterns|. If "bufnr" item is
+ present, then this item is ignored. This can
+ be a String with a single pattern or a List of
+ patterns.
+ replace boolean flag, set to v:true to remove all the
+ commands associated with the specified autocmd
+ event and group and add the {cmd}. This is
+ useful to avoid adding the same command
+ multiple times for an autocmd event in a group.
+
+ Returns v:true on success and v:false on failure.
+ Examples: >
+ " Create a buffer-local autocmd for buffer 5
+ let acmd = {}
+ let acmd.group = 'MyGroup'
+ let acmd.event = 'BufEnter'
+ let acmd.bufnr = 5
+ let acmd.cmd = 'call BufEnterFunc()'
+ call autocmd_add([acmd])
+<
+ Can also be used as a |method|: >
+ GetAutocmdList()->autocmd_add()
+<
+autocmd_delete({acmds}) *autocmd_delete()*
+ Deletes a List of autocmds and autocmd groups.
+
+ The {acmds} argument is a List where each item is a Dict with
+ the following optional items:
+ bufnr buffer number to delete a buffer-local autocmd.
+ If this item is specified, then the "pattern"
+ item is ignored.
+ cmd Ex command for this autocmd event
+ event autocmd event name. Refer to |autocmd-events|.
+ If '*' then all the autocmd events in this
+ group are deleted.
+ group autocmd group name. Refer to |autocmd-groups|.
+ If not specified or empty, then the default
+ group is used.
+ nested set to v:true for a nested autocmd.
+ Refer to |autocmd-nested|.
+ once set to v:true for an autocmd which executes
+ only once. Refer to |autocmd-once|.
+ pattern autocmd pattern string. Refer to
+ |autocmd-patterns|. If "bufnr" item is
+ present, then this item is ignored.
+
+ If only {group} is specified in a {acmds} entry and {event},
+ {pattern} and {cmd} are not specified, then that autocmd group
+ is deleted.
+
+ Returns |v:true| on success and |v:false| on failure.
+ Examples: >
+ " :autocmd! BufLeave *.vim
+ let acmd = #{event: 'BufLeave', pattern: '*.vim'}
+ call autocmd_delete([acmd]})
+ " :autocmd! MyGroup1 BufLeave
+ let acmd = #{group: 'MyGroup1', event: 'BufLeave'}
+ call autocmd_delete([acmd])
+ " :autocmd! MyGroup2 BufEnter *.c
+ let acmd = #{group: 'MyGroup2', event: 'BufEnter',
+ \ pattern: '*.c'}
+ " :autocmd! MyGroup2 * *.c
+ let acmd = #{group: 'MyGroup2', event: '*',
+ \ pattern: '*.c'}
+ call autocmd_delete([acmd])
+ " :autocmd! MyGroup3
+ let acmd = #{group: 'MyGroup3'}
+ call autocmd_delete([acmd])
+<
+ Can also be used as a |method|: >
+ GetAutocmdList()->autocmd_delete()
+
+autocmd_get([{opts}]) *autocmd_get()*
+ Returns a |List| of autocmds. If {opts} is not supplied, then
+ returns the autocmds for all the events in all the groups.
+
+ The optional {opts} Dict argument supports the following
+ items:
+ group Autocmd group name. If specified, returns only
+ the autocmds defined in this group. If the
+ specified group doesn't exist, results in an
+ error message. If set to an empty string,
+ then the default autocmd group is used.
+ event Autocmd event name. If specified, returns only
+ the autocmds defined for this event. If set
+ to "*", then returns autocmds for all the
+ events. If the specified event doesn't exist,
+ results in an error message.
+ pattern Autocmd pattern. If specified, returns only
+ the autocmds defined for this pattern.
+ A combination of the above three times can be supplied in
+ {opts}.
+
+ Each Dict in the returned List contains the following items:
+ bufnr For buffer-local autocmds, buffer number where
+ the autocmd is defined.
+ cmd Command executed for this autocmd.
+ event Autocmd event name.
+ group Autocmd group name.
+ nested Boolean flag, set to v:true for a nested
+ autocmd. See |autocmd-nested|.
+ once Boolean flag, set to v:true, if the autocmd
+ will be executed only once. See |autocmd-once|.
+ pattern Autocmd pattern. For a buffer-local
+ autocmd, this will be of the form "<buffer=n>".
+ If there are multiple commands for an autocmd event in a
+ group, then separate items are returned for each command.
+
+ Returns an empty List if an autocmd with the specified group
+ or event or pattern is not found.
+
+ Examples: >
+ " :autocmd MyGroup
+ echo autocmd_get(#{group: 'Mygroup'})
+ " :autocmd G BufUnload
+ echo autocmd_get(#{group: 'G', event: 'BufUnload'})
+ " :autocmd G * *.ts
+ let acmd = #{group: 'G', event: '*', pattern: '*.ts'}
+ echo autocmd_get(acmd)
+ " :autocmd Syntax
+ echo autocmd_get(#{event: 'Syntax'})
+ " :autocmd G BufEnter *.ts
+ let acmd = #{group: 'G', event: 'BufEnter',
+ \ pattern: '*.ts'}
+ echo autocmd_get(acmd)
+<
+ Can also be used as a |method|: >
+ Getopts()->autocmd_get()
+<
+balloon_gettext() *balloon_gettext()*
+ Return the current text in the balloon. Only for the string,
+ not used for the List. Returns an empty string if balloon
+ is not present.
+
+balloon_show({expr}) *balloon_show()*
+ Show {expr} inside the balloon. For the GUI {expr} is used as
+ a string. For a terminal {expr} can be a list, which contains
+ the lines of the balloon. If {expr} is not a list it will be
+ split with |balloon_split()|.
+ If {expr} is an empty string any existing balloon is removed.
+
+ Example: >
+ func GetBalloonContent()
+ " ... initiate getting the content
+ return ''
+ endfunc
+ set balloonexpr=GetBalloonContent()
+
+ func BalloonCallback(result)
+ call balloon_show(a:result)
+ endfunc
+< Can also be used as a |method|: >
+ GetText()->balloon_show()
+<
+ The intended use is that fetching the content of the balloon
+ is initiated from 'balloonexpr'. It will invoke an
+ asynchronous method, in which a callback invokes
+ balloon_show(). The 'balloonexpr' itself can return an
+ empty string or a placeholder, e.g. "loading...".
+
+ When showing a balloon is not possible then nothing happens,
+ no error message is given.
+ {only available when compiled with the |+balloon_eval| or
+ |+balloon_eval_term| feature}
+
+balloon_split({msg}) *balloon_split()*
+ Split String {msg} into lines to be displayed in a balloon.
+ The splits are made for the current window size and optimize
+ to show debugger output.
+ Returns a |List| with the split lines. Returns an empty List
+ on error.
+ Can also be used as a |method|: >
+ GetText()->balloon_split()->balloon_show()
+
+< {only available when compiled with the |+balloon_eval_term|
+ feature}
+
+blob2list({blob}) *blob2list()*
+ Return a List containing the number value of each byte in Blob
+ {blob}. Examples: >
+ blob2list(0z0102.0304) returns [1, 2, 3, 4]
+ blob2list(0z) returns []
+< Returns an empty List on error. |list2blob()| does the
+ opposite.
+
+ Can also be used as a |method|: >
+ GetBlob()->blob2list()
+<
+ *browse()*
+browse({save}, {title}, {initdir}, {default})
+ Put up a file requester. This only works when "has("browse")"
+ returns |TRUE| (only in some GUI versions).
+ The input fields are:
+ {save} when |TRUE|, select file to write
+ {title} title for the requester
+ {initdir} directory to start browsing in
+ {default} default file name
+ An empty string is returned when the "Cancel" button is hit,
+ something went wrong, or browsing is not possible.
+
+ *browsedir()*
+browsedir({title}, {initdir})
+ Put up a directory requester. This only works when
+ "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.
+ The input fields are:
+ {title} title for the requester
+ {initdir} directory to start browsing in
+ When the "Cancel" button is hit, something went wrong, or
+ browsing is not possible, an empty string is returned.
+
+bufadd({name}) *bufadd()*
+ Add a buffer to the buffer list with name {name} (must be a
+ String).
+ If a buffer for file {name} already exists, return that buffer
+ number. Otherwise return the buffer number of the newly
+ created buffer. When {name} is an empty string then a new
+ buffer is always created.
+ The buffer will not have 'buflisted' set and not be loaded
+ yet. To add some text to the buffer use this: >
+ let bufnr = bufadd('someName')
+ call bufload(bufnr)
+ call setbufline(bufnr, 1, ['some', 'text'])
+< Returns 0 on error.
+ Can also be used as a |method|: >
+ let bufnr = 'somename'->bufadd()
+
+bufexists({buf}) *bufexists()*
+ The result is a Number, which is |TRUE| if a buffer called
+ {buf} exists.
+ If the {buf} argument is a number, buffer numbers are used.
+ Number zero is the alternate buffer for the current window.
+
+ If the {buf} argument is a string it must match a buffer name
+ exactly. The name can be:
+ - Relative to the current directory.
+ - A full path.
+ - The name of a buffer with 'buftype' set to "nofile".
+ - A URL name.
+ Unlisted buffers will be found.
+ Note that help files are listed by their short name in the
+ output of |:buffers|, but bufexists() requires using their
+ long name to be able to find them.
+ bufexists() may report a buffer exists, but to use the name
+ with a |:buffer| command you may need to use |expand()|. Esp
+ 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.
+
+ Can also be used as a |method|: >
+ let exists = 'somename'->bufexists()
+<
+ Obsolete name: buffer_exists(). *buffer_exists()*
+
+buflisted({buf}) *buflisted()*
+ The result is a Number, which is |TRUE| if a buffer called
+ {buf} exists and is listed (has the 'buflisted' option set).
+ The {buf} argument is used like with |bufexists()|.
+
+ Can also be used as a |method|: >
+ let listed = 'somename'->buflisted()
+
+bufload({buf}) *bufload()*
+ Ensure the buffer {buf} is loaded. When the buffer name
+ refers to an existing file then the file is read. Otherwise
+ the buffer will be empty. If the buffer was already loaded
+ then there is no change. If the buffer is not related to a
+ file the no file is read (e.g., when 'buftype' is "nofile").
+ If there is an existing swap file for the file of the buffer,
+ there will be no dialog, the buffer will be loaded anyway.
+ The {buf} argument is used like with |bufexists()|.
+
+ Can also be used as a |method|: >
+ eval 'somename'->bufload()
+
+bufloaded({buf}) *bufloaded()*
+ The result is a Number, which is |TRUE| if a buffer called
+ {buf} exists and is loaded (shown in a window or hidden).
+ The {buf} argument is used like with |bufexists()|.
+
+ Can also be used as a |method|: >
+ let loaded = 'somename'->bufloaded()
+
+bufname([{buf}]) *bufname()*
+ The result is the name of a buffer. Mostly as it is displayed
+ by the `:ls` command, but not using special names such as
+ "[No Name]".
+ If {buf} is omitted the current buffer is used.
+ If {buf} is a Number, that buffer number's name is given.
+ Number zero is the alternate buffer for the current window.
+ If {buf} is a String, it is used as a |file-pattern| to match
+ with the buffer names. This is always done like 'magic' is
+ set and 'cpoptions' is empty. When there is more than one
+ match an empty string is returned.
+ "" or "%" can be used for the current buffer, "#" for the
+ alternate buffer.
+ A full match is preferred, otherwise a match at the start, end
+ or middle of the buffer name is accepted. If you only want a
+ full match then put "^" at the start and "$" at the end of the
+ pattern.
+ Listed buffers are found first. If there is a single match
+ with a listed buffer, that one is returned. Next unlisted
+ buffers are searched for.
+ If the {buf} is a String, but you want to use it as a buffer
+ number, force it to be a Number by adding zero to it: >
+ :echo bufname("3" + 0)
+< Can also be used as a |method|: >
+ echo bufnr->bufname()
+
+< If the buffer doesn't exist, or doesn't have a name, an empty
+ string is returned. >
+ bufname("#") alternate buffer name
+ 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([{buf} [, {create}]])
+ The result is the number of a buffer, as it is displayed by
+ the `:ls` command. For the use of {buf}, see |bufname()|
+ above.
+
+ If the buffer doesn't exist, -1 is returned. Or, if the
+ {create} argument is present and TRUE, a new, unlisted,
+ buffer is created and its number is returned. Example: >
+ let newbuf = bufnr('Scratch001', 1)
+< Using an empty name uses the current buffer. To create a new
+ buffer with an empty name use |bufadd()|.
+
+ bufnr("$") is the last buffer: >
+ :let last_buffer = bufnr("$")
+< The result is a Number, which is the highest buffer number
+ 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.
+
+ Can also be used as a |method|: >
+ echo bufref->bufnr()
+<
+ Obsolete name: buffer_number(). *buffer_number()*
+ *last_buffer_nr()*
+ Obsolete name for bufnr("$"): last_buffer_nr().
+
+bufwinid({buf}) *bufwinid()*
+ The result is a Number, which is the |window-ID| of the first
+ window associated with buffer {buf}. For the use of {buf},
+ see |bufname()| above. If buffer {buf} 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. See |win_findbuf()| for
+ finding more.
+
+ Can also be used as a |method|: >
+ FindBuffer()->bufwinid()
+
+bufwinnr({buf}) *bufwinnr()*
+ Like |bufwinid()| but return the window number instead of the
+ |window-ID|.
+ If buffer {buf} doesn't exist or there is no such window, -1
+ is returned. Example: >
+
+ echo "A window containing buffer 1 is " .. (bufwinnr(1))
+
+< The number can be used with |CTRL-W_w| and ":wincmd w"
+ |:wincmd|.
+
+ Can also be used as a |method|: >
+ FindBuffer()->bufwinnr()
+
+byte2line({byte}) *byte2line()*
+ Return the line number that contains the character at byte
+ count {byte} in the current buffer. This includes the
+ end-of-line character, depending on the 'fileformat' option
+ for the current buffer. The first character has byte count
+ one.
+ Also see |line2byte()|, |go| and |:goto|.
+
+ Returns -1 if the {byte} value is invalid.
+
+ Can also be used as a |method|: >
+ GetOffset()->byte2line()
+
+< {not available when compiled without the |+byte_offset|
+ feature}
+
+byteidx({expr}, {nr}) *byteidx()*
+ Return byte index of the {nr}'th character in the String
+ {expr}. Use zero for the first character, it then returns
+ zero.
+ If there are no multibyte characters the returned value is
+ equal to {nr}.
+ Composing characters are not counted separately, their byte
+ length is added to the preceding base character. See
+ |byteidxcomp()| below for counting composing characters
+ separately.
+ Example : >
+ echo matchstr(str, ".", byteidx(str, 3))
+< will display the fourth character. Another way to do the
+ same: >
+ let s = strpart(str, byteidx(str, 3))
+ echo strpart(s, 0, byteidx(s, 1))
+< 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.
+
+ Can also be used as a |method|: >
+ GetName()->byteidx(idx)
+
+byteidxcomp({expr}, {nr}) *byteidxcomp()*
+ Like byteidx(), except that a composing character is counted
+ as a separate character. Example: >
+ let s = 'e' .. nr2char(0x301)
+ echo byteidx(s, 1)
+ echo byteidxcomp(s, 1)
+ echo byteidxcomp(s, 2)
+< 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 differently from byteidx() when 'encoding' is set
+ to a Unicode encoding.
+
+ Can also be used as a |method|: >
+ GetName()->byteidxcomp(idx)
+
+call({func}, {arglist} [, {dict}]) *call()* *E699*
+ Call function {func} with the items in |List| {arglist} as
+ arguments.
+ {func} can either be a |Funcref| or the name of a function.
+ a:firstline and a:lastline are set to the cursor line.
+ Returns the return value of the called function.
+ {dict} is for functions with the "dict" attribute. It will be
+ used to set the local variable "self". |Dictionary-function|
+
+ Can also be used as a |method|: >
+ GetFunc()->call([arg, arg], dict)
+
+ceil({expr}) *ceil()*
+ Return the smallest integral value greater than or equal to
+ {expr} as a |Float| (round up).
+ {expr} must evaluate to a |Float| or a |Number|.
+ Examples: >
+ echo ceil(1.456)
+< 2.0 >
+ echo ceil(-5.456)
+< -5.0 >
+ echo ceil(4.0)
+< 4.0
+
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+
+ Can also be used as a |method|: >
+ Compute()->ceil()
+
+
+ch_ functions are documented here: |channel-functions-details|
+
+
+changenr() *changenr()*
+ Return the number of the most recent change. This is the same
+ number as what is displayed with |:undolist| and can be used
+ with the |:undo| command.
+ When a change was made it is the number of that change. After
+ redo it is the number of the redone change. After undo it is
+ one less than the number of the undone change.
+ Returns 0 if the undo list is empty.
+
+char2nr({string} [, {utf8}]) *char2nr()*
+ Return Number value of the first char in {string}.
+ 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
+< When {utf8} is TRUE, always treat as UTF-8 characters.
+ A combining character is a separate character.
+ |nr2char()| does the opposite.
+ To turn a string into a list of character numbers: >
+ let str = "ABC"
+ let list = map(split(str, '\zs'), {_, val -> char2nr(val)})
+< Result: [65, 66, 67]
+
+ Returns 0 if {string} is not a |String|.
+
+ Can also be used as a |method|: >
+ GetChar()->char2nr()
+
+charclass({string}) *charclass()*
+ Return the character class of the first character in {string}.
+ The character class is one of:
+ 0 blank
+ 1 punctuation
+ 2 word character
+ 3 emoji
+ other specific Unicode class
+ The class is used in patterns and word motions.
+ Returns 0 if {string} is not a |String|.
+
+
+charcol({expr} [, {winid}]) *charcol()*
+ Same as |col()| but returns the character index of the column
+ position given with {expr} instead of the byte position.
+
+ Example:
+ With the cursor on '세' in line 5 with text "여보세요": >
+ charcol('.') returns 3
+ col('.') returns 7
+
+< Can also be used as a |method|: >
+ GetPos()->col()
+<
+ *charidx()*
+charidx({string}, {idx} [, {countcc}])
+ Return the character index of the byte at {idx} in {string}.
+ The index of the first character is zero.
+ If there are no multibyte characters the returned value is
+ equal to {idx}.
+ When {countcc} is omitted or |FALSE|, then composing characters
+ are not counted separately, their byte length is
+ added to the preceding base character.
+ When {countcc} is |TRUE|, then composing characters are
+ counted as separate characters.
+ Returns -1 if the arguments are invalid or if {idx} is greater
+ than the index of the last byte in {string}. An error is
+ given if the first argument is not a string, the second
+ argument is not a number or when the third argument is present
+ and is not zero or one.
+ See |byteidx()| and |byteidxcomp()| for getting the byte index
+ from the character index.
+ Examples: >
+ echo charidx('áb́ć', 3) returns 1
+ echo charidx('áb́ć', 6, 1) returns 4
+ echo charidx('áb́ć', 16) returns -1
+<
+ Can also be used as a |method|: >
+ GetName()->charidx(idx)
+
+chdir({dir}) *chdir()*
+ Change the current working directory to {dir}. The scope of
+ the directory change depends on the directory of the current
+ window:
+ - If the current window has a window-local directory
+ (|:lcd|), then changes the window local directory.
+ - Otherwise, if the current tabpage has a local
+ directory (|:tcd|) then changes the tabpage local
+ directory.
+ - Otherwise, changes the global directory.
+ {dir} must be a String.
+ If successful, returns the previous working directory. Pass
+ this to another chdir() to restore the directory.
+ On failure, returns an empty string.
+
+ Example: >
+ let save_dir = chdir(newdir)
+ if save_dir != ""
+ " ... do some work
+ call chdir(save_dir)
+ endif
+
+< Can also be used as a |method|: >
+ GetDir()->chdir()
+<
+cindent({lnum}) *cindent()*
+ Get the amount of indent for line {lnum} according the C
+ indenting rules, as with 'cindent'.
+ The indent is counted in spaces, the value of 'tabstop' is
+ relevant. {lnum} is used just like in |getline()|.
+ When {lnum} is invalid -1 is returned.
+ See |C-indenting|.
+
+ Can also be used as a |method|: >
+ GetLnum()->cindent()
+
+clearmatches([{win}]) *clearmatches()*
+ Clears all matches previously defined for the current window
+ by |matchadd()| and the |:match| commands.
+ If {win} is specified, use the window with this number or
+ window ID instead of the current window.
+
+ Can also be used as a |method|: >
+ GetWin()->clearmatches()
+<
+col({expr} [, {winid}) *col()*
+ The result is a Number, which is the byte index of the column
+ position given with {expr}. The accepted positions are:
+ . the cursor position
+ $ the end of the cursor line (the result is the
+ number of bytes in the cursor line plus one)
+ 'x position of mark x (if the mark is not set, 0 is
+ returned)
+ 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
+ that it's updated right away.
+ Additionally {expr} can be [lnum, col]: a |List| with the line
+ and column number. Most useful when the column is "$", to get
+ the last column of a specific line. When "lnum" or "col" is
+ out of range then col() returns zero.
+ With the optional {winid} argument the values are obtained for
+ that window instead of the current window.
+ To get the line number use |line()|. To get both use
+ |getpos()|.
+ For the screen column position use |virtcol()|. For the
+ character position use |charcol()|.
+ Note that only marks in the current file can be used.
+ Examples: >
+ col(".") column of cursor
+ col("$") length of cursor line plus one
+ col("'t") column of mark t
+ col("'" .. markname) column of mark markname
+< The first column is 1. Returns 0 if {expr} is invalid or when
+ the window with ID {winid} is not found.
+ For an uppercase mark the column may actually be in another
+ buffer.
+ For the cursor position, when 'virtualedit' is active, the
+ column is one higher if the cursor is after the end of the
+ line. Also, when using a <Cmd> mapping the cursor isn't
+ moved, this can be used to obtain the column in Insert mode: >
+ :imap <F2> <Cmd>echowin col(".")<CR>
+
+< Can also be used as a |method|: >
+ GetPos()->col()
+<
+
+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 = (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
+ empty string. "col('.') - 1" will replace one character by a
+ match.
+ {matches} must be a |List|. Each |List| item is one match.
+ See |complete-items| for the kind of items that are possible.
+ "longest" in 'completeopt' is ignored.
+ Note that the after calling this function you need to avoid
+ inserting anything that would cause completion to stop.
+ The match can be selected with CTRL-N and CTRL-P as usual with
+ Insert mode completion. The popup menu will appear if
+ specified, see |ins-completion-menu|.
+ Example: >
+ inoremap <F5> <C-R>=ListMonths()<CR>
+
+ func! ListMonths()
+ call complete(col('.'), ['January', 'February', 'March',
+ \ 'April', 'May', 'June', 'July', 'August', 'September',
+ \ 'October', 'November', 'December'])
+ return ''
+ endfunc
+< This isn't very useful, but it shows how it works. Note that
+ an empty string is returned to avoid a zero being inserted.
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetMatches()->complete(col('.'))
+
+complete_add({expr}) *complete_add()*
+ Add {expr} to the list of matches. Only to be used by the
+ function specified with the 'completefunc' option.
+ Returns 0 for failure (empty string or out of memory),
+ 1 when the match was added, 2 when the match was already in
+ the list.
+ See |complete-functions| for an explanation of {expr}. It is
+ the same as one item in the list that 'omnifunc' would return.
+
+ Can also be used as a |method|: >
+ GetMoreMatches()->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 |TRUE| when searching for matches is to be aborted,
+ zero otherwise.
+ Only to be used by the function specified with the
+ 'completefunc' option.
+
+
+complete_info([{what}]) *complete_info()*
+ Returns a |Dictionary| with information about Insert mode
+ completion. See |ins-completion|.
+ The items are:
+ mode Current completion mode name string.
+ See |complete_info_mode| for the values.
+ pum_visible |TRUE| if popup menu is visible.
+ See |pumvisible()|.
+ items List of completion matches. Each item is a
+ dictionary containing the entries "word",
+ "abbr", "menu", "kind", "info" and "user_data".
+ See |complete-items|.
+ selected Selected item index. First index is zero.
+ Index is -1 if no item is selected (showing
+ typed text only, or the last completion after
+ no item is selected when using the <Up> or
+ <Down> keys)
+ inserted Inserted string. [NOT IMPLEMENTED YET]
+
+ *complete_info_mode*
+ mode values are:
+ "" Not in completion mode
+ "keyword" Keyword completion |i_CTRL-X_CTRL-N|
+ "ctrl_x" Just pressed CTRL-X |i_CTRL-X|
+ "scroll" Scrolling with |i_CTRL-X_CTRL-E| or
+ |i_CTRL-X_CTRL-Y|
+ "whole_line" Whole lines |i_CTRL-X_CTRL-L|
+ "files" File names |i_CTRL-X_CTRL-F|
+ "tags" Tags |i_CTRL-X_CTRL-]|
+ "path_defines" Definition completion |i_CTRL-X_CTRL-D|
+ "path_patterns" Include completion |i_CTRL-X_CTRL-I|
+ "dictionary" Dictionary |i_CTRL-X_CTRL-K|
+ "thesaurus" Thesaurus |i_CTRL-X_CTRL-T|
+ "cmdline" Vim Command line |i_CTRL-X_CTRL-V|
+ "function" User defined completion |i_CTRL-X_CTRL-U|
+ "omni" Omni completion |i_CTRL-X_CTRL-O|
+ "spell" Spelling suggestions |i_CTRL-X_s|
+ "eval" |complete()| completion
+ "unknown" Other internal modes
+
+ If the optional {what} list argument is supplied, then only
+ the items listed in {what} are returned. Unsupported items in
+ {what} are silently ignored.
+
+ To get the position and size of the popup menu, see
+ |pum_getpos()|. It's also available in |v:event| during the
+ |CompleteChanged| event.
+
+ Returns an empty |Dictionary| on error.
+
+ Examples: >
+ " Get all items
+ call complete_info()
+ " Get only 'mode'
+ call complete_info(['mode'])
+ " Get only 'mode' and 'pum_visible'
+ call complete_info(['mode', 'pum_visible'])
+
+< Can also be used as a |method|: >
+ GetItems()->complete_info()
+<
+ *confirm()*
+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
+ alternatives. When {choices} is missing or empty, "&OK" is
+ used (and translated).
+ {msg} is a String, use '\n' to include a newline. Only on
+ some systems the string is wrapped when it doesn't fit.
+
+ {choices} is a String, with the individual choices separated
+ by '\n', e.g. >
+ confirm("Save changes?", "&Yes\n&No\n&Cancel")
+< The letter after the '&' is the shortcut key for that choice.
+ Thus you can type 'c' to select "Cancel". The shortcut does
+ not need to be the first letter: >
+ confirm("file has been modified", "&Save\nSave &All")
+< For the console, the first letter of each choice is used as
+ the default shortcut key. Case is ignored.
+
+ The optional {default} argument is the number of the choice
+ that is made if the user hits <CR>. Use 1 to make the first
+ choice the default one. Use 0 to not set a default. If
+ {default} is omitted, 1 is used.
+
+ The optional {type} String argument gives the type of dialog.
+ This is only used for the icon of the GTK, Mac, Motif and
+ Win32 GUI. It can be one of these values: "Error",
+ "Question", "Info", "Warning" or "Generic". Only the first
+ character is relevant. When {type} is omitted, "Generic" is
+ used.
+
+ If the user aborts the dialog by pressing <Esc>, CTRL-C,
+ or another valid interrupt key, confirm() returns 0.
+
+ An example: >
+ let choice = confirm("What do you want?",
+ \ "&Apples\n&Oranges\n&Bananas", 2)
+ if choice == 0
+ echo "make up your mind!"
+ elseif choice == 3
+ echo "tasteful"
+ else
+ echo "I prefer bananas myself."
+ endif
+< In a GUI dialog, buttons are used. The layout of the buttons
+ depends on the 'v' flag in 'guioptions'. If it is included,
+ the buttons are always put vertically. Otherwise, confirm()
+ tries to put the buttons in one horizontal line. If they
+ don't fit, a vertical layout is used anyway. For some systems
+ the horizontal layout is always used.
+
+ Can also be used as a |method|in: >
+ BuildMessage()->confirm("&Yes\n&No")
+<
+ *copy()*
+copy({expr}) Make a copy of {expr}. For Numbers and Strings this isn't
+ different from using {expr} directly.
+ When {expr} is a |List| a shallow copy is created. This means
+ that the original |List| can be changed without changing the
+ copy, and vice versa. But the items are identical, thus
+ changing an item changes the contents of both |Lists|.
+ A |Dictionary| is copied in a similar way as a |List|.
+ Also see |deepcopy()|.
+ Can also be used as a |method|: >
+ mylist->copy()
+
+cos({expr}) *cos()*
+ Return the cosine of {expr}, measured in radians, as a |Float|.
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo cos(100)
+< 0.862319 >
+ :echo cos(-4.01)
+< -0.646043
+
+ Can also be used as a |method|: >
+ Compute()->cos()
+
+
+cosh({expr}) *cosh()*
+ Return the hyperbolic cosine of {expr} as a |Float| in the range
+ [1, inf].
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo cosh(0.5)
+< 1.127626 >
+ :echo cosh(-0.5)
+< -1.127626
+
+ Can also be used as a |method|: >
+ Compute()->cosh()
+
+
+count({comp}, {expr} [, {ic} [, {start}]]) *count()*
+ Return the number of times an item with value {expr} appears
+ 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 |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.
+
+ Can also be used as a |method|: >
+ mylist->count(val)
+<
+ *cscope_connection()*
+cscope_connection([{num} , {dbpath} [, {prepend}]])
+ Checks for the existence of a |cscope| connection. If no
+ parameters are specified, then the function returns:
+ 0, if cscope was not available (not compiled in), or
+ if there are no cscope connections;
+ 1, if there is at least one cscope connection.
+
+ If parameters are specified, then the value of {num}
+ determines how existence of a cscope connection is checked:
+
+ {num} Description of existence check
+ ----- ------------------------------
+ 0 Same as no parameters (e.g., "cscope_connection()").
+ 1 Ignore {prepend}, and use partial string matches for
+ {dbpath}.
+ 2 Ignore {prepend}, and use exact string matches for
+ {dbpath}.
+ 3 Use {prepend}, use partial string matches for both
+ {dbpath} and {prepend}.
+ 4 Use {prepend}, use exact string matches for both
+ {dbpath} and {prepend}.
+
+ Note: All string comparisons are case sensitive!
+
+ Examples. Suppose we had the following (from ":cs show"): >
+
+ # pid database name prepend path
+ 0 27664 cscope.out /usr/local
+<
+ Invocation Return Val ~
+ ---------- ---------- >
+ cscope_connection() 1
+ cscope_connection(1, "out") 1
+ cscope_connection(2, "out") 0
+ cscope_connection(3, "out") 0
+ cscope_connection(3, "out", "local") 1
+ cscope_connection(4, "out") 0
+ cscope_connection(4, "out", "local") 0
+ cscope_connection(4, "cscope.out", "/usr/local") 1
+<
+cursor({lnum}, {col} [, {off}]) *cursor()*
+cursor({list})
+ Positions the cursor at the column (byte count) {col} in the
+ line {lnum}. The first column is one.
+
+ When there is one argument {list} this is used as a |List|
+ with two, three or four item:
+ [{lnum}, {col}]
+ [{lnum}, {col}, {off}]
+ [{lnum}, {col}, {off}, {curswant}]
+ This is like the return value of |getpos()| or |getcurpos()|,
+ but without the first item.
+
+ To position the cursor using the character count, use
+ |setcursorcharpos()|.
+
+ Does not change the jumplist.
+ {lnum} is used like with |getline()|, except that if {lnum} is
+ zero, the cursor will stay in the current line.
+ If {lnum} is greater than the number of lines in the buffer,
+ the cursor will be positioned at the last line in the buffer.
+ If {col} is greater than the number of bytes in the line,
+ the cursor will be positioned at the last character in the
+ line.
+ If {col} is zero, the cursor will stay in the current column.
+ If {curswant} is given it is used to set the preferred column
+ for vertical movement. Otherwise {col} is used.
+
+ When 'virtualedit' is used {off} specifies the offset in
+ screen columns from the start of the character. E.g., a
+ position within a <Tab> or after the last character.
+ Returns 0 when the position could be set, -1 otherwise.
+
+ Can also be used as a |method|: >
+ GetCursorPos()->cursor()
+
+debugbreak({pid}) *debugbreak()*
+ Specifically used to interrupt a program being debugged. It
+ will cause process {pid} to get a SIGTRAP. Behavior for other
+ processes is undefined. See |terminal-debugger|.
+ {only available on MS-Windows}
+
+ Returns |TRUE| if successfully interrupted the program.
+ Otherwise returns |FALSE|.
+
+ Can also be used as a |method|: >
+ GetPid()->debugbreak()
+
+deepcopy({expr} [, {noref}]) *deepcopy()* *E698*
+ Make a copy of {expr}. For Numbers and Strings this isn't
+ different from using {expr} directly.
+ When {expr} is a |List| a full copy is created. This means
+ that the original |List| can be changed without changing the
+ copy, and vice versa. When an item is a |List| or
+ |Dictionary|, a copy for it is made, recursively. Thus
+ changing an item in the copy does not change the contents of
+ the original |List|.
+ A |Dictionary| is copied in a similar way as a |List|.
+
+ When {noref} is omitted or zero a contained |List| or
+ |Dictionary| is only copied once. All references point to
+ this single copy. With {noref} set to 1 every occurrence of a
+ |List| or |Dictionary| results in a new copy. This also means
+ that a cyclic reference causes deepcopy() to fail.
+ *E724*
+ Nesting is possible up to 100 levels. When there is an item
+ that refers back to a higher level making a deep copy with
+ {noref} set to 1 will fail.
+ Also see |copy()|.
+
+ Can also be used as a |method|: >
+ GetObject()->deepcopy()
+
+delete({fname} [, {flags}]) *delete()*
+ Without {flags} or with {flags} empty: Deletes the file by the
+ name {fname}.
+
+ This also works when {fname} is a symbolic link. The symbolic
+ link itself is deleted, not what it points to.
+
+ When {flags} is "d": Deletes the directory by the name
+ {fname}. This fails when directory {fname} is not empty.
+
+ 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/false if the delete
+ operation was successful and -1/true when the deletion failed
+ or partly failed.
+
+ Use |remove()| to delete an item from a |List|.
+ To delete a line from the buffer use |:delete| or
+ |deletebufline()|.
+
+ Can also be used as a |method|: >
+ GetName()->delete()
+
+deletebufline({buf}, {first} [, {last}]) *deletebufline()*
+ Delete lines {first} to {last} (inclusive) from buffer {buf}.
+ If {last} is omitted then delete line {first} only.
+ On success 0 is returned, on failure 1 is returned.
+
+ This function works only for loaded buffers. First call
+ |bufload()| if needed.
+
+ For the use of {buf}, see |bufname()| above.
+
+ {first} and {last} are used like with |getline()|. Note that
+ when using |line()| this refers to the current buffer. Use "$"
+ to refer to the last line in buffer {buf}.
+
+ Can also be used as a |method|: >
+ GetBuffer()->deletebufline(1)
+<
+ *did_filetype()*
+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
+ editing another buffer to set 'filetype' and load a syntax
+ file.
+
+diff_filler({lnum}) *diff_filler()*
+ Returns the number of filler lines above line {lnum}.
+ These are the lines that were inserted at this point in
+ another diff'ed window. These filler lines are shown in the
+ display but don't exist in the buffer.
+ {lnum} is used like with |getline()|. Thus "." is the current
+ line, "'m" mark m, etc.
+ Returns 0 if the current window is not in diff mode.
+
+ Can also be used as a |method|: >
+ GetLnum()->diff_filler()
+
+diff_hlID({lnum}, {col}) *diff_hlID()*
+ Returns the highlight ID for diff mode at line {lnum} column
+ {col} (byte index). When the current line does not have a
+ diff change zero is returned.
+ {lnum} is used like with |getline()|. Thus "." is the current
+ line, "'m" mark m, etc.
+ {col} is 1 for the leftmost column, {lnum} is 1 for the first
+ line.
+ The highlight ID can be used with |synIDattr()| to obtain
+ syntax information about the highlighting.
+
+ Can also be used as a |method|: >
+ GetLnum()->diff_hlID(col)
+<
+
+digraph_get({chars}) *digraph_get()* *E1214*
+ Return the digraph of {chars}. This should be a string with
+ exactly two characters. If {chars} are not just two
+ characters, or the digraph of {chars} does not exist, an error
+ is given and an empty string is returned.
+
+ The character will be converted from Unicode to 'encoding'
+ when needed. This does require the conversion to be
+ available, it might fail.
+
+ Also see |digraph_getlist()|.
+
+ Examples: >
+ " Get a built-in digraph
+ :echo digraph_get('00') " Returns '∞'
+
+ " Get a user-defined digraph
+ :call digraph_set('aa', 'あ')
+ :echo digraph_get('aa') " Returns 'あ'
+<
+ Can also be used as a |method|: >
+ GetChars()->digraph_get()
+<
+ This function works only when compiled with the |+digraphs|
+ feature. If this feature is disabled, this function will
+ display an error message.
+
+
+digraph_getlist([{listall}]) *digraph_getlist()*
+ Return a list of digraphs. If the {listall} argument is given
+ and it is TRUE, return all digraphs, including the default
+ digraphs. Otherwise, return only user-defined digraphs.
+
+ The characters will be converted from Unicode to 'encoding'
+ when needed. This does require the conservation to be
+ available, it might fail.
+
+ Also see |digraph_get()|.
+
+ Examples: >
+ " Get user-defined digraphs
+ :echo digraph_getlist()
+
+ " Get all the digraphs, including default digraphs
+ :echo digraph_getlist(1)
+<
+ Can also be used as a |method|: >
+ GetNumber()->digraph_getlist()
+<
+ This function works only when compiled with the |+digraphs|
+ feature. If this feature is disabled, this function will
+ display an error message.
+
+
+digraph_set({chars}, {digraph}) *digraph_set()*
+ Add digraph {chars} to the list. {chars} must be a string
+ with two characters. {digraph} is a string with one UTF-8
+ encoded character. *E1215*
+ Be careful, composing characters are NOT ignored. This
+ function is similar to |:digraphs| command, but useful to add
+ digraphs start with a white space.
+
+ The function result is v:true if |digraph| is registered. If
+ this fails an error message is given and v:false is returned.
+
+ If you want to define multiple digraphs at once, you can use
+ |digraph_setlist()|.
+
+ Example: >
+ call digraph_set(' ', 'あ')
+<
+ Can be used as a |method|: >
+ GetString()->digraph_set('あ')
+<
+ This function works only when compiled with the |+digraphs|
+ feature. If this feature is disabled, this function will
+ display an error message.
+
+
+digraph_setlist({digraphlist}) *digraph_setlist()*
+ Similar to |digraph_set()| but this function can add multiple
+ digraphs at once. {digraphlist} is a list composed of lists,
+ where each list contains two strings with {chars} and
+ {digraph} as in |digraph_set()|. *E1216*
+ Example: >
+ call digraph_setlist([['aa', 'あ'], ['ii', 'い']])
+<
+ It is similar to the following: >
+ for [chars, digraph] in [['aa', 'あ'], ['ii', 'い']]
+ call digraph_set(chars, digraph)
+ endfor
+< Except that the function returns after the first error,
+ following digraphs will not be added.
+
+ Can be used as a |method|: >
+ GetList()->digraph_setlist()
+<
+ This function works only when compiled with the |+digraphs|
+ feature. If this feature is disabled, this function will
+ display an error message.
+
+
+echoraw({string}) *echoraw()*
+ Output {string} as-is, including unprintable characters.
+ This can be used to output a terminal code. For example, to
+ disable modifyOtherKeys: >
+ call echoraw(&t_TE)
+< and to enable it again: >
+ call echoraw(&t_TI)
+< Use with care, you can mess up the terminal this way.
+
+
+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 |String| is empty when its length is zero.
+ - A |Number| and |Float| are empty when their value is zero.
+ - |v:false|, |v:none| and |v:null| are empty, |v:true| is not.
+ - A |Job| is empty when it failed to start.
+ - A |Channel| is empty when it is closed.
+ - A |Blob| is empty when its length is zero.
+
+ For a long |List| this is much faster than comparing the
+ length with zero.
+
+ Can also be used as a |method|: >
+ mylist->empty()
+
+environ() *environ()*
+ Return all of environment variables as dictionary. You can
+ check if an environment variable exists like this: >
+ :echo has_key(environ(), 'HOME')
+< Note that the variable name may be CamelCase; to ignore case
+ use this: >
+ :echo index(keys(environ()), 'HOME', 0, 1) != -1
+
+escape({string}, {chars}) *escape()*
+ Escape the characters in {chars} that occur in {string} with a
+ backslash. Example: >
+ :echo escape('c:\program files\vim', ' \')
+< results in: >
+ c:\\program\ files\\vim
+< Also see |shellescape()| and |fnameescape()|.
+
+ Can also be used as a |method|: >
+ GetText()->escape(' \')
+<
+ *eval()*
+eval({string}) Evaluate {string} and return the result. Especially useful to
+ turn the result of |string()| back into the original value.
+ This works for Numbers, Floats, Strings, Blobs and composites
+ of them. Also works for |Funcref|s that refer to existing
+ functions.
+
+ Can also be used as a |method|: >
+ argv->join()->eval()
+
+eventhandler() *eventhandler()*
+ Returns 1 when inside an event handler. That is that Vim got
+ interrupted while waiting for the user to type a character,
+ e.g., when dropping a file on Vim. This means interactive
+ commands cannot be used. Otherwise zero is returned.
+
+executable({expr}) *executable()*
+ This function checks if an executable with the name {expr}
+ exists. {expr} must be the name of the program without any
+ arguments.
+ executable() uses the value of $PATH and/or the normal
+ searchpath for programs. *PATHEXT*
+ On MS-Windows the ".exe", ".bat", etc. can optionally be
+ included. Then the extensions in $PATHEXT are tried. Thus if
+ "foo.exe" does not exist, "foo.exe.bat" can be found. If
+ $PATHEXT is not set then ".com;.exe;.bat;.cmd" is used. A dot
+ by itself can be used in $PATHEXT to try using the name
+ without an extension. When 'shell' looks like a Unix shell,
+ then the name is also tried without adding an extension.
+ On MS-Windows it only checks if the file exists and is not a
+ directory, not if it's really executable.
+ On MS-Windows an executable in the same directory as Vim is
+ normally found. Since this directory is added to $PATH it
+ should also work to execute it |win32-PATH|. This can be
+ disabled by setting the $NoDefaultCurrentDirectoryInExePath
+ environment variable. *NoDefaultCurrentDirectoryInExePath*
+ 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.
+
+ Can also be used as a |method|: >
+ GetCommand()->executable()
+
+execute({command} [, {silent}]) *execute()*
+ Execute an Ex command or commands and return the output as a
+ string.
+ {command} can be a string or a List. In case of a List the
+ lines are executed one by one.
+ This is equivalent to: >
+ redir => var
+ {command}
+ redir END
+<
+ 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. When using an external
+ command the screen may be messed up, use `system()` instead.
+ *E930*
+ It is not possible to use `:redir` anywhere in {command}.
+
+ To get a list of lines use |split()| on the result: >
+ execute('args')->split("\n")
+
+< To execute a command in another window than the current one
+ use `win_execute()`.
+
+ When used recursively the output of the recursive call is not
+ included in the output of the higher level call.
+
+ Can also be used as a |method|: >
+ GetCommand()->execute()
+
+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.
+
+ Can also be used as a |method|: >
+ GetCommand()->exepath()
+<
+ *exists()*
+exists({expr}) The result is a Number, which is |TRUE| if {expr} is defined,
+ zero otherwise.
+
+ Note: In a compiled |:def| function the evaluation is done at
+ runtime. Use `exists_compiled()` to evaluate the expression
+ at compile time.
+
+ 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:
+ varname internal variable (see
+ dict.key |internal-variables|). Also works
+ list[i] for |curly-braces-names|, |Dictionary|
+ import.Func entries, |List| items, imported
+ items, etc.
+ Does not work for local variables in a
+ compiled `:def` function.
+ Also works for a function in |Vim9|
+ script, since it can be used as a
+ function reference.
+ Beware that evaluating an index may
+ cause an error message for an invalid
+ expression. E.g.: >
+ :let l = [1, 2, 3]
+ :echo exists("l[5]")
+< 0 >
+ :echo exists("l[xx]")
+< E121: Undefined variable: xx
+ 0
+ &option-name Vim option (only checks if it exists,
+ not if it really works)
+ +option-name Vim option that works.
+ $ENVNAME environment variable (could also be
+ done by comparing with an empty
+ string)
+ *funcname built-in function (see |functions|)
+ or user defined function (see
+ |user-functions|) that is implemented.
+ Also works for a variable that is a
+ Funcref.
+ ?funcname built-in function that could be
+ implemented; to be used to check if
+ "funcname" is valid
+ :cmdname Ex command: built-in command, user
+ command or command modifier |:command|.
+ Returns:
+ 1 for match with start of a command
+ 2 full match with a command
+ 3 matches several user commands
+ To check for a supported command
+ always check the return value to be 2.
+ :2match The |:2match| command.
+ :3match The |:3match| command (but you
+ probably should not use it, it is
+ reserved for internal usage)
+ #event autocommand defined for this event
+ #event#pattern autocommand defined for this event and
+ pattern (the pattern is taken
+ literally and compared to the
+ autocommand patterns character by
+ character)
+ #group autocommand group exists
+ #group#event autocommand defined for this group and
+ event.
+ #group#event#pattern
+ autocommand defined for this group,
+ event and pattern.
+ ##event autocommand for this event is
+ supported.
+
+ Examples: >
+ exists("&shortname")
+ exists("$HOSTNAME")
+ exists("*strftime")
+ exists("*s:MyFunc") " only for legacy script
+ exists("*MyFunc")
+ exists("bufcount")
+ exists(":Make")
+ exists("#CursorHold")
+ exists("#BufReadPre#*.gz")
+ exists("#filetypeindent")
+ exists("#filetypeindent#FileType")
+ exists("#filetypeindent#FileType#*")
+ exists("##ColorScheme")
+< There must be no space between the symbol (&/$/*/#) and the
+ name.
+ There must be no extra characters after the name, although in
+ a few cases this is ignored. That may become stricter in the
+ future, thus don't count on it!
+ Working example: >
+ exists(":make")
+< NOT working example: >
+ exists(":make install")
+
+< Note that the argument must be a string, not the name of the
+ variable itself. For example: >
+ exists(bufcount)
+< This doesn't check for existence of the "bufcount" variable,
+ but gets the value of "bufcount", and checks if that exists.
+
+ Can also be used as a |method|: >
+ Varname()->exists()
+<
+
+exists_compiled({expr}) *exists_compiled()*
+ Like `exists()` but evaluated at compile time. This is useful
+ to skip a block where a function is used that would otherwise
+ give an error: >
+ if exists_compiled('*ThatFunction')
+ ThatFunction('works')
+ endif
+< If `exists()` were used then a compilation error would be
+ given if ThatFunction() is not defined.
+
+ {expr} must be a literal string. *E1232*
+ Can only be used in a |:def| function. *E1233*
+ This does not work to check for arguments or local variables.
+
+
+exp({expr}) *exp()*
+ Return the exponential of {expr} as a |Float| in the range
+ [0, inf].
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo exp(2)
+< 7.389056 >
+ :echo exp(-1)
+< 0.367879
+
+ Can also be used as a |method|: >
+ Compute()->exp()
+
+
+expand({string} [, {nosuf} [, {list}]]) *expand()*
+ Expand wildcards and the following special keywords in
+ {string}. 'wildignorecase' applies.
+
+ 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]
+
+ If the expansion fails, the result is an empty string. A name
+ for a non-existing file is not included, unless {string} does
+ not start with '%', '#' or '<', see below.
+
+ When {string} starts with '%', '#' or '<', the expansion is
+ done like for the |cmdline-special| variables with their
+ associated modifiers. Here is a short overview:
+
+ % current file name
+ # alternate file name
+ #n alternate file name n
+ <cfile> file name under the cursor
+ <afile> autocmd file name
+ <abuf> autocmd buffer number (as a String!)
+ <amatch> autocmd matched name
+ <cexpr> C expression under the cursor
+ <sfile> sourced script file or function name
+ <slnum> sourced script line number or function
+ line number
+ <sflnum> script file line number, also when in
+ a function
+ <SID> "<SNR>123_" where "123" is the
+ current script ID |<SID>|
+ <script> sourced script file, or script file
+ where the current function was defined
+ <stack> call stack
+ <cword> word under the cursor
+ <cWORD> WORD under the cursor
+ <client> the {clientid} of the last received
+ message |server2client()|
+ Modifiers:
+ :p expand to full path
+ :h head (last path component removed)
+ :t tail (last path component only)
+ :r root (one extension removed)
+ :e extension only
+
+ Example: >
+ :let &tags = expand("%:p:h") .. "/tags"
+< Note that when expanding a string that starts with '%', '#' or
+ '<', any following text is ignored. This does NOT work: >
+ :let doesntwork = expand("%:h.bak")
+< Use this: >
+ :let doeswork = expand("%:h") .. ".bak"
+< Also note that expanding "<cfile>" and others only returns the
+ referenced file name without further expansion. If "<cfile>"
+ is "~/.cshrc", you need to do another expand() to have the
+ "~/" expanded into the path of the home directory: >
+ :echo expand(expand("<cfile>"))
+<
+ There cannot be white space between the variables and the
+ following modifier. The |fnamemodify()| function can be used
+ to modify normal file names.
+
+ When using '%' or '#', and the current or alternate file name
+ is not defined, an empty string is used. Using "%:p" in a
+ buffer with no name, results in the current directory, with a
+ '/' added.
+ When 'verbose' is set then expanding '%', '#' and <> items
+ will result in an error message if the argument cannot be
+ expanded.
+
+ When {string} 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 |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
+ 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|.
+ The expanded variable is still handled like a list of file
+ names. When an environment variable cannot be expanded, it is
+ left unchanged. Thus ":echo expand('$FOOBAR')" results in
+ "$FOOBAR".
+
+ See |glob()| for finding existing files. See |system()| for
+ getting the raw output of an external command.
+
+ Can also be used as a |method|: >
+ Getpattern()->expand()
+
+expandcmd({string} [, {options}]) *expandcmd()*
+ Expand special items in String {string} like what is done for
+ an Ex command such as `:edit`. This expands special keywords,
+ like with |expand()|, and environment variables, anywhere in
+ {string}. "~user" and "~/path" are only expanded at the
+ start.
+
+ The following items are supported in the {options} Dict
+ argument:
+ errmsg If set to TRUE, error messages are displayed
+ if an error is encountered during expansion.
+ By default, error messages are not displayed.
+
+ Returns the expanded string. If an error is encountered
+ during expansion, the unmodified {string} is returned.
+
+ Example: >
+ :echo expandcmd('make %<.o')
+ make /path/runtime/doc/builtin.o
+ :echo expandcmd('make %<.o', {'errmsg': v:true})
+<
+ Can also be used as a |method|: >
+ GetCommand()->expandcmd()
+<
+extend({expr1}, {expr2} [, {expr3}]) *extend()*
+ {expr1} and {expr2} must be both |Lists| or both
+ |Dictionaries|.
+
+ If they are |Lists|: Append {expr2} to {expr1}.
+ If {expr3} is given insert the items of {expr2} before the
+ item with index {expr3} in {expr1}. When {expr3} is zero
+ insert before the first item. When {expr3} is equal to
+ len({expr1}) then {expr2} is appended.
+ Examples: >
+ :echo sort(extend(mylist, [7, 5]))
+ :call extend(mylist, [2, 3], 1)
+< When {expr1} is the same List as {expr2} then the number of
+ items copied is equal to the original length of the List.
+ E.g., when {expr3} is 1 you get N new copies of the first item
+ (where N is the original length of the List).
+ Use |add()| to concatenate one item to a list. To concatenate
+ two lists into a new list use the + operator: >
+ :let newlist = [1, 2, 3] + [4, 5]
+<
+ If they are |Dictionaries|:
+ Add all entries from {expr2} to {expr1}.
+ If a key exists in both {expr1} and {expr2} then {expr3} is
+ used to decide what to do:
+ {expr3} = "keep": keep the value of {expr1}
+ {expr3} = "force": use the value of {expr2}
+ {expr3} = "error": give an error message *E737*
+ When {expr3} is omitted then "force" is assumed.
+
+ {expr1} is changed when {expr2} is not empty. If necessary
+ make a copy of {expr1} first.
+ {expr2} remains unchanged.
+ When {expr1} is locked and {expr2} is not empty the operation
+ fails.
+ Returns {expr1}. Returns 0 on error.
+
+ Can also be used as a |method|: >
+ mylist->extend(otherlist)
+
+
+extendnew({expr1}, {expr2} [, {expr3}]) *extendnew()*
+ Like |extend()| but instead of adding items to {expr1} a new
+ List or Dictionary is created and returned. {expr1} remains
+ unchanged.
+
+
+feedkeys({string} [, {mode}]) *feedkeys()*
+ Characters in {string} are queued for processing as if they
+ come from a mapping or were typed by the user.
+
+ By default the string is added to the end of the typeahead
+ buffer, thus if a mapping is still being executed the
+ characters come after them. Use the 'i' flag to insert before
+ other characters, they will be executed next, before any
+ characters from a mapping.
+
+ The function does not wait for processing of keys contained in
+ {string}.
+
+ To include special keys into {string}, use double-quotes
+ and "\..." notation |expr-quote|. For example,
+ feedkeys("\<CR>") simulates pressing of the <Enter> key. But
+ feedkeys('\<CR>') pushes 5 characters.
+ A special code that might be useful is <Ignore>, it exits the
+ wait for a character without doing anything. *<Ignore>*
+
+ {mode} is a String, which can contain these character flags:
+ 'm' Remap keys. This is default. If {mode} is absent,
+ keys are remapped.
+ 'n' Do not remap keys.
+ 't' Handle keys as if typed; otherwise they are handled as
+ if coming from a mapping. This matters for undo,
+ opening folds, etc.
+ 'L' Lowlevel input. Only works for Unix or when using the
+ GUI. Keys are used as if they were coming from the
+ terminal. Other flags are not used. *E980*
+ When a CTRL-C interrupts and 't' is included it sets
+ the internal "got_int" flag.
+ 'i' Insert the string instead of appending (see above).
+ 'x' Execute commands until typeahead is empty. This is
+ similar to using ":normal!". You can call feedkeys()
+ several times without 'x' and then one time with 'x'
+ (possibly with an empty {string}) to execute all the
+ typeahead. Note that when Vim ends in Insert mode it
+ will behave as if <Esc> is typed, to avoid getting
+ stuck, waiting for a character to be typed before the
+ script continues.
+ Note that if you manage to call feedkeys() while
+ executing commands, thus calling it recursively, then
+ all typeahead will be consumed by the last call.
+ 'c' Remove any script context when executing, so that
+ legacy script syntax applies, "s:var" does not work,
+ etc. Note that if the string being fed sets a script
+ context this still applies.
+ '!' 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.
+
+ Can also be used as a |method|: >
+ GetInput()->feedkeys()
+
+filereadable({file}) *filereadable()*
+ 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
+ expression, which is used as a String.
+ If you don't care about the file being readable you can use
+ |glob()|.
+ {file} is used as-is, you may want to expand wildcards first: >
+ echo filereadable('~/.vimrc')
+ 0
+ echo filereadable(expand('~/.vimrc'))
+ 1
+
+< Can also be used as a |method|: >
+ GetName()->filereadable()
+< *file_readable()*
+ Obsolete name: file_readable().
+
+
+filewritable({file}) *filewritable()*
+ The result is a Number, which is 1 when a file with the
+ name {file} exists, and can be written. If {file} doesn't
+ exist, or is not writable, the result is 0. If {file} is a
+ directory, and we can write to it, the result is 2.
+
+ Can also be used as a |method|: >
+ GetName()->filewritable()
+
+
+filter({expr1}, {expr2}) *filter()*
+ {expr1} must be a |List|, |String|, |Blob| or |Dictionary|.
+ For each item in {expr1} evaluate {expr2} and when the result
+ is zero or false remove the item from the |List| or
+ |Dictionary|. Similarly for each byte in a |Blob| and each
+ character in a |String|.
+
+ {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 |Blob| |v:key| has the index of the
+ current byte. For a |String| |v:key| has the index of the
+ current character.
+ Examples: >
+ call filter(mylist, 'v:val !~ "OLD"')
+< Removes the items where "OLD" appears. >
+ call filter(mydict, 'v:key >= 8')
+< Removes the items with a key below 8. >
+ call filter(var, 0)
+< Removes all the items, thus clears the |List| or |Dictionary|.
+
+ 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|. In |Vim9| syntax: >
+ call filter(myList, (idx, val) => idx * val <= 42)
+< In legacy script syntax: >
+ 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})
+<
+ In |Vim9| script the result must be true, false, zero or one.
+ Other values will result in a type error.
+
+ For a |List| and a |Dictionary| the operation is done
+ in-place. If you want it to remain unmodified make a copy
+ first: >
+ :let l = filter(copy(mylist), 'v:val =~ "KEEP"')
+
+< Returns {expr1}, the |List| or |Dictionary| that was filtered,
+ or a new |Blob| or |String|.
+ 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.
+
+ Can also be used as a |method|: >
+ mylist->filter(expr2)
+
+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}.
+
+ Returns the path of the first found match. When the found
+ directory is below the current directory a relative path is
+ returned. Otherwise a full path is returned.
+ If {path} is omitted or empty then 'path' is used.
+
+ If the optional {count} is given, find {count}'s occurrence of
+ {name} in {path} instead of the first one.
+ When {count} is negative return all the matches in a |List|.
+
+ Returns an empty string if the directory is not found.
+
+ This is quite similar to the ex-command `:find`.
+
+ Can also be used as a |method|: >
+ GetName()->finddir()
+
+findfile({name} [, {path} [, {count}]]) *findfile()*
+ Just like |finddir()|, but find a file instead of a directory.
+ Uses 'suffixesadd'.
+ Example: >
+ :echo findfile("tags.vim", ".;")
+< Searches from the directory of the current file upwards until
+ it finds the file "tags.vim".
+
+ Can also be used as a |method|: >
+ GetName()->findfile()
+
+flatten({list} [, {maxdepth}]) *flatten()*
+ Flatten {list} up to {maxdepth} levels. Without {maxdepth}
+ the result is a |List| without nesting, as if {maxdepth} is
+ a very large number.
+ The {list} is changed in place, use |flattennew()| if you do
+ not want that.
+ In Vim9 script flatten() cannot be used, you must always use
+ |flattennew()|.
+ *E900*
+ {maxdepth} means how deep in nested lists changes are made.
+ {list} is not modified when {maxdepth} is 0.
+ {maxdepth} must be positive number.
+
+ If there is an error the number zero is returned.
+
+ Example: >
+ :echo flatten([1, [2, [3, 4]], 5])
+< [1, 2, 3, 4, 5] >
+ :echo flatten([1, [2, [3, 4]], 5], 1)
+< [1, 2, [3, 4], 5]
+
+ Can also be used as a |method|: >
+ mylist->flatten()
+<
+flattennew({list} [, {maxdepth}]) *flattennew()*
+ Like |flatten()| but first make a copy of {list}.
+
+
+float2nr({expr}) *float2nr()*
+ Convert {expr} to a Number by omitting the part after the
+ decimal point.
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0 if {expr} is not 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 (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 (or 9223372036854775807) >
+ echo float2nr(-1.0e150)
+< -2147483647 (or -9223372036854775807) >
+ echo float2nr(1.0e-100)
+< 0
+
+ Can also be used as a |method|: >
+ Compute()->float2nr()
+
+
+floor({expr}) *floor()*
+ Return the largest integral value less than or equal to
+ {expr} as a |Float| (round down).
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ echo floor(1.856)
+< 1.0 >
+ echo floor(-5.456)
+< -6.0 >
+ echo floor(4.0)
+< 4.0
+
+ Can also be used as a |method|: >
+ Compute()->floor()
+
+
+fmod({expr1}, {expr2}) *fmod()*
+ Return the remainder of {expr1} / {expr2}, even if the
+ division is not representable. Returns {expr1} - i * {expr2}
+ for some integer i such that if {expr2} is non-zero, the
+ result has the same sign as {expr1} and magnitude less than
+ the magnitude of {expr2}. If {expr2} is zero, the value
+ returned is zero. The value returned is a |Float|.
+ {expr1} and {expr2} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr1} or {expr2} is not a |Float| or a
+ |Number|.
+ Examples: >
+ :echo fmod(12.33, 1.22)
+< 0.13 >
+ :echo fmod(-12.33, 1.22)
+< -0.13
+
+ Can also be used as a |method|: >
+ Compute()->fmod(1.22)
+
+
+fnameescape({string}) *fnameescape()*
+ Escape {string} for use as file name command argument. All
+ characters that have a special meaning, such as '%' and '|'
+ are escaped with a backslash.
+ For most systems the characters escaped are
+ " \t\n*?[{`$\\%#'\"|!<". For systems where a backslash
+ appears in a filename, it depends on the value of 'isfname'.
+ A leading '+' and '>' is also escaped (special after |:edit|
+ and |:write|). And a "-" by itself (special after |:cd|).
+ Returns an empty string on error.
+ Example: >
+ :let fname = '+some str%nge|name'
+ :exe "edit " .. fnameescape(fname)
+< results in executing: >
+ edit \+some\ str\%nge\|name
+<
+ Can also be used as a |method|: >
+ GetName()->fnameescape()
+
+fnamemodify({fname}, {mods}) *fnamemodify()*
+ Modify file name {fname} according to {mods}. {mods} is a
+ string of characters like it is used for file names on the
+ command line. See |filename-modifiers|.
+ Example: >
+ :echo fnamemodify("main.c", ":p:h")
+< results in: >
+ /home/user/vim/vim/src
+< If {mods} is empty or an unsupported modifier is used then
+ {fname} is returned.
+ When {fname} is empty then with {mods} ":h" returns ".", so
+ that `:cd` can be used with it. This is different from
+ expand('%:h') without a buffer name, which returns an empty
+ string.
+ Note: Environment variables don't work in {fname}, use
+ |expand()| first then.
+
+ Can also be used as a |method|: >
+ GetName()->fnamemodify(':p:h')
+
+foldclosed({lnum}) *foldclosed()*
+ The result is a Number. If the line {lnum} is in a closed
+ fold, the result is the number of the first line in that fold.
+ If the line {lnum} is not in a closed fold, -1 is returned.
+ {lnum} is used like with |getline()|. Thus "." is the current
+ line, "'m" mark m, etc.
+
+ Can also be used as a |method|: >
+ GetLnum()->foldclosed()
+
+foldclosedend({lnum}) *foldclosedend()*
+ The result is a Number. If the line {lnum} is in a closed
+ fold, the result is the number of the last line in that fold.
+ If the line {lnum} is not in a closed fold, -1 is returned.
+ {lnum} is used like with |getline()|. Thus "." is the current
+ line, "'m" mark m, etc.
+
+ Can also be used as a |method|: >
+ GetLnum()->foldclosedend()
+
+foldlevel({lnum}) *foldlevel()*
+ The result is a Number, which is the foldlevel of line {lnum}
+ in the current buffer. For nested folds the deepest level is
+ returned. If there is no fold at line {lnum}, zero is
+ returned. It doesn't matter if the folds are open or closed.
+ When used while updating folds (from 'foldexpr') -1 is
+ returned for lines where folds are still to be updated and the
+ foldlevel is unknown. As a special case the level of the
+ previous line is usually available.
+ {lnum} is used like with |getline()|. Thus "." is the current
+ line, "'m" mark m, etc.
+
+ Can also be used as a |method|: >
+ GetLnum()->foldlevel()
+<
+ *foldtext()*
+foldtext() Returns a String, to be displayed for a closed fold. This is
+ the default function used for the 'foldtext' option and should
+ only be called from evaluating 'foldtext'. It uses the
+ |v:foldstart|, |v:foldend| and |v:folddashes| variables.
+ The returned string looks like this: >
+ +-- 45 lines: abcdef
+< 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.
+ Returns an empty string when there is no fold.
+ {not available when compiled without the |+folding| feature}
+
+foldtextresult({lnum}) *foldtextresult()*
+ Returns the text that is displayed for the closed fold at line
+ {lnum}. Evaluates 'foldtext' in the appropriate context.
+ When there is no closed fold at {lnum} an empty string is
+ returned.
+ {lnum} is used like with |getline()|. Thus "." is the current
+ line, "'m" mark m, etc.
+ Useful when exporting folded text, e.g., to HTML.
+ {not available when compiled without the |+folding| feature}
+
+
+ Can also be used as a |method|: >
+ GetLnum()->foldtextresult()
+<
+ *foreground()*
+foreground() Move the Vim window to the foreground. Useful when sent from
+ a client to a Vim server. |remote_send()|
+ On Win32 systems this might not work, the OS does not always
+ allow a window to bring itself to the foreground. Use
+ |remote_foreground()| instead.
+ {only in the Win32, Motif and GTK GUI versions and the
+ Win32 console version}
+
+fullcommand({name} [, {vim9}]) *fullcommand()*
+ Get the full command name from a short abbreviated command
+ name; see |20.2| for details on command abbreviations.
+
+ The string argument {name} may start with a `:` and can
+ include a [range], these are skipped and not returned.
+ Returns an empty string if a command doesn't exist, if it's
+ ambiguous (for user-defined commands) or cannot be shortened
+ this way. |vim9-no-shorten|
+
+ Without the {vim9} argument uses the current script version.
+ If {vim9} is present and FALSE then legacy script rules are
+ used. When {vim9} is present and TRUE then Vim9 rules are
+ used, e.g. "en" is not a short form of "endif".
+
+ For example `fullcommand('s')`, `fullcommand('sub')`,
+ `fullcommand(':%substitute')` all return "substitute".
+
+ Can also be used as a |method|: >
+ GetName()->fullcommand()
+<
+ *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.
+ It only works for an autoloaded function if it has already
+ been loaded (to avoid mistakenly loading the autoload script
+ when only intending to use the function name, use |function()|
+ instead). {name} cannot be a builtin function.
+ Returns 0 on error.
+
+ Can also be used as a |method|: >
+ GetFuncname()->funcref([arg])
+<
+ *function()* *partial* *E700* *E922* *E923*
+function({name} [, {arglist}] [, {dict}])
+ Return a |Funcref| variable that refers to function {name}.
+ {name} can be the name of 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 means 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, but after any argument from |method|. Example: >
+ func Callback(arg1, arg2, name)
+ ...
+ let Partial = function('Callback', ['one', 'two'])
+ ...
+ call Partial('name')
+< Invokes the function as with: >
+ call Callback('one', 'two', 'name')
+
+< With a |method|: >
+ func Callback(one, two, three)
+ ...
+ let Partial = function('Callback', ['two'])
+ ...
+ eval 'one'->Partial('three')
+< Invokes the function as with: >
+ call Callback('one', 'two', 'three')
+
+< The function() call can be nested to add more arguments to the
+ Funcref. The extra arguments are appended to the list of
+ arguments. Example: >
+ func Callback(arg1, arg2, name)
+ "...
+ let Func = function('Callback', ['one'])
+ let Func2 = function(Func, ['two'])
+ "...
+ call Func2('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 use of function() is not needed when there are no extra
+ arguments, these two are equivalent, if Callback() is defined
+ as context.Callback(): >
+ let Func = function('Callback', context)
+ let Func = context.Callback
+
+< 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)
+<
+ Returns 0 on error.
+
+ Can also be used as a |method|: >
+ GetFuncname()->function([arg])
+
+
+garbagecollect([{atexit}]) *garbagecollect()*
+ Cleanup unused |Lists|, |Dictionaries|, |Channels| and |Jobs|
+ 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.
+ 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. To force garbage collection immediately use
+ |test_garbagecollect_now()|.
+
+get({list}, {idx} [, {default}]) *get()*
+ Get item {idx} from |List| {list}. When this item is not
+ available return {default}. Return zero when {default} is
+ omitted.
+ Preferably used as a |method|: >
+ mylist->get(idx)
+get({blob}, {idx} [, {default}])
+ Get byte {idx} from |Blob| {blob}. When this byte is not
+ available return {default}. Return -1 when {default} is
+ omitted.
+ Preferably used as a |method|: >
+ myblob->get(idx)
+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. Useful example: >
+ let val = get(g:, 'var_name', 'default')
+< This gets the value of g:var_name if it exists, and uses
+ 'default' when it does not exist.
+ Preferably used as a |method|: >
+ mydict->get(key)
+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
+ Returns zero on error.
+ Preferably used as a |method|: >
+ myfunc->get(what)
+<
+ *getbufinfo()*
+getbufinfo([{buf}])
+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.
+ bufmodified include only modified buffers.
+
+ Otherwise, {buf} specifies a particular buffer to return
+ information for. For the use of {buf}, 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.
+ lastused Timestamp in seconds, like
+ |localtime()|, when the buffer was
+ last used.
+ {only with the |+viminfo| feature}
+ listed TRUE if the buffer is listed.
+ lnum Line number used for the buffer when
+ opened in the current window.
+ Only valid if the buffer has been
+ displayed in the window in the past.
+ If you want the line number of the
+ last known cursor position in a given
+ window, use |line()|: >
+ :echo line('.', {winid})
+<
+ linecount Number of lines in the buffer (only
+ valid when loaded)
+ 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
+ popups List of popup |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')
+<
+ Can also be used as a |method|: >
+ GetBufnr()->getbufinfo()
+<
+
+ *getbufline()*
+getbufline({buf}, {lnum} [, {end}])
+ Return a |List| with the lines starting from {lnum} to {end}
+ (inclusive) in the buffer {buf}. If {end} is omitted, a
+ |List| with only the line {lnum} is returned. See
+ `getbufoneline()` for only getting the line.
+
+ For the use of {buf}, see |bufname()| above.
+
+ For {lnum} and {end} "$" can be used for the last line of the
+ buffer. Otherwise a number must be used.
+
+ When {lnum} is smaller than 1 or bigger than the number of
+ lines in the buffer, an empty |List| is returned.
+
+ When {end} is greater than the number of lines in the buffer,
+ it is treated as {end} is set to the number of lines in the
+ buffer. When {end} is before {lnum} an empty |List| is
+ returned.
+
+ This function works only for loaded buffers. For unloaded and
+ non-existing buffers, an empty |List| is returned.
+
+ Example: >
+ :let lines = getbufline(bufnr("myfile"), 1, "$")
+
+< Can also be used as a |method|: >
+ GetBufnr()->getbufline(lnum)
+<
+ *getbufoneline()*
+getbufoneline({buf}, {lnum})
+ Just like `getbufline()` but only get one line and return it
+ as a string.
+
+getbufvar({buf}, {varname} [, {def}]) *getbufvar()*
+ The result is the value of option or local buffer variable
+ {varname} in buffer {buf}. Note that the name without "b:"
+ must be used.
+ The {varname} argument is a string.
+ 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.
+ For the use of {buf}, see |bufname()| above.
+ When the buffer or variable doesn't exist {def} or an empty
+ string is returned, there is no error message.
+ Examples: >
+ :let bufmodified = getbufvar(1, "&mod")
+ :echo "todo myvar = " .. getbufvar("todo", "myvar")
+
+< Can also be used as a |method|: >
+ GetBufnr()->getbufvar(varname)
+<
+getcellwidths() *getcellwidths()*
+ Returns a |List| of cell widths of character ranges overridden
+ by |setcellwidths()|. The format is equal to the argument of
+ |setcellwidths()|. If no character ranges have their cell
+ widths overridden, an empty List is returned.
+
+
+getchangelist([{buf}]) *getchangelist()*
+ Returns the |changelist| for the buffer {buf}. For the use
+ of {buf}, see |bufname()| above. If buffer {buf} doesn't
+ exist, an empty list is returned.
+
+ The returned list contains two entries: a list with the change
+ locations and the current position in the list. Each
+ entry in the change list is a dictionary with the following
+ entries:
+ col column number
+ coladd column offset for 'virtualedit'
+ lnum line number
+ If buffer {buf} is the current buffer, then the current
+ position refers to the position in the list. For other
+ buffers, it is set to the length of the list.
+
+ Can also be used as a |method|: >
+ GetBufnr()->getchangelist()
+
+getchar([expr]) *getchar()*
+ Get a single character from the user or input stream.
+ If [expr] is omitted, wait until a character is available.
+ If [expr] is 0, only get a character when one is available.
+ Return zero otherwise.
+ If [expr] is 1, only check if a character is available, it is
+ not consumed. Return zero if no character available.
+ If you prefer always getting a string use |getcharstr()|.
+
+ Without [expr] and when [expr] is 0 a whole character or
+ special key is returned. If it is a single character, the
+ result is a Number. Use |nr2char()| to convert it to a String.
+ Otherwise a String is returned with the encoded character.
+ For a special key it's a String with a sequence of bytes
+ starting with 0x80 (decimal: 128). This is the same value as
+ the String "\<Key>", e.g., "\<Left>". The returned value is
+ also a String when a modifier (shift, control, alt) was used
+ that is not included in the character.
+
+ When [expr] is 0 and Esc is typed, there will be a short delay
+ while Vim waits to see if this is the start of an escape
+ sequence.
+
+ When [expr] is 1 only the first byte is returned. For a
+ one-byte character it is the character itself as a number.
+ Use nr2char() to convert it to a String.
+
+ Use getcharmod() to obtain any additional modifiers.
+
+ 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|, |v:mouse_winid| and |v:mouse_win|.
+ |getmousepos()| can also be used. Mouse move events will be
+ ignored.
+ 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"
+ exe v:mouse_lnum
+ exe "normal " .. v:mouse_col .. "|"
+ endif
+<
+ When using bracketed paste only the first character is
+ returned, the rest of the pasted text is dropped.
+ |xterm-bracketed-paste|.
+
+ There is no prompt, you will somehow have to make clear to the
+ user that a character has to be typed. The screen is not
+ redrawn, e.g. when resizing the window. When using a popup
+ window it should work better with a |popup-filter|.
+
+ There is no mapping for the character.
+ Key codes are replaced, thus when the user presses the <Del>
+ key you get the code for the <Del> key, not the raw character
+ sequence. Examples: >
+ getchar() == "\<Del>"
+ getchar() == "\<S-Left>"
+< This example redefines "f" to ignore case: >
+ :nmap f :call FindChar()<CR>
+ :function FindChar()
+ : let c = nr2char(getchar())
+ : while col('.') < col('$') - 1
+ : normal l
+ : if getline('.')[col('.') - 1] ==? c
+ : break
+ : endif
+ : endwhile
+ :endfunction
+<
+ You may also receive synthetic characters, such as
+ |<CursorHold>|. Often you will want to ignore this and get
+ another character: >
+ :function GetKey()
+ : let c = getchar()
+ : while c == "\<CursorHold>"
+ : let c = getchar()
+ : endwhile
+ : return c
+ :endfunction
+
+getcharmod() *getcharmod()*
+ The result is a Number which is the state of the modifiers for
+ the last obtained character with getchar() or in another way.
+ These values are added together:
+ 2 shift
+ 4 control
+ 8 alt (meta)
+ 16 meta (when it's different from ALT)
+ 32 mouse double click
+ 64 mouse triple click
+ 96 mouse quadruple click (== 32 + 64)
+ 128 command (Macintosh only)
+ Only the modifiers that have not been included in the
+ character itself are obtained. Thus Shift-a results in "A"
+ without a modifier. Returns 0 if no modifiers are used.
+
+ *getcharpos()*
+getcharpos({expr})
+ Get the position for String {expr}. Same as |getpos()| but the
+ column number in the returned List is a character index
+ instead of a byte index.
+ If |getpos()| returns a very large column number, equal to
+ |v:maxcol|, then getcharpos() will return the character index
+ of the last character.
+
+ Example:
+ With the cursor on '세' in line 5 with text "여보세요": >
+ getcharpos('.') returns [0, 5, 3, 0]
+ getpos('.') returns [0, 5, 7, 0]
+<
+ Can also be used as a |method|: >
+ GetMark()->getcharpos()
+
+getcharsearch() *getcharsearch()*
+ Return the current character search information as a {dict}
+ with the following entries:
+
+ char character previously used for a character
+ search (|t|, |f|, |T|, or |F|); empty string
+ if no character search has been performed
+ forward direction of character search; 1 for forward,
+ 0 for backward
+ until type of character search; 1 for a |t| or |T|
+ character search, 0 for an |f| or |F|
+ character search
+
+ This can be useful to always have |;| and |,| search
+ forward/backward regardless of the direction of the previous
+ character search: >
+ :nnoremap <expr> ; getcharsearch().forward ? ';' : ','
+ :nnoremap <expr> , getcharsearch().forward ? ',' : ';'
+< Also see |setcharsearch()|.
+
+
+getcharstr([expr]) *getcharstr()*
+ Get a single character from the user or input stream as a
+ string.
+ If [expr] is omitted, wait until a character is available.
+ If [expr] is 0 or false, only get a character when one is
+ available. Return an empty string otherwise.
+ If [expr] is 1 or true, only check if a character is
+ available, it is not consumed. Return an empty string
+ if no character is available.
+ Otherwise this works like |getchar()|, except that a number
+ result is converted to a string.
+
+getcmdcompltype() *getcmdcompltype()*
+ Return the type of the current command-line completion.
+ Only works when the command line is being edited, thus
+ requires use of |c_CTRL-\_e| or |c_CTRL-R_=|.
+ See |:command-completion| for the return string.
+ Also see |getcmdtype()|, |setcmdpos()|, |getcmdline()| and
+ |setcmdline()|.
+ Returns an empty string when completion is not defined.
+
+getcmdline() *getcmdline()*
+ Return the current command-line. Only works when the command
+ line is being edited, thus requires use of |c_CTRL-\_e| or
+ |c_CTRL-R_=|.
+ Example: >
+ :cmap <F7> <C-\>eescape(getcmdline(), ' \')<CR>
+< Also see |getcmdtype()|, |getcmdpos()|, |setcmdpos()| and
+ |setcmdline()|.
+ 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
+ byte count. The first column is 1.
+ Only works when editing the command line, thus requires use of
+ |c_CTRL-\_e| or |c_CTRL-R_=| or an expression mapping.
+ Returns 0 otherwise.
+ Also see |getcmdtype()|, |setcmdpos()|, |getcmdline()| and
+ |setcmdline()|.
+
+getcmdscreenpos() *getcmdscreenpos()*
+ Return the screen position of the cursor in the command line
+ as a byte count. The first column is 1.
+ Instead of |getcmdpos()|, it adds the prompt position.
+ Only works when editing the command line, thus requires use of
+ |c_CTRL-\_e| or |c_CTRL-R_=| or an expression mapping.
+ Returns 0 otherwise.
+ Also see |getcmdpos()|, |setcmdpos()|, |getcmdline()| and
+ |setcmdline()|.
+
+getcmdtype() *getcmdtype()*
+ Return the current command-line type. Possible return values
+ are:
+ : normal Ex command
+ > debug mode command |debug-mode|
+ / forward search command
+ ? backward search command
+ @ |input()| command
+ - |:insert| or |:append| command
+ = |i_CTRL-R_=|
+ Only works when editing the command line, thus requires use of
+ |c_CTRL-\_e| or |c_CTRL-R_=| or an expression mapping.
+ Returns an empty string otherwise.
+ Also see |getcmdpos()|, |setcmdpos()| and |getcmdline()|.
+
+getcmdwintype() *getcmdwintype()*
+ Return the current |command-line-window| type. Possible return
+ 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. The String
+ {type} argument specifies what for. The following completion
+ types are supported:
+
+ arglist file names in argument list
+ augroup autocmd groups
+ buffer buffer names
+ behave |:behave| suboptions
+ breakpoint |:breakadd| and |:breakdel| suboptions
+ color color schemes
+ command Ex command
+ cmdline |cmdline-completion| result
+ compiler compilers
+ cscope |:cscope| suboptions
+ diff_buffer |:diffget| and |:diffput| completion
+ 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
+ runtime |:runtime| completion
+ scriptnames sourced script names |:scriptnames|
+ 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 the 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 the 'wildoptions' option contains 'fuzzy', then fuzzy
+ matching is used to get the completion matches. Otherwise
+ regular expression matching is used. Thus this function
+ follows the user preference, what happens on the command line.
+ If you do not want this you can make 'wildoptions' empty
+ before calling getcompletion() and restore it afterwards.
+
+ If {type} is "cmdline", then the |cmdline-completion| result is
+ returned. For example, to complete the possible values after
+ a ":call" command: >
+ echo getcompletion('call ', 'cmdline')
+<
+ If there are no matches, an empty list is returned. An
+ invalid value for {type} produces an error.
+
+ Can also be used as a |method|: >
+ GetPattern()->getcompletion('color')
+<
+ *getcurpos()*
+getcurpos([{winid}])
+ Get the position of the cursor. This is like getpos('.'), but
+ includes an extra "curswant" item in the list:
+ [0, lnum, col, off, curswant] ~
+ The "curswant" number is the preferred column when moving the
+ cursor vertically. After |$| command it will be a very large
+ number equal to |v:maxcol|. Also see |getcursorcharpos()| and
+ |getpos()|.
+ The first "bufnum" item is always zero. The byte position of
+ the cursor is returned in 'col'. To get the character
+ position, use |getcursorcharpos()|.
+
+ The optional {winid} argument can specify the window. It can
+ be the window number or the |window-ID|. The last known
+ cursor position is returned, this may be invalid for the
+ current value of the buffer if it is not the current window.
+ If {winid} is invalid a list with zeroes is returned.
+
+ 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.
+
+ Can also be used as a |method|: >
+ GetWinid()->getcurpos()
+<
+ *getcursorcharpos()*
+getcursorcharpos([{winid}])
+ Same as |getcurpos()| but the column number in the returned
+ List is a character index instead of a byte index.
+
+ Example:
+ With the cursor on '보' in line 3 with text "여보세요": >
+ getcursorcharpos() returns [0, 3, 2, 0, 3]
+ getcurpos() returns [0, 3, 4, 0, 3]
+<
+ Can also be used as a |method|: >
+ GetWinid()->getcursorcharpos()
+
+< *getcwd()*
+getcwd([{winnr} [, {tabnr}]])
+ The result is a String, which is the name of the current
+ working directory. 'autochdir' is ignored.
+
+ With {winnr} return the local current directory of this window
+ in the current tab page. {winnr} can be the window number or
+ the |window-ID|.
+ If {winnr} is -1 return the name of the global working
+ directory. See also |haslocaldir()|.
+
+ With {winnr} and {tabnr} return the local current directory of
+ the window in the specified tab page. If {winnr} is -1 return
+ the working directory of the tabpage.
+ If {winnr} is zero use the current window, if {tabnr} is zero
+ use the current tabpage.
+ Without any arguments, return the actual working directory of
+ the current window.
+ Return an empty string if the arguments are invalid.
+
+ Examples: >
+ " Get the working directory of the current window
+ :echo getcwd()
+ :echo getcwd(0)
+ :echo getcwd(0, 0)
+ " Get the working directory of window 3 in tabpage 2
+ :echo getcwd(3, 2)
+ " Get the global working directory
+ :echo getcwd(-1)
+ " Get the working directory of tabpage 3
+ :echo getcwd(-1, 3)
+ " Get the working directory of current tabpage
+ :echo getcwd(-1, 0)
+
+< Can also be used as a |method|: >
+ GetWinnr()->getcwd()
+
+getenv({name}) *getenv()*
+ Return the value of environment variable {name}. The {name}
+ argument is a string, without a leading '$'. Example: >
+ myHome = getenv('HOME')
+
+< When the variable does not exist |v:null| is returned. That
+ is different from a variable set to an empty string, although
+ some systems interpret the empty value as the variable being
+ deleted. See also |expr-env|.
+
+ Can also be used as a |method|: >
+ GetVarname()->getenv()
+
+getfontname([{name}]) *getfontname()*
+ Without an argument returns the name of the normal font being
+ used. Like what is used for the Normal highlight group
+ |hl-Normal|.
+ With an argument a check is done whether String {name} is a
+ valid font name. If not then an empty string is returned.
+ Otherwise the actual font name is returned, or {name} if the
+ GUI does not support obtaining the real name.
+ Only works when the GUI is running, thus not in your vimrc or
+ gvimrc file. Use the |GUIEnter| autocommand to use this
+ function just after the GUI has started.
+ Note that the GTK GUI accepts any font name, thus checking for
+ a valid name does not work.
+
+getfperm({fname}) *getfperm()*
+ The result is a String, which is the read, write, and execute
+ permissions of the given file {fname}.
+ If {fname} does not exist or its directory cannot be read, an
+ empty string is returned.
+ The result is of the form "rwxrwxrwx", where each group of
+ "rwx" flags represent, in turn, the permissions of the owner
+ of the file, the group the file belongs to, and other users.
+ If a user does not have a given permission the flag for this
+ is replaced with the string "-". Examples: >
+ :echo getfperm("/etc/passwd")
+ :echo getfperm(expand("~/.vimrc"))
+< This will hopefully (from a security point of view) display
+ the string "rw-r--r--" or even "rw-------".
+
+ Can also be used as a |method|: >
+ GetFilename()->getfperm()
+<
+ For setting permissions use |setfperm()|.
+
+getfsize({fname}) *getfsize()*
+ The result is a Number, which is the size in bytes of the
+ given file {fname}.
+ If {fname} is a directory, 0 is returned.
+ If the file {fname} can't be found, -1 is returned.
+ If the size of {fname} is too big to fit in a Number then -2
+ is returned.
+
+ Can also be used as a |method|: >
+ GetFilename()->getfsize()
+
+getftime({fname}) *getftime()*
+ The result is a Number, which is the last modification time of
+ the given file {fname}. The value is measured as seconds
+ since 1st Jan 1970, and may be passed to strftime(). See also
+ |localtime()| and |strftime()|.
+ If the file {fname} can't be found -1 is returned.
+
+ Can also be used as a |method|: >
+ GetFilename()->getftime()
+
+getftype({fname}) *getftype()*
+ The result is a String, which is a description of the kind of
+ file of the given file {fname}.
+ If {fname} does not exist an empty string is returned.
+ Here is a table over different kinds of files and their
+ results:
+ Normal file "file"
+ Directory "dir"
+ Symbolic link "link"
+ Block device "bdev"
+ Character device "cdev"
+ Socket "socket"
+ FIFO "fifo"
+ All other "other"
+ Example: >
+ 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".
+
+ Can also be used as a |method|: >
+ GetFilename()->getftype()
+
+getimstatus() *getimstatus()*
+ The result is a Number, which is |TRUE| when the IME status is
+ active and |FALSE| otherwise.
+ See 'imstatusfunc'.
+
+getjumplist([{winnr} [, {tabnr}]]) *getjumplist()*
+ Returns the |jumplist| for the specified window.
+
+ Without arguments use the current window.
+ With {winnr} only use this window in the current tab page.
+ {winnr} can also be a |window-ID|.
+ With {winnr} and {tabnr} use the window in the specified tab
+ page. If {winnr} or {tabnr} is invalid, an empty list is
+ returned.
+
+ The returned list contains two entries: a list with the jump
+ locations and the last used jump position number in the list.
+ Each entry in the jump location list is a dictionary with
+ the following entries:
+ bufnr buffer number
+ col column number
+ coladd column offset for 'virtualedit'
+ filename filename if available
+ lnum line number
+
+ Can also be used as a |method|: >
+ GetWinnr()->getjumplist()
+
+< *getline()*
+getline({lnum} [, {end}])
+ Without {end} the result is a String, which is line {lnum}
+ from the current buffer. Example: >
+ getline(1)
+< When {lnum} is a String that doesn't start with a
+ digit, |line()| is called to translate the String into a Number.
+ To get the line under the cursor: >
+ getline(".")
+< When {lnum} is a number smaller than 1 or bigger than the
+ number of lines in the buffer, an empty string is returned.
+
+ When {end} is given the result is a |List| where each item is
+ a line from the current buffer in the range {lnum} to {end},
+ including line {end}.
+ {end} is used in the same way as {lnum}.
+ Non-existing lines are silently omitted.
+ When {end} is before {lnum} an empty |List| is returned.
+ Example: >
+ :let start = line('.')
+ :let end = search("^$") - 1
+ :let lines = getline(start, end)
+
+< Can also be used as a |method|: >
+ ComputeLnum()->getline()
+
+< To get lines from another buffer see |getbufline()| and
+ |getbufoneline()|
+
+getloclist({nr} [, {what}]) *getloclist()*
+ Returns a |List| with all the entries in the location list for
+ 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}.
+
+ In addition to the items supported by |getqflist()| in {what},
+ the following item is supported by |getloclist()|:
+
+ filewinid id of the window used to display files
+ from the location list. This field is
+ applicable only when called from a
+ location list window. See
+ |location-list-file-window| for more
+ details.
+
+ Returns a |Dictionary| with default values if there is no
+ location list for the window {nr}.
+ Returns an empty Dictionary if window {nr} does not exist.
+
+ Examples (See also |getqflist-examples|): >
+ :echo getloclist(3, {'all': 0})
+ :echo getloclist(5, {'filewinid': 0})
+
+
+getmarklist([{buf}]) *getmarklist()*
+ Without the {buf} argument returns a |List| with information
+ about all the global marks. |mark|
+
+ If the optional {buf} argument is specified, returns the
+ local marks defined in buffer {buf}. For the use of {buf},
+ see |bufname()|. If {buf} is invalid, an empty list is
+ returned.
+
+ Each item in the returned List is a |Dict| with the following:
+ mark name of the mark prefixed by "'"
+ pos a |List| with the position of the mark:
+ [bufnum, lnum, col, off]
+ Refer to |getpos()| for more information.
+ file file name
+
+ Refer to |getpos()| for getting information about a specific
+ mark.
+
+ Can also be used as a |method|: >
+ GetBufnr()->getmarklist()
+
+getmatches([{win}]) *getmatches()*
+ Returns a |List| with all matches previously defined for the
+ current window by |matchadd()| and the |:match| commands.
+ |getmatches()| is useful in combination with |setmatches()|,
+ as |setmatches()| can restore a list of matches saved by
+ |getmatches()|.
+ If {win} is specified, use the window with this number or
+ window ID instead of the current window. If {win} is invalid,
+ an empty list is returned.
+ Example: >
+ :echo getmatches()
+< [{'group': 'MyGroup1', 'pattern': 'TODO',
+ 'priority': 10, 'id': 1}, {'group': 'MyGroup2',
+ 'pattern': 'FIXME', 'priority': 10, 'id': 2}] >
+ :let m = getmatches()
+ :call clearmatches()
+ :echo getmatches()
+< [] >
+ :call setmatches(m)
+ :echo getmatches()
+< [{'group': 'MyGroup1', 'pattern': 'TODO',
+ 'priority': 10, 'id': 1}, {'group': 'MyGroup2',
+ 'pattern': 'FIXME', 'priority': 10, 'id': 2}] >
+ :unlet m
+<
+getmousepos() *getmousepos()*
+ Returns a |Dictionary| with the last known position of the
+ mouse. This can be used in a mapping for a mouse click or in
+ a filter of a popup window. The items are:
+ screenrow screen row
+ screencol screen column
+ winid Window ID of the click
+ winrow row inside "winid"
+ wincol column inside "winid"
+ line text line inside "winid"
+ column text column inside "winid"
+ All numbers are 1-based.
+
+ If not over a window, e.g. when in the command line, then only
+ "screenrow" and "screencol" are valid, the others are zero.
+
+ When on the status line below a window or the vertical
+ separator right of a window, the "line" and "column" values
+ are zero.
+
+ When the position is after the text then "column" is the
+ length of the text in bytes plus one.
+
+ If the mouse is over a popup window then that window is used.
+
+ When using |getchar()| the Vim variables |v:mouse_lnum|,
+ |v:mouse_col| and |v:mouse_winid| also provide these values.
+
+getmouseshape() *getmouseshape()*
+ Returns the name of the currently showing mouse pointer.
+ When the |+mouseshape| feature is not supported or the shape
+ is unknown an empty string is returned.
+ This function is mainly intended for testing.
+
+ *getpid()*
+getpid() Return a Number which is the process ID of the Vim process.
+ On Unix and MS-Windows this is a unique number, until Vim
+ exits.
+
+ *getpos()*
+getpos({expr}) Get the position for String {expr}. For possible values of
+ {expr} see |line()|. For getting the cursor position see
+ |getcurpos()|.
+ The result is a |List| with four numbers:
+ [bufnum, lnum, col, off]
+ "bufnum" is zero, unless a mark like '0 or 'A is used, then it
+ is the buffer number of the mark.
+ "lnum" and "col" are the position in the buffer. The first
+ column is 1.
+ The "off" number is zero, unless 'virtualedit' is used. Then
+ it is the offset in screen columns from the start of the
+ character. E.g., a position within a <Tab> or after the last
+ character.
+ Note that for '< and '> Visual mode matters: when it is "V"
+ (visual line mode) the column of '< is zero and the column of
+ '> is a large number equal to |v:maxcol|.
+ The column number in the returned List is the byte position
+ within the line. To get the character position in the line,
+ use |getcharpos()|.
+ A very large column number equal to |v:maxcol| can be returned,
+ in which case it means "after the end of the line".
+ If {expr} is invalid, returns a list with all zeros.
+ This can be used to save and restore the position of a mark: >
+ let save_a_mark = getpos("'a")
+ ...
+ call setpos("'a", save_a_mark)
+< Also see |getcharpos()|, |getcurpos()| and |setpos()|.
+
+ Can also be used as a |method|: >
+ GetMark()->getpos()
+
+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)
+ end_lnum
+ end of line number if the item is multiline
+ col column number (first column is 1)
+ end_col end of column number if the item has range
+ 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 |TRUE|: recognized error message
+
+ When there is no error list or it's empty, an empty list is
+ returned. Quickfix list entries with a non-existing buffer
+ number are returned with "bufnr" set to zero (Note: some
+ functions accept buffer number zero for the alternate buffer,
+ you may need to explicitly check for zero).
+
+ Useful application: Find pattern matches in multiple files and
+ do something with them: >
+ :vimgrep /theword/jg *.c
+ :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 get information for the quickfix entry at this
+ index in the list specified by 'id' or 'nr'.
+ If set to zero, then uses the current entry.
+ See |quickfix-index|
+ 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
+ qfbufnr number of the buffer displayed in the quickfix
+ window. Returns 0 if the quickfix buffer is
+ not present. See |quickfix-buffer|.
+ 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 quickfix 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
+ qfbufnr number of the buffer displayed in the quickfix
+ window. 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('*')
+< When register {regname} was not set the result is an empty
+ string.
+ The {regname} argument must be a string. *E1162*
+
+ 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 |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 "", the unnamed register '"' is used.
+ If {regname} is not specified, |v:register| is used.
+ In |Vim9-script| {regname} must be one character.
+
+ Can also be used as a |method|: >
+ GetRegname()->getreg()
+
+getreginfo([{regname}]) *getreginfo()*
+ Returns detailed information about register {regname} as a
+ Dictionary with the following entries:
+ regcontents List of lines contained in register
+ {regname}, like
+ |getreg|({regname}, 1, 1).
+ regtype the type of register {regname}, as in
+ |getregtype()|.
+ isunnamed Boolean flag, v:true if this register
+ is currently pointed to by the unnamed
+ register.
+ points_to for the unnamed register, gives the
+ single letter name of the register
+ currently pointed to (see |quotequote|).
+ For example, after deleting a line
+ with `dd`, this field will be "1",
+ which is the register that got the
+ deleted text.
+
+ The {regname} argument is a string. If {regname} is invalid
+ or not set, an empty Dictionary will be returned.
+ If {regname} is "" or "@", the unnamed register '"' is used.
+ If {regname} is not specified, |v:register| is used.
+ The returned Dictionary can be passed to |setreg()|.
+ In |Vim9-script| {regname} must be one character.
+
+ Can also be used as a |method|: >
+ GetRegname()->getreginfo()
+
+getregtype([{regname}]) *getregtype()*
+ The result is a String, which is type of register {regname}.
+ The value will be one of:
+ "v" for |characterwise| text
+ "V" for |linewise| text
+ "<CTRL-V>{width}" for |blockwise-visual| text
+ "" for an empty or unknown register
+ <CTRL-V> is one character with value 0x16.
+ The {regname} argument is a string. If {regname} is "", the
+ unnamed register '"' is used. If {regname} is not specified,
+ |v:register| is used.
+ In |Vim9-script| {regname} must be one character.
+
+ Can also be used as a |method|: >
+ GetRegname()->getregtype()
+
+getscriptinfo([{opts}) *getscriptinfo()*
+ Returns a |List| with information about all the sourced Vim
+ scripts in the order they were sourced, like what
+ `:scriptnames` shows.
+
+ The optional Dict argument {opts} supports the following
+ optional items:
+ name Script name match pattern. If specified,
+ and "sid" is not specified, information about
+ scripts with name that match the pattern
+ "name" are returned.
+ sid Script ID |<SID>|. If specified, only
+ information about the script with ID "sid" is
+ returned and "name" is ignored.
+
+ Each item in the returned List is a |Dict| with the following
+ items:
+ autoload Set to TRUE for a script that was used with
+ `import autoload` but was not actually sourced
+ yet (see |import-autoload|).
+ functions List of script-local function names defined in
+ the script. Present only when a particular
+ script is specified using the "sid" item in
+ {opts}.
+ name Vim script file name.
+ sid Script ID |<SID>|.
+ sourced Script ID of the actually sourced script that
+ this script name links to, if any, otherwise
+ zero
+ variables A dictionary with the script-local variables.
+ Present only when a particular script is
+ specified using the "sid" item in {opts}.
+ Note that this is a copy, the value of
+ script-local variables cannot be changed using
+ this dictionary.
+ version Vimscript version (|scriptversion|)
+
+ Examples: >
+ :echo getscriptinfo({'name': 'myscript'})
+ :echo getscriptinfo({'sid': 15}).variables
+<
+gettabinfo([{tabnr}]) *gettabinfo()*
+ If {tabnr} is not specified, then information about all the
+ tab pages is returned as a |List|. Each List item is a
+ |Dictionary|. Otherwise, {tabnr} 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 tab page.
+
+ Can also be used as a |method|: >
+ GetTabnr()->gettabinfo()
+
+gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()*
+ Get the value of a tab-local variable {varname} in tab page
+ {tabnr}. |t:var|
+ Tabs are numbered starting with one.
+ The {varname} argument is a string. When {varname} is empty a
+ dictionary with all tab-local variables is returned.
+ Note that the name without "t:" must be used.
+ When the tab or variable doesn't exist {def} or an empty
+ string is returned, there is no error message.
+
+ Can also be used as a |method|: >
+ GetTabnr()->gettabvar(varname)
+
+gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()*
+ Get the value of window-local variable {varname} in window
+ {winnr} in tab page {tabnr}.
+ The {varname} argument is a string. 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
+ or buffer-local variable.
+ When the tab, window or variable doesn't exist {def} or an
+ empty string is returned, there is no error message.
+ Examples: >
+ :let list_is_on = gettabwinvar(1, 2, '&list')
+ :echo "myvar = " .. gettabwinvar(3, 1, 'myvar')
+<
+ To obtain all window-local variables use: >
+ gettabwinvar({tabnr}, {winnr}, '&')
+
+< Can also be used as a |method|: >
+ GetTabnr()->gettabwinvar(winnr, varname)
+
+gettagstack([{winnr}]) *gettagstack()*
+ The result is a Dict, which is the tag stack of window {winnr}.
+ {winnr} can be the window number or the |window-ID|.
+ When {winnr} is not specified, the current window is used.
+ When window {winnr} doesn't exist, an empty Dict is returned.
+
+ The returned dictionary contains the following entries:
+ curidx Current index in the stack. When at
+ top of the stack, set to (length + 1).
+ Index of bottom of the stack is 1.
+ items List of items in the stack. Each item
+ is a dictionary containing the
+ entries described below.
+ length Number of entries in the stack.
+
+ Each item in the stack is a dictionary with the following
+ entries:
+ bufnr buffer number of the current jump
+ from cursor position before the tag jump.
+ See |getpos()| for the format of the
+ returned list.
+ matchnr current matching tag number. Used when
+ multiple matching tags are found for a
+ name.
+ tagname name of the tag
+
+ See |tagstack| for more information about the tag stack.
+
+ Can also be used as a |method|: >
+ GetWinnr()->gettagstack()
+
+
+gettext({text}) *gettext()*
+ Translate String {text} if possible.
+ This is mainly for use in the distributed Vim scripts. When
+ generating message translations the {text} is extracted by
+ xgettext, the translator can add the translated message in the
+ .po file and Vim will lookup the translation when gettext() is
+ called.
+ For {text} double quoted strings are preferred, because
+ xgettext does not understand escaping in single quoted
+ strings.
+
+
+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, as a |List| with one item. 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:
+ botline last complete displayed buffer line
+ bufnr number of buffer in the window
+ height window height (excluding winbar)
+ loclist 1 if showing a location list
+ {only with the +quickfix feature}
+ quickfix 1 if quickfix or location list window
+ {only with the +quickfix feature}
+ terminal 1 if a terminal window
+ {only with the +terminal feature}
+ tabnr tab page number
+ topline first displayed buffer line
+ 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;
+ "col" from |win_screenpos()|
+ textoff number of columns occupied by any
+ 'foldcolumn', 'signcolumn' and line
+ number in front of the text
+ winid |window-ID|
+ winnr window number
+ winrow topmost screen line of the window;
+ "row" from |win_screenpos()|
+
+ Can also be used as a |method|: >
+ GetWinnr()->getwininfo()
+
+getwinpos([{timeout}]) *getwinpos()*
+ The result is a |List| with two numbers, the result of
+ |getwinposx()| and |getwinposy()| combined:
+ [x-pos, y-pos]
+ {timeout} can be used to specify how long to wait in msec for
+ a response from the terminal. When omitted 100 msec is used.
+ Use a longer time for a remote terminal.
+ When using a value less than 10 and no response is received
+ within that time, a previously reported position is returned,
+ if available. This can be used to poll for the position and
+ do some work in the meantime: >
+ while 1
+ let res = getwinpos(1)
+ if res[0] >= 0
+ break
+ endif
+ " Do some work here
+ endwhile
+<
+
+ Can also be used as a |method|: >
+ GetTimeout()->getwinpos()
+<
+ *getwinposx()*
+getwinposx() The result is a Number, which is the X coordinate in pixels of
+ the left hand side of the GUI Vim window. Also works for an
+ xterm (uses a timeout of 100 msec).
+ 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. Also works for an xterm (uses
+ a timeout of 100 msec).
+ The result will be -1 if the information is not available.
+ The value can be used with `:winpos`.
+
+getwinvar({winnr}, {varname} [, {def}]) *getwinvar()*
+ Like |gettabwinvar()| for the current tabpage.
+ Examples: >
+ :let list_is_on = getwinvar(2, '&list')
+ :echo "myvar = " .. getwinvar(1, 'myvar')
+
+< Can also be used as a |method|: >
+ GetWinnr()->getwinvar(varname)
+<
+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 |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 |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, they are separated by <NL> characters.
+
+ If the expansion fails, the result is an empty String or List.
+
+ You can also use |readdir()| if you need to do complicated
+ things, such as limiting the number of matches.
+
+ 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
+ |TRUE| then all symbolic links are included.
+
+ For most systems backticks can be used to get files names from
+ any external command. Example: >
+ :let tagfiles = glob("`find . -name tags -print`")
+ :let &tags = substitute(tagfiles, "\n", ",", "g")
+< The result of the program inside the backticks should be one
+ item per line. Spaces inside an item are allowed.
+
+ See |expand()| for expanding special Vim variables. See
+ |system()| for getting the raw output of an external command.
+
+ Can also be used as a |method|: >
+ GetExpr()->glob()
+
+glob2regpat({string}) *glob2regpat()*
+ Convert a file pattern, as used by glob(), into a search
+ pattern. The result can be used to match with a string that
+ is a file name. E.g. >
+ if filename =~ glob2regpat('Make*.mak')
+< This is equivalent to: >
+ if filename =~ '^Make.*\.mak$'
+< When {string} 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 path separator.
+
+ Can also be used as a |method|: >
+ GetExpr()->glob2regpat()
+< *globpath()*
+globpath({path}, {expr} [, {nosuf} [, {list} [, {alllinks}]]])
+ Perform glob() for String {expr} on all directories in {path}
+ and concatenate the results. Example: >
+ :echo globpath(&rtp, "syntax/c.vim")
+<
+ {path} is a comma-separated list of directory names. Each
+ directory name is prepended to {expr} and expanded like with
+ |glob()|. A path separator is inserted when needed.
+ To add a comma inside a directory name escape it with a
+ backslash. Note that on MS-Windows a directory may have a
+ trailing backslash, remove it if you put a comma after it.
+ If the expansion fails for one of the directories, there is no
+ error message.
+
+ 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 |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,
+ they are separated by <NL> characters. Example: >
+ :echo globpath(&rtp, "syntax/c.vim", 0, 1)
+<
+ {alllinks} is used as with |glob()|.
+
+ The "**" item can be used to search in a directory tree.
+ For example, to find all "README.txt" files in the directories
+ in 'runtimepath' and below: >
+ :echo globpath(&rtp, "**/README.txt")
+< Upwards search and limiting the depth of "**" is not
+ supported, thus using 'path' will not always work properly.
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetExpr()->globpath(&rtp)
+<
+ *has()*
+has({feature} [, {check}])
+ When {check} is omitted or is zero: The result is a Number,
+ which is 1 if the feature {feature} is supported, zero
+ otherwise. The {feature} argument is a string, case is
+ ignored. See |feature-list| below.
+
+ When {check} is present and not zero: The result is a Number,
+ which is 1 if the feature {feature} could ever be supported,
+ zero otherwise. This is useful to check for a typo in
+ {feature} and to detect dead code. Keep in mind that an older
+ Vim version will not know about a feature added later and
+ features that have been abandoned will not be known by the
+ current Vim version.
+
+ Also see |exists()| and |exists_compiled()|.
+
+ Note that to skip code that has a syntax error when the
+ feature is not available, Vim may skip the rest of the line
+ and miss a following `endif`. Therefore put the `endif` on a
+ separate line: >
+ if has('feature')
+ let x = this->breaks->without->the->feature
+ endif
+< If the `endif` would be moved to the second line as "| endif" it
+ would not be found.
+
+
+has_key({dict}, {key}) *has_key()*
+ The result is a Number, which is TRUE if |Dictionary| {dict}
+ has an entry with key {key}. FALSE otherwise.
+ The {key} argument is a string. In |Vim9| script a number is
+ also accepted (and converted to a string) but no other types.
+ In legacy script the usual automatic conversion to string is
+ done.
+
+ Can also be used as a |method|: >
+ mydict->has_key(key)
+
+haslocaldir([{winnr} [, {tabnr}]]) *haslocaldir()*
+ The result is a Number:
+ 1 when the window has set a local directory via |:lcd|
+ 2 when the tab-page has set a local directory via |:tcd|
+ 0 otherwise.
+
+ Without arguments use the current window.
+ With {winnr} 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|.
+ If {winnr} is -1 it is ignored and only the tabpage is used.
+ Return 0 if the arguments are invalid.
+ Examples: >
+ if haslocaldir() == 1
+ " window local directory case
+ elseif haslocaldir() == 2
+ " tab-local directory case
+ else
+ " global directory case
+ endif
+
+ " current window
+ :echo haslocaldir()
+ :echo haslocaldir(0)
+ :echo haslocaldir(0, 0)
+ " window n in current tab page
+ :echo haslocaldir(n)
+ :echo haslocaldir(n, 0)
+ " window n in tab page m
+ :echo haslocaldir(n, m)
+ " tab page m
+ :echo haslocaldir(-1, m)
+<
+ Can also be used as a |method|: >
+ GetWinnr()->haslocaldir()
+
+hasmapto({what} [, {mode} [, {abbr}]]) *hasmapto()*
+ The result is a Number, which is TRUE 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}.
+ The arguments {what} and {mode} are strings.
+ 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
+ buffer are checked for a match.
+ If no matching mapping is found FALSE is returned.
+ The following characters are recognized in {mode}:
+ n Normal mode
+ v Visual and Select mode
+ x Visual mode
+ s Select mode
+ o Operator-pending mode
+ i Insert mode
+ l Language-Argument ("r", "f", "t", etc.)
+ c Command-line mode
+ When {mode} is omitted, "nvo" is used.
+
+ This function is useful to check if a mapping already exists
+ to a function in a Vim script. Example: >
+ :if !hasmapto('\ABCdoit')
+ : map <Leader>d \ABCdoit
+ :endif
+< This installs the mapping to "\ABCdoit" only if there isn't
+ already a mapping to "\ABCdoit".
+
+ Can also be used as a |method|: >
+ GetRHS()->hasmapto()
+
+histadd({history}, {item}) *histadd()*
+ Add the String {item} to the history {history} which can be
+ one of: *hist-names*
+ "cmd" or ":" command line history
+ "search" or "/" search pattern history
+ "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
+ shifted to become the newest entry.
+ The result is a Number: TRUE if the operation was successful,
+ otherwise FALSE is returned.
+
+ Example: >
+ :call histadd("input", strftime("%Y %b %d"))
+ :let date=input("Enter date: ")
+< This function is not available in the |sandbox|.
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetHistory()->histadd('search')
+
+histdel({history} [, {item}]) *histdel()*
+ Clear {history}, i.e. delete all its entries. See |hist-names|
+ for the possible values of {history}.
+
+ If the parameter {item} evaluates to a String, it is used as a
+ regular expression. All entries matching that expression will
+ be removed from the history (if there are any).
+ Upper/lowercase must match, unless "\c" is used |/\c|.
+ If {item} evaluates to a Number, it will be interpreted as
+ an index, see |:history-indexing|. The respective entry will
+ be removed if it exists.
+
+ The result is TRUE for a successful operation, otherwise FALSE
+ is returned.
+
+ Examples:
+ Clear expression register history: >
+ :call histdel("expr")
+<
+ Remove all entries starting with "*" from the search history: >
+ :call histdel("/", '^\*')
+<
+ The following three are equivalent: >
+ :call histdel("search", histnr("search"))
+ :call histdel("search", -1)
+ :call histdel("search", '^' .. histget("search", -1) .. '$')
+<
+ To delete the last search pattern and use the last-but-one for
+ the "n" command and 'hlsearch': >
+ :call histdel("search", -1)
+ :let @/ = histget("search", -1)
+<
+ Can also be used as a |method|: >
+ GetHistory()->histdel()
+
+histget({history} [, {index}]) *histget()*
+ The result is a String, the entry with Number {index} from
+ {history}. See |hist-names| for the possible values of
+ {history}, and |:history-indexing| for {index}. If there is
+ no such entry, an empty String is returned. When {index} is
+ omitted, the most recent item from the history is used.
+
+ Examples:
+ Redo the second last search from history. >
+ :execute '/' .. histget("search", -2)
+
+< Define an Ex command ":H {num}" that supports re-execution of
+ the {num}th entry from the output of |:history|. >
+ :command -nargs=1 H execute histget("cmd", 0+<args>)
+<
+ Can also be used as a |method|: >
+ GetHistory()->histget()
+
+histnr({history}) *histnr()*
+ The result is the Number of the current entry in {history}.
+ See |hist-names| for the possible values of {history}.
+ If an error occurred, -1 is returned.
+
+ Example: >
+ :let inp_index = histnr("expr")
+
+< Can also be used as a |method|: >
+ GetHistory()->histnr()
+<
+hlexists({name}) *hlexists()*
+ The result is a Number, which is TRUE if a highlight group
+ called {name} exists. This is when the group has been
+ 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().
+
+ Can also be used as a |method|: >
+ GetName()->hlexists()
+<
+hlget([{name} [, {resolve}]]) *hlget()*
+ Returns a List of all the highlight group attributes. If the
+ optional {name} is specified, then returns a List with only
+ the attributes of the specified highlight group. Returns an
+ empty List if the highlight group {name} is not present.
+
+ If the optional {resolve} argument is set to v:true and the
+ highlight group {name} is linked to another group, then the
+ link is resolved recursively and the attributes of the
+ resolved highlight group are returned.
+
+ Each entry in the returned List is a Dictionary with the
+ following items:
+ cleared boolean flag, set to v:true if the highlight
+ group attributes are cleared or not yet
+ specified. See |highlight-clear|.
+ cterm cterm attributes. See |highlight-cterm|.
+ ctermbg cterm background color.
+ See |highlight-ctermbg|.
+ ctermfg cterm foreground color.
+ See |highlight-ctermfg|.
+ ctermul cterm underline color. See |highlight-ctermul|.
+ default boolean flag, set to v:true if the highlight
+ group link is a default link. See
+ |highlight-default|.
+ font highlight group font. See |highlight-font|.
+ gui gui attributes. See |highlight-gui|.
+ guibg gui background color. See |highlight-guibg|.
+ guifg gui foreground color. See |highlight-guifg|.
+ guisp gui special color. See |highlight-guisp|.
+ id highlight group ID.
+ linksto linked highlight group name.
+ See |:highlight-link|.
+ name highlight group name. See |group-name|.
+ start start terminal keycode. See |highlight-start|.
+ stop stop terminal keycode. See |highlight-stop|.
+ term term attributes. See |highlight-term|.
+
+ The 'term', 'cterm' and 'gui' items in the above Dictionary
+ have a dictionary value with the following optional boolean
+ items: 'bold', 'standout', 'underline', 'undercurl', 'italic',
+ 'reverse', 'inverse' and 'strikethrough'.
+
+ Example(s): >
+ :echo hlget()
+ :echo hlget('ModeMsg')
+ :echo hlget('Number', v:true)
+<
+ Can also be used as a |method|: >
+ GetName()->hlget()
+<
+hlset({list}) *hlset()*
+ Creates or modifies the attributes of a List of highlight
+ groups. Each item in {list} is a dictionary containing the
+ attributes of a highlight group. See |hlget()| for the list of
+ supported items in this dictionary.
+
+ In addition to the items described in |hlget()|, the following
+ additional items are supported in the dictionary:
+
+ force boolean flag to force the creation of
+ a link for an existing highlight group
+ with attributes.
+
+ The highlight group is identified using the 'name' item and
+ the 'id' item (if supplied) is ignored. If a highlight group
+ with a specified name doesn't exist, then it is created.
+ Otherwise the attributes of an existing highlight group are
+ modified.
+
+ If an empty dictionary value is used for the 'term' or 'cterm'
+ or 'gui' entries, then the corresponding attributes are
+ cleared. If the 'cleared' item is set to v:true, then all the
+ attributes of the highlight group are cleared.
+
+ The 'linksto' item can be used to link a highlight group to
+ another highlight group. See |:highlight-link|.
+
+ Returns zero for success, -1 for failure.
+
+ Example(s): >
+ " add bold attribute to the Visual highlight group
+ :call hlset([#{name: 'Visual',
+ \ term: #{reverse: 1 , bold: 1}}])
+ :call hlset([#{name: 'Type', guifg: 'DarkGreen'}])
+ :let l = hlget()
+ :call hlset(l)
+ " clear the Search highlight group
+ :call hlset([#{name: 'Search', cleared: v:true}])
+ " clear the 'term' attributes for a highlight group
+ :call hlset([#{name: 'Title', term: {}}])
+ " create the MyHlg group linking it to DiffAdd
+ :call hlset([#{name: 'MyHlg', linksto: 'DiffAdd'}])
+ " remove the MyHlg group link
+ :call hlset([#{name: 'MyHlg', linksto: 'NONE'}])
+ " clear the attributes and a link
+ :call hlset([#{name: 'MyHlg', cleared: v:true,
+ \ linksto: 'NONE'}])
+<
+ Can also be used as a |method|: >
+ GetAttrList()->hlset()
+<
+ *hlID()*
+hlID({name}) The result is a Number, which is the ID of the highlight group
+ with name {name}. When the highlight group doesn't exist,
+ zero is returned.
+ This can be used to retrieve information about the highlight
+ group. For example, to get the background color of the
+ "Comment" group: >
+ :echo synIDattr(synIDtrans(hlID("Comment")), "bg")
+< *highlightID()*
+ Obsolete name: highlightID().
+
+ Can also be used as a |method|: >
+ GetName()->hlID()
+
+hostname() *hostname()*
+ The result is a String, which is the name of the machine on
+ which Vim is currently running. Machine names greater than
+ 256 characters long are truncated.
+
+iconv({string}, {from}, {to}) *iconv()*
+ The result is a String, which is the text {string} converted
+ from encoding {from} to encoding {to}.
+ When the conversion completely fails an empty string is
+ returned. When some characters could not be converted they
+ are replaced with "?".
+ The encoding names are whatever the iconv() library function
+ can accept, see ":!man 3 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
+ 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.
+
+ Can also be used as a |method|: >
+ GetText()->iconv('latin1', 'utf-8')
+<
+ *indent()*
+indent({lnum}) The result is a Number, which is indent of line {lnum} in the
+ current buffer. The indent is counted in spaces, the value
+ of 'tabstop' is relevant. {lnum} is used just like in
+ |getline()|.
+ When {lnum} is invalid -1 is returned. In |Vim9| script an
+ error is given.
+
+ Can also be used as a |method|: >
+ GetLnum()->indent()
+
+index({object}, {expr} [, {start} [, {ic}]]) *index()*
+ Find {expr} in {object} and return its index. See
+ |indexof()| for using a lambda to select the item.
+
+ If {object} is a |List| return the lowest index where the item
+ has a value equal to {expr}. There is no automatic
+ conversion, so the String "4" is different from the Number 4.
+ And the number 4 is different from the Float 4.0. The value
+ of 'ignorecase' is not used here, case matters as indicated by
+ the {ic} argument.
+
+ If {object} is |Blob| return the lowest index where the byte
+ value is equal to {expr}.
+
+ 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 |TRUE|, ignore case. Otherwise
+ case must match.
+
+ -1 is returned when {expr} is not found in {object}.
+ Example: >
+ :let idx = index(words, "the")
+ :if index(numbers, 123) >= 0
+
+< Can also be used as a |method|: >
+ GetObject()->index(what)
+
+indexof({object}, {expr} [, {opts}]) *indexof()*
+ Returns the index of an item in {object} where {expr} is
+ v:true. {object} must be a |List| or a |Blob|.
+
+ If {object} is a |List|, evaluate {expr} for each item in the
+ List until the expression is v:true and return the index of
+ this item.
+
+ If {object} is a |Blob| evaluate {expr} for each byte in the
+ Blob until the expression is v:true and return the index of
+ this byte.
+
+ {expr} must be a |string| or |Funcref|.
+
+ If {expr} is a |string|: If {object} is a |List|, inside
+ {expr} |v:key| has the index of the current List item and
+ |v:val| has the value of the item. If {object} is a |Blob|,
+ inside {expr} |v:key| has the index of the current byte and
+ |v:val| has the byte value.
+
+ If {expr} 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 is found and the
+ search should stop.
+
+ The optional argument {opts} is a Dict and supports the
+ following items:
+ startidx start evaluating {expr} at the item with this
+ index; may be negative for an item relative to
+ the end
+ Returns -1 when {expr} evaluates to v:false for all the items.
+ Example: >
+ :let l = [#{n: 10}, #{n: 20}, #{n: 30}]
+ :echo indexof(l, "v:val.n == 20")
+ :echo indexof(l, {i, v -> v.n == 30})
+ :echo indexof(l, "v:val.n == 20", #{startidx: 1})
+
+< Can also be used as a |method|: >
+ mylist->indexof(expr)
+
+input({prompt} [, {text} [, {completion}]]) *input()*
+ 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.
+ 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
+ for lines typed for input().
+ Example: >
+ :if input("Coffee or beer? ") == "beer"
+ : echo "Cheers!"
+ :endif
+<
+ If the optional {text} argument is present and not empty, this
+ is used for the default reply, as if the user typed this.
+ Example: >
+ :let color = input("Color? ", "white")
+
+< The optional {completion} argument specifies the type of
+ completion supported for the input. Without it completion is
+ not performed. The supported completion types are the same as
+ that can be supplied to a user-defined command using the
+ "-complete=" argument. Refer to |:command-completion| for
+ more information. Example: >
+ let fname = input("File: ", "", "file")
+<
+ 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
+ consume remaining characters from that mapping, because a
+ mapping is handled like the characters were typed.
+ Use |inputsave()| before input() and |inputrestore()|
+ after input() to avoid that. Another solution is to avoid
+ that further characters follow in the mapping, e.g., by using
+ |:execute| or |:normal|.
+
+ Example with a mapping: >
+ :nmap \x :call GetFoo()<CR>:exe "/" .. Foo<CR>
+ :function GetFoo()
+ : call inputsave()
+ : let g:Foo = input("enter search pattern: ")
+ : call inputrestore()
+ :endfunction
+
+< Can also be used as a |method|: >
+ GetPrompt()->input()
+
+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.
+
+ Can also be used as a |method|: >
+ GetPrompt()->inputdialog()
+
+inputlist({textlist}) *inputlist()*
+ {textlist} must be a |List| of strings. This |List| is
+ displayed, one string per line. The user will be prompted to
+ enter a number, which is returned.
+ The user can also select an item by clicking on it with the
+ mouse, if the mouse is enabled in the command line ('mouse' is
+ "a" or includes "c"). For the first string 0 is returned.
+ When clicking above the first item a negative number is
+ returned. When clicking on the prompt one more than the
+ length of {textlist} is returned.
+ Make sure {textlist} has less than 'lines' entries, otherwise
+ it won't work. It's a good idea to put the entry number at
+ the start of the string. And put a prompt in the first item.
+ Example: >
+ let color = inputlist(['Select color:', '1. red',
+ \ '2. green', '3. blue'])
+
+< Can also be used as a |method|: >
+ GetChoices()->inputlist()
+
+inputrestore() *inputrestore()*
+ Restore typeahead that was saved with a previous |inputsave()|.
+ Should be called the same number of times inputsave() is
+ called. Calling it more often is harmless though.
+ Returns TRUE when there is nothing to restore, FALSE otherwise.
+
+inputsave() *inputsave()*
+ Preserve typeahead (also from mappings) and clear it, so that
+ a following prompt gets input from the user. Should be
+ followed by a matching inputrestore() after the prompt. Can
+ be used several times, in which case there must be just as
+ many inputrestore() calls.
+ Returns TRUE when out of memory, FALSE otherwise.
+
+inputsecret({prompt} [, {text}]) *inputsecret()*
+ This function acts much like the |input()| function with but
+ two exceptions:
+ a) the user's response will be displayed as a sequence of
+ asterisks ("*") thereby keeping the entry secret, and
+ b) the user's response will not be recorded on the input
+ |history| stack.
+ The result is a String, which is whatever the user actually
+ typed on the command-line in response to the issued prompt.
+ NOTE: Command-line completion is not supported.
+
+ Can also be used as a |method|: >
+ GetPrompt()->inputsecret()
+
+insert({object}, {item} [, {idx}]) *insert()*
+ When {object} is a |List| or a |Blob| insert {item} at the start
+ of it.
+
+ If {idx} is specified insert {item} before the item with index
+ {idx}. If {idx} is zero it goes before the first item, just
+ like omitting {idx}. A negative {idx} is also possible, see
+ |list-index|. -1 inserts just before the last item.
+
+ Returns the resulting |List| or |Blob|. Examples: >
+ :let mylist = insert([2, 3, 5], 1)
+ :call insert(mylist, 4, -1)
+ :call insert(mylist, 6, len(mylist))
+< The last example can be done simpler with |add()|.
+ Note that when {item} is a |List| it is inserted as a single
+ item. Use |extend()| to concatenate |Lists|.
+
+ Can also be used as a |method|: >
+ mylist->insert(item)
+
+interrupt() *interrupt()*
+ Interrupt script execution. It works more or less like the
+ user typing CTRL-C, most commands won't execute and control
+ returns to the user. This is useful to abort execution
+ from lower down, e.g. in an autocommand. Example: >
+ :function s:check_typoname(file)
+ : if fnamemodify(a:file, ':t') == '['
+ : echomsg 'Maybe typo'
+ : call interrupt()
+ : endif
+ :endfunction
+ :au BufWritePre * call s:check_typoname(expand('<amatch>'))
+
+invert({expr}) *invert()*
+ Bitwise invert. The argument is converted to a number. A
+ List, Dict or Float argument causes an error. Example: >
+ :let bits = invert(bits)
+< Can also be used as a |method|: >
+ :let bits = bits->invert()
+
+isabsolutepath({path}) *isabsolutepath()*
+ The result is a Number, which is |TRUE| when {path} is an
+ absolute path.
+ On Unix, a path is considered absolute when it starts with '/'.
+ On MS-Windows, it is considered absolute when it starts with an
+ optional drive prefix and is followed by a '\' or '/'. UNC paths
+ are always absolute.
+ Example: >
+ echo isabsolutepath('/usr/share/') " 1
+ echo isabsolutepath('./foobar') " 0
+ echo isabsolutepath('C:\Windows') " 1
+ echo isabsolutepath('foobar') " 0
+ echo isabsolutepath('\\remote\file') " 1
+<
+ Can also be used as a |method|: >
+ GetName()->isabsolutepath()
+
+
+isdirectory({directory}) *isdirectory()*
+ 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}
+ is any expression, which is used as a String.
+
+ Can also be used as a |method|: >
+ GetName()->isdirectory()
+
+isinf({expr}) *isinf()*
+ Return 1 if {expr} is a positive infinity, or -1 a negative
+ infinity, otherwise 0. >
+ :echo isinf(1.0 / 0.0)
+< 1 >
+ :echo isinf(-1.0 / 0.0)
+< -1
+
+ Can also be used as a |method|: >
+ Compute()->isinf()
+
+islocked({expr}) *islocked()* *E786*
+ The result is a Number, which is |TRUE| when {expr} is the
+ name of a locked variable.
+ The string argument {expr} must be the name of a variable,
+ |List| item or |Dictionary| entry, not the variable itself!
+ Example: >
+ :let alist = [0, ['a', 'b'], 2, 3]
+ :lockvar 1 alist
+ :echo islocked('alist') " 1
+ :echo islocked('alist[1]') " 0
+
+< When {expr} is a variable that does not exist -1 is returned.
+ If {expr} uses a range, list or dict index that is out of
+ range or does not exist you get an error message. Use
+ |exists()| to check for existence.
+ In Vim9 script it does not work for local function variables.
+
+ Can also be used as a |method|: >
+ GetName()->islocked()
+
+isnan({expr}) *isnan()*
+ Return |TRUE| if {expr} is a float with value NaN. >
+ echo isnan(0.0 / 0.0)
+< 1
+
+ Can also be used as a |method|: >
+ Compute()->isnan()
+
+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. Also see |keys()| and |values()|.
+ Example: >
+ for [key, value] in items(mydict)
+ echo key .. ': ' .. value
+ endfor
+
+< Can also be used as a |method|: >
+ mydict->items()
+
+job_ functions are documented here: |job-functions-details|
+
+
+join({list} [, {sep}]) *join()*
+ Join the items in {list} together into one String.
+ When {sep} is specified it is put in between the items. If
+ {sep} is omitted a single space is used.
+ Note that {sep} is not added at the end. You might want to
+ add it there too: >
+ let lines = join(mylist, "\n") .. "\n"
+< String items are used as-is. |Lists| and |Dictionaries| are
+ converted into a string like with |string()|.
+ The opposite function is |split()|.
+
+ Can also be used as a |method|: >
+ mylist->join()
+
+js_decode({string}) *js_decode()*
+ This is similar to |json_decode()| with these differences:
+ - Object key names do not have to be in quotes.
+ - Strings can be in single quotes.
+ - Empty items in an array (between two commas) are allowed and
+ result in v:none items.
+
+ Can also be used as a |method|: >
+ ReadObject()->js_decode()
+
+js_encode({expr}) *js_encode()*
+ This is similar to |json_encode()| with these differences:
+ - Object key names are not in quotes.
+ - v:none items in an array result in an empty item between
+ commas.
+ For example, the Vim object:
+ [1,v:none,{"one":1},v:none] ~
+ Will be encoded as:
+ [1,,{one:1},,] ~
+ While json_encode() would produce:
+ [1,null,{"one":1},null] ~
+ This encoding is valid for JavaScript. It is more efficient
+ than JSON, especially when using an array with optional items.
+
+ Can also be used as a |method|: >
+ GetObject()->js_encode()
+
+json_decode({string}) *json_decode()* *E491*
+ This parses a JSON formatted string and returns the equivalent
+ in Vim values. See |json_encode()| for the relation between
+ JSON and Vim values.
+ The decoding is permissive:
+ - A trailing comma in an array and object is ignored, e.g.
+ "[1, 2, ]" is the same as "[1, 2]".
+ - Integer keys are accepted in objects, e.g. {1:2} is the
+ same as {"1":2}.
+ - More floating point numbers are recognized, e.g. "1." for
+ "1.0", or "001.2" for "1.2". Special floating point values
+ "Infinity", "-Infinity" and "NaN" (capitalization ignored)
+ are accepted.
+ - Leading zeroes in integer numbers are ignored, e.g. "012"
+ for "12" or "-012" for "-12".
+ - Capitalization is ignored in literal names null, true or
+ false, e.g. "NULL" for "null", "True" for "true".
+ - Control characters U+0000 through U+001F which are not
+ escaped in strings are accepted, e.g. " " (tab
+ character in string) for "\t".
+ - An empty JSON expression or made of only spaces is accepted
+ and results in v:none.
+ - Backslash in an invalid 2-character sequence escape is
+ ignored, e.g. "\a" is decoded as "a".
+ - A correct surrogate pair in JSON strings should normally be
+ a 12 character sequence such as "\uD834\uDD1E", but
+ json_decode() silently accepts truncated surrogate pairs
+ such as "\uD834" or "\uD834\u"
+ *E938*
+ A duplicate key in an object, valid in rfc7159, is not
+ accepted by json_decode() as the result must be a valid Vim
+ type, e.g. this fails: {"a":"b", "a":"c"}
+
+ Can also be used as a |method|: >
+ ReadObject()->json_decode()
+
+json_encode({expr}) *json_encode()*
+ Encode {expr} as JSON and return this as a string.
+ The encoding is specified in:
+ https://tools.ietf.org/html/rfc7159.html
+ Vim values are converted as follows: *E1161*
+ |Number| decimal number
+ |Float| floating point number
+ Float nan "NaN"
+ Float inf "Infinity"
+ Float -inf "-Infinity"
+ |String| in double quotes (possibly null)
+ |Funcref| not possible, error
+ |List| as an array (possibly null); when
+ used recursively: []
+ |Dict| as an object (possibly null); when
+ used recursively: {}
+ |Blob| as an array of the individual bytes
+ v:false "false"
+ v:true "true"
+ v:none "null"
+ v:null "null"
+ Note that NaN and Infinity are passed on as values. This is
+ missing in the JSON standard, but several implementations do
+ allow it. If not then you will get an error.
+ If a string contains an illegal character then the replacement
+ character 0xfffd is used.
+
+ Can also be used as a |method|: >
+ GetObject()->json_encode()
+
+keys({dict}) *keys()*
+ Return a |List| with all the keys of {dict}. The |List| is in
+ arbitrary order. Also see |items()| and |values()|.
+
+ Can also be used as a |method|: >
+ mydict->keys()
+
+keytrans({string}) *keytrans()*
+ Turn the internal byte representation of keys into a form that
+ can be used for |:map|. E.g. >
+ :let xx = "\<C-Home>"
+ :echo keytrans(xx)
+< <C-Home>
+
+ Can also be used as a |method|: >
+ "\<C-Home>"->keytrans()
+
+< *len()* *E701*
+len({expr}) The result is a Number, which is the length of the argument.
+ When {expr} is a String or a Number the length in bytes is
+ used, as with |strlen()|.
+ When {expr} is a |List| the number of items in the |List| is
+ returned.
+ When {expr} is a |Blob| the number of bytes is returned.
+ When {expr} is a |Dictionary| the number of entries in the
+ |Dictionary| is returned.
+ Otherwise an error is given and returns zero.
+
+ Can also be used as a |method|: >
+ mylist->len()
+
+< *libcall()* *E364* *E368*
+libcall({libname}, {funcname}, {argument})
+ Call function {funcname} in the run-time library {libname}
+ with single argument {argument}.
+ This is useful to call functions in a library that you
+ especially made to be used with Vim. Since only one argument
+ is possible, calling standard library functions is rather
+ limited.
+ The result is the String returned by the function. If the
+ function returns NULL, this will appear as an empty string ""
+ to Vim.
+ If the function returns a number, use libcallnr()!
+ If {argument} is a number, it is passed to the function as an
+ int; if {argument} is a string, it is passed as a
+ null-terminated string.
+ This function will fail in |restricted-mode|.
+
+ libcall() allows you to write your own 'plug-in' extensions to
+ Vim without having to recompile the program. It is NOT a
+ means to call system functions! If you try to do so Vim will
+ very probably crash.
+
+ For Win32, the functions you write must be placed in a DLL
+ and use the normal C calling convention (NOT Pascal which is
+ used in Windows System DLLs). The function must take exactly
+ one parameter, either a character pointer or a long integer,
+ and must return a character pointer or NULL. The character
+ pointer returned must point to memory that will remain valid
+ after the function has returned (e.g. in static data in the
+ DLL). If it points to allocated memory, that memory will
+ leak away. Using a static buffer in the function should work,
+ it's then freed when the DLL is unloaded.
+
+ WARNING: If the function returns a non-valid pointer, Vim may
+ crash! This also happens if the function returns a number,
+ because Vim thinks it's a pointer.
+ For Win32 systems, {libname} should be the filename of the DLL
+ without the ".DLL" suffix. A full path is only required if
+ the DLL is not in the usual places.
+ For Unix: When compiling your own plugins, remember that the
+ object code must be compiled as position-independent ('PIC').
+ {only in Win32 and some Unix versions, when the |+libcall|
+ feature is present}
+ Examples: >
+ :echo libcall("libc.so", "getenv", "HOME")
+
+< Can also be used as a |method|, the base is passed as the
+ third argument: >
+ GetValue()->libcall("libc.so", "getenv")
+<
+ *libcallnr()*
+libcallnr({libname}, {funcname}, {argument})
+ Just like |libcall()|, but used for a function that returns an
+ int instead of a string.
+ {only in Win32 on some Unix versions, when the |+libcall|
+ feature is present}
+ Examples: >
+ :echo libcallnr("/usr/lib/libc.so", "getpid", "")
+ :call libcallnr("libc.so", "printf", "Hello World!\n")
+ :call libcallnr("libc.so", "sleep", 10)
+<
+ Can also be used as a |method|, the base is passed as the
+ third argument: >
+ GetValue()->libcallnr("libc.so", "printf")
+<
+
+line({expr} [, {winid}]) *line()*
+ The result is a Number, which is the line number of the file
+ position given with {expr}. The {expr} argument is a string.
+ The accepted positions are: *E1209*
+ . the cursor position
+ $ 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 (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
+ that it's updated right away.
+ Note that a mark in another file can be used. The line number
+ then applies to another buffer.
+ To get the column number use |col()|. To get both use
+ |getpos()|.
+ With the optional {winid} argument the values are obtained for
+ that window instead of the current window.
+ Returns 0 for invalid values of {expr} and {winid}.
+ Examples: >
+ line(".") line number of the cursor
+ line(".", winid) idem, in window "winid"
+ line("'t") line number of mark t
+ line("'" .. marker) line number of mark marker
+<
+ To jump to the last known position when opening a file see
+ |last-position-jump|.
+
+ Can also be used as a |method|: >
+ GetValue()->line()
+
+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: >
+ line2byte(line("$") + 1)
+< This is the buffer size plus one. If 'fileencoding' is empty
+ it is the file size plus one. {lnum} is used like with
+ |getline()|. When {lnum} is invalid, or the |+byte_offset|
+ feature has been disabled at compile time, -1 is returned.
+ Also see |byte2line()|, |go| and |:goto|.
+
+ Can also be used as a |method|: >
+ GetLnum()->line2byte()
+
+lispindent({lnum}) *lispindent()*
+ Get the amount of indent for line {lnum} according the lisp
+ indenting rules, as with 'lisp'.
+ The indent is counted in spaces, the value of 'tabstop' is
+ relevant. {lnum} is used just like in |getline()|.
+ When {lnum} is invalid -1 is returned. In |Vim9| script an
+ error is given.
+
+ Can also be used as a |method|: >
+ GetLnum()->lispindent()
+
+list2blob({list}) *list2blob()*
+ Return a Blob concatenating all the number values in {list}.
+ Examples: >
+ list2blob([1, 2, 3, 4]) returns 0z01020304
+ list2blob([]) returns 0z
+< Returns an empty Blob on error. If one of the numbers is
+ negative or more than 255 error *E1239* is given.
+
+ |blob2list()| does the opposite.
+
+ Can also be used as a |method|: >
+ GetList()->list2blob()
+
+list2str({list} [, {utf8}]) *list2str()*
+ Convert each number in {list} to a character string can
+ concatenate them all. Examples: >
+ list2str([32]) returns " "
+ list2str([65, 66, 67]) returns "ABC"
+< The same can be done (slowly) with: >
+ join(map(list, {nr, val -> nr2char(val)}), '')
+< |str2list()| does the opposite.
+
+ When {utf8} is omitted or zero, the current 'encoding' is used.
+ When {utf8} is TRUE, always return UTF-8 characters.
+ With UTF-8 composing characters work as expected: >
+ list2str([97, 769]) returns "á"
+<
+ Returns an empty string on error.
+
+ Can also be used as a |method|: >
+ GetList()->list2str()
+
+listener_add({callback} [, {buf}]) *listener_add()*
+ Add a callback function that will be invoked when changes have
+ been made to buffer {buf}.
+ {buf} refers to a buffer name or number. For the accepted
+ values, see |bufname()|. When {buf} is omitted the current
+ buffer is used.
+ Returns a unique ID that can be passed to |listener_remove()|.
+
+ The {callback} is invoked with five arguments:
+ bufnr the buffer that was changed
+ start first changed line number
+ end first line number below the change
+ added number of lines added, negative if lines were
+ deleted
+ changes a List of items with details about the changes
+
+ Example: >
+ func Listener(bufnr, start, end, added, changes)
+ echo 'lines ' .. a:start .. ' until ' .. a:end .. ' changed'
+ endfunc
+ call listener_add('Listener', bufnr)
+
+< The List cannot be changed. Each item in "changes" is a
+ dictionary with these entries:
+ lnum the first line number of the change
+ end the first line below the change
+ added number of lines added; negative if lines were
+ deleted
+ col first column in "lnum" that was affected by
+ the change; one if unknown or the whole line
+ was affected; this is a byte index, first
+ character has a value of one.
+ When lines are inserted (not when a line is split, e.g. by
+ typing CR in Insert mode) the values are:
+ lnum line above which the new line is added
+ end equal to "lnum"
+ added number of lines inserted
+ col 1
+ When lines are deleted the values are:
+ lnum the first deleted line
+ end the line below the first deleted line, before
+ the deletion was done
+ added negative, number of lines deleted
+ col 1
+ When lines are changed:
+ lnum the first changed line
+ end the line below the last changed line
+ added 0
+ col first column with a change or 1
+
+ The entries are in the order the changes were made, thus the
+ most recent change is at the end. The line numbers are valid
+ when the callback is invoked, but later changes may make them
+ invalid, thus keeping a copy for later might not work.
+
+ The {callback} is invoked just before the screen is updated,
+ when |listener_flush()| is called or when a change is being
+ made that changes the line count in a way it causes a line
+ number in the list of changes to become invalid.
+
+ The {callback} is invoked with the text locked, see
+ |textlock|. If you do need to make changes to the buffer, use
+ a timer to do this later |timer_start()|.
+
+ The {callback} is not invoked when the buffer is first loaded.
+ Use the |BufReadPost| autocmd event to handle the initial text
+ of a buffer.
+ The {callback} is also not invoked when the buffer is
+ unloaded, use the |BufUnload| autocmd event for that.
+
+ Returns zero if {callback} or {buf} is invalid.
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetBuffer()->listener_add(callback)
+
+listener_flush([{buf}]) *listener_flush()*
+ Invoke listener callbacks for buffer {buf}. If there are no
+ pending changes then no callbacks are invoked.
+
+ {buf} refers to a buffer name or number. For the accepted
+ values, see |bufname()|. When {buf} is omitted the current
+ buffer is used.
+
+ Can also be used as a |method|: >
+ GetBuffer()->listener_flush()
+
+listener_remove({id}) *listener_remove()*
+ Remove a listener previously added with listener_add().
+ Returns FALSE when {id} could not be found, TRUE when {id} was
+ removed.
+
+ Can also be used as a |method|: >
+ GetListenerId()->listener_remove()
+
+localtime() *localtime()*
+ Return the current time, measured as seconds since 1st Jan
+ 1970. See also |strftime()|, |strptime()| and |getftime()|.
+
+
+log({expr}) *log()*
+ Return the natural logarithm (base e) of {expr} as a |Float|.
+ {expr} must evaluate to a |Float| or a |Number| in the range
+ (0, inf].
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo log(10)
+< 2.302585 >
+ :echo log(exp(5))
+< 5.0
+
+ Can also be used as a |method|: >
+ Compute()->log()
+
+
+log10({expr}) *log10()*
+ Return the logarithm of Float {expr} to base 10 as a |Float|.
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo log10(1000)
+< 3.0 >
+ :echo log10(0.01)
+< -2.0
+
+ Can also be used as a |method|: >
+ Compute()->log10()
+
+luaeval({expr} [, {expr}]) *luaeval()*
+ Evaluate Lua expression {expr} and return its result converted
+ to Vim data structures. Second {expr} may hold additional
+ argument accessible as _A inside first {expr}.
+ Strings are returned as they are.
+ Boolean objects are converted to numbers.
+ Numbers are converted to |Float| values.
+ Dictionaries and lists obtained by vim.eval() are returned
+ as-is.
+ Other objects are returned as zero without any errors.
+ See |lua-luaeval| for more details.
+ Note that in a `:def` function local variables are not visible
+ to {expr}.
+
+ Can also be used as a |method|: >
+ GetExpr()->luaeval()
+
+< {only available when compiled with the |+lua| feature}
+
+map({expr1}, {expr2}) *map()*
+ {expr1} must be a |List|, |String|, |Blob| or |Dictionary|.
+ When {expr1} is a |List| or |Dictionary|, replace each
+ item in {expr1} with the result of evaluating {expr2}.
+ For a |Blob| each byte is replaced.
+ For a |String|, each character, including composing
+ characters, is replaced.
+ If the item type changes you may want to use |mapnew()| to
+ create a new List or Dictionary. This is required when using
+ Vim9 script.
+
+ {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 |Blob| |v:key| has the index of the
+ current byte. For a |String| |v:key| has the index of the
+ current character.
+ Example: >
+ :call map(mylist, '"> " .. v:val .. " <"')
+< This puts "> " before and " <" after each item in "mylist".
+
+ 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.
+ With a legacy script lambda you don't get an error if it only
+ accepts one argument, but with a Vim9 lambda you get "E1106:
+ One argument too many", the number of arguments must match.
+
+ 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})
+< If you do not use "key" you can use a short name: >
+ call map(myDict, {_, val -> 'item: ' .. val})
+<
+ The operation is done in-place for a |List| and |Dictionary|.
+ If you want it to remain unmodified make a copy first: >
+ :let tlist = map(copy(mylist), ' v:val .. "\t"')
+
+< Returns {expr1}, the |List| or |Dictionary| that was filtered,
+ or a new |Blob| or |String|.
+ 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.
+
+ Can also be used as a |method|: >
+ mylist->map(expr2)
+
+
+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 {dict} is TRUE a dictionary is returned, see
+ below. To get a list of all mappings see |maplist()|.
+
+ When there is no mapping for {name}, an empty String is
+ returned if {dict} is FALSE, otherwise returns an empty Dict.
+ When the mapping for {name} is empty, then "<Nop>" is
+ returned.
+
+ The {name} can have special key names, like in the ":map"
+ command.
+
+ {mode} can be one of these strings:
+ "n" Normal
+ "v" Visual (including Select)
+ "o" Operator-pending
+ "i" Insert
+ "c" Cmd-line
+ "s" Select
+ "x" Visual
+ "l" langmap |language-mapping|
+ "t" Terminal-Job
+ "" Normal, Visual and Operator-pending
+ When {mode} is omitted, the modes for "" are used.
+
+ When {abbr} is there and it is |TRUE| use abbreviations
+ instead of mappings.
+
+ When {dict} is there and it is |TRUE| return a dictionary
+ containing all the information of the mapping with the
+ following items: *mapping-dict*
+ "lhs" The {lhs} of the mapping as it would be typed
+ "lhsraw" The {lhs} of the mapping as raw bytes
+ "lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
+ form, only present when it differs from "lhsraw"
+ "rhs" The {rhs} of the mapping as typed.
+ "silent" 1 for a |:map-silent| mapping, else 0.
+ "noremap" 1 if the {rhs} of the mapping is not remappable.
+ "script" 1 if mapping was defined with <script>.
+ "expr" 1 for an expression mapping (|:map-<expr>|).
+ "buffer" 1 for a buffer local mapping (|:map-local|).
+ "mode" Modes for which the mapping is defined. In
+ addition to the modes mentioned above, these
+ characters will be used:
+ " " Normal, Visual and Operator-pending
+ "!" Insert and Commandline mode
+ (|mapmode-ic|)
+ "sid" The script local ID, used for <sid> mappings
+ (|<SID>|).
+ "scriptversion" The version of the script. 999999 for
+ |Vim9| script.
+ "lnum" The line number in "sid", zero if unknown.
+ "nowait" Do not wait for other, longer mappings.
+ (|:map-<nowait>|).
+ "abbr" True if this is an abbreviation |abbreviations|.
+ "mode_bits" Vim's internal binary representation of "mode".
+ |mapset()| ignores this; only "mode" is used.
+ See |maplist()| for usage examples. The values
+ are from src/vim.h and may change in the future.
+
+ The dictionary can be used to restore a mapping with
+ |mapset()|.
+
+ The mappings local to the current buffer are checked first,
+ then the global mappings.
+ This function can be used to map a key even when it's already
+ mapped, and have it do the original mapping too. Sketch: >
+ exe 'nnoremap <Tab> ==' .. maparg('<Tab>', 'n')
+
+< Can also be used as a |method|: >
+ GetKey()->maparg('n')
+
+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}.
+ When {abbr} is there and it is |TRUE| use abbreviations
+ instead of mappings.
+ A match happens with a mapping that starts with {name} and
+ with a mapping which is equal to the start of {name}.
+
+ matches mapping "a" "ab" "abc" ~
+ mapcheck("a") yes yes yes
+ mapcheck("abc") yes yes yes
+ mapcheck("ax") yes no no
+ mapcheck("b") no no no
+
+ The difference with maparg() is that mapcheck() finds a
+ 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
+ is returned. If there are several mappings that start with
+ {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
+ without being ambiguous. Example: >
+ :if mapcheck("_vv") == ""
+ : map _vv :set guifont=7x13<CR>
+ :endif
+< This avoids adding the "_vv" mapping when there already is a
+ mapping for "_v" or for "_vvv".
+
+ Can also be used as a |method|: >
+ GetKey()->mapcheck('n')
+
+
+maplist([{abbr}]) *maplist()*
+ Returns a |List| of all mappings. Each List item is a |Dict|,
+ the same as what is returned by |maparg()|, see
+ |mapping-dict|. When {abbr} is there and it is |TRUE| use
+ abbreviations instead of mappings.
+
+ Example to show all mappings with 'MultiMatch' in rhs: >
+ vim9script
+ echo maplist()->filter(
+ (_, m) => match(m.rhs, 'MultiMatch') >= 0)
+< It can be tricky to find mappings for particular |:map-modes|.
+ |mapping-dict|'s "mode_bits" can simplify this. For example,
+ the mode_bits for Normal, Insert or Command-line modes are
+ 0x19. To find all the mappings available in those modes you
+ can do: >
+ vim9script
+ var saved_maps = []
+ for m in maplist()
+ if and(m.mode_bits, 0x19) != 0
+ saved_maps->add(m)
+ endif
+ endfor
+ echo saved_maps->mapnew((_, m) => m.lhs)
+< The values of the mode_bits are defined in Vim's src/vim.h
+ file and they can be discovered at runtime using
+ |:map-commands| and "maplist()". Example: >
+ vim9script
+ omap xyzzy <Nop>
+ var op_bit = maplist()->filter(
+ (_, m) => m.lhs == 'xyzzy')[0].mode_bits
+ ounmap xyzzy
+ echo printf("Operator-pending mode bit: 0x%x", op_bit)
+
+
+mapnew({expr1}, {expr2}) *mapnew()*
+ Like |map()| but instead of replacing items in {expr1} a new
+ List or Dictionary is created and returned. {expr1} remains
+ unchanged. Items can still be changed by {expr2}, if you
+ don't want that use |deepcopy()| first.
+
+
+mapset({mode}, {abbr}, {dict}) *mapset()*
+mapset({dict})
+ Restore a mapping from a dictionary, possibly returned by
+ |maparg()| or |maplist()|. A buffer mapping, when dict.buffer
+ is true, is set on the current buffer; it is up to the caller
+ to ensure that the intended buffer is the current buffer. This
+ feature allows copying mappings from one buffer to another.
+ The dict.mode value may restore a single mapping that covers
+ more than one mode, like with mode values of '!', ' ', 'nox',
+ or 'v'. *E1276*
+
+ In the first form, {mode} and {abbr} should be the same as
+ for the call to |maparg()|. *E460*
+ {mode} is used to define the mode in which the mapping is set,
+ not the "mode" entry in {dict}.
+ Example for saving and restoring a mapping: >
+ let save_map = maparg('K', 'n', 0, 1)
+ nnoremap K somethingelse
+ ...
+ call mapset('n', 0, save_map)
+< Note that if you are going to replace a map in several modes,
+ e.g. with `:map!`, you need to save/restore the mapping for
+ all of them, when they might differ.
+
+ In the second form, with {dict} as the only argument, mode
+ and abbr are taken from the dict.
+ Example: >
+ vim9script
+ var save_maps = maplist()->filter(
+ (_, m) => m.lhs == 'K')
+ nnoremap K somethingelse
+ cnoremap K somethingelse2
+ # ...
+ unmap K
+ for d in save_maps
+ mapset(d)
+ endfor
+
+
+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
+ :echo match([1, 'x'], '\a') " results in 1
+< See |string-match| for how {pat} is used.
+ *strpbrk()*
+ Vim doesn't have a strpbrk() function. But you can do: >
+ :let sepidx = match(line, '[.,;: \t]')
+< *strcasestr()*
+ Vim doesn't have a strcasestr() function. But you can add
+ "\c" to the pattern to ignore case: >
+ :let idx = match(haystack, '\cneedle')
+<
+ If {start} is given, the search starts from byte index
+ {start} in a String or item {start} in a |List|.
+ The result, however, is still the index counted from the
+ first character/item. Example: >
+ :echo match("testing", "ing", 2)
+< result is again "4". >
+ :echo match("testing", "ing", 4)
+< result is again "4". >
+ :echo match("testing", "t", 2)
+< result is "3".
+ For a String, if {start} > 0 then it is like the string starts
+ {start} bytes later, thus "^" will match at {start}. Except
+ when {count} is given, then it's like matches before the
+ {start} byte are ignored (this is a bit complicated to keep it
+ backwards compatible).
+ For a String, if {start} < 0, it will be set to 0. For a list
+ the index is counted from the end.
+ If {start} is out of range ({start} > strlen({expr}) for a
+ String or {start} > len({expr}) for a |List|) -1 is returned.
+
+ When {count} is given use the {count}'th match. When a match
+ is found in a String the search for the next one starts one
+ character further. Thus this example results in 1: >
+ echo match("testing", "..", 0, 2)
+< In a |List| the search continues in the next item.
+ Note that when {count} is added the way {start} works changes,
+ see above.
+
+ See |pattern| for the patterns that are accepted.
+ The 'ignorecase' option is used to set the ignore-caseness of
+ the pattern. 'smartcase' is NOT used. The matching is always
+ done like 'magic' is set and 'cpoptions' is empty.
+ Note that a match at the start is preferred, thus when the
+ pattern is using "*" (any number of matches) it tends to find
+ zero matches at the start instead of a number of matches
+ further down in the text.
+
+ Can also be used as a |method|: >
+ GetText()->match('word')
+ GetList()->match('word')
+<
+ *matchadd()* *E290* *E798* *E799* *E801* *E957*
+matchadd({group}, {pattern} [, {priority} [, {id} [, {dict}]]])
+ Defines a pattern to be highlighted in the current window (a
+ "match"). It will be highlighted with {group}. Returns an
+ identification number (ID), which can be used to delete the
+ match using |matchdelete()|. The ID is bound to the window.
+ Matching is case sensitive and magic, unless case sensitivity
+ or magicness are explicitly overridden in {pattern}. The
+ 'magic', 'smartcase' and 'ignorecase' options are not used.
+ The "Conceal" value is special, it causes the match to be
+ concealed.
+
+ The optional {priority} argument assigns a priority to the
+ match. A match with a high priority will have its
+ highlighting overrule that of a match with a lower priority.
+ A priority is specified as an integer (negative numbers are no
+ exception). If the {priority} argument is not specified, the
+ default priority is 10. The priority of 'hlsearch' is zero,
+ hence all matches with a priority greater than zero will
+ overrule it. Syntax highlighting (see 'syntax') is a separate
+ mechanism, and regardless of the chosen priority a match will
+ always overrule syntax highlighting.
+
+ The optional {id} argument allows the request for a specific
+ match ID. If a specified ID is already taken, an error
+ message will appear and the match will not be added. An ID
+ is specified as a positive integer (zero excluded). IDs 1, 2
+ and 3 are reserved for |:match|, |:2match| and |:3match|,
+ respectively. 3 is reserved for use by the |matchparen|
+ plugin.
+ If the {id} argument is not specified or -1, |matchadd()|
+ automatically chooses a free ID, which is at least 1000.
+
+ The optional {dict} argument allows for further custom
+ values. Currently this is used to specify a match specific
+ conceal character that will be shown for |hl-Conceal|
+ highlighted matches. The dict can have the following members:
+
+ conceal Special character to show instead of the
+ match (only for |hl-Conceal| highlighted
+ matches, see |:syn-cchar|)
+ window Instead of the current window use the
+ window with this number or window ID.
+
+ The number of matches is not limited, as it is the case with
+ the |:match| commands.
+
+ Returns -1 on error.
+
+ Example: >
+ :highlight MyGroup ctermbg=green guibg=green
+ :let m = matchadd("MyGroup", "TODO")
+< Deletion of the pattern: >
+ :call matchdelete(m)
+
+< A list of matches defined by |matchadd()| and |:match| are
+ available from |getmatches()|. All matches can be deleted in
+ one operation by |clearmatches()|.
+
+ Can also be used as a |method|: >
+ GetGroup()->matchadd('TODO')
+<
+ *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.
+
+ {pos} is a list of positions. Each position can be one of
+ these:
+ - A number. This whole line will be highlighted. The first
+ line has number 1.
+ - A list with one number, e.g., [23]. The whole line with this
+ number will be highlighted.
+ - A list with two numbers, e.g., [23, 11]. The first number is
+ the line number, the second one is the column number (first
+ column is 1, the value must correspond to the byte index as
+ |col()| would return). The character at this position will
+ 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.
+
+ Returns -1 on error.
+
+ Example: >
+ :highlight MyGroup ctermbg=green guibg=green
+ :let m = matchaddpos("MyGroup", [[23, 24], 34])
+< Deletion of the pattern: >
+ :call matchdelete(m)
+
+< Matches added by |matchaddpos()| are returned by
+ |getmatches()|.
+
+ Can also be used as a |method|: >
+ GetGroup()->matchaddpos([23, 11])
+
+matcharg({nr}) *matcharg()*
+ Selects the {nr} match item, as set with a |:match|,
+ |:2match| or |:3match| command.
+ Return a |List| with two elements:
+ The name of the highlight group used
+ The pattern used.
+ When {nr} is not 1, 2 or 3 returns an empty |List|.
+ When there is no match item set returns ['', ''].
+ This is useful to save and restore a |:match|.
+ Highlighting matches using the |:match| commands are limited
+ to three matches. |matchadd()| does not have this limitation.
+
+ Can also be used as a |method|: >
+ GetMatch()->matcharg()
+
+matchdelete({id} [, {win}) *matchdelete()* *E802* *E803*
+ Deletes a match with ID {id} previously defined by |matchadd()|
+ or one of the |:match| commands. Returns 0 if successful,
+ otherwise -1. See example for |matchadd()|. All matches can
+ be deleted in one operation by |clearmatches()|.
+ If {win} is specified, use the window with this number or
+ window ID instead of the current window.
+
+ Can also be used as a |method|: >
+ GetMatch()->matchdelete()
+
+matchend({expr}, {pat} [, {start} [, {count}]]) *matchend()*
+ Same as |match()|, but return the index of first character
+ after the match. Example: >
+ :echo matchend("testing", "ing")
+< results in "7".
+ *strspn()* *strcspn()*
+ Vim doesn't have a strspn() or strcspn() function, but you can
+ do it with matchend(): >
+ :let span = matchend(line, '[a-zA-Z]')
+ :let span = matchend(line, '[^a-zA-Z]')
+< Except that -1 is returned when there are no matches.
+
+ The {start}, if given, has the same meaning as for |match()|. >
+ :echo matchend("testing", "ing", 2)
+< results in "7". >
+ :echo matchend("testing", "ing", 5)
+< result is "-1".
+ When {expr} is a |List| the result is equal to |match()|.
+
+ Can also be used as a |method|: >
+ GetText()->matchend('word')
+
+
+matchfuzzy({list}, {str} [, {dict}]) *matchfuzzy()*
+ If {list} is a list of strings, then returns a |List| with all
+ the strings in {list} that fuzzy match {str}. The strings in
+ the returned list are sorted based on the matching score.
+
+ The optional {dict} argument always supports the following
+ items:
+ matchseq When this item is present return only matches
+ that contain the characters in {str} in the
+ given sequence.
+ limit Maximum number of matches in {list} to be
+ returned. Zero means no limit.
+
+ If {list} is a list of dictionaries, then the optional {dict}
+ argument supports the following additional items:
+ key Key of the item which is fuzzy matched against
+ {str}. The value of this item should be a
+ string.
+ text_cb |Funcref| that will be called for every item
+ in {list} to get the text for fuzzy matching.
+ This should accept a dictionary item as the
+ argument and return the text for that item to
+ use for fuzzy matching.
+
+ {str} is treated as a literal string and regular expression
+ matching is NOT supported. The maximum supported {str} length
+ is 256.
+
+ When {str} has multiple words each separated by white space,
+ then the list of strings that have all the words is returned.
+
+ If there are no matching strings or there is an error, then an
+ empty list is returned. If length of {str} is greater than
+ 256, then returns an empty list.
+
+ When {limit} is given, matchfuzzy() will find up to this
+ number of matches in {list} and return them in sorted order.
+
+ Refer to |fuzzy-matching| for more information about fuzzy
+ matching strings.
+
+ Example: >
+ :echo matchfuzzy(["clay", "crow"], "cay")
+< results in ["clay"]. >
+ :echo getbufinfo()->map({_, v -> v.name})->matchfuzzy("ndl")
+< results in a list of buffer names fuzzy matching "ndl". >
+ :echo getbufinfo()->matchfuzzy("ndl", {'key' : 'name'})
+< results in a list of buffer information dicts with buffer
+ names fuzzy matching "ndl". >
+ :echo getbufinfo()->matchfuzzy("spl",
+ \ {'text_cb' : {v -> v.name}})
+< results in a list of buffer information dicts with buffer
+ names fuzzy matching "spl". >
+ :echo v:oldfiles->matchfuzzy("test")
+< results in a list of file names fuzzy matching "test". >
+ :let l = readfile("buffer.c")->matchfuzzy("str")
+< results in a list of lines in "buffer.c" fuzzy matching "str". >
+ :echo ['one two', 'two one']->matchfuzzy('two one')
+< results in ['two one', 'one two']. >
+ :echo ['one two', 'two one']->matchfuzzy('two one',
+ \ {'matchseq': 1})
+< results in ['two one'].
+
+matchfuzzypos({list}, {str} [, {dict}]) *matchfuzzypos()*
+ Same as |matchfuzzy()|, but returns the list of matched
+ strings, the list of character positions where characters
+ in {str} matches and a list of matching scores. You can
+ use |byteidx()| to convert a character position to a byte
+ position.
+
+ If {str} matches multiple times in a string, then only the
+ positions for the best match is returned.
+
+ If there are no matching strings or there is an error, then a
+ list with three empty list items is returned.
+
+ Example: >
+ :echo matchfuzzypos(['testing'], 'tsg')
+< results in [['testing'], [[0, 2, 6]], [99]] >
+ :echo matchfuzzypos(['clay', 'lacy'], 'la')
+< results in [['lacy', 'clay'], [[0, 1], [1, 2]], [153, 133]] >
+ :echo [{'text': 'hello', 'id' : 10}]->matchfuzzypos('ll', {'key' : 'text'})
+< results in [[{'id': 10, 'text': 'hello'}], [[2, 3]], [127]]
+
+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.
+ in |:substitute|. When an optional submatch didn't match an
+ empty string is used. Example: >
+ echo matchlist('acd', '\(a\)\?\(b\)\?\(c\)\?\(.*\)')
+< Results in: ['acd', 'a', '', 'c', 'd', '', '', '', '', '']
+ When there is no match an empty list is returned.
+
+ You can pass in a List, but that is not very useful.
+
+ Can also be used as a |method|: >
+ GetText()->matchlist('word')
+
+matchstr({expr}, {pat} [, {start} [, {count}]]) *matchstr()*
+ Same as |match()|, but return the matched string. Example: >
+ :echo matchstr("testing", "ing")
+< results in "ing".
+ When there is no match "" is returned.
+ The {start}, if given, has the same meaning as for |match()|. >
+ :echo matchstr("testing", "ing", 2)
+< results in "ing". >
+ :echo matchstr("testing", "ing", 5)
+< result is "".
+ When {expr} is a |List| then the matching item is returned.
+ The type isn't changed, it's not necessarily a String.
+
+ Can also be used as a |method|: >
+ GetText()->matchstr('word')
+
+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.
+
+ Can also be used as a |method|: >
+ GetText()->matchstrpos('word')
+<
+
+ *max()*
+max({expr}) Return the maximum value of all items in {expr}. Example: >
+ echo max([apples, pears, oranges])
+
+< {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.
+
+ Can also be used as a |method|: >
+ mylist->max()
+
+
+menu_info({name} [, {mode}]) *menu_info()*
+ Return information about the specified menu {name} in
+ mode {mode}. The menu name should be specified without the
+ shortcut character ('&'). If {name} is "", then the top-level
+ menu names are returned.
+
+ {mode} can be one of these strings:
+ "n" Normal
+ "v" Visual (including Select)
+ "o" Operator-pending
+ "i" Insert
+ "c" Cmd-line
+ "s" Select
+ "x" Visual
+ "t" Terminal-Job
+ "" Normal, Visual and Operator-pending
+ "!" Insert and Cmd-line
+ When {mode} is omitted, the modes for "" are used.
+
+ Returns a |Dictionary| containing the following items:
+ accel menu item accelerator text |menu-text|
+ display display name (name without '&')
+ enabled v:true if this menu item is enabled
+ Refer to |:menu-enable|
+ icon name of the icon file (for toolbar)
+ |toolbar-icon|
+ iconidx index of a built-in icon
+ modes modes for which the menu is defined. In
+ addition to the modes mentioned above, these
+ characters will be used:
+ " " Normal, Visual and Operator-pending
+ name menu item name.
+ noremenu v:true if the {rhs} of the menu item is not
+ remappable else v:false.
+ priority menu order priority |menu-priority|
+ rhs right-hand-side of the menu item. The returned
+ string has special characters translated like
+ in the output of the ":menu" command listing.
+ When the {rhs} of a menu item is empty, then
+ "<Nop>" is returned.
+ script v:true if script-local remapping of {rhs} is
+ allowed else v:false. See |:menu-script|.
+ shortcut shortcut key (character after '&' in
+ the menu name) |menu-shortcut|
+ silent v:true if the menu item is created
+ with <silent> argument |:menu-silent|
+ submenus |List| containing the names of
+ all the submenus. Present only if the menu
+ item has submenus.
+
+ Returns an empty dictionary if the menu item is not found.
+
+ Examples: >
+ :echo menu_info('Edit.Cut')
+ :echo menu_info('File.Save', 'n')
+
+ " Display the entire menu hierarchy in a buffer
+ func ShowMenu(name, pfx)
+ let m = menu_info(a:name)
+ call append(line('$'), a:pfx .. m.display)
+ for child in m->get('submenus', [])
+ call ShowMenu(a:name .. '.' .. escape(child, '.'),
+ \ a:pfx .. ' ')
+ endfor
+ endfunc
+ new
+ for topmenu in menu_info('').submenus
+ call ShowMenu(topmenu, '')
+ endfor
+<
+ Can also be used as a |method|: >
+ GetMenuName()->menu_info('v')
+
+
+< *min()*
+min({expr}) Return the minimum value of all items in {expr}. Example: >
+ echo min([apples, pears, oranges])
+
+< {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.
+
+ Can also be used as a |method|: >
+ mylist->min()
+
+< *mkdir()* *E739*
+mkdir({name} [, {flags} [, {prot}]])
+ Create directory {name}.
+
+ When {flags} is present it must be a string. An empty string
+ has no effect.
+
+ If {flags} contains "p" then intermediate directories are
+ created as necessary.
+
+ If {flags} contains "D" then {name} is deleted at the end of
+ the current function, as with: >
+ defer delete({name}, 'd')
+<
+ If {flags} contains "R" then {name} is deleted recursively at
+ the end of the current function, as with: >
+ defer delete({name}, 'rf')
+< Note that when {name} has more than one part and "p" is used
+ some directories may already exist. Only the first one that
+ is created and what it contains is scheduled to be deleted.
+ E.g. when using: >
+ call mkdir('subdir/tmp/autoload', 'pR')
+< and "subdir" already exists then "subdir/tmp" will be
+ scheduled for deletion, like with: >
+ defer delete('subdir/tmp', 'rf')
+< Note that if scheduling the defer fails the directory is not
+ deleted. This should only happen when out of memory.
+
+ If {prot} is given it is used to set the protection bits of
+ the new directory. The default is 0o755 (rwxr-xr-x: r/w for
+ the user, readable for others). Use 0o700 to make it
+ unreadable for others. This is only used for the last part of
+ {name}. Thus if you create /tmp/foo/bar then /tmp/foo will be
+ created with 0o755.
+ Example: >
+ :call mkdir($HOME .. "/tmp/foo/bar", "p", 0o700)
+
+< This function is not available in the |sandbox|.
+
+ There is no error if the directory already exists and the "p"
+ flag is passed (since patch 8.0.1708). However, without the
+ "p" option the call will fail.
+
+ The function result is a Number, which is TRUE if the call was
+ successful or FALSE if the directory creation failed or partly
+ failed.
+
+ Not available on all systems. To check use: >
+ :if exists("*mkdir")
+
+< Can also be used as a |method|: >
+ GetName()->mkdir()
+<
+ *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.
+ Also see |state()|.
+
+ 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|);
+ CTRL-V is one character
+ 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|
+ nt Terminal-Normal (insert goes to Terminal-Job mode)
+ v Visual by character
+ vs Visual by character using |v_CTRL-O| in Select mode
+ V Visual by line
+ Vs Visual by line using |v_CTRL-O| in Select mode
+ CTRL-V Visual blockwise
+ CTRL-Vs Visual blockwise using |v_CTRL-O| in Select mode
+ 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|
+ Rx Replace mode |i_CTRL-X| completion
+ Rv Virtual Replace |gR|
+ Rvc Virtual Replace mode completion |compl-generic|
+ Rvx Virtual 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? A |:confirm| query of some sort
+ ! Shell or external command is executing
+ t Terminal-Job 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".
+ Note that in the future more modes and more specific modes may
+ be added. It's better not to compare the whole string but only
+ the leading character(s).
+ Also see |visualmode()|.
+
+ Can also be used as a |method|: >
+ DoFull()->mode()
+
+mzeval({expr}) *mzeval()*
+ Evaluate MzScheme expression {expr} and return its result
+ converted to Vim data structures.
+ Numbers and strings are returned as they are.
+ Pairs (including lists and improper lists) and vectors are
+ returned as Vim |Lists|.
+ Hash tables are represented as Vim |Dictionary| type with keys
+ converted to strings.
+ All other types are converted to string with display function.
+ Examples: >
+ :mz (define l (list 1 2 3))
+ :mz (define h (make-hash)) (hash-set! h "list" l)
+ :echo mzeval("l")
+ :echo mzeval("h")
+<
+ Note that in a `:def` function local variables are not visible
+ to {expr}.
+
+ Can also be used as a |method|: >
+ GetExpr()->mzeval()
+<
+ {only available when compiled with the |+mzscheme| feature}
+
+nextnonblank({lnum}) *nextnonblank()*
+ Return the line number of the first line at or below {lnum}
+ that is not blank. Example: >
+ if getline(nextnonblank(1)) =~ "Java"
+< When {lnum} is invalid or there is no non-blank line at or
+ below it, zero is returned.
+ {lnum} is used like with |getline()|.
+ See also |prevnonblank()|.
+
+ Can also be used as a |method|: >
+ GetLnum()->nextnonblank()
+
+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": >
+ nr2char(300) returns I with bow character
+< When {utf8} is TRUE, always return UTF-8 characters.
+ 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.
+ To turn a list of character numbers into a string: >
+ let list = [65, 66, 67]
+ let str = join(map(list, {_, val -> nr2char(val)}), '')
+< Result: "ABC"
+
+ Can also be used as a |method|: >
+ GetNumber()->nr2char()
+
+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.
+ Also see `and()` and `xor()`.
+ Example: >
+ :let bits = or(bits, 0x80)
+< Can also be used as a |method|: >
+ :let bits = bits->or(0x80)
+
+< Rationale: The reason this is a function and not using the "|"
+ character like many languages, is that Vi has always used "|"
+ to separate commands. In many places it would not be clear if
+ "|" is an operator or a command separator.
+
+
+pathshorten({path} [, {len}]) *pathshorten()*
+ Shorten directory names in the path {path} and return the
+ result. The tail, the file name, is kept as-is. The other
+ components in the path are reduced to {len} letters in length.
+ If {len} is omitted or smaller than 1 then 1 is used (single
+ letters). Leading '~' and '.' characters are kept. Examples: >
+ :echo pathshorten('~/.vim/autoload/myfile.vim')
+< ~/.v/a/myfile.vim ~
+>
+ :echo pathshorten('~/.vim/autoload/myfile.vim', 2)
+< ~/.vi/au/myfile.vim ~
+ It doesn't matter if the path exists or not.
+ Returns an empty string on error.
+
+ Can also be used as a |method|: >
+ GetDirectories()->pathshorten()
+
+perleval({expr}) *perleval()*
+ Evaluate Perl expression {expr} in scalar context and return
+ its result converted to Vim data structures. If value can't be
+ converted, it is returned as a string Perl representation.
+ Note: If you want an array or hash, {expr} must return a
+ reference to it.
+ Example: >
+ :echo perleval('[1 .. 4]')
+< [1, 2, 3, 4]
+
+ Note that in a `:def` function local variables are not visible
+ to {expr}.
+
+ Can also be used as a |method|: >
+ GetExpr()->perleval()
+
+< {only available when compiled with the |+perl| feature}
+
+
+popup_ functions are documented here: |popup-functions|
+
+
+pow({x}, {y}) *pow()*
+ Return the power of {x} to the exponent {y} as a |Float|.
+ {x} and {y} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {x} or {y} is not a |Float| or a |Number|.
+ Examples: >
+ :echo pow(3, 3)
+< 27.0 >
+ :echo pow(2, 16)
+< 65536.0 >
+ :echo pow(32, 0.20)
+< 2.0
+
+ Can also be used as a |method|: >
+ Compute()->pow(3)
+
+prevnonblank({lnum}) *prevnonblank()*
+ Return the line number of the first line at or above {lnum}
+ that is not blank. Example: >
+ let ind = indent(prevnonblank(v:lnum - 1))
+< When {lnum} is invalid or there is no non-blank line at or
+ above it, zero is returned.
+ {lnum} is used like with |getline()|.
+ Also see |nextnonblank()|.
+
+ Can also be used as a |method|: >
+ GetLnum()->prevnonblank()
+
+printf({fmt}, {expr1} ...) *printf()*
+ Return a String with {fmt}, where "%" items are replaced by
+ the formatted form of their respective arguments. Example: >
+ printf("%4d: E%d %.30s", lnum, errno, msg)
+< May result in:
+ " 99: E42 asdfasdfasdfasdfasdfasdfasdfas" ~
+
+ When used as a |method| the base is passed as the second
+ argument: >
+ Compute()->printf("result: %d")
+<
+ You can use `call()` to pass the items as a list.
+
+ Often used items are:
+ %s string
+ %6S string right-aligned in 6 display cells
+ %6s string right-aligned in 6 bytes
+ %.9s string truncated to 9 bytes
+ %c single byte
+ %d decimal number
+ %5d decimal number padded with spaces to 5 characters
+ %x hex number
+ %04x hex number padded with zeros to at least 4 characters
+ %X hex number using upper case letters
+ %o octal number
+ %08b binary number padded with zeros to at least 8 chars
+ %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
+ %% the % character itself
+
+ Conversion specifications start with '%' and end with the
+ conversion type. All other characters are copied unchanged to
+ the result.
+
+ The "%" starts a conversion specification. The following
+ arguments appear in sequence:
+
+ % [flags] [field-width] [.precision] type
+
+ flags
+ Zero or more of the following flags:
+
+ # The value should be converted to an "alternate
+ form". For c, d, and s conversions, this option
+ has no effect. For o conversions, the precision
+ of the number is increased to force the first
+ character of the output string to a zero (except
+ if a zero value is printed with an explicit
+ precision of zero).
+ For b and B conversions, a non-zero result has
+ the string "0b" (or "0B" for B conversions)
+ prepended to it.
+ For x and X conversions, a non-zero result has
+ the string "0x" (or "0X" for X conversions)
+ prepended to it.
+
+ 0 (zero) Zero padding. For all conversions the converted
+ value is padded on the left with zeros rather
+ than blanks. If a precision is given with a
+ numeric conversion (d, b, B, o, x, and X), the 0
+ flag is ignored.
+
+ - A negative field width flag; the converted value
+ is to be left adjusted on the field boundary.
+ The converted value is padded on the right with
+ blanks, rather than on the left with blanks or
+ zeros. A - overrides a 0 if both are given.
+
+ ' ' (space) A blank should be left before a positive
+ number produced by a signed conversion (d).
+
+ + A sign must always be placed before a number
+ produced by a signed conversion. A + overrides
+ a space if both are used.
+
+ field-width
+ An optional decimal digit string specifying a minimum
+ field width. If the converted value has fewer bytes
+ than the field width, it will be padded with spaces on
+ the left (or right, if the left-adjustment flag has
+ been given) to fill out the field width. For the S
+ conversion the count is in cells.
+
+ .precision
+ An optional precision, in the form of a period '.'
+ followed by an optional digit string. If the digit
+ string is omitted, the precision is taken as zero.
+ This gives the minimum number of digits to appear for
+ d, o, x, and X conversions, the maximum number of
+ bytes to be printed from a string for s conversions,
+ or the maximum number of cells to be printed from a
+ string for S conversions.
+ For floating point it is the number of digits after
+ the decimal point.
+
+ type
+ A character that specifies the type of conversion to
+ be applied, see below.
+
+ A field width or precision, or both, may be indicated by an
+ asterisk '*' instead of a digit string. In this case, a
+ Number argument supplies the field width or precision. A
+ negative field width is treated as a left adjustment flag
+ followed by a positive field width; a negative precision is
+ treated as though it were missing. Example: >
+ :echo printf("%d: %.*s", nr, width, line)
+< This limits the length of the text used from "line" to
+ "width" bytes.
+
+ The conversion specifiers and their meanings are:
+
+ *printf-d* *printf-b* *printf-B* *printf-o*
+ *printf-x* *printf-X*
+ dbBoxX The Number argument is converted to signed decimal
+ (d), unsigned binary (b and B), unsigned octal (o), or
+ unsigned hexadecimal (x and X) notation. The letters
+ "abcdef" are used for x conversions; the letters
+ "ABCDEF" are used for X conversions.
+ The precision, if any, gives the minimum number of
+ digits that must appear; if the converted value
+ requires fewer digits, it is padded on the left with
+ zeros.
+ In no case does a non-existent or small field width
+ cause truncation of a 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
+ resulting character is written.
+
+ *printf-s*
+ 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
+ number specified are used.
+
+ *printf-f* *E807*
+ 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"
+ 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
+ Note that roundoff depends on the system libraries.
+ Use |round()| when in doubt.
+
+ *printf-e* *printf-E*
+ e E The Float argument is converted into a string of the
+ form 1.234e+03 or 1.234E+03 when using 'E'. The
+ precision specifies the number of digits after the
+ decimal point, like with 'f'.
+
+ *printf-g* *printf-G*
+ g G The Float argument is converted like with 'f' if the
+ value is between 0.001 (inclusive) and 10000000.0
+ (exclusive). Otherwise 'e' is used for 'g' and 'E'
+ for 'G'. When no precision is specified superfluous
+ zeroes and '+' signs are removed, except for the zero
+ immediately after the decimal point. Thus 10000000.0
+ results in 1.0e7.
+
+ *printf-%*
+ % A '%' is written. No argument is converted. The
+ complete conversion specification is "%%".
+
+ When a Number argument is expected a String argument is also
+ accepted and automatically converted.
+ When a Float or String argument is expected a Number argument
+ is also accepted and automatically converted.
+ Any other argument type results in an error message.
+
+ *E766* *E767*
+ The number of {exprN} arguments must exactly match the number
+ of "%" items. If there are not sufficient or too many
+ arguments an error is given. Up to 18 arguments can be used.
+
+
+prompt_getprompt({buf}) *prompt_getprompt()*
+ Returns the effective prompt text for buffer {buf}. {buf} can
+ be a buffer name or number. See |prompt-buffer|.
+
+ If the buffer doesn't exist or isn't a prompt buffer, an empty
+ string is returned.
+
+ Can also be used as a |method|: >
+ GetBuffer()->prompt_getprompt()
+
+< {only available when compiled with the |+channel| feature}
+
+
+prompt_setcallback({buf}, {expr}) *prompt_setcallback()*
+ Set prompt callback for buffer {buf} to {expr}. When {expr}
+ is an empty string the callback is removed. This has only
+ effect if {buf} has 'buftype' set to "prompt".
+
+ The callback is invoked when pressing Enter. The current
+ buffer will always be the prompt buffer. A new line for a
+ prompt is added before invoking the callback, thus the prompt
+ for which the callback was invoked will be in the last but one
+ line.
+ If the callback wants to add text to the buffer, it must
+ insert it above the last line, since that is where the current
+ prompt is. This can also be done asynchronously.
+ The callback is invoked with one argument, which is the text
+ that was entered at the prompt. This can be an empty string
+ if the user only typed Enter.
+ Example: >
+ call prompt_setcallback(bufnr(), function('s:TextEntered'))
+ func s:TextEntered(text)
+ if a:text == 'exit' || a:text == 'quit'
+ stopinsert
+ close
+ else
+ call append(line('$') - 1, 'Entered: "' .. a:text .. '"')
+ " Reset 'modified' to allow the buffer to be closed.
+ set nomodified
+ endif
+ endfunc
+
+< Can also be used as a |method|: >
+ GetBuffer()->prompt_setcallback(callback)
+
+< {only available when compiled with the |+channel| feature}
+
+prompt_setinterrupt({buf}, {expr}) *prompt_setinterrupt()*
+ Set a callback for buffer {buf} to {expr}. When {expr} is an
+ empty string the callback is removed. This has only effect if
+ {buf} has 'buftype' set to "prompt".
+
+ This callback will be invoked when pressing CTRL-C in Insert
+ mode. Without setting a callback Vim will exit Insert mode,
+ as in any buffer.
+
+ Can also be used as a |method|: >
+ GetBuffer()->prompt_setinterrupt(callback)
+
+< {only available when compiled with the |+channel| feature}
+
+prompt_setprompt({buf}, {text}) *prompt_setprompt()*
+ Set prompt for buffer {buf} to {text}. You most likely want
+ {text} to end in a space.
+ The result is only visible if {buf} has 'buftype' set to
+ "prompt". Example: >
+ call prompt_setprompt(bufnr(), 'command: ')
+<
+ Can also be used as a |method|: >
+ GetBuffer()->prompt_setprompt('command: ')
+
+< {only available when compiled with the |+channel| feature}
+
+prop_ functions are documented here: |text-prop-functions|
+
+pum_getpos() *pum_getpos()*
+ If the popup menu (see |ins-completion-menu|) is not visible,
+ returns an empty |Dictionary|, otherwise, returns a
+ |Dictionary| with the following keys:
+ height nr of items visible
+ width screen cells
+ row top screen row (0 first row)
+ col leftmost screen column (0 first col)
+ size total nr of items
+ scrollbar |TRUE| if scrollbar is visible
+
+ The values are the same as in |v:event| during
+ |CompleteChanged|.
+
+pumvisible() *pumvisible()*
+ Returns non-zero when the popup menu is visible, zero
+ otherwise. See |ins-completion-menu|.
+ This can be used to avoid some things that would remove the
+ popup menu.
+
+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').
+ Lists are represented as Vim |List| type.
+ Dictionaries are represented as Vim |Dictionary| type with
+ keys converted to strings.
+ Note that in a `:def` function local variables are not visible
+ to {expr}.
+
+ Can also be used as a |method|: >
+ GetExpr()->py3eval()
+
+< {only available when compiled with the |+python3| feature}
+
+ *E858* *E859*
+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
+ copied though).
+ Lists are represented as Vim |List| type.
+ Dictionaries are represented as Vim |Dictionary| type,
+ non-string keys result in error.
+ Note that in a `:def` function local variables are not visible
+ to {expr}.
+
+ Can also be used as a |method|: >
+ GetExpr()->pyeval()
+
+< {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()|
+
+ Can also be used as a |method|: >
+ GetExpr()->pyxeval()
+
+< {only available when compiled with the |+python| or the
+ |+python3| feature}
+
+rand([{expr}]) *rand()* *random*
+ Return a pseudo-random Number generated with an xoshiro128**
+ algorithm using seed {expr}. The returned number is 32 bits,
+ also on 64 bits systems, for consistency.
+ {expr} can be initialized by |srand()| and will be updated by
+ rand(). If {expr} is omitted, an internal seed value is used
+ and updated.
+ Returns -1 if {expr} is invalid.
+
+ Examples: >
+ :echo rand()
+ :let seed = srand()
+ :echo rand(seed)
+ :echo rand(seed) % 16 " random number 0 - 15
+<
+
+ *E726* *E727*
+range({expr} [, {max} [, {stride}]]) *range()*
+ Returns a |List| with Numbers:
+ - If only {expr} is specified: [0, 1, ..., {expr} - 1]
+ - If {max} is specified: [{expr}, {expr} + 1, ..., {max}]
+ - If {stride} is specified: [{expr}, {expr} + {stride}, ...,
+ {max}] (increasing {expr} with {stride} each time, not
+ producing a value past {max}).
+ When the maximum is one before the start the result is an
+ empty list. When the maximum is more than one before the
+ start this is an error.
+ Examples: >
+ range(4) " [0, 1, 2, 3]
+ range(2, 4) " [2, 3, 4]
+ range(2, 9, 3) " [2, 5, 8]
+ range(2, -2, -1) " [2, 1, 0, -1, -2]
+ range(0) " []
+ range(2, 0) " error!
+<
+ Can also be used as a |method|: >
+ GetExpr()->range()
+<
+
+readblob({fname} [, {offset} [, {size}]]) *readblob()*
+ Read file {fname} in binary mode and return a |Blob|.
+ If {offset} is specified, read the file from the specified
+ offset. If it is a negative value, it is used as an offset
+ from the end of the file. E.g., to read the last 12 bytes: >
+ readblob('file.bin', -12)
+< If {size} is specified, only the specified size will be read.
+ E.g. to read the first 100 bytes of a file: >
+ readblob('file.bin', 0, 100)
+< If {size} is -1 or omitted, the whole data starting from
+ {offset} will be read.
+ This can be also used to read the data from a character device
+ on Unix when {size} is explicitly set. Only if the device
+ supports seeking {offset} can be used. Otherwise it should be
+ zero. E.g. to read 10 bytes from a serial console: >
+ readblob('/dev/ttyS0', 0, 10)
+< When the file can't be opened an error message is given and
+ the result is an empty |Blob|.
+ When the offset is beyond the end of the file the result is an
+ empty blob.
+ When trying to read more bytes than are available the result
+ is truncated.
+ Also see |readfile()| and |writefile()|.
+
+
+readdir({directory} [, {expr} [, {dict}]]) *readdir()*
+ Return a list with file and directory names in {directory}.
+ You can also use |glob()| if you don't need to do complicated
+ things, such as limiting the number of matches.
+ The list will be sorted (case sensitive), see the {dict}
+ argument below for changing the sort order.
+
+ When {expr} is omitted all entries are included.
+ When {expr} is given, it is evaluated to check what to do:
+ If {expr} results in -1 then no further entries will
+ be handled.
+ If {expr} results in 0 then this entry will not be
+ added to the list.
+ If {expr} results in 1 then this entry will be added
+ to the list.
+ The entries "." and ".." are always excluded.
+ Each time {expr} is evaluated |v:val| is set to the entry name.
+ When {expr} is a function the name is passed as the argument.
+ For example, to get a list of files ending in ".txt": >
+ readdir(dirname, {n -> n =~ '.txt$'})
+< To skip hidden and backup files: >
+ readdir(dirname, {n -> n !~ '^\.\|\~$'})
+< *E857*
+ The optional {dict} argument allows for further custom
+ values. Currently this is used to specify if and how sorting
+ should be performed. The dict can have the following members:
+
+ sort How to sort the result returned from the system.
+ Valid values are:
+ "none" do not sort (fastest method)
+ "case" sort case sensitive (byte value of
+ each character, technically, using
+ strcmp()) (default)
+ "icase" sort case insensitive (technically
+ using strcasecmp())
+ "collate" sort using the collation order
+ of the "POSIX" or "C" |locale|
+ (technically using strcoll())
+ Other values are silently ignored.
+
+ For example, to get a list of all files in the current
+ directory without sorting the individual entries: >
+ readdir('.', '1', #{sort: 'none'})
+< If you want to get a directory tree: >
+ function! s:tree(dir)
+ return {a:dir : map(readdir(a:dir),
+ \ {_, x -> isdirectory(x) ?
+ \ {x : s:tree(a:dir .. '/' .. x)} : x})}
+ endfunction
+ echo s:tree(".")
+<
+ Returns an empty List on error.
+
+ Can also be used as a |method|: >
+ GetDirName()->readdir()
+<
+readdirex({directory} [, {expr} [, {dict}]]) *readdirex()*
+ Extended version of |readdir()|.
+ Return a list of Dictionaries with file and directory
+ information in {directory}.
+ This is useful if you want to get the attributes of file and
+ directory at the same time as getting a list of a directory.
+ This is much faster than calling |readdir()| then calling
+ |getfperm()|, |getfsize()|, |getftime()| and |getftype()| for
+ each file and directory especially on MS-Windows.
+ The list will by default be sorted by name (case sensitive),
+ the sorting can be changed by using the optional {dict}
+ argument, see |readdir()|.
+
+ The Dictionary for file and directory information has the
+ following items:
+ group Group name of the entry. (Only on Unix)
+ name Name of the entry.
+ perm Permissions of the entry. See |getfperm()|.
+ size Size of the entry. See |getfsize()|.
+ time Timestamp of the entry. See |getftime()|.
+ type Type of the entry.
+ On Unix, almost same as |getftype()| except:
+ Symlink to a dir "linkd"
+ Other symlink "link"
+ On MS-Windows:
+ Normal file "file"
+ Directory "dir"
+ Junction "junction"
+ Symlink to a dir "linkd"
+ Other symlink "link"
+ Other reparse point "reparse"
+ user User name of the entry's owner. (Only on Unix)
+ On Unix, if the entry is a symlink, the Dictionary includes
+ the information of the target (except the "type" item).
+ On MS-Windows, it includes the information of the symlink
+ itself because of performance reasons.
+
+ When {expr} is omitted all entries are included.
+ When {expr} is given, it is evaluated to check what to do:
+ If {expr} results in -1 then no further entries will
+ be handled.
+ If {expr} results in 0 then this entry will not be
+ added to the list.
+ If {expr} results in 1 then this entry will be added
+ to the list.
+ The entries "." and ".." are always excluded.
+ Each time {expr} is evaluated |v:val| is set to a |Dictionary|
+ of the entry.
+ When {expr} is a function the entry is passed as the argument.
+ For example, to get a list of files ending in ".txt": >
+ readdirex(dirname, {e -> e.name =~ '.txt$'})
+<
+ For example, to get a list of all files in the current
+ directory without sorting the individual entries: >
+ readdirex(dirname, '1', #{sort: 'none'})
+<
+ Can also be used as a |method|: >
+ GetDirName()->readdirex()
+<
+
+ *readfile()*
+readfile({fname} [, {type} [, {max}]])
+ Read file {fname} and return a |List|, each line of the file
+ 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 {type} contains "b" binary mode is used:
+ - When the last line ends in a NL an extra empty list item is
+ added.
+ - No CR characters are removed.
+ 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.
+ 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: >
+ :for line in readfile(fname, '', 10)
+ : if line =~ 'Date' | echo line | endif
+ :endfor
+< When {max} is negative -{max} lines from the end of the file
+ are returned, or as many as there are.
+ When {max} is zero the result is an empty list.
+ Note that without {max} the whole file is read into memory.
+ Also note that there is no recognition of encoding. Read a
+ file into a buffer if you need to.
+ Deprecated (use |readblob()| instead): When {type} contains
+ "B" a |Blob| is returned with the binary data of the file
+ unmodified.
+ When the file can't be opened an error message is given and
+ the result is an empty list.
+ Also see |writefile()|.
+
+ Can also be used as a |method|: >
+ GetFileName()->readfile()
+
+reduce({object}, {func} [, {initial}]) *reduce()* *E998*
+ {func} is called for every item in {object}, which can be a
+ |String|, |List| or a |Blob|. {func} is called with two
+ arguments: the result so far and current item. After
+ processing all items the result is returned. *E1132*
+
+ {initial} is the initial result. When omitted, the first item
+ in {object} is used and {func} is first called for the second
+ item. If {initial} is not given and {object} is empty no
+ result can be computed, an E998 error is given.
+
+ Examples: >
+ echo reduce([1, 3, 5], { acc, val -> acc + val })
+ echo reduce(['x', 'y'], { acc, val -> acc .. val }, 'a')
+ echo reduce(0z1122, { acc, val -> 2 * acc + val })
+ echo reduce('xyz', { acc, val -> acc .. ',' .. val })
+<
+ Can also be used as a |method|: >
+ echo mylist->reduce({ acc, val -> acc + val }, 0)
+
+
+reg_executing() *reg_executing()*
+ Returns the single letter name of the register being executed.
+ Returns an empty string when no register is being executed.
+ See |@|.
+
+reg_recording() *reg_recording()*
+ Returns the single letter name of the register being recorded.
+ Returns an empty string when not recording. See |q|.
+
+reltime()
+reltime({start})
+reltime({start}, {end}) *reltime()*
+ Return an item that represents a time value. The item is a
+ list with items that depend on the system. In Vim 9 script
+ list<any> can be used.
+ The item can be passed to |reltimestr()| to convert it to a
+ string or |reltimefloat()| to convert to a Float. For
+ example, to see the time spent in function Work(): >
+ var startTime = reltime()
+ Work()
+ echo startTime->reltime()->reltimestr()
+<
+ Without an argument reltime() returns the current time (the
+ representation is system-dependent, it can not be used as the
+ wall-clock time, see |localtime()| for that).
+ With one argument is 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(). If there is an error an empty List is returned in
+ legacy script, in Vim9 script an error is given.
+
+ Can also be used as a |method|: >
+ GetStart()->reltime()
+<
+ {only available when compiled with the |+reltime| feature}
+
+reltimefloat({time}) *reltimefloat()*
+ Return a Float that represents the time value of {time}.
+ Example: >
+ let start = reltime()
+ call MyFunction()
+ let seconds = reltimefloat(reltime(start))
+< See the note of reltimestr() about overhead.
+ Also see |profiling|.
+ If there is an error 0.0 is returned in legacy script, in Vim9
+ script an error is given.
+
+ Can also be used as a |method|: >
+ reltime(start)->reltimefloat()
+
+< {only available when compiled with the |+reltime| feature}
+
+reltimestr({time}) *reltimestr()*
+ Return a String that represents the time value of {time}.
+ This is the number of seconds, a dot and the number of
+ microseconds. Example: >
+ let start = reltime()
+ call MyFunction()
+ echo reltimestr(reltime(start))
+< Note that overhead for the commands will be added to the time.
+ The accuracy depends on the system.
+ Leading spaces are used to make the string align nicely. You
+ can use split() to remove it. >
+ echo split(reltimestr(reltime(start)))[0]
+< Also see |profiling|.
+ If there is an error an empty string is returned in legacy
+ script, in Vim9 script an error is given.
+
+ Can also be used as a |method|: >
+ reltime(start)->reltimestr()
+
+< {only available when compiled with the |+reltime| feature}
+
+ *remote_expr()* *E449*
+remote_expr({server}, {string} [, {idvar} [, {timeout}]])
+ Send the {string} to {server}. The {server} argument is a
+ string, also see |{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 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")
+<
+ Can also be used as a |method|: >
+ ServerName()->remote_expr(expr)
+
+remote_foreground({server}) *remote_foreground()*
+ Move the Vim server with the name {server} to the foreground.
+ The {server} argument is a string, also see |{server}|.
+ This works like: >
+ remote_expr({server}, "foreground()")
+< Except that on Win32 systems the client does the work, to work
+ around the problem that the OS doesn't always allow the server
+ to bring itself to the foreground.
+ Note: This does not restore the window if it was minimized,
+ like foreground() does.
+ This function is not available in the |sandbox|.
+
+ Can also be used as a |method|: >
+ ServerName()->remote_foreground()
+
+< {only in the Win32, Motif and GTK GUI versions and the
+ Win32 console version}
+
+
+remote_peek({serverid} [, {retvar}]) *remote_peek()*
+ Returns a positive number if there are available strings
+ from {serverid}. Copies any reply string into the variable
+ {retvar} if specified. {retvar} must be a string with the
+ name of a variable.
+ Returns zero if none are available.
+ Returns -1 if something is wrong.
+ See also |clientserver|.
+ This function is not available in the |sandbox|.
+ {only available when compiled with the |+clientserver| feature}
+ Examples: >
+ :let repl = ""
+ :echo "PEEK: " .. remote_peek(id, "repl") .. ": " .. repl
+
+< Can also be used as a |method|: >
+ ServerId()->remote_peek()
+
+remote_read({serverid}, [{timeout}]) *remote_read()*
+ Return the oldest available reply from {serverid} and consume
+ it. Unless a {timeout} in seconds is given, it blocks until a
+ reply is available. Returns an empty string, if a reply is
+ not available or on error.
+ See also |clientserver|.
+ This function is not available in the |sandbox|.
+ {only available when compiled with the |+clientserver| feature}
+ Example: >
+ :echo remote_read(id)
+
+< Can also be used as a |method|: >
+ ServerId()->remote_read()
+<
+ *remote_send()* *E241*
+remote_send({server}, {string} [, {idvar}])
+ Send the {string} to {server}. The {server} argument is a
+ string, also see |{server}|.
+
+ The string is sent as input keys and the function returns
+ immediately. At the Vim server the keys are not mapped
+ |:map|.
+
+ If {idvar} is present, it is taken as the name of a variable
+ and a {serverid} for later use with remote_read() is stored
+ there.
+
+ 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: >
+ :echo remote_send("gvim", ":DropAndReply " .. file, "serverid") ..
+ \ remote_read(serverid)
+
+ :autocmd NONE RemoteReply *
+ \ echo remote_read(expand("<amatch>"))
+ :echo remote_send("gvim", ":sleep 10 | echo " ..
+ \ 'server2client(expand("<client>"), "HELLO")<CR>')
+<
+ Can also be used as a |method|: >
+ ServerName()->remote_send(keys)
+<
+ *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.
+
+ Can also be used as a |method|: >
+ ServerName()->remote_startserver()
+
+< {only available when compiled with the |+clientserver| feature}
+
+remove({list}, {idx})
+remove({list}, {idx}, {end}) *remove()*
+ Without {end}: Remove the item at {idx} from |List| {list} and
+ return the item.
+ With {end}: Remove items from {idx} to {end} (inclusive) and
+ return a |List| with these items. When {idx} points to the same
+ item as {end} a list with one item is returned. When {end}
+ points to an item before {idx} this is an error.
+ See |list-index| for possible values of {idx} and {end}.
+ Returns zero on error.
+ Example: >
+ :echo "last item: " .. remove(mylist, -1)
+ :call remove(mylist, 0, 9)
+<
+ Use |delete()| to remove a file.
+
+ Can also be used as a |method|: >
+ mylist->remove(idx)
+
+remove({blob}, {idx})
+remove({blob}, {idx}, {end})
+ Without {end}: Remove the byte at {idx} from |Blob| {blob} and
+ return the byte.
+ With {end}: Remove bytes from {idx} to {end} (inclusive) and
+ return a |Blob| with these bytes. When {idx} points to the same
+ byte as {end} a |Blob| with one byte is returned. When {end}
+ points to a byte before {idx} this is an error.
+ Returns zero on error.
+ Example: >
+ :echo "last byte: " .. remove(myblob, -1)
+ :call remove(mylist, 0, 9)
+
+remove({dict}, {key})
+ Remove the entry from {dict} with key {key} and return it.
+ Example: >
+ :echo "removed " .. remove(dict, "one")
+< If there is no {key} in {dict} this is an error.
+ Returns zero on error.
+
+rename({from}, {to}) *rename()*
+ Rename the file by the name {from} to the name {to}. This
+ should also work to move files across file systems. The
+ result is a Number, which is 0 if the file was renamed
+ successfully, and non-zero when the renaming failed.
+ NOTE: If {to} exists it is overwritten without warning.
+ This function is not available in the |sandbox|.
+
+ Can also be used as a |method|: >
+ GetOldName()->rename(newname)
+
+repeat({expr}, {count}) *repeat()*
+ Repeat {expr} {count} times and return the concatenated
+ result. Example: >
+ :let separator = repeat('-', 80)
+< When {count} is zero or negative the result is empty.
+ When {expr} is a |List| or a |Blob| the result is {expr}
+ concatenated {count} times. Example: >
+ :let longlist = repeat(['a', 'b'], 3)
+< Results in ['a', 'b', 'a', 'b', 'a', 'b'].
+
+ Can also be used as a |method|: >
+ mylist->repeat(count)
+
+resolve({filename}) *resolve()* *E655*
+ On MS-Windows, when {filename} is a shortcut (a .lnk file),
+ returns the path the shortcut points to in a simplified form.
+ When {filename} is a symbolic link or junction point, return
+ the full path to the target. If the target of junction is
+ removed, return {filename}.
+ On Unix, repeat resolving symbolic links in all path
+ components of {filename} and return the simplified result.
+ To cope with link cycles, resolving of symbolic links is
+ stopped after 100 iterations.
+ On other systems, return the simplified {filename}.
+ The simplification step is done as by |simplify()|.
+ resolve() keeps a leading path component specifying the
+ current directory (provided the result is still a relative
+ path name) and also keeps a trailing path separator.
+
+ Can also be used as a |method|: >
+ GetName()->resolve()
+
+reverse({object}) *reverse()*
+ Reverse the order of items in {object} in-place.
+ {object} can be a |List| or a |Blob|.
+ Returns {object}.
+ Returns zero if {object} is not a List or a Blob.
+ If you want an object to remain unmodified make a copy first: >
+ :let revlist = reverse(copy(mylist))
+< Can also be used as a |method|: >
+ mylist->reverse()
+
+round({expr}) *round()*
+ Round off {expr} to the nearest integral value and return it
+ as a |Float|. If {expr} lies halfway between two integral
+ values, then use the larger one (away from zero).
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ echo round(0.456)
+< 0.0 >
+ echo round(4.5)
+< 5.0 >
+ echo round(-4.5)
+< -5.0
+
+ Can also be used as a |method|: >
+ Compute()->round()
+
+rubyeval({expr}) *rubyeval()*
+ Evaluate Ruby expression {expr} and return its result
+ converted to Vim data structures.
+ Numbers, floats and strings are returned as they are (strings
+ are copied though).
+ Arrays are represented as Vim |List| type.
+ Hashes are represented as Vim |Dictionary| type.
+ Other objects are represented as strings resulted from their
+ "Object#to_s" method.
+ Note that in a `:def` function local variables are not visible
+ to {expr}.
+
+ Can also be used as a |method|: >
+ GetRubyExpr()->rubyeval()
+
+< {only available when compiled with the |+ruby| feature}
+
+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.
+ Returns -1 when row or col is out of range.
+
+ Can also be used as a |method|: >
+ GetRow()->screenattr(col)
+
+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
+ command line. The top left position is row one, column one
+ The character excludes composing characters. For double-byte
+ encodings it may only be the first byte.
+ This is mainly to be used for testing.
+ Returns -1 when row or col is out of range.
+
+ Can also be used as a |method|: >
+ GetRow()->screenchar(col)
+
+screenchars({row}, {col}) *screenchars()*
+ The result is a |List| of Numbers. The first number is the same
+ as what |screenchar()| returns. Further numbers are
+ composing characters on top of the base character.
+ This is mainly to be used for testing.
+ Returns an empty List when row or col is out of range.
+
+ Can also be used as a |method|: >
+ GetRow()->screenchars(col)
+
+screencol() *screencol()*
+ The result is a Number, which is the current screen column of
+ the cursor. The leftmost column has number 1.
+ This function is mainly used for testing.
+
+ Note: Always returns the current screen column, thus if used
+ in a command (e.g. ":echo screencol()") it will return the
+ column inside the command line, which is 1 when the command is
+ executed. To get the cursor position in the file use one of
+ the following mappings: >
+ nnoremap <expr> GG ":echom " .. screencol() .. "\n"
+ nnoremap <silent> GG :echom screencol()<CR>
+ nnoremap GG <Cmd>echom screencol()<CR>
+<
+screenpos({winid}, {lnum}, {col}) *screenpos()*
+ The result is a Dict with the screen position of the text
+ character in window {winid} at buffer line {lnum} and column
+ {col}. {col} is a one-based byte index.
+ The Dict has these members:
+ row screen row
+ col first screen column
+ endcol last screen column
+ curscol cursor screen column
+ If the specified position is not visible, all values are zero.
+ The "endcol" value differs from "col" when the character
+ occupies more than one screen cell. E.g. for a Tab "col" can
+ be 1 and "endcol" can be 8.
+ The "curscol" value is where the cursor would be placed. For
+ a Tab it would be the same as "endcol", while for a double
+ width character it would be the same as "col".
+ The |conceal| feature is ignored here, the column numbers are
+ as if 'conceallevel' is zero. You can set the cursor to the
+ right position and use |screencol()| to get the value with
+ |conceal| taken into account.
+ If the position is in a closed fold the screen position of the
+ first character is returned, {col} is not used.
+ Returns an empty Dict if {winid} is invalid.
+
+ Can also be used as a |method|: >
+ GetWinid()->screenpos(lnum, col)
+
+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()|.
+
+screenstring({row}, {col}) *screenstring()*
+ The result is a String that contains the base character and
+ any composing characters at position [row, col] on the screen.
+ This is like |screenchars()| but returning a String with the
+ characters.
+ This is mainly to be used for testing.
+ Returns an empty String when row or col is out of range.
+
+ Can also be used as a |method|: >
+ GetRow()->screenstring(col)
+<
+ *search()*
+search({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
+ Search for regexp pattern {pattern}. The search starts at the
+ cursor position (you can use |cursor()| to set it).
+
+ When a match has been found its line number is returned.
+ If there is no match a 0 is returned and the cursor doesn't
+ move. No error message is given.
+
+ {flags} is a String, which can contain these character flags:
+ 'b' search Backward instead of forward
+ 'c' accept a match at the Cursor position
+ 'e' move to the End of the match
+ 'n' do Not move the cursor
+ 'p' return number of matching sub-Pattern (see below)
+ 's' Set the ' mark at the previous location of the cursor
+ 'w' Wrap around the end of the file
+ 'W' don't Wrap around the end of the file
+ 'z' start searching at the cursor column instead of zero
+ If neither 'w' or 'W' is given, the 'wrapscan' option applies.
+
+ If the 's' flag is supplied, the ' mark is set, only if the
+ cursor is moved. The 's' flag cannot be combined with the 'n'
+ flag.
+
+ 'ignorecase', 'smartcase' and 'magic' are used.
+
+ When the 'z' flag is not given, forward 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 after the match. Without the 'c' flag the next
+ search starts one column after the start of the match. This
+ matters for overlapping matches. See |cpo-c|. You can also
+ insert "\ze" to change where the match ends, see |/\ze|.
+
+ When searching backwards and the 'z' flag is given then the
+ search starts in column zero, thus no match in the current
+ line will be found (unless wrapping around the end of the
+ file).
+
+ When the {stopline} argument is given then the search stops
+ after searching this line. This is useful to restrict the
+ search to a range of lines. Examples: >
+ let match = search('(', 'b', line("w0"))
+ let end = search('END', '', line("w$"))
+< When {stopline} is used and it is not zero this also implies
+ that the search does not wrap around the end of the file.
+ A zero value is equal to not giving the argument.
+ *E1285* *E1286* *E1287* *E1288* *E1289*
+ When the {timeout} argument is given the search stops when
+ more than this many milliseconds have passed. Thus when
+ {timeout} is 500 the search stops after half a second.
+ The value must not be negative. A zero value is like not
+ giving the argument.
+ {only available when compiled with the |+reltime| feature}
+
+ If the {skip} expression is given it is evaluated with the
+ cursor positioned on the start of a match. If it evaluates to
+ non-zero this match is skipped. This can be used, for
+ example, to skip a match in a comment or a string.
+ {skip} can be a string, which is evaluated as an expression, a
+ function reference or a lambda.
+ When {skip} is omitted or empty, every match is accepted.
+ When evaluating {skip} causes an error the search is aborted
+ and -1 returned.
+ *search()-sub-match*
+ With the 'p' flag the returned value is one more than the
+ first sub-match in \(\). One if none of them matched but the
+ whole pattern did match.
+ To get the column number too use |searchpos()|.
+
+ The cursor will be positioned at the match, unless the 'n'
+ flag is used.
+
+ Example (goes over all files in the argument list): >
+ :let n = 1
+ :while n <= argc() " loop over all files in arglist
+ : exe "argument " .. n
+ : " start at the last char in the file and wrap for the
+ : " first search to find match at start of file
+ : normal G$
+ : let flags = "w"
+ : while search("foo", flags) > 0
+ : s/foo/bar/g
+ : let flags = "W"
+ : endwhile
+ : update " write the file if modified
+ : let n = n + 1
+ :endwhile
+<
+ Example for using some flags: >
+ :echo search('\<if\|\(else\)\|\(endif\)', 'ncpe')
+< This will search for the keywords "if", "else", and "endif"
+ under or after the cursor. Because of the 'p' flag, it
+ returns 1, 2, or 3 depending on which keyword is found, or 0
+ if the search fails. With the cursor on the first word of the
+ line:
+ if (foo == 0) | let foo = foo + 1 | endif ~
+ the function returns 1. Without the 'c' flag, the function
+ finds the "endif" and returns 3. The same thing happens
+ without the 'e' flag if the cursor is on the "f" of "if".
+ The 'n' flag tells the function not to move the cursor.
+
+ Can also be used as a |method|: >
+ GetPattern()->search()
+
+searchcount([{options}]) *searchcount()*
+ Get or update the last search count, like what is displayed
+ without the "S" flag in 'shortmess'. This works even if
+ 'shortmess' does contain the "S" flag.
+
+ This returns a |Dictionary|. The dictionary is empty if the
+ previous pattern was not set and "pattern" was not specified.
+
+ key type meaning ~
+ current |Number| current position of match;
+ 0 if the cursor position is
+ before the first match
+ exact_match |Boolean| 1 if "current" is matched on
+ "pos", otherwise 0
+ total |Number| total count of matches found
+ incomplete |Number| 0: search was fully completed
+ 1: recomputing was timed out
+ 2: max count exceeded
+
+ For {options} see further down.
+
+ To get the last search count when |n| or |N| was pressed, call
+ this function with `recompute: 0` . This sometimes returns
+ wrong information because |n| and |N|'s maximum count is 99.
+ If it exceeded 99 the result must be max count + 1 (100). If
+ you want to get correct information, specify `recompute: 1`: >
+
+ " result == maxcount + 1 (100) when many matches
+ let result = searchcount(#{recompute: 0})
+
+ " Below returns correct result (recompute defaults
+ " to 1)
+ let result = searchcount()
+<
+ The function is useful to add the count to 'statusline': >
+ function! LastSearchCount() abort
+ let result = searchcount(#{recompute: 0})
+ if empty(result)
+ return ''
+ endif
+ if result.incomplete ==# 1 " timed out
+ return printf(' /%s [?/??]', @/)
+ elseif result.incomplete ==# 2 " max count exceeded
+ if result.total > result.maxcount &&
+ \ result.current > result.maxcount
+ return printf(' /%s [>%d/>%d]', @/,
+ \ result.current, result.total)
+ elseif result.total > result.maxcount
+ return printf(' /%s [%d/>%d]', @/,
+ \ result.current, result.total)
+ endif
+ endif
+ return printf(' /%s [%d/%d]', @/,
+ \ result.current, result.total)
+ endfunction
+ let &statusline ..= '%{LastSearchCount()}'
+
+ " Or if you want to show the count only when
+ " 'hlsearch' was on
+ " let &statusline ..=
+ " \ '%{v:hlsearch ? LastSearchCount() : ""}'
+<
+ You can also update the search count, which can be useful in a
+ |CursorMoved| or |CursorMovedI| autocommand: >
+
+ autocmd CursorMoved,CursorMovedI *
+ \ let s:searchcount_timer = timer_start(
+ \ 200, function('s:update_searchcount'))
+ function! s:update_searchcount(timer) abort
+ if a:timer ==# s:searchcount_timer
+ call searchcount(#{
+ \ recompute: 1, maxcount: 0, timeout: 100})
+ redrawstatus
+ endif
+ endfunction
+<
+ This can also be used to count matched texts with specified
+ pattern in the current buffer using "pattern": >
+
+ " Count '\<foo\>' in this buffer
+ " (Note that it also updates search count)
+ let result = searchcount(#{pattern: '\<foo\>'})
+
+ " To restore old search count by old pattern,
+ " search again
+ call searchcount()
+<
+ {options} must be a |Dictionary|. It can contain:
+ key type meaning ~
+ recompute |Boolean| if |TRUE|, recompute the count
+ like |n| or |N| was executed.
+ otherwise returns the last
+ computed result (when |n| or
+ |N| was used when "S" is not
+ in 'shortmess', or this
+ function was called).
+ (default: |TRUE|)
+ pattern |String| recompute if this was given
+ and different with |@/|.
+ this works as same as the
+ below command is executed
+ before calling this function >
+ let @/ = pattern
+< (default: |@/|)
+ timeout |Number| 0 or negative number is no
+ timeout. timeout milliseconds
+ for recomputing the result
+ (default: 0)
+ maxcount |Number| 0 or negative number is no
+ limit. max count of matched
+ text while recomputing the
+ result. if search exceeded
+ total count, "total" value
+ becomes `maxcount + 1`
+ (default: 99)
+ pos |List| `[lnum, col, off]` value
+ when recomputing the result.
+ this changes "current" result
+ value. see |cursor()|,
+ |getpos()|
+ (default: cursor's position)
+
+ Can also be used as a |method|: >
+ GetSearchOpts()->searchcount()
+<
+searchdecl({name} [, {global} [, {thisblock}]]) *searchdecl()*
+ Search for the declaration of {name}.
+
+ With a non-zero {global} argument it works like |gD|, find
+ first match in the file. Otherwise it works like |gd|, find
+ first match in the function.
+
+ With a non-zero {thisblock} argument matches in a {} block
+ that ends before the cursor position are ignored. Avoids
+ finding variable declarations only valid in another scope.
+
+ Moves the cursor to the found match.
+ Returns zero for success, non-zero for failure.
+ Example: >
+ if searchdecl('myvar') == 0
+ echo getline('.')
+ endif
+<
+ Can also be used as a |method|: >
+ GetName()->searchdecl()
+<
+ *searchpair()*
+searchpair({start}, {middle}, {end} [, {flags} [, {skip}
+ [, {stopline} [, {timeout}]]]])
+ Search for the match of a nested start-end pair. This can be
+ used to find the "endif" that matches an "if", while other
+ if/endif pairs in between are ignored.
+ The search starts at the cursor. The default is to search
+ forward, include 'b' in {flags} to search backward.
+ If a match is found, the cursor is positioned at it and the
+ line number is returned. If no match is found 0 or -1 is
+ returned and the cursor doesn't move. No error message is
+ given.
+
+ {start}, {middle} and {end} are patterns, see |pattern|. They
+ must not contain \( \) pairs. Use of \%( \) is allowed. When
+ {middle} is not empty, it is found when searching from either
+ direction, but only when not in a nested start-end pair. A
+ typical use is: >
+ searchpair('\<if\>', '\<else\>', '\<endif\>')
+< By leaving {middle} empty the "else" is skipped.
+
+ {flags} 'b', 'c', 'n', 's', 'w' and 'W' are used like with
+ |search()|. Additionally:
+ 'r' Repeat until no more matches found; will find the
+ outer pair. Implies the 'W' flag.
+ 'm' Return number of matches instead of line number with
+ the match; will be > 1 when 'r' is used.
+ Note: it's nearly always a good idea to use the 'W' flag, to
+ avoid wrapping around the end of the file.
+
+ When a match for {start}, {middle} or {end} is found, the
+ {skip} expression is evaluated with the cursor positioned on
+ the start of the match. It should return non-zero if this
+ match is to be skipped. E.g., because it is inside a comment
+ or a string.
+ 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.
+ In a `:def` function when the {skip} argument is a string
+ constant it is compiled into instructions.
+
+ For {stopline} and {timeout} see |search()|.
+
+ The value of 'ignorecase' is used. 'magic' is ignored, the
+ patterns are used like it's on.
+
+ The search starts exactly at the cursor. A match with
+ {start}, {middle} or {end} at the next character, in the
+ direction of searching, is the first one found. Example: >
+ if 1
+ if 2
+ endif 2
+ endif 1
+< When starting at the "if 2", with the cursor on the "i", and
+ searching forwards, the "endif 2" is found. When starting on
+ the character just before the "if 2", the "endif 1" will be
+ found. That's because the "if 2" will be found first, and
+ then this is considered to be a nested if/endif from "if 2" to
+ "endif 2".
+ When searching backwards and {end} is more than one character,
+ it may be useful to put "\zs" at the end of the pattern, so
+ that when the cursor is inside a match with the end it finds
+ the matching start.
+
+ Example, to find the "endif" command in a Vim script: >
+
+ :echo searchpair('\<if\>', '\<el\%[seif]\>', '\<en\%[dif]\>', 'W',
+ \ 'getline(".") =~ "^\\s*\""')
+
+< The cursor must be at or after the "if" for which a match is
+ to be found. Note that single-quote strings are used to avoid
+ having to double the backslashes. The skip expression only
+ catches comments at the start of a line, not after a command.
+ Also, a word "en" or "if" halfway a line is considered a
+ match.
+ Another example, to search for the matching "{" of a "}": >
+
+ :echo searchpair('{', '', '}', 'bW')
+
+< This works when the cursor is at or before the "}" for which a
+ match is to be found. To reject matches that syntax
+ highlighting recognized as strings: >
+
+ :echo searchpair('{', '', '}', 'bW',
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')
+<
+ *searchpairpos()*
+searchpairpos({start}, {middle}, {end} [, {flags} [, {skip}
+ [, {stopline} [, {timeout}]]]])
+ Same as |searchpair()|, but returns a |List| with the line and
+ column position of the match. The first element of the |List|
+ is the line number and the second element is the byte index of
+ the column position of the match. If no match is found,
+ returns [0, 0]. >
+
+ :let [lnum,col] = searchpairpos('{', '', '}', 'n')
+<
+ See |match-parens| for a bigger and more useful example.
+
+ *searchpos()*
+searchpos({pattern} [, {flags} [, {stopline} [, {timeout} [, {skip}]]]])
+ Same as |search()|, but returns a |List| with the line and
+ column position of the match. The first element of the |List|
+ is the line number and the second element is the byte index of
+ the column position of the match. If no match is found,
+ returns [0, 0].
+ Example: >
+ :let [lnum, col] = searchpos('mypattern', 'n')
+
+< When the 'p' flag is given then there is an extra item with
+ the sub-pattern match number |search()-sub-match|. Example: >
+ :let [lnum, col, submatch] = searchpos('\(\l\)\|\(\u\)', 'np')
+< In this example "submatch" is 2 when a lowercase letter is
+ found |/\l|, 3 when an uppercase letter is found |/\u|.
+
+ Can also be used as a |method|: >
+ GetPattern()->searchpos()
+
+server2client({clientid}, {string}) *server2client()*
+ Send a reply string to {clientid}. The most recent {clientid}
+ that sent a string can be retrieved with expand("<client>").
+ {only available when compiled with the |+clientserver| feature}
+ Returns zero for success, -1 for failure.
+ Note:
+ This id has to be stored before the next command can be
+ received. I.e. before returning from the received command and
+ before calling any commands that waits for input.
+ See also |clientserver|.
+ Example: >
+ :echo server2client(expand("<client>"), "HELLO")
+
+< Can also be used as a |method|: >
+ GetClientId()->server2client(string)
+<
+serverlist() *serverlist()*
+ Return a list of available server names, one per line.
+ When there are no servers or the information is not available
+ an empty string is returned. See also |clientserver|.
+ {only available when compiled with the |+clientserver| feature}
+ Example: >
+ :echo serverlist()
+<
+setbufline({buf}, {lnum}, {text}) *setbufline()*
+ Set line {lnum} to {text} in buffer {buf}. This works like
+ |setline()| for the specified buffer.
+
+ This function works only for loaded buffers. First call
+ |bufload()| if needed.
+
+ To insert lines use |appendbufline()|.
+ Any text properties in {lnum} are cleared.
+
+ {text} can be a string to set one line, or a List of strings
+ to set multiple lines. If the List extends below the last
+ line then those lines are added. If the List is empty then
+ nothing is changed and zero is returned.
+
+ For the use of {buf}, see |bufname()| above.
+
+ {lnum} is used like with |setline()|.
+ Use "$" to refer to the last line in buffer {buf}.
+ When {lnum} is just below the last line the {text} will be
+ added below the last line.
+
+ When {buf} is not a valid buffer, the buffer is not loaded or
+ {lnum} is not valid then 1 is returned. In |Vim9| script an
+ error is given.
+ On success 0 is returned.
+
+ Can also be used as a |method|, the base is passed as the
+ third argument: >
+ GetText()->setbufline(buf, lnum)
+
+setbufvar({buf}, {varname}, {val}) *setbufvar()*
+ Set option or local variable {varname} in buffer {buf} to
+ {val}.
+ This also works for a global or local window option, but it
+ doesn't work for a global or local window variable.
+ For a local window option the global value is unchanged.
+ For the use of {buf}, see |bufname()| above.
+ The {varname} argument is a string.
+ Note that the variable name without "b:" must be used.
+ Examples: >
+ :call setbufvar(1, "&mod", 1)
+ :call setbufvar("todo", "myvar", "foobar")
+< This function is not available in the |sandbox|.
+
+ Can also be used as a |method|, the base is passed as the
+ third argument: >
+ GetValue()->setbufvar(buf, varname)
+
+
+setcellwidths({list}) *setcellwidths()*
+ Specify overrides for cell widths of character ranges. This
+ tells Vim how wide characters are when displayed in the
+ terminal, counted in screen cells. The values override
+ 'ambiwidth'. Example: >
+ call setcellwidths([
+ \ [0x111, 0x111, 1],
+ \ [0x2194, 0x2199, 2],
+ \ ])
+
+< The {list} argument is a List of Lists with each three
+ numbers: [{low}, {high}, {width}]. *E1109* *E1110*
+ {low} and {high} can be the same, in which case this refers to
+ one character. Otherwise it is the range of characters from
+ {low} to {high} (inclusive). *E1111* *E1114*
+ Only characters with value 0x80 and higher can be used.
+
+ {width} must be either 1 or 2, indicating the character width
+ in screen cells. *E1112*
+ An error is given if the argument is invalid, also when a
+ range overlaps with another. *E1113*
+
+ If the new value causes 'fillchars' or 'listchars' to become
+ invalid it is rejected and an error is given.
+
+ To clear the overrides pass an empty {list}: >
+ setcellwidths([]);
+
+< You can use the script $VIMRUNTIME/tools/emoji_list.vim to see
+ the effect for known emoji characters. Move the cursor
+ through the text to check if the cell widths of your terminal
+ match with what Vim knows about each emoji. If it doesn't
+ look right you need to adjust the {list} argument.
+
+
+setcharpos({expr}, {list}) *setcharpos()*
+ Same as |setpos()| but uses the specified column number as the
+ character index instead of the byte index in the line.
+
+ Example:
+ With the text "여보세요" in line 8: >
+ call setcharpos('.', [0, 8, 4, 0])
+< positions the cursor on the fourth character '요'. >
+ call setpos('.', [0, 8, 4, 0])
+< positions the cursor on the second character '보'.
+
+ Can also be used as a |method|: >
+ GetPosition()->setcharpos('.')
+
+setcharsearch({dict}) *setcharsearch()*
+ Set the current character search information to {dict},
+ which contains one or more of the following entries:
+
+ char character which will be used for a subsequent
+ |,| or |;| command; an empty string clears the
+ character search
+ forward direction of character search; 1 for forward,
+ 0 for backward
+ until type of character search; 1 for a |t| or |T|
+ character search, 0 for an |f| or |F|
+ character search
+
+ This can be useful to save/restore a user's character search
+ from a script: >
+ :let prevsearch = getcharsearch()
+ :" Perform a command which clobbers user's search
+ :call setcharsearch(prevsearch)
+< Also see |getcharsearch()|.
+
+ Can also be used as a |method|: >
+ SavedSearch()->setcharsearch()
+
+setcmdline({str} [, {pos}]) *setcmdline()*
+ Set the command line to {str} and set the cursor position to
+ {pos}.
+ If {pos} is omitted, the cursor is positioned after the text.
+ Returns 0 when successful, 1 when not editing the command
+ line.
+
+ Can also be used as a |method|: >
+ GetText()->setcmdline()
+
+setcmdpos({pos}) *setcmdpos()*
+ Set the cursor position in the command line to byte position
+ {pos}. The first position is 1.
+ Use |getcmdpos()| to obtain the current position.
+ Only works while editing the command line, thus you must use
+ |c_CTRL-\_e|, |c_CTRL-R_=| or |c_CTRL-R_CTRL-R| with '='. For
+ |c_CTRL-\_e| and |c_CTRL-R_CTRL-R| with '=' the position is
+ set after the command line is set to the expression. For
+ |c_CTRL-R_=| it is set after evaluating the expression but
+ before inserting the resulting text.
+ When the number is too big the cursor is put at the end of the
+ line. A number smaller than one has undefined results.
+ Returns 0 when successful, 1 when not editing the command
+ line.
+
+ Can also be used as a |method|: >
+ GetPos()->setcmdpos()
+
+setcursorcharpos({lnum}, {col} [, {off}]) *setcursorcharpos()*
+setcursorcharpos({list})
+ Same as |cursor()| but uses the specified column number as the
+ character index instead of the byte index in the line.
+
+ Example:
+ With the text "여보세요" in line 4: >
+ call setcursorcharpos(4, 3)
+< positions the cursor on the third character '세'. >
+ call cursor(4, 3)
+< positions the cursor on the first character '여'.
+
+ Can also be used as a |method|: >
+ GetCursorPos()->setcursorcharpos()
+
+
+setenv({name}, {val}) *setenv()*
+ Set environment variable {name} to {val}. Example: >
+ call setenv('HOME', '/home/myhome')
+
+< When {val} is |v:null| the environment variable is deleted.
+ See also |expr-env|.
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetPath()->setenv('PATH')
+
+setfperm({fname}, {mode}) *setfperm()* *chmod*
+ Set the file permissions for {fname} to {mode}.
+ {mode} must be a string with 9 characters. It is of the form
+ "rwxrwxrwx", where each group of "rwx" flags represent, in
+ turn, the permissions of the owner of the file, the group the
+ file belongs to, and other users. A '-' character means the
+ permission is off, any other character means on. Multi-byte
+ characters are not supported.
+
+ For example "rw-r-----" means read-write for the user,
+ readable by the group, not accessible by others. "xx-x-----"
+ would do the same thing.
+
+ Returns non-zero for success, zero for failure.
+
+ Can also be used as a |method|: >
+ GetFilename()->setfperm(mode)
+<
+ To read permissions see |getfperm()|.
+
+
+setline({lnum}, {text}) *setline()*
+ Set line {lnum} of the current buffer to {text}. To insert
+ lines use |append()|. To set lines in another buffer use
+ |setbufline()|. Any text properties in {lnum} are cleared.
+
+ {lnum} is used like with |getline()|.
+ When {lnum} is just below the last line the {text} will be
+ added below the last line.
+ {text} can be any type or a List of any type, each item is
+ converted to a String. When {text} is an empty List then
+ nothing is changed and FALSE is returned.
+
+ If this succeeds, FALSE is returned. If this fails (most likely
+ because {lnum} is invalid) TRUE is returned.
+ In |Vim9| script an error is given if {lnum} is invalid.
+
+ Example: >
+ :call setline(5, strftime("%c"))
+
+< When {text} is a |List| then line {lnum} and following lines
+ will be set to the items in the list. Example: >
+ :call setline(5, ['aaa', 'bbb', 'ccc'])
+< This is equivalent to: >
+ :for [n, l] in [[5, 'aaa'], [6, 'bbb'], [7, 'ccc']]
+ : call setline(n, l)
+ :endfor
+
+< Note: The '[ and '] marks are not set.
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetText()->setline(lnum)
+
+setloclist({nr}, {list} [, {action} [, {what}]]) *setloclist()*
+ Create or replace or add to the location list for 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
+ modified. For an invalid window number {nr}, -1 is returned.
+ Otherwise, same as |setqflist()|.
+ Also see |location-list|.
+
+ For {action} see |setqflist-action|.
+
+ 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}.
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetLoclist()->setloclist(winnr)
+
+setmatches({list} [, {win}]) *setmatches()*
+ Restores a list of matches saved by |getmatches()| for the
+ current window. Returns 0 if successful, otherwise -1. All
+ current matches are cleared before the list is restored. See
+ example for |getmatches()|.
+ If {win} is specified, use the window with this number or
+ window ID instead of the current window.
+
+ Can also be used as a |method|: >
+ GetMatches()->setmatches()
+<
+ *setpos()*
+setpos({expr}, {list})
+ Set the position for String {expr}. Possible values:
+ . the cursor
+ 'x mark x
+
+ {list} must be a |List| with four or five numbers:
+ [bufnum, lnum, col, off]
+ [bufnum, lnum, col, off, curswant]
+
+ "bufnum" is the buffer number. Zero can be used for the
+ 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
+ column is 1. Use a zero "lnum" to delete a mark. If "col" is
+ smaller than 1 then 1 is used. To use the character count
+ instead of the byte count, use |setcharpos()|.
+
+ The "off" number is only used when 'virtualedit' is set. Then
+ it is the offset in screen columns from the start of the
+ character. E.g., a position within a <Tab> or after the last
+ character.
+
+ The "curswant" number is only used when setting the cursor
+ position. It sets the preferred column for when moving the
+ cursor vertically. When the "curswant" number is missing the
+ preferred column is not set. When it is present and setting a
+ mark position it is not used.
+
+ Note that for '< and '> changing the line number may result in
+ the marks to be effectively be swapped, so that '< is always
+ before '>.
+
+ Returns 0 when the position could be set, -1 otherwise.
+ An error message is given if {expr} is invalid.
+
+ Also see |setcharpos()|, |getpos()| and |getcurpos()|.
+
+ This does not restore the preferred column for moving
+ vertically; if you set the cursor position with this, |j| and
+ |k| motions will jump to previous columns! Use |cursor()| to
+ also set the preferred column. Also see the "curswant" key in
+ |winrestview()|.
+
+ Can also be used as a |method|: >
+ GetPosition()->setpos('.')
+
+setqflist({list} [, {action} [, {what}]]) *setqflist()*
+ Create or replace or add to the quickfix list.
+
+ If the optional {what} dictionary argument is supplied, then
+ only the items listed in {what} are set. The first {list}
+ argument is ignored. See below for the supported items in
+ {what}.
+ *setqflist-what*
+ When {what} is not present, the items in {list} are used. 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
+ filename name of a file; only used when "bufnr" is not
+ present or it is invalid.
+ module name of a module; if given it will be used in
+ quickfix error window instead of the filename.
+ lnum line number in the file
+ end_lnum end of lines, if the item spans multiple lines
+ pattern search pattern used to locate the error
+ col column number
+ vcol when non-zero: "col" is visual column
+ when zero: "col" is byte index
+ end_col end column, if the item spans multiple columns
+ 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
+ locate a matching error line.
+ If the "filename" and "bufnr" entries are not present or
+ neither the "lnum" or "pattern" entries are present, then the
+ 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.
+
+ {action} values: *setqflist-action* *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 "$".
+
+ The following items can be specified in dictionary {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.
+ See |quickfix-parse|
+ id quickfix list identifier |quickfix-ID|
+ idx index of the current entry in the quickfix
+ list specified by 'id' or 'nr'. If set to '$',
+ then the last entry in the list is set as the
+ current entry. See |quickfix-index|
+ 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.
+ See |quickfix-parse|
+ nr list number in the quickfix stack; zero
+ means the current quickfix list and "$" means
+ the last quickfix list.
+ quickfixtextfunc
+ function to get the text to display in the
+ quickfix window. The value can be the name of
+ a function or a funcref or a lambda. Refer to
+ |quickfix-window-function| for an explanation
+ of how to write the function and an example.
+ title quickfix list title text. See |quickfix-title|
+ 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.
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetErrorlist()->setqflist()
+<
+ *setreg()*
+setreg({regname}, {value} [, {options}])
+ Set the register {regname} to {value}.
+ If {regname} is "" or "@", the unnamed register '"' is used.
+ The {regname} argument is a string. In |Vim9-script|
+ {regname} must be one character.
+
+ {value} may be any value returned by |getreg()| or
+ |getreginfo()|, including a |List| or |Dict|.
+ If {options} contains "a" or {regname} is upper case,
+ then the value is appended.
+
+ {options} can also contain a register type specification:
+ "c" or "v" |characterwise| mode
+ "l" or "V" |linewise| mode
+ "b" or "<CTRL-V>" |blockwise-visual| mode
+ If a number immediately follows "b" or "<CTRL-V>" then this is
+ 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 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
+ 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
+ items act like empty strings.
+
+ Examples: >
+ :call setreg(v:register, @*)
+ :call setreg('*', @%, 'ac')
+ :call setreg('a', "1\n2\n3", 'b5')
+ :call setreg('"', { 'points_to': 'a'})
+
+< This example shows using the functions to save and restore a
+ register: >
+ :let var_a = getreginfo()
+ :call setreg('a', var_a)
+< or: >
+ :let var_a = getreg('a', 1, 1)
+ :let var_amode = getregtype('a')
+ ....
+ :call setreg('a', var_a, var_amode)
+< 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|.
+
+ You can also change the type of a register by appending
+ nothing: >
+ :call setreg('a', '', 'al')
+
+< Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetText()->setreg('a')
+
+settabvar({tabnr}, {varname}, {val}) *settabvar()*
+ Set tab-local variable {varname} to {val} in tab page {tabnr}.
+ |t:var|
+ The {varname} argument is a string.
+ Note that autocommands are blocked, side effects may not be
+ triggered, e.g. when setting 'filetype'.
+ Note that the variable name without "t:" must be used.
+ Tabs are numbered starting with one.
+ This function is not available in the |sandbox|.
+
+ Can also be used as a |method|, the base is passed as the
+ third argument: >
+ GetValue()->settabvar(tab, name)
+
+settabwinvar({tabnr}, {winnr}, {varname}, {val}) *settabwinvar()*
+ Set option or local variable {varname} in window {winnr} to
+ {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.
+ Note that autocommands are blocked, side effects may not be
+ triggered, e.g. when setting 'filetype' or 'syntax'.
+ This also works for a global or local buffer option, but it
+ doesn't work for a global or local buffer variable.
+ For a local buffer option the global value is unchanged.
+ Note that the variable name without "w:" must be used.
+ Examples: >
+ :call settabwinvar(1, 1, "&list", 0)
+ :call settabwinvar(3, 2, "myvar", "foobar")
+< This function is not available in the |sandbox|.
+
+ Can also be used as a |method|, the base is passed as the
+ fourth argument: >
+ GetValue()->settabwinvar(tab, winnr, name)
+
+settagstack({nr}, {dict} [, {action}]) *settagstack()*
+ Modify the tag stack of the window {nr} using {dict}.
+ {nr} can be the window number or the |window-ID|.
+
+ For a list of supported items in {dict}, refer to
+ |gettagstack()|. "curidx" takes effect before changing the tag
+ stack.
+ *E962*
+ How the tag stack is modified depends on the {action}
+ argument:
+ - If {action} is not present or is set to 'r', then the tag
+ stack is replaced.
+ - If {action} is set to 'a', then new entries from {dict} are
+ pushed (added) onto the tag stack.
+ - If {action} is set to 't', then all the entries from the
+ current entry in the tag stack or "curidx" in {dict} are
+ removed and then new entries are pushed to the stack.
+
+ The current index is set to one after the length of the tag
+ stack after the modification.
+
+ Returns zero for success, -1 for failure.
+
+ Examples (for more examples see |tagstack-examples|):
+ Empty the tag stack of window 3: >
+ call settagstack(3, {'items' : []})
+
+< Save and restore the tag stack: >
+ let stack = gettagstack(1003)
+ " do something else
+ call settagstack(1003, stack)
+ unlet stack
+<
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetStack()->settagstack(winnr)
+
+setwinvar({winnr}, {varname}, {val}) *setwinvar()*
+ Like |settabwinvar()| for the current tab page.
+ Examples: >
+ :call setwinvar(1, "&list", 0)
+ :call setwinvar(2, "myvar", "foobar")
+
+< Can also be used as a |method|, the base is passed as the
+ third argument: >
+ GetValue()->setwinvar(winnr, name)
+
+sha256({string}) *sha256()*
+ Returns a String with 64 hex characters, which is the SHA256
+ checksum of {string}.
+
+ Can also be used as a |method|: >
+ GetText()->sha256()
+
+< {only available when compiled with the |+cryptv| feature}
+
+shellescape({string} [, {special}]) *shellescape()*
+ Escape {string} for use as a shell command argument.
+ When the 'shell' contains powershell (MS-Windows) or pwsh
+ (MS-Windows, Linux, and macOS) then it will enclose {string}
+ in single quotes and will double up all internal single
+ quotes.
+ On MS-Windows, when 'shellslash' is not set, it will enclose
+ {string} in double quotes and double all double quotes within
+ {string}.
+ 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.
+
+ 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.
+
+ The "\" character will be escaped when 'shell' contains "fish"
+ in the tail. That is because for fish "\" is used as an escape
+ character inside single quotes.
+
+ Example of use with a |:!| command: >
+ :exe '!dir ' .. shellescape(expand('<cfile>'), 1)
+< This results in a directory listing for the file under the
+ cursor. Example of use with |system()|: >
+ :call system("chmod +w -- " .. shellescape(expand("%")))
+< See also |::S|.
+
+ Can also be used as a |method|: >
+ GetCommand()->shellescape()
+
+shiftwidth([{col}]) *shiftwidth()*
+ Returns the effective value of 'shiftwidth'. This is the
+ 'shiftwidth' value unless it is zero, in which case it is the
+ 'tabstop' value. This function was introduced with patch
+ 7.3.694 in 2012, everybody should have it by now (however it
+ did not allow for the optional {col} argument until 8.1.542).
+
+ When there is one argument {col} this is used as column number
+ for which to return the 'shiftwidth' value. This matters for the
+ 'vartabstop' feature. If the 'vartabstop' setting is enabled and
+ no {col} argument is given, column 1 will be assumed.
+
+ Can also be used as a |method|: >
+ GetColumn()->shiftwidth()
+
+sign_ functions are documented here: |sign-functions-details|
+
+
+simplify({filename}) *simplify()*
+ Simplify the file name as much as possible without changing
+ the meaning. Shortcuts (on MS-Windows) or symbolic links (on
+ Unix) are not resolved. If the first path component in
+ {filename} designates the current directory, this will be
+ valid for the result as well. A trailing path separator is
+ not removed either. On Unix "//path" is unchanged, but
+ "///path" is simplified to "/path" (this follows the Posix
+ standard).
+ Example: >
+ simplify("./dir/.././/file/") == "./file/"
+< Note: The combination "dir/.." is only removed if "dir" is
+ a searchable directory or does not exist. On Unix, it is also
+ removed when "dir" is a symbolic link within the same
+ directory. In order to resolve all the involved symbolic
+ links before simplifying the path name, use |resolve()|.
+
+ Can also be used as a |method|: >
+ GetName()->simplify()
+
+sin({expr}) *sin()*
+ Return the sine of {expr}, measured in radians, as a |Float|.
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo sin(100)
+< -0.506366 >
+ :echo sin(-4.01)
+< 0.763301
+
+ Can also be used as a |method|: >
+ Compute()->sin()
+
+
+sinh({expr}) *sinh()*
+ Return the hyperbolic sine of {expr} as a |Float| in the range
+ [-inf, inf].
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo sinh(0.5)
+< 0.521095 >
+ :echo sinh(-0.9)
+< -1.026517
+
+ Can also be used as a |method|: >
+ Compute()->sinh()
+
+
+slice({expr}, {start} [, {end}]) *slice()*
+ Similar to using a |slice| "expr[start : end]", but "end" is
+ used exclusive. And for a string the indexes are used as
+ character indexes instead of byte indexes, like in
+ |vim9script|. Also, composing characters are not counted.
+ When {end} is omitted the slice continues to the last item.
+ When {end} is -1 the last item is omitted.
+ Returns an empty value if {start} or {end} are invalid.
+
+ Can also be used as a |method|: >
+ GetList()->slice(offset)
+
+
+sort({list} [, {how} [, {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))
+
+< When {how} is omitted or is a string, then sort() uses the
+ string representation of each item to sort on. Numbers sort
+ after Strings, |Lists| after Numbers. For sorting text in the
+ current buffer use |:sort|.
+
+ When {how} is given and it is 'i' then case is ignored.
+ In legacy script, for backwards compatibility, the value one
+ can be used to ignore case. Zero means to not ignore case.
+
+ When {how} is given and it is 'l' then the current collation
+ locale is used for ordering. Implementation details: strcoll()
+ is used to compare strings. See |:language| check or set the
+ collation locale. |v:collate| can also be used to check the
+ current locale. Sorting using the locale typically ignores
+ case. Example: >
+ " ö is sorted similarly to o with English locale.
+ :language collate en_US.UTF8
+ :echo sort(['n', 'o', 'O', 'ö', 'p', 'z'], 'l')
+< ['n', 'o', 'O', 'ö', 'p', 'z'] ~
+>
+ " ö is sorted after z with Swedish locale.
+ :language collate sv_SE.UTF8
+ :echo sort(['n', 'o', 'O', 'ö', 'p', 'z'], 'l')
+< ['n', 'o', 'O', 'p', 'z', 'ö'] ~
+ This does not work properly on Mac.
+
+ When {how} 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
+ Funcrefs will be considered as being 0).
+
+ When {how} is given and it is 'N' then all items will be
+ sorted numerical. This is like 'n' but a string containing
+ digits will be used as the number they represent.
+
+ When {how} is given and it is 'f' then all items will be
+ sorted numerical. All values must be a Number or a Float.
+
+ When {how} is a |Funcref| or a function name, this function
+ is called to compare items. The function is invoked with two
+ items as argument and must return zero if they are equal, 1 or
+ bigger if the first one sorts after the second one, -1 or
+ smaller if the first one sorts before the second one.
+
+ {dict} is for functions with the "dict" attribute. It will be
+ used to set the local variable "self". |Dictionary-function|
+
+ The sort is stable, items which compare equal (as number or as
+ string) will keep their relative position. E.g., when sorting
+ on numbers, text strings will sort next to each other, in the
+ same order as they were originally.
+
+ Can also be used as a |method|: >
+ mylist->sort()
+
+< Also see |uniq()|.
+
+ Example: >
+ func MyCompare(i1, i2)
+ return a:i1 == a:i2 ? 0 : a:i1 > a:i2 ? 1 : -1
+ endfunc
+ eval mylist->sort("MyCompare")
+< A shorter compare version for this specific simple case, which
+ ignores overflow: >
+ func MyCompare(i1, i2)
+ return a:i1 - a:i2
+ endfunc
+< For a simple expression you can use a lambda: >
+ eval mylist->sort({i1, i2 -> i1 - i2})
+<
+sound_clear() *sound_clear()*
+ Stop playing all sounds.
+
+ On some Linux systems you may need the libcanberra-pulse
+ package, otherwise sound may not stop.
+
+ {only available when compiled with the |+sound| feature}
+
+ *sound_playevent()*
+sound_playevent({name} [, {callback}])
+ Play a sound identified by {name}. Which event names are
+ supported depends on the system. Often the XDG sound names
+ are used. On Ubuntu they may be found in
+ /usr/share/sounds/freedesktop/stereo. Example: >
+ call sound_playevent('bell')
+< On MS-Windows, {name} can be SystemAsterisk, SystemDefault,
+ SystemExclamation, SystemExit, SystemHand, SystemQuestion,
+ SystemStart, SystemWelcome, etc.
+ On macOS, {name} refers to files located in
+ /System/Library/Sounds (e.g. "Tink"). It will also work for
+ custom installed sounds in folders like ~/Library/Sounds.
+
+ When {callback} is specified it is invoked when the sound is
+ finished. The first argument is the sound ID, the second
+ argument is the status:
+ 0 sound was played to the end
+ 1 sound was interrupted
+ 2 error occurred after sound started
+ Example: >
+ func Callback(id, status)
+ echomsg "sound " .. a:id .. " finished with " .. a:status
+ endfunc
+ call sound_playevent('bell', 'Callback')
+
+< MS-Windows: {callback} doesn't work for this function.
+
+ Returns the sound ID, which can be passed to `sound_stop()`.
+ Returns zero if the sound could not be played.
+
+ Can also be used as a |method|: >
+ GetSoundName()->sound_playevent()
+
+< {only available when compiled with the |+sound| feature}
+
+ *sound_playfile()*
+sound_playfile({path} [, {callback}])
+ Like `sound_playevent()` but play sound file {path}. {path}
+ must be a full path. On Ubuntu you may find files to play
+ with this command: >
+ :!find /usr/share/sounds -type f | grep -v index.theme
+
+< Can also be used as a |method|: >
+ GetSoundPath()->sound_playfile()
+
+< {only available when compiled with the |+sound| feature}
+
+
+sound_stop({id}) *sound_stop()*
+ Stop playing sound {id}. {id} must be previously returned by
+ `sound_playevent()` or `sound_playfile()`.
+
+ On some Linux systems you may need the libcanberra-pulse
+ package, otherwise sound may not stop.
+
+ On MS-Windows, this does not work for event sound started by
+ `sound_playevent()`. To stop event sounds, use `sound_clear()`.
+
+ Can also be used as a |method|: >
+ soundid->sound_stop()
+
+< {only available when compiled with the |+sound| feature}
+
+ *soundfold()*
+soundfold({word})
+ Return the sound-folded equivalent of {word}. Uses the first
+ language in 'spelllang' for the current window that supports
+ soundfolding. 'spell' must be set. When no sound folding is
+ possible the {word} is returned unmodified.
+ This can be used for making spelling suggestions. Note that
+ the method can be quite slow.
+
+ Can also be used as a |method|: >
+ GetWord()->soundfold()
+<
+ *spellbadword()*
+spellbadword([{sentence}])
+ Without argument: The result is the badly spelled word under
+ or after the cursor. The cursor is moved to the start of the
+ bad word. When no bad word is found in the cursor line the
+ result is an empty string and the cursor doesn't move.
+
+ With argument: The result is the first word in {sentence} that
+ is badly spelled. If there are no spelling mistakes the
+ result is an empty string.
+
+ The return value is a list with two items:
+ - The badly spelled word or an empty string.
+ - The type of the spelling error:
+ "bad" spelling mistake
+ "rare" rare word
+ "local" word only valid in another region
+ "caps" word should start with Capital
+ Example: >
+ echo spellbadword("the quik brown fox")
+< ['quik', 'bad'] ~
+
+ The spelling information for the current window and the value
+ of 'spelllang' are used.
+
+ Can also be used as a |method|: >
+ GetText()->spellbadword()
+<
+ *spellsuggest()*
+spellsuggest({word} [, {max} [, {capital}]])
+ Return a |List| with spelling suggestions to replace {word}.
+ When {max} is given up to this number of suggestions are
+ returned. Otherwise up to 25 suggestions are returned.
+
+ When the {capital} argument is given and it's non-zero only
+ suggestions with a leading capital will be given. Use this
+ after a match with 'spellcapcheck'.
+
+ {word} can be a badly spelled word followed by other text.
+ This allows for joining two words that were split. The
+ suggestions also include the following text, thus you can
+ replace a line.
+
+ {word} may also be a good word. Similar words will then be
+ returned. {word} itself is not included in the suggestions,
+ although it may appear capitalized.
+
+ The spelling information for the current window is used. The
+ values of 'spelllang' and 'spellsuggest' are used.
+
+ Can also be used as a |method|: >
+ GetWord()->spellsuggest()
+
+split({string} [, {pattern} [, {keepempty}]]) *split()*
+ Make a |List| out of {string}. When {pattern} is omitted or
+ empty each white-separated sequence of characters becomes an
+ item.
+ Otherwise the string is split where {pattern} matches,
+ removing the matched characters. 'ignorecase' is not used
+ here, add \c to ignore case. |/\c|
+ When the first or last item is empty it is omitted, unless the
+ {keepempty} argument is given and it's non-zero.
+ Other empty items are kept when {pattern} matches at least one
+ character or when {keepempty} is non-zero.
+ Example: >
+ :let words = split(getline('.'), '\W\+')
+< To split a string in individual characters: >
+ :for c in split(mystring, '\zs')
+< If you want to keep the separator you can also use '\zs' at
+ the end of the pattern: >
+ :echo split('abc:def:ghi', ':\zs')
+< ['abc:', 'def:', 'ghi'] ~
+ Splitting a table where the first element can be empty: >
+ :let items = split(line, ':', 1)
+< The opposite function is |join()|.
+
+ Can also be used as a |method|: >
+ GetString()->split()
+
+sqrt({expr}) *sqrt()*
+ Return the non-negative square root of Float {expr} as a
+ |Float|.
+ {expr} must evaluate to a |Float| or a |Number|. When {expr}
+ is negative the result is NaN (Not a Number). Returns 0.0 if
+ {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo sqrt(100)
+< 10.0 >
+ :echo sqrt(-4.01)
+< nan
+ "nan" may be different, it depends on system libraries.
+
+ Can also be used as a |method|: >
+ Compute()->sqrt()
+
+
+srand([{expr}]) *srand()*
+ Initialize seed used by |rand()|:
+ - If {expr} is not given, seed values are initialized by
+ reading from /dev/urandom, if possible, or using time(NULL)
+ a.k.a. epoch time otherwise; this only has second accuracy.
+ - If {expr} is given it must be a Number. It is used to
+ initialize the seed values. This is useful for testing or
+ when a predictable sequence is intended.
+
+ Examples: >
+ :let seed = srand()
+ :let seed = srand(userinput)
+ :echo rand(seed)
+
+state([{what}]) *state()*
+ Return a string which contains characters indicating the
+ current state. Mostly useful in callbacks that want to do
+ work that may not always be safe. Roughly this works like:
+ - callback uses state() to check if work is safe to do.
+ Yes: then do it right away.
+ No: add to work queue and add a |SafeState| and/or
+ |SafeStateAgain| autocommand (|SafeState| triggers at
+ toplevel, |SafeStateAgain| triggers after handling
+ messages and callbacks).
+ - When SafeState or SafeStateAgain is triggered and executes
+ your autocommand, check with `state()` if the work can be
+ done now, and if yes remove it from the queue and execute.
+ Remove the autocommand if the queue is now empty.
+ Also see |mode()|.
+
+ When {what} is given only characters in this string will be
+ added. E.g, this checks if the screen has scrolled: >
+ if state('s') == ''
+ " screen has not scrolled
+<
+ These characters indicate the state, generally indicating that
+ something is busy:
+ m halfway a mapping, :normal command, feedkeys() or
+ stuffed command
+ o operator pending, e.g. after |d|
+ a Insert mode autocomplete active
+ x executing an autocommand
+ w blocked on waiting, e.g. ch_evalexpr(), ch_read() and
+ ch_readraw() when reading json
+ S not triggering SafeState or SafeStateAgain, e.g. after
+ |f| or a count
+ c callback invoked, including timer (repeats for
+ recursiveness up to "ccc")
+ s screen has scrolled for messages
+
+str2float({string} [, {quoted}]) *str2float()*
+ Convert String {string} to a Float. This mostly works the
+ same as when using a floating point number in an expression,
+ see |floating-point-format|. But it's a bit more permissive.
+ E.g., "1e40" is accepted, while in an expression you need to
+ write "1.0e40". The hexadecimal form "0x123" is also
+ accepted, but not others, like binary or octal.
+ When {quoted} is present and non-zero then embedded single
+ quotes before the dot are ignored, thus "1'000.0" is a
+ thousand.
+ Text after the number is silently ignored.
+ The decimal point is always '.', no matter what the locale is
+ set to. A comma ends the number: "12,345.67" is converted to
+ 12.0. You can strip out thousands separators with
+ |substitute()|: >
+ let f = str2float(substitute(text, ',', '', 'g'))
+<
+ Returns 0.0 if the conversion fails.
+
+ Can also be used as a |method|: >
+ let f = text->substitute(',', '', 'g')->str2float()
+
+str2list({string} [, {utf8}]) *str2list()*
+ Return a list containing the number values which represent
+ each character in String {string}. Examples: >
+ str2list(" ") returns [32]
+ str2list("ABC") returns [65, 66, 67]
+< |list2str()| does the opposite.
+
+ When {utf8} is omitted or zero, the current 'encoding' is used.
+ When {utf8} is TRUE, always treat the String as UTF-8
+ characters. With UTF-8 composing characters are handled
+ properly: >
+ str2list("á") returns [97, 769]
+
+< Can also be used as a |method|: >
+ GetString()->str2list()
+
+
+str2nr({string} [, {base} [, {quoted}]]) *str2nr()*
+ Convert string {string} to a number.
+ {base} is the conversion base, it can be 2, 8, 10 or 16.
+ When {quoted} is present and non-zero then embedded single
+ quotes are ignored, thus "1'000'000" is a million.
+
+ When {base} is omitted base 10 is used. This also means that
+ a leading zero doesn't cause octal conversion to be used, as
+ with the default String to Number conversion. Example: >
+ let nr = str2nr('0123')
+<
+ When {base} is 16 a leading "0x" or "0X" is ignored. With a
+ different base the result will be zero. Similarly, when
+ {base} is 8 a leading "0", "0o" or "0O" is ignored, and when
+ {base} is 2 a leading "0b" or "0B" is ignored.
+ Text after the number is silently ignored.
+
+ Returns 0 if {string} is empty or on error.
+
+ Can also be used as a |method|: >
+ GetText()->str2nr()
+
+
+strcharlen({string}) *strcharlen()*
+ The result is a Number, which is the number of characters
+ in String {string}. Composing characters are ignored.
+ |strchars()| can count the number of characters, counting
+ composing characters separately.
+
+ Returns 0 if {string} is empty or on error.
+
+ Also see |strlen()|, |strdisplaywidth()| and |strwidth()|.
+
+ Can also be used as a |method|: >
+ GetText()->strcharlen()
+
+
+strcharpart({src}, {start} [, {len} [, {skipcc}]]) *strcharpart()*
+ Like |strpart()| but using character index and length instead
+ of byte index and length.
+ When {skipcc} is omitted or zero, composing characters are
+ counted separately.
+ When {skipcc} set to 1, Composing characters are ignored,
+ similar to |slice()|.
+ When a character index is used where a character does not
+ exist it is omitted and counted as one character. For
+ example: >
+ strcharpart('abc', -1, 2)
+< results in 'a'.
+
+ Returns an empty string on error.
+
+ Can also be used as a |method|: >
+ GetText()->strcharpart(5)
+
+
+strchars({string} [, {skipcc}]) *strchars()*
+ The result is a Number, which is the number of characters
+ in String {string}.
+ When {skipcc} is omitted or zero, composing characters are
+ counted separately.
+ When {skipcc} set to 1, Composing characters are ignored.
+ |strcharlen()| always does this.
+
+ Returns zero on error.
+
+ 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")
+ function s:strchars(str, skipcc)
+ return strchars(a:str, a:skipcc)
+ endfunction
+ else
+ function s:strchars(str, skipcc)
+ if a:skipcc
+ return strlen(substitute(a:str, ".", "x", "g"))
+ else
+ return strchars(a:str)
+ endif
+ endfunction
+ endif
+<
+ Can also be used as a |method|: >
+ GetText()->strchars()
+
+strdisplaywidth({string} [, {col}]) *strdisplaywidth()*
+ The result is a Number, which is the number of display cells
+ String {string} occupies on the screen when it starts at {col}
+ (first column is zero). When {col} is omitted zero is used.
+ Otherwise it is the screen column where to start. This
+ matters for Tab characters.
+ The option settings of the current window are used. This
+ matters for anything that's displayed differently, such as
+ 'tabstop' and 'display'.
+ When {string} contains characters with East Asian Width Class
+ Ambiguous, this function's return value depends on 'ambiwidth'.
+ Returns zero on error.
+ Also see |strlen()|, |strwidth()| and |strchars()|.
+
+ Can also be used as a |method|: >
+ GetText()->strdisplaywidth()
+
+strftime({format} [, {time}]) *strftime()*
+ The result is a String, which is a formatted date and time, as
+ specified by the {format} string. The given {time} is used,
+ or the current time if no time is given. The accepted
+ {format} depends on your system, thus this is not portable!
+ See the manual page of the C function strftime() for the
+ format. The maximum length of the result is 80 characters.
+ See also |localtime()|, |getftime()| and |strptime()|.
+ The language can be changed with the |:language| command.
+ Examples: >
+ :echo strftime("%c") Sun Apr 27 11:49:23 1997
+ :echo strftime("%Y %b %d %X") 1997 Apr 27 11:53:25
+ :echo strftime("%y%m%d %T") 970427 11:53:55
+ :echo strftime("%H:%M") 11:55
+ :echo strftime("%c", getftime("file.c"))
+ Show mod time of file.c.
+< Not available on all systems. To check use: >
+ :if exists("*strftime")
+
+< Can also be used as a |method|: >
+ GetFormat()->strftime()
+
+strgetchar({str}, {index}) *strgetchar()*
+ Get a Number corresponding to the character at {index} in
+ {str}. This uses a zero-based character index, not a byte
+ index. Composing characters are considered separate
+ characters here. Use |nr2char()| to convert the Number to a
+ String.
+ Returns -1 if {index} is invalid.
+ Also see |strcharpart()| and |strchars()|.
+
+ Can also be used as a |method|: >
+ GetText()->strgetchar(5)
+
+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}.
+ If {start} is specified, the search starts at index {start}.
+ This can be used to find a second match: >
+ :let colon1 = stridx(line, ":")
+ :let colon2 = stridx(line, ":", colon1 + 1)
+< The search is done case-sensitive.
+ For pattern searches use |match()|.
+ -1 is returned if the {needle} does not occur in {haystack}.
+ See also |strridx()|.
+ Examples: >
+ :echo stridx("An Example", "Example") 3
+ :echo stridx("Starting point", "Start") 0
+ :echo stridx("Starting point", "start") -1
+< *strstr()* *strchr()*
+ stridx() works similar to the C function strstr(). When used
+ with a single character it works similar to strchr().
+
+ Can also be used as a |method|: >
+ GetHaystack()->stridx(needle)
+<
+ *string()*
+string({expr}) Return {expr} converted to a String. If {expr} is a Number,
+ Float, String, Blob or a composition of them, then the result
+ can be parsed back with |eval()|.
+ {expr} type result ~
+ String 'string' (single quotes are doubled)
+ Number 123
+ Float 123.123456 or 1.123456e8
+ Funcref function('name')
+ Blob 0z00112233.44556677.8899
+ List [item, item]
+ Dictionary {key: value, key: value}
+ Class class SomeName
+ Object object of SomeName {lnum: 1, col: 3}
+
+ When a |List| or |Dictionary| has a recursive reference it is
+ replaced by "[...]" or "{...}". Using eval() on the result
+ will then fail.
+
+ Can also be used as a |method|: >
+ mylist->string()
+
+< Also see |strtrans()|.
+
+
+strlen({string}) *strlen()*
+ The result is a Number, which is the length of the String
+ {string} in bytes.
+ If the argument is a Number it is first converted to a String.
+ For other types an error is given and zero is returned.
+ If you want to count the number of multibyte characters use
+ |strchars()|.
+ Also see |len()|, |strdisplaywidth()| and |strwidth()|.
+
+ Can also be used as a |method|: >
+ GetString()->strlen()
+
+strpart({src}, {start} [, {len} [, {chars}]]) *strpart()*
+ The result is a String, which is part of {src}, starting from
+ byte {start}, with the byte length {len}.
+ When {chars} is present and TRUE then {len} is the number of
+ characters positions (composing characters are not counted
+ separately, thus "1" means one base character and any
+ following composing characters).
+ To count {start} as 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 the character under the cursor: >
+ strpart(getline("."), col(".") - 1, 1, v:true)
+<
+ Returns an empty string on error.
+
+ Can also be used as a |method|: >
+ GetText()->strpart(5)
+
+strptime({format}, {timestring}) *strptime()*
+ The result is a Number, which is a unix timestamp representing
+ the date and time in {timestring}, which is expected to match
+ the format specified in {format}.
+
+ The accepted {format} depends on your system, thus this is not
+ portable! See the manual page of the C function strptime()
+ for the format. Especially avoid "%c". The value of $TZ also
+ matters.
+
+ If the {timestring} cannot be parsed with {format} zero is
+ returned. If you do not know the format of {timestring} you
+ can try different {format} values until you get a non-zero
+ result.
+
+ See also |strftime()|.
+ Examples: >
+ :echo strptime("%Y %b %d %X", "1997 Apr 27 11:49:23")
+< 862156163 >
+ :echo strftime("%c", strptime("%y%m%d %T", "970427 11:53:55"))
+< Sun Apr 27 11:53:55 1997 >
+ :echo strftime("%c", strptime("%Y%m%d%H%M%S", "19970427115355") + 3600)
+< Sun Apr 27 12:53:55 1997
+
+ Can also be used as a |method|: >
+ GetFormat()->strptime(timestring)
+<
+ Not available on all systems. To check use: >
+ :if exists("*strptime")
+
+strridx({haystack}, {needle} [, {start}]) *strridx()*
+ The result is a Number, which gives the byte index in
+ {haystack} of the last occurrence of the String {needle}.
+ When {start} is specified, matches beyond this index are
+ ignored. This can be used to find a match before a previous
+ match: >
+ :let lastcomma = strridx(line, ",")
+ :let comma2 = strridx(line, ",", lastcomma - 1)
+< The search is done case-sensitive.
+ For pattern searches use |match()|.
+ -1 is returned if the {needle} does not occur in {haystack}.
+ If the {needle} is empty the length of {haystack} is returned.
+ See also |stridx()|. Examples: >
+ :echo strridx("an angry armadillo", "an") 3
+< *strrchr()*
+ When used with a single character it works similar to the C
+ function strrchr().
+
+ Can also be used as a |method|: >
+ GetHaystack()->strridx(needle)
+
+strtrans({string}) *strtrans()*
+ The result is a String, which is {string} with all unprintable
+ characters translated into printable characters |'isprint'|.
+ Like they are shown in a window. Example: >
+ echo strtrans(@a)
+< This displays a newline in register a as "^@" instead of
+ starting a new line.
+
+ Returns an empty string on error.
+
+ Can also be used as a |method|: >
+ GetString()->strtrans()
+
+strwidth({string}) *strwidth()*
+ The result is a Number, which is the number of display cells
+ String {string} occupies. A Tab character is counted as one
+ cell, alternatively use |strdisplaywidth()|.
+ When {string} contains characters with East Asian Width Class
+ Ambiguous, this function's return value depends on 'ambiwidth'.
+ Returns zero on error.
+ Also see |strlen()|, |strdisplaywidth()| and |strchars()|.
+
+ Can also be used as a |method|: >
+ GetString()->strwidth()
+
+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}
+ is 0 the whole matched text is returned.
+ Note that a NL in the string can stand for a line break of a
+ 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.
+ 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.
+
+ When substitute() is used recursively only the submatches in
+ the current (deepest) call can be obtained.
+
+ Returns an empty string or list on error.
+
+ 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.
+
+ Can also be used as a |method|: >
+ GetNr()->submatch()
+
+substitute({string}, {pat}, {sub}, {flags}) *substitute()*
+ The result is a String, which is a copy of {string}, in which
+ the first match of {pat} is replaced with {sub}.
+ When {flags} is "g", all matches of {pat} in {string} 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
+ portable). 'ignorecase' is still relevant, use |/\c| or |/\C|
+ if you want to ignore or match case and ignore 'ignorecase'.
+ 'smartcase' is not used. See |string-match| for how {pat} is
+ used.
+
+ A "~" in {sub} is not replaced with the previous {sub}.
+ Note that some codes in {sub} have a special meaning
+ |sub-replace-special|. For example, to replace something with
+ "\n" (two characters), use "\\\\n" or '\\n'.
+
+ When {pat} does not match in {string}, {string} is returned
+ unmodified.
+
+ Example: >
+ :let &path = substitute(&path, ",\\=[^,]*$", "", "")
+< This removes the last component of the 'path' option. >
+ :echo substitute("testing", ".*", "\\U\\0", "")
+< results in "TESTING".
+
+ When {sub} starts with "\=", the remainder is interpreted as
+ an expression. See |sub-replace-expression|. Example: >
+ :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')
+
+< Returns an empty string on error.
+
+ Can also be used as a |method|: >
+ GetString()->substitute(pat, sub, flags)
+
+swapfilelist() *swapfilelist()*
+ Returns a list of swap file names, like what "vim -r" shows.
+ See the |-r| command argument. The 'directory' option is used
+ for the directories to inspect. If you only want to get a
+ list of swap files in the current directory then temporarily
+ set 'directory' to a dot: >
+ let save_dir = &directory
+ let &directory = '.'
+ let swapfiles = swapfilelist()
+ let &directory = save_dir
+
+swapinfo({fname}) *swapinfo()*
+ The result is a dictionary, which holds information about the
+ swapfile {fname}. The available fields are:
+ version Vim version
+ user user name
+ host host name
+ fname original file name
+ pid PID of the Vim process that created the swap
+ file
+ mtime last modification time in seconds
+ inode Optional: INODE number of the file
+ dirty 1 if file was modified, 0 if not
+ Note that "user" and "host" are truncated to at most 39 bytes.
+ In case of failure an "error" item is added with the reason:
+ Cannot open file: file not found or in accessible
+ Cannot read file: cannot read first block
+ Not a swap file: does not contain correct block ID
+ Magic number mismatch: Info in first block is invalid
+
+ Can also be used as a |method|: >
+ GetFilename()->swapinfo()
+
+swapname({buf}) *swapname()*
+ The result is the swap file path of the buffer {expr}.
+ For the use of {buf}, see |bufname()| above.
+ If buffer {buf} is the current buffer, the result is equal to
+ |:swapname| (unless there is no swap file).
+ If buffer {buf} has no swap file, returns an empty string.
+
+ Can also be used as a |method|: >
+ GetBufname()->swapname()
+
+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.
+ The syntax ID can be used with |synIDattr()| and
+ |synIDtrans()| to obtain syntax information about text.
+
+ {col} is 1 for the leftmost column, {lnum} is 1 for the first
+ line. 'synmaxcol' applies, in a longer line zero is returned.
+ Note that when the position is after the last character,
+ that's where the cursor can be in Insert mode, synID() returns
+ zero. {lnum} is used like with |getline()|.
+
+ 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 |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
+ obtained by going through the file in forward direction.
+
+ Returns zero on error.
+
+ Example (echoes the name of the syntax item under the cursor): >
+ :echo synIDattr(synID(line("."), col("."), 1), "name")
+<
+
+synIDattr({synID}, {what} [, {mode}]) *synIDattr()*
+ The result is a String, which is the {what} attribute of
+ syntax ID {synID}. This can be used to obtain information
+ about a syntax item.
+ {mode} can be "gui", "cterm" or "term", to get the attributes
+ for that mode. When {mode} is omitted, or an invalid value is
+ used, the attributes for the currently active highlighting are
+ used (GUI, cterm or term).
+ Use synIDtrans() to follow linked highlight groups.
+ {what} result
+ "name" the name of the syntax item
+ "fg" foreground color (GUI: color name used to set
+ the color, cterm: color number as a string,
+ term: empty string)
+ "bg" background color (as with "fg")
+ "font" font name (only available in the GUI)
+ |highlight-font|
+ "sp" special color for the GUI (as with "fg")
+ |highlight-guisp|
+ "ul" underline color for cterm: number as a string
+ "fg#" like "fg", but for the GUI and the GUI is
+ running the name in "#RRGGBB" form
+ "bg#" like "fg#" for "bg"
+ "sp#" like "fg#" for "sp"
+ "bold" "1" if bold
+ "italic" "1" if italic
+ "reverse" "1" if reverse
+ "inverse" "1" if inverse (= reverse)
+ "standout" "1" if standout
+ "underline" "1" if underlined
+ "undercurl" "1" if undercurled
+ "strike" "1" if strikethrough
+ "nocombine" "1" if nocombine
+
+ Returns an empty string on error.
+
+ Example (echoes the color of the syntax item under the
+ cursor): >
+ :echo synIDattr(synIDtrans(synID(line("."), col("."), 1)), "fg")
+<
+ Can also be used as a |method|: >
+ :echo synID(line("."), col("."), 1)->synIDtrans()->synIDattr("fg")
+
+
+synIDtrans({synID}) *synIDtrans()*
+ The result is a Number, which is the translated syntax ID of
+ {synID}. This is the syntax group ID of what is being used to
+ highlight the character. Highlight links given with
+ ":highlight link" are followed.
+
+ Returns zero on error.
+
+ Can also be used as a |method|: >
+ :echo synID(line("."), col("."), 1)->synIDtrans()->synIDattr("fg")
+
+synconcealed({lnum}, {col}) *synconcealed()*
+ 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. {lnum} is used like with |getline()|.
+ 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()*
+ Return a |List|, which is the stack of syntax items at the
+ position {lnum} and {col} in the current window. {lnum} is
+ used like with |getline()|. Each item in the List is an ID
+ like what |synID()| returns.
+ The first item in the List is the outer region, following are
+ items contained in that one. The last one is what |synID()|
+ returns, unless not the whole item is highlighted or it is a
+ transparent item.
+ This function is useful for debugging a syntax file.
+ Example that shows the syntax stack under the cursor: >
+ for id in synstack(line("."), col("."))
+ echo synIDattr(id, "name")
+ endfor
+< When the position specified with {lnum} and {col} is invalid
+ an empty List is returned. The position just after the last
+ character in a line and the first column in an empty line are
+ valid positions.
+
+system({expr} [, {input}]) *system()* *E677*
+ Get the output of the shell command {expr} as a |String|. 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).
+ When {input} is given and is a number that is a valid id for
+ an existing buffer then the content of the buffer is written
+ to the file line by line, each line terminated by a NL and
+ NULs characters where the text has a NL.
+
+ Pipes are not used, the 'shelltemp' option is not used.
+
+ When prepended by |:silent| the terminal will not be set to
+ cooked mode. This is meant to be used for commands that do
+ not need the user to type. It avoids stray characters showing
+ up on the screen which require |CTRL-L| to remove. >
+ :silent let f = system('ls *.vim')
+<
+ Note: Use |shellescape()| or |::S| with |expand()| or
+ |fnamemodify()| to escape special characters in a command
+ argument. Newlines in {expr} 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')))
+ :let files = system('ls ' .. expand('%:h:S'))
+
+< To make the result more system-independent, the shell output
+ is filtered to replace <CR> with <NL> for Macintosh, and
+ <CR><NL> with <NL> for DOS-like systems.
+ To avoid the string being truncated at a NUL, all NUL
+ characters are replaced with SOH (0x01).
+
+ The command executed is constructed using several options:
+ 'shell' 'shellcmdflag' 'shellxquote' {expr} 'shellredir' {tmp} 'shellxquote'
+ ({tmp} is an automatically generated file name).
+ For Unix, braces are put around {expr} to allow for
+ concatenated commands.
+
+ 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|.
+
+ Note that any wrong value in the options mentioned above may
+ make the function fail. It has also been reported to fail
+ when using a security agent application.
+ Unlike ":!cmd" there is no automatic check for changed files.
+ Use |:checktime| to force a check.
+
+ Can also be used as a |method|: >
+ :echo GetCmd()->system()
+
+
+systemlist({expr} [, {input}]) *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
+ set to "b", except that there is no extra empty item when the
+ result ends in a NL.
+ Note that on MS-Windows you may get trailing CR characters.
+
+ To see the difference between "echo hello" and "echo -n hello"
+ use |system()| and |split()|: >
+ echo system('echo hello')->split('\n', 1)
+<
+ Returns an empty string on error.
+
+ Can also be used as a |method|: >
+ :echo GetCmd()->systemlist()
+
+
+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 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: >
+ let buflist = []
+ for i in range(tabpagenr('$'))
+ call extend(buflist, tabpagebuflist(i + 1))
+ endfor
+< Note that a buffer may appear in more than one window.
+
+ Can also be used as a |method|: >
+ GetTabpage()->tabpagebuflist()
+
+tabpagenr([{arg}]) *tabpagenr()*
+ The result is a Number, which is the number of the current
+ tab page. The first tab page has number 1.
+
+ The optional argument {arg} supports the following values:
+ $ the number of the last tab page (the tab page
+ count).
+ # the number of the last accessed tab page
+ (where |g<Tab>| goes to). if there is no
+ previous tab page 0 is returned.
+ The number can be used with the |:tab| command.
+
+ Returns zero on error.
+
+
+tabpagewinnr({tabarg} [, {arg}]) *tabpagewinnr()*
+ Like |winnr()| but for tab page {tabarg}.
+ {tabarg} specifies the number of tab page to be used.
+ {arg} is used like with |winnr()|:
+ - When omitted the current window number is returned. This is
+ the window which will be used when going to this tab page.
+ - When "$" the number of windows is returned.
+ - When "#" the previous window nr is returned.
+ Useful examples: >
+ tabpagewinnr(1) " current window of tab page 1
+ tabpagewinnr(4, '$') " number of windows in tab page 4
+< When {tabarg} is invalid zero is returned.
+
+ Can also be used as a |method|: >
+ GetTabpage()->tabpagewinnr()
+<
+ *tagfiles()*
+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} [, {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.
+ filename Name of the file where the tag is
+ defined. It is either relative to the
+ current directory or a full path.
+ cmd Ex command used to locate the tag in
+ the file.
+ kind Type of the tag. The value for this
+ entry depends on the language specific
+ kind values. Only available when
+ using a tags file generated by
+ Universal/Exuberant ctags or hdrtag.
+ static A file specific tag. Refer to
+ |static-tag| for more information.
+ More entries may be present, depending on the content of the
+ tags file: access, implementation, inherits and signature.
+ Refer to the ctags documentation for information about these
+ fields. For C code the fields "struct", "class" and "enum"
+ 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
+ line number or a line number followed by a byte number.
+
+ If there are no matching tags, then an empty list is returned.
+
+ To get an exact tag match, the anchors '^' and '$' should be
+ used in {expr}. This also make the function work faster.
+ Refer to |tag-regexp| for more information about the tag
+ search regular expression pattern.
+
+ Refer to |'tags'| for information about how the tags file is
+ located by Vim. Refer to |tags-file-format| for the format of
+ the tags file generated by the different ctags tools.
+
+ Can also be used as a |method|: >
+ GetTagpattern()->taglist()
+
+tan({expr}) *tan()*
+ Return the tangent of {expr}, measured in radians, as a |Float|
+ in the range [-inf, inf].
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo tan(10)
+< 0.648361 >
+ :echo tan(-4.01)
+< -1.181502
+
+ Can also be used as a |method|: >
+ Compute()->tan()
+
+
+tanh({expr}) *tanh()*
+ Return the hyperbolic tangent of {expr} as a |Float| in the
+ range [-1, 1].
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ :echo tanh(0.5)
+< 0.462117 >
+ :echo tanh(-1)
+< -0.761594
+
+ Can also be used as a |method|: >
+ Compute()->tanh()
+
+
+tempname() *tempname()* *temp-file-name*
+ The result is a String, which is the name of a file that
+ doesn't exist. It can be used for a temporary file. The name
+ is different for at least 26 consecutive calls. Example: >
+ :let tmpfile = tempname()
+ :exe "redir > " .. tmpfile
+< For Unix, the file will be in a private directory |tempfile|.
+ For MS-Windows forward slashes are used when the 'shellslash'
+ option is set, or when 'shellcmdflag' starts with '-' and
+ 'shell' does not contain powershell or pwsh.
+
+
+term_ functions are documented here: |terminal-function-details|
+
+
+terminalprops() *terminalprops()*
+ Returns a |Dictionary| with properties of the terminal that Vim
+ detected from the response to |t_RV| request. See
+ |v:termresponse| for the response itself. If |v:termresponse|
+ is empty most values here will be 'u' for unknown.
+ cursor_style whether sending |t_RS| works **
+ cursor_blink_mode whether sending |t_RC| works **
+ underline_rgb whether |t_8u| works **
+ mouse mouse type supported
+ kitty whether Kitty terminal was detected
+
+ ** value 'u' for unknown, 'y' for yes, 'n' for no
+
+ If the |+termresponse| feature is missing then the result is
+ an empty dictionary.
+
+ If "cursor_style" is 'y' then |t_RS| will be sent to request the
+ current cursor style.
+ If "cursor_blink_mode" is 'y' then |t_RC| will be sent to
+ request the cursor blink status.
+ "cursor_style" and "cursor_blink_mode" are also set if |t_u7|
+ is not empty, Vim will detect the working of sending |t_RS|
+ and |t_RC| on startup.
+
+ When "underline_rgb" is not 'y', then |t_8u| will be made empty.
+ This avoids sending it to xterm, which would clear the colors.
+
+ For "mouse" the value 'u' is unknown
+
+ Also see:
+ - 'ambiwidth' - detected by using |t_u7|.
+ - |v:termstyleresp| and |v:termblinkresp| for the response to
+ |t_RS| and |t_RC|.
+
+
+test_ functions are documented here: |test-functions-details|
+
+
+ *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
+ "remaining" time until the timer fires
+ "repeat" number of times the timer will still fire;
+ -1 means forever
+ "callback" the callback
+ "paused" 1 if the timer is paused, 0 otherwise
+
+ Can also be used as a |method|: >
+ GetTimer()->timer_info()
+
+< {only available when compiled with the |+timers| feature}
+
+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|.
+
+ Can also be used as a |method|: >
+ GetTimer()->timer_pause(1)
+
+< {only available when compiled with the |+timers| feature}
+
+ *timer_start()* *timer* *timers*
+timer_start({time}, {callback} [, {options}])
+ Create a timer and return the timer ID.
+
+ {time} is the waiting time in milliseconds. This is the
+ minimum time before invoking the callback. When the system is
+ busy or Vim is not waiting for input the time will be longer.
+ Zero can be used to execute the callback when Vim is back in
+ the main loop.
+
+ {callback} is the function to call. It can be the name of a
+ 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.
+ If you want to show a message look at |popup_notification()|
+ to avoid interfering with what the user is doing.
+
+ {options} is a dictionary. Supported entries:
+ "repeat" Number of times to repeat calling the
+ callback. -1 means forever. When not present
+ the callback will be called once.
+ If the timer causes an error three times in a
+ row the repeat is cancelled. This avoids that
+ Vim becomes unusable because of all the error
+ messages.
+
+ Returns -1 on error.
+
+ Example: >
+ func MyHandler(timer)
+ echo 'Handler called'
+ endfunc
+ let timer = timer_start(500, 'MyHandler',
+ \ {'repeat': 3})
+< This will invoke MyHandler() three times at 500 msec
+ intervals.
+
+ Can also be used as a |method|: >
+ GetMsec()->timer_start(callback)
+
+< Not available in the |sandbox|.
+ {only available when compiled with the |+timers| feature}
+
+timer_stop({timer}) *timer_stop()*
+ 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.
+
+ Can also be used as a |method|: >
+ GetTimer()->timer_stop()
+
+< {only available when compiled with the |+timers| feature}
+
+timer_stopall() *timer_stopall()*
+ Stop all timers. The timer callbacks will no longer be
+ invoked. Useful if a timer is misbehaving. If there are no
+ timers there is no error.
+
+ {only available when compiled with the |+timers| feature}
+
+tolower({expr}) *tolower()*
+ The result is a copy of the String given, with all uppercase
+ characters turned into lowercase (just like applying |gu| to
+ the string). Returns an empty string on error.
+
+ Can also be used as a |method|: >
+ GetText()->tolower()
+
+toupper({expr}) *toupper()*
+ The result is a copy of the String given, with all lowercase
+ characters turned into uppercase (just like applying |gU| to
+ the string). Returns an empty string on error.
+
+ Can also be used as a |method|: >
+ GetText()->toupper()
+
+tr({src}, {fromstr}, {tostr}) *tr()*
+ The result is a copy of the {src} string with all characters
+ which appear in {fromstr} replaced by the character in that
+ position in the {tostr} string. Thus the first character in
+ {fromstr} is translated into the first character in {tostr}
+ and so on. Exactly like the unix "tr" command.
+ This code also deals with multibyte characters properly.
+
+ Returns an empty string on error.
+
+ Examples: >
+ echo tr("hello there", "ht", "HT")
+< returns "Hello THere" >
+ echo tr("<blob>", "<>", "{}")
+< returns "{blob}"
+
+ Can also be used as a |method|: >
+ GetText()->tr(from, to)
+
+trim({text} [, {mask} [, {dir}]]) *trim()*
+ Return {text} as a String where any character in {mask} is
+ removed from the beginning and/or 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.
+
+ The optional {dir} argument specifies where to remove the
+ characters:
+ 0 remove from the beginning and end of {text}
+ 1 remove only at the beginning of {text}
+ 2 remove only at the end of {text}
+ When omitted both ends are trimmed.
+
+ This function deals with multibyte characters properly.
+ Returns an empty string on error.
+
+ 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) >
+ echo trim(" vim ", " ", 2)
+< returns " vim"
+
+ Can also be used as a |method|: >
+ GetText()->trim()
+
+trunc({expr}) *trunc()*
+ Return the largest integral value with magnitude less than or
+ equal to {expr} as a |Float| (truncate towards zero).
+ {expr} must evaluate to a |Float| or a |Number|.
+ Returns 0.0 if {expr} is not a |Float| or a |Number|.
+ Examples: >
+ echo trunc(1.456)
+< 1.0 >
+ echo trunc(-5.456)
+< -5.0 >
+ echo trunc(4.0)
+< 4.0
+
+ Can also be used as a |method|: >
+ Compute()->trunc()
+<
+ *type()*
+type({expr}) 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:t_bool| (v:false and v:true)
+ None: 7 |v:t_none| (v:null and v:none)
+ Job: 8 |v:t_job|
+ Channel: 9 |v:t_channel|
+ Blob: 10 |v:t_blob|
+ Class 12 |v:t_class|
+ Object 13 |v:t_object|
+ For backward compatibility, this method can be used: >
+ :if type(myvar) == type(0)
+ :if type(myvar) == type("")
+ :if type(myvar) == type(function("tr"))
+ :if type(myvar) == type([])
+ :if type(myvar) == type({})
+ :if type(myvar) == type(0.0)
+ :if type(myvar) == type(v:false)
+ :if type(myvar) == type(v:none)
+< To check if the v:t_ variables exist use this: >
+ :if exists('v:t_number')
+
+< Can also be used as a |method|: >
+ mylist->type()
+
+
+typename({expr}) *typename()*
+ Return a string representation of the type of {expr}.
+ Example: >
+ echo typename([1, 2, 3])
+< list<number> ~
+
+
+undofile({name}) *undofile()*
+ Return the name of the undo file that would be used for a file
+ with name {name} when writing. This uses the 'undodir'
+ option, finding directories that exist. It does not check if
+ the undo file exists.
+ {name} is always expanded to the full path, since that is what
+ is used internally.
+ If {name} is empty undofile() returns an empty string, since a
+ buffer without a file name will not write an undo file.
+ Useful in combination with |:wundo| and |:rundo|.
+ When compiled without the |+persistent_undo| option this always
+ returns an empty string.
+
+ Can also be used as a |method|: >
+ GetFilename()->undofile()
+
+undotree() *undotree()*
+ Return the current state of the undo tree in a dictionary with
+ the following items:
+ "seq_last" The highest undo sequence number used.
+ "seq_cur" The sequence number of the current position in
+ the undo tree. This differs from "seq_last"
+ when some changes were undone.
+ "time_cur" Time last used for |:earlier| and related
+ commands. Use |strftime()| to convert to
+ something readable.
+ "save_last" Number of the last file write. Zero when no
+ write yet.
+ "save_cur" Number of the current position in the undo
+ tree.
+ "synced" Non-zero when the last undo block was synced.
+ This happens when waiting from input from the
+ user. See |undo-blocks|.
+ "entries" A list of dictionaries with information about
+ undo blocks.
+
+ The first item in the "entries" list is the oldest undo item.
+ Each List item is a |Dictionary| with these items:
+ "seq" Undo sequence number. Same as what appears in
+ |:undolist|.
+ "time" Timestamp when the change happened. Use
+ |strftime()| to convert to something readable.
+ "newhead" Only appears in the item that is the last one
+ that was added. This marks the last change
+ and where further changes will be added.
+ "curhead" Only appears in the item that is the last one
+ that was undone. This marks the current
+ position in the undo tree, the block that will
+ be used by a redo command. When nothing was
+ undone after the last change this item will
+ not appear anywhere.
+ "save" Only appears on the last block before a file
+ write. The number is the write count. The
+ first write has number 1, the last one the
+ "save_last" mentioned above.
+ "alt" Alternate entry. This is again a List of undo
+ blocks. Each item may again have an "alt"
+ item.
+
+uniq({list} [, {func} [, {dict}]]) *uniq()* *E882*
+ Remove second and succeeding copies of repeated adjacent
+ {list} items in-place. Returns {list}. If you want a list
+ to remain unmodified make a copy first: >
+ :let newlist = uniq(copy(mylist))
+< The default compare function uses the string representation of
+ each item. For the use of {func} and {dict} see |sort()|.
+
+ Returns zero if {list} is not a |List|.
+
+ Can also be used as a |method|: >
+ mylist->uniq()
+
+values({dict}) *values()*
+ Return a |List| with all the values of {dict}. The |List| is
+ in arbitrary order. Also see |items()| and |keys()|.
+ Returns zero if {dict} is not a |Dict|.
+
+ Can also be used as a |method|: >
+ mydict->values()
+
+virtcol({expr} [, {list}]) *virtcol()*
+ The result is a Number, which is the screen column of the file
+ position given with {expr}. That is, the last screen position
+ occupied by the character at that position, when the screen
+ would be of unlimited width. When there is a <Tab> at the
+ position, the returned Number will be the column at the end of
+ the <Tab>. For example, for a <Tab> in column 1, with 'ts'
+ set to 8, it returns 8. |conceal| is ignored.
+ For the byte position use |col()|.
+
+ For the use of {expr} see |col()|.
+
+ When 'virtualedit' is used {expr} can be [lnum, col, off],
+ where "off" is the offset in screen columns from the start of
+ the character. E.g., a position within a <Tab> or after the
+ last character. When "off" is omitted zero is used. When
+ Virtual editing is active in the current mode, a position
+ beyond the end of the line can be returned. Also see
+ |'virtualedit'|
+
+ The accepted positions are:
+ . the cursor position
+ $ the end of the cursor line (the result is the
+ number of displayed characters in the cursor line
+ plus one)
+ 'x position of mark x (if the mark is not set, 0 is
+ returned)
+ 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
+ that it's updated right away.
+
+ If {list} is present and non-zero then virtcol() returns a List
+ with the first and last screen position occupied by the
+ character.
+
+ Note that only marks in the current file can be used.
+ Examples: >
+ " With text "foo^Lbar" and cursor on the "^L":
+
+ virtcol(".") " returns 5
+ virtcol(".", 1) " returns [4, 5]
+ virtcol("$") " returns 9
+
+ " With text " there", with 't at 'h':
+
+ virtcol("'t") " returns 6
+< The first column is 1. 0 is returned for an error.
+ A more advanced example that echoes the maximum length of
+ all lines: >
+ echo max(map(range(1, line('$')), "virtcol([v:val, '$'])"))
+
+< Can also be used as a |method|: >
+ GetPos()->virtcol()
+
+virtcol2col({winid}, {lnum}, {col}) *virtcol2col()*
+ The result is a Number, which is the byte index of the
+ character in window {winid} at buffer line {lnum} and virtual
+ column {col}.
+
+ If {col} is greater than the last virtual column in line
+ {lnum}, then the byte index of the character at the last
+ virtual column is returned.
+
+ The {winid} argument can be the window number or the
+ |window-ID|. If this is zero, then the current window is used.
+
+ Returns -1 if the window {winid} doesn't exist or the buffer
+ line {lnum} or virtual column {col} is invalid.
+
+ See also |screenpos()|, |virtcol()| and |col()|.
+
+ Can also be used as a |method|: >
+ GetWinid()->virtcol2col(lnum, col)
+
+visualmode([{expr}]) *visualmode()*
+ The result is a String, which describes the last Visual mode
+ used in the current buffer. Initially it returns an empty
+ string, but once Visual mode has been used, it returns "v",
+ "V", or "<CTRL-V>" (a single CTRL-V character) for
+ character-wise, line-wise, or block-wise Visual mode
+ respectively.
+ Example: >
+ :exe "normal " .. visualmode()
+< This enters the same Visual mode as before. It is also useful
+ in scripts if you wish to act differently depending on the
+ Visual mode that was used.
+ If Visual mode is active, use |mode()| to get the Visual mode
+ (e.g., in a |:vmap|).
+ 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. See |non-zero-arg|.
+
+wildmenumode() *wildmenumode()*
+ 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).
+
+ For example to make <c-j> work like <down> in wildmode, use: >
+ :cnoremap <expr> <C-j> wildmenumode() ? "\<Down>\<Tab>" : "\<c-j>"
+<
+ (Note, this needs the 'wildcharm' option set appropriately).
+
+win_execute({id}, {command} [, {silent}]) *win_execute()*
+ Like `execute()` but in the context of window {id}.
+ The window will temporarily be made the current window,
+ without triggering autocommands or changing directory. When
+ executing {command} autocommands will be triggered, this may
+ have unexpected side effects. Use |:noautocmd| if needed.
+ Example: >
+ call win_execute(winid, 'set syntax=python')
+< Doing the same with `setwinvar()` would not trigger
+ autocommands and not actually show syntax highlighting.
+ *E994*
+ Not all commands are allowed in popup windows.
+ When window {id} does not exist then no error is given and
+ an empty string is returned.
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ GetCommand()->win_execute(winid)
+
+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.
+
+ Can also be used as a |method|: >
+ GetBufnr()->win_findbuf()
+
+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.
+
+ Can also be used as a |method|: >
+ GetWinnr()->win_getid()
+
+
+win_gettype([{nr}]) *win_gettype()*
+ Return the type of the window:
+ "autocmd" autocommand window. Temporary window
+ used to execute autocommands.
+ "command" command-line window |cmdwin|
+ (empty) normal window
+ "loclist" |location-list-window|
+ "popup" popup window |popup|
+ "preview" preview window |preview-window|
+ "quickfix" |quickfix-window|
+ "unknown" window {nr} not found
+
+ When {nr} is omitted return the type of the current window.
+ When {nr} is given return the type of this window by number or
+ |window-ID|.
+
+ Also see the 'buftype' option. When running a terminal in a
+ popup window then 'buftype' is "terminal" and win_gettype()
+ returns "popup".
+
+ Can also be used as a |method|: >
+ GetWinid()->win_gettype()
+<
+win_gotoid({expr}) *win_gotoid()*
+ Go to window with ID {expr}. This may also change the current
+ tabpage.
+ Return TRUE if successful, FALSE if the window cannot be found.
+
+ Can also be used as a |method|: >
+ GetWinid()->win_gotoid()
+
+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.
+
+ Can also be used as a |method|: >
+ GetWinid()->win_id2tabwin()
+
+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.
+
+ Can also be used as a |method|: >
+ GetWinid()->win_id2win()
+
+win_move_separator({nr}, {offset}) *win_move_separator()*
+ Move window {nr}'s vertical separator (i.e., the right border)
+ by {offset} columns, as if being dragged by the mouse. {nr}
+ can be a window number or |window-ID|. A positive {offset}
+ moves right and a negative {offset} moves left. Moving a
+ window's vertical separator will change the width of the
+ window and the width of other windows adjacent to the vertical
+ separator. The magnitude of movement may be smaller than
+ specified (e.g., as a consequence of maintaining
+ 'winminwidth'). Returns TRUE if the window can be found and
+ FALSE otherwise.
+ This will fail for the rightmost window and a full-width
+ window, since it has no separator on the right.
+ Only works for the current tab page. *E1308*
+
+ Can also be used as a |method|: >
+ GetWinnr()->win_move_separator(offset)
+
+win_move_statusline({nr}, {offset}) *win_move_statusline()*
+ Move window {nr}'s status line (i.e., the bottom border) by
+ {offset} rows, as if being dragged by the mouse. {nr} can be a
+ window number or |window-ID|. A positive {offset} moves down
+ and a negative {offset} moves up. Moving a window's status
+ line will change the height of the window and the height of
+ other windows adjacent to the status line. The magnitude of
+ movement may be smaller than specified (e.g., as a consequence
+ of maintaining 'winminheight'). Returns TRUE if the window can
+ be found and FALSE otherwise.
+ Only works for the current tab page.
+
+ Can also be used as a |method|: >
+ GetWinnr()->win_move_statusline(offset)
+
+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], unless there is a tabline, then it is [2, 1].
+ {nr} can be the window number or the |window-ID|. Use zero
+ for the current window.
+ Returns [0, 0] if the window cannot be found in the current
+ tabpage.
+
+ Can also be used as a |method|: >
+ GetWinid()->win_screenpos()
+<
+win_splitmove({nr}, {target} [, {options}]) *win_splitmove()*
+ Move the window {nr} to a new split of the window {target}.
+ This is similar to moving to {target}, creating a new window
+ using |:split| but having the same contents as window {nr}, and
+ then closing {nr}.
+
+ Both {nr} and {target} can be window numbers or |window-ID|s.
+ Both must be in the current tab page.
+
+ Returns zero for success, non-zero for failure.
+
+ {options} is a |Dictionary| with the following optional entries:
+ "vertical" When TRUE, the split is created vertically,
+ like with |:vsplit|.
+ "rightbelow" When TRUE, the split is made below or to the
+ right (if vertical). When FALSE, it is done
+ above or to the left (if vertical). When not
+ present, the values of 'splitbelow' and
+ 'splitright' are used.
+
+ Can also be used as a |method|: >
+ GetWinid()->win_splitmove(target)
+<
+
+ *winbufnr()*
+winbufnr({nr}) The result is a Number, which is the number of the buffer
+ 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))
+<
+ Can also be used as a |method|: >
+ FindWindow()->winbufnr()->bufname()
+<
+ *wincol()*
+wincol() The result is a Number, which is the virtual column of the
+ cursor in the window. This is counting screen cells from the
+ left side of the window. The leftmost column is one.
+
+ *windowsversion()*
+windowsversion()
+ The result is a String. For MS-Windows it indicates the OS
+ version. E.g, Windows 10 is "10.0", Windows 8 is "6.2",
+ Windows XP is "5.1". For non-MS-Windows systems the result is
+ an empty string.
+
+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."
+
+< Can also be used as a |method|: >
+ GetWinid()->winheight()
+<
+winlayout([{tabnr}]) *winlayout()*
+ The result is a nested List containing the layout of windows
+ in a tabpage.
+
+ Without {tabnr} use the current tabpage, otherwise the tabpage
+ with number {tabnr}. If the tabpage {tabnr} is not found,
+ returns an empty list.
+
+ For a leaf window, it returns:
+ ['leaf', {winid}]
+ For horizontally split windows, which form a column, it
+ returns:
+ ['col', [{nested list of windows}]]
+ For vertically split windows, which form a row, it returns:
+ ['row', [{nested list of windows}]]
+
+ Example: >
+ " Only one window in the tab page
+ :echo winlayout()
+ ['leaf', 1000]
+ " Two horizontally split windows
+ :echo winlayout()
+ ['col', [['leaf', 1000], ['leaf', 1001]]]
+ " The second tab page, with three horizontally split
+ " windows, with two vertically split windows in the
+ " middle window
+ :echo winlayout(2)
+ ['col', [['leaf', 1002], ['row', [['leaf', 1003],
+ ['leaf', 1001]]], ['leaf', 1000]]]
+<
+ Can also be used as a |method|: >
+ GetTabnr()->winlayout()
+<
+ *winline()*
+winline() The result is a Number, which is the screen line of the cursor
+ in the window. This is counting screen lines from the top of
+ the window. The first line is one.
+ If the cursor was moved the view on the file will be updated
+ first, this may cause a scroll.
+
+ *winnr()*
+winnr([{arg}]) The result is a Number, which is the number of the current
+ window. The top window has number 1.
+ Returns zero for a popup window.
+
+ The optional argument {arg} supports the following values:
+ $ the number of the last window (the window
+ count).
+ # the number of the last accessed window (where
+ |CTRL-W_p| goes to). If there is no previous
+ window or it is in another tab page 0 is
+ returned.
+ {N}j the number of the Nth window below the
+ current window (where |CTRL-W_j| goes to).
+ {N}k the number of the Nth window above the current
+ window (where |CTRL-W_k| goes to).
+ {N}h the number of the Nth window left of the
+ current window (where |CTRL-W_h| goes to).
+ {N}l the number of the Nth window right of the
+ current window (where |CTRL-W_l| goes to).
+ The number can be used with |CTRL-W_w| and ":wincmd w"
+ |:wincmd|.
+ When {arg} is invalid an error is given and zero is returned.
+ Also see |tabpagewinnr()| and |win_getid()|.
+ Examples: >
+ let window_count = winnr('$')
+ let prev_window = winnr('#')
+ let wnum = winnr('3k')
+
+< Can also be used as a |method|: >
+ GetWinval()->winnr()
+<
+ *winrestcmd()*
+winrestcmd() Returns a sequence of |:resize| commands that should restore
+ the current window sizes. Only works properly when no windows
+ are opened or closed and the current window and tab page is
+ unchanged.
+ Example: >
+ :let cmd = winrestcmd()
+ :call MessWithWindowSizes()
+ :exe cmd
+<
+ *winrestview()*
+winrestview({dict})
+ Uses the |Dictionary| returned by |winsaveview()| to restore
+ the view of the current window.
+ Note: The {dict} does not have to contain all values, that are
+ returned by |winsaveview()|. If values are missing, those
+ settings won't be restored. So you can use: >
+ :call winrestview({'curswant': 4})
+<
+ This will only set the curswant value (the column the cursor
+ wants to move on vertical movements) of the cursor to column 5
+ (yes, that is 5), while all other settings will remain the
+ same. This is useful, if you set the cursor position manually.
+
+ If you have changed the values the result is unpredictable.
+ If the window size changed the result won't be the same.
+
+ Can also be used as a |method|: >
+ GetView()->winrestview()
+<
+ *winsaveview()*
+winsaveview() Returns a |Dictionary| that contains information to restore
+ the view of the current window. Use |winrestview()| to
+ restore the view.
+ This is useful if you have a mapping that jumps around in the
+ buffer and you want to go back to the original view.
+ This does not save fold information. Use the 'foldenable'
+ option to temporarily switch off folding, so that folds are
+ not opened when moving around. This may have side effects.
+ The return value includes:
+ lnum cursor line number
+ col cursor column (Note: the first column
+ zero, as opposed to what |getcurpos()|
+ returns)
+ coladd cursor column offset for 'virtualedit'
+ curswant column for vertical movement (Note:
+ the first column is zero, as opposed
+ to what |getcurpos()| returns). After
+ |$| command it will be a very large
+ number equal to |v:maxcol|.
+ topline first line in the window
+ topfill filler lines, only in diff mode
+ leftcol first column displayed; only used when
+ 'wrap' is off
+ skipcol columns skipped
+ Note that no option values are saved.
+
+
+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.
+ Examples: >
+ :echo "The current window has " .. winwidth(0) .. " columns."
+ :if winwidth(0) <= 50
+ : 50 wincmd |
+ :endif
+< For getting the terminal or screen size, see the 'columns'
+ option.
+
+ Can also be used as a |method|: >
+ GetWinid()->winwidth()
+
+
+wordcount() *wordcount()*
+ The result is a dictionary of byte/chars/word statistics for
+ the current buffer. This is the same info as provided by
+ |g_CTRL-G|
+ The return value includes:
+ bytes Number of bytes in the buffer
+ chars Number of chars in the buffer
+ words Number of words in the buffer
+ cursor_bytes Number of bytes before cursor position
+ (not in Visual mode)
+ cursor_chars Number of chars before cursor position
+ (not in Visual mode)
+ cursor_words Number of words before cursor position
+ (not in Visual mode)
+ visual_bytes Number of bytes visually selected
+ (only in Visual mode)
+ visual_chars Number of chars visually selected
+ (only in Visual mode)
+ visual_words Number of words visually selected
+ (only in Visual mode)
+
+
+ *writefile()*
+writefile({object}, {fname} [, {flags}])
+ When {object} is a |List| write it to file {fname}. Each list
+ item is separated with a NL. Each list item must be a String
+ or Number.
+ All NL characters are replaced with a NUL character.
+ Inserting CR characters needs to be done before passing {list}
+ to writefile().
+
+ When {object} is a |Blob| write the bytes to file {fname}
+ unmodified, also when binary mode is not specified.
+
+ {flags} must be a String. These characters are recognized:
+
+ 'b' Binary mode is used: There will not be a NL after the
+ last list item. An empty item at the end does cause the
+ last line in the file to end in a NL.
+
+ 'a' Append mode is used, lines are appended to the file: >
+ :call writefile(["foo"], "event.log", "a")
+ :call writefile(["bar"], "event.log", "a")
+<
+ 'D' Delete the file when the current function ends. This
+ works like: >
+ :defer delete({fname})
+< Fails when not in a function. Also see |:defer|.
+
+ 's' fsync() is called after writing the file. This flushes
+ the file to disk, if possible. This takes more time but
+ avoids losing the file if the system crashes.
+
+ 'S' fsync() is not called, even when 'fsync' is set.
+
+ When {flags} does not contain "S" or "s" then fsync() is
+ called if the 'fsync' option is set.
+
+ An existing file is overwritten, if possible.
+
+ When the write fails -1 is returned, otherwise 0. There is an
+ error message if the file can't be created or when writing
+ fails.
+
+ Also see |readfile()|.
+ To copy a file byte for byte: >
+ :let fl = readfile("foo", "b")
+ :call writefile(fl, "foocopy", "b")
+
+< Can also be used as a |method|: >
+ GetText()->writefile("thefile")
+
+
+xor({expr}, {expr}) *xor()*
+ Bitwise XOR on the two arguments. The arguments are converted
+ to a number. A List, Dict or Float argument causes an error.
+ Also see `and()` and `or()`.
+ Example: >
+ :let bits = xor(bits, 0x80)
+<
+ Can also be used as a |method|: >
+ :let bits = bits->xor(0x80)
+<
+
+==============================================================================
+3. Feature list *feature-list*
+
+There are three types of features:
+1. Features that are only supported when they have been enabled when Vim
+ was compiled |+feature-list|. Example: >
+ :if has("cindent")
+< *gui_running*
+2. Features that are only supported when certain conditions have been met.
+ Example: >
+ :if has("gui_running")
+< *has-patch*
+3. Beyond a certain version or at a certain version and including a specific
+ patch. The "patch-7.4.248" feature means that the Vim version is 7.5 or
+ later, or it is version 7.4 and patch 248 was included. Example: >
+ :if has("patch-7.4.248")
+< Note that it's possible for patch 248 to be omitted even though 249 is
+ included. Only happens when cherry-picking patches.
+ Note that this form only works for patch 7.4.237 and later, before that
+ you need to check for the patch and the v:version. Example (checking
+ version 6.2.148 or later): >
+ :if v:version > 602 || (v:version == 602 && has("patch148"))
+
+Hint: To find out if Vim supports backslashes in a file name (MS-Windows),
+use: `if exists('+shellslash')`
+
+
+acl Compiled with |ACL| support.
+all_builtin_terms Compiled with all builtin terminals enabled. (always
+ true)
+amiga Amiga version of Vim.
+arabic Compiled with Arabic support |Arabic|.
+arp Compiled with ARP support (Amiga).
+autocmd Compiled with autocommand support. (always true)
+autochdir Compiled with support for 'autochdir'
+autoservername Automatically enable |clientserver|
+balloon_eval Compiled with |balloon-eval| support.
+balloon_multiline GUI supports multiline balloons.
+beos BeOS version of Vim.
+browse Compiled with |:browse| support, and browse() will
+ work.
+browsefilter Compiled with support for |browsefilter|.
+bsd Compiled on an OS in the BSD family (excluding macOS).
+builtin_terms Compiled with some builtin terminals. (always true)
+byte_offset Compiled with support for 'o' in 'statusline'
+channel Compiled with support for |channel| and |job|
+cindent Compiled with 'cindent' support. (always true)
+clientserver Compiled with remote invocation support |clientserver|.
+clipboard Compiled with 'clipboard' support.
+clipboard_working Compiled with 'clipboard' support and it can be used.
+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.
+conpty Platform where |ConPTY| can be used.
+cryptv Compiled with encryption support |encryption|.
+cscope Compiled with |cscope| support.
+cursorbind Compiled with |'cursorbind'| (always true)
+debug Compiled with "DEBUG" defined.
+dialog_con Compiled with console dialog support.
+dialog_gui Compiled with GUI dialog support.
+diff Compiled with |vimdiff| and 'diff' support.
+digraphs Compiled with support for digraphs.
+directx Compiled with support for DirectX and 'renderoptions'.
+dnd Compiled with support for the "~ register |quote_~|.
+drop_file Compiled with |drop_file| support.
+ebcdic Compiled on a machine with ebcdic character set.
+emacs_tags Compiled with support for Emacs tags.
+eval Compiled with expression evaluation support. Always
+ true, of course!
+ex_extra |+ex_extra| (always true)
+extra_search Compiled with support for |'incsearch'| and
+ |'hlsearch'|
+farsi Support for Farsi was removed |farsi|.
+file_in_path Compiled with support for |gf| and |<cfile>| (always
+ true)
+filterpipe When 'shelltemp' is off pipes are used for shell
+ read/write/filter commands
+find_in_path Compiled with support for include file searches
+ |+find_in_path|.
+float Compiled with support for |Float|.
+fname_case Case in file names matters (for Amiga and MS-Windows
+ this is not present).
+folding Compiled with |folding| support.
+footer Compiled with GUI footer support. |gui-footer|
+fork Compiled to use fork()/exec() instead of system().
+gettext Compiled with message translation |multi-lang|
+gui Compiled with GUI enabled.
+gui_athena Compiled with Athena GUI (always false).
+gui_gnome Compiled with Gnome support (gui_gtk is also defined).
+gui_gtk Compiled with GTK+ GUI (any version).
+gui_gtk2 Compiled with GTK+ 2 GUI (gui_gtk is also defined).
+gui_gtk3 Compiled with GTK+ 3 GUI (gui_gtk is also defined).
+gui_haiku Compiled with Haiku GUI.
+gui_mac Compiled with Macintosh GUI.
+gui_motif Compiled with Motif GUI.
+gui_photon Compiled with Photon GUI.
+gui_running Vim is running in the GUI, or it will start soon.
+gui_win32 Compiled with MS-Windows Win32 GUI.
+gui_win32s idem, and Win32s system being used (Windows 3.1)
+haiku Haiku version of Vim.
+hangul_input Compiled with Hangul input support. |hangul|
+hpux HP-UX version of Vim.
+iconv Can use iconv() for conversion.
+insert_expand Compiled with support for CTRL-X expansion commands in
+ Insert mode. (always true)
+job Compiled with support for |channel| and |job|
+ipv6 Compiled with support for IPv6 networking in |channel|.
+jumplist Compiled with |jumplist| support. (always true)
+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
+ 'breakindent' support.
+linux Linux version of Vim.
+lispindent Compiled with support for lisp indenting.
+ (always true)
+listcmds Compiled with commands for the buffer list |:files|
+ and the argument list |arglist|.
+localmap Compiled with local mappings and abbr. |:map-local|
+lua Compiled with Lua interface |Lua|.
+mac Any Macintosh version of Vim cf. osx
+macunix Synonym for osxdarwin
+menu Compiled with support for |:menu|.
+mksession Compiled with support for |:mksession|.
+modify_fname Compiled with file name modifiers. |filename-modifiers|
+ (always true)
+mouse Compiled with support for mouse.
+mouse_dec Compiled with support for Dec terminal mouse.
+mouse_gpm Compiled with support for gpm (Linux console mouse)
+mouse_gpm_enabled GPM mouse is working
+mouse_netterm Compiled with support for netterm mouse.
+mouse_pterm Compiled with support for qnx pterm mouse.
+mouse_sysmouse Compiled with support for sysmouse (*BSD console mouse)
+mouse_sgr Compiled with support for sgr mouse.
+mouse_urxvt Compiled with support for urxvt mouse.
+mouse_xterm Compiled with support for xterm mouse.
+mouseshape Compiled with support for 'mouseshape'.
+multi_byte Compiled with support for 'encoding' (always true)
+multi_byte_encoding 'encoding' is set to a multibyte encoding.
+multi_byte_ime Compiled with support for IME input method.
+multi_lang Compiled with support for multiple languages.
+mzscheme Compiled with MzScheme interface |mzscheme|.
+nanotime Compiled with sub-second time stamp checks.
+netbeans_enabled Compiled with support for |netbeans| and connected.
+netbeans_intg Compiled with support for |netbeans|.
+num64 Compiled with 64-bit |Number| support. (always true)
+ole Compiled with OLE automation support for Win32.
+osx Compiled for macOS cf. mac
+osxdarwin Compiled for macOS, with |mac-darwin-feature|
+packages Compiled with |packages| support.
+path_extra Compiled with up/downwards search in 'path' and 'tags'
+perl Compiled with Perl interface.
+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 Python 2.x interface available. |has-python|
+python_compiled Compiled with Python 2.x interface. |has-python|
+python_dynamic Python 2.x interface is dynamically loaded. |has-python|
+python3 Python 3.x interface available. |has-python|
+python3_compiled Compiled with Python 3.x interface. |has-python|
+python3_dynamic Python 3.x interface is dynamically loaded. |has-python|
+pythonx Python 2.x and/or 3.x interface available. |python_x|
+qnx QNX version of Vim.
+quickfix Compiled with |quickfix| support.
+reltime Compiled with |reltime()| support.
+rightleft Compiled with 'rightleft' support.
+ruby Compiled with Ruby interface |ruby|.
+scrollbind Compiled with 'scrollbind' support. (always true)
+showcmd Compiled with 'showcmd' support.
+signs Compiled with |:sign| support.
+smartindent Compiled with 'smartindent' support. (always true)
+sodium Compiled with libsodium for better crypt support
+sound Compiled with sound support, e.g. `sound_playevent()`
+spell Compiled with spell checking support |spell|.
+startuptime Compiled with |--startuptime| support.
+statusline Compiled with support for 'statusline', 'rulerformat'
+ and special formats of 'titlestring' and 'iconstring'.
+sun SunOS version of Vim.
+sun_workshop Support for Sun |workshop| has been removed.
+syntax Compiled with syntax highlighting support |syntax|.
+syntax_items There are active syntax highlighting items for the
+ current buffer.
+system Compiled to use system() instead of fork()/exec().
+tag_binary Compiled with binary searching in tags files
+ |tag-binary-search|. (always true)
+tag_old_static Support for old static tags was removed, see
+ |tag-old-static|.
+tcl Compiled with Tcl interface.
+termguicolors Compiled with true color in terminal support.
+terminal Compiled with |terminal| support.
+terminfo Compiled with terminfo instead of termcap.
+termresponse Compiled with support for |t_RV| and |v:termresponse|.
+textobjects Compiled with support for |text-objects|.
+textprop Compiled with support for |text-properties|.
+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'|.
+ (always true)
+toolbar Compiled with support for |gui-toolbar|.
+ttyin input is a terminal (tty)
+ttyout output is a terminal (tty)
+unix Unix version of Vim. *+unix*
+unnamedplus Compiled with support for "unnamedplus" in 'clipboard'
+user_commands User-defined commands. (always true)
+vartabs Compiled with variable tabstop support |'vartabstop'|.
+vcon Win32: Virtual console support is working, can use
+ 'termguicolors'. Also see |+vtp|.
+vertsplit Compiled with vertically split windows |:vsplit|.
+ (always true)
+vim_starting True while initial source'ing takes place. |startup|
+ *vim_starting*
+vim9script Compiled with |Vim9| script support
+viminfo Compiled with viminfo support.
+vimscript-1 Compiled Vim script version 1 support
+vimscript-2 Compiled Vim script version 2 support
+vimscript-3 Compiled Vim script version 3 support
+vimscript-4 Compiled Vim script version 4 support
+virtualedit Compiled with 'virtualedit' option. (always true)
+visual Compiled with Visual mode. (always true)
+visualextra Compiled with extra Visual mode commands. (always
+ true) |blockwise-operators|.
+vms VMS version of Vim.
+vreplace Compiled with |gR| and |gr| commands. (always true)
+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.
+win16 old version for MS-Windows 3.1 (always false)
+win32 Win32 version of Vim (MS-Windows 95 and later, 32 or
+ 64 bits)
+win32unix Win32 version of Vim, using Unix files (Cygwin)
+win64 Win64 version of Vim (MS-Windows 64 bit).
+win95 Win32 version for MS-Windows 95/98/ME (always false)
+winaltkeys Compiled with 'winaltkeys' option.
+windows Compiled with support for more than one window.
+ (always true)
+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.)
+xsmp Compiled with X session management support.
+xsmp_interact Compiled with interactive X session management support.
+xterm_clipboard Compiled with support for xterm clipboard.
+xterm_save Compiled with support for saving and restoring the
+ xterm screen.
+x11 Compiled with X11 support.
+
+
+==============================================================================
+4. Matching a pattern in a String *string-match*
+
+This is common between several functions. A regexp pattern as explained at
+|pattern| is normally used to find a match in the buffer lines. When a
+pattern is used to find a match in a String, almost everything works in the
+same way. The difference is that a String is handled like it is one line.
+When it contains a "\n" character, this is not seen as a line break for the
+pattern. It can be matched with a "\n" in the pattern, or with ".". Example:
+>
+ :let a = "aaaa\nxxxx"
+ :echo matchstr(a, "..\n..")
+ aa
+ xx
+ :echo matchstr(a, "a.x")
+ a
+ x
+
+Don't forget that "^" will only match at the first character of the String and
+"$" at the last character of the string. They don't match after or before a
+"\n".
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt
new file mode 100644
index 0000000..4fc20ca
--- /dev/null
+++ b/runtime/doc/change.txt
@@ -0,0 +1,1973 @@
+*change.txt* For Vim version 9.0. Last change: 2023 Feb 27
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+This file describes commands that delete or change text. In this context,
+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|.
+
+==============================================================================
+1. Deleting text *deleting* *E470*
+
+["x]<Del> or *<Del>* *x* *dl*
+["x]x Delete [count] characters under and after the cursor
+ [into register x] (not |linewise|). Does the same as
+ "dl".
+ The <Del> key does not take a [count]. Instead, it
+ deletes the last character of the count.
+ See |:fixdel| if the <Del> key does not do what you
+ want. See |'whichwrap'| for deleting a line break
+ (join lines).
+
+ *X* *dh*
+["x]X Delete [count] characters before the cursor [into
+ register x] (not |linewise|). Does the same as "dh".
+ Also see |'whichwrap'|.
+
+ *d*
+["x]d{motion} Delete text that {motion} moves over [into register
+ x]. See below for exceptions.
+
+ *dd*
+["x]dd Delete [count] lines [into register x] |linewise|.
+
+ *D*
+["x]D Delete the characters under the cursor until the end
+ of the line and [count]-1 more lines [into register
+ x]; synonym for "d$".
+ (not |linewise|)
+ When the '#' flag is in 'cpoptions' the count is
+ ignored.
+
+{Visual}["x]x or *v_x* *v_d* *v_<Del>*
+{Visual}["x]d or
+{Visual}["x]<Del> Delete the highlighted text [into register x] (for
+ {Visual} see |Visual-mode|).
+
+{Visual}["x]CTRL-H or *v_CTRL-H* *v_<BS>*
+{Visual}["x]<BS> When in Select mode: Delete the highlighted text [into
+ register x].
+
+{Visual}["x]X or *v_X* *v_D* *v_b_D*
+{Visual}["x]D Delete the highlighted lines [into register x] (for
+ {Visual} see |Visual-mode|). In Visual block mode,
+ "D" deletes the highlighted text plus all text until
+ the end of the line.
+
+ *:d* *:de* *:del* *:delete* *:dl* *:dp*
+:[range]d[elete] [x] Delete [range] lines (default: current line) [into
+ register x].
+ Note these weird abbreviations:
+ :dl delete and list
+ :dell idem
+ :delel idem
+ :deletl idem
+ :deletel idem
+ :dp delete and print
+ :dep idem
+ :delp idem
+ :delep idem
+ :deletp idem
+ :deletep idem
+
+:[range]d[elete] [x] {count}
+ Delete {count} lines, starting with [range]
+ (default: current line |cmdline-ranges|) [into
+ register x].
+
+These commands delete text. You can repeat them with the `.` command
+(except `:d`) and undo them. Use Visual mode to delete blocks of text. See
+|registers| for an explanation of registers.
+
+An exception for the d{motion} command: If the motion is not linewise, the
+start and end of the motion are not in the same line, and there are only
+blanks before the start and there are no non-blanks after the end of the
+motion, the delete becomes linewise. This means that the delete also removes
+the line of blanks that you might expect to remain. Use the |o_v| operator to
+force the motion to be characterwise.
+
+Trying to delete an empty region of text (e.g., "d0" in the first column)
+is an error when 'cpoptions' includes the 'E' flag.
+
+ *J*
+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 reduced to the number of
+ lines available.
+
+ *v_J*
+{Visual}J Join the highlighted lines, with a minimum of two
+ lines. Remove the indent and insert up to two spaces
+ (see below).
+
+ *gJ*
+gJ Join [count] lines, with a minimum of two lines.
+ Don't insert or remove any spaces.
+
+ *v_gJ*
+{Visual}gJ Join the highlighted lines, with a minimum of two
+ lines. Don't insert or remove any spaces.
+
+ *:j* *:join*
+:[range]j[oin][!] [flags]
+ Join [range] lines. Same as "J", except with [!]
+ the join does not insert or delete any spaces.
+ If a [range] has equal start and end values, this
+ command does nothing. The default behavior is to
+ join the current line with the line below it.
+ See |ex-flags| for [flags].
+
+:[range]j[oin][!] {count} [flags]
+ Join {count} lines, starting with [range] (default:
+ current line |cmdline-ranges|). Same as "J", except
+ with [!] the join does not insert or delete any
+ spaces.
+ See |ex-flags| for [flags].
+
+These commands delete the <EOL> between lines. This has the effect of joining
+multiple lines into one line. You can repeat these commands (except `:j`) and
+undo them.
+
+These commands, except "gJ", insert one space in place of the <EOL> unless
+there is trailing white space or the next line starts with a ')'. These
+commands, except "gJ", delete any leading white space on the next line. If
+the 'joinspaces' option is on, these commands insert two spaces after a '.',
+'!' or '?' (but if 'cpoptions' includes the 'j' flag, they insert two spaces
+only after a '.').
+The 'B' and 'M' flags in 'formatoptions' change the behavior for inserting
+spaces before and after a multibyte character |fo-table|.
+
+The '[ mark is set at the end of the first line that was joined, '] at the end
+of the resulting line.
+
+
+==============================================================================
+2. Delete and insert *delete-insert* *replacing*
+
+ *R*
+R Enter Replace mode: Each character you type replaces
+ an existing character, starting with the character
+ under the cursor. Repeat the entered text [count]-1
+ times. See |Replace-mode| for more details.
+
+ *gR*
+gR Enter Virtual Replace mode: Each character you type
+ replaces existing characters in screen space. So a
+ <Tab> may replace several characters at once.
+ Repeat the entered text [count]-1 times. See
+ |Virtual-Replace-mode| for more details.
+
+ *c*
+["x]c{motion} Delete {motion} text [into register x] and start
+ insert. When 'cpoptions' includes the 'E' flag and
+ there is no text to delete (e.g., with "cTx" when the
+ cursor is just after an 'x'), an error occurs and
+ insert mode does not start (this is Vi compatible).
+ When 'cpoptions' does not include the 'E' flag, the
+ "c" command always starts insert mode, even if there
+ is no text to delete.
+
+ *cc*
+["x]cc Delete [count] lines [into register x] and start
+ insert |linewise|. If 'autoindent' is on, preserve
+ the indent of the first line.
+
+ *C*
+["x]C Delete from the cursor position to the end of the
+ line and [count]-1 more lines [into register x], and
+ start insert. Synonym for c$ (not |linewise|).
+
+ *s*
+["x]s Delete [count] characters [into register x] and start
+ insert (s stands for Substitute). Synonym for "cl"
+ (not |linewise|).
+
+ *S*
+["x]S Delete [count] lines [into register x] and start
+ insert. Synonym for "cc" |linewise|.
+
+{Visual}["x]c or *v_c* *v_s*
+{Visual}["x]s Delete the highlighted text [into register x] and
+ start insert (for {Visual} see |Visual-mode|).
+
+ *v_r*
+{Visual}r{char} Replace all selected characters by {char}.
+
+ *v_C*
+{Visual}["x]C Delete the highlighted lines [into register x] and
+ start insert. In Visual block mode it works
+ differently |v_b_C|.
+ *v_S*
+{Visual}["x]S Delete the highlighted lines [into register x] and
+ start insert (for {Visual} see |Visual-mode|).
+ *v_R*
+{Visual}["x]R Currently just like {Visual}["x]S. In a next version
+ it might work differently.
+
+Notes:
+- You can end Insert and Replace mode with <Esc>.
+- See the section "Insert and Replace mode" |mode-ins-repl| for the other
+ special characters in these modes.
+- The effect of [count] takes place after Vim exits Insert or Replace mode.
+- When the 'cpoptions' option contains '$' and the change is within one line,
+ Vim continues to show the text to be deleted and puts a '$' at the last
+ deleted character.
+
+See |registers| for an explanation of registers.
+
+Replace mode is just like Insert mode, except that every character you enter
+deletes one character. If you reach the end of a line, Vim appends any
+further characters (just like Insert mode). In Replace mode, the backspace
+key restores the original text (if there was any). (See section "Insert and
+Replace mode" |mode-ins-repl|).
+
+ *cw* *cW*
+Special case: When the cursor is in a word, "cw" and "cW" do not include the
+white space after a word, they only change up to the end of the word. This is
+because Vim interprets "cw" as change-word, and a word does not include the
+following white space.
+{Vi: "cw" when on a blank followed by other blanks changes only the first
+blank; this is probably a bug, because "dw" deletes all the blanks; use the
+'w' flag in 'cpoptions' to make it work like Vi anyway}
+
+If you prefer "cw" to include the space after a word, use this mapping: >
+ :map cw dwi
+Or use "caw" (see |aw|).
+
+ *:c* *:ch* *:change*
+:{range}c[hange][!] Replace lines of text with some different text.
+ Type a line containing only "." to stop replacing.
+ Without {range}, this command changes only the current
+ line.
+ Adding [!] toggles 'autoindent' for the time this
+ command is executed.
+ This command is not supported in |Vim9| script,
+ because it is too easily confused with a variable
+ name.
+
+==============================================================================
+3. Simple changes *simple-change*
+
+ *r*
+r{char} Replace the character under the cursor with {char}.
+ If {char} is a <CR> or <NL>, a line break replaces the
+ character. To replace with a real <CR>, use CTRL-V
+ <CR>. CTRL-V <NL> replaces with a <Nul>.
+
+ If {char} is CTRL-E or CTRL-Y the character from the
+ line below or above is used, just like with |i_CTRL-E|
+ and |i_CTRL-Y|. This also works with a count, thus
+ `10r<C-E>` copies 10 characters from the line below.
+
+ If you give a [count], Vim replaces [count] characters
+ with [count] {char}s. When {char} is a <CR> or <NL>,
+ however, Vim inserts only one <CR>: "5r<CR>" replaces
+ five characters with a single line break.
+ When {char} is a <CR> or <NL>, Vim performs
+ autoindenting. This works just like deleting the
+ characters that are replaced and then doing
+ "i<CR><Esc>".
+ {char} can be entered as a digraph |digraph-arg|.
+ |:lmap| mappings apply to {char}. The CTRL-^ command
+ in Insert mode can be used to switch this on/off
+ |i_CTRL-^|. See |utf-8-char-arg| about using
+ composing characters when 'encoding' is Unicode.
+
+ *gr*
+gr{char} Replace the virtual characters under the cursor with
+ {char}. This replaces in screen space, not file
+ space. See |gR| and |Virtual-Replace-mode| for more
+ details. As with |r| a count may be given.
+ {char} can be entered like with |r|, but characters
+ that have a special meaning in Insert mode, such as
+ most CTRL-keys, cannot be used.
+
+ *digraph-arg*
+The argument for Normal mode commands like |r| and |t| is a single character.
+When 'cpo' doesn't contain the 'D' flag, this character can also be entered
+like |digraphs|. First type CTRL-K and then the two digraph characters.
+{not available when compiled without the |+digraphs| feature}
+
+ *case*
+The following commands change the case of letters. The currently active
+|locale| is used. See |:language|. The LC_CTYPE value matters here.
+
+ *~*
+~ 'notildeop' option: Switch case of the character
+ under the cursor and move the cursor to the right.
+ If a [count] is given, do that many characters.
+
+~{motion} 'tildeop' option: switch case of {motion} text.
+
+ *g~*
+g~{motion} Switch case of {motion} text.
+
+g~g~ *g~g~* *g~~*
+g~~ Switch case of current line.
+
+ *v_~*
+{Visual}~ Switch case of highlighted text (for {Visual} see
+ |Visual-mode|).
+
+ *v_U*
+{Visual}U Make highlighted text uppercase (for {Visual} see
+ |Visual-mode|).
+
+ *gU* *uppercase*
+gU{motion} Make {motion} text uppercase.
+ Example: >
+ :map! <C-F> <Esc>gUiw`]a
+< This works in Insert mode: press CTRL-F to make the
+ word before the cursor uppercase. Handy to type
+ words in lowercase and then make them uppercase.
+
+
+gUgU *gUgU* *gUU*
+gUU Make current line uppercase.
+
+ *v_u*
+{Visual}u Make highlighted text lowercase (for {Visual} see
+ |Visual-mode|).
+
+ *gu* *lowercase*
+gu{motion} Make {motion} text lowercase.
+
+gugu *gugu* *guu*
+guu Make current line lowercase.
+
+ *g?* *rot13*
+g?{motion} Rot13 encode {motion} text.
+
+ *v_g?*
+{Visual}g? Rot13 encode the highlighted text (for {Visual} see
+ |Visual-mode|).
+
+g?g? *g?g?* *g??*
+g?? Rot13 encode current line.
+
+To turn one line into title caps, make every first letter of a word
+uppercase: >
+ :s/\v<(.)(\w*)/\u\1\L\2/g
+
+
+Adding and subtracting ~
+ *CTRL-A*
+CTRL-A Add [count] to the number or alphabetic character at
+ or after the cursor.
+
+ *v_CTRL-A*
+{Visual}CTRL-A Add [count] to the number or alphabetic character in
+ the highlighted text.
+
+ *v_g_CTRL-A*
+{Visual}g CTRL-A Add [count] to the number or alphabetic character in
+ the highlighted text. If several lines are
+ highlighted, each one will be incremented by an
+ additional [count] (so effectively creating a
+ [count] incrementing sequence).
+ For Example, if you have this list of numbers:
+ 1. ~
+ 1. ~
+ 1. ~
+ 1. ~
+ Move to the second "1." and Visually select three
+ lines, pressing g CTRL-A results in:
+ 1. ~
+ 2. ~
+ 3. ~
+ 4. ~
+
+ *CTRL-X*
+CTRL-X Subtract [count] from the number or alphabetic
+ character at or after the cursor.
+
+ *v_CTRL-X*
+{Visual}CTRL-X Subtract [count] from the number or alphabetic
+ character in the highlighted text.
+
+ 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
+ are highlighted, each value will be decremented by an
+ additional [count] (so effectively creating a [count]
+ decrementing sequence).
+
+The CTRL-A and CTRL-X commands can work for:
+- signed and unsigned decimal numbers
+- unsigned binary, octal and hexadecimal numbers
+- alphabetic characters
+
+This depends on the 'nrformats' option:
+- When 'nrformats' includes "bin", Vim assumes numbers starting with '0b' or
+ '0B' are binary.
+- When 'nrformats' includes "octal", Vim considers numbers starting with a '0'
+ to be octal, unless the number includes a '8' or '9'. Other numbers are
+ decimal and may have a preceding minus sign.
+ If the cursor is on a number, the commands apply to that number; otherwise
+ Vim uses the number to the right of the cursor.
+- When 'nrformats' includes "hex", Vim assumes numbers starting with '0x' or
+ '0X' are hexadecimal. The case of the rightmost letter in the number
+ determines the case of the resulting hexadecimal number. If there is no
+ letter in the current number, Vim uses the previously detected case.
+- When 'nrformats' includes "alpha", Vim will change the alphabetic character
+ under or after the cursor. This is useful to make lists with an alphabetic
+ index.
+
+For decimals a leading negative sign is considered for incrementing/
+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.
+
+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
+"0077" results in "0100", CTRL-X on "0x100" results in "0x0ff".
+There is one exception: When a number that starts with a zero is found not to
+be octal (it contains a '8' or '9'), but 'nrformats' does include "octal",
+leading zeros are removed to avoid that the result may be recognized as an
+octal number.
+
+Note that when 'nrformats' includes "octal", decimal numbers with leading
+zeros cause mistakes, because they can be confused with octal numbers.
+
+Note similarly, when 'nrformats' includes "bin", binary numbers with a leading
+'0x' or '0X' can be interpreted as hexadecimal rather than binary since '0b'
+are valid hexadecimal digits.
+
+The CTRL-A command is very useful in a macro. Example: Use the following
+steps to make a numbered list.
+
+1. Create the first list entry, make sure it starts with a number.
+2. qa - start recording into register 'a'
+3. Y - yank the entry
+4. p - put a copy of the entry below the first one
+5. CTRL-A - increment the number
+6. q - stop recording
+7. <count>@a - repeat the yank, put and increment <count> times
+
+
+SHIFTING LINES LEFT OR RIGHT *shift-left-right*
+
+ *<*
+<{motion} Shift {motion} lines one 'shiftwidth' leftwards.
+
+ If the 'vartabstop' feature is enabled, and the
+ 'shiftwidth' option is set to zero, the amount of
+ indent is calculated at the first non-blank character
+ in the line.
+ *<<*
+<< Shift [count] lines one 'shiftwidth' leftwards.
+
+ *v_<*
+{Visual}[count]< Shift the highlighted lines [count] 'shiftwidth'
+ leftwards (for {Visual} see |Visual-mode|).
+
+ *>*
+ >{motion} Shift {motion} lines one 'shiftwidth' rightwards.
+
+ If the 'vartabstop' feature is enabled, and the
+ 'shiftwidth' option is set to zero, the amount of
+ indent is calculated at the first non-blank character
+ in the line.
+ *>>*
+ >> Shift [count] lines one 'shiftwidth' rightwards.
+
+ *v_>*
+{Visual}[count]> Shift the highlighted lines [count] 'shiftwidth'
+ rightwards (for {Visual} see |Visual-mode|).
+
+ *:<*
+:[range]< Shift [range] lines one 'shiftwidth' left. Repeat '<'
+ for shifting multiple 'shiftwidth's.
+
+:[range]< {count} Shift {count} lines one 'shiftwidth' left, starting
+ with [range] (default current line |cmdline-ranges|).
+ Repeat '<' for shifting multiple 'shiftwidth's.
+
+:[range]le[ft] [indent] left align lines in [range]. Sets the indent in the
+ lines to [indent] (default 0).
+
+ *:>*
+:[range]> [flags] Shift {count} [range] lines one 'shiftwidth' right.
+ Repeat '>' for shifting multiple 'shiftwidth's.
+ See |ex-flags| for [flags].
+
+:[range]> {count} [flags]
+ Shift {count} lines one 'shiftwidth' right, starting
+ with [range] (default current line |cmdline-ranges|).
+ Repeat '>' for shifting multiple 'shiftwidth's.
+ See |ex-flags| for [flags].
+
+The ">" and "<" commands are handy for changing the indentation within
+programs. Use the 'shiftwidth' option to set the size of the white space
+which these commands insert or delete. Normally the 'shiftwidth' option is 8,
+but you can set it to, say, 3 to make smaller indents. The shift leftwards
+stops when there is no indent. The shift right does not affect empty lines.
+
+If the 'shiftround' option is on, the indent is rounded to a multiple of
+'shiftwidth'.
+
+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
+made out of spaces with the same indent made out of <Tab>s (and a few spaces
+if necessary). If the 'expandtab' option is on, Vim uses only spaces. Then
+you can use ">><<" to replace <Tab>s in the indent by spaces (or use
+`:retab!`).
+
+To move a line several 'shiftwidth's, use Visual mode or the `:` commands.
+For example: >
+ Vjj4> move three lines 4 indents to the right
+ :<<< move current line 3 indents to the left
+ :>> 5 move 5 lines 2 indents to the right
+ :5>> move line 5 2 indents to the right
+
+==============================================================================
+4. Complex changes *complex-change*
+
+4.1 Filter commands *filter*
+
+A filter is a program that accepts text at standard input, changes it in some
+way, and sends it to standard output. You can use the commands below to send
+some text through a filter, so that it is replaced by the filter output.
+Examples of filters are "sort", which sorts lines alphabetically, and
+"indent", which formats C program files (you need a version of indent that
+works like a filter; not all versions do). The 'shell' option specifies the
+shell Vim uses to execute the filter command (See also the 'shelltype'
+option). You can repeat filter commands with ".". Vim does not recognize a
+comment (starting with '"') after the `:!` command.
+
+ *!*
+!{motion}{filter} Filter {motion} text lines through the external
+ program {filter}.
+
+ *!!*
+!!{filter} Filter [count] lines through the external program
+ {filter}.
+
+ *v_!*
+{Visual}!{filter} Filter the highlighted lines through the external
+ program {filter} (for {Visual} see |Visual-mode|).
+
+:{range}![!]{filter} [!][arg] *:range!*
+ Filter {range} lines through the external program
+ {filter}. Vim replaces the optional bangs with the
+ latest given command and appends the optional [arg].
+ Vim saves the output of the filter command in a
+ temporary file and then reads the file into the buffer
+ |tempfile|. Vim uses the 'shellredir' option to
+ redirect the filter output to the temporary file.
+ However, if the 'shelltemp' option is off then pipes
+ are used when possible (on Unix).
+ When the 'R' flag is included in 'cpoptions' marks in
+ the filtered lines are deleted, unless the
+ |:keepmarks| command is used. Example: >
+ :keepmarks '<,'>!sort
+< When the number of lines after filtering is less than
+ before, marks in the missing lines are deleted anyway.
+
+ *=*
+={motion} Filter {motion} lines through the external program
+ given with the 'equalprg' option. When the 'equalprg'
+ option is empty (this is the default), use the
+ internal formatting function |C-indenting| and
+ |'lisp'|. But when 'indentexpr' is not empty, it will
+ be used instead |indent-expression|. When Vim was
+ compiled without internal formatting then the "indent"
+ program is used as a last resort.
+
+ *==*
+== Filter [count] lines like with ={motion}.
+
+ *v_=*
+{Visual}= Filter the highlighted lines like with ={motion}.
+
+
+ *tempfile* *setuid*
+Vim uses temporary files for filtering, generating diffs and also for
+tempname(). For Unix, the file will be in a private directory (only
+accessible by the current user) to avoid security problems (e.g., a symlink
+attack or other people reading your file). When Vim exits the directory and
+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 of these directories
+that works:
+ Unix: $TMPDIR, /tmp, current-dir, $HOME.
+ Windows: $TMP, $TEMP, c:\TMP, c:\TEMP
+For MS-Windows the GetTempFileName() system function is used.
+For other systems the tmpnam() library function is used.
+
+
+
+4.2 Substitute *:substitute*
+ *:s* *:su*
+:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
+ For each line in [range] replace a match of {pattern}
+ with {string}.
+ For the {pattern} see |pattern|.
+ {string} can be a literal string, or something
+ special; see |sub-replace-special|.
+ 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.
+ *E939*
+ [count] must be a positive number. Also see
+ |cmdline-ranges|.
+
+ See |:s_flags| for [flags].
+ The delimiter doesn't need to be /, see
+ |pattern-delimiter|.
+
+:[range]s[ubstitute] [flags] [count]
+:[range]&[&][flags] [count] *:&*
+ Repeat last :substitute with same search pattern and
+ substitute string, but without the same flags. You
+ may add [flags], see |:s_flags|.
+ Note that after `:substitute` the '&' flag can't be
+ used, it's recognized as a pattern separator.
+ The space between `:substitute` and the 'c', 'g',
+ 'i', 'I' and 'r' flags isn't required, but in scripts
+ it's a good idea to keep it to avoid confusion.
+ Also see the two and three letter commands to repeat
+ :substitute below |:substitute-repeat|.
+
+:[range]~[&][flags] [count] *:~*
+ Repeat last substitute with same substitute string
+ but with last used search pattern. This is like
+ `:&r`. See |:s_flags| for [flags].
+
+ *&*
+& Synonym for `:s` (repeat last substitute). Note
+ that the flags are not remembered, thus it might
+ actually work differently. You can use `:&&` to keep
+ the flags.
+
+ *g&*
+g& Synonym for `:%s//~/&` (repeat last substitute with
+ last search pattern on all lines with the same flags).
+ For example, when you first do a substitution with
+ `:s/pattern/repl/flags` and then `/search` for
+ something else, `g&` will do `:%s/search/repl/flags`.
+ Mnemonic: global substitute.
+
+ *:snomagic* *:sno*
+:[range]sno[magic] ... Same as `:substitute`, but always use 'nomagic'.
+
+ *:smagic* *:sm*
+:[range]sm[agic] ... Same as `:substitute`, but always use 'magic'.
+
+ *: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: >
+ :&&
+ :s/this/that/&
+< Note that `:s` and `:&` don't keep the flags.
+
+[c] Confirm each substitution. Vim highlights the matching string (with
+ |hl-IncSearch|). You can type: *:s_c*
+ 'y' to substitute this match
+ 'l' to substitute this match and then quit ("last")
+ 'n' to skip this match
+ <Esc> to quit substituting
+ 'a' to substitute this and all remaining matches
+ 'q' to quit substituting
+ CTRL-E to scroll the screen up
+ CTRL-Y to scroll the screen down
+ If the 'edcompatible' option is on, Vim remembers the [c] flag and
+ toggles it each time you use it, but resets it when you give a new
+ search pattern.
+
+ *: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
+ does not suppress the following error messages, however:
+ Regular expressions can't be delimited by letters
+ \ should be followed by /, ? or &
+ No previous substitute regular expression
+ 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 'edcompatible' option is on, Vim remembers this flag and toggles
+ it each time you use it, but resets it when you give a new search
+ pattern. 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. *:s_p*
+
+[#] Like [p] and prepend the line number. *:s_#*
+
+[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
+ last substitute or `:global`. If the last command that did a search
+ was a substitute or `:global`, there is no effect. If the last
+ command was a search command such as "/", use the pattern from that
+ command.
+ For `:s` with an argument this already happens: >
+ :s/blue/red/
+ /green
+ :s//red/ or :~ or :&r
+< The last commands will replace "green" with "red". >
+ :s/blue/red/
+ /green
+ :&
+< The last command will replace "blue" with "red".
+
+Note that there is no flag to change the "magicness" of the pattern. A
+different command is used instead, or you can use |/\v| and friends. The
+reason is that the flags can only be found by skipping the pattern, and in
+order to skip the pattern the "magicness" must be known. Catch 22!
+
+If the {pattern} for the substitute command is empty, the command uses the
+pattern from the last substitute or `:global` command. If there is none, but
+there is a previous search pattern, that one is used. With the [r] flag, the
+command uses the pattern from the last substitute, `:global`, or search
+command.
+
+If the {string} is omitted the substitute is done as if it's empty. Thus the
+matched pattern is deleted. The separator after {pattern} can also be left
+out then. Example: >
+ :%s/TESTING
+This deletes "TESTING" from all lines, but only one per line.
+ *E1270*
+For compatibility with Vi these two exceptions are allowed in legacy script:
+"\/{string}/" and "\?{string}?" do the same as "//{string}/r".
+"\&{string}&" does the same as "//{string}/".
+ *pattern-delimiter* *E146* *E1241* *E1242*
+Instead of the '/' which surrounds the pattern and replacement string, you can
+use another single-byte character. This is useful if you want to include a
+'/' in the search pattern or replacement string. Example: >
+ :s+/+//+
+
+You can use most characters, but not an alphanumeric character, '\', '"' or
+'|'. In Vim9 script you should not use '#' because it may be recognized as
+the start of a comment.
+
+For the definition of a pattern, see |pattern|. In Visual block mode, use
+|/\%V| in the pattern to have the substitute work in the block only.
+Otherwise it works on whole lines anyway.
+
+ *sub-replace-special* *:s\=*
+When the {string} starts with "\=" it is evaluated as an expression, see
+|sub-replace-expression|. You can use that for complex replacement or special
+characters.
+
+The substitution is limited in recursion to 4 levels. *E1290*
+
+Otherwise these characters in {string} have a special meaning:
+ *:s%*
+When {string} is equal to "%" and '/' is included with the 'cpoptions' option,
+then the {string} of the previous substitute command is used, see |cpo-/|
+
+magic nomagic action ~
+ & \& replaced with the whole matched pattern *s/\&*
+ \& & replaced with &
+ \0 replaced with the whole matched pattern *\0* *s/\0*
+ \1 replaced with the matched pattern in the first
+ pair of () *s/\1*
+ \2 replaced with the matched pattern in the second
+ pair of () *s/\2*
+ .. .. *s/\3*
+ \9 replaced with the matched pattern in the ninth
+ pair of () *s/\9*
+ ~ \~ replaced with the {string} of the previous
+ substitute *s~*
+ \~ ~ replaced with ~ *s/\~*
+ \u next character made uppercase *s/\u*
+ \U following characters made uppercase, until \E *s/\U*
+ \l next character made lowercase *s/\l*
+ \L following characters made lowercase, until \E *s/\L*
+ \e end of \u, \U, \l and \L (NOTE: not <Esc>!) *s/\e*
+ \E end of \u, \U, \l and \L *s/\E*
+ <CR> split line in two at this point
+ (Type the <CR> as CTRL-V <Enter>) *s<CR>*
+ \r idem *s/\r*
+ \<CR> insert a carriage-return (CTRL-M)
+ (Type the <CR> as CTRL-V <Enter>) *s/\<CR>*
+ \n insert a <NL> (<NUL> in the file)
+ (does NOT break the line) *s/\n*
+ \b insert a <BS> *s/\b*
+ \t insert a <Tab> *s/\t*
+ \\ insert a single backslash *s/\\*
+ \x where x is any character not mentioned above:
+ Reserved for future expansion
+
+The special meaning is also used inside the third argument {sub} of
+the |substitute()| function with the following exceptions:
+ - A % inserts a percent literally without regard to 'cpoptions'.
+ - magic is always set without regard to 'magic'.
+ - A ~ inserts a tilde literally.
+ - <CR> and \r inserts a carriage-return (CTRL-M).
+ - \<CR> does not have a special meaning. It's just one of \x.
+
+Examples: >
+ :s/a\|b/xxx\0xxx/g modifies "a b" to "xxxaxxx xxxbxxx"
+ :s/\([abc]\)\([efg]\)/\2\1/g modifies "af fa bg" to "fa fa gb"
+ :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\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
+out the "\L". Same for "\U\l".
+
+Note: In previous versions CTRL-V was handled in a special way. Since this is
+not Vi compatible, this was removed. Use a backslash instead.
+
+command text result ~
+:s/aa/a^Ma/ aa a<line-break>a
+:s/aa/a\^Ma/ aa a^Ma
+:s/aa/a\\^Ma/ aa a\<line-break>a
+
+(you need to type CTRL-V <CR> to get a ^M here)
+
+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
+\1 or \2 is empty. Example: >
+ :s/\([ab]\)\|\([cd]\)/\1x/g modifies "a b c d" to "ax bx x x"
+<
+
+ *:sc* *:sce* *:scg* *:sci* *:scI* *:scl* *:scp* *:sg* *:sgc*
+ *:sge* *:sgi* *:sgI* *:sgl* *:sgn* *:sgp* *:sgr* *:sI* *:si*
+ *:sic* *:sIc* *:sie* *:sIe* *:sIg* *:sIl* *:sin* *:sIn* *:sIp*
+ *:sip* *:sIr* *:sir* *:sr* *:src* *:srg* *:sri* *:srI* *:srl*
+ *:srn* *:srp* *:substitute-repeat*
+2-letter and 3-letter :substitute commands ~
+
+These commands repeat the previous `:substitute` command with the given flags.
+The first letter is always "s", followed by one or two of the possible flag
+characters. For example `:sce` works like `:s///ce`. The table lists the
+possible combinations, not all flags are possible, because the command is
+short for another command.
+
+ List of :substitute commands
+ | c e g i I n p l r
+ | c :sc :sce :scg :sci :scI :scn :scp :scl
+ | e
+ | g :sgc :sge :sg :sgi :sgI :sgn :sgp :sgl :sgr
+ | i :sic :sie :si :siI :sin :sip :sir
+ | I :sIc :sIe :sIg :sIi :sI :sIn :sIp :sIl :sIr
+ | n
+ | p
+ | l
+ | r :src :srg :sri :srI :srn :srp :srl :sr
+
+Exceptions:
+ :scr is `:scriptnames`
+ :se is `:set`
+ :sig is `:sign`
+ :sil is `:silent`
+ :sn is `:snext`
+ :sp is `:split`
+ :sl is `:sleep`
+ :sre is `:srewind`
+
+
+Substitute with an expression *sub-replace-expression*
+ *sub-replace-\=* *s/\=*
+When the substitute string starts with "\=" the remainder is interpreted as an
+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
+can get one with a double-quote string: "\n". Prepend a backslash to get a
+real <NL> character (which will be a NUL in the file).
+
+The "\=" notation can also be used inside the third argument {sub} of
+|substitute()| function. In this case, the special meaning for characters as
+mentioned at |sub-replace-special| does not apply at all. Especially, <CR> and
+<NL> are interpreted not as a line break but as a carriage-return and a
+new-line respectively.
+
+When the result is a |List| then the items are joined with separating line
+breaks. Thus each item becomes a line, except that they can contain line
+breaks themselves.
+
+The |submatch()| function can be used to obtain matched text. The whole
+matched text can be accessed with "submatch(0)". The text matched with the
+first pair of () with "submatch(1)". Likewise for further sub-matches in ().
+
+Be careful: The separation character must not appear in the expression!
+Consider using a character like "@" or ":". There is no problem if the result
+of the expression contains the separation character.
+
+Examples: >
+ :s@\n@\="\r" .. expand("$HOME") .. "\r"@
+This replaces an end-of-line with a new line containing the value of $HOME. >
+
+ s/E/\="\<Char-0x20ac>"/g
+This replaces each 'E' character with a euro sign. Read more in |<Char->|.
+
+
+4.3 Search and replace *search-replace*
+
+ *:pro* *:promptfind*
+:promptf[ind] [string]
+ Put up a Search dialog. When [string] is given, it is
+ used as the initial search string.
+ {only for Win32, Motif and GTK GUI}
+
+ *:promptr* *:promptrepl*
+:promptr[epl] [string]
+ Put up a Search/Replace dialog. When [string] is
+ given, it is used as the initial search string.
+ {only for Win32, Motif and GTK GUI}
+
+
+4.4 Changing tabs *change-tabs*
+ *:ret* *:retab* *:retab!*
+:[range]ret[ab][!] [new_tabstop]
+ Replace all sequences of white-space containing a
+ <Tab> with new strings of white-space using the new
+ tabstop value given. If you do not specify a new
+ tabstop size or it is zero, Vim uses the current value
+ of 'tabstop'.
+ The current value of 'tabstop' is always used to
+ compute the width of existing tabs.
+ With !, Vim also replaces strings of only normal
+ spaces with tabs where appropriate.
+ With 'expandtab' on, Vim replaces all tabs with the
+ appropriate number of spaces.
+ This command sets 'tabstop' to the new value given,
+ and if performed on the whole file, which is default,
+ should not make any visible change.
+ Careful: This command modifies any <Tab> characters
+ inside of strings in a C program. Use "\t" to avoid
+ this (that's a good habit anyway).
+ `:retab!` may also change a sequence of spaces by
+ <Tab> characters, which can mess up a printf().
+ If the |+vartabs| feature is enabled then a list of
+ tab widths separated by commas may be used in place of
+ a single tabstop. Each value in the list represents
+ the width of one tabstop, except the final value which
+ applies to all following tabstops.
+
+ *retab-example*
+Example for using autocommands and ":retab" to edit a file which is stored
+with tabstops at 8 but edited with tabstops set at 4. Warning: white space
+inside of strings can change! Also see 'softtabstop' option. >
+
+ :auto BufReadPost *.xx retab! 4
+ :auto BufWritePre *.xx retab! 8
+ :auto BufWritePost *.xx retab! 4
+ :auto BufNewFile *.xx set ts=4
+
+==============================================================================
+5. Copying and moving text *copy-move*
+
+ *quote*
+"{register} Use {register} for next delete, yank or put. Use
+ an uppercase character to append with delete and yank.
+ Registers ".", "%", "#" and ":" only work with put.
+
+ *:reg* *:registers*
+:reg[isters] Display the type and contents of all numbered and
+ named registers. If a register is written to for
+ |:redir| it will not be listed.
+ Type can be one of:
+ "c" for |characterwise| text
+ "l" for |linewise| text
+ "b" for |blockwise-visual| text
+
+
+:reg[isters] {arg} Display the contents of the numbered and named
+ registers that are mentioned in {arg}. For example: >
+ :reg 1a
+< to display registers '1' and 'a'. Spaces are allowed
+ in {arg}.
+
+ *:di* *:dis* *:display*
+:di[splay] [arg] Same as :registers.
+
+ *y* *yank*
+["x]y{motion} Yank {motion} text [into register x]. When no
+ characters are to be yanked (e.g., "y0" in column 1),
+ this is an error when 'cpoptions' includes the 'E'
+ flag.
+
+ *yy*
+["x]yy Yank [count] lines [into register x] |linewise|.
+
+ *Y*
+["x]Y yank [count] lines [into register x] (synonym for
+ yy, |linewise|). If you like "Y" to work from the
+ cursor to the end of line (which is more logical,
+ but not Vi-compatible) use ":map Y y$".
+
+ *zy*
+["x]zy{motion} Yank {motion} text [into register x]. Only differs
+ from `y` when selecting a block of text, see |v_zy|.
+
+ *v_y*
+{Visual}["x]y Yank the highlighted text [into register x] (for
+ {Visual} see |Visual-mode|).
+
+ *v_Y*
+{Visual}["x]Y Yank the highlighted lines [into register x] (for
+ {Visual} see |Visual-mode|).
+
+ *v_zy*
+{Visual}["x]zy Yank the highlighted text [into register x]. Trailing
+ whitespace at the end of each line of a selected block
+ won't be yanked. Especially useful in combination
+ with `zp`. (for {Visual} see |Visual-mode|)
+
+ *:y* *:yank* *E850*
+:[range]y[ank] [x] Yank [range] lines [into register x]. Yanking to the
+ "* or "+ registers is possible only when the
+ |+clipboard| feature is included.
+
+:[range]y[ank] [x] {count}
+ Yank {count} lines, starting with last line number
+ in [range] (default: current line |cmdline-ranges|),
+ [into register x].
+
+ *p* *put* *E353* *E1240*
+["x]p Put the text [from register x] after the cursor
+ [count] times.
+
+ *P*
+["x]P Put the text [from register x] before the cursor
+ [count] times.
+
+ *<MiddleMouse>*
+["x]<MiddleMouse> Put the text from a register before the cursor [count]
+ times. Uses the "* register, unless another is
+ specified.
+ Leaves the cursor at the end of the new text.
+ Using the mouse only works when 'mouse' contains 'n'
+ or 'a'.
+ If you have a scrollwheel and often accidentally paste
+ text, you can use these mappings to disable the
+ pasting with the middle mouse button: >
+ :map <MiddleMouse> <Nop>
+ :imap <MiddleMouse> <Nop>
+< You might want to disable the multi-click versions
+ too, see |double-click|.
+
+ *gp*
+["x]gp Just like "p", but leave the cursor just after the new
+ text.
+
+ *gP*
+["x]gP Just like "P", but leave the cursor just after the new
+ text.
+
+ *:pu* *:put*
+:[line]pu[t] [x] Put the text [from register x] after [line] (default
+ current line). This always works |linewise|, thus
+ this command can be used to put a yanked block as new
+ lines.
+ If no register is specified, it depends on the 'cb'
+ option: If 'cb' contains "unnamedplus", paste from the
+ + register |quoteplus|. Otherwise, if 'cb' contains
+ "unnamed", paste from the * register |quotestar|.
+ Otherwise, paste from the unnamed register
+ |quote_quote|.
+ The register can also be '=' followed by an optional
+ expression. The expression continues until the end of
+ the command. You need to escape the '|' and '"'
+ characters to prevent them from terminating the
+ command. Example: >
+ :put ='path' .. \",/test\"
+< If there is no expression after '=', Vim uses the
+ previous expression. You can see it with ":dis =".
+
+:[line]pu[t]! [x] Put the text [from register x] before [line] (default
+ current line).
+
+["x]]p or *]p* *]<MiddleMouse>*
+["x]]<MiddleMouse> Like "p", but adjust the indent to the current line.
+ Using the mouse only works when 'mouse' contains 'n'
+ or 'a'.
+
+["x][P or *[P*
+["x]]P or *]P*
+["x][p or *[p* *[<MiddleMouse>*
+["x][<MiddleMouse> Like "P", but adjust the indent to the current line.
+ Using the mouse only works when 'mouse' contains 'n'
+ or 'a'.
+
+["x]zp or *zp* *zP*
+["x]zP Like "p" and "P", except without adding trailing spaces
+ when pasting a block. Thus the inserted text will not
+ always be a rectangle. Especially useful in
+ combination with |v_zy|.
+
+You can use these commands to copy text from one place to another. Do this
+by first getting the text into a register with a yank, delete or change
+command, then inserting the register contents with a put command. You can
+also use these commands to move text from one file to another, because Vim
+preserves all registers when changing buffers (the CTRL-^ command is a quick
+way to toggle between two files).
+
+ *linewise-register* *characterwise-register*
+You can repeat the put commands with "." (except for :put) and undo them. If
+the command that was used to get the text into the register was |linewise|,
+Vim inserts the text below ("p") or above ("P") the line where the cursor is.
+Otherwise Vim inserts the text after ("p") or before ("P") the cursor. With
+the ":put" command, Vim always inserts the text in the next line. You can
+exchange two characters with the command sequence "xp". You can exchange two
+lines with the command sequence "ddp". You can exchange two words with the
+command sequence "deep" (start with the cursor in the blank space before the
+first word). You can use the "']" or "`]" command after the put command to
+move the cursor to the end of the inserted text, or use "'[" or "`[" to move
+the cursor to the start.
+
+ *put-Visual-mode* *v_p* *v_P*
+When using a put command like |p| or |P| in Visual mode, Vim will try to
+replace the selected text with the contents of the register. Whether this
+works well depends on the type of selection and the type of the text in the
+register. With blockwise selection it also depends on the size of the block
+and whether the corners are on an existing character. (Implementation detail:
+it actually works by first putting the register after the selection and then
+deleting the selection.)
+With |p| the previously selected text is put in the unnamed register (and
+possibly the selection and/or clipboard). This is useful if you want to put
+that text somewhere else. But you cannot repeat the same change.
+With |P| the unnamed register is not changed (and neither the selection or
+clipboard), you can repeat the same change. But the deleted text cannot be
+used. If you do need it you can use |p| with another register. E.g., yank
+the text to copy, Visually select the text to replace and use "0p . You can
+repeat this as many times as you like, and the unnamed register will be
+changed each time.
+ *blockwise-put*
+When a register contains text from one line (characterwise), using a
+blockwise Visual selection, putting that register will paste that text
+repeatedly in each of the selected lines, thus replacing the blockwise
+selected region by multiple copies of the register text. For example:
+ - yank the word "TEXT" into a register with `yw`
+ - select a visual block, marked with "v" in this text:
+ aaavvaaa
+ bbbvvbbb
+ cccvvccc
+ - press `p`, results in:
+ aaaTEXTaaa
+ bbbTEXTbbb
+ cccTEXTccc
+
+ *blockwise-register*
+If you use a blockwise Visual mode command to get the text into the register,
+the block of text will be inserted before ("P") or after ("p") the cursor
+column in the current and next lines. Vim makes the whole block of text start
+in the same column. Thus the inserted text looks the same as when it was
+yanked or deleted. Vim may replace some <Tab> characters with spaces to make
+this happen. However, if the width of the block is not a multiple of a <Tab>
+width and the text after the inserted block contains <Tab>s, that text may be
+misaligned.
+
+Use |zP|/|zp| to paste a blockwise yanked register without appending trailing
+spaces.
+
+Note that after a characterwise yank command, Vim leaves the cursor on the
+first yanked character that is closest to the start of the buffer. This means
+that "yl" doesn't move the cursor, but "yh" moves the cursor one character
+left.
+Rationale: In Vi the "y" command followed by a backwards motion would
+ sometimes not move the cursor to the first yanked character,
+ because redisplaying was skipped. In Vim it always moves to
+ the first character, as specified by Posix.
+With a linewise yank command the cursor is put in the first line, but the
+column is unmodified, thus it may not be on the first yanked character.
+
+There are ten types of registers: *registers* *{register}* *E354*
+1. The unnamed register ""
+2. 10 numbered registers "0 to "9
+3. The small delete register "-
+4. 26 named registers "a to "z or "A to "Z
+5. Three read-only registers ":, "., "%
+6. Alternate buffer register "#
+7. The expression register "=
+8. The selection and drop registers "*, "+ and "~
+9. The black hole register "_
+10. Last search pattern register "/
+
+1. Unnamed register "" *quote_quote* *quotequote*
+Vim fills this register with text deleted with the "d", "c", "s", "x" commands
+or copied with the yank "y" command, regardless of whether or not a specific
+register was used (e.g. "xdd). This is like the unnamed register is pointing
+to the last used register. Thus when appending using an uppercase register
+name, the unnamed register contains the same text as the named register.
+An exception is the '_' register: "_dd does not store the deleted text in any
+register.
+Vim uses the contents of the unnamed register for any put command (p or P)
+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.
+{Vi: register contents are lost when changing files, no '"'}
+
+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,
+unless the command specified another register with ["x].
+ Numbered register 1 contains the text deleted by the most recent delete or
+change command, unless the command specified another register or the text is
+less than one line (the small delete register is used then). An exception is
+made for the delete operator with these movement commands: |%|, |(|, |)|, |`|,
+|/|, |?|, |n|, |N|, |{| and |}|. Register "1 is always used then (this is Vi
+compatible). The "- register is used as well if the delete is within a line.
+Note that these characters may be mapped. E.g. |%| is mapped by the matchit
+plugin.
+ With each successive deletion or change, Vim shifts the previous contents
+of register 1 into register 2, 2 into 3, and so forth, losing the previous
+contents of register 9.
+{Vi: numbered register contents are lost when changing files; register 0 does
+not exist}
+
+3. Small delete register "- *quote_-* *quote-*
+This register contains text from commands that delete less than one line,
+except when the command specifies a register with ["x].
+
+4. Named registers "a to "z or "A to "Z *quote_alpha* *quotea*
+Vim fills these registers only when you say so. Specify them as lowercase
+letters to replace their previous contents or as uppercase letters to append
+to their previous contents. When the '>' flag is present in 'cpoptions' then
+a line break is inserted before the appended text.
+
+5. Read-only registers ":, ". and "%
+These are '%', ':' and '.'. You can use them only with the "p", "P",
+and ":put" commands and with CTRL-R.
+ *quote_.* *quote.* *E29*
+ ". Contains the last inserted text (the same as what is inserted
+ with the insert mode commands CTRL-A and CTRL-@). Note: this
+ doesn't work with CTRL-R on the command-line. It works a bit
+ differently, like inserting the text instead of putting it
+ ('textwidth' and other options affect what is inserted).
+ *quote_%* *quote%*
+ "% Contains the name of the current file.
+ *quote_:* *quote:* *E30*
+ ": Contains the most recent executed command-line. Example: Use
+ "@:" to repeat the previous command-line command.
+ The command-line is only stored in this register when at least
+ one character of it was typed. Thus it remains unchanged if
+ the command was completely from a mapping.
+ {not available when compiled without the |+cmdline_hist|
+ feature}
+ *quote_#* *quote#*
+6. Alternate file register "#
+Contains the name of the alternate file for the current window. It will
+change how the |CTRL-^| command works.
+This register is writable, mainly to allow for restoring it after a plugin has
+changed it. It accepts buffer number: >
+ let altbuf = bufnr(@#)
+ ...
+ let @# = altbuf
+It will give error |E86| if you pass buffer number and this buffer does not
+exist.
+It can also accept a match with an existing buffer name: >
+ let @# = 'buffer_name'
+Error |E93| if there is more than one buffer matching the given name or |E94|
+if none of buffers matches the given name.
+
+7. Expression register "= *quote_=* *quote=* *@=*
+This is not really a register that stores text, but is a way to use an
+expression in commands which use a register. The expression register is
+read-write.
+
+When typing the '=' after " or CTRL-R the cursor moves to the command-line,
+where you can enter any expression (see |expression|). All normal
+command-line editing commands are available, including a special history for
+expressions. When you end the command-line by typing <CR>, Vim computes the
+result of the expression. If you end it with <Esc>, Vim abandons the
+expression. If you do not enter an expression, Vim uses the previous
+expression (like with the "/" command).
+
+The expression must evaluate to a String. A Number is always automatically
+converted to a String. For the "p" and ":put" command, if the result is a
+Float it's converted into a String. If the result is a List each element is
+turned into a String and used as a line. A Dictionary or FuncRef results in
+an error message (use string() to convert).
+
+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 "~
+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 the clipboard
+is only available when the |+xterm_clipboard| feature is present.
+
+Note that there is only a distinction between "* and "+ for X11 systems. For
+an explanation of the difference, see |x11-selection|. Under MS-Windows, use
+of "* and "+ is actually synonymous and refers to the |gui-clipboard|.
+
+ *quote_~* *quote~* *<Drop>*
+The read-only "~ register stores the dropped text from the last drag'n'drop
+operation. When something has been dropped onto Vim, the "~ register is
+filled in and the <Drop> pseudo key is sent for notification. You can remap
+this key if you want; the default action (for all modes) is to insert the
+contents of the "~ register at the cursor position.
+{only available when compiled with the |+dnd| feature, currently only with the
+GTK GUI}
+
+Note: The "~ register is only used when dropping plain text onto Vim.
+Drag'n'drop of URI lists is handled internally.
+
+9. Black hole register "_ *quote_*
+When writing to this register, nothing happens. This can be used to delete
+text without affecting the normal registers. When reading from this register,
+nothing is returned.
+
+10. Last search pattern register "/ *quote_/* *quote/*
+Contains the most recent search-pattern. This is used for "n" and 'hlsearch'.
+It is writable with `:let`, you can change it to have 'hlsearch' highlight
+other matches without actually searching. You can't yank or delete into this
+register. The search direction is available in |v:searchforward|.
+Note that the value is restored when returning from a function
+|function-search-undo|.
+
+ *@/*
+You can write to a register with a `:let` command |:let-@|. Example: >
+ :let @/ = "the"
+
+If you use a put command without specifying a register, Vim uses the register
+that was last filled (this is also the contents of the unnamed register). If
+you are confused, use the `:dis` command to find out what Vim will put (this
+command displays all named and numbered registers; the unnamed register is
+labelled '"').
+
+The next three commands always work on whole lines.
+
+:[range]co[py] {address} *:co* *:copy*
+ Copy the lines given by [range] to below the line
+ given by {address}.
+
+ *:t*
+:t Synonym for copy.
+ This command is not supported in |Vim9| script,
+ because it is too easily confused with a variable
+ name.
+
+:[range]m[ove] {address} *:m* *:mo* *:move* *E134*
+ Move the lines given by [range] to below the line
+ given by {address}.
+
+==============================================================================
+6. Formatting text *formatting*
+
+:[range]ce[nter] [width] *:ce* *:center*
+ Center lines in [range] between [width] columns
+ (default 'textwidth' or 80 when 'textwidth' is 0).
+
+:[range]ri[ght] [width] *:ri* *:right*
+ Right-align lines in [range] at [width] columns
+ (default 'textwidth' or 80 when 'textwidth' is 0).
+
+ *:le* *:left*
+:[range]le[ft] [indent]
+ Left-align lines in [range]. Sets the indent in the
+ lines to [indent] (default 0).
+
+ *gq*
+gq{motion} Format the lines that {motion} moves over.
+ Formatting is done with one of three methods:
+ 1. If 'formatexpr' is not empty the expression is
+ evaluated. This can differ for each buffer.
+ 2. If 'formatprg' is not empty an external program
+ is used.
+ 3. Otherwise formatting is done internally.
+
+ In the third case the 'textwidth' option controls the
+ length of each formatted line (see below).
+ If the 'textwidth' option is 0, the formatted line
+ length is the screen width (with a maximum width of
+ 79).
+ The 'formatoptions' option controls the type of
+ formatting |fo-table|.
+ The cursor is left on the first non-blank of the last
+ formatted line.
+ NOTE: The "Q" command formerly performed this
+ function. If you still want to use "Q" for
+ formatting, use this mapping: >
+ :nnoremap Q gq
+
+gqgq *gqgq* *gqq*
+gqq Format the current line. With a count format that
+ many lines.
+
+ *v_gq*
+{Visual}gq Format the highlighted text. (for {Visual} see
+ |Visual-mode|).
+
+ *gw*
+gw{motion} Format the lines that {motion} moves over. Similar to
+ |gq| but puts the cursor back at the same position in
+ the text. However, 'formatprg' and 'formatexpr' are
+ not used.
+
+gwgw *gwgw* *gww*
+gww Format the current line as with "gw".
+
+ *v_gw*
+{Visual}gw Format the highlighted text as with "gw". (for
+ {Visual} see |Visual-mode|).
+
+Example: To format the current paragraph use: *gqap* >
+ gqap
+
+The "gq" command leaves the cursor in the line where the motion command takes
+the cursor. This allows you to repeat formatting repeated with ".". This
+works well with "gqj" (format current and next line) and "gq}" (format until
+end of paragraph). Note: When 'formatprg' is set, "gq" leaves the cursor on
+the first formatted line (as with using a filter command).
+
+If you want to format the current paragraph and continue where you were, use: >
+ gwap
+If you always want to keep paragraphs formatted you may want to add the 'a'
+flag to 'formatoptions'. See |auto-format|.
+
+If the 'autoindent' option is on, Vim uses the indent of the first line for
+the following lines.
+
+Formatting does not change empty lines (but it does change lines with only
+white space!).
+
+The 'joinspaces' option is used when lines are joined together.
+
+You can set the 'formatexpr' option to an expression or the 'formatprg' option
+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 Vim's 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
+paragraph) or set 'formatprg' to "par".
+
+ *format-comments*
+An overview of comment formatting is in section |30.6| of the user manual.
+
+Vim can automatically insert and format comments in a special way. Vim
+recognizes a comment by a specific string at the start of the line (ignoring
+white space). Three types of comments can be used:
+
+- A comment string that repeats at the start of each line. An example is the
+ type of comment used in shell scripts, starting with "#".
+- A comment string that occurs only in the first line, not in the following
+ lines. An example is this list with dashes.
+- Three-piece comments that have a start string, an end string, and optional
+ lines in between. The strings for the start, middle and end are different.
+ An example is the C style comment:
+ /*
+ * this is a C comment
+ */
+
+The 'comments' option is a comma-separated list of parts. Each part defines a
+type of comment string. A part consists of:
+ {flags}:{string}
+
+{string} is the literal text that must appear.
+
+{flags}:
+ n Nested comment. Nesting with mixed parts is allowed. If 'comments'
+ is "n:),n:>" a line starting with "> ) >" is a comment.
+
+ b Blank (<Space>, <Tab> or <EOL>) required after {string}.
+
+ f Only the first line has the comment string. Do not repeat comment on
+ the next line, but preserve indentation (e.g., a bullet-list).
+
+ s Start of three-piece comment
+
+ m Middle of a three-piece comment
+
+ e End of a three-piece comment
+
+ l Left align. Used together with 's' or 'e', the leftmost character of
+ start or end will line up with the leftmost character from the middle.
+ This is the default and can be omitted. See below for more details.
+
+ r Right align. Same as above but rightmost instead of leftmost. See
+ below for more details.
+
+ O Don't consider this comment for the "O" command.
+
+ x Allows three-piece comments to be ended by just typing the last
+ character of the end-comment string as the first action on a new
+ line when the middle-comment string has been inserted automatically.
+ See below for more details.
+
+ {digits}
+ When together with 's' or 'e': add {digit} amount of offset to an
+ automatically inserted middle or end comment leader. The offset begins
+ from a left alignment. See below for more details.
+
+ -{digits}
+ Like {digits} but reduce the indent. This only works when there is
+ some indent for the start or end part that can be removed.
+
+When a string has none of the 'f', 's', 'm' or 'e' flags, Vim assumes the
+comment string repeats at the start of each line. The flags field may be
+empty.
+
+Any blank space in the text before and after the {string} is part of the
+{string}, so do not include leading or trailing blanks unless the blanks are a
+required part of the comment string.
+
+When one comment leader is part of another, specify the part after the whole.
+For example, to include both "-" and "->", use >
+ :set comments=f:->,f:-
+
+A three-piece comment must always be given as start,middle,end, with no other
+parts in between. An example of a three-piece comment is >
+ sr:/*,mb:*,ex:*/
+for C-comments. To avoid recognizing "*ptr" as a comment, the middle string
+includes the 'b' flag. For three-piece comments, Vim checks the text after
+the start and middle strings for the end string. If Vim finds the end string,
+the comment does not continue on the next line. Three-piece comments must
+have a middle string because otherwise Vim can't recognize the middle lines.
+
+Notice the use of the "x" flag in the above three-piece comment definition.
+When you hit Return in a C-comment, Vim will insert the middle comment leader
+for the new line: " * ". To close this comment you just have to type "/"
+before typing anything else on the new line. This will replace the
+middle-comment leader with the end-comment leader and apply any specified
+alignment, leaving just " */". There is no need to hit Backspace first.
+
+When there is a match with a middle part, but there also is a matching end
+part which is longer, the end part is used. This makes a C style comment work
+without requiring the middle part to end with a space.
+
+Here is an example of alignment flags at work to make a comment stand out
+(kind of looks like a 1 too). Consider comment string: >
+ :set comments=sr:/***,m:**,ex-2:******/
+<
+ /*** ~
+ **<--right aligned from "r" flag ~
+ ** ~
+offset 2 spaces for the "-2" flag--->** ~
+ ******/ ~
+In this case, the first comment was typed, then return was pressed 4 times,
+then "/" was pressed to end the comment.
+
+Here are some finer points of three part comments. There are three times when
+alignment and offset flags are taken into consideration: opening a new line
+after a start-comment, opening a new line before an end-comment, and
+automatically ending a three-piece comment. The end alignment flag has a
+backwards perspective; the result is that the same alignment flag used with
+"s" and "e" will result in the same indent for the starting and ending pieces.
+Only one alignment per comment part is meant to be used, but an offset number
+will override the "r" and "l" flag.
+
+Enabling 'cindent' will override the alignment flags in many cases.
+Reindenting using a different method like |gq| or |=| will not consult
+alignment flags either. The same behaviour can be defined in those other
+formatting options. One consideration is that 'cindent' has additional options
+for context based indenting of comments but cannot replicate many three piece
+indent alignments. However, 'indentexpr' has the ability to work better with
+three piece comments.
+
+Other examples: >
+ "b:*" Includes lines starting with "*", but not if the "*" is
+ followed by a non-blank. This avoids a pointer dereference
+ like "*str" to be recognized as a comment.
+ "n:>" Includes a line starting with ">", ">>", ">>>", etc.
+ "fb:-" Format a list that starts with "- ".
+
+By default, "b:#" is included. This means that a line that starts with
+"#include" is not recognized as a comment line. But a line that starts with
+"# define" is recognized. This is a compromise.
+
+ *fo-table*
+You can use the 'formatoptions' option to influence how Vim formats text.
+'formatoptions' is a string that can contain any of the letters below. The
+default setting is "tcq". You can separate the option letters with commas for
+readability.
+
+letter meaning when present in 'formatoptions' ~
+ *fo-t*
+t Auto-wrap text using 'textwidth'
+ *fo-c*
+c Auto-wrap comments using 'textwidth', inserting the current comment
+ leader automatically.
+ *fo-r*
+r Automatically insert the current comment leader after hitting
+ <Enter> in Insert mode.
+ *fo-o*
+o Automatically insert the current comment leader after hitting 'o' or
+ 'O' in Normal mode. In case comment is unwanted in a specific place
+ use CTRL-U to quickly delete it. |i_CTRL-U|
+ *fo-/*
+/ When 'o' is included: do not insert the comment leader for a //
+ comment after a statement, only when // is at the start of the line.
+ *fo-q*
+q Allow formatting of comments with "gq".
+ Note that formatting will not change blank lines or lines containing
+ only the comment leader. A new paragraph starts after such a line,
+ or when the comment leader changes.
+ *fo-w*
+w Trailing white space indicates a paragraph continues in the next line.
+ A line that ends in a non-white character ends a paragraph.
+ *fo-a*
+a Automatic formatting of paragraphs. Every time text is inserted or
+ deleted the paragraph will be reformatted. See |auto-format|.
+ When the 'c' flag is present this only happens for recognized
+ comments.
+ *fo-n*
+n When formatting text, recognize numbered lists. This actually uses
+ the 'formatlistpat' option, thus any kind of list can be used. The
+ indent of the text after the number is used for the next line. The
+ default is to find a number, optionally followed by '.', ':', ')',
+ ']' or '}'. Note that 'autoindent' must be set too. Doesn't work
+ well together with "2".
+ Example: >
+ 1. the first item
+ wraps
+ 2. the second item
+< *fo-2*
+2 When formatting text, use the indent of the second line of a paragraph
+ for the rest of the paragraph, instead of the indent of the first
+ line. This supports paragraphs in which the first line has a
+ different indent than the rest. Note that 'autoindent' must be set
+ too. Example: >
+ first line of a paragraph
+ second line of the same paragraph
+ third line.
+< This also works inside comments, ignoring the comment leader.
+ *fo-v*
+v Vi-compatible auto-wrapping in insert mode: Only break a line at a
+ blank that you have entered during the current insert command. (Note:
+ this is not 100% Vi compatible. Vi has some "unexpected features" or
+ bugs in this area. It uses the screen column instead of the line
+ column.)
+ *fo-b*
+b Like 'v', but only auto-wrap if you enter a blank at or before
+ the wrap margin. If the line was longer than 'textwidth' when you
+ started the insert, or you do not enter a blank in the insert before
+ reaching 'textwidth', Vim does not perform auto-wrapping.
+ *fo-l*
+l Long lines are not broken in insert mode: When a line was longer than
+ 'textwidth' when the insert command started, Vim does not
+ automatically format it.
+ *fo-m*
+m Also break at a multibyte character above 255. This is useful for
+ Asian text where every character is a word on its own.
+ *fo-M*
+M When joining lines, don't insert a space before or after a multibyte
+ character. Overrules the 'B' flag.
+ *fo-B*
+B When joining lines, don't insert a space between two multibyte
+ characters. Overruled by the 'M' flag.
+ *fo-1*
+1 Don't break a line after a one-letter word. It's broken before it
+ instead (if possible).
+ *fo-]*
+] Respect 'textwidth' rigorously. With this flag set, no line can be
+ longer than 'textwidth', unless line-break-prohibition rules make this
+ impossible. Mainly for CJK scripts and works only if 'encoding' is
+ "utf-8".
+ *fo-j*
+j Where it makes sense, remove a comment leader when joining lines. For
+ example, joining:
+ int i; // the index ~
+ // in the list ~
+ Becomes:
+ int i; // the index in the list ~
+ *fo-p*
+p Don't break lines at single spaces that follow periods. This is
+ intended to complement 'joinspaces' and |cpo-J|, for prose with
+ sentences separated by two spaces. For example, with 'textwidth' set
+ to 28: >
+ Surely you're joking, Mr. Feynman!
+< Becomes: >
+ Surely you're joking,
+ Mr. Feynman!
+< Instead of: >
+ Surely you're joking, Mr.
+ Feynman!
+
+
+With 't' and 'c' you can specify when Vim performs auto-wrapping:
+value action ~
+"" no automatic formatting (you can use "gq" for manual formatting)
+"t" automatic formatting of text, but not comments
+"c" automatic formatting for comments, but not text (good for C code)
+"tc" automatic formatting for text and comments
+
+Note that when 'textwidth' is 0, Vim does no automatic formatting anyway (but
+does insert comment leaders according to the 'comments' option). An exception
+is when the 'a' flag is present. |auto-format|
+
+Note that when 'paste' is on, Vim does no formatting at all.
+
+Note that 'textwidth' can be non-zero even if Vim never performs auto-wrapping;
+'textwidth' is still useful for formatting with "gq".
+
+If the 'comments' option includes "/*", "*" and/or "*/", then Vim has some
+built in stuff to treat these types of comments a bit more cleverly.
+Opening a new line before or after "/*" or "*/" (with 'r' or 'o' present in
+'formatoptions') gives the correct start of the line automatically. The same
+happens with formatting and auto-wrapping. Opening a line after a line
+starting with "/*" or "*" and containing "*/", will cause no comment leader to
+be inserted, and the indent of the new line is taken from the line containing
+the start of the comment.
+E.g.:
+ /* ~
+ * Your typical comment. ~
+ */ ~
+ The indent on this line is the same as the start of the above
+ comment.
+
+All of this should be really cool, especially in conjunction with the new
+:autocmd command to prepare different settings for different types of file.
+
+Some examples:
+ for C code (only format comments): >
+ :set fo=croq
+< for Mail/news (format all, don't start comment with "o" command): >
+ :set fo=tcrq
+<
+
+Automatic formatting *auto-format* *autoformat*
+
+When the 'a' flag is present in 'formatoptions' text is formatted
+automatically when inserting text or deleting text. This works nicely for
+editing text paragraphs. A few hints on how to use this:
+
+- You need to properly define paragraphs. The simplest is paragraphs that are
+ separated by a blank line. When there is no separating blank line, consider
+ using the 'w' flag and adding a space at the end of each line in the
+ paragraphs except the last one.
+
+- You can set the 'formatoptions' based on the type of file |filetype| or
+ specifically for one file with a |modeline|.
+
+- Set 'formatoptions' to "aw2tq" to make text with indents like this:
+
+ bla bla foobar bla
+ bla foobar bla foobar bla
+ bla bla foobar bla
+ bla foobar bla bla foobar
+
+- Add the 'c' flag to only auto-format comments. Useful in source code.
+
+- Set 'textwidth' to the desired width. If it is zero then 79 is used, or the
+ width of the screen if this is smaller.
+
+And a few warnings:
+
+- When part of the text is not properly separated in paragraphs, making
+ changes in this text will cause it to be formatted anyway. Consider doing >
+
+ :set fo-=a
+
+- When using the 'w' flag (trailing space means paragraph continues) and
+ deleting the last line of a paragraph with |dd|, the paragraph will be
+ joined with the next one.
+
+- Changed text is saved for undo. Formatting is also a change. Thus each
+ format action saves text for undo. This may consume quite a lot of memory.
+
+- Formatting a long paragraph and/or with complicated indenting may be slow.
+
+==============================================================================
+7. Sorting text *sorting*
+
+Vim has a sorting function and a sorting command. The sorting function can be
+found here: |sort()|, |uniq()|.
+
+ *:sor* *:sort*
+:[range]sor[t][!] [b][f][i][l][n][o][r][u][x] [/{pattern}/]
+ Sort lines in [range]. When no range is given all
+ lines are sorted.
+
+ With [!] the order is reversed.
+
+ With [i] case is ignored.
+
+ With [l] sort uses the current collation locale.
+ Implementation details: strcoll() is used to compare
+ strings. See |:language| to check or set the collation
+ locale. Example: >
+ :language collate en_US.UTF-8
+ :%sort l
+< |v:collate| can also used to check the current locale.
+ Sorting using the locale typically ignores case.
+ This does not work properly on Mac.
+
+ Options [n][f][x][o][b] are mutually exclusive.
+
+ With [n] sorting is done on the first decimal number
+ in the line (after or inside a {pattern} match).
+ One leading '-' is included in the number.
+
+ With [f] sorting is done on the Float in the line.
+ The value of Float is determined similar to passing
+ the text (after or inside a {pattern} match) to
+ str2float() function. This option is available only
+ if Vim was compiled with Floating point support.
+
+ With [x] sorting is done on the first hexadecimal
+ number in the line (after or inside a {pattern}
+ match). A leading "0x" or "0X" is ignored.
+ One leading '-' is included in the number.
+
+ With [o] sorting is done on the first octal number in
+ the line (after or inside a {pattern} match).
+
+ With [b] sorting is done on the first binary number in
+ the line (after or inside a {pattern} match).
+
+ With [u] (u stands for unique) only keep the first of
+ a sequence of identical lines (ignoring case when [i]
+ is used). Without this flag, a sequence of identical
+ lines will be kept in their original order.
+ Note that leading and trailing white space may cause
+ lines to be different.
+
+ When /{pattern}/ is specified and there is no [r] flag
+ the text matched with {pattern} is skipped, so that
+ you sort on what comes after the match.
+ 'ignorecase' applies to the pattern, but 'smartcase'
+ is not used.
+ Instead of the slash any non-letter can be used.
+ For example, to sort on the second comma-separated
+ field: >
+ :sort /[^,]*,/
+< To sort on the text at virtual column 10 (thus
+ ignoring the difference between tabs and spaces): >
+ :sort /.*\%10v/
+< To sort on the first number in the line, no matter
+ what is in front of it: >
+ :sort /.\{-}\ze\d/
+< (Explanation: ".\{-}" matches any text, "\ze" sets the
+ end of the match and \d matches a digit.)
+ With [r] sorting is done on the matching {pattern}
+ instead of skipping past it as described above.
+ For example, to sort on only the first three letters
+ of each line: >
+ :sort /\a\a\a/ r
+
+< If a {pattern} is used, any lines which don't have a
+ match for {pattern} are kept in their current order,
+ but separate from the lines which do match {pattern}.
+ If you sorted in reverse, they will be in reverse
+ order after the sorted lines, otherwise they will be
+ in their original order, right before the sorted
+ lines.
+
+ If {pattern} is empty (e.g. // is specified), the
+ last search pattern is used. This allows trying out
+ a pattern first.
+
+Note that using `:sort` with `:global` doesn't sort the matching lines, it's
+quite useless.
+
+`:sort` does not use the current locale unless the l flag is used.
+Vim does do a "stable" sort.
+
+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:noet:ft=help:norl:
diff --git a/runtime/doc/channel.txt b/runtime/doc/channel.txt
new file mode 100644
index 0000000..535c175
--- /dev/null
+++ b/runtime/doc/channel.txt
@@ -0,0 +1,1562 @@
+*channel.txt* For Vim version 9.0. Last change: 2022 Dec 01
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ Inter-process communication *channel*
+
+Vim uses channels to communicate with other processes.
+A channel uses a socket or pipes. *socket-interface*
+Jobs can be used to start processes and communicate with them.
+The Netbeans interface also uses a channel. |netbeans|
+
+1. Overview |job-channel-overview|
+2. Channel demo |channel-demo|
+3. Opening a channel |channel-open|
+4. Using a JSON or JS channel |channel-use|
+5. Channel commands |channel-commands|
+6. Using a RAW or NL channel |channel-raw|
+7. More channel functions |channel-more|
+8. Channel functions details |channel-functions-details|
+9. Starting a job with a channel |job-start|
+10. Starting a job without a channel |job-start-nochannel|
+11. Job functions |job-functions-details|
+12. Job options |job-options|
+13. Controlling a job |job-control|
+14. Using a prompt buffer |prompt-buffer|
+15. Language Server Protocol |language-server-protocol|
+
+ *E1277*
+{only when compiled with the |+channel| feature for channel stuff}
+ You can check this with: `has('channel')`
+{only when compiled with the |+job| feature for job stuff}
+ You can check this with: `has('job')`
+
+==============================================================================
+1. Overview *job-channel-overview*
+
+There are four main types of jobs:
+1. A daemon, serving several Vim instances.
+ Vim connects to it with a socket.
+2. One job working with one Vim instance, asynchronously.
+ Uses a socket or pipes.
+3. A job performing some work for a short time, asynchronously.
+ Uses a socket or pipes.
+4. Running a filter, synchronously.
+ Uses pipes.
+
+For when using sockets See |job-start|, |job-start-nochannel| and
+|channel-open|. For 2 and 3, one or more jobs using pipes, see |job-start|.
+For 4 use the ":{range}!cmd" command, see |filter|.
+
+Over the socket and pipes these protocols are available:
+RAW nothing known, Vim cannot tell where a message ends
+NL every message ends in a NL (newline) character
+JSON JSON encoding |json_encode()|
+JS JavaScript style JSON-like encoding |js_encode()|
+LSP Language Server Protocol encoding |language-server-protocol|
+
+Common combination are:
+- Using a job connected through pipes in NL mode. E.g., to run a style
+ checker and receive errors and warnings.
+- Using a daemon, connecting over a socket in JSON mode. E.g. to lookup
+ cross-references in a database.
+
+==============================================================================
+2. Channel demo *channel-demo* *demoserver.py*
+
+This requires Python. The demo program can be found in
+$VIMRUNTIME/tools/demoserver.py
+Run it in one terminal. We will call this T1.
+
+Run Vim in another terminal. Connect to the demo server with: >
+ let channel = ch_open('localhost:8765')
+
+In T1 you should see:
+ === socket opened === ~
+
+You can now send a message to the server: >
+ echo ch_evalexpr(channel, 'hello!')
+
+The message is received in T1 and a response is sent back to Vim.
+You can see the raw messages in T1. What Vim sends is:
+ [1,"hello!"] ~
+And the response is:
+ [1,"got it"] ~
+The number will increase every time you send a message.
+
+The server can send a command to Vim. Type this on T1 (literally, including
+the quotes):
+ ["ex","echo 'hi there'"] ~
+And you should see the message in Vim. You can move the cursor a word forward:
+ ["normal","w"] ~
+
+To handle asynchronous communication a callback needs to be used: >
+ func MyHandler(channel, msg)
+ echo "from the handler: " .. a:msg
+ endfunc
+ call ch_sendexpr(channel, 'hello!', {'callback': "MyHandler"})
+Vim will not wait for a response. Now the server can send the response later
+and MyHandler will be invoked.
+
+Instead of giving a callback with every send call, it can also be specified
+when opening the channel: >
+ call ch_close(channel)
+ let channel = ch_open('localhost:8765', {'callback': "MyHandler"})
+ call ch_sendexpr(channel, 'hello channel!')
+
+When trying out channels it's useful to see what is going on. You can tell
+Vim to write lines in log file: >
+ call ch_logfile('channellog', 'w')
+See |ch_logfile()|.
+
+==============================================================================
+3. Opening a channel *channel-open*
+
+To open a channel: >
+ let channel = ch_open({address} [, {options}])
+ if ch_status(channel) == "open"
+ " use the channel
+
+Use |ch_status()| to see if the channel could be opened.
+
+ *channel-address*
+{address} can be a domain name or an IP address, followed by a port number, or
+a Unix-domain socket path prefixed by "unix:". E.g. >
+ www.example.com:80 " domain + port
+ 127.0.0.1:1234 " IPv4 + port
+ [2001:db8::1]:8765 " IPv6 + port
+ unix:/tmp/my-socket " Unix-domain socket path
+
+{options} is a dictionary with optional entries: *channel-open-options*
+
+"mode" can be: *channel-mode*
+ "json" - Use JSON, see below; most convenient way. Default.
+ "js" - Use JS (JavaScript) encoding, more efficient than JSON.
+ "nl" - Use messages that end in a NL character
+ "raw" - Use raw messages
+ "lsp" - Use language server protocol encoding
+ *channel-callback* *E921*
+"callback" A function that is called when a message is received that is
+ not handled otherwise (e.g. a JSON message with ID zero). It
+ gets two arguments: the channel and the received message.
+ Example: >
+ func Handle(channel, msg)
+ echo 'Received: ' .. a:msg
+ endfunc
+ let channel = ch_open("localhost:8765", {"callback": "Handle"})
+<
+ When "mode" is "json" or "js" or "lsp" the "msg" argument is
+ the body of the received message, converted to Vim types.
+ When "mode" is "nl" the "msg" argument is one message,
+ excluding the NL.
+ When "mode" is "raw" the "msg" argument is the whole message
+ as a string.
+
+ For all callbacks: Use |function()| to bind it to arguments
+ and/or a Dictionary. Or use the form "dict.function" to bind
+ the Dictionary.
+
+ Callbacks are only called at a "safe" moment, usually when Vim
+ is waiting for the user to type a character. Vim does not use
+ multi-threading.
+
+ *close_cb*
+"close_cb" A function that is called when the channel gets closed, other
+ than by calling ch_close(). It should be defined like this: >
+ func MyCloseHandler(channel)
+< Vim will invoke callbacks that handle data before invoking
+ close_cb, thus when this function is called no more data will
+ be passed to the callbacks. However, if a callback causes Vim
+ to check for messages, the close_cb may be invoked while still
+ in the callback. The plugin must handle this somehow, it can
+ be useful to know that no more data is coming.
+ If it is not known if there is a message to be read, use a
+ try/catch block: >
+ try
+ let msg = ch_readraw(a:channel)
+ catch
+ let msg = 'no message'
+ endtry
+ try
+ let err = ch_readraw(a:channel, #{part: 'err'})
+ catch
+ let err = 'no error'
+ endtry
+< *channel-drop*
+"drop" Specifies when to drop messages:
+ "auto" When there is no callback to handle a message.
+ The "close_cb" is also considered for this.
+ "never" All messages will be kept.
+
+ *channel-noblock*
+"noblock" Same effect as |job-noblock|. Only matters for writing.
+
+ *waittime*
+"waittime" The time to wait for the connection to be made in
+ milliseconds. A negative number waits forever.
+
+ The default is zero, don't wait, which is useful if a local
+ server is supposed to be running already. On Unix Vim
+ actually uses a 1 msec timeout, that is required on many
+ systems. Use a larger value for a remote server, e.g. 10
+ msec at least.
+ *channel-timeout*
+"timeout" The time to wait for a request when blocking, E.g. when using
+ ch_evalexpr(). In milliseconds. The default is 2000 (2
+ seconds).
+
+When "mode" is "json" or "js" the "callback" is optional. When omitted it is
+only possible to receive a message after sending one.
+
+To change the channel options after opening it use |ch_setoptions()|. The
+arguments are similar to what is passed to |ch_open()|, but "waittime" cannot
+be given, since that only applies to opening the channel.
+
+For example, the handler can be added or changed: >
+ call ch_setoptions(channel, {'callback': callback})
+When "callback" is empty (zero or an empty string) the handler is removed.
+
+After a callback has been invoked Vim will update the screen and put the
+cursor back where it belongs. Thus the callback should not need to do
+`:redraw`.
+
+The timeout can be changed: >
+ call ch_setoptions(channel, {'timeout': msec})
+<
+ *channel-close* *E906*
+Once done with the channel, disconnect it like this: >
+ call ch_close(channel)
+When a socket is used this will close the socket for both directions. When
+pipes are used (stdin/stdout/stderr) they are all closed. This might not be
+what you want! Stopping the job with job_stop() might be better.
+All readahead is discarded, callbacks will no longer be invoked.
+
+Note that a channel is closed in three stages:
+ - The I/O ends, log message: "Closing channel". There can still be queued
+ messages to read or callbacks to invoke.
+ - The readahead is cleared, log message: "Clearing channel". Some variables
+ may still reference the channel.
+ - The channel is freed, log message: "Freeing channel".
+
+When the channel can't be opened you will get an error message. There is a
+difference between MS-Windows and Unix: On Unix when the port doesn't exist
+ch_open() fails quickly. On MS-Windows "waittime" applies.
+*E898* *E901* *E902*
+
+If there is an error reading or writing a channel it will be closed.
+*E630* *E631*
+
+==============================================================================
+4. Using a JSON or JS channel *channel-use*
+
+If mode is JSON then a message can be sent synchronously like this: >
+ let response = ch_evalexpr(channel, {expr})
+This awaits a response from the other side.
+
+When mode is JS this works the same, except that the messages use
+JavaScript encoding. See |js_encode()| for the difference.
+
+To send a message, without handling a response or letting the channel callback
+handle the response: >
+ call ch_sendexpr(channel, {expr})
+
+To send a message and letting the response handled by a specific function,
+asynchronously: >
+ call ch_sendexpr(channel, {expr}, {'callback': Handler})
+
+Vim will match the response with the request using the message ID. Once the
+response is received the callback will be invoked. Further responses with the
+same ID will be ignored. If your server sends back multiple responses you
+need to send them with ID zero, they will be passed to the channel callback.
+
+The {expr} is converted to JSON and wrapped in an array. An example of the
+message that the receiver will get when {expr} is the string "hello":
+ [12,"hello"] ~
+
+The format of the JSON sent is:
+ [{number},{expr}]
+
+In which {number} is different every time. It must be used in the response
+(if any):
+
+ [{number},{response}]
+
+This way Vim knows which sent message matches with which received message and
+can call the right handler. Also when the messages arrive out of order.
+
+A newline character is terminating the JSON text. This can be used to
+separate the read text. For example, in Python:
+ splitidx = read_text.find('\n')
+ message = read_text[:splitidx]
+ rest = read_text[splitidx + 1:]
+
+The sender must always send valid JSON to Vim. Vim can check for the end of
+the message by parsing the JSON. It will only accept the message if the end
+was received. A newline after the message is optional.
+
+When the process wants to send a message to Vim without first receiving a
+message, it must use the number zero:
+ [0,{response}]
+
+Then channel handler will then get {response} converted to Vim types. If the
+channel does not have a handler the message is dropped.
+
+It is also possible to use ch_sendraw() and ch_evalraw() on a JSON or JS
+channel. The caller is then completely responsible for correct encoding and
+decoding.
+
+==============================================================================
+5. Channel commands *channel-commands*
+
+With a JSON channel the process can send commands to Vim that will be
+handled by Vim internally, it does not require a handler for the channel.
+
+Possible commands are: *E903* *E904* *E905*
+ ["redraw", {forced}]
+ ["ex", {Ex command}]
+ ["normal", {Normal mode command}]
+ ["expr", {expression}, {number}]
+ ["expr", {expression}]
+ ["call", {func name}, {argument list}, {number}]
+ ["call", {func name}, {argument list}]
+
+With all of these: Be careful what these commands do! You can easily
+interfere with what the user is doing. To avoid trouble use |mode()| to check
+that the editor is in the expected state. E.g., to send keys that must be
+inserted as text, not executed as a command:
+ ["ex","if mode() == 'i' | call feedkeys('ClassName') | endif"] ~
+
+Errors in these commands are normally not reported to avoid them messing up
+the display. If you do want to see them, set the 'verbose' option to 3 or
+higher.
+
+
+Command "redraw" ~
+
+The other commands do not explicitly update the screen, so that you can send a
+sequence of commands without the cursor moving around. A redraw can happen as
+a side effect of some commands. You must end with the "redraw" command to
+show any changed text and show the cursor where it belongs.
+
+The argument is normally an empty string:
+ ["redraw", ""] ~
+To first clear the screen pass "force":
+ ["redraw", "force"] ~
+
+
+Command "ex" ~
+
+The "ex" command is executed as any Ex command. There is no response for
+completion or error. You could use functions in an |autoload| script:
+ ["ex","call myscript#MyFunc(arg)"]
+
+You can also use "call |feedkeys()|" to insert any key sequence.
+
+When there is an error a message is written to the channel log, if it exists,
+and v:errmsg is set to the error.
+
+
+Command "normal" ~
+
+The "normal" command is executed like with ":normal!", commands are not
+mapped. Example to open the folds under the cursor:
+ ["normal" "zO"]
+
+
+Command "expr" with response ~
+
+The "expr" command can be used to get the result of an expression. For
+example, to get the number of lines in the current buffer:
+ ["expr","line('$')", -2] ~
+
+It will send back the result of the expression:
+ [-2, "last line"] ~
+The format is:
+ [{number}, {result}]
+
+Here {number} is the same as what was in the request. Use a negative number
+to avoid confusion with message that Vim sends. Use a different number on
+every request to be able to match the request with the response.
+
+{result} is the result of the evaluation and is JSON encoded. If the
+evaluation fails or the result can't be encoded in JSON it is the string
+"ERROR".
+
+
+Command "expr" without a response ~
+
+This command is similar to "expr" above, but does not send back any response.
+Example:
+ ["expr","setline('$', ['one', 'two', 'three'])"] ~
+There is no third argument in the request.
+
+
+Command "call" ~
+
+This is similar to "expr", but instead of passing the whole expression as a
+string this passes the name of a function and a list of arguments. This
+avoids the conversion of the arguments to a string and escaping and
+concatenating them. Example:
+ ["call", "line", ["$"], -2] ~
+
+Leave out the fourth argument if no response is to be sent:
+ ["call", "setline", ["$", ["one", "two", "three"]]] ~
+
+==============================================================================
+6. Using a RAW or NL channel *channel-raw*
+
+If mode is RAW or NL then a message can be sent like this: >
+ let response = ch_evalraw(channel, {string})
+
+The {string} is sent as-is. The response will be what can be read from the
+channel right away. Since Vim doesn't know how to recognize the end of the
+message you need to take care of it yourself. The timeout applies for reading
+the first byte, after that it will not wait for anything more.
+
+If mode is "nl" you can send a message in a similar way. You are expected
+to put in the NL after each message. Thus you can also send several messages
+ending in a NL at once. The response will be the text up to and including the
+first NL. This can also be just the NL for an empty response.
+If no NL was read before the channel timeout an empty string is returned.
+
+To send a message, without expecting a response: >
+ call ch_sendraw(channel, {string})
+The process can send back a response, the channel handler will be called with
+it.
+
+ *channel-onetime-callback*
+To send a message and letting the response handled by a specific function,
+asynchronously: >
+ call ch_sendraw(channel, {string}, {'callback': 'MyHandler'})
+
+This {string} can also be JSON, use |json_encode()| to create it and
+|json_decode()| to handle a received JSON message.
+
+It is not possible to use |ch_evalexpr()| or |ch_sendexpr()| on a raw channel.
+
+A String in Vim cannot contain NUL bytes. To send or receive NUL bytes read
+or write from a buffer. See |in_io-buffer| and |out_io-buffer|.
+
+==============================================================================
+7. More channel functions *channel-more*
+
+To obtain the status of a channel: ch_status(channel). The possible results
+are:
+ "fail" Failed to open the channel.
+ "open" The channel can be used.
+ "buffered" The channel was closed but there is data to read.
+ "closed" The channel was closed.
+
+To obtain the job associated with a channel: ch_getjob(channel)
+
+To read one message from a channel: >
+ let output = ch_read(channel)
+This uses the channel timeout. To read without a timeout, just get any
+message that is available: >
+ let output = ch_read(channel, {'timeout': 0})
+When no message was available then the result is v:none for a JSON or JS mode
+channels, an empty string for a RAW or NL channel. You can use |ch_canread()|
+to check if there is something to read.
+
+Note that when there is no callback, messages are dropped. To avoid that add
+a close callback to the channel.
+
+To read all normal output from a RAW channel that is available: >
+ let output = ch_readraw(channel)
+To read all error output from a RAW channel that is available: >
+ let output = ch_readraw(channel, {"part": "err"})
+Note that if the channel is in NL mode, ch_readraw() will only return one line
+for each call.
+
+ch_read() and ch_readraw() use the channel timeout. When there is nothing to
+read within that time an empty string is returned. To specify a different
+timeout in msec use the "timeout" option:
+ {"timeout": 123} ~
+To read from the error output use the "part" option:
+ {"part": "err"} ~
+To read a message with a specific ID, on a JS or JSON channel:
+ {"id": 99} ~
+When no ID is specified or the ID is -1, the first message is returned. This
+overrules any callback waiting for this message.
+
+For a RAW channel this returns whatever is available, since Vim does not know
+where a message ends.
+For a NL channel this returns one message.
+For a JS or JSON channel this returns one decoded message.
+This includes any sequence number.
+
+==============================================================================
+8. Channel functions details *channel-functions-details*
+
+ch_canread({handle}) *ch_canread()*
+ Return non-zero when there is something to read from {handle}.
+ {handle} can be a Channel or a Job that has a Channel.
+
+ This is useful to read from a channel at a convenient time,
+ e.g. from a timer.
+
+ Note that messages are dropped when the channel does not have
+ a callback. Add a close callback to avoid that.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_canread()
+
+ch_close({handle}) *ch_close()*
+ Close {handle}. See |channel-close|.
+ {handle} can be a Channel or a Job that has a Channel.
+ A close callback is not invoked.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_close()
+
+ch_close_in({handle}) *ch_close_in()*
+ Close the "in" part of {handle}. See |channel-close-in|.
+ {handle} can be a Channel or a Job that has a Channel.
+ A close callback is not invoked.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_close_in()
+
+
+ch_evalexpr({handle}, {expr} [, {options}]) *ch_evalexpr()*
+ Send {expr} over {handle}. The {expr} is encoded
+ according to the type of channel. The function cannot be used
+ with a raw channel. See |channel-use|.
+ {handle} can be a Channel or a Job that has a Channel.
+ When using the "lsp" channel mode, {expr} must be a |Dict|.
+ *E917*
+ {options} must be a Dictionary. It must not have a "callback"
+ entry. It can have a "timeout" entry to specify the timeout
+ for this specific request.
+
+ ch_evalexpr() waits for a response and returns the decoded
+ expression. When there is an error or timeout it returns an
+ empty |String| or, when using the "lsp" channel mode, returns an
+ empty |Dict|.
+
+ Note that while waiting for the response, Vim handles other
+ messages. You need to make sure this doesn't cause trouble.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_evalexpr(expr)
+
+
+ch_evalraw({handle}, {string} [, {options}]) *ch_evalraw()*
+ Send {string} over {handle}.
+ {handle} can be a Channel or a Job that has a Channel.
+
+ Works like |ch_evalexpr()|, but does not encode the request or
+ decode the response. The caller is responsible for the
+ correct contents. Also does not add a newline for a channel
+ in NL mode, the caller must do that. The NL in the response
+ is removed.
+ Note that Vim does not know when the text received on a raw
+ channel is complete, it may only return the first part and you
+ need to use |ch_readraw()| to fetch the rest.
+ See |channel-use|.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_evalraw(rawstring)
+
+ch_getbufnr({handle}, {what}) *ch_getbufnr()*
+ Get the buffer number that {handle} is using for String {what}.
+ {handle} can be a Channel or a Job that has a Channel.
+ {what} can be "err" for stderr, "out" for stdout or empty for
+ socket output.
+ Returns -1 when there is no buffer.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_getbufnr(what)
+
+ch_getjob({channel}) *ch_getjob()*
+ Get the Job associated with {channel}.
+ If there is no job calling |job_status()| on the returned Job
+ will result in "fail".
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_getjob()
+
+
+ch_info({handle}) *ch_info()*
+ Returns a Dictionary with information about {handle}. The
+ items are:
+ "id" number of the channel
+ "status" "open", "buffered" or "closed", like
+ ch_status()
+ When opened with ch_open():
+ "hostname" the hostname of the address
+ "port" the port of the address
+ "path" the path of the Unix-domain socket
+ "sock_status" "open" or "closed"
+ "sock_mode" "NL", "RAW", "JSON" or "JS"
+ "sock_io" "socket"
+ "sock_timeout" timeout in msec
+
+ Note that "path" is only present for Unix-domain sockets, for
+ regular ones "hostname" and "port" are present instead.
+
+ When opened with job_start():
+ "out_status" "open", "buffered" or "closed"
+ "out_mode" "NL", "RAW", "JSON" or "JS"
+ "out_io" "null", "pipe", "file" or "buffer"
+ "out_timeout" timeout in msec
+ "err_status" "open", "buffered" or "closed"
+ "err_mode" "NL", "RAW", "JSON" or "JS"
+ "err_io" "out", "null", "pipe", "file" or "buffer"
+ "err_timeout" timeout in msec
+ "in_status" "open" or "closed"
+ "in_mode" "NL", "RAW", "JSON", "JS" or "LSP"
+ "in_io" "null", "pipe", "file" or "buffer"
+ "in_timeout" timeout in msec
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_info()
+
+
+ch_log({msg} [, {handle}]) *ch_log()*
+ Write String {msg} in the channel log file, if it was opened
+ with |ch_logfile()|.
+ The text "ch_log():" is prepended to the message to make clear
+ it came from this function call and make it easier to find in
+ the log file.
+ When {handle} is passed the channel number is used for the
+ message.
+ {handle} can be a Channel or a Job that has a Channel. The
+ Channel must be open for the channel number to be used.
+
+ Can also be used as a |method|: >
+ 'did something'->ch_log()
+
+
+ch_logfile({fname} [, {mode}]) *ch_logfile()*
+ Start logging channel activity to {fname}.
+ When {fname} is an empty string: stop logging.
+
+ When {mode} is omitted or contains "a" or is "o" then append
+ to the file.
+ When {mode} contains "w" and not "a" start with an empty file.
+ When {mode} contains "o" then log all terminal output.
+ Otherwise only some interesting terminal output is logged.
+
+ Use |ch_log()| to write log messages. The file is flushed
+ after every message, on Unix you can use "tail -f" to see what
+ is going on in real time.
+
+ To enable the log very early, to see what is received from a
+ terminal during startup, use |--log| (this uses mode "ao"): >
+ vim --log logfile
+<
+ This function is not available in the |sandbox|.
+ NOTE: the channel communication is stored in the file, be
+ aware that this may contain confidential and privacy sensitive
+ information, e.g. a password you type in a terminal window.
+
+ Can also be used as a |method|: >
+ 'logfile'->ch_logfile('w')
+
+
+ch_open({address} [, {options}]) *ch_open()*
+ Open a channel to {address}. See |channel|.
+ Returns a Channel. Use |ch_status()| to check for failure.
+
+ {address} is a String, see |channel-address| for the possible
+ accepted forms.
+
+ If {options} is given it must be a |Dictionary|.
+ See |channel-open-options|.
+
+ Can also be used as a |method|: >
+ GetAddress()->ch_open()
+
+
+ch_read({handle} [, {options}]) *ch_read()*
+ Read from {handle} and return the received message.
+ {handle} can be a Channel or a Job that has a Channel.
+ For a NL channel this waits for a NL to arrive, except when
+ there is nothing more to read (channel was closed).
+ See |channel-more|.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_read()
+
+
+ch_readblob({handle} [, {options}]) *ch_readblob()*
+ Like ch_read() but reads binary data and returns a |Blob|.
+ See |channel-more|.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_readblob()
+
+
+ch_readraw({handle} [, {options}]) *ch_readraw()*
+ Like ch_read() but for a JS and JSON channel does not decode
+ the message. For a NL channel it does not block waiting for
+ the NL to arrive, but otherwise works like ch_read().
+ See |channel-more|.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_readraw()
+
+
+ch_sendexpr({handle}, {expr} [, {options}]) *ch_sendexpr()*
+ Send {expr} over {handle}. The {expr} is encoded
+ according to the type of channel. The function cannot be used
+ with a raw channel.
+ See |channel-use|. *E912*
+ {handle} can be a Channel or a Job that has a Channel.
+ When using the "lsp" channel mode, {expr} must be a |Dict|.
+
+ If the channel mode is "lsp", then returns a Dict. Otherwise
+ returns an empty String. If the "callback" item is present in
+ {options}, then the returned Dict contains the ID of the
+ request message. The ID can be used to send a cancellation
+ request to the LSP server (if needed). Returns an empty Dict
+ on error.
+
+ If a response message is not expected for {expr}, then don't
+ specify the "callback" item in {options}.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_sendexpr(expr)
+
+
+ch_sendraw({handle}, {expr} [, {options}]) *ch_sendraw()*
+ Send |String| or |Blob| {expr} over {handle}.
+ Works like |ch_sendexpr()|, but does not encode the request or
+ decode the response. The caller is responsible for the
+ correct contents. Also does not add a newline for a channel
+ in NL mode, the caller must do that. The NL in the response
+ is removed.
+ See |channel-use|.
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_sendraw(rawexpr)
+
+
+ch_setoptions({handle}, {options}) *ch_setoptions()*
+ Set options on {handle}:
+ "callback" the channel callback
+ "timeout" default read timeout in msec
+ "mode" mode for the whole channel
+ See |ch_open()| for more explanation.
+ {handle} can be a Channel or a Job that has a Channel.
+
+ Note that changing the mode may cause queued messages to be
+ lost.
+
+ These options cannot be changed:
+ "waittime" only applies to |ch_open()|
+
+ Can also be used as a |method|: >
+ GetChannel()->ch_setoptions(options)
+
+
+ch_status({handle} [, {options}]) *ch_status()*
+ Return the status of {handle}:
+ "fail" failed to open the channel
+ "open" channel can be used
+ "buffered" channel can be read, not written to
+ "closed" channel can not be used
+ {handle} can be a Channel or a Job that has a Channel.
+ "buffered" is used when the channel was closed but there is
+ still data that can be obtained with |ch_read()|.
+
+ If {options} is given it can contain a "part" entry to specify
+ the part of the channel to return the status for: "out" or
+ "err". For example, to get the error status: >
+ ch_status(job, {"part": "err"})
+<
+ Can also be used as a |method|: >
+ GetChannel()->ch_status()
+
+==============================================================================
+9. Starting a job with a channel *job-start* *job*
+
+To start a job and open a channel for stdin/stdout/stderr: >
+ let job = job_start(command, {options})
+
+You can get the channel with: >
+ let channel = job_getchannel(job)
+
+The channel will use NL mode. If you want another mode it's best to specify
+this in {options}. When changing the mode later some text may have already
+been received and not parsed correctly.
+
+If the command produces a line of output that you want to deal with, specify
+a handler for stdout: >
+ let job = job_start(command, {"out_cb": "MyHandler"})
+The function will be called with the channel and a message. You would define
+it like this: >
+ func MyHandler(channel, msg)
+
+Without the handler you need to read the output with |ch_read()| or
+|ch_readraw()|. You can do this in the close callback, see |read-in-close-cb|.
+
+Note that if the job exits before you read the output, the output may be lost.
+This depends on the system (on Unix this happens because closing the write end
+of a pipe causes the read end to get EOF). To avoid this make the job sleep
+for a short while before it exits.
+
+The handler defined for "out_cb" will not receive stderr. If you want to
+handle that separately, add an "err_cb" handler: >
+ let job = job_start(command, {"out_cb": "MyHandler",
+ \ "err_cb": "ErrHandler"})
+
+If you want to handle both stderr and stdout with one handler use the
+"callback" option: >
+ let job = job_start(command, {"callback": "MyHandler"})
+
+Depending on the system, starting a job can put Vim in the background, the
+started job gets the focus. To avoid that, use the `foreground()` function.
+This might not always work when called early, put in the callback handler or
+use a timer to call it after the job has started.
+
+You can send a message to the command with ch_evalraw(). If the channel is in
+JSON or JS mode you can use ch_evalexpr().
+
+There are several options you can use, see |job-options|.
+For example, to start a job and write its output in buffer "dummy": >
+ let logjob = job_start("tail -f /tmp/log",
+ \ {'out_io': 'buffer', 'out_name': 'dummy'})
+ sbuf dummy
+
+
+Job input from a buffer ~
+ *in_io-buffer*
+To run a job that reads from a buffer: >
+ let job = job_start({command},
+ \ {'in_io': 'buffer', 'in_name': 'mybuffer'})
+<
+ *E915* *E918*
+The buffer is found by name, similar to |bufnr()|. The buffer must exist and
+be loaded when job_start() is called.
+
+By default this reads the whole buffer. This can be changed with the "in_top"
+and "in_bot" options.
+
+A special mode is when "in_top" is set to zero and "in_bot" is not set: Every
+time a line is added to the buffer, the last-but-one line will be sent to the
+job stdin. This allows for editing the last line and sending it when pressing
+Enter.
+ *channel-close-in*
+When not using the special mode the pipe or socket will be closed after the
+last line has been written. This signals the reading end that the input
+finished. You can also use |ch_close_in()| to close it sooner.
+
+NUL bytes in the text will be passed to the job (internally Vim stores these
+as NL bytes).
+
+
+Reading job output in the close callback ~
+ *read-in-close-cb*
+If the job can take some time and you don't need intermediate results, you can
+add a close callback and read the output there: >
+
+ func! CloseHandler(channel)
+ while ch_status(a:channel, {'part': 'out'}) == 'buffered'
+ echomsg ch_read(a:channel)
+ endwhile
+ endfunc
+ let job = job_start(command, {'close_cb': 'CloseHandler'})
+
+You will want to do something more useful than "echomsg".
+
+==============================================================================
+10. Starting a job without a channel *job-start-nochannel*
+
+To start another process without creating a channel: >
+ let job = job_start(command,
+ \ {"in_io": "null", "out_io": "null", "err_io": "null"})
+
+This starts {command} in the background, Vim does not wait for it to finish.
+
+When Vim sees that neither stdin, stdout or stderr are connected, no channel
+will be created. Often you will want to include redirection in the command to
+avoid it getting stuck.
+
+There are several options you can use, see |job-options|.
+
+ *job-start-if-needed*
+To start a job only when connecting to an address does not work, do something
+like this: >
+ let channel = ch_open(address, {"waittime": 0})
+ if ch_status(channel) == "fail"
+ let job = job_start(command)
+ let channel = ch_open(address, {"waittime": 1000})
+ endif
+
+Note that the waittime for ch_open() gives the job one second to make the port
+available.
+
+==============================================================================
+11. Job functions *job-functions-details*
+
+job_getchannel({job}) *job_getchannel()*
+ Get the channel handle that {job} is using.
+ To check if the job has no channel: >
+ if string(job_getchannel(job)) == 'channel fail'
+<
+ Can also be used as a |method|: >
+ GetJob()->job_getchannel()
+
+job_info([{job}]) *job_info()*
+ Returns a Dictionary with information about {job}:
+ "status" what |job_status()| returns
+ "channel" what |job_getchannel()| returns
+ "cmd" List of command arguments used to start the job
+ "process" process ID
+ "tty_in" terminal input name, empty when none
+ "tty_out" terminal output name, empty when none
+ "exitval" only valid when "status" is "dead"
+ "exit_cb" function to be called on exit
+ "stoponexit" |job-stoponexit|
+
+ Only in Unix:
+ "termsig" the signal which terminated the process
+ (See |job_stop()| for the values)
+ only valid when "status" is "dead"
+
+ Only in MS-Windows:
+ "tty_type" Type of virtual console in use.
+ Values are "winpty" or "conpty".
+ See 'termwintype'.
+
+ Without any arguments, returns a List with all Job objects.
+
+ Can also be used as a |method|: >
+ GetJob()->job_info()
+
+
+job_setoptions({job}, {options}) *job_setoptions()*
+ Change options for {job}. Supported are:
+ "stoponexit" |job-stoponexit|
+ "exit_cb" |job-exit_cb|
+
+ Can also be used as a |method|: >
+ GetJob()->job_setoptions(options)
+
+
+job_start({command} [, {options}]) *job_start()*
+ Start a job and return a Job object. Unlike |system()| and
+ |:!cmd| this does not wait for the job to finish.
+ To start a job in a terminal window see |term_start()|.
+
+ If the job fails to start then |job_status()| on the returned
+ Job object results in "fail" and none of the callbacks will be
+ invoked.
+
+ {command} can be a String. This works best on MS-Windows. On
+ Unix it is split up in white-separated parts to be passed to
+ execvp(). Arguments in double quotes can contain white space.
+
+ {command} can be a List, where the first item is the executable
+ and further items are the arguments. All items are converted
+ to String. This works best on Unix.
+
+ On MS-Windows, job_start() makes a GUI application hidden. If
+ want to show it, Use |:!start| instead.
+
+ The command is executed directly, not through a shell, the
+ 'shell' option is not used. To use the shell: >
+ let job = job_start(["/bin/sh", "-c", "echo hello"])
+< Or: >
+ let job = job_start('/bin/sh -c "echo hello"')
+< Note that this will start two processes, the shell and the
+ command it executes. If you don't want this use the "exec"
+ shell command.
+
+ On Unix $PATH is used to search for the executable only when
+ the command does not contain a slash.
+
+ The job will use the same terminal as Vim. If it reads from
+ stdin the job and Vim will be fighting over input, that
+ doesn't work. Redirect stdin and stdout to avoid problems: >
+ let job = job_start(['sh', '-c', "myserver </dev/null >/dev/null"])
+<
+ The returned Job object can be used to get the status with
+ |job_status()| and stop the job with |job_stop()|.
+
+ Note that the job object will be deleted if there are no
+ references to it. This closes the stdin and stderr, which may
+ cause the job to fail with an error. To avoid this keep a
+ reference to the job. Thus instead of: >
+ call job_start('my-command')
+< use: >
+ let myjob = job_start('my-command')
+< and unlet "myjob" once the job is not needed or is past the
+ point where it would fail (e.g. when it prints a message on
+ startup). Keep in mind that variables local to a function
+ will cease to exist if the function returns. Use a
+ script-local variable if needed: >
+ let s:myjob = job_start('my-command')
+<
+ {options} must be a Dictionary. It can contain many optional
+ items, see |job-options|.
+
+ Can also be used as a |method|: >
+ BuildCommand()->job_start()
+
+
+job_status({job}) *job_status()* *E916*
+ Returns a String with the status of {job}:
+ "run" job is running
+ "fail" job failed to start
+ "dead" job died or was stopped after running
+
+ On Unix a non-existing command results in "dead" instead of
+ "fail", because a fork happens before the failure can be
+ detected.
+
+ If in Vim9 script a variable is declared with type "job" but
+ never assigned to, passing that variable to job_status()
+ returns "fail".
+
+ If an exit callback was set with the "exit_cb" option and the
+ job is now detected to be "dead" the callback will be invoked.
+
+ For more information see |job_info()|.
+
+ Can also be used as a |method|: >
+ GetJob()->job_status()
+
+
+job_stop({job} [, {how}]) *job_stop()*
+ Stop the {job}. This can also be used to signal the job.
+
+ When {how} is omitted or is "term" the job will be terminated.
+ For Unix SIGTERM is sent. On MS-Windows the job will be
+ terminated forcedly (there is no "gentle" way).
+ This goes to the process group, thus children may also be
+ affected.
+
+ Effect for Unix:
+ "term" SIGTERM (default)
+ "hup" SIGHUP
+ "quit" SIGQUIT
+ "int" SIGINT
+ "kill" SIGKILL (strongest way to stop)
+ number signal with that number
+
+ Effect for MS-Windows:
+ "term" terminate process forcedly (default)
+ "hup" CTRL_BREAK
+ "quit" CTRL_BREAK
+ "int" CTRL_C
+ "kill" terminate process forcedly
+ Others CTRL_BREAK
+
+ On Unix the signal is sent to the process group. This means
+ that when the job is "sh -c command" it affects both the shell
+ and the command.
+
+ The result is a Number: 1 if the operation could be executed,
+ 0 if "how" is not supported on the system.
+ Note that even when the operation was executed, whether the
+ job was actually stopped needs to be checked with
+ |job_status()|.
+
+ If the status of the job is "dead", the signal will not be
+ sent. This is to avoid to stop the wrong job (esp. on Unix,
+ where process numbers are recycled).
+
+ When using "kill" Vim will assume the job will die and close
+ the channel.
+
+ Can also be used as a |method|: >
+ GetJob()->job_stop()
+
+
+==============================================================================
+12. Job options *job-options*
+
+The {options} argument in job_start() is a dictionary. All entries are
+optional. Some options can be used after the job has started, using
+job_setoptions(job, {options}). Many options can be used with the channel
+related to the job, using ch_setoptions(channel, {options}).
+See |job_setoptions()| and |ch_setoptions()|.
+
+ *in_mode* *out_mode* *err_mode*
+"in_mode" mode specifically for stdin, only when using pipes
+"out_mode" mode specifically for stdout, only when using pipes
+"err_mode" mode specifically for stderr, only when using pipes
+ See |channel-mode| for the values.
+
+ Note: when setting "mode" the part specific mode is
+ overwritten. Therefore set "mode" first and the part
+ specific mode later.
+
+ Note: when writing to a file or buffer and when
+ reading from a buffer NL mode is used by default.
+
+ *job-noblock*
+"noblock": 1 When writing use a non-blocking write call. This
+ avoids getting stuck if Vim should handle other
+ messages in between, e.g. when a job sends back data
+ to Vim. It implies that when `ch_sendraw()` returns
+ not all data may have been written yet.
+ This option was added in patch 8.1.0350, test with: >
+ if has("patch-8.1.350")
+ let options['noblock'] = 1
+ endif
+<
+ *job-callback*
+"callback": handler Callback for something to read on any part of the
+ channel.
+ *job-out_cb* *out_cb*
+"out_cb": handler Callback for when there is something to read on
+ stdout. Only for when the channel uses pipes. When
+ "out_cb" wasn't set the channel callback is used.
+ The two arguments are the channel and the message.
+
+ *job-err_cb* *err_cb*
+"err_cb": handler Callback for when there is something to read on
+ stderr. Only for when the channel uses pipes. When
+ "err_cb" wasn't set the channel callback is used.
+ The two arguments are the channel and the message.
+ *job-close_cb*
+"close_cb": handler Callback for when the channel is closed. Same as
+ "close_cb" on |ch_open()|, see |close_cb|.
+ *job-drop*
+"drop": when Specifies when to drop messages. Same as "drop" on
+ |ch_open()|, see |channel-drop|. For "auto" the
+ exit_cb is not considered.
+ *job-exit_cb*
+"exit_cb": handler Callback for when the job ends. The arguments are the
+ job and the exit status.
+ Vim checks up to 10 times per second for jobs that
+ ended. The check can also be triggered by calling
+ |job_status()|, which may then invoke the exit_cb
+ handler.
+ Note that data can be buffered, callbacks may still be
+ called after the process ends.
+ *job-timeout*
+"timeout": time The time to wait for a request when blocking, E.g.
+ when using ch_evalexpr(). In milliseconds. The
+ default is 2000 (2 seconds).
+ *out_timeout* *err_timeout*
+"out_timeout": time Timeout for stdout. Only when using pipes.
+"err_timeout": time Timeout for stderr. Only when using pipes.
+ Note: when setting "timeout" the part specific mode is
+ overwritten. Therefore set "timeout" first and the
+ part specific mode later.
+
+ *job-stoponexit*
+"stoponexit": {signal} Send {signal} to the job when Vim exits. See
+ |job_stop()| for possible values.
+"stoponexit": "" Do not stop the job when Vim exits.
+ The default is "term".
+
+ *job-term*
+"term": "open" Start a terminal in a new window and connect the job
+ stdin/stdout/stderr to it. Similar to using
+ `:terminal`.
+ NOTE: Not implemented yet!
+
+"channel": {channel} Use an existing channel instead of creating a new one.
+ The parts of the channel that get used for the new job
+ will be disconnected from what they were used before.
+ If the channel was still used by another job this may
+ cause I/O errors.
+ Existing callbacks and other settings remain.
+
+"pty": 1 Use a pty (pseudo-tty) instead of a pipe when
+ possible. This is most useful in combination with a
+ terminal window, see |terminal|.
+ {only on Unix and Unix-like systems}
+
+ *job-in_io* *in_top* *in_bot* *in_name* *in_buf*
+"in_io": "null" disconnect stdin (read from /dev/null)
+"in_io": "pipe" stdin is connected to the channel (default)
+"in_io": "file" stdin reads from a file
+"in_io": "buffer" stdin reads from a buffer
+"in_top": number when using "buffer": first line to send (default: 1)
+"in_bot": number when using "buffer": last line to send (default: last)
+"in_name": "/path/file" the name of the file or buffer to read from
+"in_buf": number the number of the buffer to read from
+
+ *job-out_io* *out_name* *out_buf*
+"out_io": "null" disconnect stdout (goes to /dev/null)
+"out_io": "pipe" stdout is connected to the channel (default)
+"out_io": "file" stdout writes to a file
+"out_io": "buffer" stdout appends to a buffer (see below)
+"out_name": "/path/file" the name of the file or buffer to write to
+"out_buf": number the number of the buffer to write to
+"out_modifiable": 0 when writing to a buffer, 'modifiable' will be off
+ (see below)
+"out_msg": 0 when writing to a new buffer, the first line will be
+ set to "Reading from channel output..."
+
+ *job-err_io* *err_name* *err_buf*
+"err_io": "out" stderr messages to go to stdout
+"err_io": "null" disconnect stderr (goes to /dev/null)
+"err_io": "pipe" stderr is connected to the channel (default)
+"err_io": "file" stderr writes to a file
+"err_io": "buffer" stderr appends to a buffer (see below)
+"err_name": "/path/file" the name of the file or buffer to write to
+"err_buf": number the number of the buffer to write to
+"err_modifiable": 0 when writing to a buffer, 'modifiable' will be off
+ (see below)
+"err_msg": 0 when writing to a new buffer, the first line will be
+ set to "Reading from channel error..."
+
+"block_write": number only for testing: pretend every other write to stdin
+ will block
+
+"env": dict environment variables for the new process
+"cwd": "/path/to/dir" current working directory for the new process;
+ if the directory does not exist an error is given
+
+
+Writing to a buffer ~
+ *out_io-buffer*
+When the out_io or err_io mode is "buffer" and there is a callback, the text
+is appended to the buffer before invoking the callback.
+
+When a buffer is used both for input and output, the output lines are put
+above the last line, since the last line is what is written to the channel
+input. Otherwise lines are appended below the last line.
+
+When using JS or JSON mode with "buffer", only messages with zero or negative
+ID will be added to the buffer, after decoding + encoding. Messages with a
+positive number will be handled by a callback, commands are handled as usual.
+
+The name of the buffer from "out_name" or "err_name" is compared the full name
+of existing buffers, also after expanding the name for the current directory.
+E.g., when a buffer was created with ":edit somename" and the buffer name is
+"somename" it will use that buffer.
+
+If there is no matching buffer a new buffer is created. Use an empty name to
+always create a new buffer. |ch_getbufnr()| can then be used to get the
+buffer number.
+
+For a new buffer 'buftype' is set to "nofile" and 'bufhidden' to "hide". If
+you prefer other settings, create the buffer first and pass the buffer number.
+ *out_modifiable* *err_modifiable*
+The "out_modifiable" and "err_modifiable" options can be used to set the
+'modifiable' option off, or write to a buffer that has 'modifiable' off. That
+means that lines will be appended to the buffer, but the user can't easily
+change the buffer.
+ *out_msg* *err_msg*
+The "out_msg" option can be used to specify whether a new buffer will have the
+first line set to "Reading from channel output...". The default is to add the
+message. "err_msg" does the same for channel error.
+
+When an existing buffer is to be written where 'modifiable' is off and the
+"out_modifiable" or "err_modifiable" options is not zero, an error is given
+and the buffer will not be written to.
+
+When the buffer written to is displayed in a window and the cursor is in the
+first column of the last line, the cursor will be moved to the newly added
+line and the window is scrolled up to show the cursor if needed.
+
+Undo is synced for every added line. NUL bytes are accepted (internally Vim
+stores these as NL bytes).
+
+
+Writing to a file ~
+ *E920*
+The file is created with permissions 600 (read-write for the user, not
+accessible for others). Use |setfperm()| to change this.
+
+If the file already exists it is truncated.
+
+==============================================================================
+13. Controlling a job *job-control*
+
+To get the status of a job: >
+ echo job_status(job)
+
+To make a job stop running: >
+ job_stop(job)
+
+This is the normal way to end a job. On Unix it sends a SIGTERM to the job.
+It is possible to use other ways to stop the job, or even send arbitrary
+signals. E.g. to force a job to stop, "kill it": >
+ job_stop(job, "kill")
+
+For more options see |job_stop()|.
+
+==============================================================================
+14. Using a prompt buffer *prompt-buffer*
+
+If you want to type input for the job in a Vim window you have a few options:
+- Use a normal buffer and handle all possible commands yourself.
+ This will be complicated, since there are so many possible commands.
+- Use a terminal window. This works well if what you type goes directly to
+ the job and the job output is directly displayed in the window.
+ See |terminal-window|.
+- Use a window with a prompt buffer. This works well when entering a line for
+ the job in Vim while displaying (possibly filtered) output from the job.
+
+A prompt buffer is created by setting 'buftype' to "prompt". You would
+normally only do that in a newly created buffer.
+
+The user can edit and enter one line of text at the very last line of the
+buffer. When pressing Enter in the prompt line the callback set with
+|prompt_setcallback()| is invoked. It would normally send the line to a job.
+Another callback would receive the output from the job and display it in the
+buffer, below the prompt (and above the next prompt).
+
+Only the text in the last line, after the prompt, is editable. The rest of the
+buffer is not modifiable with Normal mode commands. It can be modified by
+calling functions, such as |append()|. Using other commands may mess up the
+buffer.
+
+After setting 'buftype' to "prompt" Vim does not automatically start Insert
+mode, use `:startinsert` if you want to enter Insert mode, so that the user
+can start typing a line.
+
+The text of the prompt can be set with the |prompt_setprompt()| function. If
+no prompt is set with |prompt_setprompt()|, "% " is used. You can get the
+effective prompt text for a buffer, with |prompt_getprompt()|.
+
+The user can go to Normal mode and navigate through the buffer. This can be
+useful to see older output or copy text.
+
+The CTRL-W key can be used to start a window command, such as CTRL-W w to
+switch to the next window. This also works in Insert mode (use Shift-CTRL-W
+to delete a word). When leaving the window Insert mode will be stopped. When
+coming back to the prompt window Insert mode will be restored.
+
+Any command that starts Insert mode, such as "a", "i", "A" and "I", will move
+the cursor to the last line. "A" will move to the end of the line, "I" to the
+start of the line.
+
+Here is an example for Unix. It starts a shell in the background and prompts
+for the next shell command. Output from the shell is displayed above the
+prompt. >
+
+ " Create a channel log so we can see what happens.
+ call ch_logfile('logfile', 'w')
+
+ " Function handling a line of text that has been typed.
+ func TextEntered(text)
+ " Send the text to a shell with Enter appended.
+ call ch_sendraw(g:shell_job, a:text .. "\n")
+ endfunc
+
+ " Function handling output from the shell: Add it above the prompt.
+ func GotOutput(channel, msg)
+ call append(line("$") - 1, "- " .. a:msg)
+ endfunc
+
+ " Function handling the shell exits: close the window.
+ func JobExit(job, status)
+ quit!
+ endfunc
+
+ " Start a shell in the background.
+ let shell_job = job_start(["/bin/sh"], #{
+ \ out_cb: function('GotOutput'),
+ \ err_cb: function('GotOutput'),
+ \ exit_cb: function('JobExit'),
+ \ })
+
+ new
+ set buftype=prompt
+ let buf = bufnr('')
+ call prompt_setcallback(buf, function("TextEntered"))
+ eval prompt_setprompt(buf, "shell command: ")
+
+ " start accepting shell commands
+ startinsert
+<
+The same in |Vim9| script: >
+
+ vim9script
+
+ # Create a channel log so we can see what happens.
+ ch_logfile('logfile', 'w')
+
+ var shell_job: job
+
+ # Function handling a line of text that has been typed.
+ def TextEntered(text: string)
+ # Send the text to a shell with Enter appended.
+ ch_sendraw(shell_job, text .. "\n")
+ enddef
+
+ # Function handling output from the shell: Add it above the prompt.
+ def GotOutput(channel: channel, msg: string)
+ append(line("$") - 1, "- " .. msg)
+ enddef
+
+ # Function handling the shell exits: close the window.
+ def JobExit(job: job, status: number)
+ quit!
+ enddef
+
+ # Start a shell in the background.
+ shell_job = job_start(["/bin/sh"], {
+ out_cb: GotOutput,
+ err_cb: GotOutput,
+ exit_cb: JobExit,
+ })
+
+ new
+ set buftype=prompt
+ var buf = bufnr('')
+ prompt_setcallback(buf, TextEntered)
+ prompt_setprompt(buf, "shell command: ")
+
+ # start accepting shell commands
+ startinsert
+
+==============================================================================
+15. Language Server Protocol *language-server-protocol*
+
+The language server protocol specification is available at:
+
+ https://microsoft.github.io/language-server-protocol/specification
+
+Each LSP protocol message starts with a simple HTTP header followed by the
+payload encoded in JSON-RPC format. This is described in:
+
+ https://www.jsonrpc.org/specification
+
+To encode and send a LSP request/notification message in a Vim |Dict| into a
+LSP JSON-RPC message and to receive and decode a LSP JSON-RPC
+response/notification message into a Vim |Dict|, connect to the LSP server
+with the |channel-mode| set to "lsp".
+
+For messages received on a channel with |channel-mode| set to "lsp", Vim will
+process the HTTP header and decode the JSON-RPC payload into a Vim |Dict| type
+and call the |channel-callback| function or the specified
+|channel-onetime-callback| function. When sending messages on a channel using
+the |ch_evalexpr()| or |ch_sendexpr()| functions, Vim will add the HTTP header
+and encode the Vim expression into JSON. Refer to |json_encode()| and
+|json_decode()| for more information about how Vim encodes and decodes the
+builtin types into JSON.
+
+To open a channel using the 'lsp' mode, set the 'mode' item in the |ch_open()|
+{options} argument to 'lsp'. Example: >
+
+ let ch = ch_open(..., #{mode: 'lsp'})
+
+To open a channel using the 'lsp' mode with a job, set the 'in_mode' and
+'out_mode' items in the |job_start()| {options} argument to 'lsp'. Example: >
+
+ let cmd = ['clangd', '--background-index', '--clang-tidy']
+ let opts = {}
+ let opts.in_mode = 'lsp'
+ let opts.out_mode = 'lsp'
+ let opts.err_mode = 'nl'
+ let opts.out_cb = function('LspOutCallback')
+ let opts.err_cb = function('LspErrCallback')
+ let opts.exit_cb = function('LspExitCallback')
+ let job = job_start(cmd, opts)
+
+Note that if a job outputs LSP messages on stdout and non-LSP messages on
+stderr, then the channel-callback function should handle both the message
+formats appropriately or you should use a separate callback function for
+"out_cb" and "err_cb" to handle them as shown above.
+
+To synchronously send a JSON-RPC request to the server, use the
+|ch_evalexpr()| function. This function will wait and return the decoded
+response message from the server. You can use either the |channel-timeout| or
+the 'timeout' field in the {options} argument to control the response wait
+time. If the request times out, then an empty |Dict| is returned. Example: >
+
+ let req = {}
+ let req.method = 'textDocument/definition'
+ let req.params = {}
+ let req.params.textDocument = #{uri: 'a.c'}
+ let req.params.position = #{line: 10, character: 3}
+ let defs = ch_evalexpr(ch, req, #{timeout: 100})
+ if defs->empty()
+ ... <handle failure>
+ endif
+
+Note that in the request message the 'id' field should not be specified. If it
+is specified, then Vim will overwrite the value with an internally generated
+identifier. Vim currently supports only a number type for the 'id' field.
+The callback function will be invoked for both a successful and a failed RPC
+request.
+
+To send a JSON-RPC request to the server and asynchronously process the
+response, use the |ch_sendexpr()| function and supply a callback function. If
+the "id" field is present in the request message, then Vim will overwrite it
+with an internally generated number. This function returns a Dict with the
+identifier used for the message. This can be used to send cancellation
+request to the LSP server (if needed). Example: >
+
+ let req = {}
+ let req.method = 'textDocument/hover'
+ let req.id = 200
+ let req.params = {}
+ let req.params.textDocument = #{uri: 'a.c'}
+ let req.params.position = #{line: 10, character: 3}
+ let resp = ch_sendexpr(ch, req, #{callback: 'HoverFunc'})
+
+To cancel an outstanding asynchronous LSP request sent to the server using the
+|ch_sendexpr()| function, send a cancellation message to the server using the
+|ch_sendexpr()| function with the ID returned by the |ch_sendexpr()| function
+for the request. Example: >
+
+ " send a completion request
+ let req = {}
+ let req.method = 'textDocument/completion'
+ let req.params = {}
+ let req.params.textDocument = #{uri: 'a.c'}
+ let req.params.position = #{line: 10, character: 3}
+ let reqstatus = ch_sendexpr(ch, req, #{callback: 'LspComplete'})
+ " send a cancellation notification
+ let notif = {}
+ let notif.method = '$/cancelRequest'
+ let notif.id = reqstatus.id
+ call ch_sendexpr(ch, notif)
+
+To send a JSON-RPC notification message to the server, use the |ch_sendexpr()|
+function. As the server will not send a response message to the notification,
+don't specify the "callback" item. Example: >
+
+ call ch_sendexpr(ch, #{method: 'initialized'})
+
+To respond to a JSON-RPC request message from the server, use the
+|ch_sendexpr()| function. In the response message, copy the 'id' field value
+from the server request message. Example: >
+
+ let resp = {}
+ let resp.id = req.id
+ let resp.result = 1
+ call ch_sendexpr(ch, resp)
+
+The JSON-RPC notification messages from the server are delivered through the
+|channel-callback| function.
+
+Depending on the use case, you can use the ch_evalexpr(), ch_sendexpr() and
+ch_sendraw() functions on the same channel.
+
+A LSP request message has the following format (expressed as a Vim Dict). The
+"params" field is optional: >
+
+ {
+ "jsonrpc": "2.0",
+ "id": <number>,
+ "method": <string>,
+ "params": <list|dict>
+ }
+
+A LSP response message has the following format (expressed as a Vim Dict). The
+"result" and "error" fields are optional: >
+
+ {
+ "jsonrpc": "2.0",
+ "id": <number>,
+ "result": <vim type>
+ "error": <dict>
+ }
+
+A LSP notification message has the following format (expressed as a Vim Dict).
+The "params" field is optional: >
+
+ {
+ "jsonrpc": "2.0",
+ "method": <string>,
+ "params": <list|dict>
+ }
+
+<
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/cmdline.txt b/runtime/doc/cmdline.txt
new file mode 100644
index 0000000..55b1a63
--- /dev/null
+++ b/runtime/doc/cmdline.txt
@@ -0,0 +1,1301 @@
+*cmdline.txt* For Vim version 9.0. Last change: 2023 Feb 08
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *Cmdline-mode* *Command-line-mode*
+Command-line mode *Cmdline* *Command-line* *mode-cmdline* *:*
+
+Command-line mode is used to enter Ex commands (":"), search patterns
+("/" and "?"), and filter commands ("!").
+
+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|
+
+==============================================================================
+1. Command-line editing *cmdline-editing*
+
+Normally characters are inserted in front of the cursor position. You can
+move around in the command-line with the left and right cursor keys. With the
+<Insert> key, you can toggle between inserting and overstriking characters.
+
+Note that if your keyboard does not have working cursor keys or any of the
+other special keys, you can use ":cnoremap" to define another key for them.
+For example, to define tcsh style editing keys: *tcsh-style* >
+ :cnoremap <C-A> <Home>
+ :cnoremap <C-F> <Right>
+ :cnoremap <C-B> <Left>
+ :cnoremap <Esc>b <S-Left>
+ :cnoremap <Esc>f <S-Right>
+(<> notation |<>|; type all this literally)
+
+ *cmdline-too-long*
+When the command line is getting longer than what fits on the screen, only the
+part that fits will be shown. The cursor can only move in this visible part,
+thus you cannot edit beyond that.
+
+ *cmdline-history* *history*
+The command-lines that you enter are remembered in a history table. You can
+recall them with the up and down cursor keys. There are actually five
+history tables:
+- one for ':' commands
+- one for search strings
+- one for expressions
+- one for input lines, typed for the |input()| function.
+- one for debug mode commands
+These are completely separate. Each history can only be accessed when
+entering the same type of line.
+Use the 'history' option to set the number of lines that are remembered
+(default: 50).
+Notes:
+- When you enter a command-line that is exactly the same as an older one, the
+ old one is removed (to avoid repeated commands moving older commands out of
+ the history).
+- Only commands that are typed are remembered. Ones that completely come from
+ mappings are not put in the history.
+- All searches are put in the search history, including the ones that come
+ from commands like "*" and "#". But for a mapping, only the last search is
+ remembered (to avoid that long mappings trash the history).
+{not available when compiled without the |+cmdline_hist| feature}
+
+There is an automatic completion of names on the command-line; see
+|cmdline-completion|.
+
+ *c_CTRL-V*
+CTRL-V Insert next non-digit literally. Up to three digits form the
+ decimal value of a single byte. The non-digit and the three
+ digits are not considered for mapping. This works the same
+ way as in Insert mode (see above, |i_CTRL-V|).
+ Note: Under MS-Windows CTRL-V is often mapped to paste text.
+ Use CTRL-Q instead then.
+ When |modifyOtherKeys| is enabled then special Escape sequence
+ is converted back to what it was without |modifyOtherKeys|,
+ unless the Shift key is also pressed.
+ *c_CTRL-Q*
+CTRL-Q Same as CTRL-V. But with some terminals it is used for
+ control flow, it doesn't work then.
+
+CTRL-SHIFT-V *c_CTRL-SHIFT-V* *c_CTRL-SHIFT-Q*
+CTRL-SHIFT-Q Works just like CTRL-V, unless |modifyOtherKeys| is active,
+ then it inserts the Escape sequence for a key with modifiers.
+ In the GUI the |key-notation| is inserted without simplifying.
+
+ *c_<Left>* *c_Left*
+<Left> cursor left
+ *c_<Right>* *c_Right*
+<Right> cursor right
+ *c_<S-Left>*
+<S-Left> or <C-Left> *c_<C-Left>*
+ cursor one WORD left
+ *c_<S-Right>*
+<S-Right> or <C-Right> *c_<C-Right>*
+ cursor one WORD right
+CTRL-B or <Home> *c_CTRL-B* *c_<Home>* *c_Home*
+ cursor to beginning of command-line
+CTRL-E or <End> *c_CTRL-E* *c_<End>* *c_End*
+ cursor to end of command-line
+
+ *c_<LeftMouse>*
+<LeftMouse> Move the cursor to the position of the mouse click.
+
+ *c_<MiddleMouse>*
+<MiddleMouse> Paste the contents of the clipboard (for X11 the primary
+ selection). This is similar to using CTRL-R *, but no CR
+ characters are inserted between lines.
+
+CTRL-H *c_<BS>* *c_CTRL-H* *c_BS*
+<BS> Delete the character in front of the cursor (see |:fixdel| if
+ your <BS> key does not do what you want).
+ *c_<Del>* *c_Del*
+<Del> Delete the character under the cursor (at end of line:
+ character before the cursor) (see |:fixdel| if your <Del>
+ key does not do what you want).
+ *c_CTRL-W*
+CTRL-W Delete the |word| before the cursor. This depends on the
+ 'iskeyword' option.
+ *c_CTRL-U*
+CTRL-U Remove all characters between the cursor position and
+ the beginning of the line. Previous versions of vim
+ deleted all characters on the line. If that is the
+ preferred behavior, add the following to your .vimrc: >
+ :cnoremap <C-U> <C-E><C-U>
+<
+ *c_<Insert>* *c_Insert*
+<Insert> Toggle between insert and overstrike.
+
+{char1} <BS> {char2} or *c_digraph*
+CTRL-K {char1} {char2} *c_CTRL-K*
+ enter digraph (see |digraphs|). When {char1} is a special
+ key, the code for that key is inserted in <> form.
+
+CTRL-R {register} *c_CTRL-R* *c_<C-R>*
+ Insert the contents of a numbered or named register. Between
+ typing CTRL-R and the second character '"' will be displayed
+ to indicate that you are expected to enter the name of a
+ register.
+ The text is inserted as if you typed it, but mappings and
+ abbreviations are not used. Command-line completion through
+ 'wildchar' is not triggered though. And characters that end
+ the command line are inserted literally (<Esc>, <CR>, <NL>,
+ <C-C>). A <BS> or CTRL-W could still end the command line
+ though, and remaining characters will then be interpreted in
+ another mode, which might not be what you intended.
+ Special registers:
+ '"' the unnamed register, containing the text of
+ the last delete or yank
+ '%' the current file name
+ '#' the alternate file name
+ '*' the clipboard contents (X11: primary selection)
+ '+' the clipboard contents
+ '/' the last search pattern
+ ':' the last command-line
+ '-' the last small (less than a line) delete
+ '.' the last inserted text
+ *c_CTRL-R_=*
+ '=' the expression register: you are prompted to
+ enter an expression (see |expression|)
+ (doesn't work at the expression prompt; some
+ things such as changing the buffer or current
+ window are not allowed to avoid side effects)
+ When the result is a |List| the items are used
+ as lines. They can have line breaks inside
+ too.
+ When the result is a Float it's automatically
+ converted to a String.
+ Note that when you only want to move the
+ cursor and not insert anything, you must make
+ sure the expression evaluates to an empty
+ string. E.g.: >
+ <C-R><C-R>=setcmdpos(2)[-1]<CR>
+< See |registers| about registers.
+ Implementation detail: When using the |expression| register
+ and invoking setcmdpos(), this sets the position before
+ inserting the resulting string. Use CTRL-R CTRL-R to set the
+ position afterwards.
+
+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
+ the word that was already typed is not inserted again.
+
+ *c_CTRL-R_CTRL-R* *c_<C-R>_<C-R>*
+ *c_CTRL-R_CTRL-O* *c_<C-R>_<C-O>*
+CTRL-R CTRL-R {register CTRL-F CTRL-P CTRL-W CTRL-A CTRL-L}
+CTRL-R CTRL-O {register 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),
+ "CTRL-R a" will insert "xz" while "CTRL-R CTRL-R a" will
+ insert "xy^Hz".
+
+CTRL-\ e {expr} *c_CTRL-\_e*
+ Evaluate {expr} and replace the whole command line with the
+ result. You will be prompted for the expression, type <Enter>
+ to finish it. It's most useful in mappings though. See
+ |expression|.
+ See |c_CTRL-R_=| for inserting the result of an expression.
+ Useful functions are |getcmdtype()|, |getcmdline()| and
+ |getcmdpos()|.
+ The cursor position is unchanged, except when the cursor was
+ at the end of the line, then it stays at the end.
+ |setcmdpos()| can be used to set the cursor position.
+ The |sandbox| is used for evaluating the expression to avoid
+ nasty side effects.
+ Example: >
+ :cmap <F7> <C-\>eAppendSome()<CR>
+ :func AppendSome()
+ :let cmd = getcmdline() .. " Some()"
+ :" place the cursor on the )
+ :call setcmdpos(strlen(cmd))
+ :return cmd
+ :endfunc
+< This doesn't work recursively, thus not when already editing
+ an expression. But it is possible to use in a mapping.
+
+ *c_CTRL-Y*
+CTRL-Y When there is a modeless selection, copy the selection into
+ the clipboard. |modeless-selection|
+ If there is no selection CTRL-Y is inserted as a character.
+
+CTRL-M or CTRL-J *c_CTRL-M* *c_CTRL-J* *c_<NL>* *c_<CR>* *c_CR*
+<CR> or <NL> start entered command
+
+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.
+ Note: If your <Esc> key is hard to hit on your keyboard, train
+ yourself to use CTRL-[.
+ *c_CTRL-C*
+CTRL-C quit command-line without executing
+
+ *c_<Up>* *c_Up*
+<Up> recall older command-line from history, whose beginning
+ matches the current command-line (see below).
+ {not available when compiled without the |+cmdline_hist|
+ feature}
+ *c_<Down>* *c_Down*
+<Down> recall more recent command-line from history, whose beginning
+ matches the current command-line (see below).
+ {not available when compiled without the |+cmdline_hist|
+ feature}
+
+ *c_<S-Up>* *c_<PageUp>*
+<S-Up> or <PageUp>
+ recall older command-line from history
+ {not available when compiled without the |+cmdline_hist|
+ feature}
+ *c_<S-Down>* *c_<PageDown>*
+<S-Down> or <PageDown>
+ recall more recent command-line from history
+ {not available when compiled without the |+cmdline_hist|
+ feature}
+
+CTRL-D command-line completion (see |cmdline-completion|)
+'wildchar' option
+ command-line completion (see |cmdline-completion|)
+CTRL-N command-line completion (see |cmdline-completion|)
+CTRL-P command-line completion (see |cmdline-completion|)
+CTRL-A command-line completion (see |cmdline-completion|)
+CTRL-L command-line completion (see |cmdline-completion|)
+
+ *c_CTRL-_*
+CTRL-_ a - switch between Hebrew and English keyboard mode, which is
+ private to the command-line and not related to hkmap.
+ This is useful when Hebrew text entry is required in the
+ command-line, searches, abbreviations, etc. Applies only if
+ Vim is compiled with the |+rightleft| feature and the
+ 'allowrevins' option is set.
+ See |rileft.txt|.
+
+ b - switch between Farsi and English keyboard mode, which is
+ private to the command-line and not related to fkmap. In
+ Farsi keyboard mode the characters are inserted in reverse
+ insert manner. This is useful when Farsi text entry is
+ required in the command-line, searches, abbreviations, etc.
+ Applies only if Vim is compiled with the |+farsi| feature.
+ See |farsi.txt|.
+
+ *c_CTRL-^*
+CTRL-^ Toggle the use of language |:lmap| mappings and/or Input
+ Method.
+ When typing a pattern for a search command and 'imsearch' is
+ not -1, VAL is the value of 'imsearch', otherwise VAL is the
+ value of 'iminsert'.
+ When language mappings are defined:
+ - If VAL is 1 (langmap mappings used) it becomes 0 (no langmap
+ mappings used).
+ - If VAL was not 1 it becomes 1, thus langmap mappings are
+ enabled.
+ When no language mappings are defined:
+ - If VAL is 2 (Input Method is used) it becomes 0 (no input
+ method used)
+ - If VAL has another value it becomes 2, thus the Input Method
+ is enabled.
+ These language mappings are normally used to type characters
+ that are different from what the keyboard produces. The
+ 'keymap' option can be used to install a whole number of them.
+ When entering a command line, langmap mappings are switched
+ off, since you are expected to type a command. After
+ switching it on with CTRL-^, the new state is not used again
+ for the next command or Search pattern.
+
+ *c_CTRL-]*
+CTRL-] Trigger abbreviation, without inserting a character.
+
+For Emacs-style editing on the command-line see |emacs-keys|.
+
+The <Up> and <Down> keys take the current command-line as a search string.
+The beginning of the next/previous command-lines are compared with this
+string. The first line that matches is the new command-line. When typing
+these two keys repeatedly, the same string is used again. For example, this
+can be used to find the previous substitute command: Type ":s" and then <Up>.
+The same could be done by typing <S-Up> a number of times until the desired
+command-line is shown. (Note: the shifted arrow keys do not work on all
+terminals)
+
+ *:his* *:history*
+:his[tory] Print the history of last entered commands.
+ {not available when compiled without the |+cmdline_hist|
+ feature}
+
+:his[tory] [{name}] [{first}][, [{last}]]
+ List the contents of history {name} which can be:
+ c[md] or : command-line history
+ s[earch] or / or ? search string history
+ e[xpr] or = expression register history
+ i[nput] or @ input line history
+ d[ebug] or > debug command history
+ a[ll] all of the above
+
+ If the numbers {first} and/or {last} are given, the respective
+ range of entries from a history is listed. These numbers can
+ be specified in the following form:
+ *:history-indexing*
+ A positive number represents the absolute index of an entry
+ as it is given in the first column of a :history listing.
+ This number remains fixed even if other entries are deleted.
+
+ A negative number means the relative position of an entry,
+ counted from the newest entry (which has index -1) backwards.
+
+ Examples:
+ List entries 6 to 12 from the search history: >
+ :history / 6,12
+<
+ 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
+ history
+
+==============================================================================
+2. Command-line completion *cmdline-completion*
+
+When editing the command-line, a few commands can be used to complete the
+word before the cursor. This is available for:
+
+- Command names: At the start of the command-line.
+- Tags: Only after the ":tag" command.
+- File names: Only after a command that accepts a file name or a setting for
+ an option that can be set to a file name. This is called file name
+ completion.
+- Shell command names: After ":!cmd", ":r !cmd" and ":w !cmd". $PATH is used.
+- Options: Only after the ":set" command.
+- Mappings: Only after a ":map" or similar command.
+- Variable and function names: Only after a ":if", ":call" or similar command.
+
+The number of help item matches is limited (currently to 300) to avoid a long
+delay when there are very many matches.
+
+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
+ to the end.
+ The 'wildoptions' option can be set to "tagfile" to list the
+ file of matching tags.
+ *c_CTRL-I* *c_wildchar* *c_<Tab>*
+'wildchar' option
+ A match is done on the pattern in front of the cursor. The
+ match (if there are several, the first match) is inserted
+ in place of the pattern. (Note: does not work inside a
+ macro, because <Tab> or <Esc> are mostly used as 'wildchar',
+ and these have a special meaning in some macros.) When typed
+ again and there were multiple matches, the next
+ 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.
+ <S-Tab> does not work everywhere.
+ *c_CTRL-N*
+CTRL-N After using 'wildchar' which got multiple matches, go to next
+ match. Otherwise recall more recent command-line from history.
+ *c_CTRL-P*
+CTRL-P After using 'wildchar' which got multiple matches, go to
+ previous match. Otherwise recall older command-line from
+ history.
+ *c_CTRL-A*
+CTRL-A All names that match the pattern in front of the cursor are
+ inserted.
+ *c_CTRL-L*
+CTRL-L A match is done on the pattern in front of the cursor. If
+ there is one match, it is inserted in place of the pattern.
+ 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
+'?' are accepted when matching file names. '*' matches any string, '?'
+matches exactly one character.
+
+When repeating 'wildchar' or CTRL-N you cycle through the matches, eventually
+ending up back to what was typed. If the first match is not what you wanted,
+you can use <S-Tab> or CTRL-P to go straight back to what you typed.
+
+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)
+This will find the longest match and then list all matching files.
+
+If you like tcsh's autolist completion, you can use the 'wildmode' option to
+emulate it. For example, this mimics autolist=ambiguous:
+ :set wildmode=longest,list
+This will find the longest match with the first 'wildchar', then list all
+matching files with the next.
+
+ *complete-script-local-functions*
+When completing user function names, prepend "s:" to find script-local
+functions.
+
+ *suffixes*
+For file name completion you can use the 'suffixes' option to set a priority
+between files with almost the same name. If there are multiple matches,
+those files with an extension that is in the 'suffixes' option are ignored.
+The default is ".bak,~,.o,.h,.info,.swp,.obj", which means that files ending
+in ".bak", "~", ".o", ".h", ".info", ".swp" and ".obj" are sometimes ignored.
+
+An empty entry, two consecutive commas, match a file name that does not
+contain a ".", thus has no suffix. This is useful to ignore "prog" and prefer
+"prog.c".
+
+Examples:
+
+ pattern: files: match: ~
+ test* test.c test.h test.o test.c
+ test* test.h test.o test.h and test.o
+ test* test.i test.h test.c test.i and test.c
+
+It is impossible to ignore suffixes with two dots.
+
+If there is more than one matching file (after ignoring the ones matching
+the 'suffixes' option) the first file name is inserted. You can see that
+there is only one match when you type 'wildchar' twice and the completed
+match stays the same. You can get to the other matches by entering
+'wildchar', CTRL-N or CTRL-P. All files are included, also the ones with
+extensions matching the 'suffixes' option.
+
+To completely ignore files with some extension use 'wildignore'.
+
+To match only files that end at the end of the typed text append a "$". For
+example, to match only files that end in ".c": >
+ :e *.c$
+This will not match a file ending in ".cpp". Without the "$" it does match.
+
+The old value of an option can be obtained by hitting 'wildchar' just after
+the '='. For example, typing 'wildchar' after ":set dir=" will insert the
+current value of 'dir'. This overrules file name completion for the options
+that take a file name.
+
+If you would like using <S-Tab> for CTRL-P in an xterm, put this command in
+your .cshrc: >
+ xmodmap -e "keysym Tab = Tab Find"
+And this in your .vimrc: >
+ :cmap <Esc>[1~ <C-P>
+
+==============================================================================
+3. Ex command-lines *cmdline-lines*
+
+The Ex commands have a few specialties:
+
+ *:quote* *:comment*
+'"' at the start of a line causes the whole line to be ignored. '"'
+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 (mainly commands that expect expressions)
+that see the '"' as part of their argument:
+
+ :argdo
+ :autocmd
+ :bufdo
+ :cexpr (and the like)
+ :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
+line. If you want to use '|' in an argument, precede it with '\'.
+
+These commands see the '|' as their argument, and can therefore not be
+followed by another Vim command:
+ :argdo
+ :autocmd
+ :bufdo
+ :cdo
+ :cfdo
+ :command
+ :cscope
+ :debug
+ :eval
+ :folddoopen
+ :folddoclosed
+ :function
+ :global
+ :help
+ :helpfind
+ :helpgrep
+ :lcscope
+ :ldo
+ :lfdo
+ :lhelpgrep
+ :make
+ :normal
+ :perl
+ :perldo
+ :promptfind
+ :promptrepl
+ :pyfile
+ :python
+ :registers
+ :read !
+ :scscope
+ :sign
+ :tabdo
+ :tcl
+ :tcldo
+ :tclfile
+ :terminal
+ :vglobal
+ :windo
+ :write !
+ :[range]!
+ a user defined command without the "-bar" argument |:command|
+
+Note that this is confusing (inherited from Vi): With ":g" the '|' is included
+in the command, with ":s" it is not.
+
+To be able to use another command anyway, use the ":execute" command.
+Example (append the output of "ls" and jump to the first line): >
+ :execute 'r !ls' | '[
+
+There is one exception: When the 'b' flag is present in 'cpoptions', with the
+":map" and ":abbr" commands and friends CTRL-V needs to be used instead of
+'\'. You can also use "<Bar>" instead. See also |map_bar|.
+
+Examples: >
+ :!ls | wc view the output of two commands
+ :r !ls | wc insert the same output in the text
+ :%g/foo/p|> moves all matching lines one shiftwidth
+ :%s/foo/bar/|> moves one line one shiftwidth
+ :map q 10^V| map "q" to "10|"
+ :map q 10\| map \ l map "q" to "10\" and map "\" to "l"
+ (when 'b' is present in 'cpoptions')
+
+You can also use <NL> to separate commands in the same way as with '|'. To
+insert a <NL> use CTRL-V CTRL-J. "^@" will be shown. Using '|' is the
+preferred method. But for external commands a <NL> must be used, because a
+'|' is included in the external command. To avoid the special meaning of <NL>
+it must be preceded with a backslash. Example: >
+ :r !date<NL>-join
+This reads the current date into the file and joins it with the previous line.
+
+Note that when the command before the '|' generates an error, the following
+commands will not be executed.
+
+
+Because of Vi compatibility the following strange commands are supported: >
+ :| print current line (like ":p")
+ :3| print line 3 (like ":3p")
+ :3 goto line 3
+
+A colon is allowed between the range and the command name. It is ignored
+(this is Vi compatible). For example: >
+ :1,$:s/pat/string
+
+When the character '%' or '#' is used where a file name is expected, they are
+expanded to the current and alternate file name (see the chapter "editing
+files" |:_%| |:_#|).
+
+Embedded spaces in file names are allowed on the Amiga if one file name is
+expected as argument. Trailing spaces will be ignored, unless escaped with a
+backslash or CTRL-V. Note that the ":next" command uses spaces to separate
+file names. Escape the spaces to include them in a file name. Example: >
+ :next foo\ bar goes\ to school\
+starts editing the three files "foo bar", "goes to" and "school ".
+
+When you want to use the special characters '"' or '|' in a command, or want
+to use '%' or '#' in a file name, precede them with a backslash. The
+backslash is not required in a range and in the ":substitute" command.
+See also |`=|.
+
+ *:_!*
+The '!' (bang) character after an Ex command makes the command behave in a
+different way. The '!' should be placed immediately after the command, without
+any blanks in between. If you insert blanks the '!' will be seen as an
+argument for the command, which has a different meaning. For example:
+ :w! name write the current buffer to file "name", overwriting
+ any existing file
+ :w !name send the current buffer as standard input to command
+ "name"
+
+==============================================================================
+4. Ex command-line ranges *cmdline-ranges* *[range]* *E16*
+
+Some Ex commands accept a line range in front of them. This is noted as
+[range]. It consists of one or more line specifiers, separated with ',' or
+';'.
+
+The basics are explained in section |10.3| of the user manual.
+
+In |Vim9| script a range needs to be prefixed with a colon to avoid ambiguity
+with continuation lines. For example, "+" can be used for a range but is also
+a continuation of an expression: >
+ var result = start
+ + print
+If the "+" is a range then it must be prefixed with a colon: >
+ var result = start
+ :+ print
+<
+ *:,* *:;*
+When separated with ';' the cursor position will be set to that line
+before interpreting the next line specifier. This doesn't happen for ','.
+Examples: >
+ 4,/this line/
+< from line 4 till match with "this line" after the cursor line. >
+ 5;/that line/
+< from line 5 till match with "that line" after line 5.
+
+The default line specifier for most commands is the cursor position, but the
+commands ":write" and ":global" have the whole file (1,$) as default.
+
+If more line specifiers are given than required for the command, the first
+one(s) will be ignored.
+
+Line numbers may be specified with: *:range* *{address}*
+ {number} an absolute line number *E1247*
+ . the current line *:.*
+ $ the last line in the file *:$*
+ % equal to 1,$ (the entire file) *:%*
+ 't position of mark t (lowercase) *:'*
+ 'T position of mark T (uppercase); when the mark is in
+ another file it cannot be used in a range
+ /{pattern}[/] the next line where {pattern} matches *:/*
+ also see |:range-pattern| below
+ ?{pattern}[?] the previous line where {pattern} matches *:?*
+ also see |:range-pattern| below
+ \/ the next line where the previously used search
+ pattern matches
+ \? the previous line where the previously used search
+ pattern matches
+ \& the next line where the previously used substitute
+ pattern matches
+
+ *:range-offset*
+Each may be followed (several times) by '+' or '-' and an optional number.
+This number is added or subtracted from the preceding line number. If the
+number is omitted, 1 is used. If there is nothing before the '+' or '-' then
+the current line is used.
+ *:range-closed-fold*
+When a line number after the comma is in a closed fold it is adjusted to the
+last line of the fold, thus the whole fold is included.
+
+When a number is added this is done after the adjustment to the last line of
+the fold. This means these lines are additionally included in the range. For
+example: >
+ :3,4+2print
+On this text:
+ 1 one ~
+ 2 two ~
+ 3 three ~
+ 4 four FOLDED ~
+ 5 five FOLDED ~
+ 6 six ~
+ 7 seven ~
+ 8 eight ~
+Where lines four and five are a closed fold, ends up printing lines 3 to 7.
+The 7 comes from the "4" in the range, which is adjusted to the end of the
+closed fold, which is 5, and then the offset 2 is added.
+
+An example for subtracting (which isn't very useful): >
+ :2,4-1print
+On this text:
+ 1 one ~
+ 2 two ~
+ 3 three FOLDED~
+ 4 four FOLDED ~
+ 5 five FOLDED ~
+ 6 six FOLDED ~
+ 7 seven ~
+ 8 eight ~
+Where lines three to six are a closed fold, ends up printing lines 2 to 6.
+The 6 comes from the "4" in the range, which is adjusted to the end of the
+closed fold, which is 6, and then 1 is subtracted, then this is still in the
+closed fold and the last line of that fold is used, which is 6.
+
+ *:range-pattern*
+The "/" and "?" after {pattern} are required to separate the pattern from
+anything that follows.
+
+The "/" and "?" may be preceded with another address. The search starts from
+there. The difference from using ';' is that the cursor isn't moved.
+Examples: >
+ /pat1//pat2/ Find line containing "pat2" after line containing
+ "pat1", without moving the cursor.
+ 7;/pat2/ Find line containing "pat2", after line 7, leaving
+ the cursor in line 7.
+
+The {number} must be between 0 and the number of lines in the file. When
+using a 0 (zero) this is interpreted as a 1 by most commands. Commands that
+use it as a count do use it as a zero (|:tag|, |:pop|, etc). Some commands
+interpret the zero as "before the first line" (|:read|, search pattern, etc).
+
+Examples: >
+ .+3 three lines below the cursor
+ /that/+1 the line below the next line containing "that"
+ .,$ from current line until end of file
+ 0;/that the first line containing "that", also matches in the
+ first line.
+ 1;/that the first line after line 1 containing "that"
+
+Some commands allow for a count after the command. This count is used as the
+number of lines to be used, starting with the line given in the last line
+specifier (the default is the cursor line). The commands that accept a count
+are the ones that use a range but do not have a file name argument (because
+a file name can also be a number). The count cannot be negative.
+
+Examples: >
+ :s/x/X/g 5 substitute 'x' by 'X' in the current line and four
+ following lines
+ :23d 4 delete lines 23, 24, 25 and 26
+
+
+Folds and Range
+
+When folds are active the line numbers are rounded off to include the whole
+closed fold. See |fold-behavior|.
+
+
+Reverse Range *E493*
+
+A range should have the lower line number first. If this is not the case, Vim
+will ask you if it should swap the line numbers.
+ Backwards range given, OK to swap ~
+This is not done within the global command ":g".
+
+You can use ":silent" before a command to avoid the question, the range will
+always be swapped then.
+
+
+Count and Range *N:*
+
+When giving a count before entering ":", this is translated into: >
+ :.,.+(count - 1)
+In words: The "count" lines at and after the cursor. Example: To delete
+three lines: >
+ 3:d<CR> is translated into: .,.+2d<CR>
+<
+
+Visual Mode and Range
+ *v_:*
+{Visual}: Starts a command-line with the Visual selected lines as a
+ range. The code `:'<,'>` is used for this range, which makes
+ it possible to select a similar line from the command-line
+ history for repeating a command on different Visually selected
+ lines.
+
+:* *:star* *:star-visual-range*
+ When Visual mode was already ended, a short way to use the
+ Visual area for a range is `:*`. This requires that "*" does
+ not appear in 'cpo', see |cpo-star|. Otherwise you will have
+ to type `:'<,'>`
+ For when "*" is in 'cpo' see |:star-compatible|.
+
+==============================================================================
+5. Ex command-line flags *ex-flags*
+
+These flags are supported by a selection of Ex commands. They print the line
+that the cursor ends up after executing the command:
+
+ l output like for |:list|
+ # add line number
+ p output like for |:print|
+
+The flags can be combined, thus "l#" uses both a line number and |:list| style
+output.
+
+==============================================================================
+6. Ex special characters *cmdline-special*
+
+Note: These are special characters in the executed command line. If you want
+to insert special things while typing you can use the CTRL-R command. For
+example, "%" stands for the current file name, while CTRL-R % inserts the
+current file name right away. See |c_CTRL-R|.
+
+Note: If you want to avoid the effects of special characters in a Vim script
+you may want to use |fnameescape()|. Also see |`=|.
+
+
+In Ex commands, at places where a file name can be used, the following
+characters have a special meaning. These can also be used in the expression
+function |expand()|.
+ % Is replaced with the current file name. *:_%* *c_%*
+ # Is replaced with the alternate file name. *:_#* *c_#*
+ This is remembered for every window.
+ #n (where n is a number) is replaced with *:_#0* *:_#n*
+ the file name of buffer n. "#0" is the same as "#". *c_#n*
+ ## Is replaced with all names in the argument list *:_##* *c_##*
+ concatenated, separated by spaces. Each space in a name
+ is preceded with a backslash.
+ #<n (where n is a number > 0) is replaced with old *:_#<* *c_#<*
+ file name n. See |:oldfiles| or |v:oldfiles| to get the
+ number. *E809*
+ {only when compiled with the |+eval| and |+viminfo| features}
+In |Vim9-script| # is used to start a comment, use %% for the alternate file
+name:
+ % Is replaced with the current file name.
+ %% Is replaced with the alternate file name. *:_%%* *c_%%*
+ %%n (where n is a number) is replaced with *:_%%0* *:_%%n*
+ the file name of buffer n. "%%0" is the same as "%%". *c_%%n*
+ %%% Is replaced with all names in the argument *:_%%%* *c_%%%#*
+ list concatenated, separated by spaces.
+ %%<n (where n is a number > 0) is replaced with old *:_%%<* *c_%%<*
+ file name n.
+
+Note that these, except "#<n", give the file name as it was typed. If an
+absolute path is needed (when using the file name from a different directory),
+you need to add ":p". See |filename-modifiers|.
+
+The "#<n" item returns an absolute path, but it will start with "~/" for files
+below your home directory.
+
+Note that backslashes are inserted before spaces, so that the command will
+correctly interpret the file name. But this doesn't happen for shell
+commands. For those you probably have to use quotes (this fails for files
+that contain a quote and wildcards): >
+ :!ls "%"
+ :r !spell "%"
+
+To avoid the special meaning of '%' and '#' insert a backslash before it.
+Detail: The special meaning is always escaped when there is a backslash before
+it, no matter how many backslashes.
+ you type: result ~
+ # alternate.file
+ \# #
+ \\# \#
+Also see |`=|.
+
+ *E499* *E500*
+Note: these are typed literally, they are not special keys!
+ *:<cword>* *<cword>*
+ <cword> is replaced with the word under the cursor (like |star|)
+ *:<cWORD>* *<cWORD>*
+ <cWORD> is replaced with the WORD under the cursor (see |WORD|)
+ *:<cexpr>* *<cexpr>*
+ <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>* *<cfile>*
+ <cfile> is replaced with the path name under the cursor (like what
+ |gf| uses)
+ *:<afile>* *<afile>*
+ <afile> When executing autocommands, is replaced with the file name
+ of the buffer being manipulated, or the file for a read or
+ write. *E495*
+ *:<abuf>* *<abuf>*
+ <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
+ buffer). *E496*
+ *:<amatch>* *<amatch>*
+ <amatch> When executing autocommands, is replaced with the match for
+ which this autocommand was executed. *E497*
+ It differs from <afile> when the file name isn't used to
+ match with (for FileType, Syntax and SpellFileMissing
+ events).
+ When the match is with a file name, it is expanded to the
+ full path.
+ *:<sfile>* *<sfile>*
+ <sfile> When executing a `:source` command, is replaced with the
+ file name of the sourced file. *E498*
+ When executing a legacy function, is replaced with the call
+ stack, as with <stack> (this is for backwards
+ compatibility, using <stack> or <script> is preferred).
+ In Vim9 script using <sfile> in a function gives error
+ *E1245* .
+ Note that filename-modifiers are useless when <sfile> is
+ not used inside a script.
+ *:<stack>* *<stack>*
+ <stack> is replaced with the call stack, using
+ "function {function-name}[{lnum}]" for a function line
+ and "script {file-name}[{lnum}]" for a script line, and
+ ".." in between items. E.g.:
+ "function {function-name1}[{lnum}]..{function-name2}[{lnum}]"
+ If there is no call stack you get error *E489* .
+ *:<script>* *<script>*
+ <script> When executing a `:source` command, is replaced with the file
+ name of the sourced file. When executing a function, is
+ replaced with the file name of the script where it is
+ defined.
+ If the file name cannot be determined you get error *E1274* .
+ *:<slnum>* *<slnum>*
+ <slnum> When executing a `:source` command, is replaced with the
+ line number. *E842*
+ When executing a function it's the line number relative to
+ the start of the function.
+ *:<sflnum>* *<sflnum>*
+ <sflnum> When executing a script, is replaced with the line number.
+ It differs from <slnum> in that <sflnum> is replaced with
+ the script line number in any situation. *E961*
+ *:<client>* *<client>*
+ <client> is replaced with the {clinetid} of the last received
+ message in |server2client()|
+
+ *filename-modifiers*
+*:_%:* *::8* *::p* *::.* *::~* *::h* *::t* *::r* *::e* *::s* *::gs* *::S*
+ *%:8* *%:p* *%:.* *%:~* *%:h* *%:t* *%:r* *%:e* *%:s* *%:gs* *%:S*
+The file name modifiers can be used after "%", "#", "#n", "<cfile>", "<sfile>",
+"<afile>" or "<abuf>". They are also used with the |fnamemodify()| function.
+
+These modifiers can be given, in this order:
+ :p Make file name a full path. Must be the first modifier. Also
+ changes "~/" (and "~user/" for Unix and VMS) to the path for
+ the home directory. If the name is a directory a path
+ separator is added at the end. For a file name that does not
+ exist and does not have an absolute path the result is
+ unpredictable. On MS-Windows an 8.3 filename is expanded to
+ the long name.
+ :8 Converts the path to 8.3 short format (currently only on
+ MS-Windows). Will act on as much of a path that is an
+ existing path.
+ :~ Reduce file name to be relative to the home directory, if
+ possible. File name is unmodified if it is not below the home
+ directory.
+ :. Reduce file name to be relative to current directory, if
+ possible. File name is unmodified if it is not below the
+ current directory.
+ 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.
+ Can be repeated to remove several components at the end.
+ When the file name ends in a path separator, only the path
+ separator is removed. Thus ":p:h" on a directory name results
+ on the directory name itself (without trailing slash).
+ When the file name is an absolute path (starts with "/" for
+ Unix; "x:\" for Win32; "drive:" for Amiga), that part is not
+ removed. When there is no head (path is relative to current
+ directory) the result is empty.
+ :t Tail of the file name (last component of the name). Must
+ precede any :r or :e.
+ :r Root of the file name (the last extension removed). When
+ there is only an extension (file name that starts with '.',
+ e.g., ".vimrc"), it is not removed. Can be repeated to remove
+ several extensions (last one first).
+ :e Extension of the file name. Only makes sense when used alone.
+ When there is no extension the result is empty.
+ When there is only an extension (file name that starts with
+ '.'), the result is empty. Can be repeated to include more
+ extensions. If there are not enough extensions (but at least
+ one) as much as possible are included.
+ :s?pat?sub?
+ Substitute the first occurrence of "pat" with "sub". This
+ works like the |:s| command. "pat" is a regular expression.
+ Any character can be used for '?', but it must not occur in
+ "pat" or "sub".
+ After this, the previous modifiers can be used again. For
+ example ":p", to make a full path after the substitution.
+ :gs?pat?sub?
+ Substitute all occurrences of "pat" with "sub". Otherwise
+ this works like ":s".
+ :S Escape special characters for use with a shell command (see
+ |shellescape()|). Must be the last one. Examples: >
+ :!dir <cfile>:S
+ :call system('chmod +w -- ' . expand('%:S'))
+
+Examples, when the file name is "src/version.c", current dir
+"/home/mool/vim": >
+ :p /home/mool/vim/src/version.c
+ :p:. src/version.c
+ :p:~ ~/vim/src/version.c
+ :h src
+ :p:h /home/mool/vim/src
+ :p:h:h /home/mool/vim
+ :t version.c
+ :p:t version.c
+ :r src/version
+ :p:r /home/mool/vim/src/version
+ :t:r version
+ :e c
+ :s?version?main? src/main.c
+ :s?version?main?:p /home/mool/vim/src/main.c
+ :p:gs?/?\\? \home\mool\vim\src\version.c
+
+Examples, when the file name is "src/version.c.gz": >
+ :p /home/mool/vim/src/version.c.gz
+ :e gz
+ :e:e c.gz
+ :e:e:e c.gz
+ :e:e:r c
+ :r src/version.c
+ :r:e c
+ :r:r src/version
+ :r:r:r src/version
+<
+ *extension-removal* *:_%<*
+If a "<" is appended to "%", "#", "#n" or "CTRL-V p" the extension of the file
+name is removed (everything after and including the last '.' in the file
+name). This is included for backwards compatibility with version 3.0, the
+":r" form is preferred. Examples: >
+
+ % current file name
+ %< current file name without extension
+ # alternate file name for current window
+ #< idem, without extension
+ #31 alternate file number 31
+ #31< idem, without extension
+ <cword> word under the cursor
+ <cWORD> WORD under the cursor (see |WORD|)
+ <cfile> path name under the cursor
+ <cfile>< idem, without extension
+
+Note: Where a file name is expected wildcards expansion is done. On Unix the
+shell is used for this, unless it can be done internally (for speed).
+Unless in |restricted-mode|, backticks work also, like in >
+ :n `echo *.c`
+But expansion is only done if there are any wildcards before expanding the
+'%', '#', etc.. This avoids expanding wildcards inside a file name. If you
+want to expand the result of <cfile>, add a wildcard character to it.
+Examples: (alternate file name is "?readme?")
+ command expands to ~
+ :e # :e ?readme?
+ :e `ls #` :e {files matching "?readme?"}
+ :e #.* :e {files matching "?readme?.*"}
+ :cd <cfile> :cd {file name under cursor}
+ :cd <cfile>* :cd {file name under cursor plus "*" and then expanded}
+Also see |`=|.
+
+When the expanded argument contains a "!" and it is used for a shell command
+(":!cmd", ":r !cmd" or ":w !cmd"), the "!" is escaped with a backslash to
+avoid it being expanded into a previously used command. When the 'shell'
+option contains "sh", this is done twice, to avoid the shell trying to expand
+the "!".
+
+ *filename-backslash*
+For filesystems that use a backslash as directory separator (MS-Windows), it's
+a bit difficult to recognize a backslash that is used to escape the special
+meaning of the next character. The general rule is: If the backslash is
+followed by a normal file name character, it does not have a special meaning.
+Therefore "\file\foo" is a valid file name, you don't have to type the
+backslash twice.
+
+An exception is the '$' sign. It is a valid character in a file name. But
+to avoid a file name like "$home" to be interpreted as an environment variable,
+it needs to be preceded by a backslash. Therefore you need to use "/\$home"
+for the file "$home" in the root directory. A few examples:
+
+ FILE NAME INTERPRETED AS ~
+ $home expanded to value of environment var $home
+ \$home file "$home" in current directory
+ /\$home file "$home" in root directory
+ \\$home file "\\", followed by expanded $home
+
+Also see |`=|.
+
+==============================================================================
+7. Command-line window *cmdline-window* *cmdwin*
+ *command-line-window*
+In the command-line window the command line can be edited just like editing
+text in any window. It is a special kind of window, because you cannot leave
+it in a normal way.
+
+
+OPEN *c_CTRL-F* *q:* *q/* *q?*
+
+There are two ways to open the command-line window:
+1. From Command-line mode, use the key specified with the 'cedit' option.
+ The default is CTRL-F when 'compatible' is not set.
+2. From Normal mode, use the "q:", "q/" or "q?" command.
+ This starts editing an Ex command-line ("q:") or search string ("q/" or
+ "q?"). Note that this is not possible while recording is in progress (the
+ "q" stops recording then).
+
+When the window opens it is filled with the command-line history. The last
+line contains the command as typed so far. The left column will show a
+character that indicates the type of command-line being edited, see
+|cmdwin-char|.
+
+Vim will be in Normal mode when the editor is opened, except when 'insertmode'
+is set.
+ *E1292*
+Once a command-line window is open it is not possible to open another one.
+
+The height of the window is specified with 'cmdwinheight' (or smaller if there
+is no room). The window is always full width and is positioned just above the
+command-line.
+
+
+EDIT
+
+You can now use commands to move around and edit the text in the window. Both
+in Normal mode and Insert mode.
+
+It is possible to use ":", "/" and other commands that use the command-line,
+but it's not possible to open another command-line window then. There is no
+nesting.
+ *E11* *E1188*
+The command-line window is not a normal window. It is not possible to move to
+another window or edit another buffer. All commands that would do this are
+disabled in the command-line window. Of course it _is_ possible to execute
+any command that you entered in the command-line window. Other text edits are
+discarded when closing the window.
+
+
+CLOSE *E199*
+
+There are several ways to leave the command-line window:
+
+<CR> Execute the command-line under the cursor. Works both in
+ 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. There is no redraw, thus the window will
+ remain visible.
+:quit Discard the command line and go back to Normal mode.
+ ":close", CTRL-W c, ":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.
+
+Once the command-line window is closed the old window sizes are restored. The
+executed command applies to the window and buffer where the command-line was
+started from. This works as if the command-line window was not there, except
+that there will be an extra screen redraw.
+The buffer used for the command-line window is deleted. Any changes to lines
+other than the one that is executed with <CR> are lost.
+
+If you would like to execute the command under the cursor and then have the
+command-line window open again, you may find this mapping useful: >
+
+ :autocmd CmdwinEnter * map <buffer> <F5> <CR>q:
+
+
+VARIOUS
+
+The command-line window cannot be used:
+- when there already is a command-line window (no nesting)
+- for entering an encryption key or when using inputsecret()
+
+Some options are set when the command-line window is opened:
+'filetype' "vim", when editing an Ex command-line; this starts Vim syntax
+ highlighting if it was enabled
+'rightleft' off
+'modifiable' on
+'buftype' "nofile"
+'swapfile' off
+
+It is allowed to write the buffer contents to a file. This is an easy way to
+save the command-line history and read it back later.
+
+If the 'wildchar' option is set to <Tab>, and the command-line window is used
+for an Ex command, then two mappings will be added to use <Tab> for completion
+in the command-line window, like this: >
+ :inoremap <buffer> <Tab> <C-X><C-V>
+ :nnoremap <buffer> <Tab> a<C-X><C-V>
+Note that hitting <Tab> in Normal mode will do completion on the next
+character. That way it works at the end of the line.
+If you don't want these mappings, disable them with: >
+ au CmdwinEnter [:>] iunmap <Tab>
+ au CmdwinEnter [:>] nunmap <Tab>
+You could put these lines in your vimrc file.
+
+While in the command-line window you cannot use the mouse to put the cursor in
+another window, or drag statuslines of other windows. You can drag the
+statusline of the command-line window itself and the statusline above it.
+Thus you can resize the command-line window, but not others.
+
+The |getcmdwintype()| function returns the type of the command-line being
+edited as described in |cmdwin-char|.
+
+
+AUTOCOMMANDS
+
+Two autocommand events are used: |CmdwinEnter| and |CmdwinLeave|. You can use
+the Cmdwin events to do settings specifically for the command-line window.
+Be careful not to cause side effects!
+Example: >
+ :au CmdwinEnter : let b:cpt_save = &cpt | set cpt=.
+ :au CmdwinLeave : let &cpt = b:cpt_save
+This sets 'complete' to use completion in the current window for |i_CTRL-N|.
+Another example: >
+ :au CmdwinEnter [/?] startinsert
+This will make Vim start in Insert mode in the command-line window.
+
+ *cmdwin-char*
+The character used for the pattern indicates the type of command-line:
+ : normal Ex command
+ > debug mode command |debug-mode|
+ / forward search string
+ ? backward search string
+ = expression for "= |expr-register|
+ @ string for |input()|
+ - text for |:insert| or |:append|
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/debug.txt b/runtime/doc/debug.txt
new file mode 100644
index 0000000..6fd88b6
--- /dev/null
+++ b/runtime/doc/debug.txt
@@ -0,0 +1,170 @@
+*debug.txt* For Vim version 9.0. Last change: 2019 May 07
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+
+==============================================================================
+
+1. Location of a crash, using gcc and gdb *debug-gcc* *gdb*
+
+When Vim crashes in one of the test files, and you are using gcc for
+compilation, here is what you can do to find out exactly where Vim crashes.
+This also applies when using the MingW tools.
+
+1. Compile Vim with the "-g" option (there is a line in the src/Makefile for
+ this, which you can uncomment). Also make sure "strip" is disabled (do not
+ install it, or use the line "STRIP = /bin/true").
+
+2. Execute these commands (replace "11" with the test that fails): >
+ cd testdir
+ gdb ../vim
+ run -u unix.vim -U NONE -s dotest.in test11.in
+
+3. Check where Vim crashes, gdb should give a message for this.
+
+4. Get a stack trace from gdb with this command: >
+ where
+< You can check out different places in the stack trace with: >
+ frame 3
+< Replace "3" with one of the numbers in the stack trace.
+
+==============================================================================
+
+2. Locating memory leaks *debug-leaks* *valgrind*
+
+If you suspect Vim is leaking memory and you are using Linux, the valgrind
+tool is very useful to pinpoint memory leaks.
+
+First of all, build Vim with EXITFREE defined. Search for this in MAKEFILE
+and uncomment the line.
+
+Use this command to start Vim:
+>
+ valgrind --log-file=valgrind.log --leak-check=full ./vim
+
+Note: Vim will run much slower. If your .vimrc is big or you have several
+plugins you need to be patient for startup, or run with the "--clean"
+argument.
+
+There are often a few leaks from libraries, such as getpwuid() and
+XtVaAppCreateShell(). Those are unavoidable. The number of bytes should be
+very small a Kbyte or less.
+
+==============================================================================
+
+3. Windows Bug Reporting *debug-win32*
+
+If the Windows version of Vim crashes in a reproducible manner, you can take
+some steps to provide a useful bug report.
+
+
+3.1 GENERIC ~
+
+You must obtain the debugger symbols (PDB) file for your executable: gvim.pdb
+for gvim.exe, or vim.pdb for vim.exe. The PDB should be available from the
+same place that you obtained the executable. Be sure to use the PDB that
+matches the EXE (same date).
+
+If you built the executable yourself with the Microsoft Visual C++ compiler,
+then the PDB was built with the EXE.
+
+If you have Visual Studio, use that instead of the VC Toolkit and WinDbg.
+
+For other compilers, you should always use the corresponding debugger: gdb
+(see above |debug-gcc|) for the Cygwin and MinGW compilers.
+
+
+ *debug-vs2005*
+3.2 Debugging Vim crashes with Visual Studio 2005/Visual C++ 2005 Express ~
+
+First launch vim.exe or gvim.exe and then launch Visual Studio. (If you don't
+have Visual Studio, follow the instructions at |get-ms-debuggers| to obtain a
+free copy of Visual C++ 2005 Express Edition.)
+
+On the Tools menu, click Attach to Process. Choose the Vim process.
+
+In Vim, reproduce the crash. A dialog will appear in Visual Studio, telling
+you about the unhandled exception in the Vim process. Click Break to break
+into the process.
+
+Visual Studio will pop up another dialog, telling you that no symbols are
+loaded and that the source code cannot be displayed. Click OK.
+
+Several windows will open. Right-click in the Call Stack window. Choose Load
+Symbols. The Find Symbols dialog will open, looking for (g)vim.pdb. Navigate
+to the directory where you have the PDB file and click Open.
+
+At this point, you should have a full call stack with vim function names and
+line numbers. Double-click one of the lines and the Find Source dialog will
+appear. Navigate to the directory where the Vim source is (if you have it.)
+
+If you don't know how to debug this any further, follow the instructions
+at ":help bug-reports". Paste the call stack into the bug report.
+
+If you have a non-free version of Visual Studio, you can save a minidump via
+the Debug menu and send it with the bug report. A minidump is a small file
+(<100KB), which contains information about the state of your process.
+Visual C++ 2005 Express Edition cannot save minidumps and it cannot be
+installed as a just-in-time debugger. Use WinDbg, |debug-windbg|, if you
+need to save minidumps or you want a just-in-time (postmortem) debugger.
+
+ *debug-windbg*
+3.3 Debugging Vim crashes with WinDbg ~
+
+See |get-ms-debuggers| to obtain a copy of WinDbg.
+
+As with the Visual Studio IDE, you can attach WinDbg to a running Vim process.
+You can also have your system automatically invoke WinDbg as a postmortem
+debugger. To set WinDbg as your postmortem debugger, run "windbg -I".
+
+To attach WinDbg to a running Vim process, launch WinDbg. On the File menu,
+choose Attach to a Process. Select the Vim process and click OK.
+
+At this point, choose Symbol File Path on the File menu, and add the folder
+containing your Vim PDB to the sympath. If you have Vim source available,
+use Source File Path on the File menu. You can now open source files in WinDbg
+and set breakpoints, if you like. Reproduce your crash. WinDbg should open the
+source file at the point of the crash. Using the View menu, you can examine
+the call stack, local variables, watch windows, and so on.
+
+If WinDbg is your postmortem debugger, you do not need to attach WinDbg to
+your Vim process. Simply reproduce the crash and WinDbg will launch
+automatically. As above, set the Symbol File Path and the Source File Path.
+
+To save a minidump, type the following at the WinDbg command line: >
+ .dump vim.dmp
+<
+ *debug-minidump*
+3.4 Opening a Minidump ~
+
+If you have a minidump file, you can open it in Visual Studio or in WinDbg.
+
+In Visual Studio 2005: on the File menu, choose Open, then Project/Solution.
+Navigate to the .dmp file and open it. Now press F5 to invoke the debugger.
+Follow the instructions in |debug-vs2005| to set the Symbol File Path.
+
+In WinDbg: choose Open Crash Dump on the File menu. Follow the instructions in
+|debug-windbg| to set the Symbol File Path.
+
+ *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
+
+=========================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/debugger.txt b/runtime/doc/debugger.txt
new file mode 100644
index 0000000..5c5c8d3
--- /dev/null
+++ b/runtime/doc/debugger.txt
@@ -0,0 +1,134 @@
+*debugger.txt* For Vim version 9.0. Last change: 2019 Dec 21
+
+
+ VIM REFERENCE MANUAL by Gordon Prieur
+
+
+Debugger Support Features *debugger-support*
+
+These features are for integration with a debugger or an Integrated
+Programming Environment (IPE) or Integrated Development Environment (IDE).
+For the debugger running in a Vim terminal window see |terminal-debugger|.
+
+1. Debugger Features |debugger-features|
+2. Vim Compile Options |debugger-compilation|
+
+==============================================================================
+1. Debugger Features *debugger-features*
+
+The following features are available:
+
+ Alternate Command Input |alt-input|
+ Debug Signs |debug-signs|
+ Debug Source Highlight |debug-highlight|
+ Message Footer |gui-footer|
+ Balloon Evaluation |balloon-eval|
+
+These features were added specifically for use in the Motif version of gvim.
+However, the |alt-input| and |debug-highlight| were written to be usable in
+both vim and gvim. Some of the other features could be used in the non-GUI
+vim with slight modifications. However, I did not do this nor did I test the
+reliability of building for vim or non Motif GUI versions.
+
+
+1.1 Alternate Command Input *alt-input*
+
+For Vim to work with a debugger there must be at least an input connection
+with a debugger or external tool. In many cases there will also be an output
+connection but this isn't absolutely necessary.
+
+The purpose of the input connection is to let the external debugger send
+commands to Vim. The commands sent by the debugger should give the debugger
+enough control to display the current debug environment and state.
+
+The current implementation is based on the X Toolkit dispatch loop and the
+XtAddInput() function call.
+
+
+1.2 Debug Signs *debug-signs*
+
+Many debuggers mark specific lines by placing a small sign or color highlight
+on the line. The |:sign| command lets the debugger set this graphic mark. Some
+examples where this feature would be used would be a debugger showing an arrow
+representing the Program Counter (PC) of the program being debugged. Another
+example would be a small stop sign for a line with a breakpoint. These visible
+highlights let the user keep track of certain parts of the state of the
+debugger.
+
+This feature can be used with more than debuggers, too. An IPE can use a sign
+to highlight build errors, searched text, or other things. The sign feature
+can also work together with the |debug-highlight| to ensure the mark is
+highly visible.
+
+Debug signs are defined and placed using the |:sign| command.
+
+
+1.3 Debug Source Highlight *debug-highlight*
+
+This feature allows a line to have a predominant highlight. The highlight is
+intended to make a specific line stand out. The highlight could be made to
+work for both vim and gvim, whereas the debug sign is, in most cases, limited
+to gvim. The one exception to this is Sun Microsystem's dtterm. The dtterm
+from Sun has a "sign gutter" for showing signs.
+
+
+1.4 Message Footer *gui-footer*
+
+The message footer can be used to display messages from a debugger or IPE. It
+can also be used to display menu and toolbar tips. The footer area is at the
+bottom of the GUI window, below the line used to display colon commands.
+
+The display of the footer is controlled by the 'guioptions' letter 'F'.
+
+
+1.5 Balloon Evaluation *balloon-eval*
+
+This feature allows a debugger, or other external tool, to display dynamic
+information based on where the mouse is pointing. The purpose of this feature
+was to allow Sun's Visual WorkShop debugger to display expression evaluations.
+However, the feature was implemented in as general a manner as possible and
+could be used for displaying other information as well. The functionality is
+limited though, for advanced popups see |popup-window|.
+
+Another way to use the balloon is with the 'balloonexpr' option. This is
+completely user definable.
+
+The Balloon Evaluation has some settable parameters too. For Motif the font
+list and colors can be set via X resources (XmNballoonEvalFontList,
+XmNballoonEvalBackground, and XmNballoonEvalForeground).
+The 'balloondelay' option sets the delay before an attempt is made to show a
+balloon.
+The 'ballooneval' and/or the 'balloonevalterm' option needs to be set to
+switch it on.
+
+Balloon evaluation is only available in the GUI when compiled with the
+|+balloon_eval| feature. For the terminal the |+balloon_eval_term| feature
+matters.
+
+The Balloon evaluation functions are also used to show a tooltip for the
+toolbar. The 'ballooneval' option does not need to be set for this. But the
+other settings apply.
+
+==============================================================================
+2. Vim Compile Options *debugger-compilation*
+
+The debugger features were added for use with Sun's Visual WorkShop Integrated
+Programming Environment (ipe). However, they were done in as generic a manner
+as possible so that integration with other debuggers could also use these
+features.
+
+The following compile time preprocessor variables control the features:
+
+ Alternate Command Input ALT_X_INPUT
+ Debug Glyphs FEAT_SIGNS
+ Debug Highlights FEAT_SIGNS
+ Message Footer FEAT_FOOTER
+ Balloon Evaluation FEAT_BEVAL
+
+The support specifically for Sun Visual WorkShop has been removed, since the
+product no longer exists.
+
+For Sun NetBeans support see |netbeans|.
+
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/develop.txt b/runtime/doc/develop.txt
new file mode 100644
index 0000000..9325694
--- /dev/null
+++ b/runtime/doc/develop.txt
@@ -0,0 +1,597 @@
+*develop.txt* For Vim version 9.0. Last change: 2022 Sep 20
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Development of Vim. *development*
+
+This text is important for those who want to be involved in further developing
+Vim.
+
+1. Design goals |design-goals|
+2. Coding style |coding-style|
+3. Design decisions |design-decisions|
+4. Assumptions |design-assumptions|
+
+See the file README.txt in the "src" directory for an overview of the source
+code.
+
+Vim is open source software. Everybody is encouraged to contribute to help
+improving Vim. For sending patches a unified diff "diff -u" is preferred.
+You can create a pull request on github, but it's not required.
+Also see http://vim.wikia.com/wiki/How_to_make_and_submit_a_patch.
+
+==============================================================================
+1. 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.
+
+
+VIM IS... VI COMPATIBLE *design-compatible*
+
+First of all, it should be possible to use Vim as a drop-in replacement for
+Vi. When the user wants to, Vim can be used in compatible mode and hardly
+any differences with the original Vi will be noticed.
+
+Exceptions:
+- We don't reproduce obvious Vi bugs in Vim.
+- There are different versions of Vi. I am using Version 3.7 (6/7/85) as a
+ reference. But support for other versions is also included when possible.
+ The Vi part of POSIX is not considered a definitive source.
+- Vim adds new commands, you cannot rely on some command to fail because it
+ didn't exist in Vi.
+- Vim will have a lot of features that Vi doesn't have. Going back from Vim
+ to Vi will be a problem, this cannot be avoided.
+- Some things are hardly ever used (open mode, sending an e-mail when
+ crashing, etc.). Those will only be included when someone has a good reason
+ why it should be included and it's not too much work.
+- For some items it is debatable whether Vi compatibility should be
+ maintained. There will be an option flag for these.
+
+
+VIM 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.
+- 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
+ implement and (3) someone actually implementing it.
+
+
+VIM 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.]
+
+
+VIM 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.
+- Don't make the text unnecessarily long. Less documentation means that an
+ item is easier to find.
+
+
+VIM 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.
+- 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.
+- Commands must work efficiently. The time they consume must be as small as
+ possible. Useful commands may take longer.
+- Don't forget that some people use Vim over a slow connection. Minimize the
+ communication overhead.
+- Items that add considerably to the size and are not used by many people
+ should be a feature that can be disabled.
+- Vim is a component among other components. Don't turn it into a massive
+ application, but have it work well together with other programs.
+
+
+VIM IS... MAINTAINABLE *design-maintain*
+
+- The source code should not become a mess. It should be reliable code.
+- Use the same layout in all files to make it easy to read |coding-style|.
+- Use comments in a useful way! Quoting the function name and argument names
+ is NOT useful. Do explain what they are for.
+- Porting to another platform should be made easy, without having to change
+ too much platform-independent code.
+- Use the object-oriented spirit: Put data and code together. Minimize the
+ knowledge spread to other parts of the code.
+
+
+VIM 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 (e.g., the 'compatible' option) 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.
+
+
+VIM IS... NOT *design-not*
+
+- Vim is not a shell or an Operating System. It does provide a terminal
+ window, in which you can run a shell or debugger. E.g. to be able to do
+ this over an ssh connection. But if you don't need a text editor with that
+ it is out of scope (use something like screen or tmux instead).
+ A satirical way to say this: "Unlike Emacs, Vim does not attempt to include
+ everything but the kitchen sink, but some people say that you can clean one
+ with it. ;-)"
+ To use Vim with gdb see |terminal-debugger|. Other (older) tools can be
+ found at http://www.agide.org and http://clewn.sf.net.
+- Vim is not a fancy GUI editor that tries to look nice at the cost of
+ being less consistent over all platforms. But functional GUI features are
+ welcomed.
+
+==============================================================================
+2. Coding style *coding-style*
+
+These are the rules to use when making changes to the Vim source code. Please
+stick to these rules, to keep the sources readable and maintainable.
+
+This list is not complete. Look in the source code for more examples.
+
+
+MAKING CHANGES *style-changes*
+
+The basic steps to make changes to the code:
+1. Get the code from github. That makes it easier to keep your changed
+ version in sync with the main code base (it may be a while before your
+ changes will be included). You do need to spend some time learning git,
+ it's not the most user friendly tool.
+2. Adjust the documentation. Doing this first gives you an impression of how
+ your changes affect the user.
+3. Make the source code changes.
+4. Check ../doc/todo.txt if the change affects any listed item.
+5. Make a patch with "git diff". You can also create a pull request on
+ github, but it's the diff that matters.
+6. Make a note about what changed, preferably mentioning the problem and the
+ solution. Send an email to the |vim-dev| maillist with an explanation and
+ include the diff. Or create a pull request on github.
+
+
+C COMPILER *style-compiler* *ANSI-C* *C89* *C99*
+
+The minimal C compiler version supported is C89, also known as ANSI C.
+Later standards, such as C99, are not widely supported, or at least not 100%
+supported. Therefore we use only some of the C99 features and explicitly
+disallow some (this will gradually be adjusted over time).
+
+Please don't make changes everywhere to use the C99 features, it causes merge
+problems for existing patches. Only use them for new and changed code.
+
+Comments ~
+
+Traditionally Vim uses /* comments */. We intend to keep it that way
+for file and function headers and larger blocks of code, E.g.:
+ /*
+ * The "foo" argument does something useful.
+ * Return OK or FAIL.
+ */
+For new code or lines of code that change, it is preferred to use // comments.
+Especially when it comes after code:
+ int some_var; // single line comment useful here
+
+Enums ~
+
+The last item in an enum may have a trailing comma. C89 didn't allow this.
+
+Types ~
+
+"long long" is allowed and can be expected to be 64 bits. Use %lld in printf
+formats. Also "long long unsigned" with %llu.
+
+Declarations ~
+
+Now that the minimal supported compiler is MSVC 2015 declarations do not need
+to be at the start of a block. However, it is often a good idea to do this
+anyway.
+
+Declaration of the for loop variable inside the loop is recommended:
+ for (int i = 0; i < len; ++i)
+Since this is clearly an advantage we'll use this more often.
+
+
+Not to be used ~
+
+These C99 features are not to be used, because not enough compilers support
+them:
+- Variable length arrays (even in C11 this is an optional feature).
+- _Bool and _Complex types.
+- "inline" (it's hardly ever needed, let the optimizer do its work)
+- flexible array members: Not supported by HP-UX C compiler (John Marriott)
+
+
+USE OF COMMON FUNCTIONS *style-functions*
+
+Some functions that are common to use, have a special Vim version. Always
+consider using the Vim version, because they were introduced with a reason.
+
+NORMAL NAME VIM NAME DIFFERENCE OF VIM VERSION
+free() vim_free() Checks for freeing NULL
+malloc() alloc() Checks for out of memory situation
+malloc() lalloc() Like alloc(), but has long argument
+strcpy() STRCPY() Includes cast to (char *), for char_u * args
+strchr() vim_strchr() Accepts special characters
+strrchr() vim_strrchr() Accepts special characters
+isspace() vim_isspace() Can handle characters > 128
+iswhite() vim_iswhite() Only TRUE for tab and space
+memcpy() mch_memmove() Handles overlapped copies
+bcopy() mch_memmove() Handles overlapped copies
+memset() vim_memset() Uniform for all systems
+
+
+NAMES *style-names*
+
+Function names can not be more than 31 characters long (because of VMS).
+
+Don't use "delete" or "this" as a variable name, C++ doesn't like it.
+
+Because of the requirement that Vim runs on as many systems as possible, we
+need to avoid using names that are already defined by the system. This is a
+list of names that are known to cause trouble. The name is given as a regexp
+pattern.
+
+is.*() POSIX, ctype.h
+to.*() POSIX, ctype.h
+
+d_.* POSIX, dirent.h
+l_.* POSIX, fcntl.h
+gr_.* POSIX, grp.h
+pw_.* POSIX, pwd.h
+sa_.* POSIX, signal.h
+mem.* POSIX, string.h
+str.* POSIX, string.h
+wcs.* POSIX, string.h
+st_.* POSIX, stat.h
+tms_.* POSIX, times.h
+tm_.* POSIX, time.h
+c_.* POSIX, termios.h
+MAX.* POSIX, limits.h
+__.* POSIX, system
+_[A-Z].* POSIX, system
+E[A-Z0-9]* POSIX, errno.h
+
+.*_t POSIX, for typedefs. Use .*_T instead.
+
+wait don't use as argument to a function, conflicts with types.h
+index shadows global declaration
+time shadows global declaration
+new C++ reserved keyword
+
+clear Mac curses.h
+echo Mac curses.h
+instr Mac curses.h
+meta Mac curses.h
+newwin Mac curses.h
+nl Mac curses.h
+overwrite Mac curses.h
+refresh Mac curses.h
+scroll Mac curses.h
+typeahead Mac curses.h
+
+basename() GNU string function
+dirname() GNU string function
+get_env_value() Linux system function
+
+
+VARIOUS *style-various*
+
+Typedef'ed names should end in "_T": >
+ typedef int some_T;
+Define'ed names should be uppercase: >
+ #define SOME_THING
+Features always start with "FEAT_": >
+ #define FEAT_FOO
+
+Don't use '\"', some compilers can't handle it. '"' works fine.
+
+Don't use:
+ #if HAVE_SOME
+Some compilers can't handle that and complain that "HAVE_SOME" is not defined.
+Use
+ #ifdef HAVE_SOME
+or
+ #if defined(HAVE_SOME)
+
+
+STYLE *style-examples*
+
+General rule: One statement per line.
+
+Wrong: if (cond) a = 1;
+
+OK: if (cond)
+ a = 1;
+
+Wrong: while (cond);
+
+OK: while (cond)
+ ;
+
+Wrong: do a = 1; while (cond);
+
+OK: do
+ a = 1;
+ while (cond);
+
+Wrong: if (cond) {
+ cmd;
+ cmd;
+ } else {
+ cmd;
+ cmd;
+ }
+
+OK: if (cond)
+ {
+ cmd;
+ cmd;
+ }
+ else
+ {
+ cmd;
+ cmd;
+ }
+
+When a block has one line the braces can be left out. When an if/else has
+braces on one block, it usually looks better when the other block also has
+braces:
+OK: if (cond)
+ cmd;
+ else
+ cmd;
+
+OK: if (cond)
+ {
+ cmd;
+ }
+ else
+ {
+ cmd;
+ cmd;
+ }
+
+Use ANSI (new style) function declarations with the return type on a separate
+indented line.
+
+Wrong: int function_name(int arg1, int arg2)
+
+OK: /*
+ * Explanation of what this function is used for.
+ *
+ * Return value explanation.
+ */
+ int
+ function_name(
+ int arg1, // short comment about arg1
+ int arg2) // short comment about arg2
+ {
+ int local; // comment about local
+
+ local = arg1 * arg2;
+
+
+
+SPACES AND PUNCTUATION *style-spaces*
+
+No space between a function name and the bracket:
+
+Wrong: func (arg);
+OK: func(arg);
+
+Do use a space after if, while, switch, etc.
+
+Wrong: if(arg) for(;;)
+OK: if (arg) for (;;)
+
+Use a space after a comma and semicolon:
+
+Wrong: func(arg1,arg2); for (i = 0;i < 2;++i)
+OK: func(arg1, arg2); for (i = 0; i < 2; ++i)
+
+Use a space before and after '=', '+', '/', etc.
+
+Wrong: var=a*5;
+OK: var = a * 5;
+
+In general: Use empty lines to group lines of code together. Put a comment
+just above the group of lines. This makes it easier to quickly see what is
+being done.
+
+OK: /* Prepare for building the table. */
+ get_first_item();
+ table_idx = 0;
+
+ /* Build the table */
+ while (has_item())
+ table[table_idx++] = next_item();
+
+ /* Finish up. */
+ cleanup_items();
+ generate_hash(table);
+
+==============================================================================
+3. Design decisions *design-decisions*
+
+Folding
+
+Several forms of folding should be possible for the same buffer. For example,
+have one window that shows the text with function bodies folded, another
+window that shows a function body.
+
+Folding is a way to display the text. It should not change the text itself.
+Therefore the folding has been implemented as a filter between the text stored
+in a buffer (buffer lines) and the text displayed in a window (logical lines).
+
+
+Naming the 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.
+
+
+Spell checking *develop-spell*
+
+When spell checking was going to be added to Vim a survey was done over the
+available spell checking libraries and programs. Unfortunately, the result
+was that none of them provided sufficient capabilities to be used as the spell
+checking engine in Vim, for various reasons:
+
+- Missing support for multibyte encodings. At least UTF-8 must be supported,
+ so that more than one language can be used in the same file.
+ Doing on-the-fly conversion is not always possible (would require iconv
+ support).
+- For the programs and libraries: Using them as-is would require installing
+ them separately from Vim. That's mostly not impossible, but a drawback.
+- Performance: A few tests showed that it's possible to check spelling on the
+ fly (while redrawing), just like syntax highlighting. But the mechanisms
+ used by other code are much slower. Myspell uses a hashtable, for example.
+ The affix compression that most spell checkers use makes it slower too.
+- For using an external program like aspell a communication mechanism would
+ have to be setup. That's complicated to do in a portable way (Unix-only
+ would be relatively simple, but that's not good enough). And performance
+ will become a problem (lots of process switching involved).
+- Missing support for words with non-word characters, such as "Etten-Leur" and
+ "et al.", would require marking the pieces of them OK, lowering the
+ reliability.
+- Missing support for regions or dialects. Makes it difficult to accept
+ all English words and highlight non-Canadian words differently.
+- Missing support for rare words. Many words are correct but hardly ever used
+ and could be a misspelled often-used word.
+- For making suggestions the speed is less important and requiring to install
+ another program or library would be acceptable. But the word lists probably
+ differ, the suggestions may be wrong words.
+
+
+Spelling suggestions *develop-spell-suggestions*
+
+For making suggestions there are two basic mechanisms:
+1. Try changing the bad word a little bit and check for a match with a good
+ word. Or go through the list of good words, change them a little bit and
+ check for a match with the bad word. The changes are deleting a character,
+ inserting a character, swapping two characters, etc.
+2. Perform soundfolding on both the bad word and the good words and then find
+ matches, possibly with a few changes like with the first mechanism.
+
+The first is good for finding typing mistakes. After experimenting with
+hashtables and looking at solutions from other spell checkers the conclusion
+was that a trie (a kind of tree structure) is ideal for this. Both for
+reducing memory use and being able to try sensible changes. For example, when
+inserting a character only characters that lead to good words need to be
+tried. Other mechanisms (with hashtables) need to try all possible letters at
+every position in the word. Also, a hashtable has the requirement that word
+boundaries are identified separately, while a trie does not require this.
+That makes the mechanism a lot simpler.
+
+Soundfolding is useful when someone knows how the words sounds but doesn't
+know how it is spelled. For example, the word "dictionary" might be written
+as "daktonerie". The number of changes that the first method would need to
+try is very big, it's hard to find the good word that way. After soundfolding
+the words become "tktnr" and "tkxnry", these differ by only two letters.
+
+To find words by their soundfolded equivalent (soundalike word) we need a list
+of all soundfolded words. A few experiments have been done to find out what
+the best method is. Alternatives:
+1. Do the sound folding on the fly when looking for suggestions. This means
+ walking through the trie of good words, soundfolding each word and
+ checking how different it is from the bad word. This is very efficient for
+ memory use, but takes a long time. On a fast PC it takes a couple of
+ seconds for English, which can be acceptable for interactive use. But for
+ some languages it takes more than ten seconds (e.g., German, Catalan),
+ which is unacceptably slow. For batch processing (automatic corrections)
+ it's too slow for all languages.
+2. Use a trie for the soundfolded words, so that searching can be done just
+ like how it works without soundfolding. This requires remembering a list
+ of good words for each soundfolded word. This makes finding matches very
+ fast but requires quite a lot of memory, in the order of 1 to 10 Mbyte.
+ For some languages more than the original word list.
+3. Like the second alternative, but reduce the amount of memory by using affix
+ compression and store only the soundfolded basic word. This is what Aspell
+ does. Disadvantage is that affixes need to be stripped from the bad word
+ before soundfolding it, which means that mistakes at the start and/or end
+ of the word will cause the mechanism to fail. Also, this becomes slow when
+ the bad word is quite different from the good word.
+
+The choice made is to use the second mechanism and use a separate file. This
+way a user with sufficient memory can get very good suggestions while a user
+who is short of memory or just wants the spell checking and no suggestions
+doesn't use so much memory.
+
+
+Word frequency
+
+For sorting suggestions it helps to know which words are common. In theory we
+could store a word frequency with the word in the dictionary. However, this
+requires storing a count per word. That degrades word tree compression a lot.
+And maintaining the word frequency for all languages will be a heavy task.
+Also, it would be nice to prefer words that are already in the text. This way
+the words that appear in the specific text are preferred for suggestions.
+
+What has been implemented is to count words that have been seen during
+displaying. A hashtable is used to quickly find the word count. The count is
+initialized from words listed in COMMON items in the affix file, so that it
+also works when starting a new file.
+
+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.
+
+==============================================================================
+4. Assumptions *design-assumptions*
+
+Size of variables:
+char 8 bit signed
+char_u 8 bit unsigned
+int 32 or 64 bit signed (16 might be possible with limited features)
+unsigned 32 or 64 bit unsigned (16 as with ints)
+long 32 or 64 bit signed, can hold a pointer
+
+Note that some compilers cannot handle long lines or strings. The C89
+standard specifies a limit of 509 characters.
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/diff.txt b/runtime/doc/diff.txt
new file mode 100644
index 0000000..216922a
--- /dev/null
+++ b/runtime/doc/diff.txt
@@ -0,0 +1,478 @@
+*diff.txt* For Vim version 9.0. Last change: 2023 Jan 21
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *diff* *vimdiff* *gvimdiff* *diff-mode*
+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 |start-vimdiff|
+2. Viewing diffs |view-diffs|
+3. Jumping to diffs |jumpto-diffs|
+4. Copying diffs |copy-diffs|
+5. Diff options |diff-options|
+
+==============================================================================
+1. Starting diff mode *start-vimdiff*
+
+The easiest way to start editing in diff mode is with the "vimdiff" command.
+This starts Vim as usual, and additionally sets up for viewing the differences
+between the arguments. >
+
+ vimdiff file1 file2 [file3 [file4]]
+
+This is equivalent to: >
+
+ vim -d file1 file2 [file3 [file4]]
+
+You may also use "gvimdiff" or "vim -d -g". The GUI is started then.
+You may also use "viewdiff" or "gviewdiff". Vim starts in readonly mode then.
+"r" may be prepended for restricted mode (see |-Z|).
+
+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.
+
+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
+diffs at the same time, each in their own tab page.
+
+What happens is that Vim opens a window for each of the files. This is like
+using the |-O| argument. This uses vertical splits. If you prefer horizontal
+splits add the |-o| argument: >
+
+ vimdiff -o file1 file2 [file3 [file4]]
+
+If you always prefer horizontal splits include "horizontal" in 'diffopt'.
+
+In each of the edited files these options are set:
+
+ 'diff' on
+ 'scrollbind' on
+ 'cursorbind' on
+ 'scrollopt' includes "hor"
+ 'wrap' off, or leave as-is if 'diffopt' includes "followwrap"
+ 'foldmethod' "diff"
+ 'foldcolumn' value from 'diffopt', default is 2
+
+These options are set local to the window. When editing another file they are
+reset to the global value.
+The options can still be overruled from a modeline when re-editing the file.
+However, 'foldmethod' and 'wrap' won't be set from a modeline when 'diff' is
+set.
+See `:diffoff` for an easy way to revert the options.
+
+The differences shown are actually the differences in the buffer. Thus if you
+make changes after loading a file, these will be included in the displayed
+diffs. You might have to do ":diffupdate" now and then, not all changes are
+immediately taken into account, especially when using an external diff command.
+
+In your .vimrc file you could do something special when Vim was started in
+diff mode. You could use a construct like this: >
+
+ if &diff
+ setup for diff mode
+ else
+ setup for non-diff mode
+ endif
+
+While already in Vim you can start diff mode in three ways.
+
+ *E98*
+:diffs[plit] {filename} *:diffs* *:diffsplit*
+ Open a new window on the file {filename}. The options are set
+ as for "vimdiff" for the current and the newly opened window.
+ Also see 'diffexpr'.
+
+ *:difft* *:diffthis*
+:difft[his] Make the current window part of the diff windows. This sets
+ the options like for "vimdiff".
+
+:diffp[atch] {patchfile} *E816* *:diffp* *:diffpatch*
+ Use the current buffer, patch it with the diff found in
+ {patchfile} and open a buffer on the result. The options are
+ set as for "vimdiff".
+ {patchfile} can be in any format that the "patch" program
+ understands or 'patchexpr' can handle.
+ Note that {patchfile} should only contain a diff for one file,
+ the current file. If {patchfile} contains diffs for other
+ files as well, the results are unpredictable. Vim changes
+ directory to /tmp to avoid files in the current directory
+ accidentally being patched. But it may still result in
+ various ".rej" files to be created. And when absolute path
+ names are present these files may get patched anyway.
+
+To make these commands use a vertical split, prepend |:vertical|. Examples: >
+
+ :vert diffsplit main.c~
+ :vert diffpatch /tmp/diff
+
+If you always prefer a vertical split include "vertical" in 'diffopt'.
+
+ *E96*
+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.
+
+ *:diffo* *:diffoff*
+:diffo[ff] Switch off diff mode for the current window. Resets related
+ options also when 'diff' was not set.
+
+:diffo[ff]! Switch off diff mode for the current window and in all windows
+ in the current tab page where 'diff' is set. Resetting
+ 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.
+When using `:diffoff` twice the last saved values are restored.
+Otherwise they are set to their default value:
+
+ 'diff' off
+ 'scrollbind' off
+ 'cursorbind' off
+ 'scrollopt' without "hor"
+ 'wrap' on, or leave as-is if 'diffopt' includes "followwrap"
+ 'foldmethod' "manual"
+ 'foldcolumn' 0
+
+'foldenable' will most-likely be reset to off. That is when 'foldmethod' is
+is restored to "manual". The folds themselves are not cleared but they should
+not show up, resetting 'foldenable' is the best way to do that.
+
+==============================================================================
+2. Viewing diffs *view-diffs*
+
+The effect is that the diff windows show the same text, with the differences
+highlighted. When scrolling the text, the 'scrollbind' option will make the
+text in other windows to be scrolled as well. With vertical splits the text
+should be aligned properly.
+
+The alignment of text will go wrong when:
+- 'wrap' is on, some lines will be wrapped and occupy two or more screen
+ lines
+- folds are open in one window but not another
+- 'scrollbind' is off
+- changes have been made to the text
+- "filler" is not present in 'diffopt', deleted/inserted lines makes the
+ alignment go wrong
+
+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. 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
+in diff mode in one window and "normal" in another window. It is also
+possible to view the changes you have made to a buffer since the file was
+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 bt=nofile | r ++edit # | 0d_
+ \ | diffthis | wincmd p | diffthis
+(this is in |defaults.vim|). 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
+hidden buffers. You can use ":hide" to close a window without unloading the
+buffer. If you don't want a buffer to remain used for the diff do ":set
+nodiff" before hiding it.
+
+ *:dif* *:diff* *:diffupdate*
+:dif[fupdate][!] Update the diff highlighting and folds.
+
+Vim attempts to keep the differences updated when you make changes to the
+text. This mostly takes care of inserted and deleted lines. Changes within a
+line and more complicated changes do not cause the differences to be updated.
+To force the differences to be updated use: >
+
+ :diffupdate
+
+If the ! is included Vim will check if the file was changed externally and
+needs to be reloaded. It will prompt for each changed file, like `:checktime`
+was used.
+
+Vim will show filler lines for lines that are missing in one window but are
+present in another. These lines were inserted in another file or deleted in
+this file. Removing "filler" from the 'diffopt' option will make Vim not
+display these filler lines.
+
+
+Folds are used to hide the text that wasn't changed. See |folding| for all
+the commands that can be used with folds.
+
+The context of lines above a difference that are not included in the fold can
+be set with the 'diffopt' option. For example, to set the context to three
+lines: >
+
+ :set diffopt=filler,context:3
+
+
+The diffs are highlighted with these groups:
+
+|hl-DiffAdd| DiffAdd Added (inserted) lines. These lines exist in
+ this buffer but not in another.
+|hl-DiffChange| DiffChange Changed lines.
+|hl-DiffText| DiffText Changed text inside a Changed line. Vim
+ finds the first character that is different,
+ and the last character that is different
+ (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. 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.
+
+==============================================================================
+3. Jumping to diffs *jumpto-diffs*
+
+Two commands can be used to jump to diffs:
+ *[c*
+ [c Jump backwards to the previous start of a change.
+ When a count is used, do it that many times.
+ *]c*
+ ]c Jump forwards to the next start of a change.
+ When a count is used, do it that many times.
+
+It is an error if there is no change for the cursor to move to.
+
+==============================================================================
+4. Diff copying *copy-diffs* *E99* *E100* *E101* *E102* *E103*
+ *merge*
+There are two commands to copy text from one buffer to another. The result is
+that the buffers will be equal within the specified range.
+
+ *:diffg* *:diffget*
+:[range]diffg[et] [bufspec]
+ Modify the current buffer to undo difference with another
+ buffer. If [bufspec] is given, that buffer is used. If
+ [bufspec] refers to the current buffer then nothing happens.
+ Otherwise this only works if there is one other buffer in diff
+ mode.
+ See below for [range].
+
+ *:diffpu* *:diffput* *E793*
+:[range]diffpu[t] [bufspec]
+ Modify another buffer to undo difference with the current
+ buffer. Just like ":diffget" but the other buffer is modified
+ instead of the current one.
+ When [bufspec] is omitted and there is more than one other
+ buffer in diff mode where 'modifiable' is set this fails.
+ See below for [range].
+
+ *do*
+[count]do Same as ":diffget" without range. The "o" stands for "obtain"
+ ("dg" can't be used, it could be the start of "dgg"!). Note:
+ this doesn't work in Visual mode.
+ If you give a [count], it is used as the [bufspec] argument
+ for ":diffget".
+
+ *dp*
+[count]dp Same as ":diffput" without range. Note: this doesn't work in
+ Visual mode.
+ If you give a [count], it is used as the [bufspec] argument
+ for ":diffput".
+
+
+When no [range] is given, the diff at the cursor position or just above it is
+affected. When [range] is used, Vim tries to only put or get the specified
+lines. When there are deleted lines, this may not always be possible.
+
+There can be deleted lines below the last line of the buffer. When the cursor
+is on the last line in the buffer and there is no diff above this line, the
+":diffget" and "do" commands will obtain lines from the other buffer.
+
+To be able to get those lines from another buffer in a [range] it's allowed to
+use the last line number plus one. This command gets all diffs from the other
+buffer: >
+
+ :1,$+1diffget
+
+Note that deleted lines are displayed, but not counted as text lines. You
+can't move the cursor into them. To fill the deleted lines with the lines
+from another buffer use ":diffget" on the line below them.
+ *E787*
+When the buffer that is about to be modified is read-only and the autocommand
+that is triggered by |FileChangedRO| changes buffers the command will fail.
+The autocommand must not change buffers.
+
+The [bufspec] argument above can be a buffer number, a pattern for a buffer
+name or a part of a buffer name. Examples:
+
+ :diffget Use the other buffer which is in diff mode
+ :diffget 3 Use buffer 3
+ :diffget v2 Use the buffer which matches "v2" and is in
+ diff mode (e.g., "file.c.v2")
+
+==============================================================================
+5. Diff options *diff-options*
+
+Also see |'diffopt'| and the "diff" item of |'fillchars'|.
+
+ *diff-slow* *diff_translations*
+For very long lines, the diff syntax highlighting might be slow, especially
+since it tries to match all different kind of localisations. To disable
+localisations and speed up the syntax highlighting, set the global variable
+g:diff_translations to zero: >
+
+ let g:diff_translations = 0
+<
+After setting this variable, reload the syntax script: >
+
+ set syntax=diff
+<
+
+
+FINDING THE DIFFERENCES *diff-diffexpr*
+
+The 'diffexpr' option can be set to use something else than the internal diff
+support or the standard "diff" program to compare two files and find the
+differences. *E959*
+
+When 'diffexpr' is empty, Vim uses this command to find the differences
+between file1 and file2: >
+
+ diff file1 file2 > outfile
+
+The ">" is replaced with the value of 'shellredir'.
+
+The output of "diff" must be a normal "ed" style diff or a unified diff. A
+context diff will NOT work. For a unified diff no context lines can be used.
+Using "diff -u" will NOT work, use "diff -U0".
+
+This example explains the format that Vim expects for the "ed" style diff: >
+
+ 1a2
+ > bbb
+ 4d4
+ < 111
+ 7c7
+ < GGG
+ ---
+ > ggg
+
+The "1a2" item appends the line "bbb".
+The "4d4" item deletes the line "111".
+The "7c7" item replaces the line "GGG" with "ggg".
+
+When 'diffexpr' is not empty, Vim evaluates it to obtain a diff file in the
+format mentioned. These variables are set to the file names used:
+
+ v:fname_in original file
+ v:fname_new new version of the same file
+ v:fname_out where to write the resulting diff file
+
+Additionally, 'diffexpr' should take care of "icase" and "iwhite" in the
+'diffopt' option. 'diffexpr' cannot change the value of 'lines' and
+'columns'.
+
+The advantage of using a function call without arguments is that it is faster,
+see |expr-option-function|.
+
+Example (this does almost the same as 'diffexpr' being empty): >
+
+ set diffexpr=MyDiff()
+ function MyDiff()
+ let opt = ""
+ if &diffopt =~ "icase"
+ let opt = opt .. "-i "
+ endif
+ if &diffopt =~ "iwhite"
+ let opt = opt .. "-b "
+ 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.
+
+If the 'diffexpr' expression starts with s: or |<SID>|, then it is replaced
+with the script ID (|local-function|). Example: >
+ set diffexpr=s:MyDiffExpr()
+ set diffexpr=<SID>SomeDiffExpr()
+Otherwise, the expression is evaluated in the context of the script where the
+option was set, thus script-local items are available.
+
+ *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:
+- The "diff" program cannot be executed.
+- The "diff" program doesn't produce normal "ed" style diffs (see above).
+- The 'shell' and associated options are not set correctly. Try if filtering
+ works with a command like ":!sort".
+- You are using 'diffexpr' and it doesn't work.
+If it's not clear what the problem is set the 'verbose' option to one or more
+to see more messages.
+
+The self-installing Vim for MS-Windows includes a diff program. If you don't
+have it you might want to download a diff.exe. For example from
+http://gnuwin32.sourceforge.net/packages/diffutils.htm.
+
+
+USING PATCHES *diff-patchexpr*
+
+The 'patchexpr' option can be set to use something else than the standard
+"patch" program.
+
+When 'patchexpr' is empty, Vim will call the "patch" program like this: >
+
+ patch -o outfile origfile < patchfile
+
+This should work fine with most versions of the "patch" program. Note that a
+CR in the middle of a line may cause problems, it is seen as a line break.
+
+If the default doesn't work for you, set the 'patchexpr' to an expression that
+will have the same effect. These variables are set to the file names used:
+
+ v:fname_in original file
+ v:fname_diff patch file
+ v:fname_out resulting patched file
+
+The advantage of using a function call without arguments is that it is faster,
+see |expr-option-function|.
+
+Example (this does the same as 'patchexpr' being empty): >
+
+ set patchexpr=MyPatch()
+ function MyPatch()
+ :call system("patch -o " .. v:fname_out .. " " .. v:fname_in ..
+ \ " < " .. v:fname_diff)
+ endfunction
+
+Make sure that using the "patch" program doesn't have unwanted side effects.
+For example, watch out for additionally generated files, which should be
+deleted. It should just patch the file and nothing else.
+ Vim will change directory to "/tmp" or another temp directory before
+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".
+
+If the 'patchexpr' expression starts with s: or |<SID>|, then it is replaced
+with the script ID (|local-function|). Example: >
+ set patchexpr=s:MyPatchExpr()
+ set patchexpr=<SID>SomePatchExpr()
+Otherwise, the expression is evaluated in the context of the script where the
+option was set, thus script-local items are available.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/digraph.txt b/runtime/doc/digraph.txt
new file mode 100644
index 0000000..918bdd8
--- /dev/null
+++ b/runtime/doc/digraph.txt
@@ -0,0 +1,1491 @@
+*digraph.txt* For Vim version 9.0. Last change: 2022 Nov 22
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Digraphs *digraph* *digraphs* *Digraphs*
+
+Digraphs are used to enter characters that normally cannot be entered by
+an ordinary keyboard. These are mostly printable non-ASCII characters. The
+digraphs are easier to remember than the decimal number that can be entered
+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|
+
+
+==============================================================================
+1. Defining digraphs *digraphs-define*
+
+ *:dig* *:digraphs*
+:dig[raphs][!] Show currently defined digraphs.
+ With [!] headers are used to make it a bit easier to
+ find a specific character.
+ *E104* *E39*
+:dig[raphs] {char1}{char2} {number} ...
+ Add digraph {char1}{char2} to the list. {number} is
+ the decimal representation of the character. Normally
+ it is the Unicode character, see |digraph-encoding|.
+ Example: >
+ :digr e: 235 a: 228
+< You can use `:exe` to enter a hex number: >
+ :exe 'digr += ' .. 0x2A72
+< Avoid defining a digraph with '_' (underscore) as the
+ first character, it has a special meaning in the
+ future.
+ NOTE: This command cannot add a digraph that starts
+ with a white space. If you want to add such digraph,
+ you can use |digraph_set()| instead.
+
+Vim is normally compiled with the |+digraphs| feature. If the feature is
+disabled, the ":digraph" command will display an error message.
+
+Example of the output of ":digraphs": >
+ TH Þ 222 ss ß 223 a! à 224 a' á 225 a> â 226 a? ã 227 a: ä 228
+
+The first two characters in each column are the characters you have to type to
+enter the digraph.
+
+In the middle of each column is the resulting character. This may be mangled
+if you look at it on a system that does not support digraphs or if you print
+this file.
+
+ *digraph-encoding*
+The decimal number normally is the Unicode number of the character. Note that
+the meaning doesn't change when 'encoding' changes. The character will be
+converted from Unicode to 'encoding' when needed. This does require the
+conversion to be available, it might fail. For the NUL character you will see
+"10". That's because NUL characters are internally represented with a NL
+character. When you write the file it will become a NUL character.
+
+Example: >
+ digraph oe 339
+This defines the "oe" digraph for a character that is number 339 in Unicode.
+
+==============================================================================
+2. Using digraphs *digraphs-use*
+
+There are two methods to enter digraphs: *i_digraph*
+ CTRL-K {char1} {char2} or
+ {char1} <BS> {char2}
+The first is always available; the second only when the 'digraph' option is
+set.
+
+If a digraph with {char1}{char2} does not exist, Vim searches for a digraph
+{char2}{char1}. This helps when you don't remember which character comes
+first.
+
+Note that when you enter CTRL-K {char1}, where {char1} is a special key, Vim
+enters the code for that special key. This is not a digraph.
+
+Once you have entered the digraph, Vim treats the character like a normal
+character that occupies only one character in the file and on the screen.
+Example: >
+ 'B' <BS> 'B' will enter the broken '|' character (166)
+ 'a' <BS> '>' will enter an 'a' with a circumflex (226)
+ CTRL-K '-' '-' will enter a soft hyphen (173)
+
+The current digraphs are listed with the ":digraphs" command. Some of the
+default ones are listed below |digraph-table|.
+
+For CTRL-K, there is one general digraph: CTRL-K <Space> {char} will enter
+{char} with the highest bit set. You can use this to enter meta-characters.
+
+The <Esc> character cannot be part of a digraph. When hitting <Esc>, Vim
+stops digraph entry and ends Insert mode or Command-line mode, just like
+hitting an <Esc> out of digraph context. Use CTRL-V 155 to enter meta-ESC
+(CSI).
+
+If you accidentally typed an 'a' that should be an 'e', you will type 'a' <BS>
+'e'. But that is a digraph, so you will not get what you want. To correct
+this, you will have to type <BS> e again. To avoid this don't set the
+'digraph' option and use CTRL-K to enter digraphs.
+
+You may have problems using Vim with characters which have a value above 128.
+For example: You insert ue (u-umlaut) and the editor echoes \334 in Insert
+mode. After leaving the Insert mode everything is fine. On some Unix systems
+this means you have to define the environment-variable LC_CTYPE. If you are
+using csh, then put the following line in your .cshrc: >
+ setenv LC_CTYPE en_US.utf8
+(or similar for a different language or country). The value must be a valid
+locale on your system, i.e. on Unix-like systems it must be present in the
+output of >
+ locale -a
+
+==============================================================================
+3. Default digraphs *digraphs-default*
+
+Vim comes with a set of default digraphs. Check the output of ":digraphs" to
+see them.
+
+On most systems Vim uses the same digraphs. They work for the Unicode and
+ISO-8859-1 character sets. These default digraphs are taken from the RFC1345
+mnemonics. To make it easy to remember the mnemonic, the second character has
+a standard meaning:
+
+ char name char meaning ~
+ Exclamation mark ! Grave
+ Apostrophe ' Acute accent
+ Greater-Than sign > Circumflex accent
+ Question mark ? Tilde
+ Hyphen-Minus - Macron
+ Left parenthesis ( Breve
+ Full stop . Dot above
+ Colon : Diaeresis
+ Comma , Cedilla
+ Underline _ Underline
+ Solidus / Stroke
+ Quotation mark " Double acute accent
+ Semicolon ; Ogonek
+ Less-Than sign < Caron
+ Zero 0 Ring above
+ Two 2 Hook
+ Nine 9 Horn
+
+ Equals = Cyrillic (= used as second char)
+ Asterisk * Greek
+ Percent sign % Greek/Cyrillic special
+ Plus + smalls: Arabic, capitals: Hebrew
+ Three 3 some Latin/Greek/Cyrillic letters
+ Four 4 Bopomofo
+ Five 5 Hiragana
+ Six 6 Katakana
+
+Example: a: is ä and o: is ö
+
+These are the RFC1345 digraphs for the one-byte characters. See the output of
+":digraphs" for the others.
+
+EURO
+ *euro* *euro-digraph*
+Exception: RFC1345 doesn't specify the euro sign. In Vim the digraph =e was
+added for this. Note the difference between latin1, where the digraph Cu is
+used for the currency sign, and latin9 (iso-8859-15), where the digraph =e is
+used for the euro sign, while both of them are the character 164, 0xa4. For
+compatibility with zsh Eu can also be used for the euro sign.
+
+ROUBLE
+
+The rouble sign was added in 2014 as 0x20bd. Vim supports the digraphs =R and
+=P for this. Note that R= and P= are other characters.
+
+ *digraph-table*
+char digraph hex dec official name ~
+^@ NU 0x00 0 NULL (NUL)
+^A SH 0x01 1 START OF HEADING (SOH)
+^B SX 0x02 2 START OF TEXT (STX)
+^C EX 0x03 3 END OF TEXT (ETX)
+^D ET 0x04 4 END OF TRANSMISSION (EOT)
+^E EQ 0x05 5 ENQUIRY (ENQ)
+^F AK 0x06 6 ACKNOWLEDGE (ACK)
+^G BL 0x07 7 BELL (BEL)
+^H BS 0x08 8 BACKSPACE (BS)
+^I HT 0x09 9 CHARACTER TABULATION (HT)
+^@ LF 0x0a 10 LINE FEED (LF)
+^K VT 0x0b 11 LINE TABULATION (VT)
+^L FF 0x0c 12 FORM FEED (FF)
+^M CR 0x0d 13 CARRIAGE RETURN (CR)
+^N SO 0x0e 14 SHIFT OUT (SO)
+^O SI 0x0f 15 SHIFT IN (SI)
+^P DL 0x10 16 DATALINK ESCAPE (DLE)
+^Q D1 0x11 17 DEVICE CONTROL ONE (DC1)
+^R D2 0x12 18 DEVICE CONTROL TWO (DC2)
+^S D3 0x13 19 DEVICE CONTROL THREE (DC3)
+^T D4 0x14 20 DEVICE CONTROL FOUR (DC4)
+^U NK 0x15 21 NEGATIVE ACKNOWLEDGE (NAK)
+^V SY 0x16 22 SYNCHRONOUS IDLE (SYN)
+^W EB 0x17 23 END OF TRANSMISSION BLOCK (ETB)
+^X CN 0x18 24 CANCEL (CAN)
+^Y EM 0x19 25 END OF MEDIUM (EM)
+^Z SB 0x1a 26 SUBSTITUTE (SUB)
+^[ EC 0x1b 27 ESCAPE (ESC)
+^\ FS 0x1c 28 FILE SEPARATOR (IS4)
+^] GS 0x1d 29 GROUP SEPARATOR (IS3)
+^^ RS 0x1e 30 RECORD SEPARATOR (IS2)
+^_ US 0x1f 31 UNIT SEPARATOR (IS1)
+ SP 0x20 32 SPACE
+# Nb 0x23 35 NUMBER SIGN
+$ DO 0x24 36 DOLLAR SIGN
+@ At 0x40 64 COMMERCIAL AT
+[ <( 0x5b 91 LEFT SQUARE BRACKET
+\ // 0x5c 92 REVERSE SOLIDUS
+] )> 0x5d 93 RIGHT SQUARE BRACKET
+^ '> 0x5e 94 CIRCUMFLEX ACCENT
+` '! 0x60 96 GRAVE ACCENT
+{ (! 0x7b 123 LEFT CURLY BRACKET
+| !! 0x7c 124 VERTICAL LINE
+} !) 0x7d 125 RIGHT CURLY BRACKET
+~ '? 0x7e 126 TILDE
+^? DT 0x7f 127 DELETE (DEL)
+~@ PA 0x80 128 PADDING CHARACTER (PAD)
+~A HO 0x81 129 HIGH OCTET PRESET (HOP)
+~B BH 0x82 130 BREAK PERMITTED HERE (BPH)
+~C NH 0x83 131 NO BREAK HERE (NBH)
+~D IN 0x84 132 INDEX (IND)
+~E NL 0x85 133 NEXT LINE (NEL)
+~F SA 0x86 134 START OF SELECTED AREA (SSA)
+~G ES 0x87 135 END OF SELECTED AREA (ESA)
+~H HS 0x88 136 CHARACTER TABULATION SET (HTS)
+~I HJ 0x89 137 CHARACTER TABULATION WITH JUSTIFICATION (HTJ)
+~J VS 0x8a 138 LINE TABULATION SET (VTS)
+~K PD 0x8b 139 PARTIAL LINE FORWARD (PLD)
+~L PU 0x8c 140 PARTIAL LINE BACKWARD (PLU)
+~M RI 0x8d 141 REVERSE LINE FEED (RI)
+~N S2 0x8e 142 SINGLE-SHIFT TWO (SS2)
+~O S3 0x8f 143 SINGLE-SHIFT THREE (SS3)
+~P DC 0x90 144 DEVICE CONTROL STRING (DCS)
+~Q P1 0x91 145 PRIVATE USE ONE (PU1)
+~R P2 0x92 146 PRIVATE USE TWO (PU2)
+~S TS 0x93 147 SET TRANSMIT STATE (STS)
+~T CC 0x94 148 CANCEL CHARACTER (CCH)
+~U MW 0x95 149 MESSAGE WAITING (MW)
+~V SG 0x96 150 START OF GUARDED AREA (SPA)
+~W EG 0x97 151 END OF GUARDED AREA (EPA)
+~X SS 0x98 152 START OF STRING (SOS)
+~Y GC 0x99 153 SINGLE GRAPHIC CHARACTER INTRODUCER (SGCI)
+~Z SC 0x9a 154 SINGLE CHARACTER INTRODUCER (SCI)
+~[ CI 0x9b 155 CONTROL SEQUENCE INTRODUCER (CSI)
+~\ ST 0x9c 156 STRING TERMINATOR (ST)
+~] OC 0x9d 157 OPERATING SYSTEM COMMAND (OSC)
+~^ PM 0x9e 158 PRIVACY MESSAGE (PM)
+~_ AC 0x9f 159 APPLICATION PROGRAM COMMAND (APC)
+| NS 0xa0 160 NO-BREAK SPACE
+¡ !I 0xa1 161 INVERTED EXCLAMATION MARK
+¢ Ct 0xa2 162 CENT SIGN
+£ Pd 0xa3 163 POUND SIGN
+¤ Cu 0xa4 164 CURRENCY SIGN
+¥ Ye 0xa5 165 YEN SIGN
+¦ BB 0xa6 166 BROKEN BAR
+§ SE 0xa7 167 SECTION SIGN
+¨ ': 0xa8 168 DIAERESIS
+© Co 0xa9 169 COPYRIGHT SIGN
+ª -a 0xaa 170 FEMININE ORDINAL INDICATOR
+« << 0xab 171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+¬ NO 0xac 172 NOT SIGN
+­ -- 0xad 173 SOFT HYPHEN
+® Rg 0xae 174 REGISTERED SIGN
+¯ 'm 0xaf 175 MACRON
+° DG 0xb0 176 DEGREE SIGN
+± +- 0xb1 177 PLUS-MINUS SIGN
+² 2S 0xb2 178 SUPERSCRIPT TWO
+³ 3S 0xb3 179 SUPERSCRIPT THREE
+´ '' 0xb4 180 ACUTE ACCENT
+µ My 0xb5 181 MICRO SIGN
+¶ PI 0xb6 182 PILCROW SIGN
+· .M 0xb7 183 MIDDLE DOT
+¸ ', 0xb8 184 CEDILLA
+¹ 1S 0xb9 185 SUPERSCRIPT ONE
+º -o 0xba 186 MASCULINE ORDINAL INDICATOR
+» >> 0xbb 187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+¼ 14 0xbc 188 VULGAR FRACTION ONE QUARTER
+½ 12 0xbd 189 VULGAR FRACTION ONE HALF
+¾ 34 0xbe 190 VULGAR FRACTION THREE QUARTERS
+¿ ?I 0xbf 191 INVERTED QUESTION MARK
+À A! 0xc0 192 LATIN CAPITAL LETTER A WITH GRAVE
+Á A' 0xc1 193 LATIN CAPITAL LETTER A WITH ACUTE
+Â A> 0xc2 194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+Ã A? 0xc3 195 LATIN CAPITAL LETTER A WITH TILDE
+Ä A: 0xc4 196 LATIN CAPITAL LETTER A WITH DIAERESIS
+Å AA 0xc5 197 LATIN CAPITAL LETTER A WITH RING ABOVE
+Æ AE 0xc6 198 LATIN CAPITAL LETTER AE
+Ç C, 0xc7 199 LATIN CAPITAL LETTER C WITH CEDILLA
+È E! 0xc8 200 LATIN CAPITAL LETTER E WITH GRAVE
+É E' 0xc9 201 LATIN CAPITAL LETTER E WITH ACUTE
+Ê E> 0xca 202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+Ë E: 0xcb 203 LATIN CAPITAL LETTER E WITH DIAERESIS
+Ì I! 0xcc 204 LATIN CAPITAL LETTER I WITH GRAVE
+Í I' 0xcd 205 LATIN CAPITAL LETTER I WITH ACUTE
+Î I> 0xce 206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+Ï I: 0xcf 207 LATIN CAPITAL LETTER I WITH DIAERESIS
+Ð D- 0xd0 208 LATIN CAPITAL LETTER ETH (Icelandic)
+Ñ N? 0xd1 209 LATIN CAPITAL LETTER N WITH TILDE
+Ò O! 0xd2 210 LATIN CAPITAL LETTER O WITH GRAVE
+Ó O' 0xd3 211 LATIN CAPITAL LETTER O WITH ACUTE
+Ô O> 0xd4 212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+Õ O? 0xd5 213 LATIN CAPITAL LETTER O WITH TILDE
+Ö O: 0xd6 214 LATIN CAPITAL LETTER O WITH DIAERESIS
+× *X 0xd7 215 MULTIPLICATION SIGN
+Ø O/ 0xd8 216 LATIN CAPITAL LETTER O WITH STROKE
+Ù U! 0xd9 217 LATIN CAPITAL LETTER U WITH GRAVE
+Ú U' 0xda 218 LATIN CAPITAL LETTER U WITH ACUTE
+Û U> 0xdb 219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+Ü U: 0xdc 220 LATIN CAPITAL LETTER U WITH DIAERESIS
+Ý Y' 0xdd 221 LATIN CAPITAL LETTER Y WITH ACUTE
+Þ TH 0xde 222 LATIN CAPITAL LETTER THORN (Icelandic)
+ß ss 0xdf 223 LATIN SMALL LETTER SHARP S (German)
+à a! 0xe0 224 LATIN SMALL LETTER A WITH GRAVE
+á a' 0xe1 225 LATIN SMALL LETTER A WITH ACUTE
+â a> 0xe2 226 LATIN SMALL LETTER A WITH CIRCUMFLEX
+ã a? 0xe3 227 LATIN SMALL LETTER A WITH TILDE
+ä a: 0xe4 228 LATIN SMALL LETTER A WITH DIAERESIS
+å aa 0xe5 229 LATIN SMALL LETTER A WITH RING ABOVE
+æ ae 0xe6 230 LATIN SMALL LETTER AE
+ç c, 0xe7 231 LATIN SMALL LETTER C WITH CEDILLA
+è e! 0xe8 232 LATIN SMALL LETTER E WITH GRAVE
+é e' 0xe9 233 LATIN SMALL LETTER E WITH ACUTE
+ê e> 0xea 234 LATIN SMALL LETTER E WITH CIRCUMFLEX
+ë e: 0xeb 235 LATIN SMALL LETTER E WITH DIAERESIS
+ì i! 0xec 236 LATIN SMALL LETTER I WITH GRAVE
+í i' 0xed 237 LATIN SMALL LETTER I WITH ACUTE
+î i> 0xee 238 LATIN SMALL LETTER I WITH CIRCUMFLEX
+ï i: 0xef 239 LATIN SMALL LETTER I WITH DIAERESIS
+ð d- 0xf0 240 LATIN SMALL LETTER ETH (Icelandic)
+ñ n? 0xf1 241 LATIN SMALL LETTER N WITH TILDE
+ò o! 0xf2 242 LATIN SMALL LETTER O WITH GRAVE
+ó o' 0xf3 243 LATIN SMALL LETTER O WITH ACUTE
+ô o> 0xf4 244 LATIN SMALL LETTER O WITH CIRCUMFLEX
+õ o? 0xf5 245 LATIN SMALL LETTER O WITH TILDE
+ö o: 0xf6 246 LATIN SMALL LETTER O WITH DIAERESIS
+÷ -: 0xf7 247 DIVISION SIGN
+ø o/ 0xf8 248 LATIN SMALL LETTER O WITH STROKE
+ù u! 0xf9 249 LATIN SMALL LETTER U WITH GRAVE
+ú u' 0xfa 250 LATIN SMALL LETTER U WITH ACUTE
+û u> 0xfb 251 LATIN SMALL LETTER U WITH CIRCUMFLEX
+ü u: 0xfc 252 LATIN SMALL LETTER U WITH DIAERESIS
+ý y' 0xfd 253 LATIN SMALL LETTER Y WITH ACUTE
+þ th 0xfe 254 LATIN SMALL LETTER THORN (Icelandic)
+ÿ y: 0xff 255 LATIN SMALL LETTER Y WITH DIAERESIS
+
+If you are using a |multibyte| 'encoding', Vim provides this enhanced set of
+additional digraphs:
+
+ *digraph-table-mbyte*
+char digraph hex dec official name ~
+Ā A- 0100 0256 LATIN CAPITAL LETTER A WITH MACRON
+ā a- 0101 0257 LATIN SMALL LETTER A WITH MACRON
+Ă A( 0102 0258 LATIN CAPITAL LETTER A WITH BREVE
+ă a( 0103 0259 LATIN SMALL LETTER A WITH BREVE
+Ą A; 0104 0260 LATIN CAPITAL LETTER A WITH OGONEK
+ą a; 0105 0261 LATIN SMALL LETTER A WITH OGONEK
+Ć C' 0106 0262 LATIN CAPITAL LETTER C WITH ACUTE
+ć c' 0107 0263 LATIN SMALL LETTER C WITH ACUTE
+Ĉ C> 0108 0264 LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+ĉ c> 0109 0265 LATIN SMALL LETTER C WITH CIRCUMFLEX
+Ċ C. 010A 0266 LATIN CAPITAL LETTER C WITH DOT ABOVE
+ċ c. 010B 0267 LATIN SMALL LETTER C WITH DOT ABOVE
+Č C< 010C 0268 LATIN CAPITAL LETTER C WITH CARON
+č c< 010D 0269 LATIN SMALL LETTER C WITH CARON
+Ď D< 010E 0270 LATIN CAPITAL LETTER D WITH CARON
+ď d< 010F 0271 LATIN SMALL LETTER D WITH CARON
+Đ D/ 0110 0272 LATIN CAPITAL LETTER D WITH STROKE
+đ d/ 0111 0273 LATIN SMALL LETTER D WITH STROKE
+Ē E- 0112 0274 LATIN CAPITAL LETTER E WITH MACRON
+ē e- 0113 0275 LATIN SMALL LETTER E WITH MACRON
+Ĕ E( 0114 0276 LATIN CAPITAL LETTER E WITH BREVE
+ĕ e( 0115 0277 LATIN SMALL LETTER E WITH BREVE
+Ė E. 0116 0278 LATIN CAPITAL LETTER E WITH DOT ABOVE
+ė e. 0117 0279 LATIN SMALL LETTER E WITH DOT ABOVE
+Ę E; 0118 0280 LATIN CAPITAL LETTER E WITH OGONEK
+ę e; 0119 0281 LATIN SMALL LETTER E WITH OGONEK
+Ě E< 011A 0282 LATIN CAPITAL LETTER E WITH CARON
+ě e< 011B 0283 LATIN SMALL LETTER E WITH CARON
+Ĝ G> 011C 0284 LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+ĝ g> 011D 0285 LATIN SMALL LETTER G WITH CIRCUMFLEX
+Ğ G( 011E 0286 LATIN CAPITAL LETTER G WITH BREVE
+ğ g( 011F 0287 LATIN SMALL LETTER G WITH BREVE
+Ġ G. 0120 0288 LATIN CAPITAL LETTER G WITH DOT ABOVE
+ġ g. 0121 0289 LATIN SMALL LETTER G WITH DOT ABOVE
+Ģ G, 0122 0290 LATIN CAPITAL LETTER G WITH CEDILLA
+ģ g, 0123 0291 LATIN SMALL LETTER G WITH CEDILLA
+Ĥ H> 0124 0292 LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+ĥ h> 0125 0293 LATIN SMALL LETTER H WITH CIRCUMFLEX
+Ħ H/ 0126 0294 LATIN CAPITAL LETTER H WITH STROKE
+ħ h/ 0127 0295 LATIN SMALL LETTER H WITH STROKE
+Ĩ I? 0128 0296 LATIN CAPITAL LETTER I WITH TILDE
+ĩ i? 0129 0297 LATIN SMALL LETTER I WITH TILDE
+Ī I- 012A 0298 LATIN CAPITAL LETTER I WITH MACRON
+ī i- 012B 0299 LATIN SMALL LETTER I WITH MACRON
+Ĭ I( 012C 0300 LATIN CAPITAL LETTER I WITH BREVE
+ĭ i( 012D 0301 LATIN SMALL LETTER I WITH BREVE
+Į I; 012E 0302 LATIN CAPITAL LETTER I WITH OGONEK
+į i; 012F 0303 LATIN SMALL LETTER I WITH OGONEK
+İ I. 0130 0304 LATIN CAPITAL LETTER I WITH DOT ABOVE
+ı i. 0131 0305 LATIN SMALL LETTER DOTLESS I
+IJ IJ 0132 0306 LATIN CAPITAL LIGATURE IJ
+ij ij 0133 0307 LATIN SMALL LIGATURE IJ
+Ĵ J> 0134 0308 LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+ĵ j> 0135 0309 LATIN SMALL LETTER J WITH CIRCUMFLEX
+Ķ K, 0136 0310 LATIN CAPITAL LETTER K WITH CEDILLA
+ķ k, 0137 0311 LATIN SMALL LETTER K WITH CEDILLA
+ĸ kk 0138 0312 LATIN SMALL LETTER KRA
+Ĺ L' 0139 0313 LATIN CAPITAL LETTER L WITH ACUTE
+ĺ l' 013A 0314 LATIN SMALL LETTER L WITH ACUTE
+Ļ L, 013B 0315 LATIN CAPITAL LETTER L WITH CEDILLA
+ļ l, 013C 0316 LATIN SMALL LETTER L WITH CEDILLA
+Ľ L< 013D 0317 LATIN CAPITAL LETTER L WITH CARON
+ľ l< 013E 0318 LATIN SMALL LETTER L WITH CARON
+Ŀ L. 013F 0319 LATIN CAPITAL LETTER L WITH MIDDLE DOT
+ŀ l. 0140 0320 LATIN SMALL LETTER L WITH MIDDLE DOT
+Ł L/ 0141 0321 LATIN CAPITAL LETTER L WITH STROKE
+ł l/ 0142 0322 LATIN SMALL LETTER L WITH STROKE
+Ń N' 0143 0323 LATIN CAPITAL LETTER N WITH ACUTE `
+ń n' 0144 0324 LATIN SMALL LETTER N WITH ACUTE `
+Ņ N, 0145 0325 LATIN CAPITAL LETTER N WITH CEDILLA `
+ņ n, 0146 0326 LATIN SMALL LETTER N WITH CEDILLA `
+Ň N< 0147 0327 LATIN CAPITAL LETTER N WITH CARON `
+ň n< 0148 0328 LATIN SMALL LETTER N WITH CARON `
+ʼn 'n 0149 0329 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE `
+Ŋ NG 014A 0330 LATIN CAPITAL LETTER ENG
+ŋ ng 014B 0331 LATIN SMALL LETTER ENG
+Ō O- 014C 0332 LATIN CAPITAL LETTER O WITH MACRON
+ō o- 014D 0333 LATIN SMALL LETTER O WITH MACRON
+Ŏ O( 014E 0334 LATIN CAPITAL LETTER O WITH BREVE
+ŏ o( 014F 0335 LATIN SMALL LETTER O WITH BREVE
+Ő O" 0150 0336 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+ő o" 0151 0337 LATIN SMALL LETTER O WITH DOUBLE ACUTE
+Œ OE 0152 0338 LATIN CAPITAL LIGATURE OE
+œ oe 0153 0339 LATIN SMALL LIGATURE OE
+Ŕ R' 0154 0340 LATIN CAPITAL LETTER R WITH ACUTE
+ŕ r' 0155 0341 LATIN SMALL LETTER R WITH ACUTE
+Ŗ R, 0156 0342 LATIN CAPITAL LETTER R WITH CEDILLA
+ŗ r, 0157 0343 LATIN SMALL LETTER R WITH CEDILLA
+Ř R< 0158 0344 LATIN CAPITAL LETTER R WITH CARON
+ř r< 0159 0345 LATIN SMALL LETTER R WITH CARON
+Ś S' 015A 0346 LATIN CAPITAL LETTER S WITH ACUTE
+ś s' 015B 0347 LATIN SMALL LETTER S WITH ACUTE
+Ŝ S> 015C 0348 LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+ŝ s> 015D 0349 LATIN SMALL LETTER S WITH CIRCUMFLEX
+Ş S, 015E 0350 LATIN CAPITAL LETTER S WITH CEDILLA
+ş s, 015F 0351 LATIN SMALL LETTER S WITH CEDILLA
+Š S< 0160 0352 LATIN CAPITAL LETTER S WITH CARON
+š s< 0161 0353 LATIN SMALL LETTER S WITH CARON
+Ţ T, 0162 0354 LATIN CAPITAL LETTER T WITH CEDILLA
+ţ t, 0163 0355 LATIN SMALL LETTER T WITH CEDILLA
+Ť T< 0164 0356 LATIN CAPITAL LETTER T WITH CARON
+ť t< 0165 0357 LATIN SMALL LETTER T WITH CARON
+Ŧ T/ 0166 0358 LATIN CAPITAL LETTER T WITH STROKE
+ŧ t/ 0167 0359 LATIN SMALL LETTER T WITH STROKE
+Ũ U? 0168 0360 LATIN CAPITAL LETTER U WITH TILDE
+ũ u? 0169 0361 LATIN SMALL LETTER U WITH TILDE
+Ū U- 016A 0362 LATIN CAPITAL LETTER U WITH MACRON
+ū u- 016B 0363 LATIN SMALL LETTER U WITH MACRON
+Ŭ U( 016C 0364 LATIN CAPITAL LETTER U WITH BREVE
+ŭ u( 016D 0365 LATIN SMALL LETTER U WITH BREVE
+Ů U0 016E 0366 LATIN CAPITAL LETTER U WITH RING ABOVE
+ů u0 016F 0367 LATIN SMALL LETTER U WITH RING ABOVE
+Ű U" 0170 0368 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+ű u" 0171 0369 LATIN SMALL LETTER U WITH DOUBLE ACUTE
+Ų U; 0172 0370 LATIN CAPITAL LETTER U WITH OGONEK
+ų u; 0173 0371 LATIN SMALL LETTER U WITH OGONEK
+Ŵ W> 0174 0372 LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+ŵ w> 0175 0373 LATIN SMALL LETTER W WITH CIRCUMFLEX
+Ŷ Y> 0176 0374 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+ŷ y> 0177 0375 LATIN SMALL LETTER Y WITH CIRCUMFLEX
+Ÿ Y: 0178 0376 LATIN CAPITAL LETTER Y WITH DIAERESIS
+Ź Z' 0179 0377 LATIN CAPITAL LETTER Z WITH ACUTE
+ź z' 017A 0378 LATIN SMALL LETTER Z WITH ACUTE
+Ż Z. 017B 0379 LATIN CAPITAL LETTER Z WITH DOT ABOVE
+ż z. 017C 0380 LATIN SMALL LETTER Z WITH DOT ABOVE
+Ž Z< 017D 0381 LATIN CAPITAL LETTER Z WITH CARON
+ž z< 017E 0382 LATIN SMALL LETTER Z WITH CARON
+Ơ O9 01A0 0416 LATIN CAPITAL LETTER O WITH HORN
+ơ o9 01A1 0417 LATIN SMALL LETTER O WITH HORN
+Ƣ OI 01A2 0418 LATIN CAPITAL LETTER OI
+ƣ oi 01A3 0419 LATIN SMALL LETTER OI
+Ʀ yr 01A6 0422 LATIN LETTER YR
+Ư U9 01AF 0431 LATIN CAPITAL LETTER U WITH HORN
+ư u9 01B0 0432 LATIN SMALL LETTER U WITH HORN
+Ƶ Z/ 01B5 0437 LATIN CAPITAL LETTER Z WITH STROKE
+ƶ z/ 01B6 0438 LATIN SMALL LETTER Z WITH STROKE
+Ʒ ED 01B7 0439 LATIN CAPITAL LETTER EZH
+Ǎ A< 01CD 0461 LATIN CAPITAL LETTER A WITH CARON
+ǎ a< 01CE 0462 LATIN SMALL LETTER A WITH CARON
+Ǐ I< 01CF 0463 LATIN CAPITAL LETTER I WITH CARON
+ǐ i< 01D0 0464 LATIN SMALL LETTER I WITH CARON
+Ǒ O< 01D1 0465 LATIN CAPITAL LETTER O WITH CARON
+ǒ o< 01D2 0466 LATIN SMALL LETTER O WITH CARON
+Ǔ U< 01D3 0467 LATIN CAPITAL LETTER U WITH CARON
+ǔ u< 01D4 0468 LATIN SMALL LETTER U WITH CARON
+Ǟ A1 01DE 0478 LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
+ǟ a1 01DF 0479 LATIN SMALL LETTER A WITH DIAERESIS AND MACRON
+Ǡ A7 01E0 0480 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
+ǡ a7 01E1 0481 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON
+Ǣ A3 01E2 0482 LATIN CAPITAL LETTER AE WITH MACRON
+ǣ a3 01E3 0483 LATIN SMALL LETTER AE WITH MACRON
+Ǥ G/ 01E4 0484 LATIN CAPITAL LETTER G WITH STROKE
+ǥ g/ 01E5 0485 LATIN SMALL LETTER G WITH STROKE
+Ǧ G< 01E6 0486 LATIN CAPITAL LETTER G WITH CARON
+ǧ g< 01E7 0487 LATIN SMALL LETTER G WITH CARON
+Ǩ K< 01E8 0488 LATIN CAPITAL LETTER K WITH CARON
+ǩ k< 01E9 0489 LATIN SMALL LETTER K WITH CARON
+Ǫ O; 01EA 0490 LATIN CAPITAL LETTER O WITH OGONEK
+ǫ o; 01EB 0491 LATIN SMALL LETTER O WITH OGONEK
+Ǭ O1 01EC 0492 LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
+ǭ o1 01ED 0493 LATIN SMALL LETTER O WITH OGONEK AND MACRON
+Ǯ EZ 01EE 0494 LATIN CAPITAL LETTER EZH WITH CARON
+ǯ ez 01EF 0495 LATIN SMALL LETTER EZH WITH CARON
+ǰ j< 01F0 0496 LATIN SMALL LETTER J WITH CARON
+Ǵ G' 01F4 0500 LATIN CAPITAL LETTER G WITH ACUTE
+ǵ g' 01F5 0501 LATIN SMALL LETTER G WITH ACUTE
+ʿ ;S 02BF 0703 MODIFIER LETTER LEFT HALF RING
+ˇ '< 02C7 0711 CARON
+˘ '( 02D8 0728 BREVE
+˙ '. 02D9 0729 DOT ABOVE
+˚ '0 02DA 0730 RING ABOVE
+˛ '; 02DB 0731 OGONEK
+˝ '" 02DD 0733 DOUBLE ACUTE ACCENT
+Ά A% 0386 0902 GREEK CAPITAL LETTER ALPHA WITH TONOS
+Έ E% 0388 0904 GREEK CAPITAL LETTER EPSILON WITH TONOS
+Ή Y% 0389 0905 GREEK CAPITAL LETTER ETA WITH TONOS
+Ί I% 038A 0906 GREEK CAPITAL LETTER IOTA WITH TONOS
+Ό O% 038C 0908 GREEK CAPITAL LETTER OMICRON WITH TONOS
+Ύ U% 038E 0910 GREEK CAPITAL LETTER UPSILON WITH TONOS
+Ώ W% 038F 0911 GREEK CAPITAL LETTER OMEGA WITH TONOS
+ΐ i3 0390 0912 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+Α A* 0391 0913 GREEK CAPITAL LETTER ALPHA
+Β B* 0392 0914 GREEK CAPITAL LETTER BETA
+Γ G* 0393 0915 GREEK CAPITAL LETTER GAMMA
+Δ D* 0394 0916 GREEK CAPITAL LETTER DELTA
+Ε E* 0395 0917 GREEK CAPITAL LETTER EPSILON
+Ζ Z* 0396 0918 GREEK CAPITAL LETTER ZETA
+Η Y* 0397 0919 GREEK CAPITAL LETTER ETA
+Θ H* 0398 0920 GREEK CAPITAL LETTER THETA
+Ι I* 0399 0921 GREEK CAPITAL LETTER IOTA
+Κ K* 039A 0922 GREEK CAPITAL LETTER KAPPA
+Λ L* 039B 0923 GREEK CAPITAL LETTER LAMDA
+Μ M* 039C 0924 GREEK CAPITAL LETTER MU
+Ν N* 039D 0925 GREEK CAPITAL LETTER NU
+Ξ C* 039E 0926 GREEK CAPITAL LETTER XI
+Ο O* 039F 0927 GREEK CAPITAL LETTER OMICRON
+Π P* 03A0 0928 GREEK CAPITAL LETTER PI
+Ρ R* 03A1 0929 GREEK CAPITAL LETTER RHO
+Σ S* 03A3 0931 GREEK CAPITAL LETTER SIGMA
+Τ T* 03A4 0932 GREEK CAPITAL LETTER TAU
+Υ U* 03A5 0933 GREEK CAPITAL LETTER UPSILON
+Φ F* 03A6 0934 GREEK CAPITAL LETTER PHI
+Χ X* 03A7 0935 GREEK CAPITAL LETTER CHI
+Ψ Q* 03A8 0936 GREEK CAPITAL LETTER PSI
+Ω W* 03A9 0937 GREEK CAPITAL LETTER OMEGA
+Ϊ J* 03AA 0938 GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+Ϋ V* 03AB 0939 GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+ά a% 03AC 0940 GREEK SMALL LETTER ALPHA WITH TONOS
+έ e% 03AD 0941 GREEK SMALL LETTER EPSILON WITH TONOS
+ή y% 03AE 0942 GREEK SMALL LETTER ETA WITH TONOS
+ί i% 03AF 0943 GREEK SMALL LETTER IOTA WITH TONOS
+ΰ u3 03B0 0944 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+α a* 03B1 0945 GREEK SMALL LETTER ALPHA
+β b* 03B2 0946 GREEK SMALL LETTER BETA
+γ g* 03B3 0947 GREEK SMALL LETTER GAMMA
+δ d* 03B4 0948 GREEK SMALL LETTER DELTA
+ε e* 03B5 0949 GREEK SMALL LETTER EPSILON
+ζ z* 03B6 0950 GREEK SMALL LETTER ZETA
+η y* 03B7 0951 GREEK SMALL LETTER ETA
+θ h* 03B8 0952 GREEK SMALL LETTER THETA
+ι i* 03B9 0953 GREEK SMALL LETTER IOTA
+κ k* 03BA 0954 GREEK SMALL LETTER KAPPA
+λ l* 03BB 0955 GREEK SMALL LETTER LAMDA
+μ m* 03BC 0956 GREEK SMALL LETTER MU
+ν n* 03BD 0957 GREEK SMALL LETTER NU
+ξ c* 03BE 0958 GREEK SMALL LETTER XI
+ο o* 03BF 0959 GREEK SMALL LETTER OMICRON
+π p* 03C0 0960 GREEK SMALL LETTER PI
+ρ r* 03C1 0961 GREEK SMALL LETTER RHO
+ς *s 03C2 0962 GREEK SMALL LETTER FINAL SIGMA
+σ s* 03C3 0963 GREEK SMALL LETTER SIGMA
+τ t* 03C4 0964 GREEK SMALL LETTER TAU
+υ u* 03C5 0965 GREEK SMALL LETTER UPSILON
+φ f* 03C6 0966 GREEK SMALL LETTER PHI
+χ x* 03C7 0967 GREEK SMALL LETTER CHI
+ψ q* 03C8 0968 GREEK SMALL LETTER PSI
+ω w* 03C9 0969 GREEK SMALL LETTER OMEGA
+ϊ j* 03CA 0970 GREEK SMALL LETTER IOTA WITH DIALYTIKA
+ϋ v* 03CB 0971 GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+ό o% 03CC 0972 GREEK SMALL LETTER OMICRON WITH TONOS
+ύ u% 03CD 0973 GREEK SMALL LETTER UPSILON WITH TONOS
+ώ w% 03CE 0974 GREEK SMALL LETTER OMEGA WITH TONOS
+Ϙ 'G 03D8 0984 GREEK LETTER ARCHAIC KOPPA
+ϙ ,G 03D9 0985 GREEK SMALL LETTER ARCHAIC KOPPA
+Ϛ T3 03DA 0986 GREEK LETTER STIGMA
+ϛ t3 03DB 0987 GREEK SMALL LETTER STIGMA
+Ϝ M3 03DC 0988 GREEK LETTER DIGAMMA
+ϝ m3 03DD 0989 GREEK SMALL LETTER DIGAMMA
+Ϟ K3 03DE 0990 GREEK LETTER KOPPA
+ϟ k3 03DF 0991 GREEK SMALL LETTER KOPPA
+Ϡ P3 03E0 0992 GREEK LETTER SAMPI
+ϡ p3 03E1 0993 GREEK SMALL LETTER SAMPI
+ϴ '% 03F4 1012 GREEK CAPITAL THETA SYMBOL
+ϵ j3 03F5 1013 GREEK LUNATE EPSILON SYMBOL
+Ё IO 0401 1025 CYRILLIC CAPITAL LETTER IO
+Ђ D% 0402 1026 CYRILLIC CAPITAL LETTER DJE
+Ѓ G% 0403 1027 CYRILLIC CAPITAL LETTER GJE
+Є IE 0404 1028 CYRILLIC CAPITAL LETTER UKRAINIAN IE
+Ѕ DS 0405 1029 CYRILLIC CAPITAL LETTER DZE
+І II 0406 1030 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
+Ї YI 0407 1031 CYRILLIC CAPITAL LETTER YI
+Ј J% 0408 1032 CYRILLIC CAPITAL LETTER JE
+Љ LJ 0409 1033 CYRILLIC CAPITAL LETTER LJE
+Њ NJ 040A 1034 CYRILLIC CAPITAL LETTER NJE
+Ћ Ts 040B 1035 CYRILLIC CAPITAL LETTER TSHE
+Ќ KJ 040C 1036 CYRILLIC CAPITAL LETTER KJE
+Ў V% 040E 1038 CYRILLIC CAPITAL LETTER SHORT U
+Џ DZ 040F 1039 CYRILLIC CAPITAL LETTER DZHE
+А A= 0410 1040 CYRILLIC CAPITAL LETTER A
+Б B= 0411 1041 CYRILLIC CAPITAL LETTER BE
+В V= 0412 1042 CYRILLIC CAPITAL LETTER VE
+Г G= 0413 1043 CYRILLIC CAPITAL LETTER GHE
+Д D= 0414 1044 CYRILLIC CAPITAL LETTER DE
+Е E= 0415 1045 CYRILLIC CAPITAL LETTER IE
+Ж Z% 0416 1046 CYRILLIC CAPITAL LETTER ZHE
+З Z= 0417 1047 CYRILLIC CAPITAL LETTER ZE
+И I= 0418 1048 CYRILLIC CAPITAL LETTER I
+Й J= 0419 1049 CYRILLIC CAPITAL LETTER SHORT I
+К K= 041A 1050 CYRILLIC CAPITAL LETTER KA
+Л L= 041B 1051 CYRILLIC CAPITAL LETTER EL
+М M= 041C 1052 CYRILLIC CAPITAL LETTER EM
+Н N= 041D 1053 CYRILLIC CAPITAL LETTER EN
+О O= 041E 1054 CYRILLIC CAPITAL LETTER O
+П P= 041F 1055 CYRILLIC CAPITAL LETTER PE
+Р R= 0420 1056 CYRILLIC CAPITAL LETTER ER
+С S= 0421 1057 CYRILLIC CAPITAL LETTER ES
+Т T= 0422 1058 CYRILLIC CAPITAL LETTER TE
+У U= 0423 1059 CYRILLIC CAPITAL LETTER U
+Ф F= 0424 1060 CYRILLIC CAPITAL LETTER EF
+Х H= 0425 1061 CYRILLIC CAPITAL LETTER HA
+Ц C= 0426 1062 CYRILLIC CAPITAL LETTER TSE
+Ч C% 0427 1063 CYRILLIC CAPITAL LETTER CHE
+Ш S% 0428 1064 CYRILLIC CAPITAL LETTER SHA
+Щ Sc 0429 1065 CYRILLIC CAPITAL LETTER SHCHA
+Ъ =" 042A 1066 CYRILLIC CAPITAL LETTER HARD SIGN
+Ы Y= 042B 1067 CYRILLIC CAPITAL LETTER YERU
+Ь %" 042C 1068 CYRILLIC CAPITAL LETTER SOFT SIGN
+Э JE 042D 1069 CYRILLIC CAPITAL LETTER E
+Ю JU 042E 1070 CYRILLIC CAPITAL LETTER YU
+Я JA 042F 1071 CYRILLIC CAPITAL LETTER YA
+а a= 0430 1072 CYRILLIC SMALL LETTER A
+б b= 0431 1073 CYRILLIC SMALL LETTER BE
+в v= 0432 1074 CYRILLIC SMALL LETTER VE
+г g= 0433 1075 CYRILLIC SMALL LETTER GHE
+д d= 0434 1076 CYRILLIC SMALL LETTER DE
+е e= 0435 1077 CYRILLIC SMALL LETTER IE
+ж z% 0436 1078 CYRILLIC SMALL LETTER ZHE
+з z= 0437 1079 CYRILLIC SMALL LETTER ZE
+и i= 0438 1080 CYRILLIC SMALL LETTER I
+й j= 0439 1081 CYRILLIC SMALL LETTER SHORT I
+к k= 043A 1082 CYRILLIC SMALL LETTER KA
+л l= 043B 1083 CYRILLIC SMALL LETTER EL
+м m= 043C 1084 CYRILLIC SMALL LETTER EM
+н n= 043D 1085 CYRILLIC SMALL LETTER EN
+о o= 043E 1086 CYRILLIC SMALL LETTER O
+п p= 043F 1087 CYRILLIC SMALL LETTER PE
+р r= 0440 1088 CYRILLIC SMALL LETTER ER
+с s= 0441 1089 CYRILLIC SMALL LETTER ES
+т t= 0442 1090 CYRILLIC SMALL LETTER TE
+у u= 0443 1091 CYRILLIC SMALL LETTER U
+ф f= 0444 1092 CYRILLIC SMALL LETTER EF
+х h= 0445 1093 CYRILLIC SMALL LETTER HA
+ц c= 0446 1094 CYRILLIC SMALL LETTER TSE
+ч c% 0447 1095 CYRILLIC SMALL LETTER CHE
+ш s% 0448 1096 CYRILLIC SMALL LETTER SHA
+щ sc 0449 1097 CYRILLIC SMALL LETTER SHCHA
+ъ =' 044A 1098 CYRILLIC SMALL LETTER HARD SIGN
+ы y= 044B 1099 CYRILLIC SMALL LETTER YERU
+ь %' 044C 1100 CYRILLIC SMALL LETTER SOFT SIGN
+э je 044D 1101 CYRILLIC SMALL LETTER E
+ю ju 044E 1102 CYRILLIC SMALL LETTER YU
+я ja 044F 1103 CYRILLIC SMALL LETTER YA
+ё io 0451 1105 CYRILLIC SMALL LETTER IO
+ђ d% 0452 1106 CYRILLIC SMALL LETTER DJE
+ѓ g% 0453 1107 CYRILLIC SMALL LETTER GJE
+є ie 0454 1108 CYRILLIC SMALL LETTER UKRAINIAN IE
+ѕ ds 0455 1109 CYRILLIC SMALL LETTER DZE
+і ii 0456 1110 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
+ї yi 0457 1111 CYRILLIC SMALL LETTER YI
+ј j% 0458 1112 CYRILLIC SMALL LETTER JE
+љ lj 0459 1113 CYRILLIC SMALL LETTER LJE
+њ nj 045A 1114 CYRILLIC SMALL LETTER NJE
+ћ ts 045B 1115 CYRILLIC SMALL LETTER TSHE
+ќ kj 045C 1116 CYRILLIC SMALL LETTER KJE
+ў v% 045E 1118 CYRILLIC SMALL LETTER SHORT U
+џ dz 045F 1119 CYRILLIC SMALL LETTER DZHE
+Ѣ Y3 0462 1122 CYRILLIC CAPITAL LETTER YAT
+ѣ y3 0463 1123 CYRILLIC SMALL LETTER YAT
+Ѫ O3 046A 1130 CYRILLIC CAPITAL LETTER BIG YUS
+ѫ o3 046B 1131 CYRILLIC SMALL LETTER BIG YUS
+Ѳ F3 0472 1138 CYRILLIC CAPITAL LETTER FITA
+ѳ f3 0473 1139 CYRILLIC SMALL LETTER FITA
+Ѵ V3 0474 1140 CYRILLIC CAPITAL LETTER IZHITSA
+ѵ v3 0475 1141 CYRILLIC SMALL LETTER IZHITSA
+Ҁ C3 0480 1152 CYRILLIC CAPITAL LETTER KOPPA
+ҁ c3 0481 1153 CYRILLIC SMALL LETTER KOPPA
+Ґ G3 0490 1168 CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+ґ g3 0491 1169 CYRILLIC SMALL LETTER GHE WITH UPTURN
+א A+ 05D0 1488 HEBREW LETTER ALEF
+ב B+ 05D1 1489 HEBREW LETTER BET
+ג G+ 05D2 1490 HEBREW LETTER GIMEL
+ד D+ 05D3 1491 HEBREW LETTER DALET
+ה H+ 05D4 1492 HEBREW LETTER HE
+ו W+ 05D5 1493 HEBREW LETTER VAV
+ז Z+ 05D6 1494 HEBREW LETTER ZAYIN
+ח X+ 05D7 1495 HEBREW LETTER HET
+ט Tj 05D8 1496 HEBREW LETTER TET
+י J+ 05D9 1497 HEBREW LETTER YOD
+ך K% 05DA 1498 HEBREW LETTER FINAL KAF
+כ K+ 05DB 1499 HEBREW LETTER KAF
+ל L+ 05DC 1500 HEBREW LETTER LAMED
+ם M% 05DD 1501 HEBREW LETTER FINAL MEM
+מ M+ 05DE 1502 HEBREW LETTER MEM
+ן N% 05DF 1503 HEBREW LETTER FINAL NUN `
+נ N+ 05E0 1504 HEBREW LETTER NUN `
+ס S+ 05E1 1505 HEBREW LETTER SAMEKH
+ע E+ 05E2 1506 HEBREW LETTER AYIN
+ף P% 05E3 1507 HEBREW LETTER FINAL PE
+פ P+ 05E4 1508 HEBREW LETTER PE
+ץ Zj 05E5 1509 HEBREW LETTER FINAL TSADI
+צ ZJ 05E6 1510 HEBREW LETTER TSADI
+ק Q+ 05E7 1511 HEBREW LETTER QOF
+ר R+ 05E8 1512 HEBREW LETTER RESH
+ש Sh 05E9 1513 HEBREW LETTER SHIN
+ת T+ 05EA 1514 HEBREW LETTER TAV
+، ,+ 060C 1548 ARABIC COMMA
+؛ ;+ 061B 1563 ARABIC SEMICOLON
+؟ ?+ 061F 1567 ARABIC QUESTION MARK
+ء H' 0621 1569 ARABIC LETTER HAMZA
+آ aM 0622 1570 ARABIC LETTER ALEF WITH MADDA ABOVE
+أ aH 0623 1571 ARABIC LETTER ALEF WITH HAMZA ABOVE
+ؤ wH 0624 1572 ARABIC LETTER WAW WITH HAMZA ABOVE
+إ ah 0625 1573 ARABIC LETTER ALEF WITH HAMZA BELOW
+ئ yH 0626 1574 ARABIC LETTER YEH WITH HAMZA ABOVE
+ا a+ 0627 1575 ARABIC LETTER ALEF
+ب b+ 0628 1576 ARABIC LETTER BEH
+ة tm 0629 1577 ARABIC LETTER TEH MARBUTA
+ت t+ 062A 1578 ARABIC LETTER TEH
+ث tk 062B 1579 ARABIC LETTER THEH
+ج g+ 062C 1580 ARABIC LETTER JEEM
+ح hk 062D 1581 ARABIC LETTER HAH
+خ x+ 062E 1582 ARABIC LETTER KHAH
+د d+ 062F 1583 ARABIC LETTER DAL
+ذ dk 0630 1584 ARABIC LETTER THAL
+ر r+ 0631 1585 ARABIC LETTER REH
+ز z+ 0632 1586 ARABIC LETTER ZAIN
+س s+ 0633 1587 ARABIC LETTER SEEN
+ش sn 0634 1588 ARABIC LETTER SHEEN
+ص c+ 0635 1589 ARABIC LETTER SAD
+ض dd 0636 1590 ARABIC LETTER DAD
+ط tj 0637 1591 ARABIC LETTER TAH
+ظ zH 0638 1592 ARABIC LETTER ZAH
+ع e+ 0639 1593 ARABIC LETTER AIN
+غ i+ 063A 1594 ARABIC LETTER GHAIN
+ـ ++ 0640 1600 ARABIC TATWEEL
+ف f+ 0641 1601 ARABIC LETTER FEH
+ق q+ 0642 1602 ARABIC LETTER QAF
+ك k+ 0643 1603 ARABIC LETTER KAF
+ل l+ 0644 1604 ARABIC LETTER LAM
+م m+ 0645 1605 ARABIC LETTER MEEM
+ن n+ 0646 1606 ARABIC LETTER NOON
+ه h+ 0647 1607 ARABIC LETTER HEH
+و w+ 0648 1608 ARABIC LETTER WAW
+ى j+ 0649 1609 ARABIC LETTER ALEF MAKSURA
+ي y+ 064A 1610 ARABIC LETTER YEH
+ً :+ 064B 1611 ARABIC FATHATAN
+ٌ "+ 064C 1612 ARABIC DAMMATAN
+ٍ =+ 064D 1613 ARABIC KASRATAN
+َ /+ 064E 1614 ARABIC FATHA
+ُ '+ 064F 1615 ARABIC DAMMA
+ِ 1+ 0650 1616 ARABIC KASRA
+ّ 3+ 0651 1617 ARABIC SHADDA
+ْ 0+ 0652 1618 ARABIC SUKUN
+ٰ aS 0670 1648 ARABIC LETTER SUPERSCRIPT ALEF
+پ p+ 067E 1662 ARABIC LETTER PEH
+ڤ v+ 06A4 1700 ARABIC LETTER VEH
+گ gf 06AF 1711 ARABIC LETTER GAF
+۰ 0a 06F0 1776 EXTENDED ARABIC-INDIC DIGIT ZERO
+۱ 1a 06F1 1777 EXTENDED ARABIC-INDIC DIGIT ONE
+۲ 2a 06F2 1778 EXTENDED ARABIC-INDIC DIGIT TWO
+۳ 3a 06F3 1779 EXTENDED ARABIC-INDIC DIGIT THREE
+۴ 4a 06F4 1780 EXTENDED ARABIC-INDIC DIGIT FOUR
+۵ 5a 06F5 1781 EXTENDED ARABIC-INDIC DIGIT FIVE
+۶ 6a 06F6 1782 EXTENDED ARABIC-INDIC DIGIT SIX
+۷ 7a 06F7 1783 EXTENDED ARABIC-INDIC DIGIT SEVEN
+۸ 8a 06F8 1784 EXTENDED ARABIC-INDIC DIGIT EIGHT
+۹ 9a 06F9 1785 EXTENDED ARABIC-INDIC DIGIT NINE
+Ḃ B. 1E02 7682 LATIN CAPITAL LETTER B WITH DOT ABOVE
+ḃ b. 1E03 7683 LATIN SMALL LETTER B WITH DOT ABOVE
+Ḇ B_ 1E06 7686 LATIN CAPITAL LETTER B WITH LINE BELOW
+ḇ b_ 1E07 7687 LATIN SMALL LETTER B WITH LINE BELOW
+Ḋ D. 1E0A 7690 LATIN CAPITAL LETTER D WITH DOT ABOVE
+ḋ d. 1E0B 7691 LATIN SMALL LETTER D WITH DOT ABOVE
+Ḏ D_ 1E0E 7694 LATIN CAPITAL LETTER D WITH LINE BELOW
+ḏ d_ 1E0F 7695 LATIN SMALL LETTER D WITH LINE BELOW
+Ḑ D, 1E10 7696 LATIN CAPITAL LETTER D WITH CEDILLA
+ḑ d, 1E11 7697 LATIN SMALL LETTER D WITH CEDILLA
+Ḟ F. 1E1E 7710 LATIN CAPITAL LETTER F WITH DOT ABOVE
+ḟ f. 1E1F 7711 LATIN SMALL LETTER F WITH DOT ABOVE
+Ḡ G- 1E20 7712 LATIN CAPITAL LETTER G WITH MACRON
+ḡ g- 1E21 7713 LATIN SMALL LETTER G WITH MACRON
+Ḣ H. 1E22 7714 LATIN CAPITAL LETTER H WITH DOT ABOVE
+ḣ h. 1E23 7715 LATIN SMALL LETTER H WITH DOT ABOVE
+Ḧ H: 1E26 7718 LATIN CAPITAL LETTER H WITH DIAERESIS
+ḧ h: 1E27 7719 LATIN SMALL LETTER H WITH DIAERESIS
+Ḩ H, 1E28 7720 LATIN CAPITAL LETTER H WITH CEDILLA
+ḩ h, 1E29 7721 LATIN SMALL LETTER H WITH CEDILLA
+Ḱ K' 1E30 7728 LATIN CAPITAL LETTER K WITH ACUTE
+ḱ k' 1E31 7729 LATIN SMALL LETTER K WITH ACUTE
+Ḵ K_ 1E34 7732 LATIN CAPITAL LETTER K WITH LINE BELOW
+ḵ k_ 1E35 7733 LATIN SMALL LETTER K WITH LINE BELOW
+Ḻ L_ 1E3A 7738 LATIN CAPITAL LETTER L WITH LINE BELOW
+ḻ l_ 1E3B 7739 LATIN SMALL LETTER L WITH LINE BELOW
+Ḿ M' 1E3E 7742 LATIN CAPITAL LETTER M WITH ACUTE
+ḿ m' 1E3F 7743 LATIN SMALL LETTER M WITH ACUTE
+Ṁ M. 1E40 7744 LATIN CAPITAL LETTER M WITH DOT ABOVE
+ṁ m. 1E41 7745 LATIN SMALL LETTER M WITH DOT ABOVE
+Ṅ N. 1E44 7748 LATIN CAPITAL LETTER N WITH DOT ABOVE `
+ṅ n. 1E45 7749 LATIN SMALL LETTER N WITH DOT ABOVE `
+Ṉ N_ 1E48 7752 LATIN CAPITAL LETTER N WITH LINE BELOW `
+ṉ n_ 1E49 7753 LATIN SMALL LETTER N WITH LINE BELOW `
+Ṕ P' 1E54 7764 LATIN CAPITAL LETTER P WITH ACUTE
+ṕ p' 1E55 7765 LATIN SMALL LETTER P WITH ACUTE
+Ṗ P. 1E56 7766 LATIN CAPITAL LETTER P WITH DOT ABOVE
+ṗ p. 1E57 7767 LATIN SMALL LETTER P WITH DOT ABOVE
+Ṙ R. 1E58 7768 LATIN CAPITAL LETTER R WITH DOT ABOVE
+ṙ r. 1E59 7769 LATIN SMALL LETTER R WITH DOT ABOVE
+Ṟ R_ 1E5E 7774 LATIN CAPITAL LETTER R WITH LINE BELOW
+ṟ r_ 1E5F 7775 LATIN SMALL LETTER R WITH LINE BELOW
+Ṡ S. 1E60 7776 LATIN CAPITAL LETTER S WITH DOT ABOVE
+ṡ s. 1E61 7777 LATIN SMALL LETTER S WITH DOT ABOVE
+Ṫ T. 1E6A 7786 LATIN CAPITAL LETTER T WITH DOT ABOVE
+ṫ t. 1E6B 7787 LATIN SMALL LETTER T WITH DOT ABOVE
+Ṯ T_ 1E6E 7790 LATIN CAPITAL LETTER T WITH LINE BELOW
+ṯ t_ 1E6F 7791 LATIN SMALL LETTER T WITH LINE BELOW
+Ṽ V? 1E7C 7804 LATIN CAPITAL LETTER V WITH TILDE
+ṽ v? 1E7D 7805 LATIN SMALL LETTER V WITH TILDE
+Ẁ W! 1E80 7808 LATIN CAPITAL LETTER W WITH GRAVE
+ẁ w! 1E81 7809 LATIN SMALL LETTER W WITH GRAVE
+Ẃ W' 1E82 7810 LATIN CAPITAL LETTER W WITH ACUTE
+ẃ w' 1E83 7811 LATIN SMALL LETTER W WITH ACUTE
+Ẅ W: 1E84 7812 LATIN CAPITAL LETTER W WITH DIAERESIS
+ẅ w: 1E85 7813 LATIN SMALL LETTER W WITH DIAERESIS
+Ẇ W. 1E86 7814 LATIN CAPITAL LETTER W WITH DOT ABOVE
+ẇ w. 1E87 7815 LATIN SMALL LETTER W WITH DOT ABOVE
+Ẋ X. 1E8A 7818 LATIN CAPITAL LETTER X WITH DOT ABOVE
+ẋ x. 1E8B 7819 LATIN SMALL LETTER X WITH DOT ABOVE
+Ẍ X: 1E8C 7820 LATIN CAPITAL LETTER X WITH DIAERESIS
+ẍ x: 1E8D 7821 LATIN SMALL LETTER X WITH DIAERESIS
+Ẏ Y. 1E8E 7822 LATIN CAPITAL LETTER Y WITH DOT ABOVE
+ẏ y. 1E8F 7823 LATIN SMALL LETTER Y WITH DOT ABOVE
+Ẑ Z> 1E90 7824 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
+ẑ z> 1E91 7825 LATIN SMALL LETTER Z WITH CIRCUMFLEX
+Ẕ Z_ 1E94 7828 LATIN CAPITAL LETTER Z WITH LINE BELOW
+ẕ z_ 1E95 7829 LATIN SMALL LETTER Z WITH LINE BELOW
+ẖ h_ 1E96 7830 LATIN SMALL LETTER H WITH LINE BELOW
+ẗ t: 1E97 7831 LATIN SMALL LETTER T WITH DIAERESIS
+ẘ w0 1E98 7832 LATIN SMALL LETTER W WITH RING ABOVE
+ẙ y0 1E99 7833 LATIN SMALL LETTER Y WITH RING ABOVE
+Ả A2 1EA2 7842 LATIN CAPITAL LETTER A WITH HOOK ABOVE
+ả a2 1EA3 7843 LATIN SMALL LETTER A WITH HOOK ABOVE
+Ẻ E2 1EBA 7866 LATIN CAPITAL LETTER E WITH HOOK ABOVE
+ẻ e2 1EBB 7867 LATIN SMALL LETTER E WITH HOOK ABOVE
+Ẽ E? 1EBC 7868 LATIN CAPITAL LETTER E WITH TILDE
+ẽ e? 1EBD 7869 LATIN SMALL LETTER E WITH TILDE
+Ỉ I2 1EC8 7880 LATIN CAPITAL LETTER I WITH HOOK ABOVE
+ỉ i2 1EC9 7881 LATIN SMALL LETTER I WITH HOOK ABOVE
+Ỏ O2 1ECE 7886 LATIN CAPITAL LETTER O WITH HOOK ABOVE
+ỏ o2 1ECF 7887 LATIN SMALL LETTER O WITH HOOK ABOVE
+Ủ U2 1EE6 7910 LATIN CAPITAL LETTER U WITH HOOK ABOVE
+ủ u2 1EE7 7911 LATIN SMALL LETTER U WITH HOOK ABOVE
+Ỳ Y! 1EF2 7922 LATIN CAPITAL LETTER Y WITH GRAVE
+ỳ y! 1EF3 7923 LATIN SMALL LETTER Y WITH GRAVE
+Ỷ Y2 1EF6 7926 LATIN CAPITAL LETTER Y WITH HOOK ABOVE
+ỷ y2 1EF7 7927 LATIN SMALL LETTER Y WITH HOOK ABOVE
+Ỹ Y? 1EF8 7928 LATIN CAPITAL LETTER Y WITH TILDE
+ỹ y? 1EF9 7929 LATIN SMALL LETTER Y WITH TILDE
+ἀ ;' 1F00 7936 GREEK SMALL LETTER ALPHA WITH PSILI
+ἁ ,' 1F01 7937 GREEK SMALL LETTER ALPHA WITH DASIA
+ἂ ;! 1F02 7938 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+ἃ ,! 1F03 7939 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+ἄ ?; 1F04 7940 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+ἅ ?, 1F05 7941 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+ἆ !: 1F06 7942 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ἇ ?: 1F07 7943 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+  1N 2002 8194 EN SPACE
+  1M 2003 8195 EM SPACE
+  3M 2004 8196 THREE-PER-EM SPACE
+  4M 2005 8197 FOUR-PER-EM SPACE
+  6M 2006 8198 SIX-PER-EM SPACE
+  1T 2009 8201 THIN SPACE
+  1H 200A 8202 HAIR SPACE
+‐ -1 2010 8208 HYPHEN
+– -N 2013 8211 EN DASH `
+— -M 2014 8212 EM DASH
+― -3 2015 8213 HORIZONTAL BAR
+‖ !2 2016 8214 DOUBLE VERTICAL LINE
+‗ =2 2017 8215 DOUBLE LOW LINE
+‘ '6 2018 8216 LEFT SINGLE QUOTATION MARK
+’ '9 2019 8217 RIGHT SINGLE QUOTATION MARK
+‚ .9 201A 8218 SINGLE LOW-9 QUOTATION MARK
+‛ 9' 201B 8219 SINGLE HIGH-REVERSED-9 QUOTATION MARK
+“ "6 201C 8220 LEFT DOUBLE QUOTATION MARK
+” "9 201D 8221 RIGHT DOUBLE QUOTATION MARK
+„ :9 201E 8222 DOUBLE LOW-9 QUOTATION MARK
+‟ 9" 201F 8223 DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+† /- 2020 8224 DAGGER
+‡ /= 2021 8225 DOUBLE DAGGER
+• oo 2022 8226 BULLET
+‥ .. 2025 8229 TWO DOT LEADER
+… ,. 2026 8230 HORIZONTAL ELLIPSIS
+‰ %0 2030 8240 PER MILLE SIGN
+′ 1' 2032 8242 PRIME
+″ 2' 2033 8243 DOUBLE PRIME
+‴ 3' 2034 8244 TRIPLE PRIME
+‵ 1" 2035 8245 REVERSED PRIME
+‶ 2" 2036 8246 REVERSED DOUBLE PRIME
+‷ 3" 2037 8247 REVERSED TRIPLE PRIME
+‸ Ca 2038 8248 CARET
+‹ <1 2039 8249 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+› >1 203A 8250 SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+※ :X 203B 8251 REFERENCE MARK
+‾ '- 203E 8254 OVERLINE
+⁄ /f 2044 8260 FRACTION SLASH
+⁰ 0S 2070 8304 SUPERSCRIPT ZERO
+⁴ 4S 2074 8308 SUPERSCRIPT FOUR
+⁵ 5S 2075 8309 SUPERSCRIPT FIVE
+⁶ 6S 2076 8310 SUPERSCRIPT SIX
+⁷ 7S 2077 8311 SUPERSCRIPT SEVEN
+⁸ 8S 2078 8312 SUPERSCRIPT EIGHT
+⁹ 9S 2079 8313 SUPERSCRIPT NINE
+⁺ +S 207A 8314 SUPERSCRIPT PLUS SIGN
+⁻ -S 207B 8315 SUPERSCRIPT MINUS
+⁼ =S 207C 8316 SUPERSCRIPT EQUALS SIGN
+⁽ (S 207D 8317 SUPERSCRIPT LEFT PARENTHESIS
+⁾ )S 207E 8318 SUPERSCRIPT RIGHT PARENTHESIS
+ⁿ nS 207F 8319 SUPERSCRIPT LATIN SMALL LETTER N `
+₀ 0s 2080 8320 SUBSCRIPT ZERO
+₁ 1s 2081 8321 SUBSCRIPT ONE
+₂ 2s 2082 8322 SUBSCRIPT TWO
+₃ 3s 2083 8323 SUBSCRIPT THREE
+₄ 4s 2084 8324 SUBSCRIPT FOUR
+₅ 5s 2085 8325 SUBSCRIPT FIVE
+₆ 6s 2086 8326 SUBSCRIPT SIX
+₇ 7s 2087 8327 SUBSCRIPT SEVEN
+₈ 8s 2088 8328 SUBSCRIPT EIGHT
+₉ 9s 2089 8329 SUBSCRIPT NINE
+₊ +s 208A 8330 SUBSCRIPT PLUS SIGN
+₋ -s 208B 8331 SUBSCRIPT MINUS
+₌ =s 208C 8332 SUBSCRIPT EQUALS SIGN
+₍ (s 208D 8333 SUBSCRIPT LEFT PARENTHESIS
+₎ )s 208E 8334 SUBSCRIPT RIGHT PARENTHESIS
+₤ Li 20A4 8356 LIRA SIGN
+₧ Pt 20A7 8359 PESETA SIGN
+₩ W= 20A9 8361 WON SIGN
+€ Eu 20AC 8364 EURO SIGN
+₽ =R 20BD 8381 ROUBLE SIGN
+₽ =P 20BD 8381 ROUBLE SIGN
+℃ oC 2103 8451 DEGREE CELSIUS
+℅ co 2105 8453 CARE OF
+℉ oF 2109 8457 DEGREE FAHRENHEIT
+№ N0 2116 8470 NUMERO SIGN
+℗ PO 2117 8471 SOUND RECORDING COPYRIGHT
+℞ Rx 211E 8478 PRESCRIPTION TAKE
+℠ SM 2120 8480 SERVICE MARK
+™ TM 2122 8482 TRADE MARK SIGN
+Ω Om 2126 8486 OHM SIGN
+Å AO 212B 8491 ANGSTROM SIGN
+⅓ 13 2153 8531 VULGAR FRACTION ONE THIRD
+⅔ 23 2154 8532 VULGAR FRACTION TWO THIRDS
+⅕ 15 2155 8533 VULGAR FRACTION ONE FIFTH
+⅖ 25 2156 8534 VULGAR FRACTION TWO FIFTHS
+⅗ 35 2157 8535 VULGAR FRACTION THREE FIFTHS
+⅘ 45 2158 8536 VULGAR FRACTION FOUR FIFTHS
+⅙ 16 2159 8537 VULGAR FRACTION ONE SIXTH
+⅚ 56 215A 8538 VULGAR FRACTION FIVE SIXTHS
+⅛ 18 215B 8539 VULGAR FRACTION ONE EIGHTH
+⅜ 38 215C 8540 VULGAR FRACTION THREE EIGHTHS
+⅝ 58 215D 8541 VULGAR FRACTION FIVE EIGHTHS
+⅞ 78 215E 8542 VULGAR FRACTION SEVEN EIGHTHS
+Ⅰ 1R 2160 8544 ROMAN NUMERAL ONE
+Ⅱ 2R 2161 8545 ROMAN NUMERAL TWO
+Ⅲ 3R 2162 8546 ROMAN NUMERAL THREE
+Ⅳ 4R 2163 8547 ROMAN NUMERAL FOUR
+Ⅴ 5R 2164 8548 ROMAN NUMERAL FIVE
+Ⅵ 6R 2165 8549 ROMAN NUMERAL SIX
+Ⅶ 7R 2166 8550 ROMAN NUMERAL SEVEN
+Ⅷ 8R 2167 8551 ROMAN NUMERAL EIGHT
+Ⅸ 9R 2168 8552 ROMAN NUMERAL NINE
+Ⅹ aR 2169 8553 ROMAN NUMERAL TEN
+Ⅺ bR 216A 8554 ROMAN NUMERAL ELEVEN
+Ⅻ cR 216B 8555 ROMAN NUMERAL TWELVE
+ⅰ 1r 2170 8560 SMALL ROMAN NUMERAL ONE
+ⅱ 2r 2171 8561 SMALL ROMAN NUMERAL TWO
+ⅲ 3r 2172 8562 SMALL ROMAN NUMERAL THREE
+ⅳ 4r 2173 8563 SMALL ROMAN NUMERAL FOUR
+ⅴ 5r 2174 8564 SMALL ROMAN NUMERAL FIVE
+ⅵ 6r 2175 8565 SMALL ROMAN NUMERAL SIX
+ⅶ 7r 2176 8566 SMALL ROMAN NUMERAL SEVEN
+ⅷ 8r 2177 8567 SMALL ROMAN NUMERAL EIGHT
+ⅸ 9r 2178 8568 SMALL ROMAN NUMERAL NINE
+ⅹ ar 2179 8569 SMALL ROMAN NUMERAL TEN
+ⅺ br 217A 8570 SMALL ROMAN NUMERAL ELEVEN
+ⅻ cr 217B 8571 SMALL ROMAN NUMERAL TWELVE
+← <- 2190 8592 LEFTWARDS ARROW
+↑ -! 2191 8593 UPWARDS ARROW
+→ -> 2192 8594 RIGHTWARDS ARROW
+↓ -v 2193 8595 DOWNWARDS ARROW
+↔ <> 2194 8596 LEFT RIGHT ARROW
+↕ UD 2195 8597 UP DOWN ARROW
+⇐ <= 21D0 8656 LEFTWARDS DOUBLE ARROW
+⇒ => 21D2 8658 RIGHTWARDS DOUBLE ARROW
+⇔ == 21D4 8660 LEFT RIGHT DOUBLE ARROW
+∀ FA 2200 8704 FOR ALL
+∂ dP 2202 8706 PARTIAL DIFFERENTIAL
+∃ TE 2203 8707 THERE EXISTS
+∅ /0 2205 8709 EMPTY SET
+∆ DE 2206 8710 INCREMENT
+∇ NB 2207 8711 NABLA
+∈ (- 2208 8712 ELEMENT OF
+∋ -) 220B 8715 CONTAINS AS MEMBER
+∏ *P 220F 8719 N-ARY PRODUCT `
+∑ +Z 2211 8721 N-ARY SUMMATION `
+− -2 2212 8722 MINUS SIGN
+∓ -+ 2213 8723 MINUS-OR-PLUS SIGN
+∗ *- 2217 8727 ASTERISK OPERATOR
+∘ Ob 2218 8728 RING OPERATOR
+∙ Sb 2219 8729 BULLET OPERATOR
+√ RT 221A 8730 SQUARE ROOT
+∝ 0( 221D 8733 PROPORTIONAL TO
+∞ 00 221E 8734 INFINITY
+∟ -L 221F 8735 RIGHT ANGLE
+∠ -V 2220 8736 ANGLE
+∥ PP 2225 8741 PARALLEL TO
+∧ AN 2227 8743 LOGICAL AND
+∨ OR 2228 8744 LOGICAL OR
+∩ (U 2229 8745 INTERSECTION
+∪ )U 222A 8746 UNION
+∫ In 222B 8747 INTEGRAL
+∬ DI 222C 8748 DOUBLE INTEGRAL
+∮ Io 222E 8750 CONTOUR INTEGRAL
+∴ .: 2234 8756 THEREFORE
+∵ :. 2235 8757 BECAUSE
+∶ :R 2236 8758 RATIO
+∷ :: 2237 8759 PROPORTION
+∼ ?1 223C 8764 TILDE OPERATOR
+∾ CG 223E 8766 INVERTED LAZY S
+≃ ?- 2243 8771 ASYMPTOTICALLY EQUAL TO
+≅ ?= 2245 8773 APPROXIMATELY EQUAL TO
+≈ ?2 2248 8776 ALMOST EQUAL TO
+≌ =? 224C 8780 ALL EQUAL TO
+≓ HI 2253 8787 IMAGE OF OR APPROXIMATELY EQUAL TO
+≠ != 2260 8800 NOT EQUAL TO
+≡ =3 2261 8801 IDENTICAL TO
+≤ =< 2264 8804 LESS-THAN OR EQUAL TO
+≥ >= 2265 8805 GREATER-THAN OR EQUAL TO
+≪ <* 226A 8810 MUCH LESS-THAN
+≫ *> 226B 8811 MUCH GREATER-THAN
+≮ !< 226E 8814 NOT LESS-THAN
+≯ !> 226F 8815 NOT GREATER-THAN
+⊂ (C 2282 8834 SUBSET OF
+⊃ )C 2283 8835 SUPERSET OF
+⊆ (_ 2286 8838 SUBSET OF OR EQUAL TO
+⊇ )_ 2287 8839 SUPERSET OF OR EQUAL TO
+⊙ 0. 2299 8857 CIRCLED DOT OPERATOR
+⊚ 02 229A 8858 CIRCLED RING OPERATOR
+⊥ -T 22A5 8869 UP TACK
+⋅ .P 22C5 8901 DOT OPERATOR
+⋮ :3 22EE 8942 VERTICAL ELLIPSIS
+⋯ .3 22EF 8943 MIDLINE HORIZONTAL ELLIPSIS
+⌂ Eh 2302 8962 HOUSE
+⌈ <7 2308 8968 LEFT CEILING
+⌉ >7 2309 8969 RIGHT CEILING
+⌊ 7< 230A 8970 LEFT FLOOR
+⌋ 7> 230B 8971 RIGHT FLOOR
+⌐ NI 2310 8976 REVERSED NOT SIGN
+⌒ (A 2312 8978 ARC
+⌕ TR 2315 8981 TELEPHONE RECORDER
+⌠ Iu 2320 8992 TOP HALF INTEGRAL
+⌡ Il 2321 8993 BOTTOM HALF INTEGRAL
+〈 </ 2329 9001 LEFT-POINTING ANGLE BRACKET
+〉 /> 232A 9002 RIGHT-POINTING ANGLE BRACKET
+␣ Vs 2423 9251 OPEN BOX
+⑀ 1h 2440 9280 OCR HOOK
+⑁ 3h 2441 9281 OCR CHAIR
+⑂ 2h 2442 9282 OCR FORK
+⑃ 4h 2443 9283 OCR INVERTED FORK
+⑆ 1j 2446 9286 OCR BRANCH BANK IDENTIFICATION
+⑇ 2j 2447 9287 OCR AMOUNT OF CHECK
+⑈ 3j 2448 9288 OCR DASH
+⑉ 4j 2449 9289 OCR CUSTOMER ACCOUNT NUMBER
+⒈ 1. 2488 9352 DIGIT ONE FULL STOP
+⒉ 2. 2489 9353 DIGIT TWO FULL STOP
+⒊ 3. 248A 9354 DIGIT THREE FULL STOP
+⒋ 4. 248B 9355 DIGIT FOUR FULL STOP
+⒌ 5. 248C 9356 DIGIT FIVE FULL STOP
+⒍ 6. 248D 9357 DIGIT SIX FULL STOP
+⒎ 7. 248E 9358 DIGIT SEVEN FULL STOP
+⒏ 8. 248F 9359 DIGIT EIGHT FULL STOP
+⒐ 9. 2490 9360 DIGIT NINE FULL STOP
+─ hh 2500 9472 BOX DRAWINGS LIGHT HORIZONTAL
+━ HH 2501 9473 BOX DRAWINGS HEAVY HORIZONTAL
+│ vv 2502 9474 BOX DRAWINGS LIGHT VERTICAL
+┃ VV 2503 9475 BOX DRAWINGS HEAVY VERTICAL
+┄ 3- 2504 9476 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL
+┅ 3_ 2505 9477 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL
+┆ 3! 2506 9478 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL
+┇ 3/ 2507 9479 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL
+┈ 4- 2508 9480 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL
+┉ 4_ 2509 9481 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL
+┊ 4! 250A 9482 BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL
+┋ 4/ 250B 9483 BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL
+┌ dr 250C 9484 BOX DRAWINGS LIGHT DOWN AND RIGHT
+┍ dR 250D 9485 BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY
+┎ Dr 250E 9486 BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT
+┏ DR 250F 9487 BOX DRAWINGS HEAVY DOWN AND RIGHT
+┐ dl 2510 9488 BOX DRAWINGS LIGHT DOWN AND LEFT
+┑ dL 2511 9489 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY
+┒ Dl 2512 9490 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT
+┓ LD 2513 9491 BOX DRAWINGS HEAVY DOWN AND LEFT
+└ ur 2514 9492 BOX DRAWINGS LIGHT UP AND RIGHT
+┕ uR 2515 9493 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY
+┖ Ur 2516 9494 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT
+┗ UR 2517 9495 BOX DRAWINGS HEAVY UP AND RIGHT
+┘ ul 2518 9496 BOX DRAWINGS LIGHT UP AND LEFT
+┙ uL 2519 9497 BOX DRAWINGS UP LIGHT AND LEFT HEAVY
+┚ Ul 251A 9498 BOX DRAWINGS UP HEAVY AND LEFT LIGHT
+┛ UL 251B 9499 BOX DRAWINGS HEAVY UP AND LEFT
+├ vr 251C 9500 BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+┝ vR 251D 9501 BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
+┠ Vr 2520 9504 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT
+┣ VR 2523 9507 BOX DRAWINGS HEAVY VERTICAL AND RIGHT
+┤ vl 2524 9508 BOX DRAWINGS LIGHT VERTICAL AND LEFT
+┥ vL 2525 9509 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
+┨ Vl 2528 9512 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT
+┫ VL 252B 9515 BOX DRAWINGS HEAVY VERTICAL AND LEFT
+┬ dh 252C 9516 BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+┯ dH 252F 9519 BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY
+┰ Dh 2530 9520 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT
+┳ DH 2533 9523 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL
+┴ uh 2534 9524 BOX DRAWINGS LIGHT UP AND HORIZONTAL
+┷ uH 2537 9527 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY
+┸ Uh 2538 9528 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT
+┻ UH 253B 9531 BOX DRAWINGS HEAVY UP AND HORIZONTAL
+┼ vh 253C 9532 BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+┿ vH 253F 9535 BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
+╂ Vh 2542 9538 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT
+╋ VH 254B 9547 BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL
+╱ FD 2571 9585 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
+╲ BD 2572 9586 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT
+▀ TB 2580 9600 UPPER HALF BLOCK
+▄ LB 2584 9604 LOWER HALF BLOCK
+█ FB 2588 9608 FULL BLOCK
+▌ lB 258C 9612 LEFT HALF BLOCK
+▐ RB 2590 9616 RIGHT HALF BLOCK
+░ .S 2591 9617 LIGHT SHADE
+▒ :S 2592 9618 MEDIUM SHADE
+▓ ?S 2593 9619 DARK SHADE
+■ fS 25A0 9632 BLACK SQUARE
+□ OS 25A1 9633 WHITE SQUARE
+▢ RO 25A2 9634 WHITE SQUARE WITH ROUNDED CORNERS
+▣ Rr 25A3 9635 WHITE SQUARE CONTAINING BLACK SMALL SQUARE
+▤ RF 25A4 9636 SQUARE WITH HORIZONTAL FILL
+▥ RY 25A5 9637 SQUARE WITH VERTICAL FILL
+▦ RH 25A6 9638 SQUARE WITH ORTHOGONAL CROSSHATCH FILL
+▧ RZ 25A7 9639 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL
+▨ RK 25A8 9640 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL
+▩ RX 25A9 9641 SQUARE WITH DIAGONAL CROSSHATCH FILL
+▪ sB 25AA 9642 BLACK SMALL SQUARE
+▬ SR 25AC 9644 BLACK RECTANGLE
+▭ Or 25AD 9645 WHITE RECTANGLE
+▲ UT 25B2 9650 BLACK UP-POINTING TRIANGLE
+△ uT 25B3 9651 WHITE UP-POINTING TRIANGLE
+▶ PR 25B6 9654 BLACK RIGHT-POINTING TRIANGLE
+▷ Tr 25B7 9655 WHITE RIGHT-POINTING TRIANGLE
+▼ Dt 25BC 9660 BLACK DOWN-POINTING TRIANGLE
+▽ dT 25BD 9661 WHITE DOWN-POINTING TRIANGLE
+◀ PL 25C0 9664 BLACK LEFT-POINTING TRIANGLE
+◁ Tl 25C1 9665 WHITE LEFT-POINTING TRIANGLE
+◆ Db 25C6 9670 BLACK DIAMOND
+◇ Dw 25C7 9671 WHITE DIAMOND
+◊ LZ 25CA 9674 LOZENGE
+○ 0m 25CB 9675 WHITE CIRCLE
+◎ 0o 25CE 9678 BULLSEYE
+● 0M 25CF 9679 BLACK CIRCLE
+◐ 0L 25D0 9680 CIRCLE WITH LEFT HALF BLACK
+◑ 0R 25D1 9681 CIRCLE WITH RIGHT HALF BLACK
+◘ Sn 25D8 9688 INVERSE BULLET
+◙ Ic 25D9 9689 INVERSE WHITE CIRCLE
+◢ Fd 25E2 9698 BLACK LOWER RIGHT TRIANGLE
+◣ Bd 25E3 9699 BLACK LOWER LEFT TRIANGLE
+★ *2 2605 9733 BLACK STAR
+☆ *1 2606 9734 WHITE STAR
+☜ <H 261C 9756 WHITE LEFT POINTING INDEX
+☞ >H 261E 9758 WHITE RIGHT POINTING INDEX
+☺ 0u 263A 9786 WHITE SMILING FACE
+☻ 0U 263B 9787 BLACK SMILING FACE
+☼ SU 263C 9788 WHITE SUN WITH RAYS
+♀ Fm 2640 9792 FEMALE SIGN
+♂ Ml 2642 9794 MALE SIGN
+♠ cS 2660 9824 BLACK SPADE SUIT
+♡ cH 2661 9825 WHITE HEART SUIT
+♢ cD 2662 9826 WHITE DIAMOND SUIT
+♣ cC 2663 9827 BLACK CLUB SUIT
+♩ Md 2669 9833 QUARTER NOTE `
+♪ M8 266A 9834 EIGHTH NOTE `
+♫ M2 266B 9835 BEAMED EIGHTH NOTES
+♭ Mb 266D 9837 MUSIC FLAT SIGN
+♮ Mx 266E 9838 MUSIC NATURAL SIGN
+♯ MX 266F 9839 MUSIC SHARP SIGN
+✓ OK 2713 10003 CHECK MARK
+✗ XX 2717 10007 BALLOT X
+✠ -X 2720 10016 MALTESE CROSS
+  IS 3000 12288 IDEOGRAPHIC SPACE
+、 ,_ 3001 12289 IDEOGRAPHIC COMMA
+。 ._ 3002 12290 IDEOGRAPHIC FULL STOP
+〃 +" 3003 12291 DITTO MARK
+〄 +_ 3004 12292 JAPANESE INDUSTRIAL STANDARD SYMBOL
+々 *_ 3005 12293 IDEOGRAPHIC ITERATION MARK
+〆 ;_ 3006 12294 IDEOGRAPHIC CLOSING MARK
+〇 0_ 3007 12295 IDEOGRAPHIC NUMBER ZERO
+《 <+ 300A 12298 LEFT DOUBLE ANGLE BRACKET
+》 >+ 300B 12299 RIGHT DOUBLE ANGLE BRACKET
+「 <' 300C 12300 LEFT CORNER BRACKET
+」 >' 300D 12301 RIGHT CORNER BRACKET
+『 <" 300E 12302 LEFT WHITE CORNER BRACKET
+』 >" 300F 12303 RIGHT WHITE CORNER BRACKET
+【 (" 3010 12304 LEFT BLACK LENTICULAR BRACKET
+】 )" 3011 12305 RIGHT BLACK LENTICULAR BRACKET
+〒 =T 3012 12306 POSTAL MARK
+〓 =_ 3013 12307 GETA MARK
+〔 (' 3014 12308 LEFT TORTOISE SHELL BRACKET
+〕 )' 3015 12309 RIGHT TORTOISE SHELL BRACKET
+〖 (I 3016 12310 LEFT WHITE LENTICULAR BRACKET
+〗 )I 3017 12311 RIGHT WHITE LENTICULAR BRACKET
+〜 -? 301C 12316 WAVE DASH
+ぁ A5 3041 12353 HIRAGANA LETTER SMALL A
+あ a5 3042 12354 HIRAGANA LETTER A
+ぃ I5 3043 12355 HIRAGANA LETTER SMALL I
+い i5 3044 12356 HIRAGANA LETTER I
+ぅ U5 3045 12357 HIRAGANA LETTER SMALL U
+う u5 3046 12358 HIRAGANA LETTER U
+ぇ E5 3047 12359 HIRAGANA LETTER SMALL E
+え e5 3048 12360 HIRAGANA LETTER E
+ぉ O5 3049 12361 HIRAGANA LETTER SMALL O
+お o5 304A 12362 HIRAGANA LETTER O
+か ka 304B 12363 HIRAGANA LETTER KA
+が ga 304C 12364 HIRAGANA LETTER GA
+き ki 304D 12365 HIRAGANA LETTER KI
+ぎ gi 304E 12366 HIRAGANA LETTER GI
+く ku 304F 12367 HIRAGANA LETTER KU
+ぐ gu 3050 12368 HIRAGANA LETTER GU
+け ke 3051 12369 HIRAGANA LETTER KE
+げ ge 3052 12370 HIRAGANA LETTER GE
+こ ko 3053 12371 HIRAGANA LETTER KO
+ご go 3054 12372 HIRAGANA LETTER GO
+さ sa 3055 12373 HIRAGANA LETTER SA
+ざ za 3056 12374 HIRAGANA LETTER ZA
+し si 3057 12375 HIRAGANA LETTER SI
+じ zi 3058 12376 HIRAGANA LETTER ZI
+す su 3059 12377 HIRAGANA LETTER SU
+ず zu 305A 12378 HIRAGANA LETTER ZU
+せ se 305B 12379 HIRAGANA LETTER SE
+ぜ ze 305C 12380 HIRAGANA LETTER ZE
+そ so 305D 12381 HIRAGANA LETTER SO
+ぞ zo 305E 12382 HIRAGANA LETTER ZO
+た ta 305F 12383 HIRAGANA LETTER TA
+だ da 3060 12384 HIRAGANA LETTER DA
+ち ti 3061 12385 HIRAGANA LETTER TI
+ぢ di 3062 12386 HIRAGANA LETTER DI
+っ tU 3063 12387 HIRAGANA LETTER SMALL TU
+つ tu 3064 12388 HIRAGANA LETTER TU
+づ du 3065 12389 HIRAGANA LETTER DU
+て te 3066 12390 HIRAGANA LETTER TE
+で de 3067 12391 HIRAGANA LETTER DE
+と to 3068 12392 HIRAGANA LETTER TO
+ど do 3069 12393 HIRAGANA LETTER DO
+な na 306A 12394 HIRAGANA LETTER NA
+に ni 306B 12395 HIRAGANA LETTER NI
+ぬ nu 306C 12396 HIRAGANA LETTER NU
+ね ne 306D 12397 HIRAGANA LETTER NE
+の no 306E 12398 HIRAGANA LETTER NO
+は ha 306F 12399 HIRAGANA LETTER HA
+ば ba 3070 12400 HIRAGANA LETTER BA
+ぱ pa 3071 12401 HIRAGANA LETTER PA
+ひ hi 3072 12402 HIRAGANA LETTER HI
+び bi 3073 12403 HIRAGANA LETTER BI
+ぴ pi 3074 12404 HIRAGANA LETTER PI
+ふ hu 3075 12405 HIRAGANA LETTER HU
+ぶ bu 3076 12406 HIRAGANA LETTER BU
+ぷ pu 3077 12407 HIRAGANA LETTER PU
+へ he 3078 12408 HIRAGANA LETTER HE
+べ be 3079 12409 HIRAGANA LETTER BE
+ぺ pe 307A 12410 HIRAGANA LETTER PE
+ほ ho 307B 12411 HIRAGANA LETTER HO
+ぼ bo 307C 12412 HIRAGANA LETTER BO
+ぽ po 307D 12413 HIRAGANA LETTER PO
+ま ma 307E 12414 HIRAGANA LETTER MA
+み mi 307F 12415 HIRAGANA LETTER MI
+む mu 3080 12416 HIRAGANA LETTER MU
+め me 3081 12417 HIRAGANA LETTER ME
+も mo 3082 12418 HIRAGANA LETTER MO
+ゃ yA 3083 12419 HIRAGANA LETTER SMALL YA
+や ya 3084 12420 HIRAGANA LETTER YA
+ゅ yU 3085 12421 HIRAGANA LETTER SMALL YU
+ゆ yu 3086 12422 HIRAGANA LETTER YU
+ょ yO 3087 12423 HIRAGANA LETTER SMALL YO
+よ yo 3088 12424 HIRAGANA LETTER YO
+ら ra 3089 12425 HIRAGANA LETTER RA
+り ri 308A 12426 HIRAGANA LETTER RI
+る ru 308B 12427 HIRAGANA LETTER RU
+れ re 308C 12428 HIRAGANA LETTER RE
+ろ ro 308D 12429 HIRAGANA LETTER RO
+ゎ wA 308E 12430 HIRAGANA LETTER SMALL WA
+わ wa 308F 12431 HIRAGANA LETTER WA
+ゐ wi 3090 12432 HIRAGANA LETTER WI
+ゑ we 3091 12433 HIRAGANA LETTER WE
+を wo 3092 12434 HIRAGANA LETTER WO
+ん n5 3093 12435 HIRAGANA LETTER N `
+ゔ vu 3094 12436 HIRAGANA LETTER VU
+゛ "5 309B 12443 KATAKANA-HIRAGANA VOICED SOUND MARK
+゜ 05 309C 12444 KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ゝ *5 309D 12445 HIRAGANA ITERATION MARK
+ゞ +5 309E 12446 HIRAGANA VOICED ITERATION MARK
+ァ a6 30A1 12449 KATAKANA LETTER SMALL A
+ア A6 30A2 12450 KATAKANA LETTER A
+ィ i6 30A3 12451 KATAKANA LETTER SMALL I
+イ I6 30A4 12452 KATAKANA LETTER I
+ゥ u6 30A5 12453 KATAKANA LETTER SMALL U
+ウ U6 30A6 12454 KATAKANA LETTER U
+ェ e6 30A7 12455 KATAKANA LETTER SMALL E
+エ E6 30A8 12456 KATAKANA LETTER E
+ォ o6 30A9 12457 KATAKANA LETTER SMALL O
+オ O6 30AA 12458 KATAKANA LETTER O
+カ Ka 30AB 12459 KATAKANA LETTER KA
+ガ Ga 30AC 12460 KATAKANA LETTER GA
+キ Ki 30AD 12461 KATAKANA LETTER KI
+ギ Gi 30AE 12462 KATAKANA LETTER GI
+ク Ku 30AF 12463 KATAKANA LETTER KU
+グ Gu 30B0 12464 KATAKANA LETTER GU
+ケ Ke 30B1 12465 KATAKANA LETTER KE
+ゲ Ge 30B2 12466 KATAKANA LETTER GE
+コ Ko 30B3 12467 KATAKANA LETTER KO
+ゴ Go 30B4 12468 KATAKANA LETTER GO
+サ Sa 30B5 12469 KATAKANA LETTER SA
+ザ Za 30B6 12470 KATAKANA LETTER ZA
+シ Si 30B7 12471 KATAKANA LETTER SI
+ジ Zi 30B8 12472 KATAKANA LETTER ZI
+ス Su 30B9 12473 KATAKANA LETTER SU
+ズ Zu 30BA 12474 KATAKANA LETTER ZU
+セ Se 30BB 12475 KATAKANA LETTER SE
+ゼ Ze 30BC 12476 KATAKANA LETTER ZE
+ソ So 30BD 12477 KATAKANA LETTER SO
+ゾ Zo 30BE 12478 KATAKANA LETTER ZO
+タ Ta 30BF 12479 KATAKANA LETTER TA
+ダ Da 30C0 12480 KATAKANA LETTER DA
+チ Ti 30C1 12481 KATAKANA LETTER TI
+ヂ Di 30C2 12482 KATAKANA LETTER DI
+ッ TU 30C3 12483 KATAKANA LETTER SMALL TU
+ツ Tu 30C4 12484 KATAKANA LETTER TU
+ヅ Du 30C5 12485 KATAKANA LETTER DU
+テ Te 30C6 12486 KATAKANA LETTER TE
+デ De 30C7 12487 KATAKANA LETTER DE
+ト To 30C8 12488 KATAKANA LETTER TO
+ド Do 30C9 12489 KATAKANA LETTER DO
+ナ Na 30CA 12490 KATAKANA LETTER NA
+ニ Ni 30CB 12491 KATAKANA LETTER NI
+ヌ Nu 30CC 12492 KATAKANA LETTER NU
+ネ Ne 30CD 12493 KATAKANA LETTER NE
+ノ No 30CE 12494 KATAKANA LETTER NO
+ハ Ha 30CF 12495 KATAKANA LETTER HA
+バ Ba 30D0 12496 KATAKANA LETTER BA
+パ Pa 30D1 12497 KATAKANA LETTER PA
+ヒ Hi 30D2 12498 KATAKANA LETTER HI
+ビ Bi 30D3 12499 KATAKANA LETTER BI
+ピ Pi 30D4 12500 KATAKANA LETTER PI
+フ Hu 30D5 12501 KATAKANA LETTER HU
+ブ Bu 30D6 12502 KATAKANA LETTER BU
+プ Pu 30D7 12503 KATAKANA LETTER PU
+ヘ He 30D8 12504 KATAKANA LETTER HE
+ベ Be 30D9 12505 KATAKANA LETTER BE
+ペ Pe 30DA 12506 KATAKANA LETTER PE
+ホ Ho 30DB 12507 KATAKANA LETTER HO
+ボ Bo 30DC 12508 KATAKANA LETTER BO
+ポ Po 30DD 12509 KATAKANA LETTER PO
+マ Ma 30DE 12510 KATAKANA LETTER MA
+ミ Mi 30DF 12511 KATAKANA LETTER MI
+ム Mu 30E0 12512 KATAKANA LETTER MU
+メ Me 30E1 12513 KATAKANA LETTER ME
+モ Mo 30E2 12514 KATAKANA LETTER MO
+ャ YA 30E3 12515 KATAKANA LETTER SMALL YA
+ヤ Ya 30E4 12516 KATAKANA LETTER YA
+ュ YU 30E5 12517 KATAKANA LETTER SMALL YU
+ユ Yu 30E6 12518 KATAKANA LETTER YU
+ョ YO 30E7 12519 KATAKANA LETTER SMALL YO
+ヨ Yo 30E8 12520 KATAKANA LETTER YO
+ラ Ra 30E9 12521 KATAKANA LETTER RA
+リ Ri 30EA 12522 KATAKANA LETTER RI
+ル Ru 30EB 12523 KATAKANA LETTER RU
+レ Re 30EC 12524 KATAKANA LETTER RE
+ロ Ro 30ED 12525 KATAKANA LETTER RO
+ヮ WA 30EE 12526 KATAKANA LETTER SMALL WA
+ワ Wa 30EF 12527 KATAKANA LETTER WA
+ヰ Wi 30F0 12528 KATAKANA LETTER WI
+ヱ We 30F1 12529 KATAKANA LETTER WE
+ヲ Wo 30F2 12530 KATAKANA LETTER WO
+ン N6 30F3 12531 KATAKANA LETTER N `
+ヴ Vu 30F4 12532 KATAKANA LETTER VU
+ヵ KA 30F5 12533 KATAKANA LETTER SMALL KA
+ヶ KE 30F6 12534 KATAKANA LETTER SMALL KE
+ヷ Va 30F7 12535 KATAKANA LETTER VA
+ヸ Vi 30F8 12536 KATAKANA LETTER VI
+ヹ Ve 30F9 12537 KATAKANA LETTER VE
+ヺ Vo 30FA 12538 KATAKANA LETTER VO
+・ .6 30FB 12539 KATAKANA MIDDLE DOT
+ー -6 30FC 12540 KATAKANA-HIRAGANA PROLONGED SOUND MARK
+ヽ *6 30FD 12541 KATAKANA ITERATION MARK
+ヾ +6 30FE 12542 KATAKANA VOICED ITERATION MARK
+ㄅ b4 3105 12549 BOPOMOFO LETTER B
+ㄆ p4 3106 12550 BOPOMOFO LETTER P
+ㄇ m4 3107 12551 BOPOMOFO LETTER M
+ㄈ f4 3108 12552 BOPOMOFO LETTER F
+ㄉ d4 3109 12553 BOPOMOFO LETTER D
+ㄊ t4 310A 12554 BOPOMOFO LETTER T
+ㄋ n4 310B 12555 BOPOMOFO LETTER N `
+ㄌ l4 310C 12556 BOPOMOFO LETTER L
+ㄍ g4 310D 12557 BOPOMOFO LETTER G
+ㄎ k4 310E 12558 BOPOMOFO LETTER K
+ㄏ h4 310F 12559 BOPOMOFO LETTER H
+ㄐ j4 3110 12560 BOPOMOFO LETTER J
+ㄑ q4 3111 12561 BOPOMOFO LETTER Q
+ㄒ x4 3112 12562 BOPOMOFO LETTER X
+ㄓ zh 3113 12563 BOPOMOFO LETTER ZH
+ㄔ ch 3114 12564 BOPOMOFO LETTER CH
+ㄕ sh 3115 12565 BOPOMOFO LETTER SH
+ㄖ r4 3116 12566 BOPOMOFO LETTER R
+ㄗ z4 3117 12567 BOPOMOFO LETTER Z
+ㄘ c4 3118 12568 BOPOMOFO LETTER C
+ㄙ s4 3119 12569 BOPOMOFO LETTER S
+ㄚ a4 311A 12570 BOPOMOFO LETTER A
+ㄛ o4 311B 12571 BOPOMOFO LETTER O
+ㄜ e4 311C 12572 BOPOMOFO LETTER E
+ㄞ ai 311E 12574 BOPOMOFO LETTER AI
+ㄟ ei 311F 12575 BOPOMOFO LETTER EI
+ㄠ au 3120 12576 BOPOMOFO LETTER AU
+ㄡ ou 3121 12577 BOPOMOFO LETTER OU
+ㄢ an 3122 12578 BOPOMOFO LETTER AN
+ㄣ en 3123 12579 BOPOMOFO LETTER EN
+ㄤ aN 3124 12580 BOPOMOFO LETTER ANG
+ㄥ eN 3125 12581 BOPOMOFO LETTER ENG
+ㄦ er 3126 12582 BOPOMOFO LETTER ER
+ㄧ i4 3127 12583 BOPOMOFO LETTER I
+ㄨ u4 3128 12584 BOPOMOFO LETTER U
+ㄩ iu 3129 12585 BOPOMOFO LETTER IU
+ㄪ v4 312A 12586 BOPOMOFO LETTER V
+ㄫ nG 312B 12587 BOPOMOFO LETTER NG
+ㄬ gn 312C 12588 BOPOMOFO LETTER GN
+㈠ 1c 3220 12832 PARENTHESIZED IDEOGRAPH ONE
+㈡ 2c 3221 12833 PARENTHESIZED IDEOGRAPH TWO
+㈢ 3c 3222 12834 PARENTHESIZED IDEOGRAPH THREE
+㈣ 4c 3223 12835 PARENTHESIZED IDEOGRAPH FOUR
+㈤ 5c 3224 12836 PARENTHESIZED IDEOGRAPH FIVE
+㈥ 6c 3225 12837 PARENTHESIZED IDEOGRAPH SIX
+㈦ 7c 3226 12838 PARENTHESIZED IDEOGRAPH SEVEN
+㈧ 8c 3227 12839 PARENTHESIZED IDEOGRAPH EIGHT
+㈨ 9c 3228 12840 PARENTHESIZED IDEOGRAPH NINE
+ff ff FB00 64256 LATIN SMALL LIGATURE FF
+fi fi FB01 64257 LATIN SMALL LIGATURE FI
+fl fl FB02 64258 LATIN SMALL LIGATURE FL
+ſt ft FB05 64261 LATIN SMALL LIGATURE LONG S T
+st st FB06 64262 LATIN SMALL LIGATURE ST
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/doctags.c b/runtime/doc/doctags.c
new file mode 100644
index 0000000..8822dcb
--- /dev/null
+++ b/runtime/doc/doctags.c
@@ -0,0 +1,94 @@
+/* vim:set ts=4 sw=4:
+ *
+ * This program makes a tags file for help text.
+ *
+ * Usage: doctags *.txt ... >tags
+ *
+ * A tag in this context is an identifier between stars, e.g. *c_files*
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#define LINELEN 200
+
+ int
+main(int argc, char **argv)
+{
+ char line[LINELEN];
+ char *p1, *p2;
+ char *p;
+ FILE *fd;
+ int len;
+ int in_example;
+
+ if (argc <= 1)
+ {
+ fprintf(stderr, "Usage: doctags docfile ... >tags\n");
+ exit(1);
+ }
+ printf("help-tags\ttags\t1\n");
+ while (--argc > 0)
+ {
+ ++argv;
+ fd = fopen(argv[0], "r");
+ if (fd == NULL)
+ {
+ fprintf(stderr, "Unable to open %s for reading\n", argv[0]);
+ continue;
+ }
+ in_example = 0;
+ while (fgets(line, LINELEN, fd) != NULL)
+ {
+ if (in_example)
+ {
+ // skip over example; non-blank in first column ends example
+ if (strchr(" \t\n\r", line[0]) != NULL)
+ continue;
+ in_example = 0;
+ }
+ p1 = strchr(line, '*'); // find first '*'
+ while (p1 != NULL)
+ {
+ p2 = strchr(p1 + 1, '*'); // find second '*'
+ if (p2 != NULL && p2 > p1 + 1) // skip "*" and "**"
+ {
+ for (p = p1 + 1; p < p2; ++p)
+ if (*p == ' ' || *p == '\t' || *p == '|')
+ break;
+ // Only accept a *tag* when it consists of valid
+ // characters, there is white space before it and is
+ // followed by a white character or end-of-line.
+ if (p == p2
+ && (p1 == line || p1[-1] == ' ' || p1[-1] == '\t')
+ && (strchr(" \t\n\r", p[1]) != NULL
+ || p[1] == '\0'))
+ {
+ *p2 = '\0';
+ ++p1;
+ printf("%s\t%s\t/*", p1, argv[0]);
+ while (*p1)
+ {
+ // insert backslash before '\\' and '/'
+ if (*p1 == '\\' || *p1 == '/')
+ putchar('\\');
+ putchar(*p1);
+ ++p1;
+ }
+ printf("*\n");
+ p2 = strchr(p2 + 1, '*'); // find next '*'
+ }
+ }
+ p1 = p2;
+ }
+ len = strlen(line);
+ if ((len == 2 && strcmp(&line[len - 2], ">\n") == 0)
+ || (len >= 3 && strcmp(&line[len - 3], " >\n") == 0))
+ in_example = 1;
+ }
+ fclose(fd);
+ }
+ return 0;
+}
diff --git a/runtime/doc/doctags.vim b/runtime/doc/doctags.vim
new file mode 100644
index 0000000..833dbef
--- /dev/null
+++ b/runtime/doc/doctags.vim
@@ -0,0 +1,13 @@
+" This script makes a tags file for help text.
+"
+" Usage: vim -eX -u doctags.vim
+
+try
+ helptags ++t .
+ echo 'help tags updated'
+catch
+ echo v:exception
+ echo 'help tags failed update'
+endtry
+echo ''
+qa!
diff --git a/runtime/doc/editing.txt b/runtime/doc/editing.txt
new file mode 100644
index 0000000..c3e1d0d
--- /dev/null
+++ b/runtime/doc/editing.txt
@@ -0,0 +1,1839 @@
+*editing.txt* For Vim version 9.0. Last change: 2022 Nov 02
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+
+==============================================================================
+1. Introduction *edit-intro*
+
+Editing a file with Vim means:
+
+1. reading the file into a buffer
+2. changing the buffer with editor commands
+3. writing the buffer into a file
+
+ *current-file*
+As long as you don't write the buffer, the original file remains unchanged.
+If you start editing a file (read a file into the buffer), the file name is
+remembered as the "current file name". This is also known as the name of the
+current buffer. It can be used with "%" on the command line |:_%|.
+
+ *alternate-file*
+If there already was a current file name, then that one becomes the alternate
+file name. It can be used with "#" on the command line |:_#| and you can use
+the |CTRL-^| command to toggle between the current and the alternate file.
+However, the alternate file name is not changed when |:keepalt| is used.
+An alternate file name is remembered for each window.
+
+ *:keepalt* *:keepa*
+:keepalt {cmd} Execute {cmd} while keeping the current alternate file
+ name. Note that commands invoked indirectly (e.g.,
+ with a function) may still set the alternate file
+ name.
+
+All file names are remembered in the buffer list. When you enter a file name,
+for editing (e.g., with ":e filename") or writing (e.g., with ":w filename"),
+the file name is added to the list. You can use the buffer list to remember
+which files you edited and to quickly switch from one file to another (e.g.,
+to copy text) with the |CTRL-^| command. First type the number of the file
+and then hit CTRL-^.
+
+
+CTRL-G or *CTRL-G* *:f* *:fi* *:file*
+:f[ile] Prints the current file name (as typed, unless ":cd"
+ was used), the cursor position (unless the 'ruler'
+ option is set), and the file status (readonly,
+ modified, read errors, new file). See the 'shortmess'
+ option about how to make this message shorter.
+
+:f[ile]! like |:file|, but don't truncate the name even when
+ 'shortmess' indicates this.
+
+{count}CTRL-G Like CTRL-G, but prints the current file name with
+ full path. If the count is higher than 1 the current
+ buffer number is also given.
+
+ *g_CTRL-G* *word-count* *byte-count*
+g CTRL-G Prints the current position of the cursor in five
+ ways: Column, Line, Word, Character and Byte. If the
+ number of Characters and Bytes is the same then the
+ Character position is omitted.
+
+ If there are characters in the line that take more
+ than one position on the screen (<Tab> or special
+ character), or characters using more than one byte per
+ column (characters above 0x7F when 'encoding' is
+ utf-8), both the byte column and the screen column are
+ shown, separated by a dash.
+
+ Also see the 'ruler' option and the |wordcount()|
+ function.
+
+ *v_g_CTRL-G*
+{Visual}g CTRL-G Similar to "g CTRL-G", but Word, Character, Line, and
+ Byte counts for the visually selected region are
+ displayed.
+ In Blockwise mode, Column count is also shown. (For
+ {Visual} see |Visual-mode|.)
+
+ *:file_f*
+:f[ile][!] {name} Sets the current file name to {name}. The optional !
+ avoids truncating the message, as with |:file|.
+ If the buffer did have a name, that name becomes the
+ |alternate-file| name. An unlisted buffer is created
+ to hold the old name.
+ *:0file*
+:0f[ile][!] Remove the name of the current buffer. The optional !
+ avoids truncating the message, as with |:file|.
+
+:buffers
+:files
+:ls List all the currently known file names. See
+ |windows.txt| |:files| |:buffers| |:ls|.
+
+Vim will remember the full path name of a file name that you enter. In most
+cases when the file name is displayed only the name you typed is shown, but
+the full path name is being used if you used the ":cd" command |:cd|.
+
+ *home-replace*
+If the environment variable $HOME is set, and the file name starts with that
+string, it is often displayed with HOME replaced with "~". This was done to
+keep file names short. When reading or writing files the full name is still
+used, the "~" is only used when displaying file names. When replacing the
+file name would result in just "~", "~/" is used instead (to avoid confusion
+between options set to $HOME with 'backupext' set to "~").
+
+When writing the buffer, the default is to use the current file name. Thus
+when you give the "ZZ" or ":wq" command, the original file will be
+overwritten. If you do not want this, the buffer can be written into another
+file by giving a file name argument to the ":write" command. For example: >
+
+ vim testfile
+ [change the buffer with editor commands]
+ :w newfile
+ :q
+
+This will create a file "newfile", that is a modified copy of "testfile".
+The file "testfile" will remain unchanged. Anyway, if the 'backup' option is
+set, Vim renames or copies the original file before it will be overwritten.
+You can use this file if you discover that you need the original file. See
+also the 'patchmode' option. The name of the backup file is normally the same
+as the original file with 'backupext' appended. The default "~" is a bit
+strange to avoid accidentally overwriting existing files. If you prefer ".bak"
+change the 'backupext' option. Extra dots are replaced with '_' on MS-Windows
+machines, when Vim has detected that an MS-DOS-like filesystem is being used
+(e.g., messydos or crossdos) or when the 'shortname' option is on. The
+backup file can be placed in another directory by setting 'backupdir'.
+
+ *auto-shortname*
+Technical: On the Amiga you can use 30 characters for a file name. But on an
+ MS-DOS-compatible filesystem only 8 plus 3 characters are
+ available. Vim tries to detect the type of filesystem when it is
+ creating the .swp file. If an MS-DOS-like filesystem is suspected,
+ a flag is set that has the same effect as setting the 'shortname'
+ option. This flag will be reset as soon as you start editing a
+ new file. The flag will be used when making the file name for the
+ ".swp" and ".~" files for the current file. But when you are
+ editing a file in a normal filesystem and write to an MS-DOS-like
+ filesystem the flag will not have been set. In that case the
+ creation of the ".~" file may fail and you will get an error
+ message. Use the 'shortname' option in this case.
+
+When you started editing without giving a file name, "No File" is displayed in
+messages. If the ":write" command is used with a file name argument, the file
+name for the current file is set to that file name. This only happens when
+the 'F' flag is included in 'cpoptions' (by default it is included) |cpo-F|.
+This is useful when entering text in an empty buffer and then writing it to a
+file. If 'cpoptions' contains the 'f' flag (by default it is NOT included)
+|cpo-f| the file name is set for the ":read file" command. This is useful
+when starting Vim without an argument and then doing ":read file" to start
+editing a file.
+When the file name was set and 'filetype' is empty the filetype detection
+autocommands will be triggered.
+ *not-edited*
+Because the file name was set without really starting to edit that file, you
+are protected from overwriting that file. This is done by setting the
+"notedited" flag. You can see if this flag is set with the CTRL-G or ":file"
+command. It will include "[Not edited]" when the "notedited" flag is set.
+When writing the buffer to the current file name (with ":w!"), the "notedited"
+flag is reset.
+
+ *abandon*
+Vim remembers whether you have changed the buffer. You are protected from
+losing the changes you made. If you try to quit without writing, or want to
+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, 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
+that does not work for all commands.
+
+If you want to keep the changed buffer without saving it, switch on the
+'hidden' option. See |hidden-buffer|. Some commands work like this even when
+'hidden' is not set, check the help for the command.
+
+==============================================================================
+2. Editing a file *edit-a-file*
+
+ *:e* *:edit* *reload*
+:e[dit] [++opt] [+cmd] Edit the current file. This is useful to re-edit the
+ current file, when it has been changed outside of Vim.
+ This fails when changes have been made to the current
+ buffer and 'autowriteall' isn't set or the file can't
+ be written.
+ Also see |++opt| and |+cmd|.
+
+ *:edit!* *discard*
+:e[dit]! [++opt] [+cmd]
+ Edit the current file always. Discard any changes to
+ the current buffer. This is useful if you want to
+ start all over again.
+ Also see |++opt| and |+cmd|.
+
+ *:edit_f*
+:e[dit] [++opt] [+cmd] {file}
+ Edit {file}.
+ This fails when changes have been made to the current
+ buffer, unless 'hidden' is set or 'autowriteall' is
+ set and the file can be written.
+ Also see |++opt| and |+cmd|.
+
+ *:edit!_f*
+:e[dit]! [++opt] [+cmd] {file}
+ Edit {file} always. Discard any changes to the
+ current buffer.
+ Also see |++opt| and |+cmd|.
+ *:edit_#* *:e#*
+:e[dit] [++opt] [+cmd] #[count]
+ Edit the [count]th buffer (as shown by |:files|).
+ This command does the same as [count] CTRL-^. But ":e
+ #" doesn't work if the alternate buffer doesn't have a
+ file name, while CTRL-^ still works then.
+ Also see |++opt| and |+cmd|.
+
+ *:ene* *:enew*
+:ene[w] Edit a new, unnamed buffer. This fails when changes
+ have been made to the current buffer, unless 'hidden'
+ is set or 'autowriteall' is set and the file can be
+ written.
+ If 'fileformats' is not empty, the first format given
+ will be used for the new buffer. If 'fileformats' is
+ empty, the 'fileformat' of the current buffer is used.
+
+ *:ene!* *:enew!*
+:ene[w]! Edit a new, unnamed buffer. Discard any changes to
+ the current buffer.
+ Set 'fileformat' like |:enew|.
+
+ *:fin* *:find*
+:fin[d][!] [++opt] [+cmd] {file}
+ Find {file} in 'path' and then |:edit| it.
+
+:{count}fin[d][!] [++opt] [+cmd] {file}
+ Just like ":find", but use the {count} match in
+ 'path'. Thus ":2find file" will find the second
+ "file" found in 'path'. When there are fewer matches
+ for the file in 'path' than asked for, you get an
+ error message.
+
+ *:ex*
+:ex [++opt] [+cmd] [file]
+ Same as |:edit|.
+
+ *:vi* *:visual*
+:vi[sual][!] [++opt] [+cmd] [file]
+ When used in Ex mode: Leave |Ex-mode|, go back to
+ Normal mode. Otherwise same as |:edit|.
+
+ *:vie* *:view*
+:vie[w][!] [++opt] [+cmd] file
+ When used in Ex mode: Leave |Ex-mode|, go back to
+ Normal mode. Otherwise same as |:edit|, but set
+ 'readonly' option for this buffer.
+
+ *CTRL-^* *CTRL-6*
+CTRL-^ Edit the alternate file. Mostly the alternate file is
+ the previously edited file. This is a quick way to
+ toggle between two files. It is equivalent to ":e #",
+ except that it also works when there is no file name.
+
+ If the 'autowrite' or 'autowriteall' option is on and
+ the buffer was changed, write it.
+ Mostly the ^ character is positioned on the 6 key,
+ pressing CTRL and 6 then gets you what we call CTRL-^.
+ But on some non-US keyboards CTRL-^ is produced in
+ another way.
+
+{count}CTRL-^ Edit [count]th file in the buffer list (equivalent to
+ ":e #[count]"). This is a quick way to switch between
+ 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".
+ Uses the 'isfname' option to find out which characters
+ are supposed to be in a file name. Trailing
+ punctuation characters ".,:;!" are ignored. Escaped
+ spaces "\ " are reduced to a single space.
+ Uses the 'path' option as a list of directory names to
+ look for the file. See the 'path' option for details
+ about relative directories and wildcards.
+ Uses the 'suffixesadd' option to check for file names
+ with a suffix added.
+ If the file can't be found, 'includeexpr' is used to
+ modify the name and another attempt is done.
+ If a [count] is given, the count'th file that is found
+ in the 'path' is edited.
+ This command fails if Vim refuses to |abandon| the
+ current file.
+ If you want to edit the file in a new window use
+ |CTRL-W_CTRL-F|.
+ If you do want to edit a new file, use: >
+ :e <cfile>
+< To make gf always work like that: >
+ :map gf :e <cfile><CR>
+< If the name is a hypertext link, that looks like
+ "type://machine/path", you need the |netrw| plugin.
+ For Unix the '~' character is expanded, like in
+ "~user/file". Environment variables are expanded too
+ |expand-env|.
+
+ *v_gf*
+{Visual}[count]gf Same as "gf", but the highlighted text is used as the
+ name of the file to edit. 'isfname' is ignored.
+ Leading blanks are skipped, otherwise all blanks and
+ special characters are included in the file name.
+ (For {Visual} see |Visual-mode|.)
+
+ *gF*
+[count]gF Same as "gf", except if a number follows the file
+ name, then the cursor is positioned on that line in
+ the file.
+ The file name and the number must be separated by a
+ non-filename (see 'isfname') and non-numeric
+ character. " line " is also recognized, like it is
+ used in the output of `:verbose command UserCmd`
+ White space between the filename, the separator and
+ the number are ignored.
+ Examples:
+ eval.c:10 ~
+ eval.c @ 20 ~
+ eval.c (30) ~
+ eval.c 40 ~
+
+ *v_gF*
+{Visual}[count]gF Same as "v_gf".
+
+These commands are used to start editing a single file. This means that the
+file is read into the buffer and the current file name is set. The file that
+is opened depends on the current directory, see |:cd|.
+
+See |read-messages| for an explanation of the message that is given after the
+file has been read.
+
+You can use the ":e!" command if you messed up the buffer and want to start
+all over again. The ":e" command is only useful if you have changed the
+current file name.
+
+ *:filename* *{file}*
+Besides the things mentioned here, more special items for where a filename is
+expected are mentioned at |cmdline-special|.
+
+Note for systems other than Unix: When using a command that accepts a single
+file name (like ":edit file") spaces in the file name are allowed, but
+trailing spaces are ignored. This is useful on systems that regularly embed
+spaces in file names (like MS-Windows and the Amiga). Example: The command
+":e Long File Name " will edit the file "Long File Name". When using a
+command that accepts more than one file name (like ":next file1 file2")
+embedded spaces must be escaped with a backslash.
+
+ *wildcard* *wildcards*
+Wildcards in {file} are expanded, but as with file completion, 'wildignore'
+and 'suffixes' apply. Which wildcards are supported depends on the system.
+These are the common ones:
+ ? matches one character
+ * matches anything, including nothing
+ ** matches anything, including nothing, recurses into directories
+ [abc] match 'a', 'b' or 'c'
+
+To avoid the special meaning of the wildcards prepend a backslash. However,
+on MS-Windows the backslash is a path separator and "path\[abc]" is still seen
+as a wildcard when "[" is in the 'isfname' option. A simple way to avoid this
+is to use "path\[[]abc]", this matches the file "path\[abc]".
+
+ *starstar-wildcard*
+Expanding "**" is possible on Unix, Win32, macOS and a few other systems.
+This allows searching a directory tree. This goes up to 100 directories deep.
+Note there are some commands where this works slightly differently, see
+|file-searching|.
+Example: >
+ :n **/*.txt
+Finds files:
+ aaa.txt ~
+ subdir/bbb.txt ~
+ a/b/c/d/ccc.txt ~
+When non-wildcard characters are used right before or after "**" these are
+only matched in the top directory. They are not used for directories further
+down in the tree. For example: >
+ :n /usr/inc**/types.h
+Finds files:
+ /usr/include/types.h ~
+ /usr/include/sys/types.h ~
+ /usr/inc/old/types.h ~
+Note that the path with "/sys" is included because it does not need to match
+"/inc". Thus it's like matching "/usr/inc*/*/*...", not
+"/usr/inc*/inc*/inc*".
+
+ *backtick-expansion* *`-expansion*
+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
+termination.
+This also works for most other systems, with the restriction that the
+backticks must be around the whole item. It is not possible to have text
+directly before the first or just after the last backtick.
+
+ *`=* *E1083*
+You can have the backticks expanded as a Vim expression, instead of as an
+external command, by putting an equal sign right after the first backtick,
+e.g.: >
+ :e `=tempname()`
+The expression can contain just about anything, thus this can also be used to
+avoid the special meaning of '"', '|', '%' and '#'. However, 'wildignore'
+does apply like to other wildcards.
+
+Environment variables in the expression are expanded when evaluating the
+expression, thus this works: >
+ :e `=$HOME .. '/.vimrc'`
+This uses $HOME inside a string and it will be used literally, most likely not
+what you intended: >
+ :e `='$HOME' .. '/.vimrc'`
+
+If the expression returns a string then names are to be separated with line
+breaks. When the result is a |List| then each item is used as a name. Line
+breaks also separate names.
+Note that such expressions are only supported in places where a filename is
+expected as an argument to an Ex-command.
+
+ *++opt* *[++opt]*
+The [++opt] argument can be used to force the value of 'fileformat',
+'fileencoding' or 'binary' to a value for one command, and to specify the
+behavior for bad characters. The form is: >
+ ++{optname}
+Or: >
+ ++{optname}={value}
+
+Where {optname} is one of: *++ff* *++enc* *++bin* *++nobin* *++edit*
+ ff or fileformat overrides 'fileformat'
+ enc or encoding overrides 'fileencoding'
+ bin or binary sets 'binary'
+ nobin or nobinary resets 'binary'
+ bad specifies behavior for bad characters
+ edit for |:read| only: keep option values as if editing
+ a file
+
+{value} cannot contain white space. It can be any valid value for these
+options. Examples: >
+ :e ++ff=unix
+This edits the same file again with 'fileformat' set to "unix". >
+
+ :w ++enc=latin1 newfile
+This writes the current buffer to "newfile" in latin1 format.
+
+The message given when writing a file will show "[converted]" when
+'fileencoding' or the value specified with ++enc differs from 'encoding'.
+
+There may be several ++opt arguments, separated by white space. They must all
+appear before any |+cmd| argument.
+
+ *++bad*
+The argument of "++bad=" specifies what happens with characters that can't be
+converted and illegal bytes. It can be one of three things:
+ ++bad=X A single-byte character that replaces each bad character.
+ ++bad=keep Keep bad characters without conversion. Note that this may
+ result in illegal bytes in your text!
+ ++bad=drop Remove the bad characters.
+
+The default is like "++bad=?": Replace each bad character with a question
+mark. In some places an inverted question mark is used (0xBF).
+
+Note that not all commands use the ++bad argument, even though they do not
+give an error when you add it. E.g. |:write|.
+
+Note that when reading, the 'fileformat' and 'fileencoding' options will be
+set to the used format. When writing this doesn't happen, thus a next write
+will use the old value of the option. Same for the 'binary' option.
+
+
+ *+cmd* *[+cmd]*
+The [+cmd] argument can be used to position the cursor in the newly opened
+file, or execute any other command:
+ + Start at the last line.
+ +{num} Start at line {num}.
+ +/{pat} Start at first line containing {pat}.
+ +{command} Execute {command} after opening the new file.
+ {command} is any Ex command.
+To include a white space in the {pat} or {command}, precede it with a
+backslash. Double the number of backslashes. >
+ :edit +/The\ book file
+ :edit +/dir\ dirname\\ file
+ :edit +set\ dir=c:\\\\temp file
+Note that in the last example the number of backslashes is halved twice: Once
+for the "+cmd" argument and once for the ":set" command.
+
+ *file-formats*
+The 'fileformat' option sets the <EOL> style for a file:
+'fileformat' characters name ~
+ "dos" <CR><NL> or <NL> DOS format *DOS-format*
+ "unix" <NL> Unix format *Unix-format*
+ "mac" <CR> Mac format *Mac-format*
+Previously 'textmode' was used. It is obsolete now.
+
+When reading a file, the mentioned characters are interpreted as the <EOL>.
+In DOS format (default for Win32), <CR><NL> and <NL> are both interpreted as
+the <EOL>. Note that when writing the file in DOS format, <CR> characters
+will be added for each single <NL>. Also see |file-read|.
+
+When writing a file, the mentioned characters are used for <EOL>. For DOS
+format <CR><NL> is used. Also see |DOS-format-write|.
+
+You can read a file in DOS format and write it in Unix format. This will
+replace all <CR><NL> pairs by <NL> (assuming 'fileformats' includes "dos"): >
+ :e file
+ :set fileformat=unix
+ :w
+If you read a file in Unix format and write with DOS format, all <NL>
+characters will be replaced with <CR><NL> (assuming 'fileformats' includes
+"unix"): >
+ :e file
+ :set fileformat=dos
+ :w
+
+If you start editing a new file and the 'fileformats' option is not empty
+(which is the default), Vim will try to detect whether the lines in the file
+are separated by the specified formats. When set to "unix,dos", Vim will
+check for lines with a single <NL> (as used on Unix and Amiga) or by a <CR>
+<NL> pair (MS-Windows). Only when ALL lines end in <CR><NL>, 'fileformat' is
+set to "dos", otherwise it is set to "unix". When 'fileformats' includes
+"mac", and no <NL> characters are found in the file, 'fileformat' is set to
+"mac".
+
+If the 'fileformat' option is set to "dos" on non-MS-Windows systems the
+message "[dos format]" is shown to remind you that something unusual is
+happening. On MS-Windows systems you get the message "[unix format]" if
+'fileformat' is set to "unix". On all systems but the Macintosh you get the
+message "[mac format]" if 'fileformat' is set to "mac".
+
+If the 'fileformats' option is empty and DOS format is used, but while reading
+a file some lines did not end in <CR><NL>, "[CR missing]" will be included in
+the file message.
+If the 'fileformats' option is empty and Mac format is used, but while reading
+a file a <NL> was found, "[NL missing]" will be included in the file message.
+
+If the new file does not exist, the 'fileformat' of the current buffer is used
+when 'fileformats' is empty. Otherwise the first format from 'fileformats' is
+used for the new file.
+
+Before editing binary, executable or Vim script files you should set the
+'binary' option. A simple way to do this is by starting Vim with the "-b"
+option. This will avoid the use of 'fileformat'. Without this you risk that
+single <NL> characters are unexpectedly replaced with <CR><NL>.
+
+You can encrypt files that are written by setting the 'key' option. This
+provides some security against others reading your files. |encryption|
+
+END OF LINE AND END OF FILE *eol-and-eof*
+
+Vim has several options to control the file format:
+ 'fileformat' the <EOL> style: Unix, DOS, Mac
+ 'endofline' whether the last line ends with a <EOL>
+ 'endoffile' whether the file ends with a CTRL-Z
+ 'fixendofline' whether to fix eol and eof
+
+The first three values are normally detected automatically when reading the
+file and are used when writing the text to a file. While editing the buffer
+it looks like every line has a line ending and the CTRL-Z isn't there (an
+exception is when 'binary' is set, it works differently then).
+
+The 'fixendofline' option can be used to choose what to write. You can also
+change the option values to write the file differently than how it was read.
+
+Here are some examples how to use them.
+
+If you want files in Unix format (every line NL terminated): >
+ setl ff=unix fixeol
+You should probably do this on any Unix-like system. Also modern MS-Windows
+systems tend to work well with this. It is recommended to always use this
+format for Vim scripts.
+
+If you want to use an old MS-DOS file in a modern environment, fixing line
+endings and dropping CTRL-Z, but keeping the <CR><NL> style <EOL>: >
+ setl ff=dos fixeol
+This is useful for many MS-Windows programs, they regularly expect the
+<CR><NL> line endings.
+
+If you want to drop the final <EOL> and add a final CTRL-Z (e.g. for an old
+system like CP/M): >
+ setl ff=dos nofixeol noeol eof
+
+If you want to preserve the fileformat exactly as-is, including any final
+<EOL> and final CTRL-Z: >
+ setl nofixeol
+
+==============================================================================
+3. The argument list *argument-list* *arglist*
+
+If you give more than one file name when starting Vim, this list is remembered
+as the argument list. You can jump to each file in this list.
+
+Do not confuse this with the buffer list, which you can see with the
+|:buffers| command. The argument list was already present in Vi, the buffer
+list is new in Vim. Every file name in the argument list will also be present
+in the buffer list (unless it was deleted with |:bdel| or |:bwipe|). But it's
+common that names in the buffer list are not in the argument list.
+
+This subject is introduced in section |07.2| of the user manual.
+
+There is one global argument list, which is used for all windows by default.
+It is possible to create a new argument list local to a window, see
+|:arglocal|.
+
+You can use the argument list with the following commands, and with the
+expression functions |argc()| and |argv()|. These all work on the argument
+list of the current window.
+
+ *:ar* *:arg* *:args*
+:ar[gs] Print the argument list, with the current file in
+ square brackets.
+
+:ar[gs] [++opt] [+cmd] {arglist} *:args_f*
+ Define {arglist} as the new argument list and edit
+ the first one. This fails when changes have been made
+ and Vim does not want to |abandon| the current buffer.
+ Also see |++opt| and |+cmd|.
+
+:ar[gs]! [++opt] [+cmd] {arglist} *:args_f!*
+ Define {arglist} as the new argument list and edit
+ the first one. Discard any changes to the current
+ buffer.
+ Also see |++opt| and |+cmd|.
+
+:[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|.
+ Spaces in filenames have to be escaped with "\".
+ [count] is used like with |:argadd|.
+ 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*
+:[count]arga[dd] *E1156*
+ Add the {name}s to the argument list. When {name} is
+ omitted add the current buffer name to the argument
+ list.
+ If [count] is omitted, the {name}s are added just
+ after the current entry in the argument list.
+ Otherwise they are added after the [count]'th file.
+ If the argument list is "a b c", and "b" is the
+ current argument, then these commands result in:
+ command new argument list ~
+ :argadd x a b x c
+ :0argadd x x a b c
+ :1argadd x a x b c
+ :$argadd x a b c x
+ And after the last one:
+ :+2argadd y a b c x y
+ There is no check for duplicates, it is possible to
+ add a file to the argument list twice. You can use
+ |:argdedupe| to fix it afterwards: >
+ :argadd *.txt | argdedupe
+< The currently edited file is not changed.
+ Note: you can also use this method: >
+ :args ## x
+< This will add the "x" item and sort the new list.
+
+:argded[upe] *:argded* *:argdedupe*
+ Remove duplicate filenames from the argument list.
+ If your current file is a duplicate, your current file
+ will change to the original file index.
+
+:argd[elete] {pattern} .. *:argd* *:argdelete* *E480* *E610*
+ Delete files from the argument list that match the
+ {pattern}s. {pattern} is used like a file pattern,
+ see |file-pattern|. "%" can be used to delete the
+ current entry.
+ This command keeps the currently edited file, also
+ when it's deleted from the argument list.
+ Example: >
+ :argdel *.obj
+
+:[range]argd[elete] Delete the [range] files from the argument list.
+ Example: >
+ :10,$argdel
+< Deletes arguments 10 and further, keeping 1-9. >
+ :$argd
+< Deletes just the last one. >
+ :argd
+ :.argd
+< Deletes the current argument. >
+ :%argd
+< Removes all the files from the arglist.
+ When the last number in the range is too high, up to
+ the last argument is deleted.
+
+ *:argu* *:argument*
+:[count]argu[ment] [count] [++opt] [+cmd]
+ Edit file [count] in the argument list. When [count]
+ is omitted the current entry is used. This fails
+ when changes have been made and Vim does not want to
+ |abandon| the current buffer.
+ Also see |++opt| and |+cmd|.
+
+:[count]argu[ment]! [count] [++opt] [+cmd]
+ Edit file [count] in the argument list, discard any
+ changes to the current buffer. When [count] is
+ omitted the current entry is used.
+ Also see |++opt| and |+cmd|.
+
+:[count]n[ext] [++opt] [+cmd] *:n* *:ne* *:next* *E165* *E163*
+ Edit [count] next file. This fails when changes have
+ been made and Vim does not want to |abandon| the
+ current buffer. Also see |++opt| and |+cmd|.
+
+:[count]n[ext]! [++opt] [+cmd]
+ Edit [count] next file, discard any changes to the
+ buffer. Also see |++opt| and |+cmd|.
+
+:n[ext] [++opt] [+cmd] {arglist} *:next_f*
+ Same as |:args_f|.
+
+:n[ext]! [++opt] [+cmd] {arglist}
+ Same as |:args_f!|.
+
+:[count]N[ext] [count] [++opt] [+cmd] *:Next* *:N* *E164*
+ Edit [count] previous file in argument list. This
+ fails when changes have been made and Vim does not
+ want to |abandon| the current buffer.
+ Also see |++opt| and |+cmd|.
+
+:[count]N[ext]! [count] [++opt] [+cmd]
+ Edit [count] previous file in argument list. Discard
+ any changes to the buffer. Also see |++opt| and
+ |+cmd|.
+
+:[count]prev[ious] [count] [++opt] [+cmd] *:prev* *:previous*
+ Same as :Next. Also see |++opt| and |+cmd|.
+
+ *:rew* *:rewind*
+:rew[ind] [++opt] [+cmd]
+ Start editing the first file in the argument list.
+ This fails when changes have been made and Vim does
+ not want to |abandon| the current buffer.
+ Also see |++opt| and |+cmd|.
+
+:rew[ind]! [++opt] [+cmd]
+ Start editing the first file in the argument list.
+ Discard any changes to the buffer. Also see |++opt|
+ and |+cmd|.
+
+ *:fir* *:first*
+:fir[st][!] [++opt] [+cmd]
+ Other name for ":rewind".
+
+ *:la* *:last*
+:la[st] [++opt] [+cmd]
+ Start editing the last file in the argument list.
+ This fails when changes have been made and Vim does
+ not want to |abandon| the current buffer.
+ Also see |++opt| and |+cmd|.
+
+:la[st]! [++opt] [+cmd]
+ Start editing the last file in the argument list.
+ Discard any changes to the buffer. Also see |++opt|
+ and |+cmd|.
+
+ *:wn* *:wnext*
+:[count]wn[ext] [++opt]
+ Write current file and start editing the [count]
+ next file. Also see |++opt| and |+cmd|.
+
+:[count]wn[ext] [++opt] {file}
+ Write current file to {file} and start editing the
+ [count] next file, unless {file} already exists and
+ the 'writeany' option is off. Also see |++opt| and
+ |+cmd|.
+
+:[count]wn[ext]! [++opt] {file}
+ Write current file to {file} and start editing the
+ [count] next file. Also see |++opt| and |+cmd|.
+
+:[count]wN[ext][!] [++opt] [file] *:wN* *:wNext*
+:[count]wp[revious][!] [++opt] [file] *:wp* *:wprevious*
+ Same as :wnext, but go to previous file instead of
+ next.
+
+The [count] in the commands above defaults to one. For some commands it is
+possible to use two counts. The last one (rightmost one) is used.
+
+If no [+cmd] argument is present, the cursor is positioned at the last known
+cursor position for the file. If 'startofline' is set, the cursor will be
+positioned at the first non-blank in the line, otherwise the last know column
+is used. If there is no last known cursor position the cursor will be in the
+first line (the last line in Ex mode).
+
+ *{arglist}*
+The wildcards in the argument list are expanded and the file names are sorted.
+Thus you can use the command "vim *.c" to edit all the C files. From within
+Vim the command ":n *.c" does the same.
+
+White space is used to separate file names. Put a backslash before a space or
+tab to include it in a file name. E.g., to edit the single file "foo bar": >
+ :next foo\ bar
+
+On Unix and a few other systems you can also use backticks, for example: >
+ :next `find . -name \\*.c -print`
+The backslashes before the star are required to prevent "*.c" to be expanded
+by the shell before executing the find program.
+
+ *arglist-position*
+When there is an argument list you can see which file you are editing in the
+title of the window (if there is one and 'title' is on) and with the file
+message you get with the "CTRL-G" command. You will see something like
+ (file 4 of 11)
+If 'shortmess' contains 'f' it will be
+ (4 of 11)
+If you are not really editing the file at the current position in the argument
+list it will be
+ (file (4) of 11)
+This means that you are position 4 in the argument list, but not editing the
+fourth file in the argument list. This happens when you do ":e file".
+
+
+LOCAL ARGUMENT LIST
+
+ *:arglocal*
+:argl[ocal] Make a local copy of the global argument list.
+ Doesn't start editing another file.
+
+:argl[ocal][!] [++opt] [+cmd] {arglist}
+ Define a new argument list, which is local to the
+ current window. Works like |:args_f| otherwise.
+
+ *:argglobal*
+:argg[lobal] Use the global argument list for the current window.
+ Doesn't start editing another file.
+
+:argg[lobal][!] [++opt] [+cmd] {arglist}
+ Use the global argument list for the current window.
+ Define a new global argument list like |:args_f|.
+ All windows using the global argument list will see
+ this new list.
+
+There can be several argument lists. They can be shared between windows.
+When they are shared, changing the argument list in one window will also
+change it in the other window.
+
+When a window is split the new window inherits the argument list from the
+current window. The two windows then share this list, until one of them uses
+|:arglocal| or |:argglobal| to use another argument list.
+
+
+USING THE ARGUMENT LIST
+
+ *:argdo*
+:[range]argdo[!] {cmd} Execute {cmd} for each file in the argument list or
+ if [range] is specified only for arguments in that
+ range. It works like doing this: >
+ :rewind
+ :{cmd}
+ :next
+ :{cmd}
+ etc.
+< When the current file can't be |abandon|ed and the [!]
+ is not present, the command fails.
+ When an error is detected on one file, further files
+ in the argument list will not be visited.
+ The last file in the argument list (or where an error
+ occurred) becomes the current file.
+ {cmd} can contain '|' to concatenate several commands.
+ {cmd} must not change the argument list.
+ Note: While this command is executing, the Syntax
+ autocommand event is disabled by adding it to
+ 'eventignore'. This considerably speeds up editing
+ each file.
+ Also see |:windo|, |:tabdo|, |:bufdo|, |:cdo|, |:ldo|,
+ |:cfdo| and |:lfdo|
+
+Example: >
+ :args *.c
+ :argdo set ff=unix | update
+This sets the 'fileformat' option to "unix" and writes the file if it is now
+changed. This is done for all *.c files.
+
+Example: >
+ :args *.[ch]
+ :argdo %s/\<my_foo\>/My_Foo/ge | update
+This changes the word "my_foo" to "My_Foo" in all *.c and *.h files. The "e"
+flag is used for the ":substitute" command to avoid an error for files where
+"my_foo" isn't used. ":update" writes the file only if changes were made.
+
+==============================================================================
+4. Writing *writing* *save-file*
+
+Note: When the 'write' option is off, you are not able to write any file.
+
+ *:w* *:write*
+ *E502* *E503* *E504* *E505*
+ *E512* *E514* *E667* *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
+ another reason why the file can't be written.
+ For ++opt see |++opt|, but only ++bin, ++nobin, ++ff
+ and ++enc are effective.
+
+:w[rite]! [++opt] Like ":write", but forcefully write when 'readonly' is
+ set or there is another reason why writing was
+ refused.
+ Note: This may change the permission and ownership of
+ the file and break (symbolic) links. Add the 'W' flag
+ to 'cpoptions' to avoid this.
+
+:[range]w[rite][!] [++opt]
+ Write the specified lines to the current file. This
+ is unusual, because the file will not contain all
+ lines in the buffer.
+
+ *:w_f* *:write_f*
+:[range]w[rite] [++opt] {file}
+ Write the specified lines to {file}, unless it
+ already exists and the 'writeany' option is off.
+
+ *:w!*
+:[range]w[rite]! [++opt] {file}
+ Write the specified lines to {file}. Overwrite an
+ existing file.
+
+ *:w_a* *:write_a* *E494*
+:[range]w[rite][!] [++opt] >>
+ Append the specified lines to the current file.
+
+:[range]w[rite][!] [++opt] >> {file}
+ Append the specified lines to {file}. '!' forces the
+ write even if file does not exist.
+
+ *:w_c* *:write_c*
+:[range]w[rite] [++opt] !{cmd}
+ Execute {cmd} with [range] lines as standard input
+ (note the space in front of the '!'). {cmd} is
+ executed like with ":!{cmd}", any '!' is replaced with
+ the previous command |:!|.
+
+The default [range] for the ":w" command is the whole buffer (1,$). If you
+write the whole buffer, it is no longer considered changed. When you
+write it to a different file with ":w somefile" it depends on the "+" flag in
+'cpoptions'. When included, the write command will reset the 'modified' flag,
+even though the buffer itself may still be different from its file.
+
+If a file name is given with ":w" it becomes the alternate file. This can be
+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
+ the filename of the current buffer to {file}. The
+ previous name is used for the alternate file name.
+ The [!] is needed to overwrite an existing file.
+ When 'filetype' is empty filetype detection is done
+ with the new name, before the file is written.
+ When the write was successful 'readonly' is reset.
+
+ *:up* *:update*
+:[range]up[date][!] [++opt] [>>] [file]
+ Like ":write", but only write when the buffer has been
+ modified.
+
+
+WRITING WITH MULTIPLE BUFFERS *buffer-write*
+
+ *:wa* *:wall*
+:wa[ll] Write all changed buffers. Buffers without a file
+ 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 and cause an error message.
+
+
+Vim will warn you if you try to overwrite a file that has been changed
+elsewhere. See |timestamp|.
+
+ *backup* *E207* *E506* *E507* *E508* *E509* *E510*
+If you write to an existing file (but do not append) while the 'backup',
+'writebackup' or 'patchmode' option is on, a backup of the original file is
+made. The file is either copied or renamed (see 'backupcopy'). After the
+file has been successfully written and when the 'writebackup' option is on and
+the 'backup' option is off, the backup file is deleted. When the 'patchmode'
+option is on the backup file may be renamed.
+
+ *backup-table*
+'backup' 'writebackup' action ~
+ off off no backup made
+ off on backup current file, deleted afterwards (default)
+ on off delete old backup, backup current file
+ on on delete old backup, backup current file
+
+When the 'backupskip' pattern matches with the name of the file which is
+written, no backup file is made. The values of 'backup' and 'writebackup' are
+ignored then.
+
+When the 'backup' option is on, an old backup file (with the same name as the
+new backup file) will be deleted. If 'backup' is not set, but 'writebackup'
+is set, an existing backup file will not be deleted. The backup file that is
+made while the file is being written will have a different name.
+
+On some filesystems it's possible that in a crash you lose both the backup and
+the newly written file (it might be there but contain bogus data). In that
+case try recovery, because the swap file is synced to disk and might still be
+there. |:recover|
+
+The directories given with the 'backupdir' option are used to put the backup
+file in. (default: same directory as the written file).
+
+Whether the backup is a new file, which is a copy of the original file, or the
+original file renamed depends on the 'backupcopy' option. See there for an
+explanation of when the copy is made and when the file is renamed.
+
+If the creation of a backup file fails, the write is not done. If you want
+to write anyway add a '!' to the command.
+
+ *write-permissions*
+When writing a new file the permissions are read-write. For unix the mask is
+0o666 with additionally umask applied. When writing a file that was read Vim
+will preserve the permissions, but clear the s-bit.
+
+ *write-readonly*
+When the 'cpoptions' option contains 'W', Vim will refuse to overwrite a
+readonly file. When 'W' is not present, ":w!" will overwrite a readonly file,
+if the system allows it (the directory must be writable).
+
+ *write-fail*
+If the writing of the new file fails, you have to be careful not to lose
+your changes AND the original file. If there is no backup file and writing
+the new file failed, you have already lost the original file! DON'T EXIT VIM
+UNTIL YOU WRITE OUT THE FILE! If a backup was made, it is put back in place
+of the original file (if possible). If you exit Vim, and lose the changes
+you made, the original file will mostly still be there. If putting back the
+original file fails, there will be an error message telling you that you
+lost the original file.
+
+ *DOS-format-write*
+If the 'fileformat' is "dos", <CR><NL> is used for <EOL>. This is default
+for Win32. On other systems the message "[dos format]" is shown to remind you
+that an unusual <EOL> was used.
+ *Unix-format-write*
+If the 'fileformat' is "unix", <NL> is used for <EOL>. On Win32 the message
+"[unix format]" is shown.
+ *Mac-format-write*
+If the 'fileformat' is "mac", <CR> is used for <EOL>. On non-Mac systems the
+message "[mac format]" is shown.
+
+See also |file-formats| and the 'fileformat' and 'fileformats' options.
+
+ *ACL*
+ACL stands for Access Control List. It is an advanced way to control access
+rights for a file. It is used on new MS-Windows and Unix systems, but only
+when the filesystem supports it.
+ Vim attempts to preserve the ACL info when writing a file. The backup file
+will get the ACL info of the original file.
+ The ACL info is also used to check if a file is read-only (when opening the
+file).
+
+ *read-only-share*
+When MS-Windows shares a drive on the network it can be marked as read-only.
+This means that even if the file read-only attribute is absent, and the ACL
+settings on NT network shared drives allow writing to the file, you can still
+not write to the file. Vim on Win32 platforms will detect read-only network
+drives and will mark the file as read-only. You will not be able to override
+it with |:write|.
+
+ *write-device*
+When the file name is actually a device name, Vim will not make a backup (that
+would be impossible). You need to use "!", since the device already exists.
+Example for Unix: >
+ :w! /dev/lpt0
+and for MS-Windows: >
+ :w! lpt0
+For Unix a device is detected when the name doesn't refer to a normal file or
+a directory. A fifo or named pipe also looks like a device to Vim.
+For MS-Windows the device is detected by its name:
+ AUX
+ CON
+ CLOCK$
+ NUL
+ PRN
+ COMn n=1,2,3... etc
+ LPTn n=1,2,3... etc
+The names can be in upper- or lowercase.
+
+==============================================================================
+5. Writing and quitting *write-quit*
+
+ *:q* *:quit*
+:q[uit] Quit the current window. Quit Vim if this is the last
+ |edit-window|. This fails when changes have been made
+ and Vim refuses to |abandon| the current buffer, and
+ when the last file in the argument list has not been
+ edited.
+ If there are other tab pages and quitting the last
+ 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. 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
+ code. See |:cq|. Used for Manx's QuickFix mode (see
+ |quickfix|).
+
+ *:wq*
+:wq [++opt] Write the current file and close the window. If this
+ was the last |edit-window| Vim quits.
+ Writing fails when the file is read-only or the buffer
+ does not have a name. Quitting fails when the last
+ file in the argument list has not been edited.
+
+:wq! [++opt] Write the current file and close the window. If this
+ was the last |edit-window| Vim quits. Writing fails
+ when the current buffer does not have a name.
+
+:wq [++opt] {file} Write to {file} and close the window. If this was the
+ last |edit-window| Vim quits. Quitting fails when the
+ last file in the argument list has not been edited.
+
+:wq! [++opt] {file} Write to {file} and close the current window. Quit
+ Vim if this was the last |edit-window|.
+
+:[range]wq[!] [++opt] [file]
+ Same as above, but only write the lines in [range].
+
+ *:x* *:xit*
+:[range]x[it][!] [++opt] [file]
+ Like ":wq", but write only when changes have been
+ made.
+ When 'hidden' is set and there are more windows, the
+ current buffer becomes hidden, after writing the file.
+ This command is not supported in |Vim9| script,
+ because it is too easily confused with a variable
+ name.
+
+ *:exi* *:exit*
+:[range]exi[t][!] [++opt] [file]
+ Same as :xit.
+
+ *ZZ*
+ZZ Write current file, if modified, and close the current
+ window (same as ":x").
+ If there are several windows for the current file,
+ only the current window is closed.
+
+ *ZQ*
+ZQ Quit without checking for changes (same as ":q!").
+
+
+MULTIPLE WINDOWS AND BUFFERS *window-exit*
+
+ *:qa* *:qall*
+:qa[ll] Exit Vim, unless there are some buffers which have been
+ changed. (Use ":bmod" to go to the next modified buffer).
+ When 'autowriteall' is set all changed buffers will be
+ written, like |:wqall|.
+
+:conf[irm] qa[ll]
+ Exit Vim. Bring up a prompt when some buffers have been
+ changed. See |:confirm|.
+
+:qa[ll]! Exit Vim. Any changes to buffers are lost.
+ Also see |:cquit|, it does the same but exits with a non-zero
+ value.
+
+ *:quita* *:quitall*
+:quita[ll][!] Same as ":qall".
+
+:wqa[ll] [++opt] *:wqa* *:wqall* *:xa* *:xall*
+:xa[ll] Write all changed buffers and exit Vim. If there are buffers
+ without a file name, which are readonly or which cannot be
+ written for another reason, Vim will not quit.
+
+:conf[irm] wqa[ll] [++opt]
+:conf[irm] xa[ll]
+ Write all changed buffers and exit Vim. Bring up a prompt
+ when some buffers are readonly or cannot be written for
+ another reason. See |:confirm|.
+
+:wqa[ll]! [++opt]
+:xa[ll]! Write all changed buffers, even the ones that are readonly,
+ and exit Vim. If there are buffers without a file name or
+ which cannot be written for another reason, or there is a
+ terminal with a running job, Vim will not quit.
+
+==============================================================================
+6. Dialogs *edit-dialogs*
+
+ *:confirm* *:conf*
+:conf[irm] {command} Execute {command}, and use a dialog when an
+ operation has to be confirmed. Can be used on the
+ |:q|, |:qa| and |:w| commands (the latter to override
+ a read-only setting), and any other command that can
+ fail in such a way, such as |:only|, |:buffer|,
+ |:bdelete|, etc.
+
+Examples: >
+ :confirm w foo
+< Will ask for confirmation when "foo" already exists. >
+ :confirm q
+< Will ask for confirmation when there are changes. >
+ :confirm qa
+< If any modified, unsaved buffers exist, you will be prompted to save
+ or abandon each one. There are also choices to "save all" or "abandon
+ all".
+
+If you want to always use ":confirm", set the 'confirm' option.
+
+ *:browse* *:bro* *E338*
+: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|,
+ |:view|, |:sview|, |:r|, |:saveas|, |:sp|, |:mkexrc|,
+ |:mkvimrc|, |:mksession|, |:mkview|, |:split|,
+ |:vsplit|, |:tabe|, |:tabnew|, |:cfile|, |:cgetfile|,
+ |:caddfile|, |:lfile|, |:lgetfile|, |:laddfile|,
+ |:diffsplit|, |:diffpatch|, |:open|, |:pedit|,
+ |:redir|, |:source|, |:update|, |:visual|, |:vsplit|,
+ and |:qall| if 'confirm' is set.
+ {only in Win32, Motif, GTK and Mac GUI, in
+ console `browse edit` works if the FileExplorer
+ autocommand group exists}
+ When ":browse" is not possible you get an error
+ message. If the |+browse| feature is missing or the
+ {command} doesn't support browsing, the {command} is
+ executed without a dialog.
+ ":browse set" works like |:options|.
+ See also |:oldfiles| for ":browse oldfiles".
+
+The syntax is best shown via some examples: >
+ :browse e $vim/foo
+< Open the browser in the $vim/foo directory, and edit the
+ file chosen. >
+ :browse e
+< Open the browser in the directory specified with 'browsedir',
+ and edit the file chosen. >
+ :browse w
+< Open the browser in the directory of the current buffer,
+ with the current buffer filename as default, and save the
+ buffer under the filename chosen. >
+ :browse w C:/bar
+< Open the browser in the C:/bar directory, with the current
+ buffer filename as default, and save the buffer under the
+ filename chosen.
+Also see the 'browsedir' option.
+For versions of Vim where browsing is not supported, the command is executed
+unmodified.
+
+ *browsefilter*
+For MS-Windows and GTK, you can modify the filters that are used in the browse
+dialog. By setting the g:browsefilter or b:browsefilter variables, you can
+change the filters globally or locally to the buffer. The variable is set to
+a string in the format "{filter label}\t{pattern};{pattern}\n" where {filter
+label} is the text that appears in the "Files of Type" comboBox, and {pattern}
+is the pattern which filters the filenames. Several patterns can be given,
+separated by ';'.
+
+For Motif the same format is used, but only the very first pattern is actually
+used (Motif only offers one pattern, but you can edit it).
+
+For example, to have only Vim files in the dialog, you could use the following
+command: >
+
+ let g:browsefilter = "Vim Scripts\t*.vim\nVim Startup Files\t*vimrc\n"
+
+You can override the filter setting on a per-buffer basis by setting the
+b:browsefilter variable. You would most likely set b:browsefilter in a
+filetype plugin, so that the browse dialog would contain entries related to
+the type of file you are currently editing. Disadvantage: This makes it
+difficult to start editing a file of a different type. To overcome this, you
+may want to add "All Files\t*.*\n" as the final filter, so that the user can
+still access any desired file.
+
+To avoid setting browsefilter when Vim does not actually support it, you can
+use has("browsefilter"): >
+
+ if has("browsefilter")
+ let g:browsefilter = "whatever"
+ endif
+
+==============================================================================
+7. The current directory *current-directory*
+
+You can use the |:cd|, |:tcd| and |:lcd| commands to change to another
+directory, so you will not have to type that directory name in front of the
+file names. It also makes a difference for executing external commands, e.g.
+":!ls".
+
+Changing directory fails when the current buffer is modified, the '.' flag is
+present in 'cpoptions' and "!" is not used in the command.
+
+ *:cd* *E747* *E472*
+:cd[!] On non-Unix systems when 'cdhome' is off: Print the
+ current directory name.
+ Otherwise: Change the current directory to the home
+ directory. Clear any window-local directory.
+ Use |:pwd| to print the current directory on all
+ systems.
+
+:cd[!] {path} Change the current directory to {path}.
+ If {path} is relative, it is searched for in the
+ directories listed in |'cdpath'|.
+ Clear any window-local directory.
+ Does not change the meaning of an already opened file,
+ because its full path name is remembered. Files from
+ the |arglist| may change though!
+ On MS-Windows this also changes the active drive.
+ To change to the directory of the current file: >
+ :cd %:h
+<
+ *:cd-* *E186*
+:cd[!] - Change to the previous current directory (before the
+ previous ":cd {path}" command).
+
+ *:chd* *:chdir*
+:chd[ir][!] [path] Same as |:cd|.
+
+ *:tc* *:tcd*
+:tc[d][!] {path} Like |:cd|, but only set the directory for the current
+ tab. The current window will also use this directory.
+ The current directory is not changed for windows in
+ other tabs and for windows in the current tab that
+ have their own window-local directory.
+
+ *:tcd-*
+:tc[d][!] - Change to the previous current directory, before the
+ last ":tcd {path}" command.
+
+ *:tch* *:tchdir*
+:tch[dir][!] Same as |:tcd|.
+
+ *:lc* *:lcd*
+:lc[d][!] {path} Like |:cd|, but only set the current directory when
+ the cursor is in the current window. The current
+ directory for other windows is not changed, switching
+ to another window will stop using {path}.
+
+ *:lcd-*
+:lcd[!] - Change to the previous current directory, before the
+ last ":lcd {path}" command.
+
+ *:lch* *:lchdir*
+:lch[dir][!] Same as |:lcd|.
+
+ *:pw* *:pwd* *E187*
+:pw[d] Print the current directory name.
+ Also see |getcwd()|.
+ *:pwd-verbose*
+ When 'verbose' is non-zero, |:pwd| will also display
+ what scope the current directory was set. Example: >
+
+ " Set by :cd
+ :verbose pwd
+ [global] /path/to/current
+
+ " Set by :lcd
+ :verbose pwd
+ [window] /path/to/current
+
+ " Set by :tcd
+ :verbose pwd
+ [tabpage] /path/to/current
+
+So long as no |:lcd| or |:tcd| command has been used, all windows share the
+same current directory. Using a command to jump to another window doesn't
+change anything for the current directory.
+
+When a |:lcd| command has been used for a window, the specified directory
+becomes the current directory for that window. Windows where the |:lcd|
+command has not been used stick to the global or tab-local current directory.
+When jumping to another window the current directory is changed to the last
+specified local current directory. If none was specified, the global or
+tab-local current directory is used. When creating a new window it inherits
+the local directory of the current window.
+
+When a |:tcd| command has been used for a tab page, the specified directory
+becomes the current directory for the current tab page and the current window.
+The current directory of other tab pages is not affected. When jumping to
+another tab page, the current directory is changed to the last specified local
+directory for that tab page. If the current tab has no local current directory
+the global current directory is used.
+
+When a |:cd| command is used, the current window and tab page will lose the
+local current directory and will use the global current directory from now on.
+
+After using |:cd| the full path name will be used for reading and writing
+files. On some networked file systems this may cause problems. The result of
+using the full path name is that the file names currently in use will remain
+referring to the same file. Example: If you have a file a:test and a
+directory a:vim the commands ":e test" ":cd vim" ":w" will overwrite the file
+a:test and not write a:vim/test. But if you do ":w test" the file a:vim/test
+will be written, because you gave a new file name and did not refer to a
+filename before the ":cd".
+
+==============================================================================
+8. Editing binary files *edit-binary*
+
+Although Vim was made to edit text files, it is possible to edit binary
+files. The |-b| Vim argument (b for binary) makes Vim do file I/O in binary
+mode, and sets some options for editing binary files ('binary' on, 'textwidth'
+to 0, 'modeline' off, 'expandtab' off). Setting the 'binary' option has the
+same effect. Don't forget to do this before reading the file.
+
+There are a few things to remember when editing binary files:
+- When editing executable files the number of bytes must not change.
+ Use only the "R" or "r" command to change text. Do not delete characters
+ with "x" or by backspacing.
+- Set the 'textwidth' option to 0. Otherwise lines will unexpectedly be
+ split in two.
+- When there are not many <EOL>s, the lines will become very long. If you
+ want to edit a line that does not fit on the screen reset the 'wrap' option.
+ Horizontal scrolling is used then. If a line becomes too long (more than
+ about 32767 bytes on the Amiga, much more on 32-bit and 64-bit systems, see
+ |limits|) you cannot edit that line. The line will be split when reading
+ the file. It is also possible that you get an "out of memory" error when
+ reading the file.
+- Make sure the 'binary' option is set BEFORE loading the
+ file. Otherwise both <CR><NL> and <NL> are considered to end a line
+ and when the file is written the <NL> will be replaced with <CR><NL>.
+- <Nul> characters are shown on the screen as ^@. You can enter them with
+ "CTRL-V CTRL-@" or "CTRL-V 000"
+- To insert a <NL> character in the file split a line. When writing the
+ buffer to a file a <NL> will be written for the <EOL>.
+- Vim normally appends an <EOL> at the end of the file if there is none.
+ Setting the 'binary' option prevents this. If you want to add the final
+ <EOL>, set the 'endofline' option. You can also read the value of this
+ option to see if there was an <EOL> for the last line (you cannot see this
+ in the text).
+
+==============================================================================
+9. Encryption *encryption*
+
+Vim is able to write files encrypted, and read them back. The encrypted text
+cannot be read without the right key.
+{only available when compiled with the |+cryptv| feature} *E833*
+
+The text in the swap file and the undo file is also encrypted. *E843*
+However, this is done block-by-block and may reduce the time needed to crack a
+password. You can disable the swap file, but then a crash will cause you to
+lose your work. The undo file can be disabled without too much disadvantage. >
+ :set noundofile
+ :noswapfile edit secrets
+
+Note: The text in memory is not encrypted. A system administrator may be able
+to see your text while you are editing it. When filtering text with
+":!filter" or using ":w !command" the text is also not encrypted, this may
+reveal it to others. The 'viminfo' file is not encrypted.
+
+You could do this to edit very secret text: >
+ :set noundofile viminfo=
+ :noswapfile edit secrets.txt
+Keep in mind that without a swap file you risk losing your work in the event
+of a crash or a power failure.
+
+WARNING: If you make a typo when entering the key and then write the file and
+exit, the text will be lost!
+
+The normal way to work with encryption, is to use the ":X" command, which will
+ask you to enter a key. A following write command will use that key to
+encrypt the file. If you later edit the same file, Vim will ask you to enter
+a key. If you type the same key as that was used for writing, the text will
+be readable again. If you use a wrong key, it will be a mess.
+
+ *:X*
+:X Prompt for an encryption key. The typing is done without showing the
+ actual text, so that someone looking at the display won't see it.
+ The typed key is stored in the 'key' option, which is used to encrypt
+ the file when it is written.
+ The file will remain unchanged until you write it. Note that commands
+ such as `:xit` and `ZZ` will NOT write the file unless there are other
+ changes.
+ See also |-x|.
+
+The value of the 'key' options is used when text is written. When the option
+is not empty, the written file will be encrypted, using the value as the
+encryption key. A magic number is prepended, so that Vim can recognize that
+the file is encrypted.
+
+To disable the encryption, reset the 'key' option to an empty value: >
+ :set key=
+
+You can use the 'cryptmethod' option to select the type of encryption, use one
+of these: >
+ :setlocal cm=zip " weak method, backwards compatible
+ :setlocal cm=blowfish " method with flaws
+ :setlocal cm=blowfish2 " medium strong method
+
+Do this before writing the file. When reading an encrypted file it will be
+set automatically to the method used when that file was written. You can
+change 'cryptmethod' before writing that file to change the method.
+
+To set the default method, used for new files, use this in your |vimrc|
+file: >
+ set cm=blowfish2
+Using "blowfish2" is highly recommended. Only use another method if you
+must use an older Vim version that does not support it.
+
+The message given for reading and writing a file will show "[crypted]" when
+using zip, "[blowfish]" when using blowfish, etc.
+
+When writing an undo file, the same key and method will be used for the text
+in the undo file. |persistent-undo|.
+
+To test for blowfish support you can use these conditions: >
+ has('crypt-blowfish')
+ has('crypt-blowfish2')
+This works since Vim 7.4.1099 while blowfish support was added earlier.
+Thus the condition failing doesn't mean blowfish is not supported. You can
+test for blowfish with: >
+ v:version >= 703
+And for blowfish2 with: >
+ v:version > 704 || (v:version == 704 && has('patch401'))
+If you are sure Vim includes patch 7.4.237 a simpler check is: >
+ has('patch-7.4.401')
+<
+ *E817* *E818* *E819* *E820*
+When encryption does not work properly, you would be able to write your text
+to a file and never be able to read it back. Therefore a test is performed to
+check if the encryption works as expected. If you get one of these errors
+don't write the file encrypted! You need to rebuild the Vim binary to fix
+this.
+
+*E831* This is an internal error, "cannot happen". If you can reproduce it,
+please report to the developers.
+
+When reading a file that has been encrypted and the 'key' option is not empty,
+it will be used for decryption. If the value is empty, you will be prompted
+to enter the key. If you don't enter a key, or you enter the wrong key, the
+file is edited without being decrypted. There is no warning about using the
+wrong key (this makes brute force methods to find the key more difficult).
+
+If want to start reading a file that uses a different key, set the 'key'
+option to an empty string, so that Vim will prompt for a new one. Don't use
+the ":set" command to enter the value, other people can read the command over
+your shoulder.
+
+Since the value of the 'key' option is supposed to be a secret, its value can
+never be viewed. You should not set this option in a vimrc file.
+
+An encrypted file can be recognized by the "file" command, if you add these
+lines to "/etc/magic", "/usr/share/misc/magic" or wherever your system has the
+"magic" file: >
+ 0 string VimCrypt~ Vim encrypted file
+ >9 string 01 - "zip" cryptmethod
+ >9 string 02 - "blowfish" cryptmethod
+ >9 string 03 - "blowfish2" cryptmethod
+
+Notes:
+- Encryption is not possible when doing conversion with 'charconvert'.
+- Text you copy or delete goes to the numbered registers. The registers can
+ be saved in the .viminfo file, where they could be read. Change your
+ 'viminfo' option to be safe.
+- Someone can type commands in Vim when you walk away for a moment, he should
+ not be able to get the key.
+- If you make a typing mistake when entering the key, you might not be able to
+ get your text back!
+- If you type the key with a ":set key=value" command, it can be kept in the
+ history, showing the 'key' value in a viminfo file.
+- There is never 100% safety. The encryption in Vim has not been tested for
+ robustness.
+- The algorithm used for 'cryptmethod' "zip" is breakable. A 4 character key
+ in about one hour, a 6 character key in one day (on a Pentium 133 PC). This
+ requires that you know some text that must appear in the file. An expert
+ can break it for any key. When the text has been decrypted, this also means
+ that the key can be revealed, and other files encrypted with the same key
+ can be decrypted.
+- Pkzip uses the same encryption as 'cryptmethod' "zip", and US Govt has no
+ objection to its export. Pkzip's public file APPNOTE.TXT describes this
+ algorithm in detail.
+- The implementation of 'cryptmethod' "blowfish" has a flaw. It is possible
+ to crack the first 64 bytes of a file and in some circumstances more of the
+ file. Use of it is not recommended, but it's still the strongest method
+ supported by Vim 7.3 and 7.4. The "zip" method is even weaker.
+- Vim originates from the Netherlands. That is where the sources come from.
+ Thus the encryption code is not exported from the USA.
+
+==============================================================================
+10. Timestamps *timestamp* *timestamps*
+
+Vim remembers the modification timestamp, mode and size of a file when you
+begin editing it. This is used to avoid that you have two different versions
+of the same file (without you knowing this).
+
+After a shell command is run (|:!cmd| |suspend| |:read!| |K|) timestamps,
+file modes and file sizes are compared for all buffers in a window. Vim will
+run any associated |FileChangedShell| autocommands or display a warning for
+any files that have changed. In the GUI this happens when Vim regains input
+focus.
+
+ *E321* *E462*
+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.
+ *ignore-timestamp*
+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.
+
+There is no warning for a directory (e.g., with |netrw-browse|). But you do
+get warned if you started editing a new file and it was created as a directory
+later.
+
+When Vim notices the timestamp of a file has changed, and the file is being
+edited in a buffer but has not changed, Vim checks if the contents of the file
+is equal. This is done by reading the file again (into a hidden buffer, which
+is immediately deleted again) and comparing the text. If the text is equal,
+you will get no warning.
+
+If you don't get warned often enough you can use the following command.
+
+ *:checkt* *:checktime*
+:checkt[ime] Check if any buffers were changed outside of Vim.
+ This checks and warns you if you would end up with two
+ versions of a file.
+ If this is called from an autocommand, a ":global"
+ command or is not typed the actual check is postponed
+ until a moment the side effects (reloading the file)
+ would be harmless.
+ Each loaded buffer is checked for its associated file
+ being changed. If the file was changed Vim will take
+ action. If there are no changes in the buffer and
+ 'autoread' is set, the buffer is reloaded. Otherwise,
+ you are offered the choice of reloading the file. If
+ the file was deleted you get an error message.
+ If the file previously didn't exist you get a warning
+ if it exists now.
+ Once a file has been checked the timestamp is reset,
+ you will not be warned again.
+ Syntax highlighting, marks, diff status,
+ 'fileencoding', 'fileformat' and 'binary' options
+ are not changed. See |v:fcs_choice| to reload these
+ too (for example, if a code formatting tools has
+ changed the file).
+
+:[N]checkt[ime] {filename}
+:[N]checkt[ime] [N]
+ Check the timestamp of a specific buffer. The buffer
+ may be specified by name, number or with a pattern.
+
+
+ *E813* *E814*
+Vim will reload the buffer if you chose to. If a window is visible that
+contains this buffer, the reloading will happen in the context of this window.
+Otherwise a special window is used, so that most autocommands will work. You
+can't close this window. A few other restrictions apply. Best is to make
+sure nothing happens outside of the current buffer. E.g., setting
+window-local options may end up in the wrong window. Splitting the window,
+doing something there and closing it should be OK (if there are no side
+effects from other autocommands). Closing unrelated windows and buffers will
+get you into trouble.
+
+Before writing a file the timestamp is checked. If it has changed, Vim will
+ask if you really want to overwrite the file:
+
+ WARNING: The file has been changed since reading it!!!
+ Do you really want to write to it (y/n)?
+
+If you hit 'y' Vim will continue writing the file. If you hit 'n' the write is
+aborted. If you used ":wq" or "ZZ" Vim will not exit, you will get another
+chance to write the file.
+
+The message would normally mean that somebody has written to the file after
+the edit session started. This could be another person, in which case you
+probably want to check if your changes to the file and the changes from the
+other person should be merged. Write the file under another name and check for
+differences (the "diff" program can be used for this).
+
+It is also possible that you modified the file yourself, from another edit
+session or with another command (e.g., a filter command). Then you will know
+which version of the file you want to keep.
+
+The accuracy of the time check depends on the filesystem. On Unix it is
+usually sub-second. With old file systems and on MS-Windows it is normally one
+second. Use `has('nanotime')` to check if sub-second time stamp checks are
+available.
+
+There is one situation where you get the message while there is nothing wrong:
+On a Win32 system on the day daylight saving time starts. There is something
+in the Win32 libraries that confuses Vim about the hour time difference. The
+problem goes away the next day.
+
+==============================================================================
+11. File Searching *file-searching*
+
+The file searching is currently used for the 'path', 'cdpath' and 'tags'
+options, for |finddir()| and |findfile()|. Other commands use |wildcards|
+which is slightly different.
+
+There are three different types of searching:
+
+1) Downward search: *starstar*
+ Downward search uses the wildcards '*', '**' and possibly others
+ supported by your operating system. '*' and '**' are handled inside Vim,
+ so they work on all operating systems. Note that "**" only acts as a
+ special wildcard when it is at the start of a name.
+
+ The usage of '*' is quite simple: It matches 0 or more characters. In a
+ search pattern this would be ".*". Note that the "." is not used for file
+ searching.
+
+ '**' is more sophisticated:
+ - It ONLY matches directories.
+ - It matches up to 30 directories deep by default, so you can use it to
+ search an entire directory tree
+ - The maximum number of levels matched can be given by appending a number
+ to '**'.
+ Thus '/usr/**2' can match: >
+ /usr
+ /usr/include
+ /usr/include/sys
+ /usr/include/g++
+ /usr/lib
+ /usr/lib/X11
+ ....
+< It does NOT match '/usr/include/g++/std' as this would be three
+ levels.
+ The allowed number range is 0 ('**0' is removed) to 100
+ If the given number is smaller than 0 it defaults to 30, if it's
+ bigger than 100 then 100 is used. The system also has a limit on the
+ path length, usually 256 or 1024 bytes.
+ - '**' can only be at the end of the path or be followed by a path
+ separator or by a number and a path separator.
+
+ You can combine '*' and '**' in any order: >
+ /usr/**/sys/*
+ /usr/*tory/sys/**
+ /usr/**2/sys/*
+
+2) Upward search:
+ Here you can give a directory and then search the directory tree upward for
+ a file. You could give stop-directories to limit the upward search. The
+ stop-directories are appended to the path (for the 'path' option) or to
+ the filename (for the 'tags' option) with a ';'. If you want several
+ stop-directories separate them with ';'. If you want no stop-directory
+ ("search upward till the root directory) just use ';'. >
+ /usr/include/sys;/usr
+< will search in: >
+ /usr/include/sys
+ /usr/include
+ /usr
+<
+ If you use a relative path the upward search is started in Vim's current
+ directory or in the directory of the current file (if the relative path
+ starts with './' and 'd' is not included in 'cpoptions').
+
+ If Vim's current path is /u/user_x/work/release and you do >
+ :set path=include;/u/user_x
+< and then search for a file with |gf| the file is searched in: >
+ /u/user_x/work/release/include
+ /u/user_x/work/include
+ /u/user_x/include
+
+< Note: If your 'path' setting includes a non-existing directory, Vim will
+ skip the non-existing directory, and also does not search in the parent of
+ the non-existing directory if upwards searching is used.
+
+3) Combined up/downward search:
+ If Vim's current path is /u/user_x/work/release and you do >
+ set path=**;/u/user_x
+< and then search for a file with |gf| the file is searched in: >
+ /u/user_x/work/release/**
+ /u/user_x/work/**
+ /u/user_x/**
+<
+ BE CAREFUL! This might consume a lot of time, as the search of
+ '/u/user_x/**' includes '/u/user_x/work/**' and
+ '/u/user_x/work/release/**'. So '/u/user_x/work/release/**' is searched
+ three times and '/u/user_x/work/**' is searched twice.
+
+ In the above example you might want to set path to: >
+ :set path=**,/u/user_x/**
+< This searches:
+ /u/user_x/work/release/** ~
+ /u/user_x/** ~
+ 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
+ with depth limiter (/usr/**2) or upward search (;) notations.
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
new file mode 100644
index 0000000..84f5f5f
--- /dev/null
+++ b/runtime/doc/eval.txt
@@ -0,0 +1,4763 @@
+*eval.txt* For Vim version 9.0. Last change: 2023 Feb 25
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Expression evaluation *expression* *expr* *E15* *eval*
+ *E1002*
+Using expressions is introduced in chapter 41 of the user manual |usr_41.txt|.
+
+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|.
+
+This file is mainly about the backwards compatible (legacy) Vim script. For
+specifics of Vim9 script, which can execute much faster, supports type
+checking and much more, see |vim9.txt|. Where the syntax or semantics differ
+a remark is given.
+
+1. Variables |variables|
+ 1.1 Variable types
+ 1.2 Function references |Funcref|
+ 1.3 Lists |Lists|
+ 1.4 Dictionaries |Dictionaries|
+ 1.5 Blobs |Blobs|
+ 1.6 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. Vim script version |vimscript-version|
+11. No +eval feature |no-eval-feature|
+12. The sandbox |eval-sandbox|
+13. Textlock |textlock|
+
+Testing support is documented in |testing.txt|.
+Profiling is documented at |profiling|.
+
+==============================================================================
+1. Variables *variables*
+
+1.1 Variable types ~
+ *E712* *E896* *E897* *E899* *E1098*
+ *E1107* *E1135* *E1138*
+There are ten types of variables:
+
+ *Number* *Integer*
+Number A 32 or 64 bit signed number. |expr-number|
+ The number of bits is available in |v:numbersize|.
+ Examples: -123 0x10 0177 0o177 0b1011
+
+Float A floating point number. |floating-point-format| *Float*
+ Examples: 123.456 1.15e-6 -1.1e3
+
+String A NUL terminated string of 8-bit unsigned characters (bytes).
+ |expr-string| Examples: "ab\txx\"--" 'x-z''a,c'
+
+List An ordered sequence of items, see |List| for details.
+ Example: [1, 2, ['a', 'b']]
+
+Dictionary An associative, unordered array: Each entry has a key and a
+ value. |Dictionary|
+ Examples:
+ {'blue': "#0000ff", 'red': "#ff0000"}
+ #{blue: "#0000ff", red: "#ff0000"}
+
+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)
+
+Special |v:false|, |v:true|, |v:none| and |v:null|. *Special*
+
+Job Used for a job, see |job_start()|. *Job* *Jobs*
+
+Channel Used for a channel, see |ch_open()|. *Channel* *Channels*
+
+Blob Binary Large Object. Stores any sequence of bytes. See |Blob|
+ for details
+ Example: 0zFF00ED015DAF
+ 0z is an empty Blob.
+
+The Number and String types are converted automatically, depending on how they
+are used.
+
+Conversion from a Number to a String is by making the ASCII representation of
+the Number. Examples:
+ Number 123 --> String "123" ~
+ Number 0 --> String "0" ~
+ Number -1 --> String "-1" ~
+ *octal*
+Conversion from a String to a Number only happens in legacy Vim script, not in
+Vim9 script. It is done by converting the first digits to a number.
+Hexadecimal "0xf9", Octal "017" or "0o17", and Binary "0b10"
+numbers are recognized
+NOTE: when using |Vim9| script or |scriptversion-4| octal with a leading "0"
+is not recognized. The 0o notation requires patch 8.2.0886.
+If the String doesn't start with digits, the result is zero.
+Examples:
+ String "456" --> Number 456 ~
+ String "6bar" --> Number 6 ~
+ String "foo" --> Number 0 ~
+ String "0xf1" --> Number 241 ~
+ String "0100" --> Number 64 ~
+ String "0o100" --> Number 64 ~
+ String "0b101" --> Number 5 ~
+ String "-8" --> Number -8 ~
+ String "+8" --> Number 0 ~
+
+To force conversion from String to Number, add zero to it: >
+ :echo "0100" + 0
+< 64 ~
+
+To avoid a leading zero to cause octal conversion, or for using a different
+base, use |str2nr()|.
+
+ *TRUE* *FALSE* *Boolean*
+For boolean operators Numbers are used. Zero is FALSE, non-zero is TRUE.
+You can also use |v:false| and |v:true|, in Vim9 script |false| and |true|.
+When TRUE is returned from a function it is the Number one, FALSE is the
+number zero.
+
+Note that in the command: >
+ :if "foo"
+ :" 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")
+
+< *falsy* *truthy*
+An expression can be used as a condition, ignoring the type and only using
+whether the value is "sort of true" or "sort of false". Falsy is:
+ the number zero
+ empty string, blob, list or dictionary
+Other values are truthy. Examples:
+ 0 falsy
+ 1 truthy
+ -1 truthy
+ 0.0 falsy
+ 0.1 truthy
+ '' falsy
+ 'x' truthy
+ [] falsy
+ [0] truthy
+ {} falsy
+ #{x: 1} truthy
+ 0z falsy
+ 0z00 truthy
+
+ *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.
+
+ *E611* *E745* *E728* *E703* *E729* *E730* *E731* *E908* *E910*
+ *E913* *E974* *E975* *E976* *E1319* *E1320* *E1321* *E1322*
+ *E1323* *E1324*
+|List|, |Dictionary|, |Funcref|, |Job|, |Channel|, |Blob|, |Class| and
+|object| types are not automatically converted.
+
+ *E805* *E806* *E808*
+When mixing Number and Float the Number is converted to Float. Otherwise
+there is no automatic conversion of Float. You can use str2float() for String
+to Float, printf() for Float to String and float2nr() for Float to Number.
+
+ *E362* *E891* *E892* *E893* *E894* *E907* *E911* *E914*
+When expecting a Float a Number can also be used, but nothing else.
+
+ *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* *E1192*
+A Funcref variable is obtained with the |function()| function, the |funcref()|
+function, (in |Vim9| script) the name of a 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 in |Vim9| script: >
+
+ :var Fn = MyFunc
+ :echo Fn()
+
+Legacy script: >
+ :let Fn = function("MyFunc")
+ :echo Fn()
+< *E704* *E705* *E707*
+A Funcref variable must start with a capital, "s:", "w:", "t:" or "b:". You
+can use "g:" but the following name must still start with a capital. You
+cannot have both a Funcref variable and a function with the same name.
+
+A special case is defining a function and directly assigning its Funcref to a
+Dictionary entry. Example: >
+ :function dict.init() dict
+ : let self.val = 0
+ :endfunction
+
+The key of the Dictionary can start with a lower case letter. The actual
+function name is not used here. Also see |numbered-function|.
+
+A Funcref can also be used with the |:call| command: >
+ :call Fn()
+ :call dict.init()
+
+The name of the referenced function can be obtained with |string()|. >
+ :let func = string(Fn)
+
+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() or funcref(). When calling the function the Dictionary and/or
+arguments will be passed to the function. Example: >
+
+ let Cb = function('Callback', ['foo'], myDict)
+ call Cb('bar')
+
+This will invoke the function as if using: >
+ call myDict.Callback('foo', 'bar')
+
+This is very useful when passing a function around, e.g. in the arguments of
+|ch_open()|.
+
+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 making 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 ~
+ *list* *List* *Lists* *E686*
+A List is an ordered sequence of items. An item can be of any type. Items
+can be accessed by their index number. Items can be added and removed at any
+position in the sequence.
+
+
+List creation ~
+ *E696* *E697*
+A List is created with a comma-separated list of items in square brackets.
+Examples: >
+ :let mylist = [1, two, 3, "four"]
+ :let emptylist = []
+
+An item can be any expression. Using a List for an item creates a
+List of Lists: >
+ :let nestlist = [[11, 12], [21, 22], [31, 32]]
+
+An extra comma after the last item is ignored.
+
+
+List index ~
+ *list-index* *E684*
+An item in the List can be accessed by putting the index in square brackets
+after the List. Indexes are zero-based, thus the first item has index zero. >
+ :let item = mylist[0] " get the first item: 1
+ :let item = mylist[2] " get the third item: 3
+
+When the resulting item is a list this can be repeated: >
+ :let item = nestlist[0][1] " get the first list, second item: 12
+<
+A negative index is counted from the end. Index -1 refers to the last item in
+the List, -2 to the last but one item, etc. >
+ :let last = mylist[-1] " get the last item: "four"
+
+To avoid an error for an invalid index use the |get()| function. When an item
+is not available it returns zero or the default value you specify: >
+ :echo get(mylist, idx)
+ :echo get(mylist, idx, "NONE")
+
+
+List concatenation ~
+ *list-concatenation*
+Two lists can be concatenated with the "+" operator: >
+ :let longlist = mylist + [5, 6]
+ :let mylist += [7, 8]
+
+To prepend or append an item, turn the item into a list by putting [] around
+it. To change a list in-place, refer to |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"]
+
+Omitting the first index is similar to zero. Omitting the last index is
+similar to -1. >
+ :let endlist = mylist[2:] " from item 2 to the end: [3, "four"]
+ :let shortlist = mylist[2:2] " List with one item: [3]
+ :let otherlist = mylist[:] " make a copy of the List
+
+Notice that the last index is inclusive. If you prefer using an exclusive
+index use the |slice()| method.
+
+If the first index is beyond the last item of the List or the second item is
+before the first item, the result is an empty list. There is no error
+message.
+
+If the second index is equal to or greater than the length of the list the
+length minus one is used: >
+ :let mylist = [0, 1, 2, 3]
+ :echo mylist[2:8] " result: [2, 3]
+
+NOTE: mylist[s:e] means using the variable "s:e" as index. Watch out for
+using a single letter variable before the ":". Insert a space when needed:
+mylist[s : e].
+
+
+List identity ~
+ *list-identity*
+When variable "aa" is a list and you assign it to another variable "bb", both
+variables refer to the same list. Thus changing the list "aa" will also
+change "bb": >
+ :let aa = [1, 2, 3]
+ :let bb = aa
+ :call add(aa, 4)
+ :echo bb
+< [1, 2, 3, 4]
+
+Making a copy of a list is done with the |copy()| function. Using [:] also
+works, as explained above. This creates a shallow copy of the list: Changing
+a list item in the list will also change the item in the copied list: >
+ :let aa = [[1, 'a'], 2, 3]
+ :let bb = copy(aa)
+ :call add(aa, 4)
+ :let aa[0][1] = 'aaa'
+ :echo aa
+< [[1, aaa], 2, 3, 4] >
+ :echo bb
+< [[1, aaa], 2, 3]
+
+To make a completely independent list use |deepcopy()|. This also makes a
+copy of the values in the list, recursively. Up to a hundred levels deep.
+
+The operator "is" can be used to check if two variables refer to the same
+List. "isnot" does the opposite. In contrast "==" compares if two lists have
+the same value. >
+ :let alist = [1, 2, 3]
+ :let blist = [1, 2, 3]
+ :echo alist is blist
+< 0 >
+ :echo alist == blist
+< 1
+
+Note about comparing lists: Two lists are considered equal if they have the
+same length and all items compare equal, as with using "==". There is one
+exception: When comparing a number with a string they are considered
+different. There is no automatic type conversion, as with using "==" on
+variables. Example: >
+ echo 4 == "4"
+< 1 >
+ echo [4] == ["4"]
+< 0
+
+Thus comparing Lists is more strict than comparing numbers and strings. You
+can compare simple values this way too by putting them in a list: >
+
+ :let a = 5
+ :let b = "5"
+ :echo a == b
+< 1 >
+ :echo [a] == [b]
+< 0
+
+
+List unpack ~
+
+To unpack the items in a list to individual variables, put the variables in
+square brackets, like list items: >
+ :let [var1, var2] = mylist
+
+When the number of variables does not match the number of items in the list
+this produces an error. To handle any extra items from the list append ";"
+and a variable name: >
+ :let [var1, var2; rest] = mylist
+
+This works like: >
+ :let var1 = mylist[0]
+ :let var2 = mylist[1]
+ :let rest = mylist[2:]
+
+Except that there is no error if there are only two items. "rest" will be an
+empty list then.
+
+
+List modification ~
+ *list-modification*
+To change a specific item of a list use |:let| this way: >
+ :let list[4] = "four"
+ :let listlist[0][3] = item
+
+To change part of a list you can specify the first and last item to be
+modified. The value must at least have the number of items in the range: >
+ :let list[3:5] = [3, 4, 5]
+
+Adding and removing items from a list is done with functions. Here are a few
+examples: >
+ :call insert(list, 'a') " prepend item 'a'
+ :call insert(list, 'a', 3) " insert item 'a' before list[3]
+ :call add(list, "new") " append String item
+ :call add(list, [1, 2]) " append a List as one new item
+ :call extend(list, [1, 2]) " extend the list with two more items
+ :let i = remove(list, 3) " remove item 3
+ :unlet list[3] " idem
+ :let l = remove(list, 3, -1) " remove items 3 to last item
+ :unlet list[3 : ] " idem
+ :call filter(list, 'v:val !~ "x"') " remove items with an 'x'
+
+Changing the order of items in a list: >
+ :call sort(list) " sort a list alphabetically
+ :call reverse(list) " reverse the order of items
+ :call uniq(sort(list)) " sort and remove duplicates
+
+
+For loop ~
+
+The |:for| loop executes commands for each item in a List, String or Blob.
+A variable is set to each item in sequence. Example with a List: >
+ :for item in mylist
+ : call Doit(item)
+ :endfor
+
+This works like: >
+ :let index = 0
+ :while index < len(mylist)
+ : let item = mylist[index]
+ : :call Doit(item)
+ : let index = index + 1
+ :endwhile
+
+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.
+
+Just like the |:let| command, |:for| also accepts a list of variables. This
+requires the argument to be a List of Lists. >
+ :for [lnum, col] in [[1, 3], [2, 8], [3, 0]]
+ : call Doit(lnum, col)
+ :endfor
+
+This works like a |:let| command is done for each list item. Again, the types
+must remain the same to avoid an error.
+
+It is also possible to put remaining items in a List variable: >
+ :for [i, j; rest] in listlist
+ : call Doit(i, j)
+ : if !empty(rest)
+ : echo "remainder: " .. string(rest)
+ : endif
+ :endfor
+
+For a Blob one byte at a time is used.
+
+For a String one character, including any composing characters, is used as a
+String. Example: >
+ for c in text
+ echo 'This character is ' .. c
+ endfor
+
+
+List functions ~
+ *E714*
+Functions that are useful with a List: >
+ :let r = call(funcname, list) " call a function with an argument list
+ :if empty(list) " check if list is empty
+ :let l = len(list) " number of items in list
+ :let big = max(list) " maximum value in list
+ :let small = min(list) " minimum value in list
+ :let xs = count(list, 'x') " count nr of times 'x' appears in list
+ :let i = index(list, 'x') " index of first 'x' in list
+ :let lines = getline(1, 10) " get ten text lines from buffer
+ :call append('$', lines) " append text lines in buffer
+ :let list = split("a b c") " create list from items in a string
+ :let string = join(list, ', ') " create string from list items
+ :let s = string(list) " String representation of list
+ :call map(list, '">> " .. v:val') " prepend ">> " to each item
+
+Don't forget that a combination of features can make things simple. For
+example, to add up all the numbers in a list: >
+ :exe 'let sum = ' .. join(nrlist, '+')
+
+
+1.4 Dictionaries ~
+ *dict* *Dict* *Dictionaries* *Dictionary*
+A Dictionary is an associative array: Each entry has a key and a value. The
+entry can be located with the key. The entries are stored without a specific
+ordering.
+
+
+Dictionary creation ~
+ *E720* *E721* *E722* *E723*
+A Dictionary is created with a comma-separated list of entries in curly
+braces. Each entry has a key and a value, separated by a colon. Each key can
+only appear once. Examples: >
+ :let mydict = {1: 'one', 2: 'two', 3: 'three'}
+ :let emptydict = {}
+< *E713* *E716* *E717*
+A key is always a String. You can use a Number, it will be converted to a
+String automatically. Thus the String '4' and the number 4 will find the same
+entry. Note that the String '04' and the Number 04 are different, since the
+Number will be converted to the String '4', leading zeros are dropped. The
+empty string can also be used as a key.
+
+In |Vim9| script a literal key can be used if it consists only of alphanumeric
+characters, underscore and dash, see |vim9-literal-dict|.
+ *literal-Dict* *#{}*
+To avoid having to put quotes around every key the #{} form can be used in
+legacy script. This does require the key to consist only of ASCII letters,
+digits, '-' and '_'. Example: >
+ :let mydict = #{zero: 0, one_key: 1, two-key: 2, 333: 3}
+Note that 333 here is the string "333". Empty keys are not possible with #{}.
+In |Vim9| script the #{} form cannot be used because it can be confused with
+the start of a comment.
+
+A value can be any expression. Using a Dictionary for a value creates a
+nested Dictionary: >
+ :let nestdict = {1: {11: 'a', 12: 'b'}, 2: {21: 'c'}}
+
+An extra comma after the last entry is ignored.
+
+
+Accessing entries ~
+
+The normal way to access an entry is by putting the key in square brackets: >
+ :let val = mydict["one"]
+ :let mydict["four"] = 4
+
+You can add new entries to an existing Dictionary this way, unlike Lists.
+
+For keys that consist entirely of letters, digits and underscore the following
+form can be used |expr-entry|: >
+ :let val = mydict.one
+ :let mydict.four = 4
+
+Since an entry can be any type, also a List and a Dictionary, the indexing and
+key lookup can be repeated: >
+ :echo dict.key[idx].key
+
+
+Dictionary to List conversion ~
+
+You may want to loop over the entries in a dictionary. For this you need to
+turn the Dictionary into a List and pass it to |:for|.
+
+Most often you want to loop over the keys, using the |keys()| function: >
+ :for key in keys(mydict)
+ : echo key .. ': ' .. mydict[key]
+ :endfor
+
+The List of keys is unsorted. You may want to sort them first: >
+ :for key in sort(keys(mydict))
+
+To loop over the values use the |values()| function: >
+ :for v in values(mydict)
+ : echo "value: " .. v
+ :endfor
+
+If you want both the key and the value use the |items()| function. It returns
+a List in which each item is a List with two items, the key and the value: >
+ :for [key, value] in items(mydict)
+ : echo key .. ': ' .. value
+ :endfor
+
+
+Dictionary identity ~
+ *dict-identity*
+Just like Lists you need to use |copy()| and |deepcopy()| to make a copy of a
+Dictionary. Otherwise, assignment results in referring to the same
+Dictionary: >
+ :let onedict = {'a': 1, 'b': 2}
+ :let adict = onedict
+ :let adict['a'] = 11
+ :echo onedict['a']
+ 11
+
+Two Dictionaries compare equal if all the key-value pairs compare equal. For
+more info see |list-identity|.
+
+
+Dictionary modification ~
+ *dict-modification*
+To change an already existing entry of a Dictionary, or to add a new entry,
+use |:let| this way: >
+ :let dict[4] = "four"
+ :let dict['one'] = item
+
+Removing an entry from a Dictionary is done with |remove()| or |:unlet|.
+Three ways to remove the entry with key "aaa" from dict: >
+ :let i = remove(dict, 'aaa')
+ :unlet dict.aaa
+ :unlet dict['aaa']
+
+Merging a Dictionary with another is done with |extend()|: >
+ :call extend(adict, bdict)
+This extends adict with all entries from bdict. Duplicate keys cause entries
+in adict to be overwritten. An optional third argument can change this.
+Note that the order of entries in a Dictionary is irrelevant, thus don't
+expect ":echo adict" to show the items from bdict after the older entries in
+adict.
+
+Weeding out entries from a Dictionary can be done with |filter()|: >
+ :call filter(dict, 'v:val =~ "x"')
+This removes all entries from "dict" with a value not matching 'x'.
+This can also be used to remove all entries: >
+ call filter(dict, 0)
+
+In some situations it is not allowed to remove or add entries to a Dictionary.
+Especially when iterating over all the entries. You will get *E1313* or
+another error in that case.
+
+
+Dictionary function ~
+ *Dictionary-function* *self* *E725* *E862*
+When a function is defined with the "dict" attribute it can be used in a
+special way with a dictionary. Example: >
+ :function Mylen() dict
+ : return len(self.data)
+ :endfunction
+ :let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
+ :echo mydict.len()
+
+This is like a method in object oriented programming. The entry in the
+Dictionary is a |Funcref|. The local variable "self" refers to the dictionary
+the function was invoked from. When using |Vim9| script you can use classes
+and objects, see `:class`.
+
+It is also possible to add a function without the "dict" attribute as a
+Funcref to a Dictionary, but the "self" variable is not available then.
+
+ *numbered-function* *anonymous-function*
+To avoid the extra name for the function it can be defined and directly
+assigned to a Dictionary in this way: >
+ :let mydict = {'data': [0, 1, 2, 3]}
+ :function mydict.len()
+ : return len(self.data)
+ :endfunction
+ :echo mydict.len()
+
+The function will then get a number and the value of dict.len is a |Funcref|
+that references this function. The function can only be used through a
+|Funcref|. It will automatically be deleted when there is no |Funcref|
+remaining that refers to it.
+
+It is not necessary to use the "dict" attribute for a numbered function.
+
+If you get an error for a numbered function, you can find out what it is with
+a trick. Assuming the function is 42, the command is: >
+ :function g:42
+
+
+Functions for Dictionaries ~
+ *E715*
+Functions that can be used with a Dictionary: >
+ :if has_key(dict, 'foo') " TRUE if dict has entry with key "foo"
+ :if empty(dict) " TRUE if dict is empty
+ :let l = len(dict) " number of items in dict
+ :let big = max(dict) " maximum value in dict
+ :let small = min(dict) " minimum value in dict
+ :let xs = count(dict, 'x') " count nr of times 'x' appears in dict
+ :let s = string(dict) " String representation of dict
+ :call map(dict, '">> " .. v:val') " prepend ">> " to each item
+
+
+1.5 Blobs ~
+ *blob* *Blob* *Blobs* *E978*
+A Blob is a binary object. It can be used to read an image from a file and
+send it over a channel, for example.
+
+A Blob mostly behaves like a |List| of numbers, where each number has the
+value of an 8-bit byte, from 0 to 255.
+
+
+Blob creation ~
+
+A Blob can be created with a |blob-literal|: >
+ :let b = 0zFF00ED015DAF
+Dots can be inserted between bytes (pair of hex characters) for readability,
+they don't change the value: >
+ :let b = 0zFF00.ED01.5DAF
+
+A blob can be read from a file with |readfile()| passing the {type} argument
+set to "B", for example: >
+ :let b = readfile('image.png', 'B')
+
+A blob can be read from a channel with the |ch_readblob()| function.
+
+
+Blob index ~
+ *blob-index* *E979*
+A byte in the Blob can be accessed by putting the index in square brackets
+after the Blob. Indexes are zero-based, thus the first byte has index zero. >
+ :let myblob = 0z00112233
+ :let byte = myblob[0] " get the first byte: 0x00
+ :let byte = myblob[2] " get the third byte: 0x22
+
+A negative index is counted from the end. Index -1 refers to the last byte in
+the Blob, -2 to the last but one byte, etc. >
+ :let last = myblob[-1] " get the last byte: 0x33
+
+To avoid an error for an invalid index use the |get()| function. When an item
+is not available it returns -1 or the default value you specify: >
+ :echo get(myblob, idx)
+ :echo get(myblob, idx, 999)
+
+
+Blob iteration ~
+
+The |:for| loop executes commands for each byte of a Blob. The loop variable is
+set to each byte in the Blob. Example: >
+ :for byte in 0z112233
+ : call Doit(byte)
+ :endfor
+This calls Doit() with 0x11, 0x22 and 0x33.
+
+
+Blob concatenation ~
+
+Two blobs can be concatenated with the "+" operator: >
+ :let longblob = myblob + 0z4455
+ :let myblob += 0z6677
+
+To change a blob in-place see |blob-modification| below.
+
+
+Part of a blob ~
+
+A part of the Blob can be obtained by specifying the first and last index,
+separated by a colon in square brackets: >
+ :let myblob = 0z00112233
+ :let shortblob = myblob[1:2] " get 0z1122
+ :let shortblob = myblob[2:-1] " get 0z2233
+
+Omitting the first index is similar to zero. Omitting the last index is
+similar to -1. >
+ :let endblob = myblob[2:] " from item 2 to the end: 0z2233
+ :let shortblob = myblob[2:2] " Blob with one byte: 0z22
+ :let otherblob = myblob[:] " make a copy of the Blob
+
+If the first index is beyond the last byte of the Blob or the second index is
+before the first index, the result is an empty Blob. There is no error
+message.
+
+If the second index is equal to or greater than the length of the list the
+length minus one is used: >
+ :echo myblob[2:8] " result: 0z2233
+
+
+Blob modification ~
+ *blob-modification* *E1182* *E1184*
+To change a specific byte of a blob use |:let| this way: >
+ :let blob[4] = 0x44
+
+When the index is just one beyond the end of the Blob, it is appended. Any
+higher index is an error.
+
+To change a sequence of bytes the [:] notation can be used: >
+ let blob[1:3] = 0z445566
+The length of the replaced bytes must be exactly the same as the value
+provided. *E972*
+
+To change part of a blob you can specify the first and last byte to be
+modified. The value must have the same number of bytes in the range: >
+ :let blob[3:5] = 0z334455
+
+You can also use the functions |add()|, |remove()| and |insert()|.
+
+
+Blob identity ~
+
+Blobs can be compared for equality: >
+ if blob == 0z001122
+And for equal identity: >
+ if blob is otherblob
+< *blob-identity* *E977*
+When variable "aa" is a Blob and you assign it to another variable "bb", both
+variables refer to the same Blob. Then the "is" operator returns true.
+
+When making a copy using [:] or |copy()| the values are the same, but the
+identity is different: >
+ :let blob = 0z112233
+ :let blob2 = blob
+ :echo blob == blob2
+< 1 >
+ :echo blob is blob2
+< 1 >
+ :let blob3 = blob[:]
+ :echo blob == blob3
+< 1 >
+ :echo blob is blob3
+< 0
+
+Making a copy of a Blob is done with the |copy()| function. Using [:] also
+works, as explained above.
+
+
+1.6 More about variables ~
+ *more-variables*
+If you need to know the type of a variable or expression, use the |type()|
+function.
+
+When the '!' flag is included in the 'viminfo' option, global variables that
+start with an uppercase letter, and don't contain a lowercase letter, are
+stored in the viminfo file |viminfo-file|.
+
+When the 'sessionoptions' option contains "global", global variables that
+start with an uppercase letter and contain at least one lowercase letter are
+stored in the session file |session-file|.
+
+variable name can be stored where ~
+my_var_6 not
+My_Var_6 session file
+MY_VAR_6 viminfo file
+
+
+In legacy script it is possible to form a variable name with curly braces, see
+|curly-braces-names|.
+
+==============================================================================
+2. Expression syntax *expression-syntax*
+ *E1143*
+Expression syntax summary, from least to most significant:
+
+|expr1| expr2
+ expr2 ? expr1 : expr1 if-then-else
+
+|expr2| expr3
+ expr3 || expr3 ... logical OR
+
+|expr3| expr4
+ expr4 && expr4 ... logical AND
+
+|expr4| expr5
+ expr5 == expr5 equal
+ expr5 != expr5 not equal
+ expr5 > expr5 greater than
+ expr5 >= expr5 greater than or equal
+ expr5 < expr5 smaller than
+ expr5 <= expr5 smaller than or equal
+ expr5 =~ expr5 regexp matches
+ expr5 !~ expr5 regexp doesn't match
+
+ expr5 ==? expr5 equal, ignoring case
+ expr5 ==# expr5 equal, match case
+ etc. As above, append ? for ignoring case, # for
+ matching case
+
+ expr5 is expr5 same |List|, |Dictionary| or |Blob| instance
+ expr5 isnot expr5 different |List|, |Dictionary| or |Blob|
+ instance
+
+|expr5| expr6 << expr6 bitwise left shift
+ expr6 >> expr6 bitwise right shift
+
+|expr6| expr7
+ expr7 + expr7 ... number addition, list or blob concatenation
+ expr7 - expr7 ... number subtraction
+ expr7 . expr7 ... string concatenation
+ expr7 .. expr7 ... string concatenation
+
+|expr7| expr8
+ expr8 * expr8 ... number multiplication
+ expr8 / expr8 ... number division
+ expr8 % expr8 ... number modulo
+
+|expr8| expr9
+ <type>expr9 type check and conversion (|Vim9| only)
+
+|expr9| expr10
+ ! expr9 logical NOT
+ - expr9 unary minus
+ + expr9 unary plus
+
+|expr10| expr11
+ expr10[expr1] byte of a String or item of a |List|
+ expr10[expr1 : expr1] substring of a String or sublist of a |List|
+ expr10.name entry in a |Dictionary|
+ expr10(expr1, ...) function call with |Funcref| variable
+ expr10->name(expr1, ...) |method| call
+
+|expr11| number number constant
+ "string" string constant, backslash is special
+ 'string' string constant, ' is doubled
+ [expr1, ...] |List|
+ {expr1: expr1, ...} |Dictionary|
+ #{key: expr1, ...} legacy |Dictionary|
+ &option option value
+ (expr1) nested expression
+ variable internal variable
+ va{ria}ble internal variable with curly braces
+ $VAR environment variable
+ @r contents of register 'r'
+ function(expr1, ...) function call
+ func{ti}on(expr1, ...) function call with curly braces
+ {args -> expr1} legacy lambda expression
+ (args) => expr1 Vim9 lambda expression
+
+
+"..." indicates that the operations in this level can be concatenated.
+Example: >
+ &nu || &list && &shell == "csh"
+
+All expressions within one level are parsed from left to right.
+
+Expression nesting is limited to 1000 levels deep (300 when build with MSVC)
+to avoid running out of stack and crashing. *E1169*
+
+
+expr1 *expr1* *ternary* *falsy-operator* *??* *E109*
+-----
+
+The ternary operator: expr2 ? expr1 : expr1
+The falsy operator: expr2 ?? expr1
+
+Ternary operator ~
+
+In legacy script the expression before the '?' is evaluated to a number. If
+it evaluates to |TRUE|, the result is the value of the expression between the
+'?' and ':', otherwise the result is the value of the expression after the
+':'.
+
+In |Vim9| script the first expression must evaluate to a boolean, see
+|vim9-boolean|.
+
+Example: >
+ :echo lnum == 1 ? "top" : lnum
+
+Since the first expression is an "expr2", it cannot contain another ?:. The
+other two expressions can, thus allow for recursive use of ?:.
+Example: >
+ :echo lnum == 1 ? "top" : lnum == 1000 ? "last" : lnum
+
+To keep this readable, using |line-continuation| is suggested: >
+ :echo lnum == 1
+ :\ ? "top"
+ :\ : lnum == 1000
+ :\ ? "last"
+ :\ : lnum
+
+You should always put a space before the ':', otherwise it can be mistaken for
+use in a variable such as "a:1".
+
+Falsy operator ~
+
+This is also known as the "null coalescing operator", but that's too
+complicated, thus we just call it the falsy operator.
+
+The expression before the '??' is evaluated. If it evaluates to
+|truthy|, this is used as the result. Otherwise the expression after the '??'
+is evaluated and used as the result. This is most useful to have a default
+value for an expression that may result in zero or empty: >
+ echo theList ?? 'list is empty'
+ echo GetName() ?? 'unknown'
+
+These are similar, but not equal: >
+ expr2 ?? expr1
+ expr2 ? expr2 : expr1
+In the second line "expr2" is evaluated twice. And in |Vim9| script the type
+of expr2 before "?" must be a boolean.
+
+
+expr2 and expr3 *expr2* *expr3*
+---------------
+
+expr3 || expr3 .. logical OR *expr-barbar*
+expr4 && expr4 .. logical AND *expr-&&*
+
+The "||" and "&&" operators take one argument on each side.
+
+In legacy script the arguments are (converted to) Numbers.
+
+In |Vim9| script the values must be boolean, see |vim9-boolean|. Use "!!" to
+convert any type to a boolean.
+
+The result is:
+ 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: >
+
+ &nu || &list && &shell == "csh"
+
+Note that "&&" takes precedence over "||", so this has the meaning of: >
+
+ &nu || (&list && &shell == "csh")
+
+Once the result is known, the expression "short-circuits", that is, further
+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 |TRUE|,
+so the result must be |TRUE|. Similarly below: >
+
+ echo exists("b") && b == "yes"
+
+This is valid whether "b" has been defined or not. The second clause will
+only be evaluated if "b" has been defined.
+
+
+expr4 *expr4* *E1153*
+-----
+
+expr5 {cmp} expr5
+
+Compare two expr5 expressions. In legacy script the result is a 0 if it
+evaluates to false, or 1 if it evaluates to true. In |Vim9| script the result
+is |true| or |false|.
+
+ *expr-==* *expr-!=* *expr->* *expr->=*
+ *expr-<* *expr-<=* *expr-=~* *expr-!~*
+ *expr-==#* *expr-!=#* *expr->#* *expr->=#*
+ *expr-<#* *expr-<=#* *expr-=~#* *expr-!~#*
+ *expr-==?* *expr-!=?* *expr->?* *expr->=?*
+ *expr-<?* *expr-<=?* *expr-=~?* *expr-!~?*
+ *expr-is* *expr-isnot* *expr-is#* *expr-isnot#*
+ *expr-is?* *expr-isnot?* *E1072*
+ use 'ignorecase' match case ignore case ~
+equal == ==# ==?
+not equal != !=# !=?
+greater than > ># >?
+greater than or equal >= >=# >=?
+smaller than < <# <?
+smaller than or equal <= <=# <=?
+regexp matches =~ =~# =~?
+regexp doesn't match !~ !~# !~?
+same instance is is# is?
+different instance isnot isnot# isnot?
+
+Examples:
+"abc" ==# "Abc" evaluates to 0
+"abc" ==? "Abc" evaluates to 1
+"abc" == "Abc" evaluates to 1 if 'ignorecase' is set, 0 otherwise
+NOTE: In |Vim9| script 'ignorecase' is not used.
+
+ *E691* *E692*
+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", "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
+< *E1037*
+Using "is" or "isnot" with a |List|, |Dictionary| or |Blob| checks whether
+the expressions are referring to the same |List|, |Dictionary| or |Blob|
+instance. A copy of a |List| is different from the original |List|. When
+using "is" without a |List|, |Dictionary| or |Blob|, it is equivalent to
+using "equal", using "isnot" equivalent to using "not equal". Except that
+a different type means the 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.
+In |Vim9| script this doesn't work, two strings are never identical.
+
+In legacy script, when comparing a String with a Number, the String is
+converted to a Number, 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.
+
+In |Vim9| script the types must match.
+
+When comparing two Strings, this is done with strcmp() or stricmp(). This
+results in the mathematical difference (comparing byte values), not
+necessarily the alphabetical difference in the local language.
+
+When using the operators with a trailing '#', or the short version and
+'ignorecase' is off, the comparing is done with strcmp(): case matters.
+
+When using the operators with a trailing '?', or the short version and
+'ignorecase' is set, the comparing is done with stricmp(): case is ignored.
+
+'smartcase' is not used.
+
+The "=~" and "!~" operators match the lefthand argument with the righthand
+argument, which is used as a pattern. See |pattern| for what a pattern is.
+This matching is always done like 'magic' was set and 'cpoptions' is empty, no
+matter what the actual value of 'magic' or 'cpoptions' is. This makes scripts
+portable. To avoid backslashes in the regexp pattern to be doubled, use a
+single-quote string, see |literal-string|.
+Since a string is considered to be a single line, a multi-line pattern
+(containing \n, backslash-n) will not match. However, a literal NL character
+can be matched like an ordinary character. Examples:
+ "foo\nbar" =~ "\n" evaluates to 1
+ "foo\nbar" =~ "\\n" evaluates to 0
+
+
+expr5 *expr5* *bitwise-shift*
+-----
+expr6 << expr6 bitwise left shift *expr-<<*
+expr6 >> expr6 bitwise right shift *expr->>*
+ *E1282* *E1283*
+The "<<" and ">>" operators can be used to perform bitwise left or right shift
+of the left operand by the number of bits specified by the right operand. The
+operands are used as positive numbers. When shifting right with ">>" the
+topmost bit (sometimes called the sign bit) is cleared. If the right operand
+(shift amount) is more than the maximum number of bits in a number
+(|v:numbersize|) the result is zero.
+
+
+expr6 and expr7 *expr6* *expr7* *E1036* *E1051*
+---------------
+expr7 + expr7 Number addition, |List| or |Blob| concatenation *expr-+*
+expr7 - expr7 Number subtraction *expr--*
+expr7 . expr7 String concatenation *expr-.*
+expr7 .. expr7 String concatenation *expr-..*
+
+For |Lists| only "+" is possible and then both expr7 must be a list. The
+result is a new list with the two lists Concatenated.
+
+For String concatenation ".." is preferred, since "." is ambiguous, it is also
+used for |Dict| member access and floating point numbers.
+In |Vim9| script and when |vimscript-version| is 2 or higher, using "." is not
+allowed.
+
+In |Vim9| script the arguments of ".." are converted to String for simple
+types: Number, Float, Special and Bool. For other types |string()| should be
+used.
+
+expr8 * expr8 Number multiplication *expr-star*
+expr8 / expr8 Number division *expr-/*
+expr8 % expr8 Number modulo *expr-%*
+
+In legacy script, for all operators except "." and "..", Strings are converted
+to Numbers.
+
+For bitwise operators see |and()|, |or()| and |xor()|.
+
+Note the difference between "+" and ".." in legacy script:
+ "123" + "456" = 579
+ "123" .. "456" = "123456"
+
+Since '..' has the same precedence as '+' and '-', you need to read: >
+ 1 .. 90 + 90.0
+As: >
+ (1 .. 90) + 90.0
+That works in legacy script, since the String "190" is automatically converted
+to the Number 190, which can be added to the Float 90.0. However: >
+ 1 .. 90 * 90.0
+Should be read as: >
+ 1 .. (90 * 90.0)
+Since '..' has lower precedence than '*'. This does NOT work, since this
+attempts to concatenate a Float and a String.
+
+When dividing a Number by zero the result depends on the value:
+ 0 / 0 = -0x80000000 (like NaN for Float)
+ >0 / 0 = 0x7fffffff (like positive infinity)
+ <0 / 0 = -0x7fffffff (like negative infinity)
+ (before Vim 7.2 it was always 0x7fffffff)
+In |Vim9| script dividing a number by zero is an error. *E1154*
+
+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.
+
+".", ".." and "%" do not work for Float. *E804* *E1035*
+
+
+expr8 *expr8*
+-----
+<type>expr9
+
+This is only available in |Vim9| script, see |type-casting|.
+
+
+expr9 *expr9*
+-----
+! expr9 logical NOT *expr-!*
+- expr9 unary minus *expr-unary--*
++ expr9 unary plus *expr-unary-+*
+
+For '!' |TRUE| becomes |FALSE|, |FALSE| becomes |TRUE| (one).
+For '-' the sign of the number is changed.
+For '+' the number is unchanged. Note: "++" has no effect.
+
+In legacy script a String will be converted to a Number first. Note that if
+the string does not start with a digit you likely don't get what you expect.
+
+In |Vim9| script an error is given when "-" or "+" is used and the type is not
+a number.
+
+In |Vim9| script "!" can be used for any type and the result is always a
+boolean. Use "!!" to convert any type to a boolean, according to whether the
+value is |falsy|.
+
+These three can be repeated and mixed. Examples:
+ !-1 == 0
+ !!8 == 1
+ --9 == 9
+
+
+expr10 *expr10*
+------
+This expression is either |expr11| or a sequence of the alternatives below,
+in any order. E.g., these are all possible:
+ expr10[expr1].name
+ expr10.name[expr1]
+ expr10(expr1, ...)[expr1].name
+ expr10->(expr1, ...)[expr1]
+Evaluation is always from left to right.
+
+expr10[expr1] item of String or |List| *expr-[]* *E111*
+ *E909* *subscript* *E1062*
+In legacy Vim script:
+If expr10 is a Number or String this results in a String that contains the
+expr1'th single byte from expr10. expr10 is used as a String (a number is
+automatically converted to a String), expr1 as a Number. This doesn't
+recognize multibyte encodings, see `byteidx()` for an alternative, or use
+`split()` to turn the string into a list of characters. Example, to get the
+byte under the cursor: >
+ :let c = getline(".")[col(".") - 1]
+
+In |Vim9| script: *E1147* *E1148*
+If expr10 is a String this results in a String that contains the expr1'th
+single character (including any composing characters) from expr10. To use byte
+indexes use |strpart()|.
+
+Index zero gives the first byte or character. Careful: text column numbers
+start with one!
+
+If the length of the String is less than the index, the result is an empty
+String. A negative index always results in an empty string (reason: backward
+compatibility). Use [-1:] to get the last byte or character.
+In Vim9 script a negative index is used like with a list: count from the end.
+
+If expr10 is a |List| then it results the item at index expr1. See |list-index|
+for possible index values. If the index is out of range this results in an
+error. Example: >
+ :let item = mylist[-1] " get last item
+
+Generally, if a |List| index is equal to or higher than the length of the
+|List|, or more negative than the length of the |List|, this results in an
+error.
+
+
+expr10[expr1a : expr1b] substring or |sublist| *expr-[:]* *substring*
+
+If expr10 is a String this results in the substring with the bytes or
+characters from expr1a to and including expr1b. expr10 is used as a String,
+expr1a and expr1b are used as a Number.
+
+In legacy Vim script the indexes are byte indexes. This doesn't recognize
+multibyte encodings, see |byteidx()| for computing the indexes. If expr10 is
+a Number it is first converted to a String.
+
+In Vim9 script the indexes are character indexes and include composing
+characters. To use byte indexes use |strpart()|. To use character indexes
+without including composing characters use |strcharpart()|.
+
+The item at index expr1b is included, it is inclusive. For an exclusive index
+use the |slice()| function.
+
+If expr1a is omitted zero is used. If expr1b is omitted the length of the
+string minus one is used.
+
+A negative number can be used to measure from the end of the string. -1 is
+the last character, -2 the last but one, etc.
+
+If an index goes out of range for the string characters are omitted. If
+expr1b is smaller than expr1a the result is an empty string.
+
+Examples: >
+ :let c = name[-1:] " last byte of a string
+ :let c = name[0:-1] " the whole string
+ :let c = name[-2:-2] " last but one byte of a string
+ :let s = line(".")[4:] " from the fifth byte to the end
+ :let s = s[:-3] " remove last two bytes
+<
+ *slice*
+If expr10 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. 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
+
+If expr10 is a |Blob| this results in a new |Blob| with the bytes in the
+indexes expr1a and expr1b, inclusive. Examples: >
+ :let b = 0zDEADBEEF
+ :let bs = b[1:2] " 0zADBE
+ :let bs = b[:] " copy of 0zDEADBEEF
+
+Using expr10[expr1] or expr10[expr1a : expr1b] on a |Funcref| results in an
+error.
+
+Watch out for confusion between a namespace and a variable followed by a colon
+for a sublist: >
+ mylist[n:] " uses variable n
+ mylist[s:] " uses namespace s:, error!
+
+
+expr10.name entry in a |Dictionary| *expr-entry*
+ *E1203* *E1229*
+If expr10 is a |Dictionary| and it is followed by a dot, then the following
+name will be used as a key in the |Dictionary|. This is just like:
+expr10[name].
+
+The name must consist of alphanumeric characters, just like a variable name,
+but it may start with a number. Curly braces cannot be used.
+
+There must not be white space before or after the dot.
+
+Examples: >
+ :let dict = {"one": 1, 2: "two"}
+ :echo dict.one " shows "1"
+ :echo dict.2 " shows "two"
+ :echo dict .2 " error because of space before the dot
+
+Note that the dot is also used for String concatenation. To avoid confusion
+always put spaces around the dot for String concatenation.
+
+
+expr10(expr1, ...) |Funcref| function call *E1085*
+
+When expr10 is a |Funcref| type variable, invoke the function it refers to.
+
+
+expr10->name([args]) method call *method* *->*
+expr10->{lambda}([args])
+ *E260* *E276* *E1265*
+For methods that are also available as global functions this is the same as: >
+ name(expr10 [, args])
+There can also be methods specifically for the type of "expr10".
+
+This allows for chaining, passing the value that one method returns to the
+next method: >
+ mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
+<
+Example of using a lambda: >
+ GetPercentage()->{x -> x * 100}()->printf('%d%%')
+<
+When using -> the |expr9| operators will be applied first, thus: >
+ -1.234->string()
+Is equivalent to: >
+ (-1.234)->string()
+And NOT: >
+ -(1.234->string())
+
+What comes after "->" can be a name, a simple expression (not containing any
+parenthesis), or any expression in parentheses: >
+ base->name(args)
+ base->some.name(args)
+ base->alist[idx](args)
+ base->(getFuncRef())(args)
+Note that in the last call the base is passed to the function resulting from
+"(getFuncRef())", inserted before "args". *E1275*
+
+ *E274*
+"->name(" must not contain white space. There can be white space before the
+"->" and after the "(", thus you can split the lines like this: >
+ mylist
+ \ ->filter(filterexpr)
+ \ ->map(mapexpr)
+ \ ->sort()
+ \ ->join()
+
+When using the lambda form there must be no white space between the } and the
+(.
+
+
+ *expr11*
+number
+------
+number number constant *expr-number*
+
+ *0x* *hex-number* *0o* *octal-number* *binary-number*
+Decimal, Hexadecimal (starting with 0x or 0X), Binary (starting with 0b or 0B)
+and Octal (starting with 0, 0o or 0O).
+
+Assuming 64 bit numbers are used (see |v:numbersize|) an unsigned number is
+truncated to 0x7fffffffffffffff or 9223372036854775807. You can use -1 to get
+0xffffffffffffffff.
+
+ *floating-point-format*
+Floating point numbers can be written in two forms:
+
+ [-+]{N}.{M}
+ [-+]{N}.{M}[eE][-+]{exp}
+
+{N} and {M} are numbers. Both {N} and {M} must be present and can only
+contain digits, except that in |Vim9| script in {N} single quotes between
+digits are ignored.
+[-+] means there is an optional plus or minus sign.
+{exp} is the exponent, power of 10.
+Only a decimal point is accepted, not a comma. No matter what the current
+locale is.
+
+Examples:
+ 123.456
+ +0.0001
+ 55.0
+ -0.123
+ 1.234e03
+ 1.0E-6
+ -3.1416e+88
+
+These are INVALID:
+ 3. empty {M}
+ 1e40 missing .{M}
+
+Rationale:
+Before floating point was introduced, the text "123.456" was interpreted as
+the two numbers "123" and "456", both converted to a string and concatenated,
+resulting in the string "123456". Since this was considered pointless, and we
+could not find it intentionally being used in Vim scripts, this backwards
+incompatibility was accepted in favor of being able to use the normal notation
+for floating point numbers.
+
+ *float-pi* *float-e*
+A few useful values to copy&paste: >
+ :let pi = 3.14159265359
+ :let e = 2.71828182846
+Or, if you don't want to write them in as floating-point literals, you can
+also use functions, like the following: >
+ :let pi = acos(-1.0)
+ :let e = exp(1.0)
+<
+ *floating-point-precision*
+The precision and range of floating points numbers depends on what "double"
+means in the library Vim was compiled with. There is no way to change this at
+runtime.
+
+The default for displaying a |Float| is to use 6 decimal places, like using
+printf("%g", f). You can select something else when using the |printf()|
+function. Example: >
+ :echo printf('%.15e', atan(1))
+< 7.853981633974483e-01
+
+
+
+string *string* *String* *expr-string* *E114*
+------
+"string" string constant *expr-quote*
+
+Note that double quotes are used.
+
+A string constant accepts these special characters:
+\... three-digit octal number (e.g., "\316")
+\.. two-digit octal number (must be followed by non-digit)
+\. one-digit octal number (must be followed by non-digit)
+\x.. byte specified with two hex numbers (e.g., "\x1f")
+\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.... same as \u but allows up to 8 hex numbers.
+\b backspace <BS>
+\e escape <Esc>
+\f formfeed 0x0C
+\n newline <NL>
+\r return <CR>
+\t tab <Tab>
+\\ backslash
+\" double quote
+\<xxx> Special key named "xxx". e.g. "\<C-W>" for CTRL-W. This is for use
+ in mappings, the 0x80 byte is escaped.
+ To use the double quote character it must be escaped: "<M-\">".
+ Don't use <Char-xxxx> to get a UTF-8 character, use \uxxxx as
+ mentioned above.
+\<*xxx> Like \<xxx> but prepends a modifier instead of including it in the
+ character. E.g. "\<C-w>" is one character 0x17 while "\<*C-w>" is four
+ bytes: 3 for the CTRL modifier and then character "W".
+
+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'.
+
+Note that "\000" and "\x00" force the end of the string.
+
+
+blob-literal *blob-literal* *E973*
+------------
+
+Hexadecimal starting with 0z or 0Z, with an arbitrary number of bytes.
+The sequence must be an even number of hex characters. Example: >
+ :let b = 0zFF00ED015DAF
+
+
+literal-string *literal-string* *E115*
+---------------
+'string' string constant *expr-'*
+
+Note that single quotes are used.
+
+This string is taken as it is. No backslashes are removed or have a special
+meaning. The only exception is that two quotes stand for one quote.
+
+Single quoted strings are useful for patterns, so that backslashes do not need
+to be doubled. These two commands are equivalent: >
+ if a =~ "\\s*"
+ if a =~ '\s*'
+
+
+interpolated-string *$quote* *interpolated-string*
+--------------------
+$"string" interpolated string constant *expr-$quote*
+$'string' interpolated literal string constant *expr-$'*
+
+Interpolated strings are an extension of the |string| and |literal-string|,
+allowing the inclusion of Vim script expressions (see |expr1|). Any
+expression returning a value can be enclosed between curly braces. The value
+is converted to a string. All the text and results of the expressions
+are concatenated to make a new string.
+ *E1278* *E1279*
+To include an opening brace '{' or closing brace '}' in the string content
+double it. For double quoted strings using a backslash also works. A single
+closing brace '}' will result in an error.
+
+Examples: >
+ let your_name = input("What's your name? ")
+< What's your name? Peter ~
+>
+ echo
+ echo $"Hello, {your_name}!"
+< Hello, Peter! ~
+>
+ echo $"The square root of {{9}} is {sqrt(9)}"
+< The square root of {9} is 3.0 ~
+
+
+option *expr-option* *E112* *E113*
+------
+&option option value, local value if possible
+&g:option global option value
+&l:option local option value
+
+Examples: >
+ echo "tabstop is " .. &tabstop
+ if &insertmode
+
+Any option name can be used here. See |options|. When using the local value
+and there is no buffer-local or window-local value, the global value is used
+anyway.
+
+
+register *expr-register* *@r*
+--------
+@r contents of register 'r'
+
+The result is the contents of the named register, as a single string.
+Newlines are inserted where required. To get the contents of the unnamed
+register use @" or @@. See |registers| for an explanation of the available
+registers.
+
+When using the '=' register you get the expression itself, not what it
+evaluates to. Use |eval()| to evaluate it.
+
+
+nesting *expr-nesting* *E110*
+-------
+(expr1) nested expression
+
+
+environment variable *expr-env*
+--------------------
+$VAR environment variable
+
+The String value of any environment variable. When it is not defined, the
+result is an empty string.
+
+The functions `getenv()` and `setenv()` can also be used and work for
+environment variables with non-alphanumeric names.
+The function `environ()` can be used to get a Dict with all environment
+variables.
+
+
+ *expr-env-expand*
+Note that there is a difference between using $VAR directly and using
+expand("$VAR"). Using it directly will only expand environment variables that
+are known inside the current Vim session. Using expand() will first try using
+the environment variables known inside the current Vim session. If that
+fails, a shell will be used to expand the variable. This can be slow, but it
+does expand all variables that the shell knows about. Example: >
+ :echo $shell
+ :echo expand("$shell")
+The first one probably doesn't echo anything, the second echoes the $shell
+variable (if your shell supports it).
+
+
+internal variable *expr-variable* *E1015* *E1089*
+-----------------
+variable internal variable
+See below |internal-variables|.
+
+
+function call *expr-function* *E116* *E118* *E119* *E120*
+-------------
+function(expr1, ...) function call
+See below |functions|.
+
+
+lambda expression *expr-lambda* *lambda*
+-----------------
+{args -> expr1} legacy lambda expression *E451*
+(args) => expr1 |Vim9| 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('ignored')
+< error function
+
+The |Vim9| lambda does not only use a different syntax, it also adds type
+checking and can be split over multiple lines, see |vim9-lambda|.
+
+ *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 already 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
+
+Note that the variables must exist in the outer scope before the lambda is
+defined for this to work. 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 Channel, Job and timer: >
+ :let timer = timer_start(500,
+ \ {-> execute("echo 'Handler called'", "")},
+ \ {'repeat': 3})
+< Handler called
+ Handler called
+ Handler called
+
+Note that it is possible to cause memory to be used and not freed if the
+closure is referenced by the context it depends on: >
+ function Function()
+ let x = 0
+ let F = {-> x}
+ endfunction
+The closure uses "x" from the function scope, and "F" in that same scope
+refers to the closure. This cycle results in the memory not being freed.
+Recommendation: don't do this.
+
+Notice how execute() is used to execute an Ex command. That's ugly though.
+In Vim9 script you can use a command block, see |inline-function|.
+
+Although you can use the loop variable of a `for` command, it must still exist
+when the closure is called, otherwise you get an error. *E1302*
+
+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* *E1001*
+
+An internal variable name can be made up of letters, digits and '_'. But it
+cannot start with a digit. In legacy script it is also possible to use curly
+braces, see |curly-braces-names|.
+
+In legacy script an internal variable is created with the ":let" command
+|:let|. An internal variable is explicitly destroyed with the ":unlet"
+command |:unlet|.
+Using a name that is not an internal variable or refers to a variable that has
+been destroyed results in an error.
+
+In |Vim9| script `:let` is not used and variables work differently, see |:var|.
+
+ *variable-scope*
+There are several name spaces for variables. Which one is to be used is
+specified by what is prepended:
+
+ (nothing) In a function: local to the function;
+ in a legacy script: global;
+ in a |Vim9| script: local to the script
+|buffer-variable| b: Local to the current buffer.
+|window-variable| w: Local to the current window.
+|tabpage-variable| t: Local to the current tab page.
+|global-variable| g: Global.
+|local-variable| l: Local to a function (only in a legacy function)
+|script-variable| s: Local to a |:source|'ed Vim script.
+|function-argument| a: Function argument (only in a legacy function).
+|vim-variable| v: Global, predefined by Vim.
+
+The scope name by itself can be used as a |Dictionary|. For example, to
+delete all script-local variables: >
+ :for k in keys(s:)
+ : unlet s:[k]
+ :endfor
+
+Note: in Vim9 script variables can also be local to a block of commands, see
+|vim9-scopes|.
+ *buffer-variable* *b:var* *b:*
+A variable name that is preceded with "b:" is local to the current buffer.
+Thus you can have several "b:foo" variables, one for each buffer.
+This kind of variable is deleted when the buffer is wiped out or deleted with
+|:bdelete|.
+
+One local buffer variable is predefined:
+ *b:changedtick* *changetick*
+b:changedtick The total number of changes to the current buffer. It is
+ incremented for each change. An undo command is also a change
+ in this case. Resetting 'modified' when writing the buffer is
+ also counted.
+ This can be used to perform an action only when the buffer has
+ changed. Example: >
+ :if my_changedtick != b:changedtick
+ : 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.
+
+ *tabpage-variable* *t:var* *t:*
+A variable name that is preceded with "t:" is local to the current tab page,
+It is deleted when the tab page is closed. {not available when compiled
+without the |+windows| feature}
+
+ *global-variable* *g:var* *g:*
+Inside functions and in |Vim9| script global variables are accessed with "g:".
+Omitting this will access a variable local to a function or script. "g:"
+can also be used in any other place if you like.
+
+ *local-variable* *l:var* *l:*
+Inside functions local variables are accessed without prepending anything.
+But you can also prepend "l:" if you like. However, without prepending "l:"
+you may run into reserved variable names. For example "count". By itself it
+refers to "v:count". Using "l:count" you can have a local variable with the
+same name.
+
+ *script-variable* *s:var*
+In a legacy Vim script variables starting with "s:" can be used. They cannot
+be accessed from outside of the scripts, thus are local to the script.
+In |Vim9| script the "s:" prefix can be omitted, variables are script-local by
+default.
+
+They can be used in:
+- commands executed while the script is sourced
+- functions defined in the script
+- autocommands defined in the script
+- functions and autocommands defined in functions and autocommands which were
+ defined in the script (recursively)
+- user defined commands defined in the script
+Thus not in:
+- other scripts sourced from this one
+- mappings
+- menus
+- etc.
+
+Script variables can be used to avoid conflicts with global variable names.
+Take this example: >
+
+ let s:counter = 0
+ function MyCounter()
+ let s:counter = s:counter + 1
+ echo s:counter
+ endfunction
+ command Tick call MyCounter()
+
+You can now invoke "Tick" from any script, and the "s:counter" variable in
+that script will not be changed, only the "s:counter" in the script where
+"Tick" was defined is used.
+
+Another example that does the same: >
+
+ let s:counter = 0
+ command Tick let s:counter = s:counter + 1 | echo s:counter
+
+When calling a function and invoking a user-defined command, the context for
+script variables is set to the script where the function or command was
+defined.
+
+The script variables are also available when a function is defined inside a
+function that is defined in a script. Example: >
+
+ let s:counter = 0
+ function StartCounting(incr)
+ if a:incr
+ function MyCounter()
+ let s:counter = s:counter + 1
+ endfunction
+ else
+ function MyCounter()
+ let s:counter = s:counter - 1
+ endfunction
+ endif
+ endfunction
+
+This defines the MyCounter() function either for counting up or counting down
+when calling StartCounting(). It doesn't matter from where StartCounting() is
+called, the s:counter variable will be accessible in MyCounter().
+
+When the same script is sourced again it will use the same script variables.
+They will remain valid as long as Vim is running. This can be used to
+maintain a counter: >
+
+ if !exists("s:counter")
+ let s:counter = 1
+ echo "script executed for the first time"
+ else
+ let s:counter = s:counter + 1
+ echo "script executed " .. s:counter .. " times now"
+ endif
+
+Note that this means that filetype plugins don't get a different set of script
+variables for each buffer. Use local buffer variables instead |b:var|.
+
+
+PREDEFINED VIM VARIABLES *vim-variable* *v:var* *v:*
+ *E963* *E1063*
+Some variables can be set by the user, but the type cannot be changed.
+
+ *v:argv* *argv-variable*
+v:argv The command line arguments Vim was invoked with. This is a
+ list of strings. The first item is the Vim command.
+ See |v:progpath| for the command with full path.
+
+ *v:beval_col* *beval_col-variable*
+v:beval_col The number of the column, over which the mouse pointer is.
+ This is the byte index in the |v:beval_lnum| line.
+ Only valid while evaluating the 'balloonexpr' option.
+
+ *v:beval_bufnr* *beval_bufnr-variable*
+v:beval_bufnr The number of the buffer, over which the mouse pointer is. Only
+ valid while evaluating the 'balloonexpr' option.
+
+ *v:beval_lnum* *beval_lnum-variable*
+v:beval_lnum The number of the line, over which the mouse pointer is. Only
+ valid while evaluating the 'balloonexpr' option.
+
+ *v:beval_text* *beval_text-variable*
+v:beval_text The text under or after the mouse pointer. Usually a word as
+ it is useful for debugging a C program. 'iskeyword' applies,
+ but a dot and "->" before the position is included. When on a
+ ']' the text before it is used, including the matching '[' and
+ word before it. When on a Visual area within one line the
+ highlighted text is used. Also see |<cexpr>|.
+ Only valid while evaluating the 'balloonexpr' option.
+
+ *v:beval_winnr* *beval_winnr-variable*
+v:beval_winnr The number of the window, over which the mouse pointer is. Only
+ valid while evaluating the 'balloonexpr' option. The first
+ 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>|.
+ It is also used by the |InsertCharPre| and |InsertEnter| events.
+
+ *v:charconvert_from* *charconvert_from-variable*
+v:charconvert_from
+ The name of the character encoding of a file to be converted.
+ Only valid while evaluating the 'charconvert' option.
+
+ *v:charconvert_to* *charconvert_to-variable*
+v:charconvert_to
+ The name of the character encoding of a file after conversion.
+ Only valid while evaluating the 'charconvert' option.
+
+ *v:cmdarg* *cmdarg-variable*
+v:cmdarg This variable is used for two purposes:
+ 1. The extra arguments given to a file read/write command.
+ Currently these are "++enc=" and "++ff=". This variable is
+ set before an autocommand event for a file read/write
+ command is triggered. There is a leading space to make it
+ possible to append this variable directly after the
+ read/write command. Note: The "+cmd" argument isn't
+ included here, because it will be executed anyway.
+ 2. When printing a PostScript file with ":hardcopy" this is
+ the argument for the ":hardcopy" command. This can be used
+ in 'printexpr'.
+
+ *v:cmdbang* *cmdbang-variable*
+v:cmdbang Set like v:cmdarg for a file read/write command. When a "!"
+ was used the value is 1, otherwise it is 0. Note that this
+ can only be used in autocommands. For user commands |<bang>|
+ can be used.
+ *v:collate* *collate-variable*
+v:collate The current locale setting for collation order of the runtime
+ environment. This allows Vim scripts to be aware of the
+ current locale encoding. Technical: it's the value of
+ LC_COLLATE. When not using a locale the value is "C".
+ This variable can not be set directly, use the |:language|
+ command.
+ See |multi-lang|.
+
+ *v:colornames*
+v:colornames A dictionary that maps color names to hex color strings. These
+ color names can be used with the |highlight-guifg|,
+ |highlight-guibg|, and |highlight-guisp| parameters. Updating
+ an entry in v:colornames has no immediate effect on the syntax
+ highlighting. The highlight commands (probably in a
+ colorscheme script) need to be re-evaluated in order to use
+ the updated color values. For example: >
+
+ :let v:colornames['fuscia'] = '#cf3ab4'
+ :let v:colornames['mauve'] = '#915f6d'
+ :highlight Normal guifg=fuscia guibg=mauve
+<
+ This cannot be used to override the |cterm-colors| but it can
+ be used to override other colors. For example, the X11 colors
+ defined in the `colors/lists/default.vim` (previously defined
+ in |rgb.txt|). When defining new color names in a plugin, the
+ recommended practice is to set a color entry only when it does
+ not already exist. For example: >
+
+ :call extend(v:colornames, {
+ \ 'fuscia': '#cf3ab4',
+ \ 'mauve': '#915f6d,
+ \ }, 'keep')
+<
+ Using |extend()| with the 'keep' option updates each color only
+ if it did not exist in |v:colornames|. Doing so allows the
+ user to choose the precise color value for a common name
+ by setting it in their |.vimrc|.
+
+ It is possible to remove entries from this dictionary but
+ doing so is NOT recommended, because it is disruptive to
+ other scripts. It is also unlikely to achieve the desired
+ result because the |:colorscheme| and |:highlight| commands will
+ both automatically load all `colors/lists/default.vim` color
+ scripts.
+
+ *v:completed_item* *completed_item-variable*
+v:completed_item
+ |Dictionary| containing the |complete-items| for the most
+ recently completed word after |CompleteDone|. The
+ |Dictionary| is empty if the completion failed.
+ Note: Plugins can modify the value to emulate the builtin
+ |CompleteDone| event behavior.
+
+ *v:count* *count-variable*
+v:count The count given for the last Normal mode command. Can be used
+ to get the count before a mapping. Read-only. Example: >
+ :map _x :<C-U>echo "the count is " .. v:count<CR>
+< Note: The <C-U> is required to remove the line range that you
+ get when typing ':' after a count.
+ 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, unless
+ |scriptversion| is 3 or higher.
+
+ *v:count1* *count1-variable*
+v:count1 Just like "v:count", but defaults to one when no count is
+ used.
+
+ *v:ctype* *ctype-variable*
+v:ctype The current locale setting for characters of the runtime
+ environment. This allows Vim scripts to be aware of the
+ current locale encoding. Technical: it's the value of
+ LC_CTYPE. When not using a locale the value is "C".
+ This variable can not be set directly, use the |:language|
+ command.
+ See |multi-lang|.
+
+ *v:dying* *dying-variable*
+v:dying Normally zero. When a deadly signal is caught it's set to
+ one. When multiple signals are caught the number increases.
+ Can be used in an autocommand to check if Vim didn't
+ terminate normally. {only works on Unix}
+ Example: >
+ :au VimLeave * if v:dying | echo "\nAAAAaaaarrrggghhhh!!!\n" | endif
+< Note: if another deadly signal is caught when v:dying is one,
+ VimLeave autocommands will not be executed.
+
+ *v:exiting* *exiting-variable*
+v:exiting Vim exit code. Normally zero, non-zero when something went
+ wrong. The value is v:null before invoking the |VimLeavePre|
+ and |VimLeave| autocmds. See |:q|, |:x| and |:cquit|.
+ Example: >
+ :au VimLeave * echo "Exit value is " .. v:exiting
+<
+ *v:echospace* *echospace-variable*
+v:echospace Number of screen cells that can be used for an `:echo` message
+ in the last screen line before causing the |hit-enter-prompt|.
+ Depends on 'showcmd', 'ruler' and 'columns'. You need to
+ check 'cmdheight' for whether there are full-width lines
+ available above the last line.
+
+ *v:errmsg* *errmsg-variable*
+v:errmsg Last given error message. It's allowed to set this variable.
+ Example: >
+ :let v:errmsg = ""
+ :silent! next
+ :if v:errmsg != ""
+ : ... handle error
+< "errmsg" also works, for backwards compatibility, unless
+ |scriptversion| is 3 or higher.
+
+ *v:errors* *errors-variable* *assert-return*
+v:errors Errors found by assert functions, such as |assert_true()|.
+ This is a list of strings.
+ The assert functions append an item when an assert fails.
+ The return value indicates this: a one is returned if an item
+ was added to v:errors, otherwise zero is returned.
+ To remove old results make it empty: >
+ :let v:errors = []
+< If v:errors is set to anything but a list it is made an empty
+ list by the assert function.
+
+ *v:event* *event-variable*
+v:event Dictionary containing information about the current
+ |autocommand|. See the specific event for what it puts in
+ this dictionary.
+ The dictionary is emptied when the |autocommand| finishes,
+ please refer to |dict-identity| for how to get an independent
+ copy of it. Use |deepcopy()| if you want to keep the
+ information after the event triggers. Example: >
+ au TextYankPost * let g:foo = deepcopy(v:event)
+<
+ *v:exception* *exception-variable*
+v:exception The value of the exception most recently caught and not
+ finished. See also |v:throwpoint| and |throw-variables|.
+ Example: >
+ :try
+ : throw "oops"
+ :catch /.*/
+ : echo "caught " .. v:exception
+ :endtry
+< Output: "caught oops".
+
+ *v:false* *false-variable*
+v:false A Number with value zero. Used to put "false" in JSON. See
+ |json_encode()|.
+ When used as a string this evaluates to "v:false". >
+ echo v:false
+< v:false ~
+ That is so that eval() can parse the string back to the same
+ value. Read-only.
+ In |Vim9| script "false" can be used which has a boolean type.
+
+ *v:fcs_reason* *fcs_reason-variable*
+v:fcs_reason The reason why the |FileChangedShell| event was triggered.
+ Can be used in an autocommand to decide what to do and/or what
+ to set v:fcs_choice to. Possible values:
+ deleted file no longer exists
+ conflict file contents, mode or timestamp was
+ changed and buffer is modified
+ changed file contents has changed
+ mode mode of file changed
+ time only file timestamp changed
+
+ *v:fcs_choice* *fcs_choice-variable*
+v:fcs_choice What should happen after a |FileChangedShell| event was
+ triggered. Can be used in an autocommand to tell Vim what to
+ do with the affected buffer:
+ reload Reload the buffer (does not work if
+ the file was deleted).
+ edit Reload the buffer and detect the
+ values for options such as
+ 'fileformat', 'fileencoding', 'binary'
+ (does not work if the file was
+ deleted).
+ ask Ask the user what to do, as if there
+ was no autocommand. Except that when
+ only the timestamp changed nothing
+ will happen.
+ <empty> Nothing, the autocommand should do
+ everything that needs to be done.
+ The default is empty. If another (invalid) value is used then
+ Vim behaves like it is empty, there is no warning message.
+
+ *v:fname* *fname-variable*
+v:fname When evaluating 'includeexpr': the file name that was
+ detected. Empty otherwise.
+
+ *v:fname_in* *fname_in-variable*
+v:fname_in The name of the input file. Valid while evaluating:
+ option used for ~
+ 'charconvert' file to be converted
+ 'diffexpr' original file
+ 'patchexpr' original file
+ 'printexpr' file to be printed
+ And set to the swap file name for |SwapExists|.
+
+ *v:fname_out* *fname_out-variable*
+v:fname_out The name of the output file. Only valid while
+ evaluating:
+ option used for ~
+ 'charconvert' resulting converted file (*)
+ 'diffexpr' output of diff
+ 'patchexpr' resulting patched file
+ (*) When doing conversion for a write command (e.g., ":w
+ file") it will be equal to v:fname_in. When doing conversion
+ for a read command (e.g., ":e file") it will be a temporary
+ file and different from v:fname_in.
+
+ *v:fname_new* *fname_new-variable*
+v:fname_new The name of the new version of the file. Only valid while
+ evaluating 'diffexpr'.
+
+ *v:fname_diff* *fname_diff-variable*
+v:fname_diff The name of the diff (patch) file. Only valid while
+ evaluating 'patchexpr'.
+
+ *v:folddashes* *folddashes-variable*
+v:folddashes Used for 'foldtext': dashes representing foldlevel of a closed
+ fold.
+ Read-only in the |sandbox|. |fold-foldtext|
+
+ *v:foldlevel* *foldlevel-variable*
+v:foldlevel Used for 'foldtext': foldlevel of closed fold.
+ Read-only in the |sandbox|. |fold-foldtext|
+
+ *v:foldend* *foldend-variable*
+v:foldend Used for 'foldtext': last line of closed fold.
+ Read-only in the |sandbox|. |fold-foldtext|
+
+ *v:foldstart* *foldstart-variable*
+v:foldstart Used for 'foldtext': first line of closed fold.
+ Read-only in the |sandbox|. |fold-foldtext|
+
+ *v:hlsearch* *hlsearch-variable*
+v:hlsearch Variable that indicates whether search highlighting is on.
+ Setting it makes sense only if 'hlsearch' is enabled which
+ requires |+extra_search|. Setting this variable to zero acts
+ like the |:nohlsearch| command, setting it to one acts like >
+ let &hlsearch = &hlsearch
+< Note that the value is restored when returning from a
+ function. |function-search-undo|.
+
+ *v:insertmode* *insertmode-variable*
+v:insertmode Used for the |InsertEnter| and |InsertChange| autocommand
+ events. Values:
+ i Insert mode
+ r Replace mode
+ v Virtual Replace mode
+
+ *v:key* *key-variable*
+v:key Key of the current item of a |Dictionary|. Only valid while
+ evaluating the expression used with |map()| and |filter()|.
+ Read-only.
+
+ *v:lang* *lang-variable*
+v:lang The current locale setting for messages of the runtime
+ environment. This allows Vim scripts to be aware of the
+ current language. Technical: it's the value of LC_MESSAGES.
+ The value is system dependent.
+ This variable can not be set directly, use the |:language|
+ command.
+ It can be different from |v:ctype| when messages are desired
+ in a different language than what is used for character
+ encoding. See |multi-lang|.
+
+ *v:lc_time* *lc_time-variable*
+v:lc_time The current locale setting for time messages of the runtime
+ environment. This allows Vim scripts to be aware of the
+ current language. Technical: it's the value of LC_TIME.
+ This variable can not be set directly, use the |:language|
+ command. See |multi-lang|.
+
+ *v:lnum* *lnum-variable*
+v:lnum Line number for the 'foldexpr' |fold-expr|, 'formatexpr' and
+ 'indentexpr' expressions, tab page number for 'guitablabel'
+ and 'guitabtooltip'. Only valid while one of these
+ expressions is being evaluated. Read-only when in the
+ |sandbox|.
+
+ *v:maxcol* *maxcol-variable*
+v:maxcol Maximum line length. Depending on where it is used it can be
+ screen columns, characters or bytes. The value currently is
+ 2147483647 on all systems.
+
+ *v:mouse_win* *mouse_win-variable*
+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
+ value is zero when there was no mouse button click.
+
+ *v:mouse_col* *mouse_col-variable*
+v:mouse_col Column number for a mouse click obtained with |getchar()|.
+ This is the screen column number, like with |virtcol()|. The
+ value is zero when there was no mouse button click.
+
+ *v:none* *none-variable* *None*
+v:none An empty String. Used to put an empty item in JSON. See
+ |json_encode()|.
+ This can also be used as a function argument to use the
+ default value, see |none-function_argument|.
+ When used as a number this evaluates to zero.
+ When used as a string this evaluates to "v:none". >
+ echo v:none
+< v:none ~
+ That is so that eval() can parse the string back to the same
+ value. Read-only.
+ Note that using `== v:none` and `!= v:none` will often give
+ an error. Instead, use `is v:none` and `isnot v:none` .
+
+ *v:null* *null-variable*
+v:null An empty String. Used to put "null" in JSON. See
+ |json_encode()|.
+ When used as a number this evaluates to zero.
+ When used as a string this evaluates to "v:null". >
+ echo v:null
+< v:null ~
+ That is so that eval() can parse the string back to the same
+ value. Read-only.
+ In |Vim9| script `null` can be used without "v:".
+ In some places `v:null` and `null` can be used for a List,
+ Dict, Job, etc. that is not set. That is slightly different
+ than an empty List, Dict, etc.
+
+ *v:numbermax* *numbermax-variable*
+v:numbermax Maximum value of a number.
+
+ *v:numbermin* *numbermin-variable*
+v:numbermin Minimum value of a number (negative).
+
+ *v:numbersize* *numbersize-variable*
+v:numbersize Number of bits in a Number. This is normally 64, but on some
+ systems it may be 32.
+
+ *v:oldfiles* *oldfiles-variable*
+v:oldfiles List of file names that is loaded from the |viminfo| file on
+ startup. These are the files that Vim remembers marks for.
+ The length of the List is limited by the ' argument of the
+ 'viminfo' option (default is 100).
+ When the |viminfo| file is not used the List is empty.
+ Also see |:oldfiles| and |c_#<|.
+ The List can be modified, but this has no effect on what is
+ stored in the |viminfo| file later. If you use values other
+ than String this will cause trouble.
+ {only when compiled with the |+viminfo| feature}
+
+ *v:option_new*
+v:option_new New value of the option. Valid while executing an |OptionSet|
+ autocommand.
+ *v:option_old*
+v:option_old Old value of the option. Valid while executing an |OptionSet|
+ autocommand. Depending on the command used for setting and the
+ kind of option this is either the local old value or the
+ global old value.
+ *v:option_oldlocal*
+v:option_oldlocal
+ Old local value of the option. Valid while executing an
+ |OptionSet| autocommand.
+ *v:option_oldglobal*
+v:option_oldglobal
+ Old global value of the option. Valid while executing an
+ |OptionSet| autocommand.
+ *v:option_type*
+v:option_type Scope of the set command. Valid while executing an
+ |OptionSet| autocommand. Can be either "global" or "local"
+ *v:option_command*
+v:option_command
+ Command used to set the option. Valid while executing an
+ |OptionSet| autocommand.
+ value option was set via ~
+ "setlocal" |:setlocal| or ":let l:xxx"
+ "setglobal" |:setglobal| or ":let g:xxx"
+ "set" |:set| or |:let|
+ "modeline" |modeline|
+ *v:operator* *operator-variable*
+v:operator The last operator given in Normal mode. This is a single
+ character except for commands starting with <g> or <z>,
+ in which case it is two characters. Best used alongside
+ |v:prevcount| and |v:register|. Useful if you want to cancel
+ Operator-pending mode and then use the operator, e.g.: >
+ :omap O <Esc>:call MyMotion(v:operator)<CR>
+< The value remains set until another operator is entered, thus
+ don't expect it to be empty.
+ v:operator is not set for |:delete|, |:yank| or other Ex
+ commands.
+ Read-only.
+
+ *v:prevcount* *prevcount-variable*
+v:prevcount The count given for the last but one Normal mode command.
+ This is the v:count value of the previous command. Useful if
+ you want to cancel Visual or Operator-pending mode and then
+ use the count, e.g.: >
+ :vmap % <Esc>:call MyFilter(v:prevcount)<CR>
+< Read-only.
+
+ *v:profiling* *profiling-variable*
+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 Vim was
+ invoked. Allows you to do special initialisations for |view|,
+ |evim| etc., or any other name you might symlink to Vim.
+ Read-only.
+
+ *v:progpath* *progpath-variable*
+v:progpath Contains the command with which Vim was invoked, in a form
+ that when passed to the shell will run the same Vim executable
+ as the current one (if $PATH remains unchanged).
+ Useful if you want to message a Vim server using a
+ |--remote-expr|.
+ To get the full path use: >
+ echo exepath(v:progpath)
+< If the command has a relative path it will be expanded to the
+ full path, so that it still works after `:cd`. Thus starting
+ "./vim" results in "/home/user/path/to/vim/src/vim".
+ On Linux and other systems it will always be the full path.
+ On Mac it may just be "vim" and using exepath() as mentioned
+ above should be used to get the full path.
+ On MS-Windows the executable may be called "vim.exe", but the
+ ".exe" is not added to v:progpath.
+ Read-only.
+
+ *v:register* *register-variable*
+v:register The name of the register in effect for the current normal mode
+ command (regardless of whether that command actually used a
+ register). Or for the currently executing normal mode mapping
+ (use this in custom commands that take a register).
+ If none is supplied it is the default register '"', unless
+ 'clipboard' contains "unnamed" or "unnamedplus", then it is
+ '*' or '+'.
+ Also see |getreg()| and |setreg()|
+
+ *v:scrollstart* *scrollstart-variable*
+v:scrollstart String describing the script or function that caused the
+ screen to scroll up. It's only set when it is empty, thus the
+ first reason is remembered. It is set to "Unknown" for a
+ typed command.
+ This can be used to find out why your script causes the
+ hit-enter prompt.
+
+ *v:servername* *servername-variable*
+v:servername The resulting registered |client-server-name| if any.
+ 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
+ the last search pattern, see |quote/|.
+ Note that the value is restored when returning from a
+ function. |function-search-undo|.
+ Read-write.
+
+ *v:shell_error* *shell_error-variable*
+v:shell_error Result of the last shell command. When non-zero, the last
+ shell command had an error. When zero, there was no problem.
+ This only works when the shell returns the error code to Vim.
+ The value -1 is often used when the command could not be
+ executed. Read-only.
+ Example: >
+ :!mv foo bar
+ :if v:shell_error
+ : echo 'could not rename "foo" to "bar"!'
+ :endif
+< "shell_error" also works, for backwards compatibility, unless
+ |scriptversion| is 3 or higher.
+
+ *v:sizeofint* *sizeofint-variable*
+v:sizeofint Number of bytes in an int. Depends on how Vim was compiled.
+ This is only useful for deciding whether a test will give the
+ expected result.
+
+ *v:sizeoflong* *sizeoflong-variable*
+v:sizeoflong Number of bytes in a long. Depends on how Vim was compiled.
+ This is only useful for deciding whether a test will give the
+ expected result.
+
+ *v:sizeofpointer* *sizeofpointer-variable*
+v:sizeofpointer Number of bytes in a pointer. Depends on how Vim was compiled.
+ This is only useful for deciding whether a test will give the
+ expected result.
+
+ *v:statusmsg* *statusmsg-variable*
+v:statusmsg Last given status message. It's allowed to set this variable.
+
+ *v:swapname* *swapname-variable*
+v:swapname Only valid when executing |SwapExists| autocommands: Name of
+ the swap file found. Read-only.
+
+ *v:swapchoice* *swapchoice-variable*
+v:swapchoice |SwapExists| autocommands can set this to the selected choice
+ for handling an existing swap file:
+ 'o' Open read-only
+ 'e' Edit anyway
+ 'r' Recover
+ 'd' Delete swapfile
+ 'q' Quit
+ 'a' Abort
+ The value should be a single-character string. An empty value
+ results in the user being asked, as would happen when there is
+ no SwapExists autocommand. The default is empty.
+
+ *v:swapcommand* *swapcommand-variable*
+v:swapcommand Normal mode command to be executed after a file has been
+ opened. Can be used for a |SwapExists| autocommand to have
+ another Vim open the file and jump to the right place. For
+ 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_channel* *t_channel-variable*
+v:t_channel Value of |Channel| 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_job* *t_job-variable*
+v:t_job Value of |Job| type. Read-only. See: |type()|
+ *v:t_list* *t_list-variable*
+v:t_list Value of |List| type. Read-only. See: |type()|
+ *v:t_none* *t_none-variable*
+v:t_none Value of |None| 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:t_blob* *t_blob-variable*
+v:t_blob Value of |Blob| type. Read-only. See: |type()|
+ *v:t_class* *t_class-variable*
+v:t_class Value of |class| type. Read-only. See: |type()|
+ *v:t_object* *t_object-variable*
+v:t_object Value of |object| 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, then '>' or '?' 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. You can use |terminalprops()| to see what Vim
+ figured out about the terminal.
+ The response from a new xterm is: "<Esc>[> Pp ; Pv ; Pc c". Pp
+ is the terminal type: 0 for vt100 and 1 for vt220. Pv is the
+ patch level (since this was introduced in patch 95, it's
+ always 95 or higher). Pc is always zero.
+ If Pv is 141 or higher then Vim will try to request terminal
+ codes. This only works with xterm |xterm-codes|.
+ {only when compiled with |+termresponse| feature}
+
+ *v:termblinkresp*
+v:termblinkresp The escape sequence returned by the terminal for the |t_RC|
+ termcap entry. This is used to find out whether the terminal
+ cursor is blinking. This is used by |term_getcursor()|.
+
+ *v:termstyleresp*
+v:termstyleresp The escape sequence returned by the terminal for the |t_RS|
+ termcap entry. This is used to find out what the shape of the
+ cursor is. This is used by |term_getcursor()|.
+
+ *v:termrbgresp*
+v:termrbgresp The escape sequence returned by the terminal for the |t_RB|
+ termcap entry. This is used to find out what the terminal
+ background color is, see 'background'.
+
+ *v:termrfgresp*
+v:termrfgresp The escape sequence returned by the terminal for the |t_RF|
+ termcap entry. This is used to find out what the terminal
+ foreground color is.
+
+ *v:termu7resp*
+v:termu7resp The escape sequence returned by the terminal for the |t_u7|
+ termcap entry. This is used to find out what the terminal
+ does with ambiguous width characters, see 'ambiwidth'.
+
+ *v:testing* *testing-variable*
+v:testing Must be set before using `test_garbagecollect_now()`.
+ Also, when set certain error messages won't be shown for 2
+ seconds. (e.g. "'dictionary' option is empty")
+
+ *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, unless
+ |scriptversion| is 3 or higher
+
+ *v:throwpoint* *throwpoint-variable*
+v:throwpoint The point where the exception most recently caught and not
+ finished was thrown. Not set when commands are typed. See
+ also |v:exception| and |throw-variables|.
+ Example: >
+ :try
+ : throw "oops"
+ :catch /.*/
+ : echo "Exception from" v:throwpoint
+ :endtry
+< Output: "Exception from test.vim, line 2"
+
+ *v:true* *true-variable*
+v:true A Number with value one. Used to put "true" in JSON. See
+ |json_encode()|.
+ When used as a string this evaluates to "v:true". >
+ echo v:true
+< v:true ~
+ That is so that eval() can parse the string back to the same
+ value. Read-only.
+ In |Vim9| script "true" can be used which has a boolean type.
+ *v:val* *val-variable*
+v:val Value of the current item of a |List| or |Dictionary|. Only
+ valid while evaluating the expression used with |map()| and
+ |filter()|. Read-only.
+
+ *v:version* *version-variable*
+v:version Version number of Vim: Major version number times 100 plus
+ minor version number. Version 5.0 is 500. Version 5.1
+ is 501. Read-only. "version" also works, for backwards
+ compatibility, unless |scriptversion| is 3 or higher.
+ Use |has()| to check if a certain patch was included, e.g.: >
+ if has("patch-7.4.123")
+< Note that patch numbers are specific to the version, thus both
+ version 5.0 and 5.1 may have a patch 123, but these are
+ completely different.
+
+ *v:versionlong* *versionlong-variable*
+v:versionlong Like v:version, but also including the patchlevel in the last
+ four digits. Version 8.1 with patch 123 has value 8010123.
+ This can be used like this: >
+ if v:versionlong >= 8010123
+< However, if there are gaps in the list of patches included
+ this will not work well. This can happen if a recent patch
+ was included into an older version, e.g. for a security fix.
+ Use the has() function to make sure the patch is actually
+ included.
+
+ *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*
+v:windowid When any X11 based GUI is running or when running in a
+ terminal and Vim connects to the X server (|-X|) this will be
+ set to the window ID.
+ When an MS-Windows GUI is running this will be set to the
+ window handle.
+ Otherwise the value is zero.
+ Note: for windows inside Vim use |winnr()| or |win_getid()|,
+ see |window-ID|.
+
+==============================================================================
+4. Builtin Functions *functions*
+
+See |function-list| for a list grouped by what the function is used for.
+
+The alphabetic list of all builtin functions and details are in a separate
+help file: |builtin-functions|.
+
+==============================================================================
+5. Defining functions *user-functions*
+
+New functions can be defined. These can be called just like builtin
+functions. The function takes arguments, executes a sequence of Ex commands
+and can return a value.
+
+You can find most information about defining functions in |userfunc.txt|.
+For Vim9 functions, which execute much faster, support type checking and more,
+see |vim9.txt|.
+
+==============================================================================
+6. Curly braces names *curly-braces-names*
+
+In most places where you can use a variable, you can use a "curly braces name"
+variable. This is a regular variable name with one or more expressions
+wrapped in braces {} like this: >
+ my_{adjective}_variable
+
+This only works in legacy Vim script, not in |Vim9| script.
+
+When Vim encounters this, it evaluates the expression inside the braces, puts
+that in place of the expression, and re-interprets the whole as a variable
+name. So in the above example, if the variable "adjective" was set to
+"noisy", then the reference would be to "my_noisy_variable", whereas if
+"adjective" was set to "quiet", then it would be to "my_quiet_variable".
+
+One application for this is to create a set of variables governed by an option
+value. For example, the statement >
+ echo my_{&background}_message
+
+would output the contents of "my_dark_message" or "my_light_message" depending
+on the current value of 'background'.
+
+You can use multiple brace pairs: >
+ echo my_{adverb}_{adjective}_message
+..or even nest them: >
+ echo my_{ad{end_of_word}}_message
+where "end_of_word" is either "verb" or "jective".
+
+However, the expression inside the braces must evaluate to a valid single
+variable name, e.g. this is invalid: >
+ :let foo='a + b'
+ :echo c{foo}d
+.. since the result of expansion is "ca + bd", which is not a variable name.
+
+ *curly-braces-function-names*
+You can call and define functions by an evaluated name in a similar way.
+Example: >
+ :let func_end='whizz'
+ :call my_func_{func_end}(parameter)
+
+This would call the function "my_func_whizz(parameter)".
+
+This does NOT work: >
+ :let i = 3
+ :let @{i} = '' " error
+ :echo @{i} " error
+
+==============================================================================
+7. Commands *expression-commands*
+
+Note: in |Vim9| script `:let` is not used. `:var` is used for variable
+declarations and assignments do not use a command. |vim9-declaration|
+
+:let {var-name} = {expr1} *:let* *E18*
+ Set internal variable {var-name} to the result of the
+ expression {expr1}. The variable will get the type
+ from the {expr}. If {var-name} didn't exist yet, it
+ is created.
+
+:let {var-name}[{idx}] = {expr1} *E689* *E1141*
+ Set a list item to the result of the expression
+ {expr1}. {var-name} must refer to a list and {idx}
+ must be a valid index in that list. For nested list
+ the index can be repeated.
+ This cannot be used to add an item to a |List|.
+ This cannot be used to set a byte in a String. You
+ can do that like this: >
+ :let var = var[0:2] .. 'X' .. var[4:]
+< When {var-name} is a |Blob| then {idx} can be the
+ length of the blob, in which case one byte is
+ appended.
+
+ *E711* *E719* *E1165* *E1166* *E1183*
+:let {var-name}[{idx1}:{idx2}] = {expr1} *E708* *E709* *E710*
+ Set a sequence of items in a |List| to the result of
+ the expression {expr1}, which must be a list with the
+ correct number of items.
+ {idx1} can be omitted, zero is used instead.
+ {idx2} can be omitted, meaning the end of the list.
+ When the selected range of items is partly past the
+ end of the list, items will be added.
+
+ *:let+=* *:let-=* *:letstar=* *:let/=* *:let%=*
+ *:let.=* *:let..=* *E734* *E985* *E1019*
+:let {var} += {expr1} Like ":let {var} = {var} + {expr1}".
+:let {var} -= {expr1} Like ":let {var} = {var} - {expr1}".
+:let {var} *= {expr1} Like ":let {var} = {var} * {expr1}".
+:let {var} /= {expr1} Like ":let {var} = {var} / {expr1}".
+:let {var} %= {expr1} Like ":let {var} = {var} % {expr1}".
+:let {var} .= {expr1} Like ":let {var} = {var} . {expr1}".
+:let {var} ..= {expr1} Like ":let {var} = {var} .. {expr1}".
+ These fail if {var} was not set yet and when the type
+ of {var} and {expr1} don't fit the operator.
+ `.=` is not supported with Vim script version 2 and
+ later, see |vimscript-version|.
+
+
+:let ${env-name} = {expr1} *:let-environment* *:let-$*
+ Set environment variable {env-name} to the result of
+ the expression {expr1}. The type is always String.
+
+ On some systems making an environment variable empty
+ causes it to be deleted. Many systems do not make a
+ difference between an environment variable that is not
+ set and an environment variable that is empty.
+
+:let ${env-name} .= {expr1}
+ Append {expr1} to the environment variable {env-name}.
+ If the environment variable didn't exist yet this
+ works like "=".
+
+:let @{reg-name} = {expr1} *:let-register* *:let-@*
+ Write the result of the expression {expr1} in register
+ {reg-name}. {reg-name} must be a single letter, and
+ must be the name of a writable register (see
+ |registers|). "@@" can be used for the unnamed
+ register, "@/" for the search pattern.
+ If the result of {expr1} ends in a <CR> or <NL>, the
+ register will be linewise, otherwise it will be set to
+ characterwise.
+ This can be used to clear the last search pattern: >
+ :let @/ = ""
+< This is different from searching for an empty string,
+ that would match everywhere.
+
+:let @{reg-name} .= {expr1}
+ Append {expr1} to register {reg-name}. If the
+ register was empty it's like setting it to {expr1}.
+
+:let &{option-name} = {expr1} *:let-option* *:let-&*
+ Set option {option-name} to the result of the
+ expression {expr1}. A String or Number value is
+ always converted to the type of the option.
+ For an option local to a window or buffer the effect
+ is just like using the |:set| command: both the local
+ value and the global value are changed.
+ Example: >
+ :let &path = &path .. ',/usr/local/include'
+< This also works for terminal codes in the form t_xx.
+ But only for alphanumerical names. Example: >
+ :let &t_k1 = "\<Esc>[234;"
+< When the code does not exist yet it will be created as
+ a terminal key code, there is no error.
+
+:let &{option-name} .= {expr1}
+ For a string option: Append {expr1} to the value.
+ Does not insert a comma like |:set+=|.
+
+:let &{option-name} += {expr1}
+:let &{option-name} -= {expr1}
+ For a number or boolean option: Add or subtract
+ {expr1}.
+
+:let &l:{option-name} = {expr1}
+:let &l:{option-name} .= {expr1}
+:let &l:{option-name} += {expr1}
+:let &l:{option-name} -= {expr1}
+ Like above, but only set the local value of an option
+ (if there is one). Works like |:setlocal|.
+
+:let &g:{option-name} = {expr1}
+:let &g:{option-name} .= {expr1}
+:let &g:{option-name} += {expr1}
+:let &g:{option-name} -= {expr1}
+ Like above, but only set the global value of an option
+ (if there is one). Works like |:setglobal|.
+ *E1093*
+:let [{name1}, {name2}, ...] = {expr1} *:let-unpack* *E687* *E688*
+ {expr1} must evaluate to a |List|. The first item in
+ the list is assigned to {name1}, the second item to
+ {name2}, etc.
+ The number of names must match the number of items in
+ the |List|.
+ Each name can be one of the items of the ":let"
+ command as mentioned above.
+ Example: >
+ :let [s, item] = GetItem(s)
+< Detail: {expr1} is evaluated first, then the
+ assignments are done in sequence. This matters if
+ {name2} depends on {name1}. Example: >
+ :let x = [0, 1]
+ :let i = 0
+ :let [i, x[i]] = [1, 2]
+ :echo x
+< The result is [0, 2].
+
+:let [{name1}, {name2}, ...] .= {expr1}
+:let [{name1}, {name2}, ...] += {expr1}
+:let [{name1}, {name2}, ...] -= {expr1}
+ Like above, but append/add/subtract the value for each
+ |List| item.
+
+:let [{name}, ..., ; {lastname}] = {expr1} *E452*
+ Like |:let-unpack| above, but the |List| may have more
+ items than there are names. A list of the remaining
+ items is assigned to {lastname}. If there are no
+ remaining items {lastname} is set to an empty list.
+ Example: >
+ :let [a, b; rest] = ["aval", "bval", 3, 4]
+<
+:let [{name}, ..., ; {lastname}] .= {expr1}
+:let [{name}, ..., ; {lastname}] += {expr1}
+:let [{name}, ..., ; {lastname}] -= {expr1}
+ Like above, but append/add/subtract the value for each
+ |List| item.
+
+ *:let=<<* *:let-heredoc*
+ *E990* *E991* *E172* *E221* *E1145*
+:let {var-name} =<< [trim] [eval] {endmarker}
+text...
+text...
+{endmarker}
+ Set internal variable {var-name} to a |List|
+ containing the lines of text bounded by the string
+ {endmarker}.
+
+ If "eval" is not specified, then each line of text is
+ used as a |literal-string|, except that single quotes
+ does not need to be doubled.
+ If "eval" is specified, then any Vim expression in the
+ form {expr} is evaluated and the result replaces the
+ expression, like with |interpolated-string|.
+ Example where $HOME is expanded: >
+ let lines =<< trim eval END
+ some text
+ See the file {$HOME}/.vimrc
+ more text
+ END
+< There can be multiple Vim expressions in a single line
+ but an expression cannot span multiple lines. If any
+ expression evaluation fails, then the assignment fails.
+
+ {endmarker} must not contain white space.
+ {endmarker} cannot start with a lower case character.
+ The last line should end only with the {endmarker}
+ string without any other character. Watch out for
+ white space after {endmarker}!
+
+ Without "trim" any white space characters in the lines
+ of text are preserved. If "trim" is specified before
+ {endmarker}, then indentation is stripped so you can
+ do: >
+ let text =<< trim END
+ if ok
+ echo 'done'
+ endif
+ END
+< Results in: ["if ok", " echo 'done'", "endif"]
+ The marker must line up with "let" and the indentation
+ of the first line is removed from all the text lines.
+ Specifically: all the leading indentation exactly
+ matching the leading indentation of the first
+ non-empty text line is stripped from the input lines.
+ All leading indentation exactly matching the leading
+ indentation before `let` is stripped from the line
+ containing {endmarker}. Note that the difference
+ between space and tab matters here.
+
+ If {var-name} didn't exist yet, it is created.
+ Cannot be followed by another command, but can be
+ followed by a comment.
+
+ To avoid line continuation to be applied, consider
+ adding 'C' to 'cpoptions': >
+ set cpo+=C
+ let var =<< END
+ \ leading backslash
+ END
+ set cpo-=C
+<
+ Examples: >
+ let var1 =<< END
+ Sample text 1
+ Sample text 2
+ Sample text 3
+ END
+
+ let data =<< trim DATA
+ 1 2 3 4
+ 5 6 7 8
+ DATA
+
+ let code =<< trim eval CODE
+ let v = {10 + 20}
+ let h = "{$HOME}"
+ let s = "{Str1()} abc {Str2()}"
+ let n = {MyFunc(3, 4)}
+ CODE
+<
+ *E121*
+:let {var-name} .. List the value of variable {var-name}. Multiple
+ variable names may be given. Special names recognized
+ here: *E738*
+ g: global variables
+ b: local buffer variables
+ w: local window variables
+ t: local tab page variables
+ s: script-local variables
+ l: local function variables
+ v: Vim variables.
+ This does not work in Vim9 script. |vim9-declaration|
+
+:let List the values of all variables. The type of the
+ variable is indicated before the value:
+ <nothing> String
+ # Number
+ * Funcref
+ This does not work in Vim9 script. |vim9-declaration|
+
+:unl[et][!] {name} ... *:unlet* *:unl* *E108* *E795* *E1081*
+ Remove the internal variable {name}. Several variable
+ names can be given, they are all removed. The name
+ may also be a |List| or |Dictionary| item.
+ With [!] no error message is given for non-existing
+ variables.
+ One or more items from a |List| can be removed: >
+ :unlet list[3] " remove fourth item
+ :unlet list[3:] " remove fourth item to last
+< One item from a |Dictionary| can be removed at a time: >
+ :unlet dict['two']
+ :unlet dict.two
+< This is especially useful to clean up used global
+ variables and script-local variables (these are not
+ deleted when the script ends). Function-local
+ variables are automatically deleted when the function
+ ends.
+ In |Vim9| script variables declared in a function or
+ script cannot be removed.
+
+: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 empty.
+
+ *:cons* *:const* *E1018*
+:cons[t] {var-name} = {expr1}
+:cons[t] [{name1}, {name2}, ...] = {expr1}
+:cons[t] [{name}, ..., ; {lastname}] = {expr1}
+:cons[t] {var-name} =<< [trim] {marker}
+text...
+text...
+{marker}
+ Similar to |:let|, but additionally lock the variable
+ after setting the value. This is the same as locking
+ the variable with |:lockvar| just after |:let|, thus: >
+ :const x = 1
+< is equivalent to: >
+ :let x = 1
+ :lockvar! x
+< NOTE: in Vim9 script `:const` works differently, see
+ |vim9-const|
+ This is useful if you want to make sure the variable
+ is not modified. If the value is a List or Dictionary
+ literal then the items also cannot be changed: >
+ const ll = [1, 2, 3]
+ let ll[1] = 5 " Error!
+< Nested references are not locked: >
+ let lvar = ['a']
+ const lconst = [0, lvar]
+ let lconst[0] = 2 " Error!
+ let lconst[1][0] = 'b' " OK
+< *E995*
+ |:const| does not allow to for changing a variable: >
+ :let x = 1
+ :const x = 2 " Error!
+< *E996*
+ Note that environment variables, option values and
+ register values cannot be used here, since they cannot
+ be locked.
+
+:cons[t]
+:cons[t] {var-name}
+ If no argument is given or only {var-name} is given,
+ the behavior is the same as |:let|.
+
+:lockv[ar][!] [depth] {name} ... *:lockvar* *:lockv*
+ Lock the internal variable {name}. Locking means that
+ it can no longer be changed (until it is unlocked).
+ A locked variable can be deleted: >
+ :lockvar v
+ :let v = 'asdf' " fails!
+ :unlet v " works
+< *E741* *E940* *E1118* *E1119* *E1120* *E1121* *E1122*
+ If you try to change a locked variable you get an
+ error message: "E741: Value is locked: {name}".
+ If you try to lock or unlock a built-in variable you
+ 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:
+ 0 Lock the variable {name} but not its
+ value.
+ 1 Lock the |List| or |Dictionary| itself,
+ cannot add or remove items, but can
+ still change their values.
+ 2 Also lock the values, cannot change
+ the items. If an item is a |List| or
+ |Dictionary|, cannot add or remove
+ items, but can still change the
+ values.
+ 3 Like 2 but for the |List| /
+ |Dictionary| in the |List| /
+ |Dictionary|, one level deeper.
+ The default [depth] is 2, thus when {name} is a |List|
+ or |Dictionary| the values cannot be changed.
+
+ Example with [depth] 0: >
+ let mylist = [1, 2, 3]
+ lockvar 0 mylist
+ let mylist[0] = 77 " OK
+ call add(mylist, 4] " OK
+ let mylist = [7, 8, 9] " Error!
+< *E743*
+ For unlimited depth use [!] and omit [depth].
+ However, there is a maximum depth of 100 to catch
+ loops.
+
+ Note that when two variables refer to the same |List|
+ and you lock one of them, the |List| will also be
+ locked when used through the other variable.
+ Example: >
+ :let l = [0, 1, 2, 3]
+ :let cl = l
+ :lockvar l
+ :let cl[1] = 99 " won't work!
+< You may want to make a copy of a list to avoid this.
+ See |deepcopy()|.
+
+
+:unlo[ckvar][!] [depth] {name} ... *:unlockvar* *:unlo* *E1246*
+ Unlock the internal variable {name}. Does the
+ opposite of |:lockvar|.
+
+ If {name} does not exist:
+ - In |Vim9| script an error is given.
+ - In legacy script this is silently ignored.
+
+:if {expr1} *:if* *:end* *:endif* *:en* *E171* *E579* *E580*
+:en[dif] Execute the commands until the next matching `:else`
+ or `:endif` if {expr1} evaluates to non-zero.
+ Although the short forms work, it is recommended to
+ always use `:endif` to avoid confusion and to make
+ auto-indenting work properly.
+
+ From Vim version 4.5 until 5.0, every Ex command in
+ between the `:if` and `:endif` is ignored. These two
+ commands were just to allow for future expansions in a
+ backward compatible way. Nesting was allowed. Note
+ that any `:else` or `:elseif` was ignored, the `else`
+ part was not executed either.
+
+ You can use this to remain compatible with older
+ versions: >
+ :if version >= 500
+ : version-5-specific-commands
+ :endif
+< The commands still need to be parsed to find the
+ `endif`. Sometimes an older Vim has a problem with a
+ new command. For example, `:silent` is recognized as
+ a `:substitute` command. In that case `:execute` can
+ avoid problems: >
+ :if version >= 600
+ : execute "silent 1,$delete"
+ :endif
+<
+ In |Vim9| script `:endif` cannot be shortened, to
+ improve script readability.
+ NOTE: The `:append` and `:insert` commands don't work
+ properly in between `:if` and `:endif`.
+
+ *:else* *:el* *E581* *E583*
+:el[se] Execute the commands until the next matching `:else`
+ or `:endif` if they previously were not being
+ executed.
+ In |Vim9| script `:else` cannot be shortened, to
+ improve script readability.
+
+ *:elseif* *:elsei* *E582* *E584*
+:elsei[f] {expr1} Short for `:else` `:if`, with the addition that there
+ is no extra `:endif`.
+ In |Vim9| script `:elseif` cannot be shortened, to
+ improve script readability.
+
+:wh[ile] {expr1} *:while* *:endwhile* *:wh* *:endw*
+ *E170* *E585* *E588* *E733*
+:endw[hile] Repeat the commands between `:while` and `:endwhile`,
+ as long as {expr1} evaluates to non-zero.
+ When an error is detected from a command inside the
+ loop, execution continues after the `endwhile`.
+ Example: >
+ :let lnum = 1
+ :while lnum <= line("$")
+ :call FixLine(lnum)
+ :let lnum = lnum + 1
+ :endwhile
+<
+ In |Vim9| script `:while` and `:endwhile` cannot be
+ shortened, to improve script readability.
+ NOTE: The `:append` and `:insert` commands don't work
+ properly inside a `:while` and `:for` loop.
+
+:for {var} in {object} *:for* *E690* *E732*
+:endfo[r] *:endfo* *:endfor*
+ Repeat the commands between `:for` and `:endfor` for
+ each item in {object}. {object} can be a |List|,
+ a |Blob| or a |String|. *E1177*
+
+ Variable {var} is set to the value of each item.
+ In |Vim9| script the loop variable must not have been
+ declared yet, unless when it is a
+ global/window/tab/buffer variable.
+
+ When an error is detected for a command inside the
+ loop, execution continues after the `endfor`.
+ Changing {object} inside the loop affects what items
+ are used. Make a copy if this is unwanted: >
+ :for item in copy(mylist)
+<
+ When {object} is a |List| and not making a copy, in
+ legacy script Vim stores a reference to the next item
+ in the |List| before executing the commands with the
+ current item. Thus the current item can be removed
+ without effect. Removing any later item means it will
+ not be found. Thus the following example works (an
+ inefficient way to make a |List| empty): >
+ for item in mylist
+ call remove(mylist, 0)
+ endfor
+< Note that reordering the |List| (e.g., with sort() or
+ reverse()) may have unexpected effects.
+ In |Vim9| script the index is used. If an item before
+ the current one is deleted the next item will be
+ skipped.
+
+ When {object} is a |Blob|, Vim always makes a copy to
+ iterate over. Unlike with |List|, modifying the
+ |Blob| does not affect the iteration.
+
+ When {object} is a |String| each item is a string with
+ one character, plus any combining characters.
+
+ In |Vim9| script `:endfor` cannot be shortened, to
+ improve script readability.
+
+:for [{var1}, {var2}, ...] in {listlist}
+:endfo[r] *E1140*
+ Like `:for` above, but each item in {listlist} must be
+ a list, of which each item is assigned to {var1},
+ {var2}, etc. Example: >
+ :for [lnum, col] in [[1, 3], [2, 5], [3, 8]]
+ :echo getline(lnum)[col]
+ :endfor
+<
+ *:continue* *:con* *E586*
+:con[tinue] When used inside a `:while` or `:for` loop, jumps back
+ to the start of the loop.
+ If it is used after a `:try` inside the loop but
+ before the matching `:finally` (if present), the
+ commands following the `:finally` up to the matching
+ `:endtry` are executed first. This process applies to
+ all nested `:try`s inside the loop. The outermost
+ `:endtry` then jumps back to the start of the loop.
+
+ In |Vim9| script `:cont` is the shortest form, to
+ improve script readability.
+ *:break* *:brea* *E587*
+:brea[k] When used inside a `:while` or `:for` loop, skips to
+ the command after the matching `:endwhile` or
+ `:endfor`.
+ If it is used after a `:try` inside the loop but
+ before the matching `:finally` (if present), the
+ commands following the `:finally` up to the matching
+ `:endtry` are executed first. This process applies to
+ all nested `:try`s inside the loop. The outermost
+ `:endtry` then jumps to the command after the loop.
+
+ In |Vim9| script `:break` cannot be shortened, to
+ improve script readability.
+
+:try *:try* *:endt* *:endtry*
+ *E600* *E601* *E602* *E1032*
+:endt[ry] Change the error handling for the commands between
+ `:try` and `:endtry` including everything being
+ executed across `:source` commands, function calls,
+ or autocommand invocations.
+
+ When an error or interrupt is detected and there is
+ a `:finally` command following, execution continues
+ after the `:finally`. Otherwise, or when the
+ `:endtry` is reached thereafter, the next
+ (dynamically) surrounding `:try` is checked for
+ a corresponding `:finally` etc. Then the script
+ processing is terminated. Whether a function
+ definition has an "abort" argument does not matter.
+ Example: >
+ try | call Unknown() | finally | echomsg "cleanup" | endtry
+ echomsg "not reached"
+<
+ Moreover, an error or interrupt (dynamically) inside
+ `:try` and `:endtry` is converted to an exception. It
+ can be caught as if it were thrown by a `:throw`
+ command (see `:catch`). In this case, the script
+ processing is not terminated.
+
+ The value "Vim:Interrupt" is used for an interrupt
+ exception. An error in a Vim command is converted
+ to a value of the form "Vim({command}):{errmsg}",
+ other errors are converted to a value of the form
+ "Vim:{errmsg}". {command} is the full command name,
+ and {errmsg} is the message that is displayed if the
+ error exception is not caught, always beginning with
+ the error number.
+ Examples: >
+ try | sleep 100 | catch /^Vim:Interrupt$/ | endtry
+ try | edit | catch /^Vim(edit):E\d\+/ | echo "error" | endtry
+<
+ In |Vim9| script `:endtry` cannot be shortened, to
+ improve script readability.
+
+ *:cat* *:catch*
+ *E603* *E604* *E605* *E654* *E1033*
+:cat[ch] /{pattern}/ The following commands until the next `:catch`,
+ `:finally`, or `:endtry` that belongs to the same
+ `:try` as the `:catch` are executed when an exception
+ matching {pattern} is being thrown and has not yet
+ been caught by a previous `:catch`. Otherwise, these
+ commands are skipped.
+ When {pattern} is omitted all errors are caught.
+ Examples: >
+ :catch /^Vim:Interrupt$/ " catch interrupts (CTRL-C)
+ :catch /^Vim\%((\a\+)\)\=:E/ " catch all Vim errors
+ :catch /^Vim\%((\a\+)\)\=:/ " catch errors and interrupts
+ :catch /^Vim(write):/ " catch all errors in :write
+ :catch /^Vim\%((\a\+)\)\=:E123:/ " catch error E123
+ :catch /my-exception/ " catch user exception
+ :catch /.*/ " catch everything
+ :catch " same as /.*/
+<
+ Another character can be used instead of / around the
+ {pattern}, so long as it does not have a special
+ meaning (e.g., '|' or '"') and doesn't occur inside
+ {pattern}. *E1067*
+ Information about the exception is available in
+ |v:exception|. Also see |throw-variables|.
+ NOTE: It is not reliable to ":catch" the TEXT of
+ an error message because it may vary in different
+ locales.
+ In |Vim9| script `:catch` cannot be shortened, to
+ improve script readability.
+
+ *:fina* *:finally* *E606* *E607*
+:fina[lly] The following commands until the matching `:endtry`
+ are executed whenever the part between the matching
+ `:try` and the `:finally` is left: either by falling
+ through to the `:finally` or by a `:continue`,
+ `:break`, `:finish`, or `:return`, or by an error or
+ interrupt or exception (see `:throw`).
+
+ In |Vim9| script `:finally` cannot be shortened, to
+ improve script readability and avoid confusion with
+ `:final`.
+
+ *:th* *:throw* *E608* *E1129*
+:th[row] {expr1} The {expr1} is evaluated and thrown as an exception.
+ If the ":throw" is used after a `:try` but before the
+ first corresponding `:catch`, commands are skipped
+ until the first `:catch` matching {expr1} is reached.
+ If there is no such `:catch` or if the ":throw" is
+ used after a `:catch` but before the `:finally`, the
+ commands following the `:finally` (if present) up to
+ the matching `:endtry` are executed. If the `:throw`
+ is after the `:finally`, commands up to the `:endtry`
+ are skipped. At the ":endtry", this process applies
+ again for the next dynamically surrounding `:try`
+ (which may be found in a calling function or sourcing
+ script), until a matching `:catch` has been found.
+ If the exception is not caught, the command processing
+ is terminated.
+ Example: >
+ :try | throw "oops" | catch /^oo/ | echo "caught" | endtry
+< Note that "catch" may need to be on a separate line
+ for when an error causes the parsing to skip the whole
+ line and not see the "|" that separates the commands.
+
+ In |Vim9| script `:throw` cannot be shortened, to
+ improve script readability.
+
+ *:ec* *:echo*
+:ec[ho] {expr1} .. Echoes each {expr1}, with a space in between. The
+ first {expr1} starts on a new line.
+ Also see |:comment|.
+ Use "\n" to start a new line. Use "\r" to move the
+ cursor to the first column.
+ Uses the highlighting set by the `:echohl` command.
+ Cannot be followed by a comment.
+ Example: >
+ :echo "the value of 'shell' is" &shell
+< *:echo-redraw*
+ A later redraw may make the message disappear again.
+ And since Vim mostly postpones redrawing until it's
+ finished with a sequence of commands this happens
+ quite often. To avoid that a command from before the
+ `:echo` causes a redraw afterwards (redraws are often
+ postponed until you type something), force a redraw
+ with the `:redraw` command. Example: >
+ :new | redraw | echo "there is a new window"
+<
+ *:echon*
+:echon {expr1} .. Echoes each {expr1}, without anything added. Also see
+ |:comment|.
+ Uses the highlighting set by the `:echohl` command.
+ Cannot be followed by a comment.
+ Example: >
+ :echon "the value of 'shell' is " &shell
+<
+ Note the difference between using `:echo`, which is a
+ Vim command, and `:!echo`, which is an external shell
+ command: >
+ :!echo % --> filename
+< The arguments of ":!" are expanded, see |:_%|. >
+ :!echo "%" --> filename or "filename"
+< Like the previous example. Whether you see the double
+ quotes or not depends on your 'shell'. >
+ :echo % --> nothing
+< The '%' is an illegal character in an expression. >
+ :echo "%" --> %
+< This just echoes the '%' character. >
+ :echo expand("%") --> filename
+< This calls the expand() function to expand the '%'.
+
+ *:echoh* *:echohl*
+:echoh[l] {name} Use the highlight group {name} for the following
+ `:echo`, `:echon` and `:echomsg` commands. Also used
+ for the `input()` prompt. Example: >
+ :echohl WarningMsg | echo "Don't panic!" | echohl None
+< Don't forget to set the group back to "None",
+ otherwise all following echo's will be highlighted.
+
+ *:echom* *:echomsg*
+:echom[sg] {expr1} .. Echo the expression(s) as a true message, saving the
+ message in the |message-history|.
+ Spaces are placed between the arguments as with the
+ `:echo` command. But unprintable characters are
+ displayed, not interpreted.
+ The parsing works slightly different from `:echo`,
+ more like `:execute`. All the expressions are first
+ evaluated and concatenated before echoing anything.
+ If expressions does not evaluate to a Number or
+ String, string() is used to turn it into a string.
+ Uses the highlighting set by the `:echohl` command.
+ Example: >
+ :echomsg "It's a Zizzer Zazzer Zuzz, as you can plainly see."
+< See |:echo-redraw| to avoid the message disappearing
+ when the screen is redrawn.
+
+ *:echow* *:echowin* *:echowindow*
+:[N]echow[indow] {expr1} ..
+ Like |:echomsg| but when the messages popup window is
+ available the message is displayed there. This means
+ it will show for three seconds and avoid a
+ |hit-enter| prompt. If you want to hide it before
+ that, press Esc in Normal mode (when it would
+ otherwise beep). If it disappears too soon you can
+ use `:messages` to see the text.
+ When [N] is given then the window will show up for
+ this number of seconds. The last `:echowindow` with a
+ count matters, it is used once only.
+ The message window is available when Vim was compiled
+ with the +timer and the +popupwin features.
+
+ *:echoe* *:echoerr*
+:echoe[rr] {expr1} .. Echo the expression(s) as an error message, saving the
+ message in the |message-history|. When used in a
+ script or function the line number will be added.
+ Spaces are placed between the arguments as with the
+ `:echomsg` command. When used inside a try conditional,
+ the message is raised as an error exception instead
+ (see |try-echoerr|).
+ Example: >
+ :echoerr "This script just failed!"
+< If you just want a highlighted message use `:echohl`.
+ And to get a beep: >
+ :exe "normal \<Esc>"
+
+:echoc[onsole] {expr1} .. *:echoc* *:echoconsole*
+ Intended for testing: works like `:echomsg` but when
+ running in the GUI and started from a terminal write
+ the text to stdout.
+
+ *:eval*
+:eval {expr} Evaluate {expr} and discard the result. Example: >
+ :eval Getlist()->Filter()->append('$')
+
+< The expression is supposed to have a side effect,
+ since the resulting value is not used. In the example
+ the `append()` call appends the List with text to the
+ buffer. This is similar to `:call` but works with any
+ expression.
+ In |Vim9| script an expression without an effect will
+ result in error *E1207* . This should help noticing
+ mistakes.
+
+ The command can be shortened to `:ev` or `:eva`, but
+ these are hard to recognize and therefore not to be
+ used.
+
+ The command cannot be followed by "|" and another
+ command, since "|" is seen as part of the expression.
+
+
+ *:exe* *:execute*
+:exe[cute] {expr1} .. Executes the string that results from the evaluation
+ of {expr1} as an Ex command.
+ Multiple arguments are concatenated, with a space in
+ between. To avoid the extra space use the ".."
+ operator to concatenate strings into one argument.
+ {expr1} is used as the processed command, command line
+ editing keys are not recognized.
+ Cannot be followed by a comment.
+ Examples: >
+ :execute "buffer" nextbuf
+ :execute "normal" count .. "w"
+<
+ ":execute" can be used to append a command to commands
+ that don't accept a '|'. Example: >
+ :execute '!ls' | echo "theend"
+
+< ":execute" is also a nice way to avoid having to type
+ control characters in a Vim script for a ":normal"
+ command: >
+ :execute "normal ixxx\<Esc>"
+< This has an <Esc> character, see |expr-string|.
+
+ Be careful to correctly escape special characters in
+ file names. The |fnameescape()| function can be used
+ for Vim commands, |shellescape()| for |:!| commands.
+ Examples: >
+ :execute "e " .. fnameescape(filename)
+ :execute "!ls " .. shellescape(filename, 1)
+<
+ Note: The executed string may be any command-line, but
+ starting or ending "if", "while" and "for" does not
+ always work, because when commands are skipped the
+ ":execute" is not evaluated and Vim loses track of
+ where blocks start and end. Also "break" and
+ "continue" should not be inside ":execute".
+ This example does not work, because the ":execute" is
+ not evaluated and Vim does not see the "while", and
+ gives an error for finding an ":endwhile": >
+ :if 0
+ : execute 'while i > 5'
+ : echo "test"
+ : endwhile
+ :endif
+<
+ It is allowed to have a "while" or "if" command
+ completely in the executed string: >
+ :execute 'while i < 5 | echo i | let i = i + 1 | endwhile'
+<
+
+ *:exe-comment*
+ ":execute", ":echo" and ":echon" cannot be followed by
+ a comment directly, because they see the '"' as the
+ start of a string. But, you can use '|' followed by a
+ comment. Example: >
+ :echo "foo" | "this is a comment
+
+==============================================================================
+8. Exception handling *exception-handling*
+
+The Vim script language comprises an exception handling feature. This section
+explains how it can be used in a Vim script.
+
+Exceptions may be raised by Vim on an error or on interrupt, see
+|catch-errors| and |catch-interrupt|. You can also explicitly throw an
+exception by using the ":throw" command, see |throw-catch|.
+
+
+TRY CONDITIONALS *try-conditionals*
+
+Exceptions can be caught or can cause cleanup code to be executed. You can
+use a try conditional to specify catch clauses (that catch exceptions) and/or
+a finally clause (to be executed for cleanup).
+ A try conditional begins with a |:try| command and ends at the matching
+|:endtry| command. In between, you can use a |:catch| command to start
+a catch clause, or a |:finally| command to start a finally clause. There may
+be none or multiple catch clauses, but there is at most one finally clause,
+which must not be followed by any catch clauses. The lines before the catch
+clauses and the finally clause is called a try block. >
+
+ :try
+ : ...
+ : ... TRY BLOCK
+ : ...
+ :catch /{pattern}/
+ : ...
+ : ... CATCH CLAUSE
+ : ...
+ :catch /{pattern}/
+ : ...
+ : ... CATCH CLAUSE
+ : ...
+ :finally
+ : ...
+ : ... FINALLY CLAUSE
+ : ...
+ :endtry
+
+The try conditional allows to watch code for exceptions and to take the
+appropriate actions. Exceptions from the try block may be caught. Exceptions
+from the try block and also the catch clauses may cause cleanup actions.
+ When no exception is thrown during execution of the try block, the control
+is transferred to the finally clause, if present. After its execution, the
+script continues with the line following the ":endtry".
+ When an exception occurs during execution of the try block, the remaining
+lines in the try block are skipped. The exception is matched against the
+patterns specified as arguments to the ":catch" commands. The catch clause
+after the first matching ":catch" is taken, other catch clauses are not
+executed. The catch clause ends when the next ":catch", ":finally", or
+":endtry" command is reached - whatever is first. Then, the finally clause
+(if present) is executed. When the ":endtry" is reached, the script execution
+continues in the following line as usual.
+ When an exception that does not match any of the patterns specified by the
+":catch" commands is thrown in the try block, the exception is not caught by
+that try conditional and none of the catch clauses is executed. Only the
+finally clause, if present, is taken. The exception pends during execution of
+the finally clause. It is resumed at the ":endtry", so that commands after
+the ":endtry" are not executed and the exception might be caught elsewhere,
+see |try-nesting|.
+ When during execution of a catch clause another exception is thrown, the
+remaining lines in that catch clause are not executed. The new exception is
+not matched against the patterns in any of the ":catch" commands of the same
+try conditional and none of its catch clauses is taken. If there is, however,
+a finally clause, it is executed, and the exception pends during its
+execution. The commands following the ":endtry" are not executed. The new
+exception might, however, be caught elsewhere, see |try-nesting|.
+ When during execution of the finally clause (if present) an exception is
+thrown, the remaining lines in the finally clause are skipped. If the finally
+clause has been taken because of an exception from the try block or one of the
+catch clauses, the original (pending) exception is discarded. The commands
+following the ":endtry" are not executed, and the exception from the finally
+clause is propagated and can be caught elsewhere, see |try-nesting|.
+
+The finally clause is also executed, when a ":break" or ":continue" for
+a ":while" loop enclosing the complete try conditional is executed from the
+try block or a catch clause. Or when a ":return" or ":finish" is executed
+from the try block or a catch clause of a try conditional in a function or
+sourced script, respectively. The ":break", ":continue", ":return", or
+":finish" pends during execution of the finally clause and is resumed when the
+":endtry" is reached. It is, however, discarded when an exception is thrown
+from the finally clause.
+ When a ":break" or ":continue" for a ":while" loop enclosing the complete
+try conditional or when a ":return" or ":finish" is encountered in the finally
+clause, the rest of the finally clause is skipped, and the ":break",
+":continue", ":return" or ":finish" is executed as usual. If the finally
+clause has been taken because of an exception or an earlier ":break",
+":continue", ":return", or ":finish" from the try block or a catch clause,
+this pending exception or command is discarded.
+
+For examples see |throw-catch| and |try-finally|.
+
+
+NESTING OF TRY CONDITIONALS *try-nesting*
+
+Try conditionals can be nested arbitrarily. That is, a complete try
+conditional can be put into the try block, a catch clause, or the finally
+clause of another try conditional. If the inner try conditional does not
+catch an exception thrown in its try block or throws a new exception from one
+of its catch clauses or its finally clause, the outer try conditional is
+checked according to the rules above. If the inner try conditional is in the
+try block of the outer try conditional, its catch clauses are checked, but
+otherwise only the finally clause is executed. It does not matter for
+nesting, whether the inner try conditional is directly contained in the outer
+one, or whether the outer one sources a script or calls a function containing
+the inner try conditional.
+
+When none of the active try conditionals catches an exception, just their
+finally clauses are executed. Thereafter, the script processing terminates.
+An error message is displayed in case of an uncaught exception explicitly
+thrown by a ":throw" command. For uncaught error and interrupt exceptions
+implicitly raised by Vim, the error message(s) or interrupt message are shown
+as usual.
+
+For examples see |throw-catch|.
+
+
+EXAMINING EXCEPTION HANDLING CODE *except-examine*
+
+Exception handling code can get tricky. If you are in doubt what happens, set
+'verbose' to 13 or use the ":13verbose" command modifier when sourcing your
+script file. Then you see when an exception is thrown, discarded, caught, or
+finished. When using a verbosity level of at least 14, things pending in
+a finally clause are also shown. This information is also given in debug mode
+(see |debug-scripts|).
+
+
+THROWING AND CATCHING EXCEPTIONS *throw-catch*
+
+You can throw any number or string as an exception. Use the |:throw| command
+and pass the value to be thrown as argument: >
+ :throw 4711
+ :throw "string"
+< *throw-expression*
+You can also specify an expression argument. The expression is then evaluated
+first, and the result is thrown: >
+ :throw 4705 + strlen("string")
+ :throw strpart("strings", 0, 6)
+
+An exception might be thrown during evaluation of the argument of the ":throw"
+command. Unless it is caught there, the expression evaluation is abandoned.
+The ":throw" command then does not throw a new exception.
+ Example: >
+
+ :function! Foo(arg)
+ : try
+ : throw a:arg
+ : catch /foo/
+ : endtry
+ : return 1
+ :endfunction
+ :
+ :function! Bar()
+ : echo "in Bar"
+ : return 4710
+ :endfunction
+ :
+ :throw Foo("arrgh") + Bar()
+
+This throws "arrgh", and "in Bar" is not displayed since Bar() is not
+executed. >
+ :throw Foo("foo") + Bar()
+however displays "in Bar" and throws 4711.
+
+Any other command that takes an expression as argument might also be
+abandoned by an (uncaught) exception during the expression evaluation. The
+exception is then propagated to the caller of the command.
+ Example: >
+
+ :if Foo("arrgh")
+ : echo "then"
+ :else
+ : echo "else"
+ :endif
+
+Here neither of "then" or "else" is displayed.
+
+ *catch-order*
+Exceptions can be caught by a try conditional with one or more |:catch|
+commands, see |try-conditionals|. The values to be caught by each ":catch"
+command can be specified as a pattern argument. The subsequent catch clause
+gets executed when a matching exception is caught.
+ Example: >
+
+ :function! Foo(value)
+ : try
+ : throw a:value
+ : catch /^\d\+$/
+ : echo "Number thrown"
+ : catch /.*/
+ : echo "String thrown"
+ : endtry
+ :endfunction
+ :
+ :call Foo(0x1267)
+ :call Foo('string')
+
+The first call to Foo() displays "Number thrown", the second "String thrown".
+An exception is matched against the ":catch" commands in the order they are
+specified. Only the first match counts. So you should place the more
+specific ":catch" first. The following order does not make sense: >
+
+ : catch /.*/
+ : echo "String thrown"
+ : catch /^\d\+$/
+ : echo "Number thrown"
+
+The first ":catch" here matches always, so that the second catch clause is
+never taken.
+
+ *throw-variables*
+If you catch an exception by a general pattern, you may access the exact value
+in the variable |v:exception|: >
+
+ : catch /^\d\+$/
+ : echo "Number thrown. Value is" v:exception
+
+You may also be interested where an exception was thrown. This is stored in
+|v:throwpoint|. Note that "v:exception" and "v:throwpoint" are valid for the
+exception most recently caught as long it is not finished.
+ Example: >
+
+ :function! Caught()
+ : if v:exception != ""
+ : echo 'Caught "' . v:exception .. '" in ' .. v:throwpoint
+ : else
+ : echo 'Nothing caught'
+ : endif
+ :endfunction
+ :
+ :function! Foo()
+ : try
+ : try
+ : try
+ : throw 4711
+ : finally
+ : call Caught()
+ : endtry
+ : catch /.*/
+ : call Caught()
+ : throw "oops"
+ : endtry
+ : catch /.*/
+ : call Caught()
+ : finally
+ : call Caught()
+ : endtry
+ :endfunction
+ :
+ :call Foo()
+
+This displays >
+
+ Nothing caught
+ Caught "4711" in function Foo, line 4
+ Caught "oops" in function Foo, line 10
+ Nothing caught
+
+A practical example: The following command ":LineNumber" displays the line
+number in the script or function where it has been used: >
+
+ :function! LineNumber()
+ : return substitute(v:throwpoint, '.*\D\(\d\+\).*', '\1', "")
+ :endfunction
+ :command! LineNumber try | throw "" | catch | echo LineNumber() | endtry
+<
+ *try-nested*
+An exception that is not caught by a try conditional can be caught by
+a surrounding try conditional: >
+
+ :try
+ : try
+ : throw "foo"
+ : catch /foobar/
+ : echo "foobar"
+ : finally
+ : echo "inner finally"
+ : endtry
+ :catch /foo/
+ : echo "foo"
+ :endtry
+
+The inner try conditional does not catch the exception, just its finally
+clause is executed. The exception is then caught by the outer try
+conditional. The example displays "inner finally" and then "foo".
+
+ *throw-from-catch*
+You can catch an exception and throw a new one to be caught elsewhere from the
+catch clause: >
+
+ :function! Foo()
+ : throw "foo"
+ :endfunction
+ :
+ :function! Bar()
+ : try
+ : call Foo()
+ : catch /foo/
+ : echo "Caught foo, throw bar"
+ : throw "bar"
+ : endtry
+ :endfunction
+ :
+ :try
+ : call Bar()
+ :catch /.*/
+ : echo "Caught" v:exception
+ :endtry
+
+This displays "Caught foo, throw bar" and then "Caught bar".
+
+ *rethrow*
+There is no real rethrow in the Vim script language, but you may throw
+"v:exception" instead: >
+
+ :function! Bar()
+ : try
+ : call Foo()
+ : catch /.*/
+ : echo "Rethrow" v:exception
+ : throw v:exception
+ : endtry
+ :endfunction
+< *try-echoerr*
+Note that this method cannot be used to "rethrow" Vim error or interrupt
+exceptions, because it is not possible to fake Vim internal exceptions.
+Trying so causes an error exception. You should throw your own exception
+denoting the situation. If you want to cause a Vim error exception containing
+the original error exception value, you can use the |:echoerr| command: >
+
+ :try
+ : try
+ : asdf
+ : catch /.*/
+ : echoerr v:exception
+ : endtry
+ :catch /.*/
+ : echo v:exception
+ :endtry
+
+This code displays
+
+ Vim(echoerr):Vim:E492: Not an editor command: asdf ~
+
+
+CLEANUP CODE *try-finally*
+
+Scripts often change global settings and restore them at their end. If the
+user however interrupts the script by pressing CTRL-C, the settings remain in
+an inconsistent state. The same may happen to you in the development phase of
+a script when an error occurs or you explicitly throw an exception without
+catching it. You can solve these problems by using a try conditional with
+a finally clause for restoring the settings. Its execution is guaranteed on
+normal control flow, on error, on an explicit ":throw", and on interrupt.
+(Note that errors and interrupts from inside the try conditional are converted
+to exceptions. When not caught, they terminate the script after the finally
+clause has been executed.)
+Example: >
+
+ :try
+ : let s:saved_ts = &ts
+ : set ts=17
+ :
+ : " Do the hard work here.
+ :
+ :finally
+ : let &ts = s:saved_ts
+ : unlet s:saved_ts
+ :endtry
+
+This method should be used locally whenever a function or part of a script
+changes global settings which need to be restored on failure or normal exit of
+that function or script part.
+
+ *break-finally*
+Cleanup code works also when the try block or a catch clause is left by
+a ":continue", ":break", ":return", or ":finish".
+ Example: >
+
+ :let first = 1
+ :while 1
+ : try
+ : if first
+ : echo "first"
+ : let first = 0
+ : continue
+ : else
+ : throw "second"
+ : endif
+ : catch /.*/
+ : echo v:exception
+ : break
+ : finally
+ : echo "cleanup"
+ : endtry
+ : echo "still in while"
+ :endwhile
+ :echo "end"
+
+This displays "first", "cleanup", "second", "cleanup", and "end". >
+
+ :function! Foo()
+ : try
+ : return 4711
+ : finally
+ : echo "cleanup\n"
+ : endtry
+ : echo "Foo still active"
+ :endfunction
+ :
+ :echo Foo() "returned by Foo"
+
+This displays "cleanup" and "4711 returned by Foo". You don't need to add an
+extra ":return" in the finally clause. (Above all, this would override the
+return value.)
+
+ *except-from-finally*
+Using either of ":continue", ":break", ":return", ":finish", or ":throw" in
+a finally clause is possible, but not recommended since it abandons the
+cleanup actions for the try conditional. But, of course, interrupt and error
+exceptions might get raised from a finally clause.
+ Example where an error in the finally clause stops an interrupt from
+working correctly: >
+
+ :try
+ : try
+ : echo "Press CTRL-C for interrupt"
+ : while 1
+ : endwhile
+ : finally
+ : unlet novar
+ : endtry
+ :catch /novar/
+ :endtry
+ :echo "Script still running"
+ :sleep 1
+
+If you need to put commands that could fail into a finally clause, you should
+think about catching or ignoring the errors in these commands, see
+|catch-errors| and |ignore-errors|.
+
+
+CATCHING ERRORS *catch-errors*
+
+If you want to catch specific errors, you just have to put the code to be
+watched in a try block and add a catch clause for the error message. The
+presence of the try conditional causes all errors to be converted to an
+exception. No message is displayed and |v:errmsg| is not set then. To find
+the right pattern for the ":catch" command, you have to know how the format of
+the error exception is.
+ Error exceptions have the following format: >
+
+ Vim({cmdname}):{errmsg}
+or >
+ Vim:{errmsg}
+
+{cmdname} is the name of the command that failed; the second form is used when
+the command name is not known. {errmsg} is the error message usually produced
+when the error occurs outside try conditionals. It always begins with
+a capital "E", followed by a two or three-digit error number, a colon, and
+a space.
+
+Examples:
+
+The command >
+ :unlet novar
+normally produces the error message >
+ E108: No such variable: "novar"
+which is converted inside try conditionals to an exception >
+ Vim(unlet):E108: No such variable: "novar"
+
+The command >
+ :dwim
+normally produces the error message >
+ E492: Not an editor command: dwim
+which is converted inside try conditionals to an exception >
+ Vim:E492: Not an editor command: dwim
+
+You can catch all ":unlet" errors by a >
+ :catch /^Vim(unlet):/
+or all errors for misspelled command names by a >
+ :catch /^Vim:E492:/
+
+Some error messages may be produced by different commands: >
+ :function nofunc
+and >
+ :delfunction nofunc
+both produce the error message >
+ E128: Function name must start with a capital: nofunc
+which is converted inside try conditionals to an exception >
+ Vim(function):E128: Function name must start with a capital: nofunc
+or >
+ Vim(delfunction):E128: Function name must start with a capital: nofunc
+respectively. You can catch the error by its number independently on the
+command that caused it if you use the following pattern: >
+ :catch /^Vim(\a\+):E128:/
+
+Some commands like >
+ :let x = novar
+produce multiple error messages, here: >
+ E121: Undefined variable: novar
+ E15: Invalid expression: novar
+Only the first is used for the exception value, since it is the most specific
+one (see |except-several-errors|). So you can catch it by >
+ :catch /^Vim(\a\+):E121:/
+
+You can catch all errors related to the name "nofunc" by >
+ :catch /\<nofunc\>/
+
+You can catch all Vim errors in the ":write" and ":read" commands by >
+ :catch /^Vim(\(write\|read\)):E\d\+:/
+
+You can catch all Vim errors by the pattern >
+ :catch /^Vim\((\a\+)\)\=:E\d\+:/
+<
+ *catch-text*
+NOTE: You should never catch the error message text itself: >
+ :catch /No such variable/
+only works in the English locale, but not when the user has selected
+a different language by the |:language| command. It is however helpful to
+cite the message text in a comment: >
+ :catch /^Vim(\a\+):E108:/ " No such variable
+
+
+IGNORING ERRORS *ignore-errors*
+
+You can ignore errors in a specific Vim command by catching them locally: >
+
+ :try
+ : write
+ :catch
+ :endtry
+
+But you are strongly recommended NOT to use this simple form, since it could
+catch more than you want. With the ":write" command, some autocommands could
+be executed and cause errors not related to writing, for instance: >
+
+ :au BufWritePre * unlet novar
+
+There could even be such errors you are not responsible for as a script
+writer: a user of your script might have defined such autocommands. You would
+then hide the error from the user.
+ It is much better to use >
+
+ :try
+ : write
+ :catch /^Vim(write):/
+ :endtry
+
+which only catches real write errors. So catch only what you'd like to ignore
+intentionally.
+
+For a single command that does not cause execution of autocommands, you could
+even suppress the conversion of errors to exceptions by the ":silent!"
+command: >
+ :silent! nunmap k
+This works also when a try conditional is active.
+
+
+CATCHING INTERRUPTS *catch-interrupt*
+
+When there are active try conditionals, an interrupt (CTRL-C) is converted to
+the exception "Vim:Interrupt". You can catch it like every exception. The
+script is not terminated, then.
+ Example: >
+
+ :function! TASK1()
+ : sleep 10
+ :endfunction
+
+ :function! TASK2()
+ : sleep 20
+ :endfunction
+
+ :while 1
+ : let command = input("Type a command: ")
+ : try
+ : if command == ""
+ : continue
+ : elseif command == "END"
+ : break
+ : elseif command == "TASK1"
+ : call TASK1()
+ : elseif command == "TASK2"
+ : call TASK2()
+ : else
+ : echo "\nIllegal command:" command
+ : continue
+ : endif
+ : catch /^Vim:Interrupt$/
+ : echo "\nCommand interrupted"
+ : " Caught the interrupt. Continue with next prompt.
+ : endtry
+ :endwhile
+
+You can interrupt a task here by pressing CTRL-C; the script then asks for
+a new command. If you press CTRL-C at the prompt, the script is terminated.
+
+For testing what happens when CTRL-C would be pressed on a specific line in
+your script, use the debug mode and execute the |>quit| or |>interrupt|
+command on that line. See |debug-scripts|.
+
+
+CATCHING ALL *catch-all*
+
+The commands >
+
+ :catch /.*/
+ :catch //
+ :catch
+
+catch everything, error exceptions, interrupt exceptions and exceptions
+explicitly thrown by the |:throw| command. This is useful at the top level of
+a script in order to catch unexpected things.
+ Example: >
+
+ :try
+ :
+ : " do the hard work here
+ :
+ :catch /MyException/
+ :
+ : " handle known problem
+ :
+ :catch /^Vim:Interrupt$/
+ : echo "Script interrupted"
+ :catch /.*/
+ : echo "Internal error (" .. v:exception .. ")"
+ : echo " - occurred at " .. v:throwpoint
+ :endtry
+ :" end of script
+
+Note: Catching all might catch more things than you want. Thus, you are
+strongly encouraged to catch only for problems that you can really handle by
+specifying a pattern argument to the ":catch".
+ Example: Catching all could make it nearly impossible to interrupt a script
+by pressing CTRL-C: >
+
+ :while 1
+ : try
+ : sleep 1
+ : catch
+ : endtry
+ :endwhile
+
+
+EXCEPTIONS AND AUTOCOMMANDS *except-autocmd*
+
+Exceptions may be used during execution of autocommands. Example: >
+
+ :autocmd User x try
+ :autocmd User x throw "Oops!"
+ :autocmd User x catch
+ :autocmd User x echo v:exception
+ :autocmd User x endtry
+ :autocmd User x throw "Arrgh!"
+ :autocmd User x echo "Should not be displayed"
+ :
+ :try
+ : doautocmd User x
+ :catch
+ : echo v:exception
+ :endtry
+
+This displays "Oops!" and "Arrgh!".
+
+ *except-autocmd-Pre*
+For some commands, autocommands get executed before the main action of the
+command takes place. If an exception is thrown and not caught in the sequence
+of autocommands, the sequence and the command that caused its execution are
+abandoned and the exception is propagated to the caller of the command.
+ Example: >
+
+ :autocmd BufWritePre * throw "FAIL"
+ :autocmd BufWritePre * echo "Should not be displayed"
+ :
+ :try
+ : write
+ :catch
+ : echo "Caught:" v:exception "from" v:throwpoint
+ :endtry
+
+Here, the ":write" command does not write the file currently being edited (as
+you can see by checking 'modified'), since the exception from the BufWritePre
+autocommand abandons the ":write". The exception is then caught and the
+script displays: >
+
+ Caught: FAIL from BufWrite Auto commands for "*"
+<
+ *except-autocmd-Post*
+For some commands, autocommands get executed after the main action of the
+command has taken place. If this main action fails and the command is inside
+an active try conditional, the autocommands are skipped and an error exception
+is thrown that can be caught by the caller of the command.
+ Example: >
+
+ :autocmd BufWritePost * echo "File successfully written!"
+ :
+ :try
+ : write /i/m/p/o/s/s/i/b/l/e
+ :catch
+ : echo v:exception
+ :endtry
+
+This just displays: >
+
+ Vim(write):E212: Can't open file for writing (/i/m/p/o/s/s/i/b/l/e)
+
+If you really need to execute the autocommands even when the main action
+fails, trigger the event from the catch clause.
+ Example: >
+
+ :autocmd BufWritePre * set noreadonly
+ :autocmd BufWritePost * set readonly
+ :
+ :try
+ : write /i/m/p/o/s/s/i/b/l/e
+ :catch
+ : doautocmd BufWritePost /i/m/p/o/s/s/i/b/l/e
+ :endtry
+<
+You can also use ":silent!": >
+
+ :let x = "ok"
+ :let v:errmsg = ""
+ :autocmd BufWritePost * if v:errmsg != ""
+ :autocmd BufWritePost * let x = "after fail"
+ :autocmd BufWritePost * endif
+ :try
+ : silent! write /i/m/p/o/s/s/i/b/l/e
+ :catch
+ :endtry
+ :echo x
+
+This displays "after fail".
+
+If the main action of the command does not fail, exceptions from the
+autocommands will be catchable by the caller of the command: >
+
+ :autocmd BufWritePost * throw ":-("
+ :autocmd BufWritePost * echo "Should not be displayed"
+ :
+ :try
+ : write
+ :catch
+ : echo v:exception
+ :endtry
+<
+ *except-autocmd-Cmd*
+For some commands, the normal action can be replaced by a sequence of
+autocommands. Exceptions from that sequence will be catchable by the caller
+of the command.
+ Example: For the ":write" command, the caller cannot know whether the file
+had actually been written when the exception occurred. You need to tell it in
+some way. >
+
+ :if !exists("cnt")
+ : let cnt = 0
+ :
+ : autocmd BufWriteCmd * if &modified
+ : autocmd BufWriteCmd * let cnt = cnt + 1
+ : autocmd BufWriteCmd * if cnt % 3 == 2
+ : autocmd BufWriteCmd * throw "BufWriteCmdError"
+ : autocmd BufWriteCmd * endif
+ : autocmd BufWriteCmd * write | set nomodified
+ : autocmd BufWriteCmd * if cnt % 3 == 0
+ : autocmd BufWriteCmd * throw "BufWriteCmdError"
+ : autocmd BufWriteCmd * endif
+ : autocmd BufWriteCmd * echo "File successfully written!"
+ : autocmd BufWriteCmd * endif
+ :endif
+ :
+ :try
+ : write
+ :catch /^BufWriteCmdError$/
+ : if &modified
+ : echo "Error on writing (file contents not changed)"
+ : else
+ : echo "Error after writing"
+ : endif
+ :catch /^Vim(write):/
+ : echo "Error on writing"
+ :endtry
+
+When this script is sourced several times after making changes, it displays
+first >
+ File successfully written!
+then >
+ Error on writing (file contents not changed)
+then >
+ Error after writing
+etc.
+
+ *except-autocmd-ill*
+You cannot spread a try conditional over autocommands for different events.
+The following code is ill-formed: >
+
+ :autocmd BufWritePre * try
+ :
+ :autocmd BufWritePost * catch
+ :autocmd BufWritePost * echo v:exception
+ :autocmd BufWritePost * endtry
+ :
+ :write
+
+
+EXCEPTION HIERARCHIES AND PARAMETERIZED EXCEPTIONS *except-hier-param*
+
+Some programming languages allow to use hierarchies of exception classes or to
+pass additional information with the object of an exception class. You can do
+similar things in Vim.
+ In order to throw an exception from a hierarchy, just throw the complete
+class name with the components separated by a colon, for instance throw the
+string "EXCEPT:MATHERR:OVERFLOW" for an overflow in a mathematical library.
+ When you want to pass additional information with your exception class, add
+it in parentheses, for instance throw the string "EXCEPT:IO:WRITEERR(myfile)"
+for an error when writing "myfile".
+ With the appropriate patterns in the ":catch" command, you can catch for
+base classes or derived classes of your hierarchy. Additional information in
+parentheses can be cut out from |v:exception| with the ":substitute" command.
+ Example: >
+
+ :function! CheckRange(a, func)
+ : if a:a < 0
+ : throw "EXCEPT:MATHERR:RANGE(" .. a:func .. ")"
+ : endif
+ :endfunction
+ :
+ :function! Add(a, b)
+ : call CheckRange(a:a, "Add")
+ : call CheckRange(a:b, "Add")
+ : let c = a:a + a:b
+ : if c < 0
+ : throw "EXCEPT:MATHERR:OVERFLOW"
+ : endif
+ : return c
+ :endfunction
+ :
+ :function! Div(a, b)
+ : call CheckRange(a:a, "Div")
+ : call CheckRange(a:b, "Div")
+ : if (a:b == 0)
+ : throw "EXCEPT:MATHERR:ZERODIV"
+ : endif
+ : return a:a / a:b
+ :endfunction
+ :
+ :function! Write(file)
+ : try
+ : execute "write" fnameescape(a:file)
+ : catch /^Vim(write):/
+ : throw "EXCEPT:IO(" .. getcwd() .. ", " .. a:file .. "):WRITEERR"
+ : endtry
+ :endfunction
+ :
+ :try
+ :
+ : " something with arithmetic and I/O
+ :
+ :catch /^EXCEPT:MATHERR:RANGE/
+ : let function = substitute(v:exception, '.*(\(\a\+\)).*', '\1', "")
+ : echo "Range error in" function
+ :
+ :catch /^EXCEPT:MATHERR/ " catches OVERFLOW and ZERODIV
+ : echo "Math error"
+ :
+ :catch /^EXCEPT:IO/
+ : let dir = substitute(v:exception, '.*(\(.\+\),\s*.\+).*', '\1', "")
+ : let file = substitute(v:exception, '.*(.\+,\s*\(.\+\)).*', '\1', "")
+ : if file !~ '^/'
+ : let file = dir .. "/" .. file
+ : endif
+ : echo 'I/O error for "' .. file .. '"'
+ :
+ :catch /^EXCEPT/
+ : echo "Unspecified error"
+ :
+ :endtry
+
+The exceptions raised by Vim itself (on error or when pressing CTRL-C) use
+a flat hierarchy: they are all in the "Vim" class. You cannot throw yourself
+exceptions with the "Vim" prefix; they are reserved for Vim.
+ Vim error exceptions are parameterized with the name of the command that
+failed, if known. See |catch-errors|.
+
+
+PECULIARITIES
+ *except-compat*
+The exception handling concept requires that the command sequence causing the
+exception is aborted immediately and control is transferred to finally clauses
+and/or a catch clause.
+
+In the Vim script language there are cases where scripts and functions
+continue after an error: in functions without the "abort" flag or in a command
+after ":silent!", control flow goes to the following line, and outside
+functions, control flow goes to the line following the outermost ":endwhile"
+or ":endif". On the other hand, errors should be catchable as exceptions
+(thus, requiring the immediate abortion).
+
+This problem has been solved by converting errors to exceptions and using
+immediate abortion (if not suppressed by ":silent!") only when a try
+conditional is active. This is no restriction since an (error) exception can
+be caught only from an active try conditional. If you want an immediate
+termination without catching the error, just use a try conditional without
+catch clause. (You can cause cleanup code being executed before termination
+by specifying a finally clause.)
+
+When no try conditional is active, the usual abortion and continuation
+behavior is used instead of immediate abortion. This ensures compatibility of
+scripts written for Vim 6.1 and earlier.
+
+However, when sourcing an existing script that does not use exception handling
+commands (or when calling one of its functions) from inside an active try
+conditional of a new script, you might change the control flow of the existing
+script on error. You get the immediate abortion on error and can catch the
+error in the new script. If however the sourced script suppresses error
+messages by using the ":silent!" command (checking for errors by testing
+|v:errmsg| if appropriate), its execution path is not changed. The error is
+not converted to an exception. (See |:silent|.) So the only remaining cause
+where this happens is for scripts that don't care about errors and produce
+error messages. You probably won't want to use such code from your new
+scripts.
+
+ *except-syntax-err*
+Syntax errors in the exception handling commands are never caught by any of
+the ":catch" commands of the try conditional they belong to. Its finally
+clauses, however, is executed.
+ Example: >
+
+ :try
+ : try
+ : throw 4711
+ : catch /\(/
+ : echo "in catch with syntax error"
+ : catch
+ : echo "inner catch-all"
+ : finally
+ : echo "inner finally"
+ : endtry
+ :catch
+ : echo 'outer catch-all caught "' .. v:exception .. '"'
+ : finally
+ : echo "outer finally"
+ :endtry
+
+This displays: >
+ inner finally
+ outer catch-all caught "Vim(catch):E54: Unmatched \("
+ outer finally
+The original exception is discarded and an error exception is raised, instead.
+
+ *except-single-line*
+The ":try", ":catch", ":finally", and ":endtry" commands can be put on
+a single line, but then syntax errors may make it difficult to recognize the
+"catch" line, thus you better avoid this.
+ Example: >
+ :try | unlet! foo # | catch | endtry
+raises an error exception for the trailing characters after the ":unlet!"
+argument, but does not see the ":catch" and ":endtry" commands, so that the
+error exception is discarded and the "E488: Trailing characters" message gets
+displayed.
+
+ *except-several-errors*
+When several errors appear in a single command, the first error message is
+usually the most specific one and therefore converted to the error exception.
+ Example: >
+ echo novar
+causes >
+ E121: Undefined variable: novar
+ E15: Invalid expression: novar
+The value of the error exception inside try conditionals is: >
+ Vim(echo):E121: Undefined variable: novar
+< *except-syntax-error*
+But when a syntax error is detected after a normal error in the same command,
+the syntax error is used for the exception being thrown.
+ Example: >
+ unlet novar #
+causes >
+ E108: No such variable: "novar"
+ E488: Trailing characters
+The value of the error exception inside try conditionals is: >
+ Vim(unlet):E488: Trailing characters
+This is done because the syntax error might change the execution path in a way
+not intended by the user. Example: >
+ try
+ try | unlet novar # | catch | echo v:exception | endtry
+ catch /.*/
+ echo "outer catch:" v:exception
+ endtry
+This displays "outer catch: Vim(unlet):E488: Trailing characters", and then
+a "E600: Missing :endtry" error message is given, see |except-single-line|.
+
+==============================================================================
+9. Examples *eval-examples*
+
+Printing in Binary ~
+>
+ :" The function Nr2Bin() returns the binary string representation of a number.
+ :func Nr2Bin(nr)
+ : let n = a:nr
+ : let r = ""
+ : while n
+ : let r = '01'[n % 2] .. r
+ : let n = n / 2
+ : endwhile
+ : return r
+ :endfunc
+
+ :" The function String2Bin() converts each character in a string to a
+ :" binary string, separated with dashes.
+ :func String2Bin(str)
+ : let out = ''
+ : for ix in range(strlen(a:str))
+ : let out = out .. '-' .. Nr2Bin(char2nr(a:str[ix]))
+ : endfor
+ : return out[1:]
+ :endfunc
+
+Example of its use: >
+ :echo Nr2Bin(32)
+result: "100000" >
+ :echo String2Bin("32")
+result: "110011-110010"
+
+
+Sorting lines ~
+
+This example sorts lines with a specific compare function. >
+
+ :func SortBuffer()
+ : let lines = getline(1, '$')
+ : call sort(lines, function("Strcmp"))
+ : call setline(1, lines)
+ :endfunction
+
+As a one-liner: >
+ :call setline(1, sort(getline(1, '$'), function("Strcmp")))
+
+
+scanf() replacement ~
+ *sscanf*
+There is no sscanf() function in Vim. If you need to extract parts from a
+line, you can use matchstr() and substitute() to do it. This example shows
+how to get the file name, line number and column number out of a line like
+"foobar.txt, 123, 45". >
+ :" Set up the match bit
+ :let mx='\(\f\+\),\s*\(\d\+\),\s*\(\d\+\)'
+ :"get the part matching the whole expression
+ :let l = matchstr(line, mx)
+ :"get each item out of the match
+ :let file = substitute(l, mx, '\1', '')
+ :let lnum = substitute(l, mx, '\2', '')
+ :let col = substitute(l, mx, '\3', '')
+
+The input is in the variable "line", the results in the variables "file",
+"lnum" and "col". (idea from Michael Geddes)
+
+
+getting the scriptnames in a Dictionary ~
+ *scriptnames-dictionary*
+The `:scriptnames` command can be used to get a list of all script files that
+have been sourced. There is also the `getscriptinfo()` function, but the
+information returned is not exactly the same. In case you need to manipulate
+the output of `scriptnames` this code can be used: >
+ " Get the output of ":scriptnames" in the scriptnames_output variable.
+ let scriptnames_output = ''
+ 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 = {}
+ for line in split(scriptnames_output, "\n")
+ " Only do non-blank lines.
+ if line =~ '\S'
+ " Get the first number in the line.
+ let nr = matchstr(line, '\d\+')
+ " Get the file name, remove the script number " 123: ".
+ let name = substitute(line, '.\+:\s*', '', '')
+ " Add an item to the Dictionary
+ let scripts[nr] = name
+ endif
+ endfor
+ unlet scriptnames_output
+
+==============================================================================
+10. Vim script versions *vimscript-version* *vimscript-versions*
+ *scriptversion*
+Over time many features have been added to Vim script. This includes Ex
+commands, functions, variable types, etc. Each individual feature can be
+checked with the |has()| and |exists()| functions.
+
+Sometimes old syntax of functionality gets in the way of making Vim better.
+When support is taken away this will break older Vim scripts. To make this
+explicit the |:scriptversion| command can be used. When a Vim script is not
+compatible with older versions of Vim this will give an explicit error,
+instead of failing in mysterious ways.
+
+When using a legacy function, defined with `:function`, in |Vim9| script then
+scriptversion 4 is used.
+
+ *scriptversion-1* >
+ :scriptversion 1
+< This is the original Vim script, same as not using a |:scriptversion|
+ command. Can be used to go back to old syntax for a range of lines.
+ Test for support with: >
+ has('vimscript-1')
+
+< *scriptversion-2* >
+ :scriptversion 2
+< String concatenation with "." is not supported, use ".." instead.
+ This avoids the ambiguity using "." for Dict member access and
+ floating point numbers. Now ".5" means the number 0.5.
+
+ *scriptversion-3* >
+ :scriptversion 3
+< All |vim-variable|s must be prefixed by "v:". E.g. "version" doesn't
+ work as |v:version| anymore, it can be used as a normal variable.
+ Same for some obvious names as "count" and others.
+
+ Test for support with: >
+ has('vimscript-3')
+<
+ *scriptversion-4* >
+ :scriptversion 4
+< Numbers with a leading zero are not recognized as octal. "0o" or "0O"
+ is still recognized as octal. With the
+ previous version you get: >
+ echo 017 " displays 15 (octal)
+ echo 0o17 " displays 15 (octal)
+ echo 018 " displays 18 (decimal)
+< with script version 4: >
+ echo 017 " displays 17 (decimal)
+ echo 0o17 " displays 15 (octal)
+ echo 018 " displays 18 (decimal)
+< Also, it is possible to use single quotes inside numbers to make them
+ easier to read: >
+ echo 1'000'000
+< The quotes must be surrounded by digits.
+
+ Test for support with: >
+ has('vimscript-4')
+
+==============================================================================
+11. No +eval feature *no-eval-feature*
+
+When the |+eval| feature was disabled at compile time, none of the expression
+evaluation commands are available. To prevent this from causing Vim scripts
+to generate all kinds of errors, the ":if" and ":endif" commands are still
+recognized, though the argument of the ":if" and everything between the ":if"
+and the matching ":endif" is ignored. Nesting of ":if" blocks is allowed, but
+only if the commands are at the start of the line. The ":else" command is not
+recognized.
+
+Example of how to avoid executing commands when the |+eval| feature is
+missing: >
+
+ :if 1
+ : echo "Expression evaluation is compiled in"
+ :else
+ : echo "You will _never_ see this message"
+ :endif
+
+To execute a command only when the |+eval| feature is disabled can be done in
+two ways. The simplest is to exit the script (or Vim) prematurely: >
+ if 1
+ echo "commands executed with +eval"
+ finish
+ endif
+ args " command executed without +eval
+
+If you do not want to abort loading the script you can use 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.
+
+==============================================================================
+12. The sandbox *eval-sandbox* *sandbox*
+
+The 'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline' and
+'foldtext' options may be evaluated in a sandbox. This means that you are
+protected from these expressions having nasty side effects. This gives some
+safety for when these options are set from a modeline. It is also used when
+the command from a tags file is executed and for CTRL-R = in the command line.
+The sandbox is also used for the |:sandbox| command.
+ *E48*
+These items are not allowed in the sandbox:
+ - changing the buffer text
+ - 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
+ - reading or writing a file
+ - jumping to another buffer or editing a file
+ - executing Python, Perl, etc. commands
+This is not guaranteed 100% secure, but it should block most attacks.
+
+ *:san* *:sandbox*
+:san[dbox] {cmd} Execute {cmd} in the sandbox. Useful to evaluate an
+ option that may have been set from a modeline, e.g.
+ 'foldexpr'.
+
+ *sandbox-option*
+A few options contain an expression. When this expression is evaluated it may
+have to be done in the sandbox to avoid a security risk. But the sandbox is
+restrictive, thus this only happens when the option was set from an insecure
+location. Insecure in this context are:
+- sourcing a .vimrc 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.
+
+==============================================================================
+13. Textlock *textlock*
+
+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
+happen any moment the mouse cursor is resting at some position.
+
+This is not allowed when the textlock is active:
+ - changing the buffer text
+ - jumping to another buffer or window
+ - editing another file
+ - closing a window or quitting Vim
+ - etc.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/evim-fr.1 b/runtime/doc/evim-fr.1
new file mode 100644
index 0000000..898ed70
--- /dev/null
+++ b/runtime/doc/evim-fr.1
@@ -0,0 +1,57 @@
+.TH EVIM 1 "16 fvrier 2002"
+.SH NAME
+evim \- Easy Vim , dite un fichier avec Vim sans utiliser les modes
+.SH SYNOPSIS
+.br
+.B evim
+[options] [fichier ...]
+.br
+.B eview
+.SH DESCRIPTION
+.B eVim
+lance
+.B Vim
+et configure ses options afin qu'il se comporte comme un diteur sans mode.
+Cela reste Vim, mais vous pouvez l'utiliser comme un diteur cliquer-taper .
+Cela ressemble beaucoup l'dition avec Notepad sur MS-Windows.
+.B eVim
+ne fonctionne qu'avec l'interface graphique, qui est ncessaire pour permettre
+l'utilisation des menus et de la barre d'outils.
+.PP
+Il n'est utile qu'aux personnes qui ne parviennent vraiment pas utiliser Vim
+de faon traditionnelle. L'dition est alors bien moins efficace.
+.PP
+.B eview
+fait la mme chose, mais dmarre Vim en mode Lecture-seule.
+Cela revient lancer evim \-R.
+.PP
+Voir vim(1) pour davantage d'informations sur Vim, les options, etc.
+.PP
+L'option 'insertmode' est active pour permettre de taper directement du texte.
+.br
+Les mappages sont configurs pour que Copier et Coller fonctionnent avec les
+raccourcis habituels de MS-Windows. CTRL-X coupe le texte, CTRL-C copie le
+texte et CTRL-V colle le texte.
+Vous pouvez utiliser CTRL-Q pour obtenir la fonction originale de CTRL-V.
+.SH OPTIONS
+Voir vim(1).
+.SH FICHIERS
+.TP 15
+/usr/local/lib/vim/evim.vim
+Le script charg pour initialiser eVim.
+.SH AUSSI CONNU SOUS
+galement connu sous le nom Vim pour gumbies [N.D.T. : Flying Circus...].
+Quand vous utilisez eVim, vous tes cens prendre un mouchoir de poche,
+faire un noeud chaque coin et le porter sur votre tte.
+.SH VOIR AUSSI
+vim(1)
+.SH AUTEUR
+La majeure partie de
+.B Vim
+a t crite par Bram Moolenaar, avec l'aide de nombreux autres contributeurs.
+Voir le menu Aide/Remerciements ou ":help credits" dans
+.B Vim.
+.SH TRADUCTION
+Cette page de manuel a t traduite David Blanchet.
+<david.blanchet@free.fr> 2005-03-26.
+Mise jour 2013-05-10, Dominique Pell <dominique.pelle@gmail.com>
diff --git a/runtime/doc/evim-fr.UTF-8.1 b/runtime/doc/evim-fr.UTF-8.1
new file mode 100644
index 0000000..2b38e66
--- /dev/null
+++ b/runtime/doc/evim-fr.UTF-8.1
@@ -0,0 +1,57 @@
+.TH EVIM 1 "16 février 2002"
+.SH NAME
+evim \- « Easy Vim », édite un fichier avec Vim sans utiliser les modes
+.SH SYNOPSIS
+.br
+.B evim
+[options] [fichier ...]
+.br
+.B eview
+.SH DESCRIPTION
+.B eVim
+lance
+.B Vim
+et configure ses options afin qu'il se comporte comme un éditeur sans mode.
+Cela reste Vim, mais vous pouvez l'utiliser comme un éditeur « cliquer-taper ».
+Cela ressemble beaucoup à l'édition avec Notepad sur MS-Windows.
+.B eVim
+ne fonctionne qu'avec l'interface graphique, qui est nécessaire pour permettre
+l'utilisation des menus et de la barre d'outils.
+.PP
+Il n'est utile qu'aux personnes qui ne parviennent vraiment pas à utiliser Vim
+de façon traditionnelle. L'édition est alors bien moins efficace.
+.PP
+.B eview
+fait la même chose, mais démarre Vim en mode Lecture-seule.
+Cela revient à lancer evim \-R.
+.PP
+Voir vim(1) pour davantage d'informations sur Vim, les options, etc.
+.PP
+L'option 'insertmode' est activée pour permettre de taper directement du texte.
+.br
+Les mappages sont configurés pour que Copier et Coller fonctionnent avec les
+raccourcis habituels de MS-Windows. CTRL-X coupe le texte, CTRL-C copie le
+texte et CTRL-V colle le texte.
+Vous pouvez utiliser CTRL-Q pour obtenir la fonction originale de CTRL-V.
+.SH OPTIONS
+Voir vim(1).
+.SH FICHIERS
+.TP 15
+/usr/local/lib/vim/evim.vim
+Le script chargé pour initialiser eVim.
+.SH AUSSI CONNU SOUS
+Également connu sous le nom « Vim pour gumbies » [N.D.T. : Flying Circus...].
+Quand vous utilisez eVim, vous êtes censé prendre un mouchoir de poche,
+faire un noeud à chaque coin et le porter sur votre tête.
+.SH VOIR AUSSI
+vim(1)
+.SH AUTEUR
+La majeure partie de
+.B Vim
+a été écrite par Bram Moolenaar, avec l'aide de nombreux autres contributeurs.
+Voir le menu Aide/Remerciements ou ":help credits" dans
+.B Vim.
+.SH TRADUCTION
+Cette page de manuel a été traduite David Blanchet.
+<david.blanchet@free.fr> 2005-03-26.
+Mise à jour 2013-05-10, Dominique Pellé <dominique.pelle@gmail.com>
diff --git a/runtime/doc/evim-it.1 b/runtime/doc/evim-it.1
new file mode 100644
index 0000000..1e98a2d
--- /dev/null
+++ b/runtime/doc/evim-it.1
@@ -0,0 +1,54 @@
+.TH EVIM 1 "16 febbraio 2002 "
+.SH NOME
+evim \- Vim "facile", Vim impostato in modo da poter essere usato
+facilmente per modificare file, anche da chi non abbia familiarit
+con i comandi.
+.SH SINTASSI
+.br
+.B evim
+[opzioni] [file ..]
+.br
+.B eview
+.SH DESCRIZIONE
+.B evim
+Inizia
+.B Vim
+e imposta le opzioni per farlo comportare come un editore "modeless".
+State sempre usando Vim, ma come un editore "posizionati-e-clicca".
+Simile all'uso di Notepad in MS-Windows.
+.B evim
+richiede la presenza della GUI, per avere a disposizione men e barra
+strumenti.
+.PP
+Da usarsi soltanto se non si in grado di lavorare con Vim nella
+maniera usuale.
+La modifica file sar molto meno efficiente.
+.PP
+.B eview
+come sopra, ma parte in modalit "Sola Lettura". Funziona come evim \-R.
+.PP
+Vedere vim(1) per dettagli riguardo a Vim, opzioni, etc.
+.PP
+L'opzione 'insertmode' impostata per poter immettere del testo direttamente.
+.br
+Sono definite delle mappature che consentono di usare COPIA e INCOLLA con i
+familiari tasti usati sotto MS-Windows.
+CTRL-X taglia testo, CTRL-C copia testo e CTRL-V incolla testo.
+Usate CTRL-Q per ottenere quello che si otterrebbe con CTRL-V in Vim nativo.
+.SH OPZIONI
+Vedere vim(1).
+.SH FILE
+.TP 15
+/usr/local/lib/vim/evim.vim
+Lo script caricato per inizializzare eVim.
+.SH NAC [NOTO ANCHE COME]
+Noto Anche Come "Vim per semplici".
+Quando usate evim si suppone che prendiate un fazzoletto,
+facciate un nodo ad ogni angolo e ve lo mettiate in testa.
+.SH VEDERE ANCHE
+vim(1)
+.SH AUTORE
+Buona parte di
+.B Vim
+ stato scritto da Bram Moolenaar, con molto aiuto da altri.
+Vedere il men "Aiuto/Crediti".
diff --git a/runtime/doc/evim-it.UTF-8.1 b/runtime/doc/evim-it.UTF-8.1
new file mode 100644
index 0000000..f96d0cb
--- /dev/null
+++ b/runtime/doc/evim-it.UTF-8.1
@@ -0,0 +1,54 @@
+.TH EVIM 1 "16 febbraio 2002 "
+.SH NOME
+evim \- Vim "facile", Vim impostato in modo da poter essere usato
+facilmente per modificare file, anche da chi non abbia familiarità
+con i comandi.
+.SH SINTASSI
+.br
+.B evim
+[opzioni] [file ..]
+.br
+.B eview
+.SH DESCRIZIONE
+.B evim
+Inizia
+.B Vim
+e imposta le opzioni per farlo comportare come un editore "modeless".
+State sempre usando Vim, ma come un editore "posizionati-e-clicca".
+Simile all'uso di Notepad in MS-Windows.
+.B evim
+richiede la presenza della GUI, per avere a disposizione menù e barra
+strumenti.
+.PP
+Da usarsi soltanto se non si è in grado di lavorare con Vim nella
+maniera usuale.
+La modifica file sarà molto meno efficiente.
+.PP
+.B eview
+come sopra, ma parte in modalità "Sola Lettura". Funziona come evim \-R.
+.PP
+Vedere vim(1) per dettagli riguardo a Vim, opzioni, etc.
+.PP
+L'opzione 'insertmode' è impostata per poter immettere del testo direttamente.
+.br
+Sono definite delle mappature che consentono di usare COPIA e INCOLLA con i
+familiari tasti usati sotto MS-Windows.
+CTRL-X taglia testo, CTRL-C copia testo e CTRL-V incolla testo.
+Usate CTRL-Q per ottenere quello che si otterrebbe con CTRL-V in Vim nativo.
+.SH OPZIONI
+Vedere vim(1).
+.SH FILE
+.TP 15
+/usr/local/lib/vim/evim.vim
+Lo script caricato per inizializzare eVim.
+.SH NAC [NOTO ANCHE COME]
+Noto Anche Come "Vim per semplici".
+Quando usate evim si suppone che prendiate un fazzoletto,
+facciate un nodo ad ogni angolo e ve lo mettiate in testa.
+.SH VEDERE ANCHE
+vim(1)
+.SH AUTORE
+Buona parte di
+.B Vim
+è stato scritto da Bram Moolenaar, con molto aiuto da altri.
+Vedere il menù "Aiuto/Crediti".
diff --git a/runtime/doc/evim-ja.UTF-8.1 b/runtime/doc/evim-ja.UTF-8.1
new file mode 100644
index 0000000..1a03527
--- /dev/null
+++ b/runtime/doc/evim-ja.UTF-8.1
@@ -0,0 +1,48 @@
+.TH EVIM 1 "2002 February 16"
+.SH 名前
+evim \- easy Vim, モードレスエディタ Vim
+.SH 書式
+.br
+.B evim
+[options] [file ..]
+.br
+.B eview
+.SH 説明
+.B eVim
+は
+.B Vim
+を起動して、モードレスエディタとして動作するためのオプションを設定します。
+Vim の動作が point-and-click エディタのような動作になります。
+MS-Windows のメモ帳のような動作です。
+.B eVim
+は常に GUI で起動し、メニューとツールバーを表示します。
+.PP
+どうしても Vim の操作に馴染めない場合に使ってください。
+編集効率は下がります。
+.PP
+.B eview
+は同様に、読み込み専用モードで起動します。evim \-R と同じです。
+.PP
+引数や Vim についての詳細は vim(1) を参照してください。
+.PP
+オプション 'insertmode' が設定され、テキストを直接、入力できるようになります。
+.br
+コピーとペーストのキー操作が MS-Windows と同じになるように、マップが設定されます。
+CTRL-X が切り取り、CTRL-C がコピー、CTRL-V がペーストです。
+標準の CTRL-V の操作は CTRL-Q に割り当てられます。
+.SH オプション
+vim(1) を参照してください。
+.SH ファイル
+.TP 15
+/usr/local/lib/vim/evim.vim
+eVim の初期化スクリプト。
+.SH 別名
+evim は "gumbies のための Vim" とも呼ばれています。
+evim を使っているあなたはきっと、頭にハンカチをかぶっているのです。
+(訳注: gumbies は Monty Python に登場するおもしろ集団。ハンカチをかぶっている。)
+.SH 関連項目
+vim(1)
+.SH 著者
+.B Vim
+のほとんどの機能は Bram Moolenaar が開発し、多くの人が協力しました。
+メニューの Help/Credits を参照してください。
diff --git a/runtime/doc/evim-pl.1 b/runtime/doc/evim-pl.1
new file mode 100644
index 0000000..490ee3a
--- /dev/null
+++ b/runtime/doc/evim-pl.1
@@ -0,0 +1,53 @@
+.TH EVIM 1 "2002 Lut 16"
+.SH NAZWA
+evim \- atwy Vim, edytuj plik w Vimie z ustawieniami dla edycji bez
+trybw
+.SH SYNOPSIS
+.br
+.B evim
+[opcje] [plik ...]
+.br
+.B eview
+.SH OPIS
+.B eVim
+uruchamia
+.B Vima
+i ustawia opcje tak by zachowywa si jak edytor bez trybw.
+To jest cay czas Vim ale uywany jako edytor wska-i-kliknij.
+Zachowanie w stylu Notepada dla MS-Windows.
+.B eVim
+bdzie zawsze uruchomiony w GUI by wczy menu i pasek narzdzi.
+.PP
+Przeznaczony tylko dla ludzi, ktrzy naprawd nie mog pracowa
+z Vimem w normalny sposb. Edycja bdzie o wiele mniej efektywna.
+.PP
+.B eview
+dziaa tak samo, ale zaczyna w trybie tylko do odczytu. Dziaa tak
+samo jak evim \-R.
+.PP
+Zobacz vim(1) by pozna wicej szczegw o Vimie, opcjach, itd.
+.PP
+Opcja 'insertmode' jest ustawiona by mona byo od razu wpisywa
+tekst.
+.br
+Mapowania s ustawione tak by Kopiowanie i Wklejanie dziaao
+z klawiszami MS-Windows. CTRL-X wycina, CTRL-C kopiuje a CTRL-V
+wkleja tekst. Uyj CTRL-Q by uzyska oryginalne przeznaczenie
+CTRL-V.
+.SH OPCJE
+Zobacz vim(1).
+.SH PLIKI
+.TP 15
+/usr/local/lib/vim/evim.vim
+Skrypt uruchamiania dla eVima.
+.SH ZNANY JAKO
+Znany jako "Vim dla frajerw".
+Jeli uywasz eVima oczekuje si, e wyjmiesz chusteczk do nosa,
+zrobisz wz w kadym rogu i bdziesz to nosi na gowie.
+.SH ZOBACZ TAKE
+vim(1)
+.SH AUTOR
+Wikszo
+.B Vima
+zostaa napisana przez Brama Moolenaara z du pomoc innych osb.
+Zobacz menu Help/Credits.
diff --git a/runtime/doc/evim-pl.UTF-8.1 b/runtime/doc/evim-pl.UTF-8.1
new file mode 100644
index 0000000..096a12a
--- /dev/null
+++ b/runtime/doc/evim-pl.UTF-8.1
@@ -0,0 +1,53 @@
+.TH EVIM 1 "2002 Lut 16"
+.SH NAZWA
+evim \- łatwy Vim, edytuj plik w Vimie z ustawieniami dla edycji bez
+trybów
+.SH SYNOPSIS
+.br
+.B evim
+[opcje] [plik ...]
+.br
+.B eview
+.SH OPIS
+.B eVim
+uruchamia
+.B Vima
+i ustawia opcje tak by zachowywał się jak edytor bez trybów.
+To jest cały czas Vim ale używany jako edytor wskaż-i-kliknij.
+Zachowanie w stylu Notepada dla MS-Windows.
+.B eVim
+będzie zawsze uruchomiony w GUI by włączyć menu i pasek narzędzi.
+.PP
+Przeznaczony tylko dla ludzi, którzy naprawdę nie mogą pracować
+z Vimem w normalny sposób. Edycja będzie o wiele mniej efektywna.
+.PP
+.B eview
+działa tak samo, ale zaczyna w trybie tylko do odczytu. Działa tak
+samo jak evim \-R.
+.PP
+Zobacz vim(1) by poznać więcej szczegółów o Vimie, opcjach, itd.
+.PP
+Opcja 'insertmode' jest ustawiona by można było od razu wpisywać
+tekst.
+.br
+Mapowania są ustawione tak by Kopiowanie i Wklejanie działało
+z klawiszami MS-Windows. CTRL-X wycina, CTRL-C kopiuje a CTRL-V
+wkleja tekst. Użyj CTRL-Q by uzyskać oryginalne przeznaczenie
+CTRL-V.
+.SH OPCJE
+Zobacz vim(1).
+.SH PLIKI
+.TP 15
+/usr/local/lib/vim/evim.vim
+Skrypt uruchamiania dla eVima.
+.SH ZNANY JAKO
+Znany jako "Vim dla frajerów".
+Jeśli używasz eVima oczekuje się, że wyjmiesz chusteczkę do nosa,
+zrobisz węzęł w każdym rogu i będziesz to nosił na głowie.
+.SH ZOBACZ TAKŻE
+vim(1)
+.SH AUTOR
+Większość
+.B Vima
+została napisana przez Brama Moolenaara z dużą pomocą innych osób.
+Zobacz menu Help/Credits.
diff --git a/runtime/doc/evim-ru.1 b/runtime/doc/evim-ru.1
new file mode 100644
index 0000000..6d6f5de
--- /dev/null
+++ b/runtime/doc/evim-ru.1
@@ -0,0 +1,59 @@
+.TH EVIM 1 "2002 February 16"
+.SH
+evim \- Vim, Vim
+.SH
+.br
+.B evim
+[] [ ..]
+.br
+.B eview
+.SH
+
+.B evim
+
+.B Vim
+ ,
+ . Vim
+Notepad MS-Windows.
+.B eVim
+ ,
+ .
+.PP
+ , -
+ Vim .
+ , Vim.
+.PP
+
+.B eview
+ , "
+ ".
+evim \-R.
+.PP
+ Vim, ..
+vim(1).
+.PP
+
+.B evim
+ 'insertmode', .
+.br
+ , , MS-Windows
+ . CTRL-X
+, CTRL-C CTRL-V .
+ CTRL-V, CTRL-Q.
+.SH
+. vim(1).
+.SH
+.TP 15
+/usr/local/lib/vim/evim.vim
+, eVim.
+.SH AKA
+eVim "Vim ".
+
+ , .
+.SH
+vim(1)
+.SH
+
+.B Vim
+ (Bram Moolenaar),
+ . . /.
diff --git a/runtime/doc/evim-ru.UTF-8.1 b/runtime/doc/evim-ru.UTF-8.1
new file mode 100644
index 0000000..581c364
--- /dev/null
+++ b/runtime/doc/evim-ru.UTF-8.1
@@ -0,0 +1,59 @@
+.TH EVIM 1 "2002 February 16"
+.SH ИМЯ
+evim \- простой Vim, позволяет редактировать файл с помощью Vim в безрежимном режиме
+.SH КОМАНДНАЯ СТРОКА
+.br
+.B evim
+[ключи] [файл ..]
+.br
+.B eview
+.SH ОПИСАНИЕ
+Команда
+.B evim
+запускает
+.B Vim
+и настраивает ряд опций таким образом, что он начинает вести себя
+как обычный безрежимный редактор. В этом режиме Vim напоминает
+Notepad из MS-Windows.
+.B eVim
+всегда запускается с поддержкой графического интерфейса, чтобы обеспечить
+использование меню и инструментальной панели.
+.PP
+Эта команда создана для тех, кто по каким-то причинам не в состоянии
+работать с Vim в обычном режиме. Редактирование файлов при этом происходит
+гораздо менее эффективно, чем при использовании обычного Vim.
+.PP
+Команда
+.B eview
+выполняет почти ту же самую задачу, но файл открывается в режиме "только
+для чтения". Использование этой команды полностью идентично использованию
+evim \-R.
+.PP
+Подробнее о Vim, ключах запуска и т.п. смотрите на странице справочника
+vim(1).
+.PP
+При использовании
+.B evim
+включается опция 'insertmode', что позволяет вводить текст напрямую.
+.br
+Кроме того, настраиваются привязки, позволяющие использовать кнопки MS-Windows
+для выполнения команд копирования и вклейки. CTRL-X используется для вырезания
+текста, CTRL-C для копирования и CTRL-V для вклейки. Чтобы воспользоваться
+изначальным значением кнопки CTRL-V, используйте CTRL-Q.
+.SH ПАРАМЕТРЫ ЗАПУСКА
+См. vim(1).
+.SH ФАЙЛЫ
+.TP 15
+/usr/local/lib/vim/evim.vim
+Сценарий, который загружается для инициализации eVim.
+.SH AKA
+eVim также известен как "Vim для чайников".
+Для наилучшего эффекта рекомендуется во время использования повязать
+на голове платок, предварительно завязав на каждом конце по узелку.
+.SH СМОТРИ ТАКЖЕ
+vim(1)
+.SH АВТОРЫ
+Большая часть
+.B Vim
+создана Брамом Мооленааром (Bram Moolenaar), которому помогает огромное
+количество людей. См. меню Справка/Благодарности.
diff --git a/runtime/doc/evim-tr.1 b/runtime/doc/evim-tr.1
new file mode 100644
index 0000000..2304b8a
--- /dev/null
+++ b/runtime/doc/evim-tr.1
@@ -0,0 +1,48 @@
+.TH EVIM 1 "16 ubat 2002"
+.SH AD
+evim \- kolay Vim, bir dosyay Vim ile herhangi bir kip olmadan dzenleyin
+.SH ZET
+.br
+.B evim
+[seenekler] [dosya ..]
+.br
+.B eview
+.SH TANIM
+.B eVim,
+.B Vim'i
+balatr ve onu herhangi bir kipsiz dzenleyici gibi davranmasn salar.
+Bu bildiiniz Vim'dir, ancak bir tkla ve yaz dzenleyicisi gibi alr.
+Bir rnek vermek gerekirse MS-Windows zerindeki Not Defteri gibi dnn.
+.B eVim
+menlere ve ara ubuklarna eriim salayabilmeniz iin grafik arabirimde alr.
+.PP
+Yalnzca Vim ile normal biimde alamayan kiilerin kullanm iindir.
+Dosya dzenleme ii ok daha verimsiz olacaktr.
+.PP
+.B eview'n
+aynsdr, ancak saltokunur kipte balar. evim \-R ile de balatlabilir.
+.PP
+Vim hakknda ayrntl bilgi iin: vim(1)
+.PP
+Dorudan metin giriini salayabilmek iin 'insertmode' seenei alr.
+.br
+Elemlemeler Kopyala ve Yaptr MS-Windows ile ayn olacak biimde ayarlanr.
+CTRL-X metni keser, CTRL-C metni kopyalar ve CTRL-V metni yaptrr.
+CTRL-V'nin orijinal ilevi iin CTRL-Q kullann.
+.SH SEENEKLER
+Bilgi iin: vim(1).
+.SH DOSYALAR
+.TP 15
+/usr/local/lib/vim/evim.vim
+eVim'i ilklendirmek iin kullanlan betik.
+.SH NAM-I DER
+Nam- dier "Lastik izmeliler iin Vim" (Gumbies, Monty Python).
+eVim'i kullanrken bir mendili alp iki ucundan birer dm yapmanz
+ve kafanza takmanz beklenir.
+.SH AYRICA BAKINIZ
+vim(1)
+.SH YAZAR
+.B Vim'in
+byk ounluu Bram Moolenaar tarafndan bakalarnn kayda deer
+yardmlaryla yazlmtr.
+Ek bilgi iin Yardm/Teekkrler mensne bakn.
diff --git a/runtime/doc/evim-tr.UTF-8.1 b/runtime/doc/evim-tr.UTF-8.1
new file mode 100644
index 0000000..b7eb54a
--- /dev/null
+++ b/runtime/doc/evim-tr.UTF-8.1
@@ -0,0 +1,48 @@
+.TH EVIM 1 "16 Şubat 2002"
+.SH AD
+evim \- kolay Vim, bir dosyayı Vim ile herhangi bir kip olmadan düzenleyin
+.SH ÖZET
+.br
+.B evim
+[seçenekler] [dosya ..]
+.br
+.B eview
+.SH TANIM
+.B eVim,
+.B Vim'i
+başlatır ve onu herhangi bir kipsiz düzenleyici gibi davranmasını sağlar.
+Bu bildiğiniz Vim'dir, ancak bir tıkla ve yaz düzenleyicisi gibi çalışır.
+Bir örnek vermek gerekirse MS-Windows üzerindeki Not Defteri gibi düşünün.
+.B eVim
+menülere ve araç çubuklarına erişim sağlayabilmeniz için grafik arabirimde çalışır.
+.PP
+Yalnızca Vim ile normal biçimde çalışamayan kişilerin kullanımı içindir.
+Dosya düzenleme işi çok daha verimsiz olacaktır.
+.PP
+.B eview'ün
+aynısıdır, ancak saltokunur kipte başlar. evim \-R ile de başlatılabilir.
+.PP
+Vim hakkında ayrıntılı bilgi için: vim(1)
+.PP
+Doğrudan metin girişini sağlayabilmek için 'insertmode' seçeneği açılır.
+.br
+Eşlemlemeler Kopyala ve Yapıştır MS-Windows ile aynı olacak biçimde ayarlanır.
+CTRL-X metni keser, CTRL-C metni kopyalar ve CTRL-V metni yapıştırır.
+CTRL-V'nin orijinal işlevi için CTRL-Q kullanın.
+.SH SEÇENEKLER
+Bilgi için: vim(1).
+.SH DOSYALAR
+.TP 15
+/usr/local/lib/vim/evim.vim
+eVim'i ilklendirmek için kullanılan betik.
+.SH NAM-I DİĞER
+Nam-ı diğer "Lastik Çizmeliler için Vim" (Gumbies, Monty Python).
+eVim'i kullanırken bir mendili alıp iki ucundan birer düğüm yapmanız
+ve kafanıza takmanız beklenir.
+.SH AYRICA BAKINIZ
+vim(1)
+.SH YAZAR
+.B Vim'in
+büyük çoğunluğu Bram Moolenaar tarafından başkalarının kayda değer
+yardımlarıyla yazılmıştır.
+Ek bilgi için Yardım/Teşekkürler menüsüne bakın.
diff --git a/runtime/doc/evim.1 b/runtime/doc/evim.1
new file mode 100644
index 0000000..bb859ce
--- /dev/null
+++ b/runtime/doc/evim.1
@@ -0,0 +1,49 @@
+.TH EVIM 1 "2002 February 16"
+.SH NAME
+evim \- easy Vim, edit a file with Vim and setup for modeless editing
+.SH SYNOPSIS
+.br
+.B evim
+[options] [file ..]
+.br
+.B eview
+.SH DESCRIPTION
+.B eVim
+starts
+.B Vim
+and sets options to make it behave like a modeless editor.
+This is still Vim but used as a point-and-click editor.
+This feels a lot like using Notepad on MS-Windows.
+.B eVim
+will always run in the GUI, to enable the use of menus and toolbar.
+.PP
+Only to be used for people who really can't work with Vim in the normal way.
+Editing will be much less efficient.
+.PP
+.B eview
+is the same, but starts in read-only mode. It works just like evim \-R.
+.PP
+See vim(1) for details about Vim, options, etc.
+.PP
+The 'insertmode' option is set to be able to type text directly.
+.br
+Mappings are setup to make Copy and Paste work with the MS-Windows keys.
+CTRL-X cuts text, CTRL-C copies text and CTRL-V pastes text.
+Use CTRL-Q to obtain the original meaning of CTRL-V.
+.SH OPTIONS
+See vim(1).
+.SH FILES
+.TP 15
+/usr/local/lib/vim/evim.vim
+The script loaded to initialize eVim.
+.SH AKA
+Also Known As "Vim for gumbies".
+When using evim you are expected to take a handkerchief,
+make a knot in each corner and wear it on your head.
+.SH SEE ALSO
+vim(1)
+.SH AUTHOR
+Most of
+.B Vim
+was made by Bram Moolenaar, with a lot of help from others.
+See the Help/Credits menu.
diff --git a/runtime/doc/evim.man b/runtime/doc/evim.man
new file mode 100644
index 0000000..8b8db81
--- /dev/null
+++ b/runtime/doc/evim.man
@@ -0,0 +1,52 @@
+EVIM(1) EVIM(1)
+
+
+
+NAME
+ evim - easy Vim, edit a file with Vim and setup for modeless editing
+
+SYNOPSIS
+ evim [options] [file ..]
+ eview
+
+DESCRIPTION
+ eVim starts Vim and sets options to make it behave like a modeless edi-
+ tor. This is still Vim but used as a point-and-click editor. This
+ feels a lot like using Notepad on MS-Windows. eVim will always run in
+ the GUI, to enable the use of menus and toolbar.
+
+ Only to be used for people who really can't work with Vim in the normal
+ way. Editing will be much less efficient.
+
+ eview is the same, but starts in read-only mode. It works just like
+ evim -R.
+
+ See vim(1) for details about Vim, options, etc.
+
+ The 'insertmode' option is set to be able to type text directly.
+ Mappings are setup to make Copy and Paste work with the MS-Windows
+ keys. CTRL-X cuts text, CTRL-C copies text and CTRL-V pastes text.
+ Use CTRL-Q to obtain the original meaning of CTRL-V.
+
+OPTIONS
+ See vim(1).
+
+FILES
+ /usr/local/lib/vim/evim.vim
+ The script loaded to initialize eVim.
+
+AKA
+ Also Known As "Vim for gumbies". When using evim you are expected to
+ take a handkerchief, make a knot in each corner and wear it on your
+ head.
+
+SEE ALSO
+ vim(1)
+
+AUTHOR
+ Most of Vim was made by Bram Moolenaar, with a lot of help from others.
+ See the Help/Credits menu.
+
+
+
+ 2002 February 16 EVIM(1)
diff --git a/runtime/doc/farsi.txt b/runtime/doc/farsi.txt
new file mode 100644
index 0000000..a2afab4
--- /dev/null
+++ b/runtime/doc/farsi.txt
@@ -0,0 +1,19 @@
+*farsi.txt* For Vim version 9.0. Last change: 2019 May 05
+
+
+ VIM REFERENCE MANUAL by Mortaza Ghassab Shiran
+
+
+Right to Left and Farsi Mapping for Vim *farsi* *Farsi*
+
+
+ *E27*
+Farsi support has been removed in patch 8.1.0932. At that time it was
+outdated and unused.
+
+If you would like to bring Farsi support back, please have a look at the old
+Farsi code, as it was present at the 8.1 release. It should be merged with
+Arabic support using the Unicode character set.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/filetype.txt b/runtime/doc/filetype.txt
new file mode 100644
index 0000000..b8686a1
--- /dev/null
+++ b/runtime/doc/filetype.txt
@@ -0,0 +1,803 @@
+*filetype.txt* For Vim version 9.0. Last change: 2023 Feb 15
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|.
+
+
+==============================================================================
+1. Filetypes *filetypes* *file-types*
+
+Vim can detect the type of file that is edited. This is done by checking the
+file name and sometimes by inspecting the contents of the file for specific
+text.
+
+ *:filetype* *:filet*
+To enable file type detection, use this command in your vimrc: >
+ :filetype on
+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.
+
+NOTE: Filetypes and 'compatible' don't work together well, since being Vi
+compatible means options are global. Resetting 'compatible' is recommended,
+if you didn't do that already.
+
+Detail: The ":filetype on" command will load one of these files:
+ Amiga $VIMRUNTIME/filetype.vim
+ Mac $VIMRUNTIME:filetype.vim
+ MS-Windows $VIMRUNTIME\filetype.vim
+ Unix $VIMRUNTIME/filetype.vim
+ VMS $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
+ also sourced. See |'go-M'| about avoiding that.
+
+To add your own file types, see |new-filetype| below. To search for help on a
+filetype prepend "ft-" and optionally append "-syntax", "-indent" or
+"-plugin". For example: >
+ :help ft-vim-indent
+ :help ft-vim-syntax
+ :help ft-man-plugin
+
+If the file type is not detected automatically, or it finds the wrong type,
+you can either set the 'filetype' option manually, or add a modeline to your
+file. Example, for an IDL file use the command: >
+ :set filetype=idl
+
+or add this |modeline| to the file:
+ /* vim: set filetype=idl : */ ~
+
+ *:filetype-plugin-on*
+You can enable loading the plugin files for specific file types with: >
+ :filetype plugin on
+If filetype detection was not switched on yet, it will be as well.
+This actually loads the file "ftplugin.vim" in 'runtimepath'.
+The result is that when a file is edited its plugin file is loaded (if there
+is one for the detected filetype). |filetype-plugin|
+
+ *:filetype-plugin-off*
+You can disable it again with: >
+ :filetype plugin off
+The filetype detection is not switched off then. But if you do switch off
+filetype detection, the plugins will not be loaded either.
+This actually loads the file "ftplugof.vim" in 'runtimepath'.
+
+ *:filetype-indent-on*
+You can enable loading the indent file for specific file types with: >
+ :filetype indent on
+If filetype detection was not switched on yet, it will be as well.
+This actually loads the file "indent.vim" in 'runtimepath'.
+The result is that when a file is edited its indent file is loaded (if there
+is one for the detected filetype). |indent-expression|
+
+ *:filetype-indent-off*
+You can disable it again with: >
+ :filetype indent off
+The filetype detection is not switched off then. But if you do switch off
+filetype detection, the indent files will not be loaded either.
+This actually loads the file "indoff.vim" in 'runtimepath'.
+This disables auto-indenting for files you will open. It will keep working in
+already opened files. Reset 'autoindent', 'cindent', 'smartindent' and/or
+'indentexpr' to disable indenting in an opened file.
+
+ *:filetype-off*
+To disable file type detection, use this command: >
+ :filetype off
+This will keep the flags for "plugin" and "indent", but since no file types
+are being detected, they won't work until the next ":filetype on".
+
+
+Overview: *:filetype-overview*
+
+command detection plugin indent ~
+:filetype on on unchanged unchanged
+:filetype off off unchanged unchanged
+:filetype plugin on on on unchanged
+:filetype plugin off unchanged off unchanged
+:filetype indent on on unchanged on
+:filetype indent off unchanged unchanged off
+:filetype plugin indent on on on on
+:filetype plugin indent off unchanged off off
+
+To see the current status, type: >
+ :filetype
+The output looks something like this: >
+ filetype detection:ON plugin:ON indent:OFF
+
+The file types are also used for syntax highlighting. If the ":syntax on"
+command is used, the file type detection is installed too. There is no need
+to do ":filetype on" after ":syntax on".
+
+To disable one of the file types, add a line in your filetype file, see
+|remove-filetype|.
+
+ *filetype-detect*
+To detect the file type again: >
+ :filetype detect
+Use this if you started with an empty file and typed text that makes it
+possible to detect the file type. For example, when you entered this in a
+shell script: "#!/bin/csh".
+ When filetype detection was off, it will be enabled first, like the "on"
+argument was used.
+
+ *filetype-overrule*
+When the same extension is used for multiple filetypes, Vim tries to guess
+what kind of file it is. This doesn't always work. A number of global
+variables can be used to overrule the filetype used for certain extensions:
+
+ file name variable ~
+ *.asa g:filetype_asa |ft-aspvbs-syntax| |ft-aspperl-syntax|
+ *.asm g:asmsyntax |ft-asm-syntax|
+ *.asp g:filetype_asp |ft-aspvbs-syntax| |ft-aspperl-syntax|
+ *.bas g:filetype_bas |ft-basic-syntax|
+ *.cfg g:filetype_cfg
+ *.cls g:filetype_cls
+ *.csh g:filetype_csh |ft-csh-syntax|
+ *.dat g:filetype_dat
+ *.frm g:filetype_frm |ft-form-syntax|
+ *.fs g:filetype_fs |ft-forth-syntax|
+ *.i g:filetype_i |ft-progress-syntax|
+ *.inc g:filetype_inc
+ *.lsl g:filetype_lsl
+ *.m g:filetype_m |ft-mathematica-syntax|
+ *.mod g:filetype_mod
+ *.p g:filetype_p |ft-pascal-syntax|
+ *.pl g:filetype_pl
+ *.pp g:filetype_pp |ft-pascal-syntax|
+ *.prg g:filetype_prg
+ *.r g:filetype_r
+ *.sig g:filetype_sig
+ *.sql g:filetype_sql |ft-sql-syntax|
+ *.src g:filetype_src
+ *.sys g:filetype_sys
+ *.sh g:bash_is_sh |ft-sh-syntax|
+ *.tex g:tex_flavor |ft-tex-plugin|
+ *.w g:filetype_w |ft-cweb-syntax|
+
+For a few filetypes the global variable is used only when the filetype could
+not be detected:
+ *.r g:filetype_r |ft-rexx-syntax|
+
+ *filetype-ignore*
+To avoid that certain files are being inspected, the g:ft_ignore_pat variable
+is used. The default value is set like this: >
+ :let g:ft_ignore_pat = '\.\(Z\|gz\|bz2\|zip\|tgz\)$'
+This means that the contents of compressed files are not inspected.
+
+ *new-filetype*
+If a file type that you want to use is not detected yet, there are four ways
+to add it. In any way, it's better not to modify the $VIMRUNTIME/filetype.vim
+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
+ 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"
+ inside it. Example for Unix: >
+ :!mkdir ~/.vim
+ :!mkdir ~/.vim/ftdetect
+<
+ 2. Create a file that contains an autocommand to detect the file type.
+ Example: >
+ au BufRead,BufNewFile *.mine set filetype=mine
+< Note that there is no "augroup" command, this has already been done
+ when sourcing your file. You could also use the pattern "*" and then
+ check the contents of the file to recognize it.
+ Write this file as "mine.vim" in the "ftdetect" directory in your user
+ runtime directory. For example, for Unix: >
+ :w ~/.vim/ftdetect/mine.vim
+
+< 3. To use the new filetype detection you must restart Vim.
+
+ The files in the "ftdetect" directory are used after all the default
+ checks, thus they can overrule a previously detected file type. But you
+ can also use |:setfiletype| to keep a previously detected filetype.
+
+B. If you want to detect your file after the default file type checks.
+
+ This works like A above, but instead of setting 'filetype' unconditionally
+ use ":setfiletype". This will only set 'filetype' if no file type was
+ detected yet. Example: >
+ au BufRead,BufNewFile *.txt setfiletype text
+<
+ You can also use the already detected file type in your command. For
+ example, to use the file type "mypascal" when "pascal" has been detected: >
+ au BufRead,BufNewFile * if &ft == 'pascal' | set ft=mypascal
+ | endif
+
+C. If your file type can be detected by the file name.
+ 1. Create your user runtime directory. You would normally use the first
+ item of the 'runtimepath' option. Example for Unix: >
+ :!mkdir ~/.vim
+<
+ 2. Create a file that contains autocommands to detect the file type.
+ Example: >
+ " my filetype file
+ if exists("did_load_filetypes")
+ finish
+ endif
+ augroup filetypedetect
+ au! BufRead,BufNewFile *.mine setfiletype mine
+ au! BufRead,BufNewFile *.xyz setfiletype drawing
+ augroup END
+< Write this file as "filetype.vim" in your user runtime directory. For
+ example, for Unix: >
+ :w ~/.vim/filetype.vim
+
+< 3. To use the new filetype detection you must restart Vim.
+
+ Your filetype.vim will be sourced before the default FileType autocommands
+ have been installed. Your autocommands will match first, and the
+ ":setfiletype" command will make sure that no other autocommands will set
+ 'filetype' after this.
+ *new-filetype-scripts*
+D. If your filetype can only be detected by inspecting the contents of the
+ file.
+
+ 1. Create your user runtime directory. You would normally use the first
+ item of the 'runtimepath' option. Example for Unix: >
+ :!mkdir ~/.vim
+<
+ 2. Create a vim script file for doing this. Example: >
+ if did_filetype() " filetype already set..
+ finish " ..don't do these checks
+ endif
+ if getline(1) =~ '^#!.*\<mine\>'
+ setfiletype mine
+ elseif getline(1) =~? '\<drawing\>'
+ setfiletype drawing
+ endif
+< See $VIMRUNTIME/scripts.vim for more examples.
+ Write this file as "scripts.vim" in your user runtime directory. For
+ example, for Unix: >
+ :w ~/.vim/scripts.vim
+<
+ 3. The detection will work right away, no need to restart Vim.
+
+ Your scripts.vim is loaded before the default checks for file types, which
+ means that your rules override the default rules in
+ $VIMRUNTIME/scripts.vim.
+
+ *remove-filetype*
+If a file type is detected that is wrong for you, install a filetype.vim or
+scripts.vim to catch it (see above). You can set 'filetype' to a non-existing
+name to avoid that it will be set later anyway: >
+ :set filetype=ignored
+
+If you are setting up a system with many users, and you don't want each user
+to add/remove the same filetypes, consider writing the filetype.vim and
+scripts.vim files in a runtime directory that is used for everybody. Check
+the 'runtimepath' for a directory to use. If there isn't one, set
+'runtimepath' in the |system-vimrc|. Be careful to keep the default
+directories!
+
+
+ *autocmd-osfiletypes*
+NOTE: this code is currently disabled, as the RISC OS implementation was
+removed. In the future this will use the 'filetype' option.
+
+On operating systems which support storing a file type with the file, you can
+specify that an autocommand should only be executed if the file is of a
+certain type.
+
+The actual type checking depends on which platform you are running Vim
+on; see your system's documentation for details.
+
+To use osfiletype checking in an autocommand you should put a list of types to
+match in angle brackets in place of a pattern, like this: >
+
+ :au BufRead *.html,<&faf;HTML> runtime! syntax/html.vim
+
+This will match:
+
+- Any file whose name ends in ".html"
+- Any file whose type is "&faf" or "HTML", where the meaning of these types
+ depends on which version of Vim you are using.
+ Unknown types are considered NOT to match.
+
+You can also specify a type and a pattern at the same time (in which case they
+must both match): >
+
+ :au BufRead <&fff>diff*
+
+This will match files of type "&fff" whose names start with "diff".
+
+
+ *plugin-details*
+The "plugin" directory can be in any of the directories in the 'runtimepath'
+option. All of these directories will be searched for plugins and they are
+all loaded. For example, if this command: >
+
+ set runtimepath
+
+produces this output:
+
+ runtimepath=/etc/vim,~/.vim,/usr/local/share/vim/vim82 ~
+
+then Vim will load all plugins in these directories and below:
+
+ /etc/vim/plugin/ ~
+ ~/.vim/plugin/ ~
+ /usr/local/share/vim/vim82/plugin/ ~
+
+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: >
+
+ vim -V2
+
+You will see a lot of messages, in between them is a remark about loading the
+plugins. It starts with:
+
+ Searching for "plugin/**/*.vim" in ~
+
+There you can see where Vim looks for your plugin scripts.
+
+==============================================================================
+2. Filetype plugin *filetype-plugins*
+
+When loading filetype plugins has been enabled |:filetype-plugin-on|, options
+will be set and mappings defined. These are all local to the buffer, they
+will not be used for other files.
+
+Defining mappings for a filetype may get in the way of the mappings you
+define yourself. There are a few ways to avoid this:
+1. Set the "maplocalleader" variable to the key sequence you want the mappings
+ to start with. Example: >
+ :let maplocalleader = ","
+< All mappings will then start with a comma instead of the default, which
+ is a backslash. Also see |<LocalLeader>|.
+
+2. Define your own mapping. Example: >
+ :map ,p <Plug>MailQuote
+< You need to check the description of the plugin file below for the
+ functionality it offers and the string to map to.
+ 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* *g: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* *g:no_plugin_maps*
+4. Disable defining mappings for all filetypes by setting a variable: >
+ :let no_plugin_maps = 1
+<
+
+ *ftplugin-overrule*
+If a global filetype plugin does not do exactly what you want, there are three
+ways to change this:
+
+1. Add a few settings.
+ You must create a new filetype plugin in a directory early in
+ 'runtimepath'. For Unix, for example you could use this file: >
+ vim ~/.vim/ftplugin/fortran.vim
+< You can set those settings and mappings that you would like to add. Note
+ that the global plugin will be loaded after this, it may overrule the
+ settings that you do here. If this is the case, you need to use one of the
+ following two methods.
+
+2. Make a copy of the plugin and change it.
+ You must put the copy in a directory early in 'runtimepath'. For Unix, for
+ example, you could do this: >
+ cp $VIMRUNTIME/ftplugin/fortran.vim ~/.vim/ftplugin/fortran.vim
+< Then you can edit the copied file to your liking. Since the b:did_ftplugin
+ variable will be set, the global plugin will not be loaded.
+ A disadvantage of this method is that when the distributed plugin gets
+ improved, you will have to copy and modify it again.
+
+3. Overrule the settings after loading the global plugin.
+ You must create a new filetype plugin in a directory from the end of
+ 'runtimepath'. For Unix, for example, you could use this file: >
+ vim ~/.vim/after/ftplugin/fortran.vim
+< In this file you can change just those settings that you want to change.
+
+==============================================================================
+3. Docs for the default filetype plugins. *ftplugin-docs*
+
+
+AWK *ft-awk-plugin*
+
+Support for features specific to GNU Awk, like @include, can be enabled by
+setting: >
+ let g:awk_is_gawk = 1
+
+
+CHANGELOG *ft-changelog-plugin*
+
+Allows for easy entrance of Changelog entries in Changelog files. There are
+some commands, mappings, and variables worth exploring:
+
+Options:
+'comments' is made empty to not mess up formatting.
+'textwidth' is set to 78, which is standard.
+'formatoptions' the 't' flag is added to wrap when inserting text.
+
+Commands:
+NewChangelogEntry Adds a new Changelog entry in an intelligent fashion
+ (see below).
+
+Local mappings:
+<Leader>o Starts a new Changelog entry in an equally intelligent
+ fashion (see below).
+
+Global mappings:
+ NOTE: The global mappings are accessed by sourcing the
+ ftplugin/changelog.vim file first, e.g. with >
+ runtime ftplugin/changelog.vim
+< in your |.vimrc|.
+<Leader>o Switches to the ChangeLog buffer opened for the
+ current directory, or opens it in a new buffer if it
+ exists in the current directory. Then it does the
+ same as the local <Leader>o described above.
+
+Variables:
+g:changelog_timeformat Deprecated; use g:changelog_dateformat instead.
+g:changelog_dateformat The date (and time) format used in ChangeLog entries.
+ The format accepted is the same as for the
+ |strftime()| function.
+ The default is "%Y-%m-%d" which is the standard format
+ for many ChangeLog layouts.
+g:changelog_username The name and email address of the user.
+ The default is deduced from environment variables and
+ system files. It searches /etc/passwd for the comment
+ part of the current user, which informally contains
+ the real name of the user up to the first separating
+ comma. then it checks the $NAME environment variable
+ and finally runs `whoami` and `hostname` to build an
+ email address. The final form is >
+ Full Name <user@host>
+<
+g:changelog_new_date_format
+ The format to use when creating a new date-entry.
+ The following table describes special tokens in the
+ string:
+ %% insert a single '%' character
+ %d insert the date from above
+ %u insert the user from above
+ %p insert result of b:changelog_entry_prefix
+ %c where to position cursor when done
+ The default is "%d %u\n\n\t* %p%c\n\n", which produces
+ something like (| is where cursor will be, unless at
+ the start of the line where it denotes the beginning
+ of the line) >
+ |2003-01-14 Full Name <user@host>
+ |
+ | * prefix|
+<
+g:changelog_new_entry_format
+ The format used when creating a new entry.
+ The following table describes special tokens in the
+ string:
+ %p insert result of b:changelog_entry_prefix
+ %c where to position cursor when done
+ The default is "\t*%c", which produces something
+ similar to >
+ | * prefix|
+<
+g:changelog_date_entry_search
+ The search pattern to use when searching for a
+ date-entry.
+ The same tokens that can be used for
+ g:changelog_new_date_format can be used here as well.
+ The default is '^\s*%d\_s*%u' which finds lines
+ matching the form >
+ |2003-01-14 Full Name <user@host>
+< and some similar formats.
+
+g:changelog_date_end_entry_search
+ The search pattern to use when searching for the end
+ of a date-entry.
+ The same tokens that can be used for
+ g:changelog_new_date_format can be used here as well.
+ The default is '^\s*$' which finds lines that contain
+ only whitespace or are completely empty.
+
+b:changelog_name *b:changelog_name*
+ Name of the ChangeLog file to look for.
+ The default is 'ChangeLog'.
+
+b:changelog_path
+ Path of the ChangeLog to use for the current buffer.
+ The default is empty, thus looking for a file named
+ |b:changelog_name| in the same directory as the
+ current buffer. If not found, the parent directory of
+ the current buffer is searched. This continues
+ recursively until a file is found or there are no more
+ parent directories to search.
+
+b:changelog_entry_prefix
+ Name of a function to call to generate a prefix to a
+ new entry. This function takes no arguments and
+ should return a string containing the prefix.
+ Returning an empty prefix is fine.
+ The default generates the shortest path between the
+ ChangeLog's pathname and the current buffers pathname.
+ In the future, it will also be possible to use other
+ variable contexts for this variable, for example, g:.
+
+The Changelog entries are inserted where they add the least amount of text.
+After figuring out the current date and user, the file is searched for an
+entry beginning with the current date and user and if found adds another item
+under it. If not found, a new entry and item is prepended to the beginning of
+the Changelog.
+
+
+FORTRAN *ft-fortran-plugin*
+
+Options:
+'expandtab' is switched on to avoid tabs as required by the Fortran
+ standards unless the user has set fortran_have_tabs in .vimrc.
+'textwidth' is set to 72 for fixed source format as required by the
+ Fortran standards and to 80 for free source format.
+'formatoptions' is set to break code and comment lines and to preserve long
+ lines. You can format comments with |gq|.
+For further discussion of fortran_have_tabs and the method used for the
+detection of source format see |ft-fortran-syntax|.
+
+
+FREEBASIC *ft-freebasic-plugin*
+
+This plugin aims to treat the four FreeBASIC dialects, "fb", "qb", "fblite"
+and "deprecated", as distinct languages.
+
+The dialect will be set to the first name found in g:freebasic_forcelang, any
+#lang directive or $lang metacommand in the file being edited, or finally
+g:freebasic_lang. These global variables conceptually map to the fbc options
+-forcelang and -lang. If no dialect is explicitly specified "fb" will be
+used.
+
+For example, to set the dialect to a default of "fblite" but still allow for
+any #lang directive overrides, use the following command: >
+
+ let g:freebasic_lang = "fblite"
+
+
+GIT COMMIT *ft-gitcommit-plugin*
+
+One command, :DiffGitCached, is provided to show a diff of the current commit
+in the preview window. It is equivalent to calling "git diff --cached" plus
+any arguments given to the command.
+
+
+GPROF *ft-gprof-plugin*
+
+The gprof filetype plugin defines a mapping <C-]> to jump from a function
+entry in the gprof flat profile or from a function entry in the call graph
+to the details of that function in the call graph.
+
+The mapping can be disabled with: >
+ let g:no_gprof_maps = 1
+
+
+MAIL *ft-mail-plugin*
+
+Options:
+'modeline' is switched off to avoid the danger of trojan horses, and to
+ 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
+ in new lines, so that a leading ">" for quotes is repeated.
+ You can also format quoted text with |gq|.
+
+Local mappings:
+<LocalLeader>q or \\MailQuote
+ Quotes the text selected in Visual mode, or from the cursor position
+ to the end of the file in Normal mode. This means "> " is inserted in
+ each line.
+
+MAN *ft-man-plugin* *:Man* *man.vim*
+
+This plugin displays a manual page in a nice way. See |find-manpage| in the
+user manual for more information.
+
+To start using the |:Man| command before any manual page has been loaded,
+source this script from your startup |vimrc| file: >
+ runtime ftplugin/man.vim
+
+Options:
+'iskeyword' The '.' character is added to support the use of CTRL-] on the
+ manual page name.
+
+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.
+<Plug>ManPreGetPage
+ idem, allows for using a mapping: >
+ nmap <F1> <Plug>ManPreGetPage
+
+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 the |:quit| command.
+
+To use a vertical split instead of horizontal: >
+ let g:ft_man_open_mode = 'vert'
+To use a new tab: >
+ let g:ft_man_open_mode = 'tab'
+
+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
+
+If you would like :Man {number} {name} to behave like man {number} {name} by
+not running man {name} if no page is found, then use this: >
+ let g:ft_man_no_sect_fallback = 1
+
+You may also want to set 'keywordprg' to make the |K| command open a manual
+page in a Vim window: >
+ set keywordprg=:Man
+
+
+MANPAGER *manpager.vim*
+
+The |:Man| command allows you to turn Vim into a manpager (that syntax highlights
+manpages and follows linked manpages on hitting CTRL-]).
+
+For bash,zsh,ksh or dash, add to the config file (.bashrc,.zshrc, ...)
+
+ export MANPAGER="vim +MANPAGER --not-a-term -"
+
+For (t)csh, add to the config file
+
+ setenv MANPAGER "vim +MANPAGER --not-a-term -"
+
+For fish, add to the config file
+
+ set -x MANPAGER "vim +MANPAGER --not-a-term -"
+
+
+MARKDOWN *ft-markdown-plugin*
+
+To enable folding use this: >
+ let g:markdown_folding = 1
+
+'expandtab' will be set by default. If you do not want that use this: >
+ let g:markdown_recommended_style = 0
+
+
+PDF *ft-pdf-plugin*
+
+Two maps, <C-]> and <C-T>, are provided to simulate a tag stack for navigating
+the PDF. The following are treated as tags:
+
+- The byte offset after "startxref" to the xref table
+- The byte offset after the /Prev key in the trailer to an earlier xref table
+- A line of the form "0123456789 00000 n" in the xref table
+- An object reference like "1 0 R" anywhere in the PDF
+
+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
+
+
+QF QUICKFIX *qf.vim* *ft-qf-plugin*
+
+The "qf" filetype is used for the quickfix window, see |quickfix-window|.
+
+The quickfix filetype plugin includes configuration for displaying the command
+that produced the quickfix list in the |status-line|. To disable this setting,
+configure as follows: >
+ :let g:qf_disable_statusline = 1
+
+
+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
+
+
+RESTRUCTUREDTEXT *ft-rst-plugin*
+
+The following formatting setting are optionally available: >
+ setlocal expandtab shiftwidth=3 softtabstop=3 tabstop=8
+
+To enable this behavior, set the following variable in your vimrc: >
+ let g:rst_style = 1
+
+
+RPM SPEC *ft-spec-plugin*
+
+Since the text for this plugin is rather long it has been put in a separate
+file: |pi_spec.txt|.
+
+
+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
+file: |ft_sql.txt|.
+
+
+TEX *ft-tex-plugin* *g:tex_flavor*
+
+If the first line of a *.tex file has the form >
+ %&<format>
+then this determined the file type: plaintex (for plain TeX), context (for
+ConTeXt), or tex (for LaTeX). Otherwise, the file is searched for keywords to
+choose context or tex. If no keywords are found, it defaults to plaintex.
+You can change the default by defining the variable g:tex_flavor to the format
+(not the file type) you use most. Use one of these: >
+ let g:tex_flavor = "plain"
+ let g:tex_flavor = "context"
+ let g:tex_flavor = "latex"
+Currently no other formats are recognized.
+
+
+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
new file mode 100644
index 0000000..bb1dcb6
--- /dev/null
+++ b/runtime/doc/fold.txt
@@ -0,0 +1,628 @@
+*fold.txt* For Vim version 9.0. Last change: 2023 Jan 29
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+
+{not available when compiled without the |+folding| feature}
+
+==============================================================================
+1. Fold methods *fold-methods*
+
+The folding method can be set with the 'foldmethod' option.
+
+When setting 'foldmethod' to a value other than "manual", all folds are
+deleted and new ones created. Switching to the "manual" method doesn't remove
+the existing folds. This can be used to first define the folds automatically
+and then change them manually.
+
+There are six methods to select folds:
+ manual manually define folds
+ indent more indent means a higher fold level
+ expr specify an expression to define folds
+ syntax folds defined by syntax highlighting
+ diff folds for unchanged text
+ marker folds defined by markers in the text
+
+
+MANUAL *fold-manual*
+
+Use commands to manually define the fold regions. This can also be used by a
+script that parses text to find folds.
+
+The level of a fold is only defined by its nesting. To increase the fold
+level of a fold for a range of lines, define a fold inside it that has the
+same lines.
+
+The manual folds are lost when you abandon the file. To save the folds use
+the |:mkview| command. The view can be restored later with |:loadview|.
+
+
+INDENT *fold-indent*
+
+The folds are automatically defined by the indent of the lines.
+
+The foldlevel is computed from the indent of the line, divided by the
+'shiftwidth' (rounded down). A sequence of lines with the same or higher fold
+level form a fold, with the lines with a higher level forming a nested fold.
+
+The nesting of folds is limited with 'foldnestmax'.
+
+Some lines are ignored and get the fold level of the line above or below it,
+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
+|indent()| function can be used in 'foldexpr' to get the indent of a line.
+
+
+EXPR *fold-expr*
+
+The folds are automatically defined by their foldlevel, like with the "indent"
+method. The value of the 'foldexpr' option is evaluated to get the foldlevel
+of a line. Examples:
+This will create a fold for all consecutive lines that start with a tab: >
+ :set foldexpr=getline(v:lnum)[0]==\"\\t\"
+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: >
+ :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
+differently (space, backslash, double quote, etc., see |option-backslash|).
+
+The most efficient is to call a compiled function without arguments: >
+ :set foldexpr=MyFoldLevel()
+The function must use v:lnum. See |expr-option-function|.
+
+These are the conditions with which the expression is evaluated:
+- The current buffer and window are set for the line.
+- The variable "v:lnum" is set to the line number.
+- The result is used for the fold level in this way:
+ value meaning ~
+ 0 the line is not in a fold
+ 1, 2, .. the line is in a fold with this level
+ -1 the fold level is undefined, use the fold level of a
+ line before or after this line, whichever is the
+ lowest.
+ "=" use fold level from the previous line
+ "a1", "a2", .. add one, two, .. to the fold level of the previous
+ line, use the result for the current line
+ "s1", "s2", .. subtract one, two, .. from the fold level of the
+ previous line, use the result for the next line
+ "<1", "<2", .. a fold with this level ends at this line
+ ">1", ">2", .. a fold with this level starts at this line
+
+It is not required to mark the start (end) of a fold with ">1" ("<1"), a fold
+will also start (end) when the fold level is higher (lower) than the fold
+level of the previous line.
+
+There must be no side effects from the expression. The text in the buffer,
+cursor position, the search patterns, options etc. must not be changed.
+You can change and restore them if you are careful.
+
+If there is some error in the expression, or the resulting value isn't
+recognized, there is no error message and the fold level will be zero.
+For debugging the 'debug' option can be set to "msg", the error messages will
+be visible then.
+
+Note: Since the expression has to be evaluated for every line, this fold
+method can be very slow!
+
+Try to avoid the "=", "a" and "s" return values, since Vim often has to search
+backwards for a line for which the fold level is defined. This can be slow.
+
+If the 'foldexpr' expression starts with s: or |<SID>|, then it is replaced
+with the script ID (|local-function|). Examples: >
+ set foldexpr=s:MyFoldExpr()
+ set foldexpr=<SID>SomeFoldExpr()
+<
+An example of using "a1" and "s1": For a multi-line C comment, a line
+containing "/*" would return "a1" to start a fold, and a line containing "*/"
+would return "s1" to end the fold after that line: >
+ if match(thisline, '/\*') >= 0
+ return 'a1'
+ elseif match(thisline, '\*/') >= 0
+ return 's1'
+ else
+ return '='
+ endif
+However, this won't work for single line comments, strings, etc.
+
+|foldlevel()| can be useful to compute a fold level relative to a previous
+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 happen that folds are not updated properly. You can use |zx| or |zX|
+to force updating folds.
+
+
+SYNTAX *fold-syntax*
+
+A fold is defined by syntax items that have the "fold" argument. |:syn-fold|
+
+The fold level is defined by nesting folds. The nesting of folds is limited
+with 'foldnestmax'.
+
+Be careful to specify proper syntax syncing. If this is not done right, folds
+may differ from the displayed highlighting. This is especially relevant when
+using patterns that match more than one line. In case of doubt, try using
+brute-force syncing: >
+ :syn sync fromstart
+
+
+DIFF *fold-diff*
+
+The folds are automatically defined for text that is not part of a change or
+close to a change.
+
+This method only works properly when the 'diff' option is set for the current
+window and changes are being displayed. Otherwise the whole buffer will be
+one big fold.
+
+The 'diffopt' option can be used to specify the context. That is, the number
+of lines between the fold and a change that are not included in the fold. For
+example, to use a context of 8 lines: >
+ :set diffopt=filler,context:8
+The default context is six lines.
+
+When 'scrollbind' is also set, Vim will attempt to keep the same folds open in
+other diff windows, so that the same text is visible.
+
+
+MARKER *fold-marker*
+
+Markers in the text tell where folds start and end. This allows you to
+precisely specify the folds. This will allow deleting and putting a fold,
+without the risk of including the wrong lines. The 'foldtext' option is
+normally set such that the text before the marker shows up in the folded line.
+This makes it possible to give a name to the fold.
+
+Markers can have a level included, or can use matching pairs. Including a
+level is easier, you don't have to add end markers and avoid problems with
+non-matching marker pairs. Example: >
+ /* global variables {{{1 */
+ int varA, varB;
+
+ /* functions {{{1 */
+ /* funcA() {{{2 */
+ void funcA() {}
+
+ /* funcB() {{{2 */
+ void funcB() {}
+< *{{{* *}}}*
+A fold starts at a "{{{" marker. The following number specifies the fold
+level. What happens depends on the difference between the current fold level
+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
+ 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
+level zero is ignored). You can use "}}}" with a digit to indicate the level
+of the fold that ends. The fold level of the following line will be one less
+than the indicated level. Note that Vim doesn't look back to the level of the
+matching marker (that would take too much time). Example: >
+
+ {{{1
+ fold level here is 1
+ {{{3
+ fold level here is 3
+ }}}3
+ fold level here is 2
+
+You can also use matching pairs of "{{{" and "}}}" markers to define folds.
+Each "{{{" increases the fold level by one, each "}}}" decreases the fold
+level by one. Be careful to keep the markers matching! Example: >
+
+ {{{
+ fold level here is 1
+ {{{
+ fold level here is 2
+ }}}
+ fold level here is 1
+
+You can mix using markers with a number and without a number. A useful way of
+doing this is to use numbered markers for large folds, and unnumbered markers
+locally in a function. For example use level one folds for the sections of
+your file like "structure definitions", "local variables" and "functions".
+Use level 2 markers for each definition and function, Use unnumbered markers
+inside functions. When you make changes in a function to split up folds, you
+don't have to renumber the markers.
+
+The markers can be set with the 'foldmarker' option. It is recommended to
+keep this at the default value of "{{{,}}}", so that files can be exchanged
+between Vim users. Only change it when it is required for the file (e.g., it
+contains markers from another folding editor, or the default markers cause
+trouble for the language of the file).
+
+ *fold-create-marker*
+"zf" can be used to create a fold defined by markers. Vim will insert the
+markers for you. Vim will append the start and end marker, as specified with
+'foldmarker'. The markers are appended to the end of the line.
+'commentstring' is used if it isn't empty.
+This does not work properly when:
+- The line already contains a marker with a level number. Vim then doesn't
+ know what to do.
+- Folds nearby use a level number in their marker which gets in the way.
+- The line is inside a comment, 'commentstring' isn't empty and nested
+ comments don't work. For example with C: adding /* {{{ */ inside a comment
+ will truncate the existing comment. Either put the marker before or after
+ the comment, or add the marker manually.
+Generally it's not a good idea to let Vim create markers when you already have
+markers with a level number.
+
+ *fold-delete-marker*
+"zd" can be used to delete a fold defined by markers. Vim will delete the
+markers for you. Vim will search for the start and end markers, as specified
+with 'foldmarker', at the start and end of the fold. When the text around the
+marker matches with 'commentstring', that text is deleted as well.
+This does not work properly when:
+- A line contains more than one marker and one of them specifies a level.
+ Only the first one is removed, without checking if this will have the
+ desired effect of deleting the fold.
+- The marker contains a level number and is used to start or end several folds
+ at the same time.
+
+==============================================================================
+2. Fold commands *fold-commands* *E490*
+
+All folding commands start with "z". Hint: the "z" looks like a folded piece
+of paper, if you look at it from the side.
+
+
+CREATING AND DELETING FOLDS ~
+ *zf* *E350*
+zf{motion} or
+{Visual}zf Operator to create a fold.
+ This only works when 'foldmethod' is "manual" or "marker".
+ The new fold will be closed for the "manual" method.
+ 'foldenable' will be set.
+ Also see |fold-create-marker|.
+
+ *zF*
+zF Create a fold for [count] lines. Works like "zf".
+
+:{range}fo[ld] *:fold* *:fo*
+ Create a fold for the lines in {range}. Works like "zf".
+
+ *zd* *E351*
+zd Delete one fold at the cursor. When the cursor is on a folded
+ line, that fold is deleted. Nested folds are moved one level
+ up. In Visual mode one level of all folds (partially) in the
+ selected area are deleted.
+ Careful: This easily deletes more folds than you expect and
+ there is no undo for manual folding.
+ This only works when 'foldmethod' is "manual" or "marker".
+ Also see |fold-delete-marker|.
+
+ *zD*
+zD Delete folds recursively at the cursor. In Visual mode all
+ folds (partially) in the selected area and all nested folds in
+ them are deleted.
+ This only works when 'foldmethod' is "manual" or "marker".
+ Also see |fold-delete-marker|.
+
+ *zE* *E352*
+zE Eliminate all folds in the window.
+ This only works when 'foldmethod' is "manual" or "marker".
+ Also see |fold-delete-marker|.
+
+
+OPENING AND CLOSING FOLDS ~
+
+A fold smaller than 'foldminlines' will always be displayed like it was open.
+Therefore the commands below may work differently on small folds.
+
+ *zo*
+zo Open one fold under the cursor. When a count is given, that
+ many folds deep will be opened. In Visual mode one level of
+ folds is opened for all lines in the selected area.
+
+ *zO*
+zO Open all folds under the cursor recursively. Folds that don't
+ contain the cursor line are unchanged.
+ In Visual mode it opens all folds that are in the selected
+ area, also those that are only partly selected.
+
+ *zc*
+zc Close one fold under the cursor. When a count is given, that
+ many folds deep are closed. In Visual mode one level of folds
+ is closed for all lines in the selected area.
+ 'foldenable' will be set.
+
+ *zC*
+zC Close all folds under the cursor recursively. Folds that
+ don't contain the cursor line are unchanged.
+ In Visual mode it closes all folds that are in the selected
+ area, also those that are only partly selected.
+ 'foldenable' will be set.
+
+ *za*
+za When on a closed fold: open it. When folds are nested, you
+ may have to use "za" several times. When a count is given,
+ that many closed folds are opened.
+ When on an open fold: close it and set 'foldenable'. This
+ will only close one level, since using "za" again will open
+ the fold. When a count is given that many folds will be
+ closed (that's not the same as repeating "za" that many
+ times).
+
+ *zA*
+zA When on a closed fold: open it recursively.
+ When on an open fold: close it recursively and set
+ 'foldenable'.
+
+ *zv*
+zv View cursor line: Open just enough folds to make the line in
+ which the cursor is located not folded.
+
+ *zx*
+zx Update folds: Undo manually opened and closed folds: re-apply
+ 'foldlevel', then do "zv": View cursor line.
+ Also forces recomputing folds. This is useful when using
+ 'foldexpr' and the buffer is changed in a way that results in
+ folds not to be updated properly.
+
+ *zX*
+zX Undo manually opened and closed folds: re-apply 'foldlevel'.
+ Also forces recomputing folds, like |zx|.
+
+ *zm*
+zm Fold more: Subtract |v:count1| from 'foldlevel'. If 'foldlevel' was
+ already zero nothing happens.
+ 'foldenable' will be set.
+
+ *zM*
+zM Close all folds: set 'foldlevel' to 0.
+ 'foldenable' will be set.
+
+ *zr*
+zr Reduce folding: Add |v:count1| to 'foldlevel'.
+
+ *zR*
+zR Open all folds. This sets 'foldlevel' to highest fold level.
+
+ *:foldo* *:foldopen*
+:{range}foldo[pen][!]
+ Open folds in {range}. When [!] is added all folds are
+ opened. Useful to see all the text in {range}. Without [!]
+ one level of folds is opened.
+
+ *:foldc* *:foldclose*
+:{range}foldc[lose][!]
+ Close folds in {range}. When [!] is added all folds are
+ closed. Useful to hide all the text in {range}. Without [!]
+ one level of folds is closed.
+
+ *zn*
+zn Fold none: reset 'foldenable'. All folds will be open.
+
+ *zN*
+zN Fold normal: set 'foldenable'. All folds will be as they
+ were before.
+
+ *zi*
+zi Invert 'foldenable'.
+
+
+MOVING OVER FOLDS ~
+ *[z*
+[z Move to the start of the current open fold. If already at the
+ start, move to the start of the fold that contains it. If
+ there is no containing fold, the command fails.
+ When a count is used, repeats the command [count] times.
+
+ *]z*
+]z Move to the end of the current open fold. If already at the
+ end, move to the end of the fold that contains it. If there
+ is no containing fold, the command fails.
+ When a count is used, repeats the command [count] times.
+
+ *zj*
+zj Move downwards to the start of the next fold. A closed fold
+ is counted as one fold.
+ When a count is used, repeats the command [count] times.
+ This command can be used after an |operator|.
+
+ *zk*
+zk Move upwards to the end of the previous fold. A closed fold
+ is counted as one fold.
+ When a count is used, repeats the command [count] times.
+ This command can be used after an |operator|.
+
+
+EXECUTING COMMANDS ON FOLDS ~
+
+:[range]foldd[oopen] {cmd} *:foldd* *:folddo* *:folddoopen*
+ Execute {cmd} on all lines that are not in a closed fold.
+ When [range] is given, only these lines are used.
+ Each time {cmd} is executed the cursor is positioned on the
+ line it is executed for.
+ This works like the ":global" command: First all lines that
+ are not in a closed fold are marked. Then the {cmd} is
+ executed for all marked lines. Thus when {cmd} changes the
+ folds, this has no influence on where it is executed (except
+ when lines are deleted, of course).
+ Example: >
+ :folddoopen s/end/loop_end/ge
+< Note the use of the "e" flag to avoid getting an error message
+ where "end" doesn't match.
+
+:[range]folddoc[losed] {cmd} *:folddoc* *:folddoclosed*
+ Execute {cmd} on all lines that are in a closed fold.
+ Otherwise like ":folddoopen".
+
+==============================================================================
+3. Fold options *fold-options*
+
+COLORS *fold-colors*
+
+The colors of a closed fold are set with the Folded group |hl-Folded|. The
+colors of the fold column are set with the FoldColumn group |hl-FoldColumn|.
+Example to set the colors: >
+
+ :highlight Folded guibg=grey guifg=blue
+ :highlight FoldColumn guibg=darkgrey guifg=white
+
+
+FOLDLEVEL *fold-foldlevel*
+
+'foldlevel' is a number option: The higher the more folded regions are open.
+When 'foldlevel' is 0, all folds are closed.
+When 'foldlevel' is positive, some folds are closed.
+When 'foldlevel' is very high, all folds are open.
+'foldlevel' is applied when it is changed. After that manually folds can be
+opened and closed.
+When increased, folds above the new level are opened. No manually opened
+folds will be closed.
+When decreased, folds above the new level are closed. No manually closed
+folds will be opened.
+
+
+FOLDTEXT *fold-foldtext*
+
+'foldtext' is a string option that specifies an expression. This expression
+is evaluated to obtain the text displayed for a closed fold. Example: >
+
+ :set foldtext=v:folddashes.substitute(getline(v:foldstart),'/\\*\\\|\\*/\\\|{{{\\d\\=','','g')
+
+This shows the first line of the fold, with "/*", "*/" and "{{{" removed.
+Note the use of backslashes to avoid some characters to be interpreted by the
+":set" command. It is much simpler to define a function and call it: >
+
+ :set foldtext=MyFoldText()
+ :function MyFoldText()
+ : let line = getline(v:foldstart)
+ : let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
+ : return v:folddashes .. sub
+ :endfunction
+
+The advantage of using a function call without arguments is that it is faster,
+see |expr-option-function|.
+
+Evaluating 'foldtext' is done in the |sandbox|. The current window is set to
+the window that displays the line. The context is set to the script where the
+option was last set.
+
+Errors are ignored. For debugging set the 'debug' option to "throw".
+
+The default value is |foldtext()|. This returns a reasonable text for most
+types of folding. If you don't like it, you can specify your own 'foldtext'
+expression. It can use these special Vim variables:
+ v:foldstart line number of first line in the fold
+ v:foldend line number of last line in the fold
+ v:folddashes a string that contains dashes to represent the
+ foldlevel.
+ v:foldlevel the foldlevel of the fold
+
+In the result a TAB is replaced with a space and unprintable characters are
+made into printable characters.
+
+The resulting line is truncated to fit in the window, it never wraps.
+When there is room after the text, it is filled with the character specified
+by 'fillchars'.
+
+If the 'foldtext' expression starts with s: or |<SID>|, then it is replaced
+with the script ID (|local-function|). Examples: >
+ set foldtext=s:MyFoldText()
+ set foldtext=<SID>SomeFoldText()
+<
+Note that backslashes need to be used for characters that the ":set" command
+handles differently: Space, backslash and double-quote. |option-backslash|
+
+
+FOLDCOLUMN *fold-foldcolumn*
+
+'foldcolumn' is a number, which sets the width for a column on the side of the
+window to indicate folds. When it is zero, there is no foldcolumn. A normal
+value is 4 or 5. The minimal useful value is 2, although 1 still provides
+some information. The maximum is 12.
+
+An open fold is indicated with a column that has a '-' at the top and '|'
+characters below it. This column stops where the open fold stops. When folds
+nest, the nested fold is one character right of the fold it's contained in.
+
+A closed fold is indicated with a '+'.
+
+These characters can be changed with the 'fillchars' option.
+
+Where the fold column is too narrow to display all nested folds, digits are
+shown to indicate the nesting level.
+
+The mouse can also be used to open and close folds by clicking in the
+fold column:
+- Click on a '+' to open the closed fold at this row.
+- Click on any other non-blank character to close the open fold at this row.
+
+
+OTHER OPTIONS
+
+'foldenable' 'fen': Open all folds while not set.
+'foldexpr' 'fde': Expression used for "expr" folding.
+'foldignore' 'fdi': Characters used for "indent" folding.
+'foldmarker' 'fmr': Defined markers used for "marker" folding.
+'foldmethod' 'fdm': Name of the current folding method.
+'foldminlines' 'fml': Minimum number of screen lines for a fold to be
+ displayed closed.
+'foldnestmax' 'fdn': Maximum nesting for "indent" and "syntax" folding.
+'foldopen' 'fdo': Which kinds of commands open closed folds.
+'foldclose' 'fcl': When the folds not under the cursor are closed.
+
+==============================================================================
+4. Behavior of folds *fold-behavior*
+
+When moving the cursor upwards or downwards and when scrolling, the cursor
+will move to the first line of a sequence of folded lines. When the cursor is
+already on a folded line, it moves to the next unfolded line or the next
+closed fold.
+
+While the cursor is on folded lines, the cursor is always displayed in the
+first column. The ruler does show the actual cursor position, but since the
+line is folded, it cannot be displayed there.
+
+Many movement commands handle a sequence of folded lines like an empty line.
+For example, the "w" command stops once in the first column.
+
+When starting a search in a closed fold it will not find a match in the
+current fold. It's like a forward search always starts from the end of the
+closed fold, while a backwards search starts from the start of the closed
+fold.
+
+When in Insert mode, the cursor line is never folded. That allows you to see
+what you type!
+
+When using an operator, a closed fold is included as a whole. Thus "dl"
+deletes the whole closed fold under the cursor.
+
+For Ex commands that work on buffer lines the range is adjusted to always
+start at the first line of a closed fold and end at the last line of a closed
+fold. Thus this command: >
+ :s/foo/bar/g
+when used with the cursor on a closed fold, will replace "foo" with "bar" in
+all lines of the fold.
+This does not happen for |:folddoopen| and |:folddoclosed|.
+
+When editing a buffer that has been edited before, the last used folding
+settings are used again. For manual folding the defined folds are restored.
+For all folding methods the manually opened and closed folds are restored.
+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.
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/ft_ada.txt b/runtime/doc/ft_ada.txt
new file mode 100644
index 0000000..fe00256
--- /dev/null
+++ b/runtime/doc/ft_ada.txt
@@ -0,0 +1,515 @@
+*ft_ada.txt* For Vim version 9.0. Last change: 2022 Mar 13
+
+
+ ADA FILE TYPE PLUG-INS REFERENCE MANUAL~
+
+ADA *ada.vim*
+
+1. Syntax Highlighting |ft-ada-syntax|
+2. File type Plug-in |ft-ada-plugin|
+3. Omni Completion |ft-ada-omni|
+ 3.1 Omni Completion with "gnat xref" |gnat-xref|
+ 3.2 Omni Completion with "ctags" |ada-ctags|
+4. Compiler Support |ada-compiler|
+ 4.1 GNAT |compiler-gnat|
+ 4.2 Dec Ada |compiler-decada|
+5. References |ada-reference|
+ 5.1 Options |ft-ada-options|
+ 5.2 Commands |ft-ada-commands|
+ 5.3 Variables |ft-ada-variables|
+ 5.4 Constants |ft-ada-constants|
+ 5.5 Functions |ft-ada-functions|
+6. Extra Plug-ins |ada-extra-plugins|
+
+==============================================================================
+1. Syntax Highlighting ~
+ *ft-ada-syntax*
+
+This mode is designed for the 2005 edition of Ada ("Ada 2005"), which includes
+support for objected-programming, protected types, and so on. It handles code
+written for the original Ada language ("Ada83", "Ada87", "Ada95") as well,
+though code which uses Ada 2005-only keywords will be wrongly colored (such
+code should be fixed anyway). For more information about Ada, see
+http://www.adapower.com.
+
+The Ada mode handles a number of situations cleanly.
+
+For example, it knows that the "-" in "-5" is a number, but the same character
+in "A-5" is an operator. Normally, a "with" or "use" clause referencing
+another compilation unit is coloured the same way as C's "#include" is coloured.
+If you have "Conditional" or "Repeat" groups coloured differently, then "end
+if" and "end loop" will be coloured as part of those respective groups.
+
+You can set these to different colours using vim's "highlight" command (e.g.,
+to change how loops are displayed, enter the command ":hi Repeat" followed by
+the colour specification; on simple terminals the colour specification
+ctermfg=White often shows well).
+
+There are several options you can select in this Ada mode. See |ft-ada-options|
+for a complete list.
+
+To enable them, assign a value to the option. For example, to turn one on:
+ >
+ > let g:ada_standard_types = 1
+>
+To disable them use ":unlet". Example:
+>
+ > unlet g:ada_standard_types
+
+You can just use ":" and type these into the command line to set these
+temporarily before loading an Ada file. You can make these option settings
+permanent by adding the "let" command(s), without a colon, to your "~/.vimrc"
+file.
+
+Even on a slow (90Mhz) PC this mode works quickly, but if you find the
+performance unacceptable, turn on |g:ada_withuse_ordinary|.
+
+Syntax folding instructions (|fold-syntax|) are added when |g:ada_folding| is
+set.
+
+==============================================================================
+2. File type Plug-in ~
+ *ft-ada-indent* *ft-ada-plugin*
+
+The Ada plug-in provides support for:
+
+ - auto indenting (|indent.txt|)
+ - insert completion (|i_CTRL-N|)
+ - user completion (|i_CTRL-X_CTRL-U|)
+ - tag searches (|tagsrch.txt|)
+ - Quick Fix (|quickfix.txt|)
+ - backspace handling (|'backspace'|)
+ - comment handling (|'comments'|, |'commentstring'|)
+
+The plug-in only activates the features of the Ada mode whenever an Ada
+file is opened and adds Ada related entries to the main and pop-up menu.
+
+==============================================================================
+3. Omni Completion ~
+ *ft-ada-omni*
+
+The Ada omni-completions (|i_CTRL-X_CTRL-O|) uses tags database created either
+by "gnat xref -v" or the "Universal Ctags" (https://ctags.io). The complete
+function will automatically detect which tool was used to create the tags
+file.
+
+------------------------------------------------------------------------------
+3.1 Omni Completion with "gnat xref" ~
+ *gnat-xref*
+
+GNAT XREF uses the compiler internal information (ali-files) to produce the
+tags file. This has the advantage to be 100% correct and the option of deep
+nested analysis. However the code must compile, the generator is quite
+slow and the created tags file contains only the basic Ctags information for
+each entry - not enough for some of the more advanced Vim code browser
+plug-ins.
+
+NOTE: "gnat xref -v" is very tricky to use as it has almost no diagnostic
+ output - If nothing is printed then usually the parameters are wrong.
+ Here some important tips:
+
+1) You need to compile your code first and use the "-aO" option to point to
+ your .ali files.
+2) "gnat xref -v ../Include/adacl.ads" won't work - use the "gnat xref -v
+ -aI../Include adacl.ads" instead.
+3) "gnat xref -v -aI../Include *.ad?" won't work - use "cd ../Include" and
+ 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
+ --ignore-case --output=tags tags" .
+6) Remember to insert "!_TAG_FILE_SORTED 2 %sort ui" as first line to mark
+ the file assorted.
+
+------------------------------------------------------------------------------
+3.2 Omni Completion with "ctags"~
+ *ada-ctags*
+
+Universal/Exuberant Ctags use their own multi-language code parser. The
+parser is quite fast, produces a lot of extra information and can run on files
+which currently do not compile.
+
+There are also lots of other Vim-tools which use Universal/Exuberant Ctags.
+Universal Ctags is preferred, Exuberant Ctags is no longer being developed.
+
+You will need to install Universal Ctags which is available from
+https://ctags.io
+
+The Ada parser for Universal/Exuberant Ctags is fairly new - don't expect
+complete support yet.
+
+==============================================================================
+4. Compiler Support ~
+ *ada-compiler*
+
+The Ada mode supports more than one Ada compiler and will automatically load the
+compiler set in |g:ada_default_compiler| whenever an Ada source is opened. The
+provided compiler plug-ins are split into the actual compiler plug-in and a
+collection of support functions and variables. This allows the easy
+development of specialized compiler plug-ins fine tuned to your development
+environment.
+
+------------------------------------------------------------------------------
+4.1 GNAT ~
+ *compiler-gnat*
+
+GNAT is the only free (beer and speech) Ada compiler available. There are
+several versions available which differ in the licence terms used.
+
+The GNAT compiler plug-in will perform a compile on pressing <F7> and then
+immediately shows the result. You can set the project file to be used by
+setting:
+ >
+ > call g:gnat.Set_Project_File ('my_project.gpr')
+
+Setting a project file will also create a Vim session (|views-sessions|) so -
+like with the GPS - opened files, window positions etc. will be remembered
+separately for all projects.
+
+ *gnat_members*
+GNAT OBJECT ~
+
+ *g:gnat.Make()*
+g:gnat.Make()
+ Calls |g:gnat.Make_Command| and displays the result inside a
+ |quickfix| window.
+
+ *g:gnat.Pretty()*
+g:gnat.Pretty()
+ Calls |g:gnat.Pretty_Program|
+
+ *g:gnat.Find()*
+g:gnat.Find()
+ Calls |g:gnat.Find_Program|
+
+ *g:gnat.Tags()*
+g:gnat.Tags()
+ Calls |g:gnat.Tags_Command|
+
+ *g:gnat.Set_Project_File()*
+g:gnat.Set_Project_File([{file}])
+ Set gnat project file and load associated session. An open
+ project will be closed and the session written. If called
+ without file name the file selector opens for selection of a
+ project file. If called with an empty string then the project
+ and associated session are closed.
+
+ *g:gnat.Project_File*
+g:gnat.Project_File string
+ Current project file.
+
+ *g:gnat.Make_Command*
+g:gnat.Make_Command string
+ External command used for |g:gnat.Make()| (|'makeprg'|).
+
+ *g:gnat.Pretty_Program*
+g:gnat.Pretty_Program string
+ External command used for |g:gnat.Pretty()|
+
+ *g:gnat.Find_Program*
+g:gnat.Find_Program string
+ External command used for |g:gnat.Find()|
+
+ *g:gnat.Tags_Command*
+g:gnat.Tags_Command string
+ External command used for |g:gnat.Tags()|
+
+ *g:gnat.Error_Format*
+g:gnat.Error_Format string
+ Error format (|'errorformat'|)
+
+------------------------------------------------------------------------------
+4.2 Dec Ada ~
+ *compiler-hpada* *compiler-decada*
+ *compiler-vaxada* *compiler-compaqada*
+
+Dec Ada (also known by - in chronological order - VAX Ada, Dec Ada, Compaq Ada
+and HP Ada) is a fairly dated Ada 83 compiler. Support is basic: <F7> will
+compile the current unit.
+
+The Dec Ada compiler expects the package name and not the file name to be
+passed as a parameter. The compiler plug-in supports the usual file name
+convention to convert the file into a unit name. Both '-' and '__' are allowed
+as separators.
+
+ *decada_members*
+DEC ADA OBJECT ~
+
+ *g:decada.Make()*
+g:decada.Make() function
+ Calls |g:decada.Make_Command| and displays the result inside a
+ |quickfix| window.
+
+ *g:decada.Unit_Name()*
+g:decada.Unit_Name() function
+ Get the Unit name for the current file.
+
+ *g:decada.Make_Command*
+g:decada.Make_Command string
+ External command used for |g:decada.Make()| (|'makeprg'|).
+
+ *g:decada.Error_Format*
+g:decada.Error_Format string
+ Error format (|'errorformat'|).
+
+==============================================================================
+5. References ~
+ *ada-reference*
+
+------------------------------------------------------------------------------
+5.1 Options ~
+ *ft-ada-options*
+
+ *g:ada_standard_types*
+g:ada_standard_types bool (true when exists)
+ Highlight types in package Standard (e.g., "Float").
+
+ *g:ada_space_errors*
+ *g:ada_no_trail_space_error*
+ *g:ada_no_tab_space_error*
+ *g:ada_all_tab_usage*
+g:ada_space_errors bool (true when exists)
+ Highlight extraneous errors in spaces ...
+ g:ada_no_trail_space_error
+ - but ignore trailing spaces at the end of a line
+ g:ada_no_tab_space_error
+ - but ignore tabs after spaces
+ g:ada_all_tab_usage
+ - highlight all tab use
+
+ *g:ada_line_errors*
+g:ada_line_errors bool (true when exists)
+ Highlight lines which are too long. Note: This highlighting
+ option is quite CPU intensive.
+
+ *g:ada_rainbow_color*
+g:ada_rainbow_color bool (true when exists)
+ Use rainbow colours for '(' and ')'. You need the
+ rainbow_parenthesis for this to work.
+
+ *g:ada_folding*
+g:ada_folding set ('sigpft')
+ Use folding for Ada sources.
+ 's': activate syntax folding on load
+ 'p': fold packages
+ 'f': fold functions and procedures
+ 't': fold types
+ 'c': fold conditionals
+ 'g': activate gnat pretty print folding on load
+ 'i': lone 'is' folded with line above
+ 'b': lone 'begin' folded with line above
+ 'p': lone 'private' folded with line above
+ 'x': lone 'exception' folded with line above
+ 'i': activate indent folding on load
+
+ Note: Syntax folding is in an early (unusable) stage and
+ indent or gnat pretty folding is suggested.
+
+ For gnat pretty folding to work the following settings are
+ suggested: -cl3 -M79 -c2 -c3 -c4 -A1 -A2 -A3 -A4 -A5
+
+ For indent folding to work the following settings are
+ suggested: shiftwidth=3 softtabstop=3
+
+ *g:ada_abbrev*
+g:ada_abbrev bool (true when exists)
+ Add some abbreviations. This feature is more or less superseded
+ by the various completion methods.
+
+ *g:ada_withuse_ordinary*
+g:ada_withuse_ordinary bool (true when exists)
+ Show "with" and "use" as ordinary keywords (when used to
+ reference other compilation units they're normally highlighted
+ specially).
+
+ *g:ada_begin_preproc*
+g:ada_begin_preproc bool (true when exists)
+ Show all begin-like keywords using the colouring of C
+ preprocessor commands.
+
+ *g:ada_omni_with_keywords*
+g:ada_omni_with_keywords
+ Add Keywords, Pragmas, Attributes to omni-completions
+ (|compl-omni|). Note: You can always complete then with user
+ completion (|i_CTRL-X_CTRL-U|).
+
+ *g:ada_extended_tagging*
+g:ada_extended_tagging enum ('jump', 'list')
+ use extended tagging, two options are available
+ 'jump': use tjump to jump.
+ 'list': add tags quick fix list.
+ Normal tagging does not support function or operator
+ overloading as these features are not available in C and
+ tagging was originally developed for C.
+
+ *g:ada_extended_completion*
+g:ada_extended_completion
+ Uses extended completion for <C-N> and <C-R> completions
+ (|i_CTRL-N|). In this mode the '.' is used as part of the
+ identifier so that 'Object.Method' or 'Package.Procedure' are
+ completed together.
+
+ *g:ada_gnat_extensions*
+g:ada_gnat_extensions bool (true when exists)
+ Support GNAT extensions.
+
+ *g:ada_with_gnat_project_files*
+g:ada_with_gnat_project_files bool (true when exists)
+ Add gnat project file keywords and Attributes.
+
+ *g:ada_default_compiler*
+g:ada_default_compiler string
+ set default compiler. Currently supported are 'gnat' and
+ 'decada'.
+
+An "exists" type is a boolean considered true when the variable is defined and
+false when the variable is undefined. The value to which the variable is set
+makes no difference.
+
+------------------------------------------------------------------------------
+5.2 Commands ~
+ *ft-ada-commands*
+
+:AdaRainbow *:AdaRainbow*
+ Toggles rainbow colour (|g:ada_rainbow_color|) mode for
+ '(' and ')'.
+
+:AdaLines *:AdaLines*
+ Toggles line error (|g:ada_line_errors|) display.
+
+:AdaSpaces *:AdaSpaces*
+ Toggles space error (|g:ada_space_errors|) display.
+
+:AdaTagDir *:AdaTagDir*
+ Creates tags file for the directory of the current file.
+
+:AdaTagFile *:AdaTagFile*
+ Creates tags file for the current file.
+
+:AdaTypes *:AdaTypes*
+ Toggles standard types (|g:ada_standard_types|) colour.
+
+:GnatFind *:GnatFind*
+ Calls |g:gnat.Find()|
+
+:GnatPretty *:GnatPretty*
+ Calls |g:gnat.Pretty()|
+
+:GnatTags *:GnatTags*
+ Calls |g:gnat.Tags()|
+
+------------------------------------------------------------------------------
+5.3 Variables ~
+ *ft-ada-variables*
+
+ *g:gnat*
+g:gnat object
+ Control object which manages GNAT compiles. The object
+ is created when the first Ada source code is loaded provided
+ that |g:ada_default_compiler| is set to 'gnat'. See
+ |gnat_members| for details.
+
+ *g:decada*
+g:decada object
+ Control object which manages Dec Ada compiles. The object
+ is created when the first Ada source code is loaded provided
+ that |g:ada_default_compiler| is set to 'decada'. See
+ |decada_members| for details.
+
+------------------------------------------------------------------------------
+5.4 Constants ~
+ *ft-ada-constants*
+
+All constants are locked. See |:lockvar| for details.
+
+ *g:ada#WordRegex*
+g:ada#WordRegex string
+ Regular expression to search for Ada words.
+
+ *g:ada#DotWordRegex*
+g:ada#DotWordRegex string
+ Regular expression to search for Ada words separated by dots.
+
+ *g:ada#Comment*
+g:ada#Comment string
+ Regular expression to search for Ada comments.
+
+ *g:ada#Keywords*
+g:ada#Keywords list of dictionaries
+ List of keywords, attributes etc. pp. in the format used by
+ omni completion. See |complete-items| for details.
+
+ *g:ada#Ctags_Kinds*
+g:ada#Ctags_Kinds dictionary of lists
+ Dictionary of the various kinds of items which the Ada support
+ for Ctags generates.
+
+------------------------------------------------------------------------------
+5.5 Functions ~
+ *ft-ada-functions*
+
+ada#Word([{line}, {col}]) *ada#Word()*
+ Return full name of Ada entity under the cursor (or at given
+ line/column), stripping white space/newlines as necessary.
+
+ada#List_Tag([{line}, {col}]) *ada#Listtags()*
+ List all occurrences of the Ada entity under the cursor (or at
+ given line/column) inside the quick-fix window.
+
+ada#Jump_Tag ({ident}, {mode}) *ada#Jump_Tag()*
+ List all occurrences of the Ada entity under the cursor (or at
+ given line/column) in the tag jump list. Mode can either be
+ 'tjump' or 'stjump'.
+
+ada#Create_Tags ({option}) *ada#Create_Tags()*
+ Creates tag file using Ctags. The option can either be 'file'
+ for the current file, 'dir' for the directory of the current
+ file or a file name.
+
+gnat#Insert_Tags_Header() *gnat#Insert_Tags_Header()*
+ Adds the tag file header (!_TAG_) information to the current
+ file which are missing from the GNAT XREF output.
+
+ada#Switch_Syntax_Option ({option}) *ada#Switch_Syntax_Option()*
+ Toggles highlighting options on or off. Used for the Ada menu.
+
+ *gnat#New()*
+gnat#New ()
+ Create a new gnat object. See |g:gnat| for details.
+
+
+==============================================================================
+6. Extra Plugins ~
+ *ada-extra-plugins*
+
+You can optionally install the following extra plug-ins. They work well with
+Ada and enhance the ability of the Ada mode:
+
+backup.vim
+ http://www.vim.org/scripts/script.php?script_id=1537
+ Keeps as many backups as you like so you don't have to.
+
+rainbow_parenthsis.vim
+ http://www.vim.org/scripts/script.php?script_id=1561
+ Very helpful since Ada uses only '(' and ')'.
+
+nerd_comments.vim
+ http://www.vim.org/scripts/script.php?script_id=1218
+ Excellent commenting and uncommenting support for almost any
+ programming language.
+
+matchit.vim
+ http://www.vim.org/scripts/script.php?script_id=39
+ '%' jumping for any language. The normal '%' jump only works for '{}'
+ style languages. The Ada mode will set the needed search patterns.
+
+taglist.vim
+ http://www.vim.org/scripts/script.php?script_id=273
+ Source code explorer sidebar. There is a patch for Ada available.
+
+The GNU Ada Project distribution (http://gnuada.sourceforge.net) of Vim
+contains all of the above.
+
+==============================================================================
+vim: textwidth=78 nowrap tabstop=8 shiftwidth=4 softtabstop=4 noexpandtab
+vim: filetype=help
diff --git a/runtime/doc/ft_context.txt b/runtime/doc/ft_context.txt
new file mode 100644
index 0000000..6303357
--- /dev/null
+++ b/runtime/doc/ft_context.txt
@@ -0,0 +1,158 @@
+*ft_context.txt* For Vim version 9.0. Last change: 2022 Sep 27
+
+This is the documentation for the ConTeXt filetype plugin.
+
+NOTE: the plugin requires +vim9script.
+
+==============================================================================
+CONTENTS *context.vim* *ft-context*
+
+1. Introduction |ft-context-intro|
+2. Commands |ft-context-commands|
+3. Settings |ft-context-settings|
+4. Mappings |ft-context-mappings|
+
+==============================================================================
+ *ft-context-intro*
+Introduction ~
+
+ConTeXt, similarly to LaTeX, is a macro-based typesetting system built on TeX:
+>
+ https://wiki.contextgarden.net
+ https://wiki.contextgarden.net/Vim
+<
+The ConTeXt plugin provides syntax highlighting, completion and support for
+typesetting ConTeXt documents. The recommended way to typeset a document is to
+use |:ConTeXt|. This will invoke the `mtxrun` script that is found in `$PATH`.
+
+For more fine grained control over the command and its environment,
+`context.Typeset()` can be used directly (or `context#Typeset()` from legacy
+Vim script). For instance, if a version of ConTeXt is installed in
+`~/context`, you may define a function to use it similar to the following:
+>
+ import autoload 'context.vim'
+
+ def MyConTeXt()
+ const env = {'PATH':
+ printf("%s/context/tex/texmf-<os>-<arch>/bin:%s", $HOME, $PATH)}
+ context.Typeset("%", env)
+ enddef
+
+This code may go in `~/.vim/after/ftplugin/context.vim`. A mapping can then be
+defined to invoke the custom command:
+>
+ nnoremap <silent><buffer><leader>t <scriptcmd>MyConTeXt()<cr>
+<
+`context.Typeset()` accepts a third optional argument to specify a custom
+typesetting command. That must be a function that takes a path and returns the
+command as a List. For example:
+>
+ def ConTeXtCustomCommand(path: string): list<string>
+ return ['mtxrun', '--script', 'context', '--nonstopmode', path]
+ enddef
+
+ context.ConTeXtTypeset("%", v:none, ConTeXtCustomCommand)
+<
+Large projects are often organized as a root document and various chapter
+files. When editing a chapter file, it is convenient to invoke |:ConTeXt|
+directly on it, rather than having to switch to the root file. A "magic line"
+can be added at the beginning of each chapter file, which specifies the
+relative path to the root file. For instance:
+>
+ % !TEX root = ../MyRoot.tex
+<
+Vim searches for the magic line in the first ten lines of the current buffer:
+if it is found, the document specified by that line is typeset rather than the
+one in the current buffer. The root document does not have to be opened in
+Vim.
+
+To extend completion and syntax highlighting, you may generate supporting
+files using ConTeXt and add them to your configuration. If you configuration
+resides in `~/.vim`, you may use these commands:
+>
+ mkdir -p ~/.vim/syntax/shared
+ cd ~/.vim/syntax/shared
+ mtxrun --script interface --vim
+<
+The last command will create the following syntax files:
+
+- `context-data-context.vim`;
+- `context-data-interfaces.vim`;
+- `context-data-metafun.vim`;
+- `context-data-tex.vim`.
+
+The same command can be used to update those syntax files.
+
+ *ft-context-commands*
+Commands ~
+ *:ConTeXt*
+Start a background |job| to typeset the document in the current buffer. The
+command accepts an optional buffer's name, if you want to typeset a document
+that is in a different buffer.
+
+ *:ConTeXtLog*
+Edit the log file corresponding to the source in the current buffer.
+
+ *:ConTeXtJobsStatus*
+Echo the number of jobs currently running in the background.
+
+ *:ConTeXtStopJobs*
+Stop all the ConTeXt jobs currently running in the background.
+
+ *ft-context-settings*
+Settings ~
+ *'b:context_ignore_makefile'*
+ *'g:context_ignore_makefile'*
+`:make` can be used to (synchronously) typeset a document. If a Makefile exists
+and this option is not set, standard `make` is used. If this option is set,
+`mtxrun` is invoked instead, even if a Makefile exists.
+>
+ g:context_ignore_makefile = 0
+<
+NOTE: before using `:make`, set the working directory of the buffer to the
+directory of the file to be typeset.
+
+ *'g:context_extra_options'*
+A list of additional options to pass to `mtxrun`.
+>
+ g:context_extra_options = []
+<
+ *'b:context_include'*
+ *'g:context_include'*
+Dictionary of filetype/GROUP pairs for which syntax highlighting should be
+activated between \startGROUP and \stopGROUP. The default is to highlight XML
+between `\startXML` and `\stopXML`.
+>
+ g:context_include = {'xml': 'XML'}
+
+NOTE: Lua and MetaPost are always highlighted within the respective blocks.
+
+ *'g:no_context_maps'*
+When set, do not define any mappings.
+>
+ g:no_context_maps = 0
+<
+ *ft-context-mappings*
+Mappings ~
+
+tp "reflow TeX paragraph".
+
+i$ "inside inline math block".
+
+a$ "around inline math block".
+
+]] [count] start of sections forward.
+
+[[ [count] start of sections backward.
+
+][ [count] end sections forward.
+
+[] [count] end of sections backward.
+
+]} [count] end of blocks (\stop..., \setup...,
+ \define...) forward.
+
+[{ [count] begin of blocks (\start..., \setup...,
+ \define...) backward.
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/ft_mp.txt b/runtime/doc/ft_mp.txt
new file mode 100644
index 0000000..595bc02
--- /dev/null
+++ b/runtime/doc/ft_mp.txt
@@ -0,0 +1,151 @@
+*ft_mp.txt* For Vim version 9.0. Last change: 2022 Aug 12
+
+This is the documentation for the METAFONT and MetaPost filetype plugins.
+Unless otherwise specified, the commands, settings and mappings defined below
+apply equally to both filetypes.
+
+NOTE: the plugin requires +vim9script.
+
+==============================================================================
+CONTENTS *mp.vim* *ft-metapost*
+ *mf.vim* *ft-metafont*
+
+1. Introduction |ft-metapost-intro|
+2. Commands |ft-metapost-commands|
+3. Settings |ft-metapost-settings|
+4. Mappings |ft-metapost-mappings|
+
+==============================================================================
+ *ft-metapost-intro*
+ *ft-metafont-intro*
+Introduction ~
+This filetype plugin provides extensive support for editing METAFONT and
+MetaPost documents, including syntax coloring, indentation, and completion.
+
+Defining indentation rules for METAFONT and MetaPost code is tricky and
+somewhat subjective, because the syntax is quite liberal. The plugin uses some
+heuristics that work well most of the time, but in particular cases you may
+want to to override the automatic rules, so that the manually defined
+indentation is preserved by commands like `gg=G`.
+
+This can be achieved by appending `%>`, `%<`, `%=` or `%!` to a line to
+explicitly control the indentation of the next line. The `<` and `>` symbols
+may be repeated many times: for instance, `%>>` will cause the next line to be
+indented twice. Of course, `%<` means that the next line should be
+de-indented; `%=` sets the indentation of the next line to be equal to the
+indentation of the current line; and `%!` means that the indentation of the
+next line should not change from whatever it has been manually set.
+
+For example, this is the default indentation of a simple macro:
+>
+ def foo =
+ makepen(
+ subpath(T-n,t) of r
+ shifted .5down
+ --subpath(t,T) of r shifted .5up -- cycle
+ )
+ withcolor black
+ enddef
+<
+By adding the special comments, the indentation can be adjusted arbitrarily:
+>
+ def foo =
+ makepen(
+ subpath(T-n,t) of r %>
+ shifted .5down %>
+ --subpath(t,T) of r shifted .5up -- cycle %<<<
+ )
+ withcolor black
+ enddef
+<
+ *ft-metapost-commands*
+Commands ~
+ *:FixBeginfigs*
+Renumber beginfig() blocks in the current buffer so that the n-th figure has
+number n. MetaPost only.
+
+ *ft-metapost-settings*
+ *ft-metafont-settings*
+Settings ~
+ *'g:mf_other_macros'*
+Highlight some other basic macro names, e.g., from cmbase, logo, etc. This is
+set to 1 by default in METAFONT buffers, and it is set to 0 by default in
+MetaPost buffers.
+
+ *'g:mf_plain_macros'*
+Highlight keywords defined by plain.mf. This is set to 1 by default in
+METAFONT buffers, and it is set to 0 by default in MetaPost buffers.
+
+ *'g:mf_plain_modes'*
+Highlight keywords defined by modes.mf. This is set to 1 by default in
+METAFONT buffers, and it is set to 0 by default in MetaPost buffers.
+
+ *'g:mp_close_tag'*
+Define additional keywords that end indented blocks. For instance, if you
+define:
+>
+ g:mp_close_tag = ['\<endfoo\>']
+<
+any line starting with `endfoo` will be de-indented compared to its previous
+line.
+>
+ g:mp_close_tag = []
+<
+ *'b:mp_metafun'*
+ *'g:mp_metafun'*
+If set to 1, highlight ConTeXt's MetaFun keywords. MetaPost only.
+>
+ g:mp_metafun = 0
+<
+ *'g:mp_mfplain_macros'*
+Highlight keywords defined by mfplain.mp. MetaPost only.
+>
+ g:mp_mfplain_macros = 1
+<
+ *'g:mp_open_tag'*
+Define additional keywords that start indented blocks. For instance, if you
+define:
+>
+ g:mp_open_tag = ['\<beginfoo\>']
+<
+the line following `beginfoo` will be indented.
+>
+ g:mp_open_tag = []
+<
+ *'g:mp_other_macros'*
+Highlight keywords defined by all base macro packages (boxes, rboxes, format,
+graph, marith, sarith, string, TEX). This option affects only MetaPost
+buffers.
+>
+ g:mp_other_macros = 1
+<
+ *'g:mp_plain_macros'*
+Highlight keywords defined by plain.mp. MetaPost only.
+>
+ g:mp_plain_macros = 1
+<
+ *'g:no_mp_maps'*
+ *'g:no_mf_maps'*
+When set, do not define any mapping in buffers with the corresponding
+filetype.
+>
+ g:no_mp_maps = 0
+ g:no_mf_maps = 0
+<
+ *ft-metapost-mappings*
+ *ft-metafont-mappings*
+Mappings ~
+
+]] [count] vardefs, macros or figures forward.
+
+[[ [count] vardefs, macros or figures backward.
+
+][ [count] end of vardefs, macros or figures forward.
+
+[] [count] end of vardefs, macros or figures backward.
+
+]} [count] end of blocks (fi, endfor, endgroup) forward.
+
+[{ [count] begin of blocks (if, for, begingroup) backward.
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/ft_ps1.txt b/runtime/doc/ft_ps1.txt
new file mode 100644
index 0000000..3eb89a4
--- /dev/null
+++ b/runtime/doc/ft_ps1.txt
@@ -0,0 +1,64 @@
+*ft_ps1.txt* A Windows PowerShell syntax plugin for Vim
+
+Author: Peter Provost <https://www.github.com/PProvost>
+License: Apache 2.0
+URL: https://github.com/PProvost/vim-ps1
+
+INTRODUCTION *ps1-syntax*
+
+This plugin provides Vim syntax, indent and filetype detection for Windows
+PowerShell scripts, modules, and XML configuration files.
+
+
+ABOUT *ps1-about*
+
+Grab the latest version or report a bug on GitHub:
+
+https://github.com/PProvost/vim-ps1
+
+
+FOLDING *ps1-folding*
+
+The ps1 syntax file provides syntax folding (see |:syn-fold|) for script blocks
+and digital signatures in scripts.
+
+When 'foldmethod' is set to "syntax" then function script blocks will be
+folded unless you use the following in your .vimrc or before opening a script: >
+
+ :let g:ps1_nofold_blocks = 1
+<
+Digital signatures in scripts will also be folded unless you use: >
+
+ :let g:ps1_nofold_sig = 1
+<
+Note: syntax folding might slow down syntax highlighting significantly,
+especially for large files.
+
+
+COMPILER *ps1-compiler*
+
+The powershell `:compiler` script configures |:make| to execute the script in
+PowerShell.
+
+It tries to pick a smart default PowerShell command: `pwsh` if available and
+`powershell` otherwise, but you can customize the command: >
+
+ :let g:ps1_makeprg_cmd = '/path/to/pwsh'
+<
+To configure whether to show the exception type information: >
+
+ :let g:ps1_efm_show_error_categories = 1
+<
+
+KEYWORD LOOKUP *ps1-keyword*
+
+To look up keywords using PowerShell's Get-Help, press the |K| key. For more
+convenient paging, the pager `less` should be installed, which is included in
+many Linux distributions and in macOS.
+
+Many other distributions are available for Windows like
+https://chocolatey.org/packages/less/. Make sure `less` is in a directory
+listed in the `PATH` environment variable, which chocolatey above does.
+
+------------------------------------------------------------------------------
+ vim:ft=help:
diff --git a/runtime/doc/ft_raku.txt b/runtime/doc/ft_raku.txt
new file mode 100644
index 0000000..3d1179e
--- /dev/null
+++ b/runtime/doc/ft_raku.txt
@@ -0,0 +1,126 @@
+*ft_raku.txt* The Raku programming language filetype
+
+ *vim-raku*
+
+Vim-raku provides syntax highlighting, indentation, and other support for
+editing Raku programs.
+
+1. Using Unicode in your Raku files |raku-unicode|
+
+==============================================================================
+1. Using Unicode in your Raku files *raku-unicode*
+
+Defining new operators using Unicode symbols is a good way to make your
+Raku program easy to read. See:
+https://perl6advent.wordpress.com/2012/12/18/day-18-formulas-resistance-is-futile/
+
+While Raku does define ASCII alternatives for some common operators (see
+https://docs.raku.org/language/unicode_ascii), using the full range of
+Unicode operators is highly desirable. Your operating system provides input
+facilities, but using the features built in to Vim may be preferable.
+
+The natural way to produce these symbols in Vim is to use digraph shortcuts
+(:help |digraphs-use|). Many of them are defined; type `:digraphs` to get
+the list. A convenient way to read the list of digraphs is to save them in a
+file. From the shell: >
+ vim +'redir >/tmp/vim-digraphs-listing.txt' +digraphs +'redir END' +q
+
+Some of them are available with standard Vim digraphs:
+ << « /0 ∅ !< ≮ ~
+ >> » Ob ∘ !> ≯ ~
+ ., … 00 ∞ (C ⊂ ~
+ (U ∩ -: ÷ )C ⊃ ~
+ )U ∪ (_ ⊆ >= ≥ ~
+ ?= ≅ )_ ⊇ =< ≤ ~
+ (- ∈ ?= ≅ != ≠ ~
+ -) ∋ ?- ≃ ~
+
+The Greek alphabet is available with '*' followed by a similar Latin symbol:
+ *p π ~
+ *t τ ~
+ *X × ~
+
+Numbers, subscripts and superscripts are available with 's' and 'S':
+ 0s ₀ 0S ⁰ ~
+ 1s ₁ 1S ¹ ~
+ 2s ₂ 9S ⁹ ~
+
+But some don't come defined by default. Those are digraph definitions you can
+add in your ~/.vimrc file. >
+ exec 'digraph \\ ' .. char2nr('∖')
+ exec 'digraph \< ' .. char2nr('≼')
+ exec 'digraph \> ' .. char2nr('≽')
+ exec 'digraph (L ' .. char2nr('⊈')
+ exec 'digraph )L ' .. char2nr('⊉')
+ exec 'digraph (/ ' .. char2nr('⊄')
+ exec 'digraph )/ ' .. char2nr('⊅')
+ exec 'digraph )/ ' .. char2nr('⊅')
+ exec 'digraph U+ ' .. char2nr('⊎')
+ exec 'digraph 0- ' .. char2nr('⊖')
+ " Euler's constant
+ exec 'digraph ne ' .. char2nr('𝑒')
+ " Raku's atomic operations marker
+ exec 'digraph @@ ' .. char2nr('⚛')
+
+Alternatively, you can write Insert mode abbreviations that convert ASCII-
+based operators into their single-character Unicode equivalent. >
+ iabbrev <buffer> !(<) ⊄
+ iabbrev <buffer> !(<=) ⊈
+ iabbrev <buffer> !(>) ⊅
+ iabbrev <buffer> !(>=) ⊉
+ iabbrev <buffer> !(cont) ∌
+ iabbrev <buffer> !(elem) ∉
+ iabbrev <buffer> != ≠
+ iabbrev <buffer> (&) ∩
+ iabbrev <buffer> (+) ⊎
+ iabbrev <buffer> (-) ∖
+ iabbrev <buffer> (.) ⊍
+ iabbrev <buffer> (<) ⊂
+ iabbrev <buffer> (<+) ≼
+ iabbrev <buffer> (<=) ⊆
+ iabbrev <buffer> (>) ⊃
+ iabbrev <buffer> (>+) ≽
+ iabbrev <buffer> (>=) ⊇
+ iabbrev <buffer> (\|) ∪
+ iabbrev <buffer> (^) ⊖
+ iabbrev <buffer> (atomic) ⚛
+ iabbrev <buffer> (cont) ∋
+ iabbrev <buffer> (elem) ∈
+ iabbrev <buffer> * ×
+ iabbrev <buffer> **0 ⁰
+ iabbrev <buffer> **1 ¹
+ iabbrev <buffer> **2 ²
+ iabbrev <buffer> **3 ³
+ iabbrev <buffer> **4 ⁴
+ iabbrev <buffer> **5 ⁵
+ iabbrev <buffer> **6 ⁶
+ iabbrev <buffer> **7 ⁷
+ iabbrev <buffer> **8 ⁸
+ iabbrev <buffer> **9 ⁹
+ iabbrev <buffer> ... …
+ iabbrev <buffer> / ÷
+ iabbrev <buffer> << «
+ iabbrev <buffer> <<[=]<< «=«
+ iabbrev <buffer> <<[=]>> «=»
+ iabbrev <buffer> <= ≤
+ iabbrev <buffer> =~= ≅
+ iabbrev <buffer> >= ≥
+ iabbrev <buffer> >> »
+ iabbrev <buffer> >>[=]<< »=«
+ iabbrev <buffer> >>[=]>> »=»
+ iabbrev <buffer> Inf ∞
+ iabbrev <buffer> atomic-add-fetch ⚛+=
+ iabbrev <buffer> atomic-assign ⚛=
+ iabbrev <buffer> atomic-fetch ⚛
+ iabbrev <buffer> atomic-dec-fetch --⚛
+ iabbrev <buffer> atomic-fetch-dec ⚛--
+ iabbrev <buffer> atomic-fetch-inc ⚛++
+ iabbrev <buffer> atomic-inc-fetch ++⚛
+ iabbrev <buffer> atomic-sub-fetch ⚛−=
+ iabbrev <buffer> e 𝑒
+ iabbrev <buffer> o ∘
+ iabbrev <buffer> pi π
+ iabbrev <buffer> set() ∅
+ iabbrev <buffer> tau τ
+<
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/ft_rust.txt b/runtime/doc/ft_rust.txt
new file mode 100644
index 0000000..7fe7b7c
--- /dev/null
+++ b/runtime/doc/ft_rust.txt
@@ -0,0 +1,239 @@
+*ft_rust.txt* For Vim version 9.0. Last change: 2022 Oct 17
+
+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
new file mode 100644
index 0000000..0bf9886
--- /dev/null
+++ b/runtime/doc/ft_sql.txt
@@ -0,0 +1,780 @@
+*ft_sql.txt* For Vim version 9.0. Last change: 2022 Apr 06
+
+by David Fishburn
+
+This is a filetype plugin to work with SQL files.
+
+The Structured Query Language (SQL) is a standard which specifies statements
+that allow a user to interact with a relational database. Vim includes
+features for navigation, indentation and syntax highlighting.
+
+1. Navigation |sql-navigation|
+ 1.1 Matchit |sql-matchit|
+ 1.2 Text Object Motions |sql-object-motions|
+ 1.3 Predefined Object Motions |sql-predefined-objects|
+ 1.4 Macros |sql-macros|
+2. SQL Dialects |sql-dialects|
+ 2.1 SQLSetType |SQLSetType|
+ 2.2 SQLGetType |SQLGetType|
+ 2.3 SQL Dialect Default |sql-type-default|
+3. Adding new SQL Dialects |sql-adding-dialects|
+4. OMNI SQL Completion |sql-completion|
+ 4.1 Static mode |sql-completion-static|
+ 4.2 Dynamic mode |sql-completion-dynamic|
+ 4.3 Tutorial |sql-completion-tutorial|
+ 4.3.1 Complete Tables |sql-completion-tables|
+ 4.3.2 Complete Columns |sql-completion-columns|
+ 4.3.3 Complete Procedures |sql-completion-procedures|
+ 4.3.4 Complete Views |sql-completion-views|
+ 4.4 Completion Customization |sql-completion-customization|
+ 4.5 SQL Maps |sql-completion-maps|
+ 4.6 Using with other filetypes |sql-completion-filetypes|
+
+==============================================================================
+1. Navigation *sql-navigation*
+
+The SQL ftplugin provides a number of options to assist with file
+navigation.
+
+
+1.1 Matchit *sql-matchit*
+-----------
+The matchit plugin (http://www.vim.org/scripts/script.php?script_id=39)
+provides many additional features and can be customized for different
+languages. The matchit plugin is configured by defining a local
+buffer variable, b:match_words. Pressing the % key while on various
+keywords will move the cursor to its match. For example, if the cursor
+is on an "if", pressing % will cycle between the "else", "elseif" and
+"end if" keywords.
+
+The following keywords are supported: >
+ if
+ elseif | elsif
+ else [if]
+ end if
+
+ [while condition] loop
+ leave
+ break
+ continue
+ exit
+ end loop
+
+ for
+ leave
+ break
+ continue
+ exit
+ end loop
+
+ do
+ statements
+ doend
+
+ case
+ when
+ when
+ default
+ end case
+
+ merge
+ when not matched
+ when matched
+
+ create[ or replace] procedure|function|event
+ returns
+
+
+1.2 Text Object Motions *sql-object-motions*
+-----------------------
+Vim has a number of predefined keys for working with text |object-motions|.
+This filetype plugin attempts to translate these keys to maps which make sense
+for the SQL language.
+
+The following |Normal| mode and |Visual| mode maps exist (when you edit a SQL
+file): >
+ ]] move forward to the next 'begin'
+ [[ move backwards to the previous 'begin'
+ ][ move forward to the next 'end'
+ [] move backwards to the previous 'end'
+
+
+1.3 Predefined Object Motions *sql-predefined-objects*
+-----------------------------
+Most relational databases support various standard features, tables, indices,
+triggers and stored procedures. Each vendor also has a variety of proprietary
+objects. The next set of maps have been created to help move between these
+objects. Depends on which database vendor you are using, the list of objects
+must be configurable. The filetype plugin attempts to define many of the
+standard objects, plus many additional ones. In order to make this as
+flexible as possible, you can override the list of objects from within your
+|vimrc| with the following: >
+ let g:ftplugin_sql_objects = 'function,procedure,event,table,trigger' ..
+ \ ',schema,service,publication,database,datatype,domain' ..
+ \ ',index,subscription,synchronization,view,variable'
+
+The following |Normal| mode and |Visual| mode maps have been created which use
+the above list: >
+ ]} move forward to the next 'create <object name>'
+ [{ move backward to the previous 'create <object name>'
+
+Repeatedly pressing ]} will cycle through each of these create statements: >
+ create table t1 (
+ ...
+ );
+
+ create procedure p1
+ begin
+ ...
+ end;
+
+ create index i1 on t1 (c1);
+
+The default setting for g:ftplugin_sql_objects is: >
+ let g:ftplugin_sql_objects = 'function,procedure,event,' ..
+ \ '\\(existing\\\\|global\\s\\+temporary\\s\\+\\)\\\{,1}' ..
+ \ 'table,trigger' ..
+ \ ',schema,service,publication,database,datatype,domain' ..
+ \ ',index,subscription,synchronization,view,variable'
+
+The above will also handle these cases: >
+ create table t1 (
+ ...
+ );
+ create existing table t2 (
+ ...
+ );
+ create global temporary table t3 (
+ ...
+ );
+
+By default, the ftplugin only searches for CREATE statements. You can also
+override this via your |vimrc| with the following: >
+ let g:ftplugin_sql_statements = 'create,alter'
+
+The filetype plugin defines three types of comments: >
+ 1. --
+ 2. //
+ 3. /*
+ *
+ */
+
+The following |Normal| mode and |Visual| mode maps have been created to work
+with comments: >
+ ]" move forward to the beginning of a comment
+ [" move forward to the end of a comment
+
+
+
+1.4 Macros *sql-macros*
+----------
+Vim's feature to find macro definitions, |'define'|, is supported using this
+regular expression: >
+ \c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>
+
+This addresses the following code: >
+ CREATE VARIABLE myVar1 INTEGER;
+
+ CREATE PROCEDURE sp_test(
+ IN myVar2 INTEGER,
+ OUT myVar3 CHAR(30),
+ INOUT myVar4 NUMERIC(20,0)
+ )
+ BEGIN
+ DECLARE myVar5 INTEGER;
+
+ SELECT c1, c2, c3
+ INTO myVar2, myVar3, myVar4
+ FROM T1
+ WHERE c4 = myVar1;
+ END;
+
+Place your cursor on "myVar1" on this line: >
+ WHERE c4 = myVar1;
+ ^
+
+Press any of the following keys: >
+ [d
+ [D
+ [CTRL-D
+
+
+==============================================================================
+2. SQL Dialects *sql-dialects* *sql-types*
+ *sybase* *TSQL* *Transact-SQL*
+ *sqlanywhere*
+ *oracle* *plsql* *sqlj*
+ *sqlserver*
+ *mysql* *postgresql* *psql*
+ *informix*
+
+All relational databases support SQL. There is a portion of SQL that is
+portable across vendors (ex. CREATE TABLE, CREATE INDEX), but there is a
+great deal of vendor specific extensions to SQL. Oracle supports the
+"CREATE OR REPLACE" syntax, column defaults specified in the CREATE TABLE
+statement and the procedural language (for stored procedures and triggers).
+
+The default Vim distribution ships with syntax highlighting based on Oracle's
+PL/SQL. The default SQL indent script works for Oracle and SQL Anywhere.
+The default filetype plugin works for all vendors and should remain vendor
+neutral, but extendable.
+
+Vim currently has support for a variety of different vendors, currently this
+is via syntax scripts. Unfortunately, to flip between different syntax rules
+you must either create:
+ 1. New filetypes
+ 2. Custom autocmds
+ 3. Manual steps / commands
+
+The majority of people work with only one vendor's database product, it would
+be nice to specify a default in your |vimrc|.
+
+
+2.1 SQLSetType *sqlsettype* *SQLSetType*
+--------------
+For the people that work with many different databases, it is nice to be
+able to flip between the various vendors rules (indent, syntax) on a per
+buffer basis, at any time. The ftplugin/sql.vim file defines this function: >
+ SQLSetType
+
+Executing this function without any parameters will set the indent and syntax
+scripts back to their defaults, see |sql-type-default|. If you have turned
+off Vi's compatibility mode, |'compatible'|, you can use the <Tab> key to
+complete the optional parameter.
+
+After typing the function name and a space, you can use the completion to
+supply a parameter. The function takes the name of the Vim script you want to
+source. Using the |cmdline-completion| feature, the SQLSetType function will
+search the |'runtimepath'| for all Vim scripts with a name containing 'sql'.
+This takes the guess work out of the spelling of the names. The following are
+examples: >
+ :SQLSetType
+ :SQLSetType sqloracle
+ :SQLSetType sqlanywhere
+ :SQLSetType sqlinformix
+ :SQLSetType mysql
+
+The easiest approach is to the use <Tab> character which will first complete
+the command name (SQLSetType), after a space and another <Tab>, display a list
+of available Vim script names: >
+ :SQL<Tab><space><Tab>
+
+
+2.2 SQLGetType *sqlgettype* *SQLGetType*
+--------------
+At anytime you can determine which SQL dialect you are using by calling the
+SQLGetType command. The ftplugin/sql.vim file defines this function: >
+ SQLGetType
+
+This will echo: >
+ Current SQL dialect in use:sqlanywhere
+
+
+2.3 SQL Dialect Default *sql-type-default*
+-----------------------
+As mentioned earlier, the default syntax rules for Vim is based on Oracle
+(PL/SQL). You can override this default by placing one of the following in
+your |vimrc|: >
+ let g:sql_type_default = 'sqlanywhere'
+ let g:sql_type_default = 'sqlinformix'
+ let g:sql_type_default = 'mysql'
+
+If you added the following to your |vimrc|: >
+ let g:sql_type_default = 'sqlinformix'
+
+The next time edit a SQL file the following scripts will be automatically
+loaded by Vim: >
+ ftplugin/sql.vim
+ syntax/sqlinformix.vim
+ indent/sql.vim
+>
+Notice indent/sqlinformix.sql was not loaded. There is no indent file
+for Informix, Vim loads the default files if the specified files does not
+exist.
+
+
+==============================================================================
+3. Adding new SQL Dialects *sql-adding-dialects*
+
+If you begin working with a SQL dialect which does not have any customizations
+available with the default Vim distribution you can check http://www.vim.org
+to see if any customization currently exist. If not, you can begin by cloning
+an existing script. Read |filetype-plugins| for more details.
+
+To help identify these scripts, try to create the files with a "sql" prefix.
+If you decide you wish to create customizations for the SQLite database, you
+can create any of the following: >
+ Unix
+ ~/.vim/syntax/sqlite.vim
+ ~/.vim/indent/sqlite.vim
+ Windows
+ $VIM/vimfiles/syntax/sqlite.vim
+ $VIM/vimfiles/indent/sqlite.vim
+
+No changes are necessary to the SQLSetType function. It will automatically
+pick up the new SQL files and load them when you issue the SQLSetType command.
+
+
+==============================================================================
+4. OMNI SQL Completion *sql-completion*
+ *omni-sql-completion*
+
+Vim 7 includes a code completion interface and functions which allows plugin
+developers to build in code completion for any language. Vim 7 includes
+code completion for the SQL language.
+
+There are two modes to the SQL completion plugin, static and dynamic. The
+static mode populates the popups with the data generated from current syntax
+highlight rules. The dynamic mode populates the popups with data retrieved
+directly from a database. This includes, table lists, column lists,
+procedures names and more.
+
+4.1 Static Mode *sql-completion-static*
+---------------
+The static popups created contain items defined by the active syntax rules
+while editing a file with a filetype of SQL. The plugin defines (by default)
+various maps to help the user refine the list of items to be displayed.
+The defaults static maps are: >
+ imap <buffer> <C-C>a <C-\><C-O>:call sqlcomplete#Map('syntax')<CR><C-X><C-O>
+ imap <buffer> <C-C>k <C-\><C-O>:call sqlcomplete#Map('sqlKeyword')<CR><C-X><C-O>
+ imap <buffer> <C-C>f <C-\><C-O>:call sqlcomplete#Map('sqlFunction')<CR><C-X><C-O>
+ imap <buffer> <C-C>o <C-\><C-O>:call sqlcomplete#Map('sqlOption')<CR><C-X><C-O>
+ imap <buffer> <C-C>T <C-\><C-O>:call sqlcomplete#Map('sqlType')<CR><C-X><C-O>
+ imap <buffer> <C-C>s <C-\><C-O>:call sqlcomplete#Map('sqlStatement')<CR><C-X><C-O>
+
+The use of "<C-C>" can be user chosen by using the following in your |.vimrc|
+as it may not work properly on all platforms: >
+ let g:ftplugin_sql_omni_key = '<C-C>'
+>
+The static maps (which are based on the syntax highlight groups) follow this
+format: >
+ imap <buffer> <C-C>k <C-\><C-O>:call sqlcomplete#Map('sqlKeyword')<CR><C-X><C-O>
+ imap <buffer> <C-C>k <C-\><C-O>:call sqlcomplete#Map('sqlKeyword\w*')<CR><C-X><C-O>
+
+This command breaks down as: >
+ imap - Create an insert map
+ <buffer> - Only for this buffer
+ <C-C>k - Your choice of key map
+ <C-\><C-O> - Execute one command, return to Insert mode
+ :call sqlcomplete#Map( - Allows the SQL completion plugin to perform some
+ housekeeping functions to allow it to be used in
+ conjunction with other completion plugins.
+ Indicate which item you want the SQL completion
+ plugin to complete.
+ In this case we are asking the plugin to display
+ items from the syntax highlight group
+ 'sqlKeyword'.
+ You can view a list of highlight group names to
+ choose from by executing the
+ :syntax list
+ command while editing a SQL file.
+ 'sqlKeyword' - Display the items for the sqlKeyword highlight
+ group
+ 'sqlKeyword\w*' - A second option available with Vim 7.4 which
+ uses a regular expression to determine which
+ syntax groups to use
+ )<CR> - Execute the :let command
+ <C-X><C-O> - Trigger the standard omni completion key stroke.
+ Passing in 'sqlKeyword' instructs the SQL
+ completion plugin to populate the popup with
+ items from the sqlKeyword highlight group. The
+ plugin will also cache this result until Vim is
+ restarted. The syntax list is retrieved using
+ the syntaxcomplete plugin.
+
+Using the 'syntax' keyword is a special case. This instructs the
+syntaxcomplete plugin to retrieve all syntax items. So this will effectively
+work for any of Vim's SQL syntax files. At the time of writing this includes
+10 different syntax files for the different dialects of SQL (see section 3
+above, |sql-dialects|).
+
+Here are some examples of the entries which are pulled from the syntax files: >
+ All
+ - Contains the contents of all syntax highlight groups
+ Statements
+ - Select, Insert, Update, Delete, Create, Alter, ...
+ Functions
+ - Min, Max, Trim, Round, Date, ...
+ Keywords
+ - Index, Database, Having, Group, With
+ Options
+ - Isolation_level, On_error, Qualify_owners, Fire_triggers, ...
+ Types
+ - Integer, Char, Varchar, Date, DateTime, Timestamp, ...
+
+
+4.2 Dynamic Mode *sql-completion-dynamic*
+----------------
+Dynamic mode populates the popups with data directly from a database. In
+order for the dynamic feature to be enabled you must have the dbext.vim
+plugin installed, (http://vim.sourceforge.net/script.php?script_id=356).
+
+Dynamic mode is used by several features of the SQL completion plugin.
+After installing the dbext plugin see the dbext-tutorial for additional
+configuration and usage. The dbext plugin allows the SQL completion plugin
+to display a list of tables, procedures, views and columns. >
+ Table List
+ - All tables for all schema owners
+ Procedure List
+ - All stored procedures for all schema owners
+ View List
+ - All stored procedures for all schema owners
+ Column List
+ - For the selected table, the columns that are part of the table
+
+To enable the popup, while in INSERT mode, use the following key combinations
+for each group (where <C-C> means hold the CTRL key down while pressing
+the space bar):
+ Table List - <C-C>t
+ - <C-X><C-O> (the default map assumes tables)
+ Stored Procedure List - <C-C>p
+ View List - <C-C>v
+ Column List - <C-C>c
+
+ Drilling In / Out - When viewing a popup window displaying the list
+ of tables, you can press <Right>, this will
+ replace the table currently highlighted with
+ the column list for that table.
+ - When viewing a popup window displaying the list
+ of columns, you can press <Left>, this will
+ replace the column list with the list of tables.
+ - This allows you to quickly drill down into a
+ table to view its columns and back again.
+ - <Right> and <Left> can also be chosen via
+ your |.vimrc| >
+ let g:ftplugin_sql_omni_key_right = '<Right>'
+ let g:ftplugin_sql_omni_key_left = '<Left>'
+
+The SQL completion plugin caches various lists that are displayed in
+the popup window. This makes the re-displaying of these lists very
+fast. If new tables or columns are added to the database it may become
+necessary to clear the plugins cache. The default map for this is: >
+ imap <buffer> <C-C>R <C-\><C-O>:call sqlcomplete#Map('ResetCache')<CR><C-X><C-O>
+
+
+4.3 SQL Tutorial *sql-completion-tutorial*
+----------------
+
+This tutorial is designed to take you through the common features of the SQL
+completion plugin so that: >
+ a) You gain familiarity with the plugin
+ b) You are introduced to some of the more common features
+ c) Show how to customize it to your preferences
+ d) Demonstrate "Best of Use" of the plugin (easiest way to configure).
+
+First, create a new buffer: >
+ :e tutorial.sql
+
+
+Static features
+---------------
+To take you through the various lists, simply enter insert mode, hit:
+ <C-C>s (show SQL statements)
+At this point, you can page down through the list until you find "select".
+If you are familiar with the item you are looking for, for example you know
+the statement begins with the letter "s". You can type ahead (without the
+quotes) "se" then press:
+ <C-Space>t
+Assuming "select" is highlighted in the popup list press <Enter> to choose
+the entry. Now type:
+ * fr<C-C>a (show all syntax items)
+choose "from" from the popup list.
+
+When writing stored procedures using the "type" list is useful. It contains
+a list of all the database supported types. This may or may not be true
+depending on the syntax file you are using. The SQL Anywhere syntax file
+(sqlanywhere.vim) has support for this: >
+ BEGIN
+ DECLARE customer_id <C-C>T <-- Choose a type from the list
+
+
+Dynamic features
+----------------
+To take advantage of the dynamic features you must first install the
+dbext.vim plugin (http://vim.sourceforge.net/script.php?script_id=356). It
+also comes with a tutorial. From the SQL completion plugin's perspective,
+the main feature dbext provides is a connection to a database. dbext
+connection profiles are the most efficient mechanism to define connection
+information. Once connections have been setup, the SQL completion plugin
+uses the features of dbext in the background to populate the popups.
+
+What follows assumes dbext.vim has been correctly configured, a simple test
+is to run the command, :DBListTable. If a list of tables is shown, you know
+dbext.vim is working as expected. If not, please consult the dbext.txt
+documentation.
+
+Assuming you have followed the dbext-tutorial you can press <C-C>t to
+display a list of tables. There is a delay while dbext is creating the table
+list. After the list is displayed press <C-W>. This will remove both the
+popup window and the table name already chosen when the list became active.
+
+ 4.3.1 Table Completion: *sql-completion-tables*
+
+Press <C-C>t to display a list of tables from within the database you
+have connected via the dbext plugin.
+NOTE: All of the SQL completion popups support typing a prefix before pressing
+the key map. This will limit the contents of the popup window to just items
+beginning with those characters.
+
+ 4.3.2 Column Completion: *sql-completion-columns*
+
+The SQL completion plugin can also display a list of columns for particular
+tables. The column completion is triggered via <C-C>c.
+
+NOTE: The following example uses <Right> to trigger a column list while
+ the popup window is active.
+
+Example of using column completion:
+ - Press <C-C>t again to display the list of tables.
+ - When the list is displayed in the completion window, press <Right>,
+ this will replace the list of tables, with a list of columns for the
+ table highlighted (after the same short delay).
+ - If you press <Left>, this will again replace the column list with the
+ list of tables. This allows you to drill into tables and column lists
+ very quickly.
+ - Press <Right> again while the same table is highlighted. You will
+ notice there is no delay since the column list has been cached. If you
+ change the schema of a cached table you can press <C-C>R, which
+ clears the SQL completion cache.
+ - NOTE: <Right> and <Left> have been designed to work while the
+ completion window is active. If the completion popup window is
+ not active, a normal <Right> or <Left> will be executed.
+
+Let's look at how we can build a SQL statement dynamically. A select statement
+requires a list of columns. There are two ways to build a column list using
+the SQL completion plugin. >
+ One column at a time:
+< 1. After typing SELECT press <C-C>t to display a list of tables.
+ 2. Choose a table from the list.
+ 3. Press <Right> to display a list of columns.
+ 4. Choose the column from the list and press enter.
+ 5. Enter a "," and press <C-C>c. Generating a column list
+ generally requires having the cursor on a table name. The plugin
+ uses this name to determine what table to retrieve the column list.
+ In this step, since we are pressing <C-C>c without the cursor
+ on a table name the column list displayed will be for the previous
+ table. Choose a different column and move on.
+ 6. Repeat step 5 as often as necessary. >
+ All columns for a table:
+< 1. After typing SELECT press <C-C>t to display a list of tables.
+ 2. Highlight the table you need the column list for.
+ 3. Press <Enter> to choose the table from the list.
+ 4. Press <C-C>l to request a comma-separated list of all columns
+ for this table.
+ 5. Based on the table name chosen in step 3, the plugin attempts to
+ decide on a reasonable table alias. You are then prompted to
+ either accept of change the alias. Press OK.
+ 6. The table name is replaced with the column list of the table is
+ replaced with the comma separate list of columns with the alias
+ prepended to each of the columns.
+ 7. Step 3 and 4 can be replaced by pressing <C-C>L, which has
+ a <C-Y> embedded in the map to choose the currently highlighted
+ table in the list.
+
+There is a special provision when writing select statements. Consider the
+following statement: >
+ select *
+ from customer c,
+ contact cn,
+ department as dp,
+ employee e,
+ site_options so
+ where c.
+
+In INSERT mode after typing the final "c." which is an alias for the
+"customer" table, you can press either <C-C>c or <C-X><C-O>. This will
+popup a list of columns for the customer table. It does this by looking back
+to the beginning of the select statement and finding a list of the tables
+specified in the FROM clause. In this case it notes that in the string
+"customer c", "c" is an alias for the customer table. The optional "AS"
+keyword is also supported, "customer AS c".
+
+
+ 4.3.3 Procedure Completion: *sql-completion-procedures*
+
+Similar to the table list, <C-C>p, will display a list of stored
+procedures stored within the database.
+
+ 4.3.4 View Completion: *sql-completion-views*
+
+Similar to the table list, <C-C>v, will display a list of views in the
+database.
+
+
+4.4 Completion Customization *sql-completion-customization*
+----------------------------
+
+The SQL completion plugin can be customized through various options set in
+your |vimrc|: >
+ omni_sql_no_default_maps
+< - Default: This variable is not defined
+ - If this variable is defined, no maps are created for OMNI
+ completion. See |sql-completion-maps| for further discussion.
+>
+ omni_sql_use_tbl_alias
+< - Default: a
+ - This setting is only used when generating a comma-separated
+ column list. By default the map is <C-C>l. When generating
+ a column list, an alias can be prepended to the beginning of each
+ column, for example: e.emp_id, e.emp_name. This option has three
+ settings: >
+ n - do not use an alias
+ d - use the default (calculated) alias
+ a - ask to confirm the alias name
+<
+ An alias is determined following a few rules:
+ 1. If the table name has an '_', then use it as a separator: >
+ MY_TABLE_NAME --> MTN
+ my_table_name --> mtn
+ My_table_NAME --> MtN
+< 2. If the table name does NOT contain an '_', but DOES use
+ mixed case then the case is used as a separator: >
+ MyTableName --> MTN
+< 3. If the table name does NOT contain an '_', and does NOT
+ use mixed case then the first letter of the table is used: >
+ mytablename --> m
+ MYTABLENAME --> M
+
+ omni_sql_ignorecase
+< - Default: Current setting for 'ignorecase'
+ - Valid settings are 0 or 1.
+ - When entering a few letters before initiating completion, the list
+ will be filtered to display only the entries which begin with the
+ list of characters. When this option is set to 0, the list will be
+ filtered using case sensitivity. >
+
+ omni_sql_include_owner
+< - Default: 0, unless dbext.vim 3.00 has been installed
+ - Valid settings are 0 or 1.
+ - When completing tables, procedure or views and using dbext.vim 3.00
+ or higher the list of objects will also include the owner name.
+ When completing these objects and omni_sql_include_owner is enabled
+ the owner name will be replaced. >
+
+ omni_sql_precache_syntax_groups
+< - Default:
+ ['syntax','sqlKeyword','sqlFunction','sqlOption','sqlType','sqlStatement']
+ - sqlcomplete can be used in conjunction with other completion
+ plugins. This is outlined at |sql-completion-filetypes|. When the
+ filetype is changed temporarily to SQL, the sqlcompletion plugin
+ will cache the syntax groups listed in the List specified in this
+ option.
+>
+
+4.5 SQL Maps *sql-completion-maps*
+------------
+
+The default SQL maps have been described in other sections of this document in
+greater detail. Here is a list of the maps with a brief description of each.
+
+Static Maps
+-----------
+These are maps which use populate the completion list using Vim's syntax
+highlighting rules. >
+ <C-C>a
+< - Displays all SQL syntax items. >
+ <C-C>k
+< - Displays all SQL syntax items defined as 'sqlKeyword'. >
+ <C-C>f
+< - Displays all SQL syntax items defined as 'sqlFunction. >
+ <C-C>o
+< - Displays all SQL syntax items defined as 'sqlOption'. >
+ <C-C>T
+< - Displays all SQL syntax items defined as 'sqlType'. >
+ <C-C>s
+< - Displays all SQL syntax items defined as 'sqlStatement'. >
+
+Dynamic Maps
+------------
+These are maps which use populate the completion list using the dbext.vim
+plugin. >
+ <C-C>t
+< - Displays a list of tables. >
+ <C-C>p
+< - Displays a list of procedures. >
+ <C-C>v
+< - Displays a list of views. >
+ <C-C>c
+< - Displays a list of columns for a specific table. >
+ <C-C>l
+< - Displays a comma-separated list of columns for a specific table. >
+ <C-C>L
+< - Displays a comma-separated list of columns for a specific table.
+ This should only be used when the completion window is active. >
+ <Right>
+< - Displays a list of columns for the table currently highlighted in
+ the completion window. <Right> is not recognized on most Unix
+ systems, so this maps is only created on the Windows platform.
+ If you would like the same feature on Unix, choose a different key
+ and make the same map in your vimrc. >
+ <Left>
+< - Displays the list of tables.
+ <Left> is not recognized on most Unix systems, so this maps is
+ only created on the Windows platform. If you would like the same
+ feature on Unix, choose a different key and make the same map in
+ your vimrc. >
+ <C-C>R
+< - This maps removes all cached items and forces the SQL completion
+ to regenerate the list of items.
+
+Customizing Maps
+----------------
+You can create as many additional key maps as you like. Generally, the maps
+will be specifying different syntax highlight groups.
+
+If you do not wish the default maps created or the key choices do not work on
+your platform (often a case on *nix) you define the following variable in
+your |vimrc|: >
+ let g:omni_sql_no_default_maps = 1
+
+Do not edit ftplugin/sql.vim directly! If you change this file your changes
+will be over written on future updates. Vim has a special directory structure
+which allows you to make customizations without changing the files that are
+included with the Vim distribution. If you wish to customize the maps
+create an after/ftplugin/sql.vim (see |after-directory|) and place the same
+maps from the ftplugin/sql.vim in it using your own key strokes. <C-C> was
+chosen since it will work on both Windows and *nix platforms. On the windows
+platform you can also use <C-Space> or ALT keys.
+
+
+4.6 Using with other filetypes *sql-completion-filetypes*
+------------------------------
+
+Many times SQL can be used with different filetypes. For example Perl, Java,
+PHP, Javascript can all interact with a database. Often you need both the SQL
+completion and the completion capabilities for the current language you are
+editing.
+
+This can be enabled easily with the following steps (assuming a Perl file): >
+ 1. :e test.pl
+ 2. :set filetype=sql
+ 3. :set ft=perl
+
+Step 1
+------
+Begins by editing a Perl file. Vim automatically sets the filetype to
+"perl". By default, Vim runs the appropriate filetype file
+ftplugin/perl.vim. If you are using the syntax completion plugin by following
+the directions at |ft-syntax-omni| then the |'omnifunc'| option has been set to
+"syntax#Complete". Pressing <C-X><C-O> will display the omni popup containing
+the syntax items for Perl.
+
+Step 2
+------
+Manually setting the filetype to 'sql' will also fire the appropriate filetype
+files ftplugin/sql.vim. This file will define a number of buffer specific
+maps for SQL completion, see |sql-completion-maps|. Now these maps have
+been created and the SQL completion plugin has been initialized. All SQL
+syntax items have been cached in preparation. The SQL filetype script detects
+we are attempting to use two different completion plugins. Since the SQL maps
+begin with <C-C>, the maps will toggle the |'omnifunc'| when in use. So you
+can use <C-X><C-O> to continue using the completion for Perl (using the syntax
+completion plugin) and <C-C> to use the SQL completion features.
+
+Step 3
+------
+Setting the filetype back to Perl sets all the usual "perl" related items back
+as they were.
+
+
+vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/gui.txt b/runtime/doc/gui.txt
new file mode 100644
index 0000000..724318d
--- /dev/null
+++ b/runtime/doc/gui.txt
@@ -0,0 +1,1257 @@
+*gui.txt* For Vim version 9.0. Last change: 2023 Feb 26
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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. Font |gui-font|
+7. Extras |gui-extras|
+8. Shell Commands |gui-shell|
+
+Other GUI documentation:
+|gui_x11.txt| For specific items of the X11 GUI.
+|gui_w32.txt| For specific items of the Win32 GUI.
+
+
+==============================================================================
+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. You can check this with the ":version" command, it says "with xxx
+GUI", where "xxx" is X11-Motif, Photon, GTK2, GTK3, etc., or
+"MS-Windows 32 bit GUI version".
+
+How to start the GUI depends on the system used. Mostly you can run the
+GUI version of Vim with:
+ gvim [options] [files...]
+
+The X11 version of Vim can run both in GUI and in non-GUI mode. See
+|gui-x11-start|.
+
+ *gui-init* *gvimrc* *.gvimrc* *_gvimrc* *$MYGVIMRC*
+The gvimrc file is where GUI-specific startup commands should be placed. It
+is always sourced after the |vimrc| 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
+ 'guioptions'. *buffers-menu* *no_buffers_menu*
+ The system menu file includes a "Buffers" menu. If you don't want this, set
+ the "no_buffers_menu" variable in your .vimrc (not .gvimrc!): >
+ :let no_buffers_menu = 1
+< NOTE: Switching on syntax highlighting also loads the menu file, thus
+ disabling the Buffers menu must be done before ":syntax on".
+ The path names are truncated to 35 characters. You can truncate them at a
+ different length, for example 50, like this: >
+ :let bmenu_max_pathlen = 50
+- If the "-U {gvimrc}" command-line option has been used when starting Vim,
+ the {gvimrc} file will be read for initializations. The following
+ initializations are skipped. When {gvimrc} is "NONE" no file will be read
+ for initializations.
+- For Unix and MS-Windows, if the system gvimrc exists, it is sourced. The
+ name of this file is normally "$VIM/gvimrc". You can check this with
+ ":version". Also see |$VIM|.
+- The following are tried, and only the first one that exists is used:
+ - If the GVIMINIT environment variable exists and is not empty, it is
+ executed as an Ex command.
+ - If the user gvimrc file exists, it is sourced. The name of this file is
+ normally "$HOME/.gvimrc". You can check this with ":version".
+ - For Win32, $HOME is set by Vim if needed, see |$HOME-windows|.
+ - When a "_gvimrc" file is not found, ".gvimrc" is tried too. And vice
+ versa.
+ The name of the first file found is stored in $MYGVIMRC, unless it was
+ already set.
+- If the 'exrc' option is set (which is NOT the default) the file ./.gvimrc
+ is sourced, if it exists and isn't the same file as the system or user
+ gvimrc file. If this file is not owned by you, some security restrictions
+ apply. When ".gvimrc" is not found, "_gvimrc" is tried too. For Macintosh
+ and DOS/Win32 "_gvimrc" is tried first.
+
+NOTE: All but the first one are not carried out if Vim was started with
+"-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|.
+But the GUI window is only opened after all the initializations have been
+carried out. If you want some commands to be executed just after opening the
+GUI window, use the |GUIEnter| autocommand event. Example: >
+ :autocmd GUIEnter * winpos 100 50
+
+You can use the gvimrc files to set up your own customized menus (see |:menu|)
+and initialize other things that you may want to set up differently from the
+terminal version.
+
+Recommended place for your personal GUI initializations:
+ Unix $HOME/.gvimrc or $HOME/.vim/gvimrc
+ Win32 $HOME/_gvimrc, $HOME/vimfiles/gvimrc
+ or $VIM/_gvimrc
+ Amiga s:.gvimrc, home:.gvimrc, home:vimfiles:gvimrc
+ or $VIM/.gvimrc
+ Haiku $HOME/config/settings/vim/gvimrc
+
+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', 'guipty' and 'guioptions'. They are
+documented in |options.txt| with all the other options.
+
+If using the Motif version of the GUI (but not for the GTK+ or
+Win32 version), a number of X resources are available. See |gui-resources|.
+
+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 |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|.
+ 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).
+
+ *:win* *:winsize* *E465*
+:win[size] {width} {height}
+ Set the window height to {width} by {height} characters.
+ It is recommended to use `:set lines=11 columns=22` instead,
+ since it's easy to see what the numbers mean.
+ 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.
+
+One workaround that has been successful, for unknown reasons, is to prevent
+gvim from forking into the background by starting it with the |-f| argument.
+
+==============================================================================
+2. Scrollbars *gui-scrollbars*
+
+There are vertical scrollbars and a horizontal scrollbar. You may
+configure which ones appear with the 'guioptions' option.
+
+The interface looks like this (with ":set guioptions=mlrb"):
+
+ +------------------------------+ `
+ | File Edit Help | <- Menu bar (m) `
+ +-+--------------------------+-+ `
+ |^| |^| `
+ |#| Text area. |#| `
+ | | | | `
+ |v|__________________________|v| `
+ Normal status line -> |-+ File.c 5,2 +-| `
+ between Vim windows |^|""""""""""""""""""""""""""|^| `
+ | | | | `
+ | | Another file buffer. | | `
+ | | | | `
+ |#| |#| `
+ Left scrollbar (l) -> |#| |#| <- Right `
+ |#| |#| scrollbar (r) `
+ | | | | `
+ |v| |v| `
+ +-+--------------------------+-+ `
+ | |< #### >| | <- Bottom `
+ +-+--------------------------+-+ scrollbar (b) `
+
+Any of the scrollbar or menu components may be turned off by not putting the
+appropriate letter in the 'guioptions' string. The bottom scrollbar is
+only useful when 'nowrap' is set.
+
+
+VERTICAL SCROLLBARS *gui-vert-scroll*
+
+Each Vim window has a scrollbar next to it which may be scrolled up and down
+to move through the text in that buffer. The size of the scrollbar-thumb
+indicates the fraction of the buffer which can be seen in the window.
+When the scrollbar is dragged all the way down, the last line of the file
+will appear in the top of the window.
+
+If a window is shrunk to zero height (by the growth of another window) its
+scrollbar disappears. It reappears when the window is restored.
+
+If a window is vertically split, it will get a scrollbar when it is the
+current window and when, taking the middle of the current window and drawing a
+vertical line, this line goes through the window.
+When there are scrollbars on both sides, and the middle of the current window
+is on the left half, the right scrollbar column will contain scrollbars for
+the rightmost windows. The same happens on the other side.
+
+
+HORIZONTAL SCROLLBARS *gui-horiz-scroll*
+
+The horizontal scrollbar (at the bottom of the Vim GUI) may be used to
+scroll text sideways when the 'wrap' option is turned off. The
+scrollbar-thumb size is such that the text of the longest visible line may be
+scrolled as far as possible left and right. The cursor is moved when
+necessary, it must remain on a visible character (unless 'virtualedit' is
+set).
+
+Computing the length of the longest visible line takes quite a bit of
+computation, and it has to be done every time something changes. If this
+takes too much time or you don't like the cursor jumping to another line,
+include the 'h' flag in 'guioptions'. Then the scrolling is limited by the
+text of the current cursor line.
+
+ *motif-intellimouse*
+If you have an Intellimouse and an X server that supports using the wheel,
+then you can use the wheel to scroll the text up and down in gvim. This works
+with XFree86 4.0 and later, and with some older versions when you add patches.
+See |scroll-mouse-wheel|.
+
+For older versions of XFree86 you must patch your X server. The following
+page has a bit of information about using the Intellimouse on Linux as well as
+links to the patches and X server binaries (may not have the one you need
+though):
+ http://www.inria.fr/koala/colas/mouse-wheel-scroll/
+
+==============================================================================
+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
+'mousemoveevent' enable mouse move events so that <MouseMove> can be mapped
+'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' 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.
+
+<MouseMove> may be mapped, but 'mousemoveevent' must be enabled to use the
+mapping.
+
+Mouse mapping with modifiers does not work for modeless selection.
+
+
+3.7 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. You can check if this is
+supported with the *drop_file* feature: `has('drop_file')`.
+
+If you hold down Shift while doing this, Vim changes to the first dropped
+file's directory. If you hold Ctrl Vim will always split a new window for the
+file. Otherwise it's only done if the current buffer has been changed.
+
+You can also drop a directory on Vim. This starts the explorer plugin for
+that directory (assuming it was enabled, otherwise you'll get an error
+message). Keep Shift pressed to change to the directory instead.
+
+If Vim happens to be editing a command line, the names of the dropped files
+and directories will be inserted at the cursor. This allows you to use these
+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 |gui-clipboard| is used; under X11, the |x11-selection| is
+used - you should read whichever of these is appropriate now).
+
+ *clipboard*
+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
+
+When using this register under X11, also see |x11-selection|. This also
+explains the related "+ register.
+
+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. However, if the text gets
+transferred via the |x11-cut-buffer|, the selection type is ALWAYS lost.
+
+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*
+
+For an introduction see |usr_42.txt| in the user manual.
+
+
+5.1 Using Menus *using-menus*
+
+Basically, menus can be used just like mappings. You can define your own
+menus, as many as you like.
+Long-time Vim users won't use menus much. But the power is in adding your own
+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
+|$VIMRUNTIME| for where the path comes from. You can set up your own menus.
+Starting off with the default set is a good idea. You can add more items, or,
+if you don't like the defaults at all, start with removing all menus
+|:unmenu-all|. You can also avoid the default menus being loaded by adding
+this line to your .vimrc file (NOT your .gvimrc file!): >
+ :let did_install_default_menus = 1
+If you also want to avoid the Syntax menu: >
+ :let did_install_syntax_menu = 1
+The first item in the Syntax menu can be used to show all available filetypes
+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
+
+The following menuitems show all available color schemes, keymaps and compiler
+settings:
+ Edit > Color Scheme ~
+ Edit > Keymap ~
+ Tools > Set Compiler ~
+However, they can also take a bit of time to load, because they search all
+related files from the directories in 'runtimepath'. Therefore they are
+loaded lazily (by the |CursorHold| event), or you can also load them manually.
+If you want to have all these items already present at startup, add: >
+ :let do_no_lazyload_menus = 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
+not done by default. You can use the |:emenu| command and command-line
+completion with 'wildmenu' to access the menu entries almost like a real menu
+system. To do this, put these commands in your .vimrc file: >
+ :source $VIMRUNTIME/menu.vim
+ :set wildmenu
+ :set cpo-=<
+ :set wcm=<C-Z>
+ :map <F4> :emenu <C-Z>
+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.
+
+ *tear-off-menus*
+GTK+ 2 and Motif support Tear-off menus. These are sort of sticky menus or
+pop-up menus that are present all the time. If the resizing does not work
+correctly, this may be caused by using something like "Vim*geometry" in the
+defaults. Use "Vim.geometry" instead.
+
+As to GTK+ 3, tear-off menus have been deprecated since GTK+ 3.4.
+Accordingly, they are disabled if gvim is linked against GTK+ 3.4 or later.
+
+The Win32 GUI version emulates Motif's tear-off menus. Actually, a Motif user
+will spot the differences easily, but hopefully they're just as useful. You
+can also use the |:tearoff| command together with |hidden-menus| to create
+floating menus that do not appear on the main menu bar.
+
+
+5.2 Creating New Menus *creating-menus*
+
+ *:me* *:menu* *:noreme* *:noremenu*
+ *E330* *E327* *E331* *E336* *E333*
+ *E328* *E329* *E337* *E792*
+To create a new menu item, use the ":menu" commands. They are mostly like
+the ":map" set of commands (see |map-modes|), but the first argument is a menu
+item name, given as a path of menus and submenus with a '.' between them,
+e.g.: >
+
+ :menu File.Save :w<CR>
+ :inoremenu File.Save <C-O>:w<CR>
+ :menu Edit.Big\ Changes.Delete\ All\ Spaces :%s/[ ^I]//g<CR>
+
+This last one will create a new item in the menu bar called "Edit", holding
+the mouse button down on this will pop up a menu containing the item
+"Big Changes", which is a sub-menu containing the item "Delete All Spaces",
+which when selected, performs the operation.
+
+To create a menu for terminal mode, use |:tlmenu| instead of |:tmenu| unlike
+key mapping (|:tmap|). This is because |:tmenu| is already used for defining
+tooltips for menus. See |terminal-typing|.
+
+Special characters in a menu name:
+
+ *menu-shortcut*
+ & The next character is the shortcut key. Make sure each
+ shortcut key is only used once in a (sub)menu. If you want to
+ insert a literal "&" in the menu name use "&&".
+ *menu-text*
+ <Tab> Separates the menu name from right-aligned text. This can be
+ used to show the equivalent typed command. The text "<Tab>"
+ can be used here for convenience. If you are using a real
+ tab, don't forget to put a backslash before it!
+Example: >
+
+ :amenu &File.&Open<Tab>:e :browse e<CR>
+
+[typed literally]
+With the shortcut "F" (while keeping the <Alt> key pressed), and then "O",
+this menu can be used. The second part is shown as "Open :e". The ":e"
+is right aligned, and the "O" is underlined, to indicate it is the shortcut.
+
+ *:am* *:amenu* *:an* *:anoremenu*
+The ":amenu" command can be used to define menu entries for all modes at once,
+except for Terminal mode. To make the command work correctly, a character is
+automatically inserted for some modes:
+ mode inserted appended ~
+ Normal nothing nothing
+ Visual <C-C> <C-\><C-G>
+ Insert <C-\><C-O>
+ Cmdline <C-C> <C-\><C-G>
+ Op-pending <C-C> <C-\><C-G>
+
+Appending CTRL-\ CTRL-G is for going back to insert mode when 'insertmode' is
+set. |CTRL-\_CTRL-G|
+
+Example: >
+
+ :amenu File.Next :next^M
+
+is equal to: >
+
+ :nmenu File.Next :next^M
+ :vmenu File.Next ^C:next^M^\^G
+ :imenu File.Next ^\^O:next^M
+ :cmenu File.Next ^C:next^M^\^G
+ :omenu File.Next ^C:next^M^\^G
+
+Careful: In Insert mode this only works for a SINGLE Normal mode command,
+because of the CTRL-O. If you have two or more commands, you will need to use
+the ":imenu" command. For inserting text in any mode, you can use the
+expression register: >
+
+ :amenu Insert.foobar "='foobar'<CR>P
+
+The special text <Cmd> begins a "command menu", it executes the command
+directly without changing modes. Where you might use ":...<CR>" you can
+instead use "<Cmd>...<CR>". See |<Cmd>| for more info. Example: >
+ anoremenu File.Next <Cmd>next<CR>
+
+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.
+
+ *:nme* *:nmenu* *:nnoreme* *:nnoremenu* *:nunme* *:nunmenu*
+Menu commands starting with "n" work in Normal mode. |mapmode-n|
+
+ *:ome* *:omenu* *:onoreme* *:onoremenu* *:ounme* *:ounmenu*
+Menu commands starting with "o" work in Operator-pending mode. |mapmode-o|
+
+ *:vme* *:vmenu* *:vnoreme* *:vnoremenu* *:vunme* *:vunmenu*
+Menu commands starting with "v" work in Visual mode. |mapmode-v|
+
+ *:xme* *:xmenu* *:xnoreme* *:xnoremenu* *:xunme* *:xunmenu*
+Menu commands starting with "x" work in Visual and Select mode. |mapmode-x|
+
+ *:sme* *:smenu* *:snoreme* *:snoremenu* *:sunme* *:sunmenu*
+Menu commands starting with "s" work in Select mode. |mapmode-s|
+
+ *:ime* *:imenu* *:inoreme* *:inoremenu* *:iunme* *:iunmenu*
+Menu commands starting with "i" work in Insert mode. |mapmode-i|
+
+ *:cme* *:cmenu* *:cnoreme* *:cnoremenu* *:cunme* *:cunmenu*
+Menu commands starting with "c" work in Cmdline mode. |mapmode-c|
+
+ *:tlm* *:tlmenu* *:tln* *:tlnoremenu* *:tlu* *:tlunmenu*
+Menu commands starting with "tl" work in Terminal mode. |mapmode-t|
+
+ *:menu-<silent>* *:menu-silent*
+To define a menu which will not be echoed on the command line, add
+"<silent>" as the first argument. Example: >
+ :menu <silent> Settings.Ignore\ case :set ic<CR>
+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>".
+
+ *: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>".
+
+ *menu-priority*
+You can give a priority to a menu. Menus with a higher priority go more to
+the right. The priority is given as a number before the ":menu" command.
+Example: >
+ :80menu Buffer.next :bn<CR>
+
+The default menus have these priorities:
+ File 10
+ Edit 20
+ Tools 40
+ Syntax 50
+ Buffers 60
+ Window 70
+ Help 9999
+
+When no or zero priority is given, 500 is used.
+The priority for the PopUp menu is not used.
+
+The Help menu will be placed on the far right side of the menu bar on systems
+which support this (Motif and GTK+). For GTK+ 2 and 3, this is not done
+anymore because right-aligning the Help menu is now discouraged UI design.
+
+You can use a priority higher than 9999, to make it go after the Help menu,
+but that is non-standard and is discouraged. The highest possible priority is
+about 32000. The lowest is 1.
+
+ *sub-menu-priority*
+The same mechanism can be used to position a sub-menu. The priority is then
+given as a dot-separated list of priorities, before the menu name: >
+ :menu 80.500 Buffer.next :bn<CR>
+Giving the sub-menu priority is only needed when the item is not to be put
+in a normal position. For example, to put a sub-menu before the other items: >
+ :menu 80.100 Buffer.first :brew<CR>
+Or to put a sub-menu after the other items, and further items with default
+priority will be put before it: >
+ :menu 80.900 Buffer.last :blast<CR>
+When a number is missing, the default value 500 will be used: >
+ :menu .900 myMenu.test :echo "text"<CR>
+The menu priority is only used when creating a new menu. When it already
+existed, e.g., in another mode, the priority will not change. Thus, the
+priority only needs to be given the first time a menu is used.
+An exception is the PopUp menu. There is a separate menu for each mode
+(Normal, Op-pending, Visual, Insert, Cmdline). The order in each of these
+menus can be different. This is different from menu-bar menus, which have
+the same order for all modes.
+NOTE: sub-menu priorities currently don't work for all versions of the GUI.
+
+ *menu-separator* *E332*
+Menu items can be separated by a special item that inserts some space between
+items. Depending on the system this is displayed as a line or a dotted line.
+These items must start with a '-' and end in a '-'. The part in between is
+used to give it a unique name. Priorities can be used as with normal items.
+Example: >
+ :menu Example.item1 :do something
+ :menu Example.-Sep- :
+ :menu Example.item2 :do something different
+Note that the separator also requires a rhs. It doesn't matter what it is,
+because the item will never be selected. Use a single colon to keep it
+simple.
+
+ *gui-toolbar*
+The toolbar is currently available in the Win32, Motif, GTK+ (X11),
+and Photon GUI. It should turn up in other GUIs in due course. The
+default toolbar is setup in menu.vim.
+The display of the toolbar is controlled by the 'guioptions' letter 'T'. You
+can thus have menu & toolbar together, or either on its own, or neither.
+The appearance is controlled by the 'toolbar' option. You can choose between
+an image, text or both.
+
+ *toolbar-icon*
+The toolbar is defined as a special menu called ToolBar, which only has one
+level. Vim interprets the items in this menu as follows:
+1) If an "icon=" argument was specified, the file with this name is used.
+ The file can either be specified with the full path or with the base name.
+ In the last case it is searched for in the "bitmaps" directory in
+ 'runtimepath', like in point 3. Examples: >
+ :amenu icon=/usr/local/pixmaps/foo_icon.xpm ToolBar.Foo :echo "Foo"<CR>
+ :amenu icon=FooIcon ToolBar.Foo :echo "Foo"<CR>
+< Note that in the first case the extension is included, while in the second
+ case it is omitted.
+ If the file cannot be opened the next points are tried.
+ A space in the file name must be escaped with a backslash.
+ A menu priority must come _after_ the icon argument: >
+ :amenu icon=foo 1.42 ToolBar.Foo :echo "42!"<CR>
+2) An item called 'BuiltIn##', where ## is a number, is taken as number ## of
+ the built-in bitmaps available in Vim. Currently there are 31 numbered
+ from 0 to 30 which cover most common editing operations |builtin-tools|. >
+ :amenu ToolBar.BuiltIn22 :call SearchNext("back")<CR>
+3) An item with another name is first searched for in the directory
+ "bitmaps" in 'runtimepath'. If found, the bitmap file is used as the
+ toolbar button image. Note that the exact filename is OS-specific: For
+ example, under Win32 the command >
+ :amenu ToolBar.Hello :echo "hello"<CR>
+< would find the file 'hello.bmp'. Under GTK+/X11 it is 'Hello.xpm'. With
+ GTK+ 2 the files 'Hello.png', 'Hello.xpm' and 'Hello.bmp' are checked for
+ existence, and the first one found would be used.
+ For MS-Windows and GTK+ 2 the bitmap is scaled to fit the button. For
+ MS-Windows a size of 18 by 18 pixels works best.
+ For MS-Windows the bitmap should have 16 colors with the standard palette.
+ The light grey pixels will be changed to the Window frame color and the
+ dark grey pixels to the window shadow color. More colors might also work,
+ depending on your system.
+4) If the bitmap is still not found, Vim checks for a match against its list
+ of built-in names. Each built-in button image has a name.
+ So the command >
+ :amenu ToolBar.Open :e
+< will show the built-in "open a file" button image if no open.bmp exists.
+ All the built-in names can be seen used in menu.vim.
+5) If all else fails, a blank, but functioning, button is displayed.
+
+ *builtin-tools*
+nr Name Normal action ~
+00 New open new window
+01 Open browse for file to open in current window
+02 Save write buffer to file
+03 Undo undo last change
+04 Redo redo last undone change
+05 Cut delete selected text to clipboard
+06 Copy copy selected text to clipboard
+07 Paste paste text from clipboard
+08 Print print current buffer
+09 Help open a buffer on Vim's builtin help
+10 Find start a search command
+11 SaveAll write all modified buffers to file
+12 SaveSesn write session file for current situation
+13 NewSesn write new session file
+14 LoadSesn load session file
+15 RunScript browse for file to run as a Vim script
+16 Replace prompt for substitute command
+17 WinClose close current window
+18 WinMax make current window use many lines
+19 WinMin make current window use few lines
+20 WinSplit split current window
+21 Shell start a shell
+22 FindPrev search again, backward
+23 FindNext search again, forward
+24 FindHelp prompt for word to search help for
+25 Make run make and jump to first error
+26 TagJump jump to tag under the cursor
+27 RunCtags build tags for files in current directory
+28 WinVSplit split current window vertically
+29 WinMaxWidth make current window use many columns
+30 WinMinWidth make current window use few columns
+
+ *hidden-menus* *win32-hidden-menus*
+In the Win32 and GTK+ GUI, starting a menu name with ']' excludes that menu
+from the main menu bar. You must then use the |:popup| or |:tearoff| command
+to display it.
+
+ *window-toolbar* *WinBar*
+Each window can have a local toolbar. This uses the first line of the window,
+thus reduces the space for the text by one line. The items in the toolbar
+must start with "WinBar".
+
+Only text can be used. When using Unicode, special characters can be used to
+make the items look like icons.
+
+If the items do not fit then the last ones cannot be used. The toolbar does
+not wrap.
+
+Note that Vim may be in any mode when executing these commands. The menu
+should be defined for Normal mode and will be executed without changing the
+current mode. Thus if the current window is in Visual mode and the menu
+command does not intentionally change the mode, Vim will remain in Visual
+mode. Best is to use `:nnoremenu` to avoid side effects.
+
+Example for debugger tools: >
+ nnoremenu 1.10 WinBar.Step :Step<CR>
+ nnoremenu 1.20 WinBar.Next :Next<CR>
+ nnoremenu 1.30 WinBar.Finish :Finish<CR>
+ nnoremenu 1.40 WinBar.Cont :Continue<CR>
+< *hl-ToolbarLine* *hl-ToolbarButton*
+The window toolbar uses the ToolbarLine and ToolbarButton highlight groups.
+
+When splitting the window the window toolbar is not copied to the new window.
+
+ *popup-menu*
+In the Win32, GTK+, Motif and Photon GUI, 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.
+Example: >
+ nnoremenu 1.40 PopUp.&Paste "+gP
+ menu PopUp
+
+
+5.3 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
+specified is a submenu, then all menus under that hierarchy will be shown.
+If no argument is given after :menu at all, then ALL menu items are shown
+for the appropriate mode (e.g., Command-line mode for :cmenu).
+
+Special characters in the list, just before the rhs:
+* The menu was defined with "nore" to disallow remapping.
+& The menu was defined with "<script>" to allow remapping script-local
+ mappings only.
+s The menu was defined with "<silent>" to avoid showing what it is
+ mapped to when triggered.
+- The menu was disabled.
+
+Note that hitting <Tab> while entering a menu name after a menu command may
+be used to complete the name of the menu item.
+
+It is not allowed to change menus while listing them. *E1310*
+This doesn't normally happen, only when, for example, you would have a timer
+callback define a menu and the user lists menus in a way it shows
+|more-prompt|.
+
+
+5.4 Executing Menus *execute-menus*
+
+ *:em* *:emenu* *E334* *E335*
+:[range]em[enu] {menu} Execute {menu} from the command line.
+ The default is to execute the Normal mode
+ menu. If a range is specified, it executes
+ the Visual mode menu.
+ If used from <c-o>, it executes the
+ insert-mode menu Eg: >
+ :emenu File.Exit
+
+:[range]em[enu] {mode} {menu} Like above, but execute the menu for {mode}:
+ 'n': |:nmenu| Normal mode
+ 'v': |:vmenu| Visual mode
+ 's': |:smenu| Select mode
+ 'o': |:omenu| Operator-pending mode
+ 't': |:tlmenu| Terminal mode
+ 'i': |:imenu| Insert mode
+ 'c': |:cmenu| Cmdline mode
+
+
+If the console-mode vim has been compiled with WANT_MENU defined, you can
+use :emenu to access useful menu items you may have got used to from GUI
+mode. See 'wildmenu' for an option that works well with this. See
+|console-menus| for an example.
+
+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*
+
+ *:unme* *:unmenu*
+ *:aun* *:aunmenu*
+To delete a menu item or a whole submenu, use the unmenu commands, which are
+analogous to the unmap commands. Eg: >
+ :unmenu! Edit.Paste
+
+This will remove the Paste item from the Edit menu for Insert and
+Command-line modes.
+
+Note that hitting <Tab> while entering a menu name after an umenu command
+may be used to complete the name of the menu item for the appropriate mode.
+
+To remove all menus use: *:unmenu-all* >
+ :unmenu * " remove all menus in Normal and visual mode
+ :unmenu! * " remove all menus in Insert and Command-line mode
+ :aunmenu * " remove all menus in all modes, except for Terminal
+ " mode
+ :tlunmenu * " remove all menus in Terminal mode
+
+If you want to get rid of the menu bar: >
+ :set guioptions-=m
+
+
+5.6 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
+done by adding the "enable" or "disable" keyword to a ":menu" command.
+Examples: >
+ :menu disable &File.&Open\.\.\.
+ :amenu enable *
+ :amenu disable &Tools.*
+
+The command applies to the modes as used with all menu commands. Note that
+characters like "&" need to be included for translated names to be found.
+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*
+
+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. >
+
+ :nmenu Words.Add\ Var wb"zye:menu! Words.<C-R>z <C-R>z<CR>
+ :nmenu Words.Remove\ Var wb"zye:unmenu! Words.<C-R>z<CR>
+ :vmenu Words.Add\ Var "zy:menu! Words.<C-R>z <C-R>z <CR>
+ :vmenu Words.Remove\ Var "zy:unmenu! Words.<C-R>z<CR>
+ :imenu Words.Add\ Var <Esc>wb"zye:menu! Words.<C-R>z <C-R>z<CR>a
+ :imenu Words.Remove\ Var <Esc>wb"zye:unmenu! Words.<C-R>z<CR>a
+
+(the rhs is in <> notation, you can copy/paste this text to try out the
+mappings, or put these lines in your gvimrc; "<C-R>" is CTRL-R, "<CR>" is
+the <CR> key. |<>|)
+
+ *tooltips* *menu-tips*
+5.8 Tooltips & Menu tips
+
+See section |42.4| in the user manual.
+
+ *:tmenu* *:tm*
+: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*
+:tu[nmenu] {menupath} Remove a tip for a menu or tool.
+ {only in X11 and Win32 GUI}
+
+Note: To create menus for terminal mode, use |:tlmenu| instead.
+
+When a tip is defined for a menu item, it appears in the command-line area
+when the mouse is over that item, much like a standard Windows menu hint in
+the status bar. (Except when Vim is in Command-line mode, when of course
+nothing is displayed.)
+When a tip is defined for a ToolBar item, it appears as a tooltip when the
+mouse pauses over that button, in the usual fashion. Use the |hl-Tooltip|
+highlight group to change its colors.
+
+A "tip" can be defined for each menu item. For example, when defining a menu
+item like this: >
+ :amenu MyMenu.Hello :echo "Hello"<CR>
+The tip is defined like this: >
+ :tmenu MyMenu.Hello Displays a greeting.
+And delete it with: >
+ :tunmenu MyMenu.Hello
+
+Tooltips are currently only supported for the X11 and Win32 GUI. However, they
+should appear for the other gui platforms in the not too distant future.
+
+The ":tmenu" command works just like other menu commands, it uses the same
+arguments. ":tunmenu" deletes an existing menu tip, in the same way as the
+other unmenu commands.
+
+If a menu item becomes invalid (i.e. its actions in all modes are deleted) Vim
+deletes the menu tip (and the item) for you. This means that :aunmenu deletes
+a menu item - you don't need to do a :tunmenu as well.
+
+
+5.9 Popup Menus
+
+In the Win32 and GTK+ GUI, you can cause a menu to popup at the cursor.
+This behaves similarly to the PopUp menus except that any menu tree can
+be popped up.
+
+This command is for backwards compatibility, using it is discouraged, because
+it behaves in a strange way.
+
+ *:popup* *:popu*
+:popu[p] {name} Popup the menu {name}. The menu named must
+ have at least one subentry, but need not
+ appear on the menu-bar (see |hidden-menus|).
+ {only available for Win32 and GTK GUI or in
+ the terminal}
+
+:popu[p]! {name} Like above, but use the position of the mouse
+ pointer instead of the cursor.
+ In the terminal this is the last known
+ position, which is usually at the last click
+ or release (mouse movement is irrelevant).
+
+Example: >
+ :popup File
+will make the "File" menu (if there is one) appear at the text cursor (mouse
+pointer if ! was used). >
+
+ :amenu ]Toolbar.Make :make<CR>
+ :popup ]Toolbar
+This creates a popup menu that doesn't exist on the main menu-bar.
+
+Note that in the GUI the :popup command will return immediately, before a
+selection has been made. In the terminal the commands waits for the user to
+make a selection.
+
+Note that a menu that starts with ']' will not be displayed.
+
+==============================================================================
+6. Font
+
+This section describes font related options.
+
+GUIFONT *gui-font*
+
+'guifont' is the option that tells Vim what font to use. In its simplest form
+the value is just one font name. It can also be a list of font names
+separated with commas. The first valid font is used. When no valid font can
+be found you will get an error message.
+
+On systems where 'guifontset' is supported (X11) and 'guifontset' is not
+empty, then 'guifont' is not used. See |xfontset|.
+
+Note: As to the GTK GUIs, no error is given against any invalid names, and the
+first element of the list is always picked up and made use of. This is
+because, instead of identifying a given name with a font, the GTK GUIs use it
+to construct a pattern and try to look up a font which best matches the
+pattern among available fonts, and this way, the matching never fails. An
+invalid name doesn't matter because a number of font properties other than
+name will do to get the matching done.
+
+Spaces after a comma are ignored. To include a comma in a font name precede
+it with a backslash. Setting an option requires an extra backslash before a
+space and a backslash. See also |option-backslash|. For example: >
+ :set guifont=Screen15,\ 7x13,font\\,with\\,commas
+will make Vim try to use the font "Screen15" first, and if it fails it will
+try to use "7x13" and then "font,with,commas" instead.
+
+If none of the fonts can be loaded, Vim will keep the current setting. If an
+empty font list is given, Vim will try using other resource settings (for X,
+it will use the Vim.font resource), and finally it will try some builtin
+default which should always be there ("7x13" in the case of X). The font
+names given should be "normal" fonts. Vim will try to find the related bold
+and italic fonts.
+
+For Win32, GTK, Motif, Mac OS and Photon: >
+ :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.
+
+For the GTK+ 2 and 3 GUIs, the font name looks like this: >
+ :set guifont=Andale\ Mono\ 11
+That's all. XLFDs are not used. For Chinese this is reported to work well: >
+ if has("gui_gtk2")
+ set guifont=Bitstream\ Vera\ Sans\ Mono\ 12,Fixed\ 12
+ set guifontwide=Microsoft\ Yahei\ 12,WenQuanYi\ Zen\ Hei\ 12
+ endif
+<
+(Replace gui_gtk2 with gui_gtk3 for the GTK+ 3 GUI)
+
+For Mac OSX you can use something like this: >
+ :set guifont=Monaco:h10
+
+Mono-spaced fonts *E236*
+
+Note that the fonts must be mono-spaced (all characters have the same width).
+An exception is GTK: all fonts are accepted, but mono-spaced fonts look best.
+
+To preview a font on X11, you might be able to use the "xfontsel" program.
+The "xlsfonts" program gives a list of all available fonts.
+
+For the Win32 GUI *E244* *E245*
+- Takes these options in the font name (use a ':' to separate the options):
+ hXX - height is XX (points, can be floating-point)
+ wXX - width is XX (points, can be floating-point)
+ WXX - weight is XX (see Note on Weights below)
+ b - bold. This is equivalent to setting the weight to 700.
+ i - italic
+ u - underline
+ s - strikeout
+ cXX - character set XX. Valid charsets are: ANSI, ARABIC, BALTIC,
+ CHINESEBIG5, DEFAULT, EASTEUROPE, GB2312, GREEK, HANGEUL,
+ HEBREW, JOHAB, MAC, OEM, RUSSIAN, SHIFTJIS, SYMBOL, THAI,
+ TURKISH and VIETNAMESE. Normally you would use "cDEFAULT".
+ qXX - quality XX. Valid quality names are: PROOF, DRAFT, ANTIALIASED,
+ NONANTIALIASED, CLEARTYPE and DEFAULT. Normally you would use
+ "qDEFAULT".
+ Some quality values are not supported in legacy OSs.
+- A '_' can be used in the place of a space, so you don't need to use
+ backslashes to escape the spaces.
+Examples: >
+ :set guifont=courier_new:h12:w5:b:cRUSSIAN
+ :set guifont=Andale_Mono:h7.5:w4.5
+
+See also |font-sizes|.
+
+Note on Weights: Fonts often come with a variety of weights. "Normal" weights
+in Windows have a value of 400 and, left unspecified, this is the value that
+will be used when attempting to find fonts. Windows will often match fonts
+based on their weight with higher priority than the font name which means a
+Book or Medium variant of a font might be used despite specifying a Light or
+ExtraLight variant. If you are experiencing heavier weight substitution, then
+explicitly setting a lower weight value may mitigate against this unwanted
+substitution.
+
+
+GUIFONTWIDE *gui-fontwide*
+
+When not empty, 'guifontwide' 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. If there is a mismatch then the
+text will not be drawn correctly.
+
+All GUI versions but GTK+:
+
+'guifontwide' is only used when 'encoding' is set to "utf-8" and '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.
+
+GTK+ GUI only: *guifontwide_gtk*
+
+If set and valid, 'guifontwide' is always used for double width characters,
+even if 'encoding' is not set to "utf-8".
+Vim does not attempt to find an appropriate value for 'guifontwide'
+automatically. If 'guifontwide' is empty Pango/Xft will choose the font for
+characters not available in 'guifont'. Thus you do not need to set
+'guifontwide' at all unless you want to override the choice made by Pango/Xft.
+
+Windows +multibyte only: *guifontwide_win_mbyte*
+
+If set and valid, 'guifontwide' is used for IME instead of 'guifont'.
+
+==============================================================================
+7. 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
+
+==============================================================================
+8. Shell Commands *gui-shell*
+
+For the X11 GUI the external commands are executed inside the gvim window.
+See |gui-pty|.
+
+WARNING: Executing an external command from the X11 GUI will not always work.
+"normal" commands like "ls", "grep" and "make" mostly work fine.
+Commands that require an intelligent terminal like "less" and "ispell" won't
+work. Some may even hang and need to be killed from another terminal. So be
+careful!
+
+For the Win32 GUI the external commands are executed in a separate window.
+See |gui-shell-win32|.
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/gui_w32.txt b/runtime/doc/gui_w32.txt
new file mode 100644
index 0000000..d8ce03e
--- /dev/null
+++ b/runtime/doc/gui_w32.txt
@@ -0,0 +1,457 @@
+*gui_w32.txt* For Vim version 9.0. Last change: 2022 Mar 09
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Vim's Win32 Graphical User Interface *gui-w32* *win32-gui*
+
+1. Starting the GUI |gui-w32-start|
+2. Vim as default editor |vim-default-editor|
+3. Using the clipboard |gui-clipboard|
+4. Shell Commands |gui-shell-win32|
+5. Special colors |win32-colors|
+6. Windows dialogs & browsers |gui-w32-dialogs|
+7. Command line arguments |gui-w32-cmdargs|
+8. Various |gui-w32-various|
+
+Other relevant documentation:
+|gui.txt| For generic items of the GUI.
+|os_win32.txt| For Win32 specific items.
+
+
+==============================================================================
+1. Starting the GUI *gui-w32-start*
+
+The Win32 GUI version of Vim will always start the GUI, no matter how you
+start it or what it's called.
+
+The GUI will always run in the Windows subsystem. Mostly shells automatically
+return with a command prompt after starting gvim. If not, you should use the
+"start" command: >
+ start gvim [options] file ..
+< *E988*
+The console version with the |-g| option may also start the GUI by executing
+gvim.exe: >
+ vim -g [options] file ..
+To make this work, gvim.exe must exist in the same directory as the vim.exe,
+and this feature must be enabled at compile time.
+
+One may also use `:gui` from the console version. However, this is an
+experimental feature and this feature must be enabled at compile time.
+It uses a session file to recreate the current state of the console Vim in the
+GUI Vim.
+
+Note: All fonts (bold, italic) must be of the same size!!! If you don't do
+this, text will disappear or mess up the display. Vim does not check the font
+sizes. It's the size in screen pixels that must be the same. Note that some
+fonts that have the same point size don't have the same pixel size!
+Additionally, the positioning of the fonts must be the same (ascent and
+descent).
+
+The Win32 GUI has an extra menu item: "Edit/Select Font". It brings up the
+standard Windows font selector.
+
+Setting the menu height doesn't work for the Win32 GUI.
+
+ *gui-win32-maximized*
+If you want Vim to start with a maximized window, add this command to your
+vimrc or gvimrc file: >
+ au GUIEnter * simalt ~x
+<
+
+Using Vim as a plugin *gui-w32-windowid*
+
+When gvim starts up normally, it creates its own top level window. If you
+pass Vim the command-line option |--windowid| with a decimal or hexadecimal
+value, Vim will create a window that is a child of the window with the given
+ID. This enables Vim to act as a plugin in another application. This really
+is a programmer's interface, and is of no use without a supporting application
+to spawn Vim correctly.
+
+==============================================================================
+2. Vim as default editor *vim-default-editor*
+
+To set Vim as the default editor for a file type:
+1. Start a Windows Explorer
+2. Choose View/Options -> File Types
+3. Select the path to gvim for every file type that you want to use it for.
+ (you can also use three spaces in the file type field, for files without an
+ extension).
+ In the "open" action, use: >
+ gvim "%1"
+< The quotes are required for using file names with embedded spaces.
+ You can also use this: >
+ gvim "%L"
+< This should avoid short (8.3 character) file names in some situations. But
+ I'm not sure if this works everywhere.
+
+When you open a file in Vim by double clicking it, Vim changes to that
+file's directory.
+
+If you want Vim to start full-screen, use this for the Open action: >
+ gvim -c "simalt ~x" "%1"
+
+Another method, which also works when you put Vim in another directory (e.g.,
+when you have got a new version):
+1. select a file you want to use Vim with
+2. <Shift-F10>
+3. select "Open With..." menu entry
+4. click "Other..."
+5. browse to the (new) location of Vim and click "Open"
+6. make "Always Use this program..." checked
+7. <OK>
+
+ *send-to-menu* *sendto*
+You can also install Vim in the "Send To" menu:
+1. Start a Windows Explorer
+2. Navigate to your sendto directory:
+ C:\Users\%user%\AppData\Roaming\Microsoft\Windows\SendTo .
+3. Right-click in the file pane and select New->Shortcut
+4. Follow the shortcut wizard, using the full path to VIM/GVIM.
+
+When you 'send a file to Vim', Vim changes to that file's directory. Note,
+however, that any long directory names will appear in their short (MS-DOS)
+form on some Windows versions. This is a limitation of the Windows "Send To"
+mechanism.
+
+ *notepad*
+You could replace notepad.exe with gvim.exe, but that has a few side effects.
+Some programs rely on notepad arguments, which are not recognized by Vim. For
+example "notepad -p" is used by some applications to print a file. It's
+better to leave notepad where it is and use another way to start Vim.
+
+ *win32-popup-menu*
+A more drastic approach is to install an "Edit with Vim" entry in the popup
+menu for the right mouse button. With this you can edit any file with Vim.
+
+This can co-exist with the file associations mentioned above. The difference
+is that the file associations will make starting Vim the default action. With
+the "Edit with Vim" menu entry you can keep the existing file association for
+double clicking on the file, and edit the file with Vim when you want. For
+example, you can associate "*.mak" with your make program. You can execute
+the makefile by double clicking it and use the "Edit with Vim" entry to edit
+the makefile.
+
+You can select any files and right-click to see a menu option called "Edit
+with gvim". Choosing this menu option will invoke gvim with the file you have
+selected. If you select multiple files, you will find two gvim-related menu
+options:
+"Edit with multiple gvims" -- one gvim for each file in the selection
+"Edit with single gvim" -- one gvim for all the files in the selection
+And if there already is a gvim running:
+"Edit with existing gvim" -- edit the file with the running gvim
+
+The "edit with existing Vim" entries can be disabled by adding an entry in the
+registry under HKLM\Software\Vim\Gvim, named DisableEditWithExisting, and with
+any value.
+ *install-registry*
+You can add the "Edit with Vim" menu entry in an easy way by using the
+"install.exe" program. It will add several registry entries for you.
+
+You can also do this by hand. This is complicated! Use the install.exe if
+you can.
+
+1. Start the registry editor with "regedit".
+2. Add these keys:
+ key value name value ~
+ HKEY_CLASSES_ROOT\CLSID\{51EEE242-AD87-11d3-9C1E-0090278BBD99}
+ {default} Vim Shell Extension
+ HKEY_CLASSES_ROOT\CLSID\{51EEE242-AD87-11d3-9C1E-0090278BBD99}\InProcServer32
+ {default} {path}\gvimext.dll
+ ThreadingModel Apartment
+ HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\gvim
+ {default} {51EEE242-AD87-11d3-9C1E-0090278BBD99}
+ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved
+ {51EEE242-AD87-11d3-9C1E-0090278BBD99}
+ Vim Shell Extension
+ HKEY_LOCAL_MACHINE\Software\Vim\Gvim
+ path {path}\gvim.exe
+ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall\vim 8.2
+ DisplayName Vim 8.2: Edit with Vim popup menu entry
+ UninstallString {path}\uninstall.exe
+
+ Replace {path} with the path that leads to the executable.
+ Don't type {default}, this is the value for the key itself.
+
+To remove "Edit with Vim" from the popup menu, just remove the registry
+entries mentioned above. The "uninstall.exe" program can do this for you.
+You can also use the entry in the Windows standard "Add/Remove Programs" list.
+
+If you notice that this entry overrules other file type associations, set
+those associations again by hand (using Windows Explorer, see above). This
+only seems to happen on some Windows NT versions (Windows bug?). Procedure:
+1. Find the name of the file type. This can be done by starting the registry
+ editor, and searching for the extension in \\HKEY_CLASSES_ROOT
+2. In a Windows Explorer, use View/Options/File Types. Search for the file
+ type in the list and click "Edit". In the actions list, you can select on
+ to be used as the default (normally the "open" action) and click on the
+ "Set Default" button.
+
+
+Vim in the "Open With..." context menu *win32-open-with-menu*
+
+If you use the Vim install program you have the choice to add Vim to the "Open
+With..." menu. This means you can use Vim to edit many files. Not every file
+(for unclear reasons...), thus the "Edit with Vim" menu entry is still useful.
+
+One reason to add this is to be able to edit HTML files directly from Internet
+Explorer. To enable this use the "Tools" menu, "Internet Options..." entry.
+In the dialog select the "Programs" tab and select Vim in the "HTML editor"
+choice. If it's not there then installing didn't work properly.
+
+Doing this manually can be done with this script:
+
+----------------------------------------------------------
+REGEDIT4
+
+[HKEY_CLASSES_ROOT\Applications\gvim.exe]
+
+[HKEY_CLASSES_ROOT\Applications\gvim.exe\shell]
+
+[HKEY_CLASSES_ROOT\Applications\gvim.exe\shell\edit]
+
+[HKEY_CLASSES_ROOT\Applications\gvim.exe\shell\edit\command]
+@="c:\\vim\\vim82\\gvim.exe \"%1\""
+
+[HKEY_CLASSES_ROOT\.htm\OpenWithList\gvim.exe]
+
+[HKEY_CLASSES_ROOT\*\OpenWithList\gvim.exe]
+
+----------------------------------------------------------
+
+Change the "c:\\vim\\vim82" bit to where gvim.exe is actually located.
+
+To uninstall this run the Vim uninstall program or manually delete the
+registry entries with "regedit".
+
+==============================================================================
+3. Using the clipboard *gui-clipboard*
+
+Windows has a clipboard, where you can copy text to, and paste text from. Vim
+supports this in several ways. For other systems see |gui-selections|.
+
+The "* register reflects the contents of the clipboard. |quotestar|
+
+When the "unnamed" string is included in the 'clipboard' option, the unnamed
+register is the same. Thus you can yank to and paste from the clipboard
+without prepending "* to commands. If this doesn't work use the "unnamedplus"
+string in the 'clipboard' option.
+
+The 'a' flag in 'guioptions' is not included by default. This means that text
+is only put on the clipboard when an operation is performed on it. Just
+Visually selecting text doesn't put it on the clipboard. When the 'a' flag is
+included, the text is copied to the clipboard even when it is not operated
+upon.
+
+ *mswin.vim*
+To use the standard MS-Windows way of CTRL-X, CTRL-C and CTRL-V, use the
+$VIMRUNTIME/mswin.vim script. You could add this line to your _vimrc file: >
+ source $VIMRUNTIME/mswin.vim
+
+Since CTRL-C is used to copy the text to the clipboard, it can't be used to
+cancel an operation. Use CTRL-Break for that.
+
+CTRL-Z is used for undo. This means you can't suspend Vim with this key, use
+|:suspend| instead (if it's supported at all).
+
+ *CTRL-V-alternative* *CTRL-Q*
+Since CTRL-V is used to paste, you can't use it to start a blockwise Visual
+selection. You can use CTRL-Q instead. You can also use CTRL-Q in Insert
+mode and Command-line mode to get the old meaning of CTRL-V. But CTRL-Q
+doesn't work for terminals when it's used for control flow.
+
+NOTE: The clipboard support still has a number of bugs. See |todo|.
+
+==============================================================================
+4. Shell Commands *gui-shell-win32*
+
+Vim uses another window for external commands, to make it possible to run any
+command. The external command gets its own environment for running, just like
+it was started from a DOS prompt.
+
+ *win32-vimrun*
+Executing an external command is done indirectly by the "vimrun" command. The
+"vimrun.exe" must be in the path for this to work. Or it must be in the same
+directory as the Vim executable. If "vimrun" cannot be found, the command is
+executed directly, but then the DOS window closes immediately after the
+external command has finished.
+WARNING: If you close this window with the "X" button, and confirm the
+question if you really want to kill the application, Vim may be killed too!
+(This does not apply to commands run asynchronously with ":!start".)
+
+The window in which the commands are executed will be the default you have set
+up for "Console" in Control Panel.
+
+ *win32-!start*
+Normally, Vim waits for a command to complete before continuing (this makes
+sense for most shell commands which produce output for Vim to use). If you
+want Vim to start a program and return immediately, you can use the following
+syntax: >
+ :!start [/min] {command}
+The optional "/min" causes the window to be minimized.
+
+==============================================================================
+5. Special colors *win32-colors*
+
+On Win32, the normal DOS colors can be used. See |dos-colors|.
+
+Additionally the system configured colors can also be used. These are known
+by the names Sys_XXX, where XXX is the appropriate system color name, from the
+following list (see the Win32 documentation for full descriptions). Case is
+ignored.
+
+Sys_3DDKShadow Sys_3DFace Sys_BTNFace
+Sys_3DHilight Sys_3DHighlight Sys_BTNHilight
+Sys_BTNHighlight Sys_3DLight Sys_3DShadow
+Sys_BTNShadow Sys_ActiveBorder Sys_ActiveCaption
+Sys_AppWorkspace Sys_Background Sys_Desktop
+Sys_BTNText Sys_CaptionText Sys_GrayText
+Sys_Highlight Sys_HighlightText Sys_InactiveBorder
+Sys_InactiveCaption Sys_InactiveCaptionText Sys_InfoBK
+Sys_InfoText Sys_Menu Sys_MenuText
+Sys_ScrollBar Sys_Window Sys_WindowFrame
+Sys_WindowText
+
+Probably the most useful values are
+ Sys_Window Normal window background
+ Sys_WindowText Normal window text
+ Sys_Highlight Highlighted background
+ Sys_HighlightText Highlighted text
+
+These extra colors are also available:
+Gray, Grey, LightYellow, SeaGreen, Orange, Purple, SlateBlue, Violet,
+
+ *rgb.txt*
+Additionally, colors defined by a default color list can be used. For more
+info see |:colorscheme|. These colors used to be defined in
+$VIMRUNTIME/rgb.txt, now they are in |v:colornames| which is initialized from
+$VIMRUNTIME/colors/lists/default.vim.
+
+==============================================================================
+ *gui-w32-dialogs* *dialog*
+6. Windows dialogs & browsers
+
+The Win32 GUI can use familiar Windows components for some operations, as well
+as the traditional interface shared with the console version.
+
+
+6.1 Dialogs
+
+The dialogs displayed by the "confirm" family (i.e. the 'confirm' option,
+|:confirm| command and |confirm()| function) are GUI-based rather than the
+console-based ones used by other versions. The 'c' flag in 'guioptions'
+changes this.
+
+
+6.2 File Browsers
+
+When prepending ":browse" before file editing commands, a file requester is
+used to allow you to select an existing file. See |:browse|.
+
+
+6.3 Tearoff Menus
+
+The Win32 GUI emulates Motif's tear-off menus. At the top of each menu you
+will see a small graphic "rip here" sign. Selecting it will cause a floating
+window to be created with the same menu entries on it. The floating menu can
+then be accessed just as if it was the original (including sub-menus), but
+without having to go to the menu bar each time.
+This is most useful if you find yourself using a command buried in a sub-menu
+over and over again.
+The tearoff menus can be positioned where you like, and always stay just above
+the Main Vim window. You can get rid of them by closing them as usual; they
+also of course close when you exit Vim.
+
+ *:tearoff* *:te*
+:te[aroff] {name} Tear-off the menu {name}. The menu named must have at
+ least one subentry, but need not appear on the
+ menu-bar (see |win32-hidden-menus|).
+
+Example: >
+ :tearoff File
+will make the "File" menu (if there is one) appear as a tearoff menu. >
+
+ :amenu ]Toolbar.Make :make<CR>
+ :tearoff ]Toolbar
+This creates a floating menu that doesn't exist on the main menu-bar.
+
+Note that a menu that starts with ']' will not be displayed.
+
+==============================================================================
+7. Command line arguments *gui-w32-cmdargs*
+
+Command line arguments behave the same way as with the console application,
+see |win32-cmdargs|.
+
+==============================================================================
+8. Various *gui-w32-various*
+
+ *gui-w32-printing*
+The "File/Print" menu prints the text with syntax highlighting, see
+|:hardcopy|. If you just want to print the raw text and have a default
+printer installed this should also work: >
+ :w >>prn
+
+Vim supports a number of standard MS-Windows features. Some of these are
+detailed elsewhere: see |'mouse'|, |win32-hidden-menus|.
+
+ *drag-n-drop-win32*
+You can drag and drop one or more files into the Vim window, where they will
+be opened as normal. See |drag-n-drop|.
+
+ *:simalt* *:sim*
+:sim[alt] {key} simulate pressing {key} while holding Alt pressed.
+ {only for Win32 versions}
+ Note: ":si" means ":s" with the "i" flag.
+
+Normally, Vim takes control of all Alt-<Key> combinations, to increase the
+number of possible mappings. This clashes with the standard use of Alt as the
+key for accessing menus.
+The quick way of getting standard behavior is to set the 'winaltkeys' option
+to "yes". This however prevents you from mapping Alt keys at all.
+Another way is to set 'winaltkeys' to "menu". Menu shortcut keys are then
+handled by windows, other ALT keys can be mapped. This doesn't allow a
+dependency on the current state though.
+To get round this, the :simalt command allows Vim (when 'winaltkeys' is not
+"yes") to fake a Windows-style Alt keypress. You can use this to map Alt key
+combinations (or anything else for that matter) to produce standard Windows
+actions. Here are some examples: >
+
+ :map <M-f> :simalt f<CR>
+This makes Alt-F pop down the 'File' menu (with the stock Menu.vim) by
+simulating the keystrokes Alt, F. >
+ :map <M-Space> :simalt ~<CR>
+This maps Alt-Space to pop down the system menu for the Vim window. Note that
+~ is used by simalt to represent the <Space> character. >
+ :map <C-n> :simalt ~n<CR>
+Maps Control-N to produce the keys Alt-Space followed by N. This minimizes the
+Vim window via the system menu.
+
+Note that the key changes depending on the language you are using.
+
+ *intellimouse-wheel-problems*
+When using the Intellimouse mouse wheel causes Vim to stop accepting input, go
+to:
+ ControlPanel - Mouse - Wheel - UniversalScrolling - Exceptions
+
+And add gvim to the list of applications. This problem only appears to happen
+with the Intellimouse driver 2.2 and when "Universal Scrolling" is turned on.
+
+
+XPM support *w32-xpm-support*
+
+GVim can be built on MS-Windows with support for XPM files. |+xpm_w32|
+See the Make_mvc.mak file for instructions, search for XPM.
+
+To try out if XPM support works do this: >
+ :help
+ :let runtime = escape($VIMRUNTIME, ' \')
+ :exe 'sign define vimxpm icon=' .. runtime .. '\\vim16x16.xpm'
+ :exe 'sign place 1 line=1 name=vimxpm file=' .. expand('%:p')
+<
+You may need to get the vim16x16.xpm file from github:
+https://github.com/vim/vim/blob/master/runtime/vim16x16.xpm
+
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/gui_x11.txt b/runtime/doc/gui_x11.txt
new file mode 100644
index 0000000..14ed9f5
--- /dev/null
+++ b/runtime/doc/gui_x11.txt
@@ -0,0 +1,731 @@
+*gui_x11.txt* For Vim version 9.0. Last change: 2022 Apr 03
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Vim's Graphical User Interface *gui-x11* *GUI-X11*
+ *Motif*
+1. Starting the X11 GUI |gui-x11-start|
+2. GUI Resources |gui-resources|
+3. Shell Commands |gui-pty|
+4. Various |gui-x11-various|
+5. GTK version |gui-gtk|
+6. GNOME version |gui-gnome|
+7. KDE version |gui-kde|
+8. Compiling |gui-x11-compiling|
+9. X11 selection mechanism |x11-selection|
+
+Other relevant documentation:
+|gui.txt| For generic items of the GUI.
+
+
+==============================================================================
+1. Starting the X11 GUI *gui-x11-start* *E665*
+
+Then you can run the GUI version of Vim in either of these ways:
+ gvim [options] [files...]
+ vim -g [options] [files...]
+
+So if you call the executable "gvim", or make "gvim" a link to the executable,
+then the GUI version will automatically be used. Additional characters may be
+added after "gvim", for example "gvim-5".
+
+You may also start up the GUI from within the terminal version by using one of
+these commands:
+ :gui [++opt] [+cmd] [-f|-b] [files...] *:gu* *:gui*
+ :gvim [++opt] [+cmd] [-f|-b] [files...] *:gv* *:gvim*
+The "-f" option runs Vim in the foreground.
+The "-b" option runs Vim in the background (this is the default).
+Also see |++opt| and |+cmd|.
+
+ *gui-fork*
+When the GUI is started, it does a fork() and exits the current process.
+When gvim was started from a shell this makes the shell accept further
+commands. If you don't want this (e.g. when using gvim for a mail program
+that waits for gvim to exit), start gvim with "gvim -f", "vim -gf" or use
+":gui -f". Don't use "vim -fg", because "-fg" specifies the foreground
+color.
+
+When using "vim -f" and then ":gui", Vim will run in the foreground. The
+"-f" argument will be remembered. To force running Vim in the background use
+":gui -b".
+
+"gvim --nofork" does the same as "gvim -f".
+
+When there are running jobs Vim will not fork, because the processes would no
+longer be child processes.
+ *E851* *E852*
+When starting the GUI fails Vim will try to continue running in the terminal.
+
+If you want the GUI to run in the foreground always, include the 'f'
+flag in 'guioptions'. |-f|.
+
+==============================================================================
+2. GUI Resources *gui-resources* *.Xdefaults*
+
+If using the Motif version of the GUI (not for the KDE, GTK+ or Win32
+version), a number of X resources are available. You should use Vim's class
+"Vim" when setting these. They are as follows:
+
+ Resource name Meaning ~
+
+ reverseVideo Boolean: should reverse video be used?
+ background Color of background.
+ foreground Color of normal text.
+ scrollBackground Color of trough portion of scrollbars.
+ scrollForeground Color of slider and arrow portions of scrollbars.
+ menuBackground Color of menu backgrounds.
+ menuForeground Color of menu foregrounds.
+ tooltipForeground Color of tooltip and balloon foreground.
+ tooltipBackground Color of tooltip and balloon background.
+
+ font Name of font used for normal text.
+ boldFont Name of font used for bold text.
+ italicFont Name of font used for italic text.
+ boldItalicFont Name of font used for bold, italic text.
+ menuFont Name of font used for the menus, used when compiled
+ without the |+xfontset| feature
+ menuFontSet Name of fontset used for the menus, used when compiled
+ with the |+xfontset| feature
+ tooltipFont Name of the font used for the tooltip and balloons.
+ When compiled with the |+xfontset| feature this is a
+ fontset name.
+
+ geometry Initial geometry to use for gvim's window (default
+ is same size as terminal that started it).
+ scrollbarWidth Thickness of scrollbars.
+ borderWidth Thickness of border around text area.
+
+A special font for italic, bold, and italic-bold text will only be used if
+the user has specified one via a resource. No attempt is made to guess what
+fonts should be used for these based on the normal text font.
+
+Note that the colors can also be set with the ":highlight" command, using the
+"Normal", "Menu", "Tooltip", and "Scrollbar" groups. Example: >
+ :highlight Menu guibg=lightblue
+ :highlight Tooltip guibg=yellow
+ :highlight Scrollbar guibg=lightblue guifg=blue
+ :highlight Normal guibg=grey90
+<
+ *font-sizes*
+Note: All fonts (except for the menu and tooltip) must be of the same size!!!
+If you don't do this, text will disappear or mess up the display. Vim does
+not check the font sizes. It's the size in screen pixels that must be the
+same. Note that some fonts that have the same point size don't have the same
+pixel size! Additionally, the positioning of the fonts must be the same
+(ascent and descent). You can check this with "xlsfonts -l {fontname}".
+
+If any of these things are also set with Vim commands, e.g. with
+":set guifont=Screen15", then this will override the X resources (currently
+'guifont' is the only option that is supported).
+
+Here is an example of what you might put in your ~/.Xdefaults file: >
+
+ Vim*useSchemes: all
+ Vim*sgiMode: true
+ Vim*useEnhancedFSB: true
+ Vim.foreground: Black
+ Vim.background: Wheat
+ Vim*fontList: 7x13
+
+The first three of these are standard resources on Silicon Graphics machines
+which make Motif applications look even better, highly recommended!
+
+The "Vim*fontList" is to set the menu font for Motif. Example: >
+ Vim*menuBar*fontList: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-*
+
+NOTE: A more portable, and indeed more correct, way to specify the menu font
+in Motif is through the resource: >
+ Vim.menuFont: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-*
+Or, when compiled with the |+xfontset| feature: >
+ Vim.menuFontSet: -*-courier-medium-r-*-*-10-*-*-*-*-*-*-*
+
+Don't use "Vim*geometry" in the defaults. This will break the menus. Use
+"Vim.geometry" instead.
+
+If you get an error message "Cannot allocate colormap entry for "gray60",
+try adding this to your Vim resources (change the colors to your liking): >
+
+ Vim*scrollBackground: Black
+ Vim*scrollForeground: Blue
+
+The resources can also be set with arguments to Vim:
+
+ argument meaning ~
+ *-gui*
+ -display {display} Run vim on {display} *-display*
+ -iconic Start vim iconified *-iconic*
+ -background {color} Use {color} for the background *-background*
+ -bg {color} idem *-bg*
+ -foreground {color} Use {color} for normal text *-foreground*
+ -fg {color} idem *-fg*
+ -ul {color} idem *-ul*
+ -font {font} Use {font} for normal text *-font*
+ -fn {font} idem *-fn*
+ -boldfont {font} Use {font} for bold text *-boldfont*
+ -italicfont {font} Use {font} for italic text *-italicfont*
+ -menufont {font} Use {font} for menu items *-menufont*
+ -menufontset {fontset} Use {fontset} for menu items *-menufontset*
+ -mf {font} idem *-mf*
+ -geometry {geom} Use {geom} for initial geometry *-geometry*
+ -geom {geom} idem, see |-geometry-example| *-geom*
+ -borderwidth {width} Use a border width of {width} *-borderwidth*
+ -bw {width} idem *-bw*
+ *-scrollbarwidth*
+ -scrollbarwidth {width} Use a scrollbar width of {width}
+ -sw {width} idem *-sw*
+ -menuheight {height} Use a menu bar height of {height} *-menuheight*
+ -mh {height} idem *-mh*
+ NOTE: On Motif the value is ignored, the menu height
+ is computed to fit the menus.
+ -reverse Use reverse video *-reverse*
+ -rv idem *-rv*
+ +reverse Don't use reverse video *-+reverse*
+ +rv idem *-+rv*
+ -xrm {resource} Set the specified resource *-xrm*
+
+Note about reverse video: Vim checks that the result is actually a light text
+on a dark background. The reason is that some X11 versions swap the colors,
+and some don't. These two examples will both give yellow text on a blue
+background:
+ gvim -fg Yellow -bg Blue -reverse
+ gvim -bg Yellow -fg Blue -reverse
+
+ *-geometry-example*
+An example for the geometry argument: >
+ gvim -geometry 80x63+8+100
+This creates a window with 80 columns and 63 lines at position 8 pixels from
+the left and 100 pixels from the top of the screen.
+
+==============================================================================
+3. Shell Commands *gui-pty*
+
+WARNING: Executing an external command from the GUI will not always work.
+"normal" commands like "ls", "grep" and "make" mostly work fine. Commands
+that require an intelligent terminal like "less" and "ispell" won't work.
+Some may even hang and need to be killed from another terminal. So be
+careful!
+
+There are two ways to do the I/O with a shell command: Pipes and a pseudo-tty.
+The default is to use a pseudo-tty. This should work best on most systems.
+
+Unfortunately, the implementation of the pseudo-tty is different on every Unix
+system. And some systems require root permission. To avoid running into
+problems with a pseudo-tty when you least expect it, test it when not editing
+a file. Be prepared to "kill" the started command or Vim. Commands like
+":r !cat" may hang!
+
+If using a pseudo-tty does not work for you, reset the 'guipty' option: >
+
+ :set noguipty
+
+Using a pipe should work on any Unix system, but there are disadvantages:
+- Some shell commands will notice that a pipe is being used and behave
+ differently. E.g., ":!ls" will list the files in one column.
+- The ":sh" command won't show a prompt, although it will sort of work.
+- When using ":make" it's not possible to interrupt with a CTRL-C.
+
+Typeahead while the external command is running is often lost. This happens
+both with a pipe and a pseudo-tty. This is a known problem, but it seems it
+can't be fixed (or at least, it's very difficult).
+
+ *gui-pty-erase*
+When your erase character is wrong for an external command, you should fix
+this in your "~/.cshrc" file, or whatever file your shell uses for
+initializations. For example, when you want to use backspace to delete
+characters, but hitting backspaces produces "^H" instead, try adding this to
+your "~/.cshrc": >
+ stty erase ^H
+The ^H is a real CTRL-H, type it as CTRL-V CTRL-H.
+
+==============================================================================
+4. Various *gui-x11-various*
+
+ *gui-x11-printing*
+The "File/Print" menu simply sends the current buffer to "lpr". No options or
+whatever. If you want something else, you can define your own print command.
+For example: >
+
+ :10amenu File.Print :w !lpr -Php3
+ :10vmenu File.Print :w !lpr -Php3
+<
+ *X11-icon*
+Vim uses a black&white icon by default when compiled with Motif. A
+colored Vim icon is included as $VIMRUNTIME/vim32x32.xpm. For GTK+, this is
+the builtin icon used. Unfortunately, how you should install it depends on
+your window manager. When you use this, remove the 'i' flag from
+'guioptions', to remove the black&white icon: >
+ :set guioptions-=i
+
+If you use one of the fvwm* family of window managers simply add this line to
+your .fvwm2rc configuration file: >
+
+ Style "vim" Icon vim32x32.xpm
+
+Make sure the icon file's location is consistent with the window manager's
+ImagePath statement. Either modify the ImagePath from within your .fvwm2rc or
+drop the icon into one the pre-defined directories: >
+
+ ImagePath /usr/X11R6/include/X11/pixmaps:/usr/X11R6/include/X11/bitmaps
+
+Note: older versions of fvwm use "IconPath" instead of "ImagePath".
+
+For CDE "dtwm" (a derivative of Motif) add this line in the .Xdefaults: >
+ Dtwm*Vim*iconImage: /usr/local/share/vim/vim32x32.xpm
+
+For "mwm" (Motif window manager) the line would be: >
+ Mwm*Vim*iconImage: /usr/local/share/vim/vim32x32.xpm
+
+
+Mouse Pointers Available in X11 ~
+ *X11_mouse_shapes*
+By using the |'mouseshape'| option, the mouse pointer can be automatically
+changed whenever Vim enters one of its various modes (e.g., Insert or
+Command). Currently, the available pointers are:
+
+ arrow an arrow pointing northwest
+ beam a I-like vertical bar
+ size an arrow pointing up and down
+ busy a wristwatch
+ blank an invisible pointer
+ crosshair a thin "+" sign
+ hand1 a dark hand pointing northeast
+ hand2 a light hand pointing northwest
+ pencil a pencil pointing southeast
+ question question_arrow
+ right_arrow an arrow pointing northeast
+ up_arrow an arrow pointing upwards
+
+Additionally, any of the mouse pointers that are built into X11 may be
+used by specifying an integer from the X11/cursorfont.h include file.
+
+If a name is used that exists on other systems, but not in X11, the default
+"arrow" pointer is used.
+
+==============================================================================
+5. GTK version *gui-gtk* *GTK+* *GTK* *GTK3*
+
+The GTK version of the GUI works a little bit different.
+
+GTK does _not_ use the traditional X resource settings. Thus items in your
+~/.Xdefaults or app-defaults files are not used.
+Many of the traditional X command line arguments are not supported. (e.g.,
+stuff like -bg, -fg, etc). The ones that are supported are:
+
+ command line argument resource name meaning ~
+ -fn or -font .font font name for the text
+ -geom or -geometry .geometry size of the gvim window
+ -rv or -reverse *reverseVideo white text on black background
+ -display display to be used
+ -fg -foreground {color} foreground color
+ -bg -background {color} background color
+
+To set the font, see |'guifont'|. For GTK, there's also a menu option that
+does this.
+
+Additionally, there are these command line arguments, which are handled by GTK
+internally. Look in the GTK documentation for how they are used:
+ --sync
+ --gdk-debug
+ --gdk-no-debug
+ --no-xshm (not in GTK+ 2)
+ --xim-preedit (not in GTK+ 2)
+ --xim-status (not in GTK+ 2)
+ --gtk-debug
+ --gtk-no-debug
+ --g-fatal-warnings
+ --gtk-module
+ --display (GTK+ counterpart of -display; works the same way.)
+ --screen (The screen number; for GTK+ 2.2 multihead support.)
+
+These arguments are ignored when the |+netbeans_intg| feature is used:
+ -xrm
+ -mf
+
+As for colors, Vim's color settings (for syntax highlighting) is still
+done the traditional Vim way. See |:highlight| for more help.
+
+If you want to set the colors of remaining gui components (e.g., the
+menubar, scrollbar, whatever), those are GTK specific settings and you
+need to set those up in some sort of gtkrc file. You'll have to refer
+to the GTK documentation, however little there is, on how to do this.
+See http://developer.gnome.org/doc/API/2.0/gtk/gtk-Resource-Files.html
+for more information.
+ *gtk3-slow*
+If you are using GTK3 and Vim appears to be slow, try setting the environment
+variable $GDK_RENDERING to "image".
+
+
+Tooltip Colors ~
+ *gtk-tooltip-colors*
+Example, which sets the tooltip colors to black on light-yellow: >
+
+ style "tooltips"
+ {
+ bg[NORMAL] = "#ffffcc"
+ fg[NORMAL] = "#000000"
+ }
+
+ widget "gtk-tooltips*" style "tooltips"
+
+Write this in the file ~/.gtkrc and it will be used by GTK+. For GTK+ 2
+you might have to use the file ~/.gtkrc-2.0 instead, depending on your
+distribution.
+
+For GTK+ 3, an effect similar to the above can be obtained by adding the
+following snippet of CSS code to $XDG_HOME_DIR/gtk-3.0/gtk.css (see the next
+section):
+
+For GTK+ 3 < 3.20: >
+
+ .tooltip {
+ background-color: #ffffcc;
+ color: #000000;
+ }
+<
+For GTK+ 3 >= 3.20: >
+
+ tooltip {
+ background-color: #ffffcc;
+ text-shadow: none;
+ }
+
+ tooltip label {
+ color: #2e3436;
+ }
+<
+
+A Quick Look at GTK+ CSS ~
+ *gtk-css*
+The contents of this subsection apply to GTK+ 3.20 or later which provides
+stable support for GTK+ CSS:
+
+ https://developer.gnome.org/gtk3/stable/theming.html
+
+GTK+ uses CSS for styling and layout of widgets. In this subsection, we'll
+have a quick look at GTK+ CSS through simple, illustrative examples.
+
+You can usually edit the config with: >
+ vim $HOME/.config/gtk-3.0/gtk.css
+
+
+Example 1. Empty Space Adjustment ~
+
+By default, the toolbar and the tabline of the GTK+ 3 GUI are somewhat larger
+than those of the GTK+ 2 GUI. Some people may want to make them look similar
+to the GTK+ 2 GUI in size.
+
+To do that, we'll try reducing empty space around icons and labels that looks
+apparently superfluous.
+
+Add the following lines to $XDG_HOME_DIR/gtk-3.0/gtk.css (usually,
+$HOME/.config/gtk-3.0/gtk.css): >
+
+ toolbar button {
+ margin-top: -2px;
+ margin-right: 0px;
+ margin-bottom: -2px;
+ margin-left: 0px;
+
+ padding-top: 0px;
+ padding-right: 0px;
+ padding-bottom: 0px;
+ padding-left: 0px
+ }
+
+ notebook tab {
+ margin-top: -1px;
+ margin-right: 3px;
+ margin-bottom: -1px;
+ margin-left: 3px;
+
+ padding-top: 0px;
+ padding-right: 0px;
+ padding-bottom: 0px;
+ padding-left: 0px
+ }
+<
+Since it's a CSS, they can be rewritten using shorthand: >
+
+ toolbar button {
+ margin: -2px 0px;
+ padding: 0px;
+ }
+
+ notebook tab {
+ margin: -1px 3px;
+ padding: 0px
+ }
+<
+Note: You might want to use 'toolbariconsize' to adjust the icon size, too.
+
+Note: Depending on the icon theme and/or the font in use, some extra tweaks
+may be needed for a satisfactory result.
+
+Note: In addition to margin and padding, you can use border. For details,
+refer to the box model of CSS, e.g.,
+
+ https://www.w3schools.com/css/css_boxmodel.asp
+
+Example 2. More Than Just Colors ~
+
+GTK+ CSS supports gradients as well: >
+
+ tooltip {
+ background-image: -gtk-gradient(linear,
+ 0 0, 0 1,
+ color-stop(0, #344752),
+ color-stop(0.5, #546772),
+ color-stop(1, #243742));
+ }
+
+ tooltip label {
+ color: #f3f3f3;
+ }
+<
+Gradients can be used to make a GUI element visually distinguishable from
+others without relying on high contrast. Accordingly, effective use of them is
+a useful technique to give a theme a sense of unity in color and luminance.
+
+Note: Theming can be difficult since it must make every application look
+equally good; making a single application more charming often gets others
+unexpectedly less attractive or even deteriorates their usability. Keep this
+in mind always when you try improving a theme.
+
+
+Example 3. border color ~
+
+To eliminate borders when maximized: >
+
+ @define-color bg_color #1B2B34;
+ #vim-main-window {
+ background-color: @bg_color;
+ }
+
+
+Using Vim as a GTK+ plugin ~
+ *gui-gtk-socketid*
+When the GTK+ version of Vim starts up normally, it creates its own top level
+window (technically, a 'GtkWindow'). GTK+ provides an embedding facility with
+its GtkSocket and GtkPlug widgets. If one GTK+ application creates a
+GtkSocket widget in one of its windows, an entirely different GTK+ application
+may embed itself into the first application by creating a top-level GtkPlug
+widget using the socket's ID.
+
+If you pass Vim the command-line option '--socketid' with a decimal or
+hexadecimal value, Vim will create a GtkPlug widget using that value instead
+of the normal GtkWindow. This enables Vim to act as a GTK+ plugin.
+
+This really is a programmer's interface, and is of no use without a supporting
+application to spawn the Vim correctly. For more details on GTK+ sockets, see
+http://www.gtk.org/api/
+
+Note that this feature requires the latest GTK version. GTK 1.2.10 still has
+a small problem. The socket feature has not yet been tested with GTK+ 2 --
+feel free to volunteer.
+
+==============================================================================
+6. GNOME version *gui-gnome* *Gnome* *GNOME*
+
+The GNOME GUI works just like the GTK+ version. See |GTK+| above for how it
+works. It looks a bit different though, and implements one important feature
+that's not available in the plain GTK+ GUI: Interaction with the session
+manager. |gui-gnome-session|
+
+These are the different looks:
+- Uses GNOME dialogs (GNOME 1 only). The GNOME 2 GUI uses the same nice
+ dialogs as the GTK+ 2 version.
+- Uses the GNOME dock, so that the toolbar and menubar can be moved to
+ different locations other than the top (e.g., the toolbar can be placed on
+ the left, right, top, or bottom). The placement of the menubar and
+ toolbar is only saved in the GNOME 2 version.
+- That means the menubar and toolbar handles are back! Yeah! And the
+ resizing grid still works too.
+
+GNOME is compiled with if it was found by configure and the
+--enable-gnome-check argument was used.
+
+Note: Avoid use of --enable-gnome-check with GTK+ 3 GUI build. The
+functionality mentioned above is consolidated in GTK+ 3.
+
+
+GNOME session support ~
+ *gui-gnome-session* *gnome-session*
+On logout, Vim shows the well-known exit confirmation dialog if any buffers
+are modified. Clicking [Cancel] will stop the logout process. Otherwise the
+current session is stored to disk by using the |:mksession| command, and
+restored the next time you log in.
+
+The GNOME session support should also work with the KDE session manager.
+If you are experiencing any problems please report them as bugs.
+
+Note: The automatic session save works entirely transparent, in order to
+avoid conflicts with your own session files, scripts and autocommands. That
+means in detail:
+- The session file is stored to a separate directory (usually $HOME/.gnome2).
+- 'sessionoptions' is ignored, and a hardcoded set of appropriate flags is
+ used instead: >
+ blank,curdir,folds,globals,help,options,tabpages,winsize
+- The internal variable |v:this_session| is not changed when storing the
+ session. Also, it is restored to its old value when logging in again.
+
+The position and size of the GUI window is not saved by Vim since doing so
+is the window manager's job. But if compiled with GTK+ 2 support, Vim helps
+the WM to identify the window by restoring the window role (using the |--role|
+command line argument).
+
+==============================================================================
+7. KDE version *gui-kde* *kde* *KDE* *KVim*
+ *gui-x11-kde*
+There is no KDE version of Vim. There has been some work on a port using the
+Qt toolkit, but it never worked properly and it has been abandoned. Work
+continues on Yzis: https://github.com/chrizel/Yzis.
+
+==============================================================================
+8. Compiling *gui-x11-compiling*
+
+If using X11, Vim's configure will by default first try to find the necessary
+GTK+ files on your system. When both GTK+ 2 and GTK+ 3 are available, GTK+ 2
+will be chosen unless --enable-gui=gtk3 is passed explicitly to configure.
+
+If the GTK+ files cannot be found, then the Motif files will be searched for.
+If both fail, the GUI will be disabled.
+
+For GTK+, Vim's configuration process uses pkg-config(1) to check if the
+GTK+ required for a specified build is properly installed and usable.
+Accordingly, it is a good idea to make sure before running configure that
+your system has a working pkg-config together with the .pc file of the
+required GTK+. For that, say, run the following on the command line to see if
+your pkg-config works with your GTK+ 2: >
+
+ $ pkg-config --modversion gtk+-2.0
+
+Replace gtk+-2.0 with gtk+-3.0 for GTK+ 3. If you get the correct version
+number of your GTK+, you can proceed; if not, you probably need to do some
+system administration chores to set up pkg-config and GTK+ correctly.
+
+The GTK+ 2 GUI is built by default. Therefore, you usually don't need to pass
+any options such as --enable-gui=gtk2 to configure and build that.
+
+Optionally, the GTK+ 2 GUI can consolidate the GNOME 2 support. This support
+is enabled by passing --enable-gnome-check to configure.
+
+If you want to build the GTK+ 3 GUI, you have to pass --enable-gui=gtk3
+explicitly to configure, and avoid passing --enable-gnome-check to that, as
+the functionality of the GNOME 2 support has already been consolidated in
+GTK+ 3.
+
+Otherwise, if you are using Motif, when you have the Motif files in a
+directory where configure doesn't look, edit the Makefile to enter the names
+of the directories. Search for "GUI_INC_LOC" for an example to set
+the Motif directories.
+
+ *gui-x11-gtk*
+Currently, Vim supports both GTK+ 2 and GTK+ 3.
+
+The GTK+ 2 GUI requires GTK+ 2.2 or later.
+
+Although the GTK+ 3 GUI is written in such a way that the source code can be
+compiled against all versions of the 3.x series, we recommend GTK+ 3.10 or
+later because of its substantial implementation changes in redraw done at
+that version.
+
+ *gui-x11-motif*
+For Motif, you need at least Motif version 1.2 and/or X11R5. Motif 2.0 and
+X11R6 are OK. Motif 1.1 and X11R4 might work, no guarantee (there may be a
+few problems, but you might make it compile and run with a bit of work, please
+send me the patches if you do). The newest releases of LessTif have been
+reported to work fine too.
+
+ *gui-x11-athena* *gui-x11-neXtaw*
+Support for the Athena GUI and neXtaw was removed in patch 8.2.4677.
+
+ *gui-x11-misc*
+In general, do not try to mix files from different GTK+, Motif and X11
+versions. This will cause problems. For example, using header files for
+X11R5 with a library for X11R6 probably doesn't work (although the linking
+won't give an error message, Vim will crash later).
+
+==============================================================================
+9. X11 selection mechanism *x11-selection*
+
+If using X11, in either the GUI or an xterm with an X11-aware Vim, then Vim
+provides varied access to the X11 selection and clipboard. These are accessed
+by using the two selection registers "* and "+.
+
+X11 provides two basic types of global store, selections and cut-buffers,
+which differ in one important aspect: selections are "owned" by an
+application, and disappear when that application (e.g., Vim) exits, thus
+losing the data, whereas cut-buffers, are stored within the X-server itself
+and remain until written over or the X-server exits (e.g., upon logging out).
+
+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).
+
+The contents of cut-buffers are immediately written to, and are then
+accessible directly from the X-server, without contacting the originating
+application.
+
+ *quoteplus* *quote+*
+There are three documented X selections: PRIMARY (which is expected to
+represent the current visual selection - as in Vim's Visual mode), SECONDARY
+(which is ill-defined) and CLIPBOARD (which is expected to be used for
+cut, copy and paste operations).
+
+Of these three, Vim uses PRIMARY when reading and writing the "* register
+(hence when the X11 selections are available, Vim sets a default value for
+|'clipboard'| of "autoselect"), and CLIPBOARD when reading and writing the "+
+register. Vim does not access the SECONDARY selection.
+
+This applies both to the GUI and the terminal version. For non-X11 systems
+the plus and the star register both use the system clipboard.
+
+Examples: (assuming the default option values)
+- Select a URL in Visual mode in Vim. Go to your browser and click the
+ middle mouse button in the URL text field. The selected text will be
+ inserted (hopefully!). Note: in Firefox you can set the
+ middlemouse.contentLoadURL preference to true in about:config, then the
+ selected URL will be used when pressing middle mouse button in most places
+ in the window.
+- Select some text in your browser by dragging with the mouse. Go to Vim and
+ press the middle mouse button: The selected text is inserted.
+- Select some text in Vim and do "+y. Go to your browser, select some text in
+ a textfield by dragging with the mouse. Now use the right mouse button and
+ select "Paste" from the popup menu. The selected text is overwritten by the
+ text from Vim.
+Note that the text in the "+ register remains available when making a Visual
+selection, which makes other text available in the "* register. That allows
+overwriting selected text.
+ *x11-cut-buffer*
+There are, by default, 8 cut-buffers: CUT_BUFFER0 to CUT_BUFFER7. Vim only
+uses CUT_BUFFER0, which is the one that xterm uses by default.
+
+Whenever Vim is about to become unavailable (either via exiting or becoming
+suspended), and thus unable to respond to another application's selection
+request, it writes the contents of any owned selection to CUT_BUFFER0. If the
+"+ CLIPBOARD selection is owned by Vim, then this is written in preference,
+otherwise if the "* PRIMARY selection is owned by Vim, then that is written.
+
+Similarly, when Vim tries to paste from "* or "+ (either explicitly, or, in
+the case of the "* register, when the middle mouse button is clicked), if the
+requested X selection is empty or unavailable, Vim reverts to reading the
+current value of the CUT_BUFFER0.
+
+Note that when text is copied to CUT_BUFFER0 in this way, the type of
+selection (character, line or block) is always lost, even if it is a Vim which
+later pastes it.
+
+Xterm, by default, always writes visible selections to both PRIMARY and
+CUT_BUFFER0. When it pastes, it uses PRIMARY if this is available, or else
+falls back upon CUT_BUFFER0. For this reason, when cutting and pasting
+between Vim and an xterm, you should use the "* register. Xterm doesn't use
+CLIPBOARD, thus the "+ doesn't work with xterm.
+
+Most newer applications will provide their current selection via PRIMARY ("*)
+and use CLIPBOARD ("+) for cut/copy/paste operations. You thus have access to
+both by choosing to use either of the "* or "+ registers.
+
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/hangulin.txt b/runtime/doc/hangulin.txt
new file mode 100644
index 0000000..76db5b2
--- /dev/null
+++ b/runtime/doc/hangulin.txt
@@ -0,0 +1,17 @@
+*hangulin.txt* For Vim version 9.0. Last change: 2019 Nov 21
+
+
+ VIM REFERENCE MANUAL by Chi-Deok Hwang and Sung-Hyun Nam
+
+ *hangul*
+Vim had built-in support for hangul, the Korean language, for users without
+XIM (X Input Method). Since it didn't work well and was not maintained it was
+removed in Vim 8.1.2327.
+
+If you want this hangul input method you can go back to Vim 8.1.2326 or
+earlier. If you think this code is still useful and want to maintain it, make
+a patch to add it back. However, making it work with UTF-8 encoding would be
+best.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/hebrew.txt b/runtime/doc/hebrew.txt
new file mode 100644
index 0000000..2644f81
--- /dev/null
+++ b/runtime/doc/hebrew.txt
@@ -0,0 +1,139 @@
+*hebrew.txt* For Vim version 9.0. Last change: 2019 May 05
+
+
+ VIM REFERENCE MANUAL by Ron Aaron (and Avner Lottem)
+
+
+Hebrew Language support (options & mapping) for Vim *hebrew*
+
+The supporting 'rightleft' functionality was originally created by Avner
+Lottem. <alottem at gmail dot com> Ron Aaron <ron at ronware dot org> is
+currently helping support these features.
+
+{only available when the |+rightleft| feature was enabled at compile time}
+
+
+Introduction
+------------
+Hebrew-specific options are 'hkmap', 'hkmapp' 'keymap'=hebrew and 'aleph'.
+Hebrew-useful options are 'delcombine', 'allowrevins', 'revins', 'rightleft'
+and 'rightleftcmd'.
+
+The 'rightleft' mode reverses the display order, so characters are displayed
+from right to left instead of the usual left to right. This is useful
+primarily when editing Hebrew or other Middle-Eastern languages.
+See |rileft.txt| for further details.
+
+Details
+--------------
++ Options:
+ + 'rightleft' ('rl') sets window orientation to right-to-left. This means
+ that the logical text 'ABC' will be displayed as 'CBA', and will start
+ drawing at the right edge of the window, not the left edge.
+ + 'hkmap' ('hk') sets keyboard mapping to Hebrew, in insert/replace modes.
+ + 'aleph' ('al'), numeric, holds the decimal code of Aleph, for keyboard
+ mapping.
+ + 'hkmapp' ('hkp') sets keyboard mapping to 'phonetic hebrew'
+
+ NOTE: these three ('hkmap', 'hkmapp' and 'aleph') are obsolete. You should
+ use ":set keymap=hebrewp" instead.
+
+ + 'delcombine' ('deco'), boolean, if editing UTF-8 encoded Hebrew, allows
+ one to remove the niqud or te`amim by pressing 'x' on a character (with
+ associated niqud).
+
+ + 'rightleftcmd' ('rlc') makes the command-prompt for searches show up on
+ the right side. It only takes effect if the window is 'rightleft'.
+
++ Encoding:
+ + Under Unix, ISO 8859-8 encoding (Hebrew letters codes: 224-250).
+ + Under MS DOS, PC encoding (Hebrew letters codes: 128-154).
+ These are defaults, that can be overridden using the 'aleph' option.
+ + You should prefer using UTF8, as it supports the combining-characters
+ ('deco' does nothing if UTF8 encoding is not active).
+
++ Vim arguments:
+ + 'vim -H file' starts editing a Hebrew file, i.e. 'rightleft' and 'hkmap'
+ are set.
+
++ Keyboard:
+ + The 'allowrevins' option enables the CTRL-_ command in Insert mode and
+ in Command-line mode.
+
+ + CTRL-_ in insert/replace modes toggles 'revins' and 'hkmap' as follows:
+
+ When in rightleft window, 'revins' and 'nohkmap' are toggled, since
+ English will likely be inserted in this case.
+
+ When in norightleft window, 'revins' 'hkmap' are toggled, since Hebrew
+ will likely be inserted in this case.
+
+ CTRL-_ moves the cursor to the end of the typed text.
+
+ + CTRL-_ in command mode only toggles keyboard mapping (see Bugs below).
+ This setting is independent of 'hkmap' option, which only applies to
+ insert/replace mode.
+
+ Note: On some keyboards, CTRL-_ is mapped to CTRL-?.
+
+ + Keyboard mapping while 'hkmap' is set (standard Israeli keyboard):
+
+ q w e r t y u i o p
+ / ' ק ר א ט ו ן ם פ
+
+ a s d f g h j k l ; '
+ ש ד ג כ ע י ח ל ך ף ,
+
+ z x c v b n m , . /
+ ז ס ב ה נ מ צ ת ץ .
+
+ This is also the keymap when 'keymap=hebrew' is set. The advantage of
+ 'keymap' is that it works properly when using UTF8, e.g. it inserts the
+ correct characters; 'hkmap' does not. The 'keymap' keyboard can also
+ insert niqud and te`amim. To see what those mappings are, look at the
+ keymap file 'hebrew.vim' etc.
+
+
+Typing backwards
+
+If the 'revins' (reverse insert) option is set, inserting happens backwards.
+This can be used to type Hebrew. When inserting characters the cursor is not
+moved and the text moves rightwards. A <BS> deletes the character under the
+cursor. CTRL-W and CTRL-U also work in the opposite direction. <BS>, CTRL-W
+and CTRL-U do not stop at the start of insert or end of line, no matter how
+the 'backspace' option is set.
+
+There is no reverse replace mode (yet).
+
+If the 'showmode' option is set, "-- REVERSE INSERT --" will be shown in the
+status line when reverse Insert mode is active.
+
+When the 'allowrevins' option is set, reverse Insert mode can be also entered
+via CTRL-_, which has some extra functionality: First, keyboard mapping is
+changed according to the window orientation -- if in a left-to-right window,
+'revins' is used to enter Hebrew text, so the keyboard changes to Hebrew
+('hkmap' is set); if in a right-to-left window, 'revins' is used to enter
+English text, so the keyboard changes to English ('hkmap' is reset). Second,
+when exiting 'revins' via CTRL-_, the cursor moves to the end of the typed
+text (if possible).
+
+
+Pasting when in a rightleft window
+----------------------------------
+When cutting text with the mouse and pasting it in a rightleft window
+the text will be reversed, because the characters come from the cut buffer
+from the left to the right, while inserted in the file from the right to
+the left. In order to avoid it, toggle 'revins' (by typing CTRL-? or CTRL-_)
+before pasting.
+
+
+Hebrew characters and the 'isprint' variable
+--------------------------------------------
+Sometimes Hebrew character codes are in the non-printable range defined by
+the 'isprint' variable. For example in the Linux console, the Hebrew font
+encoding starts from 128, while the default 'isprint' variable is @,161-255.
+The result is that all Hebrew characters are displayed as ~x. To solve this
+problem, set isprint=@,128-255.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/help.txt b/runtime/doc/help.txt
new file mode 100644
index 0000000..e4e25ab
--- /dev/null
+++ b/runtime/doc/help.txt
@@ -0,0 +1,253 @@
+*help.txt* For Vim version 9.0. Last change: 2022 Dec 03
+
+ VIM - main help file
+ k
+ Move around: Use the cursor keys, or "h" to go left, h l
+ "j" to go down, "k" to go up, "l" to go right. j
+Close this window: Use ":q<Enter>".
+ Get out of Vim: Use ":qa!<Enter>" (careful, all changes are lost!).
+
+Jump to a subject: Position the cursor on a tag (e.g. |bars|) and hit CTRL-].
+ With the mouse: ":set mouse=a" to enable the mouse (in xterm or GUI).
+ Double-click the left mouse button on a tag, e.g. |bars|.
+ Jump back: Type CTRL-O. Repeat to go further back.
+
+Get specific help: It is possible to go directly to whatever you want help
+ on, by giving an argument to the |:help| command.
+ Prepend something to specify the context: *help-context*
+
+ WHAT PREPEND EXAMPLE ~
+ Normal mode command :help x
+ Visual mode command v_ :help v_u
+ Insert mode command i_ :help i_<Esc>
+ Command-line command : :help :quit
+ Command-line editing c_ :help c_<Del>
+ Vim command argument - :help -r
+ Option ' :help 'textwidth'
+ Regular expression / :help /[
+ See |help-summary| for more contexts and an explanation.
+ See |notation| for an explanation of the help syntax.
+
+ Search for help: Type ":help word", then hit CTRL-D to see matching
+ help entries for "word".
+ Or use ":helpgrep word". |:helpgrep|
+
+ Getting started: Do the Vim tutor, a 30-minute interactive course for the
+ basic commands, see |vimtutor|.
+ Read the user manual from start to end: |usr_01.txt|
+
+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*
+BASIC:
+|quickref| Overview of the most common commands you will use
+|tutor| 30-minute interactive course for beginners
+|copying| About copyrights
+|iccf| Helping poor children in Uganda
+|sponsor| Sponsor Vim development, become a registered Vim user
+|www| Vim on the World Wide Web
+|bugs| Where to send bug reports
+
+USER MANUAL: These files explain how to accomplish an editing task.
+
+|usr_toc.txt| Table Of Contents
+
+Getting Started ~
+|usr_01.txt| About the manuals
+|usr_02.txt| The first steps in Vim
+|usr_03.txt| Moving around
+|usr_04.txt| Making small changes
+|usr_05.txt| Set your settings
+|usr_06.txt| Using syntax highlighting
+|usr_07.txt| Editing more than one file
+|usr_08.txt| Splitting windows
+|usr_09.txt| Using the GUI
+|usr_10.txt| Making big changes
+|usr_11.txt| Recovering from a crash
+|usr_12.txt| Clever tricks
+
+Editing Effectively ~
+|usr_20.txt| Typing command-line commands quickly
+|usr_21.txt| Go away and come back
+|usr_22.txt| Finding the file to edit
+|usr_23.txt| Editing other files
+|usr_24.txt| Inserting quickly
+|usr_25.txt| Editing formatted text
+|usr_26.txt| Repeating
+|usr_27.txt| Search commands and patterns
+|usr_28.txt| Folding
+|usr_29.txt| Moving through programs
+|usr_30.txt| Editing programs
+|usr_31.txt| Exploiting the GUI
+|usr_32.txt| The undo tree
+
+Tuning Vim ~
+|usr_40.txt| Make new commands
+|usr_41.txt| Write a Vim script
+|usr_42.txt| Add new menus
+|usr_43.txt| Using filetypes
+|usr_44.txt| Your own syntax highlighted
+|usr_45.txt| Select your language
+
+Writing Vim scripts ~
+|usr_50.txt| Advanced Vim script writing
+|usr_51.txt| Create a plugin
+|usr_52.txt| Write plugins using Vim9 script
+
+Making Vim Run ~
+|usr_90.txt| Installing Vim
+
+REFERENCE MANUAL: These files explain every detail of Vim. *reference_toc*
+
+General subjects ~
+|intro.txt| general introduction to Vim; notation used in help files
+|help.txt| overview and quick reference (this file)
+|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
+|todo.txt| known problems and desired extensions
+|develop.txt| development of Vim
+|debug.txt| debugging Vim itself
+|uganda.txt| Vim distribution conditions and what to do with your money
+
+Basic editing ~
+|starting.txt| starting Vim, Vim command arguments, initialisation
+|editing.txt| editing and writing files
+|motion.txt| commands for moving around
+|scroll.txt| scrolling the text in the window
+|insert.txt| Insert and Replace mode
+|change.txt| deleting and replacing text
+|undo.txt| Undo and Redo
+|repeat.txt| repeating commands, Vim scripts and debugging
+|visual.txt| using the Visual mode (selecting a text area)
+|various.txt| various remaining commands
+|recover.txt| recovering from a crash
+
+Advanced editing ~
+|cmdline.txt| Command-line editing
+|options.txt| description of all options
+|pattern.txt| regexp patterns and search commands
+|map.txt| key mapping and abbreviations
+|tagsrch.txt| tags and special searches
+|windows.txt| commands for using multiple windows and buffers
+|tabpage.txt| commands for using multiple tab pages
+|spell.txt| spell checking
+|diff.txt| working with two to eight versions of the same file
+|autocmd.txt| automatically executing commands on an event
+|eval.txt| expression evaluation, conditional commands
+|builtin.txt| builtin functions
+|userfunc.txt| defining user functions
+|channel.txt| Jobs, Channels, inter-process communication
+|fold.txt| hide (fold) ranges of lines
+
+Special issues ~
+|testing.txt| testing Vim and Vim scripts
+|print.txt| printing
+|remote.txt| using Vim as a server or client
+|term.txt| using different terminals and mice
+|terminal.txt| Terminal window support
+|popup.txt| popup window support
+|vim9.txt| using Vim9 script
+|vim9class.txt| using Vim9 script classes
+
+Programming language support ~
+|indent.txt| automatic indenting for C and other languages
+|syntax.txt| syntax highlighting
+|textprop.txt| Attaching properties to text for highlighting or other
+|filetype.txt| settings done specifically for a type of file
+|quickfix.txt| commands for a quick edit-compile-fix cycle
+|ft_ada.txt| Ada (the programming language) support
+|ft_context.txt| Filetype plugin for ConTeXt
+|ft_mp.txt| Filetype plugin for METAFONT and MetaPost
+|ft_ps1.txt| Filetype plugin for Windows PowerShell
+|ft_raku.txt| Filetype plugin for Raku
+|ft_rust.txt| Filetype plugin for Rust
+|ft_sql.txt| about the SQL filetype plugin
+
+Language support ~
+|digraph.txt| list of available digraphs
+|mbyte.txt| multibyte text support
+|mlang.txt| non-English language support
+|rileft.txt| right-to-left editing mode
+|arabic.txt| Arabic language support and editing
+|farsi.txt| Farsi (Persian) editing
+|hebrew.txt| Hebrew language support and editing
+|russian.txt| Russian language support and editing
+|hangulin.txt| Hangul (Korean) input mode
+
+GUI ~
+|gui.txt| Graphical User Interface (GUI)
+|gui_w32.txt| Win32 GUI
+|gui_x11.txt| X11 GUI
+
+Interfaces ~
+|if_cscop.txt| using Cscope with Vim
+|if_lua.txt| Lua interface
+|if_mzsch.txt| MzScheme interface
+|if_perl.txt| Perl interface
+|if_pyth.txt| Python interface
+|if_tcl.txt| Tcl interface
+|if_ole.txt| OLE automation interface for Win32
+|if_ruby.txt| Ruby interface
+|debugger.txt| Interface with a debugger
+|netbeans.txt| NetBeans External Editor interface
+|sign.txt| debugging signs
+
+Versions ~
+|vi_diff.txt| Main differences between Vim and Vi
+|version4.txt| Differences between Vim version 3.0 and 4.x
+|version5.txt| Differences between Vim version 4.6 and 5.x
+|version6.txt| Differences between Vim version 5.7 and 6.x
+|version7.txt| Differences between Vim version 6.4 and 7.x
+|version8.txt| Differences between Vim version 7.4 and 8.x
+|version9.txt| Differences between Vim version 8.2 and 9.0
+ *sys-file-list*
+Remarks about specific systems ~
+|os_390.txt| OS/390 Unix
+|os_amiga.txt| Amiga
+|os_beos.txt| BeOS and BeBox
+|os_dos.txt| MS-DOS and MS-Windows common items
+|os_haiku.txt| Haiku
+|os_mac.txt| Macintosh
+|os_mint.txt| Atari MiNT
+|os_msdos.txt| MS-DOS (plain DOS and DOS box under Windows)
+|os_os2.txt| OS/2
+|os_qnx.txt| QNX
+|os_risc.txt| RISC-OS
+|os_unix.txt| Unix
+|os_vms.txt| VMS
+|os_win32.txt| MS-Windows
+ *standard-plugin-list*
+Standard plugins ~
+|pi_getscript.txt| Downloading latest version of Vim scripts
+|pi_gzip.txt| Reading and writing compressed files
+|pi_logipat.txt| Logical operators on patterns
+|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*
+
+------------------------------------------------------------------------------
+*bars* Bars example
+
+Now that you've jumped here with CTRL-] or a double mouse click, you can use
+CTRL-T, CTRL-O, g<RightMouse>, or <C-RightMouse> to go back to where you were.
+
+Note that tags are within | characters, but when highlighting is enabled these
+characters are hidden. That makes it easier to read a command.
+
+Anyway, you can use CTRL-] on any word, also when it is not within |, and Vim
+will try to find help for it. Especially for options in single quotes, e.g.
+'compatible'.
+
+------------------------------------------------------------------------------
+ vim:tw=78:isk=!-~,^*,^\|,^\":ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/help.txt.info b/runtime/doc/help.txt.info
new file mode 100755
index 0000000..0f8df81
--- /dev/null
+++ b/runtime/doc/help.txt.info
Binary files differ
diff --git a/runtime/doc/helphelp.txt b/runtime/doc/helphelp.txt
new file mode 100644
index 0000000..2f1e3be
--- /dev/null
+++ b/runtime/doc/helphelp.txt
@@ -0,0 +1,410 @@
+*helphelp.txt* For Vim version 9.0. Last change: 2022 Jan 08
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Help on help files *helphelp*
+
+1. Help commands |online-help|
+2. Translated help files |help-translated|
+3. Writing help files |help-writing|
+
+==============================================================================
+1. Help commands *online-help*
+
+ *help* *<Help>* *:h* *:help* *<F1>* *i_<F1>* *i_<Help>*
+<Help> or
+:h[elp] Open a window and display the help file in read-only
+ mode. If there is a help window open already, use
+ that one. Otherwise, if the current window uses the
+ full width of the screen or is at least 80 characters
+ wide, the help window will appear just above the
+ current window. Otherwise the new window is put at
+ the very top.
+ The 'helplang' option is used to select a language, if
+ the main help file is available in several languages.
+
+ *{subject}* *E149* *E661*
+:h[elp] {subject} Like ":help", additionally jump to the tag {subject}.
+ 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
+ match is better than another one. These items are
+ considered in the computation:
+ - A match with same case is much better than a match
+ with different case.
+ - A match that starts after a non-alphanumeric
+ character is better than a match in the middle of a
+ word.
+ - A match at or near the beginning of the tag is
+ better than a match further on.
+ - The more alphanumeric characters match, the better.
+ - The shorter the length of the match, the better.
+
+ The 'helplang' option is used to select a language, if
+ the {subject} is available in several languages.
+ To find a tag in a specific language, append "@ab",
+ where "ab" is the two-letter language code. See
+ |help-translated|.
+
+ Note that the longer the {subject} you give, the less
+ matches will be found. You can get an idea how this
+ all works by using commandline completion (type CTRL-D
+ after ":help subject" |c_CTRL-D|).
+ If there are several matches, you can have them listed
+ by hitting CTRL-D. Example: >
+ :help cont<Ctrl-D>
+
+< Instead of typing ":help CTRL-V" to search for help
+ for CTRL-V you can type: >
+ :help ^V
+< This also works together with other characters, for
+ example to find help for CTRL-V in Insert mode: >
+ :help i^V
+<
+ 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
+ :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.
+
+ 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 |
+ :help k| only
+< Note that a space before the '|' is seen as part of
+ the ":help" argument.
+ You can also use <NL> or <CR> to separate the help
+ command from a following command. You need to type
+ CTRL-V first to insert the <NL> or <CR>. Example: >
+ :help so<C-V><CR>only
+
+:h[elp]! [subject] Like ":help", but in non-English help files prefer to
+ find a tag in a file with the same language as the
+ current file. See |help-translated|.
+
+ *:helpc* *:helpclose*
+:helpc[lose] Close one help window, if there is one.
+ Vim will try to restore the window layout (including
+ cursor position) to the same layout it was before
+ opening the help window initially. This might cause
+ triggering several autocommands.
+
+ *:helpg* *:helpgrep*
+:helpg[rep] {pattern}[@xx]
+ Search all help text files and make a list of lines
+ in which {pattern} matches. Jumps to the first match.
+ The optional [@xx] specifies that only matches in the
+ "xx" language are to be found.
+ You can navigate through the matches with the
+ |quickfix| commands, e.g., |:cnext| to jump to the
+ next one. Or use |:cwindow| to get the list of
+ matches in the quickfix window.
+ {pattern} is used as a Vim regexp |pattern|.
+ 'ignorecase' is not used, add "\c" to ignore case.
+ Example for case sensitive search: >
+ :helpgrep Uganda
+< Example for case ignoring search: >
+ :helpgrep uganda\c
+< Example for searching in French help: >
+ :helpgrep backspace@fr
+< The pattern does not support line breaks, it must
+ match within one line. You can use |:grep| instead,
+ but then you need to get the list of help files in a
+ complicated way.
+ Cannot be followed by another command, everything is
+ used as part of the pattern. But you can use
+ |:execute| when needed.
+ Compressed help files will not be searched (Fedora
+ compresses the help files).
+
+ *:lh* *:lhelpgrep*
+:lh[elpgrep] {pattern}[@xx]
+ Same as ":helpgrep", except the location list is used
+ instead of the quickfix list. If the help window is
+ 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
+ then.
+
+ *:exu* *:exusage*
+:exu[sage] Show help on Ex commands. Added to simulate the Nvi
+ command.
+
+ *:viu* *:viusage*
+:viu[sage] Show help on Normal mode commands. Added to simulate
+ the Nvi command.
+
+When no argument is given to |:help| the file given with the 'helpfile' option
+will be opened. Otherwise the specified tag is searched for in all "doc/tags"
+files in the directories specified in the 'runtimepath' option.
+
+If you would like to open the help in the current window, see this tip:
+|help-curwin|.
+
+The initial height of the help window can be set with the 'helpheight' option
+(default 20).
+ *help-buffer-options*
+When the help buffer is created, several local options are set to make sure
+the help text is displayed as it was intended:
+ 'iskeyword' nearly all ASCII chars except ' ', '*', '"' and '|'
+ 'foldmethod' "manual"
+ 'tabstop' 8
+ 'arabic' off
+ 'binary' off
+ 'buflisted' off
+ 'cursorbind' off
+ 'diff' off
+ 'foldenable' off
+ 'list' off
+ 'modifiable' off
+ 'number' off
+ 'relativenumber' off
+ 'rightleft' off
+ 'scrollbind' off
+ 'spell' off
+
+Jump to specific subjects by using tags. This can be done in two ways:
+- Use the "CTRL-]" command while standing on the name of a command or option.
+ This only works when the tag is a keyword. "<C-Leftmouse>" and
+ "g<LeftMouse>" work just like "CTRL-]".
+- use the ":ta {subject}" command. This also works with non-keyword
+ characters.
+
+Use CTRL-T or CTRL-O to jump back.
+Use ":q" to close the help window.
+
+If there are several matches for an item you are looking for, this is how you
+can jump to each one of them:
+1. Open a help window
+2. Use the ":tag" command with a slash prepended to the tag. E.g.: >
+ :tag /min
+3. Use ":tnext" to jump to the next matching tag.
+
+It is possible to add help files for plugins and other items. You don't need
+to change the distributed help files for that. See |add-local-help|.
+
+To write a local help file, see |write-local-help|.
+
+Note that the title lines from the local help files are automagically added to
+the "LOCAL ADDITIONS" section in the "help.txt" help file |local-additions|.
+This is done when viewing the file in Vim, the file itself is not changed. It
+is done by going through all help files and obtaining the first line of each
+file. The files in $VIMRUNTIME/doc are skipped.
+
+ *help-xterm-window*
+If you want to have the help in another xterm window, you could use this
+command: >
+ :!xterm -e vim +help &
+<
+
+ *:helpfind* *:helpf*
+:helpf[ind] Like |:help|, but use a dialog to enter the argument.
+ Only for backwards compatibility. It now executes the
+ ToolBar.FindHelp menu entry instead of using a builtin
+ dialog. {only when compiled with |+GUI_GTK|}
+
+ *:helpt* *:helptags*
+ *E150* *E151* *E152* *E153* *E154* *E670*
+:helpt[ags] [++t] {dir}
+ Generate the help tags file(s) for directory {dir}.
+ When {dir} is ALL then all "doc" directories in
+ 'runtimepath' will be used.
+
+ All "*.txt" and "*.??x" files in the directory and
+ sub-directories are scanned for a help tag definition
+ in between stars. The "*.??x" files are for
+ translated docs, they generate the "tags-??" file, see
+ |help-translated|. The generated tags files are
+ sorted.
+ When there are duplicates an error message is given.
+ An existing tags file is silently overwritten.
+
+ The optional "++t" argument forces adding the
+ "help-tags" tag. This is also done when the {dir} is
+ equal to $VIMRUNTIME/doc.
+
+ To rebuild the help tags in the runtime directory
+ (requires write permission there): >
+ :helptags $VIMRUNTIME/doc
+
+==============================================================================
+2. Translated help files *help-translated*
+
+It is possible to add translated help files, next to the original English help
+files. Vim will search for all help in "doc" directories in 'runtimepath'.
+This is only available when compiled with the |+multi_lang| feature.
+
+At this moment translations are available for:
+ Chinese - multiple authors
+ French - translated by David Blanchet
+ Italian - translated by Antonio Colombo
+ Japanese - multiple authors
+ Polish - translated by Mikolaj Machowski
+ Russian - translated by Vassily Ragosin
+See the Vim website to find them: http://www.vim.org/translations.php
+
+A set of translated help files consists of these files:
+
+ help.abx
+ howto.abx
+ ...
+ tags-ab
+
+"ab" is the two-letter language code. Thus for Italian the names are:
+
+ help.itx
+ howto.itx
+ ...
+ tags-it
+
+The 'helplang' option can be set to the preferred language(s). The default is
+set according to the environment. Vim will first try to find a matching tag
+in the preferred language(s). English is used when it cannot be found.
+
+To find a tag in a specific language, append "@ab" to a tag, where "ab" is the
+two-letter language code. Example: >
+ :he user-manual@it
+ :he user-manual@en
+The first one finds the Italian user manual, even when 'helplang' is empty.
+The second one finds the English user manual, even when 'helplang' is set to
+"it".
+
+When using command-line completion for the ":help" command, the "@en"
+extension is only shown when a tag exists for multiple languages. When the
+tag only exists for English "@en" is omitted. When the first candidate has an
+"@ab" extension and it matches the first language in 'helplang' "@ab" is also
+omitted.
+
+When using |CTRL-]| or ":help!" in a non-English help file Vim will try to
+find the tag in the same language. If not found then 'helplang' will be used
+to select a language.
+
+Help files must use latin1 or utf-8 encoding. Vim assumes the encoding is
+utf-8 when finding non-ASCII characters in the first line. Thus you must
+translate the header with "For Vim version".
+
+The same encoding must be used for the help files of one language in one
+directory. You can use a different encoding for different languages and use
+a different encoding for help files of the same language but in a different
+directory.
+
+Hints for translators:
+- Do not translate the tags. This makes it possible to use 'helplang' to
+ specify the preferred language. You may add new tags in your language.
+- When you do not translate a part of a file, add tags to the English version,
+ using the "tag@en" notation.
+- Make a package with all the files and the tags file available for download.
+ Users can drop it in one of the "doc" directories and start use it.
+ Report this to Bram, so that he can add a link on www.vim.org.
+- Use the |:helptags| command to generate the tags files. It will find all
+ languages in the specified directory.
+
+==============================================================================
+3. Writing help files *help-writing*
+
+For ease of use, a Vim help file for a plugin should follow the format of the
+standard Vim help files, except for the first line. If you are writing a new
+help file it's best to copy one of the existing files and use it as a
+template.
+
+The first line in a help file should have the following format:
+
+*plugin_name.txt* {short description of the plugin}
+
+The first field is a help tag where ":help plugin_name" will jump to. The
+remainder of the line, after a Tab, describes the plugin purpose in a short
+way. This will show up in the "LOCAL ADDITIONS" section of the main help
+file. Check there that it shows up properly: |local-additions|.
+
+If you want to add a version number or last modification date, put it in the
+second line, right aligned.
+
+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
+in such a modeline, that can have undesired consequences.
+
+
+TAGS
+
+To define a help tag, place the name between asterisks (*tag-name*). The
+tag-name should be different from all the Vim help tag names and ideally
+should begin with the name of the Vim plugin. The tag name is usually right
+aligned on a line.
+
+When referring to an existing help tag and to create a hot-link, place the
+name between two bars (|) eg. |help-writing|.
+
+When referring to a Vim command and to create a hot-link, place the
+name between two backticks, eg. inside `:filetype`. You will see this is
+highlighted as a command, like a code block (see below).
+
+When referring to a Vim option in the help file, place the option name between
+two single quotes, eg. 'statusline'
+
+
+HIGHLIGHTING
+
+To define a column heading, use a tilde character at the end of the line.
+This will highlight the column heading in a different color. E.g.
+
+Column heading~
+
+To separate sections in a help file, place a series of '=' characters in a
+line starting from the first column. The section separator line is highlighted
+differently.
+
+To quote a block of ex-commands verbatim, place a greater than (>) character
+at the end of the line before the block and a less than (<) character as the
+first non-blank on a line following the block. Any line starting in column 1
+also implicitly stops the block of ex-commands before it. E.g. >
+ function Example_Func()
+ echo "Example"
+ endfunction
+<
+
+The following are highlighted differently in a Vim help file:
+ - a special key name expressed either in <> notation as in <PageDown>, or
+ as a Ctrl character as in CTRL-X
+ - anything between {braces}, e.g. {lhs} and {rhs}
+
+The word "Note", "Notes" and similar automagically receive distinctive
+highlighting. So do these:
+ *Todo something to do
+ *Error something wrong
+
+You can find the details in $VIMRUNTIME/syntax/help.vim
+
+ *inclusion*
+Vim is for everybody, no matter race, gender or anything. Some people make a
+big deal about using "he" or "his" when referring to the user, thinking it
+means we assume the user is male. That is not the case, it's just a habit of
+writing help text, which quite often is many years old. Also, a lot of the
+text is written by contributors for whom English is not their first language.
+We do not make any assumptions about the gender of the user, no matter how the
+text is phrased. Some people have suggested using "they", but that is not
+regular English. We do not want to spend much time on this discussion. The
+goal is that the reader understands how Vim works, the exact wording is
+secondary.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/howto.txt b/runtime/doc/howto.txt
new file mode 100644
index 0000000..75169a9
--- /dev/null
+++ b/runtime/doc/howto.txt
@@ -0,0 +1,96 @@
+*howto.txt* For Vim version 9.0. 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:noet:ft=help:norl:
diff --git a/runtime/doc/if_cscop.txt b/runtime/doc/if_cscop.txt
new file mode 100644
index 0000000..8f98161
--- /dev/null
+++ b/runtime/doc/if_cscop.txt
@@ -0,0 +1,486 @@
+*if_cscop.txt* For Vim version 9.0. Last change: 2022 Jan 08
+
+
+ VIM REFERENCE MANUAL by Andy Kahn
+
+ *cscope* *Cscope*
+This document explains how to use Vim's cscope interface.
+
+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|.
+
+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.
+
+==============================================================================
+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.
+
+ Change a constant to a preprocessor symbol in selected lines of files.
+
+ It is designed to answer questions like:
+ Where is this symbol used?
+ Where is it defined?
+ Where did this variable get its value?
+ What is this global symbol's definition?
+ Where is this function in the source files?
+ What functions call this function?
+ What functions are called by this function?
+ Where does the message "out of space" come from?
+ 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.)
+
+
+==============================================================================
+2. Cscope related commands *cscope-commands*
+
+ *:cscope* *:cs* *:scs* *:scscope* *E259* *E262* *E560* *E561*
+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* *E622* *E623* *E625*
+ *E626* *E609*
+ add : Add a new cscope database/connection.
+
+ USAGE :cs add {file|dir} [pre-path] [flags]
+
+ [pre-path] is the pathname used with the -P command to cscope.
+
+ [flags] are any additional flags you want to pass to cscope.
+
+ EXAMPLES >
+ :cscope add /usr/local/cdb/cscope.out
+ :cscope add /projects/vim/cscope.out /usr/local/vim
+ :cscope add cscope.out /usr/local/vim -C
+<
+ *cscope-find* *cs-find* *E567*
+ find : Query cscope. All cscope query options are available
+ except option #5 ("Change this grep pattern").
+
+ USAGE :cs find {querytype} {name}
+
+ {querytype} corresponds to the actual cscope line
+ interface numbers as well as default nvi commands:
+
+ 0 or s: Find this C symbol
+ 1 or g: Find this definition
+ 2 or d: Find functions called by this function
+ 3 or c: Find functions calling this function
+ 4 or t: Find this text string
+ 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}
+ and {name}. Further white space is included in {name}.
+
+ EXAMPLES >
+ :cscope find c vim_free
+ :cscope find 3 vim_free
+<
+ These two examples perform the same query: functions calling
+ "vim_free". >
+
+ :cscope find t initOnce
+ :cscope find t initOnce
+<
+ The first one searches for the text "initOnce", the second one for
+ " initOnce". >
+
+ :cscope find 0 DEFAULT_TERM
+<
+ Executing this example on the source code for Vim 5.1 produces the
+ following output:
+
+ Cscope tag: DEFAULT_TERM
+ # line filename / context / line
+ 1 1009 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ #define DEFAULT_TERM (char_u *)"amiga"
+ 2 1013 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ #define DEFAULT_TERM (char_u *)"win32"
+ 3 1017 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ #define DEFAULT_TERM (char_u *)"pcterm"
+ 4 1021 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ #define DEFAULT_TERM (char_u *)"ansi"
+ 5 1025 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ #define DEFAULT_TERM (char_u *)"vt52"
+ 6 1029 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ #define DEFAULT_TERM (char_u *)"os2ansi"
+ 7 1033 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ #define DEFAULT_TERM (char_u *)"ansi"
+ 8 1037 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ # undef DEFAULT_TERM
+ 9 1038 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ #define DEFAULT_TERM (char_u *)"beos-ansi"
+ 10 1042 vim-5.1-gtk/src/term.c <<GLOBAL>>
+ #define DEFAULT_TERM (char_u *)"mac-ansi"
+ 11 1335 vim-5.1-gtk/src/term.c <<set_termname>>
+ term = DEFAULT_TERM;
+ 12 1459 vim-5.1-gtk/src/term.c <<set_termname>>
+ if (STRCMP(term, DEFAULT_TERM))
+ 13 1826 vim-5.1-gtk/src/term.c <<termcapinit>>
+ term = DEFAULT_TERM;
+ 14 1833 vim-5.1-gtk/src/term.c <<termcapinit>>
+ term = DEFAULT_TERM;
+ 15 3635 vim-5.1-gtk/src/term.c <<update_tcap>>
+ p = find_builtin_term(DEFAULT_TERM);
+ Enter nr of choice (<CR> to abort):
+
+ The output shows several pieces of information:
+ 1. The tag number (there are 15 in this example).
+ 2. The line number where the tag occurs.
+ 3. The filename where the tag occurs.
+ 4. The context of the tag (e.g., global, or the function name).
+ 5. The line from the file itself.
+
+ help : Show a brief synopsis.
+
+ USAGE :cs help
+
+ *E261*
+ kill : Kill a cscope connection (or kill all cscope connections).
+
+ USAGE :cs kill {num|partial_name}
+
+ To kill a cscope connection, the connection number or a partial
+ name must be specified. The partial name is simply any part of
+ the pathname of the cscope database. Kill a cscope connection
+ using the partial name with caution!
+
+ If the specified connection number is -1, then _ALL_ cscope
+ connections will be killed.
+
+ reset : Reinit all cscope connections.
+
+ USAGE :cs reset
+
+ show : Show cscope connections.
+
+ USAGE :cs show
+
+ *:lcscope* *:lcs*
+This command is same as the ":cscope" command, except when the
+'cscopequickfix' option is set, the location list for the current window is
+used instead of the quickfix list to show the cscope results.
+
+ *:cstag* *E257* *E562*
+If you use cscope as well as ctags, |:cstag| allows you to search one or
+the other before making a jump. For example, you can choose to first
+search your cscope database(s) for a match, and if one is not found, then
+your tags file(s) will be searched. The order in which this happens
+is determined by the value of |csto|. See |cscope-options| for more
+details.
+
+|:cstag| performs the equivalent of ":cs find g" on the identifier when
+searching through the cscope database(s).
+
+|:cstag| performs the equivalent of |:tjump| on the identifier when searching
+through your tags file(s).
+
+
+==============================================================================
+3. 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
+variables are only valid within |.vimrc|. Setting them after vim has
+started will have no effect!
+
+ *cscopeprg* *csprg*
+'cscopeprg' specifies the command to execute cscope. The default is
+"cscope". For example: >
+ :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, 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-,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
+<
+ *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
+<
+ *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 |.vimrc| 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.
+The value one will display only the filename with no path. Other values
+display that many components. For example: >
+ :set cspc=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*
+
+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.
+
+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:
+
+ :cs add cscope.out
+
+You can double-check the result of this by executing ":cs show". This will
+produce output which looks like this:
+
+ # 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:
+
+ :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.
+
+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
+the match you want to go to. After you have jumped to the new location,
+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
+
+The DJGPP-built version from http://cscope.sourceforge.net is known to not
+work with Vim.
+
+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*
+
+Put these entries in your .vimrc (adjust the pathname accordingly to your
+setup): >
+
+ 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
+ " else add database pointed to by environment
+ elseif $CSCOPE_DB != ""
+ cs add $CSCOPE_DB
+ endif
+ set csverb
+ endif
+
+By setting 'cscopetag', we have effectively replaced all instances of the :tag
+command with :cstag. This includes :tag, Ctrl-], and "vim -t". In doing
+this, the regular tag command not only searches your ctags generated tag
+files, but your cscope databases as well.
+
+Some users may want to keep the regular tag behavior and have a different
+shortcut to access :cstag. For example, one could map Ctrl-_ (underscore)
+to :cstag with the following command: >
+
+ map <C-_> :cstag <C-R>=expand("<cword>")<CR><CR>
+
+A couple of very commonly used cscope queries (using ":cs find") is to
+find all functions calling a certain function and to find all occurrences
+of a particular C symbol. To do this, you can use these mappings as an
+example: >
+
+ map g<C-]> :cs find 3 <C-R>=expand("<cword>")<CR><CR>
+ map g<C-\> :cs find 0 <C-R>=expand("<cword>")<CR><CR>
+
+These mappings for Ctrl-] (right bracket) and Ctrl-\ (backslash) allow you to
+place your cursor over the function name or C symbol and quickly query cscope
+for any matches.
+
+Or you may use the following scheme, inspired by Vim/Cscope tutorial from
+Cscope Home Page (http://cscope.sourceforge.net/): >
+
+ nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR>
+ 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
+ " the new window.
+
+ nmap <C-Space>s :scs find s <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space>g :scs find g <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space>c :scs find c <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space>t :scs find t <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space>e :scs find e <C-R>=expand("<cword>")<CR><CR>
+ 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
+
+ nmap <C-Space><C-Space>s
+ \:vert scs find s <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space><C-Space>g
+ \:vert scs find g <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space><C-Space>c
+ \:vert scs find c <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space><C-Space>t
+ \:vert scs find t <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space><C-Space>e
+ \:vert scs find e <C-R>=expand("<cword>")<CR><CR>
+ nmap <C-Space><C-Space>i
+ \: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.
+
+In Solaris 2.x, if you have the C compiler license, you will also have
+cscope. Both are usually located under /opt/SUNWspro/bin
+
+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.
+ *cscope-win32*
+For a cscope version for Win32 see (seems abandoned):
+ https://code.google.com/archive/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:noet:ft=help:norl:
diff --git a/runtime/doc/if_lua.txt b/runtime/doc/if_lua.txt
new file mode 100644
index 0000000..63ee91a
--- /dev/null
+++ b/runtime/doc/if_lua.txt
@@ -0,0 +1,550 @@
+*if_lua.txt* For Vim version 9.0. Last change: 2021 Aug 06
+
+
+ VIM REFERENCE MANUAL by Luis Carvalho
+
+
+The Lua Interface to Vim *lua* *Lua*
+
+1. Commands |lua-commands|
+2. The vim module |lua-vim|
+3. List userdata |lua-list|
+4. Dict userdata |lua-dict|
+5. Blob userdata |lua-blob|
+6. Funcref userdata |lua-funcref|
+7. Buffer userdata |lua-buffer|
+8. Window userdata |lua-window|
+9. luaeval() Vim function |lua-luaeval|
+10. Dynamic loading |lua-dynamic|
+
+{only available when Vim was compiled with the |+lua| feature}
+
+==============================================================================
+1. Commands *lua-commands*
+
+ *:lua*
+:[range]lua {chunk}
+ Execute Lua chunk {chunk}.
+
+Examples:
+>
+ :lua print("Hello, Vim!")
+ :lua local curbuf = vim.buffer() curbuf[7] = "line #7"
+<
+
+:[range]lua << [trim] [{endmarker}]
+{script}
+{endmarker}
+ Execute Lua script {script}.
+ Note: This command doesn't work when the Lua
+ feature wasn't compiled in. To avoid errors, see
+ |script-here|.
+
+If [endmarker] is omitted from after the "<<", a dot '.' must be used after
+{script}, like for the |:append| and |:insert| commands. Refer to
+|:let-heredoc| for more information.
+
+This form of the |:lua| command is mainly useful for including Lua code
+in Vim scripts.
+
+Example:
+>
+ function! CurrentLineInfo()
+ lua << EOF
+ local linenr = vim.window().line
+ local curline = vim.buffer()[linenr]
+ print(string.format("Current line [%d] has %d chars",
+ linenr, #curline))
+ EOF
+ endfunction
+<
+To see what version of Lua you have: >
+ :lua print(_VERSION)
+
+If you use LuaJIT you can also use this: >
+ :lua print(jit.version)
+<
+
+ *: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 Vim 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 Vim
+and manage buffers (|lua-buffer|) and windows (|lua-window|). However,
+procedures that alter buffer content, open new buffers, and change cursor
+position are restricted when the command is executed in the |sandbox|.
+
+
+==============================================================================
+2. The vim module *lua-vim*
+
+Lua interfaces Vim through the "vim" module. The first and last line of the
+input range are stored in "vim.firstline" and "vim.lastline" respectively. The
+module also includes routines for buffer, window, and current line queries,
+Vim evaluation and command execution, and others.
+
+ vim.list([arg]) Returns an empty list or, if "arg" is a Lua
+ table with numeric keys 1, ..., n (a
+ "sequence"), returns a list l such that l[i] =
+ arg[i] for i = 1, ..., n (see |List|).
+ Non-numeric keys are not used to initialize
+ the list. See also |lua-eval| for conversion
+ rules. Example: >
+ :lua t = {math.pi, false, say = 'hi'}
+ :echo luaeval('vim.list(t)')
+ :" [3.141593, v:false], 'say' is ignored
+<
+ vim.dict([arg]) Returns an empty dictionary or, if "arg" is a
+ Lua table, returns a dict d such that d[k] =
+ arg[k] for all string keys k in "arg" (see
+ |Dictionary|). Number keys are converted to
+ strings. Keys that are not strings are not
+ used to initialize the dictionary. See also
+ |lua-eval| for conversion rules. Example: >
+ :lua t = {math.pi, false, say = 'hi'}
+ :echo luaeval('vim.dict(t)')
+ :" {'1': 3.141593, '2': v:false,
+ :" 'say': 'hi'}
+<
+ vim.blob([arg]) Returns an empty blob or, if "arg" is a Lua
+ string, returns a blob b such that b is
+ equivalent to "arg" as a byte string.
+ Examples: >
+ :lua s = "12ab\x00\x80\xfe\xff"
+ :echo luaeval('vim.blob(s)')
+ :" 0z31326162.0080FEFF
+<
+ vim.funcref({name}) Returns a Funcref to function {name} (see
+ |Funcref|). It is equivalent to Vim's
+ function().
+
+ vim.buffer([arg]) If "arg" is a number, returns buffer with
+ number "arg" in the buffer list or, if "arg"
+ is a string, returns buffer whose full or short
+ name is "arg". In both cases, returns 'nil'
+ (nil value, not string) if the buffer is not
+ found. Otherwise, if "toboolean(arg)" is
+ 'true' returns the first buffer in the buffer
+ list or else the current buffer.
+
+ vim.window([arg]) If "arg" is a number, returns window with
+ number "arg" or 'nil' (nil value, not string)
+ if not found. Otherwise, if "toboolean(arg)"
+ is 'true' returns the first window or else the
+ current window.
+
+ vim.type({arg}) Returns the type of {arg}. It is equivalent to
+ Lua's "type" function, but returns "list",
+ "dict", "funcref", "buffer", or "window" if
+ {arg} is a list, dictionary, funcref, buffer,
+ or window, respectively. Examples: >
+ :lua l = vim.list()
+ :lua print(type(l), vim.type(l))
+ :" list
+<
+ vim.command({cmds}) Executes one or more lines of Ex-mode commands
+ in {cmds}.
+ Examples: >
+ :lua vim.command"set tw=60"
+ :lua vim.command"normal ddp"
+ lua << trim END
+ vim.command([[
+ new Myfile.js
+ call search('start')
+ ]])
+ END
+<
+ vim.eval({expr}) Evaluates expression {expr} (see |expression|),
+ converts the result to Lua, and returns it.
+ Vim strings and numbers are directly converted
+ to Lua strings and numbers respectively. Vim
+ lists and dictionaries are converted to Lua
+ userdata (see |lua-list| and |lua-dict|).
+ Examples: >
+ :lua tw = vim.eval"&tw"
+ :lua print(vim.eval"{'a': 'one'}".a)
+<
+ vim.line() Returns the current line (without the trailing
+ <EOL>), a Lua string.
+
+ vim.beep() Beeps.
+
+ vim.open({fname}) Opens a new buffer for file {fname} and
+ returns it. Note that the buffer is not set as
+ current.
+
+ vim.call({name} [, {args}])
+ Proxy to call Vim function named {name} with
+ arguments {args}. Example: >
+ :lua print(vim.call('has', 'timers'))
+<
+ vim.fn Proxy to call Vim functions. Proxy methods are
+ created on demand. Example: >
+ :lua print(vim.fn.has('timers'))
+<
+ vim.lua_version The Lua version Vim was compiled with, in the
+ form {major}.{minor}.{patch}, e.g. "5.1.4".
+
+ vim.version() Returns a Lua table with the Vim version.
+ The table will have the following keys:
+ major - major Vim version.
+ minor - minor Vim version.
+ patch - latest patch included.
+
+ *lua-vim-variables*
+The Vim editor global dictionaries |g:| |w:| |b:| |t:| |v:| can be accessed
+from Lua conveniently and idiomatically by referencing the `vim.*` Lua tables
+described below. In this way you can easily read and modify global Vim script
+variables from Lua.
+
+Example: >
+
+ vim.g.foo = 5 -- Set the g:foo Vim script variable.
+ print(vim.g.foo) -- Get and print the g:foo Vim script variable.
+ vim.g.foo = nil -- Delete (:unlet) the Vim script variable.
+
+vim.g *vim.g*
+ Global (|g:|) editor variables.
+ Key with no value returns `nil`.
+
+vim.b *vim.b*
+ Buffer-scoped (|b:|) variables for the current buffer.
+ Invalid or unset key returns `nil`.
+
+vim.w *vim.w*
+ Window-scoped (|w:|) variables for the current window.
+ Invalid or unset key returns `nil`.
+
+vim.t *vim.t*
+ Tabpage-scoped (|t:|) variables for the current tabpage.
+ Invalid or unset key returns `nil`.
+
+vim.v *vim.v*
+ |v:| variables.
+ Invalid or unset key returns `nil`.
+
+==============================================================================
+3. List userdata *lua-list*
+
+List userdata represent vim lists, and the interface tries to follow closely
+Vim's syntax for lists. Since lists are objects, changes in list references in
+Lua are reflected in Vim and vice-versa. A list "l" has the following
+properties and methods:
+
+NOTE: In patch 8.2.1066 array indexes were changed from zero-based to
+one-based. You can check with: >
+ if has("patch-8.2.1066")
+
+Properties
+----------
+ o "#l" is the number of items in list "l", equivalent to "len(l)"
+ in Vim.
+ o "l[k]" returns the k-th item in "l"; "l" is one-indexed, as in Lua.
+ To modify the k-th item, simply do "l[k] = newitem"; in
+ particular, "l[k] = nil" removes the k-th item from "l". Item can
+ be added to the end of the list by "l[#l + 1] = newitem"
+ o "l()" returns an iterator for "l".
+ o "table.insert(l, newitem)" inserts an item at the end of the list.
+ (only Lua 5.3 and later)
+ o "table.insert(l, position, newitem)" inserts an item at the
+ specified position. "position" is one-indexed. (only Lua 5.3 and
+ later)
+ o "table.remove(l, position)" removes an item at the specified
+ position. "position" is one-indexed.
+
+
+Methods
+-------
+ o "l:add(item)" appends "item" to the end of "l".
+ o "l:insert(item[, pos])" inserts "item" at (optional)
+ position "pos" in the list. The default value for "pos" is 0.
+
+Examples:
+>
+ :let l = [1, 'item']
+ :lua l = vim.eval('l') -- same 'l'
+ :lua l:add(vim.list())
+ :lua l[1] = math.pi
+ :echo l[0] " 3.141593
+ :lua l[1] = nil -- remove first item
+ :lua l:insert(true, 1)
+ :lua print(l, #l, l[1], l[2])
+ :lua l[#l + 1] = 'value'
+ :lua table.insert(l, 100)
+ :lua table.insert(l, 2, 200)
+ :lua table.remove(l, 1)
+ :lua for item in l() do print(item) end
+
+==============================================================================
+4. Dict userdata *lua-dict*
+
+Similarly to list userdata, dict userdata represent vim dictionaries; since
+dictionaries are also objects, references are kept between Lua and Vim. A dict
+"d" has the following properties:
+
+Properties
+----------
+ o "#d" is the number of items in dict "d", equivalent to "len(d)"
+ in Vim.
+ o "d.key" or "d['key']" returns the value at entry "key" in "d".
+ To modify the entry at this key, simply do "d.key = newvalue"; in
+ particular, "d.key = nil" removes the entry from "d".
+ o "d()" returns an iterator for "d" and is equivalent to "items(d)" in
+ Vim.
+
+Examples:
+>
+ :let d = {'n':10}
+ :lua d = vim.eval('d') -- same 'd'
+ :lua print(d, d.n, #d)
+ :let d.self = d
+ :lua for k, v in d() do print(d, k, v) end
+ :lua d.x = math.pi
+ :lua d.self = nil -- remove entry
+ :echo d
+<
+
+==============================================================================
+5. Blob userdata *lua-blob*
+
+Blob userdata represent vim blobs. A blob "b" has the following properties:
+
+Properties
+----------
+ o "#b" is the length of blob "b", equivalent to "len(b)" in Vim.
+ o "b[k]" returns the k-th item in "b"; "b" is zero-indexed, as in Vim.
+ To modify the k-th item, simply do "b[k] = number"; in particular,
+ "b[#b] = number" can append a byte to tail.
+
+Methods
+-------
+ o "b:add(bytes)" appends "bytes" to the end of "b".
+
+Examples:
+>
+ :let b = 0z001122
+ :lua b = vim.eval('b') -- same 'b'
+ :lua print(b, b[0], #b)
+ :lua b[1] = 32
+ :lua b[#b] = 0x33 -- append a byte to tail
+ :lua b:add("\x80\x81\xfe\xff")
+ :echo b
+<
+
+==============================================================================
+6. Funcref userdata *lua-funcref*
+
+Funcref userdata represent funcref variables in Vim. Funcrefs that were
+defined with a "dict" attribute need to be obtained as a dictionary key
+in order to have "self" properly assigned to the dictionary (see examples
+below.) A funcref "f" has the following properties:
+
+Properties
+----------
+ o "#f" is the name of the function referenced by "f"
+ o "f(...)" calls the function referenced by "f" (with arguments)
+
+Examples:
+>
+ :function I(x)
+ : return a:x
+ : endfunction
+ :let R = function('I')
+ :lua i1 = vim.funcref('I')
+ :lua i2 = vim.eval('R')
+ :lua print(#i1, #i2) -- both 'I'
+ :lua print(i1, i2, #i2(i1) == #i1(i2))
+ :function Mylen() dict
+ : return len(self.data)
+ : endfunction
+ :let mydict = {'data': [0, 1, 2, 3]}
+ :lua d = vim.eval('mydict'); d.len = vim.funcref('Mylen')
+ :echo mydict.len()
+ :lua l = d.len -- assign d as 'self'
+ :lua print(l())
+<
+Lua functions and closures are automatically converted to a Vim |Funcref| and
+can be accessed in Vim scripts. Example:
+>
+ lua <<EOF
+ vim.fn.timer_start(1000, function(timer)
+ print('timer callback')
+ end)
+ EOF
+
+==============================================================================
+7. Buffer userdata *lua-buffer*
+
+Buffer userdata represent vim buffers. A buffer userdata "b" has the following
+properties and methods:
+
+Properties
+----------
+ o "b()" sets "b" as the current buffer.
+ o "#b" is the number of lines in buffer "b".
+ o "b[k]" represents line number k: "b[k] = newline" replaces line k
+ with string "newline" and "b[k] = nil" deletes line k.
+ o "b.name" contains the short name of buffer "b" (read-only).
+ o "b.fname" contains the full name of buffer "b" (read-only).
+ o "b.number" contains the position of buffer "b" in the buffer list
+ (read-only).
+
+Methods
+-------
+ o "b:insert(newline[, pos])" inserts string "newline" at (optional)
+ position "pos" in the buffer. The default value for "pos" is
+ "#b + 1". If "pos == 0" then "newline" becomes the first line in
+ the buffer.
+ o "b:next()" returns the buffer next to "b" in the buffer list.
+ o "b:previous()" returns the buffer previous to "b" in the buffer
+ list.
+ o "b:isvalid()" returns 'true' (boolean) if buffer "b" corresponds to
+ a "real" (not freed from memory) Vim buffer.
+
+Examples:
+>
+ :lua b = vim.buffer() -- current buffer
+ :lua print(b.name, b.number)
+ :lua b[1] = "first line"
+ :lua b:insert("FIRST!", 0)
+ :lua b[1] = nil -- delete top line
+ :lua for i=1,3 do b:insert(math.random()) end
+ :3,4lua for i=vim.lastline,vim.firstline,-1 do b[i] = nil end
+ :lua vim.open"myfile"() -- open buffer and set it as current
+
+ function! ListBuffers()
+ lua << EOF
+ local b = vim.buffer(true) -- first buffer in list
+ while b ~= nil do
+ print(b.number, b.name, #b)
+ b = b:next()
+ end
+ vim.beep()
+ EOF
+ endfunction
+<
+
+==============================================================================
+8. Window userdata *lua-window*
+
+Window objects represent vim windows. A window userdata "w" has the following
+properties and methods:
+
+Properties
+----------
+ o "w()" sets "w" as the current window.
+ o "w.buffer" contains the buffer of window "w" (read-only).
+ o "w.line" represents the cursor line position in window "w".
+ o "w.col" represents the cursor column position in window "w".
+ o "w.width" represents the width of window "w".
+ o "w.height" represents the height of window "w".
+
+Methods
+-------
+ o "w:next()" returns the window next to "w".
+ o "w:previous()" returns the window previous to "w".
+ o "w:isvalid()" returns 'true' (boolean) if window "w" corresponds to
+ a "real" (not freed from memory) Vim window.
+
+Examples:
+>
+ :lua w = vim.window() -- current window
+ :lua print(w.buffer.name, w.line, w.col)
+ :lua w.width = w.width + math.random(10)
+ :lua w.height = 2 * math.random() * w.height
+ :lua n,w = 0,vim.window(true) while w~=nil do n,w = n + 1,w:next() end
+ :lua print("There are " .. n .. " windows")
+<
+
+==============================================================================
+9. luaeval() Vim function *lua-luaeval* *lua-eval*
+
+The (dual) equivalent of "vim.eval" for passing Lua values to Vim is
+"luaeval". "luaeval" takes an expression string and an optional argument 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
+<
+Note that "_A" receives the argument to "luaeval". Lua numbers, strings, and
+list, dict, blob, and funcref userdata are converted to their Vim respective
+types, while Lua booleans are converted to numbers. An error is thrown if
+conversion of any of the remaining Lua types, including userdata other than
+lists, dicts, blobs, and funcrefs, is attempted.
+
+Examples: >
+
+ :echo luaeval('math.pi')
+ :lua a = vim.list():add('newlist')
+ :let a = luaeval('a')
+ :echo a[0] " 'newlist'
+ :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)
+
+
+==============================================================================
+10. Dynamic loading *lua-dynamic*
+
+On MS-Windows and Unix the Lua library can be loaded dynamically. The
+|:version| output then includes |+lua/dyn|.
+
+This means that Vim will search for the Lua DLL or shared library file only
+when needed. When you don't use the Lua interface you don't need it, thus
+you can use Vim without this file.
+
+
+MS-Windows ~
+
+To use the Lua interface the Lua DLL must be in your search path. In a
+console window type "path" to see what directories are used. The 'luadll'
+option can be also used to specify the Lua DLL. The version of the DLL must
+match the Lua version Vim was compiled with.
+
+
+Unix ~
+
+The 'luadll' option can be used to specify the Lua shared library file instead
+of DYNAMIC_LUA_DLL file what was specified at compile time. The version of
+the shared library must match the Lua version Vim was compiled with.
+
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/if_mzsch.txt b/runtime/doc/if_mzsch.txt
new file mode 100644
index 0000000..9e9b252
--- /dev/null
+++ b/runtime/doc/if_mzsch.txt
@@ -0,0 +1,318 @@
+*if_mzsch.txt* For Vim version 9.0. Last change: 2020 Oct 14
+
+
+ VIM REFERENCE MANUAL by Sergey Khorev
+
+
+The MzScheme Interface to Vim *mzscheme* *MzScheme*
+
+1. Commands |mzscheme-commands|
+2. Examples |mzscheme-examples|
+3. Threads |mzscheme-threads|
+4. Vim access from MzScheme |mzscheme-vim|
+5. mzeval() Vim function |mzscheme-mzeval|
+6. Using Function references |mzscheme-funcref|
+7. Dynamic loading |mzscheme-dynamic|
+8. MzScheme setup |mzscheme-setup|
+
+{only available when Vim was compiled with the |+mzscheme| feature}
+
+Based on the work of Brent Fulgham.
+Dynamic loading added by Sergey Khorev
+
+MzScheme and PLT Scheme names have been rebranded as Racket. For more
+information please check http://racket-lang.org
+
+Futures and places of Racket version 5.x up to and including 5.3.1 do not
+work correctly with processes created by Vim.
+The simplest solution is to build Racket on your own with these features
+disabled: >
+ ./configure --disable-futures --disable-places --prefix=your-install-prefix
+
+To speed up the process, you might also want to use --disable-gracket and
+--disable-docs
+
+==============================================================================
+1. Commands *mzscheme-commands*
+
+ *:mzscheme* *:mz*
+:[range]mz[scheme] {stmt}
+ Execute MzScheme statement {stmt}.
+
+:[range]mz[scheme] << [trim] [{endmarker}]
+{script}
+{endmarker}
+ Execute inlined MzScheme script {script}.
+ Note: This command doesn't work when the MzScheme
+ feature wasn't compiled in. To avoid errors, see
+ |script-here|.
+
+ If [endmarker] is omitted from after the "<<", a dot
+ '.' must be used after {script}, like for the
+ |:append| and |:insert| commands. Refer to
+ |:let-heredoc| for more information.
+
+
+ *:mzfile* *:mzf*
+:[range]mzf[ile] {file} Execute the MzScheme script in {file}.
+
+All of these commands do essentially the same thing - they execute a piece of
+MzScheme code, with the "current range" set to the given line
+range.
+
+In the case of :mzscheme, the code to execute is in the command-line.
+In the case of :mzfile, the code to execute is the contents of the given file.
+
+MzScheme interface defines exception exn:vim, derived from exn.
+It is raised for various Vim errors.
+
+During compilation, the MzScheme interface will remember the current MzScheme
+collection path. If you want to specify additional paths use the
+'current-library-collection-paths' parameter. E.g., to cons the user-local
+MzScheme collection path: >
+ :mz << EOF
+ (current-library-collection-paths
+ (cons
+ (build-path (find-system-path 'addon-dir) (version) "collects")
+ (current-library-collection-paths)))
+ EOF
+<
+
+All functionality is provided through module vimext.
+
+The exn:vim is available without explicit import.
+
+To avoid clashes with MzScheme, consider using prefix when requiring module,
+e.g.: >
+ :mzscheme (require (prefix vim- vimext))
+<
+All the examples below assume this naming scheme.
+
+ *mzscheme-sandbox*
+When executed in the |sandbox|, access to some filesystem and Vim interface
+procedures is restricted.
+
+==============================================================================
+2. Examples *mzscheme-examples*
+>
+ :mzscheme (display "Hello")
+ :mz (display (string-append "Using MzScheme version " (version)))
+ :mzscheme (require (prefix vim- vimext)) ; for MzScheme < 4.x
+ :mzscheme (require (prefix-in vim- 'vimext)) ; MzScheme 4.x
+ :mzscheme (vim-set-buff-line 10 "This is line #10")
+
+To see what version of MzScheme you have: >
+ :mzscheme (display (version))
+<
+Inline script usage: >
+ function! <SID>SetFirstLine()
+ :mz << EOF
+ (display "!!!")
+ (require (prefix vim- vimext))
+ ; for newer versions (require (prefix-in vim- 'vimext))
+ (vim-set-buff-line 1 "This is line #1")
+ (vim-beep)
+ EOF
+ endfunction
+
+ nmap <F9> :call <SID>SetFirstLine() <CR>
+<
+File execution: >
+ :mzfile supascript.scm
+<
+Vim exception handling: >
+ :mz << EOF
+ (require (prefix vim- vimext))
+ ; for newer versions (require (prefix-in vim- 'vimext))
+ (with-handlers
+ ([exn:vim? (lambda (e) (display (exn-message e)))])
+ (vim-eval "nonsense-string"))
+ EOF
+<
+Auto-instantiation of vimext module (can be placed in your |vimrc|): >
+ function! MzRequire()
+ :redir => l:mzversion
+ :mz (version)
+ :redir END
+ if strpart(l:mzversion, 1, 1) < "4"
+ " MzScheme versions < 4.x:
+ :mz (require (prefix vim- vimext))
+ else
+ " newer versions:
+ :mz (require (prefix-in vim- 'vimext))
+ endif
+ endfunction
+
+ if has("mzscheme")
+ silent call MzRequire()
+ endif
+<
+==============================================================================
+3. Threads *mzscheme-threads*
+
+The MzScheme interface supports threads. They are independent from OS threads,
+thus scheduling is required. The option 'mzquantum' determines how often
+Vim should poll for available MzScheme threads.
+NOTE
+Thread scheduling in the console version of Vim is less reliable than in the
+GUI version.
+
+==============================================================================
+4. Vim access from MzScheme *mzscheme-vim*
+
+ *mzscheme-vimext*
+The 'vimext' module provides access to procedures defined in the MzScheme
+interface.
+
+Common
+------
+ (command {command-string}) Perform the vim ":Ex" style command.
+ (eval {expr-string}) Evaluate the vim expression into
+ respective MzScheme object: |Lists| are
+ represented as Scheme lists,
+ |Dictionaries| as hash tables,
+ |Funcref|s as functions (see also
+ |mzscheme-funcref|)
+ NOTE the name clashes with MzScheme eval,
+ use module qualifiers to overcome this.
+ (range-start) Start/End of the range passed with
+ (range-end) the Scheme command.
+ (beep) beep
+ (get-option {option-name} [buffer-or-window]) Get Vim option value (either
+ local or global, see set-option).
+ (set-option {string} [buffer-or-window])
+ Set a Vim option. String must have option
+ setting form (like optname=optval, or
+ optname+=optval, etc.) When called with
+ {buffer} or {window} the local option will
+ be set. The symbol 'global can be passed
+ as {buffer-or-window}. Then |:setglobal|
+ will be used.
+
+Buffers *mzscheme-buffer*
+-------
+ (buff? {object}) Is object a buffer?
+ (buff-valid? {object}) Is object a valid buffer? (i.e.
+ corresponds to the real Vim buffer)
+ (get-buff-line {linenr} [buffer])
+ Get line from a buffer.
+ (set-buff-line {linenr} {string} [buffer])
+ Set a line in a buffer. If {string} is #f,
+ the line gets deleted. The [buffer]
+ argument is optional. If omitted, the
+ current buffer will be used.
+ (get-buff-line-list {start} {end} [buffer])
+ Get a list of lines in a buffer. {Start}
+ and {end} are 1-based and inclusive.
+ (set-buff-line-list {start} {end} {string-list} [buffer])
+ Set a list of lines in a buffer. If
+ string-list is #f or null, the lines get
+ deleted. If a list is shorter than
+ {end}-{start} the remaining lines will
+ be deleted.
+ (get-buff-name [buffer]) Get a buffer's text name.
+ (get-buff-num [buffer]) Get a buffer's number.
+ (get-buff-size [buffer]) Get buffer line count.
+ (insert-buff-line-list {linenr} {string/string-list} [buffer])
+ Insert a list of lines into a buffer after
+ {linenr}. If {linenr} is 0, lines will be
+ inserted at start.
+ (curr-buff) Get the current buffer. Use other MzScheme
+ interface procedures to change it.
+ (buff-count) Get count of total buffers in the editor.
+ (get-next-buff [buffer]) Get next buffer.
+ (get-prev-buff [buffer]) Get previous buffer. Return #f when there
+ are no more buffers.
+ (open-buff {filename}) Open a new buffer (for file "name")
+ (get-buff-by-name {buffername}) Get a buffer by its filename or #f
+ if there is no such buffer.
+ (get-buff-by-num {buffernum}) Get a buffer by its number (return #f if
+ there is no buffer with this number).
+
+Windows *mzscheme-window*
+------
+ (win? {object}) Is object a window?
+ (win-valid? {object}) Is object a valid window (i.e. corresponds
+ to the real Vim window)?
+ (curr-win) Get the current window.
+ (win-count) Get count of windows.
+ (get-win-num [window]) Get window number.
+ (get-win-by-num {windownum}) Get window by its number.
+ (get-win-buffer [window]) Get the buffer for a given window.
+ (get-win-height [window])
+ (set-win-height {height} [window]) Get/Set height of window.
+ (get-win-width [window])
+ (set-win-width {width} [window])Get/Set width of window.
+ (get-win-list [buffer]) Get list of windows for a buffer.
+ (get-cursor [window]) Get cursor position in a window as
+ a pair (linenr . column).
+ (set-cursor (line . col) [window]) Set cursor position.
+
+==============================================================================
+5. mzeval() Vim function *mzscheme-mzeval*
+
+To facilitate bi-directional interface, you can use |mzeval()| function to
+evaluate MzScheme expressions and pass their values to Vim script.
+
+==============================================================================
+6. Using Function references *mzscheme-funcref*
+
+MzScheme interface allows use of |Funcref|s so you can call Vim functions
+directly from Scheme. For instance: >
+ function! MyAdd2(arg)
+ return a:arg + 2
+ endfunction
+ mz (define f2 (vim-eval "function(\"MyAdd2\")"))
+ mz (f2 7)
+< or : >
+ :mz (define indent (vim-eval "function('indent')"))
+ " return Vim indent for line 12
+ :mz (indent 12)
+<
+
+==============================================================================
+7. Dynamic loading *mzscheme-dynamic* *E815*
+
+On MS-Windows the MzScheme libraries can be loaded dynamically. The |:version|
+output then includes |+mzscheme/dyn|.
+
+This means that Vim will search for the MzScheme DLL files only when needed.
+When you don't use the MzScheme interface you don't need them, thus you can
+use Vim without these DLL files.
+NOTE: Newer version of MzScheme (Racket) require earlier (trampolined)
+initialisation via scheme_main_setup. So Vim always loads the MzScheme DLL at
+startup if possible. This may make Vim startup slower.
+
+To use the MzScheme interface the MzScheme DLLs must be in your search path.
+In a console window type "path" to see what directories are used.
+
+On MS-Windows the options 'mzschemedll' and 'mzschemegcdll' are used for the
+name of the library to load. The initial value is specified at build time.
+
+The version of the DLL must match the MzScheme version Vim was compiled with.
+For MzScheme version 209 they will be "libmzsch209_000.dll" and
+"libmzgc209_000.dll". To know for sure look at the output of the ":version"
+command, look for -DDYNAMIC_MZSCH_DLL="something" and
+-DDYNAMIC_MZGC_DLL="something" in the "Compilation" info.
+
+For example, if MzScheme (Racket) is installed at C:\Racket63, you may need
+to set the environment variable as the following: >
+
+ PATH=%PATH%;C:\Racket63\lib
+ PLTCOLLECTS=C:\Racket63\collects
+ PLTCONFIGDIR=C:\Racket63\etc
+<
+==============================================================================
+8. MzScheme setup *mzscheme-setup* *E895*
+
+Vim requires "racket/base" module for if_mzsch core (fallback to "scheme/base"
+if it doesn't exist), "r5rs" module for test and "raco ctool" command for
+building Vim. If MzScheme did not have them, you can install them with
+MzScheme's raco command:
+>
+ raco pkg install scheme-lib # scheme/base module
+ raco pkg install r5rs-lib # r5rs module
+ raco pkg install cext-lib # raco ctool command
+<
+======================================================================
+ vim:tw=78:ts=8:noet:sts=4:ft=help:norl:
diff --git a/runtime/doc/if_ole.txt b/runtime/doc/if_ole.txt
new file mode 100644
index 0000000..9f899dd
--- /dev/null
+++ b/runtime/doc/if_ole.txt
@@ -0,0 +1,199 @@
+*if_ole.txt* For Vim version 9.0. Last change: 2022 Oct 08
+
+
+ VIM REFERENCE MANUAL by Paul Moore
+
+
+The OLE Interface to Vim *ole-interface*
+
+1. Activation |ole-activation|
+2. Methods |ole-methods|
+3. The "normal" command |ole-normal|
+4. Registration |ole-registration|
+5. MS Visual Studio integration |MSVisualStudio|
+
+{only available when compiled with the |+ole| feature. See
+src/if_ole.INSTALL}
+An alternative is using the client-server communication |clientserver|.
+
+==============================================================================
+1. Activation *ole-activation*
+
+Vim acts as an OLE automation server, accessible from any automation client,
+for example, Visual Basic, Python, or Perl. The Vim application "name" (its
+"ProgID", in OLE terminology) is "Vim.Application".
+
+Hence, in order to start a Vim instance (or connect to an already running
+instance), code similar to the following should be used:
+
+[Visual Basic] >
+ Dim Vim As Object
+ Set Vim = CreateObject("Vim.Application")
+
+[Python] >
+ from win32com.client.dynamic import Dispatch
+ vim = Dispatch('Vim.Application')
+
+[Perl] >
+ use Win32::OLE;
+ $vim = new Win32::OLE 'Vim.Application';
+
+[C#] >
+ // Add a reference to Vim in your project.
+ // Choose the COM tab.
+ // Select "Vim Ole Interface 1.1 Type Library"
+ Vim.Vim vimobj = new Vim.Vim();
+
+Vim does not support acting as a "hidden" OLE server, like some other OLE
+Automation servers. When a client starts up an instance of Vim, that instance
+is immediately visible. Simply closing the OLE connection to the Vim instance
+is not enough to shut down the Vim instance - it is necessary to explicitly
+execute a quit command (for example, :qa!, :wqa).
+
+==============================================================================
+2. Methods *ole-methods*
+
+Vim exposes four methods for use by clients.
+
+ *ole-sendkeys*
+SendKeys(keys) Execute a series of keys.
+
+This method takes a single parameter, which is a string of keystrokes. These
+keystrokes are executed exactly as if they had been types in at the keyboard.
+Special keys can be given using their <..> names, as for the right hand side
+of a mapping. Note: Execution of the Ex "normal" command is not supported -
+see below |ole-normal|.
+
+Examples (Visual Basic syntax) >
+ Vim.SendKeys "ihello<Esc>"
+ Vim.SendKeys "ma1GV4jy`a"
+
+These examples assume that Vim starts in Normal mode. To force Normal mode,
+start the key sequence with CTRL-\ CTRL-N as in >
+
+ Vim.SendKeys "<C-\><C-N>ihello<Esc>"
+
+CTRL-\ CTRL-N returns Vim to Normal mode, when in Insert or Command-line mode.
+Note that this doesn't work halfway a Vim command
+
+ *ole-eval*
+Eval(expr) Evaluate an expression.
+
+This method takes a single parameter, which is an expression in Vim's normal
+format (see |expression|). It returns a string, which is the result of
+evaluating the expression. A |List| is turned into a string by joining the
+items and inserting line breaks.
+
+Examples (Visual Basic syntax) >
+ Line20 = Vim.Eval("getline(20)")
+ Twelve = Vim.Eval("6 + 6") ' Note this is a STRING
+ Font = Vim.Eval("&guifont")
+<
+ *ole-setforeground*
+SetForeground() Make the Vim window come to the foreground
+
+This method takes no arguments. No value is returned.
+
+Example (Visual Basic syntax) >
+ Vim.SetForeground
+<
+
+ *ole-gethwnd*
+GetHwnd() Return the handle of the Vim window.
+
+This method takes no arguments. It returns the hwnd of the main Vimwindow.
+You can use this if you are writing something which needs to manipulate the
+Vim window, or to track it in the z-order, etc.
+
+Example (Visual Basic syntax) >
+ Vim_Hwnd = Vim.GetHwnd
+<
+
+==============================================================================
+3. The "normal" command *ole-normal*
+
+Due to the way Vim processes OLE Automation commands, combined with the method
+of implementation of the Ex command :normal, it is not possible to execute the
+:normal command via OLE automation. Any attempt to do so will fail, probably
+harmlessly, although possibly in unpredictable ways.
+
+There is currently no practical way to trap this situation, and users must
+simply be aware of the limitation.
+==============================================================================
+4. Registration *ole-registration* *E243*
+
+Before Vim will act as an OLE server, it must be registered in the system
+registry. In order to do this, Vim should be run with a single parameter of
+"-register".
+ *-register* >
+ gvim -register
+
+If gvim with OLE support is run and notices that no Vim OLE server has been
+registered, it will present a dialog and offers you the choice to register by
+clicking "Yes".
+
+In some situations registering is not possible. This happens when the
+registry is not writable. If you run into this problem you need to run gvim
+as "Administrator".
+
+Once vim is registered, the application path is stored in the registry.
+Before moving, deleting, or upgrading Vim, the registry entries should be
+removed using the "-unregister" switch.
+ *-unregister* >
+ gvim -unregister
+
+The OLE mechanism will use the first registered Vim it finds. If a Vim is
+already running, this one will be used. If you want to have (several) Vim
+sessions open that should not react to OLE commands, use the non-OLE version,
+and put it in a different directory. The OLE version should then be put in a
+directory that is not in your normal path, so that typing "gvim" will start
+the non-OLE version.
+
+ *-silent*
+To avoid the message box that pops up to report the result, prepend "-silent":
+>
+ gvim -silent -register
+ gvim -silent -unregister
+
+==============================================================================
+5. MS Visual Studio integration *MSVisualStudio*
+
+The old "VisVim" integration was removed from Vim in patch 9.0.0698.
+
+
+Using Vim with Visual Studio .Net~
+
+.Net studio has support for external editors. Follow these directions:
+
+In .Net Studio choose from the menu Tools->External Tools...
+Add
+ Title - Vim
+ Command - c:\vim\vim63\gvim.exe
+ Arguments - --servername VS_NET --remote-silent "+call cursor($(CurLine), $(CurCol))" $(ItemPath)
+ Init Dir - Empty
+
+Now, when you open a file in .Net, you can choose from the .Net menu:
+Tools->Vim
+
+That will open the file in Vim.
+You can then add this external command as an icon and place it anywhere you
+like. You might also be able to set this as your default editor.
+
+If you refine this further, please post back to the Vim maillist so we have a
+record of it.
+
+--servername VS_NET
+This will create a new instance of vim called VS_NET. So if you open multiple
+files from VS, they will use the same instance of Vim. This allows you to
+have multiple copies of Vim running, but you can control which one has VS
+files in it.
+
+--remote-silent "+call cursor(10, 27)"
+ - Places the cursor on line 10 column 27
+In Vim >
+ :h --remote-silent for more details
+
+[.Net remarks provided by Dave Fishburn and Brian Sturk]
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/if_perl.txt b/runtime/doc/if_perl.txt
new file mode 100644
index 0000000..281185b
--- /dev/null
+++ b/runtime/doc/if_perl.txt
@@ -0,0 +1,310 @@
+*if_perl.txt* For Vim version 9.0. Last change: 2022 Mar 13
+
+
+ VIM REFERENCE MANUAL by Sven Verdoolaege
+ and Matt Gerassimof
+
+Perl and Vim *perl* *Perl*
+
+1. Editing Perl files |perl-editing|
+2. Compiling Vim with Perl interface |perl-compiling|
+3. Using the Perl interface |perl-using|
+4. Dynamic loading |perl-dynamic|
+
+{only available when Vim was compiled with the |+perl| feature}
+
+==============================================================================
+1. Editing Perl files *perl-editing*
+
+Vim syntax highlighting supports Perl and POD files. Vim assumes a file is
+Perl code if the filename has a .pl or .pm suffix. Vim also examines the first
+line of a file, regardless of the filename suffix, to check if a file is a
+Perl script (see scripts.vim in Vim's syntax directory). Vim assumes a file
+is POD text if the filename has a .POD suffix.
+
+To use tags with Perl, you need Universal/Exuberant Ctags. Look here:
+ Universal Ctags (preferred): https://ctags.io
+ Exuberant Ctags: http://ctags.sourceforge.net
+
+Alternatively, you can use the Perl script pltags.pl, which is shipped with
+Vim in the $VIMRUNTIME/tools directory. This script has currently more
+features than Exuberant ctags' Perl support.
+
+==============================================================================
+2. Compiling Vim with Perl interface *perl-compiling*
+
+To compile Vim with Perl interface, you need Perl 5.004 (or later). Perl must
+be installed before you compile Vim. Vim's Perl interface does NOT work with
+the 5.003 version that has been officially released! It will probably work
+with Perl 5.003_05 and later.
+
+The Perl patches for Vim were made by:
+ Sven Verdoolaege <skimo@breughel.ufsia.ac.be>
+ Matt Gerassimof
+
+Perl for MS-Windows (and other platforms) can be found at:
+ http://www.perl.org/
+The ActiveState one should work, Strawberry Perl is a good alternative.
+
+==============================================================================
+3. Using the Perl interface *perl-using*
+
+ *:perl* *:pe*
+:pe[rl] {cmd} Execute Perl command {cmd}. The current package
+ is "main". Simple example to test if `:perl` is
+ working: >
+ :perl VIM::Msg("Hello")
+
+:pe[rl] << [trim] [{endmarker}]
+{script}
+{endmarker}
+ Execute Perl script {script}.
+ The {endmarker} after {script} must NOT be preceded by
+ any white space.
+
+ If [endmarker] is omitted, it defaults to a dot '.'
+ like for the |:append| and |:insert| commands. Using
+ '.' helps when inside a function, because "$i;" looks
+ like the start of an |:insert| command to Vim.
+
+ This form of the |:perl| command is mainly useful for
+ including perl code in vim scripts.
+ Note: This command doesn't work when the Perl feature
+ wasn't compiled in. To avoid errors, see
+ |script-here|.
+
+
+Example vim script: >
+
+ function! WhitePearl()
+ perl << EOF
+ VIM::Msg("pearls are nice for necklaces");
+ VIM::Msg("rubys for rings");
+ VIM::Msg("pythons for bags");
+ VIM::Msg("tcls????");
+ EOF
+ endfunction
+<
+To see what version of Perl you have: >
+ :perl print $^V
+<
+
+ *:perldo* *:perld*
+:[range]perld[o] {cmd} Execute Perl 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,$".
+
+Here are some things you can try: >
+
+ :perl $a=1
+ :perldo $_ = reverse($_);1
+ :perl VIM::Msg("hello")
+ :perl $line = $curbuf->Get(42)
+< *E299*
+Executing Perl commands in the |sandbox| is limited. ":perldo" will not be
+possible at all. ":perl" will be evaluated in the Safe environment, if
+possible.
+
+
+ *perl-overview*
+Here is an overview of the functions that are available to Perl: >
+
+ :perl VIM::Msg("Text") # displays a message
+ :perl VIM::Msg("Wrong!", "ErrorMsg") # displays an error message
+ :perl VIM::Msg("remark", "Comment") # displays a highlighted message
+ :perl VIM::SetOption("ai") # sets a vim option
+ :perl $nbuf = VIM::Buffers() # returns the number of buffers
+ :perl @buflist = VIM::Buffers() # returns array of all buffers
+ :perl $mybuf = (VIM::Buffers('qq.c'))[0] # returns buffer object for 'qq.c'
+ :perl @winlist = VIM::Windows() # returns array of all windows
+ :perl $nwin = VIM::Windows() # returns the number of windows
+ :perl ($success, $v) = VIM::Eval('&path') # $v: option 'path', $success: 1
+ :perl ($success, $v) = VIM::Eval('&xyz') # $v: '' and $success: 0
+ :perl $v = VIM::Eval('expand("<cfile>")') # expands <cfile>
+ :perl $curwin->SetHeight(10) # sets the window height
+ :perl @pos = $curwin->Cursor() # returns (row, col) array
+ :perl @pos = (10, 10)
+ :perl $curwin->Cursor(@pos) # sets cursor to @pos
+ :perl $curwin->Cursor(10,10) # sets cursor to row 10 col 10
+ :perl $mybuf = $curwin->Buffer() # returns the buffer object for window
+ :perl $curbuf->Name() # returns buffer name
+ :perl $curbuf->Number() # returns buffer number
+ :perl $curbuf->Count() # returns the number of lines
+ :perl $l = $curbuf->Get(10) # returns line 10
+ :perl @l = $curbuf->Get(1 .. 5) # returns lines 1 through 5
+ :perl $curbuf->Delete(10) # deletes line 10
+ :perl $curbuf->Delete(10, 20) # delete lines 10 through 20
+ :perl $curbuf->Append(10, "Line") # appends a line
+ :perl $curbuf->Append(10, "Line1", "Line2", "Line3") # appends 3 lines
+ :perl @l = ("L1", "L2", "L3")
+ :perl $curbuf->Append(10, @l) # appends L1, L2 and L3
+ :perl $curbuf->Set(10, "Line") # replaces line 10
+ :perl $curbuf->Set(10, "Line1", "Line2") # replaces lines 10 and 11
+ :perl $curbuf->Set(10, @l) # replaces 3 lines
+<
+ *perl-Msg*
+VIM::Msg({msg}, {group}?)
+ Displays the message {msg}. The optional {group}
+ argument specifies a highlight group for Vim to use
+ for the message.
+
+ *perl-SetOption*
+VIM::SetOption({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|.
+
+ *perl-Buffers*
+VIM::Buffers([{bn}...]) With no arguments, returns a list of all the buffers
+ in an array context or returns the number of buffers
+ in a scalar context. For a list of buffer names or
+ numbers {bn}, returns a list of the buffers matching
+ {bn}, using the same rules as Vim's internal
+ |bufname()| function.
+ WARNING: the list becomes invalid when |:bwipe| is
+ used. Using it anyway may crash Vim.
+
+ *perl-Windows*
+VIM::Windows([{wn}...]) With no arguments, returns a list of all the windows
+ in an array context or returns the number of windows
+ in a scalar context. For a list of window numbers
+ {wn}, returns a list of the windows with those
+ numbers.
+ WARNING: the list becomes invalid when a window is
+ closed. Using it anyway may crash Vim.
+
+ *perl-DoCommand*
+VIM::DoCommand({cmd}) Executes Ex command {cmd}.
+
+ *perl-Eval*
+VIM::Eval({expr}) Evaluates {expr} and returns (success, value) in list
+ context or just value in scalar context.
+ success=1 indicates that val contains the value of
+ {expr}; success=0 indicates a failure to evaluate
+ the expression. '@x' returns the contents of register
+ x, '&x' returns the value of option x, 'x' returns the
+ value of internal |variables| x, and '$x' is equivalent
+ to perl's $ENV{x}. All |functions| accessible from
+ the command-line are valid for {expr}.
+ A |List| is turned into a string by joining the items
+ and inserting line breaks.
+
+ *perl-Blob*
+VIM::Blob({expr}) Return |Blob| literal string 0zXXXX from scalar value.
+
+ *perl-SetHeight*
+Window->SetHeight({height})
+ Sets the Window height to {height}, within screen
+ limits.
+
+ *perl-GetCursor*
+Window->Cursor({row}?, {col}?)
+ With no arguments, returns a (row, col) array for the
+ current cursor position in the Window. With {row} and
+ {col} arguments, sets the Window's cursor position to
+ {row} and {col}. Note that {col} is numbered from 0,
+ Perl-fashion, and thus is one less than the value in
+ Vim's ruler.
+
+Window->Buffer() *perl-Buffer*
+ Returns the Buffer object corresponding to the given
+ Window.
+
+ *perl-Name*
+Buffer->Name() Returns the filename for the Buffer.
+
+ *perl-Number*
+Buffer->Number() Returns the number of the Buffer.
+
+ *perl-Count*
+Buffer->Count() Returns the number of lines in the Buffer.
+
+ *perl-Get*
+Buffer->Get({lnum}, {lnum}?, ...)
+ Returns a text string of line {lnum} in the Buffer
+ for each {lnum} specified. An array can be passed
+ with a list of {lnum}'s specified.
+
+ *perl-Delete*
+Buffer->Delete({lnum}, {lnum}?)
+ Deletes line {lnum} in the Buffer. With the second
+ {lnum}, deletes the range of lines from the first
+ {lnum} to the second {lnum}.
+
+ *perl-Append*
+Buffer->Append({lnum}, {line}, {line}?, ...)
+ Appends each {line} string after Buffer line {lnum}.
+ The list of {line}s can be an array.
+
+ *perl-Set*
+Buffer->Set({lnum}, {line}, {line}?, ...)
+ Replaces one or more Buffer lines with specified
+ {lines}s, starting at Buffer line {lnum}. The list of
+ {line}s can be an array. If the arguments are
+ invalid, replacement does not occur.
+
+$main::curwin
+ The current window object.
+
+$main::curbuf
+ The current buffer object.
+
+
+ *script-here*
+When using a script language in-line, you might want to skip this when the
+language isn't supported. But this mechanism doesn't work: >
+ if has('perl')
+ perl << EOF
+ this will NOT work!
+ EOF
+ endif
+Instead, put the Perl/Python/Ruby/etc. command in a function and call that
+function: >
+ if has('perl')
+ function DefPerl()
+ perl << EOF
+ this works
+ EOF
+ endfunction
+ call DefPerl()
+ endif
+Note that "EOF" must be at the start of the line.
+
+==============================================================================
+4. Dynamic loading *perl-dynamic*
+
+On MS-Windows and Unix the Perl library can be loaded dynamically. The
+|:version| output then includes |+perl/dyn|.
+
+This means that Vim will search for the Perl DLL or shared library file only
+when needed. When you don't use the Perl interface you don't need it, thus
+you can use Vim without this file.
+
+
+MS-Windows ~
+
+You can download Perl from http://www.perl.org. The one from ActiveState was
+used for building Vim.
+
+To use the Perl interface the Perl DLL must be in your search path.
+If Vim reports it cannot find the perl512.dll, make sure your $PATH includes
+the directory where it is located. The Perl installer normally does that.
+In a console window type "path" to see what directories are used. The
+'perldll' option can be also used to specify the Perl DLL.
+
+The name of the DLL must match the Perl version Vim was compiled with.
+Currently the name is "perl512.dll". That is for Perl 5.12. To know for
+sure edit "gvim.exe" and search for "perl\d*.dll\c".
+
+
+Unix ~
+
+The 'perldll' option can be used to specify the Perl shared library file
+instead of DYNAMIC_PERL_DLL file what was specified at compile time. The
+version of the shared library must match the Perl version Vim was compiled
+with.
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/if_pyth.txt b/runtime/doc/if_pyth.txt
new file mode 100644
index 0000000..c2a0094
--- /dev/null
+++ b/runtime/doc/if_pyth.txt
@@ -0,0 +1,974 @@
+*if_pyth.txt* For Vim version 9.0. Last change: 2022 Feb 22
+
+
+ VIM REFERENCE MANUAL by Paul Moore
+
+
+The Python Interface to Vim *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. Dynamic loading |python-dynamic|
+10. Python 3 |python3|
+11. Python X |python_x|
+12. Building with Python support |python-building|
+
+The Python 2.x interface is available only when Vim was compiled with the
+|+python| feature.
+The Python 3 interface is available only when Vim was compiled with the
+|+python3| feature.
+Both can be available at the same time, but read |python-2-and-3|.
+
+NOTE: Python 2 is old and no longer being developed. Using Python 3 is highly
+recommended. Python 2 support will be dropped when it does not work properly
+anymore.
+
+==============================================================================
+1. Commands *python-commands*
+
+ *:python* *:py* *E263* *E264* *E887*
+:[range]py[thon] {stmt}
+ Execute Python statement {stmt}. A simple check if
+ the `:python` command is working: >
+ :python print "Hello"
+
+:[range]py[thon] << [trim] [{endmarker}]
+{script}
+{endmarker}
+ Execute Python script {script}.
+ Note: This command doesn't work when the Python
+ feature wasn't compiled in. To avoid errors, see
+ |script-here|.
+
+If [endmarker] is omitted from after the "<<", a dot '.' must be used after
+{script}, like for the |:append| and |:insert| commands. Refer to
+|:let-heredoc| for more information.
+
+This form of the |:python| command is mainly useful for including python code
+in Vim scripts.
+
+Example: >
+ function! IcecreamInitialize()
+ python << EOF
+ class StrawberryIcecream:
+ def __call__(self):
+ 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.
+
+ *python-environment*
+Environment variables set in Vim are not always available in Python. This
+depends on how Vim and Python were built. Also see
+https://docs.python.org/3/library/os.html#os.environ
+
+Note: Python is very sensitive to the indenting. Make sure the "class" line
+and "EOF" do not have any indent.
+
+ *:pydo*
+:[range]pydo {body} Execute Python function "def _vim_pydo(line, linenr):
+ {body}" for each line in the [range], with the
+ function arguments being set to the text of each line
+ in turn, without a trailing <EOL>, and the current
+ line number. The function should return a string or
+ None. If a string is returned, it becomes the text of
+ the line in the current turn. The default for [range]
+ is the whole file: "1,$".
+
+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
+ argument is used as a single file name.
+
+Both of these commands do essentially the same thing - they execute a piece of
+Python code, with the "current range" |python-range| set to the given line
+range.
+
+In the case of :python, the code to execute is in the command-line.
+In the case of :pyfile, the code to execute is the contents of the given file.
+
+Python commands cannot be used in the |sandbox|.
+
+To pass arguments you need to set sys.argv[] explicitly. Example: >
+
+ :python sys.argv = ["foo", "bar"]
+ :pyfile myscript.py
+
+Here are some examples *python-examples* >
+
+ :python from vim import *
+ :python from string import upper
+ :python current.line = upper(current.line)
+ :python print "Hello"
+ :python str = current.buffer[42]
+
+(Note that changes - like the imports - persist from one command to the next,
+just like in the Python interpreter.)
+
+==============================================================================
+2. The vim module *python-vim*
+
+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
+methods, three constants, and one error object. You need to import the vim
+module before using it: >
+ :python import vim
+
+Overview >
+ :py print "Hello" # displays a message
+ :py vim.command(cmd) # execute an Ex command
+ :py w = vim.windows[n] # gets window "n"
+ :py cw = vim.current.window # gets the current window
+ :py b = vim.buffers[n] # gets buffer "n"
+ :py cb = vim.current.buffer # gets the current buffer
+ :py w.height = lines # sets the window height
+ :py w.cursor = (row, col) # sets the window cursor position
+ :py pos = w.cursor # gets a tuple (row, col)
+ :py name = b.name # gets the buffer file name
+ :py line = b[n] # gets a line from the buffer
+ :py lines = b[n:m] # gets a list of lines
+ :py num = len(b) # gets the number of lines
+ :py b[n] = str # sets a line in the buffer
+ :py b[n:m] = [str1, str2, str3] # sets a number of lines at once
+ :py del b[n] # deletes a line
+ :py del b[n:m] # deletes a number of lines
+
+
+Methods of the "vim" module
+
+vim.command(str) *python-command*
+ Executes the vim (ex-mode) command str. Returns None.
+ Examples: >
+ :py vim.command("set tw=72")
+ :py vim.command("%s/aaa/bbb/g")
+< The following definition executes Normal mode commands: >
+ def normal(str):
+ vim.command("normal "+str)
+ # Note the use of single quotes to delimit a string containing
+ # double quotes
+ normal('"a2dd"aP')
+< *E659*
+ The ":python" command cannot be used recursively with Python 2.2 and
+ older. This only works with Python 2.3 and later: >
+ :py vim.command("python print 'Hello again Python'")
+
+vim.eval(str) *python-eval*
+ Evaluates the expression str using the vim internal expression
+ evaluator (see |expression|). Returns the expression result as:
+ - a string if the Vim expression evaluates to a string or number
+ - a list if the Vim expression evaluates to a Vim list
+ - a dictionary if the Vim expression evaluates to a Vim dictionary
+ Dictionaries and lists are recursively expanded.
+ Examples: >
+ :" value of the 'textwidth' option
+ :py text_width = vim.eval("&tw")
+ :
+ :" contents of the 'a' register
+ :py a_reg = vim.eval("@a")
+ :
+ :" Result is a string! Use string.atoi() to convert to a number.
+ :py str = vim.eval("12+12")
+ :
+ :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|
+ or |Dictionary|) or call (|Funcref|) vim objects.
+
+vim.strwidth(str) *python-strwidth*
+ Like |strwidth()|: returns number of display cells str occupies, tab
+ is counted as one cell.
+
+vim.foreach_rtp(callable) *python-foreach_rtp*
+ Call the given callable for each path in 'runtimepath' until either
+ callable returns something but None, the exception is raised or there
+ are no longer paths. If stopped in case callable returned non-None,
+ vim.foreach_rtp function returns the value returned by callable.
+
+vim.chdir(*args, **kwargs) *python-chdir*
+vim.fchdir(*args, **kwargs) *python-fchdir*
+ Run os.chdir or os.fchdir, then all appropriate vim stuff.
+ Note: you should not use these functions directly, use os.chdir and
+ os.fchdir instead. Behavior of vim.fchdir is undefined in case
+ os.fchdir does not exist.
+
+Error object of the "vim" module
+
+vim.error *python-error*
+ Upon encountering a Vim error, Python raises an exception of type
+ vim.error.
+ Example: >
+ try:
+ vim.command("put a")
+ except vim.error:
+ # nothing in register a
+
+Constants of the "vim" module
+
+ Note that these are not actually constants - you could reassign them.
+ But this is silly, as you would then lose access to the vim objects
+ to which the variables referred.
+
+vim.buffers *python-buffers*
+ A mapping object providing access to the list of vim buffers. The
+ object supports the following operations: >
+ :py b = vim.buffers[i] # Indexing (read-only)
+ :py b in vim.buffers # Membership test
+ :py n = len(vim.buffers) # Number of elements
+ :py for b in vim.buffers: # Iterating over buffer list
+<
+vim.windows *python-windows*
+ A sequence object providing access to the list of vim windows. The
+ object supports the following operations: >
+ :py w = vim.windows[i] # Indexing (read-only)
+ :py w in vim.windows # Membership test
+ :py n = len(vim.windows) # Number of elements
+ :py for w in vim.windows: # Sequential access
+< Note: vim.windows object always accesses current tab page.
+ |python-tabpage|.windows objects are bound to parent |python-tabpage|
+ object and always use windows from that tab page (or throw vim.error
+ in case tab page was deleted). You can keep a reference to both
+ without keeping a reference to vim module object or |python-tabpage|,
+ they will not lose their properties in this case.
+
+vim.tabpages *python-tabpages*
+ A sequence object providing access to the list of vim tab pages. The
+ object supports the following operations: >
+ :py t = vim.tabpages[i] # Indexing (read-only)
+ :py t in vim.tabpages # Membership test
+ :py n = len(vim.tabpages) # Number of elements
+ :py for t in vim.tabpages: # Sequential access
+<
+vim.current *python-current*
+ An object providing access (via specific attributes) to various
+ "current" objects available in vim:
+ vim.current.line The current line (RW) String
+ vim.current.buffer The current buffer (RW) Buffer
+ vim.current.window The current window (RW) Window
+ vim.current.tabpage The current tab page (RW) TabPage
+ vim.current.range The current line range (RO) Range
+
+ The last case deserves a little explanation. When the :python or
+ :pyfile command specifies a range, this range of lines becomes the
+ "current range". A range is a bit like a buffer, but with all access
+ restricted to a subset of lines. See |python-range| for more details.
+
+ Note: When assigning to vim.current.{buffer,window,tabpage} it expects
+ valid |python-buffer|, |python-window| or |python-tabpage| objects
+ respectively. Assigning triggers normal (with |autocommand|s)
+ switching to given buffer, window or tab page. It is the only way to
+ switch UI objects in python: you can't assign to
+ |python-tabpage|.window attribute. To switch without triggering
+ autocommands use >
+ py << EOF
+ saved_eventignore = vim.options['eventignore']
+ vim.options['eventignore'] = 'all'
+ try:
+ vim.current.buffer = vim.buffers[2] # Switch to buffer 2
+ finally:
+ vim.options['eventignore'] = saved_eventignore
+ EOF
+<
+vim.vars *python-vars*
+vim.vvars *python-vvars*
+ Dictionary-like objects holding dictionaries with global (|g:|) and
+ vim (|v:|) variables respectively. Identical to `vim.bindeval("g:")`,
+ but faster.
+
+vim.options *python-options*
+ Object partly supporting mapping protocol (supports setting and
+ getting items) providing a read-write access to global options.
+ Note: unlike |:set| this provides access only to global options. You
+ cannot use this object to obtain or set local options' values or
+ access local-only options in any fashion. Raises KeyError if no global
+ option with such name exists (i.e. does not raise KeyError for
+ |global-local| options and global only options, but does for window-
+ and buffer-local ones). Use |python-buffer| objects to access to
+ buffer-local options and |python-window| objects to access to
+ window-local options.
+
+ Type of this object is available via "Options" attribute of vim
+ module.
+
+Output from Python *python-output*
+ Vim displays all Python code output in the Vim message area. Normal
+ output appears as information messages, and error output appears as
+ error messages.
+
+ In implementation terms, this means that all output to sys.stdout
+ (including the output from print statements) appears as information
+ messages, and all output to sys.stderr (including error tracebacks)
+ appears as error messages.
+
+ *python-input*
+ Input (via sys.stdin, including input() and raw_input()) is not
+ supported, and may cause the program to crash. This should probably be
+ fixed.
+
+ *python2-directory* *python3-directory* *pythonx-directory*
+Python 'runtimepath' handling *python-special-path*
+
+In python vim.VIM_SPECIAL_PATH special directory is used as a replacement for
+the list of paths found in 'runtimepath': with this directory in sys.path and
+vim.path_hooks in sys.path_hooks python will try to load module from
+{rtp}/python2 (or python3) and {rtp}/pythonx (for both python versions) for
+each {rtp} found in 'runtimepath'.
+
+Implementation is similar to the following, but written in C: >
+
+ from imp import find_module, load_module
+ import vim
+ import sys
+
+ class VimModuleLoader(object):
+ def __init__(self, module):
+ self.module = module
+
+ def load_module(self, fullname, path=None):
+ return self.module
+
+ def _find_module(fullname, oldtail, path):
+ idx = oldtail.find('.')
+ if idx > 0:
+ name = oldtail[:idx]
+ tail = oldtail[idx+1:]
+ fmr = find_module(name, path)
+ module = load_module(fullname[:-len(oldtail)] + name, *fmr)
+ return _find_module(fullname, tail, module.__path__)
+ else:
+ fmr = find_module(fullname, path)
+ return load_module(fullname, *fmr)
+
+ # It uses vim module itself in place of VimPathFinder class: it does not
+ # matter for python which object has find_module function attached to as
+ # an attribute.
+ class VimPathFinder(object):
+ @classmethod
+ def find_module(cls, fullname, path=None):
+ try:
+ return VimModuleLoader(_find_module(fullname, fullname, path or vim._get_paths()))
+ except ImportError:
+ return None
+
+ @classmethod
+ def load_module(cls, fullname, path=None):
+ return _find_module(fullname, fullname, path or vim._get_paths())
+
+ def hook(path):
+ if path == vim.VIM_SPECIAL_PATH:
+ return VimPathFinder
+ else:
+ raise ImportError
+
+ sys.path_hooks.append(hook)
+
+vim.VIM_SPECIAL_PATH *python-VIM_SPECIAL_PATH*
+ String constant used in conjunction with vim path hook. If path hook
+ installed by vim is requested to handle anything but path equal to
+ vim.VIM_SPECIAL_PATH constant it raises ImportError. In the only other
+ case it uses special loader.
+
+ Note: you must not use value of this constant directly, always use
+ vim.VIM_SPECIAL_PATH object.
+
+vim.find_module(...) *python-find_module*
+vim.path_hook(path) *python-path_hook*
+ Methods or objects used to implement path loading as described above.
+ You should not be using any of these directly except for vim.path_hook
+ in case you need to do something with sys.meta_path. It is not
+ guaranteed that any of the objects will exist in the future vim
+ versions.
+
+vim._get_paths *python-_get_paths*
+ Methods returning a list of paths which will be searched for by path
+ hook. You should not rely on this method being present in future
+ versions, but can use it for debugging.
+
+ It returns a list of {rtp}/python2 (or {rtp}/python3) and
+ {rtp}/pythonx directories for each {rtp} in 'runtimepath'.
+
+==============================================================================
+3. Buffer objects *python-buffer*
+
+Buffer objects represent vim buffers. You can obtain them in a number of ways:
+ - via vim.current.buffer (|python-current|)
+ - from indexing vim.buffers (|python-buffers|)
+ - from the "buffer" attribute of a window (|python-window|)
+
+Buffer objects have two read-only attributes - name - the full file name for
+the buffer, and number - the buffer number. They also have three methods
+(append, mark, and range; see below).
+
+You can also treat buffer objects as sequence objects. In this context, they
+act as if they were lists (yes, they are mutable) of strings, with each
+element being a line of the buffer. All of the usual sequence operations,
+including indexing, index assignment, slicing and slice assignment, work as
+you would expect. Note that the result of indexing (slicing) a buffer is a
+string (list of strings). This has one unusual consequence - b[:] is different
+from b. In particular, "b[:] = None" deletes the whole of the buffer, whereas
+"b = None" merely updates the variable b, with no effect on the buffer.
+
+Buffer indexes start at zero, as is normal in Python. This differs from vim
+line numbers, which start from 1. This is particularly relevant when dealing
+with marks (see below) which use vim line numbers.
+
+The buffer object attributes are:
+ b.vars Dictionary-like object used to access
+ |buffer-variable|s.
+ b.options Mapping object (supports item getting, setting and
+ deleting) that provides access to buffer-local options
+ and buffer-local values of |global-local| options. Use
+ |python-window|.options if option is window-local,
+ this object will raise KeyError. If option is
+ |global-local| and local value is missing getting it
+ will return None.
+ b.name String, RW. Contains buffer name (full path).
+ Note: when assigning to b.name |BufFilePre| and
+ |BufFilePost| autocommands are launched.
+ b.number Buffer number. Can be used as |python-buffers| key.
+ Read-only.
+ b.valid True or False. Buffer object becomes invalid when
+ corresponding buffer is wiped out.
+
+The buffer object methods are:
+ b.append(str) Append a line to the buffer
+ b.append(str, nr) Idem, below line "nr"
+ b.append(list) Append a list of lines to the buffer
+ Note that the option of supplying a list of strings to
+ the append method differs from the equivalent method
+ for Python's built-in list objects.
+ b.append(list, nr) Idem, below line "nr"
+ b.mark(name) Return a tuple (row,col) representing the position
+ of the named mark (can also get the []"<> marks)
+ b.range(s,e) Return a range object (see |python-range|) which
+ represents the part of the given buffer between line
+ numbers s and e |inclusive|.
+
+Note that when adding a line it must not contain a line break character '\n'.
+A trailing '\n' is allowed and ignored, so that you can do: >
+ :py b.append(f.readlines())
+
+Buffer object type is available using "Buffer" attribute of vim module.
+
+Examples (assume b is the current buffer) >
+ :py print b.name # write the buffer file name
+ :py b[0] = "hello!!!" # replace the top line
+ :py b[:] = None # delete the whole buffer
+ :py del b[:] # delete the whole buffer
+ :py b[0:0] = [ "a line" ] # add a line at the top
+ :py del b[2] # delete a line (the third)
+ :py b.append("bottom") # add a line at the bottom
+ :py n = len(b) # number of lines
+ :py (row,col) = b.mark('a') # named mark
+ :py r = b.range(1,5) # a sub-range of the buffer
+ :py b.vars["foo"] = "bar" # assign b:foo variable
+ :py b.options["ff"] = "dos" # set fileformat
+ :py del b.options["ar"] # same as :set autoread<
+
+==============================================================================
+4. Range objects *python-range*
+
+Range objects represent a part of a vim buffer. You can obtain them in a
+number of ways:
+ - via vim.current.range (|python-current|)
+ - from a buffer's range() method (|python-buffer|)
+
+A range object is almost identical in operation to a buffer object. However,
+all operations are restricted to the lines within the range (this line range
+can, of course, change as a result of slice assignments, line deletions, or
+the range.append() method).
+
+The range object attributes are:
+ r.start Index of first line into the buffer
+ r.end Index of last line into the buffer
+
+The range object methods are:
+ r.append(str) Append a line to the range
+ r.append(str, nr) Idem, after line "nr"
+ r.append(list) Append a list of lines to the range
+ Note that the option of supplying a list of strings to
+ the append method differs from the equivalent method
+ for Python's built-in list objects.
+ r.append(list, nr) Idem, after line "nr"
+
+Range object type is available using "Range" attribute of vim module.
+
+Example (assume r is the current range):
+ # Send all lines in a range to the default printer
+ vim.command("%d,%dhardcopy!" % (r.start+1,r.end+1))
+
+==============================================================================
+5. Window objects *python-window*
+
+Window objects represent vim windows. You can obtain them in a number of ways:
+ - via vim.current.window (|python-current|)
+ - from indexing vim.windows (|python-windows|)
+ - from indexing "windows" attribute of a tab page (|python-tabpage|)
+ - from the "window" attribute of a tab page (|python-tabpage|)
+
+You can manipulate window objects only through their attributes. They have no
+methods, and no sequence or other interface.
+
+Window attributes are:
+ buffer (read-only) The buffer displayed in this window
+ cursor (read-write) The current cursor position in the window
+ This is a tuple, (row,col).
+ height (read-write) The window height, in rows
+ width (read-write) The window width, in columns
+ vars (read-only) The window |w:| variables. Attribute is
+ unassignable, but you can change window
+ variables this way
+ options (read-only) The window-local options. Attribute is
+ unassignable, but you can change window
+ options this way. Provides access only to
+ window-local options, for buffer-local use
+ |python-buffer| and for global ones use
+ |python-options|. If option is |global-local|
+ and local value is missing getting it will
+ return None.
+ number (read-only) Window number. The first window has number 1.
+ This is zero in case it cannot be determined
+ (e.g. when the window object belongs to other
+ tab page).
+ row, col (read-only) On-screen window position in display cells.
+ First position is zero.
+ tabpage (read-only) Window tab page.
+ valid (read-write) True or False. Window object becomes invalid
+ when corresponding window is closed.
+
+The height attribute is writable only if the screen is split horizontally.
+The width attribute is writable only if the screen is split vertically.
+
+Window object type is available using "Window" attribute of vim module.
+
+==============================================================================
+6. Tab page objects *python-tabpage*
+
+Tab page objects represent vim tab pages. You can obtain them in a number of
+ways:
+ - via vim.current.tabpage (|python-current|)
+ - from indexing vim.tabpages (|python-tabpages|)
+
+You can use this object to access tab page windows. They have no methods and
+no sequence or other interfaces.
+
+Tab page attributes are:
+ number The tab page number like the one returned by
+ |tabpagenr()|.
+ windows Like |python-windows|, but for current tab page.
+ vars The tab page |t:| variables.
+ window Current tabpage window.
+ valid True or False. Tab page object becomes invalid when
+ corresponding tab page is closed.
+
+TabPage object type is available using "TabPage" attribute of vim module.
+
+==============================================================================
+7. vim.bindeval objects *python-bindeval-objects*
+
+vim.Dictionary object *python-Dictionary*
+ Dictionary-like object providing access to vim |Dictionary| type.
+ Attributes:
+ Attribute Description ~
+ locked One of *python-.locked*
+ Value Description ~
+ zero Variable is not locked
+ vim.VAR_LOCKED Variable is locked, but can be unlocked
+ vim.VAR_FIXED Variable is locked and can't be unlocked
+ Read-write. You can unlock locked variable by assigning
+ `True` or `False` to this attribute. No recursive locking
+ is supported.
+ scope One of
+ Value Description ~
+ zero Dictionary is not a scope one
+ vim.VAR_DEF_SCOPE |g:| or |l:| dictionary
+ vim.VAR_SCOPE Other scope dictionary,
+ see |internal-variables|
+ Methods (note: methods do not support keyword arguments):
+ Method Description ~
+ keys() Returns a list with dictionary keys.
+ values() Returns a list with dictionary values.
+ items() Returns a list of 2-tuples with dictionary contents.
+ update(iterable), update(dictionary), update(**kwargs)
+ Adds keys to dictionary.
+ get(key[, default=None])
+ Obtain key from dictionary, returning the default if it is
+ not present.
+ pop(key[, default])
+ Remove specified key from dictionary and return
+ corresponding value. If key is not found and default is
+ given returns the default, otherwise raises KeyError.
+ popitem()
+ Remove random key from dictionary and return (key, value)
+ pair.
+ has_key(key)
+ Check whether dictionary contains specified key, similar
+ to `key in dict`.
+
+ __new__(), __new__(iterable), __new__(dictionary), __new__(update)
+ You can use `vim.Dictionary()` to create new vim
+ dictionaries. `d=vim.Dictionary(arg)` is the same as
+ `d=vim.bindeval('{}');d.update(arg)`. Without arguments
+ constructs empty dictionary.
+
+ Examples: >
+ d = vim.Dictionary(food="bar") # Constructor
+ d['a'] = 'b' # Item assignment
+ print d['a'] # getting item
+ d.update({'c': 'd'}) # .update(dictionary)
+ d.update(e='f') # .update(**kwargs)
+ d.update((('g', 'h'), ('i', 'j'))) # .update(iterable)
+ for key in d.keys(): # .keys()
+ for val in d.values(): # .values()
+ for key, val in d.items(): # .items()
+ print isinstance(d, vim.Dictionary) # True
+ for key in d: # Iteration over keys
+ class Dict(vim.Dictionary): # Subclassing
+<
+ Note: when iterating over keys you should not modify dictionary.
+
+vim.List object *python-List*
+ Sequence-like object providing access to vim |List| type.
+ Supports `.locked` attribute, see |python-.locked|. Also supports the
+ following methods:
+ Method Description ~
+ extend(item) Add items to the list.
+
+ __new__(), __new__(iterable)
+ You can use `vim.List()` to create new vim lists.
+ `l=vim.List(iterable)` is the same as
+ `l=vim.bindeval('[]');l.extend(iterable)`. Without
+ arguments constructs empty list.
+ Examples: >
+ l = vim.List("abc") # Constructor, result: ['a', 'b', 'c']
+ l.extend(['abc', 'def']) # .extend() method
+ print l[1:] # slicing
+ l[:0] = ['ghi', 'jkl'] # slice assignment
+ print l[0] # getting item
+ l[0] = 'mno' # assignment
+ for i in l: # iteration
+ print isinstance(l, vim.List) # True
+ class List(vim.List): # Subclassing
+
+vim.Function object *python-Function*
+ Function-like object, acting like vim |Funcref| object. Accepts special
+ keyword argument `self`, see |Dictionary-function|. You can also use
+ `vim.Function(name)` constructor, it is the same as
+ `vim.bindeval('function(%s)'%json.dumps(name))`.
+
+ Attributes (read-only):
+ Attribute Description ~
+ name Function name.
+ args `None` or a |python-List| object with arguments. Note
+ that this is a copy of the arguments list, constructed
+ each time you request this attribute. Modifications made
+ to the list will be ignored (but not to the containers
+ inside argument list: this is like |copy()| and not
+ |deepcopy()|).
+ self `None` or a |python-Dictionary| object with self
+ dictionary. Note that explicit `self` keyword used when
+ calling resulting object overrides this attribute.
+ auto_rebind Boolean. True if partial created from this Python object
+ and stored in the Vim script dictionary should be
+ automatically rebound to the dictionary it is stored in
+ when this dictionary is indexed. Exposes Vim internal
+ difference between `dict.func` (auto_rebind=True) and
+ `function(dict.func,dict)` (auto_rebind=False). This
+ attribute makes no sense if `self` attribute is `None`.
+
+ Constructor additionally accepts `args`, `self` and `auto_rebind`
+ keywords. If `args` and/or `self` argument is given then it constructs
+ a partial, see |function()|. `auto_rebind` is only used when `self`
+ argument is given, otherwise it is assumed to be `True` regardless of
+ whether it was given or not. If `self` is given then it defaults to
+ `False`.
+
+ Examples: >
+ f = vim.Function('tr') # Constructor
+ print f('abc', 'a', 'b') # Calls tr('abc', 'a', 'b')
+ vim.command('''
+ function DictFun() dict
+ return self
+ endfunction
+ ''')
+ f = vim.bindeval('function("DictFun")')
+ print f(self={}) # Like call('DictFun', [], {})
+ print isinstance(f, vim.Function) # True
+
+ p = vim.Function('DictFun', self={})
+ print f()
+ p = vim.Function('tr', args=['abc', 'a'])
+ print f('b')
+
+==============================================================================
+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 Vim script.
+|pyxeval()| is also available.
+
+The Python value "None" is converted to v:none.
+
+==============================================================================
+9. Dynamic loading *python-dynamic*
+
+On MS-Windows and Unix the Python library can be loaded dynamically. The
+|:version| output then includes |+python/dyn| or |+python3/dyn|.
+
+This means that Vim will search for the Python DLL or shared library file only
+when needed. When you don't use the Python interface you don't need it, thus
+you can use Vim without this file.
+
+
+MS-Windows ~
+
+To use the Python interface the Python DLL must be in your search path. In a
+console window type "path" to see what directories are used. The 'pythondll'
+or 'pythonthreedll' option can be also used to specify the Python DLL.
+
+The name of the DLL should match the Python version Vim was compiled with.
+Currently the name for Python 2 is "python27.dll", that is for Python 2.7.
+That is the default value for 'pythondll'. For Python 3 it is python36.dll
+(Python 3.6). To know for sure edit "gvim.exe" and search for
+"python\d*.dll\c".
+
+
+Unix ~
+
+The 'pythondll' or 'pythonthreedll' option can be used to specify the Python
+shared library file instead of DYNAMIC_PYTHON_DLL or DYNAMIC_PYTHON3_DLL file
+what were specified at compile time. The version of the shared library must
+match the Python 2.x or Python 3 version Vim was compiled with.
+
+==============================================================================
+10. Python 3 *python3*
+
+ *:py3* *:python3*
+:[range]py3 {stmt}
+:[range]py3 << [trim] [{endmarker}]
+{script}
+{endmarker}
+
+:[range]python3 {stmt}
+:[range]python3 << [trim] [{endmarker}]
+{script}
+{endmarker}
+ 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*
+:[range]py3f[ile] {file}
+ The `:py3file` command works similar to `:pyfile`.
+ *:py3do*
+:[range]py3do {body}
+ The `:py3do` command works similar to `:pydo`.
+
+
+Vim can be built in four ways (:version output):
+1. No Python support (-python, -python3)
+2. Python 2 support only (+python or +python/dyn, -python3)
+3. Python 3 support only (-python, +python3 or +python3/dyn)
+4. Python 2 and 3 support (+python/dyn, +python3/dyn)
+
+Some more details on the special case 4: *python-2-and-3*
+
+When Python 2 and Python 3 are both supported they must be loaded dynamically.
+
+When doing this on Linux/Unix systems and importing global symbols, this leads
+to a crash when the second Python version is used. So either global symbols
+are loaded but only one Python version is activated, or no global symbols are
+loaded. The latter makes Python's "import" fail on libraries that expect the
+symbols to be provided by Vim.
+ *E836* *E837*
+Vim's configuration script makes a guess for all libraries based on one
+standard Python library (termios). If importing this library succeeds for
+both Python versions, then both will be made available in Vim at the same
+time. If not, only the version first used in a session will be enabled.
+When trying to use the other one you will get the E836 or E837 error message.
+
+Here Vim's behavior depends on the system in which it was configured. In a
+system where both versions of Python were configured with --enable-shared,
+both versions of Python will be activated at the same time. There will still
+be problems with other third party libraries that were not linked to
+libPython.
+
+To work around such problems there are these options:
+1. The problematic library is recompiled to link to the according
+ libpython.so.
+2. Vim is recompiled for only one Python version.
+3. You undefine PY_NO_RTLD_GLOBAL in auto/config.h after configuration. This
+ may crash Vim though.
+
+ *E880*
+Raising SystemExit exception in python isn't endorsed way to quit vim, use: >
+ :py vim.command("qall!")
+<
+ *E1266*
+This error can occur when Python 3 cannot load the required modules. This
+means that your Python 3 is not correctly installed or there are some mistakes
+in your settings. Please check the following items:
+1. Make sure that Python 3 is correctly installed. Also check the version of
+ python.
+2. Check the 'pythonthreedll' option.
+3. Check the 'pythonthreehome' option.
+4. Check the PATH environment variable if you don't set 'pythonthreedll'.
+ On MS-Windows, you can use where.exe to check which dll will be loaded.
+ E.g. >
+ where.exe python310.dll
+5. Check the PYTHONPATH and PYTHONHOME environment variables.
+
+ *has-python*
+You can test what Python version is available with: >
+ if has('python')
+ echo 'there is Python 2.x'
+ endif
+ if has('python3')
+ echo 'there is Python 3.x'
+ endif
+
+Note however, that when Python 2 and 3 are both available and loaded
+dynamically, these has() calls will try to load them. If only one can be
+loaded at a time, just checking if Python 2 or 3 are available will prevent
+the other one from being available.
+
+To avoid loading the dynamic library, only check if Vim was compiled with
+python support: >
+ if has('python_compiled')
+ echo 'compiled with Python 2.x support'
+ if has('python_dynamic')
+ echo 'Python 2.x dynamically loaded'
+ endif
+ endif
+ if has('python3_compiled')
+ echo 'compiled with Python 3.x support'
+ if has('python3_dynamic')
+ echo 'Python 3.x dynamically loaded'
+ endif
+ endif
+
+This also tells you whether Python is dynamically loaded, which will fail if
+the runtime library cannot be found.
+
+==============================================================================
+11. 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 exactly
+the same as the Python 2 and 3 variants, but select the Python version using
+the 'pyxversion' setting.
+
+You should set 'pyxversion' in your |.vimrc| to prefer Python 2 or Python 3
+for Python commands. If you change this setting at runtime you may risk that
+state of plugins (such as initialization) may be lost.
+
+If you want to use a module, you can put it in the {rtp}/pythonx directory.
+See |pythonx-directory|.
+
+ *:pyx* *:pythonx*
+The `:pyx` and `:pythonx` commands work similar to `:python`. A simple check
+if the `:pyx` command is working: >
+ :pyx print("Hello")
+
+To see what version of Python is being used: >
+ :pyx import sys
+ :pyx print(sys.version)
+<
+ *:pyxfile* *python_x-special-comments*
+The `:pyxfile` command works similar to `:pyfile`. However you can add one of
+these comments to force Vim using `: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' setting 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*
+The `:pyxdo` command works similar to `:pydo`.
+
+ *has-pythonx*
+You can test if pyx* commands are available with: >
+ if has('pythonx')
+ echo 'pyx* commands are available. (Python ' .. &pyx .. ')'
+ endif
+
+When compiled with only one of |+python| or |+python3|, the has() returns 1.
+When compiled with both |+python| and |+python3|, the test depends on the
+'pyxversion' setting. If 'pyxversion' is 0, it tests Python 3 first, and if
+it is not available then Python 2. If 'pyxversion' is 2 or 3, it tests only
+Python 2 or 3 respectively.
+
+Note that for `has('pythonx')` to work it may try to dynamically load Python 3
+or 2. This may have side effects, especially when Vim can only load one of
+the two.
+
+If a user prefers Python 2 and want to fallback to Python 3, he needs to set
+'pyxversion' explicitly in his |.vimrc|. E.g.: >
+ if has('python')
+ set pyx=2
+ elseif has('python3')
+ set pyx=3
+ endif
+
+==============================================================================
+12. Building with Python support *python-building*
+
+A few hints for building with Python 2 or 3 support.
+
+UNIX
+
+See src/Makefile for how to enable including the Python interface.
+
+On Ubuntu you will want to install these packages for Python 2:
+ python
+ python-dev
+For Python 3:
+ python3
+ python3-dev
+For Python 3.6:
+ python3.6
+ python3.6-dev
+
+If you have more than one version of Python 3, you need to link python3 to the
+one you prefer, before running configure.
+
+==============================================================================
+ 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 0000000..caecc6d
--- /dev/null
+++ b/runtime/doc/if_ruby.txt
@@ -0,0 +1,254 @@
+*if_ruby.txt* For Vim version 9.0. Last change: 2019 Jul 21
+
+
+ VIM REFERENCE MANUAL by Shugo Maeda
+
+The Ruby Interface to Vim *ruby* *Ruby*
+
+
+1. Commands |ruby-commands|
+2. The Vim module |ruby-vim|
+3. Vim::Buffer objects |ruby-buffer|
+4. Vim::Window objects |ruby-window|
+5. Global variables |ruby-globals|
+6. rubyeval() Vim function |ruby-rubyeval|
+7. Dynamic loading |ruby-dynamic|
+
+ *E266* *E267* *E268* *E269* *E270* *E271* *E272* *E273*
+
+{only available when Vim was compiled with the |+ruby| feature}
+
+The home page for ruby is http://www.ruby-lang.org/. You can find links for
+downloading Ruby there.
+
+==============================================================================
+1. Commands *ruby-commands*
+
+ *:ruby* *:rub*
+:rub[y] {cmd} Execute Ruby command {cmd}. A command to try it out: >
+ :ruby print "Hello"
+
+:rub[y] << [trim] [{endmarker}]
+{script}
+{endmarker}
+ Execute Ruby script {script}.
+
+ If [endmarker] is omitted, it defaults to a dot '.'
+ like for the |:append| and |:insert| commands. Refer
+ to |:let-heredoc| for more information.
+
+
+ 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-blob*
+Vim::blob({arg})
+ Return |Blob| literal string from {arg}.
+
+ *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 Integer if the Vim expression evaluates to a number
+ - a Float if the Vim expression evaluates to a float
+ - a String if the Vim expression evaluates to a string
+ - a Array if the Vim expression evaluates to a Vim list
+ - a Hash if the Vim expression evaluates to a Vim dictionary
+ Dictionaries and lists are recursively expanded.
+
+==============================================================================
+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 full 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.
+ First line number is 1 and first column number is 0.
+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.
+
+==============================================================================
+6. rubyeval() Vim function *ruby-rubyeval*
+
+To facilitate bi-directional interface, you can use |rubyeval()| function to
+evaluate Ruby expressions and pass their values to Vim script.
+
+The Ruby value "true", "false" and "nil" are converted to v:true, v:false and
+v:null, respectively.
+
+==============================================================================
+7. Dynamic loading *ruby-dynamic*
+
+On MS-Windows and Unix the Ruby library can be loaded dynamically. The
+|:version| output then includes |+ruby/dyn|.
+
+This means that Vim will search for the Ruby DLL file or shared library only
+when needed. When you don't use the Ruby interface you don't need it, thus
+you can use Vim even though this library file is not on your system.
+
+
+MS-Windows ~
+
+You need to install the right version of Ruby for this to work. You can find
+the package to download from:
+http://rubyinstaller.org/downloads/
+Currently that is rubyinstaller-2.2.5.exe
+
+To use the Ruby interface the Ruby DLL must be in your search path. In a
+console window type "path" to see what directories are used. The 'rubydll'
+option can be also used to specify the Ruby DLL.
+
+The name of the DLL must match the Ruby version Vim was compiled with.
+Currently the name is "msvcrt-ruby220.dll". That is for Ruby 2.2.X. To know
+for sure edit "gvim.exe" and search for "ruby\d*.dll\c".
+
+If you want to build Vim with RubyInstaller 1.9 or 2.X using MSVC, you need
+some tricks. See the src/INSTALLpc.txt for detail.
+
+If Vim is built with RubyInstaller 2.4 or later, you may also need to add
+"C:\Ruby<version>\bin\ruby_builtin_dlls" to the PATH environment variable.
+
+
+Unix ~
+
+The 'rubydll' option can be used to specify the Ruby shared library file
+instead of DYNAMIC_RUBY_DLL file what was specified at compile time. The
+version of the shared library must match the Ruby version Vim was compiled
+with.
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/if_sniff.txt b/runtime/doc/if_sniff.txt
new file mode 100644
index 0000000..27db688
--- /dev/null
+++ b/runtime/doc/if_sniff.txt
@@ -0,0 +1,11 @@
+*if_sniff.txt* For Vim version 9.0. Last change: 2016 Feb 27
+
+
+ VIM REFERENCE MANUAL
+ by Anton Leherbauer (toni@takefive.co.at)
+
+
+The SNiFF+ support was removed at patch 7.4.1433. If you want to check it out
+sync to before that.
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/if_tcl.txt b/runtime/doc/if_tcl.txt
new file mode 100644
index 0000000..7091469
--- /dev/null
+++ b/runtime/doc/if_tcl.txt
@@ -0,0 +1,546 @@
+*if_tcl.txt* For Vim version 9.0. Last change: 2022 Jan 08
+
+
+ VIM REFERENCE MANUAL by Ingo Wilken
+
+
+The Tcl Interface to Vim *tcl* *Tcl* *TCL*
+
+1. Commands |tcl-ex-commands|
+2. Tcl commands |tcl-commands|
+3. Tcl variables |tcl-variables|
+4. Tcl window commands |tcl-window-cmds|
+5. Tcl buffer commands |tcl-buffer-cmds|
+6. Miscellaneous; Output from Tcl |tcl-misc| |tcl-output|
+7. Known bugs & problems |tcl-bugs|
+8. Examples |tcl-examples|
+9. Dynamic loading |tcl-dynamic|
+
+{only available when Vim was compiled with the |+tcl| feature}
+
+ *E280*
+WARNING: There are probably still some bugs. Please send bug reports,
+comments, ideas etc to <Ingo.Wilken@informatik.uni-oldenburg.de>
+
+==============================================================================
+1. Commands *tcl-ex-commands* *E571* *E572*
+
+ *:tcl*
+:tcl {cmd} Execute Tcl command {cmd}. A simple check if `:tcl`
+ is working: >
+ :tcl puts "Hello"
+
+:[range]tcl << [trim] [{endmarker}]
+{script}
+{endmarker}
+ Execute Tcl script {script}.
+ Note: This command doesn't work when the Tcl feature
+ wasn't compiled in. To avoid errors, see
+ |script-here|.
+
+If [endmarker] is omitted from after the "<<", a dot '.' must be used after
+{script}, like for the |:append| and |:insert| commands. Refer to
+|:let-heredoc| for more information.
+
+This form of the |:tcl| command is mainly useful for including tcl code in Vim
+scripts.
+
+Example: >
+ function! DefineDate()
+ tcl << EOF
+ proc date {} {
+ return [clock format [clock seconds]]
+ }
+ EOF
+ endfunction
+<
+To see what version of Tcl you have: >
+ :tcl puts [info patchlevel]
+<
+
+ *:tcldo* *:tcld*
+:[range]tcld[o] {cmd} Execute Tcl command {cmd} for each line in [range]
+ with the variable "line" being set to the text of each
+ line in turn, and "lnum" to the line number. Setting
+ "line" will change the text, but note that it is not
+ possible to add or delete lines using this command.
+ If {cmd} returns an error, the command is interrupted.
+ The default for [range] is the whole file: "1,$".
+ See |tcl-var-line| and |tcl-var-lnum|.
+
+ *:tclfile* *:tclf*
+:tclf[ile] {file} Execute the Tcl script in {file}. This is the same as
+ ":tcl source {file}", but allows file name completion.
+
+
+Note that Tcl objects (like variables) persist from one command to the next,
+just as in the Tcl shell.
+
+Executing Tcl commands is not possible in the |sandbox|.
+
+==============================================================================
+2. Tcl commands *tcl-commands*
+
+Tcl code gets all of its access to vim via commands in the "::vim" namespace.
+The following commands are implemented: >
+
+ ::vim::beep # Guess.
+ ::vim::buffer {n} # Create Tcl command for one buffer.
+ ::vim::buffer list # Create Tcl commands for all buffers.
+ ::vim::command [-quiet] {cmd} # Execute an Ex command.
+ ::vim::expr {expr} # Use Vim's expression evaluator.
+ ::vim::option {opt} # Get vim option.
+ ::vim::option {opt} {val} # Set vim option.
+ ::vim::window list # Create Tcl commands for all windows.
+
+Commands:
+ ::vim::beep *tcl-beep*
+ Honk. Does not return a result.
+
+ ::vim::buffer {n} *tcl-buffer*
+ ::vim::buffer exists {n}
+ ::vim::buffer list
+ Provides access to vim buffers. With an integer argument, creates a
+ buffer command (see |tcl-buffer-cmds|) for the buffer with that
+ number, and returns its name as the result. Invalid buffer numbers
+ result in a standard Tcl error. To test for valid buffer numbers,
+ vim's internal functions can be used: >
+ set nbufs [::vim::expr bufnr("$")]
+ set isvalid [::vim::expr "bufexists($n)"]
+< The "list" option creates a buffer command for each valid buffer, and
+ returns a list of the command names as the result.
+ Example: >
+ set bufs [::vim::buffer list]
+ foreach b $bufs { $b append end "The End!" }
+< The "exists" option checks if a buffer with the given number exists.
+ Example: >
+ if { [::vim::buffer exists $n] } { ::vim::command ":e #$n" }
+< This command might be replaced by a variable in future versions.
+ See also |tcl-var-current| for the current buffer.
+
+ ::vim::command {cmd} *tcl-command*
+ ::vim::command -quiet {cmd}
+ Execute the vim (ex-mode) command {cmd}. Any Ex command that affects
+ a buffer or window uses the current buffer/current window. Does not
+ return a result other than a standard Tcl error code. After this
+ command is completed, the "::vim::current" variable is updated.
+ The "-quiet" flag suppresses any error messages from vim.
+ Examples: >
+ ::vim::command "set ts=8"
+ ::vim::command "%s/foo/bar/g"
+< To execute normal-mode commands, use "normal" (see |:normal|): >
+ set cmd "jj"
+ ::vim::command "normal $cmd"
+< See also |tcl-window-command| and |tcl-buffer-command|.
+
+ ::vim::expr {expr} *tcl-expr*
+ Evaluates the expression {expr} using vim's internal expression
+ evaluator (see |expression|). Any expression that queries a buffer
+ or window property uses the current buffer/current window. Returns
+ the result as a string. A |List| is turned into a string by joining
+ the items and inserting line breaks.
+ Examples: >
+ set perl_available [::vim::expr has("perl")]
+< See also |tcl-window-expr| and |tcl-buffer-expr|.
+
+ ::vim::option {opt} *tcl-option*
+ ::vim::option {opt} {value}
+ Without second argument, queries the value of a vim option. With this
+ argument, sets the vim option to {value}, and returns the previous
+ value as the result. Any options that are marked as 'local to buffer'
+ or 'local to window' affect the current buffer/current window. The
+ global value is not changed, use the ":set" command for that. For
+ boolean options, {value} should be "0" or "1", or any of the keywords
+ "on", "off" or "toggle". See |option-summary| for a list of options.
+ Example: >
+ ::vim::option ts 8
+< See also |tcl-window-option| and |tcl-buffer-option|.
+
+ ::vim::window {option} *tcl-window*
+ Provides access to vim windows. Currently only the "list" option is
+ implemented. This creates a window command (see |tcl-window-cmds|) for
+ each window, and returns a list of the command names as the result.
+ Example: >
+ set wins [::vim::window list]
+ foreach w $wins { $w height 4 }
+< This command might be replaced by a variable in future versions.
+ See also |tcl-var-current| for the current window.
+
+==============================================================================
+3. Tcl variables *tcl-variables*
+
+The ::vim namespace contains a few variables. These are created when the Tcl
+interpreter is called from vim and set to current values. >
+
+ ::vim::current # array containing "current" objects
+ ::vim::lbase # number of first line
+ ::vim::range # array containing current range numbers
+ line # current line as a string (:tcldo only)
+ lnum # current line number (:tcldo only)
+
+Variables:
+ ::vim::current *tcl-var-current*
+ This is an array providing access to various "current" objects
+ available in vim. The contents of this array are updated after
+ "::vim::command" is called, as this might change vim's current
+ settings (e.g., by deleting the current buffer).
+ The "buffer" element contains the name of the buffer command for the
+ current buffer. This can be used directly to invoke buffer commands
+ (see |tcl-buffer-cmds|). This element is read-only.
+ Example: >
+ $::vim::current(buffer) insert begin "Hello world"
+< The "window" element contains the name of the window command for the
+ current window. This can be used directly to invoke window commands
+ (see |tcl-window-cmds|). This element is read-only.
+ Example: >
+ $::vim::current(window) height 10
+<
+ ::vim::lbase *tcl-var-lbase*
+ This variable controls how Tcl treats line numbers. If it is set to
+ '1', then lines and columns start at 1. This way, line numbers from
+ Tcl commands and vim expressions are compatible. If this variable is
+ set to '0', then line numbers and columns start at 0 in Tcl. This is
+ useful if you want to treat a buffer as a Tcl list or a line as a Tcl
+ string and use standard Tcl commands that return an index ("lsort" or
+ "string first", for example). The default value is '1'. Currently,
+ any non-zero values is treated as '1', but your scripts should not
+ rely on this. See also |tcl-linenumbers|.
+
+ ::vim::range *tcl-var-range*
+ This is an array with three elements, "start", "begin" and "end". It
+ contains the line numbers of the start and end row of the current
+ range. "begin" is the same as "start". This variable is read-only.
+ See |tcl-examples|.
+
+ line *tcl-var-line*
+ lnum *tcl-var-lnum*
+ These global variables are only available if the ":tcldo" Ex command
+ is being executed. They contain the text and line number of the
+ current line. When the Tcl command invoked by ":tcldo" is completed,
+ the current line is set to the contents of the "line" variable, unless
+ the variable was unset by the Tcl command. The "lnum" variable is
+ read-only. These variables are not in the "::vim" namespace so they
+ can be used in ":tcldo" without much typing (this might be changed in
+ future versions). See also |tcl-linenumbers|.
+
+==============================================================================
+4. Tcl window commands *tcl-window-cmds*
+
+Window commands represent vim windows. They are created by several commands:
+ ::vim::window list |tcl-window|
+ "windows" option of a buffer command |tcl-buffer-windows|
+The ::vim::current(window) variable contains the name of the window command
+for the current window. A window command is automatically deleted when the
+corresponding vim window is closed.
+
+Let's assume the name of the window command is stored in the Tcl variable "win",
+i.e. "$win" calls the command. The following options are available: >
+
+ $win buffer # Create Tcl command for window's buffer.
+ $win command {cmd} # Execute Ex command in windows context.
+ $win cursor # Get current cursor position.
+ $win cursor {var} # Set cursor position from array variable.
+ $win cursor {row} {col} # Set cursor position.
+ $win delcmd {cmd} # Call Tcl command when window is closed.
+ $win expr {expr} # Evaluate vim expression in windows context.
+ $win height # Report the window's height.
+ $win height {n} # Set the window's height.
+ $win option {opt} [val] # Get/Set vim option in windows context.
+
+Options:
+ $win buffer *tcl-window-buffer*
+ Creates a Tcl command for the window's buffer, and returns its name as
+ the result. The name should be stored in a variable: >
+ set buf [$win buffer]
+< $buf is now a valid Tcl command. See |tcl-buffer-cmds| for the
+ available options.
+
+ $win cursor *tcl-window-cursor*
+ $win cursor {var}
+ $win cursor {row} {col}
+ Without argument, reports the current cursor position as a string.
+ This can be converted to a Tcl array variable: >
+ array set here [$win cursor]
+< "here(row)" and "here(column)" now contain the cursor position.
+ With a single argument, the argument is interpreted as the name of a
+ Tcl array variable, which must contain two elements "row" and "column".
+ These are used to set the cursor to the new position: >
+ $win cursor here ;# not $here !
+< With two arguments, sets the cursor to the specified row and column: >
+ $win cursor $here(row) $here(column)
+< Invalid positions result in a standard Tcl error, which can be caught
+ with "catch". The row and column values depend on the "::vim::lbase"
+ variable. See |tcl-var-lbase|.
+
+ $win delcmd {cmd} *tcl-window-delcmd*
+ Registers the Tcl command {cmd} as a deletion callback for the window.
+ This command is executed (in the global scope) just before the window
+ is closed. Complex commands should be built with "list": >
+ $win delcmd [list puts vimerr "window deleted"]
+< See also |tcl-buffer-delcmd|.
+
+ $win height *tcl-window-height*
+ $win height {n}
+ Without argument, reports the window's current height. With an
+ argument, tries to set the window's height to {n}, then reports the
+ new height (which might be different from {n}).
+
+ $win command [-quiet] {cmd} *tcl-window-command*
+ $win expr {expr} *tcl-window-expr*
+ $win option {opt} [val] *tcl-window-option*
+ These are similar to "::vim::command" etc., except that everything is
+ done in the context of the window represented by $win, instead of the
+ current window. For example, setting an option that is marked 'local
+ to window' affects the window $win. Anything that affects or queries
+ a buffer uses the buffer displayed in this window (i.e. the buffer
+ that is represented by "$win buffer"). See |tcl-command|, |tcl-expr|
+ and |tcl-option| for more information.
+ Example: >
+ $win option number on
+
+==============================================================================
+5. Tcl buffer commands *tcl-buffer-cmds*
+
+Buffer commands represent vim buffers. They are created by several commands:
+ ::vim::buffer {N} |tcl-buffer|
+ ::vim::buffer list |tcl-buffer|
+ "buffer" option of a window command |tcl-window-buffer|
+The ::vim::current(buffer) variable contains the name of the buffer command
+for the current buffer. A buffer command is automatically deleted when the
+corresponding vim buffer is destroyed. Whenever the buffer's contents are
+changed, all marks in the buffer are automatically adjusted. Any changes to
+the buffer's contents made by Tcl commands can be undone with the "undo" vim
+command (see |undo|).
+
+Let's assume the name of the buffer command is stored in the Tcl variable "buf",
+i.e. "$buf" calls the command. The following options are available: >
+
+ $buf append {n} {str} # Append a line to buffer, after line {n}.
+ $buf command {cmd} # Execute Ex command in buffers context.
+ $buf count # Report number of lines in buffer.
+ $buf delcmd {cmd} # Call Tcl command when buffer is deleted.
+ $buf delete {n} # Delete a single line.
+ $buf delete {n} {m} # Delete several lines.
+ $buf expr {expr} # Evaluate vim expression in buffers context.
+ $buf get {n} # Get a single line as a string.
+ $buf get {n} {m} # Get several lines as a list.
+ $buf insert {n} {str} # Insert a line in buffer, as line {n}.
+ $buf last # Report line number of last line in buffer.
+ $buf mark {mark} # Report position of buffer mark.
+ $buf name # Report name of file in buffer.
+ $buf number # Report number of this buffer.
+ $buf option {opt} [val] # Get/Set vim option in buffers context.
+ $buf set {n} {text} # Replace a single line.
+ $buf set {n} {m} {list} # Replace several lines.
+ $buf windows # Create Tcl commands for buffer's windows.
+<
+ *tcl-linenumbers*
+Most buffer commands take line numbers as arguments. How Tcl treats these
+numbers depends on the "::vim::lbase" variable (see |tcl-var-lbase|). Instead
+of line numbers, several keywords can be also used: "top", "start", "begin",
+"first", "bottom", "end" and "last".
+
+Options:
+ $buf append {n} {str} *tcl-buffer-append*
+ $buf insert {n} {str} *tcl-buffer-insert*
+ Add a line to the buffer. With the "insert" option, the string
+ becomes the new line {n}, with "append" it is inserted after line {n}.
+ Example: >
+ $buf insert top "This is the beginning."
+ $buf append end "This is the end."
+< To add a list of lines to the buffer, use a loop: >
+ foreach line $list { $buf append $num $line ; incr num }
+<
+ $buf count *tcl-buffer-count*
+ Reports the total number of lines in the buffer.
+
+ $buf delcmd {cmd} *tcl-buffer-delcmd*
+ Registers the Tcl command {cmd} as a deletion callback for the buffer.
+ This command is executed (in the global scope) just before the buffer
+ is deleted. Complex commands should be built with "list": >
+ $buf delcmd [list puts vimerr "buffer [$buf number] gone"]
+< See also |tcl-window-delcmd|.
+
+ $buf delete {n} *tcl-buffer-delete*
+ $buf delete {n} {m}
+ Deletes line {n} or lines {n} through {m} from the buffer.
+ This example deletes everything except the last line: >
+ $buf delete first [expr [$buf last] - 1]
+<
+ $buf get {n} *tcl-buffer-get*
+ $buf get {n} {m}
+ Gets one or more lines from the buffer. For a single line, the result
+ is a string; for several lines, a list of strings.
+ Example: >
+ set topline [$buf get top]
+<
+ $buf last *tcl-buffer-last*
+ Reports the line number of the last line. This value depends on the
+ "::vim::lbase" variable. See |tcl-var-lbase|.
+
+ $buf mark {mark} *tcl-buffer-mark*
+ Reports the position of the named mark as a string, similar to the
+ cursor position of the "cursor" option of a window command (see
+ |tcl-window-cursor|). This can be converted to a Tcl array variable: >
+ array set mpos [$buf mark "a"]
+< "mpos(column)" and "mpos(row)" now contain the position of the mark.
+ If the mark is not set, a standard Tcl error results.
+
+ $buf name
+ Reports the name of the file in the buffer. For a buffer without a
+ file, this is an empty string.
+
+ $buf number
+ Reports the number of this buffer. See |:buffers|.
+ This example deletes a buffer from vim: >
+ ::vim::command "bdelete [$buf number]"
+<
+ $buf set {n} {string} *tcl-buffer-set*
+ $buf set {n} {m} {list}
+ Replace one or several lines in the buffer. If the list contains more
+ elements than there are lines to replace, they are inserted into the
+ buffer. If the list contains fewer elements, any unreplaced line is
+ deleted from the buffer.
+
+ $buf windows *tcl-buffer-windows*
+ Creates a window command for each window that displays this buffer, and
+ returns a list of the command names as the result.
+ Example: >
+ set winlist [$buf windows]
+ foreach win $winlist { $win height 4 }
+< See |tcl-window-cmds| for the available options.
+
+ $buf command [-quiet] {cmd} *tcl-buffer-command*
+ $buf expr {expr} *tcl-buffer-expr*
+ $buf option {opt} [val] *tcl-buffer-option*
+ These are similar to "::vim::command" etc., except that everything is
+ done in the context of the buffer represented by $buf, instead of the
+ current buffer. For example, setting an option that is marked 'local
+ to buffer' affects the buffer $buf. Anything that affects or queries
+ a window uses the first window in vim's window list that displays this
+ buffer (i.e. the first entry in the list returned by "$buf windows").
+ See |tcl-command|, |tcl-expr| and |tcl-option| for more information.
+ Example: >
+ if { [$buf option modified] } { $buf command "w" }
+
+==============================================================================
+6. Miscellaneous; Output from Tcl *tcl-misc* *tcl-output*
+
+The standard Tcl commands "exit" and "catch" are replaced by custom versions.
+"exit" terminates the current Tcl script and returns to vim, which deletes the
+Tcl interpreter. Another call to ":tcl" then creates a new Tcl interpreter.
+"exit" does NOT terminate vim! "catch" works as before, except that it does
+not prevent script termination from "exit". An exit code != 0 causes the ex
+command that invoked the Tcl script to return an error.
+
+Two new I/O streams are available in Tcl, "vimout" and "vimerr". All output
+directed to them is displayed in the vim message area, as information messages
+and error messages, respectively. The standard Tcl output streams stdout and
+stderr are mapped to vimout and vimerr, so that a normal "puts" command can be
+used to display messages in vim.
+
+==============================================================================
+7. Known bugs & problems *tcl-bugs*
+
+Calling one of the Tcl Ex commands from inside Tcl (via "::vim::command") may
+have unexpected side effects. The command creates a new interpreter, which
+has the same abilities as the standard interpreter - making "::vim::command"
+available in a safe child interpreter therefore makes the child unsafe. (It
+would be trivial to block nested :tcl* calls or ensure that such calls from a
+safe interpreter create only new safe interpreters, but quite pointless -
+depending on vim's configuration, "::vim::command" may execute arbitrary code
+in any number of other scripting languages.) A call to "exit" within this new
+interpreter does not affect the old interpreter; it only terminates the new
+interpreter, then script processing continues normally in the old interpreter.
+
+Input from stdin is currently not supported.
+
+==============================================================================
+8. Examples: *tcl-examples*
+
+Here are a few small (and maybe useful) Tcl scripts.
+
+This script sorts the lines of the entire buffer (assume it contains a list
+of names or something similar):
+ set buf $::vim::current(buffer)
+ set lines [$buf get top bottom]
+ set lines [lsort -dictionary $lines]
+ $buf set top bottom $lines
+
+This script reverses the lines in the buffer. Note the use of "::vim::lbase"
+and "$buf last" to work with any line number setting.
+ set buf $::vim::current(buffer)
+ set t $::vim::lbase
+ set b [$buf last]
+ while { $t < $b } {
+ set tl [$buf get $t]
+ set bl [$buf get $b]
+ $buf set $t $bl
+ $buf set $b $tl
+ incr t
+ incr b -1
+ }
+
+This script adds a consecutive number to each line in the current range:
+ set buf $::vim::current(buffer)
+ set i $::vim::range(start)
+ set n 1
+ while { $i <= $::vim::range(end) } {
+ set line [$buf get $i]
+ $buf set $i "$n\t$line"
+ incr i ; incr n
+ }
+
+The same can also be done quickly with two Ex commands, using ":tcldo":
+ :tcl set n 1
+ :[range]tcldo set line "$n\t$line" ; incr n
+
+This procedure runs an Ex command on each buffer (idea stolen from Ron Aaron):
+ proc eachbuf { cmd } {
+ foreach b [::vim::buffer list] {
+ $b command $cmd
+ }
+ }
+Use it like this:
+ :tcl eachbuf %s/foo/bar/g
+Be careful with Tcl's string and backslash substitution, tough. If in doubt,
+surround the Ex command with curly braces.
+
+
+If you want to add some Tcl procedures permanently to vim, just place them in
+a file (e.g. "~/.vimrc.tcl" on Unix machines), and add these lines to your
+startup file (usually "~/.vimrc" on Unix):
+ if has("tcl")
+ tclfile ~/.vimrc.tcl
+ endif
+
+==============================================================================
+9. Dynamic loading *tcl-dynamic*
+
+On MS-Windows and Unix the Tcl library can be loaded dynamically. The
+|:version| output then includes |+tcl/dyn|.
+
+This means that Vim will search for the Tcl DLL or shared library file only
+when needed. When you don't use the Tcl interface you don't need it, thus you
+can use Vim without this file.
+
+
+MS-Windows ~
+
+To use the Tcl interface the Tcl DLL must be in your search path. In a
+console window type "path" to see what directories are used. The 'tcldll'
+option can be also used to specify the Tcl DLL.
+
+The name of the DLL must match the Tcl version Vim was compiled with.
+Currently the name is "tcl86.dll". That is for Tcl 8.6. To know for sure
+edit "gvim.exe" and search for "tcl\d*.dll\c".
+
+
+Unix ~
+
+The 'tcldll' option can be used to specify the Tcl shared library file instead
+of DYNAMIC_TCL_DLL file what was specified at compile time. The version of
+the shared library must match the Tcl version Vim was compiled with.
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/indent.txt b/runtime/doc/indent.txt
new file mode 100644
index 0000000..8cae93a
--- /dev/null
+++ b/runtime/doc/indent.txt
@@ -0,0 +1,1260 @@
+*indent.txt* For Vim version 9.0. Last change: 2022 Oct 10
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+This file is about indenting C programs and other files.
+
+1. Indenting C style programs |C-indenting|
+2. Indenting by expression |indent-expression|
+
+==============================================================================
+1. Indenting C style programs *C-indenting*
+
+The basics for C style indenting are explained in section |30.2| of the user
+manual.
+
+Vim has options for automatically indenting C style program files. Many
+programming languages including Java and C++ follow very closely the
+formatting conventions established with C. These options affect only the
+indent and do not perform other formatting. There are additional options that
+affect other kinds of formatting as well as indenting, see |format-comments|,
+|fo-table|, |gq| and |formatting| for the main ones.
+
+There are in fact four main methods available for indentation, each one
+overrides the previous if it is enabled, or non-empty for 'indentexpr':
+'autoindent' uses the indent from the previous line.
+'smartindent' is like 'autoindent' but also recognizes some C syntax to
+ increase/reduce the indent where appropriate.
+'cindent' Works more cleverly than the other two and is configurable to
+ different indenting styles.
+'indentexpr' The most flexible of all: Evaluates an expression to compute
+ the indent of a line. When non-empty this method overrides
+ the other ones. See |indent-expression|.
+The rest of this section describes the 'cindent' option.
+
+Note that 'cindent' indenting does not work for every code scenario. Vim
+is not a C compiler: it does not recognize all syntax. One requirement is
+that toplevel functions have a '{' in the first column. Otherwise they are
+easily confused with declarations.
+
+These five options control C program indenting:
+'cindent' Enables Vim to perform C program indenting automatically.
+'cinkeys' Specifies which keys trigger reindenting in insert mode.
+'cinoptions' Sets your preferred indent style.
+'cinwords' Defines keywords that start an extra indent in the next line.
+'cinscopedecls' Defines strings that are recognized as a C++ scope declaration.
+
+If 'lisp' is not on and 'equalprg' is empty, the "=" operator indents using
+Vim's built-in algorithm rather than calling an external program.
+
+See |autocommand| for how to set the 'cindent' option automatically for C code
+files and reset it for others.
+
+ *cinkeys-format* *indentkeys-format*
+The 'cinkeys' option is a string that controls Vim's indenting in response to
+typing certain characters or commands in certain contexts. Note that this not
+only triggers C-indenting. When 'indentexpr' is not empty 'indentkeys' is
+used instead. The format of 'cinkeys' and 'indentkeys' is equal.
+
+The default is "0{,0},0),0],:,0#,!^F,o,O,e" which specifies that indenting
+occurs as follows:
+
+ "0{" if you type '{' as the first character in a line
+ "0}" if you type '}' as the first character in a line
+ "0)" if you type ')' as the first character in a line
+ "0]" if you type ']' as the first character in a line
+ ":" if you type ':' after a label or case statement
+ "0#" if you type '#' as the first character in a line
+ "!^F" if you type CTRL-F (which is not inserted)
+ "o" if you type a <CR> anywhere or use the "o" command (not in
+ insert mode!)
+ "O" if you use the "O" command (not in insert mode!)
+ "e" if you type the second 'e' for an "else" at the start of a
+ line
+
+Characters that can precede each key: *i_CTRL-F*
+! When a '!' precedes the key, Vim will not insert the key but will
+ instead reindent the current line. This allows you to define a
+ command key for reindenting the current line. CTRL-F is the default
+ key for this. Be careful if you define CTRL-I for this because CTRL-I
+ is the ASCII code for <Tab>.
+* When a '*' precedes the key, Vim will reindent the line before
+ inserting the key. If 'cinkeys' contains "*<Return>", Vim reindents
+ the current line before opening a new line.
+0 When a zero precedes the key (but appears after '!' or '*') Vim will
+ reindent the line only if the key is the first character you type in
+ the line. When used before "=" Vim will only reindent the line if
+ there is only white space before the word.
+
+When neither '!' nor '*' precedes the key, Vim reindents the line after you
+type the key. So ';' sets the indentation of a line which includes the ';'.
+
+Special key names:
+<> Angle brackets mean spelled-out names of keys. For example: "<Up>",
+ "<Ins>" (see |key-notation|).
+^ Letters preceded by a caret (^) are control characters. For example:
+ "^F" is CTRL-F.
+o Reindent a line when you use the "o" command or when Vim opens a new
+ line below the current one (e.g., when you type <Enter> in insert
+ mode).
+O Reindent a line when you use the "O" command.
+e Reindent a line that starts with "else" when you type the second 'e'.
+: Reindent a line when a ':' is typed which is after a label or case
+ statement. Don't reindent for a ":" in "class::method" for C++. To
+ Reindent for any ":", use "<:>".
+=word Reindent when typing the last character of "word". "word" may
+ actually be part of another word. Thus "=end" would cause reindenting
+ when typing the "d" in "endif" or "endwhile". But not when typing
+ "bend". Also reindent when completion produces a word that starts
+ with "word". "0=word" reindents when there is only white space before
+ the word.
+=~word Like =word, but ignore case.
+
+If you really want to reindent when you type 'o', 'O', 'e', '0', '<', '>',
+'*', ':' or '!', use "<o>", "<O>", "<e>", "<0>", "<<>", "<>>", "<*>", "<:>" or
+"<!>", respectively, for those keys.
+
+For an emacs-style indent mode where lines aren't indented every time you
+press <Enter> but only if you press <Tab>, I suggest:
+ :set cinkeys=0{,0},:,0#,!<Tab>,!^F
+You might also want to switch off 'autoindent' then.
+
+Note: If you change the current line's indentation manually, Vim ignores the
+cindent settings for that line. This prevents vim from reindenting after you
+have changed the indent by typing <BS>, <Tab>, or <Space> in the indent or
+used CTRL-T or CTRL-D.
+
+ *cinoptions-values*
+The 'cinoptions' option sets how Vim performs indentation. The value after
+the option character can be one of these (N is any number):
+ N indent N spaces
+ -N indent N spaces to the left
+ Ns N times 'shiftwidth' spaces
+ -Ns N times 'shiftwidth' spaces to the left
+
+In the list below,
+"N" represents a number of your choice (the number can be negative). When
+there is an 's' after the number, Vim multiplies the number by 'shiftwidth':
+"1s" is 'shiftwidth', "2s" is two times 'shiftwidth', etc. You can use a
+decimal point, too: "-0.5s" is minus half a 'shiftwidth'.
+The examples below assume a 'shiftwidth' of 4.
+ *cino->*
+ >N Amount added for "normal" indent. Used after a line that should
+ increase the indent (lines starting with "if", an opening brace,
+ etc.). (default 'shiftwidth').
+
+ cino= cino=>2 cino=>2s >
+ if (cond) if (cond) if (cond)
+ { { {
+ foo; foo; foo;
+ } } }
+<
+ *cino-e*
+ eN Add N to the prevailing indent inside a set of braces if the
+ opening brace at the End of the line (more precise: is not the
+ first character in a line). This is useful if you want a
+ different indent when the '{' is at the start of the line from
+ when '{' is at the end of the line. (default 0).
+
+ cino= cino=e2 cino=e-2 >
+ if (cond) { if (cond) { if (cond) {
+ foo; foo; foo;
+ } } }
+ else else else
+ { { {
+ bar; bar; bar;
+ } } }
+<
+ *cino-n*
+ nN Add N to the prevailing indent for a statement after an "if",
+ "while", etc., if it is NOT inside a set of braces. This is
+ useful if you want a different indent when there is no '{'
+ before the statement from when there is a '{' before it.
+ (default 0).
+
+ cino= cino=n2 cino=n-2 >
+ if (cond) if (cond) if (cond)
+ foo; foo; foo;
+ else else else
+ { { {
+ bar; bar; bar;
+ } } }
+<
+ *cino-f*
+ fN Place the first opening brace of a function or other block in
+ column N. This applies only for an opening brace that is not
+ inside other braces and is at the start of the line. What comes
+ after the brace is put relative to this brace. (default 0).
+
+ cino= cino=f.5s cino=f1s >
+ func() func() func()
+ { { {
+ int foo; int foo; int foo;
+<
+ *cino-{*
+ {N Place opening braces N characters from the prevailing indent.
+ This applies only for opening braces that are inside other
+ braces. (default 0).
+
+ cino= cino={.5s cino={1s >
+ if (cond) if (cond) if (cond)
+ { { {
+ foo; foo; foo;
+<
+ *cino-}*
+ }N Place closing braces N characters from the matching opening
+ brace. (default 0).
+
+ cino= cino={2,}-0.5s cino=}2 >
+ if (cond) if (cond) if (cond)
+ { { {
+ foo; foo; foo;
+ } } }
+<
+ *cino-^*
+ ^N Add N to the prevailing indent inside a set of braces if the
+ opening brace is in column 0. This can specify a different
+ indent for whole of a function (some may like to set it to a
+ negative number). (default 0).
+
+ cino= cino=^-2 cino=^-s >
+ func() func() func()
+ { { {
+ if (cond) if (cond) if (cond)
+ { { {
+ a = b; a = b; a = b;
+ } } }
+ } } }
+<
+ *cino-L*
+ LN Controls placement of jump labels. If N is negative, the label
+ will be placed at column 1. If N is non-negative, the indent of
+ the label will be the prevailing indent minus N. (default -1).
+
+ cino= cino=L2 cino=Ls >
+ func() func() func()
+ { { {
+ { { {
+ stmt; stmt; stmt;
+ LABEL: LABEL: LABEL:
+ } } }
+ } } }
+<
+ *cino-:*
+ :N Place case labels N characters from the indent of the switch().
+ (default 'shiftwidth').
+
+ cino= cino=:0 >
+ switch (x) switch(x)
+ { {
+ case 1: case 1:
+ a = b; a = b;
+ default: default:
+ } }
+<
+ *cino-=*
+ =N Place statements occurring after a case label N characters from
+ the indent of the label. (default 'shiftwidth').
+
+ cino= cino==10 >
+ case 11: case 11: a = a + 1;
+ a = a + 1; b = b + 1;
+<
+ *cino-l*
+ lN If N != 0 Vim will align with a case label instead of the
+ statement after it in the same line.
+
+ cino= cino=l1 >
+ switch (a) { switch (a) {
+ case 1: { case 1: {
+ break; break;
+ } }
+<
+ *cino-b*
+ bN If N != 0 Vim will align a final "break" with the case label,
+ so that case..break looks like a sort of block. (default: 0).
+ When using 1, consider adding "0=break" to 'cinkeys'.
+
+ cino= cino=b1 >
+ switch (x) switch(x)
+ { {
+ case 1: case 1:
+ a = b; a = b;
+ break; break;
+
+ default: default:
+ a = 0; a = 0;
+ break; break;
+ } }
+<
+ *cino-g*
+ gN Place C++ scope declarations N characters from the indent of the
+ block they are in. (default 'shiftwidth'). By default, a scope
+ declaration is "public:", "protected:" or "private:". This can
+ be adjusted with the 'cinscopedecls' option.
+
+ cino= cino=g0 >
+ { {
+ public: public:
+ a = b; a = b;
+ private: private:
+ } }
+<
+ *cino-h*
+ hN Place statements occurring after a C++ scope declaration N
+ characters from the indent of the label. (default
+ 'shiftwidth').
+
+ cino= cino=h10 >
+ public: public: a = a + 1;
+ a = a + 1; b = b + 1;
+<
+ *cino-N*
+ NN Indent inside C++ namespace N characters extra compared to a
+ normal block. (default 0).
+
+ cino= cino=N-s >
+ namespace { namespace {
+ void function(); void function();
+ } }
+
+ namespace my namespace my
+ { {
+ 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
+ 'shiftwidth').
+
+ cino= cino=p0 cino=p2s >
+ func(a, b) func(a, b) func(a, b)
+ int a; int a; int a;
+ char b; char b; char b;
+<
+ *cino-t*
+ tN Indent a function return type declaration N characters from the
+ margin. (default 'shiftwidth').
+
+ cino= cino=t0 cino=t7 >
+ int int int
+ func() func() func()
+<
+ *cino-i*
+ iN Indent C++ base class declarations and constructor
+ initializations, if they start in a new line (otherwise they
+ are aligned at the right side of the ':').
+ (default 'shiftwidth').
+
+ cino= cino=i0 >
+ class MyClass : class MyClass :
+ public BaseClass public BaseClass
+ {} {}
+ MyClass::MyClass() : MyClass::MyClass() :
+ BaseClass(3) BaseClass(3)
+ {} {}
+<
+ *cino-+*
+ +N Indent a continuation line (a line that spills onto the next)
+ inside a function N additional characters. (default
+ 'shiftwidth').
+ Outside of a function, when the previous line ended in a
+ backslash, the 2 * N is used.
+
+ cino= cino=+10 >
+ a = b + 9 * a = b + 9 *
+ c; c;
+<
+ *cino-c*
+ cN Indent comment lines after the comment opener, when there is no
+ other text with which to align, N characters from the comment
+ opener. (default 3). See also |format-comments|.
+
+ cino= cino=c5 >
+ /* /*
+ text. text.
+ */ */
+<
+ *cino-C*
+ CN When N is non-zero, indent comment lines by the amount specified
+ with the c flag above even if there is other text behind the
+ comment opener. (default 0).
+
+ cino=c0 cino=c0,C1 >
+ /******** /********
+ text. text.
+ ********/ ********/
+< (Example uses ":set comments& comments-=s1:/* comments^=s0:/*")
+
+ *cino-/*
+ /N Indent comment lines N characters extra. (default 0).
+ cino= cino=/4 >
+ a = b; a = b;
+ /* comment */ /* comment */
+ c = d; c = d;
+<
+ *cino-(*
+ (N When in unclosed parentheses, indent N characters from the line
+ with the unclosed parenthesis. Add a 'shiftwidth' for every
+ extra unclosed parentheses. When N is 0 or the unclosed
+ parenthesis is the first non-white character in its line, line
+ up with the next non-white character after the unclosed
+ parenthesis. (default 'shiftwidth' * 2).
+
+ cino= cino=(0 >
+ if (c1 && (c2 || if (c1 && (c2 ||
+ c3)) c3))
+ foo; foo;
+ if (c1 && if (c1 &&
+ (c2 || c3)) (c2 || c3))
+ { {
+<
+ *cino-u*
+ uN Same as (N, but for one nesting level deeper.
+ (default 'shiftwidth').
+
+ cino= cino=u2 >
+ if (c123456789 if (c123456789
+ && (c22345 && (c22345
+ || c3)) || c3))
+<
+ *cino-U*
+ UN When N is non-zero, do not ignore the indenting specified by
+ ( or u in case that the unclosed parenthesis is the first
+ non-white character in its line. (default 0).
+
+ cino= or cino=(s cino=(s,U1 >
+ c = c1 && c = c1 &&
+ ( (
+ c2 || c2 ||
+ c3 c3
+ ) && c4; ) && c4;
+<
+ *cino-w*
+ wN When in unclosed parentheses and N is non-zero and either
+ using "(0" or "u0", respectively, or using "U0" and the unclosed
+ parenthesis is the first non-white character in its line, line
+ up with the character immediately after the unclosed parenthesis
+ rather than the first non-white character. (default 0).
+
+ cino=(0 cino=(0,w1 >
+ if ( c1 if ( c1
+ && ( c2 && ( c2
+ || c3)) || c3))
+ foo; foo;
+<
+ *cino-W*
+ WN When in unclosed parentheses and N is non-zero and either
+ using "(0" or "u0", respectively and the unclosed parenthesis is
+ the last non-white character in its line and it is not the
+ closing parenthesis, indent the following line N characters
+ relative to the outer context (i.e. start of the line or the
+ next unclosed parenthesis). (default: 0).
+
+ cino=(0 cino=(0,W4 >
+ a_long_line( a_long_line(
+ argument, argument,
+ argument); argument);
+ a_short_line(argument, a_short_line(argument,
+ argument); argument);
+<
+ *cino-k*
+ kN When in unclosed parentheses which follow "if", "for" or
+ "while" and N is non-zero, overrides the behaviour defined by
+ "(N": causes the indent to be N characters relative to the outer
+ context (i.e. the line where "if", "for" or "while" is). Has
+ no effect on deeper levels of nesting. Affects flags like "wN"
+ only for the "if", "for" and "while" conditions. If 0, defaults
+ to behaviour defined by the "(N" flag. (default: 0).
+
+ cino=(0 cino=(0,ks >
+ if (condition1 if (condition1
+ && condition2) && condition2)
+ action(); action();
+ function(argument1 function(argument1
+ && argument2); && argument2);
+<
+ *cino-m*
+ mN When N is non-zero, line up a line starting with a closing
+ parenthesis with the first character of the line with the
+ matching opening parenthesis. (default 0).
+
+ cino=(s cino=(s,m1 >
+ c = c1 && ( c = c1 && (
+ c2 || c2 ||
+ c3 c3
+ ) && c4; ) && c4;
+ if ( if (
+ c1 && c2 c1 && c2
+ ) )
+ foo; foo;
+<
+ *cino-M*
+ MN When N is non-zero, line up a line starting with a closing
+ parenthesis with the first character of the previous line.
+ (default 0).
+
+ cino= cino=M1 >
+ if (cond1 && if (cond1 &&
+ cond2 cond2
+ ) )
+<
+ *java-cinoptions* *java-indenting* *cino-j*
+ jN Indent Java anonymous classes correctly. Also works well for
+ Javascript. The value 'N' is currently unused but must be
+ non-zero (e.g. 'j1'). 'j1' will indent for example the
+ following code snippet correctly: >
+
+ object.add(new ChangeListener() {
+ public void stateChanged(ChangeEvent e) {
+ do_something();
+ }
+ });
+<
+ *javascript-cinoptions* *javascript-indenting* *cino-J*
+ JN Indent JavaScript object declarations correctly by not confusing
+ them with labels. The value 'N' is currently unused but must be
+ non-zero (e.g. 'J1'). If you enable this you probably also want
+ to set |cino-j|. >
+
+ var bar = {
+ foo: {
+ that: this,
+ some: ok,
+ },
+ "bar":{
+ a : 2,
+ b: "123abc",
+ x: 4,
+ "y": 5
+ }
+ }
+<
+ *cino-)*
+ )N Vim searches for unclosed parentheses at most N lines away.
+ This limits the time needed to search for parentheses. (default
+ 20 lines).
+
+ *cino-star*
+ *N Vim searches for unclosed comments at most N lines away. This
+ limits the time needed to search for the start of a comment.
+ If your /* */ comments stop indenting after N lines this is the
+ value you will want to change.
+ (default 70 lines).
+
+ *cino-#*
+ #N When N is non-zero recognize shell/Perl comments starting with
+ '#', do not recognize preprocessor lines; allow right-shifting
+ lines that start with "#".
+ When N is zero (default): don't recognize '#' comments, do
+ recognize preprocessor lines; right-shifting lines that start
+ with "#" does not work.
+
+ *cino-P*
+ PN When N is non-zero recognize C pragmas, and indent them like any
+ other code; does not concern other preprocessor directives.
+ When N is zero (default): don't recognize C pragmas, treating
+ them like every other preprocessor directive.
+
+
+The defaults, spelled out in full, are:
+ 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,P0
+
+Vim puts a line in column 1 if:
+- It starts with '#' (preprocessor directives), if 'cinkeys' contains '#0'.
+- It starts with a label (a keyword followed by ':', other than "case" and
+ "default") and 'cinoptions' does not contain an 'L' entry with a positive
+ value.
+- Any combination of indentations causes the line to have less than 0
+ indentation.
+
+==============================================================================
+2. Indenting by expression *indent-expression*
+
+The basics for using flexible indenting are explained in section |30.3| of the
+user manual.
+
+If you want to write your own indent file, it must set the 'indentexpr'
+option. Setting the 'indentkeys' option is often useful.
+See the $VIMRUNTIME/indent/README.txt file for hints.
+See the $VIMRUNTIME/indent directory for examples.
+
+
+REMARKS ABOUT SPECIFIC INDENT FILES ~
+
+
+CLOJURE *ft-clojure-indent* *clojure-indent*
+
+Clojure indentation differs somewhat from traditional Lisps, due in part to
+the use of square and curly brackets, and otherwise by community convention.
+These conventions are not universally followed, so the Clojure indent script
+offers a few configuration options.
+
+(If the current Vim does not include |searchpairpos()|, the indent script falls
+back to normal 'lisp' indenting, and the following options are ignored.)
+
+
+ *g:clojure_maxlines*
+
+Sets maximum scan distance of `searchpairpos()`. Larger values trade
+performance for correctness when dealing with very long forms. A value of
+0 will scan without limits. The default is 300.
+
+
+ *g:clojure_fuzzy_indent*
+ *g:clojure_fuzzy_indent_patterns*
+ *g:clojure_fuzzy_indent_blacklist*
+
+The 'lispwords' option is a list of comma-separated words that mark special
+forms whose subforms should be indented with two spaces.
+
+For example:
+>
+ (defn bad []
+ "Incorrect indentation")
+
+ (defn good []
+ "Correct indentation")
+<
+If you would like to specify 'lispwords' with a |pattern| instead, you can use
+the fuzzy indent feature:
+>
+ " Default
+ let g:clojure_fuzzy_indent = 1
+ let g:clojure_fuzzy_indent_patterns = ['^with', '^def', '^let']
+ let g:clojure_fuzzy_indent_blacklist =
+ \ ['-fn$', '\v^with-%(meta|out-str|loading-context)$']
+<
+|g:clojure_fuzzy_indent_patterns| and |g:clojure_fuzzy_indent_blacklist| are
+lists of patterns that will be matched against the unqualified symbol at the
+head of a list. This means that a pattern like `"^foo"` will match all these
+candidates: `foobar`, `my.ns/foobar`, and `#'foobar`.
+
+Each candidate word is tested for special treatment in this order:
+
+ 1. Return true if word is literally in 'lispwords'
+ 2. Return false if word matches a pattern in
+ |g:clojure_fuzzy_indent_blacklist|
+ 3. Return true if word matches a pattern in
+ |g:clojure_fuzzy_indent_patterns|
+ 4. Return false and indent normally otherwise
+
+
+ *g:clojure_special_indent_words*
+
+Some forms in Clojure are indented such that every subform is indented by only
+two spaces, regardless of 'lispwords'. If you have a custom construct that
+should be indented in this idiosyncratic fashion, you can add your symbols to
+the default list below.
+>
+ " Default
+ let g:clojure_special_indent_words =
+ \ 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn'
+<
+
+ *g:clojure_align_multiline_strings*
+
+Align subsequent lines in multi-line strings to the column after the opening
+quote, instead of the same column.
+
+For example:
+>
+ (def default
+ "Lorem ipsum dolor sit amet, consectetur adipisicing 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.")
+
+ (def aligned
+ "Lorem ipsum dolor sit amet, consectetur adipisicing 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.")
+<
+
+ *g:clojure_align_subforms*
+
+By default, parenthesized compound forms that look like function calls and
+whose head subform is on its own line have subsequent subforms indented by
+two spaces relative to the opening paren:
+>
+ (foo
+ bar
+ baz)
+<
+Setting this option to `1` changes this behaviour so that all subforms are
+aligned to the same column, emulating the default behaviour of
+clojure-mode.el:
+>
+ (foo
+ bar
+ baz)
+<
+
+FORTRAN *ft-fortran-indent*
+
+Block if, select case, where, and forall constructs are indented. So are
+type, interface, associate, block, and enum constructs. The indenting of
+subroutines, functions, modules, and program blocks is optional. Comments,
+labelled statements and continuation lines are indented if the Fortran is in
+free source form, whereas they are not indented if the Fortran is in fixed
+source form because of the left margin requirements. Hence manual indent
+corrections will be necessary for labelled statements and continuation lines
+when fixed source form is being used. For further discussion of the method
+used for the detection of source format see |ft-fortran-syntax|.
+
+Do loops ~
+All do loops are left unindented by default. Do loops can be unstructured in
+Fortran with (possibly multiple) loops ending on a labelled executable
+statement of almost arbitrary type. Correct indentation requires
+compiler-quality parsing. Old code with do loops ending on labelled statements
+of arbitrary type can be indented with elaborate programs such as Tidy
+(http://www.unb.ca/chem/ajit/f_tidy.htm). Structured do/continue loops are
+also left unindented because continue statements are also used for purposes
+other than ending a do loop. Programs such as Tidy can convert structured
+do/continue loops to the do/enddo form. Do loops of the do/enddo variety can
+be indented. If you use only structured loops of the do/enddo form, you should
+declare this by setting the fortran_do_enddo variable in your .vimrc as
+follows >
+
+ let fortran_do_enddo=1
+
+in which case do loops will be indented. If all your loops are of do/enddo
+type only in, say, .f90 files, then you should set a buffer flag with an
+autocommand such as >
+
+ au! BufRead,BufNewFile *.f90 let b:fortran_do_enddo=1
+
+to get do loops indented in .f90 files and left alone in Fortran files with
+other extensions such as .for.
+
+Program units ~
+The indenting of program units (subroutines, functions, modules, and program
+blocks) is enabled by default but can be suppressed if a lighter, screen-width
+preserving indent style is desired. To suppress the indenting of program
+units for all fortran files set the global fortran_indent_less variable in
+your .vimrc as follows >
+
+ let fortran_indent_less=1
+
+A finer level of suppression can be achieved by setting the corresponding
+buffer-local variable as follows >
+
+ let b:fortran_indent_less=1
+
+
+HTML *ft-html-indent* *html-indent* *html-indenting*
+
+This is about variables you can set in your vimrc to customize HTML indenting.
+
+You can set the indent for the first line after <script> and <style>
+"blocktags" (default "zero"): >
+
+ :let g:html_indent_script1 = "inc"
+ :let g:html_indent_style1 = "inc"
+<
+ VALUE MEANING ~
+ "zero" zero indent
+ "auto" auto indent (same indent as the blocktag)
+ "inc" auto indent + one indent step
+
+You can set the indent for attributes after an open <tag line: >
+
+ :let g:html_indent_attribute = 1
+<
+ VALUE MEANING ~
+ 1 auto indent, one indent step more than <tag
+ 2 auto indent, two indent steps (default)
+ > 2 auto indent, more indent steps
+
+Many tags increase the indent for what follows per default (see "Add Indent
+Tags" in the script). You can add further tags with: >
+
+ :let g:html_indent_inctags = "html,body,head,tbody"
+
+You can also remove such tags with: >
+
+ :let g:html_indent_autotags = "th,td,tr,tfoot,thead"
+
+Default value is empty for both variables. Note: the initial "inctags" are
+only defined once per Vim session.
+
+User variables are only read when the script is sourced. To enable your
+changes during a session, without reloading the HTML file, you can manually
+do: >
+
+ :call HtmlIndent_CheckUserSettings()
+
+Detail:
+ Calculation of indent inside "blocktags" with "alien" content:
+ BLOCKTAG INDENT EXPR WHEN APPLICABLE ~
+ <script> : {customizable} if first line of block
+ : cindent(v:lnum) if attributes empty or contain "java"
+ : -1 else (vbscript, tcl, ...)
+ <style> : {customizable} if first line of block
+ : GetCSSIndent() else
+ <!-- --> : -1
+
+
+MATLAB *ft-matlab-indent* *matlab-indent* *matlab-indenting*
+
+The setting Function indenting format in MATLAB Editor/Debugger Language
+Preferences corresponds to: >
+ :let g:MATLAB_function_indent = {0, 1 or 2 (default)}
+
+Where 0 is for Classic, 1 for Indent nested functions and 2 for Indent all
+functions.
+
+
+PHP *ft-php-indent* *php-indent* *php-indenting*
+
+NOTE: PHP files will be indented correctly only if PHP |syntax| is active.
+
+If you are editing a file in Unix 'fileformat' and '\r' characters are present
+before new lines, indentation won't proceed correctly ; you have to remove
+those useless characters first with a command like: >
+
+ :%s /\r$//g
+
+Or, you can simply |:let| the variable PHP_removeCRwhenUnix to 1 and the
+script will silently remove them when Vim loads a PHP file (at each |BufRead|).
+
+OPTIONS: ~
+
+PHP indenting can be altered in several ways by modifying the values of some
+global variables:
+
+ *php-comment* *PHP_autoformatcomment*
+To not enable auto-formatting of comments by default (if you want to use your
+own 'formatoptions'): >
+ :let g:PHP_autoformatcomment = 0
+
+Else, 't' will be removed from the 'formatoptions' string and "qrowcb" will be
+added, see |fo-table| for more information.
+-------------
+
+ *PHP_outdentSLComments*
+To add extra indentation to single-line comments: >
+ :let g:PHP_outdentSLComments = N
+
+With N being the number of 'shiftwidth' to add.
+
+Only single-line comments will be affected such as: >
+ # Comment
+ // Comment
+ /* Comment */
+-------------
+
+ *PHP_default_indenting*
+To add extra indentation to every PHP lines with N being the number of
+'shiftwidth' to add: >
+ :let g:PHP_default_indenting = N
+
+For example, with N = 1, this will give:
+>
+ <?php
+ if (!isset($History_lst_sel))
+ if (!isset($History_lst_sel))
+ if (!isset($History_lst_sel)) {
+ $History_lst_sel=0;
+ } else
+ $foo="bar";
+
+ $command_hist = TRUE;
+ ?>
+(Notice the extra indentation between the PHP container markers and the code)
+-------------
+
+ *PHP_outdentphpescape*
+To indent PHP escape tags as the surrounding non-PHP code (only affects the
+PHP escape tags): >
+ :let g:PHP_outdentphpescape = 0
+-------------
+
+ *PHP_removeCRwhenUnix*
+To automatically remove '\r' characters when the 'fileformat' is set to Unix: >
+ :let g:PHP_removeCRwhenUnix = 1
+-------------
+
+ *PHP_BracesAtCodeLevel*
+To indent braces at the same level than the code they contain: >
+ :let g:PHP_BracesAtCodeLevel = 1
+
+This will give the following result: >
+ if ($foo)
+ {
+ foo();
+ }
+Instead of: >
+ if ($foo)
+ {
+ foo();
+ }
+
+NOTE: Indenting will be a bit slower if this option is used because some
+ optimizations won't be available.
+-------------
+
+ *PHP_vintage_case_default_indent*
+To indent 'case:' and 'default:' statements in switch() blocks: >
+ :let g:PHP_vintage_case_default_indent = 1
+
+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();
+
+-------------
+
+ *PHP_IndentFunctionCallParameters*
+Extra indentation levels to add to parameters in multi-line function calls. >
+ let g:PHP_IndentFunctionCallParameters = 1
+
+Function call arguments will indent 1 extra level. For two-space indentation: >
+
+ function call_the_thing(
+ $with_this,
+ $and_that
+ ) {
+ $this->do_the_thing(
+ $with_this,
+ $and_that
+ );
+ }
+
+-------------
+
+ *PHP_IndentFunctionDeclarationParameters*
+Extra indentation levels to add to arguments in multi-line function
+definitions. >
+ let g:PHP_IndentFunctionDeclarationParameters = 1
+
+Function arguments in declarations will indent 1 extra level. For two-space
+indentation: >
+
+ function call_the_thing(
+ $with_this,
+ $and_that
+ ) {
+ $this->do_the_thing(
+ $with_this,
+ $and_that
+ );
+ }
+
+
+PYTHON *ft-python-indent*
+
+The amount of indent can be set with the `g:python_indent` |Dictionary|, which
+needs to be created before adding the items: >
+ let g:python_indent = {}
+The examples given are the defaults. Note that the dictionary values are set
+to an expression, so that you can change the value of 'shiftwidth' later
+without having to update these values.
+
+Indent after an open paren: >
+ let g:python_indent.open_paren = 'shiftwidth() * 2'
+Indent after a nested paren: >
+ let g:python_indent.nested_paren = 'shiftwidth()'
+Indent for a continuation line: >
+ let g:python_indent.continue = 'shiftwidth() * 2'
+
+By default, the closing paren on a multiline construct lines up under the first
+non-whitespace character of the previous line.
+If you prefer that it's lined up under the first character of the line that
+starts the multiline construct, reset this key: >
+ let g:python_indent.closed_paren_align_last_line = v:false
+
+The method uses |searchpair()| to look back for unclosed parentheses. 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:python_indent.searchpair_timeout = 500
+
+If looking back for unclosed parenthesis is still too slow, especially during
+a copy-paste operation, or if you don't need indenting inside multi-line
+parentheses, you can completely disable this feature: >
+ let g:python_indent.disable_parentheses_indenting = 1
+
+For backward compatibility, these variables are also supported: >
+ g:pyindent_open_paren
+ g:pyindent_nested_paren
+ g:pyindent_continue
+ g:pyindent_searchpair_timeout
+ g:pyindent_disable_parentheses_indenting
+
+
+R *ft-r-indent*
+
+Function arguments are aligned if they span for multiple lines. If you prefer
+do not have the arguments of functions aligned, put in your |vimrc|:
+>
+ let r_indent_align_args = 0
+<
+All lines beginning with a comment character, #, get the same indentation
+level of the normal R code. Users of Emacs/ESS may be used to have lines
+beginning with a single # indented in the 40th column, ## indented as R code,
+and ### not indented. If you prefer that lines beginning with comment
+characters are aligned as they are by Emacs/ESS, put in your |vimrc|:
+>
+ let r_indent_ess_comments = 1
+<
+If you prefer that lines beginning with a single # are aligned at a column
+different from the 40th one, you should set a new value to the variable
+r_indent_comment_column, as in the example below:
+>
+ let r_indent_comment_column = 30
+<
+Any code after a line that ends with "<-" is indented. Emacs/ESS does not
+indent the code if it is a top level function. If you prefer that the
+Vim-R-plugin behaves like Emacs/ESS in this regard, put in your |vimrc|:
+>
+ let r_indent_ess_compatible = 1
+<
+Below is an example of indentation with and without this option enabled:
+>
+ ### r_indent_ess_compatible = 1 ### r_indent_ess_compatible = 0
+ foo <- foo <-
+ function(x) function(x)
+ { {
+ 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*
+
+The amount of indent applied under various circumstances in a shell file can
+be configured by setting the following keys in the |Dictionary|
+b:sh_indent_defaults to a specific amount or to a |Funcref| that references a
+function that will return the amount desired:
+
+b:sh_indent_options['default'] Default amount of indent.
+
+b:sh_indent_options['continuation-line']
+ Amount of indent to add to a continued line.
+
+b:sh_indent_options['case-labels']
+ Amount of indent to add for case labels.
+ (not actually implemented)
+
+b:sh_indent_options['case-statements']
+ Amount of indent to add for case statements.
+
+b:sh_indent_options['case-breaks']
+ Amount of indent to add (or more likely
+ remove) for case breaks.
+
+VERILOG *ft-verilog-indent*
+
+General block statements such as if, for, case, always, initial, function,
+specify and begin, etc., are indented. The module block statements (first
+level blocks) are not indented by default. you can turn on the indent with
+setting a variable in the .vimrc as follows: >
+
+ let b:verilog_indent_modules = 1
+
+then the module blocks will be indented. To stop this, remove the variable: >
+
+ :unlet b:verilog_indent_modules
+
+To set the variable only for Verilog file. The following statements can be
+used: >
+
+ au BufReadPost * if exists("b:current_syntax")
+ au BufReadPost * if b:current_syntax == "verilog"
+ au BufReadPost * let b:verilog_indent_modules = 1
+ au BufReadPost * endif
+ au BufReadPost * endif
+
+Furthermore, setting the variable b:verilog_indent_width to change the
+indenting width (default is 'shiftwidth'): >
+
+ let b:verilog_indent_width = 4
+ let b:verilog_indent_width = shiftwidth() * 2
+
+In addition, you can turn the verbose mode for debug issue: >
+
+ let b:verilog_indent_verbose = 1
+
+Make sure to do ":set cmdheight=2" first to allow the display of the message.
+
+
+VHDL *ft-vhdl-indent*
+
+Alignment of generic/port mapping statements are performed by default. This
+causes the following alignment example: >
+
+ ENTITY sync IS
+ PORT (
+ clk : IN STD_LOGIC;
+ reset_n : IN STD_LOGIC;
+ data_input : IN STD_LOGIC;
+ data_out : OUT STD_LOGIC
+ );
+ END ENTITY sync;
+
+To turn this off, add >
+
+ let g:vhdl_indent_genportmap = 0
+
+to the .vimrc file, which causes the previous alignment example to change: >
+
+ ENTITY sync IS
+ PORT (
+ clk : IN STD_LOGIC;
+ reset_n : IN STD_LOGIC;
+ data_input : IN STD_LOGIC;
+ data_out : OUT STD_LOGIC
+ );
+ END ENTITY sync;
+
+----------------------------------------
+
+Alignment of right-hand side assignment "<=" statements are performed by
+default. This causes the following alignment example: >
+
+ sig_out <= (bus_a(1) AND
+ (sig_b OR sig_c)) OR
+ (bus_a(0) AND sig_d);
+
+To turn this off, add >
+
+ let g:vhdl_indent_rhsassign = 0
+
+to the .vimrc file, which causes the previous alignment example to change: >
+
+ sig_out <= (bus_a(1) AND
+ (sig_b OR sig_c)) OR
+ (bus_a(0) AND sig_d);
+
+----------------------------------------
+
+Full-line comments (lines that begin with "--") are indented to be aligned with
+the very previous line's comment, PROVIDED that a whitespace follows after
+"--".
+
+For example: >
+
+ sig_a <= sig_b; -- start of a comment
+ -- continuation of the comment
+ -- more of the same comment
+
+While in Insert mode, after typing "-- " (note the space " "), hitting CTRL-F
+will align the current "-- " with the previous line's "--".
+
+If the very previous line does not contain "--", THEN the full-line comment
+will be aligned with the start of the next non-blank line that is NOT a
+full-line comment.
+
+Indenting the following code: >
+
+ sig_c <= sig_d; -- comment 0
+ -- comment 1
+ -- comment 2
+ --debug_code:
+ --PROCESS(debug_in)
+ --BEGIN
+ -- FOR i IN 15 DOWNTO 0 LOOP
+ -- debug_out(8*i+7 DOWNTO 8*i) <= debug_in(15-i);
+ -- END LOOP;
+ --END PROCESS debug_code;
+
+ -- comment 3
+ sig_e <= sig_f; -- comment 4
+ -- comment 5
+
+results in: >
+
+ sig_c <= sig_d; -- comment 0
+ -- comment 1
+ -- comment 2
+ --debug_code:
+ --PROCESS(debug_in)
+ --BEGIN
+ -- FOR i IN 15 DOWNTO 0 LOOP
+ -- debug_out(8*i+7 DOWNTO 8*i) <= debug_in(15-i);
+ -- END LOOP;
+ --END PROCESS debug_code;
+
+ -- comment 3
+ sig_e <= sig_f; -- comment 4
+ -- comment 5
+
+Notice that "--debug_code:" does not align with "-- comment 2"
+because there is no whitespace that follows after "--" in "--debug_code:".
+
+Given the dynamic nature of indenting comments, indenting should be done TWICE.
+On the first pass, code will be indented. On the second pass, full-line
+comments will be indented according to the correctly indented code.
+
+
+VIM *ft-vim-indent*
+ *g:vim_indent*
+Vim scripts indentation can be configured with the `g:vim_indent` dictionary
+variable. It supports 3 keys, `line_continuation`, `more_in_bracket_block`,
+and `searchpair_timeout`.
+`line_continuation` expects a number which will be added to the indent level of
+a continuation line starting with a backslash, and defaults to
+`shiftwidth() * 3`. It also accepts a string, which is evaluated at runtime.
+`more_in_bracket_block` expects a boolean value; when on, an extra
+`shiftwidth()` is added inside blocks surrounded with brackets. It defaults to
+`v:false`.
+`searchpair_timeout` expects a number which will be passed to `searchpair()` as
+a timeout. Increasing the value might give more accurate results, but also
+causes the indentation to take more time. It defaults to 100 (milliseconds).
+
+Example of configuration:
+
+ let g:vim_indent = #{
+ \ line_continuation: shiftwidth() * 3,
+ \ more_in_bracket_block: v:false,
+ \ searchpair_timeout: 100,
+ \ }
+
+ *g:vim_indent_cont*
+This variable is equivalent to `g:vim_indent.line_continuation`.
+It's supported for backward compatibility.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt
new file mode 100644
index 0000000..a302c59
--- /dev/null
+++ b/runtime/doc/index.txt
@@ -0,0 +1,1769 @@
+*index.txt* For Vim version 9.0. Last change: 2023 Jan 09
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+ *index*
+This file contains a list of all commands for each mode, with a tag and a
+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|
+ 2.6. Operator-pending mode |operator-pending-index|
+3. Visual mode |visual-index|
+4. Command-line editing |ex-edit-index|
+5. Terminal-Job mode |terminal-job-index|
+6. EX commands |ex-cmd-index|
+
+For an overview of options see |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|.
+
+==============================================================================
+1. Insert mode *insert-index*
+
+tag char action in Insert mode ~
+-----------------------------------------------------------------------
+|i_CTRL-@| CTRL-@ insert previously inserted text and stop
+ insert
+|i_CTRL-A| CTRL-A insert previously inserted text
+ CTRL-B not used |i_CTRL-B-gone|
+|i_CTRL-C| CTRL-C quit insert mode, without checking for
+ abbreviation, unless 'insertmode' set.
+|i_CTRL-D| CTRL-D delete one shiftwidth of indent in the current
+ line
+|i_CTRL-E| CTRL-E insert the character which is below the cursor
+ CTRL-F not used (but by default it's in 'cinkeys' to
+ re-indent the current line)
+|i_CTRL-G_j| CTRL-G CTRL-J line down, to column where inserting started
+|i_CTRL-G_j| CTRL-G j line down, to column where inserting started
+|i_CTRL-G_j| CTRL-G <Down> line down, to column where inserting started
+|i_CTRL-G_k| CTRL-G CTRL-K line up, to column where inserting started
+|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)
+|i_CTRL-H| CTRL-H same as <BS>
+|i_<Tab>| <Tab> insert a <Tab> character
+|i_CTRL-I| CTRL-I same as <Tab>
+|i_<NL>| <NL> same as <CR>
+|i_CTRL-J| CTRL-J same as <CR>
+|i_CTRL-K| CTRL-K {char1} {char2}
+ enter digraph
+|i_CTRL-L| CTRL-L when 'insertmode' set: Leave Insert mode
+|i_<CR>| <CR> begin new line
+|i_CTRL-M| CTRL-M same as <CR>
+|i_CTRL-N| CTRL-N find next match for keyword in front of the
+ cursor
+|i_CTRL-O| CTRL-O execute a single command and return to insert
+ mode
+|i_CTRL-P| CTRL-P find previous match for keyword in front of
+ the cursor
+|i_CTRL-Q| CTRL-Q same as CTRL-V, unless used for terminal
+ control flow
+|i_CTRL-SHIFT-Q| CTRL-SHIFT-Q {char}
+ like CTRL-Q unless |modifyOtherKeys| is active
+|i_CTRL-R| CTRL-R {register}
+ insert the contents of a register
+|i_CTRL-R_CTRL-R| CTRL-R CTRL-R {register}
+ insert the contents of a register literally
+|i_CTRL-R_CTRL-O| CTRL-R CTRL-O {register}
+ insert the contents of a register literally
+ and don't auto-indent
+|i_CTRL-R_CTRL-P| CTRL-R CTRL-P {register}
+ insert the contents of a register literally
+ and fix indent.
+ CTRL-S not used or used for terminal control flow
+|i_CTRL-T| CTRL-T insert one shiftwidth of indent in current
+ line
+|i_CTRL-U| CTRL-U delete all entered characters in the current
+ line
+|i_CTRL-V| CTRL-V {char} insert next non-digit literally
+|i_CTRL-SHIFT-V| CTRL-SHIFT-V {char}
+ like CTRL-V unless |modifyOtherKeys| is active
+|i_CTRL-V_digit| CTRL-V {number} insert three digit decimal number as a single
+ byte.
+|i_CTRL-W| CTRL-W delete word before the cursor
+|i_CTRL-X| CTRL-X {mode} enter CTRL-X sub mode, see |i_CTRL-X_index|
+|i_CTRL-Y| CTRL-Y insert the character which is above the cursor
+|i_CTRL-Z| CTRL-Z when 'insertmode' set: suspend Vim
+|i_<Esc>| <Esc> end insert mode (unless 'insertmode' set)
+|i_CTRL-[| CTRL-[ same as <Esc>
+|i_CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode
+|i_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode'
+ CTRL-\ a - z reserved for extensions
+ CTRL-\ others not used
+|i_CTRL-]| CTRL-] trigger abbreviation
+|i_CTRL-^| CTRL-^ toggle use of |:lmap| mappings
+|i_CTRL-_| CTRL-_ When 'allowrevins' set: change language
+ (Hebrew, Farsi) {only when compiled with
+ the |+rightleft| feature}
+
+ <Space> to '~' not used, except '0' and '^' followed by
+ CTRL-D
+
+|i_0_CTRL-D| 0 CTRL-D delete all indent in the current line
+|i_^_CTRL-D| ^ CTRL-D delete all indent in the current line, restore
+ it in the next line
+
+|i_<Del>| <Del> delete character under the cursor
+
+ Meta characters (0x80 to 0xff, 128 to 255)
+ not used
+
+|i_<Left>| <Left> cursor one character left
+|i_<S-Left>| <S-Left> cursor one word left
+|i_<C-Left>| <C-Left> cursor one word left
+|i_<Right>| <Right> cursor one character right
+|i_<S-Right>| <S-Right> cursor one word right
+|i_<C-Right>| <C-Right> cursor one word right
+|i_<Up>| <Up> cursor one line up
+|i_<S-Up>| <S-Up> same as <PageUp>
+|i_<Down>| <Down> cursor one line down
+|i_<S-Down>| <S-Down> same as <PageDown>
+|i_<Home>| <Home> cursor to start of line
+|i_<C-Home>| <C-Home> cursor to start of file
+|i_<End>| <End> cursor past end of line
+|i_<C-End>| <C-End> cursor past end of file
+|i_<PageUp>| <PageUp> one screenful backward
+|i_<PageDown>| <PageDown> one screenful forward
+|i_<F1>| <F1> same as <Help>
+|i_<Help>| <Help> stop insert mode and display help window
+|i_<Insert>| <Insert> toggle Insert/Replace mode
+|i_<LeftMouse>| <LeftMouse> cursor at mouse click
+|i_<ScrollWheelDown>| <ScrollWheelDown> move window three lines down
+|i_<S-ScrollWheelDown>| <S-ScrollWheelDown> move window one page down
+|i_<ScrollWheelUp>| <ScrollWheelUp> move window three lines up
+|i_<S-ScrollWheelUp>| <S-ScrollWheelUp> move window one page up
+|i_<ScrollWheelLeft>| <ScrollWheelLeft> move window six columns left
+|i_<S-ScrollWheelLeft>| <S-ScrollWheelLeft> move window one page left
+|i_<ScrollWheelRight>| <ScrollWheelRight> move window six columns right
+|i_<S-ScrollWheelRight>| <S-ScrollWheelRight> move window one page right
+
+commands in CTRL-X submode *i_CTRL-X_index*
+
+|i_CTRL-X_CTRL-D| CTRL-X CTRL-D complete defined identifiers
+|i_CTRL-X_CTRL-E| CTRL-X CTRL-E scroll up
+|i_CTRL-X_CTRL-F| CTRL-X CTRL-F complete file names
+|i_CTRL-X_CTRL-I| CTRL-X CTRL-I complete identifiers
+|i_CTRL-X_CTRL-K| CTRL-X CTRL-K complete identifiers from dictionary
+|i_CTRL-X_CTRL-L| CTRL-X CTRL-L complete whole lines
+|i_CTRL-X_CTRL-N| CTRL-X CTRL-N next completion
+|i_CTRL-X_CTRL-O| CTRL-X CTRL-O omni completion
+|i_CTRL-X_CTRL-P| CTRL-X CTRL-P previous completion
+|i_CTRL-X_CTRL-S| CTRL-X CTRL-S spelling suggestions
+|i_CTRL-X_CTRL-T| CTRL-X CTRL-T complete identifiers from thesaurus
+|i_CTRL-X_CTRL-Y| CTRL-X CTRL-Y scroll down
+|i_CTRL-X_CTRL-U| CTRL-X CTRL-U complete with 'completefunc'
+|i_CTRL-X_CTRL-V| CTRL-X CTRL-V complete like in : command line
+|i_CTRL-X_CTRL-Z| CTRL-X CTRL-Z stop completion, keeping the text as-is
+|i_CTRL-X_CTRL-]| CTRL-X CTRL-] complete tags
+|i_CTRL-X_s| CTRL-X s spelling suggestions
+
+commands in completion mode (see |popupmenu-keys|)
+
+|complete_CTRL-E| CTRL-E stop completion and go back to original text
+|complete_CTRL-Y| CTRL-Y accept selected match and stop completion
+ CTRL-L insert one character from the current match
+ <CR> insert currently selected match
+ <BS> delete one character and redo search
+ CTRL-H same as <BS>
+ <Up> select the previous match
+ <Down> select the next match
+ <PageUp> select a match several entries back
+ <PageDown> select a match several entries forward
+ other stop completion and insert the typed character
+
+==============================================================================
+2. Normal mode *normal-index*
+
+CHAR any non-blank character
+WORD a sequence of non-blank characters
+N a number entered before the command
+{motion} a cursor movement command
+Nmove the text that is moved over with a {motion}
+SECTION a section that possibly starts with '}' instead of '{'
+
+note: 1 = cursor movement command; 2 = can be undone/redone
+
+tag char note action in Normal mode ~
+------------------------------------------------------------------------------
+ CTRL-@ not used
+|CTRL-A| CTRL-A 2 add N to number at/after cursor
+|CTRL-B| CTRL-B 1 scroll N screens Backwards
+|CTRL-C| CTRL-C interrupt current (search) command
+|CTRL-D| CTRL-D scroll Down N lines (default: half a screen)
+|CTRL-E| CTRL-E scroll N lines upwards (N lines Extra)
+|CTRL-F| CTRL-F 1 scroll N screens Forward
+|CTRL-G| CTRL-G display current file name and position
+|<BS>| <BS> 1 same as "h"
+|CTRL-H| CTRL-H 1 same as "h"
+|<Tab>| <Tab> 1 go to N newer entry in jump list
+|CTRL-I| CTRL-I 1 same as <Tab>
+|<NL>| <NL> 1 same as "j"
+|CTRL-J| CTRL-J 1 same as "j"
+ CTRL-K not used
+|CTRL-L| CTRL-L redraw screen
+|<CR>| <CR> 1 cursor to the first CHAR N lines lower
+|CTRL-M| CTRL-M 1 same as <CR>
+|CTRL-N| CTRL-N 1 same as "j"
+|CTRL-O| CTRL-O 1 go to N older entry in jump list
+|CTRL-P| CTRL-P 1 same as "k"
+ CTRL-Q not used, or used for terminal control flow
+|CTRL-R| CTRL-R 2 redo changes which were undone with 'u'
+ CTRL-S not used, or used for terminal control flow
+|CTRL-T| CTRL-T jump to N older Tag in tag list
+|CTRL-U| CTRL-U scroll N lines Upwards (default: half a
+ screen)
+|CTRL-V| CTRL-V start blockwise Visual mode
+|CTRL-W| CTRL-W {char} window commands, see |CTRL-W|
+|CTRL-X| CTRL-X 2 subtract N from number at/after cursor
+|CTRL-Y| CTRL-Y scroll N lines downwards
+|CTRL-Z| CTRL-Z suspend program (or start new shell)
+ CTRL-[ <Esc> not used
+|CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode (no-op)
+|CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode'
+ CTRL-\ a - z reserved for extensions
+ CTRL-\ others not used
+|CTRL-]| CTRL-] :ta to ident under cursor
+|CTRL-^| CTRL-^ edit Nth alternate file (equivalent to
+ ":e #N")
+ CTRL-_ not used
+
+|<Space>| <Space> 1 same as "l"
+|!| !{motion}{filter}
+ 2 filter Nmove text through the {filter}
+ command
+|!!| !!{filter} 2 filter N lines through the {filter} command
+|quote| "{register} use {register} for next delete, yank or put
+ ({.%#:} only work with put)
+|#| # 1 search backward for the Nth occurrence of
+ the ident under the cursor
+|$| $ 1 cursor to the end of Nth next line
+|%| % 1 find the next (curly/square) bracket on
+ this line and go to its match, or go to
+ matching comment bracket, or go to matching
+ preprocessor directive.
+|N%| {count}% 1 go to N percentage in the file
+|&| & 2 repeat last :s
+|'| '{a-zA-Z0-9} 1 cursor to the first CHAR on the line with
+ mark {a-zA-Z0-9}
+|''| '' 1 cursor to the first CHAR of the line where
+ the cursor was before the latest jump.
+|'(| '( 1 cursor to the first CHAR on the line of the
+ start of the current sentence
+|')| ') 1 cursor to the first CHAR on the line of the
+ end of the current sentence
+|'<| '< 1 cursor to the first CHAR of the line where
+ highlighted area starts/started in the
+ current buffer.
+|'>| '> 1 cursor to the first CHAR of the line where
+ highlighted area ends/ended in the current
+ buffer.
+|'[| '[ 1 cursor to the first CHAR on the line of the
+ start of last operated text or start of put
+ text
+|']| '] 1 cursor to the first CHAR on the line of the
+ end of last operated text or end of put
+ text
+|'{| '{ 1 cursor to the first CHAR on the line of the
+ start of the current paragraph
+|'}| '} 1 cursor to the first CHAR on the line of the
+ end of the current paragraph
+|(| ( 1 cursor N sentences backward
+|)| ) 1 cursor N sentences forward
+|star| * 1 search forward for the Nth occurrence of
+ the ident under the cursor
+|+| + 1 same as <CR>
+|,| , 1 repeat latest f, t, F or T in opposite
+ direction N times
+|-| - 1 cursor to the first CHAR N lines higher
+|.| . 2 repeat last change with count replaced with
+ N
+|/| /{pattern}<CR> 1 search forward for the Nth occurrence of
+ {pattern}
+|/<CR>| /<CR> 1 search forward for {pattern} of last search
+|0| 0 1 cursor to the first char of the line
+|count| 1 prepend to command to give a count
+|count| 2 "
+|count| 3 "
+|count| 4 "
+|count| 5 "
+|count| 6 "
+|count| 7 "
+|count| 8 "
+|count| 9 "
+|:| : 1 start entering an Ex command
+|N:| {count}: start entering an Ex command with range
+ from current line to N-1 lines down
+|;| ; 1 repeat latest f, t, F or T N times
+|<| <{motion} 2 shift Nmove lines one 'shiftwidth'
+ leftwards
+|<<| << 2 shift N lines one 'shiftwidth' leftwards
+|=| ={motion} 2 filter Nmove lines through "indent"
+|==| == 2 filter N lines through "indent"
+|>| >{motion} 2 shift Nmove lines one 'shiftwidth'
+ rightwards
+|>>| >> 2 shift N lines one 'shiftwidth' rightwards
+|?| ?{pattern}<CR> 1 search backward for the Nth previous
+ occurrence of {pattern}
+|?<CR>| ?<CR> 1 search backward for {pattern} of last search
+|@| @{a-z} 2 execute the contents of register {a-z}
+ N times
+|@:| @: repeat the previous ":" command N times
+|@@| @@ 2 repeat the previous @{a-z} N times
+|A| A 2 append text after the end of the line N times
+|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
+ 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 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
+|G| G 1 cursor to line N, default last line
+|H| H 1 cursor to line N from top of screen
+|I| I 2 insert text before the first CHAR on the
+ line N times
+|J| J 2 Join N lines; default is 2
+|K| K lookup Keyword under the cursor with
+ 'keywordprg'
+|L| L 1 cursor to line N from bottom of screen
+|M| M 1 cursor to middle line of screen
+|N| N 1 repeat the latest '/' or '?' N times in
+ 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 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 register x] and start
+ insert; synonym for "cc".
+|T| T{char} 1 cursor till after Nth occurrence of {char}
+ to the left
+|U| U 2 undo all latest changes on one line
+|V| V start linewise Visual mode
+|W| W 1 cursor N WORDS forward
+|X| ["x]X 2 delete N characters before the cursor [into
+ register x]
+|Y| ["x]Y yank N lines [into register x]; synonym for
+ "yy"
+|ZZ| ZZ write if buffer changed and close window
+|ZQ| ZQ close window without writing
+|[| [{char} square bracket command (see |[| below)
+ \ not used
+|]| ]{char} square bracket command (see |]| below)
+|^| ^ 1 cursor to the first CHAR of the line
+|_| _ 1 cursor to the first CHAR N - 1 lines lower
+|`| `{a-zA-Z0-9} 1 cursor to the mark {a-zA-Z0-9}
+|`(| `( 1 cursor to the start of the current sentence
+|`)| `) 1 cursor to the end of the current sentence
+|`<| `< 1 cursor to the start of the highlighted area
+|`>| `> 1 cursor to the end of the highlighted area
+|`[| `[ 1 cursor to the start of last operated text
+ or start of putted text
+|`]| `] 1 cursor to the end of last operated text or
+ end of putted text
+|``| `` 1 cursor to the position before latest jump
+|`{| `{ 1 cursor to the start of the current paragraph
+|`}| `} 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 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 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
+|f| f{char} 1 cursor to Nth occurrence of {char} to the
+ right
+|g| g{char} extended commands, see |g| below
+|h| h 1 cursor N chars to the left
+|i| i 2 insert text before the cursor N times
+|j| j 1 cursor N lines downward
+|k| k 1 cursor N lines upward
+|l| l 1 cursor N chars to the right
+|m| m{A-Za-z} set mark {A-Za-z} at cursor position
+|n| n 1 repeat the latest '/' or '?' N times
+|o| o 2 begin a new line below the cursor and
+ insert text, repeat N times
+|p| ["x]p 2 put the text [from register x] after the
+ cursor N times
+|q| q{0-9a-zA-Z"} record typed characters into named register
+ {0-9a-zA-Z"} (uppercase to append)
+|q| q (while recording) stops recording
+|q:| q: edit : command-line in command-line window
+|q/| q/ edit / command-line in command-line window
+|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
+ 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 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
+|}| } 1 cursor N paragraphs forward
+|~| ~ 2 'tildeop' off: switch case of N characters
+ under cursor and move the cursor N
+ characters to the right
+|~| ~{motion} 'tildeop' on: switch case of Nmove text
+|<C-End>| <C-End> 1 same as "G"
+|<C-Home>| <C-Home> 1 same as "gg"
+|<C-Left>| <C-Left> 1 same as "b"
+|<C-LeftMouse>| <C-LeftMouse> ":ta" to the keyword at the mouse click
+|<C-Right>| <C-Right> 1 same as "w"
+|<C-RightMouse>| <C-RightMouse> same as "CTRL-T"
+|<C-Tab>| <C-Tab> same as "g<Tab>"
+|<Del>| ["x]<Del> 2 same as "x"
+|N<Del>| {count}<Del> remove the last digit from {count}
+|<Down>| <Down> 1 same as "j"
+|<End>| <End> 1 same as "$"
+|<F1>| <F1> same as <Help>
+|<Help>| <Help> open a help window
+|<Home>| <Home> 1 same as "0"
+|<Insert>| <Insert> 2 same as "i"
+|<Left>| <Left> 1 same as "h"
+|<LeftMouse>| <LeftMouse> 1 move cursor to the mouse click position
+|<MiddleMouse>| <MiddleMouse> 2 same as "gP" at the mouse click position
+|<PageDown>| <PageDown> same as CTRL-F
+|<PageUp>| <PageUp> same as CTRL-B
+|<Right>| <Right> 1 same as "l"
+|<RightMouse>| <RightMouse> start Visual mode, move cursor to the mouse
+ click position
+|<S-Down>| <S-Down> 1 same as CTRL-F
+|<S-Left>| <S-Left> 1 same as "b"
+|<S-LeftMouse>| <S-LeftMouse> same as "*" at the mouse click position
+|<S-Right>| <S-Right> 1 same as "w"
+|<S-RightMouse>| <S-RightMouse> same as "#" at the mouse click position
+|<S-Up>| <S-Up> 1 same as CTRL-B
+|<Undo>| <Undo> 2 same as "u"
+|<Up>| <Up> 1 same as "k"
+|<ScrollWheelDown>| <ScrollWheelDown> move window three lines down
+|<S-ScrollWheelDown>| <S-ScrollWheelDown> move window one page down
+|<ScrollWheelUp>| <ScrollWheelUp> move window three lines up
+|<S-ScrollWheelUp>| <S-ScrollWheelUp> move window one page up
+|<ScrollWheelLeft>| <ScrollWheelLeft> move window six columns left
+|<S-ScrollWheelLeft>| <S-ScrollWheelLeft> move window one page left
+|<ScrollWheelRight>| <ScrollWheelRight> move window six columns right
+|<S-ScrollWheelRight>| <S-ScrollWheelRight> move window one page right
+
+==============================================================================
+2.1 Text objects *objects*
+
+These can be used after an operator or in Visual mode to select an object.
+
+tag command action in op-pending and Visual mode ~
+------------------------------------------------------------------------------
+|v_aquote| a" double quoted string
+|v_a'| a' single quoted string
+|v_a(| a( same as ab
+|v_a)| a) same as ab
+|v_a<| a< "a <>" from '<' to the matching '>'
+|v_a>| a> same as a<
+|v_aB| aB "a Block" from "[{" to "]}" (with brackets)
+|v_aW| aW "a WORD" (with white space)
+|v_a[| a[ "a []" from '[' to the matching ']'
+|v_a]| a] same as a[
+|v_a`| a` string in backticks
+|v_ab| ab "a block" from "[(" to "])" (with braces)
+|v_ap| ap "a paragraph" (with white space)
+|v_as| as "a sentence" (with white space)
+|v_at| at "a tag block" (with white space)
+|v_aw| aw "a word" (with white space)
+|v_a{| a{ same as aB
+|v_a}| a} same as aB
+|v_iquote| i" double quoted string without the quotes
+|v_i'| i' single quoted string without the quotes
+|v_i(| i( same as ib
+|v_i)| i) same as ib
+|v_i<| i< "inner <>" from '<' to the matching '>'
+|v_i>| i> same as i<
+|v_iB| iB "inner Block" from "[{" and "]}"
+|v_iW| iW "inner WORD"
+|v_i[| i[ "inner []" from '[' to the matching ']'
+|v_i]| i] same as i[
+|v_i`| i` string in backticks without the backticks
+|v_ib| ib "inner block" from "[(" to "])"
+|v_ip| ip "inner paragraph"
+|v_is| is "inner sentence"
+|v_it| it "inner tag block"
+|v_iw| iw "inner word"
+|v_i{| i{ same as iB
+|v_i}| i} same as iB
+
+==============================================================================
+2.2 Window commands *CTRL-W*
+
+tag command action in Normal mode ~
+------------------------------------------------------------------------------
+|CTRL-W_CTRL-B| CTRL-W CTRL-B same as "CTRL-W b"
+|CTRL-W_CTRL-C| CTRL-W CTRL-C same as "CTRL-W c"
+|CTRL-W_CTRL-D| CTRL-W CTRL-D same as "CTRL-W d"
+|CTRL-W_CTRL-F| CTRL-W CTRL-F same as "CTRL-W f"
+ CTRL-W CTRL-G same as "CTRL-W g .."
+|CTRL-W_CTRL-H| CTRL-W CTRL-H same as "CTRL-W h"
+|CTRL-W_CTRL-I| CTRL-W CTRL-I same as "CTRL-W i"
+|CTRL-W_CTRL-J| CTRL-W CTRL-J same as "CTRL-W j"
+|CTRL-W_CTRL-K| CTRL-W CTRL-K same as "CTRL-W k"
+|CTRL-W_CTRL-L| CTRL-W CTRL-L same as "CTRL-W l"
+|CTRL-W_CTRL-N| CTRL-W CTRL-N same as "CTRL-W n"
+|CTRL-W_CTRL-O| CTRL-W CTRL-O same as "CTRL-W o"
+|CTRL-W_CTRL-P| CTRL-W CTRL-P same as "CTRL-W p"
+|CTRL-W_CTRL-Q| CTRL-W CTRL-Q same as "CTRL-W q"
+|CTRL-W_CTRL-R| CTRL-W CTRL-R same as "CTRL-W r"
+|CTRL-W_CTRL-S| CTRL-W CTRL-S same as "CTRL-W s"
+|CTRL-W_CTRL-T| CTRL-W CTRL-T same as "CTRL-W t"
+|CTRL-W_CTRL-V| CTRL-W CTRL-V same as "CTRL-W v"
+|CTRL-W_CTRL-W| CTRL-W CTRL-W same as "CTRL-W w"
+|CTRL-W_CTRL-X| CTRL-W CTRL-X same as "CTRL-W x"
+|CTRL-W_CTRL-Z| CTRL-W CTRL-Z same as "CTRL-W z"
+|CTRL-W_CTRL-]| CTRL-W CTRL-] same as "CTRL-W ]"
+|CTRL-W_CTRL-^| CTRL-W CTRL-^ same as "CTRL-W ^"
+|CTRL-W_CTRL-_| CTRL-W CTRL-_ same as "CTRL-W _"
+|CTRL-W_+| CTRL-W + increase current window height N lines
+|CTRL-W_-| CTRL-W - decrease current window height N lines
+|CTRL-W_:| CTRL-W : same as |:|, edit a command line
+|CTRL-W_<| CTRL-W < decrease current window width N columns
+|CTRL-W_=| CTRL-W = make all windows the same height & width
+|CTRL-W_>| CTRL-W > increase current window width N columns
+|CTRL-W_H| CTRL-W H move current window to the far left
+|CTRL-W_J| CTRL-W J move current window to the very bottom
+|CTRL-W_K| CTRL-W K move current window to the very top
+|CTRL-W_L| CTRL-W L move current window to the far right
+|CTRL-W_P| CTRL-W P go to preview window
+|CTRL-W_R| CTRL-W R rotate windows upwards N times
+|CTRL-W_S| CTRL-W S same as "CTRL-W s"
+|CTRL-W_T| CTRL-W T move current window to a new tab page
+|CTRL-W_W| CTRL-W W go to N previous window (wrap around)
+|CTRL-W_]| CTRL-W ] split window and jump to tag under cursor
+|CTRL-W_^| CTRL-W ^ split current window and edit alternate
+ file N
+|CTRL-W__| CTRL-W _ set current window height to N (default:
+ very high)
+|CTRL-W_b| CTRL-W b go to bottom window
+|CTRL-W_c| CTRL-W c close current window (like |:close|)
+|CTRL-W_d| CTRL-W d split window and jump to definition under
+ the cursor
+|CTRL-W_f| CTRL-W f split window and edit file name under the
+ cursor
+|CTRL-W_F| CTRL-W F split window and edit file name under the
+ cursor and jump to the line number
+ following the file name.
+|CTRL-W_g_CTRL-]| CTRL-W g CTRL-] split window and do |:tjump| to tag under
+ cursor
+|CTRL-W_g]| CTRL-W g ] split window and do |:tselect| for tag
+ under cursor
+|CTRL-W_g}| CTRL-W g } do a |:ptjump| to the tag under the cursor
+|CTRL-W_gf| CTRL-W g f edit file name under the cursor in a new
+ tab page
+|CTRL-W_gF| CTRL-W g F edit file name under the cursor in a new
+ tab page and jump to the line number
+ following the file name.
+|CTRL-W_gt| CTRL-W g t same as `gt`: go to next tab page
+|CTRL-W_gT| CTRL-W g T same as `gT`: go to previous tab page
+|CTRL-W_g<Tab>| CTRL-W g <Tab> same as |g<Tab>|: go to last accessed tab
+ page.
+|CTRL-W_h| CTRL-W h go to Nth left window (stop at first window)
+|CTRL-W_i| CTRL-W i split window and jump to declaration of
+ identifier under the cursor
+|CTRL-W_j| CTRL-W j go N windows down (stop at last window)
+|CTRL-W_k| CTRL-W k go N windows up (stop at first window)
+|CTRL-W_l| CTRL-W l go to Nth right window (stop at last window)
+|CTRL-W_n| CTRL-W n open new window, N lines high
+|CTRL-W_o| CTRL-W o close all but current window (like |:only|)
+|CTRL-W_p| CTRL-W p go to previous (last accessed) window
+|CTRL-W_q| CTRL-W q quit current window (like |:quit|)
+|CTRL-W_r| CTRL-W r rotate windows downwards N times
+|CTRL-W_s| CTRL-W s split current window in two parts, new
+ window N lines high
+|CTRL-W_t| CTRL-W t go to top window
+|CTRL-W_v| CTRL-W v split current window vertically, new window
+ N columns wide
+|CTRL-W_w| CTRL-W w go to N next window (wrap around)
+|CTRL-W_x| CTRL-W x exchange current window with window N
+ (default: next window)
+|CTRL-W_z| CTRL-W z close preview window
+|CTRL-W_bar| CTRL-W | set window width to N columns
+|CTRL-W_}| CTRL-W } show tag under cursor in preview window
+|CTRL-W_<Down>| CTRL-W <Down> same as "CTRL-W j"
+|CTRL-W_<Up>| CTRL-W <Up> same as "CTRL-W k"
+|CTRL-W_<Left>| CTRL-W <Left> same as "CTRL-W h"
+|CTRL-W_<Right>| CTRL-W <Right> same as "CTRL-W l"
+
+==============================================================================
+2.3 Square bracket commands *[* *]*
+
+tag char note action in Normal mode ~
+------------------------------------------------------------------------------
+|[_CTRL-D| [ CTRL-D jump to first #define found in current and
+ included files matching the word under the
+ cursor, start searching at beginning of
+ current file
+|[_CTRL-I| [ CTRL-I jump to first line in current and included
+ files that contains the word under the
+ cursor, start searching at beginning of
+ current file
+|[#| [# 1 cursor to N previous unmatched #if, #else
+ or #ifdef
+|['| [' 1 cursor to previous lowercase mark, on first
+ non-blank
+|[(| [( 1 cursor N times back to unmatched '('
+|[star| [* 1 same as "[/"
+|[`| [` 1 cursor to previous lowercase mark
+|[/| [/ 1 cursor to N previous start of a C comment
+|[D| [D list all defines found in current and
+ included files matching the word under the
+ cursor, start searching at beginning of
+ current file
+|[I| [I list all lines found in current and
+ included files that contain the word under
+ the cursor, start searching at beginning of
+ current file
+|[P| [P 2 same as "[p"
+|[[| [[ 1 cursor N sections backward
+|[]| [] 1 cursor N SECTIONS backward
+|[c| [c 1 cursor N times backwards to start of change
+|[d| [d show first #define found in current and
+ included files matching the word under the
+ cursor, start searching at beginning of
+ current file
+|[f| [f same as "gf"
+|[i| [i show first line found in current and
+ included files that contains the word under
+ the cursor, start searching at beginning of
+ current file
+|[m| [m 1 cursor N times back to start of member
+ function
+|[p| [p 2 like "P", but adjust indent to current line
+|[s| [s 1 move to the previous misspelled word
+|[z| [z 1 move to start of open fold
+|[{| [{ 1 cursor N times back to unmatched '{'
+|[<MiddleMouse>| [<MiddleMouse> 2 same as "[p"
+
+|]_CTRL-D| ] CTRL-D jump to first #define found in current and
+ included files matching the word under the
+ cursor, start searching at cursor position
+|]_CTRL-I| ] CTRL-I jump to first line in current and included
+ files that contains the word under the
+ cursor, start searching at cursor position
+|]#| ]# 1 cursor to N next unmatched #endif or #else
+|]'| ]' 1 cursor to next lowercase mark, on first
+ non-blank
+|])| ]) 1 cursor N times forward to unmatched ')'
+|]star| ]* 1 same as "]/"
+|]`| ]` 1 cursor to next lowercase mark
+|]/| ]/ 1 cursor to N next end of a C comment
+|]D| ]D list all #defines found in current and
+ included files matching the word under the
+ cursor, start searching at cursor position
+|]I| ]I list all lines found in current and
+ included files that contain the word under
+ the cursor, start searching at cursor
+ position
+|]P| ]P 2 same as "[p"
+|][| ][ 1 cursor N SECTIONS forward
+|]]| ]] 1 cursor N sections forward
+|]c| ]c 1 cursor N times forward to start of change
+|]d| ]d show first #define found in current and
+ included files matching the word under the
+ cursor, start searching at cursor position
+|]f| ]f same as "gf"
+|]i| ]i show first line found in current and
+ included files that contains the word under
+ the cursor, start searching at cursor
+ position
+|]m| ]m 1 cursor N times forward to end of member
+ function
+|]p| ]p 2 like "p", but adjust indent to current line
+|]s| ]s 1 move to next misspelled word
+|]z| ]z 1 move to end of open fold
+|]}| ]} 1 cursor N times forward to unmatched '}'
+|]<MiddleMouse>| ]<MiddleMouse> 2 same as "]p"
+
+==============================================================================
+2.4 Commands starting with 'g' *g*
+
+tag char note action in Normal mode ~
+------------------------------------------------------------------------------
+|g_CTRL-A| g CTRL-A only when compiled with MEM_PROFILE
+ defined: dump a memory profile
+|g_CTRL-G| g CTRL-G show information about current cursor
+ position
+|g_CTRL-H| g CTRL-H start Select block mode
+|g_CTRL-]| g CTRL-] |:tjump| to the tag under the cursor
+|g#| g# 1 like "#", but without using "\<" and "\>"
+|g$| g$ 1 when 'wrap' off go to rightmost character of
+ the current line that is on the screen;
+ when 'wrap' on go to the rightmost character
+ of the current screen line
+|g&| g& 2 repeat last ":s" on all lines
+|g'| g'{mark} 1 like |'| but without changing the jumplist
+|g`| g`{mark} 1 like |`| but without changing the jumplist
+|gstar| g* 1 like "*", but without using "\<" and "\>"
+|g+| g+ go to newer text state N times
+|g,| g, 1 go to N newer position in change list
+|g-| g- go to older text state N times
+|g0| g0 1 when 'wrap' off go to leftmost character of
+ the current line that is on the screen;
+ when 'wrap' on go to the leftmost character
+ of the current screen line
+|g8| g8 print hex value of bytes used in UTF-8
+ character under the cursor
+|g;| g; 1 go to N older position in change list
+|g<| g< display previous command output
+|g?| g? 2 Rot13 encoding operator
+|g?g?| g?? 2 Rot13 encode current line
+|g?g?| g?g? 2 Rot13 encode current line
+|gD| gD 1 go to definition of word under the cursor
+ in current file
+|gE| gE 1 go backwards to the end of the previous
+ WORD
+|gH| gH start Select line mode
+|gI| gI 2 like "I", but always start in column 1
+|gJ| gJ 2 join lines without inserting space
+|gN| gN 1,2 find the previous match with the last used
+ search pattern and Visually select it
+|gP| ["x]gP 2 put the text [from register x] before the
+ cursor N times, leave the cursor after it
+|gQ| gQ switch to "Ex" mode with Vim editing
+|gR| gR 2 enter Virtual Replace mode
+|gT| gT go to the previous tab page
+|gU| gU{motion} 2 make Nmove text uppercase
+|gV| gV don't reselect the previous Visual area
+ when executing a mapping or menu in Select
+ mode
+|g]| g] :tselect on the tag under the cursor
+|g^| g^ 1 when 'wrap' off go to leftmost non-white
+ character of the current line that is on
+ the screen; when 'wrap' on go to the
+ leftmost non-white character of the current
+ screen line
+|g_| g_ 1 cursor to the last CHAR N - 1 lines lower
+|ga| ga print ascii value of character under the
+ cursor
+|gd| gd 1 go to definition of word under the cursor
+ in current function
+|ge| ge 1 go backwards to the end of the previous
+ word
+|gf| gf start editing the file whose name is under
+ the cursor
+|gF| gF start editing the file whose name is under
+ the cursor and jump to the line number
+ following the filename.
+|gg| gg 1 cursor to line N, default first line
+|gh| gh start Select mode
+|gi| gi 2 like "i", but first move to the |'^| mark
+|gj| gj 1 like "j", but when 'wrap' on go N screen
+ lines down
+|gk| gk 1 like "k", but when 'wrap' on go N screen
+ lines up
+|gm| gm 1 go to character at middle of the screenline
+|gM| gM 1 go to character at middle of the text line
+|gn| gn 1,2 find the next match with the last used
+ search pattern and Visually select it
+|go| go 1 cursor to byte N in the buffer
+|gp| ["x]gp 2 put the text [from register x] after the
+ cursor N times, leave the cursor after it
+|gq| gq{motion} 2 format Nmove text
+|gr| gr{char} 2 virtual replace N chars with {char}
+|gs| gs go to sleep for N seconds (default 1)
+|gt| gt go to the next tab page
+|gu| gu{motion} 2 make Nmove text lowercase
+|gv| gv reselect the previous Visual area
+|gw| gw{motion} 2 format Nmove text and keep cursor
+|netrw-gx| gx execute application for file name under the
+ cursor (only with |netrw| plugin)
+|g@| g@{motion} call 'operatorfunc'
+|g~| g~{motion} 2 swap case for Nmove text
+|g<Down>| g<Down> 1 same as "gj"
+|g<End>| g<End> 1 same as "g$"
+|g<Home>| g<Home> 1 same as "g0"
+|g<LeftMouse>| g<LeftMouse> same as <C-LeftMouse>
+ g<MiddleMouse> same as <C-MiddleMouse>
+|g<RightMouse>| g<RightMouse> same as <C-RightMouse>
+|g<Tab>| g<Tab> go to the last accessed tab page.
+|g<Up>| g<Up> 1 same as "gk"
+
+==============================================================================
+2.5 Commands starting with 'z' *z*
+
+tag char note action in Normal mode ~
+------------------------------------------------------------------------------
+|z<CR>| z<CR> redraw, cursor line to top of window,
+ cursor on first non-blank
+|zN<CR>| z{height}<CR> redraw, make window {height} lines high
+|z+| z+ cursor on line N (default line below
+ window), otherwise like "z<CR>"
+|z-| z- redraw, cursor line at bottom of window,
+ cursor on first non-blank
+|z.| z. redraw, cursor line to center of window,
+ cursor on first non-blank
+|z=| z= give spelling suggestions
+|zA| zA open a closed fold or close an open fold
+ recursively
+|zC| zC close folds recursively
+|zD| zD delete folds recursively
+|zE| zE eliminate all folds
+|zF| zF create a fold for N lines
+|zG| zG temporarily mark word as correctly spelled
+|zH| zH when 'wrap' off scroll half a screenwidth
+ to the right
+|zL| zL when 'wrap' off scroll half a screenwidth
+ to the left
+|zM| zM set 'foldlevel' to zero
+|zN| zN set 'foldenable'
+|zO| zO open folds recursively
+|zR| zR set 'foldlevel' to the deepest fold
+|zW| zW temporarily mark word as incorrectly spelled
+|zX| zX re-apply 'foldlevel'
+|z^| z^ cursor on line N (default line above
+ window), otherwise like "z-"
+|za| za open a closed fold, close an open fold
+|zb| zb redraw, cursor line at bottom of window
+|zc| zc close a fold
+|zd| zd delete a fold
+|ze| ze when 'wrap' off scroll horizontally to
+ position the cursor at the end (right side)
+ of the screen
+|zf| zf{motion} create a fold for Nmove text
+|zg| zg permanently mark word as correctly spelled
+|zh| zh when 'wrap' off scroll screen N characters
+ to the right
+|zi| zi toggle 'foldenable'
+|zj| zj 1 move to the start of the next fold
+|zk| zk 1 move to the end of the previous fold
+|zl| zl when 'wrap' off scroll screen N characters
+ to the left
+|zm| zm subtract one from 'foldlevel'
+|zn| zn reset 'foldenable'
+|zo| zo open fold
+|zp| zp paste in block-mode without trailing spaces
+|zP| zP paste in block-mode without trailing spaces
+|zr| zr add one to 'foldlevel'
+|zs| zs when 'wrap' off scroll horizontally to
+ position the cursor at the start (left
+ side) of the screen
+|zt| zt redraw, cursor line at top of window
+|zuw| zuw undo |zw|
+|zug| zug undo |zg|
+|zuW| zuW undo |zW|
+|zuG| zuG undo |zG|
+|zv| zv open enough folds to view the cursor line
+|zw| zw permanently mark word as incorrectly spelled
+|zx| zx re-apply 'foldlevel' and do "zv"
+|zy| zy yank without trailing spaces
+|zz| zz redraw, cursor line at center of window
+|z<Left>| z<Left> same as "zh"
+|z<Right>| z<Right> same as "zl"
+
+==============================================================================
+2.6 Operator-pending mode *operator-pending-index*
+
+These can be used after an operator, but before a {motion} has been entered.
+
+tag char action in Operator-pending mode ~
+-----------------------------------------------------------------------
+|o_v| v force operator to work characterwise
+|o_V| V force operator to work linewise
+|o_CTRL-V| CTRL-V force operator to work blockwise
+
+==============================================================================
+3. Visual mode *visual-index*
+
+Most commands in Visual mode are the same as in Normal mode. The ones listed
+here are those that are different.
+
+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
+|v_CTRL-H| CTRL-H 2 same as <BS>
+|v_CTRL-O| CTRL-O switch from Select to Visual mode for one
+ 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
+ external command {filter}
+|v_:| : start a command-line with the highlighted
+ lines as a range
+|v_<| < 2 shift the highlighted lines one
+ 'shiftwidth' left
+|v_=| = 2 filter the highlighted lines through the
+ external program given with the 'equalprg'
+ option
+|v_>| > 2 shift the highlighted lines one
+ 'shiftwidth' right
+|v_b_A| A 2 block mode: append same text in all lines,
+ after the highlighted area
+|v_C| C 2 delete the highlighted lines and start
+ insert
+|v_D| D 2 delete the highlighted lines
+|v_b_I| I 2 block mode: insert same text in all lines,
+ before the highlighted area
+|v_J| J 2 join the highlighted lines
+|v_K| K run 'keywordprg' on the highlighted area
+|v_O| O move horizontally to other corner of area
+|v_P| P replace highlighted area with register
+ contents; registers are unchanged
+ Q does not start Ex mode
+|v_R| R 2 delete the highlighted lines and start
+ insert
+|v_S| S 2 delete the highlighted lines and start
+ insert
+|v_U| U 2 make highlighted area uppercase
+|v_V| V make Visual mode linewise or stop Visual
+ mode
+|v_X| X 2 delete the highlighted lines
+|v_Y| Y yank the highlighted lines
+|v_aquote| a" extend highlighted area with a double
+ quoted string
+|v_a'| a' extend highlighted area with a single
+ quoted string
+|v_a(| a( same as ab
+|v_a)| a) same as ab
+|v_a<| a< extend highlighted area with a <> block
+|v_a>| a> same as a<
+|v_aB| aB extend highlighted area with a {} block
+|v_aW| aW extend highlighted area with "a WORD"
+|v_a[| a[ extend highlighted area with a [] block
+|v_a]| a] same as a[
+|v_a`| a` extend highlighted area with a backtick
+ quoted string
+|v_ab| ab extend highlighted area with a () block
+|v_ap| ap extend highlighted area with a paragraph
+|v_as| as extend highlighted area with a sentence
+|v_at| at extend highlighted area with a tag block
+|v_aw| aw extend highlighted area with "a word"
+|v_a{| a{ same as aB
+|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
+|v_gv| gv exchange current and previous highlighted
+ area
+|v_iquote| i" extend highlighted area with a double
+ quoted string (without quotes)
+|v_i'| i' extend highlighted area with a single
+ quoted string (without quotes)
+|v_i(| i( same as ib
+|v_i)| i) same as ib
+|v_i<| i< extend highlighted area with inner <> block
+|v_i>| i> same as i<
+|v_iB| iB extend highlighted area with inner {} block
+|v_iW| iW extend highlighted area with "inner WORD"
+|v_i[| i[ extend highlighted area with inner [] block
+|v_i]| i] same as i[
+|v_i`| i` extend highlighted area with a backtick
+ quoted string (without the backticks)
+|v_ib| ib extend highlighted area with inner () block
+|v_ip| ip extend highlighted area with inner paragraph
+|v_is| is extend highlighted area with inner sentence
+|v_it| it extend highlighted area with inner tag block
+|v_iw| iw extend highlighted area with "inner word"
+|v_i{| i{ same as iB
+|v_i}| i} same as iB
+|v_o| o move cursor to other corner of area
+|v_p| p replace highlighted area with register
+ contents; deleted text in unnamed register
+|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
+ Visual mode
+|v_x| x 2 delete the highlighted area
+|v_y| y yank the highlighted area
+|v_~| ~ 2 swap case for the highlighted area
+
+==============================================================================
+4. Command-line editing *ex-edit-index*
+
+Get to the command-line with the ':', '!', '/' or '?' commands.
+Normal characters are inserted at the current cursor position.
+"Completion" below refers to context-sensitive completion. It will complete
+file names, tags, commands etc. as appropriate.
+
+tag command action in Command-line editing mode ~
+------------------------------------------------------------------------------
+ CTRL-@ not used
+|c_CTRL-A| CTRL-A do completion on the pattern in front of the
+ cursor and insert all matches
+|c_CTRL-B| CTRL-B cursor to begin of command-line
+|c_CTRL-C| CTRL-C same as <Esc>
+|c_CTRL-D| CTRL-D list completions that match the pattern in
+ front of the cursor
+|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
+|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
+|c_CTRL-H| CTRL-H same as <BS>
+|c_<Tab>| <Tab> if 'wildchar' is <Tab>: Do completion on
+ the pattern in front of the cursor
+|c_<S-Tab>| <S-Tab> same as CTRL-P
+|c_wildchar| 'wildchar' Do completion on the pattern in front of the
+ cursor (default: <Tab>)
+|c_CTRL-I| CTRL-I same as <Tab>
+|c_<NL>| <NL> same as <CR>
+|c_CTRL-J| CTRL-J same as <CR>
+|c_CTRL-K| CTRL-K {char1} {char2}
+ enter digraph
+|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_CTRL-M| CTRL-M same as <CR>
+|c_CTRL-N| CTRL-N after using 'wildchar' with multiple matches:
+ 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: 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 {regname}
+ insert the contents of a register or object
+ under the cursor as if typed
+|c_CTRL-R_CTRL-R| CTRL-R CTRL-R {regname}
+|c_CTRL-R_CTRL-O| CTRL-R CTRL-O {regname}
+ insert the contents of a register or object
+ under the cursor literally
+ CTRL-S not used, or used for terminal control flow
+|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.
+|c_CTRL-W| CTRL-W delete the word in front of the cursor
+ CTRL-X not used (reserved for completion)
+ CTRL-Y copy (yank) modeless selection
+ CTRL-Z not used (reserved for suspend)
+|c_<Esc>| <Esc> abandon command-line without executing it
+|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
+ CTRL-\ a - d reserved for extensions
+|c_CTRL-\_e| CTRL-\ e {expr} replace the command line with the result of
+ {expr}
+ CTRL-\ f - z reserved for extensions
+ CTRL-\ others not used
+|c_CTRL-]| CTRL-] trigger abbreviation
+|c_CTRL-^| CTRL-^ toggle use of |:lmap| mappings
+|c_CTRL-_| CTRL-_ when 'allowrevins' set: change language
+ (Hebrew, Farsi)
+|c_<Del>| <Del> delete the character under the cursor
+
+|c_<Left>| <Left> cursor left
+|c_<S-Left>| <S-Left> cursor one word left
+|c_<C-Left>| <C-Left> cursor one word left
+|c_<Right>| <Right> cursor right
+|c_<S-Right>| <S-Right> cursor one word right
+|c_<C-Right>| <C-Right> cursor one word right
+|c_<Up>| <Up> recall previous command-line from history that
+ matches pattern in front of the cursor
+|c_<S-Up>| <S-Up> recall previous command-line from history
+|c_<Down>| <Down> recall next command-line from history that
+ matches pattern in front of the cursor
+|c_<S-Down>| <S-Down> recall next command-line from history
+|c_<Home>| <Home> cursor to start of command-line
+|c_<End>| <End> cursor to end of command-line
+|c_<PageDown>| <PageDown> same as <S-Down>
+|c_<PageUp>| <PageUp> same as <S-Up>
+|c_<Insert>| <Insert> toggle insert/overstrike mode
+|c_<LeftMouse>| <LeftMouse> cursor at mouse click
+
+==============================================================================
+5. Terminal-Job mode *terminal-job-index*
+
+Most Normal mode commands except for window commands (|CTRL-W|) do not work in
+a terminal window. Switch to Terminal-Normal mode to use them.
+This assumes 'termwinkey' is not set.
+
+tag char action in Terminal-Job mode ~
+-----------------------------------------------------------------------
+|t_CTRL-\_CTRL-N| CTRL-\ CTRL-N switch to Terminal-Normal mode
+|t_CTRL-W_N| CTRL-W N switch to Terminal-Normal mode
+|t_CTRL-W_:| CTRL-W : enter an Ex command
+|t_CTRL-W_.| CTRL-W . type CTRL-W in the terminal
+ CTRL-W CTRL-\ send a CTRL-\ to the job in the terminal
+|t_CTRL-W_quote| CTRL-W " {register}
+ paste register in the terminal
+|t_CTRL-W_CTRL-C| CTRL-W CTRL-C forcefully ends the job
+|t_CTRL-W_CTRL-W| CTRL-W CTRL-W move focus to the next window
+|t_CTRL-W_gt| CTRL-W gt go to next tabpage, same as `gt`
+|t_CTRL-W_gT| CTRL-W gT go to previous tabpage, same as `gT`
+
+You found it, Arthur! *holy-grail* *:smile*
+
+==============================================================================
+6. EX commands *ex-cmd-index* *:index*
+
+This is a brief but complete listing of all the ":" commands, without
+mentioning any arguments. The optional part of the command name is inside [].
+The commands are sorted on the non-optional part of their name.
+
+tag command action ~
+------------------------------------------------------------------------------
+|:| : nothing
+|:range| :{range} go to last line in {range}
+|:!| :! filter lines or execute an external command
+|:!!| :!! repeat last ":!" command
+|:#| :# same as ":number"
+|:&| :& repeat last ":substitute"
+|:star| :* use the last Visual area, like :'<,'>
+|:<| :< shift lines one 'shiftwidth' left
+|:=| := print the last line number
+|:>| :> shift lines one 'shiftwidth' right
+|:@| :@ execute contents of a register
+|:@@| :@@ repeat the previous ":@"
+|:Next| :N[ext] go to previous file in the argument list
+|:Print| :P[rint] print lines
+|:X| :X ask for encryption key
+|:append| :a[ppend] append text
+|:abbreviate| :ab[breviate] enter abbreviation
+|:abclear| :abc[lear] remove all abbreviations
+|:aboveleft| :abo[veleft] make split window appear left or above
+|:all| :al[l] open a window for each file in the argument
+ list
+|:amenu| :am[enu] enter new menu item for all modes
+|:anoremenu| :an[oremenu] enter a new menu for all modes that will not
+ be remapped
+|:args| :ar[gs] print the argument list
+|:argadd| :arga[dd] add items to the argument list
+|:argdedupe| :argded[upe] remove duplicates from the argument list
+|:argdelete| :argd[elete] delete items from the argument list
+|:argedit| :arge[dit] add item to the argument list and edit it
+|:argdo| :argdo do a command on all items in the argument list
+|:argglobal| :argg[lobal] define the global argument list
+|:arglocal| :argl[ocal] define a local argument list
+|:argument| :argu[ment] go to specific file in the argument list
+|:ascii| :as[cii] print ascii value of character under the cursor
+|:autocmd| :au[tocmd] enter or show autocommands
+|:augroup| :aug[roup] select the autocommand group to use
+|:aunmenu| :aun[menu] remove menu for all modes
+|:buffer| :b[uffer] go to specific buffer in the buffer list
+|:bNext| :bN[ext] go to previous buffer in the buffer list
+|:ball| :ba[ll] open a window for each buffer in the buffer list
+|:badd| :bad[d] add buffer to the buffer list
+|:balt| :balt like ":badd" but also set the alternate file
+|:bdelete| :bd[elete] remove a buffer from the buffer list
+|:behave| :be[have] set mouse and selection behavior
+|:belowright| :bel[owright] make split window appear right or below
+|:bfirst| :bf[irst] go to first buffer in the buffer list
+|:blast| :bl[ast] go to last buffer in the buffer list
+|:bmodified| :bm[odified] go to next buffer in the buffer list that has
+ been modified
+|:bnext| :bn[ext] go to next buffer in the buffer list
+|:botright| :bo[tright] make split window appear at bottom or far right
+|:bprevious| :bp[revious] go to previous buffer in the buffer list
+|:brewind| :br[ewind] go to first buffer in the buffer list
+|:break| :brea[k] break out of while loop
+|:breakadd| :breaka[dd] add a debugger breakpoint
+|:breakdel| :breakd[el] delete a debugger breakpoint
+|:breaklist| :breakl[ist] list debugger breakpoints
+|:browse| :bro[wse] use file selection dialog
+|:bufdo| :bufdo execute command in each listed buffer
+|:buffers| :buffers list all files in the buffer list
+|:bunload| :bun[load] unload a specific buffer
+|:bwipeout| :bw[ipeout] really delete a buffer
+|:change| :c[hange] replace a line or series of lines
+|:cNext| :cN[ext] go to previous error
+|:cNfile| :cNf[ile] go to last error in previous file
+|:cabbrev| :ca[bbrev] like ":abbreviate" but for Command-line mode
+|:cabclear| :cabc[lear] clear all abbreviations for Command-line mode
+|:cabove| :cabo[ve] go to error above current line
+|:caddbuffer| :cad[dbuffer] add errors from buffer
+|:caddexpr| :cadde[xpr] add errors from expr
+|:caddfile| :caddf[ile] add error message to current quickfix list
+|:cafter| :caf[ter] go to error after current cursor
+|:call| :cal[l] call a function
+|:catch| :cat[ch] part of a :try command
+|:cbefore| :cbef[ore] go to error before current cursor
+|:cbelow| :cbel[ow] go to error below current line
+|: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
+|:cd| :cd change directory
+|:cdo| :cdo execute command in each valid error list entry
+|:cfdo| :cfd[o] execute command in each file in error list
+|:center| :ce[nter] format lines at the center
+|:cexpr| :cex[pr] read errors from expr and jump to first
+|:cfile| :cf[ile] read file with error messages and jump to first
+|:cfirst| :cfir[st] go to the specified error, default first one
+|:cgetbuffer| :cgetb[uffer] get errors from buffer
+|:cgetexpr| :cgete[xpr] get errors from expr
+|:cgetfile| :cg[etfile] read file with error messages
+|:changes| :changes print the change list
+|:chdir| :chd[ir] change directory
+|:checkpath| :che[ckpath] list included files
+|:checktime| :checkt[ime] check timestamp of loaded buffers
+|:chistory| :chi[story] list the error lists
+|:class| :class start of a class specification
+|: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
+|:cmenu| :cme[nu] add menu for Command-line mode
+|:cnext| :cn[ext] go to next error
+|:cnewer| :cnew[er] go to newer error list
+|:cnfile| :cnf[ile] go to first error in next file
+|:cnoremap| :cno[remap] like ":noremap" but for Command-line mode
+|:cnoreabbrev| :cnorea[bbrev] like ":noreabbrev" but for Command-line mode
+|:cnoremenu| :cnoreme[nu] like ":noremenu" but for Command-line mode
+|:copy| :co[py] copy lines
+|:colder| :col[der] go to older error list
+|:colorscheme| :colo[rscheme] load a specific color scheme
+|:command| :com[mand] create user-defined command
+|:comclear| :comc[lear] clear all user-defined commands
+|:compiler| :comp[iler] do settings for a specific compiler
+|:continue| :con[tinue] go back to :while
+|:confirm| :conf[irm] prompt user when confirmation required
+|:const| :cons[t] create a variable as a constant
+|:copen| :cope[n] open quickfix window
+|:cprevious| :cp[revious] go to previous error
+|:cpfile| :cpf[ile] go to last error in previous file
+|:cquit| :cq[uit] quit Vim with an error code
+|:crewind| :cr[ewind] go to the specified error, default first one
+|:cscope| :cs[cope] execute cscope command
+|:cstag| :cst[ag] use cscope to jump to a tag
+|:cunmap| :cu[nmap] like ":unmap" but for Command-line mode
+|:cunabbrev| :cuna[bbrev] like ":unabbrev" but for Command-line mode
+|:cunmenu| :cunme[nu] remove menu for Command-line mode
+|:cwindow| :cw[indow] open or close quickfix window
+|:delete| :d[elete] delete lines
+|:debug| :deb[ug] run a command in debugging mode
+|:debuggreedy| :debugg[reedy] read debug mode commands from normal input
+|:def| :def define a Vim9 user function
+|:defcompile| :defc[ompile] compile Vim9 user functions in current script
+|:defer| :defer call function when current function is done
+|:delcommand| :delc[ommand] delete user-defined command
+|:delfunction| :delf[unction] delete a user function
+|:delmarks| :delm[arks] delete marks
+|:diffupdate| :dif[fupdate] update 'diff' buffers
+|:diffget| :diffg[et] remove differences in current buffer
+|:diffoff| :diffo[ff] switch off diff mode
+|:diffpatch| :diffp[atch] apply a patch and show differences
+|:diffput| :diffpu[t] remove differences in other buffer
+|:diffsplit| :diffs[plit] show differences with another file
+|:diffthis| :diffthis make current window a diff window
+|:digraphs| :dig[raphs] show or enter digraphs
+|:display| :di[splay] display registers
+|:disassemble| :disa[ssemble] disassemble Vim9 user function
+|:djump| :dj[ump] jump to #define
+|:dl| :dl 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
+|:dp| :d[elete]p short for |:delete| with the 'p' flag
+|:drop| :dr[op] jump to window editing file or edit file in
+ current window
+|:dsearch| :ds[earch] list one #define
+|:dsplit| :dsp[lit] split window and jump to #define
+|:edit| :e[dit] edit a file
+|:earlier| :ea[rlier] go to older change, undo
+|:echo| :ec[ho] echoes the result of expressions
+|:echoconsole| :echoc[onsole] like :echomsg but write to stdout
+|:echoerr| :echoe[rr] like :echo, show like an error and use history
+|:echohl| :echoh[l] set highlighting for echo commands
+|:echomsg| :echom[sg] same as :echo, put message in history
+|:echon| :echon same as :echo, but without <EOL>
+|:echowindow| :echow[indow] same as :echomsg, but use a popup window
+|:else| :el[se] part of an :if command
+|:elseif| :elsei[f] part of an :if command
+|:emenu| :em[enu] execute a menu by name
+|:endclass| :endclass end of a class specification
+|:enddef| :enddef end of a user function started with :def
+|:endif| :en[dif] end previous :if
+|:endfor| :endfo[r] end previous :for
+|:endfunction| :endf[unction] end of a user function started with :function
+|:endtry| :endt[ry] end previous :try
+|:endwhile| :endw[hile] end previous :while
+|:enew| :ene[w] edit a new, unnamed buffer
+|:eval| :ev[al] evaluate an expression and discard the result
+|:ex| :ex same as ":edit"
+|:execute| :exe[cute] execute result of expressions
+|:exit| :exi[t] same as ":xit"
+|:export| :exp[ort] Vim9: export an item from a script
+|:exusage| :exu[sage] overview of Ex commands
+|: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
+|:final| :final declare an immutable variable in Vim9
+|:finally| :fina[lly] part of a :try command
+|:finish| :fini[sh] quit sourcing a Vim script
+|:first| :fir[st] go to the first file in the argument list
+|:fixdel| :fix[del] set key code of <Del>
+|:fold| :fo[ld] create a fold
+|:foldclose| :foldc[lose] close folds
+|:folddoopen| :foldd[oopen] execute command on lines not in a closed fold
+|:folddoclosed| :folddoc[losed] execute command on lines in a closed fold
+|:foldopen| :foldo[pen] open folds
+|:for| :for for loop
+|:function| :fu[nction] define a user function
+|:global| :g[lobal] execute commands for matching lines
+|:goto| :go[to] go to byte in the buffer
+|:grep| :gr[ep] run 'grepprg' and jump to first match
+|:grepadd| :grepa[dd] like :grep, but append to current list
+|:gui| :gu[i] start the GUI
+|:gvim| :gv[im] start the GUI
+|:hardcopy| :ha[rdcopy] send text to the printer
+|:help| :h[elp] open a help window
+|:helpclose| :helpc[lose] close one help window
+|:helpfind| :helpf[ind] dialog to open a help window
+|:helpgrep| :helpg[rep] like ":grep" but searches help files
+|:helptags| :helpt[ags] generate help tags for a directory
+|:highlight| :hi[ghlight] specify highlighting methods
+|:hide| :hid[e] hide current buffer for a command
+|:history| :his[tory] print a history list
+|:horizontal| :hor[izontal] following window command work horizontally
+|:insert| :i[nsert] insert text
+|:iabbrev| :ia[bbrev] like ":abbrev" but for Insert mode
+|:iabclear| :iabc[lear] like ":abclear" but for Insert mode
+|:if| :if execute commands when condition met
+|:ijump| :ij[ump] jump to definition of identifier
+|:ilist| :il[ist] list lines where identifier matches
+|:imap| :im[ap] like ":map" but for Insert mode
+|:imapclear| :imapc[lear] like ":mapclear" but for Insert mode
+|:imenu| :ime[nu] add menu for Insert mode
+|:import| :imp[ort] Vim9: import an item from another script
+|:inoremap| :ino[remap] like ":noremap" but for Insert mode
+|:inoreabbrev| :inorea[bbrev] like ":noreabbrev" but for Insert mode
+|:inoremenu| :inoreme[nu] like ":noremenu" but for Insert mode
+|:intro| :int[ro] print the introductory message
+|:isearch| :is[earch] list one line where identifier matches
+|:isplit| :isp[lit] split window and jump to definition of
+ identifier
+|:iunmap| :iu[nmap] like ":unmap" but for Insert mode
+|:iunabbrev| :iuna[bbrev] like ":unabbrev" but for Insert mode
+|:iunmenu| :iunme[nu] remove menu for Insert mode
+|:join| :j[oin] join lines
+|:jumps| :ju[mps] print the jump list
+|:k| :k set a mark
+|:keepalt| :keepa[lt] following command keeps the alternate file
+|:keepmarks| :kee[pmarks] following command keeps marks where they are
+|:keepjumps| :keepj[umps] following command keeps jumplist and marks
+|:keeppatterns| :keepp[atterns] following command keeps search pattern history
+|:lNext| :lN[ext] go to previous entry in location list
+|:lNfile| :lNf[ile] go to last entry in previous file
+|:list| :l[ist] print lines
+|:labove| :lab[ove] go to location above current line
+|:laddexpr| :lad[dexpr] add locations from expr
+|:laddbuffer| :laddb[uffer] add locations from buffer
+|:laddfile| :laddf[ile] add locations to current location list
+|:lafter| :laf[ter] go to location after current cursor
+|: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
+|:lbefore| :lbef[ore] go to location before current cursor
+|:lbelow| :lbel[ow] go to location below current line
+|: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
+|:lclose| :lcl[ose] close location window
+|:lcscope| :lcs[cope] like ":cscope" but uses location list
+|:ldo| :ld[o] execute command in valid location list entries
+|:lfdo| :lfd[o] execute command in each file in location list
+|:left| :le[ft] left align lines
+|:leftabove| :lefta[bove] make split window appear left or above
+|:legacy| :leg[acy] make following command use legacy script syntax
+|:let| :let assign a value to a variable or option
+|:lexpr| :lex[pr] read locations from expr and jump to first
+|:lfile| :lf[ile] read file with locations and jump to first
+|:lfirst| :lfir[st] go to the specified location, default first one
+|:lgetbuffer| :lgetb[uffer] get locations from buffer
+|:lgetexpr| :lgete[xpr] get locations from expr
+|:lgetfile| :lg[etfile] read file with locations
+|: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
+|:lmake| :lmak[e] execute external command 'makeprg' and parse
+ error messages
+|:lmap| :lm[ap] like ":map!" but includes Lang-Arg mode
+|:lmapclear| :lmapc[lear] like ":mapclear!" but includes Lang-Arg mode
+|:lnext| :lne[xt] go to next location
+|:lnewer| :lnew[er] go to newer location list
+|:lnfile| :lnf[ile] go to first location in next file
+|:lnoremap| :ln[oremap] like ":noremap!" but includes Lang-Arg mode
+|:loadkeymap| :loadk[eymap] load the following keymaps until EOF
+|:loadview| :lo[adview] load view for current window from a file
+|:lockmarks| :loc[kmarks] following command keeps marks where they are
+|:lockvar| :lockv[ar] lock variables
+|:lolder| :lol[der] go to older location list
+|:lopen| :lope[n] open location window
+|:lprevious| :lp[revious] go to previous location
+|:lpfile| :lpf[ile] go to last location in previous file
+|:lrewind| :lr[ewind] go to the specified location, default first one
+|:ls| :ls list all buffers
+|: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
+|:move| :m[ove] move lines
+|:mark| :ma[rk] set a mark
+|:make| :mak[e] execute external command 'makeprg' and parse
+ error messages
+|:map| :map show or enter a mapping
+|:mapclear| :mapc[lear] clear all mappings for Normal and Visual mode
+|:marks| :marks list all marks
+|:match| :mat[ch] define a match to highlight
+|:menu| :me[nu] enter a new menu item
+|:menutranslate| :menut[ranslate] add a menu translation item
+|:messages| :mes[sages] view previously displayed messages
+|:mkexrc| :mk[exrc] write current mappings and settings to a file
+|:mksession| :mks[ession] write session info to a file
+|:mkspell| :mksp[ell] produce .spl spell file
+|:mkvimrc| :mkv[imrc] write current mappings and settings to a file
+|:mkview| :mkvie[w] write view of current window to a file
+|:mode| :mod[e] show or change the screen mode
+|:mzscheme| :mz[scheme] execute MzScheme command
+|:mzfile| :mzf[ile] execute MzScheme script file
+|:nbclose| :nbc[lose] close the current Netbeans session
+|:nbkey| :nb[key] pass a key to Netbeans
+|:nbstart| :nbs[art] start a new Netbeans session
+|:next| :n[ext] go to next file in the argument list
+|:new| :new create a new empty window
+|:nmap| :nm[ap] like ":map" but for Normal mode
+|:nmapclear| :nmapc[lear] clear all mappings for Normal mode
+|:nmenu| :nme[nu] add menu for Normal mode
+|:nnoremap| :nn[oremap] like ":noremap" but for Normal mode
+|:nnoremenu| :nnoreme[nu] like ":noremenu" but for Normal mode
+|:noautocmd| :noa[utocmd] following commands don't trigger autocommands
+|:noremap| :no[remap] enter a mapping that will not be remapped
+|:nohlsearch| :noh[lsearch] suspend 'hlsearch' highlighting
+|:noreabbrev| :norea[bbrev] enter an abbreviation that will not be
+ remapped
+|:noremenu| :noreme[nu] enter a menu that will not be remapped
+|:normal| :norm[al] execute Normal mode commands
+|:noswapfile| :nos[wapfile] following commands don't create a swap file
+|:number| :nu[mber] print lines with line number
+|:nunmap| :nun[map] like ":unmap" but for Normal mode
+|:nunmenu| :nunme[nu] remove menu for Normal mode
+|:oldfiles| :ol[dfiles] list files that have marks in the viminfo file
+|:open| :o[pen] start open mode (not implemented)
+|:omap| :om[ap] like ":map" but for Operator-pending mode
+|:omapclear| :omapc[lear] remove all mappings for Operator-pending mode
+|:omenu| :ome[nu] add menu for Operator-pending mode
+|:only| :on[ly] close all windows except the current one
+|:onoremap| :ono[remap] like ":noremap" but for Operator-pending mode
+|:onoremenu| :onoreme[nu] like ":noremenu" but for Operator-pending mode
+|:options| :opt[ions] open the options-window
+|:ounmap| :ou[nmap] like ":unmap" but for Operator-pending mode
+|:ounmenu| :ounme[nu] remove menu for Operator-pending mode
+|:ownsyntax| :ow[nsyntax] set new local syntax highlight for this window
+|:packadd| :pa[ckadd] add a plugin from 'packpath'
+|:packloadall| :packl[oadall] load all packages under 'packpath'
+|:pclose| :pc[lose] close preview window
+|:pedit| :ped[it] edit file in the preview window
+|:perl| :pe[rl] execute Perl command
+|:print| :p[rint] print lines
+|:profdel| :profd[el] stop profiling a function or script
+|:profile| :prof[ile] profiling functions and scripts
+|:promptfind| :pro[mptfind] open GUI dialog for searching
+|:promptrepl| :promptr[epl] open GUI dialog for search/replace
+|:perldo| :perld[o] execute Perl command for each line
+|:pop| :po[p] jump to older entry in tag stack
+|:popup| :popu[p] popup a menu by name
+|:ppop| :pp[op] ":pop" in preview window
+|:preserve| :pre[serve] write all text to swap file
+|:previous| :prev[ious] go to previous file in argument list
+|:psearch| :ps[earch] like ":ijump" but shows match in preview window
+|:ptag| :pt[ag] show tag in preview window
+|:ptNext| :ptN[ext] |:tNext| in preview window
+|:ptfirst| :ptf[irst] |:trewind| in preview window
+|:ptjump| :ptj[ump] |:tjump| and show tag in preview window
+|:ptlast| :ptl[ast] |:tlast| in preview window
+|:ptnext| :ptn[ext] |:tnext| in preview window
+|:ptprevious| :ptp[revious] |:tprevious| in preview window
+|:ptrewind| :ptr[ewind] |:trewind| in preview window
+|:ptselect| :pts[elect] |:tselect| and show tag in preview window
+|:public| :public prefix for a class or object member
+|:put| :pu[t] insert contents of register in the text
+|:pwd| :pw[d] print current directory
+|:py3| :py3 execute Python 3 command
+|:python3| :python3 same as :py3
+|:py3do| :py3d[o] execute Python 3 command for each line
+|:py3file| :py3f[ile] execute Python 3 script file
+|: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
+|:read| :r[ead] read file into the text
+|:recover| :rec[over] recover a file from a swap file
+|:redo| :red[o] redo one undone change
+|:redir| :redi[r] redirect messages to a file or register
+|:redraw| :redr[aw] force a redraw of the display
+|:redrawstatus| :redraws[tatus] force a redraw of the status line(s)
+|:redrawtabline| :redrawt[abline] force a redraw of the tabline
+|:registers| :reg[isters] display the contents of registers
+|:resize| :res[ize] change current window height
+|:retab| :ret[ab] change tab size
+|:return| :retu[rn] return from a user function
+|:rewind| :rew[ind] go to the first file in the argument list
+|:right| :ri[ght] right align text
+|:rightbelow| :rightb[elow] make split window appear right or below
+|:ruby| :rub[y] execute Ruby command
+|:rubydo| :rubyd[o] execute Ruby command for each line
+|:rubyfile| :rubyf[ile] execute Ruby script file
+|:rundo| :rund[o] read undo information from a file
+|:runtime| :ru[ntime] source vim scripts in 'runtimepath'
+|:rviminfo| :rv[iminfo] read from viminfo file
+|:substitute| :s[ubstitute] find and replace text
+|:sNext| :sN[ext] split window and go to previous file in
+ argument list
+|:sandbox| :san[dbox] execute a command in the sandbox
+|:sargument| :sa[rgument] split window and go to specific file in
+ argument list
+|:sall| :sal[l] open a window for each file in argument list
+|:saveas| :sav[eas] save file under another name.
+|:sbuffer| :sb[uffer] split window and go to specific file in the
+ buffer list
+|:sbNext| :sbN[ext] split window and go to previous file in the
+ buffer list
+|:sball| :sba[ll] open a window for each file in the buffer list
+|:sbfirst| :sbf[irst] split window and go to first file in the
+ buffer list
+|:sblast| :sbl[ast] split window and go to last file in buffer
+ list
+|:sbmodified| :sbm[odified] split window and go to modified file in the
+ buffer list
+|:sbnext| :sbn[ext] split window and go to next file in the buffer
+ list
+|:sbprevious| :sbp[revious] split window and go to previous file in the
+ buffer list
+|:sbrewind| :sbr[ewind] split window and go to first file in the
+ buffer list
+|:scriptnames| :scr[iptnames] list names of all sourced Vim scripts
+|:scriptencoding| :scripte[ncoding] encoding used in sourced Vim script
+|:scriptversion| :scriptv[ersion] version of Vim script used
+|:scscope| :scs[cope] split window and execute cscope command
+|:set| :se[t] show or set options
+|:setfiletype| :setf[iletype] set 'filetype', unless it was set already
+|:setglobal| :setg[lobal] show global values of options
+|:setlocal| :setl[ocal] show or set options locally
+|: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
+|:shell| :sh[ell] escape to a shell
+|: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
+|:sleep!| :sl[eep]! do nothing for a few seconds, without the
+ cursor visible
+|:slast| :sla[st] split window and go to last file in the
+ argument list
+|:smagic| :sm[agic] :substitute with 'magic'
+|:smap| :smap like ":map" but for Select mode
+|:smapclear| :smapc[lear] remove all mappings for Select mode
+|:smenu| :sme[nu] add menu for Select mode
+|:smile| :smi[le] make the user happy
+|:snext| :sn[ext] split window and go to next file in the
+ argument list
+|:snomagic| :sno[magic] :substitute with 'nomagic'
+|:snoremap| :snor[emap] like ":noremap" but for Select mode
+|:snoremenu| :snoreme[nu] like ":noremenu" but for Select mode
+|:sort| :sor[t] sort lines
+|:source| :so[urce] read Vim or Ex commands from a file
+|:spelldump| :spelld[ump] split window and fill with all correct words
+|:spellgood| :spe[llgood] add good word for spelling
+|:spellinfo| :spelli[nfo] show info about loaded spell files
+|:spellrare| :spellra[re] add rare word for spelling
+|:spellrepall| :spellr[epall] replace all bad words like last |z=|
+|:spellundo| :spellu[ndo] remove good or bad word
+|:spellwrong| :spellw[rong] add spelling mistake
+|:split| :sp[lit] split current window
+|:sprevious| :spr[evious] split window and go to previous file in the
+ argument list
+|:srewind| :sre[wind] split window and go to first file in the
+ argument list
+|:stop| :st[op] suspend the editor or escape to a shell
+|:stag| :sta[g] split window and jump to a tag
+|:startinsert| :star[tinsert] start Insert mode
+|:startgreplace| :startg[replace] start Virtual Replace mode
+|:startreplace| :startr[eplace] start Replace mode
+|:static| :static prefix for a class member or function
+|:stopinsert| :stopi[nsert] stop Insert mode
+|:stjump| :stj[ump] do ":tjump" and split window
+|:stselect| :sts[elect] do ":tselect" and split window
+|:sunhide| :sun[hide] same as ":unhide"
+|:sunmap| :sunm[ap] like ":unmap" but for Select mode
+|:sunmenu| :sunme[nu] remove menu for Select mode
+|:suspend| :sus[pend] same as ":stop"
+|:sview| :sv[iew] split window and edit file read-only
+|:swapname| :sw[apname] show the name of the current swap file
+|:syntax| :sy[ntax] syntax highlighting
+|:syntime| :synti[me] measure syntax highlighting speed
+|:syncbind| :sync[bind] sync scroll binding
+|:t| :t same as ":copy"
+|:tNext| :tN[ext] jump to previous matching tag
+|:tabNext| :tabN[ext] go to previous tab page
+|:tabclose| :tabc[lose] close current tab page
+|:tabdo| :tabdo execute command in each tab page
+|:tabedit| :tabe[dit] edit a file in a new tab page
+|:tabfind| :tabf[ind] find file in 'path', edit it in a new tab page
+|:tabfirst| :tabfir[st] go to first tab page
+|:tablast| :tabl[ast] go to last tab page
+|:tabmove| :tabm[ove] move tab page to other position
+|:tabnew| :tabnew edit a file in a new tab page
+|:tabnext| :tabn[ext] go to next tab page
+|:tabonly| :tabo[nly] close all tab pages except the current one
+|:tabprevious| :tabp[revious] go to previous tab page
+|:tabrewind| :tabr[ewind] go to first tab page
+|:tabs| :tabs list the tab pages and what they contain
+|:tab| :tab create new tab when opening new window
+|:tag| :ta[g] jump to tag
+|:tags| :tags show the contents of the tag stack
+|:tcd| :tc[d] change directory for tab page
+|:tchdir| :tch[dir] change directory for tab page
+|:tcl| :tcl execute Tcl command
+|:tcldo| :tcld[o] execute Tcl command for each line
+|:tclfile| :tclf[ile] execute Tcl script file
+|:tearoff| :te[aroff] tear-off a menu
+|:terminal| :ter[minal] open a terminal window
+|:tfirst| :tf[irst] jump to first matching tag
+|:throw| :th[row] throw an exception
+|:tjump| :tj[ump] like ":tselect", but jump directly when there
+ is only one match
+|:tlast| :tl[ast] jump to last matching tag
+|:tlmenu| :tlm[enu] add menu for Terminal-Job mode
+|:tlnoremenu| :tln[oremenu] like ":noremenu" but for Terminal-Job mode
+|:tlunmenu| :tlu[nmenu] remove menu for Terminal-Job mode
+|: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
+|:undolist| :undol[ist] list leafs of the undo tree
+|:unabbreviate| :una[bbreviate] remove abbreviation
+|:unhide| :unh[ide] open a window for each loaded file in the
+ buffer list
+|:unlet| :unl[et] delete variable
+|:unlockvar| :unlo[ckvar] unlock variables
+|:unmap| :unm[ap] remove mapping
+|:unmenu| :unme[nu] remove menu
+|:unsilent| :uns[ilent] run a command not silently
+|:update| :up[date] write buffer if modified
+|:vglobal| :v[global] execute commands for not matching lines
+|:var| :var variable declaration in Vim9
+|:version| :ve[rsion] print version number and other info
+|:verbose| :verb[ose] execute command with 'verbose' set
+|:vertical| :vert[ical] make following command split vertically
+|:vim9cmd| :vim9[cmd] make following command use Vim9 script syntax
+|:vim9script| :vim9s[cript] indicates Vim9 script file
+|:vimgrep| :vim[grep] search for pattern in files
+|:vimgrepadd| :vimgrepa[dd] like :vimgrep, but append to current list
+|:visual| :vi[sual] same as ":edit", but turns off "Ex" mode
+|:viusage| :viu[sage] overview of Normal mode commands
+|:view| :vie[w] edit a file read-only
+|:vmap| :vm[ap] like ":map" but for Visual+Select mode
+|:vmapclear| :vmapc[lear] remove all mappings for Visual+Select mode
+|:vmenu| :vme[nu] add menu for Visual+Select mode
+|:vnew| :vne[w] create a new empty window, vertically split
+|:vnoremap| :vn[oremap] like ":noremap" but for Visual+Select mode
+|:vnoremenu| :vnoreme[nu] like ":noremenu" but for Visual+Select mode
+|:vsplit| :vs[plit] split current window vertically
+|:vunmap| :vu[nmap] like ":unmap" but for Visual+Select mode
+|:vunmenu| :vunme[nu] remove menu for Visual+Select mode
+|:windo| :windo execute command in each window
+|:write| :w[rite] write to a file
+|:wNext| :wN[ext] write to a file and go to previous file in
+ argument list
+|:wall| :wa[ll] write all (changed) buffers
+|:while| :wh[ile] execute loop for as long as condition met
+|:winsize| :wi[nsize] get or set window size (obsolete)
+|:wincmd| :winc[md] execute a Window (CTRL-W) command
+|:winpos| :winp[os] get or set window position
+|:wnext| :wn[ext] write to a file and go to next file in
+ argument list
+|:wprevious| :wp[revious] write to a file and go to previous file in
+ argument list
+|:wq| :wq write to a file and quit window or Vim
+|:wqall| :wqa[ll] write all changed buffers and quit Vim
+|:wundo| :wu[ndo] write undo information to a file
+|:wviminfo| :wv[iminfo] write to viminfo file
+|:xit| :x[it] write if buffer changed and close window
+|:xall| :xa[ll] same as ":wqall"
+|:xmapclear| :xmapc[lear] remove all mappings for Visual mode
+|:xmap| :xm[ap] like ":map" but for Visual mode
+|:xmenu| :xme[nu] add menu for Visual mode
+|:xrestore| :xr[estore] restores the X server connection
+|:xnoremap| :xn[oremap] like ":noremap" but for Visual mode
+|:xnoremenu| :xnoreme[nu] like ":noremenu" but for Visual mode
+|:xunmap| :xu[nmap] like ":unmap" but for Visual mode
+|:xunmenu| :xunme[nu] remove menu for Visual mode
+|:yank| :y[ank] yank lines into a register
+|:z| :z print some lines
+|:~| :~ repeat last ":substitute"
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
new file mode 100644
index 0000000..ccf5178
--- /dev/null
+++ b/runtime/doc/insert.txt
@@ -0,0 +1,2138 @@
+*insert.txt* For Vim version 9.0. Last change: 2022 Sep 30
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *Insert* *Insert-mode*
+Inserting and replacing text *mode-ins-repl*
+
+Most of this file is about Insert and Replace mode. At the end are a few
+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.
+
+==============================================================================
+1. Special keys *ins-special-keys*
+
+In Insert and Replace mode, the following characters have a special meaning;
+other characters are inserted directly. To insert one of these special
+characters into the buffer, precede it with CTRL-V. To insert a <Nul>
+character use "CTRL-V CTRL-@" or "CTRL-V 000". On some systems, you have to
+use "CTRL-V 003" to insert a CTRL-C. Note: When CTRL-V is mapped you can
+often use CTRL-Q instead |i_CTRL-Q|.
+
+If you are working in a special language mode when inserting text, see the
+'langmap' option, |'langmap'|, on how to avoid switching this mode on and off
+all the time.
+
+If you have 'insertmode' set, <Esc> and a few other keys get another meaning.
+See |'insertmode'|.
+
+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.
+ *i_CTRL-C*
+CTRL-C Quit insert mode, go back to Normal mode. Do not check for
+ abbreviations. Does not trigger the |InsertLeave| autocommand
+ event.
+
+ *i_CTRL-@*
+CTRL-@ Insert previously inserted text and stop insert.
+
+ *i_CTRL-A*
+CTRL-A Insert previously inserted text.
+
+ *i_CTRL-H* *i_<BS>* *i_BS*
+<BS> or CTRL-H Delete the character before the cursor (see |i_backspacing|
+ about joining lines).
+ See |:fixdel| if your <BS> key does not do what you want.
+
+ *i_<Del>* *i_DEL*
+<Del> Delete the character under the cursor. If the cursor is at
+ the end of the line, and the 'backspace' option includes
+ "eol", delete the <EOL>; the next line is appended after the
+ current one.
+ See |:fixdel| if your <Del> key does not do what you want.
+ *i_CTRL-W*
+CTRL-W Delete the word before the cursor (see |i_backspacing| about
+ joining lines). See the section "word motions",
+ |word-motions|, for the definition of a word.
+ *i_CTRL-U*
+CTRL-U Delete all entered characters before the cursor in the current
+ line. If there are no newly entered characters and
+ 'backspace' is not empty, delete all characters before the
+ cursor in the current line.
+ If C-indenting is enabled the indent will be adjusted if the
+ line becomes blank.
+ See |i_backspacing| about joining lines.
+ *i_CTRL-I* *i_<Tab>* *i_Tab*
+<Tab> or CTRL-I Insert a tab. If the 'expandtab' option is on, the
+ equivalent number of spaces is inserted (use CTRL-V <Tab> to
+ avoid the expansion; use CTRL-Q <Tab> if CTRL-V is mapped
+ |i_CTRL-Q|). See also the 'smarttab' option and
+ |ins-expandtab|.
+ *i_CTRL-J* *i_<NL>*
+<NL> or CTRL-J Begin new line.
+ *i_CTRL-M* *i_<CR>*
+<CR> or CTRL-M Begin new line.
+ *i_CTRL-K*
+CTRL-K {char1} [char2]
+ Enter digraph (see |digraphs|). When {char1} is a special
+ key, the code for that key is inserted in <> form. For
+ example, the string "<S-Space>" can be entered by typing
+ <C-K><S-Space> (two keys). Neither char is considered for
+ mapping.
+
+CTRL-N Find next keyword (see |i_CTRL-N|).
+CTRL-P Find previous keyword (see |i_CTRL-P|).
+
+CTRL-R {register} *i_CTRL-R*
+ Insert the contents of a register. Between typing CTRL-R and
+ the second character, '"' will be displayed to indicate that
+ you are expected to enter the name of a register.
+ The text is inserted as if you typed it, but mappings and
+ abbreviations are not used. If you have options like
+ 'textwidth', 'formatoptions', or 'autoindent' set, this will
+ influence what will be inserted. This is different from what
+ happens with the "p" command and pasting with the mouse.
+ Special registers:
+ '"' the unnamed register, containing the text of
+ the last delete or yank
+ '%' the current file name
+ '#' the alternate file name
+ '*' the clipboard contents (X11: primary selection)
+ '+' the clipboard contents
+ '/' the last search pattern
+ ':' the last command-line
+ '.' the last inserted text
+ '-' the last small (less than a line) delete
+ *i_CTRL-R_=*
+ '=' the expression register: you are prompted to
+ enter an expression (see |expression|)
+ Note that 0x80 (128 decimal) is used for
+ special keys. E.g., you can use this to move
+ the cursor up:
+ CTRL-R ="\<Up>"
+ Use CTRL-R CTRL-R to insert text literally.
+ When the result is a |List| the items are used
+ as lines. They can have line breaks inside
+ too.
+ When the result is a Float it's automatically
+ converted to a String.
+ When append() or setline() is invoked the undo
+ sequence will be broken.
+ See |registers| about registers.
+
+CTRL-R CTRL-R {register} *i_CTRL-R_CTRL-R*
+ Insert the contents of a register. Works like using a single
+ CTRL-R, but the text is inserted literally, not as if typed.
+ This differs when the register contains characters like <BS>.
+ Example, where register a contains "ab^Hc": >
+ CTRL-R a results in "ac".
+ CTRL-R CTRL-R a results in "ab^Hc".
+< Options 'textwidth', 'formatoptions', etc. still apply. If
+ you also want to avoid these, use CTRL-R CTRL-O, see below.
+ The '.' register (last inserted text) is still inserted as
+ typed.
+ After this command, the '.' register contains the text from
+ the register as if it was inserted by typing it.
+
+CTRL-R CTRL-O {register} *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>|. 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.
+ After this command, the '.' register contains the command
+ typed and not the text. I.e., the literals "^R^O" and not the
+ text from the register.
+
+CTRL-R CTRL-P {register} *i_CTRL-R_CTRL-P*
+ Insert the contents of a register literally and fix the
+ indent, like |[<MiddleMouse>|.
+ Does not replace characters!
+ The '.' register (last inserted text) is still inserted as
+ typed.
+ After this command, the '.' register contains the command
+ typed and not the text. I.e., the literals "^R^P" and not the
+ text from the register.
+
+ *i_CTRL-T*
+CTRL-T Insert one shiftwidth of indent at the start of the current
+ line. The indent is always rounded to a 'shiftwidth' (this is
+ vi compatible).
+ *i_CTRL-D*
+CTRL-D Delete one shiftwidth of indent at the start of the current
+ line. The indent is always rounded to a 'shiftwidth' (this is
+ vi compatible).
+ *i_0_CTRL-D*
+0 CTRL-D Delete all indent in the current line.
+
+ *i_^_CTRL-D*
+^ CTRL-D Delete all indent in the current line. The indent is
+ restored in the next line. This is useful when inserting a
+ label.
+
+ *i_CTRL-V*
+CTRL-V Insert next non-digit literally. For special keys, the
+ terminal code is inserted. It's also possible to enter the
+ decimal, octal or hexadecimal value of a character
+ |i_CTRL-V_digit|.
+ The characters typed right after CTRL-V are not considered for
+ mapping.
+ Note: When CTRL-V is mapped (e.g., to paste text) you can
+ often use CTRL-Q instead |i_CTRL-Q|.
+ When |modifyOtherKeys| is enabled then special Escape sequence
+ is converted back to what it was without |modifyOtherKeys|,
+ unless the Shift key is also pressed.
+
+ *i_CTRL-Q*
+CTRL-Q Same as CTRL-V.
+ Note: Some terminal connections may eat CTRL-Q, it doesn't
+ work then. It does work in the GUI.
+
+CTRL-SHIFT-V *i_CTRL-SHIFT-V* *i_CTRL-SHIFT-Q*
+CTRL-SHIFT-Q Works just like CTRL-V, unless |modifyOtherKeys| is active,
+ then it inserts the Escape sequence for a key with modifiers.
+
+CTRL-X Enter CTRL-X mode. This is a sub-mode where commands can
+ be given to complete words or scroll the window. See
+ |i_CTRL-X| and |ins-completion|.
+
+ *i_CTRL-E*
+CTRL-E Insert the character which is below the cursor.
+ *i_CTRL-Y*
+CTRL-Y Insert the character which is above the cursor.
+ Note that for CTRL-E and CTRL-Y 'textwidth' is not used, to be
+ able to copy characters from a long line.
+
+ *i_CTRL-_*
+CTRL-_ Switch between languages, as follows:
+ - When in a rightleft window, revins and nohkmap are toggled,
+ since English will likely be inserted in this case.
+ - When in a norightleft window, revins and hkmap are toggled,
+ since Hebrew will likely be inserted in this case.
+
+ CTRL-_ moves the cursor to the end of the typed text.
+
+ This command is only available when the 'allowrevins' option
+ is set.
+ Please refer to |rileft.txt| for more information about
+ right-to-left mode.
+ Only if compiled with the |+rightleft| feature.
+
+ *i_CTRL-^*
+CTRL-^ Toggle the use of typing language characters.
+ When language |:lmap| mappings are defined:
+ - If 'iminsert' is 1 (langmap mappings used) it becomes 0 (no
+ langmap mappings used).
+ - If 'iminsert' has another value it becomes 1, thus langmap
+ mappings are enabled.
+ When no language mappings are defined:
+ - If 'iminsert' is 2 (Input Method used) it becomes 0 (no
+ Input Method used).
+ - If 'iminsert' has another value it becomes 2, thus the Input
+ Method is enabled.
+ When set to 1, the value of the "b:keymap_name" variable, the
+ 'keymap' option or "<lang>" appears in the status line.
+ The language mappings are normally used to type characters
+ that are different from what the keyboard produces. The
+ 'keymap' option can be used to install a whole number of them.
+
+ *i_CTRL-]*
+CTRL-] Trigger abbreviation, without inserting a character.
+
+ *i_<Insert>*
+<Insert> Toggle between Insert and Replace mode.
+-----------------------------------------------------------------------
+
+ *i_backspacing*
+The effect of the <BS>, CTRL-W, and CTRL-U depend on the 'backspace' option
+(unless 'revins' is set). This is a comma-separated list of items:
+
+item action ~
+indent allow backspacing over autoindent
+eol allow backspacing over end-of-line (join lines)
+start allow backspacing over the start position of insert; CTRL-W and
+ CTRL-U stop once at the start position
+
+When 'backspace' is empty, Vi compatible backspacing is used. You cannot
+backspace over autoindent, before column 1 or before where insert started.
+
+For backwards compatibility the values "0", "1", "2" and "3" are also allowed,
+see |'backspace'|.
+
+If the 'backspace' option does contain "eol" and the cursor is in column 1
+when one of the three keys is used, the current line is joined with the
+previous line. This effectively deletes the <EOL> in front of the cursor.
+
+ *i_CTRL-V_digit*
+With CTRL-V the decimal, octal or hexadecimal value of a character can be
+entered directly. This way you can enter any character, except a line break
+(<NL>, value 10). There are five ways to enter the character value:
+
+first char mode max nr of chars max value ~
+(none) decimal 3 255
+o or O octal 3 377 (255)
+x or X hexadecimal 2 ff (255)
+u hexadecimal 4 ffff (65535)
+U hexadecimal 8 7fffffff (2147483647)
+
+Normally you would type the maximum number of characters. Thus to enter a
+space (value 32) you would type <C-V>032. You can omit the leading zero, in
+which case the character typed after the number must be a non-digit. This
+happens for the other modes as well: As soon as you type a character that is
+invalid for the mode, the value before it will be used and the "invalid"
+character is dealt with in the normal way.
+
+If you enter a value of 10, it will end up in the file as a 0. The 10 is a
+<NL>, which is used internally to represent the <Nul> character. When writing
+the buffer to a file, the <NL> character is translated into <Nul>. The <NL>
+character is written at the end of each line. Thus if you want to insert a
+<NL> character in a file you will have to make a line break.
+Also see 'fileformat'.
+
+ *i_CTRL-X* *insert_expand*
+CTRL-X enters a sub-mode where several commands can be used. Most of these
+commands do keyword completion; see |ins-completion|.
+
+Two commands can be used to scroll the window up or down, without exiting
+insert mode:
+
+ *i_CTRL-X_CTRL-E*
+CTRL-X CTRL-E scroll window one line up.
+ When doing completion look here: |complete_CTRL-E|
+
+ *i_CTRL-X_CTRL-Y*
+CTRL-X CTRL-Y scroll window one line down.
+ When doing completion look here: |complete_CTRL-Y|
+
+After CTRL-X is pressed, each CTRL-E (CTRL-Y) scrolls the window up (down) by
+one line unless that would cause the cursor to move from its current position
+in the file. As soon as another key is pressed, CTRL-X mode is exited and
+that key is interpreted as in Insert mode.
+
+
+==============================================================================
+2. Special special keys *ins-special-special*
+
+The following keys are special. They stop the current insert, do something,
+and then restart insertion. This means you can do something without getting
+out of Insert mode. This is very handy if you prefer to use the Insert mode
+all the time, just like editors that don't have a separate Normal mode. You
+may also want to set the 'backspace' option to "indent,eol,start" and set the
+'insertmode' option. You can use CTRL-O if you want to map a function key to
+a command.
+
+The changes (inserted or deleted characters) before and after these keys can
+be undone separately. Only the last change can be redone and always behaves
+like an "i" command.
+
+char action ~
+-----------------------------------------------------------------------
+<Up> cursor one line up *i_<Up>*
+<Down> cursor one line down *i_<Down>*
+CTRL-G <Up> cursor one line up, insert start column *i_CTRL-G_<Up>*
+CTRL-G k cursor one line up, insert start column *i_CTRL-G_k*
+CTRL-G CTRL-K cursor one line up, insert start column *i_CTRL-G_CTRL-K*
+CTRL-G <Down> cursor one line down, insert start column *i_CTRL-G_<Down>*
+CTRL-G j cursor one line down, insert start column *i_CTRL-G_j*
+CTRL-G CTRL-J cursor one line down, insert start column *i_CTRL-G_CTRL-J*
+<Left> cursor one character left *i_<Left>*
+<Right> cursor one character right *i_<Right>*
+<S-Left> cursor one word back (like "b" command) *i_<S-Left>*
+<C-Left> cursor one word back (like "b" command) *i_<C-Left>*
+<S-Right> cursor one word forward (like "w" command) *i_<S-Right>*
+<C-Right> cursor one word forward (like "w" command) *i_<C-Right>*
+<Home> cursor to first char in the line *i_<Home>*
+<End> cursor to after last char in the line *i_<End>*
+<C-Home> cursor to first char in the file *i_<C-Home>*
+<C-End> cursor to after last char in the file *i_<C-End>*
+<LeftMouse> cursor to position of mouse click *i_<LeftMouse>*
+<S-Up> move window one page up *i_<S-Up>*
+<PageUp> move window one page up *i_<PageUp>*
+<S-Down> move window one page down *i_<S-Down>*
+<PageDown> move window one page down *i_<PageDown>*
+<ScrollWheelDown> move window three lines down *i_<ScrollWheelDown>*
+<S-ScrollWheelDown> move window one page down *i_<S-ScrollWheelDown>*
+<ScrollWheelUp> move window three lines up *i_<ScrollWheelUp>*
+<S-ScrollWheelUp> move window one page up *i_<S-ScrollWheelUp>*
+<ScrollWheelLeft> move window six columns left *i_<ScrollWheelLeft>*
+<S-ScrollWheelLeft> move window one page left *i_<S-ScrollWheelLeft>*
+<ScrollWheelRight> move window six columns right *i_<ScrollWheelRight>*
+<S-ScrollWheelRight> move window one page right *i_<S-ScrollWheelRight>*
+CTRL-O execute one command, return to Insert mode *i_CTRL-O*
+CTRL-\ CTRL-O like CTRL-O but don't move the cursor *i_CTRL-\_CTRL-O*
+CTRL-L when 'insertmode' is set: go to Normal mode *i_CTRL-L*
+CTRL-G u close undo sequence, start new change *i_CTRL-G_u*
+CTRL-G U don't start a new undo block with the next *i_CTRL-G_U*
+ left/right cursor movement, if the cursor
+ stays within the same 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>
+will then always put the cursor on it). Or use CTRL-\ CTRL-O, but then
+beware of the cursor possibly being beyond the end of the line. Note that the
+command following CTRL-\ CTRL-O can still move the cursor, it is not restored
+to its original position.
+
+The CTRL-O command takes you to Normal mode. If you then use a command enter
+Insert mode again it normally doesn't nest. Thus when typing "a<C-O>a" and
+then <Esc> takes you back to Normal mode, you do not need to type <Esc> twice.
+An exception is when not typing the command, e.g. when executing a mapping or
+sourcing a script. This makes mappings work that briefly switch to Insert
+mode.
+
+The shifted cursor keys are not available on all terminals.
+
+Another side effect is that a count specified before the "i" or "a" command is
+ignored. That is because repeating the effect of the command after CTRL-O is
+too complicated.
+
+An example for using CTRL-G u: >
+
+ :inoremap <C-H> <C-G>u<C-H>
+
+This redefines the backspace key to start a new undo sequence. You can now
+undo the effect of the backspace key, without changing what you typed before
+that, with CTRL-O u. Another example: >
+
+ :inoremap <CR> <C-]><C-G>u<CR>
+
+This starts a new undo block at each line break. It also expands
+abbreviations before this.
+
+An example for using CTRL-G U: >
+
+ inoremap <Left> <C-G>U<Left>
+ inoremap <Right> <C-G>U<Right>
+ inoremap <expr> <Home> col('.') == match(getline('.'), '\S') + 1 ?
+ \ repeat('<C-G>U<Left>', col('.') - 1) :
+ \ (col('.') < match(getline('.'), '\S') ?
+ \ repeat('<C-G>U<Right>', match(getline('.'), '\S') + 0) :
+ \ repeat('<C-G>U<Left>', col('.') - 1 - match(getline('.'), '\S')))
+ inoremap <expr> <End> repeat('<C-G>U<Right>', col('$') - col('.'))
+ inoremap ( ()<C-G>U<Left>
+
+This makes it possible to use the cursor keys in Insert mode, without starting
+a new undo block 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 using |.| to the expected
+
+ Lorem ipsum (dolor)
+
+Using CTRL-O splits undo: the text typed before and after it is undone
+separately. If you want to avoid this (e.g., in a mapping) you might be able
+to use CTRL-R = |i_CTRL-R|. E.g., to call a function: >
+ :imap <F2> <C-R>=MyFunc()<CR>
+
+When the 'whichwrap' option is set appropriately, the <Left> and <Right>
+keys on the first/last character in the line make the cursor wrap to the
+previous/next line.
+
+The CTRL-G j and CTRL-G k commands can be used to insert text in front of a
+column. Example: >
+ int i;
+ int j;
+Position the cursor on the first "int", type "istatic <C-G>j ". The
+result is: >
+ static int i;
+ int j;
+When inserting the same text in front of the column in every line, use the
+Visual blockwise command "I" |v_b_I|.
+
+==============================================================================
+3. 'textwidth' and 'wrapmargin' options *ins-textwidth*
+
+The 'textwidth' option can be used to automatically break a line before it
+gets too long. Set the 'textwidth' option to the desired maximum line
+length. If you then type more characters (not spaces or tabs), the
+last word will be put on a new line (unless it is the only word on the
+line). If you set 'textwidth' to 0, this feature is disabled.
+
+The 'wrapmargin' option does almost the same. The difference is that
+'textwidth' has a fixed width while 'wrapmargin' depends on the width of the
+screen. When using 'wrapmargin' this is equal to using 'textwidth' with a
+value equal to (columns - 'wrapmargin'), where columns is the width of the
+screen.
+
+When 'textwidth' and 'wrapmargin' are both set, 'textwidth' is used.
+
+If you don't really want to break the line, but view the line wrapped at a
+convenient place, see the 'linebreak' option.
+
+The line is only broken automatically when using Insert mode, or when
+appending to a line. When in replace mode and the line length is not
+changed, the line will not be broken.
+
+Long lines are broken if you enter a non-white character after the margin.
+The situations where a line will be broken can be restricted by adding
+characters to the 'formatoptions' option:
+"l" Only break a line if it was not longer than 'textwidth' when the insert
+ started.
+"v" Only break at a white character that has been entered during the
+ current insert command. This is mostly Vi-compatible.
+"lv" Only break if the line was not longer than 'textwidth' when the insert
+ started and only at a white character that has been entered during the
+ current insert command. Only differs from "l" when entering non-white
+ characters while crossing the 'textwidth' boundary.
+
+Normally an internal function will be used to decide where to break the line.
+If you want to do it in a different way set the 'formatexpr' option to an
+expression that will take care of the line break.
+
+If you want to format a block of text, you can use the "gq" operator. Type
+"gq" and a movement command to move the cursor to the end of the block. In
+many cases, the command "gq}" will do what you want (format until the end of
+paragraph). Alternatively, you can use "gqap", which will format the whole
+paragraph, no matter where the cursor currently is. Or you can use Visual
+mode: hit "v", move to the end of the block, and type "gq". See also |gq|.
+
+==============================================================================
+4. 'expandtab', 'smarttab' and 'softtabstop' options *ins-expandtab*
+
+If the 'expandtab' option is on, spaces will be used to fill the amount of
+whitespace of the tab. If you want to enter a real <Tab>, type CTRL-V first
+(use CTRL-Q when CTRL-V is mapped |i_CTRL-Q|).
+The 'expandtab' option is off by default. Note that in Replace mode, a single
+character is replaced with several spaces. The result of this is that the
+number of characters in the line increases. Backspacing will delete one
+space at a time. The original character will be put back for only one space
+that you backspace over (the last one).
+
+ *ins-smarttab*
+When the 'smarttab' option is on, a <Tab> inserts 'shiftwidth' positions at
+the beginning of a line and 'tabstop' positions in other places. This means
+that often spaces instead of a <Tab> character are inserted. When 'smarttab'
+is off, a <Tab> always inserts 'tabstop' positions, and 'shiftwidth' is only
+used for ">>" and the like.
+
+ *ins-softtabstop*
+When the 'softtabstop' option is non-zero, a <Tab> inserts 'softtabstop'
+positions, and a <BS> used to delete white space, will delete 'softtabstop'
+positions. This feels like 'tabstop' was set to 'softtabstop', but a real
+<Tab> character still takes 'tabstop' positions, so your file will still look
+correct when used by other applications.
+
+If 'softtabstop' is non-zero, a <BS> will try to delete as much white space to
+move to the previous 'softtabstop' position, except when the previously
+inserted character is a space, then it will only delete the character before
+the cursor. Otherwise you cannot always delete a single character before the
+cursor. You will have to delete 'softtabstop' characters first, and then type
+extra spaces to get where you want to be.
+
+==============================================================================
+5. Replace mode *Replace* *Replace-mode* *mode-replace*
+
+Enter Replace mode with the "R" command in normal mode.
+
+In Replace mode, one character in the line is deleted for every character you
+type. If there is no character to delete (at the end of the line), the
+typed character is appended (as in Insert mode). Thus the number of
+characters in a line stays the same until you get to the end of the line.
+If a <NL> is typed, a line break is inserted and no character is deleted.
+
+Be careful with <Tab> characters. If you type a normal printing character in
+its place, the number of characters is still the same, but the number of
+columns will become smaller.
+
+If you delete characters in Replace mode (with <BS>, CTRL-W, or CTRL-U), what
+happens is that you delete the changes. The characters that were replaced
+are restored. If you had typed past the existing text, the characters you
+added are deleted. This is effectively a character-at-a-time undo.
+
+If the 'expandtab' option is on, a <Tab> will replace one character with
+several spaces. The result of this is that the number of characters in the
+line increases. Backspacing will delete one space at a time. The original
+character will be put back for only one space that you backspace over (the
+last one).
+
+==============================================================================
+6. Virtual Replace mode *vreplace-mode* *Virtual-Replace-mode*
+
+Enter Virtual Replace mode with the "gR" command in normal mode.
+{not available when compiled without the |+vreplace| feature}
+
+Virtual Replace mode is similar to Replace mode, but instead of replacing
+actual characters in the file, you are replacing screen real estate, so that
+characters further on in the file never appear to move.
+
+So if you type a <Tab> it may replace several normal characters, and if you
+type a letter on top of a <Tab> it may not replace anything at all, since the
+<Tab> will still line up to the same place as before.
+
+Typing a <NL> still doesn't cause characters later in the file to appear to
+move. The rest of the current line will be replaced by the <NL> (that is,
+they are deleted), and replacing continues on the next line. A new line is
+NOT inserted unless you go past the end of the file.
+
+Interesting effects are seen when using CTRL-T and CTRL-D. The characters
+before the cursor are shifted sideways as normal, but characters later in the
+line still remain still. CTRL-T will hide some of the old line under the
+shifted characters, but CTRL-D will reveal them again.
+
+As with Replace mode, using <BS> etc will bring back the characters that were
+replaced. This still works in conjunction with 'smartindent', CTRL-T and
+CTRL-D, 'expandtab', 'smarttab', 'softtabstop', etc.
+
+In 'list' mode, Virtual Replace mode acts as if it was not in 'list' mode,
+unless "L" is in 'cpoptions'.
+
+Note that the only situations for which characters beyond the cursor should
+appear to move are in List mode |'list'|, and occasionally when 'wrap' is set
+(and the line changes length to become shorter or wider than the width of the
+screen). In other cases spaces may be inserted to avoid following characters
+to move.
+
+This mode is very useful for editing <Tab> separated columns in tables, for
+entering new data while keeping all the columns aligned.
+
+==============================================================================
+7. Insert mode completion *ins-completion*
+
+In Insert and Replace mode, there are several commands to complete part of a
+keyword or line that has been typed. This is useful if you are using
+complicated keywords (e.g., function names with capitals and underscores).
+
+Completion can be done for:
+
+1. Whole lines |i_CTRL-X_CTRL-L|
+2. keywords in the current file |i_CTRL-X_CTRL-N|
+3. keywords in 'dictionary' |i_CTRL-X_CTRL-K|
+4. keywords in 'thesaurus', thesaurus-style |i_CTRL-X_CTRL-T|
+5. keywords in the current and included files |i_CTRL-X_CTRL-I|
+6. tags |i_CTRL-X_CTRL-]|
+7. file names |i_CTRL-X_CTRL-F|
+8. definitions or macros |i_CTRL-X_CTRL-D|
+9. Vim command-line |i_CTRL-X_CTRL-V|
+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| |i_CTRL-P|
+
+Additionally, |i_CTRL-X_CTRL-Z| stops completion without changing the text.
+
+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).
+
+To get the current completion information, |complete_info()| can be used.
+Also see the 'infercase' option if you want to adjust the case of the match.
+
+ *complete_CTRL-E*
+When completion is active you can use CTRL-E to stop it and go back to the
+originally typed text. The CTRL-E will not be inserted.
+
+ *complete_CTRL-Y*
+When the popup menu is displayed you can use CTRL-Y to stop completion and
+accept the currently selected entry. The CTRL-Y is not inserted. Typing a
+space, Enter, or some other unprintable character will leave completion mode
+and insert that typed character.
+
+When the popup menu is displayed there are a few more special keys, see
+|popupmenu-keys|.
+
+Note: The keys that are valid in CTRL-X mode are not mapped. This allows for
+`:map <C-F> <C-X><C-F>` to work (assuming "<" is not in 'cpo'). The key that
+ends CTRL-X mode (any key that is not a valid CTRL-X mode command) is mapped.
+Also, when doing completion with 'complete' mappings apply as usual.
+
+ *E565*
+Note: While completion is active Insert mode can't be used recursively and
+buffer text cannot be changed. Mappings that somehow invoke ":normal i.."
+will generate an E565 error.
+
+The following mappings are suggested to make typing the completion commands
+a bit easier (although they will hide other commands; this requires "<" is not
+in 'cpo'): >
+ :inoremap <C-]> <C-X><C-]>
+ :inoremap <C-F> <C-X><C-F>
+ :inoremap <C-D> <C-X><C-D>
+ :inoremap <C-L> <C-X><C-L>
+
+As a special case, typing CTRL-R to perform register insertion (see
+|i_CTRL-R|) will not exit CTRL-X mode. This is primarily to allow the use of
+the '=' register to call some function to determine the next operation. If
+the contents of the register (or result of the '=' register evaluation) are
+not valid CTRL-X mode keys, then CTRL-X mode will be exited as if those keys
+had been typed.
+
+For example, the following will map <Tab> to either actually insert a <Tab> if
+the current line is currently only whitespace, or start/continue a CTRL-N
+completion operation: >
+
+ function! CleverTab()
+ if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
+ return "\<Tab>"
+ else
+ return "\<C-N>"
+ endif
+ endfunction
+ inoremap <Tab> <C-R>=CleverTab()<CR>
+
+
+
+Completing whole lines *compl-whole-line*
+
+ *i_CTRL-X_CTRL-L*
+CTRL-X CTRL-L Search backwards for a line that starts with the
+ same characters as those in the current line before
+ the cursor. Indent is ignored. The matching line is
+ inserted in front of the cursor.
+ The 'complete' option is used to decide which buffers
+ are searched for a match. Both loaded and unloaded
+ buffers are used.
+ CTRL-L or
+ CTRL-P Search backwards for next matching line. This line
+ replaces the previous matching line.
+
+ CTRL-N Search forward for next matching line. This line
+ replaces the previous matching line.
+
+ CTRL-X CTRL-L After expanding a line you can additionally get the
+ line next to it by typing CTRL-X CTRL-L again, unless
+ a double CTRL-X is used. Only works for loaded
+ buffers.
+
+Completing keywords in current file *compl-current*
+
+ *i_CTRL-X_CTRL-P*
+ *i_CTRL-X_CTRL-N*
+CTRL-X CTRL-N Search forwards for words that start with the keyword
+ in front of the cursor. The found keyword is inserted
+ in front of the cursor.
+
+CTRL-X CTRL-P Search backwards for words that start with the keyword
+ in front of the cursor. The found keyword is inserted
+ in front of the cursor.
+
+ CTRL-N Search forward for next matching keyword. This
+ keyword replaces the previous matching keyword.
+
+ CTRL-P Search backwards for next matching keyword. This
+ keyword replaces the previous matching keyword.
+
+ CTRL-X CTRL-N or
+ CTRL-X CTRL-P Further use of CTRL-X CTRL-N or CTRL-X CTRL-P will
+ copy the words following the previous expansion in
+ other contexts unless a double CTRL-X is used.
+
+If there is a keyword in front of the cursor (a name made out of alphabetic
+characters and characters in 'iskeyword'), it is used as the search pattern,
+with "\<" prepended (meaning: start of a word). Otherwise "\<\k\k" is used
+as search pattern (start of any keyword of at least two characters).
+
+In Replace mode, the number of characters that are replaced depends on the
+length of the matched string. This works like typing the characters of the
+matched string in Replace mode.
+
+If there is not a valid keyword character before the cursor, any keyword of
+at least two characters is matched.
+ e.g., to get:
+ printf("(%g, %g, %g)", vector[0], vector[1], vector[2]);
+ just type:
+ printf("(%g, %g, %g)", vector[0], ^P[1], ^P[2]);
+
+The search wraps around the end of the file, the value of 'wrapscan' is not
+used here.
+
+Multiple repeats of the same completion are skipped; thus a different match
+will be inserted at each CTRL-N and CTRL-P (unless there is only one
+matching keyword).
+
+Single character matches are never included, as they usually just get in
+the way of what you were really after.
+ e.g., to get:
+ printf("name = %s\n", name);
+ just type:
+ printf("name = %s\n", n^P);
+ or even:
+ printf("name = %s\n", ^P);
+The 'n' in '\n' is skipped.
+
+After expanding a word, you can use CTRL-X CTRL-P or CTRL-X CTRL-N to get the
+word following the expansion in other contexts. These sequences search for
+the text just expanded and further expand by getting an extra word. This is
+useful if you need to repeat a sequence of complicated words. Although CTRL-P
+and CTRL-N look just for strings of at least two characters, CTRL-X CTRL-P and
+CTRL-X CTRL-N can be used to expand words of just one character.
+ e.g., to get:
+ M&eacute;xico
+ you can type:
+ M^N^P^X^P^X^P
+CTRL-N starts the expansion and then CTRL-P takes back the single character
+"M", the next two CTRL-X CTRL-P's get the words "&eacute" and ";xico".
+
+If the previous expansion was split, because it got longer than 'textwidth',
+then just the text in the current line will be used.
+
+If the match found is at the end of a line, then the first word in the next
+line will be inserted and the message "Word from other line" displayed, if
+this word is accepted the next CTRL-X CTRL-P or CTRL-X CTRL-N will search
+for those lines starting with this word.
+
+
+Completing keywords in 'dictionary' *compl-dictionary*
+
+ *i_CTRL-X_CTRL-K*
+CTRL-X CTRL-K Search the files given with the 'dictionary' option
+ for words that start with the keyword in front of the
+ cursor. This is like CTRL-N, but only the dictionary
+ files are searched, not the current file. The found
+ keyword is inserted in front of the cursor. This
+ could potentially be pretty slow, since all matches
+ are found before the first match is used. By default,
+ the 'dictionary' option is empty.
+ For suggestions where to find a list of words, see the
+ 'dictionary' option.
+ 'ignorecase', 'smartcase' and 'infercase' apply.
+
+ CTRL-K or
+ CTRL-N Search forward for next matching keyword. This
+ keyword replaces the previous matching keyword.
+
+ CTRL-P Search backwards for next matching keyword. This
+ keyword replaces the previous matching keyword.
+
+
+Completing words in 'thesaurus' *compl-thesaurus*
+
+ *i_CTRL-X_CTRL-T*
+CTRL-X CTRL-T Works as CTRL-X CTRL-K, but in a special way. It uses
+ the 'thesaurus' option instead of 'dictionary'. If a
+ match is found in the thesaurus file, all the
+ remaining words on the same line are included as
+ matches, even though they don't complete the word.
+ Thus a word can be completely replaced.
+
+ CTRL-T or
+ CTRL-N Search forward for next matching keyword. This
+ keyword replaces the previous matching keyword.
+
+ CTRL-P Search backwards for next matching keyword. This
+ keyword replaces the previous matching keyword.
+
+In the file used by the 'thesaurus' option each line in the file should
+contain words with similar meaning, separated by non-keyword characters (white
+space is preferred). Maximum line length is 510 bytes.
+
+For an example, imagine the 'thesaurus' file has a line like this: >
+ angry furious mad enraged
+Placing the cursor after the letters "ang" and typing CTRL-X CTRL-T would
+complete the word "angry"; subsequent presses would change the word to
+"furious", "mad" etc.
+
+Other uses include translation between two languages, or grouping API
+functions by keyword.
+
+An English word list was added to this github issue:
+https://github.com/vim/vim/issues/629#issuecomment-443293282
+Unpack thesaurus_pkg.zip, put the thesaurus.txt file somewhere, e.g.
+~/.vim/thesaurus/english.txt, and the 'thesaurus' option to this file name.
+
+
+Completing keywords with 'thesaurusfunc' *compl-thesaurusfunc*
+
+If the 'thesaurusfunc' option is set, then the user specified function is
+invoked to get the list of completion matches and the 'thesaurus' option is
+not used. See |complete-functions| for an explanation of how the function is
+invoked and what it should return.
+
+Here is an example that uses the "aiksaurus" command (provided by Magnus
+Groß): >
+
+ func Thesaur(findstart, base)
+ if a:findstart
+ return searchpos('\<', 'bnW', line('.'))[1] - 1
+ endif
+ let res = []
+ let h = ''
+ for l in systemlist('aiksaurus ' .. shellescape(a:base))
+ if l[:3] == '=== '
+ let h = '(' .. substitute(l[4:], ' =*$', ')', '')
+ elseif l ==# 'Alphabetically similar known words are: '
+ let h = "\U0001f52e"
+ elseif l[0] =~ '\a' || (h ==# "\U0001f52e" && l[0] ==# "\t")
+ call extend(res, map(split(substitute(l, '^\t', '', ''), ', '), {_, val -> {'word': val, 'menu': h}}))
+ endif
+ endfor
+ return res
+ endfunc
+
+ if exists('+thesaurusfunc')
+ set thesaurusfunc=Thesaur
+ endif
+
+
+Completing keywords in the current and included files *compl-keyword*
+
+The 'include' option is used to specify a line that contains an include file
+name. The 'path' option is used to search for include files.
+
+ *i_CTRL-X_CTRL-I*
+CTRL-X CTRL-I Search for the first keyword in the current and
+ included files that starts with the same characters
+ as those before the cursor. The matched keyword is
+ inserted in front of the cursor.
+
+ CTRL-N Search forwards for next matching keyword. This
+ keyword replaces the previous matching keyword.
+ Note: CTRL-I is the same as <Tab>, which is likely to
+ be typed after a successful completion, therefore
+ CTRL-I is not used for searching for the next match.
+
+ CTRL-P Search backward for previous matching keyword. This
+ keyword replaces the previous matching keyword.
+
+ CTRL-X CTRL-I Further use of CTRL-X CTRL-I will copy the words
+ following the previous expansion in other contexts
+ unless a double CTRL-X is used.
+
+Completing tags *compl-tag*
+ *i_CTRL-X_CTRL-]*
+CTRL-X CTRL-] Search for the first tag that starts with the same
+ characters as before the cursor. The matching tag is
+ inserted in front of the cursor. Alphabetic
+ characters and characters in 'iskeyword' are used
+ to decide which characters are included in the tag
+ name (same as for a keyword). See also |CTRL-]|.
+ The 'showfulltag' option can be used to add context
+ from around the tag definition.
+ CTRL-] or
+ CTRL-N Search forwards for next matching tag. This tag
+ replaces the previous matching tag.
+
+ CTRL-P Search backward for previous matching tag. This tag
+ replaces the previous matching tag.
+
+
+Completing file names *compl-filename*
+ *i_CTRL-X_CTRL-F*
+CTRL-X CTRL-F Search for the first file name that starts with the
+ same characters as before the cursor. The matching
+ file name is inserted in front of the cursor.
+ Alphabetic characters and characters in 'isfname'
+ are used to decide which characters are included in
+ the file name. Note: the 'path' option is not used
+ here (yet).
+ CTRL-F or
+ CTRL-N Search forwards for next matching file name. This
+ file name replaces the previous matching file name.
+
+ CTRL-P Search backward for previous matching file name.
+ This file name replaces the previous matching file
+ name.
+
+
+Completing definitions or macros *compl-define*
+
+The 'define' option is used to specify a line that contains a definition.
+The 'include' option is used to specify a line that contains an include file
+name. The 'path' option is used to search for include files.
+
+ *i_CTRL-X_CTRL-D*
+CTRL-X CTRL-D Search in the current and included files for the
+ first definition (or macro) name that starts with
+ the same characters as before the cursor. The found
+ definition name is inserted in front of the cursor.
+ CTRL-D or
+ CTRL-N Search forwards for next matching macro name. This
+ macro name replaces the previous matching macro
+ name.
+
+ CTRL-P Search backward for previous matching macro name.
+ This macro name replaces the previous matching macro
+ name.
+
+ CTRL-X CTRL-D Further use of CTRL-X CTRL-D will copy the words
+ following the previous expansion in other contexts
+ unless a double CTRL-X is used.
+
+
+Completing Vim commands *compl-vim*
+
+Completion is context-sensitive. It works like on the Command-line. It
+completes an Ex command as well as its arguments. This is useful when writing
+a Vim script.
+
+ *i_CTRL-X_CTRL-V*
+CTRL-X CTRL-V Guess what kind of item is in front of the cursor and
+ find the first match for it.
+ Note: When CTRL-V is mapped you can often use CTRL-Q
+ instead of |i_CTRL-Q|.
+ CTRL-V or
+ CTRL-N Search forwards for next match. This match replaces
+ the previous one.
+
+ CTRL-P Search backwards for previous match. This match
+ replaces the previous one.
+
+ CTRL-X CTRL-V Further use of CTRL-X CTRL-V will do the same as
+ CTRL-V. This allows mapping a key to do Vim command
+ completion, for example: >
+ :imap <Tab> <C-X><C-V>
+
+User defined completion *compl-function*
+
+Completion is done by a function that can be defined by the user with the
+'completefunc' option. See below for how the function is called and an
+example |complete-functions|.
+
+ *i_CTRL-X_CTRL-U*
+CTRL-X CTRL-U Guess what kind of item is in front of the cursor and
+ find the first match for it.
+ CTRL-U or
+ CTRL-N Use the next match. This match replaces the previous
+ one.
+
+ CTRL-P Use the previous match. This match replaces the
+ previous one.
+
+
+Omni completion *compl-omni*
+
+Completion is done by a function that can be defined by the user with the
+'omnifunc' option. This is to be used for filetype-specific completion.
+
+See below for how the function is called and an example |complete-functions|.
+For remarks about specific filetypes see |compl-omni-filetypes|.
+More completion scripts will appear, check www.vim.org. Currently there is a
+first version for C++.
+
+ *i_CTRL-X_CTRL-O*
+CTRL-X CTRL-O Guess what kind of item is in front of the cursor and
+ find the first match for it.
+ CTRL-O or
+ CTRL-N Use the next match. This match replaces the previous
+ one.
+
+ CTRL-P Use the previous match. This match replaces the
+ previous one.
+
+
+Spelling suggestions *compl-spelling*
+
+A word before or at the cursor is located and correctly spelled words are
+suggested to replace it. If there is a badly spelled word in the line, before
+or under the cursor, the cursor is moved to after it. Otherwise the word just
+before the cursor is used for suggestions, even though it isn't badly spelled.
+
+NOTE: CTRL-S suspends display in many Unix terminals. Use 's' instead. Type
+CTRL-Q to resume displaying.
+
+ *i_CTRL-X_CTRL-S* *i_CTRL-X_s*
+CTRL-X CTRL-S or
+CTRL-X s Locate the word in front of the cursor and find the
+ first spell suggestion for it.
+ CTRL-S or
+ CTRL-N Use the next suggestion. This replaces the previous
+ one. Note that you can't use 's' here.
+
+ CTRL-P Use the previous suggestion. This replaces the
+ previous one.
+
+
+Completing keywords from different sources *compl-generic*
+
+ *i_CTRL-N*
+CTRL-N Find next match for words that start with the
+ keyword in front of the cursor, looking in places
+ specified with the 'complete' option. The found
+ keyword is inserted in front of the cursor.
+
+ *i_CTRL-P*
+CTRL-P Find previous match for words that start with the
+ keyword in front of the cursor, looking in places
+ specified with the 'complete' option. The found
+ keyword is inserted in front of the cursor.
+
+ CTRL-N Search forward for next matching keyword. This
+ keyword replaces the previous matching keyword.
+
+ CTRL-P Search backwards for next matching keyword. This
+ keyword replaces the previous matching keyword.
+
+ CTRL-X CTRL-N or
+ CTRL-X CTRL-P Further use of CTRL-X CTRL-N or CTRL-X CTRL-P will
+ copy the words following the previous expansion in
+ other contexts unless a double CTRL-X is used.
+
+
+Stop completion *compl-stop*
+
+ *i_CTRL-X_CTRL-Z*
+CTRL-X CTRL-Z Stop completion without changing the text.
+
+
+FUNCTIONS FOR FINDING COMPLETIONS *complete-functions*
+
+This applies to 'completefunc', 'thesaurusfunc' and 'omnifunc'.
+
+The function is called in two different ways:
+- First the function is called to find the start of the text to be completed.
+- Later the function is called to actually find the matches.
+
+On the first invocation the arguments are:
+ a:findstart 1
+ a:base empty
+
+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. If the returned value is
+larger than the cursor column, the cursor column is used.
+
+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
+ a:base the text with which matches should match; the text that was
+ located in the first call (can be empty)
+
+The function must return a List with the matching words. These matches
+usually include the "a:base" text. When there are no matches return an empty
+List. Note that the cursor may have moved since the first invocation, the
+text may have been changed.
+
+In order to return more information than the matching words, return a Dict
+that contains the List. The Dict can have these items:
+ words The List of matching words (mandatory).
+ refresh A string to control re-invocation of the function
+ (optional).
+ The only value currently recognized is "always", the
+ effect is that the function is called whenever the
+ leading text is changed.
+
+If you want to suppress the warning message for an empty result, return
+|v:none|. This is useful to implement asynchronous completion with
+|complete()|.
+
+Other items are ignored.
+
+For acting upon end of completion, see the |CompleteDonePre| and
+|CompleteDone| autocommand event.
+
+For example, the function can contain this: >
+ let matches = ... list of words ...
+ return {'words': matches, 'refresh': 'always'}
+<
+ *complete-items*
+Each list item can either be a string or a Dictionary. When it is a string it
+is used as the completion. When it is a Dictionary it can contain these
+items:
+ word the text that will be inserted, mandatory
+ abbr abbreviation of "word"; when not empty it is used in
+ the menu instead of "word"
+ menu extra text for the popup menu, displayed after "word"
+ or "abbr"
+ info more information about the item, can be displayed in a
+ preview or popup window
+ kind single letter indicating the type of completion
+ icase when non-zero case is to be ignored when comparing
+ items to be equal; when omitted zero is used, thus
+ items that only differ in case are added
+ equal when non-zero, always treat this item to be equal when
+ comparing. Which means, "equal=1" disables filtering
+ of this item.
+ dup when non-zero this match will be added even when an
+ 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|; it can be any type;
+ defaults to an empty string
+
+All of these except "icase", "equal", "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.
+
+The "menu" item is used in the popup menu and may be truncated, thus it should
+be relatively short. The "info" item can be longer, it will be displayed in
+the preview window when "preview" appears in 'completeopt' or in a popup
+window when "popup" appears in 'completeopt'. In the preview window the
+"info" item will also remain displayed after the popup menu has been removed.
+This is useful for function arguments. Use a single space for "info" to
+remove existing text in the preview window. The size of the preview window is
+three lines, but 'previewheight' is used when it has a value of 1 or 2.
+
+ *complete-popup*
+When "popup" is in 'completeopt' a popup window is used to display the "info".
+Then the 'completepopup' option specifies the properties of the popup. This
+is used when the info popup is created. The option is a comma-separated list
+of values:
+ height maximum height of the popup
+ width maximum width of the popup
+ highlight highlight group of the popup (default is PmenuSel)
+ align "item" (default) or "menu"
+ border "on" (default) or "off"
+Example: >
+ :set completepopup=height:10,width:60,highlight:InfoPopup
+
+When the "align" value is "item" then the popup is positioned close to the
+selected item. Changing the selection will also move the popup. When "align"
+is "menu" then the popup is aligned with the top of the menu if the menu is
+below the text, and the bottom of the menu otherwise.
+
+After the info popup is created it can be found with |popup_findinfo()| and
+properties can be changed with |popup_setoptions()|.
+
+ *complete-popuphidden*
+If the information for the popup is obtained asynchronously, use "popuphidden"
+in 'completeopt'. The info popup will then be initially hidden and
+|popup_show()| must be called once it has been filled with the info. This can
+be done with a |CompleteChanged| autocommand, something like this: >
+ set completeopt+=popuphidden
+ au CompleteChanged * call UpdateCompleteInfo()
+ func UpdateCompleteInfo()
+ " Cancel any pending info fetch
+ let item = v:event.completed_item
+ " Start fetching info for the item then call ShowCompleteInfo(info)
+ endfunc
+ func ShowCompleteInfo(info)
+ let id = popup_findinfo()
+ if id
+ call popup_settext(id, 'async info: ' .. a:info)
+ call popup_show(id)
+ endif
+ endfunc
+
+< *complete-item-kind*
+The "kind" item uses a single letter to indicate the kind of completion. This
+may be used to show the completion differently (different color or icon).
+Currently these types can be used:
+ v variable
+ f function or method
+ m member of a struct or class
+ t typedef
+ d #define or macro
+
+When searching for matches takes some time call |complete_add()| to add each
+match to the total list. These matches should then not appear in the returned
+list! Call |complete_check()| now and then to allow the user to press a key
+while still searching for matches. Stop searching when it returns non-zero.
+
+ *E840*
+The function is allowed to move the cursor, it is restored afterwards.
+The function is not allowed to move to another window or delete text.
+
+An example that completes the names of the months: >
+ fun! CompleteMonths(findstart, base)
+ if a:findstart
+ " locate the start of the word
+ let line = getline('.')
+ let start = col('.') - 1
+ while start > 0 && line[start - 1] =~ '\a'
+ let start -= 1
+ endwhile
+ return start
+ 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 =~ '^' .. a:base
+ call add(res, m)
+ endif
+ endfor
+ return res
+ endif
+ endfun
+ set completefunc=CompleteMonths
+<
+The same, but now pretending searching for matches is slow: >
+ fun! CompleteMonths(findstart, base)
+ if a:findstart
+ " locate the start of the word
+ let line = getline('.')
+ let start = col('.') - 1
+ while start > 0 && line[start - 1] =~ '\a'
+ let start -= 1
+ endwhile
+ return start
+ else
+ " find months matching with "a:base"
+ for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
+ if m =~ '^' .. a:base
+ call complete_add(m)
+ endif
+ sleep 300m " simulate searching for next match
+ if complete_check()
+ break
+ endif
+ endfor
+ return []
+ endif
+ endfun
+ set completefunc=CompleteMonths
+<
+
+INSERT COMPLETION POPUP MENU *ins-completion-menu*
+ *popupmenu-completion*
+Vim can display the matches in a simplistic popup menu.
+
+The menu is used when:
+- The 'completeopt' option contains "menu" or "menuone".
+- The terminal supports at least 8 colors.
+- There are at least two matches. One if "menuone" is used.
+
+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.
+2. A cursor key has been used to select another match. The match was not
+ inserted then, only the entry in the popup menu is highlighted.
+3. Only part of a match has been inserted and characters were typed or the
+ backspace key was used. The list of matches was then adjusted for what is
+ in front of the cursor.
+
+You normally start in the first state, with the first match being inserted.
+When "longest" is in 'completeopt' and there is more than one match you start
+in the third state.
+
+If you select another match, e.g., with CTRL-N or CTRL-P, you go to the first
+state. This doesn't change the list of matches.
+
+When you are back at the original text then you are in the third state. To
+get there right away you can use a mapping that uses CTRL-P right after
+starting the completion: >
+ :imap <F7> <C-N><C-P>
+<
+ *popupmenu-keys*
+In the first state these keys have a special meaning:
+<BS> and CTRL-H Delete one character, find the matches for the word before
+ the cursor. This reduces the list of matches, often to one
+ entry, and switches to the second state.
+Any non-special character:
+ Stop completion without changing the match and insert the
+ typed character.
+
+In the second and third state these keys have a special meaning:
+<BS> and CTRL-H Delete one character, find the matches for the shorter word
+ before the cursor. This may find more matches.
+CTRL-L Add one character from the current match, may reduce the
+ number of matches.
+any printable, non-white character:
+ Add this character and reduce the number of matches.
+
+In all three states these can be used:
+CTRL-Y Yes: Accept the currently selected match and stop completion.
+CTRL-E End completion, go back to what was there before selecting a
+ match (what was typed or longest common string).
+<PageUp> Select a match several entries back, but don't insert it.
+<PageDown> Select a match several entries further, but don't insert it.
+<Up> Select the previous match, as if CTRL-P was used, but don't
+ insert it.
+<Down> Select the next match, as if CTRL-N was used, but don't
+ insert it.
+<Space> or <Tab> Stop completion without changing the match and insert the
+ typed character.
+
+The behavior of the <Enter> key depends on the state you are in:
+first state: Use the text as it is and insert a line break.
+second state: Insert the currently selected match.
+third state: Use the text as it is and insert a line break.
+
+In other words: If you used the cursor keys to select another entry in the
+list of matches then the <Enter> key inserts that match. If you typed
+something else then <Enter> inserts a line break.
+
+
+The colors of the menu can be changed with these highlight groups:
+Pmenu normal item |hl-Pmenu|
+PmenuSel selected item |hl-PmenuSel|
+PmenuSbar scrollbar |hl-PmenuSbar|
+PmenuThumb thumb of the scrollbar |hl-PmenuThumb|
+
+There are no special mappings for when the popup menu is visible. However,
+you can use an Insert mode mapping that checks the |pumvisible()| function to
+do something different. Example: >
+ :inoremap <Down> <C-R>=pumvisible() ? "\<lt>C-N>" : "\<lt>Down>"<CR>
+
+You can use of <expr> in mapping to have the popup menu used when typing a
+character and some condition is met. For example, for typing a dot: >
+ inoremap <expr> . MayComplete()
+ func MayComplete()
+ if (can complete)
+ return ".\<C-X>\<C-O>"
+ endif
+ return '.'
+ endfunc
+
+See |:map-<expr>| for more info.
+
+
+FILETYPE-SPECIFIC REMARKS FOR OMNI COMPLETION *compl-omni-filetypes*
+
+The file used for {filetype} should be autoload/{filetype}complete.vim
+in 'runtimepath'. Thus for "java" it is autoload/javacomplete.vim.
+
+
+C *ft-c-omni*
+
+Completion of C code requires a tags file. You should use Universal/
+Exuberant ctags, because it adds extra information that is needed for
+completion. You can find it here:
+ Universal Ctags: https://ctags.io
+ Exuberant Ctags: http://ctags.sourceforge.net
+
+Universal Ctags is preferred, Exuberant Ctags is no longer being developed.
+
+For Exuberant ctags, 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://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: >
+ % ctags -R -f ~/.vim/systags /usr/include /usr/local/include
+In your vimrc file add this tags file to the 'tags' option: >
+ set tags+=~/.vim/systags
+
+When using CTRL-X CTRL-O after a name without any "." or "->" it is completed
+from the tags file directly. This works for any identifier, also function
+names. If you want to complete a local variable name, which does not appear
+in the tags file, use CTRL-P instead.
+
+When using CTRL-X CTRL-O after something that has "." or "->" Vim will attempt
+to recognize the type of the variable and figure out what members it has.
+This means only members valid for the variable will be listed.
+
+When a member name already was complete, CTRL-X CTRL-O will add a "." or
+"->" for composite types.
+
+Vim doesn't include a C compiler, only the most obviously formatted
+declarations are recognized. Preprocessor stuff may cause confusion.
+When the same structure name appears in multiple places all possible members
+are included.
+
+
+CSS *ft-css-omni*
+
+Complete properties and their appropriate values according to CSS 2.1
+specification.
+
+
+HTML *ft-html-omni*
+XHTML *ft-xhtml-omni*
+
+CTRL-X CTRL-O provides completion of various elements of (X)HTML files. It is
+designed to support writing of XHTML 1.0 Strict files but will also work for
+other versions of HTML. Features:
+
+- after "<" complete tag name depending on context (no div suggestion inside
+ of an a tag); '/>' indicates empty tags
+- inside of tag complete proper attributes (no width attribute for an a tag);
+ show also type of attribute; '*' indicates required attributes
+- when attribute has limited number of possible values help to complete them
+- complete names of entities
+- complete values of "class" and "id" attributes with data obtained from
+ <style> tag and included CSS files
+- when completing value of "style" attribute or working inside of "style" tag
+ switch to |ft-css-omni| completion
+- when completing values of events attributes or working inside of "script"
+ tag switch to |ft-javascript-omni| completion
+- when used after "</" CTRL-X CTRL-O will close the last opened tag
+
+Note: When used first time completion menu will be shown with little delay
+- this is time needed for loading of data file.
+Note: Completion may fail in badly formatted documents. In such case try to
+run |:make| command to detect formatting problems.
+
+
+HTML flavor *html-flavor*
+
+The default HTML completion depends on the filetype. For HTML files it is
+HTML 4.01 Transitional ('filetype' is "html"), for XHTML it is XHTML 1.0
+Strict ('filetype' is "xhtml").
+
+When doing completion outside of any other tag you will have possibility to
+choose DOCTYPE and the appropriate data file will be loaded and used for all
+next completions.
+
+More about format of data file in |xml-omni-datafile|. Some of the data files
+may be found on the Vim website (|www|).
+
+Note that b:html_omni_flavor may point to a file with any XML data. This
+makes possible to mix PHP (|ft-php-omni|) completion with any XML dialect
+(assuming you have data file for it). Without setting that variable XHTML 1.0
+Strict will be used.
+
+
+JAVASCRIPT *ft-javascript-omni*
+
+Completion of most elements of JavaScript language and DOM elements.
+
+Complete:
+
+- variables
+- function name; show function arguments
+- function arguments
+- properties of variables trying to detect type of variable
+- complete DOM objects and properties depending on context
+- keywords of language
+
+Completion works in separate JavaScript files (&ft==javascript), inside of
+<script> tag of (X)HTML and in values of event attributes (including scanning
+of external files).
+
+DOM compatibility
+
+At the moment (beginning of 2006) there are two main browsers - MS Internet
+Explorer and Mozilla Firefox. These two applications are covering over 90% of
+market. Theoretically standards are created by W3C organisation
+(http://www.w3c.org) but they are not always followed/implemented.
+
+ IE FF W3C Omni completion ~
+ +/- +/- + + ~
+ + + - + ~
+ + - - - ~
+ - + - - ~
+
+Regardless from state of implementation in browsers but if element is defined
+in standards, completion plugin will place element in suggestion list. When
+both major engines implemented element, even if this is not in standards it
+will be suggested. All other elements are not placed in suggestion list.
+
+
+PHP *ft-php-omni*
+
+Completion of PHP code requires a tags file for completion of data from
+external files and for class aware completion. You should use Universal/
+Exuberant ctags version 5.5.4 or newer. You can find it here:
+
+ Universal Ctags: https://ctags.io
+ Exuberant Ctags: http://ctags.sourceforge.net
+
+Script completes:
+
+- after $ variables name
+ - if variable was declared as object add "->", if tags file is available show
+ name of class
+ - after "->" complete only function and variable names specific for given
+ class. To find class location and contents tags file is required. Because
+ PHP isn't strongly typed language user can use @var tag to declare class: >
+
+ /* @var $myVar myClass */
+ $myVar->
+<
+ Still, to find myClass contents tags file is required.
+
+- function names with additional info:
+ - in case of built-in functions list of possible arguments and after | type
+ data returned by function
+ - in case of user function arguments and name of file where function was
+ defined (if it is not current file)
+
+- constants names
+- class names after "new" declaration
+
+
+Note: when doing completion first time Vim will load all necessary data into
+memory. It may take several seconds. After next use of completion delay
+should not be noticeable.
+
+Script detects if cursor is inside <?php ?> tags. If it is outside it will
+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*
+
+Completion of Ruby code requires that vim be built with |+ruby|.
+
+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'
+and modules defined in the current buffer.
+
+The completions provided by CTRL-X CTRL-O are sensitive to the context:
+
+ CONTEXT COMPLETIONS PROVIDED ~
+
+ 1. Not inside a class definition Classes, constants and globals
+
+ 2. Inside a class definition Methods or constants defined in the class
+
+ 3. After '.', '::' or ':' Methods applicable to the object being
+ dereferenced
+
+ 4. After ':' or ':foo' Symbol name (beginning with 'foo')
+
+Notes:
+ - Vim will load/evaluate code in order to provide completions. This may
+ cause some code execution, which may be a concern. This is no longer
+ enabled by default, to enable this feature add >
+ let g:rubycomplete_buffer_loading = 1
+<- In context 1 above, Vim can parse the entire buffer to add a list of
+ classes to the completion results. This feature is turned off by default,
+ to enable it add >
+ let g:rubycomplete_classes_in_global = 1
+< to your vimrc
+ - In context 2 above, anonymous classes are not supported.
+ - In context 3 above, Vim will attempt to determine the methods supported by
+ the object.
+ - Vim can detect and load the Rails environment for files within a rails
+ project. The feature is disabled by default, to enable it add >
+ let g:rubycomplete_rails = 1
+< to your vimrc
+
+
+SYNTAX *ft-syntax-omni*
+
+Vim has the ability to color syntax highlight nearly 500 languages. Part of
+this highlighting includes knowing what keywords are part of a language. Many
+filetypes already have custom completion scripts written for them, the
+syntaxcomplete plugin provides basic completion for all other filetypes. It
+does this by populating the omni completion list with the text Vim already
+knows how to color highlight. It can be used for any filetype and provides a
+minimal language-sensitive completion.
+
+To enable syntax code completion you can run: >
+ setlocal omnifunc=syntaxcomplete#Complete
+
+You can automate this by placing the following in your |.vimrc| (after any
+":filetype" command): >
+ if has("autocmd") && exists("+omnifunc")
+ autocmd Filetype *
+ \ if &omnifunc == "" |
+ \ setlocal omnifunc=syntaxcomplete#Complete |
+ \ endif
+ endif
+
+The above will set completion to this script only if a specific plugin does
+not already exist for that filetype.
+
+Each filetype can have a wide range of syntax items. The plugin allows you to
+customize which syntax groups to include or exclude from the list. Let's have
+a look at the PHP filetype to see how this works.
+
+If you edit a file called, index.php, run the following command: >
+ syntax list
+
+The first thing you will notice is that there are many different syntax groups.
+The PHP language can include elements from different languages like HTML,
+JavaScript and many more. The syntax plugin will only include syntax groups
+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: >
+ 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
+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'
+<
+The basic form of this variable is: >
+ let g:omni_syntax_group_include_{filetype} = 'regex,comma,separated'
+
+The PHP language has an enormous number of items which it knows how to syntax
+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
+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'
+
+Add as many syntax groups to this list by comma separating them. The basic
+form of this variable is: >
+ let g:omni_syntax_group_exclude_{filetype} = 'regex,comma,separated'
+
+You can create as many of these variables as you need, varying only the
+filetype at the end of the variable name.
+
+The plugin uses the isKeyword option to determine where word boundaries are
+for the syntax items. For example, in the Scheme language completion should
+include the "-", call-with-output-file. Depending on your filetype, this may
+not provide the words you are expecting. Setting the
+g:omni_syntax_use_iskeyword option to 0 will force the syntax plugin to break
+on word characters. This can be controlled adding the following to your
+vimrc: >
+ let g:omni_syntax_use_iskeyword = 0
+
+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
+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 ~
+
+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
+ways. To retrieve all syntax items regardless of syntax group: >
+ echo OmniSyntaxList( [] )
+
+To retrieve only the syntax items for the sqlOperator syntax group: >
+ echo OmniSyntaxList( ['sqlOperator'] )
+
+To retrieve all syntax items for both the sqlOperator and sqlType groups: >
+ echo OmniSyntaxList( ['sqlOperator', 'sqlType'] )
+
+A regular expression can also be used: >
+ echo OmniSyntaxList( ['sql\w\+'] )
+
+From within a plugin, you would typically assign the output to a List: >
+ let myKeywords = []
+ let myKeywords = OmniSyntaxList( ['sqlKeyword'] )
+
+
+SQL *ft-sql-omni*
+
+Completion for the SQL language includes statements, functions, keywords.
+It will also dynamically complete tables, procedures, views and column lists
+with data pulled directly from within a database. For detailed instructions
+and a tutorial see |omni-sql-completion|.
+
+The SQL completion plugin can be used in conjunction with other completion
+plugins. For example, the PHP filetype has its own completion plugin.
+Since PHP is often used to generate dynamic website by accessing a database,
+the SQL completion plugin can also be enabled. This allows you to complete
+PHP code and SQL code at the same time.
+
+
+XML *ft-xml-omni*
+
+Vim 7 provides a mechanism for context aware completion of XML files. It
+depends on a special |xml-omni-datafile| and two commands: |:XMLns| and
+|:XMLent|. Features are:
+
+- after "<" complete the tag name, depending on context
+- inside of a tag complete proper attributes
+- when an attribute has a limited number of possible values help to complete
+ them
+- complete names of entities (defined in |xml-omni-datafile| and in the
+ current file with "<!ENTITY" declarations)
+- when used after "</" CTRL-X CTRL-O will close the last opened tag
+
+Format of XML data file *xml-omni-datafile*
+
+XML data files are stored in the "autoload/xml" directory in 'runtimepath'.
+Vim distribution provides examples of data files in the
+"$VIMRUNTIME/autoload/xml" directory. They have a meaningful name which will
+be used in commands. It should be a unique name which will not create
+conflicts. For example, the name xhtml10s.vim means it is the data file for
+XHTML 1.0 Strict.
+
+Each file contains a variable with a name like g:xmldata_xhtml10s . It is
+a compound from two parts:
+
+1. "g:xmldata_" general prefix, constant for all data files
+2. "xhtml10s" the name of the file and the name of the described XML
+ dialect; it will be used as an argument for the |:XMLns|
+ command
+
+Part two must be exactly the same as name of file.
+
+The variable is a |Dictionary|. Keys are tag names and each value is a two
+element |List|. The first element of the List is also a List with the names
+of possible children. The second element is a |Dictionary| with the names of
+attributes as keys and the possible values of attributes as values. Example: >
+
+ let g:xmldata_crippled = {
+ \ "vimxmlentities": ["amp", "lt", "gt", "apos", "quot"],
+ \ 'vimxmlroot': ['tag1'],
+ \ 'tag1':
+ \ [ ['childoftag1a', 'childoftag1b'], {'attroftag1a': [],
+ \ 'attroftag1b': ['valueofattr1', 'valueofattr2']}],
+ \ 'childoftag1a':
+ \ [ [], {'attrofchild': ['attrofchild']}],
+ \ 'childoftag1b':
+ \ [ ['childoftag1a'], {'attrofchild': []}],
+ \ "vimxmltaginfo": {
+ \ 'tag1': ['Menu info', 'Long information visible in preview window']},
+ \ 'vimxmlattrinfo': {
+ \ 'attrofchild': ['Menu info', 'Long information visible in preview window']}}
+
+This example would be put in the "autoload/xml/crippled.vim" file and could
+help to write this file: >
+
+ <tag1 attroftag1b="valueofattr1">
+ <childoftag1a attrofchild>
+ &amp; &lt;
+ </childoftag1a>
+ <childoftag1b attrofchild="5">
+ <childoftag1a>
+ &gt; &apos; &quot;
+ </childoftag1a>
+ </childoftag1b>
+ </tag1>
+
+In the example four special elements are visible:
+
+1. "vimxmlentities" - a special key with List containing entities of this XML
+ dialect.
+2. If the list containing possible values of attributes has one element and
+ this element is equal to the name of the attribute this attribute will be
+ treated as boolean and inserted as 'attrname' and not as 'attrname="'
+3. "vimxmltaginfo" - a special key with a Dictionary containing tag
+ names as keys and two element List as values, for additional menu info and
+ the long description.
+4. "vimxmlattrinfo" - special key with Dictionary containing attribute names
+ as keys and two element List as values, for additional menu info and long
+ description.
+
+Note: Tag names in the data file MUST not contain a namespace description.
+Check xsl.vim for an example.
+Note: All data and functions are publicly available as global
+variables/functions and can be used for personal editing functions.
+
+
+DTD -> Vim *dtd2vim*
+
+On |www| is the script |dtd2vim| which parses DTD and creates an XML data file
+for Vim XML omni completion.
+
+ dtd2vim: http://www.vim.org/scripts/script.php?script_id=1462
+
+Check the beginning of that file for usage details.
+The script requires perl and:
+
+ perlSGML: http://savannah.nongnu.org/projects/perlsgml
+
+
+Commands
+
+:XMLns {name} [{namespace}] *:XMLns*
+
+Vim has to know which data file should be used and with which namespace. For
+loading of the data file and connecting data with the proper namespace use
+|:XMLns| command. The first (obligatory) argument is the name of the data
+(xhtml10s, xsl). The second argument is the code of namespace (h, xsl). When
+used without a second argument the dialect will be used as default - without
+namespace declaration. For example to use XML completion in .xsl files: >
+
+ :XMLns xhtml10s
+ :XMLns xsl xsl
+
+
+:XMLent {name} *:XMLent*
+
+By default entities will be completed from the data file of the default
+namespace. The XMLent command should be used in case when there is no default
+namespace: >
+
+ :XMLent xhtml10s
+
+Usage
+
+While used in this situation (after declarations from previous part, | is
+cursor position): >
+
+ <|
+
+Will complete to an appropriate XHTML tag, and in this situation: >
+
+ <xsl:|
+
+Will complete to an appropriate XSL tag.
+
+
+The script xmlcomplete.vim, provided through the |autoload| mechanism,
+has the xmlcomplete#GetLastOpenTag() function which can be used in XML files
+to get the name of the last open tag (b:unaryTagsStack has to be defined): >
+
+ :echo xmlcomplete#GetLastOpenTag("b:unaryTagsStack")
+
+
+
+==============================================================================
+8. Insert mode commands *inserting*
+
+The following commands can be used to insert new text into the buffer. They
+can all be undone and repeated with the "." command.
+
+ *a*
+a Append text after the cursor [count] times. If the
+ cursor is in the first column of an empty line Insert
+ starts there. But not when 'virtualedit' is set!
+
+ *A*
+A Append text at the end of the line [count] times.
+ For using "A" in Visual block mode see |v_b_A|.
+
+<insert> or *i* *insert* *<Insert>*
+i Insert text before the cursor [count] times.
+ When using CTRL-O in Insert mode |i_CTRL-O| the count
+ is not supported.
+
+ *I*
+I Insert text before the first non-blank in the line
+ [count] times.
+ When the 'H' flag is present in 'cpoptions' and the
+ line only contains blanks, insert start just before
+ the last blank.
+ For using "I" in Visual block mode see |v_b_I|.
+
+ *gI*
+gI Insert text in column 1 [count] times.
+
+ *gi*
+gi Insert text in the same position as where Insert mode
+ was stopped last time in the current buffer.
+ This uses the |'^| mark. It's different from "`^i"
+ when the mark is past the end of the line.
+ The position is corrected for inserted/deleted lines,
+ but NOT for inserted/deleted characters.
+ When the |:keepjumps| command modifier is used the |'^|
+ mark won't be changed.
+
+ *o*
+o Begin a new line below the cursor and insert text,
+ repeat [count] times.
+ When the '#' flag is in 'cpoptions' the count is
+ ignored.
+
+ *O*
+O Begin a new line above the cursor and insert text,
+ repeat [count] times.
+ When the '#' flag is in 'cpoptions' the count is
+ ignored.
+
+These commands are used to start inserting text. You can end insert mode with
+<Esc>. See |mode-ins-repl| for the other special characters in Insert mode.
+The effect of [count] takes place after Insert mode is exited.
+
+When 'autoindent' is on, the indent for a new line is obtained from the
+previous line. When 'smartindent' or 'cindent' is on, the indent for a line
+is automatically adjusted for C programs.
+
+'formatoptions' can be set to copy the comment leader when opening a new
+line.
+
+'textwidth' can be set to the maximum width for a line. When a line becomes
+too long when appending characters a line break is automatically inserted.
+
+
+==============================================================================
+9. Ex insert commands *inserting-ex*
+
+ *:a* *:append*
+:{range}a[ppend][!] Insert several lines of text below the specified
+ line. If the {range} is missing, the text will be
+ inserted after the current line.
+ Adding [!] toggles 'autoindent' for the time this
+ command is executed.
+ This command is not supported in |Vim9| script,
+ because it is too easily confused with a variable
+ name.
+
+ *:i* *:in* *:insert*
+:{range}i[nsert][!] Insert several lines of text above the specified
+ line. If the {range} is missing, the text will be
+ inserted before the current line.
+ Adding [!] toggles 'autoindent' for the time this
+ command is executed.
+ This command is not supported in |Vim9| script,
+ because it is too easily confused with a variable
+ name.
+
+These two commands will keep on asking for lines, until you type a line
+containing only a ".". Watch out for lines starting with a backslash, see
+|line-continuation|.
+
+When in Ex mode (see |-e|) a backslash at the end of the line can be used to
+insert a NUL character. To be able to have a line ending in a backslash use
+two backslashes. This means that the number of backslashes is halved, but
+only at the end of the line.
+
+NOTE: These commands cannot be used with |:global| or |:vglobal|.
+":append" and ":insert" don't work properly in between ":if" and
+":endif", ":for" and ":endfor", ":while" and ":endwhile".
+
+ *:start* *:startinsert*
+:star[tinsert][!] Start Insert mode just after executing this command.
+ Works like typing "i" in Normal mode. When the ! is
+ included it works like "A", append to the line.
+ Otherwise insertion starts at the cursor position.
+ Note that when using this command in a function or
+ script, the insertion only starts after the function
+ or script is finished.
+ This command does not work from |:normal|.
+
+ *:stopi* *:stopinsert*
+:stopi[nsert] Stop Insert mode as soon as possible. Works like
+ typing <Esc> in Insert mode.
+ Can be used in an autocommand, example: >
+ :au BufEnter scratch stopinsert
+<
+ *replacing-ex* *:startreplace*
+:startr[eplace][!] Start Replace mode just after executing this command.
+ Works just like typing "R" in Normal mode. When the
+ ! is included it acts just like "$R" had been typed
+ (ie. begin replace mode at the end-of-line). Other-
+ wise replacement begins at the cursor position.
+ Note that when using this command in a function or
+ script that the replacement will only start after
+ the function or script is finished.
+
+ *:startgreplace*
+:startg[replace][!] Just like |:startreplace|, but use Virtual Replace
+ mode, like with |gR|.
+
+==============================================================================
+10. Inserting a file *inserting-file*
+
+ *:r* *:re* *:read*
+:r[ead] [++opt] [name]
+ Insert the file [name] (default: current file) below
+ the cursor.
+ See |++opt| for the possible values of [++opt].
+
+:{range}r[ead] [++opt] [name]
+ Insert the file [name] (default: current file) below
+ the specified line.
+ See |++opt| for the possible values of [++opt].
+
+ *:r!* *:read!*
+:[range]r[ead] [++opt] !{cmd}
+ Execute {cmd} and insert its standard output below
+ the cursor or the specified line. A temporary file is
+ used to store the output of the command which is then
+ read into the buffer. 'shellredir' is used to save
+ the output of the command, which can be set to include
+ stderr or not. {cmd} is executed like with ":!{cmd}",
+ any '!' is replaced with the previous command |:!|.
+ See |++opt| for the possible values of [++opt].
+
+These commands insert the contents of a file, or the output of a command,
+into the buffer. They can be undone. They cannot be repeated with the "."
+command. They work on a line basis, insertion starts below the line in which
+the cursor is, or below the specified line. To insert text above the first
+line use the command ":0r {name}".
+
+After the ":read" command, the cursor is left on the first non-blank in the
+first new line. Unless in Ex mode, then the cursor is left on the last new
+line (sorry, this is Vi compatible).
+
+If a file name is given with ":r", it becomes the alternate file. This can be
+used, for example, when you want to edit that file instead: ":e! #". This can
+be switched off by removing the 'a' flag from the 'cpoptions' option.
+
+Of the [++opt] arguments one is specifically for ":read", the ++edit argument.
+This is useful when the ":read" command is actually used to read a file into
+the buffer as if editing that file. Use this command in an empty buffer: >
+ :read ++edit filename
+The effect is that the 'fileformat', 'fileencoding', 'bomb', etc. options are
+set to what has been detected for "filename". Note that a single empty line
+remains, you may want to delete it.
+
+ *file-read*
+The 'fileformat' option sets the <EOL> style for a file:
+'fileformat' characters name ~
+ "dos" <CR><NL> or <NL> DOS format
+ "unix" <NL> Unix format
+ "mac" <CR> Mac format
+Previously 'textmode' was used. It is obsolete now.
+
+If 'fileformat' is "dos", a <CR> in front of an <NL> is ignored and a CTRL-Z
+at the end of the file is ignored.
+
+If 'fileformat' is "mac", a <NL> in the file is internally represented by a
+<CR>. This is to avoid confusion with a <NL> which is used to represent a
+<NUL>. See |CR-used-for-NL|.
+
+If the 'fileformats' option is not empty Vim tries to recognize the type of
+<EOL> (see |file-formats|). However, the 'fileformat' option will not be
+changed, the detected format is only used while reading the file.
+A similar thing happens with 'fileencodings'.
+
+On non-Win32 systems the message "[dos format]" is shown if a file is read in
+DOS format, to remind you that something unusual is done.
+On Macintosh and Win32 the message "[unix format]" is shown if a file is read
+in Unix format.
+On non-Macintosh systems, the message "[mac format]" is shown if a file is
+read in Mac format.
+
+An example on how to use ":r !": >
+ :r !uuencode binfile binfile
+This command reads "binfile", uuencodes it and reads it into the current
+buffer. Useful when you are editing e-mail and want to include a binary
+file.
+
+ *read-messages*
+When reading a file Vim will display a message with information about the read
+file. In the table is an explanation for some of the items. The others are
+self explanatory. Using the long or the short version depends on the
+'shortmess' option.
+
+ long short meaning ~
+ [readonly] {RO} the file is write protected
+ [fifo/socket] using a stream
+ [fifo] using a fifo stream
+ [socket] using a socket stream
+ [CR missing] reading with "dos" 'fileformat' and a
+ NL without a preceding CR was found.
+ [NL found] reading with "mac" 'fileformat' and a
+ NL was found (could be "unix" format)
+ [long lines split] at least one line was split in two
+ [NOT converted] conversion from 'fileencoding' to
+ 'encoding' was desired but not
+ possible
+ [converted] conversion from 'fileencoding' to
+ 'encoding' done
+ [crypted] file was decrypted
+ [READ ERRORS] not all of the file could be read
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/intro.txt b/runtime/doc/intro.txt
new file mode 100644
index 0000000..04d5f5c
--- /dev/null
+++ b/runtime/doc/intro.txt
@@ -0,0 +1,908 @@
+*intro.txt* For Vim version 9.0. Last change: 2022 Nov 20
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+
+==============================================================================
+1. 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
+includes almost all the commands from the Unix program "Vi" and a lot of new
+ones. It is very useful for editing programs and other plain text.
+ All commands are given with the keyboard. This has the advantage that you
+can keep your fingers on the keyboard and your eyes on the screen. For those
+who want it, there is mouse support and a GUI version with scrollbars and
+menus (see |gui.txt|).
+
+An overview of this manual can be found in the file "help.txt", |help.txt|.
+It can be accessed from within Vim with the <Help> or <F1> key and with the
+|:help| command (just type ":help", without the bars or quotes).
+ The 'helpfile' option can be set to the name of the help file, in case it
+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.
+
+The differences between Vi and Vim are mentioned in |vi_diff.txt|.
+
+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.
+
+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
+there. For beginners, there is a hands-on |tutor|. To learn using Vim, read
+the user manual |usr_toc.txt|.
+
+ *book* *books*
+Most books on Vi and Vim contain a section for beginners. Others are spending
+more words on specific functionality. You can find an overview of Vim books
+here:
+ http://iccf-holland.org/vim_books.html
+
+==============================================================================
+2. Vim on the internet *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: https://www.vim.org/
+ Vim FAQ: https://vimhelp.org/vim_faq.txt.html
+ Downloading: https://www.vim.org/download.php
+
+
+Asking questions, finding answers: https://vi.stackexchange.com/
+"Vi and Vim Stack Exchange is a question and answer site for people using the
+vi and Vim families of text editors"
+
+
+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.
+You can access it here:
+https://groups.google.com/forum/#!topic/comp.editors
+
+ *mail-list* *maillist*
+There are several mailing lists for Vim:
+<vim@vim.org> *vim-use* *vim_use*
+ 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* *vim_dev* *vimdev*
+ For discussions about changing Vim: New features, porting, patches,
+ beta-test versions, etc.
+<vim-announce@vim.org> *vim-announce* *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-mac@vim.org> *vim-mac* *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:
+- Anyone can see the archive, e.g. on Google groups. Search this if you have
+ questions.
+- You can only send messages to these lists if you have subscribed!
+- The first message is moderated, thus it may take a few hours to show up.
+- You need to send the messages from the same location as where you subscribed
+ from (to avoid spam mail).
+
+ *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
+
+
+Bug reports: *bugs* *bug-reports* *bugreport.vim*
+
+There are three ways to report bugs:
+1. For issues with runtime files, look in the header for an email address or
+ any other way to report it to the maintainer.
+2. Open an issue on GitHub: https://github.com/vim/vim/issues
+ The text will be forwarded to the vim-dev maillist.
+3. 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 trigger the bug.
+
+Preferably start Vim with: >
+ vim --clean -u reproduce.vim
+Where reproduce.vim is a script that reproduces the problem. Try different
+machines, if relevant (is this an MS-Windows specific bug perhaps?).
+
+Send me patches if you can! If you create a pull request on
+https://github.com/vim/vim then the automated checks will run and report any
+obvious problems. But you can also send the patch by email (use an attachment
+to avoid white space changes).
+
+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.
+
+==============================================================================
+3. Credits *credits* *author* *Bram* *Moolenaar*
+
+Most of Vim was created by Bram Moolenaar <Bram@vim.org>.
+
+Parts of the documentation come from several Vi manuals, written by:
+ W.N. Joy
+ Alan P.W. Hewett
+ Mark Horton
+
+The Vim editor is based on Stevie and includes (ideas from) other software,
+worked on by the people mentioned here. Other people helped by sending me
+patches, suggestions and giving feedback about what is good and bad in Vim.
+
+Vim would never have become what it is now, without the help of these people!
+
+ Ron Aaron Win32 GUI changes
+ Mohsin Ahmed encryption
+ Zoltan Arpadffy work on VMS port
+ Tony Andrews Stevie
+ Gert van Antwerpen changes for DJGPP on MS-DOS
+ Berkeley DB(3) ideas for swap file implementation
+ Keith Bostic Nvi
+ Walter Briscoe Makefile updates, various patches
+ Ralf Brown SPAWNO library for MS-DOS
+ Robert Colon many useful remarks
+ Marcin Dalecki GTK+ GUI port, toolbar icons, gettext()
+ Kayhan Demirel sent me news in Uganda
+ Chris & John Downey xvi (ideas for multi-windows version)
+ Henk Elbers first VMS port
+ Daniel Elstner GTK+ 2 port
+ Eric Fischer Mac port, 'cindent', and other improvements
+ Benji Fisher Answering lots of user questions
+ Bill Foster Athena GUI port (later removed)
+ Google Lets me work on Vim one day a week
+ Loic Grenie xvim (ideas for multi windows version)
+ Sven Guckes Vim promoter and previous WWW page maintainer
+ Darren Hiebert Exuberant ctags
+ Jason Hildebrand GTK+ 2 port
+ Bruce Hunsaker improvements for VMS port
+ Andy Kahn Cscope support, GTK+ GUI port
+ Oezguer Kesim Maintainer of Vim Mailing Lists
+ Axel Kielhorn work on the Macintosh port
+ Steve Kirkendall Elvis
+ Roger Knobbe original port to Windows NT
+ Sergey Laskavy Vim's help from Moscow
+ Felix von Leitner Previous maintainer of Vim Mailing Lists
+ David Leonard Port of Python extensions to Unix
+ Avner Lottem Edit in right-to-left windows
+ Flemming Madsen X11 client-server, various features and patches
+ Tony Mechelynck answers many user questions
+ Paul Moore Python interface extensions, many patches
+ Katsuhito Nagano Work on multibyte versions
+ Sung-Hyun Nam Work on multibyte versions
+ Vince Negri Win32 GUI and generic console enhancements
+ Steve Oualline Author of the first Vim book |frombook|
+ Dominique Pelle Valgrind reports and many fixes
+ A.Politz Many bug reports and some fixes
+ George V. Reilly Win32 port, Win32 GUI start-off
+ Stephen Riehm bug collector
+ Stefan Roemer various patches and help to users
+ Ralf Schandl IBM OS/390 port
+ Olaf Seibert DICE and BeBox version, regexp improvements
+ Mortaza Shiran Farsi patches
+ Peter da Silva termlib
+ Paul Slootman OS/2 port
+ Henry Spencer regular expressions
+ Dany St-Amant Macintosh port
+ Tim Thompson Stevie
+ G. R. (Fred) Walter Stevie
+ Sven Verdoolaege Perl interface
+ Robert Webb Command-line completion, GUI versions, and
+ lots of patches
+ Ingo Wilken Tcl interface
+ Mike Williams PostScript printing
+ 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.
+ Yegappan Lakshmanan many quickfix features
+
+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
+the ideas from all these people: They keep Vim alive!
+*love* *peace* *friendship* *gross-national-happiness*
+
+
+In this documentation there are several references to other versions of Vi:
+ *Vi* *vi*
+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 is now available under a
+ BSD-style license. More information on Vi can be found through:
+ http://ex-vi.sourceforge.net/
+ *Posix*
+Posix From the IEEE standard 1003.2, Part 2: Shell and utilities.
+ Generally known as "Posix". This is a textual description of
+ how Vi is supposed to work.
+ See |posix-compliance|.
+ *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.
+ The version used is 1.79. ":version" returns "Version 1.79
+ (10/23/96)". There has been no release the last few years, although
+ there is a development version 1.81.
+ Source code is freely available.
+ *Elvis*
+Elvis Another Vi clone, made by Steve Kirkendall. Very compact but isn't
+ as flexible as Vim. Development has stalled, Elvis has left the
+ building! Source code is freely available.
+ *Neovim*
+Neovim A Vim clone. Forked the Vim source in 2014 and went a different way.
+ Very much bound to github and has many more dependencies, making
+ development more complex and limiting portability. Code has been
+ refactored, resulting in patches not being exchangeable with Vim.
+ Supports a remote GUI and integration with scripting languages.
+
+==============================================================================
+4. 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 [],
+{} and <>, and CTRL-X.
+
+Note that Vim uses all possible characters in commands. Sometimes the [], {}
+and <> are part of what you type, the context should make this clear.
+
+
+[] Characters in square brackets are optional.
+
+ *count* *[count]*
+[count] An optional number that may precede the command to multiply
+ or iterate the command. If no number is given, a count of one
+ is used, unless otherwise noted. Note that in this manual the
+ [count] is not mentioned in the description of the command,
+ but only in the explanation. This was done to make the
+ commands easier to look up. If the 'showcmd' option is on,
+ the (partially) entered count is shown at the bottom of the
+ window. You can use <Del> to erase the last digit (|N<Del>|).
+
+ *[quotex]*
+["x] An optional register designation where text can be stored.
+ See |registers|. The x is a single character between 'a' and
+ 'z' or 'A' and 'Z' or '"', and in some cases (with the put
+ command) between '0' and '9', '%', '#', or others. The
+ uppercase and lowercase letter designate the same register,
+ but the lowercase letter is used to overwrite the previous
+ register contents, while the uppercase letter is used to
+ append to the previous register contents. Without the ""x" or
+ with """" the stored text is put into the unnamed register.
+
+ *{}*
+{} Curly braces denote parts of the command which must appear,
+ but which can take a number of different values. The
+ differences between Vim and Vi are also given in curly braces
+ (this will be clear from the context).
+
+ *{char1-char2}*
+{char1-char2} A single character from the range char1 to char2. For
+ example: {a-z} is a lowercase letter. Multiple ranges may be
+ concatenated. For example, {a-zA-Z0-9} is any alphanumeric
+ character.
+
+ *{motion}* *movement*
+{motion} A command that moves the cursor. These are explained in
+ |motion.txt|. Examples:
+ w to start of next word
+ b to begin of current word
+ 4j four lines down
+ /The<CR> to next occurrence of "The"
+ This is used after an |operator| command to move over the text
+ that is to be operated upon.
+ - If the motion includes a count and the operator also has a
+ count, the two counts are multiplied. For example: "2d3w"
+ deletes six words.
+ - The motion can be backwards, e.g. "db" to delete to the
+ start of the word.
+ - The motion can also be a mouse click. The mouse is not
+ supported in every terminal though.
+ - The ":omap" command can be used to map characters while an
+ operator is pending.
+ - Ex commands can be used to move the cursor. This can be
+ used to call a function that does some complicated motion.
+ The motion is always characterwise exclusive, no matter
+ what ":" command is used. This means it's impossible to
+ include the last character of a line without the line break
+ (unless 'virtualedit' is set).
+ If the Ex command changes the text before where the operator
+ starts or jumps to another buffer the result is
+ unpredictable. It is possible to change the text further
+ down. Jumping to another buffer is possible if the current
+ buffer is not unloaded.
+
+ *{Visual}*
+{Visual} A selected text area. It is started with the "v", "V", or
+ CTRL-V command, then any cursor movement command can be used
+ to change the end of the selected text.
+ This is used before an |operator| command to highlight the
+ text that is to be operated upon.
+ See |Visual-mode|.
+
+ *<character>*
+<character> A special character from the table below, optionally with
+ modifiers, or a single ASCII character with modifiers.
+
+ *'character'*
+'c' A single ASCII character.
+
+ *CTRL-{char}*
+CTRL-{char} {char} typed as a control character; that is, typing {char}
+ while holding the CTRL key down. The case of {char} does not
+ matter; thus CTRL-A and CTRL-a are equivalent. But on some
+ terminals, using the SHIFT key will produce another code,
+ don't use it then.
+
+ *'option'*
+'option' An option, or parameter, that can be set to a value, is
+ enclosed in single quotes. See |options|.
+
+ *quotecommandquote*
+"command" A reference to a command that you can type is enclosed in
+ double quotes.
+`command` New style command, this distinguishes it from other quoted
+ text and strings.
+
+ *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).
+
+notation meaning equivalent decimal value(s) ~
+-----------------------------------------------------------------------
+<Nul> zero CTRL-@ 0 (stored as 10) *<Nul>*
+<BS> backspace CTRL-H 8 *backspace*
+<Tab> tab CTRL-I 9 *tab* *Tab*
+ *linefeed*
+<NL> linefeed CTRL-J 10 (used for <Nul>)
+<CR> carriage return CTRL-M 13 *carriage-return*
+<Return> same as <CR> *<Return>*
+<Enter> same as <CR> *<Enter>*
+<Esc> escape CTRL-[ 27 *escape* *<Esc>*
+<Space> space 32 *space*
+<lt> less-than < 60 *<lt>*
+<Bslash> backslash \ 92 *backslash* *<Bslash>*
+<Bar> vertical bar | 124 *<Bar>*
+<Del> delete 127
+<CSI> command sequence intro ALT-Esc 155 *<CSI>*
+<xCSI> CSI when typed in the GUI *<xCSI>*
+
+<EOL> end-of-line (can be <CR>, <NL> or <CR><NL>,
+ depends on system and 'fileformat') *<EOL>*
+
+<Up> cursor-up *cursor-up* *cursor_up*
+<Down> cursor-down *cursor-down* *cursor_down*
+<Left> cursor-left *cursor-left* *cursor_left*
+<Right> cursor-right *cursor-right* *cursor_right*
+<S-Up> shift-cursor-up
+<S-Down> shift-cursor-down
+<S-Left> shift-cursor-left
+<S-Right> shift-cursor-right
+<C-Left> control-cursor-left
+<C-Right> control-cursor-right
+<F1> - <F12> function keys 1 to 12 *function_key* *function-key*
+<S-F1> - <S-F12> shift-function keys 1 to 12 *<S-F1>*
+<Help> help key
+<Undo> undo key
+<Insert> insert key
+<Home> home *home*
+<End> end *end*
+<PageUp> page-up *page_up* *page-up*
+<PageDown> page-down *page_down* *page-down*
+<kHome> keypad home (upper left) *keypad-home*
+<kEnd> keypad end (lower left) *keypad-end*
+<kPageUp> keypad page-up (upper right) *keypad-page-up*
+<kPageDown> keypad page-down (lower right) *keypad-page-down*
+<kPlus> keypad + *keypad-plus*
+<kMinus> keypad - *keypad-minus*
+<kMultiply> keypad * *keypad-multiply*
+<kDivide> keypad / *keypad-divide*
+<kEnter> keypad Enter *keypad-enter*
+<kPoint> keypad Decimal point *keypad-point*
+<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-*
+<A-...> same as <M-...> *<A-*
+<D-...> command-key (Macintosh only) *<D-*
+<t_xx> key with "xx" entry in termcap
+-----------------------------------------------------------------------
+
+Note: The shifted cursor keys, the help key, and the undo key are only
+available on a few terminals. On the Amiga, shifted function key 10 produces
+a code (CSI) that is also used by key sequences. It will be recognized only
+after typing another key.
+
+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. Also see |:fixdel|.
+
+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
+sends the same raw key code as its non-keypad equivalent, it will be
+recognized as the non-keypad code. For example, when <kHome> sends the same
+code as <Home>, when pressing <kHome> Vim will think <Home> was pressed.
+Mapping <kHome> will not work then.
+
+ *<>*
+Examples are often given in the <> notation. Sometimes this is just to make
+clear what you need to type, but often it can be typed literally, e.g., with
+the ":map" command. The rules are:
+ 1. Any printable characters are typed directly, except backslash and '<'
+ 2. A backslash is represented with "\\", double backslash, or "<Bslash>".
+ 3. A real '<' is represented with "\<" or "<lt>". When there is no
+ confusion possible, a '<' can be used directly.
+ 4. "<key>" means the special key typed. This is the notation explained in
+ the table above. A few examples:
+ <Esc> Escape key
+ <C-G> CTRL-G
+ <Up> cursor up key
+ <C-LeftMouse> Control- left mouse click
+ <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)
+ Although you can specify <M-{char}> with {char} being a multibyte
+ character, Vim may not be able to know what byte sequence that is and then
+ it won't work.
+
+If you want to use the full <> notation in Vim, you have to make sure the '<'
+flag is excluded from 'cpoptions' (when 'compatible' is not set, it already is
+by default). >
+ :set cpo-=<
+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.
+
+Examples for mapping CTRL-H to the six characters "<Home>": >
+ :imap <C-H> \<Home>
+ :imap <C-H> <lt>Home>
+The first one only works when the 'B' flag is not in 'cpoptions'. The second
+one always works.
+To get a literal "<lt>" in a mapping: >
+ :map <C-L> <lt>lt>
+
+For mapping, abbreviation and menu commands you can then copy-paste the
+examples and use them directly. Or type them literally, including the '<' and
+'>' characters. This does NOT work for other commands, like ":set" and
+":autocmd"!
+
+The notation can be used in a double quoted strings, using "\<" at the start,
+e.g. "\<C-Space>". This results in a special key code. To convert this back
+to readable text use `keytrans()`.
+
+==============================================================================
+5. Modes, introduction *vim-modes-intro* *vim-modes*
+
+Vim has seven BASIC modes:
+
+ *Normal* *Normal-mode* *command-mode*
+Normal mode In Normal mode you can enter all the normal editor
+ commands. If you start the editor you are in this
+ mode (unless you have set the 'insertmode' option,
+ see below). This is also known as command mode.
+
+Visual mode This is like Normal mode, but the movement commands
+ extend a highlighted area. When a non-movement
+ command is used, it is executed for the highlighted
+ area. See |Visual-mode|.
+ If the 'showmode' option is on "-- VISUAL --" is shown
+ at the bottom of the window.
+
+Select mode This looks most like the MS-Windows selection mode.
+ Typing a printable character deletes the selection
+ and starts Insert mode. See |Select-mode|.
+ If the 'showmode' option is on "-- SELECT --" is shown
+ at the bottom of the window.
+
+Insert mode In Insert mode the text you type is inserted into the
+ buffer. See |Insert-mode|.
+ If the 'showmode' option is on "-- INSERT --" is shown
+ at the bottom of the window.
+
+Command-line mode In Command-line mode (also called Cmdline mode) you
+Cmdline mode can enter one line of text at the bottom of the
+ window. This is for the Ex commands, ":", the pattern
+ search commands, "?" and "/", and the filter command,
+ "!". |Cmdline-mode|
+
+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-Job mode Interacting with a job in a terminal window. Typed
+ keys go to the job and the job output is displayed in
+ the terminal window. See |terminal| about how to
+ switch to other modes.
+
+There are seven ADDITIONAL modes. These are variants of the BASIC modes:
+
+ *Operator-pending* *Operator-pending-mode*
+Operator-pending mode This is like Normal mode, but after an operator
+ command has started, and Vim is waiting for a {motion}
+ to specify the text that the operator will work on.
+
+Replace mode Replace mode is a special case of Insert mode. You
+ can do the same things as in Insert mode, but for
+ each character you enter, one character of the existing
+ text is deleted. See |Replace-mode|.
+ If the 'showmode' option is on "-- REPLACE --" is
+ shown at the bottom of the window.
+
+Virtual Replace mode Virtual Replace mode is similar to Replace mode, but
+ instead of file characters you are replacing screen
+ real estate. See |Virtual-Replace-mode|.
+ If the 'showmode' option is on "-- VREPLACE --" is
+ shown at the bottom of the window.
+
+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.
+
+Terminal-Normal mode Using Normal mode in a terminal window. Making
+ changes is impossible. Use an insert command, such as
+ "a" or "i", to return to Terminal-Job mode.
+
+Insert Visual mode Entered when starting a Visual selection from Insert
+ mode, e.g., by using CTRL-O and then "v", "V" or
+ CTRL-V. When the Visual selection ends, Vim returns
+ to Insert mode.
+ If the 'showmode' option is on "-- (insert) VISUAL --"
+ is shown at the bottom of the window.
+
+Insert Select mode Entered when starting Select mode from Insert mode.
+ E.g., by dragging the mouse or <S-Right>.
+ When the Select mode ends, Vim returns to Insert mode.
+ If the 'showmode' option is on "-- (insert) SELECT --"
+ is shown at the bottom of the window.
+
+==============================================================================
+6. 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
+though, use ":visual".
+You will know you are back in Normal mode when you see the screen flash or
+hear the bell after you type <Esc>. However, when pressing <Esc> after using
+CTRL-O in Insert mode you get a beep but you are still in Insert mode, type
+<Esc> again.
+
+ *i_esc*
+ TO mode ~
+ Normal Visual Select Insert Replace Cmd-line Ex ~
+FROM mode ~
+Normal v V ^V *4 *1 R gR : / ? ! Q
+Visual *2 ^G c C -- : --
+Select *5 ^O ^G *6 -- -- --
+Insert <Esc> -- -- <Insert> -- --
+Replace <Esc> -- -- <Insert> -- --
+Command-line *3 -- -- :start -- --
+Ex :vi -- -- -- -- --
+
+-- not possible
+
+*1 Go from Normal mode to Insert mode by giving the command "i", "I", "a",
+ "A", "o", "O", "c", "C", "s" or S".
+*2 Go from Visual mode to Normal mode by giving a non-movement command, which
+ causes the command to be executed, or by hitting <Esc> "v", "V" or "CTRL-V"
+ (see |v_v|), which just stops Visual mode without side effects.
+*3 Go from Command-line mode to Normal mode by:
+ - Hitting <CR> or <NL>, which causes the entered command to be executed.
+ - Deleting the complete line (e.g., with CTRL-U) and giving a final <BS>.
+ - Hitting CTRL-C or <Esc>, which quits the command-line without executing
+ the command.
+ In the last case <Esc> may be the character defined with the 'wildchar'
+ option, in which case it will start command-line completion. You can
+ ignore that and type <Esc> again.
+*4 Go from Normal to Select mode by:
+ - use the mouse to select text while 'selectmode' contains "mouse"
+ - use a non-printable command to move the cursor while keeping the Shift
+ key pressed, and the 'selectmode' option contains "key"
+ - use "v", "V" or "CTRL-V" while 'selectmode' contains "cmd"
+ - use "gh", "gH" or "g CTRL-H" |g_CTRL-H|
+*5 Go from Select mode to Normal mode by using a non-printable command to move
+ the cursor, without keeping the Shift key pressed.
+*6 Go from Select mode to Insert mode by typing a printable character. The
+ selection is deleted and the character is inserted.
+
+If the 'insertmode' option is on, editing a file will start in Insert mode.
+
+ *CTRL-\_CTRL-N* *i_CTRL-\_CTRL-N* *c_CTRL-\_CTRL-N* *v_CTRL-\_CTRL-N*
+Additionally the command CTRL-\ CTRL-N or <C-\><C-N> can be used to go to
+Normal mode from any other mode. This can be used to make sure Vim is in
+Normal mode, without causing a beep like <Esc> would. However, this does not
+work in Ex mode. When used after a command that takes an argument, such as
+|f| or |m|, the timeout set with 'ttimeoutlen' applies.
+When focus is in a terminal window, CTRL-\ CTRL-N goes to Normal mode until an
+edit command is entered, see |t_CTRL-\_CTRL-N|.
+
+ *CTRL-\_CTRL-G* *i_CTRL-\_CTRL-G* *c_CTRL-\_CTRL-G* *v_CTRL-\_CTRL-G*
+The command CTRL-\ CTRL-G or <C-\><C-G> can be used to go to Insert mode when
+'insertmode' is set. Otherwise it goes to Normal mode. This can be used to
+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:
+ - 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 or the |-e| command line
+ argument was used.
+ 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 or |defaults.vim|, "Q"
+ works like "gq". Except for Select mode.
+
+ *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.
+
+==============================================================================
+7. 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
+exceptions:
+- When the 'cpoptions' option contains '$', and the change is within one line,
+ the text is not directly deleted, but a '$' is put at the last deleted
+ character.
+- When inserting text in one window, other windows on the same text are not
+ updated until the insert is finished.
+
+Lines longer than the window width will wrap, unless the 'wrap' option is off
+(see below). The 'linebreak' option can be set to wrap at a blank character.
+
+If the window has room after the last line of the buffer, Vim will show '~' in
+the first column of the last lines in the window, like this:
+
+ +-----------------------+
+ |some line |
+ |last line |
+ |~ |
+ |~ |
+ +-----------------------+
+
+Thus the '~' lines indicate that the end of the buffer was reached.
+
+If the last line in a window doesn't fit, Vim will indicate this with a '@' in
+the first column of the last lines in the window, like this:
+
+ +-----------------------+
+ |first line |
+ |second line |
+ |@ |
+ |@ |
+ +-----------------------+
+
+Thus the '@' lines indicate that there is a line that doesn't fit in the
+window.
+
+When the "lastline" flag is present in the 'display' option, you will not see
+'@' characters at the left side of window. If the last line doesn't fit
+completely, only the part that fits is shown, and the last three characters of
+the last line are replaced with "@@@", like this:
+
+ +-----------------------+
+ |first line |
+ |second line |
+ |a very long line that d|
+ |oesn't fit in the wi@@@|
+ +-----------------------+
+
+If there is a single line that is too long to fit in the window, this is a
+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 'showbreak' option contains the string to put in front of wrapped lines.
+
+ *wrap-off*
+If the 'wrap' option is off, long lines will not wrap. Only the part that
+fits on the screen is shown. If the cursor is moved to a part of the line
+that is not shown, the screen is scrolled horizontally. The advantage of
+this method is that columns are shown as they are and lines that cannot fit
+on the screen can be edited. The disadvantage is that you cannot see all the
+characters of a line at once. The 'sidescroll' option can be set to the
+minimal number of columns to scroll.
+
+All normal ASCII characters are displayed directly on the screen. The <Tab>
+is replaced with the number of spaces that it represents. Other non-printing
+characters are replaced with "^{char}", where {char} is the non-printing
+character with 64 added. Thus character 7 (bell) will be shown as "^G".
+Characters between 127 and 160 are replaced with "~{char}", where {char} is
+the character with 64 subtracted. These characters occupy more than one
+position on the screen. The cursor can only be positioned on the first one.
+
+If you set the 'number' option, all lines will be preceded with their
+number. Tip: If you don't like wrapping lines to mix with the line numbers,
+set the 'showbreak' option to eight spaces:
+ ":set showbreak=\ \ \ \ \ \ \ \ "
+
+If you set the 'list' option, <Tab> characters will not be shown as several
+spaces, but as "^I". A '$' will be placed at the end of the line, so you can
+find trailing blanks.
+
+In Command-line mode only the command-line itself is shown correctly. The
+display of the buffer contents is updated as soon as you go back to Command
+mode.
+
+The last line of the window is used for status and other messages. The
+status messages will only be used if an option is on:
+
+status message option default Unix default ~
+current mode 'showmode' on on
+command characters 'showcmd' on off
+cursor position 'ruler' off off
+
+The current mode is "-- INSERT --" or "-- REPLACE --", see |'showmode'|. The
+command characters are those that you typed but were not used yet.
+
+If you have a slow terminal you can switch off the status messages to speed
+up editing:
+ :set nosc noru nosm
+
+If there is an error, an error message will be shown for at least one second
+(in reverse video).
+
+Some commands show how many lines were affected. Above which threshold this
+happens can be controlled with the 'report' option (default 2).
+
+On the Amiga Vim will run in a CLI window. The name Vim and the full name of
+the current file name will be shown in the title bar. When the window is
+resized, Vim will automatically redraw the 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*
+
+ buffer Contains lines of text, usually read from a file.
+ 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. There can be multiple windows for
+ one buffer.
+
+A screen contains one or more windows, separated by status lines and with the
+command line at the bottom.
+
+ +-------------------------------+
+screen | window 1 | window 2 |
+ | | |
+ | | |
+ |= status line =|= status line =|
+ | window 3 |
+ | |
+ | |
+ |==== status line ==============|
+ |command line |
+ +-------------------------------+
+
+The command line is also used for messages. It scrolls up the screen when
+there is not enough room in the command line.
+
+A difference is made between four types of lines:
+
+ buffer lines The lines in the buffer. This is the same as the
+ lines as they are read from/written to a file. They
+ can be thousands of characters long.
+ logical lines The buffer lines with folding applied. Buffer lines
+ in a closed fold are changed to a single logical line:
+ "+-- 99 lines folded". They can be thousands of
+ characters long.
+ window lines The lines displayed in a window: A range of logical
+ 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
+ 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
+ line gets longer it wraps and lines are scrolled to
+ make room.
+
+buffer lines logical lines window lines screen lines ~
+
+1. one 1. one 1. +-- folded 1. +-- folded
+2. two 2. +-- folded 2. five 2. five
+3. three 3. five 3. six 3. six
+4. four 4. six 4. seven 4. seven
+5. five 5. seven 5. === status line ===
+6. six 6. aaa
+7. seven 7. bbb
+ 8. ccc ccc c
+1. aaa 1. aaa 1. aaa 9. cc
+2. bbb 2. bbb 2. bbb 10. ddd
+3. ccc ccc ccc 3. ccc ccc ccc 3. ccc ccc c 11. ~
+4. ddd 4. ddd 4. cc 12. === status line ===
+ 5. ddd 13. (command line)
+ 6. ~
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/makehtml.awk b/runtime/doc/makehtml.awk
new file mode 100644
index 0000000..40154b0
--- /dev/null
+++ b/runtime/doc/makehtml.awk
@@ -0,0 +1,787 @@
+BEGIN {
+ # some initialization variables
+ asciiart="no";
+ wasset="no";
+ lineset=0;
+ sample="no";
+ while ( getline ti <"tags.ref" > 0 ) {
+ nf=split(ti,tag," ");
+ tagkey[tag[1]]="yes";tagref[tag[1]]=tag[2];
+ }
+ skip_word["and"]="yes";
+ skip_word["backspace"]="yes";
+ skip_word["beep"]="yes";
+ skip_word["bugs"]="yes";
+ skip_word["da"]="yes";
+ skip_word["end"]="yes";
+ skip_word["ftp"]="yes";
+ skip_word["go"]="yes";
+ skip_word["help"]="yes";
+ skip_word["home"]="yes";
+ skip_word["news"]="yes";
+ skip_word["index"]="yes";
+ skip_word["insert"]="yes";
+ skip_word["into"]="yes";
+ skip_word["put"]="yes";
+ skip_word["reference"]="yes";
+ skip_word["section"]="yes";
+ skip_word["space"]="yes";
+ skip_word["starting"]="yes";
+ skip_word["toggle"]="yes";
+ skip_word["various"]="yes";
+ skip_word["version"]="yes";
+ skip_word["is"]="yes";
+}
+#
+# protect special chars
+#
+/[><&]/ {gsub(/&/,"\\&amp;");gsub(/>/,"\\&gt;");gsub(/</,"\\&lt;");gsub("","\\&aacute;");}
+#
+# end of sample lines by non-blank in first column
+#
+sample == "yes" && substr($0,1,4) == "&lt;" { sample = "no"; gsub(/^&lt;/, " "); }
+sample == "yes" && substr($0,1,1) != " " && substr($0,1,1) != " " && length($0) > 0 { sample = "no" }
+#
+# sample lines printed bold unless empty...
+#
+sample == "yes" && $0 =="" { print ""; next; }
+sample == "yes" && $0 !="" { print "<B>" $0 "</B>"; next; }
+#
+# start of sample lines in next line
+#
+$0 == "&gt;" { sample = "yes"; print ""; next; }
+substr($0,length($0)-4,5) == " &gt;" { sample = "yes"; gsub(/ &gt;$/, ""); }
+#
+# header lines printed bold, colored
+#
+substr($0,length($0),1) == "~" { print "<B><FONT COLOR=\"PURPLE\">" substr($0,1,length($0)-1) "</FONT></B>"; next; }
+#
+#ad hoc code
+#
+/^"\|& / {gsub(/\|/,"\\&#124;"); }
+/ = b / {gsub(/ b /," \\&#98; "); }
+#
+# one letter tag
+#
+/[ ]\*.\*[ ]/ {gsub(/\*/,"ZWWZ"); }
+#
+# isolated "*"
+#
+/[ ]\*[ ]/ {gsub(/ \* /," \\&#42; ");
+ gsub(/ \* /," \\&#42; ");
+ gsub(/ \* /," \\&#42; ");
+ gsub(/ \* /," \\&#42; "); }
+#
+# tag start
+#
+/[ ]\*[^ ]/ {gsub(/ \*/," ZWWZ");gsub(/ \*/," ZWWZ");}
+/^\*[^ ]/ {gsub(/^\*/,"ZWWZ");}
+#
+# tag end
+#
+/[^ ]\*$/ {gsub(/\*$/,"ZWWZ");}
+/[^ \/ ]\*[ ]/ {gsub(/\*/,"ZWWZ");}
+#
+# isolated "|"
+#
+/[ ]\|[ ]/ {gsub(/ \| /," \\&#124; ");
+ gsub(/ \| /," \\&#124; ");
+ gsub(/ \| /," \\&#124; ");
+ gsub(/ \| /," \\&#124; "); }
+/'\|'/ { gsub(/'\|'/,"'\\&#124;'"); }
+/\^V\|/ {gsub(/\^V\|/,"^V\\&#124;");}
+/ \\\| / {gsub(/\|/,"\\&#124;");}
+#
+# one letter pipes and "||" false pipe (digraphs)
+#
+/[ ]\|.\|[ ]/ && asciiart == "no" {gsub(/\|/,"YXXY"); }
+/^\|.\|[ ]/ {gsub(/\|/,"YXXY"); }
+/\|\|/ {gsub(/\|\|/,"\\&#124;\\&#124;"); }
+/^shellpipe/ {gsub(/\|/,"\\&#124;"); }
+#
+# pipe start
+#
+/[ ]\|[^ ]/ && asciiart == "no" {gsub(/ \|/," YXXY");
+ gsub(/ \|/," YXXY");}
+/^\|[^ ]/ {gsub(/^\|/,"YXXY");}
+#
+# pipe end
+#
+/[^ ]\|$/ && asciiart == "no" {gsub(/\|$/,"YXXY");}
+/[^ ]\|[s ,.); ]/ && asciiart == "no" {gsub(/\|/,"YXXY");}
+/[^ ]\|]/ && asciiart == "no" {gsub(/\|/,"YXXY");}
+#
+# various
+#
+/'"/ {gsub(/'"/,"\\&#39;\\&#34;'");}
+/"/ {gsub(/"/,"\\&quot;");}
+/%/ {gsub(/%/,"\\&#37;");}
+
+NR == 1 { nf=split(FILENAME,f,".")
+ print "<HTML>";
+
+ print "<HEAD>"
+ if ( FILENAME == "mbyte.txt" ) {
+ # needs utf-8 as uses many languages
+ print "<META HTTP-EQUIV=\"Content-type\" content=\"text/html; charset=UTF-8\">";
+ } else {
+ # common case - Latin1
+ print "<META HTTP-EQUIV=\"Content-type\" content=\"text/html; charset=ISO-8859-1\">";
+ }
+ print "<TITLE>Vim documentation: " f[1] "</TITLE>";
+ print "</HEAD>";
+
+ print "<BODY BGCOLOR=\"#ffffff\">";
+ print "<H1>Vim documentation: " f[1] "</H1>";
+ print "<A NAME=\"top\"></A>";
+ if ( FILENAME != "help.txt" ) {
+ print "<A HREF=\"index.html\">main help file</A>\n";
+ }
+ print "<HR>";
+ print "<PRE>";
+ filename=f[1]".html";
+}
+
+# set to a low value to test for few lines of text
+# NR == 99999 { exit; }
+
+# ignore underlines and tags
+substr($0,1,5) == " vim:" { next; }
+substr($0,1,4) == "vim:" { next; }
+# keep just whole lines of "-", "="
+substr($0,1,3) == "===" && substr($0,75,1) != "=" { next; }
+substr($0,1,3) == "---" && substr($0,75,1) != "-" { next; }
+
+{
+ nstar = split($0,s,"ZWWZ");
+ for ( i=2 ; i <= nstar ; i=i+2 ) {
+ nbla=split(s[i],blata,"[ ]");
+ if ( nbla > 1 ) {
+ gsub("ZWWZ","*");
+ nstar = split($0,s,"ZWWZ");
+ }
+ }
+ npipe = split($0,p,"YXXY");
+ for ( i=2 ; i <= npipe ; i=i+2 ) {
+ nbla=split(p[i],blata,"[ ]");
+ if ( nbla > 1 ) {
+ gsub("YXXY","|");
+ ntabs = split($0,p,"YXXY");
+ }
+ }
+}
+
+
+FILENAME == "gui.txt" && asciiart == "no" \
+ && $0 ~ /\+----/ && $0 ~ /----\+/ {
+ asciiart= "yes";
+ 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";
+ asciicnt=0;
+ }
+
+asciiart == "yes" && $0=="" { asciicnt++; }
+
+asciiart == "yes" && asciicnt == 2 { asciiart = "no"; }
+
+asciiart == "yes" { npipe = 1; }
+# { print NR " <=> " asciiart; }
+
+#
+# line contains "*"
+#
+nstar > 2 && npipe < 3 {
+ printf("\n");
+ for ( i=1; i <= nstar ; i=i+2 ) {
+ this=s[i];
+ put_this();
+ ii=i+1;
+ nbla = split(s[ii],blata," ");
+ if ( ii <= nstar ) {
+ if ( nbla == 1 && substr(s[ii],length(s[ii]),1) != " " ) {
+ printf("*<A NAME=\"%s\"></A>",s[ii]);
+ printf("<B>%s</B>*",s[ii]);
+ } else {
+ printf("*%s*",s[ii]);
+ }
+ }
+ }
+ printf("\n");
+ next;
+ }
+#
+# line contains "|"
+#
+npipe > 2 && nstar < 3 {
+ if ( npipe%2 == 0 ) {
+ for ( i=1; i < npipe ; i++ ) {
+ gsub("ZWWZ","*",p[i]);
+ printf("%s|",p[i]);
+ }
+ printf("%s\n",p[npipe]);
+ next;
+ }
+ for ( i=1; i <= npipe ; i++ )
+ {
+ if ( i % 2 == 1 ) {
+ gsub("ZWWZ","*",p[i]);
+ this=p[i];
+ put_this();
+ }
+ else {
+ nfn=split(p[i],f,".");
+ if ( nfn == 1 || f[2] == "" || f[1] == "" || length(f[2]) < 3 ) {
+ find_tag1();
+ }
+ else {
+ if ( f[1] == "index" ) {
+ printf "|<A HREF=\"vimindex.html\">" p[i] "</A>|";
+ } else {
+ if ( f[1] == "help" ) {
+ printf "|<A HREF=\"index.html\">" p[i] "</A>|";
+ } else {
+ printf "|<A HREF=\"" f[1] ".html\">" p[i] "</A>|";
+ }
+ }
+ }
+ }
+ }
+ printf("\n");
+ next;
+ }
+#
+# line contains both "|" and "*"
+#
+npipe > 2 && nstar > 2 {
+ printf("\n");
+ for ( j=1; j <= nstar ; j=j+2 ) {
+ npipe = split(s[j],p,"YXXY");
+ if ( npipe > 1 ) {
+ for ( np=1; np<=npipe; np=np+2 ) {
+ this=p[np];
+ put_this();
+ i=np+1;find_tag1();
+ }
+ } else {
+ this=s[j];
+ put_this();
+ }
+ jj=j+1;
+ nbla = split(s[jj],blata," ");
+ if ( jj <= nstar && nbla == 1 && s[jj] != "" ) {
+ printf("*<A NAME=\"%s\"></A>",s[jj]);
+ printf("<B>%s</B>*",s[jj]);
+ } else {
+ if ( s[jj] != "" ) {
+ printf("*%s*",s[jj]);
+ }
+ }
+ }
+ printf("\n");
+ next;
+ }
+#
+# line contains e-mail address john.doe@some.place.edu
+#
+$0 ~ /@/ && $0 ~ /[a-zA-Z0-9]@[a-z]/ \
+ {
+ nemail=split($0,em," ");
+ if ( substr($0,1,1) == " " ) { printf(" "); }
+ for ( i=1; i <= nemail; i++ ) {
+ if ( em[i] ~ /@/ ) {
+ if ( substr(em[i],2,3) == "lt;" && substr(em[i],length(em[i])-2,3) == "gt;" ) {
+ mailaddr=substr(em[i],5,length(em[i])-8);
+ printf("<A HREF=\"mailto:%s\">&lt;%s&gt;</A> ",mailaddr,mailaddr);
+ } else {
+ if ( substr(em[i],2,3) == "lt;" && substr(em[i],length(em[i])-3,3) == "gt;" ) {
+ mailaddr=substr(em[i],5,length(em[i])-9);
+ printf("<A HREF=\"mailto:%s\">&lt;%s&gt;</A>%s ",mailaddr,mailaddr,substr(em[i],length(em[i]),1));
+ } else {
+ printf("<A HREF=\"mailto:%s\">%s</A> ",em[i],em[i]);
+ }
+ }
+ } else {
+ printf("%s ",em[i]);
+ }
+ }
+ #print "*** " NR " " FILENAME " - possible mail ref";
+ printf("\n");
+ next;
+ }
+#
+# line contains http / ftp reference
+#
+$0 ~ /http:\/\// || $0 ~ /ftp:\/\// {
+ gsub("URL:","");
+ gsub("&lt;","");
+ gsub("&gt;","");
+ gsub("\\(","");
+ gsub("\\)","");
+ nemail=split($0,em," ");
+ for ( i=1; i <= nemail; i++ ) {
+ if ( substr(em[i],1,5) == "http:" ||
+ substr(em[i],1,4) == "ftp:" ) {
+ if ( substr(em[i],length(em[i]),1) != "." ) {
+ printf(" <A HREF=\"%s\">%s</A>",em[i],em[i]);
+ } else {
+ em[i]=substr(em[i],1,length(em[i])-1);
+ printf(" <A HREF=\"%s\">%s</A>.",em[i],em[i]);
+ }
+ } else {
+ printf(" %s",em[i]);
+ }
+ }
+ #print "*** " NR " " FILENAME " - possible http ref";
+ printf("\n");
+ next;
+ }
+#
+# some lines contains just one "almost regular" "*"...
+#
+nstar == 2 {
+ this=s[1];
+ put_this();
+ printf("*");
+ this=s[2];
+ put_this();
+ printf("\n");
+ next;
+ }
+#
+# regular line
+#
+ { ntabs = split($0,tb," ");
+ for ( i=1; i < ntabs ; i++) {
+ this=tb[i];
+ put_this();
+ printf(" ");
+ }
+ this=tb[ntabs];
+ put_this();
+ printf("\n");
+ }
+
+
+asciiart == "yes" && $0 ~ /\+-\+--/ \
+ && $0 ~ "scrollbar" { asciiart = "no"; }
+
+END {
+ topback();
+ print "</PRE>\n</BODY>\n\n\n</HTML>"; }
+
+#
+# as main we keep index.txt (by default)
+#
+function topback () {
+ if ( FILENAME != "tags" ) {
+ if ( FILENAME != "help.txt" ) {
+ printf("<A HREF=\"#top\">top</A> - ");
+ printf("<A HREF=\"index.html\">main help file</A>\n");
+ } else {
+ printf("<A HREF=\"#top\">top</A>\n");
+ }
+ }
+}
+
+function find_tag1() {
+ if ( p[i] == "" ) { return; }
+ if ( tagkey[p[i]] == "yes" ) {
+ which=tagref[p[i]];
+ put_href();
+ return;
+ }
+ # if not found, then we have a problem
+ print "============================================" >>"errors.log";
+ print FILENAME ", line " NR ", pointer: >>" p[i] "<<" >>"errors.log";
+ print $0 >>"errors.log";
+ which="intro.html";
+ put_href();
+}
+
+function see_tag() {
+# ad-hoc code:
+if ( atag == "\"--" || atag == "--\"" ) { return; }
+if_already();
+if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+allow_one_char="no";
+find_tag2();
+if ( done == "yes" ) { return; }
+rightchar=substr(atag,length(atag),1);
+if ( rightchar == "." \
+ || rightchar == "," \
+ || rightchar == ":" \
+ || rightchar == ";" \
+ || rightchar == "!" \
+ || rightchar == "?" \
+ || rightchar == ")" ) {
+ atag=substr(atag,1,length(atag)-1);
+ if_already();
+ if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+ find_tag2();
+ if ( done == "yes" ) { printf("%s",rightchar);return; }
+ leftchar=substr(atag,1,1);
+ lastbut1=substr(atag,length(atag),1);
+ if ( leftchar == "'" && lastbut1 == "'" ) {
+ allow_one_char="yes";
+ atag=substr(atag,2,length(atag)-2);
+ if_already();
+ if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+ printf("%s",leftchar);
+ aword=substr(atag,1,length(atag))""lastbut1""rightchar;
+ find_tag2();
+ if ( done == "yes" ) { printf("%s%s",lastbut1,rightchar);return; }
+ }
+ }
+atag=aword;
+leftchar=substr(atag,1,1);
+if ( leftchar == "'" && rightchar == "'" ) {
+ allow_one_char="yes";
+ atag=substr(atag,2,length(atag)-2);
+ if ( atag == "<" ) { printf(" |%s|%s| ",atag,p[2]); }
+ if_already();
+ if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+ printf("%s",leftchar);
+ find_tag2();
+ if ( done == "yes" ) { printf("%s",rightchar);return; }
+ printf("%s%s",atag,rightchar);
+ return;
+ }
+last2=substr(atag,length(atag)-1,2);
+first2=substr(atag,1,2);
+if ( first2 == "('" && last2 == "')" ) {
+ allow_one_char="yes";
+ atag=substr(atag,3,length(atag)-4);
+ if_already();
+ if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+ printf("%s",first2);
+ find_tag2();
+ if ( done == "yes" ) { printf("%s",last2);return; }
+ printf("%s%s",atag,last2);
+ return;
+ }
+if ( last2 == ".)" ) {
+ atag=substr(atag,1,length(atag)-2);
+ if_already();
+ if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+ find_tag2();
+ if ( done == "yes" ) { printf("%s",last2);return; }
+ printf("%s%s",atag,last2);
+ return;
+ }
+if ( last2 == ")." ) {
+ atag=substr(atag,1,length(atag)-2);
+ find_tag2();
+ if_already();
+ if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+ if ( done == "yes" ) { printf("%s",last2);return; }
+ printf("%s%s",atag,last2);
+ return;
+ }
+first6=substr(atag,1,6);
+last6=substr(atag,length(atag)-5,6);
+if ( last6 == atag ) {
+ printf("%s",aword);
+ return;
+ }
+last6of7=substr(atag,length(atag)-6,6);
+if ( first6 == "&quot;" && last6of7 == "&quot;" && length(atag) > 12 ) {
+ allow_one_char="yes";
+ atag=substr(atag,7,length(atag)-13);
+ if_already();
+ if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+ printf("%s",first6);
+ find_tag2();
+ if ( done == "yes" ) { printf("&quot;%s",rightchar); return; }
+ printf("%s&quot;%s",atag,rightchar);
+ return;
+ }
+if ( first6 == "&quot;" && last6 != "&quot;" ) {
+ allow_one_char="yes";
+ atag=substr(atag,7,length(atag)-6);
+ if ( atag == "[" ) { printf("&quot;%s",atag); return; }
+ if ( atag == "." ) { printf("&quot;%s",atag); return; }
+ if ( atag == ":" ) { printf("&quot;%s",atag); return; }
+ if ( atag == "a" ) { printf("&quot;%s",atag); return; }
+ if ( atag == "A" ) { printf("&quot;%s",atag); return; }
+ if ( atag == "g" ) { printf("&quot;%s",atag); return; }
+ if_already();
+ if ( already == "yes" ) {
+ printf("&quot;%s",atag);
+ return;
+ }
+ printf("%s",first6);
+ find_tag2();
+ if ( done == "yes" ) { return; }
+ printf("%s",atag);
+ return;
+ }
+if ( last6 == "&quot;" && first6 == "&quot;" ) {
+ allow_one_char="yes";
+ atag=substr(atag,7,length(atag)-12);
+ if_already();
+ if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+ printf("%s",first6);
+ find_tag2();
+ if ( done == "yes" ) { printf("%s",last6);return; }
+ printf("%s%s",atag,last6);
+ return;
+ }
+last6of7=substr(atag,length(atag)-6,6);
+if ( last6of7 == "&quot;" && first6 == "&quot;" ) {
+ allow_one_char="yes";
+ atag=substr(atag,7,length(atag)-13);
+ #printf("\natag=%s,aword=%s\n",atag,aword);
+ if_already();
+ if ( already == "yes" ) {
+ printf("%s",aword);
+ return;
+ }
+ printf("%s",first6);
+ find_tag2();
+ if ( done == "yes" ) { printf("%s%s",last6of7,rightchar);return; }
+ printf("%s%s%s",atag,last6of7,rightchar);
+ return;
+ }
+printf("%s",aword);
+}
+
+function find_tag2() {
+ done="no";
+ # no blanks present in a tag...
+ ntags=split(atag,blata,"[ ]");
+ if ( ntags > 1 ) { return; }
+ if ( ( allow_one_char == "no" ) && \
+ ( index("!#$%&'()+,-./0:;=?@ACINX\\[\\]^_`at\\{\\}~",atag) !=0 ) ) {
+ return;
+ }
+ if ( skip_word[atag] == "yes" ) { return; }
+ if ( wasset == "yes" && lineset == NR ) {
+ wasset="no";
+ see_opt();
+ if ( done_opt == "yes" ) {return;}
+ }
+ if ( wasset == "yes" && lineset != NR ) {
+ wasset="no";
+ }
+ if ( atag == ":set" ) {
+ wasset="yes";
+ lineset=NR;
+ }
+ if ( tagkey[atag] == "yes" ) {
+ which=tagref[atag];
+ put_href2();
+ done="yes";
+ }
+}
+
+function find_tag3() {
+ done="no";
+ # no blanks present in a tag...
+ ntags=split(btag,blata,"[ ]");
+ if ( ntags > 1 ) { return; }
+ if ( ( allow_one_char == "no" ) && \
+ ( index("!#$%&'()+,-./0:;=?@ACINX\\[\\]^_`at\\{\\}~",btag) !=0 ) ) {
+ return;
+ }
+ if ( skip_word[btag] == "yes" ) { return; }
+ if ( tagkey[btag] == "yes" ) {
+ which=tagref[btag];
+ put_href3();
+ done="yes";
+ }
+}
+
+function put_href() {
+ if ( p[i] == "" ) { return; }
+ if ( which == FILENAME ) {
+ printf("|<A HREF=\"#%s\">%s</A>|",p[i],p[i]);
+ }
+ else {
+ nz=split(which,zz,".");
+ if ( zz[2] == "txt" || zz[1] == "tags" ) {
+ printf("|<A HREF=\"%s.html#%s\">%s</A>|",zz[1],p[i],p[i]);
+ }
+ else {
+ printf("|<A HREF=\"intro.html#%s\">%s</A>|",p[i],p[i]);
+ }
+ }
+}
+
+function put_href2() {
+ if ( atag == "" ) { return; }
+ if ( which == FILENAME ) {
+ printf("<A HREF=\"#%s\">%s</A>",atag,atag);
+ }
+ else {
+ nz=split(which,zz,".");
+ if ( zz[2] == "txt" || zz[1] == "tags" ) {
+ printf("<A HREF=\"%s.html#%s\">%s</A>",zz[1],atag,atag);
+ }
+ else {
+ printf("<A HREF=\"intro.html#%s\">%s</A>",atag,atag);
+ }
+ }
+}
+
+function put_href3() {
+ if ( btag == "" ) { return; }
+ if ( which == FILENAME ) {
+ printf("<A HREF=\"#%s\">%s</A>",btag,btag2);
+ }
+ else {
+ nz=split(which,zz,".");
+ if ( zz[2] == "txt" || zz[1] == "tags" ) {
+ printf("<A HREF=\"%s.html#%s\">%s</A>",zz[1],btag,btag2);
+ }
+ else {
+ printf("<A HREF=\"intro.html#%s\">%s</A>",btag,btag2);
+ }
+ }
+}
+
+function put_this() {
+ ntab=split(this,ta," ");
+ for ( nta=1 ; nta <= ntab ; nta++ ) {
+ ata=ta[nta];
+ lata=length(ata);
+ aword="";
+ for ( iata=1 ; iata <=lata ; iata++ ) {
+ achar=substr(ata,iata,1);
+ if ( achar != " " ) { aword=aword""achar; }
+ else {
+ if ( aword != "" ) { atag=aword;
+ see_tag();
+ aword="";
+ printf(" "); }
+ else {
+ printf(" ");
+ }
+ }
+ }
+ if ( aword != "" ) { atag=aword;
+ see_tag();
+ }
+ if ( nta != ntab ) { printf(" "); }
+ }
+}
+
+function if_already() {
+ already="no";
+ if ( npipe < 2 ) { return; }
+ if ( atag == ":au" && p[2] == ":autocmd" ) { already="yes";return; }
+ for ( npp=2 ; npp <= npipe ; npp=npp+2 ) {
+ if ( ( (index(p[npp],atag)) != 0 \
+ && length(p[npp]) > length(atag) \
+ && length(atag) >= 1 \
+ ) \
+ || (p[npp] == atag) \
+ ) {
+ # printf("p=|%s|,tag=|%s| ",p[npp],atag);
+ already="yes"; return; }
+ }
+}
+
+function see_opt() {
+ done_opt="no";
+ stag=atag;
+ nfields = split(atag,tae,"=");
+ if ( nfields > 1 ) {
+ btag="'"tae[1]"'";
+ btag2=tae[1];
+ find_tag3();
+ if (done == "yes") {
+ for ( ntae=2 ; ntae <= nfields ; ntae++ ) {
+ printf("=%s",tae[ntae]);
+ }
+ atag=stag;
+ done_opt="yes";
+ return;
+ }
+ btag=tae[1];
+ btag2=tae[1];
+ find_tag3();
+ if ( done=="yes" ) {
+ for ( ntae=2 ; ntae <= nfields ; ntae++ ) {
+ printf("=%s",tae[ntae]);
+ }
+ atag=stag;
+ done_opt="yes";
+ return;
+ }
+ }
+ nfields = split(atag,tae,"&quot;");
+ if ( nfields > 1 ) {
+ btag="'"tae[1]"'";
+ btag2=tae[1];
+ find_tag3();
+ if (done == "yes") {
+ printf("&quot;");
+ atag=stag;
+ done_opt="yes";
+ return;
+ }
+ btag=tae[1];
+ btag2=tae[1];
+ find_tag3();
+ if (done == "yes") {
+ printf("&quot;");
+ atag=stag;
+ done_opt="yes";
+ return;
+ }
+ }
+ btag="'"tae[1]"'";
+ btag2=tae[1];
+ find_tag3();
+ if (done == "yes") {
+ atag=stag;
+ done_opt="yes";
+ return;
+ }
+ btag=tae[1];
+ btag2=tae[1];
+ find_tag3();
+ if (done == "yes") {
+ atag=stag;
+ done_opt="yes";
+ return;
+ }
+ atag=stag;
+}
diff --git a/runtime/doc/maketags.awk b/runtime/doc/maketags.awk
new file mode 100644
index 0000000..c6b2cd9
--- /dev/null
+++ b/runtime/doc/maketags.awk
@@ -0,0 +1,42 @@
+BEGIN { FS=" "; }
+
+NR == 1 { nf=split(FILENAME,f,".")
+ print "<HTML>";
+ print "<HEAD><TITLE>" f[1] "</TITLE></HEAD>";
+ print "<BODY BGCOLOR=\"#ffffff\">";
+ print "<H1>Vim Documentation: " f[1] "</H1>";
+ print "<A NAME=\"top\"></A>";
+ print "<HR>";
+ print "<PRE>";
+}
+
+{
+ #
+ # protect special chars
+ #
+ gsub(/&/,"\\&amp;");
+ gsub(/>/,"\\&gt;");
+ gsub(/</,"\\&lt;");
+ gsub(/"/,"\\&quot;");
+ gsub(/%/,"\\&#37;");
+
+ nf=split($0,tag," ");
+ tagkey[t]=tag[1];tagref[t]=tag[2];tagnum[t]=NR;
+ print $1 " " $2 " line " NR >"tags.ref"
+ n=split($2,w,".");
+ printf ("|<A HREF=\"%s.html#%s\">%s</A>| %s\n",w[1],$1,$1,$2);
+}
+
+END {
+ topback();
+ print "</PRE>\n</BODY>\n\n\n</HTML>";
+ }
+
+#
+# as main we keep index.txt (by default)
+# other candidate, help.txt
+#
+function topback () {
+ printf("<A HREF=\"#top\">top</A> - ");
+ printf("<A HREF=\"help.html\">back to help</A>\n");
+}
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
new file mode 100644
index 0000000..905f9ad
--- /dev/null
+++ b/runtime/doc/map.txt
@@ -0,0 +1,1928 @@
+*map.txt* For Vim version 9.0. Last change: 2023 Feb 27
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Key mapping, abbreviations and user-defined commands.
+
+This subject is introduced in sections |05.4|, |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 meta-keys |:map-meta-keys|
+ 1.12 Mapping in modifyOtherKeys mode |modifyOtherKeys|
+ 1.13 Mapping with Kitty keyboard protocol |kitty-keyboard-protocol|
+ 1.14 Mapping an operator |:map-operator|
+2. Abbreviations |abbreviations|
+3. Local mappings and functions |script-local|
+4. User-defined commands |user-commands|
+
+==============================================================================
+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 of commands for a function key. Example: >
+
+ :map <F2> a<C-R>=strftime("%c")<CR><Esc>
+
+This appends the current date and time after the cursor (in <> notation |<>|).
+
+
+1.1 MAP COMMANDS *:map-commands*
+
+There are commands to enter new mappings, remove mappings and list mappings.
+See |map-overview| for the various forms of "map" and their relationships with
+modes.
+
+{lhs} means left-hand-side *{lhs}*
+{rhs} means right-hand-side *{rhs}*
+
+:map {lhs} {rhs} |mapmode-nvo| *:map*
+:nm[ap] {lhs} {rhs} |mapmode-n| *:nm* *:nmap*
+:vm[ap] {lhs} {rhs} |mapmode-v| *:vm* *:vmap*
+:xm[ap] {lhs} {rhs} |mapmode-x| *:xm* *:xmap*
+:smap {lhs} {rhs} |mapmode-s| *:smap*
+:om[ap] {lhs} {rhs} |mapmode-o| *:om* *:omap*
+:map! {lhs} {rhs} |mapmode-ic| *:map!*
+:im[ap] {lhs} {rhs} |mapmode-i| *:im* *:imap*
+:lm[ap] {lhs} {rhs} |mapmode-l| *:lm* *:lma* *: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
+ allows for nested and recursive use of mappings.
+ Note: Trailing spaces are included in the {rhs},
+ because space is a valid Normal mode command.
+ See |map-trailing-white|.
+
+ *:nore* *:norem*
+:no[remap] {lhs} {rhs} |mapmode-nvo| *:no* *:noremap* *:nor*
+:nn[oremap] {lhs} {rhs} |mapmode-n| *:nn* *:nnoremap*
+:vn[oremap] {lhs} {rhs} |mapmode-v| *:vn* *:vnoremap*
+:xn[oremap] {lhs} {rhs} |mapmode-x| *:xn* *:xnoremap*
+:snor[emap] {lhs} {rhs} |mapmode-s| *:snor* *:snore* *:snoremap*
+:ono[remap] {lhs} {rhs} |mapmode-o| *:ono* *:onoremap*
+:no[remap]! {lhs} {rhs} |mapmode-ic| *:no!* *:noremap!*
+:ino[remap] {lhs} {rhs} |mapmode-i| *:ino* *:inor* *:inoremap*
+:ln[oremap] {lhs} {rhs} |mapmode-l| *:ln* *:lnoremap*
+:cno[remap] {lhs} {rhs} |mapmode-c| *:cno* *:cnor* *: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
+ used to redefine a command.
+ Note: When <Plug> appears in the {rhs} this part is
+ always applied even if remapping is disallowed.
+
+
+:unm[ap] {lhs} |mapmode-nvo| *:unm* *:unmap*
+:nun[map] {lhs} |mapmode-n| *:nun* *:nunmap*
+:vu[nmap] {lhs} |mapmode-v| *:vu* *:vunmap*
+:xu[nmap] {lhs} |mapmode-x| *:xu* *:xunmap*
+:sunm[ap] {lhs} |mapmode-s| *:sunm* *:sunmap*
+:ou[nmap] {lhs} |mapmode-o| *:ou* *:ounmap*
+:unm[ap]! {lhs} |mapmode-ic| *:unm!* *:unmap!*
+:iu[nmap] {lhs} |mapmode-i| *:iu* *:iunmap*
+:lu[nmap] {lhs} |mapmode-l| *:lu* *:lunmap*
+:cu[nmap] {lhs} |mapmode-c| *:cu* *:cun* *: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.
+ It also works when {lhs} matches the {rhs} of a
+ mapping. This is for when an abbreviation applied.
+ Note: Trailing spaces are included in the {lhs}.
+ See |map-trailing-white|.
+
+:mapc[lear] |mapmode-nvo| *:mapc* *:mapclear*
+:nmapc[lear] |mapmode-n| *:nmapc* *:nmapclear*
+:vmapc[lear] |mapmode-v| *:vmapc* *:vmapclear*
+:xmapc[lear] |mapmode-x| *:xmapc* *:xmapclear*
+:smapc[lear] |mapmode-s| *:smapc* *:smapclear*
+:omapc[lear] |mapmode-o| *:omapc* *:omapclear*
+:mapc[lear]! |mapmode-ic| *:mapc!* *:mapclear!*
+: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
+ mappings |:map-<buffer>|
+ Warning: This also removes the |mac-standard-mappings|
+ and the |dos-standard-mappings|.
+
+:map |mapmode-nvo|
+:nm[ap] |mapmode-n|
+:vm[ap] |mapmode-v|
+:xm[ap] |mapmode-x|
+:sm[ap] |mapmode-s|
+:om[ap] |mapmode-o|
+:map! |mapmode-ic|
+: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.
+
+:map {lhs} |mapmode-nvo| *:map_l*
+:nm[ap] {lhs} |mapmode-n| *:nmap_l*
+:vm[ap] {lhs} |mapmode-v| *:vmap_l*
+:xm[ap] {lhs} |mapmode-x| *:xmap_l*
+:sm[ap] {lhs} |mapmode-s| *:smap_l*
+:om[ap] {lhs} |mapmode-o| *:omap_l*
+:map! {lhs} |mapmode-ic| *:map_l!*
+: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.
+
+These commands are used to map a key or key sequence to a string of
+characters. You can use this to put command sequences under function keys,
+translate one key into another, etc. See |:mkexrc| for how to save and
+restore the current mappings.
+
+ *map-ambiguous*
+When two mappings start with the same sequence of characters, they are
+ambiguous. Example: >
+ :imap aa foo
+ :imap aaa bar
+When Vim has read "aa", it will need to get another character to be able to
+decide if "aa" or "aaa" should be mapped. This means that after typing "aa"
+that mapping won't get expanded yet, Vim is waiting for another character.
+If you type a space, then "foo" will get inserted, plus the space. If you
+type "a", then "bar" will get inserted.
+
+Trailing white space ~
+ *map-trailing-white*
+This unmap command does NOT work: >
+ :map @@ foo
+ :unmap @@ | print
+
+Because it tries to unmap "@@ ", including the white space before the command
+separator "|". Other examples with trailing white space: >
+ unmap @@
+ unmap @@ # Vim9 script comment
+ unmap @@ " legacy script comment
+
+An error will be issued, which is very hard to identify, because the ending
+whitespace character in `unmap @@ ` is not visible.
+
+A generic solution is to put the command separator "|" right after the mapped
+keys. After that white space and a comment may follow: >
+
+ unmap @@| # Vim9 script comment
+ unmap @@| " legacy script comment
+
+
+1.2 SPECIAL ARGUMENTS *:map-arguments*
+
+"<buffer>", "<nowait>", "<silent>", "<special>", "<script>", "<expr>" and
+"<unique>" can be used in any order. They must appear right after the
+command, before any other arguments.
+
+ *:map-local* *:map-<buffer>* *:map-buffer*
+ *E224* *E225*
+If the first argument to one of these commands is "<buffer>" the mapping will
+be effective in the current buffer only. Example: >
+ :map <buffer> ,w /[.,;]<CR>
+Then you can map ",w" to something else in another buffer: >
+ :map <buffer> ,w /[#&!]<CR>
+The local buffer mappings are used before the global ones. See <nowait> below
+to make a short local mapping not taking effect when a longer global one
+exists.
+The "<buffer>" argument can also be used to clear mappings: >
+ :unmap <buffer> ,w
+ :mapclear <buffer>
+Local mappings are also cleared when a buffer is deleted, but not when it is
+unloaded. Just like local option values.
+Also see |map-precedence|.
+
+ *:map-<nowait>* *:map-nowait*
+When defining a buffer-local mapping for "," there may be a global mapping
+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 typed they are used.
+Note that this works when the <nowait> mapping fully matches and is found
+before any partial matches. This works when:
+- There is only one matching buffer-local mapping, since these are always
+ found before global mappings.
+- There is another buffer-local mapping that partly matches, but it is
+ defined earlier (last defined mapping is found first).
+
+ *:map-<silent>* *:map-silent*
+To define a mapping which will not be echoed on the command line, add
+"<silent>" as the first argument. Example: >
+ :map <silent> ,h /Header<CR>
+The search string will not be echoed when using this mapping. Messages from
+the executed command are still given though. To shut them up too, add a
+":silent" in the executed command: >
+ :map <silent> ,h :exe ":silent normal /Header\r"<CR>
+Note that the effect of a command might also be silenced, e.g., when the
+mapping selects another entry for command line completion it won't be
+displayed.
+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
+in the {rhs} using mappings that were defined local to a script, starting with
+"<SID>". This can be used to avoid that mappings from outside a script
+interfere (e.g., when CTRL-V is remapped in mswin.vim), but do use other
+mappings defined in the script.
+Note: ":map <script>" and ":noremap <script>" do the same thing. The
+"<script>" overrules the command name. Using ":noremap <script>" is
+preferred, because it's clearer that remapping is (mostly) disabled.
+
+ *:map-<unique>* *:map-unique* *E226* *E227*
+If the first argument to one of these commands is "<unique>" and it is used to
+define a new mapping or abbreviation, the command will fail if the mapping or
+abbreviation already exists. Example: >
+ :map <unique> ,w /[#&!]<CR>
+When defining a local mapping, there will also be a check if a global map
+already exists which is equal.
+Example of what will fail: >
+ :map ,w /[#&!]<CR>
+ :map <buffer> <unique> ,w /[.,;]<CR>
+If you want to map a key and then have it do what it was originally mapped to,
+have a look at |maparg()|.
+
+ *:map-<expr>* *:map-expression*
+If the first argument to one of these commands is "<expr>" and it is used to
+define a new mapping or abbreviation, the argument is an expression. The
+expression is evaluated to obtain the {rhs} that is used. Example: >
+ :inoremap <expr> . <SID>InsertDot()
+The result of the s:InsertDot() function will be inserted. It could check the
+text before the cursor and start omni completion when some condition is met.
+Using a script-local function is preferred, to avoid polluting the global
+namespace. Use <SID> in the RHS so that the script that the mapping was
+defined in can be found.
+
+For abbreviations |v:char| is set to the character that was typed to trigger
+the abbreviation. You can use this to decide how to expand the {lhs}. You
+should not either insert or change the v:char.
+
+In case you want the mapping to not do anything, you can have the expression
+evaluate to an empty string. If something changed that requires Vim to
+go through the main loop (e.g. to update the display), return "\<Ignore>".
+This is similar to "nothing" but makes Vim return from the loop that waits for
+input. Example: >
+ func s:OpenPopup()
+ call popup_create(... arguments ...)
+ return "\<Ignore>"
+ endfunc
+ nnoremap <expr> <F3> <SID>OpenPopup()
+
+Keep in mind that the expression may be evaluated when looking for
+typeahead, before the previous command has been executed. For example: >
+ func StoreColumn()
+ let g:column = col('.')
+ return 'x'
+ endfunc
+ nnoremap <expr> x StoreColumn()
+ nmap ! f!x
+You will notice that g:column has the value from before executing "f!",
+because "x" is evaluated before "f!" is executed.
+This can be solved by inserting <Ignore> before the character that is
+expression-mapped: >
+ nmap ! f!<Ignore>x
+
+When defining a mapping in a |Vim9| script, the expression will be evaluated
+in the context of that script. This means that script-local items can be
+accessed in the expression.
+
+Be very careful about side effects! The expression is evaluated while
+obtaining characters, you may very well make the command dysfunctional.
+For this reason the following is blocked:
+- Changing the buffer text |textlock|.
+- Editing another buffer.
+- The |:normal| command.
+- Moving the cursor is allowed, but it is restored afterwards.
+If you want the mapping to do any of these let the returned characters do
+that, or use a |<Cmd>| mapping instead.
+
+You can use getchar(), it consumes typeahead if there is any. E.g., if you
+have these mappings: >
+ inoremap <expr> <C-L> nr2char(getchar())
+ inoremap <expr> <C-L>x "foo"
+If you now type CTRL-L nothing happens yet, Vim needs the next character to
+decide what mapping to use. If you type 'x' the second mapping is used and
+"foo" is inserted. If you type any other key the first mapping is used,
+getchar() gets the typed key and returns it.
+
+Here is an example that inserts a list number that increases: >
+ 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
+
+CTRL-L inserts the next number, CTRL-R resets the count. CTRL-R returns an
+empty string, so that nothing is inserted.
+
+Note that using 0x80 as a single byte before other text does not work, it will
+be seen as a special key.
+
+ *<Cmd>* *:map-cmd*
+The special text <Cmd> begins a "command mapping", it executes the command
+directly without changing modes. Where you might use ":...<CR>" in the
+{rhs} 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 Command-line mode (which would otherwise require timer hacks).
+Example of using <Cmd> halfway Insert mode: >
+ nnoremap <F3> aText <Cmd>echo mode(1)<CR> Added<Esc>
+
+Unlike <expr> mappings, there are no special restrictions on the <Cmd>
+command: it is executed as if an (unrestricted) |autocommand| was invoked.
+
+ *<ScriptCmd>*
+<ScriptCmd> is like <Cmd> but sets the context to the script the mapping was
+defined in, for the duration of the command execution. This is especially
+useful for |Vim9| script. It also works to access an import, which is useful
+in a plugin using a, possibly autoloaded, script: >
+ vim9script
+ import autoload 'implementation.vim' as impl
+ nnoremap <F4> <ScriptCmd>impl.DoTheWork()<CR>
+<
+No matter where <F4> is typed, the "impl" import will be found in the script
+context of where the mapping was defined. When it's an autoload import, as in
+the example, the "implementation.vim" script will only be loaded once <F4> is
+typed, not when the mapping is defined.
+
+Without <ScriptCmd> using "s:impl" would result in "E121: Undefined variable".
+
+Note:
+- Because <Cmd> and <ScriptCmd> avoid mode-changes it does not trigger
+ |CmdlineEnter| and |CmdlineLeave| events, because no user interaction is
+ expected.
+- For the same reason, |keycodes| like <C-R><C-W> are interpreted as plain,
+ unmapped keys.
+- The command is not echo'ed, no need for <silent>.
+- The {rhs} is not subject to abbreviations nor to other mappings, even if the
+ mapping is recursive.
+- In Visual mode you can use `line('v')` and `col('v')` to get one end of the
+ Visual area, the cursor is at the other end.
+
+ *E1255* *E1136*
+<Cmd> and <ScriptCmd> commands must terminate, that is, they must be followed
+by <CR> in the {rhs} of the mapping definition. |Command-line| mode is never
+entered.
+
+ *E1137*
+<Cmd> and <ScriptCmd> commands can have only normal characters and cannot
+contain special characters like function keys.
+
+
+1.3 MAPPING AND MODES *:map-modes*
+ *mapmode-nvo* *mapmode-n* *mapmode-v* *mapmode-o*
+
+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.
+- For Operator-pending mode: When an operator is pending (after "d", "y", "c",
+ 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
+to type a count with a zero.
+
+ *map-overview* *map-modes*
+Overview of which map command works in which mode. More details below.
+ COMMANDS MODES ~
+:map :noremap :unmap Normal, Visual, Select, Operator-pending
+:nmap :nnoremap :nunmap Normal
+:vmap :vnoremap :vunmap Visual and Select
+:smap :snoremap :sunmap Select
+:xmap :xnoremap :xunmap Visual
+:omap :onoremap :ounmap Operator-pending
+:map! :noremap! :unmap! Insert and Command-line
+:imap :inoremap :iunmap Insert
+:lmap :lnoremap :lunmap Insert, Command-line, Lang-Arg
+:cmap :cnoremap :cunmap Command-line
+:tmap :tnoremap :tunmap Terminal-Job
+
+Same information in a table:
+ *map-table*
+ Mode | Norm | Ins | Cmd | Vis | Sel | Opr | Term | Lang | ~
+Command +------+-----+-----+-----+-----+-----+------+------+ ~
+[nore]map | yes | - | - | yes | yes | yes | - | - |
+n[nore]map | yes | - | - | - | - | - | - | - |
+[nore]map! | - | yes | yes | - | - | - | - | - |
+i[nore]map | - | yes | - | - | - | - | - | - |
+c[nore]map | - | - | yes | - | - | - | - | - |
+v[nore]map | - | - | - | yes | yes | - | - | - |
+x[nore]map | - | - | - | yes | - | - | - | - |
+s[nore]map | - | - | - | - | yes | - | - | - |
+o[nore]map | - | - | - | - | - | yes | - | - |
+t[nore]map | - | - | - | - | - | - | yes | - |
+l[nore]map | - | yes | yes | - | - | - | - | yes |
+
+
+ COMMANDS MODES ~
+ Normal Visual+Select Operator-pending ~
+:map :noremap :unmap :mapclear yes yes yes
+:nmap :nnoremap :nunmap :nmapclear yes - -
+:vmap :vnoremap :vunmap :vmapclear - yes -
+:omap :onoremap :ounmap :omapclear - - yes
+
+:nunmap can also be used outside of a monastery.
+ *mapmode-x* *mapmode-s*
+Some commands work both in Visual and Select mode, some in only one. Note
+that quite often "Visual" is mentioned where both Visual and Select mode
+apply. |Select-mode-mapping|
+NOTE: Mapping a printable character in Select mode may confuse the user. It's
+better to explicitly use :xmap and :smap for printable characters. Or use
+:sunmap after defining the mapping.
+
+ COMMANDS MODES ~
+ Visual Select ~
+:vmap :vnoremap :vunmap :vmapclear yes yes
+:xmap :xnoremap :xunmap :xmapclear yes -
+:smap :snoremap :sunmap :smapclear - yes
+
+ *mapmode-ic* *mapmode-i* *mapmode-c* *mapmode-l*
+Some commands work both in Insert mode and Command-line mode, some not:
+
+ COMMANDS MODES ~
+ Insert Command-line Lang-Arg ~
+:map! :noremap! :unmap! :mapclear! yes yes -
+:imap :inoremap :iunmap :imapclear yes - -
+:cmap :cnoremap :cunmap :cmapclear - yes -
+:lmap :lnoremap :lunmap :lmapclear yes* yes* yes*
+
+* If 'iminsert' is 1, see |language-mapping| below.
+
+The original Vi did not have separate mappings for
+Normal/Visual/Operator-pending mode and for Insert/Command-line mode.
+Therefore the ":map" and ":map!" commands enter and display mappings for
+several modes. In Vim you can use the ":nmap", ":vmap", ":omap", ":cmap" and
+":imap" commands to enter mappings for each mode separately.
+
+ *mapmode-t*
+The terminal mappings are used in a terminal window, when typing keys for the
+job running in the terminal. See |terminal-typing|.
+
+ *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".
+
+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
+that operates on a function name in the current line: >
+ onoremap <silent> F :<C-U>normal! 0f(hviw<CR>
+The CTRL-U (<C-U>) is used to remove the range that Vim may insert. The
+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: >
+ :map xx something-difficult
+ :ounmap xx
+
+Likewise for a mapping for Visual and Operator-pending mode or Normal and
+Operator-pending mode.
+
+ *language-mapping*
+":lmap" defines a mapping that applies to:
+- Insert mode
+- Command-line mode
+- when entering a search pattern
+- the argument of the commands that accept a text character, such as "r" and
+ "f"
+- for the input() line
+Generally: Whenever a character is to be typed that is part of the text in the
+buffer, not a Vim command character. "Lang-Arg" isn't really another mode,
+it's just used here for this situation.
+ The simplest way to load a set of related language mappings is by using the
+'keymap' option. See |45.5|.
+ In Insert mode and in Command-line mode the mappings can be disabled with
+the CTRL-^ command |i_CTRL-^| |c_CTRL-^|. These commands change the value of
+the 'iminsert' option. When starting to enter a normal command line (not a
+search pattern) the mappings are disabled until a CTRL-^ is typed. The state
+last used is remembered for Insert mode and Search patterns separately. The
+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.
+
+
+1.4 LISTING MAPPINGS *map-listing*
+
+When listing mappings the characters in the first two columns are:
+
+ CHAR MODE ~
+ <Space> Normal, Visual, Select and Operator-pending
+ n Normal
+ v Visual and Select
+ s Select
+ x Visual
+ o Operator-pending
+ ! Insert and Command-line
+ i Insert
+ l ":lmap" mappings for Insert, Command-line and Lang-Arg
+ c Command-line
+ t Terminal-Job
+
+Just before the {rhs} a special character can appear:
+ * indicates that it is not remappable
+ & indicates that only script-local mappings are remappable
+ @ indicates a buffer-local mapping
+
+Everything from the first non-blank after {lhs} up to the end of the line
+(or '|') is considered to be part of {rhs}. This allows the {rhs} to end
+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.
+
+While mappings are being listed, it is not possible to add or clear mappings,
+e.g. from a timer callback. *E1309*
+
+ *:map-verbose*
+When 'verbose' is non-zero, listing a key map will also display where it was
+last defined. Example: >
+
+ :verbose map <C-W>*
+ n <C-W>* * <C-W><C-S>*
+ Last set from /home/abcd/.vimrc
+
+See |:verbose-cmd| for more information.
+
+
+1.5 MAPPING SPECIAL KEYS *:map-special-keys*
+
+There are three 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').
+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).
+
+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.
+
+
+1.6 SPECIAL CHARACTERS *:map-special-chars*
+ *map_backslash* *map-backslash*
+Note that only CTRL-V is mentioned here as a special character for mappings
+and abbreviations. When 'cpoptions' does not contain 'B', a backslash can
+also be used like CTRL-V. The <> notation can be fully used then |<>|. But
+you cannot use "<C-V>" like CTRL-V to escape the special meaning of what
+follows.
+
+To map a backslash, or use a backslash literally in the {rhs}, the special
+sequence "<Bslash>" can be used. This avoids the need to double backslashes
+when using nested mappings.
+
+ *map_CTRL-C* *map-CTRL-C*
+Using CTRL-C in the {lhs} is possible, but it will only work when Vim is
+waiting for a key, not when Vim is busy with something. When Vim is busy
+CTRL-C interrupts/breaks the command.
+When using the GUI version on MS-Windows CTRL-C can be mapped to allow a Copy
+command to the clipboard. Use CTRL-Break to interrupt Vim.
+
+ *map_space_in_lhs* *map-space_in_lhs*
+To include a space in {lhs} precede it with a CTRL-V (type two CTRL-Vs for
+each space).
+ *map_space_in_rhs* *map-space_in_rhs*
+If you want a {rhs} that starts with a space, use "<Space>". To be fully Vi
+compatible (but unreadable) don't use the |<>| notation, precede {rhs} with a
+single CTRL-V (you have to type CTRL-V two times).
+ *map_empty_rhs* *map-empty-rhs*
+You can create an empty {rhs} by typing nothing after a single CTRL-V (you
+have to type CTRL-V two times). Unfortunately, you cannot do this in a vimrc
+file.
+ *<Nop>*
+An easier way to get a mapping that doesn't produce anything, is to use
+"<Nop>" for the {rhs}. This only works when the |<>| notation is enabled.
+For example, to make sure that function key 8 does nothing at all: >
+ :map <F8> <Nop>
+ :map! <F8> <Nop>
+<
+ *map-multibyte*
+It is possible to map multibyte characters, but only the whole character. You
+cannot map the first byte only. This was done to prevent problems in this
+scenario: >
+ :set encoding=latin1
+ :imap <M-C> foo
+ :set encoding=utf-8
+The mapping for <M-C> is defined with the latin1 encoding, resulting in a 0xc3
+byte. If you type the character á (0xe1 <M-a>) in UTF-8 encoding this is the
+two bytes 0xc3 0xa1. You don't want the 0xc3 byte to be mapped then or
+otherwise it would be impossible to type the á character.
+
+ *<Leader>* *mapleader*
+To define a mapping which uses the "g:mapleader" variable, the special string
+"<Leader>" can be used. It is replaced with the string value of
+"g:mapleader". If "g:mapleader" is not set or empty, a backslash is used
+instead. Example: >
+ map <Leader>A oanother line<Esc>
+Works like: >
+ map \A oanother line<Esc>
+But after (legacy script): >
+ let mapleader = ","
+Or (Vim9 script): >
+ g:mapleader = ","
+It works like: >
+ map ,A oanother line<Esc>
+
+Note that the value of "g:mapleader" is used at the moment the mapping is
+defined. Changing "g:mapleader" after that has no effect for already defined
+mappings.
+
+ *<LocalLeader>* *maplocalleader*
+<LocalLeader> is just like <Leader>, except that it uses "maplocalleader"
+instead of "mapleader". <LocalLeader> is to be used for mappings which are
+local to a buffer. Example: >
+ :map <buffer> <LocalLeader>A oanother line<Esc>
+<
+In a global plugin <Leader> should be used and in a filetype plugin
+<LocalLeader>. "mapleader" and "maplocalleader" can be equal. Although, if
+you make them different, there is a smaller chance of mappings from global
+plugins to clash with mappings for filetype plugins. For example, you could
+keep "mapleader" at the default backslash, and set "maplocalleader" to an
+underscore.
+
+ *map-<SID>*
+In a script the special key name "<SID>" can be used to define a mapping
+that's local to the script. See |<SID>| for details.
+
+ *<Plug>*
+The special key name "<Plug>" can be used for an internal mapping, which is
+not to be matched with any key sequence. This is useful in plugins
+|using-<Plug>|.
+
+ *<MouseMove>*
+The special key name "<MouseMove>" can be used to handle mouse movement. It
+needs to be enabled with 'mousemoveevent'. Currently only works in the GUI.
+The |getmousepos()| function can be used to obtain the mouse position.
+
+ *<Char>* *<Char->*
+To map a character by its decimal, octal or hexadecimal number the <Char>
+construct can be used:
+ <Char-123> character 123
+ <Char-033> character 27
+ <Char-0x7f> character 127
+ <S-Char-114> character 114 ('r') shifted ('R')
+This is useful to specify a (multibyte) character in a 'keymap' file.
+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}. 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
+ \| 'b' is not in 'cpoptions' :map _l :!ls \| more^M
+ ^V| always, in Vim and Vi :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).
+
+All three work when you use the default setting for 'cpoptions'.
+
+When 'b' is present in 'cpoptions', "\|" will be recognized as a mapping
+ending in a '\' and then another command. This is Vi compatible, but
+illogical when compared to other commands.
+
+ *map_return* *map-return*
+When you have a mapping that contains an Ex command, you need to put a line
+terminator after it to have it executed. The use of <CR> is recommended for
+this (see |<>|). Example: >
+ :map _ls :!ls -l %:S<CR>:echo "the end"<CR>
+
+To avoid mapping of the characters you type in insert or Command-line mode,
+type a CTRL-V first. The mapping in Insert mode is disabled if the 'paste'
+option is on.
+ *map-error*
+Note that when an error is encountered (that causes an error message or might
+cause a beep) the rest of the mapping is not executed. This is Vi-compatible.
+
+Note that the second character (argument) of the commands @zZtTfF[]rm'`"v
+and CTRL-X is not mapped. This was done to be able to use all the named
+registers and marks, even when the command with the same name has been
+mapped.
+
+
+1.7 WHAT KEYS TO MAP *map-which-keys*
+
+If you are going to map something, you will need to choose which key(s) to use
+for the {lhs}. You will have to avoid keys that are used for Vim commands,
+otherwise you would not be able to use those commands anymore. Here are a few
+suggestions:
+- Function keys <F2>, <F3>, etc.. Also the shifted function keys <S-F1>,
+ <S-F2>, etc. Note that <F1> is already used for the help command.
+- Any key with the Alt or Meta key pressed. Depending on your keyboard
+ accented characters may be used as well. |:map-alt-keys|
+- Use the '_' or ',' character and then any other character. The "_" and ","
+ commands do exist in Vim (see |_| and |,|), but you probably never use them.
+- Use a key that is a synonym for another command. For example: CTRL-P and
+ CTRL-N. Use an extra character to allow more mappings.
+- The key defined by <Leader> and one or more other keys. This is especially
+ useful in scripts. |mapleader|
+
+See the file "index" for keys that are not used and thus can be mapped without
+losing any builtin function. You can also use ":help {key}^D" to find out if
+a key is used for some command. ({key} is the specific key you want to find
+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). >
+
+ :map <F3> o#include
+ :map <M-g> /foo<CR>cwbar<Esc>
+ :map _x d/END/e<CR>
+ :map! qq quadrillion questions
+
+
+Multiplying a count
+
+When you type a count before triggering a mapping, it's like the count was
+typed before the {lhs}. For example, with this mapping: >
+ :map <F4> 3w
+Typing 2<F4> will result in "23w". Thus not moving 2 * 3 words but 23 words.
+If you want to multiply counts use the expression register: >
+ :map <F4> @='3w'<CR>
+The part between quotes is the expression being executed. |@=|
+
+
+1.9 USING MAPPINGS *map-typing*
+
+Vim will compare what you type with the start of a mapped sequence. If there
+is an incomplete match, it will get more characters until there either is a
+complete match or until there is no match at all. Example: If you map! "qq",
+the first 'q' will not appear on the screen until you type another
+character. This is because Vim cannot know if the next character will be a
+'q' or not. If the 'timeout' option is on (which is the default) Vim will
+only wait for one second (or as long as specified with the 'timeoutlen'
+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*
+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
+mapping immediately if it was defined with <nowait>, even if a longer mapping
+has the same prefix. For example, given the following two mappings: >
+ :map <buffer> <nowait> \a :echo "Local \a"<CR>
+ :map \abc :echo "Global \abc"<CR>
+When typing \a the buffer-local mapping will be used immediately. Vim will
+not wait for more characters to see if the user might be typing \abc.
+
+ *map-keys-fails*
+There are situations where key codes might not be recognized:
+- Vim can only read part of the key code. Mostly this is only the first
+ character. This happens on some Unix versions in an xterm.
+- The key code is after character(s) that are mapped. E.g., "<F1><F1>" or
+ "g<F1>".
+
+The result is that the key code is not recognized in this situation, and the
+mapping fails. There are two actions needed to avoid this problem:
+
+- Remove the 'K' flag from 'cpoptions'. This will make Vim wait for the rest
+ of the characters of the function key.
+- When using <F1> to <F4> the actual key code generated may correspond to
+ <xF1> to <xF4>. There are mappings from <xF1> to <F1>, <xF2> to <F2>, etc.,
+ but these are not recognized after another half a mapping. Make sure the
+ key codes for <F1> to <F4> are correct: >
+ :set <F1>=<type CTRL-V><type F1>
+< Type the <F1> as four characters. The part after the "=" must be done with
+ the actual keys, not the literal text.
+Another solution is to use the actual key code in the mapping for the second
+special key: >
+ :map <F1><Esc>OP :echo "yes"<CR>
+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
+included in {rhs} is encountered it will be replaced with {rhs}, and so on.
+This makes it possible to repeat a command an infinite number of times. The
+only problem is that the only way to stop this is by causing an error. The
+macros to solve a maze uses this, look there for an example. There is one
+exception: If the {rhs} starts with {lhs}, the first character is not mapped
+again (this is Vi compatible).
+For example: >
+ :map ab abcd
+will execute the "a" command and insert "bcd" in the text. The "ab" in the
+{rhs} will not be mapped again.
+
+If you want to exchange the meaning of two keys you should use the :noremap
+command. For example: >
+ :noremap k j
+ :noremap j k
+This will exchange the cursor up and down commands.
+
+With the normal :map command, when the 'remap' option is on, mapping takes
+place until the text is found not to be a part of a {lhs}. For example, if
+you use: >
+ :map x y
+ :map y x
+Vim will replace x with y, and then y with x, etc. When this has happened
+'maxmapdepth' times (default 1000), Vim will give the error message
+"recursive mapping".
+
+ *:map-undo*
+If you include an undo command inside a mapped sequence, this will bring the
+text back in the state before executing the macro. This is compatible with
+the original Vi, as long as there is only one undo command in the mapped
+sequence (having two undo commands in a mapped sequence did not make sense
+in the original Vi, you would get back the text before the first undo).
+
+
+1.10 MAPPING ALT-KEYS *:map-alt-keys*
+
+For a readable mapping command the <A-k> form can be used. Note that <A-k>
+and <A-K> are different, the latter will use an upper case letter. Actually,
+<A-K> and <A-S-K> are the same. Instead of "A" you can use "M". If you have
+an actual Meta modifier key, please see |:map-meta-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.
+
+If the terminal supports the modifyOtherKeys mode and it has been enabled,
+then Vim can recognize more key combinations, see |modifyOtherKeys| below.
+The Kitty keyboard protocol works in a similar way, see
+|kitty-keyboard-protocol|.
+
+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.
+
+
+1.11 MAPPING META-KEYS *:map-meta-keys*
+
+Mapping keys with the Meta modifier works very similar to using the Alt key.
+What key on your keyboard produces the Meta modifier depends on your keyboard
+and configuration.
+
+Note that mapping <M-a> actually is for using the Alt key. That can be
+confusing! It cannot be changed, it would not be backwards compatible.
+
+For the Meta modifier the "T" character is used. For example, to map Meta-b
+in Insert mode: >
+ :imap <T-b> terrible
+
+
+1.12 MAPPING IN modifyOtherKeys mode *modifyOtherKeys*
+
+Xterm and a few other terminals can be put in a mode where keys with modifiers
+are sent with a special escape code. Vim recognizes these codes and can then
+make a difference between CTRL-H and Backspace, even when Backspace sends the
+character 8. And many more special keys, such as Tab and CTRL-I, which cannot
+be mapped separately otherwise.
+
+For xterm modifyOtherKeys is enabled in the builtin termcap entry. If this is
+not used you can enable modifyOtherKeys with these lines in your vimrc: >
+ let &t_TI = "\<Esc>[>4;2m"
+ let &t_TE = "\<Esc>[>4;m"
+
+This sets modifyOtherKeys to level 2. Note that modifyOtherKeys level 1 does
+not work. Some terminals do not support level 2 and then send key codes that
+Vim will not be able to correctly recognize.
+
+In case the modifyOtherKeys mode causes problems you can disable it: >
+ let &t_TI = ""
+ let &t_TE = ""
+It does not take effect immediately. To have this work without restarting Vim
+execute a shell command, e.g.: `!ls` Or put the lines in your |vimrc|.
+
+When modifyOtherKeys is enabled you can map <C-[> and <C-S-{>: >
+ imap <C-[> [[[
+ imap <C-{> {{{
+Without modifyOtherKeys <C-[> and <C-{> are indistinguishable from Esc.
+Note that <C-{> is used and not <C-S-[> or <C-S-{>. This works on most
+keyboards. Similarly, <C-}> is used instead of <C-S-]> or <C-S-}> and
+<C-|> instead of <C-S-\> or <C-S-|>. Note that '|' has a special meaning in a
+mapping, see |map-bar|.
+
+WARNING: if you map <C-[> you may very well break any key codes that start
+with Esc. Make sure it comes AFTER other mappings.
+
+Starting with xterm version 377 Vim can detect the modifyOtherKeys state by
+requesting it. For this the 't_RK' termcap entry is used. When the response
+is found then Vim will know whether modifyOtherKeys level 2 is enabled, and
+handle mappings accordingly.
+
+Before version 377 Vim automatically detects if the modifyOtherKeys mode was
+enabled when it spots an escape sequence that must have been created by it.
+To see if Vim detected such an escape sequence use `:verbose map`, the first
+line will then show "Seen modifyOtherKeys: true" (possibly translated).
+
+This automatic detection depends on receiving an escape code starting with
+"<1b>[27;". This is the normal way xterm sends these key codes. However, if
+the *formatOtherKeys* resource is set another form is used that is not
+recognized, therefore you must not set formatOtherKeys.
+
+A known side effect is that in Insert mode the raw escape sequence is inserted
+after the CTRL-V key. This can be used to check whether modifyOtherKeys is
+enabled: In Insert mode type CTRL-SHIFT-V CTRL-V, if you get one byte then
+modifyOtherKeys is off, if you get <1b>[27;5;118~ then it is on.
+
+Note that xterm up to version 376 has a bug that makes Shift-Esc send a
+regular Esc code, the Shift modifier is dropped.
+
+When the 'esckeys' option is off, then modifyOtherKeys will be disabled in
+Insert mode to avoid every key with a modifier causing Insert mode to end.
+
+
+1.13 MAPPING WITH KITTY KEYBOARD PROTOCOL *kitty-keyboard-protocol*
+
+If the value of 'term' contains "kitty" then Vim will send out an escape
+sequence to enable the Kitty keyboard protocol. This can be changed with the
+'keyprotocol' option.
+
+Like modifyOtherKeys, this will make it possible to distinguish between more
+keys with modifiers. Also, this protocol sends an escape sequence for the Esc
+key, so that Vim does not need to use a timeout to know whether receiving an
+Esc character means the Esc key was pressed or it's the start of an escape
+sequence.
+
+Vim automatically detects if the Kitty keyboard protocol was enabled when it
+spots the response to the status request (this should be part of the |t_TI|
+termcap entry). To see if Vim detected such an escape sequence use: >
+ :verbose map
+The first line will then show "Kitty keyboard protocol: {value}" (possibly
+translated). The meaning of {value}:
+ Unknown no status received yet
+ Off protocol is not used
+ On protocol is used
+ Disabled protocol was used but expected to have been disabled
+ by 't_TE'
+ Cleared protocol expected to have been disabled by 't_TE',
+ previous state is unknown
+
+
+1.14 MAPPING AN OPERATOR *:map-operator*
+
+An operator is used before a {motion} command. To define your own operator
+you must create a mapping that first sets the 'operatorfunc' option and then
+invoke the |g@| operator. After the user types the {motion} command the
+specified function will be called.
+
+ *g@* *E774* *E775*
+g@{motion} Call the function set by the 'operatorfunc' option.
+ The '[ mark is positioned at the start of the text
+ moved over by {motion}, the '] mark on the last
+ character of the text.
+ The function is called with one String argument:
+ "line" {motion} was |linewise|
+ "char" {motion} was |characterwise|
+ "block" {motion} was |blockwise-visual|
+ The type can be forced, see |forced-motion|.
+ {not available when compiled without the |+eval|
+ feature}
+
+Here is an example that counts the number of spaces with <F4>: >
+
+ nnoremap <expr> <F4> CountSpaces()
+ xnoremap <expr> <F4> CountSpaces()
+ " doubling <F4> works on a line
+ nnoremap <expr> <F4><F4> CountSpaces() .. '_'
+
+ function CountSpaces(context = {}, type = '') abort
+ if a:type == ''
+ let context = #{
+ \ dot_command: v:false,
+ \ extend_block: '',
+ \ virtualedit: [&l:virtualedit, &g:virtualedit],
+ \ }
+ let &operatorfunc = function('CountSpaces', [context])
+ set virtualedit=block
+ return 'g@'
+ endif
+
+ let save = #{
+ \ clipboard: &clipboard,
+ \ selection: &selection,
+ \ virtualedit: [&l:virtualedit, &g:virtualedit],
+ \ register: getreginfo('"'),
+ \ visual_marks: [getpos("'<"), getpos("'>")],
+ \ }
+
+ try
+ set clipboard= selection=inclusive virtualedit=
+ let commands = #{
+ \ line: "'[V']",
+ \ char: "`[v`]",
+ \ block: "`[\<C-V>`]",
+ \ }[a:type]
+ let [_, _, col, off] = getpos("']")
+ if off != 0
+ let vcol = getline("'[")->strpart(0, col + off)->strdisplaywidth()
+ if vcol >= [line("'["), '$']->virtcol() - 1
+ let a:context.extend_block = '$'
+ else
+ let a:context.extend_block = vcol .. '|'
+ endif
+ endif
+ if a:context.extend_block != ''
+ let commands ..= 'oO' .. a:context.extend_block
+ endif
+ let commands ..= 'y'
+ execute 'silent noautocmd keepjumps normal! ' .. commands
+ echomsg getreg('"')->count(' ')
+ finally
+ call setreg('"', save.register)
+ call setpos("'<", save.visual_marks[0])
+ call setpos("'>", save.visual_marks[1])
+ let &clipboard = save.clipboard
+ let &selection = save.selection
+ let [&l:virtualedit, &g:virtualedit] = get(a:context.dot_command ? save : a:context, 'virtualedit')
+ let a:context.dot_command = v:true
+ endtry
+ endfunction
+
+An <expr> mapping is used to be able to fetch any prefixed count and register.
+This also avoids using a command line, which would trigger CmdlineEnter and
+CmdlineLeave autocommands.
+
+Note that the 'selection' option is temporarily set to "inclusive" to be able
+to yank exactly the right text by using Visual mode from the '[ to the ']
+mark.
+
+Also note that the 'clipboard' option is temporarily emptied to avoid
+clobbering the `"*` or `"+` registers, if its value contains the item `unnamed`
+or `unnamedplus`.
+
+The `mode()` function will return the state as it will be after applying the
+operator.
+
+Here is an example for using a lambda function to create a normal-mode
+operator to add quotes around text in the current line: >
+
+ nnoremap <F4> <Cmd>let &opfunc='{t ->
+ \ getline(".")
+ \ ->split("\\zs")
+ \ ->insert("\"", col("'']"))
+ \ ->insert("\"", col("''[") - 1)
+ \ ->join("")
+ \ ->setline(".")}'<CR>g@
+
+==============================================================================
+2. Abbreviations *abbreviations* *Abbreviations*
+
+Abbreviations are used in Insert mode, Replace mode and Command-line mode.
+If you enter a word that is an abbreviation, it is replaced with the word it
+stands for. This can be used to save typing for often used long words. And
+you can use it to automatically correct obvious spelling errors.
+Examples:
+
+ :iab ms Microsoft
+ :iab tihs this
+
+There are three types of abbreviations:
+
+full-id The "full-id" type consists entirely of keyword characters (letters
+ and characters from 'iskeyword' option). This is the most common
+ abbreviation.
+
+ Examples: "foo", "g3", "-1"
+
+end-id The "end-id" type ends in a keyword character, but all the other
+ characters are not keyword characters.
+
+ Examples: "#i", "..f", "$/7"
+
+non-id The "non-id" type ends in a non-keyword character, the other
+ characters may be of any type, excluding space and tab. {this type
+ is not supported by Vi}
+
+ Examples: "def#", "4/7$"
+
+Examples of strings that cannot be abbreviations: "a.b", "#def", "a b", "_$r"
+
+An abbreviation is only recognized when you type a non-keyword character.
+This can also be the <Esc> that ends Insert mode or the <CR> that ends a
+command. The non-keyword character which ends the abbreviation is inserted
+after the expanded abbreviation. An exception to this is the character <C-]>,
+which is used to expand an abbreviation without inserting any extra
+characters.
+
+Example: >
+ :ab hh hello
+< "hh<Space>" is expanded to "hello<Space>"
+ "hh<C-]>" is expanded to "hello"
+
+The characters before the cursor must match the abbreviation. Each type has
+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. 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.
+
+non-id In front of the match is a space, tab or the start of the line or
+ the insertion.
+
+Examples: ({CURSOR} is where you type a non-keyword character) >
+ :ab foo four old otters
+< " foo{CURSOR}" is expanded to " four old otters"
+ " foobar{CURSOR}" is not expanded
+ "barfoo{CURSOR}" is not expanded
+>
+ :ab #i #include
+< "#i{CURSOR}" is expanded to "#include"
+ ">#i{CURSOR}" is not expanded
+>
+ :ab ;; <endofline>
+< "test;;" is not expanded
+ "test ;;" is expanded to "test <endofline>"
+
+To avoid the abbreviation in Insert mode: Type CTRL-V before the character
+that would trigger the abbreviation. E.g. CTRL-V <Space>. Or type part of
+the abbreviation, exit insert mode with <Esc>, re-enter insert mode with "a"
+and type the rest.
+
+To avoid the abbreviation in Command-line mode: Type CTRL-V twice somewhere in
+the abbreviation to avoid it to be replaced. A CTRL-V in front of a normal
+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: >
+ func Eatchar(pat)
+ let c = nr2char(getchar(0))
+ return (c =~ a:pat) ? '' : c
+ endfunc
+ iabbr <silent> if if ()<Left><C-R>=Eatchar('\s')<CR>
+
+There are no default abbreviations.
+
+Abbreviations are never recursive. You can use ":ab f f-o-o" without any
+problem. But abbreviations can be mapped. {some versions of Vi support
+recursive abbreviations, for no apparent reason}
+
+Abbreviations are disabled if the 'paste' option is on.
+
+ *:abbreviate-local* *:abbreviate-<buffer>*
+Just like mappings, abbreviations can be local to a buffer. This is mostly
+used in a |filetype-plugin| file. Example for a C plugin file: >
+ :abb <buffer> FF for (i = 0; i < ; ++i)
+<
+ *:ab* *:abbreviate*
+:ab[breviate] list all abbreviations. The character in the first
+ column indicates the mode where the abbreviation is
+ used: 'i' for insert mode, 'c' for Command-line
+ mode, '!' for both. These are the same as for
+ mappings, see |map-listing|.
+
+ *:abbreviate-verbose*
+When 'verbose' is non-zero, listing an abbreviation will also display where it
+was last defined. Example: >
+
+ :verbose abbreviate
+ ! teh the
+ Last set from /home/abcd/vim/abbr.vim
+
+See |:verbose-cmd| for more information.
+
+:ab[breviate] {lhs} list the abbreviations that start with {lhs}
+ You may need to insert a CTRL-V (type it twice) to
+ avoid that a typed {lhs} is expanded, since
+ command-line abbreviations apply here.
+
+:ab[breviate] [<expr>] [<buffer>] {lhs} {rhs}
+ add abbreviation for {lhs} to {rhs}. If {lhs} already
+ existed it is replaced with the new {rhs}. {rhs} may
+ contain spaces.
+ See |:map-<expr>| for the optional <expr> argument.
+ See |:map-<buffer>| for the optional <buffer> argument.
+
+ *:una* *:unabbreviate*
+:una[bbreviate] [<buffer>] {lhs}
+ Remove abbreviation for {lhs} from the list. If none
+ is found, remove abbreviations in which {lhs} matches
+ with the {rhs}. This is done so that you can even
+ remove abbreviations after expansion. To avoid
+ expansion insert a CTRL-V (type it twice).
+
+ *:norea* *:noreabbrev*
+:norea[bbrev] [<expr>] [<buffer>] [lhs] [rhs]
+ Same as ":ab", but no remapping for this {rhs}.
+
+ *:ca* *:cab* *:cabbrev*
+:ca[bbrev] [<expr>] [<buffer>] [lhs] [rhs]
+ Same as ":ab", but for Command-line mode only.
+
+ *:cuna* *:cunabbrev*
+:cuna[bbrev] [<buffer>] {lhs}
+ Same as ":una", but for Command-line mode only.
+
+ *:cnorea* *:cnoreabbrev*
+:cnorea[bbrev] [<expr>] [<buffer>] [lhs] [rhs]
+ same as ":ab", but for Command-line mode only and no
+ remapping for this {rhs}
+
+ *:ia* *:iabbrev*
+:ia[bbrev] [<expr>] [<buffer>] [lhs] [rhs]
+ Same as ":ab", but for Insert mode only.
+
+ *:iuna* *:iunabbrev*
+:iuna[bbrev] [<buffer>] {lhs}
+ Same as ":una", but for insert mode only.
+
+ *:inorea* *:inoreabbrev*
+:inorea[bbrev] [<expr>] [<buffer>] [lhs] [rhs]
+ Same as ":ab", but for Insert mode only and no
+ remapping for this {rhs}.
+
+ *:abc* *:abclear*
+:abc[lear] [<buffer>] Remove all abbreviations.
+
+ *:iabc* *:iabclear*
+:iabc[lear] [<buffer>] Remove all abbreviations for Insert mode.
+
+ *:cabc* *:cabclear*
+:cabc[lear] [<buffer>] Remove all abbreviations for Command-line mode.
+
+ *using_CTRL-V*
+It is possible to use special characters in the rhs of an abbreviation.
+CTRL-V has to be used to avoid the special meaning of most non printable
+characters. How many CTRL-Vs need to be typed depends on how you enter the
+abbreviation. This also applies to mappings. Let's use an example here.
+
+Suppose you want to abbreviate "esc" to enter an <Esc> character. When you
+type the ":ab" command in Vim, you have to enter this: (here ^V is a CTRL-V
+and ^[ is <Esc>)
+
+You type: ab esc ^V^V^V^V^V^[
+
+ All keyboard input is subjected to ^V quote interpretation, so
+ the first, third, and fifth ^V characters simply allow the second,
+ and fourth ^Vs, and the ^[, to be entered into the command-line.
+
+You see: ab esc ^V^V^[
+
+ The command-line contains two actual ^Vs before the ^[. This is
+ how it should appear in your .exrc file, if you choose to go that
+ route. The first ^V is there to quote the second ^V; the :ab
+ command uses ^V as its own quote character, so you can include quoted
+ whitespace or the | character in the abbreviation. The :ab command
+ doesn't do anything special with the ^[ character, so it doesn't need
+ to be quoted. (Although quoting isn't harmful; that's why typing 7
+ [but not 8!] ^Vs works.)
+
+Stored as: esc ^V^[
+
+ After parsing, the abbreviation's short form ("esc") and long form
+ (the two characters "^V^[") are stored in the abbreviation table.
+ If you give the :ab command with no arguments, this is how the
+ abbreviation will be displayed.
+
+ Later, when the abbreviation is expanded because the user typed in
+ the word "esc", the long form is subjected to the same type of
+ ^V interpretation as keyboard input. So the ^V protects the ^[
+ character from being interpreted as the "exit Insert mode" character.
+ Instead, the ^[ is inserted into the text.
+
+Expands to: ^[
+
+[example given by Steve Kirkendall]
+
+==============================================================================
+3. Local mappings and functions *script-local*
+
+When using several Vim script files, there is the danger that mappings and
+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'. This is useful if you have a
+script-local function that you want to call from a mapping in the same script.
+ 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: >
+ :map <SID>Add
+would define a mapping "<SNR>23_Add".
+
+When defining a function in a script, "s:" can be prepended to the name to
+make it local to the script (in |Vim9| script functions without a prefix are
+local to the script). But when a mapping is executed from outside of
+the script, it doesn't know in which script the function was defined. To
+avoid this problem, use "<SID>" instead of "s:". The same translation is done
+as for mappings. This makes it possible to define a call to the function in
+a mapping.
+
+When a local function is executed, it runs in the context of the script it was
+defined in. This means that new functions and mappings it defines can also
+use "s:" or "<SID>" and it will use the same unique number as when the
+function itself was defined. Also, the "s:var" local script variables can be
+used.
+
+When executing an autocommand or a user command, it will run in the context of
+the script it was defined in. This makes it possible that the command calls a
+local function or uses a local mapping.
+
+In case the value is used in a context where <SID> cannot be correctly
+expanded, use the expand() function: >
+ let &includexpr = expand('<SID>') .. 'My_includeexpr()'
+
+Otherwise, using "<SID>" outside of a script context is an error.
+
+If you need to get the script number to use in a complicated script, you can
+use this function: >
+ func s:ScriptNumber()
+ return matchstr(expand('<SID>'), '<SNR>\zs\d\+\ze_')
+ endfunc
+
+The "<SNR>" will be shown when listing functions and mappings. This is useful
+to find out what they are defined to.
+
+The |:scriptnames| command can be used to see which scripts have been sourced
+and what their <SNR> number is.
+
+This is all {not available when compiled without the |+eval| feature}.
+
+==============================================================================
+4. User-defined commands *user-commands*
+
+It is possible to define your own Ex commands. A user-defined command can act
+just like a built-in command (it can have a range or arguments, arguments can
+be completed as filenames or buffer names, etc), except that when the command
+is executed, it is transformed into a normal Ex command and then executed.
+
+For starters: See section |40.2| in the user manual.
+
+ *E183* *E841* *user-cmd-ambiguous*
+All user defined commands must start with an uppercase letter, to avoid
+confusion with builtin commands. Exceptions are these builtin commands:
+ :Next
+ :X
+They cannot be used for a user defined command. ":Print" is also an existing
+command, but it is deprecated and can be overruled.
+
+The other characters of the user command can be uppercase letters, lowercase
+letters or digits. When using digits, note that other commands that take a
+numeric argument may become ambiguous. For example, the command ":Cc2" could
+be the user command ":Cc2" without an argument, or the command ":Cc" with
+argument "2". It is advised to put a space between the command name and the
+argument to avoid these problems.
+
+When using a user-defined command, the command can be abbreviated. However, if
+an abbreviation is not unique, an error will be issued. Furthermore, a
+built-in command will always take precedence.
+
+Example: >
+ :command Rename ...
+ :command Renumber ...
+ :Rena " Means "Rename"
+ :Renu " Means "Renumber"
+ :Ren " Error - ambiguous
+ :command Paste ...
+ :P " The built-in :Print
+
+It is recommended that full names for user-defined commands are used in
+scripts.
+
+:com[mand] *:com* *:command*
+ List all user-defined commands. When listing commands,
+ the characters in the first columns are:
+ ! Command has the -bang attribute
+ " Command has the -register attribute
+ | Command has the -bar 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}
+
+ *:command-verbose*
+When 'verbose' is non-zero, listing a command will also display where it was
+last defined and any completion argument. Example: >
+
+ :verbose command TOhtml
+< Name Args Range Complete Definition ~
+ TOhtml 0 % :call Convert2HTML(<line1>, <line2>) ~
+ Last set from /usr/share/vim/vim-7.0/plugin/tohtml.vim ~
+
+See |:verbose-cmd| for more information.
+
+ *E174* *E182*
+:com[mand][!] [{attr}...] {cmd} {repl}
+ Define a user command. The name of the command is
+ {cmd} and its replacement text is {repl}. The
+ command's attributes (see below) are {attr}. If the
+ command already exists, an error is reported, unless a
+ ! is specified, in which case the command is
+ redefined. There is one exception: When sourcing a
+ script again, a command that was previously defined in
+ that script will be silently replaced.
+
+
+:delc[ommand] {cmd} *:delc* *:delcommand* *E184*
+ Delete the user-defined command {cmd}.
+ This is not allowed while listing commands, e.g. from
+ a timer. *E1311*
+
+:delc[ommand] -buffer {cmd} *E1237*
+ Delete the user-defined command {cmd} that was defined
+ for the current buffer.
+
+:comc[lear] *:comc* *:comclear*
+ Delete all user-defined commands.
+
+
+Command attributes ~
+ *command-attributes*
+User-defined commands are treated by Vim just like any other Ex commands. They
+can have arguments, or have a range specified. Arguments are subject to
+completion as filenames, buffers, etc. Exactly how this works depends upon the
+command's attributes, which are specified when the command is defined.
+
+There are a number of attributes, split into four categories: argument
+handling, completion behavior, range handling, and special cases. The
+attributes are described below, by category.
+
+
+Argument handling ~
+ *E175* *E176* *:command-nargs*
+By default, a user defined command will take no arguments (and an error is
+reported if any are supplied). However, it is possible to specify that the
+command can take arguments, using the -nargs attribute. Valid cases are:
+
+ -nargs=0 No arguments are allowed (the default)
+ -nargs=1 Exactly one argument is required, it includes spaces
+ -nargs=* Any number of arguments are allowed (0, 1, or many),
+ separated by white space
+ -nargs=? 0 or 1 arguments are allowed
+ -nargs=+ Arguments must be supplied, but any number are allowed
+
+Arguments are considered to be separated by (unescaped) spaces or tabs in this
+context, except when there is one argument, then the white space is part of
+the argument.
+
+Note that arguments are used as text, not as expressions. Specifically,
+"s:var" will use the script-local variable in the script where the command was
+defined, not where it is invoked! Example:
+ script1.vim: >
+ :let s:error = "None"
+ :command -nargs=1 Error echoerr <args>
+< script2.vim: >
+ :source script1.vim
+ :let s:error = "Wrong!"
+ :Error s:error
+Executing script2.vim will result in "None" being echoed. Not what you
+intended! Calling a function may be an alternative.
+
+
+Completion behavior ~
+ *:command-completion* *E179* *E180* *E181*
+ *:command-complete*
+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
+ -complete=color color schemes
+ -complete=command Ex command (and arguments)
+ -complete=compiler compilers
+ -complete=cscope |:cscope| suboptions
+ -complete=dir directory names
+ -complete=environment environment variable names
+ -complete=event autocommand events
+ -complete=expression Vim expression
+ -complete=file file and directory names
+ -complete=file_in_path file and directory names in |'path'|
+ -complete=filetype filetype names |'filetype'|
+ -complete=function function name
+ -complete=help help subjects
+ -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'|
+ -complete=syntime |:syntime| suboptions
+ -complete=tag tags
+ -complete=tag_listfiles tags, file names are shown when CTRL-D is hit
+ -complete=user user names
+ -complete=var user variables
+ -complete=custom,{func} custom completion, defined via {func}
+ -complete=customlist,{func} custom completion, defined via {func}
+
+If you specify completion while there is nothing to complete (-nargs=0, the
+default) then you get error *E1208* .
+Note: That some completion methods might expand environment variables.
+
+
+Custom completion ~
+ *:command-completion-custom*
+ *:command-completion-customlist* *E467* *E468*
+It is possible to define customized completion schemes via the "custom,{func}"
+or the "customlist,{func}" completion argument. The {func} part should be a
+function with the following signature: >
+
+ :function {func}(ArgLead, CmdLine, CursorPos)
+
+The function need not use all these arguments. The function should provide the
+completion candidates as the return value.
+
+For the "custom" argument, the function should return the completion
+candidates one per line in a newline separated string.
+ *E1303*
+For the "customlist" argument, the function should return the completion
+candidates as a Vim List. Non-string items in the list are ignored.
+
+The function arguments are:
+ ArgLead the leading portion of the argument currently being
+ completed on
+ CmdLine the entire command line
+ CursorPos the cursor position in it (byte index)
+The function may use these for determining context. For the "custom"
+argument, it is not necessary to filter candidates against the (implicit
+pattern in) ArgLead. Vim will filter the candidates with its regexp engine
+after function return, and this is probably more efficient in most cases. If
+'wildoptions' contains "fuzzy", then the candidates will be filtered using
+|fuzzy-matching|. For the "customlist" argument, Vim will not
+filter the returned completion candidates and the user supplied function
+should filter the candidates.
+
+The following example lists user names to a Finger command >
+ :com -complete=custom,ListUsers -nargs=1 Finger !finger <args>
+ :fun ListUsers(A,L,P)
+ : return system("cut -d: -f1 /etc/passwd")
+ :endfun
+
+The following example completes filenames from the directories specified in
+the 'path' option: >
+ :com -nargs=1 -bang -complete=customlist,EditFileComplete
+ \ EditFile edit<bang> <args>
+ :fun EditFileComplete(A,L,P)
+ : return split(globpath(&path, a:A), "\n")
+ :endfun
+<
+This example does not work for file names with spaces!
+
+
+Range handling ~
+ *E177* *E178* *:command-range* *:command-count*
+By default, user-defined commands do not accept a line number range. However,
+it is possible to specify that the command does take a range (the -range
+attribute), or that it takes an arbitrary count value, either in the line
+number position (-range=N, like the |:split| command) or as a "count"
+argument (-count=N, like the |:Next| command). The count will then be
+available in the argument with |<count>|.
+
+Possible attributes are:
+
+ -range Range allowed, default is current line
+ -range=% Range allowed, default is whole file (1,$)
+ -range=N A count (default N) which is specified in the line
+ number position (like |:split|); allows for zero line
+ number.
+ -count=N A count (default N) which is specified either in the line
+ number position, or as an initial argument (like |:Next|).
+ -count Acts like -count=0
+
+Note that -range=N and -count=N are mutually exclusive - only one should be
+specified.
+
+ *: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.
+
+Possible values are (second column is the short name used in listing):
+ -addr=lines Range of lines (this is the default for -range)
+ -addr=arguments arg Range for arguments
+ -addr=buffers buf Range for buffers (also not loaded buffers)
+ -addr=loaded_buffers load Range for loaded buffers
+ -addr=windows win Range for windows
+ -addr=tabs tab Range for tab pages
+ -addr=quickfix qf Range for quickfix entries
+ -addr=other ? Other kind of range; can use ".", "$" and "%"
+ as with "lines" (this is the default for
+ -count)
+
+
+Special cases ~
+ *:command-bang* *:command-bar*
+ *:command-register* *:command-buffer*
+ *:command-keepscript*
+There are some special cases as well:
+
+ -bang The command can take a ! modifier (like :q or :w)
+ -bar The command can be followed by a "|" and another command.
+ A "|" inside the command argument is not allowed then.
+ Also checks for a " to start a comment.
+ -register The first argument to the command can be an optional
+ register name (like :del, :put, :yank).
+ -buffer The command will only be available in the current buffer.
+ -keepscript Do not use the location of where the user command was
+ defined for verbose messages, use the location of where
+ the user command was invoked.
+
+In the cases of the -count and -register attributes, if the optional argument
+is supplied, it is removed from the argument list and is available to the
+replacement text separately.
+Note that these arguments can be abbreviated, but that is a deprecated
+feature. Use the full name for new scripts.
+
+
+Replacement text ~
+ *:command-repl*
+The {repl} argument is normally one long string, possibly with "|" separated
+commands. A special case is when the argument is "{", then the following
+lines, up to a line starting with "}" are used and |Vim9| syntax applies.
+Example: >
+ :command MyCommand {
+ echo 'hello'
+ g:calledMyCommand = true
+ }
+< *E1231*
+There must be white space before the "{". No nesting is supported, inline
+functions cannot be used. Commands where a "|" may appear in the argument,
+such as commands with an expression argument, cannot be followed by a "|" and
+another command.
+
+The replacement text {repl} for a user defined command is scanned for special
+escape sequences, using <...> notation. Escape sequences are replaced with
+values from the entered command line, and all other text is copied unchanged.
+The resulting string is executed as an Ex command. To avoid the replacement
+use <lt> in place of the initial <. Thus to include "<bang>" literally use
+"<lt>bang>".
+
+The valid escape sequences are
+
+ *<line1>*
+ <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).
+ *<bang>*
+ <bang> (See the '-bang' attribute) Expands to a ! if the
+ command was executed with a ! modifier, otherwise
+ expands to nothing.
+ *<mods>* *<q-mods>* *:command-modifiers*
+ <mods> The command modifiers, if specified. Otherwise, expands to
+ nothing. Supported modifiers are |:aboveleft|, |:belowright|,
+ |:botright|, |:browse|, |:confirm|, |:hide|, |:horizontal|,
+ |:keepalt|, |:keepjumps|, |:keepmarks|, |:keeppatterns|,
+ |:leftabove|, |:lockmarks|, |:noautocmd|, |:noswapfile|
+ |:rightbelow|, |:sandbox|, |:silent|, |:tab|, |:topleft|,
+ |:unsilent|, |:verbose|, and |:vertical|.
+ Note that |:filter| is not supported.
+ 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>
+ is a synonym for this.
+ *<args>*
+ <args> The command arguments, exactly as supplied (but as
+ noted above, any count or register can consume some
+ of the arguments, which are then not part of <args>).
+ <lt> A single '<' (Less-Than) character. This is needed if you
+ want to get a literal copy of one of these escape sequences
+ into the expansion - for example, to get <bang>, use
+ <lt>bang>.
+
+ *<q-args>*
+If the first two characters of an escape sequence are "q-" (for example,
+<q-args>) then the value is quoted in such a way as to make it a valid value
+for use in an expression. This uses the argument as one single value.
+When there is no argument <q-args> is an empty string. See the
+|q-args-example| below.
+ *<f-args>*
+To allow commands to pass their arguments on to a user-defined function, there
+is a special form <f-args> ("function args"). This splits the command
+arguments at spaces and tabs, quotes each argument individually, and the
+<f-args> sequence is replaced by the comma-separated list of quoted arguments.
+See the Mycmd example below. If no arguments are given <f-args> is removed.
+ To embed whitespace into an argument of <f-args>, prepend a backslash.
+<f-args> replaces every pair of backslashes (\\) with one backslash. A
+backslash followed by a character other than white space or a backslash
+remains unmodified. Also see |f-args-example| below. Overview:
+
+ command <f-args> ~
+ XX ab 'ab'
+ XX a\b 'a\b'
+ XX a\ b 'a b'
+ XX a\ b 'a ', 'b'
+ XX a\\b 'a\b'
+ XX a\\ b 'a\', 'b'
+ XX a\\\b 'a\\b'
+ XX a\\\ b 'a\ b'
+ XX a\\\\b 'a\\b'
+ XX a\\\\ b 'a\\', 'b'
+
+
+Examples for user commands: >
+
+ " Delete everything after here to the end
+ :com Ddel +,$d
+
+ " Rename the current buffer
+ :com -nargs=1 -bang -complete=file Ren f <args>|w<bang>
+
+ " Replace a range with the contents of a file
+ " (Enter this all as one line)
+ :com -range -nargs=1 -complete=file
+ Replace <line1>-pu_|<line1>,<line2>d|r <args>|<line1>d
+
+ " Count the number of lines in the range
+ :com! -range -nargs=0 Lines echo <line2> - <line1> + 1 "lines"
+
+< *f-args-example*
+Call a user function (example of <f-args>) >
+ :com -nargs=* Mycmd call Myfunc(<f-args>)
+
+When executed as: >
+ :Mycmd arg1 arg2
+This will invoke: >
+ :call Myfunc("arg1","arg2")
+
+< *q-args-example*
+A more substantial example: >
+ :function Allargs(command)
+ : let i = 0
+ : while i < argc()
+ : if filereadable(argv(i))
+ : execute "e " .. argv(i)
+ : execute a:command
+ : endif
+ : let i = i + 1
+ : endwhile
+ :endfunction
+ :command -nargs=+ -complete=command Allargs call Allargs(<q-args>)
+
+The command Allargs takes any Vim command(s) as argument and executes it on all
+files in the argument list. Usage example (note use of the "e" flag to ignore
+errors and the "update" command to write modified buffers): >
+ :Allargs %s/foo/bar/ge|update
+This will invoke: >
+ :call Allargs("%s/foo/bar/ge|update")
+<
+If the command is defined in Vim9 script (a script that starts with
+`:vim9script` and in a `:def` function) then {repl} will be executed as in Vim9
+script. Thus this depends on where the command is defined, not where it is
+used.
+
+When defining a user command in a script, it will be able to call functions
+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:noet:ft=help:norl:
diff --git a/runtime/doc/mbyte.txt b/runtime/doc/mbyte.txt
new file mode 100644
index 0000000..81d391c
--- /dev/null
+++ b/runtime/doc/mbyte.txt
@@ -0,0 +1,1452 @@
+*mbyte.txt* For Vim version 9.0. Last change: 2022 Apr 03
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar et al.
+
+
+Multi-byte support *multibyte* *multi-byte*
+ *Chinese* *Japanese* *Korean*
+This is about editing text in languages which have many characters that can
+not be represented using one byte (one octet). Examples are Chinese, Japanese
+and Korean. Unicode is also covered here.
+
+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|.
+
+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. Input with imactivatefunc() |mbyte-func|
+11. Using UTF-8 |mbyte-utf8|
+12. 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.
+
+==============================================================================
+1. 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
+doesn't work you will have to read the rest. Don't be surprised if it takes
+quite a bit of work and experimenting to make Vim use all the multibyte
+features. Unfortunately, every system has its own way to deal with multibyte
+languages and it is quite complicated.
+
+
+LOCALE
+
+First of all, you must make sure your current locale is set correctly. If
+your system has been installed to use the language, it probably works right
+away. If not, you can often make it work by setting the $LANG environment
+variable in your shell: >
+
+ setenv LANG ja_JP.EUC
+
+Unfortunately, the name of the locale depends on your system. Japanese might
+also be called "ja_JP.EUCjp" or just "ja". To see what is currently used: >
+
+ :language
+
+To change the locale inside Vim use: >
+
+ :language ja_JP.EUC
+
+Vim will give an error message if this doesn't work. This is a good way to
+experiment and find the locale name you want to use. But it's always better
+to set the locale in the shell, so that it is used right from the start.
+
+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
+
+See |encoding-values| for a list of acceptable values.
+
+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. This also means that changing the value of 'encoding' makes the existing
+text invalid! The text doesn't change, but it will be displayed wrong.
+
+You can edit files in another encoding than what 'encoding' is set to. Vim
+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 this is not the case, you can
+use the 'termencoding' option to make Vim convert text automatically.
+
+For the GUI you must select fonts that work with the current 'encoding'. 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.
+
+For GTK+ 2, you can skip most of this section. The option 'guifontset' does
+no longer exist. You only need to set 'guifont' and everything should "just
+work". If your system comes with Xft2 and fontconfig and the current font
+does not contain a certain glyph, a different font will be used automatically
+if available. The 'guifontwide' option is still supported but usually you do
+not need to set it. It is only necessary if the automatic font selection does
+not suit your needs.
+
+For X11 you can set the 'guifontset' option to a list of fonts that together
+cover the characters that are used. Example for Korean: >
+
+ :set guifontset=k12,r12
+
+Alternatively, you can set 'guifont' and 'guifontwide'. 'guifont' is used for
+the single-width characters, 'guifontwide' for the double-width characters.
+Thus the 'guifontwide' font must be exactly twice as wide as 'guifont'.
+Example for UTF-8: >
+
+ :set guifont=-misc-fixed-medium-r-normal-*-18-120-100-100-c-90-iso10646-1
+ :set guifontwide=-misc-fixed-medium-r-normal-*-18-120-100-100-c-180-iso10646-1
+
+You can also set 'guifont' alone, Vim will try to find a matching
+'guifontwide' for you.
+
+
+INPUT
+
+There are several ways to enter multibyte characters:
+- For X11 XIM can be used. See |XIM|.
+- For MS-Windows IME can be used. See |IME|.
+- For all systems keymaps can be used. See |mbyte-keymap|.
+
+The options 'iminsert', 'imsearch' and 'imcmdline' can be used to choose
+the different input methods or disable them temporarily.
+
+==============================================================================
+2. 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
+in, or just use a certain locale inside Vim.
+
+
+WHAT IS A LOCALE? *locale*
+
+There are many languages in the world. And there are different cultures and
+environments at least as many as the number of languages. A linguistic
+environment corresponding to an area is called "locale". This includes
+information about the used language, the charset, collating order for sorting,
+date format, currency format and so on. For Vim only the language and charset
+really matter.
+
+You can only use a locale if your system has support for it. Some systems
+have only a few locales, especially in the USA. The language which you want
+to use may not be on your system. In that case you might be able to install
+it as an extra package. Check your system documentation for how to do that.
+
+The location in which the locales are installed varies from system to system.
+For example, "/usr/share/locale" or "/usr/lib/locale". See your system's
+setlocale() man page.
+
+Looking in these directories will show you the exact name of each locale.
+Mostly upper/lowercase matters, thus "ja_JP.EUC" and "ja_jp.euc" are
+different. Some systems have a locale.alias file, which allows translation
+from a short name like "nl" to the full name "nl_NL.ISO_8859-1".
+
+Note that X-windows has its own locale stuff. And unfortunately uses locale
+names different from what is used elsewhere. This is confusing! For Vim it
+matters what the setlocale() function uses, which is generally NOT the
+X-windows stuff. You might have to do some experiments to find out what
+really works.
+
+ *locale-name*
+The (simplified) format of |locale| name is:
+
+ language
+or language_territory
+or language_territory.codeset
+
+Territory means the country (or part of it), codeset means the |charset|. For
+example, the locale name "ja_JP.eucJP" means:
+ ja the language is Japanese
+ JP the country is Japan
+ eucJP the codeset is EUC-JP
+But it also could be "ja", "ja_JP.EUC", "ja_JP.ujis", etc. And unfortunately,
+the locale name for a specific language, territory and codeset is not unified
+and depends on your system.
+
+Examples of locale name:
+ charset language locale name ~
+ GB2312 Chinese (simplified) zh_CN.EUC, zh_CN.GB2312
+ Big5 Chinese (traditional) zh_TW.BIG5, zh_TW.Big5
+ CNS-11643 Chinese (traditional) zh_TW
+ EUC-JP Japanese ja, ja_JP.EUC, ja_JP.ujis, ja_JP.eucJP
+ Shift_JIS Japanese ja_JP.SJIS, ja_JP.Shift_JIS
+ EUC-KR Korean ko, ko_KR.EUC
+
+
+USING A LOCALE
+
+To start using a locale for the whole system, see the documentation of your
+system. Mostly you need to set it in a configuration file in "/etc".
+
+To use a locale in a shell, set the $LANG environment value. When you want to
+use Korean and the |locale| name is "ko", do this:
+
+ sh: export LANG=ko
+ csh: setenv LANG ko
+
+You can put this in your ~/.profile or ~/.cshrc file to always use it.
+
+To use a locale in Vim only, use the |:language| command: >
+
+ :language ko
+
+Put this in your ~/.vimrc file to use it always.
+
+Or specify $LANG when starting Vim:
+
+ sh: LANG=ko vim {vim-arguments}
+ csh: env LANG=ko vim {vim-arguments}
+
+You could make a small shell script for this.
+
+==============================================================================
+3. 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.
+
+ *charset* *codeset*
+Charset is another name for encoding. There are subtle differences, but these
+don't matter when using Vim. "codeset" is another similar name.
+
+Each character is encoded as one or more bytes. When all characters are
+encoded with one byte, we call this a single-byte encoding. The most often
+used one is called "latin1". This limits the number of characters to 256.
+Some of these are control characters, thus even fewer can be used for text.
+
+When some characters use two or more bytes, we call this a multibyte
+encoding. This allows using much more than 256 characters, which is required
+for most East Asian languages.
+
+Most multibyte encodings use one byte for the first 127 characters. These
+are equal to ASCII, which makes it easy to exchange plain-ASCII text, no
+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:
+
+1 8bit Single-byte encodings, 256 different characters. Mostly used
+ in USA and Europe. Example: ISO-8859-1 (Latin1). All
+ characters occupy one screen cell only.
+
+2 2byte Double-byte encodings, over 10000 different characters.
+ Mostly used in Asian countries. Example: euc-kr (Korean)
+ The number of screen cells is equal to the number of bytes
+ (except for euc-jp when the first byte is 0x8e).
+
+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
+encodings can be edited by using conversion, see 'fileencoding'.
+Note that all encodings must use ASCII for the characters up to 128 (except
+when compiled for EBCDIC).
+
+Supported 'encoding' values are: *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
+1 koi8-u Ukrainian
+1 macroman MacRoman (Macintosh encoding)
+1 8bit-{name} any 8-bit encoding (Vim specific name)
+1 cp437 similar to iso-8859-1
+1 cp737 similar to iso-8859-7
+1 cp775 Baltic
+1 cp850 similar to iso-8859-4
+1 cp852 similar to iso-8859-1
+1 cp855 similar to iso-8859-2
+1 cp857 similar to iso-8859-5
+1 cp860 similar to iso-8859-9
+1 cp861 similar to iso-8859-1
+1 cp862 similar to iso-8859-1
+1 cp863 similar to iso-8859-8
+1 cp865 similar to iso-8859-1
+1 cp866 similar to iso-8859-5
+1 cp869 similar to iso-8859-7
+1 cp874 Thai
+1 cp1250 Czech, Polish, etc.
+1 cp1251 Cyrillic
+1 cp1253 Greek
+1 cp1254 Turkish
+1 cp1255 Hebrew
+1 cp1256 Arabic
+1 cp1257 Baltic
+1 cp1258 Vietnamese
+1 cp{number} MS-Windows: any installed single-byte codepage
+2 cp932 Japanese (Windows only)
+2 euc-jp Japanese (Unix only)
+2 sjis Japanese (Unix only)
+2 cp949 Korean (Unix and Windows)
+2 euc-kr Korean (Unix only)
+2 cp936 simplified Chinese (Windows only)
+2 euc-cn simplified Chinese (Unix only)
+2 cp950 traditional Chinese (on Unix alias for big5)
+2 big5 traditional Chinese (on Windows alias for cp950)
+2 euc-tw traditional Chinese (Unix only)
+2 2byte-{name} Unix: any double-byte encoding (Vim specific name)
+2 cp{number} MS-Windows: any installed double-byte codepage
+u utf-8 32 bit UTF-8 encoded Unicode (ISO/IEC 10646-1)
+u ucs-2 16 bit UCS-2 encoded Unicode (ISO/IEC 10646-1)
+u ucs-2le like ucs-2, little endian
+u utf-16 ucs-2 extended with double-words for more characters
+u utf-16le like utf-16, little endian
+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.
+For MS-Windows "cp{number}" means using codepage {number}.
+Examples: >
+ :set encoding=8bit-cp1252
+ :set encoding=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
+display the characters 0x80 - 0xA0 or not.
+
+Several aliases can be used, they are translated to one of the names above.
+An incomplete list:
+
+1 ansi same as latin1 (obsolete, for backward compatibility)
+2 japan Japanese: on Unix "euc-jp", on MS-Windows cp932
+2 korea Korean: on Unix "euc-kr", on MS-Windows cp949
+2 prc simplified Chinese: on Unix "euc-cn", on MS-Windows cp936
+2 chinese same as "prc"
+2 taiwan traditional Chinese: on Unix "euc-tw", on MS-Windows cp950
+u utf8 same as utf-8
+u unicode same as ucs-2
+u ucs2be same as ucs-2 (big endian)
+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
+
+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
+first):
+ name bytes char ~
+ ucs-2 11 22 1122
+ ucs-2le 22 11 1122
+ ucs-4 11 22 33 44 11223344
+ ucs-4le 44 33 22 11 11223344
+
+On MS-Windows systems you often want to use "ucs-2le", because it uses little
+endian UCS-2.
+
+There are a few encodings which are similar, but not exactly the same. Vim
+treats them as if they were different encodings, so that conversion will be
+done when needed. You might want to use the similar name to avoid conversion
+or when conversion is not possible:
+
+ cp932, shift-jis, sjis
+ cp936, euc-cn
+
+ *encoding-table*
+Normally 'encoding' is equal to your current locale and 'termencoding' is
+empty. This means that your keyboard and display work with characters encoded
+in your current locale, and Vim uses the same characters internally.
+
+You can make Vim use characters in a different encoding by setting the
+'encoding' option to a different value. Since the keyboard and display still
+use the current locale, conversion needs to be done. The 'termencoding' then
+takes over the value of the current locale, so Vim converts between 'encoding'
+and 'termencoding'. Example: >
+ :let &termencoding = &encoding
+ :set encoding=utf-8
+
+However, not all combinations of values are possible. The table below tells
+you how each of the nine combinations works. This is further restricted by
+not all conversions being possible, iconv() being present, etc. Since this
+depends on the system used, no detailed list can be given.
+
+('tenc' is the short name for 'termencoding' and 'enc' short for 'encoding')
+
+'tenc' 'enc' remark ~
+
+ 8bit 8bit Works. When 'termencoding' is different from
+ 'encoding' typing and displaying may be wrong for some
+ characters, Vim does NOT perform conversion (set
+ 'encoding' to "utf-8" to get this).
+ 8bit 2byte MS-Windows: works for all codepages installed on your
+ system; you can only type 8bit characters;
+ Other systems: does NOT work.
+ 8bit Unicode Works, but only 8bit characters can be typed directly
+ (others through digraphs, keymaps, etc.); in a
+ terminal you can only see 8bit characters; the GUI can
+ show all characters that the 'guifont' supports.
+
+ 2byte 8bit Works, but typing non-ASCII characters might
+ be a problem.
+ 2byte 2byte MS-Windows: works for all codepages installed on your
+ system; typing characters might be a problem when
+ locale is different from 'encoding'.
+ Other systems: Only works when 'termencoding' is equal
+ to 'encoding', you might as well leave it empty.
+ 2byte Unicode works, Vim will translate typed characters.
+
+ Unicode 8bit works (unusual)
+ Unicode 2byte does NOT work
+ Unicode Unicode works very well (leaving 'termencoding' empty works
+ the same way, because all Unicode is handled
+ internally as UTF-8)
+
+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 displaying characters and 'termencoding' is different from 'encoding'
+- When reading input and 'termencoding' is different from 'encoding'
+- When displaying messages and the encoding used for LC_MESSAGES differs from
+ 'encoding' (requires a gettext version that supports this).
+- When reading a Vim script where |:scriptencoding| is different from
+ 'encoding'.
+- When reading or writing a |viminfo| file.
+Most of these require the |+iconv| feature. Conversion for reading and
+writing files may also be specified with the 'charconvert' option.
+
+Useful utilities for converting the charset:
+ All: iconv
+ GNU iconv can convert most encodings. Unicode is used as the
+ intermediate encoding, which allows conversion from and to all other
+ encodings. See http://www.gnu.org/directory/libiconv.html.
+
+ Japanese: nkf
+ Nkf is "Network Kanji code conversion Filter". One of the most unique
+ facility of nkf is the guess of the input Kanji code. So, you don't
+ need to know what the inputting file's |charset| is. When convert to
+ EUC-JP from ISO-2022-JP or Shift_JIS, simply do the following command
+ in Vim:
+ :%!nkf -e
+ Nkf can be found at:
+ http://www.sfc.wide.ad.jp/~max/FreeBSD/ports/distfiles/nkf-1.62.tar.gz
+
+ Chinese: hc
+ Hc is "Hanzi Converter". Hc convert a GB file to a Big5 file, or Big5
+ file to GB file. Hc can be found at:
+ ftp://ftp.cuhk.hk/pub/chinese/ifcss/software/unix/convert/hc-30.tar.gz
+
+ Korean: hmconv
+ Hmconv is Korean code conversion utility especially for E-mail. It can
+ convert between EUC-KR and ISO-2022-KR. Hmconv can be found at:
+ ftp://ftp.kaist.ac.kr/pub/hangul/code/hmconv/
+
+ Multilingual: lv
+ Lv is a Powerful Multilingual File Viewer. And it can be worked as
+ |charset| converter. Supported |charset|: ISO-2022-CN, ISO-2022-JP,
+ ISO-2022-KR, EUC-CN, EUC-JP, EUC-KR, EUC-TW, UTF-7, UTF-8, ISO-8859
+ series, Shift_JIS, Big5 and HZ. Lv can be found at:
+ http://www.ff.iij4u.or.jp/~nrt/lv/index.html
+
+
+ *mbyte-conversion*
+When reading and writing files in an encoding different from 'encoding',
+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
+ to any codepage should work.
+- Conversion specified with 'charconvert'
+- Conversion with the iconv library, if it is available.
+ Old versions of GNU iconv() may cause the conversion to fail (they
+ request a very large buffer, more than Vim is willing to provide).
+ Try getting another iconv() implementation.
+
+ *iconv-dynamic*
+On MS-Windows Vim can be compiled with the |+iconv/dyn| feature. This means
+Vim will search for the "iconv.dll" and "libiconv.dll" libraries. When
+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 multibyte 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 multibyte support and/or
+|XIM|. Examples are kterm (Kanji term) and hanterm (for Korean), Eterm
+(Enlightened terminal) and rxvt.
+
+If your terminal does not support the right encoding, you can set the
+'termencoding' option. Vim will then convert the typed characters from
+'termencoding' to 'encoding'. And displayed text will be converted from
+'encoding' to 'termencoding'. If the encoding supported by the terminal
+doesn't include all the characters that Vim uses, this leads to lost
+characters. This may mess up the display. If you use a terminal that
+supports Unicode, such as the xterm mentioned below, it should work just fine,
+since nearly every character set can be converted to Unicode without loss of
+information.
+
+
+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*
+
+Unfortunately, using fonts in X11 is complicated. The name of a single-byte
+font is a long string. For multibyte fonts we need several of these...
+
+Note: Most of this is no longer relevant for GTK+ 2. Selecting a font via
+its XLFD is not supported; see 'guifont' for an example of how to
+set the font. Do yourself a favor and ignore the |XLFD| and |xfontset|
+sections below.
+
+First of all, Vim only accepts fixed-width fonts for displaying text. You
+cannot use proportionally spaced fonts. This excludes many of the available
+(and nicer looking) fonts. However, for menus and tooltips any font can be
+used.
+
+Note that Display and Input are independent. It is possible to see your
+language even though you have no input method for it.
+
+You should get a default font for menus and tooltips that works, but it might
+be ugly. Read the following to find out how to select a better font.
+
+
+X LOGICAL FONT DESCRIPTION (XLFD)
+ *XLFD*
+XLFD is the X font name and contains the information about the font size,
+charset, etc. The name is in this format:
+
+FOUNDRY-FAMILY-WEIGHT-SLANT-WIDTH-STYLE-PIXEL-POINT-X-Y-SPACE-AVE-CR-CE
+
+Each field means:
+
+- FOUNDRY: FOUNDRY field. The company that created the font.
+- FAMILY: FAMILY_NAME field. Basic font family name. (helvetica, gothic,
+ times, etc)
+- WEIGHT: WEIGHT_NAME field. How thick the letters are. (light, medium,
+ bold, etc)
+- SLANT: SLANT field.
+ r: Roman (no slant)
+ i: Italic
+ o: Oblique
+ ri: Reverse Italic
+ ro: Reverse Oblique
+ ot: Other
+ number: Scaled font
+- WIDTH: SETWIDTH_NAME field. Width of characters. (normal, condensed,
+ narrow, double wide)
+- STYLE: ADD_STYLE_NAME field. Extra info to describe font. (Serif, Sans
+ Serif, Informal, Decorated, etc)
+- PIXEL: PIXEL_SIZE field. Height, in pixels, of characters.
+- POINT: POINT_SIZE field. Ten times height of characters in points.
+- X: RESOLUTION_X field. X resolution (dots per inch).
+- Y: RESOLUTION_Y field. Y resolution (dots per inch).
+- SPACE: SPACING field.
+ p: Proportional
+ m: Monospaced
+ c: CharCell
+- AVE: AVERAGE_WIDTH field. Ten times average width in pixels.
+- CR: CHARSET_REGISTRY field. The name of the charset group.
+- CE: CHARSET_ENCODING field. The rest of the charset name. For some
+ charsets, such as JIS X 0208, if this field is 0, code points has
+ the same value as GL, and GR if 1.
+
+For example, in case of a 16 dots font corresponding to JIS X 0208, it is
+written like:
+ -misc-fixed-medium-r-normal--16-110-100-100-c-160-jisx0208.1990-0
+
+
+X FONTSET
+ *fontset* *xfontset*
+A single-byte charset is typically associated with one font. For multibyte
+charsets a combination of fonts is often used. This means that one group of
+characters are used from one font and another group from another font (which
+might be double wide). This collection of fonts is called a fontset.
+
+Which fonts are required in a fontset depends on the current locale. X
+windows maintains a table of which groups of characters are required for a
+locale. You have to specify all the fonts that a locale requires in the
+'guifontset' option.
+
+Setting the 'guifontset' option also means that all font names will be handled
+as a fontset name. Also the ones used for the "font" argument of the
+|:highlight| command.
+
+Note the difference between 'guifont' and 'guifontset': In 'guifont'
+the comma-separated names are alternative names, one of which will be
+used. In 'guifontset' the whole string is one fontset name,
+including the commas. It is not possible to specify alternative
+fontset names.
+This example works on many X11 systems: >
+ :set guifontset=-*-*-medium-r-normal--16-*-*-*-c-*-*-*
+<
+The fonts must match with the current locale. If fonts for the character sets
+that the current locale uses are not included, setting 'guifontset' will fail.
+
+NOTE: The fontset always uses the current locale, even though 'encoding' may
+be set to use a different charset. In that situation you might want to use
+'guifont' and 'guifontwide' instead of 'guifontset'.
+
+Example:
+ |charset| language "groups of characters" ~
+ GB2312 Chinese (simplified) ISO-8859-1 and GB 2312
+ Big5 Chinese (traditional) ISO-8859-1 and Big5
+ CNS-11643 Chinese (traditional) ISO-8859-1, CNS 11643-1 and CNS 11643-2
+ EUC-JP Japanese JIS X 0201 and JIS X 0208
+ EUC-KR Korean ISO-8859-1 and KS C 5601 (KS X 1001)
+
+You can search for fonts using the xlsfonts command. For example, when you're
+searching for a font for KS C 5601: >
+ xlsfonts | grep ksc5601
+
+This is complicated and confusing. You might want to consult the X-Windows
+documentation if there is something you don't understand.
+
+ *base_font_name_list*
+When you have found the names of the fonts you want to use, you need to set
+the 'guifontset' option. You specify the list by concatenating the font names
+and putting a comma in between them.
+
+For example, when you use the ja_JP.eucJP locale, this requires JIS X 0201
+and JIS X 0208. You could supply a list of fonts that explicitly specifies
+the charsets, like: >
+
+ :set guifontset=-misc-fixed-medium-r-normal--14-130-75-75-c-140-jisx0208.1983-0,
+ \-misc-fixed-medium-r-normal--14-130-75-75-c-70-jisx0201.1976-0
+
+Alternatively, you can supply a base font name list that omits the charset
+name, letting X-Windows select font characters required for the locale. For
+example: >
+
+ :set guifontset=-misc-fixed-medium-r-normal--14-130-75-75-c-140,
+ \-misc-fixed-medium-r-normal--14-130-75-75-c-70
+
+Alternatively, you can supply a single base font name that allows X-Windows to
+select from all available fonts. For example: >
+
+ :set guifontset=-misc-fixed-medium-r-normal--14-*
+
+Alternatively, you can specify alias names. See the fonts.alias file in the
+fonts directory (e.g., /usr/X11R6/lib/X11/fonts/). For example: >
+
+ :set guifontset=k14,r14
+<
+ *E253*
+Note that in East Asian fonts, the standard character cell is square. When
+mixing a Latin font and an East Asian font, the East Asian font width should
+be twice the Latin font width.
+
+If 'guifontset' is not empty, the "font" argument of the |:highlight| command
+is also interpreted as a fontset. For example, you should use for
+highlighting: >
+ :hi Comment font=english_font,your_font
+If you use a wrong "font" argument you will get an error message.
+Also make sure that you set 'guifontset' before setting fonts for highlight
+groups.
+
+
+USING RESOURCE FILES
+
+Instead of specifying 'guifontset', you can set X11 resources and Vim will
+pick them up. This is only for people who know how X resource files work.
+
+For Motif insert these three lines in your $HOME/.Xdefaults file:
+
+ Vim.font: |base_font_name_list|
+ Vim*fontSet: |base_font_name_list|
+ Vim*fontList: your_language_font
+
+Note: Vim.font is for text area.
+ Vim*fontSet is for menu.
+ Vim*fontList is for menu (for Motif GUI)
+
+For example, when you are using Japanese and a 14 dots font, >
+
+ Vim.font: -misc-fixed-medium-r-normal--14-*
+ Vim*fontSet: -misc-fixed-medium-r-normal--14-*
+ Vim*fontList: -misc-fixed-medium-r-normal--14-*
+<
+or: >
+
+ Vim*font: k14,r14
+ Vim*fontSet: k14,r14
+ Vim*fontList: k14,r14
+<
+To have them take effect immediately you will have to do >
+
+ xrdb -merge ~/.Xdefaults
+
+Otherwise you will have to stop and restart the X server before the changes
+take effect.
+
+
+The GTK+ version of GUI Vim does not use .Xdefaults, use ~/.gtkrc instead.
+The default mostly works OK. But for the menus you might have to change
+it. Example: >
+
+ style "default"
+ {
+ fontset="-*-*-medium-r-normal--14-*-*-*-c-*-*-*"
+ }
+ widget_class "*" style "default"
+
+==============================================================================
+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 |gvimrc| file to set 'guifont': >
+
+ :set guifont=courier_new:h12
+
+==============================================================================
+7. Input on X11 *mbyte-XIM*
+
+X INPUT METHOD (XIM) BACKGROUND *XIM* *xim* *x-input-method*
+
+XIM is an international input module for X. There are two kinds of structures,
+Xlib unit type and |IM-server| (Input-Method server) type. |IM-server| type
+is suitable for complex input, such as CJK.
+
+- IM-server
+ *IM-server*
+ In |IM-server| type input structures, the input event is handled by either
+ of the two ways: FrontEnd system and BackEnd system. In the FrontEnd
+ system, input events are snatched by the |IM-server| first, then |IM-server|
+ give the application the result of input. On the other hand, the BackEnd
+ system works reverse order. MS-Windows adopt BackEnd system. In X, most of
+ |IM-server|s adopt FrontEnd system. The demerit of BackEnd system is the
+ large overhead in communication, but it provides safe synchronization with
+ no restrictions on applications.
+
+ For example, there are xwnmo and kinput2 Japanese |IM-server|, both are
+ FrontEnd system. Xwnmo is distributed with Wnn (see below), kinput2 can be
+ found at: ftp://ftp.sra.co.jp/pub/x11/kinput2/
+
+ For Chinese, there's a great XIM server named "xcin", you can input both
+ Traditional and Simplified Chinese characters. And it can accept other
+ locale if you make a correct input table. Xcin can be found at:
+ http://cle.linux.org.tw/xcin/
+ Others are scim: http://scim.freedesktop.org/ and fcitx:
+ http://www.fcitx.org/
+
+- Conversion Server
+ *conversion-server*
+ Some system needs additional server: conversion server. Most of Japanese
+ |IM-server|s need it, Kana-Kanji conversion server. For Chinese inputting,
+ it depends on the method of inputting, in some methods, PinYin or ZhuYin to
+ HanZi conversion server is needed. For Korean inputting, if you want to
+ input Hanja, Hangul-Hanja conversion server is needed.
+
+ For example, the Japanese inputting process is divided into 2 steps. First
+ we pre-input Hira-gana, second Kana-Kanji conversion. There are so many
+ Kanji characters (6349 Kanji characters are defined in JIS X 0208) and the
+ number of Hira-gana characters are 76. So, first, we pre-input text as
+ pronounced in Hira-gana, second, we convert Hira-gana to Kanji or Kata-Kana,
+ if needed. There are some Kana-Kanji conversion server: jserver
+ (distributed with Wnn, see below) and canna. Canna can be found at:
+ http://canna.sourceforge.jp/
+
+There is a good input system: Wnn4.2. Wnn 4.2 contains,
+ xwnmo (|IM-server|)
+ jserver (Japanese Kana-Kanji conversion server)
+ cserver (Chinese PinYin or ZhuYin to simplified HanZi conversion server)
+ tserver (Chinese PinYin or ZhuYin to traditional HanZi conversion server)
+ kserver (Hangul-Hanja conversion server)
+Wnn 4.2 for several systems can be found at various places on the internet.
+Use the RPM or port for your system.
+
+
+- Input Style
+ *xim-input-style*
+ When inputting CJK, there are four areas:
+ 1. The area to display of the input while it is being composed
+ 2. The area to display the currently active input mode.
+ 3. The area to display the next candidate for the selection.
+ 4. The area to display other tools.
+
+ The third area is needed when converting. For example, in Japanese
+ inputting, multiple Kanji characters could have the same pronunciation, so
+ a sequence of Hira-gana characters could map to a distinct sequence of Kanji
+ characters.
+
+ The first and second areas are defined in international input of X with the
+ names of "Preedit Area", "Status Area" respectively. The third and fourth
+ areas are not defined and are left to be managed by the |IM-server|. In the
+ international input, four input styles have been defined using combinations
+ of Preedit Area and Status Area: |OnTheSpot|, |OffTheSpot|, |OverTheSpot|
+ and |Root|.
+
+ Currently, GUI Vim supports three styles, |OverTheSpot|, |OffTheSpot| and
+ |Root|.
+ When compiled with |+GUI_GTK| feature, GUI Vim supports two styles,
+ |OnTheSpot| and |OverTheSpot|. You can select the style with the 'imstyle'
+ option.
+
+*. on-the-spot *OnTheSpot*
+ Preedit Area and Status Area are performed by the client application in
+ the area of application. The client application is directed by the
+ |IM-server| to display all pre-edit data at the location of text
+ insertion. The client registers callbacks invoked by the input method
+ during pre-editing.
+*. over-the-spot *OverTheSpot*
+ Status Area is created in a fixed position within the area of application,
+ in case of Vim, the position is the additional status line. Preedit Area
+ is made at present input position of application. The input method
+ displays pre-edit data in a window which it brings up directly over the
+ text insertion position.
+*. off-the-spot *OffTheSpot*
+ Preedit Area and Status Area are performed in the area of application, in
+ case of Vim, the area is additional status line. The client application
+ provides display windows for the pre-edit data to the input method which
+ displays into them directly.
+*. root-window *Root*
+ Preedit Area and Status Area are outside of the application. The input
+ method displays all pre-edit data in a separate area of the screen in a
+ window specific to the input method.
+
+
+USING XIM *multibyte-input* *E284* *E285* *E286* *E287*
+ *E288* *E289*
+
+Note that Display and Input are independent. It is possible to see your
+language even though you have no input method for it. But when your Display
+method doesn't match your Input method, the text will be displayed wrong.
+
+ Note: You can not use IM unless you specify 'guifontset'.
+ Therefore, Latin users, you have to also use 'guifontset'
+ if you use IM.
+
+To input your language you should run the |IM-server| which supports your
+language and |conversion-server| if needed.
+
+The next 3 lines should be put in your ~/.Xdefaults file. They are common for
+all X applications which uses |XIM|. If you already use |XIM|, you can skip
+this. >
+
+ *international: True
+ *.inputMethod: your_input_server_name
+ *.preeditType: your_input_style
+<
+input_server_name is your |IM-server| name (check your |IM-server|
+ manual).
+your_input_style is one of |OverTheSpot|, |OffTheSpot|, |Root|. See
+ also |xim-input-style|.
+
+*international may not be necessary if you use X11R6.
+*.inputMethod and *.preeditType are optional if you use X11R6.
+
+For example, when you are using kinput2 as |IM-server|, >
+
+ *international: True
+ *.inputMethod: kinput2
+ *.preeditType: OverTheSpot
+<
+When using |OverTheSpot|, GUI Vim always connects to the IM Server even in
+Normal mode, so you can input your language with commands like "f" and "r".
+But when using one of the other two methods, GUI Vim connects to the IM Server
+only if it is not in Normal mode.
+
+If your IM Server does not support |OverTheSpot|, and if you want to use your
+language with some Normal mode command like "f" or "r", then you should use a
+localized xterm or an xterm which supports |XIM|
+
+If needed, you can set the XMODIFIERS environment variable:
+
+ sh: export XMODIFIERS="@im=input_server_name"
+ csh: setenv XMODIFIERS "@im=input_server_name"
+
+For example, when you are using kinput2 as |IM-server| and sh, >
+
+ export XMODIFIERS="@im=kinput2"
+<
+
+FULLY CONTROLLED XIM
+
+You can fully control XIM, like with IME of MS-Windows (see |multibyte-ime|).
+This is currently only available for the GTK GUI.
+
+Before using fully controlled XIM, one setting is required. Set the
+'imactivatekey' option to the key that is used for the activation of the input
+method. For example, when you are using kinput2 + canna as IM Server, the
+activation key is probably Shift+Space: >
+
+ :set imactivatekey=S-space
+
+See 'imactivatekey' for the format.
+
+==============================================================================
+8. Input on MS-Windows *mbyte-IME*
+
+(Windows IME support) *multibyte-ime* *IME*
+
+{only works Windows GUI and compiled with the |+multi_byte_ime| feature}
+
+To input multibyte characters on Windows, you can use an Input Method Editor
+(IME). In process of your editing text, you must switch status (on/off) of
+IME many many many times. Because IME with status on is hooking all of your
+key inputs, you cannot input 'j', 'k', or almost all of keys to Vim directly.
+
+The |+multi_byte_ime| feature helps for this. It reduces the number of times
+the IME status has to be switched manually. In Normal mode, there is almost
+no need to use IME, even when editing multibyte text. So when exiting Insert
+mode, Vim memorizes the last status of IME and turns off IME. When
+re-entering Insert mode, Vim sets the IME status to that memorized status
+automatically.
+
+This works on not only insert-normal mode, but also search-command input and
+replace mode.
+The options 'iminsert', 'imsearch' and 'imcmdline' can be used to choose
+the different input methods or disable them temporarily.
+
+On Windows 9x and Windows NT 4.0 there was *global-ime* , but this is no
+longer supported. You can still find documentation for Active Input Method
+Manager (Global IME) here:
+ http://msdn.microsoft.com/en-us/library/aa741221(v=VS.85).aspx
+
+NOTE: For IME to work you must make sure the input locales of your language
+are added to your system. The exact location of this depends on the version
+of Windows you use. For example, on my Windows 2000 box:
+1. Control Panel
+2. Regional Options
+3. Input Locales Tab
+4. Add Installed input locales -> Chinese(PRC)
+ The default is still English (United Stated)
+
+
+Cursor color when IME or XIM is on *CursorIM*
+ There is a little cute feature for IME. Cursor can indicate status of IME
+ by changing its color. Usually status of IME was indicated by little icon
+ at a corner of desktop (or taskbar). It is not easy to verify status of
+ IME. But this feature help this.
+ This works in the same way when using XIM.
+
+ You can select cursor color when status is on by using highlight group
+ CursorIM. For example, add these lines to your |gvimrc|: >
+
+ if has('multi_byte_ime')
+ highlight Cursor guifg=NONE guibg=Green
+ highlight CursorIM guifg=NONE guibg=Purple
+ endif
+<
+ Cursor color with off IME is green. And purple cursor indicates that
+ status is on.
+
+==============================================================================
+9. 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}.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.
+
+'runtimepath' is used to find these files. To see an overview of all
+available keymap files, use this: >
+ :echo globpath(&rtp, "keymap/*.vim")
+
+In Insert and Command-line mode you can use CTRL-^ to toggle between using the
+keyboard map or not. |i_CTRL-^| |c_CTRL-^|
+This flag is remembered for Insert mode with the 'iminsert' option. When
+leaving and entering Insert mode the previous value is used. The same value
+is also used for commands that take a single character argument, like |f| and
+|r|.
+For Command-line mode the flag is NOT remembered. You are expected to type an
+Ex command first, which is ASCII.
+For typing search patterns the 'imsearch' option is used. It can be set to
+use the same value as for 'iminsert'.
+ *lCursor*
+It is possible to give the GUI cursor another color when the language mappings
+are being used. This is disabled by default, to avoid that the cursor becomes
+invisible when you use a non-standard background color. Here is an example to
+use a brightly colored cursor: >
+ :highlight Cursor guifg=NONE guibg=Green
+ :highlight lCursor guifg=NONE guibg=Cyan
+<
+ *keymap-file-format* *:loadk* *:loadkeymap* *E105* *E791*
+The keymap file looks something like this: >
+
+ " Maintainer: name <email@address>
+ " Last Changed: 2001 Jan 1
+
+ let b:keymap_name = "short"
+
+ loadkeymap
+ a A
+ b B comment
+
+The lines starting with a " are comments and will be ignored. Blank lines are
+also ignored. The lines with the mappings may have a comment after the useful
+text.
+
+The "b:keymap_name" can be set to a short name, which will be shown in the
+status line. The idea is that this takes less room than the value of
+'keymap', which might be long to distinguish between different languages,
+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,
+using "<buffer>" to make the mappings local to the buffer.
+You can check the result with this command: >
+ :lmap
+The two items must be separated by white space. You cannot include white
+space inside an item, use the special names "<Tab>" and "<Space>" instead.
+The length of the two items together must not exceed 200 bytes.
+
+It's possible to have more than one character in the first column. This works
+like a dead key. Example: >
+ 'a á
+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.
+The "accents" keymap uses this. *keymap-accents*
+
+The first column can also be in |<>| form:
+ <C-c> Ctrl-C
+ <A-c> Alt-c
+ <A-C> Alt-C
+Note that the Alt mappings may not work, depending on your keyboard and
+terminal.
+
+Although it's possible to have more than one character in the second column,
+this is unusual. But you can use various ways to specify the character: >
+ A a literal character
+ A <char-97> decimal value
+ A <char-0x61> hexadecimal value
+ A <char-0141> octal value
+ x <Space> special key name
+
+The characters are assumed to be encoded for the current value of 'encoding'.
+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.
+
+The lines after "loadkeymap" are interpreted with 'cpoptions' set to "C".
+This means that continuation lines are not used and a backslash has a special
+meaning in the mappings. Examples: >
+
+ " a comment line
+ \" x maps " to x
+ \\ y maps \ to y
+
+If you write a keymap file that will be useful for others, consider submitting
+it to the Vim maintainer for inclusion in the distribution:
+<maintainer@vim.org>
+
+
+HEBREW KEYMAP *keymap-hebrew*
+
+This file explains what characters are available in UTF-8 and CP1255 encodings,
+and what the keymaps are to get those characters:
+
+glyph encoding keymap ~
+Char UTF-8 cp1255 hebrew hebrewp name ~
+א 0x5d0 0xe0 t a 'alef
+ב 0x5d1 0xe1 c b bet
+ג 0x5d2 0xe2 d g gimel
+ד 0x5d3 0xe3 s d dalet
+ה 0x5d4 0xe4 v h he
+ו 0x5d5 0xe5 u v vav
+ז 0x5d6 0xe6 z z zayin
+ח 0x5d7 0xe7 j j het
+ט 0x5d8 0xe8 y T tet
+י 0x5d9 0xe9 h y yod
+ך 0x5da 0xea l K kaf sofit
+כ 0x5db 0xeb f k kaf
+ל 0x5dc 0xec k l lamed
+ם 0x5dd 0xed o M mem sofit
+מ 0x5de 0xee n m mem
+ן 0x5df 0xef i N nun sofit
+נ 0x5e0 0xf0 b n nun
+ס 0x5e1 0xf1 x s samech
+ע 0x5e2 0xf2 g u `ayin
+ף 0x5e3 0xf3 ; P pe sofit
+פ 0x5e4 0xf4 p p pe
+ץ 0x5e5 0xf5 . X tsadi sofit
+צ 0x5e6 0xf6 m x tsadi
+ק 0x5e7 0xf7 e q qof
+ר 0x5e8 0xf8 r r resh
+ש 0x5e9 0xf9 a w shin
+ת 0x5ea 0xfa , t tav
+
+Vowel marks and special punctuation:
+הְ 0x5b0 0xc0 A: A: sheva
+הֱ 0x5b1 0xc1 HE HE hataf segol
+הֲ 0x5b2 0xc2 HA HA hataf patah
+הֳ 0x5b3 0xc3 HO HO hataf qamats
+הִ 0x5b4 0xc4 I I hiriq
+הֵ 0x5b5 0xc5 AY AY tsere
+הֶ 0x5b6 0xc6 E E segol
+הַ 0x5b7 0xc7 AA AA patah
+הָ 0x5b8 0xc8 AO AO qamats
+הֹ 0x5b9 0xc9 O O holam
+הֻ 0x5bb 0xcb U U qubuts
+כּ 0x5bc 0xcc D D dagesh
+הֽ 0x5bd 0xcd ]T ]T meteg
+ה־ 0x5be 0xce ]Q ]Q maqaf
+בֿ 0x5bf 0xcf ]R ]R rafe
+ב׀ 0x5c0 0xd0 ]p ]p paseq
+שׁ 0x5c1 0xd1 SR SR shin-dot
+שׂ 0x5c2 0xd2 SL SL sin-dot
+׃ 0x5c3 0xd3 ]P ]P sof-pasuq
+װ 0x5f0 0xd4 VV VV double-vav
+ױ 0x5f1 0xd5 VY VY vav-yod
+ײ 0x5f2 0xd6 YY YY yod-yod
+
+The following are only available in UTF-8
+
+Cantillation marks:
+glyph
+Char UTF-8 hebrew name
+ב֑ 0x591 C: etnahta
+ב֒ 0x592 Cs segol
+ב֓ 0x593 CS shalshelet
+ב֔ 0x594 Cz zaqef qatan
+ב֕ 0x595 CZ zaqef gadol
+ב֖ 0x596 Ct tipeha
+ב֗ 0x597 Cr revia
+ב֘ 0x598 Cq zarqa
+ב֙ 0x599 Cp pashta
+ב֚ 0x59a C! yetiv
+ב֛ 0x59b Cv tevir
+ב֜ 0x59c Cg geresh
+ב֝ 0x59d C* geresh qadim
+ב֞ 0x59e CG gershayim
+ב֟ 0x59f CP qarnei-parah
+ב֪ 0x5aa Cy yerach-ben-yomo
+ב֫ 0x5ab Co ole
+ב֬ 0x5ac Ci iluy
+ב֭ 0x5ad Cd dehi
+ב֮ 0x5ae Cn zinor
+ב֯ 0x5af CC masora circle
+
+Combining forms:
+ﬠ 0xfb20 X` Alternative `ayin
+ﬡ 0xfb21 X' Alternative 'alef
+ﬢ 0xfb22 X-d Alternative dalet
+ﬣ 0xfb23 X-h Alternative he
+ﬤ 0xfb24 X-k Alternative kaf
+ﬥ 0xfb25 X-l Alternative lamed
+ﬦ 0xfb26 X-m Alternative mem-sofit
+ﬧ 0xfb27 X-r Alternative resh
+ﬨ 0xfb28 X-t Alternative tav
+﬩ 0xfb29 X-+ Alternative plus
+שׁ 0xfb2a XW shin+shin-dot
+שׂ 0xfb2b Xw shin+sin-dot
+שּׁ 0xfb2c X..W shin+shin-dot+dagesh
+שּׂ 0xfb2d X..w shin+sin-dot+dagesh
+אַ 0xfb2e XA alef+patah
+אָ 0xfb2f XO alef+qamats
+אּ 0xfb30 XI alef+hiriq (mapiq)
+בּ 0xfb31 X.b bet+dagesh
+גּ 0xfb32 X.g gimel+dagesh
+דּ 0xfb33 X.d dalet+dagesh
+הּ 0xfb34 X.h he+dagesh
+וּ 0xfb35 Xu vav+dagesh
+זּ 0xfb36 X.z zayin+dagesh
+טּ 0xfb38 X.T tet+dagesh
+יּ 0xfb39 X.y yud+dagesh
+ךּ 0xfb3a X.K kaf sofit+dagesh
+כּ 0xfb3b X.k kaf+dagesh
+לּ 0xfb3c X.l lamed+dagesh
+מּ 0xfb3e X.m mem+dagesh
+נּ 0xfb40 X.n nun+dagesh
+סּ 0xfb41 X.s samech+dagesh
+ףּ 0xfb43 X.P pe sofit+dagesh
+פּ 0xfb44 X.p pe+dagesh
+צּ 0xfb46 X.x tsadi+dagesh
+קּ 0xfb47 X.q qof+dagesh
+רּ 0xfb48 X.r resh+dagesh
+שּ 0xfb49 X.w shin+dagesh
+תּ 0xfb4a X.t tav+dagesh
+וֹ 0xfb4b Xo vav+holam
+בֿ 0xfb4c XRb bet+rafe
+כֿ 0xfb4d XRk kaf+rafe
+פֿ 0xfb4e XRp pe+rafe
+ﭏ 0xfb4f Xal alef-lamed
+
+==============================================================================
+10. Input with imactivatefunc() *mbyte-func*
+
+Vim has the 'imactivatefunc' and 'imstatusfunc' options. These are useful to
+activate/deactivate the input method from Vim in any way, also with an external
+command. For example, fcitx provide fcitx-remote command: >
+
+ set iminsert=2
+ set imsearch=2
+ set imcmdline
+
+ set imactivatefunc=ImActivate
+ function! ImActivate(active)
+ if a:active
+ call system('fcitx-remote -o')
+ else
+ call system('fcitx-remote -c')
+ endif
+ endfunction
+
+ set imstatusfunc=ImStatus
+ function! ImStatus()
+ return system('fcitx-remote')[0] is# '2'
+ endfunction
+
+Using this script, you can activate/deactivate XIM via Vim even when it is not
+compiled with |+xim|.
+
+==============================================================================
+11. 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
+Unicode (with a few rarely used languages excluded). And it's mostly possible
+to mix these languages in one file, which is impossible with other encodings.
+
+Unicode can be encoded in several ways. The most popular one is UTF-8, which
+uses one or more bytes for each character and is backwards compatible with
+ASCII. On MS-Windows UTF-16 is also used (previously UCS-2), which uses
+16-bit words. Vim can support all of these encodings, but always uses UTF-8
+internally.
+
+Vim has comprehensive UTF-8 support. It works well in:
+- xterm with UTF-8 support enabled
+- Motif and GTK GUI
+- MS-Windows GUI
+- several other platforms
+
+Double-width characters are supported. This works best with 'guifontwide' or
+'guifontset'. When using only 'guifont' the wide characters are drawn in the
+normal width and a space to fill the gap. Note that the 'guifontset' option
+is no longer relevant in the GTK+ 2 GUI.
+
+ *bom-bytes*
+When reading a file a BOM (Byte Order Mark) can be used to recognize the
+Unicode encoding:
+ EF BB BF UTF-8
+ FE FF UTF-16 big endian
+ FF FE UTF-16 little endian
+ 00 00 FE FF UTF-32 big endian
+ FF FE 00 00 UTF-32 little endian
+
+UTF-8 is the recommended encoding. Note that it's difficult to tell utf-16
+and utf-32 apart. Utf-16 is often used on MS-Windows, utf-32 is not
+widespread as file format.
+
+
+ *mbyte-combining* *mbyte-composing*
+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.
+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.
+If the 'delcombine' option is on, then pressing 'x' will delete the combining
+characters, one at a time, then the base character. But when inserting, you
+type the first character and the following composing characters separately,
+after which they will be joined. The "r" command will not allow you to type a
+combining character, because it doesn't know one is coming. Use "R" instead.
+
+Bytes which are not part of a valid UTF-8 byte sequence are handled like a
+single character and displayed as <xx>, where "xx" is the hex value of the
+byte.
+
+Overlong sequences are not handled specially and displayed like a valid
+character. However, search patterns may not match on an overlong sequence.
+(an overlong sequence is where more bytes are used than required for the
+character.) An exception is NUL (zero) which is displayed as "<00>".
+
+In the file and buffer the full range of Unicode characters can be used (31
+bits). However, displaying only works for the characters present in the
+selected font.
+
+Useful commands:
+- "ga" shows the decimal, hexadecimal and octal value of the character under
+ the cursor. If there are composing characters these are shown too. (If the
+ 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.
+
+
+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
+doesn't always work. See the system specific remarks below, and 'langmenu'.
+
+
+USING UTF-8 IN X-Windows *utf-8-in-xwindows*
+
+Note: This section does not apply to the GTK+ 2 GUI.
+
+You need to specify a font to be used. For double-wide characters another
+font is required, which is exactly twice as wide. There are three ways to do
+this:
+
+1. Set 'guifont' and let Vim find a matching 'guifontwide'
+2. Set 'guifont' and 'guifontwide'
+3. Set 'guifontset'
+
+See the documentation for each option for details. Example: >
+
+ :set guifont=-misc-fixed-medium-r-normal--15-140-75-75-c-90-iso10646-1
+
+You might also want to set the font used for the menus. This only works for
+Motif. Use the ":hi Menu font={fontname}" command for this. |:highlight|
+
+
+TYPING UTF-8 *utf-8-typing*
+
+If you are using X-Windows, you should find an input method that supports
+UTF-8.
+
+If your system does not provide support for typing UTF-8, you can use the
+'keymap' feature. This allows writing a keymap file, which defines a UTF-8
+character as a sequence of ASCII characters. See |mbyte-keymap|.
+
+Another method is to set the current locale to the language you want to use
+and for which you have a XIM available. Then set 'termencoding' to that
+language and Vim will convert the typed characters to 'encoding' for you.
+
+If everything else fails, you can type any character as four hex bytes: >
+
+ CTRL-V u 1234
+
+"1234" is interpreted as a hex number. You must type four characters, prepend
+a zero if necessary.
+
+
+COMMAND ARGUMENTS *utf-8-char-arg*
+
+Commands like |f|, |F|, |t| and |r| take an argument of one character. For
+UTF-8 this argument may include one or two composing characters. These need
+to be produced together with the base character, Vim doesn't wait for the next
+character to be typed to find out if it is a composing character or not.
+Using 'keymap' or |:lmap| is a nice way to type these characters.
+
+The commands that search for a character in a line handle composing characters
+as follows. When searching for a character without a composing character,
+this will find matches in the text with or without composing characters. When
+searching for a character with a composing character, this will only find
+matches with that composing character. It was implemented this way, because
+not everybody is able to type a composing character.
+
+
+==============================================================================
+12. Overview of options *mbyte-options*
+
+These options are relevant for editing multibyte 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.
+
+'fileencoding' Encoding of a file. When it's different from 'encoding'
+ conversion is done when reading or writing the file.
+
+'fileencodings' List of possible encodings of a file. When opening a file
+ these will be tried and the first one that doesn't cause an
+ error is used for 'fileencoding'.
+
+'charconvert' Expression used to convert files from one encoding to another.
+
+'formatoptions' The 'm' flag can be included to have formatting break a line
+ at a multibyte character of 256 or higher. Thus is useful for
+ languages where a sequence of characters can be broken
+ anywhere.
+
+'guifontset' The list of font names used for a multibyte encoding. When
+ this option is not empty, it replaces 'guifont'.
+
+'keymap' Specify the name of a keyboard mapping.
+
+==============================================================================
+
+Contributions specifically for the multibyte features by:
+ Chi-Deok Hwang <hwang@mizi.co.kr>
+ SungHyun Nam <goweol@gmail.com>
+ K.Nagano <nagano@atese.advantest.co.jp>
+ Taro Muraoka <koron@tka.att.ne.jp>
+ Yasuhiro Matsumoto <mattn@mail.goo.ne.jp>
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/message.txt b/runtime/doc/message.txt
new file mode 100644
index 0000000..2e23ac4
--- /dev/null
+++ b/runtime/doc/message.txt
@@ -0,0 +1,889 @@
+*message.txt* For Vim version 9.0. Last change: 2022 Oct 18
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+
+==============================================================================
+1. Old messages *:messages* *:mes* *message-history*
+
+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.
+
+ :mes[sages] Show all messages.
+
+ :{count}mes[sages] Show the {count} most recent messages.
+
+ :mes[sages] clear Clear all messages.
+
+ :{count}mes[sages] clear
+ Clear messages, keeping only the {count} most
+ recent ones.
+
+The number of remembered messages is fixed at 200.
+
+ *g<*
+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. You are then back at the hit-enter prompt and can then scroll further
+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.
+The "g<" output is not redirected.
+
+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.
+
+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:
+
+ E72: Close error on swap file ~
+
+or (translated):
+
+ E72: Errore durante chiusura swap file ~
+
+Use: >
+
+ :help E72
+
+If you are lazy, it also works without the shift key: >
+
+ :help e72
+
+The number in this ID has no meaning.
+
+==============================================================================
+2. Error messages *error-messages* *errors*
+
+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: >
+ :messages
+See `:messages` above.
+
+
+LIST OF MESSAGES
+ *E222* *E228* *E232* *E293* *E298* *E304* *E317*
+ *E318* *E356* *E438* *E439* *E440* *E316* *E320* *E322*
+ *E323* *E341* *E473* *E570* *E685* *E292*
+ Add to read buffer ~
+ makemap: Illegal mode ~
+ Cannot create BalloonEval with both message and callback ~
+ block was not locked ~
+ Didn't get block nr {N}? ~
+ ml_upd_block0(): Didn't get block 0?? ~
+ pointer block id wrong {N} ~
+ Updated too many blocks? ~
+ get_varp ERROR ~
+ u_undo: line numbers wrong ~
+ undo list corrupt ~
+ undo line missing ~
+ ml_get: cannot find line {N} in buffer {nr} {name} ~
+ line number out of range: {N} past the end ~
+ line count wrong in block {N} ~
+ Internal error: lalloc(0, ) ~
+ Internal error: {function} ~
+ Internal error in regexp ~
+ 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|
+
+
+ ATTENTION ~
+ Found a swap file by the name ... ~
+
+See |ATTENTION|.
+
+ *E92*
+ Buffer {N} not found ~
+
+The buffer you requested does not exist. This can also happen when you have
+wiped out a buffer which contains a mark or is referenced in another way.
+|:bwipeout|
+
+ *E95*
+ Buffer with this name already exists ~
+
+You cannot have two buffers with exactly the same name. This includes the
+path leading to the file.
+
+ *E72*
+ Close error on swap file ~
+
+The |swap-file|, that is used to keep a copy of the edited text, could not be
+closed properly. Mostly harmless.
+
+ *E169*
+ Command too recursive ~
+
+This happens when an Ex command executes an Ex command that executes an Ex
+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} ~
+
+The color name {name} is unknown. See |gui-colors| for a list of colors that
+are available on most systems.
+
+ *E1244*
+ Bad color string: {str} ~
+
+The provided color did not conform to the pattern #rrggbb
+
+ *E458*
+ Cannot allocate colormap entry, some colors may be incorrect ~
+
+This means that there are not enough colors available for Vim. It will still
+run, but some of the colors will not appear in the specified color. Try
+stopping other applications that use many colors, or start them after starting
+gvim.
+Browsers are known to consume a lot of colors. You can avoid this with
+netscape by telling it to use its own colormap:
+ netscape -install ~
+Or tell it to limit to a certain number of colors (64 should work well):
+ netscape -ncols 64 ~
+This can also be done with a line in your Xdefaults file:
+ Netscape*installColormap: Yes ~
+or
+ Netscape*maxImageColors: 64 ~
+
+ *E79*
+ Cannot expand wildcards ~
+
+A filename contains a strange combination of characters, which causes Vim to
+attempt expanding wildcards but this fails. This does NOT mean that no
+matching file names could be found, but that the pattern was illegal.
+
+ *E459*
+ Cannot go back to previous directory ~
+
+While expanding a file name, Vim failed to go back to the previously used
+directory. All file names being used may be invalid now! You need to have
+execute permission on the current directory.
+
+ *E190* *E212*
+ Cannot open "{filename}" for writing ~
+ Can't open file for writing ~
+
+For some reason the file you are writing to cannot be created or overwritten.
+The reason could be that you do not have permission to write in the directory
+or the file name is not valid.
+
+ *E166*
+ Can't open linked file for writing ~
+
+You are trying to write to a file which can't be overwritten, and the file is
+a link (either a hard link or a symbolic link). Writing might still be
+possible if the directory that contains the link or the file is writable, but
+Vim now doesn't know if you want to delete the link and write the file in its
+place, or if you want to delete the file itself and write the new file in its
+place. If you really want to write the file under this name, you have to
+manually delete the link or the file, or change the permissions so that Vim
+can overwrite.
+
+ *E46*
+ Cannot change read-only variable "{name}" ~
+
+You are trying to assign a value to an argument of a function |a:var| or a Vim
+internal variable |v:var| which is read-only.
+
+ *E90*
+ Cannot unload last buffer ~
+
+Vim always requires one buffer to be loaded, otherwise there would be nothing
+to display in the window.
+
+ *E40*
+ Can't open errorfile <filename> ~
+
+When using the ":make" or ":grep" commands: The file used to save the error
+messages or grep output cannot be opened. This can have several causes:
+- 'shellredir' has a wrong value.
+- The shell changes directory, causing the error file to be written in another
+ directory. This could be fixed by changing 'makeef', but then the make
+ command is still executed in the wrong directory.
+- 'makeef' has a wrong value.
+- The 'grepprg' or 'makeprg' could not be executed. This cannot always be
+ detected (especially on MS-Windows). Check your $PATH.
+
+
+ Can't open file C:\TEMP\VIoD243.TMP ~
+
+On MS-Windows, this message appears when the output of an external command was
+to be read, but the command didn't run successfully. This can be caused by
+many things. Check the 'shell', 'shellquote', 'shellxquote', 'shellslash' and
+related options. It might also be that the external command was not found,
+there is no different error message for that.
+
+ *E12*
+ Command not allowed from exrc/vimrc in current dir or tag search ~
+
+Some commands are not allowed for security reasons. These commands mostly
+come from a .exrc or .vimrc file in the current directory, or from a tags
+file. Also see 'secure'.
+
+ *E74*
+ Command too complex ~
+
+A mapping resulted in a very long command string. Could be caused by a
+mapping that indirectly calls itself.
+
+
+ CONVERSION ERROR ~
+
+When writing a file and the text "CONVERSION ERROR" appears, this means that
+some bits were lost when converting text from the internally used UTF-8 to the
+format of the file. The file will not be marked unmodified. If you care
+about the loss of information, set the 'fileencoding' option to another value
+that can handle the characters in the buffer and write again. If you don't
+care, you can abandon the buffer or reset the 'modified' option.
+If there is a backup file, when 'writebackup' or 'backup' is set, it will not
+be deleted, so you can move it back into place if you want to discard the
+changes.
+
+ *E302*
+ Could not rename swap file ~
+
+When the file name changes, Vim tries to rename the |swap-file| as well.
+This failed and the old swap file is now still used. Mostly harmless.
+
+ *E43* *E44*
+ Damaged match string ~
+ Corrupted regexp program ~
+
+Something inside Vim went wrong and resulted in a corrupted regexp. If you
+know how to reproduce this problem, please report it. |bugs|
+
+ *E208* *E209* *E210*
+ Error writing to "{filename}" ~
+ Error closing "{filename}" ~
+ Error reading "{filename}" ~
+
+This occurs when Vim is trying to rename a file, but a simple change of file
+name doesn't work. Then the file will be copied, but somehow this failed.
+The result may be that both the original file and the destination file exist
+and the destination file may be incomplete.
+
+
+ Vim: Error reading input, exiting... ~
+
+This occurs when Vim cannot read typed characters while input is required.
+Vim got stuck, the only thing it can do is exit. This can happen when both
+stdin and stderr are redirected and executing a script that doesn't exit Vim.
+
+ *E47*
+ Error while reading errorfile ~
+
+Reading the error file was not possible. This is NOT caused by an error
+message that was not recognized.
+
+ *E80*
+ Error while writing ~
+
+Writing a file was not completed successfully. The file is probably
+incomplete.
+
+ *E13* *E189*
+ File exists (add ! to override) ~
+ "{filename}" exists (add ! to override) ~
+
+You are protected from accidentally overwriting a file. When you want to
+write anyway, use the same command, but add a "!" just after the command.
+Example: >
+ :w /tmp/test
+changes to: >
+ :w! /tmp/test
+<
+ *E768*
+ Swap file exists: {filename} (:silent! overrides) ~
+
+You are protected from overwriting a file that is being edited by Vim. This
+happens when you use ":w! filename" and a swapfile is found.
+- If the swapfile was left over from an old crashed edit session you may want
+ to delete the swapfile. Edit {filename} to find out information about the
+ swapfile.
+- If you want to write anyway prepend ":silent!" to the command. For example: >
+ :silent! w! /tmp/test
+< The special command is needed, since you already added the ! for overwriting
+ an existing file.
+
+ *E139*
+ File is loaded in another buffer ~
+
+You are trying to write a file under a name which is also used in another
+buffer. This would result in two versions of the same file.
+
+ *E142*
+ File not written: Writing is disabled by 'write' option ~
+
+The 'write' option is off. This makes all commands that try to write a file
+generate this message. This could be caused by a |-m| commandline argument.
+You can switch the 'write' option on with ":set write".
+
+ *E25*
+ GUI cannot be used: Not enabled at compile time ~
+
+You are running a version of Vim that doesn't include the GUI code. Therefore
+"gvim" and ":gui" don't work.
+
+ *E49*
+ Invalid scroll size ~
+
+This is caused by setting an invalid value for the 'scroll', 'scrolljump' or
+'scrolloff' options.
+
+ *E17*
+ "{filename}" is a directory ~
+
+You tried to write a file with the name of a directory. This is not possible.
+You probably need to append a file name.
+
+ *E19*
+ Mark has invalid line number ~
+
+You are using a mark that has a line number that doesn't exist. This can
+happen when you have a mark in another file, and some other program has
+deleted lines from it.
+
+ *E219* *E220*
+ Missing {. ~
+ Missing }. ~
+
+Using a {} construct in a file name, but there is a { without a matching } or
+the other way around. It should be used like this: {foo,bar}. This matches
+"foo" and "bar".
+
+ *E315*
+ ml_get: invalid lnum: {number} ~
+
+This is an internal Vim error. Please try to find out how it can be
+reproduced, and submit a bug report |bugreport.vim|.
+
+ *E173*
+ {number} more files to edit ~
+
+You are trying to exit, while the last item in the argument list has not been
+edited. This protects you from accidentally exiting when you still have more
+files to work on. See |argument-list|. If you do want to exit, just do it
+again and it will work.
+
+ *E23* *E194*
+ No alternate file ~
+ No alternate file name to substitute for '#' ~
+
+The alternate file is not defined yet. See |alternate-file|.
+
+ *E32*
+ No file name ~
+
+The current buffer has no name. To write it, use ":w fname". Or give the
+buffer a name with ":file fname".
+
+ *E141*
+ No file name for buffer {number} ~
+
+One of the buffers that was changed does not have a file name. Therefore it
+cannot be written. You need to give the buffer a file name: >
+ :buffer {number}
+ :file {filename}
+<
+ *E33*
+ No previous substitute regular expression ~
+
+When using the '~' character in a pattern, it is replaced with the previously
+used pattern in a ":substitute" command. This fails when no such command has
+been used yet. See |/~|. This also happens when using ":s/pat/%/", where the
+"%" stands for the previous substitute string.
+
+ *E35*
+ No previous regular expression ~
+
+When using an empty search pattern, the previous search pattern is used. But
+that is not possible if there was no previous search.
+
+ *E24*
+ No such abbreviation ~
+
+You have used an ":unabbreviate" command with an argument which is not an
+existing abbreviation. All variations of this command give the same message:
+":cunabbrev", ":iunabbrev", etc. Check for trailing white space.
+
+
+ /dev/dsp: No such file or directory ~
+
+Only given for GTK GUI with Gnome support. Gnome tries to use the audio
+device and it isn't present. You can ignore this error.
+
+ *E31*
+ No such mapping ~
+
+You have used an ":unmap" command with an argument which is not an existing
+mapping. All variations of this command give the same message: ":cunmap",
+":unmap!", etc. A few hints:
+- Check for trailing white space.
+- If the mapping is buffer-local you need to use ":unmap <buffer>".
+ |:map-<buffer>|
+
+ *E37* *E89*
+ No write since last change (add ! to override) ~
+ No write since last change for buffer {N} (add ! to override) ~
+
+You are trying to |abandon| a file that has changes. Vim protects you from
+losing your work. You can either write the changed file with ":w", or, if you
+are sure, |abandon| it anyway, and lose all the changes. This can be done by
+adding a '!' character just after the command you used. Example: >
+ :e other_file
+changes to: >
+ :e! other_file
+<
+ *E162*
+ No write since last change for buffer "{name}" ~
+
+This appears when you try to exit Vim while some buffers are changed. You
+will either have to write the changed buffer (with |:w|), or use a command to
+abandon the buffer forcefully, e.g., with ":qa!". Careful, make sure you
+don't throw away changes you really want to keep. You might have forgotten
+about a buffer, especially when 'hidden' is set.
+
+
+ [No write since last change] ~
+
+This appears when executing a shell command while at least one buffer was
+changed. To avoid the message reset the 'warn' option.
+
+ *E38*
+ Null argument ~
+
+Something inside Vim went wrong and resulted in a NULL pointer. If you know
+how to reproduce this problem, please report it. |bugs|
+
+ *E41* *E82* *E83* *E342*
+ Out of memory! ~
+ Out of memory! (allocating {number} bytes) ~
+ Cannot allocate any buffer, exiting... ~
+ Cannot allocate buffer, using other one... ~
+
+Oh, oh. You must have been doing something complicated, or some other program
+is consuming your memory. Be careful! Vim is not completely prepared for an
+out-of-memory situation. First make sure that any changes are saved. Then
+try to solve the memory shortage. To stay on the safe side, exit Vim and
+start again.
+
+If this happens while Vim is still initializing, editing files is very
+unlikely to work, therefore Vim will exit with value 123.
+
+Buffers are only partly kept in memory, thus editing a very large file is
+unlikely to cause an out-of-memory situation. Undo information is completely
+in memory, you can reduce that with these options:
+- 'undolevels' Set to a low value, or to -1 to disable undo completely. This
+ helps for a change that affects all lines.
+- 'undoreload' Set to zero to disable.
+
+ *E339*
+ Pattern too long ~
+
+This happens on systems with 16 bit ints: The compiled regexp pattern is
+longer than about 65000 characters. Try using a shorter pattern.
+It also happens when the offset of a rule doesn't fit in the space available.
+Try simplifying the pattern.
+
+ *E45*
+ 'readonly' option is set (add ! to override) ~
+
+You are trying to write a file that was marked as read-only. To write the
+file anyway, either reset the 'readonly' option, or add a '!' character just
+after the command you used. Example: >
+ :w
+changes to: >
+ :w!
+<
+ *E294* *E295* *E301*
+ Read error in swap file ~
+ Seek error in swap file read ~
+ Oops, lost the swap file!!! ~
+
+Vim tried to read text from the |swap-file|, but something went wrong. The
+text in the related buffer may now be corrupted! Check carefully before you
+write a buffer. You may want to write it in another file and check for
+differences.
+
+ *E192*
+ Recursive use of :normal too deep ~
+
+You are using a ":normal" command, whose argument again uses a ":normal"
+command in a recursive way. This is restricted to 'maxmapdepth' levels. This
+example illustrates how to get this message: >
+ :map gq :normal gq<CR>
+If you type "gq", it will execute this mapping, which will call "gq" again.
+
+ *E22*
+ Scripts nested too deep ~
+
+Scripts can be read with the "-s" command-line argument and with the
+`:source!` 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 and stops with this error message.
+
+ *E319*
+ Sorry, 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?) ~
+
+This message appears when Vim is trying to open a swap file and finds it
+already exists or finds a symbolic link in its place. This shouldn't happen,
+because Vim already checked that the file doesn't exist. Either someone else
+opened the same file at exactly the same moment (very unlikely) or someone is
+attempting a symlink attack (could happen when editing a file in /tmp or when
+'directory' starts with "/tmp", which is a bad choice).
+
+ *E432*
+ Tags file not sorted: {file name} ~
+
+Vim (and Vi) expect tags files to be sorted in ASCII order. Binary searching
+can then be used, which is a lot faster than a linear search. If your tags
+files are not properly sorted, reset the |'tagbsearch'| option.
+This message is only given when Vim detects a problem when searching for a
+tag. Sometimes this message is not given, even though the tags file is not
+properly sorted.
+
+ *E424*
+ Too many different highlighting attributes in use ~
+
+Vim can only handle about 223 different kinds of highlighting. If you run
+into this limit, you have used too many |:highlight| commands with different
+arguments. A ":highlight link" is not counted.
+
+ *E77*
+ Too many file names ~
+
+When expanding file names, more than one match was found. Only one match is
+allowed for the command that was used.
+
+ *E303*
+ Unable to open swap file for "{filename}", recovery impossible ~
+
+Vim was not able to create a swap file. You can still edit the file, but if
+Vim unexpectedly exits the changes will be lost. And Vim may consume a lot of
+memory when editing a big file. You may want to change the 'directory' option
+to avoid this error. This error is not given when 'directory' is empty. See
+|swap-file|.
+
+ *E140*
+ Use ! to write partial buffer ~
+
+When using a range to write part of a buffer, it is unusual to overwrite the
+original file. It is probably a mistake (e.g., when Visual mode was active
+when using ":w"), therefore Vim requires using a ! after the command, e.g.:
+":3,10w!".
+
+
+ Warning: Cannot convert string "<Key>Escape,_Key_Cancel" to type ~
+ VirtualBinding ~
+
+Messages like this appear when starting up. This is not a Vim problem, your
+X11 configuration is wrong. You can find a hint on how to solve this here:
+http://groups.yahoo.com/group/solarisonintel/message/12179.
+[this URL is no longer valid]
+
+ *W10*
+ Warning: Changing a readonly file ~
+
+The file is read-only and you are making a change to it anyway. You can use
+the |FileChangedRO| autocommand event to avoid this message (the autocommand
+must reset the 'readonly' option). See 'modifiable' to completely disallow
+making changes to a file.
+This message is only given for the first change after 'readonly' has been set.
+
+ *W13*
+ Warning: File "{filename}" has been created after editing started ~
+
+You are editing a file in Vim when it didn't exist, but it does exist now.
+You will have to decide if you want to keep the version in Vim or the newly
+created file. This message is not given when 'buftype' is not empty.
+
+ *W11*
+ Warning: File "{filename}" has changed since editing started ~
+
+The file which you have started editing has got another timestamp and the
+contents changed (more precisely: When reading the file again with the current
+option settings and autocommands you would end up with different text). This
+probably means that some other program changed the file. You will have to
+find out what happened, and decide which version of the file you want to keep.
+Set the 'autoread' option if you want to do this automatically.
+This message is not given when 'buftype' is not empty.
+Also see the |FileChangedShell| autocommand.
+
+There is one situation where you get this message even though there is nothing
+wrong: If you save a file in Windows on the day the daylight saving time
+starts. It can be fixed in one of these ways:
+- Add this line in your autoexec.bat: >
+ SET TZ=-1
+< Adjust the "-1" for your time zone.
+- Disable "automatically adjust clock for daylight saving changes".
+- 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 ~
+
+Like the above, and the buffer for the file was changed in this Vim as well.
+You will have to decide if you want to keep the version in this Vim or the one
+on disk. This message is not given when 'buftype' is not empty.
+
+ *W16*
+ Warning: Mode of file "{filename}" has changed since editing started ~
+
+When the timestamp for a buffer was changed and the contents are still the
+same but the mode (permissions) have changed. This usually occurs when
+checking out a file from a version control system, which causes the read-only
+bit to be reset. It should be safe to reload the file. Set 'autoread' to
+automatically reload the file.
+
+ *E211*
+ File "{filename}" no longer available ~
+
+The file which you have started editing has disappeared, or is no longer
+accessible. Make sure you write the buffer somewhere to avoid losing
+changes. This message is not given when 'buftype' is not empty.
+
+ *W14*
+ Warning: List of file names overflow ~
+
+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 ~
+
+This mostly happens when the disk is full. Vim could not write text into the
+|swap-file|. It's not directly harmful, but when Vim unexpectedly exits some
+text may be lost without recovery being possible. Vim might run out of memory
+when this problem persists.
+
+ *connection-refused*
+ Xlib: connection to "<machine-name:0.0" refused by server ~
+
+This happens when Vim tries to connect to the X server, but the X server does
+not allow a connection. The connection to the X server is needed to be able
+to restore the title and for the xterm clipboard support. Unfortunately this
+error message cannot be avoided, except by disabling the |+xterm_clipboard|
+and |+X11| features.
+
+ *E10*
+ \\ should be followed by /, ? or & ~
+
+A command line started with a backslash or the range of a command contained a
+backslash in a wrong place. This is often caused by command-line continuation
+being disabled. Remove the 'C' flag from the 'cpoptions' option to enable it.
+Or use ":set nocp".
+
+ *E471*
+ Argument required ~
+
+This happens when an Ex command with mandatory argument(s) was executed, but
+no argument has been specified.
+
+ *E474* *E475* *E983*
+ Invalid argument ~
+ Invalid argument: {arg} ~
+ Duplicate argument: {arg} ~
+
+An Ex command or function has been executed, but an invalid argument has been
+specified.
+
+ *E488*
+ Trailing characters ~
+ Trailing characters: {text} ~
+
+An argument has been added to an Ex command that does not permit one.
+Or the argument has invalid characters and has not been recognized.
+
+ *E477* *E478*
+ No ! allowed ~
+ Don't panic! ~
+
+You have added a "!" after an Ex command that doesn't permit one.
+
+ *E481*
+ No range allowed ~
+
+A range was specified for an Ex command that doesn't permit one. See
+|cmdline-ranges|.
+
+ *E482* *E483*
+ Can't create file {filename} ~
+ Can't get temp file name ~
+
+Vim cannot create a temporary file.
+
+ *E484* *E485*
+ Can't open file {filename} ~
+ Can't read file {filename} ~
+
+Vim cannot read a temporary file. Especially on Windows, this can be caused
+by wrong escaping of special characters for cmd.exe; the approach was
+changed with patch 7.3.443. Try using |shellescape()| for all shell arguments
+given to |system()|, or explicitly add escaping with ^. Also see
+'shellxquote' and 'shellxescape'.
+
+ *E464*
+ Ambiguous use of user-defined command ~
+
+There are two user-defined commands with a common name prefix, and you used
+Command-line completion to execute one of them. |user-cmd-ambiguous|
+Example: >
+ :command MyCommand1 echo "one"
+ :command MyCommand2 echo "two"
+ :MyCommand
+<
+ *E492*
+ Not an editor command ~
+
+You tried to execute a command that is neither an Ex command nor
+a user-defined command.
+
+ *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
+<
+ *E928* *E889*
+ E928: String required ~
+ E889: Number required ~
+
+These happen when a value or expression is used that does not have the
+expected type.
+
+==============================================================================
+3. Messages *messages*
+
+This is an (incomplete) overview of various messages that Vim gives:
+
+ *hit-enter* *press-enter* *hit-return*
+ *press-return* *hit-enter-prompt*
+
+ Press ENTER or type command to continue ~
+
+This message is given when there is something on the screen for you to read,
+and the screen is about to be redrawn:
+- After executing an external command (e.g., ":!ls" and "=").
+- Something is displayed on the status line that is longer than the width of
+ the window, or runs into the 'showcmd' or 'ruler' output.
+
+-> Press <Enter> or <Space> to redraw the screen and continue, without that
+ key being used otherwise.
+-> Press ':' or any other Normal mode command character to start that command.
+ Note that after an external command some special keys, such as the cursor
+ keys, may not work normally, because the terminal is still set to a state
+ for executing the external command.
+-> Press 'k', <Up>, 'u', 'b' or 'g' to scroll back in the messages. This
+ works the same way as at the |more-prompt|. Only works when 'compatible'
+ is off and 'more' is on.
+-> Pressing 'j', 'f', 'd' or <Down> is ignored when messages scrolled off the
+ top of the screen, 'compatible' is off and 'more' is on, to avoid that
+ typing one 'j' or 'f' too many causes the messages to disappear.
+-> Press <C-Y> to copy (yank) a modeless selection to the clipboard register.
+-> Use a menu. The characters defined for Cmdline-mode are used.
+-> When 'mouse' contains the 'r' flag, clicking the left mouse button works
+ like pressing <Space>. This makes it impossible to select text though.
+-> For the GUI clicking the left mouse button in the last line works like
+ pressing <Space>.
+
+If you accidentally hit <Enter> or <Space> and you want to see the displayed
+text then use |g<|. This only works when 'more' is set.
+
+To reduce the number of hit-enter prompts:
+- Set 'cmdheight' to 2 or higher.
+- Add flags to 'shortmess'.
+- Reset 'showcmd' and/or 'ruler'.
+- Make sure `:echo` text is shorter than or equal to |v:echospace| screen
+ cells.
+
+If your script causes the hit-enter prompt and you don't know why, you may
+find the |v:scrollstart| variable useful.
+
+Also see 'mouse'. The hit-enter message is highlighted with the |hl-Question|
+group.
+
+
+ *more-prompt* *pager*
+ -- More -- ~
+ -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit ~
+
+This message is given when the screen is filled with messages. It is only
+given when the 'more' option is on. It is highlighted with the |hl-MoreMsg|
+group.
+
+Type effect ~
+ <CR> or <NL> or j or <Down> one more line
+ d down a page (half a screen)
+ <Space> or f or <PageDown> down a screen
+ G down all the way, until the hit-enter
+ prompt
+
+ <BS> or k or <Up> one line back
+ u up a page (half a screen)
+ b or <PageUp> back a screen
+ g back to the start
+
+ q, <Esc> or CTRL-C stop the listing
+ : stop the listing and enter a
+ command-line
+ <C-Y> yank (copy) a modeless selection to
+ the clipboard ("* and "+ registers)
+ {menu-entry} what the menu is defined to in
+ Cmdline-mode.
+ <LeftMouse> next page (*)
+
+Any other key causes the meaning of the keys to be displayed.
+
+(*) Clicking the left mouse button only works:
+ - For the GUI: in the last line of the screen.
+ - When 'r' is included in 'mouse' (but then selecting text won't work).
+
+
+Note: The typed key is directly obtained from the terminal, it is not mapped
+and typeahead is ignored.
+
+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:noet:ft=help:norl:
diff --git a/runtime/doc/mlang.txt b/runtime/doc/mlang.txt
new file mode 100644
index 0000000..8997e1c
--- /dev/null
+++ b/runtime/doc/mlang.txt
@@ -0,0 +1,222 @@
+*mlang.txt* For Vim version 9.0. Last change: 2022 Sep 17
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Multi-language features *multilang* *multi-lang*
+
+This is about using messages and menus in various languages. For editing
+multibyte 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.
+
+{not available when compiled without the |+multi_lang| feature}
+
+==============================================================================
+1. Messages *multilang-messages*
+
+Vim picks up the locale from the environment. In most cases this means Vim
+will use the language that you prefer, unless it's not available.
+
+To see a list of supported locale names on your system, look in one of these
+directories (for Unix):
+ /usr/lib/locale ~
+ /usr/share/locale ~
+Unfortunately, upper/lowercase differences matter. Also watch out for the
+use of "-" and "_".
+
+ *:lan* *:lang* *:language* *E197*
+:lan[guage]
+:lan[guage] mes[sages]
+:lan[guage] cty[pe]
+:lan[guage] tim[e]
+:lan[guage] col[late]
+ Print the current language (aka locale).
+ With the "messages" argument the language used for
+ messages is printed. Technical: LC_MESSAGES.
+ With the "ctype" argument the language used for
+ character encoding is printed. Technical: LC_CTYPE.
+ With the "time" argument the language used for
+ strftime() is printed. Technical: LC_TIME.
+ With the "collate" argument the language used for
+ collation order is printed. Technical: LC_COLLATE.
+ Without argument all parts of the locale are printed
+ (this is system dependent).
+ The current language can also be obtained with the
+ |v:lang|, |v:ctype|, |v:collate| and |v:lc_time|
+ variables.
+
+:lan[guage] {name}
+:lan[guage] mes[sages] {name}
+:lan[guage] cty[pe] {name}
+:lan[guage] tim[e] {name}
+:lan[guage] col[late] {name}
+ Set the current language (aka locale) to {name}.
+ The locale {name} must be a valid locale on your
+ system. Some systems accept aliases like "en" or
+ "en_US", but some only accept the full specification
+ like "en_US.ISO_8859-1". On Unix systems you can use
+ this command to see what locales are supported: >
+ :!locale -a
+< With the "messages" argument the language used for
+ messages is set. This can be different when you want,
+ for example, English messages while editing Japanese
+ text. This sets $LC_MESSAGES.
+ With the "ctype" argument the language used for
+ character encoding is set. This affects the libraries
+ that Vim was linked with. It's unusual to set this to
+ a different value from 'encoding' or "C". This sets
+ $LC_CTYPE.
+ With the "time" argument the language used for time
+ and date messages is set. This affects strftime().
+ This sets $LC_TIME.
+ With the "collate" argument the language used for the
+ collation order is set. This affects sorting of
+ characters. This sets $LC_COLLATE.
+ Without an argument all are set, and additionally
+ $LANG is set.
+ If available the LC_NUMERIC value will always be set
+ to "C", so that floating point numbers use '.' as the
+ decimal point.
+ This will make a difference for items that depend on
+ the language (some messages, time and date format).
+ Not fully supported on all systems
+ If this fails there will be an error message. If it
+ succeeds there is no message. Example: >
+ :language
+ Current language: C
+ :language de_DE.ISO_8859-1
+ :language mes
+ Current messages language: de_DE.ISO_8859-1
+ :lang mes en
+<
+
+MS-WINDOWS MESSAGE TRANSLATIONS *win32-gettext*
+
+If you used the self-installing .exe file, message translations should work
+already. Otherwise get the libintl.dll file if you don't have it yet:
+
+ http://sourceforge.net/projects/gettext
+Or:
+ https://mlocati.github.io/gettext-iconv-windows/
+
+This also contains tools xgettext, msgformat and others.
+
+libintl.dll should be placed in same directory as (g)vim.exe, or one of the
+directories listed in the PATH environment value. Vim also looks for the
+alternate names "libintl-8.dll" and "intl.dll".
+
+Message files (vim.mo) have to be placed in "$VIMRUNTIME/lang/xx/LC_MESSAGES",
+where "xx" is the abbreviation of the language (mostly two letters).
+
+If you write your own translations you need to generate the .po file and
+convert it to a .mo file. You need to get the source distribution and read
+the file "src/po/README.txt".
+
+To overrule the automatic choice of the language, set the $LANG variable to
+the language of your choice. use "en" to disable translations. >
+
+ :let $LANG = 'ja'
+
+(text for Windows by Muraoka Taro)
+
+==============================================================================
+2. Menus *multilang-menus*
+
+See |45.2| for the basics, esp. using 'langmenu'.
+
+Note that if changes have been made to the menus after the translation was
+done, some of the menus may be shown in English. Please try contacting the
+maintainer of the translation and ask him to update it. You can find the
+name and e-mail address of the translator in
+"$VIMRUNTIME/lang/menu_<lang>.vim".
+
+To set the font (or fontset) to use for the menus, use the |:highlight|
+command. Example: >
+
+ :highlight Menu font=k12,r12
+
+
+ALIAS LOCALE NAMES
+
+Unfortunately, the locale names are different on various systems, even though
+they are for the same language and encoding. If you do not get the menu
+translations you expected, check the output of this command: >
+
+ echo v:lang
+
+Now check the "$VIMRUNTIME/lang" directory for menu translation files that use
+a similar language. A difference in a "-" being a "_" already causes a file
+not to be found! Another common difference to watch out for is "iso8859-1"
+versus "iso_8859-1". Fortunately Vim makes all names lowercase, thus you
+don't have to worry about case differences. Spaces are changed to
+underscores, to avoid having to escape them.
+
+If you find a menu translation file for your language with a different name,
+create a file in your own runtime directory to load that one. The name of
+that file could be: >
+
+ ~/.vim/lang/menu_<v:lang>.vim
+
+Check the 'runtimepath' option for directories which are searched. In that
+file put a command to load the menu file with the other name: >
+
+ runtime lang/menu_<other_lang>.vim
+
+
+TRANSLATING MENUS
+
+If you want to do your own translations, you can use the |:menutrans| command,
+explained below. It is recommended to put the translations for one language
+in a Vim script. For a language that has no translation yet, please consider
+becoming the maintainer and make your translations available to all Vim users.
+Send an e-mail to the Vim maintainer <maintainer@vim.org>.
+
+ *:menut* *:menutrans* *:menutranslate*
+:menut[ranslate] clear
+ Clear all menu translations.
+
+:menut[ranslate] {english} {mylang}
+ Translate menu name {english} to {mylang}. All
+ 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.
+
+To try out your translations you first have to remove all menus. This is how
+you can do it without restarting Vim: >
+ :source $VIMRUNTIME/delmenu.vim
+ :source <your-new-menu-file>
+ :source $VIMRUNTIME/menu.vim
+
+Each part of a menu path is translated separately. The result is that when
+"Help" is translated to "Hilfe" and "Overview" to "Überblick" then
+"Help.Overview" will be translated to "Hilfe.Überblick".
+
+==============================================================================
+3. Scripts *multilang-scripts*
+
+In Vim scripts you can use the |v:lang| variable to get the current language
+(locale). The default value is "C" or comes from the $LANG environment
+variable.
+
+The following example shows how this variable is used in a simple way, to make
+a message adapt to language preferences of the user, >
+
+ :if v:lang =~ "de_DE"
+ : echo "Guten Morgen"
+ :else
+ : echo "Good morning"
+ :endif
+<
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/motion.txt b/runtime/doc/motion.txt
new file mode 100644
index 0000000..263c4f3
--- /dev/null
+++ b/runtime/doc/motion.txt
@@ -0,0 +1,1353 @@
+*motion.txt* For Vim version 9.0. Last change: 2022 Sep 26
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Cursor motions *cursor-motions* *navigation*
+
+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
+|CTRL-G| or the "g CTRL-G" command |g_CTRL-G|. If you set the 'ruler' option,
+the cursor position is continuously shown in the status line (which slows down
+Vim a little).
+
+Experienced users prefer the hjkl keys because they are always right under
+their fingers. Beginners often prefer the arrow keys, because they do not
+know what the hjkl keys do. The mnemonic value of hjkl is clear from looking
+at the keyboard. Think of j as an arrow pointing downwards.
+
+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).
+
+==============================================================================
+1. Motions and operators *operator*
+
+The motion commands can be used after an operator command, to have the command
+operate on the text that was moved over. That is the text between the cursor
+position before and after the motion. Operators are generally used to delete
+or change text. The following operators are available:
+
+ |c| c change
+ |d| d delete
+ |y| y yank into register (does not change the text)
+ |~| ~ swap case (only if 'tildeop' is set)
+ |g~| g~ swap case
+ |gu| gu make lowercase
+ |gU| gU make uppercase
+ |!| ! filter through an external program
+ |=| = filter through 'equalprg' or C-indenting if empty
+ |gq| gq text formatting
+ |gw| gw text formatting with no cursor movement
+ |g?| g? ROT13 encoding
+ |>| > shift right
+ |<| < shift left
+ |zf| zf define a fold
+ |g@| g@ call function set with the 'operatorfunc' option
+ *motion-count-multiplied*
+If the motion includes a count and the operator also had a count before it,
+the two counts are multiplied. For example: "2d3w" deletes six words.
+ *operator-doubled*
+When doubling the operator it operates on a line. When using a count, before
+or after the first character, that many lines are operated upon. Thus `3dd`
+deletes three lines. A count before and after the first character is
+multiplied, thus `2y3y` yanks six lines.
+
+After applying the operator the cursor is mostly left at the start of the text
+that was operated upon. For example, "yfe" doesn't move the cursor, but "yFe"
+moves the cursor leftwards to the "e" where the yank started.
+
+ *linewise* *characterwise*
+The operator either affects whole lines, or the characters between the start
+and end position. Generally, motions that move between lines affect lines
+(are linewise), and motions that move within a line affect characters (are
+characterwise). However, there are some exceptions.
+
+ *exclusive* *inclusive*
+A character motion is either inclusive or exclusive. When inclusive, the
+start and end position of the motion are included in the operation. When
+exclusive, the last character towards the end of the buffer is not included.
+Linewise motions always include the start and end position.
+
+Which motions are linewise, inclusive or exclusive is mentioned with the
+command. There are however, two general exceptions:
+1. If the motion is exclusive and the end of the motion is in column 1, the
+ end of the motion is moved to the end of the previous line and the motion
+ becomes inclusive. Example: "}" moves to the first line after a paragraph,
+ but "d}" will not include that line.
+ *exclusive-linewise*
+2. If the motion is exclusive, the end of the motion is in column 1 and the
+ start of the motion was at or before the first non-blank in the line, the
+ motion becomes linewise. Example: If a paragraph begins with some blanks
+ and you do "d}" while standing on the first non-blank, all the lines of
+ the paragraph are deleted, including the blanks. If you do a put now, the
+ deleted lines will be inserted below the cursor position.
+
+Note that when the operator is pending (the operator command is typed, but the
+motion isn't yet), a special set of mappings can be used. See |:omap|.
+
+Instead of first giving the operator and then a motion you can use Visual
+mode: mark the start of the text with "v", move the cursor to the end of the
+text that is to be affected and then hit the operator. The text between the
+start and the cursor position is highlighted, so you can see what text will
+be operated upon. This allows much more freedom, but requires more key
+strokes and has limited redo functionality. See the chapter on Visual mode
+|Visual-mode|.
+
+You can use a ":" command for a motion. For example "d:call FindEnd()".
+But this can't be repeated with "." if the command is more than one line.
+This can be repeated: >
+ d:call search("f")<CR>
+This cannot be repeated: >
+ d:if 1<CR>
+ call search("f")<CR>
+ endif<CR>
+Note that when using ":" any motion becomes characterwise exclusive.
+
+ *forced-motion*
+FORCING A MOTION TO BE LINEWISE, CHARACTERWISE OR BLOCKWISE
+
+When a motion is not of the type you would like to use, you can force another
+type by using "v", "V" or CTRL-V just after the operator.
+Example: >
+ dj
+deletes two lines >
+ dvj
+deletes from the cursor position until the character below the cursor >
+ d<C-V>j
+deletes the character under the cursor and the character below the cursor. >
+
+Be careful with forcing a linewise movement to be used characterwise or
+blockwise, the column may not always be defined.
+
+ *o_v*
+v When used after an operator, before the motion command: Force
+ the operator to work characterwise, also when the motion is
+ linewise. If the motion was linewise, it will become
+ |exclusive|.
+ If the motion already was characterwise, toggle
+ inclusive/exclusive. This can be used to make an exclusive
+ motion inclusive and an inclusive motion exclusive.
+
+ *o_V*
+V When used after an operator, before the motion command: Force
+ the operator to work linewise, also when the motion is
+ characterwise.
+
+ *o_CTRL-V*
+CTRL-V When used after an operator, before the motion command: Force
+ the operator to work blockwise. This works like Visual block
+ mode selection, with the corners defined by the cursor
+ position before and after the motion.
+
+==============================================================================
+2. Left-right motions *left-right-motions*
+
+These commands move the cursor to the specified column in the current line.
+They stop at the first column and at the end of the line, except "$", which
+may move to one of the next lines. See 'whichwrap' option to make some of the
+commands move across line boundaries.
+
+h or *h*
+<Left> or *<Left>*
+CTRL-H or *CTRL-H* *<BS>*
+<BS> [count] characters to the left. |exclusive| motion.
+ Note: If you prefer <BS> to delete a character, use
+ the mapping:
+ :map CTRL-V<BS> X
+ (to enter "CTRL-V<BS>" type the CTRL-V key, followed
+ by the <BS> key)
+ See |:fixdel| if the <BS> key does not do what you
+ want.
+
+l or *l*
+<Right> or *<Right>* *<Space>*
+<Space> [count] characters to the right. |exclusive| motion.
+ See the 'whichwrap' option for adjusting the behavior
+ at end of line
+
+ *0*
+0 To the first character of the line. |exclusive|
+ motion.
+
+ *<Home>* *<kHome>*
+<Home> To the first character of the line. |exclusive|
+ motion. When moving up or down next, stay in same
+ TEXT column (if possible). Most other commands stay
+ in the same SCREEN column. <Home> works like "1|",
+ which differs from "0" when the line starts with a
+ <Tab>.
+
+ *^*
+^ To the first non-blank character of the line.
+ |exclusive| motion. Any count is ignored.
+
+ *$* *<End>* *<kEnd>*
+$ or <End> To the end of the line. When a count is given also go
+ [count - 1] lines downward, or as far is possible.
+ |inclusive| motion. If a count of 2 or larger is
+ given and the cursor is on the last line, that is an
+ error and the cursor doesn't move.
+ In Visual mode the cursor goes to just after the last
+ character in the line.
+ When 'virtualedit' is active, "$" may move the cursor
+ back from past the end of the line to the last
+ character in the line.
+
+ *g_*
+g_ To the last non-blank character of the line and
+ [count - 1] lines downward |inclusive|.
+
+ *g0* *g<Home>*
+g0 or g<Home> When lines wrap ('wrap' on): To the first character of
+ the screen line. |exclusive| motion. Differs from
+ "0" when a line is wider than the screen.
+ When lines don't wrap ('wrap' off): To the leftmost
+ character of the current line that is on the screen.
+ Differs from "0" when the first character of the line
+ is not on the screen.
+
+ *g^*
+g^ When lines wrap ('wrap' on): To the first non-blank
+ character of the screen line. |exclusive| motion.
+ Differs from "^" when a line is wider than the screen.
+ When lines don't wrap ('wrap' off): To the leftmost
+ non-blank character of the current line that is on the
+ screen. Differs from "^" when the first non-blank
+ character of the line is not on the screen.
+
+ *gm*
+gm Like "g0", but half a screenwidth to the right (or as
+ much as possible).
+
+ *gM*
+gM Like "g0", but to halfway the text of the line.
+ With a count: to this percentage of text in the line.
+ Thus "10gM" is near the start of the text and "90gM"
+ is near the end of the text.
+
+ *g$* *g<End>*
+g$ or g<End> When lines wrap ('wrap' on): To the last character of
+ the screen line and [count - 1] screen lines downward
+ |inclusive|. Differs from "$" when a line is wider
+ than the screen.
+ When lines don't wrap ('wrap' off): To the rightmost
+ character of the current line that is visible on the
+ screen. Differs from "$" when the last character of
+ the line is not on the screen or when a count is used.
+ Additionally, vertical movements keep the column,
+ instead of going to the end of the line.
+ When 'virtualedit' is enabled moves to the end of the
+ screen line.
+
+ *bar*
+| To screen column [count] in the current line.
+ |exclusive| motion. Ceci n'est pas une pipe.
+
+ *f*
+f{char} To [count]'th occurrence of {char} to the right. The
+ cursor is placed on {char} |inclusive|.
+ {char} can be entered as a digraph |digraph-arg|.
+ When 'encoding' is set to Unicode, composing
+ characters may be used, see |utf-8-char-arg|.
+ |:lmap| mappings apply to {char}. The CTRL-^ command
+ in Insert mode can be used to switch this on/off
+ |i_CTRL-^|.
+
+ *F*
+F{char} To the [count]'th occurrence of {char} to the left.
+ The cursor is placed on {char} |exclusive|.
+ {char} can be entered like with the |f| command.
+
+ *t*
+t{char} Till before [count]'th occurrence of {char} to the
+ right. The cursor is placed on the character left of
+ {char} |inclusive|.
+ {char} can be entered like with the |f| command.
+
+ *T*
+T{char} Till after [count]'th occurrence of {char} to the
+ left. The cursor is placed on the character right of
+ {char} |exclusive|.
+ {char} can be entered like with the |f| command.
+
+ *;*
+; Repeat latest f, t, F or T [count] times. See |cpo-;|
+
+ *,*
+, Repeat latest f, t, F or T in opposite direction
+ [count] times. See also |cpo-;|
+
+==============================================================================
+3. Up-down motions *up-down-motions*
+
+k or *k*
+<Up> or *<Up>* *CTRL-P*
+CTRL-P [count] lines upward |linewise|.
+
+j or *j*
+<Down> or *<Down>*
+CTRL-J or *CTRL-J*
+<NL> or *<NL>* *CTRL-N*
+CTRL-N [count] lines downward |linewise|.
+
+gk or *gk* *g<Up>*
+g<Up> [count] display lines upward. |exclusive| motion.
+ Differs from 'k' when lines wrap, and when used with
+ an operator, because it's not linewise.
+
+gj or *gj* *g<Down>*
+g<Down> [count] display lines downward. |exclusive| motion.
+ Differs from 'j' when lines wrap, and when used with
+ an operator, because it's not linewise.
+
+ *-*
+- <minus> [count] lines upward, on the first non-blank
+ character |linewise|.
+
++ or *+*
+CTRL-M or *CTRL-M* *<CR>*
+<CR> [count] lines downward, on the first non-blank
+ character |linewise|.
+
+ *_*
+_ <underscore> [count] - 1 lines downward, on the first non-blank
+ character |linewise|.
+
+ *G*
+G Goto line [count], default last line, on the first
+ non-blank character |linewise|. If 'startofline' not
+ set, keep the same column.
+ G is one of the |jump-motions|.
+
+ *<C-End>*
+<C-End> Goto line [count], default last line, on the last
+ character |inclusive|.
+
+<C-Home> or *gg* *<C-Home>*
+gg Goto line [count], default first line, on the first
+ non-blank character |linewise|. If 'startofline' not
+ set, keep the same column.
+
+ *:[range]*
+:[range] Set the cursor on the last line number in [range].
+ [range] can also be just one line number, e.g., ":1"
+ or ":'m".
+ In contrast with |G| this command does not modify the
+ |jumplist|.
+ *N%*
+{count}% Go to {count} percentage in the file, on the first
+ non-blank in the line |linewise|. To compute the new
+ line number this formula is used:
+ ({count} * number-of-lines + 99) / 100
+ See also 'startofline' option.
+
+:[range]go[to] [count] *:go* *:goto* *go*
+[count]go Go to [count] byte in the buffer. Default [count] is
+ one, start of the file. When giving [range], the
+ last number in it used as the byte count. End-of-line
+ characters are counted depending on the current
+ 'fileformat' setting.
+ Also see the |line2byte()| function, and the 'o'
+ option in 'statusline'.
+ {not available when compiled without the
+ |+byte_offset| feature}
+
+These commands move to the specified line. They stop when reaching the first
+or the last line. The first two commands put the cursor in the same column
+(if possible) as it was after the last command that changed the column,
+except after the "$" command, then the cursor will be put on the last
+character of the line.
+
+If "k", "-" or CTRL-P is used with a [count] and there are less than [count]
+lines above the cursor and the 'cpo' option includes the "-" flag it is an
+error. |cpo--|.
+
+==============================================================================
+4. Word motions *word-motions*
+
+<S-Right> or *<S-Right>* *w*
+w [count] words forward. |exclusive| motion.
+
+<C-Right> or *<C-Right>* *W*
+W [count] WORDS forward. |exclusive| motion.
+ If <C-Right> does not work, check out
+ |arrow_modifiers|.
+
+ *e*
+e Forward to the end of word [count] |inclusive|.
+ Does not stop in an empty line.
+
+ *E*
+E Forward to the end of WORD [count] |inclusive|.
+ Does not stop in an empty line.
+
+<S-Left> or *<S-Left>* *b*
+b [count] words backward. |exclusive| motion.
+
+<C-Left> or *<C-Left>* *B*
+B [count] WORDS backward. |exclusive| motion.
+ If <C-Left> does not work, check out
+ |arrow_modifiers|.
+
+ *ge*
+ge Backward to the end of word [count] |inclusive|.
+
+ *gE*
+gE Backward to the end of WORD [count] |inclusive|.
+
+These commands move over words or WORDS.
+ *word*
+A word consists of a sequence of letters, digits and underscores, or a
+sequence of other non-blank characters, separated with white space (spaces,
+tabs, <EOL>). This can be changed with the 'iskeyword' option. An empty line
+is also considered to be a word.
+ *WORD*
+A WORD consists of a sequence of non-blank characters, separated with white
+space. An empty line is also considered to be a WORD.
+
+A sequence of folded lines is counted for one word of a single character.
+"w" and "W", "e" and "E" move to the start/end of the first word or WORD after
+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.
+
+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
+that word becomes the end of the operated text, not the first word in the
+next line.
+
+The original Vi implementation of "e" is buggy. For example, the "e" command
+will stop on the first character of a line if the previous line was empty.
+But when you use "2e" this does not happen. In Vim "ee" and "2e" are the
+same, which is more logical. However, this causes a small incompatibility
+between Vi and Vim.
+
+==============================================================================
+5. Text object motions *object-motions*
+
+ *(*
+( [count] |sentence|s backward. |exclusive| motion.
+
+ *)*
+) [count] |sentence|s forward. |exclusive| motion.
+
+ *{*
+{ [count] |paragraph|s backward. |exclusive| motion.
+
+ *}*
+} [count] |paragraph|s forward. |exclusive| motion.
+
+ *]]*
+]] [count] |section|s forward or to the next '{' in the
+ first column. When used after an operator, then also
+ stops below a '}' in the first column. |exclusive|
+ Note that |exclusive-linewise| often applies.
+
+ *][*
+][ [count] |section|s forward or to the next '}' in the
+ first column. |exclusive|
+ Note that |exclusive-linewise| often applies.
+
+ *[[*
+[[ [count] |section|s backward or to the previous '{' in
+ the first column. |exclusive|
+ Note that |exclusive-linewise| often applies.
+
+ *[]*
+[] [count] |section|s backward or to the previous '}' in
+ the first column. |exclusive|
+ Note that |exclusive-linewise| often applies.
+
+These commands move over three kinds of text objects.
+
+ *sentence*
+A sentence is defined as ending at a '.', '!' or '?' followed by either the
+end of a line, or by a space or tab. Any number of closing ')', ']', '"'
+and ''' characters may appear after the '.', '!' or '?' before the spaces,
+tabs or end of line. A paragraph and section boundary is also a sentence
+boundary.
+If the 'J' flag is present in 'cpoptions', at least two spaces have to
+follow the punctuation mark; <Tab>s are not recognized as white space.
+The definition of a sentence cannot be changed.
+
+ *paragraph*
+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|.
+
+ *section*
+A section begins after a form-feed (<C-L>) in the first column and at each of
+a set of section macros, specified by the pairs of characters in the
+'sections' option. The default is "SHNHH HUnhsh", which defines a section to
+start at the nroff macros ".SH", ".NH", ".H", ".HU", ".nh" and ".sh".
+
+The "]]" and "[[" commands stop at the '{' in the first column. This is
+useful to find the start of a function in a C program. To search for a '}' in
+the first column, the end of a C function, use "][" (forward) or "[]"
+(backward). Note that the first character of the command determines the
+search direction.
+
+If your '{' or '}' are not in the first column, and you would like to use "[["
+and "]]" anyway, try these mappings: >
+ :map [[ ?{<CR>w99[{
+ :map ][ /}<CR>b99]}
+ :map ]] j0[[%/{<CR>
+ :map [] k$][%?}<CR>
+[type these literally, see |<>|]
+
+==============================================================================
+6. Text object selection *object-select* *text-objects*
+ *v_a* *v_i*
+
+This is a series of commands that can only be used while in Visual mode or
+after an operator. The commands that start with "a" select "a"n object
+including white space, the commands starting with "i" select an "inner" object
+without white space, or just the white space. Thus the "inner" commands
+always select less text than the "a" commands.
+
+Also see `gn` and `gN`, operating on the last search pattern.
+
+ *v_aw* *aw*
+aw "a word", select [count] words (see |word|).
+ Leading or trailing white space is included, but not
+ counted.
+ When used in Visual linewise mode "aw" switches to
+ Visual characterwise mode.
+
+ *v_iw* *iw*
+iw "inner word", select [count] words (see |word|).
+ White space between words is counted too.
+ When used in Visual linewise mode "iw" switches to
+ Visual characterwise mode.
+
+ *v_aW* *aW*
+aW "a WORD", select [count] WORDs (see |WORD|).
+ Leading or trailing white space is included, but not
+ counted.
+ When used in Visual linewise mode "aW" switches to
+ Visual characterwise mode.
+
+ *v_iW* *iW*
+iW "inner WORD", select [count] WORDs (see |WORD|).
+ White space between words is counted too.
+ When used in Visual linewise mode "iW" switches to
+ Visual characterwise mode.
+
+ *v_as* *as*
+as "a sentence", select [count] sentences (see
+ |sentence|).
+ When used in Visual mode it is made characterwise.
+
+ *v_is* *is*
+is "inner sentence", select [count] sentences (see
+ |sentence|).
+ When used in Visual mode it is made characterwise.
+
+ *v_ap* *ap*
+ap "a paragraph", select [count] paragraphs (see
+ |paragraph|).
+ Exception: a blank line (only containing white space)
+ is also a paragraph boundary.
+ When used in Visual mode it is made linewise.
+
+ *v_ip* *ip*
+ip "inner paragraph", select [count] paragraphs (see
+ |paragraph|).
+ Exception: a blank line (only containing white space)
+ is also a paragraph boundary.
+ When used in Visual mode it is made linewise.
+
+a] *v_a]* *v_a[* *a]* *a[*
+a[ "a [] block", select [count] '[' ']' blocks. This
+ goes backwards to the [count] unclosed '[', and finds
+ the matching ']'. The enclosed text is selected,
+ including the '[' and ']'.
+ When used in Visual mode it is made characterwise.
+
+i] *v_i]* *v_i[* *i]* *i[*
+i[ "inner [] block", select [count] '[' ']' blocks. This
+ goes backwards to the [count] unclosed '[', and finds
+ the matching ']'. The enclosed text is selected,
+ excluding the '[' and ']'.
+ When used in Visual mode it is made characterwise.
+
+a) *v_a)* *a)* *a(*
+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
+ parenthesis.
+ When used in Visual mode it is made characterwise.
+
+i) *v_i)* *i)* *i(*
+i( *vib* *v_ib* *v_i(* *ib*
+ib "inner block", select [count] blocks, from "[count] [("
+ to the matching ')', excluding the '(' and ')' (see
+ |[(|). If the cursor is not inside a () block, then
+ find the next "(".
+ When used in Visual mode it is made characterwise.
+
+a> *v_a>* *v_a<* *a>* *a<*
+a< "a <> block", select [count] <> blocks, from the
+ [count]'th unmatched '<' backwards to the matching
+ '>', including the '<' and '>'.
+ When used in Visual mode it is made characterwise.
+
+i> *v_i>* *v_i<* *i>* *i<*
+i< "inner <> block", select [count] <> blocks, from
+ the [count]'th unmatched '<' backwards to the matching
+ '>', excluding the '<' and '>'.
+ When used in Visual mode it is made characterwise.
+
+ *v_at* *at*
+at "a tag block", select [count] tag blocks, from the
+ [count]'th unmatched "<aaa>" backwards to the matching
+ "</aaa>", including the "<aaa>" and "</aaa>".
+ See |tag-blocks| about the details.
+ When used in Visual mode it is made characterwise.
+ Only available when compiled with the |+eval| feature.
+
+ *v_it* *it*
+it "inner tag block", select [count] tag blocks, from the
+ [count]'th unmatched "<aaa>" backwards to the matching
+ "</aaa>", excluding the "<aaa>" and "</aaa>".
+ See |tag-blocks| about the details.
+ When used in Visual mode it is made characterwise.
+
+a} *v_a}* *a}* *a{*
+a{ *v_aB* *v_a{* *aB*
+aB "a Block", select [count] Blocks, from "[count] [{" to
+ the matching '}', including the '{' and '}' (see
+ |[{|).
+ When used in Visual mode it is made characterwise.
+
+i} *v_i}* *i}* *i{*
+i{ *v_iB* *v_i{* *iB*
+iB "inner Block", select [count] Blocks, from "[count] [{"
+ to the matching '}', excluding the '{' and '}' (see
+ |[{|).
+ When used in Visual mode it is made characterwise.
+
+a" *v_aquote* *aquote*
+a' *v_a'* *a'*
+a` *v_a`* *a`*
+ "a quoted string". Selects the text from the previous
+ quote until the next quote. The 'quoteescape' option
+ is used to skip escaped quotes.
+ Only works within one line.
+ When the cursor starts on a quote, Vim will figure out
+ which quote pairs form a string by searching from the
+ start of the line.
+ Any trailing white space is included, unless there is
+ none, then leading white space is included.
+ When used in Visual mode it is made characterwise.
+ Repeating this object in Visual mode another string is
+ included. A count is currently not used.
+
+i" *v_iquote* *iquote*
+i' *v_i'* *i'*
+i` *v_i`* *i`*
+ Like a", a' and a`, but exclude the quotes and
+ repeating won't extend the Visual selection.
+ Special case: With a count of 2 the quotes are
+ included, but no extra white space as with a"/a'/a`.
+
+When used after an operator:
+For non-block objects:
+ For the "a" commands: The operator applies to the object and the white
+ space after the object. If there is no white space after the object
+ or when the cursor was in the white space before the object, the white
+ space before the object is included.
+ For the "inner" commands: If the cursor was on the object, the
+ operator applies to the object. If the cursor was on white space, the
+ operator applies to the white space.
+For a block object:
+ The operator applies to the block where the cursor is in, or the block
+ on which the cursor is on one of the braces. For the "inner" commands
+ the surrounding braces are excluded. For the "a" commands, the braces
+ are included.
+
+When used in Visual mode:
+When start and end of the Visual area are the same (just after typing "v"):
+ One object is selected, the same as for using an operator.
+When start and end of the Visual area are not the same:
+ For non-block objects the area is extended by one object or the white
+ space up to the next object, or both for the "a" objects. The
+ direction in which this happens depends on which side of the Visual
+ area the cursor is. For the block objects the block is extended one
+ level outwards.
+
+For illustration, here is a list of delete commands, grouped from small to big
+objects. Note that for a single character and a whole line the existing vi
+movement commands are used.
+ "dl" delete character (alias: "x") |dl|
+ "diw" delete inner word *diw*
+ "daw" delete a word *daw*
+ "diW" delete inner WORD (see |WORD|) *diW*
+ "daW" delete a WORD (see |WORD|) *daW*
+ "dgn" delete the next search pattern match *dgn*
+ "dd" delete one line |dd|
+ "dis" delete inner sentence *dis*
+ "das" delete a sentence *das*
+ "dib" delete inner '(' ')' block *dib*
+ "dab" delete a '(' ')' block *dab*
+ "dip" delete inner paragraph *dip*
+ "dap" delete a paragraph *dap*
+ "diB" delete inner '{' '}' block *diB*
+ "daB" delete a '{' '}' block *daB*
+
+Note the difference between using a movement command and an object. The
+movement command operates from here (cursor position) to where the movement
+takes us. When using an object the whole object is operated upon, no matter
+where on the object the cursor is. For example, compare "dw" and "daw": "dw"
+deletes from the cursor position to the start of the next word, "daw" deletes
+the word under the cursor and the space after or before it.
+
+
+Tag blocks *tag-blocks*
+
+For the "it" and "at" text objects an attempt is done to select blocks between
+matching tags for HTML and XML. But since these are not completely compatible
+there are a few restrictions.
+
+The normal method is to select a <tag> until the matching </tag>. For "at"
+the tags are included, for "it" they are excluded. But when "it" is repeated
+the tags will be included (otherwise nothing would change). Also, "it" used
+on a tag block with no contents will select the leading tag.
+
+"<aaa/>" items are skipped. Case is ignored, also for XML where case does
+matter.
+
+In HTML it is possible to have a tag like <br> or <meta ...> without a
+matching end tag. These are ignored.
+
+The text objects are tolerant about mistakes. Stray end tags are ignored.
+
+==============================================================================
+7. Marks *mark-motions* *E20* *E78*
+
+Jumping to a mark can be done in two ways:
+1. With ` (backtick): The cursor is positioned at the specified location
+ and the motion is |exclusive|.
+2. With ' (single quote): The cursor is positioned on the first non-blank
+ character in the line of the specified location and
+ the motion is linewise.
+
+ *m* *mark* *Mark*
+m{a-zA-Z} Set mark {a-zA-Z} at cursor position (does not move
+ the cursor, this is not a motion command).
+
+ *m'* *m`*
+m' or m` Set the previous context mark. This can be jumped to
+ with the "''" or "``" command (does not move the
+ cursor, this is not a motion command).
+
+ *m[* *m]*
+m[ or m] Set the |'[| or |']| mark. Useful when an operator is
+ to be simulated by multiple commands. (does not move
+ the cursor, this is not a motion command).
+
+ *m<* *m>*
+m< or m> Set the |'<| or |'>| mark. Useful to change what the
+ `gv` command selects. (does not move the cursor, this
+ is not a motion command).
+ Note that the Visual mode cannot be set, only the
+ start and end position.
+
+ *:ma* *:mark* *E191*
+:[range]ma[rk] {a-zA-Z'}
+ Set mark {a-zA-Z'} at last line number in [range],
+ column 0. Default is cursor line.
+
+ *:k*
+:[range]k{a-zA-Z'} Same as :mark, but the space before the mark name can
+ be omitted.
+ This command is not supported in |Vim9| script,
+ because it is too easily confused with a variable
+ name.
+
+ *'* *'a* *`* *`a*
+'{a-z} `{a-z} Jump to the mark {a-z} in the current buffer.
+
+ *'A* *'0* *`A* *`0*
+'{A-Z0-9} `{A-Z0-9} To the mark {A-Z0-9} in the file where it was set (not
+ a motion command when in another file).
+
+ *g'* *g'a* *g`* *g`a*
+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|.
+
+ *:marks*
+:marks List all the current marks (not a motion command).
+ The |'(|, |')|, |'{| and |'}| marks are not listed.
+ The first column has number zero.
+
+ *E283*
+:marks {arg} List the marks that are mentioned in {arg} (not a
+ motion command). For example: >
+ :marks aB
+< to list marks 'a' and 'B'.
+
+ *:delm* *:delmarks*
+:delm[arks] {marks} Delete the specified marks. Marks that can be deleted
+ include A-Z and 0-9. You cannot delete the ' mark.
+ They can be specified by giving the list of mark
+ names, or with a range, separated with a dash. Spaces
+ are ignored. Examples: >
+ :delmarks a deletes mark a
+ :delmarks a b 1 deletes marks a, b and 1
+ :delmarks Aa deletes marks A and a
+ :delmarks p-z deletes marks in the range p to z
+ :delmarks ^.[] deletes marks ^ . [ ]
+ :delmarks \" deletes mark "
+
+:delm[arks]! Delete all marks for the current buffer, but not marks
+ A-Z or 0-9.
+
+A mark is not visible in any way. It is just a position in the file that is
+remembered. Do not confuse marks with named registers, they are totally
+unrelated.
+
+'a - 'z lowercase marks, valid within one file
+'A - 'Z uppercase marks, also called file marks, valid between files
+'0 - '9 numbered marks, set from .viminfo file
+
+Lowercase marks 'a to 'z are remembered as long as the file remains in the
+buffer list. If you remove the file from the buffer list, all its marks are
+lost. If you delete a line that contains a mark, that mark is erased.
+
+Lowercase marks can be used in combination with operators. For example: "d't"
+deletes the lines from the cursor position to mark 't'. Hint: Use mark 't' for
+Top, 'b' for Bottom, etc.. Lowercase marks are restored when using undo and
+redo.
+
+Uppercase marks 'A to 'Z include the file name. You can use them to jump from
+file to file. You can only use an uppercase mark with an operator if the mark
+is in the current file. The line number of the mark remains correct, even if
+you insert/delete lines or edit another file for a moment. When the 'viminfo'
+option is not empty, uppercase marks are kept in the .viminfo file. See
+|viminfo-file-marks|.
+
+Numbered marks '0 to '9 are quite different. They can not be set directly.
+They are only present when using a viminfo file |viminfo-file|. Basically '0
+is the location of the cursor when you last exited Vim, '1 the last but one
+time, etc. Use the "r" flag in 'viminfo' to specify files for which no
+Numbered mark should be stored. See |viminfo-file-marks|.
+
+
+ *'[* *`[*
+'[ `[ To the first character of the previously changed
+ or yanked text.
+
+ *']* *`]*
+'] `] To the last character of the previously changed or
+ yanked text.
+
+After executing an operator the Cursor is put at the beginning of the text
+that was operated upon. After a put command ("p" or "P") the cursor is
+sometimes placed at the first inserted line and sometimes on the last inserted
+character. The four commands above put the cursor at either end. Example:
+After yanking 10 lines you want to go to the last one of them: "10Y']". After
+inserting several lines with the "p" command you want to jump to the lowest
+inserted line: "p']". This also works for text that has been inserted.
+
+Note: After deleting text, the start and end positions are the same, except
+when using blockwise Visual mode. These commands do not work when no change
+was made yet in the current file.
+
+ *'<* *`<*
+'< `< To the first line or character of the last selected
+ Visual area in the current buffer. For block mode it
+ may also be the last character in the first line (to
+ be able to define the block).
+
+ *'>* *`>*
+'> `> To the last line or character of the last selected
+ Visual area in the current buffer. For block mode it
+ may also be the first character of the last line (to
+ be able to define the block). Note that 'selection'
+ applies, the position may be just after the Visual
+ area.
+
+ *''* *``*
+'' `` To the position before the latest jump, or where the
+ last "m'" or "m`" command was given. Not set when the
+ |:keepjumps| command modifier was used.
+ Also see |restore-position|.
+
+ *'quote* *`quote*
+'" `" To the cursor position when last exiting the current
+ buffer. Defaults to the first character of the first
+ line. See |last-position-jump| for how to use this
+ for each opened file.
+ Only one position is remembered per buffer, not one
+ for each window. As long as the buffer is visible in
+ a window the position won't be changed.
+
+ *'^* *`^*
+'^ `^ To the position where the cursor was the last time
+ when Insert mode was stopped. This is used by the
+ |gi| command. Not set when the |:keepjumps| command
+ modifier was used.
+
+ *'.* *`.*
+'. `. To the position where the last change was made. The
+ position is at or near where the change started.
+ Sometimes a command is executed as several changes,
+ 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 |(|
+ command.
+
+ *')* *`)*
+') `) To the end of the current sentence, like the |)|
+ command.
+
+ *'{* *`{*
+'{ `{ To the start of the current paragraph, like the |{|
+ command.
+
+ *'}* *`}*
+'} `} To the end of the current paragraph, like the |}|
+ command.
+
+These commands are not marks themselves, but jump to a mark:
+
+ *]'*
+]' [count] times to next line with a lowercase mark below
+ the cursor, on the first non-blank character in the
+ line.
+
+ *]`*
+]` [count] times to lowercase mark after the cursor.
+
+ *['*
+[' [count] times to previous line with a lowercase mark
+ before the cursor, on the first non-blank character in
+ the line.
+
+ *[`*
+[` [count] times to lowercase mark before the cursor.
+
+
+:loc[kmarks] {command} *:loc* *:lock* *:lockmarks*
+ Execute {command} without adjusting marks. This is
+ useful when changing text in a way that the line count
+ will be the same when the change has completed.
+ WARNING: When the line count does change, marks below
+ the change will keep their line number, thus move to
+ another text line.
+ These items will not be adjusted for deleted/inserted
+ lines:
+ - lower case letter marks 'a - 'z
+ - upper case letter marks 'A - 'Z
+ - numbered marks '0 - '9
+ - last insert position '^
+ - last change position '.
+ - last affected text area '[ and ']
+ - the Visual area '< and '>
+ - line numbers in placed signs
+ - line numbers in quickfix positions
+ - positions in the |jumplist|
+ - positions in the |tagstack|
+ These items will still be adjusted:
+ - previous context mark ''
+ - the cursor position
+ - the view of a window on a buffer
+ - folds
+ - diffs
+
+:kee[pmarks] {command} *:kee* *:keep* *:keepmarks*
+ Currently only has effect for the filter command
+ |:range!|:
+ - When the number of lines after filtering is equal to
+ or larger than before, all marks are kept at the
+ same line number.
+ - When the number of lines decreases, the marks in the
+ lines that disappeared are deleted.
+ In any case the marks below the filtered text have
+ their line numbers adjusted, thus stick to the text,
+ as usual.
+ When the 'R' flag is missing from 'cpoptions' this has
+ the same effect as using ":keepmarks".
+
+ *:keepj* *:keepjumps*
+:keepj[umps] {command}
+ Moving around in {command} does not change the |''|,
+ |'.| and |'^| marks, the |jumplist| or the
+ |changelist|.
+ Useful when making a change or inserting text
+ automatically and the user doesn't want to go to this
+ position. E.g., when updating a "Last change"
+ timestamp in the first line: >
+
+ :let lnum = line(".")
+ :keepjumps normal gg
+ :call SetLastChange()
+ :keepjumps exe "normal " .. lnum .. "G"
+<
+ Note that ":keepjumps" must be used for every command.
+ When invoking a function the commands in that function
+ can still change the jumplist. Also, for
+ ":keepjumps exe 'command '" the "command" won't keep
+ jumps. Instead use: ":exe 'keepjumps command'"
+
+==============================================================================
+8. Jumps *jump-motions*
+
+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 "``" commands,
+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
+ (not a motion command).
+
+<Tab> or *CTRL-I* *<Tab>*
+CTRL-I Go to [count] newer cursor position in jump list
+ (not a motion command).
+
+ NOTE: In the GUI and in a terminal supporting
+ |modifyOtherKeys|, CTRL-I can be mapped separately
+ from <Tab>, on the condition that CTRL-I is
+ mapped before <Tab>, otherwise the mapping applies to
+ both.
+
+ *: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
+move up and down the list. There is a separate jump list for each window.
+The maximum number of entries is fixed at 100.
+
+For example, after three jump commands you have this jump list:
+
+ jump line col file/text ~
+ 3 1 0 some text ~
+ 2 70 0 another line ~
+ 1 1154 23 end. ~
+ > ~
+
+The "file/text" column shows the file name, or the text at the jump if it is
+in the current file (an indent is removed and a long line is truncated to fit
+in the window).
+
+The marker ">" indicates the current position in the jumplist. It may not be
+shown when filtering the |:jumps| command using |:filter|
+
+You are currently in line 1167. If you then use the CTRL-O command, the
+cursor is put in line 1154. This results in:
+
+ jump line col file/text ~
+ 2 1 0 some text ~
+ 1 70 0 another line ~
+ > 0 1154 23 end. ~
+ 1 1167 0 foo bar ~
+
+The pointer will be set at the last used jump position. The next CTRL-O
+command will use the entry above it, the next CTRL-I command will use the
+entry below it. If the pointer is below the last entry, this indicates that
+you did not use a CTRL-I or CTRL-O before. In this case the CTRL-O command
+will cause the cursor position to be added to the jump list, so you can get
+back to the position before the CTRL-O. In this case this is line 1167.
+
+With more CTRL-O commands you will go to lines 70 and 1. If you use CTRL-I
+you can go back to 1154 and 1167 again. Note that the number in the "jump"
+column indicates the count for the CTRL-O or CTRL-I command that takes you to
+this position.
+
+If you use a jump command, the current line number is inserted at the end of
+the jump list. If the same line was already in the jump list, it is removed.
+The result is that when repeating CTRL-O you will get back to old positions
+only once.
+
+When the |:keepjumps| command modifier is used, jumps are not stored in the
+jumplist. Jumps are also not stored in other cases, e.g., in a |:global|
+command. You can explicitly add a jump by setting the ' mark with "m'". Note
+that calling setpos() does not do this.
+
+After the CTRL-O command that got you into line 1154 you could give another
+jump command (e.g., "G"). The jump list would then become:
+
+ jump line col file/text ~
+ 4 1 0 some text ~
+ 3 70 0 another line ~
+ 2 1167 0 foo bar ~
+ 1 1154 23 end. ~
+ > ~
+
+The line numbers will be adjusted for deleted and inserted lines. This fails
+if you stop editing a file without writing, like with ":n!".
+
+When you split a window, the jumplist will be copied to the new window.
+
+If you have included the ' item in the 'viminfo' option the jumplist will be
+stored in the viminfo file and restored when starting Vim.
+
+
+CHANGE LIST JUMPS *changelist* *change-list-jumps* *E664*
+
+When making a change the cursor position is remembered. One position is
+remembered for every change that can be undone, unless it is close to a
+previous change. Two commands can be used to jump to positions of changes,
+also those that have been undone:
+
+ *g;* *E662*
+g; Go to [count] older position in change list.
+ If [count] is larger than the number of older change
+ positions go to the oldest change.
+ If there is no older change an error message is given.
+ (not a motion command)
+
+ *g,* *E663*
+g, Go to [count] newer position in change list.
+ Just like |g;| but in the opposite direction.
+ (not a motion command)
+
+When using a count you jump as far back or forward as possible. Thus you can
+use "999g;" to go to the first change for which the position is still
+remembered. The number of entries in the change list is fixed and is the same
+as for the |jumplist|.
+
+When two undo-able changes are in the same line and at a column position less
+than 'textwidth' apart only the last one is remembered. This avoids that a
+sequence of small changes in a line, for example "xxxxx", adds many positions
+to the change list. When 'textwidth' is zero 'wrapmargin' is used. When that
+also isn't set a fixed number of 79 is used. Detail: For the computations
+bytes are used, not characters, to avoid a speed penalty (this only matters
+for multibyte encodings).
+
+Note that when text has been inserted or deleted the cursor position might be
+a bit different from the position of the change. Especially when lines have
+been deleted.
+
+When the `:keepjumps` command modifier is used the position of a change is not
+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 position. The first column indicates the
+ count needed to take you to this position. Example:
+
+ change line col text ~
+ 3 9 8 bla bla bla
+ 2 11 57 foo is a bar
+ 1 14 54 the latest changed line
+ >
+
+ The `3g;` command takes you to line 9. Then the
+ output of `:changes` is:
+
+ change line col text ~
+ > 0 9 8 bla bla bla
+ 1 11 57 foo is a bar
+ 2 14 54 the latest changed line
+
+ Now you can use "g," to go to line 11 and "2g," to go
+ to line 14.
+
+==============================================================================
+9. Various motions *various-motions*
+
+ *%*
+% Find the next item in this line after or under the
+ cursor and jump to its match. |inclusive| motion.
+ Items can be:
+ ([{}]) parenthesis or (curly/square) brackets
+ (this can be changed with the
+ 'matchpairs' option)
+ /* */ start or end of C-style comment
+ #if, #ifdef, #else, #elif, #endif
+ C preprocessor conditionals (when the
+ cursor is on the # or no ([{
+ is following)
+ For other items the matchit plugin can be used, see
+ |matchit-install|. This plugin also helps to skip
+ matches in comments.
+
+ When 'cpoptions' contains "M" |cpo-M| backslashes
+ before parens and braces are ignored. Without "M" the
+ number of backslashes matters: an even number doesn't
+ match with an odd number. Thus in "( \) )" and "\( (
+ \)" the first and last parenthesis match.
+
+ When the '%' character is not present in 'cpoptions'
+ |cpo-%|, parens and braces inside double quotes are
+ ignored, unless the number of parens/braces in a line
+ is uneven and this line and the previous one does not
+ end in a backslash. '(', '{', '[', ']', '}' and ')'
+ are also ignored (parens and braces inside single
+ quotes). Note that this works fine for C, but not for
+ Perl, where single quotes are used for strings.
+
+ Nothing special is done for matches in comments. You
+ can either use the matchit plugin |matchit-install| or
+ put quotes around matches.
+
+ No count is allowed, {count}% jumps to a line {count}
+ percentage down the file |N%|. Using '%' on
+ #if/#else/#endif makes the movement linewise.
+
+ *[(*
+[( Go to [count] previous unmatched '('.
+ |exclusive| motion.
+ *[{*
+[{ Go to [count] previous unmatched '{'.
+ |exclusive| motion.
+ *])*
+]) Go to [count] next unmatched ')'.
+ |exclusive| motion.
+ *]}*
+]} Go to [count] next unmatched '}'.
+ |exclusive| motion.
+
+The above four commands can be used to go to the start or end of the current
+code block. It is like doing "%" on the '(', ')', '{' or '}' at the other
+end of the code block, but you can do this from anywhere in the code block.
+Very useful for C programs. Example: When standing on "case x:", "[{" will
+bring you back to the switch statement.
+
+ *]m*
+]m Go to [count] next start of a method (for Java or
+ similar structured language). When not before the
+ start of a method, jump to the start or end of the
+ class. When no '{' is found after the cursor, this is
+ an error. |exclusive| motion.
+ *]M*
+]M Go to [count] next end of a method (for Java or
+ similar structured language). When not before the end
+ of a method, jump to the start or end of the class.
+ When no '}' is found after the cursor, this is an
+ error. |exclusive| motion.
+ *[m*
+[m Go to [count] previous start of a method (for Java or
+ similar structured language). When not after the
+ start of a method, jump to the start or end of the
+ class. When no '{' is found before the cursor this is
+ an error. |exclusive| motion.
+ *[M*
+[M Go to [count] previous end of a method (for Java or
+ similar structured language). When not after the
+ end of a method, jump to the start or end of the
+ class. When no '}' is found before the cursor this is
+ an error. |exclusive| motion.
+
+The above four commands assume that the file contains a class with methods.
+The class definition is surrounded in '{' and '}'. Each method in the class
+is also surrounded with '{' and '}'. This applies to the Java language. The
+file looks like this: >
+
+ // comment
+ class foo {
+ int method_one() {
+ body_one();
+ }
+ int method_two() {
+ body_two();
+ }
+ }
+
+[To try this out copy the text and put it in a new buffer, the help text above
+confuses the jump commands]
+
+Starting with the cursor on "body_two()", using "[m" will jump to the '{' at
+the start of "method_two()" (obviously this is much more useful when the
+method is long!). Using "2[m" will jump to the start of "method_one()".
+Using "3[m" will jump to the start of the class.
+
+ *[#*
+[# Go to [count] previous unmatched "#if" or "#else".
+ |exclusive| motion.
+
+ *]#*
+]# Go to [count] next unmatched "#else" or "#endif".
+ |exclusive| motion.
+
+These two commands work in C programs that contain #if/#else/#endif
+constructs. It brings you to the start or end of the #if/#else/#endif where
+the current line is included. You can then use "%" to go to the matching line.
+
+ *[star* *[/*
+[* or [/ Go to [count] previous start of a C comment "/*".
+ |exclusive| motion.
+
+ *]star* *]/*
+]* or ]/ Go to [count] next end of a C comment "*/".
+ |exclusive| motion.
+
+
+ *H*
+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, 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
+ character |linewise|. See also 'startofline' option.
+
+ *L*
+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, 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:noet:ft=help:norl:
diff --git a/runtime/doc/netbeans.txt b/runtime/doc/netbeans.txt
new file mode 100644
index 0000000..241fdb7
--- /dev/null
+++ b/runtime/doc/netbeans.txt
@@ -0,0 +1,1027 @@
+*netbeans.txt* For Vim version 9.0. Last change: 2022 Apr 03
+
+
+ VIM REFERENCE MANUAL by Gordon Prieur et al.
+
+
+ *netbeans* *NetBeans* *netbeans-support*
+
+Vim NetBeans Protocol: a socket interface for Vim integration into an IDE.
+
+1. Introduction |netbeans-intro|
+2. Integration features |netbeans-integration|
+3. Configuring Vim for NetBeans |netbeans-configure|
+4. Error Messages |netbeans-messages|
+5. Running Vim in NetBeans mode |netbeans-run|
+6. NetBeans protocol |netbeans-protocol|
+7. NetBeans commands |netbeans-commands|
+8. Known problems |netbeans-problems|
+9. Debugging NetBeans protocol |netbeans-debugging|
+10. NetBeans External Editor
+ 10.1. Downloading NetBeans |netbeans-download|
+ 10.2. NetBeans Key Bindings |netbeans-keybindings|
+ 10.3. Preparing NetBeans for Vim |netbeans-preparation|
+ 10.4. Obtaining the External Editor Module |obtaining-exted|
+ 10.5. Setting up NetBeans to run with Vim |netbeans-setup|
+
+{only available when compiled with the |+netbeans_intg| feature}
+
+==============================================================================
+1. Introduction *netbeans-intro*
+
+The NetBeans interface was initially developed to integrate Vim into the
+NetBeans Java IDE, using the external editor plugin. This NetBeans plugin no
+longer exists for recent versions of NetBeans but the protocol was developed
+in such a way that any IDE can use it to integrate Vim.
+
+The NetBeans protocol of Vim is a text based communication protocol, over a
+classical TCP socket. There is no dependency on Java or NetBeans. Any language
+or environment providing a socket interface can control Vim using this
+protocol. There are existing implementations in C, C++, Python and Java. The
+name NetBeans is kept today for historical reasons.
+
+Active project using the NetBeans protocol of Vim:
+- Eclim, http://eclim.org/
+
+VimIntegration, description of various projects doing Vim Integration:
+ http://www.freehackers.org/VimIntegration
+
+Projects using the NetBeans protocol of Vim are or were:
+- Agide, an IDE for the AAP project, written in Python (now replaced by
+ |:Termdebug|): http://www.a-a-p.org
+- Clewn, a gdb integration into Vim, written in C:
+ http://clewn.sourceforge.net/
+- Pyclewn, a gdb integration into Vim, written in Python:
+ http://pyclewn.sourceforge.net/
+- VimWrapper, library to easy Vim integration into IDE:
+ http://www.freehackers.org/VimWrapper
+Outdated projects (links don't work):
+- VimPlugin, integration of Vim inside Eclipse:
+ http://vimplugin.sourceforge.net/wiki/pmwiki.php
+- PIDA, IDE written in Python integrating Vim:
+ http://pida.co.uk/
+
+Check the specific project pages to see how to use Vim with these projects.
+
+An alternative is to use a channel, see |channel|.
+
+In the rest of this help page, we will use the term "Vim Controller" to
+describe the program controlling Vim through the NetBeans socket interface.
+
+
+About the NetBeans IDE ~
+
+NetBeans is an open source Integrated Development Environment developed
+jointly by Sun Microsystems, Inc. and the netbeans.org developer community.
+Initially just a Java IDE, NetBeans has had C, C++, and Fortran support added
+in recent releases.
+
+For more information visit the main NetBeans web site http://www.netbeans.org.
+The External Editor is now, unfortunately, declared obsolete. See
+ http://externaleditor.netbeans.org.
+
+Sun Microsystems, Inc. also ships NetBeans under the name Sun ONE Studio.
+Visit http://www.sun.com for more information regarding the Sun ONE Studio
+product line.
+
+Current releases of NetBeans provide full support for Java and limited support
+for C, C++, and Fortran. Current releases of Sun ONE Studio provide full
+support for Java, C, C++, and Fortran.
+
+==============================================================================
+2. Integration features *netbeans-integration*
+
+The NetBeans socket interface of Vim allows to get information from Vim or to
+ask Vim to perform specific actions:
+- get information about buffer: buffer name, cursor position, buffer content,
+ etc.
+- be notified when buffers are open or closed
+- be notified of how the buffer content is modified
+- load and save files
+- modify the buffer content
+- installing special key bindings
+- raise the window, control the window geometry
+
+For sending key strokes to Vim or for evaluating functions in Vim, you must
+use the |clientserver| interface.
+
+
+==============================================================================
+3. Configuring Vim for NetBeans *netbeans-configure*
+
+For more help about installing Vim, please read |usr_90.txt| in the Vim User
+Manual.
+
+
+On Unix:
+--------
+
+When running configure without arguments the NetBeans interface should be
+included. That is, if the configure check to find out if your system supports
+the required features succeeds.
+
+In case you do not want the NetBeans interface you can disable it by
+uncommenting a line with "--disable-netbeans" in the Makefile.
+
+Currently the NetBeans interface is supported by Vim running in a terminal and
+by gvim when it is run with one of the following GUIs: GTK, GNOME, Windows
+and Motif.
+
+ *netbeans-xpm*
+If Motif support is required the user must supply XPM libraries.
+The XPM library is required to show images within Vim with Motif.
+Without it the toolbar and signs will be disabled.
+
+The XPM library is provided by Arnaud Le Hors of the French National Institute
+for Research in Computer Science and Control. It can be downloaded from
+http://cgit.freedesktop.org/xorg/lib/libXpm. The current release, as of this
+writing, is xpm-3.4k-solaris.tgz, which is a gzip'ed tar file. If you create
+the directory /usr/local/xpm and untar the file there you can use the
+uncommented lines in the Makefile without changing them. If you use another
+xpm directory you will need to change the XPM_DIR in src/Makefile.
+
+
+On MS-Windows:
+--------------
+
+The Win32 support is now in beta stage.
+
+To use XPM signs on Win32 (e.g. when using with NetBeans) you can compile
+XPM by yourself or use precompiled libraries from http://iamphet.nm.ru/misc/
+(for MS Visual C++) or http://gnuwin32.sourceforge.net (for MinGW).
+
+Enable debugging:
+-----------------
+
+To enable debugging of Vim and of the NetBeans protocol, the "NBDEBUG" macro
+needs to be defined. Search in the Makefile of the platform you are using for
+"NBDEBUG" to see what line needs to be uncommented. This effectively adds
+"-DNBDEBUG" to the compile command. Also see |netbeans-debugging|
+
+==============================================================================
+4. Error Messages *netbeans-messages*
+
+These error messages are specific to NetBeans socket protocol:
+
+ *E463*
+Region is guarded, cannot modify
+ The Vim Controller has defined guarded areas in the text,
+ which you cannot change. Also sets the current buffer, if
+ necessary.
+
+ *E532*
+The defineAnnoType highlighting color name is too long
+ The maximum length of the "fg" or "bg" color argument in the
+ defineAnnoType command is 32 characters.
+ New in version 2.5.
+
+ *E656*
+Writes of unmodified buffers forbidden
+ Writes of unmodified buffers that were opened from the
+ Vim Controller are not possible.
+
+ *E657*
+Partial writes disallowed
+ Partial writes for buffers that were opened from the
+ Vim Controller are not allowed.
+
+ *E658*
+Connection lost for this buffer
+ The Vim Controller has become confused about the state of
+ this file. Rather than risk data corruption, it has severed
+ the connection for this file. Vim will take over
+ responsibility for saving changes to this file and the
+ Vim Controller will no longer know of these changes.
+
+ *E744*
+Read-only file
+ Vim normally allows changes to a read-only file and only
+ enforces the read-only rule if you try to write the file.
+ However, NetBeans does not let you make changes to a file
+ which is read-only and becomes confused if Vim does this.
+ So Vim does not allow modifications to files when run
+ in NetBeans mode.
+
+==============================================================================
+5. Running Vim in NetBeans mode *netbeans-run*
+
+There are two different ways to run Vim in NetBeans mode:
+
+ + an IDE may start Vim with the |-nb| command line argument
+ + NetBeans can be started from within Vim with the |:nbstart| command
+
+Vim uses a 3 second timeout on trying to make the connection.
+
+ *netbeans-parameters*
+Three forms can be used to setup the NetBeans connection parameters.
+When started from the command line, the |-nb| command line argument may be:
+
+ -nb={fname} from a file
+ -nb:{hostname}:{addr}:{password} directly
+ -nb from a file or environment
+
+When started from within Vim, the |:nbstart| optional argument may be:
+
+ ={fname} from a file
+ :{hostname}:{addr}:{password} directly
+ <MISSING ARGUMENT> from a file or environment
+
+ *E660* *E668*
+When NetBeans is started from the command line, for security reasons, the best
+method is to write the information in a file readable only by the user. The
+name of the file can be passed with the "-nb={fname}" argument or, when "-nb"
+is used without a parameter, the environment variable "__NETBEANS_CONINFO".
+The file must contain these three lines, in any order:
+
+ host={hostname}
+ port={addr}
+ auth={password}
+
+Other lines are ignored. The Vim Controller is responsible for deleting the
+file afterwards.
+
+{hostname} is the name of the machine where Vim Controller is running. When
+omitted the environment variable "__NETBEANS_HOST" is used or the default
+"localhost".
+
+{addr} is the port number for the NetBeans interface. When omitted the
+environment variable "__NETBEANS_SOCKET" is used or the default 3219.
+
+{password} is the password for connecting to NetBeans. When omitted the
+environment variable "__NETBEANS_VIM_PASSWORD" is used or "changeme".
+
+Vim will initiate a socket connection (client side) to the specified host and
+port upon startup. The password will be sent with the AUTH event when the
+connection has been established.
+
+
+==============================================================================
+6. NetBeans protocol *netbeans-protocol*
+
+The communication between the Vim Controller and Vim uses plain text
+messages. This protocol was first designed to work with the external editor
+module of NetBeans. Later it was extended to work with Agide (A-A-P GUI IDE,
+see http://www.a-a-p.org) and then with other IDE. The extensions are marked
+with "version 2.1".
+
+Version 2.2 of the protocol has several minor changes which should only affect
+NetBeans users (ie, not Agide users). However, a bug was fixed which could
+cause confusion. The netbeans_saved() function sent a "save" protocol
+command. In protocol version 2.1 and earlier this was incorrectly interpreted
+as a notification that a write had taken place. In reality, it told NetBeans
+to save the file so multiple writes were being done. This caused various
+problems and has been fixed in 2.2. To decrease the likelihood of this
+confusion happening again, netbeans_saved() has been renamed to
+netbeans_save_buffer().
+
+We are now at version 2.5. For the differences between 2.4 and 2.5 search for
+"2.5" below.
+
+The messages are currently sent over a socket. Since the messages are in
+plain UTF-8 text this protocol could also be used with any other communication
+mechanism.
+
+Netbeans messages are processed when Vim is idle, waiting for user input.
+When Vim is run in non-interactive mode, for example when running an automated
+test case that sources a Vim script, the idle loop may not be called often
+enough. In that case, insert |:sleep| commands in the Vim script. The |:sleep|
+command does invoke Netbeans messages processing.
+
+6.1 Kinds of messages |nb-messages|
+6.2 Terms |nb-terms|
+6.3 Commands |nb-commands|
+6.4 Functions and Replies |nb-functions|
+6.5 Events |nb-events|
+6.6 Special messages |nb-special|
+6.7 Protocol errors |nb-protocol_errors|
+
+
+6.1 Kinds of messages *nb-messages*
+
+There are four kinds of messages:
+
+kind direction comment ~
+Command IDE -> editor no reply necessary
+Function IDE -> editor editor must send back a reply
+Reply editor -> IDE only in response to a Function
+Event editor -> IDE no reply necessary
+
+The messages are sent as a single line with a terminating newline character.
+Arguments are separated by a single space. The first item of the message
+depends on the kind of message:
+
+kind first item example ~
+Command bufID:name!seqno 11:showBalloon!123 "text"
+Function bufID:name/seqno 11:getLength/123
+Reply seqno 123 5000
+Event bufID:name=seqno 11:keyCommand=123 "S-F2"
+
+
+
+6.2 Terms *nb-terms*
+
+bufID Buffer number. A message may be either for a specific buffer
+ or generic. Generic messages use a bufID of zero. NOTE: this
+ buffer ID is assigned by the IDE, it is not Vim's buffer
+ number. The bufID must be a sequentially rising number,
+ starting at one. When the 'switchbuf' option is set to
+ "usetab" and the "bufID" buffer is not found in the current
+ tab page, the netbeans commands and functions that set this
+ buffer as the current buffer will jump to the first open
+ window that contains this buffer in other tab pages instead of
+ replacing the buffer in the current window.
+
+seqno The IDE uses a sequence number for Commands and Functions. A
+ Reply must use the sequence number of the Function that it is
+ associated with. A zero sequence number can be used for
+ Events (the seqno of the last received Command or Function can
+ also be used).
+
+string Argument in double quotes. Text is in UTF-8 encoding. This
+ means ASCII is passed as-is. Special characters are
+ represented with a backslash:
+ \" double quote
+ \n newline
+ \r carriage-return
+ \t tab (optional, also works literally)
+ \\ backslash
+ NUL bytes are not allowed!
+
+boolean Argument with two possible values:
+ T true
+ F false
+
+number Argument with a decimal number.
+
+color Argument with either a decimal number, "none" (without the
+ quotes) or the name of a color (without the quotes) defined
+ both in the color list in |highlight-ctermfg| and in the color
+ list in |gui-colors|.
+ New in version 2.5.
+
+offset A number argument that indicates a byte position in a buffer.
+ The first byte has offset zero. Line breaks are counted for
+ how they appear in the file (CR/LF counts for two bytes).
+ Note that a multibyte character is counted for the number of
+ bytes it takes.
+
+lnum/col Argument with a line number and column number position. The
+ line number starts with one, the column is the byte position,
+ starting with zero. Note that a multibyte character counts
+ for several columns.
+
+pathname String argument: file name with full path.
+
+
+6.3 Commands *nb-commands*
+
+actionMenuItem Not implemented.
+
+actionSensitivity
+ Not implemented.
+
+addAnno serNum typeNum off len
+ Place an annotation in this buffer.
+ Arguments:
+ serNum number serial number of this placed
+ annotation, used to be able to remove
+ it
+ typeNum number sequence number of the annotation
+ defined with defineAnnoType for this
+ buffer
+ off number offset where annotation is to be placed
+ len number not used
+ In version 2.1 "lnum/col" can be used instead of "off".
+
+balloonResult text
+ Not implemented.
+
+close Close the buffer. This leaves us without current buffer, very
+ dangerous to use!
+
+create Creates a buffer without a name. Replaces the current buffer
+ (it's hidden when it was changed).
+ The Vim Controller should use this as the first command for a
+ file that is being opened. The sequence of commands could be:
+ create
+ setCaretListener (ignored)
+ setModified (no effect)
+ setContentType (ignored)
+ startDocumentListen
+ setTitle
+ setFullName
+
+defineAnnoType typeNum typeName tooltip glyphFile fg bg
+ Define a type of annotation for this buffer.
+ Arguments:
+ typeNum number sequence number (not really used)
+ typeName string name that identifies this annotation
+ tooltip string not used
+ glyphFile string name of icon file
+ fg color foreground color for line highlighting
+ bg color background color for line highlighting
+ Vim will define a sign for the annotation.
+ When color is a number, this is the "#rrggbb" Red, Green and
+ Blue values of the color (see |gui-colors|) and the
+ highlighting is only defined for gVim.
+ When color is a name, this color is defined both for Vim
+ running in a color terminal and for gVim.
+ When both "fg" and "bg" are "none" no line highlighting is
+ used (new in version 2.1).
+ When "glyphFile" is empty, no text sign is used (new in
+ version 2.1).
+ When "glyphFile" is one or two characters long, a text sign is
+ defined (new in version 2.1).
+ Note: the annotations will be defined in sequence, and the
+ sequence number is later used with addAnno.
+
+editFile pathname
+ Set the name for the buffer and edit the file "pathname", a
+ string argument.
+ Normal way for the IDE to tell the editor to edit a file.
+
+ You must set a bufId different of 0 with this command to
+ assign a bufId to the buffer. It will trigger an event
+ fileOpened with a bufId of 0 but the buffer has been assigned.
+
+ If the IDE is going to pass the file text to the editor use
+ these commands instead:
+ setFullName
+ insert
+ initDone
+ New in version 2.1.
+
+enableBalloonEval
+ Not implemented.
+
+endAtomic End an atomic operation. The changes between "startAtomic"
+ and "endAtomic" can be undone as one operation. But it's not
+ implemented yet. Redraw when necessary.
+
+guard off len
+ Mark an area in the buffer as guarded. This means it cannot
+ be edited. "off" and "len" are numbers and specify the text
+ to be guarded.
+
+initDone Mark the buffer as ready for use. Implicitly makes the buffer
+ the current buffer. Fires the BufReadPost autocommand event.
+
+insertDone starteol readonly
+ Sent by Vim Controller to tell Vim an initial file insert is
+ done. This triggers a read message being printed. If
+ "starteol" is "F" then the last line doesn't have a EOL. If
+ "readonly" is "T" then the file is marked as readonly. Prior
+ to version 2.3, no read messages were displayed after opening
+ a file. New in version 2.3.
+
+moveAnnoToFront serNum
+ Not implemented.
+
+netbeansBuffer isNetbeansBuffer
+ If "isNetbeansBuffer" is "T" then this buffer is "owned" by
+ NetBeans.
+ New in version 2.2.
+
+putBufferNumber pathname
+ Associate a buffer number with the Vim buffer by the name
+ "pathname", a string argument. To be used when the editor
+ reported editing another file to the IDE and the IDE needs to
+ tell the editor what buffer number it will use for this file.
+ Also marks the buffer as initialized.
+ New in version 2.1.
+
+raise Bring the editor to the foreground.
+ Only when Vim is run with a GUI.
+ New in version 2.1.
+
+removeAnno serNum
+ Remove a previously placed annotation for this buffer.
+ "serNum" is the same number used in addAnno.
+
+save Save the buffer when it was modified. The other side of the
+ interface is expected to write the buffer and invoke
+ "setModified" to reset the "changed" flag of the buffer.
+ The writing is skipped when one of these conditions is true:
+ - 'write' is not set
+ - the buffer is read-only
+ - the buffer does not have a file name
+ - 'buftype' disallows writing
+ New in version 2.2.
+
+saveDone
+ Sent by Vim Controller to tell Vim a save is done. This
+ triggers a save message being printed. Prior to version 2.3,
+ no save messages were displayed after a save.
+ New in version 2.3.
+
+setAsUser Not implemented.
+
+setBufferNumber pathname
+ Associate a buffer number with Vim buffer by the name
+ "pathname". To be used when the editor reported editing
+ another file to the IDE and the IDE needs to tell the editor
+ what buffer number it will use for this file.
+ Has the side effect of making the buffer the current buffer.
+ See "putBufferNumber" for a more useful command.
+
+setContentType
+ Not implemented.
+
+setDot off Make the buffer the current buffer and set the cursor at the
+ specified position. If the buffer is open in another window
+ than make that window the current window.
+ If there are folds they are opened to make the cursor line
+ visible.
+ In version 2.1 "lnum/col" can be used instead of "off".
+
+setExitDelay seconds
+ Set the delay for exiting to "seconds", a number.
+ This delay is used to give the IDE a chance to handle things
+ before really exiting. The default delay is two seconds.
+ New in version 2.1.
+ Obsolete in version 2.3.
+
+setFullName pathname
+ Set the file name to be used for a buffer to "pathname", a
+ string argument.
+ Used when the IDE wants to edit a file under control of the
+ IDE. This makes the buffer the current buffer, but does not
+ read the file. "insert" commands will be used next to set the
+ contents.
+
+setLocAndSize Not implemented.
+
+setMark Not implemented.
+
+setModified modified
+ When the boolean argument "modified" is "T" mark the buffer as
+ modified, when it is "F" mark it as unmodified.
+
+setModtime time
+ Update a buffers modification time after the file has been
+ saved directly by the Vim Controller.
+ New in version 2.3.
+
+setReadOnly readonly
+ When the boolean argument "readonly" is "T" for True, mark the
+ buffer as readonly, when it is "F" for False, mark it as not
+ readonly. Implemented in version 2.3.
+
+setStyle Not implemented.
+
+setTitle name
+ Set the title for the buffer to "name", a string argument.
+ The title is only used for the Vim Controller functions, not
+ by Vim.
+
+setVisible visible
+ When the boolean argument "visible" is "T", goto the buffer.
+ The "F" argument does nothing.
+
+showBalloon text
+ Show a balloon (popup window) at the mouse pointer position,
+ containing "text", a string argument. The balloon should
+ disappear when the mouse is moved more than a few pixels.
+ Only when Vim is run with a GUI.
+ New in version 2.1.
+
+specialKeys
+ Map a set of keys (mostly function keys) to be passed back
+ to the Vim Controller for processing. This lets regular IDE
+ hotkeys be used from Vim.
+ Implemented in version 2.3.
+
+startAtomic Begin an atomic operation. The screen will not be updated
+ until "endAtomic" is given.
+
+startCaretListen
+ Not implemented.
+
+startDocumentListen
+ Mark the buffer to report changes to the IDE with the
+ "insert" and "remove" events. The default is to report
+ changes.
+
+stopCaretListen
+ Not implemented.
+
+stopDocumentListen
+ Mark the buffer to stop reporting changes to the IDE.
+ Opposite of startDocumentListen.
+ NOTE: if "netbeansBuffer" was used to mark this buffer as a
+ NetBeans buffer, then the buffer is deleted in Vim. This is
+ for compatibility with Sun Studio 10.
+
+unguard off len
+ Opposite of "guard", remove guarding for a text area.
+ Also sets the current buffer, if necessary.
+
+version Not implemented.
+
+
+6.4 Functions and Replies *nb-functions*
+
+getDot Not implemented.
+
+getCursor Return the current buffer and cursor position.
+ The reply is:
+ seqno bufID lnum col off
+ seqno = sequence number of the function
+ bufID = buffer ID of the current buffer (if this is unknown -1
+ is used)
+ lnum = line number of the cursor (first line is one)
+ col = column number of the cursor (in bytes, zero based)
+ off = offset of the cursor in the buffer (in bytes)
+ New in version 2.1.
+
+getLength Return the length of the buffer in bytes.
+ Reply example for a buffer with 5000 bytes:
+ 123 5000
+ TODO: explain use of partial line.
+
+getMark Not implemented.
+
+getAnno serNum
+ Return the line number of the annotation in the buffer.
+ Argument:
+ serNum serial number of this placed annotation
+ The reply is:
+ 123 lnum line number of the annotation
+ 123 0 invalid annotation serial number
+ New in version 2.4.
+
+getModified When a buffer is specified: Return zero if the buffer does not
+ have changes, one if it does have changes.
+ When no buffer is specified (buffer number zero): Return the
+ number of buffers with changes. When the result is zero it's
+ safe to tell Vim to exit.
+ New in version 2.1.
+
+getText Return the contents of the buffer as a string.
+ Reply example for a buffer with two lines
+ 123 "first line\nsecond line\n"
+ NOTE: docs indicate an offset and length argument, but this is
+ not implemented.
+
+insert off text
+ Insert "text" before position "off". "text" is a string
+ argument, "off" a number.
+ "text" should have a "\n" (newline) at the end of each line.
+ Or "\r\n" when 'fileformat' is "dos". When using "insert" in
+ an empty buffer Vim will set 'fileformat' accordingly.
+ When "off" points to the start of a line the text is inserted
+ above this line. Thus when "off" is zero lines are inserted
+ before the first line.
+ When "off" points after the start of a line, possibly on the
+ NUL at the end of a line, the first line of text is appended
+ to this line. Further lines come below it.
+ Possible replies:
+ 123 no problem
+ 123 !message failed
+ Note that the message in the reply is not quoted.
+ Also sets the current buffer, if necessary.
+ Does not move the cursor to the changed text.
+ Resets undo information.
+
+remove off length
+ Delete "length" bytes of text at position "off". Both
+ arguments are numbers.
+ Possible replies:
+ 123 no problem
+ 123 !message failed
+ Note that the message in the reply is not quoted.
+ Also sets the current buffer, if necessary.
+
+saveAndExit Perform the equivalent of closing Vim: ":confirm qall".
+ If there are no changed files or the user does not cancel the
+ operation Vim exits and no result is sent back. The IDE can
+ consider closing the connection as a successful result.
+ If the user cancels the operation the number of modified
+ buffers that remains is returned and Vim does not exit.
+ New in version 2.1.
+
+
+6.5 Events *nb-events*
+
+balloonEval off len type
+ The mouse pointer rests on text for a short while. When "len"
+ is zero, there is no selection and the pointer is at position
+ "off". When "len" is non-zero the text from position "off" to
+ "off" + "len" is selected.
+ Only sent after "enableBalloonEval" was used for this buffer.
+ "type" is not yet defined.
+ Not implemented yet.
+
+balloonText text
+ Used when 'ballooneval' is set and the mouse pointer rests on
+ some text for a moment. "text" is a string, the text under
+ the mouse pointer.
+ Only when Vim is run with a GUI.
+ New in version 2.1.
+
+buttonRelease button lnum col
+ Report which button was pressed and the location of the cursor
+ at the time of the release. Only for buffers that are owned
+ by the Vim Controller. This event is not sent if the button
+ was released while the mouse was in the status line or in a
+ separator line. If col is less than 1 the button release was
+ in the sign area.
+ New in version 2.2.
+
+disconnect
+ Tell the Vim Controller that Vim is exiting and not to try and
+ read or write more commands.
+ New in version 2.3.
+
+fileClosed Not implemented.
+
+fileModified Not implemented.
+
+fileOpened pathname open modified
+ A file was opened by the user.
+ Arguments:
+ pathname string name of the file
+ open boolean always "T"
+ modified boolean always "F"
+
+geometry cols rows x y
+ Report the size and position of the editor window.
+ Arguments:
+ cols number number of text columns
+ rows number number of text rows
+ x number pixel position on screen
+ y number pixel position on screen
+ Only works for Motif.
+
+insert off text
+ Text "text" has been inserted in Vim at position "off".
+ Only fired when enabled, see "startDocumentListen".
+
+invokeAction Not implemented.
+
+keyCommand keyName
+ Reports a special key being pressed with name "keyName", which
+ is a string.
+ Supported key names:
+ F1 function key 1
+ F2 function key 2
+ ...
+ F12 function key 12
+
+ ' ' space (without the quotes)
+ ! exclamation mark
+ ... any other ASCII printable character
+ ~ tilde
+
+ X any unrecognized key
+
+ The key may be prepended by "C", "S" and/or "M" for Control,
+ Shift and Meta (Alt) modifiers. If there is a modifier a dash
+ is used to separate it from the key name. For example:
+ "C-F2".
+ ASCII characters are new in version 2.1.
+
+keyAtPos keyName lnum/col
+ Like "keyCommand" and also report the line number and column
+ of the cursor.
+ New in version 2.1.
+
+killed A file was deleted or wiped out by the user and the buffer
+ annotations have been removed. The bufID number for this
+ buffer has become invalid. Only for files that have been
+ assigned a bufID number by the IDE.
+
+newDotAndMark off off
+ Reports the position of the cursor being at "off" bytes into
+ the buffer. Only sent just before a "keyCommand" event.
+
+quit Not implemented.
+
+remove off len
+ Text was deleted in Vim at position "off" with byte length
+ "len".
+ Only fired when enabled, see "startDocumentListen".
+
+revert Not implemented.
+
+save The buffer has been saved and is now unmodified.
+ Only fired when enabled, see "startDocumentListen".
+
+startupDone The editor has finished its startup work and is ready for
+ editing files.
+ New in version 2.1.
+
+unmodified The buffer is now unmodified.
+ Only fired when enabled, see "startDocumentListen".
+
+version vers Report the version of the interface implementation. Vim
+ reports "2.4" (including the quotes).
+
+
+6.6 Special messages *nb-special*
+
+These messages do not follow the style of the messages above. They are
+terminated by a newline character.
+
+ACCEPT Not used.
+
+AUTH password editor -> IDE: First message that the editor sends to the IDE.
+ Must contain the password for the socket server, as specified
+ with the |-nb| argument. No quotes are used!
+
+DISCONNECT IDE -> editor: break the connection. The editor will exit.
+ The IDE must only send this message when there are no unsaved
+ changes!
+
+DETACH IDE -> editor: break the connection without exiting the
+ editor. Used when the IDE exits without bringing down the
+ editor as well.
+ New in version 2.1.
+
+REJECT Not used.
+
+
+6.7 Protocol errors *nb-protocol_errors*
+
+These errors occur when a message violates the protocol:
+*E627* *E628* *E629* *E632* *E633* *E634* *E635* *E636*
+*E637* *E638* *E639* *E640* *E641* *E642* *E643* *E644* *E645* *E646*
+*E647* *E648* *E649* *E650* *E651* *E652*
+
+
+==============================================================================
+7. NetBeans commands *netbeans-commands*
+
+ *:nbstart* *E511* *E838*
+:nbs[tart] {connection} Start a new Netbeans session with {connection} as the
+ socket connection parameters. The format of
+ {connection} is described in |netbeans-parameters|.
+ At any time, one may check if the netbeans socket is
+ connected by running the command:
+ ':echo has("netbeans_enabled")'
+
+ *:nbclose*
+:nbc[lose] Close the current NetBeans session. Remove all placed
+ signs.
+
+ *:nbkey*
+:nb[key] {key} Pass the {key} to the Vim Controller for processing.
+ When a hot-key has been installed with the specialKeys
+ command, this command can be used to generate a hotkey
+ message to the Vim Controller.
+ This command can also be used to pass any text to the
+ Vim Controller. It is used by Pyclewn, for example,
+ to build the complete set of gdb commands as Vim user
+ commands.
+ The events newDotAndMark, keyCommand and keyAtPos are
+ generated (in this order).
+
+
+==============================================================================
+8. Known problems *netbeans-problems*
+
+NUL bytes are not possible. For editor -> IDE they will appear as NL
+characters. For IDE -> editor they cannot be inserted.
+
+A NetBeans session may be initiated with Vim running in a terminal, and
+continued later in a GUI environment after running the |:gui| command. In this
+case, the highlighting defined for the NetBeans annotations may be cleared
+when the ":gui" command sources .gvimrc and this file loads a colorscheme
+that runs the command ":highlight clear".
+New in version 2.5.
+
+
+==============================================================================
+9. Debugging NetBeans protocol *netbeans-debugging*
+
+To debug the Vim protocol, you must first compile Vim with debugging support
+and NetBeans debugging support. See |netbeans-configure| for instructions
+about Vim compiling and how to enable debug support.
+
+When running Vim, set the following environment variables:
+
+ export SPRO_GVIM_DEBUG=netbeans.log
+ export SPRO_GVIM_DLEVEL=0xffffffff
+
+Vim will then log all the incoming and outgoing messages of the NetBeans
+protocol to the file netbeans.log .
+
+The content of netbeans.log after a session looks like this:
+Tue May 20 17:19:27 2008
+EVT: 0:startupDone=0
+CMD 1: (1) create
+CMD 2: (1) setTitle "testfile1.txt"
+CMD 3: (1) setFullName "testfile1.txt"
+EVT(suppressed): 1:remove=3 0 -1
+EVT: 1:fileOpened=0 "d:\\work\\vimWrapper\\vimWrapper2\\pyvimwrapper\\tests\\testfile1.txt" T F
+CMD 4: (1) initDone
+FUN 5: (0) getCursor
+REP 5: 1 1 0 0
+CMD 6: (2) create
+CMD 7: (2) setTitle "testfile2.txt"
+CMD 8: (2) setFullName "testfile2.txt"
+EVT(suppressed): 2:remove=8 0 -1
+EVT: 2:fileOpened=0 "d:\\work\\vimWrapper\\vimWrapper2\\pyvimwrapper\\tests\\testfile2.txt" T F
+CMD 9: (2) initDone
+
+
+==============================================================================
+10. NetBeans External Editor
+
+NOTE: This information is obsolete! Only relevant if you are using an old
+version of NetBeans.
+
+
+10.1. Downloading NetBeans *netbeans-download*
+
+The NetBeans IDE is available for download from netbeans.org. You can download
+a released version, download sources, or use CVS to download the current
+source tree. If you choose to download sources, follow directions from
+netbeans.org on building NetBeans.
+
+Depending on the version of NetBeans you download, you may need to do further
+work to get the required External Editor module. This is the module which lets
+NetBeans work with gvim (or xemacs :-). See http://externaleditor.netbeans.org
+for details on downloading this module if your NetBeans release does not have
+it.
+
+For C, C++, and Fortran support you will also need the cpp module. See
+http://cpp.netbeans.org for information regarding this module.
+
+You can also download Sun ONE Studio from Sun Microsystems, Inc for a 30 day
+free trial. See http://www.sun.com for further details.
+
+
+10.2. NetBeans Key Bindings *netbeans-keybindings*
+
+Vim understands a number of key bindings that execute NetBeans commands.
+These are typically all the Function key combinations. To execute a NetBeans
+command, the user must press the Pause key followed by a NetBeans key binding.
+For example, in order to compile a Java file, the NetBeans key binding is
+"F9". So, while in vim, press "Pause F9" to compile a java file. To toggle a
+breakpoint at the current line, press "Pause Shift F8".
+
+The Pause key is Function key 21. If you don't have a working Pause key and
+want to use F8 instead, use: >
+
+ :map <F8> <F21>
+
+The External Editor module dynamically reads the NetBeans key bindings so vim
+should always have the latest key bindings, even when NetBeans changes them.
+
+
+10.3. Preparing NetBeans for Vim *netbeans-preparation*
+
+In order for NetBeans to work with vim, the NetBeans External Editor module
+must be loaded and enabled. If you have a Sun ONE Studio Enterprise Edition
+then this module should be loaded and enabled. If you have a NetBeans release
+you may need to find another way of obtaining this open source module.
+
+You can check if you have this module by opening the Tools->Options dialog
+and drilling down to the "Modules" list (IDE Configuration->System->Modules).
+If your Modules list has an entry for "External Editor" you must make sure
+it is enabled (the "Enabled" property should have the value "True"). If your
+Modules list has no External Editor see the next section on |obtaining-exted|.
+
+
+10.4. Obtaining the External Editor Module *obtaining-exted*
+
+There are 2 ways of obtaining the External Editor module. The easiest way
+is to use the NetBeans Update Center to download and install the module.
+Unfortunately, some versions do not have this module in their update
+center. If you cannot download via the update center you will need to
+download sources and build the module. I will try and get the module
+available from the NetBeans Update Center so building will be unnecessary.
+Also check http://externaleditor.netbeans.org for other availability options.
+
+To download the External Editor sources via CVS and build your own module,
+see http://externaleditor.netbeans.org and http://www.netbeans.org.
+Unfortunately, this is not a trivial procedure.
+
+
+10.5. Setting up NetBeans to run with Vim *netbeans-setup*
+
+Assuming you have loaded and enabled the NetBeans External Editor module
+as described in |netbeans-preparation| all you need to do is verify that
+the gvim command line is properly configured for your environment.
+
+Open the Tools->Options dialog and open the Editing category. Select the
+External Editor. The right hand pane should contain a Properties tab and
+an Expert tab. In the Properties tab make sure the "Editor Type" is set
+to "Vim". In the Expert tab make sure the "Vim Command" is correct.
+
+You should be careful if you change the "Vim Command". There are command
+line options there which must be there for the connection to be properly
+set up. You can change the command name but that's about it. If your gvim
+can be found by your $PATH then the Vim Command can start with "gvim". If
+you don't want gvim searched from your $PATH then hard code in the full
+Unix path name. At this point you should get a gvim for any source file
+you open in NetBeans.
+
+If some files come up in gvim and others (with different file suffixes) come
+up in the default NetBeans editor you should verify the MIME type in the
+Expert tab MIME Type property. NetBeans is MIME oriented and the External
+Editor will only open MIME types specified in this property.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
new file mode 100644
index 0000000..4f0ac45
--- /dev/null
+++ b/runtime/doc/options.txt
@@ -0,0 +1,9541 @@
+*options.txt* For Vim version 9.0. Last change: 2023 Feb 17
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Options *options*
+
+1. Setting options |set-option|
+2. Automatically setting options |auto-setting|
+3. Options summary |option-summary|
+
+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:
+ boolean can only be on or off *boolean* *toggle*
+ number has a numeric value
+ string has a string value
+
+==============================================================================
+1. Setting options *set-option* *E764*
+
+ *:se* *:set*
+:se[t][!] Show all options that differ from their default value.
+ When [!] is present every option is on a separate
+ line.
+
+:se[t][!] all Show all but terminal options.
+ When [!] is present every option is on a separate
+ line.
+
+: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...
+ The options have the form t_AB, see
+ |terminal-options|.
+
+:se[t]! termcap Idem, but don't use multiple columns.
+
+ *E518* *E519*
+:se[t] {option}? Show value of {option}.
+
+:se[t] {option} Toggle option: set, switch it on.
+ Number option: show value.
+ String option: show value.
+
+:se[t] no{option} Toggle option: Reset, switch it off.
+
+ *:set-!* *:set-inv*
+:se[t] {option}! or
+:se[t] inv{option} Toggle option: Invert value.
+
+ *:set-default* *:set-&* *:set-&vi* *:set-&vim*
+:se[t] {option}& Reset option to its default value. May depend on the
+ current value of 'compatible'.
+:se[t] {option}&vi Reset option to its Vi default value.
+:se[t] {option}&vim Reset option to its Vim default value.
+
+:se[t] all& Set all options to their default value. The values of
+ these options are not changed:
+ all terminal options, starting with t_
+ 'columns'
+ 'cryptmethod'
+ 'encoding'
+ 'key'
+ 'lines'
+ 'term'
+ 'ttymouse'
+ 'ttytype'
+ Warning: This may have a lot of side effects.
+
+ *:set-args* *E487* *E521*
+:se[t] {option}={value} or
+:se[t] {option}:{value}
+ Set string or number option to {value}.
+ For numeric options the value can be given in decimal,
+ hex (preceded with 0x) or octal (preceded with '0').
+ The old value can be inserted by typing 'wildchar' (by
+ default this is a <Tab> or CTRL-E if 'compatible' is
+ set). See |cmdline-completion|.
+ White space between {option} and '=' is allowed and
+ will be ignored. White space between '=' and {value}
+ is not allowed.
+ See |option-backslash| for using white space and
+ backslashes in {value}.
+
+:se[t] {option}+={value} *:set+=*
+ Add the {value} to a number option, or append the
+ {value} to a string option. When the option is a
+ comma-separated list, a comma is added, unless the
+ value was empty.
+ If the option is a list of flags, superfluous flags
+ are removed. When adding a flag that was already
+ present the option value doesn't change.
+ Also see |:set-args| above.
+
+:se[t] {option}^={value} *:set^=*
+ Multiply the {value} to a number option, or prepend
+ the {value} to a string option. When the option is a
+ comma-separated list, a comma is added, unless the
+ value was empty.
+ Also see |:set-args| above.
+
+:se[t] {option}-={value} *:set-=*
+ Subtract the {value} from a number option, or remove
+ the {value} from a string option, if it is there.
+ If the {value} is not found in a string option, there
+ is no error or warning. When the option is a comma
+ separated list, a comma is deleted, unless the option
+ becomes empty.
+ When the option is a list of flags, {value} must be
+ exactly as they appear in the option. Remove flags
+ one by one to avoid problems.
+ Also see |:set-args| above.
+
+The {option} arguments to ":set" may be repeated. For example: >
+ :set ai nosi sw=3 ts=3
+If you make an error in one of the arguments, an error message will be given
+and the following arguments will be ignored.
+
+ *:set-verbose*
+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 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.
+Note that an option may also have been set as a side effect of setting
+'compatible'.
+A few special texts:
+ 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 +.
+ Last set from -c argument ~
+ Option was set with command line argument |-c|, +, |-S| or
+ |-q|.
+ Last set from environment variable ~
+ Option was set from an environment variable, $VIMINIT,
+ $GVIMINIT or $EXINIT.
+ 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
+means that the number of backslashes in an option value is halved (rounded
+down).
+A few examples: >
+ :set tags=tags\ /usr/tags results in "tags /usr/tags"
+ :set tags=tags\\,file results in "tags\,file"
+ :set tags=tags\\\ file results in "tags\ file"
+
+The "|" character separates a ":set" command from a following command. To
+include the "|" in the option value, use "\|" instead. This example sets the
+'titlestring' option to "hi|there": >
+ :set titlestring=hi\|there
+This sets the 'titlestring' option to "hi" and 'iconstring' to "there": >
+ :set titlestring=hi|set iconstring=there
+
+Similarly, in legacy script the double quote character starts a comment. To
+include the '"' in the option value, use '\"' instead. This example sets the
+'titlestring' option to 'hi "there"': >
+ :set titlestring=hi\ \"there\"
+
+In |Vim9| script it's simpler, comments start with a '#' character, and only
+when preceded by white space. A backslash is needed less often: >
+ vim9script
+ set titlestring=hi\ "there"
+ set titlestring=hi#there#
+ set titlestring=hi\ \#there#
+
+For Win32 backslashes in file names are mostly not removed. More precise: For
+options that expect a file name (those where environment variables are
+expanded) a backslash before a normal file name character is not removed. But
+a backslash before a special character (space, backslash, comma, etc.) is used
+like explained above.
+There is one special situation, when the value starts with "\\": >
+ :set dir=\\machine\path results in "\\machine\path"
+ :set dir=\\\\machine\\path results in "\\machine\path"
+ :set dir=\\path\\file results in "\\path\file" (wrong!)
+For the first one the start is kept, but for the second one the backslashes
+are halved. This makes sure it works both when you expect backslashes to be
+halved and when you expect the backslashes to be kept. The third gives a
+result which is probably not what you want. Avoid it.
+
+ *add-option-flags* *remove-option-flags*
+ *E539* *E550* *E551* *E552*
+Some options are a list of flags. When you want to add a flag to such an
+option, without changing the existing ones, you can do it like this: >
+ :set guioptions+=a
+Remove a flag from an option like this: >
+ :set guioptions-=a
+This removes the 'a' flag from 'guioptions'.
+Note that you should add or remove one flag at a time. If 'guioptions' has
+the value "ab", using "set guioptions-=ba" won't work, because the string "ba"
+doesn't appear.
+
+ *:set_env* *expand-env* *expand-environment-var*
+Environment variables in specific string options will be expanded. If the
+environment variable exists the '$' and the following environment variable
+name is replaced with its value. If it does not exist the '$' and the name
+are not modified. Any non-id character (not a letter, digit or '_') may
+follow the environment variable name. That character and what follows is
+appended to the value of the environment variable. Examples: >
+ :set term=$TERM.new
+ :set path=/usr/$INCLUDE,$HOME/include,.
+When adding or removing a string from an option with ":set opt-=val" or ":set
+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 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.
+
+The following explains what happens to these local options in specific
+situations. You don't really need to know all of this, since Vim mostly uses
+the option values you would expect. Unfortunately, doing what the user
+expects is a bit complicated...
+
+When splitting a window, the local options are copied to the new window. Thus
+right after the split the contents of the two windows look the same.
+
+When editing a new buffer, its local option values must be initialized. Since
+the local options of the current buffer might be specifically for that buffer,
+these are not used. Instead, for each buffer-local option there also is a
+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 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
+using these local window options. Therefore Vim keeps a global value of the
+local window options, which is used when editing another buffer. Each window
+has its own copy of these values. Thus these are local to the window, but
+global to all buffers in the window. With this you can do: >
+ :e one
+ :set list
+ :e two
+Now the 'list' option will also be set in "two", since with the ":set list"
+command you have also set the global value. >
+ :set nolist
+ :e one
+ :setlocal list
+ :e two
+Now the 'list' option is not set, because ":set nolist" resets the global
+value, ":setlocal list" only changes the local value and ":e two" gets the
+global value. Note that if you do this next: >
+ :e one
+You will get back the 'list' value as it was the last time you edited "one".
+The options local to a window are remembered for each buffer. This also
+happens when the buffer is not loaded, but they are lost when the buffer is
+wiped out |:bwipe|.
+
+ *:setl* *:setlocal*
+:setl[ocal][!] ... Like ":set" but set only the value local to the
+ current buffer or window. Not all options have a
+ local value. If the option does not have a local
+ value the global value is set.
+ With the "all" argument: display local values for all
+ local options.
+ Without argument: Display local values for all local
+ options which are different from the default.
+ When displaying a specific local option, show the
+ local value. For a global/local boolean option, when
+ the global value is being used, "--" is displayed
+ before the option name.
+ For a global option the global value is
+ shown (but that might change in the future).
+
+:setl[ocal] {option}< Set the local value of {option} to its global value by
+ copying the value.
+
+:se[t] {option}< For |global-local| options: Remove the local value of
+ {option}, so that the global value will be used.
+
+ *:setg* *:setglobal*
+:setg[lobal][!] ... Like ":set" but set only the global value for a local
+ option without changing the local value.
+ When displaying an option, the global value is shown.
+ With the "all" argument: display global values for all
+ local options.
+ Without argument: display global values for all local
+ options which are different from the default.
+
+For buffer-local and window-local options:
+ Command global value local value ~
+ :set option=value set set
+ :setlocal option=value - set
+:setglobal option=value set -
+ :set option? - display
+ :setlocal option? - display
+:setglobal option? display -
+
+
+Global options with a local value *global-local*
+
+Options are global when you mostly use one value for all buffers and windows.
+For some global options it's useful to sometimes have a different local value.
+You can set the local value with ":setlocal". That buffer or window will then
+use the local value, while other buffers and windows continue using the global
+value.
+
+For example, you have two windows, both on C source code. They use the global
+'makeprg' option. If you do this in one of the two windows: >
+ :set makeprg=gmake
+then the other window will switch to the same value. There is no need to set
+the 'makeprg' option in the other C source window too.
+However, if you start editing a Perl file in a new window, you want to use
+another 'makeprg' for it, without changing the value used for the C source
+files. You use this command: >
+ :setlocal makeprg=perlmake
+You can switch back to using the global value by making the local value empty: >
+ :setlocal makeprg=
+This only works for a string option. For a number or boolean option you need
+to use the "<" flag, like this: >
+ :setlocal autoread<
+Note that for non-boolean and non-number options using "<" copies the global
+value to the local value, it doesn't switch back to using the global value
+(that matters when the global value changes later). You can also use: >
+ :set path<
+This will make the local value of 'path' empty, so that the global value is
+used. Thus it does the same as: >
+ :setlocal path=
+Note: In the future more global options can be made |global-local|. Using
+":setlocal" on a global option might work differently then.
+
+
+ *option-value-function*
+Some options ('completefunc', 'imactivatefunc', 'imstatusfunc', 'omnifunc',
+'operatorfunc', 'quickfixtextfunc', 'tagfunc' and 'thesaurusfunc') are set to
+a function name or a function reference or a lambda function. When using a
+lambda it will be converted to the name, e.g. "<lambda>123". Examples:
+>
+ set opfunc=MyOpFunc
+ set opfunc=function('MyOpFunc')
+ set opfunc=funcref('MyOpFunc')
+ set opfunc={a\ ->\ MyOpFunc(a)}
+
+Set to a script-local function: >
+ set opfunc=s:MyLocalFunc
+ set opfunc=<SID>MyLocalFunc
+In |Vim9| script the "s:" and "<SID>" can be omitted if the function exists in
+the script: >
+ set opfunc=MyLocalFunc
+
+Set using a funcref variable: >
+ let Fn = function('MyTagFunc')
+ let &tagfunc = Fn
+
+Set using a lambda expression: >
+ let &tagfunc = {t -> MyTagFunc(t)}
+
+Set using a variable with lambda expression: >
+ let L = {a, b, c -> MyTagFunc(a, b , c)}
+ let &tagfunc = L
+
+In Vim9 script, in a compiled function, you can use a lambda, but a
+closured does not work, because the function will be called without the
+context of where it was defined.
+
+
+Setting the filetype
+
+: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: >
+ :if !did_filetype()
+ : setlocal filetype={filetype}
+ :endif
+< This command is used in a filetype.vim file to avoid
+ 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 be 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.
+ Options are grouped by function.
+ Offers short help for each option. Hit <CR> on the
+ short help to open a help window with more help for
+ the option.
+ Modify the value of the option and hit <CR> on the
+ "set" line to set the new value. For window and
+ buffer specific options, the last accessed window is
+ used to set the option value in, unless this is a help
+ window, in which case the window below help window is
+ used (skipping the option-window).
+ {not available when compiled without the |+eval|
+ feature}
+
+ *$HOME*
+Using "~" is like using "$HOME", but it is only recognized at the start of an
+option and after a space or comma.
+
+On Unix systems "~user" can be used too. It is replaced by the home directory
+of user "user". Example: >
+ :set path=~mool/include,/usr/include,.
+
+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.
+
+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.
+
+ *:fix* *:fixdel*
+:fix[del] Set the value of 't_kD':
+ 't_kb' is 't_kD' becomes ~
+ CTRL-? CTRL-H
+ not CTRL-? CTRL-?
+
+ (CTRL-? is 0o177 octal, 0x7f hex)
+
+ If your delete key terminal code is wrong, but the
+ code for backspace is alright, you can put this in
+ your .vimrc: >
+ :fixdel
+< This works no matter what the actual code for
+ backspace is.
+
+ If the backspace key terminal code is wrong you can
+ use this: >
+ :if &term == "termname"
+ : set t_kb=^V<BS>
+ : fixdel
+ :endif
+< Where "^V" is CTRL-V and "<BS>" is the backspace key
+ (don't type four characters!). Replace "termname"
+ with your terminal name.
+
+ If your <Delete> key sends a strange key sequence (not
+ CTRL-? or CTRL-H) you cannot use ":fixdel". Then use: >
+ :if &term == "termname"
+ : set t_kD=^V<Delete>
+ :endif
+< Where "^V" is CTRL-V and "<Delete>" is the delete key
+ (don't type eight characters!). Replace "termname"
+ with your terminal name.
+
+ *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*
+
+Besides changing options with the ":set" command, there are three alternatives
+to set options automatically for one or more files:
+
+1. When starting Vim initializations are read from various places. See
+ |initialization|. Most of them are performed for all editing sessions,
+ and some of them depend on the directory where Vim is started.
+ You can create an initialization file with |:mkvimrc|, |:mkview| and
+ |:mksession|.
+2. If you start editing a new file, the automatic commands are executed.
+ This can be used to set options for files matching a particular pattern and
+ many other things. See |autocommand|.
+3. If you start editing a new file, and the 'modeline' option is on, a
+ number of lines at the beginning and end of the file are checked for
+ modelines. This is explained here.
+
+ *modeline* *vim:* *vi:* *ex:* *E520*
+There are two forms of modelines. The first form:
+ [text{white}]{vi:|vim:|ex:}[white]{options}
+
+[text{white}] empty or any text followed by at least one blank
+ character (<Space> or <Tab>); "ex:" always requires at
+ least one blank character
+{vi:|vim:|ex:} the string "vi:", "vim:" or "ex:"
+[white] optional white space
+{options} a list of option settings, separated with white space
+ or ':', where each part between ':' is the argument
+ for a ":set" command (can be empty)
+
+Examples:
+ vi:noai:sw=3 ts=6 ~
+ vim: tw=77 ~
+
+The second form (this is compatible with some versions of Vi):
+
+ [text{white}]{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
+
+[text{white}] empty or any text followed by at least one blank
+ character (<Space> or <Tab>); "ex:" always requires at
+ least one blank character
+{vi:|vim:|Vim:|ex:} the string "vi:", "vim:", "Vim:" or "ex:"
+[white] optional white space
+se[t] the string "set " or "se " (note the space); When
+ "Vim" is used it must be "set".
+{options} a list of options, separated with white space, which
+ is the argument for a ":set" command
+: a colon
+[text] any text or empty
+
+Examples:
+ /* vim: set ai tw=75: */ ~
+ /* Vim: set ai tw=75: */ ~
+
+The white space before {vi:|vim:|Vim:|ex:} is required. This minimizes the
+chance that a normal word like "lex:" is caught. There is one exception:
+"vi:" and "vim:" can also be at the start of the line (for compatibility with
+version 3.0). Using "ex:" at the start of the line will be ignored (this
+could be short for "example:").
+
+If the modeline is disabled within a modeline, subsequent modelines will be
+ignored. This is to allow turning off modeline on a per-file basis. This is
+useful when a line looks like a modeline but isn't. For example, it would be
+good to start a YAML file containing strings like "vim:" with
+ # vim: nomodeline ~
+so as to avoid modeline misdetection. Following options on the same line
+after modeline deactivation, if any, are still evaluated (but you would
+normally not have any).
+
+ *modeline-local*
+The options are set like with ":setlocal": The new value only applies to the
+buffer and window that contain the file. Although it's possible to set global
+options from a modeline, this is unusual. If you have two windows open and
+the files in it set the same global option to a different value, the result
+depends on which one was opened last.
+
+When editing a file that was already loaded, only the window-local options
+from the modeline are used. Thus if you manually changed a buffer-local
+option after opening the file, it won't be changed if you edit the same buffer
+in another window. But window-local options will be set.
+
+ *modeline-version*
+If the modeline is only to be used for some versions of Vim, the version
+number can be specified where "vim:" or "Vim:" is used:
+ vim{vers}: version {vers} or later
+ vim<{vers}: version before {vers}
+ vim={vers}: version {vers}
+ vim>{vers}: version after {vers}
+{vers} is 700 for Vim 7.0 (hundred times the major version plus minor).
+For example, to use a modeline only for Vim 7.0:
+ /* vim700: set foldmethod=marker */ ~
+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 number of lines that are checked can be set with the 'modelines' option.
+If 'modeline' is off or 'modelines' is 0 no lines are checked.
+
+Note that for the first form all of the rest of the line is used, thus a line
+like:
+ /* vi:ts=4: */ ~
+will give an error message for the trailing "*/". This line is OK:
+ /* vi:set ts=4: */ ~
+
+If an error is detected the rest of the line is skipped.
+
+If you want to include a ':' in a set command precede it with a '\'. The
+backslash in front of the ':' will be removed. Example:
+ /* vi:set fillchars=stl\:^,vert\:\|: */ ~
+This sets the 'fillchars' option to "stl:^,vert:\|". Only a single backslash
+before the ':' is removed. Thus to include "\:" you have to specify "\\:".
+ *E992*
+No other commands than "set" are supported, for security reasons (somebody
+might create a Trojan horse text file with modelines). And not all options
+can be set. For some options a flag is set, so that when the value is used
+the |sandbox| is effective. Some options can only be set from the modeline
+when 'modelineexpr' is set (the default is off).
+
+Still, there is always a small risk that a modeline causes trouble. E.g.,
+when some joker sets 'textwidth' to 5 all your lines are wrapped unexpectedly.
+So disable modelines before editing untrusted text. The mail ftplugin does
+this, for example.
+
+Hint: If you would like to do something else than setting an option, you could
+define an autocommand that checks the file for a specific string. For
+example: >
+ au BufReadPost * if getline(1) =~ "VAR" | call SetVar() | endif
+And define a function SetVar() that does something with the line containing
+"VAR".
+
+==============================================================================
+3. Options summary *option-summary*
+
+In the list below all the options are mentioned with their full name and with
+an abbreviation if there is one. Both forms may be used.
+
+In this document when a boolean option is "set" that means that ":set option"
+is entered. When an option is "reset", ":set nooption" is used.
+
+For some options there are two default values: The "Vim default", which is
+used when 'compatible' is not set, and the "Vi default", which is used when
+'compatible' is set.
+
+Most options are the same in all windows and buffers. There are a few that
+are specific to how the text is presented in a window. These can be set to a
+different value in each window. For example the 'list' option can be set in
+one window and reset in another for the same text, giving both types of view
+at the same time. There are a few options that are specific to a certain
+file. These can have a different value for each file or buffer. For example
+the 'textwidth' option can be 78 for a normal text file and 0 for a C
+program.
+
+ global one option for all buffers and windows
+ local to window each window has its own copy of this option
+ local to buffer each buffer has its own copy of this option
+
+When creating a new window the option values from the currently active window
+are used as a default value for the window-specific options. For the
+buffer-specific options this depends on the 's' and 'S' flags in the
+'cpoptions' option. If 's' is included (which is the default) the values for
+buffer options are copied from the currently active buffer when a buffer is
+first entered. If 'S' is present the options are copied each time the buffer
+is entered, this is almost like having global options. If 's' and 'S' are not
+present, the options are copied from the currently active buffer when the
+buffer is created.
+
+Hidden options *hidden-options*
+
+Not all options are supported in all versions. This depends on the supported
+features and sometimes on the system. A remark about this is in curly braces
+below. When an option is not supported it may still be set without getting an
+error, this is called a hidden option. You can't get the value of a hidden
+option though, it is not stored.
+
+To test if option "foo" can be used with ":set" use something like this: >
+ if exists('&foo')
+This also returns true for a hidden option. To test if option "foo" is really
+supported use something like this: >
+ if exists('+foo')
+<
+ *E355*
+A jump table for the options with a short description can be found at |Q_op|.
+
+ *'aleph'* *'al'* *aleph* *Aleph*
+'aleph' 'al' number (default 128 for MS-Windows, 224 otherwise)
+ global
+ {only available when compiled with the |+rightleft|
+ feature}
+ The ASCII code for the first letter of the Hebrew alphabet. The
+ routine that maps the keyboard in Hebrew mode, both in Insert mode
+ (when hkmap is set) and on the command-line (when hitting CTRL-_)
+ outputs the Hebrew characters in the range [aleph..aleph+26].
+ aleph=128 applies to PC code, and aleph=224 applies to ISO 8859-8.
+ See |rileft.txt|.
+
+ *'allowrevins'* *'ari'* *'noallowrevins'* *'noari'*
+'allowrevins' 'ari' boolean (default off)
+ global
+ {only available when compiled with the |+rightleft|
+ feature}
+ Allow CTRL-_ in Insert and Command-line mode. This is default off, to
+ avoid that users that accidentally type CTRL-_ instead of SHIFT-_ get
+ into reverse Insert mode, and don't know how to get out. See
+ 'revins'.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'altkeymap'* *'akm'* *'noaltkeymap'* *'noakm'*
+'altkeymap' 'akm' boolean (default off)
+ global
+ {only available when compiled with the |+farsi|
+ feature}
+ This option was for using Farsi, which has been removed. See
+ |farsi.txt|.
+
+ *'ambiwidth'* *'ambw'*
+'ambiwidth' 'ambw' string (default: "single")
+ global
+ 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).
+
+ There are currently two possible values:
+ "single": Use the same width as characters in US-ASCII. This is
+ expected by most users.
+ "double": Use twice the width of ASCII characters.
+ *E834* *E835*
+ The value "double" cannot be used if 'listchars' or 'fillchars'
+ contains a character that would be double width. These errors may
+ also be given when calling setcellwidths().
+
+ The values are overruled for characters specified with
+ |setcellwidths()|.
+
+ There are a number of CJK fonts for which the width of glyphs for
+ those characters are solely based on how many octets they take in
+ legacy/traditional CJK encodings. In those encodings, Euro,
+ Registered sign, Greek/Cyrillic letters are represented by two octets,
+ therefore those fonts have "wide" glyphs for them. This is also
+ true of some line drawing characters used to make tables in text
+ file. Therefore, when a CJK font is used for GUI Vim or
+ Vim is running inside a terminal (emulators) that uses a CJK font
+ (or Vim is run inside an xterm invoked with "-cjkwidth" option.),
+ this option should be set to "double" to match the width perceived
+ by Vim with the width of glyphs in the font. Perhaps it also has
+ to be set to "double" under CJK MS-Windows when the system locale is
+ set to one of CJK locales. 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
+ escape sequence to request cursor position report. The response can
+ be found in |v:termu7resp|.
+
+ *'antialias'* *'anti'* *'noantialias'* *'noanti'*
+'antialias' 'anti' boolean (default: off)
+ global
+ {only available when compiled with GUI enabled
+ on macOS}
+ This option only has an effect in the GUI version of Vim on macOS
+ v10.2 or later. When on, Vim will use smooth ("antialiased") fonts,
+ which can be easier to read at certain sizes on certain displays.
+ Setting this option can sometimes cause problems if 'guifont' is set
+ to its default (empty string).
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'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
+ or selected. When a buffer has no name it also has no directory, thus
+ the current directory won't change when navigating to it.
+ Note: When this option is on some plugins may not work.
+
+ *'autoshelldir'* *'asd'* *'noautoshelldir'* *'noasd'*
+'autoshelldir' 'asd' boolean (default off)
+ global
+ When on, Vim will change the current working directory whenever you
+ change the directory of the shell running in a terminal window. You
+ need proper setting-up, so whenever the shell's pwd changes an OSC 7
+ escape sequence will be emitted. For example, on Linux, you can
+ source /etc/profile.d/vte.sh in your shell profile if you use bash or
+ zsh. For bash this should work (put it in a bash init file): >
+ if [[ -n "$VIM_TERMINAL" ]]; then
+ PROMPT_COMMAND='_vim_sync_PWD'
+ function _vim_sync_PWD() {
+ printf '\033]7;file://%s\033\\' "$PWD"
+ }
+ fi
+<
+ Or, in a zsh init file: >
+ if [[ -n "$VIM_TERMINAL" ]]; then
+ autoload -Uz add-zsh-hook
+ add-zsh-hook -Uz chpwd _vim_sync_PWD
+ function _vim_sync_PWD() {
+ printf '\033]7;file://%s\033\\' "$PWD"
+ }
+ fi
+<
+ In a fish init file: >
+ if test -n "$VIM_TERMINAL"
+ function _vim_sync_PWD --on-variable=PWD
+ printf '\033]7;file://%s\033\\' "$PWD"
+ end
+ end
+<
+ You can find an alternative method at |terminal-autoshelldir|.
+ When the parsing of the OSC sequence fails you get *E1179* .
+
+ *'arabic'* *'arab'* *'noarabic'* *'noarab'*
+'arabic' 'arab' boolean (default off)
+ local to window
+ {only available when compiled with the |+arabic|
+ feature}
+ This option can be set to start editing Arabic text.
+ Setting this option will:
+ - Set the 'rightleft' option, unless 'termbidi' is set.
+ - Set the 'arabicshape' option, unless 'termbidi' is set.
+ - 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.
+ - Disable the use of 'keymap' (without changing its value).
+ Note that 'arabicshape' and 'delcombine' are not reset (it is a global
+ option).
+ NOTE: This option is reset when 'compatible' is set.
+ Also see |arabic.txt|.
+
+ *'arabicshape'* *'arshape'*
+ *'noarabicshape'* *'noarshape'*
+'arabicshape' 'arshape' boolean (default on)
+ global
+ {only available when compiled with the |+arabic|
+ feature}
+ When on and 'termbidi' is off, the required visual character
+ corrections that need to take place for displaying the Arabic language
+ take effect. Shaping, in essence, gets enabled; the term is a broad
+ one which encompasses:
+ a) the changing/morphing of characters based on their location
+ within a word (initial, medial, final and stand-alone).
+ b) the enabling of the ability to compose characters
+ c) the enabling of the required combining of some characters
+ When disabled the display shows each character's true stand-alone
+ form.
+ Arabic is a complex language which requires other settings, for
+ further details see |arabic.txt|.
+ NOTE: This option is set when 'compatible' is set.
+
+ *'autoindent'* *'ai'* *'noautoindent'* *'noai'*
+'autoindent' 'ai' boolean (default off)
+ local to buffer
+ Copy indent from current line when starting a new line (typing <CR>
+ in Insert mode or when using the "o" or "O" command). If you do not
+ type anything on the new line except <BS> or CTRL-D and then type
+ <Esc>, CTRL-O or <CR>, the indent is deleted again. Moving the cursor
+ to another line has the same effect, unless the 'I' flag is included
+ in 'cpoptions'.
+ When autoindent is on, formatting (with the "gq" command or when you
+ reach 'textwidth' in Insert mode) uses the indentation of the first
+ line.
+ When 'smartindent' or 'cindent' is on the indent is changed in
+ a different way.
+ The 'autoindent' option is reset when the 'paste' option is set and
+ restored when 'paste' is reset.
+
+ *'autoread'* *'ar'* *'noautoread'* *'noar'*
+'autoread' 'ar' boolean (default off)
+ 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, 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<
+<
+ *'autowrite'* *'aw'* *'noautowrite'* *'noaw'*
+'autowrite' 'aw' boolean (default off)
+ global
+ Write the contents of the file, if it has been modified, on each
+ `:next`, `:rewind`, `:last`, `:first`, `:previous`, `:stop`,
+ `:suspend`, `:tag`, `:!`, `:make`, CTRL-] and CTRL-^ command; and when
+ a `:buffer`, CTRL-O, CTRL-I, '{A-Z0-9}, or `{A-Z0-9} command takes one
+ to another file.
+ A buffer is not written if it becomes hidden, e.g. when 'bufhidden' is
+ set to "hide" and `:next` is used.
+ 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)
+ global
+ Like 'autowrite', but also used for commands ":edit", ":enew", ":quit",
+ ":qall", ":exit", ":xit", ":recover" and closing the Vim window.
+ Setting this option also implies that Vim behaves like 'autowrite' has
+ 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*
+ 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.
+ If the GUI supports a dark theme, you can use the "d" flag in
+ 'guioptions', see 'go-d'.
+
+ When the |t_RB| option is set, Vim will use it to request the background
+ color from the terminal. If the returned RGB value is dark/light and
+ 'background' is not dark/light, 'background' will be set and the
+ screen is redrawn. This may have side effects, make t_BG empty in
+ your .vimrc if you suspect this problem. The response to |t_RB| can
+ be found in |v:termrbgresp|.
+
+ 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 MS-Windows the default is "dark".
+ For other systems "dark" is used when 'term' is "linux",
+ "screen.linux", "cygwin" or "putty", or $COLORFGBG suggests a dark
+ background. Otherwise the default is "light".
+
+ The |:terminal| command and the |term_start()| function use the
+ 'background' value to decide whether the terminal window will start
+ with a white or black background.
+
+ Normally this option would be set in the .vimrc file. Possibly
+ depending on the terminal name. Example: >
+ :if &term == "pcterm"
+ : set background=dark
+ :endif
+< When this option is set, the default settings for the highlight groups
+ will change. To use other settings, place ":highlight" commands AFTER
+ the setting of the 'background' option.
+ This option is also used in the "$VIMRUNTIME/syntax/syntax.vim" file
+ to select the colors for syntax highlighting. After changing this
+ option, you must load syntax.vim again to see the result. This can be
+ done with ":syntax on".
+
+ *'backspace'* *'bs'*
+'backspace' 'bs' string (default "", set to "indent,eol,start"
+ in |defaults.vim|)
+ global
+ Influences the working of <BS>, <Del>, CTRL-W and CTRL-U in Insert
+ mode. This is a list of items, separated by commas. Each item allows
+ a way to backspace over something:
+ value effect ~
+ indent allow backspacing over autoindent
+ eol allow backspacing over line breaks (join lines)
+ start allow backspacing over the start of insert; CTRL-W and CTRL-U
+ stop once at the start of insert.
+ nostop like start, except CTRL-W and CTRL-U do not stop at the start of
+ insert.
+
+ When the value is empty, Vi compatible backspacing is used, none of
+ the ways mentioned for the items above are possible.
+
+ For backwards compatibility with version 5.4 and earlier:
+ value effect ~
+ 0 same as ":set backspace=" (Vi compatible)
+ 1 same as ":set backspace=indent,eol"
+ 2 same as ":set backspace=indent,eol,start"
+ 3 same as ":set backspace=indent,eol,nostop"
+
+ See |:fixdel| if your <BS> or <Del> key does not do what you want.
+ NOTE: This option is set to "" when 'compatible' is set.
+
+ *'backup'* *'bk'* *'nobackup'* *'nobk'*
+'backup' 'bk' boolean (default off)
+ global
+ Make a backup before overwriting a file. Leave it around after the
+ file has been successfully written. If you do not want to keep the
+ backup file, but you do want a backup while the file is being
+ written, reset this option and set the 'writebackup' option (this is
+ the default). If you do not want a backup file at all reset both
+ options (use this if your file system is almost full). See the
+ |backup-table| for more explanations.
+ When the 'backupskip' pattern matches, a backup is not made anyway.
+ When 'patchmode' is set, the backup may be renamed to become the
+ oldest version of a file.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'backupcopy'* *'bkc'*
+'backupcopy' 'bkc' string (Vi default for Unix: "yes", otherwise: "auto")
+ global or local to buffer |global-local|
+ When writing a file and a backup is made, this option tells how it's
+ done. This is a comma-separated list of words.
+
+ The main values are:
+ "yes" make a copy of the file and overwrite the original one
+ "no" rename the file and write a new one
+ "auto" one of the previous, what works best
+
+ Extra values that can be combined with the ones above are:
+ "breaksymlink" always break symlinks when writing
+ "breakhardlink" always break hardlinks when writing
+
+ Making a copy and overwriting the original file:
+ - Takes extra time to copy the file.
+ + When the file has special attributes, is a (hard/symbolic) link or
+ has a resource fork, all this is preserved.
+ - When the file is a link the backup will have the name of the link,
+ not of the real file.
+
+ Renaming the file and writing a new one:
+ + It's fast.
+ - Sometimes not all attributes of the file can be copied to the new
+ file.
+ - When the file is a link the new file will not be a link.
+
+ The "auto" value is the middle way: When Vim sees that renaming the
+ file is possible without side effects (the attributes can be passed on
+ and the file is not a link) that is used. When problems are expected,
+ a copy will be made.
+
+ The "breaksymlink" and "breakhardlink" values can be used in
+ combination with any of "yes", "no" and "auto". When included, they
+ force Vim to always break either symbolic or hard links by doing
+ exactly what the "no" option does, renaming the original file to
+ become the backup and writing a new file in its place. This can be
+ useful for example in source trees where all the files are symbolic or
+ hard links and any changes should stay in the local source tree, not
+ be propagated back to the original source.
+ *crontab*
+ One situation where "no" and "auto" will cause problems: A program
+ that opens a file, invokes Vim to edit that file, and then tests if
+ the open file was changed (through the file descriptor) will check the
+ backup file instead of the newly created file. "crontab -e" is an
+ example.
+
+ When a copy is made, the original file is truncated and then filled
+ with the new text. This means that protection bits, owner and
+ symbolic links of the original file are unmodified. The backup file,
+ however, is a new file, owned by the user who edited the file. The
+ group of the backup is set to the group of the original file. If this
+ fails, the protection bits for the group are made the same as for
+ others.
+
+ When the file is renamed, this is the other way around: The backup has
+ the same attributes of the original file, and the newly written file
+ is owned by the current user. When the file was a (hard/symbolic)
+ link, the new file will not! That's why the "auto" value doesn't
+ rename when the file is a link. The owner and group of the newly
+ written file will be set to the same ones as the original file, but
+ the system may refuse to do this. In that case the "auto" value will
+ again not rename the file.
+
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'backupdir'* *'bdir'*
+'backupdir' 'bdir' string (default for Amiga: ".,t:",
+ for Win32: ".,$TEMP,c:/tmp,c:/temp"
+ for Unix: ".,~/tmp,~/")
+ global
+ List of directories for the backup file, separated with commas.
+ - 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
+ impossible!). Writing may fail because of this.
+ - A directory "." means to put the backup file in the same directory
+ as the edited file.
+ - A directory starting with "./" (or ".\" for MS-Windows) means to put
+ the backup file relative to where the edited file is. The leading
+ "." is replaced with the path name of the edited file.
+ ("." inside a directory name has no special meaning).
+ - Spaces after the comma are ignored, other spaces are considered part
+ of the directory name. To have a space at the start of a directory
+ name, precede it with a backslash.
+ - To include a comma in a directory name precede it with a backslash.
+ - A directory name may end in an '/'.
+ - For Unix and Win32, if a directory ends in two path separators "//",
+ the backup file name will be built from the complete path to the
+ file with all path separators changed to percent '%' signs. This
+ will ensure file name uniqueness in the backup directory.
+ On Win32, it is also possible to end with "\\". However, When a
+ separating comma is following, you must use "//", since "\\" will
+ include the comma in the file name. Therefore it is recommended to
+ use '//', instead of '\\'.
+ - Environment variables are expanded |:set_env|.
+ - Careful with '\' characters, type one before a space, type two to
+ get one in the option (see |option-backslash|), for example: >
+ :set bdir=c:\\tmp,\ dir\\,with\\,commas,\\\ dir\ with\ spaces
+< - For backwards compatibility with Vim version 3.0 a '>' at the start
+ of the option is removed.
+ See also 'backup' and 'writebackup' options.
+ If you want to hide your backup files on Unix, consider this value: >
+ :set backupdir=./.backup,~/.backup,.,/tmp
+< You must create a ".backup" directory in each directory and in your
+ home directory for this to work properly.
+ The use of |:set+=| and |:set-=| is preferred when adding or removing
+ directories from the list. This avoids problems when a future version
+ uses another default.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'backupext'* *'bex'* *E589*
+'backupext' 'bex' string (default "~", for VMS: "_")
+ global
+ String which is appended to a file name to make the name of the
+ backup file. The default is quite unusual, because this avoids
+ accidentally overwriting existing files with a backup file. You might
+ prefer using ".bak", but make sure that you don't have files with
+ ".bak" that you want to keep.
+ Only normal file name characters can be used; "/\*?[|<>" are illegal.
+
+ If you like to keep a lot of backups, you could use a BufWritePre
+ autocommand to change 'backupext' just before writing the file to
+ include a timestamp. >
+ :au BufWritePre * let &bex = '-' .. strftime("%Y%b%d%X") .. '~'
+< Use 'backupdir' to put the backup in a different directory.
+
+ *'backupskip'* *'bsk'*
+'backupskip' 'bsk' string (default: "$TMPDIR/*,$TMP/*,$TEMP/*"
+ Unix: "/tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*"
+ Mac: "/private/tmp/*,$TMPDIR/*,$TMP/*,$TEMP/*")
+ global
+ 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.
+ The pattern is used like with |:autocmd|, see |autocmd-patterns|.
+ Watch out for special characters, see |option-backslash|.
+ When $TMPDIR, $TMP or $TEMP is not defined, it is not used for the
+ default value. "/tmp/*" is only used for Unix.
+
+ WARNING: Not having a backup file means that when Vim fails to write
+ your buffer correctly and then, for whatever reason, Vim exits, you
+ lose both the original file and what you were writing. Only disable
+ backups if you don't care about losing the file.
+
+ Note that environment variables are not expanded. If you want to use
+ $HOME you must expand it explicitly, e.g.: >
+ :let &backupskip = escape(expand('$HOME'), '\') .. '/tmp/*'
+
+< Note that the default also makes sure that "crontab -e" works (when a
+ backup would be made by renaming the original file crontab won't see
+ the newly created file). Also see 'backupcopy' and |crontab|.
+
+ *'balloondelay'* *'bdlay'*
+'balloondelay' 'bdlay' number (default: 600)
+ global
+ {only available when compiled with the |+balloon_eval|
+ feature}
+ Delay in milliseconds before a balloon may pop up. See |balloon-eval|.
+
+ *'ballooneval'* *'beval'* *'noballooneval'* *'nobeval'*
+'ballooneval' 'beval' boolean (default off)
+ global
+ {only available when compiled with the |+balloon_eval|
+ feature}
+ Switch on the |balloon-eval| functionality for the GUI.
+
+ *'balloonevalterm'* *'bevalterm'* *'noballoonevalterm'*
+ *'nobevalterm'*
+'balloonevalterm' 'bevalterm' boolean (default off)
+ global
+ {only available when compiled with the
+ |+balloon_eval_term| feature}
+ Switch on the |balloon-eval| functionality for the terminal.
+
+ *'balloonexpr'* *'bexpr'*
+'balloonexpr' 'bexpr' string (default "")
+ global or local to buffer |global-local|
+ {only available when compiled with the |+balloon_eval|
+ feature}
+ Expression for text to show in evaluation balloon. It is only used
+ when 'ballooneval' or 'balloonevalterm' is on. These variables can be
+ used:
+
+ v:beval_bufnr number of the buffer in which balloon is going to show
+ v:beval_winnr number of the window
+ v:beval_winid ID of the window
+ v:beval_lnum line number
+ v:beval_col column number (byte index)
+ v:beval_text word under or after the mouse pointer
+
+ Instead of showing a balloon, which is limited to plain text, consider
+ using a popup window, see |popup_beval_example|. A popup window can
+ use highlighting and show a border.
+
+ The evaluation of the expression must not have side effects!
+ Example: >
+ function MyBalloonExpr()
+ return 'Cursor is at line ' .. v:beval_lnum ..
+ \ ', column ' .. v:beval_col ..
+ \ ' of file ' .. bufname(v:beval_bufnr) ..
+ \ ' on word "' .. v:beval_text .. '"'
+ endfunction
+ set bexpr=MyBalloonExpr()
+ set ballooneval balloonevalterm
+<
+ Also see |balloon_show()|, it can be used if the content of the balloon
+ is to be fetched asynchronously. In that case evaluating
+ 'balloonexpr' should result in an empty string. If you get a balloon
+ with only "0" you probably didn't return anything from your function.
+
+ NOTE: The balloon is displayed only if the cursor is on a text
+ character. If the result of evaluating 'balloonexpr' is not empty,
+ Vim does not try to send a message to an external debugger (Netbeans
+ or Sun Workshop).
+
+ If the expression starts with s: or |<SID>|, then it is replaced with
+ the script ID (|local-function|). Example: >
+ set bexpr=s:MyBalloonExpr()
+ set bexpr=<SID>SomeBalloonExpr()
+< Otherwise, the expression is evaluated in the context of the script
+ where the option was set, thus script-local items are available.
+
+ The expression will be evaluated in the |sandbox| when set from a
+ modeline, see |sandbox-option|.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+
+ It is not allowed to change text or jump to another window while
+ evaluating 'balloonexpr', see |textlock|.
+
+ To check whether line breaks in the balloon text work use this check: >
+ if has("balloon_multiline")
+< When they are supported "\n" characters will start a new line. If the
+ expression evaluates to a |List| this is equal to using each List item
+ as a string and putting "\n" in between them.
+ NOTE: This option is set to "" when 'compatible' is set.
+
+ *'belloff'* *'bo'*
+'belloff' 'bo' string (default "")
+ 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
+ will be silenced. This is most useful to specify specific events in
+ insert mode to be silenced.
+ You can also make it flash by using 'visualbell'.
+
+ item meaning when present ~
+ all All events.
+ backspace When hitting <BS> or <Del> and deleting results in an
+ error.
+ cursor Fail to move around using the cursor keys or
+ <PageUp>/<PageDown> in |Insert-mode|.
+ complete Error occurred when using |i_CTRL-X_CTRL-K| or
+ |i_CTRL-X_CTRL-T|.
+ copy Cannot copy char from insert mode using |i_CTRL-Y| or
+ |i_CTRL-E|.
+ ctrlg Unknown Char after <C-G> in Insert mode.
+ error Other Error occurred (e.g. try to join last line)
+ (mostly used in |Normal-mode| or |Cmdline-mode|).
+ esc hitting <Esc> in |Normal-mode|.
+ ex In |Visual-mode|, hitting |Q| results in an error.
+ hangul Ignored.
+ insertmode Pressing <Esc> in 'insertmode'.
+ lang Calling the beep module for Lua/Mzscheme/TCL.
+ mess No output available for |g<|.
+ showmatch Error occurred for 'showmatch' function.
+ operator Empty region error |cpo-E|.
+ register Unknown register after <C-R> in |Insert-mode|.
+ shell Bell from shell output |:!|.
+ spell Error happened on spell suggest.
+ term Bell from |:terminal| output.
+ 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
+ indicate that an error occurred. It can be silenced by adding the
+ "error" keyword.
+
+ *'binary'* *'bin'* *'nobinary'* *'nobin'*
+'binary' 'bin' boolean (default off)
+ local to buffer
+ This option should be set before editing a binary file. You can also
+ use the |-b| Vim argument. When this option is switched on a few
+ options will be changed (also when it already was on):
+ 'textwidth' will be set to 0
+ 'wrapmargin' will be set to 0
+ 'modeline' will be off
+ 'expandtab' will be off
+ Also, 'fileformat' and 'fileformats' options will not be used, the
+ file is read and written like 'fileformat' was "unix" (a single <NL>
+ separates lines).
+ The 'fileencoding' and 'fileencodings' options will not be used, the
+ file is read without conversion.
+ NOTE: When you start editing a(nother) file while the 'bin' option is
+ on, settings from autocommands may change the settings again (e.g.,
+ 'textwidth'), causing trouble when editing. You might want to set
+ 'bin' again when the file has been loaded.
+ The previous values of these options are remembered and restored when
+ 'bin' is switched from on to off. Each buffer has its own set of
+ saved option values.
+ To edit a file with 'binary' set you can use the |++bin| argument.
+ This avoids you have to do ":set bin", which would have effect for all
+ files you edit.
+ When writing a file the <EOL> for the last line is only written if
+ there was one in the original file (normally Vim appends an <EOL> to
+ the last line if there is none; this would make the file longer). See
+ the 'endofline' option.
+
+ *'bioskey'* *'biosk'* *'nobioskey'* *'nobiosk'*
+'bioskey' 'biosk' boolean (default on)
+ global
+ {only for MS-DOS}
+ This was for MS-DOS and is no longer supported.
+
+ *'bomb'* *'nobomb'*
+'bomb' boolean (default off)
+ local to buffer
+ When writing a file and the following conditions are met, a BOM (Byte
+ Order Mark) is prepended to the file:
+ - this option is on
+ - the 'binary' option is off
+ - 'fileencoding' is "utf-8", "ucs-2", "ucs-4" or one of the little/big
+ endian variants.
+ Some applications use the BOM to recognize the encoding of the file.
+ Often used for UCS-2 files on MS-Windows. For other applications it
+ causes trouble, for example: "cat file1 file2" makes the BOM of file2
+ appear halfway the resulting file. Gcc doesn't accept a BOM.
+ When Vim reads a file and 'fileencodings' starts with "ucs-bom", a
+ check for the presence of the BOM is done and 'bomb' set accordingly.
+ Unless 'binary' is set, it is removed from the first line, so that you
+ don't see it when editing. When you don't change the options, the BOM
+ will be restored when writing the file.
+
+ *'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.
+
+ *'breakindent'* *'bri'* *'nobreakindent'* *'nobri'*
+'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.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'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
+ applying 'breakindent', even if the resulting
+ text should normally be narrower. This prevents
+ text indented almost to the right window border
+ occupying lot of vertical space when broken.
+ (default: 20)
+ shift:{n} After applying 'breakindent', the wrapped line's
+ beginning will be shifted by the given number of
+ characters. It permits dynamic French paragraph
+ indentation (negative) or emphasizing the line
+ continuation (positive).
+ (default: 0)
+ sbr Display the 'showbreak' value before applying the
+ additional indent.
+ (default: off)
+ list:{n} Adds an additional indent for lines that match a
+ numbered or bulleted list (using the
+ 'formatlistpat' setting).
+ list:-1 Uses the length of a match with 'formatlistpat'
+ for indentation.
+ (default: 0)
+ column:{n} Indent at column {n}. Will overrule the other
+ sub-options. Note: an additional indent may be
+ added for the 'showbreak' setting.
+ (default: off)
+
+ *'browsedir'* *'bsdir'*
+'browsedir' 'bsdir' string (default: "last")
+ global
+ {only for Motif, GTK, 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.
+ buffer Use the directory of the related buffer.
+ current Use the current directory.
+ {path} Use the specified directory
+
+ *'bufhidden'* *'bh'*
+'bufhidden' 'bh' string (default: "")
+ local to buffer
+ This option specifies what happens when a buffer is no longer
+ displayed in a window:
+ <empty> follow the global 'hidden' option
+ hide hide the buffer (don't unload it), even if 'hidden' is
+ not set
+ unload unload the buffer, even if 'hidden' is set; the
+ |:hide| command will also unload the buffer
+ delete delete the buffer from the buffer list, even if
+ 'hidden' is set; the |:hide| command will also delete
+ the buffer, making it behave like |:bdelete|
+ wipe wipe the buffer from the buffer list, even if
+ 'hidden' is set; the |:hide| command will also wipe
+ out the buffer, making it behave like |:bwipeout|
+
+ CAREFUL: when "unload", "delete" or "wipe" is used changes in a buffer
+ are lost without a warning. Also, these values may break autocommands
+ that switch between buffers temporarily.
+ This option is used together with 'buftype' and 'swapfile' to specify
+ special kinds of buffers. See |special-buffers|.
+
+ *'buflisted'* *'bl'* *'nobuflisted'* *'nobl'* *E85*
+'buflisted' 'bl' boolean (default: on)
+ local to buffer
+ When this option is set, the buffer shows up in the buffer list. If
+ it is reset it is not used for ":bnext", "ls", the Buffers menu, etc.
+ This option is reset by Vim for buffers that are only used to remember
+ a file name or marks. Vim sets it when starting to edit a buffer.
+ But not when moving to a buffer with ":buffer".
+
+ *'buftype'* *'bt'* *E382*
+'buftype' 'bt' string (default: "")
+ local to buffer
+ 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 buffer for a |terminal| (you are not supposed to set
+ this manually)
+ prompt buffer where only the last line can be edited, meant
+ to be used by a plugin, see |prompt-buffer|
+ {only when compiled with the |+channel| feature}
+ popup buffer used in a popup window, see |popup|.
+ {only when compiled with the |+textprop| feature}
+
+ This option is used together with 'bufhidden' and 'swapfile' to
+ specify special kinds of buffers. See |special-buffers|.
+ Also see |win_gettype()|, which returns the type of the window.
+
+ Be careful with changing this option, it can have many side effects!
+ One such effect is that Vim will not check the timestamp of the file,
+ if the file is changed by another program this will not be noticed.
+
+ A "quickfix" buffer is only used for the error list and the location
+ list. This value is set by the |:cwindow| and |:lwindow| commands and
+ you are not supposed to change it.
+
+ "nofile" and "nowrite" buffers are similar:
+ both: The buffer is not to be written to disk, ":w" doesn't
+ work (":w filename" does work though).
+ both: The buffer is never considered to be |'modified'|.
+ There is no warning when the changes will be lost, for
+ example when you quit Vim.
+ both: A swap file is only created when using too much memory
+ (when 'swapfile' has been reset there is never a swap
+ file).
+ nofile only: The buffer name is fixed, it is not handled like a
+ file name. It is not modified in response to a |:cd|
+ command.
+ both: When using ":e bufname" and already editing "bufname"
+ the buffer is made empty and autocommands are
+ triggered as usual for |:edit|.
+ *E676*
+ "acwrite" implies that the buffer name is not related to a file, like
+ "nofile", but it will be written. Thus, in contrast to "nofile" and
+ "nowrite", ":w" does work and a modified buffer can't be abandoned
+ without saving. For writing there must be matching |BufWriteCmd|,
+ |FileWriteCmd| or |FileAppendCmd| autocommands.
+
+ *'casemap'* *'cmp'*
+'casemap' 'cmp' string (default: "internal,keepascii")
+ global
+ 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.
+ 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.
+
+ *'cdhome'* *'cdh'* *'nocdhome'* *'nocdh'*
+'cdhome' 'cdh' boolean (default: off)
+ global
+ When on, |:cd|, |:tcd| and |:lcd| without an argument changes the
+ current working directory to the |$HOME| directory like in Unix.
+ When off, those commands just print the current directory name.
+ On Unix this option has no effect.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'cdpath'* *'cd'* *E344* *E346*
+'cdpath' 'cd' string (default: equivalent to $CDPATH or ",,")
+ global
+ This is a list of directories which will be searched when using the
+ |:cd|, |:tcd| and |:lcd| commands, provided that the directory being
+ searched for has a relative path, not an absolute part starting with
+ "/", "./" or "../", the 'cdpath' option is not used then.
+ The 'cdpath' option's value has the same form and semantics as
+ |'path'|. Also see |file-searching|.
+ The default value is taken from $CDPATH, with a "," prepended to look
+ in the current directory first.
+ If the default value taken from $CDPATH is not what you want, include
+ a modified version of the following command in your vimrc file to
+ override it: >
+ :let &cdpath = ',' .. substitute(substitute($CDPATH, '[, ]', '\\\0', 'g'), ':', ',', 'g')
+< This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+ (parts of 'cdpath' can be passed to the shell to expand file names).
+
+ *'cedit'*
+'cedit' string (Vi default: "", Vim default: CTRL-F)
+ global
+ The key used in Command-line Mode to open the command-line window.
+ The default is CTRL-F when 'compatible' is off.
+ 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: >
+ :exe "set cedit=\<C-Y>"
+ :exe "set cedit=\<Esc>"
+< |Nvi| also has this option, but it only uses the first character.
+ See |cmdwin|.
+ NOTE: This option is set to the Vim default value when 'compatible'
+ is reset.
+
+ *'charconvert'* *'ccv'* *E202* *E214* *E513*
+'charconvert' 'ccv' string (default "")
+ global
+ {only available when compiled with the |+eval| feature}
+ 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.
+ 'charconvert' is not used when the internal iconv() function is
+ supported and is able to do the conversion. Using iconv() is
+ preferred, because it is much faster.
+ 'charconvert' is not used when reading stdin |--|, because there is no
+ file to convert from. You will have to save the text in a file first.
+ The expression must return zero, false or an empty string for success,
+ non-zero or true for failure.
+ The possible encoding names encountered are in 'encoding'.
+ 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 viminfo file, if the 'c'
+ flag is present in 'viminfo'. Also used for Unicode conversion.
+ Example: >
+ set charconvert=CharConvert()
+ fun CharConvert()
+ system("recode "
+ \ .. v:charconvert_from .. ".." .. v:charconvert_to
+ \ .. " <" .. v:fname_in .. " >" .. v:fname_out)
+ return v:shell_error
+ endfun
+< The related Vim variables are:
+ v:charconvert_from name of the current encoding
+ v:charconvert_to name of the desired encoding
+ 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.
+
+ The advantage of using a function call without arguments is that it is
+ faster, see |expr-option-function|.
+
+ Encryption is not done by Vim when using 'charconvert'. If you want
+ to encrypt the file after conversion, 'charconvert' should take care
+ of this.
+
+ If the 'charconvert' expression starts with s: or |<SID>|, then it is
+ replaced with the script ID (|local-function|). Example: >
+ set charconvert=s:MyConvert()
+ set charconvert=<SID>SomeConvert()
+< Otherwise the expression is evaluated in the context of the script
+ where the option was set, thus script-local items are available.
+
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'cindent'* *'cin'* *'nocindent'* *'nocin'*
+'cindent' 'cin' boolean (default off)
+ local to buffer
+ Enables automatic C program indenting. See 'cinkeys' to set the keys
+ that trigger reindenting in insert mode and 'cinoptions' to set your
+ preferred indent style.
+ If 'indentexpr' is not empty, it overrules 'cindent'.
+ If 'lisp' is not on and both 'indentexpr' and 'equalprg' are empty,
+ the "=" operator indents using this algorithm rather than calling an
+ external program.
+ See |C-indenting|.
+ When you don't like the way 'cindent' works, try the 'smartindent'
+ option or 'indentexpr'.
+ This option is not used when 'paste' is set.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'cinkeys'* *'cink'*
+'cinkeys' 'cink' string (default "0{,0},0),0],:,0#,!^F,o,O,e")
+ local to buffer
+ A list of keys that, when typed in Insert mode, cause reindenting of
+ the current line. Only used if 'cindent' is on and 'indentexpr' is
+ empty.
+ For the format of this option see |cinkeys-format|.
+ See |C-indenting|.
+
+ *'cinoptions'* *'cino'*
+'cinoptions' 'cino' string (default "")
+ local to buffer
+ The 'cinoptions' affect the way 'cindent' reindents lines in a C
+ program. See |cinoptions-values| for the values of this option, and
+ |C-indenting| for info on C indenting in general.
+
+
+ *'cinwords'* *'cinw'*
+'cinwords' 'cinw' string (default "if,else,while,do,for,switch")
+ local to buffer
+ These keywords start an extra indent in the next line when
+ 'smartindent' or 'cindent' is set. For 'cindent' this is only done at
+ an appropriate place (inside {}).
+ Note that 'ignorecase' isn't used for 'cinwords'. If case doesn't
+ matter, include the keyword both the uppercase and lowercase:
+ "if,If,IF".
+
+ *'cinscopedecls'* *'cinsd'*
+'cinscopedecls' 'cinsd' string (default "public,protected,private")
+ local to buffer
+ Keywords that are interpreted as a C++ scope declaration by |cino-g|.
+ Useful e.g. for working with the Qt framework that defines additional
+ scope declarations "signals", "public slots" and "private slots": >
+ set cinscopedecls+=signals,public\ slots,private\ slots
+
+< *'clipboard'* *'cb'*
+'clipboard' 'cb' string (default "autoselect,exclude:cons\|linux"
+ for X-windows, "" otherwise)
+ global
+ {only in GUI versions or when the |+xterm_clipboard|
+ feature is included}
+ This option is a list of comma-separated names.
+ Note: if one of the items is "exclude:", then you can't add an item
+ after that. Therefore do not append an item with += but use ^= to
+ prepend, e.g.: >
+ set clipboard^=unnamed
+< When using the GUI see |'go-A'|.
+ These names are recognized:
+
+ *clipboard-unnamed*
+ unnamed When included, Vim will use the clipboard register '*'
+ for all yank, delete, change and put operations which
+ would normally go to the unnamed register. When a
+ register is explicitly specified, it will always be
+ used regardless of whether "unnamed" is in 'clipboard'
+ or not. The clipboard register can always be
+ explicitly accessed using the "* notation. Also see
+ |gui-clipboard|.
+
+ *clipboard-unnamedplus*
+ unnamedplus A variant of the "unnamed" flag which uses the
+ clipboard register '+' (|quoteplus|) instead of
+ register '*' for all yank, delete, change and put
+ operations which would normally go to the unnamed
+ register. When "unnamed" is also included to the
+ option, yank operations (but not delete, change or
+ put) will additionally copy the text into register
+ '*'.
+ Only available with the |+X11| feature.
+ Availability can be checked with: >
+ if has('unnamedplus')
+<
+ *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 |'go-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'.
+
+ *clipboard-html*
+ html When the clipboard contains HTML, use this when
+ pasting. When putting text on the clipboard, mark it
+ as HTML. This works to copy rendered HTML from
+ Firefox, paste it as raw HTML in Vim, select the HTML
+ in Vim and paste it in a rich edit box in Firefox.
+ You probably want to add this only temporarily,
+ possibly use BufEnter autocommands.
+ Only supported for GTK version 2 and later.
+
+ *clipboard-exclude*
+ exclude:{pattern}
+ Defines a pattern that is matched against the name of
+ the terminal 'term'. If there is a match, no
+ connection will be made to the X server. This is
+ useful in this situation:
+ - Running Vim in a console.
+ - $DISPLAY is set to start applications on another
+ display.
+ - You do not want to connect to the X server in the
+ console, but do want this in a terminal emulator.
+ To never connect to the X server use: >
+ exclude:.*
+< This has the same effect as using the |-X| argument.
+ Note that when there is no connection to the X server
+ the window title won't be restored and the clipboard
+ cannot be accessed.
+ The value of 'magic' is ignored, {pattern} is
+ interpreted as if 'magic' was on.
+ The rest of the option value will be used for
+ {pattern}, this must be the last entry.
+
+ *'cmdheight'* *'ch'*
+'cmdheight' 'ch' number (default 1)
+ global or local to tab page
+ Number of screen lines to use for the command-line. A larger value
+ helps avoiding |hit-enter| prompts.
+ The value of this option is stored with the tab page, so that each tab
+ page can have a different value.
+
+ *'cmdwinheight'* *'cwh'*
+'cmdwinheight' 'cwh' number (default 7)
+ global
+ Number of screen lines to use for the command-line window. |cmdwin|
+
+ *'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.
+ The screen column can be an absolute number, or a number preceded with
+ '+' or '-', which is added to or subtracted from 'textwidth'. >
+
+ :set cc=+1 " highlight column after 'textwidth'
+ :set cc=+1,+2,+3 " highlight three columns after 'textwidth'
+ :hi ColorColumn ctermbg=lightgrey guibg=lightgrey
+<
+ When 'textwidth' is zero then the items with '-' and '+' are not used.
+ A maximum of 256 columns are highlighted.
+
+ *'columns'* *'co'* *E594*
+'columns' 'co' number (default 80 or terminal width)
+ global
+ Number of columns of the screen. Normally this is set by the terminal
+ initialization and does not have to be set by hand. Also see
+ |posix-screen-size|.
+ When Vim is running in the GUI or in a resizable window, setting this
+ option will cause the window size to be changed. When you only want
+ to use the size for the GUI, put the command in your |gvimrc| file.
+ When you set this option and Vim is unable to change the physical
+ number of columns of the display, the display may be messed up. For
+ the GUI it is always possible and Vim limits the number of columns to
+ what fits on the screen. You can use this command to get the widest
+ window possible: >
+ :set columns=9999
+< Minimum value is 12, maximum value is 10000.
+
+ *'comments'* *'com'* *E524* *E525*
+'comments' 'com' string (default
+ "s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-")
+ local to buffer
+ A comma-separated list of strings that can start a comment line. See
+ |format-comments|. See |option-backslash| about using backslashes to
+ insert a space.
+
+ *'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' boolean (default on, off when a |vimrc| or |gvimrc|
+ file is found, reset in |defaults.vim|)
+ global
+ This option has the effect of making Vim either more Vi-compatible, or
+ make Vim behave in a more useful way.
+
+ This is a special kind of option, because when it's set or reset,
+ other options are also changed as a side effect.
+ NOTE: Setting or resetting this option can have a lot of unexpected
+ effects: Mappings are interpreted in another way, undo behaves
+ differently, etc. If you set this option in your vimrc file, you
+ should probably put it at the very start.
+
+ By default this option is on and the Vi defaults are used for the
+ options. This default was chosen for those people who want to use Vim
+ just like Vi, and don't even (want to) know about the 'compatible'
+ option.
+ When a |vimrc| or |gvimrc| file is found while Vim is starting up,
+ this option is switched off, and all options that have not been
+ modified will be set to the Vim defaults. Effectively, this means
+ that when a |vimrc| or |gvimrc| file exists, Vim will use the Vim
+ defaults, otherwise it will use the Vi defaults. (Note: This doesn't
+ happen for the system-wide vimrc or gvimrc file, nor for a file given
+ with the |-u| argument). Also see |compatible-default| and
+ |posix-compliance|.
+ You can also set this option with the "-C" argument, and reset it with
+ "-N". See |-C| and |-N|.
+ See 'cpoptions' for more fine tuning of Vi compatibility.
+
+ When this option is set, numerous other options are set to make Vim as
+ Vi-compatible as possible. When this option is unset, various options
+ are set to make Vim more useful. The table below lists all the
+ options affected.
+ The {?} column indicates when the options are affected:
+ + Means that the option is set to the value given in {set value} when
+ 'compatible' is set.
+ & Means that the option is set to the value given in {set value} when
+ 'compatible' is set AND is set to its Vim default value when
+ 'compatible' is unset.
+ - Means the option is NOT changed when setting 'compatible' but IS
+ set to its Vim default when 'compatible' is unset.
+ The {effect} column summarises the change when 'compatible' is set.
+
+ option ? set value effect ~
+
+ 'allowrevins' + off no CTRL-_ command
+ 'antialias' + off don't use antialiased fonts
+ 'arabic' + off reset arabic-related options
+ 'arabicshape' + on correct character shapes
+ 'backspace' + "" normal backspace
+ 'backup' + off no backup file
+ 'backupcopy' & Unix: "yes" backup file is a copy
+ else: "auto" copy or rename backup file
+ 'balloonexpr' + "" text to show in evaluation balloon
+ 'breakindent' + off don't indent when wrapping lines
+ 'cedit' - {unchanged} {set vim default only on resetting 'cp'}
+ 'cdhome' + off ":cd" don't chdir to home on non-Unix
+ 'cindent' + off no C code indentation
+ 'compatible' - {unchanged} {set vim default only on resetting 'cp'}
+ 'copyindent' + off don't copy indent structure
+ 'cpoptions' & (all flags) Vi-compatible flags
+ 'cscopepathcomp'+ 0 don't show directories in tags list
+ 'cscoperelative'+ off don't use basename of path as prefix
+ 'cscopetag' + off don't use cscope for ":tag"
+ 'cscopetagorder'+ 0 see |cscopetagorder|
+ 'cscopeverbose' + off see |cscopeverbose|
+ 'delcombine' + off unicode: delete whole char combination
+ 'digraph' + off no digraphs
+ 'esckeys' & off no <Esc>-keys in Insert mode
+ 'expandtab' + off tabs not expanded to spaces
+ 'fileformats' & "" no automatic file format detection,
+ "dos,unix" except for MS-Windows
+ 'formatexpr' + "" use 'formatprg' for auto-formatting
+ 'formatoptions' & "vt" Vi compatible formatting
+ 'gdefault' + off no default 'g' flag for ":s"
+ 'history' & 0 no commandline history
+ 'hkmap' + off no Hebrew keyboard mapping
+ 'hkmapp' + off no phonetic Hebrew keyboard mapping
+ 'hlsearch' + off no highlighting of search matches
+ 'incsearch' + off no incremental searching
+ 'indentexpr' + "" no indenting by expression
+ 'insertmode' + off do not start in Insert mode
+ 'iskeyword' & "@,48-57,_" keywords contain alphanumeric
+ characters and '_'
+ 'joinspaces' + on insert 2 spaces after period
+ 'modeline' & off no modelines
+ 'more' & off no pauses in listings
+ 'mzquantum' - {unchanged} {set vim default only on resetting 'cp'}
+ 'numberwidth' & 8 min number of columns for line number
+ 'preserveindent'+ off don't preserve current indent structure
+ when changing it
+ 'revins' + off no reverse insert
+ 'ruler' + off no ruler
+ 'scrolljump' + 1 no jump scroll
+ 'scrolloff' + 0 no scroll offset
+ 'shelltemp' - {unchanged} {set vim default only on resetting 'cp'}
+ 'shiftround' + off indent not rounded to shiftwidth
+ 'shortmess' & "S" no shortening of messages
+ 'showcmd' & off command characters not shown
+ 'showmode' & off current mode not shown
+ 'sidescrolloff' + 0 cursor moves to edge of screen in scroll
+ 'smartcase' + off no automatic ignore case switch
+ 'smartindent' + off no smart indentation
+ 'smarttab' + off no smart tab size
+ 'softtabstop' + 0 tabs are always 'tabstop' positions
+ 'startofline' + on goto startofline with some commands
+ 'tagcase' & "followic" 'ignorecase' when searching tags file
+ 'tagrelative' & off tag file names are not relative
+ 'termguicolors' + off don't use highlight-(guifg|guibg)
+ 'textauto' & off no automatic textmode detection
+ 'textwidth' + 0 no automatic line wrap
+ 'tildeop' + off tilde is not an operator
+ 'ttimeout' + off no terminal timeout
+ 'undofile' + off don't use an undo file
+ 'viminfo' - {unchanged} {set Vim default only on resetting 'cp'}
+ 'virtualedit' + "" cursor can only be placed on characters
+ 'whichwrap' & "" left-right movements don't wrap
+ 'wildchar' & CTRL-E only when the current value is <Tab>
+ use CTRL-E for cmdline completion
+ 'writebackup' + on or off depends on the |+writebackup| feature
+
+ *'complete'* *'cpt'* *E535*
+'complete' 'cpt' string (default: ".,w,b,u,t,i")
+ local to buffer
+ This option specifies how keyword completion |ins-completion| works
+ 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)
+ 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
+ U scan the buffers that are not in the buffer list
+ k scan the files given with the 'dictionary' option
+ kspell use the currently active spell checking |spell|
+ k{dict} scan the file {dict}. Several "k" flags can be given,
+ patterns are valid too. For example: >
+ :set cpt=k/usr/dict/*,k~/spanish
+< s scan the files given with the 'thesaurus' option
+ s{tsr} scan the file {tsr}. Several "s" flags can be given, patterns
+ are valid too.
+ i scan current and included files
+ d scan current and included files for defined name or macro
+ |i_CTRL-X_CTRL-D|
+ ] tag completion
+ t same as "]"
+
+ Unloaded buffers are not loaded, thus their autocmds |:autocmd| are
+ not executed, this may lead to unexpected completions from some files
+ (gzipped files for example). Unloaded buffers are not scanned for
+ whole-line completion.
+
+ The default is ".,w,b,u,t,i", which means to scan:
+ 1. the current buffer
+ 2. buffers in other windows
+ 3. other loaded buffers
+ 4. unloaded buffers
+ 5. tags
+ 6. included files
+
+ As you can see, CTRL-N and CTRL-P can be used to do any 'iskeyword'-
+ based expansion (e.g., dictionary |i_CTRL-X_CTRL-K|, included patterns
+ |i_CTRL-X_CTRL-I|, tags |i_CTRL-X_CTRL-]| and normal expansions).
+
+ *'completefunc'* *'cfu'*
+'completefunc' 'cfu' string (default: empty)
+ local to buffer
+ {not available when compiled without the |+eval|
+ feature}
+ 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
+ invoked and what it should return. The value can be the name of a
+ function, a |lambda| or a |Funcref|. See |option-value-function| for
+ more information.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'completeslash'* *'csl'*
+'completeslash' 'csl' string (default: "")
+ local to buffer
+ {only for MS-Windows}
+ When this option is set it overrules 'shellslash' for completion:
+ - When this option is set to "slash", a forward slash is used for path
+ completion in insert mode. This is useful when editing HTML tag, or
+ Makefile with 'noshellslash' on MS-Windows.
+ - When this option is set to "backslash", backslash is used. This is
+ useful when editing a batch file with 'shellslash' set on MS-Windows.
+ - When this option is empty, same character is used as for
+ 'shellslash'.
+ For Insert mode completion the buffer-local value is used. For
+ command line completion the global value is used.
+
+ *'completeopt'* *'cot'*
+'completeopt' 'cot' string (default: "menu,preview")
+ global
+ A comma-separated list of options for Insert mode completion
+ |ins-completion|. The supported values are:
+
+ menu Use a popup menu to show the possible completions. The
+ menu is only shown when there is more than one match and
+ sufficient colors are available. |ins-completion-menu|
+
+ menuone Use the popup menu also when there is only one match.
+ Useful when there is additional information about the
+ match, e.g., what file it comes from.
+
+ longest Only insert the longest common text of the matches. If
+ the menu is displayed you can use CTRL-L to add more
+ characters. Whether case is ignored depends on the kind
+ of completion. For buffer text the 'ignorecase' option is
+ used.
+
+ preview Show extra information about the currently selected
+ completion in the preview window. Only works in
+ combination with "menu" or "menuone".
+
+ popup Show extra information about the currently selected
+ completion in a popup window. Only works in combination
+ with "menu" or "menuone". Overrides "preview".
+ See |'completepopup'| for specifying properties.
+ {only works when compiled with the |+textprop| feature}
+
+ popuphidden
+ Just like "popup" but initially hide the popup. Use a
+ |CompleteChanged| autocommand to fetch the info and call
+ |popup_show()| once the popup has been filled.
+ See the example at |complete-popuphidden|.
+ {only works when compiled with the |+textprop| feature}
+
+ noinsert Do not insert any text for a match until the user selects
+ a match from the menu. Only works in combination with
+ "menu" or "menuone". No effect if "longest" is present.
+
+ noselect Do not select a match in the menu, force the user to
+ select one from the menu. Only works in combination with
+ "menu" or "menuone".
+
+
+ *'completepopup'* *'cpp'*
+'completepopup' 'cpp' string (default empty)
+ global
+ {not available when compiled without the |+textprop|
+ or |+quickfix| feature}
+ When 'completeopt' contains "popup" then this option is used for the
+ properties of the info popup when it is created. If an info popup
+ window already exists it is closed, so that the option value is
+ applied when it is created again.
+ You can also use |popup_findinfo()| and then set properties for an
+ existing info popup with |popup_setoptions()|. See |complete-popup|.
+
+
+ *'concealcursor'* *'cocu'*
+'concealcursor' 'cocu' string (default: "")
+ local to window
+ {not available when compiled without the |+conceal|
+ feature}
+ Sets the modes in which text in the cursor line can also be concealed.
+ When the current mode is listed then concealing happens just like in
+ other lines.
+ n Normal mode
+ v Visual mode
+ i Insert mode
+ c Command line editing, for 'incsearch'
+
+ 'v' applies to all lines in the Visual area, not only the cursor.
+ A useful value is "nc". This is used in help files. So long as you
+ are moving around text is concealed, but when starting to insert text
+ or selecting a Visual area the concealed text is displayed, so that
+ you can see what you are doing.
+ Keep in mind that the cursor position is not always where it's
+ displayed. E.g., when moving vertically it may change column.
+
+
+ *'conceallevel'* *'cole'*
+'conceallevel' 'cole' number (default 0)
+ local to window
+ {not available when compiled without the |+conceal|
+ feature}
+ Determine how text with the "conceal" syntax attribute |:syn-conceal|
+ is shown:
+
+ Value Effect ~
+ 0 Text is shown normally
+ 1 Each block of concealed text is replaced with one
+ character. If the syntax item does not have a custom
+ replacement character defined (see |:syn-cchar|) the
+ character defined in 'listchars' is used (default is a
+ space).
+ It is highlighted with the "Conceal" highlight group.
+ 2 Concealed text is completely hidden unless it has a
+ custom replacement character defined (see
+ |:syn-cchar|).
+ 3 Concealed text is completely hidden.
+
+ Note: in the cursor line concealed text is not hidden, so that you can
+ edit and copy the text. This can be changed with the 'concealcursor'
+ option.
+
+ *'confirm'* *'cf'* *'noconfirm'* *'nocf'*
+'confirm' 'cf' boolean (default off)
+ 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
+ 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|
+ command.
+ Also see the |confirm()| function and the 'v' flag in 'guioptions'.
+
+ *'conskey'* *'consk'* *'noconskey'* *'noconsk'*
+'conskey' 'consk' boolean (default off)
+ global
+ This was for MS-DOS and is no longer supported.
+
+ *'copyindent'* *'ci'* *'nocopyindent'* *'noci'*
+'copyindent' 'ci' boolean (default off)
+ local to buffer
+ Copy the structure of the existing lines indent when autoindenting a
+ new line. Normally the new indent is reconstructed by a series of
+ tabs followed by spaces as required (unless |'expandtab'| is enabled,
+ in which case only spaces are used). Enabling this option makes the
+ new line copy whatever characters were used for indenting on the
+ existing line. 'expandtab' has no effect on these characters, a Tab
+ remains a Tab. If the new indent is greater than on the existing
+ line, the remaining space is filled in the normal manner.
+ NOTE: This option is reset when 'compatible' is set.
+ Also see 'preserveindent'.
+
+ *'cpoptions'* *'cpo'* *cpo*
+'cpoptions' 'cpo' string (Vim default: "aABceFs",
+ Vi default: all flags)
+ global
+ A sequence of single character flags. When a character is present
+ this indicates Vi-compatible behavior. This is used for things where
+ not being Vi-compatible is mostly or sometimes preferred.
+ 'cpoptions' stands for "compatible-options".
+ Commas can be added for readability.
+ To avoid problems with flags that are added in the future, use the
+ "+=" and "-=" feature of ":set" |add-option-flags|.
+
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ NOTE: In a |Vim9| script, when `vim9script` is encountered, the value
+ is saved, 'cpoptions' is set to the Vim default, and the saved value
+ is restored at the end of the script. Changes to the value of
+ 'cpoptions' will be applied to the saved value, but keep in mind that
+ removing a flag that is not present when 'cpoptions' is changed has no
+ effect. In the |.vimrc| file the value is not restored, thus using
+ `vim9script` in the |.vimrc| file results in using the Vim default.
+
+ NOTE: This option is set to the POSIX default value at startup when
+ the Vi default value would be used and the $VIM_POSIX environment
+ variable exists |posix|. This means Vim tries to behave like the
+ POSIX specification.
+
+ contains behavior ~
+ *cpo-a*
+ a When included, a ":read" command with a file name
+ argument will set the alternate file name for the
+ current window.
+ *cpo-A*
+ A When included, a ":write" command with a file name
+ argument will set the alternate file name for the
+ current window.
+ *cpo-b*
+ b "\|" in a ":map" command is recognized as the end of
+ the map command. The '\' is included in the mapping,
+ the text after the '|' is interpreted as the next
+ command. Use a CTRL-V instead of a backslash to
+ include the '|' in the mapping. Applies to all
+ mapping, abbreviation, menu and autocmd commands.
+ See also |map_bar|.
+ *cpo-B*
+ B A backslash has no special meaning in mappings,
+ 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
+ next line. When not present searching continues
+ one character from the cursor position. With 'c'
+ "abababababab" only gets three matches when repeating
+ "/abab", without 'c' there are five matches.
+ *cpo-C*
+ C Do not concatenate sourced lines that start with a
+ backslash. See |line-continuation|.
+ *cpo-d*
+ d Using "./" in the 'tags' option doesn't mean to use
+ the tags file relative to the current file, but the
+ tags file in the current directory.
+ *cpo-D*
+ D Can't use CTRL-K to enter a digraph after Normal mode
+ commands with a character argument, like |r|, |f| and
+ |t|.
+ *cpo-e*
+ e When executing a register with ":@r", always add a
+ <CR> to the last line, also when the register is not
+ linewise. If this flag is not present, the register
+ is not linewise and the last line does not end in a
+ <CR>, then the last line is put on the command-line
+ and can be edited before hitting <CR>.
+ *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 operated on. Example:
+ This makes "y0" fail in the first column.
+ *cpo-f*
+ f When included, a ":read" command with a file name
+ argument will set the file name for the current buffer,
+ if the current buffer doesn't have a file name yet.
+ *cpo-F*
+ F When included, a ":write" command with a file name
+ argument will set the file name for the current
+ buffer, if the current buffer doesn't have a file name
+ yet. Also see |cpo-P|.
+ *cpo-g*
+ g Goto line 1 when using ":edit" without argument.
+ *cpo-H*
+ H When using "I" on a line with only blanks, insert
+ before the last blank. Without this flag insert after
+ the last blank.
+ *cpo-i*
+ i When included, interrupting the reading of a file will
+ leave it modified.
+ *cpo-I*
+ I When moving the cursor up or down just after inserting
+ indent for 'autoindent', do not delete the indent.
+ *cpo-j*
+ j When joining lines, only add two spaces after a '.',
+ not after '!' or '?'. Also see 'joinspaces'.
+ *cpo-J*
+ 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 a mapping. This breaks mapping <F1><F1> when
+ only part of the second <F1> has been read. It
+ enables cancelling the mapping by typing <F1><Esc>.
+ *cpo-l*
+ l Backslash in a [] range in a search pattern is taken
+ literally, only "\]", "\^", "\-" and "\\" are special.
+ See |/[]|
+ 'l' included: "/[ \t]" finds <Space>, '\' and 't'
+ 'l' excluded: "/[ \t]" finds <Space> and <Tab>
+ Also see |cpo-\|.
+ *cpo-L*
+ L When the 'list' option is set, 'wrapmargin',
+ 'textwidth', 'softtabstop' and Virtual Replace mode
+ (see |gR|) count a <Tab> as two characters, instead of
+ the normal behavior of a <Tab>.
+ *cpo-m*
+ m When included, a showmatch will always wait half a
+ second. When not included, a showmatch will wait half
+ a second or until a character is typed. |'showmatch'|
+ *cpo-M*
+ M When excluded, "%" matching will take backslashes into
+ account. Thus in "( \( )" and "\( ( \)" the outer
+ parenthesis match. When included "%" ignores
+ backslashes, which is Vi compatible.
+ *cpo-n*
+ n When included, the column used for 'number' and
+ 'relativenumber' will also be used for text of wrapped
+ lines.
+ *cpo-o*
+ o Line offset to search command is not remembered for
+ next search.
+ *cpo-O*
+ O Don't complain if a file is being overwritten, even
+ when it didn't exist when editing it. This is a
+ protection against a file unexpectedly created by
+ someone else. Vi didn't complain about this.
+ *cpo-p*
+ p Vi compatible Lisp indenting. When not present, a
+ slightly better algorithm is used.
+ *cpo-P*
+ P When included, a ":write" command that appends to a
+ file will set the file name for the current buffer, if
+ the current buffer doesn't have a file name yet and
+ the 'F' flag is also included |cpo-F|.
+ *cpo-q*
+ q When joining multiple lines leave the cursor at the
+ position where it would be when joining two lines.
+ *cpo-r*
+ r Redo ("." command) uses "/" to repeat a search
+ command, instead of the actually used search string.
+ *cpo-R*
+ R Remove marks from filtered lines. Without this flag
+ marks are kept like |:keepmarks| was used.
+ *cpo-s*
+ s Set buffer options when entering the buffer for the
+ first time. This is like it is in Vim version 3.0.
+ And it is the default. If not present the options are
+ set when the buffer is created.
+ *cpo-S*
+ S Set buffer options always when entering a buffer
+ (except 'readonly', 'fileformat', 'filetype' and
+ 'syntax'). This is the (most) Vi compatible setting.
+ The options are set to the values in the current
+ buffer. When you change an option and go to another
+ buffer, the value is copied. Effectively makes the
+ buffer options global to all buffers.
+
+ 's' 'S' copy buffer options
+ no no when buffer created
+ yes no when buffer first entered (default)
+ X yes each time when buffer entered (vi comp.)
+ *cpo-t*
+ t Search pattern for the tag command is remembered for
+ "n" command. Otherwise Vim only puts the pattern in
+ the history for search pattern, but doesn't change the
+ last used search pattern.
+ *cpo-u*
+ u Undo is Vi compatible. See |undo-two-ways|.
+ *cpo-v*
+ v Backspaced characters remain visible on the screen in
+ Insert mode. Without this flag the characters are
+ erased from the screen right away. With this flag the
+ screen newly typed text overwrites backspaced
+ characters.
+ *cpo-w*
+ w When using "cw" on a blank character, only change one
+ character and not all blanks until the start of the
+ next word.
+ *cpo-W*
+ W Don't overwrite a readonly file. When omitted, ":w!"
+ overwrites a readonly file, if possible.
+ *cpo-x*
+ x <Esc> on the command-line executes the command-line.
+ The default in Vim is to abandon the command-line,
+ because <Esc> normally aborts a command. |c_<Esc>|
+ *cpo-X*
+ X When using a count with "R" the replaced text is
+ deleted only once. Also when repeating "R" with "."
+ and a count.
+ *cpo-y*
+ y A yank command can be redone with ".". Think twice if
+ you really want to use this, it may break some
+ plugins, since most people expect "." to only repeat a
+ change.
+ *cpo-Z*
+ Z When using "w!" while the 'readonly' option is set,
+ don't reset 'readonly'.
+ *cpo-!*
+ ! When redoing a filter command, use the last used
+ external command, whatever it was. Otherwise the last
+ used -filter- command is used.
+ *cpo-$*
+ $ When making a change to one line, don't redisplay the
+ line, but put a '$' at the end of the changed text.
+ The changed text will be overwritten when you type the
+ new text. The line is redisplayed if you type any
+ command that moves the cursor from the insertion
+ point.
+ *cpo-%*
+ % Vi-compatible matching is done for the "%" command.
+ Does not recognize "#if", "#endif", etc.
+ Does not recognize "/*" and "*/".
+ Parens inside single and double quotes are also
+ counted, causing a string that contains a paren to
+ disturb the matching. For example, in a line like
+ "if (strcmp("foo(", s))" the first paren does not
+ match the last one. When this flag is not included,
+ parens inside single and double quotes are treated
+ specially. When matching a paren outside of quotes,
+ everything inside quotes is ignored. When matching a
+ paren inside quotes, it will find the matching one (if
+ there is one). This works very well for C programs.
+ This flag is also used for other features, such as
+ C-indenting.
+ *cpo--*
+ - When included, a vertical movement command fails when
+ it would go above the first line or below the last
+ line. Without it the cursor moves to the first or
+ last line, unless it already was in that line.
+ Applies to the commands "-", "k", CTRL-P, "+", "j",
+ CTRL-N, CTRL-J and ":1234".
+ *cpo-+*
+ + 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-star*
+ * Use ":*" in the same way as ":@". When not included,
+ ":*" is an alias for ":'<,'>", select the Visual area.
+ *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.
+ *cpo-;*
+ ; When using |,| or |;| to repeat the last |t| search
+ and the cursor is right in front of the searched
+ character, the cursor won't move. When not included,
+ the cursor would skip over it and jump to the
+ following occurrence.
+
+ POSIX flags. These are not included in the Vi default value, except
+ when $VIM_POSIX was set on startup. |posix|
+
+ contains behavior ~
+ *cpo-#*
+ # A count before "D", "o" and "O" has no effect.
+ *cpo-&*
+ & When ":preserve" was used keep the swap file when
+ exiting normally while this buffer is still loaded.
+ This flag is tested when exiting.
+ *cpo-\*
+ \ Backslash in a [] range in a search pattern is taken
+ literally, only "\]" is special See |/[]|
+ '\' included: "/[ \-]" finds <Space>, '\' and '-'
+ '\' excluded: "/[ \-]" finds <Space> and '-'
+ Also see |cpo-l|.
+ *cpo-/*
+ / When "%" is used as the replacement string in a |:s|
+ command, use the previous replacement string. |:s%|
+ *cpo-{*
+ { The |{| and |}| commands also stop at a "{" character
+ at the start of a line.
+ *cpo-.*
+ . The ":chdir" and ":cd" commands fail if the current
+ buffer is modified, unless ! is used. Vim doesn't
+ need this, since it remembers the full path of an
+ opened file.
+ *cpo-bar*
+ | The value of the $LINES and $COLUMNS environment
+ variables overrule the terminal size values obtained
+ with system specific functions.
+
+
+ *'cryptmethod'* *'cm'*
+'cryptmethod' 'cm' string (default "blowfish2")
+ global or local to buffer |global-local|
+ Method used for encryption when the buffer is written to a file:
+ *pkzip*
+ zip PkZip compatible method. A weak kind of encryption.
+ Backwards compatible with Vim 7.2 and older.
+ *blowfish*
+ blowfish Blowfish method. Medium strong encryption but it has
+ an implementation flaw. Requires Vim 7.3 or later,
+ files can NOT be read by Vim 7.2 and older. This adds
+ a "seed" to the file, every time you write the file
+ the encrypted bytes will be different.
+ *blowfish2*
+ blowfish2 Blowfish method. Medium strong encryption. Requires
+ Vim 7.4.401 or later, files can NOT be read by Vim 7.3
+ and older. This adds a "seed" to the file, every time
+ you write the file the encrypted bytes will be
+ different. The whole undo file is encrypted, not just
+ the pieces of text.
+ *E1193* *E1194* *E1195* *E1196* *E1230*
+ *E1197* *E1198* *E1199* *E1200* *E1201*
+ xchacha20 XChaCha20 Cipher with Poly1305 Message Authentication
+ Code. Medium strong till strong encryption.
+ Encryption is provided by the libsodium library, it
+ requires Vim to be built with |+sodium|.
+ It adds a seed and a message authentication code (MAC)
+ to the file. This needs at least a Vim 8.2.3022 to
+ read the encrypted file.
+ Encryption of swap files is not supported, therefore
+ no swap file will be used when xchacha20 encryption is
+ enabled.
+ Encryption of undo files is not yet supported,
+ therefore no undo file will currently be written.
+ CURRENTLY EXPERIMENTAL: Files written with this method
+ might have to be read back with the same version of
+ Vim if the binary format changes later.
+
+ You should use "blowfish2", also to re-encrypt older files.
+
+ When reading an encrypted file 'cryptmethod' will be set automatically
+ to the detected method of the file being read. Thus if you write it
+ without changing 'cryptmethod' the same method will be used.
+ Changing 'cryptmethod' does not mark the file as modified, you have to
+ explicitly write it, you don't get a warning unless there are other
+ modifications. Also see |:X|.
+
+ When setting the global value to an empty string, it will end up with
+ the value "blowfish2". When setting the local value to an empty
+ string the buffer will use the global value.
+
+ When a new encryption method is added in a later version of Vim, and
+ the current version does not recognize it, you will get *E821* .
+ You need to edit this file with the later version of Vim.
+
+
+ *'cscopepathcomp'* *'cspc'*
+'cscopepathcomp' 'cspc' number (default 0)
+ global
+ {not available when compiled without the |+cscope|
+ feature}
+ Determines how many components of the path to show in a list of tags.
+ See |cscopepathcomp|.
+ NOTE: This option is set to 0 when 'compatible' is set.
+
+ *'cscopeprg'* *'csprg'*
+'cscopeprg' 'csprg' string (default "cscope")
+ global
+ {not available when compiled without the |+cscope|
+ feature}
+ Specifies the command to execute cscope. See |cscopeprg|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'cscopequickfix'* *'csqf'*
+'cscopequickfix' 'csqf' string (default "")
+ global
+ {not available when compiled without the |+cscope|
+ or |+quickfix| features}
+ Specifies whether to use quickfix window to show cscope results.
+ See |cscopequickfix|.
+
+ *'cscoperelative'* *'csre'* *'nocscoperelative'* *'nocsre'*
+'cscoperelative' 'csre' boolean (default off)
+ global
+ {not available when compiled without the |+cscope|
+ feature}
+ In the absence of a prefix (-P) for cscope. setting this option enables
+ to use the basename of cscope.out path as the prefix.
+ See |cscoperelative|.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'cscopetag'* *'cst'* *'nocscopetag'* *'nocst'*
+'cscopetag' 'cst' boolean (default off)
+ global
+ {not available when compiled without the |+cscope|
+ feature}
+ Use cscope for tag commands. See |cscope-options|.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'cscopetagorder'* *'csto'*
+'cscopetagorder' 'csto' number (default 0)
+ global
+ {not available when compiled without the |+cscope|
+ feature}
+ Determines the order in which ":cstag" performs a search. See
+ |cscopetagorder|.
+ NOTE: This option is set to 0 when 'compatible' is set.
+
+ *'cscopeverbose'* *'csverb'*
+ *'nocscopeverbose'* *'nocsverb'*
+'cscopeverbose' 'csverb' boolean (default off)
+ global
+ {not available when compiled without the |+cscope|
+ feature}
+ Give messages when adding a cscope database. See |cscopeverbose|.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'cursorbind'* *'crb'* *'nocursorbind'* *'nocrb'*
+'cursorbind' 'crb' boolean (default off)
+ local to window
+ When this option is set, as the cursor in the current
+ window moves other cursorbound windows (windows that also have
+ this option set) move their cursors to the corresponding line and
+ column. This option is useful for viewing the
+ differences between two versions of a file (see 'diff'); in diff mode,
+ inserted and deleted lines (though not characters within a line) are
+ taken into account.
+
+
+ *'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.
+ If you only want the highlighting in the current window you can use
+ these autocommands: >
+ au WinLeave * set nocursorline nocursorcolumn
+ au WinEnter * set cursorline cursorcolumn
+<
+
+ *'cursorline'* *'cul'* *'nocursorline'* *'nocul'*
+'cursorline' 'cul' boolean (default off)
+ local to window
+ {not available when compiled without the |+syntax|
+ feature}
+ Highlight the text line of the cursor with CursorLine |hl-CursorLine|.
+ Useful to easily spot the cursor. Will make screen redrawing slower.
+ When Visual mode is active the highlighting isn't used to make it
+ easier to see the selected text.
+
+
+ *'cursorlineopt'* *'culopt'*
+'cursorlineopt' 'culopt' string (default: "number,line")
+ local to window
+ {not available when compiled without the |+syntax|
+ feature}
+ Comma-separated list of settings for how 'cursorline' is displayed.
+ Valid values:
+ "line" Highlight the text line of the cursor with
+ CursorLine |hl-CursorLine|.
+ "screenline" Highlight only the screen line of the cursor with
+ CursorLine |hl-CursorLine|.
+ "number" Highlight the line number of the cursor with
+ CursorLineNr |hl-CursorLineNr|.
+
+ Special value:
+ "both" Alias for the values "line,number".
+
+ "line" and "screenline" cannot be used together.
+
+
+ *'debug'*
+'debug' string (default "")
+ global
+ These values can be used:
+ msg Error messages that would otherwise be omitted will be given
+ anyway.
+ throw Error messages that would otherwise be omitted will be given
+ anyway and also throw an exception and set |v:errmsg|.
+ beep A message will be given when otherwise only a beep would be
+ produced.
+ The values can be combined, separated by a comma.
+ "msg" and "throw" are useful for debugging 'foldexpr', 'formatexpr' or
+ 'indentexpr'.
+
+ *'define'* *'def'*
+'define' 'def' string (default "^\s*#\s*define")
+ global or local to buffer |global-local|
+ Pattern to be used to find a macro definition. It is a search
+ pattern, just like for the "/" command. This option is used for the
+ commands like "[i" and "[d" |include-search|. The 'isident' option is
+ used to recognize the defined name after the match:
+ {match with 'define'}{non-ID chars}{defined name}{non-ID char}
+ See |option-backslash| about inserting backslashes to include a space
+ or backslash.
+ The default value is for C programs. For C++ this value would be
+ useful, to include const type declarations: >
+ ^\(#\s*define\|[a-z]*\s*const\s*[a-z]*\)
+< You can also use "\ze" just before the name and continue the pattern
+ to check what is following. E.g. for Javascript, if a function is
+ defined with "func_name = function(args)": >
+ ^\s*\ze\i\+\s*=\s*function(
+< If the function is defined with "func_name : function() {...": >
+ ^\s*\ze\i\+\s*[:]\s*(*function\s*(
+< When using the ":set" command, you need to double the backslashes!
+ To avoid that use `:let` with a single quote string: >
+ let &l:define = '^\s*\ze\k\+\s*=\s*function('
+<
+
+ *'delcombine'* *'deco'* *'nodelcombine'* *'nodeco'*
+'delcombine' 'deco' boolean (default off)
+ global
+ 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
+ deleted.
+ Note: When 'delcombine' is set "xx" may work differently from "2x"!
+
+ This is useful for Arabic, Hebrew and many other languages where one
+ may have combining characters overtop of base characters, and want
+ to remove only the combining ones.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'dictionary'* *'dict'*
+'dictionary' 'dict' string (default "")
+ global or local to buffer |global-local|
+ List of file names, separated by commas, that are used to lookup words
+ for keyword completion commands |i_CTRL-X_CTRL-K|. Each file should
+ contain a list of words. This can be one word per line, or several
+ words per line, separated by non-keyword characters (white space is
+ preferred). Maximum line length is 510 bytes.
+
+ When this option is empty or an entry "spell" is present, and spell
+ checking is enabled, words in the word lists for the currently active
+ 'spelllang' are used. See |spell|.
+
+ 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
+ name. See |option-backslash| about using backslashes.
+ This has nothing to do with the |Dictionary| variable type.
+ Where to find a list of words?
+ - On FreeBSD, there is the file "/usr/share/dict/words".
+ - In the Simtel archive, look in the "msdos/linguist" directory.
+ - In "miscfiles" of the GNU collection.
+ The use of |:set+=| and |:set-=| is preferred when adding or removing
+ directories from the list. This avoids problems when a future version
+ uses another default.
+ Backticks cannot be used in this option for security reasons.
+
+ *'diff'* *'nodiff'*
+'diff' boolean (default off)
+ local to window
+ {not available when compiled without the |+diff|
+ feature}
+ Join the current window in the group of windows that shows differences
+ between files. See |vimdiff|.
+
+ *'dex'* *'diffexpr'*
+'diffexpr' 'dex' string (default "")
+ global
+ {not available when compiled without the |+diff|
+ feature}
+ 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 "internal,filler,closeoff")
+ global
+ {not available when compiled without the |+diff|
+ feature}
+ Option settings for diff mode. It can consist of the following items.
+ All are optional. Items must be separated by a comma.
+
+ filler Show filler lines, to keep the text
+ synchronized with a window that has inserted
+ lines at the same position. Mostly useful
+ when windows are side-by-side and 'scrollbind'
+ is set.
+
+ context:{n} Use a context of {n} lines between a change
+ and a fold that contains unchanged lines.
+ When omitted a context of six lines is used.
+ When using zero the context is actually one,
+ since folds require a line in between, also
+ for a deleted line.
+ 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.
+
+ iwhite Ignore changes in amount of white space. Adds
+ the "-b" flag to the "diff" command if
+ 'diffexpr' is empty. Check the documentation
+ of the "diff" command for what this does
+ 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).
+
+ closeoff When a window is closed where 'diff' is set
+ and there is only one window remaining in the
+ same tab page with 'diff' set, execute
+ `:diffoff` in that window. This undoes a
+ `:diffsplit` command.
+
+ 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.
+
+ followwrap Follow the 'wrap' option and leave as it is.
+
+ 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
+
+ Examples: >
+ :set diffopt=internal,filler,context:4
+ :set diffopt=
+ :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|.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'directory'* *'dir'*
+'directory' 'dir' string (default for Amiga: ".,t:",
+ for Win32: ".,$TEMP,c:\tmp,c:\temp"
+ for Unix: ".,~/tmp,/var/tmp,/tmp")
+ global
+ List of directory names for the swap file, separated with commas.
+ Recommended value: ".,~/vimswap//" - this will put the swap file next
+ to the edited file if possible, and in your personal swap directory
+ otherwise. Make sure "~/vimswap//" is only readable for you.
+
+ Possible items:
+ - The swap file will be created in the first directory where this is
+ possible.
+ - Empty means that no swap file will be used (recovery is
+ impossible!) and no |E303| error will be given.
+ - A directory "." means to put the swap file in the same directory as
+ the edited file. On Unix, a dot is prepended to the file name, so
+ it doesn't show in a directory listing. On MS-Windows the "hidden"
+ attribute is set and a dot prepended if possible.
+ - A directory starting with "./" (or ".\" for MS-Windows) means to put
+ the swap file relative to where the edited file is. The leading "."
+ is replaced with the path name of the edited file.
+ - For Unix and Win32, if a directory ends in two path separators "//",
+ the swap file name will be built from the complete path to the file
+ with all path separators replaced by percent '%' signs (including
+ the colon following the drive letter on Win32). This will ensure
+ file name uniqueness in the preserve directory.
+ On Win32, it is also possible to end with "\\". However, When a
+ separating comma is following, you must use "//", since "\\" will
+ include the comma in the file name. Therefore it is recommended to
+ use '//', instead of '\\'.
+ - Spaces after the comma are ignored, other spaces are considered part
+ of the directory name. To have a space at the start of a directory
+ name, precede it with a backslash.
+ - To include a comma in a directory name precede it with a backslash.
+ - A directory name may end in an ':' or '/'.
+ - Environment variables are expanded |:set_env|.
+ - Careful with '\' characters, type one before a space, type two to
+ get one in the option (see |option-backslash|), for example: >
+ :set dir=c:\\tmp,\ dir\\,with\\,commas,\\\ dir\ with\ spaces
+< - For backwards compatibility with Vim version 3.0 a '>' at the start
+ of the option is removed.
+ Using "." first in the list is recommended. This means that editing
+ the same file twice will result in a warning. Using "/tmp" on Unix is
+ discouraged: When the system crashes you lose the swap file.
+ "/var/tmp" is often not cleared when rebooting, thus is a better
+ choice than "/tmp". But others on the computer may be able to see the
+ files, and it can contain a lot of files, your swap files get lost in
+ the crowd. That is why a "tmp" directory in your home directory is
+ tried first.
+ The use of |:set+=| and |:set-=| is preferred when adding or removing
+ directories from the list. This avoids problems when a future version
+ uses another default.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'display'* *'dy'*
+'display' 'dy' string (default "", set to "truncate" in
+ |defaults.vim|)
+ global
+ Change the way text is displayed. This is a comma-separated list of
+ flags:
+ lastline When included, as much as possible of the last line
+ 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.
+
+ When neither "lastline" nor "truncate" is included, a last line that
+ doesn't fit is replaced with "@" lines.
+
+ The "@" character can be changed by setting the "lastline" item in
+ 'fillchars'. The character is highlighted with |hl-NonText|.
+
+ *'eadirection'* *'ead'*
+'eadirection' 'ead' string (default "both")
+ global
+ Tells when the 'equalalways' option applies:
+ ver vertically, width of windows is not affected
+ hor horizontally, height of windows is not affected
+ both width and height of windows is affected
+
+ *'ed'* *'edcompatible'* *'noed'* *'noedcompatible'*
+'edcompatible' 'ed' boolean (default off)
+ global
+ Makes the 'g' and 'c' flags of the ":substitute" command to be
+ toggled each time the flag is given. See |complex-change|. See
+ also 'gdefault' option.
+ Switching this option on may break plugins!
+ This option is not used in |Vim9| script.
+
+ *'emoji'* *'emo'* *'noemoji'* *'noemo'*
+'emoji' 'emo' boolean (default: on)
+ global
+ When on all Unicode emoji characters are considered to be full width.
+ This excludes "text emoji" characters, which are normally displayed as
+ single width. Unfortunately there is no good specification for this
+ and it has been determined on trial-and-error basis. Use the
+ |setcellwidths()| function to change the behavior.
+
+ *'encoding'* *'enc'* *E543*
+'encoding' 'enc' string (default for MS-Windows: "utf-8",
+ otherwise: value from $LANG or "latin1")
+ global
+ Sets the character encoding used inside Vim. It applies to text in
+ the buffers, registers, Strings in expressions, text stored in the
+ viminfo file, etc. It sets the kind of characters which Vim can work
+ with. See |encoding-names| for the possible values.
+
+ NOTE: Changing this option will not change the encoding of the
+ existing text in Vim. It may cause non-ASCII text to become invalid.
+ It should normally be kept at its default value, or set when Vim
+ starts up. See |multibyte|. To reload the menus see |:menutrans|.
+
+ This option cannot be set from a |modeline|. It would most likely
+ corrupt the text.
+
+ NOTE: For GTK+ 2 or later, it is highly recommended to set 'encoding'
+ to "utf-8". Although care has been taken to allow different values of
+ 'encoding', "utf-8" is the natural choice for the environment and
+ avoids unnecessary conversion overhead. "utf-8" has not been made
+ the default to prevent different behavior of the GUI and terminal
+ versions, and to avoid changing the encoding of newly created files
+ without your knowledge (in case 'fileencodings' is empty).
+
+ 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 multibyte encoding, you
+ can use: >
+ if has("multi_byte_encoding")
+<
+ Normally 'encoding' will be equal to your current locale. This will
+ be the default if Vim recognizes your environment settings. If
+ 'encoding' is not set to the current locale, 'termencoding' must be
+ set to convert typed and displayed text. See |encoding-table|.
+
+ When you set this option, it fires the |EncodingChanged| autocommand
+ event so that you can set up fonts if necessary.
+
+ 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".
+
+ Note: "latin1" is also used when the encoding could not be detected.
+ This only works when editing files in the same encoding! When the
+ actual character set is not latin1, make sure 'fileencoding' and
+ 'fileencodings' are empty. When conversion is needed, switch to using
+ 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
+ |viminfo-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.
+
+ When 'encoding' is set to a Unicode encoding, and 'fileencodings' was
+ not set yet, the default for 'fileencodings' is changed.
+
+ *'endoffile'* *'eof'* *'noendoffile'* *'noeof'*
+'endoffile' 'eof' boolean (default off)
+ local to buffer
+ Indicates that a CTRL-Z character was found at the end of the file
+ when reading it. Normally only happens when 'fileformat' is "dos".
+ When writing a file and this option is off and the 'binary' option
+ is on, or 'fixeol' option is off, no CTRL-Z will be written at the
+ end of the file.
+ See |eol-and-eof| for example settings.
+
+ *'endofline'* *'eol'* *'noendofline'* *'noeol'*
+'endofline' 'eol' boolean (default on)
+ local to buffer
+ When writing a file and this option is off and the 'binary' option
+ is on, or 'fixeol' option is off, no <EOL> will be written for the
+ last line in the file. This option is automatically set or reset when
+ starting to edit a new file, depending on whether file has an <EOL>
+ for the last line in the file. Normally you don't have to set or
+ reset this option.
+ When 'binary' is off and 'fixeol' is on the value is not used when
+ writing the file. When 'binary' is on or 'fixeol' is off it is used
+ to remember the presence of a <EOL> for the last line in the file, so
+ that when you write the file the situation from the original file can
+ be kept. But you can change it if you want to.
+ See |eol-and-eof| for example settings.
+
+ *'equalalways'* *'ea'* *'noequalalways'* *'noea'*
+'equalalways' 'ea' boolean (default on)
+ global
+ When on, all the windows are automatically made the same size after
+ splitting or closing a window. This also happens the moment the
+ option is switched on. When off, splitting a window will reduce the
+ size of the current window and leave the other windows the same. When
+ closing a window the extra lines are given to the window next to it
+ (depending on 'splitbelow' and 'splitright').
+ When mixing vertically and horizontally split windows, a minimal size
+ is computed and some windows may be larger if there is room. The
+ 'eadirection' option tells in which direction the size is affected.
+ Changing the height and width of a window can be avoided by setting
+ 'winfixheight' and 'winfixwidth', respectively.
+ If a window size is specified when creating a new window sizes are
+ currently not equalized (it's complicated, but may be implemented in
+ the future).
+
+ *'equalprg'* *'ep'*
+'equalprg' 'ep' string (default "")
+ global or local to buffer |global-local|
+ External program to use for "=" command. When this option is empty
+ the internal formatting functions are used; either 'lisp', 'cindent'
+ or 'indentexpr'. When Vim was compiled without internal formatting,
+ the "indent" program is used.
+ Environment variables are expanded |:set_env|. See |option-backslash|
+ about including spaces and backslashes.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'errorbells'* *'eb'* *'noerrorbells'* *'noeb'*
+'errorbells' 'eb' boolean (default off)
+ global
+ 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.
+
+ *'errorfile'* *'ef'*
+'errorfile' 'ef' string (Amiga default: "AztecC.Err",
+ others: "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|.
+ NOT used for the ":make" command. See 'makeef' for that.
+ Environment variables are expanded |:set_env|.
+ See |option-backslash| about including spaces and backslashes.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'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.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+ NOTE: when this option is off then the |modifyOtherKeys| functionality
+ is disabled while in Insert mode to avoid ending Insert mode with any
+ key that has a modifier.
+
+ *'eventignore'* *'ei'*
+'eventignore' 'ei' string (default "")
+ global
+ A list of autocommand event names, which are to be ignored.
+ When set to "all" or when "all" is one of the items, all autocommand
+ events are ignored, autocommands will not be executed.
+ Otherwise this is a comma-separated list of event names. Example: >
+ :set ei=WinEnter,WinLeave
+<
+ *'expandtab'* *'et'* *'noexpandtab'* *'noet'*
+'expandtab' 'et' boolean (default off)
+ local to buffer
+ In Insert mode: Use the appropriate number of spaces to insert a
+ <Tab>. Spaces are used in indents with the '>' and '<' commands and
+ when 'autoindent' is on. To insert a real tab when 'expandtab' is
+ on, use CTRL-V<Tab>. See also |:retab| and |ins-expandtab|.
+ This option is reset when the 'paste' option is set and restored when
+ the 'paste' option is reset.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'exrc'* *'ex'* *'noexrc'* *'noex'*
+'exrc' 'ex' boolean (default off)
+ global
+ Enables the reading of .vimrc, .exrc and .gvimrc 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|).
+ Also see |.vimrc| and |gui-init|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'fileencoding'* *'fenc'* *E213*
+'fileencoding' 'fenc' string (default: "")
+ local to buffer
+ 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).
+ No error will be given when the value is set, only when it is used,
+ only when 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
+ specified that can be handled by the converter, see
+ |mbyte-conversion|.
+
+ When reading a file 'fileencoding' will be set from 'fileencodings'.
+ To read a file in a certain encoding it won't work by setting
+ 'fileencoding', use the |++enc| argument. One exception: when
+ 'fileencodings' is empty the value of 'fileencoding' is used.
+ For a new file the global value of 'fileencoding' is used.
+
+ 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
+ "ISO8859-2" becomes "iso-8859-2".
+
+ When this option is set, after starting to edit a file, the 'modified'
+ option is set, because the file would be different when written.
+
+ Keep in mind that changing 'fenc' from a modeline happens
+ AFTER the text has been read, thus it applies to when the file will be
+ 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.
+
+ *'fileencodings'* *'fencs'*
+'fileencodings' 'fencs' string (default: "ucs-bom",
+ "ucs-bom,utf-8,default,latin1" when
+ 'encoding' is set to a Unicode value)
+ global
+ 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
+ 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
+ will work and the first entry of 'fileencodings' will be used (except
+ "ucs-bom", which requires the BOM to be present). If you prefer
+ another encoding use an BufReadPost autocommand event to test if your
+ preferred encoding is to be used. Example: >
+ au BufReadPost * if search('\S', 'w') == 0 |
+ \ set fenc=iso-2022-jp | endif
+< This sets 'fileencoding' to "iso-2022-jp" if the file does not contain
+ non-blank characters.
+ When the |++enc| argument is used then the value of 'fileencodings' is
+ not used.
+ Note that 'fileencodings' is not used for a new file, the global value
+ of 'fileencoding' is used instead. You can set it with: >
+ :setglobal fenc=iso-8859-2
+< This means that a non-existing file may get a different encoding than
+ an empty file.
+ The special value "ucs-bom" can be used to check for a Unicode BOM
+ (Byte Order Mark) at the start of the file. It must not be preceded
+ by "utf-8" or another Unicode encoding for this to work properly.
+ An entry for an 8-bit encoding (e.g., "latin1") should be the last,
+ 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. On MS-Windows this is the system encoding. Otherwise
+ this is the default value for 'encoding'. 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.
+ 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
+ file
+ cp1250,latin1 "cp1250" will always be used
+ If 'fileencodings' is empty, 'fileencoding' is not modified.
+ See 'fileencoding' for the possible values.
+ Setting this option does not have an effect until the next time a file
+ is read.
+
+ *'fileformat'* *'ff'*
+'fileformat' 'ff' string (MS-Windows default: "dos",
+ Unix, macOS default: "unix")
+ local to buffer
+ This gives the <EOL> of the current buffer, which is used for
+ reading/writing the buffer from/to a file:
+ dos <CR><NL>
+ unix <NL>
+ mac <CR>
+ When "dos" is used, CTRL-Z at the end of a file is ignored.
+ See |file-formats| and |file-read|.
+ For the character encoding of the file see 'fileencoding'.
+ When 'binary' is set, the value of 'fileformat' is ignored, file I/O
+ works like it was set to "unix".
+ This option is set automatically when starting to edit a file and
+ '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.
+ For backwards compatibility: When this option is set to "dos",
+ 'textmode' is set, otherwise 'textmode' is reset.
+
+ *'fileformats'* *'ffs'*
+'fileformats' 'ffs' string (default:
+ Vim+Vi MS-Windows: "dos,unix",
+ Vim Unix, macOS: "unix,dos",
+ Vi Cygwin: "unix,dos",
+ Vi others: "")
+ global
+ This gives the end-of-line (<EOL>) formats that will be tried when
+ starting to edit a new buffer and when reading a file into an existing
+ buffer:
+ - When empty, the format defined with 'fileformat' will be used
+ always. It is not set automatically.
+ - When set to one name, that format will be used whenever a new buffer
+ is opened. 'fileformat' is set accordingly for that buffer. The
+ 'fileformats' name will be used when a file is read into an existing
+ buffer, no matter what 'fileformat' for that buffer is set to.
+ - When more than one name is present, separated by commas, automatic
+ <EOL> detection will be done when reading a file. When starting to
+ edit a file, a check is done for the <EOL>:
+ 1. If all lines end in <CR><NL>, and 'fileformats' includes "dos",
+ 'fileformat' is set to "dos".
+ 2. If a <NL> is found and 'fileformats' includes "unix", 'fileformat'
+ is set to "unix". Note that when a <NL> is found without a
+ preceding <CR>, "unix" is preferred over "dos".
+ 3. If 'fileformat' has not yet been set, and if a <CR> is found, and
+ if 'fileformats' includes "mac", 'fileformat' is set to "mac".
+ This means that "mac" is only chosen when:
+ "unix" is not present or no <NL> is found in the file, and
+ "dos" is not present or no <CR><NL> is found in the file.
+ Except: if "unix" was chosen, but there is a <CR> before
+ the first <NL>, and there appear to be more <CR>s than <NL>s in
+ the first few lines, "mac" is used.
+ 4. If 'fileformat' is still not set, the first name from
+ 'fileformats' is used.
+ When reading a file into an existing buffer, the same is done, but
+ this happens like 'fileformat' has been set appropriately for that
+ file only, the option is not changed.
+ When 'binary' is set, the value of 'fileformats' is not used.
+
+ When Vim starts up with an empty buffer the first item is used. You
+ can overrule this by setting 'fileformat' in your .vimrc.
+
+ For systems with a Dos-like <EOL> (<CR><NL>), when reading files that
+ are ":source"ed and for vimrc files, automatic <EOL> detection may be
+ done:
+ - When 'fileformats' is empty, there is no automatic detection. Dos
+ format will be used.
+ - When 'fileformats' is set to one or more names, automatic detection
+ is done. This is based on the first <NL> in the file: If there is a
+ <CR> in front of it, Dos format is used, otherwise Unix format is
+ used.
+ Also see |file-formats|.
+ For backwards compatibility: When this option is set to an empty
+ string or one format (no comma is included), 'textauto' is reset,
+ otherwise 'textauto' is set.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'fileignorecase'* *'fic'* *'nofileignorecase'* *'nofic'*
+'fileignorecase' 'fic' boolean (default on for systems where case in file
+ names is normally ignored)
+ global
+ When set case is ignored when using file names and directories.
+ See 'wildignorecase' for only ignoring case when doing completion.
+
+ *'filetype'* *'ft'*
+'filetype' 'ft' string (default: "")
+ local to buffer
+ When this option is set, the FileType autocommand event is triggered.
+ All autocommands that match with the value of this option will be
+ executed. Thus the value of 'filetype' is used in place of the file
+ name.
+ Otherwise this option does not always reflect the current file type.
+ This option is normally set when the file type is detected. To enable
+ this use the ":filetype on" command. |:filetype|
+ Setting this option to a different value is most useful in a modeline,
+ for a file for which the file type is not automatically recognized.
+ Example, for in an IDL file:
+ /* vim: set filetype=idl : */ ~
+ |FileType| |filetypes|
+ When a dot appears in the value then this separates two filetype
+ names. Example:
+ /* vim: set filetype=c.doxygen : */ ~
+ This will use the "c" filetype first, then the "doxygen" filetype.
+ This works both for filetype plugins and for syntax files. More than
+ one dot may appear.
+ This option is not copied to another buffer, independent of the 's' or
+ 'S' flag in 'cpoptions'.
+ Only normal file name characters can be used, "/\*?[|<>" are illegal.
+
+ *'fillchars'* *'fcs'*
+'fillchars' 'fcs' string (default "vert:|,fold:-,eob:~")
+ global or local to window |global-local|
+ {not available when compiled without the |+folding|
+ feature}
+ Characters to fill the statuslines, vertical separators and special
+ lines in the window.
+ It is a comma-separated list of items. Each item has a name, a colon
+ and the value of that item:
+
+ item name default Used for ~
+ stl ' ' or '^' statusline of the current window
+ stlnc ' ' or '=' statusline of the non-current windows
+ vert '|' vertical separators |:vsplit|
+ fold '-' filling 'foldtext'
+ foldopen '-' mark the beginning of a fold
+ foldclose '+' show a closed fold
+ foldsep '|' open fold middle character
+ diff '-' deleted lines of the 'diff' option
+ eob '~' empty lines below the end of a buffer
+ lastline '@' 'display' contains lastline/truncate
+
+ 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.
+
+ Example: >
+ :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.
+
+ For the "stl", "stlnc", "foldopen", "foldclose" and "foldsep" items
+ single-byte and multibyte characters are supported. But double-width
+ characters are not supported.
+
+ The highlighting used for these items:
+ item name highlight group ~
+ stl StatusLine |hl-StatusLine|
+ stlnc StatusLineNC |hl-StatusLineNC|
+ vert VertSplit |hl-VertSplit|
+ fold Folded |hl-Folded|
+ diff DiffDelete |hl-DiffDelete|
+ eob EndOfBuffer |hl-EndOfBuffer|
+ lastline NonText |hl-NonText|
+
+ *'fixendofline'* *'fixeol'* *'nofixendofline'* *'nofixeol'*
+'fixendofline' 'fixeol' boolean (default on)
+ local to buffer
+ 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.
+ When the 'binary' option is set the value of this option doesn't
+ matter.
+ See the 'endofline' option.
+ See |eol-and-eof| for example settings.
+
+ *'fkmap'* *'fk'* *'nofkmap'* *'nofk'*
+'fkmap' 'fk' boolean (default off)
+ global
+ {only available when compiled with the |+rightleft|
+ feature}
+ This option was for using Farsi, which has been removed. See
+ |farsi.txt|.
+
+ *'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.
+
+ *'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.
+ See |folding|.
+
+ *'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
+ with the |zi| command. The 'foldcolumn' will remain blank when
+ 'foldenable' is off.
+ This option is set by commands that create a new fold or close a fold.
+ See |folding|.
+
+ *'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. The context is set to the
+ script where 'foldexpr' was set, script-local items can be accessed.
+ See |fold-expr| for the usage.
+
+ The expression will be evaluated in the |sandbox| if set from a
+ modeline, see |sandbox-option|.
+ This option can't be set from a |modeline| when the 'diff' option is
+ on or the 'modelineexpr' option is off.
+
+ It is not allowed to change text or jump to another window while
+ evaluating 'foldexpr' |textlock|.
+
+ *'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.
+ The default "#" works well for C programs. See |fold-indent|.
+
+ *'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.
+ This option is set by commands like |zm|, |zM| and |zR|.
+ See |fold-foldlevel|.
+
+ *'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).
+ This is done before reading any modeline, thus a setting in a modeline
+ overrules this option. Starting to edit a file for |diff-mode| also
+ ignores this option and closes all folds.
+ It is also done before BufReadPre autocommands, to allow an autocmd to
+ overrule the 'foldlevel' value for specific files.
+ When the value is negative, it is not used.
+
+ *'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).
+ See |fold-marker|.
+
+ *'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.
+ |fold-expr| expr 'foldexpr' gives the fold level of a line.
+ |fold-marker| marker Markers are used to specify folds.
+ |fold-syntax| syntax Syntax highlighting items specify folds.
+ |fold-diff| diff Fold text that is not changed.
+
+ *'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.
+ Set to zero to be able to close folds of just one screen line.
+ Note that this only has an effect on what is displayed. After using
+ "zc" to close a fold, which is displayed open because it's smaller
+ than 'foldminlines', a following "zc" may close a containing fold.
+
+ *'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.
+
+ *'foldopen'* *'fdo'*
+'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.
+ NOTE: When the command is part of a mapping this option is not used.
+ Add the |zv| command to the mapping to get the same effect.
+ (rationale: the mapping may want to control opening folds itself)
+
+ item commands ~
+ all any
+ block "(", "{", "[[", "[{", etc.
+ hor horizontal movements: "l", "w", "fx", etc.
+ insert any command in Insert mode
+ jump far jumps: "G", "gg", etc.
+ mark jumping to a mark: "'m", CTRL-O, etc.
+ percent "%"
+ quickfix ":cn", ":crew", ":make", etc.
+ search search for a pattern: "/", "n", "*", "gd", etc.
+ (not for a search pattern in a ":" command)
+ Also for |[s| and |]s|.
+ tag jumping to a tag: ":ta", CTRL-T, etc.
+ undo undo or redo: "u" and CTRL-R
+ When a movement command is used for an operator (e.g., "dl" or "y%")
+ this option is not used. This means the operator will include the
+ whole closed fold.
+ Note that vertical movements are not here, because it would make it
+ very difficult to move onto a closed fold.
+ In insert mode the folds containing the cursor will always be open
+ when text is inserted.
+ To close folds you can re-apply 'foldlevel' with the |zx| command or
+ set the 'foldclose' option to "all".
+
+ *'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. The context is set to the script where 'foldexpr' was set,
+ script-local items can be accessed. See |fold-foldtext| for the
+ usage.
+
+ The expression will be evaluated in the |sandbox| if set from a
+ modeline, see |sandbox-option|.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+
+ 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
+ {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 advantage of using a function call without arguments is that it is
+ faster, see |expr-option-function|.
+
+ 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.
+
+ If the expression starts with s: or |<SID>|, then it is replaced with
+ the script ID (|local-function|). Example: >
+ set formatexpr=s:MyFormatExpr()
+ set formatexpr=<SID>SomeFormatExpr()
+< Otherwise, the expression is evaluated in the context of the script
+ where the option was set, thus script-local items are available.
+
+ 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.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+ NOTE: This option is set to "" when 'compatible' is set.
+
+ *'formatlistpat'* *'flp'*
+'formatlistpat' 'flp' string (default: "^\s*\d\+[\]:.)}\t ]\s*")
+ local to buffer
+ A pattern that is used to recognize a list header. This is used for
+ the "n" flag in 'formatoptions'.
+ The pattern must match exactly the text that will be the indent for
+ the line below it. You can use |/\ze| to mark the end of the match
+ while still checking more characters. There must be a character
+ following the pattern, when it matches the whole line it is handled
+ like there is no match.
+ The default recognizes a number, followed by an optional punctuation
+ character and white space.
+
+ *'formatoptions'* *'fo'*
+'formatoptions' 'fo' string (Vim default: "tcq", Vi default: "vt")
+ local to buffer
+ This is a sequence of letters which describes how automatic
+ formatting is to be done. See |fo-table|. When the 'paste' option is
+ on, no formatting is done (like 'formatoptions' is empty). Commas can
+ be inserted for readability.
+ To avoid problems with flags that are added in the future, use the
+ "+=" and "-=" feature of ":set" |add-option-flags|.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'formatprg'* *'fp'*
+'formatprg' 'fp' string (default "")
+ 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
+ such a program.
+ If the 'formatexpr' option is not empty it will be used instead.
+ Otherwise, if 'formatprg' option is an empty string, the internal
+ format function will be used |C-indenting|.
+ Environment variables are expanded |:set_env|. See |option-backslash|
+ about including spaces and backslashes.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'fsync'* *'fs'* *'nofsync'* *'nofs'*
+'fsync' 'fs' boolean (default on)
+ 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. On
+ systems without an fsync() implementation, this variable is always
+ off.
+ Also see 'swapsync' for controlling fsync() on swap files.
+ 'fsync' also applies to |writefile()| (unless a flag is used to
+ overrule it) and when writing undo files (see |undo-persistence|).
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'gdefault'* *'gd'* *'nogdefault'* *'nogd'*
+'gdefault' 'gd' boolean (default off)
+ global
+ When on, the ":substitute" flag 'g' is default on. This means that
+ all matches in a line are substituted instead of one. When a 'g' flag
+ is given to a ":substitute" command, this will toggle the substitution
+ of all or one match. See |complex-change|.
+
+ command 'gdefault' on 'gdefault' off ~
+ :s/// subst. all subst. one
+ :s///g subst. one subst. all
+ :s///gg subst. all subst. one
+
+ NOTE: This option is reset when 'compatible' is set.
+ 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.
+ This option is not used in |Vim9| script.
+
+ *'grepformat'* *'gfm'*
+'grepformat' 'gfm' string (default "%f:%l:%m,%f:%l%m,%f %l%m")
+ global
+ Format to recognize for the ":grep" command output.
+ This is a scanf-like string that uses the same format as the
+ 'errorformat' option: see |errorformat|.
+
+ *'grepprg'* *'gp'*
+'grepprg' 'gp' string (default "grep -n ",
+ Unix: "grep -n $* /dev/null",
+ Win32: "findstr /n" or "grep -n",
+ VMS: "SEARCH/NUMBERS ")
+ 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-
+ line. The placeholder "$*" is allowed to specify where the arguments
+ will be included. Environment variables are expanded |:set_env|. See
+ |option-backslash| about including spaces and backslashes.
+ When your "grep" accepts the "-H" argument, use this to make ":grep"
+ also work well with a single file: >
+ :set grepprg=grep\ -nH
+< Special value: When 'grepprg' is set to "internal" the |:grep| command
+ works like |:vimgrep|, |:lgrep| like |:lvimgrep|, |:grepadd| like
+ |: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 Win32 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 Win32 console}
+ This option tells Vim what the cursor should look like in different
+ modes. It fully works in the GUI. In a Win32 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', 't_SR', and 't_EI' escape sequences are
+ used.
+
+ The option is a comma-separated list of parts. Each part consist 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:
+ n Normal mode
+ v Visual mode
+ ve Visual mode with 'selection' "exclusive" (same as 'v',
+ if not specified)
+ o Operator-pending mode
+ i Insert mode
+ r Replace mode
+ c Command-line Normal (append) mode
+ ci Command-line Insert mode
+ cr Command-line Replace mode
+ sm showmatch in Insert mode
+ a all modes
+ The argument-list is a dash separated list of these arguments:
+ hor{N} horizontal bar, {N} percent of the character height
+ ver{N} vertical bar, {N} percent of the character width
+ block block cursor, fills the whole character
+ [only one of the above three should be present]
+ blinkwait{N} *cursor-blinking*
+ blinkon{N}
+ blinkoff{N}
+ blink times for cursor: blinkwait is the delay before
+ the cursor starts blinking, blinkon is the time that
+ the cursor is shown and blinkoff is the time that the
+ cursor is not shown. The times are in msec. When one
+ of the numbers is zero, there is no blinking. 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
+ {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
+ block cursor with colors from the "nCursor"
+ highlight group
+ i-ci:ver30-iCursor-blinkwait300-blinkon200-blinkoff150
+ In Insert and Command-line Insert mode, use a
+ 30% vertical bar cursor with colors from the
+ "iCursor" highlight group. Blink a bit
+ faster.
+
+ The 'a' mode is different. It will set the given argument-list for
+ all modes. It does not reset anything to defaults. This can be used
+ to do a common setting for all modes. For example, to switch off
+ blinking: "a:blinkon0"
+
+ Examples of cursor highlighting: >
+ :highlight Cursor gui=reverse guifg=NONE guibg=NONE
+ :highlight Cursor gui=NONE guifg=bg guibg=fg
+<
+ *'guifont'* *'gfn'*
+ *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.
+ See |gui-font| for the details.
+
+ *'guifontset'* *'gfs'*
+ *E250* *E252* *E234* *E597* *E598*
+'guifontset' 'gfs' string (default "")
+ global
+ {only available when compiled with GUI enabled and
+ with the |+xfontset| feature}
+ {not available in the GTK+ GUI}
+ 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|.
+
+ *'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. See |gui-fontwide|.
+
+ *'guiheadroom'* *'ghr'*
+'guiheadroom' 'ghr' number (default 50)
+ global
+ {only for GTK and 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.
+
+ *'guiligatures'* *'gli'* *E1243*
+'guiligatures' 'gli' string (default "")
+ global
+ {only for GTK GUI}
+ List of ASCII characters that, when combined together, can create more
+ complex shapes. Each character must be a printable ASCII character
+ with a value in the 32-127 range.
+ Example: >
+ :set guiligatures=!\"#$%&()*+-./:<=>?@[]^_{\|~
+< Changing this option updates screen output immediately. Set it to an
+ empty string to disable ligatures.
+
+ *'guioptions'* *'go'*
+'guioptions' 'go' string (default "egmrLtT" (MS-Windows,
+ "t" is removed in |defaults.vim|),
+ "aegimrLtT" (GTK and Motif),
+ )
+ 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.
+ To avoid problems with flags that are added in the future, use the
+ "+=" and "-=" feature of ":set" |add-option-flags|.
+
+ Valid characters are as follows:
+ *'go-!'*
+ '!' External commands are executed in a terminal window. Without
+ this flag the MS-Windows GUI will open a console window to
+ execute the command. The Unix GUI will simulate a dumb
+ terminal to list the command output.
+ The terminal window will be positioned at the bottom, and grow
+ upwards as needed.
+ *'go-a'*
+ 'a' Autoselect: 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. This means that the
+ Visually highlighted text is available for pasting into other
+ applications as well as into Vim itself. When the Visual mode
+ ends, possibly due to an operation on the text, or when an
+ application wants to paste the selection, the highlighted text
+ is automatically yanked into the "* selection register.
+ Thus the selection is still available for pasting into other
+ applications after the VISUAL mode has ended.
+ If not present, then Vim won't become the owner of the
+ windowing system's global selection unless explicitly told to
+ by a yank or delete operation for the "* register.
+ The same applies to the modeless selection.
+ *'go-P'*
+ 'P' Like autoselect but using the "+ register instead of the "*
+ register.
+ *'go-A'*
+ 'A' Autoselect for the modeless selection. Like 'a', but only
+ applies to the modeless selection.
+
+ 'guioptions' autoselect Visual autoselect modeless ~
+ "" - -
+ "a" yes yes
+ "A" - yes
+ "aA" yes yes
+
+ When using a terminal see the 'clipboard' option.
+
+ *'go-c'*
+ 'c' Use console dialogs instead of popup dialogs for simple
+ choices.
+ *'go-d'*
+ 'd' Use dark theme variant if available. Currently only works for
+ GTK+ GUI.
+ *'go-e'*
+ 'e' Add tab pages when indicated with 'showtabline'.
+ 'guitablabel' can be used to change the text in the labels.
+ When 'e' is missing a non-GUI tab pages line may be used.
+ The GUI tabs are only supported on some systems, currently
+ GTK, Motif, Mac OS/X, Haiku, and MS-Windows.
+ *'go-f'*
+ 'f' Foreground: Don't use fork() to detach the GUI from the shell
+ where it was started. Use this for programs that wait for the
+ editor to finish (e.g., an e-mail program). Alternatively you
+ can use "gvim -f" or ":gui -f" to start the GUI in the
+ foreground. |gui-fork|
+ Note: Set this option in the vimrc file. The forking may have
+ happened already when the |gvimrc| file is read.
+ *'go-i'*
+ 'i' Use a Vim icon. For GTK with KDE it is used in the left-upper
+ corner of the window. It's black&white on non-GTK, because of
+ limitations of X11. For a color icon, see |X11-icon|.
+ *'go-m'*
+ 'm' Menu bar is present.
+ *'go-M'*
+ 'M' The system menu "$VIMRUNTIME/menu.vim" is not sourced. Note
+ 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).
+ *'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.
+ *'go-t'*
+ 't' Include tearoff menu items. Currently only works for Win32,
+ GTK+, and Motif 1.2 GUI.
+ *'go-T'*
+ 'T' Include Toolbar. Currently only in Win32, GTK+, Motif and
+ Photon GUIs.
+ *'go-r'*
+ 'r' Right-hand scrollbar is always present.
+ *'go-R'*
+ 'R' Right-hand scrollbar is present when there is a vertically
+ split window.
+ *'go-l'*
+ 'l' Left-hand scrollbar is always present.
+ *'go-L'*
+ 'L' Left-hand scrollbar is present when there is a vertically
+ split window.
+ *'go-b'*
+ 'b' Bottom (horizontal) scrollbar is present. Its size depends on
+ the longest visible line, or on the cursor line if the 'h'
+ flag is included. |gui-horiz-scroll|
+ *'go-h'*
+ 'h' Limit horizontal scrollbar size to the length of the cursor
+ line. Reduces computations. |gui-horiz-scroll|
+
+ And yes, you may even have scrollbars on the left AND the right if
+ you really want to :-). See |gui-scrollbars| for more information.
+
+ *'go-v'*
+ 'v' Use a vertical button layout for dialogs. When not included,
+ a horizontal layout is preferred, but when it doesn't fit a
+ vertical layout is used anyway. Not supported in GTK 3.
+ *'go-p'*
+ 'p' Use Pointer callbacks for X11 GUI. This is required for some
+ window managers. If the cursor is not blinking or hollow at
+ the right moment, try adding this flag. This must be done
+ before starting the GUI. Set it in your |gvimrc|. Adding or
+ removing it after the GUI has started has no effect.
+ *'go-F'*
+ 'F' Add a footer. Only for Motif. See |gui-footer|.
+ *'go-k'*
+ 'k' Keep the GUI window size when adding/removing a scrollbar, or
+ toolbar, tabline, etc. Instead, the behavior is similar to
+ when the window is maximized and will adjust 'lines' and
+ 'columns' to fit to the window. Without the 'k' flag Vim will
+ try to keep 'lines' and 'columns' the same when adding and
+ removing GUI components.
+
+ *'guipty'* *'noguipty'*
+'guipty' boolean (default on)
+ global
+ {only available when compiled with GUI enabled}
+ Only in the GUI: If on, an attempt is made to open a pseudo-tty for
+ I/O to/from shell commands. See |gui-pty|.
+
+ *'guitablabel'* *'gtl'*
+'guitablabel' 'gtl' string (default empty)
+ global
+ {only available when compiled with GUI enabled}
+ When non-empty 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|.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+
+ 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
+ used.
+
+ *'guitabtooltip'* *'gtt'*
+'guitabtooltip' 'gtt' string (default empty)
+ global
+ {only available when compiled with GUI enabled}
+ When non-empty 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.
+ You can include a line break. Simplest method is to use |:let|: >
+ :let &guitabtooltip = "line one\nline two"
+<
+
+ *'helpfile'* *'hf'*
+'helpfile' 'hf' string (default (MS-Windows) "$VIMRUNTIME\doc\help.txt"
+ (others) "$VIMRUNTIME/doc/help.txt")
+ global
+ Name of the main help file. All distributed help files should be
+ placed together in one directory. Additionally, all "doc" directories
+ in 'runtimepath' will be used.
+ Environment variables are expanded |:set_env|. For example:
+ "$VIMRUNTIME/doc/help.txt". If $VIMRUNTIME is not set, $VIM is also
+ tried. Also see |$VIMRUNTIME| and |option-backslash| about including
+ spaces and backslashes.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'helpheight'* *'hh'*
+'helpheight' 'hh' number (default 20)
+ global
+ 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
+ windows. When the height is less than 'helpheight', the height is
+ set to 'helpheight'. Set to zero to disable.
+
+ *'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
+ another language, but that will only find tags that exist in that
+ language and not in the English help.
+ Example: >
+ :set helplang=de,it
+< This will first search German, then Italian and finally English help
+ files.
+ When using |CTRL-]| and ":help!" in a non-English help file Vim will
+ try to find the tag in the current language before using this option.
+ See |help-translated|.
+
+ *'hidden'* *'hid'* *'nohidden'* *'nohid'*
+'hidden' 'hid' boolean (default off)
+ global
+ When off a buffer is unloaded when it is |abandon|ed. When on a
+ buffer becomes hidden when it is |abandon|ed. If the buffer is still
+ displayed in another window, it does not become hidden, of course.
+
+ The commands that move through the buffer list sometimes make a buffer
+ hidden even if the 'hidden' option is off when these three are true:
+ - the buffer is modified
+ - 'autowrite' is off or writing is not possible
+ - the '!' flag was used
+ Also see |windows.txt|.
+
+ To only make one buffer hidden use the 'bufhidden' option.
+ This option is set for one command with ":hide {command}" |:hide|.
+ 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,@:NonText,
+ d:Directory,e:ErrorMsg,i:IncSearch,
+ l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,
+ a:LineNrAbove,b:LineNrBelow,
+ N:CursorLineNr,r:Question,s:StatusLine,
+ S:StatusLineNC,c:VertSplit,t:Title,
+ 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,q:QuickFixLine,
+ z:StatusLineTerm,Z:StatusLineTermNC")
+ 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-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
+ h (obsolete, ignored)
+ |hl-IncSearch| i 'incsearch' highlighting
+ |hl-CurSearch| y current instance of last search pattern
+ |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-LineNrAbove| a line number above the cursor for when the
+ 'relativenumber' option is set.
+ |hl-LineNrBelow| b line number below the cursor for when the
+ '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-VisualNOS| V Visual mode when Vim does is "Not Owning the
+ Selection" Only X11 Gui's |gui-x11| and
+ |xterm-clipboard|.
+ |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-Conceal| - the placeholders used for concealed characters
+ (see 'conceallevel')
+ |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-Pmenu| + popup menu normal line
+ |hl-PmenuSel| = popup menu selected 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 "Us" and "Ce")
+ 2 double underline (termcap entry "Ds" and "Ce")
+ d dotted underline (termcap entry "ds" and "Ce")
+ = dashed underline (termcap entry "Ds" and "Ce")
+ t strikethrough (termcap entry "Ts" and "Te")
+ n no highlighting
+ - no highlighting
+ : use a highlight group
+ The default is used for occasions that are not included.
+ If you want to change what the display modes do, see |dos-colors|
+ for an example.
+ 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.
+
+ *'history'* *'hi'*
+'history' 'hi' number (Vim default: 50, Vi default: 0,
+ set to 200 in |defaults.vim|)
+ global
+ A history of ":" commands, and a history of previous search patterns
+ is remembered. This option decides how many entries may be stored in
+ each of these histories (see |cmdline-editing|).
+ The maximum value is 10000.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'hkmap'* *'hk'* *'nohkmap'* *'nohk'*
+'hkmap' 'hk' boolean (default off)
+ global
+ {only available when compiled with the |+rightleft|
+ feature}
+ When on, the keyboard is mapped for the Hebrew character set.
+ Normally you would set 'allowrevins' and use CTRL-_ in insert mode to
+ toggle this option. See |rileft.txt|.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'hkmapp'* *'hkp'* *'nohkmapp'* *'nohkp'*
+'hkmapp' 'hkp' boolean (default off)
+ global
+ {only available when compiled with the |+rightleft|
+ feature}
+ When on, phonetic keyboard mapping is used. 'hkmap' must also be on.
+ This is useful if you have a non-Hebrew keyboard.
+ See |rileft.txt|.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'hlsearch'* *'hls'* *'nohlsearch'* *'nohls'*
+'hlsearch' 'hls' boolean (default off)
+ 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. If the "CurSearch" highlight group is set then the
+ current match is highlighted with that.
+ 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 'viminfo' |viminfo-h|.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'icon'* *'noicon'*
+'icon' boolean (default off, on when title can be restored)
+ global
+ 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.
+ Overridden by the 'iconstring' option.
+ Only works if the terminal supports setting window icons (currently
+ only X11 GUI and terminals with a non-empty 't_IS' option - these are
+ Unix xterm and iris-ansi by default, where 't_IS' is taken from the
+ builtin termcap).
+ When Vim was compiled with HAVE_X11 defined, the original icon will be
+ restored if possible |X11|. See |X11-icon| for changing the icon on
+ X11.
+ For MS-Windows the icon can be changed, see |windows-icon|.
+
+ *'iconstring'*
+'iconstring' string (default "")
+ global
+ 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
+ (currently only X11 GUI and terminals with a non-empty 't_IS' option).
+ Does not work for MS-Windows.
+ When Vim was compiled with HAVE_X11 defined, the original icon will be
+ restored if possible |X11|.
+ When this option contains printf-style '%' items, they will be
+ expanded according to the rules used for 'statusline'. See
+ 'titlestring' for example settings.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+ {not available when compiled without the |+statusline| feature}
+
+ *'ignorecase'* *'ic'* *'noignorecase'* *'noic'*
+'ignorecase' 'ic' boolean (default off)
+ global
+ Ignore case in search patterns. Also used when searching in the tags
+ file.
+ Also see 'smartcase' and 'tagcase'.
+ Can be overruled by using "\c" or "\C" in the pattern, see
+ |/ignorecase|.
+
+ *'imactivatefunc'* *'imaf'*
+'imactivatefunc' 'imaf' string (default "")
+ global
+ This option specifies a function that will be called to
+ activate or deactivate the Input Method. The value can be the name of
+ a function, a |lambda| or a |Funcref|. See |option-value-function| for
+ more information.
+ It is not used in the MS-Windows GUI version.
+ The expression will be evaluated in the |sandbox| when set from a
+ modeline, see |sandbox-option|.
+
+ Example: >
+ function ImActivateFunc(active)
+ if a:active
+ ... do something
+ else
+ ... do something
+ endif
+ " return value is not used
+ endfunction
+ set imactivatefunc=ImActivateFunc
+<
+ *'imactivatekey'* *'imak'*
+'imactivatekey' 'imak' string (default "")
+ global
+ {only available when compiled with |+xim| and
+ |+GUI_GTK|} *E599*
+ Specifies the key that your Input Method in X-Windows uses for
+ activation. When this is specified correctly, vim can fully control
+ IM with 'imcmdline', 'iminsert' and 'imsearch'.
+ You can't use this option to change the activation key, the option
+ tells Vim what the key is.
+ Format:
+ [MODIFIER_FLAG-]KEY_STRING
+
+ These characters can be used for MODIFIER_FLAG (case is ignored):
+ S Shift key
+ L Lock key
+ C Control key
+ 1 Mod1 key
+ 2 Mod2 key
+ 3 Mod3 key
+ 4 Mod4 key
+ 5 Mod5 key
+ Combinations are allowed, for example "S-C-space" or "SC-space" are
+ both shift+ctrl+space.
+ See <X11/keysymdef.h> and XStringToKeysym for KEY_STRING.
+
+ Example: >
+ :set imactivatekey=S-space
+< "S-space" means shift+space. This is the activation key for kinput2 +
+ canna (Japanese), and ami (Korean).
+
+ *'imcmdline'* *'imc'* *'noimcmdline'* *'noimc'*
+'imcmdline' 'imc' boolean (default off)
+ global
+ 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
+ English characters directly, e.g., when it's used to type accented
+ characters with dead keys.
+
+ *'imdisable'* *'imd'* *'noimdisable'* *'noimd'*
+'imdisable' 'imd' boolean (default off, on for some systems (SGI))
+ global
+ 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
+ may change in later releases.
+
+ *'iminsert'* *'imi'*
+'iminsert' 'imi' number (default 0)
+ local to buffer
+ Specifies whether :lmap or an Input Method (IM) is to be used in
+ Insert mode. Valid values:
+ 0 :lmap is off and IM is off
+ 1 :lmap is ON and IM is off
+ 2 :lmap is off and IM is ON
+ To always reset the option to zero when leaving Insert mode with <Esc>
+ this can be used: >
+ :inoremap <ESC> <ESC>:set iminsert=0<CR>
+< This makes :lmap and IM turn off automatically when leaving Insert
+ mode.
+ Note that this option changes when using CTRL-^ in Insert mode
+ |i_CTRL-^|.
+ The value is set to 1 when setting 'keymap' to a valid keymap name.
+ It is also used for the argument of commands like "r" and "f".
+ The value 0 may not work correctly with Motif with some XIM
+ methods. Use 'imdisable' to disable XIM then.
+
+ You can set 'imactivatefunc' and 'imstatusfunc' to handle IME/XIM
+ via external command if Vim is not compiled with the |+xim|,
+ |+multi_byte_ime| or |global-ime|.
+
+ *'imsearch'* *'ims'*
+'imsearch' 'ims' number (default -1)
+ local to buffer
+ Specifies whether :lmap or an Input Method (IM) is to be used when
+ entering a search pattern. Valid values:
+ -1 the value of 'iminsert' is used, makes it look like
+ 'iminsert' is also used when typing a search pattern
+ 0 :lmap is off and IM is off
+ 1 :lmap is ON and IM is off
+ 2 :lmap is off and IM is ON
+ Note that this option changes when using CTRL-^ in Command-line mode
+ |c_CTRL-^|.
+ The value is set to 1 when it is not -1 and setting the 'keymap'
+ option to a valid keymap name.
+ The value 0 may not work correctly with Motif with some XIM
+ methods. Use 'imdisable' to disable XIM then.
+
+ *'imstatusfunc'* *'imsf'*
+'imstatusfunc' 'imsf' string (default "")
+ global
+ This option specifies a function that is called to obtain the status
+ of Input Method. It must return a positive number when IME is active.
+ The value can be the name of a function, a |lambda| or a |Funcref|.
+ See |option-value-function| for more information.
+ It is not used in the MS-Windows GUI version.
+
+ Example: >
+ function ImStatusFunc()
+ let is_active = ...do something
+ return is_active ? 1 : 0
+ endfunction
+ set imstatusfunc=ImStatusFunc
+<
+ NOTE: This function is invoked very often. Keep it fast.
+ The expression will be evaluated in the |sandbox| when set from a
+ modeline, see |sandbox-option|.
+
+ *'imstyle'* *'imst'*
+'imstyle' 'imst' number (default 1)
+ global
+ {only available when compiled with |+xim| and
+ |+GUI_GTK|}
+ This option specifies the input style of Input Method:
+ 0 use on-the-spot style
+ 1 over-the-spot style
+ See: |xim-input-style|
+
+ For a long time on-the-spot style had been used in the GTK version of
+ vim, however, it is known that it causes troubles when using mappings,
+ |single-repeat|, etc. Therefore over-the-spot style becomes the
+ default now. This should work fine for most people, however if you
+ have any problem with it, try using on-the-spot style.
+ The expression will be evaluated in the |sandbox| when set from a
+ modeline, see |sandbox-option|.
+
+ *'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",
+ "]I", "[d", etc.
+ Normally the 'isfname' option is used to recognize the file name that
+ comes after the matched pattern. But if "\zs" appears in the pattern
+ then the text matched from "\zs" to the end, or until "\ze" if it
+ appears, is used as the file name. Use this to include characters
+ that are not in 'isfname', such as a space. You can then use
+ 'includeexpr' to process the matched text.
+ See |option-backslash| about including spaces and backslashes.
+
+ *'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: >
+ :setlocal includeexpr=substitute(v:fname,'\\.','/','g')
+< The "v:fname" variable will be set to the file name that was detected.
+ Note the double backslash: the `:set` command first halves them, then
+ one remains it the value, where "\." matches a dot literally. For
+ simple character replacements `tr()` avoids the need for escaping: >
+ :setlocal includeexpr=tr(v:fname,'.','/')
+<
+ Also used for the |gf| command if an unmodified file name can't be
+ found. Allows doing "gf" on the name after an 'include' statement.
+ Also used for |<cfile>|.
+
+ If the expression starts with s: or |<SID>|, then it is replaced with
+ the script ID (|local-function|). Example: >
+ setlocal includeexpr=s:MyIncludeExpr()
+ setlocal includeexpr=<SID>SomeIncludeExpr()
+< Otherwise, the expression is evaluated in the context of the script
+ where the option was set, thus script-local items are available.
+
+ It is more efficient if the value is just a function call without
+ arguments, see |expr-option-function|.
+
+ The expression will be evaluated in the |sandbox| when set from a
+ modeline, see |sandbox-option|.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+
+ It is not allowed to change text or jump to another window while
+ evaluating 'includeexpr' |textlock|.
+
+ *'incsearch'* *'is'* *'noincsearch'* *'nois'*
+'incsearch' 'is' boolean (default off, set in |defaults.vim| if the
+ |+reltime| feature is supported)
+ global
+ {not available when compiled without the
+ |+extra_search| features}
+ While typing a search command, show where the pattern, as it was typed
+ 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.
+ Also applies to the pattern in commands: >
+ :global
+ :lvimgrep
+ :lvimgrepadd
+ :smagic
+ :snomagic
+ :sort
+ :substitute
+ :vglobal
+ :vimgrep
+ :vimgrepadd
+< 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|
+ When compiled with the |+reltime| feature 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'.
+ 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
+ converted to lowercase.
+ CTRL-R CTRL-W can be used to add the word at the end of the current
+ match, excluding the characters that were already typed.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'indentexpr'* *'inde'*
+'indentexpr' 'inde' string (default "")
+ local to buffer
+ {not available when compiled without the |+eval|
+ feature}
+ Expression which is evaluated to obtain the proper indent for a line.
+ It is used when a new line is created, for the |=| operator and
+ in Insert mode as specified with the 'indentkeys' option.
+ When this option is not empty, it overrules the 'cindent' and
+ 'smartindent' indenting. When 'lisp' is set, this option is
+ is only used when 'lispoptions' contains "expr:1".
+ When 'paste' is set this option is not used for indenting.
+ The expression is evaluated with |v:lnum| set to the line number for
+ which the indent is to be computed. The cursor is also in this line
+ when the expression is evaluated (but it may be moved around).
+
+ If the expression starts with s: or |<SID>|, then it is replaced with
+ the script ID (|local-function|). Example: >
+ set indentexpr=s:MyIndentExpr()
+ set indentexpr=<SID>SomeIndentExpr()
+< Otherwise, the expression is evaluated in the context of the script
+ where the option was set, thus script-local items are available.
+
+ The advantage of using a function call without arguments is that it is
+ faster, see |expr-option-function|.
+
+ The expression must return the number of spaces worth of indent. It
+ can return "-1" to keep the current indent (this means 'autoindent' is
+ used for the indent).
+ Functions useful for computing the indent are |indent()|, |cindent()|
+ and |lispindent()|.
+ The evaluation of the expression must not have side effects! It must
+ not change the text, jump to another window, etc. Afterwards the
+ cursor position is always restored, thus the cursor may be moved.
+ Normally this option would be set to call a function: >
+ :set indentexpr=GetMyIndent()
+< Error messages will be suppressed, unless the 'debug' option contains
+ "msg".
+ See |indent-expression|.
+ NOTE: This option is set to "" when 'compatible' is set.
+
+ The expression will be evaluated in the |sandbox| when set from a
+ modeline, see |sandbox-option|.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+
+ It is not allowed to change text or jump to another window while
+ evaluating 'indentexpr' |textlock|.
+
+
+ *'indentkeys'* *'indk'*
+'indentkeys' 'indk' string (default "0{,0},0),0],:,0#,!^F,o,O,e")
+ local to buffer
+ A list of keys that, when typed in Insert mode, cause reindenting of
+ the current line. Only happens if 'indentexpr' isn't empty.
+ The format is identical to 'cinkeys', see |indentkeys-format|.
+ See |C-indenting| and |indent-expression|.
+
+ *'infercase'* *'inf'* *'noinfercase'* *'noinf'*
+'infercase' 'inf' boolean (default off)
+ local to buffer
+ When doing keyword completion in insert mode |ins-completion|, and
+ 'ignorecase' is also on, the case of the match is adjusted depending
+ on the typed text. If the typed text contains a lowercase letter
+ where the match has an upper case letter, the completed part is made
+ lowercase. If the typed text has no lowercase letters and the match
+ has a lowercase letter where the typed text has an uppercase letter,
+ and there is a letter before it, the completed part is made uppercase.
+ With 'noinfercase' the match is used as-is.
+
+ *'insertmode'* *'im'* *'noinsertmode'* *'noim'*
+'insertmode' 'im' boolean (default off)
+ global
+ Makes Vim work in a way that Insert mode is the default mode. Useful
+ if you want to use Vim as a modeless editor. Used for |evim|.
+ 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
+ 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
+ <Esc> to get back to Insert mode. Note that CTRL-L moves the cursor
+ left, like <Esc> does when 'insertmode' isn't set. |i_CTRL-L|
+
+ These items change when 'insertmode' is set:
+ - when starting to edit of a file, Vim goes to Insert mode.
+ - <Esc> in Insert mode is a no-op and beeps.
+ - <Esc> in Normal mode makes Vim go to Insert mode.
+ - CTRL-L in Insert mode is a command, it is not inserted.
+ - CTRL-Z in Insert mode suspends Vim, see |CTRL-Z|. *i_CTRL-Z*
+ However, when <Esc> is used inside a mapping, it behaves like
+ 'insertmode' was not set. This was done to be able to use the same
+ mappings with 'insertmode' set or not set.
+ When executing commands with |:normal| 'insertmode' is not used.
+
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'isfname'* *'isf'*
+'isfname' 'isf' string (default for Win32:
+ "@,48-57,/,\,.,-,_,+,,,#,$,%,{,},[,],:,@-@,!,~,="
+ for AMIGA: "@,48-57,/,.,-,_,+,,,$,:"
+ for VMS: "@,48-57,/,.,-,_,+,,,#,$,%,<,>,[,],:,;,~"
+ for OS/390: "@,240-249,/,.,-,_,+,,,#,$,%,~,="
+ otherwise: "@,48-57,/,.,-,_,+,,,#,$,%,~,=")
+ global
+ The characters specified by this option are included in file names and
+ path names. Filenames are used for commands like "gf", "[i" and in
+ the tags file. It is also used for "\f" in a |pattern|.
+ Multi-byte characters 256 and above are always included, only the
+ characters up to 255 are specified with this option.
+ For UTF-8 the characters 0xa0 to 0xff are included as well.
+ Think twice before adding white space to this option. Although a
+ space may appear inside a file name, the effect will be that Vim
+ doesn't know where a file name starts or ends when doing completion.
+ It most likely works better without a space in 'isfname'.
+
+ Note that on systems using a backslash as path separator, Vim tries to
+ do its best to make it work as you would expect. That is a bit
+ tricky, since Vi originally used the backslash to escape special
+ characters. Vim will not remove a backslash in front of a normal file
+ name character on these systems, but it will on Unix and alikes. The
+ '&' and '^' are not included by default, because these are special for
+ cmd.exe.
+
+ The format of this option is a list of parts, separated with commas.
+ Each part can be a single character number or a range. A range is two
+ character numbers with '-' in between. A character number can be a
+ decimal number between 0 and 255 or the ASCII character itself (does
+ not work for digits). Example:
+ "_,-,128-140,#-43" (include '_' and '-' and the range
+ 128 to 140 and '#' to 43)
+ If a part starts with '^', the following character number or range
+ will be excluded from the option. The option is interpreted from left
+ to right. Put the excluded character after the range where it is
+ included. To include '^' itself use it as the last character of the
+ option or the end of a range. Example:
+ "^a-z,#,^" (exclude 'a' to 'z', include '#' and '^')
+ If the character is '@', all characters where isalpha() returns TRUE
+ are included. Normally these are the characters a to z and A to Z,
+ plus accented characters. To include '@' itself use "@-@". Examples:
+ "@,^a-z" All alphabetic characters, excluding lower
+ case ASCII letters.
+ "a-z,A-Z,@-@" All letters plus the '@' character.
+ A comma can be included by using it where a character number is
+ expected. Example:
+ "48-57,,,_" Digits, comma and underscore.
+ A comma can be excluded by prepending a '^'. Example:
+ " -~,^,,9" All characters from space to '~', excluding
+ comma, plus <Tab>.
+ See |option-backslash| about including spaces and backslashes.
+
+ *'isident'* *'isi'*
+'isident' 'isi' string (default for Win32:
+ "@,48-57,_,128-167,224-235"
+ otherwise: "@,48-57,_,192-255")
+ global
+ The characters given by this option are included in identifiers.
+ 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. 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/.viminfo". Maybe you should change 'iskeyword' instead.
+
+ *'iskeyword'* *'isk'*
+'iskeyword' 'isk' string (Vim default for Win32:
+ "@,48-57,_,128-167,224-235"
+ otherwise: "@,48-57,_,192-255"
+ Vi default: "@,48-57,_")
+ 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 '@'
+ characters above 255 check the "word" character class (any character
+ that is not white space or punctuation).
+ 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).
+ When the 'lisp' option is on the '-' character is always included.
+ This option also influences syntax highlighting, unless the syntax
+ uses |:syn-iskeyword|.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'isprint'* *'isp'*
+'isprint' 'isp' string (default for Win32 and macOS:
+ "@,~-255"; otherwise: "@,161-255")
+ global
+ The characters given by this option are displayed directly on the
+ screen. It is also used for "\p" in a |pattern|. The characters from
+ space (ASCII 32) to '~' (ASCII 126) are always displayed directly,
+ even when they are not included in 'isprint' or excluded. See
+ 'isfname' for a description of the format of this option.
+
+ Non-printable characters are displayed with two characters:
+ 0 - 31 "^@" - "^_"
+ 32 - 126 always single characters
+ 127 "^?"
+ 128 - 159 "~@" - "~_"
+ 160 - 254 "| " - "|~"
+ 255 "~?"
+ When 'encoding' is a Unicode one, illegal bytes from 128 to 255 are
+ displayed as <xx>, with the hexadecimal value of the byte.
+ When 'display' contains "uhex" all unprintable characters are
+ displayed as <xx>.
+ The SpecialKey highlighting will be used for unprintable characters.
+ |hl-SpecialKey|
+
+ Multi-byte characters 256 and above are always included, only the
+ characters up to 255 are specified with this option. When a character
+ is printable but it is not available in the current font, a
+ replacement character will be shown.
+ Unprintable and zero-width Unicode characters are displayed as <xxxx>.
+ There is no option to specify these characters.
+
+ *'joinspaces'* *'js'* *'nojoinspaces'* *'nojs'*
+'joinspaces' 'js' boolean (default on)
+ global
+ Insert two spaces after a '.', '?' and '!' with a join command.
+ When 'cpoptions' includes the 'j' flag, only do this after a '.'.
+ Otherwise only one space is inserted.
+ NOTE: This option is set when 'compatible' is set.
+
+ *'key'*
+'key' string (default "")
+ local to buffer
+ {only available when compiled with the |+cryptv|
+ feature}
+ The key that is used for encrypting and decrypting the current buffer.
+ See |encryption| and 'cryptmethod'.
+ Careful: Do not set the key value by hand, someone might see the typed
+ key. Use the |:X| command. But you can make 'key' empty: >
+ :set key=
+< It is not possible to get the value of this option with ":set key" or
+ "echo &key". This is to avoid showing it to someone who shouldn't
+ know. It also means you cannot see it yourself once you have set it,
+ be careful not to make a typing error!
+ You can use "&key" in an expression to detect whether encryption is
+ enabled. When 'key' is set it returns "*****" (five stars).
+
+ *'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.
+ 'imsearch' is also set to one, unless it was -1
+ Only normal file name characters can be used, "/\*?[|<>" are illegal.
+
+ *'keymodel'* *'km'*
+'keymodel' 'km' string (default "")
+ global
+ List of comma-separated words, which enable special things that keys
+ can do. These values can be used:
+ startsel Using a shifted special key starts selection (either
+ Select mode or Visual mode, depending on "key" being
+ present in 'selectmode').
+ stopsel Using a not-shifted special key stops selection.
+ Special keys in this context are the cursor keys, <End>, <Home>,
+ <PageUp> and <PageDown>.
+ The 'keymodel' option is set by the |:behave| command.
+
+ *'keyprotocol'* *'kpc'*
+'keyprotocol' 'kpc' string (default: see below)
+ global
+ Specifies what keyboard protocol to use depending on the value of
+ 'term'. The supported keyboard protocols names are:
+ none whatever the terminal uses
+ mok2 modifyOtherKeys level 2, as supported by xterm
+ kitty Kitty keyboard protocol, as supported by Kitty
+
+ The option value is a list of comma separated items. Each item has
+ a pattern that is matched against the 'term' option, a colon and the
+ protocol name to be used. To illustrate this, the default value would
+ be set with: >
+ set keyprotocol=kitty:kitty,foot:kitty,wezterm:kitty,xterm:mok2
+
+< This means that when 'term' contains "kitty, "foot" or "wezterm"
+ somewhere then the "kitty" protocol is used. When 'term' contains
+ "xterm" somewhere, then the "mok2" protocol is used.
+
+ The first match is used, thus if you want to have "kitty" use the
+ kitty protocol, but "badkitty" not, then you should match "badkitty"
+ first and use the "none" value: >
+ set keyprotocol=badkitty:none,kitty:kitty
+<
+ The option is used after 'term' has been changed. First the termcap
+ entries are set, possibly using the builtin list, see |builtin-terms|.
+ Then this option is inspected and if there is a match and a protocol
+ is specified the following happens:
+ none Nothing, the regular t_TE and t_TI values remain
+
+ mok2 The t_TE value is changed to:
+ CSI >4;m disables modifyOtherKeys
+ The t_TI value is changed to:
+ CSI >4;2m enables modifyOtherKeys
+ CSI ?4m request the modifyOtherKeys state
+
+ kitty The t_TE value is changed to:
+ CSI >4;m disables modifyOtherKeys
+ CSI =0;1u disables the kitty keyboard protocol
+ The t_TI value is changed to:
+ CSI =1;1u enables the kitty keyboard protocol
+ CSI ?u request kitty keyboard protocol state
+ CSI >c request the termresponse
+
+ If you notice problems, such as characters being displayed that
+ disappear after `CTRL-L`, you might want to try making this option
+ empty. Then set the 'term' option to have it take effect: >
+ set keyprotocol=
+ let &term = &term
+<
+
+ *'keywordprg'* *'kp'*
+'keywordprg' 'kp' string (default "man" or "man -s", DOS: ":help",
+ VMS: "help")
+ global or local to buffer |global-local|
+ Program to use for the |K| command. Environment variables are
+ expanded |:set_env|. ":help" may be used to access the Vim internal
+ 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
+ Ex command with [count] added as an argument if it is not zero.
+ When "man", "man -s" or an Ex command is used, Vim will automatically
+ translate a count for the "K" command and pass it as the first
+ argument. For "man -s" the "-s" is removed when there is no count.
+ See |option-backslash| about including spaces and backslashes.
+ Example: >
+ :set keywordprg=man\ -s
+< This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'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
+ care of translating these special characters to the original meaning
+ of the key. This means you don't have to change the keyboard mode to
+ be able to execute Normal mode commands.
+ This is the opposite of the 'keymap' option, where characters are
+ mapped in Insert mode.
+ Also consider setting 'langremap' to off, to prevent 'langmap' from
+ applying to characters resulting from a mapping.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ Example (for Greek, in UTF-8): *greek* >
+ :set langmap=ΑA,ΒB,ΨC,ΔD,ΕE,ΦF,ΓG,ΗH,ΙI,ΞJ,ΚK,ΛL,ΜM,ΝN,ΟO,ΠP,QQ,ΡR,ΣS,ΤT,ΘU,ΩV,WW,ΧX,ΥY,ΖZ,αa,βb,ψc,δd,εe,φf,γg,ηh,ιi,ξj,κk,λl,μm,νn,οo,πp,qq,ρr,σs,τt,θu,ωv,ςw,χx,υy,ζz
+< Example (exchanges meaning of z and y for commands): >
+ :set langmap=zy,yz,ZY,YZ
+<
+ The 'langmap' option is a list of parts, separated with commas. Each
+ part can be in one of two forms:
+ 1. A list of pairs. Each pair is a "from" character immediately
+ followed by the "to" character. Examples: "aA", "aAbBcC".
+ 2. A list of "from" characters, a semi-colon and a list of "to"
+ characters. Example: "abc;ABC"
+ Example: "aA,fgh;FGH,cCdDeE"
+ Special characters need to be preceded with a backslash. These are
+ ";", ',', '"', '|' and backslash itself.
+
+ This will allow you to activate vim actions without having to switch
+ back and forth between the languages. Your language characters will
+ be understood as normal vim English characters (according to the
+ langmap mappings) in the following cases:
+ o Normal/Visual mode (commands, buffer/register names, user mappings)
+ o Insert/Replace Mode: Register names after CTRL-R
+ o Insert/Replace Mode: Mappings
+ Characters entered in Command-line mode will NOT be affected by
+ this option. Note that this option can be changed at any time
+ allowing to switch between mappings for different languages/encodings.
+ Use a mapping to avoid having to type it each time!
+
+ *'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"
+< (without the spaces). For example, to always use the Dutch menus, no
+ matter what $LANG is set to: >
+ :set langmenu=nl_NL.ISO_8859-1
+< When 'langmenu' is empty, |v:lang| is used.
+ Only normal file name characters can be used, "/\*?[|<>" are illegal.
+ If your $LANG is set to a non-English language but you do want to use
+ the English menus: >
+ :set langmenu=none
+< This option must be set before loading menus, switching on filetype
+ detection or syntax highlighting. Once the menus are defined setting
+ this option has no effect. But you could do this: >
+ :source $VIMRUNTIME/delmenu.vim
+ :set langmenu=de_DE.ISO_8859-1
+ :source $VIMRUNTIME/menu.vim
+< Warning: This deletes all menus that you defined yourself!
+
+ *'langnoremap'* *'lnr'* *'nolangnoremap'* *'nolnr'*
+'langnoremap' 'lnr' boolean (default off, set in |defaults.vim|)
+ global
+ {only available when compiled with the |+langmap|
+ feature}
+ This is just like 'langremap' but with the value inverted. It only
+ exists for backwards compatibility. When setting 'langremap' then
+ 'langnoremap' is set to the inverted value, and the other way around.
+
+ *'langremap'* *'lrm'* *'nolangremap'* *'nolrm'*
+'langremap' 'lrm' boolean (default on, set to off in |defaults.vim|)
+ global
+ {only available when compiled with the |+langmap|
+ feature}
+ When off, setting 'langmap' does not apply to characters resulting from
+ a mapping. This basically means, if you noticed that setting
+ 'langmap' disables some of your mappings, try resetting this option.
+ This option defaults to on for backwards compatibility. Set it off if
+ that works for you to avoid mappings to break.
+
+ *'laststatus'* *'ls'*
+'laststatus' 'ls' number (default 1)
+ global
+ The value of this option influences when the last window will have a
+ status line:
+ 0: never
+ 1: only if there are at least two windows
+ 2: always
+ The screen looks nicer with a status line if you have several
+ windows, but it takes another screen line. |status-line|
+
+ *'lazyredraw'* *'lz'* *'nolazyredraw'* *'nolz'*
+'lazyredraw' 'lz' boolean (default off)
+ global
+ When this option is set, the screen will not be redrawn while
+ executing macros, registers and other commands that have not been
+ typed. Also, updating the window title is postponed. To force an
+ update use |:redraw|.
+ This may occasionally cause display errors. It is only meant to be set
+ temporarily when performing an operation where redrawing may cause
+ flickering or cause a slow down.
+
+ *'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,
+ it only affects the way the file is displayed, not its contents.
+ If 'breakindent' is set, line is visually indented. Then, the value
+ of 'showbreak' is used to put in front of wrapped lines. This option
+ is not used when the 'wrap' option is off.
+ Note that <Tab> characters after an <EOL> are mostly not displayed
+ with the right amount of white space.
+
+ *'lines'* *E593*
+'lines' number (default 24 or terminal height)
+ global
+ Number of lines of the Vim window.
+ Normally you don't need to set this. It is done automatically by the
+ terminal initialization code. Also see |posix-screen-size|.
+ When Vim is running in the GUI or in a resizable window, setting this
+ option will cause the window size to be changed. When you only want
+ to use the size for the GUI, put the command in your |gvimrc| file.
+ Vim limits the number of lines to what fits on the screen. You can
+ use this command to get the tallest window possible: >
+ :set lines=999
+< Minimum value is 2, maximum value is 1000.
+ If you get fewer 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)
+ global
+ {only in the GUI}
+ Number of pixel lines inserted between characters. Useful if the font
+ uses the full character cell height, making lines touch each other.
+ When non-zero there is room for underlining.
+ With some fonts there can be too much room between lines (to have
+ space for ascents and descents). Then it makes sense to set
+ 'linespace' to a negative value. This may cause display problems
+ though!
+
+ *'lisp'* *'nolisp'*
+'lisp' boolean (default off)
+ local to buffer
+ 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'
+ flag in 'cpoptions' changes the method of indenting: Vi compatible or
+ better. Also see 'lispwords'.
+ The '-' character is included in keyword characters. Redefines the
+ "=" operator to use this same indentation algorithm rather than
+ calling an external program if 'equalprg' is empty.
+ This option is not used when 'paste' is set.
+
+ *'lispoptions'* *'lop'*
+'lispoptions' 'lop' string (default "")
+ local to buffer
+ Comma-separated list of items that influence the Lisp indenting when
+ enabled with the |'lisp'| option. Currently only one item is
+ supported:
+ expr:1 use 'indentexpr' for Lisp indenting when it is set
+ expr:0 do not use 'indentexpr' for Lisp indenting (default)
+ Note that when using 'indentexpr' the `=` operator indents all the
+ lines, otherwise the first line is not indented (Vi-compatible).
+
+ *'lispwords'* *'lw'*
+'lispwords' 'lw' string (default is very long)
+ global or local to buffer |global-local|
+ Comma-separated list of words that influence the Lisp indenting when
+ enabled with the |'lisp'| option.
+
+ *'list'* *'nolist'*
+'list' boolean (default off)
+ local to window
+ List mode: By default show tabs as CTRL-I is displayed, display $
+ after end of line. Useful to see the difference between tabs and
+ spaces and for trailing blanks. Further changed by the 'listchars'
+ option.
+
+ The cursor is displayed at the start of the space a Tab character
+ occupies, not at the end as usual in Normal mode. To get this cursor
+ position while displaying Tabs with spaces, use: >
+ :set list lcs=tab:\ \
+<
+ Note that list mode will also affect formatting (set with 'textwidth'
+ or 'wrapmargin') when 'cpoptions' includes 'L'. See 'listchars' for
+ changing the way tabs are displayed.
+
+ *'listchars'* *'lcs'*
+'listchars' 'lcs' string (default "eol:$")
+ global or local to window |global-local|
+ 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
+ line.
+ *lcs-tab*
+ tab:xy[z] Two or three characters to be used to show a tab.
+ The third character is optional.
+
+ tab:xy The 'x' is always used, then 'y' as many times as will
+ fit. Thus "tab:>-" displays:
+ >
+ >-
+ >--
+ etc.
+
+ tab:xyz The 'z' is always used, then 'x' is prepended, and
+ then 'y' is used as many times as will fit. Thus
+ "tab:<->" displays:
+ >
+ <>
+ <->
+ <-->
+ etc.
+
+ When "tab:" is omitted, a tab is shown as ^I.
+ *lcs-space*
+ space:c Character to show for a space. When omitted, spaces
+ are left blank.
+ *lcs-multispace*
+ multispace:c...
+ One or more characters to use cyclically to show for
+ multiple consecutive spaces. Overrides the "space"
+ setting, except for single spaces. When omitted, the
+ "space" setting is used. For example,
+ `:set listchars=multispace:---+` shows ten consecutive
+ spaces as:
+ ---+---+-- ~
+ *lcs-lead*
+ lead:c Character to show for leading spaces. When omitted,
+ leading spaces are blank. Overrides the "space" and
+ "multispace" settings for leading spaces. You can
+ combine it with "tab:", for example: >
+ :set listchars+=tab:>-,lead:.
+< *lcs-leadmultispace*
+ leadmultispace:c...
+ Like the |lcs-multispace| value, but for leading
+ spaces only. Also overrides |lcs-lead| for leading
+ multiple spaces.
+ `:set listchars=leadmultispace:---+` shows ten
+ consecutive leading spaces as:
+ ---+---+--XXX ~
+ Where "XXX" denotes the first non-blank characters in
+ the line.
+ *lcs-trail*
+ trail:c Character to show for trailing spaces. When omitted,
+ trailing spaces are blank. Overrides the "space" and
+ "multispace" settings for trailing spaces.
+ *lcs-extends*
+ extends:c Character to show in the last column, when 'wrap' is
+ off and the line continues beyond the right of the
+ screen.
+ *lcs-precedes*
+ precedes:c Character to show in the first visible column of the
+ physical line, when there is text preceding the
+ character visible in the first column.
+ *lcs-conceal*
+ conceal:c Character to show in place of concealed text, when
+ 'conceallevel' is set to 1.
+ *lcs-nbsp*
+ nbsp:c Character to show for a non-breakable space character
+ (0xA0 (160 decimal) and U+202F). Left blank when
+ 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.
+
+ Each character can be specified as hex: >
+ set listchars=eol:\\x24
+ set listchars=eol:\\u21b5
+ set listchars=eol:\\U000021b5
+< Note that a double backslash is used. The number of hex characters
+ must be exactly 2 for \\x, 4 for \\u and 8 for \\U.
+
+ 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" will be used for "tab", "nbsp", "space",
+ "multispace", "lead" and "trail".
+ |hl-NonText| |hl-SpecialKey|
+
+ *'lpl'* *'nolpl'* *'loadplugins'* *'noloadplugins'*
+'loadplugins' 'lpl' boolean (default on)
+ global
+ When on the plugin scripts are loaded when starting up |load-plugins|.
+ This option can be reset in your |vimrc| file to disable the loading
+ of plugins.
+ Note that using the "-u NONE", "-u DEFAULTS" and "--noplugin" command
+ line arguments reset this option. See |-u| and |--noplugin|.
+
+ *'luadll'*
+'luadll' string (default depends on the build)
+ global
+ {only available when compiled with the |+lua/dyn|
+ feature}
+ Specifies the name of the Lua shared library. The default is
+ DYNAMIC_LUA_DLL, which was specified at compile time.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'macatsui'* *'nomacatsui'*
+'macatsui' boolean (default on)
+ global
+ {not supported}
+ No longer supported, as the Mac OS X GUI code was removed.
+
+ *'magic'* *'nomagic'*
+'magic' boolean (default on)
+ global
+ Changes the special characters that can be used in search patterns.
+ See |pattern|.
+ 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|.
+ In |Vim9| script the value of 'magic' is ignored, patterns behave like
+ it is always set.
+
+ *'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.
+ When "##" is included, it is replaced by a number to make the name
+ unique. This makes sure that the ":make" command doesn't overwrite an
+ existing file.
+ NOT used for the ":cf" command. See 'errorfile' for that.
+ Environment variables are expanded |:set_env|.
+ See |option-backslash| about including spaces and backslashes.
+ 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 and set 'encoding'
+ to "utf-8". 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 encoding=utf-8
+ :set makeencoding=char " system locale is used
+<
+ *'makeprg'* *'mp'*
+'makeprg' 'mp' string (default "make", VMS: "MMS")
+ global or local to buffer |global-local|
+ Program to use for the ":make" command. See |:make_makeprg|.
+ This option may contain '%' and '#' characters (see |:_%| and |:_#|),
+ which are expanded to the current and alternate file name. Use |::S|
+ to escape file names in case they contain special characters.
+ Environment variables are expanded |:set_env|. See |option-backslash|
+ about including spaces and backslashes.
+ Note that a '|' must be escaped twice: once for ":set" and once for
+ the interpretation of a command. When you use a filter called
+ "myfilter" do it like this: >
+ :set makeprg=gmake\ \\\|\ myfilter
+< The placeholder "$*" can be given (even multiple times) to specify
+ where the arguments will be included, for example: >
+ :set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}
+< This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'matchpairs'* *'mps'*
+'matchpairs' 'mps' string (default "(:),{:},[:]")
+ local to buffer
+ Characters that form pairs. The |%| command jumps from one to the
+ other.
+ Only character pairs are allowed that are different, thus you cannot
+ jump between two double quotes.
+ The characters must be separated by a colon.
+ The pairs must be separated by a comma. Example for including '<' and
+ '>' (for HTML): >
+ :set mps+=<:>
+
+< A more exotic example, to jump between the '=' and ';' in an
+ assignment, useful for languages like C and Java: >
+ :au FileType c,cpp,java set mps+==:;
+
+< For a more advanced way of using "%", see the matchit.vim plugin in
+ the $VIMRUNTIME/pack/dist/opt/matchit directory. |add-local-help|
+
+ *'matchtime'* *'mat'*
+'matchtime' 'mat' number (default 5)
+ global
+ Tenths of a second to show the matching paren, when 'showmatch' is
+ set. Note that this is not in milliseconds, like other options that
+ set a time. This is to be compatible with Nvi.
+
+ *'maxcombine'* *'mco'*
+'maxcombine' 'mco' number (default 2)
+ global
+ 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|.
+
+ *'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*
+'maxmapdepth' 'mmd' number (default 1000)
+ global
+ Maximum number of times a mapping is done without resulting in a
+ character to be used. This normally catches endless mappings, like
+ ":map x y" with ":map y x". It still does not catch ":map g wg",
+ 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.
+ The value is ignored when 'swapfile' is off.
+ Also see 'maxmemtot'.
+
+ *'maxmempattern'* *'mmp'*
+'maxmempattern' 'mmp' number (default 1000)
+ global
+ Maximum amount of memory (in Kbyte) to use for pattern matching.
+ The maximum value is about 2000000. Use this to work without a limit.
+ *E363*
+ When Vim runs into the limit it gives an error message and mostly
+ behaves like CTRL-C was typed.
+ 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.
+ 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.
+
+ *'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.
+ Buffers with 'swapfile' off still count to the total amount of memory
+ used.
+ Also see 'maxmem'.
+
+ *'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.
+
+ *'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
+ per word depends very much on how similar the words are, that's why
+ this tuning is complicated.
+
+ There are three numbers, separated by commas:
+ {start},{inc},{added}
+
+ For most languages the uncompressed word tree fits in memory. {start}
+ gives the amount of memory in Kbyte that can be used before any
+ compression is done. It should be a bit smaller than the amount of
+ memory that is available to Vim.
+
+ When going over the {start} limit the {inc} number specifies the
+ amount of memory in Kbyte that can be allocated before another
+ compression is done. A low number means compression is done after
+ less words are added, which is slow. A high number means more memory
+ will be allocated.
+
+ After doing compression, {added} times 1024 words can be added before
+ the {inc} limit is ignored and compression is done when any extra
+ amount of memory is needed. A low number means there is a smaller
+ chance of hitting the {inc} limit, less memory is used but it's
+ slower.
+
+ The languages for which these numbers are important are Italian and
+ Hungarian. The default works for when you have about 512 Mbyte. If
+ you have 1 Gbyte you could use: >
+ :set mkspellmem=900000,3000,800
+< If you have less than 512 Mbyte |:mkspell| may fail for some
+ languages, no matter what you set 'mkspellmem' to.
+
+ This option cannot be set from a |modeline| or in the |sandbox|.
+
+ *'modeline'* *'ml'* *'nomodeline'* *'noml'*
+'modeline' 'ml' boolean (Vim default: on (off for root),
+ Vi default: off)
+ local to buffer
+ If 'modeline' is on 'modelines' gives the number of lines that is
+ checked for set commands. If 'modeline' is off or 'modelines' is zero
+ no lines are checked. See |modeline|.
+
+ *'modelineexpr'* *'mle'* *'nomodelineexpr'* *'nomle'*
+'modelineexpr' 'mle' boolean (default: off)
+ global
+ When on allow some options that are an expression to be set in the
+ modeline. Check the option for whether it is affected by
+ 'modelineexpr'. Also see |modeline|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'modelines'* *'mls'*
+'modelines' 'mls' number (default 5)
+ global
+ If 'modeline' is on 'modelines' gives the number of lines that is
+ checked for set commands. If 'modeline' is off or 'modelines' is zero
+ no lines are checked. See |modeline|.
+ NOTE: 'modeline' is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'modifiable'* *'ma'* *'nomodifiable'* *'noma'*
+ *E21*
+'modifiable' 'ma' boolean (default on)
+ local to buffer
+ When off the buffer contents cannot be changed. The 'fileformat' and
+ 'fileencoding' options also can't be changed.
+ Can be reset on startup with the |-M| command line argument.
+
+ *'modified'* *'mod'* *'nomodified'* *'nomod'*
+'modified' 'mod' boolean (default off)
+ local to buffer
+ When on, the buffer is considered to be modified. This option is set
+ when:
+ 1. A change was made to the text since it was last written. Using the
+ |undo| command to go back to the original text will reset the
+ option. But undoing changes that were made before writing the
+ buffer will set the option again, since the text is different from
+ when it was written.
+ 2. 'fileformat' or 'fileencoding' is different from its original
+ value. The original value is set when the buffer is read or
+ written. A ":set nomodified" command also resets the original
+ values to the current values and the 'modified' option will be
+ reset.
+ Similarly for 'eol' and 'bomb'.
+ This option is not set when a change is made to the buffer as the
+ result of a BufNewFile, BufRead/BufReadPost, BufWritePost,
+ FileAppendPost or VimLeave autocommand event. See |gzip-example| for
+ 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)
+ global
+ When on, listings pause when the whole screen is filled. You will get
+ the |more-prompt|. When this option is off there are no pauses, the
+ listing continues until finished.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'mouse'*
+'mouse' string (default "", "a" for GUI and Win32,
+ set to "a" or "nvi" in |defaults.vim|)
+ global
+ Enable the use of the mouse. Works for most terminals (xterm, Win32
+ |win32-mouse|, QNX pterm, *BSD console with sysmouse and Linux console
+ with gpm). For using the mouse in the GUI, see |gui-mouse|. The
+ mouse can be enabled for different modes:
+ n Normal mode and Terminal modes
+ v Visual mode
+ i Insert mode
+ c Command-line mode
+ 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 five modes with: >
+ :set mouse=a
+< If your terminal can't overrule the mouse events going to the
+ application, use: >
+ :set mouse=nvi
+< Then you can press ":", select text for the system, and press Esc to go
+ back to Vim using the mouse events.
+ In |defaults.vim| "nvi" is used if the 'term' option is not matching
+ "xterm".
+
+ 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'|.
+
+ 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.
+
+ *'mousefocus'* *'mousef'* *'nomousefocus'* *'nomousef'*
+'mousefocus' 'mousef' boolean (default off)
+ global
+ {only works in the GUI}
+ The window that the mouse pointer is on is automatically activated.
+ When changing the window layout or window focus in another way, the
+ mouse pointer is moved to the window with keyboard focus. Off is the
+ default because it makes using the pull down menus a little goofy, as
+ a pointer transit may activate a window unintentionally.
+ MS-Windows: Also see 'scrollfocus' for what window is scrolled when
+ using the mouse scroll wheel.
+
+ *'mousehide'* *'mh'* *'nomousehide'* *'nomh'*
+'mousehide' 'mh' boolean (default on)
+ global
+ {only works in the GUI}
+ When on, the mouse pointer is hidden when characters are typed.
+ The mouse pointer is restored when the mouse is moved.
+
+ *'mousemodel'* *'mousem'*
+'mousemodel' 'mousem' string (default "extend", "popup" for Win32)
+ global
+ Sets the model to use for the mouse. The name mostly specifies what
+ the right mouse button is used for:
+ extend Right mouse button extends a selection. This works
+ like in an xterm.
+ popup Right mouse button pops up a menu. The shifted left
+ mouse button extends a selection. This works like
+ with Microsoft Windows.
+ popup_setpos Like "popup", but the cursor will be moved to the
+ position where the mouse was clicked, and thus the
+ selected operation will act upon the clicked object.
+ If clicking inside a selection, that selection will
+ be acted upon, i.e. no cursor move. This implies of
+ course, that right clicking outside a selection will
+ end Visual mode.
+ Overview of what button does what for each model:
+ mouse extend popup(_setpos) ~
+ left click place cursor place cursor
+ left drag start selection start selection
+ shift-left search word extend selection
+ right click extend selection popup menu (place cursor)
+ right drag extend selection -
+ middle click paste paste
+
+ In the "popup" model the right mouse button produces a pop-up menu.
+ You need to define this first, see |popup-menu|.
+
+ 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).
+
+ The 'mousemodel' option is set by the |:behave| command.
+
+ *'mousemoveevent'* *'mousemev'* *'nomousemoveevent'* *'nomousemev'*
+'mousemoveevent' 'mousemev' boolean (default off)
+ global
+ {only works in the GUI}
+ When on, mouse move events are delivered to the input queue and are
+ available for mapping. The default, off, avoids the mouse movement
+ overhead except when needed. See |gui-mouse-mapping|.
+ Warning: Setting this option can make pending mappings to be aborted
+ when the mouse is moved.
+ Currently only works in the GUI, may be made to work in a terminal
+ later.
+
+ *'mouseshape'* *'mouses'* *E547*
+'mouseshape' 'mouses' string (default "i-r:beam,s:updown,sd:udsizing,
+ vs:leftright,vd:lrsizing,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
+ and an argument-list:
+ mode-list:shape,mode-list:shape,..
+ The mode-list is a dash separated list of these modes/locations:
+ In a normal window: ~
+ n Normal mode
+ v Visual mode
+ ve Visual mode with 'selection' "exclusive" (same as 'v',
+ if not specified)
+ o Operator-pending mode
+ i Insert mode
+ r Replace mode
+
+ Others: ~
+ c appending to the command-line
+ ci inserting in the command-line
+ cr replacing in the command-line
+ m at the 'Hit ENTER' or 'More' prompts
+ ml idem, but cursor in the last line
+ e any mode, pointer below last window
+ s any mode, pointer on a status line
+ sd any mode, while dragging a status line
+ vs any mode, pointer on a vertical separator line
+ vd any mode, while dragging a vertical separator line
+ a everywhere
+
+ The shape is one of the following:
+ avail name looks like ~
+ w x arrow Normal mouse pointer
+ w x blank no pointer at all (use with care!)
+ w x beam I-beam
+ w x updown up-down sizing arrows
+ w x leftright left-right sizing arrows
+ w x busy The system's usual busy pointer
+ w x no The system's usual 'no input' pointer
+ x udsizing indicates up-down resizing
+ x lrsizing indicates left-right resizing
+ x crosshair like a big thin +
+ x hand1 black hand
+ x hand2 white hand
+ x pencil what you write with
+ x question big ?
+ x rightup-arrow arrow pointing right-up
+ w x up-arrow arrow pointing up
+ x <number> any X11 pointer number (see X11/cursorfont.h)
+
+ The "avail" column contains a 'w' if the shape is available for Win32,
+ x for X11.
+ Any modes not specified or shapes not available use the normal mouse
+ pointer.
+
+ Example: >
+ :set mouseshape=s:udsizing,m:no
+< will make the mouse turn to a sizing arrow over the status lines and
+ indicate no input when the hit-enter prompt is displayed (since
+ clicking the mouse has no effect in this state.)
+
+ *'mousetime'* *'mouset'*
+'mousetime' 'mouset' number (default 500)
+ global
+ Only for GUI, Win32 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.
+
+ *'mzschemedll'*
+'mzschemedll' string (default depends on the build)
+ global
+ {only available when compiled with the |+mzscheme/dyn|
+ feature}
+ Specifies the name of the MzScheme shared library. The default is
+ DYNAMIC_MZSCH_DLL which was specified at compile time.
+ Environment variables are expanded |:set_env|.
+ The value must be set in the |vimrc| script or earlier. In the
+ startup, before the |load-plugins| step.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'mzschemegcdll'*
+'mzschemegcdll' string (default depends on the build)
+ global
+ {only available when compiled with the |+mzscheme/dyn|
+ feature}
+ Specifies the name of the MzScheme GC shared library. The default is
+ DYNAMIC_MZGC_DLL which was specified at compile time.
+ The value can be equal to 'mzschemedll' if it includes the GC code.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'mzquantum'* *'mzq'*
+'mzquantum' 'mzq' number (default 100)
+ global
+ {not available when compiled without the |+mzscheme|
+ feature}
+ The number of milliseconds between polls for MzScheme threads.
+ Negative or zero value means no thread scheduling.
+ NOTE: This option is set to the Vim default value when 'compatible'
+ is reset.
+
+ *'nrformats'* *'nf'*
+'nrformats' 'nf' string (default "bin,octal,hex",
+ set to "bin,hex" in |defaults.vim|)
+ local to buffer
+ This defines what bases Vim will consider for numbers when using the
+ CTRL-A and CTRL-X commands for adding to and subtracting from a number
+ 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*
+ 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
+ considered to be hexadecimal. Example: Using CTRL-X on
+ "0x100" results in "0x0ff".
+ bin If included, numbers starting with "0b" or "0B" will be
+ considered to be binary. Example: Using CTRL-X on
+ "0b1000" subtracts one, resulting in "0b0111".
+ unsigned If included, numbers are recognized as unsigned. Thus a
+ leading dash or negative sign won't be considered as part of
+ the number. Examples:
+ Using CTRL-X on "2020" in "9-2020" results in "9-2019"
+ (without "unsigned" it would become "9-2021").
+ Using CTRL-A on "2020" in "9-2020" results in "9-2021"
+ (without "unsigned" it would become "9-2019").
+ Using CTRL-X on "0" or CTRL-A on "18446744073709551615"
+ (2^64 - 1) has no effect, overflow is prevented.
+ Numbers which simply begin with a digit in the range 1-9 are always
+ considered decimal. This also happens for numbers that are not
+ recognized as octal or hex.
+
+ *'number'* *'nu'* *'nonumber'* *'nonu'*
+'number' 'nu' boolean (default off)
+ local to window
+ 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 (this is the default when 'compatible' isn't set).
+ The 'numberwidth' option can be used to set the room used for the line
+ number.
+ When a long, wrapped line doesn't start with the first character, '-'
+ characters are put before the number.
+ For highlighting see |hl-LineNr|, and |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'
+ 'nornu' 'nornu' 'rnu' 'rnu'
+
+ |apple | 1 apple | 2 apple | 2 apple
+ |pear | 2 pear | 1 pear | 1 pear
+ |nobody | 3 nobody | 0 nobody |3 nobody
+ |there | 4 there | 1 there | 1 there
+
+ *'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
+ the text, there is one less character for the number itself.
+ The value is the minimum width. A bigger width is used when needed to
+ fit the highest line number in the buffer respectively the number of
+ rows in the window, depending on whether 'number' or 'relativenumber'
+ is set. Thus with the Vim default of 4 there is room for a line number
+ up to 999. When the buffer has 1000 lines five columns will be used.
+ The minimum value is 1, the maximum value is 20.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'omnifunc'* *'ofu'*
+'omnifunc' 'ofu' string (default: empty)
+ local to buffer
+ {not available when compiled without the |+eval|
+ feature}
+ 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
+ invoked and what it should return. The value can be the name of a
+ function, a |lambda| or a |Funcref|. See |option-value-function| for
+ more information.
+ This option is usually set by a filetype plugin:
+ |:filetype-plugin-on|
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+
+ *'opendevice'* *'odev'* *'noopendevice'* *'noodev'*
+'opendevice' 'odev' boolean (default off)
+ global
+ {only for MS-Windows} *E796*
+ Enable reading and writing from devices. This may get Vim stuck on a
+ device that can be opened but doesn't actually do the I/O. Therefore
+ it is off by default.
+ Note that on MS-Windows editing "aux.h", "lpt1.txt" and the like also
+ result in editing a device.
+
+
+ *'operatorfunc'* *'opfunc'*
+'operatorfunc' 'opfunc' string (default: empty)
+ global
+ This option specifies a function to be called by the |g@| operator.
+ See |:map-operator| for more info and an example. The value can be
+ the name of a function, a |lambda| or a |Funcref|. See
+ |option-value-function| for more information.
+
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+
+ *'osfiletype'* *'oft'*
+'osfiletype' 'oft' string (default: "")
+ local to buffer
+ This option was supported on RISC OS, which has been removed.
+
+
+ *'packpath'* *'pp'*
+'packpath' 'pp' string (default: see 'runtimepath')
+ Directories used to find packages. See |packages|.
+
+
+ *'paragraphs'* *'para'*
+'paragraphs' 'para' string (default "IPLPPPQPP TPHPLIPpLpItpplpipbp")
+ global
+ Specifies the nroff macros that separate paragraphs. These are pairs
+ of two letters (see |object-motions|).
+
+ *'paste'* *'nopaste'*
+'paste' boolean (default off)
+ global
+ 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
+ unexpected effects.
+ Setting this option is useful when using Vim in a terminal, where Vim
+ cannot distinguish between typed text and pasted text. In the GUI, Vim
+ knows about pasting and will mostly do the right thing without 'paste'
+ being set. The same is true for a terminal where Vim handles the
+ mouse clicks itself.
+ This option is reset when starting the GUI. Thus if you set it in
+ your .vimrc it will work in a terminal, but not in the GUI. Setting
+ 'paste' in the GUI has side effects: e.g., the Paste toolbar button
+ will no longer work in Insert mode, because it uses a mapping.
+ When the 'paste' option is switched on (also when it was already on):
+ - mapping in Insert mode and Command-line mode is disabled
+ - abbreviations are disabled
+ - 'autoindent' is reset
+ - 'expandtab' is reset
+ - 'hkmap' is reset
+ - 'revins' is reset
+ - 'ruler' is reset
+ - 'showmatch' is reset
+ - 'smarttab' is reset
+ - 'softtabstop' is set to 0
+ - 'textwidth' is set to 0
+ - 'wrapmargin' is set to 0
+ - 'varsofttabstop' is made empty
+ These options keep their value, but their effect is disabled:
+ - 'cindent'
+ - 'formatoptions' is used like it is empty
+ - 'indentexpr'
+ - 'lisp'
+ - 'smartindent'
+ NOTE: When you start editing another file while the 'paste' option is
+ on, settings from the modelines or autocommands may change the
+ settings again, causing trouble when pasting text. You might want to
+ set the 'paste' option again.
+ When the 'paste' option is reset the mentioned options are restored to
+ the value before the moment 'paste' was switched from off to on.
+ Resetting 'paste' before ever setting it does not have any effect.
+ Since mapping doesn't work while 'paste' is active, you need to use
+ the 'pastetoggle' option to toggle the 'paste' option with some key.
+
+ *'pastetoggle'* *'pt'*
+'pastetoggle' 'pt' string (default "")
+ global
+ When non-empty, specifies the key sequence that toggles the 'paste'
+ option. This is like specifying a mapping: >
+ :map {keys} :set invpaste<CR>
+< Where {keys} is the value of 'pastetoggle'.
+ The difference is that it will work even when 'paste' is set.
+ 'pastetoggle' works in Insert mode and Normal mode, but not in
+ Command-line mode.
+ Mappings are checked first, thus overrule 'pastetoggle'. However,
+ when 'paste' is on mappings are ignored in Insert mode, thus you can do
+ this: >
+ :map <F10> :set paste<CR>
+ :map <F11> :set nopaste<CR>
+ :imap <F10> <C-O>:set paste<CR>
+ :imap <F11> <nop>
+ :set pastetoggle=<F11>
+< This will make <F10> start paste mode and <F11> stop paste mode.
+ 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.
+
+ *'pex'* *'patchexpr'*
+'patchexpr' 'pex' string (default "")
+ global
+ {not available when compiled without the |+diff|
+ feature}
+ Expression which is evaluated to apply a patch to a file and generate
+ the resulting new version of the file. See |diff-patchexpr|.
+
+ *'patchmode'* *'pm'* *E205* *E206*
+'patchmode' 'pm' string (default "")
+ global
+ When non-empty the oldest version of a file is kept. This can be used
+ to keep the original version of a file if you are changing files in a
+ source distribution. Only the first time that a file is written a
+ 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
+ ".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
+ recognized as a compressed file.
+ Only normal file name characters can be used, "/\*?[|<>" are illegal.
+
+ *'path'* *'pa'* *E343* *E345* *E347* *E854*
+'path' 'pa' string (default on Unix: ".,/usr/include,,"
+ other systems: ".,,")
+ global or local to buffer |global-local|
+ This is a list of directories which will be searched when using the
+ |gf|, [f, ]f, ^Wf, |:find|, |:sfind|, |:tabfind| and other commands,
+ provided that the file being searched for has a relative path (not
+ starting with "/", "./" or "../"). The directories in the 'path'
+ option may be relative or absolute.
+ - Use commas to separate directory names: >
+ :set path=.,/usr/local/include,/usr/include
+< - Spaces can also be used to separate directory names (for backwards
+ compatibility with version 3.0). To have a space in a directory
+ name, precede it with an extra backslash, and escape the space: >
+ :set path=.,/dir/with\\\ space
+< - To include a comma in a directory name precede it with an extra
+ backslash: >
+ :set path=.,/dir/with\\,comma
+< - To search relative to the directory of the current file, use: >
+ :set path=.
+< - To search in the current directory use an empty string between two
+ commas: >
+ :set path=,,
+< - A directory name may end in a ':' or '/'.
+ - Environment variables are expanded |:set_env|.
+ - When using |netrw.vim| URLs can be used. For example, adding
+ "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.
+ - Careful with '\' characters, type two to get one in the option: >
+ :set path=.,c:\\include
+< Or just use '/' instead: >
+ :set path=.,c:/include
+< Don't forget "." or files won't even be found in the same directory as
+ the file!
+ The maximum length is limited. How much depends on the system, mostly
+ it is something like 256 or 1024 characters.
+ You can check if all the include files are found, using the value of
+ 'path', see |:checkpath|.
+ The use of |:set+=| and |:set-=| is preferred when adding or removing
+ directories from the list. This avoids problems when a future version
+ uses another default. To remove the current directory use: >
+ :set path-=
+< To add the current directory use: >
+ :set path+=
+< To use an environment variable, you probably need to replace the
+ separator. Here is an example to append $INCL, in which directory
+ names are separated with a semi-colon: >
+ :let &path = &path .. "," .. substitute($INCL, ';', ',', 'g')
+< Replace the ';' with a ':' or whatever separator is used. Note that
+ this doesn't work when $INCL contains a comma or white space.
+
+ *'perldll'*
+'perldll' string (default depends on the build)
+ global
+ {only available when compiled with the |+perl/dyn|
+ feature}
+ Specifies the name of the Perl shared library. The default is
+ DYNAMIC_PERL_DLL, which was specified at compile time.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'preserveindent'* *'pi'* *'nopreserveindent'* *'nopi'*
+'preserveindent' 'pi' boolean (default off)
+ local to buffer
+ When changing the indent of the current line, preserve as much of the
+ indent structure as possible. Normally the indent is replaced by a
+ series of tabs followed by spaces as required (unless |'expandtab'| is
+ enabled, in which case only spaces are used). Enabling this option
+ means the indent will preserve as many existing characters as possible
+ for indenting, and only add additional tabs or spaces as required.
+ 'expandtab' does not apply to the preserved white space, a Tab remains
+ a Tab.
+ NOTE: When using ">>" multiple times the resulting indent is a mix of
+ tabs and spaces. You might not like this.
+ NOTE: This option is reset when 'compatible' is set.
+ Also see 'copyindent'.
+ Use |:retab| to clean up white space.
+
+ *'previewheight'* *'pvh'*
+'previewheight' 'pvh' number (default 12)
+ global
+ {not available when compiled without the |+quickfix|
+ feature}
+ Default height for a preview window. Used for |:ptag| and associated
+ commands. Used for |CTRL-W_}| when no count is given. Not used when
+ 'previewpopup' is set.
+
+ *'previewpopup'* *'pvp'*
+'previewpopup' 'pvp' string (default empty)
+ global
+ {not available when compiled without the |+textprop|
+ or |+quickfix| feature}
+ When not empty a popup window is used for commands that would open a
+ preview window. See |preview-popup|.
+ Not used for the insert completion info, add "popup" to
+ 'completeopt' for that.
+
+ *'previewwindow'* *'nopreviewwindow'*
+ *'pvw'* *'nopvw'* *E590*
+'previewwindow' 'pvw' boolean (default off)
+ local to window
+ {not available when compiled without the |+quickfix|
+ feature}
+ 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.
+
+ *'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)
+ 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)
+ 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|
+ and |+postscript| 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|
+ and |+postscript| 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|.
+
+ *'prompt'* *'noprompt'*
+'prompt' boolean (default on)
+ global
+ When on a ":" prompt is used in Ex mode.
+
+ *'pumheight'* *'ph'*
+'pumheight' 'ph' number (default 0)
+ global
+ 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|.
+
+ *'pumwidth'* *'pw'*
+'pumwidth' 'pw' number (default 15)
+ global
+ Determines the minimum width to use for the popup menu for Insert mode
+ completion. |ins-completion-menu|.
+
+ *'pythondll'*
+'pythondll' string (default depends on the build)
+ global
+ {only available when compiled with the |+python/dyn|
+ feature}
+ Specifies the name of the Python 2.x shared library. The default is
+ DYNAMIC_PYTHON_DLL, which was specified at compile time.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'pythonhome'*
+'pythonhome' string (default "")
+ global
+ {only available when compiled with the |+python/dyn|
+ feature}
+ Specifies the name of the Python 2.x home directory. When 'pythonhome'
+ and the PYTHONHOME environment variable are not set, PYTHON_HOME,
+ which was specified at compile time, will be used for the Python 2.x
+ home directory.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'pythonthreedll'*
+'pythonthreedll' string (default depends on the build)
+ global
+ {only available when compiled with the |+python3/dyn|
+ feature}
+ Specifies the name of the Python 3 shared library. The default is
+ DYNAMIC_PYTHON3_DLL, which was specified at compile time.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'pythonthreehome'*
+'pythonthreehome' string (default "")
+ global
+ {only available when compiled with the |+python3/dyn|
+ feature}
+ Specifies the name of the Python 3 home directory. When
+ 'pythonthreehome' and the PYTHONHOME environment variable are not set,
+ PYTHON3_HOME, which was specified at compile time, will be used for
+ the Python 3 home directory.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'pyxversion'* *'pyx'*
+'pyxversion' 'pyx' number (default depends on the build)
+ global
+ {only available when compiled with the |+python| or
+ the |+python3| feature}
+ Specifies the python version used for pyx* functions and commands
+ |python_x|. The default value is as follows:
+
+ Compiled with 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 Vim is compiled with only |+python| or |+python3| setting
+ 'pyxversion' has no effect. The pyx* functions and commands are
+ always the same as the compiled version.
+
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'quickfixtextfunc'* *'qftf'*
+'quickfixtextfunc' 'qftf' string (default "")
+ global
+ {only available when compiled with the |+quickfix|
+ feature}
+ This option specifies a function to be used to get the text to display
+ in the quickfix and location list windows. This can be used to
+ customize the information displayed in the quickfix or location window
+ for each entry in the corresponding quickfix or location list. See
+ |quickfix-window-function| for an explanation of how to write the
+ function and an example. The value can be the name of a function, a
+ |lambda| or a |Funcref|. See |option-value-function| for more
+ information.
+
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'quoteescape'* *'qe'*
+'quoteescape' 'qe' string (default "\")
+ local to buffer
+ The characters that are used to escape quotes in a string. Used for
+ objects like a', a" and a` |a'|.
+ When one of the characters in this option is found inside a string,
+ the following character will be skipped. The default value makes the
+ text "foo\"bar\\" considered to be one string.
+
+ *'readonly'* *'ro'* *'noreadonly'* *'noro'*
+'readonly' 'ro' boolean (default off)
+ local to buffer
+ If on, writes fail unless you use a '!'. Protects you from
+ accidentally overwriting a file. Default on when Vim is started
+ in read-only mode ("vim -R") or when the executable is called "view".
+ When using ":w!" the 'readonly' option is reset for the current
+ 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', |:match| highlighting and syntax
+ highlighting.
+ When redrawing takes more than this many milliseconds no further
+ matches will be highlighted.
+ For syntax highlighting the time applies per window. When over the
+ limit syntax highlighting is disabled until |CTRL-L| is used.
+ This is used to avoid that Vim hangs when using a very complicated
+ pattern.
+
+ *'regexpengine'* *'re'*
+'regexpengine' 're' number (default 0)
+ global
+ This selects the default regexp engine. |two-engines|
+ The possible values are:
+ 0 automatic selection
+ 1 old engine
+ 2 NFA engine
+ Note that when using the NFA engine and the pattern contains something
+ that is not supported the pattern will not match. This is only useful
+ for debugging the regexp engine.
+ Using automatic selection enables Vim to switch the engine, if the
+ default engine becomes too costly. E.g., when the NFA engine uses too
+ many states. This should prevent Vim from hanging on a combination of
+ a complex pattern with long text.
+
+ *'relativenumber'* *'rnu'* *'norelativenumber'* *'nornu'*
+'relativenumber' 'rnu' boolean (default off)
+ local to window
+ Show the line number relative to the line with the cursor in front of
+ each line. Relative line numbers help you use the |count| you can
+ precede some vertical motion commands (e.g. j k + -) with, without
+ having to calculate it yourself. Especially useful in combination with
+ other commands (e.g. y d c < > gq gw =).
+ When the 'n' option is excluded from 'cpoptions' a wrapped
+ line will not use the column of line numbers (this is the default when
+ 'compatible' isn't set).
+ The 'numberwidth' option can be used to set the room used 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.
+
+ The number in front of the cursor line also depends on the value of
+ 'number', see |number_relativenumber| for all combinations of the two
+ options.
+
+ *'remap'* *'noremap'*
+'remap' boolean (default on)
+ global
+ Allows for mappings to work recursively. If you do not want this for
+ a single entry, use the :noremap[!] command.
+ NOTE: To avoid portability problems with Vim scripts, always keep
+ this option at the default "on". Only switch it off when working with
+ old Vi scripts.
+
+ *'renderoptions'* *'rop'*
+'renderoptions' 'rop' string (default: empty)
+ global
+ {only available when compiled with GUI and DIRECTX on
+ MS-Windows}
+ Select a text renderer and set its options. The options depend on the
+ renderer.
+
+ Syntax: >
+ set rop=type:{renderer}(,{name}:{value})*
+<
+ Currently, only one optional renderer is available.
+
+ render behavior ~
+ directx Vim will draw text using DirectX (DirectWrite). It makes
+ drawn glyphs more beautiful than default GDI.
+ It requires 'encoding' is "utf-8", and only works on
+ MS-Windows Vista or newer version.
+
+ Options:
+ name meaning type value ~
+ gamma gamma float 1.0 - 2.2 (maybe)
+ contrast enhancedContrast float (unknown)
+ level clearTypeLevel float (unknown)
+ geom pixelGeometry int 0 - 2 (see below)
+ renmode renderingMode int 0 - 6 (see below)
+ taamode textAntialiasMode int 0 - 3 (see below)
+ scrlines Scroll Lines int (deprecated)
+
+ See this URL for detail (except for scrlines):
+ https://msdn.microsoft.com/en-us/library/dd368190.aspx
+
+ For geom: structure of a device pixel.
+ 0 - DWRITE_PIXEL_GEOMETRY_FLAT
+ 1 - DWRITE_PIXEL_GEOMETRY_RGB
+ 2 - DWRITE_PIXEL_GEOMETRY_BGR
+
+ See this URL for detail:
+ https://msdn.microsoft.com/en-us/library/dd368114.aspx
+
+ For renmode: method of rendering glyphs.
+ 0 - DWRITE_RENDERING_MODE_DEFAULT
+ 1 - DWRITE_RENDERING_MODE_ALIASED
+ 2 - DWRITE_RENDERING_MODE_GDI_CLASSIC
+ 3 - DWRITE_RENDERING_MODE_GDI_NATURAL
+ 4 - DWRITE_RENDERING_MODE_NATURAL
+ 5 - DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC
+ 6 - DWRITE_RENDERING_MODE_OUTLINE
+
+ See this URL for detail:
+ https://msdn.microsoft.com/en-us/library/dd368118.aspx
+
+ For taamode: antialiasing mode used for drawing text.
+ 0 - D2D1_TEXT_ANTIALIAS_MODE_DEFAULT
+ 1 - D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE
+ 2 - D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE
+ 3 - D2D1_TEXT_ANTIALIAS_MODE_ALIASED
+
+ See this URL for detail:
+ https://msdn.microsoft.com/en-us/library/dd368170.aspx
+
+ For scrlines:
+ This was used for optimizing scrolling behavior, however this
+ is now deprecated. If specified, it is simply ignored.
+
+ Example: >
+ set encoding=utf-8
+ set gfn=Ricty_Diminished:h12
+ set rop=type:directx
+<
+ If select a raster font (Courier, Terminal or FixedSys which
+ have ".fon" extension in file name) to 'guifont', it will be
+ drawn by GDI as a fallback.
+
+ NOTE: It is known that some fonts and options combination
+ causes trouble on drawing glyphs.
+
+ - 'renmode:5' and 'renmode:6' will not work with some
+ special made fonts (True-Type fonts which includes only
+ bitmap glyphs).
+ - 'taamode:3' will not work with some vector fonts.
+
+ NOTE: With this option, you can display colored emoji
+ (emoticon) in Windows 8.1 or later. To display colored emoji,
+ there are some conditions which you should notice.
+
+ - If your font includes non-colored emoji already, it will
+ be used.
+ - If your font doesn't have emoji, the system chooses an
+ alternative symbol font. On Windows 10, "Segoe UI Emoji"
+ will be used.
+ - When this alternative font didn't have fixed width glyph,
+ emoji might be rendered beyond the bounding box of drawing
+ cell.
+
+ Other render types are currently not supported.
+
+ *'report'*
+'report' number (default 2)
+ global
+ Threshold for reporting number of lines changed. When the number of
+ changed lines is more than 'report' a message will be given for most
+ ":" commands. If you want it always, set 'report' to 0.
+ For the ":substitute" command the number of substitutions is used
+ instead of the number of lines.
+
+ *'restorescreen'* *'rs'* *'norestorescreen'* *'nors'*
+'restorescreen' 'rs' boolean (default on)
+ global
+ {only in MS-Windows console version}
+ When set, the screen contents is restored when exiting Vim. This also
+ happens when executing external commands.
+
+ For non-Windows Vim: You can set or reset the 't_ti' and 't_te'
+ options in your .vimrc. To disable restoring:
+ set t_ti= t_te=
+ To enable restoring (for an xterm):
+ set t_ti=^[7^[[r^[[?47h t_te=^[[?47l^[8
+ (Where ^[ is an <Esc>, type CTRL-V <Esc> to insert it)
+
+ *'revins'* *'ri'* *'norevins'* *'nori'*
+'revins' 'ri' boolean (default off)
+ global
+ {only available when compiled with the |+rightleft|
+ feature}
+ Inserting characters in Insert mode will work backwards. See "typing
+ backwards" |ins-reverse|. This option can be toggled with the CTRL-_
+ command in Insert mode, when 'allowrevins' is set.
+ NOTE: This option is reset when 'compatible' is set.
+ This option is reset when 'paste' is set and restored when 'paste' is
+ reset.
+
+ *'rightleft'* *'rl'* *'norightleft'* *'norl'*
+'rightleft' 'rl' boolean (default off)
+ local to window
+ {only available when compiled with the |+rightleft|
+ feature}
+ When on, display orientation becomes right-to-left, i.e., characters
+ that are stored in the file appear from the right to the left.
+ Using this option, it is possible to edit files for languages that
+ are written from the right to the left such as Hebrew and Arabic.
+ This option is per window, so it is possible to edit mixed files
+ simultaneously, or to view the same file in both ways (this is
+ useful whenever you have a mixed text file with both right-to-left
+ and left-to-right strings so that both sets are displayed properly
+ in different windows). Also see |rileft.txt|.
+
+ *'rightleftcmd'* *'rlc'*
+'rightleftcmd' 'rlc' string (default "search")
+ local to window
+ {only available when compiled with the |+rightleft|
+ feature}
+ Each word in this option enables the command line editing to work in
+ right-to-left mode for a group of commands:
+
+ search "/" and "?" commands
+
+ This is useful for languages such as Hebrew, Arabic and Farsi.
+ The 'rightleft' option must be set for 'rightleftcmd' to take effect.
+
+ *'rubydll'*
+'rubydll' string (default: depends on the build)
+ global
+ {only available when compiled with the |+ruby/dyn|
+ feature}
+ Specifies the name of the Ruby shared library. The default is
+ DYNAMIC_RUBY_DLL, which was specified at compile time.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'ruler'* *'ru'* *'noruler'* *'noru'*
+'ruler' 'ru' boolean (default off, set in |defaults.vim|)
+ global
+ 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:
+ Top first line is visible
+ Bot last line is visible
+ All first and last line are visible
+ 45% relative position in the file
+ If 'rulerformat' is set, it will determine the contents of the ruler.
+ Each window has its own ruler. If a window has a status line, the
+ ruler is shown there. Otherwise it is shown in the last line of the
+ screen. If the statusline is given by 'statusline' (i.e. not empty),
+ this option takes precedence over 'ruler' and 'rulerformat'.
+ If the number of characters displayed is different from the number of
+ bytes in the text (e.g., for a TAB or a multibyte character), both
+ the text column (byte number) and the screen column are shown,
+ separated with a dash.
+ For an empty line "0-1" is shown.
+ For an empty buffer the line number will also be zero: "0,0-1".
+ This option is reset when 'paste' is set and restored when 'paste' is
+ reset.
+ If you don't want to see the ruler all the time but want to know where
+ you are, use "g CTRL-G" |g_CTRL-G|.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'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'.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+
+ The default ruler width is 17 characters. To make the ruler 15
+ characters wide, put "%15(" at the start and "%)" at the end.
+ Example: >
+ :set rulerformat=%15(%c%V\ %p%%%)
+<
+ *'runtimepath'* *'rtp'* *vimfiles*
+'runtimepath' 'rtp' string (default:
+ Unix: "$HOME/.vim,
+ $VIM/vimfiles,
+ $VIMRUNTIME,
+ $VIM/vimfiles/after,
+ $HOME/.vim/after"
+ Amiga: "home:vimfiles,
+ $VIM/vimfiles,
+ $VIMRUNTIME,
+ $VIM/vimfiles/after,
+ home:vimfiles/after"
+ MS-Windows: "$HOME/vimfiles,
+ $VIM/vimfiles,
+ $VIMRUNTIME,
+ $VIM/vimfiles/after,
+ $HOME/vimfiles/after"
+ macOS: "$VIM:vimfiles,
+ $VIMRUNTIME,
+ $VIM:vimfiles:after"
+ Haiku: "$BE_USER_SETTINGS/vim,
+ $VIM/vimfiles,
+ $VIMRUNTIME,
+ $VIM/vimfiles/after,
+ $BE_USER_SETTINGS/vim/after"
+ VMS: "sys$login:vimfiles,
+ $VIM/vimfiles,
+ $VIMRUNTIME,
+ $VIM/vimfiles/after,
+ sys$login:vimfiles/after")
+ global
+ This is a list of directories which will be searched for runtime
+ files:
+ filetype.vim filetypes by file name |new-filetype|
+ scripts.vim filetypes by file contents |new-filetype-scripts|
+ autoload/ automatically loaded scripts |autoload-functions|
+ colors/ color scheme files |:colorscheme|
+ compiler/ compiler files |:compiler|
+ doc/ documentation |write-local-help|
+ ftplugin/ filetype plugins |write-filetype-plugin|
+ import/ files that are found by `:import`
+ indent/ indent scripts |indent-expression|
+ 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|
+ syntax/ syntax files |mysyntaxfile|
+ tutor/ files for vimtutor |tutor|
+
+ And any other file searched for with the |:runtime| command.
+
+ The defaults for most systems are setup to search five locations:
+ 1. In your home directory, for your personal preferences.
+ 2. In a system-wide Vim directory, for preferences from the system
+ administrator.
+ 3. In $VIMRUNTIME, for files distributed with Vim.
+ *after-directory*
+ 4. In the "after" directory in the system-wide Vim directory. This is
+ for the system administrator to overrule or add to the distributed
+ defaults (rarely needed)
+ 5. In the "after" directory in your home directory. This is for
+ personal 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
+ wildcards.
+ See |:runtime|.
+ Example: >
+ :set runtimepath=~/vimruntime,/mygroup/vim,$VIMRUNTIME
+< This will use the directory "~/vimruntime" first (containing your
+ personal Vim runtime files), then "/mygroup/vim" (shared between a
+ group of people) and finally "$VIMRUNTIME" (the distributed runtime
+ files).
+ You probably should always include $VIMRUNTIME somewhere, to use the
+ distributed runtime files. You can put a directory before $VIMRUNTIME
+ 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.
+
+ *'scroll'* *'scr'*
+'scroll' 'scr' number (default: half the window height)
+ local to window
+ Number of lines to scroll with CTRL-U and CTRL-D commands. Will be
+ set to half the number of lines in the window when the window size
+ changes. This may happen when enabling the |status-line| or
+ 'tabline' option after setting the 'scroll' option.
+ If you give a count to the CTRL-U or CTRL-D command it will
+ be used as the new value for 'scroll'. Reset to half the window
+ height with ":set scroll=0".
+
+ *'scrollbind'* *'scb'* *'noscrollbind'* *'noscb'*
+'scrollbind' 'scb' boolean (default off)
+ local to window
+ 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
+ differences between two versions of a file, see 'diff'.
+ See |'scrollopt'| for options that determine how this option should be
+ interpreted.
+ This option is mostly reset when splitting a window to edit another
+ file. This means that ":split | edit file" results in two windows
+ with scroll-binding, but ":split file" does not.
+
+ *'scrollfocus'* *'scf'* *'noscrollfocus'* *'noscf'*
+'scrollfocus' 'scf' boolean (default off)
+ global
+ {only for MS-Windows GUI}
+ When using the scroll wheel and this option is set, the window under
+ the mouse pointer is scrolled. With this option off the current
+ window is scrolled.
+ Systems other than MS-Windows always behave like this option is on.
+
+ *'scrolljump'* *'sj'*
+'scrolljump' 'sj' number (default 1)
+ global
+ Minimal number of lines to scroll when the cursor gets off the
+ screen (e.g., with "j"). Not used for scroll commands (e.g., CTRL-E,
+ CTRL-D). Useful if your terminal scrolls very slowly.
+ When set to a negative number from -1 to -100 this is used as the
+ percentage of the window height. Thus -50 scrolls half the window
+ height.
+ NOTE: This option is set to 1 when 'compatible' is set.
+
+ *'scrolloff'* *'so'*
+'scrolloff' 'so' number (default 0, set to 5 in |defaults.vim|)
+ global or local to window |global-local|
+ Minimal number of screen lines to keep above and below the cursor.
+ This will make some context visible around where you are working. If
+ you set it to a very large value (999) the cursor line will always be
+ in the middle of the window (except at the start or end of the file or
+ when long lines wrap).
+ After using the local value, go back the global value with one of
+ these two: >
+ setlocal scrolloff<
+ setlocal scrolloff=-1
+< For scrolling horizontally see 'sidescrolloff'.
+ NOTE: This option is set to 0 when 'compatible' is set.
+
+ *'scrollopt'* *'sbo'*
+'scrollopt' 'sbo' string (default "ver,jump")
+ global
+ This is a comma-separated list of words that specifies how
+ 'scrollbind' windows should behave. 'sbo' stands for ScrollBind
+ Options.
+ The following words are available:
+ ver Bind vertical scrolling for 'scrollbind' windows
+ hor Bind horizontal scrolling for 'scrollbind' windows
+ jump Applies to the offset between two windows for vertical
+ scrolling. This offset is the difference in the first
+ displayed line of the bound windows. When moving
+ around in a window, another 'scrollbind' window may
+ reach a position before the start or after the end of
+ the buffer. The offset is not changed though, when
+ moving back the 'scrollbind' window will try to scroll
+ to the desired position when possible.
+ When now making that window the current one, two
+ things can be done with the relative offset:
+ 1. When "jump" is not included, the relative offset is
+ adjusted for the scroll position in the new current
+ window. When going back to the other window, the
+ new relative offset will be used.
+ 2. When "jump" is included, the other windows are
+ scrolled to keep the same relative offset. When
+ going back to the other window, it still uses the
+ same relative offset.
+ Also see |scroll-binding|.
+ When 'diff' mode is active there always is vertical scroll binding,
+ even when "ver" isn't there.
+
+ *'sections'* *'sect'*
+'sections' 'sect' string (default "SHNHH HUnhsh")
+ global
+ Specifies the nroff macros that separate sections. These are pairs of
+ two letters (See |object-motions|). The default makes a section start
+ at the nroff macros ".SH", ".NH", ".H", ".HU", ".nh" and ".sh".
+
+ *'secure'* *'nosecure'* *E523*
+'secure' boolean (default off)
+ global
+ When on, ":autocmd", shell and write commands are not allowed in
+ ".vimrc" and ".exrc" in the current directory and map commands are
+ displayed. Switch it off only if you know that you will not run into
+ problems, or when the 'exrc' option is off. On Unix this option is
+ only used if the ".vimrc" or ".exrc" is not owned by you. This can be
+ dangerous if the systems allows users to do a "chown". You better set
+ 'secure' at the end of your ~/.vimrc then.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'selection'* *'sel'*
+'selection' 'sel' string (default "inclusive")
+ global
+ This option defines the behavior of the selection. It is only used
+ in Visual and Select mode.
+ Possible values:
+ value past line inclusive ~
+ old no yes
+ inclusive yes yes
+ exclusive yes no
+ "past line" means that the cursor is allowed to be positioned one
+ character past the line.
+ "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.
+
+ The 'selection' option is set by the |:behave| command.
+
+ *'selectmode'* *'slm'*
+'selectmode' 'slm' string (default "")
+ global
+ This is a comma-separated list of words, which specifies when to start
+ Select mode instead of Visual mode, when a selection is started.
+ Possible values:
+ mouse when using the mouse
+ key when using shifted special keys
+ cmd when using "v", "V" or CTRL-V
+ See |Select-mode|.
+ The 'selectmode' option is set by the |:behave| command.
+
+ *'sessionoptions'* *'ssop'*
+'sessionoptions' 'ssop' string (default: "blank,buffers,curdir,folds,
+ help,options,tabpages,winsize,terminal")
+ global
+ {not available when compiled without the |+mksession|
+ feature}
+ Changes the effect of the |:mksession| command. It is a comma
+ separated list of words. Each word enables saving and restoring
+ something:
+ word save and restore ~
+ blank empty windows
+ buffers hidden and unloaded buffers, not just those in windows
+ curdir the current directory
+ folds manually created folds, opened/closed folds and local
+ fold options
+ globals global variables that start with an uppercase letter
+ and contain at least one lowercase letter. Only
+ String and Number types are stored.
+ help the help window
+ localoptions options and mappings local to a window or buffer (not
+ global values for local options)
+ options all options and mappings (also global values for local
+ options)
+ skiprtp exclude 'runtimepath' and 'packpath' from the options
+ resize size of the Vim window: 'lines' and 'columns'
+ sesdir the directory in which the session file is located
+ will become the current directory (useful with
+ projects accessed over a network from different
+ systems)
+ slash backslashes in file names replaced with forward
+ slashes
+ 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
+ winsize window sizes
+
+ Don't include both "curdir" and "sesdir".
+ When neither "curdir" nor "sesdir" is included, file names are stored
+ with absolute paths.
+ If you leave out "options" many things won't work well after restoring
+ the session.
+ "slash" and "unix" are useful on Windows when sharing session files
+ with Unix. The Unix version of Vim cannot source dos format scripts,
+ but the Windows version of Vim can source unix format scripts.
+
+ *'shell'* *'sh'* *E91*
+'shell' 'sh' string (default $SHELL or "sh", Win32: "cmd.exe")
+ global
+ Name of the shell to use for ! and :! commands. When changing the
+ value also check these options: 'shelltype', 'shellpipe', 'shellslash'
+ 'shellredir', 'shellquote', 'shellxquote' and 'shellcmdflag'.
+ It is allowed to give an argument to the command, e.g. "csh -f".
+ See |option-backslash| about including spaces and backslashes.
+ Environment variables are expanded |:set_env|.
+
+ In |restricted-mode| shell commands will not be possible. This mode
+ is used if the value of $SHELL ends in "false" or "nologin".
+
+ If the name of the shell contains a space, you need to enclose it in
+ quotes and escape the space. Example with quotes: >
+ :set shell=\"c:\program\ files\unix\sh.exe\"\ -f
+< Note the backslash before each quote (to avoid starting a comment) and
+ each space (to avoid ending the option value). Also note that the
+ "-f" is not inside the quotes, because it is not part of the command
+ name. Vim automagically recognizes the backslashes that are path
+ separators.
+ Example with escaped space (Vim will do this when initializing the
+ option from $SHELL): >
+ :set shell=/bin/with\\\ space/sh
+< The resulting value of 'shell' is "/bin/with\ space/sh", two
+ backslashes are consumed by `:set`.
+
+ Under MS-Windows, when the executable ends in ".com" it must be
+ included. Thus setting the shell to "command.com" or "4dos.com"
+ works, but "command" and "4dos" do not work for all commands (e.g.,
+ filtering).
+ For unknown reasons, when using "4dos.com" the current directory is
+ changed to "C:\". To avoid this set 'shell' like this: >
+ :set shell=command.com\ /c\ 4dos
+< This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'shellcmdflag'* *'shcf'*
+'shellcmdflag' 'shcf' string (default: "-c";
+ Win32, when 'shell' contains "powershell":
+ "-Command", or when it does not contain "sh"
+ somewhere: "/c")
+ global
+ Flag passed to the shell to execute "!" and ":!" commands; e.g.,
+ "bash.exe -c ls", "powershell.exe -Command dir", or "cmd.exe /c dir".
+ For MS-Windows, 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
+ part is passed as an argument to the shell command.
+ See |option-backslash| about including spaces and backslashes.
+ Also see |dos-shell| and |dos-powershell| for MS-Windows.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'shellpipe'* *'sp'*
+'shellpipe' 'sp' string (default ">", ">%s 2>&1", "| tee", "|& tee"
+ "2>&1| tee", or
+ "2>&1 | Out-File -Encoding default")
+ 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.
+ The name of the temporary file can be represented by "%s" if necessary
+ (the file name is appended automatically if no %s appears in the value
+ of this option).
+ For the Amiga the default is ">". For MS-Windows using powershell the
+ default is "2>&1 | Out-File -Encoding default", otherwise the default
+ is ">%s 2>&1". The output is directly saved in a file and not echoed
+ to the screen.
+ For Unix the default is "| tee". The stdout of the compiler is saved
+ in a file and echoed to the screen. If the 'shell' option is "csh" or
+ "tcsh" after initializations, the default becomes "|& tee". If the
+ 'shell' option is "sh", "ksh", "mksh", "pdksh", "zsh", "zsh-beta",
+ "bash", "fish", "ash" or "dash" the default becomes "2>&1| tee". This
+ means that stderr is also included. Before using the 'shell' option a
+ path is removed, thus "/bin/sh" uses "sh".
+ For Unix and MS-Windows, when the 'shell' option is "pwsh" the default
+ becomes ">%s 2>&1" and the output is not echoed to the screen.
+ The initialization of this option is done after reading the ".vimrc"
+ and the other initializations, so that when the 'shell' option is set
+ there, the 'shellpipe' option changes automatically, unless it was
+ explicitly set before.
+ When 'shellpipe' is set to an empty string, no redirection of the
+ ":make" output will be done. This is useful if you use a 'makeprg'
+ that writes to 'makeef' by itself. If you want no piping, but do
+ want to include the 'makeef', set 'shellpipe' to a single space.
+ Don't forget to precede the space with a backslash: ":set sp=\ ".
+ In the future pipes may be used for filtering and this option will
+ become obsolete (at least for Unix).
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'shellquote'* *'shq'*
+'shellquote' 'shq' string (default: "")
+ global
+ Quoting character(s), put around the command passed to the shell, for
+ the "!" and ":!" commands. The redirection is kept outside of the
+ quoting. See 'shellxquote' to include the redirection. It's
+ probably not useful to set both options.
+ This is an empty string by default. Only known to be useful for
+ third-party shells on MS-Windows-like systems, such as the MKS Korn
+ Shell or bash, where it should be "\"". See |dos-shell|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'shellredir'* *'srr'*
+'shellredir' 'srr' string (default ">", ">&", ">%s 2>&1", or
+ "2>&1 | Out-File -Encoding default")
+ global
+ String to be used to put the output of a filter command in a temporary
+ file. See also |:!|. See |option-backslash| about including spaces
+ and backslashes.
+ The name of the temporary file can be represented by "%s" if necessary
+ (the file name is appended automatically if no %s appears in the value
+ of this option).
+ The default is ">". For Unix, if the 'shell' option is "csh" or
+ "tcsh" during initializations, the default becomes ">&". If the
+ 'shell' option is "sh", "ksh", "mksh", "pdksh", "zsh", "zsh-beta",
+ "bash", "fish", or "pwsh", the default becomes ">%s 2>&1". This means
+ that stderr is also included. For Win32, the Unix checks are done and
+ additionally "cmd" is checked for, which makes the default ">%s 2>&1",
+ and "powershell" is checked for which makes the default
+ "2>&1 | Out-File -Encoding default" (see |dos-powershell|). Also, the
+ same names with ".exe" appended are checked for.
+ The initialization of this option is done after reading the ".vimrc"
+ and the other initializations, so that when the 'shell' option is set
+ there, the 'shellredir' option changes automatically unless it was
+ explicitly set before.
+ In the future pipes may be used for filtering and this option will
+ become obsolete (at least for Unix).
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'shellslash'* *'ssl'* *'noshellslash'* *'nossl'*
+'shellslash' 'ssl' boolean (default off)
+ global
+ {only for MS-Windows}
+ When set, a forward slash is used when expanding file names. This is
+ useful when a Unix-like shell is used instead of cmd.exe, pwsh.exe, or
+ powershell.exe. Backward slashes can still be typed, but they are
+ changed to forward slashes by Vim.
+ Note that setting or resetting this option has no effect for some
+ existing file names, thus this option needs to be set before opening
+ any file for best results. This might change in the future.
+ 'shellslash' only works when a backslash can be used as a path
+ separator. To test if this is so use: >
+ if exists('+shellslash')
+< Also see 'completeslash'.
+
+ *'shelltemp'* *'stmp'* *'noshelltemp'* *'nostmp'*
+'shelltemp' 'stmp' boolean (Vi default off, Vim default on)
+ 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
+ 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.
+ The `system()` function does not respect this option and always uses
+ temp files.
+ NOTE: This option is set to the Vim default value when 'compatible'
+ is reset.
+
+ *'shelltype'* *'st'*
+'shelltype' 'st' number (default 0)
+ global
+ {only for the Amiga}
+ On the Amiga this option influences the way how the commands work
+ which use a shell.
+ 0 and 1: always use the shell
+ 2 and 3: use the shell only to filter lines
+ 4 and 5: use shell only for ':sh' command
+ When not using the shell, the command is executed directly.
+
+ 0 and 2: use "shell 'shellcmdflag' cmd" to start external commands
+ 1 and 3: use "shell cmd" to start external commands
+
+ *'shellxescape'* *'sxe'*
+'shellxescape' 'sxe' string (default: "";
+ for MS-Windows: "\"&|<>()@^")
+ 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' is
+ powershell.exe: "\""
+ for Win32, when 'shell' contains "sh"
+ somewhere: "\""
+ for Unix, when using system(): "\"")
+ global
+ Quoting character(s), put around the command passed to the shell, for
+ the "!" and ":!" commands. Includes the redirection. See
+ 'shellquote' to exclude the redirection. It's probably not useful
+ to set both options.
+ 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, powershell.exe, or
+ pwsh.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.
+
+ *'shiftround'* *'sr'* *'noshiftround'* *'nosr'*
+'shiftround' 'sr' boolean (default off)
+ global
+ Round indent to multiple of 'shiftwidth'. Applies to > and <
+ commands. CTRL-T and CTRL-D in Insert mode always round the indent to
+ a multiple of 'shiftwidth' (this is Vi compatible).
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'shiftwidth'* *'sw'*
+'shiftwidth' 'sw' number (default 8)
+ local to buffer
+ Number of spaces to use for each step of (auto)indent. Used for
+ |'cindent'|, |>>|, |<<|, etc.
+ When zero the 'ts' value will be used. Use the |shiftwidth()|
+ function to get the effective shiftwidth value.
+
+ *'shortmess'* *'shm'*
+'shortmess' 'shm' string (Vim default "filnxtToOS", Vi default: "S",
+ POSIX default: "AS")
+ global *E1336*
+ 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.
+ It is a list of flags:
+ flag meaning when present ~
+ f use "(3 of 5)" instead of "(file 3 of 5)" *shm-f*
+ i use "[noeol]" instead of "[Incomplete last line]" *shm-i*
+ l use "999L, 888B" instead of "999 lines, 888 bytes" *shm-l*
+ m use "[+]" instead of "[Modified]" *shm-m*
+ n use "[New]" instead of "[New File]" *shm-n*
+ r use "[RO]" instead of "[readonly]" *shm-r*
+ w use "[w]" instead of "written" for file write message *shm-w*
+ and "[a]" instead of "appended" for ':w >> file' command
+ x use "[dos]" instead of "[dos format]", "[unix]" *shm-x*
+ instead of "[unix format]" and "[mac]" instead of "[mac
+ format]"
+ a all of the above abbreviations *shm-a*
+
+ o overwrite message for writing a file with subsequent *shm-o*
+ message for reading a file (useful for ":wn" or when
+ 'autowrite' on)
+ O message for reading a file overwrites any previous *shm-O*
+ message; also for quickfix message (e.g., ":cn")
+ s don't give "search hit BOTTOM, continuing at TOP" or *shm-s*
+ "search hit TOP, continuing at BOTTOM" messages; when using
+ the search count do not show "W" after the count message (see
+ S below)
+ t truncate file message at the start if it is too long *shm-t*
+ to fit on the command-line, "<" will appear in the left most
+ column; ignored in Ex mode
+ T truncate other messages in the middle if they are too *shm-T*
+ long to fit on the command line; "..." will appear in the
+ middle; ignored in Ex mode
+ W don't give "written" or "[w]" when writing a file *shm-W*
+ A don't give the "ATTENTION" message when an existing *shm-A*
+ swap file is found
+ I don't give the intro message when starting Vim, *shm-I*
+ see |:intro|
+ c don't give |ins-completion-menu| messages; for *shm-c*
+ example, "-- XXX completion (YYY)", "match 1 of 2", "The only
+ match", "Pattern not found", "Back at original", etc.
+ C don't give messages while scanning for ins-completion *shm-C*
+ items, for instance "scanning tags"
+ q use "recording" instead of "recording @a" *shm-q*
+ F don't give the file info when editing a file, like *shm-F*
+ `:silent` was used for the command; note that this also
+ affects messages from autocommands
+ S do not show search count message when searching, e.g. *shm-S*
+ "[1/5]"
+
+ This gives you the opportunity to avoid that a change between buffers
+ requires you to hit <Enter>, but still gives as useful a message as
+ possible for the space available. To get the whole message that you
+ would have got with 'shm' empty, use ":file!"
+ Useful values:
+ shm= No abbreviation of message.
+ shm=a Abbreviation, but no loss of information.
+ shm=at Abbreviation, and truncate message when necessary.
+
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'shortname'* *'sn'* *'noshortname'* *'nosn'*
+'shortname' 'sn' boolean (default off)
+ local to buffer
+ Filenames are assumed to be 8 characters plus one extension of 3
+ characters. Multiple dots in file names are not allowed. When this
+ option is on, dots in file names are replaced with underscores when
+ adding an extension (".~" or ".swp"). This option is useful
+ when editing files on an MS-DOS compatible filesystem, e.g., messydos
+ or crossdos.
+
+ *'showbreak'* *'sbr'* *E595*
+'showbreak' 'sbr' string (default "")
+ global or local to window |global-local|
+ {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=>\
+< Note the backslash to escape the trailing space. It's easier like
+ this: >
+ :let &showbreak = '+++ '
+< 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'.
+ 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'.
+ A window-local value overrules a global value. If the global value is
+ set and you want no value in the current window use NONE: >
+ :setlocal showbreak=NONE
+<
+ *'showcmd'* *'sc'* *'noshowcmd'* *'nosc'*
+'showcmd' 'sc' boolean (Vim default: on, off for Unix,
+ Vi default: off, set in |defaults.vim|)
+ global
+ 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:
+ - When selecting characters within a line, the number of characters.
+ If the number of bytes is different it is also displayed: "2-6"
+ means two characters and six bytes.
+ - When selecting more than one line, the number of lines.
+ - When selecting a block, the size in screen characters:
+ {lines}x{columns}.
+ This information can be displayed in an alternative location using the
+ 'showcmdloc' option.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'showcmdloc'* *'sloc'*
+'showcmdloc' 'sloc' string (default "last")
+ global
+ This option can be used to display the (partially) entered command in
+ another location. Possible values are:
+ last Last line of the screen (default).
+ statusline Status line of the current window.
+ tabline First line of the screen if 'showtabline' is enabled.
+ Setting this option to "statusline" or "tabline" means that these will
+ be redrawn whenever the command changes, which can be on every key
+ pressed.
+ The %S 'statusline' item can be used in 'statusline' or 'tabline' to
+ place the text. Without a custom 'statusline' or 'tabline' it will be
+ displayed in a convenient location.
+
+ *'showfulltag'* *'sft'* *'noshowfulltag'* *'nosft'*
+'showfulltag' 'sft' boolean (default off)
+ global
+ When completing a word in insert mode (see |ins-completion|) from the
+ tags file, show both the tag name and a tidied-up form of the search
+ pattern (if there is one) as possible matches. Thus, if you have
+ matched a C function, you can see a template for what arguments are
+ required (coding style permitting).
+ Note that this doesn't work well together with having "longest" in
+ 'completeopt', because the completion from the search pattern may not
+ match the typed text.
+
+ *'showmatch'* *'sm'* *'noshowmatch'* *'nosm'*
+'showmatch' 'sm' boolean (default off)
+ global
+ When a bracket is inserted, briefly jump to the matching one. The
+ jump is only done if the match can be seen on the screen. The time to
+ show the match can be set with 'matchtime'.
+ A Beep is given if there is no match (no matter if the match can be
+ seen or not).
+ This option is reset when 'paste' is set and restored when 'paste' is
+ reset.
+ When the 'm' flag is not included in 'cpoptions', typing a character
+ will immediately move the cursor back to where it belongs.
+ See the "sm" field in 'guicursor' for setting the cursor shape and
+ blinking when showing the match.
+ The 'matchpairs' option can be used to specify the characters to show
+ matches for. 'rightleft' and 'revins' are used to look for opposite
+ matches.
+ Also see the matchparen plugin for highlighting the match when moving
+ around |pi_paren.txt|.
+ Note: Use of the short form is rated PG.
+
+ *'showmode'* *'smd'* *'noshowmode'* *'nosmd'*
+'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, especially when 'imactivatekey' is
+ not set.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'showtabline'* *'stal'*
+'showtabline' 'stal' number (default 1)
+ global
+ The value of this option specifies when the line with tab page labels
+ will be displayed:
+ 0: never
+ 1: only if there are at least two tab pages
+ 2: always
+ This is both for the GUI and non-GUI implementation of the tab pages
+ line.
+ See |tab-page| for more information about tab pages.
+
+ *'sidescroll'* *'ss'*
+'sidescroll' 'ss' number (default 0)
+ 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.
+
+ *'sidescrolloff'* *'siso'*
+'sidescrolloff' 'siso' number (default 0)
+ global or local to window |global-local|
+ The minimal number of screen columns to keep to the left and to the
+ right of the cursor if 'nowrap' is set. Setting this option to a
+ value greater than 0 while having |'sidescroll'| also at a non-zero
+ value makes some context visible in the line you are scrolling in
+ horizontally (except at beginning of the line). Setting this option
+ to a large value (like 999) has the effect of keeping the cursor
+ horizontally centered in the window, as long as one does not come too
+ close to the beginning of the line.
+ After using the local value, go back the global value with one of
+ these two: >
+ setlocal sidescrolloff<
+ setlocal sidescrolloff=-1
+< NOTE: This option is set to 0 when 'compatible' is set.
+
+ Example: Try this together with 'sidescroll' and 'listchars' as
+ in the following example to never allow the cursor to move
+ onto the "extends" character: >
+
+ :set nowrap sidescroll=1 listchars=extends:>,precedes:<
+ :set sidescrolloff=1
+<
+ *'signcolumn'* *'scl'*
+'signcolumn' 'scl' string (default "auto")
+ local to window
+ {not available when compiled without the |+signs|
+ feature}
+ Whether or not to draw the signcolumn. Valid values are:
+ "auto" only when there is a sign to display
+ "no" never
+ "yes" always
+ "number" display signs in the 'number' column. If the number
+ column is not present, then behaves like "auto".
+
+
+ *'smartcase'* *'scs'* *'nosmartcase'* *'noscs'*
+'smartcase' 'scs' boolean (default off)
+ global
+ Override the 'ignorecase' option if the search pattern contains upper
+ case characters. Only used when the search pattern is typed and
+ 'ignorecase' option is on. Used for the commands "/", "?", "n", "N",
+ ":g" and ":s". Not used for "*", "#", "gd", tag search, etc. After
+ "*" and "#" you can make 'smartcase' used by doing a "/" command,
+ recalling the search pattern from history and hitting <Enter>.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'smartindent'* *'si'* *'nosmartindent'* *'nosi'*
+'smartindent' 'si' boolean (default off)
+ local to buffer
+ 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,
+ see |C-indenting|. When 'cindent' is on or 'indentexpr' is set,
+ setting 'si' has no effect. 'indentexpr' is a more advanced
+ alternative.
+ Normally 'autoindent' should also be on when using 'smartindent'.
+ An indent is automatically inserted:
+ - After a line ending in '{'.
+ - After a line starting with a keyword from 'cinwords'.
+ - Before a line starting with '}' (only with the "O" command).
+ When typing '}' as the first character in a new line, that line is
+ given the same indent as the matching '{'.
+ When typing '#' as the first character in a new line, the indent for
+ that line is removed, the '#' is put in the first column. The indent
+ is restored for the next line. If you don't want this, use this
+ mapping: ":inoremap # X^H#", where ^H is entered with CTRL-V CTRL-H.
+ When using the ">>" command, lines starting with '#' are not shifted
+ right.
+ NOTE: This option is reset when 'compatible' is set.
+ This option is reset when 'paste' is set and restored when 'paste' is
+ reset.
+
+ *'smarttab'* *'sta'* *'nosmarttab'* *'nosta'*
+'smarttab' 'sta' boolean (default off)
+ global
+ When on, a <Tab> in front of a line inserts blanks according to
+ 'shiftwidth'. 'tabstop' or 'softtabstop' is used in other places. A
+ <BS> will delete a 'shiftwidth' worth of space at the start of the
+ line.
+ When off, a <Tab> always inserts blanks according to 'tabstop' or
+ 'softtabstop'. 'shiftwidth' is only used for shifting text left or
+ right |shift-left-right|.
+ What gets inserted (a <Tab> or spaces) depends on the 'expandtab'
+ option. Also see |ins-expandtab|. When 'expandtab' is not set, the
+ number of spaces is minimized by using <Tab>s.
+ This option is reset when 'paste' is set and restored when 'paste' is
+ reset.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'smoothscroll'* *'sms'* *'nosmoothscroll'* *'nosms'*
+'smoothscroll' 'sms' boolean (default off)
+ local to window
+ Scrolling works with screen lines. When 'wrap' is set and the first
+ line in the window wraps part of it may not be visible, as if it is
+ above the window. "<<<" is displayed at the start of the first line,
+ highlighted with |hl-NonText|.
+ NOTE: only partly implemented, currently works with CTRL-E, CTRL-Y
+ and scrolling with the mouse.
+
+ *'softtabstop'* *'sts'*
+'softtabstop' 'sts' number (default 0)
+ local to buffer
+ Number of spaces that a <Tab> counts for while performing editing
+ operations, like inserting a <Tab> or using <BS>. It "feels" like
+ <Tab>s are being inserted, while in fact a mix of spaces and <Tab>s is
+ used. This is useful to keep the 'ts' setting at its standard value
+ of 8, while being able to edit like it is set to 'sts'. However,
+ commands like "x" still work on the actual characters.
+ When 'sts' is zero, this feature is off.
+ When 'sts' is negative, the value of 'shiftwidth' is used.
+ 'softtabstop' is set to 0 when the 'paste' option is set and restored
+ when 'paste' is reset.
+ See also |ins-expandtab|. When 'expandtab' is not set, the number of
+ spaces is minimized by using <Tab>s.
+ The 'L' flag in 'cpoptions' changes how tabs are used when 'list' is
+ set.
+ NOTE: This option is set to 0 when 'compatible' is set.
+
+ If Vim is compiled with the |+vartabs| feature then the value of
+ 'softtabstop' will be ignored if |'varsofttabstop'| is set to
+ anything other than an empty string.
+
+ *'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).
+ When this check is not wanted make this option empty.
+ Only used when 'spell' is set.
+ Be careful with special characters, see |option-backslash| about
+ including spaces and backslashes.
+ To set this option automatically depending on the language, see
+ |set-spc-auto|.
+
+ *'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.
+ The path may include characters from 'isfname', space, comma and '@'.
+ *E765*
+ It may also be a comma-separated list of names. A count before the
+ |zg| and |zw| commands can be used to access each. This allows using
+ a personal word list file and a project word list file.
+ When a word is added while this option is empty Vim will set it for
+ you: Using the first directory in 'runtimepath' that is writable. If
+ there is no "spell" directory yet it will be created. For the file
+ name the first language name that appears in 'spelllang' is used,
+ ignoring the region.
+ The resulting ".spl" file will be used for spell checking, it does not
+ have to appear in 'spelllang'.
+ Normally one file is used for all regions, but you can add the region
+ name if you want to. However, it will then only be used when
+ 'spellfile' is set to it, for entries in 'spelllang' only files
+ without region name will be found.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'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
+< This means US English, Dutch and medical words are recognized. Words
+ that are not recognized will be highlighted.
+ The word list name must consist of alphanumeric characters, a dash or
+ an underscore. It should not include a comma or dot. Using a dash is
+ recommended to separate the two letter language name from a
+ specification. Thus "en-rare" is used for rare English words.
+ A region name must come last and have the form "_xx", where "xx" is
+ the two-letter, lower case region name. You can use more than one
+ region by listing them: "en_us,en_ca" supports both US and Canadian
+ English, but not words specific for Australia, New Zealand or Great
+ Britain. (Note: currently en_au and en_nz dictionaries are older than
+ en_ca, en_gb and en_us).
+ If the name "cjk" is included East Asian characters are excluded from
+ spell checking. This is useful when editing text that also has Asian
+ words.
+ Note that the "medical" dictionary does not exist, it is just an
+ example of a longer name.
+ *E757*
+ As a special case the name of a .spl file can be given as-is. The
+ first "_xx" in the name is removed and used as the region name
+ (_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
+ for which Vim cannot find the .spl file in 'runtimepath' the plugin
+ will ask you if you want to download the file.
+
+ After this option has been set successfully, Vim will source the files
+ "spell/LANG.vim" in 'runtimepath'. "LANG" is the value of 'spelllang'
+ up to the first character that is not an ASCII letter or number and
+ not a dash. Also see |set-spc-auto|.
+
+ *'spelloptions'* *'spo'*
+'spelloptions' 'spo' string (default "")
+ local to buffer
+ {not available when compiled without the |+syntax|
+ feature}
+ A comma-separated list of options for spell checking:
+ camel When a word is CamelCased, assume "Cased" is a
+ separate word: every upper-case character in a word
+ that comes after a lower case character indicates the
+ start of a new word.
+
+ *'spellsuggest'* *'sps'*
+'spellsuggest' 'sps' string (default "best")
+ 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:
+
+ best Internal method that works best for English. Finds
+ changes like "fast" and uses a bit of sound-a-like
+ scoring to improve the ordering.
+
+ double Internal method that uses two methods and mixes the
+ results. The first method is "fast", the other method
+ computes how much the suggestion sounds like the bad
+ word. That only works when the language specifies
+ sound folding. Can be slow and doesn't always give
+ better results.
+
+ fast Internal method that only checks for simple changes:
+ character inserts/deletes/swaps. Works well for
+ simple typing mistakes.
+
+ {number} The maximum number of suggestions listed for |z=|.
+ Not used for |spellsuggest()|. The number of
+ suggestions is never more than the value of 'lines'
+ minus two.
+
+ timeout:{millisec} Limit the time searching for suggestions to
+ {millisec} milli seconds. Applies to the following
+ methods. When omitted the limit is 5000. When
+ negative there is no limit. {only works when built
+ with the |+reltime| feature}
+
+ file:{filename} Read file {filename}, which must have two columns,
+ separated by a slash. The first column contains the
+ bad word, the second column the suggested good word.
+ Example:
+ theribal/terrible ~
+ Use this for common mistakes that do not appear at the
+ top of the suggestion list with the internal methods.
+ Lines without a slash are ignored, use this for
+ comments.
+ The word in the second column must be correct,
+ otherwise it will not be used. Add the word to an
+ ".add" file if it is currently flagged as a spelling
+ mistake.
+ The file is used for all languages.
+
+ expr:{expr} Evaluate expression {expr}. Use a function to avoid
+ trouble with spaces. Best is to call a function
+ without arguments, see |expr-option-function|.
+ |v:val| holds the badly spelled word. The expression
+ must evaluate to a List of Lists, each with a
+ suggestion and a score.
+ Example:
+ [['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
+ set 'spellsuggest' to exclude the "expr:" part.
+ Errors are silently ignored, unless you set the
+ 'verbose' option to a non-zero value.
+
+ Only one of "best", "double" or "fast" may be used. The others may
+ appear several times in any order. Example: >
+ :set sps=file:~/.vim/sugg,best,expr:MySuggest()
+<
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+
+ *'splitbelow'* *'sb'* *'nosplitbelow'* *'nosb'*
+'splitbelow' 'sb' boolean (default off)
+ global
+ When on, splitting a window will put the new window below the current
+ one. |:split|
+
+ *'splitkeep'* *'spk'*
+'splitkeep' 'spk' string (default "cursor")
+ global
+ The value of this option determines the scroll behavior when opening,
+ closing or resizing horizontal splits.
+
+ Possible values are:
+ cursor Keep the same relative cursor position.
+ screen Keep the text on the same screen line.
+ topline Keep the topline the same.
+
+ For the "screen" and "topline" values, the cursor position will be
+ changed when necessary. In this case, the jumplist will be populated
+ with the previous cursor position. For "screen", the text cannot always
+ be kept on the same screen line when 'wrap' is enabled.
+
+ *'splitright'* *'spr'* *'nosplitright'* *'nospr'*
+'splitright' 'spr' boolean (default off)
+ global
+ When on, splitting a window will put the new window right of the
+ current one. |:vsplit|
+
+ *'startofline'* *'sol'* *'nostartofline'* *'nosol'*
+'startofline' 'sol' boolean (default on)
+ global
+ When "on" the commands listed below move the cursor to the first
+ non-blank of the line. When off the cursor is kept in the same column
+ (if possible). This applies to the commands: CTRL-D, CTRL-U, CTRL-B,
+ CTRL-F, "G", "H", "M", "L", gg, and to the commands "d", "<<" and ">>"
+ with a linewise operator, with "%" with a count and to buffer changing
+ commands (CTRL-^, :bnext, :bNext, etc.). Also for an Ex command that
+ only has a line number, e.g., ":25" or ":+".
+ In case of buffer changing commands the cursor is placed at the column
+ where it was the last time the buffer was edited.
+ NOTE: This option is set when 'compatible' is set.
+
+ *'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 non-empty, this option determines the content of the status line.
+ Also see |status-line|.
+
+ The option consists of printf style '%' items interspersed with
+ normal text. Each status line item is of the form:
+ %-0{minwid}.{maxwid}{item}
+ All fields except the {item} are optional. A single percent sign can
+ be given as "%%".
+
+ When the option starts with "%!" then it is used as an expression,
+ evaluated and the result is used as the option value. Example: >
+ :set statusline=%!MyStatusLine()
+< The *g:statusline_winid* variable will be set to the |window-ID| of the
+ window that the status line belongs to.
+ The result can contain %{} items that will be evaluated too.
+ Note that the "%!" expression is evaluated in the context of the
+ current window and buffer, while %{} items are evaluated in the
+ context of the window that the statusline belongs to.
+
+ When there is error while evaluating the option then it will be made
+ empty to avoid further errors. Otherwise screen updating would loop.
+ When the result contains unprintable characters the result is
+ unpredictable.
+
+ Note that the only effect of 'ruler' when this option is set (and
+ 'laststatus' is 2) is controlling the output of |CTRL-G|.
+
+ field meaning ~
+ - Left justify the item. The default is right justified
+ when minwid is larger than the length of the item.
+ 0 Leading zeroes in numeric items. Overridden by '-'.
+ minwid Minimum width of the item, padding as set by '-' & '0'.
+ Value must be 50 or less.
+ maxwid Maximum width of the item. Truncation occurs with a '<'
+ on the left for text items. Numeric items will be
+ shifted down to maxwid-2 digits followed by '>'number
+ where number is the amount of missing digits, much like
+ an exponential notation.
+ item A one letter code as described below.
+
+ Following is a description of the possible statusline items. The
+ second character in "item" is the type:
+ N for number
+ S for string
+ F for flags as described below
+ - not applicable
+
+ item meaning ~
+ f S Path to the file in the buffer, as typed or relative to current
+ directory.
+ F S Full path to the file in the buffer.
+ t S File name (tail) of file in the buffer.
+ m F Modified flag, text is "[+]"; "[-]" if 'modifiable' is off.
+ M F Modified flag, text is ",+" or ",-".
+ r F Readonly flag, text is "[RO]".
+ R F Readonly flag, text is ",RO".
+ h F Help buffer flag, text is "[help]".
+ H F Help buffer flag, text is ",HLP".
+ w F Preview window flag, text is "[Preview]".
+ W F Preview window flag, text is ",PRV".
+ y F Type of file in the buffer, e.g., "[vim]". See 'filetype'.
+ Y F Type of file in the buffer, e.g., ",VIM". See 'filetype'.
+ q S "[Quickfix List]", "[Location List]" or empty.
+ k S Value of "b:keymap_name" or 'keymap' when |:lmap| mappings are
+ being used: "<keymap>"
+ n N Buffer number.
+ b N Value of character under cursor.
+ B N As above, in hexadecimal.
+ o N Byte number in file of byte under cursor, first byte is 1.
+ Mnemonic: Offset from start of file (with one added)
+ {not available when compiled without |+byte_offset| feature}
+ O N As above, in hexadecimal.
+ N N Printer page number. (Only works in the 'printheader' option.)
+ l N Line number.
+ L N Number of lines in buffer.
+ c N Column number (byte index).
+ v N Virtual column number (screen column).
+ V N Virtual column number as -{num}. Not displayed if equal to 'c'.
+ p N Percentage through file in lines as in |CTRL-G|.
+ P S Percentage through file of displayed window. This is like the
+ percentage described for 'ruler'. Always 3 in length, unless
+ translated.
+ S S 'showcmd' content, see 'showcmdloc'.
+ a S Argument list status as in default title. ({current} of {max})
+ Empty if the argument file count is zero or one.
+ { NF Evaluate expression between '%{' and '}' and substitute result.
+ Note that there is no '%' before the closing '}'. The
+ expression cannot contain a '}' character, call a function to
+ work around that. See |stl-%{| below.
+ {% - This is almost same as { except the result of the expression is
+ re-evaluated as a statusline format string. Thus if the
+ return value of expr contains % items they will get expanded.
+ The expression can contain the } character, the end of
+ expression is denoted by %}.
+ For example: >
+ func! Stl_filename() abort
+ return "%t"
+ endfunc
+< `stl=%{Stl_filename()}` results in `"%t"`
+ `stl=%{%Stl_filename()%}` results in `"Name of current file"`
+ %} - End of `{%` expression
+ ( - Start of item group. Can be used for setting the width and
+ alignment of a section. Must be followed by %) somewhere.
+ ) - End of item group. No width fields allowed.
+ T N For 'tabline': start of tab page N label. Use %T after the last
+ label. This information is used for mouse clicks.
+ X N For 'tabline': start of close tab N label. Use %X after the
+ label, e.g.: %3Xclose%X. Use %999X for a "close current tab"
+ mark. This information is used for mouse clicks.
+ < - Where to truncate line if too long. Default is at the start.
+ No width fields allowed.
+ = - Separation point between alignment sections. Each section will
+ be separated by an equal number of spaces. With one %= what
+ comes after it will be right-aligned. With two %= there is a
+ middle part, with white space left and right of it.
+ No width fields allowed.
+ # - Set highlight group. The name must follow and then a # again.
+ Thus use %#HLname# for highlight group HLname. The same
+ highlighting is used, also for the statusline of non-current
+ windows.
+ * - Set highlight group to User{N}, where {N} is taken from the
+ minwid field, e.g. %1*. Restore normal highlight with %* or %0*.
+ The difference between User{N} and StatusLine will be applied to
+ StatusLineNC for the statusline of non-current windows.
+ The number N must be between 1 and 9. See |hl-User1..9|
+
+ When displaying a flag, Vim removes the leading comma, if any, when
+ that flag comes right after plaintext. This will make a nice display
+ when flags are used like in the examples below.
+
+ When all items in a group becomes an empty string (i.e. flags that are
+ not set) and a minwid is not set for the group, the whole group will
+ become empty. This will make a group like the following disappear
+ completely from the statusline when none of the flags are set. >
+ :set statusline=...%(\ [%M%R%H]%)...
+< Beware that an expression is evaluated each and every time the status
+ line is displayed.
+ *stl-%{* *g:actual_curbuf* *g:actual_curwin*
+ While evaluating %{} 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 "g:actual_curbuf" is set to the `bufnr()` number of the
+ real current buffer and "g:actual_curwin" to the |window-ID| of the
+ real current window. These values are strings.
+
+ The 'statusline' option will be evaluated in the |sandbox| if set from
+ a modeline, see |sandbox-option|.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+
+ It is not allowed to change text or jump to another window while
+ evaluating 'statusline' |textlock|.
+
+ If the statusline is not updated when you want it (e.g., after setting
+ a variable that's used in an expression), you can force an update by
+ using `:redrawstatus`.
+
+ A result of all digits is regarded a number for display purposes.
+ Otherwise the result is taken as flag text and applied to the rules
+ described above.
+
+ Watch out for errors in expressions. They may render Vim unusable!
+ If you are stuck, hold down ':' or 'Q' to get a prompt, then quit and
+ edit your .vimrc or whatever with "vim --clean" to get it right.
+
+ Examples:
+ Emulate standard status line with 'ruler' set >
+ :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P
+< Similar, but add ASCII value of char under the cursor (like "ga") >
+ :set statusline=%<%f%h%m%r%=%b\ 0x%B\ \ %l,%c%V\ %P
+< Display byte count and byte value, modified flag in red. >
+ :set statusline=%<%f%=\ [%1*%M%*%n%R%H]\ %-19(%3l,%02c%03V%)%O'%02b'
+ :hi User1 term=inverse,bold cterm=inverse,bold ctermfg=red
+< Display a ,GZ flag if a compressed file is loaded >
+ :set statusline=...%r%{VarExists('b:gzflag','\ [GZ]')}%h...
+< In the |:autocmd|'s: >
+ :let b:gzflag = 1
+< And: >
+ :unlet b:gzflag
+< And define this function: >
+ :function VarExists(var, val)
+ : if exists(a:var) | return a:val | else | return '' | endif
+ :endfunction
+<
+ *'suffixes'* *'su'*
+'suffixes' 'su' string (default ".bak,~,.o,.h,.info,.swp,.obj")
+ global
+ Files with these suffixes get a lower priority when multiple files
+ match a wildcard. See |suffixes|. Commas can be used to separate the
+ suffixes. Spaces after the comma are ignored. A dot is also seen as
+ the start of a suffix. To avoid a dot or comma being recognized as a
+ separator, precede it with a backslash (see |option-backslash| about
+ including spaces and backslashes).
+ See 'wildignore' for completely ignoring files.
+ The use of |:set+=| and |:set-=| is preferred when adding or removing
+ suffixes from the list. This avoids problems when a future version
+ uses another default.
+
+ *'suffixesadd'* *'sua'*
+'suffixesadd' 'sua' string (default "")
+ local to buffer
+ Comma-separated list of suffixes, which are used when searching for a
+ file for the "gf", "[I", etc. commands. Example: >
+ :set suffixesadd=.java
+<
+ *'swapfile'* *'swf'* *'noswapfile'* *'noswf'*
+'swapfile' 'swf' boolean (default on)
+ local to buffer
+ Use a swapfile for the buffer. This option can be reset when a
+ swapfile is not wanted for a specific buffer. For example, with
+ confidential information that even root must not be able to access.
+ Careful: All text will be in memory:
+ - Don't use this for big files.
+ - Recovery will be impossible!
+ A swapfile will only be present when |'updatecount'| is non-zero and
+ 'swapfile' is set.
+ When 'swapfile' is reset, the swap file for the current buffer is
+ immediately deleted. When 'swapfile' is set, and 'updatecount' is
+ non-zero, a swap file is immediately created.
+ Also see |swap-file| and |'swapsync'|.
+ 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' string (default "fsync")
+ global
+ When this option is not empty a swap file is synced to disk after
+ writing to it. This takes some time, especially on busy unix systems.
+ When this option is empty parts of the swap file may be in memory and
+ not written to disk. When the system crashes you may lose more work.
+ On Unix the system does a sync now and then without Vim asking for it,
+ so the disadvantage of setting this option off is small. On some
+ systems the swap file will not be written at all. For a unix system
+ setting it to "sync" will use the sync() call instead of the default
+ fsync(), which may work better on some systems.
+ The 'fsync' option is used for the actual file.
+
+ *'switchbuf'* *'swb'*
+'switchbuf' 'swb' string (default "")
+ global
+ This option controls the behavior when switching between buffers.
+ Mostly for |quickfix| commands some values are also used for other
+ commands, as mentioned below.
+ Possible values (comma-separated list):
+ useopen If included, jump to the first open window that
+ contains the specified buffer (if there is one).
+ Otherwise: Do not examine other windows.
+ This setting is checked with |quickfix| commands, when
+ jumping to errors (":cc", ":cn", "cp", etc.). It is
+ also used in all buffer related split commands, for
+ example ":sbuffer", ":sbnext", or ":sbrewind".
+ usetab Like "useopen", but also consider windows in other tab
+ pages.
+ split If included, split the current window before loading
+ a buffer for a |quickfix| command that display errors.
+ Otherwise: do not split, use current window (when used
+ in the quickfix window: the previously used window or
+ split if there is no other window).
+ vsplit Just like "split" but split vertically.
+ newtab Like "split", but open a new tab page. Overrules
+ "split" when both are present.
+ uselast If included, jump to the previously used window when
+ jumping to errors with |quickfix| commands.
+
+ *'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.
+ This helps to avoid very slow redrawing for an XML file that is one
+ long line.
+ Set to zero to remove the limit.
+
+ *'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
+ b:current_syntax variable does).
+ This option is most useful in a modeline, for a file which syntax is
+ not automatically recognized. Example, in an IDL file:
+ /* vim: set syntax=idl : */ ~
+ When a dot appears in the value then this separates two filetype
+ names. Example:
+ /* vim: set syntax=c.doxygen : */ ~
+ This will use the "c" syntax first, then the "doxygen" syntax.
+ Note that the second one must be prepared to be loaded as an addition,
+ otherwise it will be skipped. More than one dot may appear.
+ To switch off syntax highlighting for the current file, use: >
+ :set syntax=OFF
+< To switch syntax highlighting on according to the current value of the
+ 'filetype' option: >
+ :set syntax=ON
+< What actually happens when setting the 'syntax' option is that the
+ Syntax autocommand event is triggered with the value as argument.
+ This option is not copied to another buffer, independent of the 's' or
+ 'S' flag in 'cpoptions'.
+ Only normal file name characters can be used, "/\*?[|<>" are illegal.
+
+ *'tabline'* *'tal'*
+'tabline' 'tal' string (default empty)
+ global
+ When non-empty, 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.
+
+ The tab pages line only appears as specified with the 'showtabline'
+ option and only when there is no GUI tab line. When 'e' is in
+ 'guioptions' and the GUI supports a tab line 'guitablabel' is used
+ instead. Note that the two tab pages lines are very different.
+
+ The value is evaluated like with 'statusline'. You can use
+ |tabpagenr()|, |tabpagewinnr()| and |tabpagebuflist()| to figure out
+ the text to be displayed. Use "%1T" for the first label, "%2T" for
+ the second one, etc. Use "%X" items for closing labels.
+
+ When changing something that is used in 'tabline' that does not
+ trigger it to be updated, use |:redrawtabline|.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+
+ Keep in mind that only one of the tab pages is the current one, others
+ are invisible and you can't jump to their windows.
+
+
+ *'tabpagemax'* *'tpm'*
+'tabpagemax' 'tpm' number (default 10)
+ global
+ Maximum number of tab pages to be opened by the |-p| command line
+ argument or the ":tab all" command. |tabpage|
+
+
+ *'tabstop'* *'ts'*
+'tabstop' 'ts' number (default 8)
+ local to buffer
+ Number of spaces that a <Tab> in the file counts for. Also see
+ the |:retab| command, and the 'softtabstop' option.
+
+ Note: Setting 'tabstop' to any other value than 8 can make your file
+ appear wrong in many places, e.g., when printing it.
+ The value must be more than 0 and less than 10000.
+
+ There are four main ways to use tabs in Vim:
+ 1. Always keep 'tabstop' at 8, set 'softtabstop' and 'shiftwidth' to 4
+ (or 3 or whatever you prefer) and use 'noexpandtab'. Then Vim
+ will use a mix of tabs and spaces, but typing <Tab> and <BS> will
+ behave like a tab appears every 4 (or 3) characters.
+ 2. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use
+ 'expandtab'. This way you will always insert spaces. The
+ formatting will never be messed up when 'tabstop' is changed.
+ 3. Set 'tabstop' and 'shiftwidth' to whatever you prefer and use a
+ |modeline| to set these values when editing the file again. Only
+ works when using Vim to edit the file.
+ 4. Always set 'tabstop' and 'shiftwidth' to the same value, and
+ 'noexpandtab'. This should then work (for initial indents only)
+ for any tabstop setting that people use. It might be nice to have
+ tabs after the first non-blank inserted as spaces if you do this
+ though. Otherwise aligned comments will be wrong when 'tabstop' is
+ changed.
+
+ If Vim is compiled with the |+vartabs| feature then the value of
+ 'tabstop' will be ignored if |'vartabstop'| is set to anything other
+ than an empty string.
+
+ *'tagbsearch'* *'tbs'* *'notagbsearch'* *'notbs'*
+'tagbsearch' 'tbs' boolean (default on)
+ global
+ When searching for a tag (e.g., for the |:ta| command), Vim can either
+ use a binary search or a linear search in a tags file. Binary
+ searching makes searching for a tag a LOT faster, but a linear search
+ will find more tags if the tags file wasn't properly sorted.
+ Vim normally assumes that your tags files are sorted, or indicate that
+ they are not sorted. Only when this is not the case does the
+ 'tagbsearch' option need to be switched off.
+
+ When 'tagbsearch' is on, binary searching is first used in the tags
+ files. In certain situations, Vim will do a linear search instead for
+ certain files, or retry all files with a linear search. When
+ 'tagbsearch' is off, only a linear search is done.
+
+ Linear searching is done anyway, for one file, when Vim finds a line
+ at the start of the file indicating that it's not sorted: >
+ !_TAG_FILE_SORTED 0 /some comment/
+< [The whitespace before and after the '0' must be a single <Tab>]
+
+ When a binary search was done and no match was found in any of the
+ files listed in 'tags', and case is ignored or a pattern is used
+ instead of a normal tag name, a retry is done with a linear search.
+ Tags in unsorted tags files, and matches with different case will only
+ be found in the retry.
+
+ If a tag file indicates that it is case-fold sorted, the second,
+ linear search can be avoided when case is ignored. Use a value of '2'
+ in the "!_TAG_FILE_SORTED" line for this. A tag file can be case-fold
+ sorted with the -f switch to "sort" in most unices, as in the command:
+ "sort -f -o tags tags". For Universal ctags and Exuberant ctags
+ version 5.x or higher (at least 5.5) the --sort=foldcase switch can be
+ used for this as well. Note that case must be folded to uppercase for
+ this to work.
+
+ 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
+ files may only be found with 'tagbsearch' off.
+ When the tags file is not sorted, or sorted in a wrong way (not on
+ ASCII byte value), 'tagbsearch' should be off, or the line given above
+ must be included in the tags file.
+ This option doesn't affect commands that find all matching tags (e.g.,
+ command-line completion and ":help").
+
+ *'tagcase'* *'tc'*
+'tagcase' 'tc' string (default "followic")
+ global or local to buffer |global-local|
+ 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
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'tagfunc'* *'tfu'*
+'tagfunc' 'tfu' string (default: empty)
+ local to buffer
+ {not available when compiled without the |+eval|
+ feature}
+ This option specifies a function to be used to perform tag searches.
+ The function gets the tag pattern and should return a List of matching
+ tags. See |tag-function| for an explanation of how to write the
+ function and an example. The value can be the name of a function, a
+ |lambda| or a |Funcref|. See |option-value-function| for more
+ information.
+
+ *'taglength'* *'tl'*
+'taglength' 'tl' number (default 0)
+ global
+ If non-zero, tags are significant up to this number of characters.
+
+ *'tagrelative'* *'tr'* *'notagrelative'* *'notr'*
+'tagrelative' 'tr' boolean (Vim default: on, Vi default: off)
+ global
+ If on and using a tags file in another directory, file names in that
+ tags file are relative to the directory where the tags file is.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'tags'* *'tag'* *E433*
+'tags' 'tag' string (default "./tags,tags", when compiled with
+ |+emacs_tags|: "./tags,./TAGS,tags,TAGS")
+ global or local to buffer |global-local|
+ Filenames for the tag command, separated by spaces or commas. To
+ include a space or comma in a file name, precede it with a backslash
+ (see |option-backslash| about including spaces and backslashes).
+ When a file name starts with "./", the '.' is replaced with the path
+ of the current file. But only when the 'd' flag is not included in
+ 'cpoptions'. Environment variables are expanded |:set_env|. Also see
+ |tags-option|.
+ "*", "**" and other wildcards can be used to search for tags files in
+ 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?".
+ The |tagfiles()| function can be used to get a list of the file names
+ actually used.
+ If Vim was compiled with the |+emacs_tags| feature, Emacs-style tag
+ files are also supported. They are automatically recognized. The
+ default value becomes "./tags,./TAGS,tags,TAGS", unless case
+ differences are ignored (MS-Windows). |emacs-tags|
+ The use of |:set+=| and |:set-=| is preferred when adding or removing
+ file names from the list. This avoids problems when a future version
+ uses another default.
+
+ *'tagstack'* *'tgst'* *'notagstack'* *'notgst'*
+'tagstack' 'tgst' boolean (default on)
+ global
+ When on, the |tagstack| is used normally. When off, a ":tag" or
+ ":tselect" command with an argument will not push the tag onto the
+ tagstack. A following ":tag" without an argument, a ":pop" command or
+ any other command that uses the tagstack will use the unmodified
+ tagstack, but does change the pointer to the active entry.
+ Resetting this option is useful when using a ":tag" command in a
+ mapping which should not change the tagstack.
+
+ *'tcldll'*
+'tcldll' string (default depends on the build)
+ global
+ {only available when compiled with the |+tcl/dyn|
+ feature}
+ Specifies the name of the Tcl shared library. The default is
+ DYNAMIC_TCL_DLL, which was specified at compile time.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'term'* *E529* *E530* *E531*
+'term' string (default is $TERM, if that fails:
+ in the GUI: "builtin_gui"
+ on Amiga: "amiga"
+ on Haiku: "xterm"
+ on Mac: "mac-ansi"
+ on Unix: "ansi"
+ on VMS: "ansi"
+ on Win 32: "win32")
+ global
+ Name of the terminal. Used for choosing the terminal control
+ characters. Environment variables are expanded |:set_env|.
+ For example: >
+ :set term=$TERM
+< See |termcap|.
+
+ *'termbidi'* *'tbidi'*
+ *'notermbidi'* *'notbidi'*
+'termbidi' 'tbidi' boolean (default off, on for "mlterm")
+ global
+ {only available when compiled with the |+arabic|
+ feature}
+ The terminal is in charge of Bi-directionality of text (as specified
+ by Unicode). The terminal is also expected to do the required shaping
+ that some languages (such as Arabic) require.
+ Setting this option implies that 'rightleft' will not be set when
+ 'arabic' is set and the value of 'arabicshape' will be ignored.
+ Note that setting 'termbidi' has the immediate effect that
+ 'arabicshape' is ignored, but 'rightleft' isn't changed automatically.
+ This option is reset when the GUI is started.
+ For further details see |arabic.txt|.
+
+ *'termencoding'* *'tenc'*
+'termencoding' 'tenc' string (default ""; with GTK+ GUI: "utf-8")
+ global
+ Encoding used for the terminal. This specifies what character
+ encoding the keyboard produces and the display will understand. For
+ the GUI it only applies to the keyboard ('encoding' is used for the
+ display).
+ *E617* *E950*
+ Note: This does not apply to the GTK+ GUI. After the GUI has been
+ successfully initialized, 'termencoding' is forcibly set to "utf-8".
+ Any attempts to set a different value will be rejected, and an error
+ message is shown.
+ For the Win32 GUI and console versions 'termencoding' is not used,
+ because the Win32 system always passes Unicode characters.
+ When empty, the same encoding is used as for the 'encoding' option.
+ This is the normal value.
+ Not all combinations for 'termencoding' and 'encoding' are valid. See
+ |encoding-table|.
+ The value for this option must be supported by internal conversions or
+ iconv(). When this is not possible no conversion will be done and you
+ will probably experience problems with non-ASCII characters.
+ Example: You are working with the locale set to euc-jp (Japanese) and
+ want to edit a UTF-8 file: >
+ :let &termencoding = &encoding
+ :set encoding=utf-8
+< You need to do this when your system has no locale support for UTF-8.
+
+ *'termguicolors'* *'tgc'* *'notermguicolors'* *'notgc'* *E954*
+'termguicolors' 'tgc' boolean (default off)
+ global
+ {not available when compiled without the
+ |+termguicolors| feature}
+ When on, uses |highlight-guifg| and |highlight-guibg| attributes in
+ the terminal (thus using 24-bit color).
+
+ Requires a ISO-8613-3 compatible terminal. If setting this option
+ does not work (produces a colorless UI) reading |xterm-true-color|
+ might help.
+
+ For Win32 console, Windows 10 version 1703 (Creators Update) or later
+ is required. Use this check to find out: >
+ if has('vcon')
+< This requires Vim to be built with the |+vtp| feature.
+
+ Note that the "cterm" attributes are still used, not the "gui" ones.
+
+ When using Vim with Windows Terminal, the background of Windows
+ Terminal is normally filled with the Vim background color. Setting
+ 'termguicolors' and the guibg of the Normal highlight group to NONE
+ will make the background transparent: >
+ :hi Normal guibg=NONE
+<
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'termwinkey'* *'twk'*
+'termwinkey' 'twk' string (default "")
+ local to window
+ The key that starts a CTRL-W command in a terminal window. Other keys
+ are sent to the job running in the window.
+ The <> notation can be used, e.g.: >
+ :set termwinkey=<C-L>
+< The string must be one key stroke but can be multiple bytes.
+ When not set CTRL-W is used, so that CTRL-W : gets you to the command
+ line. If 'termwinkey' is set to CTRL-L then CTRL-L : gets you to the
+ command line.
+
+ *'termwinscroll'* *'twsl'*
+'termwinscroll' 'twsl' number (default 10000)
+ local to buffer
+ {not available when compiled without the
+ |+terminal| feature}
+ Number of scrollback lines to keep. When going over this limit the
+ first 10% of the scrollback lines are deleted. This is just to reduce
+ the memory usage. See |Terminal-Normal|.
+ Also used as a limit for text sent to the terminal in one write,
+ multiplied by the number of columns times 3 (average number of bytes
+ per cell).
+
+ *'termwinsize'* *'tws'*
+'termwinsize' 'tws' string (default "")
+ local to window
+ Size used when opening the |terminal| window. Format:
+ {rows}x{columns} or {rows}*{columns}.
+ - When empty the terminal gets the size from the window.
+ - When set with a "x" (e.g., "24x80") the terminal size is not
+ adjusted to the window size. If the window is smaller only the
+ top-left part is displayed.
+ - When set with a "*" (e.g., "10*50") the terminal size follows the
+ window size, but will not be smaller than the specified rows and/or
+ columns.
+ - When rows is zero then use the height of the window.
+ - When columns is zero then use the width of the window.
+ - Using "0x0" or "0*0" is the same as empty.
+ - Can be overruled in the |term_start()| options with "term_rows" and
+ "term_cols".
+
+ Examples:
+ "30x0" uses 30 rows and the current window width.
+ "20*0" uses at least 20 rows and the current window width.
+ "0*40" uses the current window height and at least 40 columns.
+ Note that the command running in the terminal window may still change
+ the size of the terminal. In that case the Vim window will be
+ adjusted to that size, if possible.
+
+ *'termwintype'* *'twt'*
+'termwintype' 'twt' string (default "")
+ global
+ {only available when compiled with the |terminal|
+ feature on MS-Windows}
+ Specify the virtual console (pty) used when opening the terminal
+ window.
+
+ Possible values are:
+ "" use ConPTY if it is stable, winpty otherwise
+ "winpty" use winpty, fail if not supported
+ "conpty" use |ConPTY|, fail if not supported
+
+ |ConPTY| support depends on the platform. Windows 10 October 2018
+ Update is the first version that supports ConPTY, however it is still
+ considered unstable. ConPTY might become stable in the next release
+ of Windows 10. winpty support needs to be installed. If neither is
+ supported then you cannot open a terminal window.
+
+ *'terse'* *'noterse'*
+'terse' boolean (default off)
+ global
+ When set: Add 's' flag to 'shortmess' option (this makes the message
+ for a search that hits the start or end of the file not being
+ displayed). When reset: Remove 's' flag from 'shortmess' option. {Vi
+ shortens a lot of messages}
+
+ *'textauto'* *'ta'* *'notextauto'* *'nota'*
+'textauto' 'ta' boolean (Vim default: on, Vi default: off)
+ global
+ This option is obsolete. Use 'fileformats'.
+ For backwards compatibility, when 'textauto' is set, 'fileformats' is
+ set to the default value for the current system. When 'textauto' is
+ reset, 'fileformats' is made empty.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'textmode'* *'tx'* *'notextmode'* *'notx'*
+'textmode' 'tx' boolean (Win32: default on,
+ others: default off)
+ local to buffer
+ This option is obsolete. Use 'fileformat'.
+ For backwards compatibility, when 'textmode' is set, 'fileformat' is
+ set to "dos". When 'textmode' is reset, 'fileformat' is set to
+ "unix".
+
+ *'textwidth'* *'tw'*
+'textwidth' 'tw' number (default 0)
+ local to buffer
+ Maximum width of text that is being inserted. A longer line will be
+ broken after white space to get this width. A zero value disables
+ this.
+ 'textwidth' is set to 0 when the 'paste' option is set and restored
+ when 'paste' is reset.
+ When 'textwidth' is zero, 'wrapmargin' may be used. See also
+ 'formatoptions' and |ins-textwidth|.
+ When 'formatexpr' is set it will be used to break the line.
+ NOTE: This option is set to 0 when 'compatible' is set.
+
+ *'thesaurus'* *'tsr'*
+'thesaurus' 'tsr' string (default "")
+ global or local to buffer |global-local|
+ List of file names, separated by commas, that are used to lookup words
+ for thesaurus completion commands |i_CTRL-X_CTRL-T|. See
+ |compl-thesaurus|.
+
+ This option is not used if 'thesaurusfunc' is set, either for the
+ buffer or globally.
+
+ 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
+ name. See |option-backslash| about using backslashes. The use of
+ |:set+=| and |:set-=| is preferred when adding or removing directories
+ from the list. This avoids problems when a future version uses
+ another default. Backticks cannot be used in this option for security
+ reasons.
+
+ *'thesaurusfunc'* *'tsrfu'*
+'thesaurusfunc' 'tsrfu' string (default: empty)
+ global or local to buffer |global-local|
+ {not available when compiled without the |+eval|
+ feature}
+ This option specifies a function to be used for thesaurus completion
+ with CTRL-X CTRL-T. |i_CTRL-X_CTRL-T| See |compl-thesaurusfunc|.
+ The value can be the name of a function, a |lambda| or a |Funcref|.
+ See |option-value-function| for more information.
+
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'tildeop'* *'top'* *'notildeop'* *'notop'*
+'tildeop' 'top' boolean (default off)
+ global
+ When on: The tilde command "~" behaves like an operator.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'timeout'* *'to'* *'notimeout'* *'noto'*
+'timeout' 'to' boolean (default on)
+ global
+ *'ttimeout'* *'nottimeout'*
+'ttimeout' boolean (default off, set in |defaults.vim|)
+ global
+ These two options together determine the behavior when part of a
+ mapped key sequence or keyboard code has been received:
+
+ 'timeout' 'ttimeout' action ~
+ off off do not time out
+ on on or off time out on :mappings and key codes
+ off on time out on key codes
+
+ If both options are off, Vim will wait until either the complete
+ mapping or key sequence has been received, or it is clear that there
+ is no mapping or key sequence for the received characters. For
+ example: if you have mapped "vl" and Vim has received 'v', the next
+ character is needed to see if the 'v' is followed by an 'l'.
+ When one of the options is on, Vim will wait for about 1 second for
+ the next character to arrive. After that the already received
+ characters are interpreted as single characters. The waiting time can
+ be changed with the 'timeoutlen' option.
+ On slow terminals or very busy systems timing out may cause
+ malfunctioning cursor keys. If both options are off, Vim waits
+ forever after an entered <Esc> if there are key codes that start
+ with <Esc>. You will have to type <Esc> twice. If you do not have
+ problems with key codes, but would like to have :mapped key
+ sequences not timing out in 1 second, set the 'ttimeout' option and
+ reset the 'timeout' option.
+
+ NOTE: 'ttimeout' is reset when 'compatible' is set.
+
+ *'timeoutlen'* *'tm'*
+'timeoutlen' 'tm' number (default 1000)
+ global
+
+ *'ttimeoutlen'* *'ttm'*
+'ttimeoutlen' 'ttm' number (default -1, set to 100 in |defaults.vim|)
+ global
+ The time in milliseconds that is waited for a key code or mapped key
+ sequence to complete. Also used for CTRL-\ CTRL-N and CTRL-\ CTRL-G
+ when part of a command has been typed.
+ Normally only 'timeoutlen' is used and 'ttimeoutlen' is -1. When a
+ different timeout value for key codes is desired set 'ttimeoutlen' to
+ a non-negative number.
+
+ ttimeoutlen mapping delay key code delay ~
+ < 0 'timeoutlen' 'timeoutlen'
+ >= 0 'timeoutlen' 'ttimeoutlen'
+
+ The timeout only happens when the 'timeout' and 'ttimeout' options
+ tell so. A useful setting would be >
+ :set timeout timeoutlen=3000 ttimeoutlen=100
+< (time out on mapping after three seconds, time out on key codes after
+ a tenth of a second).
+
+ *'title'* *'notitle'*
+'title' boolean (default off, on when title can be restored)
+ global
+ 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
+ Where:
+ filename the name of the file being edited
+ - indicates the file cannot be modified, 'ma' off
+ + indicates the file was modified
+ = 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 Amiga console, Win32 console, all GUI versions and
+ terminals with a non-empty 't_ts' option - these are Unix xterm and
+ iris-ansi by default, where 't_ts' is taken from the builtin termcap).
+ *X11*
+ When Vim was compiled with HAVE_X11 defined, the original title will
+ be restored if possible. The output of ":version" will include "+X11"
+ when HAVE_X11 was defined, otherwise it will be "-X11". This also
+ works for the icon name |'icon'|.
+ But: When Vim was started with the |-X| argument, restoring the title
+ will not work (except in the GUI).
+ If the title cannot be restored, it is set to the value of 'titleold'.
+ You might want to restore the title outside of Vim then.
+ When using an xterm from a remote machine you can use this command:
+ rsh machine_name xterm -display $DISPLAY &
+ then the WINDOWID environment variable should be inherited and the
+ title of the window should change back to what it should be after
+ exiting Vim.
+
+ *'titlelen'*
+'titlelen' number (default 85)
+ global
+ 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.
+ Using a percentage makes this adapt to the width of the window. But
+ it won't work perfectly, because the actual number of characters
+ available also depends on the font used and other things in the title
+ bar. When 'titlelen' is zero the full path is used. Otherwise,
+ values from 1 to 30000 percent can be used.
+ 'titlelen' is also used for the 'titlestring' option.
+
+ *'titleold'*
+'titleold' string (default "Thanks for flying Vim")
+ global
+ 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.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+ *'titlestring'*
+'titlestring' string (default "")
+ global
+ 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
+ Amiga console, Win32 console, all GUI versions and terminals with a
+ non-empty 't_ts' option).
+ When Vim was compiled with HAVE_X11 defined, the original title will
+ be restored if possible, see |X11|.
+
+ When this option contains printf-style '%' items, they will be
+ expanded according to the rules used for 'statusline'.
+ This option cannot be set in a modeline when 'modelineexpr' is off.
+
+ Example: >
+ :auto BufEnter * let &titlestring = hostname() .. "/" .. expand("%:p")
+ :set title titlestring=%<%F%=%l/%L-%P titlelen=70
+< The value of 'titlelen' is used to align items in the middle or right
+ of the available space.
+ Some people prefer to have the file name first: >
+ :set titlestring=%t%(\ %M%)%(\ (%{expand(\"%:~:.:h\")})%)%(\ %a%)
+< Note the use of "%{ }" and an expression to get the path of the file,
+ without the file name. The "%( %)" constructs are used to add a
+ 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' string (default "icons,tooltips")
+ global
+ {only for |+GUI_GTK|, |+GUI_Motif| and |+GUI_Photon|}
+ The contents of this option controls various toolbar settings. The
+ possible values are:
+ icons Toolbar buttons are shown with icons.
+ text Toolbar buttons shown with text.
+ horiz Icon and text of a toolbar button are
+ horizontally arranged. {only in GTK+ 2 GUI}
+ tooltips Tooltips are active for toolbar buttons.
+ Tooltips refer to the popup help text which appears after the mouse
+ cursor is placed over a toolbar button for a brief moment.
+
+ If you want the toolbar to be shown with icons as well as text, do the
+ following: >
+ :set tb=icons,text
+< Motif cannot display icons and text at the same time. They
+ will show icons if both are requested.
+
+ If none of the strings specified in 'toolbar' are valid or if
+ 'toolbar' is empty, this option is ignored. If you want to disable
+ the toolbar, you need to set the 'guioptions' option. For example: >
+ :set guioptions-=T
+< Also see |gui-toolbar|.
+
+ *'toolbariconsize'* *'tbis'*
+'toolbariconsize' 'tbis' string (default "small")
+ global
+ {only in the GTK+ GUI}
+ Controls the size of toolbar icons. The possible values are:
+ tiny Use tiny icons.
+ small Use small icons (default).
+ medium Use medium-sized icons.
+ large Use large icons.
+ huge Use even larger icons.
+ giant Use very big icons.
+ The exact dimensions in pixels of the various icon sizes depend on
+ the current theme. Common dimensions are giant=48x48, huge=32x32,
+ large=24x24, medium=24x24, small=20x20 and tiny=16x16.
+
+ If 'toolbariconsize' is empty, the global default size as determined
+ by user preferences or the current theme is used.
+
+ *'ttybuiltin'* *'tbi'* *'nottybuiltin'* *'notbi'*
+'ttybuiltin' 'tbi' boolean (default on)
+ global
+ When on, the builtin termcaps are searched before the external ones.
+ When off the builtin termcaps are searched after the external ones.
+ When this option is changed, you should set the 'term' option next for
+ the change to take effect, for example: >
+ :set notbi term=$TERM
+< See also |termcap|.
+ Rationale: The default for this option is "on", because the builtin
+ termcap entries are generally better (many systems contain faulty
+ xterm entries...).
+
+ *'ttyfast'* *'tf'* *'nottyfast'* *'notf'*
+'ttyfast' 'tf' boolean (default on)
+ global
+ Indicates a fast terminal connection. More characters will be sent to
+ the screen for redrawing, instead of using insert/delete line
+ commands. Improves smoothness of redrawing when there are multiple
+ windows and the terminal does not support a scrolling region.
+ Also enables the extra writing of characters at the end of each screen
+ line for lines that wrap. This helps when using copy/paste with the
+ mouse in an xterm and other terminals.
+
+ The default used to be set only for some terminal names, but these
+ days nearly all terminals are fast, therefore the default is now "on".
+ If you have a slow connection you may want to set this option off,
+ e.g. depending on the host name: >
+ if hostname() =~ 'faraway'
+ set nottyfast
+ endif
+<
+ *'ttymouse'* *'ttym'*
+'ttymouse' 'ttym' string (default depends on 'term')
+ global
+ {only in Unix and VMS, doesn't work in the GUI; not
+ available when compiled without |+mouse|}
+ Name of the terminal type for which mouse codes are to be recognized.
+ Currently these strings are valid:
+ *xterm-mouse*
+ xterm xterm-like mouse handling. The mouse generates
+ "<Esc>[Mscr", where "scr" is three bytes:
+ "s" = button state
+ "c" = column plus 33
+ "r" = row plus 33
+ This only works up to 223 columns! See "dec",
+ "urxvt", and "sgr" for solutions.
+ xterm2 Works like "xterm", but with the xterm reporting the
+ mouse position while the mouse is dragged. This works
+ much faster and more precise. Your xterm must at
+ least at patchlevel 88 / XFree 3.3.3 for this to
+ work. See below for how Vim detects this
+ automatically.
+ *netterm-mouse*
+ netterm NetTerm mouse handling. A left mouse click generates
+ "<Esc>}r,c<CR>", where "r,c" are two decimal numbers
+ for the row and column. No other mouse events are
+ supported.
+ *dec-mouse*
+ dec DEC terminal mouse handling. The mouse generates a
+ rather complex sequence, starting with "<Esc>[".
+ This is also available for an Xterm, if it was
+ configured with "--enable-dec-locator".
+ *jsbterm-mouse*
+ jsbterm JSB term mouse handling.
+ *pterm-mouse*
+ pterm QNX pterm mouse handling.
+ *urxvt-mouse*
+ urxvt Mouse handling for the urxvt (rxvt-unicode) terminal.
+ The mouse works only if the terminal supports this
+ encoding style, but it does not have 223 columns limit
+ unlike "xterm" or "xterm2".
+ *sgr-mouse*
+ sgr Mouse handling for the terminal that emits SGR-styled
+ mouse reporting. The mouse works even in columns
+ beyond 223. This option is backward compatible with
+ "xterm2" because it can also decode "xterm2" style
+ mouse codes.
+
+ The mouse handling must be enabled at compile time |+mouse_xterm|
+ |+mouse_dec| |+mouse_netterm| |+mouse_jsbterm| |+mouse_urxvt|
+ |+mouse_sgr|.
+ Only "xterm"(2) is really recognized. NetTerm mouse codes are always
+ recognized, if enabled at compile time. DEC terminal mouse codes
+ are recognized if enabled at compile time, and 'ttymouse' is not
+ "xterm", "xterm2", "urxvt" or "sgr" (because dec mouse codes conflict
+ with them).
+ This option is automatically set to "xterm", when the 'term' option is
+ set to a name that starts with "xterm", "mlterm", "screen", "tmux",
+ "st" (full match only), "st-" or "stterm", and 'ttymouse' is not set
+ already.
+ If the terminfo/termcap entry "XM" exists and the first number is
+ "1006" then 'ttymouse' will be set to "sgr". This works for many
+ modern terminals.
+ Additionally, if vim is compiled with the |+termresponse| feature and
+ |t_RV| is set to the escape sequence to request the xterm version
+ number, more intelligent detection is done.
+ The "xterm2" value will be set if the xterm version is reported to be
+ from 95 to 276. The "sgr" value will be set if Vim detects Mac
+ Terminal.app, iTerm2 or mintty, and when the xterm version is 277 or
+ higher.
+ If you do not want 'ttymouse' to be set to "xterm2" or "sgr"
+ automatically, set t_RV to an empty string: >
+ :set t_RV=
+<
+ *'ttyscroll'* *'tsl'*
+'ttyscroll' 'tsl' number (default 999)
+ global
+ Maximum number of lines to scroll the screen. If there are more lines
+ to scroll the window is redrawn. For terminals where scrolling is
+ very slow and redrawing is not slow this can be set to a small number,
+ e.g., 3, to speed up displaying.
+
+ *'ttytype'* *'tty'*
+'ttytype' 'tty' string (default from $TERM)
+ global
+ Alias for 'term', see above.
+
+ *'undodir'* *'udir'*
+'undodir' 'udir' string (default ".")
+ 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
+ "file.txt" is ".file.txt.un~".
+ For other directories the file name is the full path of the edited
+ file, with path separators replaced with "%".
+ When writing: The first directory that exists is used. "." always
+ works, no directories after "." will be used for writing.
+ When reading all entries are tried to find an undo file. The first
+ undo file that exists is used. When it cannot be read an error is
+ given, no further entry is used.
+ See |undo-persistence|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'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.
+ The directory where the undo file is stored is specified by 'undodir'.
+ For more information about this feature see |undo-persistence|.
+ The undo file is not read when 'undoreload' causes the buffer from
+ before a reload to be saved for undo.
+ When 'undofile' is turned off the undo file is NOT deleted.
+ NOTE: This option is reset when 'compatible' is set.
+
+ *'undolevels'* *'ul'*
+'undolevels' 'ul' number (default 100, 1000 for Unix, VMS and Win32)
+ global or local to buffer |global-local|
+ Maximum number of changes that can be undone. Since undo information
+ is kept in memory, higher numbers will cause more memory to be used.
+ Nevertheless, a single change can already use a large amount of memory.
+ Set to 0 for Vi compatibility: One level of undo and "u" undoes
+ itself: >
+ set ul=0
+< But you can also get Vi compatibility by including the 'u' flag in
+ 'cpoptions', and still be able to use CTRL-R to repeat undo.
+ Also see |undo-two-ways|.
+ Set to -1 for no undo at all. You might want to do this only for the
+ current buffer: >
+ setlocal ul=-1
+< This helps when you run out of memory for a single change.
+
+ The local value is set to -123456 when the global value is to be used.
+
+ Also see |clear-undo|.
+
+ *'undoreload'* *'ur'*
+'undoreload' 'ur' number (default 10000)
+ global
+ 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 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.
+
+ When saving undo for a reload, any undo file is not read.
+
+ Note that this causes the whole buffer to be stored in memory. Set
+ this option to a lower value if you run out of memory.
+
+ *'updatecount'* *'uc'*
+'updatecount' 'uc' number (default: 200)
+ global
+ After typing this many characters the swap file will be written to
+ disk. When zero, no swap file will be created at all (see chapter on
+ recovery |crash-recovery|). 'updatecount' is set to zero by starting
+ Vim with the "-n" option, see |startup|. When editing in readonly
+ mode this option will be initialized to 10000.
+ The swapfile can be disabled per buffer with |'swapfile'|.
+ When 'updatecount' is set from zero to non-zero, swap files are
+ created for all buffers that have 'swapfile' set. When 'updatecount'
+ is set to zero, existing swap files are not deleted.
+ Also see |'swapsync'|.
+ This option has no meaning in buffers where |'buftype'| is "nofile"
+ or "nowrite".
+
+ *'updatetime'* *'ut'*
+'updatetime' 'ut' number (default 4000)
+ global
+ If this many milliseconds nothing is typed the swap file will be
+ written to disk (see |crash-recovery|). Also used for the
+ |CursorHold| autocommand event.
+
+ *'varsofttabstop'* *'vsts'*
+'varsofttabstop' 'vsts' string (default "")
+ local to buffer
+ {only available when compiled with the |+vartabs|
+ feature}
+ A list of the number of spaces that a <Tab> counts for while editing,
+ such as inserting a <Tab> or using <BS>. It "feels" like variable-
+ width <Tab>s are being inserted, while in fact a mixture of spaces
+ and <Tab>s is used. Tab widths are separated with commas, with the
+ final value applying to all subsequent tabs.
+
+ For example, when editing assembly language files where statements
+ start in the 9th column and comments in the 41st, it may be useful
+ to use the following: >
+ :set varsofttabstop=8,32,8
+< This will set soft tabstops with 8 and 8 + 32 spaces, and 8 more
+ for every column thereafter.
+
+ Note that the value of |'softtabstop'| will be ignored while
+ 'varsofttabstop' is set.
+
+ *'vartabstop'* *'vts'*
+'vartabstop' 'vts' string (default "")
+ local to buffer
+ {only available when compiled with the |+vartabs|
+ feature}
+ A list of the number of spaces that a <Tab> in the file counts for,
+ separated by commas. Each value corresponds to one tab, with the
+ final value applying to all subsequent tabs. For example: >
+ :set vartabstop=4,20,10,8
+< This will make the first tab 4 spaces wide, the second 20 spaces,
+ the third 10 spaces, and all following tabs 8 spaces.
+
+ Note that the value of |'tabstop'| will be ignored while 'vartabstop'
+ is set.
+
+ *'verbose'* *'vbs'*
+'verbose' 'vbs' number (default 0)
+ global
+ When bigger than zero, Vim will give messages about what it is doing.
+ Currently, these messages are given:
+ >= 1 When the viminfo file is read or written.
+ >= 2 When a file is ":source"'ed.
+ >= 4 Shell commands.
+ >= 5 Every searched tags file and include file.
+ >= 8 Files for which a group of autocommands is executed.
+ >= 9 Every executed autocommand.
+ >= 11 Finding items in a path
+ >= 12 Every executed function.
+ >= 13 When an exception is thrown, caught, finished, or discarded.
+ >= 14 Anything pending in a ":finally" clause.
+ >= 15 Every executed Ex command from a script (truncated at 200
+ characters).
+ >= 16 Every executed Ex command.
+
+ This option can also be set with the "-V" argument. See |-V|.
+ This option is also set by the |:verbose| command.
+
+ When the 'verbosefile' option is set then the verbose messages are not
+ displayed.
+
+ *'verbosefile'* *'vfile'*
+'verbosefile' 'vfile' string (default empty)
+ global
+ When not empty all messages are written in a file with this name.
+ When the file exists messages are appended.
+ Writing to the file ends when Vim exits or when 'verbosefile' is made
+ empty. Writes are buffered, thus may not show up for some time.
+ Setting 'verbosefile' to a new value is like making it empty first.
+ The difference with |:redir| is that verbose messages are not
+ displayed when 'verbosefile' is set.
+
+ *'viewdir'* *'vdir'*
+'viewdir' 'vdir' string (default for Amiga and Win32:
+ "$VIM/vimfiles/view",
+ for Unix: "~/.vim/view",
+ for macOS: "$VIM:vimfiles:view"
+ for VMS: "sys$login:vimfiles/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,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
+ folds manually created folds, opened/closed folds and local
+ fold options
+ options options and mappings local to a window or buffer (not
+ global values for local options)
+ localoptions same as "options"
+ slash backslashes in file names replaced with forward
+ slashes
+ unix with Unix end-of-line format (single <NL>), even when
+ on MS-Windows
+ curdir the window-local directory, if set with `:lcd`
+
+ "slash" and "unix" are useful on MS-Windows when sharing view files
+ with Unix. The Unix version of Vim cannot source dos format scripts,
+ but the MS-Windows version of Vim can source unix format scripts.
+
+ *'viminfo'* *'vi'* *E526* *E527* *E528*
+'viminfo' 'vi' string (Vi default: "", Vim default for
+ MS-Windows: '100,<50,s10,h,rA:,rB:,
+ for Amiga: '100,<50,s10,h,rdf0:,rdf1:,rdf2:
+ for others: '100,<50,s10,h)
+ global
+ {not available when compiled without the |+viminfo|
+ feature}
+ When non-empty, the viminfo file is read upon startup and written
+ when exiting Vim (see |viminfo-file|). Except when 'viminfofile' is
+ "NONE".
+ The string should be a comma-separated list of parameters, each
+ consisting of a single character identifying the particular parameter,
+ followed by a number or string which specifies the value of that
+ parameter. If a particular character is left out, then the default
+ value is used for that parameter. The following is a list of the
+ identifying characters and the effect of their value.
+ CHAR VALUE ~
+ *viminfo-!*
+ ! When included, save and restore global variables that start
+ with an uppercase letter, and don't contain a lowercase
+ letter. Thus "KEEPTHIS and "K_L_M" are stored, but "KeepThis"
+ and "_K_L_M" are not. Nested List and Dict items may not be
+ read back correctly, you end up with an empty item.
+ *viminfo-quote*
+ " Maximum number of lines saved for each register. Old name of
+ the '<' item, with the disadvantage that you need to put a
+ backslash before the ", otherwise it will be recognized as the
+ start of a comment!
+ *viminfo-%*
+ % When included, save and restore the buffer list. If Vim is
+ started with a file name argument, the buffer list is not
+ restored. If Vim is started without a file name argument, the
+ buffer list is restored from the viminfo file. Quickfix
+ ('buftype'), unlisted ('buflisted'), unnamed and buffers on
+ removable media (|viminfo-r|) are not saved.
+ When followed by a number, the number specifies the maximum
+ number of buffers that are stored. Without a number all
+ buffers are stored.
+ *viminfo-'*
+ ' Maximum number of previously edited files for which the marks
+ are remembered. This parameter must always be included when
+ 'viminfo' is non-empty.
+ Including this item also means that the |jumplist| and the
+ |changelist| are stored in the viminfo file.
+ *viminfo-/*
+ / Maximum number of items in the search pattern history to be
+ saved. If non-zero, then the previous search and substitute
+ patterns are also saved. When not included, the value of
+ 'history' is used.
+ *viminfo-:*
+ : Maximum number of items in the command-line history to be
+ saved. When not included, the value of 'history' is used.
+ *viminfo-<*
+ < Maximum number of lines saved for each register. If zero then
+ registers are not saved. When not included, all lines are
+ saved. '"' is the old name for this item.
+ Also see the 's' item below: limit specified in Kbyte.
+ *viminfo-@*
+ @ Maximum number of items in the input-line history to be
+ saved. When not included, the value of 'history' is used.
+ *viminfo-c*
+ c When included, convert the text in the viminfo file from the
+ 'encoding' used when writing the file to the current
+ 'encoding'. See |viminfo-encoding|.
+ *viminfo-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
+ non-zero, they are all stored. '0 is used for the current
+ cursor position (when exiting or when doing ":wviminfo").
+ *viminfo-h*
+ h Disable the effect of 'hlsearch' when loading the viminfo
+ file. When not included, it depends on whether ":nohlsearch"
+ has been used since the last search command.
+ *viminfo-n*
+ n Name of the viminfo file. The name must immediately follow
+ the 'n'. Must be at the end of the option! If the
+ 'viminfofile' option is set, that file name overrides the one
+ given here with 'viminfo'. Environment variables are
+ expanded when opening the file, not when setting the option.
+ *viminfo-r*
+ r Removable media. The argument is a string (up to the next
+ ','). This parameter can be given several times. Each
+ specifies the start of a path for which no marks will be
+ stored. This is to avoid removable media. For MS-Windows you
+ could use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:". You can
+ also use it for temp files, e.g., for Unix: "r/tmp". Case is
+ ignored. Maximum length of each 'r' argument is 50
+ characters.
+ *viminfo-s*
+ s Maximum size of an item in Kbyte. If zero then registers are
+ not saved. Currently only applies to registers. The default
+ "s10" will exclude registers with more than 10 Kbyte of text.
+ Also see the '<' item above: line count limit.
+
+ Example: >
+ :set viminfo='50,<1000,s100,:0,n~/vim/viminfo
+<
+ '50 Marks will be remembered for the last 50 files you
+ edited.
+ <1000 Contents of registers (up to 1000 lines each) will be
+ remembered.
+ s100 Registers with more than 100 Kbyte text are skipped.
+ :0 Command-line history will not be saved.
+ n~/vim/viminfo The name of the file to use is "~/vim/viminfo".
+ no / Since '/' is not specified, the default will be used,
+ that is, save all of the search history, and also the
+ previous search and substitute patterns.
+ no % The buffer list will not be saved nor read back.
+ no h 'hlsearch' highlighting will be restored.
+
+ When setting 'viminfo' from an empty value you can use |:rviminfo| to
+ load the contents of the file, this is not done automatically.
+
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+ NOTE: This option is set to the Vim default value when 'compatible'
+ is reset.
+
+ *'viminfofile'* *'vif'*
+'viminfofile' 'vif' string (default: "")
+ global
+ {not available when compiled without the |+viminfo|
+ feature}
+ When non-empty, overrides the file name used for viminfo.
+ When equal to "NONE" no viminfo file will be read or written.
+ This option can be set with the |-i| command line flag. The |--clean|
+ command line flag sets it to "NONE".
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'virtualedit'* *'ve'*
+'virtualedit' 've' string (default "")
+ global or local to window |global-local|
+ A comma-separated list of these words:
+ block Allow virtual editing in Visual block mode.
+ insert Allow virtual editing in Insert mode.
+ all Allow virtual editing in all modes.
+ onemore Allow the cursor to move just past the end of the line
+ none When used as the local value, do not allow virtual
+ editing even when the global value is set. When used
+ as the global value, "none" is the same as "".
+ NONE Alternative spelling of "none".
+
+ Virtual editing means that the cursor can be positioned where there is
+ no actual character. This can be halfway into a tab or beyond the end
+ of the line. Useful for selecting a rectangle in Visual mode and
+ editing a table.
+ "onemore" is not the same, it will only allow moving the cursor just
+ after the last character of the line. This makes some commands more
+ consistent. Previously the cursor was always past the end of the line
+ if the line was empty. But it is far from Vi compatible. It may also
+ break some plugins or Vim scripts. For example because |l| can move
+ the cursor after the last character. Use with care!
+ Using the `$` command will move to the last character in the line, not
+ past it. This may actually move the cursor to the left!
+ The `g$` command will move to the end of the screen line.
+ It doesn't make sense to combine "all" with "onemore", but you will
+ not get a warning for it.
+ When combined with other words, "none" is ignored.
+ NOTE: This option is set to "" when 'compatible' is set.
+
+ *'visualbell'* *'vb'* *'novisualbell'* *'novb'* *beep*
+'visualbell' 'vb' boolean (default off)
+ global
+ Use a 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=
+< If you want a short flash, you can use this on many terminals: >
+ :set vb t_vb=[?5h$<100>[?5l
+< Here $<100> specifies the time, you can use a smaller or bigger value
+ to get a shorter or longer flash.
+
+ Note: Vim will limit the bell to once per half a second. This avoids
+ having to wait for the flashing to finish when there are lots of
+ bells, e.g. on key repeat. This also happens without 'visualbell'
+ set.
+
+ 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.
+
+ Note: When the GUI starts, 't_vb' is reset to its default value. You
+ might want to set it again in your |gvimrc|.
+
+ Does not work on the Amiga, you always get a screen flash.
+ Also see 'errorbells'.
+
+ *'warn'* *'nowarn'*
+'warn' boolean (default on)
+ global
+ Give a warning message when a shell command is used while the buffer
+ has been changed.
+
+ *'weirdinvert'* *'wiv'* *'noweirdinvert'* *'nowiv'*
+'weirdinvert' 'wiv' boolean (default off)
+ global
+ This option has the same effect as the 't_xs' terminal option.
+ It is provided for backwards compatibility with version 4.x.
+ Setting 'weirdinvert' has the effect of making 't_xs' non-empty, and
+ vice versa. Has no effect when the GUI is running.
+
+ *'whichwrap'* *'ww'*
+'whichwrap' 'ww' string (Vim default: "b,s", Vi default: "")
+ global
+ Allow specified keys that move the cursor left/right to move to the
+ previous/next line when the cursor is on the first/last character in
+ the line. Concatenate characters to allow this for these keys:
+ char key mode ~
+ b <BS> Normal and Visual
+ s <Space> Normal and Visual
+ h "h" Normal and Visual (not recommended)
+ l "l" Normal and Visual (not recommended)
+ < <Left> Normal and Visual
+ > <Right> Normal and Visual
+ ~ "~" Normal
+ [ <Left> Insert and Replace
+ ] <Right> Insert and Replace
+ For example: >
+ :set ww=<,>,[,]
+< allows wrap only when cursor keys are used.
+ When the movement keys are used in combination with a delete or change
+ operator, the <EOL> also counts for a character. This makes "3h"
+ different from "3dh" when the cursor crosses the end of a line. This
+ is also true for "x" and "X", because they do the same as "dl" and
+ "dh". If you use this, you may also want to use the mapping
+ ":map <BS> X" to make backspace delete the character in front of the
+ cursor.
+ When 'l' is included and it is used after an operator at the end of a
+ line (not an empty line) then it will not move to the next line. This
+ makes "dl", "cl", "yl" etc. work normally.
+ NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'wildchar'* *'wc'*
+'wildchar' 'wc' number (Vim default: <Tab>, Vi default: CTRL-E)
+ global
+ Character you have to type to start wildcard expansion in the
+ command-line, as specified with 'wildmode'.
+ More info here: |cmdline-completion|.
+ The character is not recognized when used inside a macro. See
+ 'wildcharm' for that.
+ Some keys will not work, such as CTRL-C, <CR> and Enter.
+ Although 'wc' is a number option, you can set it to a special key: >
+ :set wc=<Tab>
+< NOTE: This option is set to the Vi default value when 'compatible' is
+ set and to the Vim default value when 'compatible' is reset.
+
+ *'wildcharm'* *'wcm'*
+'wildcharm' 'wcm' number (default: none (0))
+ global
+ 'wildcharm' works exactly like 'wildchar', except that it is
+ recognized when used inside a macro. You can find "spare" command-line
+ keys suitable for this option by looking at |ex-edit-index|. Normally
+ you'll never actually type 'wildcharm', just use it in mappings that
+ automatically invoke completion mode, e.g.: >
+ :set wcm=<C-Z>
+ :cnoremap ss so $vim/sessions/*.vim<C-Z>
+< Then after typing :ss you can use CTRL-P & CTRL-N.
+
+ *'wildignore'* *'wig'*
+'wildignore' 'wig' string (default "")
+ global
+ 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
+ |globpath()| unless a flag is passed to disable this.
+ The pattern is used like with |:autocmd|, see |autocmd-patterns|.
+ Also see 'suffixes'.
+ Example: >
+ :set wildignore=*.o,*.obj
+< The use of |:set+=| and |:set-=| is preferred when adding or removing
+ a pattern from the list. This avoids problems when a future version
+ uses another default.
+
+
+ *'wildignorecase'* *'wic'* *'nowildignorecase'* *'nowic'*
+'wildignorecase' 'wic' boolean (default off)
+ global
+ When set case is ignored when completing file names and directories.
+ Has no effect when 'fileignorecase' is set.
+ Does not apply when the shell is used to expand wildcards, which
+ happens when there are special characters.
+
+
+ *'wildmenu'* *'wmnu'* *'nowildmenu'* *'nowmnu'*
+'wildmenu' 'wmnu' boolean (default off, set in |defaults.vim|)
+ global
+ 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.
+ When 'wildoptions' contains "pum", then the completion matches are
+ shown in a popup menu. Otherwise they are displayed just above the
+ command line, with the first match highlighted (overwriting the status
+ line, if there is one).
+ Keys that show the previous/next match, such as <Tab> or
+ CTRL-P/CTRL-N, cause the highlight to move to the appropriate match.
+ When 'wildmode' is used, "wildmenu" mode is used where "full" is
+ specified. "longest" and "list" do not start "wildmenu" mode.
+ You can check the current mode with |wildmenumode()|.
+ If there are more matches than can fit in the line, a ">" is shown on
+ the right and/or a "<" is shown on the left. The status line scrolls
+ as needed.
+ The "wildmenu" mode is abandoned when a key is hit that is not used
+ for selecting a completion.
+ While the "wildmenu" is active, not using the popup menu, the
+ following keys have special meanings:
+
+ <Left> <Right> - select previous/next match (like CTRL-P/CTRL-N)
+ <Down> - in filename/menu name completion: move into a
+ subdirectory or submenu.
+ <CR> - in menu completion, when the cursor is just after a
+ dot: move into a submenu.
+ <Up> - in filename/menu name completion: move up into
+ parent directory or parent menu.
+
+ When using the popup menu for command line completion, the following
+ keys have special meanings:
+ <Down> - select next match (like CTRL-N)
+ <Left> - in filename/menu name completion: move up into
+ parent directory or parent menu.
+ <Right> - in filename/menu name completion: move into a
+ subdirectory or submenu.
+ <Up> - select previous match (like CTRL-P)
+ CTRL-E - end completion, go back to what was there before
+ selecting a match.
+ CTRL-N - go to the next entry
+ CTRL-P - go to the previous entry
+ CTRL-Y - accept the currently selected match and stop
+ completion.
+
+ This makes the menus accessible from the console |console-menus|.
+
+ If you prefer the <Left> and <Right> keys to move the cursor instead
+ of selecting a different match, use this: >
+ :cnoremap <Left> <Space><BS><Left>
+ :cnoremap <Right> <Space><BS><Right>
+<
+ The "WildMenu" highlighting is used for displaying the current match
+ |hl-WildMenu|.
+
+ *'wildmode'* *'wim'*
+'wildmode' 'wim' string (Vim default: "full")
+ global
+ Completion mode that is used for the character specified with
+ 'wildchar'. It is a comma-separated list of up to four parts. Each
+ part specifies what to do for each consecutive use of 'wildchar'. The
+ first part specifies the behavior for the first use of 'wildchar',
+ The second part for the second use, etc.
+
+ Each part consists of a colon separated list consisting of the
+ following possible values:
+ "" Complete only the first match.
+ "full" Complete the next full match. After the last match,
+ the original string is used and then the first match
+ again. Will also start 'wildmenu' if it is enabled.
+ "longest" Complete till longest common string. If this doesn't
+ result in a longer string, use the next part.
+ "list" When more than one match, list all matches.
+ "lastused" When completing buffer names and more than one buffer
+ matches, sort buffers by time last used (other than
+ the current buffer).
+ When there is only a single match, it is fully completed in all cases.
+
+ Examples of useful colon-separated values:
+ "longest:full" Like "longest", but also start 'wildmenu' if it is
+ enabled. Will not complete to the next full match.
+ "list:full" When more than one match, list all matches and
+ complete first match.
+ "list:longest" When more than one match, list all matches and
+ complete till longest common string.
+ "list:lastused" When more than one buffer matches, list all matches
+ and sort buffers by time last used (other than the
+ current buffer).
+
+ Examples: >
+ :set wildmode=full
+< Complete first full match, next match, etc. (the default) >
+ :set wildmode=longest,full
+< Complete longest common string, then each full match >
+ :set wildmode=list:full
+< List all matches and complete each full match >
+ :set wildmode=list,full
+< List all matches without completing, then each full match >
+ :set wildmode=longest,list
+< Complete longest common string, then list alternatives.
+ More info here: |cmdline-completion|.
+
+ *'wildoptions'* *'wop'*
+'wildoptions' 'wop' string (default "")
+ global
+ A list of words that change how |cmdline-completion| is done.
+ The following values are supported:
+ fuzzy Use |fuzzy-matching| to find completion matches. When
+ this value is specified, wildcard expansion will not
+ be used for completion. The matches will be sorted by
+ the "best match" rather than alphabetically sorted.
+ This will find more matches than the wildcard
+ expansion. Currently fuzzy matching based completion
+ is not supported for file and directory names and
+ instead wildcard expansion is used.
+ pum Display the completion matches using the popup menu
+ in the same style as the |ins-completion-menu|.
+ tagfile When using CTRL-D to list matching tags, the kind of
+ tag and the file of the tag is listed. Only one match
+ is displayed per line. Often used tag kinds are:
+ d #define
+ f function
+
+ *'winaltkeys'* *'wak'*
+'winaltkeys' 'wak' string (default "menu")
+ global
+ {only used in Win32, Motif, GTK and Photon GUI}
+ Some GUI versions allow the access to menu entries by using the ALT
+ key in combination with a character that appears underlined in the
+ 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.
+ 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
+ shortcut key, will be handled by the windowing system. Other
+ keys can be mapped.
+ If the menu is disabled by excluding 'm' from 'guioptions', the ALT
+ key is never used for the menu.
+ This option is not used for <F10>; on Win32 and with GTK <F10> will
+ select the menu, unless it has been mapped.
+
+ *'wincolor'* *'wcr'*
+'wincolor' 'wcr' string (default empty)
+ local to window
+ Highlight group name to use for this window instead of the Normal
+ color |hl-Normal|.
+
+ *'window'* *'wi'*
+'window' 'wi' number (default screen height - 1)
+ global
+ Window height used for |CTRL-F| and |CTRL-B| when there is only one
+ window and the value is smaller than 'lines' minus one. The screen
+ will scroll 'window' minus two lines, with a minimum of one.
+ When 'window' is equal to 'lines' minus one CTRL-F and CTRL-B scroll
+ in a much smarter way, taking care of wrapping lines.
+ When resizing the Vim window, the value is smaller than 1 or more than
+ or equal to 'lines' it will be set to 'lines' minus 1.
+ Note: Do not confuse this with the height of the Vim window, use
+ 'lines' for that.
+
+ *'winheight'* *'wh'* *E591*
+'winheight' 'wh' number (default 1)
+ global
+ 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
+ cost of the height of other windows.
+ Set 'winheight' to a small number for normal editing.
+ Set it to 999 to make the current window fill most of the screen.
+ Other windows will be only 'winminheight' high. This has the drawback
+ that ":all" will create only two windows. To avoid "vim -o 1 2 3 4"
+ to create only two windows, set the option after startup is done,
+ using the |VimEnter| event: >
+ au VimEnter * set winheight=999
+< Minimum value is 1.
+ The height is not adjusted after one of the commands that change the
+ height of the current window.
+ 'winheight' applies to the current window. Use 'winminheight' to set
+ the minimal height for other windows.
+
+ *'winfixheight'* *'wfh'* *'nowinfixheight'* *'nowfh'*
+'winfixheight' 'wfh' boolean (default off)
+ local to window
+ 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|.
+ The height may be changed anyway when running out of room.
+
+ *'winfixwidth'* *'wfw'* *'nowinfixwidth'* *'nowfw'*
+'winfixwidth' 'wfw' boolean (default off)
+ local to window
+ 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.
+
+ *'winminheight'* *'wmh'*
+'winminheight' 'wmh' number (default 1)
+ global
+ 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
+ status bar) if necessary. They will return to at least one line when
+ they become active (since the cursor has to have somewhere to go.)
+ Use 'winheight' to set the minimal height of the current window.
+ This option is only checked when making a window smaller. Don't use a
+ large number, it will cause errors when opening more than a few
+ windows. A value of 0 to 3 is reasonable.
+
+ *'winminwidth'* *'wmw'*
+'winminwidth' 'wmw' number (default 1)
+ global
+ The minimal width 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 columns (i.e. just
+ a vertical separator) if necessary. They will return to at least one
+ line when they become active (since the cursor has to have somewhere
+ to go.)
+ Use 'winwidth' to set the minimal width of the current window.
+ This option is only checked when making a window smaller. Don't use a
+ large number, it will cause errors when opening more than a few
+ windows. A value of 0 to 12 is reasonable.
+
+ *'winptydll'*
+'winptydll' string (default "winpty32.dll" or "winpty64.dll")
+ global
+ {only available when compiled with the |terminal|
+ feature on MS-Windows}
+ Specifies the name of the winpty shared library, used for the
+ |:terminal| command. The default depends on whether Vim was built as a
+ 32-bit or 64-bit executable. If not found, "winpty.dll" is tried as
+ a fallback.
+ Environment variables are expanded |:set_env|.
+ This option cannot be set from a |modeline| or in the |sandbox|, for
+ security reasons.
+
+ *'winwidth'* *'wiw'* *E592*
+'winwidth' 'wiw' number (default 20)
+ global
+ Minimal number of columns for the current window. This is not a hard
+ minimum, Vim will use fewer columns if there is not enough room. If
+ the current window is smaller, its size is increased, at the cost of
+ the width of other windows. Set it to 999 to make the current window
+ always fill the screen. Set it to a small number for normal editing.
+ The width is not adjusted after one of the commands to change the
+ width of the current window.
+ 'winwidth' applies to the current window. Use 'winminwidth' to set
+ the minimal width for other windows.
+
+ *'wrap'* *'nowrap'*
+'wrap' boolean (default on)
+ local to window
+ This option changes how text is displayed. It doesn't change the text
+ in the buffer, see 'textwidth' for that.
+ When on, lines longer than the width of the window will wrap and
+ displaying continues on the next line. When off lines will not wrap
+ and only part of long lines will be displayed. When the cursor is
+ moved to a part that is not shown, the screen will scroll
+ horizontally.
+ The line will be broken in the middle of a word if necessary. See
+ 'linebreak' to get the break at a word boundary.
+ To make scrolling horizontally a bit more useful, try this: >
+ :set sidescroll=5
+ :set listchars+=precedes:<,extends:>
+< See 'sidescroll', 'listchars' and |wrap-off|.
+ This option can't be set from a |modeline| when the 'diff' option is
+ on.
+
+ *'wrapmargin'* *'wm'*
+'wrapmargin' 'wm' number (default 0)
+ local to buffer
+ Number of characters from the right window border where wrapping
+ starts. When typing text beyond this limit, an <EOL> will be inserted
+ and inserting continues on the next line.
+ Options that add a margin, such as 'number' and 'foldcolumn', cause
+ the text width to be further reduced. This is Vi compatible.
+ When 'textwidth' is non-zero, this option is not used.
+ This option is set to 0 when 'paste' is set and restored when 'paste'
+ is reset.
+ See also 'formatoptions' and |ins-textwidth|.
+
+ *'wrapscan'* *'ws'* *'nowrapscan'* *'nows'*
+'wrapscan' 'ws' boolean (default on) *E384* *E385*
+ global
+ Searches wrap around the end of the file. Also applies to |]s| and
+ |[s|, searching for spelling mistakes.
+
+ *'write'* *'nowrite'*
+'write' boolean (default on)
+ global
+ Allows writing files. When not set, writing a file is not allowed.
+ Can be used for a view-only mode, where modifications to the text are
+ still allowed. Can be reset with the |-m| or |-M| command line
+ argument. Filtering text is still possible, even though this requires
+ writing a temporary file.
+
+ *'writeany'* *'wa'* *'nowriteany'* *'nowa'*
+'writeany' 'wa' boolean (default off)
+ global
+ Allows writing to any file with no need for "!" override.
+
+ *'writebackup'* *'wb'* *'nowritebackup'* *'nowb'*
+'writebackup' 'wb' boolean (default on with |+writebackup| feature, off
+ otherwise)
+ global
+ Make a backup before overwriting a file. The backup is removed after
+ the file was successfully written, unless the 'backup' option is
+ also on.
+ WARNING: Switching this option off means that when Vim fails to write
+ your buffer correctly and then, for whatever reason, Vim exits, you
+ lose both the original file and what you were writing. Only reset
+ this option if your file system is almost full and it makes the write
+ fail (and make sure not to exit Vim until the write was successful).
+ See |backup-table| for another explanation.
+ When the 'backupskip' pattern matches, a backup is not made anyway.
+ Depending on 'backupcopy' the backup is a new file or the original
+ file renamed (and a new file is written).
+ NOTE: This option is set to the default value when 'compatible' is
+ set.
+
+ *'writedelay'* *'wd'*
+'writedelay' 'wd' number (default 0)
+ global
+ The number of milliseconds to wait for each character sent to the
+ screen. When non-zero, characters are sent to the terminal one by
+ one. For debugging purposes.
+
+ *'xtermcodes'* *'noxtermcodes'*
+'xtermcodes' boolean (default on)
+ global
+ When detecting xterm patchlevel 141 or higher with the termresponse
+ mechanism and this option is set, Vim will request the actual terminal
+ key codes and number of colors from the terminal. This takes care of
+ various configuration options of the terminal that cannot be obtained
+ from the termlib/terminfo entry, see |xterm-codes|.
+ A side effect may be that t_Co changes and Vim will redraw the
+ display.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_390.txt b/runtime/doc/os_390.txt
new file mode 100644
index 0000000..42c8a8b
--- /dev/null
+++ b/runtime/doc/os_390.txt
@@ -0,0 +1,134 @@
+*os_390.txt* For Vim version 9.0. Last change: 2019 Dec 07
+
+
+ VIM REFERENCE MANUAL by Ralf Schandl
+
+ *zOS* *z/OS* *OS390* *os390* *MVS*
+This file contains the particulars for the z/OS UNIX version of Vim.
+
+1. ASCII/EBCDIC dependent scripts |zOS-has-ebcdic|
+2. Putty and Colors |zOS-PuTTY|
+3. Motif Problems |zOS-Motif|
+4. Bugs |zOS-Bugs|
+5. Limitations |zOS-limitations|
+6. Open source on z/OS UNIX |zOS-open-source|
+
+Contributors: ~
+The port to z/OS UNIX was done by Ralf Schandl for the Redbook mentioned
+below.
+
+Changes, bug-reports, or both by:
+
+ David Moore
+ Anthony Giorgio
+ and others
+
+==============================================================================
+1. ASCII/EBCDIC dependent scripts *OS390-has-ebcdic* *zOS-has-ebcdic*
+
+For the internal script language the feature "ebcdic" was added. With this
+you can fix ASCII dependent scripts like this:
+>
+ if has("ebcdic")
+ let space = 64
+ else
+ let space = 32
+ endif
+<
+
+==============================================================================
+2. PuTTY and Colors *OS390-PuTTY* *zOS-PuTTY*
+
+If you see problems with syntax highlighting or screen corruptions when you
+connect to z/OS using Putty, try the following:
+
+- Configure Putty as "vt220" terminal (Connection->Data)
+- Add the following 3 lines to your vimrc:
+
+>
+ set t_AB=[4%p1%dm
+ set t_AF=[3%p1%dm
+ set t_CO=8
+<
+
+Note:  is one character use <C-V><Esc> to enter it.
+
+==============================================================================
+3. Motif Problems *OS390-Motif* *zOS-Motif*
+
+Note: Seen with Vim 6.*, never tested since.
+
+It seems that in porting the Motif library to z/OS, a translation from EBCDIC
+to ASCII for the accelerator characters of the pull-down menus was forgotten.
+Even after I tried to hand convert the menus, the accelerator keys continued
+to only work for the opening of menus (like <Alt-F> to open the file menu).
+They still do not work for the menu items themselves (like <Alt-F>O to open
+the file browser).
+
+There is no solution for this yet.
+
+==============================================================================
+4. Bugs *OS390-bugs* *zOS-Bugs*
+
+- Vim will consistently hang when a large amount of text is selected in
+ visual block mode. This may be due to a memory corruption issue. Note that
+ this occurs in both the terminal and gui versions.
+
+==============================================================================
+5. Limitations *OS390-limitations* *zOS-limitations*
+
+- No binary search in tag files.
+ The program /bin/sort sorts by ASCII value by default. This program is
+ normally used by ctags to sort the tags. There might be a version of
+ ctags out there, that does it right, but we can't be sure. So this seems to
+ be a permanent restriction.
+
+- The cscope interface (|cscope|) doesn't work for the version of cscope that
+ we use on our mainframe. We have a copy of version 15.0b12, and it causes
+ Vim to hang when using the "cscope add" command. I'm guessing that the
+ binary format of the cscope database isn't quite what Vim is expecting.
+ I've tried to port the current version of cscope (15.3) to z/OS, without
+ much success. If anyone is interested in trying, drop me a line if you
+ make any progress.
+
+- No glib/gtk support. I have not been able to successfully compile glib on
+ z/OS UNIX. This means you'll have to live without the pretty gtk toolbar.
+
+Disabled at compile time:
+ - Multibyte support (|multibyte|)
+ - Right-to-left mode (|rileft|)
+ - Farsi key map (|Farsi|)
+ - Arabic language support (|Arabic|)
+ - Spell checking (|spell|)
+
+Never tested:
+ - Perl interface (|perl|)
+ - Hangul input (|hangul|)
+ - Encryption support (|encryption|)
+ - Langmap (|'langmap'|)
+ - Python support (|Python|)
+ - Right-to-left mode (|'rightleft'|)
+ - TCL interface (|tcl|)
+ ...
+
+==============================================================================
+6. Open source on z/OS UNIX *OS390-open-source* *zOS-open-source*
+
+If you are interested in other Open Source Software on z/OS UNIX, have a
+look at the following Redbook:
+
+ Mike MacIsaac et al
+ "Open Source Software for z/OS and OS/390 UNIX"
+ IBM Form Number: SG24-5944-01
+ ISBN: 0738424633
+ http://www-03.ibm.com/systems/resources/servers_eserver_zseries_zos_unix_redbook_sg245944.pdf
+
+Also look at:
+ http://www.redbooks.ibm.com
+ http://www-03.ibm.com/systems/z/os/zos/features/unix/
+ http://www-03.ibm.com/systems/z/os/zos/features/unix/library/IBM+Redbooks/index.html
+
+
+
+------------------------------------------------------------------------------
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_amiga.txt b/runtime/doc/os_amiga.txt
new file mode 100644
index 0000000..062ad3b
--- /dev/null
+++ b/runtime/doc/os_amiga.txt
@@ -0,0 +1,147 @@
+*os_amiga.txt* For Vim version 9.0. Last change: 2010 Aug 14
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *Amiga*
+This file contains the particularities for the Amiga version of Vim.
+There is also a section specifically for |MorphOS| below.
+
+NOTE: The Amiga code is still included, but has not been maintained or tested.
+
+Installation on the Amiga:
+- Assign "VIM:" to the directory where the Vim "doc" directory is. Vim will
+ look for the file "VIM:doc/help.txt" (for the help command).
+ Setting the environment variable $VIM also works. And the other way around:
+ when $VIM used and it is not defined, "VIM:" is used.
+- With DOS 1.3 or earlier: Put "arp.library" in "libs:". Vim must have been
+ compiled with the |+ARP| feature enabled. Make sure that newcli and run are
+ in "C:" (for executing external commands).
+- Put a shell that accepts a command with "-c" (e.g. "Csh" from Fish disk
+ 624) in "c:" or in any other directory that is in your search path (for
+ executing external commands).
+
+If you have sufficient memory you can avoid startup delays by making Vim and
+csh resident with the command "rez csh vim". You will have to put
+"rezlib.library" in your "libs:" directory. Under 2.0 you will need rez
+version 0.5.
+
+If you do not use digraphs, you can save some memory by recompiling without
+the |+digraphs| feature. If you want to use Vim with other terminals you can
+recompile with the TERMCAP option. Vim compiles with Manx 5.x and SAS 6.x.
+See the makefiles and feature.h.
+
+If you notice Vim crashes on some files when syntax highlighting is on, or
+when using a search pattern with nested wildcards, it might be that the stack
+is too small. Try increasing the stack size. In a shell use the Stack
+command before launching Vim. On the Workbench, select the Vim icon, use the
+workbench "Info" menu and change the Stack field in the form.
+
+If you want to use different colors set the termcap codes:
+ t_mr (for inverted text)
+ t_md (for bold text)
+ t_me (for normal text after t_mr and t_md)
+ t_so (for standout mode)
+ t_se (for normal text after t_so)
+ t_us (for underlined text)
+ t_ue (for normal text after t_us)
+ t_ZH (for italic text)
+ t_ZR (for normal text after t_ZH)
+
+Standard ANSI escape sequences are used. The codes are:
+30 grey char 40 grey cell >0 grey background 0 all attributes off
+31 black char 41 black cell >1 black background 1 boldface
+32 white char 42 white cell >2 white background 2 faint
+33 blue char 43 blue cell >3 blue background 3 italic
+34 grey char 44 grey cell >4 grey background 4 underscore
+35 black char 45 black cell >5 black background 7 reverse video
+36 white char 46 white cell >6 white background 8 invisible
+37 blue char 47 blue cell >7 blue background
+
+The codes with '>' must be the last. The cell and background color should be
+the same. The codes can be combined by separating them with a semicolon. For
+example to get white text on a blue background: >
+ :set t_me=^V<Esc>[0;32;43;>3m
+ :set t_se=^V<Esc>[0;32;43;>3m
+ :set t_ue=^V<Esc>[0;32;43;>3m
+ :set t_ZR=^V<Esc>[0;32;43;>3m
+ :set t_md=^V<Esc>[1;32;43;>3m
+ :set t_mr=^V<Esc>[7;32;43;>3m
+ :set t_so=^V<Esc>[0;31;43;>3m
+ :set t_us=^V<Esc>[4;32;43;>3m
+ :set t_ZH=^V<Esc>[3;32;43;>3m
+
+When using multiple commands with a filter command, e.g. >
+ :r! echo this; echo that
+Only the output of the last command is used. To fix this you have to group the
+commands. This depends on the shell you use (that is why it is not done
+automatically in Vim). Examples: >
+ :r! (echo this; echo that)
+ :r! {echo this; echo that}
+
+Commands that accept a single file name allow for embedded spaces in the file
+name. However, when using commands that accept several file names, embedded
+spaces need to be escaped with a backslash.
+
+------------------------------------------------------------------------------
+Vim for MorphOS *MorphOS*
+
+[this section mostly by Ali Akcaagac]
+
+For the latest info about the MorphOS version:
+ http://www.akcaagac.com/index_vim.html
+
+
+Problems ~
+
+There are a couple of problems which are not MorphOS related but more Vim and
+UN*X related. When starting up Vim in ram: it complains with a nag requester
+from MorphOS please simply ignore it. Another problem is when running Vim as
+is some plugins will cause a few problems which you can ignore as well.
+Hopefully someone will be fixing it over the time.
+
+To pass all these problems for now you can either run:
+
+ vim <file to be edited>
+
+or if you want to run Vim plain and enjoy the motion of Helpfiles etc. it then
+would be better to enter:
+
+ vim --noplugins <of course you can add a file>
+
+
+Installation ~
+
+1) Please copy the binary 'VIM' file to c:
+2) Get the Vim runtime package from:
+
+ ftp://ftp.vim.org/pub/vim/amiga/vim62rt.tgz
+
+ and unpack it in your 'Apps' directory of the MorphOS installation. For me
+ this would create following directory hierarchy:
+
+ MorphOS:Apps/Vim/Vim62/...
+
+3) Add the following lines to your s:shell-startup (Important!).
+
+ ;Begin VIM
+ Set VIM=MorphOS:Apps/Vim/Vim62
+ Assign HOME: ""
+ ;End VIM
+
+4) Copy the '.vimrc' file to s:
+
+5) There is also a file named 'color-sequence' included in this archive. This
+ will set the MorphOS Shell to show ANSI colors. Please copy the file to s:
+ and change the s:shell-startup to:
+
+ ;Begin VIM
+ Set VIM=MorphOS:Apps/Vim/Vim62
+ Assign HOME: ""
+ Execute S:Color-Sequence
+ Cls
+ ;End VIM
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_beos.txt b/runtime/doc/os_beos.txt
new file mode 100644
index 0000000..8a2ac48
--- /dev/null
+++ b/runtime/doc/os_beos.txt
@@ -0,0 +1,13 @@
+*os_beos.txt* For Vim version 9.0. Last change: 2020 Jun 07
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *beos* *BeOS* *BeBox*
+This file used to contain particularities for the BeOS port of Vim.
+
+The BeOS support was removed in patch 8.2.0849.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_dos.txt b/runtime/doc/os_dos.txt
new file mode 100644
index 0000000..e5e405c
--- /dev/null
+++ b/runtime/doc/os_dos.txt
@@ -0,0 +1,383 @@
+*os_dos.txt* For Vim version 9.0. Last change: 2006 Mar 30
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *dos* *DOS*
+This file documents the common particularities of the MS-DOS and Win32
+versions of Vim. Also see |os_win32.txt| and |os_msdos.txt|.
+
+1. File locations |dos-locations|
+2. Using backslashes |dos-backslash|
+3. Standard mappings |dos-standard-mappings|
+4. Screen output and colors |dos-colors|
+5. File formats |dos-file-formats|
+6. :cd command |dos-:cd|
+7. Interrupting |dos-CTRL-Break|
+8. Temp files |dos-temp-files|
+9. Shell option default |dos-shell|
+10. PowerShell |dos-powershell|
+
+==============================================================================
+1. File locations *dos-locations*
+
+If you keep the Vim executable in the directory that contains the help and
+syntax subdirectories, there is no need to do anything special for Vim to
+work. No registry entries or environment variables need to be set. Just make
+sure that the directory is in your search path, or use a shortcut on the
+desktop.
+
+Your vimrc files ("_vimrc" and "_gvimrc") are normally located one directory
+up from the runtime files. If you want to put them somewhere else, set the
+environment variable $VIM to the directory where you keep them. Example: >
+ set VIM=C:\user\piet
+Will find "c:\user\piet\_vimrc".
+Note: This would only be needed when the computer is used by several people.
+Otherwise it's simpler to keep your _vimrc file in the default place.
+
+If you move the executable to another location, you also need to set the $VIM
+environment variable. The runtime files will be found in "$VIM/vim{version}".
+Example: >
+ set VIM=E:\vim
+Will find the version 8.2 runtime files in "e:\vim\vim82".
+Note: This is _not_ recommended. The preferred way is to keep the executable
+in the runtime directory.
+
+If you move your executable AND want to put your "_vimrc" and "_gvimrc" files
+somewhere else, you must set $VIM to where you vimrc files are, and set
+$VIMRUNTIME to the runtime files. Example: >
+ set VIM=C:\usr\piet
+ set VIMRUNTIME=E:\vim\vim82
+Will find "c:\user\piet\_vimrc" and the runtime files in "e:\vim\vim82".
+
+See |$VIM| and |$VIMRUNTIME| for more information.
+
+You can set environment variables for each user separately through the
+System Properties dialog box. The steps to do that:
+1. Type Windows Key + R to open the "Run" dialog box.
+2. Enter "sysdm.cpl" and press the "OK" button. The "System Properties"
+ dialog box will open.
+3. Select the "Advanced" tab and press the "Environment Variables..." button.
+ The "Environment Variables" dialog box will open.
+4. Select an existing variable in the "User variables" list and press the
+ "Edit..." button to edit it. Or press the "New..." button to add a new
+ variable.
+5. After you finished editing variables, press the "OK" button to save the
+ changes.
+
+==============================================================================
+2. Using backslashes *dos-backslash*
+
+Using backslashes in file names can be a problem. Vi halves the number of
+backslashes for some commands. Vim is a bit more tolerant and does not remove
+backslashes from a file name, so ":e c:\foo\bar" works as expected. But when
+a backslash occurs before a special character (space, comma, backslash, etc.),
+Vim removes the backslash. Use slashes to avoid problems: ":e c:/foo/bar"
+works fine. Vim replaces the slashes with backslashes internally to avoid
+problems with some MS-DOS programs and Win32 programs.
+
+When you prefer to use forward slashes, set the 'shellslash' option. Vim will
+then replace backslashes with forward slashes when expanding file names. This
+is especially useful when using a Unix-like 'shell'.
+
+==============================================================================
+3. Standard mappings *dos-standard-mappings*
+
+The mappings for CTRL-PageUp and CTRL-PageDown have been removed, they now
+jump to the next or previous tab page |<C-PageUp>| |<C-PageDown>|
+
+If you want them to move to the first and last screen line you can use these
+mappings:
+
+key key code Normal/Visual mode Insert mode ~
+CTRL-PageUp <M-N><M-C-D> H <C-O>H
+CTRL-PageDown <M-N>v L$ <C-O>L<C-O>$
+
+Additionally, these keys are available for copy/cut/paste. In the Win32
+and DJGPP versions, they also use the clipboard.
+
+Shift-Insert paste text (from clipboard) *<S-Insert>*
+CTRL-Insert copy Visual text (to clipboard) *<C-Insert>*
+CTRL-Del cut Visual text (to clipboard) *<C-Del>*
+Shift-Del cut Visual text (to clipboard) *<S-Del>*
+CTRL-X cut Visual text (to clipboard)
+
+These mappings accomplish this (Win32 and DJGPP versions of Vim):
+
+key key code Normal Visual Insert ~
+Shift-Insert <M-N><M-T> "*P "-d"*P <C-R><C-O>*
+CTRL-Insert <M-N><M-U> "*y
+Shift-Del <M-N><M-W> "*d
+CTRL-Del <M-N><M-X> "*d
+CTRL-X <C-X> "*d
+
+Or these mappings (non-Win32 version of Vim):
+
+key key code Normal Visual Insert ~
+Shift-Insert <M-N><M-T> P "-dP <C-R><C-O>"
+CTRL-Insert <M-N><M-U> y
+Shift-Del <M-N><M-W> d
+CTRL-Del <M-N><M-X> d
+
+When the clipboard is supported, the "* register is used.
+
+==============================================================================
+4. Screen output and colors *dos-colors*
+
+The default output method for the screen is to use bios calls. This works
+right away on most systems. You do not need ansi.sys. You can use ":mode" to
+set the current screen mode. See |:mode|.
+
+To change the screen colors that Vim uses, you can use the |:highlight|
+command. The Normal highlight group specifies the colors Vim uses for normal
+text. For example, to get grey text on a blue background: >
+ :hi Normal ctermbg=Blue ctermfg=grey
+See |highlight-groups| for other groups that are available.
+
+A DOS console does not support attributes like bold and underlining. You can
+set the color used in five modes with nine terminal options. Note that this
+is not necessary since you can set the color directly with the ":highlight"
+command; these options are for backward compatibility with older Vim versions.
+The |'highlight'| option specifies which of the five modes is used for which
+action. >
+
+ :set t_mr=^V^[\|xxm start of invert mode
+ :set t_md=^V^[\|xxm start of bold mode
+ :set t_me=^V^[\|xxm back to normal text
+
+ :set t_so=^V^[\|xxm start of standout mode
+ :set t_se=^V^[\|xxm back to normal text
+
+ :set t_us=^V^[\|xxm start of underline mode
+ :set t_ue=^V^[\|xxm back to normal text
+
+ :set t_ZH=^V^[\|xxm start of italics mode
+ :set t_ZR=^V^[\|xxm back to normal text
+
+^V is CTRL-V
+^[ is <Esc>
+You must replace xx with a decimal code, which is the foreground color number
+and background color number added together:
+
+COLOR FOREGROUND BACKGROUND ~
+Black 0 0
+DarkBlue 1 16
+DarkGreen 2 32
+DarkCyan 3 48
+DarkRed 4 64
+DarkMagenta 5 80
+Brown, DarkYellow 6 96
+LightGray 7 112
+DarkGray 8 128 *
+Blue, LightBlue 9 144 *
+Green, LightGreen 10 160 *
+Cyan, LightCyan 11 176 *
+Red, LightRed 12 192 *
+Magenta, LightMagenta 13 208 *
+Yellow, LightYellow 14 224 *
+White 15 240 *
+
+* Depending on the display mode, the color codes above 128 may not be
+ available, and code 128 will make the text blink.
+
+When you use 0, the color is reset to the one used when you started Vim
+(usually 7, lightgray on black, but you can override this. If you have
+overridden the default colors in a command prompt, you may need to adjust
+some of the highlight colors in your vimrc---see below).
+This is the default for t_me.
+
+The defaults for the various highlight modes are:
+ t_mr 112 reverse mode: Black text (0) on LightGray (112)
+ t_md 15 bold mode: White text (15) on Black (0)
+ t_me 0 normal mode (revert to default)
+
+ t_so 31 standout mode: White (15) text on DarkBlue (16)
+ t_se 0 standout mode end (revert to default)
+
+ t_czh 225 italic mode: DarkBlue text (1) on Yellow (224)
+ t_czr 0 italic mode end (revert to default)
+
+ t_us 67 underline mode: DarkCyan text (3) on DarkRed (64)
+ t_ue 0 underline mode end (revert to default)
+
+These colors were chosen because they also look good when using an inverted
+display, but you can change them to your liking.
+
+Example: >
+ :set t_mr=^V^[\|97m " start of invert mode: DarkBlue (1) on Brown (96)
+ :set t_md=^V^[\|67m " start of bold mode: DarkCyan (3) on DarkRed (64)
+ :set t_me=^V^[\|112m " back to normal mode: Black (0) on LightGray (112)
+
+ :set t_so=^V^[\|37m " start of standout mode: DarkMagenta (5) on DarkGreen
+ (32)
+ :set t_se=^V^[\|112m " back to normal mode: Black (0) on LightGray (112)
+
+==============================================================================
+5. File formats *dos-file-formats*
+
+If the 'fileformat' option is set to "dos" (which is the default), Vim accepts
+a single <NL> or a <CR><NL> pair for end-of-line (<EOL>). When writing a
+file, Vim uses <CR><NL>. Thus, if you edit a file and write it, Vim replaces
+<NL> with <CR><NL>.
+
+If the 'fileformat' option is set to "unix", Vim uses a single <NL> for <EOL>
+and shows <CR> as ^M.
+
+You can use Vim to replace <NL> with <CR><NL> by reading in any mode and
+writing in Dos mode (":se ff=dos").
+You can use Vim to replace <CR><NL> with <NL> by reading in Dos mode and
+writing in Unix mode (":se ff=unix").
+
+Vim sets 'fileformat' automatically when 'fileformats' is not empty (which is
+the default), so you don't really have to worry about what you are doing.
+ |'fileformat'| |'fileformats'|
+
+If you want to edit a script file or a binary file, you should set the
+'binary' option before loading the file. Script files and binary files may
+contain single <NL> characters which Vim would replace with <CR><NL>. You can
+set 'binary' automatically by starting Vim with the "-b" (binary) option.
+
+==============================================================================
+6. :cd command *dos-:cd*
+
+The ":cd" command recognizes the drive specifier and changes the current
+drive. Use ":cd c:" to make drive C the active drive. Use ":cd d:\foo" to go
+to the directory "foo" in the root of drive D. Vim also recognizes UNC names
+if the system supports them; e.g., ":cd \\server\share\dir". |:cd|
+
+==============================================================================
+7. Interrupting *dos-CTRL-Break*
+
+Use CTRL-Break instead of CTRL-C to interrupt searches. Vim does not detect
+the CTRL-C until it tries to read a key.
+
+==============================================================================
+8. Temp files *dos-temp-files*
+
+Only for the 16 bit and 32 bit DOS version:
+Vim puts temporary files (for filtering) in the first of these directories
+that exists and in which Vim can create a file:
+ $TMP
+ $TEMP
+ C:\TMP
+ C:\TEMP
+ current directory
+
+For the Win32 version (both console and GUI):
+Vim uses standard Windows functions to obtain a temporary file name (for
+filtering). The first of these directories that exists and in which Vim can
+create a file is used:
+ $TMP
+ $TEMP
+ current directory
+
+==============================================================================
+9. Shell option default *dos-shell*
+
+The default for the 'sh' ('shell') option is "command.com" on Windows 95 and
+"cmd.exe" on Windows NT. If SHELL is defined, Vim uses SHELL instead, and if
+SHELL is not defined but COMSPEC is, Vim uses COMSPEC. Vim starts external
+commands with "<shell> /c <command_name>". Typing CTRL-Z starts a new command
+subshell. Return to Vim with "exit". |'shell'| |CTRL-Z|
+
+If you are running a third-party shell, you may need to set the
+|'shellcmdflag'| ('shcf') and |'shellquote'| ('shq') or |'shellxquote'|
+('sxq') options. Unfortunately, this also depends on the version of Vim used.
+For example, with the MKS Korn shell or with bash, the values of the options
+should be:
+
+ DOS 16 bit DOS 32 bit Win32 ~
+'shellcmdflag' -c -c -c
+'shellquote' "
+'shellxquote' "
+
+For Dos 16 bit this starts the shell as:
+ <shell> -c "command name" >file
+For Win32 as:
+ <shell> -c "command name >file"
+For DOS 32 bit, DJGPP does this internally somehow.
+
+When starting up, if Vim does not recognise a standard Windows shell it checks
+for the presence of "sh" anywhere in the 'shell' option. If it is present,
+Vim sets the 'shellcmdflag' and 'shellquote' or 'shellxquote' options will be
+set as described above.
+
+==============================================================================
+10. PowerShell *dos-powershell* *dos-pwsh*
+
+Vim supports PowerShell Desktop and PowerShell Core. PowerShell Desktop is
+the version of PowerShell that is installed with Windows, while PowerShell
+Core is a separate downloadable version that works cross-platform. To see
+which version you are using then enter the following in a PowerShell prompt -
+$PSVersionTable.PSEdition
+
+If 'shell' includes "powershell" in the filename at startup then VIM sets
+'shellcmdflag', 'shellxquote', 'shellpipe', and 'shellredir' options to the
+following values:
+
+'shellcmdflag' -Command
+'shellxquote' "
+'shellpipe' 2>&1 | Out-File -Encoding default
+'shellredir' 2>&1 | Out-File -Encoding default
+
+If 'shell' includes "pwsh" in the filename at startup then VIM sets
+'shellcmdflag', 'shellxquote', 'shellpipe', and 'shellredir' options to the
+following values:
+
+'shellcmdflag' -c
+'shellxquote' "
+'shellpipe' >%s 2>&1
+'shellredir' >%s 2>&1
+
+If you find that PowerShell commands are taking a long time to run then try
+with "-NoProfile" at the beginning of the 'shellcmdflag'. Note this will
+prevent any PowerShell environment setup by the profile from taking place.
+
+If you have problems running PowerShell scripts through the 'shell' then try
+with "-ExecutionPolicy RemoteSigned -Command" at the beginning of
+'shellcmdflag'. See online Windows documentation for more information on
+PowerShell Execution Policy settings.
+
+See |option-backslash| about including spaces in 'shellcmdflag' when using
+multiple flags.
+
+The 'shellpipe' and 'shellredir' option values re-encode the UTF-16LE output
+from PowerShell Desktop to your currently configured console codepage. The
+output can be forced into a different encoding by changing "default" to one of
+the following:
+
+ unicode - UTF-16LE (default output from PowerShell 5.1)
+ bigendianunicode - UTF-16
+ utf8 - UTF-8
+ utf7 - UTF-7 (no BOM)
+ utf32 - UTF-32
+ ascii - 7-bit ASCII character set
+ default - System's active code page (typically ANSI)
+ oem - System's current OEM code page
+
+Note The above multi-byte Unicode encodings include a leading BOM unless
+otherwise indicated.
+
+By default PowerShell Core's output is UTF-8 encoded without a BOM. If you
+want to force the output of PowerShell Core into a different encoding then set
+'shellredir' and 'shellpipe' to "2>&1 | Out-File -Encoding encoding" where
+encoding is one of the following:
+
+ ascii - 7-bit ASCII character set
+ bigendianunicode - UTF-16BE
+ bigendianutf32 - UTF-32BE
+ oem - System's current OEM code page
+ unicode - UTF-16LE
+ utf7 - UTF-7
+ utf8 - UTF-8
+ utf8BOM - UTF-8, with BOM
+ utf8NoBOM - UTF-8, no BOM (default output from PowerShell Core)
+ utf32 - UTF-32
+
+Since PowerShell Core 6.2, the Encoding parameter also supports specifying a
+numeric ID of a registered code page (-Encoding 1251) or string names of
+registered code pages (-Encoding "windows-1251"). The .NET documentation for
+Encoding.CodePage has more information
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_haiku.txt b/runtime/doc/os_haiku.txt
new file mode 100644
index 0000000..fdcf7fe
--- /dev/null
+++ b/runtime/doc/os_haiku.txt
@@ -0,0 +1,235 @@
+*os_haiku.txt* For Vim version 9.0. Last change: 2020 May 13
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *Haiku*
+This file contains the particularities for the Haiku version of Vim. For
+matters not discussed in this file, Vim behaves very much like the Unix
+|os_unix.txt| version.
+
+Haiku is an open-source operating system inspired by BeOS, that specifically
+targets personal computing.
+
+ 1. General |haiku-general|
+ 2. Compiling Vim |haiku-compiling|
+ 3. The Haiku GUI |haiku-gui|
+ 4. The $VIM directory |haiku-vimdir|
+ 5. The $USER_SETTINGS_DIR
+ directory |haiku-user-settings-dir|
+ 6. Drag & Drop |haiku-dragndrop|
+ 7. Single Launch vs. Multiple
+ Launch |haiku-launch|
+ 8. Fonts |haiku-fonts|
+ 9. The meta key modifier |haiku-meta|
+10. Mouse key mappings |haiku-mouse|
+11. Color names |haiku-colors|
+12. GUI Toolbar Images |haiku-toolbar-images|
+13. Credits |haiku-support-credits|
+14. Bugs & to-do |haiku-bugs|
+
+
+1. General *haiku-general*
+
+The default syntax highlighting mostly works with different foreground colors
+to highlight items. This works best if you set your Terminal window to a
+darkish background and light letters. Some middle-grey background (for
+instance (r,g,b)=(168,168,168)) with black letters also works nicely.
+
+
+2. Compiling Vim *haiku-compiling*
+
+Vim can be compiled using the standard configure/make approach. Running
+./configure without any arguments or passing --enable-gui=haiku, will compile
+vim with the Haiku GUI support. Run ./configure --help , to find out other
+features you can enable/disable.
+
+Haiku uses "ncurses6" as its terminal library, therefore you need to have
+"ncurses6_devel" package installed from HaikuDepot in order to configure
+the Haiku build. Just append "--with-tlib=ncurses" to ./configure command.
+
+Now you should use "make" to compile Vim, then "make install" to install it.
+For seamless integration into Haiku, the GUI-less vim binary should be
+additionally installed over the GUI version. Typical build commands are:
+
+ ./configure --prefix=`finddir B_SYSTEM_NONPACKAGED_DIRECTORY` \
+ --datarootdir=`finddir B_SYSTEM_NONPACKAGED_DATA_DIRECTORY` \
+ --mandir=`finddir B_SYSTEM_NONPACKAGED_DIRECTORY`/documentation/man \
+ --with-tlib=ncurses
+ make clean
+ make install
+
+ ./configure --prefix=`finddir B_SYSTEM_NONPACKAGED_DIRECTORY` \
+ --datarootdir=`finddir B_SYSTEM_NONPACKAGED_DATA_DIRECTORY` \
+ --mandir=`finddir B_SYSTEM_NONPACKAGED_DIRECTORY`/documentation/man \
+ --with-tlib=ncurses \
+ --disable-gui
+ make clean
+ make install
+
+
+3. The Haiku GUI *haiku-gui*
+
+Normally Vim starts with the GUI if you start it as gvim or vim -g. The vim
+version with GUI tries to determine if it was started from the Tracker instead
+of the Terminal, and if so, uses the GUI anyway. However, the current detection
+scheme is fooled if you use the command "vim - </dev/null".
+
+Stuff that does not work yet:
+
+- Mouse up events are not generated when outside the window. You can notice
+ this when selecting text and moving the cursor outside the window, then
+ letting go of the mouse button. Another way is when you drag the scrollbar
+ and do the same thing. Because Vim still thinks you are still playing with
+ the scrollbar it won't change it itself. There is a workaround which kicks
+ in when the window is activated or deactivated (so it works best with focus-
+ follows-mouse turned on).
+- The cursor does not flash.
+
+
+4. The $VIM directory *haiku-vimdir*
+
+$VIM is the symbolic name for the place where Vim's support files are stored.
+The default value for $VIM is set at compile time and can be determined with:
+
+ :version
+
+The normal value is /boot/system/data/vim for Haikuports version,
+/boot/system/non-packaged/data/vim for manual builds. If you don't like it
+you can set the VIM environment variable to override this, or set 'helpfile'
+in your .vimrc: >
+
+ :if version >= 500
+ : set helpfile=~/vim/runtime/doc/help.txt
+ : syntax on
+ :endif
+
+
+5. The $USER_SETTINGS_DIR directory *haiku-user-settings-dir*
+
+$USER_SETTINGS_DIR is the symbolic name for the place where Haiku
+configuration and settings files are stored.
+
+The normal value is /boot/home/config/settings.
+
+
+6. Drag & Drop *haiku-dragndrop*
+
+You can drop files and directories on either the Vim icon (starts a new Vim
+session, unless you use the File Types application to set Vim to be "Single
+Launch") or on the Vim window (starts editing the files). Dropping a folder
+sets Vim's current working directory |:cd| |:pwd|. If you drop files or
+folders with either SHIFT key pressed, Vim changes directory to the folder
+that contains the first item dropped. When starting Vim, there is no need to
+press shift: Vim behaves as if you do.
+
+Files dropped set the current argument list. |argument-list|
+
+
+7. Single Launch vs. Multiple Launch *haiku-launch*
+
+As distributed Vim's Application Flags (as seen in the FileTypes preference)
+are set to Multiple Launch. If you prefer, you can set them to Single Launch
+instead. Attempts to start a second copy of Vim will cause the first Vim to
+open the files instead. This works from the Tracker but also from the command
+line. In the latter case, non-file (option) arguments are not supported.
+Another drawback of the Single Launch is silent ignore of "Open With ..."
+requests by vim instance that running as non-GUI application even GUI support
+was compiled in. Vim instance running with GUI has no such problems.
+
+NB: Only the GUI version has a BApplication (and hence Application Flags).
+This section does not apply to the GUI-less version, should you compile one.
+
+
+8. Fonts *haiku-fonts*
+
+Set fonts with >
+
+ :set guifont=DejaVu_Sans_Mono/Book/12
+
+where the first part is the font family, the second part the style, and the
+third part the size. You can use underscores instead of spaces in family and
+style.
+
+Best results are obtained with monospaced fonts. Vim attempts to use all
+fonts in B_FIXED_SPACING mode but apparently this does not work for
+proportional fonts (despite what the BeBook says).
+
+To verify which encodings are supported by the current font give the >
+
+ :digraphs
+
+command, which lists a bunch of characters with their ISO Latin 1 encoding.
+If, for instance, there are "box" characters among them, or the last character
+isn't a dotted-y, then for this font the encoding does not work.
+
+If the font you specify is unavailable, you get the system fixed font.
+
+GUI Font Selection Dialog is available at giving the:
+
+ :set guifont=*
+
+command.
+
+
+9. The meta key modifier *haiku-meta*
+
+The META key modifier is obtained by the left or right OPTION keys. This is
+because the ALT (aka COMMAND) keys are not passed to applications.
+
+
+10. Mouse key mappings *haiku-mouse*
+
+Vim calls the various mouse buttons LeftMouse, MiddleMouse and RightMouse. If
+you use the default Mouse preference settings these names indeed correspond to
+reality. Vim uses this mapping:
+
+ Button 1 -> LeftMouse,
+ Button 2 -> RightMouse,
+ Button 3 -> MiddleMouse.
+
+If your mouse has fewer than 3 buttons you can provide your own mapping from
+mouse clicks with modifier(s) to other mouse buttons. See the file
+$VIM/macros/swapmous.vim for an example. |gui-mouse-mapping|
+
+
+11. Color names *haiku-colors*
+
+Vim has a number of color names built-in. Additional names can be defined in
+|v:colornames|. See |:colorscheme| for details.
+
+
+12. GUI Toolbar Images *haiku-toolbar-images*
+
+Alternative set of toolbar images should be the PNG image of any height you
+like. Image width is calculated to contain at least 32 buttons in one-row
+cells.
+The image should be stored under the name $VIRUNTIME/bitmaps/builtin-tools.png
+More info about the buttons assignment are at |builtin-tools|.
+
+
+13. Credits *haiku-support-credits*
+
+Haiku port is based on work done for BeOS version by many people
+ - BeBox GUI support Copyright 1998 by Olaf Seibert;
+ - Ported to R4 by Richard Offer <richard@whitequeen.com> Jul 99;
+ - Those who contributed, not listed above but not forgotten;
+ - Haiku support by Siarzhuk Zharski <imker@gmx.li> Apr-Mai 2009.
+
+All the changes and patches released under vim-license.
+
+Thank you, all!
+
+
+14. Bugs & to-do *haiku-bugs*
+
+The port is under development now and far away from the perfect state. For bug
+reports, patches and wishes, please use the Vim mailing list or Vim Github
+repository.
+
+Mailing list: https://www.vim.org/maillist.php
+Vim Github repository: https://github.com/vim/vim
+
+
+ vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/os_mac.txt b/runtime/doc/os_mac.txt
new file mode 100644
index 0000000..b18e8e0
--- /dev/null
+++ b/runtime/doc/os_mac.txt
@@ -0,0 +1,182 @@
+*os_mac.txt* For Vim version 9.0. Last change: 2019 Apr 21
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar et al.
+
+
+ *mac* *Mac* *macintosh* *Macintosh*
+
+This file documents the particularities of the Macintosh version of Vim.
+
+NOTE: This file is a bit outdated. You might find more useful info here:
+ http://macvim.org/
+
+1. Filename Convention |mac-filename|
+2. .vimrc and .vim files |mac-vimfile|
+3. Standard mappings |mac-standard-mappings|
+4. FAQ |mac-faq|
+5. Known Lack |mac-lack|
+6. Mac Bug Report |mac-bug|
+7. Compiling Vim |mac-compile|
+8. The darwin feature |mac-darwin-feature|
+
+There was a Mac port for version 3.0 of Vim. Here are the first few lines
+from the old file:
+
+VIM Release Notes
+Initial Macintosh release, VIM version 3.0
+19 October 1994
+
+Eric Fischer
+<enf1@midway.uchicago.edu>, <eric@jcp.uchicago.edu>, <etaoin@uchicago.edu>
+5759 N. Guilford Ave
+Indianapolis IN 46220 USA
+
+==============================================================================
+1. Filename Convention *mac-filename*
+
+Starting with Vim version 7 you can just use the unix path separators with
+Vim. In order to determine if the specified filename is relative to the
+current folder or absolute (i.e. relative to the "Desktop"), the following
+algorithm is used:
+
+ If the path start by a "/", the path is absolute
+ If the path start by a ":", the path is relative
+ If the path doesn't start by neither a "/" nor ":",
+ and a ":" is found before a "/" then the path is absolute
+>
+ :e /HD/text
+ :e HD:text
+< Edit the file "text" of the disk "HD" >
+ :e :src:main.c
+ :e src/main.c
+< Edit the file "main.c" in the folder "src" in the current folder >
+ :e os_mac.c
+< Edit the file "os_mac.c" in the current folder.
+
+You can use the |$VIM| and |$VIMRUNTIME| variable. >
+
+ :so $VIMRUNTIME:syntax:syntax.vim
+
+==============================================================================
+2. .vimrc and .vim files *mac-vimfile*
+
+It is recommended to use Unix style line separators for Vim scripts, thus a
+single newline character.
+
+When starting up Vim will load the $VIMRUNTIME/macmap.vim script to define
+default command-key mappings.
+
+On older systems files starting with a dot "." are discouraged, thus the rc
+files are named "vimrc" or "_vimrc" and "gvimrc" or "_gvimrc". These files
+can be in any format (mac, dos or unix). Vim can handle any file format when
+the |'nocompatible'| option is set, otherwise it will only handle mac format
+files.
+
+==============================================================================
+3. Standard mappings *mac-standard-mappings*
+
+The following mappings are available for cut/copy/paste from/to clipboard.
+
+key Normal Visual Insert Description ~
+Command-v "*P "-d"*P <C-R>* paste text *<D-v>*
+Command-c "*y copy Visual text *<D-c>*
+Command-x "*d cut Visual text *<D-x>*
+Backspace "*d cut Visual text
+
+==============================================================================
+4. Mac FAQ *mac-faq*
+
+On the internet: http://macvim.org/OSX/index.php#FAQ
+
+Q: I can't enter non-ASCII character in Apple Terminal.
+A: Under Window Settings, Emulation, make sure that "Escape non-ASCII
+ characters" is not checked.
+
+Q: How do I start the GUI from the command line?
+A: Assuming that Vim.app is located in /Applications:
+ open /Applications/Vim.app
+ Or:
+ /Applications/Vim.app/Contents/MacOS/Vim -g {arguments}
+
+Q: How can I set $PATH to something reasonable when I start Vim.app from the
+ GUI or with open?
+A: The following trick works with most shells. Put it in your vimrc file.
+ This is included in the system vimrc file included with the binaries
+ distributed at macvim.org . >
+ let s:path = system("echo echo VIMPATH'${PATH}' | $SHELL -l")
+ let $PATH = matchstr(s:path, 'VIMPATH\zs.\{-}\ze\n')
+
+==============================================================================
+5. Mac Lack *mac-lack*
+
+In a terminal CTRL-^ needs to be entered as Shift-Control-6. CTRL-@ as
+Shift-Control-2.
+
+==============================================================================
+6. Mac Bug Report *mac-bug*
+
+When reporting any Mac specific bug or feature change, please use the vim-mac
+maillist |vim-mac|. However, you need to be subscribed. An alternative is to
+send a message to the current MacVim maintainers:
+
+ mac@vim.org
+
+==============================================================================
+7. Compiling Vim *mac-compile*
+
+See the file "src/INSTALLmac.txt" that comes with the source files.
+
+==============================================================================
+8. The Darwin Feature *mac-darwin-feature*
+
+If you have a Mac that isn't very old, you will be running OS X, also called
+Darwin. The last pre-Darwin OS was Mac OS 9. The darwin feature makes Vim
+use Darwin-specific properties.
+
+What is accomplished with this feature is two-fold:
+
+- Make Vim interoperable with the system clipboard.
+- Incorporate into Vim a converter module that bridges the gap between some
+ character encodings specific to the platform and those known to Vim.
+
+Needless to say, both are not to be missed for any decent text editor to work
+nicely with other applications running on the same desktop environment.
+
+As Vim is not an application dedicated only to macOS, we need an extra feature
+to add in order for it to offer the same user experience that our users on
+other platforms enjoy to people on macOS.
+
+For brevity, the feature is referred to as "darwin" to signify it one of the
+Vim features that are specific to that particular platform.
+
+The feature is a configuration option. Accordingly, whether it is enabled or
+not is determined at build time; once it is selected to be enabled, it is
+compiled in and hence cannot be disabled at runtime.
+
+The feature is enabled by default. For most macOS users, that should be
+sufficient unless they have specific needs mentioned briefly below.
+
+If you want to disable it, pass `--disable-darwin` to the configure script: >
+
+ ./configure --disable-darwin <other options>
+
+and then run `make` to build Vim. The order of the options doesn't matter.
+
+To make sure at runtime whether or not the darwin feature is compiled in, you
+can use `has('osxdarwin')` which returns 1 if the feature is compiled in; 0
+otherwise. For backward compatibility, you can still use `macunix` instead of
+`osxdarwin`.
+
+Notable use cases where `--disable-darwin` is turned out to be useful are:
+
+- When you want to use |x11-selection| instead of the system clipboard.
+- When you want to use |x11-clientserver|.
+
+Since both have to make use of X11 inter-client communication for them to work
+properly, and since the communication mechanism can come into conflict with
+the system clipboard, the darwin feature should be disabled to prevent Vim
+from hanging at runtime.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_mint.txt b/runtime/doc/os_mint.txt
new file mode 100644
index 0000000..4273c55
--- /dev/null
+++ b/runtime/doc/os_mint.txt
@@ -0,0 +1,15 @@
+*os_mint.txt* For Vim version 9.0. Last change: 2020 Jul 14
+
+
+ VIM REFERENCE MANUAL by Jens M. Felderhoff
+
+
+ *MiNT* *Atari*
+The Atari MiNT support was removed with patch 8.2.1215. It probably didn't
+work at that time, since the code was old and not maintained.
+
+
+Originally added by: Jens M. Felderhoff, e-mail: <jmf@infko.uni-koblenz.de>
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_msdos.txt b/runtime/doc/os_msdos.txt
new file mode 100644
index 0000000..67821ed
--- /dev/null
+++ b/runtime/doc/os_msdos.txt
@@ -0,0 +1,15 @@
+*os_msdos.txt* For Vim version 9.0. Last change: 2016 Feb 26
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *msdos* *ms-dos* *MSDOS* *MS-DOS*
+This file used to contain the particularities for the MS-DOS version of Vim.
+MS-DOS support was removed in patch 7.4.1399. If you want to use it you will
+need to get a version older than that. Note that the MS-DOS version doesn't
+work, there is not enough memory. The DOS32 version (using DJGPP) might still
+work on older systems.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_os2.txt b/runtime/doc/os_os2.txt
new file mode 100644
index 0000000..a07767e
--- /dev/null
+++ b/runtime/doc/os_os2.txt
@@ -0,0 +1,13 @@
+*os_os2.txt* For Vim version 9.0. Last change: 2015 Dec 31
+
+
+ VIM REFERENCE MANUAL by Paul Slootman
+
+
+ *os2* *OS2* *OS/2*
+This file used to contain the particularities for the OS/2 version of Vim.
+
+The OS/2 support was removed in patch 7.4.1008.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_qnx.txt b/runtime/doc/os_qnx.txt
new file mode 100644
index 0000000..ade1c7a
--- /dev/null
+++ b/runtime/doc/os_qnx.txt
@@ -0,0 +1,138 @@
+*os_qnx.txt* For Vim version 9.0. Last change: 2005 Mar 29
+
+
+ VIM REFERENCE MANUAL by Julian Kinraid
+
+
+ *QNX* *qnx*
+
+1. General |qnx-general|
+2. Compiling Vim |qnx-compiling|
+3. Terminal support |qnx-terminal|
+4. Photon GUI |photon-gui|
+5. Photon fonts |photon-fonts|
+6. Bugs & things To Do
+
+==============================================================================
+
+1. General *qnx-general*
+
+Vim on QNX behaves much like other unix versions. |os_unix.txt|
+
+
+2. Compiling Vim *qnx-compiling*
+
+Vim can be compiled using the standard configure/make approach. If you want to
+compile for X11, pass the --with-x option to configure. Otherwise, running
+./configure without any arguments or passing --enable-gui=photon, will compile
+vim with the Photon gui support. Run ./configure --help , to find out other
+features you can enable/disable.
+
+
+3. Terminal support *qnx-terminal*
+
+Vim has support for the mouse and clipboard in a pterm, if those options
+are compiled in, which they are normally.
+
+The options that affect mouse support are |'mouse'| and |'ttymouse'|. When
+using the mouse, only simple left and right mouse clicking/dragging is
+supported. If you hold down shift, ctrl, or alt while using the mouse, pterm
+will handle the mouse itself. It will make a selection, separate from what
+vim's doing.
+
+When the mouse is in use, you can press Alt-RightMouse to open the pterm menu.
+To turn the mouse off in vim, set the mouse option to nothing, set mouse=
+
+
+4. Photon GUI *photon-gui*
+
+To start the gui for vim, you need to run either gvim or vim -g, otherwise
+the terminal version will run. For more info - |gui-x11-start|
+
+Supported features:
+ :browse command |:browse|
+ :confirm command |:confirm|
+ Cursor blinking |'guicursor'|
+ Menus, popup menus and menu priorities |:menu|
+ |popup-menu|
+ |menu-priority|
+ Toolbar |gui-toolbar|
+ |'toolbar'|
+ Font selector (:set guifont=*) |photon-fonts|
+ Mouse focus |'mousefocus'|
+ Mouse hide |'mousehide'|
+ Mouse cursor shapes |'mouseshape'|
+ Clipboard |gui-clipboard|
+
+Unfinished features:
+ Various international support, such as Farsi & Hebrew support,
+ different encodings, etc.
+
+ This help file
+
+Unsupported features:
+ Find & Replace window |:promptfind|
+ Tearoff menus
+
+ Other things which I can't think of so I can't list them
+
+
+5. Fonts *photon-fonts*
+
+You set fonts in the gui with the guifont option >
+ :set guifont=Lucida\ Terminal
+<
+The font must be a monospace font, and any spaces in the font name must be
+escaped with a '\'. The default font used is PC Terminal, size 8. Using
+'*' as the font name will open a standard Photon font selector where you can
+select a font.
+
+Following the name, you can include optional settings to control the size and
+style of the font, each setting separated by a ':'. Not all fonts support the
+various styles.
+
+The options are,
+ s{size} Set the size of the font to {size}
+ b Bold style
+ a Use antialiasing
+ i Italic style
+
+Examples:
+
+Set the font to monospace size 10 with antialiasing >
+ :set guifont=monospace:s10:a
+<
+Set the font to Courier size 12, with bold and italics >
+ :set guifont=Courier:s12:b:i
+<
+Select a font with the requester >
+ :set guifont=*
+<
+
+
+6. Bugs & things To Do
+
+Known problems:
+ - Vim hangs sometimes when running an external program. Workaround:
+ put this line in your |vimrc| file: >
+ set noguipty
+
+Bugs:
+ - Still a slight problem with menu highlighting.
+ - When using phditto/phinows/etc., if you are using a font that
+ doesn't support the bold attribute, when vim attempts to draw
+ bold text it will be all messed up.
+ - The cursor can sometimes be hard to see.
+ - A number of minor problems that can fixed. :)
+
+Todo:
+ - Improve multi-language support.
+ - Options for setting the fonts used in the menu and toolbar.
+ - Find & Replace dialog.
+ - The clientserver features.
+ - Maybe tearoff menus.
+
+ - Replace usage of fork() with spawn() when launching external
+ programs.
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_risc.txt b/runtime/doc/os_risc.txt
new file mode 100644
index 0000000..92af8cd
--- /dev/null
+++ b/runtime/doc/os_risc.txt
@@ -0,0 +1,12 @@
+*os_risc.txt* For Vim version 9.0. Last change: 2011 May 10
+
+
+ VIM REFERENCE MANUAL by Thomas Leonard
+
+
+ *riscos* *RISCOS* *RISC-OS*
+The RISC OS support has been removed from Vim with patch 7.3.187.
+If you would like to use Vim on RISC OS get the files from before that patch.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_unix.txt b/runtime/doc/os_unix.txt
new file mode 100644
index 0000000..9908b15
--- /dev/null
+++ b/runtime/doc/os_unix.txt
@@ -0,0 +1,61 @@
+*os_unix.txt* For Vim version 9.0. Last change: 2022 Nov 25
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *unix* *Unix*
+This file contains the particularities for the Unix version of Vim.
+
+For compiling Vim on Unix see "INSTALL" and "Makefile" in the src directory.
+
+The default help file name is "/usr/local/lib/vim/help.txt"
+The files "$HOME/.vimrc" and "$HOME/.exrc" are used instead of "s:.vimrc" and
+"s:.exrc". Additionally "/usr/local/etc/vimrc" is used first.
+If "/usr/local/share" exists it is used instead of "/usr/local/lib".
+
+Temporary files (for filtering) are put in "/tmp". If you want to place them
+somewhere else, set the environment variable $TMPDIR to the directory you
+prefer.
+
+With wildcard expansion you can use '~' (home directory) and '$'
+(environment variable).
+
+ *fork* *spoon*
+For executing external commands fork()/exec() is used when possible, otherwise
+system() is used, which is a bit slower. The output of ":version" includes
+|+fork| when fork()/exec() is used, |+system()| when system() is used. This
+can be changed at compile time.
+(For forking of the GUI version see |gui-fork|.)
+
+For historic reasons terminal updating under Unix is expected to be slow (e.g.
+serial line terminal, shell window in suntools), the 'showcmd' and 'ruler'
+options are off by default. If you have a fast terminal, try setting them
+on: >
+ set showcmd ruler
+
+When using Vim in an xterm the mouse clicks can be used by Vim by setting
+'mouse' to "a". If there is access to an X-server gui style copy/paste will
+be used and visual feedback will be provided while dragging with the mouse.
+If you then still want the xterm copy/paste with the mouse, press the shift
+key when using the mouse. See |mouse-using|. Visual feedback while dragging
+can also be achieved via the 'ttymouse' option if your xterm is new enough.
+
+ *terminal-colors*
+To use colors in Vim you can use the following example (if your terminal
+supports colors, but "T_Co" is empty or zero): >
+ :set t_me=^[[0;1;36m " normal mode (undoes t_mr and t_md)
+ :set t_mr=^[[0;1;33;44m " reverse (invert) mode
+ :set t_md=^[[1;33;41m " bold mode
+ :set t_se=^[[1;36;40m " standout end
+ :set t_so=^[[1;32;45m " standout mode
+ :set t_ue=^[[0;1;36m " underline end
+ :set t_us=^[[1;32m " underline mode start
+[the ^[ is an <Esc>, type CTRL-V <Esc> to enter it]
+
+For real color terminals the ":highlight" command can be used.
+
+The file "tools/vim132" is a shell script that can be used to put Vim in 132
+column mode on a vt100 and lookalikes.
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_vms.txt b/runtime/doc/os_vms.txt
new file mode 100644
index 0000000..54eb63c
--- /dev/null
+++ b/runtime/doc/os_vms.txt
@@ -0,0 +1,968 @@
+*os_vms.txt* For Vim version 9.0. Last change: 2022 Nov 25
+
+
+ VIM REFERENCE MANUAL
+
+
+ *VMS* *vms*
+This file contains the particularities for the VMS version of Vim.
+You can reach this information file by typing :help VMS in Vim command
+prompt.
+
+ 1. Getting started |vms-started|
+ 2. Download files |vms-download|
+ 3. Compiling |vms-compiling|
+ 4. Problems |vms-problems|
+ 5. Deploy |vms-deploy|
+ 6. Practical usage |vms-usage|
+ 7. GUI mode questions |vms-gui|
+ 8. Useful notes |vms-notes|
+ 9. VMS related changes |vms-changes|
+10. Authors |vms-authors|
+
+==============================================================================
+
+1. Getting started *vms-started*
+
+Vim (Vi IMproved) is a Vi-compatible text editor that runs on nearly every
+operating system known to humanity. Now use Vim on OpenVMS too, in character
+or X/Motif environment. It is fully featured and absolutely compatible with
+Vim on other operating systems.
+
+==============================================================================
+
+2. Download files *vms-download*
+
+You can download the Vim source code by ftp from the official Vim site:
+ ftp://ftp.vim.org/pub/vim/
+Or use one of the mirrors:
+ ftp://ftp.vim.org/pub/vim/MIRRORS
+
+You can download precompiled executables from:
+ http://www.polarhome.com/vim/
+ ftp://ftp.polarhome.com/pub/vim/
+
+To use the precompiled binary version, you need one of these archives:
+
+ vim-XX-exe-ia64-gui.zip IA64 GUI/Motif executables
+ vim-XX-exe-ia64-gtk.zip IA64 GUI/GTK executables
+ vim-XX-exe-ia64-term.zip IA64 console executables
+ vim-XX-exe-axp-gui.zip Alpha GUI/Motif executables
+ vim-XX-exe-axp-gtk.zip Alpha GUI/GTK executables
+ vim-XX-exe-axp-term.zip Alpha console executables
+ vim-XX-exe-vax-gui.zip VAX GUI executables
+ vim-XX-exe-vax-term.zip VAX console executables
+
+and of course (optional)
+ vim-XX-runtime.zip runtime files
+
+The binary archives contain: vim.exe, ctags.exe, xxd.exe files.
+
+For GTK executables you will need GTKLIB that is available for
+Alpha and IA64 platform.
+
+==============================================================================
+
+3. Compiling *vms-compiling*
+
+See the file [.SRC]INSTALLVMS.TXT.
+
+==============================================================================
+
+4. Problems *vms-problems*
+
+The code has been tested under Open VMS 6.2 - 8.2 on Alpha, VAX and IA64
+platforms with the DEC C compiler. It should work without major problems.
+If your system does not have some include libraries you can tune up in
+OS_VMS_CONF.H file.
+
+If you decided to build Vim with +perl, +python, etc. options, first you need
+to download OpenVMS distributions of Perl and Python. Build and deploy the
+libraries and change adequate lines in MAKE_VMS.MMS file. There should not be
+a problem from Vim side.
+
+Also GTK, XPM library paths should be configured in MAKE_VMS.MMS
+
+Note: Under VAX it should work with the DEC C compiler without problems. The
+VAX C compiler is not fully ANSI C compatible in pre-processor directives
+semantics, therefore you have to use a converter program that will do the lion
+part of the job. For detailed instructions read file INSTALLvms.txt
+
+MMS_VIM.EXE is built together with VIM.EXE, but for XXD.EXE you should
+change to a subdirectory and build it separately.
+
+CTAGS is not part of the Vim source distribution anymore, however the OpenVMS
+specific source might contain CTAGS source files as described above.
+You can find more information about CTAGS on VMS at
+http://www.polarhome.com/ctags/
+
+Advanced users may try some acrobatics in FEATURE.H file as well.
+
+It is possible to compile with +xfontset +xim options too, but then you have
+to set up GUI fonts etc. correctly. See :help xim from Vim command prompt.
+
+You may want to use GUI with GTK icons, then you have to download and install
+GTK for OpenVMS or at least runtime shareable images - LIBGTK from
+polarhome.com
+Post 7.2 Vim uses GTK2+ while the last GTK on OpenVMS is 1.2.10, therefore
+the GTK build is no longer available.
+
+For more advanced questions, please send your problem to Vim on VMS mailing
+list <vim-vms@polarhome.com>
+More about the vim-vms list can be found at:
+http://www.polarhome.com/mailman/listinfo/vim-vms
+
+==============================================================================
+
+5. Deploy *vms-deploy*
+
+Vim uses a special directory structure to hold the document and runtime files:
+
+ vim (or wherever)
+ |- tmp
+ |- vim57
+ |----- doc
+ |----- syntax
+ |- vim62
+ |----- doc
+ |----- syntax
+ |- vim64
+ |----- doc
+ |----- syntax
+ vimrc (system rc files)
+ gvimrc
+
+Use: >
+
+ define/nolog VIM device:[path.vim]
+ define/nolog VIMRUNTIME device:[path.vim.vim60]
+ define/nolog TMP device:[path.tmp]
+
+To get vim.exe to find its document, filetype, and syntax files, and to
+specify a directory where temporary files will be located. Copy the "runtime"
+subdirectory of the Vim distribution to vimruntime.
+
+Logicals $VIMRUNTIME and $TMP are optional.
+
+If $VIMRUNTIME is not set, Vim will guess and try to set up automatically.
+Read more about it at :help runtime
+
+If $TMP is not set, you will not be able to use some functions as CTAGS,
+XXD, printing etc. that use temporary directory for normal operation.
+The $TMP directory should be readable and writable by the user(s).
+The easiest way to set up $TMP is to define a logical: >
+
+ define/nolog TMP SYS$SCRATCH
+or as: >
+ define/nolog TMP SYS$LOGIN
+
+==============================================================================
+
+6. Practical usage *vms-usage*
+
+Usually, you want to run just one version of Vim on your system, therefore
+it is enough to dedicate one directory for Vim.
+Copy the whole Vim runtime directory structure to the deployment position.
+Add the following lines to your LOGIN.COM (in SYS$LOGIN directory).
+Set up the logical $VIM as: >
+
+ $ define VIM device:<path>
+
+Set up some symbols: >
+
+ $ ! vi starts Vim in chr. mode.
+ $ vi*m :== mcr VIM:VIM.EXE
+
+ $ !gvi starts Vim in GUI mode.
+ $ gv*im :== spawn/nowait mcr VIM:VIM.EXE -g
+
+Please, check the notes for customization and configuration of symbols.
+
+You may want to create .vimrc and .gvimrc files in your home directory
+(SYS$LOGIN) to overwrite default settings.
+
+The easiest way is just rename example files. You may leave the menu file
+(MENU.VIM) and files vimrc and gvimrc in the original $VIM directory. It will
+be the default setup for all users, and for users it is enough to just have
+their own additions or resetting in their home directory in files .vimrc and
+.gvimrc. It should work without problems.
+
+Note: Remember, system rc files (default for all users) don't have a leading
+".". So, system rc files are: >
+
+ $VIM:vimrc
+ $VIM:gvimrc
+ $VIM:menu.vim
+
+and user customized rc files are: >
+
+ sys$login:.vimrc
+ sys$login:.gvimrc
+
+You can check that everything is at the right place with the :version command.
+
+Example LOGIN.COM: >
+
+ $ define/nolog VIM DKA0:[UTIL.VIM81]
+ $ vi*m :== mcr VIM:VIM.EXE
+ $ gv*im:== spawn/nowait/input=NLA0 mcr VIM:VIM.EXE -g -GEOMETRY 80x40
+ $ set disp/create/node=192.168.10.202/trans=tcpip
+
+Note: This set-up should be enough, if you are working on a standalone server or
+clustered environment, but if you want to use Vim as an internode editor in
+DECNET environment, it will satisfy as well.
+You just have to define the "whole" path: >
+
+ $ define VIM "<server_name>[""user password""]::device:<path>"
+ $ vi*m :== "mcr VIM:VIM.EXE"
+
+For example: >
+
+ $ define VIM "PLUTO::RF10:[UTIL.VIM]"
+ $ define VIM "PLUTO""ZAY mypass""::RF10:[UTIL.VIM]" ! if passwd required
+
+You can also use the $VIMRUNTIME logical to point to the proper version of Vim
+if you have installed more versions at the same time. If $VIMRUNTIME is not
+defined Vim will borrow its value from the $VIM logical. You can find more
+information about the $VIMRUNTIME logical by typing :help runtime as a Vim
+command.
+
+System administrators might want to set up a system wide Vim installation,
+then add to the SYS$STARTUP:SYLOGICALS.COM >
+
+ $ define/nolog/sys VIM device:<path>
+ $ define/nolog/sys TMP SYS$SCRATCH
+
+And to the SYS$STARTUP:SYLOGIN.COM >
+
+ $ vi*m :== mcr VIM:VIM.EXE
+ $ gv*im:== spawn/nowait/input=NLA0 mcr VIM:VIM.EXE -g -GEOMETRY 80x40
+
+
+It will set up a normal Vim work environment for every user on the system.
+
+IMPORTANT: Vim on OpenVMS (and on other case insensitive system) command line
+parameters are assumed to be lowercase. In order to indicate that a command
+line parameter is uppercase "/" sign must be used.
+
+Examples:
+ >
+ vim -R filename ! means: -r List swap files and exit
+ vim -/r filename ! means: -R Readonly mode (like "view")
+ vim -u <vimrc> ! means: -u Use <vimrc> instead of any .vimrc
+ vim -/u <gvimrc> ! means: -U Use <gvimrc> instead of any .gvimrc
+
+==============================================================================
+
+7. GUI mode questions *vms-gui*
+
+OpenVMS is a real mainframe OS, therefore even if it has a GUI console, most
+of the users do not use a native X/Window environment during normal operation.
+It is not possible to start Vim in GUI mode "just like that". But anyhow it
+is not too complicated either.
+
+First of all: you will need an executable that is built with the GUI enabled.
+
+Second: you need to have installed DECW/Motif on your VMS server, otherwise
+you will get errors that some shareable libraries are missing.
+
+Third: If you choose to run Vim with extra features such as GUI/GTK then you
+need a GTK installation too or at least a GTK runtime environment (LIBGTK
+can be downloaded from http://www.polarhome.com/vim/).
+
+1) If you are working on the VMS X/Motif console:
+ Start Vim with the command: >
+
+ $ mc device:<path>VIM.EXE -g
+<
+ or type :gui as a command to the Vim command prompt. For more info :help
+ gui
+
+2) If you are working on some other X/Window environment like Unix or a remote
+ X VMS console. Set up display to your host with: >
+
+ $ set disp/create/node=<your IP address>/trans=<transport-name>
+<
+ and start Vim as in point 1. You can find more help in VMS documentation or
+ type: help set disp in VMS prompt.
+ Examples: >
+
+ $ set disp/create/node=192.168.5.159 ! default trans is DECnet
+ $ set disp/create/node=192.168.5.159/trans=tcpip ! TCP/IP network
+ $ set disp/create/node=192.168.5.159/trans=local ! display on the same node
+
+Note: you should define just one of these.
+For more information type $help set disp in VMS prompt.
+
+3) Another elegant solution is XDM if you have installed on OpenVMS box.
+ It is possible to work from XDM client as from GUI console.
+
+4) If you are working on MS-Windows or some other non X/Window environment
+ you need to set up one X server and run Vim as in point 2.
+ For MS-Windows there are available free X servers as MIX, Omni X etc.,
+ as well as excellent commercial products as eXcursion or ReflectionX with
+ built-in DEC support.
+
+Please note, that executables without GUI are slightly faster during startup
+than with enabled GUI in character mode. Therefore, if you do not use GUI
+features, it is worth to choose non GUI executables.
+
+==============================================================================
+
+8. Useful notes *vms-notes*
+
+8.1 Backspace/delete
+8.2 Filters
+8.3 VMS file version numbers
+8.4 Directory conversion
+8.5 Remote host invocation
+8.6 Terminal problems
+8.7 Hex-editing and other external tools
+8.8 Sourcing vimrc and gvimrc
+8.9 Printing from Vim
+8.10 Setting up the symbols
+8.11 diff and other GNU programs
+8.12 diff-mode
+8.13 Allow '$' in C keywords
+8.14 VIMTUTOR for beginners
+8.15 Slow start in console mode issue
+8.16 Common VIM directory - different architectures
+
+8.1 Backspace/delete
+
+There are backspace/delete key inconsistencies with VMS.
+:fixdel doesn't do the trick, but the solution is (without "<" in 'cpo'): >
+
+ :inoremap <C-?> <C-H> " for terminal mode
+ :inoremap <Del> <C-H> " for gui mode
+
+Read more in ch: 8.6 (Terminal problems).
+(Bruce Hunsaker <BNHunsaker@chq.byu.edu> Vim 5.3)
+
+
+8.2 Filters
+
+Vim supports filters, i.e., if you have a sort program that can handle
+input/output redirection like Unix (<infile >outfile), you could use >
+
+ :map \s 0!'aqsort<CR>
+
+(Charles E. Campbell, Jr. <cec@gryphon.gsfc.nasa.gov> Vim 5.4)
+
+
+8.3 VMS file version numbers
+
+Vim is saving files into a new file with the next higher file version
+number, try these settings. >
+
+ :set nobackup " does not create *.*_ backup files
+ :set nowritebackup " does not have any purpose on VMS. It's the
+ " default.
+
+Recovery is working perfectly as well from the default swap file.
+Read more with :help swapfile
+
+(Claude Marinier <ClaudeMarinier@xwavesolutions.com> Vim 5.5, Zoltan Arpadffy
+Vim 5.6)
+
+
+8.4 Directory conversion
+
+Vim will internally convert any unix-style paths and even mixed unix/VMS
+paths into VMS style paths. Some typical conversions resemble:
+
+ /abc/def/ghi -> abc:[def]ghi.
+ /abc/def/ghi.j -> abc:[def]ghi.j
+ /abc/def/ghi.j;2 -> abc:[def]ghi.j;2
+ /abc/def/ghi/jkl/mno -> abc:[def.ghi.jkl]mno.
+ abc:[def.ghi]jkl/mno -> abc:[def.ghi.jkl]mno.
+ ./ -> current directory
+ ../ -> relative parent directory
+ [.def.ghi] -> relative child directory
+ ./def/ghi -> relative child directory
+
+Note: You may use <,> brackets as well (device:<path>file.ext;version) as
+rf10:<user.zay.work>test.c;1
+
+(David Elins <delins@foliage.com>, Jerome Lauret
+<JLAURET@mail.chem.sunysb.edu> Vim 5.6)
+
+
+8.5 Remote host invocation
+
+It is possible to use Vim as an internode editor.
+1. Edit some file from remote node: >
+
+ vi "<server>""username passwd""::<device>:<path><filename>;<version>"
+
+Example: >
+ vi "pluto""zay passwd""::RF10:<USER.ZAY.WORK>TEST.C;1"
+
+Note: syntax is very important, otherwise VMS will recognize more parameters
+instead of one (resulting with: file not found)
+
+2. Set up Vim as your internode editor. If Vim is not installed on your
+host, just set up your IP address, the full Vim path including the server name
+and run the command procedure below: >
+
+ $ if (p1 .eqs. "") .OR. (p2 .eqs. "") then goto usage
+ $ set disp/create/node=<your_IP_here>/trans=tcpip
+ $ define "VIM "<vim_server>""''p1' ''p2'""::<device>:<vim_path>"
+ $ vi*m :== "mcr VIM:VIM.EXE"
+ $ gv*im :== "spawn/nowait mcr VIM:VIM.EXE -g"
+ $ goto end
+ $ usage:
+ $ write sys$output " Please enter username and password as a parameter."
+ $ write sys$output " Example: @SETVIM.COM username passwd"
+ $ end:
+
+Note: Never use it in a clustered environment (you do not need it), loading
+could be very-very slow, but even faster than a local Emacs. :-)
+
+(Zoltan Arpadffy, Vim 5.6)
+
+
+8.6 Terminal problems
+
+If your terminal name is not known to Vim and it is trying to find the default
+one you will get the following message during start-up:
+---
+Terminal entry not found in termcap
+'unknown-terminal' not known. Available built-in terminals are:
+ builtin_gui
+ builtin_riscos
+ builtin_amiga
+ builtin_ansi
+ builtin_vt320
+ builtin_vt52
+ builtin_pcansi
+ builtin_win32
+ builtin_xterm
+ builtin_iris-ansi
+ builtin_debug
+ builtin_dumb
+defaulting to 'vt320'
+---
+The solution is to define the default terminal name: >
+
+ $ ! unknown terminal name. Let us use vt320 or ansi instead.
+ $ ! Note: it's case sensitive
+ $ define term "vt320"
+
+Terminals from VT100 to VT320 (as V300, VT220, VT200) do not need any extra
+keyboard mappings. They should work perfectly as they are, including arrows,
+Ins, Del buttons etc., except Backspace in GUI mode. To solve it, add to
+.gvimrc: >
+
+ inoremap <Del> <BS>
+
+Vim will also recognize that they are fast terminals.
+
+If you're using Vim on remote host or through a very slow connection, you
+might want to reset fast terminal option with: >
+
+ set nottyfast " set terminal to slow mode
+
+
+8.7 Hex-editing and other external tools
+
+A very important difference between OpenVMS and other systems is that VMS uses
+special commands to execute executables: >
+
+ RUN <path>filename
+ MCR <path>filename <parameters>
+
+OpenVMS users always have to be aware that the Vim command :! "just" drop them
+to DCL prompt. This feature is possible to use without any problem with all
+DCL commands, but if we want to execute some programs such as XXD, CTAGS, JTAGS,
+etc. we're running into trouble if we follow the Vim documentation (see: help
+xxd).
+
+Solution: Execute with the MC command and add the full path to the executable.
+Example: Instead of :%!xxd command use: >
+
+ :%!mc vim:xxd
+
+... or in general: >
+ :!mc <path>filename <parameters>
+
+Note: You can use XXD and CTAGS from GUI menu.
+
+To customize ctags it is possible to define the logical $CTAGS with standard
+parameters as: >
+
+ define/nolog CTAGS "--totals -o sys$login:tags"
+
+For additional information, please read :help tagsearch and CTAGS
+documentation at http://ctags.sourceforge.net/ctags.html.
+
+(Zoltan Arpadffy, Vim 5.6-70)
+
+
+8.8 Sourcing vimrc and gvimrc
+
+If you want to use your .vimrc and .gvimrc from other platforms (e.g. Windows)
+you can get in trouble if you ftp that file(s): VMS has different end-of-line
+indication.
+The symptom is that Vim is not sourcing your .vimrc/.gvimrc, even if you say:
+>
+ :so sys$login:.vimrc
+
+One trick is to compress (e.g. zip) the files on the other platform and
+uncompress it on VMS; if you have the same symptom, try to create the files
+with copy-paste (for this you need both op. systems reachable from one
+machine, e.g. an Xterm on Windows or telnet to Windows from VMS).
+
+(Sandor Kopanyi, <sandor.kopanyi@mailbox.hu> Vim 6.0a)
+
+
+8.9 Printing from Vim
+
+To be able to print from Vim (running in GUI mode) under VMS you have to set
+up $TMP logical which should point to some temporary directory and logical
+SYS$PRINT to your default print queue.
+Example: >
+
+ $define SYS$PRINT HP5ANSI
+
+You can print out the whole buffer or just the marked area.
+More info under :help hardcopy
+
+(Zoltan Arpadffy, Vim 6.0c)
+
+
+8.10 Setting up the symbols
+
+When I use gvim this way and press CTRL-Y in the parent terminal, gvim exits.
+I now use a different symbol that seems to work OK and fixes the problem.
+I suggest this instead: >
+
+ $ GV*IM:==SPAWN/NOWAIT/INPUT=NLA0: MCR VIM:VIM.EXE -G -GEOMETRY 80X40
+
+The /INPUT=NLA0: separates the standard input of the gvim process from the
+parent terminal, to block signals from the parent window.
+Without the -GEOMETRY, the gvim window size will be minimal and the menu
+will be confused after a window-resize.
+
+(Carlo Mekenkamp, Coen Engelbarts, Vim 6.0ac)
+
+
+8.11 diff and other GNU programs
+
+From 6.0 diff functionality has been implemented, but OpenVMS does not use
+GNU/Unix like diff therefore built in diff does not work.
+There is a simple solution to solve this anomaly. Install a Unix like diff
+and Vim will work perfectly in diff mode too. You just have to redefine your
+diff program as: >
+
+ define /nolog diff <GNU_PATH>diff.exe
+
+Another, more sophisticated solution is described below (8.12 diff-mode)
+There are other programs such as patch, make etc that may cause the same
+problems. At www.polarhome.com is possible to download an GNU package for
+Alpha and VAX boxes that is meant to solve GNU problems on OpenVMS.
+(Zoltan Arpadffy, Vim 6.1)
+
+
+8.12 diff-mode
+
+Vim 6.0 and higher supports Vim diff-mode (See |new-diff-mode|, |diff-mode|
+and |08.7|). This uses the external program 'diff' and expects a Unix-like
+output format from diff. The standard VMS diff has a different output
+format. To use Vim on VMS in diff-mode, you need to:
+ 1 Install a Unix-like diff program, e.g. GNU diff
+ 2 Tell Vim to use the Unix-like diff for diff-mode.
+
+You can download GNU diff from the VIM-VMS website, it is one of the GNU
+tools in http://www.polarhome.com/vim/files/gnu_tools.zip. I suggest to
+unpack it in a separate directory "GNU" and create a logical GNU: that
+points to that directory, e.g: >
+
+ DEFINE GNU <DISK>:[<DIRECTORY>.BIN.GNU]
+
+You may also want to define a symbol GDIFF, to use the GNU diff from the DCL
+prompt: >
+
+ GDIFF :== $GNU:DIFF.EXE
+
+Now you need to tell Vim to use the new diff program. Take the example
+settings from |diff-diffexpr| and change the call to the external diff
+program to the new diff on VMS. Add this to your .vimrc file: >
+
+ " Set up vimdiff options
+ if v:version >= 600
+ " Use GNU diff on VMS
+ set diffexpr=MyDiff()
+ function MyDiff()
+ let opt = ""
+ if &diffopt =~ "icase"
+ let opt = opt .. "-i "
+ endif
+ if &diffopt =~ "iwhite"
+ let opt = opt .. "-b "
+ endif
+ silent execute "!mc GNU:diff.exe -a " .. opt .. v:fname_in .. " " .. v:fname_new ..
+ \ " > " .. v:fname_out
+ endfunction
+ endif
+
+You can now use Vim in diff-mode, e.g. to compare two files in read-only
+mode: >
+
+ $ VIM -D/R <FILE1> <FILE2>
+
+You can also define new symbols for vimdiff, e.g.: >
+
+ $ VIMDIFF :== 'VIM' -D/R
+ $ GVIMDIFF :== 'GVIM' -D/R
+
+You can now compare files in 4 ways: >
+
+ 1. VMS diff: $ DIFF <FILE1> <FILE2>
+ 2. GNU diff: $ GDIFF <FILE1> <FILE2>
+ 3. VIM diff: $ VIMDIFF <FILE1> <FILE2>
+ 4. GVIM diff: $ GVIMDIFF <FILE1> <FILE2>
+
+(Coen Engelbarts, Vim 6.1)
+
+
+8.13 Allow '$' in C keywords
+
+DEC C uses many identifiers with '$' in them. This is not allowed in ANSI C,
+and Vim recognises the '$' as the end of the identifier. You can change this
+with the 'iskeyword' option.
+Add this command to your .vimrc file: >
+
+ autocmd FileType c,cpp,cs set iskeyword+=$
+
+You can also create the file(s) $VIM/FTPLUGIN/C.VIM (and/or CPP.VIM and
+CS.VIM) and add this command: >
+
+ set iskeyword+=$
+
+Now word-based commands, e.g. the '*'-search-command and the CTRL-]
+tag-lookup, work on the whole identifier. (Ctags on VMS also supports '$' in
+C keywords since ctags version 5.1.)
+
+(Coen Engelbarts, Vim 6.1)
+
+8.14 VIMTUTOR for beginners
+
+The VIMTUTOR.COM DCL script can help Vim beginners to learn/make their first
+steps with Vim on OpenVMS. Depending of binary distribution you may start it
+with: >
+
+ @vim:vimtutor
+
+(Thomas.R.Wyant III, Vim 6.1)
+
+8.16 Slow start in console mode issue
+
+As GUI/GTK Vim works equally well in console mode, many administrators
+deploy those executables system wide.
+Unfortunately, on a remote slow connections GUI/GTK executables behave rather
+slow when user wants to run Vim just in the console mode - because of X
+environment detection timeout.
+
+Luckily, there is a simple solution for that. Administrators need to deploy
+both GUI/GTK build and just console build executables, like below: >
+
+ |- vim73
+ |----- doc
+ |----- syntax
+ vimrc (system rc files)
+ gvimrc
+ gvim.exe (the renamed GUI or GTK built vim.exe)
+ vim.exe (the console only executable)
+
+Define system symbols like below in for ex in LOGIN.COM or SYLOGIN.COM: >
+
+ $ define/nolog VIM RF10:[UTIL.VIM73] ! where you VIM directory is
+ $ vi*m :== mcr VIM:VIM.EXE
+ $ gvi*m :== mcr VIM:GVIM.EXE
+ $ ! or you can try to spawn with
+ $ gv*im :== spawn/nowait/input=NLA0 mcr VIM:GVIM.EXE -g -GEOMETRY 80x40
+
+
+Like this, users that do not have X environment and want to use Vim just in
+console mode can avoid performance problems.
+
+(Zoltan Arpadffy, Vim 7.2)
+
+8.15 Common VIM directory - different architectures
+
+In a cluster that contains nodes with different architectures like below:
+
+$show cluster
+View of Cluster from system ID 11655 node: TOR 18-AUG-2008 11:58:31
++---------------------------------+
+| SYSTEMS | MEMBERS |
++-----------------------+---------|
+| NODE | SOFTWARE | STATUS |
++--------+--------------+---------|
+| TOR | VMS V7.3-2 | MEMBER |
+| TITAN2 | VMS V8.3 | MEMBER |
+| ODIN | VMS V7.3-2 | MEMBER |
++---------------------------------+
+
+It is convenient to have a common VIM directory but execute different
+executables.
+There are several solutions for this problem:
+
+Solution 1. All executables in the same directory with different names
+This is easily done with the following script that can be added
+to the login.com or sylogin.com: >
+
+ $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX"
+ $ then
+ $ say "VAX platform"
+ $ vi*m:== mcr vim:VIM.EXE_VAX
+ $ endif
+ $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH"
+ $ then
+ $ say "ALPHA platform"
+ $ vi*m :== mcr vim:VIM.EXE_AXP
+ $ endif
+ $ if f$getsyi("ARCH_NAME") .eqs. "IA64"
+ $ then
+ $ say "IA64 platform"
+ $ vi*m :== mcr vim:VIM.EXE_IA64
+ $ endif
+
+Solution 2. Different directories: >
+
+ $ if f$getsyi("NODE_HWTYPE") .eqs. "VAX"
+ $ then
+ $ say "VAX platform"
+ $ define/nolog VIM RF10:[UTIL.VAX_EXE] ! VAX executables
+ $ endif
+ $ if f$getsyi("NODE_HWTYPE") .eqs. "ALPH"
+ $ then
+ $ say "ALPHA platform"
+ $ define/nolog VIM RF10:[UTIL.AXP_EXE] ! AXP executables
+ $ endif
+ $ if f$getsyi("ARCH_NAME") .eqs. "IA64"
+ $ then
+ $ say "IA64 platform"
+ $ define/nolog VIM RF10:[UTIL.IA64_EXE] ! IA64 executables
+ $ endif
+ $! VIMRUNTIME must be defined in order to find runtime files
+ $ define/nolog VIMRUNTIME RF10:[UTIL.VIM73]
+
+A good example for this approach is the [GNU]gnu_tools.com script from
+GNU_TOOLS.ZIP package downloadable from http://www.polarhome.com/vim/
+
+(Zoltan Arpadffy, Vim 7.2)
+
+==============================================================================
+
+9. VMS related changes *vms-changes*
+
+Version 8.2
+- make all changes needed for clean compile build of v8.2 on VMS on all platforms
+- fix the call mkdir bug (vicente_polo@yahoo.es)
+- test on VSI OpenVMS Alpha and Itanium platforms
+- added LUA support
+- added XPM support - Motif GUI with toolbar on all platforms
+- XPM v3.4.11 libraries for IA64, AXP and VAX are added
+- start integrating the new test scripts
+
+Version 8.1
+- make necessary changes to build v8.1 on VMS
+
+Version 8.0
+- solve the 100% cpu usage issue while waiting for a keystroke
+- correct the VMS warnings and errors around handling the INFINITY (used in json.c)
+- minor VMS port related changes
+- correct the make_vms.mms file for 8.0
+- fix [.TESTDIR]make_vms.mms for 8.0
+
+Version 7.4
+- Undo: VMS can not handle more than one dot in the filenames use "dir/name" -> "dir/_un_name"
+ add _un_ at the beginning to keep the extension
+- correct swap file name wildcard handling
+- handle iconv usage correctly
+- do not optimize on vax - otherwise it hangs compiling crypto files
+- fileio.c fix the comment
+- correct RealWaitForChar
+- after 7.4-119 use different functions lib$cvtf_to_internal_time because Alpha and VAX have
+ G_FLOAT but IA64 uses IEEE float otherwise Vim crashes
+- guard against crashes that are caused by mixed filenames
+- [TESTDIR]make_vms.mms changed to see the output files
+- Improve tests, update known issues
+- minor compiler warnings fixed
+- CTAGS 5.8 +regex included
+
+Version 7.3
+- CTAGS 5.8 included
+- VMS compile warnings fixed - floating-point overflow warning corrected on VAX
+- filepath completion corrected - too many chars were escaped in filename
+ and shell commands
+- the following plugins are included into VMS runtime:
+ genutils 2.4, multiselect 2.2, multvals 3.1, selectbuf 4.3,
+ bufexplorer 7.1.7, taglist 4.5
+- minor changes in vimrc (just in VMS runtime)
+- make_vms.mms - HUGE model is the default
+- [TESTDIR]make_vms.mms include as many tests possible
+- modify test30 and test54 for VMS
+- enable FLOAT feature in VMS port
+- os_vms.txt updated
+
+Version 7.2 (2008 Aug 9)
+- VCF files write corrected
+- CTAGS 5.7 included
+- corrected make_vms.mms (on VAX gave syntax error)
+
+Version 7.1 (2007 Jun 15)
+- create TAGS file from menu
+
+Version 7 (2006 May 8)
+- Improved low level char input (affects just console mode)
+- Fixed plugin bug
+- CTAGS 5.6 included
+
+Version 6.4 (2005 Oct 15)
+- GTKLIB and Vim build on IA64
+- colors in terminal mode
+- syntax highlighting in terminal mode
+- write problem fixed (extra CR)
+- ESC and ESC sequence recognition in terminal mode
+- make file changed to support new MMS version
+- env variable expansion in path corrected
+- printing problems corrected
+- help text added for case insensitive arguments
+
+Version 6.3 (2004 May 10)
+- Improved vms_read function
+- CTAGS v5.5.4 included
+- Documentation corrected and updated
+
+Version 6.2 (2003 May 7)
+- Corrected VMS system call results
+- Low level character input is rewritten
+- Correction in tag and quickfix handling
+- First GTK build
+- Make file changes
+ - GTK feature added
+ - Define for OLD_VMS
+ - OpenVMS version 6.2 or older
+- Documentation updated with GTK features
+- CTAGS v5.5 included
+- VMS VIM tutor created
+
+Version 6.1 (2002 Mar 25)
+- TCL init_tcl() problem fixed
+- CTAGS v5.4 included
+- GNU tools binaries for OpenVMS
+- Make file changes
+ - PERL, PYTHON and TCL support improved
+ - InstallVMS.txt has a detailed description HOWTO build
+- VMS/Unix file handling rewritten
+- Minor casting and bug fixes
+
+Version 6.0 (2001 Sep 28)
+- Unix and VMS code has been merged
+ - separated "really" VMS related code
+ - included all possible Unix functionality
+ - simplified or deleted the configuration files
+ - makefile MAKE_VMS.MMS reviewed
+- menu changes (fixed printing, CTAGS and XXD usage)
+- fixed variable RMS record format handling anomaly
+- corrected syntax, ftplugin etc files load
+- changed expand_wildcards and expandpath functions to work more general
+- created OS_VMS_FILTER.COM - DECC->VAXC pre-processor directive convert
+ script.
+- Improved code's VAXC and new DECC compilers compatibility
+- changed quickfix parameters:
+ - errormessage format to suite DECC
+ - search, make and other commands to suite VMS system
+- updated and renamed MMS make files for Vim and CTAGS.
+- CTAGS has been removed from source distribution of Vim but it will remain
+ in OpenVMS binary distributions.
+- simplified build/configuration procedure
+- created INSTALLvms.txt - detailed compiling instructions under VMS.
+- updated test scripts.
+
+Version 5.8 (2001 Jun 1)
+- OS_VMS.TXT updated with new features.
+- other minor fixes.
+- documentation updated
+- this version had been tested much more than any other OpenVMS version
+ earlier
+
+Version 5.7 (2000 Jun 24)
+- New CTAGS v5.0 in distribution
+- Documentation updated
+
+Version 5.6 (2000 Jan 17)
+- VMS filename related changes:
+ - version handling (open everything, save to new version)
+ - correct file extension matching for syntax (version problem)
+ - handle <,> characters and passwords in directory definition
+ - handle internode/remote invocation and editing with passwords
+ - OpenVMS files will be treated case insensitive from now
+ - corrected response of expand("%:.") etc path related functions
+ (in one word: VMS directory handling internally)
+- version command
+ - corrected (+,-) information data
+ - added compiler and OS version
+ - added user and host information
+ - resolving $VIM and $VIMRUNTIME logicals
+- VMS port is in MAX_FEAT (maximum features) club with Unix, Win32 and OS/2.
+ - enabled farsi, rightleft etc. features
+ - undo level raised up to 1000
+- Updated OS_VMS.MMS file.
+ - maximum features ON is default
+ - Vim is compilable with +perl, +python and +tcl features.
+ - improved MMK compatibility
+- Created MAKEFILE_VMS.MMS, makefile for testing Vim during development.
+- Defined DEC terminal VT320
+ - compatibility for VT3*0, VT2*0 and VT1*0 - ANSI terminals
+ backwards, but not VT340 and newer with colour capability.
+ - VT320 is default terminal for OpenVMS
+ - these new terminals are also fast ttys (default for OpenVMS).
+ - allowed dec_mouse ttym
+- Updated files vimrc and gvimrc with VMS specific suggestions.
+- OS_VMS.TXT updated with new features.
+
+Version 5.5 (1999 Dec 3)
+- Popup menu line crash corrected.
+- Handle full file names with version numbers.
+- Directory handling (CD command etc.)
+- Corrected file name conversion VMS to Unix and v.v.
+- Correct response of expand wildcards
+- Recovery is working from this version under VMS as well.
+- Improved terminal and signal handing.
+- Improved OS_VMS.TXT
+
+Version 5.4 (1999 Sep 9)
+- Cut and paste mismatch corrected.
+- Motif directories during open and save are corrected.
+
+Version 5.3 (1998 Oct 12)
+- Minor changes in the code
+- Standard distribution with +GUI option
+
+Version 5.1 (1998 Apr 21)
+- Syntax and DEC C changes in the code
+- Fixing problems with the /doc subdirectory
+- Improve OS_VMS.MMS
+
+Version 4.5 (1996 Dec 16)
+- First VMS port by Henk Elbers <henk@xs4all.nl>
+
+==============================================================================
+
+10. Authors *vms-authors*
+
+OpenVMS documentation and executables are maintained by:
+Zoltan Arpadffy <arpadffy@polarhome.com>
+OpenVMS Vim page: http://www.polarhome.com/vim/
+
+This document uses parts and remarks from earlier authors and contributors
+of OS_VMS.TXT:
+ Charles E. Campbell, Jr. <cec@gryphon.gsfc.nasa.gov>
+ Bruce Hunsaker <BNHunsaker@chq.byu.edu>
+ Sandor Kopanyi <sandor.kopanyi@mailbox.hu>
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/os_win32.txt b/runtime/doc/os_win32.txt
new file mode 100644
index 0000000..e72ecc8
--- /dev/null
+++ b/runtime/doc/os_win32.txt
@@ -0,0 +1,338 @@
+*os_win32.txt* For Vim version 9.0. Last change: 2022 Sep 18
+
+
+ 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 7, 8, 10 and 11. There are both
+console and GUI versions.
+
+If you have Windows XP or Vista then Vim 9.0 up to patch level 495 can be
+used.
+
+The 32 bit version also runs on 64 bit MS-Windows systems.
+
+1. Known problems |win32-problems|
+2. Startup |win32-startup|
+3. Restore screen contents |win32-restore|
+4. Using the mouse |win32-mouse|
+5. Running under Windows 95 |win32-win95|
+6. Running under Windows 3.1 |win32-win3.1|
+7. Installation package |win32-installer|
+8. 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|
+PowerShell defaults |dos-powershell|
+
+Win32 GUI |gui-w32|
+
+Credits:
+The Win32 version was written by George V. Reilly <george@reilly.org>.
+The original Windows NT port was done by Roger Knobbe <RogerK@wonderware.com>.
+The GUI version was made by George V. Reilly and Robert Webb.
+
+For compiling see "src/INSTALLpc.txt". *win32-compiling*
+
+ *WSL*
+When using Vim on WSL (Windows Subsystem for Linux) the remarks here do not
+apply, `has('win32')` will return false then. In case you need to know
+whether Vim is running on WSL you can use `exists('$WSLENV')`.
+
+==============================================================================
+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.
+
+Command line arguments *win32-cmdargs*
+
+Analysis of a command line into parameters is not standardised in MS-Windows.
+Vim and gvim used to use different logic to parse it (before 7.4.432), and the
+logic was also depended on what it was compiled with. Now Vim and gvim both
+use the CommandLineToArgvW() Win32 API, so they behave in the same way.
+
+The basic rules are: *win32-backslashes*
+ a) A parameter is a sequence of graphic characters.
+ b) Parameters are separated by white space.
+ c) A parameter can be enclosed in double quotes to include white space.
+ d) A sequence of zero or more backslashes (\) and a double quote (")
+ is special. The effective number of backslashes is halved, rounded
+ down. An even number of backslashes reverses the acceptability of
+ spaces and tabs, an odd number of backslashes produces a literal
+ double quote.
+
+So:
+ " is a special double quote
+ \" is a literal double quote
+ \\" is a literal backslash and a special double quote
+ \\\" is a literal backslash and a literal double quote
+ \\\\" is 2 literal backslashes and a special double quote
+ \\\\\" is 2 literal backslashes and a literal double quote
+ etc.
+
+Example: >
+ vim "C:\My Music\freude" +"set ignorecase" +/"\"foo\\" +\"bar\\\"
+
+opens "C:\My Music\freude" and executes the line mode commands: >
+ set ignorecase; /"foo\ and /bar\"
+
+These rules are also described in the reference of the CommandLineToArgvW API:
+ https://msdn.microsoft.com/en-us/library/windows/desktop/bb776391.aspx
+
+ *win32-quotes*
+There are additional rules for quotes (which are not well documented).
+As described above, 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. Restore screen contents *win32-restore*
+
+When 'restorescreen' is set (which is the default), Vim will restore the
+original contents of the console when exiting or when executing external
+commands. If you don't want this, use ":set nors". |'restorescreen'|
+
+==============================================================================
+4. 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.
+
+==============================================================================
+5. Running under Windows 95 *win32-win95*
+ *windows95* *windows98* *windowsme*
+Windows 95/98/ME support was removed in patch 8.0.0029 If you want to use it
+you will need to get a version older than that.
+
+==============================================================================
+6. Running under Windows 3.1 *win32-win3.1*
+
+ *win32s* *windows-3.1* *gui-w32s* *win16*
+There was a special version of gvim that runs under Windows 3.1 and 3.11.
+Support was removed in patch 7.4.1364.
+
+==============================================================================
+7. Installation package *win32-installer*
+
+A simple installer for windows is available at http://www.vim.org/download.php
+(stable version) and nightly builds are also available at
+https://github.com/vim/vim-win32-installer/releases/
+
+The nightly builds include 32bit and 64bit builds, have most features enabled
+and usually also contain an extra cryptographic signed installer, so Windows
+will not complain.
+
+To use the installer, simply run the exe file. The following switches are
+also supported: >
+
+ gvim_<version>.exe /S -> silent install without any dialogues
+ gvim_<version>.exe /D=C:\vim -> Install into directory c:\vim
+ -> /D must be the last argument
+ gvim_<version>.exe /S /D=c:\vim -> silent install into c:\vim
+<
+The default installation directory can alternatively be given by setting the
+$VIM environment variable.
+
+==============================================================================
+8. 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. How do I type dead keys on Windows NT?
+A. Dead keys work on NT 3.51. Just type them as you would in any other
+ application.
+ On NT 4.0, you need to make sure that the default locale (set in the
+ Keyboard part of the Control Panel) is the same as the currently active
+ locale. Otherwise the NT code will get confused and crash! This is a NT
+ 4.0 problem, not really a Vim problem.
+
+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.
+
+Q. I'm storing files on a remote machine that works with VisionFS, and files
+ disappear!
+A. VisionFS can't handle certain dot (.) three letter extension file names.
+ SCO declares this behavior required for backwards compatibility with 16bit
+ DOS/Windows environments. The two commands below demonstrate the behavior:
+>
+ echo Hello > file.bat~
+ dir > file.bat
+<
+ The result is that the "dir" command updates the "file.bat~" file, instead
+ of creating a new "file.bat" file. This same behavior is exhibited in Vim
+ when editing an existing file named "foo.bat" because the default behavior
+ of Vim is to create a temporary file with a '~' character appended to the
+ name. When the file is written, it winds up being deleted.
+
+ Solution: Add this command to your _vimrc file: >
+ :set backupext=.temporary
+
+Q. How do I change the blink rate of the cursor?
+A. You can't! This is a limitation of the NT console. NT 5.0 is reported to
+ be able to set the blink rate for all console windows at the same time.
+
+ *:!start*
+Q. How can I asynchronously run an external command or program, or open a
+ document or URL with its default program?
+A. When using :! to run an external command, you can run it with "start". For
+ example, to run notepad: >
+ :!start notepad
+< To open "image.jpg" with the default image viewer: >
+ :!start image.jpg
+< To open the folder of the current file in Windows Explorer: >
+ :!start %:h
+< To open the Vim home page with the default browser: >
+ :!start http://www.vim.org/
+<
+ 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.
+ *windows-asynchronously*
+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:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/pattern.txt b/runtime/doc/pattern.txt
new file mode 100644
index 0000000..9e048ff
--- /dev/null
+++ b/runtime/doc/pattern.txt
@@ -0,0 +1,1503 @@
+*pattern.txt* For Vim version 9.0. Last change: 2023 Feb 04
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+11. Fuzzy matching |fuzzy-matching|
+
+==============================================================================
+1. Search commands *search-commands*
+
+ */*
+/{pattern}[/]<CR> Search forward for the [count]'th occurrence of
+ {pattern} |exclusive|.
+
+/{pattern}/{offset}<CR> Search forward for the [count]'th occurrence of
+ {pattern} and go |{offset}| lines up or down.
+ |linewise|.
+
+ */<CR>*
+/<CR> Search forward for the [count]'th occurrence of the
+ latest used pattern |last-pattern| with latest used
+ |{offset}|.
+
+//{offset}<CR> Search forward for the [count]'th occurrence of the
+ latest used pattern |last-pattern| with new
+ |{offset}|. If {offset} is empty no offset is used.
+
+ *?*
+?{pattern}[?]<CR> Search backward for the [count]'th previous
+ occurrence of {pattern} |exclusive|.
+
+?{pattern}?{offset}<CR> Search backward for the [count]'th previous
+ occurrence of {pattern} and go |{offset}| lines up or
+ down |linewise|.
+
+ *?<CR>*
+?<CR> Search backward for the [count]'th occurrence of the
+ latest used pattern |last-pattern| with latest used
+ |{offset}|.
+
+??{offset}<CR> Search backward for the [count]'th occurrence of the
+ latest used pattern |last-pattern| with new
+ |{offset}|. If {offset} is empty no offset is used.
+
+ *n*
+n Repeat the latest "/" or "?" [count] times.
+ If the cursor doesn't move the search is repeated with
+ count + 1.
+ |last-pattern|
+
+ *N*
+N Repeat the latest "/" or "?" [count] times in
+ opposite direction. |last-pattern|
+
+ *star* *E348* *E349*
+* Search forward for the [count]'th occurrence of the
+ word nearest to the cursor. The word used for the
+ search is the first of:
+ 1. the keyword under the cursor |'iskeyword'|
+ 2. the first keyword after the cursor, in the
+ current line
+ 3. the non-blank word under the cursor
+ 4. the first non-blank word after the cursor,
+ in the current line
+ Only whole keywords are searched for, like with the
+ command "/\<keyword\>". |exclusive|
+ 'ignorecase' is used, 'smartcase' is not.
+
+ *#*
+# Same as "*", but search backward. The pound sign
+ (character 163) also works. If the "#" key works as
+ backspace, try using "stty erase <BS>" before starting
+ Vim (<BS> is CTRL-H or a real backspace).
+
+ *gstar*
+g* Like "*", but don't put "\<" and "\>" around the word.
+ This makes the search also find matches that are not a
+ whole word.
+
+ *g#*
+g# Like "#", but don't put "\<" and "\>" around the word.
+ This makes the search also find matches that are not a
+ whole word.
+
+ *gd*
+gd Goto local Declaration. When the cursor is on a local
+ variable, this command will jump to its declaration.
+ This was made to work for C code, in other languages
+ it may not work well.
+ First Vim searches for the start of the current
+ function, just like "[[". If it is not found the
+ search stops in line 1. If it is found, Vim goes back
+ until a blank line is found. From this position Vim
+ searches for the keyword under the cursor, like with
+ "*", but lines that look like a comment are ignored
+ (see 'comments' option).
+ Note that this is not guaranteed to work, Vim does not
+ really check the syntax, it only searches for a match
+ with the keyword. If included files also need to be
+ searched use the commands listed in |include-search|.
+ After this command |n| searches forward for the next
+ match (not backward).
+
+ *gD*
+gD Goto global Declaration. When the cursor is on a
+ global variable that is defined in the file, this
+ command will jump to its declaration. This works just
+ like "gd", except that the search for the keyword
+ always starts in line 1.
+
+ *1gd*
+1gd Like "gd", but ignore matches inside a {} block that
+ ends before the cursor position.
+
+ *1gD*
+1gD Like "gD", but ignore matches inside a {} block that
+ ends before the cursor position.
+
+ *CTRL-C*
+CTRL-C Interrupt current (search) command. Use CTRL-Break on
+ MS-Windows |dos-CTRL-Break|.
+ In Normal mode, any pending command is aborted.
+ When Vim was started with output redirected and there
+ are no changed buffers CTRL-C exits Vim. That is to
+ help users who use "vim file | grep word" and don't
+ know how to get out (blindly typing :qa<CR> would
+ work).
+
+ *:noh* *:nohlsearch*
+:noh[lsearch] Stop the highlighting for the 'hlsearch' option. It
+ is automatically turned back on when using a search
+ command, or setting the 'hlsearch' option.
+ This command doesn't work in an autocommand, because
+ the highlighting state is saved and restored when
+ executing autocommands |autocmd-searchpat|.
+ Same thing for when invoking a user function.
+
+While typing the search pattern the current match will be shown if the
+'incsearch' option is on. Remember that you still have to finish the search
+command with <CR> to actually position the cursor at the displayed match. Or
+use <Esc> to abandon the search.
+
+All matches for the last used search pattern will be highlighted if you set
+the 'hlsearch' option. This can be suspended with the |:nohlsearch| command.
+
+When 'shortmess' does not include the "S" flag, Vim will automatically show an
+index, on which the cursor is. This can look like this: >
+
+ [1/5] Cursor is on first of 5 matches.
+ [1/>99] Cursor is on first of more than 99 matches.
+ [>99/>99] Cursor is after 99 match of more than 99 matches.
+ [?/??] Unknown how many matches exists, generating the
+ statistics was aborted because of search timeout.
+
+Note: the count does not take offset into account.
+
+When no match is found you get the error: *E486* Pattern not found
+Note that for the `:global` command, when used in legacy script, you get a
+normal message "Pattern not found", for Vi compatibility.
+In |Vim9| script you get E486 for "pattern not found" or *E538* when the pattern
+matches in every line with `:vglobal`.
+For the |:s| command the "e" flag can be used to avoid the error message
+|:s_flags|.
+
+ *search-offset* *{offset}*
+These commands search for the specified pattern. With "/" and "?" an
+additional offset may be given. There are two types of offsets: line offsets
+and character offsets.
+
+The offset gives the cursor position relative to the found match:
+ [num] [num] lines downwards, in column 1
+ +[num] [num] lines downwards, in column 1
+ -[num] [num] lines upwards, in column 1
+ e[+num] [num] characters to the right of the end of the match
+ e[-num] [num] characters to the left of the end of the match
+ s[+num] [num] characters to the right of the start of the match
+ s[-num] [num] characters to the left of the start of the match
+ b[+num] [num] identical to s[+num] above (mnemonic: begin)
+ b[-num] [num] identical to s[-num] above (mnemonic: begin)
+ ;{pattern} perform another search, see |//;|
+
+If a '-' or '+' is given but [num] is omitted, a count of one will be used.
+When including an offset with 'e', the search becomes inclusive (the
+character the cursor lands on is included in operations).
+
+Examples:
+
+pattern cursor position ~
+/test/+1 one line below "test", in column 1
+/test/e on the last t of "test"
+/test/s+2 on the 's' of "test"
+/test/b-3 three characters before "test"
+
+If one of these commands is used after an operator, the characters between
+the cursor position before and after the search is affected. However, if a
+line offset is given, the whole lines between the two cursor positions are
+affected.
+
+An example of how to search for matches with a pattern and change the match
+with another word: >
+ /foo<CR> find "foo"
+ c//e<CR> change until end of match
+ bar<Esc> type replacement
+ //<CR> go to start of next match
+ c//e<CR> change until end of match
+ beep<Esc> type another replacement
+ etc.
+<
+ *//;* *E386*
+A very special offset is ';' followed by another search command. For example: >
+
+ /test 1/;/test
+ /test.*/+1;?ing?
+
+The first one first finds the next occurrence of "test 1", and then the first
+occurrence of "test" after that.
+
+This is like executing two search commands after each other, except that:
+- It can be used as a single motion command after an operator.
+- The direction for a following "n" or "N" command comes from the first
+ search command.
+- When an error occurs the cursor is not moved at all.
+
+ *last-pattern*
+The last used pattern and offset are remembered. They can be used to repeat
+the search, possibly in another direction or with another count. Note that
+two patterns are remembered: One for "normal" search commands and one for the
+substitute command ":s". Each time an empty pattern is given, the previously
+used pattern is used. However, if there is no previous search command, a
+previous substitute pattern is used, if possible.
+
+The 'magic' option sticks with the last used pattern. If you change 'magic',
+this will not change how the last used pattern will be interpreted.
+The 'ignorecase' option does not do this. When 'ignorecase' is changed, it
+will result in the pattern to match other text.
+
+All matches for the last used search pattern will be highlighted if you set
+the 'hlsearch' option.
+
+To clear the last used search pattern: >
+ :let @/ = ""
+This will not set the pattern to an empty string, because that would match
+everywhere. The pattern is really cleared, like when starting Vim.
+
+The search usually skips matches that don't move the cursor. Whether the next
+match is found at the next character or after the skipped match depends on the
+'c' flag in 'cpoptions'. See |cpo-c|.
+ with 'c' flag: "/..." advances 1 to 3 characters
+ without 'c' flag: "/..." advances 1 character
+The unpredictability with the 'c' flag is caused by starting the search in the
+first column, skipping matches until one is found past the cursor position.
+
+When searching backwards, searching starts at the start of the line, using the
+'c' flag in 'cpoptions' as described above. Then the last match before the
+cursor position is used.
+
+In Vi the ":tag" command sets the last search pattern when the tag is searched
+for. In Vim this is not done, the previous search pattern is still remembered,
+unless the 't' flag is present in 'cpoptions'. The search pattern is always
+put in the search history.
+
+If the 'wrapscan' option is on (which is the default), searches wrap around
+the end of the buffer. If 'wrapscan' is not set, the backward search stops
+at the beginning and the forward search stops at the end of the buffer. If
+'wrapscan' is set and the pattern was not found the error message "pattern
+not found" is given, and the cursor will not be moved. If 'wrapscan' is not
+set the message becomes "search hit BOTTOM without match" when searching
+forward, or "search hit TOP without match" when searching backward. If
+wrapscan is set and the search wraps around the end of the file the message
+"search hit TOP, continuing at BOTTOM" or "search hit BOTTOM, continuing at
+TOP" is given when searching backwards or forwards respectively. This can be
+switched off by setting the 's' flag in the 'shortmess' option. The highlight
+method 'w' is used for this message (default: standout).
+
+ *search-range*
+You can limit the search command "/" to a certain range of lines by including
+\%>l items. For example, to match the word "limit" below line 199 and above
+line 300: >
+ /\%>199l\%<300llimit
+Also see |/\%>l|.
+
+Another way is to use the ":substitute" command with the 'c' flag. Example: >
+ :.,300s/Pattern//gc
+This command will search from the cursor position until line 300 for
+"Pattern". At the match, you will be asked to type a character. Type 'q' to
+stop at this match, type 'n' to find the next match.
+
+The "*", "#", "g*" and "g#" commands look for a word near the cursor in this
+order, the first one that is found is used:
+- The keyword currently under the cursor.
+- The first keyword to the right of the cursor, in the same line.
+- The WORD currently under the cursor.
+- The first WORD to the right of the cursor, in the same line.
+The keyword may only contain letters and characters in 'iskeyword'.
+The WORD may contain any non-blanks (<Tab>s and/or <Space>s).
+Note that if you type with ten fingers, the characters are easy to remember:
+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 checking 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*
+ *E383* *E476*
+
+For starters, read chapter 27 of the user manual |usr_27.txt|.
+
+ */bar* */\bar* */pattern*
+1. A pattern is one or more branches, separated by "\|". It matches anything
+ that matches one of the branches. Example: "foo\|beep" matches "foo" and
+ matches "beep". If more than one branch matches, the first one is used.
+
+ pattern ::= branch
+ or branch \| branch
+ or branch \| branch \| branch
+ etc.
+
+ */branch* */\&*
+2. A branch is one or more concats, separated by "\&". It matches the last
+ concat, but only if all the preceding concats also match at the same
+ position. Examples:
+ "foobeep\&..." matches "foo" in "foobeep".
+ ".*Peter\&.*Bob" matches in a line containing both "Peter" and "Bob"
+
+ branch ::= concat
+ or concat \& concat
+ or concat \& concat \& concat
+ etc.
+
+ */concat*
+3. A concat is one or more pieces, concatenated. It matches a match for the
+ first piece, followed by a match for the second piece, etc. Example:
+ "f[0-9]b", first matches "f", then a digit and then "b".
+
+ concat ::= piece
+ or piece piece
+ or piece piece piece
+ etc.
+
+ */piece*
+4. A piece is an atom, possibly followed by a multi, an indication of how many
+ times the atom can be matched. Example: "a*" matches any sequence of "a"
+ characters: "", "a", "aa", etc. See |/multi|.
+
+ piece ::= atom
+ or atom multi
+
+ */atom*
+5. An atom can be one of a long list of items. Many atoms match one character
+ in the text. It is often an ordinary character or a character class.
+ Parentheses can be used to make a pattern into an atom. The "\z(\)"
+ construct is only for syntax highlighting.
+
+ atom ::= ordinary-atom |/ordinary-atom|
+ or \( pattern \) |/\(|
+ or \%( pattern \) |/\%(|
+ or \z( pattern \) |/\z(|
+
+
+ */\%#=* *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, possibly slower
+ on some patterns.
+ *E1281*
+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
+prepend one of the following to the pattern:
+
+ \%#=0 Force automatic selection. Only has an effect when
+ 'regexpengine' has been set to a non-zero value.
+ \%#=1 Force using the old engine.
+ \%#=2 Force using the NFA engine.
+
+You can also use the 'regexpengine' option to change the default.
+
+ *E864* *E868* *E874* *E875* *E876* *E877* *E878*
+If selecting the NFA engine and it runs into something that is not implemented
+the pattern will not match. This is only useful when debugging Vim.
+
+==============================================================================
+3. Magic */magic*
+
+Some characters in the pattern, such as letters, are taken literally. They
+match exactly the same character in the text. When preceded with a backslash
+however, these characters may get a special meaning. For example, "a" matches
+the letter "a", while "\a" matches any alphabetic character.
+
+Other characters have a special meaning without a backslash. They need to be
+preceded with a backslash to match literally. For example "." matches any
+character while "\." matches a dot.
+
+If a character is taken literally or not depends on the 'magic' option and the
+items in the pattern mentioned next. The 'magic' option should always be set,
+but it can be switched off for Vi compatibility. We mention the effect of
+'nomagic' here for completeness, but we recommend against using that.
+ */\m* */\M*
+Use of "\m" makes the pattern after it be interpreted as if 'magic' is set,
+ignoring the actual value of the 'magic' option.
+Use of "\M" makes the pattern after it be interpreted as if 'nomagic' is used.
+ */\v* */\V*
+Use of "\v" means that after it, all ASCII characters except '0'-'9', 'a'-'z',
+'A'-'Z' and '_' have special meaning: "very magic"
+
+Use of "\V" means that after it, only a backslash and the terminating
+character (usually / or ?) have special meaning: "very nomagic"
+
+Examples:
+after: \v \m \M \V matches ~
+ 'magic' 'nomagic'
+ a a a a literal 'a'
+ \a \a \a \a any alphabetic character
+ . . \. \. any character
+ \. \. . . literal dot
+ $ $ $ \$ end-of-line
+ * * \* \* any number of the previous atom
+ ~ ~ \~ \~ latest substitute string
+ () \(\) \(\) \(\) group as an atom
+ | \| \| \| nothing: separates alternatives
+ \\ \\ \\ \\ literal backslash
+ \{ { { { literal curly brace
+
+{only Vim supports \m, \M, \v and \V}
+
+If you want to you can make a pattern immune to the 'magic' option being set
+or not by putting "\m" or "\M" at the start of the pattern.
+
+==============================================================================
+4. Overview of pattern items *pattern-overview*
+ *E865* *E866* *E867* *E869*
+
+Overview of multi items. */multi* *E61* *E62*
+More explanation and examples below, follow the links. *E64* *E871*
+
+ multi ~
+ 'magic' 'nomagic' matches of the preceding atom ~
+|/star| * \* 0 or more as many as possible
+|/\+| \+ \+ 1 or more as many as possible
+|/\=| \= \= 0 or 1 as many as possible
+|/\?| \? \? 0 or 1 as many as possible
+
+|/\{| \{n,m} \{n,m} n to m as many as possible
+ \{n} \{n} n exactly
+ \{n,} \{n,} at least n as many as possible
+ \{,m} \{,m} 0 to m as many as possible
+ \{} \{} 0 or more as many as possible (same as *)
+
+|/\{-| \{-n,m} \{-n,m} n to m as few as possible
+ \{-n} \{-n} n exactly
+ \{-n,} \{-n,} at least n as few as possible
+ \{-,m} \{-,m} 0 to m as few as possible
+ \{-} \{-} 0 or more as few as possible
+
+ *E59*
+|/\@>| \@> \@> 1, like matching a whole pattern
+|/\@=| \@= \@= nothing, requires a match |/zero-width|
+|/\@!| \@! \@! nothing, requires NO match |/zero-width|
+|/\@<=| \@<= \@<= nothing, requires a match behind |/zero-width|
+|/\@<!| \@<! \@<! nothing, requires NO match behind |/zero-width|
+
+
+Overview of ordinary atoms. */ordinary-atom*
+More explanation and examples below, follow the links.
+
+ ordinary atom ~
+ magic nomagic matches ~
+|/^| ^ ^ start-of-line (at start of pattern) |/zero-width|
+|/\^| \^ \^ literal '^'
+|/\_^| \_^ \_^ start-of-line (used anywhere) |/zero-width|
+|/$| $ $ end-of-line (at end of pattern) |/zero-width|
+|/\$| \$ \$ literal '$'
+|/\_$| \_$ \_$ end-of-line (used anywhere) |/zero-width|
+|/.| . \. any single character (not an end-of-line)
+|/\_.| \_. \_. any single character or end-of-line
+|/\<| \< \< beginning of a word |/zero-width|
+|/\>| \> \> end of a word |/zero-width|
+|/\zs| \zs \zs anything, sets start of match
+|/\ze| \ze \ze anything, sets end of match
+|/\%^| \%^ \%^ beginning of file |/zero-width| *E71*
+|/\%$| \%$ \%$ end of file |/zero-width|
+|/\%V| \%V \%V inside Visual area |/zero-width|
+|/\%#| \%# \%# cursor position |/zero-width|
+|/\%'m| \%'m \%'m mark m position |/zero-width|
+|/\%l| \%23l \%23l in line 23 |/zero-width|
+|/\%c| \%23c \%23c in column 23 |/zero-width|
+|/\%v| \%23v \%23v in virtual column 23 |/zero-width|
+
+Character classes: */character-classes*
+ magic nomagic matches ~
+|/\i| \i \i identifier character (see 'isident' option)
+|/\I| \I \I like "\i", but excluding digits
+|/\k| \k \k keyword character (see 'iskeyword' option)
+|/\K| \K \K like "\k", but excluding digits
+|/\f| \f \f file name character (see 'isfname' option)
+|/\F| \F \F like "\f", but excluding digits
+|/\p| \p \p printable character (see 'isprint' option)
+|/\P| \P \P like "\p", but excluding digits
+|/\s| \s \s whitespace character: <Space> and <Tab>
+|/\S| \S \S non-whitespace character; opposite of \s
+|/\d| \d \d digit: [0-9]
+|/\D| \D \D non-digit: [^0-9]
+|/\x| \x \x hex digit: [0-9A-Fa-f]
+|/\X| \X \X non-hex digit: [^0-9A-Fa-f]
+|/\o| \o \o octal digit: [0-7]
+|/\O| \O \O non-octal digit: [^0-7]
+|/\w| \w \w word character: [0-9A-Za-z_]
+|/\W| \W \W non-word character: [^0-9A-Za-z_]
+|/\h| \h \h head of word character: [A-Za-z_]
+|/\H| \H \H non-head of word character: [^A-Za-z_]
+|/\a| \a \a alphabetic character: [A-Za-z]
+|/\A| \A \A non-alphabetic character: [^A-Za-z]
+|/\l| \l \l lowercase character: [a-z]
+|/\L| \L \L non-lowercase character: [^a-z]
+|/\u| \u \u uppercase character: [A-Z]
+|/\U| \U \U non-uppercase character [^A-Z]
+|/\_| \_x \_x where x is any of the characters above: character
+ class with end-of-line included
+(end of character classes)
+
+ magic nomagic matches ~
+|/\e| \e \e <Esc>
+|/\t| \t \t <Tab>
+|/\r| \r \r <CR>
+|/\b| \b \b <BS>
+|/\n| \n \n end-of-line
+|/~| ~ \~ last given substitute string
+|/\1| \1 \1 same string as matched by first \(\)
+|/\2| \2 \2 Like "\1", but uses second \(\)
+ ...
+|/\9| \9 \9 Like "\1", but uses ninth \(\)
+ *E68*
+|/\z1| \z1 \z1 only for syntax highlighting, see |:syn-ext-match|
+ ...
+|/\z1| \z9 \z9 only for syntax highlighting, see |:syn-ext-match|
+
+ x x a character with no special meaning matches itself
+
+|/[]| [] \[] any character specified inside the []
+|/\%[]| \%[] \%[] a sequence of optionally matched atoms
+
+|/\c| \c \c ignore case, do not use the 'ignorecase' option
+|/\C| \C \C match case, do not use the 'ignorecase' option
+|/\Z| \Z \Z ignore differences in Unicode "combining characters".
+ Useful when searching voweled Hebrew or Arabic text.
+
+ magic nomagic matches ~
+|/\m| \m \m 'magic' on for the following chars in the pattern
+|/\M| \M \M 'magic' off for the following chars in the pattern
+|/\v| \v \v the following chars in the pattern are "very magic"
+|/\V| \V \V the following chars in the pattern are "very nomagic"
+|/\%#=| \%#=1 \%#=1 select regexp engine |/zero-width|
+
+|/\%d| \%d \%d match specified decimal character (eg \%d123)
+|/\%x| \%x \%x match specified hex character (eg \%x2a)
+|/\%o| \%o \%o match specified octal character (eg \%o040)
+|/\%u| \%u \%u match specified multibyte character (eg \%u20ac)
+|/\%U| \%U \%U match specified large multibyte character (eg
+ \%U12345678)
+|/\%C| \%C \%C match any composing characters
+
+Example matches ~
+\<\I\i* or
+\<\h\w*
+\<[a-zA-Z_][a-zA-Z0-9_]*
+ An identifier (e.g., in a C program).
+
+\(\.$\|\. \) A period followed by <EOL> or a space.
+
+[.!?][])"']*\($\|[ ]\) A search pattern that finds the end of a sentence,
+ with almost the same definition as the ")" command.
+
+cat\Z Both "cat" and "càt" ("a" followed by 0x0300)
+ Does not match "càt" (character 0x00e0), even
+ though it may look the same.
+
+
+==============================================================================
+5. Multi items *pattern-multi-items*
+
+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*
+* (use \* when 'magic' is not set)
+ Matches 0 or more of the preceding atom, as many as possible.
+ Example 'nomagic' matches ~
+ a* a\* "", "a", "aa", "aaa", etc.
+ .* \.\* anything, also an empty string, no end-of-line
+ \_.* \_.\* everything up to the end of the buffer
+ \_.*END \_.\*END everything up to and including the last "END"
+ in the buffer
+
+ Exception: When "*" is used at the start of the pattern or just after
+ "^" it matches the star character.
+
+ Be aware that repeating "\_." can match a lot of text and take a long
+ time. For example, "\_.*END" matches all text from the current
+ position to the last occurrence of "END" in the file. Since the "*"
+ will match as many as possible, this first skips over all lines until
+ the end of the file and then tries matching "END", backing up one
+ character at a time.
+
+ */\+*
+\+ Matches 1 or more of the preceding atom, as many as possible.
+ Example matches ~
+ ^.\+$ any non-empty line
+ \s\+ white space of at least one character
+
+ */\=*
+\= Matches 0 or 1 of the preceding atom, as many as possible.
+ Example matches ~
+ foo\= "fo" and "foo"
+
+ */\?*
+\? Just like \=. Cannot be used when searching backwards with the "?"
+ command.
+
+ */\{* *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
+\{,m} Matches 0 to m of the preceding atom, as many as possible
+\{} Matches 0 or more of the preceding atom, as many as possible (like *)
+ */\{-*
+\{-n,m} matches n to m of the preceding atom, as few as possible
+\{-n} matches n of the preceding atom
+\{-n,} matches at least n of the preceding atom, as few as possible
+\{-,m} matches 0 to m of the preceding atom, as few as possible
+\{-} matches 0 or more of the preceding atom, as few as possible
+
+ n and m are positive decimal numbers or zero
+ *non-greedy*
+ If a "-" appears immediately after the "{", then a shortest match
+ first algorithm is used (see example below). In particular, "\{-}" is
+ the same as "*" but uses the shortest match first algorithm. BUT: A
+ match that starts earlier is preferred over a shorter match: "a\{-}b"
+ matches "aaab" in "xaaab".
+
+ Example matches ~
+ ab\{2,3}c "abbc" or "abbbc"
+ a\{5} "aaaaa"
+ ab\{2,}c "abbc", "abbbc", "abbbbc", etc.
+ ab\{,3}c "ac", "abc", "abbc" or "abbbc"
+ a[bc]\{3}d "abbbd", "abbcd", "acbcd", "acccd", etc.
+ a\(bc\)\{1,2}d "abcd" or "abcbcd"
+ a[bc]\{-}[cd] "abc" in "abcd"
+ a[bc]*[cd] "abcd" in "abcd"
+
+ The } may optionally be preceded with a backslash: \{n,m\}.
+
+ */\@=*
+\@= Matches the preceding atom with zero width.
+ Like "(?=pattern)" in Perl.
+ Example matches ~
+ foo\(bar\)\@= "foo" in "foobar"
+ foo\(bar\)\@=foo nothing
+ */zero-width*
+ When using "\@=" (or "^", "$", "\<", "\>") no characters are included
+ in the match. These items are only used to check if a match can be
+ made. This can be tricky, because a match with following items will
+ be done in the same position. The last example above will not match
+ "foobarfoo", because it tries match "foo" in the same position where
+ "bar" matched.
+
+ Note that using "\&" works the same as using "\@=": "foo\&.." is the
+ same as "\(foo\)\@=..". But using "\&" is easier, you don't need the
+ parentheses.
+
+
+ */\@!*
+\@! Matches with zero width if the preceding atom does NOT match at the
+ current position. |/zero-width|
+ Like "(?!pattern)" in Perl.
+ Example matches ~
+ foo\(bar\)\@! any "foo" not followed by "bar"
+ a.\{-}p\@! "a", "ap", "app", "appp", etc. not immediately
+ followed by a "p"
+ if \(\(then\)\@!.\)*$ "if " not followed by "then"
+
+ Using "\@!" is tricky, because there are many places where a pattern
+ does not match. "a.*p\@!" will match from an "a" to the end of the
+ line, because ".*" can match all characters in the line and the "p"
+ doesn't match at the end of the line. "a.\{-}p\@!" will match any
+ "a", "ap", "app", etc. that isn't followed by a "p", because the "."
+ can match a "p" and "p\@!" doesn't match after that.
+
+ You can't use "\@!" to look for a non-match before the matching
+ position: "\(foo\)\@!bar" will match "bar" in "foobar", because at the
+ position where "bar" matches, "foo" does not match. To avoid matching
+ "foobar" you could use "\(foo\)\@!...bar", but that doesn't match a
+ bar at the start of a line. Use "\(foo\)\@<!bar".
+
+ Useful example: to find "foo" in a line that does not contain "bar": >
+ /^\%(.*bar\)\@!.*\zsfoo
+< This pattern first checks that there is not a single position in the
+ line where "bar" matches. If ".*bar" matches somewhere the \@! will
+ reject the pattern. When there is no match any "foo" will be found.
+ The "\zs" is to have the match start just before "foo".
+
+ */\@<=*
+\@<= Matches with zero width if the preceding atom matches just before what
+ follows. |/zero-width|
+ Like "(?<=pattern)" in Perl, but Vim allows non-fixed-width patterns.
+ Example matches ~
+ \(an\_s\+\)\@<=file "file" after "an" and white space or an
+ end-of-line
+ For speed it's often much better to avoid this multi. Try using "\zs"
+ instead |/\zs|. To match the same as the above example:
+ an\_s\+\zsfile
+ At least set a limit for the look-behind, see below.
+
+ "\@<=" and "\@<!" check for matches just before what follows.
+ Theoretically these matches could start anywhere before this position.
+ But to limit the time needed, only the line where what follows matches
+ is searched, and one line before that (if there is one). This should
+ be sufficient to match most things and not be too slow.
+
+ In the old regexp engine the part of the pattern after "\@<=" and
+ "\@<!" are checked for a match first, thus things like "\1" don't work
+ to reference \(\) inside the preceding atom. It does work the other
+ way around:
+ Bad example matches ~
+ \%#=1\1\@<=,\([a-z]\+\) ",abc" in "abc,abc"
+
+ However, the new regexp engine works differently, it is better to not
+ rely on this behavior, do not use \@<= if it can be avoided:
+ Example matches ~
+ \([a-z]\+\)\zs,\1 ",abc" in "abc,abc"
+
+\@123<=
+ Like "\@<=" but only look back 123 bytes. This avoids trying lots
+ of matches that are known to fail and make executing the pattern very
+ slow. Example, check if there is a "<" just before "span":
+ /<\@1<=span
+ This will try matching "<" only one byte before "span", which is the
+ only place that works anyway.
+ After crossing a line boundary, the limit is relative to the end of
+ the line. Thus the characters at the start of the line with the match
+ are not counted (this is just to keep it simple).
+ The number zero is the same as no limit.
+
+ */\@<!*
+\@<! Matches with zero width if the preceding atom does NOT match just
+ before what follows. Thus this matches if there is no position in the
+ current or previous line where the atom matches such that it ends just
+ before what follows. |/zero-width|
+ Like "(?<!pattern)" in Perl, but Vim allows non-fixed-width patterns.
+ The match with the preceding atom is made to end just before the match
+ with what follows, thus an atom that ends in ".*" will work.
+ Warning: This can be slow (because many positions need to be checked
+ for a match). Use a limit if you can, see below.
+ Example matches ~
+ \(foo\)\@<!bar any "bar" that's not in "foobar"
+ \(\/\/.*\)\@<!in "in" which is not after "//"
+
+\@123<!
+ Like "\@<!" but only look back 123 bytes. This avoids trying lots of
+ matches that are known to fail and make executing the pattern very
+ slow.
+
+ */\@>*
+\@> Matches the preceding atom like matching a whole pattern.
+ Like "(?>pattern)" in Perl.
+ Example matches ~
+ \(a*\)\@>a nothing (the "a*" takes all the "a"'s, there can't be
+ another one following)
+
+ This matches the preceding atom as if it was a pattern by itself. If
+ it doesn't match, there is no retry with shorter sub-matches or
+ anything. Observe this difference: "a*b" and "a*ab" both match
+ "aaab", but in the second case the "a*" matches only the first two
+ "a"s. "\(a*\)\@>ab" will not match "aaab", because the "a*" matches
+ the "aaa" (as many "a"s as possible), thus the "ab" can't match.
+
+
+==============================================================================
+6. Ordinary atoms *pattern-atoms*
+
+An ordinary atom can be:
+
+ */^*
+^ At beginning of pattern or after "\|", "\(", "\%(" or "\n": matches
+ start-of-line; at other positions, matches literal '^'. |/zero-width|
+ Example matches ~
+ ^beep( the start of the C function "beep" (probably).
+
+ */\^*
+\^ Matches literal '^'. Can be used at any position in the pattern, but
+ not inside [].
+
+ */\_^*
+\_^ Matches start-of-line. |/zero-width| Can be used at any position in
+ the pattern, but not inside [].
+ Example matches ~
+ \_s*\_^foo white space and blank lines and then "foo" at
+ start-of-line
+
+ */$*
+$ At end of pattern or in front of "\|", "\)" or "\n" ('magic' on):
+ matches end-of-line <EOL>; at other positions, matches literal '$'.
+ |/zero-width|
+
+ */\$*
+\$ Matches literal '$'. Can be used at any position in the pattern, but
+ not inside [].
+
+ */\_$*
+\_$ Matches end-of-line. |/zero-width| Can be used at any position in the
+ pattern, but not inside []. Note that "a\_$b" never matches, since
+ "b" cannot match an end-of-line. Use "a\nb" instead |/\n|.
+ Example matches ~
+ foo\_$\_s* "foo" at end-of-line and following white space and
+ blank lines
+
+. (with 'nomagic': \.) */.* */\.*
+ Matches any single character, but not an end-of-line.
+
+ */\_.*
+\_. Matches any single character or end-of-line.
+ Careful: "\_.*" matches all text to the end of the buffer!
+
+ */\<*
+\< Matches the beginning of a word: The next char is the first char of a
+ word. The 'iskeyword' option specifies what is a word character.
+ |/zero-width|
+
+ */\>*
+\> Matches the end of a word: The previous char is the last char of a
+ word. The 'iskeyword' option specifies what is a word character.
+ |/zero-width|
+
+ */\zs*
+\zs Matches at any position, but not inside [], and sets the start of the
+ match there: The next char is the first char of the whole match.
+ |/zero-width|
+ Example: >
+ /^\s*\zsif
+< matches an "if" at the start of a line, ignoring white space.
+ Can be used multiple times, the last one encountered in a matching
+ branch is used. Example: >
+ /\(.\{-}\zsFab\)\{3}
+< Finds the third occurrence of "Fab".
+ This cannot be followed by a multi. *E888*
+ {not available when compiled without the |+syntax| feature}
+ */\ze*
+\ze Matches at any position, but not inside [], and sets the end of the
+ match there: The previous char is the last char of the whole match.
+ |/zero-width|
+ Can be used multiple times, the last one encountered in a matching
+ branch is used.
+ Example: "end\ze\(if\|for\)" matches the "end" in "endif" and
+ "endfor".
+ This cannot be followed by a multi. |E888|
+ {not available when compiled without the |+syntax| feature}
+
+ */\%^* *start-of-file*
+\%^ Matches start of the file. When matching with a string, matches the
+ start of the string.
+ For example, to find the first "VIM" in a file: >
+ /\%^\_.\{-}\zsVIM
+<
+ */\%$* *end-of-file*
+\%$ Matches end of the file. When matching with a string, matches the
+ end of the string.
+ Note that this does NOT find the last "VIM" in a file: >
+ /VIM\_.\{-}\%$
+< It will find the next VIM, because the part after it will always
+ match. This one will find the last "VIM" in the file: >
+ /VIM\ze\(\(VIM\)\@!\_.\)*\%$
+< This uses |/\@!| to ascertain that "VIM" does NOT match in any
+ position after the first "VIM".
+ Searching from the end of the file backwards is easier!
+
+ */\%V*
+\%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 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
+< 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
+ buffer displayed in a window.
+ WARNING: When the cursor is moved after the pattern was used, the
+ result becomes invalid. Vim doesn't automatically update the matches.
+ This is especially relevant for syntax highlighting and 'hlsearch'.
+ In other words: When the cursor moves the display isn't updated for
+ this change. An update is done for lines which are changed (the whole
+ line is updated) or when using the |CTRL-L| command (the whole screen
+ is updated). Example, to highlight the word under the cursor: >
+ /\k*\%#\k*
+< When 'hlsearch' is set and you move the cursor around and make changes
+ this will clearly show when the match is updated or not.
+
+ */\%'m* */\%<'m* */\%>'m*
+\%'m Matches with the position of mark m.
+\%<'m Matches before the position of mark m.
+\%>'m Matches after the position of mark m.
+ Example, to highlight the text from mark 's to 'e: >
+ /.\%>'s.*\%<'e..
+< Note that two dots are required to include mark 'e in the match. That
+ is because "\%<'e" matches at the character before the 'e mark, and
+ since it's a |/zero-width| match it doesn't include that character.
+ WARNING: When the mark is moved after the pattern was used, the result
+ becomes invalid. Vim doesn't automatically update the matches.
+ Similar to moving the cursor for "\%#" |/\%#|.
+
+ */\%l* */\%>l* */\%<l* *E951* *E1204* *E1273*
+\%23l Matches in a specific line.
+\%<23l Matches above a specific line (lower line number).
+\%>23l Matches below a specific line (higher line number).
+\%.l Matches at the cursor line.
+\%<.l Matches above the cursor line.
+\%>.l Matches below the cursor line.
+ These six can be used to match specific lines in a buffer. The "23"
+ can be any line number. The first line is 1.
+ WARNING: When inserting or deleting lines Vim does not automatically
+ update the matches. This means Syntax highlighting quickly becomes
+ wrong. Also when referring to the cursor position (".") and
+ the cursor moves the display isn't updated for this change. An update
+ is done when using the |CTRL-L| command (the whole screen is updated).
+ Example, to highlight the line where the cursor currently is: >
+ :exe '/\%' . line(".") . 'l'
+< Alternatively use: >
+ /\%.l
+< When 'hlsearch' is set and you move the cursor around and make changes
+ this will clearly show when the match is updated or not.
+
+ */\%c* */\%>c* */\%<c*
+\%23c Matches in a specific column.
+\%<23c Matches before a specific column.
+\%>23c Matches after a specific column.
+\%.c Matches at the cursor column.
+\%<.c Matches before the cursor column.
+\%>.c Matches after the cursor column.
+ These six can be used to match specific columns in a buffer or string.
+ The "23" can be any column number. The first column is 1. Actually,
+ the column is the byte number (thus it's not exactly right for
+ multibyte characters).
+ WARNING: When inserting or deleting text Vim does not automatically
+ update the matches. This means Syntax highlighting quickly becomes
+ wrong. Also when referring to the cursor position (".") and
+ the cursor moves the display isn't updated for this change. An update
+ is done when using the |CTRL-L| command (the whole screen is updated).
+ Example, to highlight the column where the cursor currently is: >
+ :exe '/\%' .. col(".") .. 'c'
+< Alternatively use: >
+ /\%.c
+< When 'hlsearch' is set and you move the cursor around and make changes
+ this will clearly show when the match is updated or not.
+ Example for matching a single byte in column 44: >
+ /\%>43c.\%<46c
+< Note that "\%<46c" matches in column 45 when the "." matches a byte in
+ column 44.
+ */\%v* */\%>v* */\%<v*
+\%23v Matches in a specific virtual column.
+\%<23v Matches before a specific virtual column.
+\%>23v Matches after a specific virtual column.
+\%.v Matches at the current virtual column.
+\%<.v Matches before the current virtual column.
+\%>.v Matches after the current virtual column.
+ These six can be used to match specific virtual columns in a buffer or
+ string. When not matching with a buffer in a window, the option
+ values of the current window are used (e.g., 'tabstop').
+ The "23" can be any column number. The first column is 1.
+ Note that some virtual column positions will never match, because they
+ are halfway through a tab or other character that occupies more than
+ one screen character.
+ WARNING: When inserting or deleting text Vim does not automatically
+ update highlighted matches. This means Syntax highlighting quickly
+ becomes wrong. Also when referring to the cursor position (".") and
+ the cursor moves the display isn't updated for this change. An update
+ is done when using the |CTRL-L| command (the whole screen is updated).
+ Example, to highlight all the characters after virtual column 72: >
+ /\%>72v.*
+< 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
+< To match all characters after the current virtual column (where the
+ cursor is): >
+ /\%>.v.*
+< 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.
+< 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:
+\i identifier character (see 'isident' option) */\i*
+\I like "\i", but excluding digits */\I*
+\k keyword character (see 'iskeyword' option) */\k*
+\K like "\k", but excluding digits */\K*
+\f file name character (see 'isfname' option) */\f*
+\F like "\f", but excluding digits */\F*
+\p printable character (see 'isprint' option) */\p*
+\P like "\p", but excluding digits */\P*
+
+NOTE: the above also work for multibyte characters. The ones below only
+match ASCII characters, as indicated by the range.
+
+ *whitespace* *white-space*
+\s whitespace character: <Space> and <Tab> */\s*
+\S non-whitespace character; opposite of \s */\S*
+\d digit: [0-9] */\d*
+\D non-digit: [^0-9] */\D*
+\x hex digit: [0-9A-Fa-f] */\x*
+\X non-hex digit: [^0-9A-Fa-f] */\X*
+\o octal digit: [0-7] */\o*
+\O non-octal digit: [^0-7] */\O*
+\w word character: [0-9A-Za-z_] */\w*
+\W non-word character: [^0-9A-Za-z_] */\W*
+\h head of word character: [A-Za-z_] */\h*
+\H non-head of word character: [^A-Za-z_] */\H*
+\a alphabetic character: [A-Za-z] */\a*
+\A non-alphabetic character: [^A-Za-z] */\A*
+\l lowercase character: [a-z] */\l*
+\L non-lowercase character: [^a-z] */\L*
+\u uppercase character: [A-Z] */\u*
+\U non-uppercase character: [^A-Z] */\U*
+
+ NOTE: Using the atom is faster than the [] form.
+
+ NOTE: 'ignorecase', "\c" and "\C" are not used by character classes.
+
+ */\_* *E63* */\_i* */\_I* */\_k* */\_K* */\_f* */\_F*
+ */\_p* */\_P* */\_s* */\_S* */\_d* */\_D* */\_x* */\_X*
+ */\_o* */\_O* */\_w* */\_W* */\_h* */\_H* */\_a* */\_A*
+ */\_l* */\_L* */\_u* */\_U*
+\_x Where "x" is any of the characters above: The character class with
+ end-of-line added
+(end of character classes)
+
+\e matches <Esc> */\e*
+\t matches <Tab> */\t*
+\r matches <CR> */\r*
+\b matches <BS> */\b*
+\n matches an end-of-line */\n*
+ When matching in a string instead of buffer text a literal newline
+ character is matched.
+
+~ matches the last given substitute string */~* */\~*
+
+\(\) A pattern enclosed by escaped parentheses. */\(* */\(\)* */\)*
+ E.g., "\(^a\)" matches 'a' at the start of a line.
+ There can only be ten of these. You can use "\%(" to add more, but
+ not counting it as a sub-expression.
+ *E51* *E54* *E55* *E872* *E873*
+
+\1 Matches the same string that was matched by */\1* *E65*
+ the first sub-expression in \( and \).
+ Example: "\([a-z]\).\1" matches "ata", "ehe", "tot", etc.
+\2 Like "\1", but uses second sub-expression, */\2*
+ ... */\3*
+\9 Like "\1", but uses ninth sub-expression. */\9*
+ Note: The numbering of groups is done based on which "\(" comes first
+ in the pattern (going left to right), NOT based on what is matched
+ first.
+
+\%(\) A pattern enclosed by escaped parentheses. */\%(\)* */\%(* *E53*
+ Just like \(\), but without counting it as a sub-expression. This
+ allows using more groups and it's a little bit faster.
+
+x A single character, with no special meaning, matches itself
+
+ */\* */\\*
+\x A backslash followed by a single character, with no special meaning,
+ is reserved for future expansions
+
+[] (with 'nomagic': \[]) */[]* */\[]* */\_[]* */collection* *E76*
+\_[]
+ A collection. This is a sequence of characters enclosed in square
+ brackets. It matches any single character in the collection.
+ Example matches ~
+ [xyz] any 'x', 'y' or 'z'
+ [a-zA-Z]$ any alphabetic character at the end of a line
+ \c[a-z]$ same
+ [А-яЁё] Russian alphabet (with utf-8 and cp1251)
+
+ */[\n]*
+ With "\_" prepended the collection also includes the end-of-line.
+ The same can be done by including "\n" in the collection. The
+ end-of-line is also matched when the collection starts with "^"! Thus
+ "\_[^ab]" matches the end-of-line and any character but "a" and "b".
+ This makes it Vi compatible: Without the "\_" or "\n" the collection
+ does not match an end-of-line.
+ *E769*
+ When the ']' is not there Vim will not give an error message but
+ assume no collection is used. Useful to search for '['. However, you
+ do get E769 for internal searching. And be aware that in a
+ `:substitute` command the whole command becomes the pattern. E.g.
+ ":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. 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 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:] (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: 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
+*[:ident:]* [:ident:] identifier character (same as "\i")
+*[:keyword:]* [:keyword:] keyword character (same as "\k")
+*[:fname:]* [:fname:] file name character (same as "\f")
+ The square brackets in character class expressions are additional to
+ the square brackets delimiting a collection. For example, the
+ following is a plausible pattern for a UNIX filename:
+ "[-./[:alnum:]_~]\+". That is, a list of at least one character,
+ each of which is either '-', '.', '/', alphabetic, numeric, '_' or
+ '~'.
+ These items only work for 8-bit characters, except [:lower:] and
+ [:upper:] also work for multibyte characters when using the new
+ regexp engine. See |two-engines|. In the future these items may
+ work for multibyte 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.
+ (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
+ only works for Unicode, latin1 and latin9. The form is:
+ [=a=]
+ */[[.* *[..]*
+ - A collation element. This currently simply accepts a single
+ character in the form:
+ [.a.]
+ */\]*
+ - To include a literal ']', '^', '-' or '\' in the collection, put a
+ backslash before it: "[xyz\]]", "[\^xyz]", "[xy\-z]" and "[xyz\\]".
+ (Note: POSIX does not support the use of a backslash this way). For
+ ']' you can also make it the first character (following a possible
+ "^"): "[]xyz]" or "[^]xyz]".
+ For '-' you can also make it the first or last character: "[-xyz]",
+ "[^-xyz]" or "[xyz-]". For '\' you can also let it be followed by
+ any character that's not in "^]-\bdertnoUux". "[\xyz]" matches '\',
+ 'x', 'y' and 'z'. It's better to use "\\" though, future expansions
+ may use other characters after '\'.
+ - Omitting the trailing ] is not considered an error. "[]" works like
+ "[]]", it matches the ']' character.
+ - The following translations are accepted when the 'l' flag is not
+ included in 'cpoptions':
+ \e <Esc>
+ \t <Tab>
+ \r <CR> (NOT end-of-line!)
+ \b <BS>
+ \n line break, see above |/[\n]|
+ \d123 decimal number of character
+ \o40 octal number of character up to 0o377
+ \x20 hexadecimal number of character up to 0xff
+ \u20AC hex. number of multibyte character up to 0xffff
+ \U1234 hex. number of multibyte character up to 0xffffffff
+ NOTE: The other backslash codes mentioned above do not work inside
+ []!
+ - 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. 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.
+ It matches as much of the list of atoms it contains as possible. Thus
+ it stops at the first atom that doesn't match. For example: >
+ /r\%[ead]
+< matches "r", "re", "rea" or "read". The longest that matches is used.
+ To match the Ex command "function", where "fu" is required and
+ "nction" is optional, this would work: >
+ /\<fu\%[nction]\>
+< The end-of-word atom "\>" is used to avoid matching "fu" in "full".
+ It gets more complicated when the atoms are not ordinary characters.
+ You don't often have to use it, but it is possible. Example: >
+ /\<r\%[[eo]ad]\>
+< Matches the words "r", "re", "ro", "rea", "roa", "read" and "road".
+ There can be no \(\), \%(\) or \z(\) items inside the [] and \%[] does
+ not nest.
+ To include a "[" use "[[]" and for "]" use []]", e.g.,: >
+ /index\%[[[]0[]]]
+< matches "index" "index[", "index[0" and "index[0]".
+ {not available when compiled without the |+syntax| feature}
+
+ */\%d* */\%x* */\%o* */\%u* */\%U* *E678*
+
+\%d123 Matches the character specified with a decimal number. Must be
+ followed by a non-digit.
+\%o40 Matches the character specified with an octal number up to 0o377.
+ Numbers below 0o40 must be followed by a non-octal digit or a
+ non-digit.
+\%x2a Matches the character specified with up to two hexadecimal characters.
+\%u20AC Matches the character specified with up to four hexadecimal
+ characters.
+\%U1234abcd Matches the character specified with up to eight hexadecimal
+ characters, up to 0x7fffffff
+
+==============================================================================
+7. Ignoring case in a pattern */ignorecase*
+
+If the 'ignorecase' option is on, the case of normal letters is ignored.
+'smartcase' can be set to ignore case when the pattern contains lowercase
+letters only.
+ */\c* */\C*
+When "\c" appears anywhere in the pattern, the whole pattern is handled like
+'ignorecase' is on. The actual value of 'ignorecase' and 'smartcase' is
+ignored. "\C" does the opposite: Force matching case for the whole pattern.
+{only Vim supports \c and \C}
+Note that 'ignorecase', "\c" and "\C" are not used for the character classes.
+
+Examples:
+ pattern 'ignorecase' 'smartcase' matches ~
+ foo off - foo
+ foo on - foo Foo FOO
+ Foo on off foo Foo FOO
+ Foo on on Foo
+ \cfoo - - foo Foo FOO
+ foo\C - - foo
+
+Technical detail: *NL-used-for-Nul*
+<Nul> characters in the file are stored as <NL> in memory. In the display
+they are shown as "^@". The translation is done when reading and writing
+files. To match a <Nul> with a search pattern you can just enter CTRL-@ or
+"CTRL-V 000". This is probably just what you expect. Internally the
+character is replaced with a <NL> in the search pattern. What is unusual is
+that typing CTRL-V CTRL-J also inserts a <NL>, thus also searches for a <Nul>
+in the file.
+
+ *CR-used-for-NL*
+When 'fileformat' is "mac", <NL> characters in the file are stored as <CR>
+characters internally. In the text they are shown as "^J". Otherwise this
+works similar to the usage of <NL> for a <Nul>.
+
+When working with expression evaluation, a <NL> character in the pattern
+matches a <NL> in the string. The use of "\n" (backslash n) to match a <NL>
+doesn't work there, it only works to match text in the buffer.
+
+ *pattern-multi-byte* *pattern-multibyte*
+Patterns will also work with multibyte characters, mostly as you would
+expect. But invalid bytes may cause trouble, a pattern with an invalid byte
+will probably never match.
+
+==============================================================================
+8. Composing characters *patterns-composing*
+
+ */\Z*
+When "\Z" appears anywhere in the pattern, all composing characters are
+ignored. Thus only the base characters need to match, the composing
+characters may be different and the number of composing characters may differ.
+Only relevant when 'encoding' is "utf-8".
+Exception: If the pattern starts with one or more composing characters, these
+must match.
+ */\%C*
+Use "\%C" to skip any composing characters. For example, the pattern "a" does
+not match in "càt" (where the a has the composing character 0x0300), but
+"a\%C" does. Note that this does not match "cát" (where the á is character
+0xe1, it does not have a compositing character). It does match "cat" (where
+the a is just an a).
+
+When a composing character appears at the start of the pattern or after an
+item that doesn't include the composing character, a match is found at any
+character that includes this composing character.
+
+When using a dot and a composing character, this works the same as the
+composing character by itself, except that it doesn't matter what comes before
+this.
+
+The order of composing characters does not matter. Also, the text may have
+more composing characters than the pattern, it still matches. But all
+composing characters in the pattern must be found in the text.
+
+Suppose B is a base character and x and y are composing characters:
+ pattern text match ~
+ Bxy Bxy yes (perfect match)
+ Bxy Byx yes (order ignored)
+ Bxy By no (x missing)
+ Bxy Bx no (y missing)
+ Bx Bx yes (perfect match)
+ Bx By no (x missing)
+ Bx Bxy yes (extra y ignored)
+ Bx Byx yes (extra y ignored)
+
+==============================================================================
+9. Compare with Perl patterns *perl-patterns*
+
+Vim's regexes are most similar to Perl's, in terms of what you can do. The
+difference between them is mostly just notation; here's a summary of where
+they differ:
+
+Capability in Vimspeak in Perlspeak ~
+----------------------------------------------------------------
+force case insensitivity \c (?i)
+force case sensitivity \C (?-i)
+backref-less grouping \%(atom\) (?:atom)
+conservative quantifiers \{-n,m} *?, +?, ??, {}?
+0-width match atom\@= (?=atom)
+0-width non-match atom\@! (?!atom)
+0-width preceding match atom\@<= (?<=atom)
+0-width preceding non-match atom\@<! (?<!atom)
+match without retry atom\@> (?>atom)
+
+Vim and Perl handle newline characters inside a string a bit differently:
+
+In Perl, ^ and $ only match at the very beginning and end of the text,
+by default, but you can set the 'm' flag, which lets them match at
+embedded newlines as well. You can also set the 's' flag, which causes
+a . to match newlines as well. (Both these flags can be changed inside
+a pattern using the same syntax used for the i flag above, BTW.)
+
+On the other hand, Vim's ^ and $ always match at embedded newlines, and
+you get two separate atoms, \%^ and \%$, which only match at the very
+start and end of the text, respectively. Vim solves the second problem
+by giving you the \_ "modifier": put it in front of a . or a character
+class, and they will match newlines as well.
+
+Finally, these constructs are unique to Perl:
+- execution of arbitrary code in the regex: (?{perl code})
+- conditional expressions: (?(condition)true-expr|false-expr)
+
+...and these are unique to Vim:
+- changing the magic-ness of a pattern: \v \V \m \M
+ (very useful for avoiding backslashitis)
+- sequence of optionally matching atoms: \%[atoms]
+- \& (which is to \| what "and" is to "or"; it forces several branches
+ to match at one spot)
+- matching lines/columns by number: \%5l \%5c \%5v
+- setting the start and end of the match: \zs \ze
+
+==============================================================================
+10. Highlighting matches *match-highlight*
+
+ *:mat* *:match*
+:mat[ch] {group} /{pattern}/
+ Define a pattern to highlight in the current window. It will
+ be highlighted with {group}. Example: >
+ :highlight MyGroup ctermbg=green guibg=green
+ :match MyGroup /TODO/
+< Instead of // any character can be used to mark the start and
+ end of the {pattern}. Watch out for using special characters,
+ such as '"' and '|'.
+
+ {group} must exist at the moment this command is executed.
+
+ The {group} highlighting still applies when a character is
+ to be highlighted for 'hlsearch', as the highlighting for
+ matches is given higher priority than that of 'hlsearch'.
+ Syntax highlighting (see 'syntax') is also overruled by
+ matches.
+
+ Note that highlighting the last used search pattern with
+ 'hlsearch' is used in all windows, while the pattern defined
+ with ":match" only exists in the current window. It is kept
+ when switching to another buffer.
+
+ 'ignorecase' does not apply, use |/\c| in the pattern to
+ ignore case. Otherwise case is not ignored.
+
+ 'redrawtime' defines the maximum time searched for pattern
+ matches.
+
+ When matching end-of-line and Vim redraws only part of the
+ display you may get unexpected results. That is because Vim
+ looks for a match in the line where redrawing starts.
+
+ Also see |matcharg()| and |getmatches()|. The former returns
+ the highlight group and pattern of a previous |:match|
+ command. The latter returns a list with highlight groups and
+ patterns defined by both |matchadd()| and |:match|.
+
+ Highlighting matches using |:match| are limited to three
+ matches (aside from |:match|, |:2match| and |:3match| are
+ available). |matchadd()| does not have this limitation and in
+ addition makes it possible to prioritize matches.
+
+ Another example, which highlights all characters in virtual
+ column 72 and more: >
+ :highlight rightMargin term=bold ctermfg=blue guifg=blue
+ :match rightMargin /.\%>72v/
+< To highlight all character that are in virtual column 7: >
+ :highlight col8 ctermbg=grey guibg=grey
+ :match col8 /\%<8v.\%>7v/
+< Note the use of two items to also match a character that
+ occupies more than one virtual column, such as a TAB.
+
+:mat[ch]
+:mat[ch] none
+ Clear a previously defined match pattern.
+
+
+:2mat[ch] {group} /{pattern}/ *:2match*
+:2mat[ch]
+:2mat[ch] none
+:3mat[ch] {group} /{pattern}/ *:3match*
+:3mat[ch]
+:3mat[ch] none
+ Just like |:match| above, but set a separate match. Thus
+ there can be three matches active at the same time. The match
+ with the lowest number has priority if several match at the
+ same position.
+ The ":3match" command is used by the |matchparen| plugin. You
+ are suggested to use ":match" for manual matching and
+ ":2match" for another plugin.
+
+==============================================================================
+11. Fuzzy matching *fuzzy-matching*
+
+Fuzzy matching refers to matching strings using a non-exact search string.
+Fuzzy matching will match a string, if all the characters in the search string
+are present anywhere in the string in the same order. Case is ignored. In a
+matched string, other characters can be present between two consecutive
+characters in the search string. If the search string has multiple words, then
+each word is matched separately. So the words in the search string can be
+present in any order in a string.
+
+Fuzzy matching assigns a score for each matched string based on the following
+criteria:
+ - The number of sequentially matching characters.
+ - The number of characters (distance) between two consecutive matching
+ characters.
+ - Matches at the beginning of a word
+ - Matches at a camel case character (e.g. Case in CamelCase)
+ - Matches after a path separator or a hyphen.
+ - The number of unmatched characters in a string.
+The matching string with the highest score is returned first.
+
+For example, when you search for the "get pat" string using fuzzy matching, it
+will match the strings "GetPattern", "PatternGet", "getPattern", "patGetter",
+"getSomePattern", "MatchpatternGet" etc.
+
+The functions |matchfuzzy()| and |matchfuzzypos()| can be used to fuzzy search
+a string in a List of strings. The matchfuzzy() function returns a List of
+matching strings. The matchfuzzypos() functions returns the List of matches,
+the matching positions and the fuzzy match scores.
+
+The "f" flag of `:vimgrep` enables fuzzy matching.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/pi_getscript.txt b/runtime/doc/pi_getscript.txt
new file mode 100644
index 0000000..7780588
--- /dev/null
+++ b/runtime/doc/pi_getscript.txt
@@ -0,0 +1,482 @@
+*pi_getscript.txt* For Vim version 9.0. Last change: 2017 Aug 01
+>
+ GETSCRIPT REFERENCE MANUAL by Charles E. Campbell
+<
+Author: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+ (remove NOSPAM from the email address)
+ *GetLatestVimScripts-copyright*
+Copyright: (c) 2004-2012 by Charles E. Campbell *glvs-copyright*
+ The VIM LICENSE (see |copyright|) applies to the files in this
+ package, including getscriptPlugin.vim, getscript.vim,
+ GetLatestVimScripts.dist, and pi_getscript.txt, except use "getscript"
+ instead of "Vim". Like anything else that's free, getscript and its
+ associated files are provided *as is* and comes with no warranty of
+ any kind, either expressed or implied. No guarantees of
+ merchantability. No guarantees of suitability for any purpose. 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. Use at your own risk!
+
+Getscript is a plugin that simplifies retrieval of the latest versions of the
+scripts that you yourself use! Typing |:GLVS| will invoke getscript; it will
+then use the <GetLatestVimScripts.dat> (see |GetLatestVimScripts_dat|) file to
+get the latest versions of scripts listed therein from http://vim.sf.net/.
+
+==============================================================================
+1. Contents *glvs-contents* *glvs* *getscript*
+ *GetLatestVimScripts*
+
+ 1. Contents........................................: |glvs-contents|
+ 2. GetLatestVimScripts -- Getting Started..........: |glvs-install|
+ 3. GetLatestVimScripts Usage.......................: |glvs-usage|
+ 4. GetLatestVimScripts Data File...................: |glvs-data|
+ 5. GetLatestVimScripts Friendly Plugins............: |glvs-plugins|
+ 6. GetLatestVimScripts AutoInstall.................: |glvs-autoinstall|
+ 7. GetLatestViMScripts Options.....................: |glvs-options|
+ 8. GetLatestVimScripts Algorithm...................: |glvs-alg|
+ 9. GetLatestVimScripts History.....................: |glvs-hist|
+
+
+==============================================================================
+2. GetLatestVimScripts -- Getting Started *getscript-start*
+ *getlatestvimscripts-install*
+
+ VERSION FROM VIM DISTRIBUTION *glvs-dist-install*
+
+Vim 7.0 does not include the GetLatestVimScripts.dist file which
+serves as an example and a template. So, you'll need to create
+your own! See |GetLatestVimScripts_dat|.
+
+ VERSION FROM VIM SF NET *glvs-install*
+
+NOTE: The last step, that of renaming/moving the GetLatestVimScripts.dist
+file, is for those who have just downloaded GetLatestVimScripts.tar.bz2 for
+the first time.
+
+The GetLatestVimScripts.dist file serves as an example and a template for your
+own personal list. Feel free to remove all the scripts mentioned within it;
+the "important" part of it is the first two lines.
+
+Your computer needs to have wget or curl for GetLatestVimScripts to do its work.
+
+ 1. if compressed: gunzip getscript.vba.gz
+ 2. Unix:
+ vim getscript.vba
+ :so %
+ :q
+ cd ~/.vim/GetLatest
+ mv GetLatestVimScripts.dist GetLatestVimScripts.dat
+ (edit GetLatestVimScripts.dat to install your own personal
+ list of desired plugins -- see |GetLatestVimScripts_dat|)
+
+ 3. Windows:
+ vim getscript.vba
+ :so %
+ :q
+ cd **path-to-vimfiles**/GetLatest
+ mv GetLatestVimScripts.dist GetLatestVimScripts.dat
+ (edit GetLatestVimScripts.dat to install your own personal
+ list of desired plugins -- see |GetLatestVimScripts_dat|)
+
+
+==============================================================================
+3. GetLatestVimScripts Usage *glvs-usage* *:GLVS*
+
+Unless it has been defined elsewhere, >
+
+ :GLVS
+
+will invoke GetLatestVimScripts(). If some other plugin has defined that
+command, then you may type
+>
+ :GetLatestVimScripts
+<
+The script will attempt to update and, if permitted, will automatically
+install scripts from http://vim.sourceforge.net/. To do so it will peruse a
+file,
+>
+ .vim/GetLatest/GetLatestVimScripts.dat (unix)
+<
+or >
+ ..wherever..\vimfiles\GetLatest\GetLatestVimScripts.dat (windows)
+(see |glvs-data|), and examine plugins in your [.vim|vimfiles]/plugin
+directory (see |glvs-plugins|).
+
+Scripts which have been downloaded will appear in the
+~/.vim/GetLatest (unix) or ..wherever..\vimfiles\GetLatest (windows)
+subdirectory. GetLatestVimScripts will attempt to automatically
+install them if you have the following line in your <.vimrc>: >
+
+ let g:GetLatestVimScripts_allowautoinstall=1
+
+The <GetLatestVimScripts.dat> file will be automatically be updated to
+reflect the latest version of script(s) so downloaded.
+(also see |glvs-options|)
+
+
+==============================================================================
+4. GetLatestVimScripts Data File *getscript-data* *glvs-data*
+ *:GetLatestVimScripts_dat*
+The data file <GetLatestVimScripts.dat> must have for its first two lines
+the following text:
+>
+ ScriptID SourceID Filename
+ --------------------------
+<
+Following those two lines are three columns; the first two are numeric
+followed by a text column. The GetLatest/GetLatestVimScripts.dist file
+contains an example of such a data file. Anything following a #... is
+ignored, so you may embed comments in the file.
+
+The first number on each line gives the script's ScriptID. When you're about
+to use a web browser to look at scripts on http://vim.sf.net/, just before you
+click on the script's link, you'll see a line resembling
+
+ http://vim.sourceforge.net/scripts/script.php?script_id=40
+
+The "40" happens to be a ScriptID that GetLatestVimScripts needs to
+download the associated page, and is assigned by vim.sf.net itself
+during initial uploading of the plugin.
+
+The second number on each line gives the script's SourceID. The SourceID
+records the count of uploaded scripts as determined by vim.sf.net; hence it
+serves to indicate "when" a script was uploaded. Setting the SourceID to 1
+insures that GetLatestVimScripts will assume that the script it has is
+out-of-date.
+
+The SourceID is extracted by GetLatestVimScripts from the script's page on
+vim.sf.net; whenever it is greater than the one stored in the
+GetLatestVimScripts.dat file, the script will be downloaded
+(see |GetLatestVimScripts_dat|).
+
+If your script's author has included a special comment line in his/her plugin,
+the plugin itself will be used by GetLatestVimScripts to build your
+<GetLatestVimScripts.dat> file, including any dependencies on other scripts it
+may have. As an example, consider: >
+
+ " GetLatestVimScripts: 884 1 :AutoInstall: AutoAlign.vim
+
+This comment line tells getscript.vim to check vimscript #884 and that the
+script is automatically installable. Getscript will also use this line to
+help build the GetLatestVimScripts.dat file, by including a line such as: >
+
+ 884 1 :AutoInstall: AutoAlign.vim
+<
+assuming that such a line isn't already in GetLatestVimScripts.dat file.
+See |glvs-plugins| for more. Thus, GetLatestVimScripts thus provides a
+comprehensive ability to keep your plugins up-to-date!
+
+In summary:
+
+ * Optionally tell getscript that it is allowed to build/append a
+ GetLatestVimScripts.dat file based upon already installed plugins: >
+ let g:GetLatestVimScripts_allowautoinstall=1
+<
+ * A line such as >
+ " GetLatestVimScripts: 884 1 :AutoInstall: AutoAlign.vim
+< in an already-downloaded plugin constitutes the concurrence of the
+ plugin author that getscript may do AutoInstall. Not all plugins
+ may be AutoInstall-able, and the plugin's author is best situated
+ to know whether or not his/her plugin will AutoInstall properly.
+
+ * A line such as >
+ 884 1 :AutoInstall: AutoAlign.vim
+< in your GetLatestVimScripts.dat file constitutes your permission
+ to getscript to do AutoInstall. AutoInstall requires both your
+ and the plugin author's permission. See |GetLatestVimScripts_dat|.
+
+
+ *GetLatestVimScripts_dat*
+As an example of a <GetLatestVimScripts.dat> file:
+>
+ ScriptID SourceID Filename
+ --------------------------
+ 294 1 :AutoInstall: Align.vim
+ 120 2 Decho.vim
+ 40 3 DrawIt.tar.gz
+ 451 4 EasyAccents.vim
+ 195 5 engspchk.vim
+ 642 6 GetLatestVimScripts.vim
+ 489 7 Manpageview.vim
+<
+Note: the first two lines are required, but essentially act as comments.
+
+
+==============================================================================
+5. GetLatestVimScripts Friendly Plugins *getscript-plugins* *glvs-plugins*
+
+ (this section is for plugin authors)~
+
+If a plugin author includes the following comment anywhere in their plugin,
+GetLatestVimScripts will find it and use it to automatically build the user's
+GetLatestVimScripts.dat files:
+>
+ src_id
+ v
+ " GetLatestVimScripts: ### ### yourscriptname
+ ^
+ scriptid
+<
+As an author, you should include such a line in to refer to your own script
+plus any additional lines describing any plugin dependencies it may have.
+Same format, of course!
+
+If your command is auto-installable (see |glvs-autoinstall|), and most scripts
+are, then you may include :AutoInstall: just before "yourscriptname":
+>
+ src_id
+ v
+ " GetLatestVimScripts: ### ### :AutoInstall: yourscriptname
+ ^
+ scriptid
+<
+NOTE: The :AutoInstall: feature requires both the plugin author's and~
+ the user's permission to operate!~
+
+GetLatestVimScripts commands for those scripts are then appended, if not
+already present, to the user's GetLatest/GetLatestVimScripts.dat file. It is
+a relatively painless way to automate the acquisition of any scripts your
+plugins depend upon.
+
+Now, as an author, you probably don't want GetLatestVimScripts to download
+your own scripts atop your own copy, thereby overwriting your not-yet-released
+hard work. GetLatestVimScripts provides a solution for this: put
+>
+ 0 0 yourscriptname
+<
+into your <GetLatestVimScripts.dat> file and GetLatestVimScripts will skip
+examining the "yourscriptname" scripts for those GetLatestVimScripts comment
+lines. As a result, those lines won't be inadvertently installed into your
+<GetLatestVimScripts.dat> file and subsequently used to download your own
+scripts. This is especially important to do if you've included the
+:AutoInstall: option.
+
+Be certain to use the same "yourscriptname" in the "0 0 yourscriptname" line
+as you've used in your GetLatestVimScripts comment!
+
+
+==============================================================================
+6. GetLatestVimScripts AutoInstall *getscript-autoinstall*
+ *glvs-autoinstall*
+
+GetLatestVimScripts now supports "AutoInstall". Not all scripts are
+supportive of auto-install, as they may have special things you need to do to
+install them (please refer to the script's "install" directions). On the
+other hand, most scripts will be auto-installable.
+
+To let GetLatestVimScripts do an autoinstall, the data file's comment field
+should begin with (surrounding blanks are ignored): >
+
+ :AutoInstall:
+<
+Both colons are needed, and it should begin the comment (yourscriptname)
+field.
+
+One may prevent any autoinstalling by putting the following line in your
+<.vimrc>: >
+
+ let g:GetLatestVimScripts_allowautoinstall= 0
+<
+With :AutoInstall: enabled, as it is by default, files which end with
+
+ ---.tar.bz2 : decompressed & untarred in .vim/ directory
+ ---.vba.bz2 : decompressed in .vim/ directory, then vimball handles it
+ ---.vim.bz2 : decompressed & moved into .vim/plugin directory
+ ---.tar.gz : decompressed & untarred in .vim/ directory
+ ---.vba.gz : decompressed in .vim/ directory, then vimball handles it
+ ---.vim.gz : decompressed & moved into .vim/plugin directory
+ ---.vba : unzipped in .vim/ directory
+ ---.vim : moved to .vim/plugin directory
+ ---.zip : unzipped in .vim/ directory
+
+and which merely need to have their components placed by the untar/gunzip or
+move-to-plugin-directory process should be auto-installable. Vimballs, of
+course, should always be auto-installable.
+
+When is a script not auto-installable? Let me give an example:
+
+ .vim/after/syntax/blockhl.vim
+
+The <blockhl.vim> script provides block highlighting for C/C++ programs; it is
+available at:
+
+ http://vim.sourceforge.net/scripts/script.php?script_id=104
+
+Currently, vim's after/syntax only supports by-filetype scripts (in
+blockhl.vim's case, that's after/syntax/c.vim). Hence, auto-install would
+possibly overwrite the current user's after/syntax/c.vim file.
+
+In my own case, I use <aftersyntax.vim> (renamed to after/syntax/c.vim) to
+allow a after/syntax/c/ directory:
+
+ http://vim.sourceforge.net/scripts/script.php?script_id=1023
+
+The script allows multiple syntax files to exist separately in the
+after/syntax/c subdirectory. I can't bundle aftersyntax.vim in and build an
+appropriate tarball for auto-install because of the potential for the
+after/syntax/c.vim contained in it to overwrite a user's c.vim.
+
+
+==============================================================================
+7. GetLatestVimScripts Options *glvs-options*
+>
+ g:GetLatestVimScripts_wget
+< default= "wget"
+ This variable holds the name of the command for obtaining
+ scripts.
+>
+ g:GetLatestVimScripts_options
+< default= "-q -O"
+ This variable holds the options to be used with the
+ g:GetLatestVimScripts_wget command.
+>
+ g:GetLatestVimScripts_allowautoinstall
+< default= 1
+ This variable indicates whether GetLatestVimScripts is allowed
+ to attempt to automatically install scripts. Furthermore, the
+ plugin author has to have explicitly indicated that his/her
+ plugin is automatically installable (via the :AutoInstall:
+ keyword in the GetLatestVimScripts comment line).
+>
+ g:GetLatestVimScripts_autoinstalldir
+< default= $HOME/.vim (linux)
+ default= $HOME/vimfiles (windows)
+ Override where :AutoInstall: scripts will be installed.
+ Doesn't override vimball installation.
+>
+ g:GetLatestVimScripts_scriptaddr
+< default='http://vim.sourceforge.net/script.php?script_id='
+ Override this if your system needs
+ ... ='http://vim.sourceforge.net/script/script.php?script_id='
+
+==============================================================================
+8. GetLatestVimScripts Algorithm *glvs-algorithm* *glvs-alg*
+
+The Vim sourceforge page dynamically creates a page by keying off of the
+so-called script-id. Within the webpage of
+
+ http://vim.sourceforge.net/scripts/script.php?script_id=40
+
+is a line specifying the latest source-id (src_id). The source identifier
+numbers are always increasing, hence if the src_id is greater than the one
+recorded for the script in GetLatestVimScripts then it's time to download a
+newer copy of that script.
+
+GetLatestVimScripts will then download the script and update its internal
+database of script ids, source ids, and scriptnames.
+
+The AutoInstall process will:
+
+ Move the file from GetLatest/ to the following directory
+ Unix : $HOME/.vim
+ Windows: $HOME\vimfiles
+ if the downloaded file ends with ".bz2"
+ bunzip2 it
+ else if the downloaded file ends with ".gz"
+ gunzip it
+ if the resulting file ends with ".zip"
+ unzip it
+ else if the resulting file ends with ".tar"
+ tar -oxvf it
+ else if the resulting file ends with ".vim"
+ move it to the plugin subdirectory
+
+
+==============================================================================
+9. GetLatestVimScripts History *getscript-history* *glvs-hist* {{{1
+
+v36 Apr 22, 2013 : * (glts) suggested use of plugin/**/*.vim instead of
+ plugin/*.vim in globpath() call.
+ * (Andy Wokula) got warning message when setting
+ g:loaded_getscriptPlugin
+v35 Apr 07, 2012 : * (MengHuan Yu) pointed out that the script URL has
+ changed (somewhat). However, it doesn't work, and
+ the original one does (under Linux). I'll make it
+ yet-another-option.
+v34 Jun 23, 2011 : * handles additional decompression options for tarballs
+ (tgz taz tbz txz)
+v33 May 31, 2011 : * using fnameescape() instead of escape()
+ * *.xz support
+v32 Jun 19, 2010 : * (Jan Steffens) added support for xz compression
+v31 Jun 29, 2008 : * (Bill McCarthy) fixed having hls enabled with getscript
+ * (David Schaefer) the acd option interferes with vimballs
+ Solution: bypass the acd option
+v30 Jun 13, 2008 : * GLVS now checks for existence of fnameescape() and will
+ issue an error message if it is not supported
+v29 Jan 07, 2008 : * Bram M pointed out that cpo is a global option and that
+ getscriptPlugin.vim was setting it but not restoring it.
+v28 Jan 02, 2008 : * improved shell quoting character handling, cygwin
+ interface, register-a bypass
+ Oct 29, 2007 * Bill McCarthy suggested a change to getscript that avoids
+ creating pop-up windows
+v24 Apr 16, 2007 : * removed save&restore of the fo option during script
+ loading
+v23 Nov 03, 2006 : * ignores comments (#...)
+ * handles vimballs
+v22 Oct 13, 2006 : * supports automatic use of curl if wget is not
+ available
+v21 May 01, 2006 : * now takes advantage of autoloading.
+v20 Dec 23, 2005 : * Eric Haarbauer found&fixed a bug with unzip use;
+ unzip needs the -o flag to overwrite.
+v19 Nov 28, 2005 : * v18's GetLatestVimScript line accessed the wrong
+ script! Fixed.
+v18 Mar 21, 2005 : * bugfix to automatic database construction
+ * bugfix - nowrapscan caused an error
+ (tnx to David Green for the fix)
+ Apr 01, 2005 * if shell is bash, "mv" instead of "ren" used in
+ :AutoInstall:s, even though its o/s is windows
+ Apr 01, 2005 * when downloading errors occurred, GLVS was
+ terminating early. It now just goes on to trying
+ the next script (after trying three times to
+ download a script description page)
+ Apr 20, 2005 * bugfix - when a failure to download occurred,
+ GetLatestVimScripts would stop early and claim that
+ everything was current. Fixed.
+v17 Aug 25, 2004 : * g:GetLatestVimScripts_allowautoinstall, which
+ defaults to 1, can be used to prevent all
+ :AutoInstall:
+v16 Aug 25, 2004 : * made execution of bunzip2/gunzip/tar/zip silent
+ * fixed bug with :AutoInstall: use of helptags
+v15 Aug 24, 2004 : * bugfix: the "0 0 comment" download prevention wasn't
+ always preventing downloads (just usually). Fixed.
+v14 Aug 24, 2004 : * bugfix -- helptags was using dotvim, rather than
+ s:dotvim. Fixed.
+v13 Aug 23, 2004 : * will skip downloading a file if its scriptid or srcid
+ is zero. Useful for script authors; that way their
+ own GetLatestVimScripts activity won't overwrite
+ their scripts.
+v12 Aug 23, 2004 : * bugfix - a "return" got left in the distribution that
+ was intended only for testing. Removed, now works.
+ * :AutoInstall: implemented
+v11 Aug 20, 2004 : * GetLatestVimScripts is now a plugin:
+ * :GetLatestVimScripts command
+ * (runtimepath)/GetLatest/GetLatestVimScripts.dat
+ now holds scripts that need updating
+v10 Apr 19, 2004 : * moved history from script to doc
+v9 Jan 23, 2004 : windows (win32/win16/win95) will use
+ double quotes ("") whereas other systems will use
+ single quotes ('') around the urls in calls via wget
+v8 Dec 01, 2003 : makes three tries at downloading
+v7 Sep 02, 2003 : added error messages if "Click on..." or "src_id="
+ not found in downloaded webpage
+ Uses t_ti, t_te, and rs to make progress visible
+v6 Aug 06, 2003 : final status messages now display summary of work
+ ( "Downloaded someqty scripts" or
+ "Everything was current")
+ Now GetLatestVimScripts is careful about downloading
+ GetLatestVimScripts.vim itself!
+ (goes to <NEW_GetLatestVimScripts.vim>)
+v5 Aug 04, 2003 : missing an endif near bottom
+v4 Jun 17, 2003 : redraw! just before each "considering" message
+v3 May 27, 2003 : Protects downloaded files from errant shell
+ expansions with single quotes: '...'
+v2 May 14, 2003 : extracts name of item to be obtained from the
+ script file. Uses it instead of comment field
+ for output filename; comment is used in the
+ "considering..." line and is now just a comment!
+ * Fixed a bug: a string-of-numbers is not the
+ same as a number, so I added zero to them
+ and they became numbers. Fixes comparison.
+
+==============================================================================
+vim:tw=78:ts=8:noet:ft=help:fdm=marker
diff --git a/runtime/doc/pi_gzip.txt b/runtime/doc/pi_gzip.txt
new file mode 100644
index 0000000..e5d5ffb
--- /dev/null
+++ b/runtime/doc/pi_gzip.txt
@@ -0,0 +1,41 @@
+*pi_gzip.txt* For Vim version 9.0. Last change: 2019 May 05
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Editing compressed files with Vim *gzip* *bzip2* *compress*
+
+1. Autocommands |gzip-autocmd|
+
+The functionality mentioned here is a |standard-plugin|.
+This plugin is only available if 'compatible' is not set.
+You can avoid loading this plugin by setting the "loaded_gzip" variable: >
+ :let loaded_gzip = 1
+
+==============================================================================
+1. Autocommands *gzip-autocmd*
+
+The plugin installs autocommands to intercept reading and writing of files
+with these extensions:
+
+ extension compression ~
+ *.Z compress (Lempel-Ziv)
+ *.gz gzip
+ *.bz2 bzip2
+ *.lzma lzma
+ *.xz xz
+ *.lz lzip
+ *.zst zstd
+
+That's actually the only thing you need to know. There are no options.
+
+After decompressing a file, the filetype will be detected again. This will
+make a file like "foo.c.gz" get the "c" filetype.
+
+If you have 'patchmode' set, it will be appended after the extension for
+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:noet:ft=help:norl:
diff --git a/runtime/doc/pi_logipat.txt b/runtime/doc/pi_logipat.txt
new file mode 100644
index 0000000..e72fabe
--- /dev/null
+++ b/runtime/doc/pi_logipat.txt
@@ -0,0 +1,122 @@
+*pi_logipat.txt* Logical Patterns May 01, 2019
+
+Author: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+Copyright: (c) 2004-2016 by Charles E. Campbell *logiPat-copyright*
+ The VIM LICENSE applies to LogiPat.vim and LogiPat.txt
+ (see |copyright|) except use "LogiPat" instead of "Vim"
+ No warranty, express or implied. Use At-Your-Own-Risk.
+
+==============================================================================
+1. Contents *logiPat* *logiPat-contents*
+
+ 1. Contents.................: |logiPat-contents|
+ 2. LogiPat Manual...........: |logiPat-manual|
+ 3. LogiPat Examples.........: |logiPat-examples|
+ 4. Caveat...................: |logiPat-caveat|
+ 5. LogiPat History..........: |logiPat-history|
+
+
+==============================================================================
+2. LogiPat Manual *logiPat-manual* *logiPat-man*
+
+ *logiPat-arg* *logiPat-input* *logiPat-pattern* *logiPat-operators*
+ Boolean logic patterns are composed of
+
+ operators ! = not
+ | = logical-or
+ & = logical-and
+ grouping ( ... )
+ patterns "pattern"
+
+ *logiPat-cmd*
+ :LogiPat {boolean-logic pattern} *:LogiPat*
+ :LogiPat is a command which takes a boolean-logic
+ argument (|logiPat-arg|).
+
+ :LP {boolean-logic pattern} *:LP*
+ :LP is a shorthand command version of :LogiPat
+ (|logiPat-cmd|).
+
+ :LPE {boolean-logic pattern} *:LPE*
+ No search is done, but the conversion from the
+ boolean logic pattern to the regular expression
+ is performed and echoed onto the display.
+
+ :LogiPatFlags {search flags} *LogiPat-flags*
+ LogiPat uses the |search()| command. The flags
+ passed to that call to search() may be specified
+ by the :LogiPatFlags command.
+
+ :LPF {search flags} *:LPF*
+ :LPF is a shorthand version of :LogiPatFlags.
+
+ :let pat=LogiPat({boolean-logic pattern}) *LogiPat()*
+ If one calls LogiPat() directly, no search
+ is done, but the transformation from the boolean
+ logic pattern into a regular expression pattern
+ is performed and returned.
+
+ To get a " inside a pattern, as opposed to having it delimit
+ the pattern, double it.
+
+
+==============================================================================
+3. LogiPat Examples *logiPat-examples*
+
+ LogiPat takes Boolean logic arguments and produces a regular
+ expression which implements the choices. A series of examples
+ follows:
+>
+ :LogiPat "abc"
+< will search for lines containing the string :abc:
+>
+ :LogiPat "ab""cd"
+< will search for lines containing the string :ab"cd:
+>
+ :LogiPat !"abc"
+< will search for lines which don't contain the string :abc:
+>
+ :LogiPat "abc"|"def"
+< will search for lines which contain either the string
+ :abc: or the string :def:
+>
+ :LogiPat !("abc"|"def")
+< will search for lines which don't contain either
+ of the strings :abc: or :def:
+>
+ :LogiPat "abc"&"def"
+< will search for lines which contain both of the strings
+ :abc: and :def:
+>
+ :let pat= LogiPat('!"abc"')
+< will return the regular expression which will match
+ all lines not containing :abc: . The double quotes
+ are needed to pass normal patterns to LogiPat, and
+ differentiate such patterns from boolean logic
+ operators.
+
+
+==============================================================================
+4. Caveat *logiPat-caveat*
+
+ The "not" operator may be fragile; ie. it may not always play well
+ with the & (logical-and) and | (logical-or) operators. Please try out
+ your patterns, possibly with :set hls, to insure that what is matching
+ is what you want.
+
+
+==============================================================================
+5. LogiPat History *logiPat-history*
+
+ v4 Jun 22, 2015 * LogiPat has been picked up by Bram M for standard
+ plugin distribution; hence the name change
+ v3 Sep 25, 2006 * LP_Or() fixed; it now encapsulates its output
+ in \%(...\) parentheses
+ Dec 12, 2011 * |:LPE| added
+ * "" is mapped to a single " and left inside patterns
+ v2 May 31, 2005 * LPF and LogiPatFlags commands weren't working
+ v1 May 23, 2005 * initial release
+
+
+==============================================================================
+vim:tw=78:ts=8:noet:ft=help
diff --git a/runtime/doc/pi_netrw.txt b/runtime/doc/pi_netrw.txt
new file mode 100644
index 0000000..f242430
--- /dev/null
+++ b/runtime/doc/pi_netrw.txt
@@ -0,0 +1,4419 @@
+*pi_netrw.txt* For Vim version 9.0. Last change: 2022 Apr 06
+
+ ------------------------------------------------
+ NETRW REFERENCE MANUAL by Charles E. Campbell
+ ------------------------------------------------
+Author: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+ (remove NOSPAM from Campbell's email first)
+
+Copyright: Copyright (C) 2017 Charles E Campbell *netrw-copyright*
+ The VIM LICENSE applies to the files in this package, including
+ netrw.vim, pi_netrw.txt, netrwFileHandlers.vim, netrwSettings.vim, and
+ syntax/netrw.vim. Like anything else that's free, netrw.vim and its
+ associated files are provided *as is* and comes with no warranty of
+ any kind, either expressed or implied. No guarantees of
+ merchantability. No guarantees of suitability for any purpose. 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. Use at your own risk!
+
+ *netrw*
+ *dav* *ftp* *netrw-file* *rcp* *scp*
+ *davs* *http* *netrw.vim* *rsync* *sftp*
+ *fetch* *network*
+
+==============================================================================
+1. Contents *netrw-contents* {{{1
+
+1. Contents..............................................|netrw-contents|
+2. Starting With Netrw...................................|netrw-start|
+3. Netrw Reference.......................................|netrw-ref|
+ EXTERNAL APPLICATIONS AND PROTOCOLS.................|netrw-externapp|
+ READING.............................................|netrw-read|
+ WRITING.............................................|netrw-write|
+ SOURCING............................................|netrw-source|
+ DIRECTORY LISTING...................................|netrw-dirlist|
+ CHANGING THE USERID AND PASSWORD....................|netrw-chgup|
+ VARIABLES AND SETTINGS..............................|netrw-variables|
+ PATHS...............................................|netrw-path|
+4. Network-Oriented File Transfer........................|netrw-xfer|
+ NETRC...............................................|netrw-netrc|
+ PASSWORD............................................|netrw-passwd|
+5. Activation............................................|netrw-activate|
+6. Transparent Remote File Editing.......................|netrw-transparent|
+7. Ex Commands...........................................|netrw-ex|
+8. Variables and Options.................................|netrw-variables|
+9. Browsing..............................................|netrw-browse|
+ Introduction To Browsing............................|netrw-intro-browse|
+ Quick Reference: Maps...............................|netrw-browse-maps|
+ Quick Reference: Commands...........................|netrw-browse-cmds|
+ Banner Display......................................|netrw-I|
+ Bookmarking A Directory.............................|netrw-mb|
+ Browsing............................................|netrw-cr|
+ Squeezing the Current Tree-Listing Directory........|netrw-s-cr|
+ Browsing With A Horizontally Split Window...........|netrw-o|
+ Browsing With A New Tab.............................|netrw-t|
+ Browsing With A Vertically Split Window.............|netrw-v|
+ Change File Permission..............................|netrw-gp|
+ Change Listing Style.(thin wide long tree)..........|netrw-i|
+ Changing To A Bookmarked Directory..................|netrw-gb|
+ Changing To A Predecessor Directory.................|netrw-u|
+ Changing To A Successor Directory...................|netrw-U|
+ Customizing Browsing With A Special Handler.........|netrw-x|
+ Deleting Bookmarks..................................|netrw-mB|
+ Deleting Files Or Directories.......................|netrw-D|
+ Directory Exploring Commands........................|netrw-explore|
+ Exploring With Stars and Patterns...................|netrw-star|
+ Displaying Information About File...................|netrw-qf|
+ Edit File Or Directory Hiding List..................|netrw-ctrl-h|
+ Editing The Sorting Sequence........................|netrw-S|
+ Forcing treatment as a file or directory............|netrw-gd| |netrw-gf|
+ Going Up............................................|netrw--|
+ Hiding Files Or Directories.........................|netrw-a|
+ Improving Browsing..................................|netrw-ssh-hack|
+ Listing Bookmarks And History.......................|netrw-qb|
+ Making A New Directory..............................|netrw-d|
+ Making The Browsing Directory The Current Directory.|netrw-cd|
+ Marking Files.......................................|netrw-mf|
+ Unmarking Files.....................................|netrw-mF|
+ Marking Files By Location List......................|netrw-qL|
+ Marking Files By QuickFix List......................|netrw-qF|
+ Marking Files By Regular Expression.................|netrw-mr|
+ Marked Files: Arbitrary Shell Command...............|netrw-mx|
+ Marked Files: Arbitrary Shell Command, En Bloc......|netrw-mX|
+ Marked Files: Arbitrary Vim Command.................|netrw-mv|
+ Marked Files: Argument List.........................|netrw-ma| |netrw-mA|
+ Marked Files: Buffer List...........................|netrw-cb| |netrw-cB|
+ Marked Files: Compression And Decompression.........|netrw-mz|
+ Marked Files: Copying...............................|netrw-mc|
+ Marked Files: Diff..................................|netrw-md|
+ Marked Files: Editing...............................|netrw-me|
+ Marked Files: Grep..................................|netrw-mg|
+ Marked Files: Hiding and Unhiding by Suffix.........|netrw-mh|
+ Marked Files: Moving................................|netrw-mm|
+ Marked Files: Printing..............................|netrw-mp|
+ Marked Files: Sourcing..............................|netrw-ms|
+ Marked Files: Setting the Target Directory..........|netrw-mt|
+ Marked Files: Tagging...............................|netrw-mT|
+ Marked Files: Target Directory Using Bookmarks......|netrw-Tb|
+ Marked Files: Target Directory Using History........|netrw-Th|
+ Marked Files: Unmarking.............................|netrw-mu|
+ Netrw Browser Variables.............................|netrw-browser-var|
+ Netrw Browsing And Option Incompatibilities.........|netrw-incompatible|
+ Netrw Settings Window...............................|netrw-settings-window|
+ Obtaining A File....................................|netrw-O|
+ Preview Window......................................|netrw-p|
+ Previous Window.....................................|netrw-P|
+ Refreshing The Listing..............................|netrw-ctrl-l|
+ Reversing Sorting Order.............................|netrw-r|
+ Renaming Files Or Directories.......................|netrw-R|
+ Selecting Sorting Style.............................|netrw-s|
+ Setting Editing Window..............................|netrw-C|
+10. Problems and Fixes....................................|netrw-problems|
+11. Debugging Netrw Itself................................|netrw-debug|
+12. History...............................................|netrw-history|
+13. Todo..................................................|netrw-todo|
+14. Credits...............................................|netrw-credits|
+
+==============================================================================
+2. Starting With Netrw *netrw-start* {{{1
+
+Netrw makes reading files, writing files, browsing over a network, and
+local browsing easy! First, make sure that you have plugins enabled, so
+you'll need to have at least the following in your <.vimrc>:
+(or see |netrw-activate|) >
+
+ set nocp " 'compatible' is not set
+ filetype plugin on " plugins are enabled
+<
+(see |'cp'| and |:filetype-plugin-on|)
+
+Netrw supports "transparent" editing of files on other machines using urls
+(see |netrw-transparent|). As an example of this, let's assume you have an
+account on some other machine; if you can use scp, try: >
+
+ vim scp://hostname/path/to/file
+<
+Want to make ssh/scp easier to use? Check out |netrw-ssh-hack|!
+
+So, what if you have ftp, not ssh/scp? That's easy, too; try >
+
+ vim ftp://hostname/path/to/file
+<
+Want to make ftp simpler to use? See if your ftp supports a file called
+<.netrc> -- typically it goes in your home directory, has read/write
+permissions for only the user to read (ie. not group, world, other, etc),
+and has lines resembling >
+
+ machine HOSTNAME login USERID password "PASSWORD"
+ machine HOSTNAME login USERID password "PASSWORD"
+ ...
+ default login USERID password "PASSWORD"
+<
+Windows' ftp doesn't support .netrc; however, one may have in one's .vimrc: >
+
+ let g:netrw_ftp_cmd= 'c:\Windows\System32\ftp -s:C:\Users\MyUserName\MACHINE'
+<
+Netrw will substitute the host's machine name for "MACHINE" from the URL it is
+attempting to open, and so one may specify >
+ userid
+ password
+for each site in a separate file: c:\Users\MyUserName\MachineName.
+
+Now about browsing -- when you just want to look around before editing a
+file. For browsing on your current host, just "edit" a directory: >
+
+ vim .
+ vim /home/userid/path
+<
+For browsing on a remote host, "edit" a directory (but make sure that
+the directory name is followed by a "/"): >
+
+ vim scp://hostname/
+ vim ftp://hostname/path/to/dir/
+<
+See |netrw-browse| for more!
+
+There are more protocols supported by netrw than just scp and ftp, too: see the
+next section, |netrw-externapp|, on how to use these external applications with
+netrw and vim.
+
+PREVENTING LOADING *netrw-noload*
+
+If you want to use plugins, but for some reason don't wish to use netrw, then
+you need to avoid loading both the plugin and the autoload portions of netrw.
+You may do so by placing the following two lines in your <.vimrc>: >
+
+ :let g:loaded_netrw = 1
+ :let g:loaded_netrwPlugin = 1
+<
+
+==============================================================================
+3. Netrw Reference *netrw-ref* {{{1
+
+ Netrw supports several protocols in addition to scp and ftp as mentioned
+ in |netrw-start|. These include dav, fetch, http,... well, just look
+ at the list in |netrw-externapp|. Each protocol is associated with a
+ variable which holds the default command supporting that protocol.
+
+EXTERNAL APPLICATIONS AND PROTOCOLS *netrw-externapp* {{{2
+
+ Protocol Variable Default Value
+ -------- ---------------- -------------
+ dav: *g:netrw_dav_cmd* = "cadaver" if cadaver is executable
+ dav: g:netrw_dav_cmd = "curl -o" elseif curl is available
+ fetch: *g:netrw_fetch_cmd* = "fetch -o" if fetch is available
+ ftp: *g:netrw_ftp_cmd* = "ftp"
+ http: *g:netrw_http_cmd* = "elinks" if elinks is available
+ http: g:netrw_http_cmd = "links" elseif links is available
+ http: g:netrw_http_cmd = "curl" elseif curl is available
+ http: g:netrw_http_cmd = "wget" elseif wget is available
+ http: g:netrw_http_cmd = "fetch" elseif fetch is available
+ http: *g:netrw_http_put_cmd* = "curl -T"
+ rcp: *g:netrw_rcp_cmd* = "rcp"
+ rsync: *g:netrw_rsync_cmd* = "rsync" (see |g:netrw_rsync_sep|)
+ scp: *g:netrw_scp_cmd* = "scp -q"
+ sftp: *g:netrw_sftp_cmd* = "sftp"
+ file: *g:netrw_file_cmd* = "elinks" or "links"
+
+ *g:netrw_http_xcmd* : the option string for http://... protocols are
+ specified via this variable and may be independently overridden. By
+ default, the option arguments for the http-handling commands are: >
+
+ elinks : "-source >"
+ links : "-dump >"
+ curl : "-L -o"
+ wget : "-q -O"
+ fetch : "-o"
+<
+ For example, if your system has elinks, and you'd rather see the
+ page using an attempt at rendering the text, you may wish to have >
+ let g:netrw_http_xcmd= "-dump >"
+< in your .vimrc.
+
+ g:netrw_http_put_cmd: this option specifies both the executable and
+ any needed options. This command does a PUT operation to the url.
+
+
+READING *netrw-read* *netrw-nread* {{{2
+
+ Generally, one may just use the URL notation with a normal editing
+ command, such as >
+
+ :e ftp://[user@]machine/path
+<
+ Netrw also provides the Nread command:
+
+ :Nread ? give help
+ :Nread "machine:path" uses rcp
+ :Nread "machine path" uses ftp w/ <.netrc>
+ :Nread "machine id password path" uses ftp
+ :Nread "dav://machine[:port]/path" uses cadaver
+ :Nread "fetch://[user@]machine/path" uses fetch
+ :Nread "ftp://[user@]machine[[:#]port]/path" uses ftp w/ <.netrc>
+ :Nread "http://[user@]machine/path" uses http uses wget
+ :Nread "rcp://[user@]machine/path" uses rcp
+ :Nread "rsync://[user@]machine[:port]/path" uses rsync
+ :Nread "scp://[user@]machine[[:#]port]/path" uses scp
+ :Nread "sftp://[user@]machine/path" uses sftp
+
+WRITING *netrw-write* *netrw-nwrite* {{{2
+
+ One may just use the URL notation with a normal file writing
+ command, such as >
+
+ :w ftp://[user@]machine/path
+<
+ Netrw also provides the Nwrite command:
+
+ :Nwrite ? give help
+ :Nwrite "machine:path" uses rcp
+ :Nwrite "machine path" uses ftp w/ <.netrc>
+ :Nwrite "machine id password path" uses ftp
+ :Nwrite "dav://machine[:port]/path" uses cadaver
+ :Nwrite "ftp://[user@]machine[[:#]port]/path" uses ftp w/ <.netrc>
+ :Nwrite "rcp://[user@]machine/path" uses rcp
+ :Nwrite "rsync://[user@]machine[:port]/path" uses rsync
+ :Nwrite "scp://[user@]machine[[:#]port]/path" uses scp
+ :Nwrite "sftp://[user@]machine/path" uses sftp
+ http: not supported!
+
+SOURCING *netrw-source* {{{2
+
+ One may just use the URL notation with the normal file sourcing
+ command, such as >
+
+ :so ftp://[user@]machine/path
+<
+ Netrw also provides the Nsource command:
+
+ :Nsource ? give help
+ :Nsource "dav://machine[:port]/path" uses cadaver
+ :Nsource "fetch://[user@]machine/path" uses fetch
+ :Nsource "ftp://[user@]machine[[:#]port]/path" uses ftp w/ <.netrc>
+ :Nsource "http://[user@]machine/path" uses http uses wget
+ :Nsource "rcp://[user@]machine/path" uses rcp
+ :Nsource "rsync://[user@]machine[:port]/path" uses rsync
+ :Nsource "scp://[user@]machine[[:#]port]/path" uses scp
+ :Nsource "sftp://[user@]machine/path" uses sftp
+
+DIRECTORY LISTING *netrw-trailingslash* *netrw-dirlist* {{{2
+
+ One may browse a directory to get a listing by simply attempting to
+ edit the directory: >
+
+ :e scp://[user]@hostname/path/
+ :e ftp://[user]@hostname/path/
+<
+ For remote directory listings (ie. those using scp or ftp), that
+ trailing "/" is necessary (the slash tells netrw to treat the argument
+ as a directory to browse instead of as a file to download).
+
+ The Nread command may also be used to accomplish this (again, that
+ trailing slash is necessary): >
+
+ :Nread [protocol]://[user]@hostname/path/
+<
+ *netrw-login* *netrw-password*
+CHANGING USERID AND PASSWORD *netrw-chgup* *netrw-userpass* {{{2
+
+ Attempts to use ftp will prompt you for a user-id and a password.
+ These will be saved in global variables |g:netrw_uid| and
+ |s:netrw_passwd|; subsequent use of ftp will re-use those two strings,
+ thereby simplifying use of ftp. However, if you need to use a
+ different user id and/or password, you'll want to call |NetUserPass()|
+ first. To work around the need to enter passwords, check if your ftp
+ supports a <.netrc> file in your home directory. Also see
+ |netrw-passwd| (and if you're using ssh/scp hoping to figure out how
+ to not need to use passwords for scp, look at |netrw-ssh-hack|).
+
+ :NetUserPass [uid [password]] -- prompts as needed
+ :call NetUserPass() -- prompts for uid and password
+ :call NetUserPass("uid") -- prompts for password
+ :call NetUserPass("uid","password") -- sets global uid and password
+
+(Related topics: |ftp| |netrw-userpass| |netrw-start|)
+
+NETRW VARIABLES AND SETTINGS *netrw-variables* {{{2
+ (Also see:
+ |netrw-browser-var| : netrw browser option variables
+ |netrw-protocol| : file transfer protocol option variables
+ |netrw-settings| : additional file transfer options
+ |netrw-browser-options| : these options affect browsing directories
+ )
+
+Netrw provides a lot of variables which allow you to customize netrw to your
+preferences. One way to look at them is via the command :NetrwSettings (see
+|netrw-settings|) which will display your current netrw settings. Most such
+settings are described below, in |netrw-browser-options|, and in
+|netrw-externapp|:
+
+ *b:netrw_lastfile* last file Network-read/written retained on a
+ per-buffer basis (supports plain :Nw )
+
+ *g:netrw_bufsettings* the settings that netrw buffers have
+ (default) noma nomod nonu nowrap ro nobl
+
+ *g:netrw_chgwin* specifies a window number where subsequent file edits
+ will take place. (also see |netrw-C|)
+ (default) -1
+
+ *g:Netrw_funcref* specifies a function (or functions) to be called when
+ netrw edits a file. The file is first edited, and
+ then the function reference (|Funcref|) is called.
+ This variable may also hold a |List| of Funcrefs.
+ (default) not defined. (the capital in g:Netrw...
+ is required by its holding a function reference)
+>
+ Example: place in .vimrc; affects all file opening
+ fun! MyFuncRef()
+ endfun
+ let g:Netrw_funcref= function("MyFuncRef")
+
+<
+ *g:Netrw_UserMaps* specifies a function or |List| of functions which can
+ be used to set up user-specified maps and functionality.
+ See |netrw-usermaps|
+
+ *g:netrw_ftp* if it doesn't exist, use default ftp
+ =0 use default ftp (uid password)
+ =1 use alternate ftp method (user uid password)
+ If you're having trouble with ftp, try changing the
+ value of this variable to see if the alternate ftp
+ method works for your setup.
+
+ *g:netrw_ftp_options* Chosen by default, these options are supposed to
+ turn interactive prompting off and to restrain ftp
+ from attempting auto-login upon initial connection.
+ However, it appears that not all ftp implementations
+ support this (ex. ncftp).
+ ="-i -n"
+
+ *g:netrw_ftpextracmd* default: doesn't exist
+ If this variable exists, then any string it contains
+ will be placed into the commands set to your ftp
+ client. As an example:
+ ="passive"
+
+ *g:netrw_ftpmode* ="binary" (default)
+ ="ascii"
+
+ *g:netrw_ignorenetrc* =0 (default for linux, cygwin)
+ =1 If you have a <.netrc> file but it doesn't work and
+ you want it ignored, then set this variable as
+ shown. (default for Windows + cmd.exe)
+
+ *g:netrw_menu* =0 disable netrw's menu
+ =1 (default) netrw's menu enabled
+
+ *g:netrw_nogx* if this variable exists, then the "gx" map will not
+ be available (see |netrw-gx|)
+
+ *g:netrw_uid* (ftp) user-id, retained on a per-vim-session basis
+ *s:netrw_passwd* (ftp) password, retained on a per-vim-session basis
+
+ *g:netrw_preview* =0 (default) preview window shown in a horizontally
+ split window
+ =1 preview window shown in a vertically split window.
+ Also affects the "previous window" (see |netrw-P|)
+ in the same way.
+ The |g:netrw_alto| variable may be used to provide
+ additional splitting control:
+ g:netrw_preview g:netrw_alto result
+ 0 0 |:aboveleft|
+ 0 1 |:belowright|
+ 1 0 |:topleft|
+ 1 1 |:botright|
+ To control sizing, see |g:netrw_winsize|
+
+ *g:netrw_scpport* = "-P" : option to use to set port for scp
+ *g:netrw_sshport* = "-p" : option to use to set port for ssh
+
+ *g:netrw_sepchr* =\0xff
+ =\0x01 for enc == euc-jp (and perhaps it should be for
+ others, too, please let me know)
+ Separates priority codes from filenames internally.
+ See |netrw-p12|.
+
+ *g:netrw_silent* =0 : transfers done normally
+ =1 : transfers done silently
+
+ *g:netrw_use_errorwindow* =2: messages from netrw will use a popup window
+ Move the mouse and pause to remove the popup window.
+ (default value if popup windows are available)
+ =1 : messages from netrw will use a separate one
+ line window. This window provides reliable
+ delivery of messages.
+ (default value if popup windows are not available)
+ =0 : messages from netrw will use echoerr ;
+ messages don't always seem to show up this
+ way, but one doesn't have to quit the window.
+
+ *g:netrw_win95ftp* =1 if using Win95, will remove four trailing blank
+ lines that o/s's ftp "provides" on transfers
+ =0 force normal ftp behavior (no trailing line removal)
+
+ *g:netrw_cygwin* =1 assume scp under windows is from cygwin. Also
+ permits network browsing to use ls with time and
+ size sorting (default if windows)
+ =0 assume Windows' scp accepts windows-style paths
+ Network browsing uses dir instead of ls
+ This option is ignored if you're using unix
+
+ *g:netrw_use_nt_rcp* =0 don't use the rcp of WinNT, Win2000 and WinXP
+ =1 use WinNT's rcp in binary mode (default)
+
+PATHS *netrw-path* {{{2
+
+Paths to files are generally user-directory relative for most protocols.
+It is possible that some protocol will make paths relative to some
+associated directory, however.
+>
+ example: vim scp://user@host/somefile
+ example: vim scp://user@host/subdir1/subdir2/somefile
+<
+where "somefile" is in the "user"'s home directory. If you wish to get a
+file using root-relative paths, use the full path:
+>
+ example: vim scp://user@host//somefile
+ example: vim scp://user@host//subdir1/subdir2/somefile
+<
+
+==============================================================================
+4. Network-Oriented File Transfer *netrw-xfer* {{{1
+
+Network-oriented file transfer under Vim is implemented by a vim script
+(<netrw.vim>) using plugin techniques. It currently supports both reading and
+writing across networks using rcp, scp, ftp or ftp+<.netrc>, scp, fetch,
+dav/cadaver, rsync, or sftp.
+
+http is currently supported read-only via use of wget or fetch.
+
+<netrw.vim> is a standard plugin which acts as glue between Vim and the
+various file transfer programs. It uses autocommand events (BufReadCmd,
+FileReadCmd, BufWriteCmd) to intercept reads/writes with url-like filenames. >
+
+ ex. vim ftp://hostname/path/to/file
+<
+The characters preceding the colon specify the protocol to use; in the
+example, it's ftp. The <netrw.vim> script then formulates a command or a
+series of commands (typically ftp) which it issues to an external program
+(ftp, scp, etc) which does the actual file transfer/protocol. Files are read
+from/written to a temporary file (under Unix/Linux, /tmp/...) which the
+<netrw.vim> script will clean up.
+
+Now, a word about Jan Minář's "FTP User Name and Password Disclosure"; first,
+ftp is not a secure protocol. User names and passwords are transmitted "in
+the clear" over the internet; any snooper tool can pick these up; this is not
+a netrw thing, this is a ftp thing. If you're concerned about this, please
+try to use scp or sftp instead.
+
+Netrw re-uses the user id and password during the same vim session and so long
+as the remote hostname remains the same.
+
+Jan seems to be a bit confused about how netrw handles ftp; normally multiple
+commands are performed in a "ftp session", and he seems to feel that the
+uid/password should only be retained over one ftp session. However, netrw
+does every ftp operation in a separate "ftp session"; so remembering the
+uid/password for just one "ftp session" would be the same as not remembering
+the uid/password at all. IMHO this would rapidly grow tiresome as one
+browsed remote directories, for example.
+
+On the other hand, thanks go to Jan M. for pointing out the many
+vulnerabilities that netrw (and vim itself) had had in handling "crafted"
+filenames. The |shellescape()| and |fnameescape()| functions were written in
+response by Bram Moolenaar to handle these sort of problems, and netrw has
+been modified to use them. Still, my advice is, if the "filename" looks like
+a vim command that you aren't comfortable with having executed, don't open it.
+
+ *netrw-putty* *netrw-pscp* *netrw-psftp*
+One may modify any protocol's implementing external application by setting a
+variable (ex. scp uses the variable g:netrw_scp_cmd, which is defaulted to
+"scp -q"). As an example, consider using PuTTY: >
+
+ let g:netrw_scp_cmd = '"c:\Program Files\PuTTY\pscp.exe" -q -batch'
+ 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)
+
+See |netrw-p8| for more about putty, pscp, psftp, etc.
+
+Ftp, an old protocol, seems to be blessed by numerous implementations.
+Unfortunately, some implementations are noisy (ie., add junk to the end of the
+file). Thus, concerned users may decide to write a NetReadFixup() function
+that will clean up after reading with their ftp. Some Unix systems (ie.,
+FreeBSD) provide a utility called "fetch" which uses the ftp protocol but is
+not noisy and more convenient, actually, for <netrw.vim> to use.
+Consequently, if "fetch" is available (ie. executable), it may be preferable
+to use it for ftp://... based transfers.
+
+For rcp, scp, sftp, and http, one may use network-oriented file transfers
+transparently; ie.
+>
+ vim rcp://[user@]machine/path
+ vim scp://[user@]machine/path
+<
+If your ftp supports <.netrc>, then it too can be transparently used
+if the needed triad of machine name, user id, and password are present in
+that file. Your ftp must be able to use the <.netrc> file on its own, however.
+>
+ vim ftp://[user@]machine[[:#]portnumber]/path
+<
+Windows provides an ftp (typically c:\Windows\System32\ftp.exe) which uses
+an option, -s:filename (filename can and probably should be a full path)
+which contains ftp commands which will be automatically run whenever ftp
+starts. You may use this feature to enter a user and password for one site: >
+ userid
+ password
+< *netrw-windows-netrc* *netrw-windows-s*
+If |g:netrw_ftp_cmd| contains -s:[path/]MACHINE, then (on Windows machines
+only) netrw will substitute the current machine name requested for ftp
+connections for MACHINE. Hence one can have multiple machine.ftp files
+containing login and password for ftp. Example: >
+
+ let g:netrw_ftp_cmd= 'c:\Windows\System32\ftp -s:C:\Users\Myself\MACHINE'
+ vim ftp://myhost.somewhere.net/
+
+will use a file >
+
+ C:\Users\Myself\myhost.ftp
+<
+Often, ftp will need to query the user for the userid and password.
+The latter will be done "silently"; ie. asterisks will show up instead of
+the actually-typed-in password. Netrw will retain the userid and password
+for subsequent read/writes from the most recent transfer so subsequent
+transfers (read/write) to or from that machine will take place without
+additional prompting.
+
+ *netrw-urls*
+ +=================================+============================+============+
+ | Reading | Writing | Uses |
+ +=================================+============================+============+
+ | DAV: | | |
+ | dav://host/path | | cadaver |
+ | :Nread dav://host/path | :Nwrite dav://host/path | cadaver |
+ +---------------------------------+----------------------------+------------+
+ | DAV + SSL: | | |
+ | davs://host/path | | cadaver |
+ | :Nread davs://host/path | :Nwrite davs://host/path | cadaver |
+ +---------------------------------+----------------------------+------------+
+ | FETCH: | | |
+ | fetch://[user@]host/path | | |
+ | fetch://[user@]host:http/path | Not Available | fetch |
+ | :Nread fetch://[user@]host/path| | |
+ +---------------------------------+----------------------------+------------+
+ | FILE: | | |
+ | file:///* | file:///* | |
+ | file://localhost/* | file://localhost/* | |
+ +---------------------------------+----------------------------+------------+
+ | FTP: (*3) | (*3) | |
+ | ftp://[user@]host/path | ftp://[user@]host/path | ftp (*2) |
+ | :Nread ftp://host/path | :Nwrite ftp://host/path | ftp+.netrc |
+ | :Nread host path | :Nwrite host path | ftp+.netrc |
+ | :Nread host uid pass path | :Nwrite host uid pass path | ftp |
+ +---------------------------------+----------------------------+------------+
+ | HTTP: wget is executable: (*4) | | |
+ | http://[user@]host/path | Not Available | wget |
+ +---------------------------------+----------------------------+------------+
+ | HTTP: fetch is executable (*4) | | |
+ | http://[user@]host/path | Not Available | fetch |
+ +---------------------------------+----------------------------+------------+
+ | RCP: | | |
+ | rcp://[user@]host/path | rcp://[user@]host/path | rcp |
+ +---------------------------------+----------------------------+------------+
+ | RSYNC: | | |
+ | rsync://[user@]host/path | rsync://[user@]host/path | rsync |
+ | :Nread rsync://host/path | :Nwrite rsync://host/path | rsync |
+ | :Nread rcp://host/path | :Nwrite rcp://host/path | rcp |
+ +---------------------------------+----------------------------+------------+
+ | SCP: | | |
+ | scp://[user@]host/path | scp://[user@]host/path | scp |
+ | :Nread scp://host/path | :Nwrite scp://host/path | scp (*1) |
+ +---------------------------------+----------------------------+------------+
+ | SFTP: | | |
+ | sftp://[user@]host/path | sftp://[user@]host/path | sftp |
+ | :Nread sftp://host/path | :Nwrite sftp://host/path | sftp (*1) |
+ +=================================+============================+============+
+
+ (*1) For an absolute path use scp://machine//path.
+
+ (*2) if <.netrc> is present, it is assumed that it will
+ work with your ftp client. Otherwise the script will
+ prompt for user-id and password.
+
+ (*3) for ftp, "machine" may be machine#port or machine:port
+ if a different port is needed than the standard ftp port
+
+ (*4) for http:..., if wget is available it will be used. Otherwise,
+ if fetch is available it will be used.
+
+Both the :Nread and the :Nwrite ex-commands can accept multiple filenames.
+
+
+NETRC *netrw-netrc*
+
+The <.netrc> file, typically located in your home directory, contains lines
+therein which map a hostname (machine name) to the user id and password you
+prefer to use with it.
+
+The typical syntax for lines in a <.netrc> file is given as shown below.
+Ftp under Unix usually supports <.netrc>; ftp under Windows usually doesn't.
+>
+ machine {full machine name} login {user-id} password "{password}"
+ default login {user-id} password "{password}"
+
+Your ftp client must handle the use of <.netrc> on its own, but if the
+<.netrc> file exists, an ftp transfer will not ask for the user-id or
+password.
+
+ Note:
+ Since this file contains passwords, make very sure nobody else can
+ read this file! Most programs will refuse to use a .netrc that is
+ readable for others. Don't forget that the system administrator can
+ still read the file! Ie. for Linux/Unix: chmod 600 .netrc
+
+Even though Windows' ftp clients typically do not support .netrc, netrw has
+a work-around: see |netrw-windows-s|.
+
+
+PASSWORD *netrw-passwd*
+
+The script attempts to get passwords for ftp invisibly using |inputsecret()|,
+a built-in Vim function. See |netrw-userpass| for how to change the password
+after one has set it.
+
+Unfortunately there doesn't appear to be a way for netrw to feed a password to
+scp. Thus every transfer via scp will require re-entry of the password.
+However, |netrw-ssh-hack| can help with this problem.
+
+
+==============================================================================
+5. Activation *netrw-activate* {{{1
+
+Network-oriented file transfers are available by default whenever Vim's
+|'nocompatible'| mode is enabled. Netrw's script files reside in your
+system's plugin, autoload, and syntax directories; just the
+plugin/netrwPlugin.vim script is sourced automatically whenever you bring up
+vim. The main script in autoload/netrw.vim is only loaded when you actually
+use netrw. I suggest that, at a minimum, you have at least the following in
+your <.vimrc> customization file: >
+
+ set nocp
+ if version >= 600
+ filetype plugin indent on
+ endif
+<
+By also including the following lines in your .vimrc, one may have netrw
+immediately activate when using [g]vim without any filenames, showing the
+current directory: >
+
+ " Augroup VimStartup:
+ augroup VimStartup
+ au!
+ au VimEnter * if expand("%") == "" | e . | endif
+ augroup END
+<
+
+==============================================================================
+6. Transparent Remote File Editing *netrw-transparent* {{{1
+
+Transparent file transfers occur whenever a regular file read or write
+(invoked via an |:autocmd| for |BufReadCmd|, |BufWriteCmd|, or |SourceCmd|
+events) is made. Thus one may read, write, or source files across networks
+just as easily as if they were local files! >
+
+ vim ftp://[user@]machine/path
+ ...
+ :wq
+
+See |netrw-activate| for more on how to encourage your vim to use plugins
+such as netrw.
+
+For password-free use of scp:, see |netrw-ssh-hack|.
+
+
+==============================================================================
+7. Ex Commands *netrw-ex* {{{1
+
+The usual read/write commands are supported. There are also a few
+additional commands available. Often you won't need to use Nwrite or
+Nread as shown in |netrw-transparent| (ie. simply use >
+ :e URL
+ :r URL
+ :w URL
+instead, as appropriate) -- see |netrw-urls|. In the explanations
+below, a {netfile} is a URL to a remote file.
+
+ *:Nwrite* *:Nw*
+:[range]Nw[rite] Write the specified lines to the current
+ file as specified in b:netrw_lastfile.
+ (related: |netrw-nwrite|)
+
+:[range]Nw[rite] {netfile} [{netfile}]...
+ Write the specified lines to the {netfile}.
+
+ *:Nread* *:Nr*
+:Nr[ead] Read the lines from the file specified in b:netrw_lastfile
+ into the current buffer. (related: |netrw-nread|)
+
+:Nr[ead] {netfile} {netfile}...
+ Read the {netfile} after the current line.
+
+ *:Nsource* *:Ns*
+:Ns[ource] {netfile}
+ Source the {netfile}.
+ To start up vim using a remote .vimrc, one may use
+ the following (all on one line) (tnx to Antoine Mechelynck) >
+ vim -u NORC -N
+ --cmd "runtime plugin/netrwPlugin.vim"
+ --cmd "source scp://HOSTNAME/.vimrc"
+< (related: |netrw-source|)
+
+:call NetUserPass() *NetUserPass()*
+ If g:netrw_uid and s:netrw_passwd don't exist,
+ this function will query the user for them.
+ (related: |netrw-userpass|)
+
+:call NetUserPass("userid")
+ This call will set the g:netrw_uid and, if
+ the password doesn't exist, will query the user for it.
+ (related: |netrw-userpass|)
+
+:call NetUserPass("userid","passwd")
+ This call will set both the g:netrw_uid and s:netrw_passwd.
+ The user-id and password are used by ftp transfers. One may
+ effectively remove the user-id and password by using empty
+ strings (ie. "").
+ (related: |netrw-userpass|)
+
+:NetrwSettings This command is described in |netrw-settings| -- used to
+ display netrw settings and change netrw behavior.
+
+
+==============================================================================
+8. Variables and Options *netrw-var* *netrw-settings* {{{1
+
+(also see: |netrw-options| |netrw-variables| |netrw-protocol|
+ |netrw-browser-settings| |netrw-browser-options| )
+
+The <netrw.vim> script provides several variables which act as options to
+affect <netrw.vim>'s file transfer behavior. These variables typically may be
+set in the user's <.vimrc> file: (see also |netrw-settings| |netrw-protocol|)
+ *netrw-options*
+>
+ -------------
+ Netrw Options
+ -------------
+ Option Meaning
+ -------------- -----------------------------------------------
+<
+ b:netrw_col Holds current cursor position (during NetWrite)
+ g:netrw_cygwin =1 assume scp under windows is from cygwin
+ (default/windows)
+ =0 assume scp under windows accepts windows
+ style paths (default/else)
+ g:netrw_ftp =0 use default ftp (uid password)
+ g:netrw_ftpmode ="binary" (default)
+ ="ascii" (your choice)
+ g:netrw_ignorenetrc =1 (default)
+ if you have a <.netrc> file but you don't
+ want it used, then set this variable. Its
+ mere existence is enough to cause <.netrc>
+ to be ignored.
+ b:netrw_lastfile Holds latest method/machine/path.
+ b:netrw_line Holds current line number (during NetWrite)
+ g:netrw_silent =0 transfers done normally
+ =1 transfers done silently
+ g:netrw_uid Holds current user-id for ftp.
+ g:netrw_use_nt_rcp =0 don't use WinNT/2K/XP's rcp (default)
+ =1 use WinNT/2K/XP's rcp, binary mode
+ g:netrw_win95ftp =0 use unix-style ftp even if win95/98/ME/etc
+ =1 use default method to do ftp >
+ -----------------------------------------------------------------------
+<
+ *netrw-internal-variables*
+The script will also make use of the following variables internally, albeit
+temporarily.
+>
+ -------------------
+ Temporary Variables
+ -------------------
+ Variable Meaning
+ -------- ------------------------------------
+<
+ b:netrw_method Index indicating rcp/ftp+.netrc/ftp
+ w:netrw_method (same as b:netrw_method)
+ g:netrw_machine Holds machine name parsed from input
+ b:netrw_fname Holds filename being accessed >
+ ------------------------------------------------------------
+<
+ *netrw-protocol*
+
+Netrw supports a number of protocols. These protocols are invoked using the
+variables listed below, and may be modified by the user.
+>
+ ------------------------
+ Protocol Control Options
+ ------------------------
+ Option Type Setting Meaning
+ --------- -------- -------------- ---------------------------
+< netrw_ftp variable =doesn't exist userid set by "user userid"
+ =0 userid set by "user userid"
+ =1 userid set by "userid"
+ NetReadFixup function =doesn't exist no change
+ =exists Allows user to have files
+ read via ftp automatically
+ transformed however they wish
+ by NetReadFixup()
+ g:netrw_dav_cmd var ="cadaver" if cadaver is executable
+ g:netrw_dav_cmd var ="curl -o" elseif curl is executable
+ g:netrw_fetch_cmd var ="fetch -o" if fetch is available
+ g:netrw_ftp_cmd var ="ftp"
+ g:netrw_http_cmd var ="fetch -o" if fetch is available
+ g:netrw_http_cmd var ="wget -O" else if wget is available
+ g:netrw_http_put_cmd var ="curl -T"
+ |g:netrw_list_cmd| var ="ssh USEPORT HOSTNAME ls -Fa"
+ g:netrw_rcp_cmd var ="rcp"
+ g:netrw_rsync_cmd var ="rsync"
+ *g:netrw_rsync_sep* var ="/" used to separate the hostname
+ from the file spec
+ g:netrw_scp_cmd var ="scp -q"
+ g:netrw_sftp_cmd var ="sftp" >
+ -------------------------------------------------------------------------
+<
+ *netrw-ftp*
+
+The g:netrw_..._cmd options (|g:netrw_ftp_cmd| and |g:netrw_sftp_cmd|)
+specify the external program to use handle the ftp protocol. They may
+include command line options (such as -p for passive mode). Example: >
+
+ let g:netrw_ftp_cmd= "ftp -p"
+<
+Browsing is supported by using the |g:netrw_list_cmd|; the substring
+"HOSTNAME" will be changed via substitution with whatever the current request
+is for a hostname.
+
+Two options (|g:netrw_ftp| and |netrw-fixup|) both help with certain ftp's
+that give trouble . In order to best understand how to use these options if
+ftp is giving you troubles, a bit of discussion is provided on how netrw does
+ftp reads.
+
+For ftp, netrw typically builds up lines of one of the following formats in a
+temporary file:
+>
+ IF g:netrw_ftp !exists or is not 1 IF g:netrw_ftp exists and is 1
+ ---------------------------------- ------------------------------
+<
+ open machine [port] open machine [port]
+ user userid password userid password
+ [g:netrw_ftpmode] password
+ [g:netrw_ftpextracmd] [g:netrw_ftpmode]
+ get filename tempfile [g:netrw_extracmd]
+ get filename tempfile >
+ ---------------------------------------------------------------------
+<
+The |g:netrw_ftpmode| and |g:netrw_ftpextracmd| are optional.
+
+Netrw then executes the lines above by use of a filter:
+>
+ :%! {g:netrw_ftp_cmd} -i [-n]
+<
+where
+ g:netrw_ftp_cmd is usually "ftp",
+ -i tells ftp not to be interactive
+ -n means don't use netrc and is used for Method #3 (ftp w/o <.netrc>)
+
+If <.netrc> exists it will be used to avoid having to query the user for
+userid and password. The transferred file is put into a temporary file.
+The temporary file is then read into the main editing session window that
+requested it and the temporary file deleted.
+
+If your ftp doesn't accept the "user" command and immediately just demands a
+userid, then try putting "let netrw_ftp=1" in your <.vimrc>.
+
+ *netrw-cadaver*
+To handle the SSL certificate dialog for untrusted servers, one may pull
+down the certificate and place it into /usr/ssl/cert.pem. This operation
+renders the server treatment as "trusted".
+
+ *netrw-fixup* *netreadfixup*
+If your ftp for whatever reason generates unwanted lines (such as AUTH
+messages) you may write a NetReadFixup() function:
+>
+ function! NetReadFixup(method,line1,line2)
+ " a:line1: first new line in current file
+ " a:line2: last new line in current file
+ if a:method == 1 "rcp
+ elseif a:method == 2 "ftp + <.netrc>
+ elseif a:method == 3 "ftp + machine,uid,password,filename
+ elseif a:method == 4 "scp
+ elseif a:method == 5 "http/wget
+ elseif a:method == 6 "dav/cadaver
+ elseif a:method == 7 "rsync
+ elseif a:method == 8 "fetch
+ elseif a:method == 9 "sftp
+ else " complain
+ endif
+ endfunction
+>
+The NetReadFixup() function will be called if it exists and thus allows you to
+customize your reading process. As a further example, <netrw.vim> contains
+just such a function to handle Windows 95 ftp. For whatever reason, Windows
+95's ftp dumps four blank lines at the end of a transfer, and so it is
+desirable to automate their removal. Here's some code taken from <netrw.vim>
+itself:
+>
+ if has("win95") && g:netrw_win95ftp
+ fun! NetReadFixup(method, line1, line2)
+ if method == 3 " ftp (no <.netrc>)
+ let fourblanklines= line2 - 3
+ silent fourblanklines .. "," .. line2 .. "g/^\s*/d"
+ endif
+ endfunction
+ endif
+>
+(Related topics: |ftp| |netrw-userpass| |netrw-start|)
+
+==============================================================================
+9. Browsing *netrw-browsing* *netrw-browse* *netrw-help* {{{1
+ *netrw-browser* *netrw-dir* *netrw-list*
+
+INTRODUCTION TO BROWSING *netrw-intro-browse* {{{2
+ (Quick References: |netrw-quickmaps| |netrw-quickcoms|)
+
+Netrw supports the browsing of directories on your local system and on remote
+hosts; browsing includes listing files and directories, entering directories,
+editing files therein, deleting files/directories, making new directories,
+moving (renaming) files and directories, copying files and directories, etc.
+One may mark files and execute any system command on them! The Netrw browser
+generally implements the previous explorer's maps and commands for remote
+directories, although details (such as pertinent global variable names)
+necessarily differ. To browse a directory, simply "edit" it! >
+
+ vim /your/directory/
+ vim .
+ vim c:\your\directory\
+<
+(Related topics: |netrw-cr| |netrw-o| |netrw-p| |netrw-P| |netrw-t|
+ |netrw-mf| |netrw-mx| |netrw-D| |netrw-R| |netrw-v| )
+
+The Netrw remote file and directory browser handles two protocols: ssh and
+ftp. The protocol in the url, if it is ftp, will cause netrw also to use ftp
+in its remote browsing. Specifying any other protocol will cause it to be
+used for file transfers; but the ssh protocol will be used to do remote
+browsing.
+
+To use Netrw's remote directory browser, simply attempt to read a "file" with
+a trailing slash and it will be interpreted as a request to list a directory:
+>
+ vim [protocol]://[user@]hostname/path/
+<
+where [protocol] is typically scp or ftp. As an example, try: >
+
+ vim ftp://ftp.home.vim.org/pub/vim/
+<
+For local directories, the trailing slash is not required. Again, because it's
+easy to miss: to browse remote directories, the URL must terminate with a
+slash!
+
+If you'd like to avoid entering the password repeatedly for remote directory
+listings with ssh or scp, see |netrw-ssh-hack|. To avoid password entry with
+ftp, see |netrw-netrc| (if your ftp supports it).
+
+There are several things you can do to affect the browser's display of files:
+
+ * To change the listing style, press the "i" key (|netrw-i|).
+ Currently there are four styles: thin, long, wide, and tree.
+ To make that change "permanent", see |g:netrw_liststyle|.
+
+ * To hide files (don't want to see those xyz~ files anymore?) see
+ |netrw-ctrl-h|.
+
+ * Press s to sort files by name, time, or size.
+
+See |netrw-browse-cmds| for all the things you can do with netrw!
+
+ *netrw-getftype* *netrw-filigree* *netrw-ftype*
+The |getftype()| function is used to append a bit of filigree to indicate
+filetype to locally listed files:
+
+ directory : /
+ executable : *
+ fifo : |
+ links : @
+ sockets : =
+
+The filigree also affects the |g:netrw_sort_sequence|.
+
+
+QUICK HELP *netrw-quickhelp* {{{2
+ (Use ctrl-] to select a topic)~
+ Intro to Browsing...............................|netrw-intro-browse|
+ Quick Reference: Maps.........................|netrw-quickmap|
+ Quick Reference: Commands.....................|netrw-browse-cmds|
+ Hiding
+ Edit hiding list..............................|netrw-ctrl-h|
+ Hiding Files or Directories...................|netrw-a|
+ Hiding/Unhiding by suffix.....................|netrw-mh|
+ Hiding dot-files.............................|netrw-gh|
+ Listing Style
+ Select listing style (thin/long/wide/tree)....|netrw-i|
+ Associated setting variable...................|g:netrw_liststyle|
+ Shell command used to perform listing.........|g:netrw_list_cmd|
+ Quick file info...............................|netrw-qf|
+ Sorted by
+ Select sorting style (name/time/size).........|netrw-s|
+ Editing the sorting sequence..................|netrw-S|
+ Sorting options...............................|g:netrw_sort_options|
+ Associated setting variable...................|g:netrw_sort_sequence|
+ Reverse sorting order.........................|netrw-r|
+
+
+ *netrw-quickmap* *netrw-quickmaps*
+QUICK REFERENCE: MAPS *netrw-browse-maps* {{{2
+>
+ --- ----------------- ----
+ Map Quick Explanation Link
+ --- ----------------- ----
+< <F1> Causes Netrw to issue help
+ <cr> Netrw will enter the directory or read the file |netrw-cr|
+ <del> Netrw will attempt to remove the file/directory |netrw-del|
+ <c-h> Edit file hiding list |netrw-ctrl-h|
+ <c-l> Causes Netrw to refresh the directory listing |netrw-ctrl-l|
+ <c-r> Browse using a gvim server |netrw-ctrl-r|
+ <c-tab> Shrink/expand a netrw/explore window |netrw-c-tab|
+ - Makes Netrw go up one directory |netrw--|
+ a Cycles between normal display, |netrw-a|
+ hiding (suppress display of files matching g:netrw_list_hide)
+ and showing (display only files which match g:netrw_list_hide)
+ cd Make browsing directory the current directory |netrw-cd|
+ C Setting the editing window |netrw-C|
+ d Make a directory |netrw-d|
+ D Attempt to remove the file(s)/directory(ies) |netrw-D|
+ gb Go to previous bookmarked directory |netrw-gb|
+ gd Force treatment as directory |netrw-gd|
+ gf Force treatment as file |netrw-gf|
+ gh Quick hide/unhide of dot-files |netrw-gh|
+ gn Make top of tree the directory below the cursor |netrw-gn|
+ gp Change local-only file permissions |netrw-gp|
+ i Cycle between thin, long, wide, and tree listings |netrw-i|
+ I Toggle the displaying of the banner |netrw-I|
+ mb Bookmark current directory |netrw-mb|
+ mc Copy marked files to marked-file target directory |netrw-mc|
+ md Apply diff to marked files (up to 3) |netrw-md|
+ me Place marked files on arg list and edit them |netrw-me|
+ mf Mark a file |netrw-mf|
+ mF Unmark files |netrw-mF|
+ mg Apply vimgrep to marked files |netrw-mg|
+ mh Toggle marked file suffices' presence on hiding list |netrw-mh|
+ mm Move marked files to marked-file target directory |netrw-mm|
+ mp Print marked files |netrw-mp|
+ mr Mark files using a shell-style |regexp| |netrw-mr|
+ mt Current browsing directory becomes markfile target |netrw-mt|
+ mT Apply ctags to marked files |netrw-mT|
+ mu Unmark all marked files |netrw-mu|
+ mv Apply arbitrary vim command to marked files |netrw-mv|
+ mx Apply arbitrary shell command to marked files |netrw-mx|
+ mX Apply arbitrary shell command to marked files en bloc|netrw-mX|
+ mz Compress/decompress marked files |netrw-mz|
+ o Enter the file/directory under the cursor in a new |netrw-o|
+ browser window. A horizontal split is used.
+ O Obtain a file specified by cursor |netrw-O|
+ p Preview the file |netrw-p|
+ P Browse in the previously used window |netrw-P|
+ qb List bookmarked directories and history |netrw-qb|
+ qf Display information on file |netrw-qf|
+ qF Mark files using a quickfix list |netrw-qF|
+ qL Mark files using a |location-list| |netrw-qL|
+ r Reverse sorting order |netrw-r|
+ R Rename the designated file(s)/directory(ies) |netrw-R|
+ s Select sorting style: by name, time, or file size |netrw-s|
+ S Specify suffix priority for name-sorting |netrw-S|
+ t Enter the file/directory under the cursor in a new tab|netrw-t|
+ u Change to recently-visited directory |netrw-u|
+ U Change to subsequently-visited directory |netrw-U|
+ v Enter the file/directory under the cursor in a new |netrw-v|
+ browser window. A vertical split is used.
+ x View file with an associated program |netrw-x|
+ X Execute filename under cursor via |system()| |netrw-X|
+
+ % Open a new file in netrw's current directory |netrw-%|
+
+ *netrw-mouse* *netrw-leftmouse* *netrw-middlemouse* *netrw-rightmouse*
+ <leftmouse> (gvim only) selects word under mouse as if a <cr>
+ had been pressed (ie. edit file, change directory)
+ <middlemouse> (gvim only) same as P selecting word under mouse;
+ see |netrw-P|
+ <rightmouse> (gvim only) delete file/directory using word under
+ mouse
+ <2-leftmouse> (gvim only) when:
+ * in a netrw-selected file, AND
+ * |g:netrw_retmap| == 1 AND
+ * the user doesn't already have a <2-leftmouse>
+ mapping defined before netrw is autoloaded,
+ then a double clicked leftmouse button will return
+ to the netrw browser window. See |g:netrw_retmap|.
+ <s-leftmouse> (gvim only) like mf, will mark files. Dragging
+ the shifted leftmouse will mark multiple files.
+ (see |netrw-mf|)
+
+ (to disable mouse buttons while browsing: |g:netrw_mousemaps|)
+
+ *netrw-quickcom* *netrw-quickcoms*
+QUICK REFERENCE: COMMANDS *netrw-explore-cmds* *netrw-browse-cmds* {{{2
+ :NetrwClean[!]............................................|netrw-clean|
+ :NetrwSettings............................................|netrw-settings|
+ :Ntree....................................................|netrw-ntree|
+ :Explore[!] [dir] Explore directory of current file......|netrw-explore|
+ :Hexplore[!] [dir] Horizontal Split & Explore.............|netrw-explore|
+ :Lexplore[!] [dir] Left Explorer Toggle...................|netrw-explore|
+ :Nexplore[!] [dir] Vertical Split & Explore...............|netrw-explore|
+ :Pexplore[!] [dir] Vertical Split & Explore...............|netrw-explore|
+ :Rexplore Return to Explorer.....................|netrw-explore|
+ :Sexplore[!] [dir] Split & Explore directory .............|netrw-explore|
+ :Texplore[!] [dir] Tab & Explore..........................|netrw-explore|
+ :Vexplore[!] [dir] Vertical Split & Explore...............|netrw-explore|
+
+
+BANNER DISPLAY *netrw-I*
+
+One may toggle the displaying of the banner by pressing "I".
+
+Also See: |g:netrw_banner|
+
+
+BOOKMARKING A DIRECTORY *netrw-mb* *netrw-bookmark* *netrw-bookmarks* {{{2
+
+One may easily "bookmark" the currently browsed directory by using >
+
+ mb
+<
+ *.netrwbook*
+Bookmarks are retained in between sessions of vim in a file called .netrwbook
+as a |List|, which is typically stored in the first directory on the user's
+'runtimepath'; entries are kept in sorted order.
+
+If there are marked files and/or directories, mb will add them to the bookmark
+list.
+
+ *netrw-:NetrwMB*
+Additionally, one may use :NetrwMB to bookmark files or directories. >
+
+ :NetrwMB[!] [files/directories]
+
+< No bang: enters files/directories into Netrw's bookmark system
+
+ No argument and in netrw buffer:
+ if there are marked files : bookmark marked files
+ otherwise : bookmark file/directory under cursor
+ No argument and not in netrw buffer: bookmarks current open file
+ Has arguments : |glob()|s each arg and bookmarks them
+
+ With bang: deletes files/directories from Netrw's bookmark system
+
+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'|.
+
+Related Topics:
+ |netrw-gb| how to return (go) to a bookmark
+ |netrw-mB| how to delete bookmarks
+ |netrw-qb| how to list bookmarks
+ |g:netrw_home| controls where .netrwbook is kept
+
+
+BROWSING *netrw-enter* *netrw-cr* {{{2
+
+Browsing is simple: move the cursor onto a file or directory of interest.
+Hitting the <cr> (the return key) will select the file or directory.
+Directories will themselves be listed, and files will be opened using the
+protocol given in the original read request.
+
+ CAVEAT: There are four forms of listing (see |netrw-i|). Netrw assumes that
+ two or more spaces delimit filenames and directory names for the long and
+ wide listing formats. Thus, if your filename or directory name has two or
+ more sequential spaces embedded in it, or any trailing spaces, then you'll
+ need to use the "thin" format to select it.
+
+The |g:netrw_browse_split| option, which is zero by default, may be used to
+cause the opening of files to be done in a new window or tab instead of the
+default. When the option is one or two, the splitting will be taken
+horizontally or vertically, respectively. When the option is set to three, a
+<cr> will cause the file to appear in a new tab.
+
+
+When using the gui (gvim), one may select a file by pressing the <leftmouse>
+button. In addition, if
+
+ * |g:netrw_retmap| == 1 AND (its default value is 0)
+ * in a netrw-selected file, AND
+ * the user doesn't already have a <2-leftmouse> mapping defined before
+ netrw is loaded
+
+then a doubly-clicked leftmouse button will return to the netrw browser
+window.
+
+Netrw attempts to speed up browsing, especially for remote browsing where one
+may have to enter passwords, by keeping and re-using previously obtained
+directory listing buffers. The |g:netrw_fastbrowse| variable is used to
+control this behavior; one may have slow browsing (no buffer re-use), medium
+speed browsing (re-use directory buffer listings only for remote directories),
+and fast browsing (re-use directory buffer listings as often as possible).
+The price for such re-use is that when changes are made (such as new files
+are introduced into a directory), the listing may become out-of-date. One may
+always refresh directory listing buffers by pressing ctrl-L (see
+|netrw-ctrl-l|).
+
+ *netrw-s-cr*
+Squeezing the Current Tree-Listing Directory~
+
+When the tree listing style is enabled (see |netrw-i|) and one is using
+gvim, then the <s-cr> mapping may be used to squeeze (close) the
+directory currently containing the cursor.
+
+Otherwise, one may remap a key combination of one's own choice to get
+this effect: >
+
+ nmap <buffer> <silent> <nowait> YOURKEYCOMBO <Plug>NetrwTreeSqueeze
+<
+Put this line in $HOME/ftplugin/netrw/netrw.vim; it needs to be generated
+for netrw buffers only.
+
+Related topics:
+ |netrw-ctrl-r| |netrw-o| |netrw-p|
+ |netrw-P| |netrw-t| |netrw-v|
+Associated setting variables:
+ |g:netrw_browse_split| |g:netrw_fastbrowse|
+ |g:netrw_ftp_list_cmd| |g:netrw_ftp_sizelist_cmd|
+ |g:netrw_ftp_timelist_cmd| |g:netrw_ssh_browse_reject|
+ |g:netrw_ssh_cmd| |g:netrw_use_noswf|
+
+
+BROWSING WITH A HORIZONTALLY SPLIT WINDOW *netrw-o* *netrw-horiz* {{{2
+
+Normally one enters a file or directory using the <cr>. However, the "o" map
+allows one to open a new window to hold the new directory listing or file. A
+horizontal split is used. (for vertical splitting, see |netrw-v|)
+
+Normally, the o key splits the window horizontally with the new window and
+cursor at the top.
+
+Associated setting variables: |g:netrw_alto| |g:netrw_winsize|
+
+Related topics:
+ |netrw-ctrl-r| |netrw-o| |netrw-p|
+ |netrw-P| |netrw-t| |netrw-v|
+Associated setting variables:
+ |g:netrw_alto| control above/below splitting
+ |g:netrw_winsize| control initial sizing
+
+BROWSING WITH A NEW TAB *netrw-t* {{{2
+
+Normally one enters a file or directory using the <cr>. The "t" map
+allows one to open a new window holding the new directory listing or file in
+a new tab.
+
+If you'd like to have the new listing in a background tab, use |gT|.
+
+Related topics:
+ |netrw-ctrl-r| |netrw-o| |netrw-p|
+ |netrw-P| |netrw-t| |netrw-v|
+Associated setting variables:
+ |g:netrw_winsize| control initial sizing
+
+BROWSING WITH A VERTICALLY SPLIT WINDOW *netrw-v* {{{2
+
+Normally one enters a file or directory using the <cr>. However, the "v" map
+allows one to open a new window to hold the new directory listing or file. A
+vertical split is used. (for horizontal splitting, see |netrw-o|)
+
+Normally, the v key splits the window vertically with the new window and
+cursor at the left.
+
+There is only one tree listing buffer; using "v" on a displayed subdirectory
+will split the screen, but the same buffer will be shown twice.
+
+Related topics:
+ |netrw-ctrl-r| |netrw-o| |netrw-p|
+ |netrw-P| |netrw-t| |netrw-v|
+Associated setting variables:
+ |g:netrw_altv| control right/left splitting
+ |g:netrw_winsize| control initial sizing
+
+
+BROWSING USING A GVIM SERVER *netrw-ctrl-r* {{{2
+
+One may keep a browsing gvim separate from the gvim being used to edit.
+Use the <c-r> map on a file (not a directory) in the netrw browser, and it
+will use a gvim server (see |g:netrw_servername|). Subsequent use of <cr>
+(see |netrw-cr|) will re-use that server for editing files.
+
+Related topics:
+ |netrw-ctrl-r| |netrw-o| |netrw-p|
+ |netrw-P| |netrw-t| |netrw-v|
+Associated setting variables:
+ |g:netrw_servername| : sets name of server
+ |g:netrw_browse_split| : controls how <cr> will open files
+
+
+CHANGE LISTING STYLE (THIN LONG WIDE TREE) *netrw-i* {{{2
+
+The "i" map cycles between the thin, long, wide, and tree listing formats.
+
+The thin listing format gives just the files' and directories' names.
+
+The long listing is either based on the "ls" command via ssh for remote
+directories or displays the filename, file size (in bytes), and the time and
+date of last modification for local directories. With the long listing
+format, netrw is not able to recognize filenames which have trailing spaces.
+Use the thin listing format for such files.
+
+The wide listing format uses two or more contiguous spaces to delineate
+filenames; when using that format, netrw won't be able to recognize or use
+filenames which have two or more contiguous spaces embedded in the name or any
+trailing spaces. The thin listing format will, however, work with such files.
+The wide listing format is the most compact.
+
+The tree listing format has a top directory followed by files and directories
+preceded by one or more "|"s, which indicate the directory depth. One may
+open and close directories by pressing the <cr> key while atop the directory
+name.
+
+One may make a preferred listing style your default; see |g:netrw_liststyle|.
+As an example, by putting the following line in your .vimrc, >
+ let g:netrw_liststyle= 3
+the tree style will become your default listing style.
+
+One typical way to use the netrw tree display is to: >
+
+ vim .
+ (use i until a tree display shows)
+ navigate to a file
+ v (edit as desired in vertically split window)
+ ctrl-w h (to return to the netrw listing)
+ P (edit newly selected file in the previous window)
+ ctrl-w h (to return to the netrw listing)
+ P (edit newly selected file in the previous window)
+ ...etc...
+<
+Associated setting variables: |g:netrw_liststyle| |g:netrw_maxfilenamelen|
+ |g:netrw_timefmt| |g:netrw_list_cmd|
+
+CHANGE FILE PERMISSION *netrw-gp* {{{2
+
+"gp" will ask you for a new permission for the file named under the cursor.
+Currently, this only works for local files.
+
+Associated setting variables: |g:netrw_chgperm|
+
+
+CHANGING TO A BOOKMARKED DIRECTORY *netrw-gb* {{{2
+
+To change directory back to a bookmarked directory, use
+
+ {cnt}gb
+
+Any count may be used to reference any of the bookmarks.
+Note that |netrw-qb| shows both bookmarks and history; to go
+to a location stored in the history see |netrw-u| and |netrw-U|.
+
+Related Topics:
+ |netrw-mB| how to delete bookmarks
+ |netrw-mb| how to make a bookmark
+ |netrw-qb| how to list bookmarks
+
+
+CHANGING TO A PREDECESSOR DIRECTORY *netrw-u* *netrw-updir* {{{2
+
+Every time you change to a new directory (new for the current session), netrw
+will save the directory in a recently-visited directory history list (unless
+|g:netrw_dirhistmax| is zero; by default, it holds ten entries). With the "u"
+map, one can change to an earlier directory (predecessor). To do the
+opposite, see |netrw-U|.
+
+The "u" map also accepts counts to go back in the history several slots. For
+your convenience, qb (see |netrw-qb|) lists the history number which may 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
+|'runtimepath'|.
+
+Related Topics:
+ |netrw-U| changing to a successor directory
+ |g:netrw_home| controls where .netrwhist is kept
+
+
+CHANGING TO A SUCCESSOR DIRECTORY *netrw-U* *netrw-downdir* {{{2
+
+With the "U" map, one can change to a later directory (successor).
+This map is the opposite of the "u" map. (see |netrw-u|) Use the
+qb map to list both the bookmarks and history. (see |netrw-qb|)
+
+The "U" map also accepts counts to go forward in the history several slots.
+
+See |g:netrw_dirhistmax| for how to control the quantity of history stack
+slots.
+
+
+CHANGING TREE TOP *netrw-ntree* *:Ntree* *netrw-gn* {{{2
+
+One may specify a new tree top for tree listings using >
+
+ :Ntree [dirname]
+
+Without a "dirname", the current line is used (and any leading depth
+information is elided).
+With a "dirname", the specified directory name is used.
+
+The "gn" map will take the word below the cursor and use that for
+changing the top of the tree listing.
+
+
+NETRW CLEAN *netrw-clean* *:NetrwClean* {{{2
+
+With :NetrwClean one may easily remove netrw from one's home directory;
+more precisely, from the first directory on your |'runtimepath'|.
+
+With :NetrwClean!, netrw will attempt to remove netrw from all directories on
+your |'runtimepath'|. Of course, you have to have write/delete permissions
+correct to do this.
+
+With either form of the command, netrw will first ask for confirmation
+that the removal is in fact what you want to do. If netrw doesn't have
+permission to remove a file, it will issue an error message.
+
+ *netrw-gx*
+CUSTOMIZING BROWSING WITH A SPECIAL HANDLER *netrw-x* *netrw-handler* {{{2
+ (also see |netrw_filehandler|)
+
+Certain files, such as html, gif, jpeg, (word/office) doc, etc, files, are
+best seen with a special handler (ie. a tool provided with your computer's
+operating system). Netrw allows one to invoke such special handlers by: >
+
+ * when Exploring, hit the "x" key
+ * when editing, hit gx with the cursor atop the special filename
+< (latter not available if the |g:netrw_nogx| variable exists)
+
+Netrw determines which special handler by the following method:
+
+ * if |g:netrw_browsex_viewer| exists, then it will be used to attempt to
+ view files. Examples of useful settings (place into your <.vimrc>): >
+
+ :let g:netrw_browsex_viewer= "kfmclient exec"
+< or >
+ :let g:netrw_browsex_viewer= "xdg-open"
+<
+ If g:netrw_browsex_viewer == '-', then netrwFileHandlers#Invoke() will be
+ used instead (see |netrw_filehandler|).
+
+ If the viewer you wish to use does not support handling of a remote URL
+ directory, set |g:netrw_browsex_support_remote| to 0.
+ * for Windows 32 or 64, the URL and FileProtocolHandler dlls are used.
+ * for Gnome (with gnome-open): gnome-open is used.
+ * for KDE (with kfmclient) : kfmclient is used
+ * for Mac OS X : open is used.
+ * otherwise the netrwFileHandler plugin is used.
+
+The file's suffix is used by these various approaches to determine an
+appropriate application to use to "handle" these files. Such things as
+OpenOffice (*.sfx), visualization (*.jpg, *.gif, etc), and PostScript (*.ps,
+*.eps) can be handled.
+
+The gx mapping extends to all buffers; apply "gx" while atop a word and netrw
+will apply a special handler to it (like "x" works when in a netrw buffer).
+One may also use visual mode (see |visual-start|) to select the text that the
+special handler will use. Normally gx uses expand("<cfile>") to pick up the
+text under the cursor; one may change what |expand()| uses via the
+|g:netrw_gx| variable (options include "<cword>", "<cWORD>"). Note that
+expand("<cfile>") depends on the |'isfname'| setting. Alternatively, one may
+select the text to be used by gx by making a visual selection (see
+|visual-block|) and then pressing gx.
+
+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*
+
+When |g:netrw_browsex_viewer| exists and is "-", then netrw will attempt to
+handle the special file with a vim function. The "x" map applies a function
+to a file, based on its extension. Of course, the handler function must exist
+for it to be called!
+>
+ Ex. mypgm.html x -> NFH_html("scp://user@host/some/path/mypgm.html")
+
+< Users may write their own netrw File Handler functions to
+ support more suffixes with special handling. See
+ <autoload/netrwFileHandlers.vim> for examples on how to make
+ file handler functions. As an example: >
+
+ " NFH_suffix(filename)
+ fun! NFH_suffix(filename)
+ ..do something special with filename..
+ endfun
+<
+These functions need to be defined in some file in your .vim/plugin
+(vimfiles\plugin) directory. Vim's function names may not have punctuation
+characters (except for the underscore) in them. To support suffices that
+contain such characters, netrw will first convert the suffix using the
+following table: >
+
+ @ -> AT ! -> EXCLAMATION % -> PERCENT
+ : -> COLON = -> EQUAL ? -> QUESTION
+ , -> COMMA - -> MINUS ; -> SEMICOLON
+ $ -> DOLLAR + -> PLUS ~ -> TILDE
+<
+So, for example: >
+
+ file.rcs,v -> NFH_rcsCOMMAv()
+<
+If more such translations are necessary, please send me email: >
+ NcampObell@SdrPchip.AorgM-NOSPAM
+with a request. (remove the embedded NOSPAM first)
+
+Associated setting variable: |g:netrw_browsex_viewer|
+
+ *netrw-curdir*
+DELETING BOOKMARKS *netrw-mB* {{{2
+
+To delete a bookmark, use >
+
+ {cnt}mB
+
+If there are marked files, then mB will remove them from the
+bookmark list.
+
+Alternatively, one may use :NetrwMB! (see |netrw-:NetrwMB|). >
+
+ :NetrwMB! [files/directories]
+
+Related Topics:
+ |netrw-gb| how to return (go) to a bookmark
+ |netrw-mb| how to make a bookmark
+ |netrw-qb| how to list bookmarks
+
+
+DELETING FILES OR DIRECTORIES *netrw-delete* *netrw-D* *netrw-del* {{{2
+
+If files have not been marked with |netrw-mf|: (local marked file list)
+
+ Deleting/removing files and directories involves moving the cursor to the
+ file/directory to be deleted and pressing "D". Directories must be empty
+ first before they can be successfully removed. If the directory is a
+ softlink to a directory, then netrw will make two requests to remove the
+ directory before succeeding. Netrw will ask for confirmation before doing
+ the removal(s). You may select a range of lines with the "V" command
+ (visual selection), and then pressing "D".
+
+If files have been marked with |netrw-mf|: (local marked file list)
+
+ Marked files (and empty directories) will be deleted; again, you'll be
+ asked to confirm the deletion before it actually takes place.
+
+A further approach is to delete files which match a pattern.
+
+ * use :MF pattern (see |netrw-:MF|); then press "D".
+
+ * use mr (see |netrw-mr|) which will prompt you for pattern.
+ This will cause the matching files to be marked. Then,
+ press "D".
+
+If your vim has 7.4 with patch#1107, then |g:netrw_localrmdir| no longer
+is used to remove directories; instead, vim's |delete()| is used with
+the "d" option. Please note that only empty directories may be deleted
+with the "D" mapping. Regular files are deleted with |delete()|, too.
+
+The |g:netrw_rm_cmd|, |g:netrw_rmf_cmd|, and |g:netrw_rmdir_cmd| variables are
+used to control the attempts to remove remote files and directories. The
+g:netrw_rm_cmd is used with files, and its default value is:
+
+ g:netrw_rm_cmd: ssh HOSTNAME rm
+
+The g:netrw_rmdir_cmd variable is used to support the removal of directories.
+Its default value is:
+
+ |g:netrw_rmdir_cmd|: ssh HOSTNAME rmdir
+
+If removing a directory fails with g:netrw_rmdir_cmd, netrw then will attempt
+to remove it again using the g:netrw_rmf_cmd variable. Its default value is:
+
+ |g:netrw_rmf_cmd|: ssh HOSTNAME rm -f
+
+Related topics: |netrw-d|
+Associated setting variable: |g:netrw_localrmdir| |g:netrw_rm_cmd|
+ |g:netrw_rmdir_cmd| |g:netrw_ssh_cmd|
+
+
+*netrw-explore* *netrw-hexplore* *netrw-nexplore* *netrw-pexplore*
+*netrw-rexplore* *netrw-sexplore* *netrw-texplore* *netrw-vexplore* *netrw-lexplore*
+DIRECTORY EXPLORATION COMMANDS {{{2
+
+ :[N]Explore[!] [dir]... Explore directory of current file *:Explore*
+ :[N]Hexplore[!] [dir]... Horizontal Split & Explore *:Hexplore*
+ :[N]Lexplore[!] [dir]... Left Explorer Toggle *:Lexplore*
+ :[N]Sexplore[!] [dir]... Split&Explore current file's directory *:Sexplore*
+ :[N]Vexplore[!] [dir]... Vertical Split & Explore *:Vexplore*
+ :Texplore [dir]... Tab & Explore *:Texplore*
+ :Rexplore ... Return to/from Explorer *:Rexplore*
+
+ Used with :Explore **/pattern : (also see |netrw-starstar|)
+ :Nexplore............. go to next matching file *:Nexplore*
+ :Pexplore............. go to previous matching file *:Pexplore*
+
+ *netrw-:Explore*
+:Explore will open the local-directory browser on the current file's
+ directory (or on directory [dir] if specified). The window will be
+ split only if the file has been modified and |'hidden'| is not set,
+ otherwise the browsing window will take over that window. Normally
+ the splitting is taken horizontally.
+ Also see: |netrw-:Rexplore|
+:Explore! is like :Explore, but will use vertical splitting.
+
+ *netrw-:Hexplore*
+:Hexplore [dir] does an :Explore with |:belowright| horizontal splitting.
+:Hexplore! [dir] does an :Explore with |:aboveleft| horizontal splitting.
+
+ *netrw-:Lexplore*
+:[N]Lexplore [dir] toggles a full height Explorer window on the left hand side
+ of the current tab. It will open a netrw window on the current
+ directory if [dir] is omitted; a :Lexplore [dir] will show the
+ specified directory in the left-hand side browser display no matter
+ from which window the command is issued.
+
+ By default, :Lexplore will change an uninitialized |g:netrw_chgwin|
+ to 2; edits will thus preferentially be made in window#2.
+
+ The [N] specifies a |g:netrw_winsize| just for the new :Lexplore
+ window.
+
+ Those who like this method often also like tree style displays;
+ see |g:netrw_liststyle|.
+
+:[N]Lexplore! [dir] is similar to :Lexplore, except that the full-height
+ Explorer window will open on the right hand side and an
+ uninitialized |g:netrw_chgwin| will be set to 1 (eg. edits will
+ preferentially occur in the leftmost window).
+
+ Also see: |netrw-C| |g:netrw_browse_split| |g:netrw_wiw|
+ |netrw-p| |netrw-P| |g:netrw_chgwin|
+ |netrw-c-tab| |g:netrw_winsize|
+
+ *netrw-:Sexplore*
+:[N]Sexplore will always split the window before invoking the local-directory
+ browser. As with Explore, the splitting is normally done
+ horizontally.
+:[N]Sexplore! [dir] is like :Sexplore, but the splitting will be done vertically.
+
+ *netrw-:Texplore*
+:Texplore [dir] does a |:tabnew| before generating the browser window
+
+ *netrw-:Vexplore*
+:[N]Vexplore [dir] does an :Explore with |:leftabove| vertical splitting.
+:[N]Vexplore! [dir] does an :Explore with |:rightbelow| vertical splitting.
+
+The optional parameters are:
+
+ [N]: This parameter will override |g:netrw_winsize| to specify the quantity of
+ rows and/or columns the new explorer window should have.
+ Otherwise, the |g:netrw_winsize| variable, if it has been specified by the
+ user, is used to control the quantity of rows and/or columns new
+ explorer windows should have.
+
+ [dir]: By default, these explorer commands use the current file's directory.
+ However, one may explicitly provide a directory (path) to use instead;
+ ie. >
+
+ :Explore /some/path
+<
+ *netrw-:Rexplore*
+:Rexplore This command is a little different from the other Explore commands
+ as it doesn't necessarily open an Explorer window.
+
+ Return to Explorer~
+ When one edits a file using netrw which can occur, for example,
+ when pressing <cr> while the cursor is atop a filename in a netrw
+ browser window, a :Rexplore issued while editing that file will
+ return the display to that of the last netrw browser display in
+ that window.
+
+ Return from Explorer~
+ Conversely, when one is editing a directory, issuing a :Rexplore
+ will return to editing the file that was last edited in that
+ window.
+
+ The <2-leftmouse> map (which is only available under gvim and
+ cooperative terms) does the same as :Rexplore.
+
+Also see: |g:netrw_alto| |g:netrw_altv| |g:netrw_winsize|
+
+
+*netrw-star* *netrw-starpat* *netrw-starstar* *netrw-starstarpat* *netrw-grep*
+EXPLORING WITH STARS AND PATTERNS {{{2
+
+When Explore, Sexplore, Hexplore, or Vexplore are used with one of the
+following four patterns Explore generates a list of files which satisfy the
+request for the local file system. These exploration patterns will not work
+with remote file browsing.
+
+ */filepat files in current directory which satisfy filepat
+ **/filepat files in current directory or below which satisfy the
+ file pattern
+ *//pattern files in the current directory which contain the
+ pattern (vimgrep is used)
+ **//pattern files in the current directory or below which contain
+ the pattern (vimgrep is used)
+<
+The cursor will be placed on the first file in the list. One may then
+continue to go to subsequent files on that list via |:Nexplore| or to
+preceding files on that list with |:Pexplore|. Explore will update the
+directory and place the cursor appropriately.
+
+A plain >
+ :Explore
+will clear the explore list.
+
+If your console or gui produces recognizable shift-up or shift-down sequences,
+then you'll likely find using shift-downarrow and shift-uparrow convenient.
+They're mapped by netrw as follows:
+
+ <s-down> == Nexplore, and
+ <s-up> == Pexplore.
+
+As an example, consider
+>
+ :Explore */*.c
+ :Nexplore
+ :Nexplore
+ :Pexplore
+<
+The status line will show, on the right hand side of the status line, a
+message like "Match 3 of 20".
+
+Associated setting variables:
+ |g:netrw_keepdir| |g:netrw_browse_split|
+ |g:netrw_fastbrowse| |g:netrw_ftp_browse_reject|
+ |g:netrw_ftp_list_cmd| |g:netrw_ftp_sizelist_cmd|
+ |g:netrw_ftp_timelist_cmd| |g:netrw_list_cmd|
+ |g:netrw_liststyle|
+
+
+DISPLAYING INFORMATION ABOUT FILE *netrw-qf* {{{2
+
+With the cursor atop a filename, pressing "qf" will reveal the file's size
+and last modification timestamp. Currently this capability is only available
+for local files.
+
+
+EDIT FILE OR DIRECTORY HIDING LIST *netrw-ctrl-h* *netrw-edithide* {{{2
+
+The "<ctrl-h>" map brings up a requestor allowing the user to change the
+file/directory hiding list contained in |g:netrw_list_hide|. The hiding list
+consists of one or more patterns delimited by commas. Files and/or
+directories satisfying these patterns will either be hidden (ie. not shown) or
+be the only ones displayed (see |netrw-a|).
+
+The "gh" mapping (see |netrw-gh|) quickly alternates between the usual
+hiding list and the hiding of files or directories that begin with ".".
+
+As an example, >
+ let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
+Effectively, this makes the effect of a |netrw-gh| command the initial setting.
+What it means:
+
+ \(^\|\s\s\) : if the line begins with the following, -or-
+ two consecutive spaces are encountered
+ \zs : start the hiding match now
+ \. : if it now begins with a dot
+ \S\+ : and is followed by one or more non-whitespace
+ characters
+
+Associated setting variables: |g:netrw_hide| |g:netrw_list_hide|
+Associated topics: |netrw-a| |netrw-gh| |netrw-mh|
+
+ *netrw-sort-sequence*
+EDITING THE SORTING SEQUENCE *netrw-S* *netrw-sortsequence* {{{2
+
+When "Sorted by" is name, one may specify priority via the sorting sequence
+(g:netrw_sort_sequence). The sorting sequence typically prioritizes the
+name-listing by suffix, although any pattern will do. Patterns are delimited
+by commas. The default sorting sequence is (all one line):
+
+For Unix: >
+ '[\/]$,\<core\%(\.\d\+\)\=,\.[a-np-z]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,
+ \.info$,\.swp$,\.bak$,\~$'
+<
+Otherwise: >
+ '[\/]$,\.[a-np-z]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,
+ \.swp$,\.bak$,\~$'
+<
+The lone * is where all filenames not covered by one of the other patterns
+will end up. One may change the sorting sequence by modifying the
+g:netrw_sort_sequence variable (either manually or in your <.vimrc>) or by
+using the "S" map.
+
+Related topics: |netrw-s| |netrw-S|
+Associated setting variables: |g:netrw_sort_sequence| |g:netrw_sort_options|
+
+
+EXECUTING FILE UNDER CURSOR VIA SYSTEM() *netrw-X* {{{2
+
+Pressing X while the cursor is atop an executable file will yield a prompt
+using the filename asking for any arguments. Upon pressing a [return], netrw
+will then call |system()| with that command and arguments. The result will be
+displayed by |:echomsg|, and so |:messages| will repeat display of the result.
+Ansi escape sequences will be stripped out.
+
+See |cmdline-window| for directions for more on how to edit the arguments.
+
+
+FORCING TREATMENT AS A FILE OR DIRECTORY *netrw-gd* *netrw-gf* {{{2
+
+Remote symbolic links (ie. those listed via ssh or ftp) are problematic
+in that it is difficult to tell whether they link to a file or to a
+directory.
+
+To force treatment as a file: use >
+ gf
+<
+To force treatment as a directory: use >
+ gd
+<
+
+GOING UP *netrw--* {{{2
+
+To go up a directory, press "-" or press the <cr> when atop the ../ directory
+entry in the listing.
+
+Netrw will use the command in |g:netrw_list_cmd| to perform the directory
+listing operation after changing HOSTNAME to the host specified by the
+user-prpvided url. By default netrw provides the command as: >
+
+ ssh HOSTNAME ls -FLa
+<
+where the HOSTNAME becomes the [user@]hostname as requested by the attempt to
+read. Naturally, the user may override this command with whatever is
+preferred. The NetList function which implements remote browsing
+expects that directories will be flagged by a trailing slash.
+
+
+HIDING FILES OR DIRECTORIES *netrw-a* *netrw-hiding* {{{2
+
+Netrw's browsing facility allows one to use the hiding list in one of three
+ways: ignore it, hide files which match, and show only those files which
+match.
+
+If no files have been marked via |netrw-mf|:
+
+The "a" map allows the user to cycle through the three hiding modes.
+
+The |g:netrw_list_hide| variable holds a comma delimited list of patterns
+based on regular expressions (ex. ^.*\.obj$,^\.) which specify the hiding list.
+(also see |netrw-ctrl-h|) To set the hiding list, use the <c-h> map. As an
+example, to hide files which begin with a ".", one may use the <c-h> map to
+set the hiding list to '^\..*' (or one may put let g:netrw_list_hide= '^\..*'
+in one's <.vimrc>). One may then use the "a" key to show all files, hide
+matching files, or to show only the matching files.
+
+ Example: \.[ch]$
+ This hiding list command will hide/show all *.c and *.h files.
+
+ Example: \.c$,\.h$
+ This hiding list command will also hide/show all *.c and *.h
+ files.
+
+Don't forget to use the "a" map to select the mode (normal/hiding/show) you
+want!
+
+If files have been marked using |netrw-mf|, then this command will:
+
+ if showing all files or non-hidden files:
+ modify the g:netrw_list_hide list by appending the marked files to it
+ and showing only non-hidden files.
+
+ else if showing hidden files only:
+ modify the g:netrw_list_hide list by removing the marked files from it
+ and showing only non-hidden files.
+ endif
+
+ *netrw-gh* *netrw-hide*
+As a quick shortcut, one may press >
+ gh
+to toggle between hiding files which begin with a period (dot) and not hiding
+them.
+
+Associated setting variables: |g:netrw_list_hide| |g:netrw_hide|
+Associated topics: |netrw-a| |netrw-ctrl-h| |netrw-mh|
+
+ *netrw-gitignore*
+Netrw provides a helper function 'netrw_gitignore#Hide()' that, when used with
+|g:netrw_list_hide| automatically hides all git-ignored files.
+
+'netrw_gitignore#Hide' searches for patterns in the following files: >
+
+ './.gitignore'
+ './.git/info/exclude'
+ global gitignore file: `git config --global core.excludesfile`
+ system gitignore file: `git config --system core.excludesfile`
+<
+Files that do not exist, are ignored.
+Git-ignore patterns are taken from existing files, and converted to patterns for
+hiding files. For example, if you had '*.log' in your '.gitignore' file, it
+would be converted to '.*\.log'.
+
+To use this function, simply assign its output to |g:netrw_list_hide| option. >
+
+ Example: let g:netrw_list_hide= netrw_gitignore#Hide()
+ Git-ignored files are hidden in Netrw.
+
+ Example: let g:netrw_list_hide= netrw_gitignore#Hide('my_gitignore_file')
+ Function can take additional files with git-ignore patterns.
+
+ Example: let g:netrw_list_hide= netrw_gitignore#Hide() .. '.*\.swp$'
+ Combining 'netrw_gitignore#Hide' with custom patterns.
+<
+
+IMPROVING BROWSING *netrw-listhack* *netrw-ssh-hack* {{{2
+
+Especially with the remote directory browser, constantly entering the password
+is tedious.
+
+For Linux/Unix systems, the book "Linux Server Hacks - 100 industrial strength
+tips & tools" by Rob Flickenger (O'Reilly, ISBN 0-596-00461-3) gives a tip
+for setting up no-password ssh and scp and discusses associated security
+issues. It used to be available at http://hacks.oreilly.com/pub/h/66 ,
+but apparently that address is now being redirected to some "hackzine".
+I'll attempt a summary based on that article and on a communication from
+Ben Schmidt:
+
+ 1. Generate a public/private key pair on the local machine
+ (ssh client): >
+ ssh-keygen -t rsa
+ (saving the file in ~/.ssh/id_rsa as prompted)
+<
+ 2. Just hit the <CR> when asked for passphrase (twice) for no
+ passphrase. If you do use a passphrase, you will also need to use
+ ssh-agent so you only have to type the passphrase once per session.
+ If you don't use a passphrase, simply logging onto your local
+ computer or getting access to the keyfile in any way will suffice
+ to access any ssh servers which have that key authorized for login.
+
+ 3. This creates two files: >
+ ~/.ssh/id_rsa
+ ~/.ssh/id_rsa.pub
+<
+ 4. On the target machine (ssh server): >
+ cd
+ mkdir -p .ssh
+ chmod 0700 .ssh
+<
+ 5. On your local machine (ssh client): (one line) >
+ ssh {serverhostname}
+ cat '>>' '~/.ssh/authorized_keys2' < ~/.ssh/id_rsa.pub
+<
+ or, for OpenSSH, (one line) >
+ ssh {serverhostname}
+ cat '>>' '~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub
+<
+You can test it out with >
+ ssh {serverhostname}
+and you should be log onto the server machine without further need to type
+anything.
+
+If you decided to use a passphrase, do: >
+ ssh-agent $SHELL
+ ssh-add
+ ssh {serverhostname}
+You will be prompted for your key passphrase when you use ssh-add, but not
+subsequently when you use ssh. For use with vim, you can use >
+ ssh-agent vim
+and, when next within vim, use >
+ :!ssh-add
+Alternatively, you can apply ssh-agent to the terminal you're planning on
+running vim in: >
+ ssh-agent xterm &
+and do ssh-add whenever you need.
+
+For Windows, folks on the vim mailing list have mentioned that Pageant helps
+with avoiding the constant need to enter the password.
+
+Kingston Fung wrote about another way to avoid constantly needing to enter
+passwords:
+
+ In order to avoid the need to type in the password for scp each time, you
+ provide a hack in the docs to set up a non password ssh account. I found a
+ better way to do that: I can use a regular ssh account which uses a
+ password to access the material without the need to key-in the password
+ each time. It's good for security and convenience. I tried ssh public key
+ authorization + ssh-agent, implementing this, and it works! Here are two
+ links with instructions:
+
+ http://www.ibm.com/developerworks/library/l-keyc2/
+ http://sial.org/howto/openssh/publickey-auth/
+
+
+ Ssh hints:
+
+ Thomer Gil has provided a hint on how to speed up netrw+ssh:
+ http://thomer.com/howtos/netrw_ssh.html
+
+ Alex Young has several hints on speeding ssh up:
+ http://usevim.com/2012/03/16/editing-remote-files/
+
+
+LISTING BOOKMARKS AND HISTORY *netrw-qb* *netrw-listbookmark* {{{2
+
+Pressing "qb" (query bookmarks) will list both the bookmarked directories and
+directory traversal history.
+
+Related Topics:
+ |netrw-gb| how to return (go) to a bookmark
+ |netrw-mb| how to make a bookmark
+ |netrw-mB| how to delete bookmarks
+ |netrw-u| change to a predecessor directory via the history stack
+ |netrw-U| change to a successor directory via the history stack
+
+MAKING A NEW DIRECTORY *netrw-d* {{{2
+
+With the "d" map one may make a new directory either remotely (which depends
+on the global variable g:netrw_mkdir_cmd) or locally (which depends on the
+global variable g:netrw_localmkdir). Netrw will issue a request for the new
+directory's name. A bare <CR> at that point will abort the making of the
+directory. Attempts to make a local directory that already exists (as either
+a file or a directory) will be detected, reported on, and ignored.
+
+Related topics: |netrw-D|
+Associated setting variables: |g:netrw_localmkdir| |g:netrw_mkdir_cmd|
+ |g:netrw_remote_mkdir| |netrw-%|
+
+
+MAKING THE BROWSING DIRECTORY THE CURRENT DIRECTORY *netrw-cd* {{{2
+
+By default, |g:netrw_keepdir| is 1. This setting means that the current
+directory will not track the browsing directory. (done for backwards
+compatibility with v6's file explorer).
+
+Setting g:netrw_keepdir to 0 tells netrw to make vim's current directory
+track netrw's browsing directory.
+
+However, given the default setting for g:netrw_keepdir of 1 where netrw
+maintains its own separate notion of the current directory, in order to make
+the two directories the same, use the "cd" map (type cd). That map will
+set Vim's notion of the current directory to netrw's current browsing
+directory.
+
+|netrw-cd| : This map's name was changed from "c" to cd (see |netrw-cd|).
+ This change was done to allow for |netrw-cb| and |netrw-cB| maps.
+
+Associated setting variable: |g:netrw_keepdir|
+
+MARKING FILES *netrw-:MF* *netrw-mf* {{{2
+ (also see |netrw-mr|)
+
+Netrw provides several ways to mark files:
+
+ * One may mark files with the cursor atop a filename and
+ then pressing "mf".
+
+ * With gvim, in addition one may mark files with
+ <s-leftmouse>. (see |netrw-mouse|)
+
+ * One may use the :MF command, which takes a list of
+ files (for local directories, the list may include
+ wildcards -- see |glob()|) >
+
+ :MF *.c
+<
+ (Note that :MF uses |<f-args>| to break the line
+ at spaces)
+
+ * Mark files using the |argument-list| (|netrw-mA|)
+
+ * Mark files based upon a |location-list| (|netrw-qL|)
+
+ * Mark files based upon the quickfix list (|netrw-qF|)
+ (|quickfix-error-lists|)
+
+The following netrw maps make use of marked files:
+
+ |netrw-a| Hide marked files/directories
+ |netrw-D| Delete marked files/directories
+ |netrw-ma| Move marked files' names to |arglist|
+ |netrw-mA| Move |arglist| filenames to marked file list
+ |netrw-mb| Append marked files to bookmarks
+ |netrw-mB| Delete marked files from bookmarks
+ |netrw-mc| Copy marked files to target
+ |netrw-md| Apply vimdiff to marked files
+ |netrw-me| Edit marked files
+ |netrw-mF| Unmark marked files
+ |netrw-mg| Apply vimgrep to marked files
+ |netrw-mm| Move marked files to target
+ |netrw-mp| Print marked files
+ |netrw-ms| Netrw will source marked files
+ |netrw-mt| Set target for |netrw-mm| and |netrw-mc|
+ |netrw-mT| Generate tags using marked files
+ |netrw-mv| Apply vim command to marked files
+ |netrw-mx| Apply shell command to marked files
+ |netrw-mX| Apply shell command to marked files, en bloc
+ |netrw-mz| Compress/Decompress marked files
+ |netrw-O| Obtain marked files
+ |netrw-R| Rename marked files
+
+One may unmark files one at a time the same way one marks them; ie. place
+the cursor atop a marked file and press "mf". This process also works
+with <s-leftmouse> using gvim. One may unmark all files by pressing
+"mu" (see |netrw-mu|).
+
+Marked files are highlighted using the "netrwMarkFile" highlighting group,
+which by default is linked to "Identifier" (see Identifier under
+|group-name|). You may change the highlighting group by putting something
+like >
+
+ highlight clear netrwMarkFile
+ hi link netrwMarkFile ..whatever..
+<
+into $HOME/.vim/after/syntax/netrw.vim .
+
+If the mouse is enabled and works with your vim, you may use <s-leftmouse> to
+mark one or more files. You may mark multiple files by dragging the shifted
+leftmouse. (see |netrw-mouse|)
+
+ *markfilelist* *global_markfilelist* *local_markfilelist*
+All marked files are entered onto the global marked file list; there is only
+one such list. In addition, every netrw buffer also has its own buffer-local
+marked file list; since netrw buffers are associated with specific
+directories, this means that each directory has its own local marked file
+list. The various commands which operate on marked files use one or the other
+of the marked file lists.
+
+Known Problem: if one is using tree mode (|g:netrw_liststyle|) and several
+directories have files with the same name, then marking such a file will
+result in all such files being highlighted as if they were all marked. The
+|markfilelist|, however, will only have the selected file in it. This problem
+is unlikely to be fixed.
+
+
+UNMARKING FILES *netrw-mF* {{{2
+ (also see |netrw-mf|, |netrw-mu|)
+
+The "mF" command will unmark all files in the current buffer. One may also use
+mf (|netrw-mf|) on a specific, already marked, file to unmark just that file.
+
+MARKING FILES BY LOCATION LIST *netrw-qL* {{{2
+ (also see |netrw-mf|)
+
+One may convert |location-list|s into a marked file list using "qL".
+You may then proceed with commands such as me (|netrw-me|) to edit them.
+
+
+MARKING FILES BY QUICKFIX LIST *netrw-qF* {{{2
+ (also see |netrw-mf|)
+
+One may convert |quickfix-error-lists| into a marked file list using "qF".
+You may then proceed with commands such as me (|netrw-me|) to edit them.
+Quickfix error lists are generated, for example, by calls to |:vimgrep|.
+
+
+MARKING FILES BY REGULAR EXPRESSION *netrw-mr* {{{2
+ (also see |netrw-mf|)
+
+One may also mark files by pressing "mr"; netrw will then issue a prompt,
+"Enter regexp: ". You may then enter a shell-style regular expression such
+as *.c$ (see |glob()|). For remote systems, glob() doesn't work -- so netrw
+converts "*" into ".*" (see |regexp|) and marks files based on that. In the
+future I may make it possible to use |regexp|s instead of glob()-style
+expressions (yet-another-option).
+
+See |cmdline-window| for directions on more on how to edit the regular
+expression.
+
+
+MARKED FILES, ARBITRARY VIM COMMAND *netrw-mv* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the local marked-file list)
+
+The "mv" map causes netrw to execute an arbitrary vim command on each file on
+the local marked file list, individually:
+
+ * 1split
+ * sil! keepalt e file
+ * run vim command
+ * sil! keepalt wq!
+
+A prompt, "Enter vim command: ", will be issued to elicit the vim command you
+wish used. See |cmdline-window| for directions for more on how to edit the
+command.
+
+
+MARKED FILES, ARBITRARY SHELL COMMAND *netrw-mx* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the local marked-file list)
+
+Upon activation of the "mx" map, netrw will query the user for some (external)
+command to be applied to all marked files. All "%"s in the command will be
+substituted with the name of each marked file in turn. If no "%"s are in the
+command, then the command will be followed by a space and a marked filename.
+
+Example:
+ (mark files)
+ mx
+ Enter command: cat
+
+ The result is a series of shell commands:
+ cat 'file1'
+ cat 'file2'
+ ...
+
+
+MARKED FILES, ARBITRARY SHELL COMMAND, EN BLOC *netrw-mX* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the global marked-file list)
+
+Upon activation of the 'mX' map, netrw will query the user for some (external)
+command to be applied to all marked files on the global marked file list. The
+"en bloc" means that one command will be executed on all the files at once: >
+
+ command files
+
+This approach is useful, for example, to select files and make a tarball: >
+
+ (mark files)
+ mX
+ Enter command: tar cf mynewtarball.tar
+<
+The command that will be run with this example:
+
+ tar cf mynewtarball.tar 'file1' 'file2' ...
+
+
+MARKED FILES: ARGUMENT LIST *netrw-ma* *netrw-mA*
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the global marked-file list)
+
+Using ma, one moves filenames from the marked file list to the argument list.
+Using mA, one moves filenames from the argument list to the marked file list.
+
+See Also: |netrw-cb| |netrw-cB| |netrw-qF| |argument-list| |:args|
+
+
+MARKED FILES: BUFFER LIST *netrw-cb* *netrw-cB*
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the global marked-file list)
+
+Using cb, one moves filenames from the marked file list to the buffer list.
+Using cB, one copies filenames from the buffer list to the marked file list.
+
+See Also: |netrw-ma| |netrw-mA| |netrw-qF| |buffer-list| |:buffers|
+
+
+MARKED FILES: COMPRESSION AND DECOMPRESSION *netrw-mz* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the local marked file list)
+
+If any marked files are compressed, then "mz" will decompress them.
+If any marked files are decompressed, then "mz" will compress them
+using the command specified by |g:netrw_compress|; by default,
+that's "gzip".
+
+For decompression, netrw uses a |Dictionary| of suffices and their
+associated decompressing utilities; see |g:netrw_decompress|.
+
+Remember that one can mark multiple files by regular expression
+(see |netrw-mr|); this is particularly useful to facilitate compressing and
+decompressing a large number of files.
+
+Associated setting variables: |g:netrw_compress| |g:netrw_decompress|
+
+MARKED FILES: COPYING *netrw-mc* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (Uses the global marked file list)
+
+Select a target directory with mt (|netrw-mt|). Then change directory,
+select file(s) (see |netrw-mf|), and press "mc". The copy is done
+from the current window (where one does the mf) to the target.
+
+If one does not have a target directory set with |netrw-mt|, then netrw
+will query you for a directory to copy to.
+
+One may also copy directories and their contents (local only) to a target
+directory.
+
+Associated setting variables:
+ |g:netrw_localcopycmd| |g:netrw_localcopycmdopt|
+ |g:netrw_localcopydircmd| |g:netrw_localcopydircmdopt|
+ |g:netrw_ssh_cmd|
+
+MARKED FILES: DIFF *netrw-md* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the global marked file list)
+
+Use |vimdiff| to visualize difference between selected files (two or
+three may be selected for this). Uses the global marked file list.
+
+MARKED FILES: EDITING *netrw-me* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the global marked file list)
+
+The "me" command will place the marked files on the |arglist| and commence
+editing them. One may return the to explorer window with |:Rexplore|.
+(use |:n| and |:p| to edit next and previous files in the arglist)
+
+MARKED FILES: GREP *netrw-mg* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the global marked file list)
+
+The "mg" command will apply |:vimgrep| to the marked files.
+The command will ask for the requested pattern; one may then enter: >
+
+ /pattern/[g][j]
+ ! /pattern/[g][j]
+ pattern
+<
+With /pattern/, editing will start with the first item on the |quickfix| list
+that vimgrep sets up (see |:copen|, |:cnext|, |:cprevious|, |:cclose|). The |:vimgrep|
+command is in use, so without 'g' each line is added to quickfix list only
+once; with 'g' every match is included.
+
+With /pattern/j, "mg" will winnow the current marked file list to just those
+marked files also possessing the specified pattern. Thus, one may use >
+
+ mr ...file-pattern...
+ mg /pattern/j
+<
+to have a marked file list satisfying the file-pattern but also restricted to
+files containing some desired pattern.
+
+
+MARKED FILES: HIDING AND UNHIDING BY SUFFIX *netrw-mh* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the local marked file list)
+
+The "mh" command extracts the suffices of the marked files and toggles their
+presence on the hiding list. Please note that marking the same suffix
+this way multiple times will result in the suffix's presence being toggled
+for each file (so an even quantity of marked files having the same suffix
+is the same as not having bothered to select them at all).
+
+Related topics: |netrw-a| |g:netrw_list_hide|
+
+MARKED FILES: MOVING *netrw-mm* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the global marked file list)
+
+ WARNING: moving files is more dangerous than copying them.
+ A file being moved is first copied and then deleted; if the
+ copy operation fails and the delete succeeds, you will lose
+ the file. Either try things out with unimportant files
+ first or do the copy and then delete yourself using mc and D.
+ Use at your own risk!
+
+Select a target directory with mt (|netrw-mt|). Then change directory,
+select file(s) (see |netrw-mf|), and press "mm". The move is done
+from the current window (where one does the mf) to the target.
+
+Associated setting variable: |g:netrw_localmovecmd| |g:netrw_ssh_cmd|
+
+MARKED FILES: PRINTING *netrw-mp* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the local marked file list)
+
+When "mp" is used, netrw will apply the |:hardcopy| command to marked files.
+What netrw does is open each file in a one-line window, execute hardcopy, then
+close the one-line window.
+
+
+MARKED FILES: SOURCING *netrw-ms* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the local marked file list)
+
+With "ms", netrw will source the marked files (using vim's |:source| command)
+
+
+MARKED FILES: SETTING THE TARGET DIRECTORY *netrw-mt* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+
+Set the marked file copy/move-to target (see |netrw-mc| and |netrw-mm|):
+
+ * If the cursor is atop a file name, then the netrw window's currently
+ displayed directory is used for the copy/move-to target.
+
+ * Also, if the cursor is in the banner, then the netrw window's currently
+ displayed directory is used for the copy/move-to target.
+ Unless the target already is the current directory. In which case,
+ typing "mf" clears the target.
+
+ * However, if the cursor is atop a directory name, then that directory is
+ used for the copy/move-to target
+
+ * One may use the :MT [directory] command to set the target *netrw-:MT*
+ This command uses |<q-args>|, so spaces in the directory name are
+ permitted without escaping.
+
+ * With mouse-enabled vim or with gvim, one may select a target by using
+ <c-leftmouse>
+
+There is only one copy/move-to target at a time in a vim session; ie. the
+target is a script variable (see |s:var|) and is shared between all netrw
+windows (in an instance of vim).
+
+When using menus and gvim, netrw provides a "Targets" entry which allows one
+to pick a target from the list of bookmarks and history.
+
+Related topics:
+ Marking Files......................................|netrw-mf|
+ Marking Files by Regular Expression................|netrw-mr|
+ Marked Files: Target Directory Using Bookmarks.....|netrw-Tb|
+ Marked Files: Target Directory Using History.......|netrw-Th|
+
+
+MARKED FILES: TAGGING *netrw-mT* {{{2
+ (See |netrw-mf| and |netrw-mr| for how to mark files)
+ (uses the global marked file list)
+
+The "mT" mapping will apply the command in |g:netrw_ctags| (by default, it is
+"ctags") to marked files. For remote browsing, in order to create a tags file
+netrw will use ssh (see |g:netrw_ssh_cmd|), and so ssh must be available for
+this to work on remote systems. For your local system, see |ctags| on how to
+get a version. I myself use hdrtags, currently available at
+http://www.drchip.org/astronaut/src/index.html , and have >
+
+ let g:netrw_ctags= "hdrtag"
+<
+in my <.vimrc>.
+
+When a remote set of files are tagged, the resulting tags file is "obtained";
+ie. a copy is transferred to the local system's directory. The now local tags
+file is then modified so that one may use it through the network. The
+modification made concerns the names of the files in the tags; each filename is
+preceded by the netrw-compatible URL used to obtain it. When one subsequently
+uses one of the go to tag actions (|tags|), the URL will be used by netrw to
+edit the desired file and go to the tag.
+
+Associated setting variables: |g:netrw_ctags| |g:netrw_ssh_cmd|
+
+MARKED FILES: TARGET DIRECTORY USING BOOKMARKS *netrw-Tb* {{{2
+
+Sets the marked file copy/move-to target.
+
+The |netrw-qb| map will give you a list of bookmarks (and history).
+One may choose one of the bookmarks to become your marked file
+target by using [count]Tb (default count: 1).
+
+Related topics:
+ Copying files to target............................|netrw-mc|
+ Listing Bookmarks and History......................|netrw-qb|
+ Marked Files: Setting The Target Directory.........|netrw-mt|
+ Marked Files: Target Directory Using History.......|netrw-Th|
+ Marking Files......................................|netrw-mf|
+ Marking Files by Regular Expression................|netrw-mr|
+ Moving files to target.............................|netrw-mm|
+
+
+MARKED FILES: TARGET DIRECTORY USING HISTORY *netrw-Th* {{{2
+
+Sets the marked file copy/move-to target.
+
+The |netrw-qb| map will give you a list of history (and bookmarks).
+One may choose one of the history entries to become your marked file
+target by using [count]Th (default count: 0; ie. the current directory).
+
+Related topics:
+ Copying files to target............................|netrw-mc|
+ Listing Bookmarks and History......................|netrw-qb|
+ Marked Files: Setting The Target Directory.........|netrw-mt|
+ Marked Files: Target Directory Using Bookmarks.....|netrw-Tb|
+ Marking Files......................................|netrw-mf|
+ Marking Files by Regular Expression................|netrw-mr|
+ Moving files to target.............................|netrw-mm|
+
+
+MARKED FILES: UNMARKING *netrw-mu* {{{2
+ (See |netrw-mf|, |netrw-mF|)
+
+The "mu" mapping will unmark all currently marked files. This command differs
+from "mF" as the latter only unmarks files in the current directory whereas
+"mu" will unmark global and all buffer-local marked files.
+(see |netrw-mF|)
+
+
+ *netrw-browser-settings*
+NETRW BROWSER VARIABLES *netrw-browser-options* *netrw-browser-var* {{{2
+
+(if you're interested in the netrw file transfer settings, see |netrw-options|
+ and |netrw-protocol|)
+
+The <netrw.vim> browser provides settings in the form of variables which
+you may modify; by placing these settings in your <.vimrc>, you may customize
+your browsing preferences. (see also: |netrw-settings|)
+>
+ --- -----------
+ Var Explanation
+ --- -----------
+< *g:netrw_altfile* some like |CTRL-^| to return to the last
+ edited file. Choose that by setting this
+ parameter to 1.
+ Others like |CTRL-^| to return to the
+ netrw browsing buffer. Choose that by setting
+ this parameter to 0.
+ default: =0
+
+ *g:netrw_alto* change from above splitting to below splitting
+ by setting this variable (see |netrw-o|)
+ default: =&sb (see |'sb'|)
+
+ *g:netrw_altv* change from left splitting to right splitting
+ by setting this variable (see |netrw-v|)
+ default: =&spr (see |'spr'|)
+
+ *g:netrw_banner* enable/suppress the banner
+ =0: suppress the banner
+ =1: banner is enabled (default)
+
+ *g:netrw_bannerbackslash* if this variable exists and is not zero, the
+ banner will be displayed with backslashes
+ rather than forward slashes.
+
+ *g:netrw_browse_split* when browsing, <cr> will open the file by:
+ =0: re-using the same window (default)
+ =1: horizontally splitting the window first
+ =2: vertically splitting the window first
+ =3: open file in new tab
+ =4: act like "P" (ie. open previous window)
+ Note that |g:netrw_preview| may be used
+ to get vertical splitting instead of
+ horizontal splitting.
+ =[servername,tab-number,window-number]
+ Given a |List| such as this, a remote server
+ named by the "servername" will be used for
+ editing. It will also use the specified tab
+ and window numbers to perform editing
+ (see |clientserver|, |netrw-ctrl-r|)
+ This option does not affect the production of
+ |:Lexplore| windows.
+
+ Related topics:
+ |g:netrw_alto| |g:netrw_altv|
+ |netrw-C| |netrw-cr|
+ |netrw-ctrl-r|
+
+ *g:netrw_browsex_viewer* specify user's preference for a viewer: >
+ "kfmclient exec"
+ "gnome-open"
+< If >
+ "-"
+< is used, then netrwFileHandler() will look for
+ a script/function to handle the given
+ extension. (see |netrw_filehandler|).
+
+ *g:netrw_browsex_support_remote*
+ specify if the specified viewer supports a
+ remote URL. (see |netrw-handler|).
+
+ *g:netrw_chgperm* Unix/Linux: "chmod PERM FILENAME"
+ Windows: "cacls FILENAME /e /p PERM"
+ Used to change access permission for a file.
+
+ *g:netrw_clipboard* =1
+ By default, netrw will attempt to insure that
+ the clipboard's values will remain unchanged.
+ However, some users report that they have
+ speed problems with this; consequently, this
+ option, when set to zero, lets such users
+ prevent netrw from saving and restoring the
+ clipboard (the latter is done only as needed).
+ That means that if the clipboard is changed
+ (inadvertently) by normal netrw operation that
+ it will not be restored to its prior state.
+
+ *g:netrw_compress* ="gzip"
+ Will compress marked files with this
+ command
+
+ *g:Netrw_corehandler* Allows one to specify something additional
+ to do when handling <core> files via netrw's
+ browser's "x" command (see |netrw-x|). If
+ present, g:Netrw_corehandler specifies
+ either one or more function references
+ (see |Funcref|). (the capital g:Netrw...
+ is required its holding a function reference)
+
+
+ *g:netrw_ctags* ="ctags"
+ The default external program used to create
+ tags
+
+ *g:netrw_cursor* = 2 (default)
+ This option controls the use of the
+ |'cursorline'| (cul) and |'cursorcolumn'|
+ (cuc) settings by netrw:
+
+ Value Thin-Long-Tree Wide
+ =0 u-cul u-cuc u-cul u-cuc
+ =1 u-cul u-cuc cul u-cuc
+ =2 cul u-cuc cul u-cuc
+ =3 cul u-cuc cul cuc
+ =4 cul cuc cul cuc
+ =5 U-cul U-cuc U-cul U-cuc
+ =6 U-cul U-cuc cul U-cuc
+ =7 cul U-cuc cul U-cuc
+ =8 cul U-cuc cul cuc
+
+ Where
+ u-cul : user's |'cursorline'| initial setting used
+ u-cuc : user's |'cursorcolumn'| initial setting used
+ U-cul : user's |'cursorline'| current setting used
+ U-cuc : user's |'cursorcolumn'| current setting used
+ cul : |'cursorline'| will be locally set
+ cuc : |'cursorcolumn'| will be locally set
+
+ The "initial setting" means the values of
+ the |'cuc'| and |'cul'| settings in effect when
+ netrw last saw |g:netrw_cursor| >= 5 or when
+ netrw was initially run.
+
+ *g:netrw_decompress* = { ".gz" : "gunzip" ,
+ ".bz2" : "bunzip2" ,
+ ".zip" : "unzip" ,
+ ".tar" : "tar -xf"}
+ A dictionary mapping suffices to
+ decompression programs.
+
+ *g:netrw_dirhistmax* =10: controls maximum quantity of past
+ history. May be zero to suppress
+ history.
+ (related: |netrw-qb| |netrw-u| |netrw-U|)
+
+ *g:netrw_dynamic_maxfilenamelen* =32: enables dynamic determination of
+ |g:netrw_maxfilenamelen|, which affects
+ local file long listing.
+
+ *g:netrw_errorlvl* =0: error levels greater than or equal to
+ this are permitted to be displayed
+ 0: notes
+ 1: warnings
+ 2: errors
+
+ *g:netrw_fastbrowse* =0: slow speed directory browsing;
+ never re-uses directory listings;
+ always obtains directory listings.
+ =1: medium speed directory browsing;
+ re-use directory listings only
+ when remote directory browsing.
+ (default value)
+ =2: fast directory browsing;
+ only obtains directory listings when the
+ directory hasn't been seen before
+ (or |netrw-ctrl-l| is used).
+
+ Fast browsing retains old directory listing
+ buffers so that they don't need to be
+ re-acquired. This feature is especially
+ important for remote browsing. However, if
+ a file is introduced or deleted into or from
+ such directories, the old directory buffer
+ becomes out-of-date. One may always refresh
+ such a directory listing with |netrw-ctrl-l|.
+ This option gives the user the choice of
+ trading off accuracy (ie. up-to-date listing)
+ versus speed.
+
+ *g:netrw_ffkeep* (default: doesn't exist)
+ If this variable exists and is zero, then
+ netrw will not do a save and restore for
+ |'fileformat'|.
+
+ *g:netrw_fname_escape* =' ?&;%'
+ Used on filenames before remote reading/writing
+
+ *g:netrw_ftp_browse_reject* ftp can produce a number of errors and warnings
+ that can show up as "directories" and "files"
+ in the listing. This pattern is used to
+ remove such embedded messages. By default its
+ value is:
+ '^total\s\+\d\+$\|
+ ^Trying\s\+\d\+.*$\|
+ ^KERBEROS_V\d rejected\|
+ ^Security extensions not\|
+ No such file\|
+ : connect to address [0-9a-fA-F:]*
+ : No route to host$'
+
+ *g:netrw_ftp_list_cmd* options for passing along to ftp for directory
+ listing. Defaults:
+ unix or g:netrw_cygwin set: : "ls -lF"
+ otherwise "dir"
+
+
+ *g:netrw_ftp_sizelist_cmd* options for passing along to ftp for directory
+ listing, sorted by size of file.
+ Defaults:
+ unix or g:netrw_cygwin set: : "ls -slF"
+ otherwise "dir"
+
+ *g:netrw_ftp_timelist_cmd* options for passing along to ftp for directory
+ listing, sorted by time of last modification.
+ Defaults:
+ unix or g:netrw_cygwin set: : "ls -tlF"
+ otherwise "dir"
+
+ *g:netrw_glob_escape* ='[]*?`{~$' (unix)
+ ='[]*?`{$' (windows
+ These characters in directory names are
+ escaped before applying glob()
+
+ *g:netrw_gx* ="<cfile>"
+ This option controls how gx (|netrw-gx|) picks
+ up the text under the cursor. See |expand()|
+ for possibilities.
+
+ *g:netrw_hide* Controlled by the "a" map (see |netrw-a|)
+ =0 : show all
+ =1 : show not-hidden files
+ =2 : show hidden files only
+ default: =1
+
+ *g:netrw_home* The home directory for where bookmarks and
+ history are saved (as .netrwbook and
+ .netrwhist).
+ Netrw uses |expand()|on the string.
+ default: the first directory on the
+ |'runtimepath'|
+
+ *g:netrw_keepdir* =1 (default) keep current directory immune from
+ the browsing directory.
+ =0 keep the current directory the same as the
+ browsing directory.
+ The current browsing directory is contained in
+ b:netrw_curdir (also see |netrw-cd|)
+
+ *g:netrw_keepj* ="keepj" (default) netrw attempts to keep the
+ |:jumps| table unaffected.
+ ="" netrw will not use |:keepjumps| with
+ exceptions only for the
+ saving/restoration of position.
+
+ *g:netrw_list_cmd* command for listing remote directories
+ default: (if ssh is executable)
+ "ssh HOSTNAME ls -FLa"
+
+ *g:netrw_list_cmd_options* If this variable exists, then its contents are
+ appended to the g:netrw_list_cmd. For
+ example, use "2>/dev/null" to get rid of banner
+ messages on unix systems.
+
+
+ *g:netrw_liststyle* Set the default listing style:
+ = 0: thin listing (one file per line)
+ = 1: long listing (one file per line with time
+ stamp information and file size)
+ = 2: wide listing (multiple files in columns)
+ = 3: tree style listing
+
+ *g:netrw_list_hide* comma-separated pattern list for hiding files
+ Patterns are regular expressions (see |regexp|)
+ There's some special support for git-ignore
+ files: you may add the output from the helper
+ function 'netrw_gitignore#Hide() automatically
+ hiding all gitignored files.
+ For more details see |netrw-gitignore|.
+
+ Examples:
+ let g:netrw_list_hide= '.*\.swp$'
+ let g:netrw_list_hide= netrw_gitignore#Hide() .. '.*\.swp$'
+ default: ""
+
+ *g:netrw_localcopycmd* ="cp" Linux/Unix/MacOS/Cygwin
+ =expand("$COMSPEC") Windows
+ Copies marked files (|netrw-mf|) to target
+ directory (|netrw-mt|, |netrw-mc|)
+
+ *g:netrw_localcopycmdopt* ='' Linux/Unix/MacOS/Cygwin
+ =' \c copy' Windows
+ Options for the |g:netrw_localcopycmd|
+
+ *g:netrw_localcopydircmd* ="cp" Linux/Unix/MacOS/Cygwin
+ =expand("$COMSPEC") Windows
+ Copies directories to target directory.
+ (|netrw-mc|, |netrw-mt|)
+
+ *g:netrw_localcopydircmdopt* =" -R" Linux/Unix/MacOS/Cygwin
+ =" /c xcopy /e /c /h/ /i /k" Windows
+ Options for |g:netrw_localcopydircmd|
+
+ *g:netrw_localmkdir* ="mkdir" Linux/Unix/MacOS/Cygwin
+ =expand("$COMSPEC") Windows
+ command for making a local directory
+
+ *g:netrw_localmkdiropt* ="" Linux/Unix/MacOS/Cygwin
+ =" /c mkdir" Windows
+ Options for |g:netrw_localmkdir|
+
+ *g:netrw_localmovecmd* ="mv" Linux/Unix/MacOS/Cygwin
+ =expand("$COMSPEC") Windows
+ Moves marked files (|netrw-mf|) to target
+ directory (|netrw-mt|, |netrw-mm|)
+
+ *g:netrw_localmovecmdopt* ="" Linux/Unix/MacOS/Cygwin
+ =" /c move" Windows
+ Options for |g:netrw_localmovecmd|
+
+ *g:netrw_localrmdir* ="rmdir" Linux/Unix/MacOS/Cygwin
+ =expand("$COMSPEC") Windows
+ Remove directory command (rmdir)
+ This variable is only used if your vim is
+ earlier than 7.4 or if your vim doesn't
+ have patch#1107. Otherwise, |delete()|
+ is used with the "d" option.
+
+ *g:netrw_localrmdiropt* ="" Linux/Unix/MacOS/Cygwin
+ =" /c rmdir" Windows
+ Options for |g:netrw_localrmdir|
+
+ *g:netrw_maxfilenamelen* =32 by default, selected so as to make long
+ listings fit on 80 column displays.
+ If your screen is wider, and you have file
+ or directory names longer than 32 bytes,
+ you may set this option to keep listings
+ columnar.
+
+ *g:netrw_mkdir_cmd* command for making a remote directory
+ via ssh (also see |g:netrw_remote_mkdir|)
+ default: "ssh USEPORT HOSTNAME mkdir"
+
+ *g:netrw_mousemaps* =1 (default) enables mouse buttons while
+ browsing to:
+ leftmouse : open file/directory
+ shift-leftmouse : mark file
+ middlemouse : same as P
+ rightmouse : remove file/directory
+ =0: disables mouse maps
+
+ *g:netrw_nobeval* doesn't exist (default)
+ If this variable exists, then balloon
+ evaluation will be suppressed
+ (see |'ballooneval'|)
+
+ *g:netrw_sizestyle* not defined: actual bytes (default)
+ ="b" : actual bytes (default)
+ ="h" : human-readable (ex. 5k, 4m, 3g)
+ uses 1000 base
+ ="H" : human-readable (ex. 5K, 4M, 3G)
+ uses 1024 base
+ The long listing (|netrw-i|) and query-file
+ maps (|netrw-qf|) will display file size
+ using the specified style.
+
+ *g:netrw_usetab* if this variable exists and is non-zero, then
+ the <tab> map supporting shrinking/expanding a
+ Lexplore or netrw window will be enabled.
+ (see |netrw-c-tab|)
+
+ *g:netrw_remote_mkdir* command for making a remote directory
+ via ftp (also see |g:netrw_mkdir_cmd|)
+ default: "mkdir"
+
+ *g:netrw_retmap* if it exists and is set to one, then:
+ * if in a netrw-selected file, AND
+ * no normal-mode <2-leftmouse> mapping exists,
+ then the <2-leftmouse> will be mapped for easy
+ return to the netrw browser window.
+ example: click once to select and open a file,
+ double-click to return.
+
+ Note that one may instead choose to:
+ * let g:netrw_retmap= 1, AND
+ * nmap <silent> YourChoice <Plug>NetrwReturn
+ and have another mapping instead of
+ <2-leftmouse> to invoke the return.
+
+ You may also use the |:Rexplore| command to do
+ the same thing.
+
+ default: =0
+
+ *g:netrw_rm_cmd* command for removing remote files
+ default: "ssh USEPORT HOSTNAME rm"
+
+ *g:netrw_rmdir_cmd* command for removing remote directories
+ default: "ssh USEPORT HOSTNAME rmdir"
+
+ *g:netrw_rmf_cmd* command for removing remote softlinks
+ default: "ssh USEPORT HOSTNAME rm -f"
+
+ *g:netrw_servername* use this variable to provide a name for
+ |netrw-ctrl-r| to use for its server.
+ default: "NETRWSERVER"
+
+ *g:netrw_sort_by* sort by "name", "time", "size", or
+ "exten".
+ default: "name"
+
+ *g:netrw_sort_direction* sorting direction: "normal" or "reverse"
+ default: "normal"
+
+ *g:netrw_sort_options* sorting is done using |:sort|; this
+ variable's value is appended to the
+ sort command. Thus one may ignore case,
+ for example, with the following in your
+ .vimrc: >
+ let g:netrw_sort_options="i"
+< default: ""
+
+ *g:netrw_sort_sequence* when sorting by name, first sort by the
+ comma-separated pattern sequence. Note that
+ any filigree added to indicate filetypes
+ should be accounted for in your pattern.
+ default: '[\/]$,*,\.bak$,\.o$,\.h$,
+ \.info$,\.swp$,\.obj$'
+
+ *g:netrw_special_syntax* If true, then certain files will be shown
+ using special syntax in the browser:
+
+ netrwBak : *.bak
+ netrwCompress: *.gz *.bz2 *.Z *.zip
+ netrwCoreDump: core.\d\+
+ netrwData : *.dat
+ netrwDoc : *.doc,*.txt,*.pdf,
+ *.pdf,*.docx
+ netrwHdr : *.h
+ netrwLex : *.l *.lex
+ netrwLib : *.a *.so *.lib *.dll
+ netrwMakefile: [mM]akefile *.mak
+ netrwObj : *.o *.obj
+ netrwPix : *.bmp,*.fit,*.fits,*.gif,
+ *.jpg,*.jpeg,*.pcx,*.ppc
+ *.pgm,*.png,*.psd,*.rgb
+ *.tif,*.xbm,*.xcf
+ netrwTags : tags ANmenu ANtags
+ netrwTilde : *
+ netrwTmp : tmp* *tmp
+ netrwYacc : *.y
+
+ In addition, those groups mentioned in
+ |'suffixes'| are also added to the special
+ file highlighting group.
+ These syntax highlighting groups are linked
+ to netrwGray or Folded by default
+ (see |hl-Folded|), but one may put lines like >
+ hi link netrwCompress Visual
+< into one's <.vimrc> to use one's own
+ preferences. Alternatively, one may
+ put such specifications into >
+ .vim/after/syntax/netrw.vim.
+< The netrwGray highlighting is set up by
+ netrw when >
+ * netrwGray has not been previously
+ defined
+ * the gui is running
+< As an example, I myself use a dark-background
+ colorscheme with the following in
+ .vim/after/syntax/netrw.vim: >
+
+ hi netrwCompress term=NONE cterm=NONE gui=NONE ctermfg=10 guifg=green ctermbg=0 guibg=black
+ hi netrwData term=NONE cterm=NONE gui=NONE ctermfg=9 guifg=blue ctermbg=0 guibg=black
+ hi netrwHdr term=NONE cterm=NONE,italic gui=NONE guifg=SeaGreen1
+ hi netrwLex term=NONE cterm=NONE,italic gui=NONE guifg=SeaGreen1
+ hi netrwYacc term=NONE cterm=NONE,italic gui=NONE guifg=SeaGreen1
+ hi netrwLib term=NONE cterm=NONE gui=NONE ctermfg=14 guifg=yellow
+ hi netrwObj term=NONE cterm=NONE gui=NONE ctermfg=12 guifg=red
+ hi netrwTilde term=NONE cterm=NONE gui=NONE ctermfg=12 guifg=red
+ hi netrwTmp term=NONE cterm=NONE gui=NONE ctermfg=12 guifg=red
+ hi netrwTags term=NONE cterm=NONE gui=NONE ctermfg=12 guifg=red
+ hi netrwDoc term=NONE cterm=NONE gui=NONE ctermfg=220 ctermbg=27 guifg=yellow2 guibg=Blue3
+ hi netrwSymLink term=NONE cterm=NONE gui=NONE ctermfg=220 ctermbg=27 guifg=grey60
+<
+ *g:netrw_ssh_browse_reject* ssh can sometimes produce unwanted lines,
+ messages, banners, and whatnot that one doesn't
+ want masquerading as "directories" and "files".
+ Use this pattern to remove such embedded
+ messages. By default its value is:
+ '^total\s\+\d\+$'
+
+ *g:netrw_ssh_cmd* One may specify an executable command
+ to use instead of ssh for remote actions
+ 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
+ to escape these characters.
+
+ *g:netrw_timefmt* specify format string to vim's strftime().
+ The default, "%c", is "the preferred date
+ and time representation for the current
+ locale" according to my manpage entry for
+ strftime(); however, not all are satisfied
+ with it. Some alternatives:
+ "%a %d %b %Y %T",
+ " %a %Y-%m-%d %I-%M-%S %p"
+ default: "%c"
+
+ *g:netrw_use_noswf* netrw normally avoids writing swapfiles
+ for browser buffers. However, under some
+ systems this apparently is causing nasty
+ ml_get errors to appear; if you're getting
+ ml_get errors, try putting
+ let g:netrw_use_noswf= 0
+ in your .vimrc.
+ default: 1
+
+ *g:netrw_winsize* specify initial size of new windows made with
+ "o" (see |netrw-o|), "v" (see |netrw-v|),
+ |:Hexplore| or |:Vexplore|. The g:netrw_winsize
+ is an integer describing the percentage of the
+ current netrw buffer's window to be used for
+ the new window.
+ If g:netrw_winsize is less than zero, then
+ the absolute value of g:netrw_winsize will be
+ used to specify the quantity of lines or
+ columns for the new window.
+ If g:netrw_winsize is zero, then a normal
+ split will be made (ie. |'equalalways'| will
+ take effect, for example).
+ default: 50 (for 50%)
+
+ *g:netrw_wiw* =1 specifies the minimum window width to use
+ when shrinking a netrw/Lexplore window
+ (see |netrw-c-tab|).
+
+ *g:netrw_xstrlen* Controls how netrw computes string lengths,
+ including multi-byte characters' string
+ length. (thanks to N Weibull, T Mechelynck)
+ =0: uses Vim's built-in strlen()
+ =1: number of codepoints (Latin a + combining
+ circumflex is two codepoints) (DEFAULT)
+ =2: number of spacing codepoints (Latin a +
+ combining circumflex is one spacing
+ codepoint; a hard tab is one; wide and
+ narrow CJK are one each; etc.)
+ =3: virtual length (counting tabs as anything
+ between 1 and |'tabstop'|, wide CJK as 2
+ rather than 1, Arabic alif as zero when
+ immediately preceded by lam, one
+ otherwise, etc)
+
+ *g:NetrwTopLvlMenu* This variable specifies the top level
+ menu name; by default, it's "Netrw.". If
+ you wish to change this, do so in your
+ .vimrc.
+
+NETRW BROWSING AND OPTION INCOMPATIBILITIES *netrw-incompatible* {{{2
+
+Netrw has been designed to handle user options by saving them, setting the
+options to something that's compatible with netrw's needs, and then restoring
+them. However, the autochdir option: >
+ :set acd
+is problematic. Autochdir sets the current directory to that containing the
+file you edit; this apparently also applies to directories. In other words,
+autochdir sets the current directory to that containing the "file" (even if
+that "file" is itself a directory).
+
+NETRW SETTINGS WINDOW *netrw-settings-window* {{{2
+
+With the NetrwSettings.vim plugin, >
+ :NetrwSettings
+will bring up a window with the many variables that netrw uses for its
+settings. You may change any of their values; when you save the file, the
+settings therein will be used. One may also press "?" on any of the lines for
+help on what each of the variables do.
+
+(also see: |netrw-browser-var| |netrw-protocol| |netrw-variables|)
+
+
+==============================================================================
+OBTAINING A FILE *netrw-obtain* *netrw-O* {{{2
+
+If there are no marked files:
+
+ When browsing a remote directory, one may obtain a file under the cursor
+ (ie. get a copy on your local machine, but not edit it) by pressing the O
+ key.
+
+If there are marked files:
+
+ The marked files will be obtained (ie. a copy will be transferred to your
+ local machine, but not set up for editing).
+
+Only ftp and scp are supported for this operation (but since these two are
+available for browsing, that shouldn't be a problem). The status bar will
+then show, on its right hand side, a message like "Obtaining filename". The
+statusline will be restored after the transfer is complete.
+
+Netrw can also "obtain" a file using the local browser. Netrw's display
+of a directory is not necessarily the same as Vim's "current directory",
+unless |g:netrw_keepdir| is set to 0 in the user's <.vimrc>. One may select
+a file using the local browser (by putting the cursor on it) and pressing
+"O" will then "obtain" the file; ie. copy it to Vim's current directory.
+
+Related topics:
+ * To see what the current directory is, use |:pwd|
+ * To make the currently browsed directory the current directory, see
+ |netrw-cd|
+ * To automatically make the currently browsed directory the current
+ directory, see |g:netrw_keepdir|.
+
+ *netrw-newfile* *netrw-createfile*
+OPEN A NEW FILE IN NETRW'S CURRENT DIRECTORY *netrw-%* {{{2
+
+To open a new file in netrw's current directory, press "%". This map
+will query the user for a new filename; an empty file by that name will
+be placed in the netrw's current directory (ie. b:netrw_curdir).
+
+If Lexplore (|netrw-:Lexplore|) is in use, the new file will be generated
+in the |g:netrw_chgwin| window.
+
+Related topics: |netrw-d|
+
+
+PREVIEW WINDOW *netrw-p* *netrw-preview* {{{2
+
+One may use a preview window by using the "p" key when the cursor is atop the
+desired filename to be previewed. The display will then split to show both
+the browser (where the cursor will remain) and the file (see |:pedit|). By
+default, the split will be taken horizontally; one may use vertical splitting
+if one has set |g:netrw_preview| first.
+
+An interesting set of netrw settings is: >
+
+ let g:netrw_preview = 1
+ let g:netrw_liststyle = 3
+ let g:netrw_winsize = 30
+
+These will:
+
+ 1. Make vertical splitting the default for previewing files
+ 2. Make the default listing style "tree"
+ 3. When a vertical preview window is opened, the directory listing
+ will use only 30% of the columns available; the rest of the window
+ is used for the preview window.
+
+ Related: if you like this idea, you may also find :Lexplore
+ (|netrw-:Lexplore|) or |g:netrw_chgwin| of interest
+
+Also see: |g:netrw_chgwin| |netrw-P| |'previewwindow'| |CTRL-W_z| |:pclose|
+
+
+PREVIOUS WINDOW *netrw-P* *netrw-prvwin* {{{2
+
+To edit a file or directory under the cursor in the previously used (last
+accessed) window (see :he |CTRL-W_p|), press a "P". If there's only one
+window, then the one window will be horizontally split (by default).
+
+If there's more than one window, the previous window will be re-used on
+the selected file/directory. If the previous window's associated buffer
+has been modified, and there's only one window with that buffer, then
+the user will be asked if s/he wishes to save the buffer first (yes,
+no, or cancel).
+
+Related Actions |netrw-cr| |netrw-o| |netrw-t| |netrw-v|
+Associated setting variables:
+ |g:netrw_alto| control above/below splitting
+ |g:netrw_altv| control right/left splitting
+ |g:netrw_preview| control horizontal vs vertical splitting
+ |g:netrw_winsize| control initial sizing
+
+Also see: |g:netrw_chgwin| |netrw-p|
+
+
+REFRESHING THE LISTING *netrw-refresh* *netrw-ctrl-l* *netrw-ctrl_l* {{{2
+
+To refresh either a local or remote directory listing, press ctrl-l (<c-l>) or
+hit the <cr> when atop the ./ directory entry in the listing. One may also
+refresh a local directory by using ":e .".
+
+
+REVERSING SORTING ORDER *netrw-r* *netrw-reverse* {{{2
+
+One may toggle between normal and reverse sorting order by pressing the
+"r" key.
+
+Related topics: |netrw-s|
+Associated setting variable: |g:netrw_sort_direction|
+
+
+RENAMING FILES OR DIRECTORIES *netrw-move* *netrw-rename* *netrw-R* {{{2
+
+If there are no marked files: (see |netrw-mf|)
+
+ Renaming files and directories involves moving the cursor to the
+ file/directory to be moved (renamed) and pressing "R". You will then be
+ queried for what you want the file/directory to be renamed to. You may
+ select a range of lines with the "V" command (visual selection), and then
+ press "R"; you will be queried for each file as to what you want it
+ renamed to.
+
+If there are marked files: (see |netrw-mf|)
+
+ Marked files will be renamed (moved). You will be queried as above in
+ order to specify where you want the file/directory to be moved.
+
+ If you answer a renaming query with a "s/frompattern/topattern/", then
+ subsequent files on the marked file list will be renamed by taking each
+ name, applying that substitute, and renaming each file to the result.
+ As an example : >
+
+ mr [query: reply with *.c]
+ R [query: reply with s/^\(.*\)\.c$/\1.cpp/]
+<
+ This example will mark all *.c files and then rename them to *.cpp
+ files. Netrw will protect you from overwriting local files without
+ confirmation, but not remote ones.
+
+ The ctrl-X character has special meaning for renaming files: >
+
+ <c-x> : a single ctrl-x tells netrw to ignore the portion of the response
+ lying between the last '/' and the ctrl-x.
+
+ <c-x><c-x> : a pair of contiguous ctrl-x's tells netrw to ignore any
+ portion of the string preceding the double ctrl-x's.
+<
+ WARNING:~
+
+ Note that moving files is a dangerous operation; copies are safer. That's
+ because a "move" for remote files is actually a copy + delete -- and if
+ the copy fails and the delete succeeds you may lose the file.
+ Use at your own risk.
+
+The *g:netrw_rename_cmd* variable is used to implement remote renaming. By
+default its value is: >
+
+ ssh HOSTNAME mv
+<
+One may rename a block of files and directories by selecting them with
+V (|linewise-visual|) when using thin style.
+
+See |cmdline-editing| for more on how to edit the command line; in particular,
+you'll find <ctrl-f> (initiates cmdline window editing) and <ctrl-c> (uses the
+command line under the cursor) useful in conjunction with the R command.
+
+
+SELECTING SORTING STYLE *netrw-s* *netrw-sort* {{{2
+
+One may select the sorting style by name, time, or (file) size. The "s" map
+allows one to circulate amongst the three choices; the directory listing will
+automatically be refreshed to reflect the selected style.
+
+Related topics: |netrw-r| |netrw-S|
+Associated setting variables: |g:netrw_sort_by| |g:netrw_sort_sequence|
+
+
+SETTING EDITING WINDOW *netrw-editwindow* *netrw-C* *netrw-:NetrwC* {{{2
+
+One may select a netrw window for editing with the "C" mapping, using the
+:NetrwC [win#] command, or by setting |g:netrw_chgwin| to the selected window
+number. Subsequent selection of a file to edit (|netrw-cr|) will use that
+window.
+
+ * C : by itself, will select the current window holding a netrw buffer
+ for subsequent editing via |netrw-cr|. The C mapping is only available
+ while in netrw buffers.
+
+ * [count]C : the count will be used as the window number to be used
+ for subsequent editing via |netrw-cr|.
+
+ * :NetrwC will set |g:netrw_chgwin| to the current window
+
+ * :NetrwC win# will set |g:netrw_chgwin| to the specified window
+ number
+
+Using >
+ let g:netrw_chgwin= -1
+will restore the default editing behavior
+(ie. subsequent editing will use the current window).
+
+Related topics: |netrw-cr| |g:netrw_browse_split|
+Associated setting variables: |g:netrw_chgwin|
+
+
+SHRINKING OR EXPANDING A NETRW OR LEXPLORE WINDOW *netrw-c-tab* {{{2
+
+The <c-tab> key will toggle a netrw or |:Lexplore| window's width,
+but only if |g:netrw_usetab| exists and is non-zero (and, of course,
+only if your terminal supports differentiating <c-tab> from a plain
+<tab>).
+
+ * If the current window is a netrw window, toggle its width
+ (between |g:netrw_wiw| and its original width)
+
+ * Else if there is a |:Lexplore| window in the current tab, toggle
+ its width
+
+ * Else bring up a |:Lexplore| window
+
+If |g:netrw_usetab| exists and is zero, or if there is a pre-existing mapping
+for <c-tab>, then the <c-tab> will not be mapped. One may map something other
+than a <c-tab>, too: (but you'll still need to have had |g:netrw_usetab| set). >
+
+ nmap <unique> (whatever) <Plug>NetrwShrink
+<
+Related topics: |:Lexplore|
+Associated setting variable: |g:netrw_usetab|
+
+
+USER SPECIFIED MAPS *netrw-usermaps* {{{1
+
+One may make customized user maps. Specify a variable, |g:Netrw_UserMaps|,
+to hold a |List| of lists of keymap strings and function names: >
+
+ [["keymap-sequence","ExampleUserMapFunc"],...]
+<
+When netrw is setting up maps for a netrw buffer, if |g:Netrw_UserMaps|
+exists, then the internal function netrw#UserMaps(islocal) is called.
+This function goes through all the entries in the |g:Netrw_UserMaps| list:
+
+ * sets up maps: >
+ nno <buffer> <silent> KEYMAP-SEQUENCE
+ :call s:UserMaps(islocal,"ExampleUserMapFunc")
+< * refreshes if result from that function call is the string
+ "refresh"
+ * if the result string is not "", then that string will be
+ executed (:exe result)
+ * if the result is a List, then the above two actions on results
+ will be taken for every string in the result List
+
+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
+remote-directory system call.
+
+ *netrw-call* *netrw-expose* *netrw-modify*
+Use netrw#Expose("varname") to access netrw-internal (script-local)
+ variables.
+Use netrw#Modify("varname",newvalue) to change netrw-internal variables.
+Use netrw#Call("funcname"[,args]) to call a netrw-internal function with
+ specified arguments.
+
+Example: Get a copy of netrw's marked file list: >
+
+ let netrwmarkfilelist= netrw#Expose("netrwmarkfilelist")
+<
+Example: Modify the value of netrw's marked file list: >
+
+ call netrw#Modify("netrwmarkfilelist",[])
+<
+Example: Clear netrw's marked file list via a mapping on gu >
+ " ExampleUserMap: {{{2
+ fun! ExampleUserMap(islocal)
+ call netrw#Modify("netrwmarkfilelist",[])
+ call netrw#Modify('netrwmarkfilemtch_{bufnr("%")}',"")
+ let retval= ["refresh"]
+ return retval
+ endfun
+ let g:Netrw_UserMaps= [["gu","ExampleUserMap"]]
+<
+
+10. Problems and Fixes *netrw-problems* {{{1
+
+ (This section is likely to grow as I get feedback)
+ (also see |netrw-debug|)
+ *netrw-p1*
+ P1. I use windows 95, and my ftp dumps four blank lines at the {{{2
+ end of every read.
+
+ See |netrw-fixup|, and put the following into your
+ <.vimrc> file:
+
+ let g:netrw_win95ftp= 1
+
+ *netrw-p2*
+ P2. I use Windows, and my network browsing with ftp doesn't sort by {{{2
+ time or size! -or- The remote system is a Windows server; why
+ don't I get sorts by time or size?
+
+ Windows' ftp has a minimal support for ls (ie. it doesn't
+ accept sorting options). It doesn't support the -F which
+ gives an explanatory character (ABC/ for "ABC is a directory").
+ Netrw then uses "dir" to get both its thin and long listings.
+ If you think your ftp does support a full-up ls, put the
+ following into your <.vimrc>: >
+
+ let g:netrw_ftp_list_cmd = "ls -lF"
+ let g:netrw_ftp_timelist_cmd= "ls -tlF"
+ let g:netrw_ftp_sizelist_cmd= "ls -slF"
+<
+ Alternatively, if you have cygwin on your Windows box, put
+ into your <.vimrc>: >
+
+ let g:netrw_cygwin= 1
+<
+ This problem also occurs when the remote system is Windows.
+ In this situation, the various g:netrw_ftp_[time|size]list_cmds
+ are as shown above, but the remote system will not correctly
+ modify its listing behavior.
+
+
+ *netrw-p3*
+ P3. I tried rcp://user@host/ (or protocol other than ftp) and netrw {{{2
+ used ssh! That wasn't what I asked for...
+
+ Netrw has two methods for browsing remote directories: ssh
+ and ftp. Unless you specify ftp specifically, ssh is used.
+ When it comes time to do download a file (not just a directory
+ listing), netrw will use the given protocol to do so.
+
+ *netrw-p4*
+ P4. I would like long listings to be the default. {{{2
+
+ Put the following statement into your |.vimrc|: >
+
+ let g:netrw_liststyle= 1
+<
+ Check out |netrw-browser-var| for more customizations that
+ you can set.
+
+ *netrw-p5*
+ P5. My times come up oddly in local browsing {{{2
+
+ Does your system's strftime() accept the "%c" to yield dates
+ such as "Sun Apr 27 11:49:23 1997"? If not, do a
+ "man strftime" and find out what option should be used. Then
+ put it into your |.vimrc|: >
+
+ let g:netrw_timefmt= "%X" (where X is the option)
+<
+ *netrw-p6*
+ P6. I want my current directory to track my browsing. {{{2
+ How do I do that?
+
+ Put the following line in your |.vimrc|:
+>
+ let g:netrw_keepdir= 0
+<
+ *netrw-p7*
+ P7. I use Chinese (or other non-ascii) characters in my filenames, {{{2
+ and netrw (Explore, Sexplore, Hexplore, etc) doesn't display them!
+
+ (taken from an answer provided by Wu Yongwei on the vim
+ mailing list)
+ I now see the problem. Your code page is not 936, right? Vim
+ seems only able to open files with names that are valid in the
+ current code page, as are many other applications that do not
+ use the Unicode version of Windows APIs. This is an OS-related
+ issue. You should not have such problems when the system
+ locale uses UTF-8, such as modern Linux distros.
+
+ (...it is one more reason to recommend that people use utf-8!)
+
+ *netrw-p8*
+ P8. I'm getting "ssh is not executable on your system" -- what do I {{{2
+ do?
+
+ (Dudley Fox) Most people I know use putty for windows ssh. It
+ is a free ssh/telnet application. You can read more about it
+ here:
+
+ http://www.chiark.greenend.org.uk/~sgtatham/putty/ Also:
+
+ (Marlin Unruh) This program also works for me. It's a single
+ executable, so he/she can copy it into the Windows\System32
+ folder and create a shortcut to it.
+
+ (Dudley Fox) You might also wish to consider plink, as it
+ sounds most similar to what you are looking for. plink is an
+ application in the putty suite.
+
+ http://the.earth.li/~sgtatham/putty/0.58/htmldoc/Chapter7.html#plink
+
+ (Vissale Neang) Maybe you can try OpenSSH for windows, which
+ can be obtained from:
+
+ http://sshwindows.sourceforge.net/
+
+ It doesn't need the full Cygwin package.
+
+ (Antoine Mechelynck) For individual Unix-like programs needed
+ for work in a native-Windows environment, I recommend getting
+ them from the GnuWin32 project on sourceforge if it has them:
+
+ http://gnuwin32.sourceforge.net/
+
+ Unlike Cygwin, which sets up a Unix-like virtual machine on
+ top of Windows, GnuWin32 is a rewrite of Unix utilities with
+ Windows system calls, and its programs works quite well in the
+ cmd.exe "Dos box".
+
+ (dave) Download WinSCP and use that to connect to the server.
+ In Preferences > Editors, set gvim as your editor:
+
+ - Click "Add..."
+ - Set External Editor (adjust path as needed, include
+ the quotes and !.! at the end):
+ "c:\Program Files\Vim\vim82\gvim.exe" !.!
+ - Check that the filetype in the box below is
+ {asterisk}.{asterisk} (all files), or whatever types
+ you want (cec: change {asterisk} to * ; I had to
+ write it that way because otherwise the helptags
+ system thinks it's a tag)
+ - Make sure it's at the top of the listbox (click it,
+ then click "Up" if it's not)
+ If using the Norton Commander style, you just have to hit <F4>
+ to edit a file in a local copy of gvim.
+
+ (Vit Gottwald) How to generate public/private key and save
+ public key it on server: >
+ http://www.chiark.greenend.org.uk/~sgtatham/putty/0.60/htmldoc/Chapter8.html#pubkey-gettingready
+ (8.3 Getting ready for public key authentication)
+<
+ How to use a private key with 'pscp': >
+
+ http://www.chiark.greenend.org.uk/~sgtatham/putty/0.60/htmldoc/Chapter5.html
+ (5.2.4 Using public key authentication with PSCP)
+<
+ (Ben Schmidt) I find the ssh included with cwRsync is
+ brilliant, and install cwRsync or cwRsyncServer on most
+ Windows systems I come across these days. I guess COPSSH,
+ packed by the same person, is probably even better for use as
+ just ssh on Windows, and probably includes sftp, etc. which I
+ suspect the cwRsync doesn't, though it might
+
+ (cec) To make proper use of these suggestions above, you will
+ need to modify the following user-settable variables in your
+ .vimrc:
+
+ |g:netrw_ssh_cmd| |g:netrw_list_cmd| |g:netrw_mkdir_cmd|
+ |g:netrw_rm_cmd| |g:netrw_rmdir_cmd| |g:netrw_rmf_cmd|
+
+ The first one (|g:netrw_ssh_cmd|) is the most important; most
+ of the others will use the string in g:netrw_ssh_cmd by
+ default.
+
+ *netrw-p9* *netrw-ml_get*
+ P9. I'm browsing, changing directory, and bang! ml_get errors {{{2
+ appear and I have to kill vim. Any way around this?
+
+ Normally netrw attempts to avoid writing swapfiles for
+ its temporary directory buffers. However, on some systems
+ this attempt appears to be causing ml_get errors to
+ appear. Please try setting |g:netrw_use_noswf| to 0
+ in your <.vimrc>: >
+ let g:netrw_use_noswf= 0
+<
+ *netrw-p10*
+ P10. I'm being pestered with "[something] is a directory" and {{{2
+ "Press ENTER or type command to continue" prompts...
+
+ The "[something] is a directory" prompt is issued by Vim,
+ not by netrw, and there appears to be no way to work around
+ it. Coupled with the default cmdheight of 1, this message
+ causes the "Press ENTER..." prompt. So: read |hit-enter|;
+ I also suggest that you set your |'cmdheight'| to 2 (or more) in
+ your <.vimrc> file.
+
+ *netrw-p11*
+ P11. I want to have two windows; a thin one on the left and my {{{2
+ editing window on the right. How may I accomplish this?
+
+ You probably want netrw running as in a side window. If so, you
+ will likely find that ":[N]Lexplore" does what you want. The
+ optional "[N]" allows you to select the quantity of columns you
+ wish the |:Lexplore|r window to start with (see |g:netrw_winsize|
+ for how this parameter works).
+
+ Previous solution:
+
+ * Put the following line in your <.vimrc>:
+ let g:netrw_altv = 1
+ * Edit the current directory: :e .
+ * Select some file, press v
+ * Resize the windows as you wish (see |CTRL-W_<| and
+ |CTRL-W_>|). If you're using gvim, you can drag
+ the separating bar with your mouse.
+ * When you want a new file, use ctrl-w h to go back to the
+ netrw browser, select a file, then press P (see |CTRL-W_h|
+ and |netrw-P|). If you're using gvim, you can press
+ <leftmouse> in the browser window and then press the
+ <middlemouse> to select the file.
+
+
+ *netrw-p12*
+ P12. My directory isn't sorting correctly, or unwanted letters are {{{2
+ appearing in the listed filenames, or things aren't lining
+ up properly in the wide listing, ...
+
+ This may be due to an encoding problem. I myself usually use
+ utf-8, but really only use ascii (ie. bytes from 32-126).
+ Multibyte encodings use two (or more) bytes per character.
+ You may need to change |g:netrw_sepchr| and/or |g:netrw_xstrlen|.
+
+ *netrw-p13*
+ P13. I'm a Windows + putty + ssh user, and when I attempt to {{{2
+ browse, the directories are missing trailing "/"s so netrw treats
+ them as file transfers instead of as attempts to browse
+ subdirectories. How may I fix this?
+
+ (mikeyao) If you want to use vim via ssh and putty under Windows,
+ try combining the use of pscp/psftp with plink. pscp/psftp will
+ be used to connect and plink will be used to execute commands on
+ the server, for example: list files and directory using 'ls'.
+
+ These are the settings I use to do this:
+>
+ " list files, it's the key setting, if you haven't set,
+ " you will get a blank buffer
+ let g:netrw_list_cmd = "plink HOSTNAME ls -Fa"
+ " if you haven't add putty directory in system path, you should
+ " specify scp/sftp command. For examples:
+ "let g:netrw_sftp_cmd = "d:\\dev\\putty\\PSFTP.exe"
+ "let g:netrw_scp_cmd = "d:\\dev\\putty\\PSCP.exe"
+<
+ *netrw-p14*
+ P14. I would like to speed up writes using Nwrite and scp/ssh {{{2
+ style connections. How? (Thomer M. Gil)
+
+ Try using ssh's ControlMaster and ControlPath (see the ssh_config
+ man page) to share multiple ssh connections over a single network
+ connection. That cuts out the cryptographic handshake on each
+ file write, sometimes speeding it up by an order of magnitude.
+ (see http://thomer.com/howtos/netrw_ssh.html)
+ (included by permission)
+
+ Add the following to your ~/.ssh/config: >
+
+ # you change "*" to the hostname you care about
+ Host *
+ ControlMaster auto
+ ControlPath /tmp/%r@%h:%p
+
+< Then create an ssh connection to the host and leave it running: >
+
+ ssh -N host.domain.com
+
+< Now remotely open a file with Vim's Netrw and enjoy the
+ zippiness: >
+
+ vim scp://host.domain.com//home/user/.bashrc
+<
+ *netrw-p15*
+ P15. How may I use a double-click instead of netrw's usual single {{{2
+ click to open a file or directory? (Ben Fritz)
+
+ First, disable netrw's mapping with >
+ let g:netrw_mousemaps= 0
+< and then create a netrw buffer only mapping in
+ $HOME/.vim/after/ftplugin/netrw.vim: >
+ nmap <buffer> <2-leftmouse> <CR>
+< Note that setting g:netrw_mousemaps to zero will turn off
+ all netrw's mouse mappings, not just the <leftmouse> one.
+ (see |g:netrw_mousemaps|)
+
+ *netrw-p16*
+ P16. When editing remote files (ex. :e ftp://hostname/path/file), {{{2
+ under Windows I get an |E303| message complaining that its unable
+ to open a swap file.
+
+ (romainl) It looks like you are starting Vim from a protected
+ directory. Start netrw from your $HOME or other writable
+ directory.
+
+ *netrw-p17*
+ P17. Netrw is closing buffers on its own. {{{2
+ What steps will reproduce the problem?
+ 1. :Explore, navigate directories, open a file
+ 2. :Explore, open another file
+ 3. Buffer opened in step 1 will be closed. o
+ What is the expected output? What do you see instead?
+ I expect both buffers to exist, but only the last one does.
+
+ (Lance) Problem is caused by "set autochdir" in .vimrc.
+ (drchip) I am able to duplicate this problem with |'acd'| set.
+ It appears that the buffers are not exactly closed;
+ a ":ls!" will show them (although ":ls" does not).
+
+ *netrw-P18*
+ P18. How to locally edit a file that's only available via {{{2
+ another server accessible via ssh?
+ See http://stackoverflow.com/questions/12469645/
+ "Using Vim to Remotely Edit A File on ServerB Only
+ Accessible From ServerA"
+
+ *netrw-P19*
+ P19. How do I get numbering on in directory listings? {{{2
+ With |g:netrw_bufsettings|, you can control netrw's buffer
+ settings; try putting >
+ let g:netrw_bufsettings="noma nomod nu nobl nowrap ro nornu"
+< in your .vimrc. If you'd like to have relative numbering
+ instead, try >
+ let g:netrw_bufsettings="noma nomod nonu nobl nowrap ro rnu"
+<
+ *netrw-P20*
+ P20. How may I have gvim start up showing a directory listing? {{{2
+ Try putting the following code snippet into your .vimrc: >
+ augroup VimStartup
+ au!
+ au VimEnter * if expand("%") == "" && argc() == 0 &&
+ \ (v:servername =~ 'GVIM\d*' || v:servername == "")
+ \ | e . | endif
+ augroup END
+< You may use Lexplore instead of "e" if you're so inclined.
+ This snippet assumes that you have client-server enabled
+ (ie. a "huge" vim version).
+
+ *netrw-P21*
+ P21. I've made a directory (or file) with an accented character, {{{2
+ 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
+ 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: >
+
+ au FileType netrw set enc=latin1
+<
+ *netrw-P22*
+ P22. I get an error message when I try to copy or move a file: {{{2
+
+ **error** (netrw) tried using g:netrw_localcopycmd<cp>; it doesn't work!
+
+ What's wrong?
+
+ Netrw uses several system level commands to do things (see
+
+ |g:netrw_localcopycmd|, |g:netrw_localmovecmd|,
+ |g:netrw_localrmdir|, |g:netrw_mkdir_cmd|).
+
+ You may need to adjust the default commands for one or more of
+ these commands by setting them properly in your .vimrc. Another
+ source of difficulty is that these commands use vim's local
+ directory, which may not be the same as the browsing directory
+ shown by netrw (see |g:netrw_keepdir|).
+
+
+==============================================================================
+11. Debugging Netrw Itself *netrw-debug* {{{1
+
+Step 1: check that the problem you've encountered hasn't already been resolved
+by obtaining a copy of the latest (often developmental) netrw at:
+
+ http://www.drchip.org/astronaut/vim/index.html#NETRW
+
+The <netrw.vim> script is typically installed on systems as something like:
+>
+ /usr/local/share/vim/vim8x/plugin/netrwPlugin.vim
+ /usr/local/share/vim/vim8x/autoload/netrw.vim
+ (see output of :echo &rtp)
+<
+which is loaded automatically at startup (assuming :set nocp). If you
+installed a new netrw, then it will be located at >
+
+ $HOME/.vim/plugin/netrwPlugin.vim
+ $HOME/.vim/autoload/netrw.vim
+<
+Step 2: assuming that you've installed the latest version of netrw,
+check that your problem is really due to netrw. Create a file
+called netrw.vimrc with the following contents: >
+
+ set nocp
+ so $HOME/.vim/plugin/netrwPlugin.vim
+<
+Then run netrw as follows: >
+
+ vim -u netrw.vimrc --noplugins -i NONE [some path here]
+<
+Perform whatever netrw commands you need to, and check that the problem is
+still present. This procedure sidesteps any issues due to personal .vimrc
+settings, .viminfo file, and other plugins. If the problem does not appear,
+then you need to determine which setting in your .vimrc is causing the
+conflict with netrw or which plugin(s) is/are involved.
+
+Step 3: If the problem still is present, then get a debugging trace from
+netrw:
+
+ 1. Get the <Decho.vim> script, available as:
+
+ http://www.drchip.org/astronaut/vim/index.html#DECHO
+ or
+ http://vim.sourceforge.net/scripts/script.php?script_id=120
+
+ Decho.vim is provided as a "vimball"; see |vimball-intro|. You
+ should edit the Decho.vba.gz file and source it in: >
+
+ vim Decho.vba.gz
+ :so %
+ :q
+<
+ 2. To turn on debug tracing in netrw, then edit the <netrw.vim>
+ file by typing: >
+
+ vim netrw.vim
+ :DechoOn
+ :wq
+<
+ To restore to normal non-debugging behavior, re-edit <netrw.vim>
+ and type >
+
+ vim netrw.vim
+ :DechoOff
+ :wq
+<
+ This command, provided by <Decho.vim>, will comment out all
+ Decho-debugging statements (Dfunc(), Dret(), Decho(), Dredir()).
+
+ 3. Then bring up vim and attempt to evoke the problem by doing a
+ transfer or doing some browsing. A set of messages should appear
+ concerning the steps that <netrw.vim> took in attempting to
+ read/write your file over the network in a separate tab or
+ server vim window.
+
+ Change the netrw.vimrc file to include the Decho plugin: >
+
+ set nocp
+ so $HOME/.vim/plugin/Decho.vim
+ so $HOME/.vim/plugin/netrwPlugin.vim
+<
+ You should continue to run vim with >
+
+ vim -u netrw.vimrc --noplugins -i NONE [some path here]
+<
+ to avoid entanglements with options and other plugins.
+
+ To save the file: under linux, the output will be in a separate
+ remote server window; in it, just save the file with >
+
+ :w! DBG
+
+< Under a vim that doesn't support clientserver, your debugging
+ output will appear in another tab: >
+
+ :tabnext
+ :set bt=
+ :w! DBG
+<
+ Furthermore, it'd be helpful if you would type >
+
+ :Dsep <command>
+
+< where <command> is the command you're about to type next,
+ thereby making it easier to associate which part of the
+ debugging trace is due to which command.
+
+ Please send that information to <netrw.vim>'s maintainer along
+ with the o/s you're using and the vim version that you're using
+ (see |:version|) (remove the embedded NOSPAM first) >
+
+ NcampObell@SdrPchip.AorgM-NOSPAM
+<
+==============================================================================
+12. History *netrw-history* {{{1
+
+ v171: Oct 09, 2020 * included code in s:NetrwOptionsSafe()
+ to allow |'bh'| to be set to delete when
+ rather than hide when g:netrw_fastbrowse
+ was zero.
+ * Installed |g:netrw_clipboard| setting
+ * Installed option bypass for |'guioptions'|
+ a/A settings
+ * Changed popup_beval() to |popup_atcursor()|
+ in netrw#ErrorMsg (lacygoill). Apparently
+ popup_beval doesn't reliably close the
+ popup when the mouse is moved.
+ * VimEnter() now using win_execute to examine
+ buffers for an attempt to open a directory.
+ Avoids issues with popups/terminal from
+ command line. (lacygoill)
+ Jun 28, 2021 * (zeertzjq) provided a patch for use of
+ xmap,xno instead of vmap,vno in
+ netrwPlugin.vim. Avoids entanglement with
+ select mode.
+ Jul 14, 2021 * Fixed problem addressed by tst976; opening
+ a file using tree mode, going up a
+ directory, and opening a file there was
+ opening the file in the wrong directory.
+ Jul 28, 2021 * (Ingo Karkat) provided a patch fixing an
+ E488 error with netrwPlugin.vim
+ (occurred for vim versions < 8.02)
+ v170: Mar 11, 2020 * (reported by Reiner Herrmann) netrw+tree
+ would not hide with the ^\..* pattern
+ correctly.
+ * (Marcin Szamotulski) NetrwOptionRestore
+ did not restore options correctly that
+ had a single quote in the option string.
+ Apr 13, 2020 * implemented error handling via popup
+ windows (see |popup_beval()|)
+ Apr 30, 2020 * (reported by Manatsu Takahashi) while
+ using Lexplore, a modified file could
+ be overwritten. Sol'n: will not overwrite,
+ but will emit an |E37| (although one cannot
+ add an ! to override)
+ Jun 07, 2020 * (reported by Jo Totland) repeatedly invoking
+ :Lexplore and quitting it left unused
+ hidden buffers. Netrw will now set netrw
+ buffers created by :Lexplore to |'bh'|=wipe.
+ v169: Dec 20, 2019 * (reported by amkarthik) that netrw's x
+ (|netrw-x|) would throw an error when
+ attempting to open a local directory.
+ v168: Dec 12, 2019 * scp timeout error message not reported,
+ hopefully now fixed (Shane Xb Qian)
+ v167: Nov 29, 2019 * netrw does a save&restore on @* and @+.
+ That causes problems with the clipboard.
+ Now restores occurs only if @* or @+ have
+ been changed.
+ * netrw will change @* or @+ less often.
+ Never if I happen to have caught all the
+ operations that modify the unnamed
+ register (which also writes @*).
+ * Modified hiding behavior so that "s"
+ will not ignore hiding.
+ v166: Nov 06, 2019 * Removed a space from a nmap for "-"
+ * Numerous debugging statement changes
+ v163: Dec 05, 2017 * (Cristi Balan) reported that a setting ('sel')
+ was left changed
+ * (Holger Mitschke) reported a problem with
+ saving and restoring history. Fixed.
+ * Hopefully I fixed a nasty bug that caused a
+ file rename to wipe out a buffer that it
+ should not have wiped out.
+ * (Holger Mitschke) amended this help file
+ with additional |g:netrw_special_syntax|
+ items
+ * Prioritized wget over curl for
+ g:netrw_http_cmd
+ v162: Sep 19, 2016 * (haya14busa) pointed out two syntax errors
+ with a patch; these are now fixed.
+ Oct 26, 2016 * I started using mate-terminal and found that
+ x and gx (|netrw-x| and |netrw-gx|) were no
+ longer working. Fixed (using atril when
+ $DESKTOP_SESSION is "mate").
+ Nov 04, 2016 * (Martin Vuille) pointed out that @+ was
+ being restored with keepregstar rather than
+ keepregplus.
+ Nov 09, 2016 * Broke apart the command from the options,
+ mostly for Windows. Introduced new netrw
+ settings: |g:netrw_localcopycmdopt|
+ |g:netrw_localcopydircmdopt| |g:netrw_localmkdiropt|
+ |g:netrw_localmovecmdopt| |g:netrw_localrmdiropt|
+ Nov 21, 2016 * (mattn) provided a patch for preview; swapped
+ winwidth() with winheight()
+ Nov 22, 2016 * (glacambre) reported that files containing
+ spaces weren't being obtained properly via
+ scp. Fix: apparently using single quotes
+ such as with 'file name' wasn't enough; the
+ spaces inside the quotes also had to be
+ escaped (ie. 'file\ name').
+ * Also fixed obtain (|netrw-O|) to be able to
+ obtain files with spaces in their names
+ Dec 20, 2016 * (xc1427) Reported that using "I" (|netrw-I|)
+ when atop "Hiding" in the banner also caused
+ the active-banner hiding control to occur
+ Jan 03, 2017 * (Enno Nagel) reported that attempting to
+ apply netrw to a directory that was without
+ read permission caused a syntax error.
+ Jan 13, 2017 * (Ingo Karkat) provided a patch which makes
+ using netrw#Call() better. Now returns
+ value of internal routines return, for example.
+ Jan 13, 2017 * (Ingo Karkat) changed netrw#FileUrlRead to
+ use |:edit| instead of |:read|. I also
+ changed the routine name to netrw#FileUrlEdit.
+ Jan 16, 2017 * (Sayem) reported a problem where :Lexplore
+ could generate a new listing buffer and
+ window instead of toggling the netrw display.
+ Unfortunately, the directions for eliciting
+ the problem weren't complete, so I may or
+ may not have fixed that issue.
+ Feb 06, 2017 * Implemented cb and cB. Changed "c" to "cd".
+ (see |netrw-cb|, |netrw-cB|, and |netrw-cd|)
+ Mar 21, 2017 * previously, netrw would specify (safe) settings
+ even when the setting was already safe for
+ netrw. Netrw now attempts to leave such
+ already-netrw-safe settings alone.
+ (affects s:NetrwOptionRestore() and
+ s:NetrwSafeOptions(); also introduced
+ s:NetrwRestoreSetting())
+ Jun 26, 2017 * (Christian Brabandt) provided a patch to
+ allow curl to follow redirects (ie. -L
+ option)
+ Jun 26, 2017 * (Callum Howard) reported a problem with
+ :Lexpore not removing the Lexplore window
+ after a change-directory
+ Aug 30, 2017 * (Ingo Karkat) one cannot switch to the
+ previously edited file (e.g. with CTRL-^)
+ after editing a file:// URL. Patch to
+ have a "keepalt" included.
+ Oct 17, 2017 * (Adam Faryna) reported that gn (|netrw-gn|)
+ did not work on directories in the current
+ tree
+ v157: Apr 20, 2016 * (Nicola) had set up a "nmap <expr> ..." with
+ a function that returned a 0 while silently
+ invoking a shell command. The shell command
+ activated a ShellCmdPost event which in turn
+ called s:LocalBrowseRefresh(). That looks
+ over all netrw buffers for changes needing
+ refreshes. However, inside a |:map-<expr>|,
+ tab and window changes are disallowed. Fixed.
+ (affects netrw's s:LocalBrowseRefresh())
+ * |g:netrw_localrmdir| not used any more, but
+ the relevant patch that causes |delete()| to
+ take over was #1107 (not #1109).
+ * |expand()| is now used on |g:netrw_home|;
+ consequently, g:netrw_home may now use
+ environment variables
+ * s:NetrwLeftmouse and s:NetrwCLeftmouse will
+ return without doing anything if invoked
+ when inside a non-netrw window
+ Jun 15, 2016 * gx now calls netrw#GX() which returns
+ the word under the cursor. The new
+ wrinkle: if one is in a netrw buffer,
+ then netrw's s:NetrwGetWord().
+ Jun 22, 2016 * Netrw was executing all its associated
+ Filetype commands silently; I'm going
+ to try doing that "noisily" and see if
+ folks have a problem with that.
+ Aug 12, 2016 * Changed order of tool selection for
+ handling http://... viewing.
+ (Nikolay Aleksandrovich Pavlov)
+ Aug 21, 2016 * Included hiding/showing/all for tree
+ listings
+ * Fixed refresh (^L) for tree listings
+ 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
+ window.
+ Nov 05, 2015 * Improved s:TreeSqueezeDir() to use search()
+ instead of a loop
+ * NetrwBrowse() will return line to
+ w:netrw_bannercnt if cursor ended up in
+ banner
+ Nov 16, 2015 * Added a <Plug>NetrwTreeSqueeze (|netrw-s-cr|)
+ Nov 17, 2015 * Commented out imaps -- perhaps someone can
+ tell me how they're useful and should be
+ retained?
+ Nov 20, 2015 * Added |netrw-ma| and |netrw-mA| support
+ Nov 20, 2015 * gx (|netrw-gx|) on a URL downloaded the
+ file in addition to simply bringing up the
+ URL in a browser. Fixed.
+ Nov 23, 2015 * Added |g:netrw_sizestyle| support
+ Nov 27, 2015 * Inserted a lot of <c-u>s into various netrw
+ maps.
+ Jan 05, 2016 * |netrw-qL| implemented to mark files based
+ upon |location-list|s; similar to |netrw-qF|.
+ Jan 19, 2016 * using - call delete(directoryname,"d") -
+ instead of using g:netrw_localrmdir if
+ v7.4 + patch#1107 is available
+ Jan 28, 2016 * changed to using |winsaveview()| and
+ |winrestview()|
+ Jan 28, 2016 * s:NetrwTreePath() now does a save and
+ restore of view
+ Feb 08, 2016 * Fixed a tree-listing problem with remote
+ directories
+ v154: Feb 26, 2015 * (Yuri Kanivetsky) reported a situation where
+ a file was not treated properly as a file
+ due to g:netrw_keepdir == 1
+ Mar 25, 2015 * (requested by Ben Friz) one may now sort by
+ extension
+ Mar 28, 2015 * (requested by Matt Brooks) netrw has a lot
+ of buffer-local mappings; however, some
+ plugins (such as vim-surround) set up
+ conflicting mappings that cause vim to wait.
+ The "<nowait>" modifier has been included
+ with most of netrw's mappings to avoid that
+ delay.
+ Jun 26, 2015 * |netrw-gn| mapping implemted
+ * :Ntree NotADir resulted in having
+ the tree listing expand in the error messages
+ window. Fixed.
+ Jun 29, 2015 * Attempting to delete a file remotely caused
+ an error with "keepsol" mentioned; fixed.
+ Jul 08, 2015 * Several changes to keep the |:jumps| table
+ correct when working with
+ |g:netrw_fastbrowse| set to 2
+ * wide listing with accented characters fixed
+ (using %-S instead of %-s with a |printf()|
+ Jul 13, 2015 * (Daniel Hahler) CheckIfKde() could be true
+ but kfmclient not installed. Changed order
+ in netrw#BrowseX(): checks if kde and
+ kfmclient, then will use xdg-open on a unix
+ system (if xdg-open is executable)
+ Aug 11, 2015 * (McDonnell) tree listing mode wouldn't
+ select a file in a open subdirectory.
+ * (McDonnell) when multiple subdirectories
+ were concurrently open in tree listing
+ mode, a ctrl-L wouldn't refresh properly.
+ * The netrw:target menu showed duplicate
+ entries
+ Oct 13, 2015 * (mattn) provided an exception to handle
+ windows with shellslash set but no shell
+ Oct 23, 2015 * if g:netrw_usetab and <c-tab> now used
+ to control whether NetrwShrink is used
+ (see |netrw-c-tab|)
+ v153: May 13, 2014 * added another |g:netrw_ffkeep| usage {{{2
+ May 14, 2014 * changed s:PerformListing() so that it
+ always sets ft=netrw for netrw buffers
+ (ie. even when syntax highlighting is
+ off, not available, etc)
+ May 16, 2014 * introduced the |netrw-ctrl-r| functionality
+ May 17, 2014 * introduced the |netrw-:NetrwMB| functionality
+ * mb and mB (|netrw-mb|, |netrw-mB|) will
+ add/remove marked files from bookmark list
+ May 20, 2014 * (Enno Nagel) reported that :Lex <dirname>
+ wasn't working. Fixed.
+ May 26, 2014 * restored test to prevent leftmouse window
+ resizing from causing refresh.
+ (see s:NetrwLeftmouse())
+ * fixed problem where a refresh caused cursor
+ to go just under the banner instead of
+ staying put
+ May 28, 2014 * (László Bimba) provided a patch for opening
+ the |:Lexplore| window 100% high, optionally
+ on the right, and will work with remote
+ files.
+ May 29, 2014 * implemented :NetrwC (see |netrw-:NetrwC|)
+ Jun 01, 2014 * Removed some "silent"s from commands used
+ to implemented scp://... and pscp://...
+ directory listing. Permits request for
+ password to appear.
+ Jun 05, 2014 * (Enno Nagel) reported that user maps "/"
+ caused problems with "b" and "w", which
+ are mapped (for wide listings only) to
+ skip over files rather than just words.
+ Jun 10, 2014 * |g:netrw_gx| introduced to allow users to
+ override default "<cfile>" with the gx
+ (|netrw-gx|) map
+ Jun 11, 2014 * gx (|netrw-gx|), with |'autowrite'| set,
+ will write modified files. s:NetrwBrowseX()
+ will now save, turn off, and restore the
+ |'autowrite'| setting.
+ Jun 13, 2014 * added visual map for gx use
+ Jun 15, 2014 * (Enno Nagel) reported that with having hls
+ set and wide listing style in use, that the
+ b and w maps caused unwanted highlighting.
+ Jul 05, 2014 * |netrw-mv| and |netrw-mX| commands included
+ Jul 09, 2014 * |g:netrw_keepj| included, allowing optional
+ keepj
+ Jul 09, 2014 * fixing bugs due to previous update
+ Jul 21, 2014 * (Bruno Sutic) provided an updated
+ netrw_gitignore.vim
+ Jul 30, 2014 * (Yavuz Yetim) reported that editing two
+ remote files of the same name caused the
+ second instance to have a "temporary"
+ name. Fixed: now they use the same buffer.
+ Sep 18, 2014 * (Yasuhiro Matsumoto) provided a patch which
+ allows scp and windows local paths to work.
+ Oct 07, 2014 * gx (see |netrw-gx|) when atop a directory,
+ will now do |gf| instead
+ Nov 06, 2014 * For cygwin: cygstart will be available for
+ netrw#BrowseX() to use if its executable.
+ Nov 07, 2014 * Began support for file://... urls. Will use
+ |g:netrw_file_cmd| (typically elinks or links)
+ Dec 02, 2014 * began work on having mc (|netrw-mc|) copy
+ directories. Works for linux machines,
+ cygwin+vim, but not for windows+gvim.
+ Dec 02, 2014 * in tree mode, netrw was not opening
+ directories via symbolic links.
+ Dec 02, 2014 * added resolved link information to
+ thin and tree modes
+ Dec 30, 2014 * (issue#231) |:ls| was not showing
+ remote-file buffers reliably. Fixed.
+ v152: Apr 08, 2014 * uses the |'noswapfile'| option (requires {{{2
+ vim 7.4 with patch 213)
+ * (Enno Nagel) turn |'rnu'| off in netrw
+ buffers.
+ * (Quinn Strahl) suggested that netrw
+ allow regular window splitting to occur,
+ thereby allowing |'equalalways'| to take
+ effect.
+ * (qingtian zhao) normally, netrw will
+ save and restore the |'fileformat'|;
+ however, sometimes that isn't wanted
+ Apr 14, 2014 * whenever netrw marks a buffer as ro,
+ it will also mark it as nomod.
+ Apr 16, 2014 * sftp protocol now supported by
+ netrw#Obtain(); this means that one
+ may use "mc" to copy a remote file
+ to a local file using sftp, and that
+ the |netrw-O| command can obtain remote
+ files via sftp.
+ * added [count]C support (see |netrw-C|)
+ Apr 18, 2014 * when |g:netrw_chgwin| is one more than
+ the last window, then vertically split
+ the last window and use it as the
+ chgwin window.
+ May 09, 2014 * SavePosn was "saving filename under cursor"
+ from a non-netrw window when using :Rex.
+ v151: Jan 22, 2014 * extended :Rexplore to return to buffer {{{2
+ prior to Explore or editing a directory
+ * (Ken Takata) netrw gave error when
+ clipboard was disabled. Sol'n: Placed
+ several if has("clipboard") tests in.
+ * Fixed ftp://X@Y@Z// problem; X@Y now
+ part of user id, and only Z is part of
+ hostname.
+ * (A Loumiotis) reported that completion
+ using a directory name containing spaces
+ did not work. Fixed with a retry in
+ netrw#Explore() which removes the
+ backslashes vim inserted.
+ Feb 26, 2014 * :Rexplore now records the current file
+ using w:netrw_rexfile when returning via
+ |:Rexplore|
+ Mar 08, 2014 * (David Kotchan) provided some patches
+ allowing netrw to work properly with
+ windows shares.
+ * Multiple one-liner help messages available
+ by pressing <cr> while atop the "Quick
+ Help" line
+ * worked on ShellCmdPost, FocusGained event
+ handling.
+ * |:Lexplore| path: will be used to update
+ a left-side netrw browsing directory.
+ Mar 12, 2014 * |netrw-s-cr|: use <s-cr> to close
+ tree directory implemented
+ Mar 13, 2014 * (Tony Mechylynck) reported that using
+ the browser with ftp on a directory,
+ and selecting a gzipped txt file, that
+ an E19 occurred (which was issued by
+ gzip.vim). Fixed.
+ Mar 14, 2014 * Implemented :MF and :MT (see |netrw-:MF|
+ and |netrw-:MT|, respectively)
+ Mar 17, 2014 * |:Ntree| [dir] wasn't working properly; fixed
+ Mar 18, 2014 * Changed all uses of set to setl
+ Mar 18, 2014 * Commented the netrw_btkeep line in
+ s:NetrwOptionSave(); the effect is that
+ netrw buffers will remain as |'bt'|=nofile.
+ This should prevent swapfiles being created
+ for netrw buffers.
+ Mar 20, 2014 * Changed all uses of lcd to use s:NetrwLcd()
+ instead. Consistent error handling results
+ and it also handles Window's shares
+ * Fixed |netrw-d| command when applied with ftp
+ * https: support included for netrw#NetRead()
+ v150: Jul 12, 2013 * removed a "keepalt" to allow ":e #" to {{{2
+ return to the netrw directory listing
+ Jul 13, 2013 * (Jonas Diemer) suggested changing
+ a <cWORD> to <cfile>.
+ Jul 21, 2013 * (Yuri Kanivetsky) reported that netrw's
+ use of mkdir did not produce directories
+ following the user's umask.
+ Aug 27, 2013 * introduced |g:netrw_altfile| option
+ Sep 05, 2013 * s:Strlen() now uses |strdisplaywidth()|
+ when available, by default
+ Sep 12, 2013 * (Selyano Baldo) reported that netrw wasn't
+ opening some directories properly from the
+ command line.
+ Nov 09, 2013 * |:Lexplore| introduced
+ * (Ondrej Platek) reported an issue with
+ netrw's trees (P15). Fixed.
+ * (Jorge Solis) reported that "t" in
+ tree mode caused netrw to forget its
+ line position.
+ Dec 05, 2013 * Added <s-leftmouse> file marking
+ (see |netrw-mf|)
+ Dec 05, 2013 * (Yasuhiro Matsumoto) Explore should use
+ strlen() instead s:Strlen() when handling
+ multibyte chars with strpart()
+ (ie. strpart() is byte oriented, not
+ display-width oriented).
+ Dec 09, 2013 * (Ken Takata) Provided a patch; File sizes
+ and a portion of timestamps were wrongly
+ highlighted with the directory color when
+ setting `:let g:netrw_liststyle=1` on Windows.
+ * (Paul Domaskis) noted that sometimes
+ cursorline was activating in non-netrw
+ windows. All but one setting of cursorline
+ was done via setl; there was one that was
+ overlooked. Fixed.
+ Dec 24, 2013 * (esquifit) asked that netrw allow the
+ /cygdrive prefix be a user-alterable
+ parameter.
+ Jan 02, 2014 * Fixed a problem with netrw-based ballon
+ evaluation (ie. netrw#NetrwBaloonHelp()
+ not having been loaded error messages)
+ Jan 03, 2014 * Fixed a problem with tree listings
+ * New command installed: |:Ntree|
+ Jan 06, 2014 * (Ivan Brennan) reported a problem with
+ |netrw-P|. Fixed.
+ Jan 06, 2014 * Fixed a problem with |netrw-P| when the
+ modified file was to be abandoned.
+ Jan 15, 2014 * (Matteo Cavalleri) reported that when the
+ banner is suppressed and tree listing is
+ used, a blank line was left at the top of
+ the display. Fixed.
+ Jan 20, 2014 * (Gideon Go) reported that, in tree listing
+ style, with a previous window open, that
+ the wrong directory was being used to open
+ a file. Fixed. (P21)
+ v149: Apr 18, 2013 * in wide listing format, now have maps for {{{2
+ w and b to move to next/previous file
+ Apr 26, 2013 * one may now copy files in the same
+ directory; netrw will issue requests for
+ what names the files should be copied under
+ Apr 29, 2013 * Trying Benzinger's problem again. Seems
+ that commenting out the BufEnter and
+ installing VimEnter (only) works. Weird
+ problem! (tree listing, vim -O Dir1 Dir2)
+ May 01, 2013 * :Explore ftp://... wasn't working. Fixed.
+ May 02, 2013 * introduced |g:netrw_bannerbackslash| as
+ requested by Paul Domaskis.
+ Jul 03, 2013 * Explore now avoids splitting when a buffer
+ will be hidden.
+ v148: Apr 16, 2013 * changed Netrw's Style menu to allow direct {{{2
+ choice of listing style, hiding style, and
+ sorting style
+
+==============================================================================
+13. Todo *netrw-todo* {{{1
+
+07/29/09 : banner :|g:netrw_banner| can be used to suppress the
+ suppression banner. This feature is new and experimental,
+ so its in the process of being debugged.
+09/04/09 : "gp" : See if it can be made to work for remote systems.
+ : See if it can be made to work with marked files.
+
+==============================================================================
+14. Credits *netrw-credits* {{{1
+
+ Vim editor by Bram Moolenaar (Thanks, Bram!)
+ dav support by C Campbell
+ fetch support by Bram Moolenaar and C Campbell
+ ftp support by C Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+ http support by Bram Moolenaar <bram@moolenaar.net>
+ rcp
+ rsync support by C Campbell (suggested by Erik Warendorph)
+ scp support by raf <raf@comdyn.com.au>
+ sftp support by C Campbell
+
+ inputsecret(), BufReadCmd, BufWriteCmd contributed by C Campbell
+
+ Jérôme Augé -- also using new buffer method with ftp+.netrc
+ Bram Moolenaar -- obviously vim itself, :e and v:cmdarg use,
+ fetch,...
+ Yasuhiro Matsumoto -- pointing out undo+0r problem and a solution
+ Erik Warendorph -- for several suggestions (g:netrw_..._cmd
+ variables, rsync etc)
+ Doug Claar -- modifications to test for success with ftp
+ operation
+
+==============================================================================
+Modelines: {{{1
+vim:tw=78:ts=8:ft=help:noet:norl:fdm=marker
diff --git a/runtime/doc/pi_paren.txt b/runtime/doc/pi_paren.txt
new file mode 100644
index 0000000..9af0e9c
--- /dev/null
+++ b/runtime/doc/pi_paren.txt
@@ -0,0 +1,60 @@
+*pi_paren.txt* For Vim version 9.0. Last change: 2013 May 08
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Highlighting matching parens *matchparen*
+
+The functionality mentioned here is a |standard-plugin|.
+This plugin is only available if 'compatible' is not set.
+
+You can avoid loading this plugin by setting the "loaded_matchparen" variable: >
+ :let loaded_matchparen = 1
+
+The plugin installs CursorMoved, CursorMovedI and WinEnter autocommands to
+redefine the match highlighting.
+
+ *:NoMatchParen* *:DoMatchParen*
+To disable the plugin after it was loaded use this command: >
+
+ :NoMatchParen
+
+And to enable it again: >
+
+ :DoMatchParen
+
+The highlighting used is MatchParen. You can specify different colors with
+the ":highlight" command. Example: >
+
+ :hi MatchParen ctermbg=blue guibg=lightblue
+
+The characters to be matched come from the 'matchpairs' option. You can
+change the value to highlight different matches. Note that not everything is
+possible. For example, you can't highlight single or double quotes, because
+the start and end are equal.
+
+The syntax highlighting attributes are used. When the cursor currently is not
+in a string or comment syntax item, then matches inside string and comment
+syntax items are ignored. Any syntax items with "string" or "comment"
+somewhere in their name are considered string or comment items.
+
+The search is limited to avoid a delay when moving the cursor. The limits
+are:
+- What is visible in the window.
+- 100 lines above or below the cursor to avoid a long delay when there are
+ closed folds.
+- 'synmaxcol' times 2 bytes before or after the cursor to avoid a delay
+ in a long line with syntax highlighting.
+- A timeout of 300 msec (60 msec in Insert mode). This can be changed with the
+ g:matchparen_timeout and g:matchparen_insert_timeout variables and their
+ buffer-local equivalents b:matchparen_timeout and
+ b:matchparen_insert_timeout.
+
+If you would like the |%| command to work better, the matchit plugin can be
+used, see |matchit-install|. 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:noet:ft=help:norl:
diff --git a/runtime/doc/pi_spec.txt b/runtime/doc/pi_spec.txt
new file mode 100644
index 0000000..27d60b8
--- /dev/null
+++ b/runtime/doc/pi_spec.txt
@@ -0,0 +1,111 @@
+*pi_spec.txt* For Vim version 9.0. Last change: 2006 Apr 24
+
+by Gustavo Niemeyer ~
+
+This is a filetype plugin to work with rpm spec files.
+
+Currently, this Vim plugin allows you to easily update the %changelog
+section in RPM spec files. It will even create a section for you if it
+doesn't exist yet. If you've already inserted an entry today, it will
+give you the opportunity to just add a new item in today's entry. If you
+don't provide a format string (|spec_chglog_format|), it'll ask you an
+email address and build a format string by itself.
+
+1. How to use it |spec-how-to-use-it|
+2. Customizing |spec-customizing|
+
+==============================================================================
+1. How to use it *spec-how-to-use-it*
+
+The spec_chglog plugin provides a map like the following:
+
+ :map <buffer> <LocalLeader>c <Plug>SpecChangelog
+
+It means that you may run the plugin inside a spec file by pressing
+your maplocalleader key (default is '\') plus 'c'. If you do not have
+|spec_chglog_format| set, the plugin will ask you for an email address
+to use in this edit session.
+
+Every time you run the plugin, it will check to see if the last entry in the
+changelog has been written today and by you. If the entry matches, it will
+just insert a new changelog item, otherwise it will create a new changelog
+entry. If you are running with |spec_chglog_release_info| enabled, it will
+also check if the name, version and release matches. The plugin is smart
+enough to ask you if it should update the package release, if you have not
+done so.
+
+Setting a map *spec-setting-a-map*
+-------------
+
+As you should know, you can easily set a map to access any Vim command (or
+anything, for that matter). If you don't like the default map of
+<LocalLeader>c, you may just set up your own key. The following line
+shows you how you could do this in your .vimrc file, mapping the plugin to
+the <F5> key:
+
+ au FileType spec map <buffer> <F5> <Plug>SpecChangelog
+
+Note: the plugin will respect your desire to change the default mapping
+ and won't set it.
+
+This command will add a map only in the spec file buffers.
+
+
+==============================================================================
+2. Customizing *spec-customizing*
+
+The format string *spec_chglog_format*
+-----------------
+
+You can easily customize how your spec file entry will look like. To do
+this just set the variable "spec_chglog_format" in your .vimrc file like
+this: >
+
+ let spec_chglog_format = "%a %b %d %Y My Name <my@email.com>"
+
+Note that "%a %b %d %Y" is the most used time format. If you don't provide
+a format string, when you run the SpecChangelog command for the first
+time, it will ask you an email address and build the |spec_chglog_format|
+variable for you. This way, you will only need to provide your email
+address once.
+
+To discover which format options you can use, take a look at the strftime()
+function man page.
+
+Where to insert new items *spec_chglog_prepend*
+-------------------------
+
+The plugin will usually insert new %changelog entry items (note that it's
+not the entry itself) after the existing ones. If you set the
+spec_chglog_prepend variable >
+
+ let spec_chglog_prepend = 1
+
+it will insert new items before the existing ones.
+
+Inserting release info *spec_chglog_release_info*
+----------------------
+
+If you want, the plugin may automatically insert release information
+on each changelog entry. One advantage of turning this feature on is
+that it may control if the release has been updated after the last
+change in the package or not. If you have not updated the package
+version or release, it will ask you if it should update the package
+release for you. To turn this feature on, just insert the following
+code in your .vimrc: >
+
+ let spec_chglog_release_info = 1
+
+Then, the first item in your changelog entry will be something like: >
+
+ + name-1.0-1cl
+
+If you don't like the release updating feature and don't want to answer
+"No" each time it detects an old release, you may disable it with >
+
+ let spec_chglog_never_increase_release = 1
+
+
+Good luck!!
+
+vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/pi_tar.txt b/runtime/doc/pi_tar.txt
new file mode 100644
index 0000000..37b2886
--- /dev/null
+++ b/runtime/doc/pi_tar.txt
@@ -0,0 +1,170 @@
+*pi_tar.txt* For Vim version 9.0. Last change: 2022 Oct 17
+
+ +====================+
+ | Tar File Interface |
+ +====================+
+
+Author: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+ (remove NOSPAM from Campbell's email first)
+Copyright 2005-2017: *tar-copyright*
+ The VIM LICENSE (see |copyright|) applies to the files in this
+ package, including tarPlugin.vim, tar.vim, and pi_tar.txt. Like
+ anything else that's except use "tar.vim" instead of "VIM". Like
+ anything else that's free, tar.vim and its associated files are
+ provided *as is* and comes with no warranty of any kind, either
+ expressed or implied. No guarantees of merchantability. No
+ guarantees of suitability for any purpose. 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. Use at your own risk!
+
+==============================================================================
+1. Contents *tar* *tar-contents*
+ 1. Contents..................................................|tar-contents|
+ 2. Usage.....................................................|tar-usage|
+ 3. Options...................................................|tar-options|
+ 4. History...................................................|tar-history|
+
+==============================================================================
+2. Usage *tar-usage* *tar-manual*
+
+ When one edits a *.tar file, this plugin will handle displaying a
+ contents page. Select a file to edit by moving the cursor atop
+ the desired file, then hit the <return> key. After editing, one may
+ also write to the file. Currently, one may not make a new file in
+ tar archives via the plugin.
+
+ *:Vimuntar*
+ VIMUNTAR~
+
+ :Vimuntar [vimhome]
+
+ This command copies, if necessary, the tarball to the .vim or vimfiles
+ directory using the first writable directory in the |'runtimepath'|
+ when no [vimhome] is specified. Otherwise, the [vimhome] argument
+ allows the user to specify that directory, instead.
+
+ The copy is done using the command in *g:tar_copycmd* , which is >
+ cp for cygwin, unix, macunix
+ copy for windows (32, 95, 64, 16)
+< The extraction is done with the command specified with
+ *g:tar_extractcmd* , which by default is >
+ "tar -xf"
+<
+ *:TarDiff*
+ DIFFERENCING SUPPORT~
+
+ :TarDiff [filename]
+
+ This command will attempt to show the differences between the tarball
+ version of a file and the associated file on the system. In order to
+ find that file on the system, the script uses the path associated with
+ the file mentioned in the tarball. If the current directory is not
+ correct for that path, :TarDiff will fail to find the associated file.
+
+ If the [filename] is given, that that filename (and path) will be used
+ to specify the associated file.
+
+
+ PREVENTING LOADING~
+
+ If for some reason you do not wish to use vim to examine tar'd files,
+ you may put the following two variables into your <.vimrc> to prevent
+ the tar plugin from loading: >
+
+ let g:loaded_tarPlugin= 1
+ let g:loaded_tar = 1
+<
+
+==============================================================================
+3. Options *tar-options*
+
+ These options are variables that one may change, typically in one's
+ <.vimrc> file.
+ Default
+ Variable Value Explanation
+ *g:tar_browseoptions* "Ptf" used to get a list of contents
+ *g:tar_readoptions* "OPxf" used to extract a file from a tarball
+ *g:tar_cmd* "tar" the name of the tar program
+ *g:tar_nomax* 0 if true, file window will not be maximized
+ *g:tar_secure* undef if exists:
+ "--"s will be used to prevent unwanted
+ option expansion in tar commands.
+ Please be sure that your tar command
+ accepts "--"; Posix compliant tar
+ utilities do accept them.
+ if not exists:
+ The tar plugin will reject any tar
+ files or member files that begin with
+ "-"
+ Not all tar's support the "--" which is why
+ it isn't default.
+ *g:tar_writeoptions* "uf" used to update/replace a file
+
+
+==============================================================================
+4. History *tar-history*
+
+ v31 Apr 02, 2017 * (klartext) reported that browsing encrypted
+ files in a zip archive created unencrypted
+ swap files. I am applying a similar fix
+ used on zip.vim to tar.vim: new buffers
+ are opened with |:noswapfile|.
+ May 16, 2017 * When the mouse option isn't empty, the
+ leftmouse can be used to select a file
+ in the tar-file listing.
+ v30 Apr 22, 2014 * .tgz files are ambiguous: they may have been
+ compressed with either gzip or bzip2. Tar.vim
+ disambiguates by using unix's "file" command.
+ Feb 18, 2016 * Changed =~ to =~# where appropriate
+ Feb 18, 2017 * Now also permits xz decompression
+ v28 Jun 23, 2011 * a few more decompression options (tbz tb2 txz)
+ v27 May 31, 2011 * moved cygwin detection before g:tar_copycmd
+ handling
+ * inserted additional |:keepj| modifiers
+ * changed silent to sil! (|:silent|)
+ v26 Aug 09, 2010 * uses buffer-local instead of window variables
+ to hold tarfile name
+ * inserted keepj before 0d to protect jump list
+ v25 Jun 19, 2010 * (Jan Steffens) added support for xz
+ compression
+ v24 Apr 07, 2009 * :Untarvim command implemented
+ Sep 28, 2009 * Added lzma support
+ v22 Aug 08, 2008 * security fixes
+ v16 Jun 06, 2008 * tarfile:: used instead of tarfile: when
+ editing files inside tarballs. Fixes a
+ problem with tarballs called things like
+ c:\abc.tar. (tnx to Bill McCarthy)
+ v14 May 09, 2008 * arno caught a security bug
+ May 28, 2008 * various security improvements. Now requires
+ patch 299 which provides the fnameescape()
+ function
+ May 30, 2008 * allows one to view *.gz and *.bz2 files that
+ are in *.tar files.
+ v12 Sep 07, 2007 * &shq now used if not the empty string for
+ g:tar_shq
+ v10 May 02, 2006 * now using "redraw then echo" to show messages,
+ instead of "echo and prompt user"
+ v9 May 02, 2006 * improved detection of masquerading as tar file
+ v8 May 02, 2006 * allows editing of files that merely masquerade
+ as tar files
+ v7 Mar 22, 2006 * work on making tar plugin work across network
+ Mar 27, 2006 * g:tar_cmd now available for users to change
+ the name of the tar program to be used. By
+ default, of course, it's "tar".
+ v6 Dec 21, 2005 * writing to files not in directories caused
+ problems - fixed (pointed out by
+ Christian Robinson)
+ v5 Nov 22, 2005 * report option workaround installed
+ v3 Sep 16, 2005 * handles writing files in an archive back to
+ the archive
+ Oct 18, 2005 * <amatch> used instead of <afile> in autocmds
+ Oct 18, 2005 * handles writing to compressed archives
+ Nov 03, 2005 * handles writing tarfiles across a network
+ using netrw#NetWrite()
+ v2 * converted to use Vim7's new autoload feature
+ by Bram Moolenaar
+ v1 (original) * Michael Toren
+ (see http://michael.toren.net/code/)
+
+==============================================================================
+vim:tw=78:ts=8:noet:ft=help
diff --git a/runtime/doc/pi_vimball.txt b/runtime/doc/pi_vimball.txt
new file mode 100644
index 0000000..045c5c4
--- /dev/null
+++ b/runtime/doc/pi_vimball.txt
@@ -0,0 +1,276 @@
+*pi_vimball.txt* For Vim version 9.0. Last change: 2016 Apr 11
+
+ ----------------
+ Vimball Archiver
+ ----------------
+
+Author: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+ (remove NOSPAM from Campbell's email first)
+Copyright: (c) 2004-2015 by Charles E. Campbell *Vimball-copyright*
+ The VIM LICENSE (see |copyright|) applies to the files in this
+ package, including vimballPlugin.vim, vimball.vim, and pi_vimball.txt.
+ except use "vimball" instead of "VIM". Like anything else that's free,
+ vimball.vim and its associated files are provided *as is* and comes with
+ no warranty of any kind, either expressed or implied. No guarantees
+ of merchantability. No guarantees of suitability for any purpose. 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. Use at your own risk!
+
+==============================================================================
+1. Contents *vba* *vimball* *vimball-contents*
+
+ 1. Contents......................................: |vimball-contents|
+ 2. Vimball Introduction..........................: |vimball-intro|
+ 3. Vimball Manual................................: |vimball-manual|
+ MkVimball.....................................: |:MkVimball|
+ UseVimball....................................: |:UseVimball|
+ RmVimball.....................................: |:RmVimball|
+ 4. Vimball History...............................: |vimball-history|
+
+
+==============================================================================
+2. Vimball Introduction *vimball-intro*
+
+ Vimball is intended to make life simpler for users of plugins. All
+ a user needs to do with a vimball is: >
+ vim someplugin.vba
+ :so %
+ :q
+< and the plugin and all its components will be installed into their
+ appropriate directories. Note that one doesn't need to be in any
+ particular directory when one does this. Plus, any help for the
+ plugin will also be automatically installed.
+
+ If a user has decided to use the AsNeeded plugin, vimball is smart
+ enough to put scripts nominally intended for .vim/plugin/ into
+ .vim/AsNeeded/ instead.
+
+ Removing a plugin that was installed with vimball is really easy: >
+ vim
+ :RmVimball someplugin
+< This operation is not at all easy for zips and tarballs, for example.
+
+ Vimball examines the user's |'runtimepath'| to determine where to put
+ the scripts. The first directory mentioned on the runtimepath is
+ usually used if possible. Use >
+ :echo &rtp
+< to see that directory.
+
+
+==============================================================================
+3. Vimball Manual *vimball-manual*
+
+MAKING A VIMBALL *:MkVimball*
+ :[range]MkVimball[!] filename [path]
+
+ The range is composed of lines holding paths to files to be included
+ in your new vimball, omitting the portion of the paths that is
+ normally specified by the runtimepath (|'rtp'|). As an example: >
+ plugin/something.vim
+ doc/something.txt
+< using >
+ :[range]MkVimball filename
+<
+ on this range of lines will create a file called "filename.vba" which
+ can be used by Vimball.vim to re-create these files. If the
+ "filename.vba" file already exists, then MkVimball will issue a
+ warning and not create the file. Note that these paths are relative
+ to your .vim (vimfiles) directory, and the files should be in that
+ directory. The vimball plugin normally uses the first |'runtimepath'|
+ directory that exists as a prefix; don't use absolute paths, unless
+ the user has specified such a path.
+
+ If you use the exclamation point (!), then MkVimball will create the
+ "filename.vba" file, overwriting it if it already exists. This
+ behavior resembles that for |:w|.
+
+ If you wish to force slashes into the filename, that can also be done
+ by using the exclamation mark (ie. :MkVimball! path/filename).
+
+ The tip at http://vim.wikia.com/wiki/Using_VimBall_with_%27Make%27
+ has a good idea on how to automate the production of vimballs using
+ make.
+
+
+MAKING DIRECTORIES VIA VIMBALLS *g:vimball_mkdir*
+
+ First, the |mkdir()| command is tried (not all systems support it).
+
+ If it doesn't exist, then if g:vimball_mkdir doesn't exist, it is set
+ as follows: >
+ |g:netrw_localmkdir|, if it exists
+ "mkdir" , if it is executable
+ "makedir" , if it is executable
+ Otherwise , it is undefined.
+< One may explicitly specify the directory making command using
+ g:vimball_mkdir. This command is used to make directories that
+ are needed as indicated by the vimball.
+
+
+CONTROLLING THE VIMBALL EXTRACTION DIRECTORY *g:vimball_home*
+
+ You may override the use of the |'runtimepath'| by specifying a
+ variable, g:vimball_home.
+
+ *vimball-extract*
+ vim filename.vba
+
+ Simply editing a Vimball will cause Vimball.vim to tell the user to
+ source the file to extract its contents.
+
+ Extraction will only proceed if the first line of a putative vimball
+ file holds the "Vimball Archiver by Charles E. Campbell" line.
+
+LISTING FILES IN A VIMBALL *:VimballList*
+
+ :VimballList
+
+ This command will tell Vimball to list the files in the archive, along
+ with their lengths in lines.
+
+MANUALLY INVOKING VIMBALL EXTRACTION *:UseVimball*
+
+ :UseVimball [path]
+
+ This command is contained within the vimball itself; it invokes the
+ vimball#Vimball() routine which is responsible for unpacking the
+ vimball. One may choose to execute it by hand instead of sourcing
+ the vimball; one may also choose to specify a path for the
+ installation, thereby overriding the automatic choice of the first
+ existing directory on the |'runtimepath'|.
+
+REMOVING A VIMBALL *:RmVimball*
+
+ :RmVimball vimballfile [path]
+
+ This command removes all files generated by the specified vimball
+ (but not any directories it may have made). One may choose a path
+ for de-installation, too (see |'runtimepath'|); otherwise, the
+ default is the first existing directory on the |'runtimepath'|.
+ To implement this, a file (.VimballRecord) is made in that directory
+ containing a record of what files need to be removed for all vimballs
+ used thus far.
+
+PREVENTING LOADING
+
+ If for some reason you don't want to be able to extract plugins
+ using vimballs: you may prevent the loading of vimball.vim by
+ putting the following two variables in your <.vimrc>: >
+
+ let g:loaded_vimballPlugin= 1
+ let g:loaded_vimball = 1
+<
+WINDOWS *vimball-windows*
+
+ Many vimball files are compressed with gzip. Windows, unfortunately,
+ does not come provided with a tool to decompress gzip'ped files.
+ Fortunately, there are a number of tools available for Windows users
+ to un-gzip files:
+>
+ Item Tool/Suite Free Website
+ ---- ---------- ---- -------
+ 7zip tool y http://www.7-zip.org/
+ Winzip tool n http://www.winzip.com/downwz.htm
+ unxutils suite y http://unxutils.sourceforge.net/
+ cygwin suite y http://www.cygwin.com/
+ GnuWin32 suite y http://gnuwin32.sourceforge.net/
+ MinGW suite y http://www.mingw.org/
+<
+
+==============================================================================
+4. Vimball History *vimball-history* {{{1
+
+ 37 : Jul 18, 2014 * (by request of T. Miedema) added augroup around
+ the autocmds in vimballPlugin.vim
+ Jul 06, 2015 * there are two uses of tabc; changed to tabc!
+ 34 : Sep 22, 2011 * "UseVimball path" now supports a non-full path by
+ prepending the current directory to it.
+ 33 : Apr 02, 2011 * Gave priority to *.vmb over *.vba
+ * Changed silent! to sil! (shorter)
+ * Safed |'swf'| setting (during vimball extraction,
+ its now turned off)
+ 32 : May 19, 2010 * (Christian Brabrandt) :so someplugin.vba and
+ :so someplugin.vba.gz (and the other supported
+ compression types) now works
+ * (Jan Steffens) added support for xz compression
+ * fenc extraction was erroneously picking up the
+ end of the line number when no file encoding
+ was present. Fixed.
+ * By request, beginning the switchover from the vba
+ extension to vmb. Currently both are supported;
+ MkVimball, however, now will create *.vmb files.
+ Feb 11, 2011 * motoyakurotsu reported an error with vimball's
+ handling of zero-length files
+ Feb 18, 2016 * Changed =~ to =~# where appropriate
+ 30 : Dec 08, 2008 * fnameescape() inserted to protect error
+ messaging using corrupted filenames from
+ causing problems
+ * RmVimball supports filenames that would
+ otherwise be considered to have "magic"
+ characters (ie. Abc[1].vba)
+ Feb 18, 2009 * s:Escape(), g:vimball_shq, and g:netrw_shq
+ removed (shellescape() used directly)
+ Oct 05, 2009 * (Nikolai Weibull) suggested that MkVimball
+ be allowed to use slashes in the filename.
+ 26 : May 27, 2008 * g:vimball_mkdir usage installed. Makes the
+ $HOME/.vim (or $HOME\vimfiles) directory if
+ necessary.
+ May 30, 2008 * (tnx to Bill McCarthy) found and fixed a bug:
+ vimball wasn't updating plugins to AsNeeded/
+ when it should
+ 25 : Mar 24, 2008 * changed vimball#Vimball() to recognize doc/*.??x
+ files as help files, too.
+ Apr 18, 2008 * RmVimball command is now protected by saving and
+ restoring settings -- in particular, acd was
+ causing problems as reported by Zhang Shuhan
+ 24 : Nov 15, 2007 * g:vimball_path_escape used by s:Path() to
+ prevent certain characters from causing trouble
+ (defunct: |fnameescape()| and |shellescape()|
+ now used instead)
+ 22 : Mar 21, 2007 * uses setlocal instead of set during BufEnter
+ 21 : Nov 27, 2006 * (tnx to Bill McCarthy) vimball had a header
+ handling problem and it now changes \s to /s
+ 20 : Nov 20, 2006 * substitute() calls have all had the 'e' flag
+ removed.
+ 18 : Aug 01, 2006 * vimballs now use folding to easily display their
+ contents.
+ * if a user has AsNeeded/somefile, then vimball
+ will extract plugin/somefile to the AsNeeded/
+ directory
+ 17 : Jun 28, 2006 * changes all \s to /s internally for Windows
+ 16 : Jun 15, 2006 * A. Mechelynck's idea to allow users to specify
+ installation root paths implemented for
+ UseVimball, MkVimball, and RmVimball.
+ * RmVimball implemented
+ 15 : Jun 13, 2006 * bugfix
+ 14 : May 26, 2006 * bugfixes
+ 13 : May 01, 2006 * exists("&acd") used to determine if the acd
+ option exists
+ 12 : May 01, 2006 * bugfix - the |'acd'| option is not always defined
+ 11 : Apr 27, 2006 * VimballList would create missing subdirectories that
+ the vimball specified were needed. Fixed.
+ 10 : Apr 27, 2006 * moved all setting saving/restoration to a pair of
+ functions. Included some more settings in them
+ which frequently cause trouble.
+ 9 : Apr 26, 2006 * various changes to support Windows' predilection
+ for backslashes and spaces in file and directory
+ names.
+ 7 : Apr 25, 2006 * bypasses foldenable
+ * uses more exe and less norm! (:yank :put etc)
+ * does better at insuring a "Press ENTER" prompt
+ appears to keep its messages visible
+ 4 : Mar 31, 2006 * BufReadPost seems to fire twice; BufReadEnter
+ only fires once, so the "Source this file..."
+ message is now issued only once.
+ 3 : Mar 20, 2006 * removed query, now requires sourcing to be
+ extracted (:so %). Message to that effect
+ included.
+ * :VimballList now shows files that would be
+ extracted.
+ 2 : Mar 20, 2006 * query, :UseVimball included
+ 1 : Mar 20, 2006 * initial release
+
+
+==============================================================================
+vim:tw=78:ts=8:noet:ft=help:fdm=marker
diff --git a/runtime/doc/pi_zip.txt b/runtime/doc/pi_zip.txt
new file mode 100644
index 0000000..a5b056f
--- /dev/null
+++ b/runtime/doc/pi_zip.txt
@@ -0,0 +1,160 @@
+*pi_zip.txt* For Vim version 9.0. Last change: 2022 Oct 17
+
+ +====================+
+ | Zip File Interface |
+ +====================+
+
+Author: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+ (remove NOSPAM from Campbell's email first)
+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
+ and its associated files are provided *as is* and comes with no
+ warranty of any kind, either expressed or implied. No guarantees of
+ merchantability. No guarantees of suitability for any purpose. 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. Use at your own risk!
+
+==============================================================================
+1. Contents *zip* *zip-contents*
+ 1. Contents................................................|zip-contents|
+ 2. Usage...................................................|zip-usage|
+ 3. Additional Extensions...................................|zip-extension|
+ 4. History.................................................|zip-history|
+
+==============================================================================
+2. Usage *zip-usage* *zip-manual*
+
+ When one edits a *.zip file, this plugin will handle displaying a
+ contents page. Select a file to edit by moving the cursor atop
+ the desired file, then hit the <return> key. After editing, one may
+ also write to the file. Currently, one may not make a new file in
+ zip archives via the plugin.
+
+ COMMANDS~
+ *zip-x*
+ x : extract a listed file when the cursor is atop it
+
+ OPTIONS~
+
+ *g:zip_nomax*
+
+ If this variable exists and is true, the file window will not be
+ automatically maximized when opened.
+
+ *g:zip_shq*
+ Different operating systems may use one or more shells to execute
+ commands. Zip will try to guess the correct quoting mechanism to
+ allow spaces and whatnot in filenames; however, if it is incorrectly
+ guessing the quote to use for your setup, you may use >
+ g:zip_shq
+< which by default is a single quote under Unix (') and a double quote
+ under Windows ("). If you'd rather have no quotes, simply set
+ g:zip_shq to the empty string (let g:zip_shq= "") in your <.vimrc>.
+
+ *g:zip_unzipcmd*
+ Use this option to specify the program which does the duty of "unzip".
+ It's used during browsing. By default: >
+ let g:zip_unzipcmd= "unzip"
+<
+ *g:zip_zipcmd*
+ Use this option to specify the program which does the duty of "zip".
+ It's used during the writing (updating) of a file already in a zip
+ 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,
+ you may put the following two variables into your <.vimrc> to prevent
+ the zip plugin from loading: >
+
+ let g:loaded_zipPlugin= 1
+ let g:loaded_zip = 1
+<
+
+==============================================================================
+3. Additional Extensions *zip-extension*
+
+ Apparently there are a number of archivers which generate zip files that
+ don't use the .zip extension (.jar, .xpi, etc). To handle such files,
+ place a line in your <.vimrc> file: >
+
+ au BufReadCmd *.jar,*.xpi call zip#Browse(expand("<amatch>"))
+<
+ 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
+ v32 Oct 22, 2021 * to avoid an issue with a vim 8.2 patch, zipfile: has
+ been changed to zipfile:// . This often shows up
+ as zipfile:/// with zipped files that are root-based.
+ v29 Apr 02, 2017 * (Klartext) reported that an encrypted zip file could
+ opened but the swapfile held unencrypted contents.
+ The solution is to edit the contents of a zip file
+ using the |:noswapfile| modifier.
+ 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
+ (consistent with the -p variant)
+ * (Ben Staniford) now uses
+ has("win32unix") && executable("cygpath")
+ before converting to cygwin-style paths
+ v24 Jun 21, 2010 * (Cédric Bosdonnat) unzip seems to need its filenames
+ fnameescape'd as well as shellquote'd
+ * (Motoya Kurotsu) inserted keepj before 0d to protect
+ jump list
+ v17 May 09, 2008 * arno caught a security bug
+ v15 Sep 07, 2007 * &shq now used if not the empty string for g:zip_shq
+ v14 May 07, 2007 * using b:zipfile instead of w:zipfile to avoid problem
+ when editing alternate file to bring up a zipfile
+ v10 May 02, 2006 * now using "redraw then echo" to show messages, instead
+ of "echo and prompt user"
+ * g:zip_shq provided to allow for quoting control for the
+ command being passed via :r! ... commands.
+ v8 Apr 10, 2006 * Bram Moolenaar reported that he received an error message
+ due to "Pattern not found: ^.*\%0c"; this was caused by
+ stridx finding a Name... at the beginning of the line;
+ zip.vim tried 4,$s/^.*\%0c//, but that doesn't work.
+ Fixed.
+ v7 Mar 22, 2006 * escaped some characters that can cause filename handling
+ problems.
+ v6 Dec 21, 2005 * writing to files not in directories caused problems -
+ fixed (pointed out by Christian Robinson)
+ v5 Nov 22, 2005 * report option workaround installed
+ v3 Oct 18, 2005 * <amatch> used instead of <afile> in autocmds
+ v2 Sep 16, 2005 * silenced some commands (avoiding hit-enter prompt)
+ * began testing under Windows; works thus far
+ * filetype detection fixed
+ Nov 03, 2005 * handles writing zipfiles across a network using
+ netrw#NetWrite()
+ v1 Sep 15, 2005 * Initial release, had browsing, reading, and writing
+
+==============================================================================
+vim:tw=78:ts=8:ft=help:noet:norl:fdm=marker
diff --git a/runtime/doc/popup.txt b/runtime/doc/popup.txt
new file mode 100644
index 0000000..463bc9a
--- /dev/null
+++ b/runtime/doc/popup.txt
@@ -0,0 +1,1104 @@
+*popup.txt* For Vim version 9.0. Last change: 2022 Oct 07
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Displaying text in a floating window. *popup* *popup-window* *popupwin*
+
+
+1. Introduction |popup-intro|
+ Window position and size |popup-position|
+ Closing the popup window |popup-close|
+ Popup buffer and window |popup-buffer|
+ Terminal in popup window |popup-terminal|
+2. Functions |popup-functions|
+ Details |popup-function-details|
+3. Usage |popup-usage|
+ popup_create() arguments |popup_create-arguments|
+ Popup text properties |popup-props|
+ Position popup with textprop |popup-textprop-pos|
+ Popup filter |popup-filter|
+ Popup callback |popup-callback|
+ Popup scrollbar |popup-scrollbar|
+ Popup mask |popup-mask|
+4. Examples |popup-examples|
+
+
+{not available if the |+popupwin| feature was disabled at compile time}
+
+==============================================================================
+1. Introduction *popup-intro*
+
+We are talking about popup windows here, text that goes on top of the regular
+windows and is under control of a plugin. You cannot edit the text in the
+popup window like with regular windows.
+
+A popup window can be used for such things as:
+- briefly show a message without overwriting the command line
+- prompt the user with a dialog
+- display contextual information while typing
+- give extra information for auto-completion
+
+The text in the popup window can be colored with |text-properties|. It is
+also possible to use syntax highlighting.
+
+The default color used is "Pmenu". If you prefer something else use the
+"highlight" argument or the 'wincolor' option, e.g.: >
+ hi MyPopupColor ctermbg=lightblue guibg=lightblue
+ call setwinvar(winid, '&wincolor', 'MyPopupColor')
+
+'hlsearch' highlighting is not displayed in a popup window.
+
+A popup window has a window-ID like other windows, but behaves differently.
+The size can be up to the whole Vim window and it overlaps other windows.
+Popup windows can also overlap each other. The "zindex" property specifies
+what goes on top of what.
+ *E366*
+The popup window contains a buffer, and that buffer is always associated with
+the popup window. The window cannot be in Normal, Visual or Insert mode, it
+does not get keyboard focus. You can use functions like `setbufline()` to
+change the text in the buffer. There are more differences from how this
+window and buffer behave compared to regular windows and buffers, see
+|popup-buffer|.
+
+If this is not what you are looking for, check out other popup functionality:
+- popup menu, see |popup-menu|
+- balloon, see |balloon-eval|
+
+
+WINDOW POSITION AND SIZE *popup-position*
+
+The height of the window is normally equal to the number of, possibly
+wrapping, lines in the buffer. It can be limited with the "maxheight"
+property. You can use empty lines to increase the height or the "minheight"
+property.
+
+The width of the window is normally equal to the longest visible line in the
+buffer. It can be limited with the "maxwidth" property. You can use spaces
+to increase the width or use the "minwidth" property.
+
+By default the 'wrap' option is set, so that no text disappears. Otherwise,
+if there is not enough space then the window is shifted left in order to
+display more text. When right-aligned the window is shifted right to display
+more text. The shifting can be disabled with the "fixed" property.
+
+Vim tries to show the popup in the location you specify. In some cases, e.g.
+when the popup would go outside of the Vim window, it will show it somewhere
+nearby. E.g. if you use `popup_atcursor()` the popup normally shows just above
+the current cursor position, but if the cursor is close to the top of the Vim
+window it will be placed below the cursor position.
+
+When the screen scrolls up for output of an Ex command, popups move too, so
+that they will not cover the output.
+
+The current cursor position is displayed even when it is under a popup window.
+That way you can still see where it is, even though you cannot see the text
+that it is in.
+
+
+CLOSING THE POPUP WINDOW *popup-close*
+
+Normally the plugin that created the popup window is also in charge of closing
+it. If somehow a popup hangs around, you can close all of them with: >
+ call popup_clear(1)
+Some popups, such as notifications, close after a specified time. This can be
+set with the "time" property on `popup_create()`.
+Otherwise, a popup can be closed by clicking on the X in the top-right corner
+or by clicking anywhere inside the popup. This must be enabled with the
+"close" property. It is set by default for notifications.
+
+
+POPUP BUFFER AND WINDOW *popup-buffer*
+
+If a popup function is called to create a popup from text, a new buffer is
+created to hold the text and text properties of the popup window. The buffer
+is always associated with the popup window and manipulation is restricted:
+- the buffer has no name
+- 'buftype' is "popup"
+- 'swapfile' is off
+- 'bufhidden' is "hide"
+- 'buflisted' is off
+- 'undolevels' is -1: no undo at all
+- all other buffer-local and window-local options are set to their Vim default
+ value.
+
+It is possible to change the specifically mentioned options, but anything
+might break then, so better leave them alone.
+
+The window does have a cursor position, but the cursor is not displayed. In
+fact, the cursor in the underlying window is displayed, as if it peeks through
+the popup, so you can see where it is.
+
+To execute a command in the context of the popup window and buffer use
+`win_execute()`. Example: >
+ call win_execute(winid, 'syntax enable')
+
+Options can be set on the window with `setwinvar()`, e.g.: >
+ call setwinvar(winid, '&wrap', 0)
+And options can be set on the buffer with `setbufvar()`, e.g.: >
+ call setbufvar(winbufnr(winid), '&filetype', 'java')
+You can also use `win_execute()` with a ":setlocal" command.
+
+
+TERMINAL IN POPUP WINDOW *popup-terminal*
+
+A special case is running a terminal in a popup window. Many rules are then
+different: *E863*
+- The popup window always has focus, it is not possible to switch to another
+ window.
+- When the job ends, the popup window shows the buffer in Terminal-Normal
+ mode. Use `:q` to close it or use "term_finish" value "close".
+- The popup window can be closed with `popup_close()`, the terminal buffer
+ then becomes hidden.
+- It is not possible to open a second popup window with a terminal. *E861*
+- The default Pmenu color is only used for the border and padding. To change
+ the color of the terminal itself set the Terminal highlight group before
+ creating the terminal. Setting 'wincolor' later can work but requires the
+ program in the terminal to redraw everything.
+- The default minimal size is 5 lines of 20 characters; Use the "minwidth" and
+ "minheight" parameters to set a different value.
+- The terminal size will grow if the program running in the terminal writes
+ text. Set "maxheight" and "maxwidth" to restrict the size.
+
+To run a terminal in a popup window, first create the terminal hidden. Then
+pass the buffer number to popup_create(). Example: >
+ hi link Terminal Search
+ let buf = term_start(['picker', 'Something'], #{hidden: 1, term_finish: 'close'})
+ let winid = popup_create(buf, #{minwidth: 50, minheight: 20})
+
+==============================================================================
+2. Functions *popup-functions*
+
+Creating a popup window:
+ |popup_create()| centered in the screen
+ |popup_atcursor()| just above the cursor position, closes when
+ the cursor moves away
+ |popup_beval()| at the position indicated by v:beval_
+ variables, closes when the mouse moves away
+ |popup_notification()| show a notification for three seconds
+ |popup_dialog()| centered with padding and border
+ |popup_menu()| prompt for selecting an item from a list
+
+Manipulating a popup window:
+ |popup_hide()| hide a popup temporarily
+ |popup_show()| show a previously hidden popup
+ |popup_move()| change the position and size of a popup
+ |popup_setoptions()| override options of a popup
+ |popup_settext()| replace the popup buffer contents
+
+Closing popup windows:
+ |popup_close()| close one popup
+ |popup_clear()| close all popups
+
+Filter functions:
+ |popup_filter_menu()| select from a list of items
+ |popup_filter_yesno()| blocks until 'y' or 'n' is pressed
+
+Other:
+ |popup_getoptions()| get current options for a popup
+ |popup_getpos()| get actual position and size of a popup
+ |popup_locate()| find popup window at a screen position
+ |popup_list()| get list of all popups
+
+
+DETAILS *popup-function-details*
+
+popup_atcursor({what}, {options}) *popup_atcursor()*
+ Show the {what} above the cursor, and close it when the cursor
+ moves. This works like: >
+ call popup_create({what}, #{
+ \ pos: 'botleft',
+ \ line: 'cursor-1',
+ \ col: 'cursor',
+ \ moved: 'WORD',
+ \ })
+< Use {options} to change the properties.
+ If "pos" is passed as "topleft" then the default for "line"
+ becomes "cursor+1".
+
+ Can also be used as a |method|: >
+ GetText()->popup_atcursor({})
+
+
+popup_beval({what}, {options}) *popup_beval()*
+ Show the {what} above the position from 'ballooneval' and
+ close it when the mouse moves. This works like: >
+ let pos = screenpos(v:beval_winnr, v:beval_lnum, v:beval_col)
+ call popup_create({what}, #{
+ \ pos: 'botleft',
+ \ line: pos.row - 1,
+ \ col: pos.col,
+ \ mousemoved: 'WORD',
+ \ })
+< Use {options} to change the properties.
+ See |popup_beval_example| for an example.
+
+ Can also be used as a |method|: >
+ GetText()->popup_beval({})
+<
+ *popup_clear()*
+popup_clear([{force}])
+ Emergency solution to a misbehaving plugin: close all popup
+ windows for the current tab and global popups.
+ Close callbacks are not invoked.
+ When {force} is not present this will fail if the current
+ window is a popup.
+ When {force} is present and |TRUE| the popup is also closed
+ when it is the current window. If a terminal is running in a
+ popup it is killed.
+
+
+popup_close({id} [, {result}]) *popup_close()*
+ Close popup {id}. The window and the associated buffer will
+ be deleted.
+
+ If the popup has a callback it will be called just before the
+ popup window is deleted. If the optional {result} is present
+ it will be passed as the second argument of the callback.
+ Otherwise zero is passed to the callback.
+
+ Can also be used as a |method|: >
+ GetPopup()->popup_close()
+
+
+popup_create({what}, {options}) *popup_create()*
+ Open a popup window showing {what}, which is either: *E450*
+ - a buffer number
+ - a string
+ - a list of strings
+ - a list of text lines with text properties
+ When {what} is not a buffer number, a buffer is created with
+ 'buftype' set to "popup". That buffer will be wiped out once
+ the popup closes.
+
+ if {what} is a buffer number and loading the buffer runs into
+ an existing swap file, it is silently opened read-only, as if
+ a |SwapExists| autocommand had set |v:swapchoice| to 'o'.
+ This is because we assume the buffer is only used for viewing.
+
+ {options} is a dictionary with many possible entries.
+ See |popup_create-arguments| for details.
+
+ Returns a window-ID, which can be used with other popup
+ functions. Use `winbufnr()` to get the number of the buffer
+ in the window: >
+ let winid = popup_create('hello', {})
+ let bufnr = winbufnr(winid)
+ call setbufline(bufnr, 2, 'second line')
+< In case of failure zero is returned.
+
+ Can also be used as a |method|: >
+ GetText()->popup_create({})
+
+
+popup_dialog({what}, {options}) *popup_dialog()*
+ Just like |popup_create()| but with these default options: >
+ call popup_create({what}, #{
+ \ pos: 'center',
+ \ zindex: 200,
+ \ drag: 1,
+ \ border: [],
+ \ padding: [],
+ \ mapping: 0,
+ \})
+< Use {options} to change the properties. E.g. add a 'filter'
+ option with value 'popup_filter_yesno'. Example: >
+ call popup_create('do you want to quit (Yes/no)?', #{
+ \ filter: 'popup_filter_yesno',
+ \ callback: 'QuitCallback',
+ \ })
+
+< By default the dialog can be dragged, so that text below it
+ can be read if needed.
+
+ Can also be used as a |method|: >
+ GetText()->popup_dialog({})
+
+
+popup_filter_menu({id}, {key}) *popup_filter_menu()*
+ Filter that can be used for a popup. These keys can be used:
+ j <Down> <C-N> select item below
+ k <Up> <C-P> select item above
+ <Space> <Enter> accept current selection
+ x Esc CTRL-C cancel the menu
+ Other keys are ignored.
+ Always returns |v:true|.
+
+ A match is set on that line to highlight it, see
+ |popup_menu()|.
+
+ When the current selection is accepted the "callback" of the
+ popup menu is invoked with the index of the selected line as
+ the second argument. The first entry has index one.
+ Cancelling the menu invokes the callback with -1.
+
+ To add shortcut keys, see the example here:
+ |popup_menu-shortcut-example|
+
+
+popup_filter_yesno({id}, {key}) *popup_filter_yesno()*
+ Filter that can be used for a popup. It handles only the keys
+ 'y', 'Y' and 'n' or 'N'. Invokes the "callback" of the
+ popup menu with the 1 for 'y' or 'Y' and zero for 'n' or 'N'
+ as the second argument. Pressing Esc and 'x' works like
+ pressing 'n'. CTRL-C invokes the callback with -1. Other
+ keys are ignored.
+ See the example here: |popup_dialog-example|
+
+
+popup_findecho() *popup_findecho()*
+ Get the |window-ID| for the popup that shows messages for the
+ `:echowindow` command. Return zero if there is none.
+ Mainly useful to hide the popup.
+
+
+popup_findinfo() *popup_findinfo()*
+ Get the |window-ID| for the popup info window, as it used by
+ the popup menu. See |complete-popup|. The info popup is
+ hidden when not used, it can be deleted with |popup_clear()|
+ and |popup_close()|. Use |popup_show()| to reposition it to
+ the item in the popup menu.
+ Returns zero if there is none.
+
+
+popup_findpreview() *popup_findpreview()*
+ Get the |window-ID| for the popup preview window.
+ Return zero if there is none.
+
+popup_getoptions({id}) *popup_getoptions()*
+ Return the {options} for popup {id} in a Dict.
+ A zero value means the option was not set. For "zindex" the
+ default value is returned, not zero.
+
+ The "moved" entry is a list with line number, minimum and
+ maximum column, [0, 0, 0] when not set.
+
+ The "mousemoved" entry is a list with screen row, minimum and
+ maximum screen column, [0, 0, 0] when not set.
+
+ "firstline" is the property set on the popup, unlike the
+ "firstline" obtained with |popup_getpos()| which is the actual
+ buffer line at the top of the popup window.
+
+ "border" and "padding" are not included when all values are
+ zero. When all values are one then an empty list is included.
+
+ "borderhighlight" is not included when all values are empty.
+ "scrollbarhighlight" and "thumbhighlight" are only included
+ when set.
+
+ "tabpage" will be -1 for a global popup, zero for a popup on
+ the current tabpage and a positive number for a popup on
+ another tabpage.
+
+ "textprop", "textpropid" and "textpropwin" are only present
+ when "textprop" was set.
+
+ If popup window {id} is not found an empty Dict is returned.
+
+ Can also be used as a |method|: >
+ GetPopup()->popup_getoptions()
+
+
+popup_getpos({id}) *popup_getpos()*
+ Return the position and size of popup {id}. Returns a Dict
+ with these entries:
+ col screen column of the popup, one-based
+ line screen line of the popup, one-based
+ width width of the whole popup in screen cells
+ height height of the whole popup in screen cells
+ core_col screen column of the text box
+ core_line screen line of the text box
+ core_width width of the text box in screen cells
+ core_height height of the text box in screen cells
+ firstline line of the buffer at top (1 unless scrolled)
+ (not the value of the "firstline" property)
+ lastline line of the buffer at the bottom (updated when
+ the popup is redrawn)
+ scrollbar non-zero if a scrollbar is displayed
+ visible one if the popup is displayed, zero if hidden
+ Note that these are the actual screen positions. They differ
+ from the values in `popup_getoptions()` for the sizing and
+ positioning mechanism applied.
+
+ The "core_" values exclude the padding and border.
+
+ If popup window {id} is not found an empty Dict is returned.
+
+ Can also be used as a |method|: >
+ GetPopup()->popup_getpos()
+
+
+popup_hide({id}) *popup_hide()*
+ If {id} is a displayed popup, hide it now. If the popup has a
+ filter it will not be invoked for so long as the popup is
+ hidden.
+ If window {id} does not exist nothing happens. If window {id}
+ exists but is not a popup window an error is given. *E993*
+ If popup window {id} contains a terminal an error is given.
+
+ Can also be used as a |method|: >
+ GetPopup()->popup_hide()
+
+
+popup_list() *popup_list()*
+ Return a List with the |window-ID| of all existing popups.
+
+
+popup_locate({row}, {col}) *popup_locate()*
+ Return the |window-ID| of the popup at screen position {row}
+ and {col}. If there are multiple popups the one with the
+ highest zindex is returned. If there are no popups at this
+ position then zero is returned.
+
+
+popup_menu({what}, {options}) *popup_menu()*
+ Show the {what} near the cursor, handle selecting one of the
+ items with cursorkeys, and close it an item is selected with
+ Space or Enter. {what} should have multiple lines to make this
+ useful. This works like: >
+ call popup_create({what}, #{
+ \ pos: 'center',
+ \ zindex: 200,
+ \ drag: 1,
+ \ wrap: 0,
+ \ border: [],
+ \ cursorline: 1,
+ \ padding: [0,1,0,1],
+ \ filter: 'popup_filter_menu',
+ \ mapping: 0,
+ \ })
+< The current line is highlighted with a match using
+ "PopupSelected", or "PmenuSel" if that is not defined.
+
+ Use {options} to change the properties. Should at least set
+ "callback" to a function that handles the selected item.
+ Example: >
+ func ColorSelected(id, result)
+ " use a:result
+ endfunc
+ call popup_menu(['red', 'green', 'blue'], #{
+ \ callback: 'ColorSelected',
+ \ })
+
+< Can also be used as a |method|: >
+ GetChoices()->popup_menu({})
+
+
+popup_move({id}, {options}) *popup_move()*
+ Move popup {id} to the position specified with {options}.
+ {options} may contain the items from |popup_create()| that
+ specify the popup position:
+ line
+ col
+ pos
+ maxheight
+ minheight
+ maxwidth
+ minwidth
+ fixed
+ For {id} see `popup_hide()`.
+ For other options see |popup_setoptions()|.
+
+ Can also be used as a |method|: >
+ GetPopup()->popup_move(options)
+
+
+popup_notification({what}, {options}) *popup_notification()*
+ Show the {what} for 3 seconds at the top of the Vim window.
+ This works like: >
+ call popup_create({what}, #{
+ \ line: 1,
+ \ col: 10,
+ \ minwidth: 20,
+ \ time: 3000,
+ \ tabpage: -1,
+ \ zindex: 300,
+ \ drag: 1,
+ \ highlight: 'WarningMsg',
+ \ border: [],
+ \ close: 'click',
+ \ padding: [0,1,0,1],
+ \ })
+< The PopupNotification highlight group is used instead of
+ WarningMsg if it is defined.
+
+ Without the |+timers| feature the popup will not disappear
+ automatically, the user has to click in it.
+
+ The position will be adjusted to avoid overlap with other
+ notifications.
+ Use {options} to change the properties.
+
+ Can also be used as a |method|: >
+ GetText()->popup_notification({})
+
+
+popup_setoptions({id}, {options}) *popup_setoptions()*
+ Override options in popup {id} with entries in {options}.
+ These options can be set:
+ border
+ borderchars
+ borderhighlight
+ callback
+ close
+ cursorline
+ drag
+ filter
+ firstline
+ flip
+ highlight
+ mapping
+ mask
+ moved
+ padding
+ resize
+ scrollbar
+ scrollbarhighlight
+ thumbhighlight
+ time
+ title
+ wrap
+ zindex
+ The options from |popup_move()| can also be used.
+ Generally, setting an option to zero or an empty string resets
+ it to the default value, but there are exceptions.
+ For "hidden" use |popup_hide()| and |popup_show()|.
+ "tabpage" cannot be changed.
+
+ Can also be used as a |method|: >
+ GetPopup()->popup_setoptions(options)
+
+
+popup_settext({id}, {text}) *popup_settext()*
+ Set the text of the buffer in popup win {id}. {text} is the
+ same as supplied to |popup_create()|, except that a buffer
+ number is not allowed.
+ Does not change the window size or position, other than caused
+ by the different text.
+
+ Can also be used as a |method|: >
+ GetPopup()->popup_settext('hello')
+
+
+popup_show({id}) *popup_show()*
+ If {id} is a hidden popup, show it now.
+ For {id} see `popup_hide()`.
+ If {id} is the info popup it will be positioned next to the
+ current popup menu item.
+
+
+==============================================================================
+3. Usage *popup-usage*
+
+POPUP_CREATE() ARGUMENTS *popup_create-arguments*
+
+The first argument of |popup_create()| (and the second argument to
+|popup_settext()|) specifies the text to be displayed, and optionally text
+properties. It is in one of four forms: *E1284*
+- a buffer number
+- a string
+- a list of strings
+- a list of dictionaries, where each dictionary has these entries:
+ text String with the text to display.
+ props A list of text properties. Optional.
+ Each entry is a dictionary, like the third argument of
+ |prop_add()|, but specifying the column in the
+ dictionary with a "col" entry, see below:
+ |popup-props|.
+
+If you want to create a new buffer yourself use |bufadd()| and pass the buffer
+number to popup_create().
+
+The second argument of |popup_create()| is a dictionary with options:
+ line Screen line where to position the popup. Can use a
+ number or "cursor", "cursor+1" or "cursor-1" to use
+ the line of the cursor and add or subtract a number of
+ lines. If omitted or zero the popup is vertically
+ centered. The first line is 1.
+ When using "textprop" the number is relative to the
+ text property and can be negative.
+ col Screen column where to position the popup. Can use a
+ number or "cursor" to use the column of the cursor,
+ "cursor+9" or "cursor-9" to add or subtract a number
+ of columns. If omitted or zero the popup is
+ horizontally centered. The first column is 1.
+ When using "textprop" the number is relative to the
+ text property and can be negative.
+ pos "topleft", "topright", "botleft" or "botright":
+ defines what corner of the popup "line" and "col" are
+ used for. When not set "topleft" is used.
+ Alternatively "center" can be used to position the
+ popup in the center of the Vim window, in which case
+ "line" and "col" are ignored.
+ posinvert When FALSE the value of "pos" is always used. When
+ TRUE (the default) and the popup does not fit
+ vertically and there is more space on the other side
+ then the popup is placed on the other side of the
+ position indicated by "line".
+ textprop When present the popup is positioned next to a text
+ property with this name and will move when the text
+ property moves. Use an empty string to remove. See
+ |popup-textprop-pos|.
+ textpropwin What window to search for the text property. When
+ omitted or invalid the current window is used. Used
+ when "textprop" is present.
+ textpropid Used to identify the text property when "textprop" is
+ present. Use zero to reset.
+ fixed When FALSE (the default), and:
+ - "pos" is "botleft" or "topleft", and
+ - "wrap" is off, and
+ - the popup would be truncated at the right edge of
+ the screen, then
+ the popup is moved to the left so as to fit the
+ contents on the screen. Set to TRUE to disable this.
+ flip When TRUE (the default) and the position is relative
+ to the cursor, flip to below or above the cursor to
+ avoid overlap with the |popupmenu-completion| or
+ another popup with a higher "zindex". When there is
+ no space above/below the cursor then show the popup to
+ the side of the popup or popup menu.
+ {not implemented yet}
+ maxheight Maximum height of the contents, excluding border and
+ padding.
+ minheight Minimum height of the contents, excluding border and
+ padding.
+ maxwidth Maximum width of the contents, excluding border,
+ padding and scrollbar.
+ minwidth Minimum width of the contents, excluding border,
+ padding and scrollbar.
+ firstline First buffer line to display. When larger than one it
+ looks like the text scrolled up. When out of range
+ the last buffer line will at the top of the window.
+ Set to zero to leave the position as set by commands.
+ Also see "scrollbar".
+ hidden When TRUE the popup exists but is not displayed; use
+ `popup_show()` to unhide it.
+ tabpage When -1: display the popup on all tab pages.
+ When 0 (the default): display the popup on the current
+ tab page.
+ Otherwise the number of the tab page the popup is
+ displayed on; when invalid the popup is not created
+ and an error is given. *E997*
+ title Text to be displayed above the first item in the
+ popup, on top of any border. If there is no top
+ border one line of padding is added to put the title
+ on. You might want to add one or more spaces at the
+ start and end as padding.
+ wrap TRUE to make the lines wrap (default TRUE).
+ drag TRUE to allow the popup to be dragged with the mouse
+ by grabbing at the border. Has no effect if the
+ popup does not have a border. As soon as dragging
+ starts and "pos" is "center" it is changed to
+ "topleft".
+ dragall TRUE to allow the popup to be dragged from every
+ position. Makes it very difficult to select text in
+ the popup.
+ resize TRUE to allow the popup to be resized with the mouse
+ by grabbing at the bottom right corner. Has no effect
+ if the popup does not have a border.
+ close When "button" an X is displayed in the top-right, on
+ top of any border, padding or text. When clicked on
+ the X the popup will close. Any callback is invoked
+ with the value -2.
+ When "click" any mouse click in the popup will close
+ it.
+ When "none" (the default) mouse clicks do not close
+ the popup window.
+ highlight Highlight group name to use for the text, stored in
+ the 'wincolor' option.
+ padding List with numbers, defining the padding
+ above/right/below/left of the popup (similar to CSS).
+ An empty list uses a padding of 1 all around. The
+ padding goes around the text, inside any border.
+ Padding uses the 'wincolor' highlight.
+ Example: [1, 2, 1, 3] has 1 line of padding above, 2
+ columns on the right, 1 line below and 3 columns on
+ the left.
+ border List with numbers, defining the border thickness
+ above/right/below/left of the popup (similar to CSS).
+ Only values of zero and non-zero are currently
+ recognized. An empty list uses a border all around.
+ borderhighlight List of highlight group names to use for the border.
+ When one entry it is used for all borders, otherwise
+ the highlight for the top/right/bottom/left border.
+ Example: ['TopColor', 'RightColor', 'BottomColor,
+ 'LeftColor']
+ borderchars List with characters, defining the character to use
+ for the top/right/bottom/left border. Optionally
+ followed by the character to use for the
+ topleft/topright/botright/botleft corner.
+ Example: ['-', '|', '-', '|', '┌', '┐', '┘', '└']
+ When the list has one character it is used for all.
+ When the list has two characters the first is used for
+ the border lines, the second for the corners.
+ By default a double line is used all around when
+ 'encoding' is "utf-8" and 'ambiwidth' is "single",
+ otherwise ASCII characters are used.
+ scrollbar 1 or true: show a scrollbar when the text doesn't fit.
+ zero: do not show a scrollbar. Default is non-zero.
+ Also see |popup-scrollbar|.
+ scrollbarhighlight Highlight group name for the scrollbar. The
+ background color is what matters. When not given then
+ PmenuSbar is used.
+ thumbhighlight Highlight group name for the scrollbar thumb. The
+ background color is what matters. When not given then
+ PmenuThumb is used.
+ zindex Priority for the popup, default 50. Minimum value is
+ 1, maximum value is 32000.
+ mask A list of lists with coordinates, defining parts of
+ the popup that are transparent. See |popup-mask|.
+ time Time in milliseconds after which the popup will close.
+ When omitted |popup_close()| must be used.
+ moved Specifies to close the popup if the cursor moved:
+ - "any": if the cursor moved at all
+ - "word": if the cursor moved outside |<cword>|
+ - "WORD": if the cursor moved outside |<cWORD>|
+ - "expr": if the cursor moved outside |<cexpr>|
+ - [{start}, {end}]: if the cursor moved before column
+ {start} or after {end}
+ - [{lnum}, {start}, {end}]: if the cursor moved away
+ from line {lnum}, before column {start} or after
+ {end}
+ - [0, 0, 0] do not close the popup when the cursor
+ moves
+ The popup also closes if the cursor moves to another
+ line or to another window.
+ mousemoved Like "moved" but referring to the mouse pointer
+ position
+ cursorline TRUE: Highlight the cursor line. Also scrolls the
+ text to show this line (only works properly
+ when 'wrap' is off).
+ zero: Do not highlight the cursor line.
+ Default is zero, except for |popup_menu()|.
+ filter A callback that can filter typed characters, see
+ |popup-filter|.
+ mapping Allow for key mapping. When FALSE and the popup is
+ visible and has a filter callback key mapping is
+ disabled. Default value is TRUE.
+ filtermode In which modes the filter is used (same flags as with
+ |hasmapto()| plus "a"):
+ n Normal mode
+ v Visual and Select mode
+ x Visual mode
+ s Select mode
+ o Operator-pending mode
+ i Insert mode
+ l Language-Argument ("r", "f", "t", etc.)
+ c Command-line mode
+ a all modes
+ The default value is "a".
+ callback A callback that is called when the popup closes, e.g.
+ when using |popup_filter_menu()|, see |popup-callback|.
+
+Depending on the "zindex" the popup goes under or above other popups. The
+completion menu (|popup-menu|) has zindex 100. For messages that occur for a
+short time the suggestion is to use zindex 1000.
+
+By default text wraps, which causes a line in {lines} to occupy more than one
+screen line. When "wrap" is FALSE then the text outside of the popup or
+outside of the Vim window will not be displayed, thus truncated.
+
+
+POPUP TEXT PROPERTIES *popup-props*
+
+These are similar to the third argument of |prop_add()| except:
+- "lnum" is always the current line in the list
+- "bufnr" is always the buffer of the popup
+- "col" is in the Dict instead of a separate argument
+So we get:
+ col starting column, counted in bytes, use one for the
+ first column.
+ length length of text in bytes; can be zero
+ end_lnum line number for the end of the text
+ end_col column just after the text; not used when "length" is
+ present; when {col} and "end_col" are equal, this is a
+ zero-width text property
+ id user defined ID for the property; when omitted zero is
+ used
+ type name of the text property type, as added with
+ |prop_type_add()|
+
+
+POSITION POPUP WITH TEXTPROP *popup-textprop-pos*
+
+Positioning a popup next to a text property causes the popup to move when text
+is inserted or deleted. The popup functions like a tooltip.
+
+These steps are needed to make this work:
+
+- Define a text property type, it defines the name. >
+ call prop_type_add('popupMarker', {})
+
+- Place a text property at the desired text: >
+ let lnum = {line of the text}
+ let col = {start column of the text}
+ let len = {length of the text}
+ let propId = {arbitrary but unique number}
+ call prop_add(lnum, col, #{
+ \ length: len,
+ \ type: 'popupMarker',
+ \ id: propId,
+ \ })
+
+- Create a popup: >
+ let winid = popup_create('the text', #{
+ \ pos: 'botleft',
+ \ textprop: 'popupMarker',
+ \ textpropid: propId,
+ \ border: [],
+ \ padding: [0,1,0,1],
+ \ close: 'click',
+ \ })
+
+By default the popup is positioned at the corner of the text, opposite of the
+"pos" specified for the popup. Thus when the popup uses "botleft", the
+bottom-left corner of the popup is positioned next to the top-right corner of
+the text property:
+ +----------+
+ | the text |
+ +----------+
+ just some PROPERTY as an example
+
+Here the text property is on "PROPERTY". Move the popup to the left by
+passing a negative "col" value to popup_create(). With "col: -5" you get:
+
+ +----------+
+ | the text |
+ +----------+
+ just some PROPERTY as an example
+
+If the text property moves out of view then the popup will be hidden.
+If the window for which the popup was defined is closed, the popup is closed.
+
+If the popup cannot fit in the desired position, it may show at a nearby
+position.
+
+Some hints:
+- To avoid collision with other plugins the text property type name has to be
+ unique. You can also use the "bufnr" item to make it local to a buffer.
+- You can leave out the text property ID if there is only ever one text
+ property visible.
+- The popup may be in the way of what the user is doing, making it close with
+ a click, as in the example above, helps for that.
+- If the text property is removed the popup is closed. Use something like
+ this: >
+ call prop_remove(#{type: 'popupMarker', id: propId})
+
+
+POPUP FILTER *popup-filter*
+
+A callback that gets any typed keys while a popup is displayed. The filter is
+not invoked when the popup is hidden.
+
+The filter can return TRUE to indicate the key has been handled and is to be
+discarded, or FALSE to let Vim handle the key as usual in the current state.
+In case it returns FALSE and there is another popup window visible, that
+filter is also called. The filter of the popup window with the highest zindex
+is called first.
+
+The filter function is called with two arguments: the ID of the popup and the
+key as a string, e.g.: >
+ func MyFilter(winid, key)
+ if a:key == "\<F2>"
+ " do something
+ return 1
+ endif
+ if a:key == 'x'
+ call popup_close(a:winid)
+ return 1
+ endif
+ return 0
+ endfunc
+< *popup-filter-mode*
+The "filtermode" property can be used to specify in what mode the filter is
+invoked. The default is "a": all modes. When using "nvi" Command-line mode
+is not included, so that any command typed on the command line is not
+filtered. However, to get to Command-line mode the filter must not consume
+":". Just like it must not consume "v" to allow for entering Visual mode.
+
+ *popup-mapping*
+Normally the key is what results after any mapping, since the keys pass on as
+normal input if the filter does not use it. If the filter consumes all the
+keys, set the "mapping" property to zero so that mappings do not get in the
+way. This is default for |popup_menu()| and |popup_dialog()|.
+
+Some recommended key actions:
+ x close the popup (see note below)
+ cursor keys select another entry
+ Tab accept current suggestion
+
+When CTRL-C is pressed the popup is closed, the filter will not be invoked.
+
+A mouse click arrives as <LeftMouse>. The coordinates can be obtained with
+|getmousepos()|.
+
+Vim provides standard filters |popup_filter_menu()| and
+|popup_filter_yesno()|.
+
+Keys coming from a `:normal` command do not pass through the filter. This can
+be used to move the cursor in a popup where the "cursorline" option is set: >
+ call win_execute(winid, 'normal! 10Gzz')
+Keys coming from `feedkeys()` are passed through the filter.
+
+Note that "x" is the normal way to close a popup. You may want to use Esc,
+but since many keys start with an Esc character, there may be a delay before
+Vim recognizes the Esc key. If you do use Esc, it is recommended to set the
+'ttimeoutlen' option to 100 and set 'timeout' and/or 'ttimeout'.
+
+ *popup-filter-errors*
+If the filter function can't be called, e.g. because the name is wrong, then
+the popup is closed. If the filter causes an error then it is assumed to
+return zero. If this happens three times in a row the popup is closed. If
+the popup gives errors fewer than 10% of the calls then it won't be closed.
+
+
+POPUP CALLBACK *popup-callback*
+
+A callback that is invoked when the popup closes.
+
+The callback is invoked with two arguments: the ID of the popup window and the
+result, which could be an index in the popup lines, or whatever was passed as
+the second argument of `popup_close()`.
+
+If the popup is force-closed, e.g. because the cursor moved or CTRL-C was
+pressed, the number -1 is passed to the callback.
+
+Example: >
+ func SelectedColor(id, result)
+ echo 'choice made: ' .. a:result
+ endfunc
+
+
+POPUP SCROLLBAR *popup-scrollbar*
+
+If the text does not fit in the popup a scrollbar is displayed on the right of
+the window. This can be disabled by setting the "scrollbar" option to zero.
+When the scrollbar is displayed mouse scroll events, while the mouse pointer
+is on the popup, will cause the text to scroll up or down as you would expect.
+A click in the upper half of the scrollbar will scroll the text down one line.
+A click in the lower half will scroll the text up one line. However, this is
+limited so that the popup does not get smaller.
+
+
+POPUP MASK *popup-mask*
+
+To minimize the text that the popup covers, parts of it can be made
+transparent. This is defined by a "mask" which is a list of lists, where each
+list has four numbers:
+ col start column, positive for counting from the left, 1 for
+ leftmost, negative for counting from the right, -1 for
+ rightmost
+ endcol last column, like "col"
+ line start line, positive for counting from the top, 1 for top,
+ negative for counting from the bottom, -1 for bottom
+ endline end line, like "line"
+
+For example, to make the last 10 columns of the last line transparent:
+ [[-10, -1, -1, -1]]
+
+To make the four corners transparent:
+ [[1, 1, 1, 1], [-1, -1, 1, 1], [1, 1, -1, -1], [-1, -1, -1, -1]]
+
+==============================================================================
+4. Examples *popup-examples*
+
+These examples use |Vim9| script.
+
+ *popup_dialog-example*
+Prompt the user to press y/Y or n/N: >
+
+ popup_dialog('Continue? y/n', {
+ filter: 'popup_filter_yesno',
+ callback: (id, result) => {
+ if result == 1
+ echomsg "'y' or 'Y' was pressed"
+ else
+ echomsg "'y' or 'Y' was NOT pressed"
+ endif
+ },
+ padding: [2, 4, 2, 4],
+ })
+<
+ *popup_menu-shortcut-example*
+Extend popup_filter_menu() with shortcut keys: >
+
+ popup_menu(['Save', 'Cancel', 'Discard'], {
+ callback: (_, result) => {
+ echo 'dialog result is' result
+ },
+ filter: (id, key) => {
+ # Handle shortcuts
+ if key == 'S' || key == 's'
+ popup_close(id, 1)
+ elseif key == 'C' || key == 'c'
+ popup_close(id, 2)
+ elseif key == 'D' || key == 'd'
+ popup_close(id, 3)
+ else
+ # No shortcut, pass to generic filter
+ return popup_filter_menu(id, key)
+ endif
+ return true
+ },
+ })
+<
+ *popup_beval_example*
+Example for using a popup window for 'ballooneval': >
+
+ set ballooneval balloonevalterm
+ set balloonexpr=BalloonExpr()
+ var winid: number
+ var last_text: string
+
+ def BalloonExpr(): string
+ # here you would use "v:beval_text" to lookup something interesting
+ var text = v:beval_text
+ if winid > 0 && popup_getpos(winid) != null_dict
+ # previous popup window still shows
+ if text == last_text
+ # still the same text, keep the existing popup
+ return null_string
+ endif
+ popup_close(winid)
+ endif
+
+ winid = popup_beval(text, {})
+ last_text = text
+ return null_string
+ enddef
+
+If the text has to be obtained asynchronously return an empty string from the
+expression function and call popup_beval() once the text is available. In
+this example simulated with a timer callback: >
+
+ set ballooneval balloonevalterm
+ set balloonexpr=BalloonExpr()
+ var winid: number
+ var last_text: string
+
+ def BalloonExpr(): string
+ var text = v:beval_text
+ if winid > 0 && popup_getpos(winid) != null_dict
+ # previous popup window still shows
+ if text == last_text
+ # still the same text, keep the existing popup
+ return null_string
+ endif
+ popup_close(winid)
+ endif
+
+ # Simulate an asynchronous lookup that takes half a second for the
+ # text to display.
+ last_text = text
+ timer_start(500, 'ShowPopup')
+ return null_string
+ enddef
+
+ def ShowPopup(timerid: number)
+ winid = popup_beval('Result: ' .. last_text, {})
+ enddef
+<
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/print.txt b/runtime/doc/print.txt
new file mode 100644
index 0000000..53f17e1
--- /dev/null
+++ b/runtime/doc/print.txt
@@ -0,0 +1,758 @@
+*print.txt* For Vim version 9.0. Last change: 2022 Oct 01
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+
+{only available when compiled with the |+printer| feature}
+
+==============================================================================
+1. Introduction *print-intro*
+
+On MS-Windows Vim can print your text on any installed printer. On other
+systems a PostScript file is produced. This can be directly sent to a
+PostScript printer. For other printers a program like ghostscript needs to be
+used.
+
+Note: If you have problems printing with |:hardcopy|, an alternative is to use
+|:TOhtml| and print the resulting html file from a browser.
+
+ *:ha* *:hardcopy* *E237* *E238* *E324*
+:[range]ha[rdcopy][!] [arguments]
+ Send [range] lines (default whole file) to the
+ printer.
+
+ On MS-Windows a dialog is displayed to allow selection
+ of printer, paper size etc. To skip the dialog, use
+ the [!]. In this case the printer defined by
+ 'printdevice' is used, or, if 'printdevice' is empty,
+ the system default printer.
+
+ For systems other than MS-Windows, PostScript is
+ written in a temp file and 'printexpr' is used to
+ actually print it. Then [arguments] can be used by
+ '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
+ {filename}.
+ Things like "%" are expanded |cmdline-special|
+ Careful: An existing file is silently overwritten.
+ {only available when compiled with the |+postscript|
+ feature}
+ On MS-Windows use the "print to file" feature of the
+ printer driver.
+
+Progress is displayed during printing as a page number and a percentage. To
+abort printing use the interrupt key (CTRL-C or, on MS-systems, CTRL-Break).
+
+Printer output is controlled by the 'printfont' and 'printoptions' options.
+'printheader' specifies the format of a page header.
+
+The printed file is always limited to the selected margins, irrespective of
+the current window's 'wrap' or 'linebreak' settings. The "wrap" item in
+'printoptions' can be used to switch wrapping off.
+The current highlighting colors are used in the printout, with the following
+considerations:
+1) The normal background is always rendered as white (i.e. blank paper).
+2) White text or the default foreground is rendered as black, so that it shows
+ up!
+3) If 'background' is "dark", then the colours are darkened to compensate for
+ the fact that otherwise they would be too bright to show up clearly on
+ white paper.
+
+==============================================================================
+2. Print options *print-options*
+
+Here are the details for the options that change the way printing is done.
+For generic info about setting options see |options.txt|.
+
+ *pdev-option*
+'printdevice' 'pdev' string (default empty)
+ global
+This defines the name of the printer to be used when the |:hardcopy| command
+is issued with a bang (!) to skip the printer selection dialog. On Win32, it
+should be the printer name exactly as it appears in the standard printer
+dialog.
+If the option is empty, then vim will use the system default printer for
+":hardcopy!"
+
+ *penc-option* *E620*
+'printencoding' 'penc' String (default empty, except for:
+ MS-Windows: cp1252,
+ Macintosh: mac-roman,
+ VMS: dec-mcs,
+ HPUX: hp-roman8,
+ EBCDIC: ebcdic-uk)
+ global
+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
+replaced with '-' signs.
+
+If 'printencoding' is empty or Vim cannot find the file then it will use
+'encoding' (if 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 multibyte 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.
+If no conversion is possible then printing will fail. Any characters that
+cannot be converted will be replaced with upside down question marks.
+
+Four print character encoding files are provided to support default Mac, VMS,
+HPUX, and EBCDIC character encodings and are used by default on these
+platforms. Code page 1252 print character encoding is used by default on
+MS-Windows platform.
+
+ *pexpr-option*
+'printexpr' 'pexpr' String (default: see below)
+ global
+Expression that is evaluated to print the PostScript produced with
+|:hardcopy|.
+The file name to be printed is in |v:fname_in|.
+The arguments to the ":hardcopy" command are in |v:cmdarg|.
+The expression must take care of deleting the file after printing it.
+When there is an error, the expression must return a non-zero number.
+If there is no error, return zero or an empty string.
+The default for non MS-Windows or VMS systems is to simply use "lpr" to print
+the file: >
+
+ system('lpr' .. (&printdevice == '' ? '' : ' -P' .. &printdevice)
+ .. ' ' .. v:fname_in) .. delete(v:fname_in) + v:shell_error
+
+On MS-Windows machines the default is to copy the file to the currently
+specified printdevice: >
+
+ system('copy' .. ' ' .. v:fname_in .. (&printdevice == ''
+ ? ' LPT1:' : (' \"' .. &printdevice .. '\"')))
+ .. delete(v:fname_in)
+
+On VMS machines the default is to send the file to either the default or
+currently specified printdevice: >
+
+ system('print' .. (&printdevice == '' ? '' : ' /queue=' ..
+ &printdevice) .. ' ' .. v:fname_in) .. delete(v:fname_in)
+
+If you change this option, using a function is an easy way to avoid having to
+escape all the spaces. Example: >
+
+ :set printexpr=PrintFile()
+ :function PrintFile()
+ : call system("ghostview " .. v:fname_in)
+ : call delete(v:fname_in)
+ : return v:shell_error
+ :endfunc
+
+It is more efficient if the option is set to just a function call,
+see |expr-option-function|.
+
+Be aware that some print programs return control before they have read the
+file. If you delete the file too soon it will not be printed. These programs
+usually offer an option to have them remove the file when printing is done.
+ *E365*
+If evaluating the expression fails or it results in a non-zero number, you get
+an error message. In that case Vim will delete the file. In the default
+value for non-MS-Windows a trick is used: Adding "v:shell_error" will result
+in a non-zero number when the system() call fails.
+
+If the expression starts with s: or |<SID>|, then it is replaced with the
+script ID (|local-function|). Example: >
+ set printexpr=s:MyPrintFile()
+ set printexpr=<SID>SomePrintFile()
+Otherwise, the expression is evaluated in the context of the script where the
+option was set, thus script-local items are available.
+
+This option cannot be set from a |modeline| or in the |sandbox|, for security
+reasons.
+
+ *pfn-option* *E613*
+'printfont' 'pfn' string (default "courier")
+ global
+This is the name of the font that will be used for the |:hardcopy| command's
+output. It has the same format as the 'guifont' option, except that only one
+font may be named, and the special "guifont=*" syntax is not available.
+
+In the Win32 GUI version this specifies a font name with its extra attributes,
+as with the 'guifont' option.
+
+For other systems, only ":h11" is recognized, where "11" is the point size of
+the font. When omitted, the point size is 10.
+
+ *pheader-option*
+'printheader' 'pheader' string (default "%<%f%h%m%=Page %N")
+ global
+This defines the format of the header produced in |:hardcopy| output. The
+option is defined in the same way as the 'statusline' option. If Vim has not
+been compiled with the |+statusline| feature, this option has no effect and a
+simple default header is used, which shows the page number. The same simple
+header is used when this option is empty.
+
+ *pmbcs-option*
+'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:
+
+ Value Description ~
+ Chinese GB_2312-80
+ (Simplified) GBT_12345-90
+ MAC Apple Mac Simplified Chinese
+ GBT-90_MAC GB/T 12345-90 Apple Mac Simplified
+ Chinese
+ GBK GBK (GB 13000.1-93)
+ ISO10646 ISO 10646-1:1993
+
+ Chinese CNS_1993 CNS 11643-1993, Planes 1 & 2
+ (Traditional) BIG5
+ ETEN Big5 with ETen extensions
+ ISO10646 ISO 10646-1:1993
+
+ Japanese JIS_C_1978
+ JIS_X_1983
+ JIS_X_1990
+ MSWINDOWS Win3.1/95J (JIS X 1997 + NEC +
+ IBM extensions)
+ KANJITALK6 Apple Mac KanjiTalk V6.x
+ KANJITALK7 Apple Mac KanjiTalk V7.x
+
+ Korean KS_X_1992
+ MAC Apple Macintosh Korean
+ MSWINDOWS KS X 1992 with MS extensions
+ ISO10646 ISO 10646-1:1993
+
+Only certain combinations of the above values and 'printencoding' are
+possible. The following tables show the valid combinations:
+
+ euc-cn gbk ucs-2 utf-8 ~
+ Chinese GB_2312-80 x
+ (Simplified) GBT_12345-90 x
+ MAC x
+ GBT-90_MAC x
+ GBK x
+ ISO10646 x x
+
+ euc-tw big5 ucs-2 utf-8 ~
+ Chinese CNS_1993 x
+ (Traditional) BIG5 x
+ ETEN x
+ ISO10646 x x
+
+ euc-jp sjis ucs-2 utf-8 ~
+ Japanese JIS_C_1978 x x
+ JIS_X_1983 x x
+ JIS_X_1990 x x x
+ MSWINDOWS x
+ KANJITALK6 x
+ KANJITALK7 x
+
+ euc-kr cp949 ucs-2 utf-8 ~
+ Korean KS_X_1992 x
+ MAC x
+ MSWINDOWS x
+ ISO10646 x x
+
+To set up the correct encoding and character set for printing some
+Japanese text you would do the following; >
+ :set printencoding=euc-jp
+ :set printmbcharset=JIS_X_1983
+
+If 'printmbcharset' is not one of the above values then it is assumed to
+specify a custom multibyte character set and no check will be made that it is
+compatible with the value for 'printencoding'. Vim will look for a file
+defining the character set in the "print" directory in 'runtimepath'.
+
+ *pmbfn-option*
+'printmbfont' 'pmbfn' string (default "")
+ global
+This is a comma-separated list of fields for font names to be used when
+generating CJK output from |:hardcopy|. Each font name has to be preceded
+with a letter indicating the style the font is to be used for as follows:
+
+ r:{font-name} font to use for normal characters
+ b:{font-name} font to use for bold characters
+ i:{font-name} font to use for italic characters
+ o:{font-name} font to use for bold-italic characters
+
+A field with the r: prefix must be specified when doing CJK printing. The
+other fontname specifiers are optional. If a specifier is missing then
+another font will be used as follows:
+
+ if b: is missing, then use r:
+ if i: is missing, then use r:
+ if o: is missing, then use b:
+
+Some CJK fonts do not contain characters for codes in the ASCII code range.
+Also, some characters in the CJK ASCII code ranges differ in a few code points
+from traditional ASCII characters. There are two additional fields to control
+printing of characters in the ASCII code range.
+
+ c:yes Use Courier font for characters in the ASCII
+ c:no (default) code range.
+
+ a:yes Use ASCII character set for codes in the ASCII
+ a:no (default) code range.
+
+The following is an example of specifying two multibyte fonts, one for normal
+and italic printing and one for bold and bold-italic printing, and using
+Courier to print codes in the ASCII code range but using the national
+character set: >
+ :set printmbfont=r:WadaMin-Regular,b:WadaMin-Bold,c:yes
+<
+ *popt-option*
+'printoptions' 'popt' string (default "")
+ global
+This is a comma-separated list of items that control the format of the output
+of |:hardcopy|:
+
+ left:{spec} left margin (default: 10pc)
+ right:{spec} right margin (default: 5pc)
+ top:{spec} top margin (default: 5pc)
+ bottom:{spec} bottom margin (default: 5pc)
+ {spec} is a number followed by "in" for inches, "pt"
+ for points (1 point is 1/72 of an inch), "mm" for
+ millimeters or "pc" for a percentage of the media
+ size.
+ Weird example:
+ left:2in,top:30pt,right:16mm,bottom:3pc
+ If the unit is not recognized there is no error and
+ the default value is used.
+
+ header:{nr} Number of lines to reserve for the header.
+ Only the first line is actually filled, thus when {nr}
+ is 2 there is one empty line. The header is formatted
+ according to 'printheader'.
+ header:0 Do not print a header.
+ header:2 (default) Use two lines for the header
+
+ syntax:n Do not use syntax highlighting. This is faster and
+ thus useful when printing large files.
+ syntax:y Do syntax highlighting.
+ syntax:a (default) Use syntax highlighting if the printer appears to be
+ able to print color or grey.
+
+ number:y Include line numbers in the printed output.
+ number:n (default) No line numbers.
+
+ wrap:y (default) Wrap long lines.
+ wrap:n Truncate long lines.
+
+ duplex:off Print on one side.
+ duplex:long (default) Print on both sides (when possible), bind on long
+ side.
+ duplex:short Print on both sides (when possible), bind on short
+ side.
+
+ collate:y (default) Collating: 1 2 3, 1 2 3, 1 2 3
+ collate:n No collating: 1 1 1, 2 2 2, 3 3 3
+
+ jobsplit:n (default) Do all copies in one print job
+ jobsplit:y Do each copy as a separate print job. Useful when
+ doing N-up postprocessing.
+
+ portrait:y (default) Orientation is portrait.
+ portrait:n Orientation is landscape.
+ *a4* *letter*
+ paper:A4 (default) Paper size: A4
+ paper:{name} Paper size from this table:
+ {name} size in cm size in inch ~
+ 10x14 25.4 x 35.57 10 x 14
+ A3 29.7 x 42 11.69 x 16.54
+ A4 21 x 29.7 8.27 x 11.69
+ A5 14.8 x 21 5.83 x 8.27
+ B4 25 x 35.3 10.12 x 14.33
+ B5 17.6 x 25 7.17 x 10.12
+ executive 18.42 x 26.67 7.25 x 10.5
+ folio 21 x 33 8.27 x 13
+ ledger 43.13 x 27.96 17 x 11
+ legal 21.59 x 35.57 8.5 x 14
+ letter 21.59 x 27.96 8.5 x 11
+ quarto 21.59 x 27.5 8.5 x 10.83
+ statement 13.97 x 21.59 5.5 x 8.5
+ tabloid 27.96 x 43.13 11 x 17
+
+ formfeed:n (default) Treat form feed characters (0x0c) as a normal print
+ character.
+ formfeed:y When a form feed character is encountered, continue
+ printing of the current line at the beginning of the
+ first line on a new page.
+
+The item indicated with (default) is used when the item is not present. The
+values are not always used, especially when using a dialog to select the
+printer and options.
+Example: >
+ :set printoptions=paper:letter,duplex:off
+
+==============================================================================
+3. PostScript Printing *postscript-printing*
+ *E455* *E456* *E457* *E624*
+Provided you have enough disk space there should be no problems generating a
+PostScript file. You need to have the runtime files correctly installed (if
+you can find the help files, they probably are).
+
+There are currently a number of limitations with PostScript printing:
+
+- 'printfont' - The font name is ignored (the Courier family is always used -
+ it should be available on all PostScript printers) but the font size is
+ used.
+
+- 'printoptions' - The duplex setting is used when generating PostScript
+ output, but it is up to the printer to take notice of the setting. If the
+ printer does not support duplex printing then it should be silently ignored.
+ Some printers, however, don't print at all.
+
+- 8-bit support - While a number of 8-bit print character encodings are
+ supported it is possible that some characters will not print. Whether a
+ character will print depends on the font in the printer knowing the
+ character. Missing characters will be replaced with an upside down question
+ mark, or a space if that character is also not known by the font. It may be
+ 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 multibyte 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 multibyte
+ to the 8-bit encoding.
+
+==============================================================================
+4. Custom 8-bit Print Character Encodings *postscript-print-encoding*
+ *E618* *E619*
+To use your own print character encoding when printing 8-bit character data
+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
+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
+ |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.
+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.
+
+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
+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.]
+
+==============================================================================
+5. PostScript CJK Printing *postscript-cjk-printing*
+ *E673* *E674* *E675*
+
+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
+require that both be specified when printing. In addition, CJK fonts normally
+do not have the concept of italic glyphs and use different weight or stroke
+style to achieve emphasis when printing. This in turn requires a different
+approach to specifying fonts to use when printing.
+
+The encoding and character set are specified with the 'printencoding' and
+'printmbcharset' options. If 'printencoding' is not specified then 'encoding'
+is used as normal. If 'printencoding' is specified then characters will be
+translated to this encoding for printing. You should ensure that the encoding
+is compatible with the character set needed for the file contents or some
+characters may not appear when printed.
+
+The fonts to use for CJK printing are specified with 'printmbfont'. This
+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
+Traditional Chinese fonts available at:
+
+ http://examples.oreilly.com/cjkvinfo/adobe/samples/
+
+You can find descriptions of the various fonts in the read me file at
+
+ http://examples.oreilly.de/english_examples/cjkvinfo/adobe/00README
+
+Please read your printer documentation on how to install new fonts.
+
+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
+half-width ASCII characters with 'printmbfont'. If your font does not include
+other characters then you will need to find another font that does.
+
+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'.
+
+It is possible to define your own multibyte character set although this
+should not be attempted lightly. A discussion on the process if beyond the
+scope of these help files. You can find details on CMap (character map) files
+in the document 'Adobe CMap and CIDFont Files Specification, Version 1.0',
+available from http://www.adobe.com as a PDF file.
+
+==============================================================================
+6. PostScript Printing Troubleshooting *postscript-print-trouble*
+ *E621*
+Usually the only sign of a problem when printing with PostScript is that your
+printout does not appear. If you are lucky you may get a printed page that
+tells you the PostScript operator that generated the error that prevented the
+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
+ 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
+ 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
+ for 'printoptions', using the paper that is closest in both width AND height.
+ Note: The dimensions of actual paper may vary slightly from the ones listed.
+ If there is no paper listed close enough, then you may want to try psresize
+ from PSUtils, discussed below.
+
+- Two-sided printing (duplex). Normally a PostScript printer that does not
+ support two-sided printing will ignore any request to do it. However, some
+ printers may abort the job altogether. Try printing with duplex turned off.
+ Note: Duplex prints can be achieved manually using PS utils - see below.
+
+- Collated printing. As with Duplex printing, most PostScript printers that
+ do not support collating printouts will ignore a request to do so. Some may
+ not. Try printing with collation turned off.
+
+- Syntax highlighting. Some print management code may prevent the generated
+ PostScript file from being printed on a black and white printer when syntax
+ highlighting is turned on, even if solid black is the only color used. Try
+ printing with syntax highlighting turned off.
+
+A safe printoptions setting to try is: >
+
+ :set printoptions=paper:A4,duplex:off,collate:n,syntax:n
+
+Replace "A4" with the paper size that best matches your printer paper.
+
+==============================================================================
+7. PostScript Utilities *postscript-print-util*
+
+7.1 Ghostscript
+
+Ghostscript is a PostScript and PDF interpreter that can be used to display
+and print on non-PostScript printers PostScript and PDF files. It can also
+generate PDF files from PostScript.
+
+Ghostscript will run on a wide variety of platforms.
+
+There are three available versions:
+
+- AFPL Ghostscript (formerly Aladdin Ghostscript) which is free for
+ non-commercial use. It can be obtained from:
+
+ http://www.cs.wisc.edu/~ghost/
+
+- GNU Ghostscript which is available under the GNU General Public License. It
+ can be obtained from:
+
+ ftp://mirror.cs.wisc.edu/pub/mirrors/ghost/gnu/
+
+- A commercial version for inclusion in commercial products.
+
+Additional information on Ghostscript can also be found at:
+
+ http://www.ghostscript.com/
+
+Support for a number of non PostScript printers is provided in the
+distribution as standard, but if you cannot find support for your printer
+check the Ghostscript site for other printers not included by default.
+
+
+7.2 Ghostscript Previewers.
+
+The interface to Ghostscript is very primitive so a number of graphical front
+ends have been created. These allow easier PostScript file selection,
+previewing at different zoom levels, and printing. Check supplied
+documentation for full details.
+
+X11
+
+- Ghostview. Obtainable from:
+
+ http://www.cs.wisc.edu/~ghost/gv/
+
+- gv. Derived from Ghostview. Obtainable from:
+
+ http://wwwthep.physik.uni-mainz.de/~plass/gv/
+
+ Copies (possibly not the most recent) can be found at:
+
+ http://www.cs.wisc.edu/~ghost/gv/
+
+OpenVMS
+
+- Is apparently supported in the main code now (untested). See:
+
+ http://wwwthep.physik.uni-mainz.de/~plass/gv/
+
+MS-Windows
+
+- GSview. Obtainable from:
+
+ http://www.cs.wisc.edu/~ghost/gsview/
+
+Linux
+
+- GSview. Linux version of the popular MS-Windows previewer.
+ Obtainable from:
+
+ http://www.cs.wisc.edu/~ghost/gsview/
+
+- BMV. Different from Ghostview and gv in that it doesn't use X but svgalib.
+ Obtainable from:
+
+ ftp://sunsite.unc.edu/pub/Linux/apps/graphics/viewers/svga/bmv-1.2.tgz
+
+
+7.3 PSUtils
+
+PSUtils is a collection of utility programs for manipulating PostScript
+documents. Binary distributions are available for many platforms, as well as
+the full source. PSUtils can be found at:
+
+ http://knackered.org/angus/psutils
+
+The utilities of interest include:
+
+- psnup. Convert PS files for N-up printing.
+- psselect. Select page range and order of printing.
+- psresize. Change the page size.
+- psbook. Reorder and lay out pages ready for making a book.
+
+The output of one program can be used as the input to the next, allowing for
+complex print document creation.
+
+
+N-UP PRINTING
+
+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: >
+
+ :hardcopy > test.ps
+
+Then on your command line execute: >
+
+ psnup -n 2 test.ps final.ps
+
+Note: You may get warnings from some Ghostscript previewers for files produced
+by psnup - these may safely be ignored.
+
+Finally print the file final.ps to your PostScript printer with your
+platform's print command. (You will need to delete the two PostScript files
+afterwards yourself.) 'printexpr' could be modified to perform this extra
+step before printing.
+
+
+ALTERNATE DUPLEX PRINTING
+
+It is possible to achieve a poor man's version of duplex printing using the PS
+utility psselect. This utility has options -e and -o for printing just the
+even or odd pages of a PS file respectively.
+
+First generate a PS file with the 'hardcopy' command, then generate new
+files with all the odd and even numbered pages with: >
+
+ psselect -o test.ps odd.ps
+ psselect -e test.ps even.ps
+
+Next print odd.ps with your platform's normal print command. Then take the
+print output, turn it over and place it back in the paper feeder. Now print
+even.ps with your platform's print command. All the even pages should now
+appear on the back of the odd pages.
+
+There are a couple of points to bear in mind:
+
+1. Position of the first page. If the first page is on top of the printout
+ when printing the odd pages then you need to reverse the order that the odd
+ pages are printed. This can be done with the -r option to psselect. This
+ will ensure page 2 is printed on the back of page 1.
+ Note: it is better to reverse the odd numbered pages rather than the even
+ numbered in case there are an odd number of pages in the original PS file.
+
+2. Paper flipping. When turning over the paper with the odd pages printed on
+ them you may have to either flip them horizontally (along the long edge) or
+ vertically (along the short edge), as well as possibly rotating them 180
+ degrees. All this depends on the printer - it will be more obvious for
+ desktop ink jets than for small office laser printers where the paper path
+ is hidden from view.
+
+
+==============================================================================
+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
+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)
+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.
+
+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
+will not have a line number printed for it (in the same way as the wrapped
+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
+down a line to continue printing.
+
+Due to the points made above it is recommended that when formfeed character
+processing is enabled, printing of line numbers is disabled, and that form
+feed characters are not the last character on a line. Even then you may need
+to adjust the number of lines before a formfeed character to prevent
+accidental blank pages.
+
+==============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt
new file mode 100644
index 0000000..96ba382
--- /dev/null
+++ b/runtime/doc/quickfix.txt
@@ -0,0 +1,2056 @@
+*quickfix.txt* For Vim version 9.0. Last change: 2023 Jan 18
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+10. Customizing the quickfix window |quickfix-window-function|
+
+The quickfix commands are not available when the |+quickfix| feature was
+disabled at compile time.
+
+=============================================================================
+1. Using QuickFix commands *quickfix* *Quickfix* *E42*
+
+Vim has a special mode to speedup the edit-compile-edit cycle. This is
+inspired by the quickfix option of the Manx's Aztec C compiler on the Amiga.
+The idea is to save the error messages from the compiler in a file and use Vim
+to jump to the errors one by one. You can examine each problem and fix it,
+without having to remember all the error messages.
+
+In Vim the quickfix commands are used more generally to find a list of
+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!
+
+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 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.
+ *location-list-file-window*
+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 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
+command with 'l'.
+
+ *E924*
+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
+:[nr]cc[!] error is displayed again. Without [!] this doesn't
+ work when jumping to another buffer, the current buffer
+ has been changed, there is the only window for the
+ buffer and both 'hidden' and 'autowrite' are off.
+ When jumping to another buffer with [!] any changes to
+ the current buffer are lost, unless 'hidden' is set or
+ there is another window for this buffer.
+ The 'switchbuf' settings are respected when jumping
+ to a buffer.
+ When used in the quickfix window the line number can
+ be used, including "." for the current line and "$"
+ for the last line.
+
+ *:ll*
+:ll[!] [nr] Same as ":cc", except the location list for the
+:[nr]ll[!] current window is used instead of the quickfix list.
+
+ *:cn* *:cne* *:cnext* *E553*
+:[count]cn[ext][!] Display the [count] next error in the list that
+ includes a file name. If there are no file names at
+ all, go to the [count] next error. See |:cc| for
+ [!] and 'switchbuf'.
+
+ *:lne* *:lnext*
+:[count]lne[xt][!] Same as ":cnext", except the location list for the
+ current window is used instead of the quickfix list.
+
+:[count]cN[ext][!] *:cp* *:cprevious* *:cprev* *:cN* *:cNext*
+:[count]cp[revious][!] Display the [count] previous error in the list that
+ includes a file name. If there are no file names at
+ all, go to the [count] previous error. See |:cc| for
+ [!] and 'switchbuf'.
+
+
+:[count]lN[ext][!] *:lp* *:lprevious* *:lprev* *:lN* *:lNext*
+:[count]lp[revious][!] Same as ":cNext" and ":cprevious", except the location
+ list for the current window is used instead of the
+ quickfix list.
+
+ *:cabo* *:cabove*
+:[count]cabo[ve] Go to the [count] error above the current line in the
+ current buffer. If [count] is omitted, then 1 is
+ used. If there are no errors, then an error message
+ is displayed. Assumes that the entries in a quickfix
+ list are sorted by their buffer number and line
+ number. If there are multiple errors on the same line,
+ then only the first entry is used. If [count] exceeds
+ the number of entries above the current line, then the
+ first error in the file is selected.
+
+ *:lab* *:labove*
+:[count]lab[ove] Same as ":cabove", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:cbel* *:cbelow*
+:[count]cbel[ow] Go to the [count] error below the current line in the
+ current buffer. If [count] is omitted, then 1 is
+ used. If there are no errors, then an error message
+ is displayed. Assumes that the entries in a quickfix
+ list are sorted by their buffer number and line
+ number. If there are multiple errors on the same
+ line, then only the first entry is used. If [count]
+ exceeds the number of entries below the current line,
+ then the last error in the file is selected.
+
+ *:lbel* *:lbelow*
+:[count]lbel[ow] Same as ":cbelow", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:cbe* *:cbefore*
+:[count]cbe[fore] Go to the [count] error before the current cursor
+ position in the current buffer. If [count] is
+ omitted, then 1 is used. If there are no errors, then
+ an error message is displayed. Assumes that the
+ entries in a quickfix list are sorted by their buffer,
+ line and column numbers. If [count] exceeds the
+ number of entries before the current position, then
+ the first error in the file is selected.
+
+ *:lbe* *:lbefore*
+:[count]lbe[fore] Same as ":cbefore", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:caf* *:cafter*
+:[count]caf[ter] Go to the [count] error after the current cursor
+ position in the current buffer. If [count] is
+ omitted, then 1 is used. If there are no errors, then
+ an error message is displayed. Assumes that the
+ entries in a quickfix list are sorted by their buffer,
+ line and column numbers. If [count] exceeds the
+ number of entries after the current position, then
+ the last error in the file is selected.
+
+ *:laf* *:lafter*
+:[count]laf[ter] Same as ":cafter", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:cnf* *:cnfile*
+:[count]cnf[ile][!] Display the first error in the [count] next file in
+ the list that includes a file name. If there are no
+ file names at all or if there is no next file, go to
+ the [count] next error. See |:cc| for [!] and
+ 'switchbuf'.
+
+ *:lnf* *:lnfile*
+:[count]lnf[ile][!] Same as ":cnfile", except the location list for the
+ current window is used instead of the quickfix list.
+
+:[count]cNf[ile][!] *:cpf* *:cpfile* *:cNf* *:cNfile*
+:[count]cpf[ile][!] Display the last error in the [count] previous file in
+ the list that includes a file name. If there are no
+ file names at all or if there is no next file, go to
+ the [count] previous error. See |:cc| for [!] and
+ 'switchbuf'.
+
+
+:[count]lNf[ile][!] *:lpf* *:lpfile* *:lNf* *:lNfile*
+:[count]lpf[ile][!] Same as ":cNfile" and ":cpfile", except the location
+ list for the current window is used instead of the
+ quickfix list.
+
+ *:crewind* *:cr*
+:cr[ewind][!] [nr] Display error [nr]. If [nr] is omitted, the FIRST
+ error is displayed. See |:cc|.
+
+ *:lrewind* *:lr*
+:lr[ewind][!] [nr] Same as ":crewind", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:cfirst* *:cfir*
+:cfir[st][!] [nr] Same as ":crewind".
+
+ *:lfirst* *:lfir*
+:lfir[st][!] [nr] Same as ":lrewind".
+
+ *:clast* *:cla*
+:cla[st][!] [nr] Display error [nr]. If [nr] is omitted, the LAST
+ error is displayed. See |:cc|.
+
+ *:llast* *:lla*
+:lla[st][!] [nr] Same as ":clast", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:cq* *:cquit*
+:cq[uit][!]
+:{N}cq[uit][!]
+:cq[uit][!] {N} Quit Vim with error code {N}. {N} defaults to one.
+ Useful when Vim is called from another program:
+ e.g., a compiler will not compile the same file again,
+ `git commit` will abort the committing process, `fc`
+ (built-in for shells like bash and zsh) will not
+ execute the command, etc.
+ {N} can also be zero, in which case Vim exits
+ normally.
+ 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.
+
+ *:cf* *:cfi* *:cfile*
+:cf[ile][!] [errorfile] Read the error file and jump to the first error.
+ This is done automatically when Vim is started with
+ the -q option. You can use this command when you
+ 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* *:lfi* *:lfile*
+:lf[ile][!] [errorfile] Same as ":cfile", except the location list for the
+ current window is used instead of the quickfix list.
+ You can not use the -q command-line option to set
+ the location list.
+
+
+: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* *:lge* *:lgetfile*
+ Same as ":cgetfile", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:caddf* *:caddfile*
+: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
+ current window is used instead of the quickfix list.
+
+ *:cb* *:cbuffer* *E681*
+:cb[uffer][!] [bufnr] Read the error list from the current buffer.
+ When [bufnr] is given it must be the number of a
+ loaded buffer. That buffer will then be used instead
+ of the current buffer.
+ A range can be specified for the lines to be used.
+ Otherwise all lines in the buffer are used.
+ See |:cc| for [!].
+
+ *:lb* *:lbuffer*
+:lb[uffer][!] [bufnr] Same as ":cbuffer", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:cgetb* *:cgetbuffer*
+:cgetb[uffer] [bufnr] Read the error list from the current buffer. Just
+ like ":cbuffer" but don't jump to the first error.
+
+ *:lgetb* *:lgetbuffer*
+:lgetb[uffer] [bufnr] Same as ":cgetbuffer", except the location list for
+ the current window is used instead of the quickfix
+ list.
+
+ *:cad* *:cadd* *:caddbuffer*
+:cad[dbuffer] [bufnr] Read the error list from the current buffer and add
+ the errors to the current quickfix list. If a
+ quickfix list is not present, then a new list is
+ created. Otherwise, same as ":cbuffer".
+
+ *:laddb* *:laddbuffer*
+:laddb[uffer] [bufnr] Same as ":caddbuffer", except the location list for
+ the current window is used instead of the quickfix
+ list.
+
+ *:cex* *:cexpr* *E777*
+:cex[pr][!] {expr} Create a quickfix list using the result of {expr} and
+ jump to the first error.
+ If {expr} is a String, then each newline terminated
+ line in the String is processed using the global value
+ of 'errorformat' and the result is added to the
+ quickfix list.
+ If {expr} is a List, then each String item in the list
+ is processed and added to the quickfix list. Non
+ String items in the List are ignored.
+ See |:cc| for [!].
+ Examples: >
+ :cexpr system('grep -n xyz *')
+ :cexpr getline(1, '$')
+<
+ *:lex* *:lexpr*
+:lex[pr][!] {expr} Same as |:cexpr|, except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:cgete* *:cgetexpr*
+:cgete[xpr] {expr} Create a quickfix list using the result of {expr}.
+ Just like |:cexpr|, but don't jump to the first error.
+
+ *:lgete* *:lgetexpr*
+:lgete[xpr] {expr} Same as |:cgetexpr|, except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:cadde* *:caddexpr*
+:cadde[xpr] {expr} Evaluate {expr} and add the resulting lines to the
+ current quickfix list. If a quickfix list is not
+ present, then a new list is created. The current
+ cursor position will not be changed. See |:cexpr| for
+ more information.
+ Example: >
+ :g/mypattern/caddexpr expand("%") .. ":" .. line(".") .. ":" .. getline(".")
+<
+ *:lad* *:addd* *:laddexpr*
+:lad[dexpr] {expr} Same as ":caddexpr", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:cl* *:clist*
+:cl[ist] [from] [, [to]]
+ List all errors that are valid |quickfix-valid|.
+ If numbers [from] and/or [to] are given, the respective
+ range of errors is listed. A negative number counts
+ from the last error backwards, -1 being the last error.
+ 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.
+
+: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.
+
+:lli[st]! [from] [, [to]]
+ List all the entries in the location list for the
+ current window.
+
+If you insert or delete lines, mostly the correct error location is still
+found because hidden marks are used. Sometimes, when the mark has been
+deleted for some reason, the message "line changed" is shown to warn you that
+the error location may not be correct. If you quit Vim and start again the
+marks are lost and the error locations may not be correct anymore.
+
+Two autocommands are available for running commands before and after a
+quickfix command (':make', ':grep' and so on) is executed. See
+|QuickFixCmdPre| and |QuickFixCmdPost| for details.
+
+ *QuickFixCmdPost-example*
+When 'encoding' differs from the locale, the error messages may have a
+different encoding from what Vim is using. To convert the messages you can
+use this code: >
+ function QfMakeConv()
+ let qflist = getqflist()
+ for i in qflist
+ let i.text = iconv(i.text, "cp936", "utf-8")
+ endfor
+ call setqflist(qflist)
+ 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-index*
+When you jump to a quickfix/location list entry using any of the quickfix
+commands (e.g. |:cc|, |:cnext|, |:cprev|, etc.), that entry becomes the
+currently selected entry. The index of the currently selected entry in a
+quickfix/location list can be obtained using the getqflist()/getloclist()
+functions. Examples: >
+ echo getqflist({'idx' : 0}).idx
+ echo getqflist({'id' : qfid, 'idx' : 0}).idx
+ echo getloclist(2, {'idx' : 0}).idx
+<
+For a new quickfix list, the first entry is selected and the index is 1. Any
+entry in any quickfix/location list can be set as the currently selected entry
+using the setqflist() function. Examples: >
+ call setqflist([], 'a', {'idx' : 12})
+ call setqflist([], 'a', {'id' : qfid, 'idx' : 7})
+ call setloclist(1, [], 'a', {'idx' : 7})
+<
+ *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*
+:cdo[!] {cmd} Execute {cmd} in each valid entry in the quickfix list.
+ It works like doing this: >
+ :cfirst
+ :{cmd}
+ :cnext
+ :{cmd}
+ etc.
+< When the current file can't be |abandon|ed and the [!]
+ is not present, the command fails.
+ When going to the next entry fails execution stops.
+ The last buffer (or where an error occurred) becomes
+ the current buffer.
+ {cmd} can contain '|' to concatenate several commands.
+
+ Only valid entries in the quickfix list are used.
+ A range can be used to select entries, e.g.: >
+ :10,$cdo cmd
+< To skip entries 1 to 9.
+
+ Note: While this command is executing, the Syntax
+ autocommand event is disabled by adding it to
+ 'eventignore'. This considerably speeds up editing
+ each buffer.
+ Also see |:bufdo|, |:tabdo|, |:argdo|, |:windo|,
+ |:ldo|, |:cfdo| and |:lfdo|.
+
+ *:cfdo*
+:cfdo[!] {cmd} Execute {cmd} in each file in the quickfix list.
+ It works like doing this: >
+ :cfirst
+ :{cmd}
+ :cnfile
+ :{cmd}
+ etc.
+< Otherwise it works the same as `:cdo`.
+
+ *:ldo*
+:ld[o][!] {cmd} Execute {cmd} in each valid entry in the location list
+ for the current window.
+ It works like doing this: >
+ :lfirst
+ :{cmd}
+ :lnext
+ :{cmd}
+ etc.
+< Only valid entries in the location list are used.
+ Otherwise it works the same as `:cdo`.
+
+ *:lfdo*
+:lfdo[!] {cmd} Execute {cmd} in each file in the location list for
+ the current window.
+ It works like doing this: >
+ :lfirst
+ :{cmd}
+ :lnfile
+ :{cmd}
+ etc.
+< Otherwise it works the same as `:ldo`.
+
+FILTERING A QUICKFIX OR LOCATION LIST:
+ *cfilter-plugin* *:Cfilter* *:Lfilter*
+If you have too many entries in a quickfix list, you can use the cfilter
+plugin to reduce the number of entries. Load the plugin with: >
+
+ packadd cfilter
+
+Then you can use the following commands to filter a quickfix/location list: >
+
+ :Cfilter[!] /{pat}/
+ :Lfilter[!] /{pat}/
+
+The |:Cfilter| command creates a new quickfix list from the entries matching
+{pat} in the current quickfix list. {pat} is a Vim |regular-expression|
+pattern. Both the file name and the text of the entries are matched against
+{pat}. If the optional ! is supplied, then the entries not matching {pat} are
+used. The pattern can be optionally enclosed using one of the following
+characters: ', ", /. If the pattern is empty, then the last used search
+pattern is used.
+
+The |:Lfilter| command does the same as |:Cfilter| but operates on the current
+location list.
+
+The current quickfix/location list is not modified by these commands, so you
+can go back to the unfiltered list using the |:colder|/|:lolder| command.
+
+=============================================================================
+2. The error window *quickfix-window*
+
+ *:cope* *:copen* *w:quickfix_title*
+:cope[n] [height] Open a window to show the current list of errors.
+
+ When [height] is given, the window becomes that high
+ (if there is room). When [height] is omitted the
+ window is made ten lines high.
+
+ If there already is a quickfix window, it will be made
+ the current window. It is not possible to open a
+ second quickfix window. If [height] is given the
+ existing window will be resized to it.
+
+ *quickfix-buffer*
+ The window will contain a special buffer, with
+ 'buftype' equal to "quickfix". Don't change this!
+ The window will have the w:quickfix_title variable set
+ 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. Whenever this buffer is modified by a
+ quickfix command or function, the |b:changedtick|
+ variable is incremented. You can get the number of
+ this buffer using the getqflist() and getloclist()
+ functions by passing the "qfbufnr" item. For a
+ location list, this buffer is wiped out when the
+ location list is removed.
+
+ *:lop* *:lopen*
+:lop[en] [height] Open a window to show the location list for the
+ current window. Works only when the location list for
+ the current window is present. You can have more than
+ one location window opened at a time. Otherwise, it
+ acts the same as ":copen".
+
+ *:ccl* *:cclose*
+:ccl[ose] Close the quickfix window.
+
+ *:lcl* *:lclose*
+:lcl[ose] Close the window showing the location list for the
+ current window.
+
+ *:cw* *:cwindow*
+:cw[indow] [height] Open the quickfix window when there are recognized
+ errors. If the window is already open and there are
+ no recognized errors, close the window.
+
+ *:lw* *:lwindow*
+: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: >
+ :botright cwindow
+You can move the window around with |window-moving| commands.
+For example, to move it to the top: CTRL-W K
+The 'winfixheight' option will be set, which means that the window will mostly
+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. 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
+instead. If the buffer in the used window has changed, and the error is in
+another file, jumping to the error will fail. You will first have to make
+sure the window contains a buffer which can be abandoned.
+
+When you select a file from the quickfix window, the following steps are used
+to find a window to edit the file:
+
+1. If a window displaying the selected file is present in the current tabpage
+ (starting with the window before the quickfix window), then that window is
+ used.
+2. If the above step fails and if 'switchbuf' contains "usetab" and a window
+ displaying the selected file is present in any one of the tabpages
+ (starting with the first tabpage) then that window is used.
+3. If the above step fails then a window in the current tabpage displaying a
+ buffer with 'buftype' not set (starting with the window before the quickfix
+ window) is used.
+4. If the above step fails and if 'switchbuf' contains "uselast", then the
+ previously accessed window is used.
+5. If the above step fails then the window before the quickfix window is used.
+ If there is no previous window, then the window after the quickfix window
+ is used.
+6. If the above step fails, then a new horizontally split window above the
+ quickfix window is used.
+
+ *CTRL-W_<Enter>* *CTRL-W_<CR>*
+You can use CTRL-W <Enter> to open a new window and jump to the error there.
+
+When the quickfix window has been filled, two autocommand events are
+triggered. First the 'filetype' option is set to "qf", which triggers the
+FileType event (also see |qf.vim|). Then the BufReadPost event is triggered,
+using "quickfix" for the buffer name. This can be used to perform some action
+on the listed errors. Example: >
+ au BufReadPost quickfix setlocal modifiable
+ \ | silent exe 'g/^/s//\=line(".") .. " "/'
+ \ | setlocal nomodifiable
+This prepends the line number to each line. Note the use of "\=" in the
+substitute string of the ":s" command, which is used to evaluate an
+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.
+If you really want to do this, you could write the contents of the quickfix
+window to a file and use ":cfile" to have it parsed and used as the new error
+list.
+
+ *location-list-window*
+The location list window displays the entries in a location list. When you
+open a location list window, it is created below the current window and
+displays the location list for the current window. The location list window
+is similar to the quickfix window, except that you can have more than one
+location list window open at a time. When you use a location list command in
+this window, the displayed location list is used.
+
+When you select a file from the location list window, the following steps are
+used to find a window to edit the file:
+
+1. If a non-quickfix window associated with the location list is present in
+ the current tabpage, then that window is used.
+2. If the above step fails and if the file is already opened in another window
+ in the current tabpage, then that window is used.
+3. If the above step fails and 'switchbuf' contains "usetab" and if the file
+ is opened in a window in any one of the tabpages, then that window is used.
+4. If the above step fails then a window in the current tabpage showing a
+ buffer with 'buftype' not set is used.
+5. If the above step fails, then the file is edited in a new window.
+
+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 quickfix list window buffer number
+ :echo getqflist({'qfbufnr' : 0}).qfbufnr
+
+ " 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
+
+ " get the location list window buffer number of the third window
+ :echo getloclist(3, {'qfbufnr' : 0}).qfbufnr
+
+ " get the file window id of a location list window (winnr: 4)
+ :echo getloclist(4, {'filewinid' : 0}).filewinid
+<
+ *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'})
+
+ " change the current entry in the list specified by an identifier
+ :call setqflist([], 'a', {'id' : qfid, 'idx' : 10})
+
+ " 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*
+
+So far has been assumed that there is only one list of errors. Actually the
+ten last used lists are remembered. When starting a new list, the previous
+ones are automatically kept. Two commands can be used to access older error
+lists. They set one of the existing error lists as the current one.
+
+ *:colder* *:col* *E380*
+:col[der] [count] Go to older error list. When [count] is given, do
+ this [count] times. When already at the oldest error
+ list, an error message is given.
+
+ *:lolder* *:lol*
+:lol[der] [count] Same as `:colder`, except use the location list for
+ the current window instead of the quickfix list.
+
+ *:cnewer* *:cnew* *E381*
+:cnew[er] [count] Go to newer error list. When [count] is given, do
+ this [count] times. When already at the newest error
+ list, an error message is given.
+
+ *:lnewer* *:lnew*
+:lnew[er] [count] Same as `:cnewer`, except use the location list for
+ the current window instead of the quickfix list.
+
+ *:chistory* *:chi*
+:[count]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 :make ~
+ > error list 2 of 3; 0 errors :helpgrep tag ~
+ error list 3 of 3; 15 errors :grep ex_help *.c ~
+
+ When [count] is given, then the count'th quickfix
+ list is made the current list. Example: >
+ " Make the 4th quickfix list current
+ :4chistory
+<
+ *:lhistory* *:lhi*
+:[count]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
+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*
+
+ *:mak* *:make*
+:mak[e][!] [arguments] 1. All relevant |QuickFixCmdPre| autocommands are
+ executed.
+ 2. If the 'autowrite' option is on, write any changed
+ buffers
+ 3. An errorfile name is made from 'makeef'. If
+ 'makeef' doesn't contain "##", and a file with this
+ name already exists, it is deleted.
+ 4. The program given with the 'makeprg' option is
+ started (default "make") with the optional
+ [arguments] and the output is saved in the
+ errorfile (for Unix it is also echoed on the
+ screen).
+ 5. The errorfile is read using 'errorformat'.
+ 6. All relevant |QuickFixCmdPost| autocommands are
+ executed. See example below.
+ 7. If [!] is not given the first error is jumped to.
+ 8. The errorfile is deleted.
+ 9. You can now move through the errors with commands
+ 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]
+ Same as ":make", except the location list for the
+ current window is used instead of the quickfix list.
+
+The ":make" command executes the command given with the 'makeprg' option.
+This is done by passing the command to the shell given with the 'shell'
+option. This works almost like typing
+
+ ":!{makeprg} [arguments] {shellpipe} {errorfile}".
+
+{makeprg} is the string given with the 'makeprg' option. Any command can be
+used, not just "make". Characters '%' and '#' are expanded as usual on a
+command-line. You can use "%<" to insert the current file name without
+extension, or "#<" to insert the alternate file name without extension, for
+example: >
+ :set makeprg=make\ #<.o
+
+[arguments] is anything that is typed after ":make".
+{shellpipe} is the 'shellpipe' option.
+{errorfile} is the 'makeef' option, with ## replaced to make it unique.
+
+The placeholder "$*" can be used for the argument list in {makeprg} if the
+command needs some additional characters after its arguments. The $* is
+replaced then by all arguments. Example: >
+ :set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}
+or simpler >
+ :let &mp = 'latex \\nonstopmode \\input\{$*}'
+"$*" can be given multiple times, for example: >
+ :set makeprg=gcc\ -o\ $*\ $*
+
+The 'shellpipe' option defaults to ">" for the Amiga and ">%s 2>&1" for Win32.
+This means that the output of the compiler is saved in a file and not shown on
+the screen directly. For Unix "| tee" is used. The compiler output is shown
+on the screen and saved in a file the same time. Depending on the shell used
+"|& tee" or "2>&1| tee" is the default, so stderr output will be included.
+
+If 'shellpipe' is empty, the {errorfile} part will be omitted. This is useful
+for compilers that write to an errorfile themselves (e.g., Manx's Amiga C).
+
+
+Using QuickFixCmdPost to fix the encoding ~
+
+It may be that 'encoding' is set to an encoding that differs from the messages
+your build program produces. This example shows how to fix this after Vim has
+read the error messages: >
+
+ function QfMakeConv()
+ let qflist = getqflist()
+ for i in qflist
+ let i.text = iconv(i.text, "cp936", "utf-8")
+ endfor
+ call setqflist(qflist)
+ endfunction
+
+ au QuickfixCmdPost make call QfMakeConv()
+
+(Example by Faque Cheng)
+Another option is using 'makeencoding'.
+
+==============================================================================
+5. Using :vimgrep and :grep *grep* *lid*
+
+Vim has two ways to find matches for a pattern: Internal and external. The
+advantage of the internal grep is that it works on all systems and uses the
+powerful Vim search patterns. An external grep program can be used when the
+Vim grep does not do what you want.
+
+The internal method will be slower, because files are read into memory. The
+advantages are:
+- Line separators and encoding are automatically recognized, as if a file is
+ being edited.
+- Uses Vim search patterns. Multi-line patterns can be used.
+- When plugins are enabled: compressed and remote files can be searched.
+ |gzip| |netrw|
+
+To be able to do this Vim loads each file as if it is being edited. When
+there is no match in the file the associated buffer is wiped out again. The
+'hidden' option is ignored here to avoid running out of memory or file
+descriptors when searching many files. However, when the |:hide| command
+modifier is used the buffers are kept loaded. This makes following searches
+in the same files a lot faster.
+
+Note that |:copen| (or |:lopen| for |:lgrep|) may be used to open a buffer
+containing the search results in linked form. The |:silent| command may be
+used to suppress the default full screen grep output. The ":grep!" form of
+the |:grep| command doesn't jump to the first match automatically. These
+commands can be combined to create a NewGrep command: >
+
+ command! -nargs=+ NewGrep execute 'silent grep! <args>' | copen 42
+
+
+5.1 using Vim's internal grep
+
+ *:vim* *:vimgrep* *E682* *E683*
+:vim[grep][!] /{pattern}/[g][j][f] {file} ...
+ Search for {pattern} in the files {file} ... and set
+ the error list to the matches. Files matching
+ 'wildignore' are ignored; files in 'suffixes' are
+ searched last.
+
+ {pattern} 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 {pattern}.
+ 'ignorecase' applies. To overrule it put |/\c| in the
+ pattern to ignore case or |/\C| to match case.
+ 'smartcase' is not used.
+ If {pattern} is empty (e.g. // is specified), the last
+ used search pattern is used. |last-pattern|
+
+ Flags:
+ 'g' Without the 'g' flag each line is added only
+ once. With 'g' every match is added.
+
+ 'j' Without the 'j' flag Vim jumps to the first
+ match. With 'j' only the quickfix list is
+ updated. With the [!] any changes in the current
+ buffer are abandoned.
+
+ 'f' When the 'f' flag is specified, fuzzy string
+ matching is used to find matching lines. In this
+ case, {pattern} is treated as a literal string
+ instead of a regular expression. See
+ |fuzzy-matching| for more information about fuzzy
+ matching strings.
+
+ |QuickFixCmdPre| and |QuickFixCmdPost| are triggered.
+ A file that is opened for matching may use a buffer
+ number, but it is reused if possible to avoid
+ consuming buffer numbers.
+
+:{count}vim[grep] ...
+ When a number is put before the command this is used
+ as the maximum number of matches to find. Use
+ ":1vimgrep pattern file" to find only the first.
+ Useful if you only want to check if there is a match
+ and quit quickly when it's found.
+
+ Every second or so the searched file name is displayed
+ to give you an idea of the progress made.
+ Examples: >
+ :vimgrep /an error/ *.c
+ :vimgrep /\<FileName\>/ *.h include/*
+ :vimgrep /myfunc/ **/*.c
+< For the use of "**" see |starstar-wildcard|.
+
+:vim[grep][!] {pattern} {file} ...
+ Like above, but instead of enclosing the pattern in a
+ non-ID character use a white-separated pattern. The
+ pattern must start with an ID character.
+ Example: >
+ :vimgrep Error *.c
+<
+ *:lv* *:lvimgrep*
+:lv[imgrep][!] /{pattern}/[g][j][f] {file} ...
+:lv[imgrep][!] {pattern} {file} ...
+ Same as ":vimgrep", except the location list for the
+ current window is used instead of the quickfix list.
+
+ *:vimgrepa* *:vimgrepadd*
+:vimgrepa[dd][!] /{pattern}/[g][j][f] {file} ...
+:vimgrepa[dd][!] {pattern} {file} ...
+ Just like ":vimgrep", but instead of making a new list
+ of errors the matches are appended to the current
+ list.
+
+ *:lvimgrepa* *:lvimgrepadd*
+:lvimgrepa[dd][!] /{pattern}/[g][j][f] {file} ...
+:lvimgrepa[dd][!] {pattern} {file} ...
+ Same as ":vimgrepadd", except the location list for
+ the current window is used instead of the quickfix
+ list.
+
+5.2 External grep
+
+Vim can interface with "grep" and grep-like programs (such as the GNU
+id-utils) in a similar way to its compiler integration (see |:make| above).
+
+[Unix trivia: The name for the Unix "grep" command comes from ":g/re/p", where
+"re" stands for Regular Expression.]
+
+ *:gr* *:grep*
+:gr[ep][!] [arguments] Just like ":make", but use 'grepprg' instead of
+ 'makeprg' and 'grepformat' instead of 'errorformat'.
+ 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
+ current window is used instead of the quickfix list.
+
+ *:grepa* *:grepadd*
+:grepa[dd][!] [arguments]
+ Just like ":grep", but instead of making a new list of
+ errors the matches are appended to the current list.
+ Example: >
+ :call setqflist([])
+ :bufdo grepadd! something %
+< The first command makes a new error list which is
+ empty. The second command executes "grepadd" for each
+ listed buffer. Note the use of ! to avoid that
+ ":grepadd" jumps to the first error, which is not
+ allowed with |:bufdo|.
+ An example that uses the argument list and avoids
+ errors for files without matches: >
+ :silent argdo try
+ \ | grepadd! something %
+ \ | 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
+ current window is used instead of the quickfix list.
+
+5.3 Setting up external grep
+
+If you have a standard "grep" program installed, the :grep command may work
+well with the defaults. The syntax is very similar to the standard command: >
+
+ :grep foo *.c
+
+Will search all files with the .c extension for the substring "foo". The
+arguments to :grep are passed straight to the "grep" program, so you can use
+whatever options your "grep" supports.
+
+By default, :grep invokes grep with the -n option (show file and line
+numbers). You can change this with the 'grepprg' option. You will need to set
+'grepprg' if:
+
+a) You are using a program that isn't called "grep"
+b) You have to call grep with a full path
+c) You want to pass other options automatically (e.g. case insensitive
+ search.)
+
+Once "grep" has executed, Vim parses the results using the 'grepformat'
+option. This option works in the same way as the 'errorformat' option - see
+that for details. You may need to change 'grepformat' from the default if
+your grep outputs in a non-standard format, or you are using some other
+program with a special format.
+
+Once the results are parsed, Vim loads the first file containing a match and
+jumps to the appropriate line, in the same way that it jumps to a compiler
+error in |quickfix| mode. You can then use the |:cnext|, |:clist|, etc.
+commands to see the other matches.
+
+
+5.4 Using :grep with id-utils
+
+You can set up :grep to work with the GNU id-utils like this: >
+
+ :set grepprg=lid\ -Rgrep\ -s
+ :set grepformat=%f:%l:%m
+
+then >
+ :grep (regexp)
+
+works just as you'd expect.
+(provided you remembered to mkid first :)
+
+
+5.5 Browsing source code with :vimgrep or :grep
+
+Using the stack of error lists that Vim keeps, you can browse your files to
+look for functions and the functions they call. For example, suppose that you
+have to add an argument to the read_file() function. You enter this command: >
+
+ :vimgrep /\<read_file\>/ *.c
+
+You use ":cn" to go along the list of matches and add the argument. At one
+place you have to get the new argument from a higher level function msg(), and
+need to change that one too. Thus you use: >
+
+ :vimgrep /\<msg\>/ *.c
+
+While changing the msg() functions, you find another function that needs to
+get the argument from a higher level. You can again use ":vimgrep" to find
+these functions. Once you are finished with one function, you can use >
+
+ :colder
+
+to go back to the previous one.
+
+This works like browsing a tree: ":vimgrep" goes one level deeper, creating a
+list of branches. ":colder" goes back to the previous level. You can mix
+this use of ":vimgrep" and "colder" to browse all the locations in a tree-like
+way. If you do this consistently, you will find all locations without the
+need to write down a "todo" list.
+
+=============================================================================
+6. Selecting a compiler *compiler-select*
+
+ *:comp* *:compiler* *E666*
+:comp[iler][!] {name} Set options to work with compiler {name}.
+ Without the "!" options are set for the
+ current buffer. With "!" global options are
+ set.
+ If you use ":compiler foo" in "file.foo" and
+ then ":compiler! bar" in another buffer, Vim
+ will keep on using "foo" in "file.foo".
+ {not available when compiled without the
+ |+eval| feature}
+
+
+The Vim plugins in the "compiler" directory will set options to use the
+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
+not "b:current_compiler". What the command actually does is the following:
+
+- Delete the "current_compiler" and "b:current_compiler" variables.
+- Define the "CompilerSet" user command. With "!" it does ":set", without "!"
+ it does ":setlocal".
+- Execute ":runtime! compiler/{name}.vim". The plugins are expected to set
+ options with "CompilerSet" and set the "current_compiler" variable to the
+ name of the compiler.
+- Delete the "CompilerSet" user command.
+- Set "b:current_compiler" to the value of "current_compiler".
+- Without "!" the old value of "current_compiler" is restored.
+
+
+For writing a compiler plugin, see |write-compiler-plugin|.
+
+
+DOTNET *compiler-dotnet*
+
+The .NET CLI compiler outputs both errors and warnings by default. The output
+may be limited to include only errors, by setting the g:dotnet_errors_only
+variable to |v:true|.
+
+The associated project name is included in each error and warning. To suppress
+the project name, set the g:dotnet_show_project_file variable to |v:false|.
+
+Example: limit output to only display errors, and suppress the project name: >
+ let dotnet_errors_only = v:true
+ let dotnet_show_project_file = v:false
+ compiler dotnet
+<
+
+GCC *quickfix-gcc* *compiler-gcc*
+
+There's one variable you can set for the GCC compiler:
+
+g:compiler_gcc_ignore_unmatched_lines
+ Ignore lines that don't match any patterns
+ defined for GCC. Useful if output from
+ commands run from make are generating false
+ positives.
+
+
+MANX AZTEC C *quickfix-manx* *compiler-manx*
+
+To use Vim with Manx's Aztec C compiler on the Amiga you should do the
+following:
+- Set the CCEDIT environment variable with the command: >
+ mset "CCEDIT=vim -q"
+- Compile with the -qf option. If the compiler finds any errors, Vim is
+ started and the cursor is positioned on the first error. The error message
+ will be displayed on the last line. You can go to other errors with the
+ commands mentioned above. You can fix the errors and write the file(s).
+- If you exit Vim normally the compiler will re-compile the same file. If you
+ exit with the :cq command, the compiler will terminate. Do this if you
+ cannot fix the error, or if another file needs to be compiled first.
+
+There are some restrictions to the Quickfix mode on the Amiga. The
+compiler only writes the first 25 errors to the errorfile (Manx's
+documentation does not say how to get more). If you want to find the others,
+you will have to fix a few errors and exit the editor. After recompiling,
+up to 25 remaining errors will be found.
+
+If Vim was started from the compiler, the :sh and some :! commands will not
+work, because Vim is then running in the same process as the compiler and
+stdin (standard input) will not be interactive.
+
+
+PERL *quickfix-perl* *compiler-perl*
+
+The Perl compiler plugin doesn't actually compile, but invokes Perl's internal
+syntax checking feature and parses the output for possible errors so you can
+correct them in quick-fix mode.
+
+Warnings are forced regardless of "no warnings" or "$^W = 0" within the file
+being checked. To disable this set g:perl_compiler_force_warnings to a zero
+value. For example: >
+ let g:perl_compiler_force_warnings = 0
+
+
+PYUNIT COMPILER *compiler-pyunit*
+
+This is not actually a compiler, but a unit testing framework for the
+Python language. It is included into standard Python distribution
+starting from version 2.0. For older versions, you can get it from
+http://pyunit.sourceforge.net.
+
+When you run your tests with the help of the framework, possible errors
+are parsed by Vim and presented for you in quick-fix mode.
+
+Unfortunately, there is no standard way to run the tests.
+The alltests.py script seems to be used quite often, that's all.
+Useful values for the 'makeprg' options therefore are:
+ setlocal makeprg=./alltests.py " Run a testsuite
+ setlocal makeprg=python\ %:S " Run a single testcase
+
+Also see http://vim.sourceforge.net/tip_view.php?tip_id=280.
+
+
+TEX COMPILER *compiler-tex*
+
+Included in the distribution compiler for TeX ($VIMRUNTIME/compiler/tex.vim)
+uses make command if possible. If the compiler finds a file named "Makefile"
+or "makefile" in the current directory, it supposes that you want to process
+your *TeX files with make, and the makefile does the right work. In this case
+compiler sets 'errorformat' for *TeX output and leaves 'makeprg' untouched. If
+neither "Makefile" nor "makefile" is found, the compiler will not use make.
+You can force the compiler to ignore makefiles by defining
+b:tex_ignore_makefile or g:tex_ignore_makefile variable (they are checked for
+existence only).
+
+If the compiler chose not to use make, it needs to choose a right program for
+processing your input. If b:tex_flavor or g:tex_flavor (in this precedence)
+variable exists, it defines TeX flavor for :make (actually, this is the name
+of executed command), and if both variables do not exist, it defaults to
+"latex". For example, while editing chapter2.tex \input-ed from mypaper.tex
+written in AMS-TeX: >
+
+ :let b:tex_flavor = 'amstex'
+ :compiler tex
+< [editing...] >
+ :make mypaper
+
+Note that you must specify a name of the file to process as an argument (to
+process the right file when editing \input-ed or \include-ed file; portable
+solution for substituting % for no arguments is welcome). This is not in the
+semantics of make, where you specify a target, not source, but you may specify
+filename without extension ".tex" and mean this as "make filename.dvi or
+filename.pdf or filename.some_result_extension according to compiler".
+
+Note: tex command line syntax is set to usable both for MikTeX (suggestion
+by Srinath Avadhanula) and teTeX (checked by Artem Chuprina). Suggestion
+from |errorformat-LaTeX| is too complex to keep it working for different
+shells and OSes and also does not allow to use other available TeX options,
+if any. If your TeX doesn't support "-interaction=nonstopmode", please
+report it with different means to express \nonstopmode from the command line.
+
+=============================================================================
+7. The error format *error-file-format*
+
+ *errorformat* *E372* *E373* *E374*
+ *E375* *E376* *E377* *E378*
+The 'errorformat' option specifies a list of formats that are recognized. The
+first format that matches with an error message is used. You can add several
+formats for different messages your compiler produces, or even entries for
+multiple compilers. See |efm-entries|.
+
+Each entry in 'errorformat' is a scanf-like string that describes the format.
+First, you need to know how scanf works. Look in the documentation of your
+C compiler. Below you find the % items that Vim understands. Others are
+invalid.
+
+Special characters in 'errorformat' are comma and backslash. See
+|efm-entries| for how to deal with them. Note that a literal "%" is matched
+by "%%", thus it is not escaped with a backslash.
+Keep in mind that in the `:make` and `:grep` output all NUL characters are
+replaced with SOH (0x01).
+
+Note: By default the difference between upper and lowercase is ignored. If
+you want to match case, add "\C" to the pattern |/\C|.
+
+Vim will read lines of any length, but only the first 4095 bytes are used, the
+rest is ignored. Items can only be 1023 bytes long.
+
+
+Basic items
+
+ %f file name (finds a string)
+ %o module name (finds a string)
+ %l line number (finds a number)
+ %e end line number (finds a number)
+ %c column number (finds a number representing character
+ column of the error, byte index, a <tab> is 1
+ character column)
+ %v virtual column number (finds a number representing
+ screen column of the error (1 <tab> == 8 screen
+ columns))
+ %k end column number (finds a number representing
+ the character column of the error, byte index, or a
+ number representing screen end column of the error if
+ it's used with %v)
+ %t error type (finds a single character):
+ e - error message
+ w - warning message
+ i - info message
+ n - note message
+ %n error number (finds a number)
+ %m error message (finds a string)
+ %r matches the "rest" of a single-line file message %O/P/Q
+ %p pointer line (finds a sequence of '-', '.', ' ' or
+ tabs and uses the length for the column number)
+ %*{conv} any scanf non-assignable conversion
+ %% the single '%' character
+ %s search text (finds a string)
+
+The "%f" conversion may depend on the current 'isfname' setting. "~/" is
+expanded to the home directory and environment variables are expanded.
+
+The "%f" and "%m" conversions have to detect the end of the string. This
+normally happens by matching following characters and items. When nothing is
+following the rest of the line is matched. If "%f" is followed by a '%' or a
+backslash, it will look for a sequence of 'isfname' characters.
+
+On MS-Windows a leading "C:" will be included in "%f", even when using "%f:".
+This means that a file name which is a single alphabetical letter will not be
+detected.
+
+The "%p" conversion is normally followed by a "^". It's used for compilers
+that output a line like: >
+ ^
+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 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"
+conversion can be used to locate lines without a line number in the error
+output. Like the output of the "grep" shell command.
+When the pattern is present the line number will not be used.
+
+The "%o" conversion specifies the module name in quickfix entry. If present
+it will be used in quickfix error window instead of the filename. The module
+name is used only for displaying purposes, the file name is used when jumping
+to the file.
+
+Changing directory
+
+The following uppercase conversion characters specify the type of special
+format strings. At most one of them may be given as a prefix at the beginning
+of a single comma-separated format pattern.
+Some compilers produce messages that consist of directory names that have to
+be prepended to each file name read by %f (example: GNU make). The following
+codes can be used to scan these directory names; they will be stored in an
+internal directory stack. *E379*
+ %D "enter directory" format string; expects a following
+ %f that finds the directory name
+ %X "leave directory" format string; expects following %f
+
+When defining an "enter directory" or "leave directory" format, the "%D" or
+"%X" has to be given at the start of that substring. Vim tracks the directory
+changes and prepends the current directory to each erroneous file found with a
+relative path. See |quickfix-directory-stack| for details, tips and
+limitations.
+
+
+Multi-line messages *errorformat-multi-line*
+
+It is possible to read the output of programs that produce multi-line
+messages, i.e. error strings that consume more than one line. Possible
+prefixes are:
+ %E start of a multi-line error message
+ %W start of a multi-line warning message
+ %I start of a multi-line informational message
+ %N start of a multi-line note message
+ %A start of a multi-line message (unspecified type)
+ %> for next line start with current pattern again |efm-%>|
+ %C continuation of a multi-line message
+ %Z end of a multi-line message
+These can be used with '+' and '-', see |efm-ignore| below.
+
+Using "\n" in the pattern won't work to match multi-line messages.
+
+Example: Your compiler happens to write out errors in the following format
+(leading line numbers not being part of the actual output):
+
+ 1 Error 275 ~
+ 2 line 42 ~
+ 3 column 3 ~
+ 4 ' ' expected after '--' ~
+
+The appropriate error format string has to look like this: >
+ :set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
+
+And the |:clist| error message generated for this error is:
+
+ 1:42 col 3 error 275: ' ' expected after '--'
+
+Another example: Think of a Python interpreter that produces the following
+error message (line numbers are not part of the actual output):
+
+ 1 ==============================================================
+ 2 FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
+ 3 --------------------------------------------------------------
+ 4 Traceback (most recent call last):
+ 5 File "unittests/dbfacadeTest.py", line 89, in testFoo
+ 6 self.assertEquals(34, dtid)
+ 7 File "/usr/lib/python2.2/unittest.py", line 286, in
+ 8 failUnlessEqual
+ 9 raise self.failureException, \
+ 10 AssertionError: 34 != 33
+ 11
+ 12 --------------------------------------------------------------
+ 13 Ran 27 tests in 0.063s
+
+Say you want |:clist| write the relevant information of this message only,
+namely:
+ 5 unittests/dbfacadeTest.py:89: AssertionError: 34 != 33
+
+Then the error format string could be defined as follows: >
+ :set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
+
+Note that the %C string is given before the %A here: since the expression
+' %.%#' (which stands for the regular expression ' .*') matches every line
+starting with a space, followed by any characters to the end of the line,
+it also hides line 7 which would trigger a separate error message otherwise.
+Error format strings are always parsed pattern by pattern until the first
+match occurs.
+ *efm-%>*
+The %> item can be used to avoid trying patterns that appear earlier in
+'errorformat'. This is useful for patterns that match just about anything.
+For example, if the error looks like this:
+
+ Error in line 123 of foo.c: ~
+ unknown variable "i" ~
+
+This can be found with: >
+ :set efm=xxx,%E%>Error in line %l of %f:,%Z%m
+Where "xxx" has a pattern that would also match the second line.
+
+Important: There is no memory of what part of the errorformat matched before;
+every line in the error file gets a complete new run through the error format
+lines. For example, if one has: >
+ setlocal efm=aa,bb,cc,dd,ee
+Where aa, bb, etc. are error format strings. Each line of the error file will
+be matched to the pattern aa, then bb, then cc, etc. Just because cc matched
+the previous error line does _not_ mean that dd will be tried first on the
+current line, even if cc and dd are multi-line errorformat strings.
+
+
+
+Separate file name *errorformat-separate-filename*
+
+These prefixes are useful if the file name is given once and multiple messages
+follow that refer to this file name.
+ %O single-line file message: overread the matched part
+ %P single-line file message: push file %f onto the stack
+ %Q single-line file message: pop the last file from stack
+
+Example: Given a compiler that produces the following error logfile (without
+leading line numbers):
+
+ 1 [a1.tt]
+ 2 (1,17) error: ';' missing
+ 3 (21,2) warning: variable 'z' not defined
+ 4 (67,3) error: end of file found before string ended
+ 5
+ 6 [a2.tt]
+ 7
+ 8 [a3.tt]
+ 9 NEW compiler v1.1
+ 10 (2,2) warning: variable 'x' not defined
+ 11 (67,3) warning: 's' already defined
+
+This logfile lists several messages for each file enclosed in [...] which are
+properly parsed by an error format like this: >
+ :set efm=%+P[%f],(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%-Q
+
+A call of |:clist| writes them accordingly with their correct filenames:
+
+ 2 a1.tt:1 col 17 error: ';' missing
+ 3 a1.tt:21 col 2 warning: variable 'z' not defined
+ 4 a1.tt:67 col 3 error: end of file found before string ended
+ 8 a3.tt:2 col 2 warning: variable 'x' not defined
+ 9 a3.tt:67 col 3 warning: 's' already defined
+
+Unlike the other prefixes that all match against whole lines, %P, %Q and %O
+can be used to match several patterns in the same line. Thus it is possible
+to parse even nested files like in the following line:
+ {"file1" {"file2" error1} error2 {"file3" error3 {"file4" error4 error5}}}
+The %O then parses over strings that do not contain any push/pop file name
+information. See |errorformat-LaTeX| for an extended example.
+
+
+Ignoring and using whole messages *efm-ignore*
+
+The codes '+' or '-' can be combined with the uppercase codes above; in that
+case they have to precede the letter, e.g. '%+A' or '%-G':
+ %- do not include the matching multi-line in any output
+ %+ include the whole matching line in the %m error string
+
+One prefix is only useful in combination with '+' or '-', namely %G. It parses
+over lines containing general information like compiler version strings or
+other headers that can be skipped.
+ %-G ignore this message
+ %+G general message
+
+
+Pattern matching
+
+The scanf()-like "%*[]" notation is supported for backward-compatibility
+with previous versions of Vim. However, it is also possible to specify
+(nearly) any Vim supported regular expression in format strings.
+Since meta characters of the regular expression language can be part of
+ordinary matching strings or file names (and therefore internally have to
+be escaped), meta symbols have to be written with leading '%':
+ %\ The single '\' character. Note that this has to be
+ escaped ("%\\") in ":set errorformat=" definitions.
+ %. The single '.' character.
+ %# The single '*'(!) character.
+ %^ The single '^' character. Note that this is not
+ useful, the pattern already matches start of line.
+ %$ The single '$' character. Note that this is not
+ useful, the pattern already matches end of line.
+ %[ The single '[' character for a [] character range.
+ %~ The single '~' character.
+When using character classes in expressions (see |/\i| for an overview),
+terms containing the "\+" quantifier can be written in the scanf() "%*"
+notation. Example: "%\\d%\\+" ("\d\+", "any number") is equivalent to "%*\\d".
+Important note: The \(...\) grouping of sub-matches can not be used in format
+specifications because it is reserved for internal conversions.
+
+
+Multiple entries in 'errorformat' *efm-entries*
+
+To be able to detect output from several compilers, several format patterns
+may be put in 'errorformat', separated by commas (note: blanks after the comma
+are ignored). The first pattern that has a complete match is used. If no
+match is found, matching parts from the last one will be used, although the
+file name is removed and the error message is set to the whole message. If
+there is a pattern that may match output from several compilers (but not in a
+right way), put it after one that is more restrictive.
+
+To include a comma in a pattern precede it with a backslash (you have to type
+two in a ":set" command). To include a backslash itself give two backslashes
+(you have to type four in a ":set" command). You also need to put a backslash
+before a space for ":set".
+
+
+Valid matches *quickfix-valid*
+
+If a line does not completely match one of the entries in 'errorformat', the
+whole line is put in the error message and the entry is marked "not valid"
+These lines are skipped with the ":cn" and ":cp" commands (unless there is
+no valid line at all). You can use ":cl!" to display all the error messages.
+
+If the error format does not contain a file name Vim cannot switch to the
+correct file. You will have to do this by hand.
+
+
+Examples
+
+The format of the file from the Amiga Aztec compiler is:
+
+ filename>linenumber:columnnumber:errortype:errornumber:errormessage
+
+ filename name of the file in which the error was detected
+ linenumber line number where the error was detected
+ columnnumber column number where the error was detected
+ errortype type of the error, normally a single 'E' or 'W'
+ errornumber number of the error (for lookup in the manual)
+ errormessage description of the error
+
+This can be matched with this 'errorformat' entry:
+ %f>%l:%c:%t:%n:%m
+
+Some examples for C compilers that produce single-line error outputs:
+%f:%l:\ %t%*[^0123456789]%n:\ %m for Manx/Aztec C error messages
+ (scanf() doesn't understand [0-9])
+%f\ %l\ %t%*[^0-9]%n:\ %m for SAS C
+\"%f\"\\,%*[^0-9]%l:\ %m for generic C compilers
+%f:%l:\ %m for GCC
+%f:%l:\ %m,%Dgmake[%*\\d]:\ Entering\ directory\ `%f',
+%Dgmake[%*\\d]:\ Leaving\ directory\ `%f'
+ for GCC with gmake (concat the lines!)
+%f(%l)\ :\ %*[^:]:\ %m old SCO C compiler (pre-OS5)
+%f(%l)\ :\ %t%*[^0-9]%n:\ %m idem, with error type and number
+%f:%l:\ %m,In\ file\ included\ from\ %f:%l:,\^I\^Ifrom\ %f:%l%m
+ for GCC, with some extras
+
+Extended examples for the handling of multi-line messages are given below,
+see |errorformat-Jikes| and |errorformat-LaTeX|.
+
+Note the backslash in front of a space and double quote. It is required for
+the :set command. There are two backslashes in front of a comma, one for the
+:set command and one to avoid recognizing the comma as a separator of error
+formats.
+
+
+Filtering messages
+
+If you have a compiler that produces error messages that do not fit in the
+format string, you could write a program that translates the error messages
+into this format. You can use this program with the ":make" command by
+changing the 'makeprg' option. For example: >
+ :set mp=make\ \\\|&\ error_filter
+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.
+
+=============================================================================
+8. The directory stack *quickfix-directory-stack*
+
+Quickfix maintains a stack for saving all used directories parsed from the
+make output. For GNU-make this is rather simple, as it always prints the
+absolute path of all directories it enters and leaves. Regardless if this is
+done via a 'cd' command in the makefile or with the parameter "-C dir" (change
+to directory before reading the makefile). It may be useful to use the switch
+"-w" to force GNU-make to print out the working directory before and after
+processing.
+
+Maintaining the correct directory is more complicated if you don't use
+GNU-make. AIX-make for example doesn't print any information about its
+working directory. Then you need to enhance the makefile. In the makefile of
+LessTif there is a command which echoes "Making {target} in {dir}". The
+special problem here is that it doesn't print information on leaving the
+directory and that it doesn't print the absolute path.
+
+To solve the problem with relative paths and missing "leave directory"
+messages Vim uses the following algorithm:
+
+1) Check if the given directory is a subdirectory of the current directory.
+ If this is true, store it as the current directory.
+2) If it is not a subdir of the current directory, try if this is a
+ subdirectory of one of the upper directories.
+3) If the directory still isn't found, it is assumed to be a subdirectory
+ of Vim's current directory.
+
+Additionally it is checked for every file, if it really exists in the
+identified directory. If not, it is searched in all other directories of the
+directory stack (NOT the directory subtree!). If it is still not found, it is
+assumed that it is in Vim's current directory.
+
+There are limitations in this algorithm. These examples assume that make just
+prints information about entering a directory in the form "Making all in dir".
+
+1) Assume you have following directories and files:
+ ./dir1
+ ./dir1/file1.c
+ ./file1.c
+
+ If make processes the directory "./dir1" before the current directory and
+ there is an error in the file "./file1.c", you will end up with the file
+ "./dir1/file.c" loaded by Vim.
+
+ This can only be solved with a "leave directory" message.
+
+2) Assume you have following directories and files:
+ ./dir1
+ ./dir1/dir2
+ ./dir2
+
+ You get the following:
+
+ Make output Directory interpreted by Vim
+ ------------------------ ----------------------------
+ Making all in dir1 ./dir1
+ Making all in dir2 ./dir1/dir2
+ 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.
+
+To avoid this problem, ensure to print absolute directory names and "leave
+directory" messages.
+
+Examples for Makefiles:
+
+Unix:
+ libs:
+ for dn in $(LIBDIRS); do \
+ (cd $$dn; echo "Entering dir '$$(pwd)'"; make); \
+ echo "Leaving dir"; \
+ done
+
+Add
+ %DEntering\ dir\ '%f',%XLeaving\ dir
+to your 'errorformat' to handle the above output.
+
+Note that Vim doesn't check if the directory name in a "leave directory"
+messages is the current directory. This is why you could just use the message
+"Leaving dir".
+
+=============================================================================
+9. Specific error file formats *errorformats*
+
+ *errorformat-Jikes*
+Jikes(TM), a source-to-bytecode Java compiler published by IBM Research,
+produces simple multi-line error messages.
+
+An 'errorformat' string matching the produced messages is shown below.
+The following lines can be placed in the user's |vimrc| to overwrite Vim's
+recognized default formats, or see |:set+=| how to install this format
+additionally to the default. >
+
+ :set efm=%A%f:%l:%c:%*\\d:%*\\d:,
+ \%C%*\\s%trror:%m,
+ \%+C%*[^:]%trror:%m,
+ \%C%*\\s%tarning:%m,
+ \%C%m
+<
+Jikes(TM) produces a single-line error message when invoked with the option
+"+E", and can be matched with the following: >
+
+ :setl efm=%f:%l:%v:%*\\d:%*\\d:%*\\s%m
+<
+ *errorformat-javac*
+This 'errorformat' has been reported to work well for javac, which outputs a
+line with "^" to indicate the column of the error: >
+ :setl efm=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
+or: >
+ :setl efm=%A%f:%l:\ %m,%+Z%p^,%+C%.%#,%-G%.%#
+<
+Here is an alternative from Michael F. Lamb for Unix that filters the errors
+first: >
+ :setl errorformat=%Z%f:%l:\ %m,%A%p^,%-G%*[^sl]%.%#
+ :setl makeprg=javac\ %:S\ 2>&1\ \\\|\ vim-javac-filter
+
+You need to put the following in "vim-javac-filter" somewhere in your path
+(e.g., in ~/bin) and make it executable: >
+ #!/bin/sed -f
+ /\^$/s/\t/\ /g;/:[0-9]\+:/{h;d};/^[ \t]*\^/G;
+
+In English, that sed script:
+- Changes single tabs to single spaces and
+- Moves the line with the filename, line number, error message to just after
+ the pointer line. That way, the unused error text between doesn't break
+ vim's notion of a "multi-line message" and also doesn't force us to include
+ it as a "continuation of a multi-line message."
+
+ *errorformat-ant*
+For ant (http://jakarta.apache.org/) the above errorformat has to be modified
+to honour the leading [javac] in front of each javac output line: >
+ :set efm=%A\ %#[javac]\ %f:%l:\ %m,%-Z\ %#[javac]\ %p^,%-C%.%#
+
+The 'errorformat' can also be configured to handle ant together with either
+javac or jikes. If you're using jikes, you should tell ant to use jikes' +E
+command line switch which forces jikes to generate one-line error messages.
+This is what the second line (of a build.xml file) below does: >
+ <property name = "build.compiler" value = "jikes"/>
+ <property name = "build.compiler.emacs" value = "true"/>
+
+The 'errorformat' which handles ant with both javac and jikes is: >
+ :set efm=\ %#[javac]\ %#%f:%l:%c:%*\\d:%*\\d:\ %t%[%^:]%#:%m,
+ \%A\ %#[javac]\ %f:%l:\ %m,%-Z\ %#[javac]\ %p^,%-C%.%#
+<
+ *errorformat-jade*
+parsing jade (see http://www.jclark.com/) errors is simple: >
+ :set efm=jade:%f:%l:%c:%t:%m
+<
+ *errorformat-LaTeX*
+The following is an example how an 'errorformat' string can be specified
+for the (La)TeX typesetting system which displays error messages over
+multiple lines. The output of ":clist" and ":cc" etc. commands displays
+multi-lines in a single line, leading white space is removed.
+It should be easy to adopt the above LaTeX errorformat to any compiler output
+consisting of multi-line errors.
+
+The commands can be placed in a |vimrc| file or some other Vim script file,
+e.g. a script containing LaTeX related stuff which is loaded only when editing
+LaTeX sources.
+Make sure to copy all lines of the example (in the given order), afterwards
+remove the comment lines. For the '\' notation at the start of some lines see
+|line-continuation|.
+
+ First prepare 'makeprg' such that LaTeX will report multiple
+ errors; do not stop when the first error has occurred: >
+ :set makeprg=latex\ \\\\nonstopmode\ \\\\input\\{$*}
+<
+ Start of multi-line error messages: >
+ :set efm=%E!\ LaTeX\ %trror:\ %m,
+ \%E!\ %m,
+< Start of multi-line warning messages; the first two also
+ include the line number. Meaning of some regular expressions:
+ - "%.%#" (".*") matches a (possibly empty) string
+ - "%*\\d" ("\d\+") matches a number >
+ \%+WLaTeX\ %.%#Warning:\ %.%#line\ %l%.%#,
+ \%+W%.%#\ at\ lines\ %l--%*\\d,
+ \%WLaTeX\ %.%#Warning:\ %m,
+< Possible continuations of error/warning messages; the first
+ one also includes the line number: >
+ \%Cl.%l\ %m,
+ \%+C\ \ %m.,
+ \%+C%.%#-%.%#,
+ \%+C%.%#[]%.%#,
+ \%+C[]%.%#,
+ \%+C%.%#%[{}\\]%.%#,
+ \%+C<%.%#>%.%#,
+ \%C\ \ %m,
+< Lines that match the following patterns do not contain any
+ important information; do not include them in messages: >
+ \%-GSee\ the\ LaTeX%m,
+ \%-GType\ \ H\ <return>%m,
+ \%-G\ ...%.%#,
+ \%-G%.%#\ (C)\ %.%#,
+ \%-G(see\ the\ transcript%.%#),
+< Generally exclude any empty or whitespace-only line from
+ being displayed: >
+ \%-G\\s%#,
+< The LaTeX output log does not specify the names of erroneous
+ source files per line; rather they are given globally,
+ enclosed in parentheses.
+ The following patterns try to match these names and store
+ them in an internal stack. The patterns possibly scan over
+ the same input line (one after another), the trailing "%r"
+ conversion indicates the "rest" of the line that will be
+ parsed in the next go until the end of line is reached.
+
+ Overread a file name enclosed in '('...')'; do not push it
+ on a stack since the file apparently does not contain any
+ error: >
+ \%+O(%f)%r,
+< Push a file name onto the stack. The name is given after '(': >
+ \%+P(%f%r,
+ \%+P\ %\\=(%f%r,
+ \%+P%*[^()](%f%r,
+ \%+P[%\\d%[^()]%#(%f%r,
+< Pop the last stored file name when a ')' is scanned: >
+ \%+Q)%r,
+ \%+Q%*[^()])%r,
+ \%+Q[%\\d%*[^()])%r
+
+Note that in some cases file names in the LaTeX output log cannot be parsed
+properly. The parser might have been messed up by unbalanced parentheses
+then. The above example tries to catch the most relevant cases only.
+You can customize the given setting to suit your own purposes, for example,
+all the annoying "Overfull ..." warnings could be excluded from being
+recognized as an error.
+Alternatively to filtering the LaTeX compiler output, it is also possible
+to directly read the *.log file that is produced by the [La]TeX compiler.
+This contains even more useful information about possible error causes.
+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|.)
+
+=============================================================================
+10. Customizing the quickfix window *quickfix-window-function*
+
+The default format for the lines displayed in the quickfix window and location
+list window is:
+
+ <filename>|<lnum> col <col>|<text>
+
+The values displayed in each line correspond to the "bufnr", "lnum", "col" and
+"text" fields returned by the |getqflist()| function.
+
+For some quickfix/location lists, the displayed text needs to be customized.
+For example, if only the filename is present for a quickfix entry, then the
+two "|" field separator characters after the filename are not needed. Another
+use case is to customize the path displayed for a filename. By default, the
+complete path (which may be too long) is displayed for files which are not
+under the current directory tree. The file path may need to be simplified to a
+common parent directory.
+
+The displayed text can be customized by setting the 'quickfixtextfunc' option
+to a Vim function. This function will be called with a dict argument and
+should return a List of strings to be displayed in the quickfix or location
+list window. The dict argument will have the following fields:
+
+ quickfix set to 1 when called for a quickfix list and 0 when called for
+ a location list.
+ winid for a location list, set to the id of the window with the
+ location list. For a quickfix list, set to 0. Can be used in
+ getloclist() to get the location list entry.
+ id quickfix or location list identifier
+ start_idx index of the first entry for which text should be returned
+ end_idx index of the last entry for which text should be returned
+
+The function should return a single line of text to display in the quickfix
+window for each entry from start_idx to end_idx. The function can obtain
+information about the entries using the |getqflist()| function and specifying
+the quickfix list identifier "id". For a location list, getloclist() function
+can be used with the "winid" argument. If an empty list is returned, then the
+default format is used to display all the entries. If an item in the returned
+list is an empty string, then the default format is used to display the
+corresponding entry.
+
+If a quickfix or location list specific customization is needed, then the
+'quickfixtextfunc' attribute of the list can be set using the |setqflist()| or
+|setloclist()| function. This overrides the global 'quickfixtextfunc' option.
+
+The example below displays the list of old files (|v:oldfiles|) in a quickfix
+window. As there is no line, column number and error text information
+associated with each entry, the 'quickfixtextfunc' function returns only the
+filename.
+Example: >
+ " create a quickfix list from v:oldfiles
+ call setqflist([], ' ', {'lines' : v:oldfiles, 'efm' : '%f',
+ \ 'quickfixtextfunc' : 'QfOldFiles'})
+ func QfOldFiles(info)
+ " get information about a range of quickfix entries
+ let items = getqflist({'id' : a:info.id, 'items' : 1}).items
+ let l = []
+ for idx in range(a:info.start_idx - 1, a:info.end_idx - 1)
+ " use the simplified file name
+ call add(l, fnamemodify(bufname(items[idx].bufnr), ':p:.'))
+ endfor
+ return l
+ endfunc
+<
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/quickref.txt b/runtime/doc/quickref.txt
new file mode 100644
index 0000000..ffdfd10
--- /dev/null
+++ b/runtime/doc/quickref.txt
@@ -0,0 +1,1475 @@
+*quickref.txt* For Vim version 9.0. Last change: 2022 Dec 16
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+ Quick reference guide
+
+ *quickref* *Contents*
+ tag subject tag subject ~
+|Q_ct| list of help files |Q_re| Repeating commands
+|Q_lr| motion: Left-right |Q_km| Key mapping
+|Q_ud| motion: Up-down |Q_ab| Abbreviations
+|Q_tm| motion: Text object |Q_op| Options
+|Q_pa| motion: Pattern searches |Q_ur| Undo/Redo commands
+|Q_ma| motion: Marks |Q_et| External commands
+|Q_vm| motion: Various |Q_qf| Quickfix commands
+|Q_ta| motion: Using tags |Q_vc| Various commands
+|Q_sc| Scrolling |Q_ce| Ex: Command-line editing
+|Q_in| insert: Inserting text |Q_ra| Ex: Ranges
+|Q_ai| insert: Keys |Q_ex| Ex: Special characters
+|Q_ss| insert: Special keys |Q_st| Starting Vim
+|Q_di| insert: Digraphs |Q_ed| Editing a file
+|Q_si| insert: Special inserts |Q_fl| Using the argument list
+|Q_de| change: Deleting text |Q_wq| Writing and quitting
+|Q_cm| change: Copying and moving |Q_ac| Automatic commands
+|Q_ch| change: Changing text |Q_wi| Multi-window commands
+|Q_co| change: Complex |Q_bu| Buffer list commands
+|Q_vi| Visual mode |Q_sy| Syntax highlighting
+|Q_to| Text objects |Q_gu| GUI commands
+ |Q_fo| Folding
+
+------------------------------------------------------------------------------
+N is used to indicate an optional count that can be given before the command.
+------------------------------------------------------------------------------
+*Q_lr* Left-right motions
+
+|h| N h left (also: CTRL-H, <BS>, or <Left> key)
+|l| N l right (also: <Space> or <Right> key)
+|0| 0 to first character in the line (also: <Home> key)
+|^| ^ to first non-blank character in the line
+|$| N $ to the last character in the line (N-1 lines lower)
+ (also: <End> key)
+|g0| g0 to first character in screen line (differs from "0"
+ when lines wrap)
+|g^| g^ to first non-blank character in screen line (differs
+ from "^" when lines wrap)
+|g$| N g$ to last character in screen line (differs from "$"
+ when lines wrap)
+|gm| gm to middle of the screen line
+|gM| gM to middle of the line
+|bar| N | to column N (default: 1)
+|f| N f{char} to the Nth occurrence of {char} to the right
+|F| N F{char} to the Nth occurrence of {char} to the left
+|t| N t{char} till before the Nth occurrence of {char} to the right
+|T| N T{char} till before the Nth occurrence of {char} to the left
+|;| N ; repeat the last "f", "F", "t", or "T" N times
+|,| N , repeat the last "f", "F", "t", or "T" N times in
+ opposite direction
+------------------------------------------------------------------------------
+*Q_ud* Up-down motions
+
+|k| N k up N lines (also: CTRL-P and <Up>)
+|j| N j down N lines (also: CTRL-J, CTRL-N, <NL>, and <Down>)
+|-| N - up N lines, on the first non-blank character
+|+| N + down N lines, on the first non-blank character (also:
+ CTRL-M and <CR>)
+|_| N _ down N-1 lines, on the first non-blank character
+|G| N G goto line N (default: last line), on the first
+ non-blank character
+|gg| N gg goto line N (default: first line), on the first
+ non-blank character
+|N%| N % goto line N percentage down in the file; N must be
+ given, otherwise it is the |%| command
+|gk| N gk up N screen lines (differs from "k" when line wraps)
+|gj| N gj down N screen lines (differs from "j" when line wraps)
+------------------------------------------------------------------------------
+*Q_tm* Text object motions
+
+|w| N w N words forward
+|W| N W N blank-separated |WORD|s forward
+|e| N e forward to the end of the Nth word
+|E| N E forward to the end of the Nth blank-separated |WORD|
+|b| N b N words backward
+|B| N B N blank-separated |WORD|s backward
+|ge| N ge backward to the end of the Nth word
+|gE| N gE backward to the end of the Nth blank-separated |WORD|
+
+|)| N ) N sentences forward
+|(| N ( N sentences backward
+|}| N } N paragraphs forward
+|{| N { N paragraphs backward
+|]]| N ]] N sections forward, at start of section
+|[[| N [[ N sections backward, at start of section
+|][| N ][ N sections forward, at end of section
+|[]| N [] N sections backward, at end of section
+|[(| N [( N times back to unclosed '('
+|[{| N [{ N times back to unclosed '{'
+|[m| N [m N times back to start of method (for Java)
+|[M| N [M N times back to end of method (for Java)
+|])| N ]) N times forward to unclosed ')'
+|]}| N ]} N times forward to unclosed '}'
+|]m| N ]m N times forward to start of method (for Java)
+|]M| N ]M N times forward to end of method (for Java)
+|[#| N [# N times back to unclosed "#if" or "#else"
+|]#| N ]# N times forward to unclosed "#else" or "#endif"
+|[star| N [* N times back to start of comment "/*"
+|]star| N ]* N times forward to end of comment "*/"
+------------------------------------------------------------------------------
+*Q_pa* Pattern searches
+
+|/| N /{pattern}[/[offset]]<CR>
+ search forward for the Nth occurrence of {pattern}
+|?| N ?{pattern}[?[offset]]<CR>
+ search backward for the Nth occurrence of {pattern}
+|/<CR>| N /<CR> repeat last search, in the forward direction
+|?<CR>| N ?<CR> repeat last search, in the backward direction
+|n| N n repeat last search
+|N| N N repeat last search, in opposite direction
+|star| N * search forward for the identifier under the cursor
+|#| N # search backward for the identifier under the cursor
+|gstar| N g* like "*", but also find partial matches
+|g#| N g# like "#", but also find partial matches
+|gd| gd goto local declaration of identifier under the cursor
+|gD| gD goto global declaration of identifier under the cursor
+
+|pattern| Special characters in search patterns
+
+ meaning magic nomagic ~
+ matches any single character . \.
+ matches start of line ^ ^
+ matches <EOL> $ $
+ matches start of word \< \<
+ matches end of word \> \>
+ matches a single char from the range [a-z] \[a-z]
+ matches a single char not in the range [^a-z] \[^a-z]
+ matches an identifier char \i \i
+ idem but excluding digits \I \I
+ matches a keyword character \k \k
+ idem but excluding digits \K \K
+ matches a file name character \f \f
+ idem but excluding digits \F \F
+ matches a printable character \p \p
+ idem but excluding digits \P \P
+ matches a white space character \s \s
+ matches a non-white space character \S \S
+
+ matches <Esc> \e \e
+ matches <Tab> \t \t
+ matches <CR> \r \r
+ matches <BS> \b \b
+
+ matches 0 or more of the preceding atom * \*
+ matches 1 or more of the preceding atom \+ \+
+ matches 0 or 1 of the preceding atom \= \=
+ matches 2 to 5 of the preceding atom \{2,5} \{2,5}
+ separates two alternatives \| \|
+ group a pattern into an atom \(\) \(\)
+
+|search-offset| Offsets allowed after search command
+
+ [num] [num] lines downwards, in column 1
+ +[num] [num] lines downwards, in column 1
+ -[num] [num] lines upwards, in column 1
+ e[+num] [num] characters to the right of the end of the match
+ e[-num] [num] characters to the left of the end of the match
+ s[+num] [num] characters to the right of the start of the match
+ s[-num] [num] characters to the left of the start of the match
+ b[+num] [num] identical to s[+num] above (mnemonic: begin)
+ b[-num] [num] identical to s[-num] above (mnemonic: begin)
+ ;{search-command} execute {search-command} next
+------------------------------------------------------------------------------
+*Q_ma* Marks and motions
+
+|m| m{a-zA-Z} mark current position with mark {a-zA-Z}
+|`a| `{a-z} go to mark {a-z} within current file
+|`A| `{A-Z} go to mark {A-Z} in any file
+|`0| `{0-9} go to the position where Vim was previously exited
+|``| `` go to the position before the last jump
+|`quote| `" go to the position when last editing this file
+|`[| `[ go to the start of the previously operated or put text
+|`]| `] go to the end of the previously operated or put text
+|`<| `< go to the start of the (previous) Visual area
+|`>| `> go to the end of the (previous) Visual area
+|`.| `. go to the position of the last change in this file
+|'| '{a-zA-Z0-9[]'"<>.}
+ same as `, but on the first non-blank in the line
+|:marks| :marks print the active marks
+|CTRL-O| N CTRL-O go to Nth older position in jump list
+|CTRL-I| N CTRL-I go to Nth newer position in jump list
+|:ju| :ju[mps] print the jump list
+------------------------------------------------------------------------------
+*Q_vm* Various motions
+
+|%| % find the next brace, bracket, comment, or "#if"/
+ "#else"/"#endif" in this line and go to its match
+|H| N H go to the Nth line in the window, on the first
+ non-blank
+|M| M go to the middle line in the window, on the first
+ non-blank
+|L| N L go to the Nth line from the bottom, on the first
+ non-blank
+
+|go| N go go to Nth byte in the buffer
+|:go| :[range]go[to] [off] go to [off] byte in the buffer
+------------------------------------------------------------------------------
+*Q_ta* Using tags
+
+|:ta| :ta[g][!] {tag} jump to tag {tag}
+|:ta| :[count]ta[g][!] jump to [count]'th newer tag in tag list
+|CTRL-]| CTRL-] jump to the tag under cursor, unless changes
+ have been made
+|:ts| :ts[elect][!] [tag] list matching tags and select one to jump to
+|:tjump| :tj[ump][!] [tag] jump to tag [tag] or select from list when
+ there are multiple matches
+|:ltag| :lt[ag][!] [tag] jump to tag [tag] and add matching tags to the
+ location list
+
+|:tags| :tags print tag list
+|CTRL-T| N CTRL-T jump back from Nth older tag in tag list
+|:po| :[count]po[p][!] jump back from [count]'th older tag in tag list
+|:tnext| :[count]tn[ext][!] jump to [count]'th next matching tag
+|:tp| :[count]tp[revious][!] jump to [count]'th previous matching tag
+|:tr| :[count]tr[ewind][!] jump to [count]'th matching tag
+|:tl| :tl[ast][!] jump to last matching tag
+
+|:ptag| :pt[ag] {tag} open a preview window to show tag {tag}
+|CTRL-W_}| CTRL-W } like CTRL-] but show tag in preview window
+|:pts| :pts[elect] like ":tselect" but show tag in preview window
+|:ptjump| :ptj[ump] like ":tjump" but show tag in preview window
+|:pclose| :pc[lose] close tag preview window
+|CTRL-W_z| CTRL-W z close tag preview window
+------------------------------------------------------------------------------
+*Q_sc* Scrolling
+
+|CTRL-E| N CTRL-E window N lines downwards (default: 1)
+|CTRL-D| N CTRL-D window N lines Downwards (default: 1/2 window)
+|CTRL-F| N CTRL-F window N pages Forwards (downwards)
+|CTRL-Y| N CTRL-Y window N lines upwards (default: 1)
+|CTRL-U| N CTRL-U window N lines Upwards (default: 1/2 window)
+|CTRL-B| N CTRL-B window N pages Backwards (upwards)
+|z<CR>| z<CR> or zt redraw, current line at top of window
+|z.| z. or zz redraw, current line at center of window
+|z-| z- or zb redraw, current line at bottom of window
+
+These only work when 'wrap' is off:
+|zh| N zh scroll screen N characters to the right
+|zl| N zl scroll screen N characters to the left
+|zH| N zH scroll screen half a screenwidth to the right
+|zL| N zL scroll screen half a screenwidth to the left
+------------------------------------------------------------------------------
+*Q_in* Inserting text
+
+|a| N a append text after the cursor (N times)
+|A| N A append text at the end of the line (N times)
+|i| N i insert text before the cursor (N times) (also: <Insert>)
+|I| N I insert text before the first non-blank in the line (N times)
+|gI| N gI insert text in column 1 (N times)
+|o| N o open a new line below the current line, append text (N times)
+|O| N O open a new line above the current line, append text (N times)
+|:startinsert| :star[tinsert][!] start Insert mode, append when [!] used
+|:startreplace| :startr[eplace][!] start Replace mode, at EOL when [!] used
+
+in Visual block mode:
+|v_b_I| I insert the same text in front of all the selected lines
+|v_b_A| A append the same text after all the selected lines
+------------------------------------------------------------------------------
+*Q_ai* Insert mode keys
+
+|insert-index| alphabetical index of Insert mode commands
+
+leaving Insert mode:
+|i_<Esc>| <Esc> end Insert mode, back to Normal mode
+|i_CTRL-C| CTRL-C like <Esc>, but do not use an abbreviation
+|i_CTRL-O| CTRL-O {command} execute {command} and return to Insert mode
+
+moving around:
+|i_<Up>| cursor keys move cursor left/right/up/down
+|i_<S-Left>| shift-left/right one word left/right
+|i_<S-Up>| shift-up/down one screenful backward/forward
+|i_<End>| <End> cursor after last character in the line
+|i_<Home>| <Home> cursor to first character in the line
+------------------------------------------------------------------------------
+*Q_ss* Special keys in Insert mode
+
+|i_CTRL-V| CTRL-V {char}.. insert character literally, or enter decimal
+ byte value
+|i_<NL>| <NL> or <CR> or CTRL-M or CTRL-J
+ begin new line
+|i_CTRL-E| CTRL-E insert the character from below the cursor
+|i_CTRL-Y| CTRL-Y insert the character from above the cursor
+
+|i_CTRL-A| CTRL-A insert previously inserted text
+|i_CTRL-@| CTRL-@ insert previously inserted text and stop
+ Insert mode
+|i_CTRL-R| CTRL-R {register} insert the contents of a register
+
+|i_CTRL-N| CTRL-N insert next match of identifier before the
+ cursor
+|i_CTRL-P| CTRL-P insert previous match of identifier before
+ the cursor
+|i_CTRL-X| CTRL-X ... complete the word before the cursor in
+ various ways
+
+|i_<BS>| <BS> or CTRL-H delete the character before the cursor
+|i_<Del>| <Del> delete the character under the cursor
+|i_CTRL-W| CTRL-W delete word before the cursor
+|i_CTRL-U| CTRL-U delete all entered characters in the current
+ line
+|i_CTRL-T| CTRL-T insert one shiftwidth of indent in front of
+ the current line
+|i_CTRL-D| CTRL-D delete one shiftwidth of indent in front of
+ the current line
+|i_0_CTRL-D| 0 CTRL-D delete all indent in the current line
+|i_^_CTRL-D| ^ CTRL-D delete all indent in the current line,
+ restore indent in next line
+------------------------------------------------------------------------------
+*Q_di* Digraphs
+
+|:dig| :dig[raphs] show current list of digraphs
+|:dig| :dig[raphs] {char1}{char2} {number} ...
+ add digraph(s) to the list
+
+In Insert or Command-line mode:
+|i_CTRL-K| CTRL-K {char1} {char2}
+ enter digraph
+|i_digraph| {char1} <BS> {char2}
+ enter digraph if 'digraph' option set
+------------------------------------------------------------------------------
+*Q_si* Special inserts
+
+|:r| :r [file] insert the contents of [file] below the cursor
+|:r!| :r! {command} insert the standard output of {command} below the
+ cursor
+------------------------------------------------------------------------------
+*Q_de* Deleting text
+
+|x| N x delete N characters under and after the cursor
+|<Del>| N <Del> delete N characters under and after the cursor
+|X| N X delete N characters before the cursor
+|d| N d{motion} delete the text that is moved over with {motion}
+|v_d| {visual}d delete the highlighted text
+|dd| N dd delete N lines
+|D| N D delete to the end of the line (and N-1 more lines)
+|J| N J join N-1 lines (delete <EOL>s)
+|v_J| {visual}J join the highlighted lines
+|gJ| N gJ like "J", but without inserting spaces
+|v_gJ| {visual}gJ like "{visual}J", but without inserting spaces
+|:d| :[range]d [x] delete [range] lines [into register x]
+------------------------------------------------------------------------------
+*Q_cm* Copying and moving text
+
+|quote| "{char} use register {char} for the next delete, yank, or put
+|:reg| :reg show the contents of all registers
+|:reg| :reg {arg} show the contents of registers mentioned in {arg}
+|y| N y{motion} yank the text moved over with {motion} into a register
+|v_y| {visual}y yank the highlighted text into a register
+|yy| N yy yank N lines into a register
+|Y| N Y yank N lines into a register
+|p| N p put a register after the cursor position (N times)
+|P| N P put a register before the cursor position (N times)
+|]p| N ]p like p, but adjust indent to current line
+|[p| N [p like P, but adjust indent to current line
+|gp| N gp like p, but leave cursor after the new text
+|gP| N gP like P, but leave cursor after the new text
+------------------------------------------------------------------------------
+*Q_ch* Changing text
+
+|r| N r{char} replace N characters with {char}
+|gr| N gr{char} replace N characters without affecting layout
+|R| N R enter Replace mode (repeat the entered text N times)
+|gR| N gR enter virtual Replace mode: Like Replace mode but
+ without affecting layout
+|v_b_r| {visual}r{char}
+ in Visual block mode: Replace each char of the
+ selected text with {char}
+
+ (change = delete text and enter Insert mode)
+|c| N c{motion} change the text that is moved over with {motion}
+|v_c| {visual}c change the highlighted text
+|cc| N cc change N lines
+|S| N S change N lines
+|C| N C change to the end of the line (and N-1 more lines)
+|s| N s change N characters
+|v_b_c| {visual}c in Visual block mode: Change each of the selected
+ lines with the entered text
+|v_b_C| {visual}C in Visual block mode: Change each of the selected
+ lines until end-of-line with the entered text
+
+|~| N ~ switch case for N characters and advance cursor
+|v_~| {visual}~ switch case for highlighted text
+|v_u| {visual}u make highlighted text lowercase
+|v_U| {visual}U make highlighted text uppercase
+|g~| g~{motion} switch case for the text that is moved over with
+ {motion}
+|gu| gu{motion} make the text that is moved over with {motion}
+ lowercase
+|gU| gU{motion} make the text that is moved over with {motion}
+ uppercase
+|v_g?| {visual}g? perform rot13 encoding on highlighted text
+|g?| g?{motion} perform rot13 encoding on the text that is moved over
+ with {motion}
+
+|CTRL-A| N CTRL-A add N to the number at or after the cursor
+|CTRL-X| N CTRL-X subtract N from the number at or after the cursor
+
+|<| N <{motion} move the lines that are moved over with {motion} one
+ shiftwidth left
+|<<| N << move N lines one shiftwidth left
+|>| N >{motion} move the lines that are moved over with {motion} one
+ shiftwidth right
+|>>| N >> move N lines one shiftwidth right
+|gq| N gq{motion} format the lines that are moved over with {motion} to
+ 'textwidth' length
+|:ce| :[range]ce[nter] [width]
+ center the lines in [range]
+|:le| :[range]le[ft] [indent]
+ left-align the lines in [range] (with [indent])
+|:ri| :[range]ri[ght] [width]
+ right-align the lines in [range]
+------------------------------------------------------------------------------
+*Q_co* Complex changes
+
+|!| N !{motion}{command}<CR>
+ filter the lines that are moved over through {command}
+|!!| N !!{command}<CR>
+ filter N lines through {command}
+|v_!| {visual}!{command}<CR>
+ filter the highlighted lines through {command}
+|:range!| :[range]! {command}<CR>
+ filter [range] lines through {command}
+|=| N ={motion}
+ filter the lines that are moved over through 'equalprg'
+|==| N == filter N lines through 'equalprg'
+|v_=| {visual}=
+ filter the highlighted lines through 'equalprg'
+|:s| :[range]s[ubstitute]/{pattern}/{string}/[g][c]
+ substitute {pattern} by {string} in [range] lines;
+ with [g], replace all occurrences of {pattern};
+ with [c], confirm each replacement
+|:s| :[range]s[ubstitute] [g][c]
+ repeat previous ":s" with new range and options
+|&| & Repeat previous ":s" on current line without options
+|:ret| :[range]ret[ab][!] [tabstop]
+ set 'tabstop' to new value and adjust white space
+ accordingly
+------------------------------------------------------------------------------
+*Q_vi* Visual mode
+
+|visual-index| list of Visual mode commands.
+
+|v| v start highlighting characters } move cursor and use
+|V| V start highlighting linewise } operator to affect
+|CTRL-V| CTRL-V start highlighting blockwise } highlighted text
+|v_o| o exchange cursor position with start of highlighting
+|gv| gv start highlighting on previous visual area
+|v_v| v highlight characters or stop highlighting
+|v_V| V highlight linewise or stop highlighting
+|v_CTRL-V| CTRL-V highlight blockwise or stop highlighting
+------------------------------------------------------------------------------
+*Q_to* Text objects (only in Visual mode or after an operator)
+
+|v_aw| N aw Select "a word"
+|v_iw| N iw Select "inner word"
+|v_aW| N aW Select "a |WORD|"
+|v_iW| N iW Select "inner |WORD|"
+|v_as| N as Select "a sentence"
+|v_is| N is Select "inner sentence"
+|v_ap| N ap Select "a paragraph"
+|v_ip| N ip Select "inner paragraph"
+|v_ab| N ab Select "a block" (from "[(" to "])")
+|v_ib| N ib Select "inner block" (from "[(" to "])")
+|v_aB| N aB Select "a Block" (from "[{" to "]}")
+|v_iB| N iB Select "inner Block" (from "[{" to "]}")
+|v_a>| N a> Select "a <> block"
+|v_i>| N i> Select "inner <> block"
+|v_at| N at Select "a tag block" (from <aaa> to </aaa>)
+|v_it| N it Select "inner tag block" (from <aaa> to </aaa>)
+|v_a'| N a' Select "a single quoted string"
+|v_i'| N i' Select "inner single quoted string"
+|v_aquote| N a" Select "a double quoted string"
+|v_iquote| N i" Select "inner double quoted string"
+|v_a`| N a` Select "a backward quoted string"
+|v_i`| N i` Select "inner backward quoted string"
+
+------------------------------------------------------------------------------
+*Q_re* Repeating commands
+
+|.| N . repeat last change (with count replaced with N)
+|q| q{a-z} record typed characters into register {a-z}
+|q| q{A-Z} record typed characters, appended to register {a-z}
+|q| q stop recording
+|@| N @{a-z} execute the contents of register {a-z} (N times)
+|@@| N @@ repeat previous @{a-z} (N times)
+|:@| :@{a-z} execute the contents of register {a-z} as an Ex
+ command
+|:@@| :@@ repeat previous :@{a-z}
+|:g| :[range]g[lobal]/{pattern}/[cmd]
+ execute Ex command [cmd] (default: ":p") on the lines
+ within [range] where {pattern} matches
+|:g| :[range]g[lobal]!/{pattern}/[cmd]
+ execute Ex command [cmd] (default: ":p") on the lines
+ within [range] where {pattern} does NOT match
+|:so| :so[urce] {file}
+ read Ex commands from {file}
+|:so| :so[urce]! {file}
+ read Vim commands from {file}
+|:sl| :sl[eep] [sec]
+ don't do anything for [sec] seconds
+|gs| N gs goto Sleep for N seconds
+------------------------------------------------------------------------------
+*Q_km* Key mapping
+
+|:map| :ma[p] {lhs} {rhs} map {lhs} to {rhs} in Normal and Visual mode
+|:map!| :ma[p]! {lhs} {rhs} map {lhs} to {rhs} in Insert and Command-line
+ mode
+|:noremap| :no[remap][!] {lhs} {rhs}
+ same as ":map", no remapping for this {rhs}
+|:unmap| :unm[ap] {lhs} remove the mapping of {lhs} for Normal and
+ Visual mode
+|:unmap!| :unm[ap]! {lhs} remove the mapping of {lhs} for Insert and
+ Command-line mode
+|:map_l| :ma[p] [lhs] list mappings (starting with [lhs]) for
+ Normal and Visual mode
+|:map_l!| :ma[p]! [lhs] list mappings (starting with [lhs]) for
+ Insert and Command-line mode
+|:cmap| :cmap/:cunmap/:cnoremap
+ like ":map!"/":unmap!"/":noremap!" but for
+ Command-line mode only
+|:imap| :imap/:iunmap/:inoremap
+ like ":map!"/":unmap!"/":noremap!" but for
+ Insert mode only
+|:nmap| :nmap/:nunmap/:nnoremap
+ like ":map"/":unmap"/":noremap" but for
+ Normal mode only
+|:vmap| :vmap/:vunmap/:vnoremap
+ like ":map"/":unmap"/":noremap" but for
+ Visual mode only
+|:omap| :omap/:ounmap/:onoremap
+ like ":map"/":unmap"/":noremap" but only for
+ when an operator is pending
+|:mapc| :mapc[lear] remove mappings for Normal and Visual mode
+|:mapc| :mapc[lear]! remove mappings for Insert and Cmdline mode
+|:imapc| :imapc[lear] remove mappings for Insert mode
+|:vmapc| :vmapc[lear] remove mappings for Visual mode
+|:omapc| :omapc[lear] remove mappings for Operator-pending mode
+|:nmapc| :nmapc[lear] remove mappings for Normal mode
+|:cmapc| :cmapc[lear] remove mappings for Cmdline mode
+|:mkexrc| :mk[exrc][!] [file] write current mappings, abbreviations, and
+ settings to [file] (default: ".exrc";
+ use ! to overwrite)
+|:mkvimrc| :mkv[imrc][!] [file]
+ same as ":mkexrc", but with default ".vimrc"
+|:mksession| :mks[ession][!] [file]
+ like ":mkvimrc", but store current files,
+ windows, etc. too, to be able to continue
+ this session later
+------------------------------------------------------------------------------
+*Q_ab* Abbreviations
+
+|:abbreviate| :ab[breviate] {lhs} {rhs} add abbreviation for {lhs} to {rhs}
+|:abbreviate| :ab[breviate] {lhs} show abbr's that start with {lhs}
+|:abbreviate| :ab[breviate] show all abbreviations
+|:unabbreviate| :una[bbreviate] {lhs} remove abbreviation for {lhs}
+|:noreabbrev| :norea[bbrev] [lhs] [rhs] like ":ab", but don't remap [rhs]
+|:iabbrev| :iab/:iunab/:inoreab like ":ab", but only for Insert mode
+|:cabbrev| :cab/:cunab/:cnoreab like ":ab", but only for
+ Command-line mode
+|:abclear| :abc[lear] remove all abbreviations
+|:cabclear| :cabc[lear] remove all abbr's for Cmdline mode
+|:iabclear| :iabc[lear] remove all abbr's for Insert 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] {option} set boolean option (switch it on),
+ show string or number option
+|:set| :se[t] no{option} reset boolean option (switch it off)
+|:set| :se[t] inv{option} invert boolean option
+|:set| :se[t] {option}={value} set string/number option to {value}
+|:set| :se[t] {option}+={value} append {value} to string option, add
+ {value} to number option
+|:set| :se[t] {option}-={value} remove {value} to string option,
+ subtract {value} from number option
+|:set| :se[t] {option}? show value of {option}
+|:set| :se[t] {option}& reset {option} to its default value
+
+|:setlocal| :setl[ocal] like ":set" but set the local value
+ for options that have one
+|:setglobal| :setg[lobal] like ":set" but set the global value
+ of a local option
+
+|:fix| :fix[del] set value of 't_kD' according to
+ value of 't_kb'
+|:options| :opt[ions] open a new window to view and set
+ options, grouped by functionality,
+ a one line explanation and links to
+ the help
+
+Short explanation of each option: *option-list*
+'aleph' 'al' ASCII code of the letter Aleph (Hebrew)
+'allowrevins' 'ari' allow CTRL-_ in Insert and Command-line mode
+'altkeymap' 'akm' obsolete option for Farsi
+'ambiwidth' 'ambw' what to do with Unicode chars of ambiguous width
+'antialias' 'anti' Mac OS X: use smooth, antialiased fonts
+'autochdir' 'acd' change directory to the file in the current window
+'autoshelldir' 'asd' change directory to the shell's current directory
+'arabic' 'arab' for Arabic as a default second language
+'arabicshape' 'arshape' do shaping for Arabic characters
+'autoindent' 'ai' take indent for new line from previous line
+'autoread' 'ar' autom. read file when changed outside of Vim
+'autowrite' 'aw' automatically write file if changed
+'autowriteall' 'awa' as 'autowrite', but works with more commands
+'background' 'bg' "dark" or "light", used for highlight colors
+'backspace' 'bs' how backspace works at start of line
+'backup' 'bk' keep backup file after overwriting a file
+'backupcopy' 'bkc' make backup as a copy, don't rename the file
+'backupdir' 'bdir' list of directories for the backup file
+'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 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
+'bioskey' 'biosk' MS-DOS: use bios calls for input characters
+'bomb' prepend a Byte Order Mark to the file
+'breakat' 'brk' characters that may cause a line break
+'breakindent' 'bri' wrapped line repeats indent
+'breakindentopt' 'briopt' settings for 'breakindent'
+'browsedir' 'bsdir' which directory to start browsing in
+'bufhidden' 'bh' what to do when buffer is no longer in window
+'buflisted' 'bl' whether the buffer shows up in the buffer list
+'buftype' 'bt' special type of buffer
+'casemap' 'cmp' specifies how case of letters is changed
+'cdhome' 'cdh' change directory to the home directory by ":cd"
+'cdpath' 'cd' list of directories searched with ":cd"
+'cedit' key used to open the command-line window
+'charconvert' 'ccv' expression for character encoding conversion
+'cindent' 'cin' do C program indenting
+'cinkeys' 'cink' keys that trigger indent when 'cindent' is set
+'cinoptions' 'cino' how to do indenting when 'cindent' is set
+'cinwords' 'cinw' words where 'si' and 'cin' add an indent
+'cinscopedecls' 'cinsd' words that are recognized by 'cino-g'
+'clipboard' 'cb' use the clipboard as the unnamed register
+'cmdheight' 'ch' number of lines to use for the command-line
+'cmdwinheight' 'cwh' height of the command-line window
+'colorcolumn' 'cc' columns to highlight
+'columns' 'co' number of columns in the display
+'comments' 'com' patterns that can start a comment line
+'commentstring' 'cms' template for comments; used for fold marker
+'compatible' 'cp' behave Vi-compatible as much as possible
+'complete' 'cpt' specify how Insert mode completion works
+'completefunc' 'cfu' function to be used for Insert mode completion
+'completeopt' 'cot' options for Insert mode completion
+'completepopup' 'cpp' options for the Insert mode completion info popup
+'completeslash' 'csl' like 'shellslash' for completion
+'concealcursor' 'cocu' whether concealable text is hidden in cursor line
+'conceallevel' 'cole' whether concealable text is shown or hidden
+'confirm' 'cf' ask what to do about unsaved/read-only files
+'conskey' 'consk' get keys directly from console (MS-DOS only)
+'copyindent' 'ci' make 'autoindent' use existing indent structure
+'cpoptions' 'cpo' flags for Vi-compatible behavior
+'cryptmethod' 'cm' type of encryption to use for file writing
+'cscopepathcomp' 'cspc' how many components of the path to show
+'cscopeprg' 'csprg' command to execute cscope
+'cscopequickfix' 'csqf' use quickfix window for cscope results
+'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
+'cursorlineopt' 'culopt' settings for 'cursorline'
+'debug' set to "msg" to see all error messages
+'define' 'def' pattern to be used to find a macro definition
+'delcombine' 'deco' delete combining characters on their own
+'dictionary' 'dict' list of file names used for keyword completion
+'diff' use diff mode for the current window
+'diffexpr' 'dex' expression used to obtain a diff file
+'diffopt' 'dip' options for using diff mode
+'digraph' 'dg' enable the entering of digraphs in Insert mode
+'directory' 'dir' list of directory names for the swap file
+'display' 'dy' list of flags for how to display text
+'eadirection' 'ead' in which direction 'equalalways' works
+'edcompatible' 'ed' toggle flags of ":substitute" command
+'emoji' 'emo' emoji characters are considered full width
+'encoding' 'enc' encoding used internally
+'endoffile' 'eof' write CTRL-Z at end of the file
+'endofline' 'eol' write <EOL> for last line in file
+'equalalways' 'ea' windows are automatically made the same size
+'equalprg' 'ep' external program to use for "=" command
+'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 .vimrc and .exrc in the current directory
+'fileencoding' 'fenc' file encoding for multibyte text
+'fileencodings' 'fencs' automatically detected character encodings
+'fileformat' 'ff' file format used for file I/O
+'fileformats' 'ffs' automatically detected values for 'fileformat'
+'fileignorecase' 'fic' ignore case when using file names
+'filetype' 'ft' type of file, used for autocommands
+'fillchars' 'fcs' characters to use for displaying special items
+'fixendofline' 'fixeol' make sure last line in file has <EOL>
+'fkmap' 'fk' obsolete option for Farsi
+'foldclose' 'fcl' close a fold when the cursor leaves it
+'foldcolumn' 'fdc' width of the column used to indicate folds
+'foldenable' 'fen' set to display all folds open
+'foldexpr' 'fde' expression used when 'foldmethod' is "expr"
+'foldignore' 'fdi' ignore lines when 'foldmethod' is "indent"
+'foldlevel' 'fdl' close folds with a level higher than this
+'foldlevelstart' 'fdls' 'foldlevel' when starting to edit a file
+'foldmarker' 'fmr' markers used when 'foldmethod' is "marker"
+'foldmethod' 'fdm' folding type
+'foldminlines' 'fml' minimum number of lines for a fold to be closed
+'foldnestmax' 'fdn' maximum fold depth
+'foldopen' 'fdo' for which commands a fold will be opened
+'foldtext' 'fdt' expression used to display for a closed fold
+'formatexpr' 'fex' expression used with "gq" command
+'formatlistpat' 'flp' pattern used to recognize a list header
+'formatoptions' 'fo' how automatic formatting is to be done
+'formatprg' 'fp' name of external program used with "gq" command
+'fsync' 'fs' whether to invoke fsync() after file write
+'gdefault' 'gd' the ":substitute" flag 'g' is default on
+'grepformat' 'gfm' format of 'grepprg' output
+'grepprg' 'gp' program to use for ":grep"
+'guicursor' 'gcr' GUI: settings for cursor shape and blinking
+'guifont' 'gfn' GUI: Name(s) of font(s) to be used
+'guifontset' 'gfs' GUI: Names of multibyte fonts to be used
+'guifontwide' 'gfw' list of font names for double-wide characters
+'guiheadroom' 'ghr' GUI: pixels room for window decorations
+'guiligatures' 'gli' GTK GUI: ASCII characters that can form shapes
+'guioptions' 'go' GUI: Which components and options are used
+'guipty' GUI: try to use a pseudo-tty for ":!" commands
+'guitablabel' 'gtl' GUI: custom label for a tab page
+'guitabtooltip' 'gtt' GUI: custom tooltip for a tab page
+'helpfile' 'hf' full path name of the main help file
+'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
+'history' 'hi' number of command-lines that are remembered
+'hkmap' 'hk' Hebrew keyboard mapping
+'hkmapp' 'hkp' phonetic Hebrew keyboard mapping
+'hlsearch' 'hls' highlight matches with last search pattern
+'icon' let Vim set the text of the window icon
+'iconstring' string to use for the Vim icon text
+'ignorecase' 'ic' ignore case in search patterns
+'imactivatefunc' 'imaf' function to enable/disable the X input method
+'imactivatekey' 'imak' key that activates the X input method
+'imcmdline' 'imc' use IM when starting to edit a command line
+'imdisable' 'imd' do not use the IM in any mode
+'iminsert' 'imi' use :lmap or IM in Insert mode
+'imsearch' 'ims' use :lmap or IM when typing a search pattern
+'imstatusfunc' 'imsf' function to obtain X input method status
+'imstyle' 'imst' specifies the input style of the input method
+'include' 'inc' pattern to be used to find an include file
+'includeexpr' 'inex' expression used to process an include line
+'incsearch' 'is' highlight match while typing search pattern
+'indentexpr' 'inde' expression used to obtain the indent of a line
+'indentkeys' 'indk' keys that trigger indenting with 'indentexpr'
+'infercase' 'inf' adjust case of match for keyword completion
+'insertmode' 'im' start the edit of a file in Insert mode
+'isfname' 'isf' characters included in file names and pathnames
+'isident' 'isi' characters included in identifiers
+'iskeyword' 'isk' characters included in keywords
+'isprint' 'isp' printable characters
+'joinspaces' 'js' two spaces after a period with a join command
+'key' encryption key
+'keymap' 'kmp' name of a keyboard mapping
+'keymodel' 'km' enable starting/stopping selection with keys
+'keyprotocol' 'kpc' what keyboard protocol to use for what terminal
+'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
+'lines' number of lines in the display
+'linespace' 'lsp' number of pixel lines to use between characters
+'lisp' automatic indenting for Lisp
+'lispoptions' 'lop' changes how Lisp indenting is done
+'lispwords' 'lw' words that change how lisp indenting works
+'list' show <Tab> and <EOL>
+'listchars' 'lcs' characters for displaying in list mode
+'loadplugins' 'lpl' load plugin scripts when starting up
+'luadll' name of the Lua dynamic library
+'macatsui' Mac GUI: use ATSUI text drawing
+'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
+'modelineexpr' 'mle' allow setting expression options from a modeline
+'modelines' 'mls' number of lines checked for modelines
+'modifiable' 'ma' changes to the text are not possible
+'modified' 'mod' buffer has been modified
+'more' pause listings when the whole screen is filled
+'mouse' enable the use of mouse clicks
+'mousefocus' 'mousef' keyboard focus follows the mouse
+'mousehide' 'mh' hide mouse pointer while typing
+'mousemodel' 'mousem' changes meaning of mouse buttons
+'mousemoveevent' 'mousemev' report mouse moves with <MouseMove>
+'mouseshape' 'mouses' shape of the mouse pointer in different modes
+'mousetime' 'mouset' max time between mouse double-click
+'mzquantum' 'mzq' the interval between polls for MzScheme threads
+'mzschemedll' name of the MzScheme dynamic library
+'mzschemegcdll' name of the MzScheme dynamic library for GC
+'nrformats' 'nf' number formats recognized for CTRL-A command
+'number' 'nu' print the line number in front of each line
+'numberwidth' 'nuw' number of columns used for the line number
+'omnifunc' 'ofu' function for filetype-specific completion
+'opendevice' 'odev' allow reading/writing devices on MS-Windows
+'operatorfunc' 'opfunc' function to be called for |g@| operator
+'osfiletype' 'oft' no longer supported
+'packpath' 'pp' list of directories used for packages
+'paragraphs' 'para' nroff macros that separate paragraphs
+'paste' allow pasting text
+'pastetoggle' 'pt' key code that causes 'paste' to toggle
+'patchexpr' 'pex' expression used to patch a file
+'patchmode' 'pm' keep the oldest version of a file
+'path' 'pa' list of directories searched with "gf" et.al.
+'perldll' name of the Perl dynamic library
+'preserveindent' 'pi' preserve the indent structure when reindenting
+'previewheight' 'pvh' height of the preview window
+'previewpopup' 'pvp' use popup window for preview
+'previewwindow' 'pvw' identifies the preview window
+'printdevice' 'pdev' name of the printer to be used for :hardcopy
+'printencoding' 'penc' encoding to be used for printing
+'printexpr' 'pexpr' expression used to print PostScript for :hardcopy
+'printfont' 'pfn' name of the font to be used for :hardcopy
+'printheader' 'pheader' format of the header used for :hardcopy
+'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
+'pythonhome' name of the Python 2 home directory
+'pythonthreedll' name of the Python 3 dynamic library
+'pythonthreehome' name of the Python 3 home directory
+'pyxversion' 'pyx' Python version used for pyx* commands
+'quickfixtextfunc' 'qftf' function for the text in the quickfix window
+'quoteescape' 'qe' escape characters used in a string
+'readonly' 'ro' disallow writing the buffer
+'redrawtime' 'rdt' timeout for 'hlsearch' and |:match| highlighting
+'regexpengine' 're' default regexp engine to use
+'relativenumber' 'rnu' show relative line number in front of each line
+'remap' allow mappings to work recursively
+'renderoptions' 'rop' options for text rendering on Windows
+'report' threshold for reporting nr. of lines changed
+'restorescreen' 'rs' Win32: restore screen when exiting
+'revins' 'ri' inserting characters will work backwards
+'rightleft' 'rl' window is right-to-left oriented
+'rightleftcmd' 'rlc' commands for which editing works right-to-left
+'rubydll' name of the Ruby dynamic library
+'ruler' 'ru' show cursor line and column in the status line
+'rulerformat' 'ruf' custom format for the ruler
+'runtimepath' 'rtp' list of directories used for runtime files
+'scroll' 'scr' lines to scroll with CTRL-U and CTRL-D
+'scrollbind' 'scb' scroll in window as other windows scroll
+'scrollfocus' 'scf' scroll wheel applies to window under pointer
+'scrolljump' 'sj' minimum number of lines to scroll
+'scrolloff' 'so' minimum nr. of lines above and below cursor
+'scrollopt' 'sbo' how 'scrollbind' should behave
+'sections' 'sect' nroff macros that separate sections
+'secure' secure mode for reading .vimrc in current dir
+'selection' 'sel' what type of selection to use
+'selectmode' 'slm' when to use Select mode instead of Visual mode
+'sessionoptions' 'ssop' options for |:mksession|
+'shell' 'sh' name of shell to use for external commands
+'shellcmdflag' 'shcf' flag to shell to execute one command
+'shellpipe' 'sp' string to put output of ":make" in error file
+'shellquote' 'shq' quote character(s) for around shell command
+'shellredir' 'srr' string to put output of filter in a temp file
+'shellslash' 'ssl' use forward slash for shell file names
+'shelltemp' 'stmp' whether to use a temp file for shell commands
+'shelltype' 'st' Amiga: influences how to use a shell
+'shellxescape' 'sxe' characters to escape when 'shellxquote' is (
+'shellxquote' 'sxq' like 'shellquote', but include redirection
+'shiftround' 'sr' round indent to multiple of shiftwidth
+'shiftwidth' 'sw' number of spaces to use for (auto)indent step
+'shortmess' 'shm' list of flags, reduce length of messages
+'shortname' 'sn' Filenames assumed to be 8.3 chars
+'showbreak' 'sbr' string to use at the start of wrapped lines
+'showcmd' 'sc' show (partial) command somewhere
+'showcmdloc' 'sloc' where to show (partial) command
+'showfulltag' 'sft' show full tag pattern when completing tag
+'showmatch' 'sm' briefly jump to matching bracket if insert one
+'showmode' 'smd' message on status line to show current mode
+'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>
+'smoothscroll' 'sms' scroll by screen lines when 'wrap' is set
+'softtabstop' 'sts' number of spaces that <Tab> uses while editing
+'spell' enable spell checking
+'spellcapcheck' 'spc' pattern to locate end of a sentence
+'spellfile' 'spf' files where |zg| and |zw| store words
+'spelllang' 'spl' language(s) to do spell checking for
+'spelloptions' 'spo' options for spell checking
+'spellsuggest' 'sps' method(s) used to suggest spelling corrections
+'splitbelow' 'sb' new window from split is below the current one
+'splitkeep' 'spk' determines scroll behavior for split windows
+'splitright' 'spr' new window is put right of the current one
+'startofline' 'sol' commands move cursor to first non-blank in line
+'statusline' 'stl' custom format for the status line
+'suffixes' 'su' suffixes that are ignored with multiple match
+'suffixesadd' 'sua' suffixes added when searching for a file
+'swapfile' 'swf' whether to use a swapfile for a buffer
+'swapsync' 'sws' how to sync the swap file
+'switchbuf' 'swb' sets behavior when switching to another buffer
+'synmaxcol' 'smc' maximum column to find syntax items
+'syntax' 'syn' syntax to be loaded for current buffer
+'tabline' 'tal' custom format for the console tab pages line
+'tabpagemax' 'tpm' maximum number of tab pages for |-p| and "tab all"
+'tabstop' 'ts' number of spaces that <Tab> in file uses
+'tagbsearch' 'tbs' use binary searching in tags files
+'tagcase' 'tc' how to handle case when searching in tags files
+'tagfunc' 'tfu' function to get list of tag matches
+'taglength' 'tl' number of significant characters for a tag
+'tagrelative' 'tr' file names in tag file are relative
+'tags' 'tag' list of file names used by the tag command
+'tagstack' 'tgst' push tags onto the tag stack
+'tcldll' name of the Tcl dynamic library
+'term' name of the terminal
+'termbidi' 'tbidi' terminal takes care of bi-directionality
+'termencoding' 'tenc' character encoding used by the terminal
+'termguicolors' 'tgc' use GUI colors for the terminal
+'termwinkey' 'twk' key that precedes a Vim command in a terminal
+'termwinscroll' 'twsl' max number of scrollback lines in a terminal window
+'termwinsize' 'tws' size of a terminal window
+'termwintype' 'twt' MS-Windows: type of pty to use for terminal window
+'terse' shorten some messages
+'textauto' 'ta' obsolete, use 'fileformats'
+'textmode' 'tx' obsolete, use 'fileformat'
+'textwidth' 'tw' maximum width of text that is being inserted
+'thesaurus' 'tsr' list of thesaurus files for keyword completion
+'thesaurusfunc' 'tsrfu' function to be used for thesaurus completion
+'tildeop' 'top' tilde command "~" behaves like an operator
+'timeout' 'to' time out on mappings and key codes
+'timeoutlen' 'tm' time out time in milliseconds
+'title' let Vim set the title of the window
+'titlelen' percentage of 'columns' used for window title
+'titleold' old title, restored when exiting
+'titlestring' string to use for the Vim window title
+'toolbar' 'tb' GUI: which items to show in the toolbar
+'toolbariconsize' 'tbis' size of the toolbar icons (for GTK 2 only)
+'ttimeout' time out on mappings
+'ttimeoutlen' 'ttm' time out time for key codes in milliseconds
+'ttybuiltin' 'tbi' use built-in termcap before external termcap
+'ttyfast' 'tf' indicates a fast terminal connection
+'ttymouse' 'ttym' type of mouse codes generated
+'ttyscroll' 'tsl' maximum number of lines for a scroll
+'ttytype' 'tty' alias for 'term'
+'undodir' 'udir' where to store undo files
+'undofile' 'udf' save undo information in a file
+'undolevels' 'ul' maximum number of changes that can be undone
+'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
+'viewoptions' 'vop' specifies what to save for :mkview
+'viminfo' 'vi' use .viminfo file upon startup and exiting
+'viminfofile' 'vif' file name used for the viminfo file
+'virtualedit' 've' when to use virtual editing
+'visualbell' 'vb' use visual bell instead of beeping
+'warn' warn for shell command when buffer was changed
+'weirdinvert' 'wiv' for terminals that have weird inversion method
+'whichwrap' 'ww' allow specified keys to cross line boundaries
+'wildchar' 'wc' command-line character for wildcard expansion
+'wildcharm' 'wcm' like 'wildchar' but also works when mapped
+'wildignore' 'wig' files matching these patterns are not completed
+'wildignorecase' 'wic' ignore case when completing file names
+'wildmenu' 'wmnu' use menu for command line completion
+'wildmode' 'wim' mode for 'wildchar' command-line expansion
+'wildoptions' 'wop' specifies how command line completion is done
+'winaltkeys' 'wak' when the windows system handles ALT keys
+'wincolor' 'wcr' window-local highlighting
+'window' 'wi' nr of lines to scroll for CTRL-F and CTRL-B
+'winheight' 'wh' minimum number of lines for the current window
+'winfixheight' 'wfh' keep window height when opening/closing windows
+'winfixwidth' 'wfw' keep window width when opening/closing windows
+'winminheight' 'wmh' minimum number of lines for any window
+'winminwidth' 'wmw' minimal number of columns for any window
+'winptydll' name of the winpty dynamic library
+'winwidth' 'wiw' minimal number of columns for current window
+'wrap' long lines wrap and continue on the next line
+'wrapmargin' 'wm' chars from the right where wrapping starts
+'wrapscan' 'ws' searches wrap around the end of the file
+'write' writing to a file is allowed
+'writeany' 'wa' write to file with no need for "!" override
+'writebackup' 'wb' make a backup before overwriting a file
+'writedelay' 'wd' delay this many msec for each char (for debug)
+'xtermcodes' request terminal codes from an xterm
+------------------------------------------------------------------------------
+*Q_ur* Undo/Redo commands
+
+|u| N u undo last N changes
+|CTRL-R| N CTRL-R redo last N undone changes
+|U| U restore last changed line
+------------------------------------------------------------------------------
+*Q_et* External commands
+
+|:shell| :sh[ell] start a shell
+|:!| :!{command} execute {command} with a shell
+|K| K lookup keyword under the cursor with
+ 'keywordprg' program (default: "man")
+------------------------------------------------------------------------------
+*Q_qf* Quickfix commands
+
+|:cc| :cc [nr] display error [nr] (default is the same again)
+|:cnext| :cn display the next error
+|:cprevious| :cp display the previous error
+|:clist| :cl list all errors
+|:cfile| :cf read errors from the file 'errorfile'
+|:cgetbuffer| :cgetb like :cbuffer but don't jump to the first error
+|:cgetfile| :cg like :cfile but don't jump to the first error
+|:cgetexpr| :cgete like :cexpr but don't jump to the first error
+|:caddfile| :caddf add errors from the error file to the current
+ quickfix list
+|:caddexpr| :cad add errors from an expression to the current
+ quickfix list
+|:cbuffer| :cb read errors from text in a buffer
+|:cexpr| :cex read errors from an expression
+|:cquit| :cq quit without writing and return error code (to
+ the compiler)
+|:make| :make [args] start make, read errors, and jump to first
+ error
+|:grep| :gr[ep] [args] execute 'grepprg' to find matches and jump to
+ the first one
+------------------------------------------------------------------------------
+*Q_vc* Various commands
+
+|CTRL-L| CTRL-L clear and redraw the screen
+|CTRL-G| CTRL-G show current file name (with path) and cursor
+ position
+|ga| ga show ascii value of character under cursor in
+ decimal, hex, and octal
+|g8| g8 for utf-8 encoding: show byte sequence for
+ character under cursor in hex
+|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 MS-Windows: during searches: Interrupt the
+ search
+|<Del>| <Del> while entering a count: delete last character
+|:version| :ve[rsion] show version information
+|:mode| :mode N set screen mode to N (obsolete)
+|:normal| :norm[al][!] {commands}
+ execute Normal mode commands
+|Q| Q switch to "Ex" mode
+
+|:redir| :redir >{file} redirect messages to {file}
+|:silent| :silent[!] {command} execute {command} silently
+|:confirm| :confirm {command} quit, write, etc., asking about
+ unsaved changes or read-only files
+|:browse| :browse {command} open/read/write file, using a
+ file selection dialog
+------------------------------------------------------------------------------
+*Q_ce* Command-line editing
+
+|c_<Esc>| <Esc> abandon command-line (if 'wildchar' is
+ <Esc>, type it twice)
+
+|c_CTRL-V| CTRL-V {char} insert {char} literally
+|c_CTRL-V| CTRL-V {number} enter decimal value of character (up to
+ three digits)
+|c_CTRL-K| CTRL-K {char1} {char2}
+ enter digraph (See |Q_di|)
+|c_CTRL-R| CTRL-R {register} insert the contents of a register
+
+|c_<Left>| <Left>/<Right> cursor left/right
+|c_<S-Left>| <S-Left>/<S-Right> cursor one word left/right
+|c_CTRL-B| CTRL-B/CTRL-E cursor to beginning/end of command-line
+
+|c_<BS>| <BS> delete the character in front of the cursor
+|c_<Del>| <Del> delete the character under the cursor
+|c_CTRL-W| CTRL-W delete the word in front of the cursor
+|c_CTRL-U| CTRL-U remove all characters
+
+|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:
+
+|c_wildchar| 'wildchar' (default: <Tab>)
+ do completion on the pattern in front of the
+ cursor; if there are multiple matches,
+ beep and show the first one; further
+ 'wildchar' will show the next ones
+|c_CTRL-D| CTRL-D list all names that match the pattern in
+ front of the cursor
+|c_CTRL-A| CTRL-A insert all names that match pattern in front
+ of cursor
+|c_CTRL-L| CTRL-L insert longest common part of names that
+ match pattern
+|c_CTRL-N| CTRL-N after 'wildchar' with multiple matches: go
+ to next match
+|c_CTRL-P| CTRL-P after 'wildchar' with multiple matches: go
+ to previous match
+------------------------------------------------------------------------------
+*Q_ra* Ex ranges
+
+|:range| , separates two line numbers
+|:range| ; idem, set cursor to the first line number
+ before interpreting the second one
+
+|:range| {number} an absolute line number
+|:range| . the current line
+|:range| $ the last line in the file
+|:range| % equal to 1,$ (the entire file)
+|:range| * equal to '<,'> (visual area)
+|:range| 't position of mark t
+|:range| /{pattern}[/] the next line where {pattern} matches
+|:range| ?{pattern}[?] the previous line where {pattern} matches
+
+|:range| +[num] add [num] to the preceding line number
+ (default: 1)
+|:range| -[num] subtract [num] from the preceding line
+ number (default: 1)
+------------------------------------------------------------------------------
+*Q_ex* Special Ex characters
+
+|:bar| | separates two commands (not for ":global" and ":!")
+|:quote| " begins comment
+
+|:_%| % current file name (only where a file name is expected)
+|:_#| #[num] alternate file name [num] (only where a file name is
+ expected)
+ Note: The next seven are typed literally; these are not special keys!
+|:<abuf>| <abuf> buffer number, for use in an autocommand (only where a
+ file name is expected)
+|:<afile>| <afile> file name, for use in an autocommand (only where a
+ file name is expected)
+|:<amatch>| <amatch> what matched with the pattern, for use in an
+ autocommand (only where a file name is expected)
+|:<cword>| <cword> word under the cursor (only where a file name is
+ expected)
+|:<cWORD>| <cWORD> WORD under the cursor (only where a file name is
+ expected) (see |WORD|)
+|:<cfile>| <cfile> file name under the cursor (only where a file name is
+ expected)
+|:<sfile>| <sfile> file name of a ":source"d file, within that file (only
+ where a file name is expected)
+
+ After "%", "#", "<cfile>", "<sfile>" or "<afile>"
+ |::p| :p full path
+ |::h| :h head (file name removed)
+ |::t| :t tail (file name only)
+ |::r| :r root (extension removed)
+ |::e| :e extension
+ |::s| :s/{pat}/{repl}/ substitute {pat} with {repl}
+------------------------------------------------------------------------------
+*Q_st* Starting Vim
+
+|-vim| vim [options] start editing with an empty buffer
+|-file| vim [options] {file} .. start editing one or more files
+|--| vim [options] - read file from stdin
+|-tag| vim [options] -t {tag} edit the file associated with {tag}
+|-qf| vim [options] -q [fname] start editing in QuickFix mode,
+ display the first error
+
+ Most useful Vim arguments (for full list see |startup-options|)
+
+|-gui| -g start GUI (also allows other options)
+
+|-+| +[num] put the cursor at line [num] (default: last line)
+|-+c| +{command} execute {command} after loading the file
+|-+/| +/{pat} {file} .. put the cursor at the first occurrence of {pat}
+|-v| -v Vi mode, start ex in Normal mode
+|-e| -e Ex mode, start vim in Ex mode
+|-R| -R Read-only mode, implies -n
+|-m| -m modifications not allowed (resets 'write' option)
+|-d| -d diff mode |diff|
+|-b| -b binary mode
+|-l| -l lisp mode
+|-A| -A Arabic mode ('arabic' is set)
+|-F| -F Farsi mode ('fkmap' and 'rightleft' are set)
+|-H| -H Hebrew mode ('hkmap' and 'rightleft' are set)
+|-V| -V Verbose, give informative messages
+|-C| -C Compatible, set the 'compatible' option
+|-N| -N Nocompatible, reset the 'compatible' option
+|-r| -r give list of swap files
+|-r| -r {file} .. recover aborted edit session
+|-n| -n do not create a swap file
+|-o| -o [num] open [num] windows (default: one for each file)
+|-f| -f GUI: foreground process, don't fork
+ Amiga: do not restart Vim to open a window (for
+ e.g., mail)
+|-s| -s {scriptin} first read commands from the file {scriptin}
+|-w| -w {scriptout} write typed chars to file {scriptout} (append)
+|-W| -W {scriptout} write typed chars to file {scriptout} (overwrite)
+|-T| -T {terminal} set terminal name
+|-d| -d {device} Amiga: open {device} to be used as a console
+|-u| -u {vimrc} read inits from {vimrc} instead of other inits
+|-U| -U {gvimrc} idem, for when starting the GUI
+|-i| -i {viminfo} read info from {viminfo} instead of other files
+|---| -- end of options, other arguments are file names
+|--help| --help show list of arguments and exit
+|--version| --version show version info and exit
+|--| - read file from stdin
+------------------------------------------------------------------------------
+*Q_ed* Editing a file
+
+ Without !: Fail if changes have been made to the current buffer.
+ With !: Discard any changes to the current buffer.
+|:edit_f| :e[dit][!] {file} edit {file}
+|:edit| :e[dit][!] reload the current file
+|:enew| :ene[w][!] edit a new, unnamed buffer
+|:find| :fin[d][!] {file} find {file} in 'path' and edit it
+
+|CTRL-^| N CTRL-^ edit alternate file N (equivalent to ":e #N")
+|gf| gf or ]f edit the file whose name is under the cursor
+|:pwd| :pwd print the current directory name
+|:cd| :cd [path] change the current directory to [path]
+|:cd-| :cd - back to previous current directory
+|:file| :f[ile] print the current file name and the cursor
+ position
+|:file| :f[ile] {name} set the current file name to {name}
+|:files| :files show alternate file names
+------------------------------------------------------------------------------
+*Q_fl* Using the argument list |argument-list|
+
+|:args| :ar[gs] print the argument list, with the current file
+ in "[]"
+|:all| :all or :sall open a window for every file in the arg list
+|:wn| :wn[ext][!] write file and edit next file
+|:wn| :wn[ext][!] {file} write to {file} and edit next file, unless
+ {file} exists; With !, overwrite existing
+ file
+|:wN| :wN[ext][!] [file] write file and edit previous file
+
+ in current window in new window ~
+|:argument| :argu[ment] N :sar[gument] N edit file N
+|:next| :n[ext] :sn[ext] edit next file
+|:next_f| :n[ext] {arglist} :sn[ext] {arglist} define new arg list
+ and edit first file
+|:Next| :N[ext] :sN[ext] edit previous file
+|:first| :fir[st] :sfir[st] edit first file
+|:last| :la[st] :sla[st] edit last file
+------------------------------------------------------------------------------
+*Q_wq* Writing and quitting
+
+|:w| :[range]w[rite][!] write to the current file
+|:w_f| :[range]w[rite] {file} write to {file}, unless it already
+ exists
+|:w_f| :[range]w[rite]! {file} write to {file}. Overwrite an existing
+ file
+|:w_a| :[range]w[rite][!] >> append to the current file
+|:w_a| :[range]w[rite][!] >> {file} append to {file}
+|:w_c| :[range]w[rite] !{cmd} execute {cmd} with [range] lines as
+ standard input
+|:up| :[range]up[date][!] write to current file if modified
+|:wall| :wa[ll][!] write all changed buffers
+
+|:q| :q[uit] quit current buffer, unless changes have been
+ made; Exit Vim when there are no other
+ non-help buffers
+|:q| :q[uit]! quit current buffer always, discard any
+ changes. Exit Vim when there are no other
+ non-help buffers
+|:qa| :qa[ll] exit Vim, unless changes have been made
+|:qa| :qa[ll]! exit Vim always, discard any changes
+|:cq| :cq quit without writing and return error code
+
+|:wq| :wq[!] write the current file and exit
+|:wq| :wq[!] {file} write to {file} and exit
+|:xit| :x[it][!] [file] like ":wq" but write only when changes have
+ been made
+|ZZ| ZZ same as ":x"
+|ZQ| ZQ same as ":q!"
+|:xall| :xa[ll][!] or :wqall[!]
+ write all changed buffers and exit
+
+|:stop| :st[op][!] suspend Vim or start new shell; if 'aw' option
+ is set and [!] not given write the buffer
+|CTRL-Z| CTRL-Z same as ":stop"
+------------------------------------------------------------------------------
+*Q_ac* Automatic Commands
+
+|viminfo-file| read registers, marks, history at startup, save when exiting.
+
+|:rviminfo| :rv[iminfo] [file] read info from viminfo file [file]
+|:rviminfo| :rv[iminfo]! [file] idem, overwrite existing info
+|:wviminfo| :wv[iminfo] [file] add info to viminfo file [file]
+|:wviminfo| :wv[iminfo]! [file] write info to viminfo file [file]
+
+|modeline| Automatic option setting when editing a file
+
+|modeline| vim:{set-arg}: .. In the first and last lines of the
+ file (see 'ml' option), {set-arg} is
+ given as an argument to ":set"
+
+|autocommand| Automatic execution of commands on certain events.
+
+|:autocmd| :au list all autocommands
+|:autocmd| :au {event} list all autocommands for {event}
+|:autocmd| :au {event} {pat} list all autocommands for {event}
+ with {pat}
+|:autocmd| :au {event} {pat} {cmd} enter new autocommands for {event}
+ with {pat}
+|:autocmd| :au! remove all autocommands
+|:autocmd| :au! {event} remove all autocommands for {event}
+|:autocmd| :au! * {pat} remove all autocommands for {pat}
+|:autocmd| :au! {event} {pat} remove all autocommands for {event}
+ with {pat}
+|:autocmd| :au! {event} {pat} {cmd} remove all autocommands for {event}
+ with {pat} and enter new one
+------------------------------------------------------------------------------
+*Q_wi* Multi-window commands
+
+|CTRL-W_s| CTRL-W s or :split split window into two parts
+|:split_f| :split {file} split window and edit {file} in one of
+ them
+|:vsplit| :vsplit {file} same, but split vertically
+|:vertical| :vertical {cmd} make {cmd} split vertically
+
+|: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
+ the cursor
+|CTRL-W_^| CTRL-W ^ split window and edit alternate file
+|CTRL-W_n| CTRL-W n or :new create new empty window
+|CTRL-W_q| CTRL-W q or :q[uit] quit editing and close window
+|CTRL-W_c| CTRL-W c or :clo[se] make buffer hidden and close window
+|CTRL-W_o| CTRL-W o or :on[ly] make current window only one on the
+ screen
+
+|CTRL-W_j| CTRL-W j move cursor to window below
+|CTRL-W_k| CTRL-W k move cursor to window above
+|CTRL-W_CTRL-W| CTRL-W CTRL-W move cursor to window below (wrap)
+|CTRL-W_W| CTRL-W W move cursor to window above (wrap)
+|CTRL-W_t| CTRL-W t move cursor to top window
+|CTRL-W_b| CTRL-W b move cursor to bottom window
+|CTRL-W_p| CTRL-W p move cursor to previous active window
+
+|CTRL-W_r| CTRL-W r rotate windows downwards
+|CTRL-W_R| CTRL-W R rotate windows upwards
+|CTRL-W_x| CTRL-W x exchange current window with next one
+
+|CTRL-W_=| CTRL-W = make all windows equal height & width
+|CTRL-W_-| CTRL-W - decrease current window height
+|CTRL-W_+| CTRL-W + increase current window height
+|CTRL-W__| CTRL-W _ set current window height (default:
+ very high)
+
+|CTRL-W_<| CTRL-W < decrease current window width
+|CTRL-W_>| CTRL-W > increase current window width
+|CTRL-W_bar| CTRL-W | set current window width (default:
+ widest possible)
+------------------------------------------------------------------------------
+*Q_bu* Buffer list commands
+
+|:buffers| :buffers or :files list all known buffer and file names
+
+|:ball| :ball or :sball edit all args/buffers
+|:unhide| :unhide or :sunhide edit all loaded buffers
+
+|:badd| :badd {fname} add file name {fname} to the list
+|:bunload| :bunload[!] [N] unload buffer [N] from memory
+|:bdelete| :bdelete[!] [N] unload buffer [N] and delete it from
+ the buffer list
+
+ in current window in new window ~
+|:buffer| :[N]buffer [N] :[N]sbuffer [N] to arg/buf N
+|:bnext| :[N]bnext [N] :[N]sbnext [N] to Nth next arg/buf
+|:bNext| :[N]bNext [N] :[N]sbNext [N] to Nth previous arg/buf
+|:bprevious| :[N]bprevious [N] :[N]sbprevious [N] to Nth previous arg/buf
+|:bfirst| :bfirst :sbfirst to first arg/buf
+|:blast| :blast :sblast to last arg/buf
+|:bmodified| :[N]bmod [N] :[N]sbmod [N] to Nth modified buf
+------------------------------------------------------------------------------
+*Q_sy* Syntax Highlighting
+
+|:syn-on| :syntax on start using syntax highlighting
+|:syn-off| :syntax off stop using syntax highlighting
+
+|:syn-keyword| :syntax keyword {group-name} {keyword} ..
+ add a syntax keyword item
+|:syn-match| :syntax match {group-name} {pattern} ...
+ add syntax match item
+|:syn-region| :syntax region {group-name} {pattern} ...
+ add syntax region item
+|:syn-sync| :syntax sync [ccomment | lines {N} | ...]
+ tell syntax how to sync
+|:syntax| :syntax [list] list current syntax items
+|:syn-clear| :syntax clear clear all syntax info
+
+|:highlight| :highlight clear clear all highlight info
+|:highlight| :highlight {group-name} {key}={arg} ..
+ set highlighting for {group-name}
+
+|:filetype| :filetype on switch on file type detection, without
+ syntax highlighting
+|:filetype| :filetype plugin indent on
+ switch on file type detection, with
+ automatic indenting and settings
+------------------------------------------------------------------------------
+*Q_gu* GUI commands
+
+|:gui| :gui UNIX: start the GUI
+|:gui| :gui {fname} .. idem, and edit {fname} ..
+
+|:menu| :menu list all menus
+|:menu| :menu {mpath} list menus starting with {mpath}
+|:menu| :menu {mpath} {rhs} add menu {mpath}, giving {rhs}
+|:menu| :menu {pri} {mpath} {rhs}
+ idem, with priorities {pri}
+|:menu| :menu ToolBar.{name} {rhs}
+ add toolbar item, giving {rhs}
+|:tmenu| :tmenu {mpath} {text} add tooltip to menu {mpath}
+|:unmenu| :unmenu {mpath} remove menu {mpath}
+------------------------------------------------------------------------------
+*Q_fo* Folding
+
+|'foldmethod'| set foldmethod=manual manual folding
+ set foldmethod=indent folding by indent
+ set foldmethod=expr folding by 'foldexpr'
+ set foldmethod=syntax folding by syntax regions
+ set foldmethod=marker folding by 'foldmarker'
+
+|zf| zf{motion} operator: Define a fold manually
+|:fold| :{range}fold define a fold for {range} lines
+|zd| zd delete one fold under the cursor
+|zD| zD delete all folds under the cursor
+
+|zo| zo open one fold under the cursor
+|zO| zO open all folds under the cursor
+|zc| zc close one fold under the cursor
+|zC| zC close all folds under the cursor
+
+|zm| zm fold more: decrease 'foldlevel'
+|zM| zM close all folds: make 'foldlevel' zero
+|zr| zr reduce folding: increase 'foldlevel'
+|zR| zR open all folds: make 'foldlevel' max.
+
+|zn| zn fold none: reset 'foldenable'
+|zN| zN fold normal set 'foldenable'
+|zi| zi invert 'foldenable'
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/quotes.txt b/runtime/doc/quotes.txt
new file mode 100644
index 0000000..181682d
--- /dev/null
+++ b/runtime/doc/quotes.txt
@@ -0,0 +1,275 @@
+*quotes.txt* For Vim version 9.0. Last change: 2018 Mar 29
+
+
+ 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:noet:ft=help:norl:
diff --git a/runtime/doc/recover.txt b/runtime/doc/recover.txt
new file mode 100644
index 0000000..db58241
--- /dev/null
+++ b/runtime/doc/recover.txt
@@ -0,0 +1,238 @@
+*recover.txt* For Vim version 9.0. Last change: 2020 Aug 15
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Recovery after a crash *crash-recovery*
+
+You have spent several hours typing in that text that has to be finished
+next morning, and then disaster strikes: Your computer crashes.
+
+ DON'T PANIC!
+
+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|
+
+==============================================================================
+1. The swap file *swap-file*
+
+Vim stores the things you changed in a swap file. Using the original file
+you started from plus the swap file you can mostly recover your work.
+
+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
+ edited file. This avoids that the swap file shows up in a directory
+ listing.
+- On MS-Windows machines and when the 'shortname' option is on, any '.' in the
+ original file name is replaced with '_'.
+- If this file already exists (e.g., when you are recovering from a crash) a
+ warning is given and another extension is used, ".swo", ".swn", etc.
+- An existing file will never be overwritten.
+- The swap file is deleted as soon as Vim stops editing the file.
+
+Technical: The replacement of '.' with '_' is done to avoid problems with
+ MS-DOS compatible filesystems (e.g., crossdos, multidos). If Vim
+ is able to detect that the file is on an MS-DOS-like filesystem, a
+ flag is set that has the same effect as the 'shortname' option.
+ This flag is reset when you start editing another file.
+ *E326*
+ If the ".swp" file name already exists, the last character is
+ decremented until there is no file with that name or ".saa" is
+ reached. In the last case, no swap file is created.
+
+By setting the 'directory' option you can place the swap file in another place
+than where the edited file is.
+Advantages:
+- You will not pollute the directories with ".swp" files.
+- When the 'directory' is on another partition, reduce the risk of damaging
+ the file system where the file is (in a crash).
+Disadvantages:
+- You can get name collisions from files with the same name but in different
+ directories (although Vim tries to avoid that by comparing the path name).
+ This will result in bogus ATTENTION warning messages.
+- When you use your home directory, and somebody else tries to edit the same
+ file, that user will not see your swap file and will not get the ATTENTION
+ warning message.
+On the Amiga you can also use a recoverable ram disk, but there is no 100%
+guarantee that this works. Putting swap files in a normal ram disk (like RAM:
+on the Amiga) or in a place that is cleared when rebooting (like /tmp on Unix)
+makes no sense, you will lose the swap file in a crash.
+
+If you want to put swap files in a fixed place, put a command resembling the
+following ones in your .vimrc:
+ :set dir=dh2:tmp (for Amiga)
+ :set dir=~/tmp (for Unix)
+ :set dir=c:\\tmp (for Win32)
+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.
+
+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.
+
+:nos[wapfile] {command} *:nos* *:noswapfile*
+ Execute {command}. If it contains a command that loads a new
+ buffer, it will be loaded without creating a swapfile and the
+ 'swapfile' option will be reset. If a buffer already had a
+ swapfile it is not removed and 'swapfile' is not reset.
+
+
+Detecting an existing swap file ~
+
+You can find this in the user manual, section |11.3|.
+
+
+Updating the swapfile ~
+
+The swap file is updated after typing 200 characters or when you have not
+typed anything for four seconds. This only happens if the buffer was
+changed, not when you only moved around. The reason why it is not kept up to
+date all the time is that this would slow down normal work too much. You can
+change the 200 character count with the 'updatecount' option. You can set
+the time with the 'updatetime' option. The time is given in milliseconds.
+After writing to the swap file Vim syncs the file to disk. This takes some
+time, especially on busy Unix systems. If you don't want this you can set the
+'swapsync' option to an empty string. The risk of losing work becomes bigger
+though. On some non-Unix systems (MS-Windows, Amiga) the swap file won't be
+written at all.
+
+If the writing to the swap file is not wanted, it can be switched off by
+setting the 'updatecount' option to 0. The same is done when starting Vim
+with the "-n" option. Writing can be switched back on by setting the
+'updatecount' option to non-zero. Swap files will be created for all buffers
+when doing this. But when setting 'updatecount' to zero, the existing swap
+files will not be removed, it will only affect files that will be opened
+after this.
+
+If you want to make sure that your changes are in the swap file use this
+command:
+
+ *:pre* *:preserve* *E313* *E314*
+:pre[serve] Write all text for the current buffer into its swap
+ file. The original file is no longer needed for
+ recovery. This sets a flag in the current buffer.
+ When the '&' flag is present in 'cpoptions' the swap
+ file will not be deleted for this buffer when Vim
+ exits and the buffer is still loaded |cpo-&|.
+
+A Vim swap file can be recognized by the first six characters: "b0VIM ".
+After that comes the version number, e.g., "3.0".
+
+
+Links and symbolic links ~
+
+On Unix it is possible to have two names for the same file. This can be done
+with hard links and with symbolic links (symlinks).
+
+For hard links Vim does not know the other name of the file. Therefore, the
+name of the swapfile will be based on the name you used to edit the file.
+There is no check for editing the same file by the other name too, because Vim
+cannot find the other swapfile (except for searching all of your harddisk,
+which would be very slow).
+
+For symbolic links Vim resolves the links to find the name of the actual file.
+The swap file name is based on that name. Thus it doesn't matter by what name
+you edit the file, the swap file name will normally be the same. However,
+there are exceptions:
+- When the directory of the actual file is not writable the swapfile is put
+ elsewhere.
+- When the symbolic links somehow create a loop you get an *E773* error
+ message and the unmodified file name will be used. You won't be able to
+ save your file normally.
+
+==============================================================================
+2. Recovery *recovery* *E308* *E311*
+
+Basic file recovery is explained in the user manual: |usr_11.txt|.
+
+Another way to do recovery is to start Vim and use the ":recover" command.
+This is easy when you start Vim to edit a file and you get the "ATTENTION:
+Found a swap file ..." message. In this case the single command ":recover"
+will do the work. You can also give the name of the file or the swap file to
+the recover command:
+ *:rec* *:recover* *E305* *E306* *E307*
+:rec[over] [file] Try to recover [file] from the swap file. If [file]
+ is not given use the file name for the current
+ buffer. The current contents of the buffer are lost.
+ This command fails if the buffer was modified.
+
+:rec[over]! [file] Like ":recover", but any changes in the current
+ buffer are lost.
+
+ *E312* *E309* *E310*
+Vim has some intelligence about what to do if the swap file is corrupt in
+some way. If Vim has doubt about what it found, it will give an error
+message and insert lines with "???" in the text. If you see an error message
+while recovering, search in the file for "???" to see what is wrong. You may
+want to cut and paste to get the text you need.
+
+The most common remark is "???LINES MISSING". This means that Vim cannot read
+the text from the original file. This can happen if the system crashed and
+parts of the original file were not written to disk.
+
+Be sure that the recovery was successful before overwriting the original
+file or deleting the swap file. It is good practice to write the recovered
+file elsewhere and run 'diff' to find out if the changes you want are in the
+recovered file. Or use |:DiffOrig|.
+
+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.
+
+
+
+ENCRYPTION AND THE SWAP FILE *:recover-crypt*
+
+When the text file is encrypted the swap file is encrypted as well. This
+makes recovery a bit more complicated. When recovering from a swap file and
+encryption has been used, you will be asked to enter one or two crypt keys.
+
+If the text file does not exist you will only be asked to enter the crypt key
+for the swap file.
+
+If the text file does exist, it may be encrypted in a different way than the
+swap file. You will be asked for the crypt key twice:
+
+ Need encryption key for "/tmp/tt" ~
+ Enter encryption key: ****** ~
+ "/tmp/tt" [crypted] 23200L, 522129C ~
+ Using swap file "/tmp/.tt.swp" ~
+ Original file "/tmp/tt" ~
+ Swap file is encrypted: "/tmp/.tt.swp" ~
+ If you entered a new crypt key but did not write the text file, ~
+ enter the new crypt key. ~
+ If you wrote the text file after changing the crypt key press enter ~
+ to use the same key for text file and swap file ~
+ Enter encryption key: ~
+
+You can be in one of these two situations:
+
+1. The encryption key was not changed, or after changing the key the text file
+ was written. You will be prompted for the crypt key twice. The second
+ time you can simply press Enter. That means the same key is used for the
+ text file and the swap file.
+2. You entered a new encryption key, but did not save the text file. Vim will
+ then use the new key for the swap file, and the text file will still be
+ encrypted with the old key. At the second prompt enter the new key.
+
+Note that after recovery the key of the swap file will be used for the text
+file. Thus if you write the text file, you need to use that new key.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/remote.txt b/runtime/doc/remote.txt
new file mode 100644
index 0000000..724b58c
--- /dev/null
+++ b/runtime/doc/remote.txt
@@ -0,0 +1,209 @@
+*remote.txt* For Vim version 9.0. Last change: 2022 Feb 17
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Vim client-server communication *client-server*
+
+1. Common functionality |clientserver|
+2. X11 specific items |x11-clientserver|
+3. MS-Windows specific items |w32-clientserver|
+
+==============================================================================
+1. Common functionality *clientserver*
+
+When compiled with the |+clientserver| option, Vim can act as a command
+server. It accepts messages from a client and executes them. At the same
+time, Vim can function as a client and send commands to a Vim server.
+
+The following command line arguments are available:
+
+ argument meaning ~
+
+ --remote [+{cmd}] {file} ... *--remote*
+ Open the file list in a remote Vim. When
+ there is no Vim server, execute locally.
+ There is one optional init command: +{cmd}.
+ This must be an Ex command that can be
+ followed by "|".
+ The rest of the command line is taken as the
+ file list. Thus any non-file arguments must
+ come before this.
+ You cannot edit stdin this way |--|.
+ The remote Vim is raised. If you don't want
+ this use >
+ vim --remote-send "<C-\><C-N>:n filename<CR>"
+<
+ --remote-silent [+{cmd}] {file} ... *--remote-silent*
+ As above, but don't complain if there is no
+ server and the file is edited locally.
+ --remote-wait [+{cmd}] {file} ... *--remote-wait*
+ As --remote, but wait for files to complete
+ (unload) in remote Vim.
+ --remote-wait-silent [+{cmd}] {file} ... *--remote-wait-silent*
+ As --remote-wait, but don't complain if there
+ is no server.
+ *--remote-tab*
+ --remote-tab Like --remote but open each file in a new
+ tabpage.
+ *--remote-tab-silent*
+ --remote-tab-silent Like --remote-silent but open each file in a
+ new tabpage.
+ *--remote-tab-wait*
+ --remote-tab-wait Like --remote-wait but open each file in a new
+ tabpage.
+
+ *--remote-tab-wait-silent*
+ --remote-tab-wait-silent Like --remote-wait-silent but open each file
+ in a new tabpage.
+ *--servername*
+ --servername {name} Become the server {name}. When used together
+ with one of the --remote commands: connect to
+ server {name} instead of the default (see
+ below). The name used will be uppercase.
+ *--remote-send*
+ --remote-send {keys} Send {keys} to server and exit. The {keys}
+ are not mapped. Special key names are
+ recognized, e.g., "<CR>" results in a CR
+ character.
+ *--remote-expr*
+ --remote-expr {expr} Evaluate {expr} in server and print the result
+ on stdout.
+ *--serverlist*
+ --serverlist Output a list of server names.
+
+
+Examples ~
+
+Edit "file.txt" in an already running GVIM server: >
+ gvim --remote file.txt
+
+Edit "file.txt" in an already running server called FOOBAR: >
+ gvim --servername FOOBAR --remote file.txt
+
+Edit "file.txt" in server "FILES" if it exists, become server "FILES"
+otherwise: >
+ gvim --servername FILES --remote-silent file.txt
+
+This doesn't work, all arguments after --remote will be used as file names: >
+ gvim --remote --servername FOOBAR file.txt
+
+Edit file "+foo" in a remote server (note the use of "./" to avoid the special
+meaning of the leading plus): >
+ vim --remote ./+foo
+
+Tell the remote server "BLA" to write all files and exit: >
+ vim --servername BLA --remote-send '<C-\><C-N>:wqa<CR>'
+
+
+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
+specified name is not available, a postfix is applied until a free name is
+encountered, i.e. "gvim1" for the second invocation of gvim on a particular
+X-server. The resulting name is available in the servername builtin variable
+|v:servername|. The case of the server name is ignored, thus "gvim" and
+"GVIM" are considered equal.
+
+When Vim is invoked with --remote, --remote-wait or --remote-send it will try
+to locate the server name determined by the invocation name and --servername
+argument as described above. If an exact match is not available, the first
+server with the number postfix will be used. If a name with the number
+postfix is specified with the --servername argument, it must match exactly.
+
+If no server can be located and --remote or --remote-wait was used, Vim will
+start up according to the rest of the command line and do the editing by
+itself. This way it is not necessary to know whether gvim is already started
+when sending command to it.
+
+The --serverlist argument will cause Vim to print a list of registered command
+servers on the standard output (stdout) and exit.
+ *{server}*
+The {server} argument is used by several functions. When this is an empty
+string then on Unix the default server name is used, which is "GVIM". On
+MS-Windows an empty string does not work.
+
+Win32 Note: Making the Vim server go to the foreground doesn't always work,
+because MS-Windows doesn't allow it. The client will move the server to the
+foreground when using the --remote or --remote-wait argument and the server
+name starts with "g".
+
+
+REMOTE EDITING
+
+The --remote argument will cause a |:drop| command to be constructed from the
+rest of the command line and sent as described above.
+The --remote-wait argument does the same thing and additionally sets up to
+wait for each of the files to have been edited. This uses the BufUnload
+event, thus as soon as a file has been unloaded, Vim assumes you are done
+editing it.
+Note that the --remote and --remote-wait arguments will consume the rest of
+the command line. I.e. all remaining arguments will be regarded as filenames.
+You can not put options there!
+
+
+FUNCTIONS
+ *E240* *E573*
+There are a number of Vim functions for scripting the command server. See
+the description in |builtin.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
+ remote_peek( serverid, retvar) check for reply string
+ remote_read( serverid) read reply string
+ server2client( serverid, string) send reply string
+ remote_foreground( server) bring server to the front
+
+See also the explanation of |CTRL-\_CTRL-N|. Very useful as a leading key
+sequence.
+The {serverid} for server2client() can be obtained with expand("<client>")
+
+==============================================================================
+2. X11 specific items *x11-clientserver*
+ *E247* *E248* *E251* *E258* *E277*
+
+The communication between client and server goes through the X server. The
+display of the Vim server must be specified. The usual protection of the X
+server is used, you must be able to open a window on the X server for the
+communication to work. It is possible to communicate between different
+systems.
+
+By default, a GUI Vim will register a name on the X-server by which it can be
+addressed for subsequent execution of injected strings. Vim can also act as
+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, or when Vim was built with the |+autoservername|
+feature.
+
+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
+file src/if_xcmdsrv.c, it contains some hints about the protocol used.
+
+==============================================================================
+3. Win32 specific items *w32-clientserver*
+
+Every Win32 Vim can work as a server, also in the console. You do not need a
+version compiled with OLE. Windows messages are used, this works on any
+version of MS-Windows. But only communication within one system is possible.
+
+Since MS-Windows messages are used, any other application should be able to
+communicate with a Vim server. An alternative is using the OLE functionality
+|ole-interface|.
+
+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:noet:ft=help:norl:
diff --git a/runtime/doc/repeat.txt b/runtime/doc/repeat.txt
new file mode 100644
index 0000000..c8a0f5d
--- /dev/null
+++ b/runtime/doc/repeat.txt
@@ -0,0 +1,1177 @@
+*repeat.txt* For Vim version 9.0. Last change: 2023 Feb 25
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+
+==============================================================================
+1. Single repeats *single-repeat*
+
+ *.*
+. Repeat last change, with count replaced with [count].
+ Also repeat a yank command, when the 'y' flag is
+ included in 'cpoptions'. Does not repeat a
+ command-line command.
+
+Simple changes can be repeated with the "." command. Without a count, the
+count of the last change is used. If you enter a count, it will replace the
+last one. |v:count| and |v:count1| will be set.
+
+If the last change included a specification of a numbered register, the
+register number will be incremented. See |redo-register| for an example how
+to use this.
+
+Note that when repeating a command that used a Visual selection, the same SIZE
+of area is used, see |visual-repeat|.
+
+ *@:*
+@: Repeat last command-line [count] times.
+ {not available when compiled without the
+ |+cmdline_hist| feature}
+
+
+==============================================================================
+2. Multiple repeats *multi-repeat*
+
+ *:g* *:global* *E148*
+:[range]g[lobal]/{pattern}/[cmd]
+ Execute the Ex command [cmd] (default ":p") on the
+ lines within [range] where {pattern} matches.
+
+:[range]g[lobal]!/{pattern}/[cmd]
+ Execute the Ex command [cmd] (default ":p") on the
+ lines within [range] where {pattern} does NOT match.
+
+ *:v* *:vglobal*
+:[range]v[global]/{pattern}/[cmd]
+ Same as :g!.
+
+Example: >
+ :g/^Obsolete/d _
+Using the underscore after `:d` avoids clobbering registers or the clipboard.
+This also makes it faster.
+
+Instead of the '/' which surrounds the {pattern}, you can use any other
+single byte character, but not an alphabetic character, '\', '"' or '|'.
+This is useful if you want to include a '/' in the search pattern or
+replacement string.
+
+For the definition of a pattern, see |pattern|.
+
+NOTE [cmd] may contain a range; see |collapse| and |edit-paragraph-join| for
+examples.
+
+The global commands work by first scanning through the [range] lines and
+marking each line where a match occurs (for a multi-line pattern, only the
+start of the match matters).
+In a second scan the [cmd] is executed for each marked line, as if the cursor
+was in that line. For ":v" and ":g!" the command is executed for each not
+marked line. If a line is deleted its mark disappears.
+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.
+ *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".
+
+Any Ex command can be used, see |ex-cmd-index|. To execute a Normal mode
+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
+have been updated, so you don't know what you are doing. See |:normal|.
+
+The undo/redo command will undo/redo the whole global command at once.
+The previous context mark will only be set once (with "''" you go back to
+where the cursor was before the global command).
+
+The global command sets both the last used search pattern and the last used
+substitute pattern (this is vi compatible). This makes it easy to globally
+replace a string:
+ :g/pat/s//PAT/g
+This replaces all occurrences of "pat" with "PAT". The same can be done with:
+ :%s/pat/PAT/g
+Which is two characters shorter!
+
+When using "global" in Ex mode, a special case is using ":visual" as a
+command. This will move to a matching line, go to Normal mode to let you
+execute commands there until you use |Q| to return to Ex mode. This will be
+repeated for each matching line. While doing this you cannot use ":global".
+To abort this type CTRL-C twice.
+
+==============================================================================
+3. Complex repeats *complex-repeat*
+
+ *q* *recording*
+q{0-9a-zA-Z"} Record typed characters into register {0-9a-zA-Z"}
+ (uppercase to append). The 'q' command is disabled
+ while executing a register, and it doesn't work inside
+ a mapping and |:normal|.
+
+ Note: If the register being used for recording is also
+ used for |y| and |p| the result is most likely not
+ what is expected, because the put will paste the
+ recorded macro and the yank will overwrite the
+ recorded macro.
+
+ Note: The recording happens while you type, replaying
+ the register happens as if the keys come from a
+ mapping. This matters, for example, for undo, which
+ only syncs when commands were typed.
+
+q Stops recording. (Implementation note: The 'q' that
+ stops recording is not stored in the register, unless
+ it was the result of a mapping)
+
+ *@*
+@{0-9a-z".=*+} Execute the contents of register {0-9a-z".=*+} [count]
+ times. Note that register '%' (name of the current
+ file) and '#' (name of the alternate file) cannot be
+ used.
+ The register is executed like a mapping, that means
+ that the difference between 'wildchar' and 'wildcharm'
+ applies, and undo might not be synced in the same way.
+ For "@=" you are prompted to enter an expression. The
+ result of the expression is then executed.
+ See also |@:|.
+
+ *@@* *E748*
+@@ Repeat the previous @{0-9a-z":*} [count] times.
+
+ *:@*
+:[addr]@{0-9a-z".=*+} Execute the contents of register {0-9a-z".=*+} as an Ex
+ command. First set cursor at line [addr] (default is
+ current line). When the last line in the register does
+ not have a <CR> it will be added automatically when
+ the 'e' flag is present in 'cpoptions'.
+ For ":@=" the last used expression is used. The
+ result of evaluating the expression is executed as an
+ Ex command.
+ Mappings are not recognized in these commands.
+ When the |line-continuation| character (\) is present
+ at the beginning of a line in a linewise register,
+ then it is combined with the previous line. This is
+ useful for yanking and executing parts of a Vim
+ script.
+ Future: Will execute the register for each line in the
+ address range.
+
+:[addr]*{0-9a-z".=+} *:star-compatible*
+ When '*' is present in 'cpoptions' |cpo-star|, use
+ ":*" in the same way as ":@". This is NOT the default
+ when 'nocompatible' is used. When the '*' flag is not
+ present in 'cpoptions', ":*" is an alias for ":'<,'>",
+ select the Visual area |:star|.
+
+ *:@:*
+:[addr]@: Repeat last command-line. First set cursor at line
+ [addr] (default is current line).
+
+:[addr]@ *:@@*
+:[addr]@@ Repeat the previous :@{register}. First set cursor at
+ line [addr] (default is current line).
+
+==============================================================================
+4. Using Vim scripts *using-scripts*
+
+For writing a Vim script, see chapter 41 of the user manual |usr_41.txt|.
+
+ *:so* *:source* *load-vim-script*
+:so[urce] {file} Read Ex commands from {file}. These are commands that
+ start with a ":".
+ Triggers the |SourcePre| autocommand.
+ *:source-range*
+:[range]so[urce] [++clear]
+ Read Ex commands from the [range] of lines in the
+ current buffer. When [range] is omitted read all
+ lines.
+
+ When sourcing commands from the current buffer, the
+ same script-ID |<SID>| is used even if the buffer is
+ sourced multiple times. If a buffer is sourced more
+ than once, then the functions in the buffer are
+ defined again.
+
+ To source a range of lines that doesn't start with the
+ |:vim9script| command in Vim9 script context, the
+ |:vim9cmd| modifier can be used. If you use a Visual
+ selection and type ":", the range in the form "'<,'>"
+ can come before it: >
+ :'<,'>vim9cmd source
+< Otherwise the range goes after the modifier and must
+ have a colon prefixed, like all Vim9 ranges: >
+ :vim9cmd :5,9source
+
+< When a range of lines in a buffer is sourced in the
+ Vim9 script context, the previously defined
+ script-local variables and functions are not cleared.
+ This works like the range started with the
+ ":vim9script noclear" command. The "++clear" argument
+ can be used to clear the script-local variables and
+ functions before sourcing the script. This works like
+ the range started with the `:vim9script` command
+ without the "noclear" argument. See |vim9-reload| for
+ more information.
+ Examples: >
+ :4,5source
+ :10,18source ++clear
+<
+ *:source!*
+:so[urce]! {file} Read Vim commands from {file}. These are commands
+ that are executed from Normal mode, like you type
+ them.
+ When used after |:global|, |:argdo|, |:windo|,
+ |:bufdo|, in a loop or when another command follows
+ the display won't be updated while executing the
+ commands.
+ Cannot be used in the |sandbox|.
+
+ *:ru* *:runtime*
+:ru[ntime][!] [where] {file} ..
+ Read Ex commands from {file} in each directory given
+ by 'runtimepath' and/or 'packpath'. There is no error
+ for non-existing files.
+
+ Example: >
+ :runtime syntax/c.vim
+
+< There can be multiple {file} arguments, separated by
+ spaces. Each {file} is searched for in the first
+ directory from 'runtimepath', then in the second
+ directory, etc. Use a backslash to include a space
+ inside {file} (although it's better not to use spaces
+ in file names, it causes trouble).
+
+ When [!] is included, all found files are sourced.
+ When it is not included only the first found file is
+ sourced.
+
+ When [where] is omitted only 'runtimepath' is used.
+ Other values:
+ START search under "start" in 'packpath'
+ OPT search under "opt" in 'packpath'
+ PACK search under "start" and "opt" in
+ 'packpath'
+ ALL first use 'runtimepath', then search
+ under "start" and "opt" in 'packpath'
+
+ When {file} contains wildcards it is expanded to all
+ matching files. Example: >
+ :runtime! plugin/**/*.vim
+< This is what Vim uses to load the plugin files when
+ starting up. This similar command: >
+ :runtime plugin/**/*.vim
+< would source the first file only.
+
+ When 'verbose' is one or higher, there is a message
+ when no file could be found.
+ When 'verbose' is two or higher, there is a message
+ about each searched file.
+
+ *:pa* *:packadd* *E919*
+:pa[ckadd][!] {name} Search for an optional plugin directory in 'packpath'
+ and source any plugin files found. The directory must
+ match:
+ 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
+ pack/*/opt/{name}/plugin/**/*.vim ~
+ will be sourced. This allows for using subdirectories
+ below "plugin", just like with plugins in
+ 'runtimepath'.
+
+ If the filetype detection was not enabled yet (this
+ is usually done with a "syntax enable" or "filetype
+ on" command in your .vimrc file), this will also look
+ for "{name}/ftdetect/*.vim" files.
+
+ When the optional ! is added no plugin files or
+ ftdetect scripts are loaded, only the matching
+ directories are added to 'runtimepath'. This is
+ useful in your .vimrc. The plugins will then be
+ loaded during initialization, see |load-plugins| (note
+ that the loading order will be reversed, because each
+ directory is inserted before others).
+ Note that for ftdetect scripts to be loaded
+ you will need to write `filetype plugin indent on`
+ AFTER all `packadd!` commands.
+
+ Also see |pack-add|.
+ {only available when compiled with |+eval|}
+
+ *:packl* *:packloadall*
+:packl[oadall][!] Load all packages in the "start" directory under each
+ entry in 'packpath'.
+
+ First all the directories found are added to
+ 'runtimepath', then the plugins found in the
+ directories are sourced. This allows for a plugin to
+ depend on something of another plugin, e.g. an
+ "autoload" directory. See |packload-two-steps| for
+ how this can be useful.
+
+ This is normally done automatically during startup,
+ after loading your .vimrc file. With this command it
+ can be done earlier.
+
+ Packages will be loaded only once. Using
+ `:packloadall` a second time will have no effect.
+ When the optional ! is added this command will load
+ packages even when done before.
+
+ Note that when using `:packloadall` in the |vimrc|
+ file, the 'runtimepath' option is updated, and later
+ all plugins in 'runtimepath' will be loaded, which
+ means they are loaded again. Plugins are expected to
+ handle that.
+
+ An error only causes sourcing the script where it
+ happens to be aborted, further plugins will be loaded.
+ See |packages|.
+ {only available when compiled with |+eval|}
+
+:scripte[ncoding] [encoding] *:scripte* *:scriptencoding* *E167*
+ Specify the character encoding used in the script.
+ The following lines will be converted from [encoding]
+ to the value of the 'encoding' option, if they are
+ different. Examples: >
+ scriptencoding iso-8859-5
+ scriptencoding cp932
+<
+ When [encoding] is empty, no conversion is done. This
+ can be used to restrict conversion to a sequence of
+ lines: >
+ scriptencoding euc-jp
+ ... lines to be converted ...
+ scriptencoding
+ ... not converted ...
+
+< When conversion isn't supported by the system, there
+ 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).
+ When a sourced script starts with a BOM (Byte Order
+ Mark) in utf-8 format Vim will recognize it, no need
+ to use ":scriptencoding utf-8" then.
+
+ If you set the 'encoding' option in your |.vimrc|,
+ `:scriptencoding` must be placed after that. E.g.: >
+ set encoding=utf-8
+ scriptencoding utf-8
+<
+
+:scriptv[ersion] {version} *:scriptv* *:scriptversion*
+ *E999* *E984* *E1040*
+ Specify the version of Vim for the lines that follow
+ in the same file. Only applies at the toplevel of
+ sourced scripts, not inside functions.
+
+ If {version} is higher than what the current Vim
+ version supports E999 will be given. You either need
+ to rewrite the script to make it work with an older
+ Vim version, or update Vim to a newer version. See
+ |vimscript-version| for what changed between versions.
+
+:vim9s[cript] [noclear] *:vim9s* *:vim9script*
+ Marks a script file as containing |Vim9-script|
+ commands. Also see |vim9-namespace|. *E1038*
+ Must be the first command in the file. *E1039*
+ For [noclear] see |vim9-reload|.
+ Without the |+eval| feature this changes the syntax
+ for some commands.
+ See |:vim9cmd| for executing one command with Vim9
+ syntax and semantics.
+
+ *:scr* *:scriptnames*
+:scr[iptnames] List all sourced script names, in the order they were
+ first encountered. The number is used for the script
+ ID |<SID>|.
+ For a script that was used with `import autoload` but
+ was not actually sourced yet an "A" is shown after the
+ script ID.
+ For a script that was referred to by one name but
+ after resolving symbolic links got sourced with
+ another name the other script is after "->". E.g.
+ "20->22" means script 20 was sourced as script 22.
+ Also see `getscriptinfo()`.
+ {not available when compiled without the |+eval|
+ feature}
+
+:scr[iptnames][!] {scriptId} *:script*
+ Edit script {scriptId}. Although ":scriptnames name"
+ works, using ":script name" is recommended.
+ When the current buffer can't be |abandon|ed and the !
+ is not present, the command fails.
+
+ *: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
+ the file. If it is used after a |:try| but before the
+ matching |:finally| (if present), the commands
+ following the ":finally" up to the matching |:endtry|
+ are executed first. This process applies to all
+ nested ":try"s in the script. The outermost ":endtry"
+ then stops sourcing the script.
+
+All commands and command sequences can be repeated by putting them in a named
+register and then executing it. There are two ways to get the commands in the
+register:
+- Use the record command "q". You type the commands once, and while they are
+ being executed they are stored in a register. Easy, because you can see
+ what you are doing. If you make a mistake, "p"ut the register into the
+ file, edit the command sequence, and then delete it into the register
+ again. You can continue recording by appending to the register (use an
+ uppercase letter).
+- Delete or yank the command sequence into the register.
+
+Often used command sequences can be put under a function key with the ':map'
+command.
+
+An alternative is to put the commands in a file, and execute them with the
+':source!' command. Useful for long command sequences. Can be combined with
+the ':map' command to put complicated commands under a function key.
+
+The ':source' command reads Ex commands from a file or a buffer line by line.
+You will have to type any needed keyboard input. The ':source!' command reads
+from a script file character by character, interpreting each character as if
+you typed it.
+
+Example: When you give the ":!ls" command you get the |hit-enter| prompt. If
+you ':source' a file with the line "!ls" in it, you will have to type the
+<Enter> yourself. But if you ':source!' a file with the line ":!ls" in it,
+the next characters from that file are read until a <CR> is found. You will
+not have to type <CR> yourself, unless ":!ls" was the last line in the file.
+
+It is possible to put ':source[!]' commands in the script file, so you can
+make a top-down hierarchy of script files. The ':source' command can be
+nested as deep as the number of files that can be opened at one time (about
+15). The ':source!' command can be nested up to 15 levels deep.
+
+You can use the "<sfile>" string (literally, this is not a special key) inside
+of the sourced file, in places where a file name is expected. It will be
+replaced by the file name of the sourced file. For example, if you have a
+"other.vimrc" file in the same directory as your ".vimrc" file, you can source
+it from your ".vimrc" file with this command: >
+ :source <sfile>:h/other.vimrc
+
+In script files terminal-dependent key codes are represented by
+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.
+
+ *:source_crnl* *W15*
+Win32: Files that are read with ":source" normally have <CR><NL> <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>. This fails if the first line has
+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 MS-Windows), all lines will have a trailing <CR>. This may cause
+problems for some commands (e.g., mappings). There is no automatic <EOL>
+detection, because it's common to start with a line that defines a mapping
+that ends in a <CR>, which will confuse the automaton.
+
+ *line-continuation*
+Long lines in a ":source"d Ex command script file can be split by inserting
+a line continuation symbol "\" (backslash) at the start of the next line.
+There can be white space before the backslash, which is ignored.
+
+Example: the lines >
+ :set comments=sr:/*,mb:*,el:*/,
+ \://,
+ \b:#,
+ \:%,
+ \n:>,
+ \fb:-
+are interpreted as if they were given in one line:
+ :set comments=sr:/*,mb:*,el:*/,://,b:#,:%,n:>,fb:-
+
+All leading whitespace characters in the line before a backslash are ignored.
+Note however that trailing whitespace in the line before it cannot be
+inserted freely; it depends on the position where a command is split up
+whether additional whitespace is allowed or not.
+
+When a space is required it's best to put it right after the backslash. A
+space at the end of a line is hard to see and may be accidentally deleted. >
+ :syn match Comment
+ \ "very long regexp"
+ \ keepend
+
+In |Vim9| script the backslash can often be omitted, but not always.
+See |vim9-line-continuation|.
+
+There is a problem with the ":append" and ":insert" commands: >
+ :1append
+ \asdf
+ .
+The backslash is seen as a line-continuation symbol, thus this results in the
+command: >
+ :1appendasdf
+ .
+To avoid this, add the 'C' flag to the 'cpoptions' option: >
+ :set cpo+=C
+ :1append
+ \asdf
+ .
+ :set cpo-=C
+
+Note that when the commands are inside a function, you need to add the 'C'
+flag when defining the function, it is not relevant when executing it. >
+ :set cpo+=C
+ :function Foo()
+ :1append
+ \asdf
+ .
+ :endfunction
+ :set cpo-=C
+<
+ *line-continuation-comment*
+To add a comment in between the lines start with '"\ '. Notice the space
+after the backslash. Example: >
+ let array = [
+ "\ first entry comment
+ \ 'first',
+ "\ second entry comment
+ \ 'second',
+ \ ]
+
+Rationale:
+ Most programs work with a trailing backslash to indicate line
+ continuation. Using this in Vim would cause incompatibility with Vi.
+ For example for this Vi mapping: >
+ :map xx asdf\
+< Therefore the unusual leading backslash is used.
+
+ Starting a comment in a continuation line results in all following
+ continuation lines to be part of the comment. Since it was like this
+ for a long time, when making it possible to add a comment halfway a
+ sequence of continuation lines, it was not possible to use \", since
+ that was a valid continuation line. Using '"\ ' comes closest, even
+ though it may look a bit weird. Requiring the space after the
+ backslash is to make it very unlikely this is a normal comment line.
+
+==============================================================================
+5. Using Vim packages *packages*
+
+A Vim package is a directory that contains one or more plugins. The
+advantages over normal plugins:
+- A package can be downloaded as an archive and unpacked in its own directory.
+ Thus the files are not mixed with files of other plugins. That makes it
+ easy to update and remove.
+- A package can be a git, mercurial, etc. repository. That makes it really
+ easy to update.
+- A package can contain multiple plugins that depend on each other.
+- A package can contain plugins that are automatically loaded on startup and
+ ones that are only loaded when needed with `:packadd`.
+
+
+Using a package and loading automatically ~
+
+Let's assume your Vim files are in the "~/.vim" directory and you want to add a
+package from a zip archive "/tmp/foopack.zip":
+ % mkdir -p ~/.vim/pack/foo
+ % cd ~/.vim/pack/foo
+ % unzip /tmp/foopack.zip
+
+The directory name "foo" is arbitrary, you can pick anything you like.
+
+You would now have these files under ~/.vim:
+ pack/foo/README.txt
+ pack/foo/start/foobar/plugin/foo.vim
+ pack/foo/start/foobar/syntax/some.vim
+ pack/foo/opt/foodebug/plugin/debugger.vim
+
+When Vim starts up, after processing your .vimrc, it scans all directories in
+'packpath' for plugins under the "pack/*/start" directory. First all those
+directories are added to 'runtimepath'. Then all the plugins are loaded.
+See |packload-two-steps| for how these two steps can be useful.
+
+To allow for calling into package functionality while parsing your .vimrc,
+|:colorscheme| and |autoload| will both automatically search under 'packpath'
+as well in addition to 'runtimepath'. See the documentation for each for
+details.
+
+In the example Vim will find "pack/foo/start/foobar/plugin/foo.vim" and adds
+"~/.vim/pack/foo/start/foobar" to 'runtimepath'.
+
+If the "foobar" plugin kicks in and sets the 'filetype' to "some", Vim will
+find the syntax/some.vim file, because its directory is in 'runtimepath'.
+
+Vim will also load ftdetect files, if there are any.
+
+Note that the files under "pack/foo/opt" are not loaded automatically, only the
+ones under "pack/foo/start". See |pack-add| below for how the "opt" directory
+is used.
+
+Loading packages automatically will not happen if loading plugins is disabled,
+see |load-plugins|.
+
+To load packages earlier, so that 'runtimepath' gets updated: >
+ :packloadall
+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 ~
+
+If you don't have a package but a single plugin, you need to create the extra
+directory level:
+ % mkdir -p ~/.vim/pack/foo/start/foobar
+ % cd ~/.vim/pack/foo/start/foobar
+ % unzip /tmp/someplugin.zip
+
+You would now have these files:
+ pack/foo/start/foobar/plugin/foo.vim
+ pack/foo/start/foobar/syntax/some.vim
+
+From here it works like above.
+
+
+Optional plugins ~
+ *pack-add*
+To load an optional plugin from a pack use the `:packadd` command: >
+ :packadd foodebug
+This searches for "pack/*/opt/foodebug" in 'packpath' and will find
+~/.vim/pack/foo/opt/foodebug/plugin/debugger.vim and source it.
+
+This could be done if some conditions are met. For example, depending on
+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 if Vim was started with
+|--noplugin|.
+
+It is perfectly normal for a package to only have files in the "opt"
+directory. You then need to load each plugin when you want to use it.
+
+
+Where to put what ~
+
+Since color schemes, loaded with `:colorscheme`, are found below
+"pack/*/start" and "pack/*/opt", you could put them anywhere. We recommend
+you put them below "pack/*/opt", for example
+".vim/pack/mycolors/opt/dark/colors/very_dark.vim".
+
+Filetype plugins should go under "pack/*/start", so that they are always
+found. Unless you have more than one plugin for a file type and want to
+select which one to load with `:packadd`. E.g. depending on the compiler
+version: >
+ if foo_compiler_version > 34
+ packadd foo_new
+ else
+ packadd foo_old
+ endif
+
+The "after" directory is most likely not useful in a package. It's not
+disallowed though.
+
+==============================================================================
+6. Creating Vim packages *package-create*
+
+This assumes you write one or more plugins that you distribute as a package.
+
+If you have two unrelated plugins you would use two packages, so that Vim
+users can choose what they include or not. Or you can decide to use one
+package with optional plugins, and tell the user to add the preferred ones with
+`:packadd`.
+
+Decide how you want to distribute the package. You can create an archive or
+you could use a repository. An archive can be used by more users, but is a
+bit harder to update to a new version. A repository can usually be kept
+up-to-date easily, but it requires a program like "git" to be available.
+You can do both, github can automatically create an archive for a release.
+
+Your directory layout would be like this:
+ start/foobar/plugin/foo.vim " always loaded, defines commands
+ start/foobar/plugin/bar.vim " always loaded, defines commands
+ start/foobar/autoload/foo.vim " loaded when foo command used
+ start/foobar/doc/foo.txt " help for foo.vim
+ start/foobar/doc/tags " help tags
+ opt/fooextra/plugin/extra.vim " optional plugin, defines commands
+ opt/fooextra/autoload/extra.vim " loaded when extra command used
+ opt/fooextra/doc/extra.txt " help for extra.vim
+ opt/fooextra/doc/tags " help tags
+
+This allows for the user to do: >
+ mkdir ~/.vim/pack
+ cd ~/.vim/pack
+ git clone https://github.com/you/foobar.git myfoobar
+
+Here "myfoobar" is a name that the user can choose, the only condition is that
+it differs from other packages.
+
+In your documentation you explain what the plugins do, and tell the user how
+to load the optional plugin: >
+ :packadd! fooextra
+
+You could add this packadd command in one of your plugins, to be executed when
+the optional plugin is needed.
+
+Run the `:helptags` command to generate the doc/tags file. Including this
+generated file in the package means that the user can drop the package in the
+pack directory and the help command works right away. Don't forget to re-run
+the command after changing the plugin help: >
+ :helptags path/start/foobar/doc
+ :helptags path/opt/fooextra/doc
+
+
+Dependencies between plugins ~
+ *packload-two-steps*
+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:
+
+ pack/foo/start/one/plugin/one.vim >
+ call foolib#getit()
+< pack/foo/start/two/plugin/two.vim >
+ call foolib#getit()
+< pack/foo/start/lib/autoload/foolib.vim >
+ func foolib#getit()
+
+This works, because loading packages will first add all found directories to
+'runtimepath' before sourcing the plugins.
+
+==============================================================================
+7. Debugging scripts *debug-scripts*
+
+Besides the obvious messages that you can add to your scripts to find out what
+they are doing, Vim offers a debug mode. This allows you to step through a
+sourced file or user function and set breakpoints.
+
+NOTE: The debugging mode is far from perfect. Debugging will have side
+effects on how Vim works. You cannot use it to debug everything. For
+example, the display is messed up by the debugging messages.
+
+An alternative to debug mode is setting the 'verbose' option. With a bigger
+number it will give more verbose messages about what Vim is doing.
+
+
+STARTING DEBUG MODE *debug-mode*
+
+To enter debugging mode use one of these methods:
+1. Start Vim with the |-D| argument: >
+ vim -D file.txt
+< Debugging will start as soon as the first vimrc file is sourced. This is
+ useful to find out what is happening when Vim is starting up. A side
+ effect is that Vim will switch the terminal mode before initialisations
+ have finished, with unpredictable results.
+ For a GUI-only version (Windows, Macintosh) the debugging will start as
+ soon as the GUI window has been opened. To make this happen early, add a
+ ":gui" command in the vimrc file.
+ *:debug*
+2. Run a command with ":debug" prepended. Debugging will only be done while
+ this command executes. Useful for debugging a specific script or user
+ function. And for scripts and functions used by autocommands. Example: >
+ :debug edit test.txt.gz
+
+3. Set a breakpoint in a sourced file or user function. You could do this in
+ the command line: >
+ vim -c "breakadd file */explorer.vim" .
+< This will run Vim and stop in the first line of the "explorer.vim" script.
+ Breakpoints can also be set while in debugging mode.
+
+In debugging mode every executed command is displayed before it is executed.
+Comment lines, empty lines and lines that are not executed are skipped. When
+a line contains two commands, separated by "|", each command will be displayed
+separately.
+
+
+DEBUG MODE
+
+Once in debugging mode, the usual Ex commands can be used. For example, to
+inspect the value of a variable: >
+ echo idx
+When inside a user function, this will print the value of the local variable
+"idx". Prepend "g:" to get the value of a global variable: >
+ echo g:idx
+All commands are executed in the context of the current function or script.
+You can also set options, for example setting or resetting 'verbose' will show
+what happens, but you might want to set it just before executing the lines you
+are interested in: >
+ :set verbose=20
+
+Commands that require updating the screen should be avoided, because their
+effect won't be noticed until after leaving debug mode. For example: >
+ :help
+won't be very helpful.
+
+There is a separate command-line history for debug mode.
+
+NOTE: In Vim9 script, if a command is written at the script level and
+continues on the next line, not using the old way with a backslash for line
+continuation, only the first line is printed before the debugging prompt.
+
+The line number for a function line is relative to the start of the function.
+If you have trouble figuring out where you are, edit the file that defines
+the function in another Vim, search for the start of the function and do
+"99j". Replace "99" with the line number.
+
+Additionally, these commands can be used:
+ *>cont*
+ cont Continue execution until the next breakpoint is hit.
+ *>quit*
+ quit Abort execution. This is like using CTRL-C, some
+ things might still be executed, doesn't abort
+ everything. Still stops at the next breakpoint.
+ *>next*
+ next Execute the command and come back to debug mode when
+ it's finished. This steps over user function calls
+ and sourced files.
+ *>step*
+ step Execute the command and come back to debug mode for
+ the next command. This steps into called user
+ functions and sourced files.
+ *>interrupt*
+ interrupt This is like using CTRL-C, but unlike ">quit" comes
+ back to debug mode for the next command that is
+ executed. Useful for testing |:finally| and |:catch|
+ on interrupt exceptions.
+ *>finish*
+ finish Finish the current script or user function and come
+ back to debug mode for the command after the one that
+ sourced or called it.
+ *>bt*
+ *>backtrace*
+ *>where*
+ backtrace Show the call stacktrace for current debugging session.
+ bt
+ where
+ *>frame*
+ frame N Goes to N backtrace level. + and - signs make movement
+ relative. E.g., ":frame +3" goes three frames up.
+ *>up*
+ up Goes one level up from call stacktrace.
+ *>down*
+ down Goes one level down from call stacktrace.
+
+About the additional commands in debug mode:
+- There is no command-line completion for them, you get the completion for the
+ normal Ex commands only.
+- You can shorten them, up to a single character, unless more than one command
+ starts with the same letter. "f" stands for "finish", use "fr" for "frame".
+- Hitting <CR> will repeat the previous one. When doing another command, this
+ is reset (because it's not clear what you want to repeat).
+- When you want to use the Ex command with the same name, prepend a colon:
+ ":cont", ":next", ":finish" (or shorter).
+ *vim9-debug*
+When debugging a compiled :def function, "step" will stop before every
+executed line, not every single instruction. Thus it works mostly like a not
+compiled function. Access to local variables is limited you can use: >
+ echo varname
+But not much else.
+When executing a command that is not a specific bytecode instruction but
+executed like a normal Ex command, "step" will stop once in the compiled
+context, where local variables can be inspected, and once just before
+executing the command.
+
+In a :def function variables that haven't been declared yet cannot be
+inspected. Variables that have been declared can be inspected, also when the
+block they were declared in has finished. In commands this would not be
+possible, thus is slightly misleading (but can be useful).
+
+The backtrace shows the hierarchy of function calls, e.g.:
+ >bt ~
+ 3 function One[3] ~
+ 2 Two[3] ~
+ ->1 Three[3] ~
+ 0 Four ~
+ line 1: let four = 4 ~
+
+The "->" points to the current frame. Use "up", "down" and "frame N" to
+select another frame.
+
+In the current frame you can evaluate the local function variables. There is
+no way to see the command at the current line yet.
+
+
+DEFINING BREAKPOINTS
+ *:breaka* *:breakadd*
+:breaka[dd] func [lnum] {name}
+ Set a breakpoint in a function. Example: >
+ :breakadd func Explore
+< Doesn't check for a valid function name, thus the breakpoint
+ can be set before the function is defined.
+
+:breaka[dd] file [lnum] {name}
+ Set a breakpoint in a sourced file. Example: >
+ :breakadd file 43 .vimrc
+
+:breaka[dd] here
+ Set a breakpoint in the current line of the current file.
+ Like doing: >
+ :breakadd file <cursor-line> <current-file>
+< Note that this only works for commands that are executed when
+ sourcing the file, not for a function defined in that file.
+
+:breaka[dd] expr {expression}
+ Sets a breakpoint, that will break whenever the {expression}
+ evaluates to a different value. Example: >
+ :breakadd expr g:lnum
+< Will break, whenever the global variable lnum changes.
+
+ Errors in evaluation are suppressed, you can use the name of a
+ variable that does not exist yet. This also means you will
+ not notice anything if the expression has a mistake.
+
+ Note if you watch a |script-variable| this will break
+ when switching scripts, since the script variable is only
+ valid in the script where it has been defined and if that
+ script is called from several other scripts, this will stop
+ whenever that particular variable will become visible or
+ inaccessible again.
+
+The [lnum] is the line number of the breakpoint. Vim will stop at or after
+this line. When omitted line 1 is used.
+
+ *:debug-name*
+{name} is a pattern that is matched with the file or function name. The
+pattern is like what is used for autocommands. There must be a full match (as
+if the pattern starts with "^" and ends in "$"). A "*" matches any sequence
+of characters. 'ignorecase' is not used, but "\c" can be used in the pattern
+to ignore case |/\c|. Don't include the () for the function name!
+
+The match for sourced scripts is done against the full file name. If no path
+is specified the current directory is used. Examples: >
+ breakadd file explorer.vim
+matches "explorer.vim" in the current directory. >
+ breakadd file *explorer.vim
+matches ".../plugin/explorer.vim", ".../plugin/iexplorer.vim", etc. >
+ breakadd file */explorer.vim
+matches ".../plugin/explorer.vim" and "explorer.vim" in any other directory.
+
+The match for functions is done against the name as it's shown in the output
+of ":function". However, for local functions the script-specific prefix such
+as "<SNR>99_" is ignored to make it easier to match script-local functions
+without knowing the ID of the script.
+
+Note that functions are first loaded and later executed. When they are loaded
+the "file" breakpoints are checked, when they are executed the "func"
+breakpoints.
+
+
+DELETING BREAKPOINTS
+ *:breakd* *:breakdel* *E161*
+:breakd[el] {nr}
+ Delete breakpoint {nr}. Use |:breaklist| to see the number of
+ each breakpoint.
+
+:breakd[el] *
+ Delete all breakpoints.
+
+:breakd[el] func [lnum] {name}
+ Delete a breakpoint in a function.
+
+:breakd[el] file [lnum] {name}
+ Delete a breakpoint in a sourced file.
+
+:breakd[el] here
+ Delete a breakpoint at the current line of the current file.
+
+When [lnum] is omitted, the first breakpoint in the function or file is
+deleted.
+The {name} must be exactly the same as what was typed for the ":breakadd"
+command. "explorer", "*explorer.vim" and "*explorer*" are different.
+
+
+LISTING BREAKPOINTS
+ *:breakl* *:breaklist*
+:breakl[ist]
+ List all breakpoints.
+
+
+OBSCURE
+
+ *:debugg* *:debuggreedy*
+:debugg[reedy]
+ Read debug mode commands from the normal input stream, instead
+ of getting them directly from the user. Only useful for test
+ scripts. Example: >
+ echo 'q^Mq' | vim -e -s -c debuggreedy -c 'breakadd file script.vim' -S script.vim
+
+:0debugg[reedy]
+ Undo ":debuggreedy": get debug mode commands directly from the
+ user, don't use typeahead for debug commands.
+
+==============================================================================
+8. Profiling *profile* *profiling*
+
+Profiling means that Vim measures the time that is spent on executing
+functions and/or scripts. The |+profile| feature is required for this.
+It is included when Vim was compiled with "huge" features.
+
+You can also use the |reltime()| function to measure time. This only requires
+the |+reltime| feature, which is present in more builds.
+
+For profiling syntax highlighting see |:syntime|.
+
+For example, to profile the one_script.vim script file: >
+ :profile start /tmp/one_script_profile
+ :profile file one_script.vim
+ :source one_script.vim
+ :exit
+
+
+:prof[ile] start {fname} *:prof* *:profile* *E750*
+ Start profiling, write the output in {fname} upon exit or when
+ a `:profile stop` or `:profile dump` command is invoked.
+ "~/" and environment variables in {fname} will be expanded.
+ If {fname} already exists it will be silently overwritten.
+ The variable |v:profiling| is set to one.
+
+:prof[ile] stop
+ Write the collected profiling information to the logfile and
+ stop profiling. You can use the `:profile start` command to
+ clear the profiling statistics and start profiling again.
+
+:prof[ile] pause
+ Don't profile until the following `:profile continue`. Can be
+ used when doing something that should not be counted (e.g., an
+ external command). Does not nest.
+
+:prof[ile] continue
+ Continue profiling after `:profile pause`.
+
+:prof[ile] func {pattern}
+ Profile function that matches the pattern {pattern}.
+ See |:debug-name| for how {pattern} is used.
+
+:prof[ile][!] file {pattern}
+ Profile script file that matches the pattern {pattern}.
+ See |:debug-name| for how {pattern} is used.
+ This only profiles the script itself, not the functions
+ defined in it.
+ When the [!] is added then all functions defined in the script
+ will also be profiled.
+ Note that profiling only starts when the script is loaded
+ after this command. A :profile command in the script itself
+ won't work.
+
+:prof[ile] dump
+ Write the current state of profiling to the logfile
+ immediately. After running this command, Vim continues to
+ collect the profiling statistics.
+
+:profd[el] ... *:profd* *:profdel*
+ Stop profiling for the arguments specified. See |:breakdel|
+ for the arguments. Examples: >
+ profdel func MyFunc
+ profdel file MyScript.vim
+ profdel here
+
+You must always start with a ":profile start fname" command. The resulting
+file is written when Vim exits. For example, to profile one specific
+function: >
+ profile start /tmp/vimprofile
+ profile func MyFunc
+
+Here is an example of the output, with line
+numbers prepended for the explanation:
+
+ 1 FUNCTION Test2() ~
+ 2 Called 1 time ~
+ 3 Total time: 0.155251 ~
+ 4 Self time: 0.002006 ~
+ 5 ~
+ 6 count total (s) self (s) ~
+ 7 9 0.000096 for i in range(8) ~
+ 8 8 0.153655 0.000410 call Test3() ~
+ 9 8 0.000070 endfor ~
+ 10 " Ask a question ~
+ 11 1 0.001341 echo input("give me an answer: ") ~
+
+The header (lines 1-4) gives the time for the whole function. The "Total"
+time is the time passed while the function was executing. The "Self" time is
+the "Total" time reduced by time spent in:
+- other user defined functions
+- sourced scripts
+- executed autocommands
+- external (shell) commands
+
+Lines 7-11 show the time spent in each executed line. Lines that are not
+executed do not count. Thus a comment line is never counted.
+
+The Count column shows how many times a line was executed. Note that the
+"for" command in line 7 is executed one more time as the following lines.
+That is because the line is also executed to detect the end of the loop.
+
+The time Vim spends waiting for user input isn't counted at all. Thus how
+long you take to respond to the input() prompt is irrelevant.
+
+Profiling should give a good indication of where time is spent, but keep in
+mind there are various things that may clobber the results:
+
+- The accuracy of the time measured depends on the gettimeofday() system
+ function. It may only be as accurate as 1/100 second, even though the times
+ are displayed in micro seconds.
+
+- Real elapsed time is measured, if other processes are busy they may cause
+ delays at unpredictable moments. You may want to run the profiling several
+ times and use the lowest results.
+
+- If you have several commands in one line you only get one time. Split the
+ line to see the time for the individual commands.
+
+- The time of the lines added up is mostly less than the time of the whole
+ function. There is some overhead in between.
+
+- Functions that are deleted before Vim exits will not produce profiling
+ information. You can check the |v:profiling| variable if needed: >
+ :if !v:profiling
+ : delfunc MyFunc
+ :endif
+<
+- Profiling may give weird results on multi-processor systems, when sleep
+ mode kicks in or the processor frequency is reduced to save power.
+
+- The "self" time is wrong when a function is used recursively.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/rileft.txt b/runtime/doc/rileft.txt
new file mode 100644
index 0000000..623ac38
--- /dev/null
+++ b/runtime/doc/rileft.txt
@@ -0,0 +1,124 @@
+*rileft.txt* For Vim version 9.0. Last change: 2022 Oct 12
+
+
+ VIM REFERENCE MANUAL by Avner Lottem
+ updated by Nadim Shaikli
+
+
+Right to Left display mode for Vim *rileft*
+
+
+These functions were originally created by Avner Lottem:
+ E-mail: alottem@iil.intel.com
+ Phone: +972-4-8307322
+
+ *E26*
+{only available when compiled with the |+rightleft| feature}
+
+
+Introduction
+------------
+Some languages such as Arabic, Farsi, Hebrew (among others) require the
+ability to display their text from right-to-left. Files in those languages
+are stored conventionally and the right-to-left requirement is only a
+function of the display engine (per the Unicode specification). In
+right-to-left oriented files the characters appear on the screen from
+right to left.
+
+Bidirectionality (or bidi for short) is what Unicode offers as a full
+solution to these languages. Bidi offers the user the ability to view
+both right-to-left as well as left-to-right text properly at the same time
+within the same window. Vim currently, due to simplicity, does not offer
+bidi and is merely opting to present a functional means to display/enter/use
+right-to-left languages. An older hybrid solution in which direction is
+encoded for every character (or group of characters) are not supported either
+as this kind of support is out of the scope of a simple addition to an
+existing editor (and it's not sanctioned by Unicode either).
+
+As many people working on the code do not use the right-to-left mode, this
+feature may not work in some situations. If you can describe what is wrong
+and how it would work when fixed, please create an issue on github, see
+|bug-reports|.
+
+
+Highlights
+----------
+o Editing left-to-right files as in the original Vim, no change.
+
+o Viewing and editing files in right-to-left windows. File orientation
+ is per window, so it is possible to view the same file in right-to-left
+ and left-to-right modes, simultaneously. (Useful for editing mixed files
+ in which both right-to-left and left-to-right text exist).
+
+o Compatibility to the original Vim. Almost all features work in
+ right-to-left mode (see Bugs below).
+
+o Backing from reverse insert mode to the correct place in the file
+ (if possible).
+
+o No special terminal with right-to-left capabilities is required. The
+ right-to-left changes are completely hardware independent.
+
+o Many languages use and require right-to-left support. These languages
+ can quite easily be supported given the inclusion of their required
+ keyboard mappings and some possible minor code change. Some of the
+ current supported languages include - |arabic.txt|, |farsi.txt| and
+ |hebrew.txt|.
+
+
+Of Interest...
+--------------
+
+o Invocations
+ -----------
+ + 'rightleft' ('rl') sets window orientation to right-to-left.
+ + 'delcombine' ('deco'), boolean, if editing UTF-8 encoded languages,
+ allows one to remove a composing character which gets superimposed
+ on those that preceded them (some languages require this).
+ + 'rightleftcmd' ('rlc') sets the command-line within certain modes
+ (such as search) to be utilized in right-to-left orientation as well.
+
+o Typing backwards *ins-reverse*
+ ----------------
+ In lieu of using the full-fledged 'rightleft' option, one can opt for
+ reverse insertion. When the 'revins' (reverse insert) option is set,
+ inserting happens backwards. This can be used to type right-to-left
+ text. When inserting characters the cursor is not moved and the text
+ moves rightwards. A <BS> deletes the character under the cursor.
+ CTRL-W and CTRL-U also work in the opposite direction. <BS>, CTRL-W
+ and CTRL-U do not stop at the start of insert or end of line, no matter
+ how the 'backspace' option is set.
+
+ There is no reverse replace mode (yet).
+
+ If the 'showmode' option is set, "-- REVERSE INSERT --" will be shown
+ in the status line when reverse Insert mode is active.
+
+o Pasting when in a rightleft window
+ ----------------------------------
+ When cutting text with the mouse and pasting it in a rightleft window
+ the text will be reversed, because the characters come from the cut buffer
+ from the left to the right, while inserted in the file from the right to
+ the left. In order to avoid it, toggle 'revins' before pasting.
+
+
+Bugs
+----
+o Does not handle CTRL-A and CTRL-X commands (add and subtract) correctly
+ when in rightleft window.
+
+o Does not support reverse insert and rightleft modes on the command-line.
+ However, functionality of the editor is not reduced, because it is
+ possible to enter mappings, abbreviations and searches typed from the
+ left to the right on the command-line.
+
+o Somewhat slower in right-to-left mode, because right-to-left motion is
+ emulated inside Vim, not by the controlling terminal.
+
+o When both 'rightleft' and 'revins' are on: 'textwidth' does not work.
+ Lines do not wrap at all; you just get a single, long line.
+
+o There is no full bidirectionality (bidi) support.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/russian.txt b/runtime/doc/russian.txt
new file mode 100644
index 0000000..4e8c5ed
--- /dev/null
+++ b/runtime/doc/russian.txt
@@ -0,0 +1,73 @@
+*russian.txt* For Vim version 9.0. Last change: 2006 Apr 24
+
+
+ VIM REFERENCE MANUAL by Vassily Ragosin
+
+
+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|
+
+===============================================================================
+1. Introduction *russian-intro*
+
+Russian language is supported perfectly well in Vim. You can type and view
+Russian text just as any other, without the need to tweak the settings.
+
+===============================================================================
+2. Russian keymaps *russian-keymap*
+
+To switch between languages you can use your system native keyboard switcher,
+or use one of the Russian keymaps, included in the Vim distribution. For
+example,
+>
+ :set keymap=russian-jcukenwin
+<
+In the latter case, you can switch between languages even if you do not have
+system Russian keyboard or independently from a system-wide keyboard settings.
+See 'keymap'. You can also map a key to switch between keyboards, if you
+choose the latter option. See |:map|.
+
+For your convenience, to avoid switching between keyboards, when you need to
+enter Normal mode command, you can also set 'langmap' option:
+>
+ :set langmap=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯ;ABCDEFGHIJKLMNOPQRSTUVWXYZ,
+ фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz
+
+This is in utf-8, you cannot read this if your 'encoding' is not utf-8.
+You have to type this command in one line, it is wrapped for the sake of
+readability.
+
+===============================================================================
+3. Localization *russian-l18n*
+
+If you wish to use messages, help files, menus and other items translated to
+Russian, you will need to install the RuVim Language Pack, available in
+different codepages from
+
+ http://www.sourceforge.net/projects/ruvim/
+
+Make sure that your Vim is at least 6.2.506 and use ruvim 0.5 or later for
+automatic installs. Vim also needs to be compiled with |+gettext| feature for
+user interface items translations to work.
+
+After downloading an archive from RuVim project, unpack it into your
+$VIMRUNTIME directory. We recommend using UTF-8 archive.
+
+In order to use the Russian documentation, make sure you have set the
+'helplang' option to "ru".
+
+===============================================================================
+4. Known issues *russian-issues*
+
+-- If you are using Russian message translations in Win32 console, then
+ you may see the output produced by "vim --help", "vim --version" commands
+ and Win32 console window title appearing in a wrong codepage. This problem
+ is related to a bug in GNU gettext library and may be fixed in the future
+ releases of gettext.
+
+===============================================================================
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/scroll.txt b/runtime/doc/scroll.txt
new file mode 100644
index 0000000..8e57be4
--- /dev/null
+++ b/runtime/doc/scroll.txt
@@ -0,0 +1,338 @@
+*scroll.txt* For Vim version 9.0. Last change: 2022 Oct 17
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Scrolling *scrolling*
+
+These commands move the contents of the window. If the cursor position is
+moved off of the window, the cursor is moved onto the window (with
+'scrolloff' screen lines around it). A page is the number of lines in the
+window minus two. The mnemonics for these commands may be a bit confusing.
+Remember that the commands refer to moving the window (the part of the buffer
+that you see) upwards or downwards in the buffer. When the window moves
+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|
+
+==============================================================================
+1. Scrolling downwards *scroll-down*
+
+The following commands move the edit window (the part of the buffer that you
+see) downwards (this means that more lines downwards in the text buffer can be
+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*
+CTRL-D Scroll window Downwards in the buffer. The number of
+ lines comes from the 'scroll' option (default: half a
+ screen). If [count] given, first set 'scroll' option
+ to [count]. The cursor is moved the same number of
+ lines down in the file (if possible; when lines wrap
+ and when hitting the end of the file there may be a
+ difference). When the cursor is on the last line of
+ the buffer nothing happens and a beep is produced.
+ See also 'startofline' option.
+
+<S-Down> or *<S-Down>* *<kPageDown>*
+<PageDown> or *<PageDown>* *CTRL-F*
+CTRL-F Scroll window [count] pages Forwards (downwards) in
+ the buffer. See also 'startofline' option.
+ When there is only one window the 'window' option
+ might be used.
+
+ *z+*
+z+ Without [count]: Redraw with the line just below the
+ window at the top of the window. Put the cursor in
+ that line, at the first non-blank in the line.
+ With [count]: just like "z<CR>".
+
+==============================================================================
+2. Scrolling upwards *scroll-up*
+
+The following commands move the edit window (the part of the buffer that you
+see) upwards (this means that more lines upwards in the text buffer can be
+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.
+
+ *CTRL-U*
+CTRL-U Scroll window Upwards in the buffer. The number of
+ lines comes from the 'scroll' option (default: half a
+ screen). If [count] given, first set the 'scroll'
+ option to [count]. The cursor is moved the same
+ number of lines up in the file (if possible; when
+ lines wrap and when hitting the end of the file there
+ may be a difference). When the cursor is on the first
+ line of the buffer nothing happens and a beep is
+ produced. See also 'startofline' option.
+
+<S-Up> or *<S-Up>* *<kPageUp>*
+<PageUp> or *<PageUp>* *CTRL-B*
+CTRL-B Scroll window [count] pages Backwards (upwards) in the
+ buffer. See also 'startofline' option.
+ When there is only one window the 'window' option
+ might be used.
+
+ *z^*
+z^ Without [count]: Redraw with the line just above the
+ window at the bottom of the window. Put the cursor in
+ that line, at the first non-blank in the line.
+ With [count]: First scroll the text to put the [count]
+ line at the bottom of the window, then redraw with the
+ line which is now at the top of the window at the
+ bottom of the window. Put the cursor in that line, at
+ the first non-blank in the line.
+
+==============================================================================
+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. 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
+ cursor line). Put cursor at first non-blank in the
+ line.
+
+ *zt*
+zt Like "z<CR>", but leave the cursor in the same
+ column.
+
+ *zN<CR>*
+z{height}<CR> Redraw, make window {height} lines tall. This is
+ useful to make the number of lines small when screen
+ updating is very slow. Cannot make the height more
+ than the physical screen height.
+
+ *z.*
+z. Redraw, line [count] at center of window (default
+ cursor line). Put cursor at first non-blank in the
+ line.
+
+ *zz*
+zz Like "z.", but leave the cursor in the same column.
+ Careful: If caps-lock is on, this command becomes
+ "ZZ": write buffer and exit!
+
+ *z-*
+z- Redraw, line [count] at bottom of window (default
+ cursor line). Put cursor at first non-blank in the
+ line.
+
+ *zb*
+zb Like "z-", but leave the cursor in the same column.
+
+==============================================================================
+4. Scrolling horizontally *scroll-horizontal*
+
+For the following four commands the cursor follows the screen. If the
+character that the cursor is on is moved off the screen, the cursor is moved
+to the closest character that is on the screen. The value of 'sidescroll' is
+not used.
+
+z<Right> or *zl* *z<Right>*
+zl Move the view on the text [count] characters to the
+ right, thus scroll the text [count] characters to the
+ left. This only works when 'wrap' is off.
+
+z<Left> or *zh* *z<Left>*
+zh Move the view on the text [count] characters to the
+ left, thus scroll the text [count] characters to the
+ right. This only works when 'wrap' is off.
+
+ *zL*
+zL Move the view on the text half a screenwidth to the
+ right, thus scroll the text half a screenwidth to the
+ left. This only works when 'wrap' is off.
+
+ *zH*
+zH Move the view on the text half a screenwidth to the
+ left, thus scroll the text half a screenwidth to the
+ right. This only works when 'wrap' is off.
+
+For the following two commands the cursor is not moved in the text, only the
+text scrolls on the screen.
+
+ *zs*
+zs Scroll the text horizontally to position the cursor
+ at the start (left side) of the screen. This only
+ works when 'wrap' is off.
+
+ *ze*
+ze Scroll the text horizontally to position the cursor
+ at the end (right side) of the screen. This only
+ works when 'wrap' is off.
+
+==============================================================================
+5. Scrolling synchronously *scroll-binding*
+
+Occasionally, it is desirable to bind two or more windows together such that
+when one window is scrolled, the other windows are also scrolled. In Vim,
+windows can be given this behavior by setting the (window-specific)
+'scrollbind' option. When a window that has 'scrollbind' set is scrolled, all
+other 'scrollbind' windows are scrolled the same amount, if possible. The
+behavior of 'scrollbind' can be modified by the 'scrollopt' option.
+
+When using the scrollbars, the binding only happens when scrolling the window
+with focus (where the cursor is). You can use this to avoid scroll-binding
+for a moment without resetting options.
+
+When a window also has the 'diff' option set, the scroll-binding uses the
+differences between the two buffers to synchronize the position precisely.
+Otherwise the following method is used.
+
+ *scrollbind-relative*
+Each 'scrollbind' window keeps track of its "relative offset," which can be
+thought of as the difference between the current window's vertical scroll
+position and the other window's vertical scroll position. When one of the
+'scrollbind' windows is asked to vertically scroll past the beginning or end
+limit of its text, the window no longer scrolls, but remembers how far past
+the limit it wishes to be. The window keeps this information so that it can
+maintain the same relative offset, regardless of its being asked to scroll
+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'
+option.
+
+ *syncbind* *:syncbind* *:sync*
+:syncbind Force all 'scrollbind' windows to have the same
+ relative offset. I.e., when any of the 'scrollbind'
+ windows is scrolled to the top of its buffer, all of
+ the 'scrollbind' windows will also be at the top of
+ their buffers.
+
+ *scrollbind-quickadj*
+The 'scrollbind' flag is meaningful when using keyboard commands to vertically
+scroll a window, and also meaningful when using the vertical scrollbar of the
+window which has the cursor focus. However, when using the vertical scrollbar
+of a window which doesn't have the cursor focus, 'scrollbind' is ignored.
+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.
+
+On MS-Windows, if the scroll action causes input focus -problems, see
+|intellimouse-wheel-problems|.
+
+For Win32 and the X11 GUIs (Motif and GTK) scrolling the wheel generates key
+presses <ScrollWheelUp>, <ScrollWheelDown>, <ScrollWheelLeft> and
+<ScrollWheelRight>. For example, if you push the scroll wheel upwards a
+<ScrollWheelUp> key press is generated causing the window to scroll upwards
+(while the text is actually moving downwards). The default action for these
+keys are:
+ <ScrollWheelUp> scroll N lines up *<ScrollWheelUp>*
+ <S-ScrollWheelUp> scroll one page up *<S-ScrollWheelUp>*
+ <C-ScrollWheelUp> scroll one page up *<C-ScrollWheelUp>*
+ <ScrollWheelDown> scroll N lines down *<ScrollWheelDown>*
+ <S-ScrollWheelDown> scroll one page down *<S-ScrollWheelDown>*
+ <C-ScrollWheelDown> scroll one page down *<C-ScrollWheelDown>*
+ <ScrollWheelLeft> scroll N columns left *<ScrollWheelLeft>*
+ <S-ScrollWheelLeft> scroll one page left *<S-ScrollWheelLeft>*
+ <C-ScrollWheelLeft> scroll one page left *<C-ScrollWheelLeft>*
+ <ScrollWheelRight> scroll N columns right *<ScrollWheelRight>*
+ <S-ScrollWheelRight> scroll one page right *<S-ScrollWheelRight>*
+ <C-ScrollWheelRight> scroll one page right *<C-ScrollWheelRight>*
+This should work in all modes, except when editing the command line.
+
+The value of N depends on the system. By default Vim scrolls three lines when
+moving vertically, and six columns when moving horizontally. On MS-Windows
+the amount of lines and columns for each scroll action is taken from the
+system-wide settings.
+
+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
+line if the cursor line is about to be scrolled off the screen (similarly to
+how the horizontal scrollbar works).
+
+You can modify the default behavior by mapping the keys. For example, to make
+the scroll wheel move one line or half a page in Normal mode: >
+ :map <ScrollWheelUp> <C-Y>
+ :map <S-ScrollWheelUp> <C-U>
+ :map <ScrollWheelDown> <C-E>
+ :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.
+ *mouse-scrolling-off*
+If you do not want the mouse to cause scrolling (e.g. because resting your
+palm on the touchpad causes scroll events), you can disable that with: >
+ :map <ScrollWheelDown> <Nop>
+ :map! <ScrollWheelDown> <Nop>
+ :map <ScrollWheelUp> <Nop>
+ :map! <ScrollWheelUp> <Nop>
+ :map <ScrollWheelLeft> <Nop>
+ :map! <ScrollWheelLeft> <Nop>
+ :map <ScrollWheelRight> <Nop>
+ :map! <ScrollWheelRight> <Nop>
+
+When using XFree86, the /etc/XF86Config file should have the correct entry for
+your mouse. For FreeBSD, this entry works for a Logitech scrollmouse: >
+ Protocol "MouseMan"
+ Device "/dev/psm0"
+ ZAxisMapping 4 5
+See the XFree86 documentation for information.
+
+ *<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:noet:ft=help:norl:
diff --git a/runtime/doc/sign.txt b/runtime/doc/sign.txt
new file mode 100644
index 0000000..d9bfed6
--- /dev/null
+++ b/runtime/doc/sign.txt
@@ -0,0 +1,776 @@
+*sign.txt* For Vim version 9.0. Last change: 2023 Feb 21
+
+
+ VIM REFERENCE MANUAL by Gordon Prieur
+ and Bram Moolenaar
+
+
+Sign Support Features *sign-support*
+
+1. Introduction |sign-intro|
+2. Commands |sign-commands|
+3. Functions |sign-functions-details|
+
+{only available when compiled with the |+signs| feature}
+
+==============================================================================
+1. Introduction *sign-intro* *signs*
+
+When a debugger or other IDE tool is driving an editor it needs to be able
+to give specific highlights which quickly tell the user useful information
+about the file. One example of this would be a debugger which had an icon
+in the left-hand column denoting a breakpoint. Another example might be an
+arrow representing the Program Counter (PC). The sign features allow both
+placement of a sign, or icon, in the left-hand side of the window and
+definition of a highlight which will be applied to that line. Displaying the
+sign as an image is most likely only feasible in gvim (although Sun
+Microsystem's dtterm does support this it's the only terminal emulator I know
+of which does). A text sign and the highlight should be feasible in any color
+terminal emulator.
+
+Signs and highlights are not useful just for debuggers. Sun's Visual
+WorkShop uses signs and highlights to mark build errors and SourceBrowser
+hits. Additionally, the debugger supports 8 to 10 different signs and
+highlight colors, see |NetBeans|.
+
+There are two steps in using signs:
+
+1. Define the sign. This specifies the image, text and highlighting. For
+ example, you can define a "break" sign with an image of a stop roadsign and
+ text "!!".
+
+2. Place the sign. This specifies the file and line number where the sign is
+ displayed. A defined sign can be placed several times in different lines
+ and files.
+
+ *sign-column*
+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. This behavior can be changed with the 'signcolumn' option.
+
+The color of the column is set with the SignColumn highlight group
+|hl-SignColumn|. Example to set the color: >
+
+ :highlight SignColumn guibg=darkgrey
+<
+If 'cursorline' is enabled, then the CursorLineSign highlight group is used
+|hl-CursorLineSign|.
+ *sign-identifier*
+Each placed sign is identified by a number called the sign identifier. This
+identifier is used to jump to the sign or to remove the sign. The identifier
+is assigned when placing the sign using the |:sign-place| command or the
+|sign_place()| function. Each sign identifier should be a unique number. If
+multiple placed signs use the same identifier, then jumping to or removing a
+sign becomes unpredictable. To avoid overlapping identifiers, sign groups can
+be used. The |sign_place()| function can be called with a zero sign identifier
+to allocate the next available identifier.
+
+ *sign-group*
+Each placed sign can be assigned to either the global group or a named group.
+When placing a sign, if a group name is not supplied, or an empty string is
+used, then the sign is placed in the global group. Otherwise the sign is
+placed in the named group. The sign identifier is unique within a group. The
+sign group allows Vim plugins to use unique signs without interfering with
+other plugins using signs.
+
+To place a sign in a popup window the group name must start with "PopUp".
+Other signs will not show in a popup window. The group name "PopUpMenu" is
+used by popup windows where 'cursorline' is set.
+
+ *sign-priority*
+Each placed sign is assigned a priority value. When multiple signs are placed
+on the same line, the attributes of the sign with the highest priority is used
+independently of the sign group. The default priority for a sign is 10. The
+priority is assigned at the time of placing a sign.
+
+When two signs with the same priority are present, and one has an icon or text
+in the signcolumn while the other has line highlighting, then both are
+displayed.
+
+When the line on which the sign is placed is deleted, the sign is moved to the
+next line (or the last line of the buffer, if there is no next line). When
+the delete is undone the sign does not move back.
+
+When a sign with line highlighting and 'cursorline' highlighting are both
+present, if the priority is 100 or more then the sign highlighting takes
+precedence, otherwise the 'cursorline' highlighting.
+
+==============================================================================
+2. Commands *sign-commands* *:sig* *:sign*
+
+Here is an example that places a sign "piet", displayed with the text ">>", in
+line 23 of the current file: >
+ :sign define piet text=>> texthl=Search
+ :exe ":sign place 2 line=23 name=piet file=" .. expand("%:p")
+
+And here is the command to delete it again: >
+ :sign unplace 2
+
+Note that the ":sign" command cannot be followed by another command or a
+comment. If you do need that, use the |:execute| command.
+
+
+DEFINING A SIGN. *:sign-define* *E255* *E160* *E612*
+
+See |sign_define()| for the equivalent Vim script function.
+
+:sign define {name} {argument}...
+ Define a new sign or set attributes for an existing sign.
+ The {name} can either be a number (all digits) or a name
+ starting with a non-digit. Leading zeros are ignored, thus
+ "0012", "012" and "12" are considered the same name.
+ About 120 different signs can be defined.
+
+ Accepted arguments:
+
+ icon={bitmap}
+ Define the file name where the bitmap can be found. Should be
+ a full path. The bitmap should fit in the place of two
+ characters. This is not checked. If the bitmap is too big it
+ will cause redraw problems. Only GTK 2 can scale the bitmap
+ to fit the space available.
+ toolkit supports ~
+ GTK 1 pixmap (.xpm)
+ GTK 2 many
+ Motif pixmap (.xpm)
+ 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 the line number on the line where
+ the sign is placed. Overrides |hl-LineNr|, |hl-LineNrAbove|,
+ |hl-LineNrBelow|, and |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
+ and they must occupy one or two display cells.
+
+ texthl={group}
+ Highlighting group used for the text item.
+
+ culhl={group}
+ Highlighting group used for the text item when the cursor is
+ on the same line as the sign and 'cursorline' is enabled.
+
+ Example: >
+ :sign define MySign text=>> texthl=Search linehl=DiffText
+<
+
+DELETING A SIGN *:sign-undefine* *E155*
+
+See |sign_undefine()| for the equivalent Vim script function.
+
+:sign undefine {name}
+ Deletes a previously defined sign. If signs with this {name}
+ are still placed this will cause trouble.
+
+ Example: >
+ :sign undefine MySign
+<
+
+LISTING SIGNS *:sign-list* *E156*
+
+See |sign_getdefined()| for the equivalent Vim script function.
+
+:sign list Lists all defined signs and their attributes.
+
+:sign list {name}
+ Lists one defined sign and its attributes.
+
+
+PLACING SIGNS *:sign-place* *E158*
+
+See |sign_place()| for the equivalent Vim script function.
+
+:sign place {id} line={lnum} name={name} file={fname}
+ Place sign defined as {name} at line {lnum} in file {fname}.
+ *:sign-fname*
+ The file {fname} must already be loaded in a buffer. The
+ exact file name must be used, wildcards, $ENV and ~ are not
+ expanded, white space must not be escaped. Trailing white
+ space is ignored.
+
+ The sign is remembered under {id}, this can be used for
+ further manipulation. {id} must be a number.
+ It's up to the user to make sure the {id} is used only once in
+ each file (if it's used several times unplacing will also have
+ to be done several times and making changes may not work as
+ expected).
+
+ The following optional sign attributes can be specified before
+ "file=":
+ group={group} Place sign in sign group {group}
+ priority={prio} Assign priority {prio} to sign
+
+ By default, the sign is placed in the global sign group.
+
+ By default, the sign is assigned a default priority of 10. To
+ assign a different priority value, use "priority={prio}" to
+ specify a value. The priority is used to determine the sign
+ that is displayed when multiple signs are placed on the same
+ line.
+
+ Examples: >
+ :sign place 5 line=3 name=sign1 file=a.py
+ :sign place 6 group=g2 line=2 name=sign2 file=x.py
+ :sign place 9 group=g2 priority=50 line=5
+ \ name=sign1 file=a.py
+<
+:sign place {id} line={lnum} name={name} [buffer={nr}]
+ Same, but use buffer {nr}. If the buffer argument is not
+ given, place the sign in the current buffer.
+
+ Example: >
+ :sign place 10 line=99 name=sign3
+ :sign place 10 line=99 name=sign3 buffer=3
+<
+ *E885*
+:sign place {id} name={name} file={fname}
+ Change the placed sign {id} in file {fname} to use the defined
+ sign {name}. See remark above about {fname} |:sign-fname|.
+ This can be used to change the displayed sign without moving
+ it (e.g., when the debugger has stopped at a breakpoint).
+
+ The optional "group={group}" attribute can be used before
+ "file=" to select a sign in a particular group. The optional
+ "priority={prio}" attribute can be used to change the priority
+ of an existing sign.
+
+ Example: >
+ :sign place 23 name=sign1 file=/path/to/edit.py
+<
+:sign place {id} name={name} [buffer={nr}]
+ Same, but use buffer {nr}. If the buffer argument is not
+ given, use the current buffer.
+
+ Example: >
+ :sign place 23 name=sign1
+ :sign place 23 name=sign1 buffer=7
+<
+
+REMOVING SIGNS *:sign-unplace* *E159*
+
+See |sign_unplace()| for the equivalent Vim script function.
+
+:sign unplace {id} file={fname}
+ Remove the previously placed sign {id} from file {fname}.
+ See remark above about {fname} |:sign-fname|.
+
+:sign unplace {id} group={group} file={fname}
+ Same but remove the sign {id} in sign group {group}.
+
+:sign unplace {id} group=* file={fname}
+ Same but remove the sign {id} from all the sign groups.
+
+:sign unplace * file={fname}
+ Remove all placed signs in file {fname}.
+
+:sign unplace * group={group} file={fname}
+ Remove all placed signs in group {group} from file {fname}.
+
+:sign unplace * group=* file={fname}
+ Remove all placed signs in all the groups from file {fname}.
+
+:sign unplace {id} buffer={nr}
+ Remove the previously placed sign {id} from buffer {nr}.
+
+:sign unplace {id} group={group} buffer={nr}
+ Remove the previously placed sign {id} in group {group} from
+ buffer {nr}.
+
+:sign unplace {id} group=* buffer={nr}
+ Remove the previously placed sign {id} in all the groups from
+ buffer {nr}.
+
+:sign unplace * buffer={nr}
+ Remove all placed signs in buffer {nr}.
+
+:sign unplace * group={group} buffer={nr}
+ Remove all placed signs in group {group} from buffer {nr}.
+
+:sign unplace * group=* buffer={nr}
+ Remove all placed signs in all the groups from buffer {nr}.
+
+:sign unplace {id}
+ Remove the previously placed sign {id} from all files it
+ appears in.
+
+:sign unplace {id} group={group}
+ Remove the previously placed sign {id} in group {group} from
+ all files it appears in.
+
+:sign unplace {id} group=*
+ Remove the previously placed sign {id} in all the groups from
+ all the files it appears in.
+
+:sign unplace *
+ Remove all placed signs in the global group from all the files.
+
+:sign unplace * group={group}
+ Remove all placed signs in group {group} from all the files.
+
+:sign unplace * group=*
+ Remove all placed signs in all the groups from all the files.
+
+:sign unplace
+ Remove a placed sign at the cursor position. If multiple signs
+ are placed in the line, then only one is removed.
+
+:sign unplace group={group}
+ Remove a placed sign in group {group} at the cursor
+ position.
+
+:sign unplace group=*
+ Remove a placed sign in any group at the cursor position.
+
+
+LISTING PLACED SIGNS *:sign-place-list*
+
+See |sign_getplaced()| for the equivalent Vim script function.
+
+:sign place file={fname}
+ List signs placed in file {fname}.
+ See remark above about {fname} |:sign-fname|.
+
+:sign place group={group} file={fname}
+ List signs in group {group} placed in file {fname}.
+
+:sign place group=* file={fname}
+ List signs in all the groups placed in file {fname}.
+
+:sign place buffer={nr}
+ List signs placed in buffer {nr}.
+
+:sign place group={group} buffer={nr}
+ List signs in group {group} placed in buffer {nr}.
+
+:sign place group=* buffer={nr}
+ List signs in all the groups placed in buffer {nr}.
+
+:sign place List placed signs in the global group in all files.
+
+:sign place group={group}
+ List placed signs with sign group {group} in all files.
+
+:sign place group=*
+ List placed signs in all sign groups in all files.
+
+
+JUMPING TO A SIGN *:sign-jump* *E157*
+
+See |sign_jump()| for the equivalent Vim script function.
+
+:sign jump {id} file={fname}
+ Open the file {fname} or jump to the window that contains
+ {fname} and position the cursor at sign {id}.
+ See remark above about {fname} |:sign-fname|.
+ If the file isn't displayed in window and the current file can
+ not be |abandon|ed this fails.
+
+:sign jump {id} group={group} file={fname}
+ Same but jump to the sign in group {group}
+
+:sign jump {id} [buffer={nr}] *E934*
+ Same, but use buffer {nr}. This fails if buffer {nr} does not
+ have a name. If the buffer argument is not given, use the
+ current buffer.
+
+:sign jump {id} group={group} [buffer={nr}]
+ Same but jump to the sign in group {group}
+
+
+==============================================================================
+3. Functions *sign-functions-details*
+
+sign_define({name} [, {dict}]) *sign_define()*
+sign_define({list})
+ Define a new sign named {name} or modify the attributes of an
+ existing sign. This is similar to the |:sign-define| command.
+
+ Prefix {name} with a unique text to avoid name collisions.
+ There is no {group} like with placing signs.
+
+ The {name} can be a String or a Number. The optional {dict}
+ argument specifies the sign attributes. The following values
+ are supported:
+ icon full path to the bitmap file for the sign.
+ linehl highlight group used for the whole line the
+ sign is placed in.
+ numhl highlight group used for the line number where
+ the sign is placed.
+ text text that is displayed when there is no icon
+ or the GUI is not being used.
+ texthl highlight group used for the text item
+ culhl highlight group used for the text item when
+ the cursor is on the same line as the sign and
+ 'cursorline' is enabled.
+
+ If the sign named {name} already exists, then the attributes
+ of the sign are updated.
+
+ The one argument {list} can be used to define a list of signs.
+ Each list item is a dictionary with the above items in {dict}
+ and a "name" item for the sign name.
+
+ Returns 0 on success and -1 on failure. When the one argument
+ {list} is used, then returns a List of values one for each
+ defined sign.
+
+ Examples: >
+ call sign_define("mySign", {
+ \ "text" : "=>",
+ \ "texthl" : "Error",
+ \ "linehl" : "Search"})
+ call sign_define([
+ \ {'name' : 'sign1',
+ \ 'text' : '=>'},
+ \ {'name' : 'sign2',
+ \ 'text' : '!!'}
+ \ ])
+<
+ Can also be used as a |method|: >
+ GetSignList()->sign_define()
+
+sign_getdefined([{name}]) *sign_getdefined()*
+ Get a list of defined signs and their attributes.
+ This is similar to the |:sign-list| command.
+
+ If the {name} is not supplied, then a list of all the defined
+ signs is returned. Otherwise the attribute of the specified
+ sign is returned.
+
+ Each list item in the returned value is a dictionary with the
+ following entries:
+ icon full path to the bitmap file of the sign
+ linehl highlight group used for the whole line the
+ sign is placed in; not present if not set
+ name name of the sign
+ numhl highlight group used for the line number where
+ the sign is placed; not present if not set
+ text text that is displayed when there is no icon
+ or the GUI is not being used.
+ texthl highlight group used for the text item; not
+ present if not set
+ culhl highlight group used for the text item when
+ the cursor is on the same line as the sign and
+ 'cursorline' is enabled; not present if not
+ set
+
+ Returns an empty List if there are no signs and when {name} is
+ not found.
+
+ Examples: >
+ " Get a list of all the defined signs
+ echo sign_getdefined()
+
+ " Get the attribute of the sign named mySign
+ echo sign_getdefined("mySign")
+<
+ Can also be used as a |method|: >
+ GetSignList()->sign_getdefined()
+
+sign_getplaced([{buf} [, {dict}]]) *sign_getplaced()*
+ Return a list of signs placed in a buffer or all the buffers.
+ This is similar to the |:sign-place-list| command.
+
+ If the optional buffer name {buf} is specified, then only the
+ list of signs placed in that buffer is returned. For the use
+ of {buf}, see |bufname()|. The optional {dict} can contain
+ the following entries:
+ group select only signs in this group
+ id select sign with this identifier
+ lnum select signs placed in this line. For the use
+ of {lnum}, see |line()|.
+ If {group} is '*', then signs in all the groups including the
+ global group are returned. If {group} is not supplied or is an
+ empty string, then only signs in the global group are
+ returned. If no arguments are supplied, then signs in the
+ global group placed in all the buffers are returned.
+ See |sign-group|.
+
+ Each list item in the returned value is a dictionary with the
+ following entries:
+ bufnr number of the buffer with the sign
+ signs list of signs placed in {bufnr}. Each list
+ item is a dictionary with the below listed
+ entries
+
+ The dictionary for each sign contains the following entries:
+ group sign group. Set to '' for the global group.
+ id identifier of the sign
+ lnum line number where the sign is placed
+ name name of the defined sign
+ priority sign priority
+
+ The returned signs in a buffer are ordered by their line
+ number and priority.
+
+ Returns an empty list on failure or if there are no placed
+ signs.
+
+ Examples: >
+ " Get a List of signs placed in eval.c in the
+ " global group
+ echo sign_getplaced("eval.c")
+
+ " Get a List of signs in group 'g1' placed in eval.c
+ echo sign_getplaced("eval.c", {'group' : 'g1'})
+
+ " Get a List of signs placed at line 10 in eval.c
+ echo sign_getplaced("eval.c", {'lnum' : 10})
+
+ " Get sign with identifier 10 placed in a.py
+ echo sign_getplaced("a.py", {'id' : 10})
+
+ " Get sign with id 20 in group 'g1' placed in a.py
+ echo sign_getplaced("a.py", {'group' : 'g1',
+ \ 'id' : 20})
+
+ " Get a List of all the placed signs
+ echo sign_getplaced()
+<
+ Can also be used as a |method|: >
+ GetBufname()->sign_getplaced()
+<
+ *sign_jump()*
+sign_jump({id}, {group}, {buf})
+ Open the buffer {buf} or jump to the window that contains
+ {buf} and position the cursor at sign {id} in group {group}.
+ This is similar to the |:sign-jump| command.
+
+ If {group} is an empty string, then the global group is used.
+ For the use of {buf}, see |bufname()|.
+
+ Returns the line number of the sign. Returns -1 if the
+ arguments are invalid.
+
+ Example: >
+ " Jump to sign 10 in the current buffer
+ call sign_jump(10, '', '')
+<
+ Can also be used as a |method|: >
+ GetSignid()->sign_jump()
+<
+ *sign_place()*
+sign_place({id}, {group}, {name}, {buf} [, {dict}])
+ Place the sign defined as {name} at line {lnum} in file or
+ buffer {buf} and assign {id} and {group} to sign. This is
+ similar to the |:sign-place| command.
+
+ If the sign identifier {id} is zero, then a new identifier is
+ allocated. Otherwise the specified number is used. {group} is
+ the sign group name. To use the global sign group, use an
+ empty string. {group} functions as a namespace for {id}, thus
+ two groups can use the same IDs. Refer to |sign-identifier|
+ and |sign-group| for more information.
+
+ {name} refers to a defined sign.
+ {buf} refers to a buffer name or number. For the accepted
+ values, see |bufname()|.
+
+ The optional {dict} argument supports the following entries:
+ lnum line number in the file or buffer
+ {buf} where the sign is to be placed.
+ For the accepted values, see |line()|.
+ priority priority of the sign. See
+ |sign-priority| for more information.
+
+ If the optional {dict} is not specified, then it modifies the
+ placed sign {id} in group {group} to use the defined sign
+ {name}.
+
+ Returns the sign identifier on success and -1 on failure.
+
+ Examples: >
+ " Place a sign named sign1 with id 5 at line 20 in
+ " buffer json.c
+ call sign_place(5, '', 'sign1', 'json.c',
+ \ {'lnum' : 20})
+
+ " Updates sign 5 in buffer json.c to use sign2
+ call sign_place(5, '', 'sign2', 'json.c')
+
+ " Place a sign named sign3 at line 30 in
+ " buffer json.c with a new identifier
+ let id = sign_place(0, '', 'sign3', 'json.c',
+ \ {'lnum' : 30})
+
+ " Place a sign named sign4 with id 10 in group 'g3'
+ " at line 40 in buffer json.c with priority 90
+ call sign_place(10, 'g3', 'sign4', 'json.c',
+ \ {'lnum' : 40, 'priority' : 90})
+<
+ Can also be used as a |method|: >
+ GetSignid()->sign_place(group, name, expr)
+<
+ *sign_placelist()*
+sign_placelist({list})
+ Place one or more signs. This is similar to the
+ |sign_place()| function. The {list} argument specifies the
+ List of signs to place. Each list item is a dict with the
+ following sign attributes:
+ buffer Buffer name or number. For the accepted
+ values, see |bufname()|.
+ group Sign group. {group} functions as a namespace
+ for {id}, thus two groups can use the same
+ IDs. If not specified or set to an empty
+ string, then the global group is used. See
+ |sign-group| for more information.
+ id Sign identifier. If not specified or zero,
+ then a new unique identifier is allocated.
+ Otherwise the specified number is used. See
+ |sign-identifier| for more information.
+ lnum Line number in the buffer where the sign is to
+ be placed. For the accepted values, see
+ |line()|.
+ name Name of the sign to place. See |sign_define()|
+ for more information.
+ priority Priority of the sign. When multiple signs are
+ placed on a line, the sign with the highest
+ priority is used. If not specified, the
+ default value of 10 is used. See
+ |sign-priority| for more information.
+
+ If {id} refers to an existing sign, then the existing sign is
+ modified to use the specified {name} and/or {priority}.
+
+ Returns a List of sign identifiers. If failed to place a
+ sign, the corresponding list item is set to -1.
+
+ Examples: >
+ " Place sign s1 with id 5 at line 20 and id 10 at line
+ " 30 in buffer a.c
+ let [n1, n2] = sign_placelist([
+ \ {'id' : 5,
+ \ 'name' : 's1',
+ \ 'buffer' : 'a.c',
+ \ 'lnum' : 20},
+ \ {'id' : 10,
+ \ 'name' : 's1',
+ \ 'buffer' : 'a.c',
+ \ 'lnum' : 30}
+ \ ])
+
+ " Place sign s1 in buffer a.c at line 40 and 50
+ " with auto-generated identifiers
+ let [n1, n2] = sign_placelist([
+ \ {'name' : 's1',
+ \ 'buffer' : 'a.c',
+ \ 'lnum' : 40},
+ \ {'name' : 's1',
+ \ 'buffer' : 'a.c',
+ \ 'lnum' : 50}
+ \ ])
+<
+ Can also be used as a |method|: >
+ GetSignlist()->sign_placelist()
+
+sign_undefine([{name}]) *sign_undefine()*
+sign_undefine({list})
+ Deletes a previously defined sign {name}. This is similar to
+ the |:sign-undefine| command. If {name} is not supplied, then
+ deletes all the defined signs.
+
+ The one argument {list} can be used to undefine a list of
+ signs. Each list item is the name of a sign.
+
+ Returns 0 on success and -1 on failure. For the one argument
+ {list} call, returns a list of values one for each undefined
+ sign.
+
+ Examples: >
+ " Delete a sign named mySign
+ call sign_undefine("mySign")
+
+ " Delete signs 'sign1' and 'sign2'
+ call sign_undefine(["sign1", "sign2"])
+
+ " Delete all the signs
+ call sign_undefine()
+<
+ Can also be used as a |method|: >
+ GetSignlist()->sign_undefine()
+
+sign_unplace({group} [, {dict}]) *sign_unplace()*
+ Remove a previously placed sign in one or more buffers. This
+ is similar to the |:sign-unplace| command.
+
+ {group} is the sign group name. To use the global sign group,
+ use an empty string. If {group} is set to '*', then all the
+ groups including the global group are used.
+ The signs in {group} are selected based on the entries in
+ {dict}. The following optional entries in {dict} are
+ supported:
+ buffer buffer name or number. See |bufname()|.
+ id sign identifier
+ If {dict} is not supplied, then all the signs in {group} are
+ removed.
+
+ Returns 0 on success and -1 on failure.
+
+ Examples: >
+ " Remove sign 10 from buffer a.vim
+ call sign_unplace('', {'buffer' : "a.vim", 'id' : 10})
+
+ " Remove sign 20 in group 'g1' from buffer 3
+ call sign_unplace('g1', {'buffer' : 3, 'id' : 20})
+
+ " Remove all the signs in group 'g2' from buffer 10
+ call sign_unplace('g2', {'buffer' : 10})
+
+ " Remove sign 30 in group 'g3' from all the buffers
+ call sign_unplace('g3', {'id' : 30})
+
+ " Remove all the signs placed in buffer 5
+ call sign_unplace('*', {'buffer' : 5})
+
+ " Remove the signs in group 'g4' from all the buffers
+ call sign_unplace('g4')
+
+ " Remove sign 40 from all the buffers
+ call sign_unplace('*', {'id' : 40})
+
+ " Remove all the placed signs from all the buffers
+ call sign_unplace('*')
+
+< Can also be used as a |method|: >
+ GetSigngroup()->sign_unplace()
+<
+sign_unplacelist({list}) *sign_unplacelist()*
+ Remove previously placed signs from one or more buffers. This
+ is similar to the |sign_unplace()| function.
+
+ The {list} argument specifies the List of signs to remove.
+ Each list item is a dict with the following sign attributes:
+ buffer buffer name or number. For the accepted
+ values, see |bufname()|. If not specified,
+ then the specified sign is removed from all
+ the buffers.
+ group sign group name. If not specified or set to an
+ empty string, then the global sign group is
+ used. If set to '*', then all the groups
+ including the global group are used.
+ id sign identifier. If not specified, then all
+ the signs in the specified group are removed.
+
+ Returns a List where an entry is set to 0 if the corresponding
+ sign was successfully removed or -1 on failure.
+
+ Example: >
+ " Remove sign with id 10 from buffer a.vim and sign
+ " with id 20 from buffer b.vim
+ call sign_unplacelist([
+ \ {'id' : 10, 'buffer' : "a.vim"},
+ \ {'id' : 20, 'buffer' : 'b.vim'},
+ \ ])
+<
+ Can also be used as a |method|: >
+ GetSignlist()->sign_unplacelist()
+<
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/spell.txt b/runtime/doc/spell.txt
new file mode 100644
index 0000000..b5d152a
--- /dev/null
+++ b/runtime/doc/spell.txt
@@ -0,0 +1,1680 @@
+*spell.txt* For Vim version 9.0. Last change: 2020 Aug 15
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+
+{not available when the |+syntax| feature has been disabled at compile time}
+
+Note: There also is a vimspell plugin. If you have it you can do ":help
+vimspell" to find about it. But you will probably want to get rid of the
+plugin and use the 'spell' option instead, it works better.
+
+==============================================================================
+1. Quick start *spell-quickstart* *E756*
+
+This command switches on spell checking: >
+
+ :setlocal spell spelllang=en_us
+
+This switches on the 'spell' option and specifies to check for US English.
+
+The words that are not recognized are highlighted with one of these:
+ SpellBad word not recognized |hl-SpellBad|
+ SpellCap word not capitalised |hl-SpellCap|
+ SpellRare rare word |hl-SpellRare|
+ SpellLocal wrong spelling for selected region |hl-SpellLocal|
+
+Vim only checks words for spelling, there is no grammar check.
+
+If the 'mousemodel' option is set to "popup" and the cursor is on a badly
+spelled word or it is "popup_setpos" and the mouse pointer is on a badly
+spelled word, then the popup menu will contain a submenu to replace the bad
+word. Note: this slows down the appearance of the popup menu. Note for GTK:
+don't release the right mouse button until the menu appears, otherwise it
+won't work.
+
+To search for the next misspelled word:
+
+ *]s*
+]s Move to next misspelled word after the cursor.
+ A count before the command can be used to repeat.
+ 'wrapscan' applies.
+
+ *[s*
+[s Like "]s" but search backwards, find the misspelled
+ word before the cursor. Doesn't recognize words
+ split over two lines, thus may stop at words that are
+ not highlighted as bad. Does not stop at word with
+ missing capital at the start of a line.
+
+ *]S*
+]S Like "]s" but only stop at bad words, not at rare
+ words or words for another region.
+
+ *[S*
+[S Like "]S" but search backwards.
+
+
+To add words to your own word list:
+
+ *zg*
+zg Add word under the cursor as a good word to the first
+ name in 'spellfile'. A count may precede the command
+ to indicate the entry in 'spellfile' to be used. A
+ count of two uses the second entry.
+
+ In Visual mode the selected characters are added as a
+ word (including white space!).
+ When the cursor is on text that is marked as badly
+ spelled then the marked text is used.
+ Otherwise the word under the cursor, separated by
+ non-word characters, is used.
+
+ If the word is explicitly marked as bad word in
+ another spell file the result is unpredictable.
+
+ *zG*
+zG Like "zg" but add the word to the internal word list
+ |internal-wordlist|.
+
+ *zw*
+zw Like "zg" but mark the word as a wrong (bad) word.
+ If the word already appears in 'spellfile' it is
+ turned into a comment line. See |spellfile-cleanup|
+ for getting rid of those.
+
+ *zW*
+zW Like "zw" but add the word to the internal word list
+ |internal-wordlist|.
+
+zuw *zug* *zuw*
+zug Undo |zw| and |zg|, remove the word from the entry in
+ 'spellfile'. Count used as with |zg|.
+
+zuW *zuG* *zuW*
+zuG Undo |zW| and |zG|, remove the word from the internal
+ word list. Count used as with |zg|.
+
+ *:spe* *:spellgood* *E1280*
+:[count]spe[llgood] {word}
+ Add {word} as a good word to 'spellfile', like with
+ |zg|. Without count the first name is used, with a
+ count of two the second entry, etc.
+
+:spe[llgood]! {word} Add {word} as a good word to the internal word list,
+ like with |zG|.
+
+ *:spellw* *:spellwrong*
+:[count]spellw[rong] {word}
+ Add {word} as a wrong (bad) word to 'spellfile', as
+ with |zw|. Without count the first name is used, with
+ a count of two the second entry, etc.
+
+:spellw[rong]! {word} Add {word} as a wrong (bad) word to the internal word
+ list, like with |zW|.
+
+ *:spellra* *:spellrare*
+:[count]spellr[are] {word}
+ Add {word} as a rare word to 'spellfile', similar to
+ |zw|. Without count the first name is used, with
+ a count of two the second entry, etc.
+
+ There are no normal mode commands to mark words as
+ rare as this is a fairly uncommon command and all
+ intuitive commands for this are already taken. If you
+ want you can add mappings with e.g.: >
+ nnoremap z? :exe ':spellrare ' .. expand('<cWORD>')<CR>
+ nnoremap z/ :exe ':spellrare! ' .. expand('<cWORD>')<CR>
+< |:spellundo|, |zuw|, or |zuW| can be used to undo this.
+
+:spellr[rare]! {word} Add {word} as a rare word to the internal word
+ list, similar to |zW|.
+
+:[count]spellu[ndo] {word} *:spellu* *:spellundo*
+ Like |zuw|. [count] used as with |:spellgood|.
+
+:spellu[ndo]! {word} Like |zuW|. [count] used as with |:spellgood|.
+
+
+After adding a word to 'spellfile' with the above commands its associated
+".spl" file will automatically be updated and reloaded. If you change
+'spellfile' manually you need to use the |:mkspell| command. This sequence of
+commands mostly works well: >
+ :edit <file in 'spellfile'>
+< (make changes to the spell file) >
+ :mkspell! %
+
+More details about the 'spellfile' format below |spell-wordlist-format|.
+
+ *internal-wordlist*
+The internal word list is used for all buffers where 'spell' is set. It is
+not stored, it is lost when you exit Vim. It is also cleared when 'encoding'
+is set.
+
+
+Finding suggestions for bad words:
+ *z=*
+z= For the word under/after the cursor suggest correctly
+ spelled words. This also works to find alternatives
+ for a word that is not highlighted as a bad word,
+ e.g., when the word after it is bad.
+ In Visual mode the highlighted text is taken as the
+ word to be replaced.
+ The results are sorted on similarity to the word being
+ replaced.
+ This may take a long time. Hit CTRL-C when you get
+ bored.
+
+ If the command is used without a count the
+ alternatives are listed and you can enter the number
+ of your choice or press <Enter> if you don't want to
+ replace. You can also use the mouse to click on your
+ choice (only works if the mouse can be used in Normal
+ mode and when there are no line wraps). Click on the
+ first line (the header) to cancel.
+
+ The suggestions listed normally replace a highlighted
+ bad word. Sometimes they include other text, in that
+ case the replaced text is also listed after a "<".
+
+ If a count is used that suggestion is used, without
+ prompting. For example, "1z=" always takes the first
+ suggestion.
+
+ If 'verbose' is non-zero a score will be displayed
+ with the suggestions to indicate the likeliness to the
+ badly spelled word (the higher the score the more
+ different).
+ When a word was replaced the redo command "." will
+ repeat the word replacement. This works like "ciw",
+ the good word and <Esc>. This does NOT work for Thai
+ and other languages without spaces between words.
+
+ *:spellr* *:spellrepall* *E752* *E753*
+:spellr[epall] Repeat the replacement done by |z=| for all matches
+ with the replaced word in the current window.
+
+In Insert mode, when the cursor is after a badly spelled word, you can use
+CTRL-X s to find suggestions. This works like Insert mode completion. Use
+CTRL-N to use the next suggestion, CTRL-P to go back. |i_CTRL-X_s|
+
+The 'spellsuggest' option influences how the list of suggestions is generated
+and sorted. See |'spellsuggest'|.
+
+The 'spellcapcheck' option is used to check the first word of a sentence
+starts with a capital. This doesn't work for the first word in the file.
+When there is a line break right after a sentence the highlighting of the next
+line may be postponed. Use |CTRL-L| when needed. Also see |set-spc-auto| for
+how it can be set automatically when 'spelllang' is set.
+
+The 'spelloptions' option has a few more flags that influence the way spell
+checking works.
+
+Vim counts the number of times a good word is encountered. This is used to
+sort the suggestions: words that have been seen before get a small bonus,
+words that have been seen often get a bigger bonus. The COMMON item in the
+affix file can be used to define common words, so that this mechanism also
+works in a new or short file |spell-COMMON|.
+
+==============================================================================
+2. Remarks on spell checking *spell-remarks*
+
+PERFORMANCE
+
+Vim does on-the-fly spell checking. To make this work fast the word list is
+loaded in memory. Thus this uses a lot of memory (1 Mbyte or more). There
+might also be a noticeable delay when the word list is loaded, which happens
+when 'spell' is set and when 'spelllang' is set while 'spell' was already set.
+To minimize the delay each word list is only loaded once, it is not deleted
+when 'spelllang' is made empty or 'spell' is reset. When 'encoding' is set
+all the word lists are reloaded, thus you may notice a delay then too.
+
+
+REGIONS
+
+A word may be spelled differently in various regions. For example, English
+comes in (at least) these variants:
+
+ en all regions
+ en_au Australia
+ en_ca Canada
+ en_gb Great Britain
+ en_nz New Zealand
+ en_us USA
+
+Words that are not used in one region but are used in another region are
+highlighted with SpellLocal |hl-SpellLocal|.
+
+Always use lowercase letters for the language and region names.
+
+When adding a word with |zg| or another command it's always added for all
+regions. You can change that by manually editing the 'spellfile'. See
+|spell-wordlist-format|. Note that the regions as specified in the files in
+'spellfile' are only used when all entries in 'spelllang' specify the same
+region (not counting files specified by their .spl name).
+
+ *spell-german*
+Specific exception: For German these special regions are used:
+ de all German words accepted
+ de_de old and new spelling
+ de_19 old spelling
+ de_20 new spelling
+ de_at Austria
+ de_ch Switzerland
+
+ *spell-russian*
+Specific exception: For Russian these special regions are used:
+ ru all Russian words accepted
+ ru_ru "IE" letter spelling
+ ru_yo "YO" letter spelling
+
+ *spell-yiddish*
+Yiddish requires using "utf-8" encoding, because of the special characters
+used. If you are using latin1 Vim will use transliterated (romanized) Yiddish
+instead. If you want to use transliterated Yiddish with utf-8 use "yi-tr".
+In a table:
+ 'encoding' 'spelllang'
+ utf-8 yi Yiddish
+ latin1 yi transliterated Yiddish
+ utf-8 yi-tr transliterated Yiddish
+
+ *spell-cjk*
+Chinese, Japanese and other East Asian characters are normally marked as
+errors, because spell checking of these characters is not supported. If
+'spelllang' includes "cjk", these characters are not marked as errors. This
+is useful when editing text with spell checking while some Asian words are
+present.
+
+
+SPELL FILES *spell-load*
+
+Vim searches for spell files in the "spell" subdirectory of the directories in
+'runtimepath'. The name is: LL.EEE.spl, where:
+ LL the language name
+ EEE the value of 'encoding'
+
+The value for "LL" comes from 'spelllang', but excludes the region name.
+Examples:
+ 'spelllang' LL ~
+ en_us en
+ en-rare en-rare
+ medical_ca medical
+
+Only the first file is loaded, the one that is first in 'runtimepath'. If
+this succeeds then additionally files with the name LL.EEE.add.spl are loaded.
+All the ones that are found are used.
+
+If no spell file is found the |SpellFileMissing| autocommand event is
+triggered. This may trigger the |spellfile.vim| plugin to offer you
+downloading the spell file.
+
+Additionally, the files related to the names in 'spellfile' are loaded. These
+are the files that |zg| and |zw| add good and wrong words to.
+
+Exceptions:
+- Vim uses "latin1" when 'encoding' is "iso-8859-15". The euro sign doesn't
+ matter for spelling.
+- When no spell file for 'encoding' is found "ascii" is tried. This only
+ works for languages where nearly all words are ASCII, such as English. It
+ helps when 'encoding' is not "latin1", such as iso-8859-2, and English text
+ is being edited. For the ".add" files the same name as the found main
+ spell file is used.
+
+For example, with these values:
+ 'runtimepath' is "~/.vim,/usr/share/vim82,~/.vim/after"
+ 'encoding' is "iso-8859-2"
+ 'spelllang' is "pl"
+
+Vim will look for:
+1. ~/.vim/spell/pl.iso-8859-2.spl
+2. /usr/share/vim82/spell/pl.iso-8859-2.spl
+3. ~/.vim/spell/pl.iso-8859-2.add.spl
+4. /usr/share/vim82/spell/pl.iso-8859-2.add.spl
+5. ~/.vim/after/spell/pl.iso-8859-2.add.spl
+
+This assumes 1. is not found and 2. is found.
+
+If 'encoding' is "latin1" Vim will look for:
+1. ~/.vim/spell/pl.latin1.spl
+2. /usr/share/vim82/spell/pl.latin1.spl
+3. ~/.vim/after/spell/pl.latin1.spl
+4. ~/.vim/spell/pl.ascii.spl
+5. /usr/share/vim82/spell/pl.ascii.spl
+6. ~/.vim/after/spell/pl.ascii.spl
+
+This assumes none of them are found (Polish doesn't make sense when leaving
+out the non-ASCII characters).
+
+Spelling for EBCDIC is currently not supported.
+
+A spell file might not be available in the current 'encoding'. See
+|spell-mkspell| about how to create a spell file. Converting a spell file
+with "iconv" will NOT work!
+
+Note: on VMS ".{enc}.spl" is changed to "_{enc}.spl" to avoid trouble with
+filenames.
+
+ *spell-sug-file* *E781*
+If there is a file with exactly the same name as the ".spl" file but ending in
+".sug", that file will be used for giving better suggestions. It isn't loaded
+before suggestions are made to reduce memory use.
+
+ *E758* *E759* *E778* *E779* *E780* *E782*
+When loading a spell file Vim checks that it is properly formatted. If you
+get an error the file may be truncated, modified or intended for another Vim
+version.
+
+
+SPELLFILE CLEANUP *spellfile-cleanup*
+
+The |zw| command turns existing entries in 'spellfile' into comment lines.
+This avoids having to write a new file every time, but results in the file
+only getting longer, never shorter. To clean up the comment lines in all
+".add" spell files do this: >
+ :runtime spell/cleanadd.vim
+
+This deletes all comment lines, except the ones that start with "##". Use
+"##" lines to add comments that you want to keep.
+
+You can invoke this script as often as you like. A variable is provided to
+skip updating files that have been changed recently. Set it to the number of
+seconds that has passed since a file was changed before it will be cleaned.
+For example, to clean only files that were not changed in the last hour: >
+ let g:spell_clean_limit = 60 * 60
+The default is one second.
+
+
+WORDS
+
+Vim uses a fixed method to recognize a word. This is independent of
+'iskeyword', so that it also works in help files and for languages that
+include characters like '-' in 'iskeyword'. The word characters do depend on
+'encoding'.
+
+The table with word characters is stored in the main .spl file. Therefore it
+matters what the current locale is when generating it! A .add.spl file does
+not contain a word table though.
+
+For a word that starts with a digit the digit is ignored, unless the word as a
+whole is recognized. Thus if "3D" is a word and "D" is not then "3D" is
+recognized as a word, but if "3D" is not a word then only the "D" is marked as
+bad. Hex numbers in the form 0x12ab and 0X12AB are recognized.
+
+
+WORD COMBINATIONS
+
+It is possible to spell-check words that include a space. This is used to
+recognize words that are invalid when used by themselves, e.g. for "et al.".
+It can also be used to recognize "the the" and highlight it.
+
+The number of spaces is irrelevant. In most cases a line break may also
+appear. However, this makes it difficult to find out where to start checking
+for spelling mistakes. When you make a change to one line and only that line
+is redrawn Vim won't look in the previous line, thus when "et" is at the end
+of the previous line "al." will be flagged as an error. And when you type
+"the<CR>the" the highlighting doesn't appear until the first line is redrawn.
+Use |CTRL-L| to redraw right away. "[s" will also stop at a word combination
+with a line break.
+
+When encountering a line break Vim skips characters such as '*', '>' and '"',
+so that comments in C, shell and Vim code can be spell checked.
+
+
+SYNTAX HIGHLIGHTING *spell-syntax*
+
+Files that use syntax highlighting can specify where spell checking should be
+done:
+
+1. everywhere default
+2. in specific items use "contains=@Spell"
+3. everywhere but specific items use "contains=@NoSpell"
+
+For the second method adding the @NoSpell cluster will disable spell checking
+again. This can be used, for example, to add @Spell to the comments of a
+program, and add @NoSpell for items that shouldn't be checked.
+Also see |:syn-spell| for text that is not in a syntax item.
+
+
+VIM SCRIPTS
+
+If you want to write a Vim script that does something with spelling, you may
+find these functions useful:
+
+ spellbadword() find badly spelled word at the cursor
+ spellsuggest() get list of spelling suggestions
+ soundfold() get the sound-a-like version of a word
+
+
+SETTING 'spellcapcheck' AUTOMATICALLY *set-spc-auto*
+
+After the 'spelllang' option has been set successfully, Vim will source the
+files "spell/LANG.vim" in 'runtimepath'. "LANG" is the value of 'spelllang'
+up to the first comma, dot or underscore. This can be used to set options
+specifically for the language, especially 'spellcapcheck'.
+
+The distribution includes a few of these files. Use this command to see what
+they do: >
+ :next $VIMRUNTIME/spell/*.vim
+
+Note that the default scripts don't set 'spellcapcheck' if it was changed from
+the default value. This assumes the user prefers another value then.
+
+
+DOUBLE SCORING *spell-double-scoring*
+
+The 'spellsuggest' option can be used to select "double" scoring. This
+mechanism is based on the principle that there are two kinds of spelling
+mistakes:
+
+1. You know how to spell the word, but mistype something. This results in a
+ small editing distance (character swapped/omitted/inserted) and possibly a
+ word that sounds completely different.
+
+2. You don't know how to spell the word and type something that sounds right.
+ The edit distance can be big but the word is similar after sound-folding.
+
+Since scores for these two mistakes will be very different we use a list
+for each and mix them.
+
+The sound-folding is slow and people that know the language won't make the
+second kind of mistakes. Therefore 'spellsuggest' can be set to select the
+preferred method for scoring the suggestions.
+
+==============================================================================
+3. Generating a spell file *spell-mkspell*
+
+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
+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
+The older, OpenOffice 2 files may be used if this doesn't work:
+ http://wiki.services.openoffice.org/wiki/Dictionaries
+You can also use a plain word list. The results are the same, the choice
+depends on what word lists you can find.
+
+If you install Aap (from www.a-a-p.org) you can use the recipes in the
+runtime/spell/??/ directories. Aap will take care of downloading the files,
+apply patches needed for Vim and build the .spl file.
+
+Make sure your current locale is set properly, otherwise Vim doesn't know what
+characters are upper/lower case letters. If the locale isn't available (e.g.,
+when using an MS-Windows codepage on Unix) add tables to the .aff file
+|spell-affix-chars|. If the .aff file doesn't define a table then the word
+table of the currently active spelling is used. If spelling is not active
+then Vim will try to guess.
+
+ *:mksp* *:mkspell*
+:mksp[ell][!] [-ascii] {outname} {inname} ...
+ Generate a Vim spell file from word lists. Example: >
+ :mkspell /tmp/nl nl_NL.words
+< *E751*
+ When {outname} ends in ".spl" it is used as the output
+ file name. Otherwise it should be a language name,
+ such as "en", without the region name. The file
+ written will be "{outname}.{encoding}.spl", where
+ {encoding} is the value of the 'encoding' option.
+
+ When the output file already exists [!] must be used
+ to overwrite it.
+
+ When the [-ascii] argument is present, words with
+ non-ascii characters are skipped. The resulting file
+ ends in "ascii.spl".
+
+ The input can be the Myspell format files {inname}.aff
+ and {inname}.dic. If {inname}.aff does not exist then
+ {inname} is used as the file name of a plain word
+ list.
+
+ Multiple {inname} arguments can be given to combine
+ regions into one Vim spell file. Example: >
+ :mkspell ~/.vim/spell/en /tmp/en_US /tmp/en_CA /tmp/en_AU
+< This combines the English word lists for US, CA and AU
+ into one en.spl file.
+ Up to eight regions can be combined. *E754* *E755*
+ The REP and SAL items of the first .aff file where
+ they appear are used. |spell-REP| |spell-SAL|
+ *E845*
+ This command uses a lot of memory, required to find
+ the optimal word tree (Polish, Italian and Hungarian
+ require several hundred Mbyte). The final result will
+ be much smaller, because compression is used. To
+ avoid running out of memory compression will be done
+ now and then. This can be tuned with the 'mkspellmem'
+ option.
+
+ After the spell file was written and it was being used
+ in a buffer it will be reloaded automatically.
+
+:mksp[ell] [-ascii] {name}.{enc}.add
+ Like ":mkspell" above, using {name}.{enc}.add as the
+ input file and producing an output file in the same
+ directory that has ".spl" appended.
+
+:mksp[ell] [-ascii] {name}
+ Like ":mkspell" above, using {name} as the input file
+ and producing an output file in the same directory
+ that has ".{enc}.spl" appended.
+
+Vim will report the number of duplicate words. This might be a mistake in the
+list of words. But sometimes it is used to have different prefixes and
+suffixes for the same basic word to avoid them combining (e.g. Czech uses
+this). If you want Vim to report all duplicate words set the 'verbose'
+option.
+
+Since you might want to change a Myspell word list for use with Vim the
+following procedure is recommended:
+
+1. Obtain the xx_YY.aff and xx_YY.dic files from Myspell.
+2. Make a copy of these files to xx_YY.orig.aff and xx_YY.orig.dic.
+3. Change the xx_YY.aff and xx_YY.dic files to remove bad words, add missing
+ words, define word characters with FOL/LOW/UPP, etc. The distributed
+ "*.diff" files can be used.
+4. Start Vim with the right locale and use |:mkspell| to generate the Vim
+ spell file.
+5. Try out the spell file with ":set spell spelllang=xx" if you wrote it in
+ a spell directory in 'runtimepath', or ":set spelllang=xx.enc.spl" if you
+ wrote it somewhere else.
+
+When the Myspell files are updated you can merge the differences:
+1. Obtain the new Myspell files as xx_YY.new.aff and xx_UU.new.dic.
+2. Use Vimdiff to see what changed: >
+ vimdiff xx_YY.orig.dic xx_YY.new.dic
+3. Take over the changes you like in xx_YY.dic.
+ You may also need to change xx_YY.aff.
+4. Rename xx_YY.new.dic to xx_YY.orig.dic and xx_YY.new.aff to xx_YY.orig.aff.
+
+
+SPELL FILE VERSIONS *E770* *E771* *E772*
+
+Spell checking is a relatively new feature in Vim, thus it's possible that the
+.spl file format will be changed to support more languages. Vim will check
+the validity of the spell file and report anything wrong.
+
+ E771: Old spell file, needs to be updated ~
+This spell file is older than your Vim. You need to update the .spl file.
+
+ E772: Spell file is for newer version of Vim ~
+This means the spell file was made for a later version of Vim. You need to
+update Vim.
+
+ E770: Unsupported section in spell file ~
+This means the spell file was made for a later version of Vim and contains a
+section that is required for the spell file to work. In this case it's
+probably a good idea to upgrade your Vim.
+
+
+SPELL FILE DUMP
+
+If for some reason you want to check what words are supported by the currently
+used spelling files, use this command:
+
+ *:spelldump* *:spelld*
+:spelld[ump] Open a new window and fill it with all currently valid
+ words. Compound words are not included.
+ Note: For some languages the result may be enormous,
+ causing Vim to run out of memory.
+
+:spelld[ump]! Like ":spelldump" and include the word count. This is
+ the number of times the word was found while
+ updating the screen. Words that are in COMMON items
+ get a starting count of 10.
+
+The format of the word list is used |spell-wordlist-format|. You should be
+able to read it with ":mkspell" to generate one .spl file that includes all
+the words.
+
+When all entries to 'spelllang' use the same regions or no regions at all then
+the region information is included in the dumped words. Otherwise only words
+for the current region are included and no "/regions" line is generated.
+
+Comment lines with the name of the .spl file are used as a header above the
+words that were generated from that .spl file.
+
+
+SPELL FILE MISSING *spell-SpellFileMissing* *spellfile.vim*
+
+If the spell file for the language you are using is not available, you will
+get an error message. But if the "spellfile.vim" plugin is active it will
+offer you to download the spell file. Just follow the instructions, it will
+ask you where to write the file (there must be a writable directory in
+'runtimepath' for this).
+
+The plugin has a default place where to look for spell files, on the Vim ftp
+server. The protocol used is SSL (https://) for security. If you want to use
+another location or another protocol, set the g:spellfile_URL variable to the
+directory that holds the spell files. You can use http:// or ftp://, but you
+are taking a security risk then. The |netrw| plugin is used for getting the
+file, look there for the specific syntax of the URL. Example: >
+ let g:spellfile_URL = 'https://ftp.nluug.nl/vim/runtime/spell'
+You may need to escape special characters.
+
+The plugin will only ask about downloading a language once. If you want to
+try again anyway restart Vim, or set g:spellfile_URL to another value (e.g.,
+prepend a space).
+
+To avoid using the "spellfile.vim" plugin do this in your vimrc file: >
+
+ let loaded_spellfile_plugin = 1
+
+Instead of using the plugin you can define a |SpellFileMissing| autocommand to
+handle the missing file yourself. You can use it like this: >
+
+ :au SpellFileMissing * call Download_spell_file(expand('<amatch>'))
+
+Thus the <amatch> item contains the name of the language. Another important
+value is 'encoding', since every encoding has its own spell file. With two
+exceptions:
+- For ISO-8859-15 (latin9) the name "latin1" is used (the encodings only
+ differ in characters not used in dictionary words).
+- The name "ascii" may also be used for some languages where the words use
+ only ASCII letters for most of the words.
+
+The default "spellfile.vim" plugin uses this autocommand, if you define your
+autocommand afterwards you may want to use ":au! SpellFileMissing" to overrule
+it. If you define your autocommand before the plugin is loaded it will notice
+this and not do anything.
+ *E797*
+Note that the SpellFileMissing autocommand must not change or destroy the
+buffer the user was editing.
+
+==============================================================================
+4. Spell file format *spell-file-format*
+
+This is the format of the files that are used by the person who creates and
+maintains a word list.
+
+Note that we avoid the word "dictionary" here. That is because the goal of
+spell checking differs from writing a dictionary (as in the book). For
+spelling we need a list of words that are OK, thus should not be highlighted.
+Person and company names will not appear in a dictionary, but do appear in a
+word list. And some old words are rarely used while they are common
+misspellings. These do appear in a dictionary but not in a word list.
+
+There are two formats: A straight list of words and a list using affix
+compression. The files with affix compression are used by Myspell (Mozilla
+and OpenOffice.org). This requires two files, one with .aff and one with .dic
+extension.
+
+
+FORMAT OF STRAIGHT WORD LIST *spell-wordlist-format*
+
+The words must appear one per line. That is all that is required.
+
+Additionally the following items are recognized:
+
+- Empty and blank lines are ignored.
+
+ # comment ~
+- Lines starting with a # are ignored (comment lines).
+
+ /encoding=utf-8 ~
+- A line starting with "/encoding=", before any word, specifies the encoding
+ of the file. After the second '=' comes an encoding name. This tells Vim
+ to setup conversion from the specified encoding to 'encoding'. Thus you can
+ use one word list for several target encodings.
+
+ /regions=usca ~
+- A line starting with "/regions=" specifies the region names that are
+ supported. Each region name must be two ASCII letters. The first one is
+ region 1. Thus "/regions=usca" has region 1 "us" and region 2 "ca".
+ In an addition word list the region names should be equal to the main word
+ list!
+
+- Other lines starting with '/' are reserved for future use. The ones that
+ are not recognized are ignored. You do get a warning message, so that you
+ know something won't work.
+
+- A "/" may follow the word with the following items:
+ = Case must match exactly.
+ ? Rare word.
+ ! Bad (wrong) word.
+ 1 to 9 A region in which the word is valid. If no regions are
+ specified the word is valid in all regions.
+
+Example:
+
+ # This is an example word list comment
+ /encoding=latin1 encoding of the file
+ /regions=uscagb regions "us", "ca" and "gb"
+ example word for all regions
+ blah/12 word for regions "us" and "ca"
+ vim/! bad word
+ Campbell/?3 rare word in region 3 "gb"
+ 's mornings/= keep-case word
+
+Note that when "/=" is used the same word with all upper-case letters is not
+accepted. This is different from a word with mixed case that is automatically
+marked as keep-case, those words may appear in all upper-case letters.
+
+
+FORMAT WITH .AFF AND .DIC FILES *aff-dic-format*
+
+There are two files: the basic word list and an affix file. The affix file
+specifies settings for the language and can contain affixes. The affixes are
+used to modify the basic words to get the full word list. This significantly
+reduces the number of words, especially for a language like Polish. This is
+called affix compression.
+
+The basic word list and the affix file are combined with the ":mkspell"
+command and results in a binary spell file. All the preprocessing has been
+done, thus this file loads fast. The binary spell file format is described in
+the source code (src/spell.c). But only developers need to know about it.
+
+The preprocessing also allows us to take the Myspell language files and modify
+them before the Vim word list is made. The tools for this can be found in the
+"src/spell" directory.
+
+The format for the affix and word list files is based on what Myspell uses
+(the spell checker of Mozilla and OpenOffice.org). A description can be found
+here:
+ http://lingucomponent.openoffice.org/affix.readme ~
+Note that affixes are case sensitive, this isn't obvious from the description.
+
+Vim supports quite a few extras. They are described below |spell-affix-vim|.
+Attempts have been made to keep this compatible with other spell checkers, so
+that the same files can often be used. One other project that offers more
+than Myspell is Hunspell ( http://hunspell.sf.net ).
+
+
+WORD LIST FORMAT *spell-dic-format*
+
+A short example, with line numbers:
+
+ 1 1234 ~
+ 2 aan ~
+ 3 Als ~
+ 4 Etten-Leur ~
+ 5 et al. ~
+ 6 's-Gravenhage ~
+ 7 's-Gravenhaags ~
+ 8 # word that differs between regions ~
+ 9 kado/1 ~
+ 10 cadeau/2 ~
+ 11 TCP,IP ~
+ 12 /the S affix may add a 's' ~
+ 13 bedel/S ~
+
+The first line contains the number of words. Vim ignores it, but you do get
+an error message if it's not there. *E760*
+
+What follows is one word per line. White space at the end of the line is
+ignored, all other white space matters. The encoding is specified in the
+affix file |spell-SET|.
+
+Comment lines start with '#' or '/'. See the example lines 8 and 12. Note
+that putting a comment after a word is NOT allowed:
+
+ someword # comment that causes an error! ~
+
+After the word there is an optional slash and flags. Most of these flags are
+letters that indicate the affixes that can be used with this word. These are
+specified with SFX and PFX lines in the .aff file, see |spell-SFX| and
+|spell-PFX|. Vim allows using other flag types with the FLAG item in the
+affix file |spell-FLAG|.
+
+When the word only has lower-case letters it will also match with the word
+starting with an upper-case letter.
+
+When the word includes an upper-case letter, this means the upper-case letter
+is required at this position. The same word with a lower-case letter at this
+position will not match. When some of the other letters are upper-case it will
+not match either.
+
+The word with all upper-case characters will always be OK,
+
+ word list matches does not match ~
+ als als Als ALS ALs AlS aLs aLS
+ Als Als ALS als ALs AlS aLs aLS
+ ALS ALS als Als ALs AlS aLs aLS
+ AlS AlS ALS als Als ALs aLs aLS
+
+The KEEPCASE affix ID can be used to specifically match a word with identical
+case only, see below |spell-KEEPCASE|.
+
+Note: in line 5 to 7 non-word characters are used. You can include any
+character in a word. When checking the text a word still only matches when it
+appears with a non-word character before and after it. For Myspell a word
+starting with a non-word character probably won't work.
+
+In line 12 the word "TCP/IP" is defined. Since the slash has a special
+meaning the comma is used instead. This is defined with the SLASH item in the
+affix file, see |spell-SLASH|. Note that without this SLASH item the word
+will be "TCP,IP".
+
+
+AFFIX FILE FORMAT *spell-aff-format* *spell-affix-vim*
+
+ *spell-affix-comment*
+Comment lines in the .aff file start with a '#':
+
+ # comment line ~
+
+Items with a fixed number of arguments can be followed by a comment. But only
+if none of the arguments can contain white space. The comment must start with
+a "#" character. Example:
+
+ KEEPCASE = # fix case for words with this flag ~
+
+
+ENCODING *spell-SET*
+
+The affix file can be in any encoding that is supported by "iconv". However,
+in some cases the current locale should also be set properly at the time
+|:mkspell| is invoked. Adding FOL/LOW/UPP lines removes this requirement
+|spell-FOL|.
+
+The encoding should be specified before anything where the encoding matters.
+The encoding applies both to the affix file and the dictionary file. It is
+done with a SET line:
+
+ SET utf-8 ~
+
+The encoding can be different from the value of the 'encoding' option at the
+time ":mkspell" is used. Vim will then convert everything to 'encoding' and
+generate a spell file for 'encoding'. If some of the used characters to not
+fit in 'encoding' you will get an error message.
+ *spell-affix-mbyte*
+When using a multibyte encoding it's possible to use more different affix
+flags. But Myspell doesn't support that, thus you may not want to use it
+anyway. For compatibility use an 8-bit encoding.
+
+
+INFORMATION
+
+These entries in the affix file can be used to add information to the spell
+file. There are no restrictions on the format, but they should be in the
+right encoding.
+
+ *spell-NAME* *spell-VERSION* *spell-HOME*
+ *spell-AUTHOR* *spell-EMAIL* *spell-COPYRIGHT*
+ NAME Name of the language
+ VERSION 1.0.1 with fixes
+ HOME http://www.myhome.eu
+ AUTHOR John Doe
+ EMAIL john AT Doe DOT net
+ COPYRIGHT LGPL
+
+These fields are put in the .spl file as-is. The |:spellinfo| command can be
+used to view the info.
+
+ *:spellinfo* *:spelli*
+:spelli[nfo] Display the information for the spell file(s) used for
+ the current buffer.
+
+
+CHARACTER TABLES
+ *spell-affix-chars*
+When using an 8-bit encoding the affix file should define what characters are
+word characters. This is because the system where ":mkspell" is used may not
+support a locale with this encoding and isalpha() won't work. For example
+when using "cp1250" on Unix.
+ *E761* *E762* *spell-FOL*
+ *spell-LOW* *spell-UPP*
+Three lines in the affix file are needed. Simplistic example:
+
+ FOL áëñ ~
+ LOW áëñ ~
+ UPP ÁËÑ ~
+
+All three lines must have exactly the same number of characters.
+
+The "FOL" line specifies the case-folded characters. These are used to
+compare words while ignoring case. For most encodings this is identical to
+the lower case line.
+
+The "LOW" line specifies the characters in lower-case. Mostly it's equal to
+the "FOL" line.
+
+The "UPP" line specifies the characters with upper-case. That is, a character
+is upper-case where it's different from the character at the same position in
+"FOL".
+
+An exception is made for the German sharp s ß. The upper-case version is
+"SS". In the FOL/LOW/UPP lines it should be included, so that it's recognized
+as a word character, but use the ß character in all three.
+
+ASCII characters should be omitted, Vim always handles these in the same way.
+When the encoding is UTF-8 no word characters need to be specified.
+
+ *E763*
+Vim allows you to use spell checking for several languages in the same file.
+You can list them in the 'spelllang' option. As a consequence all spell files
+for the same encoding must use the same word characters, otherwise they can't
+be combined without errors.
+
+If you get an E763 warning that the word tables differ you need to update your
+".spl" spell files. If you downloaded the files, get the latest version of
+all spell files you use. If you are only using one, e.g., German, then also
+download the recent English spell files. Otherwise generate the .spl file
+again with |:mkspell|. If you still get errors check the FOL, LOW and UPP
+lines in the used .aff files.
+
+The XX.ascii.spl spell file generated with the "-ascii" argument will not
+contain the table with characters, so that it can be combine with spell files
+for any encoding. The .add.spl files also do not contain the table.
+
+
+MID-WORD CHARACTERS
+ *spell-midword*
+Some characters are only to be considered word characters if they are used in
+between two ordinary word characters. An example is the single quote: It is
+often used to put text in quotes, thus it can't be recognized as a word
+character, but when it appears in between word characters it must be part of
+the word. This is needed to detect a spelling error such as they'are. That
+should be they're, but since "they" and "are" are words themselves that would
+go unnoticed.
+
+These characters are defined with MIDWORD in the .aff file. Example:
+
+ MIDWORD '- ~
+
+
+FLAG TYPES *spell-FLAG*
+
+Flags are used to specify the affixes that can be used with a word and for
+other properties of the word. Normally single-character flags are used. This
+limits the number of possible flags, especially for 8-bit encodings. The FLAG
+item can be used if more affixes are to be used. Possible values:
+
+ FLAG long use two-character flags
+ FLAG num use numbers, from 1 up to 65000
+ FLAG caplong use one-character flags without A-Z and two-character
+ flags that start with A-Z
+
+With "FLAG num" the numbers in a list of affixes need to be separated with a
+comma: "234,2143,1435". This method is inefficient, but useful if the file is
+generated with a program.
+
+When using "caplong" the two-character flags all start with a capital: "Aa",
+"B1", "BB", etc. This is useful to use one-character flags for the most
+common items and two-character flags for uncommon items.
+
+Note: When using utf-8 only characters up to 65000 may be used for flags.
+
+Note: even when using "num" or "long" the number of flags available to
+compounding and prefixes is limited to about 250.
+
+
+AFFIXES *spell-PFX* *spell-SFX*
+
+The usual PFX (prefix) and SFX (suffix) lines are supported (see the Myspell
+documentation or the Aspell manual:
+http://aspell.net/man-html/Affix-Compression.html).
+
+Summary:
+ SFX L Y 2 ~
+ SFX L 0 re [^x] ~
+ SFX L 0 ro x ~
+
+The first line is a header and has four fields:
+ SFX {flag} {combine} {count}
+
+{flag} The name used for the suffix. Mostly it's a single letter,
+ but other characters can be used, see |spell-FLAG|.
+
+{combine} Can be 'Y' or 'N'. When 'Y' then the word plus suffix can
+ also have a prefix. When 'N' then a prefix is not allowed.
+
+{count} The number of lines following. If this is wrong you will get
+ an error message.
+
+For PFX the fields are exactly the same.
+
+The basic format for the following lines is:
+ SFX {flag} {strip} {add} {condition} {extra}
+
+{flag} Must be the same as the {flag} used in the first line.
+
+{strip} Characters removed from the basic word. There is no check if
+ the characters are actually there, only the length is used (in
+ bytes). This better match the {condition}, otherwise strange
+ things may happen. If the {strip} length is equal to or
+ longer than the basic word the suffix won't be used.
+ When {strip} is 0 (zero) then nothing is stripped.
+
+{add} Characters added to the basic word, after removing {strip}.
+ Optionally there is a '/' followed by flags. The flags apply
+ to the word plus affix. See |spell-affix-flags|
+
+{condition} A simplistic pattern. Only when this matches with a basic
+ word will the suffix be used for that word. This is normally
+ for using one suffix letter with different {add} and {strip}
+ fields for words with different endings.
+ When {condition} is a . (dot) there is no condition.
+ The pattern may contain:
+ - Literal characters.
+ - A set of characters in []. [abc] matches a, b and c.
+ A dash is allowed for a range [a-c], but this is
+ Vim-specific.
+ - A set of characters that starts with a ^, meaning the
+ complement of the specified characters. [^abc] matches any
+ character but a, b and c.
+
+{extra} Optional extra text:
+ # comment Comment is ignored
+ - Hunspell uses this, ignored
+
+For PFX the fields are the same, but the {strip}, {add} and {condition} apply
+to the start of the word.
+
+Note: Myspell ignores any extra text after the relevant info. Vim requires
+this text to start with a "#" so that mistakes don't go unnoticed. Example:
+
+ SFX F 0 in [^i]n # Spion > Spionin ~
+ SFX F 0 nen in # Bauerin > Bauerinnen ~
+
+However, to avoid lots of errors in affix files written for Myspell, you can
+add the IGNOREEXTRA flag.
+
+Apparently Myspell allows an affix name to appear more than once. Since this
+might also be a mistake, Vim checks for an extra "S". The affix files for
+Myspell that use this feature apparently have this flag. Example:
+
+ SFX a Y 1 S ~
+ SFX a 0 an . ~
+
+ SFX a Y 2 S ~
+ SFX a 0 en . ~
+ SFX a 0 on . ~
+
+
+AFFIX FLAGS *spell-affix-flags*
+
+This is a feature that comes from Hunspell: The affix may specify flags. This
+works similar to flags specified on a basic word. The flags apply to the
+basic word plus the affix (but there are restrictions). Example:
+
+ SFX S Y 1 ~
+ SFX S 0 s . ~
+
+ SFX A Y 1 ~
+ SFX A 0 able/S . ~
+
+When the dictionary file contains "drink/AS" then these words are possible:
+
+ drink
+ drinks uses S suffix
+ drinkable uses A suffix
+ drinkables uses A suffix and then S suffix
+
+Generally the flags of the suffix are added to the flags of the basic word,
+both are used for the word plus suffix. But the flags of the basic word are
+only used once for affixes, except that both one prefix and one suffix can be
+used when both support combining.
+
+Specifically, the affix flags can be used for:
+- Suffixes on suffixes, as in the example above. This works once, thus you
+ can have two suffixes on a word (plus one prefix).
+- Making the word with the affix rare, by using the |spell-RARE| flag.
+- Exclude the word with the affix from compounding, by using the
+ |spell-COMPOUNDFORBIDFLAG| flag.
+- Allow the word with the affix to be part of a compound word on the side of
+ the affix with the |spell-COMPOUNDPERMITFLAG|.
+- Use the NEEDCOMPOUND flag: word plus affix can only be used as part of a
+ compound word. |spell-NEEDCOMPOUND|
+- Compound flags: word plus affix can be part of a compound word at the end,
+ middle, start, etc. The flags are combined with the flags of the basic
+ word. |spell-compound|
+- NEEDAFFIX: another affix is needed to make a valid word.
+- CIRCUMFIX, as explained just below.
+
+
+IGNOREEXTRA *spell-IGNOREEXTRA*
+
+Normally Vim gives an error for an extra field that does not start with '#'.
+This avoids errors going unnoticed. However, some files created for Myspell
+or Hunspell may contain many entries with an extra field. Use the IGNOREEXTRA
+flag to avoid lots of errors.
+
+
+CIRCUMFIX *spell-CIRCUMFIX*
+
+The CIRCUMFIX flag means a prefix and suffix must be added at the same time.
+If a prefix has the CIRCUMFIX flag then only suffixes with the CIRCUMFIX flag
+can be added, and the other way around.
+An alternative is to only specify the suffix, and give that suffix two flags:
+the required prefix and the NEEDAFFIX flag. |spell-NEEDAFFIX|
+
+
+PFXPOSTPONE *spell-PFXPOSTPONE*
+
+When an affix file has very many prefixes that apply to many words it's not
+possible to build the whole word list in memory. This applies to Hebrew (a
+list with all words is over a Gbyte). In that case applying prefixes must be
+postponed. This makes spell checking slower. It is indicated by this keyword
+in the .aff file:
+
+ PFXPOSTPONE ~
+
+Only prefixes without a chop string and without flags can be postponed.
+Prefixes with a chop string or with flags will still be included in the word
+list. An exception if the chop string is one character and equal to the last
+character of the added string, but in lower case. Thus when the chop string
+is used to allow the following word to start with an upper case letter.
+
+
+WORDS WITH A SLASH *spell-SLASH*
+
+The slash is used in the .dic file to separate the basic word from the affix
+letters and other flags. Unfortunately, this means you cannot use a slash in
+a word. Thus "TCP/IP" is not a word but "TCP" with the flags "IP". To include
+a slash in the word put a backslash before it: "TCP\/IP". In the rare case
+you want to use a backslash inside a word you need to use two backslashes.
+Any other use of the backslash is reserved for future expansion.
+
+
+KEEP-CASE WORDS *spell-KEEPCASE*
+
+In the affix file a KEEPCASE line can be used to define the affix name used
+for keep-case words. Example:
+
+ KEEPCASE = ~
+
+This flag is not supported by Myspell. It has the meaning that case matters.
+This can be used if the word does not have the first letter in upper case at
+the start of a sentence. Example:
+
+ word list matches does not match ~
+ 's morgens/= 's morgens 'S morgens 's Morgens 'S MORGENS
+ 's Morgens 's Morgens 'S MORGENS 'S morgens 's morgens
+
+The flag can also be used to avoid that the word matches when it is in all
+upper-case letters.
+
+
+RARE WORDS *spell-RARE*
+
+In the affix file a RARE line can be used to define the affix name used for
+rare words. Example:
+
+ RARE ? ~
+
+Rare words are highlighted differently from bad words. This is to be used for
+words that are correct for the language, but are hardly ever used and could be
+a typing mistake anyway. When the same word is found as good it won't be
+highlighted as rare.
+
+This flag can also be used on an affix, so that a basic word is not rare but
+the basic word plus affix is rare |spell-affix-flags|. However, if the word
+also appears as a good word in another way (e.g., in another region) it won't
+be marked as rare.
+
+
+BAD WORDS *spell-BAD*
+
+In the affix file a BAD line can be used to define the affix name used for
+bad words. Example:
+
+ BAD ! ~
+
+This can be used to exclude words that would otherwise be good. For example
+"the the" in the .dic file:
+
+ the the/! ~
+
+Once a word has been marked as bad it won't be undone by encountering the same
+word as good.
+
+The flag also applies to the word with affixes, thus this can be used to mark
+a whole bunch of related words as bad.
+
+ *spell-FORBIDDENWORD*
+FORBIDDENWORD can be used just like BAD. For compatibility with Hunspell.
+
+ *spell-NEEDAFFIX*
+The NEEDAFFIX flag is used to require that a word is used with an affix. The
+word itself is not a good word (unless there is an empty affix). Example:
+
+ NEEDAFFIX + ~
+
+
+COMPOUND WORDS *spell-compound*
+
+A compound word is a longer word made by concatenating words that appear in
+the .dic file. To specify which words may be concatenated a character is
+used. This character is put in the list of affixes after the word. We will
+call this character a flag here. Obviously these flags must be different from
+any affix IDs used.
+
+ *spell-COMPOUNDFLAG*
+The Myspell compatible method uses one flag, specified with COMPOUNDFLAG. All
+words with this flag combine in any order. This means there is no control
+over which word comes first. Example:
+ COMPOUNDFLAG c ~
+
+ *spell-COMPOUNDRULE*
+A more advanced method to specify how compound words can be formed uses
+multiple items with multiple flags. This is not compatible with Myspell 3.0.
+Let's start with an example:
+ COMPOUNDRULE c+ ~
+ COMPOUNDRULE se ~
+
+The first line defines that words with the "c" flag can be concatenated in any
+order. The second line defines compound words that are made of one word with
+the "s" flag and one word with the "e" flag. With this dictionary:
+ bork/c ~
+ onion/s ~
+ soup/e ~
+
+You can make these words:
+ bork
+ borkbork
+ borkborkbork
+ (etc.)
+ onion
+ soup
+ onionsoup
+
+The COMPOUNDRULE item may appear multiple times. The argument is made out of
+one or more groups, where each group can be:
+ one flag e.g., c
+ alternate flags inside [] e.g., [abc]
+Optionally this may be followed by:
+ * the group appears zero or more times, e.g., sm*e
+ + the group appears one or more times, e.g., c+
+ ? the group appears zero times or once, e.g., x?
+
+This is similar to the regexp pattern syntax (but not the same!). A few
+examples with the sequence of word flags they require:
+ COMPOUNDRULE x+ x xx xxx etc.
+ COMPOUNDRULE yz yz
+ COMPOUNDRULE x+z xz xxz xxxz etc.
+ COMPOUNDRULE yx+ yx yxx yxxx etc.
+ COMPOUNDRULE xy?z xz xyz
+
+ COMPOUNDRULE [abc]z az bz cz
+ COMPOUNDRULE [abc]+z az aaz abaz bz baz bcbz cz caz cbaz etc.
+ COMPOUNDRULE a[xyz]+ ax axx axyz ay ayx ayzz az azy azxy etc.
+ COMPOUNDRULE sm*e se sme smme smmme etc.
+ COMPOUNDRULE s[xyz]*e se sxe sxye sxyxe sye syze sze szye szyxe etc.
+
+A specific example: Allow a compound to be made of two words and a dash:
+ In the .aff file:
+ COMPOUNDRULE sde ~
+ NEEDAFFIX x ~
+ COMPOUNDWORDMAX 3 ~
+ COMPOUNDMIN 1 ~
+ In the .dic file:
+ start/s ~
+ end/e ~
+ -/xd ~
+
+This allows for the word "start-end", but not "startend".
+
+An additional implied rule is that, without further flags, a word with a
+prefix cannot be compounded after another word, and a word with a suffix
+cannot be compounded with a following word. Thus the affix cannot appear
+on the inside of a compound word. This can be changed with the
+|spell-COMPOUNDPERMITFLAG|.
+
+ *spell-NEEDCOMPOUND*
+The NEEDCOMPOUND flag is used to require that a word is used as part of a
+compound word. The word itself is not a good word. Example:
+
+ NEEDCOMPOUND & ~
+
+ *spell-ONLYINCOMPOUND*
+The ONLYINCOMPOUND does exactly the same as NEEDCOMPOUND. Supported for
+compatibility with Hunspell.
+
+ *spell-COMPOUNDMIN*
+The minimal character length of a word used for compounding is specified with
+COMPOUNDMIN. Example:
+ COMPOUNDMIN 5 ~
+
+When omitted there is no minimal length. Obviously you could just leave out
+the compound flag from short words instead, this feature is present for
+compatibility with Myspell.
+
+ *spell-COMPOUNDWORDMAX*
+The maximum number of words that can be concatenated into a compound word is
+specified with COMPOUNDWORDMAX. Example:
+ COMPOUNDWORDMAX 3 ~
+
+When omitted there is no maximum. It applies to all compound words.
+
+To set a limit for words with specific flags make sure the items in
+COMPOUNDRULE where they appear don't allow too many words.
+
+ *spell-COMPOUNDSYLMAX*
+The maximum number of syllables that a compound word may contain is specified
+with COMPOUNDSYLMAX. Example:
+ COMPOUNDSYLMAX 6 ~
+
+This has no effect if there is no SYLLABLE item. Without COMPOUNDSYLMAX there
+is no limit on the number of syllables.
+
+If both COMPOUNDWORDMAX and COMPOUNDSYLMAX are defined, a compound word is
+accepted if it fits one of the criteria, thus is either made from up to
+COMPOUNDWORDMAX words or contains up to COMPOUNDSYLMAX syllables.
+
+ *spell-COMPOUNDFORBIDFLAG*
+The COMPOUNDFORBIDFLAG specifies a flag that can be used on an affix. It
+means that the word plus affix cannot be used in a compound word. Example:
+ affix file:
+ COMPOUNDFLAG c ~
+ COMPOUNDFORBIDFLAG x ~
+ SFX a Y 2 ~
+ SFX a 0 s . ~
+ SFX a 0 ize/x . ~
+ dictionary:
+ word/c ~
+ util/ac ~
+
+This allows for "wordutil" and "wordutils" but not "wordutilize".
+Note: this doesn't work for postponed prefixes yet.
+
+ *spell-COMPOUNDPERMITFLAG*
+The COMPOUNDPERMITFLAG specifies a flag that can be used on an affix. It
+means that the word plus affix can also be used in a compound word in a way
+where the affix ends up halfway the word. Without this flag that is not
+allowed.
+Note: this doesn't work for postponed prefixes yet.
+
+ *spell-COMPOUNDROOT*
+The COMPOUNDROOT flag is used for words in the dictionary that are already a
+compound. This means it counts for two words when checking the compounding
+rules. Can also be used for an affix to count the affix as a compounding
+word.
+
+ *spell-CHECKCOMPOUNDPATTERN*
+CHECKCOMPOUNDPATTERN is used to define patterns that, when matching at the
+position where two words are compounded together forbids the compound.
+For example:
+ CHECKCOMPOUNDPATTERN o e ~
+
+This forbids compounding if the first word ends in "o" and the second word
+starts with "e".
+
+The arguments must be plain text, no patterns are actually supported, despite
+the item name. Case is always ignored.
+
+The Hunspell feature to use three arguments and flags is not supported.
+
+ *spell-NOCOMPOUNDSUGS*
+This item indicates that using compounding to make suggestions is not a good
+idea. Use this when compounding is used with very short or one-character
+words. E.g. to make numbers out of digits. Without this flag creating
+suggestions would spend most time trying all kind of weird compound words.
+
+ NOCOMPOUNDSUGS ~
+
+ *spell-SYLLABLE*
+The SYLLABLE item defines characters or character sequences that are used to
+count the number of syllables in a word. Example:
+ SYLLABLE aáeéiíoóöõuúüûy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui ~
+
+Before the first slash is the set of characters that are counted for one
+syllable, also when repeated and mixed, until the next character that is not
+in this set. After the slash come sequences of characters that are counted
+for one syllable. These are preferred over using characters from the set.
+With the example "ideeen" has three syllables, counted by "i", "ee" and "e".
+
+Only case-folded letters need to be included.
+
+Another way to restrict compounding was mentioned above: Adding the
+|spell-COMPOUNDFORBIDFLAG| flag to an affix causes all words that are made
+with that affix to not be used for compounding.
+
+
+UNLIMITED COMPOUNDING *spell-NOBREAK*
+
+For some languages, such as Thai, there is no space in between words. This
+looks like all words are compounded. To specify this use the NOBREAK item in
+the affix file, without arguments:
+ NOBREAK ~
+
+Vim will try to figure out where one word ends and a next starts. When there
+are spelling mistakes this may not be quite right.
+
+
+ *spell-COMMON*
+Common words can be specified with the COMMON item. This will give better
+suggestions when editing a short file. Example:
+
+ COMMON the of to and a in is it you that he she was for on are ~
+
+The words must be separated by white space, up to 25 per line.
+When multiple regions are specified in a ":mkspell" command the common words
+for all regions are combined and used for all regions.
+
+ *spell-NOSPLITSUGS*
+This item indicates that splitting a word to make suggestions is not a good
+idea. Split-word suggestions will appear only when there are few similar
+words.
+
+ NOSPLITSUGS ~
+
+ *spell-NOSUGGEST*
+The flag specified with NOSUGGEST can be used for words that will not be
+suggested. Can be used for obscene words.
+
+ NOSUGGEST % ~
+
+
+REPLACEMENTS *spell-REP*
+
+In the affix file REP items can be used to define common mistakes. This is
+used to make spelling suggestions. The items define the "from" text and the
+"to" replacement. Example:
+
+ REP 4 ~
+ REP f ph ~
+ REP ph f ~
+ REP k ch ~
+ REP ch k ~
+
+The first line specifies the number of REP lines following. Vim ignores the
+number, but it must be there (for compatibility with Myspell).
+
+Don't include simple one-character replacements or swaps. Vim will try these
+anyway. You can include whole words if you want to, but you might want to use
+the "file:" item in 'spellsuggest' instead.
+
+You can include a space by using an underscore:
+
+ REP the_the the ~
+
+
+SIMILAR CHARACTERS *spell-MAP* *E783*
+
+In the affix file MAP items can be used to define letters that are very much
+alike. This is mostly used for a letter with different accents. This is used
+to prefer suggestions with these letters substituted. Example:
+
+ MAP 2 ~
+ MAP eéëêè ~
+ MAP uüùúû ~
+
+The first line specifies the number of MAP lines following. Vim ignores the
+number, but the line must be there.
+
+Each letter must appear in only one of the MAP items. It's a bit more
+efficient if the first letter is ASCII or at least one without accents.
+
+
+.SUG FILE *spell-NOSUGFILE*
+
+When soundfolding is specified in the affix file then ":mkspell" will normally
+produce a .sug file next to the .spl file. This file is used to find
+suggestions by their sound-a-like form quickly. At the cost of a lot of
+memory (the amount depends on the number of words, |:mkspell| will display an
+estimate when it's done).
+
+To avoid producing a .sug file use this item in the affix file:
+
+ NOSUGFILE ~
+
+Users can simply omit the .sug file if they don't want to use it.
+
+
+SOUND-A-LIKE *spell-SAL*
+
+In the affix file SAL items can be used to define the sounds-a-like mechanism
+to be used. The main items define the "from" text and the "to" replacement.
+Simplistic example:
+
+ SAL CIA X ~
+ SAL CH X ~
+ SAL C K ~
+ SAL K K ~
+
+There are a few rules and this can become quite complicated. An explanation
+how it works can be found in the Aspell manual:
+http://aspell.net/man-html/Phonetic-Code.html.
+
+There are a few special items:
+
+ SAL followup true ~
+ SAL collapse_result true ~
+ SAL remove_accents true ~
+
+"1" has the same meaning as "true". Any other value means "false".
+
+
+SIMPLE SOUNDFOLDING *spell-SOFOFROM* *spell-SOFOTO*
+
+The SAL mechanism is complex and slow. A simpler mechanism is mapping all
+characters to another character, mapping similar sounding characters to the
+same character. At the same time this does case folding. You can not have
+both SAL items and simple soundfolding.
+
+There are two items required: one to specify the characters that are mapped
+and one that specifies the characters they are mapped to. They must have
+exactly the same number of characters. Example:
+
+ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ~
+ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkes ~
+
+In the example all vowels are mapped to the same character 'e'. Another
+method would be to leave out all vowels. Some characters that sound nearly
+the same and are often mixed up, such as 'm' and 'n', are mapped to the same
+character. Don't do this too much, all words will start looking alike.
+
+Characters that do not appear in SOFOFROM will be left out, except that all
+white space is replaced by one space. Sequences of the same character in
+SOFOFROM are replaced by one.
+
+You can use the |soundfold()| function to try out the results. Or set the
+'verbose' option to see the score in the output of the |z=| command.
+
+
+UNSUPPORTED ITEMS *spell-affix-not-supported*
+
+These items appear in the affix file of other spell checkers. In Vim they are
+ignored, not supported or defined in another way.
+
+ACCENT (Hunspell) *spell-ACCENT*
+ Use MAP instead. |spell-MAP|
+
+BREAK (Hunspell) *spell-BREAK*
+ Define break points. Unclear how it works exactly.
+ Not supported.
+
+CHECKCOMPOUNDCASE (Hunspell) *spell-CHECKCOMPOUNDCASE*
+ Disallow uppercase letters at compound word boundaries.
+ Not supported.
+
+CHECKCOMPOUNDDUP (Hunspell) *spell-CHECKCOMPOUNDDUP*
+ Disallow using the same word twice in a compound. Not
+ supported.
+
+CHECKCOMPOUNDREP (Hunspell) *spell-CHECKCOMPOUNDREP*
+ Something about using REP items and compound words. Not
+ supported.
+
+CHECKCOMPOUNDTRIPLE (Hunspell) *spell-CHECKCOMPOUNDTRIPLE*
+ Forbid three identical characters when compounding. Not
+ supported.
+
+CHECKSHARPS (Hunspell) *spell-CHECKSHARPS*
+ SS letter pair in uppercased (German) words may be upper case
+ sharp s (ß). Not supported.
+
+COMPLEXPREFIXES (Hunspell) *spell-COMPLEXPREFIXES*
+ Enables using two prefixes. Not supported.
+
+COMPOUND (Hunspell) *spell-COMPOUND*
+ This is one line with the count of COMPOUND items, followed by
+ that many COMPOUND lines with a pattern.
+ Remove the first line with the count and rename the other
+ items to COMPOUNDRULE |spell-COMPOUNDRULE|
+
+COMPOUNDFIRST (Hunspell) *spell-COMPOUNDFIRST*
+ Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
+
+COMPOUNDBEGIN (Hunspell) *spell-COMPOUNDBEGIN*
+ Words signed with COMPOUNDBEGIN may be first elements in
+ compound words.
+ Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
+
+COMPOUNDLAST (Hunspell) *spell-COMPOUNDLAST*
+ Words signed with COMPOUNDLAST may be last elements in
+ compound words.
+ Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
+
+COMPOUNDEND (Hunspell) *spell-COMPOUNDEND*
+ Probably the same as COMPOUNDLAST
+
+COMPOUNDMIDDLE (Hunspell) *spell-COMPOUNDMIDDLE*
+ Words signed with COMPOUNDMIDDLE may be middle elements in
+ compound words.
+ Use COMPOUNDRULE instead. |spell-COMPOUNDRULE|
+
+COMPOUNDRULES (Hunspell) *spell-COMPOUNDRULES*
+ Number of COMPOUNDRULE lines following. Ignored, but the
+ argument must be a number.
+
+COMPOUNDSYLLABLE (Hunspell) *spell-COMPOUNDSYLLABLE*
+ Use SYLLABLE and COMPOUNDSYLMAX instead. |spell-SYLLABLE|
+ |spell-COMPOUNDSYLMAX|
+
+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,
+ therefore Vim does not support it. Each language property
+ must be specified separately.
+
+LEMMA_PRESENT (Hunspell) *spell-LEMMA_PRESENT*
+ Only needed for morphological analysis.
+
+MAXNGRAMSUGS (Hunspell) *spell-MAXNGRAMSUGS*
+ Set number of n-gram suggestions. Not supported.
+
+PSEUDOROOT (Hunspell) *spell-PSEUDOROOT*
+ Use NEEDAFFIX instead. |spell-NEEDAFFIX|
+
+SUGSWITHDOTS (Hunspell) *spell-SUGSWITHDOTS*
+ Adds dots to suggestions. Vim doesn't need this.
+
+SYLLABLENUM (Hunspell) *spell-SYLLABLENUM*
+ Not supported.
+
+TRY (Myspell, Hunspell, others) *spell-TRY*
+ Vim does not use the TRY item, it is ignored. For making
+ suggestions the actual characters in the words are used, that
+ is much more efficient.
+
+WORDCHARS (Hunspell) *spell-WORDCHARS*
+ Used to recognize words. Vim doesn't need it, because there
+ is no need to separate words before checking them (using a
+ trie instead of a hashtable).
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/sponsor.txt b/runtime/doc/sponsor.txt
new file mode 100644
index 0000000..51d6c16
--- /dev/null
+++ b/runtime/doc/sponsor.txt
@@ -0,0 +1,202 @@
+*sponsor.txt* For Vim version 9.0. Last change: 2022 May 26
+
+
+ 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 does not need the money it will be used to help children in Uganda,
+see |uganda|. 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.
+
+
+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:noet:ft=help:norl:
diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt
new file mode 100644
index 0000000..5993f65
--- /dev/null
+++ b/runtime/doc/starting.txt
@@ -0,0 +1,1707 @@
+*starting.txt* For Vim version 9.0. Last change: 2022 Nov 30
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Starting Vim *starting*
+
+1. Vim arguments |vim-arguments|
+2. Vim on the Amiga |starting-amiga|
+3. Running eVim |evim-keys|
+4. Initialization |initialization|
+5. $VIM and $VIMRUNTIME |$VIM|
+6. Suspending |suspend|
+7. Exiting |exiting|
+8. Saving settings |save-settings|
+9. Views and Sessions |views-sessions|
+10. The viminfo file |viminfo-file|
+
+==============================================================================
+1. Vim arguments *vim-arguments*
+
+Most often, Vim is started to edit a single file with the command
+
+ vim filename *-vim*
+
+More generally, Vim is started with:
+
+ vim [option | filename] ..
+
+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.
+
+For compatibility with various Vi versions, see |cmdline-arguments|.
+
+Exactly one out of the following five items may be used to choose how to
+start editing:
+
+ *-file* *---*
+filename One or more file names. The first one will be the current
+ file and read into the buffer. The cursor will be positioned
+ on the first line of the buffer.
+ To avoid a file name starting with a '-' being interpreted as
+ an option, precede the arglist with "--", e.g.: >
+ vim -- -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: >
+ vim -
+ ex -v -
+< 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 | vim -
+
+< The buffer will be marked as modified, so that you are
+ reminded to save the text when trying to exit. If you don't
+ like that, put this these lines in your vimrc: >
+ " Don't set 'modified' when reading from stdin
+ au StdinReadPost * set nomodified
+<
+ Starting in Ex mode: >
+ ex -
+ vim -e -
+ exim -
+ vim -E
+< Start editing in silent mode. See |-s-ex|.
+
+ *-t* *-tag*
+-t {tag} A tag. "tag" is looked up in the tags file, the associated
+ file becomes the current file, and the associated command is
+ executed. Mostly this is used for C programs, in which case
+ "tag" often is a function name. The effect is that the file
+ containing that function becomes the current file and the
+ cursor is positioned on the start of the function (see
+ |tags|).
+
+ *-q* *-qf*
+-q [errorfile] QuickFix mode. The file with the name [errorfile] is read
+ and the first error is displayed. See |quickfix|.
+ If [errorfile] is not given, the 'errorfile' option is used
+ for the file name. See 'errorfile' for the default value.
+
+(nothing) Without one of the four items above, Vim will start editing a
+ new buffer. It's empty and doesn't have a file name.
+
+
+The startup mode can be changed by using another name instead of "vim", which
+is equal to giving options:
+ex vim -e Start in Ex mode (see |Ex-mode|). *ex*
+exim vim -E Start in improved Ex mode (see |Ex-mode|). *exim*
+ (normally not installed)
+view vim -R Start in read-only mode (see |-R|). *view*
+gvim vim -g Start the GUI (see |gui|). *gvim*
+gex vim -eg Start the GUI in Ex mode. *gex*
+gview vim -Rg Start the GUI in read-only mode. *gview*
+rvim vim -Z Like "vim", but in restricted mode (see |-Z|) *rvim*
+rview vim -RZ Like "view", but in restricted mode. *rview*
+rgvim vim -gZ Like "gvim", but in restricted mode. *rgvim*
+rgview vim -RgZ Like "gview", but in restricted mode. *rgview*
+evim vim -y Easy Vim: set 'insertmode' (see |-y|) *evim*
+eview vim -yR Like "evim" in read-only mode *eview*
+vimdiff vim -d Start in diff mode |diff-mode|
+gvimdiff vim -gd Start in diff mode |diff-mode|
+
+Additional characters may follow, they are ignored. For example, you can have
+"gvim-8" to start the GUI. You must have an executable by that name then, of
+course.
+
+On Unix, you would normally have one executable called Vim, and links from the
+different startup-names to that executable. If your system does not support
+links and you do not want to have several copies of the executable, you could
+use an alias instead. For example: >
+ alias view vim -R
+ alias gvim vim -g
+<
+ *startup-options*
+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.
+
+On VMS all option arguments are assumed to be lowercase, unless preceded with
+a slash. Thus "-R" means recovery and "-/R" readonly.
+
+--help *-h* *--help* *-?*
+-?
+-h Give usage (help) message and exit.
+ See |info-message| about capturing the text.
+
+ *--version*
+--version Print version information and exit. Same output as for
+ |:version| command.
+ See |info-message| about capturing the text.
+
+ *--noplugin*
+--noplugin Skip loading plugins. Resets the 'loadplugins' option.
+
+ Note that the |-u| argument may also disable loading plugins:
+ argument load: vimrc files plugins defaults.vim ~
+ (nothing) yes yes yes
+ -u NONE no no no
+ -u DEFAULTS no no yes
+ -u NORC no yes no
+ --noplugin yes no yes
+
+--startuptime {fname} *--startuptime*
+ During startup write timing messages to the file {fname}.
+ This can be used to find out where time is spent while loading
+ your .vimrc, plugins and opening the first file.
+ When {fname} already exists new messages are appended.
+ {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
+ positioned on the last line.
+
+ *-+/*
++/{pat} The cursor will be positioned on the first line containing
+ "pat" in the first file being edited (see |pattern| for the
+ available search patterns). The search starts at the cursor
+ position, which can be the first line or the cursor position
+ last used from |viminfo|. To force a search from the first
+ line use "+1 +/pat".
+
++{command} *-+c* *-c*
+-c {command} {command} will be executed after the first file has been
+ read (and after autocommands and modelines for that file have
+ been processed). "command" is interpreted as an Ex command.
+ If the "command" contains spaces, it must be enclosed in
+ double quotes (this depends on the shell that is used).
+ Example: >
+ vim "+set si" main.c
+ vim "+find stdio.h"
+ vim -c "set ff=dos" -c wq mine.mak
+<
+ Note: You can use up to 10 "+" or "-c" arguments in a Vim
+ command. They are executed in the order given. A "-S"
+ argument counts as a "-c" argument as well.
+
+--cmd {command} *--cmd*
+ {command} will be executed before processing any vimrc file.
+ Otherwise it acts like -c {command}. You can use up to 10 of
+ these commands, independently from "-c" commands.
+
+ *-S*
+-S {file} The {file} will be sourced after the first file has been read.
+ This is an easy way to do the equivalent of: >
+ -c "source {file}"
+< It can be mixed with "-c" arguments and repeated like "-c".
+ The limit of 10 "-c" arguments applies here as well.
+ {file} cannot start with a "-".
+
+ Do not use this for running a script to do some work and exit
+ Vim, you won't see error messages. Use |-u| instead.
+
+-S Works like "-S Session.vim". Only when used as the last
+ argument or when another "-" option follows.
+
+ *-r*
+-r Recovery mode. Without a file name argument, a list of
+ existing swap files is given. With a file name, a swap file
+ is read to recover a crashed editing session. See
+ |crash-recovery|.
+
+ *-L*
+-L Same as -r.
+
+ *-R*
+-R Readonly mode. The 'readonly' option will be set for all the
+ files being edited. You can still edit the buffer, but will
+ be prevented from accidentally overwriting a file. If you
+ forgot that you are in View mode and did make some changes,
+ you can overwrite a file by adding an exclamation mark to
+ the Ex command, as in ":w!". The 'readonly' option can be
+ reset with ":set noro" (see the options chapter, |options|).
+ Subsequent edits will not be done in readonly mode. Calling
+ 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
+ will be reset, so that writing files is disabled. However,
+ the 'write' option can be set to enable writing again.
+
+ *-M*
+-M Modifications not allowed. The 'modifiable' option will be
+ reset, so that changes are not allowed. The 'write' option
+ will be reset, so that writing files is disabled. However,
+ the 'modifiable' and 'write' options can be set to enable
+ changes and writing.
+
+ *-Z* *restricted-mode* *E145* *E981*
+-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
+ and libcall().
+ Also disallowed are delete(), rename(), mkdir(), job_start(),
+ etc.
+ Interfaces, such as Python, Ruby and Lua, are also disabled,
+ since they could be used to execute shell commands. Perl uses
+ the Safe module.
+ For Unix restricted mode is used when the last part of $SHELL
+ is "nologin" or "false".
+ Note that the user may still find a loophole to execute a
+ shell command, it has only been made difficult.
+
+ *-g*
+-g Start Vim in GUI mode. See |gui|. For the opposite see |-v|.
+
+ *-v*
+-v Start Ex in Vi mode. Only makes a difference when the
+ executable is called "ex" or "gvim". For gvim the GUI is not
+ started if possible.
+
+ *-e*
+-e Start Vim in Ex mode, see |Ex-mode|. Only makes a difference
+ when the executable is not called "ex".
+
+ *-E*
+-E Start Vim in improved Ex mode |gQ|. Only makes a difference
+ when the executable is not called "exim".
+
+ *-s-ex*
+-s Silent or batch mode. Only when Vim was started as "ex" or
+ when preceded with 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):
+ :print
+ :list
+ :number
+ :set to display option values.
+ When 'verbose' is non-zero messages are printed (for
+ debugging, to stderr).
+ 'term' and $TERM are 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).
+ Example: >
+ vim -e -s < thefilter thefile
+< For the opposite, to see errors from the script, execute the
+ file with the |-u| flag: >
+ vim -u thefilter thefile
+<
+ *-b*
+-b Binary mode. File I/O will only recognize <NL> to separate
+ lines. The 'expandtab' option will be reset. The 'textwidth'
+ option is set to 0. 'modeline' is reset. The 'binary' option
+ is set. This is done after reading the vimrc/exrc files but
+ before reading any file in the arglist. See also
+ |edit-binary|.
+
+ *-l*
+-l Lisp mode. Sets the 'lisp' and 'showmatch' options on.
+
+ *-A*
+-A Arabic mode. Sets the 'arabic' option on. {only when
+ compiled with the |+arabic| features (which include
+ |+rightleft|), otherwise Vim gives an error message
+ and exits}
+
+ *-F*
+-F This was used for Farsi mode, which has been removed.
+ See |farsi.txt|.
+
+ *-H*
+-H Hebrew mode. Sets the 'hkmap' and 'rightleft' options on.
+ {only when compiled with the |+rightleft| feature, otherwise
+ Vim gives an error message and exits}
+
+ *-V* *verbose*
+-V[N] Verbose. Sets the 'verbose' option to [N] (default: 10).
+ Messages will be given for each file that is ":source"d and
+ for reading or writing a viminfo file. Can be used to find
+ out what is happening upon startup and exit.
+ Example: >
+ vim -V8 foobar
+
+-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.
+ Example: >
+ vim -V20vimlog foobar
+<
+--log {filename} *--log*
+ Start logging and write entries to {filename}.
+ This works like calling `ch_logfile({filename}, 'ao')` very
+ early during startup.
+ {only available with the |+eval| feature}
+
+ *-D*
+-D Debugging. Go to debugging mode when executing the first
+ command from a script. |debug-mode|
+ {not available when compiled without the |+eval| feature}
+
+ *-C*
+-C Compatible mode. Sets the 'compatible' option. You can use
+ this to get 'compatible', even though a .vimrc file exists.
+ Keep in mind that the command ":set nocompatible" in some
+ plugin or startup script overrules this, so you may end up
+ with 'nocompatible' anyway. To find out, use: >
+ :verbose set compatible?
+< Several plugins won't work with 'compatible' set. You may
+ want to set it after startup this way: >
+ vim "+set cp" filename
+< Also see |compatible-default|.
+
+ *-N*
+-N Not compatible mode. Resets the 'compatible' option. You can
+ use this to get 'nocompatible', when there is no .vimrc file
+ or when using "-u NONE".
+ Also see |compatible-default|.
+
+ *-y* *easy*
+-y Easy mode. Implied for |evim| and |eview|. Starts with
+ 'insertmode' set and behaves like a click-and-type editor.
+ This sources the script $VIMRUNTIME/evim.vim. Mappings are
+ set up to work like most click-and-type editors, see
+ |evim-keys|. The GUI is started when available.
+
+ *-n*
+-n No swap file will be used. Recovery after a crash will be
+ impossible. Handy if you want to view or edit a file on a
+ very slow medium (e.g., a floppy).
+ Can also be done with ":set updatecount=0". You can switch it
+ on again by setting the 'updatecount' option to some value,
+ e.g., ":set uc=100".
+ NOTE: Don't combine -n with -b, making -nb, because that has a
+ different meaning: |-nb|.
+ 'updatecount' is set to 0 AFTER executing commands from a
+ vimrc file, but before the GUI initializations. Thus it
+ overrides a setting for 'updatecount' in a vimrc file, but not
+ in a gvimrc file. See |startup|.
+ When you want to reduce accesses to the disk (e.g., for a
+ laptop), don't use "-n", but set 'updatetime' and
+ 'updatecount' to very big numbers, and type ":preserve" when
+ you want to save your work. This way you keep the possibility
+ for crash recovery.
+
+ *-o*
+-o[N] Open N windows, split horizontally. If [N] is not given,
+ one window is opened for every file given as argument. If
+ there is not enough room, only the first few files get a
+ window. If there are more windows than arguments, the last
+ few windows will be editing an empty file.
+
+ *-O*
+-O[N] Open N windows, split vertically. Otherwise it's like -o.
+ If both the -o and the -O option are given, the last one on
+ the command line determines how the windows will be split.
+
+ *-p*
+-p[N] Open N tab pages. If [N] is not given, one tab page is opened
+ for every file given as argument. The maximum is set with
+ 'tabpagemax' pages (default 10). If there are more tab pages
+ than arguments, the last few tab pages will be editing an
+ empty file. Also see |tabpage|.
+
+ *-T*
+-T {terminal} Set the terminal type to "terminal". This influences the
+ codes that Vim will send to your terminal. This is normally
+ not needed, because Vim will be able to find out what type
+ of terminal you are using. (See |terminal-info|.)
+
+ *--not-a-term*
+--not-a-term Tells Vim that the user knows that the input and/or output is
+ not connected to a terminal. This will avoid the warning and
+ the two second delay that would happen.
+ Also avoids the "Reading from stdin..." message.
+ Also avoids the "N files to edit" message.
+
+--gui-dialog-file {name} *--gui-dialog-file*
+ When using the GUI, instead of showing a dialog, write the
+ title and message of the dialog to file {name}. The file is
+ created or appended to. Only useful for testing, to avoid
+ that the test gets stuck on a dialog that can't be seen.
+ Without the GUI the argument is ignored.
+
+ *--ttyfail*
+--ttyfail When the stdin or stdout is not a terminal (tty) then exit
+ right away.
+
+ *-d*
+-d Start in diff mode, like |vimdiff|.
+ {not available when compiled without the |+diff| feature}
+
+-d {device} Only on the Amiga and when not compiled with the |+diff|
+ feature. Works like "-dev".
+ *-dev*
+-dev {device} Only on the Amiga: The {device} is opened to be used for
+ editing.
+ Normally you would use this to set the window position and
+ size: "-d con:x/y/width/height", e.g.,
+ "-d con:30/10/600/150". But you can also use it to start
+ editing on another device, e.g., AUX:.
+ *-f*
+-f GUI: Do not disconnect from the program that started Vim.
+ 'f' stands for "foreground". If omitted, the GUI forks a new
+ process and exits the current one. "-f" should be used when
+ gvim is started by a program that will wait for the edit
+ session to finish (e.g., mail or readnews). If you want gvim
+ never to fork, include 'f' in 'guioptions' in your |gvimrc|.
+ Careful: You can use "-gf" to start the GUI in the foreground,
+ but "-fg" is used to specify the foreground color. |gui-fork|
+
+ Amiga: Do not restart Vim to open a new window. This
+ option should be used when Vim is started by a program that
+ will wait for the edit session to finish (e.g., mail or
+ readnews). See |amiga-window|.
+
+ MS-Windows: This option is not supported. However, when
+ running Vim with an installed vim.bat or gvim.bat file it
+ works.
+
+
+ *--nofork*
+--nofork GUI: Do not fork. Same as |-f|.
+ *-u* *E282*
+-u {vimrc} The file {vimrc} is read for initializations. Most other
+ initializations are skipped; see |initialization|.
+
+ This can be used to start Vim in a special mode, with special
+ mappings and settings. A shell alias can be used to make
+ this easy to use. For example: >
+ alias vimc vim -u ~/.c_vimrc !*
+< Also consider using autocommands; see |autocommand|.
+
+ When {vimrc} is equal to "NONE" (all uppercase), all
+ initializations from files and environment variables are
+ skipped, including reading the |gvimrc| file when the GUI
+ starts. Loading plugins is also skipped.
+
+ When {vimrc} is equal to "NORC" (all uppercase), this has the
+ same effect as "NONE", but loading plugins is not skipped.
+
+ When {vimrc} is equal to "DEFAULTS" (all uppercase), this has
+ the same effect as "NONE", but the |defaults.vim| script is
+ loaded, which will also set 'nocompatible'. Also see
+ |--clean|.
+
+ Using the "-u" argument with another argument than DEFAULTS
+ has the side effect that the 'compatible' option will be on by
+ default. This can have unexpected effects. See
+ |'compatible'|.
+
+ *-U* *E230*
+-U {gvimrc} The file {gvimrc} is read for initializations when the GUI
+ starts. Other GUI initializations are skipped. When {gvimrc}
+ is equal to "NONE", no file is read for GUI initializations at
+ all. |gui-init|
+ Exception: Reading the system-wide menu file is always done.
+
+ *-i*
+-i {viminfo} The file "viminfo" is used instead of the default viminfo
+ file. If the name "NONE" is used (all uppercase), no viminfo
+ file is read or written, even if 'viminfo' is set or when
+ ":rv" or ":wv" are used. See also |viminfo-file|.
+
+ *--clean*
+--clean Similar to "-u DEFAULTS -U NONE -i NONE":
+ - initializations from files and environment variables is
+ skipped
+ - 'runtimepath' and 'packpath' are set to exclude home
+ directory entries (does not happen with -u DEFAULTS).
+ - the |defaults.vim| script is loaded, which implies
+ 'nocompatible': use Vim defaults
+ - no |gvimrc| script is loaded
+ - no viminfo file is read or written
+ Note that a following "-u" argument overrules the effect of
+ "-u DEFAULTS".
+
+ *-x*
+-x Use encryption to read/write files. Will prompt for a key,
+ which is then stored in the 'key' option. All writes will
+ then use this key to encrypt the text. The '-x' argument is
+ not needed when reading a file, because there is a check if
+ the file that is being read has been encrypted, and Vim asks
+ for a key automatically. |encryption|
+
+ *-X*
+-X Do not try connecting to the X server to get the current
+ window title and copy/paste using the X clipboard. This
+ avoids a long startup time when running Vim in a terminal
+ emulator and the connection to the X server is slow.
+ See |--startuptime| to find out if affects you.
+ Only makes a difference on Unix or VMS, when compiled with the
+ |+X11| feature. Otherwise it's ignored.
+ To disable the connection only for specific terminals, see the
+ 'clipboard' option.
+ When the X11 Session Management Protocol (XSMP) handler has
+ been built in, the -X option also disables that connection as
+ it, too, may have undesirable delays.
+ When the connection is desired later anyway (e.g., for
+ client-server messages), call the |serverlist()| function.
+ This does not enable the XSMP handler though.
+
+ *-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|.
+
+ *-w_nr*
+-w {number}
+-w{number} Set the 'window' option to {number}.
+
+ *-w*
+-w {scriptout} All the characters that you type are recorded in the file
+ "scriptout", until you exit Vim. This is useful if you want
+ to create a script file to be used with "vim -s" or
+ ":source!". When the "scriptout" file already exists, new
+ characters are appended. See also |complex-repeat|.
+ {scriptout} cannot start with a digit.
+ If you want to record what is typed in a human readable for
+ you can use |ch_logfile()|, It adds "raw key input" lines.
+ Also see |--log|.
+
+ *-W*
+-W {scriptout} Like -w, but do not append, overwrite an existing file.
+
+--remote [+{cmd}] {file} ...
+ Open the {file} in another Vim that functions as a server.
+ Any non-file arguments must come before this.
+ See |--remote|.
+
+--remote-silent [+{cmd}] {file} ...
+ Like --remote, but don't complain if there is no server.
+ See |--remote-silent|.
+
+--remote-wait [+{cmd}] {file} ...
+ Like --remote, but wait for the server to finish editing the
+ file(s).
+ See |--remote-wait|.
+
+--remote-wait-silent [+{cmd}] {file} ...
+ Like --remote-wait, but don't complain if there is no server.
+ See |--remote-wait-silent|.
+
+--servername {name}
+ Specify the name of the Vim server to send to or to become.
+ See |--servername|.
+
+--remote-send {keys}
+ Send {keys} to a Vim server and exit.
+ See |--remote-send|.
+
+--remote-expr {expr}
+ Evaluate {expr} in another Vim that functions as a server.
+ The result is printed on stdout.
+ See |--remote-expr|.
+
+--serverlist Output a list of Vim server names and exit. See
+ |--serverlist|.
+
+--socketid {id} *--socketid*
+ GTK+ GUI Vim only. Make gvim try to use GtkPlug mechanism, so
+ that it runs inside another window. See |gui-gtk-socketid|
+ for details.
+
+--windowid {id} *--windowid*
+ Win32 GUI Vim only. Make gvim try to use the window {id} as a
+ parent, so that it runs inside that window. See
+ |gui-w32-windowid| for details.
+
+--echo-wid *--echo-wid*
+ GTK+ GUI Vim only. Make gvim echo the Window ID on stdout,
+ which can be used to run gvim in a kpart widget. The format
+ of the output is: >
+ WID: 12345\n
+
+--role {role} *--role*
+ GTK+ 2 GUI only. Set the role of the main window to {role}.
+ The window role can be used by a window manager to uniquely
+ identify a window, in order to restore window placement and
+ such. The --role argument is passed automatically when
+ restoring the session on login. See |gui-gnome-session|
+
+-P {parent-title} *-P* *MDI* *E671* *E672*
+ Win32 only: Specify the title of the parent application. When
+ possible, Vim will run in an MDI window inside the
+ application.
+ {parent-title} must appear in the window title of the parent
+ application. Make sure that it is specific enough.
+ Note that the implementation is still primitive. It won't
+ work with all applications and the menu doesn't work.
+
+-nb *-nb*
+-nb={fname}
+-nb:{hostname}:{addr}:{password}
+ Attempt connecting to Netbeans and become an editor server for
+ it. The second form specifies a file to read connection info
+ from. The third form specifies the hostname, address and
+ password for connecting to Netbeans. |netbeans-run|
+ {only available when compiled with the |+netbeans_intg|
+ feature; if not then -nb will make Vim exit}
+
+If the executable is called "view", Vim will start in Readonly mode. This is
+useful if you can make a hard or symbolic link from "view" to "vim".
+Starting in Readonly mode can also be done with "vim -R".
+
+If the executable is called "ex", Vim will start in "Ex" mode. This means it
+will accept only ":" commands. But when the "-v" argument is given, Vim will
+start in Normal mode anyway.
+
+Additional arguments are available on unix like systems when compiled with
+X11 GUI support. See |gui-resources|.
+
+==============================================================================
+2. Vim on the Amiga *starting-amiga*
+
+Starting Vim from the Workbench *workbench*
+-------------------------------
+
+Vim can be started from the Workbench by clicking on its icon twice. It will
+then start with an empty buffer.
+
+Vim can be started to edit one or more files by using a "Project" icon. The
+"Default Tool" of the icon must be the full pathname of the Vim executable.
+The name of the ".info" file must be the same as the name of the text file.
+By clicking on this icon twice, Vim will be started with the file name as
+current file name, which will be read into the buffer (if it exists). You can
+edit multiple files by pressing the shift key while clicking on icons, and
+clicking twice on the last one. The "Default Tool" for all these icons must
+be the same.
+
+It is not possible to give arguments to Vim, other than file names, from the
+workbench.
+
+Vim window *amiga-window*
+----------
+
+Vim will run in the CLI window where it was started. If Vim was started with
+the "run" or "runback" command, or if Vim was started from the workbench, it
+will open a window of its own.
+
+Technical detail:
+ To open the new window a little trick is used. As soon as Vim
+ recognizes that it does not run in a normal CLI window, it will
+ create a script file in "t:". This script file contains the same
+ command as the one Vim was started with, and an "endcli" command.
+ This script file is then executed with a "newcli" command (the "c:run"
+ and "c:newcli" commands are required for this to work). The script
+ file will hang around until reboot, or until you delete it. This
+ method is required to get the ":sh" and ":!" commands to work
+ correctly. But when Vim was started with the -f option (foreground
+ mode), this method is not used. The reason for this is that
+ when a program starts Vim with the -f option it will wait for Vim to
+ exit. With the script trick, the calling program does not know when
+ Vim exits. The -f option can be used when Vim is started by a mail
+ program which also waits for the edit session to finish. As a
+ consequence, the ":sh" and ":!" commands are not available when the
+ -f option is used.
+
+Vim will automatically recognize the window size and react to window
+resizing. Under Amiga DOS 1.3, it is advised to use the fastfonts program,
+"FF", to speed up display redrawing.
+
+==============================================================================
+3. Running eVim *evim-keys*
+
+EVim runs Vim as click-and-type editor. This is very unlike the original Vi
+idea. But it helps for people that don't use Vim often enough to learn the
+commands. Hopefully they will find out that learning to use Normal mode
+commands will make their editing much more effective.
+
+In Evim these options are changed from their default value:
+
+ :set nocompatible Use Vim improvements
+ :set insertmode Remain in Insert mode most of the time
+ :set hidden Keep invisible buffers loaded
+ :set backup Keep backup files (not for VMS)
+ :set backspace=2 Backspace over everything
+ :set autoindent auto-indent new lines
+ :set history=50 keep 50 lines of Ex commands
+ :set ruler show the cursor position
+ :set incsearch show matches halfway typing a pattern
+ :set mouse=a use the mouse in all modes
+ :set hlsearch highlight all matches for a search pattern
+ :set whichwrap+=<,>,[,] <Left> and <Right> wrap around line breaks
+ :set guioptions-=a non-Unix only: don't do auto-select
+
+Key mappings:
+ <CTRL-Q> quit, using `:confirm` prompt if there are changes
+ <Down> moves by screen lines rather than file lines
+ <Up> idem
+ Q does "gq", formatting, instead of Ex mode
+ <BS> in Visual mode: deletes the selection
+ CTRL-X in Visual mode: Cut to clipboard
+ <S-Del> idem
+ CTRL-C in Visual mode: Copy to clipboard
+ <C-Insert> idem
+ CTRL-V Pastes from the clipboard (in any mode)
+ <S-Insert> idem
+ CTRL-Z undo
+ CTRL-Y redo
+ <M-Space> system menu
+ CTRL-A select all
+ <C-Tab> next window, CTRL-W w
+ <C-F4> close window, CTRL-W c
+
+Additionally:
+- ":behave mswin" is used |:behave|
+- syntax highlighting is enabled
+- filetype detection is enabled, filetype plugins and indenting is enabled
+- in a text file 'textwidth' is set to 78
+
+One hint: If you want to go to Normal mode to be able to type a sequence of
+commands, use CTRL-L. |i_CTRL-L|
+
+There is no way to stop "easy mode", you need to exit Vim.
+
+==============================================================================
+4. Initialization *initialization* *startup*
+
+This section is about the non-GUI version of Vim. See |gui-fork| for
+additional initialization when starting the GUI.
+
+At startup, Vim checks environment variables and files and sets values
+accordingly. Vim proceeds in this order:
+
+1. Set the 'shell' and 'term' option *SHELL* *COMSPEC* *TERM*
+ The environment variable SHELL, if it exists, is used to set the
+ 'shell' option. On Win32, the COMSPEC variable is used
+ if SHELL is not set.
+ The environment variable TERM, if it exists, is used to set the 'term'
+ option. However, 'term' will change later when starting the GUI (step
+ 8 below).
+
+2. Process the arguments
+ The options and file names from the command that start Vim are
+ inspected. Buffers are created for all files (but not loaded yet).
+ The |-V| argument can be used to display or log what happens next,
+ useful for debugging the initializations.
+
+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>".
+ *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. Also see |vimrc-intro|.
+
+ Places for your personal initializations:
+ Unix $HOME/.vimrc or $HOME/.vim/vimrc
+ MS-Windows $HOME/_vimrc, $HOME/vimfiles/vimrc
+ or $VIM/_vimrc
+ Amiga s:.vimrc, home:.vimrc, home:vimfiles:vimrc
+ or $VIM/.vimrc
+ Haiku $HOME/config/settings/vim/vimrc
+
+ The files are searched in the order specified above and only the first
+ one that is found is read.
+
+ RECOMMENDATION: Put all your Vim configuration stuff in the
+ $HOME/.vim/ directory ($HOME/vimfiles/ for MS-Windows). That makes it
+ easy to copy it to another system.
+
+ If Vim was started with "-u filename", the file "filename" is used.
+ All following initializations until 4. are skipped. $MYVIMRC is not
+ set.
+ "vim -u NORC" can be used to skip these initializations without
+ reading a file. "vim -u NONE" also skips loading plugins. |-u|
+
+ If Vim was started in Ex mode with the "-s" argument, all following
+ initializations until 4. are skipped. Only the "-u" option is
+ interpreted.
+ *evim.vim*
+ a. If vim was started as |evim| or |eview| or with the |-y| argument, the
+ script $VIMRUNTIME/evim.vim will be loaded.
+ *system-vimrc*
+ b. For Unix, MS-Windows, VMS, Macintosh and Amiga the system vimrc file
+ is read for initializations. The path of this file is shown with the
+ ":version" command. Mostly it's "$VIM/vimrc". Note that this file is
+ ALWAYS read in 'compatible' mode, since the automatic resetting of
+ 'compatible' is only done later. Add a ":set nocp" command if you
+ like. For the Macintosh the $VIMRUNTIME/macmap.vim is read.
+
+ *VIMINIT* *.vimrc* *_vimrc* *EXINIT* *.exrc* *_exrc* *$MYVIMRC*
+ c. Five places are searched for initializations. The first that exists
+ is used, the others are ignored. The $MYVIMRC environment variable is
+ set to the file that was first found, unless $MYVIMRC was already set
+ and when using VIMINIT.
+ I The environment variable VIMINIT (see also |compatible-default|) (*)
+ The value of $VIMINIT is used as an Ex command line.
+ II The user vimrc file(s):
+ "$HOME/.vimrc" (for Unix) (*)
+ "$HOME/.vim/vimrc" (for Unix) (*)
+ "s:.vimrc" (for Amiga) (*)
+ "home:.vimrc" (for Amiga) (*)
+ "home:vimfiles:vimrc" (for Amiga) (*)
+ "$VIM/.vimrc" (for Amiga) (*)
+ "$HOME/_vimrc" (for Win32) (*)
+ "$HOME/vimfiles/vimrc" (for Win32) (*)
+ "$VIM/_vimrc" (for Win32) (*)
+ "$HOME/config/settings/vim/vimrc" (for Haiku) (*)
+
+ Note: For Unix and Amiga, when ".vimrc" does not exist,
+ "_vimrc" is also tried, in case an MS-DOS compatible file
+ system is used. For MS-Windows ".vimrc" is checked after
+ "_vimrc", in case long file names are used.
+ Note: For Win32, "$HOME" is checked first. If no "_vimrc" or
+ ".vimrc" is found there, "$VIM" is tried. See |$VIM| for when
+ $VIM is not set.
+ III The environment variable EXINIT.
+ The value of $EXINIT is used as an Ex command line.
+ IV The user exrc file(s). Same as for the user vimrc file, but with
+ "vimrc" replaced by "exrc". But only one of ".exrc" and "_exrc" is
+ used, depending on the system. And without the (*)!
+ V The default vimrc file, $VIMRUNTIME/defaults.vim. This sets up
+ options values and has "syntax on" and "filetype on" commands,
+ which is what most new users will want. See |defaults.vim|.
+
+ d. 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 ".vimrc" (for Unix, Amiga) (*)
+ "_vimrc" (for Win32) (*)
+ - The file "_vimrc" (for Unix, Amiga) (*)
+ ".vimrc" (for Win32) (*)
+ - The file ".exrc" (for Unix, Amiga)
+ "_exrc" (for Win32)
+
+ (*) Using this file or environment variable will cause 'compatible' to be
+ off by default. See |compatible-default|.
+
+ Note: When using the |mzscheme| interface, it is initialized after loading
+ the vimrc file. Changing 'mzschemedll' later has no effect.
+
+4. Load the plugin scripts. *load-plugins*
+ This does the same as the command: >
+ :runtime! plugin/**/*.vim
+< The result is that all directories in the 'runtimepath' option will be
+ 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.
+ - The |--clean| command line argument is used.
+ - The "-u NONE" command line argument is used |-u|.
+ - 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'" 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".
+
+5. 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.
+ This means that Vim will figure out the values of 'shellpipe' and
+ 'shellredir' for you, unless you have set them yourself.
+
+6. Set 'updatecount' to zero, if "-n" command argument used
+
+7. Set binary options
+ If the "-b" flag was given to Vim, the options for binary editing will
+ be set now. See |-b|.
+
+8. Perform GUI initializations
+ Only when starting "gvim", the GUI initializations will be done. See
+ |gui-init|.
+
+9. Read the viminfo file
+ If the 'viminfo' option is not empty, the viminfo file is read. See
+ |viminfo-file|.
+
+10. Read the quickfix file
+ If the "-q" flag was given to Vim, the quickfix file is read. If this
+ fails, Vim exits.
+
+11. Open all windows
+ When the |-o| flag was given, windows will be opened (but not
+ displayed yet).
+ When the |-p| flag was given, tab pages will be created (but not
+ displayed yet).
+ When switching screens, it happens now. Redrawing starts.
+ If the "-q" flag was given to Vim, the first error is jumped to.
+ Buffers for all windows will be loaded, without triggering |BufAdd|
+ autocommands.
+
+12. Execute startup commands
+ If a "-t" flag was given to Vim, the tag is jumped to.
+ The commands given with the |-c| and |+cmd| arguments are executed.
+ If the 'insertmode' option is set, Insert mode is entered.
+ The starting flag is reset, has("vim_starting") will now return zero.
+ The |v:vim_did_enter| variable is set to 1.
+ The |VimEnter| autocommands are executed.
+
+The $MYVIMRC or $MYGVIMRC file will be set to the first found vimrc and/or
+gvimrc file.
+
+
+Some hints on using initializations ~
+
+Standard setup:
+Create a vimrc file to set the default settings and mappings for all your edit
+sessions. Put it in a place so that it will be found by 3b:
+ ~/.vimrc (Unix)
+ s:.vimrc (Amiga)
+ $VIM\_vimrc (Win32)
+ ~/config/settings/vim/vimrc (Haiku)
+
+Note that creating a vimrc file will cause the 'compatible' option to be off
+by default. See |compatible-default|.
+
+Local setup:
+Put all commands that you need for editing a specific directory only into a
+vimrc file and place it in that directory under the name ".vimrc" ("_vimrc"
+for Win32). NOTE: To make Vim look for these special files you have to turn
+on the option 'exrc'. See |trojan-horse| too.
+
+System setup:
+This only applies if you are managing a Unix system with several users and
+want to set the defaults for all users. Create a vimrc file with commands
+for default settings and mappings and put it in the place that is given with
+the ":version" command.
+
+
+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 ~
+
+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 "vimrc" instead.
+
+
+Amiga environment variables ~
+
+On the Amiga, two types of environment variables exist. The ones set with the
+DOS 1.3 (or later) setenv command are recognized. See the AmigaDos 1.3
+manual. The environment variables set with the old Manx Set command (before
+version 5.0) are not recognized.
+
+
+MS-Windows line separators ~
+
+On MS-Windows, 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.
+
+
+Vi compatible default value ~
+ *compatible-default*
+When Vim starts, the 'compatible' option is on. This will be used when Vim
+starts its initializations. But as soon as:
+- a user vimrc file is found, or
+- a vimrc file in the current directory is found, or
+- the "VIMINIT" environment variable is set, or
+- the "-N" command line argument is given, or
+- the "--clean" command line argument is given, or
+- the |defaults.vim| script is loaded, or
+- a gvimrc file was found,
+then the option will be set to 'nocompatible'.
+
+Note that this does NOT happen when a system-wide vimrc file was found.
+
+This has the side effect of setting or resetting other options (see
+'compatible'). But only the options that have not been set or reset will be
+changed. This has the same effect like the value of 'compatible' had this
+value when starting Vim.
+
+'compatible' is NOT reset, and |defaults.vim| is not loaded:
+- when Vim was started with the |-u| command line argument, especially with
+ "-u NONE", or
+- when started with the |-C| command line argument, or
+- when the name of the executable ends in "ex". (This has been done to make
+ Vim behave like "ex", when it is started as "ex")
+
+But there is a side effect of setting or resetting 'compatible' at the moment
+a .vimrc file is found: Mappings are interpreted the moment they are
+encountered. This makes a difference when using things like "<CR>". If the
+mappings depend on a certain value of 'compatible', set or reset it before
+giving the mapping.
+
+
+Defaults without a .vimrc file ~
+ *defaults.vim* *E1187*
+If Vim is started normally and no user vimrc file is found, the
+$VIMRUNTIME/defaults.vim script is loaded. This will set 'compatible' off,
+switch on syntax highlighting and a few more things. See the script for
+details. NOTE: this is done since Vim 8.0, not in Vim 7.4. (it was added in
+patch 7.4.2111 to be exact).
+
+This should work well for new Vim users. If you create your own .vimrc, it is
+recommended to add these lines somewhere near the top: >
+ unlet! skip_defaults_vim
+ source $VIMRUNTIME/defaults.vim
+Then Vim works like before you had a .vimrc. Copying $VIMRUNTIME/vimrc_example
+is way to do this. Alternatively, you can copy defaults.vim to your .vimrc
+and modify it (but then you won't get updates when it changes).
+
+If you don't like some of the defaults, you can still source defaults.vim and
+revert individual settings. See the defaults.vim file for hints on how to
+revert each item.
+ *skip_defaults_vim*
+If you use a system-wide vimrc and don't want defaults.vim to change settings,
+set the "skip_defaults_vim" variable. If this was set and you want to load
+defaults.vim from your .vimrc, first unlet skip_defaults_vim, as in the
+example above.
+
+
+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
+else created and contains nasty commands. The disabled commands are the ones
+that start a shell, the ones that write to a file, and ":autocmd". The ":map"
+commands are echoed, so you can see which keys are being mapped.
+ If you want Vim to execute all commands in a local vimrc file, you
+can reset the 'secure' option in the EXINIT or VIMINIT environment variable or
+in the global "exrc" or "vimrc" file. This is not possible in "vimrc" or
+"exrc" in the current directory, for obvious reasons.
+ On Unix systems, this only happens if you are not the owner of the
+vimrc file. Warning: If you unpack an archive that contains a vimrc or exrc
+file, it will be owned by you. You won't have the security protection. Check
+the vimrc file before you start Vim in that directory, or reset the 'exrc'
+option. Some Unix systems allow a user to do "chown" on a file. This makes
+it possible for another user to create a nasty vimrc and make you the owner.
+Be careful!
+ When using tag search commands, executing the search command (the last
+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. There are a few common causes:
+- If the Unix version was compiled with the GUI and/or X11 (check the output
+ of ":version" for "+GUI" and "+X11"), it may need to load shared libraries
+ and connect to the X11 server. Try compiling a version with GUI and X11
+ disabled. This also should make the executable smaller.
+ Use the |-X| command line argument to avoid connecting to the X server when
+ running in a terminal.
+- If you have "viminfo" enabled, the loading of the viminfo file may take a
+ while. You can find out if this is the problem by disabling viminfo for a
+ moment (use the Vim argument "-i NONE", |-i|). Try reducing the number of
+ lines stored in a register with ":set viminfo='20,<50,s10". |viminfo-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
+redrawn in any way. To see the message again, use the ":intro" command (if
+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
+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
+
+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
+">&": >
+
+ :set shellredir=>
+ :read !gvim --help
+
+This still won't work for systems where gvim does not use stdout at all
+though.
+
+==============================================================================
+5. $VIM and $VIMRUNTIME
+ *$VIM*
+The environment variable "$VIM" is used to locate various user files for Vim,
+such as the user startup script ".vimrc". 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., "vim82").
+3. For 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., "vim82").
+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/"
+<
+ *$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/vim82". 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/vim82".
+
+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/vim82"
+
+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: >
+
+ VIMRUNTIME=`vim -e -T dumb --cmd 'exe "set t_cm=\<C-M>"|echo $VIMRUNTIME|quit' | tr -d '\015' `
+
+Don't set $VIMRUNTIME to an empty value, some things may stop working.
+
+==============================================================================
+6. Suspending *suspend*
+
+ *iconize* *iconise* *CTRL-Z* *v_CTRL-Z*
+CTRL-Z Suspend Vim, 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
+ 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
+ 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
+ back to the foreground later!
+
+In the GUI, suspending is implemented as iconising gvim. In MS-Windows, 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).
+
+==============================================================================
+7. Exiting *exiting*
+
+There are several ways to exit Vim:
+- Close the last window with `:quit`. Only when there are no changes.
+- Close the last window with `:quit!`. Also when there are changes.
+- Close all windows with `:qall`. Only when there are no changes.
+- Close all windows with `:qall!`. Also when there are changes.
+- 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!` or with `:catch`.
+
+==============================================================================
+8. Saving settings *save-settings*
+
+Mostly you will edit your vimrc files manually. This gives you the greatest
+flexibility. There are a few commands to generate a vimrc file automatically.
+You can use these files as they are, or copy/paste lines to include in another
+vimrc file.
+
+ *:mk* *:mkexrc*
+:mk[exrc] [file] Write current key mappings and changed options to
+ [file] (default ".exrc" in the current directory),
+ unless it already exists.
+
+:mk[exrc]! [file] Always write current key mappings and changed
+ options to [file] (default ".exrc" in the current
+ directory).
+
+ *:mkv* *:mkvi* *:mkvimrc*
+:mkv[imrc][!] [file] Like ":mkexrc", but the default is ".vimrc" in the
+ current directory. The ":version" command is also
+ written to the file.
+
+These commands will write ":map" and ":set" commands to a file, in such a way
+that when these commands are executed, the current key mappings and options
+will be set to the same values. The options 'columns', 'endofline',
+'fileformat', 'key', 'lines', 'modified', 'scroll', 'term', 'textmode',
+'ttyfast' and 'ttymouse' are not included, because these are terminal or file
+dependent. Note that the options 'binary', 'paste' and 'readonly' are
+included, this might not always be what you want.
+
+When special keys are used in mappings, The 'cpoptions' option will be
+temporarily set to its Vim default, to avoid the mappings to be
+misinterpreted. This makes the file incompatible with Vi, but makes sure it
+can be used with different terminals.
+
+Only global mappings are stored, not mappings local to a buffer.
+
+A common method is to use a default ".vimrc" file, make some modifications
+with ":map" and ":set" commands and write the modified file. First read the
+default ".vimrc" in with a command like ":source ~piet/.vimrc.Cprogs", change
+the settings and then save them in the current directory with ":mkvimrc!". If
+you want to make this file your default .vimrc, move it to your home directory
+(on Unix), s: (Amiga) or $VIM directory (MS-Windows). You could also use
+autocommands |autocommand| and/or modelines |modeline|.
+
+ *vimrc-option-example*
+If you only want to add a single option setting to your vimrc, you can use
+these steps:
+1. Edit your vimrc file with Vim.
+2. Play with the option until it's right. E.g., try out different values for
+ 'guifont'.
+3. Append a line to set the value of the option, using the expression register
+ '=' to enter the value. E.g., for the 'guifont' option: >
+ o:set guifont=<C-R>=&guifont<CR><Esc>
+< [<C-R> is a CTRL-R, <CR> is a return, <Esc> is the escape key]
+ You need to escape special characters, esp. spaces.
+
+Note that when you create a .vimrc file, this can influence the 'compatible'
+option, which has several side effects. See |'compatible'|.
+":mkvimrc", ":mkexrc" and ":mksession" write the command to set or reset the
+'compatible' option to the output file first, because of these side effects.
+
+==============================================================================
+9. Views and Sessions *views-sessions*
+
+This is introduced in sections |21.4| and |21.5| of the user manual.
+
+ *View* *view-file*
+A View is a collection of settings that apply to one window. You can save a
+View and when you restore it later, the text is displayed in the same way.
+The options and mappings in this window will also be restored, so that you can
+continue editing like when the View was saved.
+
+ *Session* *session-file*
+A Session keeps the Views for all windows, plus the global settings. You can
+save a Session and when you restore it later the window layout looks the same.
+You can use a Session to quickly switch between different projects,
+automatically loading the files you were last working on in that project.
+
+Views and Sessions are a nice addition to viminfo-files, which are used to
+remember information for all Views and Sessions together |viminfo-file|.
+
+You can quickly start editing with a previously saved View or Session with the
+|-S| argument: >
+ vim -S Session.vim
+<
+All this is {not available when compiled without the |+mksession| feature}.
+
+ *:mks* *:mksession*
+:mks[ession][!] [file] Write a Vim script that restores the current editing
+ session.
+ When [!] is included an existing file is overwritten.
+ When [file] is omitted "Session.vim" is used.
+
+The output of ":mksession" is like ":mkvimrc", but additional commands are
+added to the file. Which ones depends on the 'sessionoptions' option. The
+resulting file, when executed with a ":source" command:
+1. Restores global mappings and options, if 'sessionoptions' contains
+ "options". Script-local mappings will not be written.
+2. Restores global variables that start with an uppercase letter and contain
+ at least one lowercase letter, if 'sessionoptions' contains "globals".
+3. Closes all windows in the current tab page, except the current one; closes
+ all tab pages except the current one (this results in currently loaded
+ buffers to be unloaded, some may become hidden if 'hidden' is set or
+ otherwise specified); wipes out the current buffer, if it is empty
+ and unnamed.
+4. Restores the current directory if 'sessionoptions' contains "curdir", or
+ sets the current directory to where the Session file is if 'sessionoptions'
+ contains "sesdir".
+5. Restores GUI Vim window position, if 'sessionoptions' contains "winpos".
+6. Restores screen size, if 'sessionoptions' contains "resize".
+7. Reloads the buffer list, with the last cursor positions. If
+ 'sessionoptions' contains "buffers" then all buffers are restored,
+ including hidden and unloaded buffers. Otherwise only buffers in windows
+ are restored.
+8. Restores all windows with the same layout. If 'sessionoptions' contains
+ "help", help windows are restored. If 'sessionoptions' contains "blank",
+ windows editing a buffer without a name will be restored.
+ If 'sessionoptions' contains "winsize" and no (help/blank) windows were
+ left out, the window sizes are restored (relative to the screen size).
+ Otherwise, the windows are just given sensible sizes.
+9. Restores the Views for all the windows, as with |:mkview|. But
+ 'sessionoptions' is used instead of 'viewoptions'.
+10. If a file exists with the same name as the Session file, but ending in
+ "x.vim" (for eXtra), executes that as well. You can use *x.vim files to
+ specify additional settings and actions associated with a given Session,
+ 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|.
+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.
+
+A session includes all tab pages, unless "tabpages" was removed from
+'sessionoptions'. |tab-page|
+
+The |SessionLoadPost| autocmd event is triggered after a session file is
+loaded/sourced.
+ *SessionLoad-variable*
+While the session file is loading the SessionLoad global variable is set to 1.
+Plugins can use this to postpone some work until the SessionLoadPost event is
+triggered.
+
+ *:mkvie* *:mkview*
+:mkvie[w][!] [file] Write a Vim script that restores the contents of the
+ current window.
+ When [!] is included an existing file is overwritten.
+ When [file] is omitted or is a number from 1 to 9, a
+ name is generated and 'viewdir' prepended. When the
+ last path part of 'viewdir' does not exist, this
+ directory is created. E.g., when 'viewdir' is
+ "$VIM/vimfiles/view" then "view" is created in
+ "$VIM/vimfiles".
+ An existing file is always overwritten then. Use
+ |:loadview| to load this view again.
+ When [file] is the name of a file ('viewdir' is not
+ used), a command to edit the file is added to the
+ generated file.
+
+The output of ":mkview" contains these items:
+1. The argument list used in the window. When the global argument list is
+ used it is reset to the global list.
+ The index in the argument list is also restored.
+2. The file being edited in the window. If there is no file, the window is
+ made empty.
+3. Restore mappings, abbreviations and options local to the window if
+ 'viewoptions' contains "options" or "localoptions". For the options it
+ restores only values that are local to the current buffer and values local
+ to the window.
+ When storing the view as part of a session and "options" is in
+ 'sessionoptions', global values for local options will be stored too.
+4. Restore folds when using manual folding and 'viewoptions' contains
+ "folds". Restore manually opened and closed folds.
+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 and 'viewoptions' contains "curdir".
+
+Note that Views and Sessions are not perfect:
+- They don't restore everything. For example, defined functions, autocommands
+ and ":syntax on" are not included. Things like register contents and
+ command line history are in viminfo, not in Sessions or Views.
+- Global option values are only set when they differ from the default value.
+ When the current value is not the default value, loading a Session will not
+ set it back to the default value. Local options will be set back to the
+ default value though.
+- Existing mappings will be overwritten without warning. An existing mapping
+ may cause an error for ambiguity.
+- When storing manual folds and when storing manually opened/closed folds,
+ changes in the file between saving and loading the view will mess it up.
+- The Vim script is not very efficient. But still faster than typing the
+ commands yourself!
+
+ *:lo* *:loadview*
+:lo[adview] [nr] Load the view for the current file. When [nr] is
+ omitted, the view stored with ":mkview" is loaded.
+ When [nr] is specified, the view stored with ":mkview
+ [nr]" is loaded.
+
+The combination of ":mkview" and ":loadview" can be used to store up to ten
+different views of a file. These are remembered in the directory specified
+with the 'viewdir' option. The views are stored using the file name. If a
+file is renamed or accessed through a (symbolic) link the view will not be
+found.
+
+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
+
+==============================================================================
+10. The viminfo file *viminfo* *viminfo-file* *E136*
+ *E575* *E576* *E577*
+If you exit Vim and later start it again, you would normally lose a lot of
+information. The viminfo file can be used to remember that information, which
+enables you to continue where you left off.
+
+This is introduced in section |21.3| of the user manual.
+
+The viminfo file is used to store:
+- The command line history.
+- The search string history.
+- The input-line history.
+- Contents of non-empty registers.
+- Marks for several files.
+- File marks, pointing to locations in files.
+- Last search/substitute pattern (for 'n' and '&').
+- The buffer list.
+- Global variables.
+
+The viminfo file is not supported when the |+viminfo| feature has been
+disabled at compile time.
+
+You could also use a Session file. The difference is that the viminfo file
+does not depend on what you are working on. There normally is only one
+viminfo file. Session files are used to save the state of a specific editing
+Session. You could have several Session files, one for each project you are
+working on. Viminfo and Session files together can be used to effectively
+enter Vim and directly start working in your desired setup. |session-file|
+
+ *viminfo-read*
+When Vim is started and the 'viminfo' option is non-empty, the contents of
+the viminfo file are read and the info can be used in the appropriate places.
+The |v:oldfiles| variable is filled. The marks are not read in at startup
+(but file marks are). See |initialization| for how to set the 'viminfo'
+option upon startup.
+
+ *viminfo-write*
+When Vim exits and 'viminfo' is non-empty, the info is stored in the viminfo
+file (it's actually merged with the existing one, if one exists). The
+'viminfo' option is a string containing information about what info should be
+stored, and contains limits on how much should be stored (see 'viminfo').
+
+Merging happens in two ways. Most items that have been changed or set in the
+current Vim session are stored, and what was not changed is filled from what
+is currently in the viminfo file. For example:
+- Vim session A reads the viminfo, which contains variable START.
+- Vim session B does the same
+- Vim session A sets the variables AAA and BOTH and exits
+- Vim session B sets the variables BBB and BOTH and exits
+Now the viminfo will have:
+ START - it was in the viminfo and wasn't changed in session A or B
+ AAA - value from session A, session B kept it
+ BBB - value from session B
+ BOTH - value from session B, value from session A is lost
+
+ *viminfo-timestamp*
+For some items a timestamp is used to keep the last changed version. Here it
+doesn't matter in which sequence Vim sessions exit, the newest item(s) are
+always kept. This is used for:
+- The command line history.
+- The search string history.
+- The input-line history.
+- Contents of non-empty registers.
+- The jump list
+- File marks
+The timestamp feature was added before Vim 8.0. Older versions of Vim,
+starting with 7.4.1131, will keep the items with timestamp, but not use them.
+Thus when using both an older and a newer version of Vim the most recent data
+will be kept.
+
+Notes for Unix:
+- The file protection for the viminfo file will be set to prevent other users
+ from being able to read it, because it may contain any text or commands that
+ you have worked with.
+- If you want to share the viminfo file with other users (e.g. when you "su"
+ to another user), you can make the file writable for the group or everybody.
+ Vim will preserve this when replacing the viminfo file. Be careful, don't
+ allow just anybody to read and write your viminfo file!
+- Vim will not overwrite a viminfo file that is not writable by the current
+ "real" user. This helps for when you did "su" to become root, but your
+ $HOME is still set to a normal user's home directory. Otherwise Vim would
+ create a viminfo file owned by root that nobody else can read.
+- The viminfo file cannot be a symbolic link. This is to avoid security
+ issues.
+
+Marks are stored for each file separately. When a file is read and 'viminfo'
+is non-empty, the marks for that file are read from the viminfo file. NOTE:
+The marks are only written when exiting Vim, which is fine because marks are
+remembered for all the files you have opened in the current editing session,
+unless ":bdel" is used. If you want to save the marks for a file that you are
+about to abandon with ":bdel", use ":wv". The '[' and ']' marks are not
+stored, but the '"' mark is. The '"' mark is very useful for jumping to the
+cursor position when the file was last exited. No marks are saved for files
+that start with any string given with the "r" flag in 'viminfo'. This can be
+used to avoid saving marks for files on removable media (for MS-Windows you
+would use "ra:,rb:", for Amiga "rdf0:,rdf1:,rdf2:").
+The |v:oldfiles| variable is filled with the file names that the viminfo file
+has marks for.
+
+ *viminfo-file-marks*
+Uppercase marks ('A to 'Z) are stored when writing the viminfo file. The
+numbered marks ('0 to '9) are a bit special. When the viminfo file is written
+(when exiting or with the ":wviminfo" command), '0 is set to the current cursor
+position and file. The old '0 is moved to '1, '1 to '2, etc. This
+resembles what happens with the "1 to "9 delete registers. If the current
+cursor position is already present in '0 to '9, it is moved to '0, to avoid
+having the same position twice. The result is that with "'0", you can jump
+back to the file and line where you exited Vim. To do that right away, try
+using this command: >
+
+ vim -c "normal '0"
+
+In a csh compatible shell you could make an alias for it: >
+
+ alias lvim vim -c '"'normal "'"0'"'
+
+For a bash-like shell: >
+
+ alias lvim='vim -c "normal '\''0"'
+
+Use the "r" flag in 'viminfo' to specify for which files no marks should be
+remembered.
+
+
+VIMINFO FILE NAME *viminfo-file-name*
+
+- The default name of the viminfo file is "$HOME/.viminfo" for Unix,
+ "s:.viminfo" for Amiga, "$HOME\_viminfo" for Win32. For Win32, when $HOME
+ is not set, "$VIM\_viminfo" is used. When $VIM is also not set,
+ "c:\_viminfo" is used.
+- The 'n' flag in the 'viminfo' option can be used to specify another viminfo
+ file name |'viminfo'|.
+- The "-i" Vim argument can be used to set another file name, |-i|. When the
+ file name given is "NONE" (all uppercase), no viminfo 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 from 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 'viminfo' or "-i" (unless it's NONE).
+
+
+CHARACTER ENCODING *viminfo-encoding*
+
+The text in the viminfo file is encoded as specified with the 'encoding'
+option. Normally you will always work with the same 'encoding' value, and
+this works just fine. However, if you read the viminfo file with another
+value for 'encoding' than what it was written with, some of the text
+(non-ASCII characters) may be invalid. If this is unacceptable, add the 'c'
+flag to the 'viminfo' option: >
+ :set viminfo+=c
+Vim will then attempt to convert the text in the viminfo file from the
+'encoding' value it was written with to the current 'encoding' value. This
+requires Vim to be compiled with the |+iconv| feature. Filenames are not
+converted.
+
+
+MANUALLY READING AND WRITING *viminfo-read-write*
+
+Two commands can be used to read and write the viminfo file manually. This
+can be used to exchange registers between two running Vim programs: First
+type ":wv" in one and then ":rv" in the other. Note that if the register
+already contained something, then ":rv!" would be required. Also note
+however that this means everything will be overwritten with information from
+the first Vim, including the command line history, etc.
+
+The viminfo file itself can be edited by hand too, although we suggest you
+start with an existing one to get the format right. It is reasonably
+self-explanatory once you're in there. This can be useful in order to
+create a second file, say "~/.my_viminfo" which could contain certain
+settings that you always want when you first start Vim. For example, you
+can preload registers with particular data, or put certain commands in the
+command line history. A line in your .vimrc file like >
+ :rviminfo! ~/.my_viminfo
+can be used to load this information. You could even have different viminfos
+for different types of files (e.g., C code) and load them based on the file
+name, using the ":autocmd" command (see |:autocmd|).
+
+ *viminfo-errors*
+When Vim detects an error while reading a viminfo file, it will not overwrite
+that file. If there are more than 10 errors, Vim stops reading the viminfo
+file. This was done to avoid accidentally destroying a file when the file
+name of the viminfo file is wrong. This could happen when accidentally typing
+"vim -i file" when you wanted "vim -R file" (yes, somebody accidentally did
+that!). If you want to overwrite a viminfo file with an error in it, you will
+either have to fix the error, or delete the file (while Vim is running, so
+most of the information will be restored).
+
+ *:rv* *:rviminfo* *E195*
+:rv[iminfo][!] [file] Read from viminfo file [file] (default: see
+ |viminfo-file-name| above).
+ If [!] is given, then any information that is
+ already set (registers, marks, |v:oldfiles|, etc.)
+ will be overwritten
+
+ *:wv* *:wviminfo* *E137* *E138* *E574* *E886* *E929*
+:wv[iminfo][!] [file] Write to viminfo file [file] (default: see
+ |viminfo-file-name| above).
+ This command has no effect when 'viminfofile' has been
+ set to "NONE".
+ The information in the file is first read in to make
+ a merge between old and new info. When [!] is used,
+ the old information is not read first, only the
+ internal info is written. If 'viminfo' is empty, marks
+ for up to 100 files will be written.
+ When you get error "E929: Too many viminfo temp files"
+ check that no old temp files were left behind (e.g.
+ ~/.viminf*) and that you can write in the directory of
+ the .viminfo file.
+
+ *:ol* *:oldfiles*
+:ol[dfiles] List the files that have marks stored in the viminfo
+ file. This list is read on startup and only changes
+ afterwards with `:rviminfo!`. Also see |v:oldfiles|.
+ The number can be used with |c_#<|.
+ The output can be filtered with |:filter|, e.g.: >
+ filter /\.vim/ oldfiles
+< The filtering happens on the file name.
+ {only when compiled with the |+eval| feature}
+
+:bro[wse] ol[dfiles][!]
+ List file names as with |:oldfiles|, and then prompt
+ for a number. When the number is valid that file from
+ the list is edited.
+ If you get the |press-enter| prompt you can press "q"
+ and still get the prompt to enter a file number.
+ Use ! to abandon a modified buffer. |abandon|
+ {not when compiled with tiny or small features}
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
new file mode 100644
index 0000000..d624e4d
--- /dev/null
+++ b/runtime/doc/syntax.txt
@@ -0,0 +1,5961 @@
+*syntax.txt* For Vim version 9.0. Last change: 2023 Feb 26
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Syntax highlighting *syntax* *syntax-highlighting* *coloring*
+
+Syntax highlighting enables Vim to show parts of the text in another font or
+color. Those parts can be specific keywords or text matching a pattern. Vim
+doesn't parse the whole file (to keep it fast), so the highlighting has its
+limitations. Lexical highlighting might be a better name, but since everybody
+calls it syntax highlighting we'll stick with that.
+
+Vim supports syntax highlighting on all terminals. But since most ordinary
+terminals have very limited highlighting possibilities, it works best in the
+GUI version, gvim.
+
+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. Converting to HTML |2html.vim|
+5. Syntax file remarks |:syn-file-remarks|
+6. Defining a syntax |:syn-define|
+7. :syntax arguments |:syn-arguments|
+8. Syntax patterns |:syn-pattern|
+9. Syntax clusters |:syn-cluster|
+10. Including syntax files |:syn-include|
+11. Synchronizing |:syn-sync|
+12. Listing syntax items |:syntax|
+13. Colorschemes |color-schemes|
+14. Highlight command |:highlight|
+15. Linking groups |:highlight-link|
+16. Cleaning up |:syn-clear|
+17. Highlighting tags |tag-highlight|
+18. Window-local syntax |:ownsyntax|
+19. Color xterms |xterm-color|
+20. When syntax is slow |:syntime|
+
+{Vi does not have any of these commands}
+
+Syntax highlighting is not available when the |+syntax| feature has been
+disabled at compile time.
+
+==============================================================================
+1. Quick start *:syn-qstart*
+
+ *:syn-enable* *:syntax-enable*
+This command switches on syntax highlighting: >
+
+ :syntax enable
+
+What this command actually does is to execute the command >
+ :source $VIMRUNTIME/syntax/syntax.vim
+
+If the VIM environment variable is not set, Vim will try to find
+the path in another way (see |$VIMRUNTIME|). Usually this works just
+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/vim82/syntax" directory, set $VIMRUNTIME to
+"/usr/vim/vim82". 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 most of 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
+<
+ *:hi-normal* *:highlight-normal*
+If you are running in the GUI, you can get white text on a black background
+with: >
+ :highlight Normal guibg=Black guifg=White
+For a color terminal see |:hi-normal-cterm|.
+For setting up your own colors syntax highlighting see |syncolor|.
+
+NOTE: The syntax files on MS-Windows have lines that end in <CR><NL>.
+The files for Unix end in <NL>. This means you should use the right type of
+file for your system. Although on MS-Windows the right format is
+automatically selected if the 'fileformats' option is not empty.
+
+NOTE: When using reverse video ("gvim -fg white -bg black"), the default value
+of 'background' will not be set until the GUI window is opened, which is after
+reading the |gvimrc|. This will cause the wrong default highlighting to be
+used. To set the default value of 'background' before switching on
+highlighting, include the ":gui" command in the |gvimrc|: >
+
+ :gui " open window and set default for 'background'
+ :syntax on " start highlighting, use 'background' to set colors
+
+NOTE: Using ":gui" in the |gvimrc| means that "gvim -f" won't start in the
+foreground! Use ":gui -f" then.
+
+ *g:syntax_on*
+You can toggle the syntax on/off with this command: >
+ :if exists("g:syntax_on") | syntax off | else | syntax enable | endif
+
+To put this into a mapping, you can use: >
+ :map <F7> :if exists("g:syntax_on") <Bar>
+ \ syntax off <Bar>
+ \ else <Bar>
+ \ syntax enable <Bar>
+ \ endif <CR>
+[using the |<>| notation, type this literally]
+
+Details:
+The ":syntax" commands are implemented by sourcing a file. To see exactly how
+this works, look in the file:
+ command file ~
+ :syntax enable $VIMRUNTIME/syntax/syntax.vim
+ :syntax on $VIMRUNTIME/syntax/syntax.vim
+ :syntax manual $VIMRUNTIME/syntax/manual.vim
+ :syntax off $VIMRUNTIME/syntax/nosyntax.vim
+Also see |syntax-loading|.
+
+NOTE: If displaying long lines is slow and switching off syntax highlighting
+makes it fast, consider setting the 'synmaxcol' option to a lower value.
+
+==============================================================================
+2. Syntax files *:syn-files*
+
+The syntax and highlighting commands for one language are normally stored in
+a syntax file. The name convention is: "{name}.vim". Where {name} is the
+name of the language, or an abbreviation (to fit the name in 8.3 characters,
+a requirement in case the file is used on a DOS filesystem).
+Examples:
+ c.vim perl.vim java.vim html.vim
+ cpp.vim sh.vim csh.vim
+
+The syntax file can contain any Ex commands, just like a vimrc file. But
+the idea is that only commands for a specific language are included. When a
+language is a superset of another language, it may include the other one,
+for example, the cpp.vim file could include the c.vim file: >
+ :so $VIMRUNTIME/syntax/c.vim
+
+The .vim files are normally loaded with an autocommand. For example: >
+ :au Syntax c runtime! syntax/c.vim
+ :au Syntax cpp runtime! syntax/cpp.vim
+These commands are normally in the file $VIMRUNTIME/syntax/synload.vim.
+
+
+MAKING YOUR OWN SYNTAX FILES *mysyntaxfile*
+
+When you create your own syntax files, and you want to have Vim use these
+automatically with ":syntax enable", do this:
+
+1. Create your user runtime directory. You would normally use the first item
+ of the 'runtimepath' option. Example for Unix: >
+ mkdir ~/.vim
+
+2. Create a directory in there called "syntax". For Unix: >
+ mkdir ~/.vim/syntax
+
+3. Write the Vim syntax file. Or download one from the internet. Then write
+ it in your syntax directory. For example, for the "mine" syntax: >
+ :w ~/.vim/syntax/mine.vim
+
+Now you can start using your syntax file manually: >
+ :set syntax=mine
+You don't have to exit Vim to use this.
+
+If you also want Vim to detect the type of file, see |new-filetype|.
+
+If you are setting up a system with many users and you don't want each user
+to add the same syntax file, you can use another directory from 'runtimepath'.
+
+
+ADDING TO AN EXISTING SYNTAX FILE *mysyntaxfile-add*
+
+If you are mostly satisfied with an existing syntax file, but would like to
+add a few items or change the highlighting, follow these steps:
+
+1. Create your user directory from 'runtimepath', see above.
+
+2. Create a directory in there called "after/syntax". For Unix: >
+ mkdir ~/.vim/after
+ mkdir ~/.vim/after/syntax
+
+3. Write a Vim script that contains the commands you want to use. For
+ example, to change the colors for the C syntax: >
+ highlight cComment ctermfg=Green guifg=Green
+
+4. Write that file in the "after/syntax" directory. Use the name of the
+ syntax, with ".vim" added. For our C syntax: >
+ :w ~/.vim/after/syntax/c.vim
+
+That's it. The next time you edit a C file the Comment color will be
+different. You don't even have to restart Vim.
+
+If you have multiple files, you can use the filetype as the directory name.
+All the "*.vim" files in this directory will be used, for example:
+ ~/.vim/after/syntax/c/one.vim
+ ~/.vim/after/syntax/c/two.vim
+
+
+REPLACING AN EXISTING SYNTAX FILE *mysyntaxfile-replace*
+
+If you don't like a distributed syntax file, or you have downloaded a new
+version, follow the same steps as for |mysyntaxfile| above. Just make sure
+that you write the syntax file in a directory that is early in 'runtimepath'.
+Vim will only load the first syntax file found, assuming that it sets
+b:current_syntax.
+
+
+NAMING CONVENTIONS *group-name* *{group-name}* *E669* *W18*
+
+A syntax group name is to be used for syntax items that match the same kind of
+thing. These are then linked to a highlight group that specifies the color.
+A syntax group name doesn't specify any color or attributes itself.
+
+The name for a highlight or syntax group must consist of ASCII letters, digits
+and the underscore. As a regexp: "[a-zA-Z0-9_]*". However, Vim does not give
+an error when using other characters. The maximum length of a group name is
+about 200 bytes. *E1249*
+
+To be able to allow each user to pick their favorite set of colors, there must
+be preferred names for highlight groups that are common for many languages.
+These are the suggested group names (if syntax highlighting works properly
+you can see the actual color, except for "Ignore"):
+
+ *Comment any comment
+
+ *Constant any constant
+ String a string constant: "this is a string"
+ Character a character constant: 'c', '\n'
+ Number a number constant: 234, 0xff
+ Boolean a boolean constant: TRUE, false
+ Float a floating point constant: 2.3e10
+
+ *Identifier any variable name
+ Function function name (also: methods for classes)
+
+ *Statement any statement
+ Conditional if, then, else, endif, switch, etc.
+ Repeat for, do, while, etc.
+ Label case, default, etc.
+ Operator "sizeof", "+", "*", etc.
+ Keyword any other keyword
+ Exception try, catch, throw
+
+ *PreProc generic Preprocessor
+ Include preprocessor #include
+ Define preprocessor #define
+ Macro same as Define
+ PreCondit preprocessor #if, #else, #endif, etc.
+
+ *Type int, long, char, etc.
+ StorageClass static, register, volatile, etc.
+ Structure struct, union, enum, etc.
+ Typedef A typedef
+
+ *Special any special symbol
+ SpecialChar special character in a constant
+ Tag you can use CTRL-] on this
+ Delimiter character that needs attention
+ SpecialComment special things inside a comment
+ Debug debugging statements
+
+ *Underlined text that stands out, HTML links
+
+ *Ignore left blank, hidden |hl-Ignore|
+
+ *Error any erroneous construct
+
+ *Todo anything that needs extra attention; mostly the
+ keywords TODO FIXME and XXX
+
+The names marked with * are the preferred groups; the others are minor groups.
+For the preferred groups, the "syntax.vim" file contains default highlighting.
+The minor groups are linked to the preferred groups, so they get the same
+highlighting. You can override these defaults by using ":highlight" commands
+after sourcing the "syntax.vim" file.
+
+Note that highlight group names are not case sensitive. "String" and "string"
+can be used for the same group.
+
+The following names are reserved and cannot be used as a group name:
+ NONE ALL ALLBUT contains contained
+
+ *hl-Ignore*
+When using the Ignore group, you may also consider using the conceal
+mechanism. See |conceal|.
+
+==============================================================================
+3. Syntax loading procedure *syntax-loading*
+
+This explains the details that happen when the command ":syntax enable" is
+issued. When Vim initializes itself, it finds out where the runtime files are
+located. This is used here as the variable |$VIMRUNTIME|.
+
+":syntax enable" and ":syntax on" do the following:
+
+ Source $VIMRUNTIME/syntax/syntax.vim
+ |
+ +- Clear out any old syntax by sourcing $VIMRUNTIME/syntax/nosyntax.vim
+ |
+ +- Source first syntax/synload.vim in 'runtimepath'
+ | |
+ | +- Setup the colors for syntax highlighting. If a color scheme is
+ | | defined it is loaded again with ":colors {name}". Otherwise
+ | | ":runtime! syntax/syncolor.vim" is used. ":syntax on" overrules
+ | | existing colors, ":syntax enable" only sets groups that weren't
+ | | set yet.
+ | |
+ | +- Set up syntax autocmds to load the appropriate syntax file when
+ | | the 'syntax' option is set. *synload-1*
+ | |
+ | +- Source the user's optional file, from the |mysyntaxfile| variable.
+ | This is for backwards compatibility with Vim 5.x only. *synload-2*
+ |
+ +- Do ":filetype on", which does ":runtime! filetype.vim". It loads any
+ | filetype.vim files found. It should always Source
+ | $VIMRUNTIME/filetype.vim, which does the following.
+ | |
+ | +- Install autocmds based on suffix to set the 'filetype' option
+ | | This is where the connection between file name and file type is
+ | | made for known file types. *synload-3*
+ | |
+ | +- Source the user's optional file, from the *myfiletypefile*
+ | | variable. This is for backwards compatibility with Vim 5.x only.
+ | | *synload-4*
+ | |
+ | +- Install one autocommand which sources scripts.vim when no file
+ | | type was detected yet. *synload-5*
+ | |
+ | +- Source $VIMRUNTIME/menu.vim, to setup the Syntax menu. |menu.vim|
+ |
+ +- Install a FileType autocommand to set the 'syntax' option when a file
+ | type has been detected. *synload-6*
+ |
+ +- Execute syntax autocommands to start syntax highlighting for each
+ already loaded buffer.
+
+
+Upon loading a file, Vim finds the relevant syntax file as follows:
+
+ Loading the file triggers the BufReadPost autocommands.
+ |
+ +- If there is a match with one of the autocommands from |synload-3|
+ | (known file types) or |synload-4| (user's file types), the 'filetype'
+ | option is set to the file type.
+ |
+ +- The autocommand at |synload-5| is triggered. If the file type was not
+ | found yet, then scripts.vim is searched for in 'runtimepath'. This
+ | should always load $VIMRUNTIME/scripts.vim, which does the following.
+ | |
+ | +- Source the user's optional file, from the *myscriptsfile*
+ | | variable. This is for backwards compatibility with Vim 5.x only.
+ | |
+ | +- If the file type is still unknown, check the contents of the file,
+ | again with checks like "getline(1) =~ pattern" as to whether the
+ | file type can be recognized, and set 'filetype'.
+ |
+ +- When the file type was determined and 'filetype' was set, this
+ | triggers the FileType autocommand |synload-6| above. It sets
+ | 'syntax' to the determined file type.
+ |
+ +- When the 'syntax' option was set above, this triggers an autocommand
+ | from |synload-1| (and |synload-2|). This find the main syntax file in
+ | 'runtimepath', with this command:
+ | runtime! syntax/<name>.vim
+ |
+ +- Any other user installed FileType or Syntax autocommands are
+ triggered. This can be used to change the highlighting for a specific
+ syntax.
+
+==============================================================================
+4. Conversion to HTML *2html.vim* *convert-to-HTML*
+
+2html is not a syntax file itself, but a script that converts the current
+window into HTML. Vim opens a new window in which it builds the HTML file.
+
+After you save the resulting file, you can view it with any browser. The
+colors should be exactly the same as you see them in Vim. With
+|g:html_line_ids| you can jump to specific lines by adding (for example) #L123
+or #123 to the end of the URL in your browser's address bar. And with
+|g:html_dynamic_folds| enabled, you can show or hide the text that is folded
+in Vim.
+
+You are not supposed to set the 'filetype' or 'syntax' option to "2html"!
+Source the script to convert the current file: >
+
+ :runtime! syntax/2html.vim
+<
+Many variables affect the output of 2html.vim; see below. Any of the on/off
+options listed below can be enabled or disabled by setting them explicitly to
+the desired value, or restored to their default by removing the variable using
+|:unlet|.
+
+Remarks:
+- Some truly ancient browsers may not show the background colors.
+- From most browsers you can also print the file (in color)!
+- The latest TOhtml may actually work with older versions of Vim, but some
+ features such as conceal support will not function, and the colors may be
+ incorrect for an old Vim without GUI support compiled in.
+
+Here is an example how to run the script over all .c and .h files from a
+Unix shell: >
+ for f in *.[ch]; do gvim -f +"syn on" +"run! syntax/2html.vim" +"wq" +"q" $f; done
+<
+ *g:html_start_line* *g:html_end_line*
+To restrict the conversion to a range of lines, use a range with the |:TOhtml|
+command below, or set "g:html_start_line" and "g:html_end_line" to the first
+and last line to be converted. Example, using the last set Visual area: >
+
+ :let g:html_start_line = line("'<")
+ :let g:html_end_line = line("'>")
+ :runtime! syntax/2html.vim
+<
+ *:TOhtml*
+:[range]TOhtml The ":TOhtml" command is defined in a standard plugin.
+ This command will source |2html.vim| for you. When a
+ range is given, this command sets |g:html_start_line|
+ and |g:html_end_line| to the start and end of the
+ range, respectively. Default range is the entire
+ buffer.
+
+ If the current window is part of a |diff|, unless
+ |g:html_diff_one_file| is set, :TOhtml will convert
+ all windows which are part of the diff in the current
+ tab and place them side-by-side in a <table> element
+ in the generated HTML. With |g:html_line_ids| you can
+ jump to lines in specific windows with (for example)
+ #W1L42 for line 42 in the first diffed window, or
+ #W3L87 for line 87 in the third.
+
+ Examples: >
+
+ :10,40TOhtml " convert lines 10-40 to html
+ :'<,'>TOhtml " convert current/last visual selection
+ :TOhtml " convert entire buffer
+<
+ *g:html_diff_one_file*
+Default: 0.
+When 0, and using |:TOhtml| all windows involved in a |diff| in the current tab
+page are converted to HTML and placed side-by-side in a <table> element. When
+1, only the current buffer is converted.
+Example: >
+
+ let g:html_diff_one_file = 1
+<
+ *g:html_whole_filler*
+Default: 0.
+When 0, if |g:html_diff_one_file| is 1, a sequence of more than 3 filler lines
+is displayed as three lines with the middle line mentioning the total number
+of inserted lines.
+When 1, always display all inserted lines as if |g:html_diff_one_file| were
+not set.
+>
+ :let g:html_whole_filler = 1
+<
+ *TOhtml-performance* *g:html_no_progress*
+Default: 0.
+When 0, display a progress bar in the statusline for each major step in the
+2html.vim conversion process.
+When 1, do not display the progress bar. This offers a minor speed improvement
+but you won't have any idea how much longer the conversion might take; for big
+files it can take a long time!
+Example: >
+
+ let g:html_no_progress = 1
+<
+You can obtain better performance improvements by also instructing Vim to not
+run interactively, so that too much time is not taken to redraw as the script
+moves through the buffer, switches windows, and the like: >
+
+ vim -E -s -c "let g:html_no_progress=1" -c "syntax on" -c "set ft=c" -c "runtime syntax/2html.vim" -cwqa myfile.c
+<
+Note that the -s flag prevents loading your .vimrc and any plugins, so you
+need to explicitly source/enable anything that will affect the HTML
+conversion. See |-E| and |-s-ex| for details. It is probably best to create a
+script to replace all the -c commands and use it with the -u flag instead of
+specifying each command separately.
+
+ *hl-TOhtmlProgress* *TOhtml-progress-color*
+When displayed, the progress bar will show colored boxes along the statusline
+as the HTML conversion proceeds. By default, the background color as the
+current "DiffDelete" highlight group is used. If "DiffDelete" and "StatusLine"
+have the same background color, TOhtml will automatically adjust the color to
+differ. If you do not like the automatically selected colors, you can define
+your own highlight colors for the progress bar. Example: >
+
+ hi TOhtmlProgress guifg=#c0ffee ctermbg=7
+<
+ *g:html_number_lines*
+Default: Current 'number' setting.
+When 0, buffer text is displayed in the generated HTML without line numbering.
+When 1, a column of line numbers is added to the generated HTML with the same
+highlighting as the line number column in Vim (|hl-LineNr|).
+Force line numbers even if 'number' is not set: >
+ :let g:html_number_lines = 1
+Force to omit the line numbers: >
+ :let g:html_number_lines = 0
+Go back to the default to use 'number' by deleting the variable: >
+ :unlet g:html_number_lines
+<
+ *g:html_line_ids*
+Default: 1 if |g:html_number_lines| is set, 0 otherwise.
+When 1, adds an HTML id attribute to each line number, or to an empty <span>
+inserted for that purpose if no line numbers are shown. This ID attribute
+takes the form of L123 for single-buffer HTML pages, or W2L123 for diff-view
+pages, and is used to jump to a specific line (in a specific window of a diff
+view). Javascript is inserted to open any closed dynamic folds
+(|g:html_dynamic_folds|) containing the specified line before jumping. The
+javascript also allows omitting the window ID in the url, and the leading L.
+For example: >
+
+ page.html#L123 jumps to line 123 in a single-buffer file
+ page.html#123 does the same
+
+ diff.html#W1L42 jumps to line 42 in the first window in a diff
+ diff.html#42 does the same
+<
+ *g:html_use_css*
+Default: 1.
+When 1, generate valid HTML 5 markup with CSS styling, supported in all modern
+browsers and many old browsers.
+When 0, generate <font> tags and similar outdated markup. This is not
+recommended but it may work better in really old browsers, email clients,
+forum posts, and similar situations where basic CSS support is unavailable.
+Example: >
+ :let g:html_use_css = 0
+<
+ *g:html_ignore_conceal*
+Default: 0.
+When 0, concealed text is removed from the HTML and replaced with a character
+from |:syn-cchar| or 'listchars' as appropriate, depending on the current
+value of 'conceallevel'.
+When 1, include all text from the buffer in the generated HTML, even if it is
+|conceal|ed.
+
+Either of the following commands will ensure that all text in the buffer is
+included in the generated HTML (unless it is folded): >
+ :let g:html_ignore_conceal = 1
+ :setl conceallevel=0
+<
+ *g:html_ignore_folding*
+Default: 0.
+When 0, text in a closed fold is replaced by the text shown for the fold in
+Vim (|fold-foldtext|). See |g:html_dynamic_folds| if you also want to allow
+the user to expand the fold as in Vim to see the text inside.
+When 1, include all text from the buffer in the generated HTML; whether the
+text is in a fold has no impact at all. |g:html_dynamic_folds| has no effect.
+
+Either of these commands will ensure that all text in the buffer is included
+in the generated HTML (unless it is concealed): >
+ zR
+ :let g:html_ignore_folding = 1
+<
+ *g:html_dynamic_folds*
+Default: 0.
+When 0, text in a closed fold is not included at all in the generated HTML.
+When 1, generate javascript to open a fold and show the text within, just like
+in Vim.
+
+Setting this variable to 1 causes 2html.vim to always use CSS for styling,
+regardless of what |g:html_use_css| is set to.
+
+This variable is ignored when |g:html_ignore_folding| is set.
+>
+ :let g:html_dynamic_folds = 1
+<
+ *g:html_no_foldcolumn*
+Default: 0.
+When 0, if |g:html_dynamic_folds| is 1, generate a column of text similar to
+Vim's foldcolumn (|fold-foldcolumn|) the user can click on to toggle folds
+open or closed. The minimum width of the generated text column is the current
+'foldcolumn' setting.
+When 1, do not generate this column; instead, hovering the mouse cursor over
+folded text will open the fold as if |g:html_hover_unfold| were set.
+>
+ :let g:html_no_foldcolumn = 1
+<
+ *TOhtml-uncopyable-text* *g:html_prevent_copy*
+Default: Empty string.
+This option prevents certain regions of the generated HTML from being copied,
+when you select all text in document rendered in a browser and copy it. Useful
+for allowing users to copy-paste only the source text even if a fold column or
+line numbers are shown in the generated content. Specify regions to be
+affected in this way as follows:
+ f: fold column
+ n: line numbers (also within fold text)
+ t: fold text
+ d: diff filler
+
+Example, to make the fold column and line numbers uncopyable: >
+ :let g:html_prevent_copy = "fn"
+<
+The method used to prevent copying in the generated page depends on the value
+of |g:html_use_input_for_pc|.
+
+ *g:html_use_input_for_pc*
+Default: "fallback"
+If |g:html_prevent_copy| is non-empty, then:
+
+When "all", read-only <input> elements are used in place of normal text for
+uncopyable regions. In some browsers, especially older browsers, after
+selecting an entire page and copying the selection, the <input> tags are not
+pasted with the page text. If |g:html_no_invalid| is 0, the <input> tags have
+invalid type; this works in more browsers, but the page will not validate.
+Note: This method does NOT work in recent versions of Chrome and equivalent
+browsers; the <input> tags get pasted with the text.
+
+When "fallback" (default value), the same <input> elements are generated for
+older browsers, but newer browsers (detected by CSS feature query) hide the
+<input> elements and instead use generated content in an ::before pseudoelement
+to display the uncopyable text. This method should work with the largest
+number of browsers, both old and new.
+
+When "none", the <input> elements are not generated at all. Only the
+generated-content method is used. This means that old browsers, notably
+Internet Explorer, will either copy the text intended not to be copyable, or
+the non-copyable text may not appear at all. However, this is the most
+standards-based method, and there will be much less markup.
+
+ *g:html_no_invalid*
+Default: 0.
+When 0, if |g:html_prevent_copy| is non-empty and |g:html_use_input_for_pc| is
+not "none", an invalid attribute is intentionally inserted into the <input>
+element for the uncopyable areas. This prevents pasting the <input> elements
+in some applications. Specifically, some versions of Microsoft Word will not
+paste the <input> elements if they contain this invalid attribute. When 1, no
+invalid markup is inserted, and the generated page should validate. However,
+<input> elements may be pasted into some applications and can be difficult to
+remove afterward.
+
+ *g:html_hover_unfold*
+Default: 0.
+When 0, the only way to open a fold generated by 2html.vim with
+|g:html_dynamic_folds| set, is to click on the generated fold column.
+When 1, use CSS 2.0 to allow the user to open a fold by moving the mouse
+cursor over the displayed fold text. This is useful to allow users with
+disabled javascript to view the folded text.
+
+Note that old browsers (notably Internet Explorer 6) will not support this
+feature. Browser-specific markup for IE6 is included to fall back to the
+normal CSS1 styling so that the folds show up correctly for this browser, but
+they will not be openable without a foldcolumn.
+>
+ :let g:html_hover_unfold = 1
+<
+ *g:html_id_expr*
+Default: ""
+Dynamic folding and jumping to line IDs rely on unique IDs within the document
+to work. If generated HTML is copied into a larger document, these IDs are no
+longer guaranteed to be unique. Set g:html_id_expr to an expression Vim can
+evaluate to get a unique string to append to each ID used in a given document,
+so that the full IDs will be unique even when combined with other content in a
+larger HTML document. Example, to append _ and the buffer number to each ID: >
+
+ :let g:html_id_expr = '"_" .. bufnr("%")'
+<
+To append a string "_mystring" to the end of each ID: >
+
+ :let g:html_id_expr = '"_mystring"'
+<
+Note: When converting a diff view to HTML, the expression will only be
+evaluated for the first window in the diff, and the result used for all the
+windows.
+
+ *TOhtml-wrap-text* *g:html_pre_wrap*
+Default: Current 'wrap' setting.
+When 0, if |g:html_no_pre| is 0 or unset, the text in the generated HTML does
+not wrap at the edge of the browser window.
+When 1, if |g:html_use_css| is 1, the CSS 2.0 "white-space:pre-wrap" value is
+used, causing the text to wrap at whitespace at the edge of the browser
+window.
+Explicitly enable text wrapping: >
+ :let g:html_pre_wrap = 1
+Explicitly disable wrapping: >
+ :let g:html_pre_wrap = 0
+Go back to default, determine wrapping from 'wrap' setting: >
+ :unlet g:html_pre_wrap
+<
+ *g:html_no_pre*
+Default: 0.
+When 0, buffer text in the generated HTML is surrounded by <pre>...</pre>
+tags. Series of whitespace is shown as in Vim without special markup, and tab
+characters can be included literally (see |g:html_expand_tabs|).
+When 1 (not recommended), the <pre> tags are omitted, and a plain <div> is
+used instead. Whitespace is replaced by a series of &nbsp; character
+references, and <br> is used to end each line. This is another way to allow
+text in the generated HTML is wrap (see |g:html_pre_wrap|) which also works in
+old browsers, but may cause noticeable differences between Vim's display and
+the rendered page generated by 2html.vim.
+>
+ :let g:html_no_pre = 1
+<
+ *g:html_no_doc*
+Default: 0.
+When 1 it doesn't generate a full HTML document with a DOCTYPE, <head>,
+<body>, etc. If |g:html_use_css| is enabled (the default) you'll have to
+define the CSS manually. The |g:html_dynamic_folds| and |g:html_line_ids|
+settings (off by default) also insert some JavaScript.
+
+
+ *g:html_no_links*
+Default: 0.
+Don't generate <a> tags for text that looks like an URL.
+
+ *g:html_no_modeline*
+Default: 0.
+Don't generate a modeline disabling folding.
+
+ *g:html_expand_tabs*
+Default: 0 if 'tabstop' is 8, 'expandtab' is 0, 'vartabstop' is not in use,
+ and no fold column or line numbers occur in the generated HTML;
+ 1 otherwise.
+When 1, <Tab> characters in the buffer text are replaced with an appropriate
+number of space characters, or &nbsp; references if |g:html_no_pre| is 1.
+When 0, if |g:html_no_pre| is 0 or unset, <Tab> characters in the buffer text
+are included as-is in the generated HTML. This is useful for when you want to
+allow copy and paste from a browser without losing the actual whitespace in
+the source document. Note that this can easily break text alignment and
+indentation in the HTML, unless set by default.
+
+Force |2html.vim| to keep <Tab> characters: >
+ :let g:html_expand_tabs = 0
+<
+Force tabs to be expanded: >
+ :let g:html_expand_tabs = 1
+<
+ *TOhtml-encoding-detect* *TOhtml-encoding*
+It is highly recommended to set your desired encoding with
+|g:html_use_encoding| for any content which will be placed on a web server.
+
+If you do not specify an encoding, |2html.vim| uses the preferred IANA name
+for the current value of 'fileencoding' if set, or 'encoding' if not.
+'encoding' is always used for certain 'buftype' values. 'fileencoding' will be
+set to match the chosen document encoding.
+
+Automatic detection works for the encodings mentioned specifically by name in
+|encoding-names|, but TOhtml will only automatically use those encodings with
+wide browser support. However, you can override this to support specific
+encodings that may not be automatically detected by default (see options
+below). See http://www.iana.org/assignments/character-sets for the IANA names.
+
+Note: By default all Unicode encodings are converted to UTF-8 with no BOM in
+the generated HTML, as recommended by W3C:
+
+ http://www.w3.org/International/questions/qa-choosing-encodings
+ http://www.w3.org/International/questions/qa-byte-order-mark
+
+ *g:html_use_encoding*
+Default: none, uses IANA name for current 'fileencoding' as above.
+To overrule all automatic charset detection, set g:html_use_encoding to the
+name of the charset to be used. It is recommended to set this variable to
+something widely supported, like UTF-8, for anything you will be hosting on a
+webserver: >
+ :let g:html_use_encoding = "UTF-8"
+You can also use this option to omit the line that specifies the charset
+entirely, by setting g:html_use_encoding to an empty string (NOT recommended): >
+ :let g:html_use_encoding = ""
+To go back to the automatic mechanism, delete the |g:html_use_encoding|
+variable: >
+ :unlet g:html_use_encoding
+<
+ *g:html_encoding_override*
+Default: none, autoload/tohtml.vim contains default conversions for encodings
+ mentioned by name at |encoding-names|.
+This option allows |2html.vim| to detect the correct 'fileencoding' when you
+specify an encoding with |g:html_use_encoding| which is not in the default
+list of conversions.
+
+This is a dictionary of charset-encoding pairs that will replace existing
+pairs automatically detected by TOhtml, or supplement with new pairs.
+
+Detect the HTML charset "windows-1252" as the encoding "8bit-cp1252": >
+ :let g:html_encoding_override = {'windows-1252': '8bit-cp1252'}
+<
+ *g:html_charset_override*
+Default: none, autoload/tohtml.vim contains default conversions for encodings
+ mentioned by name at |encoding-names| and which have wide
+ browser support.
+This option allows |2html.vim| to detect the HTML charset for any
+'fileencoding' or 'encoding' which is not detected automatically. You can also
+use it to override specific existing encoding-charset pairs. For example,
+TOhtml will by default use UTF-8 for all Unicode/UCS encodings. To use UTF-16
+and UTF-32 instead, use: >
+ :let g:html_charset_override = {'ucs-4': 'UTF-32', 'utf-16': 'UTF-16'}
+
+Note that documents encoded in either UTF-32 or UTF-16 have known
+compatibility problems with some major browsers.
+
+ *g:html_font*
+Default: "monospace"
+You can specify the font or fonts used in the converted document using
+g:html_font. If this option is set to a string, then the value will be
+surrounded with single quotes. If this option is set to a list then each list
+item is surrounded by single quotes and the list is joined with commas. Either
+way, "monospace" is added as the fallback generic family name and the entire
+result used as the font family (using CSS) or font face (if not using CSS).
+Examples: >
+
+ " font-family: 'Consolas', monospace;
+ :let g:html_font = "Consolas"
+
+ " font-family: 'DejaVu Sans Mono', 'Consolas', monospace;
+ :let g:html_font = ["DejaVu Sans Mono", "Consolas"]
+<
+ *convert-to-XML* *convert-to-XHTML* *g:html_use_xhtml*
+Default: 0.
+When 0, generate standard HTML 4.01 (strict when possible).
+When 1, generate XHTML 1.0 instead (XML compliant HTML).
+>
+ :let g:html_use_xhtml = 1
+<
+==============================================================================
+5. Syntax file remarks *:syn-file-remarks*
+
+ *b:current_syntax-variable*
+Vim stores the name of the syntax that has been loaded in the
+"b:current_syntax" variable. You can use this if you want to load other
+settings, depending on which syntax is active. Example: >
+ :au BufReadPost * if b:current_syntax == "csh"
+ :au BufReadPost * do-some-things
+ :au BufReadPost * endif
+
+
+
+ABEL *abel.vim* *ft-abel-syntax*
+
+ABEL highlighting provides some user-defined options. To enable them, assign
+any value to the respective variable. Example: >
+ :let abel_obsolete_ok=1
+To disable them use ":unlet". Example: >
+ :unlet abel_obsolete_ok
+
+Variable Highlight ~
+abel_obsolete_ok obsolete keywords are statements, not errors
+abel_cpp_comments_illegal do not interpret '//' as inline comment leader
+
+
+ADA
+
+See |ft-ada-syntax|
+
+
+ANT *ant.vim* *ft-ant-syntax*
+
+The ant syntax file provides syntax highlighting for javascript and python
+by default. Syntax highlighting for other script languages can be installed
+by the function AntSyntaxScript(), which takes the tag name as first argument
+and the script syntax file name as second argument. Example: >
+
+ :call AntSyntaxScript('perl', 'perl.vim')
+
+will install syntax perl highlighting for the following ant code >
+
+ <script language = 'perl'><![CDATA[
+ # everything inside is highlighted as perl
+ ]]></script>
+
+See |mysyntaxfile-add| for installing script languages permanently.
+
+
+APACHE *apache.vim* *ft-apache-syntax*
+
+The apache syntax file provides syntax highlighting for Apache HTTP server
+version 2.2.3.
+
+
+ *asm.vim* *asmh8300.vim* *nasm.vim* *masm.vim* *asm68k*
+ASSEMBLY *ft-asm-syntax* *ft-asmh8300-syntax* *ft-nasm-syntax*
+ *ft-masm-syntax* *ft-asm68k-syntax* *fasm.vim*
+
+Files matching "*.i" could be Progress or Assembly. If the automatic detection
+doesn't work for you, or you don't edit Progress at all, use this in your
+startup vimrc: >
+ :let filetype_i = "asm"
+Replace "asm" with the type of assembly you use.
+
+There are many types of assembly languages that all use the same file name
+extensions. Therefore you will have to select the type yourself, or add a
+line in the assembly file that Vim will recognize. Currently these syntax
+files are included:
+ asm GNU assembly (the default)
+ asm68k Motorola 680x0 assembly
+ asmh8300 Hitachi H-8300 version of GNU assembly
+ ia64 Intel Itanium 64
+ fasm Flat assembly (http://flatassembler.net)
+ masm Microsoft assembly (probably works for any 80x86)
+ nasm Netwide assembly
+ tasm Turbo Assembly (with opcodes 80x86 up to Pentium, and
+ MMX)
+ pic PIC assembly (currently for PIC16F84)
+
+The most flexible is to add a line in your assembly file containing: >
+ asmsyntax=nasm
+Replace "nasm" with the name of the real assembly syntax. This line must be
+one of the first five lines in the file. No non-white text must be
+immediately before or after this text. Note that specifying asmsyntax=foo is
+equivalent to setting ft=foo in a |modeline|, and that in case of a conflict
+between the two settings the one from the modeline will take precedence (in
+particular, if you have ft=asm in the modeline, you will get the GNU syntax
+highlighting regardless of what is specified as asmsyntax).
+
+The syntax type can always be overruled for a specific buffer by setting the
+b:asmsyntax variable: >
+ :let b:asmsyntax = "nasm"
+
+If b:asmsyntax is not set, either automatically or by hand, then the value of
+the global variable asmsyntax is used. This can be seen as a default assembly
+language: >
+ :let asmsyntax = "nasm"
+
+As a last resort, if nothing is defined, the "asm" syntax is used.
+
+
+Netwide assembler (nasm.vim) optional highlighting ~
+
+To enable a feature: >
+ :let {variable}=1|set syntax=nasm
+To disable a feature: >
+ :unlet {variable} |set syntax=nasm
+
+Variable Highlight ~
+nasm_loose_syntax unofficial parser allowed syntax not as Error
+ (parser dependent; not recommended)
+nasm_ctx_outside_macro contexts outside macro not as Error
+nasm_no_warn potentially risky syntax not as ToDo
+
+
+ASPPERL and ASPVBS *ft-aspperl-syntax* *ft-aspvbs-syntax*
+
+*.asp and *.asa files could be either Perl or Visual Basic script. Since it's
+hard to detect this you can set two global variables to tell Vim what you are
+using. For Perl script use: >
+ :let g:filetype_asa = "aspperl"
+ :let g:filetype_asp = "aspperl"
+For Visual Basic use: >
+ :let g:filetype_asa = "aspvbs"
+ :let g:filetype_asp = "aspvbs"
+
+
+BAAN *baan.vim* *baan-syntax*
+
+The baan.vim gives syntax support for BaanC of release BaanIV up to SSA ERP LN
+for both 3 GL and 4 GL programming. Large number of standard defines/constants
+are supported.
+
+Some special violation of coding standards will be signalled when one specify
+in ones |.vimrc|: >
+ let baan_code_stds=1
+
+*baan-folding*
+
+Syntax folding can be enabled at various levels through the variables
+mentioned below (Set those in your |.vimrc|). The more complex folding on
+source blocks and SQL can be CPU intensive.
+
+To allow any folding and enable folding at function level use: >
+ let baan_fold=1
+Folding can be enabled at source block level as if, while, for ,... The
+indentation preceding the begin/end keywords has to match (spaces are not
+considered equal to a tab). >
+ let baan_fold_block=1
+Folding can be enabled for embedded SQL blocks as SELECT, SELECTDO,
+SELECTEMPTY, ... The indentation preceding the begin/end keywords has to
+match (spaces are not considered equal to a tab). >
+ let baan_fold_sql=1
+Note: Block folding can result in many small folds. It is suggested to |:set|
+the options 'foldminlines' and 'foldnestmax' in |.vimrc| or use |:setlocal| in
+.../after/syntax/baan.vim (see |after-directory|). Eg: >
+ set foldminlines=5
+ set foldnestmax=6
+
+
+BASIC *basic.vim* *vb.vim* *ft-basic-syntax* *ft-vb-syntax*
+
+Both Visual Basic and "normal" BASIC use the extension ".bas". To detect
+which one should be used, Vim checks for the string "VB_Name" in the first
+five lines of the file. If it is not found, filetype will be "basic",
+otherwise "vb". Files with the ".frm" extension will always be seen as Visual
+Basic.
+
+If the automatic detection doesn't work for you or you only edit, for
+example, FreeBASIC files, use this in your startup vimrc: >
+ :let filetype_bas = "freebasic"
+
+
+C *c.vim* *ft-c-syntax*
+
+A few things in C highlighting are optional. To enable them assign any value
+(including zero) to the respective variable. Example: >
+ :let c_comment_strings = 1
+ :let c_no_bracket_error = 0
+To disable them use `:unlet`. Example: >
+ :unlet c_comment_strings
+Setting the value to zero doesn't work!
+
+An alternative is to switch to the C++ highlighting: >
+ :set filetype=cpp
+
+Variable Highlight ~
+*c_gnu* GNU gcc specific items
+*c_comment_strings* strings and numbers inside a comment
+*c_space_errors* trailing white space and spaces before a <Tab>
+*c_no_trail_space_error* ... but no trailing spaces
+*c_no_tab_space_error* ... but no spaces before a <Tab>
+*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 } by finding all pairs; this
+ forces syncing from the start of the file, can be slow
+*c_no_ansi* don't do standard ANSI types and constants
+*c_ansi_typedefs* ... but do standard ANSI types
+*c_ansi_constants* ... but do standard ANSI constants
+*c_no_utf* don't highlight \u and \U in strings
+*c_syntax_for_h* for *.h files use C syntax instead of C++ and use objc
+ syntax instead of objcpp
+*c_no_if0* don't highlight "#if 0" blocks as comments
+*c_no_cformat* don't highlight %-formats in strings
+*c_no_c99* don't highlight C99 standard items
+*c_no_c11* don't highlight C11 standard items
+*c_no_bsd* don't highlight BSD specific types
+
+When 'foldmethod' is set to "syntax" then /* */ comments and { } blocks will
+become a fold. If you don't want comments to become a fold use: >
+ :let c_no_comment_fold = 1
+"#if 0" blocks are also folded, unless: >
+ :let c_no_if0_fold = 1
+
+If you notice highlighting errors while scrolling backwards, which are fixed
+when redrawing with CTRL-L, try setting the "c_minlines" internal variable
+to a larger number: >
+ :let c_minlines = 100
+This will make the syntax synchronization start 100 lines before the first
+displayed line. The default value is 50 (15 when c_no_if0 is set). The
+disadvantage of using a larger number is that redrawing can become slow.
+
+When using the "#if 0" / "#endif" comment highlighting, notice that this only
+works when the "#if 0" is within "c_minlines" from the top of the window. If
+you have a long "#if 0" construct it will not be highlighted correctly.
+
+To match extra items in comments, use the cCommentGroup cluster.
+Example: >
+ :au Syntax c call MyCadd()
+ :function MyCadd()
+ : syn keyword cMyItem contained Ni
+ : syn cluster cCommentGroup add=cMyItem
+ : hi link cMyItem Title
+ :endfun
+
+ANSI constants will be highlighted with the "cConstant" group. This includes
+"NULL", "SIG_IGN" and others. But not "TRUE", for example, because this is
+not in the ANSI standard. If you find this confusing, remove the cConstant
+highlighting: >
+ :hi link cConstant NONE
+
+If you see '{' and '}' highlighted as an error where they are OK, reset the
+highlighting for cErrInParen and cErrInBracket.
+
+If you want to use folding in your C files, you can add these lines in a file
+in the "after" directory in 'runtimepath'. For Unix this would be
+~/.vim/after/syntax/c.vim. >
+ syn sync fromstart
+ set foldmethod=syntax
+
+CH *ch.vim* *ft-ch-syntax*
+
+C/C++ interpreter. Ch has similar syntax highlighting to C and builds upon
+the C syntax file. See |c.vim| for all the settings that are available for C.
+
+By setting a variable you can tell Vim to use Ch syntax for *.h files, instead
+of C or C++: >
+ :let ch_syntax_for_h = 1
+
+
+CHILL *chill.vim* *ft-chill-syntax*
+
+Chill syntax highlighting is similar to C. See |c.vim| for all the settings
+that are available. Additionally there is:
+
+chill_space_errors like c_space_errors
+chill_comment_string like c_comment_strings
+chill_minlines like c_minlines
+
+
+CHANGELOG *changelog.vim* *ft-changelog-syntax*
+
+ChangeLog supports highlighting spaces at the start of a line.
+If you do not like this, add following line to your .vimrc: >
+ let g:changelog_spacing_errors = 0
+This works the next time you edit a changelog file. You can also use
+"b:changelog_spacing_errors" to set this per buffer (before loading the syntax
+file).
+
+You can change the highlighting used, e.g., to flag the spaces as an error: >
+ :hi link ChangelogError Error
+Or to avoid the highlighting: >
+ :hi link ChangelogError NONE
+This works immediately.
+
+
+CLOJURE *ft-clojure-syntax*
+
+ *g:clojure_syntax_keywords*
+
+Syntax highlighting of public vars in "clojure.core" is provided by default,
+but additional symbols can be highlighted by adding them to the
+|g:clojure_syntax_keywords| variable. The value should be a |Dictionary| of
+syntax group names, each containing a |List| of 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.
+
+There is also *b:clojure_syntax_keywords* which is a buffer-local variant of
+this variable intended for use by plugin authors to highlight symbols
+dynamically.
+
+By setting the *b:clojure_syntax_without_core_keywords* variable, vars from
+"clojure.core" will not be highlighted by default. This is useful for
+namespaces that have set `(:refer-clojure :only [])`
+
+
+ *g:clojure_fold*
+
+Setting |g:clojure_fold| to `1` will enable the folding of Clojure code. Any
+list, vector or map that extends over more than one line can be folded using
+the standard Vim |fold-commands|.
+
+
+ *g:clojure_discard_macro*
+
+Set this variable to `1` to enable basic highlighting of Clojure's "discard
+reader macro".
+>
+ #_(defn foo [x]
+ (println x))
+<
+Note that this option will not correctly highlight stacked discard macros
+(e.g. `#_#_`).
+
+
+COBOL *cobol.vim* *ft-cobol-syntax*
+
+COBOL highlighting has different needs for legacy code than it does for fresh
+development. This is due to differences in what is being done (maintenance
+versus development) and other factors. To enable legacy code highlighting,
+add this line to your .vimrc: >
+ :let cobol_legacy_code = 1
+To disable it again, use this: >
+ :unlet cobol_legacy_code
+
+
+COLD FUSION *coldfusion.vim* *ft-coldfusion-syntax*
+
+The ColdFusion has its own version of HTML comments. To turn on ColdFusion
+comment highlighting, add the following line to your startup file: >
+
+ :let html_wrong_comments = 1
+
+The ColdFusion syntax file is based on the HTML syntax file.
+
+
+CPP *cpp.vim* *ft-cpp-syntax*
+
+Most things are the same as |ft-c-syntax|.
+
+Variable Highlight ~
+cpp_no_cpp11 don't highlight C++11 standard items
+cpp_no_cpp14 don't highlight C++14 standard items
+cpp_no_cpp17 don't highlight C++17 standard items
+cpp_no_cpp20 don't highlight C++20 standard items
+
+
+CSH *csh.vim* *ft-csh-syntax*
+
+This covers the shell named "csh". Note that on some systems tcsh is actually
+used.
+
+Detecting whether a file is csh or tcsh is notoriously hard. Some systems
+symlink /bin/csh to /bin/tcsh, making it almost impossible to distinguish
+between csh and tcsh. In case VIM guesses wrong you can set the
+"filetype_csh" variable. For using csh: *g:filetype_csh*
+>
+ :let g:filetype_csh = "csh"
+
+For using tcsh: >
+
+ :let g:filetype_csh = "tcsh"
+
+Any script with a tcsh extension or a standard tcsh filename (.tcshrc,
+tcsh.tcshrc, tcsh.login) will have filetype tcsh. All other tcsh/csh scripts
+will be classified as tcsh, UNLESS the "filetype_csh" variable exists. If the
+"filetype_csh" variable exists, the filetype will be set to the value of the
+variable.
+
+
+CYNLIB *cynlib.vim* *ft-cynlib-syntax*
+
+Cynlib files are C++ files that use the Cynlib class library to enable
+hardware modelling and simulation using C++. Typically Cynlib files have a .cc
+or a .cpp extension, which makes it very difficult to distinguish them from a
+normal C++ file. Thus, to enable Cynlib highlighting for .cc files, add this
+line to your .vimrc file: >
+
+ :let cynlib_cyntax_for_cc=1
+
+Similarly for cpp files (this extension is only usually used in Windows) >
+
+ :let cynlib_cyntax_for_cpp=1
+
+To disable these again, use this: >
+
+ :unlet cynlib_cyntax_for_cc
+ :unlet cynlib_cyntax_for_cpp
+<
+
+CWEB *cweb.vim* *ft-cweb-syntax*
+
+Files matching "*.w" could be Progress or cweb. If the automatic detection
+doesn't work for you, or you don't edit Progress at all, use this in your
+startup vimrc: >
+ :let filetype_w = "cweb"
+
+
+DART *dart.vim* *ft-dart-syntax*
+
+Dart is an object-oriented, typed, class defined, garbage collected language
+used for developing mobile, desktop, web, and back-end applications. Dart uses
+a C-like syntax derived from C, Java, and JavaScript, with features adopted
+from Smalltalk, Python, Ruby, and others.
+
+More information about the language and its development environment at the
+official Dart language website at https://dart.dev
+
+dart.vim syntax detects and highlights Dart statements, reserved words,
+type declarations, storage classes, conditionals, loops, interpolated values,
+and comments. There is no support idioms from Flutter or any other Dart
+framework.
+
+Changes, fixes? Submit an issue or pull request via:
+
+https://github.com/pr3d4t0r/dart-vim-syntax/
+
+
+DESKTOP *desktop.vim* *ft-desktop-syntax*
+
+Primary goal of this syntax file is to highlight .desktop and .directory files
+according to freedesktop.org standard:
+https://specifications.freedesktop.org/desktop-entry-spec/latest/
+To highlight nonstandard extensions that does not begin with X-, set >
+ let g:desktop_enable_nonstd = 1
+Note that this may cause wrong highlight.
+To highlight KDE-reserved features, set >
+ let g:desktop_enable_kde = 1
+g:desktop_enable_kde follows g:desktop_enable_nonstd if not supplied
+
+
+DIFF *diff.vim*
+
+The diff highlighting normally finds translated headers. This can be slow if
+there are very long lines in the file. To disable translations: >
+
+ :let diff_translations = 0
+
+Also see |diff-slow|.
+
+
+DIRCOLORS *dircolors.vim* *ft-dircolors-syntax*
+
+The dircolors utility highlighting definition has one option. It exists to
+provide compatibility with the Slackware GNU/Linux distributions version of
+the command. It adds a few keywords that are generally ignored by most
+versions. On Slackware systems, however, the utility accepts the keywords and
+uses them for processing. To enable the Slackware keywords add the following
+line to your startup file: >
+ let dircolors_is_slackware = 1
+
+
+DOCBOOK *docbk.vim* *ft-docbk-syntax* *docbook*
+DOCBOOK XML *docbkxml.vim* *ft-docbkxml-syntax*
+DOCBOOK SGML *docbksgml.vim* *ft-docbksgml-syntax*
+
+There are two types of DocBook files: SGML and XML. To specify what type you
+are using the "b:docbk_type" variable should be set. Vim does this for you
+automatically if it can recognize the type. When Vim can't guess it the type
+defaults to XML.
+You can set the type manually: >
+ :let docbk_type = "sgml"
+or: >
+ :let docbk_type = "xml"
+You need to do this before loading the syntax file, which is complicated.
+Simpler is setting the filetype to "docbkxml" or "docbksgml": >
+ :set filetype=docbksgml
+or: >
+ :set filetype=docbkxml
+
+You can specify the DocBook version: >
+ :let docbk_ver = 3
+When not set 4 is used.
+
+
+DOSBATCH *dosbatch.vim* *ft-dosbatch-syntax*
+
+Select the set of Windows Command interpreter extensions that should be
+supported with the variable dosbatch_cmdextversion. For versions of Windows
+NT (before Windows 2000) this should have the value of 1. For Windows 2000
+and later it should be 2.
+Select the version you want with the following line: >
+
+ :let dosbatch_cmdextversion = 1
+
+If this variable is not defined it defaults to a value of 2 to support
+Windows 2000 and later.
+
+The original MS-DOS supports an idiom of using a double colon (::) as an
+alternative way to enter a comment line. This idiom can be used with the
+current Windows Command Interpreter, but it can lead to problems when used
+inside ( ... ) command blocks. You can find a discussion about this on
+Stack Overflow -
+
+https://stackoverflow.com/questions/12407800/which-comment-style-should-i-use-in-batch-files
+
+To allow the use of the :: idiom for comments in the Windows Command
+Interpreter or working with MS-DOS bat files, set the
+dosbatch_colons_comment variable to anything: >
+
+ :let dosbatch_colons_comment = 1
+
+There is an option that covers whether *.btm files should be detected as type
+"dosbatch" (MS-DOS batch files) or type "btm" (4DOS batch files). The latter
+is used by default. You may select the former with the following line: >
+
+ :let g:dosbatch_syntax_for_btm = 1
+
+If this variable is undefined or zero, btm syntax is selected.
+
+
+DOXYGEN *doxygen.vim* *doxygen-syntax*
+
+Doxygen generates code documentation using a special documentation format
+(similar to Javadoc). This syntax script adds doxygen highlighting to c, cpp,
+idl and php files, and should also work with java.
+
+There are a few of ways to turn on doxygen formatting. It can be done
+explicitly or in a modeline by appending '.doxygen' to the syntax of the file.
+Example: >
+ :set syntax=c.doxygen
+or >
+ // vim:syntax=c.doxygen
+
+It can also be done automatically for C, C++, C#, IDL and PHP files by setting
+the global or buffer-local variable load_doxygen_syntax. This is done by
+adding the following to your .vimrc. >
+ :let g:load_doxygen_syntax=1
+
+There are a couple of variables that have an effect on syntax highlighting,
+and are to do with non-standard highlighting options.
+
+Variable Default Effect ~
+g:doxygen_enhanced_color
+g:doxygen_enhanced_colour 0 Use non-standard highlighting for
+ doxygen comments.
+
+doxygen_my_rendering 0 Disable rendering of HTML bold, italic
+ and html_my_rendering underline.
+
+doxygen_javadoc_autobrief 1 Set to 0 to disable javadoc autobrief
+ colour highlighting.
+
+doxygen_end_punctuation '[.]' Set to regexp match for the ending
+ punctuation of brief
+
+There are also some highlight groups worth mentioning as they can be useful in
+configuration.
+
+Highlight Effect ~
+doxygenErrorComment The colour of an end-comment when missing
+ punctuation in a code, verbatim or dot section
+doxygenLinkError The colour of an end-comment when missing the
+ \endlink from a \link section.
+
+
+DTD *dtd.vim* *ft-dtd-syntax*
+
+The DTD syntax highlighting is case sensitive by default. To disable
+case-sensitive highlighting, add the following line to your startup file: >
+
+ :let dtd_ignore_case=1
+
+The DTD syntax file will highlight unknown tags as errors. If
+this is annoying, it can be turned off by setting: >
+
+ :let dtd_no_tag_errors=1
+
+before sourcing the dtd.vim syntax file.
+Parameter entity names are highlighted in the definition using the
+'Type' highlighting group and 'Comment' for punctuation and '%'.
+Parameter entity instances are highlighted using the 'Constant'
+highlighting group and the 'Type' highlighting group for the
+delimiters % and ;. This can be turned off by setting: >
+
+ :let dtd_no_param_entities=1
+
+The DTD syntax file is also included by xml.vim to highlight included dtd's.
+
+
+EIFFEL *eiffel.vim* *ft-eiffel-syntax*
+
+While Eiffel is not case-sensitive, its style guidelines are, and the
+syntax highlighting file encourages their use. This also allows to
+highlight class names differently. If you want to disable case-sensitive
+highlighting, add the following line to your startup file: >
+
+ :let eiffel_ignore_case=1
+
+Case still matters for class names and TODO marks in comments.
+
+Conversely, for even stricter checks, add one of the following lines: >
+
+ :let eiffel_strict=1
+ :let eiffel_pedantic=1
+
+Setting eiffel_strict will only catch improper capitalization for the
+five predefined words "Current", "Void", "Result", "Precursor", and
+"NONE", to warn against their accidental use as feature or class names.
+
+Setting eiffel_pedantic will enforce adherence to the Eiffel style
+guidelines fairly rigorously (like arbitrary mixes of upper- and
+lowercase letters as well as outdated ways to capitalize keywords).
+
+If you want to use the lower-case version of "Current", "Void",
+"Result", and "Precursor", you can use >
+
+ :let eiffel_lower_case_predef=1
+
+instead of completely turning case-sensitive highlighting off.
+
+Support for ISE's proposed new creation syntax that is already
+experimentally handled by some compilers can be enabled by: >
+
+ :let eiffel_ise=1
+
+Finally, some vendors support hexadecimal constants. To handle them, add >
+
+ :let eiffel_hex_constants=1
+
+to your startup file.
+
+
+EUPHORIA *euphoria3.vim* *euphoria4.vim* *ft-euphoria-syntax*
+
+Two syntax highlighting files exist for Euphoria. One for Euphoria
+version 3.1.1, which is the default syntax highlighting file, and one for
+Euphoria version 4.0.5 or later.
+
+Euphoria version 3.1.1 (http://www.rapideuphoria.com/) is still necessary
+for developing applications for the DOS platform, which Euphoria version 4
+(http://www.openeuphoria.org/) does not support.
+
+The following file extensions are auto-detected as Euphoria file type:
+
+ *.e, *.eu, *.ew, *.ex, *.exu, *.exw
+ *.E, *.EU, *.EW, *.EX, *.EXU, *.EXW
+
+To select syntax highlighting file for Euphoria, as well as for
+auto-detecting the *.e and *.E file extensions as Euphoria file type,
+add the following line to your startup file: >
+
+ :let g:filetype_euphoria = "euphoria3"
+
+< or >
+
+ :let g:filetype_euphoria = "euphoria4"
+
+Elixir and Euphoria share the *.ex file extension. If the filetype is
+specifically set as Euphoria with the g:filetype_euphoria variable, or the
+file is determined to be Euphoria based on keywords in the file, then the
+filetype will be set as Euphoria. Otherwise, the filetype will default to
+Elixir.
+
+
+ERLANG *erlang.vim* *ft-erlang-syntax*
+
+Erlang is a functional programming language developed by Ericsson. Files with
+the following extensions are recognized as Erlang files: erl, hrl, yaws.
+
+The BIFs (built-in functions) are highlighted by default. To disable this,
+put the following line in your vimrc: >
+
+ :let g:erlang_highlight_bifs = 0
+
+To enable highlighting some special atoms, put this in your vimrc: >
+
+ :let g:erlang_highlight_special_atoms = 1
+
+
+ELIXIR *elixir.vim* *ft-elixir-syntax*
+
+Elixir is a dynamic, functional language for building scalable and
+maintainable applications.
+
+The following file extensions are auto-detected as Elixir file types:
+
+ *.ex, *.exs, *.eex, *.leex, *.lock
+
+Elixir and Euphoria share the *.ex file extension. If the filetype is
+specifically set as Euphoria with the g:filetype_euphoria variable, or the
+file is determined to be Euphoria based on keywords in the file, then the
+filetype will be set as Euphoria. Otherwise, the filetype will default to
+Elixir.
+
+
+FLEXWIKI *flexwiki.vim* *ft-flexwiki-syntax*
+
+FlexWiki is an ASP.NET-based wiki package available at http://www.flexwiki.com
+NOTE: This site currently doesn't work, on Wikipedia is mentioned that
+development stopped in 2009.
+
+Syntax highlighting is available for the most common elements of FlexWiki
+syntax. The associated ftplugin script sets some buffer-local options to make
+editing FlexWiki pages more convenient. FlexWiki considers a newline as the
+start of a new paragraph, so the ftplugin sets 'tw'=0 (unlimited line length),
+'wrap' (wrap long lines instead of using horizontal scrolling), 'linebreak'
+(to wrap at a character in 'breakat' instead of at the last char on screen),
+and so on. It also includes some keymaps that are disabled by default.
+
+If you want to enable the keymaps that make "j" and "k" and the cursor keys
+move up and down by display lines, add this to your .vimrc: >
+ :let flexwiki_maps = 1
+
+
+FORM *form.vim* *ft-form-syntax*
+
+The coloring scheme for syntax elements in the FORM file uses the default
+modes Conditional, Number, Statement, Comment, PreProc, Type, and String,
+following the language specifications in 'Symbolic Manipulation with FORM' by
+J.A.M. Vermaseren, CAN, Netherlands, 1991.
+
+If you want to include your own changes to the default colors, you have to
+redefine the following syntax groups:
+
+ - formConditional
+ - formNumber
+ - formStatement
+ - formHeaderStatement
+ - formComment
+ - formPreProc
+ - formDirective
+ - formType
+ - formString
+
+Note that the form.vim syntax file implements FORM preprocessor commands and
+directives per default in the same syntax group.
+
+A predefined enhanced color mode for FORM is available to distinguish between
+header statements and statements in the body of a FORM program. To activate
+this mode define the following variable in your vimrc file >
+
+ :let form_enhanced_color=1
+
+The enhanced mode also takes advantage of additional color features for a dark
+gvim display. Here, statements are colored LightYellow instead of Yellow, and
+conditionals are LightBlue for better distinction.
+
+Both Visual Basic and FORM use the extension ".frm". To detect which one
+should be used, Vim checks for the string "VB_Name" in the first five lines of
+the file. If it is found, filetype will be "vb", otherwise "form".
+
+If the automatic detection doesn't work for you or you only edit, for
+example, FORM files, use this in your startup vimrc: >
+ :let filetype_frm = "form"
+
+
+FORTH *forth.vim* *ft-forth-syntax*
+
+Files matching "*.fs" could be F# or Forth. If the automatic detection
+doesn't work for you, or you don't edit F# at all, use this in your
+startup vimrc: >
+ :let filetype_fs = "forth"
+
+
+FORTRAN *fortran.vim* *ft-fortran-syntax*
+
+Default highlighting and dialect ~
+Highlighting appropriate for Fortran 2008 is used by default. This choice
+should be appropriate for most users most of the time because Fortran 2008 is
+almost a superset of previous versions (Fortran 2003, 95, 90, and 77).
+
+Fortran source code form ~
+Fortran code can be in either fixed or free source form. Note that the
+syntax highlighting will not be correct if the form is incorrectly set.
+
+When you create a new fortran file, the syntax script assumes fixed source
+form. If you always use free source form, then >
+ :let fortran_free_source=1
+in your .vimrc prior to the :syntax on command. If you always use fixed
+source form, then >
+ :let fortran_fixed_source=1
+in your .vimrc prior to the :syntax on command.
+
+If the form of the source code depends, in a non-standard way, upon the file
+extension, then it is most convenient to set fortran_free_source in a ftplugin
+file. For more information on ftplugin files, see |ftplugin|. Note that this
+will work only if the "filetype plugin indent on" command precedes the "syntax
+on" command in your .vimrc file.
+
+When you edit an existing fortran file, the syntax script will assume free
+source form if the fortran_free_source variable has been set, and assumes
+fixed source form if the fortran_fixed_source variable has been set. If
+neither of these variables have been set, the syntax script attempts to
+determine which source form has been used by examining the file extension
+using conventions common to the ifort, gfortran, Cray, NAG, and PathScale
+compilers (.f, .for, .f77 for fixed-source, .f90, .f95, .f03, .f08 for
+free-source). If none of this works, then the script examines the first five
+columns of the first 500 lines of your file. If no signs of free source form
+are detected, then the file is assumed to be in fixed source form. The
+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.
+
+Tabs in fortran files ~
+Tabs are not recognized by the Fortran standards. Tabs are not a good idea in
+fixed format fortran source code which requires fixed column boundaries.
+Therefore, tabs are marked as errors. Nevertheless, some programmers like
+using tabs. If your fortran files contain tabs, then you should set the
+variable fortran_have_tabs in your .vimrc with a command such as >
+ :let fortran_have_tabs=1
+placed prior to the :syntax on command. Unfortunately, the use of tabs will
+mean that the syntax file will not be able to detect incorrect margins.
+
+Syntax folding of fortran files ~
+If you wish to use foldmethod=syntax, then you must first set the variable
+fortran_fold with a command such as >
+ :let fortran_fold=1
+to instruct the syntax script to define fold regions for program units, that
+is main programs starting with a program statement, subroutines, function
+subprograms, block data subprograms, interface blocks, and modules. If you
+also set the variable fortran_fold_conditionals with a command such as >
+ :let fortran_fold_conditionals=1
+then fold regions will also be defined for do loops, if blocks, and select
+case constructs. If you also set the variable
+fortran_fold_multilinecomments with a command such as >
+ :let fortran_fold_multilinecomments=1
+then fold regions will also be defined for three or more consecutive comment
+lines. Note that defining fold regions can be slow for large files.
+
+If fortran_fold, and possibly fortran_fold_conditionals and/or
+fortran_fold_multilinecomments, have been set, then vim will fold your file if
+you set foldmethod=syntax. Comments or blank lines placed between two program
+units are not folded because they are seen as not belonging to any program
+unit.
+
+More precise fortran syntax ~
+If you set the variable fortran_more_precise with a command such as >
+ :let fortran_more_precise=1
+then the syntax coloring will be more precise but slower. In particular,
+statement labels used in do, goto and arithmetic if statements will be
+recognized, as will construct names at the end of a do, if, select or forall
+construct.
+
+Non-default fortran dialects ~
+The syntax script supports two Fortran dialects: f08 and F. You will probably
+find the default highlighting (f08) satisfactory. A few legacy constructs
+deleted or declared obsolescent in the 2008 standard are highlighted as todo
+items.
+
+If you use F, the advantage of setting the dialect appropriately is that
+other legacy features excluded from F will be highlighted as todo items and
+that free source form will be assumed.
+
+The dialect can be selected in various ways. If all your fortran files use
+the same dialect, set the global variable fortran_dialect in your .vimrc prior
+to your syntax on statement. The case-sensitive, permissible values of
+fortran_dialect are "f08" or "F". Invalid values of fortran_dialect are
+ignored.
+
+If the dialect depends upon the file extension, then it is most convenient to
+set a buffer-local variable in a ftplugin file. For more information on
+ftplugin files, see |ftplugin|. For example, if all your fortran files with
+an .f90 extension are written in the F subset, your ftplugin file should
+contain the code >
+ let s:extfname = expand("%:e")
+ if s:extfname ==? "f90"
+ let b:fortran_dialect="F"
+ else
+ unlet! b:fortran_dialect
+ endif
+Note that this will work only if the "filetype plugin indent on" command
+precedes the "syntax on" command in your .vimrc file.
+
+Finer control is necessary if the file extension does not uniquely identify
+the dialect. You can override the default dialect, on a file-by-file basis,
+by including a comment with the directive "fortran_dialect=xx" (where xx=F or
+f08) in one of the first three lines in your file. For example, your older .f
+files may be legacy code but your newer ones may be F codes, and you would
+identify the latter by including in the first three lines of those files a
+Fortran comment of the form >
+ ! fortran_dialect=F
+
+For previous versions of the syntax, you may have set fortran_dialect to the
+now-obsolete values "f77", "f90", "f95", or "elf". Such settings will be
+silently handled as "f08". Users of "elf" may wish to experiment with "F"
+instead.
+
+The syntax/fortran.vim script contains embedded comments that tell you how to
+comment and/or uncomment some lines to (a) activate recognition of some
+non-standard, vendor-supplied intrinsics and (b) to prevent features deleted
+or declared obsolescent in the 2008 standard from being highlighted as todo
+items.
+
+Limitations ~
+Parenthesis checking does not catch too few closing parentheses. Hollerith
+strings are not recognized. Some keywords may be highlighted incorrectly
+because Fortran90 has no reserved words.
+
+For further information related to fortran, see |ft-fortran-indent| and
+|ft-fortran-plugin|.
+
+FREEBASIC *freebasic.vim* *ft-freebasic-syntax*
+
+FreeBASIC files will be highlighted differently for each of the four available
+dialects, "fb", "qb", "fblite" and "deprecated". See |ft-freebasic-plugin|
+for how to select the correct dialect.
+
+Highlighting is further configurable via the following variables.
+
+Variable Highlight ~
+*freebasic_no_comment_fold* disable multiline comment folding
+*freebasic_operators* non-alpha operators
+*freebasic_space_errors* trailing white space and spaces before a <Tab>
+*freebasic_type_suffixes* QuickBASIC style type suffixes
+
+
+
+FVWM CONFIGURATION FILES *fvwm.vim* *ft-fvwm-syntax*
+
+In order for Vim to recognize Fvwm configuration files that do not match
+the patterns *fvwmrc* or *fvwm2rc* , you must put additional patterns
+appropriate to your system in your myfiletypes.vim file. For these
+patterns, you must set the variable "b:fvwm_version" to the major version
+number of Fvwm, and the 'filetype' option to fvwm.
+
+For example, to make Vim identify all files in /etc/X11/fvwm2/
+as Fvwm2 configuration files, add the following: >
+
+ :au! BufNewFile,BufRead /etc/X11/fvwm2/* let b:fvwm_version = 2 |
+ \ set filetype=fvwm
+
+GSP *gsp.vim* *ft-gsp-syntax*
+
+The default coloring style for GSP pages is defined by |html.vim|, and
+the coloring for java code (within java tags or inline between backticks)
+is defined by |java.vim|. The following HTML groups defined in |html.vim|
+are redefined to incorporate and highlight inline java code:
+
+ htmlString
+ htmlValue
+ htmlEndTag
+ htmlTag
+ htmlTagN
+
+Highlighting should look fine most of the places where you'd see inline
+java code, but in some special cases it may not. To add another HTML
+group where you will have inline java code where it does not highlight
+correctly, just copy the line you want from |html.vim| and add gspJava
+to the contains clause.
+
+The backticks for inline java are highlighted according to the htmlError
+group to make them easier to see.
+
+
+GROFF *groff.vim* *ft-groff-syntax*
+
+The groff syntax file is a wrapper for |nroff.vim|, see the notes
+under that heading for examples of use and configuration. The purpose
+of this wrapper is to set up groff syntax extensions by setting the
+filetype from a |modeline| or in a personal filetype definitions file
+(see |filetype.txt|).
+
+
+HASKELL *haskell.vim* *lhaskell.vim* *ft-haskell-syntax*
+
+The Haskell syntax files support plain Haskell code as well as literate
+Haskell code, the latter in both Bird style and TeX style. The Haskell
+syntax highlighting will also highlight C preprocessor directives.
+
+If you want to highlight delimiter characters (useful if you have a
+light-coloured background), add to your .vimrc: >
+ :let hs_highlight_delimiters = 1
+To treat True and False as keywords as opposed to ordinary identifiers,
+add: >
+ :let hs_highlight_boolean = 1
+To also treat the names of primitive types as keywords: >
+ :let hs_highlight_types = 1
+And to treat the names of even more relatively common types as keywords: >
+ :let hs_highlight_more_types = 1
+If you want to highlight the names of debugging functions, put in
+your .vimrc: >
+ :let hs_highlight_debug = 1
+
+The Haskell syntax highlighting also highlights C preprocessor
+directives, and flags lines that start with # but are not valid
+directives as erroneous. This interferes with Haskell's syntax for
+operators, as they may start with #. If you want to highlight those
+as operators as opposed to errors, put in your .vimrc: >
+ :let hs_allow_hash_operator = 1
+
+The syntax highlighting for literate Haskell code will try to
+automatically guess whether your literate Haskell code contains
+TeX markup or not, and correspondingly highlight TeX constructs
+or nothing at all. You can override this globally by putting
+in your .vimrc >
+ :let lhs_markup = none
+for no highlighting at all, or >
+ :let lhs_markup = tex
+to force the highlighting to always try to highlight TeX markup.
+For more flexibility, you may also use buffer local versions of
+this variable, so e.g. >
+ :let b:lhs_markup = tex
+will force TeX highlighting for a particular buffer. It has to be
+set before turning syntax highlighting on for the buffer or
+loading a file.
+
+
+HTML *html.vim* *ft-html-syntax*
+
+The coloring scheme for tags in the HTML file works as follows.
+
+The <> of opening tags are colored differently than the </> of a closing tag.
+This is on purpose! For opening tags the 'Function' color is used, while for
+closing tags the 'Identifier' color is used (See syntax.vim to check how those
+are defined for you)
+
+Known tag names are colored the same way as statements in C. Unknown tag
+names are colored with the same color as the <> or </> respectively which
+makes it easy to spot errors
+
+Note that the same is true for argument (or attribute) names. Known attribute
+names are colored differently than unknown ones.
+
+Some HTML tags are used to change the rendering of text. The following tags
+are recognized by the html.vim syntax coloring file and change the way normal
+text is shown: <B> <I> <U> <EM> <STRONG> (<EM> is used as an alias for <I>,
+while <STRONG> as an alias for <B>), <H1> - <H6>, <HEAD>, <TITLE> and <A>, but
+only if used as a link (that is, it must include a href as in
+<A href="somefile.html">).
+
+If you want to change how such text is rendered, you must redefine the
+following syntax groups:
+
+ - htmlBold
+ - htmlBoldUnderline
+ - htmlBoldUnderlineItalic
+ - htmlUnderline
+ - htmlUnderlineItalic
+ - htmlItalic
+ - htmlTitle for titles
+ - htmlH1 - htmlH6 for headings
+
+To make this redefinition work you must redefine them all with the exception
+of the last two (htmlTitle and htmlH[1-6], which are optional) and define the
+following variable in your vimrc (this is due to the order in which the files
+are read during initialization) >
+ :let html_my_rendering=1
+
+If you'd like to see an example download mysyntax.vim at
+http://www.fleiner.com/vim/download.html
+
+You can also disable this rendering by adding the following line to your
+vimrc file: >
+ :let html_no_rendering=1
+
+HTML comments are rather special (see an HTML reference document for the
+details), and the syntax coloring scheme will highlight all errors.
+However, if you prefer to use the wrong style (starts with <!-- and
+ends with -->) you can define >
+ :let html_wrong_comments=1
+
+JavaScript and Visual Basic embedded inside HTML documents are highlighted as
+'Special' with statements, comments, strings and so on colored as in standard
+programming languages. Note that only JavaScript and Visual Basic are
+currently supported, no other scripting language has been added yet.
+
+Embedded and inlined cascading style sheets (CSS) are highlighted too.
+
+There are several html preprocessor languages out there. html.vim has been
+written such that it should be trivial to include it. To do so add the
+following two lines to the syntax coloring file for that language
+(the example comes from the asp.vim file):
+>
+ runtime! syntax/html.vim
+ syn cluster htmlPreproc add=asp
+
+Now you just need to make sure that you add all regions that contain
+the preprocessor language to the cluster htmlPreproc.
+
+ *html-folding*
+The HTML syntax file provides syntax |folding| (see |:syn-fold|) between start
+and end tags. This can be turned on by >
+
+ :let g:html_syntax_folding = 1
+ :set foldmethod=syntax
+
+Note: Syntax folding might slow down syntax highlighting significantly,
+especially for large files.
+
+
+HTML/OS (by Aestiva) *htmlos.vim* *ft-htmlos-syntax*
+
+The coloring scheme for HTML/OS works as follows:
+
+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 either your ~/.vimrc: >
+ :hi Function term=underline cterm=bold ctermfg=LightGray
+
+Of course, the ctermfg can be a different color if you choose.
+
+Another issues that HTML/OS runs into is that there is no special filetype to
+signify that it is a file with HTML/OS coding. You can change this by opening
+a file and turning on HTML/OS syntax by doing the following: >
+ :set syntax=htmlos
+
+Lastly, it should be noted that the opening and closing characters to begin a
+block of HTML/OS code can either be << or [[ and >> or ]], respectively.
+
+
+IA64 *ia64.vim* *intel-itanium* *ft-ia64-syntax*
+
+Highlighting for the Intel Itanium 64 assembly language. See |asm.vim| for
+how to recognize this filetype.
+
+To have *.inc files be recognized as IA64, add this to your .vimrc file: >
+ :let g:filetype_inc = "ia64"
+
+
+INFORM *inform.vim* *ft-inform-syntax*
+
+Inform highlighting includes symbols provided by the Inform Library, as
+most programs make extensive use of it. If do not wish Library symbols
+to be highlighted add this to your vim startup: >
+ :let inform_highlight_simple=1
+
+By default it is assumed that Inform programs are Z-machine targeted,
+and highlights Z-machine assembly language symbols appropriately. If
+you intend your program to be targeted to a Glulx/Glk environment you
+need to add this to your startup sequence: >
+ :let inform_highlight_glulx=1
+
+This will highlight Glulx opcodes instead, and also adds glk() to the
+set of highlighted system functions.
+
+The Inform compiler will flag certain obsolete keywords as errors when
+it encounters them. These keywords are normally highlighted as errors
+by Vim. To prevent such error highlighting, you must add this to your
+startup sequence: >
+ :let inform_suppress_obsolete=1
+
+By default, the language features highlighted conform to Compiler
+version 6.30 and Library version 6.11. If you are using an older
+Inform development environment, you may with to add this to your
+startup sequence: >
+ :let inform_highlight_old=1
+
+IDL *idl.vim* *idl-syntax*
+
+IDL (Interface Definition Language) files are used to define RPC calls. In
+Microsoft land, this is also used for defining COM interfaces and calls.
+
+IDL's structure is simple enough to permit a full grammar based approach to
+rather than using a few heuristics. The result is large and somewhat
+repetitive but seems to work.
+
+There are some Microsoft extensions to idl files that are here. Some of them
+are disabled by defining idl_no_ms_extensions.
+
+The more complex of the extensions are disabled by defining idl_no_extensions.
+
+Variable Effect ~
+
+idl_no_ms_extensions Disable some of the Microsoft specific
+ extensions
+idl_no_extensions Disable complex extensions
+idlsyntax_showerror Show IDL errors (can be rather intrusive, but
+ quite helpful)
+idlsyntax_showerror_soft Use softer colours by default for errors
+
+
+JAVA *java.vim* *ft-java-syntax*
+
+The java.vim syntax highlighting file offers several options:
+
+In Java 1.0.2 it was never possible to have braces inside parens, so this was
+flagged as an error. Since Java 1.1 this is possible (with anonymous
+classes), and therefore is no longer marked as an error. If you prefer the
+old way, put the following line into your vim startup file: >
+ :let java_mark_braces_in_parens_as_errors=1
+
+All identifiers in java.lang.* are always visible in all classes. To
+highlight them use: >
+ :let java_highlight_java_lang_ids=1
+
+You can also highlight identifiers of most standard Java packages if you
+download the javaid.vim script at http://www.fleiner.com/vim/download.html.
+If you prefer to only highlight identifiers of a certain package, say java.io
+use the following: >
+ :let java_highlight_java_io=1
+Check the javaid.vim file for a list of all the packages that are supported.
+
+Function names are not highlighted, as the way to find functions depends on
+how you write Java code. The syntax file knows two possible ways to highlight
+functions:
+
+If you write function declarations that are always indented by either
+a tab, 8 spaces or 2 spaces you may want to set >
+ :let java_highlight_functions="indent"
+However, if you follow the Java guidelines about how functions and classes are
+supposed to be named (with respect to upper and lowercase), use >
+ :let java_highlight_functions="style"
+If both options do not work for you, but you would still want function
+declarations to be highlighted create your own definitions by changing the
+definitions in java.vim or by creating your own java.vim which includes the
+original one and then adds the code to highlight functions.
+
+In Java 1.1 the functions System.out.println() and System.err.println() should
+only be used for debugging. Therefore it is possible to highlight debugging
+statements differently. To do this you must add the following definition in
+your startup file: >
+ :let java_highlight_debug=1
+The result will be that those statements are highlighted as 'Special'
+characters. If you prefer to have them highlighted differently you must define
+new highlightings for the following groups.:
+ Debug, DebugSpecial, DebugString, DebugBoolean, DebugType
+which are used for the statement itself, special characters used in debug
+strings, strings, boolean constants and types (this, super) respectively. I
+have opted to choose another background for those statements.
+
+Javadoc is a program that takes special comments out of Java program files and
+creates HTML pages. The standard configuration will highlight this HTML code
+similarly to HTML files (see |html.vim|). You can even add Javascript
+and CSS inside this code (see below). There are four differences however:
+ 1. The title (all characters up to the first '.' which is followed by
+ some white space or up to the first '@') is colored differently (to change
+ the color change the group CommentTitle).
+ 2. The text is colored as 'Comment'.
+ 3. HTML comments are colored as 'Special'
+ 4. The special Javadoc tags (@see, @param, ...) are highlighted as specials
+ and the argument (for @see, @param, @exception) as Function.
+To turn this feature off add the following line to your startup file: >
+ :let java_ignore_javadoc=1
+
+If you use the special Javadoc comment highlighting described above you
+can also turn on special highlighting for Javascript, visual basic
+scripts and embedded CSS (stylesheets). This makes only sense if you
+actually have Javadoc comments that include either Javascript or embedded
+CSS. The options to use are >
+ :let java_javascript=1
+ :let java_css=1
+ :let java_vb=1
+
+In order to highlight nested parens with different colors define colors
+for javaParen, javaParen1 and javaParen2, for example with >
+ :hi link javaParen Comment
+or >
+ :hi javaParen ctermfg=blue guifg=#0000ff
+
+If you notice highlighting errors while scrolling backwards, which are fixed
+when redrawing with CTRL-L, try setting the "java_minlines" internal variable
+to a larger number: >
+ :let java_minlines = 50
+This will make the syntax synchronization start 50 lines before the first
+displayed line. The default value is 10. The disadvantage of using a larger
+number is that redrawing can become slow.
+
+
+JSON *json.vim* *ft-json-syntax*
+
+The json syntax file provides syntax highlighting with conceal support by
+default. To disable concealment: >
+ let g:vim_json_conceal = 0
+
+To disable syntax highlighting of errors: >
+ let g:vim_json_warnings = 0
+
+
+LACE *lace.vim* *ft-lace-syntax*
+
+Lace (Language for Assembly of Classes in Eiffel) is case insensitive, but the
+style guide lines are not. If you prefer case insensitive highlighting, just
+define the vim variable 'lace_case_insensitive' in your startup file: >
+ :let lace_case_insensitive=1
+
+
+LEX *lex.vim* *ft-lex-syntax*
+
+Lex uses brute-force synchronizing as the "^%%$" section delimiter
+gives no clue as to what section follows. Consequently, the value for >
+ :syn sync minlines=300
+may be changed by the user if s/he is experiencing synchronization
+difficulties (such as may happen with large lex files).
+
+
+LIFELINES *lifelines.vim* *ft-lifelines-syntax*
+
+To highlight deprecated functions as errors, add in your .vimrc: >
+
+ :let g:lifelines_deprecated = 1
+<
+
+LISP *lisp.vim* *ft-lisp-syntax*
+
+The lisp syntax highlighting provides two options: >
+
+ g:lisp_instring : If it exists, then "(...)" strings are highlighted
+ as if the contents of the string were lisp.
+ Useful for AutoLisp.
+ g:lisp_rainbow : If it exists and is nonzero, then differing levels
+ of parenthesization will receive different
+ highlighting.
+<
+The g:lisp_rainbow option provides 10 levels of individual colorization for
+the parentheses and backquoted parentheses. Because of the quantity of
+colorization levels, unlike non-rainbow highlighting, the rainbow mode
+specifies its highlighting using ctermfg and guifg, thereby bypassing the
+usual color scheme control using standard highlighting groups. The actual
+highlighting used depends on the dark/bright setting (see |'bg'|).
+
+
+LITE *lite.vim* *ft-lite-syntax*
+
+There are two options for the lite syntax highlighting.
+
+If you like SQL syntax highlighting inside Strings, use this: >
+
+ :let lite_sql_query = 1
+
+For syncing, minlines defaults to 100. If you prefer another value, you can
+set "lite_minlines" to the value you desire. Example: >
+
+ :let lite_minlines = 200
+
+
+LPC *lpc.vim* *ft-lpc-syntax*
+
+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: >
+
+ :let lpc_syntax_for_c = 1
+
+If it doesn't work properly for some particular C or LPC files, use a
+modeline. For a LPC file:
+
+ // vim:set ft=lpc:
+
+For a C file that is recognized as LPC:
+
+ // vim:set ft=c:
+
+If you don't want to set the variable, use the modeline in EVERY LPC file.
+
+There are several implementations for LPC, we intend to support most widely
+used ones. Here the default LPC syntax is for MudOS series, for MudOS v22
+and before, you should turn off the sensible modifiers, and this will also
+assert the new efuns after v22 to be invalid, don't set this variable when
+you are using the latest version of MudOS: >
+
+ :let lpc_pre_v22 = 1
+
+For LpMud 3.2 series of LPC: >
+
+ :let lpc_compat_32 = 1
+
+For LPC4 series of LPC: >
+
+ :let lpc_use_lpc4_syntax = 1
+
+For uLPC series of LPC:
+uLPC has been developed to Pike, so you should use Pike syntax
+instead, and the name of your source file should be *.pike
+
+
+LUA *lua.vim* *ft-lua-syntax*
+
+The Lua syntax file can be used for versions 4.0, 5.0, 5.1 and 5.2 (5.2 is
+the default). You can select one of these versions using the global variables
+lua_version and lua_subversion. For example, to activate Lua
+5.1 syntax highlighting, set the variables like this:
+
+ :let lua_version = 5
+ :let lua_subversion = 1
+
+
+MAIL *mail.vim* *ft-mail.vim*
+
+Vim highlights all the standard elements of an email (headers, signatures,
+quoted text and URLs / email addresses). In keeping with standard conventions,
+signatures begin in a line containing only "--" followed optionally by
+whitespaces and end with a newline.
+
+Vim treats lines beginning with ']', '}', '|', '>' or a word followed by '>'
+as quoted text. However Vim highlights headers and signatures in quoted text
+only if the text is quoted with '>' (optionally followed by one space).
+
+By default mail.vim synchronises syntax to 100 lines before the first
+displayed line. If you have a slow machine, and generally deal with emails
+with short headers, you can change this to a smaller value: >
+
+ :let mail_minlines = 30
+
+
+MAKE *make.vim* *ft-make-syntax*
+
+In makefiles, commands are usually highlighted to make it easy for you to spot
+errors. However, this may be too much coloring for you. You can turn this
+feature off by using: >
+
+ :let make_no_commands = 1
+
+
+MAPLE *maple.vim* *ft-maple-syntax*
+
+Maple V, by Waterloo Maple Inc, supports symbolic algebra. The language
+supports many packages of functions which are selectively loaded by the user.
+The standard set of packages' functions as supplied in Maple V release 4 may be
+highlighted at the user's discretion. Users may place in their .vimrc file: >
+
+ :let mvpkg_all= 1
+
+to get all package functions highlighted, or users may select any subset by
+choosing a variable/package from the table below and setting that variable to
+1, also in their .vimrc file (prior to sourcing
+$VIMRUNTIME/syntax/syntax.vim).
+
+ Table of Maple V Package Function Selectors >
+ mv_DEtools mv_genfunc mv_networks mv_process
+ mv_Galois mv_geometry mv_numapprox mv_simplex
+ mv_GaussInt mv_grobner mv_numtheory mv_stats
+ mv_LREtools mv_group mv_orthopoly mv_student
+ mv_combinat mv_inttrans mv_padic mv_sumtools
+ mv_combstruct mv_liesymm mv_plots mv_tensor
+ mv_difforms mv_linalg mv_plottools mv_totorder
+ mv_finance mv_logic mv_powseries
+
+
+MARKDOWN *ft-markdown-syntax*
+
+If you have long regions there might be wrong highlighting. At the cost of
+slowing down displaying, you can have the engine look further back to sync on
+the start of a region, for example 500 lines: >
+
+ :let g:markdown_minlines = 500
+
+
+MATHEMATICA *mma.vim* *ft-mma-syntax* *ft-mathematica-syntax*
+
+Empty *.m files will automatically be presumed to be Matlab files unless you
+have the following in your .vimrc: >
+
+ let filetype_m = "mma"
+
+
+MOO *moo.vim* *ft-moo-syntax*
+
+If you use C-style comments inside expressions and find it mangles your
+highlighting, you may want to use extended (slow!) matches for C-style
+comments: >
+
+ :let moo_extended_cstyle_comments = 1
+
+To disable highlighting of pronoun substitution patterns inside strings: >
+
+ :let moo_no_pronoun_sub = 1
+
+To disable highlighting of the regular expression operator '%|', and matching
+'%(' and '%)' inside strings: >
+
+ :let moo_no_regexp = 1
+
+Unmatched double quotes can be recognized and highlighted as errors: >
+
+ :let moo_unmatched_quotes = 1
+
+To highlight builtin properties (.name, .location, .programmer etc.): >
+
+ :let moo_builtin_properties = 1
+
+Unknown builtin functions can be recognized and highlighted as errors. If you
+use this option, add your own extensions to the mooKnownBuiltinFunction group.
+To enable this option: >
+
+ :let moo_unknown_builtin_functions = 1
+
+An example of adding sprintf() to the list of known builtin functions: >
+
+ :syn keyword mooKnownBuiltinFunction sprintf contained
+
+
+MSQL *msql.vim* *ft-msql-syntax*
+
+There are two options for the msql syntax highlighting.
+
+If you like SQL syntax highlighting inside Strings, use this: >
+
+ :let msql_sql_query = 1
+
+For syncing, minlines defaults to 100. If you prefer another value, you can
+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.
+
+If you want to have unrecognized (by ncf.vim) statements highlighted as
+errors, use this: >
+
+ :let ncf_highlight_unknowns = 1
+
+If you don't want to highlight these errors, leave it unset.
+
+
+NROFF *nroff.vim* *ft-nroff-syntax*
+
+The nroff syntax file works with AT&T n/troff out of the box. You need to
+activate the GNU groff extra features included in the syntax file before you
+can use them.
+
+For example, Linux and BSD distributions use groff as their default text
+processing package. In order to activate the extra syntax highlighting
+features for groff, arrange for files to be recognized as groff (see
+|ft-groff-syntax|) or add the following option to your start-up files: >
+
+ :let nroff_is_groff = 1
+
+Groff is different from the old AT&T n/troff that you may still find in
+Solaris. Groff macro and request names can be longer than 2 characters and
+there are extensions to the language primitives. For example, in AT&T troff
+you access the year as a 2-digit number with the request \(yr. In groff you
+can use the same request, recognized for compatibility, or you can use groff's
+native syntax, \[yr]. Furthermore, you can use a 4-digit year directly:
+\[year]. Macro requests can be longer than 2 characters, for example, GNU mm
+accepts the requests ".VERBON" and ".VERBOFF" for creating verbatim
+environments.
+
+In order to obtain the best formatted output g/troff can give you, you should
+follow a few simple rules about spacing and punctuation.
+
+1. Do not leave empty spaces at the end of lines.
+
+2. Leave one space and one space only after an end-of-sentence period,
+ exclamation mark, etc.
+
+3. For reasons stated below, it is best to follow all period marks with a
+ carriage return.
+
+The reason behind these unusual tips is that g/n/troff have a line breaking
+algorithm that can be easily upset if you don't follow the rules given above.
+
+Unlike TeX, troff fills text line-by-line, not paragraph-by-paragraph and,
+furthermore, it does not have a concept of glue or stretch, all horizontal and
+vertical space input will be output as is.
+
+Therefore, you should be careful about not using more space between sentences
+than you intend to have in your final document. For this reason, the common
+practice is to insert a carriage return immediately after all punctuation
+marks. If you want to have "even" text in your final processed output, you
+need to maintain regular spacing in the input text. To mark both trailing
+spaces and two or more spaces after a punctuation as an error, use: >
+
+ :let nroff_space_errors = 1
+
+Another technique to detect extra spacing and other errors that will interfere
+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
+
+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
+file: >
+
+ let b:preprocs_as_sections = 1
+
+As well, the syntax file adds an extra paragraph marker for the extended
+paragraph macro (.XP) in the ms package.
+
+Finally, there is a |groff.vim| syntax file that can be used for enabling
+groff syntax highlighting either on a file basis or globally by default.
+
+
+OCAML *ocaml.vim* *ft-ocaml-syntax*
+
+The OCaml syntax file handles files having the following prefixes: .ml,
+.mli, .mll and .mly. By setting the following variable >
+
+ :let ocaml_revised = 1
+
+you can switch from standard OCaml-syntax to revised syntax as supported
+by the camlp4 preprocessor. Setting the variable >
+
+ :let ocaml_noend_error = 1
+
+prevents highlighting of "end" as error, which is useful when sources
+contain very long structures that Vim does not synchronize anymore.
+
+
+PAPP *papp.vim* *ft-papp-syntax*
+
+The PApp syntax file handles .papp files and, to a lesser extent, .pxml
+and .pxsl files which are all a mixture of perl/xml/html/other using xml
+as the top-level file format. By default everything inside phtml or pxml
+sections is treated as a string with embedded preprocessor commands. If
+you set the variable: >
+
+ :let papp_include_html=1
+
+in your startup file it will try to syntax-highlight html code inside phtml
+sections, but this is relatively slow and much too colourful to be able to
+edit sensibly. ;)
+
+The newest version of the papp.vim syntax file can usually be found at
+http://papp.plan9.de.
+
+
+PASCAL *pascal.vim* *ft-pascal-syntax*
+
+Files matching "*.p" could be Progress or Pascal and those matching "*.pp"
+could be Puppet or Pascal. If the automatic detection doesn't work for you,
+or you only edit Pascal files, use this in your startup vimrc: >
+
+ :let filetype_p = "pascal"
+ :let filetype_pp = "pascal"
+
+The Pascal syntax file has been extended to take into account some extensions
+provided by Turbo Pascal, Free Pascal Compiler and GNU Pascal Compiler.
+Delphi keywords are also supported. By default, Turbo Pascal 7.0 features are
+enabled. If you prefer to stick with the standard Pascal keywords, add the
+following line to your startup file: >
+
+ :let pascal_traditional=1
+
+To switch on Delphi specific constructions (such as one-line comments,
+keywords, etc): >
+
+ :let pascal_delphi=1
+
+
+The option pascal_symbol_operator controls whether symbol operators such as +,
+*, .., etc. are displayed using the Operator color or not. To colorize symbol
+operators, add the following line to your startup file: >
+
+ :let pascal_symbol_operator=1
+
+Some functions are highlighted by default. To switch it off: >
+
+ :let pascal_no_functions=1
+
+Furthermore, there are specific variables for some compilers. Besides
+pascal_delphi, there are pascal_gpc and pascal_fpc. Default extensions try to
+match Turbo Pascal. >
+
+ :let pascal_gpc=1
+
+or >
+
+ :let pascal_fpc=1
+
+To ensure that strings are defined on a single line, you can define the
+pascal_one_line_string variable. >
+
+ :let pascal_one_line_string=1
+
+If you dislike <Tab> chars, you can set the pascal_no_tabs variable. Tabs
+will be highlighted as Error. >
+
+ :let pascal_no_tabs=1
+
+
+
+PERL *perl.vim* *ft-perl-syntax*
+
+There are a number of possible options to the perl syntax highlighting.
+
+Inline POD highlighting is now turned on by default. If you don't wish
+to have the added complexity of highlighting POD embedded within Perl
+files, you may set the 'perl_include_pod' option to 0: >
+
+ :let perl_include_pod = 0
+
+To reduce the complexity of parsing (and increase performance) you can switch
+off two elements in the parsing of variable names and contents. >
+
+To handle package references in variable and function names not differently
+from the rest of the name (like 'PkgName::' in '$PkgName::VarName'): >
+
+ :let perl_no_scope_in_variables = 1
+
+(In Vim 6.x it was the other way around: "perl_want_scope_in_variables"
+enabled it.)
+
+If you do not want complex things like '@{${"foo"}}' to be parsed: >
+
+ :let perl_no_extended_vars = 1
+
+(In Vim 6.x it was the other way around: "perl_extended_vars" enabled it.)
+
+The coloring strings can be changed. By default strings and qq friends will
+be highlighted like the first line. If you set the variable
+perl_string_as_statement, it will be highlighted as in the second line.
+
+ "hello world!"; qq|hello world|;
+ ^^^^^^^^^^^^^^NN^^^^^^^^^^^^^^^N (unlet perl_string_as_statement)
+ S^^^^^^^^^^^^SNNSSS^^^^^^^^^^^SN (let perl_string_as_statement)
+
+(^ = perlString, S = perlStatement, N = None at all)
+
+The syncing has 3 options. The first two switch off some triggering of
+synchronization and should only be needed in case it fails to work properly.
+If while scrolling all of a sudden the whole screen changes color completely
+then you should try and switch off one of those. Let me know if you can
+figure out the line that causes the mistake.
+
+One triggers on "^\s*sub\s*" and the other on "^[$@%]" more or less. >
+
+ :let perl_no_sync_on_sub
+ :let perl_no_sync_on_global_var
+
+Below you can set the maximum distance VIM should look for starting points for
+its attempts in syntax highlighting. >
+
+ :let perl_sync_dist = 100
+
+If you want to use folding with perl, set perl_fold: >
+
+ :let perl_fold = 1
+
+If you want to fold blocks in if statements, etc. as well set the following: >
+
+ :let perl_fold_blocks = 1
+
+Subroutines are folded by default if 'perl_fold' is set. If you do not want
+this, you can set 'perl_nofold_subs': >
+
+ :let perl_nofold_subs = 1
+
+Anonymous subroutines are not folded by default; you may enable their folding
+via 'perl_fold_anonymous_subs': >
+
+ :let perl_fold_anonymous_subs = 1
+
+Packages are also folded by default if 'perl_fold' is set. To disable this
+behavior, set 'perl_nofold_packages': >
+
+ :let perl_nofold_packages = 1
+
+PHP3 and PHP4 *php.vim* *php3.vim* *ft-php-syntax* *ft-php3-syntax*
+
+[Note: Previously this was called "php3", but since it now also supports php4
+it has been renamed to "php"]
+
+There are the following options for the php syntax highlighting.
+
+If you like SQL syntax highlighting inside Strings: >
+
+ let php_sql_query = 1
+
+For highlighting the Baselib methods: >
+
+ let php_baselib = 1
+
+Enable HTML syntax highlighting inside strings: >
+
+ let php_htmlInStrings = 1
+
+Using the old colorstyle: >
+
+ let php_oldStyle = 1
+
+Enable highlighting ASP-style short tags: >
+
+ let php_asp_tags = 1
+
+Disable short tags: >
+
+ let php_noShortTags = 1
+
+For highlighting parent error ] or ): >
+
+ let php_parent_error_close = 1
+
+For skipping a php end tag, if there exists an open ( or [ without a closing
+one: >
+
+ let php_parent_error_open = 1
+
+Enable folding for classes and functions: >
+
+ let php_folding = 1
+
+Selecting syncing method: >
+
+ let 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.
+
+
+PLAINTEX *plaintex.vim* *ft-plaintex-syntax*
+
+TeX is a typesetting language, and plaintex is the file type for the "plain"
+variant of TeX. If you never want your *.tex files recognized as plain TeX,
+see |ft-tex-plugin|.
+
+This syntax file has the option >
+
+ let g:plaintex_delimiters = 1
+
+if you want to highlight brackets "[]" and braces "{}".
+
+
+PPWIZARD *ppwiz.vim* *ft-ppwiz-syntax*
+
+PPWizard is a preprocessor for HTML and OS/2 INF files
+
+This syntax file has the options:
+
+- ppwiz_highlight_defs : Determines highlighting mode for PPWizard's
+ definitions. Possible values are
+
+ ppwiz_highlight_defs = 1 : PPWizard #define statements retain the
+ colors of their contents (e.g. PPWizard macros and variables).
+
+ ppwiz_highlight_defs = 2 : Preprocessor #define and #evaluate
+ statements are shown in a single color with the exception of line
+ continuation symbols.
+
+ The default setting for ppwiz_highlight_defs is 1.
+
+- ppwiz_with_html : If the value is 1 (the default), highlight literal
+ HTML code; if 0, treat HTML code like ordinary text.
+
+
+PHTML *phtml.vim* *ft-phtml-syntax*
+
+There are two options for the phtml syntax highlighting.
+
+If you like SQL syntax highlighting inside Strings, use this: >
+
+ :let phtml_sql_query = 1
+
+For syncing, minlines defaults to 100. If you prefer another value, you can
+set "phtml_minlines" to the value you desire. Example: >
+
+ :let phtml_minlines = 200
+
+
+POSTSCRIPT *postscr.vim* *ft-postscr-syntax*
+
+There are several options when it comes to highlighting PostScript.
+
+First which version of the PostScript language to highlight. There are
+currently three defined language versions, or levels. Level 1 is the original
+and base version, and includes all extensions prior to the release of level 2.
+Level 2 is the most common version around, and includes its own set of
+extensions prior to the release of level 3. Level 3 is currently the highest
+level supported. You select which level of the PostScript language you want
+highlighted by defining the postscr_level variable as follows: >
+
+ :let postscr_level=2
+
+If this variable is not defined it defaults to 2 (level 2) since this is
+the most prevalent version currently.
+
+Note: Not all PS interpreters will support all language features for a
+particular language level. In particular the %!PS-Adobe-3.0 at the start of
+PS files does NOT mean the PostScript present is level 3 PostScript!
+
+If you are working with Display PostScript, you can include highlighting of
+Display PS language features by defining the postscr_display variable as
+follows: >
+
+ :let postscr_display=1
+
+If you are working with Ghostscript, you can include highlighting of
+Ghostscript specific language features by defining the variable
+postscr_ghostscript as follows: >
+
+ :let postscr_ghostscript=1
+
+PostScript is a large language, with many predefined elements. While it
+useful to have all these elements highlighted, on slower machines this can
+cause Vim to slow down. In an attempt to be machine friendly font names and
+character encodings are not highlighted by default. Unless you are working
+explicitly with either of these this should be ok. If you want them to be
+highlighted you should set one or both of the following variables: >
+
+ :let postscr_fonts=1
+ :let postscr_encodings=1
+
+There is a stylistic option to the highlighting of and, or, and not. In
+PostScript the function of these operators depends on the types of their
+operands - if the operands are booleans then they are the logical operators,
+if they are integers then they are binary operators. As binary and logical
+operators can be highlighted differently they have to be highlighted one way
+or the other. By default they are treated as logical operators. They can be
+highlighted as binary operators by defining the variable
+postscr_andornot_binary as follows: >
+
+ :let postscr_andornot_binary=1
+<
+
+ *ptcap.vim* *ft-printcap-syntax*
+PRINTCAP + TERMCAP *ft-ptcap-syntax* *ft-termcap-syntax*
+
+This syntax file applies to the printcap and termcap databases.
+
+In order for Vim to recognize printcap/termcap files that do not match
+the patterns *printcap*, or *termcap*, you must put additional patterns
+appropriate to your system in your |myfiletypefile| file. For these
+patterns, you must set the variable "b:ptcap_type" to either "print" or
+"term", and then the 'filetype' option to ptcap.
+
+For example, to make Vim identify all files in /etc/termcaps/ as termcap
+files, add the following: >
+
+ :au BufNewFile,BufRead /etc/termcaps/* let b:ptcap_type = "term" |
+ \ set filetype=ptcap
+
+If you notice highlighting errors while scrolling backwards, which
+are fixed when redrawing with CTRL-L, try setting the "ptcap_minlines"
+internal variable to a larger number: >
+
+ :let ptcap_minlines = 50
+
+(The default is 20 lines.)
+
+
+PROGRESS *progress.vim* *ft-progress-syntax*
+
+Files matching "*.w" could be Progress or cweb. If the automatic detection
+doesn't work for you, or you don't edit cweb at all, use this in your
+startup vimrc: >
+ :let filetype_w = "progress"
+The same happens for "*.i", which could be assembly, and "*.p", which could be
+Pascal. Use this if you don't use assembly and Pascal: >
+ :let filetype_i = "progress"
+ :let filetype_p = "progress"
+
+
+PYTHON *python.vim* *ft-python-syntax*
+
+There are six options to control Python syntax highlighting.
+
+For highlighted numbers: >
+ :let python_no_number_highlight = 1
+
+For highlighted builtin functions: >
+ :let python_no_builtin_highlight = 1
+
+For highlighted standard exceptions: >
+ :let python_no_exception_highlight = 1
+
+For highlighted doctests and code inside: >
+ :let python_no_doctest_highlight = 1
+or >
+ :let python_no_doctest_code_highlight = 1
+The first option implies the second one.
+
+For highlighted trailing whitespace and mix of spaces and tabs: >
+ :let python_space_error_highlight = 1
+
+If you want all possible Python highlighting:
+ :let python_highlight_all = 1
+This has the same effect as setting python_space_error_highlight and
+unsetting all the other ones.
+
+If you use Python 2 or straddling code (Python 2 and 3 compatible),
+you can enforce the use of an older syntax file with support for
+Python 2 and up to Python 3.5.
+ : let python_use_python2_syntax = 1
+This option will exclude all modern Python 3.6 or higher features.
+
+Note: Only existence of these options matters, not their value.
+ You can replace 1 above with anything.
+
+
+QUAKE *quake.vim* *ft-quake-syntax*
+
+The Quake syntax definition should work for most FPS (First Person Shooter)
+based on one of the Quake engines. However, the command names vary a bit
+between the three games (Quake, Quake 2, and Quake 3 Arena) so the syntax
+definition checks for the existence of three global variables to allow users
+to specify what commands are legal in their files. The three variables can
+be set for the following effects:
+
+set to highlight commands only available in Quake: >
+ :let quake_is_quake1 = 1
+
+set to highlight commands only available in Quake 2: >
+ :let quake_is_quake2 = 1
+
+set to highlight commands only available in Quake 3 Arena: >
+ :let quake_is_quake3 = 1
+
+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
+few commands and options to the ones already available. To highlight these
+items as well you can add the following to your |vimrc| or just type it in the
+command line before loading a file with the readline syntax: >
+ let readline_has_bash = 1
+
+This will add highlighting for the commands that BASH (version 2.05a and
+later, and part earlier) adds.
+
+
+REGO *rego.vim* *ft-rego-syntax*
+
+Rego is a query language developed by Styra. It is mostly used as a policy
+language for kubernetes, but can be applied to almost anything. Files with
+the following extensions are recognized as rego files: .rego.
+
+
+RESTRUCTURED TEXT *rst.vim* *ft-rst-syntax*
+
+Syntax highlighting is enabled for code blocks within the document for a
+select number of file types. See $VIMRUNTIME/syntax/rst.vim for the default
+syntax list.
+
+To set a user-defined list of code block syntax highlighting: >
+ let rst_syntax_code_list = ['vim', 'lisp', ...]
+
+To assign multiple code block types to a single syntax, define
+`rst_syntax_code_list` as a mapping: >
+ let rst_syntax_code_list = {
+ \ 'cpp': ['cpp', 'c++'],
+ \ 'bash': ['bash', 'sh'],
+ ...
+ \ }
+
+To use color highlighting for emphasis text: >
+ let rst_use_emphasis_colors = 1
+
+To enable folding of sections: >
+ let rst_fold_enabled = 1
+
+Note that folding can cause performance issues on some platforms.
+
+
+REXX *rexx.vim* *ft-rexx-syntax*
+
+If you notice highlighting errors while scrolling backwards, which are fixed
+when redrawing with CTRL-L, try setting the "rexx_minlines" internal variable
+to a larger number: >
+ :let rexx_minlines = 50
+This will make the syntax synchronization start 50 lines before the first
+displayed line. The default value is 10. The disadvantage of using a larger
+number is that redrawing can become slow.
+
+Vim tries to guess what type a ".r" file is. If it can't be detected (from
+comment lines), the default is "r". To make the default rexx add this line to
+your .vimrc: *g:filetype_r*
+>
+ :let g:filetype_r = "r"
+
+
+RUBY *ruby.vim* *ft-ruby-syntax*
+
+ 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|
+
+ *ruby_operators*
+ Ruby: Operator highlighting ~
+
+Operators can be highlighted by defining "ruby_operators": >
+
+ :let ruby_operators = 1
+<
+ *ruby_space_errors*
+ Ruby: Whitespace errors ~
+
+Whitespace errors can be highlighted by defining "ruby_space_errors": >
+
+ :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_fold* *ruby_foldable_groups*
+ Ruby: Folding ~
+
+Folding can be enabled by defining "ruby_fold": >
+
+ :let ruby_fold = 1
+<
+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.
+
+Default folding is rather detailed, i.e., small syntax units like "if", "do",
+"%w[]" may create corresponding fold levels.
+
+You can set "ruby_foldable_groups" to restrict which groups are foldable: >
+
+ :let ruby_foldable_groups = 'if case %'
+<
+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 ~
+
+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_no_expensive = 1
+<
+In this case the same color will be used for all control keywords.
+
+ *ruby_minlines*
+
+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_minlines = 100
+<
+Ideally, this value should be a number of lines large enough to embrace your
+largest class or module.
+
+ *ruby_spellcheck_strings*
+ Ruby: Spellchecking strings ~
+
+Ruby syntax will perform spellchecking of strings if you define
+"ruby_spellcheck_strings": >
+
+ :let ruby_spellcheck_strings = 1
+<
+
+SCHEME *scheme.vim* *ft-scheme-syntax*
+
+By default only R7RS keywords are highlighted and properly indented.
+
+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*
+
+The SDL highlighting probably misses a few keywords, but SDL has so many
+of them it's almost impossibly to cope.
+
+The new standard, SDL-2000, specifies that all identifiers are
+case-sensitive (which was not so before), and that all keywords can be
+used either completely lowercase or completely uppercase. To have the
+highlighting reflect this, you can set the following variable: >
+ :let sdl_2000=1
+
+This also sets many new keywords. If you want to disable the old
+keywords, which is probably a good idea, use: >
+ :let SDL_no_96=1
+
+
+The indentation is probably also incomplete, but right now I am very
+satisfied with it for my own projects.
+
+
+SED *sed.vim* *ft-sed-syntax*
+
+To make tabs stand out from regular blanks (accomplished by using Todo
+highlighting on the tabs), define "g:sed_highlight_tabs" by putting >
+
+ :let g:sed_highlight_tabs = 1
+<
+in the vimrc file. (This special highlighting only applies for tabs
+inside search patterns, replacement texts, addresses or text included
+by an Append/Change/Insert command.) If you enable this option, it is
+also a good idea to set the tab width to one character; by doing that,
+you can easily count the number of tabs in a string.
+
+GNU sed allows comments after text on the same line. BSD sed only allows
+comments where "#" is the first character of the line. To enforce BSD-style
+comments, i.e. mark end-of-line comments as errors, use: >
+
+ :let g:sed_dialect = "bsd"
+<
+Note that there are other differences between GNU sed and BSD sed which are
+not (yet) affected by this setting.
+
+Bugs:
+
+ The transform command (y) is treated exactly like the substitute
+ command. This means that, as far as this syntax file is concerned,
+ transform accepts the same flags as substitute, which is wrong.
+ (Transform accepts no flags.) I tolerate this bug because the
+ involved commands need very complex treatment (95 patterns, one for
+ each plausible pattern delimiter).
+
+
+SGML *sgml.vim* *ft-sgml-syntax*
+
+The coloring scheme for tags in the SGML file works as follows.
+
+The <> of opening tags are colored differently than the </> of a closing tag.
+This is on purpose! For opening tags the 'Function' color is used, while for
+closing tags the 'Type' color is used (See syntax.vim to check how those are
+defined for you)
+
+Known tag names are colored the same way as statements in C. Unknown tag
+names are not colored which makes it easy to spot errors.
+
+Note that the same is true for argument (or attribute) names. Known attribute
+names are colored differently than unknown ones.
+
+Some SGML tags are used to change the rendering of text. The following tags
+are recognized by the sgml.vim syntax coloring file and change the way normal
+text is shown: <varname> <emphasis> <command> <function> <literal>
+<replaceable> <ulink> and <link>.
+
+If you want to change how such text is rendered, you must redefine the
+following syntax groups:
+
+ - sgmlBold
+ - sgmlBoldItalic
+ - sgmlUnderline
+ - sgmlItalic
+ - sgmlLink for links
+
+To make this redefinition work you must redefine them all and define the
+following variable in your vimrc (this is due to the order in which the files
+are read during initialization) >
+ let sgml_my_rendering=1
+
+You can also disable this rendering by adding the following line to your
+vimrc file: >
+ let sgml_no_rendering=1
+
+(Adapted from the html.vim help text by Claudio Fleiner <claudio@fleiner.com>)
+
+
+ *ft-posix-syntax* *ft-dash-syntax*
+SH *sh.vim* *ft-sh-syntax* *ft-bash-syntax* *ft-ksh-syntax*
+
+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, e.g.: >
+
+ ksh : .kshrc* *.ksh
+ bash: .bashrc* bashrc bash.bashrc .bash_profile* *.bash
+<
+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: >
+ let g:is_kornshell = 1
+< posix: (using this is 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 and install the associated "let..." in your <.vimrc>.
+
+The syntax/sh.vim file provides several levels of syntax-based folding: >
+
+ let g:sh_fold_enabled= 0 (default, no syntax folding)
+ let g:sh_fold_enabled= 1 (enable function 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 (ie. HereDocuments and function bodies) become
+syntax-foldable (see |:syn-fold|). You also may add these together
+to get multiple types of folding: >
+
+ let g:sh_fold_enabled= 3 (enables function and heredoc folding)
+
+If you notice highlighting errors while scrolling backwards which are fixed
+when one redraws with CTRL-L, try setting the "sh_minlines" internal variable
+to a larger number. Example: >
+
+ let sh_minlines = 500
+
+This will make syntax synchronization start 500 lines before the first
+displayed line. The default value is 200. The disadvantage of using a larger
+number is that redrawing can become slow.
+
+If you don't have much to synchronize on, displaying can be very slow. To
+reduce this, the "sh_maxlines" internal variable can be set. Example: >
+
+ let sh_maxlines = 100
+<
+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.
+
+syntax/sh.vim tries to flag certain problems as errors; usually things like
+unmatched "]", "done", "fi", 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~
+
+You may wish to embed languages into sh. I'll give an example courtesy of
+Lorance Stinson on how to do this with awk as an example. Put the following
+file into $HOME/.vim/after/syntax/sh/awkembed.vim: >
+
+ " AWK Embedding:
+ " ==============
+ " Shamelessly ripped from aspperl.vim by Aaron Hope.
+ if exists("b:current_syntax")
+ unlet b:current_syntax
+ endif
+ syn include @AWKScript syntax/awk.vim
+ syn region AWKScriptCode matchgroup=AWKCommand start=+[=\\]\@<!'+ skip=+\\'+ end=+'+ contains=@AWKScript contained
+ syn region AWKScriptEmbedded matchgroup=AWKCommand start=+\<awk\>+ skip=+\\$+ end=+[=\\]\@<!'+me=e-1 contains=@shIdList,@shExprList2 nextgroup=AWKScriptCode
+ syn cluster shCommandSubList add=AWKScriptEmbedded
+ hi def link AWKCommand Type
+<
+This code will then let the awk code in the single quotes: >
+ awk '...awk code here...'
+be highlighted using the awk highlighting syntax. Clearly this may be
+extended to other languages.
+
+
+SPEEDUP *spup.vim* *ft-spup-syntax*
+(AspenTech plant simulator)
+
+The Speedup syntax file has some options:
+
+- strict_subsections : If this variable is defined, only keywords for
+ sections and subsections will be highlighted as statements but not
+ other keywords (like WITHIN in the OPERATION section).
+
+- highlight_types : Definition of this variable causes stream types
+ like temperature or pressure to be highlighted as Type, not as a
+ plain Identifier. Included are the types that are usually found in
+ the DECLARE section; if you defined own types, you have to include
+ them in the syntax file.
+
+- oneline_comments : This value ranges from 1 to 3 and determines the
+ highlighting of # style comments.
+
+ oneline_comments = 1 : Allow normal Speedup code after an even
+ number of #s.
+
+ oneline_comments = 2 : Show code starting with the second # as
+ error. This is the default setting.
+
+ oneline_comments = 3 : Show the whole line as error if it contains
+ more than one #.
+
+Since especially OPERATION sections tend to become very large due to
+PRESETting variables, syncing may be critical. If your computer is
+fast enough, you can increase minlines and/or maxlines near the end of
+the syntax file.
+
+
+SQL *sql.vim* *ft-sql-syntax*
+ *sqlinformix.vim* *ft-sqlinformix-syntax*
+ *sqlanywhere.vim* *ft-sqlanywhere-syntax*
+
+While there is an ANSI standard for SQL, most database engines add their own
+custom extensions. Vim currently supports the Oracle and Informix dialects of
+SQL. Vim assumes "*.sql" files are Oracle SQL by default.
+
+Vim currently has SQL support for a variety of different vendors via syntax
+scripts. You can change Vim's default from Oracle to any of the current SQL
+supported types. You can also easily alter the SQL dialect being used on a
+buffer by buffer basis.
+
+For more detailed instructions see |ft_sql.txt|.
+
+
+SQUIRREL *squirrel.vim* *ft-squirrel-syntax*
+
+Squirrel is a high level imperative, object-oriented programming language,
+designed to be a light-weight scripting language that fits in the size, memory
+bandwidth, and real-time requirements of applications like video games. Files
+with the following extensions are recognized as squirrel files: .nut.
+
+
+TCSH *tcsh.vim* *ft-tcsh-syntax*
+
+This covers the shell named "tcsh". It is a superset of csh. See |csh.vim|
+for how the filetype is detected.
+
+Tcsh does not allow \" in strings unless the "backslash_quote" shell variable
+is set. If you want VIM to assume that no backslash quote constructs exist
+add this line to your .vimrc: >
+
+ :let tcsh_backslash_quote = 0
+
+If you notice highlighting errors while scrolling backwards, which are fixed
+when redrawing with CTRL-L, try setting the "tcsh_minlines" internal variable
+to a larger number: >
+
+ :let tcsh_minlines = 1000
+
+This will make the syntax synchronization start 1000 lines before the first
+displayed line. If you set "tcsh_minlines" to "fromstart", then
+synchronization is done from the start of the file. The default value for
+tcsh_minlines is 100. The disadvantage of using a larger number is that
+redrawing can become slow.
+
+
+TEX *tex.vim* *ft-tex-syntax* *latex-syntax*
+ *syntax-tex* *syntax-latex*
+
+ Tex Contents~
+ Tex: Want Syntax Folding? |tex-folding|
+ Tex: No Spell Checking Wanted |g:tex_nospell|
+ Tex: Don't Want Spell Checking In Comments? |tex-nospell|
+ Tex: Want Spell Checking in Verbatim Zones? |tex-verb|
+ Tex: Run-on Comments or MathZones |tex-runon|
+ Tex: Slow Syntax Highlighting? |tex-slow|
+ Tex: Want To Highlight More Commands? |tex-morecommands|
+ Tex: Excessive Error Highlighting? |tex-error|
+ Tex: Need a new Math Group? |tex-math|
+ Tex: Starting a New Style? |tex-style|
+ Tex: Taking Advantage of Conceal Mode |tex-conceal|
+ Tex: Selective Conceal Mode |g:tex_conceal|
+ Tex: Controlling iskeyword |g:tex_isk|
+ Tex: Fine Subscript and Superscript Control |tex-supersub|
+ Tex: Match Check Control |tex-matchcheck|
+
+ *tex-folding* *g:tex_fold_enabled*
+ Tex: Want Syntax Folding? ~
+
+As of version 28 of <syntax/tex.vim>, syntax-based folding of parts, chapters,
+sections, subsections, etc are supported. Put >
+ let g:tex_fold_enabled=1
+in your <.vimrc>, and :set fdm=syntax. I suggest doing the latter via a
+modeline at the end of your LaTeX file: >
+ % vim: fdm=syntax
+If your system becomes too slow, then you might wish to look into >
+ https://vimhelp.org/vim_faq.txt.html#faq-29.7
+<
+ *g:tex_nospell*
+ Tex: No Spell Checking Wanted~
+
+If you don't want spell checking anywhere in your LaTeX document, put >
+ let g:tex_nospell=1
+into your .vimrc. If you merely wish to suppress spell checking inside
+comments only, see |g:tex_comment_nospell|.
+
+ *tex-nospell* *g:tex_comment_nospell*
+ Tex: Don't Want Spell Checking In Comments? ~
+
+Some folks like to include things like source code in comments and so would
+prefer that spell checking be disabled in comments in LaTeX files. To do
+this, put the following in your <.vimrc>: >
+ let g:tex_comment_nospell= 1
+If you want to suppress spell checking everywhere inside your LaTeX document,
+see |g:tex_nospell|.
+
+ *tex-verb* *g:tex_verbspell*
+ Tex: Want Spell Checking in Verbatim Zones?~
+
+Often verbatim regions are used for things like source code; seldom does
+one want source code spell-checked. However, for those of you who do
+want your verbatim zones spell-checked, put the following in your <.vimrc>: >
+ let g:tex_verbspell= 1
+<
+ *tex-runon* *tex-stopzone*
+ Tex: Run-on Comments or MathZones ~
+
+The <syntax/tex.vim> highlighting supports TeX, LaTeX, and some AmsTeX. The
+highlighting supports three primary zones/regions: normal, texZone, and
+texMathZone. Although considerable effort has been made to have these zones
+terminate properly, zones delineated by $..$ and $$..$$ cannot be synchronized
+as there's no difference between start and end patterns. Consequently, a
+special "TeX comment" has been provided >
+ %stopzone
+which will forcibly terminate the highlighting of either a texZone or a
+texMathZone.
+
+ *tex-slow* *tex-sync*
+ Tex: Slow Syntax Highlighting? ~
+
+If you have a slow computer, you may wish to reduce the values for >
+ :syn sync maxlines=200
+ :syn sync minlines=50
+(especially the latter). If your computer is fast, you may wish to
+increase them. This primarily affects synchronizing (i.e. just what group,
+if any, is the text at the top of the screen supposed to be in?).
+
+Another cause of slow highlighting is due to syntax-driven folding; see
+|tex-folding| for a way around this.
+
+ *g:tex_fast*
+
+Finally, if syntax highlighting is still too slow, you may set >
+
+ :let g:tex_fast= ""
+
+in your .vimrc. Used this way, the g:tex_fast variable causes the syntax
+highlighting script to avoid defining any regions and associated
+synchronization. The result will be much faster syntax highlighting; the
+price: you will no longer have as much highlighting or any syntax-based
+folding, and you will be missing syntax-based error checking.
+
+You may decide that some syntax is acceptable; you may use the following table
+selectively to enable just some syntax highlighting: >
+
+ b : allow bold and italic syntax
+ c : allow texComment syntax
+ m : allow texMatcher syntax (ie. {...} and [...])
+ M : allow texMath syntax
+ p : allow parts, chapter, section, etc syntax
+ r : allow texRefZone syntax (nocite, bibliography, label, pageref, eqref)
+ s : allow superscript/subscript regions
+ S : allow texStyle syntax
+ v : allow verbatim syntax
+ V : allow texNewEnv and texNewCmd syntax
+<
+As an example, let g:tex_fast= "M" will allow math-associated highlighting
+but suppress all the other region-based syntax highlighting.
+(also see: |g:tex_conceal| and |tex-supersub|)
+
+ *tex-morecommands* *tex-package*
+ Tex: Want To Highlight More Commands? ~
+
+LaTeX is a programmable language, and so there are thousands of packages full
+of specialized LaTeX commands, syntax, and fonts. If you're using such a
+package you'll often wish that the distributed syntax/tex.vim would support
+it. However, clearly this is impractical. So please consider using the
+techniques in |mysyntaxfile-add| to extend or modify the highlighting provided
+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? ~
+
+The <tex.vim> supports lexical error checking of various sorts. Thus,
+although the error checking is ofttimes very useful, it can indicate
+errors where none actually are. If this proves to be a problem for you,
+you may put in your <.vimrc> the following statement: >
+ let g:tex_no_error=1
+and all error checking by <syntax/tex.vim> will be suppressed.
+
+ *tex-math*
+ Tex: Need a new Math Group? ~
+
+If you want to include a new math group in your LaTeX, the following
+code shows you an example as to how you might do so: >
+ call TexNewMathZone(sfx,mathzone,starform)
+You'll want to provide the new math group with a unique suffix
+(currently, A-L and V-Z are taken by <syntax/tex.vim> itself).
+As an example, consider how eqnarray is set up by <syntax/tex.vim>: >
+ call TexNewMathZone("D","eqnarray",1)
+You'll need to change "mathzone" to the name of your new math group,
+and then to the call to it in .vim/after/syntax/tex.vim.
+The "starform" variable, if true, implies that your new math group
+has a starred form (ie. eqnarray*).
+
+ *tex-style* *b:tex_stylish*
+ Tex: Starting a New Style? ~
+
+One may use "\makeatletter" in *.tex files, thereby making the use of "@" in
+commands available. However, since the *.tex file doesn't have one of the
+following suffices: sty cls clo dtx ltx, the syntax highlighting will flag
+such use of @ as an error. To solve this: >
+
+ :let b:tex_stylish = 1
+ :set ft=tex
+
+Putting "let g:tex_stylish=1" into your <.vimrc> will make <syntax/tex.vim>
+always accept such use of @.
+
+ *tex-cchar* *tex-cole* *tex-conceal*
+ Tex: Taking Advantage of Conceal Mode~
+
+If you have |'conceallevel'| set to 2 and if your encoding is utf-8, then a
+number of character sequences can be translated into appropriate utf-8 glyphs,
+including various accented characters, Greek characters in MathZones, and
+superscripts and subscripts in MathZones. Not all characters can be made into
+superscripts or subscripts; the constraint is due to what utf-8 supports.
+In fact, only a few characters are supported as subscripts.
+
+One way to use this is to have vertically split windows (see |CTRL-W_v|); one
+with |'conceallevel'| at 0 and the other at 2; and both using |'scrollbind'|.
+
+ *g:tex_conceal*
+ Tex: Selective Conceal Mode~
+
+You may selectively use conceal mode by setting g:tex_conceal in your
+<.vimrc>. By default, g:tex_conceal is set to "admgs" to enable concealment
+for the following sets of characters: >
+
+ a = accents/ligatures
+ b = bold and italic
+ d = delimiters
+ m = math symbols
+ g = Greek
+ s = superscripts/subscripts
+<
+By leaving one or more of these out, the associated conceal-character
+substitution will not be made.
+
+ *g:tex_isk* *g:tex_stylish*
+ Tex: Controlling iskeyword~
+
+Normally, LaTeX keywords support 0-9, a-z, A-z, and 192-255 only. Latex
+keywords don't support the underscore - except when in *.sty files. The
+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
+ (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
+ (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
+
+ *tex-supersub* *g:tex_superscripts* *g:tex_subscripts*
+ Tex: Fine Subscript and Superscript Control~
+
+ See |tex-conceal| for how to enable concealed character replacement.
+
+ See |g:tex_conceal| for selectively concealing accents, bold/italic,
+ math, Greek, and superscripts/subscripts.
+
+ One may exert fine control over which superscripts and subscripts one
+ wants syntax-based concealment for (see |:syn-cchar|). Since not all
+ fonts support all characters, one may override the
+ concealed-replacement lists; by default these lists are given by: >
+
+ let g:tex_superscripts= "[0-9a-zA-W.,:;+-<>/()=]"
+ let g:tex_subscripts= "[0-9aehijklmnoprstuvx,+-/().]"
+<
+ For example, I use Luxi Mono Bold; it doesn't support subscript
+ characters for "hklmnpst", so I put >
+ let g:tex_subscripts= "[0-9aeijoruvx,+-/().]"
+< in ~/.vim/ftplugin/tex/tex.vim in order to avoid having inscrutable
+ utf-8 glyphs appear.
+
+ *tex-matchcheck* *g:tex_matchcheck*
+ Tex: Match Check Control~
+
+ Sometimes one actually wants mismatched parentheses, square braces,
+ and or curly braces; for example, \text{(1,10]} is a range from but
+ not including 1 to and including 10. This wish, of course, conflicts
+ with the desire to provide delimiter mismatch detection. To
+ accommodate these conflicting goals, syntax/tex.vim provides >
+ g:tex_matchcheck = '[({[]'
+< which is shown along with its default setting. So, if one doesn't
+ want [] and () to be checked for mismatches, try using >
+ let g:tex_matchcheck= '[{}]'
+< If you don't want matching to occur inside bold and italicized
+ regions, >
+ let g:tex_excludematcher= 1
+< will prevent the texMatcher group from being included in those regions.
+
+TF *tf.vim* *ft-tf-syntax*
+
+There is one option for the tf syntax highlighting.
+
+For syncing, minlines defaults to 100. If you prefer another value, you can
+set "tf_minlines" to the value you desire. Example: >
+
+ :let tf_minlines = your choice
+<
+VIM *vim.vim* *ft-vim-syntax*
+ *g:vimsyn_minlines* *g:vimsyn_maxlines*
+There is a trade-off between more accurate syntax highlighting versus screen
+updating speed. To improve accuracy, you may wish to increase the
+g:vimsyn_minlines variable. The g:vimsyn_maxlines variable may be used to
+improve screen updating rates (see |:syn-sync| for more on this). >
+
+ g:vimsyn_minlines : used to set synchronization minlines
+ g:vimsyn_maxlines : used to set synchronization maxlines
+<
+ (g:vim_minlines and g:vim_maxlines are deprecated variants of
+ these two options)
+
+ *g:vimsyn_embed*
+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 support any embedded scripts
+ g:vimsyn_embed =~ 'l' : support embedded lua
+ g:vimsyn_embed =~ 'm' : support embedded mzscheme
+ g:vimsyn_embed =~ 'p' : support embedded perl
+ g:vimsyn_embed =~ 'P' : support embedded python
+ g:vimsyn_embed =~ 'r' : support embedded ruby
+ g:vimsyn_embed =~ 't' : support embedded tcl
+<
+By default, g:vimsyn_embed is a string supporting interpreters that your vim
+itself supports. Concatenate multiple characters to support multiple types
+of embedded interpreters; ie. g:vimsyn_embed= "mp" supports embedded mzscheme
+and embedded perl.
+ *g:vimsyn_folding*
+
+Some folding is now supported with syntax/vim.vim: >
+
+ g:vimsyn_folding == 0 or doesn't exist: no syntax-based folding
+ g:vimsyn_folding =~ 'a' : augroups
+ g:vimsyn_folding =~ 'f' : fold functions
+ g:vimsyn_folding =~ 'l' : fold lua script
+ g:vimsyn_folding =~ 'm' : fold mzscheme script
+ g:vimsyn_folding =~ 'p' : fold perl script
+ g:vimsyn_folding =~ 'P' : fold python script
+ g:vimsyn_folding =~ 'r' : fold ruby script
+ g:vimsyn_folding =~ 't' : fold tcl script
+<
+ *g:vimsyn_noerror*
+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
+<
+
+
+WDL *wdl.vim* *wdl-syntax*
+
+The Workflow Description Language is a way to specify data processing workflows
+with a human-readable and writeable syntax. This is used a lot in
+bioinformatics. More info on the spec can be found here:
+https://github.com/openwdl/wdl
+
+
+XF86CONFIG *xf86conf.vim* *ft-xf86conf-syntax*
+
+The syntax of XF86Config file differs in XFree86 v3.x and v4.x. Both
+variants are supported. Automatic detection is used, but is far from perfect.
+You may need to specify the version manually. Set the variable
+xf86conf_xfree86_version to 3 or 4 according to your XFree86 version in
+your .vimrc. Example: >
+ :let xf86conf_xfree86_version=3
+When using a mix of versions, set the b:xf86conf_xfree86_version variable.
+
+Note that spaces and underscores in option names are not supported. Use
+"SyncOnGreen" instead of "__s yn con gr_e_e_n" if you want the option name
+highlighted.
+
+
+XML *xml.vim* *ft-xml-syntax*
+
+Xml namespaces are highlighted by default. This can be inhibited by
+setting a global variable: >
+
+ :let g:xml_namespace_transparent=1
+<
+ *xml-folding*
+The xml syntax file provides syntax |folding| (see |:syn-fold|) between
+start and end tags. This can be turned on by >
+
+ :let g:xml_syntax_folding = 1
+ :set foldmethod=syntax
+
+Note: Syntax folding might slow down syntax highlighting significantly,
+especially for large files.
+
+
+X Pixmaps (XPM) *xpm.vim* *ft-xpm-syntax*
+
+xpm.vim creates its syntax items dynamically based upon the contents of the
+XPM file. Thus if you make changes e.g. in the color specification strings,
+you have to source it again e.g. with ":set syn=xpm".
+
+To copy a pixel with one of the colors, yank a "pixel" with "yl" and insert it
+somewhere else with "P".
+
+Do you want to draw with the mouse? Try the following: >
+ :function! GetPixel()
+ : let c = getline(".")[col(".") - 1]
+ : echo c
+ : exe "noremap <LeftMouse> <LeftMouse>r" .. c
+ : exe "noremap <LeftDrag> <LeftMouse>r" .. c
+ :endfunction
+ :noremap <RightMouse> <LeftMouse>:call GetPixel()<CR>
+ :set guicursor=n:hor20 " to see the color beneath the cursor
+This turns the right button into a pipette and the left button into a pen.
+It will work with XPM files that have one character per pixel only and you
+must not click outside of the pixel strings, but feel free to improve it.
+
+It will look much better with a font in a quadratic cell size, e.g. for X: >
+ :set guifont=-*-clean-medium-r-*-*-8-*-*-*-*-80-*
+
+
+YAML *yaml.vim* *ft-yaml-syntax*
+
+ *g:yaml_schema* *b:yaml_schema*
+A YAML schema is a combination of a set of tags and a mechanism for resolving
+non-specific tags. For user this means that YAML parser may, depending on
+plain scalar contents, treat plain scalar (which can actually be only string
+and nothing else) as a value of the other type: null, boolean, floating-point,
+integer. `g:yaml_schema` option determines according to which schema values
+will be highlighted specially. Supported schemas are
+
+Schema Description ~
+failsafe No additional highlighting.
+json Supports JSON-style numbers, booleans and null.
+core Supports more number, boolean and null styles.
+pyyaml In addition to core schema supports highlighting timestamps,
+ but there are some differences in what is recognized as
+ numbers and many additional boolean values not present in core
+ schema.
+
+Default schema is `core`.
+
+Note that schemas are not actually limited to plain scalars, but this is the
+only difference between schemas defined in YAML specification and the only
+difference defined in the syntax file.
+
+
+ZSH *zsh.vim* *ft-zsh-syntax*
+
+The syntax script for zsh allows for syntax-based folding: >
+
+ :let g:zsh_fold_enable = 1
+
+==============================================================================
+6. Defining a syntax *:syn-define* *E410*
+
+Vim understands three types of syntax items:
+
+1. Keyword
+ It can only contain keyword characters, according to the 'iskeyword'
+ option. It cannot contain other syntax items. It will only match with a
+ complete word (there are no keyword characters before or after the match).
+ The keyword "if" would match in "if(a=b)", but not in "ifdef x", because
+ "(" is not a keyword character and "d" is.
+
+2. Match
+ This is a match with a single regexp pattern.
+
+3. Region
+ This starts at a match of the "start" regexp pattern and ends with a match
+ with the "end" regexp pattern. Any other text can appear in between. A
+ "skip" regexp pattern can be used to avoid matching the "end" pattern.
+
+Several syntax ITEMs can be put into one syntax GROUP. For a syntax group
+you can give highlighting attributes. For example, you could have an item
+to define a "/* .. */" comment and another one that defines a "// .." comment,
+and put them both in the "Comment" group. You can then specify that a
+"Comment" will be in bold font and have a blue color. You are free to make
+one highlight group for one syntax item, or put all items into one group.
+This depends on how you want to specify your highlighting attributes. Putting
+each item in its own group results in having to specify the highlighting
+for a lot of groups.
+
+Note that a syntax group and a highlight group are similar. For a highlight
+group you will have given highlight attributes. These attributes will be used
+for the syntax group with the same name.
+
+In case more than one item matches at the same position, the one that was
+defined LAST wins. Thus you can override previously defined syntax items by
+using an item that matches the same text. But a keyword always goes before a
+match or region. And a keyword with matching case always goes before a
+keyword with ignoring case.
+
+
+PRIORITY *:syn-priority*
+
+When several syntax items may match, these rules are used:
+
+1. When multiple Match or Region items start in the same position, the item
+ defined last has priority.
+2. A Keyword has priority over Match and Region items.
+3. An item that starts in an earlier position has priority over items that
+ start in later positions.
+
+
+DEFINING CASE *:syn-case* *E390*
+
+:sy[ntax] case [match | ignore]
+ This defines if the following ":syntax" commands will work with
+ matching case, when using "match", or with ignoring case, when using
+ "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".
+
+
+DEFINING FOLDLEVEL *:syn-foldlevel*
+
+:sy[ntax] foldlevel start
+:sy[ntax] foldlevel minimum
+ This defines how the foldlevel of a line is computed when using
+ foldmethod=syntax (see |fold-syntax| and |:syn-fold|):
+
+ start: Use level of item containing start of line.
+ minimum: Use lowest local-minimum level of items on line.
+
+ The default is "start". Use "minimum" to search a line horizontally
+ for the lowest level contained on the line that is followed by a
+ higher level. This produces more natural folds when syntax items
+ may close and open horizontally within a line.
+
+:sy[ntax] foldlevel
+ Show the current foldlevel method, either "syntax foldlevel start" or
+ "syntax foldlevel minimum".
+
+ {not meaningful when Vim was compiled without |+folding| feature}
+
+SPELL CHECKING *:syn-spell*
+
+:sy[ntax] spell toplevel
+:sy[ntax] spell notoplevel
+:sy[ntax] spell default
+ This defines where spell checking is to be done for text that is not
+ in a syntax item:
+
+ toplevel: Text is spell checked.
+ notoplevel: Text is not spell checked.
+ default: When there is a @Spell cluster no spell checking.
+
+ For text in syntax items use the @Spell and @NoSpell clusters
+ |spell-syntax|. When there is no @Spell and no @NoSpell cluster then
+ spell checking is done for "default" and "toplevel".
+
+ To activate spell checking the 'spell' option must be set.
+
+:sy[ntax] spell
+ Show the current syntax spell checking method, either "syntax spell
+ toplevel", "syntax spell notoplevel" or "syntax spell default".
+
+
+SYNTAX ISKEYWORD SETTING *:syn-iskeyword*
+
+:sy[ntax] iskeyword [clear | {option}]
+ This defines the keyword characters. It's like the 'iskeyword' option
+ for but only applies to syntax highlighting.
+
+ clear: Syntax specific iskeyword setting is disabled and the
+ buffer-local 'iskeyword' setting is used.
+ {option} Set the syntax 'iskeyword' option to a new value.
+
+ Example: >
+ :syntax iskeyword @,48-57,192-255,$,_
+<
+ This would set the syntax specific iskeyword option to include all
+ alphabetic characters, plus the numeric characters, all accented
+ characters and also includes the "_" and the "$".
+
+ If no argument is given, the current value will be output.
+
+ Setting this option influences what |/\k| matches in syntax patterns
+ 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
+ set the correct value for the specific syntax language and not change
+ the 'iskeyword' option.
+
+DEFINING KEYWORDS *:syn-keyword*
+
+:sy[ntax] keyword {group-name} [{options}] {keyword} .. [{options}]
+
+ This defines a number of keywords.
+
+ {group-name} Is a syntax group name such as "Comment".
+ [{options}] See |:syn-arguments| below.
+ {keyword} .. Is a list of keywords which are part of this group.
+
+ Example: >
+ :syntax keyword Type int long char
+<
+ The {options} can be given anywhere in the line. They will apply to
+ all keywords given, also for options that come after a keyword.
+ These examples do exactly the same: >
+ :syntax keyword Type contained int long char
+ :syntax keyword Type int long contained char
+ :syntax keyword Type int long char contained
+< *E789* *E890*
+ When you have a keyword with an optional tail, like Ex commands in
+ Vim, you can put the optional characters inside [], to define all the
+ variations at once: >
+ :syntax keyword vimCommand ab[breviate] n[ext]
+<
+ Don't forget that a keyword can only be recognized if all the
+ characters are included in the 'iskeyword' option. If one character
+ isn't, the keyword will never be recognized.
+ Multi-byte characters can also be used. These do not have to be in
+ 'iskeyword'.
+ See |:syn-iskeyword| for defining syntax specific iskeyword settings.
+
+ A keyword always has higher priority than a match or region, the
+ keyword is used if more than one item matches. Keywords do not nest
+ and a keyword can't contain anything else.
+
+ Note that when you have a keyword that is the same as an option (even
+ one that isn't allowed here), you can not use it. Use a match
+ instead.
+
+ The maximum length of a keyword is 80 characters.
+
+ The same keyword can be defined multiple times, when its containment
+ differs. For example, you can define the keyword once not contained
+ and use one highlight group, and once contained, and use a different
+ highlight group. Example: >
+ :syn keyword vimCommand tag
+ :syn keyword vimSetting contained tag
+< When finding "tag" outside of any syntax item, the "vimCommand"
+ highlight group is used. When finding "tag" in a syntax item that
+ contains "vimSetting", the "vimSetting" group is used.
+
+
+DEFINING MATCHES *:syn-match*
+
+:sy[ntax] match {group-name} [{options}]
+ [excludenl]
+ [keepend]
+ {pattern}
+ [{options}]
+
+ This defines one match.
+
+ {group-name} A syntax group name such as "Comment".
+ [{options}] See |:syn-arguments| below.
+ [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
+ line, which makes the match depend on where
+ Vim starts searching for the pattern. You
+ need to make sure syncing takes care of this.
+
+ Example (match a character constant): >
+ :syntax match Character /'.'/hs=s+1,he=e-1
+<
+
+DEFINING REGIONS *:syn-region* *:syn-start* *:syn-skip* *:syn-end*
+ *E398* *E399*
+:sy[ntax] region {group-name} [{options}]
+ [matchgroup={group-name}]
+ [keepend]
+ [extend]
+ [excludenl]
+ start={start-pattern} ..
+ [skip={skip-pattern}]
+ end={end-pattern} ..
+ [{options}]
+
+ This defines one region. It may span several lines.
+
+ {group-name} A syntax group name such as "Comment".
+ [{options}] See |:syn-arguments| below.
+ [matchgroup={group-name}] The syntax group to use for the following
+ start or end pattern matches only. Not used
+ for the text in between the matched start and
+ end patterns. Use NONE to reset to not using
+ a different group for the start or end match.
+ See |:syn-matchgroup|.
+ keepend Don't allow contained matches to go past a
+ match with the end pattern. See
+ |:syn-keepend|.
+ extend Override a "keepend" for an item this region
+ is contained in. See |:syn-extend|.
+ excludenl Don't make a pattern with the end-of-line "$"
+ extend a containing match or item. Only
+ useful for end patterns. Must be given before
+ the patterns it applies to. |:syn-excludenl|
+ start={start-pattern} The search pattern that defines the start of
+ the region. See |:syn-pattern| below.
+ skip={skip-pattern} The search pattern that defines text inside
+ the region where not to look for the end
+ pattern. See |:syn-pattern| below.
+ end={end-pattern} The search pattern that defines the end of
+ the region. See |:syn-pattern| below.
+
+ Example: >
+ :syntax region String start=+"+ skip=+\\"+ end=+"+
+<
+ The start/skip/end patterns and the options can be given in any order.
+ There can be zero or one skip pattern. There must be one or more
+ start and end patterns. This means that you can omit the skip
+ pattern, but you must give at least one start and one end pattern. It
+ is allowed to have white space before and after the equal sign
+ (although it mostly looks better without white space).
+
+ When more than one start pattern is given, a match with one of these
+ is sufficient. This means there is an OR relation between the start
+ patterns. The last one that matches is used. The same is true for
+ the end patterns.
+
+ The search for the end pattern starts right after the start pattern.
+ Offsets are not used for this. This implies that the match for the
+ end pattern will never overlap with the start pattern.
+
+ The skip and end pattern can match across line breaks, but since the
+ search for the pattern can start in any line it often does not do what
+ you want. The skip pattern doesn't avoid a match of an end pattern in
+ the next line. Use single-line patterns to avoid trouble.
+
+ Note: The decision to start a region is only based on a matching start
+ pattern. There is no check for a matching end pattern. This does NOT
+ work: >
+ :syn region First start="(" end=":"
+ :syn region Second start="(" end=";"
+< The Second always matches before the First (last defined pattern has
+ higher priority). The Second region then continues until the next
+ ';', no matter if there is a ':' before it. Using a match does work: >
+ :syn match First "(\_.\{-}:"
+ :syn match Second "(\_.\{-};"
+< This pattern matches any character or line break with "\_." and
+ repeats that with "\{-}" (repeat as few as possible).
+
+ *:syn-keepend*
+ By default, a contained match can obscure a match for the end pattern.
+ This is useful for nesting. For example, a region that starts with
+ "{" and ends with "}", can contain another region. An encountered "}"
+ will then end the contained region, but not the outer region:
+ { starts outer "{}" region
+ { starts contained "{}" region
+ } ends contained "{}" region
+ } ends outer "{} region
+ If you don't want this, the "keepend" argument will make the matching
+ of an end pattern of the outer region also end any contained item.
+ This makes it impossible to nest the same region, but allows for
+ contained items to highlight parts of the end pattern, without causing
+ that to skip the match with the end pattern. Example: >
+ :syn match vimComment +"[^"]\+$+
+ :syn region vimCommand start="set" end="$" contains=vimComment keepend
+< The "keepend" makes the vimCommand always end at the end of the line,
+ even though the contained vimComment includes a match with the <EOL>.
+
+ When "keepend" is not used, a match with an end pattern is retried
+ after each contained match. When "keepend" is included, the first
+ encountered match with an end pattern is used, truncating any
+ contained matches.
+ *:syn-extend*
+ The "keepend" behavior can be changed by using the "extend" argument.
+ When an item with "extend" is contained in an item that uses
+ "keepend", the "keepend" is ignored and the containing region will be
+ extended.
+ This can be used to have some contained items extend a region while
+ others don't. Example: >
+
+ :syn region htmlRef start=+<a>+ end=+</a>+ keepend contains=htmlItem,htmlScript
+ :syn match htmlItem +<[^>]*>+ contained
+ :syn region htmlScript start=+<script+ end=+</script[^>]*>+ contained extend
+
+< Here the htmlItem item does not make the htmlRef item continue
+ further, it is only used to highlight the <> items. The htmlScript
+ item does extend the htmlRef item.
+
+ Another example: >
+ :syn region xmlFold start="<a>" end="</a>" fold transparent keepend extend
+< This defines a region with "keepend", so that its end cannot be
+ changed by contained items, like when the "</a>" is matched to
+ highlight it differently. But when the xmlFold region is nested (it
+ includes itself), the "extend" applies, so that the "</a>" of a nested
+ region only ends that region, and not the one it is contained in.
+
+ *:syn-excludenl*
+ When a pattern for a match or end pattern of a region includes a '$'
+ to match the end-of-line, it will make a region item that it is
+ contained in continue on the next line. For example, a match with
+ "\\$" (backslash at the end of the line) can make a region continue
+ that would normally stop at the end of the line. This is the default
+ behavior. If this is not wanted, there are two ways to avoid it:
+ 1. Use "keepend" for the containing item. This will keep all
+ contained matches from extending the match or region. It can be
+ used when all contained items must not extend the containing item.
+ 2. Use "excludenl" in the contained item. This will keep that match
+ from extending the containing match or region. It can be used if
+ only some contained items must not extend the containing item.
+ "excludenl" must be given before the pattern it applies to.
+
+ *:syn-matchgroup*
+ "matchgroup" can be used to highlight the start and/or end pattern
+ differently than the body of the region. Example: >
+ :syntax region String matchgroup=Quote start=+"+ skip=+\\"+ end=+"+
+< This will highlight the quotes with the "Quote" group, and the text in
+ between with the "String" group.
+ The "matchgroup" is used for all start and end patterns that follow,
+ until the next "matchgroup". Use "matchgroup=NONE" to go back to not
+ using a matchgroup.
+
+ In a start or end pattern that is highlighted with "matchgroup" the
+ contained items of the region are not used. This can be used to avoid
+ that a contained item matches in the start or end pattern match. When
+ using "transparent", this does not apply to a start or end pattern
+ match that is highlighted with "matchgroup".
+
+ Here is an example, which highlights three levels of parentheses in
+ different colors: >
+ :sy region par1 matchgroup=par1 start=/(/ end=/)/ contains=par2
+ :sy region par2 matchgroup=par2 start=/(/ end=/)/ contains=par3 contained
+ :sy region par3 matchgroup=par3 start=/(/ end=/)/ contains=par1 contained
+ :hi par1 ctermfg=red guifg=red
+ :hi par2 ctermfg=blue guifg=blue
+ :hi par3 ctermfg=darkgreen guifg=darkgreen
+<
+ *E849*
+The maximum number of syntax groups is 19999.
+
+==============================================================================
+7. :syntax arguments *:syn-arguments*
+
+The :syntax commands that define syntax items take a number of arguments.
+The common ones are explained here. The arguments may be given in any order
+and may be mixed with patterns.
+
+Not all commands accept all arguments. This table shows which arguments
+can not be used for all commands:
+ *E395*
+ contains oneline fold display extend concealends~
+:syntax keyword - - - - - -
+:syntax match yes - yes yes yes -
+:syntax region yes yes yes yes yes yes
+
+These arguments can be used for all three commands:
+ conceal
+ cchar
+ contained
+ containedin
+ nextgroup
+ transparent
+ skipwhite
+ skipnl
+ skipempty
+
+conceal *conceal* *:syn-conceal*
+
+When the "conceal" argument is given, the item is marked as concealable.
+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 is with |matchadd()|.
+
+concealends *:syn-concealends*
+
+When the "concealends" argument is given, the start and end matches of
+the region, but not the contents of the region, are marked as concealable.
+Whether or not they are actually concealed depends on the setting on the
+'conceallevel' option. The ends of a region can only be concealed separately
+in this way when they have their own highlighting via "matchgroup"
+
+cchar *:syn-cchar*
+ *E844*
+The "cchar" argument defines the character shown in place of the item
+when it is concealed (setting "cchar" only makes sense when the conceal
+argument is given.) If "cchar" is not set then the default conceal
+character defined in the 'listchars' option is used. The character cannot be
+a control character such as Tab. Example: >
+ :syntax match Entity "&amp;" conceal cchar=&
+See |hl-Conceal| for highlighting.
+
+contained *:syn-contained*
+
+When the "contained" argument is given, this item will not be recognized at
+the top level, but only when it is mentioned in the "contains" field of
+another match. Example: >
+ :syntax keyword Todo TODO contained
+ :syntax match Comment "//.*" contains=Todo
+
+
+display *:syn-display*
+
+If the "display" argument is given, this item will be skipped when the
+detected highlighting will not be displayed. This will speed up highlighting,
+by skipping this item when only finding the syntax state for the text that is
+to be displayed.
+
+Generally, you can use "display" for match and region items that meet these
+conditions:
+- The item does not continue past the end of a line. Example for C: A region
+ for a "/*" comment can't contain "display", because it continues on the next
+ line.
+- The item does not contain items that continue past the end of the line or
+ make it continue on the next line.
+- The item does not change the size of any item it is contained in. Example
+ for C: A match with "\\$" in a preprocessor match can't have "display",
+ because it may make that preprocessor match shorter.
+- The item does not allow other items to match that didn't match otherwise,
+ and that item may extend the match too far. Example for C: A match for a
+ "//" comment can't use "display", because a "/*" inside that comment would
+ match then and start a comment which extends past the end of the line.
+
+Examples, for the C language, where "display" can be used:
+- match with a number
+- match with a label
+
+
+transparent *:syn-transparent*
+
+If the "transparent" argument is given, this item will not be highlighted
+itself, but will take the highlighting of the item it is contained in. This
+is useful for syntax items that don't need any highlighting but are used
+only to skip over a part of the text.
+
+The "contains=" argument is also inherited from the item it is contained in,
+unless a "contains" argument is given for the transparent item itself. To
+avoid that unwanted items are contained, use "contains=NONE". Example, which
+highlights words in strings, but makes an exception for "vim": >
+ :syn match myString /'[^']*'/ contains=myWord,myVim
+ :syn match myWord /\<[a-z]*\>/ contained
+ :syn match myVim /\<vim\>/ transparent contained contains=NONE
+ :hi link myString String
+ :hi link myWord Comment
+Since the "myVim" match comes after "myWord" it is the preferred match (last
+match in the same position overrules an earlier one). The "transparent"
+argument makes the "myVim" match use the same highlighting as "myString". But
+it does not contain anything. If the "contains=NONE" argument would be left
+out, then "myVim" would use the contains argument from myString and allow
+"myWord" to be contained, which will be highlighted as a Comment. This
+happens because a contained match doesn't match inside itself in the same
+position, thus the "myVim" match doesn't overrule the "myWord" match here.
+
+When you look at the colored text, it is like looking at layers of contained
+items. The contained item is on top of the item it is contained in, thus you
+see the contained item. When a contained item is transparent, you can look
+through, thus you see the item it is contained in. In a picture:
+
+ look from here
+
+ | | | | | |
+ V V V V V V
+
+ xxxx yyy more contained items
+ .................... contained item (transparent)
+ ============================= first item
+
+The 'x', 'y' and '=' represent a highlighted syntax item. The '.' represent a
+transparent group.
+
+What you see is:
+
+ =======xxxx=======yyy========
+
+Thus you look through the transparent "....".
+
+
+oneline *:syn-oneline*
+
+The "oneline" argument indicates that the region does not cross a line
+boundary. It must match completely in the current line. However, when the
+region has a contained item that does cross a line boundary, it continues on
+the next line anyway. A contained item can be used to recognize a line
+continuation pattern. But the "end" pattern must still match in the first
+line, otherwise the region doesn't even start.
+
+When the start pattern includes a "\n" to match an end-of-line, the end
+pattern must be found in the same line as where the start pattern ends. The
+end pattern may also include an end-of-line. Thus the "oneline" argument
+means that the end of the start pattern and the start of the end pattern must
+be within one line. This can't be changed by a skip pattern that matches a
+line break.
+
+
+fold *:syn-fold*
+
+The "fold" argument makes the fold level increase by one for this item.
+Example: >
+ :syn region myFold start="{" end="}" transparent fold
+ :syn sync fromstart
+ :set foldmethod=syntax
+This will make each {} block form one fold.
+
+The fold will start on the line where the item starts, and end where the item
+ends. If the start and end are within the same line, there is no fold.
+The 'foldnestmax' option limits the nesting of syntax folds.
+See |:syn-foldlevel| to control how the foldlevel of a line is computed
+from its syntax items.
+{not available when Vim was compiled without |+folding| feature}
+
+
+ *:syn-contains* *E405* *E406* *E407* *E408* *E409*
+contains={group-name},..
+
+The "contains" argument is followed by a list of syntax group names. These
+groups will be allowed to begin inside the item (they may extend past the
+containing group's end). This allows for recursive nesting of matches and
+regions. If there is no "contains" argument, no groups will be contained in
+this item. The group names do not need to be defined before they can be used
+here.
+
+contains=ALL
+ If the only item in the contains list is "ALL", then all
+ groups will be accepted inside the item.
+
+contains=ALLBUT,{group-name},..
+ If the first item in the contains list is "ALLBUT", then all
+ groups will be accepted inside the item, except the ones that
+ are listed. Example: >
+ :syntax region Block start="{" end="}" ... contains=ALLBUT,Function
+
+contains=TOP
+ If the first item in the contains list is "TOP", then all
+ groups will be accepted that don't have the "contained"
+ argument.
+contains=TOP,{group-name},..
+ Like "TOP", but excluding the groups that are listed.
+
+contains=CONTAINED
+ If the first item in the contains list is "CONTAINED", then
+ all groups will be accepted that have the "contained"
+ argument.
+contains=CONTAINED,{group-name},..
+ Like "CONTAINED", but excluding the groups that are
+ listed.
+
+
+The {group-name} in the "contains" list can be a pattern. All group names
+that match the pattern will be included (or excluded, if "ALLBUT" is used).
+The pattern cannot contain white space or a ','. Example: >
+ ... contains=Comment.*,Keyw[0-3]
+The matching will be done at moment the syntax command is executed. Groups
+that are defined later will not be matched. Also, if the current syntax
+command defines a new group, it is not matched. Be careful: When putting
+syntax commands in a file you can't rely on groups NOT being defined, because
+the file may have been sourced before, and ":syn clear" doesn't remove the
+group names.
+
+The contained groups will also match in the start and end patterns of a
+region. If this is not wanted, the "matchgroup" argument can be used
+|:syn-matchgroup|. The "ms=" and "me=" offsets can be used to change the
+region where contained items do match. Note that this may also limit the
+area that is highlighted
+
+
+containedin={group-name}... *:syn-containedin*
+
+The "containedin" argument is followed by a list of syntax group names. The
+item will be allowed to begin inside these groups. This works as if the
+containing item has a "contains=" argument that includes this item.
+
+The {group-name}... can be used just like for "contains", as explained above.
+
+This is useful when adding a syntax item afterwards. An item can be told to
+be included inside an already existing item, without changing the definition
+of that item. For example, to highlight a word in a C comment after loading
+the C syntax: >
+ :syn keyword myword HELP containedin=cComment contained
+Note that "contained" is also used, to avoid that the item matches at the top
+level.
+
+Matches for "containedin" are added to the other places where the item can
+appear. A "contains" argument may also be added as usual. Don't forget that
+keywords never contain another item, thus adding them to "containedin" won't
+work.
+
+
+nextgroup={group-name},.. *:syn-nextgroup*
+
+The "nextgroup" argument is followed by a list of syntax group names,
+separated by commas (just like with "contains", so you can also use patterns).
+
+If the "nextgroup" argument is given, the mentioned syntax groups will be
+tried for a match, after the match or region ends. If none of the groups have
+a match, highlighting continues normally. If there is a match, this group
+will be used, even when it is not mentioned in the "contains" field of the
+current group. This is like giving the mentioned group priority over all
+other groups. Example: >
+ :syntax match ccFoobar "Foo.\{-}Bar" contains=ccFoo
+ :syntax match ccFoo "Foo" contained nextgroup=ccFiller
+ :syntax region ccFiller start="." matchgroup=ccBar end="Bar" contained
+
+This will highlight "Foo" and "Bar" differently, and only when there is a
+"Bar" after "Foo". In the text line below, "f" shows where ccFoo is used for
+highlighting, and "bbb" where ccBar is used. >
+
+ Foo asdfasd Bar asdf Foo asdf Bar asdf
+ fff bbb fff bbb
+
+Note the use of ".\{-}" to skip as little as possible until the next Bar.
+when ".*" would be used, the "asdf" in between "Bar" and "Foo" would be
+highlighted according to the "ccFoobar" group, because the ccFooBar match
+would include the first "Foo" and the last "Bar" in the line (see |pattern|).
+
+
+skipwhite *:syn-skipwhite*
+skipnl *:syn-skipnl*
+skipempty *:syn-skipempty*
+
+These arguments are only used in combination with "nextgroup". They can be
+used to allow the next group to match after skipping some text:
+ skipwhite skip over space and tab characters
+ skipnl skip over the end of a line
+ skipempty skip over empty lines (implies a "skipnl")
+
+When "skipwhite" is present, the white space is only skipped if there is no
+next group that matches the white space.
+
+When "skipnl" is present, the match with nextgroup may be found in the next
+line. This only happens when the current item ends at the end of the current
+line! When "skipnl" is not present, the nextgroup will only be found after
+the current item in the same line.
+
+When skipping text while looking for a next group, the matches for other
+groups are ignored. Only when no next group matches, other items are tried
+for a match again. This means that matching a next group and skipping white
+space and <EOL>s has a higher priority than other items.
+
+Example: >
+ :syn match ifstart "\<if.*" nextgroup=ifline skipwhite skipempty
+ :syn match ifline "[^ \t].*" nextgroup=ifline skipwhite skipempty contained
+ :syn match ifline "endif" contained
+Note that the "[^ \t].*" match matches all non-white text. Thus it would also
+match "endif". Therefore the "endif" match is put last, so that it takes
+precedence.
+Note that this example doesn't work for nested "if"s. You need to add
+"contains" arguments to make that work (omitted for simplicity of the
+example).
+
+IMPLICIT CONCEAL *:syn-conceal-implicit*
+
+:sy[ntax] conceal [on|off]
+ This defines if the following ":syntax" commands will define keywords,
+ matches or regions with the "conceal" flag set. After ":syn conceal
+ on", all subsequent ":syn keyword", ":syn match" or ":syn region"
+ defined will have the "conceal" flag set implicitly. ":syn conceal
+ 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".
+
+==============================================================================
+8. Syntax patterns *:syn-pattern* *E401* *E402*
+
+In the syntax commands, a pattern must be surrounded by two identical
+characters. This is like it works for the ":s" command. The most common to
+use is the double quote. But if the pattern contains a double quote, you can
+use another character that is not used in the pattern. Examples: >
+ :syntax region Comment start="/\*" end="\*/"
+ :syntax region String start=+"+ end=+"+ skip=+\\"+
+
+See |pattern| for the explanation of what a pattern is. Syntax patterns are
+always interpreted like the 'magic' option is set, no matter what the actual
+value of 'magic' is. And the patterns are interpreted like the 'l' flag is
+not included in 'cpoptions'. This was done to make syntax files portable and
+independent of 'compatible' and 'magic' settings.
+
+Try to avoid patterns that can match an empty string, such as "[a-z]*".
+This slows down the highlighting a lot, because it matches everywhere.
+
+ *:syn-pattern-offset*
+The pattern can be followed by a character offset. This can be used to
+change the highlighted part, and to change the text area included in the
+match or region (which only matters when trying to match other items). Both
+are relative to the matched pattern. The character offset for a skip
+pattern can be used to tell where to continue looking for an end pattern.
+
+The offset takes the form of "{what}={offset}"
+The {what} can be one of seven strings:
+
+ms Match Start offset for the start of the matched text
+me Match End offset for the end of the matched text
+hs Highlight Start offset for where the highlighting starts
+he Highlight End offset for where the highlighting ends
+rs Region Start offset for where the body of a region starts
+re Region End offset for where the body of a region ends
+lc Leading Context offset past "leading context" of pattern
+
+The {offset} can be:
+
+s start of the matched pattern
+s+{nr} start of the matched pattern plus {nr} chars to the right
+s-{nr} start of the matched pattern plus {nr} chars to the left
+e end of the matched pattern
+e+{nr} end of the matched pattern plus {nr} chars to the right
+e-{nr} end of the matched pattern plus {nr} chars to the left
+{nr} (for "lc" only): start matching {nr} chars right of the start
+
+Examples: "ms=s+1", "hs=e-2", "lc=3".
+
+Although all offsets are accepted after any pattern, they are not always
+meaningful. This table shows which offsets are actually used:
+
+ ms me hs he rs re lc ~
+match item yes yes yes yes - - yes
+region item start yes - yes - yes - yes
+region item skip - yes - - - - yes
+region item end - yes - yes - yes yes
+
+Offsets can be concatenated, with a ',' in between. Example: >
+ :syn match String /"[^"]*"/hs=s+1,he=e-1
+<
+ some "string" text
+ ^^^^^^ highlighted
+
+Notes:
+- There must be no white space between the pattern and the character
+ offset(s).
+- The highlighted area will never be outside of the matched text.
+- A negative offset for an end pattern may not always work, because the end
+ pattern may be detected when the highlighting should already have stopped.
+- Before Vim 7.2 the offsets were counted in bytes instead of characters.
+ This didn't work well for multibyte characters, so it was changed with the
+ Vim 7.2 release.
+- The start of a match cannot be in a line other than where the pattern
+ matched. This doesn't work: "a\nb"ms=e. You can make the highlighting
+ start in another line, this does work: "a\nb"hs=e.
+
+Example (match a comment but don't highlight the /* and */): >
+ :syntax region Comment start="/\*"hs=e+1 end="\*/"he=s-1
+<
+ /* this is a comment */
+ ^^^^^^^^^^^^^^^^^^^ highlighted
+
+A more complicated Example: >
+ :syn region Exa matchgroup=Foo start="foo"hs=s+2,rs=e+2 matchgroup=Bar end="bar"me=e-1,he=e-1,re=s-1
+<
+ abcfoostringbarabc
+ mmmmmmmmmmm match
+ sssrrreee highlight start/region/end ("Foo", "Exa" and "Bar")
+
+Leading context *:syn-lc* *:syn-leading* *:syn-context*
+
+Note: This is an obsolete feature, only included for backwards compatibility
+with previous Vim versions. It's now recommended to use the |/\@<=| construct
+in the pattern. You can also often use |/\zs|.
+
+The "lc" offset specifies leading context -- a part of the pattern that must
+be present, but is not considered part of the match. An offset of "lc=n" will
+cause Vim to step back n columns before attempting the pattern match, allowing
+characters which have already been matched in previous patterns to also be
+used as leading context for this match. This can be used, for instance, to
+specify that an "escaping" character must not precede the match: >
+
+ :syn match ZNoBackslash "[^\\]z"ms=s+1
+ :syn match WNoBackslash "[^\\]w"lc=1
+ :syn match Underline "_\+"
+<
+ ___zzzz ___wwww
+ ^^^ ^^^ matches Underline
+ ^ ^ matches ZNoBackslash
+ ^^^^ matches WNoBackslash
+
+The "ms" offset is automatically set to the same value as the "lc" offset,
+unless you set "ms" explicitly.
+
+
+Multi-line patterns *:syn-multi-line*
+
+The patterns can include "\n" to match an end-of-line. Mostly this works as
+expected, but there are a few exceptions.
+
+When using a start pattern with an offset, the start of the match is not
+allowed to start in a following line. The highlighting can start in a
+following line though. Using the "\zs" item also requires that the start of
+the match doesn't move to another line.
+
+The skip pattern can include the "\n", but the search for an end pattern will
+continue in the first character of the next line, also when that character is
+matched by the skip pattern. This is because redrawing may start in any line
+halfway a region and there is no check if the skip pattern started in a
+previous line. For example, if the skip pattern is "a\nb" and an end pattern
+is "b", the end pattern does match in the second line of this: >
+ x x a
+ b x x
+Generally this means that the skip pattern should not match any characters
+after the "\n".
+
+
+External matches *:syn-ext-match*
+
+These extra regular expression items are available in region patterns:
+
+ */\z(* */\z(\)* *E50* *E52* *E879*
+ \z(\) Marks the sub-expression as "external", meaning that it can be
+ accessed from another pattern match. Currently only usable in
+ defining a syntax region start pattern.
+
+ */\z1* */\z2* */\z3* */\z4* */\z5*
+ \z1 ... \z9 */\z6* */\z7* */\z8* */\z9* *E66* *E67*
+ Matches the same string that was matched by the corresponding
+ sub-expression in a previous start pattern match.
+
+Sometimes the start and end patterns of a region need to share a common
+sub-expression. A common example is the "here" document in Perl and many Unix
+shells. This effect can be achieved with the "\z" special regular expression
+items, which marks a sub-expression as "external", in the sense that it can be
+referenced from outside the pattern in which it is defined. The here-document
+example, for instance, can be done like this: >
+ :syn region hereDoc start="<<\z(\I\i*\)" end="^\z1$"
+
+As can be seen here, the \z actually does double duty. In the start pattern,
+it marks the "\(\I\i*\)" sub-expression as external; in the end pattern, it
+changes the \z1 back-reference into an external reference referring to the
+first external sub-expression in the start pattern. External references can
+also be used in skip patterns: >
+ :syn region foo start="start \z(\I\i*\)" skip="not end \z1" end="end \z1"
+
+Note that normal and external sub-expressions are completely orthogonal and
+indexed separately; for instance, if the pattern "\z(..\)\(..\)" is applied
+to the string "aabb", then \1 will refer to "bb" and \z1 will refer to "aa".
+Note also that external sub-expressions cannot be accessed as back-references
+within the same pattern like normal sub-expressions. If you want to use one
+sub-expression as both a normal and an external sub-expression, you can nest
+the two, as in "\(\z(...\)\)".
+
+Note that only matches within a single line can be used. Multi-line matches
+cannot be referred to.
+
+==============================================================================
+9. Syntax clusters *:syn-cluster* *E400*
+
+:sy[ntax] cluster {cluster-name} [contains={group-name}..]
+ [add={group-name}..]
+ [remove={group-name}..]
+
+This command allows you to cluster a list of syntax groups together under a
+single name.
+
+ contains={group-name}..
+ The cluster is set to the specified list of groups.
+ add={group-name}..
+ The specified groups are added to the cluster.
+ remove={group-name}..
+ The specified groups are removed from the cluster.
+
+A cluster so defined may be referred to in a contains=.., containedin=..,
+nextgroup=.., add=.. or remove=.. list with a "@" prefix. You can also use
+this notation to implicitly declare a cluster before specifying its contents.
+
+Example: >
+ :syntax match Thing "# [^#]\+ #" contains=@ThingMembers
+ :syntax cluster ThingMembers contains=ThingMember1,ThingMember2
+
+As the previous example suggests, modifications to a cluster are effectively
+retroactive; the membership of the cluster is checked at the last minute, so
+to speak: >
+ :syntax keyword A aaa
+ :syntax keyword B bbb
+ :syntax cluster AandB contains=A
+ :syntax match Stuff "( aaa bbb )" contains=@AandB
+ :syntax cluster AandB add=B " now both keywords are matched in Stuff
+
+This also has implications for nested clusters: >
+ :syntax keyword A aaa
+ :syntax keyword B bbb
+ :syntax cluster SmallGroup contains=B
+ :syntax cluster BigGroup contains=A,@SmallGroup
+ :syntax match Stuff "( aaa bbb )" contains=@BigGroup
+ :syntax cluster BigGroup remove=B " no effect, since B isn't in BigGroup
+ :syntax cluster SmallGroup remove=B " now bbb isn't matched within Stuff
+<
+ *E848*
+The maximum number of clusters is 9767.
+
+==============================================================================
+10. Including syntax files *:syn-include* *E397*
+
+It is often useful for one language's syntax file to include a syntax file for
+a related language. Depending on the exact relationship, this can be done in
+two different ways:
+
+ - If top-level syntax items in the included syntax file are to be
+ allowed at the top level in the including syntax, you can simply use
+ the |:runtime| command: >
+
+ " In cpp.vim:
+ :runtime! syntax/c.vim
+ :unlet b:current_syntax
+
+< - If top-level syntax items in the included syntax file are to be
+ contained within a region in the including syntax, you can use the
+ ":syntax include" command:
+
+:sy[ntax] include [@{grouplist-name}] {file-name}
+
+ All syntax items declared in the included file will have the
+ "contained" flag added. In addition, if a group list is specified,
+ all top-level syntax items in the included file will be added to
+ that list. >
+
+ " In perl.vim:
+ :syntax include @Pod <sfile>:p:h/pod.vim
+ :syntax region perlPOD start="^=head" end="^=cut" contains=@Pod
+<
+ When {file-name} is an absolute path (starts with "/", "c:", "$VAR"
+ or "<sfile>") that file is sourced. When it is a relative path
+ (e.g., "syntax/pod.vim") the file is searched for in 'runtimepath'.
+ All matching files are loaded. Using a relative path is
+ recommended, because it allows a user to replace the included file
+ with their own version, without replacing the file that does the
+ ":syn include".
+
+ *E847*
+The maximum number of includes is 999.
+
+==============================================================================
+11. Synchronizing *:syn-sync* *E403* *E404*
+
+Vim wants to be able to start redrawing in any position in the document. To
+make this possible it needs to know the syntax state at the position where
+redrawing starts.
+
+:sy[ntax] sync [ccomment [group-name] | minlines={N} | ...]
+
+There are four ways to synchronize:
+1. Always parse from the start of the file.
+ |:syn-sync-first|
+2. Based on C-style comments. Vim understands how C-comments work and can
+ figure out if the current line starts inside or outside a comment.
+ |:syn-sync-second|
+3. Jumping back a certain number of lines and start parsing there.
+ |:syn-sync-third|
+4. Searching backwards in the text for a pattern to sync on.
+ |:syn-sync-fourth|
+
+ *:syn-sync-maxlines* *:syn-sync-minlines*
+For the last three methods, the line range where the parsing can start is
+limited by "minlines" and "maxlines".
+
+If the "minlines={N}" argument is given, the parsing always starts at least
+that many lines backwards. This can be used if the parsing may take a few
+lines before it's correct, or when it's not possible to use syncing.
+
+If the "maxlines={N}" argument is given, the number of lines that are searched
+for a comment or syncing pattern is restricted to N lines backwards (after
+adding "minlines"). This is useful if you have few things to sync on and a
+slow machine. Example: >
+ :syntax sync maxlines=500 ccomment
+<
+ *:syn-sync-linebreaks*
+When using a pattern that matches multiple lines, a change in one line may
+cause a pattern to no longer match in a previous line. This means has to
+start above where the change was made. How many lines can be specified with
+the "linebreaks" argument. For example, when a pattern may include one line
+break use this: >
+ :syntax sync linebreaks=1
+The result is that redrawing always starts at least one line before where a
+change was made. The default value for "linebreaks" is zero. Usually the
+value for "minlines" is bigger than "linebreaks".
+
+
+First syncing method: *:syn-sync-first*
+>
+ :syntax sync fromstart
+
+The file will be parsed from the start. This makes syntax highlighting
+accurate, but can be slow for long files. Vim caches previously parsed text,
+so that it's only slow when parsing the text for the first time. However,
+when making changes some part of the text needs to be parsed again (worst
+case: to the end of the file).
+
+Using "fromstart" is equivalent to using "minlines" with a very large number.
+
+
+Second syncing method: *:syn-sync-second* *:syn-sync-ccomment*
+
+For the second method, only the "ccomment" argument needs to be given.
+Example: >
+ :syntax sync ccomment
+
+When Vim finds that the line where displaying starts is inside a C-style
+comment, the last region syntax item with the group-name "Comment" will be
+used. This requires that there is a region with the group-name "Comment"!
+An alternate group name can be specified, for example: >
+ :syntax sync ccomment javaComment
+This means that the last item specified with "syn region javaComment" will be
+used for the detected C comment region. This only works properly if that
+region does have a start pattern "\/*" and an end pattern "*\/".
+
+The "maxlines" argument can be used to restrict the search to a number of
+lines. The "minlines" argument can be used to at least start a number of
+lines back (e.g., for when there is some construct that only takes a few
+lines, but it hard to sync on).
+
+Note: Syncing on a C comment doesn't work properly when strings are used
+that cross a line and contain a "*/". Since letting strings cross a line
+is a bad programming habit (many compilers give a warning message), and the
+chance of a "*/" appearing inside a comment is very small, this restriction
+is hardly ever noticed.
+
+
+Third syncing method: *:syn-sync-third*
+
+For the third method, only the "minlines={N}" argument needs to be given.
+Vim will subtract {N} from the line number and start parsing there. This
+means {N} extra lines need to be parsed, which makes this method a bit slower.
+Example: >
+ :syntax sync minlines=50
+
+"lines" is equivalent to "minlines" (used by older versions).
+
+
+Fourth syncing method: *:syn-sync-fourth*
+
+The idea is to synchronize on the end of a few specific regions, called a
+sync pattern. Only regions can cross lines, so when we find the end of some
+region, we might be able to know in which syntax item we are. The search
+starts in the line just above the one where redrawing starts. From there
+the search continues backwards in the file.
+
+This works just like the non-syncing syntax items. You can use contained
+matches, nextgroup, etc. But there are a few differences:
+- Keywords cannot be used.
+- The syntax items with the "sync" keyword form a completely separated group
+ of syntax items. You can't mix syncing groups and non-syncing groups.
+- The matching works backwards in the buffer (line by line), instead of
+ forwards.
+- A line continuation pattern can be given. It is used to decide which group
+ of lines need to be searched like they were one line. This means that the
+ search for a match with the specified items starts in the first of the
+ consecutive lines that contain the continuation pattern.
+- When using "nextgroup" or "contains", this only works within one line (or
+ group of continued lines).
+- When using a region, it must start and end in the same line (or group of
+ continued lines). Otherwise the end is assumed to be at the end of the
+ line (or group of continued lines).
+- When a match with a sync pattern is found, the rest of the line (or group of
+ continued lines) is searched for another match. The last match is used.
+ This is used when a line can contain both the start end the end of a region
+ (e.g., in a C-comment like /* this */, the last "*/" is used).
+
+There are two ways how a match with a sync pattern can be used:
+1. Parsing for highlighting starts where redrawing starts (and where the
+ search for the sync pattern started). The syntax group that is expected
+ to be valid there must be specified. This works well when the regions
+ that cross lines cannot contain other regions.
+2. Parsing for highlighting continues just after the match. The syntax group
+ that is expected to be present just after the match must be specified.
+ This can be used when the previous method doesn't work well. It's much
+ slower, because more text needs to be parsed.
+Both types of sync patterns can be used at the same time.
+
+Besides the sync patterns, other matches and regions can be specified, to
+avoid finding unwanted matches.
+
+[The reason that the sync patterns are given separately, is that mostly the
+search for the sync point can be much simpler than figuring out the
+highlighting. The reduced number of patterns means it will go (much)
+faster.]
+
+ *syn-sync-grouphere* *E393* *E394*
+ :syntax sync match {sync-group-name} grouphere {group-name} "pattern" ..
+
+ Define a match that is used for syncing. {group-name} is the
+ name of a syntax group that follows just after the match. Parsing
+ of the text for highlighting starts just after the match. A region
+ must exist for this {group-name}. The first one defined will be used.
+ "NONE" can be used for when there is no syntax group after the match.
+
+ *syn-sync-groupthere*
+ :syntax sync match {sync-group-name} groupthere {group-name} "pattern" ..
+
+ Like "grouphere", but {group-name} is the name of a syntax group that
+ is to be used at the start of the line where searching for the sync
+ point started. The text between the match and the start of the sync
+ pattern searching is assumed not to change the syntax highlighting.
+ For example, in C you could search backwards for "/*" and "*/". If
+ "/*" is found first, you know that you are inside a comment, so the
+ "groupthere" is "cComment". If "*/" is found first, you know that you
+ are not in a comment, so the "groupthere" is "NONE". (in practice
+ it's a bit more complicated, because the "/*" and "*/" could appear
+ inside a string. That's left as an exercise to the reader...).
+
+ :syntax sync match ..
+ :syntax sync region ..
+
+ Without a "groupthere" argument. Define a region or match that is
+ skipped while searching for a sync point.
+
+ *syn-sync-linecont*
+ :syntax sync linecont {pattern}
+
+ When {pattern} matches in a line, it is considered to continue in
+ the next line. This means that the search for a sync point will
+ consider the lines to be concatenated.
+
+If the "maxlines={N}" argument is given too, the number of lines that are
+searched for a match is restricted to N. This is useful if you have very
+few things to sync on and a slow machine. Example: >
+ :syntax sync maxlines=100
+
+You can clear all sync settings with: >
+ :syntax sync clear
+
+You can clear specific sync patterns with: >
+ :syntax sync clear {sync-group-name} ..
+
+==============================================================================
+12. Listing syntax items *:syntax* *:sy* *:syn* *:syn-list*
+
+This command lists all the syntax items: >
+
+ :sy[ntax] [list]
+
+To show the syntax items for one syntax group: >
+
+ :sy[ntax] list {group-name}
+
+To list the syntax groups in one cluster: *E392* >
+
+ :sy[ntax] list @{cluster-name}
+
+See above for other arguments for the ":syntax" command.
+
+Note that the ":syntax" command can be abbreviated to ":sy", although ":syn"
+is mostly used, because it looks better.
+
+==============================================================================
+13. Colorschemes *color-schemes*
+
+In the next section you can find information about indivisual highlight groups
+and how to specify colors for them. Most likely you want to just select a set
+of colors by using the `:colorscheme` command, for example: >
+
+ colorscheme pablo
+<
+ *:colo* *:colorscheme* *E185*
+:colo[rscheme] Output the name of the currently active color scheme.
+ This is basically the same as >
+ :echo g:colors_name
+< In case g:colors_name has not been defined :colo will
+ output "default". When compiled without the |+eval|
+ feature it will output "unknown".
+
+:colo[rscheme] {name} Load color scheme {name}. This searches 'runtimepath'
+ for the file "colors/{name}.vim". The first one that
+ is found is loaded.
+ Also searches all plugins in 'packpath', first below
+ "start" and then under "opt".
+
+ Doesn't work recursively, thus you can't use
+ ":colorscheme" in a color scheme script.
+
+You have two options for customizing a color scheme. For changing the
+appearance of specific colors, you can redefine a color name before loading
+the scheme. The desert scheme uses the khaki color for the cursor. To use a
+darker variation of the same color: >
+
+ let v:colornames['khaki'] = '#bdb76b'
+ colorscheme desert
+<
+For further customization, such as changing |:highlight-link| associations,
+use another name, e.g. "~/.vim/colors/mine.vim", and use `:runtime` to load
+the original color scheme: >
+ runtime colors/evening.vim
+ hi Statement ctermfg=Blue guifg=Blue
+
+Before the color scheme will be loaded all default color list scripts
+(`colors/lists/default.vim`) will be executed and then the |ColorSchemePre|
+autocommand event is triggered. After the color scheme has been loaded the
+|ColorScheme| autocommand event is triggered.
+
+ *colorscheme-override*
+If a color scheme is almost right, you can add modifications on top of it by
+using the |ColorScheme| autocommand. For example, to remove the background
+color (can make it transparent in some terminals): >
+ augroup my_colorschemes
+ au!
+ au Colorscheme pablo hi Normal ctermbg=NONE
+ augroup END
+
+Change a couple more colors: >
+ augroup my_colorschemes
+ au!
+ au Colorscheme pablo hi Normal ctermbg=NONE
+ \ | highlight Special ctermfg=63
+ \ | highlight Identifier ctermfg=44
+ augroup END
+
+If you make a lot of changes it might be better to copy the distributed
+colorscheme to your home directory and change it: >
+ :!cp $VIMRUNTIME/colors/pablo.vim ~/.vim/colors
+ :edit ~/.vim/colors/pablo.vim
+
+With Vim 9.0 the collection of color schemes was updated and made work in many
+different terminals. One change was to often define the Normal highlight
+group to make sure the colors work well. In case you prefer the old version,
+you can find them here:
+https://github.com/vim/colorschemes/blob/master/legacy_colors/
+
+For info about writing a color scheme file: >
+ :edit $VIMRUNTIME/colors/README.txt
+
+
+==============================================================================
+14. Highlight command *:highlight* *:hi* *E28* *E411* *E415*
+
+There are three types of 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
+This will open a new window containing all highlight group names, displayed
+in their own color.
+
+:hi[ghlight] List all the current highlight groups that have
+ attributes set.
+
+:hi[ghlight] {group-name}
+ List one highlight group.
+
+ *highlight-clear* *:hi-clear*
+:hi[ghlight] clear Reset all highlighting to the defaults. Removes all
+ highlighting for groups added by the user.
+ Uses the current value of 'background' to decide which
+ default colors to use.
+ If there was a default link, restore it. |:hi-link|
+
+:hi[ghlight] clear {group-name}
+:hi[ghlight] {group-name} NONE
+ Disable the highlighting for one highlight group. It
+ is _not_ set back to the default colors.
+
+:hi[ghlight] [default] {group-name} {key}={arg} ..
+ Add a highlight group, or change the highlighting for
+ an existing group. If a given color name is not
+ recognized, each `colors/lists/default.vim` found on
+ |'runtimepath'| will be loaded.
+ See |highlight-args| for the {key}={arg} arguments.
+ See |:highlight-default| for the optional [default]
+ argument.
+
+Normally a highlight group is added once when starting up. This sets the
+default values for the highlighting. After that, you can use additional
+highlight commands to change the arguments that you want to set to non-default
+values. The value "NONE" can be used to switch the value off or go back to
+the default value.
+
+A simple way to change colors is with the |:colorscheme| command. This loads
+a file with ":highlight" commands such as this: >
+
+ :hi Comment gui=bold
+
+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
+<
+ *: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 ~
+ 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 (MS-Windows console, color-xterm, these have the "Co"
+ termcap entry)
+gui the GUI
+
+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.
+
+1. highlight arguments for normal terminals
+
+ *bold* *underline* *undercurl*
+ *underdouble* *underdotted*
+ *underdashed* *inverse* *italic*
+ *standout* *nocombine* *strikethrough*
+term={attr-list} *attr-list* *highlight-term* *E418*
+ attr-list is a comma-separated list (without spaces) of the
+ following items (in any order):
+ bold
+ underline
+ undercurl not always available
+ underdouble not always available
+ underdotted not always available
+ underdashed not always available
+ strikethrough not always available
+ reverse
+ inverse same as reverse
+ italic
+ standout
+ nocombine override attributes instead of combining them
+ NONE no attributes used (used to reset it)
+
+ Note that "bold" can be used here and by using a bold font. They
+ have the same effect.
+ *underline-codes*
+ "undercurl" is a curly underline. When "undercurl" is not possible
+ then "underline" is used. In general "undercurl" and "strikethrough"
+ are only available in the GUI and some terminals. The color is set
+ with |highlight-guisp| or |highlight-ctermul|. You can try these
+ termcap entries to make undercurl work in a terminal: >
+ let &t_Cs = "\e[4:3m"
+ let &t_Ce = "\e[4:0m"
+
+< "underdouble" is a double underline, "underdotted" is a dotted
+ underline and "underdashed" is a dashed underline. These are only
+ supported by some terminals. If your terminal supports them you may
+ have to specify the codes like this: >
+ let &t_Us = "\e[4:2m"
+ let &t_ds = "\e[4:4m"
+ let &t_Ds = "\e[4:5m"
+< They are reset with |t_Ce|, the same as curly underline (undercurl).
+ When t_Us, t_ds or t_Ds is not set then underline will be used as a
+ fallback.
+
+
+start={term-list} *highlight-start* *E422*
+stop={term-list} *term-list* *highlight-stop*
+ These lists of terminal codes can be used to get
+ non-standard attributes on a terminal.
+
+ The escape sequence specified with the "start" argument
+ is written before the characters in the highlighted
+ area. It can be anything that you want to send to the
+ terminal to highlight this area. The escape sequence
+ specified with the "stop" argument is written after the
+ 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:
+ 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: Some terminals (e.g., DOS console) can't mix these attributes
+ with coloring. To be portable, use only one of "cterm=" OR "ctermfg="
+ OR "ctermbg=".
+
+ctermfg={color-nr} *highlight-ctermfg* *E421*
+ctermbg={color-nr} *highlight-ctermbg*
+ctermul={color-nr} *highlight-ctermul*
+ These give the foreground (ctermfg), background (ctermbg) and
+ underline (ctermul) color to use in the terminal.
+
+ The {color-nr} argument is a color number. Its range is zero to
+ (not including) the number given by the termcap entry "Co".
+ 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.
+ *tmux*
+ When using tmux you may want to use this in the tmux config: >
+ # tmux colors
+ set -s default-terminal "tmux-256color"
+ set -as terminal-overrides ",*-256color:Tc"
+< More info at:
+ https://github.com/tmux/tmux/wiki/FAQ#how-do-i-use-a-256-colour-terminal
+ https://github.com/tmux/tmux/wiki/FAQ#how-do-i-use-rgb-colour
+
+ The MS-Windows 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:
+
+ *cterm-colors*
+ NR-16 NR-8 COLOR NAME ~
+ 0 0 Black
+ 1 4 DarkBlue
+ 2 2 DarkGreen
+ 3 6 DarkCyan
+ 4 1 DarkRed
+ 5 5 DarkMagenta
+ 6 3 Brown, DarkYellow
+ 7 7 LightGray, LightGrey, Gray, Grey
+ 8 0* DarkGray, DarkGrey
+ 9 4* Blue, LightBlue
+ 10 2* Green, LightGreen
+ 11 6* Cyan, LightCyan
+ 12 1* Red, LightRed
+ 13 5* Magenta, LightMagenta
+ 14 3* Yellow, LightYellow
+ 15 7* White
+
+ The number under "NR-16" is used for 16-color terminals ('t_Co'
+ greater than or equal to 16). The number under "NR-8" is used for
+ 8-color terminals ('t_Co' less than 16). The '*' indicates that the
+ bold attribute is set for ctermfg. In many 8-color terminals (e.g.,
+ "linux"), this causes the bright colors to appear. This doesn't work
+ for background colors! Without the '*' the bold attribute is removed.
+ If you want to set the bold attribute in a different way, put a
+ "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.
+
+ Note that for some color terminals these names may result in the wrong
+ colors!
+
+ You can also use "NONE" to remove the color.
+
+ *:hi-normal-cterm*
+ When setting the "ctermfg" or "ctermbg" colors for the Normal group,
+ these will become the colors used for the non-highlighted text.
+ Example: >
+ :highlight Normal ctermfg=grey ctermbg=darkblue
+< When setting the "ctermbg" color for the Normal group, the
+ '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 color scheme 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.
+ *E419* *E420* *E453*
+ When Vim knows the normal foreground, background and underline colors,
+ "fg", "bg" and "ul" can be used as color names. This only works after
+ setting the colors for the Normal group and for the MS-Windows
+ console. Example, for reverse video: >
+ :highlight Visual ctermfg=bg ctermbg=fg
+< Note that the colors are used that are valid at the moment this
+ command is given. If the Normal group colors are changed later, the
+ "fg" and "bg" colors will not be adjusted.
+
+
+3. highlight arguments for the GUI
+
+gui={attr-list} *highlight-gui*
+ These give the attributes to use in the GUI mode.
+ See |attr-list| for a description.
+ Note that "bold" can be used here and by using a bold font. They
+ have the same effect.
+ Note that the attributes are ignored for the "Normal" group.
+
+font={font-name} *highlight-font*
+ font-name is the name of a font, as it is used on the system Vim
+ runs on. For X11 this is a complicated name, for example: >
+ font=-misc-fixed-bold-r-normal--14-130-75-75-c-70-iso8859-1
+<
+ The font-name "NONE" can be used to revert to the default font.
+ When setting the font for the "Normal" group, this becomes the default
+ font (until the 'guifont' option is changed; the last one set is
+ used).
+ The following only works with Motif, not with other GUIs:
+ When setting the font for the "Menu" group, the menus will be changed.
+ When setting the font for the "Tooltip" group, the tooltips will be
+ changed.
+ 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 and
+ strikethrough.
+ There are a few special names:
+ NONE no color (transparent) *E1361*
+ bg use normal background color
+ background use normal background color
+ fg use normal foreground color
+ foreground use normal foreground color
+ To use a color name with an embedded space or other special character,
+ put it in single quotes. The single quote cannot be used then.
+ Example: >
+ :hi comment guifg='salmon pink'
+<
+ *gui-colors*
+ Suggested color names (these are available on most systems):
+ Red LightRed DarkRed
+ Green LightGreen DarkGreen SeaGreen
+ Blue LightBlue DarkBlue SlateBlue
+ Cyan LightCyan DarkCyan
+ Magenta LightMagenta DarkMagenta
+ Yellow LightYellow Brown DarkYellow
+ Gray LightGray DarkGray
+ 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.
+ The format is "#rrggbb", where
+ "rr" is the Red value
+ "gg" is the Green value
+ "bb" is the Blue value
+ All values are hexadecimal, range from "00" to "ff". Examples: >
+ :highlight Comment guifg=#11f0c3 guibg=#ff00ff
+<
+ If you are authoring a color scheme and use the same hexadecimal value
+ repeatedly, you can define a name for it in |v:colornames|. For
+ example: >
+
+ # provide a default value for this color but allow the user to
+ # override it.
+ :call extend(v:colornames, {'alt_turquoise': '#11f0c3'}, 'keep')
+ :highlight Comment guifg=alt_turquoise guibg=magenta
+<
+ If you are using a color scheme that relies on named colors and you
+ would like to adjust the precise appearance of those colors, you can
+ do so by overriding the values in |v:colornames| prior to loading the
+ scheme: >
+
+ let v:colornames['alt_turquoise'] = '#22f0d3'
+ colorscheme alt
+<
+ If you want to develop a color list that can be relied on by others,
+ it is best to prefix your color names. By convention these color lists
+ are placed in the colors/lists directory. You can see an example in
+ '$VIMRUNTIME/colors/lists/csscolors.vim'. This list would be sourced
+ by a color scheme using: >
+
+ :runtime colors/lists/csscolors.vim
+ :highlight Comment guifg=css_turquoise
+<
+
+ *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.
+When possible the name is highlighted in the used colors. If this makes it
+unreadable use Visual selection.
+
+ *hl-ColorColumn*
+ColorColumn Used for the columns set with 'colorcolumn'.
+ *hl-Conceal*
+Conceal Placeholder characters substituted for concealed
+ text (see 'conceallevel').
+ *hl-Cursor* *hl-lCursor*
+Cursor Character under the cursor.
+lCursor Character under the cursor when |language-mapping|
+ is used (see 'guicursor').
+ *hl-CursorIM*
+CursorIM Like Cursor, but used when in IME mode. |CursorIM|
+ *hl-CursorColumn*
+CursorColumn Screen column that the cursor is in when 'cursorcolumn' is set.
+ *hl-CursorLine*
+CursorLine Screen line that the cursor is in when 'cursorline' is set.
+ *hl-Directory*
+Directory Directory names (and other special names in listings).
+ *hl-DiffAdd*
+DiffAdd Diff mode: Added line. |diff.txt|
+ *hl-DiffChange*
+DiffChange Diff mode: Changed line. |diff.txt|
+ *hl-DiffDelete*
+DiffDelete Diff mode: Deleted line. |diff.txt|
+ *hl-DiffText*
+DiffText Diff mode: Changed text within a changed line. |diff.txt|
+ *hl-EndOfBuffer*
+EndOfBuffer Filler lines (~) after the last line in the buffer.
+ By default, this is highlighted like |hl-NonText|.
+ *hl-ErrorMsg*
+ErrorMsg Error messages on the command line.
+ *hl-VertSplit*
+VertSplit Column separating vertically split windows.
+ *hl-Folded*
+Folded Line used for closed folds.
+ *hl-FoldColumn*
+FoldColumn 'foldcolumn'
+ *hl-SignColumn*
+SignColumn Column where |signs| are displayed.
+ *hl-IncSearch*
+IncSearch 'incsearch' highlighting; also used for the text replaced with
+ ":s///c".
+ *hl-LineNr*
+LineNr Line number for ":number" and ":#" commands, and when 'number'
+ or 'relativenumber' option is set.
+ *hl-LineNrAbove*
+LineNrAbove Line number for when the 'relativenumber'
+ option is set, above the cursor line.
+ *hl-LineNrBelow*
+LineNrBelow Line number for when the 'relativenumber'
+ option is set, below the cursor line.
+ *hl-CursorLineNr*
+CursorLineNr Like LineNr when 'cursorline' is set and 'cursorlineopt'
+ contains "number" or is "both", for the cursor line.
+ *hl-CursorLineFold*
+CursorLineFold Like FoldColumn when 'cursorline' is set for the cursor line.
+ *hl-CursorLineSign*
+CursorLineSign Like SignColumn when 'cursorline' is set for the cursor line.
+ *hl-MatchParen*
+MatchParen Character under the cursor or just before it, if it
+ is a paired bracket, and its match. |pi_paren.txt|
+ *hl-MessageWindow*
+MessageWindow Messages popup window used by `:echowindow`. If not defined
+ |hl-WarningMsg| is used.
+ *hl-ModeMsg*
+ModeMsg 'showmode' message (e.g., "-- INSERT --").
+ *hl-MoreMsg*
+MoreMsg |more-prompt|
+ *hl-NonText*
+NonText '@' at the end of the window, "<<<" at the start of the window
+ for 'smoothscroll', characters from 'showbreak' and other
+ characters that do not really exist in the text, such as the
+ ">" displayed when a double-wide character doesn't fit at the
+ end of the line.
+ *hl-Normal*
+Normal Normal text.
+ *hl-Pmenu*
+Pmenu Popup menu: Normal item.
+ *hl-PmenuSel*
+PmenuSel Popup menu: Selected item.
+ *hl-PmenuSbar*
+PmenuSbar Popup menu: Scrollbar.
+ *hl-PmenuThumb*
+PmenuThumb Popup menu: Thumb of the scrollbar.
+ *hl-PopupNotification*
+PopupNotification
+ Popup window created with |popup_notification()|. If not
+ defined |hl-WarningMsg| is used.
+ *hl-Question*
+Question |hit-enter| prompt and yes/no questions.
+ *hl-QuickFixLine*
+QuickFixLine Current |quickfix| item in the quickfix window.
+ *hl-Search*
+Search Last search pattern highlighting (see 'hlsearch').
+ Also used for similar items that need to stand out.
+ *hl-CurSearch*
+CurSearch Current match for the last search pattern (see 'hlsearch').
+ Note: This is correct after a search, but may get outdated if
+ changes are made or the screen is redrawn.
+ *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.
+ *hl-SpellBad*
+SpellBad Word that is not recognized by the spellchecker. |spell|
+ This will be 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.
+ *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.
+ *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.
+ *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*
+TabLineFill Tab pages line, where there are no labels.
+ *hl-TabLineSel*
+TabLineSel Tab pages line, active tab page label.
+ *hl-Terminal*
+Terminal |terminal| window (see |terminal-size-color|).
+ *hl-Title*
+Title Titles for output from ":set all", ":autocmd" etc.
+ *hl-Visual*
+Visual Visual mode selection.
+ *hl-VisualNOS*
+VisualNOS Visual mode selection when vim is "Not Owning the Selection".
+ Only X11 Gui's |gui-x11| and |xterm-clipboard| supports this.
+ *hl-WarningMsg*
+WarningMsg Warning messages.
+ *hl-WildMenu*
+WildMenu Current match in 'wildmenu' completion.
+
+ *hl-User1* *hl-User1..9* *hl-User9*
+The 'statusline' syntax allows the use of 9 different highlights in the
+statusline and ruler (via 'rulerformat'). The names are User1 to User9.
+
+For the GUI you can use the following groups to set the colors for the menu,
+scrollbars and tooltips. They don't have defaults. This doesn't work for the
+Win32 GUI. Only three highlight arguments have any effect here: font, guibg,
+and guifg.
+
+ *hl-Menu*
+Menu Current font, background and foreground colors of the menus.
+ Also used for the toolbar.
+ Applicable highlight arguments: font, guibg, guifg.
+
+ NOTE: For Motif the font argument actually
+ specifies a fontset at all times, no matter if 'guifontset' is
+ empty, and as such it is tied to the current |:language| when
+ set.
+
+ *hl-Scrollbar*
+Scrollbar Current background and foreground of the main window's
+ scrollbars.
+ Applicable highlight arguments: guibg, guifg.
+
+ *hl-Tooltip*
+Tooltip Current font, background and foreground of the tooltips.
+ Applicable highlight arguments: font, guibg, guifg.
+
+ NOTE: For Motif the font argument actually
+ specifies a fontset at all times, no matter if 'guifontset' is
+ empty, and as such it is tied to the current |:language| when
+ set.
+
+==============================================================================
+15. Linking groups *:hi-link* *:highlight-link* *E412* *E413*
+
+When you want to use the same highlighting for several syntax groups, you
+can do this more easily by linking the groups into one common highlight
+group, and give the color attributes only for that group.
+
+To set a link:
+
+ :hi[ghlight][!] [default] link {from-group} {to-group}
+
+To remove a link:
+
+ :hi[ghlight][!] [default] link {from-group} NONE
+
+Notes: *E414*
+- If the {from-group} and/or {to-group} doesn't exist, it is created. You
+ don't get an error message for a non-existing group.
+- As soon as you use a ":highlight" command for a linked group, the link is
+ removed.
+- If there are already highlight settings for the {from-group}, the link is
+ not made, unless the '!' is given. For a ":highlight link" command in a
+ sourced file, you don't get an error message. This can be used to skip
+ links for groups that already have settings.
+
+ *:hi-default* *:highlight-default*
+The [default] argument is used for setting the default highlighting for a
+group. If highlighting has already been specified for the group the command
+will be ignored. Also when there is an existing link.
+
+Using [default] is especially useful to overrule the highlighting of a
+specific syntax file. For example, the C syntax file contains: >
+ :highlight default link cComment Comment
+If you like Question highlighting for C comments, put this in your vimrc file: >
+ :highlight link cComment Question
+Without the "default" in the C syntax file, the highlighting would be
+overruled when the syntax file is loaded.
+
+To have a link survive `:highlight clear`, which is useful if you have
+highlighting for a specific filetype and you want to keep it when selecting
+another color scheme, put a command like this in the
+"after/syntax/{filetype}.vim" file: >
+ highlight! default link cComment Question
+
+==============================================================================
+16. Cleaning up *:syn-clear* *E391*
+
+If you want to clear the syntax stuff for the current buffer, you can use this
+command: >
+ :syntax clear
+
+This command should be used when you want to switch off syntax highlighting,
+or when you want to switch to using another syntax. It's normally not needed
+in a syntax file itself, because syntax is cleared by the autocommands that
+load the syntax file.
+The command also deletes the "b:current_syntax" variable, since no syntax is
+loaded after this command.
+
+To clean up specific syntax groups for the current buffer: >
+ :syntax clear {group-name} ..
+This removes all patterns and keywords for {group-name}.
+
+To clean up specific syntax group lists for the current buffer: >
+ :syntax clear @{grouplist-name} ..
+This sets {grouplist-name}'s contents to an empty list.
+
+ *:syntax-off* *:syn-off*
+If you want to disable syntax highlighting for all buffers, you need to remove
+the autocommands that load the syntax files: >
+ :syntax off
+
+What this command actually does, is executing the command >
+ :source $VIMRUNTIME/syntax/nosyntax.vim
+See the "nosyntax.vim" file for details. Note that for this to work
+$VIMRUNTIME must be valid. See |$VIMRUNTIME|.
+
+ *:syntax-reset* *:syn-reset*
+If you have changed the colors and messed them up, use this command to get the
+defaults back: >
+
+ :syntax reset
+
+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
+scheme for syntax highlighting will be lost.
+
+What this actually does is: >
+
+ let g:syntax_cmd = "reset"
+ runtime! syntax/syncolor.vim
+
+Note that this uses the 'runtimepath' option.
+
+ *syncolor*
+If you want to use different colors for syntax highlighting, you can add a Vim
+script file to set these colors. Put this file in a directory in
+'runtimepath' which comes after $VIMRUNTIME, so that your settings overrule
+the default colors. This way these colors will be used after the ":syntax
+reset" command.
+
+For Unix you can use the file ~/.vim/after/syntax/syncolor.vim. Example: >
+
+ if &background == "light"
+ highlight comment ctermfg=darkgreen guifg=darkgreen
+ else
+ highlight comment ctermfg=green guifg=green
+ endif
+<
+ *E679*
+Do make sure this syncolor.vim script does not use a "syntax on", set the
+'background' option or uses a "colorscheme" command, because it results in an
+endless loop.
+
+Note that when a color scheme is used, there might be some confusion whether
+your defined colors are to be used or the colors from the scheme. This
+depends on the color scheme file. See |:colorscheme|.
+
+ *syntax_cmd*
+The "syntax_cmd" variable is set to one of these values when the
+syntax/syncolor.vim files are loaded:
+ "on" `:syntax on` command. Highlight colors are overruled but
+ links are kept
+ "enable" `:syntax enable` command. Only define colors for groups that
+ don't have highlighting yet. Use `:highlight default` .
+ "reset" `:syntax reset` command or loading a color scheme. Define all
+ the colors.
+ "skip" Don't define colors. Used to skip the default settings when a
+ syncolor.vim file earlier in 'runtimepath' has already set
+ them.
+
+==============================================================================
+17. Highlighting tags *tag-highlight*
+
+If you want to highlight all the tags in your file, you can use the following
+mappings.
+
+ <F11> -- Generate tags.vim file, and highlight tags.
+ <F12> -- Just highlight tags based on existing tags.vim file.
+>
+ :map <F11> :sp tags<CR>:%s/^\([^ :]*:\)\=\([^ ]*\).*/syntax keyword Tag \2/<CR>:wq! tags.vim<CR>/^<CR><F12>
+ :map <F12> :so tags.vim<CR>
+
+WARNING: The longer the tags file, the slower this will be, and the more
+memory Vim will consume.
+
+Only highlighting typedefs, unions and structs can be done too. For this you
+must use Universal Ctags (found at https://ctags.io) or Exuberant ctags (found
+at http://ctags.sf.net).
+
+Put these lines in your Makefile:
+
+# Make a highlight file for types. Requires Universal/Exuberant ctags and awk
+types: types.vim
+types.vim: *.[ch]
+ ctags --c-kinds=gstu -o- *.[ch] |\
+ awk 'BEGIN{printf("syntax keyword Type\t")}\
+ {printf("%s ", $$1)}END{print ""}' > $@
+
+And put these lines in your .vimrc: >
+
+ " load the types.vim highlighting file, if it exists
+ autocmd BufRead,BufNewFile *.[ch] let fname = expand('<afile>:p:h') .. '/types.vim'
+ autocmd BufRead,BufNewFile *.[ch] if filereadable(fname)
+ autocmd BufRead,BufNewFile *.[ch] exe 'so ' .. fname
+ autocmd BufRead,BufNewFile *.[ch] endif
+
+==============================================================================
+18. Window-local syntax *:ownsyntax*
+
+Normally all windows on a buffer share the same syntax settings. It is
+possible, however, to set a particular window on a file to have its own
+private syntax setting. A possible example would be to edit LaTeX source
+with conventional highlighting in one window, while seeing the same source
+highlighted differently (so as to hide control sequences and indicate bold,
+italic etc regions) in another. The 'scrollbind' option is useful here.
+
+To set the current window to have the syntax "foo", separately from all other
+windows on the buffer: >
+ :ownsyntax foo
+< *w:current_syntax*
+This will set the "w:current_syntax" variable to "foo". The value of
+"b:current_syntax" does not change. This is implemented by saving and
+restoring "b:current_syntax", since the syntax files do set
+"b:current_syntax". The value set by the syntax file is assigned to
+"w:current_syntax".
+Note: This resets the 'spell', 'spellcapcheck' and 'spellfile' options.
+
+Once a window has its own syntax, syntax commands executed from other windows
+on the same buffer (including :syntax clear) have no effect. Conversely,
+syntax commands executed from that window do not affect other windows on the
+same buffer.
+
+A window with its own syntax reverts to normal behavior when another buffer
+is loaded into that window or the file is reloaded.
+When splitting the window, the new window will use the original syntax.
+
+==============================================================================
+19. 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>)
+
+
+==============================================================================
+20. When syntax is slow *:syntime*
+
+This is aimed at authors of a syntax file.
+
+If your syntax causes redrawing to be slow, here are a few hints on making it
+faster. To see slowness switch on some features that usually interfere, such
+as 'relativenumber' and |folding|.
+
+Note: This is only available when compiled with the |+profile| feature.
+You many need to build Vim with "huge" features.
+
+To find out what patterns are consuming most time, get an overview with this
+sequence: >
+ :syntime on
+ [ redraw the text at least once with CTRL-L ]
+ :syntime report
+
+This will display a list of syntax patterns that were used, sorted by the time
+it took to match them against the text.
+
+:syntime on Start measuring syntax times. This will add some
+ overhead to compute the time spent on syntax pattern
+ matching.
+
+:syntime off Stop measuring syntax times.
+
+:syntime clear Set all the counters to zero, restart measuring.
+
+:syntime report Show the syntax items used since ":syntime on" in the
+ current window. Use a wider display to see more of
+ the output.
+
+ The list is sorted by total time. The columns are:
+ TOTAL Total time in seconds spent on
+ matching this pattern.
+ COUNT Number of times the pattern was used.
+ MATCH Number of times the pattern actually
+ matched
+ SLOWEST The longest time for one try.
+ AVERAGE The average time for one try.
+ NAME Name of the syntax item. Note that
+ this is not unique.
+ PATTERN The pattern being used.
+
+Pattern matching gets slow when it has to try many alternatives. Try to
+include as much literal text as possible to reduce the number of ways a
+pattern does NOT match.
+
+When using the "\@<=" and "\@<!" items, add a maximum size to avoid trying at
+all positions in the current and previous line. For example, if the item is
+literal text specify the size of that text (in bytes):
+
+"<\@<=span" Matches "span" in "<span". This tries matching with "<" in
+ many places.
+"<\@1<=span" Matches the same, but only tries one byte before "span".
+
+
+ vim:tw=78:sw=4:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/tabpage.txt b/runtime/doc/tabpage.txt
new file mode 100644
index 0000000..a010e2f
--- /dev/null
+++ b/runtime/doc/tabpage.txt
@@ -0,0 +1,483 @@
+*tabpage.txt* For Vim version 9.0. Last change: 2022 Feb 02
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Editing with windows in multiple tab pages. *tab-page* *tabpage*
+
+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|
+
+{not able to use multiple tab pages when the |+windows| feature was disabled
+at compile time}
+
+==============================================================================
+1. Introduction *tab-page-intro*
+
+A tab page holds one or more windows. You can easily switch between tab
+pages, so that you have several collections of windows to work on different
+things.
+
+Usually you will see a list of labels at the top of the Vim window, one for
+each tab page. With the mouse you can click on the label to jump to that tab
+page. There are other ways to move between tab pages, see below.
+
+Most commands work only in the current tab page. That includes the |CTRL-W|
+commands, |:windo|, |:all| and |:ball| (when not using the |:tab| modifier).
+The commands that are aware of other tab pages than the current one are
+mentioned below.
+
+Tabs are also a nice way to edit a buffer temporarily without changing the
+current window layout. Open a new tab page, do whatever you want to do and
+close the tab page.
+
+==============================================================================
+2. Commands *tab-page-commands*
+
+OPENING A NEW TAB PAGE:
+
+When starting Vim "vim -p filename ..." opens each file argument in a separate
+tab page (up to 'tabpagemax'). See |-p|
+
+A double click with the mouse in the non-GUI tab pages line opens a new, empty
+tab page. It is placed left of the position of the click. The first click
+may select another tab page first, causing an extra screen update.
+
+This also works in a few GUI versions, esp. Win32 and Motif. But only when
+clicking 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
+ tab page. 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. >
+ :tabnew " opens tabpage after the current one
+ :.tabnew " as above
+ :+tabnew " opens tabpage after the next tab page
+ " note: it is one further than :tabnew
+ :-tabnew " opens tabpage before the current one
+ :0tabnew " opens tabpage before the first one
+ :$tabnew " opens tabpage after the last one
+
+:[count]tabe[dit] [++opt] [+cmd] {file}
+:[count]tabnew [++opt] [+cmd] {file}
+ Open a new tab page and edit {file}, like with |:edit|.
+ For [count] see |:tabnew| above.
+
+:[count]tabf[ind] [++opt] [+cmd] {file} *:tabf* *:tabfind*
+ Open a new tab page and edit {file} in 'path', like with
+ |:find|. For [count] see |:tabnew| above.
+
+:[count]tab {cmd} *:tab*
+ Execute {cmd} and when it opens a new window open a new tab
+ page instead. Doesn't work for |:diffsplit|, |:diffpatch|,
+ |:execute| and |:normal|.
+ 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 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|.
+
+CTRL-W gF Open a new tab page and edit the file name under the cursor
+ and jump to the line number following the file name.
+ See |CTRL-W_gF|.
+
+CLOSING A TAB PAGE:
+
+Closing the last window of a tab page closes the tab page too, unless there is
+only one tab page.
+
+Using the mouse: If the tab page line is displayed you can click in the "X" at
+the top right to close the current tab page. A custom |'tabline'| may show
+something else.
+
+ *:tabc* *:tabclose*
+:tabc[lose][!] Close current tab page.
+ This command fails when:
+ - There is only one tab page on the screen. *E784*
+ - When 'hidden' is not set, [!] is not used, a buffer has
+ changes, and there is no other window on this buffer.
+ Changes to the buffer are not written and won't get lost, so
+ this is a "safe" command. >
+ :tabclose " close the current tab page
+
+:{count}tabc[lose][!]
+: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 -2 " close the 2nd previous tab page
+ :tabclose + " close the next tab page
+ :tabclose 3 " close the third tab page
+ :tabclose $ " close the last tab page
+ :tabclose # " close the last accessed tab page
+
+When a tab is closed the next tab page will become the current one.
+
+ *:tabo* *:tabonly*
+:tabo[nly][!] Close all other tab pages.
+ When the 'hidden' option is set, all buffers in closed windows
+ become hidden.
+ When 'hidden' is not set, and the 'autowrite' option is set,
+ modified buffers are written. Otherwise, windows that have
+ buffers that are modified are not removed, unless the [!] is
+ given, then they become hidden. But modified buffers are
+ never abandoned, so changes cannot get lost. >
+ :tabonly " close all tab pages except the current
+ " one
+
+:{count}tabo[nly][!]
+: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
+ :tabonly # " close all tab pages except the last
+ " accessed one
+
+
+SWITCHING TO ANOTHER TAB PAGE:
+
+Using the mouse: If the tab page line is displayed you can click in a tab page
+label to switch to that tab page. Click where there is no label to go to the
+next tab page. |'tabline'|
+
+:tabn[ext] *:tabn* *:tabnext* *gt*
+<C-PageDown> *CTRL-<PageDown>* *<C-PageDown>*
+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 last accessed tab page
+ :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.
+
+
+:tabp[revious] *:tabp* *:tabprevious* *gT* *:tabN*
+:tabN[ext] *:tabNext* *CTRL-<PageUp>*
+<C-PageUp> *<C-PageUp>* *i_CTRL-<PageUp>* *i_<C-PageUp>*
+gT Go to the previous tab page. Wraps around from the first one
+ to the last one.
+
+:tabp[revious] {count}
+:tabN[ext] {count}
+{count}<C-PageUp>
+{count}gT Go {count} tab pages back. Wraps around from the first 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.
+
+ *:tabl* *:tablast*
+:tabl[ast] Go to the last tab page.
+
+ *g<Tab>* *CTRL-W_g<Tab>* *<C-Tab>*
+g<Tab> Go to the last accessed tab page.
+
+Other commands:
+ *:tabs*
+: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:
+
+: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. 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
+ :0tabmove " move the tab page to the beginning of the tab
+ " list
+ :tabmove 0 " as above
+ :tabmove " move the tab page to the last
+ :$tabmove " as above
+ :tabmove $ " as above
+ :tabmove # " move the tab page after the last accessed
+ " tab page
+
+:tabm[ove] +[N]
+:tabm[ove] -[N]
+ Move the current tab page N places to the right (with +) or to
+ the left (with -). >
+ :tabmove - " move the tab page to the left
+ :tabmove -1 " as above
+ :tabmove + " move the tab page to the right
+ :tabmove +1 " as above
+
+
+Note that although it is possible to move a tab behind the N-th one by using
+:Ntabmove. And move it by N places by using :+Ntabmove. For clarification what
++N means in this context see |[range]|.
+
+
+LOOPING OVER TAB PAGES:
+
+ *:tabd* *:tabdo*
+:[range]tabd[o] {cmd}
+ Execute {cmd} in each tab page or if [range] is given only in
+ tab pages which tab page number is in the [range]. It works
+ like doing this: >
+ :tabfirst
+ :{cmd}
+ :tabnext
+ :{cmd}
+ etc.
+< This only operates in the current window of each tab page.
+ When an error is detected on one tab page, further tab pages
+ will not be visited.
+ The last tab page (or where an error occurred) becomes the
+ current tab page.
+ {cmd} can contain '|' to concatenate several commands.
+ {cmd} must not open or close tab pages or reorder them.
+ Also see |:windo|, |:argdo|, |:bufdo|, |:cdo|, |:ldo|, |:cfdo|
+ and |:lfdo|
+
+==============================================================================
+3. Other items *tab-page-other*
+
+ *tabline-menu*
+The GUI tab pages line has a popup menu. It is accessed with a right click.
+The entries are:
+ Close Close the tab page under the mouse pointer. The
+ current one if there is no label under the mouse
+ pointer.
+ New Tab Open a tab page, editing an empty buffer. It appears
+ to the left of the mouse pointer.
+ Open Tab... Like "New Tab" and additionally use a file selector to
+ select a file to edit.
+
+Diff mode works per tab page. You can see the diffs between several files
+within one tab page. Other tab pages can show differences between other
+files.
+
+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
+window on the same buffer and then edit another buffer. Thus ":tabnew"
+triggers:
+ WinLeave leave current window
+ TabLeave leave current tab page
+ WinEnter enter window in new tab page
+ TabEnter enter new tab page
+ BufLeave leave current buffer
+ BufEnter enter new empty buffer
+
+When switching to another tab page the order is:
+ BufLeave
+ WinLeave
+ TabLeave
+ TabEnter
+ WinEnter
+ BufEnter
+
+==============================================================================
+4. Setting 'tabline' *setting-tabline*
+
+The 'tabline' option specifies what the line with tab pages labels looks like.
+It is only used when there is no GUI tab line.
+
+You can use the 'showtabline' option to specify when you want the line with
+tab page labels to appear: never, when there is more than one tab page or
+always.
+
+The highlighting of the tab pages line is set with the groups TabLine
+TabLineSel and TabLineFill. |hl-TabLine| |hl-TabLineSel| |hl-TabLineFill|
+
+A "+" will be shown for a tab page that has a modified window. The number of
+windows in a tabpage is also shown. Thus "3+" means three windows and one of
+them has a modified buffer.
+
+The 'tabline' option allows you to define your preferred way to tab pages
+labels. This isn't easy, thus an example will be given here.
+
+For basics see the 'statusline' option. The same items can be used in the
+'tabline' option. Additionally, the |tabpagebuflist()|, |tabpagenr()| and
+|tabpagewinnr()| functions are useful.
+
+Since the number of tab labels will vary, you need to use an expression for
+the whole option. Something like: >
+ :set tabline=%!MyTabLine()
+
+Then define the MyTabLine() function to list all the tab pages labels. A
+convenient method is to split it in two parts: First go over all the tab
+pages and define labels for them. Then get the label for each tab page. >
+
+ function MyTabLine()
+ let s = ''
+ for i in range(tabpagenr('$'))
+ " select the highlighting
+ if i + 1 == tabpagenr()
+ let s ..= '%#TabLineSel#'
+ else
+ let s ..= '%#TabLine#'
+ endif
+
+ " set the tab page number (for mouse clicks)
+ let s ..= '%' .. (i + 1) .. 'T'
+
+ " the label is made by MyTabLabel()
+ let s ..= ' %{MyTabLabel(' .. (i + 1) .. ')} '
+ endfor
+
+ " after the last tab fill with TabLineFill and reset tab page nr
+ let s ..= '%#TabLineFill#%T'
+
+ " right-align the label to close the current tab page
+ if tabpagenr('$') > 1
+ let s ..= '%=%#TabLine#%999Xclose'
+ endif
+
+ return s
+ endfunction
+
+Now the MyTabLabel() function is called for each tab page to get its label. >
+
+ function MyTabLabel(n)
+ let buflist = tabpagebuflist(a:n)
+ let winnr = tabpagewinnr(a:n)
+ return bufname(buflist[winnr - 1])
+ endfunction
+
+This is just a simplistic example that results in a tab pages line that
+resembles the default, but without adding a + for a modified buffer or
+truncating the names. You will want to reduce the width of labels in a
+clever way when there is not enough room. Check the 'columns' option for the
+space available.
+
+==============================================================================
+5. Setting 'guitablabel' *setting-guitablabel*
+
+When the GUI tab pages line is displayed, 'guitablabel' can be used to
+specify the label to display for each tab page. Unlike 'tabline', which
+specifies the whole tab pages line at once, 'guitablabel' is used for each
+label separately.
+
+'guitabtooltip' is very similar and is used for the tooltip of the same label.
+This only appears when the mouse pointer hovers over the label, thus it
+usually is longer. Only supported on some systems though.
+
+See the 'statusline' option for the format of the value.
+
+The "%N" item can be used for the current tab page number. The |v:lnum|
+variable is also set to this number when the option is evaluated.
+The items that use a file name refer to the current window of the tab page.
+
+Note that syntax highlighting is not used for the option. The %T and %X
+items are also ignored.
+
+A simple example that puts the tab page number and the buffer name in the
+label: >
+ :set guitablabel=%N\ %f
+
+An example that resembles the default 'guitablabel': Show the number of
+windows in the tab page and a '+' if there is a modified buffer: >
+
+ function GuiTabLabel()
+ let label = ''
+ let bufnrlist = tabpagebuflist(v:lnum)
+
+ " Add '+' if one of the buffers in the tab page is modified
+ for bufnr in bufnrlist
+ if getbufvar(bufnr, "&modified")
+ let label = '+'
+ break
+ endif
+ endfor
+
+ " Append the number of windows in the tab page if more than one
+ let wincount = tabpagewinnr(v:lnum, '$')
+ if wincount > 1
+ let label ..= wincount
+ endif
+ if label != ''
+ let label ..= ' '
+ endif
+
+ " Append the buffer name
+ return label .. bufname(bufnrlist[tabpagewinnr(v:lnum) - 1])
+ endfunction
+
+ set guitablabel=%{GuiTabLabel()}
+
+Note that the function must be defined before setting the option, otherwise
+you get an error message for the function not being known.
+
+If you want to fall back to the default label, return an empty string.
+
+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:noet:ft=help:norl:
diff --git a/runtime/doc/tags b/runtime/doc/tags
new file mode 100644
index 0000000..61e7c69
--- /dev/null
+++ b/runtime/doc/tags
@@ -0,0 +1,11241 @@
+! change.txt /*!*
+!! change.txt /*!!*
+# pattern.txt /*#*
+#{} eval.txt /*#{}*
+$ motion.txt /*$*
+$HOME options.txt /*$HOME*
+$HOME-use version5.txt /*$HOME-use*
+$HOME-windows options.txt /*$HOME-windows*
+$MYGVIMRC gui.txt /*$MYGVIMRC*
+$MYVIMRC starting.txt /*$MYVIMRC*
+$VIM starting.txt /*$VIM*
+$VIM-use version5.txt /*$VIM-use*
+$VIMRUNTIME starting.txt /*$VIMRUNTIME*
+$VIM_POSIX vi_diff.txt /*$VIM_POSIX*
+$quote eval.txt /*$quote*
+% motion.txt /*%*
+%:. cmdline.txt /*%:.*
+%:8 cmdline.txt /*%:8*
+%:S cmdline.txt /*%:S*
+%:e cmdline.txt /*%:e*
+%:gs cmdline.txt /*%:gs*
+%:h cmdline.txt /*%:h*
+%:p cmdline.txt /*%:p*
+%:r cmdline.txt /*%:r*
+%:s cmdline.txt /*%:s*
+%:t cmdline.txt /*%:t*
+%:~ cmdline.txt /*%:~*
+& change.txt /*&*
+' motion.txt /*'*
+'' motion.txt /*''*
+'( motion.txt /*'(*
+') motion.txt /*')*
+'. motion.txt /*'.*
+'0 motion.txt /*'0*
+'< motion.txt /*'<*
+'> motion.txt /*'>*
+'A motion.txt /*'A*
+'[ motion.txt /*'[*
+'] motion.txt /*']*
+'^ motion.txt /*'^*
+'a motion.txt /*'a*
+'acd' options.txt /*'acd'*
+'ai' options.txt /*'ai'*
+'akm' options.txt /*'akm'*
+'al' options.txt /*'al'*
+'aleph' options.txt /*'aleph'*
+'allowrevins' options.txt /*'allowrevins'*
+'altkeymap' options.txt /*'altkeymap'*
+'ambiwidth' options.txt /*'ambiwidth'*
+'ambw' options.txt /*'ambw'*
+'anti' options.txt /*'anti'*
+'antialias' options.txt /*'antialias'*
+'ap' vi_diff.txt /*'ap'*
+'ar' options.txt /*'ar'*
+'arab' options.txt /*'arab'*
+'arabic' options.txt /*'arabic'*
+'arabicshape' options.txt /*'arabicshape'*
+'ari' options.txt /*'ari'*
+'arshape' options.txt /*'arshape'*
+'as' todo.txt /*'as'*
+'asd' options.txt /*'asd'*
+'autochdir' options.txt /*'autochdir'*
+'autoindent' options.txt /*'autoindent'*
+'autoprint' vi_diff.txt /*'autoprint'*
+'autoread' options.txt /*'autoread'*
+'autosave' todo.txt /*'autosave'*
+'autoshelldir' options.txt /*'autoshelldir'*
+'autowrite' options.txt /*'autowrite'*
+'autowriteall' options.txt /*'autowriteall'*
+'aw' options.txt /*'aw'*
+'awa' options.txt /*'awa'*
+'b:context_ignore_makefile' ft_context.txt /*'b:context_ignore_makefile'*
+'b:context_include' ft_context.txt /*'b:context_include'*
+'b:mp_metafun' ft_mp.txt /*'b:mp_metafun'*
+'background' options.txt /*'background'*
+'backspace' options.txt /*'backspace'*
+'backup' options.txt /*'backup'*
+'backupcopy' options.txt /*'backupcopy'*
+'backupdir' options.txt /*'backupdir'*
+'backupext' options.txt /*'backupext'*
+'backupskip' options.txt /*'backupskip'*
+'balloondelay' options.txt /*'balloondelay'*
+'ballooneval' options.txt /*'ballooneval'*
+'balloonevalterm' options.txt /*'balloonevalterm'*
+'balloonexpr' options.txt /*'balloonexpr'*
+'bdir' options.txt /*'bdir'*
+'bdlay' options.txt /*'bdlay'*
+'beautify' vi_diff.txt /*'beautify'*
+'belloff' options.txt /*'belloff'*
+'beval' options.txt /*'beval'*
+'bevalterm' options.txt /*'bevalterm'*
+'bex' options.txt /*'bex'*
+'bexpr' options.txt /*'bexpr'*
+'bf' vi_diff.txt /*'bf'*
+'bg' options.txt /*'bg'*
+'bh' options.txt /*'bh'*
+'bin' options.txt /*'bin'*
+'binary' options.txt /*'binary'*
+'biosk' options.txt /*'biosk'*
+'bioskey' options.txt /*'bioskey'*
+'bk' options.txt /*'bk'*
+'bkc' options.txt /*'bkc'*
+'bl' options.txt /*'bl'*
+'bo' options.txt /*'bo'*
+'bomb' options.txt /*'bomb'*
+'breakat' options.txt /*'breakat'*
+'breakindent' options.txt /*'breakindent'*
+'breakindentopt' options.txt /*'breakindentopt'*
+'bri' options.txt /*'bri'*
+'briopt' options.txt /*'briopt'*
+'brk' options.txt /*'brk'*
+'browsedir' options.txt /*'browsedir'*
+'bs' options.txt /*'bs'*
+'bsdir' options.txt /*'bsdir'*
+'bsk' options.txt /*'bsk'*
+'bt' options.txt /*'bt'*
+'bufhidden' options.txt /*'bufhidden'*
+'buflisted' options.txt /*'buflisted'*
+'buftype' options.txt /*'buftype'*
+'casemap' options.txt /*'casemap'*
+'cb' options.txt /*'cb'*
+'cc' options.txt /*'cc'*
+'ccv' options.txt /*'ccv'*
+'cd' options.txt /*'cd'*
+'cdh' options.txt /*'cdh'*
+'cdhome' options.txt /*'cdhome'*
+'cdpath' options.txt /*'cdpath'*
+'cedit' options.txt /*'cedit'*
+'cf' options.txt /*'cf'*
+'cfu' options.txt /*'cfu'*
+'ch' options.txt /*'ch'*
+'character' intro.txt /*'character'*
+'charconvert' options.txt /*'charconvert'*
+'ci' options.txt /*'ci'*
+'cin' options.txt /*'cin'*
+'cindent' options.txt /*'cindent'*
+'cink' options.txt /*'cink'*
+'cinkeys' options.txt /*'cinkeys'*
+'cino' options.txt /*'cino'*
+'cinoptions' options.txt /*'cinoptions'*
+'cinscopedecls' options.txt /*'cinscopedecls'*
+'cinsd' options.txt /*'cinsd'*
+'cinw' options.txt /*'cinw'*
+'cinwords' options.txt /*'cinwords'*
+'clipboard' options.txt /*'clipboard'*
+'cm' options.txt /*'cm'*
+'cmdheight' options.txt /*'cmdheight'*
+'cmdwinheight' options.txt /*'cmdwinheight'*
+'cmp' options.txt /*'cmp'*
+'cms' options.txt /*'cms'*
+'co' options.txt /*'co'*
+'cocu' options.txt /*'cocu'*
+'cole' options.txt /*'cole'*
+'colorcolumn' options.txt /*'colorcolumn'*
+'columns' options.txt /*'columns'*
+'com' options.txt /*'com'*
+'comments' options.txt /*'comments'*
+'commentstring' options.txt /*'commentstring'*
+'compatible' options.txt /*'compatible'*
+'complete' options.txt /*'complete'*
+'completefunc' options.txt /*'completefunc'*
+'completeopt' options.txt /*'completeopt'*
+'completepopup' options.txt /*'completepopup'*
+'completeslash' options.txt /*'completeslash'*
+'concealcursor' options.txt /*'concealcursor'*
+'conceallevel' options.txt /*'conceallevel'*
+'confirm' options.txt /*'confirm'*
+'consk' options.txt /*'consk'*
+'conskey' options.txt /*'conskey'*
+'copyindent' options.txt /*'copyindent'*
+'cot' options.txt /*'cot'*
+'cp' options.txt /*'cp'*
+'cpo' options.txt /*'cpo'*
+'cpoptions' options.txt /*'cpoptions'*
+'cpp' options.txt /*'cpp'*
+'cpt' options.txt /*'cpt'*
+'crb' options.txt /*'crb'*
+'cryptmethod' options.txt /*'cryptmethod'*
+'cscopepathcomp' options.txt /*'cscopepathcomp'*
+'cscopeprg' options.txt /*'cscopeprg'*
+'cscopequickfix' options.txt /*'cscopequickfix'*
+'cscoperelative' options.txt /*'cscoperelative'*
+'cscopetag' options.txt /*'cscopetag'*
+'cscopetagorder' options.txt /*'cscopetagorder'*
+'cscopeverbose' options.txt /*'cscopeverbose'*
+'csl' options.txt /*'csl'*
+'cspc' options.txt /*'cspc'*
+'csprg' options.txt /*'csprg'*
+'csqf' options.txt /*'csqf'*
+'csre' options.txt /*'csre'*
+'cst' options.txt /*'cst'*
+'csto' options.txt /*'csto'*
+'csverb' options.txt /*'csverb'*
+'cuc' options.txt /*'cuc'*
+'cul' options.txt /*'cul'*
+'culopt' options.txt /*'culopt'*
+'cursorbind' options.txt /*'cursorbind'*
+'cursorcolumn' options.txt /*'cursorcolumn'*
+'cursorline' options.txt /*'cursorline'*
+'cursorlineopt' options.txt /*'cursorlineopt'*
+'cwh' options.txt /*'cwh'*
+'debug' options.txt /*'debug'*
+'deco' options.txt /*'deco'*
+'def' options.txt /*'def'*
+'define' options.txt /*'define'*
+'delcombine' options.txt /*'delcombine'*
+'dex' options.txt /*'dex'*
+'dg' options.txt /*'dg'*
+'dict' options.txt /*'dict'*
+'dictionary' options.txt /*'dictionary'*
+'diff' options.txt /*'diff'*
+'diffexpr' options.txt /*'diffexpr'*
+'diffopt' options.txt /*'diffopt'*
+'digraph' options.txt /*'digraph'*
+'dip' options.txt /*'dip'*
+'dir' options.txt /*'dir'*
+'directory' options.txt /*'directory'*
+'display' options.txt /*'display'*
+'dy' options.txt /*'dy'*
+'ea' options.txt /*'ea'*
+'ead' options.txt /*'ead'*
+'eadirection' options.txt /*'eadirection'*
+'eb' options.txt /*'eb'*
+'ed' options.txt /*'ed'*
+'edcompatible' options.txt /*'edcompatible'*
+'ef' options.txt /*'ef'*
+'efm' options.txt /*'efm'*
+'ei' options.txt /*'ei'*
+'ek' options.txt /*'ek'*
+'emo' options.txt /*'emo'*
+'emoji' options.txt /*'emoji'*
+'enc' options.txt /*'enc'*
+'encoding' options.txt /*'encoding'*
+'endoffile' options.txt /*'endoffile'*
+'endofline' options.txt /*'endofline'*
+'eof' options.txt /*'eof'*
+'eol' options.txt /*'eol'*
+'ep' options.txt /*'ep'*
+'equalalways' options.txt /*'equalalways'*
+'equalprg' options.txt /*'equalprg'*
+'errorbells' options.txt /*'errorbells'*
+'errorfile' options.txt /*'errorfile'*
+'errorformat' options.txt /*'errorformat'*
+'esckeys' options.txt /*'esckeys'*
+'et' options.txt /*'et'*
+'eventignore' options.txt /*'eventignore'*
+'ex' options.txt /*'ex'*
+'expandtab' options.txt /*'expandtab'*
+'exrc' options.txt /*'exrc'*
+'fcl' options.txt /*'fcl'*
+'fcs' options.txt /*'fcs'*
+'fdc' options.txt /*'fdc'*
+'fde' options.txt /*'fde'*
+'fdi' options.txt /*'fdi'*
+'fdl' options.txt /*'fdl'*
+'fdls' options.txt /*'fdls'*
+'fdm' options.txt /*'fdm'*
+'fdn' options.txt /*'fdn'*
+'fdo' options.txt /*'fdo'*
+'fdt' options.txt /*'fdt'*
+'fe' options.txt /*'fe'*
+'fen' options.txt /*'fen'*
+'fenc' options.txt /*'fenc'*
+'fencs' options.txt /*'fencs'*
+'fex' options.txt /*'fex'*
+'ff' options.txt /*'ff'*
+'ffs' options.txt /*'ffs'*
+'fic' options.txt /*'fic'*
+'fileencoding' options.txt /*'fileencoding'*
+'fileencodings' options.txt /*'fileencodings'*
+'fileformat' options.txt /*'fileformat'*
+'fileformats' options.txt /*'fileformats'*
+'fileignorecase' options.txt /*'fileignorecase'*
+'filetype' options.txt /*'filetype'*
+'fillchars' options.txt /*'fillchars'*
+'fixendofline' options.txt /*'fixendofline'*
+'fixeol' options.txt /*'fixeol'*
+'fk' options.txt /*'fk'*
+'fkmap' options.txt /*'fkmap'*
+'fl' vi_diff.txt /*'fl'*
+'flash' vi_diff.txt /*'flash'*
+'flp' options.txt /*'flp'*
+'fml' options.txt /*'fml'*
+'fmr' options.txt /*'fmr'*
+'fo' options.txt /*'fo'*
+'foldclose' options.txt /*'foldclose'*
+'foldcolumn' options.txt /*'foldcolumn'*
+'foldenable' options.txt /*'foldenable'*
+'foldexpr' options.txt /*'foldexpr'*
+'foldignore' options.txt /*'foldignore'*
+'foldlevel' options.txt /*'foldlevel'*
+'foldlevelstart' options.txt /*'foldlevelstart'*
+'foldmarker' options.txt /*'foldmarker'*
+'foldmethod' options.txt /*'foldmethod'*
+'foldminlines' options.txt /*'foldminlines'*
+'foldnestmax' options.txt /*'foldnestmax'*
+'foldopen' options.txt /*'foldopen'*
+'foldtext' options.txt /*'foldtext'*
+'formatexpr' options.txt /*'formatexpr'*
+'formatlistpat' options.txt /*'formatlistpat'*
+'formatoptions' options.txt /*'formatoptions'*
+'formatprg' options.txt /*'formatprg'*
+'fp' options.txt /*'fp'*
+'fs' options.txt /*'fs'*
+'fsync' options.txt /*'fsync'*
+'ft' options.txt /*'ft'*
+'g:context_extra_options' ft_context.txt /*'g:context_extra_options'*
+'g:context_ignore_makefile' ft_context.txt /*'g:context_ignore_makefile'*
+'g:context_include' ft_context.txt /*'g:context_include'*
+'g:mf_other_macros' ft_mp.txt /*'g:mf_other_macros'*
+'g:mf_plain_macros' ft_mp.txt /*'g:mf_plain_macros'*
+'g:mf_plain_modes' ft_mp.txt /*'g:mf_plain_modes'*
+'g:mp_close_tag' ft_mp.txt /*'g:mp_close_tag'*
+'g:mp_metafun' ft_mp.txt /*'g:mp_metafun'*
+'g:mp_mfplain_macros' ft_mp.txt /*'g:mp_mfplain_macros'*
+'g:mp_open_tag' ft_mp.txt /*'g:mp_open_tag'*
+'g:mp_other_macros' ft_mp.txt /*'g:mp_other_macros'*
+'g:mp_plain_macros' ft_mp.txt /*'g:mp_plain_macros'*
+'g:no_context_maps' ft_context.txt /*'g:no_context_maps'*
+'g:no_mf_maps' ft_mp.txt /*'g:no_mf_maps'*
+'g:no_mp_maps' ft_mp.txt /*'g:no_mp_maps'*
+'gcr' options.txt /*'gcr'*
+'gd' options.txt /*'gd'*
+'gdefault' options.txt /*'gdefault'*
+'gfm' options.txt /*'gfm'*
+'gfn' options.txt /*'gfn'*
+'gfs' options.txt /*'gfs'*
+'gfw' options.txt /*'gfw'*
+'ghr' options.txt /*'ghr'*
+'gli' options.txt /*'gli'*
+'go' options.txt /*'go'*
+'go-!' options.txt /*'go-!'*
+'go-A' options.txt /*'go-A'*
+'go-F' options.txt /*'go-F'*
+'go-L' options.txt /*'go-L'*
+'go-M' options.txt /*'go-M'*
+'go-P' options.txt /*'go-P'*
+'go-R' options.txt /*'go-R'*
+'go-T' options.txt /*'go-T'*
+'go-a' options.txt /*'go-a'*
+'go-b' options.txt /*'go-b'*
+'go-c' options.txt /*'go-c'*
+'go-d' options.txt /*'go-d'*
+'go-e' options.txt /*'go-e'*
+'go-f' options.txt /*'go-f'*
+'go-g' options.txt /*'go-g'*
+'go-h' options.txt /*'go-h'*
+'go-i' options.txt /*'go-i'*
+'go-k' options.txt /*'go-k'*
+'go-l' options.txt /*'go-l'*
+'go-m' options.txt /*'go-m'*
+'go-p' options.txt /*'go-p'*
+'go-r' options.txt /*'go-r'*
+'go-t' options.txt /*'go-t'*
+'go-v' options.txt /*'go-v'*
+'gp' options.txt /*'gp'*
+'gr' vi_diff.txt /*'gr'*
+'graphic' vi_diff.txt /*'graphic'*
+'grepformat' options.txt /*'grepformat'*
+'grepprg' options.txt /*'grepprg'*
+'gtl' options.txt /*'gtl'*
+'gtt' options.txt /*'gtt'*
+'guicursor' options.txt /*'guicursor'*
+'guifont' options.txt /*'guifont'*
+'guifontset' options.txt /*'guifontset'*
+'guifontwide' options.txt /*'guifontwide'*
+'guiheadroom' options.txt /*'guiheadroom'*
+'guiligatures' options.txt /*'guiligatures'*
+'guioptions' options.txt /*'guioptions'*
+'guipty' options.txt /*'guipty'*
+'guitablabel' options.txt /*'guitablabel'*
+'guitabtooltip' options.txt /*'guitabtooltip'*
+'hardtabs' vi_diff.txt /*'hardtabs'*
+'helpfile' options.txt /*'helpfile'*
+'helpheight' options.txt /*'helpheight'*
+'helplang' options.txt /*'helplang'*
+'hf' options.txt /*'hf'*
+'hh' options.txt /*'hh'*
+'hi' options.txt /*'hi'*
+'hid' options.txt /*'hid'*
+'hidden' options.txt /*'hidden'*
+'highlight' options.txt /*'highlight'*
+'history' options.txt /*'history'*
+'hk' options.txt /*'hk'*
+'hkmap' options.txt /*'hkmap'*
+'hkmapp' options.txt /*'hkmapp'*
+'hkp' options.txt /*'hkp'*
+'hl' options.txt /*'hl'*
+'hlg' options.txt /*'hlg'*
+'hls' options.txt /*'hls'*
+'hlsearch' options.txt /*'hlsearch'*
+'ht' vi_diff.txt /*'ht'*
+'ic' options.txt /*'ic'*
+'icon' options.txt /*'icon'*
+'iconstring' options.txt /*'iconstring'*
+'ignorecase' options.txt /*'ignorecase'*
+'im' options.txt /*'im'*
+'imactivatefunc' options.txt /*'imactivatefunc'*
+'imactivatekey' options.txt /*'imactivatekey'*
+'imaf' options.txt /*'imaf'*
+'imak' options.txt /*'imak'*
+'imc' options.txt /*'imc'*
+'imcmdline' options.txt /*'imcmdline'*
+'imd' options.txt /*'imd'*
+'imdisable' options.txt /*'imdisable'*
+'imi' options.txt /*'imi'*
+'iminsert' options.txt /*'iminsert'*
+'ims' options.txt /*'ims'*
+'imsearch' options.txt /*'imsearch'*
+'imsf' options.txt /*'imsf'*
+'imst' options.txt /*'imst'*
+'imstatusfunc' options.txt /*'imstatusfunc'*
+'imstyle' options.txt /*'imstyle'*
+'inc' options.txt /*'inc'*
+'include' options.txt /*'include'*
+'includeexpr' options.txt /*'includeexpr'*
+'incsearch' options.txt /*'incsearch'*
+'inde' options.txt /*'inde'*
+'indentexpr' options.txt /*'indentexpr'*
+'indentkeys' options.txt /*'indentkeys'*
+'indk' options.txt /*'indk'*
+'inex' options.txt /*'inex'*
+'inf' options.txt /*'inf'*
+'infercase' options.txt /*'infercase'*
+'insertmode' options.txt /*'insertmode'*
+'is' options.txt /*'is'*
+'isf' options.txt /*'isf'*
+'isfname' options.txt /*'isfname'*
+'isi' options.txt /*'isi'*
+'isident' options.txt /*'isident'*
+'isk' options.txt /*'isk'*
+'iskeyword' options.txt /*'iskeyword'*
+'isp' options.txt /*'isp'*
+'isprint' options.txt /*'isprint'*
+'joinspaces' options.txt /*'joinspaces'*
+'js' options.txt /*'js'*
+'key' options.txt /*'key'*
+'keymap' options.txt /*'keymap'*
+'keymodel' options.txt /*'keymodel'*
+'keyprotocol' options.txt /*'keyprotocol'*
+'keywordprg' options.txt /*'keywordprg'*
+'km' options.txt /*'km'*
+'kmp' options.txt /*'kmp'*
+'kp' options.txt /*'kp'*
+'kpc' options.txt /*'kpc'*
+'langmap' options.txt /*'langmap'*
+'langmenu' options.txt /*'langmenu'*
+'langnoremap' options.txt /*'langnoremap'*
+'langremap' options.txt /*'langremap'*
+'laststatus' options.txt /*'laststatus'*
+'lazyredraw' options.txt /*'lazyredraw'*
+'lbr' options.txt /*'lbr'*
+'lcs' options.txt /*'lcs'*
+'linebreak' options.txt /*'linebreak'*
+'lines' options.txt /*'lines'*
+'linespace' options.txt /*'linespace'*
+'lisp' options.txt /*'lisp'*
+'lispoptions' options.txt /*'lispoptions'*
+'lispwords' options.txt /*'lispwords'*
+'list' options.txt /*'list'*
+'listchars' options.txt /*'listchars'*
+'lm' options.txt /*'lm'*
+'lmap' options.txt /*'lmap'*
+'lnr' options.txt /*'lnr'*
+'loadplugins' options.txt /*'loadplugins'*
+'lop' options.txt /*'lop'*
+'lpl' options.txt /*'lpl'*
+'lrm' options.txt /*'lrm'*
+'ls' options.txt /*'ls'*
+'lsp' options.txt /*'lsp'*
+'luadll' options.txt /*'luadll'*
+'lw' options.txt /*'lw'*
+'lz' options.txt /*'lz'*
+'ma' options.txt /*'ma'*
+'macatsui' options.txt /*'macatsui'*
+'magic' options.txt /*'magic'*
+'makeef' options.txt /*'makeef'*
+'makeencoding' options.txt /*'makeencoding'*
+'makeprg' options.txt /*'makeprg'*
+'mat' options.txt /*'mat'*
+'matchpairs' options.txt /*'matchpairs'*
+'matchtime' options.txt /*'matchtime'*
+'maxcombine' options.txt /*'maxcombine'*
+'maxfuncdepth' options.txt /*'maxfuncdepth'*
+'maxmapdepth' options.txt /*'maxmapdepth'*
+'maxmem' options.txt /*'maxmem'*
+'maxmempattern' options.txt /*'maxmempattern'*
+'maxmemtot' options.txt /*'maxmemtot'*
+'mco' options.txt /*'mco'*
+'mef' options.txt /*'mef'*
+'menc' options.txt /*'menc'*
+'menuitems' options.txt /*'menuitems'*
+'mesg' vi_diff.txt /*'mesg'*
+'mfd' options.txt /*'mfd'*
+'mh' options.txt /*'mh'*
+'mis' options.txt /*'mis'*
+'mkspellmem' options.txt /*'mkspellmem'*
+'ml' options.txt /*'ml'*
+'mle' options.txt /*'mle'*
+'mls' options.txt /*'mls'*
+'mm' options.txt /*'mm'*
+'mmd' options.txt /*'mmd'*
+'mmp' options.txt /*'mmp'*
+'mmt' options.txt /*'mmt'*
+'mod' options.txt /*'mod'*
+'modeline' options.txt /*'modeline'*
+'modelineexpr' options.txt /*'modelineexpr'*
+'modelines' options.txt /*'modelines'*
+'modifiable' options.txt /*'modifiable'*
+'modified' options.txt /*'modified'*
+'more' options.txt /*'more'*
+'mouse' options.txt /*'mouse'*
+'mousef' options.txt /*'mousef'*
+'mousefocus' options.txt /*'mousefocus'*
+'mousehide' options.txt /*'mousehide'*
+'mousem' options.txt /*'mousem'*
+'mousemev' options.txt /*'mousemev'*
+'mousemodel' options.txt /*'mousemodel'*
+'mousemoveevent' options.txt /*'mousemoveevent'*
+'mouses' options.txt /*'mouses'*
+'mouseshape' options.txt /*'mouseshape'*
+'mouset' options.txt /*'mouset'*
+'mousetime' options.txt /*'mousetime'*
+'mp' options.txt /*'mp'*
+'mps' options.txt /*'mps'*
+'msm' options.txt /*'msm'*
+'mzq' options.txt /*'mzq'*
+'mzquantum' options.txt /*'mzquantum'*
+'mzschemedll' options.txt /*'mzschemedll'*
+'mzschemegcdll' options.txt /*'mzschemegcdll'*
+'nf' options.txt /*'nf'*
+'noacd' options.txt /*'noacd'*
+'noai' options.txt /*'noai'*
+'noakm' options.txt /*'noakm'*
+'noallowrevins' options.txt /*'noallowrevins'*
+'noaltkeymap' options.txt /*'noaltkeymap'*
+'noanti' options.txt /*'noanti'*
+'noantialias' options.txt /*'noantialias'*
+'noar' options.txt /*'noar'*
+'noarab' options.txt /*'noarab'*
+'noarabic' options.txt /*'noarabic'*
+'noarabicshape' options.txt /*'noarabicshape'*
+'noari' options.txt /*'noari'*
+'noarshape' options.txt /*'noarshape'*
+'noas' todo.txt /*'noas'*
+'noasd' options.txt /*'noasd'*
+'noautochdir' options.txt /*'noautochdir'*
+'noautoindent' options.txt /*'noautoindent'*
+'noautoread' options.txt /*'noautoread'*
+'noautosave' todo.txt /*'noautosave'*
+'noautoshelldir' options.txt /*'noautoshelldir'*
+'noautowrite' options.txt /*'noautowrite'*
+'noautowriteall' options.txt /*'noautowriteall'*
+'noaw' options.txt /*'noaw'*
+'noawa' options.txt /*'noawa'*
+'nobackup' options.txt /*'nobackup'*
+'noballooneval' options.txt /*'noballooneval'*
+'noballoonevalterm' options.txt /*'noballoonevalterm'*
+'nobeval' options.txt /*'nobeval'*
+'nobevalterm' options.txt /*'nobevalterm'*
+'nobin' options.txt /*'nobin'*
+'nobinary' options.txt /*'nobinary'*
+'nobiosk' options.txt /*'nobiosk'*
+'nobioskey' options.txt /*'nobioskey'*
+'nobk' options.txt /*'nobk'*
+'nobl' options.txt /*'nobl'*
+'nobomb' options.txt /*'nobomb'*
+'nobreakindent' options.txt /*'nobreakindent'*
+'nobri' options.txt /*'nobri'*
+'nobuflisted' options.txt /*'nobuflisted'*
+'nocdh' options.txt /*'nocdh'*
+'nocdhome' options.txt /*'nocdhome'*
+'nocf' options.txt /*'nocf'*
+'noci' options.txt /*'noci'*
+'nocin' options.txt /*'nocin'*
+'nocindent' options.txt /*'nocindent'*
+'nocompatible' options.txt /*'nocompatible'*
+'noconfirm' options.txt /*'noconfirm'*
+'noconsk' options.txt /*'noconsk'*
+'noconskey' options.txt /*'noconskey'*
+'nocopyindent' options.txt /*'nocopyindent'*
+'nocp' options.txt /*'nocp'*
+'nocrb' options.txt /*'nocrb'*
+'nocscoperelative' options.txt /*'nocscoperelative'*
+'nocscopetag' options.txt /*'nocscopetag'*
+'nocscopeverbose' options.txt /*'nocscopeverbose'*
+'nocsre' options.txt /*'nocsre'*
+'nocst' options.txt /*'nocst'*
+'nocsverb' options.txt /*'nocsverb'*
+'nocuc' options.txt /*'nocuc'*
+'nocul' options.txt /*'nocul'*
+'nocursorbind' options.txt /*'nocursorbind'*
+'nocursorcolumn' options.txt /*'nocursorcolumn'*
+'nocursorline' options.txt /*'nocursorline'*
+'nodeco' options.txt /*'nodeco'*
+'nodelcombine' options.txt /*'nodelcombine'*
+'nodg' options.txt /*'nodg'*
+'nodiff' options.txt /*'nodiff'*
+'nodigraph' options.txt /*'nodigraph'*
+'noea' options.txt /*'noea'*
+'noeb' options.txt /*'noeb'*
+'noed' options.txt /*'noed'*
+'noedcompatible' options.txt /*'noedcompatible'*
+'noek' options.txt /*'noek'*
+'noemo' options.txt /*'noemo'*
+'noemoji' options.txt /*'noemoji'*
+'noendoffile' options.txt /*'noendoffile'*
+'noendofline' options.txt /*'noendofline'*
+'noeof' options.txt /*'noeof'*
+'noeol' options.txt /*'noeol'*
+'noequalalways' options.txt /*'noequalalways'*
+'noerrorbells' options.txt /*'noerrorbells'*
+'noesckeys' options.txt /*'noesckeys'*
+'noet' options.txt /*'noet'*
+'noex' options.txt /*'noex'*
+'noexpandtab' options.txt /*'noexpandtab'*
+'noexrc' options.txt /*'noexrc'*
+'nofen' options.txt /*'nofen'*
+'nofic' options.txt /*'nofic'*
+'nofileignorecase' options.txt /*'nofileignorecase'*
+'nofixendofline' options.txt /*'nofixendofline'*
+'nofixeol' options.txt /*'nofixeol'*
+'nofk' options.txt /*'nofk'*
+'nofkmap' options.txt /*'nofkmap'*
+'nofoldenable' options.txt /*'nofoldenable'*
+'nofs' options.txt /*'nofs'*
+'nofsync' options.txt /*'nofsync'*
+'nogd' options.txt /*'nogd'*
+'nogdefault' options.txt /*'nogdefault'*
+'noguipty' options.txt /*'noguipty'*
+'nohid' options.txt /*'nohid'*
+'nohidden' options.txt /*'nohidden'*
+'nohk' options.txt /*'nohk'*
+'nohkmap' options.txt /*'nohkmap'*
+'nohkmapp' options.txt /*'nohkmapp'*
+'nohkp' options.txt /*'nohkp'*
+'nohls' options.txt /*'nohls'*
+'nohlsearch' options.txt /*'nohlsearch'*
+'noic' options.txt /*'noic'*
+'noicon' options.txt /*'noicon'*
+'noignorecase' options.txt /*'noignorecase'*
+'noim' options.txt /*'noim'*
+'noimc' options.txt /*'noimc'*
+'noimcmdline' options.txt /*'noimcmdline'*
+'noimd' options.txt /*'noimd'*
+'noimdisable' options.txt /*'noimdisable'*
+'noincsearch' options.txt /*'noincsearch'*
+'noinf' options.txt /*'noinf'*
+'noinfercase' options.txt /*'noinfercase'*
+'noinsertmode' options.txt /*'noinsertmode'*
+'nois' options.txt /*'nois'*
+'nojoinspaces' options.txt /*'nojoinspaces'*
+'nojs' options.txt /*'nojs'*
+'nolangnoremap' options.txt /*'nolangnoremap'*
+'nolangremap' options.txt /*'nolangremap'*
+'nolazyredraw' options.txt /*'nolazyredraw'*
+'nolbr' options.txt /*'nolbr'*
+'nolinebreak' options.txt /*'nolinebreak'*
+'nolisp' options.txt /*'nolisp'*
+'nolist' options.txt /*'nolist'*
+'nolnr' options.txt /*'nolnr'*
+'noloadplugins' options.txt /*'noloadplugins'*
+'nolpl' options.txt /*'nolpl'*
+'nolrm' options.txt /*'nolrm'*
+'nolz' options.txt /*'nolz'*
+'noma' options.txt /*'noma'*
+'nomacatsui' options.txt /*'nomacatsui'*
+'nomagic' options.txt /*'nomagic'*
+'nomh' options.txt /*'nomh'*
+'noml' options.txt /*'noml'*
+'nomle' options.txt /*'nomle'*
+'nomod' options.txt /*'nomod'*
+'nomodeline' options.txt /*'nomodeline'*
+'nomodelineexpr' options.txt /*'nomodelineexpr'*
+'nomodifiable' options.txt /*'nomodifiable'*
+'nomodified' options.txt /*'nomodified'*
+'nomore' options.txt /*'nomore'*
+'nomousef' options.txt /*'nomousef'*
+'nomousefocus' options.txt /*'nomousefocus'*
+'nomousehide' options.txt /*'nomousehide'*
+'nomousemev' options.txt /*'nomousemev'*
+'nomousemoveevent' options.txt /*'nomousemoveevent'*
+'nonu' options.txt /*'nonu'*
+'nonumber' options.txt /*'nonumber'*
+'noodev' options.txt /*'noodev'*
+'noopendevice' options.txt /*'noopendevice'*
+'nopaste' options.txt /*'nopaste'*
+'nopi' options.txt /*'nopi'*
+'nopreserveindent' options.txt /*'nopreserveindent'*
+'nopreviewwindow' options.txt /*'nopreviewwindow'*
+'noprompt' options.txt /*'noprompt'*
+'nopvw' options.txt /*'nopvw'*
+'noreadonly' options.txt /*'noreadonly'*
+'norelativenumber' options.txt /*'norelativenumber'*
+'noremap' options.txt /*'noremap'*
+'norestorescreen' options.txt /*'norestorescreen'*
+'norevins' options.txt /*'norevins'*
+'nori' options.txt /*'nori'*
+'norightleft' options.txt /*'norightleft'*
+'norl' options.txt /*'norl'*
+'nornu' options.txt /*'nornu'*
+'noro' options.txt /*'noro'*
+'nors' options.txt /*'nors'*
+'noru' options.txt /*'noru'*
+'noruler' options.txt /*'noruler'*
+'nosb' options.txt /*'nosb'*
+'nosc' options.txt /*'nosc'*
+'noscb' options.txt /*'noscb'*
+'noscf' options.txt /*'noscf'*
+'noscrollbind' options.txt /*'noscrollbind'*
+'noscrollfocus' options.txt /*'noscrollfocus'*
+'noscs' options.txt /*'noscs'*
+'nosecure' options.txt /*'nosecure'*
+'nosft' options.txt /*'nosft'*
+'noshellslash' options.txt /*'noshellslash'*
+'noshelltemp' options.txt /*'noshelltemp'*
+'noshiftround' options.txt /*'noshiftround'*
+'noshortname' options.txt /*'noshortname'*
+'noshowcmd' options.txt /*'noshowcmd'*
+'noshowfulltag' options.txt /*'noshowfulltag'*
+'noshowmatch' options.txt /*'noshowmatch'*
+'noshowmode' options.txt /*'noshowmode'*
+'nosi' options.txt /*'nosi'*
+'nosm' options.txt /*'nosm'*
+'nosmartcase' options.txt /*'nosmartcase'*
+'nosmartindent' options.txt /*'nosmartindent'*
+'nosmarttab' options.txt /*'nosmarttab'*
+'nosmd' options.txt /*'nosmd'*
+'nosmoothscroll' options.txt /*'nosmoothscroll'*
+'nosms' options.txt /*'nosms'*
+'nosn' options.txt /*'nosn'*
+'nosol' options.txt /*'nosol'*
+'nospell' options.txt /*'nospell'*
+'nosplitbelow' options.txt /*'nosplitbelow'*
+'nosplitright' options.txt /*'nosplitright'*
+'nospr' options.txt /*'nospr'*
+'nosr' options.txt /*'nosr'*
+'nossl' options.txt /*'nossl'*
+'nosta' options.txt /*'nosta'*
+'nostartofline' options.txt /*'nostartofline'*
+'nostmp' options.txt /*'nostmp'*
+'noswapfile' options.txt /*'noswapfile'*
+'noswf' options.txt /*'noswf'*
+'nota' options.txt /*'nota'*
+'notagbsearch' options.txt /*'notagbsearch'*
+'notagrelative' options.txt /*'notagrelative'*
+'notagstack' options.txt /*'notagstack'*
+'notbi' options.txt /*'notbi'*
+'notbidi' options.txt /*'notbidi'*
+'notbs' options.txt /*'notbs'*
+'notermbidi' options.txt /*'notermbidi'*
+'notermguicolors' options.txt /*'notermguicolors'*
+'noterse' options.txt /*'noterse'*
+'notextauto' options.txt /*'notextauto'*
+'notextmode' options.txt /*'notextmode'*
+'notf' options.txt /*'notf'*
+'notgc' options.txt /*'notgc'*
+'notgst' options.txt /*'notgst'*
+'notildeop' options.txt /*'notildeop'*
+'notimeout' options.txt /*'notimeout'*
+'notitle' options.txt /*'notitle'*
+'noto' options.txt /*'noto'*
+'notop' options.txt /*'notop'*
+'notr' options.txt /*'notr'*
+'nottimeout' options.txt /*'nottimeout'*
+'nottybuiltin' options.txt /*'nottybuiltin'*
+'nottyfast' options.txt /*'nottyfast'*
+'notx' options.txt /*'notx'*
+'noudf' options.txt /*'noudf'*
+'noundofile' options.txt /*'noundofile'*
+'novb' options.txt /*'novb'*
+'novice' vi_diff.txt /*'novice'*
+'novisualbell' options.txt /*'novisualbell'*
+'nowa' options.txt /*'nowa'*
+'nowarn' options.txt /*'nowarn'*
+'nowb' options.txt /*'nowb'*
+'noweirdinvert' options.txt /*'noweirdinvert'*
+'nowfh' options.txt /*'nowfh'*
+'nowfw' options.txt /*'nowfw'*
+'nowic' options.txt /*'nowic'*
+'nowildignorecase' options.txt /*'nowildignorecase'*
+'nowildmenu' options.txt /*'nowildmenu'*
+'nowinfixheight' options.txt /*'nowinfixheight'*
+'nowinfixwidth' options.txt /*'nowinfixwidth'*
+'nowiv' options.txt /*'nowiv'*
+'nowmnu' options.txt /*'nowmnu'*
+'nowrap' options.txt /*'nowrap'*
+'nowrapscan' options.txt /*'nowrapscan'*
+'nowrite' options.txt /*'nowrite'*
+'nowriteany' options.txt /*'nowriteany'*
+'nowritebackup' options.txt /*'nowritebackup'*
+'nows' options.txt /*'nows'*
+'noxtermcodes' options.txt /*'noxtermcodes'*
+'nrformats' options.txt /*'nrformats'*
+'nu' options.txt /*'nu'*
+'number' options.txt /*'number'*
+'numberwidth' options.txt /*'numberwidth'*
+'nuw' options.txt /*'nuw'*
+'odev' options.txt /*'odev'*
+'oft' options.txt /*'oft'*
+'ofu' options.txt /*'ofu'*
+'omnifunc' options.txt /*'omnifunc'*
+'op' vi_diff.txt /*'op'*
+'open' vi_diff.txt /*'open'*
+'opendevice' options.txt /*'opendevice'*
+'operatorfunc' options.txt /*'operatorfunc'*
+'opfunc' options.txt /*'opfunc'*
+'optimize' vi_diff.txt /*'optimize'*
+'option' intro.txt /*'option'*
+'osfiletype' options.txt /*'osfiletype'*
+'pa' options.txt /*'pa'*
+'packpath' options.txt /*'packpath'*
+'para' options.txt /*'para'*
+'paragraphs' options.txt /*'paragraphs'*
+'paste' options.txt /*'paste'*
+'pastetoggle' options.txt /*'pastetoggle'*
+'patchexpr' options.txt /*'patchexpr'*
+'patchmode' options.txt /*'patchmode'*
+'path' options.txt /*'path'*
+'pdev' options.txt /*'pdev'*
+'penc' options.txt /*'penc'*
+'perldll' options.txt /*'perldll'*
+'pex' options.txt /*'pex'*
+'pexpr' options.txt /*'pexpr'*
+'pfn' options.txt /*'pfn'*
+'ph' options.txt /*'ph'*
+'pheader' options.txt /*'pheader'*
+'pi' options.txt /*'pi'*
+'pm' options.txt /*'pm'*
+'pmbcs' options.txt /*'pmbcs'*
+'pmbfn' options.txt /*'pmbfn'*
+'popt' options.txt /*'popt'*
+'pp' options.txt /*'pp'*
+'preserveindent' options.txt /*'preserveindent'*
+'previewheight' options.txt /*'previewheight'*
+'previewpopup' options.txt /*'previewpopup'*
+'previewwindow' options.txt /*'previewwindow'*
+'printdevice' options.txt /*'printdevice'*
+'printencoding' options.txt /*'printencoding'*
+'printexpr' options.txt /*'printexpr'*
+'printfont' options.txt /*'printfont'*
+'printheader' options.txt /*'printheader'*
+'printmbcharset' options.txt /*'printmbcharset'*
+'printmbfont' options.txt /*'printmbfont'*
+'printoptions' options.txt /*'printoptions'*
+'prompt' options.txt /*'prompt'*
+'pt' options.txt /*'pt'*
+'pumheight' options.txt /*'pumheight'*
+'pumwidth' options.txt /*'pumwidth'*
+'pvh' options.txt /*'pvh'*
+'pvp' options.txt /*'pvp'*
+'pvw' options.txt /*'pvw'*
+'pw' options.txt /*'pw'*
+'pythondll' options.txt /*'pythondll'*
+'pythonhome' options.txt /*'pythonhome'*
+'pythonthreedll' options.txt /*'pythonthreedll'*
+'pythonthreehome' options.txt /*'pythonthreehome'*
+'pyx' options.txt /*'pyx'*
+'pyxversion' options.txt /*'pyxversion'*
+'qe' options.txt /*'qe'*
+'qftf' options.txt /*'qftf'*
+'quickfixtextfunc' options.txt /*'quickfixtextfunc'*
+'quote motion.txt /*'quote*
+'quoteescape' options.txt /*'quoteescape'*
+'rdt' options.txt /*'rdt'*
+'re' options.txt /*'re'*
+'readonly' options.txt /*'readonly'*
+'redraw' vi_diff.txt /*'redraw'*
+'redrawtime' options.txt /*'redrawtime'*
+'regexpengine' options.txt /*'regexpengine'*
+'relativenumber' options.txt /*'relativenumber'*
+'remap' options.txt /*'remap'*
+'renderoptions' options.txt /*'renderoptions'*
+'report' options.txt /*'report'*
+'restorescreen' options.txt /*'restorescreen'*
+'revins' options.txt /*'revins'*
+'ri' options.txt /*'ri'*
+'rightleft' options.txt /*'rightleft'*
+'rightleftcmd' options.txt /*'rightleftcmd'*
+'rl' options.txt /*'rl'*
+'rlc' options.txt /*'rlc'*
+'rnu' options.txt /*'rnu'*
+'ro' options.txt /*'ro'*
+'rop' options.txt /*'rop'*
+'rs' options.txt /*'rs'*
+'rtp' options.txt /*'rtp'*
+'ru' options.txt /*'ru'*
+'rubydll' options.txt /*'rubydll'*
+'ruf' options.txt /*'ruf'*
+'ruler' options.txt /*'ruler'*
+'rulerformat' options.txt /*'rulerformat'*
+'runtimepath' options.txt /*'runtimepath'*
+'sb' options.txt /*'sb'*
+'sbo' options.txt /*'sbo'*
+'sbr' options.txt /*'sbr'*
+'sc' options.txt /*'sc'*
+'scb' options.txt /*'scb'*
+'scf' options.txt /*'scf'*
+'scl' options.txt /*'scl'*
+'scr' options.txt /*'scr'*
+'scroll' options.txt /*'scroll'*
+'scrollbind' options.txt /*'scrollbind'*
+'scrollfocus' options.txt /*'scrollfocus'*
+'scrolljump' options.txt /*'scrolljump'*
+'scrolloff' options.txt /*'scrolloff'*
+'scrollopt' options.txt /*'scrollopt'*
+'scs' options.txt /*'scs'*
+'sect' options.txt /*'sect'*
+'sections' options.txt /*'sections'*
+'secure' options.txt /*'secure'*
+'sel' options.txt /*'sel'*
+'selection' options.txt /*'selection'*
+'selectmode' options.txt /*'selectmode'*
+'sessionoptions' options.txt /*'sessionoptions'*
+'sft' options.txt /*'sft'*
+'sh' options.txt /*'sh'*
+'shcf' options.txt /*'shcf'*
+'shell' options.txt /*'shell'*
+'shellcmdflag' options.txt /*'shellcmdflag'*
+'shellpipe' options.txt /*'shellpipe'*
+'shellquote' options.txt /*'shellquote'*
+'shellredir' options.txt /*'shellredir'*
+'shellslash' options.txt /*'shellslash'*
+'shelltemp' options.txt /*'shelltemp'*
+'shelltype' options.txt /*'shelltype'*
+'shellxescape' options.txt /*'shellxescape'*
+'shellxquote' options.txt /*'shellxquote'*
+'shiftround' options.txt /*'shiftround'*
+'shiftwidth' options.txt /*'shiftwidth'*
+'shm' options.txt /*'shm'*
+'shortmess' options.txt /*'shortmess'*
+'shortname' options.txt /*'shortname'*
+'showbreak' options.txt /*'showbreak'*
+'showcmd' options.txt /*'showcmd'*
+'showcmdloc' options.txt /*'showcmdloc'*
+'showfulltag' options.txt /*'showfulltag'*
+'showmatch' options.txt /*'showmatch'*
+'showmode' options.txt /*'showmode'*
+'showtabline' options.txt /*'showtabline'*
+'shq' options.txt /*'shq'*
+'si' options.txt /*'si'*
+'sidescroll' options.txt /*'sidescroll'*
+'sidescrolloff' options.txt /*'sidescrolloff'*
+'signcolumn' options.txt /*'signcolumn'*
+'siso' options.txt /*'siso'*
+'sj' options.txt /*'sj'*
+'slm' options.txt /*'slm'*
+'sloc' options.txt /*'sloc'*
+'slow' vi_diff.txt /*'slow'*
+'slowopen' vi_diff.txt /*'slowopen'*
+'sm' options.txt /*'sm'*
+'smartcase' options.txt /*'smartcase'*
+'smartindent' options.txt /*'smartindent'*
+'smarttab' options.txt /*'smarttab'*
+'smc' options.txt /*'smc'*
+'smd' options.txt /*'smd'*
+'smoothscroll' options.txt /*'smoothscroll'*
+'sms' options.txt /*'sms'*
+'sn' options.txt /*'sn'*
+'so' options.txt /*'so'*
+'softtabstop' options.txt /*'softtabstop'*
+'sol' options.txt /*'sol'*
+'sourceany' vi_diff.txt /*'sourceany'*
+'sp' options.txt /*'sp'*
+'spc' options.txt /*'spc'*
+'spell' options.txt /*'spell'*
+'spellcapcheck' options.txt /*'spellcapcheck'*
+'spellfile' options.txt /*'spellfile'*
+'spelllang' options.txt /*'spelllang'*
+'spelloptions' options.txt /*'spelloptions'*
+'spellsuggest' options.txt /*'spellsuggest'*
+'spf' options.txt /*'spf'*
+'spk' options.txt /*'spk'*
+'spl' options.txt /*'spl'*
+'splitbelow' options.txt /*'splitbelow'*
+'splitkeep' options.txt /*'splitkeep'*
+'splitright' options.txt /*'splitright'*
+'spo' options.txt /*'spo'*
+'spr' options.txt /*'spr'*
+'sps' options.txt /*'sps'*
+'sr' options.txt /*'sr'*
+'srr' options.txt /*'srr'*
+'ss' options.txt /*'ss'*
+'ssl' options.txt /*'ssl'*
+'ssop' options.txt /*'ssop'*
+'st' options.txt /*'st'*
+'sta' options.txt /*'sta'*
+'stal' options.txt /*'stal'*
+'startofline' options.txt /*'startofline'*
+'statusline' options.txt /*'statusline'*
+'stl' options.txt /*'stl'*
+'stmp' options.txt /*'stmp'*
+'sts' options.txt /*'sts'*
+'su' options.txt /*'su'*
+'sua' options.txt /*'sua'*
+'suffixes' options.txt /*'suffixes'*
+'suffixesadd' options.txt /*'suffixesadd'*
+'sw' options.txt /*'sw'*
+'swapfile' options.txt /*'swapfile'*
+'swapsync' options.txt /*'swapsync'*
+'swb' options.txt /*'swb'*
+'swf' options.txt /*'swf'*
+'switchbuf' options.txt /*'switchbuf'*
+'sws' options.txt /*'sws'*
+'sxe' options.txt /*'sxe'*
+'sxq' options.txt /*'sxq'*
+'syn' options.txt /*'syn'*
+'synmaxcol' options.txt /*'synmaxcol'*
+'syntax' options.txt /*'syntax'*
+'t_#2' term.txt /*'t_#2'*
+'t_#4' term.txt /*'t_#4'*
+'t_%1' term.txt /*'t_%1'*
+'t_%i' term.txt /*'t_%i'*
+'t_&8' term.txt /*'t_&8'*
+'t_8b' term.txt /*'t_8b'*
+'t_8f' term.txt /*'t_8f'*
+'t_8u' term.txt /*'t_8u'*
+'t_@7' term.txt /*'t_@7'*
+'t_AB' term.txt /*'t_AB'*
+'t_AF' term.txt /*'t_AF'*
+'t_AL' term.txt /*'t_AL'*
+'t_AU' term.txt /*'t_AU'*
+'t_BD' term.txt /*'t_BD'*
+'t_BE' term.txt /*'t_BE'*
+'t_CS' term.txt /*'t_CS'*
+'t_CV' term.txt /*'t_CV'*
+'t_Ce' term.txt /*'t_Ce'*
+'t_Co' term.txt /*'t_Co'*
+'t_Cs' term.txt /*'t_Cs'*
+'t_DL' term.txt /*'t_DL'*
+'t_Ds' term.txt /*'t_Ds'*
+'t_EC' term.txt /*'t_EC'*
+'t_EI' term.txt /*'t_EI'*
+'t_F1' term.txt /*'t_F1'*
+'t_F2' term.txt /*'t_F2'*
+'t_F3' term.txt /*'t_F3'*
+'t_F4' term.txt /*'t_F4'*
+'t_F5' term.txt /*'t_F5'*
+'t_F6' term.txt /*'t_F6'*
+'t_F7' term.txt /*'t_F7'*
+'t_F8' term.txt /*'t_F8'*
+'t_F9' term.txt /*'t_F9'*
+'t_GP' term.txt /*'t_GP'*
+'t_IE' term.txt /*'t_IE'*
+'t_IS' term.txt /*'t_IS'*
+'t_K1' term.txt /*'t_K1'*
+'t_K3' term.txt /*'t_K3'*
+'t_K4' term.txt /*'t_K4'*
+'t_K5' term.txt /*'t_K5'*
+'t_K6' term.txt /*'t_K6'*
+'t_K7' term.txt /*'t_K7'*
+'t_K8' term.txt /*'t_K8'*
+'t_K9' term.txt /*'t_K9'*
+'t_KA' term.txt /*'t_KA'*
+'t_KB' term.txt /*'t_KB'*
+'t_KC' term.txt /*'t_KC'*
+'t_KD' term.txt /*'t_KD'*
+'t_KE' term.txt /*'t_KE'*
+'t_KF' term.txt /*'t_KF'*
+'t_KG' term.txt /*'t_KG'*
+'t_KH' term.txt /*'t_KH'*
+'t_KI' term.txt /*'t_KI'*
+'t_KJ' term.txt /*'t_KJ'*
+'t_KK' term.txt /*'t_KK'*
+'t_KL' term.txt /*'t_KL'*
+'t_PE' term.txt /*'t_PE'*
+'t_PS' term.txt /*'t_PS'*
+'t_RB' term.txt /*'t_RB'*
+'t_RC' term.txt /*'t_RC'*
+'t_RF' term.txt /*'t_RF'*
+'t_RI' term.txt /*'t_RI'*
+'t_RK' term.txt /*'t_RK'*
+'t_RS' term.txt /*'t_RS'*
+'t_RT' term.txt /*'t_RT'*
+'t_RV' term.txt /*'t_RV'*
+'t_Ri' term.txt /*'t_Ri'*
+'t_SC' term.txt /*'t_SC'*
+'t_SH' term.txt /*'t_SH'*
+'t_SI' term.txt /*'t_SI'*
+'t_SR' term.txt /*'t_SR'*
+'t_ST' term.txt /*'t_ST'*
+'t_Sb' term.txt /*'t_Sb'*
+'t_Sf' term.txt /*'t_Sf'*
+'t_Si' term.txt /*'t_Si'*
+'t_TE' term.txt /*'t_TE'*
+'t_TI' term.txt /*'t_TI'*
+'t_Te' term.txt /*'t_Te'*
+'t_Ts' term.txt /*'t_Ts'*
+'t_Us' term.txt /*'t_Us'*
+'t_VS' term.txt /*'t_VS'*
+'t_WP' term.txt /*'t_WP'*
+'t_WS' term.txt /*'t_WS'*
+'t_XM' term.txt /*'t_XM'*
+'t_ZH' term.txt /*'t_ZH'*
+'t_ZR' term.txt /*'t_ZR'*
+'t_al' term.txt /*'t_al'*
+'t_bc' term.txt /*'t_bc'*
+'t_cd' term.txt /*'t_cd'*
+'t_ce' term.txt /*'t_ce'*
+'t_cl' term.txt /*'t_cl'*
+'t_cm' term.txt /*'t_cm'*
+'t_cs' term.txt /*'t_cs'*
+'t_da' term.txt /*'t_da'*
+'t_db' term.txt /*'t_db'*
+'t_dl' term.txt /*'t_dl'*
+'t_ds' term.txt /*'t_ds'*
+'t_fd' term.txt /*'t_fd'*
+'t_fe' term.txt /*'t_fe'*
+'t_fs' term.txt /*'t_fs'*
+'t_k1' term.txt /*'t_k1'*
+'t_k2' term.txt /*'t_k2'*
+'t_k3' term.txt /*'t_k3'*
+'t_k4' term.txt /*'t_k4'*
+'t_k5' term.txt /*'t_k5'*
+'t_k6' term.txt /*'t_k6'*
+'t_k7' term.txt /*'t_k7'*
+'t_k8' term.txt /*'t_k8'*
+'t_k9' term.txt /*'t_k9'*
+'t_k;' term.txt /*'t_k;'*
+'t_kB' term.txt /*'t_kB'*
+'t_kD' term.txt /*'t_kD'*
+'t_kI' term.txt /*'t_kI'*
+'t_kN' term.txt /*'t_kN'*
+'t_kP' term.txt /*'t_kP'*
+'t_kb' term.txt /*'t_kb'*
+'t_kd' term.txt /*'t_kd'*
+'t_ke' term.txt /*'t_ke'*
+'t_kh' term.txt /*'t_kh'*
+'t_kl' term.txt /*'t_kl'*
+'t_kr' term.txt /*'t_kr'*
+'t_ks' term.txt /*'t_ks'*
+'t_ku' term.txt /*'t_ku'*
+'t_le' term.txt /*'t_le'*
+'t_mb' term.txt /*'t_mb'*
+'t_md' term.txt /*'t_md'*
+'t_me' term.txt /*'t_me'*
+'t_mr' term.txt /*'t_mr'*
+'t_ms' term.txt /*'t_ms'*
+'t_nd' term.txt /*'t_nd'*
+'t_op' term.txt /*'t_op'*
+'t_se' term.txt /*'t_se'*
+'t_so' term.txt /*'t_so'*
+'t_sr' term.txt /*'t_sr'*
+'t_star7' term.txt /*'t_star7'*
+'t_te' term.txt /*'t_te'*
+'t_ti' term.txt /*'t_ti'*
+'t_ts' term.txt /*'t_ts'*
+'t_u7' term.txt /*'t_u7'*
+'t_ue' term.txt /*'t_ue'*
+'t_us' term.txt /*'t_us'*
+'t_ut' term.txt /*'t_ut'*
+'t_vb' term.txt /*'t_vb'*
+'t_ve' term.txt /*'t_ve'*
+'t_vi' term.txt /*'t_vi'*
+'t_vs' term.txt /*'t_vs'*
+'t_xn' term.txt /*'t_xn'*
+'t_xs' term.txt /*'t_xs'*
+'ta' options.txt /*'ta'*
+'tabline' options.txt /*'tabline'*
+'tabpagemax' options.txt /*'tabpagemax'*
+'tabstop' options.txt /*'tabstop'*
+'tag' options.txt /*'tag'*
+'tagbsearch' options.txt /*'tagbsearch'*
+'tagcase' options.txt /*'tagcase'*
+'tagfunc' options.txt /*'tagfunc'*
+'taglength' options.txt /*'taglength'*
+'tagrelative' options.txt /*'tagrelative'*
+'tags' options.txt /*'tags'*
+'tagstack' options.txt /*'tagstack'*
+'tal' options.txt /*'tal'*
+'tb' options.txt /*'tb'*
+'tbi' options.txt /*'tbi'*
+'tbidi' options.txt /*'tbidi'*
+'tbis' options.txt /*'tbis'*
+'tbs' options.txt /*'tbs'*
+'tc' options.txt /*'tc'*
+'tcldll' options.txt /*'tcldll'*
+'tenc' options.txt /*'tenc'*
+'term' options.txt /*'term'*
+'termbidi' options.txt /*'termbidi'*
+'termencoding' options.txt /*'termencoding'*
+'termguicolors' options.txt /*'termguicolors'*
+'termwinkey' options.txt /*'termwinkey'*
+'termwinscroll' options.txt /*'termwinscroll'*
+'termwinsize' options.txt /*'termwinsize'*
+'termwintype' options.txt /*'termwintype'*
+'terse' options.txt /*'terse'*
+'textauto' options.txt /*'textauto'*
+'textmode' options.txt /*'textmode'*
+'textwidth' options.txt /*'textwidth'*
+'tf' options.txt /*'tf'*
+'tfu' options.txt /*'tfu'*
+'tgc' options.txt /*'tgc'*
+'tgst' options.txt /*'tgst'*
+'thesaurus' options.txt /*'thesaurus'*
+'thesaurusfunc' options.txt /*'thesaurusfunc'*
+'tildeop' options.txt /*'tildeop'*
+'timeout' options.txt /*'timeout'*
+'timeoutlen' options.txt /*'timeoutlen'*
+'title' options.txt /*'title'*
+'titlelen' options.txt /*'titlelen'*
+'titleold' options.txt /*'titleold'*
+'titlestring' options.txt /*'titlestring'*
+'tl' options.txt /*'tl'*
+'tm' options.txt /*'tm'*
+'to' options.txt /*'to'*
+'toolbar' options.txt /*'toolbar'*
+'toolbariconsize' options.txt /*'toolbariconsize'*
+'top' options.txt /*'top'*
+'tpm' options.txt /*'tpm'*
+'tr' options.txt /*'tr'*
+'ts' options.txt /*'ts'*
+'tsl' options.txt /*'tsl'*
+'tsr' options.txt /*'tsr'*
+'tsrfu' options.txt /*'tsrfu'*
+'ttimeout' options.txt /*'ttimeout'*
+'ttimeoutlen' options.txt /*'ttimeoutlen'*
+'ttm' options.txt /*'ttm'*
+'tty' options.txt /*'tty'*
+'ttybuiltin' options.txt /*'ttybuiltin'*
+'ttyfast' options.txt /*'ttyfast'*
+'ttym' options.txt /*'ttym'*
+'ttymouse' options.txt /*'ttymouse'*
+'ttyscroll' options.txt /*'ttyscroll'*
+'ttytype' options.txt /*'ttytype'*
+'tw' options.txt /*'tw'*
+'twk' options.txt /*'twk'*
+'tws' options.txt /*'tws'*
+'twsl' options.txt /*'twsl'*
+'twt' options.txt /*'twt'*
+'tx' options.txt /*'tx'*
+'uc' options.txt /*'uc'*
+'udf' options.txt /*'udf'*
+'udir' options.txt /*'udir'*
+'ul' options.txt /*'ul'*
+'undodir' options.txt /*'undodir'*
+'undofile' options.txt /*'undofile'*
+'undolevels' options.txt /*'undolevels'*
+'undoreload' options.txt /*'undoreload'*
+'updatecount' options.txt /*'updatecount'*
+'updatetime' options.txt /*'updatetime'*
+'ur' options.txt /*'ur'*
+'ut' options.txt /*'ut'*
+'varsofttabstop' options.txt /*'varsofttabstop'*
+'vartabstop' options.txt /*'vartabstop'*
+'vb' options.txt /*'vb'*
+'vbs' options.txt /*'vbs'*
+'vdir' options.txt /*'vdir'*
+'ve' options.txt /*'ve'*
+'verbose' options.txt /*'verbose'*
+'verbosefile' options.txt /*'verbosefile'*
+'vfile' options.txt /*'vfile'*
+'vi' options.txt /*'vi'*
+'viewdir' options.txt /*'viewdir'*
+'viewoptions' options.txt /*'viewoptions'*
+'vif' options.txt /*'vif'*
+'viminfo' options.txt /*'viminfo'*
+'viminfofile' options.txt /*'viminfofile'*
+'virtualedit' options.txt /*'virtualedit'*
+'visualbell' options.txt /*'visualbell'*
+'vop' options.txt /*'vop'*
+'vsts' options.txt /*'vsts'*
+'vts' options.txt /*'vts'*
+'w1200' vi_diff.txt /*'w1200'*
+'w300' vi_diff.txt /*'w300'*
+'w9600' vi_diff.txt /*'w9600'*
+'wa' options.txt /*'wa'*
+'wak' options.txt /*'wak'*
+'warn' options.txt /*'warn'*
+'wb' options.txt /*'wb'*
+'wc' options.txt /*'wc'*
+'wcm' options.txt /*'wcm'*
+'wcr' options.txt /*'wcr'*
+'wd' options.txt /*'wd'*
+'weirdinvert' options.txt /*'weirdinvert'*
+'wfh' options.txt /*'wfh'*
+'wfw' options.txt /*'wfw'*
+'wh' options.txt /*'wh'*
+'whichwrap' options.txt /*'whichwrap'*
+'wi' options.txt /*'wi'*
+'wic' options.txt /*'wic'*
+'wig' options.txt /*'wig'*
+'wildchar' options.txt /*'wildchar'*
+'wildcharm' options.txt /*'wildcharm'*
+'wildignore' options.txt /*'wildignore'*
+'wildignorecase' options.txt /*'wildignorecase'*
+'wildmenu' options.txt /*'wildmenu'*
+'wildmode' options.txt /*'wildmode'*
+'wildoptions' options.txt /*'wildoptions'*
+'wim' options.txt /*'wim'*
+'winaltkeys' options.txt /*'winaltkeys'*
+'wincolor' options.txt /*'wincolor'*
+'window' options.txt /*'window'*
+'winfixheight' options.txt /*'winfixheight'*
+'winfixwidth' options.txt /*'winfixwidth'*
+'winheight' options.txt /*'winheight'*
+'winminheight' options.txt /*'winminheight'*
+'winminwidth' options.txt /*'winminwidth'*
+'winptydll' options.txt /*'winptydll'*
+'winwidth' options.txt /*'winwidth'*
+'wiv' options.txt /*'wiv'*
+'wiw' options.txt /*'wiw'*
+'wm' options.txt /*'wm'*
+'wmh' options.txt /*'wmh'*
+'wmnu' options.txt /*'wmnu'*
+'wmw' options.txt /*'wmw'*
+'wop' options.txt /*'wop'*
+'wrap' options.txt /*'wrap'*
+'wrapmargin' options.txt /*'wrapmargin'*
+'wrapscan' options.txt /*'wrapscan'*
+'write' options.txt /*'write'*
+'writeany' options.txt /*'writeany'*
+'writebackup' options.txt /*'writebackup'*
+'writedelay' options.txt /*'writedelay'*
+'ws' options.txt /*'ws'*
+'ww' options.txt /*'ww'*
+'xtermcodes' options.txt /*'xtermcodes'*
+'{ motion.txt /*'{*
+'} motion.txt /*'}*
+( motion.txt /*(*
+) motion.txt /*)*
++ motion.txt /*+*
+++bad editing.txt /*++bad*
+++bin editing.txt /*++bin*
+++builtin_terms various.txt /*++builtin_terms*
+++edit editing.txt /*++edit*
+++enc editing.txt /*++enc*
+++ff editing.txt /*++ff*
+++nobin editing.txt /*++nobin*
+++opt editing.txt /*++opt*
++ARP various.txt /*+ARP*
++GUI_Athena various.txt /*+GUI_Athena*
++GUI_GTK various.txt /*+GUI_GTK*
++GUI_Motif various.txt /*+GUI_Motif*
++GUI_Photon various.txt /*+GUI_Photon*
++GUI_neXtaw various.txt /*+GUI_neXtaw*
++X11 various.txt /*+X11*
++acl various.txt /*+acl*
++arabic various.txt /*+arabic*
++autochdir various.txt /*+autochdir*
++autocmd various.txt /*+autocmd*
++autoservername various.txt /*+autoservername*
++balloon_eval various.txt /*+balloon_eval*
++balloon_eval_term various.txt /*+balloon_eval_term*
++browse various.txt /*+browse*
++byte_offset various.txt /*+byte_offset*
++channel various.txt /*+channel*
++cindent various.txt /*+cindent*
++clientserver various.txt /*+clientserver*
++clipboard various.txt /*+clipboard*
++clipboard_working various.txt /*+clipboard_working*
++cmd editing.txt /*+cmd*
++cmdline_compl various.txt /*+cmdline_compl*
++cmdline_hist various.txt /*+cmdline_hist*
++cmdline_info various.txt /*+cmdline_info*
++cmdwin various.txt /*+cmdwin*
++comments various.txt /*+comments*
++conceal various.txt /*+conceal*
++cryptv various.txt /*+cryptv*
++cscope various.txt /*+cscope*
++cursorbind various.txt /*+cursorbind*
++cursorshape various.txt /*+cursorshape*
++debug various.txt /*+debug*
++dialog_con various.txt /*+dialog_con*
++dialog_con_gui various.txt /*+dialog_con_gui*
++dialog_gui various.txt /*+dialog_gui*
++diff various.txt /*+diff*
++digraphs various.txt /*+digraphs*
++directx various.txt /*+directx*
++dnd various.txt /*+dnd*
++emacs_tags various.txt /*+emacs_tags*
++eval various.txt /*+eval*
++ex_extra various.txt /*+ex_extra*
++extra_search various.txt /*+extra_search*
++farsi various.txt /*+farsi*
++feature-list various.txt /*+feature-list*
++file_in_path various.txt /*+file_in_path*
++find_in_path various.txt /*+find_in_path*
++float various.txt /*+float*
++folding various.txt /*+folding*
++footer various.txt /*+footer*
++fork various.txt /*+fork*
++gettext various.txt /*+gettext*
++hangul_input various.txt /*+hangul_input*
++iconv various.txt /*+iconv*
++iconv/dyn various.txt /*+iconv\/dyn*
++insert_expand various.txt /*+insert_expand*
++ipv6 various.txt /*+ipv6*
++job various.txt /*+job*
++jumplist various.txt /*+jumplist*
++keymap various.txt /*+keymap*
++lambda various.txt /*+lambda*
++langmap various.txt /*+langmap*
++libcall various.txt /*+libcall*
++linebreak various.txt /*+linebreak*
++lispindent various.txt /*+lispindent*
++listcmds various.txt /*+listcmds*
++localmap various.txt /*+localmap*
++lua various.txt /*+lua*
++lua/dyn various.txt /*+lua\/dyn*
++menu various.txt /*+menu*
++mksession various.txt /*+mksession*
++modify_fname various.txt /*+modify_fname*
++mouse various.txt /*+mouse*
++mouse_dec various.txt /*+mouse_dec*
++mouse_gpm various.txt /*+mouse_gpm*
++mouse_gpm/dyn various.txt /*+mouse_gpm\/dyn*
++mouse_jsbterm various.txt /*+mouse_jsbterm*
++mouse_netterm various.txt /*+mouse_netterm*
++mouse_pterm various.txt /*+mouse_pterm*
++mouse_sgr various.txt /*+mouse_sgr*
++mouse_sysmouse various.txt /*+mouse_sysmouse*
++mouse_urxvt various.txt /*+mouse_urxvt*
++mouse_xterm various.txt /*+mouse_xterm*
++mouseshape various.txt /*+mouseshape*
++multi_byte various.txt /*+multi_byte*
++multi_byte_ime various.txt /*+multi_byte_ime*
++multi_lang various.txt /*+multi_lang*
++mzscheme various.txt /*+mzscheme*
++mzscheme/dyn various.txt /*+mzscheme\/dyn*
++netbeans_intg various.txt /*+netbeans_intg*
++num64 various.txt /*+num64*
++ole various.txt /*+ole*
++packages various.txt /*+packages*
++path_extra various.txt /*+path_extra*
++perl various.txt /*+perl*
++perl/dyn various.txt /*+perl\/dyn*
++persistent_undo various.txt /*+persistent_undo*
++popupwin various.txt /*+popupwin*
++postscript various.txt /*+postscript*
++printer various.txt /*+printer*
++profile various.txt /*+profile*
++python various.txt /*+python*
++python/dyn various.txt /*+python\/dyn*
++python3 various.txt /*+python3*
++python3/dyn various.txt /*+python3\/dyn*
++quickfix various.txt /*+quickfix*
++reltime various.txt /*+reltime*
++rightleft various.txt /*+rightleft*
++ruby various.txt /*+ruby*
++ruby/dyn various.txt /*+ruby\/dyn*
++scrollbind various.txt /*+scrollbind*
++signs various.txt /*+signs*
++smartindent various.txt /*+smartindent*
++sodium various.txt /*+sodium*
++sound various.txt /*+sound*
++spell various.txt /*+spell*
++startuptime various.txt /*+startuptime*
++statusline various.txt /*+statusline*
++sun_workshop various.txt /*+sun_workshop*
++syntax various.txt /*+syntax*
++system() various.txt /*+system()*
++tag_any_white various.txt /*+tag_any_white*
++tag_binary various.txt /*+tag_binary*
++tag_old_static various.txt /*+tag_old_static*
++tcl various.txt /*+tcl*
++tcl/dyn various.txt /*+tcl\/dyn*
++termguicolors various.txt /*+termguicolors*
++terminal various.txt /*+terminal*
++terminfo various.txt /*+terminfo*
++termresponse various.txt /*+termresponse*
++textobjects various.txt /*+textobjects*
++textprop various.txt /*+textprop*
++tgetent various.txt /*+tgetent*
++timers various.txt /*+timers*
++title various.txt /*+title*
++toolbar various.txt /*+toolbar*
++unix builtin.txt /*+unix*
++user_commands various.txt /*+user_commands*
++vartabs various.txt /*+vartabs*
++vertsplit various.txt /*+vertsplit*
++vim9script various.txt /*+vim9script*
++viminfo various.txt /*+viminfo*
++virtualedit various.txt /*+virtualedit*
++visual various.txt /*+visual*
++visualextra various.txt /*+visualextra*
++vreplace various.txt /*+vreplace*
++vtp various.txt /*+vtp*
++wildignore various.txt /*+wildignore*
++wildmenu various.txt /*+wildmenu*
++windows various.txt /*+windows*
++writebackup various.txt /*+writebackup*
++xfontset various.txt /*+xfontset*
++xim various.txt /*+xim*
++xpm various.txt /*+xpm*
++xpm_w32 various.txt /*+xpm_w32*
++xsmp various.txt /*+xsmp*
++xsmp_interact various.txt /*+xsmp_interact*
++xterm_clipboard various.txt /*+xterm_clipboard*
++xterm_save various.txt /*+xterm_save*
+, motion.txt /*,*
+- motion.txt /*-*
+-+ starting.txt /*-+*
+-+/ starting.txt /*-+\/*
+-+c starting.txt /*-+c*
+-+reverse gui_x11.txt /*-+reverse*
+-+rv gui_x11.txt /*-+rv*
+-- starting.txt /*--*
+--- starting.txt /*---*
+--clean starting.txt /*--clean*
+--cmd starting.txt /*--cmd*
+--echo-wid starting.txt /*--echo-wid*
+--gui-dialog-file starting.txt /*--gui-dialog-file*
+--help starting.txt /*--help*
+--literal starting.txt /*--literal*
+--log starting.txt /*--log*
+--nofork starting.txt /*--nofork*
+--noplugin starting.txt /*--noplugin*
+--not-a-term starting.txt /*--not-a-term*
+--remote remote.txt /*--remote*
+--remote-expr remote.txt /*--remote-expr*
+--remote-send remote.txt /*--remote-send*
+--remote-silent remote.txt /*--remote-silent*
+--remote-tab remote.txt /*--remote-tab*
+--remote-tab-silent remote.txt /*--remote-tab-silent*
+--remote-tab-wait remote.txt /*--remote-tab-wait*
+--remote-tab-wait-silent remote.txt /*--remote-tab-wait-silent*
+--remote-wait remote.txt /*--remote-wait*
+--remote-wait-silent remote.txt /*--remote-wait-silent*
+--role starting.txt /*--role*
+--serverlist remote.txt /*--serverlist*
+--servername remote.txt /*--servername*
+--socketid starting.txt /*--socketid*
+--startuptime starting.txt /*--startuptime*
+--ttyfail starting.txt /*--ttyfail*
+--version starting.txt /*--version*
+--windowid starting.txt /*--windowid*
+-> eval.txt /*->*
+-? starting.txt /*-?*
+-A starting.txt /*-A*
+-C starting.txt /*-C*
+-D starting.txt /*-D*
+-E starting.txt /*-E*
+-F starting.txt /*-F*
+-H starting.txt /*-H*
+-L starting.txt /*-L*
+-M starting.txt /*-M*
+-N starting.txt /*-N*
+-O starting.txt /*-O*
+-P starting.txt /*-P*
+-R starting.txt /*-R*
+-S starting.txt /*-S*
+-T starting.txt /*-T*
+-U starting.txt /*-U*
+-V starting.txt /*-V*
+-W starting.txt /*-W*
+-X starting.txt /*-X*
+-Z starting.txt /*-Z*
+-b starting.txt /*-b*
+-background gui_x11.txt /*-background*
+-bg gui_x11.txt /*-bg*
+-boldfont gui_x11.txt /*-boldfont*
+-borderwidth gui_x11.txt /*-borderwidth*
+-bw gui_x11.txt /*-bw*
+-c starting.txt /*-c*
+-d starting.txt /*-d*
+-dev starting.txt /*-dev*
+-display gui_x11.txt /*-display*
+-e starting.txt /*-e*
+-f starting.txt /*-f*
+-fg gui_x11.txt /*-fg*
+-file starting.txt /*-file*
+-fn gui_x11.txt /*-fn*
+-font gui_x11.txt /*-font*
+-foreground gui_x11.txt /*-foreground*
+-g starting.txt /*-g*
+-geom gui_x11.txt /*-geom*
+-geometry gui_x11.txt /*-geometry*
+-geometry-example gui_x11.txt /*-geometry-example*
+-gui gui_x11.txt /*-gui*
+-h starting.txt /*-h*
+-i starting.txt /*-i*
+-iconic gui_x11.txt /*-iconic*
+-italicfont gui_x11.txt /*-italicfont*
+-l starting.txt /*-l*
+-m starting.txt /*-m*
+-menufont gui_x11.txt /*-menufont*
+-menufontset gui_x11.txt /*-menufontset*
+-menuheight gui_x11.txt /*-menuheight*
+-mf gui_x11.txt /*-mf*
+-mh gui_x11.txt /*-mh*
+-n starting.txt /*-n*
+-nb starting.txt /*-nb*
+-o starting.txt /*-o*
+-p starting.txt /*-p*
+-q starting.txt /*-q*
+-qf starting.txt /*-qf*
+-r starting.txt /*-r*
+-register if_ole.txt /*-register*
+-reverse gui_x11.txt /*-reverse*
+-rv gui_x11.txt /*-rv*
+-s starting.txt /*-s*
+-s-ex starting.txt /*-s-ex*
+-scrollbarwidth gui_x11.txt /*-scrollbarwidth*
+-silent if_ole.txt /*-silent*
+-sw gui_x11.txt /*-sw*
+-t starting.txt /*-t*
+-tag starting.txt /*-tag*
+-u starting.txt /*-u*
+-ul gui_x11.txt /*-ul*
+-unregister if_ole.txt /*-unregister*
+-v starting.txt /*-v*
+-vim starting.txt /*-vim*
+-w starting.txt /*-w*
+-w_nr starting.txt /*-w_nr*
+-x starting.txt /*-x*
+-xrm gui_x11.txt /*-xrm*
+-y starting.txt /*-y*
+. repeat.txt /*.*
+... userfunc.txt /*...*
+.Xdefaults gui_x11.txt /*.Xdefaults*
+.aff spell.txt /*.aff*
+.dic spell.txt /*.dic*
+.exrc starting.txt /*.exrc*
+.gvimrc gui.txt /*.gvimrc*
+.netrwbook pi_netrw.txt /*.netrwbook*
+.netrwhist pi_netrw.txt /*.netrwhist*
+.vimrc starting.txt /*.vimrc*
+/ pattern.txt /*\/*
+/$ pattern.txt /*\/$*
+/. pattern.txt /*\/.*
+// version7.txt /*\/\/*
+//; pattern.txt /*\/\/;*
+/<CR> pattern.txt /*\/<CR>*
+/[[. pattern.txt /*\/[[.*
+/[[= pattern.txt /*\/[[=*
+/[\n] pattern.txt /*\/[\\n]*
+/[] pattern.txt /*\/[]*
+/\ pattern.txt /*\/\\*
+/\$ pattern.txt /*\/\\$*
+/\%# pattern.txt /*\/\\%#*
+/\%#= pattern.txt /*\/\\%#=*
+/\%$ pattern.txt /*\/\\%$*
+/\%'m pattern.txt /*\/\\%'m*
+/\%( pattern.txt /*\/\\%(*
+/\%(\) pattern.txt /*\/\\%(\\)*
+/\%<'m pattern.txt /*\/\\%<'m*
+/\%<c pattern.txt /*\/\\%<c*
+/\%<l pattern.txt /*\/\\%<l*
+/\%<v pattern.txt /*\/\\%<v*
+/\%>'m pattern.txt /*\/\\%>'m*
+/\%>c pattern.txt /*\/\\%>c*
+/\%>l pattern.txt /*\/\\%>l*
+/\%>v pattern.txt /*\/\\%>v*
+/\%C pattern.txt /*\/\\%C*
+/\%U pattern.txt /*\/\\%U*
+/\%V pattern.txt /*\/\\%V*
+/\%[] pattern.txt /*\/\\%[]*
+/\%^ pattern.txt /*\/\\%^*
+/\%c pattern.txt /*\/\\%c*
+/\%d pattern.txt /*\/\\%d*
+/\%l pattern.txt /*\/\\%l*
+/\%o pattern.txt /*\/\\%o*
+/\%u pattern.txt /*\/\\%u*
+/\%v pattern.txt /*\/\\%v*
+/\%x pattern.txt /*\/\\%x*
+/\& pattern.txt /*\/\\&*
+/\( pattern.txt /*\/\\(*
+/\(\) pattern.txt /*\/\\(\\)*
+/\) pattern.txt /*\/\\)*
+/\+ pattern.txt /*\/\\+*
+/\. pattern.txt /*\/\\.*
+/\1 pattern.txt /*\/\\1*
+/\2 pattern.txt /*\/\\2*
+/\3 pattern.txt /*\/\\3*
+/\9 pattern.txt /*\/\\9*
+/\< pattern.txt /*\/\\<*
+/\= pattern.txt /*\/\\=*
+/\> pattern.txt /*\/\\>*
+/\? pattern.txt /*\/\\?*
+/\@! pattern.txt /*\/\\@!*
+/\@<! pattern.txt /*\/\\@<!*
+/\@<= pattern.txt /*\/\\@<=*
+/\@= pattern.txt /*\/\\@=*
+/\@> pattern.txt /*\/\\@>*
+/\A pattern.txt /*\/\\A*
+/\C pattern.txt /*\/\\C*
+/\D pattern.txt /*\/\\D*
+/\F pattern.txt /*\/\\F*
+/\H pattern.txt /*\/\\H*
+/\I pattern.txt /*\/\\I*
+/\K pattern.txt /*\/\\K*
+/\L pattern.txt /*\/\\L*
+/\M pattern.txt /*\/\\M*
+/\O pattern.txt /*\/\\O*
+/\P pattern.txt /*\/\\P*
+/\S pattern.txt /*\/\\S*
+/\U pattern.txt /*\/\\U*
+/\V pattern.txt /*\/\\V*
+/\W pattern.txt /*\/\\W*
+/\X pattern.txt /*\/\\X*
+/\Z pattern.txt /*\/\\Z*
+/\[] pattern.txt /*\/\\[]*
+/\\ pattern.txt /*\/\\\\*
+/\] pattern.txt /*\/\\]*
+/\^ pattern.txt /*\/\\^*
+/\_ pattern.txt /*\/\\_*
+/\_$ pattern.txt /*\/\\_$*
+/\_. pattern.txt /*\/\\_.*
+/\_A pattern.txt /*\/\\_A*
+/\_D pattern.txt /*\/\\_D*
+/\_F pattern.txt /*\/\\_F*
+/\_H pattern.txt /*\/\\_H*
+/\_I pattern.txt /*\/\\_I*
+/\_K pattern.txt /*\/\\_K*
+/\_L pattern.txt /*\/\\_L*
+/\_O pattern.txt /*\/\\_O*
+/\_P pattern.txt /*\/\\_P*
+/\_S pattern.txt /*\/\\_S*
+/\_U pattern.txt /*\/\\_U*
+/\_W pattern.txt /*\/\\_W*
+/\_X pattern.txt /*\/\\_X*
+/\_[] pattern.txt /*\/\\_[]*
+/\_^ pattern.txt /*\/\\_^*
+/\_a pattern.txt /*\/\\_a*
+/\_d pattern.txt /*\/\\_d*
+/\_f pattern.txt /*\/\\_f*
+/\_h pattern.txt /*\/\\_h*
+/\_i pattern.txt /*\/\\_i*
+/\_k pattern.txt /*\/\\_k*
+/\_l pattern.txt /*\/\\_l*
+/\_o pattern.txt /*\/\\_o*
+/\_p pattern.txt /*\/\\_p*
+/\_s pattern.txt /*\/\\_s*
+/\_u pattern.txt /*\/\\_u*
+/\_w pattern.txt /*\/\\_w*
+/\_x pattern.txt /*\/\\_x*
+/\a pattern.txt /*\/\\a*
+/\b pattern.txt /*\/\\b*
+/\bar pattern.txt /*\/\\bar*
+/\c pattern.txt /*\/\\c*
+/\d pattern.txt /*\/\\d*
+/\e pattern.txt /*\/\\e*
+/\f pattern.txt /*\/\\f*
+/\h pattern.txt /*\/\\h*
+/\i pattern.txt /*\/\\i*
+/\k pattern.txt /*\/\\k*
+/\l pattern.txt /*\/\\l*
+/\m pattern.txt /*\/\\m*
+/\n pattern.txt /*\/\\n*
+/\o pattern.txt /*\/\\o*
+/\p pattern.txt /*\/\\p*
+/\r pattern.txt /*\/\\r*
+/\s pattern.txt /*\/\\s*
+/\star pattern.txt /*\/\\star*
+/\t pattern.txt /*\/\\t*
+/\u pattern.txt /*\/\\u*
+/\v pattern.txt /*\/\\v*
+/\w pattern.txt /*\/\\w*
+/\x pattern.txt /*\/\\x*
+/\z( syntax.txt /*\/\\z(*
+/\z(\) syntax.txt /*\/\\z(\\)*
+/\z1 syntax.txt /*\/\\z1*
+/\z2 syntax.txt /*\/\\z2*
+/\z3 syntax.txt /*\/\\z3*
+/\z4 syntax.txt /*\/\\z4*
+/\z5 syntax.txt /*\/\\z5*
+/\z6 syntax.txt /*\/\\z6*
+/\z7 syntax.txt /*\/\\z7*
+/\z8 syntax.txt /*\/\\z8*
+/\z9 syntax.txt /*\/\\z9*
+/\ze pattern.txt /*\/\\ze*
+/\zs pattern.txt /*\/\\zs*
+/\{ pattern.txt /*\/\\{*
+/\{- pattern.txt /*\/\\{-*
+/\~ pattern.txt /*\/\\~*
+/^ pattern.txt /*\/^*
+/_CTRL-G cmdline.txt /*\/_CTRL-G*
+/_CTRL-L cmdline.txt /*\/_CTRL-L*
+/_CTRL-T cmdline.txt /*\/_CTRL-T*
+/atom pattern.txt /*\/atom*
+/bar pattern.txt /*\/bar*
+/branch pattern.txt /*\/branch*
+/character-classes pattern.txt /*\/character-classes*
+/collection pattern.txt /*\/collection*
+/concat pattern.txt /*\/concat*
+/dyn various.txt /*\/dyn*
+/ignorecase pattern.txt /*\/ignorecase*
+/magic pattern.txt /*\/magic*
+/multi pattern.txt /*\/multi*
+/ordinary-atom pattern.txt /*\/ordinary-atom*
+/pattern pattern.txt /*\/pattern*
+/piece pattern.txt /*\/piece*
+/star pattern.txt /*\/star*
+/zero-width pattern.txt /*\/zero-width*
+/~ pattern.txt /*\/~*
+0 motion.txt /*0*
+01.1 usr_01.txt /*01.1*
+01.2 usr_01.txt /*01.2*
+01.3 usr_01.txt /*01.3*
+01.4 usr_01.txt /*01.4*
+02.1 usr_02.txt /*02.1*
+02.2 usr_02.txt /*02.2*
+02.3 usr_02.txt /*02.3*
+02.4 usr_02.txt /*02.4*
+02.5 usr_02.txt /*02.5*
+02.6 usr_02.txt /*02.6*
+02.7 usr_02.txt /*02.7*
+02.8 usr_02.txt /*02.8*
+03.1 usr_03.txt /*03.1*
+03.10 usr_03.txt /*03.10*
+03.2 usr_03.txt /*03.2*
+03.3 usr_03.txt /*03.3*
+03.4 usr_03.txt /*03.4*
+03.5 usr_03.txt /*03.5*
+03.6 usr_03.txt /*03.6*
+03.7 usr_03.txt /*03.7*
+03.8 usr_03.txt /*03.8*
+03.9 usr_03.txt /*03.9*
+04.1 usr_04.txt /*04.1*
+04.10 usr_04.txt /*04.10*
+04.2 usr_04.txt /*04.2*
+04.3 usr_04.txt /*04.3*
+04.4 usr_04.txt /*04.4*
+04.5 usr_04.txt /*04.5*
+04.6 usr_04.txt /*04.6*
+04.7 usr_04.txt /*04.7*
+04.8 usr_04.txt /*04.8*
+04.9 usr_04.txt /*04.9*
+05.1 usr_05.txt /*05.1*
+05.2 usr_05.txt /*05.2*
+05.3 usr_05.txt /*05.3*
+05.4 usr_05.txt /*05.4*
+05.5 usr_05.txt /*05.5*
+05.6 usr_05.txt /*05.6*
+05.7 usr_05.txt /*05.7*
+05.8 usr_05.txt /*05.8*
+05.9 usr_05.txt /*05.9*
+06.1 usr_06.txt /*06.1*
+06.2 usr_06.txt /*06.2*
+06.3 usr_06.txt /*06.3*
+06.4 usr_06.txt /*06.4*
+06.5 usr_06.txt /*06.5*
+06.6 usr_06.txt /*06.6*
+07.1 usr_07.txt /*07.1*
+07.2 usr_07.txt /*07.2*
+07.3 usr_07.txt /*07.3*
+07.4 usr_07.txt /*07.4*
+07.5 usr_07.txt /*07.5*
+07.6 usr_07.txt /*07.6*
+07.7 usr_07.txt /*07.7*
+08.1 usr_08.txt /*08.1*
+08.2 usr_08.txt /*08.2*
+08.3 usr_08.txt /*08.3*
+08.4 usr_08.txt /*08.4*
+08.5 usr_08.txt /*08.5*
+08.6 usr_08.txt /*08.6*
+08.7 usr_08.txt /*08.7*
+08.8 usr_08.txt /*08.8*
+08.9 usr_08.txt /*08.9*
+09.1 usr_09.txt /*09.1*
+09.2 usr_09.txt /*09.2*
+09.3 usr_09.txt /*09.3*
+09.4 usr_09.txt /*09.4*
+0o eval.txt /*0o*
+0x eval.txt /*0x*
+10.1 usr_10.txt /*10.1*
+10.2 usr_10.txt /*10.2*
+10.3 usr_10.txt /*10.3*
+10.4 usr_10.txt /*10.4*
+10.5 usr_10.txt /*10.5*
+10.6 usr_10.txt /*10.6*
+10.7 usr_10.txt /*10.7*
+10.8 usr_10.txt /*10.8*
+10.9 usr_10.txt /*10.9*
+11.1 usr_11.txt /*11.1*
+11.2 usr_11.txt /*11.2*
+11.3 usr_11.txt /*11.3*
+11.4 usr_11.txt /*11.4*
+12.1 usr_12.txt /*12.1*
+12.2 usr_12.txt /*12.2*
+12.3 usr_12.txt /*12.3*
+12.4 usr_12.txt /*12.4*
+12.5 usr_12.txt /*12.5*
+12.6 usr_12.txt /*12.6*
+12.7 usr_12.txt /*12.7*
+12.8 usr_12.txt /*12.8*
+1gD pattern.txt /*1gD*
+1gd pattern.txt /*1gd*
+20.1 usr_20.txt /*20.1*
+20.2 usr_20.txt /*20.2*
+20.3 usr_20.txt /*20.3*
+20.4 usr_20.txt /*20.4*
+20.5 usr_20.txt /*20.5*
+21.1 usr_21.txt /*21.1*
+21.2 usr_21.txt /*21.2*
+21.3 usr_21.txt /*21.3*
+21.4 usr_21.txt /*21.4*
+21.5 usr_21.txt /*21.5*
+21.6 usr_21.txt /*21.6*
+22.1 usr_22.txt /*22.1*
+22.2 usr_22.txt /*22.2*
+22.3 usr_22.txt /*22.3*
+22.4 usr_22.txt /*22.4*
+23.1 usr_23.txt /*23.1*
+23.2 usr_23.txt /*23.2*
+23.3 usr_23.txt /*23.3*
+23.4 usr_23.txt /*23.4*
+23.5 usr_23.txt /*23.5*
+24.1 usr_24.txt /*24.1*
+24.10 usr_24.txt /*24.10*
+24.2 usr_24.txt /*24.2*
+24.3 usr_24.txt /*24.3*
+24.4 usr_24.txt /*24.4*
+24.5 usr_24.txt /*24.5*
+24.6 usr_24.txt /*24.6*
+24.7 usr_24.txt /*24.7*
+24.8 usr_24.txt /*24.8*
+24.9 usr_24.txt /*24.9*
+25.1 usr_25.txt /*25.1*
+25.2 usr_25.txt /*25.2*
+25.3 usr_25.txt /*25.3*
+25.4 usr_25.txt /*25.4*
+25.5 usr_25.txt /*25.5*
+26.1 usr_26.txt /*26.1*
+26.2 usr_26.txt /*26.2*
+26.3 usr_26.txt /*26.3*
+26.4 usr_26.txt /*26.4*
+27.1 usr_27.txt /*27.1*
+27.2 usr_27.txt /*27.2*
+27.3 usr_27.txt /*27.3*
+27.4 usr_27.txt /*27.4*
+27.5 usr_27.txt /*27.5*
+27.6 usr_27.txt /*27.6*
+27.7 usr_27.txt /*27.7*
+27.8 usr_27.txt /*27.8*
+27.9 usr_27.txt /*27.9*
+28.1 usr_28.txt /*28.1*
+28.10 usr_28.txt /*28.10*
+28.2 usr_28.txt /*28.2*
+28.3 usr_28.txt /*28.3*
+28.4 usr_28.txt /*28.4*
+28.5 usr_28.txt /*28.5*
+28.6 usr_28.txt /*28.6*
+28.7 usr_28.txt /*28.7*
+28.8 usr_28.txt /*28.8*
+28.9 usr_28.txt /*28.9*
+29.1 usr_29.txt /*29.1*
+29.2 usr_29.txt /*29.2*
+29.3 usr_29.txt /*29.3*
+29.4 usr_29.txt /*29.4*
+29.5 usr_29.txt /*29.5*
+2html.vim syntax.txt /*2html.vim*
+30.1 usr_30.txt /*30.1*
+30.2 usr_30.txt /*30.2*
+30.3 usr_30.txt /*30.3*
+30.4 usr_30.txt /*30.4*
+30.5 usr_30.txt /*30.5*
+30.6 usr_30.txt /*30.6*
+31.1 usr_31.txt /*31.1*
+31.2 usr_31.txt /*31.2*
+31.3 usr_31.txt /*31.3*
+31.4 usr_31.txt /*31.4*
+31.5 usr_31.txt /*31.5*
+32.1 usr_32.txt /*32.1*
+32.2 usr_32.txt /*32.2*
+32.3 usr_32.txt /*32.3*
+32.4 usr_32.txt /*32.4*
+40.1 usr_40.txt /*40.1*
+40.2 usr_40.txt /*40.2*
+40.3 usr_40.txt /*40.3*
+41.1 usr_41.txt /*41.1*
+41.10 usr_41.txt /*41.10*
+41.11 usr_41.txt /*41.11*
+41.12 usr_41.txt /*41.12*
+41.2 usr_41.txt /*41.2*
+41.3 usr_41.txt /*41.3*
+41.4 usr_41.txt /*41.4*
+41.5 usr_41.txt /*41.5*
+41.6 usr_41.txt /*41.6*
+41.7 usr_41.txt /*41.7*
+41.8 usr_41.txt /*41.8*
+41.9 usr_41.txt /*41.9*
+42 usr_42.txt /*42*
+42.1 usr_42.txt /*42.1*
+42.2 usr_42.txt /*42.2*
+42.3 usr_42.txt /*42.3*
+42.4 usr_42.txt /*42.4*
+43.1 usr_43.txt /*43.1*
+43.2 usr_43.txt /*43.2*
+44.1 usr_44.txt /*44.1*
+44.10 usr_44.txt /*44.10*
+44.11 usr_44.txt /*44.11*
+44.12 usr_44.txt /*44.12*
+44.2 usr_44.txt /*44.2*
+44.3 usr_44.txt /*44.3*
+44.4 usr_44.txt /*44.4*
+44.5 usr_44.txt /*44.5*
+44.6 usr_44.txt /*44.6*
+44.7 usr_44.txt /*44.7*
+44.8 usr_44.txt /*44.8*
+44.9 usr_44.txt /*44.9*
+45.1 usr_45.txt /*45.1*
+45.2 usr_45.txt /*45.2*
+45.3 usr_45.txt /*45.3*
+45.4 usr_45.txt /*45.4*
+45.5 usr_45.txt /*45.5*
+50.1 usr_50.txt /*50.1*
+50.2 usr_50.txt /*50.2*
+50.3 usr_50.txt /*50.3*
+51.1 usr_51.txt /*51.1*
+51.2 usr_51.txt /*51.2*
+51.3 usr_51.txt /*51.3*
+51.4 usr_51.txt /*51.4*
+52.1 usr_52.txt /*52.1*
+52.2 usr_52.txt /*52.2*
+52.3 usr_52.txt /*52.3*
+52.4 usr_52.txt /*52.4*
+52.5 usr_52.txt /*52.5*
+8g8 various.txt /*8g8*
+90.1 usr_90.txt /*90.1*
+90.2 usr_90.txt /*90.2*
+90.3 usr_90.txt /*90.3*
+90.4 usr_90.txt /*90.4*
+90.5 usr_90.txt /*90.5*
+: cmdline.txt /*:*
+:! various.txt /*:!*
+:!! various.txt /*:!!*
+:!cmd various.txt /*:!cmd*
+:!start os_win32.txt /*:!start*
+:# various.txt /*:#*
+:#! various.txt /*:#!*
+:$ cmdline.txt /*:$*
+:% cmdline.txt /*:%*
+:& change.txt /*:&*
+:&& change.txt /*:&&*
+:' cmdline.txt /*:'*
+:++ vim9.txt /*:++*
+:, cmdline.txt /*:,*
+:-- vim9.txt /*:--*
+:. cmdline.txt /*:.*
+:/ cmdline.txt /*:\/*
+:0file editing.txt /*:0file*
+:2match pattern.txt /*:2match*
+:3match pattern.txt /*:3match*
+::. cmdline.txt /*::.*
+::8 cmdline.txt /*::8*
+::S cmdline.txt /*::S*
+::e cmdline.txt /*::e*
+::gs cmdline.txt /*::gs*
+::h cmdline.txt /*::h*
+::p cmdline.txt /*::p*
+::r cmdline.txt /*::r*
+::s cmdline.txt /*::s*
+::t cmdline.txt /*::t*
+::~ cmdline.txt /*::~*
+:; cmdline.txt /*:;*
+:< change.txt /*:<*
+:<abuf> cmdline.txt /*:<abuf>*
+:<afile> cmdline.txt /*:<afile>*
+:<amatch> cmdline.txt /*:<amatch>*
+:<cWORD> cmdline.txt /*:<cWORD>*
+:<cexpr> cmdline.txt /*:<cexpr>*
+:<cfile> cmdline.txt /*:<cfile>*
+:<client> cmdline.txt /*:<client>*
+:<cword> cmdline.txt /*:<cword>*
+:<script> cmdline.txt /*:<script>*
+:<sfile> cmdline.txt /*:<sfile>*
+:<sflnum> cmdline.txt /*:<sflnum>*
+:<slnum> cmdline.txt /*:<slnum>*
+:<stack> cmdline.txt /*:<stack>*
+:= various.txt /*:=*
+:> change.txt /*:>*
+:? cmdline.txt /*:?*
+:@ repeat.txt /*:@*
+:@: repeat.txt /*:@:*
+:@@ repeat.txt /*:@@*
+:AdaLines ft_ada.txt /*:AdaLines*
+:AdaRainbow ft_ada.txt /*:AdaRainbow*
+:AdaSpaces ft_ada.txt /*:AdaSpaces*
+:AdaTagDir ft_ada.txt /*:AdaTagDir*
+:AdaTagFile ft_ada.txt /*:AdaTagFile*
+:AdaTypes ft_ada.txt /*:AdaTypes*
+:Arguments terminal.txt /*:Arguments*
+:Asm terminal.txt /*:Asm*
+:Break terminal.txt /*:Break*
+:Cfilter quickfix.txt /*:Cfilter*
+:Clear terminal.txt /*:Clear*
+:CompilerSet usr_51.txt /*:CompilerSet*
+:ConTeXt ft_context.txt /*:ConTeXt*
+:ConTeXtJobsStatus ft_context.txt /*:ConTeXtJobsStatus*
+:ConTeXtLog ft_context.txt /*:ConTeXtLog*
+:ConTeXtStopJobs ft_context.txt /*:ConTeXtStopJobs*
+:Continue terminal.txt /*:Continue*
+:DiffOrig diff.txt /*:DiffOrig*
+:DoMatchParen pi_paren.txt /*:DoMatchParen*
+:Evaluate terminal.txt /*:Evaluate*
+:Explore pi_netrw.txt /*:Explore*
+:Finish terminal.txt /*:Finish*
+:FixBeginfigs ft_mp.txt /*:FixBeginfigs*
+:GLVS pi_getscript.txt /*:GLVS*
+:Gdb terminal.txt /*:Gdb*
+:GetLatestVimScripts_dat pi_getscript.txt /*:GetLatestVimScripts_dat*
+:GnatFind ft_ada.txt /*:GnatFind*
+:GnatPretty ft_ada.txt /*:GnatPretty*
+:GnatTags ft_ada.txt /*:GnatTags*
+:Hexplore pi_netrw.txt /*:Hexplore*
+:LP pi_logipat.txt /*:LP*
+:LPE pi_logipat.txt /*:LPE*
+:LPF pi_logipat.txt /*:LPF*
+:Lexplore pi_netrw.txt /*:Lexplore*
+:Lfilter quickfix.txt /*:Lfilter*
+:LogiPat pi_logipat.txt /*:LogiPat*
+:Man filetype.txt /*:Man*
+:MkVimball pi_vimball.txt /*:MkVimball*
+:N editing.txt /*:N*
+:NetrwClean pi_netrw.txt /*:NetrwClean*
+:Nexplore pi_netrw.txt /*:Nexplore*
+:Next editing.txt /*:Next*
+:NoMatchParen pi_paren.txt /*:NoMatchParen*
+:Nr pi_netrw.txt /*:Nr*
+:Nread pi_netrw.txt /*:Nread*
+:Ns pi_netrw.txt /*:Ns*
+:Nsource pi_netrw.txt /*:Nsource*
+:Ntree pi_netrw.txt /*:Ntree*
+:Nw pi_netrw.txt /*:Nw*
+:Nwrite pi_netrw.txt /*:Nwrite*
+:Over terminal.txt /*:Over*
+:P various.txt /*:P*
+:Pexplore pi_netrw.txt /*:Pexplore*
+:Print various.txt /*:Print*
+:Program terminal.txt /*:Program*
+:Rexplore pi_netrw.txt /*:Rexplore*
+:RmVimball pi_vimball.txt /*:RmVimball*
+:Run terminal.txt /*:Run*
+:RustEmitAsm ft_rust.txt /*:RustEmitAsm*
+:RustEmitIr ft_rust.txt /*:RustEmitIr*
+:RustExpand ft_rust.txt /*:RustExpand*
+:RustFmt ft_rust.txt /*:RustFmt*
+:RustFmtRange ft_rust.txt /*:RustFmtRange*
+:RustPlay ft_rust.txt /*:RustPlay*
+:RustRun ft_rust.txt /*:RustRun*
+:Sexplore pi_netrw.txt /*:Sexplore*
+:Source terminal.txt /*:Source*
+:Step terminal.txt /*:Step*
+:Stop terminal.txt /*:Stop*
+:TOhtml syntax.txt /*:TOhtml*
+:TarDiff pi_tar.txt /*:TarDiff*
+:Termdebug terminal.txt /*:Termdebug*
+:TermdebugCommand terminal.txt /*:TermdebugCommand*
+:Texplore pi_netrw.txt /*:Texplore*
+:Until terminal.txt /*:Until*
+:UseVimball pi_vimball.txt /*:UseVimball*
+:Vexplore pi_netrw.txt /*:Vexplore*
+:VimballList pi_vimball.txt /*:VimballList*
+:Vimuntar pi_tar.txt /*:Vimuntar*
+:Winbar terminal.txt /*:Winbar*
+:X editing.txt /*:X*
+:XMLent insert.txt /*:XMLent*
+:XMLns insert.txt /*:XMLns*
+:[range] motion.txt /*:[range]*
+:\bar cmdline.txt /*:\\bar*
+:_! cmdline.txt /*:_!*
+:_# cmdline.txt /*:_#*
+:_## cmdline.txt /*:_##*
+:_#0 cmdline.txt /*:_#0*
+:_#< cmdline.txt /*:_#<*
+:_#n cmdline.txt /*:_#n*
+:_% cmdline.txt /*:_%*
+:_%% cmdline.txt /*:_%%*
+:_%%% cmdline.txt /*:_%%%*
+:_%%0 cmdline.txt /*:_%%0*
+:_%%< cmdline.txt /*:_%%<*
+:_%%n cmdline.txt /*:_%%n*
+:_%: cmdline.txt /*:_%:*
+:_%< cmdline.txt /*:_%<*
+:a insert.txt /*:a*
+:ab map.txt /*:ab*
+:abbreviate map.txt /*:abbreviate*
+:abbreviate-<buffer> map.txt /*:abbreviate-<buffer>*
+:abbreviate-local map.txt /*:abbreviate-local*
+:abbreviate-verbose map.txt /*:abbreviate-verbose*
+:abc map.txt /*:abc*
+:abclear map.txt /*:abclear*
+:abo windows.txt /*:abo*
+:aboveleft windows.txt /*:aboveleft*
+:abstract vim9class.txt /*:abstract*
+:addd quickfix.txt /*:addd*
+:al windows.txt /*:al*
+:all windows.txt /*:all*
+:am gui.txt /*:am*
+:amenu gui.txt /*:amenu*
+:an gui.txt /*:an*
+:anoremenu gui.txt /*:anoremenu*
+:append insert.txt /*:append*
+:ar editing.txt /*:ar*
+:arg editing.txt /*:arg*
+:arga editing.txt /*:arga*
+:argadd editing.txt /*:argadd*
+:argd editing.txt /*:argd*
+:argded editing.txt /*:argded*
+:argdedupe editing.txt /*:argdedupe*
+:argdelete editing.txt /*:argdelete*
+:argdo editing.txt /*:argdo*
+:arge editing.txt /*:arge*
+:argedit editing.txt /*:argedit*
+:argglobal editing.txt /*:argglobal*
+:arglocal editing.txt /*:arglocal*
+:args editing.txt /*:args*
+:args_f editing.txt /*:args_f*
+:args_f! editing.txt /*:args_f!*
+:argu editing.txt /*:argu*
+:argument editing.txt /*:argument*
+:as various.txt /*:as*
+:ascii various.txt /*:ascii*
+:au autocmd.txt /*:au*
+:aug autocmd.txt /*:aug*
+:augroup autocmd.txt /*:augroup*
+:augroup-delete autocmd.txt /*:augroup-delete*
+:aun gui.txt /*:aun*
+:aunmenu gui.txt /*:aunmenu*
+:autocmd autocmd.txt /*:autocmd*
+:autocmd-block autocmd.txt /*:autocmd-block*
+:autocmd-verbose autocmd.txt /*:autocmd-verbose*
+:b windows.txt /*:b*
+:bN windows.txt /*:bN*
+:bNext windows.txt /*:bNext*
+:ba windows.txt /*:ba*
+:bad windows.txt /*:bad*
+:badd windows.txt /*:badd*
+:ball windows.txt /*:ball*
+:balt windows.txt /*:balt*
+:bar cmdline.txt /*:bar*
+:bd windows.txt /*:bd*
+:bdel windows.txt /*:bdel*
+:bdelete windows.txt /*:bdelete*
+:be gui.txt /*:be*
+:behave gui.txt /*:behave*
+:bel windows.txt /*:bel*
+:belowright windows.txt /*:belowright*
+:bf windows.txt /*:bf*
+:bfirst windows.txt /*:bfirst*
+:bl windows.txt /*:bl*
+:blast windows.txt /*:blast*
+:bm windows.txt /*:bm*
+:bmodified windows.txt /*:bmodified*
+:bn windows.txt /*:bn*
+:bnext windows.txt /*:bnext*
+:bo windows.txt /*:bo*
+:botright windows.txt /*:botright*
+:bp windows.txt /*:bp*
+:bprevious windows.txt /*:bprevious*
+:br windows.txt /*:br*
+:bre windows.txt /*:bre*
+:brea eval.txt /*:brea*
+:break eval.txt /*:break*
+:breaka repeat.txt /*:breaka*
+:breakadd repeat.txt /*:breakadd*
+:breakd repeat.txt /*:breakd*
+:breakdel repeat.txt /*:breakdel*
+:breakl repeat.txt /*:breakl*
+:breaklist repeat.txt /*:breaklist*
+:brewind windows.txt /*:brewind*
+:bro editing.txt /*:bro*
+:browse editing.txt /*:browse*
+:browse-set options.txt /*:browse-set*
+:bu windows.txt /*:bu*
+:buf windows.txt /*:buf*
+:bufdo windows.txt /*:bufdo*
+:buffer windows.txt /*:buffer*
+:buffer-! windows.txt /*:buffer-!*
+:buffers windows.txt /*:buffers*
+:bun windows.txt /*:bun*
+:bunload windows.txt /*:bunload*
+:bw windows.txt /*:bw*
+:bwipe windows.txt /*:bwipe*
+:bwipeout windows.txt /*:bwipeout*
+:c change.txt /*:c*
+:cN quickfix.txt /*:cN*
+:cNext quickfix.txt /*:cNext*
+:cNf quickfix.txt /*:cNf*
+:cNfile quickfix.txt /*:cNfile*
+:ca map.txt /*:ca*
+:cab map.txt /*:cab*
+:cabbrev map.txt /*:cabbrev*
+:cabc map.txt /*:cabc*
+:cabclear map.txt /*:cabclear*
+:cabo quickfix.txt /*:cabo*
+:cabove quickfix.txt /*:cabove*
+:cad quickfix.txt /*:cad*
+:cadd quickfix.txt /*:cadd*
+:caddbuffer quickfix.txt /*:caddbuffer*
+:cadde quickfix.txt /*:cadde*
+:caddexpr quickfix.txt /*:caddexpr*
+:caddf quickfix.txt /*:caddf*
+:caddfile quickfix.txt /*:caddfile*
+:caf quickfix.txt /*:caf*
+:cafter quickfix.txt /*:cafter*
+:cal userfunc.txt /*:cal*
+:call userfunc.txt /*:call*
+:cat eval.txt /*:cat*
+:catch eval.txt /*:catch*
+:cb quickfix.txt /*:cb*
+:cbe quickfix.txt /*:cbe*
+:cbefore quickfix.txt /*:cbefore*
+:cbel quickfix.txt /*:cbel*
+:cbelow quickfix.txt /*:cbelow*
+:cbo quickfix.txt /*:cbo*
+:cbottom quickfix.txt /*:cbottom*
+:cbuffer quickfix.txt /*:cbuffer*
+:cc quickfix.txt /*:cc*
+:ccl quickfix.txt /*:ccl*
+:cclose quickfix.txt /*:cclose*
+:cd editing.txt /*:cd*
+:cd- editing.txt /*:cd-*
+:cdo quickfix.txt /*:cdo*
+:ce change.txt /*:ce*
+:center change.txt /*:center*
+:cex quickfix.txt /*:cex*
+:cexpr quickfix.txt /*:cexpr*
+:cf quickfix.txt /*:cf*
+:cfdo quickfix.txt /*:cfdo*
+:cfi quickfix.txt /*:cfi*
+:cfile quickfix.txt /*:cfile*
+:cfir quickfix.txt /*:cfir*
+:cfirst quickfix.txt /*:cfirst*
+:cg quickfix.txt /*:cg*
+:cgetb quickfix.txt /*:cgetb*
+:cgetbuffer quickfix.txt /*:cgetbuffer*
+:cgete quickfix.txt /*:cgete*
+:cgetexpr quickfix.txt /*:cgetexpr*
+:cgetfile quickfix.txt /*:cgetfile*
+:ch change.txt /*:ch*
+:change change.txt /*:change*
+:changes motion.txt /*:changes*
+:chd editing.txt /*:chd*
+:chdir editing.txt /*:chdir*
+:che tagsrch.txt /*:che*
+:chec tagsrch.txt /*:chec*
+:check tagsrch.txt /*:check*
+:checkpath tagsrch.txt /*:checkpath*
+:checkt editing.txt /*:checkt*
+:checktime editing.txt /*:checktime*
+:chi quickfix.txt /*:chi*
+:chistory quickfix.txt /*:chistory*
+:cl quickfix.txt /*:cl*
+:cla quickfix.txt /*:cla*
+:class vim9class.txt /*:class*
+:clast quickfix.txt /*:clast*
+:cle motion.txt /*:cle*
+:clearjumps motion.txt /*:clearjumps*
+:clist quickfix.txt /*:clist*
+:clo windows.txt /*:clo*
+:close windows.txt /*:close*
+:cm map.txt /*:cm*
+:cmap map.txt /*:cmap*
+:cmap_l map.txt /*:cmap_l*
+:cmapc map.txt /*:cmapc*
+:cmapclear map.txt /*:cmapclear*
+:cme gui.txt /*:cme*
+:cmenu gui.txt /*:cmenu*
+:cn quickfix.txt /*:cn*
+:cne quickfix.txt /*:cne*
+:cnew quickfix.txt /*:cnew*
+:cnewer quickfix.txt /*:cnewer*
+:cnext quickfix.txt /*:cnext*
+:cnf quickfix.txt /*:cnf*
+:cnfile quickfix.txt /*:cnfile*
+:cno map.txt /*:cno*
+:cnor map.txt /*:cnor*
+:cnorea map.txt /*:cnorea*
+:cnoreabbrev map.txt /*:cnoreabbrev*
+:cnoremap map.txt /*:cnoremap*
+:cnoreme gui.txt /*:cnoreme*
+:cnoremenu gui.txt /*:cnoremenu*
+:co change.txt /*:co*
+:col quickfix.txt /*:col*
+:colder quickfix.txt /*:colder*
+:colo syntax.txt /*:colo*
+:colorscheme syntax.txt /*:colorscheme*
+:com map.txt /*:com*
+:comc map.txt /*:comc*
+:comclear map.txt /*:comclear*
+:command map.txt /*:command*
+:command-addr map.txt /*:command-addr*
+:command-bang map.txt /*:command-bang*
+:command-bar map.txt /*:command-bar*
+:command-buffer map.txt /*:command-buffer*
+:command-complete map.txt /*:command-complete*
+:command-completion map.txt /*:command-completion*
+:command-completion-custom map.txt /*:command-completion-custom*
+:command-completion-customlist map.txt /*:command-completion-customlist*
+:command-count map.txt /*:command-count*
+:command-keepscript map.txt /*:command-keepscript*
+:command-modifiers map.txt /*:command-modifiers*
+:command-nargs map.txt /*:command-nargs*
+:command-range map.txt /*:command-range*
+:command-register map.txt /*:command-register*
+:command-repl map.txt /*:command-repl*
+:command-verbose map.txt /*:command-verbose*
+:comment cmdline.txt /*:comment*
+:comp quickfix.txt /*:comp*
+:compiler quickfix.txt /*:compiler*
+:con eval.txt /*:con*
+:conf editing.txt /*:conf*
+:confirm editing.txt /*:confirm*
+:cons eval.txt /*:cons*
+:const eval.txt /*:const*
+:continue eval.txt /*:continue*
+:cope quickfix.txt /*:cope*
+:copen quickfix.txt /*:copen*
+:copy change.txt /*:copy*
+:count_quit windows.txt /*:count_quit*
+:cp quickfix.txt /*:cp*
+:cpf quickfix.txt /*:cpf*
+:cpfile quickfix.txt /*:cpfile*
+:cprev quickfix.txt /*:cprev*
+:cprevious quickfix.txt /*:cprevious*
+:cq quickfix.txt /*:cq*
+:cquit quickfix.txt /*:cquit*
+:cr quickfix.txt /*:cr*
+:crewind quickfix.txt /*:crewind*
+:cs if_cscop.txt /*:cs*
+:cscope if_cscop.txt /*:cscope*
+:cstag if_cscop.txt /*:cstag*
+:cu map.txt /*:cu*
+:cun map.txt /*:cun*
+:cuna map.txt /*:cuna*
+:cunabbrev map.txt /*:cunabbrev*
+:cunmap map.txt /*:cunmap*
+:cunme gui.txt /*:cunme*
+:cunmenu gui.txt /*:cunmenu*
+:cw quickfix.txt /*:cw*
+:cwindow quickfix.txt /*:cwindow*
+:d change.txt /*:d*
+:de change.txt /*:de*
+:debug repeat.txt /*:debug*
+:debug-name repeat.txt /*:debug-name*
+:debugg repeat.txt /*:debugg*
+:debuggreedy repeat.txt /*:debuggreedy*
+:def vim9.txt /*:def*
+:defc vim9.txt /*:defc*
+:defcompile vim9.txt /*:defcompile*
+:defer userfunc.txt /*:defer*
+:del change.txt /*:del*
+:delc map.txt /*:delc*
+:delcommand map.txt /*:delcommand*
+:delcr todo.txt /*:delcr*
+:delete change.txt /*:delete*
+:delf userfunc.txt /*:delf*
+:delfunction userfunc.txt /*:delfunction*
+:delm motion.txt /*:delm*
+:delmarks motion.txt /*:delmarks*
+:di change.txt /*:di*
+:dif diff.txt /*:dif*
+:diff diff.txt /*:diff*
+:diffg diff.txt /*:diffg*
+:diffget diff.txt /*:diffget*
+:diffo diff.txt /*:diffo*
+:diffoff diff.txt /*:diffoff*
+:diffp diff.txt /*:diffp*
+:diffpatch diff.txt /*:diffpatch*
+:diffpu diff.txt /*:diffpu*
+:diffput diff.txt /*:diffput*
+:diffs diff.txt /*:diffs*
+:diffsplit diff.txt /*:diffsplit*
+:difft diff.txt /*:difft*
+:diffthis diff.txt /*:diffthis*
+:diffupdate diff.txt /*:diffupdate*
+:dig digraph.txt /*:dig*
+:digraphs digraph.txt /*:digraphs*
+:dis change.txt /*:dis*
+:disa vim9.txt /*:disa*
+:disassemble vim9.txt /*:disassemble*
+:display change.txt /*:display*
+:dj tagsrch.txt /*:dj*
+:djump tagsrch.txt /*:djump*
+:dl change.txt /*:dl*
+:dli tagsrch.txt /*:dli*
+:dlist tagsrch.txt /*:dlist*
+:do autocmd.txt /*:do*
+:doau autocmd.txt /*:doau*
+:doaut autocmd.txt /*:doaut*
+:doautoa autocmd.txt /*:doautoa*
+:doautoall autocmd.txt /*:doautoall*
+:doautocmd autocmd.txt /*:doautocmd*
+:dp change.txt /*:dp*
+:dr windows.txt /*:dr*
+:drop windows.txt /*:drop*
+:ds tagsrch.txt /*:ds*
+:dsearch tagsrch.txt /*:dsearch*
+:dsp tagsrch.txt /*:dsp*
+:dsplit tagsrch.txt /*:dsplit*
+:e editing.txt /*:e*
+:e# editing.txt /*:e#*
+:ea undo.txt /*:ea*
+:earlier undo.txt /*:earlier*
+:ec eval.txt /*:ec*
+:echo eval.txt /*:echo*
+:echo-redraw eval.txt /*:echo-redraw*
+:echoc eval.txt /*:echoc*
+:echoconsole eval.txt /*:echoconsole*
+:echoe eval.txt /*:echoe*
+:echoerr eval.txt /*:echoerr*
+:echoh eval.txt /*:echoh*
+:echohl eval.txt /*:echohl*
+:echom eval.txt /*:echom*
+:echomsg eval.txt /*:echomsg*
+:echon eval.txt /*:echon*
+:echow eval.txt /*:echow*
+:echowin eval.txt /*:echowin*
+:echowindow eval.txt /*:echowindow*
+:edit editing.txt /*:edit*
+:edit! editing.txt /*:edit!*
+:edit!_f editing.txt /*:edit!_f*
+:edit_# editing.txt /*:edit_#*
+:edit_f editing.txt /*:edit_f*
+:el eval.txt /*:el*
+:else eval.txt /*:else*
+:elsei eval.txt /*:elsei*
+:elseif eval.txt /*:elseif*
+:em gui.txt /*:em*
+:emenu gui.txt /*:emenu*
+:en eval.txt /*:en*
+:end eval.txt /*:end*
+:endclass vim9class.txt /*:endclass*
+:enddef vim9.txt /*:enddef*
+:endenum vim9class.txt /*:endenum*
+:endf userfunc.txt /*:endf*
+:endfo eval.txt /*:endfo*
+:endfor eval.txt /*:endfor*
+:endfunction userfunc.txt /*:endfunction*
+:endif eval.txt /*:endif*
+:endinterface vim9class.txt /*:endinterface*
+:endt eval.txt /*:endt*
+:endtry eval.txt /*:endtry*
+:endw eval.txt /*:endw*
+:endwhile eval.txt /*:endwhile*
+:ene editing.txt /*:ene*
+:ene! editing.txt /*:ene!*
+:enew editing.txt /*:enew*
+:enew! editing.txt /*:enew!*
+:enum vim9class.txt /*:enum*
+:eval eval.txt /*:eval*
+:ex editing.txt /*:ex*
+:exe eval.txt /*:exe*
+:exe-comment eval.txt /*:exe-comment*
+:execute eval.txt /*:execute*
+:exi editing.txt /*:exi*
+:exit editing.txt /*:exit*
+:exp vim9.txt /*:exp*
+:export vim9.txt /*:export*
+:exu helphelp.txt /*:exu*
+:exusage helphelp.txt /*:exusage*
+:f editing.txt /*:f*
+:fi editing.txt /*:fi*
+:file editing.txt /*:file*
+:file_f editing.txt /*:file_f*
+:filename editing.txt /*:filename*
+:files windows.txt /*:files*
+:filet filetype.txt /*:filet*
+:filetype filetype.txt /*:filetype*
+:filetype-indent-off filetype.txt /*:filetype-indent-off*
+:filetype-indent-on filetype.txt /*:filetype-indent-on*
+:filetype-off filetype.txt /*:filetype-off*
+:filetype-overview filetype.txt /*:filetype-overview*
+:filetype-plugin-off filetype.txt /*:filetype-plugin-off*
+:filetype-plugin-on filetype.txt /*:filetype-plugin-on*
+:filt various.txt /*:filt*
+:filter various.txt /*:filter*
+:fin editing.txt /*:fin*
+:fina eval.txt /*:fina*
+:final vim9.txt /*:final*
+:finally eval.txt /*:finally*
+:find editing.txt /*:find*
+:fini repeat.txt /*:fini*
+:finish repeat.txt /*:finish*
+:fir editing.txt /*:fir*
+:first editing.txt /*:first*
+:fix options.txt /*:fix*
+:fixdel options.txt /*:fixdel*
+:fo fold.txt /*:fo*
+:fold fold.txt /*:fold*
+:foldc fold.txt /*:foldc*
+:foldclose fold.txt /*:foldclose*
+:foldd fold.txt /*:foldd*
+:folddo fold.txt /*:folddo*
+:folddoc fold.txt /*:folddoc*
+:folddoclosed fold.txt /*:folddoclosed*
+:folddoopen fold.txt /*:folddoopen*
+:foldo fold.txt /*:foldo*
+:foldopen fold.txt /*:foldopen*
+:for eval.txt /*:for*
+:fu userfunc.txt /*:fu*
+:func-abort userfunc.txt /*:func-abort*
+:func-closure userfunc.txt /*:func-closure*
+:func-dict userfunc.txt /*:func-dict*
+:func-range userfunc.txt /*:func-range*
+:function userfunc.txt /*:function*
+:function-verbose userfunc.txt /*:function-verbose*
+:g repeat.txt /*:g*
+:global repeat.txt /*:global*
+:go motion.txt /*:go*
+:goto motion.txt /*:goto*
+:gr quickfix.txt /*:gr*
+:grep quickfix.txt /*:grep*
+:grepa quickfix.txt /*:grepa*
+:grepadd quickfix.txt /*:grepadd*
+:gu gui_x11.txt /*:gu*
+:gui gui_x11.txt /*:gui*
+:gv gui_x11.txt /*:gv*
+:gvim gui_x11.txt /*:gvim*
+:h helphelp.txt /*:h*
+:ha print.txt /*:ha*
+:hardcopy print.txt /*:hardcopy*
+:help helphelp.txt /*:help*
+:helpc helphelp.txt /*:helpc*
+:helpclose helphelp.txt /*:helpclose*
+:helpf helphelp.txt /*:helpf*
+:helpfind helphelp.txt /*:helpfind*
+:helpg helphelp.txt /*:helpg*
+:helpgrep helphelp.txt /*:helpgrep*
+:helpt helphelp.txt /*:helpt*
+:helptags helphelp.txt /*:helptags*
+:hi syntax.txt /*:hi*
+:hi-clear syntax.txt /*:hi-clear*
+:hi-default syntax.txt /*:hi-default*
+:hi-link syntax.txt /*:hi-link*
+:hi-normal syntax.txt /*:hi-normal*
+:hi-normal-cterm syntax.txt /*:hi-normal-cterm*
+:hide windows.txt /*:hide*
+:highlight syntax.txt /*:highlight*
+:highlight-default syntax.txt /*:highlight-default*
+:highlight-link syntax.txt /*:highlight-link*
+:highlight-normal syntax.txt /*:highlight-normal*
+:highlight-verbose syntax.txt /*:highlight-verbose*
+:his cmdline.txt /*:his*
+:history cmdline.txt /*:history*
+:history-indexing cmdline.txt /*:history-indexing*
+:hor windows.txt /*:hor*
+:horizontal windows.txt /*:horizontal*
+:i insert.txt /*:i*
+:ia map.txt /*:ia*
+:iabbrev map.txt /*:iabbrev*
+:iabc map.txt /*:iabc*
+:iabclear map.txt /*:iabclear*
+:if eval.txt /*:if*
+:ij tagsrch.txt /*:ij*
+:ijump tagsrch.txt /*:ijump*
+:il tagsrch.txt /*:il*
+:ilist tagsrch.txt /*:ilist*
+:im map.txt /*:im*
+:imap map.txt /*:imap*
+:imap_l map.txt /*:imap_l*
+:imapc map.txt /*:imapc*
+:imapclear map.txt /*:imapclear*
+:ime gui.txt /*:ime*
+:imenu gui.txt /*:imenu*
+:imp vim9.txt /*:imp*
+:import vim9.txt /*:import*
+:import-as vim9.txt /*:import-as*
+:import-cycle vim9.txt /*:import-cycle*
+:in insert.txt /*:in*
+:index index.txt /*:index*
+:ino map.txt /*:ino*
+:inor map.txt /*:inor*
+:inorea map.txt /*:inorea*
+:inoreabbrev map.txt /*:inoreabbrev*
+:inoremap map.txt /*:inoremap*
+:inoreme gui.txt /*:inoreme*
+:inoremenu gui.txt /*:inoremenu*
+:insert insert.txt /*:insert*
+:interface vim9class.txt /*:interface*
+:intro starting.txt /*:intro*
+:is tagsrch.txt /*:is*
+:isearch tagsrch.txt /*:isearch*
+:isp tagsrch.txt /*:isp*
+:isplit tagsrch.txt /*:isplit*
+:iu map.txt /*:iu*
+:iuna map.txt /*:iuna*
+:iunabbrev map.txt /*:iunabbrev*
+:iunmap map.txt /*:iunmap*
+:iunme gui.txt /*:iunme*
+:iunmenu gui.txt /*:iunmenu*
+:j change.txt /*:j*
+:join change.txt /*:join*
+:ju motion.txt /*:ju*
+:jumps motion.txt /*:jumps*
+:k motion.txt /*:k*
+:kee motion.txt /*:kee*
+:keep motion.txt /*:keep*
+:keepa editing.txt /*:keepa*
+:keepalt editing.txt /*:keepalt*
+:keepj motion.txt /*:keepj*
+:keepjumps motion.txt /*:keepjumps*
+:keepmarks motion.txt /*:keepmarks*
+:keepp cmdline.txt /*:keepp*
+:keeppatterns cmdline.txt /*:keeppatterns*
+:l various.txt /*:l*
+:lN quickfix.txt /*:lN*
+:lNext quickfix.txt /*:lNext*
+:lNf quickfix.txt /*:lNf*
+:lNfile quickfix.txt /*:lNfile*
+:la editing.txt /*:la*
+:lab quickfix.txt /*:lab*
+:labove quickfix.txt /*:labove*
+:lad quickfix.txt /*:lad*
+:laddb quickfix.txt /*:laddb*
+:laddbuffer quickfix.txt /*:laddbuffer*
+:laddexpr quickfix.txt /*:laddexpr*
+:laddf quickfix.txt /*:laddf*
+:laddfile quickfix.txt /*:laddfile*
+:laf quickfix.txt /*:laf*
+:lafter quickfix.txt /*:lafter*
+:lan mlang.txt /*:lan*
+:lang mlang.txt /*:lang*
+:language mlang.txt /*:language*
+:last editing.txt /*:last*
+:lat undo.txt /*:lat*
+:later undo.txt /*:later*
+:lb quickfix.txt /*:lb*
+:lbe quickfix.txt /*:lbe*
+:lbefore quickfix.txt /*:lbefore*
+:lbel quickfix.txt /*:lbel*
+:lbelow quickfix.txt /*:lbelow*
+:lbo quickfix.txt /*:lbo*
+:lbottom quickfix.txt /*:lbottom*
+:lbuffer quickfix.txt /*:lbuffer*
+:lc editing.txt /*:lc*
+:lcd editing.txt /*:lcd*
+:lcd- editing.txt /*:lcd-*
+:lch editing.txt /*:lch*
+:lchdir editing.txt /*:lchdir*
+:lcl quickfix.txt /*:lcl*
+:lclose quickfix.txt /*:lclose*
+:lcs if_cscop.txt /*:lcs*
+:lcscope if_cscop.txt /*:lcscope*
+:ldo quickfix.txt /*:ldo*
+:le change.txt /*:le*
+:left change.txt /*:left*
+:lefta windows.txt /*:lefta*
+:leftabove windows.txt /*:leftabove*
+:leg vim9.txt /*:leg*
+:legacy vim9.txt /*:legacy*
+:let eval.txt /*:let*
+:let%= eval.txt /*:let%=*
+:let+= eval.txt /*:let+=*
+:let-$ eval.txt /*:let-$*
+:let-& eval.txt /*:let-&*
+:let-= eval.txt /*:let-=*
+:let-@ eval.txt /*:let-@*
+:let-environment eval.txt /*:let-environment*
+:let-heredoc eval.txt /*:let-heredoc*
+:let-option eval.txt /*:let-option*
+:let-register eval.txt /*:let-register*
+:let-unpack eval.txt /*:let-unpack*
+:let..= eval.txt /*:let..=*
+:let.= eval.txt /*:let.=*
+:let/= eval.txt /*:let\/=*
+:let=<< eval.txt /*:let=<<*
+:letstar= eval.txt /*:letstar=*
+:lex quickfix.txt /*:lex*
+:lexpr quickfix.txt /*:lexpr*
+:lf quickfix.txt /*:lf*
+:lfdo quickfix.txt /*:lfdo*
+:lfi quickfix.txt /*:lfi*
+:lfile quickfix.txt /*:lfile*
+:lfir quickfix.txt /*:lfir*
+:lfirst quickfix.txt /*:lfirst*
+:lg quickfix.txt /*:lg*
+:lge quickfix.txt /*:lge*
+:lgetb quickfix.txt /*:lgetb*
+:lgetbuffer quickfix.txt /*:lgetbuffer*
+:lgete quickfix.txt /*:lgete*
+:lgetexpr quickfix.txt /*:lgetexpr*
+:lgetfile quickfix.txt /*:lgetfile*
+:lgr quickfix.txt /*:lgr*
+:lgrep quickfix.txt /*:lgrep*
+:lgrepa quickfix.txt /*:lgrepa*
+:lgrepadd quickfix.txt /*:lgrepadd*
+:lh helphelp.txt /*:lh*
+:lhelpgrep helphelp.txt /*:lhelpgrep*
+:lhi quickfix.txt /*:lhi*
+:lhistory quickfix.txt /*:lhistory*
+:list various.txt /*:list*
+:ll quickfix.txt /*:ll*
+:lla quickfix.txt /*:lla*
+:llast quickfix.txt /*:llast*
+:lli quickfix.txt /*:lli*
+:llist quickfix.txt /*:llist*
+:lm map.txt /*:lm*
+:lma map.txt /*:lma*
+:lmak quickfix.txt /*:lmak*
+:lmake quickfix.txt /*:lmake*
+:lmap map.txt /*:lmap*
+:lmap_l map.txt /*:lmap_l*
+:lmapc map.txt /*:lmapc*
+:lmapclear map.txt /*:lmapclear*
+:ln map.txt /*:ln*
+:lne quickfix.txt /*:lne*
+:lnew quickfix.txt /*:lnew*
+:lnewer quickfix.txt /*:lnewer*
+:lnext quickfix.txt /*:lnext*
+:lnf quickfix.txt /*:lnf*
+:lnfile quickfix.txt /*:lnfile*
+:lnoremap map.txt /*:lnoremap*
+:lo starting.txt /*:lo*
+:loadk mbyte.txt /*:loadk*
+:loadkeymap mbyte.txt /*:loadkeymap*
+:loadview starting.txt /*:loadview*
+:loc motion.txt /*:loc*
+:lock motion.txt /*:lock*
+:lockmarks motion.txt /*:lockmarks*
+:lockv eval.txt /*:lockv*
+:lockvar eval.txt /*:lockvar*
+:lol quickfix.txt /*:lol*
+:lolder quickfix.txt /*:lolder*
+:lop quickfix.txt /*:lop*
+:lopen quickfix.txt /*:lopen*
+:lp quickfix.txt /*:lp*
+:lpf quickfix.txt /*:lpf*
+:lpfile quickfix.txt /*:lpfile*
+:lprev quickfix.txt /*:lprev*
+:lprevious quickfix.txt /*:lprevious*
+:lr quickfix.txt /*:lr*
+:lrewind quickfix.txt /*:lrewind*
+:ls windows.txt /*:ls*
+:lt tagsrch.txt /*:lt*
+:ltag tagsrch.txt /*:ltag*
+:lu map.txt /*:lu*
+:lua if_lua.txt /*:lua*
+:luado if_lua.txt /*:luado*
+:luafile if_lua.txt /*:luafile*
+:lunmap map.txt /*:lunmap*
+:lv quickfix.txt /*:lv*
+:lvimgrep quickfix.txt /*:lvimgrep*
+:lvimgrepa quickfix.txt /*:lvimgrepa*
+:lvimgrepadd quickfix.txt /*:lvimgrepadd*
+:lw quickfix.txt /*:lw*
+:lwindow quickfix.txt /*:lwindow*
+:m change.txt /*:m*
+:ma motion.txt /*:ma*
+:mak quickfix.txt /*:mak*
+:make quickfix.txt /*:make*
+:make_makeprg quickfix.txt /*:make_makeprg*
+:map map.txt /*:map*
+:map! map.txt /*:map!*
+:map-<buffer> map.txt /*:map-<buffer>*
+:map-<expr> map.txt /*:map-<expr>*
+:map-<nowait> map.txt /*:map-<nowait>*
+:map-<script> map.txt /*:map-<script>*
+:map-<silent> map.txt /*:map-<silent>*
+:map-<special> map.txt /*:map-<special>*
+:map-<unique> map.txt /*:map-<unique>*
+:map-alt-keys map.txt /*:map-alt-keys*
+:map-arguments map.txt /*:map-arguments*
+:map-buffer map.txt /*:map-buffer*
+:map-cmd map.txt /*:map-cmd*
+:map-commands map.txt /*:map-commands*
+:map-expression map.txt /*:map-expression*
+:map-local map.txt /*:map-local*
+:map-meta-keys map.txt /*:map-meta-keys*
+:map-modes map.txt /*:map-modes*
+:map-nowait map.txt /*:map-nowait*
+:map-operator map.txt /*:map-operator*
+:map-script map.txt /*:map-script*
+:map-silent map.txt /*:map-silent*
+:map-special map.txt /*:map-special*
+:map-special-chars map.txt /*:map-special-chars*
+:map-special-keys map.txt /*:map-special-keys*
+:map-undo map.txt /*:map-undo*
+:map-unique map.txt /*:map-unique*
+:map-verbose map.txt /*:map-verbose*
+:map_l map.txt /*:map_l*
+:map_l! map.txt /*:map_l!*
+:mapc map.txt /*:mapc*
+:mapc! map.txt /*:mapc!*
+:mapclear map.txt /*:mapclear*
+:mapclear! map.txt /*:mapclear!*
+:mark motion.txt /*:mark*
+:marks motion.txt /*:marks*
+:mat pattern.txt /*:mat*
+:match pattern.txt /*:match*
+:me gui.txt /*:me*
+:menu gui.txt /*:menu*
+:menu-<script> gui.txt /*:menu-<script>*
+:menu-<silent> gui.txt /*:menu-<silent>*
+:menu-<special> gui.txt /*:menu-<special>*
+:menu-disable gui.txt /*:menu-disable*
+:menu-enable gui.txt /*:menu-enable*
+:menu-script gui.txt /*:menu-script*
+:menu-silent gui.txt /*:menu-silent*
+:menu-special gui.txt /*:menu-special*
+:menut mlang.txt /*:menut*
+:menutrans mlang.txt /*:menutrans*
+:menutranslate mlang.txt /*:menutranslate*
+:mes message.txt /*:mes*
+:messages message.txt /*:messages*
+:mk starting.txt /*:mk*
+:mkexrc starting.txt /*:mkexrc*
+:mks starting.txt /*:mks*
+:mksession starting.txt /*:mksession*
+:mksp spell.txt /*:mksp*
+:mkspell spell.txt /*:mkspell*
+:mkv starting.txt /*:mkv*
+:mkvi starting.txt /*:mkvi*
+:mkvie starting.txt /*:mkvie*
+:mkview starting.txt /*:mkview*
+:mkvimrc starting.txt /*:mkvimrc*
+:mo change.txt /*:mo*
+:mod term.txt /*:mod*
+:mode term.txt /*:mode*
+:move change.txt /*:move*
+:mz if_mzsch.txt /*:mz*
+:mzf if_mzsch.txt /*:mzf*
+:mzfile if_mzsch.txt /*:mzfile*
+:mzscheme if_mzsch.txt /*:mzscheme*
+:n editing.txt /*:n*
+:nbclose netbeans.txt /*:nbclose*
+:nbkey netbeans.txt /*:nbkey*
+:nbstart netbeans.txt /*:nbstart*
+:ne editing.txt /*:ne*
+:new windows.txt /*:new*
+:next editing.txt /*:next*
+:next_f editing.txt /*:next_f*
+:nm map.txt /*:nm*
+:nmap map.txt /*:nmap*
+:nmap_l map.txt /*:nmap_l*
+:nmapc map.txt /*:nmapc*
+:nmapclear map.txt /*:nmapclear*
+:nme gui.txt /*:nme*
+:nmenu gui.txt /*:nmenu*
+:nn map.txt /*:nn*
+:nnoremap map.txt /*:nnoremap*
+:nnoreme gui.txt /*:nnoreme*
+:nnoremenu gui.txt /*:nnoremenu*
+:no map.txt /*:no*
+:no! map.txt /*:no!*
+:noa autocmd.txt /*:noa*
+:noautocmd autocmd.txt /*:noautocmd*
+:noh pattern.txt /*:noh*
+:nohlsearch pattern.txt /*:nohlsearch*
+:nor map.txt /*:nor*
+:nore map.txt /*:nore*
+:norea map.txt /*:norea*
+:noreabbrev map.txt /*:noreabbrev*
+:norem map.txt /*:norem*
+:noremap map.txt /*:noremap*
+:noremap! map.txt /*:noremap!*
+:noreme gui.txt /*:noreme*
+:noremenu gui.txt /*:noremenu*
+:norm various.txt /*:norm*
+:normal various.txt /*:normal*
+:normal-range various.txt /*:normal-range*
+:nos recover.txt /*:nos*
+:noswapfile recover.txt /*:noswapfile*
+:nu various.txt /*:nu*
+:number various.txt /*:number*
+:nun map.txt /*:nun*
+:nunmap map.txt /*:nunmap*
+:nunme gui.txt /*:nunme*
+:nunmenu gui.txt /*:nunmenu*
+:o vi_diff.txt /*:o*
+:ol starting.txt /*:ol*
+:oldfiles starting.txt /*:oldfiles*
+:om map.txt /*:om*
+:omap map.txt /*:omap*
+:omap_l map.txt /*:omap_l*
+:omapc map.txt /*:omapc*
+:omapclear map.txt /*:omapclear*
+:ome gui.txt /*:ome*
+:omenu gui.txt /*:omenu*
+:on windows.txt /*:on*
+:only windows.txt /*:only*
+:ono map.txt /*:ono*
+:onoremap map.txt /*:onoremap*
+:onoreme gui.txt /*:onoreme*
+:onoremenu gui.txt /*:onoremenu*
+:op vi_diff.txt /*:op*
+:open vi_diff.txt /*:open*
+:opt options.txt /*:opt*
+:options options.txt /*:options*
+:ou map.txt /*:ou*
+:ounmap map.txt /*:ounmap*
+:ounme gui.txt /*:ounme*
+:ounmenu gui.txt /*:ounmenu*
+:ownsyntax syntax.txt /*:ownsyntax*
+:p various.txt /*:p*
+:pa repeat.txt /*:pa*
+:packadd repeat.txt /*:packadd*
+:packl repeat.txt /*:packl*
+:packloadall repeat.txt /*:packloadall*
+:pc windows.txt /*:pc*
+:pclose windows.txt /*:pclose*
+:pe if_perl.txt /*:pe*
+:ped windows.txt /*:ped*
+:pedit windows.txt /*:pedit*
+:perl if_perl.txt /*:perl*
+:perld if_perl.txt /*:perld*
+:perldo if_perl.txt /*:perldo*
+:po tagsrch.txt /*:po*
+:pop tagsrch.txt /*:pop*
+:popu gui.txt /*:popu*
+:popup gui.txt /*:popup*
+:pp windows.txt /*:pp*
+:ppop windows.txt /*:ppop*
+:pr various.txt /*:pr*
+:pre recover.txt /*:pre*
+:preserve recover.txt /*:preserve*
+:prev editing.txt /*:prev*
+:previous editing.txt /*:previous*
+:print various.txt /*:print*
+:pro change.txt /*:pro*
+:prof repeat.txt /*:prof*
+:profd repeat.txt /*:profd*
+:profdel repeat.txt /*:profdel*
+:profile repeat.txt /*:profile*
+:promptfind change.txt /*:promptfind*
+:promptr change.txt /*:promptr*
+:promptrepl change.txt /*:promptrepl*
+:ps windows.txt /*:ps*
+:psearch windows.txt /*:psearch*
+:ptN tagsrch.txt /*:ptN*
+:ptNext tagsrch.txt /*:ptNext*
+:pta windows.txt /*:pta*
+:ptag windows.txt /*:ptag*
+:ptf tagsrch.txt /*:ptf*
+:ptfirst tagsrch.txt /*:ptfirst*
+:ptj tagsrch.txt /*:ptj*
+:ptjump tagsrch.txt /*:ptjump*
+:ptl tagsrch.txt /*:ptl*
+:ptlast tagsrch.txt /*:ptlast*
+:ptn tagsrch.txt /*:ptn*
+:ptnext tagsrch.txt /*:ptnext*
+:ptp tagsrch.txt /*:ptp*
+:ptprevious tagsrch.txt /*:ptprevious*
+:ptr tagsrch.txt /*:ptr*
+:ptrewind tagsrch.txt /*:ptrewind*
+:pts tagsrch.txt /*:pts*
+:ptselect tagsrch.txt /*:ptselect*
+:pu change.txt /*:pu*
+:public vim9class.txt /*:public*
+:put change.txt /*:put*
+:pw editing.txt /*:pw*
+:pwd editing.txt /*:pwd*
+:pwd-verbose editing.txt /*:pwd-verbose*
+:py if_pyth.txt /*:py*
+:py3 if_pyth.txt /*:py3*
+:py3do if_pyth.txt /*:py3do*
+:py3file if_pyth.txt /*:py3file*
+:pydo if_pyth.txt /*:pydo*
+:pyf if_pyth.txt /*:pyf*
+:pyfile if_pyth.txt /*:pyfile*
+:python if_pyth.txt /*:python*
+:python3 if_pyth.txt /*:python3*
+:pythonx if_pyth.txt /*:pythonx*
+:pyx if_pyth.txt /*:pyx*
+:pyxdo if_pyth.txt /*:pyxdo*
+:pyxfile if_pyth.txt /*:pyxfile*
+:q editing.txt /*:q*
+:qa editing.txt /*:qa*
+:qall editing.txt /*:qall*
+:quit editing.txt /*:quit*
+:quita editing.txt /*:quita*
+:quitall editing.txt /*:quitall*
+:quote cmdline.txt /*:quote*
+:r insert.txt /*:r*
+:r! insert.txt /*:r!*
+:range cmdline.txt /*:range*
+:range! change.txt /*:range!*
+:range-closed-fold cmdline.txt /*:range-closed-fold*
+:range-offset cmdline.txt /*:range-offset*
+:range-pattern cmdline.txt /*:range-pattern*
+:re insert.txt /*:re*
+:read insert.txt /*:read*
+:read! insert.txt /*:read!*
+:rec recover.txt /*:rec*
+:recover recover.txt /*:recover*
+:recover-crypt recover.txt /*:recover-crypt*
+:red undo.txt /*:red*
+:redi various.txt /*:redi*
+:redir various.txt /*:redir*
+:redo undo.txt /*:redo*
+:redr various.txt /*:redr*
+:redraw various.txt /*:redraw*
+:redraws various.txt /*:redraws*
+:redrawstatus various.txt /*:redrawstatus*
+:redrawt various.txt /*:redrawt*
+:redrawtabline various.txt /*:redrawtabline*
+:reg change.txt /*:reg*
+:registers change.txt /*:registers*
+:res windows.txt /*:res*
+:resize windows.txt /*:resize*
+:ret change.txt /*:ret*
+:retab change.txt /*:retab*
+:retab! change.txt /*:retab!*
+:retu userfunc.txt /*:retu*
+:return userfunc.txt /*:return*
+:rew editing.txt /*:rew*
+:rewind editing.txt /*:rewind*
+:ri change.txt /*:ri*
+:right change.txt /*:right*
+:rightb windows.txt /*:rightb*
+:rightbelow windows.txt /*:rightbelow*
+:ru repeat.txt /*:ru*
+:rub if_ruby.txt /*:rub*
+:ruby if_ruby.txt /*:ruby*
+:rubyd if_ruby.txt /*:rubyd*
+:rubydo if_ruby.txt /*:rubydo*
+:rubyf if_ruby.txt /*:rubyf*
+:rubyfile if_ruby.txt /*:rubyfile*
+:rundo undo.txt /*:rundo*
+:runtime repeat.txt /*:runtime*
+:rv starting.txt /*:rv*
+:rviminfo starting.txt /*:rviminfo*
+:s change.txt /*:s*
+:s% change.txt /*:s%*
+:sI change.txt /*:sI*
+:sIc change.txt /*:sIc*
+:sIe change.txt /*:sIe*
+:sIg change.txt /*:sIg*
+:sIl change.txt /*:sIl*
+:sIn change.txt /*:sIn*
+:sIp change.txt /*:sIp*
+:sIr change.txt /*:sIr*
+:sN windows.txt /*:sN*
+:sNext windows.txt /*:sNext*
+:s\= change.txt /*:s\\=*
+:s_# change.txt /*:s_#*
+:s_I change.txt /*:s_I*
+:s_c change.txt /*:s_c*
+:s_e change.txt /*:s_e*
+:s_flags change.txt /*:s_flags*
+:s_g change.txt /*:s_g*
+:s_i change.txt /*:s_i*
+:s_l change.txt /*:s_l*
+:s_n change.txt /*:s_n*
+:s_p change.txt /*:s_p*
+:s_r change.txt /*:s_r*
+:sa windows.txt /*:sa*
+:sal windows.txt /*:sal*
+:sall windows.txt /*:sall*
+:san eval.txt /*:san*
+:sandbox eval.txt /*:sandbox*
+:sargument windows.txt /*:sargument*
+:sav editing.txt /*:sav*
+:saveas editing.txt /*:saveas*
+:sb windows.txt /*:sb*
+:sbN windows.txt /*:sbN*
+:sbNext windows.txt /*:sbNext*
+:sba windows.txt /*:sba*
+:sball windows.txt /*:sball*
+:sbf windows.txt /*:sbf*
+:sbfirst windows.txt /*:sbfirst*
+:sbl windows.txt /*:sbl*
+:sblast windows.txt /*:sblast*
+:sbm windows.txt /*:sbm*
+:sbmodified windows.txt /*:sbmodified*
+:sbn windows.txt /*:sbn*
+:sbnext windows.txt /*:sbnext*
+:sbp windows.txt /*:sbp*
+:sbprevious windows.txt /*:sbprevious*
+:sbr windows.txt /*:sbr*
+:sbrewind windows.txt /*:sbrewind*
+:sbuffer windows.txt /*:sbuffer*
+:sc change.txt /*:sc*
+:scI change.txt /*:scI*
+:sce change.txt /*:sce*
+:scg change.txt /*:scg*
+:sci change.txt /*:sci*
+:scl change.txt /*:scl*
+:scp change.txt /*:scp*
+:scr repeat.txt /*:scr*
+:script repeat.txt /*:script*
+:scripte repeat.txt /*:scripte*
+:scriptencoding repeat.txt /*:scriptencoding*
+:scriptnames repeat.txt /*:scriptnames*
+:scriptv repeat.txt /*:scriptv*
+:scriptversion repeat.txt /*:scriptversion*
+:scs if_cscop.txt /*:scs*
+:scscope if_cscop.txt /*:scscope*
+:se options.txt /*:se*
+:search-args tagsrch.txt /*:search-args*
+:set options.txt /*:set*
+:set+= options.txt /*:set+=*
+:set-! options.txt /*:set-!*
+:set-& options.txt /*:set-&*
+:set-&vi options.txt /*:set-&vi*
+:set-&vim options.txt /*:set-&vim*
+:set-= options.txt /*:set-=*
+:set-args options.txt /*:set-args*
+:set-browse options.txt /*:set-browse*
+:set-default options.txt /*:set-default*
+:set-inv options.txt /*:set-inv*
+:set-termcap options.txt /*:set-termcap*
+:set-verbose options.txt /*:set-verbose*
+:set^= options.txt /*:set^=*
+:set_env options.txt /*:set_env*
+:setf options.txt /*:setf*
+:setfiletype options.txt /*:setfiletype*
+:setg options.txt /*:setg*
+:setglobal options.txt /*:setglobal*
+:setl options.txt /*:setl*
+:setlocal options.txt /*:setlocal*
+:sf windows.txt /*:sf*
+:sfi windows.txt /*:sfi*
+:sfind windows.txt /*:sfind*
+:sfir windows.txt /*:sfir*
+:sfirst windows.txt /*:sfirst*
+:sg change.txt /*:sg*
+:sgI change.txt /*:sgI*
+:sgc change.txt /*:sgc*
+:sge change.txt /*:sge*
+:sgi change.txt /*:sgi*
+:sgl change.txt /*:sgl*
+:sgn change.txt /*:sgn*
+:sgp change.txt /*:sgp*
+:sgr change.txt /*:sgr*
+:sh various.txt /*:sh*
+:shell various.txt /*:shell*
+:si change.txt /*:si*
+:sic change.txt /*:sic*
+:sie change.txt /*:sie*
+:sig sign.txt /*:sig*
+:sign sign.txt /*:sign*
+:sign-define sign.txt /*:sign-define*
+:sign-fname sign.txt /*:sign-fname*
+:sign-jump sign.txt /*:sign-jump*
+:sign-list sign.txt /*:sign-list*
+:sign-place sign.txt /*:sign-place*
+:sign-place-list sign.txt /*:sign-place-list*
+:sign-undefine sign.txt /*:sign-undefine*
+:sign-unplace sign.txt /*:sign-unplace*
+:sil various.txt /*:sil*
+:silent various.txt /*:silent*
+:silent! various.txt /*:silent!*
+:sim gui_w32.txt /*:sim*
+:simalt gui_w32.txt /*:simalt*
+:sin change.txt /*:sin*
+:sip change.txt /*:sip*
+:sir change.txt /*:sir*
+:sl various.txt /*:sl*
+:sl! various.txt /*:sl!*
+:sla windows.txt /*:sla*
+:slast windows.txt /*:slast*
+:sleep various.txt /*:sleep*
+:sleep! various.txt /*:sleep!*
+:sm change.txt /*:sm*
+:smagic change.txt /*:smagic*
+:smap map.txt /*:smap*
+:smap_l map.txt /*:smap_l*
+:smapc map.txt /*:smapc*
+:smapclear map.txt /*:smapclear*
+:sme gui.txt /*:sme*
+:smenu gui.txt /*:smenu*
+:smile index.txt /*:smile*
+:sn windows.txt /*:sn*
+:snext windows.txt /*:snext*
+:sno change.txt /*:sno*
+:snomagic change.txt /*:snomagic*
+:snor map.txt /*:snor*
+:snore map.txt /*:snore*
+:snoremap map.txt /*:snoremap*
+:snoreme gui.txt /*:snoreme*
+:snoremenu gui.txt /*:snoremenu*
+:so repeat.txt /*:so*
+:sor change.txt /*:sor*
+:sort change.txt /*:sort*
+:source repeat.txt /*:source*
+:source! repeat.txt /*:source!*
+:source-range repeat.txt /*:source-range*
+:source_crnl repeat.txt /*:source_crnl*
+:sp windows.txt /*:sp*
+:spe spell.txt /*:spe*
+:spelld spell.txt /*:spelld*
+:spelldump spell.txt /*:spelldump*
+:spellgood spell.txt /*:spellgood*
+:spelli spell.txt /*:spelli*
+:spellinfo spell.txt /*:spellinfo*
+:spellr spell.txt /*:spellr*
+:spellra spell.txt /*:spellra*
+:spellrare spell.txt /*:spellrare*
+:spellrepall spell.txt /*:spellrepall*
+:spellu spell.txt /*:spellu*
+:spellundo spell.txt /*:spellundo*
+:spellw spell.txt /*:spellw*
+:spellwrong spell.txt /*:spellwrong*
+:split windows.txt /*:split*
+:split_f windows.txt /*:split_f*
+:spr windows.txt /*:spr*
+:sprevious windows.txt /*:sprevious*
+:sr change.txt /*:sr*
+:srI change.txt /*:srI*
+:src change.txt /*:src*
+:sre windows.txt /*:sre*
+:srewind windows.txt /*:srewind*
+:srg change.txt /*:srg*
+:sri change.txt /*:sri*
+:srl change.txt /*:srl*
+:srn change.txt /*:srn*
+:srp change.txt /*:srp*
+:st starting.txt /*:st*
+:sta windows.txt /*:sta*
+:stag windows.txt /*:stag*
+:star cmdline.txt /*:star*
+:star-compatible repeat.txt /*:star-compatible*
+:star-visual-range cmdline.txt /*:star-visual-range*
+:start insert.txt /*:start*
+:startgreplace insert.txt /*:startgreplace*
+:startinsert insert.txt /*:startinsert*
+:startreplace insert.txt /*:startreplace*
+:static vim9class.txt /*:static*
+:stj tagsrch.txt /*:stj*
+:stjump tagsrch.txt /*:stjump*
+:stop starting.txt /*:stop*
+:stopi insert.txt /*:stopi*
+:stopinsert insert.txt /*:stopinsert*
+:sts tagsrch.txt /*:sts*
+:stselect tagsrch.txt /*:stselect*
+:su change.txt /*:su*
+:substitute change.txt /*:substitute*
+:substitute-repeat change.txt /*:substitute-repeat*
+:sun windows.txt /*:sun*
+:sunhide windows.txt /*:sunhide*
+:sunm map.txt /*:sunm*
+:sunmap map.txt /*:sunmap*
+:sunme gui.txt /*:sunme*
+:sunmenu gui.txt /*:sunmenu*
+:sus starting.txt /*:sus*
+:suspend starting.txt /*:suspend*
+:sv windows.txt /*:sv*
+:sview windows.txt /*:sview*
+:sw recover.txt /*:sw*
+:swapname recover.txt /*:swapname*
+:sy syntax.txt /*:sy*
+:syn syntax.txt /*:syn*
+:syn-arguments syntax.txt /*:syn-arguments*
+:syn-case syntax.txt /*:syn-case*
+:syn-cchar syntax.txt /*:syn-cchar*
+:syn-clear syntax.txt /*:syn-clear*
+:syn-cluster syntax.txt /*:syn-cluster*
+:syn-conceal syntax.txt /*:syn-conceal*
+:syn-conceal-implicit syntax.txt /*:syn-conceal-implicit*
+:syn-concealends syntax.txt /*:syn-concealends*
+:syn-contained syntax.txt /*:syn-contained*
+:syn-containedin syntax.txt /*:syn-containedin*
+:syn-contains syntax.txt /*:syn-contains*
+:syn-context syntax.txt /*:syn-context*
+:syn-default-override usr_06.txt /*:syn-default-override*
+:syn-define syntax.txt /*:syn-define*
+:syn-display syntax.txt /*:syn-display*
+:syn-enable syntax.txt /*:syn-enable*
+:syn-end syntax.txt /*:syn-end*
+:syn-excludenl syntax.txt /*:syn-excludenl*
+:syn-ext-match syntax.txt /*:syn-ext-match*
+:syn-extend syntax.txt /*:syn-extend*
+:syn-file-remarks syntax.txt /*:syn-file-remarks*
+:syn-files syntax.txt /*:syn-files*
+:syn-fold syntax.txt /*:syn-fold*
+:syn-foldlevel syntax.txt /*:syn-foldlevel*
+:syn-include syntax.txt /*:syn-include*
+:syn-iskeyword syntax.txt /*:syn-iskeyword*
+:syn-keepend syntax.txt /*:syn-keepend*
+:syn-keyword syntax.txt /*:syn-keyword*
+:syn-lc syntax.txt /*:syn-lc*
+:syn-leading syntax.txt /*:syn-leading*
+:syn-list syntax.txt /*:syn-list*
+:syn-manual usr_06.txt /*:syn-manual*
+:syn-match syntax.txt /*:syn-match*
+:syn-matchgroup syntax.txt /*:syn-matchgroup*
+:syn-multi-line syntax.txt /*:syn-multi-line*
+:syn-nextgroup syntax.txt /*:syn-nextgroup*
+:syn-off syntax.txt /*:syn-off*
+:syn-on syntax.txt /*:syn-on*
+:syn-oneline syntax.txt /*:syn-oneline*
+:syn-pattern syntax.txt /*:syn-pattern*
+:syn-pattern-offset syntax.txt /*:syn-pattern-offset*
+:syn-priority syntax.txt /*:syn-priority*
+:syn-qstart syntax.txt /*:syn-qstart*
+:syn-region syntax.txt /*:syn-region*
+:syn-reset syntax.txt /*:syn-reset*
+:syn-skip syntax.txt /*:syn-skip*
+:syn-skipempty syntax.txt /*:syn-skipempty*
+:syn-skipnl syntax.txt /*:syn-skipnl*
+:syn-skipwhite syntax.txt /*:syn-skipwhite*
+:syn-spell syntax.txt /*:syn-spell*
+:syn-start syntax.txt /*:syn-start*
+:syn-sync syntax.txt /*:syn-sync*
+:syn-sync-ccomment syntax.txt /*:syn-sync-ccomment*
+:syn-sync-first syntax.txt /*:syn-sync-first*
+:syn-sync-fourth syntax.txt /*:syn-sync-fourth*
+:syn-sync-linebreaks syntax.txt /*:syn-sync-linebreaks*
+:syn-sync-maxlines syntax.txt /*:syn-sync-maxlines*
+:syn-sync-minlines syntax.txt /*:syn-sync-minlines*
+:syn-sync-second syntax.txt /*:syn-sync-second*
+:syn-sync-third syntax.txt /*:syn-sync-third*
+:syn-transparent syntax.txt /*:syn-transparent*
+:sync scroll.txt /*:sync*
+:syncbind scroll.txt /*:syncbind*
+:syntax syntax.txt /*:syntax*
+:syntax-enable syntax.txt /*:syntax-enable*
+:syntax-off syntax.txt /*:syntax-off*
+:syntax-on syntax.txt /*:syntax-on*
+:syntax-reset syntax.txt /*:syntax-reset*
+:syntime syntax.txt /*:syntime*
+:t change.txt /*:t*
+:tN tagsrch.txt /*:tN*
+:tNext tagsrch.txt /*:tNext*
+:ta tagsrch.txt /*:ta*
+:tab tabpage.txt /*:tab*
+:tabN tabpage.txt /*:tabN*
+:tabNext tabpage.txt /*:tabNext*
+:tabc tabpage.txt /*:tabc*
+:tabclose tabpage.txt /*:tabclose*
+:tabd tabpage.txt /*:tabd*
+:tabdo tabpage.txt /*:tabdo*
+:tabe tabpage.txt /*:tabe*
+:tabedit tabpage.txt /*:tabedit*
+:tabf tabpage.txt /*:tabf*
+:tabfind tabpage.txt /*:tabfind*
+:tabfir tabpage.txt /*:tabfir*
+:tabfirst tabpage.txt /*:tabfirst*
+:tabl tabpage.txt /*:tabl*
+:tablast tabpage.txt /*:tablast*
+:tabm tabpage.txt /*:tabm*
+:tabmove tabpage.txt /*:tabmove*
+:tabn tabpage.txt /*:tabn*
+:tabnew tabpage.txt /*:tabnew*
+:tabnext tabpage.txt /*:tabnext*
+:tabo tabpage.txt /*:tabo*
+:tabonly tabpage.txt /*:tabonly*
+:tabp tabpage.txt /*:tabp*
+:tabprevious tabpage.txt /*:tabprevious*
+:tabr tabpage.txt /*:tabr*
+:tabrewind tabpage.txt /*:tabrewind*
+:tabs tabpage.txt /*:tabs*
+:tag tagsrch.txt /*:tag*
+:tags tagsrch.txt /*:tags*
+:tc editing.txt /*:tc*
+:tcd editing.txt /*:tcd*
+:tcd- editing.txt /*:tcd-*
+:tch editing.txt /*:tch*
+:tchdir editing.txt /*:tchdir*
+:tcl if_tcl.txt /*:tcl*
+:tcld if_tcl.txt /*:tcld*
+:tcldo if_tcl.txt /*:tcldo*
+:tclf if_tcl.txt /*:tclf*
+:tclfile if_tcl.txt /*:tclfile*
+:te gui_w32.txt /*:te*
+:tearoff gui_w32.txt /*:tearoff*
+:ter terminal.txt /*:ter*
+:terminal terminal.txt /*:terminal*
+:tf tagsrch.txt /*:tf*
+:tfirst tagsrch.txt /*:tfirst*
+:th eval.txt /*:th*
+:throw eval.txt /*:throw*
+:tj tagsrch.txt /*:tj*
+:tjump tagsrch.txt /*:tjump*
+:tl tagsrch.txt /*:tl*
+:tlast tagsrch.txt /*:tlast*
+:tlm gui.txt /*:tlm*
+:tlmenu gui.txt /*:tlmenu*
+:tln gui.txt /*:tln*
+:tlnoremenu gui.txt /*:tlnoremenu*
+:tlu gui.txt /*:tlu*
+:tlunmenu gui.txt /*:tlunmenu*
+:tm gui.txt /*:tm*
+:tma map.txt /*:tma*
+:tmap map.txt /*:tmap*
+:tmap_l map.txt /*:tmap_l*
+:tmapc map.txt /*:tmapc*
+:tmapclear map.txt /*:tmapclear*
+:tmenu gui.txt /*:tmenu*
+:tn tagsrch.txt /*:tn*
+:tnext tagsrch.txt /*:tnext*
+:tno map.txt /*:tno*
+:tnoremap map.txt /*:tnoremap*
+:topleft windows.txt /*:topleft*
+:tp tagsrch.txt /*:tp*
+:tprevious tagsrch.txt /*:tprevious*
+:tr tagsrch.txt /*:tr*
+:trewind tagsrch.txt /*:trewind*
+:try eval.txt /*:try*
+:ts tagsrch.txt /*:ts*
+:tselect tagsrch.txt /*:tselect*
+:tu gui.txt /*:tu*
+:tunma map.txt /*:tunma*
+:tunmap map.txt /*:tunmap*
+:tunmenu gui.txt /*:tunmenu*
+:type vim9class.txt /*:type*
+:u undo.txt /*:u*
+:un undo.txt /*:un*
+:una map.txt /*:una*
+:unabbreviate map.txt /*:unabbreviate*
+:undo undo.txt /*:undo*
+:undoj undo.txt /*:undoj*
+:undojoin undo.txt /*:undojoin*
+:undol undo.txt /*:undol*
+:undolist undo.txt /*:undolist*
+:unh windows.txt /*:unh*
+:unhide windows.txt /*:unhide*
+:unl eval.txt /*:unl*
+:unlet eval.txt /*:unlet*
+:unlet-$ eval.txt /*:unlet-$*
+:unlet-environment eval.txt /*:unlet-environment*
+:unlo eval.txt /*:unlo*
+:unlockvar eval.txt /*:unlockvar*
+:unm map.txt /*:unm*
+:unm! map.txt /*:unm!*
+:unmap map.txt /*:unmap*
+:unmap! map.txt /*:unmap!*
+:unme gui.txt /*:unme*
+:unmenu gui.txt /*:unmenu*
+:unmenu-all gui.txt /*:unmenu-all*
+:uns various.txt /*:uns*
+:unsilent various.txt /*:unsilent*
+:up editing.txt /*:up*
+:update editing.txt /*:update*
+:v repeat.txt /*:v*
+:var vim9.txt /*:var*
+:ve various.txt /*:ve*
+:ver various.txt /*:ver*
+:verb various.txt /*:verb*
+:verbose various.txt /*:verbose*
+:verbose-cmd various.txt /*:verbose-cmd*
+:version various.txt /*:version*
+:vert windows.txt /*:vert*
+:vertical windows.txt /*:vertical*
+:vertical-resize windows.txt /*:vertical-resize*
+:vglobal repeat.txt /*:vglobal*
+:vi editing.txt /*:vi*
+:vie editing.txt /*:vie*
+:view editing.txt /*:view*
+:vim quickfix.txt /*:vim*
+:vim9 vim9.txt /*:vim9*
+:vim9cmd vim9.txt /*:vim9cmd*
+:vim9s repeat.txt /*:vim9s*
+:vim9script repeat.txt /*:vim9script*
+:vimgrep quickfix.txt /*:vimgrep*
+:vimgrepa quickfix.txt /*:vimgrepa*
+:vimgrepadd quickfix.txt /*:vimgrepadd*
+:visual editing.txt /*:visual*
+:visual_example visual.txt /*:visual_example*
+:viu helphelp.txt /*:viu*
+:viusage helphelp.txt /*:viusage*
+:vm map.txt /*:vm*
+:vmap map.txt /*:vmap*
+:vmap_l map.txt /*:vmap_l*
+:vmapc map.txt /*:vmapc*
+:vmapclear map.txt /*:vmapclear*
+:vme gui.txt /*:vme*
+:vmenu gui.txt /*:vmenu*
+:vn map.txt /*:vn*
+:vne windows.txt /*:vne*
+:vnew windows.txt /*:vnew*
+:vnoremap map.txt /*:vnoremap*
+:vnoreme gui.txt /*:vnoreme*
+:vnoremenu gui.txt /*:vnoremenu*
+:vs windows.txt /*:vs*
+:vsplit windows.txt /*:vsplit*
+:vu map.txt /*:vu*
+:vunmap map.txt /*:vunmap*
+:vunme gui.txt /*:vunme*
+:vunmenu gui.txt /*:vunmenu*
+:w editing.txt /*:w*
+:w! editing.txt /*:w!*
+:wN editing.txt /*:wN*
+:wNext editing.txt /*:wNext*
+:w_a editing.txt /*:w_a*
+:w_c editing.txt /*:w_c*
+:w_f editing.txt /*:w_f*
+:wa editing.txt /*:wa*
+:wall editing.txt /*:wall*
+:wh eval.txt /*:wh*
+:while eval.txt /*:while*
+:win gui.txt /*:win*
+:winc windows.txt /*:winc*
+:wincmd windows.txt /*:wincmd*
+:windo windows.txt /*:windo*
+:winp gui.txt /*:winp*
+:winpos gui.txt /*:winpos*
+:winsize gui.txt /*:winsize*
+:wn editing.txt /*:wn*
+:wnext editing.txt /*:wnext*
+:wp editing.txt /*:wp*
+:wprevious editing.txt /*:wprevious*
+:wq editing.txt /*:wq*
+:wqa editing.txt /*:wqa*
+:wqall editing.txt /*:wqall*
+:write editing.txt /*:write*
+:write_a editing.txt /*:write_a*
+:write_c editing.txt /*:write_c*
+:write_f editing.txt /*:write_f*
+:wundo undo.txt /*:wundo*
+:wv starting.txt /*:wv*
+:wviminfo starting.txt /*:wviminfo*
+:x editing.txt /*:x*
+:xa editing.txt /*:xa*
+:xall editing.txt /*:xall*
+:xit editing.txt /*:xit*
+:xm map.txt /*:xm*
+:xmap map.txt /*:xmap*
+:xmap_l map.txt /*:xmap_l*
+:xmapc map.txt /*:xmapc*
+:xmapclear map.txt /*:xmapclear*
+:xme gui.txt /*:xme*
+:xmenu gui.txt /*:xmenu*
+:xn map.txt /*:xn*
+:xnoremap map.txt /*:xnoremap*
+:xnoreme gui.txt /*:xnoreme*
+:xnoremenu gui.txt /*:xnoremenu*
+:xr various.txt /*:xr*
+:xrestore various.txt /*:xrestore*
+:xu map.txt /*:xu*
+:xunmap map.txt /*:xunmap*
+:xunme gui.txt /*:xunme*
+:xunmenu gui.txt /*:xunmenu*
+:y change.txt /*:y*
+:yank change.txt /*:yank*
+:z various.txt /*:z*
+:z! various.txt /*:z!*
+:z# various.txt /*:z#*
+:~ change.txt /*:~*
+; motion.txt /*;*
+< change.txt /*<*
+<2-LeftMouse> term.txt /*<2-LeftMouse>*
+<3-LeftMouse> term.txt /*<3-LeftMouse>*
+<4-LeftMouse> term.txt /*<4-LeftMouse>*
+<< change.txt /*<<*
+<> intro.txt /*<>*
+<A- intro.txt /*<A-*
+<A-LeftMouse> term.txt /*<A-LeftMouse>*
+<A-RightMouse> term.txt /*<A-RightMouse>*
+<BS> motion.txt /*<BS>*
+<Bar> intro.txt /*<Bar>*
+<Bslash> intro.txt /*<Bslash>*
+<C- intro.txt /*<C-*
+<C-Del> os_dos.txt /*<C-Del>*
+<C-End> motion.txt /*<C-End>*
+<C-Home> motion.txt /*<C-Home>*
+<C-Insert> os_dos.txt /*<C-Insert>*
+<C-Left> motion.txt /*<C-Left>*
+<C-LeftMouse> tagsrch.txt /*<C-LeftMouse>*
+<C-PageDown> tabpage.txt /*<C-PageDown>*
+<C-PageUp> tabpage.txt /*<C-PageUp>*
+<C-Right> motion.txt /*<C-Right>*
+<C-RightMouse> tagsrch.txt /*<C-RightMouse>*
+<C-ScrollWheelDown> scroll.txt /*<C-ScrollWheelDown>*
+<C-ScrollWheelLeft> scroll.txt /*<C-ScrollWheelLeft>*
+<C-ScrollWheelRight> scroll.txt /*<C-ScrollWheelRight>*
+<C-ScrollWheelUp> scroll.txt /*<C-ScrollWheelUp>*
+<C-Tab> tabpage.txt /*<C-Tab>*
+<CR> motion.txt /*<CR>*
+<CSI> intro.txt /*<CSI>*
+<Char-> map.txt /*<Char->*
+<Char> map.txt /*<Char>*
+<Cmd> map.txt /*<Cmd>*
+<CursorHold> autocmd.txt /*<CursorHold>*
+<D- intro.txt /*<D-*
+<D-c> os_mac.txt /*<D-c>*
+<D-v> os_mac.txt /*<D-v>*
+<D-x> os_mac.txt /*<D-x>*
+<Del> change.txt /*<Del>*
+<Down> motion.txt /*<Down>*
+<Drop> change.txt /*<Drop>*
+<EOL> intro.txt /*<EOL>*
+<End> motion.txt /*<End>*
+<Enter> intro.txt /*<Enter>*
+<Esc> intro.txt /*<Esc>*
+<F10> term.txt /*<F10>*
+<F11> term.txt /*<F11>*
+<F12> term.txt /*<F12>*
+<F13> term.txt /*<F13>*
+<F14> term.txt /*<F14>*
+<F15> term.txt /*<F15>*
+<F16> term.txt /*<F16>*
+<F17> term.txt /*<F17>*
+<F18> term.txt /*<F18>*
+<F19> term.txt /*<F19>*
+<F1> helphelp.txt /*<F1>*
+<F2> term.txt /*<F2>*
+<F3> term.txt /*<F3>*
+<F4> term.txt /*<F4>*
+<F5> term.txt /*<F5>*
+<F6> term.txt /*<F6>*
+<F7> term.txt /*<F7>*
+<F8> term.txt /*<F8>*
+<F9> term.txt /*<F9>*
+<Help> helphelp.txt /*<Help>*
+<Home> motion.txt /*<Home>*
+<Ignore> builtin.txt /*<Ignore>*
+<Insert> insert.txt /*<Insert>*
+<Leader> map.txt /*<Leader>*
+<Left> motion.txt /*<Left>*
+<LeftDrag> term.txt /*<LeftDrag>*
+<LeftMouse> visual.txt /*<LeftMouse>*
+<LeftRelease> visual.txt /*<LeftRelease>*
+<LocalLeader> map.txt /*<LocalLeader>*
+<M- intro.txt /*<M-*
+<MiddleDrag> term.txt /*<MiddleDrag>*
+<MiddleMouse> change.txt /*<MiddleMouse>*
+<MiddleRelease> term.txt /*<MiddleRelease>*
+<Mouse> term.txt /*<Mouse>*
+<MouseDown> scroll.txt /*<MouseDown>*
+<MouseMove> map.txt /*<MouseMove>*
+<MouseUp> scroll.txt /*<MouseUp>*
+<NL> motion.txt /*<NL>*
+<Nop> map.txt /*<Nop>*
+<Nul> intro.txt /*<Nul>*
+<PageDown> scroll.txt /*<PageDown>*
+<PageUp> scroll.txt /*<PageUp>*
+<Plug> map.txt /*<Plug>*
+<Return> intro.txt /*<Return>*
+<Right> motion.txt /*<Right>*
+<RightDrag> term.txt /*<RightDrag>*
+<RightMouse> visual.txt /*<RightMouse>*
+<RightRelease> term.txt /*<RightRelease>*
+<S- intro.txt /*<S-*
+<S-Del> os_dos.txt /*<S-Del>*
+<S-Down> scroll.txt /*<S-Down>*
+<S-End> term.txt /*<S-End>*
+<S-F10> term.txt /*<S-F10>*
+<S-F11> term.txt /*<S-F11>*
+<S-F12> term.txt /*<S-F12>*
+<S-F1> intro.txt /*<S-F1>*
+<S-F2> term.txt /*<S-F2>*
+<S-F3> term.txt /*<S-F3>*
+<S-F4> term.txt /*<S-F4>*
+<S-F5> term.txt /*<S-F5>*
+<S-F6> term.txt /*<S-F6>*
+<S-F7> term.txt /*<S-F7>*
+<S-F8> term.txt /*<S-F8>*
+<S-F9> term.txt /*<S-F9>*
+<S-Home> term.txt /*<S-Home>*
+<S-Insert> os_dos.txt /*<S-Insert>*
+<S-Left> motion.txt /*<S-Left>*
+<S-LeftMouse> term.txt /*<S-LeftMouse>*
+<S-Right> motion.txt /*<S-Right>*
+<S-RightMouse> term.txt /*<S-RightMouse>*
+<S-ScrollWheelDown> scroll.txt /*<S-ScrollWheelDown>*
+<S-ScrollWheelLeft> scroll.txt /*<S-ScrollWheelLeft>*
+<S-ScrollWheelRight> scroll.txt /*<S-ScrollWheelRight>*
+<S-ScrollWheelUp> scroll.txt /*<S-ScrollWheelUp>*
+<S-Tab> term.txt /*<S-Tab>*
+<S-Up> scroll.txt /*<S-Up>*
+<S-xF1> term.txt /*<S-xF1>*
+<S-xF2> term.txt /*<S-xF2>*
+<S-xF3> term.txt /*<S-xF3>*
+<S-xF4> term.txt /*<S-xF4>*
+<SID> map.txt /*<SID>*
+<SNR> map.txt /*<SNR>*
+<ScriptCmd> map.txt /*<ScriptCmd>*
+<ScrollWheelDown> scroll.txt /*<ScrollWheelDown>*
+<ScrollWheelLeft> scroll.txt /*<ScrollWheelLeft>*
+<ScrollWheelRight> scroll.txt /*<ScrollWheelRight>*
+<ScrollWheelUp> scroll.txt /*<ScrollWheelUp>*
+<Space> motion.txt /*<Space>*
+<Tab> motion.txt /*<Tab>*
+<Undo> undo.txt /*<Undo>*
+<Up> motion.txt /*<Up>*
+<abuf> cmdline.txt /*<abuf>*
+<afile> cmdline.txt /*<afile>*
+<amatch> cmdline.txt /*<amatch>*
+<args> map.txt /*<args>*
+<bang> map.txt /*<bang>*
+<buffer=N> autocmd.txt /*<buffer=N>*
+<buffer=abuf> autocmd.txt /*<buffer=abuf>*
+<cWORD> cmdline.txt /*<cWORD>*
+<cexpr> cmdline.txt /*<cexpr>*
+<cfile> cmdline.txt /*<cfile>*
+<character> intro.txt /*<character>*
+<client> cmdline.txt /*<client>*
+<count> map.txt /*<count>*
+<cword> cmdline.txt /*<cword>*
+<f-args> map.txt /*<f-args>*
+<k0> term.txt /*<k0>*
+<k1> term.txt /*<k1>*
+<k2> term.txt /*<k2>*
+<k3> term.txt /*<k3>*
+<k4> term.txt /*<k4>*
+<k5> term.txt /*<k5>*
+<k6> term.txt /*<k6>*
+<k7> term.txt /*<k7>*
+<k8> term.txt /*<k8>*
+<k9> term.txt /*<k9>*
+<kDivide> term.txt /*<kDivide>*
+<kEnd> motion.txt /*<kEnd>*
+<kEnter> term.txt /*<kEnter>*
+<kHome> motion.txt /*<kHome>*
+<kMinus> term.txt /*<kMinus>*
+<kMultiply> term.txt /*<kMultiply>*
+<kPageDown> scroll.txt /*<kPageDown>*
+<kPageUp> scroll.txt /*<kPageUp>*
+<kPlus> term.txt /*<kPlus>*
+<kPoint> term.txt /*<kPoint>*
+<line1> map.txt /*<line1>*
+<line2> map.txt /*<line2>*
+<lt> intro.txt /*<lt>*
+<mods> map.txt /*<mods>*
+<nomodeline> autocmd.txt /*<nomodeline>*
+<q-args> map.txt /*<q-args>*
+<q-mods> map.txt /*<q-mods>*
+<range> map.txt /*<range>*
+<reg> map.txt /*<reg>*
+<register> map.txt /*<register>*
+<script> cmdline.txt /*<script>*
+<sfile> cmdline.txt /*<sfile>*
+<sflnum> cmdline.txt /*<sflnum>*
+<slnum> cmdline.txt /*<slnum>*
+<stack> cmdline.txt /*<stack>*
+<xCSI> intro.txt /*<xCSI>*
+<xDown> term.txt /*<xDown>*
+<xEnd> term.txt /*<xEnd>*
+<xEnd>-xterm term.txt /*<xEnd>-xterm*
+<xF1> term.txt /*<xF1>*
+<xF1>-xterm term.txt /*<xF1>-xterm*
+<xF2> term.txt /*<xF2>*
+<xF2>-xterm term.txt /*<xF2>-xterm*
+<xF3> term.txt /*<xF3>*
+<xF3>-xterm term.txt /*<xF3>-xterm*
+<xF4> term.txt /*<xF4>*
+<xF4>-xterm term.txt /*<xF4>-xterm*
+<xHome> term.txt /*<xHome>*
+<xHome>-xterm term.txt /*<xHome>-xterm*
+<xLeft> term.txt /*<xLeft>*
+<xRight> term.txt /*<xRight>*
+<xUp> term.txt /*<xUp>*
+= change.txt /*=*
+== change.txt /*==*
+> change.txt /*>*
+>> change.txt /*>>*
+>backtrace repeat.txt /*>backtrace*
+>bt repeat.txt /*>bt*
+>cont repeat.txt /*>cont*
+>down repeat.txt /*>down*
+>finish repeat.txt /*>finish*
+>frame repeat.txt /*>frame*
+>interrupt repeat.txt /*>interrupt*
+>next repeat.txt /*>next*
+>quit repeat.txt /*>quit*
+>step repeat.txt /*>step*
+>up repeat.txt /*>up*
+>where repeat.txt /*>where*
+? pattern.txt /*?*
+?<CR> pattern.txt /*?<CR>*
+?? eval.txt /*??*
+@ repeat.txt /*@*
+@/ change.txt /*@\/*
+@: repeat.txt /*@:*
+@= change.txt /*@=*
+@@ repeat.txt /*@@*
+@r eval.txt /*@r*
+A insert.txt /*A*
+ACL editing.txt /*ACL*
+ANSI-C develop.txt /*ANSI-C*
+ATTENTION usr_11.txt /*ATTENTION*
+Abbreviations map.txt /*Abbreviations*
+Aleph options.txt /*Aleph*
+Amiga os_amiga.txt /*Amiga*
+Arabic arabic.txt /*Arabic*
+Atari os_mint.txt /*Atari*
+B motion.txt /*B*
+BeBox os_beos.txt /*BeBox*
+BeOS os_beos.txt /*BeOS*
+Blob eval.txt /*Blob*
+Blobs eval.txt /*Blobs*
+Boolean eval.txt /*Boolean*
+Bram intro.txt /*Bram*
+BufAdd autocmd.txt /*BufAdd*
+BufCreate autocmd.txt /*BufCreate*
+BufDelete autocmd.txt /*BufDelete*
+BufEnter autocmd.txt /*BufEnter*
+BufFilePost autocmd.txt /*BufFilePost*
+BufFilePre autocmd.txt /*BufFilePre*
+BufHidden autocmd.txt /*BufHidden*
+BufLeave autocmd.txt /*BufLeave*
+BufNew autocmd.txt /*BufNew*
+BufNewFile autocmd.txt /*BufNewFile*
+BufRead autocmd.txt /*BufRead*
+BufReadCmd autocmd.txt /*BufReadCmd*
+BufReadPost autocmd.txt /*BufReadPost*
+BufReadPre autocmd.txt /*BufReadPre*
+BufUnload autocmd.txt /*BufUnload*
+BufWinEnter autocmd.txt /*BufWinEnter*
+BufWinLeave autocmd.txt /*BufWinLeave*
+BufWipeout autocmd.txt /*BufWipeout*
+BufWrite autocmd.txt /*BufWrite*
+BufWriteCmd autocmd.txt /*BufWriteCmd*
+BufWritePost autocmd.txt /*BufWritePost*
+BufWritePre autocmd.txt /*BufWritePre*
+C change.txt /*C*
+C-editing tips.txt /*C-editing*
+C-indenting indent.txt /*C-indenting*
+C89 develop.txt /*C89*
+C99 develop.txt /*C99*
+COMSPEC starting.txt /*COMSPEC*
+CR-used-for-NL pattern.txt /*CR-used-for-NL*
+CTRL-6 editing.txt /*CTRL-6*
+CTRL-<PageDown> tabpage.txt /*CTRL-<PageDown>*
+CTRL-<PageUp> tabpage.txt /*CTRL-<PageUp>*
+CTRL-A change.txt /*CTRL-A*
+CTRL-B scroll.txt /*CTRL-B*
+CTRL-C pattern.txt /*CTRL-C*
+CTRL-D scroll.txt /*CTRL-D*
+CTRL-E scroll.txt /*CTRL-E*
+CTRL-F scroll.txt /*CTRL-F*
+CTRL-G editing.txt /*CTRL-G*
+CTRL-H motion.txt /*CTRL-H*
+CTRL-I motion.txt /*CTRL-I*
+CTRL-J motion.txt /*CTRL-J*
+CTRL-L various.txt /*CTRL-L*
+CTRL-M motion.txt /*CTRL-M*
+CTRL-N motion.txt /*CTRL-N*
+CTRL-O motion.txt /*CTRL-O*
+CTRL-P motion.txt /*CTRL-P*
+CTRL-Q gui_w32.txt /*CTRL-Q*
+CTRL-R undo.txt /*CTRL-R*
+CTRL-T tagsrch.txt /*CTRL-T*
+CTRL-U scroll.txt /*CTRL-U*
+CTRL-U-changed version6.txt /*CTRL-U-changed*
+CTRL-V visual.txt /*CTRL-V*
+CTRL-V-alternative gui_w32.txt /*CTRL-V-alternative*
+CTRL-W index.txt /*CTRL-W*
+CTRL-W_+ windows.txt /*CTRL-W_+*
+CTRL-W_- windows.txt /*CTRL-W_-*
+CTRL-W_: windows.txt /*CTRL-W_:*
+CTRL-W_< windows.txt /*CTRL-W_<*
+CTRL-W_<BS> windows.txt /*CTRL-W_<BS>*
+CTRL-W_<CR> quickfix.txt /*CTRL-W_<CR>*
+CTRL-W_<Down> windows.txt /*CTRL-W_<Down>*
+CTRL-W_<Enter> quickfix.txt /*CTRL-W_<Enter>*
+CTRL-W_<Left> windows.txt /*CTRL-W_<Left>*
+CTRL-W_<Right> windows.txt /*CTRL-W_<Right>*
+CTRL-W_<Up> windows.txt /*CTRL-W_<Up>*
+CTRL-W_= windows.txt /*CTRL-W_=*
+CTRL-W_> windows.txt /*CTRL-W_>*
+CTRL-W_CTRL-B windows.txt /*CTRL-W_CTRL-B*
+CTRL-W_CTRL-C windows.txt /*CTRL-W_CTRL-C*
+CTRL-W_CTRL-D tagsrch.txt /*CTRL-W_CTRL-D*
+CTRL-W_CTRL-F windows.txt /*CTRL-W_CTRL-F*
+CTRL-W_CTRL-H windows.txt /*CTRL-W_CTRL-H*
+CTRL-W_CTRL-I tagsrch.txt /*CTRL-W_CTRL-I*
+CTRL-W_CTRL-J windows.txt /*CTRL-W_CTRL-J*
+CTRL-W_CTRL-K windows.txt /*CTRL-W_CTRL-K*
+CTRL-W_CTRL-L windows.txt /*CTRL-W_CTRL-L*
+CTRL-W_CTRL-N windows.txt /*CTRL-W_CTRL-N*
+CTRL-W_CTRL-O windows.txt /*CTRL-W_CTRL-O*
+CTRL-W_CTRL-P windows.txt /*CTRL-W_CTRL-P*
+CTRL-W_CTRL-Q windows.txt /*CTRL-W_CTRL-Q*
+CTRL-W_CTRL-R windows.txt /*CTRL-W_CTRL-R*
+CTRL-W_CTRL-S windows.txt /*CTRL-W_CTRL-S*
+CTRL-W_CTRL-T windows.txt /*CTRL-W_CTRL-T*
+CTRL-W_CTRL-V windows.txt /*CTRL-W_CTRL-V*
+CTRL-W_CTRL-W windows.txt /*CTRL-W_CTRL-W*
+CTRL-W_CTRL-X windows.txt /*CTRL-W_CTRL-X*
+CTRL-W_CTRL-Z windows.txt /*CTRL-W_CTRL-Z*
+CTRL-W_CTRL-] windows.txt /*CTRL-W_CTRL-]*
+CTRL-W_CTRL-^ windows.txt /*CTRL-W_CTRL-^*
+CTRL-W_CTRL-_ windows.txt /*CTRL-W_CTRL-_*
+CTRL-W_F windows.txt /*CTRL-W_F*
+CTRL-W_H windows.txt /*CTRL-W_H*
+CTRL-W_J windows.txt /*CTRL-W_J*
+CTRL-W_K windows.txt /*CTRL-W_K*
+CTRL-W_L windows.txt /*CTRL-W_L*
+CTRL-W_P windows.txt /*CTRL-W_P*
+CTRL-W_R windows.txt /*CTRL-W_R*
+CTRL-W_S windows.txt /*CTRL-W_S*
+CTRL-W_T windows.txt /*CTRL-W_T*
+CTRL-W_W windows.txt /*CTRL-W_W*
+CTRL-W_] windows.txt /*CTRL-W_]*
+CTRL-W_^ windows.txt /*CTRL-W_^*
+CTRL-W__ windows.txt /*CTRL-W__*
+CTRL-W_b windows.txt /*CTRL-W_b*
+CTRL-W_bar windows.txt /*CTRL-W_bar*
+CTRL-W_c windows.txt /*CTRL-W_c*
+CTRL-W_d tagsrch.txt /*CTRL-W_d*
+CTRL-W_f windows.txt /*CTRL-W_f*
+CTRL-W_g<Tab> tabpage.txt /*CTRL-W_g<Tab>*
+CTRL-W_gF windows.txt /*CTRL-W_gF*
+CTRL-W_gT windows.txt /*CTRL-W_gT*
+CTRL-W_g] windows.txt /*CTRL-W_g]*
+CTRL-W_g_CTRL-] windows.txt /*CTRL-W_g_CTRL-]*
+CTRL-W_gf windows.txt /*CTRL-W_gf*
+CTRL-W_gt windows.txt /*CTRL-W_gt*
+CTRL-W_g} windows.txt /*CTRL-W_g}*
+CTRL-W_h windows.txt /*CTRL-W_h*
+CTRL-W_i tagsrch.txt /*CTRL-W_i*
+CTRL-W_j windows.txt /*CTRL-W_j*
+CTRL-W_k windows.txt /*CTRL-W_k*
+CTRL-W_l windows.txt /*CTRL-W_l*
+CTRL-W_n windows.txt /*CTRL-W_n*
+CTRL-W_o windows.txt /*CTRL-W_o*
+CTRL-W_p windows.txt /*CTRL-W_p*
+CTRL-W_q windows.txt /*CTRL-W_q*
+CTRL-W_r windows.txt /*CTRL-W_r*
+CTRL-W_s windows.txt /*CTRL-W_s*
+CTRL-W_t windows.txt /*CTRL-W_t*
+CTRL-W_v windows.txt /*CTRL-W_v*
+CTRL-W_w windows.txt /*CTRL-W_w*
+CTRL-W_x windows.txt /*CTRL-W_x*
+CTRL-W_z windows.txt /*CTRL-W_z*
+CTRL-W_} windows.txt /*CTRL-W_}*
+CTRL-X change.txt /*CTRL-X*
+CTRL-Y scroll.txt /*CTRL-Y*
+CTRL-Z starting.txt /*CTRL-Z*
+CTRL-\_CTRL-G intro.txt /*CTRL-\\_CTRL-G*
+CTRL-\_CTRL-N intro.txt /*CTRL-\\_CTRL-N*
+CTRL-] tagsrch.txt /*CTRL-]*
+CTRL-^ editing.txt /*CTRL-^*
+CTRL-{char} intro.txt /*CTRL-{char}*
+Channel eval.txt /*Channel*
+Channels eval.txt /*Channels*
+Chinese mbyte.txt /*Chinese*
+Class vim9class.txt /*Class*
+Cmd-event autocmd.txt /*Cmd-event*
+CmdUndefined autocmd.txt /*CmdUndefined*
+Cmdline cmdline.txt /*Cmdline*
+Cmdline-mode cmdline.txt /*Cmdline-mode*
+CmdlineChanged autocmd.txt /*CmdlineChanged*
+CmdlineEnter autocmd.txt /*CmdlineEnter*
+CmdlineLeave autocmd.txt /*CmdlineLeave*
+CmdwinEnter autocmd.txt /*CmdwinEnter*
+CmdwinLeave autocmd.txt /*CmdwinLeave*
+ColorScheme autocmd.txt /*ColorScheme*
+ColorSchemePre autocmd.txt /*ColorSchemePre*
+Command-line cmdline.txt /*Command-line*
+Command-line-mode cmdline.txt /*Command-line-mode*
+CompleteChanged autocmd.txt /*CompleteChanged*
+CompleteDone autocmd.txt /*CompleteDone*
+CompleteDonePre autocmd.txt /*CompleteDonePre*
+ConPTY terminal.txt /*ConPTY*
+Contents quickref.txt /*Contents*
+Cscope if_cscop.txt /*Cscope*
+CursorHold autocmd.txt /*CursorHold*
+CursorHold-example windows.txt /*CursorHold-example*
+CursorHoldI autocmd.txt /*CursorHoldI*
+CursorIM mbyte.txt /*CursorIM*
+CursorMoved autocmd.txt /*CursorMoved*
+CursorMovedI autocmd.txt /*CursorMovedI*
+D change.txt /*D*
+DOS os_dos.txt /*DOS*
+DOS-format editing.txt /*DOS-format*
+DOS-format-write editing.txt /*DOS-format-write*
+Dict eval.txt /*Dict*
+Dictionaries eval.txt /*Dictionaries*
+Dictionary eval.txt /*Dictionary*
+Dictionary-function eval.txt /*Dictionary-function*
+DiffUpdated autocmd.txt /*DiffUpdated*
+Digraphs digraph.txt /*Digraphs*
+DirChanged autocmd.txt /*DirChanged*
+DirChangedPre autocmd.txt /*DirChangedPre*
+E motion.txt /*E*
+E10 message.txt /*E10*
+E100 diff.txt /*E100*
+E1001 eval.txt /*E1001*
+E1002 eval.txt /*E1002*
+E1003 vim9.txt /*E1003*
+E1004 vim9.txt /*E1004*
+E1005 vim9.txt /*E1005*
+E1006 vim9.txt /*E1006*
+E1007 vim9.txt /*E1007*
+E1008 vim9.txt /*E1008*
+E1009 vim9.txt /*E1009*
+E101 diff.txt /*E101*
+E1010 vim9.txt /*E1010*
+E1011 vim9.txt /*E1011*
+E1012 vim9.txt /*E1012*
+E1013 vim9.txt /*E1013*
+E1014 vim9.txt /*E1014*
+E1015 eval.txt /*E1015*
+E1016 vim9.txt /*E1016*
+E1017 vim9.txt /*E1017*
+E1018 eval.txt /*E1018*
+E1019 eval.txt /*E1019*
+E102 diff.txt /*E102*
+E1020 vim9.txt /*E1020*
+E1021 vim9.txt /*E1021*
+E1022 vim9.txt /*E1022*
+E1023 vim9.txt /*E1023*
+E1024 vim9.txt /*E1024*
+E1025 vim9.txt /*E1025*
+E1026 vim9.txt /*E1026*
+E1027 vim9.txt /*E1027*
+E1028 vim9.txt /*E1028*
+E1029 vim9.txt /*E1029*
+E103 diff.txt /*E103*
+E1030 vim9.txt /*E1030*
+E1031 vim9.txt /*E1031*
+E1032 eval.txt /*E1032*
+E1033 eval.txt /*E1033*
+E1034 vim9.txt /*E1034*
+E1035 eval.txt /*E1035*
+E1036 eval.txt /*E1036*
+E1037 eval.txt /*E1037*
+E1038 repeat.txt /*E1038*
+E1039 repeat.txt /*E1039*
+E104 digraph.txt /*E104*
+E1040 repeat.txt /*E1040*
+E1041 vim9.txt /*E1041*
+E1042 vim9.txt /*E1042*
+E1043 vim9.txt /*E1043*
+E1044 vim9.txt /*E1044*
+E1047 vim9.txt /*E1047*
+E1048 vim9.txt /*E1048*
+E1049 vim9.txt /*E1049*
+E105 mbyte.txt /*E105*
+E1050 vim9.txt /*E1050*
+E1051 eval.txt /*E1051*
+E1052 vim9.txt /*E1052*
+E1053 vim9.txt /*E1053*
+E1054 vim9.txt /*E1054*
+E1055 vim9.txt /*E1055*
+E1056 vim9.txt /*E1056*
+E1057 vim9.txt /*E1057*
+E1058 vim9.txt /*E1058*
+E1059 vim9.txt /*E1059*
+E1060 vim9.txt /*E1060*
+E1061 vim9.txt /*E1061*
+E1062 eval.txt /*E1062*
+E1063 eval.txt /*E1063*
+E1064 autocmd.txt /*E1064*
+E1065 vim9.txt /*E1065*
+E1066 vim9.txt /*E1066*
+E1067 eval.txt /*E1067*
+E1068 vim9.txt /*E1068*
+E1069 vim9.txt /*E1069*
+E107 userfunc.txt /*E107*
+E1071 vim9.txt /*E1071*
+E1072 eval.txt /*E1072*
+E1073 vim9.txt /*E1073*
+E1074 vim9.txt /*E1074*
+E1075 vim9.txt /*E1075*
+E1077 vim9.txt /*E1077*
+E1078 autocmd.txt /*E1078*
+E1079 vim9.txt /*E1079*
+E108 eval.txt /*E108*
+E1080 vim9.txt /*E1080*
+E1081 eval.txt /*E1081*
+E1082 vim9.txt /*E1082*
+E1083 editing.txt /*E1083*
+E1084 userfunc.txt /*E1084*
+E1085 eval.txt /*E1085*
+E1087 vim9.txt /*E1087*
+E1088 vim9.txt /*E1088*
+E1089 eval.txt /*E1089*
+E109 eval.txt /*E109*
+E1090 userfunc.txt /*E1090*
+E1091 vim9.txt /*E1091*
+E1092 various.txt /*E1092*
+E1093 eval.txt /*E1093*
+E1094 vim9.txt /*E1094*
+E1095 userfunc.txt /*E1095*
+E1096 vim9.txt /*E1096*
+E1097 vim9.txt /*E1097*
+E1098 eval.txt /*E1098*
+E1099 vim9.txt /*E1099*
+E11 cmdline.txt /*E11*
+E110 eval.txt /*E110*
+E1100 vim9.txt /*E1100*
+E1101 vim9.txt /*E1101*
+E1102 vim9.txt /*E1102*
+E1103 vim9.txt /*E1103*
+E1104 vim9.txt /*E1104*
+E1105 vim9.txt /*E1105*
+E1106 vim9.txt /*E1106*
+E1107 eval.txt /*E1107*
+E1108 vim9.txt /*E1108*
+E1109 builtin.txt /*E1109*
+E111 eval.txt /*E111*
+E1110 builtin.txt /*E1110*
+E1111 builtin.txt /*E1111*
+E1112 builtin.txt /*E1112*
+E1113 builtin.txt /*E1113*
+E1114 builtin.txt /*E1114*
+E1115 testing.txt /*E1115*
+E1116 testing.txt /*E1116*
+E1117 vim9.txt /*E1117*
+E1118 eval.txt /*E1118*
+E1119 eval.txt /*E1119*
+E112 eval.txt /*E112*
+E1120 eval.txt /*E1120*
+E1121 eval.txt /*E1121*
+E1122 eval.txt /*E1122*
+E1123 vim9.txt /*E1123*
+E1124 vim9.txt /*E1124*
+E1125 vim9.txt /*E1125*
+E1126 vim9.txt /*E1126*
+E1127 vim9.txt /*E1127*
+E1128 vim9.txt /*E1128*
+E1129 eval.txt /*E1129*
+E113 eval.txt /*E113*
+E1130 vim9.txt /*E1130*
+E1131 vim9.txt /*E1131*
+E1132 builtin.txt /*E1132*
+E1133 vim9.txt /*E1133*
+E1134 vim9.txt /*E1134*
+E1135 eval.txt /*E1135*
+E1136 map.txt /*E1136*
+E1137 map.txt /*E1137*
+E1138 eval.txt /*E1138*
+E1139 vim9.txt /*E1139*
+E114 eval.txt /*E114*
+E1140 eval.txt /*E1140*
+E1141 eval.txt /*E1141*
+E1142 testing.txt /*E1142*
+E1143 eval.txt /*E1143*
+E1144 vim9.txt /*E1144*
+E1145 eval.txt /*E1145*
+E1146 vim9.txt /*E1146*
+E1147 eval.txt /*E1147*
+E1148 eval.txt /*E1148*
+E1149 vim9.txt /*E1149*
+E115 eval.txt /*E115*
+E1150 vim9.txt /*E1150*
+E1151 userfunc.txt /*E1151*
+E1152 vim9.txt /*E1152*
+E1153 eval.txt /*E1153*
+E1154 eval.txt /*E1154*
+E1155 autocmd.txt /*E1155*
+E1156 editing.txt /*E1156*
+E1157 vim9.txt /*E1157*
+E1158 vim9.txt /*E1158*
+E1159 windows.txt /*E1159*
+E116 eval.txt /*E116*
+E1160 vim9.txt /*E1160*
+E1161 builtin.txt /*E1161*
+E1162 builtin.txt /*E1162*
+E1163 vim9.txt /*E1163*
+E1164 vim9.txt /*E1164*
+E1165 eval.txt /*E1165*
+E1166 eval.txt /*E1166*
+E1167 vim9.txt /*E1167*
+E1168 vim9.txt /*E1168*
+E1169 eval.txt /*E1169*
+E117 userfunc.txt /*E117*
+E1170 vim9.txt /*E1170*
+E1171 vim9.txt /*E1171*
+E1172 vim9.txt /*E1172*
+E1173 vim9.txt /*E1173*
+E1174 vim9.txt /*E1174*
+E1175 vim9.txt /*E1175*
+E1176 vim9.txt /*E1176*
+E1177 eval.txt /*E1177*
+E1178 vim9.txt /*E1178*
+E1179 options.txt /*E1179*
+E118 eval.txt /*E118*
+E1180 vim9.txt /*E1180*
+E1181 vim9.txt /*E1181*
+E1182 eval.txt /*E1182*
+E1183 eval.txt /*E1183*
+E1184 eval.txt /*E1184*
+E1185 various.txt /*E1185*
+E1186 vim9.txt /*E1186*
+E1187 starting.txt /*E1187*
+E1188 cmdline.txt /*E1188*
+E1189 vim9.txt /*E1189*
+E119 eval.txt /*E119*
+E1190 vim9.txt /*E1190*
+E1191 vim9.txt /*E1191*
+E1192 eval.txt /*E1192*
+E1193 options.txt /*E1193*
+E1194 options.txt /*E1194*
+E1195 options.txt /*E1195*
+E1196 options.txt /*E1196*
+E1197 options.txt /*E1197*
+E1198 options.txt /*E1198*
+E1199 options.txt /*E1199*
+E12 message.txt /*E12*
+E120 eval.txt /*E120*
+E1200 options.txt /*E1200*
+E1201 options.txt /*E1201*
+E1202 vim9.txt /*E1202*
+E1203 eval.txt /*E1203*
+E1204 pattern.txt /*E1204*
+E1205 vim9.txt /*E1205*
+E1206 vim9.txt /*E1206*
+E1207 eval.txt /*E1207*
+E1208 map.txt /*E1208*
+E1209 builtin.txt /*E1209*
+E121 eval.txt /*E121*
+E1210 vim9.txt /*E1210*
+E1211 vim9.txt /*E1211*
+E1212 vim9.txt /*E1212*
+E1213 vim9.txt /*E1213*
+E1214 builtin.txt /*E1214*
+E1215 builtin.txt /*E1215*
+E1216 builtin.txt /*E1216*
+E1217 vim9.txt /*E1217*
+E1218 vim9.txt /*E1218*
+E1219 vim9.txt /*E1219*
+E122 userfunc.txt /*E122*
+E1220 vim9.txt /*E1220*
+E1221 vim9.txt /*E1221*
+E1222 vim9.txt /*E1222*
+E1223 vim9.txt /*E1223*
+E1224 vim9.txt /*E1224*
+E1225 vim9.txt /*E1225*
+E1226 vim9.txt /*E1226*
+E1227 vim9.txt /*E1227*
+E1228 vim9.txt /*E1228*
+E1229 eval.txt /*E1229*
+E123 userfunc.txt /*E123*
+E1230 options.txt /*E1230*
+E1231 map.txt /*E1231*
+E1232 builtin.txt /*E1232*
+E1233 builtin.txt /*E1233*
+E1234 vim9.txt /*E1234*
+E1236 vim9.txt /*E1236*
+E1237 map.txt /*E1237*
+E1238 vim9.txt /*E1238*
+E1239 builtin.txt /*E1239*
+E124 userfunc.txt /*E124*
+E1240 change.txt /*E1240*
+E1241 change.txt /*E1241*
+E1242 change.txt /*E1242*
+E1243 options.txt /*E1243*
+E1244 message.txt /*E1244*
+E1245 cmdline.txt /*E1245*
+E1246 eval.txt /*E1246*
+E1247 cmdline.txt /*E1247*
+E1248 vim9.txt /*E1248*
+E1249 syntax.txt /*E1249*
+E125 userfunc.txt /*E125*
+E1250 vim9.txt /*E1250*
+E1251 vim9.txt /*E1251*
+E1252 vim9.txt /*E1252*
+E1253 vim9.txt /*E1253*
+E1254 vim9.txt /*E1254*
+E1255 map.txt /*E1255*
+E1256 vim9.txt /*E1256*
+E1257 vim9.txt /*E1257*
+E1258 vim9.txt /*E1258*
+E1259 vim9.txt /*E1259*
+E126 userfunc.txt /*E126*
+E1260 vim9.txt /*E1260*
+E1261 vim9.txt /*E1261*
+E1262 vim9.txt /*E1262*
+E1263 userfunc.txt /*E1263*
+E1264 vim9.txt /*E1264*
+E1265 eval.txt /*E1265*
+E1266 if_pyth.txt /*E1266*
+E1267 userfunc.txt /*E1267*
+E1268 vim9.txt /*E1268*
+E1269 vim9.txt /*E1269*
+E127 userfunc.txt /*E127*
+E1270 change.txt /*E1270*
+E1271 vim9.txt /*E1271*
+E1272 vim9.txt /*E1272*
+E1273 pattern.txt /*E1273*
+E1274 cmdline.txt /*E1274*
+E1275 eval.txt /*E1275*
+E1276 builtin.txt /*E1276*
+E1277 channel.txt /*E1277*
+E1278 eval.txt /*E1278*
+E1279 eval.txt /*E1279*
+E128 userfunc.txt /*E128*
+E1280 spell.txt /*E1280*
+E1281 pattern.txt /*E1281*
+E1282 eval.txt /*E1282*
+E1283 eval.txt /*E1283*
+E1284 popup.txt /*E1284*
+E1285 builtin.txt /*E1285*
+E1286 builtin.txt /*E1286*
+E1287 builtin.txt /*E1287*
+E1288 builtin.txt /*E1288*
+E1289 builtin.txt /*E1289*
+E129 userfunc.txt /*E129*
+E1290 change.txt /*E1290*
+E1291 testing.txt /*E1291*
+E1292 cmdline.txt /*E1292*
+E1293 textprop.txt /*E1293*
+E1294 textprop.txt /*E1294*
+E1295 textprop.txt /*E1295*
+E1296 textprop.txt /*E1296*
+E1297 vim9.txt /*E1297*
+E1298 vim9.txt /*E1298*
+E1299 tagsrch.txt /*E1299*
+E13 message.txt /*E13*
+E1300 userfunc.txt /*E1300*
+E1301 vim9.txt /*E1301*
+E1302 eval.txt /*E1302*
+E1303 map.txt /*E1303*
+E1304 vim9.txt /*E1304*
+E1305 textprop.txt /*E1305*
+E1306 vim9.txt /*E1306*
+E1307 vim9.txt /*E1307*
+E1308 builtin.txt /*E1308*
+E1309 map.txt /*E1309*
+E131 userfunc.txt /*E131*
+E1310 gui.txt /*E1310*
+E1311 map.txt /*E1311*
+E1312 windows.txt /*E1312*
+E1313 eval.txt /*E1313*
+E1314 vim9class.txt /*E1314*
+E1315 vim9class.txt /*E1315*
+E1316 vim9class.txt /*E1316*
+E1317 vim9class.txt /*E1317*
+E1318 vim9class.txt /*E1318*
+E1319 eval.txt /*E1319*
+E132 userfunc.txt /*E132*
+E1320 eval.txt /*E1320*
+E1321 eval.txt /*E1321*
+E1322 eval.txt /*E1322*
+E1323 eval.txt /*E1323*
+E1324 eval.txt /*E1324*
+E1325 vim9class.txt /*E1325*
+E1326 vim9class.txt /*E1326*
+E1327 vim9class.txt /*E1327*
+E1328 vim9class.txt /*E1328*
+E1329 vim9class.txt /*E1329*
+E133 userfunc.txt /*E133*
+E1330 vim9class.txt /*E1330*
+E1331 vim9class.txt /*E1331*
+E1332 vim9class.txt /*E1332*
+E1333 vim9class.txt /*E1333*
+E1334 vim9class.txt /*E1334*
+E1335 vim9class.txt /*E1335*
+E1336 options.txt /*E1336*
+E1337 vim9class.txt /*E1337*
+E1338 vim9class.txt /*E1338*
+E1339 textprop.txt /*E1339*
+E134 change.txt /*E134*
+E1340 vim9class.txt /*E1340*
+E1341 vim9class.txt /*E1341*
+E1342 vim9class.txt /*E1342*
+E1343 vim9class.txt /*E1343*
+E1344 vim9class.txt /*E1344*
+E1345 vim9class.txt /*E1345*
+E1346 vim9class.txt /*E1346*
+E1347 vim9class.txt /*E1347*
+E1348 vim9class.txt /*E1348*
+E1349 vim9class.txt /*E1349*
+E135 autocmd.txt /*E135*
+E1350 vim9class.txt /*E1350*
+E1351 vim9class.txt /*E1351*
+E1352 vim9class.txt /*E1352*
+E1353 vim9class.txt /*E1353*
+E1354 vim9class.txt /*E1354*
+E1355 vim9class.txt /*E1355*
+E1356 vim9class.txt /*E1356*
+E1357 vim9class.txt /*E1357*
+E1358 vim9class.txt /*E1358*
+E1359 vim9class.txt /*E1359*
+E136 starting.txt /*E136*
+E1360 vim9class.txt /*E1360*
+E1361 syntax.txt /*E1361*
+E1362 vim9class.txt /*E1362*
+E137 starting.txt /*E137*
+E138 starting.txt /*E138*
+E139 message.txt /*E139*
+E140 message.txt /*E140*
+E141 message.txt /*E141*
+E142 message.txt /*E142*
+E143 autocmd.txt /*E143*
+E144 various.txt /*E144*
+E145 starting.txt /*E145*
+E146 change.txt /*E146*
+E147 repeat.txt /*E147*
+E148 repeat.txt /*E148*
+E149 helphelp.txt /*E149*
+E15 eval.txt /*E15*
+E150 helphelp.txt /*E150*
+E151 helphelp.txt /*E151*
+E152 helphelp.txt /*E152*
+E153 helphelp.txt /*E153*
+E154 helphelp.txt /*E154*
+E155 sign.txt /*E155*
+E156 sign.txt /*E156*
+E157 sign.txt /*E157*
+E158 sign.txt /*E158*
+E159 sign.txt /*E159*
+E16 cmdline.txt /*E16*
+E160 sign.txt /*E160*
+E161 repeat.txt /*E161*
+E162 message.txt /*E162*
+E163 editing.txt /*E163*
+E164 editing.txt /*E164*
+E165 editing.txt /*E165*
+E166 message.txt /*E166*
+E167 repeat.txt /*E167*
+E168 repeat.txt /*E168*
+E169 message.txt /*E169*
+E17 message.txt /*E17*
+E170 eval.txt /*E170*
+E171 eval.txt /*E171*
+E172 eval.txt /*E172*
+E173 message.txt /*E173*
+E174 map.txt /*E174*
+E175 map.txt /*E175*
+E176 map.txt /*E176*
+E177 map.txt /*E177*
+E178 map.txt /*E178*
+E179 map.txt /*E179*
+E18 eval.txt /*E18*
+E180 map.txt /*E180*
+E181 map.txt /*E181*
+E182 map.txt /*E182*
+E183 map.txt /*E183*
+E184 map.txt /*E184*
+E185 syntax.txt /*E185*
+E186 editing.txt /*E186*
+E187 editing.txt /*E187*
+E188 gui.txt /*E188*
+E189 message.txt /*E189*
+E19 message.txt /*E19*
+E190 message.txt /*E190*
+E191 motion.txt /*E191*
+E192 message.txt /*E192*
+E193 userfunc.txt /*E193*
+E194 message.txt /*E194*
+E195 starting.txt /*E195*
+E196 various.txt /*E196*
+E197 mlang.txt /*E197*
+E199 cmdline.txt /*E199*
+E20 motion.txt /*E20*
+E200 autocmd.txt /*E200*
+E201 autocmd.txt /*E201*
+E202 options.txt /*E202*
+E203 autocmd.txt /*E203*
+E204 autocmd.txt /*E204*
+E205 options.txt /*E205*
+E206 options.txt /*E206*
+E207 editing.txt /*E207*
+E208 message.txt /*E208*
+E209 message.txt /*E209*
+E21 options.txt /*E21*
+E210 message.txt /*E210*
+E211 message.txt /*E211*
+E212 message.txt /*E212*
+E213 options.txt /*E213*
+E214 options.txt /*E214*
+E215 autocmd.txt /*E215*
+E216 autocmd.txt /*E216*
+E217 autocmd.txt /*E217*
+E218 autocmd.txt /*E218*
+E219 message.txt /*E219*
+E22 message.txt /*E22*
+E220 message.txt /*E220*
+E221 eval.txt /*E221*
+E222 message.txt /*E222*
+E223 options.txt /*E223*
+E224 map.txt /*E224*
+E225 map.txt /*E225*
+E226 map.txt /*E226*
+E227 map.txt /*E227*
+E228 message.txt /*E228*
+E229 gui.txt /*E229*
+E23 message.txt /*E23*
+E230 starting.txt /*E230*
+E231 options.txt /*E231*
+E232 message.txt /*E232*
+E233 gui.txt /*E233*
+E234 options.txt /*E234*
+E235 options.txt /*E235*
+E236 gui.txt /*E236*
+E237 print.txt /*E237*
+E238 print.txt /*E238*
+E239 sign.txt /*E239*
+E24 message.txt /*E24*
+E240 remote.txt /*E240*
+E241 builtin.txt /*E241*
+E242 windows.txt /*E242*
+E243 if_ole.txt /*E243*
+E244 gui.txt /*E244*
+E245 gui.txt /*E245*
+E246 autocmd.txt /*E246*
+E247 remote.txt /*E247*
+E248 remote.txt /*E248*
+E249 windows.txt /*E249*
+E25 message.txt /*E25*
+E250 options.txt /*E250*
+E251 remote.txt /*E251*
+E252 options.txt /*E252*
+E253 mbyte.txt /*E253*
+E254 message.txt /*E254*
+E255 sign.txt /*E255*
+E257 if_cscop.txt /*E257*
+E258 remote.txt /*E258*
+E259 if_cscop.txt /*E259*
+E26 rileft.txt /*E26*
+E260 eval.txt /*E260*
+E261 if_cscop.txt /*E261*
+E262 if_cscop.txt /*E262*
+E263 if_pyth.txt /*E263*
+E264 if_pyth.txt /*E264*
+E265 if_ruby.txt /*E265*
+E266 if_ruby.txt /*E266*
+E267 if_ruby.txt /*E267*
+E268 if_ruby.txt /*E268*
+E269 if_ruby.txt /*E269*
+E27 farsi.txt /*E27*
+E270 if_ruby.txt /*E270*
+E271 if_ruby.txt /*E271*
+E272 if_ruby.txt /*E272*
+E273 if_ruby.txt /*E273*
+E274 eval.txt /*E274*
+E275 textprop.txt /*E275*
+E276 eval.txt /*E276*
+E277 remote.txt /*E277*
+E279 terminal.txt /*E279*
+E28 syntax.txt /*E28*
+E280 if_tcl.txt /*E280*
+E282 starting.txt /*E282*
+E283 motion.txt /*E283*
+E284 mbyte.txt /*E284*
+E285 mbyte.txt /*E285*
+E286 mbyte.txt /*E286*
+E287 mbyte.txt /*E287*
+E288 mbyte.txt /*E288*
+E289 mbyte.txt /*E289*
+E29 change.txt /*E29*
+E290 builtin.txt /*E290*
+E292 message.txt /*E292*
+E293 message.txt /*E293*
+E294 message.txt /*E294*
+E295 message.txt /*E295*
+E296 message.txt /*E296*
+E297 message.txt /*E297*
+E298 message.txt /*E298*
+E299 if_perl.txt /*E299*
+E30 change.txt /*E30*
+E300 message.txt /*E300*
+E301 message.txt /*E301*
+E302 message.txt /*E302*
+E303 message.txt /*E303*
+E304 message.txt /*E304*
+E305 recover.txt /*E305*
+E306 recover.txt /*E306*
+E307 recover.txt /*E307*
+E308 recover.txt /*E308*
+E309 recover.txt /*E309*
+E31 message.txt /*E31*
+E310 recover.txt /*E310*
+E311 recover.txt /*E311*
+E312 recover.txt /*E312*
+E313 recover.txt /*E313*
+E314 recover.txt /*E314*
+E315 message.txt /*E315*
+E316 message.txt /*E316*
+E317 message.txt /*E317*
+E318 message.txt /*E318*
+E319 message.txt /*E319*
+E32 message.txt /*E32*
+E320 message.txt /*E320*
+E321 editing.txt /*E321*
+E322 message.txt /*E322*
+E323 message.txt /*E323*
+E324 print.txt /*E324*
+E325 usr_11.txt /*E325*
+E326 recover.txt /*E326*
+E327 gui.txt /*E327*
+E328 gui.txt /*E328*
+E329 gui.txt /*E329*
+E33 message.txt /*E33*
+E330 gui.txt /*E330*
+E331 gui.txt /*E331*
+E332 gui.txt /*E332*
+E333 gui.txt /*E333*
+E334 gui.txt /*E334*
+E335 gui.txt /*E335*
+E336 gui.txt /*E336*
+E337 gui.txt /*E337*
+E338 editing.txt /*E338*
+E339 message.txt /*E339*
+E34 various.txt /*E34*
+E341 message.txt /*E341*
+E342 message.txt /*E342*
+E343 options.txt /*E343*
+E344 options.txt /*E344*
+E345 options.txt /*E345*
+E346 options.txt /*E346*
+E347 options.txt /*E347*
+E348 pattern.txt /*E348*
+E349 pattern.txt /*E349*
+E35 message.txt /*E35*
+E350 fold.txt /*E350*
+E351 fold.txt /*E351*
+E352 fold.txt /*E352*
+E353 change.txt /*E353*
+E354 change.txt /*E354*
+E355 options.txt /*E355*
+E356 message.txt /*E356*
+E357 options.txt /*E357*
+E358 options.txt /*E358*
+E359 term.txt /*E359*
+E36 windows.txt /*E36*
+E360 various.txt /*E360*
+E362 eval.txt /*E362*
+E363 options.txt /*E363*
+E364 builtin.txt /*E364*
+E365 print.txt /*E365*
+E366 popup.txt /*E366*
+E367 autocmd.txt /*E367*
+E368 builtin.txt /*E368*
+E369 pattern.txt /*E369*
+E37 message.txt /*E37*
+E370 various.txt /*E370*
+E371 various.txt /*E371*
+E372 quickfix.txt /*E372*
+E373 quickfix.txt /*E373*
+E374 quickfix.txt /*E374*
+E375 quickfix.txt /*E375*
+E376 quickfix.txt /*E376*
+E377 quickfix.txt /*E377*
+E378 quickfix.txt /*E378*
+E379 quickfix.txt /*E379*
+E38 message.txt /*E38*
+E380 quickfix.txt /*E380*
+E381 quickfix.txt /*E381*
+E382 options.txt /*E382*
+E383 pattern.txt /*E383*
+E384 options.txt /*E384*
+E385 options.txt /*E385*
+E386 pattern.txt /*E386*
+E387 tagsrch.txt /*E387*
+E388 tagsrch.txt /*E388*
+E389 tagsrch.txt /*E389*
+E39 digraph.txt /*E39*
+E390 syntax.txt /*E390*
+E391 syntax.txt /*E391*
+E392 syntax.txt /*E392*
+E393 syntax.txt /*E393*
+E394 syntax.txt /*E394*
+E395 syntax.txt /*E395*
+E397 syntax.txt /*E397*
+E398 syntax.txt /*E398*
+E399 syntax.txt /*E399*
+E40 message.txt /*E40*
+E400 syntax.txt /*E400*
+E401 syntax.txt /*E401*
+E402 syntax.txt /*E402*
+E403 syntax.txt /*E403*
+E404 syntax.txt /*E404*
+E405 syntax.txt /*E405*
+E406 syntax.txt /*E406*
+E407 syntax.txt /*E407*
+E408 syntax.txt /*E408*
+E409 syntax.txt /*E409*
+E41 message.txt /*E41*
+E410 syntax.txt /*E410*
+E411 syntax.txt /*E411*
+E412 syntax.txt /*E412*
+E413 syntax.txt /*E413*
+E414 syntax.txt /*E414*
+E415 syntax.txt /*E415*
+E416 syntax.txt /*E416*
+E417 syntax.txt /*E417*
+E418 syntax.txt /*E418*
+E419 syntax.txt /*E419*
+E42 quickfix.txt /*E42*
+E420 syntax.txt /*E420*
+E421 syntax.txt /*E421*
+E422 syntax.txt /*E422*
+E423 syntax.txt /*E423*
+E424 message.txt /*E424*
+E425 tagsrch.txt /*E425*
+E426 tagsrch.txt /*E426*
+E427 tagsrch.txt /*E427*
+E428 tagsrch.txt /*E428*
+E429 tagsrch.txt /*E429*
+E43 message.txt /*E43*
+E430 tagsrch.txt /*E430*
+E431 tagsrch.txt /*E431*
+E432 message.txt /*E432*
+E433 options.txt /*E433*
+E434 tagsrch.txt /*E434*
+E435 tagsrch.txt /*E435*
+E436 term.txt /*E436*
+E437 term.txt /*E437*
+E438 message.txt /*E438*
+E439 message.txt /*E439*
+E44 message.txt /*E44*
+E440 message.txt /*E440*
+E441 windows.txt /*E441*
+E442 windows.txt /*E442*
+E443 windows.txt /*E443*
+E444 windows.txt /*E444*
+E445 windows.txt /*E445*
+E446 editing.txt /*E446*
+E447 editing.txt /*E447*
+E448 various.txt /*E448*
+E449 builtin.txt /*E449*
+E45 message.txt /*E45*
+E450 popup.txt /*E450*
+E451 eval.txt /*E451*
+E452 eval.txt /*E452*
+E453 syntax.txt /*E453*
+E454 userfunc.txt /*E454*
+E455 print.txt /*E455*
+E456 print.txt /*E456*
+E457 print.txt /*E457*
+E458 message.txt /*E458*
+E459 message.txt /*E459*
+E46 message.txt /*E46*
+E460 builtin.txt /*E460*
+E461 eval.txt /*E461*
+E462 editing.txt /*E462*
+E463 netbeans.txt /*E463*
+E464 message.txt /*E464*
+E465 gui.txt /*E465*
+E466 gui.txt /*E466*
+E467 map.txt /*E467*
+E468 map.txt /*E468*
+E469 if_cscop.txt /*E469*
+E47 message.txt /*E47*
+E470 change.txt /*E470*
+E471 message.txt /*E471*
+E472 editing.txt /*E472*
+E473 message.txt /*E473*
+E474 message.txt /*E474*
+E475 message.txt /*E475*
+E476 pattern.txt /*E476*
+E477 message.txt /*E477*
+E478 message.txt /*E478*
+E479 editing.txt /*E479*
+E48 eval.txt /*E48*
+E480 editing.txt /*E480*
+E481 message.txt /*E481*
+E482 message.txt /*E482*
+E483 message.txt /*E483*
+E484 message.txt /*E484*
+E485 message.txt /*E485*
+E486 pattern.txt /*E486*
+E487 options.txt /*E487*
+E488 message.txt /*E488*
+E489 cmdline.txt /*E489*
+E49 message.txt /*E49*
+E490 fold.txt /*E490*
+E491 builtin.txt /*E491*
+E492 message.txt /*E492*
+E493 cmdline.txt /*E493*
+E494 editing.txt /*E494*
+E495 cmdline.txt /*E495*
+E496 cmdline.txt /*E496*
+E497 cmdline.txt /*E497*
+E498 cmdline.txt /*E498*
+E499 cmdline.txt /*E499*
+E50 syntax.txt /*E50*
+E500 cmdline.txt /*E500*
+E501 intro.txt /*E501*
+E502 editing.txt /*E502*
+E503 editing.txt /*E503*
+E504 editing.txt /*E504*
+E505 editing.txt /*E505*
+E506 editing.txt /*E506*
+E507 editing.txt /*E507*
+E508 editing.txt /*E508*
+E509 editing.txt /*E509*
+E51 pattern.txt /*E51*
+E510 editing.txt /*E510*
+E511 netbeans.txt /*E511*
+E512 editing.txt /*E512*
+E513 options.txt /*E513*
+E514 editing.txt /*E514*
+E515 windows.txt /*E515*
+E516 windows.txt /*E516*
+E517 windows.txt /*E517*
+E518 options.txt /*E518*
+E519 options.txt /*E519*
+E52 syntax.txt /*E52*
+E520 options.txt /*E520*
+E521 options.txt /*E521*
+E522 options.txt /*E522*
+E523 options.txt /*E523*
+E524 options.txt /*E524*
+E525 options.txt /*E525*
+E526 options.txt /*E526*
+E527 options.txt /*E527*
+E528 options.txt /*E528*
+E529 options.txt /*E529*
+E53 pattern.txt /*E53*
+E530 options.txt /*E530*
+E531 options.txt /*E531*
+E532 netbeans.txt /*E532*
+E533 options.txt /*E533*
+E534 options.txt /*E534*
+E535 options.txt /*E535*
+E536 options.txt /*E536*
+E537 options.txt /*E537*
+E538 pattern.txt /*E538*
+E539 options.txt /*E539*
+E54 pattern.txt /*E54*
+E540 options.txt /*E540*
+E542 options.txt /*E542*
+E543 options.txt /*E543*
+E544 options.txt /*E544*
+E545 options.txt /*E545*
+E546 options.txt /*E546*
+E547 options.txt /*E547*
+E548 options.txt /*E548*
+E549 options.txt /*E549*
+E55 pattern.txt /*E55*
+E550 options.txt /*E550*
+E551 options.txt /*E551*
+E552 options.txt /*E552*
+E553 quickfix.txt /*E553*
+E554 pattern.txt /*E554*
+E555 tagsrch.txt /*E555*
+E556 tagsrch.txt /*E556*
+E557 term.txt /*E557*
+E558 term.txt /*E558*
+E559 term.txt /*E559*
+E560 if_cscop.txt /*E560*
+E561 if_cscop.txt /*E561*
+E562 if_cscop.txt /*E562*
+E563 if_cscop.txt /*E563*
+E564 if_cscop.txt /*E564*
+E565 insert.txt /*E565*
+E566 if_cscop.txt /*E566*
+E567 if_cscop.txt /*E567*
+E568 if_cscop.txt /*E568*
+E570 message.txt /*E570*
+E571 if_tcl.txt /*E571*
+E572 if_tcl.txt /*E572*
+E573 remote.txt /*E573*
+E574 starting.txt /*E574*
+E575 starting.txt /*E575*
+E576 starting.txt /*E576*
+E577 starting.txt /*E577*
+E579 eval.txt /*E579*
+E580 eval.txt /*E580*
+E581 eval.txt /*E581*
+E582 eval.txt /*E582*
+E583 eval.txt /*E583*
+E584 eval.txt /*E584*
+E585 eval.txt /*E585*
+E586 eval.txt /*E586*
+E587 eval.txt /*E587*
+E588 eval.txt /*E588*
+E589 options.txt /*E589*
+E59 pattern.txt /*E59*
+E590 options.txt /*E590*
+E591 options.txt /*E591*
+E592 options.txt /*E592*
+E593 options.txt /*E593*
+E594 options.txt /*E594*
+E595 options.txt /*E595*
+E596 options.txt /*E596*
+E597 options.txt /*E597*
+E598 options.txt /*E598*
+E599 options.txt /*E599*
+E60 pattern.txt /*E60*
+E600 eval.txt /*E600*
+E601 eval.txt /*E601*
+E602 eval.txt /*E602*
+E603 eval.txt /*E603*
+E604 eval.txt /*E604*
+E605 eval.txt /*E605*
+E606 eval.txt /*E606*
+E607 eval.txt /*E607*
+E608 eval.txt /*E608*
+E609 if_cscop.txt /*E609*
+E61 pattern.txt /*E61*
+E610 editing.txt /*E610*
+E611 eval.txt /*E611*
+E612 sign.txt /*E612*
+E613 print.txt /*E613*
+E617 options.txt /*E617*
+E618 print.txt /*E618*
+E619 print.txt /*E619*
+E62 pattern.txt /*E62*
+E620 print.txt /*E620*
+E621 print.txt /*E621*
+E622 if_cscop.txt /*E622*
+E623 if_cscop.txt /*E623*
+E624 print.txt /*E624*
+E625 if_cscop.txt /*E625*
+E626 if_cscop.txt /*E626*
+E627 netbeans.txt /*E627*
+E628 netbeans.txt /*E628*
+E629 netbeans.txt /*E629*
+E63 pattern.txt /*E63*
+E630 channel.txt /*E630*
+E631 channel.txt /*E631*
+E632 netbeans.txt /*E632*
+E633 netbeans.txt /*E633*
+E634 netbeans.txt /*E634*
+E635 netbeans.txt /*E635*
+E636 netbeans.txt /*E636*
+E637 netbeans.txt /*E637*
+E638 netbeans.txt /*E638*
+E639 netbeans.txt /*E639*
+E64 pattern.txt /*E64*
+E640 netbeans.txt /*E640*
+E641 netbeans.txt /*E641*
+E642 netbeans.txt /*E642*
+E643 netbeans.txt /*E643*
+E644 netbeans.txt /*E644*
+E645 netbeans.txt /*E645*
+E646 netbeans.txt /*E646*
+E647 netbeans.txt /*E647*
+E648 netbeans.txt /*E648*
+E649 netbeans.txt /*E649*
+E65 pattern.txt /*E65*
+E650 netbeans.txt /*E650*
+E651 netbeans.txt /*E651*
+E652 netbeans.txt /*E652*
+E654 eval.txt /*E654*
+E655 builtin.txt /*E655*
+E656 netbeans.txt /*E656*
+E657 netbeans.txt /*E657*
+E658 netbeans.txt /*E658*
+E659 if_pyth.txt /*E659*
+E66 syntax.txt /*E66*
+E660 netbeans.txt /*E660*
+E661 helphelp.txt /*E661*
+E662 motion.txt /*E662*
+E663 motion.txt /*E663*
+E664 motion.txt /*E664*
+E665 gui_x11.txt /*E665*
+E666 quickfix.txt /*E666*
+E667 editing.txt /*E667*
+E668 netbeans.txt /*E668*
+E669 syntax.txt /*E669*
+E67 syntax.txt /*E67*
+E670 helphelp.txt /*E670*
+E671 starting.txt /*E671*
+E672 starting.txt /*E672*
+E673 print.txt /*E673*
+E674 print.txt /*E674*
+E675 print.txt /*E675*
+E676 options.txt /*E676*
+E677 builtin.txt /*E677*
+E678 pattern.txt /*E678*
+E679 syntax.txt /*E679*
+E68 pattern.txt /*E68*
+E680 autocmd.txt /*E680*
+E681 quickfix.txt /*E681*
+E682 quickfix.txt /*E682*
+E683 quickfix.txt /*E683*
+E684 eval.txt /*E684*
+E685 message.txt /*E685*
+E686 eval.txt /*E686*
+E687 eval.txt /*E687*
+E688 eval.txt /*E688*
+E689 eval.txt /*E689*
+E69 pattern.txt /*E69*
+E690 eval.txt /*E690*
+E691 eval.txt /*E691*
+E692 eval.txt /*E692*
+E694 eval.txt /*E694*
+E695 eval.txt /*E695*
+E696 eval.txt /*E696*
+E697 eval.txt /*E697*
+E698 builtin.txt /*E698*
+E699 builtin.txt /*E699*
+E70 pattern.txt /*E70*
+E700 builtin.txt /*E700*
+E701 builtin.txt /*E701*
+E702 builtin.txt /*E702*
+E703 eval.txt /*E703*
+E704 eval.txt /*E704*
+E705 eval.txt /*E705*
+E707 eval.txt /*E707*
+E708 eval.txt /*E708*
+E709 eval.txt /*E709*
+E71 pattern.txt /*E71*
+E710 eval.txt /*E710*
+E711 eval.txt /*E711*
+E712 eval.txt /*E712*
+E713 eval.txt /*E713*
+E714 eval.txt /*E714*
+E715 eval.txt /*E715*
+E716 eval.txt /*E716*
+E717 eval.txt /*E717*
+E718 eval.txt /*E718*
+E719 eval.txt /*E719*
+E72 message.txt /*E72*
+E720 eval.txt /*E720*
+E721 eval.txt /*E721*
+E722 eval.txt /*E722*
+E723 eval.txt /*E723*
+E724 builtin.txt /*E724*
+E725 eval.txt /*E725*
+E726 builtin.txt /*E726*
+E727 builtin.txt /*E727*
+E728 eval.txt /*E728*
+E729 eval.txt /*E729*
+E73 tagsrch.txt /*E73*
+E730 eval.txt /*E730*
+E731 eval.txt /*E731*
+E732 eval.txt /*E732*
+E733 eval.txt /*E733*
+E734 eval.txt /*E734*
+E735 eval.txt /*E735*
+E736 eval.txt /*E736*
+E737 builtin.txt /*E737*
+E738 eval.txt /*E738*
+E739 builtin.txt /*E739*
+E74 message.txt /*E74*
+E740 userfunc.txt /*E740*
+E741 eval.txt /*E741*
+E742 userfunc.txt /*E742*
+E743 eval.txt /*E743*
+E744 netbeans.txt /*E744*
+E745 eval.txt /*E745*
+E746 userfunc.txt /*E746*
+E747 editing.txt /*E747*
+E748 repeat.txt /*E748*
+E749 various.txt /*E749*
+E75 vi_diff.txt /*E75*
+E750 repeat.txt /*E750*
+E751 spell.txt /*E751*
+E752 spell.txt /*E752*
+E753 spell.txt /*E753*
+E754 spell.txt /*E754*
+E755 spell.txt /*E755*
+E756 spell.txt /*E756*
+E757 options.txt /*E757*
+E758 spell.txt /*E758*
+E759 spell.txt /*E759*
+E76 pattern.txt /*E76*
+E760 spell.txt /*E760*
+E761 spell.txt /*E761*
+E762 spell.txt /*E762*
+E763 spell.txt /*E763*
+E764 options.txt /*E764*
+E765 options.txt /*E765*
+E766 builtin.txt /*E766*
+E767 builtin.txt /*E767*
+E768 message.txt /*E768*
+E769 pattern.txt /*E769*
+E77 message.txt /*E77*
+E770 spell.txt /*E770*
+E771 spell.txt /*E771*
+E772 spell.txt /*E772*
+E773 recover.txt /*E773*
+E774 map.txt /*E774*
+E775 map.txt /*E775*
+E776 quickfix.txt /*E776*
+E777 quickfix.txt /*E777*
+E778 spell.txt /*E778*
+E779 spell.txt /*E779*
+E78 motion.txt /*E78*
+E780 spell.txt /*E780*
+E781 spell.txt /*E781*
+E782 spell.txt /*E782*
+E783 spell.txt /*E783*
+E784 tabpage.txt /*E784*
+E785 builtin.txt /*E785*
+E786 builtin.txt /*E786*
+E787 diff.txt /*E787*
+E788 autocmd.txt /*E788*
+E789 syntax.txt /*E789*
+E79 message.txt /*E79*
+E790 undo.txt /*E790*
+E791 mbyte.txt /*E791*
+E792 gui.txt /*E792*
+E793 diff.txt /*E793*
+E794 eval.txt /*E794*
+E795 eval.txt /*E795*
+E796 options.txt /*E796*
+E797 spell.txt /*E797*
+E798 builtin.txt /*E798*
+E799 builtin.txt /*E799*
+E80 message.txt /*E80*
+E800 arabic.txt /*E800*
+E801 builtin.txt /*E801*
+E802 builtin.txt /*E802*
+E803 builtin.txt /*E803*
+E804 eval.txt /*E804*
+E805 eval.txt /*E805*
+E806 eval.txt /*E806*
+E807 builtin.txt /*E807*
+E808 eval.txt /*E808*
+E809 cmdline.txt /*E809*
+E81 map.txt /*E81*
+E810 diff.txt /*E810*
+E811 autocmd.txt /*E811*
+E812 autocmd.txt /*E812*
+E813 editing.txt /*E813*
+E814 editing.txt /*E814*
+E815 if_mzsch.txt /*E815*
+E816 diff.txt /*E816*
+E817 editing.txt /*E817*
+E818 editing.txt /*E818*
+E819 editing.txt /*E819*
+E82 message.txt /*E82*
+E820 editing.txt /*E820*
+E821 options.txt /*E821*
+E822 undo.txt /*E822*
+E823 undo.txt /*E823*
+E824 undo.txt /*E824*
+E825 undo.txt /*E825*
+E826 undo.txt /*E826*
+E827 undo.txt /*E827*
+E828 undo.txt /*E828*
+E829 undo.txt /*E829*
+E83 message.txt /*E83*
+E830 undo.txt /*E830*
+E831 editing.txt /*E831*
+E832 undo.txt /*E832*
+E833 editing.txt /*E833*
+E834 options.txt /*E834*
+E835 options.txt /*E835*
+E836 if_pyth.txt /*E836*
+E837 if_pyth.txt /*E837*
+E838 netbeans.txt /*E838*
+E84 windows.txt /*E84*
+E840 insert.txt /*E840*
+E841 map.txt /*E841*
+E842 cmdline.txt /*E842*
+E843 editing.txt /*E843*
+E844 syntax.txt /*E844*
+E845 spell.txt /*E845*
+E846 options.txt /*E846*
+E847 syntax.txt /*E847*
+E848 syntax.txt /*E848*
+E849 syntax.txt /*E849*
+E85 options.txt /*E85*
+E850 change.txt /*E850*
+E851 gui_x11.txt /*E851*
+E852 gui_x11.txt /*E852*
+E853 userfunc.txt /*E853*
+E854 options.txt /*E854*
+E855 autocmd.txt /*E855*
+E856 testing.txt /*E856*
+E857 builtin.txt /*E857*
+E858 builtin.txt /*E858*
+E859 builtin.txt /*E859*
+E86 windows.txt /*E86*
+E860 textprop.txt /*E860*
+E861 popup.txt /*E861*
+E862 eval.txt /*E862*
+E863 popup.txt /*E863*
+E864 pattern.txt /*E864*
+E865 pattern.txt /*E865*
+E866 pattern.txt /*E866*
+E867 pattern.txt /*E867*
+E868 pattern.txt /*E868*
+E869 pattern.txt /*E869*
+E87 windows.txt /*E87*
+E870 pattern.txt /*E870*
+E871 pattern.txt /*E871*
+E872 pattern.txt /*E872*
+E873 pattern.txt /*E873*
+E874 pattern.txt /*E874*
+E875 pattern.txt /*E875*
+E876 pattern.txt /*E876*
+E877 pattern.txt /*E877*
+E878 pattern.txt /*E878*
+E879 syntax.txt /*E879*
+E88 windows.txt /*E88*
+E880 if_pyth.txt /*E880*
+E881 autocmd.txt /*E881*
+E882 builtin.txt /*E882*
+E883 builtin.txt /*E883*
+E884 userfunc.txt /*E884*
+E885 sign.txt /*E885*
+E886 starting.txt /*E886*
+E887 if_pyth.txt /*E887*
+E888 pattern.txt /*E888*
+E889 message.txt /*E889*
+E89 message.txt /*E89*
+E890 syntax.txt /*E890*
+E891 eval.txt /*E891*
+E892 eval.txt /*E892*
+E893 eval.txt /*E893*
+E894 eval.txt /*E894*
+E895 if_mzsch.txt /*E895*
+E896 eval.txt /*E896*
+E897 eval.txt /*E897*
+E898 channel.txt /*E898*
+E899 eval.txt /*E899*
+E90 message.txt /*E90*
+E900 builtin.txt /*E900*
+E901 channel.txt /*E901*
+E902 channel.txt /*E902*
+E903 channel.txt /*E903*
+E904 channel.txt /*E904*
+E905 channel.txt /*E905*
+E906 channel.txt /*E906*
+E907 eval.txt /*E907*
+E908 eval.txt /*E908*
+E909 eval.txt /*E909*
+E91 options.txt /*E91*
+E910 eval.txt /*E910*
+E911 eval.txt /*E911*
+E912 channel.txt /*E912*
+E913 eval.txt /*E913*
+E914 eval.txt /*E914*
+E915 channel.txt /*E915*
+E916 channel.txt /*E916*
+E917 channel.txt /*E917*
+E918 channel.txt /*E918*
+E919 repeat.txt /*E919*
+E92 message.txt /*E92*
+E920 channel.txt /*E920*
+E921 channel.txt /*E921*
+E922 builtin.txt /*E922*
+E923 builtin.txt /*E923*
+E924 quickfix.txt /*E924*
+E925 quickfix.txt /*E925*
+E926 quickfix.txt /*E926*
+E927 builtin.txt /*E927*
+E928 message.txt /*E928*
+E929 starting.txt /*E929*
+E93 windows.txt /*E93*
+E930 builtin.txt /*E930*
+E931 message.txt /*E931*
+E932 userfunc.txt /*E932*
+E933 userfunc.txt /*E933*
+E934 sign.txt /*E934*
+E935 builtin.txt /*E935*
+E936 autocmd.txt /*E936*
+E937 autocmd.txt /*E937*
+E938 builtin.txt /*E938*
+E939 change.txt /*E939*
+E94 windows.txt /*E94*
+E940 eval.txt /*E940*
+E941 builtin.txt /*E941*
+E942 builtin.txt /*E942*
+E943 message.txt /*E943*
+E944 pattern.txt /*E944*
+E945 pattern.txt /*E945*
+E946 terminal.txt /*E946*
+E947 terminal.txt /*E947*
+E948 terminal.txt /*E948*
+E949 editing.txt /*E949*
+E95 message.txt /*E95*
+E950 options.txt /*E950*
+E951 pattern.txt /*E951*
+E952 autocmd.txt /*E952*
+E953 terminal.txt /*E953*
+E954 options.txt /*E954*
+E955 terminal.txt /*E955*
+E956 pattern.txt /*E956*
+E957 builtin.txt /*E957*
+E958 terminal.txt /*E958*
+E959 diff.txt /*E959*
+E96 diff.txt /*E96*
+E960 options.txt /*E960*
+E961 cmdline.txt /*E961*
+E962 builtin.txt /*E962*
+E963 eval.txt /*E963*
+E964 textprop.txt /*E964*
+E965 textprop.txt /*E965*
+E966 textprop.txt /*E966*
+E967 textprop.txt /*E967*
+E968 textprop.txt /*E968*
+E969 textprop.txt /*E969*
+E97 diff.txt /*E97*
+E970 textprop.txt /*E970*
+E971 textprop.txt /*E971*
+E972 eval.txt /*E972*
+E973 eval.txt /*E973*
+E974 eval.txt /*E974*
+E975 eval.txt /*E975*
+E976 eval.txt /*E976*
+E977 eval.txt /*E977*
+E978 eval.txt /*E978*
+E979 eval.txt /*E979*
+E98 diff.txt /*E98*
+E980 builtin.txt /*E980*
+E981 starting.txt /*E981*
+E982 terminal.txt /*E982*
+E983 message.txt /*E983*
+E984 repeat.txt /*E984*
+E985 eval.txt /*E985*
+E986 tagsrch.txt /*E986*
+E987 tagsrch.txt /*E987*
+E988 gui_w32.txt /*E988*
+E989 userfunc.txt /*E989*
+E99 diff.txt /*E99*
+E990 eval.txt /*E990*
+E991 eval.txt /*E991*
+E992 options.txt /*E992*
+E993 popup.txt /*E993*
+E994 builtin.txt /*E994*
+E995 eval.txt /*E995*
+E996 eval.txt /*E996*
+E997 popup.txt /*E997*
+E998 builtin.txt /*E998*
+E999 repeat.txt /*E999*
+EX intro.txt /*EX*
+EXINIT starting.txt /*EXINIT*
+Elvis intro.txt /*Elvis*
+EncodingChanged autocmd.txt /*EncodingChanged*
+Eterm syntax.txt /*Eterm*
+Ex intro.txt /*Ex*
+Ex-mode intro.txt /*Ex-mode*
+ExitPre autocmd.txt /*ExitPre*
+Exuberant_ctags tagsrch.txt /*Exuberant_ctags*
+F motion.txt /*F*
+FALSE eval.txt /*FALSE*
+FAQ intro.txt /*FAQ*
+Farsi farsi.txt /*Farsi*
+FileAppendCmd autocmd.txt /*FileAppendCmd*
+FileAppendPost autocmd.txt /*FileAppendPost*
+FileAppendPre autocmd.txt /*FileAppendPre*
+FileChangedRO autocmd.txt /*FileChangedRO*
+FileChangedShell autocmd.txt /*FileChangedShell*
+FileChangedShellPost autocmd.txt /*FileChangedShellPost*
+FileEncoding autocmd.txt /*FileEncoding*
+FileExplorer autocmd.txt /*FileExplorer*
+FileReadCmd autocmd.txt /*FileReadCmd*
+FileReadPost autocmd.txt /*FileReadPost*
+FileReadPre autocmd.txt /*FileReadPre*
+FileType autocmd.txt /*FileType*
+FileWriteCmd autocmd.txt /*FileWriteCmd*
+FileWritePost autocmd.txt /*FileWritePost*
+FileWritePre autocmd.txt /*FileWritePre*
+FilterReadPost autocmd.txt /*FilterReadPost*
+FilterReadPre autocmd.txt /*FilterReadPre*
+FilterWritePost autocmd.txt /*FilterWritePost*
+FilterWritePre autocmd.txt /*FilterWritePre*
+Float eval.txt /*Float*
+FocusGained autocmd.txt /*FocusGained*
+FocusLost autocmd.txt /*FocusLost*
+Folding fold.txt /*Folding*
+FuncUndefined autocmd.txt /*FuncUndefined*
+Funcref eval.txt /*Funcref*
+G motion.txt /*G*
+GNOME gui_x11.txt /*GNOME*
+GTK gui_x11.txt /*GTK*
+GTK+ gui_x11.txt /*GTK+*
+GTK3 gui_x11.txt /*GTK3*
+GUI gui.txt /*GUI*
+GUI-X11 gui_x11.txt /*GUI-X11*
+GUIEnter autocmd.txt /*GUIEnter*
+GUIFailed autocmd.txt /*GUIFailed*
+GetLatestVimScripts pi_getscript.txt /*GetLatestVimScripts*
+GetLatestVimScripts-copyright pi_getscript.txt /*GetLatestVimScripts-copyright*
+GetLatestVimScripts_dat pi_getscript.txt /*GetLatestVimScripts_dat*
+Gnome gui_x11.txt /*Gnome*
+H motion.txt /*H*
+Haiku os_haiku.txt /*Haiku*
+I insert.txt /*I*
+ICCF uganda.txt /*ICCF*
+IM-server mbyte.txt /*IM-server*
+IME mbyte.txt /*IME*
+Insert insert.txt /*Insert*
+Insert-mode insert.txt /*Insert-mode*
+InsertChange autocmd.txt /*InsertChange*
+InsertCharPre autocmd.txt /*InsertCharPre*
+InsertEnter autocmd.txt /*InsertEnter*
+InsertLeave autocmd.txt /*InsertLeave*
+InsertLeavePre autocmd.txt /*InsertLeavePre*
+Integer eval.txt /*Integer*
+J change.txt /*J*
+Japanese mbyte.txt /*Japanese*
+Job eval.txt /*Job*
+Jobs eval.txt /*Jobs*
+K various.txt /*K*
+KDE gui_x11.txt /*KDE*
+KVim gui_x11.txt /*KVim*
+Kibaale uganda.txt /*Kibaale*
+Korean mbyte.txt /*Korean*
+L motion.txt /*L*
+Linux-backspace options.txt /*Linux-backspace*
+List eval.txt /*List*
+Lists eval.txt /*Lists*
+LogiPat() pi_logipat.txt /*LogiPat()*
+LogiPat-flags pi_logipat.txt /*LogiPat-flags*
+Lua if_lua.txt /*Lua*
+M motion.txt /*M*
+MDI starting.txt /*MDI*
+MS-DOS os_msdos.txt /*MS-DOS*
+MS-Windows os_win32.txt /*MS-Windows*
+MSDOS os_msdos.txt /*MSDOS*
+MSVisualStudio if_ole.txt /*MSVisualStudio*
+MVS os_390.txt /*MVS*
+Mac os_mac.txt /*Mac*
+Mac-format editing.txt /*Mac-format*
+Mac-format-write editing.txt /*Mac-format-write*
+Macintosh os_mac.txt /*Macintosh*
+Mark motion.txt /*Mark*
+MenuPopup autocmd.txt /*MenuPopup*
+MiNT os_mint.txt /*MiNT*
+ModeChanged autocmd.txt /*ModeChanged*
+Moolenaar intro.txt /*Moolenaar*
+MorphOS os_amiga.txt /*MorphOS*
+Motif gui_x11.txt /*Motif*
+Myspell spell.txt /*Myspell*
+MzScheme if_mzsch.txt /*MzScheme*
+N pattern.txt /*N*
+N% motion.txt /*N%*
+N: cmdline.txt /*N:*
+N<Del> various.txt /*N<Del>*
+NFA pattern.txt /*NFA*
+NL-used-for-Nul pattern.txt /*NL-used-for-Nul*
+Neovim intro.txt /*Neovim*
+NetBSD-backspace options.txt /*NetBSD-backspace*
+NetBeans netbeans.txt /*NetBeans*
+NetUserPass() pi_netrw.txt /*NetUserPass()*
+NoDefaultCurrentDirectoryInExePath builtin.txt /*NoDefaultCurrentDirectoryInExePath*
+None eval.txt /*None*
+Normal intro.txt /*Normal*
+Normal-mode intro.txt /*Normal-mode*
+Number eval.txt /*Number*
+Nvi intro.txt /*Nvi*
+O insert.txt /*O*
+OS/2 os_os2.txt /*OS\/2*
+OS2 os_os2.txt /*OS2*
+OS390 os_390.txt /*OS390*
+OS390-Motif os_390.txt /*OS390-Motif*
+OS390-PuTTY os_390.txt /*OS390-PuTTY*
+OS390-bugs os_390.txt /*OS390-bugs*
+OS390-has-ebcdic os_390.txt /*OS390-has-ebcdic*
+OS390-limitations os_390.txt /*OS390-limitations*
+OS390-open-source os_390.txt /*OS390-open-source*
+Object vim9class.txt /*Object*
+OffTheSpot mbyte.txt /*OffTheSpot*
+OnTheSpot mbyte.txt /*OnTheSpot*
+Operator-pending intro.txt /*Operator-pending*
+Operator-pending-mode intro.txt /*Operator-pending-mode*
+OptionSet autocmd.txt /*OptionSet*
+OverTheSpot mbyte.txt /*OverTheSpot*
+P change.txt /*P*
+PATHEXT builtin.txt /*PATHEXT*
+PEP8 filetype.txt /*PEP8*
+PHP_BracesAtCodeLevel indent.txt /*PHP_BracesAtCodeLevel*
+PHP_IndentFunctionCallParameters indent.txt /*PHP_IndentFunctionCallParameters*
+PHP_IndentFunctionDeclarationParameters indent.txt /*PHP_IndentFunctionDeclarationParameters*
+PHP_autoformatcomment indent.txt /*PHP_autoformatcomment*
+PHP_default_indenting indent.txt /*PHP_default_indenting*
+PHP_noArrowMatching indent.txt /*PHP_noArrowMatching*
+PHP_outdentSLComments indent.txt /*PHP_outdentSLComments*
+PHP_outdentphpescape indent.txt /*PHP_outdentphpescape*
+PHP_removeCRwhenUnix indent.txt /*PHP_removeCRwhenUnix*
+PHP_vintage_case_default_indent indent.txt /*PHP_vintage_case_default_indent*
+Partial eval.txt /*Partial*
+Pattern pattern.txt /*Pattern*
+Perl if_perl.txt /*Perl*
+Posix intro.txt /*Posix*
+Python if_pyth.txt /*Python*
+Q intro.txt /*Q*
+Q-command-changed version5.txt /*Q-command-changed*
+QNX os_qnx.txt /*QNX*
+Q_ab quickref.txt /*Q_ab*
+Q_ac quickref.txt /*Q_ac*
+Q_ai quickref.txt /*Q_ai*
+Q_bu quickref.txt /*Q_bu*
+Q_ce quickref.txt /*Q_ce*
+Q_ch quickref.txt /*Q_ch*
+Q_cm quickref.txt /*Q_cm*
+Q_co quickref.txt /*Q_co*
+Q_ct help.txt /*Q_ct*
+Q_de quickref.txt /*Q_de*
+Q_di quickref.txt /*Q_di*
+Q_ed quickref.txt /*Q_ed*
+Q_et quickref.txt /*Q_et*
+Q_ex quickref.txt /*Q_ex*
+Q_fl quickref.txt /*Q_fl*
+Q_fo quickref.txt /*Q_fo*
+Q_gu quickref.txt /*Q_gu*
+Q_in quickref.txt /*Q_in*
+Q_km quickref.txt /*Q_km*
+Q_lr quickref.txt /*Q_lr*
+Q_ma quickref.txt /*Q_ma*
+Q_op quickref.txt /*Q_op*
+Q_pa quickref.txt /*Q_pa*
+Q_qf quickref.txt /*Q_qf*
+Q_ra quickref.txt /*Q_ra*
+Q_re quickref.txt /*Q_re*
+Q_sc quickref.txt /*Q_sc*
+Q_si quickref.txt /*Q_si*
+Q_ss quickref.txt /*Q_ss*
+Q_st quickref.txt /*Q_st*
+Q_sy quickref.txt /*Q_sy*
+Q_ta quickref.txt /*Q_ta*
+Q_tm quickref.txt /*Q_tm*
+Q_to quickref.txt /*Q_to*
+Q_ud quickref.txt /*Q_ud*
+Q_ur quickref.txt /*Q_ur*
+Q_vc quickref.txt /*Q_vc*
+Q_vi quickref.txt /*Q_vi*
+Q_vm quickref.txt /*Q_vm*
+Q_wi quickref.txt /*Q_wi*
+Q_wq quickref.txt /*Q_wq*
+QuickFixCmdPost autocmd.txt /*QuickFixCmdPost*
+QuickFixCmdPost-example quickfix.txt /*QuickFixCmdPost-example*
+QuickFixCmdPre autocmd.txt /*QuickFixCmdPre*
+Quickfix quickfix.txt /*Quickfix*
+QuitPre autocmd.txt /*QuitPre*
+R change.txt /*R*
+RISC-OS os_risc.txt /*RISC-OS*
+RISCOS os_risc.txt /*RISCOS*
+RemoteReply autocmd.txt /*RemoteReply*
+Replace insert.txt /*Replace*
+Replace-mode insert.txt /*Replace-mode*
+Root mbyte.txt /*Root*
+Ruby if_ruby.txt /*Ruby*
+Russian russian.txt /*Russian*
+S change.txt /*S*
+SHELL starting.txt /*SHELL*
+SQLGetType ft_sql.txt /*SQLGetType*
+SQLSetType ft_sql.txt /*SQLSetType*
+SafeState autocmd.txt /*SafeState*
+SafeStateAgain autocmd.txt /*SafeStateAgain*
+Select visual.txt /*Select*
+Select-mode visual.txt /*Select-mode*
+Select-mode-mapping visual.txt /*Select-mode-mapping*
+Session starting.txt /*Session*
+SessionLoad-variable starting.txt /*SessionLoad-variable*
+SessionLoadPost autocmd.txt /*SessionLoadPost*
+ShellCmdPost autocmd.txt /*ShellCmdPost*
+ShellFilterPost autocmd.txt /*ShellFilterPost*
+SigUSR1 autocmd.txt /*SigUSR1*
+SourceCmd autocmd.txt /*SourceCmd*
+SourcePost autocmd.txt /*SourcePost*
+SourcePre autocmd.txt /*SourcePre*
+Special eval.txt /*Special*
+SpellFileMissing autocmd.txt /*SpellFileMissing*
+StdinReadPost autocmd.txt /*StdinReadPost*
+StdinReadPre autocmd.txt /*StdinReadPre*
+String eval.txt /*String*
+Sven-Guckes version9.txt /*Sven-Guckes*
+SwapExists autocmd.txt /*SwapExists*
+Syntax autocmd.txt /*Syntax*
+T motion.txt /*T*
+TCL if_tcl.txt /*TCL*
+TERM starting.txt /*TERM*
+TOhtml-encoding syntax.txt /*TOhtml-encoding*
+TOhtml-encoding-detect syntax.txt /*TOhtml-encoding-detect*
+TOhtml-performance syntax.txt /*TOhtml-performance*
+TOhtml-progress-color syntax.txt /*TOhtml-progress-color*
+TOhtml-uncopyable-text syntax.txt /*TOhtml-uncopyable-text*
+TOhtml-wrap-text syntax.txt /*TOhtml-wrap-text*
+TRUE eval.txt /*TRUE*
+TSQL ft_sql.txt /*TSQL*
+TTpro-telnet syntax.txt /*TTpro-telnet*
+Tab intro.txt /*Tab*
+TabClosed autocmd.txt /*TabClosed*
+TabEnter autocmd.txt /*TabEnter*
+TabLeave autocmd.txt /*TabLeave*
+TabNew autocmd.txt /*TabNew*
+Tcl if_tcl.txt /*Tcl*
+TermChanged autocmd.txt /*TermChanged*
+TermResponse autocmd.txt /*TermResponse*
+TermdebugStartPost terminal.txt /*TermdebugStartPost*
+TermdebugStartPre terminal.txt /*TermdebugStartPre*
+TermdebugStopPost terminal.txt /*TermdebugStopPost*
+TermdebugStopPre terminal.txt /*TermdebugStopPre*
+Terminal-Job terminal.txt /*Terminal-Job*
+Terminal-Normal terminal.txt /*Terminal-Normal*
+Terminal-mode terminal.txt /*Terminal-mode*
+TerminalOpen autocmd.txt /*TerminalOpen*
+TerminalWinOpen autocmd.txt /*TerminalWinOpen*
+TextChanged autocmd.txt /*TextChanged*
+TextChangedI autocmd.txt /*TextChangedI*
+TextChangedP autocmd.txt /*TextChangedP*
+TextChangedT autocmd.txt /*TextChangedT*
+TextYankPost autocmd.txt /*TextYankPost*
+Transact-SQL ft_sql.txt /*Transact-SQL*
+U undo.txt /*U*
+UTF-8 mbyte.txt /*UTF-8*
+UTF8-xterm mbyte.txt /*UTF8-xterm*
+Uganda uganda.txt /*Uganda*
+Unicode mbyte.txt /*Unicode*
+Unix os_unix.txt /*Unix*
+Unix-format editing.txt /*Unix-format*
+Unix-format-write editing.txt /*Unix-format-write*
+User autocmd.txt /*User*
+UserGettingBored autocmd.txt /*UserGettingBored*
+V visual.txt /*V*
+VIMINIT starting.txt /*VIMINIT*
+VMS os_vms.txt /*VMS*
+Vi intro.txt /*Vi*
+View starting.txt /*View*
+Vim9 vim9.txt /*Vim9*
+Vim9-abstract-class vim9class.txt /*Vim9-abstract-class*
+Vim9-class vim9class.txt /*Vim9-class*
+Vim9-class-member vim9class.txt /*Vim9-class-member*
+Vim9-class-overview vim9class.txt /*Vim9-class-overview*
+Vim9-enum vim9class.txt /*Vim9-enum*
+Vim9-script vim9.txt /*Vim9-script*
+Vim9-simple-class vim9class.txt /*Vim9-simple-class*
+Vim9-type vim9class.txt /*Vim9-type*
+Vim9-using-interface vim9class.txt /*Vim9-using-interface*
+VimEnter autocmd.txt /*VimEnter*
+VimLeave autocmd.txt /*VimLeave*
+VimLeavePre autocmd.txt /*VimLeavePre*
+VimResized autocmd.txt /*VimResized*
+VimResume autocmd.txt /*VimResume*
+VimSuspend autocmd.txt /*VimSuspend*
+Vimball-copyright pi_vimball.txt /*Vimball-copyright*
+Virtual-Replace-mode insert.txt /*Virtual-Replace-mode*
+Visual visual.txt /*Visual*
+Visual-mode visual.txt /*Visual-mode*
+W motion.txt /*W*
+W10 message.txt /*W10*
+W11 message.txt /*W11*
+W12 message.txt /*W12*
+W13 message.txt /*W13*
+W14 message.txt /*W14*
+W15 repeat.txt /*W15*
+W16 message.txt /*W16*
+W17 arabic.txt /*W17*
+W18 syntax.txt /*W18*
+W19 autocmd.txt /*W19*
+W20 if_pyth.txt /*W20*
+W21 if_pyth.txt /*W21*
+W22 userfunc.txt /*W22*
+WORD motion.txt /*WORD*
+WSL os_win32.txt /*WSL*
+WWW intro.txt /*WWW*
+Win32 os_win32.txt /*Win32*
+WinBar gui.txt /*WinBar*
+WinClosed autocmd.txt /*WinClosed*
+WinEnter autocmd.txt /*WinEnter*
+WinLeave autocmd.txt /*WinLeave*
+WinNew autocmd.txt /*WinNew*
+WinResized autocmd.txt /*WinResized*
+WinResized-event windows.txt /*WinResized-event*
+WinScrolled autocmd.txt /*WinScrolled*
+WinScrolled-event windows.txt /*WinScrolled-event*
+X change.txt /*X*
+X11 options.txt /*X11*
+X11-icon gui_x11.txt /*X11-icon*
+X11_mouse_shapes gui_x11.txt /*X11_mouse_shapes*
+X1Drag term.txt /*X1Drag*
+X1Mouse term.txt /*X1Mouse*
+X1Release term.txt /*X1Release*
+X2Drag term.txt /*X2Drag*
+X2Mouse term.txt /*X2Mouse*
+X2Release term.txt /*X2Release*
+XIM mbyte.txt /*XIM*
+XLFD mbyte.txt /*XLFD*
+Y change.txt /*Y*
+Y2K intro.txt /*Y2K*
+ZQ editing.txt /*ZQ*
+ZZ editing.txt /*ZZ*
+[ index.txt /*[*
+[# motion.txt /*[#*
+[' motion.txt /*['*
+[( motion.txt /*[(*
+[++opt] editing.txt /*[++opt]*
+[+cmd] editing.txt /*[+cmd]*
+[..] pattern.txt /*[..]*
+[/ motion.txt /*[\/*
+[:alnum:] pattern.txt /*[:alnum:]*
+[:alpha:] pattern.txt /*[:alpha:]*
+[:backspace:] pattern.txt /*[:backspace:]*
+[:blank:] pattern.txt /*[:blank:]*
+[:cntrl:] pattern.txt /*[:cntrl:]*
+[:digit:] pattern.txt /*[:digit:]*
+[:escape:] pattern.txt /*[:escape:]*
+[:fname:] pattern.txt /*[:fname:]*
+[:graph:] pattern.txt /*[:graph:]*
+[:ident:] pattern.txt /*[:ident:]*
+[:keyword:] pattern.txt /*[:keyword:]*
+[:lower:] pattern.txt /*[:lower:]*
+[:print:] pattern.txt /*[:print:]*
+[:punct:] pattern.txt /*[:punct:]*
+[:return:] pattern.txt /*[:return:]*
+[:space:] pattern.txt /*[:space:]*
+[:tab:] pattern.txt /*[:tab:]*
+[:upper:] pattern.txt /*[:upper:]*
+[:xdigit:] pattern.txt /*[:xdigit:]*
+[<MiddleMouse> change.txt /*[<MiddleMouse>*
+[==] pattern.txt /*[==]*
+[D tagsrch.txt /*[D*
+[I tagsrch.txt /*[I*
+[M motion.txt /*[M*
+[P change.txt /*[P*
+[S spell.txt /*[S*
+[[ motion.txt /*[[*
+[] motion.txt /*[]*
+[_CTRL-D tagsrch.txt /*[_CTRL-D*
+[_CTRL-I tagsrch.txt /*[_CTRL-I*
+[` motion.txt /*[`*
+[c diff.txt /*[c*
+[count] intro.txt /*[count]*
+[d tagsrch.txt /*[d*
+[f editing.txt /*[f*
+[i tagsrch.txt /*[i*
+[m motion.txt /*[m*
+[p change.txt /*[p*
+[pattern] pattern.txt /*[pattern]*
+[quotex] intro.txt /*[quotex]*
+[range] cmdline.txt /*[range]*
+[s spell.txt /*[s*
+[star motion.txt /*[star*
+[z fold.txt /*[z*
+[{ motion.txt /*[{*
+\0 change.txt /*\\0*
+] index.txt /*]*
+]# motion.txt /*]#*
+]' motion.txt /*]'*
+]) motion.txt /*])*
+]/ motion.txt /*]\/*
+]<MiddleMouse> change.txt /*]<MiddleMouse>*
+]D tagsrch.txt /*]D*
+]I tagsrch.txt /*]I*
+]M motion.txt /*]M*
+]P change.txt /*]P*
+]S spell.txt /*]S*
+][ motion.txt /*][*
+]] motion.txt /*]]*
+]_CTRL-D tagsrch.txt /*]_CTRL-D*
+]_CTRL-I tagsrch.txt /*]_CTRL-I*
+]` motion.txt /*]`*
+]c diff.txt /*]c*
+]d tagsrch.txt /*]d*
+]f editing.txt /*]f*
+]i tagsrch.txt /*]i*
+]m motion.txt /*]m*
+]p change.txt /*]p*
+]s spell.txt /*]s*
+]star motion.txt /*]star*
+]z fold.txt /*]z*
+]} motion.txt /*]}*
+^ motion.txt /*^*
+_ motion.txt /*_*
+_exrc starting.txt /*_exrc*
+_gvimrc gui.txt /*_gvimrc*
+_vimrc starting.txt /*_vimrc*
+` motion.txt /*`*
+`( motion.txt /*`(*
+`) motion.txt /*`)*
+`-expansion editing.txt /*`-expansion*
+`. motion.txt /*`.*
+`0 motion.txt /*`0*
+`< motion.txt /*`<*
+`= editing.txt /*`=*
+`> motion.txt /*`>*
+`A motion.txt /*`A*
+`[ motion.txt /*`[*
+`] motion.txt /*`]*
+`^ motion.txt /*`^*
+`` motion.txt /*``*
+`a motion.txt /*`a*
+`quote motion.txt /*`quote*
+`{ motion.txt /*`{*
+`} motion.txt /*`}*
+a insert.txt /*a*
+a' motion.txt /*a'*
+a( motion.txt /*a(*
+a) motion.txt /*a)*
+a4 print.txt /*a4*
+a:0 userfunc.txt /*a:0*
+a:000 userfunc.txt /*a:000*
+a:1 userfunc.txt /*a:1*
+a:firstline userfunc.txt /*a:firstline*
+a:lastline userfunc.txt /*a:lastline*
+a:var userfunc.txt /*a:var*
+a< motion.txt /*a<*
+a> motion.txt /*a>*
+aB motion.txt /*aB*
+aW motion.txt /*aW*
+a[ motion.txt /*a[*
+a] motion.txt /*a]*
+a` motion.txt /*a`*
+ab motion.txt /*ab*
+abandon editing.txt /*abandon*
+abbreviations map.txt /*abbreviations*
+abel.vim syntax.txt /*abel.vim*
+abs() builtin.txt /*abs()*
+acos() builtin.txt /*acos()*
+active-buffer windows.txt /*active-buffer*
+ada#Create_Tags() ft_ada.txt /*ada#Create_Tags()*
+ada#Jump_Tag() ft_ada.txt /*ada#Jump_Tag()*
+ada#Listtags() ft_ada.txt /*ada#Listtags()*
+ada#Switch_Syntax_Option() ft_ada.txt /*ada#Switch_Syntax_Option()*
+ada#Word() ft_ada.txt /*ada#Word()*
+ada-compiler ft_ada.txt /*ada-compiler*
+ada-ctags ft_ada.txt /*ada-ctags*
+ada-extra-plugins ft_ada.txt /*ada-extra-plugins*
+ada-reference ft_ada.txt /*ada-reference*
+ada.vim ft_ada.txt /*ada.vim*
+add() builtin.txt /*add()*
+add-filetype-plugin usr_05.txt /*add-filetype-plugin*
+add-global-plugin usr_05.txt /*add-global-plugin*
+add-local-help usr_05.txt /*add-local-help*
+add-option-flags options.txt /*add-option-flags*
+add-package usr_05.txt /*add-package*
+add-plugin usr_05.txt /*add-plugin*
+added-5.1 version5.txt /*added-5.1*
+added-5.2 version5.txt /*added-5.2*
+added-5.3 version5.txt /*added-5.3*
+added-5.4 version5.txt /*added-5.4*
+added-5.5 version5.txt /*added-5.5*
+added-5.6 version5.txt /*added-5.6*
+added-5.7 version5.txt /*added-5.7*
+added-5.8 version5.txt /*added-5.8*
+added-6.1 version6.txt /*added-6.1*
+added-6.2 version6.txt /*added-6.2*
+added-6.3 version6.txt /*added-6.3*
+added-6.4 version6.txt /*added-6.4*
+added-7.1 version7.txt /*added-7.1*
+added-7.2 version7.txt /*added-7.2*
+added-7.3 version7.txt /*added-7.3*
+added-7.4 version7.txt /*added-7.4*
+added-8.1 version8.txt /*added-8.1*
+added-8.2 version8.txt /*added-8.2*
+added-BeOS version5.txt /*added-BeOS*
+added-Mac version5.txt /*added-Mac*
+added-VMS version5.txt /*added-VMS*
+added-cmdline-args version5.txt /*added-cmdline-args*
+added-options version5.txt /*added-options*
+added-regexp version5.txt /*added-regexp*
+added-various version5.txt /*added-various*
+added-win32-GUI version5.txt /*added-win32-GUI*
+aff-dic-format spell.txt /*aff-dic-format*
+after-directory options.txt /*after-directory*
+aleph options.txt /*aleph*
+alt intro.txt /*alt*
+alt-input debugger.txt /*alt-input*
+alternate-file editing.txt /*alternate-file*
+amiga-window starting.txt /*amiga-window*
+and() builtin.txt /*and()*
+anonymous-function eval.txt /*anonymous-function*
+ant.vim syntax.txt /*ant.vim*
+ap motion.txt /*ap*
+apache.vim syntax.txt /*apache.vim*
+append() builtin.txt /*append()*
+appendbufline() builtin.txt /*appendbufline()*
+aquote motion.txt /*aquote*
+arabic.txt arabic.txt /*arabic.txt*
+arabicfonts arabic.txt /*arabicfonts*
+arabickeymap arabic.txt /*arabickeymap*
+arg-functions usr_41.txt /*arg-functions*
+argc() builtin.txt /*argc()*
+argidx() builtin.txt /*argidx()*
+arglist editing.txt /*arglist*
+arglist-position editing.txt /*arglist-position*
+arglist-quit usr_07.txt /*arglist-quit*
+arglistid() builtin.txt /*arglistid()*
+argument-list editing.txt /*argument-list*
+argv() builtin.txt /*argv()*
+argv-variable eval.txt /*argv-variable*
+arrow_modifiers term.txt /*arrow_modifiers*
+as motion.txt /*as*
+asin() builtin.txt /*asin()*
+asm.vim syntax.txt /*asm.vim*
+asm68k syntax.txt /*asm68k*
+asmh8300.vim syntax.txt /*asmh8300.vim*
+assert-functions-details testing.txt /*assert-functions-details*
+assert-return eval.txt /*assert-return*
+assert_beeps() testing.txt /*assert_beeps()*
+assert_equal() testing.txt /*assert_equal()*
+assert_equalfile() testing.txt /*assert_equalfile()*
+assert_exception() testing.txt /*assert_exception()*
+assert_fails() testing.txt /*assert_fails()*
+assert_false() testing.txt /*assert_false()*
+assert_inrange() testing.txt /*assert_inrange()*
+assert_match() testing.txt /*assert_match()*
+assert_nobeep() testing.txt /*assert_nobeep()*
+assert_notequal() testing.txt /*assert_notequal()*
+assert_notmatch() testing.txt /*assert_notmatch()*
+assert_report() testing.txt /*assert_report()*
+assert_true() testing.txt /*assert_true()*
+at motion.txt /*at*
+atan() builtin.txt /*atan()*
+atan2() builtin.txt /*atan2()*
+attr-list syntax.txt /*attr-list*
+author intro.txt /*author*
+auto-format change.txt /*auto-format*
+auto-setting options.txt /*auto-setting*
+auto-shortname editing.txt /*auto-shortname*
+autocmd-<> tips.txt /*autocmd-<>*
+autocmd-buffer-local autocmd.txt /*autocmd-buffer-local*
+autocmd-buflocal autocmd.txt /*autocmd-buflocal*
+autocmd-changes autocmd.txt /*autocmd-changes*
+autocmd-define autocmd.txt /*autocmd-define*
+autocmd-disable autocmd.txt /*autocmd-disable*
+autocmd-events autocmd.txt /*autocmd-events*
+autocmd-events-abc autocmd.txt /*autocmd-events-abc*
+autocmd-execute autocmd.txt /*autocmd-execute*
+autocmd-expand autocmd.txt /*autocmd-expand*
+autocmd-functions usr_41.txt /*autocmd-functions*
+autocmd-groups autocmd.txt /*autocmd-groups*
+autocmd-intro autocmd.txt /*autocmd-intro*
+autocmd-list autocmd.txt /*autocmd-list*
+autocmd-nested autocmd.txt /*autocmd-nested*
+autocmd-once autocmd.txt /*autocmd-once*
+autocmd-osfiletypes filetype.txt /*autocmd-osfiletypes*
+autocmd-patterns autocmd.txt /*autocmd-patterns*
+autocmd-remove autocmd.txt /*autocmd-remove*
+autocmd-searchpat autocmd.txt /*autocmd-searchpat*
+autocmd-use autocmd.txt /*autocmd-use*
+autocmd.txt autocmd.txt /*autocmd.txt*
+autocmd_add() builtin.txt /*autocmd_add()*
+autocmd_delete() builtin.txt /*autocmd_delete()*
+autocmd_get() builtin.txt /*autocmd_get()*
+autocmds-kept version5.txt /*autocmds-kept*
+autocommand autocmd.txt /*autocommand*
+autocommand-events autocmd.txt /*autocommand-events*
+autocommand-pattern autocmd.txt /*autocommand-pattern*
+autocommands autocmd.txt /*autocommands*
+autoformat change.txt /*autoformat*
+autoload userfunc.txt /*autoload*
+autoload-functions userfunc.txt /*autoload-functions*
+avoid-hit-enter version5.txt /*avoid-hit-enter*
+aw motion.txt /*aw*
+a{ motion.txt /*a{*
+a} motion.txt /*a}*
+b motion.txt /*b*
+b: eval.txt /*b:*
+b:changedtick eval.txt /*b:changedtick*
+b:changelog_name filetype.txt /*b:changelog_name*
+b:clojure_syntax_keywords syntax.txt /*b:clojure_syntax_keywords*
+b:clojure_syntax_without_core_keywords syntax.txt /*b:clojure_syntax_without_core_keywords*
+b:current_syntax-variable syntax.txt /*b:current_syntax-variable*
+b:netrw_lastfile pi_netrw.txt /*b:netrw_lastfile*
+b:tex_stylish syntax.txt /*b:tex_stylish*
+b:var eval.txt /*b:var*
+b:yaml_schema syntax.txt /*b:yaml_schema*
+baan-folding syntax.txt /*baan-folding*
+baan-syntax syntax.txt /*baan-syntax*
+baan.vim syntax.txt /*baan.vim*
+backslash intro.txt /*backslash*
+backspace intro.txt /*backspace*
+backspace-delete version4.txt /*backspace-delete*
+backtick-expansion editing.txt /*backtick-expansion*
+backup editing.txt /*backup*
+backup-changed version4.txt /*backup-changed*
+backup-extension version4.txt /*backup-extension*
+backup-table editing.txt /*backup-table*
+balloon-eval debugger.txt /*balloon-eval*
+balloon_gettext() builtin.txt /*balloon_gettext()*
+balloon_show() builtin.txt /*balloon_show()*
+balloon_split() builtin.txt /*balloon_split()*
+bar motion.txt /*bar*
+bars help.txt /*bars*
+base_font_name_list mbyte.txt /*base_font_name_list*
+basic.vim syntax.txt /*basic.vim*
+beep options.txt /*beep*
+beos os_beos.txt /*beos*
+better-python-interface version7.txt /*better-python-interface*
+beval_bufnr-variable eval.txt /*beval_bufnr-variable*
+beval_col-variable eval.txt /*beval_col-variable*
+beval_lnum-variable eval.txt /*beval_lnum-variable*
+beval_text-variable eval.txt /*beval_text-variable*
+beval_winid-variable eval.txt /*beval_winid-variable*
+beval_winnr-variable eval.txt /*beval_winnr-variable*
+binary-number eval.txt /*binary-number*
+bitwise-function usr_41.txt /*bitwise-function*
+bitwise-shift eval.txt /*bitwise-shift*
+blob eval.txt /*blob*
+blob-functions usr_41.txt /*blob-functions*
+blob-identity eval.txt /*blob-identity*
+blob-index eval.txt /*blob-index*
+blob-literal eval.txt /*blob-literal*
+blob-modification eval.txt /*blob-modification*
+blob2list() builtin.txt /*blob2list()*
+blockwise-examples visual.txt /*blockwise-examples*
+blockwise-operators visual.txt /*blockwise-operators*
+blockwise-put change.txt /*blockwise-put*
+blockwise-register change.txt /*blockwise-register*
+blockwise-visual visual.txt /*blockwise-visual*
+blowfish options.txt /*blowfish*
+blowfish2 options.txt /*blowfish2*
+bold syntax.txt /*bold*
+bom-bytes mbyte.txt /*bom-bytes*
+book intro.txt /*book*
+bookmark usr_03.txt /*bookmark*
+books intro.txt /*books*
+boolean options.txt /*boolean*
+break-finally eval.txt /*break-finally*
+browse() builtin.txt /*browse()*
+browsedir() builtin.txt /*browsedir()*
+browsefilter editing.txt /*browsefilter*
+bufadd() builtin.txt /*bufadd()*
+bufexists() builtin.txt /*bufexists()*
+buffer-functions usr_41.txt /*buffer-functions*
+buffer-hidden windows.txt /*buffer-hidden*
+buffer-list windows.txt /*buffer-list*
+buffer-variable eval.txt /*buffer-variable*
+buffer-write editing.txt /*buffer-write*
+buffer_exists() builtin.txt /*buffer_exists()*
+buffer_name() builtin.txt /*buffer_name()*
+buffer_number() builtin.txt /*buffer_number()*
+buffers windows.txt /*buffers*
+buffers-menu gui.txt /*buffers-menu*
+buflisted() builtin.txt /*buflisted()*
+bufload() builtin.txt /*bufload()*
+bufloaded() builtin.txt /*bufloaded()*
+bufname() builtin.txt /*bufname()*
+bufnr() builtin.txt /*bufnr()*
+bufwinid() builtin.txt /*bufwinid()*
+bufwinnr() builtin.txt /*bufwinnr()*
+bug-fixes-5 version5.txt /*bug-fixes-5*
+bug-fixes-6 version6.txt /*bug-fixes-6*
+bug-fixes-7 version7.txt /*bug-fixes-7*
+bug-fixes-8 version8.txt /*bug-fixes-8*
+bug-fixes-9 version9.txt /*bug-fixes-9*
+bug-reports intro.txt /*bug-reports*
+bugreport.vim intro.txt /*bugreport.vim*
+bugs intro.txt /*bugs*
+builtin-function-details builtin.txt /*builtin-function-details*
+builtin-function-list builtin.txt /*builtin-function-list*
+builtin-functions builtin.txt /*builtin-functions*
+builtin-terms term.txt /*builtin-terms*
+builtin-tools gui.txt /*builtin-tools*
+builtin.txt builtin.txt /*builtin.txt*
+builtin_terms term.txt /*builtin_terms*
+byte-count editing.txt /*byte-count*
+byte2line() builtin.txt /*byte2line()*
+byteidx() builtin.txt /*byteidx()*
+byteidxcomp() builtin.txt /*byteidxcomp()*
+bzip2 pi_gzip.txt /*bzip2*
+c change.txt /*c*
+c.vim syntax.txt /*c.vim*
+cW change.txt /*cW*
+c_# cmdline.txt /*c_#*
+c_## cmdline.txt /*c_##*
+c_#< cmdline.txt /*c_#<*
+c_#n cmdline.txt /*c_#n*
+c_% cmdline.txt /*c_%*
+c_%% cmdline.txt /*c_%%*
+c_%%%# cmdline.txt /*c_%%%#*
+c_%%< cmdline.txt /*c_%%<*
+c_%%n cmdline.txt /*c_%%n*
+c_<BS> cmdline.txt /*c_<BS>*
+c_<C-Left> cmdline.txt /*c_<C-Left>*
+c_<C-R> cmdline.txt /*c_<C-R>*
+c_<C-R>_<C-A> cmdline.txt /*c_<C-R>_<C-A>*
+c_<C-R>_<C-F> cmdline.txt /*c_<C-R>_<C-F>*
+c_<C-R>_<C-L> cmdline.txt /*c_<C-R>_<C-L>*
+c_<C-R>_<C-O> cmdline.txt /*c_<C-R>_<C-O>*
+c_<C-R>_<C-P> cmdline.txt /*c_<C-R>_<C-P>*
+c_<C-R>_<C-R> cmdline.txt /*c_<C-R>_<C-R>*
+c_<C-R>_<C-W> cmdline.txt /*c_<C-R>_<C-W>*
+c_<C-Right> cmdline.txt /*c_<C-Right>*
+c_<CR> cmdline.txt /*c_<CR>*
+c_<Del> cmdline.txt /*c_<Del>*
+c_<Down> cmdline.txt /*c_<Down>*
+c_<End> cmdline.txt /*c_<End>*
+c_<Esc> cmdline.txt /*c_<Esc>*
+c_<Home> cmdline.txt /*c_<Home>*
+c_<Insert> cmdline.txt /*c_<Insert>*
+c_<Left> cmdline.txt /*c_<Left>*
+c_<LeftMouse> cmdline.txt /*c_<LeftMouse>*
+c_<MiddleMouse> cmdline.txt /*c_<MiddleMouse>*
+c_<NL> cmdline.txt /*c_<NL>*
+c_<PageDown> cmdline.txt /*c_<PageDown>*
+c_<PageUp> cmdline.txt /*c_<PageUp>*
+c_<Right> cmdline.txt /*c_<Right>*
+c_<S-Down> cmdline.txt /*c_<S-Down>*
+c_<S-Left> cmdline.txt /*c_<S-Left>*
+c_<S-Right> cmdline.txt /*c_<S-Right>*
+c_<S-Tab> cmdline.txt /*c_<S-Tab>*
+c_<S-Up> cmdline.txt /*c_<S-Up>*
+c_<Tab> cmdline.txt /*c_<Tab>*
+c_<Up> cmdline.txt /*c_<Up>*
+c_BS cmdline.txt /*c_BS*
+c_CR cmdline.txt /*c_CR*
+c_CTRL-A cmdline.txt /*c_CTRL-A*
+c_CTRL-B cmdline.txt /*c_CTRL-B*
+c_CTRL-C cmdline.txt /*c_CTRL-C*
+c_CTRL-D cmdline.txt /*c_CTRL-D*
+c_CTRL-E cmdline.txt /*c_CTRL-E*
+c_CTRL-F cmdline.txt /*c_CTRL-F*
+c_CTRL-G cmdline.txt /*c_CTRL-G*
+c_CTRL-H cmdline.txt /*c_CTRL-H*
+c_CTRL-I cmdline.txt /*c_CTRL-I*
+c_CTRL-J cmdline.txt /*c_CTRL-J*
+c_CTRL-K cmdline.txt /*c_CTRL-K*
+c_CTRL-L cmdline.txt /*c_CTRL-L*
+c_CTRL-M cmdline.txt /*c_CTRL-M*
+c_CTRL-N cmdline.txt /*c_CTRL-N*
+c_CTRL-P cmdline.txt /*c_CTRL-P*
+c_CTRL-Q cmdline.txt /*c_CTRL-Q*
+c_CTRL-R cmdline.txt /*c_CTRL-R*
+c_CTRL-R_= cmdline.txt /*c_CTRL-R_=*
+c_CTRL-R_CTRL-A cmdline.txt /*c_CTRL-R_CTRL-A*
+c_CTRL-R_CTRL-F cmdline.txt /*c_CTRL-R_CTRL-F*
+c_CTRL-R_CTRL-L cmdline.txt /*c_CTRL-R_CTRL-L*
+c_CTRL-R_CTRL-O cmdline.txt /*c_CTRL-R_CTRL-O*
+c_CTRL-R_CTRL-P cmdline.txt /*c_CTRL-R_CTRL-P*
+c_CTRL-R_CTRL-R cmdline.txt /*c_CTRL-R_CTRL-R*
+c_CTRL-R_CTRL-W cmdline.txt /*c_CTRL-R_CTRL-W*
+c_CTRL-SHIFT-Q cmdline.txt /*c_CTRL-SHIFT-Q*
+c_CTRL-SHIFT-V cmdline.txt /*c_CTRL-SHIFT-V*
+c_CTRL-T cmdline.txt /*c_CTRL-T*
+c_CTRL-U cmdline.txt /*c_CTRL-U*
+c_CTRL-V cmdline.txt /*c_CTRL-V*
+c_CTRL-W cmdline.txt /*c_CTRL-W*
+c_CTRL-Y cmdline.txt /*c_CTRL-Y*
+c_CTRL-[ cmdline.txt /*c_CTRL-[*
+c_CTRL-\_CTRL-G intro.txt /*c_CTRL-\\_CTRL-G*
+c_CTRL-\_CTRL-N intro.txt /*c_CTRL-\\_CTRL-N*
+c_CTRL-\_e cmdline.txt /*c_CTRL-\\_e*
+c_CTRL-] cmdline.txt /*c_CTRL-]*
+c_CTRL-^ cmdline.txt /*c_CTRL-^*
+c_CTRL-_ cmdline.txt /*c_CTRL-_*
+c_Del cmdline.txt /*c_Del*
+c_Down cmdline.txt /*c_Down*
+c_End cmdline.txt /*c_End*
+c_Esc cmdline.txt /*c_Esc*
+c_Home cmdline.txt /*c_Home*
+c_Insert cmdline.txt /*c_Insert*
+c_Left cmdline.txt /*c_Left*
+c_Right cmdline.txt /*c_Right*
+c_Up cmdline.txt /*c_Up*
+c_ansi_constants syntax.txt /*c_ansi_constants*
+c_ansi_typedefs syntax.txt /*c_ansi_typedefs*
+c_comment_strings syntax.txt /*c_comment_strings*
+c_curly_error syntax.txt /*c_curly_error*
+c_digraph cmdline.txt /*c_digraph*
+c_gnu syntax.txt /*c_gnu*
+c_no_ansi syntax.txt /*c_no_ansi*
+c_no_bracket_error syntax.txt /*c_no_bracket_error*
+c_no_bsd syntax.txt /*c_no_bsd*
+c_no_c11 syntax.txt /*c_no_c11*
+c_no_c99 syntax.txt /*c_no_c99*
+c_no_cformat syntax.txt /*c_no_cformat*
+c_no_curly_error syntax.txt /*c_no_curly_error*
+c_no_if0 syntax.txt /*c_no_if0*
+c_no_tab_space_error syntax.txt /*c_no_tab_space_error*
+c_no_trail_space_error syntax.txt /*c_no_trail_space_error*
+c_no_utf syntax.txt /*c_no_utf*
+c_space_errors syntax.txt /*c_space_errors*
+c_syntax_for_h syntax.txt /*c_syntax_for_h*
+c_wildchar cmdline.txt /*c_wildchar*
+call() builtin.txt /*call()*
+carriage-return intro.txt /*carriage-return*
+case change.txt /*case*
+catch-all eval.txt /*catch-all*
+catch-errors eval.txt /*catch-errors*
+catch-interrupt eval.txt /*catch-interrupt*
+catch-order eval.txt /*catch-order*
+catch-text eval.txt /*catch-text*
+cc change.txt /*cc*
+ceil() builtin.txt /*ceil()*
+cfilter-plugin quickfix.txt /*cfilter-plugin*
+ch.vim syntax.txt /*ch.vim*
+ch_canread() channel.txt /*ch_canread()*
+ch_close() channel.txt /*ch_close()*
+ch_close_in() channel.txt /*ch_close_in()*
+ch_evalexpr() channel.txt /*ch_evalexpr()*
+ch_evalraw() channel.txt /*ch_evalraw()*
+ch_getbufnr() channel.txt /*ch_getbufnr()*
+ch_getjob() channel.txt /*ch_getjob()*
+ch_info() channel.txt /*ch_info()*
+ch_log() channel.txt /*ch_log()*
+ch_logfile() channel.txt /*ch_logfile()*
+ch_open() channel.txt /*ch_open()*
+ch_read() channel.txt /*ch_read()*
+ch_readblob() channel.txt /*ch_readblob()*
+ch_readraw() channel.txt /*ch_readraw()*
+ch_sendexpr() channel.txt /*ch_sendexpr()*
+ch_sendraw() channel.txt /*ch_sendraw()*
+ch_setoptions() channel.txt /*ch_setoptions()*
+ch_status() channel.txt /*ch_status()*
+change-list-jumps motion.txt /*change-list-jumps*
+change-name tips.txt /*change-name*
+change-tabs change.txt /*change-tabs*
+change.txt change.txt /*change.txt*
+changed-5.1 version5.txt /*changed-5.1*
+changed-5.2 version5.txt /*changed-5.2*
+changed-5.3 version5.txt /*changed-5.3*
+changed-5.4 version5.txt /*changed-5.4*
+changed-5.5 version5.txt /*changed-5.5*
+changed-5.6 version5.txt /*changed-5.6*
+changed-5.7 version5.txt /*changed-5.7*
+changed-5.8 version5.txt /*changed-5.8*
+changed-6.1 version6.txt /*changed-6.1*
+changed-6.2 version6.txt /*changed-6.2*
+changed-6.3 version6.txt /*changed-6.3*
+changed-6.4 version6.txt /*changed-6.4*
+changed-7.1 version7.txt /*changed-7.1*
+changed-7.2 version7.txt /*changed-7.2*
+changed-7.3 version7.txt /*changed-7.3*
+changed-7.4 version7.txt /*changed-7.4*
+changed-8.1 version8.txt /*changed-8.1*
+changed-8.2 version8.txt /*changed-8.2*
+changelist motion.txt /*changelist*
+changelog.vim syntax.txt /*changelog.vim*
+changenr() builtin.txt /*changenr()*
+changetick eval.txt /*changetick*
+changing change.txt /*changing*
+channel channel.txt /*channel*
+channel-address channel.txt /*channel-address*
+channel-callback channel.txt /*channel-callback*
+channel-close channel.txt /*channel-close*
+channel-close-in channel.txt /*channel-close-in*
+channel-commands channel.txt /*channel-commands*
+channel-demo channel.txt /*channel-demo*
+channel-drop channel.txt /*channel-drop*
+channel-functions usr_41.txt /*channel-functions*
+channel-functions-details channel.txt /*channel-functions-details*
+channel-mode channel.txt /*channel-mode*
+channel-more channel.txt /*channel-more*
+channel-noblock channel.txt /*channel-noblock*
+channel-onetime-callback channel.txt /*channel-onetime-callback*
+channel-open channel.txt /*channel-open*
+channel-open-options channel.txt /*channel-open-options*
+channel-raw channel.txt /*channel-raw*
+channel-timeout channel.txt /*channel-timeout*
+channel-use channel.txt /*channel-use*
+channel.txt channel.txt /*channel.txt*
+char-variable eval.txt /*char-variable*
+char2nr() builtin.txt /*char2nr()*
+characterwise motion.txt /*characterwise*
+characterwise-register change.txt /*characterwise-register*
+characterwise-visual visual.txt /*characterwise-visual*
+charclass() builtin.txt /*charclass()*
+charcol() builtin.txt /*charcol()*
+charconvert_from-variable eval.txt /*charconvert_from-variable*
+charconvert_to-variable eval.txt /*charconvert_to-variable*
+charidx() builtin.txt /*charidx()*
+charity uganda.txt /*charity*
+charset mbyte.txt /*charset*
+charset-conversion mbyte.txt /*charset-conversion*
+chdir() builtin.txt /*chdir()*
+chill.vim syntax.txt /*chill.vim*
+chmod builtin.txt /*chmod*
+cindent() builtin.txt /*cindent()*
+cinkeys-format indent.txt /*cinkeys-format*
+cino-# indent.txt /*cino-#*
+cino-( indent.txt /*cino-(*
+cino-) indent.txt /*cino-)*
+cino-+ indent.txt /*cino-+*
+cino-/ indent.txt /*cino-\/*
+cino-: indent.txt /*cino-:*
+cino-= indent.txt /*cino-=*
+cino-> indent.txt /*cino->*
+cino-C indent.txt /*cino-C*
+cino-E indent.txt /*cino-E*
+cino-J indent.txt /*cino-J*
+cino-L indent.txt /*cino-L*
+cino-M indent.txt /*cino-M*
+cino-N indent.txt /*cino-N*
+cino-P indent.txt /*cino-P*
+cino-U indent.txt /*cino-U*
+cino-W indent.txt /*cino-W*
+cino-^ indent.txt /*cino-^*
+cino-b indent.txt /*cino-b*
+cino-c indent.txt /*cino-c*
+cino-e indent.txt /*cino-e*
+cino-f indent.txt /*cino-f*
+cino-g indent.txt /*cino-g*
+cino-h indent.txt /*cino-h*
+cino-i indent.txt /*cino-i*
+cino-j indent.txt /*cino-j*
+cino-k indent.txt /*cino-k*
+cino-l indent.txt /*cino-l*
+cino-m indent.txt /*cino-m*
+cino-n indent.txt /*cino-n*
+cino-p indent.txt /*cino-p*
+cino-star indent.txt /*cino-star*
+cino-t indent.txt /*cino-t*
+cino-u indent.txt /*cino-u*
+cino-w indent.txt /*cino-w*
+cino-{ indent.txt /*cino-{*
+cino-} indent.txt /*cino-}*
+cinoptions-values indent.txt /*cinoptions-values*
+class vim9class.txt /*class*
+class-function vim9class.txt /*class-function*
+clear-undo undo.txt /*clear-undo*
+clearmatches() builtin.txt /*clearmatches()*
+client-server remote.txt /*client-server*
+client-server-name remote.txt /*client-server-name*
+clientserver remote.txt /*clientserver*
+clipboard gui.txt /*clipboard*
+clipboard-autoselect options.txt /*clipboard-autoselect*
+clipboard-autoselectml options.txt /*clipboard-autoselectml*
+clipboard-autoselectplus options.txt /*clipboard-autoselectplus*
+clipboard-exclude options.txt /*clipboard-exclude*
+clipboard-html options.txt /*clipboard-html*
+clipboard-unnamed options.txt /*clipboard-unnamed*
+clipboard-unnamedplus options.txt /*clipboard-unnamedplus*
+clojure-indent indent.txt /*clojure-indent*
+close_cb channel.txt /*close_cb*
+closure eval.txt /*closure*
+cmdarg-variable eval.txt /*cmdarg-variable*
+cmdbang-variable eval.txt /*cmdbang-variable*
+cmdline-arguments vi_diff.txt /*cmdline-arguments*
+cmdline-changed version5.txt /*cmdline-changed*
+cmdline-completion cmdline.txt /*cmdline-completion*
+cmdline-editing cmdline.txt /*cmdline-editing*
+cmdline-history cmdline.txt /*cmdline-history*
+cmdline-lines cmdline.txt /*cmdline-lines*
+cmdline-ranges cmdline.txt /*cmdline-ranges*
+cmdline-special cmdline.txt /*cmdline-special*
+cmdline-too-long cmdline.txt /*cmdline-too-long*
+cmdline-window cmdline.txt /*cmdline-window*
+cmdline.txt cmdline.txt /*cmdline.txt*
+cmdwin cmdline.txt /*cmdwin*
+cmdwin-char cmdline.txt /*cmdwin-char*
+cobol.vim syntax.txt /*cobol.vim*
+codeset mbyte.txt /*codeset*
+coding-style develop.txt /*coding-style*
+col() builtin.txt /*col()*
+coldfusion.vim syntax.txt /*coldfusion.vim*
+collapse tips.txt /*collapse*
+collate-variable eval.txt /*collate-variable*
+color-schemes syntax.txt /*color-schemes*
+color-xterm syntax.txt /*color-xterm*
+coloring syntax.txt /*coloring*
+colorscheme-override syntax.txt /*colorscheme-override*
+colortest.vim syntax.txt /*colortest.vim*
+command-attributes map.txt /*command-attributes*
+command-block vim9.txt /*command-block*
+command-line-functions usr_41.txt /*command-line-functions*
+command-line-window cmdline.txt /*command-line-window*
+command-mode intro.txt /*command-mode*
+compatible-default starting.txt /*compatible-default*
+compile-changes-5 version5.txt /*compile-changes-5*
+compile-changes-6 version6.txt /*compile-changes-6*
+compile-changes-7 version7.txt /*compile-changes-7*
+compile-changes-8 version8.txt /*compile-changes-8*
+compile-changes-9 version9.txt /*compile-changes-9*
+compiler-compaqada ft_ada.txt /*compiler-compaqada*
+compiler-decada ft_ada.txt /*compiler-decada*
+compiler-dotnet quickfix.txt /*compiler-dotnet*
+compiler-gcc quickfix.txt /*compiler-gcc*
+compiler-gnat ft_ada.txt /*compiler-gnat*
+compiler-hpada ft_ada.txt /*compiler-hpada*
+compiler-manx quickfix.txt /*compiler-manx*
+compiler-perl quickfix.txt /*compiler-perl*
+compiler-pyunit quickfix.txt /*compiler-pyunit*
+compiler-select quickfix.txt /*compiler-select*
+compiler-tex quickfix.txt /*compiler-tex*
+compiler-vaxada ft_ada.txt /*compiler-vaxada*
+compl-current insert.txt /*compl-current*
+compl-define insert.txt /*compl-define*
+compl-dictionary insert.txt /*compl-dictionary*
+compl-filename insert.txt /*compl-filename*
+compl-function insert.txt /*compl-function*
+compl-generic insert.txt /*compl-generic*
+compl-keyword insert.txt /*compl-keyword*
+compl-omni insert.txt /*compl-omni*
+compl-omni-filetypes insert.txt /*compl-omni-filetypes*
+compl-spelling insert.txt /*compl-spelling*
+compl-stop insert.txt /*compl-stop*
+compl-tag insert.txt /*compl-tag*
+compl-thesaurus insert.txt /*compl-thesaurus*
+compl-thesaurusfunc insert.txt /*compl-thesaurusfunc*
+compl-vim insert.txt /*compl-vim*
+compl-whole-line insert.txt /*compl-whole-line*
+complete() builtin.txt /*complete()*
+complete-functions insert.txt /*complete-functions*
+complete-item-kind insert.txt /*complete-item-kind*
+complete-items insert.txt /*complete-items*
+complete-popup insert.txt /*complete-popup*
+complete-popuphidden insert.txt /*complete-popuphidden*
+complete-script-local-functions cmdline.txt /*complete-script-local-functions*
+complete_CTRL-E insert.txt /*complete_CTRL-E*
+complete_CTRL-Y insert.txt /*complete_CTRL-Y*
+complete_add() builtin.txt /*complete_add()*
+complete_check() builtin.txt /*complete_check()*
+complete_info() builtin.txt /*complete_info()*
+complete_info_mode builtin.txt /*complete_info_mode*
+completed_item-variable eval.txt /*completed_item-variable*
+completion-functions usr_41.txt /*completion-functions*
+complex-change change.txt /*complex-change*
+complex-repeat repeat.txt /*complex-repeat*
+compress pi_gzip.txt /*compress*
+conceal syntax.txt /*conceal*
+confirm() builtin.txt /*confirm()*
+connection-refused message.txt /*connection-refused*
+console-menus gui.txt /*console-menus*
+context.vim ft_context.txt /*context.vim*
+control intro.txt /*control*
+conversion-server mbyte.txt /*conversion-server*
+convert-to-HTML syntax.txt /*convert-to-HTML*
+convert-to-XHTML syntax.txt /*convert-to-XHTML*
+convert-to-XML syntax.txt /*convert-to-XML*
+convert_legacy_function_to_vim9 vim9.txt /*convert_legacy_function_to_vim9*
+copy() builtin.txt /*copy()*
+copy-diffs diff.txt /*copy-diffs*
+copy-move change.txt /*copy-move*
+copying uganda.txt /*copying*
+copyright uganda.txt /*copyright*
+cos() builtin.txt /*cos()*
+cosh() builtin.txt /*cosh()*
+count intro.txt /*count*
+count() builtin.txt /*count()*
+count-bytes tips.txt /*count-bytes*
+count-items tips.txt /*count-items*
+count-variable eval.txt /*count-variable*
+count1-variable eval.txt /*count1-variable*
+cp-default version5.txt /*cp-default*
+cpo options.txt /*cpo*
+cpo-! options.txt /*cpo-!*
+cpo-# options.txt /*cpo-#*
+cpo-$ options.txt /*cpo-$*
+cpo-% options.txt /*cpo-%*
+cpo-& options.txt /*cpo-&*
+cpo-+ options.txt /*cpo-+*
+cpo-- options.txt /*cpo--*
+cpo-. options.txt /*cpo-.*
+cpo-/ options.txt /*cpo-\/*
+cpo-; options.txt /*cpo-;*
+cpo-< options.txt /*cpo-<*
+cpo-> options.txt /*cpo->*
+cpo-A options.txt /*cpo-A*
+cpo-B options.txt /*cpo-B*
+cpo-C options.txt /*cpo-C*
+cpo-D options.txt /*cpo-D*
+cpo-E options.txt /*cpo-E*
+cpo-F options.txt /*cpo-F*
+cpo-H options.txt /*cpo-H*
+cpo-I options.txt /*cpo-I*
+cpo-J options.txt /*cpo-J*
+cpo-K options.txt /*cpo-K*
+cpo-L options.txt /*cpo-L*
+cpo-M options.txt /*cpo-M*
+cpo-O options.txt /*cpo-O*
+cpo-P options.txt /*cpo-P*
+cpo-R options.txt /*cpo-R*
+cpo-S options.txt /*cpo-S*
+cpo-W options.txt /*cpo-W*
+cpo-X options.txt /*cpo-X*
+cpo-Z options.txt /*cpo-Z*
+cpo-\ options.txt /*cpo-\\*
+cpo-a options.txt /*cpo-a*
+cpo-b options.txt /*cpo-b*
+cpo-bar options.txt /*cpo-bar*
+cpo-c options.txt /*cpo-c*
+cpo-d options.txt /*cpo-d*
+cpo-e options.txt /*cpo-e*
+cpo-f options.txt /*cpo-f*
+cpo-g options.txt /*cpo-g*
+cpo-i options.txt /*cpo-i*
+cpo-j options.txt /*cpo-j*
+cpo-k options.txt /*cpo-k*
+cpo-l options.txt /*cpo-l*
+cpo-m options.txt /*cpo-m*
+cpo-n options.txt /*cpo-n*
+cpo-o options.txt /*cpo-o*
+cpo-p options.txt /*cpo-p*
+cpo-q options.txt /*cpo-q*
+cpo-r options.txt /*cpo-r*
+cpo-s options.txt /*cpo-s*
+cpo-star options.txt /*cpo-star*
+cpo-t options.txt /*cpo-t*
+cpo-u options.txt /*cpo-u*
+cpo-v options.txt /*cpo-v*
+cpo-w options.txt /*cpo-w*
+cpo-x options.txt /*cpo-x*
+cpo-y options.txt /*cpo-y*
+cpo-{ options.txt /*cpo-{*
+cpp.vim syntax.txt /*cpp.vim*
+crash-recovery recover.txt /*crash-recovery*
+creating-menus gui.txt /*creating-menus*
+credits intro.txt /*credits*
+crontab options.txt /*crontab*
+cs-find if_cscop.txt /*cs-find*
+cs7-problem term.txt /*cs7-problem*
+cscope if_cscop.txt /*cscope*
+cscope-commands if_cscop.txt /*cscope-commands*
+cscope-find if_cscop.txt /*cscope-find*
+cscope-howtouse if_cscop.txt /*cscope-howtouse*
+cscope-info if_cscop.txt /*cscope-info*
+cscope-intro if_cscop.txt /*cscope-intro*
+cscope-limitations if_cscop.txt /*cscope-limitations*
+cscope-options if_cscop.txt /*cscope-options*
+cscope-suggestions if_cscop.txt /*cscope-suggestions*
+cscope-win32 if_cscop.txt /*cscope-win32*
+cscope_connection() builtin.txt /*cscope_connection()*
+cscopepathcomp if_cscop.txt /*cscopepathcomp*
+cscopeprg if_cscop.txt /*cscopeprg*
+cscopequickfix if_cscop.txt /*cscopequickfix*
+cscoperelative if_cscop.txt /*cscoperelative*
+cscopetag if_cscop.txt /*cscopetag*
+cscopetagorder if_cscop.txt /*cscopetagorder*
+cscopeverbose if_cscop.txt /*cscopeverbose*
+csh.vim syntax.txt /*csh.vim*
+cspc if_cscop.txt /*cspc*
+csprg if_cscop.txt /*csprg*
+csqf if_cscop.txt /*csqf*
+csre if_cscop.txt /*csre*
+cst if_cscop.txt /*cst*
+csto if_cscop.txt /*csto*
+csverb if_cscop.txt /*csverb*
+ctags tagsrch.txt /*ctags*
+ctags-gone version6.txt /*ctags-gone*
+cterm-colors syntax.txt /*cterm-colors*
+ctrl intro.txt /*ctrl*
+ctype-variable eval.txt /*ctype-variable*
+curly-braces-function-names eval.txt /*curly-braces-function-names*
+curly-braces-names eval.txt /*curly-braces-names*
+curpos-visual version6.txt /*curpos-visual*
+current-directory editing.txt /*current-directory*
+current-file editing.txt /*current-file*
+current_compiler quickfix.txt /*current_compiler*
+cursor() builtin.txt /*cursor()*
+cursor-blinking options.txt /*cursor-blinking*
+cursor-down intro.txt /*cursor-down*
+cursor-functions usr_41.txt /*cursor-functions*
+cursor-left intro.txt /*cursor-left*
+cursor-motions motion.txt /*cursor-motions*
+cursor-position pattern.txt /*cursor-position*
+cursor-right intro.txt /*cursor-right*
+cursor-up intro.txt /*cursor-up*
+cursor_down intro.txt /*cursor_down*
+cursor_left intro.txt /*cursor_left*
+cursor_right intro.txt /*cursor_right*
+cursor_up intro.txt /*cursor_up*
+cw change.txt /*cw*
+cweb.vim syntax.txt /*cweb.vim*
+cynlib.vim syntax.txt /*cynlib.vim*
+d change.txt /*d*
+daB motion.txt /*daB*
+daW motion.txt /*daW*
+dab motion.txt /*dab*
+dap motion.txt /*dap*
+dart.vim syntax.txt /*dart.vim*
+das motion.txt /*das*
+date-functions usr_41.txt /*date-functions*
+dav pi_netrw.txt /*dav*
+davs pi_netrw.txt /*davs*
+daw motion.txt /*daw*
+dd change.txt /*dd*
+debug-gcc debug.txt /*debug-gcc*
+debug-highlight debugger.txt /*debug-highlight*
+debug-leaks debug.txt /*debug-leaks*
+debug-minidump debug.txt /*debug-minidump*
+debug-mode repeat.txt /*debug-mode*
+debug-scripts repeat.txt /*debug-scripts*
+debug-signs debugger.txt /*debug-signs*
+debug-vim debug.txt /*debug-vim*
+debug-vs2005 debug.txt /*debug-vs2005*
+debug-win32 debug.txt /*debug-win32*
+debug-windbg debug.txt /*debug-windbg*
+debug.txt debug.txt /*debug.txt*
+debugbreak() builtin.txt /*debugbreak()*
+debugger-compilation debugger.txt /*debugger-compilation*
+debugger-features debugger.txt /*debugger-features*
+debugger-support debugger.txt /*debugger-support*
+debugger.txt debugger.txt /*debugger.txt*
+dec-mouse options.txt /*dec-mouse*
+decada_members ft_ada.txt /*decada_members*
+deepcopy() builtin.txt /*deepcopy()*
+defaults.vim starting.txt /*defaults.vim*
+defaults.vim-explained usr_05.txt /*defaults.vim-explained*
+define-function userfunc.txt /*define-function*
+definition-search tagsrch.txt /*definition-search*
+definitions intro.txt /*definitions*
+delete() builtin.txt /*delete()*
+delete-insert change.txt /*delete-insert*
+delete-menus gui.txt /*delete-menus*
+deletebufline() builtin.txt /*deletebufline()*
+deleting change.txt /*deleting*
+demoserver.py channel.txt /*demoserver.py*
+design-assumptions develop.txt /*design-assumptions*
+design-compatible develop.txt /*design-compatible*
+design-decisions develop.txt /*design-decisions*
+design-documented develop.txt /*design-documented*
+design-flexible develop.txt /*design-flexible*
+design-goals develop.txt /*design-goals*
+design-improved develop.txt /*design-improved*
+design-maintain develop.txt /*design-maintain*
+design-multi-platform develop.txt /*design-multi-platform*
+design-not develop.txt /*design-not*
+design-speed-size develop.txt /*design-speed-size*
+desktop.vim syntax.txt /*desktop.vim*
+develop-spell develop.txt /*develop-spell*
+develop-spell-suggestions develop.txt /*develop-spell-suggestions*
+develop.txt develop.txt /*develop.txt*
+development develop.txt /*development*
+dgn motion.txt /*dgn*
+dh change.txt /*dh*
+diB motion.txt /*diB*
+diW motion.txt /*diW*
+dialog gui_w32.txt /*dialog*
+dialogs-added version5.txt /*dialogs-added*
+dib motion.txt /*dib*
+dict eval.txt /*dict*
+dict-functions usr_41.txt /*dict-functions*
+dict-identity eval.txt /*dict-identity*
+dict-modification eval.txt /*dict-modification*
+did_filetype() builtin.txt /*did_filetype()*
+diff diff.txt /*diff*
+diff-diffexpr diff.txt /*diff-diffexpr*
+diff-mode diff.txt /*diff-mode*
+diff-options diff.txt /*diff-options*
+diff-original-file diff.txt /*diff-original-file*
+diff-patchexpr diff.txt /*diff-patchexpr*
+diff-slow diff.txt /*diff-slow*
+diff.txt diff.txt /*diff.txt*
+diff.vim syntax.txt /*diff.vim*
+diff_filler() builtin.txt /*diff_filler()*
+diff_hlID() builtin.txt /*diff_hlID()*
+diff_translations diff.txt /*diff_translations*
+digraph digraph.txt /*digraph*
+digraph-arg change.txt /*digraph-arg*
+digraph-encoding digraph.txt /*digraph-encoding*
+digraph-table digraph.txt /*digraph-table*
+digraph-table-mbyte digraph.txt /*digraph-table-mbyte*
+digraph.txt digraph.txt /*digraph.txt*
+digraph_get() builtin.txt /*digraph_get()*
+digraph_getlist() builtin.txt /*digraph_getlist()*
+digraph_set() builtin.txt /*digraph_set()*
+digraph_setlist() builtin.txt /*digraph_setlist()*
+digraphs digraph.txt /*digraphs*
+digraphs-changed version6.txt /*digraphs-changed*
+digraphs-default digraph.txt /*digraphs-default*
+digraphs-define digraph.txt /*digraphs-define*
+digraphs-use digraph.txt /*digraphs-use*
+dip motion.txt /*dip*
+dircolors.vim syntax.txt /*dircolors.vim*
+dis motion.txt /*dis*
+disable-menus gui.txt /*disable-menus*
+discard editing.txt /*discard*
+distribute-script usr_51.txt /*distribute-script*
+distribution intro.txt /*distribution*
+diw motion.txt /*diw*
+dl change.txt /*dl*
+do diff.txt /*do*
+doc-file-list help.txt /*doc-file-list*
+docbk.vim syntax.txt /*docbk.vim*
+docbksgml.vim syntax.txt /*docbksgml.vim*
+docbkxml.vim syntax.txt /*docbkxml.vim*
+docbook syntax.txt /*docbook*
+documentation-6 version6.txt /*documentation-6*
+donate uganda.txt /*donate*
+dos os_dos.txt /*dos*
+dos-:cd os_dos.txt /*dos-:cd*
+dos-CTRL-Break os_dos.txt /*dos-CTRL-Break*
+dos-backslash os_dos.txt /*dos-backslash*
+dos-colors os_dos.txt /*dos-colors*
+dos-file-formats os_dos.txt /*dos-file-formats*
+dos-locations os_dos.txt /*dos-locations*
+dos-powershell os_dos.txt /*dos-powershell*
+dos-pwsh os_dos.txt /*dos-pwsh*
+dos-shell os_dos.txt /*dos-shell*
+dos-standard-mappings os_dos.txt /*dos-standard-mappings*
+dos-temp-files os_dos.txt /*dos-temp-files*
+dosbatch.vim syntax.txt /*dosbatch.vim*
+double-click term.txt /*double-click*
+download intro.txt /*download*
+doxygen-syntax syntax.txt /*doxygen-syntax*
+doxygen.vim syntax.txt /*doxygen.vim*
+dp diff.txt /*dp*
+drag-n-drop gui.txt /*drag-n-drop*
+drag-n-drop-win32 gui_w32.txt /*drag-n-drop-win32*
+drag-status-line term.txt /*drag-status-line*
+drop_file gui.txt /*drop_file*
+dtd.vim syntax.txt /*dtd.vim*
+dtd2vim insert.txt /*dtd2vim*
+dying-variable eval.txt /*dying-variable*
+e motion.txt /*e*
+easy starting.txt /*easy*
+echoraw() builtin.txt /*echoraw()*
+echospace-variable eval.txt /*echospace-variable*
+edit-a-file editing.txt /*edit-a-file*
+edit-binary editing.txt /*edit-binary*
+edit-dialogs editing.txt /*edit-dialogs*
+edit-files editing.txt /*edit-files*
+edit-intro editing.txt /*edit-intro*
+edit-no-break usr_25.txt /*edit-no-break*
+edit-paragraph-join usr_25.txt /*edit-paragraph-join*
+edit-window windows.txt /*edit-window*
+editing.txt editing.txt /*editing.txt*
+efm-%> quickfix.txt /*efm-%>*
+efm-entries quickfix.txt /*efm-entries*
+efm-ignore quickfix.txt /*efm-ignore*
+eiffel.vim syntax.txt /*eiffel.vim*
+elixir.vim syntax.txt /*elixir.vim*
+emacs-keys tips.txt /*emacs-keys*
+emacs-tags tagsrch.txt /*emacs-tags*
+emacs_tags tagsrch.txt /*emacs_tags*
+empty() builtin.txt /*empty()*
+encoding-names mbyte.txt /*encoding-names*
+encoding-table mbyte.txt /*encoding-table*
+encoding-values mbyte.txt /*encoding-values*
+encryption editing.txt /*encryption*
+end intro.txt /*end*
+end-of-file pattern.txt /*end-of-file*
+enlightened-terminal syntax.txt /*enlightened-terminal*
+environ() builtin.txt /*environ()*
+eol-and-eof editing.txt /*eol-and-eof*
+erlang.vim syntax.txt /*erlang.vim*
+err_buf channel.txt /*err_buf*
+err_cb channel.txt /*err_cb*
+err_mode channel.txt /*err_mode*
+err_modifiable channel.txt /*err_modifiable*
+err_msg channel.txt /*err_msg*
+err_name channel.txt /*err_name*
+err_timeout channel.txt /*err_timeout*
+errmsg-variable eval.txt /*errmsg-variable*
+error-file-format quickfix.txt /*error-file-format*
+error-messages message.txt /*error-messages*
+errorformat quickfix.txt /*errorformat*
+errorformat-Jikes quickfix.txt /*errorformat-Jikes*
+errorformat-LaTeX quickfix.txt /*errorformat-LaTeX*
+errorformat-Perl quickfix.txt /*errorformat-Perl*
+errorformat-ant quickfix.txt /*errorformat-ant*
+errorformat-changed version4.txt /*errorformat-changed*
+errorformat-jade quickfix.txt /*errorformat-jade*
+errorformat-javac quickfix.txt /*errorformat-javac*
+errorformat-multi-line quickfix.txt /*errorformat-multi-line*
+errorformat-separate-filename quickfix.txt /*errorformat-separate-filename*
+errorformats quickfix.txt /*errorformats*
+errors message.txt /*errors*
+errors-variable eval.txt /*errors-variable*
+escape intro.txt /*escape*
+escape() builtin.txt /*escape()*
+escape-bar version4.txt /*escape-bar*
+euphoria3.vim syntax.txt /*euphoria3.vim*
+euphoria4.vim syntax.txt /*euphoria4.vim*
+euro digraph.txt /*euro*
+euro-digraph digraph.txt /*euro-digraph*
+eval eval.txt /*eval*
+eval() builtin.txt /*eval()*
+eval-examples eval.txt /*eval-examples*
+eval-sandbox eval.txt /*eval-sandbox*
+eval.txt eval.txt /*eval.txt*
+event-variable eval.txt /*event-variable*
+eventhandler() builtin.txt /*eventhandler()*
+eview starting.txt /*eview*
+evim starting.txt /*evim*
+evim-keys starting.txt /*evim-keys*
+evim.vim starting.txt /*evim.vim*
+ex starting.txt /*ex*
+ex-cmd-index index.txt /*ex-cmd-index*
+ex-edit-index index.txt /*ex-edit-index*
+ex-flags cmdline.txt /*ex-flags*
+ex: options.txt /*ex:*
+except-autocmd eval.txt /*except-autocmd*
+except-autocmd-Cmd eval.txt /*except-autocmd-Cmd*
+except-autocmd-Post eval.txt /*except-autocmd-Post*
+except-autocmd-Pre eval.txt /*except-autocmd-Pre*
+except-autocmd-ill eval.txt /*except-autocmd-ill*
+except-compat eval.txt /*except-compat*
+except-examine eval.txt /*except-examine*
+except-from-finally eval.txt /*except-from-finally*
+except-hier-param eval.txt /*except-hier-param*
+except-several-errors eval.txt /*except-several-errors*
+except-single-line eval.txt /*except-single-line*
+except-syntax-err eval.txt /*except-syntax-err*
+except-syntax-error eval.txt /*except-syntax-error*
+exception-handling eval.txt /*exception-handling*
+exception-variable eval.txt /*exception-variable*
+exclusive motion.txt /*exclusive*
+exclusive-linewise motion.txt /*exclusive-linewise*
+executable() builtin.txt /*executable()*
+execute() builtin.txt /*execute()*
+execute-menus gui.txt /*execute-menus*
+exepath() builtin.txt /*exepath()*
+exim starting.txt /*exim*
+exists() builtin.txt /*exists()*
+exists_compiled() builtin.txt /*exists_compiled()*
+exiting starting.txt /*exiting*
+exiting-variable eval.txt /*exiting-variable*
+exp() builtin.txt /*exp()*
+expand() builtin.txt /*expand()*
+expand-env options.txt /*expand-env*
+expand-environment-var options.txt /*expand-environment-var*
+expandcmd() builtin.txt /*expandcmd()*
+expr eval.txt /*expr*
+expr-! eval.txt /*expr-!*
+expr-!= eval.txt /*expr-!=*
+expr-!=# eval.txt /*expr-!=#*
+expr-!=? eval.txt /*expr-!=?*
+expr-!~ eval.txt /*expr-!~*
+expr-!~# eval.txt /*expr-!~#*
+expr-!~? eval.txt /*expr-!~?*
+expr-$' eval.txt /*expr-$'*
+expr-$quote eval.txt /*expr-$quote*
+expr-% eval.txt /*expr-%*
+expr-&& eval.txt /*expr-&&*
+expr-' eval.txt /*expr-'*
+expr-+ eval.txt /*expr-+*
+expr-- eval.txt /*expr--*
+expr-. eval.txt /*expr-.*
+expr-.. eval.txt /*expr-..*
+expr-/ eval.txt /*expr-\/*
+expr-< eval.txt /*expr-<*
+expr-<# eval.txt /*expr-<#*
+expr-<< eval.txt /*expr-<<*
+expr-<= eval.txt /*expr-<=*
+expr-<=# eval.txt /*expr-<=#*
+expr-<=? eval.txt /*expr-<=?*
+expr-<? eval.txt /*expr-<?*
+expr-== eval.txt /*expr-==*
+expr-==# eval.txt /*expr-==#*
+expr-==? eval.txt /*expr-==?*
+expr-=~ eval.txt /*expr-=~*
+expr-=~# eval.txt /*expr-=~#*
+expr-=~? eval.txt /*expr-=~?*
+expr-> eval.txt /*expr->*
+expr-># eval.txt /*expr->#*
+expr->= eval.txt /*expr->=*
+expr->=# eval.txt /*expr->=#*
+expr->=? eval.txt /*expr->=?*
+expr->> eval.txt /*expr->>*
+expr->? eval.txt /*expr->?*
+expr-[:] eval.txt /*expr-[:]*
+expr-[] eval.txt /*expr-[]*
+expr-barbar eval.txt /*expr-barbar*
+expr-entry eval.txt /*expr-entry*
+expr-env eval.txt /*expr-env*
+expr-env-expand eval.txt /*expr-env-expand*
+expr-function eval.txt /*expr-function*
+expr-is eval.txt /*expr-is*
+expr-is# eval.txt /*expr-is#*
+expr-is? eval.txt /*expr-is?*
+expr-isnot eval.txt /*expr-isnot*
+expr-isnot# eval.txt /*expr-isnot#*
+expr-isnot? eval.txt /*expr-isnot?*
+expr-lambda eval.txt /*expr-lambda*
+expr-nesting eval.txt /*expr-nesting*
+expr-number eval.txt /*expr-number*
+expr-option eval.txt /*expr-option*
+expr-option-function vim9.txt /*expr-option-function*
+expr-quote eval.txt /*expr-quote*
+expr-register eval.txt /*expr-register*
+expr-star eval.txt /*expr-star*
+expr-string eval.txt /*expr-string*
+expr-unary-+ eval.txt /*expr-unary-+*
+expr-unary-- eval.txt /*expr-unary--*
+expr-variable eval.txt /*expr-variable*
+expr1 eval.txt /*expr1*
+expr10 eval.txt /*expr10*
+expr11 eval.txt /*expr11*
+expr2 eval.txt /*expr2*
+expr3 eval.txt /*expr3*
+expr4 eval.txt /*expr4*
+expr5 eval.txt /*expr5*
+expr6 eval.txt /*expr6*
+expr7 eval.txt /*expr7*
+expr8 eval.txt /*expr8*
+expr9 eval.txt /*expr9*
+expression eval.txt /*expression*
+expression-commands eval.txt /*expression-commands*
+expression-syntax eval.txt /*expression-syntax*
+exrc starting.txt /*exrc*
+extend() builtin.txt /*extend()*
+extendnew() builtin.txt /*extendnew()*
+extends vim9class.txt /*extends*
+extension-removal cmdline.txt /*extension-removal*
+extensions-improvements todo.txt /*extensions-improvements*
+f motion.txt /*f*
+f-args-example map.txt /*f-args-example*
+false vim9.txt /*false*
+false-variable eval.txt /*false-variable*
+falsy eval.txt /*falsy*
+falsy-operator eval.txt /*falsy-operator*
+faq intro.txt /*faq*
+farsi farsi.txt /*farsi*
+farsi.txt farsi.txt /*farsi.txt*
+fasm.vim syntax.txt /*fasm.vim*
+fast-functions vim9.txt /*fast-functions*
+fcs_choice-variable eval.txt /*fcs_choice-variable*
+fcs_reason-variable eval.txt /*fcs_reason-variable*
+feature-list builtin.txt /*feature-list*
+feedkeys() builtin.txt /*feedkeys()*
+fetch pi_netrw.txt /*fetch*
+file-browser-5.2 version5.txt /*file-browser-5.2*
+file-formats editing.txt /*file-formats*
+file-functions usr_41.txt /*file-functions*
+file-pattern autocmd.txt /*file-pattern*
+file-read insert.txt /*file-read*
+file-searching editing.txt /*file-searching*
+file-type filetype.txt /*file-type*
+file-types filetype.txt /*file-types*
+file_readable() builtin.txt /*file_readable()*
+fileencoding-changed version6.txt /*fileencoding-changed*
+filename-backslash cmdline.txt /*filename-backslash*
+filename-modifiers cmdline.txt /*filename-modifiers*
+filereadable() builtin.txt /*filereadable()*
+filetype filetype.txt /*filetype*
+filetype-detect filetype.txt /*filetype-detect*
+filetype-ignore filetype.txt /*filetype-ignore*
+filetype-overrule filetype.txt /*filetype-overrule*
+filetype-plugin usr_43.txt /*filetype-plugin*
+filetype-plugins filetype.txt /*filetype-plugins*
+filetype.txt filetype.txt /*filetype.txt*
+filetypedetect-changed version6.txt /*filetypedetect-changed*
+filetypes filetype.txt /*filetypes*
+filewritable() builtin.txt /*filewritable()*
+filler-lines windows.txt /*filler-lines*
+filter change.txt /*filter*
+filter() builtin.txt /*filter()*
+find-manpage usr_12.txt /*find-manpage*
+find-replace usr_10.txt /*find-replace*
+finddir() builtin.txt /*finddir()*
+findfile() builtin.txt /*findfile()*
+fixed-5.1 version5.txt /*fixed-5.1*
+fixed-5.2 version5.txt /*fixed-5.2*
+fixed-5.3 version5.txt /*fixed-5.3*
+fixed-5.4 version5.txt /*fixed-5.4*
+fixed-5.5 version5.txt /*fixed-5.5*
+fixed-5.6 version5.txt /*fixed-5.6*
+fixed-5.7 version5.txt /*fixed-5.7*
+fixed-5.8 version5.txt /*fixed-5.8*
+fixed-6.1 version6.txt /*fixed-6.1*
+fixed-6.2 version6.txt /*fixed-6.2*
+fixed-6.3 version6.txt /*fixed-6.3*
+fixed-6.4 version6.txt /*fixed-6.4*
+fixed-7.1 version7.txt /*fixed-7.1*
+fixed-7.2 version7.txt /*fixed-7.2*
+fixed-7.3 version7.txt /*fixed-7.3*
+fixed-7.4 version7.txt /*fixed-7.4*
+flatten() builtin.txt /*flatten()*
+flattennew() builtin.txt /*flattennew()*
+flexwiki.vim syntax.txt /*flexwiki.vim*
+float-e eval.txt /*float-e*
+float-functions usr_41.txt /*float-functions*
+float-pi eval.txt /*float-pi*
+float2nr() builtin.txt /*float2nr()*
+floating-point-format eval.txt /*floating-point-format*
+floating-point-precision eval.txt /*floating-point-precision*
+floor() builtin.txt /*floor()*
+fmod() builtin.txt /*fmod()*
+fname-variable eval.txt /*fname-variable*
+fname_diff-variable eval.txt /*fname_diff-variable*
+fname_in-variable eval.txt /*fname_in-variable*
+fname_new-variable eval.txt /*fname_new-variable*
+fname_out-variable eval.txt /*fname_out-variable*
+fnameescape() builtin.txt /*fnameescape()*
+fnamemodify() builtin.txt /*fnamemodify()*
+fo-/ change.txt /*fo-\/*
+fo-1 change.txt /*fo-1*
+fo-2 change.txt /*fo-2*
+fo-B change.txt /*fo-B*
+fo-M change.txt /*fo-M*
+fo-] change.txt /*fo-]*
+fo-a change.txt /*fo-a*
+fo-b change.txt /*fo-b*
+fo-c change.txt /*fo-c*
+fo-j change.txt /*fo-j*
+fo-l change.txt /*fo-l*
+fo-m change.txt /*fo-m*
+fo-n change.txt /*fo-n*
+fo-o change.txt /*fo-o*
+fo-p change.txt /*fo-p*
+fo-q change.txt /*fo-q*
+fo-r change.txt /*fo-r*
+fo-t change.txt /*fo-t*
+fo-table change.txt /*fo-table*
+fo-v change.txt /*fo-v*
+fo-w change.txt /*fo-w*
+fold-behavior fold.txt /*fold-behavior*
+fold-colors fold.txt /*fold-colors*
+fold-commands fold.txt /*fold-commands*
+fold-create-marker fold.txt /*fold-create-marker*
+fold-delete-marker fold.txt /*fold-delete-marker*
+fold-diff fold.txt /*fold-diff*
+fold-expr fold.txt /*fold-expr*
+fold-foldcolumn fold.txt /*fold-foldcolumn*
+fold-foldlevel fold.txt /*fold-foldlevel*
+fold-foldtext fold.txt /*fold-foldtext*
+fold-indent fold.txt /*fold-indent*
+fold-manual fold.txt /*fold-manual*
+fold-marker fold.txt /*fold-marker*
+fold-methods fold.txt /*fold-methods*
+fold-options fold.txt /*fold-options*
+fold-syntax fold.txt /*fold-syntax*
+fold.txt fold.txt /*fold.txt*
+foldclosed() builtin.txt /*foldclosed()*
+foldclosedend() builtin.txt /*foldclosedend()*
+folddashes-variable eval.txt /*folddashes-variable*
+foldend-variable eval.txt /*foldend-variable*
+folding fold.txt /*folding*
+folding-functions usr_41.txt /*folding-functions*
+foldlevel() builtin.txt /*foldlevel()*
+foldlevel-variable eval.txt /*foldlevel-variable*
+folds fold.txt /*folds*
+foldstart-variable eval.txt /*foldstart-variable*
+foldtext() builtin.txt /*foldtext()*
+foldtextresult() builtin.txt /*foldtextresult()*
+font-sizes gui_x11.txt /*font-sizes*
+fontset mbyte.txt /*fontset*
+forced-motion motion.txt /*forced-motion*
+foreground() builtin.txt /*foreground()*
+fork os_unix.txt /*fork*
+form.vim syntax.txt /*form.vim*
+format-bullet-list tips.txt /*format-bullet-list*
+format-comments change.txt /*format-comments*
+format-formatexpr change.txt /*format-formatexpr*
+formatOtherKeys map.txt /*formatOtherKeys*
+formatting change.txt /*formatting*
+forth.vim syntax.txt /*forth.vim*
+fortran.vim syntax.txt /*fortran.vim*
+freebasic.vim syntax.txt /*freebasic.vim*
+freebasic_no_comment_fold syntax.txt /*freebasic_no_comment_fold*
+freebasic_operators syntax.txt /*freebasic_operators*
+freebasic_space_errors syntax.txt /*freebasic_space_errors*
+freebasic_type_suffixes syntax.txt /*freebasic_type_suffixes*
+friendship intro.txt /*friendship*
+frombook usr_01.txt /*frombook*
+ft-abel-syntax syntax.txt /*ft-abel-syntax*
+ft-ada-commands ft_ada.txt /*ft-ada-commands*
+ft-ada-constants ft_ada.txt /*ft-ada-constants*
+ft-ada-functions ft_ada.txt /*ft-ada-functions*
+ft-ada-indent ft_ada.txt /*ft-ada-indent*
+ft-ada-omni ft_ada.txt /*ft-ada-omni*
+ft-ada-options ft_ada.txt /*ft-ada-options*
+ft-ada-plugin ft_ada.txt /*ft-ada-plugin*
+ft-ada-syntax ft_ada.txt /*ft-ada-syntax*
+ft-ada-variables ft_ada.txt /*ft-ada-variables*
+ft-ant-syntax syntax.txt /*ft-ant-syntax*
+ft-apache-syntax syntax.txt /*ft-apache-syntax*
+ft-asm-syntax syntax.txt /*ft-asm-syntax*
+ft-asm68k-syntax syntax.txt /*ft-asm68k-syntax*
+ft-asmh8300-syntax syntax.txt /*ft-asmh8300-syntax*
+ft-aspperl-syntax syntax.txt /*ft-aspperl-syntax*
+ft-aspvbs-syntax syntax.txt /*ft-aspvbs-syntax*
+ft-awk-plugin filetype.txt /*ft-awk-plugin*
+ft-bash-syntax syntax.txt /*ft-bash-syntax*
+ft-basic-syntax syntax.txt /*ft-basic-syntax*
+ft-c-omni insert.txt /*ft-c-omni*
+ft-c-syntax syntax.txt /*ft-c-syntax*
+ft-ch-syntax syntax.txt /*ft-ch-syntax*
+ft-changelog-plugin filetype.txt /*ft-changelog-plugin*
+ft-changelog-syntax syntax.txt /*ft-changelog-syntax*
+ft-chill-syntax syntax.txt /*ft-chill-syntax*
+ft-clojure-indent indent.txt /*ft-clojure-indent*
+ft-clojure-syntax syntax.txt /*ft-clojure-syntax*
+ft-cobol-syntax syntax.txt /*ft-cobol-syntax*
+ft-coldfusion-syntax syntax.txt /*ft-coldfusion-syntax*
+ft-context ft_context.txt /*ft-context*
+ft-context-commands ft_context.txt /*ft-context-commands*
+ft-context-intro ft_context.txt /*ft-context-intro*
+ft-context-mappings ft_context.txt /*ft-context-mappings*
+ft-context-settings ft_context.txt /*ft-context-settings*
+ft-cpp-syntax syntax.txt /*ft-cpp-syntax*
+ft-csh-syntax syntax.txt /*ft-csh-syntax*
+ft-css-omni insert.txt /*ft-css-omni*
+ft-cweb-syntax syntax.txt /*ft-cweb-syntax*
+ft-cynlib-syntax syntax.txt /*ft-cynlib-syntax*
+ft-dart-syntax syntax.txt /*ft-dart-syntax*
+ft-dash-syntax syntax.txt /*ft-dash-syntax*
+ft-desktop-syntax syntax.txt /*ft-desktop-syntax*
+ft-dircolors-syntax syntax.txt /*ft-dircolors-syntax*
+ft-docbk-syntax syntax.txt /*ft-docbk-syntax*
+ft-docbksgml-syntax syntax.txt /*ft-docbksgml-syntax*
+ft-docbkxml-syntax syntax.txt /*ft-docbkxml-syntax*
+ft-dosbatch-syntax syntax.txt /*ft-dosbatch-syntax*
+ft-dtd-syntax syntax.txt /*ft-dtd-syntax*
+ft-eiffel-syntax syntax.txt /*ft-eiffel-syntax*
+ft-elixir-syntax syntax.txt /*ft-elixir-syntax*
+ft-erlang-syntax syntax.txt /*ft-erlang-syntax*
+ft-euphoria-syntax syntax.txt /*ft-euphoria-syntax*
+ft-flexwiki-syntax syntax.txt /*ft-flexwiki-syntax*
+ft-form-syntax syntax.txt /*ft-form-syntax*
+ft-forth-syntax syntax.txt /*ft-forth-syntax*
+ft-fortran-indent indent.txt /*ft-fortran-indent*
+ft-fortran-plugin filetype.txt /*ft-fortran-plugin*
+ft-fortran-syntax syntax.txt /*ft-fortran-syntax*
+ft-freebasic-plugin filetype.txt /*ft-freebasic-plugin*
+ft-freebasic-syntax syntax.txt /*ft-freebasic-syntax*
+ft-fvwm-syntax syntax.txt /*ft-fvwm-syntax*
+ft-gitcommit-plugin filetype.txt /*ft-gitcommit-plugin*
+ft-gprof-plugin filetype.txt /*ft-gprof-plugin*
+ft-groff-syntax syntax.txt /*ft-groff-syntax*
+ft-gsp-syntax syntax.txt /*ft-gsp-syntax*
+ft-haskell-syntax syntax.txt /*ft-haskell-syntax*
+ft-html-indent indent.txt /*ft-html-indent*
+ft-html-omni insert.txt /*ft-html-omni*
+ft-html-syntax syntax.txt /*ft-html-syntax*
+ft-htmlos-syntax syntax.txt /*ft-htmlos-syntax*
+ft-ia64-syntax syntax.txt /*ft-ia64-syntax*
+ft-inform-syntax syntax.txt /*ft-inform-syntax*
+ft-java-syntax syntax.txt /*ft-java-syntax*
+ft-javascript-omni insert.txt /*ft-javascript-omni*
+ft-json-syntax syntax.txt /*ft-json-syntax*
+ft-ksh-syntax syntax.txt /*ft-ksh-syntax*
+ft-lace-syntax syntax.txt /*ft-lace-syntax*
+ft-lex-syntax syntax.txt /*ft-lex-syntax*
+ft-lifelines-syntax syntax.txt /*ft-lifelines-syntax*
+ft-lisp-syntax syntax.txt /*ft-lisp-syntax*
+ft-lite-syntax syntax.txt /*ft-lite-syntax*
+ft-lpc-syntax syntax.txt /*ft-lpc-syntax*
+ft-lua-syntax syntax.txt /*ft-lua-syntax*
+ft-mail-plugin filetype.txt /*ft-mail-plugin*
+ft-mail.vim syntax.txt /*ft-mail.vim*
+ft-make-syntax syntax.txt /*ft-make-syntax*
+ft-man-plugin filetype.txt /*ft-man-plugin*
+ft-maple-syntax syntax.txt /*ft-maple-syntax*
+ft-markdown-plugin filetype.txt /*ft-markdown-plugin*
+ft-markdown-syntax syntax.txt /*ft-markdown-syntax*
+ft-masm-syntax syntax.txt /*ft-masm-syntax*
+ft-mathematica-syntax syntax.txt /*ft-mathematica-syntax*
+ft-matlab-indent indent.txt /*ft-matlab-indent*
+ft-metafont ft_mp.txt /*ft-metafont*
+ft-metafont-intro ft_mp.txt /*ft-metafont-intro*
+ft-metafont-mappings ft_mp.txt /*ft-metafont-mappings*
+ft-metafont-settings ft_mp.txt /*ft-metafont-settings*
+ft-metapost ft_mp.txt /*ft-metapost*
+ft-metapost-commands ft_mp.txt /*ft-metapost-commands*
+ft-metapost-intro ft_mp.txt /*ft-metapost-intro*
+ft-metapost-mappings ft_mp.txt /*ft-metapost-mappings*
+ft-metapost-settings ft_mp.txt /*ft-metapost-settings*
+ft-mma-syntax syntax.txt /*ft-mma-syntax*
+ft-moo-syntax syntax.txt /*ft-moo-syntax*
+ft-msql-syntax syntax.txt /*ft-msql-syntax*
+ft-n1ql-syntax syntax.txt /*ft-n1ql-syntax*
+ft-nasm-syntax syntax.txt /*ft-nasm-syntax*
+ft-ncf-syntax syntax.txt /*ft-ncf-syntax*
+ft-nroff-syntax syntax.txt /*ft-nroff-syntax*
+ft-ocaml-syntax syntax.txt /*ft-ocaml-syntax*
+ft-papp-syntax syntax.txt /*ft-papp-syntax*
+ft-pascal-syntax syntax.txt /*ft-pascal-syntax*
+ft-pdf-plugin filetype.txt /*ft-pdf-plugin*
+ft-perl-syntax syntax.txt /*ft-perl-syntax*
+ft-php-indent indent.txt /*ft-php-indent*
+ft-php-omni insert.txt /*ft-php-omni*
+ft-php-syntax syntax.txt /*ft-php-syntax*
+ft-php3-syntax syntax.txt /*ft-php3-syntax*
+ft-phtml-syntax syntax.txt /*ft-phtml-syntax*
+ft-plaintex-syntax syntax.txt /*ft-plaintex-syntax*
+ft-posix-syntax syntax.txt /*ft-posix-syntax*
+ft-postscr-syntax syntax.txt /*ft-postscr-syntax*
+ft-ppwiz-syntax syntax.txt /*ft-ppwiz-syntax*
+ft-printcap-syntax syntax.txt /*ft-printcap-syntax*
+ft-progress-syntax syntax.txt /*ft-progress-syntax*
+ft-ptcap-syntax syntax.txt /*ft-ptcap-syntax*
+ft-python-indent indent.txt /*ft-python-indent*
+ft-python-plugin filetype.txt /*ft-python-plugin*
+ft-python-syntax syntax.txt /*ft-python-syntax*
+ft-qf-plugin filetype.txt /*ft-qf-plugin*
+ft-quake-syntax syntax.txt /*ft-quake-syntax*
+ft-r-indent indent.txt /*ft-r-indent*
+ft-r-syntax syntax.txt /*ft-r-syntax*
+ft-readline-syntax syntax.txt /*ft-readline-syntax*
+ft-rego-syntax syntax.txt /*ft-rego-syntax*
+ft-rexx-syntax syntax.txt /*ft-rexx-syntax*
+ft-rmd-plugin filetype.txt /*ft-rmd-plugin*
+ft-rmd-syntax syntax.txt /*ft-rmd-syntax*
+ft-rrst-plugin filetype.txt /*ft-rrst-plugin*
+ft-rrst-syntax syntax.txt /*ft-rrst-syntax*
+ft-rst-plugin filetype.txt /*ft-rst-plugin*
+ft-rst-syntax syntax.txt /*ft-rst-syntax*
+ft-ruby-omni insert.txt /*ft-ruby-omni*
+ft-ruby-syntax syntax.txt /*ft-ruby-syntax*
+ft-rust filetype.txt /*ft-rust*
+ft-scheme-syntax syntax.txt /*ft-scheme-syntax*
+ft-sdl-syntax syntax.txt /*ft-sdl-syntax*
+ft-sed-syntax syntax.txt /*ft-sed-syntax*
+ft-sgml-syntax syntax.txt /*ft-sgml-syntax*
+ft-sh-indent indent.txt /*ft-sh-indent*
+ft-sh-syntax syntax.txt /*ft-sh-syntax*
+ft-spec-plugin filetype.txt /*ft-spec-plugin*
+ft-spup-syntax syntax.txt /*ft-spup-syntax*
+ft-sql filetype.txt /*ft-sql*
+ft-sql-omni insert.txt /*ft-sql-omni*
+ft-sql-syntax syntax.txt /*ft-sql-syntax*
+ft-sqlanywhere-syntax syntax.txt /*ft-sqlanywhere-syntax*
+ft-sqlinformix-syntax syntax.txt /*ft-sqlinformix-syntax*
+ft-squirrel-syntax syntax.txt /*ft-squirrel-syntax*
+ft-syntax-omni insert.txt /*ft-syntax-omni*
+ft-tcsh-syntax syntax.txt /*ft-tcsh-syntax*
+ft-termcap-syntax syntax.txt /*ft-termcap-syntax*
+ft-tex-plugin filetype.txt /*ft-tex-plugin*
+ft-tex-syntax syntax.txt /*ft-tex-syntax*
+ft-tf-syntax syntax.txt /*ft-tf-syntax*
+ft-vb-syntax syntax.txt /*ft-vb-syntax*
+ft-verilog-indent indent.txt /*ft-verilog-indent*
+ft-vhdl-indent indent.txt /*ft-vhdl-indent*
+ft-vim-indent indent.txt /*ft-vim-indent*
+ft-vim-plugin filetype.txt /*ft-vim-plugin*
+ft-vim-syntax syntax.txt /*ft-vim-syntax*
+ft-xf86conf-syntax syntax.txt /*ft-xf86conf-syntax*
+ft-xhtml-omni insert.txt /*ft-xhtml-omni*
+ft-xml-omni insert.txt /*ft-xml-omni*
+ft-xml-syntax syntax.txt /*ft-xml-syntax*
+ft-xpm-syntax syntax.txt /*ft-xpm-syntax*
+ft-yaml-syntax syntax.txt /*ft-yaml-syntax*
+ft-zimbu-plugin filetype.txt /*ft-zimbu-plugin*
+ft-zsh-syntax syntax.txt /*ft-zsh-syntax*
+ft_ada.txt ft_ada.txt /*ft_ada.txt*
+ft_context.txt ft_context.txt /*ft_context.txt*
+ft_mp.txt ft_mp.txt /*ft_mp.txt*
+ft_ps1.txt ft_ps1.txt /*ft_ps1.txt*
+ft_raku.txt ft_raku.txt /*ft_raku.txt*
+ft_rust.txt ft_rust.txt /*ft_rust.txt*
+ft_sql.txt ft_sql.txt /*ft_sql.txt*
+ftdetect filetype.txt /*ftdetect*
+ftp pi_netrw.txt /*ftp*
+ftplugin usr_51.txt /*ftplugin*
+ftplugin-docs filetype.txt /*ftplugin-docs*
+ftplugin-name usr_05.txt /*ftplugin-name*
+ftplugin-overrule filetype.txt /*ftplugin-overrule*
+ftplugin-special usr_51.txt /*ftplugin-special*
+ftplugins usr_05.txt /*ftplugins*
+fullcommand() builtin.txt /*fullcommand()*
+funcref() builtin.txt /*funcref()*
+function() builtin.txt /*function()*
+function-argument userfunc.txt /*function-argument*
+function-key intro.txt /*function-key*
+function-list usr_41.txt /*function-list*
+function-range-example userfunc.txt /*function-range-example*
+function-search-undo userfunc.txt /*function-search-undo*
+function_key intro.txt /*function_key*
+functions eval.txt /*functions*
+fuzzy-matching pattern.txt /*fuzzy-matching*
+fvwm.vim syntax.txt /*fvwm.vim*
+fvwm2rc syntax.txt /*fvwm2rc*
+fvwmrc syntax.txt /*fvwmrc*
+g index.txt /*g*
+g# pattern.txt /*g#*
+g$ motion.txt /*g$*
+g& change.txt /*g&*
+g' motion.txt /*g'*
+g'a motion.txt /*g'a*
+g+ undo.txt /*g+*
+g, motion.txt /*g,*
+g- undo.txt /*g-*
+g0 motion.txt /*g0*
+g8 various.txt /*g8*
+g: eval.txt /*g:*
+g:NetrwTopLvlMenu pi_netrw.txt /*g:NetrwTopLvlMenu*
+g:Netrw_UserMaps pi_netrw.txt /*g:Netrw_UserMaps*
+g:Netrw_corehandler pi_netrw.txt /*g:Netrw_corehandler*
+g:Netrw_funcref pi_netrw.txt /*g:Netrw_funcref*
+g:actual_curbuf options.txt /*g:actual_curbuf*
+g:actual_curwin options.txt /*g:actual_curwin*
+g:ada#Comment ft_ada.txt /*g:ada#Comment*
+g:ada#Ctags_Kinds ft_ada.txt /*g:ada#Ctags_Kinds*
+g:ada#DotWordRegex ft_ada.txt /*g:ada#DotWordRegex*
+g:ada#Keywords ft_ada.txt /*g:ada#Keywords*
+g:ada#WordRegex ft_ada.txt /*g:ada#WordRegex*
+g:ada_abbrev ft_ada.txt /*g:ada_abbrev*
+g:ada_all_tab_usage ft_ada.txt /*g:ada_all_tab_usage*
+g:ada_begin_preproc ft_ada.txt /*g:ada_begin_preproc*
+g:ada_default_compiler ft_ada.txt /*g:ada_default_compiler*
+g:ada_extended_completion ft_ada.txt /*g:ada_extended_completion*
+g:ada_extended_tagging ft_ada.txt /*g:ada_extended_tagging*
+g:ada_folding ft_ada.txt /*g:ada_folding*
+g:ada_gnat_extensions ft_ada.txt /*g:ada_gnat_extensions*
+g:ada_line_errors ft_ada.txt /*g:ada_line_errors*
+g:ada_no_tab_space_error ft_ada.txt /*g:ada_no_tab_space_error*
+g:ada_no_trail_space_error ft_ada.txt /*g:ada_no_trail_space_error*
+g:ada_omni_with_keywords ft_ada.txt /*g:ada_omni_with_keywords*
+g:ada_rainbow_color ft_ada.txt /*g:ada_rainbow_color*
+g:ada_space_errors ft_ada.txt /*g:ada_space_errors*
+g:ada_standard_types ft_ada.txt /*g:ada_standard_types*
+g:ada_with_gnat_project_files ft_ada.txt /*g:ada_with_gnat_project_files*
+g:ada_withuse_ordinary ft_ada.txt /*g:ada_withuse_ordinary*
+g:clojure_align_multiline_strings indent.txt /*g:clojure_align_multiline_strings*
+g:clojure_align_subforms indent.txt /*g:clojure_align_subforms*
+g:clojure_discard_macro syntax.txt /*g:clojure_discard_macro*
+g:clojure_fold syntax.txt /*g:clojure_fold*
+g:clojure_fuzzy_indent indent.txt /*g:clojure_fuzzy_indent*
+g:clojure_fuzzy_indent_blacklist indent.txt /*g:clojure_fuzzy_indent_blacklist*
+g:clojure_fuzzy_indent_patterns indent.txt /*g:clojure_fuzzy_indent_patterns*
+g:clojure_maxlines indent.txt /*g:clojure_maxlines*
+g:clojure_special_indent_words indent.txt /*g:clojure_special_indent_words*
+g:clojure_syntax_keywords syntax.txt /*g:clojure_syntax_keywords*
+g:colors_name options.txt /*g:colors_name*
+g:decada ft_ada.txt /*g:decada*
+g:decada.Error_Format ft_ada.txt /*g:decada.Error_Format*
+g:decada.Make() ft_ada.txt /*g:decada.Make()*
+g:decada.Make_Command ft_ada.txt /*g:decada.Make_Command*
+g:decada.Unit_Name() ft_ada.txt /*g:decada.Unit_Name()*
+g:filetype_csh syntax.txt /*g:filetype_csh*
+g:filetype_r syntax.txt /*g:filetype_r*
+g:ftplugin_rust_source_path ft_rust.txt /*g:ftplugin_rust_source_path*
+g:gnat ft_ada.txt /*g:gnat*
+g:gnat.Error_Format ft_ada.txt /*g:gnat.Error_Format*
+g:gnat.Find() ft_ada.txt /*g:gnat.Find()*
+g:gnat.Find_Program ft_ada.txt /*g:gnat.Find_Program*
+g:gnat.Make() ft_ada.txt /*g:gnat.Make()*
+g:gnat.Make_Command ft_ada.txt /*g:gnat.Make_Command*
+g:gnat.Pretty() ft_ada.txt /*g:gnat.Pretty()*
+g:gnat.Pretty_Program ft_ada.txt /*g:gnat.Pretty_Program*
+g:gnat.Project_File ft_ada.txt /*g:gnat.Project_File*
+g:gnat.Set_Project_File() ft_ada.txt /*g:gnat.Set_Project_File()*
+g:gnat.Tags() ft_ada.txt /*g:gnat.Tags()*
+g:gnat.Tags_Command ft_ada.txt /*g:gnat.Tags_Command*
+g:html_charset_override syntax.txt /*g:html_charset_override*
+g:html_diff_one_file syntax.txt /*g:html_diff_one_file*
+g:html_dynamic_folds syntax.txt /*g:html_dynamic_folds*
+g:html_encoding_override syntax.txt /*g:html_encoding_override*
+g:html_end_line syntax.txt /*g:html_end_line*
+g:html_expand_tabs syntax.txt /*g:html_expand_tabs*
+g:html_font syntax.txt /*g:html_font*
+g:html_hover_unfold syntax.txt /*g:html_hover_unfold*
+g:html_id_expr syntax.txt /*g:html_id_expr*
+g:html_ignore_conceal syntax.txt /*g:html_ignore_conceal*
+g:html_ignore_folding syntax.txt /*g:html_ignore_folding*
+g:html_line_ids syntax.txt /*g:html_line_ids*
+g:html_no_doc syntax.txt /*g:html_no_doc*
+g:html_no_foldcolumn syntax.txt /*g:html_no_foldcolumn*
+g:html_no_invalid syntax.txt /*g:html_no_invalid*
+g:html_no_links syntax.txt /*g:html_no_links*
+g:html_no_modeline syntax.txt /*g:html_no_modeline*
+g:html_no_pre syntax.txt /*g:html_no_pre*
+g:html_no_progress syntax.txt /*g:html_no_progress*
+g:html_number_lines syntax.txt /*g:html_number_lines*
+g:html_pre_wrap syntax.txt /*g:html_pre_wrap*
+g:html_prevent_copy syntax.txt /*g:html_prevent_copy*
+g:html_start_line syntax.txt /*g:html_start_line*
+g:html_use_css syntax.txt /*g:html_use_css*
+g:html_use_encoding syntax.txt /*g:html_use_encoding*
+g:html_use_input_for_pc syntax.txt /*g:html_use_input_for_pc*
+g:html_use_xhtml syntax.txt /*g:html_use_xhtml*
+g:html_whole_filler syntax.txt /*g:html_whole_filler*
+g:netrw_altfile pi_netrw.txt /*g:netrw_altfile*
+g:netrw_alto pi_netrw.txt /*g:netrw_alto*
+g:netrw_altv pi_netrw.txt /*g:netrw_altv*
+g:netrw_banner pi_netrw.txt /*g:netrw_banner*
+g:netrw_bannerbackslash pi_netrw.txt /*g:netrw_bannerbackslash*
+g:netrw_browse_split pi_netrw.txt /*g:netrw_browse_split*
+g:netrw_browsex_support_remote pi_netrw.txt /*g:netrw_browsex_support_remote*
+g:netrw_browsex_viewer pi_netrw.txt /*g:netrw_browsex_viewer*
+g:netrw_bufsettings pi_netrw.txt /*g:netrw_bufsettings*
+g:netrw_chgperm pi_netrw.txt /*g:netrw_chgperm*
+g:netrw_chgwin pi_netrw.txt /*g:netrw_chgwin*
+g:netrw_clipboard pi_netrw.txt /*g:netrw_clipboard*
+g:netrw_compress pi_netrw.txt /*g:netrw_compress*
+g:netrw_ctags pi_netrw.txt /*g:netrw_ctags*
+g:netrw_cursor pi_netrw.txt /*g:netrw_cursor*
+g:netrw_cygwin pi_netrw.txt /*g:netrw_cygwin*
+g:netrw_dav_cmd pi_netrw.txt /*g:netrw_dav_cmd*
+g:netrw_decompress pi_netrw.txt /*g:netrw_decompress*
+g:netrw_dirhistmax pi_netrw.txt /*g:netrw_dirhistmax*
+g:netrw_dynamic_maxfilenamelen pi_netrw.txt /*g:netrw_dynamic_maxfilenamelen*
+g:netrw_errorlvl pi_netrw.txt /*g:netrw_errorlvl*
+g:netrw_fastbrowse pi_netrw.txt /*g:netrw_fastbrowse*
+g:netrw_fetch_cmd pi_netrw.txt /*g:netrw_fetch_cmd*
+g:netrw_ffkeep pi_netrw.txt /*g:netrw_ffkeep*
+g:netrw_file_cmd pi_netrw.txt /*g:netrw_file_cmd*
+g:netrw_fname_escape pi_netrw.txt /*g:netrw_fname_escape*
+g:netrw_ftp pi_netrw.txt /*g:netrw_ftp*
+g:netrw_ftp_browse_reject pi_netrw.txt /*g:netrw_ftp_browse_reject*
+g:netrw_ftp_cmd pi_netrw.txt /*g:netrw_ftp_cmd*
+g:netrw_ftp_list_cmd pi_netrw.txt /*g:netrw_ftp_list_cmd*
+g:netrw_ftp_options pi_netrw.txt /*g:netrw_ftp_options*
+g:netrw_ftp_sizelist_cmd pi_netrw.txt /*g:netrw_ftp_sizelist_cmd*
+g:netrw_ftp_timelist_cmd pi_netrw.txt /*g:netrw_ftp_timelist_cmd*
+g:netrw_ftpextracmd pi_netrw.txt /*g:netrw_ftpextracmd*
+g:netrw_ftpmode pi_netrw.txt /*g:netrw_ftpmode*
+g:netrw_glob_escape pi_netrw.txt /*g:netrw_glob_escape*
+g:netrw_gx pi_netrw.txt /*g:netrw_gx*
+g:netrw_hide pi_netrw.txt /*g:netrw_hide*
+g:netrw_home pi_netrw.txt /*g:netrw_home*
+g:netrw_http_cmd pi_netrw.txt /*g:netrw_http_cmd*
+g:netrw_http_put_cmd pi_netrw.txt /*g:netrw_http_put_cmd*
+g:netrw_http_xcmd pi_netrw.txt /*g:netrw_http_xcmd*
+g:netrw_ignorenetrc pi_netrw.txt /*g:netrw_ignorenetrc*
+g:netrw_keepdir pi_netrw.txt /*g:netrw_keepdir*
+g:netrw_keepj pi_netrw.txt /*g:netrw_keepj*
+g:netrw_list_cmd pi_netrw.txt /*g:netrw_list_cmd*
+g:netrw_list_cmd_options pi_netrw.txt /*g:netrw_list_cmd_options*
+g:netrw_list_hide pi_netrw.txt /*g:netrw_list_hide*
+g:netrw_liststyle pi_netrw.txt /*g:netrw_liststyle*
+g:netrw_localcopycmd pi_netrw.txt /*g:netrw_localcopycmd*
+g:netrw_localcopycmdopt pi_netrw.txt /*g:netrw_localcopycmdopt*
+g:netrw_localcopydircmd pi_netrw.txt /*g:netrw_localcopydircmd*
+g:netrw_localcopydircmdopt pi_netrw.txt /*g:netrw_localcopydircmdopt*
+g:netrw_localmkdir pi_netrw.txt /*g:netrw_localmkdir*
+g:netrw_localmkdiropt pi_netrw.txt /*g:netrw_localmkdiropt*
+g:netrw_localmovecmd pi_netrw.txt /*g:netrw_localmovecmd*
+g:netrw_localmovecmdopt pi_netrw.txt /*g:netrw_localmovecmdopt*
+g:netrw_localrmdir pi_netrw.txt /*g:netrw_localrmdir*
+g:netrw_localrmdiropt pi_netrw.txt /*g:netrw_localrmdiropt*
+g:netrw_maxfilenamelen pi_netrw.txt /*g:netrw_maxfilenamelen*
+g:netrw_menu pi_netrw.txt /*g:netrw_menu*
+g:netrw_mkdir_cmd pi_netrw.txt /*g:netrw_mkdir_cmd*
+g:netrw_mousemaps pi_netrw.txt /*g:netrw_mousemaps*
+g:netrw_nobeval pi_netrw.txt /*g:netrw_nobeval*
+g:netrw_nogx pi_netrw.txt /*g:netrw_nogx*
+g:netrw_preview pi_netrw.txt /*g:netrw_preview*
+g:netrw_rcp_cmd pi_netrw.txt /*g:netrw_rcp_cmd*
+g:netrw_remote_mkdir pi_netrw.txt /*g:netrw_remote_mkdir*
+g:netrw_rename_cmd pi_netrw.txt /*g:netrw_rename_cmd*
+g:netrw_retmap pi_netrw.txt /*g:netrw_retmap*
+g:netrw_rm_cmd pi_netrw.txt /*g:netrw_rm_cmd*
+g:netrw_rmdir_cmd pi_netrw.txt /*g:netrw_rmdir_cmd*
+g:netrw_rmf_cmd pi_netrw.txt /*g:netrw_rmf_cmd*
+g:netrw_rsync_cmd pi_netrw.txt /*g:netrw_rsync_cmd*
+g:netrw_rsync_sep pi_netrw.txt /*g:netrw_rsync_sep*
+g:netrw_scp_cmd pi_netrw.txt /*g:netrw_scp_cmd*
+g:netrw_scpport pi_netrw.txt /*g:netrw_scpport*
+g:netrw_sepchr pi_netrw.txt /*g:netrw_sepchr*
+g:netrw_servername pi_netrw.txt /*g:netrw_servername*
+g:netrw_sftp_cmd pi_netrw.txt /*g:netrw_sftp_cmd*
+g:netrw_silent pi_netrw.txt /*g:netrw_silent*
+g:netrw_sizestyle pi_netrw.txt /*g:netrw_sizestyle*
+g:netrw_sort_by pi_netrw.txt /*g:netrw_sort_by*
+g:netrw_sort_direction pi_netrw.txt /*g:netrw_sort_direction*
+g:netrw_sort_options pi_netrw.txt /*g:netrw_sort_options*
+g:netrw_sort_sequence pi_netrw.txt /*g:netrw_sort_sequence*
+g:netrw_special_syntax pi_netrw.txt /*g:netrw_special_syntax*
+g:netrw_ssh_browse_reject pi_netrw.txt /*g:netrw_ssh_browse_reject*
+g:netrw_ssh_cmd pi_netrw.txt /*g:netrw_ssh_cmd*
+g:netrw_sshport pi_netrw.txt /*g:netrw_sshport*
+g:netrw_suppress_gx_mesg pi_netrw.txt /*g:netrw_suppress_gx_mesg*
+g:netrw_timefmt pi_netrw.txt /*g:netrw_timefmt*
+g:netrw_tmpfile_escape pi_netrw.txt /*g:netrw_tmpfile_escape*
+g:netrw_uid pi_netrw.txt /*g:netrw_uid*
+g:netrw_use_errorwindow pi_netrw.txt /*g:netrw_use_errorwindow*
+g:netrw_use_noswf pi_netrw.txt /*g:netrw_use_noswf*
+g:netrw_use_nt_rcp pi_netrw.txt /*g:netrw_use_nt_rcp*
+g:netrw_usetab pi_netrw.txt /*g:netrw_usetab*
+g:netrw_win95ftp pi_netrw.txt /*g:netrw_win95ftp*
+g:netrw_winsize pi_netrw.txt /*g:netrw_winsize*
+g:netrw_wiw pi_netrw.txt /*g:netrw_wiw*
+g:netrw_xstrlen pi_netrw.txt /*g:netrw_xstrlen*
+g:no_mail_maps filetype.txt /*g:no_mail_maps*
+g:no_plugin_maps filetype.txt /*g:no_plugin_maps*
+g:rust_bang_comment_leader ft_rust.txt /*g:rust_bang_comment_leader*
+g:rust_conceal ft_rust.txt /*g:rust_conceal*
+g:rust_conceal_mod_path ft_rust.txt /*g:rust_conceal_mod_path*
+g:rust_conceal_pub ft_rust.txt /*g:rust_conceal_pub*
+g:rust_fold ft_rust.txt /*g:rust_fold*
+g:rust_playpen_url ft_rust.txt /*g:rust_playpen_url*
+g:rust_recommended_style ft_rust.txt /*g:rust_recommended_style*
+g:rust_shortener_url ft_rust.txt /*g:rust_shortener_url*
+g:rustc_makeprg_no_percent ft_rust.txt /*g:rustc_makeprg_no_percent*
+g:rustc_path ft_rust.txt /*g:rustc_path*
+g:rustfmt_autosave ft_rust.txt /*g:rustfmt_autosave*
+g:rustfmt_command ft_rust.txt /*g:rustfmt_command*
+g:rustfmt_fail_silently ft_rust.txt /*g:rustfmt_fail_silently*
+g:rustfmt_options ft_rust.txt /*g:rustfmt_options*
+g:statusline_winid options.txt /*g:statusline_winid*
+g:syntax_on syntax.txt /*g:syntax_on*
+g:tar_browseoptions pi_tar.txt /*g:tar_browseoptions*
+g:tar_cmd pi_tar.txt /*g:tar_cmd*
+g:tar_copycmd pi_tar.txt /*g:tar_copycmd*
+g:tar_extractcmd pi_tar.txt /*g:tar_extractcmd*
+g:tar_nomax pi_tar.txt /*g:tar_nomax*
+g:tar_readoptions pi_tar.txt /*g:tar_readoptions*
+g:tar_secure pi_tar.txt /*g:tar_secure*
+g:tar_writeoptions pi_tar.txt /*g:tar_writeoptions*
+g:termdebug_config terminal.txt /*g:termdebug_config*
+g:termdebugger terminal.txt /*g:termdebugger*
+g:terminal_ansi_colors terminal.txt /*g:terminal_ansi_colors*
+g:tex_comment_nospell syntax.txt /*g:tex_comment_nospell*
+g:tex_conceal syntax.txt /*g:tex_conceal*
+g:tex_fast syntax.txt /*g:tex_fast*
+g:tex_flavor filetype.txt /*g:tex_flavor*
+g:tex_fold_enabled syntax.txt /*g:tex_fold_enabled*
+g:tex_isk syntax.txt /*g:tex_isk*
+g:tex_matchcheck syntax.txt /*g:tex_matchcheck*
+g:tex_no_error syntax.txt /*g:tex_no_error*
+g:tex_nospell syntax.txt /*g:tex_nospell*
+g:tex_stylish syntax.txt /*g:tex_stylish*
+g:tex_subscripts syntax.txt /*g:tex_subscripts*
+g:tex_superscripts syntax.txt /*g:tex_superscripts*
+g:tex_verbspell syntax.txt /*g:tex_verbspell*
+g:var eval.txt /*g:var*
+g:vim_indent indent.txt /*g:vim_indent*
+g:vim_indent_cont indent.txt /*g:vim_indent_cont*
+g:vimball_home pi_vimball.txt /*g:vimball_home*
+g:vimball_mkdir pi_vimball.txt /*g:vimball_mkdir*
+g:vimsyn_embed syntax.txt /*g:vimsyn_embed*
+g:vimsyn_folding syntax.txt /*g:vimsyn_folding*
+g:vimsyn_maxlines syntax.txt /*g:vimsyn_maxlines*
+g:vimsyn_minlines syntax.txt /*g:vimsyn_minlines*
+g:vimsyn_noerror syntax.txt /*g:vimsyn_noerror*
+g:yaml_schema syntax.txt /*g:yaml_schema*
+g:zipPlugin_ext pi_zip.txt /*g:zipPlugin_ext*
+g:zip_extractcmd pi_zip.txt /*g:zip_extractcmd*
+g:zip_nomax pi_zip.txt /*g:zip_nomax*
+g:zip_shq pi_zip.txt /*g:zip_shq*
+g:zip_unzipcmd pi_zip.txt /*g:zip_unzipcmd*
+g:zip_zipcmd pi_zip.txt /*g:zip_zipcmd*
+g; motion.txt /*g;*
+g< message.txt /*g<*
+g<Down> motion.txt /*g<Down>*
+g<End> motion.txt /*g<End>*
+g<Home> motion.txt /*g<Home>*
+g<LeftMouse> tagsrch.txt /*g<LeftMouse>*
+g<RightMouse> tagsrch.txt /*g<RightMouse>*
+g<Tab> tabpage.txt /*g<Tab>*
+g<Up> motion.txt /*g<Up>*
+g? change.txt /*g?*
+g?? change.txt /*g??*
+g?g? change.txt /*g?g?*
+g@ map.txt /*g@*
+gD pattern.txt /*gD*
+gE motion.txt /*gE*
+gF editing.txt /*gF*
+gH visual.txt /*gH*
+gI insert.txt /*gI*
+gJ change.txt /*gJ*
+gM motion.txt /*gM*
+gN visual.txt /*gN*
+gP change.txt /*gP*
+gQ intro.txt /*gQ*
+gR change.txt /*gR*
+gT tabpage.txt /*gT*
+gU change.txt /*gU*
+gUU change.txt /*gUU*
+gUgU change.txt /*gUgU*
+gV visual.txt /*gV*
+g] tagsrch.txt /*g]*
+g^ motion.txt /*g^*
+g_ motion.txt /*g_*
+g_CTRL-A various.txt /*g_CTRL-A*
+g_CTRL-G editing.txt /*g_CTRL-G*
+g_CTRL-H visual.txt /*g_CTRL-H*
+g_CTRL-] tagsrch.txt /*g_CTRL-]*
+g` motion.txt /*g`*
+g`a motion.txt /*g`a*
+ga various.txt /*ga*
+garbagecollect() builtin.txt /*garbagecollect()*
+gd pattern.txt /*gd*
+gdb debug.txt /*gdb*
+gdb-version terminal.txt /*gdb-version*
+ge motion.txt /*ge*
+get() builtin.txt /*get()*
+get-ms-debuggers debug.txt /*get-ms-debuggers*
+getbufinfo() builtin.txt /*getbufinfo()*
+getbufline() builtin.txt /*getbufline()*
+getbufoneline() builtin.txt /*getbufoneline()*
+getbufvar() builtin.txt /*getbufvar()*
+getcellwidths() builtin.txt /*getcellwidths()*
+getchangelist() builtin.txt /*getchangelist()*
+getchar() builtin.txt /*getchar()*
+getcharmod() builtin.txt /*getcharmod()*
+getcharpos() builtin.txt /*getcharpos()*
+getcharsearch() builtin.txt /*getcharsearch()*
+getcharstr() builtin.txt /*getcharstr()*
+getcmdcompltype() builtin.txt /*getcmdcompltype()*
+getcmdline() builtin.txt /*getcmdline()*
+getcmdpos() builtin.txt /*getcmdpos()*
+getcmdscreenpos() builtin.txt /*getcmdscreenpos()*
+getcmdtype() builtin.txt /*getcmdtype()*
+getcmdwintype() builtin.txt /*getcmdwintype()*
+getcompletion() builtin.txt /*getcompletion()*
+getcurpos() builtin.txt /*getcurpos()*
+getcursorcharpos() builtin.txt /*getcursorcharpos()*
+getcwd() builtin.txt /*getcwd()*
+getenv() builtin.txt /*getenv()*
+getfontname() builtin.txt /*getfontname()*
+getfperm() builtin.txt /*getfperm()*
+getfsize() builtin.txt /*getfsize()*
+getftime() builtin.txt /*getftime()*
+getftype() builtin.txt /*getftype()*
+getimstatus() builtin.txt /*getimstatus()*
+getjumplist() builtin.txt /*getjumplist()*
+getlatestvimscripts-install pi_getscript.txt /*getlatestvimscripts-install*
+getline() builtin.txt /*getline()*
+getloclist() builtin.txt /*getloclist()*
+getmarklist() builtin.txt /*getmarklist()*
+getmatches() builtin.txt /*getmatches()*
+getmousepos() builtin.txt /*getmousepos()*
+getmouseshape() builtin.txt /*getmouseshape()*
+getpid() builtin.txt /*getpid()*
+getpos() builtin.txt /*getpos()*
+getqflist() builtin.txt /*getqflist()*
+getqflist-examples quickfix.txt /*getqflist-examples*
+getreg() builtin.txt /*getreg()*
+getreginfo() builtin.txt /*getreginfo()*
+getregtype() builtin.txt /*getregtype()*
+getscript pi_getscript.txt /*getscript*
+getscript-autoinstall pi_getscript.txt /*getscript-autoinstall*
+getscript-data pi_getscript.txt /*getscript-data*
+getscript-history pi_getscript.txt /*getscript-history*
+getscript-plugins pi_getscript.txt /*getscript-plugins*
+getscript-start pi_getscript.txt /*getscript-start*
+getscriptinfo() builtin.txt /*getscriptinfo()*
+gettabinfo() builtin.txt /*gettabinfo()*
+gettabvar() builtin.txt /*gettabvar()*
+gettabwinvar() builtin.txt /*gettabwinvar()*
+gettagstack() builtin.txt /*gettagstack()*
+gettext() builtin.txt /*gettext()*
+getwininfo() builtin.txt /*getwininfo()*
+getwinpos() builtin.txt /*getwinpos()*
+getwinposx() builtin.txt /*getwinposx()*
+getwinposy() builtin.txt /*getwinposy()*
+getwinvar() builtin.txt /*getwinvar()*
+gex starting.txt /*gex*
+gf editing.txt /*gf*
+gg motion.txt /*gg*
+gh visual.txt /*gh*
+gi insert.txt /*gi*
+gj motion.txt /*gj*
+gk motion.txt /*gk*
+glob() builtin.txt /*glob()*
+glob2regpat() builtin.txt /*glob2regpat()*
+global-ime mbyte.txt /*global-ime*
+global-local options.txt /*global-local*
+global-variable eval.txt /*global-variable*
+global_markfilelist pi_netrw.txt /*global_markfilelist*
+globpath() builtin.txt /*globpath()*
+glvs pi_getscript.txt /*glvs*
+glvs-alg pi_getscript.txt /*glvs-alg*
+glvs-algorithm pi_getscript.txt /*glvs-algorithm*
+glvs-autoinstall pi_getscript.txt /*glvs-autoinstall*
+glvs-contents pi_getscript.txt /*glvs-contents*
+glvs-copyright pi_getscript.txt /*glvs-copyright*
+glvs-data pi_getscript.txt /*glvs-data*
+glvs-dist-install pi_getscript.txt /*glvs-dist-install*
+glvs-hist pi_getscript.txt /*glvs-hist*
+glvs-install pi_getscript.txt /*glvs-install*
+glvs-options pi_getscript.txt /*glvs-options*
+glvs-plugins pi_getscript.txt /*glvs-plugins*
+glvs-usage pi_getscript.txt /*glvs-usage*
+gm motion.txt /*gm*
+gn visual.txt /*gn*
+gnat#Insert_Tags_Header() ft_ada.txt /*gnat#Insert_Tags_Header()*
+gnat#New() ft_ada.txt /*gnat#New()*
+gnat-xref ft_ada.txt /*gnat-xref*
+gnat_members ft_ada.txt /*gnat_members*
+gnome-session gui_x11.txt /*gnome-session*
+go motion.txt /*go*
+gp change.txt /*gp*
+gpm-mouse term.txt /*gpm-mouse*
+gq change.txt /*gq*
+gqap change.txt /*gqap*
+gqgq change.txt /*gqgq*
+gqq change.txt /*gqq*
+gr change.txt /*gr*
+graphic-option-gone version4.txt /*graphic-option-gone*
+greek options.txt /*greek*
+grep quickfix.txt /*grep*
+groff.vim syntax.txt /*groff.vim*
+gross-national-happiness intro.txt /*gross-national-happiness*
+group-name syntax.txt /*group-name*
+gs various.txt /*gs*
+gsp.vim syntax.txt /*gsp.vim*
+gstar pattern.txt /*gstar*
+gt tabpage.txt /*gt*
+gtk-css gui_x11.txt /*gtk-css*
+gtk-tooltip-colors gui_x11.txt /*gtk-tooltip-colors*
+gtk3-slow gui_x11.txt /*gtk3-slow*
+gu change.txt /*gu*
+gugu change.txt /*gugu*
+gui gui.txt /*gui*
+gui-IME gui.txt /*gui-IME*
+gui-clipboard gui_w32.txt /*gui-clipboard*
+gui-colors syntax.txt /*gui-colors*
+gui-extras gui.txt /*gui-extras*
+gui-font gui.txt /*gui-font*
+gui-fontwide gui.txt /*gui-fontwide*
+gui-footer debugger.txt /*gui-footer*
+gui-fork gui_x11.txt /*gui-fork*
+gui-functions usr_41.txt /*gui-functions*
+gui-gnome gui_x11.txt /*gui-gnome*
+gui-gnome-session gui_x11.txt /*gui-gnome-session*
+gui-gtk gui_x11.txt /*gui-gtk*
+gui-gtk-socketid gui_x11.txt /*gui-gtk-socketid*
+gui-horiz-scroll gui.txt /*gui-horiz-scroll*
+gui-init gui.txt /*gui-init*
+gui-kde gui_x11.txt /*gui-kde*
+gui-mouse gui.txt /*gui-mouse*
+gui-mouse-focus gui.txt /*gui-mouse-focus*
+gui-mouse-mapping gui.txt /*gui-mouse-mapping*
+gui-mouse-modeless gui.txt /*gui-mouse-modeless*
+gui-mouse-move gui.txt /*gui-mouse-move*
+gui-mouse-select gui.txt /*gui-mouse-select*
+gui-mouse-status gui.txt /*gui-mouse-status*
+gui-mouse-various gui.txt /*gui-mouse-various*
+gui-pty gui_x11.txt /*gui-pty*
+gui-pty-erase gui_x11.txt /*gui-pty-erase*
+gui-resources gui_x11.txt /*gui-resources*
+gui-scrollbars gui.txt /*gui-scrollbars*
+gui-selections gui.txt /*gui-selections*
+gui-shell gui.txt /*gui-shell*
+gui-shell-win32 gui_w32.txt /*gui-shell-win32*
+gui-start gui.txt /*gui-start*
+gui-toolbar gui.txt /*gui-toolbar*
+gui-vert-scroll gui.txt /*gui-vert-scroll*
+gui-w32 gui_w32.txt /*gui-w32*
+gui-w32-cmdargs gui_w32.txt /*gui-w32-cmdargs*
+gui-w32-dialogs gui_w32.txt /*gui-w32-dialogs*
+gui-w32-printing gui_w32.txt /*gui-w32-printing*
+gui-w32-start gui_w32.txt /*gui-w32-start*
+gui-w32-various gui_w32.txt /*gui-w32-various*
+gui-w32-windowid gui_w32.txt /*gui-w32-windowid*
+gui-w32s os_win32.txt /*gui-w32s*
+gui-win32-maximized gui_w32.txt /*gui-win32-maximized*
+gui-x11 gui_x11.txt /*gui-x11*
+gui-x11-athena gui_x11.txt /*gui-x11-athena*
+gui-x11-compiling gui_x11.txt /*gui-x11-compiling*
+gui-x11-gtk gui_x11.txt /*gui-x11-gtk*
+gui-x11-kde gui_x11.txt /*gui-x11-kde*
+gui-x11-misc gui_x11.txt /*gui-x11-misc*
+gui-x11-motif gui_x11.txt /*gui-x11-motif*
+gui-x11-neXtaw gui_x11.txt /*gui-x11-neXtaw*
+gui-x11-printing gui_x11.txt /*gui-x11-printing*
+gui-x11-start gui_x11.txt /*gui-x11-start*
+gui-x11-various gui_x11.txt /*gui-x11-various*
+gui.txt gui.txt /*gui.txt*
+gui_running builtin.txt /*gui_running*
+gui_w32.txt gui_w32.txt /*gui_w32.txt*
+gui_x11.txt gui_x11.txt /*gui_x11.txt*
+guifontwide_gtk gui.txt /*guifontwide_gtk*
+guifontwide_win_mbyte gui.txt /*guifontwide_win_mbyte*
+guu change.txt /*guu*
+gv visual.txt /*gv*
+gview starting.txt /*gview*
+gvim starting.txt /*gvim*
+gvimdiff diff.txt /*gvimdiff*
+gvimrc gui.txt /*gvimrc*
+gw change.txt /*gw*
+gwgw change.txt /*gwgw*
+gww change.txt /*gww*
+gzip pi_gzip.txt /*gzip*
+gzip-autocmd pi_gzip.txt /*gzip-autocmd*
+gzip-example autocmd.txt /*gzip-example*
+gzip-helpfile tips.txt /*gzip-helpfile*
+g~ change.txt /*g~*
+g~g~ change.txt /*g~g~*
+g~~ change.txt /*g~~*
+h motion.txt /*h*
+haiku-bugs os_haiku.txt /*haiku-bugs*
+haiku-colors os_haiku.txt /*haiku-colors*
+haiku-compiling os_haiku.txt /*haiku-compiling*
+haiku-dragndrop os_haiku.txt /*haiku-dragndrop*
+haiku-fonts os_haiku.txt /*haiku-fonts*
+haiku-general os_haiku.txt /*haiku-general*
+haiku-gui os_haiku.txt /*haiku-gui*
+haiku-launch os_haiku.txt /*haiku-launch*
+haiku-meta os_haiku.txt /*haiku-meta*
+haiku-mouse os_haiku.txt /*haiku-mouse*
+haiku-support-credits os_haiku.txt /*haiku-support-credits*
+haiku-toolbar-images os_haiku.txt /*haiku-toolbar-images*
+haiku-user-settings-dir os_haiku.txt /*haiku-user-settings-dir*
+haiku-vimdir os_haiku.txt /*haiku-vimdir*
+hangul hangulin.txt /*hangul*
+hangulin.txt hangulin.txt /*hangulin.txt*
+has() builtin.txt /*has()*
+has-patch builtin.txt /*has-patch*
+has-python if_pyth.txt /*has-python*
+has-pythonx if_pyth.txt /*has-pythonx*
+has_key() builtin.txt /*has_key()*
+haskell.vim syntax.txt /*haskell.vim*
+haslocaldir() builtin.txt /*haslocaldir()*
+hasmapto() builtin.txt /*hasmapto()*
+hebrew hebrew.txt /*hebrew*
+hebrew.txt hebrew.txt /*hebrew.txt*
+help helphelp.txt /*help*
+help-buffer-options helphelp.txt /*help-buffer-options*
+help-context help.txt /*help-context*
+help-curwin tips.txt /*help-curwin*
+help-summary usr_02.txt /*help-summary*
+help-tags tags 1
+help-translated helphelp.txt /*help-translated*
+help-writing helphelp.txt /*help-writing*
+help-xterm-window helphelp.txt /*help-xterm-window*
+help.txt help.txt /*help.txt*
+helphelp helphelp.txt /*helphelp*
+helphelp.txt helphelp.txt /*helphelp.txt*
+hex-editing tips.txt /*hex-editing*
+hex-number eval.txt /*hex-number*
+hidden-buffer windows.txt /*hidden-buffer*
+hidden-changed version5.txt /*hidden-changed*
+hidden-menus gui.txt /*hidden-menus*
+hidden-options options.txt /*hidden-options*
+hidden-quit windows.txt /*hidden-quit*
+highlight-args syntax.txt /*highlight-args*
+highlight-changed version4.txt /*highlight-changed*
+highlight-clear syntax.txt /*highlight-clear*
+highlight-cterm syntax.txt /*highlight-cterm*
+highlight-ctermbg syntax.txt /*highlight-ctermbg*
+highlight-ctermfg syntax.txt /*highlight-ctermfg*
+highlight-ctermul syntax.txt /*highlight-ctermul*
+highlight-default syntax.txt /*highlight-default*
+highlight-font syntax.txt /*highlight-font*
+highlight-groups syntax.txt /*highlight-groups*
+highlight-gui syntax.txt /*highlight-gui*
+highlight-guibg syntax.txt /*highlight-guibg*
+highlight-guifg syntax.txt /*highlight-guifg*
+highlight-guisp syntax.txt /*highlight-guisp*
+highlight-start syntax.txt /*highlight-start*
+highlight-stop syntax.txt /*highlight-stop*
+highlight-term syntax.txt /*highlight-term*
+highlightID() builtin.txt /*highlightID()*
+highlight_exists() builtin.txt /*highlight_exists()*
+highlighting-functions usr_41.txt /*highlighting-functions*
+hist-names builtin.txt /*hist-names*
+histadd() builtin.txt /*histadd()*
+histdel() builtin.txt /*histdel()*
+histget() builtin.txt /*histget()*
+histnr() builtin.txt /*histnr()*
+history cmdline.txt /*history*
+history-functions usr_41.txt /*history-functions*
+hit-enter message.txt /*hit-enter*
+hit-enter-prompt message.txt /*hit-enter-prompt*
+hit-return message.txt /*hit-return*
+hitest.vim syntax.txt /*hitest.vim*
+hjkl usr_02.txt /*hjkl*
+hl-ColorColumn syntax.txt /*hl-ColorColumn*
+hl-Conceal syntax.txt /*hl-Conceal*
+hl-CurSearch syntax.txt /*hl-CurSearch*
+hl-Cursor syntax.txt /*hl-Cursor*
+hl-CursorColumn syntax.txt /*hl-CursorColumn*
+hl-CursorIM syntax.txt /*hl-CursorIM*
+hl-CursorLine syntax.txt /*hl-CursorLine*
+hl-CursorLineFold syntax.txt /*hl-CursorLineFold*
+hl-CursorLineNr syntax.txt /*hl-CursorLineNr*
+hl-CursorLineSign syntax.txt /*hl-CursorLineSign*
+hl-DiffAdd syntax.txt /*hl-DiffAdd*
+hl-DiffChange syntax.txt /*hl-DiffChange*
+hl-DiffDelete syntax.txt /*hl-DiffDelete*
+hl-DiffText syntax.txt /*hl-DiffText*
+hl-Directory syntax.txt /*hl-Directory*
+hl-EndOfBuffer syntax.txt /*hl-EndOfBuffer*
+hl-ErrorMsg syntax.txt /*hl-ErrorMsg*
+hl-FoldColumn syntax.txt /*hl-FoldColumn*
+hl-Folded syntax.txt /*hl-Folded*
+hl-Ignore syntax.txt /*hl-Ignore*
+hl-IncSearch syntax.txt /*hl-IncSearch*
+hl-LineNr syntax.txt /*hl-LineNr*
+hl-LineNrAbove syntax.txt /*hl-LineNrAbove*
+hl-LineNrBelow syntax.txt /*hl-LineNrBelow*
+hl-MatchParen syntax.txt /*hl-MatchParen*
+hl-Menu syntax.txt /*hl-Menu*
+hl-MessageWindow syntax.txt /*hl-MessageWindow*
+hl-ModeMsg syntax.txt /*hl-ModeMsg*
+hl-MoreMsg syntax.txt /*hl-MoreMsg*
+hl-NonText syntax.txt /*hl-NonText*
+hl-Normal syntax.txt /*hl-Normal*
+hl-Pmenu syntax.txt /*hl-Pmenu*
+hl-PmenuSbar syntax.txt /*hl-PmenuSbar*
+hl-PmenuSel syntax.txt /*hl-PmenuSel*
+hl-PmenuThumb syntax.txt /*hl-PmenuThumb*
+hl-PopupNotification syntax.txt /*hl-PopupNotification*
+hl-Question syntax.txt /*hl-Question*
+hl-QuickFixLine syntax.txt /*hl-QuickFixLine*
+hl-Scrollbar syntax.txt /*hl-Scrollbar*
+hl-Search syntax.txt /*hl-Search*
+hl-SignColumn syntax.txt /*hl-SignColumn*
+hl-SpecialKey syntax.txt /*hl-SpecialKey*
+hl-SpellBad syntax.txt /*hl-SpellBad*
+hl-SpellCap syntax.txt /*hl-SpellCap*
+hl-SpellLocal syntax.txt /*hl-SpellLocal*
+hl-SpellRare syntax.txt /*hl-SpellRare*
+hl-StatusLine syntax.txt /*hl-StatusLine*
+hl-StatusLineNC syntax.txt /*hl-StatusLineNC*
+hl-StatusLineTerm syntax.txt /*hl-StatusLineTerm*
+hl-StatusLineTermNC syntax.txt /*hl-StatusLineTermNC*
+hl-TOhtmlProgress syntax.txt /*hl-TOhtmlProgress*
+hl-TabLine syntax.txt /*hl-TabLine*
+hl-TabLineFill syntax.txt /*hl-TabLineFill*
+hl-TabLineSel syntax.txt /*hl-TabLineSel*
+hl-Terminal syntax.txt /*hl-Terminal*
+hl-Title syntax.txt /*hl-Title*
+hl-ToolbarButton gui.txt /*hl-ToolbarButton*
+hl-ToolbarLine gui.txt /*hl-ToolbarLine*
+hl-Tooltip syntax.txt /*hl-Tooltip*
+hl-User1 syntax.txt /*hl-User1*
+hl-User1..9 syntax.txt /*hl-User1..9*
+hl-User9 syntax.txt /*hl-User9*
+hl-VertSplit syntax.txt /*hl-VertSplit*
+hl-Visual syntax.txt /*hl-Visual*
+hl-VisualNOS syntax.txt /*hl-VisualNOS*
+hl-WarningMsg syntax.txt /*hl-WarningMsg*
+hl-WildMenu syntax.txt /*hl-WildMenu*
+hl-debugBreakpoint terminal.txt /*hl-debugBreakpoint*
+hl-debugPC terminal.txt /*hl-debugPC*
+hl-lCursor syntax.txt /*hl-lCursor*
+hlID() builtin.txt /*hlID()*
+hlexists() builtin.txt /*hlexists()*
+hlget() builtin.txt /*hlget()*
+hlsearch-variable eval.txt /*hlsearch-variable*
+hlset() builtin.txt /*hlset()*
+holy-grail index.txt /*holy-grail*
+home intro.txt /*home*
+home-replace editing.txt /*home-replace*
+hostname() builtin.txt /*hostname()*
+how-do-i howto.txt /*how-do-i*
+how-to howto.txt /*how-to*
+howdoi howto.txt /*howdoi*
+howto howto.txt /*howto*
+howto.txt howto.txt /*howto.txt*
+hpterm term.txt /*hpterm*
+hpterm-color syntax.txt /*hpterm-color*
+html-flavor insert.txt /*html-flavor*
+html-folding syntax.txt /*html-folding*
+html-indent indent.txt /*html-indent*
+html-indenting indent.txt /*html-indenting*
+html.vim syntax.txt /*html.vim*
+htmlos.vim syntax.txt /*htmlos.vim*
+http pi_netrw.txt /*http*
+i insert.txt /*i*
+i' motion.txt /*i'*
+i( motion.txt /*i(*
+i) motion.txt /*i)*
+i< motion.txt /*i<*
+i> motion.txt /*i>*
+iB motion.txt /*iB*
+iBus gui.txt /*iBus*
+iW motion.txt /*iW*
+i[ motion.txt /*i[*
+i] motion.txt /*i]*
+i_0_CTRL-D insert.txt /*i_0_CTRL-D*
+i_<BS> insert.txt /*i_<BS>*
+i_<C-End> insert.txt /*i_<C-End>*
+i_<C-Home> insert.txt /*i_<C-Home>*
+i_<C-Left> insert.txt /*i_<C-Left>*
+i_<C-PageDown> tabpage.txt /*i_<C-PageDown>*
+i_<C-PageUp> tabpage.txt /*i_<C-PageUp>*
+i_<C-Right> insert.txt /*i_<C-Right>*
+i_<CR> insert.txt /*i_<CR>*
+i_<Del> insert.txt /*i_<Del>*
+i_<Down> insert.txt /*i_<Down>*
+i_<End> insert.txt /*i_<End>*
+i_<Esc> insert.txt /*i_<Esc>*
+i_<F1> helphelp.txt /*i_<F1>*
+i_<Help> helphelp.txt /*i_<Help>*
+i_<Home> insert.txt /*i_<Home>*
+i_<Insert> insert.txt /*i_<Insert>*
+i_<Left> insert.txt /*i_<Left>*
+i_<LeftMouse> insert.txt /*i_<LeftMouse>*
+i_<NL> insert.txt /*i_<NL>*
+i_<PageDown> insert.txt /*i_<PageDown>*
+i_<PageUp> insert.txt /*i_<PageUp>*
+i_<Right> insert.txt /*i_<Right>*
+i_<S-Down> insert.txt /*i_<S-Down>*
+i_<S-Left> insert.txt /*i_<S-Left>*
+i_<S-Right> insert.txt /*i_<S-Right>*
+i_<S-ScrollWheelDown> insert.txt /*i_<S-ScrollWheelDown>*
+i_<S-ScrollWheelLeft> insert.txt /*i_<S-ScrollWheelLeft>*
+i_<S-ScrollWheelRight> insert.txt /*i_<S-ScrollWheelRight>*
+i_<S-ScrollWheelUp> insert.txt /*i_<S-ScrollWheelUp>*
+i_<S-Up> insert.txt /*i_<S-Up>*
+i_<ScrollWheelDown> insert.txt /*i_<ScrollWheelDown>*
+i_<ScrollWheelLeft> insert.txt /*i_<ScrollWheelLeft>*
+i_<ScrollWheelRight> insert.txt /*i_<ScrollWheelRight>*
+i_<ScrollWheelUp> insert.txt /*i_<ScrollWheelUp>*
+i_<Tab> insert.txt /*i_<Tab>*
+i_<Up> insert.txt /*i_<Up>*
+i_BS insert.txt /*i_BS*
+i_CTRL-<PageDown> tabpage.txt /*i_CTRL-<PageDown>*
+i_CTRL-<PageUp> tabpage.txt /*i_CTRL-<PageUp>*
+i_CTRL-@ insert.txt /*i_CTRL-@*
+i_CTRL-A insert.txt /*i_CTRL-A*
+i_CTRL-B-gone version5.txt /*i_CTRL-B-gone*
+i_CTRL-C insert.txt /*i_CTRL-C*
+i_CTRL-D insert.txt /*i_CTRL-D*
+i_CTRL-E insert.txt /*i_CTRL-E*
+i_CTRL-F indent.txt /*i_CTRL-F*
+i_CTRL-G_<Down> insert.txt /*i_CTRL-G_<Down>*
+i_CTRL-G_<Up> insert.txt /*i_CTRL-G_<Up>*
+i_CTRL-G_CTRL-J insert.txt /*i_CTRL-G_CTRL-J*
+i_CTRL-G_CTRL-K insert.txt /*i_CTRL-G_CTRL-K*
+i_CTRL-G_U insert.txt /*i_CTRL-G_U*
+i_CTRL-G_j insert.txt /*i_CTRL-G_j*
+i_CTRL-G_k insert.txt /*i_CTRL-G_k*
+i_CTRL-G_u insert.txt /*i_CTRL-G_u*
+i_CTRL-H insert.txt /*i_CTRL-H*
+i_CTRL-I insert.txt /*i_CTRL-I*
+i_CTRL-J insert.txt /*i_CTRL-J*
+i_CTRL-K insert.txt /*i_CTRL-K*
+i_CTRL-L insert.txt /*i_CTRL-L*
+i_CTRL-M insert.txt /*i_CTRL-M*
+i_CTRL-N insert.txt /*i_CTRL-N*
+i_CTRL-O insert.txt /*i_CTRL-O*
+i_CTRL-P insert.txt /*i_CTRL-P*
+i_CTRL-Q insert.txt /*i_CTRL-Q*
+i_CTRL-R insert.txt /*i_CTRL-R*
+i_CTRL-R_= insert.txt /*i_CTRL-R_=*
+i_CTRL-R_CTRL-O insert.txt /*i_CTRL-R_CTRL-O*
+i_CTRL-R_CTRL-P insert.txt /*i_CTRL-R_CTRL-P*
+i_CTRL-R_CTRL-R insert.txt /*i_CTRL-R_CTRL-R*
+i_CTRL-SHIFT-Q insert.txt /*i_CTRL-SHIFT-Q*
+i_CTRL-SHIFT-V insert.txt /*i_CTRL-SHIFT-V*
+i_CTRL-T insert.txt /*i_CTRL-T*
+i_CTRL-U insert.txt /*i_CTRL-U*
+i_CTRL-V insert.txt /*i_CTRL-V*
+i_CTRL-V_digit insert.txt /*i_CTRL-V_digit*
+i_CTRL-W insert.txt /*i_CTRL-W*
+i_CTRL-X insert.txt /*i_CTRL-X*
+i_CTRL-X_CTRL-D insert.txt /*i_CTRL-X_CTRL-D*
+i_CTRL-X_CTRL-E insert.txt /*i_CTRL-X_CTRL-E*
+i_CTRL-X_CTRL-F insert.txt /*i_CTRL-X_CTRL-F*
+i_CTRL-X_CTRL-I insert.txt /*i_CTRL-X_CTRL-I*
+i_CTRL-X_CTRL-K insert.txt /*i_CTRL-X_CTRL-K*
+i_CTRL-X_CTRL-L insert.txt /*i_CTRL-X_CTRL-L*
+i_CTRL-X_CTRL-N insert.txt /*i_CTRL-X_CTRL-N*
+i_CTRL-X_CTRL-O insert.txt /*i_CTRL-X_CTRL-O*
+i_CTRL-X_CTRL-P insert.txt /*i_CTRL-X_CTRL-P*
+i_CTRL-X_CTRL-S insert.txt /*i_CTRL-X_CTRL-S*
+i_CTRL-X_CTRL-T insert.txt /*i_CTRL-X_CTRL-T*
+i_CTRL-X_CTRL-U insert.txt /*i_CTRL-X_CTRL-U*
+i_CTRL-X_CTRL-V insert.txt /*i_CTRL-X_CTRL-V*
+i_CTRL-X_CTRL-Y insert.txt /*i_CTRL-X_CTRL-Y*
+i_CTRL-X_CTRL-Z insert.txt /*i_CTRL-X_CTRL-Z*
+i_CTRL-X_CTRL-] insert.txt /*i_CTRL-X_CTRL-]*
+i_CTRL-X_index index.txt /*i_CTRL-X_index*
+i_CTRL-X_s insert.txt /*i_CTRL-X_s*
+i_CTRL-Y insert.txt /*i_CTRL-Y*
+i_CTRL-Z options.txt /*i_CTRL-Z*
+i_CTRL-[ insert.txt /*i_CTRL-[*
+i_CTRL-\_CTRL-G intro.txt /*i_CTRL-\\_CTRL-G*
+i_CTRL-\_CTRL-N intro.txt /*i_CTRL-\\_CTRL-N*
+i_CTRL-\_CTRL-O insert.txt /*i_CTRL-\\_CTRL-O*
+i_CTRL-] insert.txt /*i_CTRL-]*
+i_CTRL-^ insert.txt /*i_CTRL-^*
+i_CTRL-_ insert.txt /*i_CTRL-_*
+i_DEL insert.txt /*i_DEL*
+i_Tab insert.txt /*i_Tab*
+i_^_CTRL-D insert.txt /*i_^_CTRL-D*
+i_backspacing insert.txt /*i_backspacing*
+i_digraph digraph.txt /*i_digraph*
+i_esc intro.txt /*i_esc*
+i` motion.txt /*i`*
+ia64.vim syntax.txt /*ia64.vim*
+ib motion.txt /*ib*
+iccf uganda.txt /*iccf*
+iccf-donations uganda.txt /*iccf-donations*
+icon-changed version4.txt /*icon-changed*
+iconise starting.txt /*iconise*
+iconize starting.txt /*iconize*
+iconv() builtin.txt /*iconv()*
+iconv-dynamic mbyte.txt /*iconv-dynamic*
+ident-search tips.txt /*ident-search*
+idl-syntax syntax.txt /*idl-syntax*
+idl.vim syntax.txt /*idl.vim*
+if_cscop.txt if_cscop.txt /*if_cscop.txt*
+if_lua.txt if_lua.txt /*if_lua.txt*
+if_mzsch.txt if_mzsch.txt /*if_mzsch.txt*
+if_ole.txt if_ole.txt /*if_ole.txt*
+if_perl.txt if_perl.txt /*if_perl.txt*
+if_pyth.txt if_pyth.txt /*if_pyth.txt*
+if_ruby.txt if_ruby.txt /*if_ruby.txt*
+if_sniff.txt if_sniff.txt /*if_sniff.txt*
+if_tcl.txt if_tcl.txt /*if_tcl.txt*
+ignore-errors eval.txt /*ignore-errors*
+ignore-timestamp editing.txt /*ignore-timestamp*
+implements vim9class.txt /*implements*
+import-autoload vim9.txt /*import-autoload*
+import-legacy vim9.txt /*import-legacy*
+import-map vim9.txt /*import-map*
+improved-autocmds-5.4 version5.txt /*improved-autocmds-5.4*
+improved-quickfix version5.txt /*improved-quickfix*
+improved-sessions version5.txt /*improved-sessions*
+improved-viminfo version5.txt /*improved-viminfo*
+improvements-5 version5.txt /*improvements-5*
+improvements-6 version6.txt /*improvements-6*
+improvements-7 version7.txt /*improvements-7*
+improvements-8 version8.txt /*improvements-8*
+improvements-9 version9.txt /*improvements-9*
+in_bot channel.txt /*in_bot*
+in_buf channel.txt /*in_buf*
+in_io-buffer channel.txt /*in_io-buffer*
+in_mode channel.txt /*in_mode*
+in_name channel.txt /*in_name*
+in_top channel.txt /*in_top*
+inactive-buffer windows.txt /*inactive-buffer*
+include-search tagsrch.txt /*include-search*
+inclusion helphelp.txt /*inclusion*
+inclusive motion.txt /*inclusive*
+incomp-small-6 version6.txt /*incomp-small-6*
+incompatible-5 version5.txt /*incompatible-5*
+incompatible-6 version6.txt /*incompatible-6*
+incompatible-7 version7.txt /*incompatible-7*
+incompatible-8 version8.txt /*incompatible-8*
+incompatible-9 version9.txt /*incompatible-9*
+indent() builtin.txt /*indent()*
+indent-expression indent.txt /*indent-expression*
+indent.txt indent.txt /*indent.txt*
+indentkeys-format indent.txt /*indentkeys-format*
+index index.txt /*index*
+index() builtin.txt /*index()*
+index.txt index.txt /*index.txt*
+indexof() builtin.txt /*indexof()*
+info-message starting.txt /*info-message*
+inform.vim syntax.txt /*inform.vim*
+informix ft_sql.txt /*informix*
+initialization starting.txt /*initialization*
+inline-function vim9.txt /*inline-function*
+input() builtin.txt /*input()*
+inputdialog() builtin.txt /*inputdialog()*
+inputlist() builtin.txt /*inputlist()*
+inputrestore() builtin.txt /*inputrestore()*
+inputsave() builtin.txt /*inputsave()*
+inputsecret() builtin.txt /*inputsecret()*
+ins-completion insert.txt /*ins-completion*
+ins-completion-menu insert.txt /*ins-completion-menu*
+ins-expandtab insert.txt /*ins-expandtab*
+ins-reverse rileft.txt /*ins-reverse*
+ins-smarttab insert.txt /*ins-smarttab*
+ins-softtabstop insert.txt /*ins-softtabstop*
+ins-special-keys insert.txt /*ins-special-keys*
+ins-special-special insert.txt /*ins-special-special*
+ins-textwidth insert.txt /*ins-textwidth*
+insert insert.txt /*insert*
+insert() builtin.txt /*insert()*
+insert-index index.txt /*insert-index*
+insert.txt insert.txt /*insert.txt*
+insert_expand insert.txt /*insert_expand*
+inserting insert.txt /*inserting*
+inserting-ex insert.txt /*inserting-ex*
+inserting-file insert.txt /*inserting-file*
+insertmode-variable eval.txt /*insertmode-variable*
+install usr_90.txt /*install*
+install-home usr_90.txt /*install-home*
+install-registry gui_w32.txt /*install-registry*
+intel-itanium syntax.txt /*intel-itanium*
+intellimouse-wheel-problems gui_w32.txt /*intellimouse-wheel-problems*
+interactive-functions usr_41.txt /*interactive-functions*
+interfaces-5.2 version5.txt /*interfaces-5.2*
+internal-variables eval.txt /*internal-variables*
+internal-wordlist spell.txt /*internal-wordlist*
+internet intro.txt /*internet*
+interpolated-string eval.txt /*interpolated-string*
+interrupt() builtin.txt /*interrupt()*
+intro intro.txt /*intro*
+intro.txt intro.txt /*intro.txt*
+inverse syntax.txt /*inverse*
+invert() builtin.txt /*invert()*
+ip motion.txt /*ip*
+iquote motion.txt /*iquote*
+is motion.txt /*is*
+isabsolutepath() builtin.txt /*isabsolutepath()*
+isdirectory() builtin.txt /*isdirectory()*
+isinf() builtin.txt /*isinf()*
+islocked() builtin.txt /*islocked()*
+isnan() builtin.txt /*isnan()*
+it motion.txt /*it*
+italic syntax.txt /*italic*
+items() builtin.txt /*items()*
+iw motion.txt /*iw*
+i{ motion.txt /*i{*
+i} motion.txt /*i}*
+j motion.txt /*j*
+java-cinoptions indent.txt /*java-cinoptions*
+java-indenting indent.txt /*java-indenting*
+java.vim syntax.txt /*java.vim*
+javascript-cinoptions indent.txt /*javascript-cinoptions*
+javascript-indenting indent.txt /*javascript-indenting*
+job channel.txt /*job*
+job-callback channel.txt /*job-callback*
+job-channel-overview channel.txt /*job-channel-overview*
+job-close_cb channel.txt /*job-close_cb*
+job-control channel.txt /*job-control*
+job-drop channel.txt /*job-drop*
+job-err_cb channel.txt /*job-err_cb*
+job-err_io channel.txt /*job-err_io*
+job-exit_cb channel.txt /*job-exit_cb*
+job-functions usr_41.txt /*job-functions*
+job-functions-details channel.txt /*job-functions-details*
+job-in_io channel.txt /*job-in_io*
+job-noblock channel.txt /*job-noblock*
+job-options channel.txt /*job-options*
+job-out_cb channel.txt /*job-out_cb*
+job-out_io channel.txt /*job-out_io*
+job-start channel.txt /*job-start*
+job-start-if-needed channel.txt /*job-start-if-needed*
+job-start-nochannel channel.txt /*job-start-nochannel*
+job-stoponexit channel.txt /*job-stoponexit*
+job-term channel.txt /*job-term*
+job-timeout channel.txt /*job-timeout*
+job_getchannel() channel.txt /*job_getchannel()*
+job_info() channel.txt /*job_info()*
+job_setoptions() channel.txt /*job_setoptions()*
+job_start() channel.txt /*job_start()*
+job_status() channel.txt /*job_status()*
+job_stop() channel.txt /*job_stop()*
+join() builtin.txt /*join()*
+js_decode() builtin.txt /*js_decode()*
+js_encode() builtin.txt /*js_encode()*
+jsbterm-mouse options.txt /*jsbterm-mouse*
+json.vim syntax.txt /*json.vim*
+json_decode() builtin.txt /*json_decode()*
+json_encode() builtin.txt /*json_encode()*
+jtags tagsrch.txt /*jtags*
+jump-motions motion.txt /*jump-motions*
+jumplist motion.txt /*jumplist*
+jumpto-diffs diff.txt /*jumpto-diffs*
+k motion.txt /*k*
+kcc uganda.txt /*kcc*
+kde gui_x11.txt /*kde*
+key-codes intro.txt /*key-codes*
+key-codes-changed version4.txt /*key-codes-changed*
+key-mapping map.txt /*key-mapping*
+key-notation intro.txt /*key-notation*
+key-variable eval.txt /*key-variable*
+keycodes intro.txt /*keycodes*
+keymap-accents mbyte.txt /*keymap-accents*
+keymap-file-format mbyte.txt /*keymap-file-format*
+keymap-hebrew mbyte.txt /*keymap-hebrew*
+keypad-0 intro.txt /*keypad-0*
+keypad-9 intro.txt /*keypad-9*
+keypad-comma term.txt /*keypad-comma*
+keypad-divide intro.txt /*keypad-divide*
+keypad-end intro.txt /*keypad-end*
+keypad-enter intro.txt /*keypad-enter*
+keypad-home intro.txt /*keypad-home*
+keypad-minus intro.txt /*keypad-minus*
+keypad-multiply intro.txt /*keypad-multiply*
+keypad-page-down intro.txt /*keypad-page-down*
+keypad-page-up intro.txt /*keypad-page-up*
+keypad-plus intro.txt /*keypad-plus*
+keypad-point intro.txt /*keypad-point*
+keys() builtin.txt /*keys()*
+keytrans() builtin.txt /*keytrans()*
+kitty-keyboard-protocol map.txt /*kitty-keyboard-protocol*
+kitty-terminal term.txt /*kitty-terminal*
+known-bugs todo.txt /*known-bugs*
+l motion.txt /*l*
+l: eval.txt /*l:*
+l:var eval.txt /*l:var*
+lCursor mbyte.txt /*lCursor*
+lace.vim syntax.txt /*lace.vim*
+lambda eval.txt /*lambda*
+lang-variable eval.txt /*lang-variable*
+language-mapping map.txt /*language-mapping*
+language-server-protocol channel.txt /*language-server-protocol*
+last-pattern pattern.txt /*last-pattern*
+last-position-jump usr_05.txt /*last-position-jump*
+last_buffer_nr() builtin.txt /*last_buffer_nr()*
+latex-syntax syntax.txt /*latex-syntax*
+lc_time-variable eval.txt /*lc_time-variable*
+lcs-conceal options.txt /*lcs-conceal*
+lcs-eol options.txt /*lcs-eol*
+lcs-extends options.txt /*lcs-extends*
+lcs-lead options.txt /*lcs-lead*
+lcs-leadmultispace options.txt /*lcs-leadmultispace*
+lcs-multispace options.txt /*lcs-multispace*
+lcs-nbsp options.txt /*lcs-nbsp*
+lcs-precedes options.txt /*lcs-precedes*
+lcs-space options.txt /*lcs-space*
+lcs-tab options.txt /*lcs-tab*
+lcs-trail options.txt /*lcs-trail*
+left-right-motions motion.txt /*left-right-motions*
+legacy-import vim9.txt /*legacy-import*
+len() builtin.txt /*len()*
+less various.txt /*less*
+letter print.txt /*letter*
+lex.vim syntax.txt /*lex.vim*
+lhaskell.vim syntax.txt /*lhaskell.vim*
+libcall() builtin.txt /*libcall()*
+libcallnr() builtin.txt /*libcallnr()*
+license uganda.txt /*license*
+lid quickfix.txt /*lid*
+lifelines.vim syntax.txt /*lifelines.vim*
+limits vi_diff.txt /*limits*
+line() builtin.txt /*line()*
+line-continuation repeat.txt /*line-continuation*
+line-continuation-comment repeat.txt /*line-continuation-comment*
+line2byte() builtin.txt /*line2byte()*
+linefeed intro.txt /*linefeed*
+linewise motion.txt /*linewise*
+linewise-register change.txt /*linewise-register*
+linewise-visual visual.txt /*linewise-visual*
+lisp.vim syntax.txt /*lisp.vim*
+lispindent() builtin.txt /*lispindent()*
+list eval.txt /*list*
+list-concatenation eval.txt /*list-concatenation*
+list-functions usr_41.txt /*list-functions*
+list-identity eval.txt /*list-identity*
+list-index eval.txt /*list-index*
+list-modification eval.txt /*list-modification*
+list-repeat windows.txt /*list-repeat*
+list2blob() builtin.txt /*list2blob()*
+list2str() builtin.txt /*list2str()*
+listener_add() builtin.txt /*listener_add()*
+listener_flush() builtin.txt /*listener_flush()*
+listener_remove() builtin.txt /*listener_remove()*
+lite.vim syntax.txt /*lite.vim*
+literal-Dict eval.txt /*literal-Dict*
+literal-string eval.txt /*literal-string*
+lnum-variable eval.txt /*lnum-variable*
+load-plugins starting.txt /*load-plugins*
+load-vim-script repeat.txt /*load-vim-script*
+local-additions help.txt /*local-additions*
+local-function userfunc.txt /*local-function*
+local-options options.txt /*local-options*
+local-variable eval.txt /*local-variable*
+local-variables userfunc.txt /*local-variables*
+local_markfilelist pi_netrw.txt /*local_markfilelist*
+locale mbyte.txt /*locale*
+locale-name mbyte.txt /*locale-name*
+localtime() builtin.txt /*localtime()*
+location-list quickfix.txt /*location-list*
+location-list-file-window quickfix.txt /*location-list-file-window*
+location-list-window quickfix.txt /*location-list-window*
+log() builtin.txt /*log()*
+log10() builtin.txt /*log10()*
+logiPat pi_logipat.txt /*logiPat*
+logiPat-arg pi_logipat.txt /*logiPat-arg*
+logiPat-caveat pi_logipat.txt /*logiPat-caveat*
+logiPat-cmd pi_logipat.txt /*logiPat-cmd*
+logiPat-contents pi_logipat.txt /*logiPat-contents*
+logiPat-copyright pi_logipat.txt /*logiPat-copyright*
+logiPat-examples pi_logipat.txt /*logiPat-examples*
+logiPat-history pi_logipat.txt /*logiPat-history*
+logiPat-input pi_logipat.txt /*logiPat-input*
+logiPat-man pi_logipat.txt /*logiPat-man*
+logiPat-manual pi_logipat.txt /*logiPat-manual*
+logiPat-operators pi_logipat.txt /*logiPat-operators*
+logiPat-pattern pi_logipat.txt /*logiPat-pattern*
+long-lines version5.txt /*long-lines*
+love intro.txt /*love*
+lowercase change.txt /*lowercase*
+lpc.vim syntax.txt /*lpc.vim*
+lua if_lua.txt /*lua*
+lua-blob if_lua.txt /*lua-blob*
+lua-buffer if_lua.txt /*lua-buffer*
+lua-commands if_lua.txt /*lua-commands*
+lua-dict if_lua.txt /*lua-dict*
+lua-dynamic if_lua.txt /*lua-dynamic*
+lua-eval if_lua.txt /*lua-eval*
+lua-funcref if_lua.txt /*lua-funcref*
+lua-list if_lua.txt /*lua-list*
+lua-luaeval if_lua.txt /*lua-luaeval*
+lua-vim if_lua.txt /*lua-vim*
+lua-vim-variables if_lua.txt /*lua-vim-variables*
+lua-window if_lua.txt /*lua-window*
+lua.vim syntax.txt /*lua.vim*
+luaeval() builtin.txt /*luaeval()*
+m motion.txt /*m*
+m' motion.txt /*m'*
+m< motion.txt /*m<*
+m> motion.txt /*m>*
+m[ motion.txt /*m[*
+m] motion.txt /*m]*
+m` motion.txt /*m`*
+mac os_mac.txt /*mac*
+mac-bug os_mac.txt /*mac-bug*
+mac-compile os_mac.txt /*mac-compile*
+mac-darwin-feature os_mac.txt /*mac-darwin-feature*
+mac-faq os_mac.txt /*mac-faq*
+mac-filename os_mac.txt /*mac-filename*
+mac-lack os_mac.txt /*mac-lack*
+mac-standard-mappings os_mac.txt /*mac-standard-mappings*
+mac-vimfile os_mac.txt /*mac-vimfile*
+macintosh os_mac.txt /*macintosh*
+macro map.txt /*macro*
+mail-list intro.txt /*mail-list*
+mail.vim syntax.txt /*mail.vim*
+maillist intro.txt /*maillist*
+maillist-archive intro.txt /*maillist-archive*
+make.vim syntax.txt /*make.vim*
+man.vim filetype.txt /*man.vim*
+manpager.vim filetype.txt /*manpager.vim*
+manual-copyright usr_01.txt /*manual-copyright*
+map() builtin.txt /*map()*
+map-<SID> map.txt /*map-<SID>*
+map-CTRL-C map.txt /*map-CTRL-C*
+map-ambiguous map.txt /*map-ambiguous*
+map-backslash map.txt /*map-backslash*
+map-backtick tips.txt /*map-backtick*
+map-bar map.txt /*map-bar*
+map-comments map.txt /*map-comments*
+map-empty-rhs map.txt /*map-empty-rhs*
+map-error map.txt /*map-error*
+map-examples map.txt /*map-examples*
+map-keys-fails map.txt /*map-keys-fails*
+map-listing map.txt /*map-listing*
+map-modes map.txt /*map-modes*
+map-multibyte map.txt /*map-multibyte*
+map-overview map.txt /*map-overview*
+map-precedence map.txt /*map-precedence*
+map-return map.txt /*map-return*
+map-self-destroy tips.txt /*map-self-destroy*
+map-space_in_lhs map.txt /*map-space_in_lhs*
+map-space_in_rhs map.txt /*map-space_in_rhs*
+map-table map.txt /*map-table*
+map-trailing-white map.txt /*map-trailing-white*
+map-typing map.txt /*map-typing*
+map-which-keys map.txt /*map-which-keys*
+map.txt map.txt /*map.txt*
+map_CTRL-C map.txt /*map_CTRL-C*
+map_backslash map.txt /*map_backslash*
+map_bar map.txt /*map_bar*
+map_empty_rhs map.txt /*map_empty_rhs*
+map_return map.txt /*map_return*
+map_space_in_lhs map.txt /*map_space_in_lhs*
+map_space_in_rhs map.txt /*map_space_in_rhs*
+maparg() builtin.txt /*maparg()*
+mapcheck() builtin.txt /*mapcheck()*
+maple.vim syntax.txt /*maple.vim*
+mapleader map.txt /*mapleader*
+maplist() builtin.txt /*maplist()*
+maplocalleader map.txt /*maplocalleader*
+mapmode-c map.txt /*mapmode-c*
+mapmode-i map.txt /*mapmode-i*
+mapmode-ic map.txt /*mapmode-ic*
+mapmode-l map.txt /*mapmode-l*
+mapmode-n map.txt /*mapmode-n*
+mapmode-nvo map.txt /*mapmode-nvo*
+mapmode-o map.txt /*mapmode-o*
+mapmode-s map.txt /*mapmode-s*
+mapmode-t map.txt /*mapmode-t*
+mapmode-v map.txt /*mapmode-v*
+mapmode-x map.txt /*mapmode-x*
+mapnew() builtin.txt /*mapnew()*
+mapping map.txt /*mapping*
+mapping-dict builtin.txt /*mapping-dict*
+mapping-functions usr_41.txt /*mapping-functions*
+mapset() builtin.txt /*mapset()*
+mark motion.txt /*mark*
+mark-functions usr_41.txt /*mark-functions*
+mark-motions motion.txt /*mark-motions*
+markfilelist pi_netrw.txt /*markfilelist*
+masm.vim syntax.txt /*masm.vim*
+match() builtin.txt /*match()*
+match-highlight pattern.txt /*match-highlight*
+match-parens tips.txt /*match-parens*
+matchadd() builtin.txt /*matchadd()*
+matchaddpos() builtin.txt /*matchaddpos()*
+matcharg() builtin.txt /*matcharg()*
+matchdelete() builtin.txt /*matchdelete()*
+matchend() builtin.txt /*matchend()*
+matchfuzzy() builtin.txt /*matchfuzzy()*
+matchfuzzypos() builtin.txt /*matchfuzzypos()*
+matchit-install usr_05.txt /*matchit-install*
+matchlist() builtin.txt /*matchlist()*
+matchparen pi_paren.txt /*matchparen*
+matchstr() builtin.txt /*matchstr()*
+matchstrpos() builtin.txt /*matchstrpos()*
+matlab-indent indent.txt /*matlab-indent*
+matlab-indenting indent.txt /*matlab-indenting*
+max() builtin.txt /*max()*
+maxcol-variable eval.txt /*maxcol-variable*
+mbyte-IME mbyte.txt /*mbyte-IME*
+mbyte-XIM mbyte.txt /*mbyte-XIM*
+mbyte-combining mbyte.txt /*mbyte-combining*
+mbyte-composing mbyte.txt /*mbyte-composing*
+mbyte-conversion mbyte.txt /*mbyte-conversion*
+mbyte-encoding mbyte.txt /*mbyte-encoding*
+mbyte-first mbyte.txt /*mbyte-first*
+mbyte-fonts-MSwin mbyte.txt /*mbyte-fonts-MSwin*
+mbyte-fonts-X11 mbyte.txt /*mbyte-fonts-X11*
+mbyte-func mbyte.txt /*mbyte-func*
+mbyte-keymap mbyte.txt /*mbyte-keymap*
+mbyte-locale mbyte.txt /*mbyte-locale*
+mbyte-options mbyte.txt /*mbyte-options*
+mbyte-terminal mbyte.txt /*mbyte-terminal*
+mbyte-utf8 mbyte.txt /*mbyte-utf8*
+mbyte.txt mbyte.txt /*mbyte.txt*
+menu-changes-5.4 version5.txt /*menu-changes-5.4*
+menu-examples gui.txt /*menu-examples*
+menu-priority gui.txt /*menu-priority*
+menu-separator gui.txt /*menu-separator*
+menu-shortcut gui.txt /*menu-shortcut*
+menu-text gui.txt /*menu-text*
+menu-tips gui.txt /*menu-tips*
+menu.vim gui.txt /*menu.vim*
+menu_info() builtin.txt /*menu_info()*
+menus gui.txt /*menus*
+merge diff.txt /*merge*
+message-history message.txt /*message-history*
+message.txt message.txt /*message.txt*
+messages message.txt /*messages*
+meta intro.txt /*meta*
+method eval.txt /*method*
+mf.vim ft_mp.txt /*mf.vim*
+min() builtin.txt /*min()*
+missing-options vi_diff.txt /*missing-options*
+mkdir() builtin.txt /*mkdir()*
+mlang.txt mlang.txt /*mlang.txt*
+mma.vim syntax.txt /*mma.vim*
+mode() builtin.txt /*mode()*
+mode-Ex intro.txt /*mode-Ex*
+mode-cmdline cmdline.txt /*mode-cmdline*
+mode-ins-repl insert.txt /*mode-ins-repl*
+mode-replace insert.txt /*mode-replace*
+mode-switching intro.txt /*mode-switching*
+modeless-and-clipboard version6.txt /*modeless-and-clipboard*
+modeless-selection gui.txt /*modeless-selection*
+modeline options.txt /*modeline*
+modeline-local options.txt /*modeline-local*
+modeline-version options.txt /*modeline-version*
+modifyOtherKeys map.txt /*modifyOtherKeys*
+moo.vim syntax.txt /*moo.vim*
+more-compatible version5.txt /*more-compatible*
+more-prompt message.txt /*more-prompt*
+more-variables eval.txt /*more-variables*
+motif-intellimouse gui.txt /*motif-intellimouse*
+motion-count-multiplied motion.txt /*motion-count-multiplied*
+motion.txt motion.txt /*motion.txt*
+mouse-mode-table term.txt /*mouse-mode-table*
+mouse-overview term.txt /*mouse-overview*
+mouse-reporting term.txt /*mouse-reporting*
+mouse-scrolling-off scroll.txt /*mouse-scrolling-off*
+mouse-swap-buttons term.txt /*mouse-swap-buttons*
+mouse-using term.txt /*mouse-using*
+mouse_col-variable eval.txt /*mouse_col-variable*
+mouse_lnum-variable eval.txt /*mouse_lnum-variable*
+mouse_win-variable eval.txt /*mouse_win-variable*
+mouse_winid-variable eval.txt /*mouse_winid-variable*
+movement intro.txt /*movement*
+mp.vim ft_mp.txt /*mp.vim*
+ms-dos os_msdos.txt /*ms-dos*
+msdos os_msdos.txt /*msdos*
+msql.vim syntax.txt /*msql.vim*
+mswin.vim gui_w32.txt /*mswin.vim*
+multi-byte mbyte.txt /*multi-byte*
+multi-lang mlang.txt /*multi-lang*
+multi-repeat repeat.txt /*multi-repeat*
+multibyte mbyte.txt /*multibyte*
+multibyte-ime mbyte.txt /*multibyte-ime*
+multibyte-input mbyte.txt /*multibyte-input*
+multilang mlang.txt /*multilang*
+multilang-menus mlang.txt /*multilang-menus*
+multilang-messages mlang.txt /*multilang-messages*
+multilang-scripts mlang.txt /*multilang-scripts*
+myfiletypefile syntax.txt /*myfiletypefile*
+myscriptsfile syntax.txt /*myscriptsfile*
+mysql ft_sql.txt /*mysql*
+mysyntaxfile syntax.txt /*mysyntaxfile*
+mysyntaxfile-add syntax.txt /*mysyntaxfile-add*
+mysyntaxfile-replace syntax.txt /*mysyntaxfile-replace*
+mzeval() builtin.txt /*mzeval()*
+mzscheme if_mzsch.txt /*mzscheme*
+mzscheme-buffer if_mzsch.txt /*mzscheme-buffer*
+mzscheme-commands if_mzsch.txt /*mzscheme-commands*
+mzscheme-dynamic if_mzsch.txt /*mzscheme-dynamic*
+mzscheme-examples if_mzsch.txt /*mzscheme-examples*
+mzscheme-funcref if_mzsch.txt /*mzscheme-funcref*
+mzscheme-mzeval if_mzsch.txt /*mzscheme-mzeval*
+mzscheme-sandbox if_mzsch.txt /*mzscheme-sandbox*
+mzscheme-setup if_mzsch.txt /*mzscheme-setup*
+mzscheme-threads if_mzsch.txt /*mzscheme-threads*
+mzscheme-vim if_mzsch.txt /*mzscheme-vim*
+mzscheme-vimext if_mzsch.txt /*mzscheme-vimext*
+mzscheme-window if_mzsch.txt /*mzscheme-window*
+n pattern.txt /*n*
+n1ql.vim syntax.txt /*n1ql.vim*
+nasm.vim syntax.txt /*nasm.vim*
+navigation motion.txt /*navigation*
+nb-commands netbeans.txt /*nb-commands*
+nb-events netbeans.txt /*nb-events*
+nb-functions netbeans.txt /*nb-functions*
+nb-messages netbeans.txt /*nb-messages*
+nb-protocol_errors netbeans.txt /*nb-protocol_errors*
+nb-special netbeans.txt /*nb-special*
+nb-terms netbeans.txt /*nb-terms*
+ncf.vim syntax.txt /*ncf.vim*
+netbeans netbeans.txt /*netbeans*
+netbeans-commands netbeans.txt /*netbeans-commands*
+netbeans-configure netbeans.txt /*netbeans-configure*
+netbeans-debugging netbeans.txt /*netbeans-debugging*
+netbeans-download netbeans.txt /*netbeans-download*
+netbeans-integration netbeans.txt /*netbeans-integration*
+netbeans-intro netbeans.txt /*netbeans-intro*
+netbeans-keybindings netbeans.txt /*netbeans-keybindings*
+netbeans-messages netbeans.txt /*netbeans-messages*
+netbeans-parameters netbeans.txt /*netbeans-parameters*
+netbeans-preparation netbeans.txt /*netbeans-preparation*
+netbeans-problems netbeans.txt /*netbeans-problems*
+netbeans-protocol netbeans.txt /*netbeans-protocol*
+netbeans-run netbeans.txt /*netbeans-run*
+netbeans-setup netbeans.txt /*netbeans-setup*
+netbeans-support netbeans.txt /*netbeans-support*
+netbeans-xpm netbeans.txt /*netbeans-xpm*
+netbeans.txt netbeans.txt /*netbeans.txt*
+netreadfixup pi_netrw.txt /*netreadfixup*
+netrw pi_netrw.txt /*netrw*
+netrw-% pi_netrw.txt /*netrw-%*
+netrw-- pi_netrw.txt /*netrw--*
+netrw-:Explore pi_netrw.txt /*netrw-:Explore*
+netrw-:Hexplore pi_netrw.txt /*netrw-:Hexplore*
+netrw-:Lexplore pi_netrw.txt /*netrw-:Lexplore*
+netrw-:MF pi_netrw.txt /*netrw-:MF*
+netrw-:MT pi_netrw.txt /*netrw-:MT*
+netrw-:NetrwC pi_netrw.txt /*netrw-:NetrwC*
+netrw-:NetrwMB pi_netrw.txt /*netrw-:NetrwMB*
+netrw-:Rexplore pi_netrw.txt /*netrw-:Rexplore*
+netrw-:Sexplore pi_netrw.txt /*netrw-:Sexplore*
+netrw-:Texplore pi_netrw.txt /*netrw-:Texplore*
+netrw-:Vexplore pi_netrw.txt /*netrw-:Vexplore*
+netrw-C pi_netrw.txt /*netrw-C*
+netrw-D pi_netrw.txt /*netrw-D*
+netrw-I pi_netrw.txt /*netrw-I*
+netrw-O pi_netrw.txt /*netrw-O*
+netrw-P pi_netrw.txt /*netrw-P*
+netrw-P18 pi_netrw.txt /*netrw-P18*
+netrw-P19 pi_netrw.txt /*netrw-P19*
+netrw-P20 pi_netrw.txt /*netrw-P20*
+netrw-P21 pi_netrw.txt /*netrw-P21*
+netrw-P22 pi_netrw.txt /*netrw-P22*
+netrw-R pi_netrw.txt /*netrw-R*
+netrw-S pi_netrw.txt /*netrw-S*
+netrw-Tb pi_netrw.txt /*netrw-Tb*
+netrw-Th pi_netrw.txt /*netrw-Th*
+netrw-U pi_netrw.txt /*netrw-U*
+netrw-X pi_netrw.txt /*netrw-X*
+netrw-a pi_netrw.txt /*netrw-a*
+netrw-activate pi_netrw.txt /*netrw-activate*
+netrw-bookmark pi_netrw.txt /*netrw-bookmark*
+netrw-bookmarks pi_netrw.txt /*netrw-bookmarks*
+netrw-browse pi_netrw.txt /*netrw-browse*
+netrw-browse-cmds pi_netrw.txt /*netrw-browse-cmds*
+netrw-browse-maps pi_netrw.txt /*netrw-browse-maps*
+netrw-browser pi_netrw.txt /*netrw-browser*
+netrw-browser-options pi_netrw.txt /*netrw-browser-options*
+netrw-browser-settings pi_netrw.txt /*netrw-browser-settings*
+netrw-browser-var pi_netrw.txt /*netrw-browser-var*
+netrw-browsing pi_netrw.txt /*netrw-browsing*
+netrw-c-tab pi_netrw.txt /*netrw-c-tab*
+netrw-cB pi_netrw.txt /*netrw-cB*
+netrw-cadaver pi_netrw.txt /*netrw-cadaver*
+netrw-call pi_netrw.txt /*netrw-call*
+netrw-cb pi_netrw.txt /*netrw-cb*
+netrw-cd pi_netrw.txt /*netrw-cd*
+netrw-chgup pi_netrw.txt /*netrw-chgup*
+netrw-clean pi_netrw.txt /*netrw-clean*
+netrw-contents pi_netrw.txt /*netrw-contents*
+netrw-copyright pi_netrw.txt /*netrw-copyright*
+netrw-cr pi_netrw.txt /*netrw-cr*
+netrw-createfile pi_netrw.txt /*netrw-createfile*
+netrw-credits pi_netrw.txt /*netrw-credits*
+netrw-ctrl-h pi_netrw.txt /*netrw-ctrl-h*
+netrw-ctrl-l pi_netrw.txt /*netrw-ctrl-l*
+netrw-ctrl-r pi_netrw.txt /*netrw-ctrl-r*
+netrw-ctrl_l pi_netrw.txt /*netrw-ctrl_l*
+netrw-curdir pi_netrw.txt /*netrw-curdir*
+netrw-d pi_netrw.txt /*netrw-d*
+netrw-debug pi_netrw.txt /*netrw-debug*
+netrw-del pi_netrw.txt /*netrw-del*
+netrw-delete pi_netrw.txt /*netrw-delete*
+netrw-dir pi_netrw.txt /*netrw-dir*
+netrw-dirlist pi_netrw.txt /*netrw-dirlist*
+netrw-downdir pi_netrw.txt /*netrw-downdir*
+netrw-edithide pi_netrw.txt /*netrw-edithide*
+netrw-editwindow pi_netrw.txt /*netrw-editwindow*
+netrw-enter pi_netrw.txt /*netrw-enter*
+netrw-ex pi_netrw.txt /*netrw-ex*
+netrw-explore pi_netrw.txt /*netrw-explore*
+netrw-explore-cmds pi_netrw.txt /*netrw-explore-cmds*
+netrw-expose pi_netrw.txt /*netrw-expose*
+netrw-externapp pi_netrw.txt /*netrw-externapp*
+netrw-file pi_netrw.txt /*netrw-file*
+netrw-filigree pi_netrw.txt /*netrw-filigree*
+netrw-fixup pi_netrw.txt /*netrw-fixup*
+netrw-ftp pi_netrw.txt /*netrw-ftp*
+netrw-ftype pi_netrw.txt /*netrw-ftype*
+netrw-gb pi_netrw.txt /*netrw-gb*
+netrw-gd pi_netrw.txt /*netrw-gd*
+netrw-getftype pi_netrw.txt /*netrw-getftype*
+netrw-gf pi_netrw.txt /*netrw-gf*
+netrw-gh pi_netrw.txt /*netrw-gh*
+netrw-gitignore pi_netrw.txt /*netrw-gitignore*
+netrw-gn pi_netrw.txt /*netrw-gn*
+netrw-gp pi_netrw.txt /*netrw-gp*
+netrw-grep pi_netrw.txt /*netrw-grep*
+netrw-gx pi_netrw.txt /*netrw-gx*
+netrw-handler pi_netrw.txt /*netrw-handler*
+netrw-help pi_netrw.txt /*netrw-help*
+netrw-hexplore pi_netrw.txt /*netrw-hexplore*
+netrw-hide pi_netrw.txt /*netrw-hide*
+netrw-hiding pi_netrw.txt /*netrw-hiding*
+netrw-history pi_netrw.txt /*netrw-history*
+netrw-horiz pi_netrw.txt /*netrw-horiz*
+netrw-i pi_netrw.txt /*netrw-i*
+netrw-incompatible pi_netrw.txt /*netrw-incompatible*
+netrw-internal-variables pi_netrw.txt /*netrw-internal-variables*
+netrw-intro-browse pi_netrw.txt /*netrw-intro-browse*
+netrw-leftmouse pi_netrw.txt /*netrw-leftmouse*
+netrw-lexplore pi_netrw.txt /*netrw-lexplore*
+netrw-list pi_netrw.txt /*netrw-list*
+netrw-listbookmark pi_netrw.txt /*netrw-listbookmark*
+netrw-listhack pi_netrw.txt /*netrw-listhack*
+netrw-login pi_netrw.txt /*netrw-login*
+netrw-mA pi_netrw.txt /*netrw-mA*
+netrw-mB pi_netrw.txt /*netrw-mB*
+netrw-mF pi_netrw.txt /*netrw-mF*
+netrw-mT pi_netrw.txt /*netrw-mT*
+netrw-mX pi_netrw.txt /*netrw-mX*
+netrw-ma pi_netrw.txt /*netrw-ma*
+netrw-mb pi_netrw.txt /*netrw-mb*
+netrw-mc pi_netrw.txt /*netrw-mc*
+netrw-md pi_netrw.txt /*netrw-md*
+netrw-me pi_netrw.txt /*netrw-me*
+netrw-mf pi_netrw.txt /*netrw-mf*
+netrw-mg pi_netrw.txt /*netrw-mg*
+netrw-mh pi_netrw.txt /*netrw-mh*
+netrw-middlemouse pi_netrw.txt /*netrw-middlemouse*
+netrw-ml_get pi_netrw.txt /*netrw-ml_get*
+netrw-mm pi_netrw.txt /*netrw-mm*
+netrw-modify pi_netrw.txt /*netrw-modify*
+netrw-mouse pi_netrw.txt /*netrw-mouse*
+netrw-move pi_netrw.txt /*netrw-move*
+netrw-mp pi_netrw.txt /*netrw-mp*
+netrw-mr pi_netrw.txt /*netrw-mr*
+netrw-ms pi_netrw.txt /*netrw-ms*
+netrw-mt pi_netrw.txt /*netrw-mt*
+netrw-mu pi_netrw.txt /*netrw-mu*
+netrw-mv pi_netrw.txt /*netrw-mv*
+netrw-mx pi_netrw.txt /*netrw-mx*
+netrw-mz pi_netrw.txt /*netrw-mz*
+netrw-netrc pi_netrw.txt /*netrw-netrc*
+netrw-newfile pi_netrw.txt /*netrw-newfile*
+netrw-nexplore pi_netrw.txt /*netrw-nexplore*
+netrw-noload pi_netrw.txt /*netrw-noload*
+netrw-nread pi_netrw.txt /*netrw-nread*
+netrw-ntree pi_netrw.txt /*netrw-ntree*
+netrw-nwrite pi_netrw.txt /*netrw-nwrite*
+netrw-o pi_netrw.txt /*netrw-o*
+netrw-obtain pi_netrw.txt /*netrw-obtain*
+netrw-options pi_netrw.txt /*netrw-options*
+netrw-p pi_netrw.txt /*netrw-p*
+netrw-p1 pi_netrw.txt /*netrw-p1*
+netrw-p10 pi_netrw.txt /*netrw-p10*
+netrw-p11 pi_netrw.txt /*netrw-p11*
+netrw-p12 pi_netrw.txt /*netrw-p12*
+netrw-p13 pi_netrw.txt /*netrw-p13*
+netrw-p14 pi_netrw.txt /*netrw-p14*
+netrw-p15 pi_netrw.txt /*netrw-p15*
+netrw-p16 pi_netrw.txt /*netrw-p16*
+netrw-p17 pi_netrw.txt /*netrw-p17*
+netrw-p2 pi_netrw.txt /*netrw-p2*
+netrw-p3 pi_netrw.txt /*netrw-p3*
+netrw-p4 pi_netrw.txt /*netrw-p4*
+netrw-p5 pi_netrw.txt /*netrw-p5*
+netrw-p6 pi_netrw.txt /*netrw-p6*
+netrw-p7 pi_netrw.txt /*netrw-p7*
+netrw-p8 pi_netrw.txt /*netrw-p8*
+netrw-p9 pi_netrw.txt /*netrw-p9*
+netrw-passwd pi_netrw.txt /*netrw-passwd*
+netrw-password pi_netrw.txt /*netrw-password*
+netrw-path pi_netrw.txt /*netrw-path*
+netrw-pexplore pi_netrw.txt /*netrw-pexplore*
+netrw-preview pi_netrw.txt /*netrw-preview*
+netrw-problems pi_netrw.txt /*netrw-problems*
+netrw-protocol pi_netrw.txt /*netrw-protocol*
+netrw-prvwin pi_netrw.txt /*netrw-prvwin*
+netrw-pscp pi_netrw.txt /*netrw-pscp*
+netrw-psftp pi_netrw.txt /*netrw-psftp*
+netrw-putty pi_netrw.txt /*netrw-putty*
+netrw-qF pi_netrw.txt /*netrw-qF*
+netrw-qL pi_netrw.txt /*netrw-qL*
+netrw-qb pi_netrw.txt /*netrw-qb*
+netrw-qf pi_netrw.txt /*netrw-qf*
+netrw-quickcom pi_netrw.txt /*netrw-quickcom*
+netrw-quickcoms pi_netrw.txt /*netrw-quickcoms*
+netrw-quickhelp pi_netrw.txt /*netrw-quickhelp*
+netrw-quickmap pi_netrw.txt /*netrw-quickmap*
+netrw-quickmaps pi_netrw.txt /*netrw-quickmaps*
+netrw-r pi_netrw.txt /*netrw-r*
+netrw-read pi_netrw.txt /*netrw-read*
+netrw-ref pi_netrw.txt /*netrw-ref*
+netrw-refresh pi_netrw.txt /*netrw-refresh*
+netrw-rename pi_netrw.txt /*netrw-rename*
+netrw-reverse pi_netrw.txt /*netrw-reverse*
+netrw-rexplore pi_netrw.txt /*netrw-rexplore*
+netrw-rightmouse pi_netrw.txt /*netrw-rightmouse*
+netrw-s pi_netrw.txt /*netrw-s*
+netrw-s-cr pi_netrw.txt /*netrw-s-cr*
+netrw-settings pi_netrw.txt /*netrw-settings*
+netrw-settings-window pi_netrw.txt /*netrw-settings-window*
+netrw-sexplore pi_netrw.txt /*netrw-sexplore*
+netrw-sort pi_netrw.txt /*netrw-sort*
+netrw-sort-sequence pi_netrw.txt /*netrw-sort-sequence*
+netrw-sortsequence pi_netrw.txt /*netrw-sortsequence*
+netrw-source pi_netrw.txt /*netrw-source*
+netrw-ssh-hack pi_netrw.txt /*netrw-ssh-hack*
+netrw-star pi_netrw.txt /*netrw-star*
+netrw-starpat pi_netrw.txt /*netrw-starpat*
+netrw-starstar pi_netrw.txt /*netrw-starstar*
+netrw-starstarpat pi_netrw.txt /*netrw-starstarpat*
+netrw-start pi_netrw.txt /*netrw-start*
+netrw-t pi_netrw.txt /*netrw-t*
+netrw-texplore pi_netrw.txt /*netrw-texplore*
+netrw-todo pi_netrw.txt /*netrw-todo*
+netrw-trailingslash pi_netrw.txt /*netrw-trailingslash*
+netrw-transparent pi_netrw.txt /*netrw-transparent*
+netrw-u pi_netrw.txt /*netrw-u*
+netrw-updir pi_netrw.txt /*netrw-updir*
+netrw-urls pi_netrw.txt /*netrw-urls*
+netrw-usermaps pi_netrw.txt /*netrw-usermaps*
+netrw-userpass pi_netrw.txt /*netrw-userpass*
+netrw-v pi_netrw.txt /*netrw-v*
+netrw-var pi_netrw.txt /*netrw-var*
+netrw-variables pi_netrw.txt /*netrw-variables*
+netrw-vexplore pi_netrw.txt /*netrw-vexplore*
+netrw-windows-netrc pi_netrw.txt /*netrw-windows-netrc*
+netrw-windows-s pi_netrw.txt /*netrw-windows-s*
+netrw-write pi_netrw.txt /*netrw-write*
+netrw-x pi_netrw.txt /*netrw-x*
+netrw-xfer pi_netrw.txt /*netrw-xfer*
+netrw.vim pi_netrw.txt /*netrw.vim*
+netrw_filehandler pi_netrw.txt /*netrw_filehandler*
+netterm-mouse options.txt /*netterm-mouse*
+network pi_netrw.txt /*network*
+new-5 version5.txt /*new-5*
+new-6 version6.txt /*new-6*
+new-7 version7.txt /*new-7*
+new-8 version8.txt /*new-8*
+new-9 version9.txt /*new-9*
+new-GTK-GUI version5.txt /*new-GTK-GUI*
+new-MzScheme version7.txt /*new-MzScheme*
+new-Select-mode version5.txt /*new-Select-mode*
+new-View version6.txt /*new-View*
+new-argument-list version6.txt /*new-argument-list*
+new-buftype version6.txt /*new-buftype*
+new-cmdwin version6.txt /*new-cmdwin*
+new-color-schemes version6.txt /*new-color-schemes*
+new-colorschemes-9 version9.txt /*new-colorschemes-9*
+new-commands version5.txt /*new-commands*
+new-commands-5.4 version5.txt /*new-commands-5.4*
+new-conceal version7.txt /*new-conceal*
+new-debug-itf version6.txt /*new-debug-itf*
+new-debug-mode version6.txt /*new-debug-mode*
+new-debug-support version7.txt /*new-debug-support*
+new-define-operator version7.txt /*new-define-operator*
+new-diff-mode version6.txt /*new-diff-mode*
+new-encryption version5.txt /*new-encryption*
+new-evim version6.txt /*new-evim*
+new-ex-commands-5.2 version5.txt /*new-ex-commands-5.2*
+new-file-browser version6.txt /*new-file-browser*
+new-file-writing version6.txt /*new-file-writing*
+new-filetype filetype.txt /*new-filetype*
+new-filetype-5.4 version5.txt /*new-filetype-5.4*
+new-filetype-plugins version6.txt /*new-filetype-plugins*
+new-filetype-scripts filetype.txt /*new-filetype-scripts*
+new-folding version6.txt /*new-folding*
+new-functions-5.2 version5.txt /*new-functions-5.2*
+new-global-values version6.txt /*new-global-values*
+new-highlighting version5.txt /*new-highlighting*
+new-indent-flex version6.txt /*new-indent-flex*
+new-items-6 version6.txt /*new-items-6*
+new-items-7 version7.txt /*new-items-7*
+new-items-8 version8.txt /*new-items-8*
+new-items-9 version9.txt /*new-items-9*
+new-line-continuation version5.txt /*new-line-continuation*
+new-location-list version7.txt /*new-location-list*
+new-lua version7.txt /*new-lua*
+new-manpage-trans version7.txt /*new-manpage-trans*
+new-map-expression version7.txt /*new-map-expression*
+new-map-select version7.txt /*new-map-select*
+new-more-encryption version7.txt /*new-more-encryption*
+new-more-highlighting version7.txt /*new-more-highlighting*
+new-more-unicode version7.txt /*new-more-unicode*
+new-multi-byte version5.txt /*new-multi-byte*
+new-multi-lang version6.txt /*new-multi-lang*
+new-multibyte version5.txt /*new-multibyte*
+new-netrw-explore version7.txt /*new-netrw-explore*
+new-network-files version6.txt /*new-network-files*
+new-omni-completion version7.txt /*new-omni-completion*
+new-onemore version7.txt /*new-onemore*
+new-operator-mod version6.txt /*new-operator-mod*
+new-options-5.2 version5.txt /*new-options-5.2*
+new-options-5.4 version5.txt /*new-options-5.4*
+new-other-8.2 version8.txt /*new-other-8.2*
+new-perl-python version5.txt /*new-perl-python*
+new-persistent-undo version7.txt /*new-persistent-undo*
+new-plugins version6.txt /*new-plugins*
+new-popup-compl version9.txt /*new-popup-compl*
+new-popup-window version8.txt /*new-popup-window*
+new-posix version7.txt /*new-posix*
+new-print-multibyte version7.txt /*new-print-multibyte*
+new-printing version6.txt /*new-printing*
+new-python3 version7.txt /*new-python3*
+new-regexp-engine version7.txt /*new-regexp-engine*
+new-runtime-dir version5.txt /*new-runtime-dir*
+new-script version5.txt /*new-script*
+new-script-5.4 version5.txt /*new-script-5.4*
+new-scroll-back version7.txt /*new-scroll-back*
+new-search-path version6.txt /*new-search-path*
+new-searchpat version6.txt /*new-searchpat*
+new-session-files version5.txt /*new-session-files*
+new-spell version7.txt /*new-spell*
+new-style-testing testing.txt /*new-style-testing*
+new-tab-pages version7.txt /*new-tab-pages*
+new-terminal-window version8.txt /*new-terminal-window*
+new-text-properties version8.txt /*new-text-properties*
+new-undo-branches version7.txt /*new-undo-branches*
+new-unlisted-buffers version6.txt /*new-unlisted-buffers*
+new-user-defined version5.txt /*new-user-defined*
+new-user-manual version6.txt /*new-user-manual*
+new-utf-8 version6.txt /*new-utf-8*
+new-vertsplit version6.txt /*new-vertsplit*
+new-vim-script version7.txt /*new-vim-script*
+new-vim-script-8 version8.txt /*new-vim-script-8*
+new-vim-script-9 version9.txt /*new-vim-script-9*
+new-vim-server version6.txt /*new-vim-server*
+new-vimgrep version7.txt /*new-vimgrep*
+new-vimscript-8.2 version8.txt /*new-vimscript-8.2*
+new-virtedit version6.txt /*new-virtedit*
+news intro.txt /*news*
+nextnonblank() builtin.txt /*nextnonblank()*
+no-eval-feature eval.txt /*no-eval-feature*
+no-type-checking eval.txt /*no-type-checking*
+no_buffers_menu gui.txt /*no_buffers_menu*
+no_mail_maps filetype.txt /*no_mail_maps*
+no_plugin_maps filetype.txt /*no_plugin_maps*
+nocombine syntax.txt /*nocombine*
+non-greedy pattern.txt /*non-greedy*
+non-zero-arg eval.txt /*non-zero-arg*
+none-function_argument userfunc.txt /*none-function_argument*
+none-variable eval.txt /*none-variable*
+normal-index index.txt /*normal-index*
+not-compatible usr_01.txt /*not-compatible*
+not-edited editing.txt /*not-edited*
+notation intro.txt /*notation*
+notepad gui_w32.txt /*notepad*
+nr2char() builtin.txt /*nr2char()*
+nroff.vim syntax.txt /*nroff.vim*
+null vim9.txt /*null*
+null-variable eval.txt /*null-variable*
+null_blob vim9.txt /*null_blob*
+null_channel vim9.txt /*null_channel*
+null_dict vim9.txt /*null_dict*
+null_function vim9.txt /*null_function*
+null_job vim9.txt /*null_job*
+null_list vim9.txt /*null_list*
+null_partial vim9.txt /*null_partial*
+null_string vim9.txt /*null_string*
+number_relativenumber options.txt /*number_relativenumber*
+numbered-function eval.txt /*numbered-function*
+numbermax-variable eval.txt /*numbermax-variable*
+numbermin-variable eval.txt /*numbermin-variable*
+numbersize-variable eval.txt /*numbersize-variable*
+o insert.txt /*o*
+o_CTRL-V motion.txt /*o_CTRL-V*
+o_V motion.txt /*o_V*
+o_v motion.txt /*o_v*
+object vim9class.txt /*object*
+object-motions motion.txt /*object-motions*
+object-select motion.txt /*object-select*
+objects index.txt /*objects*
+obtaining-exted netbeans.txt /*obtaining-exted*
+ocaml.vim syntax.txt /*ocaml.vim*
+octal eval.txt /*octal*
+octal-nrformats options.txt /*octal-nrformats*
+octal-number eval.txt /*octal-number*
+old-style-testing testing.txt /*old-style-testing*
+oldfiles-variable eval.txt /*oldfiles-variable*
+ole-activation if_ole.txt /*ole-activation*
+ole-eval if_ole.txt /*ole-eval*
+ole-gethwnd if_ole.txt /*ole-gethwnd*
+ole-interface if_ole.txt /*ole-interface*
+ole-methods if_ole.txt /*ole-methods*
+ole-normal if_ole.txt /*ole-normal*
+ole-registration if_ole.txt /*ole-registration*
+ole-sendkeys if_ole.txt /*ole-sendkeys*
+ole-setforeground if_ole.txt /*ole-setforeground*
+omap-info map.txt /*omap-info*
+omni-sql-completion ft_sql.txt /*omni-sql-completion*
+online-help helphelp.txt /*online-help*
+opening-window windows.txt /*opening-window*
+operator motion.txt /*operator*
+operator-doubled motion.txt /*operator-doubled*
+operator-pending-index index.txt /*operator-pending-index*
+operator-variable eval.txt /*operator-variable*
+option-backslash options.txt /*option-backslash*
+option-list quickref.txt /*option-list*
+option-summary options.txt /*option-summary*
+option-value-function options.txt /*option-value-function*
+option-window options.txt /*option-window*
+option_restore() todo.txt /*option_restore()*
+option_save() todo.txt /*option_save()*
+optional-function-argument userfunc.txt /*optional-function-argument*
+options options.txt /*options*
+options-changed version5.txt /*options-changed*
+options-in-terminal terminal.txt /*options-in-terminal*
+options.txt options.txt /*options.txt*
+optwin options.txt /*optwin*
+or() builtin.txt /*or()*
+oracle ft_sql.txt /*oracle*
+os2 os_os2.txt /*os2*
+os390 os_390.txt /*os390*
+os_390.txt os_390.txt /*os_390.txt*
+os_amiga.txt os_amiga.txt /*os_amiga.txt*
+os_beos.txt os_beos.txt /*os_beos.txt*
+os_dos.txt os_dos.txt /*os_dos.txt*
+os_haiku.txt os_haiku.txt /*os_haiku.txt*
+os_mac.txt os_mac.txt /*os_mac.txt*
+os_mint.txt os_mint.txt /*os_mint.txt*
+os_msdos.txt os_msdos.txt /*os_msdos.txt*
+os_os2.txt os_os2.txt /*os_os2.txt*
+os_qnx.txt os_qnx.txt /*os_qnx.txt*
+os_risc.txt os_risc.txt /*os_risc.txt*
+os_unix.txt os_unix.txt /*os_unix.txt*
+os_vms.txt os_vms.txt /*os_vms.txt*
+os_win32.txt os_win32.txt /*os_win32.txt*
+other-features vi_diff.txt /*other-features*
+out_buf channel.txt /*out_buf*
+out_cb channel.txt /*out_cb*
+out_io-buffer channel.txt /*out_io-buffer*
+out_mode channel.txt /*out_mode*
+out_modifiable channel.txt /*out_modifiable*
+out_msg channel.txt /*out_msg*
+out_name channel.txt /*out_name*
+out_timeout channel.txt /*out_timeout*
+p change.txt /*p*
+pack-add repeat.txt /*pack-add*
+package-create repeat.txt /*package-create*
+packages repeat.txt /*packages*
+packload-two-steps repeat.txt /*packload-two-steps*
+page-down intro.txt /*page-down*
+page-up intro.txt /*page-up*
+page_down intro.txt /*page_down*
+page_up intro.txt /*page_up*
+pager message.txt /*pager*
+papp.vim syntax.txt /*papp.vim*
+paragraph motion.txt /*paragraph*
+partial builtin.txt /*partial*
+pascal.vim syntax.txt /*pascal.vim*
+patches-8 version8.txt /*patches-8*
+patches-8.1 version8.txt /*patches-8.1*
+patches-8.2 version8.txt /*patches-8.2*
+patches-9 version9.txt /*patches-9*
+patches-after-8.2 version9.txt /*patches-after-8.2*
+pathshorten() builtin.txt /*pathshorten()*
+pattern pattern.txt /*pattern*
+pattern-atoms pattern.txt /*pattern-atoms*
+pattern-delimiter change.txt /*pattern-delimiter*
+pattern-multi-byte pattern.txt /*pattern-multi-byte*
+pattern-multi-items pattern.txt /*pattern-multi-items*
+pattern-multibyte pattern.txt /*pattern-multibyte*
+pattern-overview pattern.txt /*pattern-overview*
+pattern-searches pattern.txt /*pattern-searches*
+pattern.txt pattern.txt /*pattern.txt*
+patterns-composing pattern.txt /*patterns-composing*
+pdev-option print.txt /*pdev-option*
+peace intro.txt /*peace*
+penc-option print.txt /*penc-option*
+perl if_perl.txt /*perl*
+perl-Append if_perl.txt /*perl-Append*
+perl-Blob if_perl.txt /*perl-Blob*
+perl-Buffer if_perl.txt /*perl-Buffer*
+perl-Buffers if_perl.txt /*perl-Buffers*
+perl-Count if_perl.txt /*perl-Count*
+perl-Delete if_perl.txt /*perl-Delete*
+perl-DoCommand if_perl.txt /*perl-DoCommand*
+perl-Eval if_perl.txt /*perl-Eval*
+perl-Get if_perl.txt /*perl-Get*
+perl-GetCursor if_perl.txt /*perl-GetCursor*
+perl-Msg if_perl.txt /*perl-Msg*
+perl-Name if_perl.txt /*perl-Name*
+perl-Number if_perl.txt /*perl-Number*
+perl-Set if_perl.txt /*perl-Set*
+perl-SetHeight if_perl.txt /*perl-SetHeight*
+perl-SetOption if_perl.txt /*perl-SetOption*
+perl-Windows if_perl.txt /*perl-Windows*
+perl-compiling if_perl.txt /*perl-compiling*
+perl-dynamic if_perl.txt /*perl-dynamic*
+perl-editing if_perl.txt /*perl-editing*
+perl-overview if_perl.txt /*perl-overview*
+perl-patterns pattern.txt /*perl-patterns*
+perl-using if_perl.txt /*perl-using*
+perl.vim syntax.txt /*perl.vim*
+perleval() builtin.txt /*perleval()*
+persistent-undo undo.txt /*persistent-undo*
+pexpr-option print.txt /*pexpr-option*
+pfn-option print.txt /*pfn-option*
+pheader-option print.txt /*pheader-option*
+photon-fonts os_qnx.txt /*photon-fonts*
+photon-gui os_qnx.txt /*photon-gui*
+php-comment indent.txt /*php-comment*
+php-indent indent.txt /*php-indent*
+php-indenting indent.txt /*php-indenting*
+php.vim syntax.txt /*php.vim*
+php3.vim syntax.txt /*php3.vim*
+phtml.vim syntax.txt /*phtml.vim*
+pi_getscript.txt pi_getscript.txt /*pi_getscript.txt*
+pi_gzip.txt pi_gzip.txt /*pi_gzip.txt*
+pi_logipat.txt pi_logipat.txt /*pi_logipat.txt*
+pi_netrw.txt pi_netrw.txt /*pi_netrw.txt*
+pi_paren.txt pi_paren.txt /*pi_paren.txt*
+pi_spec.txt pi_spec.txt /*pi_spec.txt*
+pi_tar.txt pi_tar.txt /*pi_tar.txt*
+pi_vimball.txt pi_vimball.txt /*pi_vimball.txt*
+pi_zip.txt pi_zip.txt /*pi_zip.txt*
+pkzip options.txt /*pkzip*
+plaintex.vim syntax.txt /*plaintex.vim*
+plsql ft_sql.txt /*plsql*
+plugin usr_05.txt /*plugin*
+plugin-details filetype.txt /*plugin-details*
+plugin-filetype usr_51.txt /*plugin-filetype*
+plugin-special usr_51.txt /*plugin-special*
+plugin_name.txt helphelp.txt /*plugin_name.txt*
+pmbcs-option print.txt /*pmbcs-option*
+pmbfn-option print.txt /*pmbfn-option*
+popt-option print.txt /*popt-option*
+popup popup.txt /*popup*
+popup-buffer popup.txt /*popup-buffer*
+popup-callback popup.txt /*popup-callback*
+popup-close popup.txt /*popup-close*
+popup-examples popup.txt /*popup-examples*
+popup-filter popup.txt /*popup-filter*
+popup-filter-errors popup.txt /*popup-filter-errors*
+popup-filter-mode popup.txt /*popup-filter-mode*
+popup-function-details popup.txt /*popup-function-details*
+popup-functions popup.txt /*popup-functions*
+popup-intro popup.txt /*popup-intro*
+popup-mapping popup.txt /*popup-mapping*
+popup-mask popup.txt /*popup-mask*
+popup-menu gui.txt /*popup-menu*
+popup-menu-added version5.txt /*popup-menu-added*
+popup-position popup.txt /*popup-position*
+popup-props popup.txt /*popup-props*
+popup-scrollbar popup.txt /*popup-scrollbar*
+popup-terminal popup.txt /*popup-terminal*
+popup-textprop-pos popup.txt /*popup-textprop-pos*
+popup-usage popup.txt /*popup-usage*
+popup-window popup.txt /*popup-window*
+popup-window-functions usr_41.txt /*popup-window-functions*
+popup.txt popup.txt /*popup.txt*
+popup_atcursor() popup.txt /*popup_atcursor()*
+popup_beval() popup.txt /*popup_beval()*
+popup_beval_example popup.txt /*popup_beval_example*
+popup_clear() popup.txt /*popup_clear()*
+popup_close() popup.txt /*popup_close()*
+popup_create() popup.txt /*popup_create()*
+popup_create-arguments popup.txt /*popup_create-arguments*
+popup_dialog() popup.txt /*popup_dialog()*
+popup_dialog-example popup.txt /*popup_dialog-example*
+popup_filter_menu() popup.txt /*popup_filter_menu()*
+popup_filter_yesno() popup.txt /*popup_filter_yesno()*
+popup_findecho() popup.txt /*popup_findecho()*
+popup_findinfo() popup.txt /*popup_findinfo()*
+popup_findpreview() popup.txt /*popup_findpreview()*
+popup_getoptions() popup.txt /*popup_getoptions()*
+popup_getpos() popup.txt /*popup_getpos()*
+popup_hide() popup.txt /*popup_hide()*
+popup_list() popup.txt /*popup_list()*
+popup_locate() popup.txt /*popup_locate()*
+popup_menu() popup.txt /*popup_menu()*
+popup_menu-shortcut-example popup.txt /*popup_menu-shortcut-example*
+popup_move() popup.txt /*popup_move()*
+popup_notification() popup.txt /*popup_notification()*
+popup_setoptions() popup.txt /*popup_setoptions()*
+popup_settext() popup.txt /*popup_settext()*
+popup_show() popup.txt /*popup_show()*
+popupmenu-completion insert.txt /*popupmenu-completion*
+popupmenu-keys insert.txt /*popupmenu-keys*
+popupwin popup.txt /*popupwin*
+ports-5.2 version5.txt /*ports-5.2*
+ports-6 version6.txt /*ports-6*
+posix vi_diff.txt /*posix*
+posix-compliance vi_diff.txt /*posix-compliance*
+posix-screen-size vi_diff.txt /*posix-screen-size*
+postgresql ft_sql.txt /*postgresql*
+postscr.vim syntax.txt /*postscr.vim*
+postscript-cjk-printing print.txt /*postscript-cjk-printing*
+postscript-print-encoding print.txt /*postscript-print-encoding*
+postscript-print-trouble print.txt /*postscript-print-trouble*
+postscript-print-util print.txt /*postscript-print-util*
+postscript-printing print.txt /*postscript-printing*
+pow() builtin.txt /*pow()*
+ppwiz.vim syntax.txt /*ppwiz.vim*
+press-enter message.txt /*press-enter*
+press-return message.txt /*press-return*
+prevcount-variable eval.txt /*prevcount-variable*
+preview-popup windows.txt /*preview-popup*
+preview-window windows.txt /*preview-window*
+prevnonblank() builtin.txt /*prevnonblank()*
+print-intro print.txt /*print-intro*
+print-options print.txt /*print-options*
+print.txt print.txt /*print.txt*
+printf() builtin.txt /*printf()*
+printf-% builtin.txt /*printf-%*
+printf-B builtin.txt /*printf-B*
+printf-E builtin.txt /*printf-E*
+printf-G builtin.txt /*printf-G*
+printf-S builtin.txt /*printf-S*
+printf-X builtin.txt /*printf-X*
+printf-b builtin.txt /*printf-b*
+printf-c builtin.txt /*printf-c*
+printf-d builtin.txt /*printf-d*
+printf-e builtin.txt /*printf-e*
+printf-f builtin.txt /*printf-f*
+printf-g builtin.txt /*printf-g*
+printf-o builtin.txt /*printf-o*
+printf-s builtin.txt /*printf-s*
+printf-x builtin.txt /*printf-x*
+printing print.txt /*printing*
+printing-formfeed print.txt /*printing-formfeed*
+profile repeat.txt /*profile*
+profiling repeat.txt /*profiling*
+profiling-variable eval.txt /*profiling-variable*
+progname-variable eval.txt /*progname-variable*
+progpath-variable eval.txt /*progpath-variable*
+progress.vim syntax.txt /*progress.vim*
+prompt-buffer channel.txt /*prompt-buffer*
+prompt_getprompt() builtin.txt /*prompt_getprompt()*
+prompt_setcallback() builtin.txt /*prompt_setcallback()*
+prompt_setinterrupt() builtin.txt /*prompt_setinterrupt()*
+prompt_setprompt() builtin.txt /*prompt_setprompt()*
+promptbuffer-functions usr_41.txt /*promptbuffer-functions*
+pronounce intro.txt /*pronounce*
+prop_add() textprop.txt /*prop_add()*
+prop_add_list() textprop.txt /*prop_add_list()*
+prop_clear() textprop.txt /*prop_clear()*
+prop_find() textprop.txt /*prop_find()*
+prop_list() textprop.txt /*prop_list()*
+prop_remove() textprop.txt /*prop_remove()*
+prop_type_add() textprop.txt /*prop_type_add()*
+prop_type_change() textprop.txt /*prop_type_change()*
+prop_type_delete() textprop.txt /*prop_type_delete()*
+prop_type_get() textprop.txt /*prop_type_get()*
+prop_type_list() textprop.txt /*prop_type_list()*
+ps1-about ft_ps1.txt /*ps1-about*
+ps1-compiler ft_ps1.txt /*ps1-compiler*
+ps1-folding ft_ps1.txt /*ps1-folding*
+ps1-keyword ft_ps1.txt /*ps1-keyword*
+ps1-syntax ft_ps1.txt /*ps1-syntax*
+psql ft_sql.txt /*psql*
+ptcap.vim syntax.txt /*ptcap.vim*
+pterm-mouse options.txt /*pterm-mouse*
+pum_getpos() builtin.txt /*pum_getpos()*
+pumvisible() builtin.txt /*pumvisible()*
+put change.txt /*put*
+put-Visual-mode change.txt /*put-Visual-mode*
+py3eval() builtin.txt /*py3eval()*
+pyeval() builtin.txt /*pyeval()*
+python if_pyth.txt /*python*
+python-.locked if_pyth.txt /*python-.locked*
+python-2-and-3 if_pyth.txt /*python-2-and-3*
+python-Dictionary if_pyth.txt /*python-Dictionary*
+python-Function if_pyth.txt /*python-Function*
+python-List if_pyth.txt /*python-List*
+python-VIM_SPECIAL_PATH if_pyth.txt /*python-VIM_SPECIAL_PATH*
+python-_get_paths if_pyth.txt /*python-_get_paths*
+python-bindeval if_pyth.txt /*python-bindeval*
+python-bindeval-objects if_pyth.txt /*python-bindeval-objects*
+python-buffer if_pyth.txt /*python-buffer*
+python-buffers if_pyth.txt /*python-buffers*
+python-building if_pyth.txt /*python-building*
+python-chdir if_pyth.txt /*python-chdir*
+python-command if_pyth.txt /*python-command*
+python-commands if_pyth.txt /*python-commands*
+python-current if_pyth.txt /*python-current*
+python-dynamic if_pyth.txt /*python-dynamic*
+python-environment if_pyth.txt /*python-environment*
+python-error if_pyth.txt /*python-error*
+python-eval if_pyth.txt /*python-eval*
+python-examples if_pyth.txt /*python-examples*
+python-fchdir if_pyth.txt /*python-fchdir*
+python-find_module if_pyth.txt /*python-find_module*
+python-foreach_rtp if_pyth.txt /*python-foreach_rtp*
+python-input if_pyth.txt /*python-input*
+python-options if_pyth.txt /*python-options*
+python-output if_pyth.txt /*python-output*
+python-path_hook if_pyth.txt /*python-path_hook*
+python-pyeval if_pyth.txt /*python-pyeval*
+python-range if_pyth.txt /*python-range*
+python-special-path if_pyth.txt /*python-special-path*
+python-strwidth if_pyth.txt /*python-strwidth*
+python-tabpage if_pyth.txt /*python-tabpage*
+python-tabpages if_pyth.txt /*python-tabpages*
+python-vars if_pyth.txt /*python-vars*
+python-vim if_pyth.txt /*python-vim*
+python-vvars if_pyth.txt /*python-vvars*
+python-window if_pyth.txt /*python-window*
+python-windows if_pyth.txt /*python-windows*
+python.vim syntax.txt /*python.vim*
+python2-directory if_pyth.txt /*python2-directory*
+python3 if_pyth.txt /*python3*
+python3-directory if_pyth.txt /*python3-directory*
+python_x if_pyth.txt /*python_x*
+python_x-special-comments if_pyth.txt /*python_x-special-comments*
+pythonx if_pyth.txt /*pythonx*
+pythonx-directory if_pyth.txt /*pythonx-directory*
+pyxeval() builtin.txt /*pyxeval()*
+q repeat.txt /*q*
+q-args-example map.txt /*q-args-example*
+q/ cmdline.txt /*q\/*
+q: cmdline.txt /*q:*
+q? cmdline.txt /*q?*
+qf.vim filetype.txt /*qf.vim*
+qnx os_qnx.txt /*qnx*
+qnx-compiling os_qnx.txt /*qnx-compiling*
+qnx-general os_qnx.txt /*qnx-general*
+qnx-terminal os_qnx.txt /*qnx-terminal*
+quake.vim syntax.txt /*quake.vim*
+quickfix quickfix.txt /*quickfix*
+quickfix-6 version6.txt /*quickfix-6*
+quickfix-ID quickfix.txt /*quickfix-ID*
+quickfix-buffer quickfix.txt /*quickfix-buffer*
+quickfix-changedtick quickfix.txt /*quickfix-changedtick*
+quickfix-context quickfix.txt /*quickfix-context*
+quickfix-directory-stack quickfix.txt /*quickfix-directory-stack*
+quickfix-error-lists quickfix.txt /*quickfix-error-lists*
+quickfix-functions usr_41.txt /*quickfix-functions*
+quickfix-gcc quickfix.txt /*quickfix-gcc*
+quickfix-index quickfix.txt /*quickfix-index*
+quickfix-manx quickfix.txt /*quickfix-manx*
+quickfix-parse quickfix.txt /*quickfix-parse*
+quickfix-perl quickfix.txt /*quickfix-perl*
+quickfix-size quickfix.txt /*quickfix-size*
+quickfix-title quickfix.txt /*quickfix-title*
+quickfix-valid quickfix.txt /*quickfix-valid*
+quickfix-window quickfix.txt /*quickfix-window*
+quickfix-window-ID quickfix.txt /*quickfix-window-ID*
+quickfix-window-function quickfix.txt /*quickfix-window-function*
+quickfix.txt quickfix.txt /*quickfix.txt*
+quickref quickref.txt /*quickref*
+quickref.txt quickref.txt /*quickref.txt*
+quote change.txt /*quote*
+quote# change.txt /*quote#*
+quote% change.txt /*quote%*
+quote+ gui_x11.txt /*quote+*
+quote- change.txt /*quote-*
+quote. change.txt /*quote.*
+quote/ change.txt /*quote\/*
+quote0 change.txt /*quote0*
+quote1 change.txt /*quote1*
+quote2 change.txt /*quote2*
+quote3 change.txt /*quote3*
+quote4 change.txt /*quote4*
+quote9 change.txt /*quote9*
+quote: change.txt /*quote:*
+quote= change.txt /*quote=*
+quote_ change.txt /*quote_*
+quote_# change.txt /*quote_#*
+quote_% change.txt /*quote_%*
+quote_- change.txt /*quote_-*
+quote_. change.txt /*quote_.*
+quote_/ change.txt /*quote_\/*
+quote_: change.txt /*quote_:*
+quote_= change.txt /*quote_=*
+quote_alpha change.txt /*quote_alpha*
+quote_number change.txt /*quote_number*
+quote_quote change.txt /*quote_quote*
+quote_~ change.txt /*quote_~*
+quotea change.txt /*quotea*
+quotecommandquote intro.txt /*quotecommandquote*
+quoteplus gui_x11.txt /*quoteplus*
+quotequote change.txt /*quotequote*
+quotes quotes.txt /*quotes*
+quotes.txt quotes.txt /*quotes.txt*
+quotestar gui.txt /*quotestar*
+quote~ change.txt /*quote~*
+r change.txt /*r*
+r.vim syntax.txt /*r.vim*
+raku-unicode ft_raku.txt /*raku-unicode*
+rand() builtin.txt /*rand()*
+random builtin.txt /*random*
+range() builtin.txt /*range()*
+raw-terminal-mode term.txt /*raw-terminal-mode*
+rcp pi_netrw.txt /*rcp*
+read-in-close-cb channel.txt /*read-in-close-cb*
+read-messages insert.txt /*read-messages*
+read-only-share editing.txt /*read-only-share*
+read-stdin version5.txt /*read-stdin*
+readblob() builtin.txt /*readblob()*
+readdir() builtin.txt /*readdir()*
+readdirex() builtin.txt /*readdirex()*
+readfile() builtin.txt /*readfile()*
+readline.vim syntax.txt /*readline.vim*
+recording repeat.txt /*recording*
+recover.txt recover.txt /*recover.txt*
+recovery recover.txt /*recovery*
+recursive_mapping map.txt /*recursive_mapping*
+redo undo.txt /*redo*
+redo-register undo.txt /*redo-register*
+reduce() builtin.txt /*reduce()*
+ref intro.txt /*ref*
+reference intro.txt /*reference*
+reference_toc help.txt /*reference_toc*
+reg_executing() builtin.txt /*reg_executing()*
+reg_recording() builtin.txt /*reg_recording()*
+regexp pattern.txt /*regexp*
+regexp-changes-5.4 version5.txt /*regexp-changes-5.4*
+register sponsor.txt /*register*
+register-faq sponsor.txt /*register-faq*
+register-functions usr_41.txt /*register-functions*
+register-variable eval.txt /*register-variable*
+registers change.txt /*registers*
+rego.vim syntax.txt /*rego.vim*
+regular-expression pattern.txt /*regular-expression*
+reload editing.txt /*reload*
+reltime() builtin.txt /*reltime()*
+reltimefloat() builtin.txt /*reltimefloat()*
+reltimestr() builtin.txt /*reltimestr()*
+remote.txt remote.txt /*remote.txt*
+remote_expr() builtin.txt /*remote_expr()*
+remote_foreground() builtin.txt /*remote_foreground()*
+remote_peek() builtin.txt /*remote_peek()*
+remote_read() builtin.txt /*remote_read()*
+remote_send() builtin.txt /*remote_send()*
+remote_startserver() builtin.txt /*remote_startserver()*
+remove() builtin.txt /*remove()*
+remove-filetype filetype.txt /*remove-filetype*
+remove-option-flags options.txt /*remove-option-flags*
+rename() builtin.txt /*rename()*
+rename-files tips.txt /*rename-files*
+repeat() builtin.txt /*repeat()*
+repeat.txt repeat.txt /*repeat.txt*
+repeating repeat.txt /*repeating*
+replacing change.txt /*replacing*
+replacing-ex insert.txt /*replacing-ex*
+reselect-Visual visual.txt /*reselect-Visual*
+resolve() builtin.txt /*resolve()*
+restore-cursor usr_05.txt /*restore-cursor*
+restore-position tips.txt /*restore-position*
+restricted-mode starting.txt /*restricted-mode*
+retab-example change.txt /*retab-example*
+rethrow eval.txt /*rethrow*
+reverse() builtin.txt /*reverse()*
+rexx.vim syntax.txt /*rexx.vim*
+rgb.txt gui_w32.txt /*rgb.txt*
+rgview starting.txt /*rgview*
+rgvim starting.txt /*rgvim*
+right-justify change.txt /*right-justify*
+rileft rileft.txt /*rileft*
+rileft.txt rileft.txt /*rileft.txt*
+riscos os_risc.txt /*riscos*
+rmd.vim syntax.txt /*rmd.vim*
+rot13 change.txt /*rot13*
+round() builtin.txt /*round()*
+rrst.vim syntax.txt /*rrst.vim*
+rst.vim syntax.txt /*rst.vim*
+rsync pi_netrw.txt /*rsync*
+ruby if_ruby.txt /*ruby*
+ruby-blob if_ruby.txt /*ruby-blob*
+ruby-buffer if_ruby.txt /*ruby-buffer*
+ruby-command if_ruby.txt /*ruby-command*
+ruby-commands if_ruby.txt /*ruby-commands*
+ruby-dynamic if_ruby.txt /*ruby-dynamic*
+ruby-evaluate if_ruby.txt /*ruby-evaluate*
+ruby-globals if_ruby.txt /*ruby-globals*
+ruby-message if_ruby.txt /*ruby-message*
+ruby-rubyeval if_ruby.txt /*ruby-rubyeval*
+ruby-set_option if_ruby.txt /*ruby-set_option*
+ruby-vim if_ruby.txt /*ruby-vim*
+ruby-window if_ruby.txt /*ruby-window*
+ruby.vim syntax.txt /*ruby.vim*
+ruby_fold syntax.txt /*ruby_fold*
+ruby_foldable_groups syntax.txt /*ruby_foldable_groups*
+ruby_minlines syntax.txt /*ruby_minlines*
+ruby_no_expensive syntax.txt /*ruby_no_expensive*
+ruby_operators syntax.txt /*ruby_operators*
+ruby_space_errors syntax.txt /*ruby_space_errors*
+ruby_spellcheck_strings syntax.txt /*ruby_spellcheck_strings*
+rubyeval() builtin.txt /*rubyeval()*
+russian russian.txt /*russian*
+russian-intro russian.txt /*russian-intro*
+russian-issues russian.txt /*russian-issues*
+russian-keymap russian.txt /*russian-keymap*
+russian-l18n russian.txt /*russian-l18n*
+russian.txt russian.txt /*russian.txt*
+rust ft_rust.txt /*rust*
+rust-commands ft_rust.txt /*rust-commands*
+rust-intro ft_rust.txt /*rust-intro*
+rust-mappings ft_rust.txt /*rust-mappings*
+rust-settings ft_rust.txt /*rust-settings*
+rust_<D-R> ft_rust.txt /*rust_<D-R>*
+rust_<D-r> ft_rust.txt /*rust_<D-r>*
+rview starting.txt /*rview*
+rvim starting.txt /*rvim*
+rxvt syntax.txt /*rxvt*
+s change.txt /*s*
+s/\& change.txt /*s\/\\&*
+s/\0 change.txt /*s\/\\0*
+s/\1 change.txt /*s\/\\1*
+s/\2 change.txt /*s\/\\2*
+s/\3 change.txt /*s\/\\3*
+s/\9 change.txt /*s\/\\9*
+s/\<CR> change.txt /*s\/\\<CR>*
+s/\= change.txt /*s\/\\=*
+s/\E change.txt /*s\/\\E*
+s/\L change.txt /*s\/\\L*
+s/\U change.txt /*s\/\\U*
+s/\\ change.txt /*s\/\\\\*
+s/\b change.txt /*s\/\\b*
+s/\e change.txt /*s\/\\e*
+s/\l change.txt /*s\/\\l*
+s/\n change.txt /*s\/\\n*
+s/\r change.txt /*s\/\\r*
+s/\t change.txt /*s\/\\t*
+s/\u change.txt /*s\/\\u*
+s/\~ change.txt /*s\/\\~*
+s:netrw_passwd pi_netrw.txt /*s:netrw_passwd*
+s:var eval.txt /*s:var*
+s<CR> change.txt /*s<CR>*
+sandbox eval.txt /*sandbox*
+sandbox-option eval.txt /*sandbox-option*
+save-file editing.txt /*save-file*
+save-settings starting.txt /*save-settings*
+scheme.vim syntax.txt /*scheme.vim*
+scp pi_netrw.txt /*scp*
+scratch-buffer windows.txt /*scratch-buffer*
+screenattr() builtin.txt /*screenattr()*
+screenchar() builtin.txt /*screenchar()*
+screenchars() builtin.txt /*screenchars()*
+screencol() builtin.txt /*screencol()*
+screenpos() builtin.txt /*screenpos()*
+screenrow() builtin.txt /*screenrow()*
+screenstring() builtin.txt /*screenstring()*
+script usr_41.txt /*script*
+script-here if_perl.txt /*script-here*
+script-local map.txt /*script-local*
+script-variable eval.txt /*script-variable*
+scriptnames-dictionary eval.txt /*scriptnames-dictionary*
+scriptout-changed version4.txt /*scriptout-changed*
+scriptversion eval.txt /*scriptversion*
+scriptversion-1 eval.txt /*scriptversion-1*
+scriptversion-2 eval.txt /*scriptversion-2*
+scriptversion-3 eval.txt /*scriptversion-3*
+scriptversion-4 eval.txt /*scriptversion-4*
+scroll-binding scroll.txt /*scroll-binding*
+scroll-cursor scroll.txt /*scroll-cursor*
+scroll-down scroll.txt /*scroll-down*
+scroll-horizontal scroll.txt /*scroll-horizontal*
+scroll-insert tips.txt /*scroll-insert*
+scroll-mouse-wheel scroll.txt /*scroll-mouse-wheel*
+scroll-region term.txt /*scroll-region*
+scroll-smooth tips.txt /*scroll-smooth*
+scroll-up scroll.txt /*scroll-up*
+scroll.txt scroll.txt /*scroll.txt*
+scrollbind-quickadj scroll.txt /*scrollbind-quickadj*
+scrollbind-relative scroll.txt /*scrollbind-relative*
+scrolling scroll.txt /*scrolling*
+scrollstart-variable eval.txt /*scrollstart-variable*
+sdl.vim syntax.txt /*sdl.vim*
+search() builtin.txt /*search()*
+search()-sub-match builtin.txt /*search()-sub-match*
+search-commands pattern.txt /*search-commands*
+search-offset pattern.txt /*search-offset*
+search-pattern pattern.txt /*search-pattern*
+search-range pattern.txt /*search-range*
+search-replace change.txt /*search-replace*
+searchcount() builtin.txt /*searchcount()*
+searchdecl() builtin.txt /*searchdecl()*
+searchforward-variable eval.txt /*searchforward-variable*
+searchpair() builtin.txt /*searchpair()*
+searchpairpos() builtin.txt /*searchpairpos()*
+searchpos() builtin.txt /*searchpos()*
+section motion.txt /*section*
+sed.vim syntax.txt /*sed.vim*
+self eval.txt /*self*
+send-money sponsor.txt /*send-money*
+send-to-menu gui_w32.txt /*send-to-menu*
+sendto gui_w32.txt /*sendto*
+sentence motion.txt /*sentence*
+server-functions usr_41.txt /*server-functions*
+server2client() builtin.txt /*server2client()*
+serverlist() builtin.txt /*serverlist()*
+servername-variable eval.txt /*servername-variable*
+session-file starting.txt /*session-file*
+set-option options.txt /*set-option*
+set-spc-auto spell.txt /*set-spc-auto*
+setbufline() builtin.txt /*setbufline()*
+setbufvar() builtin.txt /*setbufvar()*
+setcellwidths() builtin.txt /*setcellwidths()*
+setcharpos() builtin.txt /*setcharpos()*
+setcharsearch() builtin.txt /*setcharsearch()*
+setcmdline() builtin.txt /*setcmdline()*
+setcmdpos() builtin.txt /*setcmdpos()*
+setcursorcharpos() builtin.txt /*setcursorcharpos()*
+setenv() builtin.txt /*setenv()*
+setfperm() builtin.txt /*setfperm()*
+setline() builtin.txt /*setline()*
+setloclist() builtin.txt /*setloclist()*
+setmatches() builtin.txt /*setmatches()*
+setpos() builtin.txt /*setpos()*
+setqflist() builtin.txt /*setqflist()*
+setqflist-action builtin.txt /*setqflist-action*
+setqflist-examples quickfix.txt /*setqflist-examples*
+setqflist-what builtin.txt /*setqflist-what*
+setreg() builtin.txt /*setreg()*
+settabvar() builtin.txt /*settabvar()*
+settabwinvar() builtin.txt /*settabwinvar()*
+settagstack() builtin.txt /*settagstack()*
+setting-guifont gui.txt /*setting-guifont*
+setting-guitablabel tabpage.txt /*setting-guitablabel*
+setting-tabline tabpage.txt /*setting-tabline*
+setuid change.txt /*setuid*
+setwinvar() builtin.txt /*setwinvar()*
+sftp pi_netrw.txt /*sftp*
+sgml.vim syntax.txt /*sgml.vim*
+sgr-mouse options.txt /*sgr-mouse*
+sh-awk syntax.txt /*sh-awk*
+sh-embed syntax.txt /*sh-embed*
+sh.vim syntax.txt /*sh.vim*
+sha256() builtin.txt /*sha256()*
+shell-window tips.txt /*shell-window*
+shell_error-variable eval.txt /*shell_error-variable*
+shellescape() builtin.txt /*shellescape()*
+shift intro.txt /*shift*
+shift-left-right change.txt /*shift-left-right*
+shiftwidth() builtin.txt /*shiftwidth()*
+shm-A options.txt /*shm-A*
+shm-C options.txt /*shm-C*
+shm-F options.txt /*shm-F*
+shm-I options.txt /*shm-I*
+shm-O options.txt /*shm-O*
+shm-S options.txt /*shm-S*
+shm-T options.txt /*shm-T*
+shm-W options.txt /*shm-W*
+shm-a options.txt /*shm-a*
+shm-c options.txt /*shm-c*
+shm-f options.txt /*shm-f*
+shm-i options.txt /*shm-i*
+shm-l options.txt /*shm-l*
+shm-m options.txt /*shm-m*
+shm-n options.txt /*shm-n*
+shm-o options.txt /*shm-o*
+shm-q options.txt /*shm-q*
+shm-r options.txt /*shm-r*
+shm-s options.txt /*shm-s*
+shm-t options.txt /*shm-t*
+shm-w options.txt /*shm-w*
+shm-x options.txt /*shm-x*
+short-name-changed version4.txt /*short-name-changed*
+showing-menus gui.txt /*showing-menus*
+sign-column sign.txt /*sign-column*
+sign-commands sign.txt /*sign-commands*
+sign-functions usr_41.txt /*sign-functions*
+sign-functions-details sign.txt /*sign-functions-details*
+sign-group sign.txt /*sign-group*
+sign-identifier sign.txt /*sign-identifier*
+sign-intro sign.txt /*sign-intro*
+sign-priority sign.txt /*sign-priority*
+sign-support sign.txt /*sign-support*
+sign.txt sign.txt /*sign.txt*
+sign_define() sign.txt /*sign_define()*
+sign_getdefined() sign.txt /*sign_getdefined()*
+sign_getplaced() sign.txt /*sign_getplaced()*
+sign_jump() sign.txt /*sign_jump()*
+sign_place() sign.txt /*sign_place()*
+sign_placelist() sign.txt /*sign_placelist()*
+sign_undefine() sign.txt /*sign_undefine()*
+sign_unplace() sign.txt /*sign_unplace()*
+sign_unplacelist() sign.txt /*sign_unplacelist()*
+signs sign.txt /*signs*
+simple-change change.txt /*simple-change*
+simplify() builtin.txt /*simplify()*
+simulated-command vi_diff.txt /*simulated-command*
+sin() builtin.txt /*sin()*
+single-repeat repeat.txt /*single-repeat*
+sinh() builtin.txt /*sinh()*
+sizeofint-variable eval.txt /*sizeofint-variable*
+sizeoflong-variable eval.txt /*sizeoflong-variable*
+sizeofpointer-variable eval.txt /*sizeofpointer-variable*
+skeleton autocmd.txt /*skeleton*
+skip_defaults_vim starting.txt /*skip_defaults_vim*
+slice eval.txt /*slice*
+slice() builtin.txt /*slice()*
+slow-fast-terminal term.txt /*slow-fast-terminal*
+slow-start starting.txt /*slow-start*
+slow-terminal term.txt /*slow-terminal*
+socket-interface channel.txt /*socket-interface*
+sort() builtin.txt /*sort()*
+sorting change.txt /*sorting*
+sound-functions usr_41.txt /*sound-functions*
+sound_clear() builtin.txt /*sound_clear()*
+sound_playevent() builtin.txt /*sound_playevent()*
+sound_playfile() builtin.txt /*sound_playfile()*
+sound_stop() builtin.txt /*sound_stop()*
+soundfold() builtin.txt /*soundfold()*
+source-vim9-script usr_52.txt /*source-vim9-script*
+space intro.txt /*space*
+spec-customizing pi_spec.txt /*spec-customizing*
+spec-how-to-use-it pi_spec.txt /*spec-how-to-use-it*
+spec-setting-a-map pi_spec.txt /*spec-setting-a-map*
+spec_chglog_format pi_spec.txt /*spec_chglog_format*
+spec_chglog_prepend pi_spec.txt /*spec_chglog_prepend*
+spec_chglog_release_info pi_spec.txt /*spec_chglog_release_info*
+special-buffers windows.txt /*special-buffers*
+specifies vim9class.txt /*specifies*
+speed-up tips.txt /*speed-up*
+spell spell.txt /*spell*
+spell-ACCENT spell.txt /*spell-ACCENT*
+spell-AUTHOR spell.txt /*spell-AUTHOR*
+spell-BAD spell.txt /*spell-BAD*
+spell-BREAK spell.txt /*spell-BREAK*
+spell-CHECKCOMPOUNDCASE spell.txt /*spell-CHECKCOMPOUNDCASE*
+spell-CHECKCOMPOUNDDUP spell.txt /*spell-CHECKCOMPOUNDDUP*
+spell-CHECKCOMPOUNDPATTERN spell.txt /*spell-CHECKCOMPOUNDPATTERN*
+spell-CHECKCOMPOUNDREP spell.txt /*spell-CHECKCOMPOUNDREP*
+spell-CHECKCOMPOUNDTRIPLE spell.txt /*spell-CHECKCOMPOUNDTRIPLE*
+spell-CHECKSHARPS spell.txt /*spell-CHECKSHARPS*
+spell-CIRCUMFIX spell.txt /*spell-CIRCUMFIX*
+spell-COMMON spell.txt /*spell-COMMON*
+spell-COMPLEXPREFIXES spell.txt /*spell-COMPLEXPREFIXES*
+spell-COMPOUND spell.txt /*spell-COMPOUND*
+spell-COMPOUNDBEGIN spell.txt /*spell-COMPOUNDBEGIN*
+spell-COMPOUNDEND spell.txt /*spell-COMPOUNDEND*
+spell-COMPOUNDFIRST spell.txt /*spell-COMPOUNDFIRST*
+spell-COMPOUNDFLAG spell.txt /*spell-COMPOUNDFLAG*
+spell-COMPOUNDFORBIDFLAG spell.txt /*spell-COMPOUNDFORBIDFLAG*
+spell-COMPOUNDLAST spell.txt /*spell-COMPOUNDLAST*
+spell-COMPOUNDMIDDLE spell.txt /*spell-COMPOUNDMIDDLE*
+spell-COMPOUNDMIN spell.txt /*spell-COMPOUNDMIN*
+spell-COMPOUNDPERMITFLAG spell.txt /*spell-COMPOUNDPERMITFLAG*
+spell-COMPOUNDROOT spell.txt /*spell-COMPOUNDROOT*
+spell-COMPOUNDRULE spell.txt /*spell-COMPOUNDRULE*
+spell-COMPOUNDRULES spell.txt /*spell-COMPOUNDRULES*
+spell-COMPOUNDSYLLABLE spell.txt /*spell-COMPOUNDSYLLABLE*
+spell-COMPOUNDSYLMAX spell.txt /*spell-COMPOUNDSYLMAX*
+spell-COMPOUNDWORDMAX spell.txt /*spell-COMPOUNDWORDMAX*
+spell-COPYRIGHT spell.txt /*spell-COPYRIGHT*
+spell-EMAIL spell.txt /*spell-EMAIL*
+spell-FLAG spell.txt /*spell-FLAG*
+spell-FOL spell.txt /*spell-FOL*
+spell-FORBIDDENWORD spell.txt /*spell-FORBIDDENWORD*
+spell-HOME spell.txt /*spell-HOME*
+spell-IGNOREEXTRA spell.txt /*spell-IGNOREEXTRA*
+spell-KEEPCASE spell.txt /*spell-KEEPCASE*
+spell-KEY spell.txt /*spell-KEY*
+spell-LANG spell.txt /*spell-LANG*
+spell-LEMMA_PRESENT spell.txt /*spell-LEMMA_PRESENT*
+spell-LOW spell.txt /*spell-LOW*
+spell-MAP spell.txt /*spell-MAP*
+spell-MAXNGRAMSUGS spell.txt /*spell-MAXNGRAMSUGS*
+spell-NAME spell.txt /*spell-NAME*
+spell-NEEDAFFIX spell.txt /*spell-NEEDAFFIX*
+spell-NEEDCOMPOUND spell.txt /*spell-NEEDCOMPOUND*
+spell-NOBREAK spell.txt /*spell-NOBREAK*
+spell-NOCOMPOUNDSUGS spell.txt /*spell-NOCOMPOUNDSUGS*
+spell-NOSPLITSUGS spell.txt /*spell-NOSPLITSUGS*
+spell-NOSUGFILE spell.txt /*spell-NOSUGFILE*
+spell-NOSUGGEST spell.txt /*spell-NOSUGGEST*
+spell-ONLYINCOMPOUND spell.txt /*spell-ONLYINCOMPOUND*
+spell-PFX spell.txt /*spell-PFX*
+spell-PFXPOSTPONE spell.txt /*spell-PFXPOSTPONE*
+spell-PSEUDOROOT spell.txt /*spell-PSEUDOROOT*
+spell-RARE spell.txt /*spell-RARE*
+spell-REP spell.txt /*spell-REP*
+spell-SAL spell.txt /*spell-SAL*
+spell-SET spell.txt /*spell-SET*
+spell-SFX spell.txt /*spell-SFX*
+spell-SLASH spell.txt /*spell-SLASH*
+spell-SOFOFROM spell.txt /*spell-SOFOFROM*
+spell-SOFOTO spell.txt /*spell-SOFOTO*
+spell-SUGSWITHDOTS spell.txt /*spell-SUGSWITHDOTS*
+spell-SYLLABLE spell.txt /*spell-SYLLABLE*
+spell-SYLLABLENUM spell.txt /*spell-SYLLABLENUM*
+spell-SpellFileMissing spell.txt /*spell-SpellFileMissing*
+spell-TRY spell.txt /*spell-TRY*
+spell-UPP spell.txt /*spell-UPP*
+spell-VERSION spell.txt /*spell-VERSION*
+spell-WORDCHARS spell.txt /*spell-WORDCHARS*
+spell-aff-format spell.txt /*spell-aff-format*
+spell-affix-chars spell.txt /*spell-affix-chars*
+spell-affix-comment spell.txt /*spell-affix-comment*
+spell-affix-flags spell.txt /*spell-affix-flags*
+spell-affix-mbyte spell.txt /*spell-affix-mbyte*
+spell-affix-not-supported spell.txt /*spell-affix-not-supported*
+spell-affix-vim spell.txt /*spell-affix-vim*
+spell-cjk spell.txt /*spell-cjk*
+spell-compound spell.txt /*spell-compound*
+spell-dic-format spell.txt /*spell-dic-format*
+spell-double-scoring spell.txt /*spell-double-scoring*
+spell-file-format spell.txt /*spell-file-format*
+spell-functions usr_41.txt /*spell-functions*
+spell-german spell.txt /*spell-german*
+spell-load spell.txt /*spell-load*
+spell-midword spell.txt /*spell-midword*
+spell-mkspell spell.txt /*spell-mkspell*
+spell-quickstart spell.txt /*spell-quickstart*
+spell-remarks spell.txt /*spell-remarks*
+spell-russian spell.txt /*spell-russian*
+spell-sug-file spell.txt /*spell-sug-file*
+spell-syntax spell.txt /*spell-syntax*
+spell-wordlist-format spell.txt /*spell-wordlist-format*
+spell-yiddish spell.txt /*spell-yiddish*
+spell.txt spell.txt /*spell.txt*
+spellbadword() builtin.txt /*spellbadword()*
+spellfile-cleanup spell.txt /*spellfile-cleanup*
+spellfile.vim spell.txt /*spellfile.vim*
+spellsuggest() builtin.txt /*spellsuggest()*
+split() builtin.txt /*split()*
+splitfind windows.txt /*splitfind*
+splitview windows.txt /*splitview*
+sponsor sponsor.txt /*sponsor*
+sponsor-faq sponsor.txt /*sponsor-faq*
+sponsor.txt sponsor.txt /*sponsor.txt*
+spoon os_unix.txt /*spoon*
+spup.vim syntax.txt /*spup.vim*
+sql-adding-dialects ft_sql.txt /*sql-adding-dialects*
+sql-completion ft_sql.txt /*sql-completion*
+sql-completion-columns ft_sql.txt /*sql-completion-columns*
+sql-completion-customization ft_sql.txt /*sql-completion-customization*
+sql-completion-dynamic ft_sql.txt /*sql-completion-dynamic*
+sql-completion-filetypes ft_sql.txt /*sql-completion-filetypes*
+sql-completion-maps ft_sql.txt /*sql-completion-maps*
+sql-completion-procedures ft_sql.txt /*sql-completion-procedures*
+sql-completion-static ft_sql.txt /*sql-completion-static*
+sql-completion-tables ft_sql.txt /*sql-completion-tables*
+sql-completion-tutorial ft_sql.txt /*sql-completion-tutorial*
+sql-completion-views ft_sql.txt /*sql-completion-views*
+sql-dialects ft_sql.txt /*sql-dialects*
+sql-macros ft_sql.txt /*sql-macros*
+sql-matchit ft_sql.txt /*sql-matchit*
+sql-navigation ft_sql.txt /*sql-navigation*
+sql-object-motions ft_sql.txt /*sql-object-motions*
+sql-predefined-objects ft_sql.txt /*sql-predefined-objects*
+sql-type-default ft_sql.txt /*sql-type-default*
+sql-types ft_sql.txt /*sql-types*
+sql.vim syntax.txt /*sql.vim*
+sqlanywhere ft_sql.txt /*sqlanywhere*
+sqlanywhere.vim syntax.txt /*sqlanywhere.vim*
+sqlgettype ft_sql.txt /*sqlgettype*
+sqlinformix.vim syntax.txt /*sqlinformix.vim*
+sqlj ft_sql.txt /*sqlj*
+sqlserver ft_sql.txt /*sqlserver*
+sqlsettype ft_sql.txt /*sqlsettype*
+sqrt() builtin.txt /*sqrt()*
+squirrel.vim syntax.txt /*squirrel.vim*
+srand() builtin.txt /*srand()*
+sscanf eval.txt /*sscanf*
+standard-plugin usr_05.txt /*standard-plugin*
+standard-plugin-list help.txt /*standard-plugin-list*
+standout syntax.txt /*standout*
+star pattern.txt /*star*
+starstar editing.txt /*starstar*
+starstar-wildcard editing.txt /*starstar-wildcard*
+start-of-file pattern.txt /*start-of-file*
+start-vimdiff diff.txt /*start-vimdiff*
+starting starting.txt /*starting*
+starting-amiga starting.txt /*starting-amiga*
+starting.txt starting.txt /*starting.txt*
+startup starting.txt /*startup*
+startup-options starting.txt /*startup-options*
+startup-terminal term.txt /*startup-terminal*
+state() builtin.txt /*state()*
+static-tag tagsrch.txt /*static-tag*
+status-line windows.txt /*status-line*
+statusmsg-variable eval.txt /*statusmsg-variable*
+stl-%{ options.txt /*stl-%{*
+str2float() builtin.txt /*str2float()*
+str2list() builtin.txt /*str2list()*
+str2nr() builtin.txt /*str2nr()*
+strcasestr() builtin.txt /*strcasestr()*
+strcharlen() builtin.txt /*strcharlen()*
+strcharpart() builtin.txt /*strcharpart()*
+strchars() builtin.txt /*strchars()*
+strchr() builtin.txt /*strchr()*
+strcspn() builtin.txt /*strcspn()*
+strdisplaywidth() builtin.txt /*strdisplaywidth()*
+strftime() builtin.txt /*strftime()*
+strgetchar() builtin.txt /*strgetchar()*
+stridx() builtin.txt /*stridx()*
+strikethrough syntax.txt /*strikethrough*
+string eval.txt /*string*
+string() builtin.txt /*string()*
+string-functions usr_41.txt /*string-functions*
+string-match builtin.txt /*string-match*
+strlen() builtin.txt /*strlen()*
+strpart() builtin.txt /*strpart()*
+strpbrk() builtin.txt /*strpbrk()*
+strptime() builtin.txt /*strptime()*
+strrchr() builtin.txt /*strrchr()*
+strridx() builtin.txt /*strridx()*
+strspn() builtin.txt /*strspn()*
+strstr() builtin.txt /*strstr()*
+strtrans() builtin.txt /*strtrans()*
+strwidth() builtin.txt /*strwidth()*
+style-changes develop.txt /*style-changes*
+style-compiler develop.txt /*style-compiler*
+style-examples develop.txt /*style-examples*
+style-functions develop.txt /*style-functions*
+style-names develop.txt /*style-names*
+style-spaces develop.txt /*style-spaces*
+style-various develop.txt /*style-various*
+sub-menu-priority gui.txt /*sub-menu-priority*
+sub-replace-\= change.txt /*sub-replace-\\=*
+sub-replace-expression change.txt /*sub-replace-expression*
+sub-replace-special change.txt /*sub-replace-special*
+sublist eval.txt /*sublist*
+submatch() builtin.txt /*submatch()*
+subscribe-maillist intro.txt /*subscribe-maillist*
+subscript eval.txt /*subscript*
+substitute() builtin.txt /*substitute()*
+substitute-CR version6.txt /*substitute-CR*
+substring eval.txt /*substring*
+suffixes cmdline.txt /*suffixes*
+suspend starting.txt /*suspend*
+swap-exists-choices usr_11.txt /*swap-exists-choices*
+swap-file recover.txt /*swap-file*
+swapchoice-variable eval.txt /*swapchoice-variable*
+swapcommand-variable eval.txt /*swapcommand-variable*
+swapfile-changed version4.txt /*swapfile-changed*
+swapfilelist() builtin.txt /*swapfilelist()*
+swapinfo() builtin.txt /*swapinfo()*
+swapname() builtin.txt /*swapname()*
+swapname-variable eval.txt /*swapname-variable*
+sybase ft_sql.txt /*sybase*
+syn-sync-grouphere syntax.txt /*syn-sync-grouphere*
+syn-sync-groupthere syntax.txt /*syn-sync-groupthere*
+syn-sync-linecont syntax.txt /*syn-sync-linecont*
+synID() builtin.txt /*synID()*
+synIDattr() builtin.txt /*synIDattr()*
+synIDtrans() builtin.txt /*synIDtrans()*
+syncbind scroll.txt /*syncbind*
+syncolor syntax.txt /*syncolor*
+synconcealed() builtin.txt /*synconcealed()*
+synload-1 syntax.txt /*synload-1*
+synload-2 syntax.txt /*synload-2*
+synload-3 syntax.txt /*synload-3*
+synload-4 syntax.txt /*synload-4*
+synload-5 syntax.txt /*synload-5*
+synload-6 syntax.txt /*synload-6*
+synstack() builtin.txt /*synstack()*
+syntax syntax.txt /*syntax*
+syntax-functions usr_41.txt /*syntax-functions*
+syntax-highlighting syntax.txt /*syntax-highlighting*
+syntax-latex syntax.txt /*syntax-latex*
+syntax-loading syntax.txt /*syntax-loading*
+syntax-printing usr_06.txt /*syntax-printing*
+syntax-tex syntax.txt /*syntax-tex*
+syntax.txt syntax.txt /*syntax.txt*
+syntax_cmd syntax.txt /*syntax_cmd*
+sys-file-list help.txt /*sys-file-list*
+sysmouse term.txt /*sysmouse*
+system() builtin.txt /*system()*
+system-functions usr_41.txt /*system-functions*
+system-vimrc starting.txt /*system-vimrc*
+systemlist() builtin.txt /*systemlist()*
+s~ change.txt /*s~*
+t motion.txt /*t*
+t: eval.txt /*t:*
+t:var eval.txt /*t:var*
+t_#2 term.txt /*t_#2*
+t_#4 term.txt /*t_#4*
+t_%1 term.txt /*t_%1*
+t_%i term.txt /*t_%i*
+t_&8 term.txt /*t_&8*
+t_8b term.txt /*t_8b*
+t_8f term.txt /*t_8f*
+t_8u term.txt /*t_8u*
+t_@7 term.txt /*t_@7*
+t_AB term.txt /*t_AB*
+t_AF term.txt /*t_AF*
+t_AL term.txt /*t_AL*
+t_AU term.txt /*t_AU*
+t_BD term.txt /*t_BD*
+t_BE term.txt /*t_BE*
+t_CS term.txt /*t_CS*
+t_CTRL-W_. terminal.txt /*t_CTRL-W_.*
+t_CTRL-W_: terminal.txt /*t_CTRL-W_:*
+t_CTRL-W_CTRL-C terminal.txt /*t_CTRL-W_CTRL-C*
+t_CTRL-W_CTRL-W terminal.txt /*t_CTRL-W_CTRL-W*
+t_CTRL-W_N terminal.txt /*t_CTRL-W_N*
+t_CTRL-W_gT terminal.txt /*t_CTRL-W_gT*
+t_CTRL-W_gt terminal.txt /*t_CTRL-W_gt*
+t_CTRL-W_quote terminal.txt /*t_CTRL-W_quote*
+t_CTRL-\_CTRL-N terminal.txt /*t_CTRL-\\_CTRL-N*
+t_CV term.txt /*t_CV*
+t_Ce term.txt /*t_Ce*
+t_Co term.txt /*t_Co*
+t_Cs term.txt /*t_Cs*
+t_DL term.txt /*t_DL*
+t_Ds term.txt /*t_Ds*
+t_EC term.txt /*t_EC*
+t_EI term.txt /*t_EI*
+t_F1 term.txt /*t_F1*
+t_F2 term.txt /*t_F2*
+t_F3 term.txt /*t_F3*
+t_F4 term.txt /*t_F4*
+t_F5 term.txt /*t_F5*
+t_F6 term.txt /*t_F6*
+t_F7 term.txt /*t_F7*
+t_F8 term.txt /*t_F8*
+t_F9 term.txt /*t_F9*
+t_GP term.txt /*t_GP*
+t_IE term.txt /*t_IE*
+t_IS term.txt /*t_IS*
+t_K1 term.txt /*t_K1*
+t_K3 term.txt /*t_K3*
+t_K4 term.txt /*t_K4*
+t_K5 term.txt /*t_K5*
+t_K6 term.txt /*t_K6*
+t_K7 term.txt /*t_K7*
+t_K8 term.txt /*t_K8*
+t_K9 term.txt /*t_K9*
+t_KA term.txt /*t_KA*
+t_KB term.txt /*t_KB*
+t_KC term.txt /*t_KC*
+t_KD term.txt /*t_KD*
+t_KE term.txt /*t_KE*
+t_KF term.txt /*t_KF*
+t_KG term.txt /*t_KG*
+t_KH term.txt /*t_KH*
+t_KI term.txt /*t_KI*
+t_KJ term.txt /*t_KJ*
+t_KK term.txt /*t_KK*
+t_KL term.txt /*t_KL*
+t_PE term.txt /*t_PE*
+t_PS term.txt /*t_PS*
+t_RB term.txt /*t_RB*
+t_RC term.txt /*t_RC*
+t_RF term.txt /*t_RF*
+t_RI term.txt /*t_RI*
+t_RK term.txt /*t_RK*
+t_RS term.txt /*t_RS*
+t_RT term.txt /*t_RT*
+t_RV term.txt /*t_RV*
+t_Ri term.txt /*t_Ri*
+t_SC term.txt /*t_SC*
+t_SH term.txt /*t_SH*
+t_SI term.txt /*t_SI*
+t_SR term.txt /*t_SR*
+t_ST term.txt /*t_ST*
+t_Sb term.txt /*t_Sb*
+t_Sf term.txt /*t_Sf*
+t_Si term.txt /*t_Si*
+t_TE term.txt /*t_TE*
+t_TI term.txt /*t_TI*
+t_Te term.txt /*t_Te*
+t_Ts term.txt /*t_Ts*
+t_Us term.txt /*t_Us*
+t_VS term.txt /*t_VS*
+t_WP term.txt /*t_WP*
+t_WS term.txt /*t_WS*
+t_XM term.txt /*t_XM*
+t_ZH term.txt /*t_ZH*
+t_ZR term.txt /*t_ZR*
+t_al term.txt /*t_al*
+t_bc term.txt /*t_bc*
+t_blob-variable eval.txt /*t_blob-variable*
+t_bool-variable eval.txt /*t_bool-variable*
+t_cd term.txt /*t_cd*
+t_cdl version4.txt /*t_cdl*
+t_ce term.txt /*t_ce*
+t_channel-variable eval.txt /*t_channel-variable*
+t_ci version4.txt /*t_ci*
+t_cil version4.txt /*t_cil*
+t_cl term.txt /*t_cl*
+t_class-variable eval.txt /*t_class-variable*
+t_cm term.txt /*t_cm*
+t_cri version4.txt /*t_cri*
+t_cs term.txt /*t_cs*
+t_csc version4.txt /*t_csc*
+t_cv version4.txt /*t_cv*
+t_cvv version4.txt /*t_cvv*
+t_da term.txt /*t_da*
+t_db term.txt /*t_db*
+t_dict-variable eval.txt /*t_dict-variable*
+t_dl term.txt /*t_dl*
+t_ds term.txt /*t_ds*
+t_ed version4.txt /*t_ed*
+t_el version4.txt /*t_el*
+t_f1 version4.txt /*t_f1*
+t_f10 version4.txt /*t_f10*
+t_f2 version4.txt /*t_f2*
+t_f3 version4.txt /*t_f3*
+t_f4 version4.txt /*t_f4*
+t_f5 version4.txt /*t_f5*
+t_f6 version4.txt /*t_f6*
+t_f7 version4.txt /*t_f7*
+t_f8 version4.txt /*t_f8*
+t_f9 version4.txt /*t_f9*
+t_fd term.txt /*t_fd*
+t_fe term.txt /*t_fe*
+t_float-variable eval.txt /*t_float-variable*
+t_fs term.txt /*t_fs*
+t_func-variable eval.txt /*t_func-variable*
+t_help version4.txt /*t_help*
+t_il version4.txt /*t_il*
+t_job-variable eval.txt /*t_job-variable*
+t_k1 term.txt /*t_k1*
+t_k2 term.txt /*t_k2*
+t_k3 term.txt /*t_k3*
+t_k4 term.txt /*t_k4*
+t_k5 term.txt /*t_k5*
+t_k6 term.txt /*t_k6*
+t_k7 term.txt /*t_k7*
+t_k8 term.txt /*t_k8*
+t_k9 term.txt /*t_k9*
+t_k; term.txt /*t_k;*
+t_kB term.txt /*t_kB*
+t_kD term.txt /*t_kD*
+t_kI term.txt /*t_kI*
+t_kN term.txt /*t_kN*
+t_kP term.txt /*t_kP*
+t_kb term.txt /*t_kb*
+t_kd term.txt /*t_kd*
+t_ke term.txt /*t_ke*
+t_kh term.txt /*t_kh*
+t_kl term.txt /*t_kl*
+t_kr term.txt /*t_kr*
+t_ks term.txt /*t_ks*
+t_ku term.txt /*t_ku*
+t_le term.txt /*t_le*
+t_list-variable eval.txt /*t_list-variable*
+t_mb term.txt /*t_mb*
+t_md term.txt /*t_md*
+t_me term.txt /*t_me*
+t_mr term.txt /*t_mr*
+t_ms term.txt /*t_ms*
+t_nd term.txt /*t_nd*
+t_none-variable eval.txt /*t_none-variable*
+t_number-variable eval.txt /*t_number-variable*
+t_object-variable eval.txt /*t_object-variable*
+t_op term.txt /*t_op*
+t_se term.txt /*t_se*
+t_sf1 version4.txt /*t_sf1*
+t_sf10 version4.txt /*t_sf10*
+t_sf2 version4.txt /*t_sf2*
+t_sf3 version4.txt /*t_sf3*
+t_sf4 version4.txt /*t_sf4*
+t_sf5 version4.txt /*t_sf5*
+t_sf6 version4.txt /*t_sf6*
+t_sf7 version4.txt /*t_sf7*
+t_sf8 version4.txt /*t_sf8*
+t_sf9 version4.txt /*t_sf9*
+t_skd version4.txt /*t_skd*
+t_skl version4.txt /*t_skl*
+t_skr version4.txt /*t_skr*
+t_sku version4.txt /*t_sku*
+t_so term.txt /*t_so*
+t_sr term.txt /*t_sr*
+t_star7 term.txt /*t_star7*
+t_string-variable eval.txt /*t_string-variable*
+t_tb version4.txt /*t_tb*
+t_te term.txt /*t_te*
+t_ti term.txt /*t_ti*
+t_tp version4.txt /*t_tp*
+t_ts term.txt /*t_ts*
+t_ts_old version4.txt /*t_ts_old*
+t_u7 term.txt /*t_u7*
+t_ue term.txt /*t_ue*
+t_undo version4.txt /*t_undo*
+t_us term.txt /*t_us*
+t_ut term.txt /*t_ut*
+t_vb term.txt /*t_vb*
+t_ve term.txt /*t_ve*
+t_vi term.txt /*t_vi*
+t_vs term.txt /*t_vs*
+t_xn term.txt /*t_xn*
+t_xs term.txt /*t_xs*
+tab intro.txt /*tab*
+tab-page tabpage.txt /*tab-page*
+tab-page-commands tabpage.txt /*tab-page-commands*
+tab-page-intro tabpage.txt /*tab-page-intro*
+tab-page-other tabpage.txt /*tab-page-other*
+tabline-menu tabpage.txt /*tabline-menu*
+tabnew-autocmd tabpage.txt /*tabnew-autocmd*
+tabpage tabpage.txt /*tabpage*
+tabpage-variable eval.txt /*tabpage-variable*
+tabpage.txt tabpage.txt /*tabpage.txt*
+tabpagebuflist() builtin.txt /*tabpagebuflist()*
+tabpagenr() builtin.txt /*tabpagenr()*
+tabpagewinnr() builtin.txt /*tabpagewinnr()*
+tag tagsrch.txt /*tag*
+tag-! tagsrch.txt /*tag-!*
+tag-binary-search tagsrch.txt /*tag-binary-search*
+tag-blocks motion.txt /*tag-blocks*
+tag-commands tagsrch.txt /*tag-commands*
+tag-details tagsrch.txt /*tag-details*
+tag-function tagsrch.txt /*tag-function*
+tag-functions usr_41.txt /*tag-functions*
+tag-highlight syntax.txt /*tag-highlight*
+tag-matchlist tagsrch.txt /*tag-matchlist*
+tag-old-static tagsrch.txt /*tag-old-static*
+tag-overloaded version5.txt /*tag-overloaded*
+tag-preview tagsrch.txt /*tag-preview*
+tag-priority tagsrch.txt /*tag-priority*
+tag-regexp tagsrch.txt /*tag-regexp*
+tag-search tagsrch.txt /*tag-search*
+tag-security tagsrch.txt /*tag-security*
+tag-skip-file tagsrch.txt /*tag-skip-file*
+tag-stack tagsrch.txt /*tag-stack*
+tagfiles() builtin.txt /*tagfiles()*
+taglist() builtin.txt /*taglist()*
+tags tagsrch.txt /*tags*
+tags-and-searches tagsrch.txt /*tags-and-searches*
+tags-file-changed version5.txt /*tags-file-changed*
+tags-file-format tagsrch.txt /*tags-file-format*
+tags-option tagsrch.txt /*tags-option*
+tagsrch.txt tagsrch.txt /*tagsrch.txt*
+tagstack tagsrch.txt /*tagstack*
+tagstack-examples tagsrch.txt /*tagstack-examples*
+tan() builtin.txt /*tan()*
+tanh() builtin.txt /*tanh()*
+tar pi_tar.txt /*tar*
+tar-contents pi_tar.txt /*tar-contents*
+tar-copyright pi_tar.txt /*tar-copyright*
+tar-history pi_tar.txt /*tar-history*
+tar-manual pi_tar.txt /*tar-manual*
+tar-options pi_tar.txt /*tar-options*
+tar-usage pi_tar.txt /*tar-usage*
+tcl if_tcl.txt /*tcl*
+tcl-beep if_tcl.txt /*tcl-beep*
+tcl-buffer if_tcl.txt /*tcl-buffer*
+tcl-buffer-append if_tcl.txt /*tcl-buffer-append*
+tcl-buffer-cmds if_tcl.txt /*tcl-buffer-cmds*
+tcl-buffer-command if_tcl.txt /*tcl-buffer-command*
+tcl-buffer-count if_tcl.txt /*tcl-buffer-count*
+tcl-buffer-delcmd if_tcl.txt /*tcl-buffer-delcmd*
+tcl-buffer-delete if_tcl.txt /*tcl-buffer-delete*
+tcl-buffer-expr if_tcl.txt /*tcl-buffer-expr*
+tcl-buffer-get if_tcl.txt /*tcl-buffer-get*
+tcl-buffer-insert if_tcl.txt /*tcl-buffer-insert*
+tcl-buffer-last if_tcl.txt /*tcl-buffer-last*
+tcl-buffer-mark if_tcl.txt /*tcl-buffer-mark*
+tcl-buffer-option if_tcl.txt /*tcl-buffer-option*
+tcl-buffer-set if_tcl.txt /*tcl-buffer-set*
+tcl-buffer-windows if_tcl.txt /*tcl-buffer-windows*
+tcl-bugs if_tcl.txt /*tcl-bugs*
+tcl-command if_tcl.txt /*tcl-command*
+tcl-commands if_tcl.txt /*tcl-commands*
+tcl-dynamic if_tcl.txt /*tcl-dynamic*
+tcl-ex-commands if_tcl.txt /*tcl-ex-commands*
+tcl-examples if_tcl.txt /*tcl-examples*
+tcl-expr if_tcl.txt /*tcl-expr*
+tcl-linenumbers if_tcl.txt /*tcl-linenumbers*
+tcl-misc if_tcl.txt /*tcl-misc*
+tcl-option if_tcl.txt /*tcl-option*
+tcl-output if_tcl.txt /*tcl-output*
+tcl-var-current if_tcl.txt /*tcl-var-current*
+tcl-var-lbase if_tcl.txt /*tcl-var-lbase*
+tcl-var-line if_tcl.txt /*tcl-var-line*
+tcl-var-lnum if_tcl.txt /*tcl-var-lnum*
+tcl-var-range if_tcl.txt /*tcl-var-range*
+tcl-variables if_tcl.txt /*tcl-variables*
+tcl-window if_tcl.txt /*tcl-window*
+tcl-window-buffer if_tcl.txt /*tcl-window-buffer*
+tcl-window-cmds if_tcl.txt /*tcl-window-cmds*
+tcl-window-command if_tcl.txt /*tcl-window-command*
+tcl-window-cursor if_tcl.txt /*tcl-window-cursor*
+tcl-window-delcmd if_tcl.txt /*tcl-window-delcmd*
+tcl-window-expr if_tcl.txt /*tcl-window-expr*
+tcl-window-height if_tcl.txt /*tcl-window-height*
+tcl-window-option if_tcl.txt /*tcl-window-option*
+tcsh-style cmdline.txt /*tcsh-style*
+tcsh.vim syntax.txt /*tcsh.vim*
+tear-off-menus gui.txt /*tear-off-menus*
+telnet-CTRL-] tagsrch.txt /*telnet-CTRL-]*
+temp-file-name builtin.txt /*temp-file-name*
+tempfile change.txt /*tempfile*
+template autocmd.txt /*template*
+tempname() builtin.txt /*tempname()*
+term++close terminal.txt /*term++close*
+term++open terminal.txt /*term++open*
+term-dependent-settings term.txt /*term-dependent-settings*
+term-list syntax.txt /*term-list*
+term.txt term.txt /*term.txt*
+term_dumpdiff() terminal.txt /*term_dumpdiff()*
+term_dumpload() terminal.txt /*term_dumpload()*
+term_dumpwrite() terminal.txt /*term_dumpwrite()*
+term_getaltscreen() terminal.txt /*term_getaltscreen()*
+term_getansicolors() terminal.txt /*term_getansicolors()*
+term_getattr() terminal.txt /*term_getattr()*
+term_getcursor() terminal.txt /*term_getcursor()*
+term_getjob() terminal.txt /*term_getjob()*
+term_getline() terminal.txt /*term_getline()*
+term_getscrolled() terminal.txt /*term_getscrolled()*
+term_getsize() terminal.txt /*term_getsize()*
+term_getstatus() terminal.txt /*term_getstatus()*
+term_gettitle() terminal.txt /*term_gettitle()*
+term_gettty() terminal.txt /*term_gettty()*
+term_list() terminal.txt /*term_list()*
+term_scrape() terminal.txt /*term_scrape()*
+term_sendkeys() terminal.txt /*term_sendkeys()*
+term_setansicolors() terminal.txt /*term_setansicolors()*
+term_setapi() terminal.txt /*term_setapi()*
+term_setkill() terminal.txt /*term_setkill()*
+term_setrestore() terminal.txt /*term_setrestore()*
+term_setsize() terminal.txt /*term_setsize()*
+term_start() terminal.txt /*term_start()*
+term_wait() terminal.txt /*term_wait()*
+termcap term.txt /*termcap*
+termcap-changed version4.txt /*termcap-changed*
+termcap-colors term.txt /*termcap-colors*
+termcap-cursor-color term.txt /*termcap-cursor-color*
+termcap-cursor-shape term.txt /*termcap-cursor-shape*
+termcap-options term.txt /*termcap-options*
+termcap-title term.txt /*termcap-title*
+termdebug-commands terminal.txt /*termdebug-commands*
+termdebug-communication terminal.txt /*termdebug-communication*
+termdebug-customizing terminal.txt /*termdebug-customizing*
+termdebug-events terminal.txt /*termdebug-events*
+termdebug-example terminal.txt /*termdebug-example*
+termdebug-prompt terminal.txt /*termdebug-prompt*
+termdebug-starting terminal.txt /*termdebug-starting*
+termdebug-stepping terminal.txt /*termdebug-stepping*
+termdebug-variables terminal.txt /*termdebug-variables*
+termdebug_disasm_window terminal.txt /*termdebug_disasm_window*
+termdebug_map_K terminal.txt /*termdebug_map_K*
+termdebug_popup terminal.txt /*termdebug_popup*
+termdebug_shortcuts terminal.txt /*termdebug_shortcuts*
+termdebug_use_prompt terminal.txt /*termdebug_use_prompt*
+termdebug_wide terminal.txt /*termdebug_wide*
+termdebug_winbar terminal.txt /*termdebug_winbar*
+terminal terminal.txt /*terminal*
+terminal-api terminal.txt /*terminal-api*
+terminal-autoshelldir terminal.txt /*terminal-autoshelldir*
+terminal-client-server terminal.txt /*terminal-client-server*
+terminal-close terminal.txt /*terminal-close*
+terminal-colors os_unix.txt /*terminal-colors*
+terminal-communication terminal.txt /*terminal-communication*
+terminal-cursor-style terminal.txt /*terminal-cursor-style*
+terminal-debug terminal.txt /*terminal-debug*
+terminal-debugger terminal.txt /*terminal-debugger*
+terminal-diff terminal.txt /*terminal-diff*
+terminal-diffscreendump terminal.txt /*terminal-diffscreendump*
+terminal-dumptest terminal.txt /*terminal-dumptest*
+terminal-function-details terminal.txt /*terminal-function-details*
+terminal-functions usr_41.txt /*terminal-functions*
+terminal-info term.txt /*terminal-info*
+terminal-job-index index.txt /*terminal-job-index*
+terminal-key-codes term.txt /*terminal-key-codes*
+terminal-mouse term.txt /*terminal-mouse*
+terminal-ms-windows terminal.txt /*terminal-ms-windows*
+terminal-options term.txt /*terminal-options*
+terminal-output-codes term.txt /*terminal-output-codes*
+terminal-resizing terminal.txt /*terminal-resizing*
+terminal-screendump terminal.txt /*terminal-screendump*
+terminal-session terminal.txt /*terminal-session*
+terminal-size-color terminal.txt /*terminal-size-color*
+terminal-special-keys terminal.txt /*terminal-special-keys*
+terminal-testing terminal.txt /*terminal-testing*
+terminal-to-job terminal.txt /*terminal-to-job*
+terminal-typing terminal.txt /*terminal-typing*
+terminal-unix terminal.txt /*terminal-unix*
+terminal-use terminal.txt /*terminal-use*
+terminal-window terminal.txt /*terminal-window*
+terminal.txt terminal.txt /*terminal.txt*
+terminalprops() builtin.txt /*terminalprops()*
+terminfo term.txt /*terminfo*
+termresponse-variable eval.txt /*termresponse-variable*
+ternary eval.txt /*ternary*
+test-functions usr_41.txt /*test-functions*
+test-functions-details testing.txt /*test-functions-details*
+test_alloc_fail() testing.txt /*test_alloc_fail()*
+test_autochdir() testing.txt /*test_autochdir()*
+test_feedinput() testing.txt /*test_feedinput()*
+test_garbagecollect_now() testing.txt /*test_garbagecollect_now()*
+test_garbagecollect_soon() testing.txt /*test_garbagecollect_soon()*
+test_getvalue() testing.txt /*test_getvalue()*
+test_gui_event() testing.txt /*test_gui_event()*
+test_ignore_error() testing.txt /*test_ignore_error()*
+test_mswin_event() testing.txt /*test_mswin_event()*
+test_null_blob() testing.txt /*test_null_blob()*
+test_null_channel() testing.txt /*test_null_channel()*
+test_null_dict() testing.txt /*test_null_dict()*
+test_null_function() testing.txt /*test_null_function()*
+test_null_job() testing.txt /*test_null_job()*
+test_null_list() testing.txt /*test_null_list()*
+test_null_partial() testing.txt /*test_null_partial()*
+test_null_string() testing.txt /*test_null_string()*
+test_option_not_set() testing.txt /*test_option_not_set()*
+test_override() testing.txt /*test_override()*
+test_refcount() testing.txt /*test_refcount()*
+test_setmouse() testing.txt /*test_setmouse()*
+test_settime() testing.txt /*test_settime()*
+test_srand_seed() testing.txt /*test_srand_seed()*
+test_unknown() testing.txt /*test_unknown()*
+test_void() testing.txt /*test_void()*
+testing testing.txt /*testing*
+testing-support testing.txt /*testing-support*
+testing-variable eval.txt /*testing-variable*
+testing.txt testing.txt /*testing.txt*
+tex-cchar syntax.txt /*tex-cchar*
+tex-cole syntax.txt /*tex-cole*
+tex-conceal syntax.txt /*tex-conceal*
+tex-error syntax.txt /*tex-error*
+tex-folding syntax.txt /*tex-folding*
+tex-matchcheck syntax.txt /*tex-matchcheck*
+tex-math syntax.txt /*tex-math*
+tex-morecommands syntax.txt /*tex-morecommands*
+tex-nospell syntax.txt /*tex-nospell*
+tex-package syntax.txt /*tex-package*
+tex-runon syntax.txt /*tex-runon*
+tex-slow syntax.txt /*tex-slow*
+tex-stopzone syntax.txt /*tex-stopzone*
+tex-style syntax.txt /*tex-style*
+tex-supersub syntax.txt /*tex-supersub*
+tex-sync syntax.txt /*tex-sync*
+tex-verb syntax.txt /*tex-verb*
+tex.vim syntax.txt /*tex.vim*
+text-functions usr_41.txt /*text-functions*
+text-objects motion.txt /*text-objects*
+text-objects-changed version5.txt /*text-objects-changed*
+text-prop-changes textprop.txt /*text-prop-changes*
+text-prop-functions textprop.txt /*text-prop-functions*
+text-prop-intro textprop.txt /*text-prop-intro*
+text-properties textprop.txt /*text-properties*
+text-property-functions usr_41.txt /*text-property-functions*
+textlock eval.txt /*textlock*
+textprop textprop.txt /*textprop*
+textprop.txt textprop.txt /*textprop.txt*
+tf.vim syntax.txt /*tf.vim*
+this_session-variable eval.txt /*this_session-variable*
+throw-catch eval.txt /*throw-catch*
+throw-expression eval.txt /*throw-expression*
+throw-from-catch eval.txt /*throw-from-catch*
+throw-variables eval.txt /*throw-variables*
+throwpoint-variable eval.txt /*throwpoint-variable*
+time-functions usr_41.txt /*time-functions*
+timer builtin.txt /*timer*
+timer-functions usr_41.txt /*timer-functions*
+timer_info() builtin.txt /*timer_info()*
+timer_pause() builtin.txt /*timer_pause()*
+timer_start() builtin.txt /*timer_start()*
+timer_stop() builtin.txt /*timer_stop()*
+timer_stopall() builtin.txt /*timer_stopall()*
+timers builtin.txt /*timers*
+timestamp editing.txt /*timestamp*
+timestamps editing.txt /*timestamps*
+tips tips.txt /*tips*
+tips.txt tips.txt /*tips.txt*
+tmux syntax.txt /*tmux*
+tmux-integration term.txt /*tmux-integration*
+todo todo.txt /*todo*
+todo.txt todo.txt /*todo.txt*
+toggle options.txt /*toggle*
+toggle-revins version4.txt /*toggle-revins*
+tolower() builtin.txt /*tolower()*
+toolbar-icon gui.txt /*toolbar-icon*
+tooltips gui.txt /*tooltips*
+toupper() builtin.txt /*toupper()*
+tr() builtin.txt /*tr()*
+trim() builtin.txt /*trim()*
+trojan-horse starting.txt /*trojan-horse*
+true vim9.txt /*true*
+true-variable eval.txt /*true-variable*
+trunc() builtin.txt /*trunc()*
+truthy eval.txt /*truthy*
+try-conditionals eval.txt /*try-conditionals*
+try-echoerr eval.txt /*try-echoerr*
+try-finally eval.txt /*try-finally*
+try-nested eval.txt /*try-nested*
+try-nesting eval.txt /*try-nesting*
+tutor usr_01.txt /*tutor*
+two-engines pattern.txt /*two-engines*
+type() builtin.txt /*type()*
+type-casting vim9.txt /*type-casting*
+type-checking vim9.txt /*type-checking*
+type-inference vim9.txt /*type-inference*
+type-mistakes tips.txt /*type-mistakes*
+typename() builtin.txt /*typename()*
+u undo.txt /*u*
+uganda uganda.txt /*uganda*
+uganda.txt uganda.txt /*uganda.txt*
+undercurl syntax.txt /*undercurl*
+underdashed syntax.txt /*underdashed*
+underdotted syntax.txt /*underdotted*
+underdouble syntax.txt /*underdouble*
+underline syntax.txt /*underline*
+underline-codes syntax.txt /*underline-codes*
+undo undo.txt /*undo*
+undo-blocks undo.txt /*undo-blocks*
+undo-branches undo.txt /*undo-branches*
+undo-break undo.txt /*undo-break*
+undo-close-block undo.txt /*undo-close-block*
+undo-commands undo.txt /*undo-commands*
+undo-persistence undo.txt /*undo-persistence*
+undo-redo undo.txt /*undo-redo*
+undo-remarks undo.txt /*undo-remarks*
+undo-tree undo.txt /*undo-tree*
+undo-two-ways undo.txt /*undo-two-ways*
+undo.txt undo.txt /*undo.txt*
+undo_ftplugin usr_51.txt /*undo_ftplugin*
+undo_indent usr_51.txt /*undo_indent*
+undofile() builtin.txt /*undofile()*
+undotree() builtin.txt /*undotree()*
+unicode mbyte.txt /*unicode*
+uniq() builtin.txt /*uniq()*
+unix os_unix.txt /*unix*
+unlisted-buffer windows.txt /*unlisted-buffer*
+up-down-motions motion.txt /*up-down-motions*
+uppercase change.txt /*uppercase*
+urxvt-mouse options.txt /*urxvt-mouse*
+use-visual-cmds version4.txt /*use-visual-cmds*
+useful-mappings tips.txt /*useful-mappings*
+usenet intro.txt /*usenet*
+user-cmd-ambiguous map.txt /*user-cmd-ambiguous*
+user-commands map.txt /*user-commands*
+user-functions eval.txt /*user-functions*
+user-manual usr_toc.txt /*user-manual*
+userfunc.txt userfunc.txt /*userfunc.txt*
+using-<Plug> usr_51.txt /*using-<Plug>*
+using-menus gui.txt /*using-menus*
+using-scripts repeat.txt /*using-scripts*
+using-xxd tips.txt /*using-xxd*
+using_CTRL-V map.txt /*using_CTRL-V*
+usr_01.txt usr_01.txt /*usr_01.txt*
+usr_02.txt usr_02.txt /*usr_02.txt*
+usr_03.txt usr_03.txt /*usr_03.txt*
+usr_04.txt usr_04.txt /*usr_04.txt*
+usr_05.txt usr_05.txt /*usr_05.txt*
+usr_06.txt usr_06.txt /*usr_06.txt*
+usr_07.txt usr_07.txt /*usr_07.txt*
+usr_08.txt usr_08.txt /*usr_08.txt*
+usr_09.txt usr_09.txt /*usr_09.txt*
+usr_10.txt usr_10.txt /*usr_10.txt*
+usr_11.txt usr_11.txt /*usr_11.txt*
+usr_12.txt usr_12.txt /*usr_12.txt*
+usr_20.txt usr_20.txt /*usr_20.txt*
+usr_21.txt usr_21.txt /*usr_21.txt*
+usr_22.txt usr_22.txt /*usr_22.txt*
+usr_23.txt usr_23.txt /*usr_23.txt*
+usr_24.txt usr_24.txt /*usr_24.txt*
+usr_25.txt usr_25.txt /*usr_25.txt*
+usr_26.txt usr_26.txt /*usr_26.txt*
+usr_27.txt usr_27.txt /*usr_27.txt*
+usr_28.txt usr_28.txt /*usr_28.txt*
+usr_29.txt usr_29.txt /*usr_29.txt*
+usr_30.txt usr_30.txt /*usr_30.txt*
+usr_31.txt usr_31.txt /*usr_31.txt*
+usr_32.txt usr_32.txt /*usr_32.txt*
+usr_40.txt usr_40.txt /*usr_40.txt*
+usr_41.txt usr_41.txt /*usr_41.txt*
+usr_42.txt usr_42.txt /*usr_42.txt*
+usr_43.txt usr_43.txt /*usr_43.txt*
+usr_44.txt usr_44.txt /*usr_44.txt*
+usr_45.txt usr_45.txt /*usr_45.txt*
+usr_50.txt usr_50.txt /*usr_50.txt*
+usr_51.txt usr_51.txt /*usr_51.txt*
+usr_52.txt usr_52.txt /*usr_52.txt*
+usr_90.txt usr_90.txt /*usr_90.txt*
+usr_toc.txt usr_toc.txt /*usr_toc.txt*
+utf-8 mbyte.txt /*utf-8*
+utf-8-char-arg mbyte.txt /*utf-8-char-arg*
+utf-8-in-xwindows mbyte.txt /*utf-8-in-xwindows*
+utf-8-typing mbyte.txt /*utf-8-typing*
+utf8 mbyte.txt /*utf8*
+v visual.txt /*v*
+v: eval.txt /*v:*
+v:argv eval.txt /*v:argv*
+v:beval_bufnr eval.txt /*v:beval_bufnr*
+v:beval_col eval.txt /*v:beval_col*
+v:beval_lnum eval.txt /*v:beval_lnum*
+v:beval_text eval.txt /*v:beval_text*
+v:beval_winid eval.txt /*v:beval_winid*
+v:beval_winnr eval.txt /*v:beval_winnr*
+v:char eval.txt /*v:char*
+v:charconvert_from eval.txt /*v:charconvert_from*
+v:charconvert_to eval.txt /*v:charconvert_to*
+v:cmdarg eval.txt /*v:cmdarg*
+v:cmdbang eval.txt /*v:cmdbang*
+v:collate eval.txt /*v:collate*
+v:colornames eval.txt /*v:colornames*
+v:completed_item eval.txt /*v:completed_item*
+v:count eval.txt /*v:count*
+v:count1 eval.txt /*v:count1*
+v:ctype eval.txt /*v:ctype*
+v:dying eval.txt /*v:dying*
+v:echospace eval.txt /*v:echospace*
+v:errmsg eval.txt /*v:errmsg*
+v:errors eval.txt /*v:errors*
+v:event eval.txt /*v:event*
+v:exception eval.txt /*v:exception*
+v:exiting eval.txt /*v:exiting*
+v:false eval.txt /*v:false*
+v:fcs_choice eval.txt /*v:fcs_choice*
+v:fcs_reason eval.txt /*v:fcs_reason*
+v:fname eval.txt /*v:fname*
+v:fname_diff eval.txt /*v:fname_diff*
+v:fname_in eval.txt /*v:fname_in*
+v:fname_new eval.txt /*v:fname_new*
+v:fname_out eval.txt /*v:fname_out*
+v:folddashes eval.txt /*v:folddashes*
+v:foldend eval.txt /*v:foldend*
+v:foldlevel eval.txt /*v:foldlevel*
+v:foldstart eval.txt /*v:foldstart*
+v:hlsearch eval.txt /*v:hlsearch*
+v:insertmode eval.txt /*v:insertmode*
+v:key eval.txt /*v:key*
+v:lang eval.txt /*v:lang*
+v:lc_time eval.txt /*v:lc_time*
+v:lnum eval.txt /*v:lnum*
+v:maxcol eval.txt /*v:maxcol*
+v:mouse_col eval.txt /*v:mouse_col*
+v:mouse_lnum eval.txt /*v:mouse_lnum*
+v:mouse_win eval.txt /*v:mouse_win*
+v:mouse_winid eval.txt /*v:mouse_winid*
+v:none eval.txt /*v:none*
+v:null eval.txt /*v:null*
+v:numbermax eval.txt /*v:numbermax*
+v:numbermin eval.txt /*v:numbermin*
+v:numbersize eval.txt /*v:numbersize*
+v:oldfiles eval.txt /*v:oldfiles*
+v:operator eval.txt /*v:operator*
+v:option_command eval.txt /*v:option_command*
+v:option_new eval.txt /*v:option_new*
+v:option_old eval.txt /*v:option_old*
+v:option_oldglobal eval.txt /*v:option_oldglobal*
+v:option_oldlocal eval.txt /*v:option_oldlocal*
+v:option_type eval.txt /*v:option_type*
+v:prevcount eval.txt /*v:prevcount*
+v:profiling eval.txt /*v:profiling*
+v:progname eval.txt /*v:progname*
+v:progpath eval.txt /*v:progpath*
+v:register eval.txt /*v:register*
+v:scrollstart eval.txt /*v:scrollstart*
+v:searchforward eval.txt /*v:searchforward*
+v:servername eval.txt /*v:servername*
+v:shell_error eval.txt /*v:shell_error*
+v:sizeofint eval.txt /*v:sizeofint*
+v:sizeoflong eval.txt /*v:sizeoflong*
+v:sizeofpointer eval.txt /*v:sizeofpointer*
+v:statusmsg eval.txt /*v:statusmsg*
+v:swapchoice eval.txt /*v:swapchoice*
+v:swapcommand eval.txt /*v:swapcommand*
+v:swapname eval.txt /*v:swapname*
+v:t_TYPE eval.txt /*v:t_TYPE*
+v:t_blob eval.txt /*v:t_blob*
+v:t_bool eval.txt /*v:t_bool*
+v:t_channel eval.txt /*v:t_channel*
+v:t_class eval.txt /*v:t_class*
+v:t_dict eval.txt /*v:t_dict*
+v:t_float eval.txt /*v:t_float*
+v:t_func eval.txt /*v:t_func*
+v:t_job eval.txt /*v:t_job*
+v:t_list eval.txt /*v:t_list*
+v:t_none eval.txt /*v:t_none*
+v:t_number eval.txt /*v:t_number*
+v:t_object eval.txt /*v:t_object*
+v:t_string eval.txt /*v:t_string*
+v:termblinkresp eval.txt /*v:termblinkresp*
+v:termrbgresp eval.txt /*v:termrbgresp*
+v:termresponse eval.txt /*v:termresponse*
+v:termrfgresp eval.txt /*v:termrfgresp*
+v:termstyleresp eval.txt /*v:termstyleresp*
+v:termu7resp eval.txt /*v:termu7resp*
+v:testing eval.txt /*v:testing*
+v:this_session eval.txt /*v:this_session*
+v:throwpoint eval.txt /*v:throwpoint*
+v:true eval.txt /*v:true*
+v:val eval.txt /*v:val*
+v:var eval.txt /*v:var*
+v:version eval.txt /*v:version*
+v:versionlong eval.txt /*v:versionlong*
+v:vim_did_enter eval.txt /*v:vim_did_enter*
+v:warningmsg eval.txt /*v:warningmsg*
+v:windowid eval.txt /*v:windowid*
+v_! change.txt /*v_!*
+v_$ visual.txt /*v_$*
+v_: cmdline.txt /*v_:*
+v_< change.txt /*v_<*
+v_<BS> change.txt /*v_<BS>*
+v_<Del> change.txt /*v_<Del>*
+v_<Esc> visual.txt /*v_<Esc>*
+v_= change.txt /*v_=*
+v_> change.txt /*v_>*
+v_C change.txt /*v_C*
+v_CTRL-A change.txt /*v_CTRL-A*
+v_CTRL-C visual.txt /*v_CTRL-C*
+v_CTRL-G visual.txt /*v_CTRL-G*
+v_CTRL-H change.txt /*v_CTRL-H*
+v_CTRL-O visual.txt /*v_CTRL-O*
+v_CTRL-R visual.txt /*v_CTRL-R*
+v_CTRL-V visual.txt /*v_CTRL-V*
+v_CTRL-X change.txt /*v_CTRL-X*
+v_CTRL-Z starting.txt /*v_CTRL-Z*
+v_CTRL-\_CTRL-G intro.txt /*v_CTRL-\\_CTRL-G*
+v_CTRL-\_CTRL-N intro.txt /*v_CTRL-\\_CTRL-N*
+v_CTRL-] tagsrch.txt /*v_CTRL-]*
+v_D change.txt /*v_D*
+v_J change.txt /*v_J*
+v_K various.txt /*v_K*
+v_O visual.txt /*v_O*
+v_P change.txt /*v_P*
+v_R change.txt /*v_R*
+v_S change.txt /*v_S*
+v_U change.txt /*v_U*
+v_V visual.txt /*v_V*
+v_X change.txt /*v_X*
+v_Y change.txt /*v_Y*
+v_a motion.txt /*v_a*
+v_a' motion.txt /*v_a'*
+v_a( motion.txt /*v_a(*
+v_a) motion.txt /*v_a)*
+v_a< motion.txt /*v_a<*
+v_a> motion.txt /*v_a>*
+v_aB motion.txt /*v_aB*
+v_aW motion.txt /*v_aW*
+v_a[ motion.txt /*v_a[*
+v_a] motion.txt /*v_a]*
+v_a` motion.txt /*v_a`*
+v_ab motion.txt /*v_ab*
+v_ap motion.txt /*v_ap*
+v_aquote motion.txt /*v_aquote*
+v_as motion.txt /*v_as*
+v_at motion.txt /*v_at*
+v_aw motion.txt /*v_aw*
+v_a{ motion.txt /*v_a{*
+v_a} motion.txt /*v_a}*
+v_b_< visual.txt /*v_b_<*
+v_b_<_example visual.txt /*v_b_<_example*
+v_b_> visual.txt /*v_b_>*
+v_b_>_example visual.txt /*v_b_>_example*
+v_b_A visual.txt /*v_b_A*
+v_b_A_example visual.txt /*v_b_A_example*
+v_b_C visual.txt /*v_b_C*
+v_b_D change.txt /*v_b_D*
+v_b_I visual.txt /*v_b_I*
+v_b_I_example visual.txt /*v_b_I_example*
+v_b_c visual.txt /*v_b_c*
+v_b_r visual.txt /*v_b_r*
+v_b_r_example visual.txt /*v_b_r_example*
+v_c change.txt /*v_c*
+v_d change.txt /*v_d*
+v_g? change.txt /*v_g?*
+v_gF editing.txt /*v_gF*
+v_gJ change.txt /*v_gJ*
+v_gN visual.txt /*v_gN*
+v_gV visual.txt /*v_gV*
+v_g] tagsrch.txt /*v_g]*
+v_g_CTRL-A change.txt /*v_g_CTRL-A*
+v_g_CTRL-G editing.txt /*v_g_CTRL-G*
+v_g_CTRL-X change.txt /*v_g_CTRL-X*
+v_g_CTRL-] tagsrch.txt /*v_g_CTRL-]*
+v_gf editing.txt /*v_gf*
+v_gn visual.txt /*v_gn*
+v_gq change.txt /*v_gq*
+v_gv visual.txt /*v_gv*
+v_gw change.txt /*v_gw*
+v_i motion.txt /*v_i*
+v_i' motion.txt /*v_i'*
+v_i( motion.txt /*v_i(*
+v_i) motion.txt /*v_i)*
+v_i< motion.txt /*v_i<*
+v_i> motion.txt /*v_i>*
+v_iB motion.txt /*v_iB*
+v_iW motion.txt /*v_iW*
+v_i[ motion.txt /*v_i[*
+v_i] motion.txt /*v_i]*
+v_i` motion.txt /*v_i`*
+v_ib motion.txt /*v_ib*
+v_ip motion.txt /*v_ip*
+v_iquote motion.txt /*v_iquote*
+v_is motion.txt /*v_is*
+v_it motion.txt /*v_it*
+v_iw motion.txt /*v_iw*
+v_i{ motion.txt /*v_i{*
+v_i} motion.txt /*v_i}*
+v_o visual.txt /*v_o*
+v_p change.txt /*v_p*
+v_r change.txt /*v_r*
+v_s change.txt /*v_s*
+v_u change.txt /*v_u*
+v_v visual.txt /*v_v*
+v_x change.txt /*v_x*
+v_y change.txt /*v_y*
+v_zy change.txt /*v_zy*
+v_~ change.txt /*v_~*
+vab motion.txt /*vab*
+val-variable eval.txt /*val-variable*
+valgrind debug.txt /*valgrind*
+values() builtin.txt /*values()*
+var-functions usr_41.txt /*var-functions*
+variable-scope eval.txt /*variable-scope*
+variable-types vim9.txt /*variable-types*
+variables eval.txt /*variables*
+various various.txt /*various*
+various-cmds various.txt /*various-cmds*
+various-functions usr_41.txt /*various-functions*
+various-motions motion.txt /*various-motions*
+various.txt various.txt /*various.txt*
+vb.vim syntax.txt /*vb.vim*
+vba pi_vimball.txt /*vba*
+verbose starting.txt /*verbose*
+version-5.1 version5.txt /*version-5.1*
+version-5.2 version5.txt /*version-5.2*
+version-5.3 version5.txt /*version-5.3*
+version-5.4 version5.txt /*version-5.4*
+version-5.5 version5.txt /*version-5.5*
+version-5.6 version5.txt /*version-5.6*
+version-5.7 version5.txt /*version-5.7*
+version-5.8 version5.txt /*version-5.8*
+version-6.1 version6.txt /*version-6.1*
+version-6.2 version6.txt /*version-6.2*
+version-6.3 version6.txt /*version-6.3*
+version-6.4 version6.txt /*version-6.4*
+version-7.0 version7.txt /*version-7.0*
+version-7.1 version7.txt /*version-7.1*
+version-7.2 version7.txt /*version-7.2*
+version-7.3 version7.txt /*version-7.3*
+version-7.4 version7.txt /*version-7.4*
+version-8.0 version8.txt /*version-8.0*
+version-8.1 version8.txt /*version-8.1*
+version-8.2 version8.txt /*version-8.2*
+version-9.0 version9.txt /*version-9.0*
+version-variable eval.txt /*version-variable*
+version4.txt version4.txt /*version4.txt*
+version5.txt version5.txt /*version5.txt*
+version6.txt version6.txt /*version6.txt*
+version7.0 version7.txt /*version7.0*
+version7.1 version7.txt /*version7.1*
+version7.2 version7.txt /*version7.2*
+version7.3 version7.txt /*version7.3*
+version7.4 version7.txt /*version7.4*
+version7.txt version7.txt /*version7.txt*
+version8.0 version8.txt /*version8.0*
+version8.1 version8.txt /*version8.1*
+version8.2 version8.txt /*version8.2*
+version8.txt version8.txt /*version8.txt*
+version9.0 version9.txt /*version9.0*
+version9.txt version9.txt /*version9.txt*
+versionlong-variable eval.txt /*versionlong-variable*
+vi intro.txt /*vi*
+vi-differences vi_diff.txt /*vi-differences*
+vi-features vi_diff.txt /*vi-features*
+vi: options.txt /*vi:*
+vi_diff.txt vi_diff.txt /*vi_diff.txt*
+vib motion.txt /*vib*
+view starting.txt /*view*
+view-diffs diff.txt /*view-diffs*
+view-file starting.txt /*view-file*
+views-sessions starting.txt /*views-sessions*
+vim-7.4 version7.txt /*vim-7.4*
+vim-8 version8.txt /*vim-8*
+vim-8.1 version8.txt /*vim-8.1*
+vim-8.2 version8.txt /*vim-8.2*
+vim-9 version9.txt /*vim-9*
+vim-9.0 version9.txt /*vim-9.0*
+vim-additions vi_diff.txt /*vim-additions*
+vim-announce intro.txt /*vim-announce*
+vim-arguments starting.txt /*vim-arguments*
+vim-changelog version8.txt /*vim-changelog*
+vim-default-editor gui_w32.txt /*vim-default-editor*
+vim-dev intro.txt /*vim-dev*
+vim-mac intro.txt /*vim-mac*
+vim-modes intro.txt /*vim-modes*
+vim-modes-intro intro.txt /*vim-modes-intro*
+vim-raku ft_raku.txt /*vim-raku*
+vim-script-intro usr_41.txt /*vim-script-intro*
+vim-use intro.txt /*vim-use*
+vim-variable eval.txt /*vim-variable*
+vim.b if_lua.txt /*vim.b*
+vim.g if_lua.txt /*vim.g*
+vim.t if_lua.txt /*vim.t*
+vim.v if_lua.txt /*vim.v*
+vim.vim syntax.txt /*vim.vim*
+vim.w if_lua.txt /*vim.w*
+vim7 version7.txt /*vim7*
+vim8 version8.txt /*vim8*
+vim9 vim9.txt /*vim9*
+vim9-autoload vim9.txt /*vim9-autoload*
+vim9-boolean vim9.txt /*vim9-boolean*
+vim9-classes vim9.txt /*vim9-classes*
+vim9-const vim9.txt /*vim9-const*
+vim9-curly vim9.txt /*vim9-curly*
+vim9-debug repeat.txt /*vim9-debug*
+vim9-declaration vim9.txt /*vim9-declaration*
+vim9-declarations usr_41.txt /*vim9-declarations*
+vim9-differences vim9.txt /*vim9-differences*
+vim9-export vim9.txt /*vim9-export*
+vim9-final vim9.txt /*vim9-final*
+vim9-function-defined-later vim9.txt /*vim9-function-defined-later*
+vim9-gotchas vim9.txt /*vim9-gotchas*
+vim9-ignored-argument vim9.txt /*vim9-ignored-argument*
+vim9-import vim9.txt /*vim9-import*
+vim9-lambda vim9.txt /*vim9-lambda*
+vim9-lambda-arguments vim9.txt /*vim9-lambda-arguments*
+vim9-line-continuation vim9.txt /*vim9-line-continuation*
+vim9-literal-dict vim9.txt /*vim9-literal-dict*
+vim9-mix vim9.txt /*vim9-mix*
+vim9-namespace vim9.txt /*vim9-namespace*
+vim9-no-dict-function vim9.txt /*vim9-no-dict-function*
+vim9-no-shorten vim9.txt /*vim9-no-shorten*
+vim9-rationale vim9.txt /*vim9-rationale*
+vim9-reload vim9.txt /*vim9-reload*
+vim9-s-namespace vim9.txt /*vim9-s-namespace*
+vim9-scopes vim9.txt /*vim9-scopes*
+vim9-types vim9.txt /*vim9-types*
+vim9-unpack-ignore vim9.txt /*vim9-unpack-ignore*
+vim9-user-command vim9.txt /*vim9-user-command*
+vim9-variable-arguments vim9.txt /*vim9-variable-arguments*
+vim9.txt vim9.txt /*vim9.txt*
+vim9class.txt vim9class.txt /*vim9class.txt*
+vim9script vim9.txt /*vim9script*
+vim: options.txt /*vim:*
+vim_announce intro.txt /*vim_announce*
+vim_dev intro.txt /*vim_dev*
+vim_did_enter-variable eval.txt /*vim_did_enter-variable*
+vim_mac intro.txt /*vim_mac*
+vim_starting builtin.txt /*vim_starting*
+vim_use intro.txt /*vim_use*
+vimball pi_vimball.txt /*vimball*
+vimball-contents pi_vimball.txt /*vimball-contents*
+vimball-extract pi_vimball.txt /*vimball-extract*
+vimball-history pi_vimball.txt /*vimball-history*
+vimball-intro pi_vimball.txt /*vimball-intro*
+vimball-manual pi_vimball.txt /*vimball-manual*
+vimball-windows pi_vimball.txt /*vimball-windows*
+vimdev intro.txt /*vimdev*
+vimdiff diff.txt /*vimdiff*
+vimfiles options.txt /*vimfiles*
+viminfo starting.txt /*viminfo*
+viminfo-! options.txt /*viminfo-!*
+viminfo-% options.txt /*viminfo-%*
+viminfo-' options.txt /*viminfo-'*
+viminfo-/ options.txt /*viminfo-\/*
+viminfo-: options.txt /*viminfo-:*
+viminfo-< options.txt /*viminfo-<*
+viminfo-@ options.txt /*viminfo-@*
+viminfo-c options.txt /*viminfo-c*
+viminfo-encoding starting.txt /*viminfo-encoding*
+viminfo-errors starting.txt /*viminfo-errors*
+viminfo-f options.txt /*viminfo-f*
+viminfo-file starting.txt /*viminfo-file*
+viminfo-file-marks starting.txt /*viminfo-file-marks*
+viminfo-file-name starting.txt /*viminfo-file-name*
+viminfo-h options.txt /*viminfo-h*
+viminfo-n options.txt /*viminfo-n*
+viminfo-quote options.txt /*viminfo-quote*
+viminfo-r options.txt /*viminfo-r*
+viminfo-read starting.txt /*viminfo-read*
+viminfo-read-write starting.txt /*viminfo-read-write*
+viminfo-s options.txt /*viminfo-s*
+viminfo-timestamp starting.txt /*viminfo-timestamp*
+viminfo-write starting.txt /*viminfo-write*
+vimrc starting.txt /*vimrc*
+vimrc-filetype usr_05.txt /*vimrc-filetype*
+vimrc-intro usr_05.txt /*vimrc-intro*
+vimrc-option-example starting.txt /*vimrc-option-example*
+vimrc_example.vim usr_05.txt /*vimrc_example.vim*
+vimscript-version eval.txt /*vimscript-version*
+vimscript-versions eval.txt /*vimscript-versions*
+vimtutor usr_01.txt /*vimtutor*
+virtcol() builtin.txt /*virtcol()*
+virtcol2col() builtin.txt /*virtcol2col()*
+virtual-text textprop.txt /*virtual-text*
+visual-block visual.txt /*visual-block*
+visual-change visual.txt /*visual-change*
+visual-examples visual.txt /*visual-examples*
+visual-index index.txt /*visual-index*
+visual-mode visual.txt /*visual-mode*
+visual-operators visual.txt /*visual-operators*
+visual-repeat visual.txt /*visual-repeat*
+visual-search visual.txt /*visual-search*
+visual-start visual.txt /*visual-start*
+visual-use visual.txt /*visual-use*
+visual.txt visual.txt /*visual.txt*
+visualmode() builtin.txt /*visualmode()*
+vms os_vms.txt /*vms*
+vms-authors os_vms.txt /*vms-authors*
+vms-changes os_vms.txt /*vms-changes*
+vms-compiling os_vms.txt /*vms-compiling*
+vms-deploy os_vms.txt /*vms-deploy*
+vms-download os_vms.txt /*vms-download*
+vms-gui os_vms.txt /*vms-gui*
+vms-notes os_vms.txt /*vms-notes*
+vms-problems os_vms.txt /*vms-problems*
+vms-started os_vms.txt /*vms-started*
+vms-usage os_vms.txt /*vms-usage*
+vote-for-features sponsor.txt /*vote-for-features*
+votes-counted sponsor.txt /*votes-counted*
+votes-for-changes todo.txt /*votes-for-changes*
+vreplace-mode insert.txt /*vreplace-mode*
+vt100-cursor-keys term.txt /*vt100-cursor-keys*
+vt100-function-keys term.txt /*vt100-function-keys*
+w motion.txt /*w*
+w32-clientserver remote.txt /*w32-clientserver*
+w32-xpm-support gui_w32.txt /*w32-xpm-support*
+w: eval.txt /*w:*
+w:current_syntax syntax.txt /*w:current_syntax*
+w:quickfix_title quickfix.txt /*w:quickfix_title*
+w:var eval.txt /*w:var*
+waittime channel.txt /*waittime*
+warningmsg-variable eval.txt /*warningmsg-variable*
+wdl-syntax syntax.txt /*wdl-syntax*
+wdl.vim syntax.txt /*wdl.vim*
+white-space pattern.txt /*white-space*
+whitespace pattern.txt /*whitespace*
+wildcard editing.txt /*wildcard*
+wildcards editing.txt /*wildcards*
+wildmenumode() builtin.txt /*wildmenumode()*
+win-scrolled-resized windows.txt /*win-scrolled-resized*
+win16 os_win32.txt /*win16*
+win32 os_win32.txt /*win32*
+win32-!start gui_w32.txt /*win32-!start*
+win32-PATH os_win32.txt /*win32-PATH*
+win32-backslashes os_win32.txt /*win32-backslashes*
+win32-cmdargs os_win32.txt /*win32-cmdargs*
+win32-colors gui_w32.txt /*win32-colors*
+win32-compiling os_win32.txt /*win32-compiling*
+win32-curdir os_win32.txt /*win32-curdir*
+win32-faq os_win32.txt /*win32-faq*
+win32-gettext mlang.txt /*win32-gettext*
+win32-gui gui_w32.txt /*win32-gui*
+win32-hidden-menus gui.txt /*win32-hidden-menus*
+win32-installer os_win32.txt /*win32-installer*
+win32-mouse os_win32.txt /*win32-mouse*
+win32-open-with-menu gui_w32.txt /*win32-open-with-menu*
+win32-popup-menu gui_w32.txt /*win32-popup-menu*
+win32-problems os_win32.txt /*win32-problems*
+win32-quotes os_win32.txt /*win32-quotes*
+win32-restore os_win32.txt /*win32-restore*
+win32-startup os_win32.txt /*win32-startup*
+win32-term os_win32.txt /*win32-term*
+win32-vimrun gui_w32.txt /*win32-vimrun*
+win32-win3.1 os_win32.txt /*win32-win3.1*
+win32-win95 os_win32.txt /*win32-win95*
+win32s os_win32.txt /*win32s*
+win_execute() builtin.txt /*win_execute()*
+win_findbuf() builtin.txt /*win_findbuf()*
+win_getid() builtin.txt /*win_getid()*
+win_gettype() builtin.txt /*win_gettype()*
+win_gotoid() builtin.txt /*win_gotoid()*
+win_id2tabwin() builtin.txt /*win_id2tabwin()*
+win_id2win() builtin.txt /*win_id2win()*
+win_move_separator() builtin.txt /*win_move_separator()*
+win_move_statusline() builtin.txt /*win_move_statusline()*
+win_screenpos() builtin.txt /*win_screenpos()*
+win_splitmove() builtin.txt /*win_splitmove()*
+winbufnr() builtin.txt /*winbufnr()*
+wincol() builtin.txt /*wincol()*
+window windows.txt /*window*
+window-ID windows.txt /*window-ID*
+window-contents intro.txt /*window-contents*
+window-exit editing.txt /*window-exit*
+window-functions usr_41.txt /*window-functions*
+window-move-cursor windows.txt /*window-move-cursor*
+window-moving windows.txt /*window-moving*
+window-resize windows.txt /*window-resize*
+window-size term.txt /*window-size*
+window-size-functions usr_41.txt /*window-size-functions*
+window-tag windows.txt /*window-tag*
+window-toolbar gui.txt /*window-toolbar*
+window-variable eval.txt /*window-variable*
+windowid windows.txt /*windowid*
+windowid-variable eval.txt /*windowid-variable*
+windows windows.txt /*windows*
+windows-3.1 os_win32.txt /*windows-3.1*
+windows-asynchronously os_win32.txt /*windows-asynchronously*
+windows-icon os_win32.txt /*windows-icon*
+windows-intro windows.txt /*windows-intro*
+windows-starting windows.txt /*windows-starting*
+windows.txt windows.txt /*windows.txt*
+windows95 os_win32.txt /*windows95*
+windows98 os_win32.txt /*windows98*
+windowsme os_win32.txt /*windowsme*
+windowsversion() builtin.txt /*windowsversion()*
+winheight() builtin.txt /*winheight()*
+winid windows.txt /*winid*
+winlayout() builtin.txt /*winlayout()*
+winline() builtin.txt /*winline()*
+winnr() builtin.txt /*winnr()*
+winrestcmd() builtin.txt /*winrestcmd()*
+winrestview() builtin.txt /*winrestview()*
+winsaveview() builtin.txt /*winsaveview()*
+winwidth() builtin.txt /*winwidth()*
+word motion.txt /*word*
+word-count editing.txt /*word-count*
+word-motions motion.txt /*word-motions*
+wordcount() builtin.txt /*wordcount()*
+workbench starting.txt /*workbench*
+workshop workshop.txt /*workshop*
+workshop-support workshop.txt /*workshop-support*
+workshop.txt workshop.txt /*workshop.txt*
+wrap-off intro.txt /*wrap-off*
+write-compiler-plugin usr_51.txt /*write-compiler-plugin*
+write-device editing.txt /*write-device*
+write-fail editing.txt /*write-fail*
+write-filetype-plugin usr_51.txt /*write-filetype-plugin*
+write-library-script usr_52.txt /*write-library-script*
+write-local-help usr_51.txt /*write-local-help*
+write-permissions editing.txt /*write-permissions*
+write-plugin usr_51.txt /*write-plugin*
+write-plugin-quickload usr_52.txt /*write-plugin-quickload*
+write-quit editing.txt /*write-quit*
+write-readonly editing.txt /*write-readonly*
+writefile() builtin.txt /*writefile()*
+writing editing.txt /*writing*
+www intro.txt /*www*
+x change.txt /*x*
+x-input-method mbyte.txt /*x-input-method*
+x-resources version5.txt /*x-resources*
+x11-clientserver remote.txt /*x11-clientserver*
+x11-cut-buffer gui_x11.txt /*x11-cut-buffer*
+x11-selection gui_x11.txt /*x11-selection*
+xf86conf.vim syntax.txt /*xf86conf.vim*
+xfontset mbyte.txt /*xfontset*
+xfree-xterm syntax.txt /*xfree-xterm*
+xim mbyte.txt /*xim*
+xim-input-style mbyte.txt /*xim-input-style*
+xiterm syntax.txt /*xiterm*
+xml-folding syntax.txt /*xml-folding*
+xml-omni-datafile insert.txt /*xml-omni-datafile*
+xml.vim syntax.txt /*xml.vim*
+xor() builtin.txt /*xor()*
+xpm.vim syntax.txt /*xpm.vim*
+xterm-8-bit term.txt /*xterm-8-bit*
+xterm-8bit term.txt /*xterm-8bit*
+xterm-blink syntax.txt /*xterm-blink*
+xterm-blinking-cursor syntax.txt /*xterm-blinking-cursor*
+xterm-bracketed-paste term.txt /*xterm-bracketed-paste*
+xterm-clipboard term.txt /*xterm-clipboard*
+xterm-codes term.txt /*xterm-codes*
+xterm-color syntax.txt /*xterm-color*
+xterm-command-server term.txt /*xterm-command-server*
+xterm-copy-paste term.txt /*xterm-copy-paste*
+xterm-cursor-keys term.txt /*xterm-cursor-keys*
+xterm-end-home-keys term.txt /*xterm-end-home-keys*
+xterm-focus-event term.txt /*xterm-focus-event*
+xterm-function-keys term.txt /*xterm-function-keys*
+xterm-kitty term.txt /*xterm-kitty*
+xterm-modifier-keys term.txt /*xterm-modifier-keys*
+xterm-mouse options.txt /*xterm-mouse*
+xterm-mouse-wheel scroll.txt /*xterm-mouse-wheel*
+xterm-resize term.txt /*xterm-resize*
+xterm-save-screen tips.txt /*xterm-save-screen*
+xterm-screens tips.txt /*xterm-screens*
+xterm-scroll-region term.txt /*xterm-scroll-region*
+xterm-shifted-keys term.txt /*xterm-shifted-keys*
+xterm-terminfo-entries term.txt /*xterm-terminfo-entries*
+xterm-true-color term.txt /*xterm-true-color*
+y change.txt /*y*
+yaml.vim syntax.txt /*yaml.vim*
+yank change.txt /*yank*
+ye-option-gone version4.txt /*ye-option-gone*
+year-2000 intro.txt /*year-2000*
+your-runtime-dir usr_43.txt /*your-runtime-dir*
+yy change.txt /*yy*
+z index.txt /*z*
+z+ scroll.txt /*z+*
+z- scroll.txt /*z-*
+z. scroll.txt /*z.*
+z/OS os_390.txt /*z\/OS*
+z<CR> scroll.txt /*z<CR>*
+z<Left> scroll.txt /*z<Left>*
+z<Right> scroll.txt /*z<Right>*
+z= spell.txt /*z=*
+zA fold.txt /*zA*
+zC fold.txt /*zC*
+zD fold.txt /*zD*
+zE fold.txt /*zE*
+zF fold.txt /*zF*
+zG spell.txt /*zG*
+zH scroll.txt /*zH*
+zL scroll.txt /*zL*
+zM fold.txt /*zM*
+zN fold.txt /*zN*
+zN<CR> scroll.txt /*zN<CR>*
+zO fold.txt /*zO*
+zOS os_390.txt /*zOS*
+zOS-Bugs os_390.txt /*zOS-Bugs*
+zOS-Motif os_390.txt /*zOS-Motif*
+zOS-PuTTY os_390.txt /*zOS-PuTTY*
+zOS-has-ebcdic os_390.txt /*zOS-has-ebcdic*
+zOS-limitations os_390.txt /*zOS-limitations*
+zOS-open-source os_390.txt /*zOS-open-source*
+zP change.txt /*zP*
+zR fold.txt /*zR*
+zW spell.txt /*zW*
+zX fold.txt /*zX*
+z^ scroll.txt /*z^*
+za fold.txt /*za*
+zb scroll.txt /*zb*
+zc fold.txt /*zc*
+zd fold.txt /*zd*
+ze scroll.txt /*ze*
+zf fold.txt /*zf*
+zg spell.txt /*zg*
+zh scroll.txt /*zh*
+zi fold.txt /*zi*
+zip pi_zip.txt /*zip*
+zip-contents pi_zip.txt /*zip-contents*
+zip-copyright pi_zip.txt /*zip-copyright*
+zip-extension pi_zip.txt /*zip-extension*
+zip-history pi_zip.txt /*zip-history*
+zip-manual pi_zip.txt /*zip-manual*
+zip-usage pi_zip.txt /*zip-usage*
+zip-x pi_zip.txt /*zip-x*
+zj fold.txt /*zj*
+zk fold.txt /*zk*
+zl scroll.txt /*zl*
+zm fold.txt /*zm*
+zn fold.txt /*zn*
+zo fold.txt /*zo*
+zp change.txt /*zp*
+zr fold.txt /*zr*
+zs scroll.txt /*zs*
+zsh.vim syntax.txt /*zsh.vim*
+zt scroll.txt /*zt*
+zuG spell.txt /*zuG*
+zuW spell.txt /*zuW*
+zug spell.txt /*zug*
+zuw spell.txt /*zuw*
+zv fold.txt /*zv*
+zw spell.txt /*zw*
+zx fold.txt /*zx*
+zy change.txt /*zy*
+zz scroll.txt /*zz*
+{ motion.txt /*{*
+{Visual} intro.txt /*{Visual}*
+{address} cmdline.txt /*{address}*
+{arglist} editing.txt /*{arglist}*
+{aupat} autocmd.txt /*{aupat}*
+{bufname} windows.txt /*{bufname}*
+{char1-char2} intro.txt /*{char1-char2}*
+{event} autocmd.txt /*{event}*
+{file} editing.txt /*{file}*
+{group-name} syntax.txt /*{group-name}*
+{lhs} map.txt /*{lhs}*
+{motion} intro.txt /*{motion}*
+{move-around} visual.txt /*{move-around}*
+{offset} pattern.txt /*{offset}*
+{register} change.txt /*{register}*
+{rhs} map.txt /*{rhs}*
+{server} remote.txt /*{server}*
+{subject} helphelp.txt /*{subject}*
+{{{ fold.txt /*{{{*
+{} intro.txt /*{}*
+} motion.txt /*}*
+}}} fold.txt /*}}}*
+~ change.txt /*~*
diff --git a/runtime/doc/tagsrch.txt b/runtime/doc/tagsrch.txt
new file mode 100644
index 0000000..f90632c
--- /dev/null
+++ b/runtime/doc/tagsrch.txt
@@ -0,0 +1,960 @@
+*tagsrch.txt* For Vim version 9.0. Last change: 2023 Feb 13
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+7. Using 'tagfunc' |tag-function|
+
+==============================================================================
+1. Jump to a tag *tag-commands*
+
+ *tag* *tags*
+A tag is an identifier that appears in a "tags" file. It is a sort of label
+that can be jumped to. For example: In C programs each function name can be
+used as a tag. The "tags" file has to be generated by a program like ctags,
+before the tag commands can be used.
+
+With the ":tag" command the cursor will be positioned on the tag. With the
+CTRL-] command, the keyword on which the cursor is standing is used as the
+tag. If the cursor is not on a keyword, the first keyword to the right of the
+cursor is used.
+
+The ":tag" command works very well for C programs. If you see a call to a
+function and wonder what that function does, position the cursor inside of the
+function name and hit CTRL-]. This will bring you to the function definition.
+An easy way back is with the CTRL-T command. Also read about the tag stack
+below.
+
+ *:ta* *:tag* *E426* *E429*
+:[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 [!].
+ {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.
+
+g<LeftMouse> *g<LeftMouse>*
+<C-LeftMouse> *<C-LeftMouse>* *CTRL-]*
+CTRL-] Jump to the definition of the keyword under the
+ cursor. Same as ":tag {name}", where {name} is the
+ keyword under or after cursor.
+ 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 {name}", where {name} is the text that
+ is highlighted.
+
+ *telnet-CTRL-]*
+CTRL-] is the default telnet escape key. When you type CTRL-] to jump to a
+tag, you will get the telnet prompt instead. Most versions of telnet allow
+changing or disabling the default escape key. See the telnet man page. You
+can 'telnet -E {Hostname}' to disable the escape character, or 'telnet -e
+{EscapeCharacter} {Hostname}' to specify another escape character. If
+possible, try to use "ssh" instead of "telnet" to avoid this problem.
+
+ *tag-priority*
+When there are multiple matches for a tag, this priority is used:
+1. "FSC" A full matching static tag for the current file.
+2. "F C" A full matching global tag for the current file.
+3. "F " A full matching global tag for another file.
+4. "FS " A full matching static tag for another file.
+5. " SC" An ignore-case matching static tag for the current file.
+6. " C" An ignore-case matching global tag for the current file.
+7. " " An ignore-case matching global tag for another file.
+8. " S " An ignore-case matching static tag for another file.
+
+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 {name}".
+
+The ignore-case matches are not found for a ":tag" command when:
+- 'tagcase' is "followic" and the 'ignorecase' option is off
+- 'tagcase' is "followscs" and the 'ignorecase' option is off and the
+ 'smartcase' option is off or the pattern contains an upper case character.
+- 'tagcase' is "match"
+- 'tagcase' is "smart" 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 on
+- when 'tagcase' is "followscs" and 'ignorecase' is on or the 'smartcase'
+ option is on and the pattern does not contain an upper case character
+- when 'tagcase' is "ignore"
+- when 'tagcase' is "smart" and the pattern does not contain an upper case
+ character
+
+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*
+
+On the tag stack is remembered which tags you jumped to, and from where.
+Tags are only pushed onto the stack when the 'tagstack' option is set.
+
+g<RightMouse> *g<RightMouse>*
+<C-RightMouse> *<C-RightMouse>* *CTRL-T*
+CTRL-T Jump to [count] older entry in the tag stack
+ (default 1).
+
+ *:po* *:pop* *E555* *E556*
+:[count]po[p][!] Jump to [count] older entry in tag stack (default 1).
+ See |tag-!| for [!].
+
+:[count]ta[g][!] Jump to [count] newer entry in tag stack (default 1).
+ See |tag-!| for [!].
+
+ *:tags*
+:tags Show the contents of the tag stack. The active
+ entry is marked with a '>'.
+
+The output of ":tags" looks like this:
+
+ # TO tag FROM line in file/text
+ 1 1 main 1 harddisk2:text/vim/test
+ > 2 2 FuncA 58 i = FuncA(10);
+ 3 1 FuncC 357 harddisk2:text/vim/src/amiga.c
+
+This list shows the tags that you jumped to and the cursor position before
+that jump. The older tags are at the top, the newer at the bottom.
+
+The '>' points to the active entry. This is the tag that will be used by the
+next ":tag" command. The CTRL-T and ":pop" command will use the position
+above the active entry.
+
+Below the "TO" is the number of the current match in the match list. Note
+that this doesn't change when using ":pop" or ":tag".
+
+The line number and file name are remembered to be able to get back to where
+you were before the tag command. The line number will be correct, also when
+deleting/inserting lines, unless this was done by another program (e.g.
+another instance of Vim).
+
+For the current file, the "file/text" column shows the text at the position.
+An indent is removed and a long line is truncated to fit in the window.
+
+You can jump to previously used tags with several commands. Some examples:
+
+ ":pop" or CTRL-T to position before previous tag
+ {count}CTRL-T to position before {count} older tag
+ ":tag" to newer tag
+ ":0tag" to last used tag
+
+The most obvious way to use this is while browsing through the call graph of
+a program. Consider the following call graph:
+
+ main ---> FuncA ---> FuncC
+ ---> FuncB
+
+(Explanation: main calls FuncA and FuncB; FuncA calls FuncC).
+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 {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
+entry was not at the bottom, the entries below the last used one are
+deleted. This means that an old branch in the call graph is lost. After the
+commands explained above the tag stack will look like this:
+
+ # TO tag FROM line in file/text
+ 1 1 main 1 harddisk2:text/vim/test
+ 2 1 FuncB 59 harddisk2:text/vim/src/main.c
+
+The |gettagstack()| function returns the tag stack of a specified window. The
+|settagstack()| function modifies the tag stack of a window.
+
+ *tagstack-examples*
+Write to the tag stack just like `:tag` but with a user-defined
+jumper#jump_to_tag function: >
+ " Store where we're jumping from before we jump.
+ let tag = expand('<cword>')
+ let pos = [bufnr()] + getcurpos()[1:]
+ let item = {'bufnr': pos[0], 'from': pos, 'tagname': tag}
+ if jumper#jump_to_tag(tag)
+ " Jump was successful, write previous location to tag stack.
+ let winid = win_getid()
+ let stack = gettagstack(winid)
+ let stack['items'] = [item]
+ call settagstack(winid, stack, 't')
+ endif
+<
+Set current index of the tag stack to 4: >
+ call settagstack(1005, {'curidx' : 4})
+<
+Push a new item onto the tag stack: >
+ let pos = [bufnr('myfile.txt'), 10, 1, 0]
+ let newtag = [{'tagname' : 'mytag', 'from' : pos}]
+ call settagstack(2, {'items' : newtag}, 'a')
+<
+ *E73*
+When you try to use the tag stack while it doesn't contain anything you will
+get an error message.
+
+==============================================================================
+3. Tag match list *tag-matchlist* *E427* *E428*
+
+When there are several matching tags, these commands can be used to jump
+between them. Note that these commands don't change the tag stack, they keep
+the same entry.
+
+ *:ts* *:tselect*
+:ts[elect][!] [name] List the tags that match [name], using the
+ information in the tags file(s).
+ 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).
+ [name] can be a regexp pattern, see |tag-regexp|.
+ See |tag-priority| for the priorities used in the
+ listing.
+ Example output:
+
+>
+ # pri kind tag file
+ 1 F f mch_delay os_amiga.c
+ mch_delay(msec, ignoreinput)
+ > 2 F f mch_delay os_msdos.c
+ mch_delay(msec, ignoreinput)
+ 3 F f mch_delay os_unix.c
+ mch_delay(msec, ignoreinput)
+ Type number and <Enter> (empty cancels):
+<
+ See |tag-priority| for the "pri" column. Note that
+ this depends on the current file, thus using
+ ":tselect xxx" can produce different results.
+ The "kind" column gives the kind of tag, if this was
+ included in the tags file.
+ The "info" column shows information that could be
+ found in the tags file. It depends on the program
+ that produced the tags file.
+ When the list is long, you may get the |more-prompt|.
+ If you already see the tag you want to use, you can
+ type 'q' and enter the number.
+
+ *:sts* *:stselect*
+:sts[elect][!] [name] Does ":tselect[!] [name]" and splits the window for
+ the selected tag.
+
+ *g]*
+g] Like CTRL-], but use ":tselect" instead of ":tag".
+
+ *v_g]*
+{Visual}g] Same as "g]", but use the highlighted text as the
+ identifier.
+
+ *:tj* *:tjump*
+:tj[ump][!] [name] Like ":tselect", but jump to the tag directly when
+ there is only one match.
+
+ *:stj* *:stjump*
+:stj[ump][!] [name] Does ":tjump[!] [name]" and splits the window for the
+ selected tag.
+
+ *g_CTRL-]*
+g CTRL-] Like CTRL-], but use ":tjump" instead of ":tag".
+
+ *v_g_CTRL-]*
+{Visual}g CTRL-] Same as "g CTRL-]", but use the highlighted text as
+ the identifier.
+
+ *:tn* *:tnext*
+:[count]tn[ext][!] Jump to [count] next matching tag (default 1). See
+ |tag-!| for [!].
+
+ *:tp* *:tprevious*
+:[count]tp[revious][!] Jump to [count] previous matching tag (default 1).
+ See |tag-!| for [!].
+
+ *:tN* *:tNext*
+:[count]tN[ext][!] Same as ":tprevious".
+
+ *:tr* *:trewind*
+:[count]tr[ewind][!] Jump to first matching tag. If [count] is given, jump
+ to [count]th matching tag. See |tag-!| for [!].
+
+ *:tf* *:tfirst*
+:[count]tf[irst][!] Same as ":trewind".
+
+ *:tl* *:tlast*
+:tl[ast][!] Jump to last matching tag. See |tag-!| for [!].
+
+ *:lt* *:ltag*
+: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
+ characters (very nomagic). The location list showing
+ the matching tags is independent of the tag stack.
+ See |tag-!| for [!].
+
+When there is no other message, Vim shows which matching tag has been jumped
+to, and the number of matching tags: >
+ tag 1 of 3 or more
+The " or more" is used to indicate that Vim didn't try all the tags files yet.
+When using ":tnext" a few times, or with ":tlast", more matches may be found.
+
+When you didn't see this message because of some other message, or you just
+want to know where you are, this command will show it again (and jump to the
+same tag as last time): >
+ :0tn
+<
+ *tag-skip-file*
+When a matching tag is found for which the file doesn't exist, this match is
+skipped and the next matching tag is used. Vim reports this, to notify you of
+missing files. When the end of the list of matches has been reached, an error
+message is given.
+
+ *tag-preview*
+The tag match list can also be used in the preview window. The commands are
+the same as above, with a "p" prepended.
+{not available when compiled without the |+quickfix| feature}
+
+ *:pts* *:ptselect*
+:pts[elect][!] [name] Does ":tselect[!] [name]" and shows the new tag in a
+ "Preview" window. See |:ptag| for more info.
+
+ *:ptj* *:ptjump*
+:ptj[ump][!] [name] Does ":tjump[!] [name]" and shows the new tag in a
+ "Preview" window. See |:ptag| for more info.
+
+ *:ptn* *:ptnext*
+:[count]ptn[ext][!] ":tnext" in the preview window. See |:ptag|.
+
+ *:ptp* *:ptprevious*
+:[count]ptp[revious][!] ":tprevious" in the preview window. See |:ptag|.
+
+ *:ptN* *:ptNext*
+:[count]ptN[ext][!] Same as ":ptprevious".
+
+ *:ptr* *:ptrewind*
+:[count]ptr[ewind][!] ":trewind" in the preview window. See |:ptag|.
+
+ *:ptf* *:ptfirst*
+:[count]ptf[irst][!] Same as ":ptrewind".
+
+ *:ptl* *:ptlast*
+:ptl[ast][!] ":tlast" in the preview window. See |:ptag|.
+
+==============================================================================
+4. Tags details *tag-details*
+
+ *static-tag*
+A static tag is a tag that is defined for a specific file. In a C program
+this could be a static function.
+
+In Vi jumping to a tag sets the current search pattern. This means that the
+"n" command after jumping to a tag does not search for the same pattern that
+it did before jumping to the tag. Vim does not do this as we consider it to
+be a bug. If you really want the old Vi behavior, set the 't' flag in
+'cpoptions'.
+
+ *tag-binary-search*
+Vim uses binary searching in the tags file to find the desired tag quickly
+(when enabled at compile time |+tag_binary|). But this only works if the
+tags file was sorted on ASCII byte value. Therefore, if no match was found,
+another try is done with a linear search. If you only want the linear search,
+reset the 'tagbsearch' option. Or better: Sort the tags file!
+
+Note that the binary searching is disabled when not looking for a tag with a
+specific name. This happens when ignoring case and when a regular expression
+is used that doesn't start with a fixed string. Tag searching can be a lot
+slower then. The former can be avoided by case-fold sorting the tags file.
+See 'tagbsearch' for details.
+
+ *tag-regexp*
+The ":tag" and ":tselect" commands accept a regular expression argument. See
+|pattern| for the special characters that can be used.
+When the argument starts with '/', it is used as a pattern. If the argument
+does not start with '/', it is taken literally, as a full tag name.
+Examples: >
+ :tag main
+< jumps to the tag "main" that has the highest priority. >
+ :tag /^get
+< jumps to the tag that starts with "get" and has the highest priority. >
+ :tag /norm
+< lists all the tags that contain "norm", including "id_norm".
+When the argument both exists literally, and match when used as a regexp, a
+literal match has a higher priority. For example, ":tag /open" matches "open"
+before "open_file" and "file_open".
+When using a pattern case is ignored. If you want to match case use "\C" in
+the pattern.
+
+ *tag-!*
+If the tag is in the current file this will always work. Otherwise the
+performed actions depend on whether the current file was changed, whether a !
+is added to the command and on the 'autowrite' option:
+
+ tag in file autowrite ~
+current file changed ! option action ~
+-----------------------------------------------------------------------------
+ yes x x x goto tag
+ no no x x read other file, goto tag
+ no yes yes x abandon current file, read other file, goto
+ tag
+ no yes no on write current file, read other file, goto
+ tag
+ no yes no off fail
+-----------------------------------------------------------------------------
+
+- If the tag is in the current file, the command will always work.
+- If the tag is in another file and the current file was not changed, the
+ other file will be made the current file and read into the buffer.
+- If the tag is in another file, the current file was changed and a ! is
+ added to the command, the changes to the current file are lost, the other
+ file will be made the current file and read into the buffer.
+- If the tag is in another file, the current file was changed and the
+ 'autowrite' option is on, the current file will be written, the other
+ file will be made the current file and read into the buffer.
+- If the tag is in another file, the current file was changed and the
+ 'autowrite' option is off, the command will fail. If you want to save
+ the changes, use the ":w" command and then use ":tag" without an argument.
+ This works because the tag is put on the stack anyway. If you want to lose
+ the changes you can use the ":tag!" command.
+
+ *tag-security*
+Note that Vim forbids some commands, for security reasons. This works like
+using the 'secure' option for exrc/vimrc files in the current directory. See
+|trojan-horse| and |sandbox|.
+When the {tagaddress} changes a buffer, you will get a warning message:
+ "WARNING: tag command changed a buffer!!!"
+In a future version changing the buffer will be impossible. All this for
+security reasons: Somebody might hide a nasty command in the tags file, which
+would otherwise go unnoticed. Example: >
+ :$d|/tag-function-name/
+
+In Vi the ":tag" command sets the last search pattern when the tag is searched
+for. In Vim this is not done, the previous search pattern is still remembered,
+unless the 't' flag is present in 'cpoptions'.
+
+ *emacs-tags* *emacs_tags* *E430*
+Emacs style tag files are only supported if Vim was compiled with the
+|+emacs_tags| feature enabled. Sorry, there is no explanation about Emacs tag
+files here, it is only supported for backwards compatibility :-).
+
+Lines in Emacs tags files can be very long. Vim only deals with lines of up
+to about 510 bytes. To see whether lines are ignored set 'verbose' to 5 or
+higher. Non-Emacs tags file lines can be any length.
+
+ *tags-option*
+The 'tags' option is a list of file names. Each of these files is searched
+for the tag. This can be used to use a different tags file than the default
+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:
+- '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
+where the current file is (no matter what the current directory is). The idea
+of using "./" is that you can define which tag file is searched first: In the
+current directory ("tags,./tags") or in the directory of the current file
+("./tags,tags").
+
+For example: >
+ :set tags=./tags,tags,/home/user/commontags
+
+In this example the tag will first be searched for in the file "tags" in the
+directory where the current file is. Next the "tags" file in the current
+directory. If it is not found there, then the file "/home/user/commontags"
+will be searched for the tag.
+
+This can be switched off by including the 'd' flag in 'cpoptions', to make
+it Vi compatible. "./tags" will then be the tags file in the current
+directory, instead of the tags file in the directory where the current file
+is.
+
+Instead of the comma a space may be used. Then a backslash is required for
+the space to be included in the string option: >
+ :set tags=tags\ /home/user/commontags
+
+To include a space in a file name use three backslashes. To include a comma
+in a file name use two backslashes. For example, use: >
+ :set tags=tag\\\ file,/home/user/common\\,tags
+
+for the files "tag file" and "/home/user/common,tags". The 'tags' option will
+have the value "tag\ file,/home/user/common\,tags".
+
+If the 'tagrelative' option is on (which is the default) and using a tag file
+in another directory, file names in that tag file are relative to the
+directory where the tag file is.
+
+==============================================================================
+5. Tags file format *tags-file-format* *E431*
+
+ *ctags* *jtags*
+A tags file can be created with an external command, for example "ctags". It
+will contain a tag for each function. Some versions of "ctags" will also make
+a tag for each "#defined" macro, typedefs, enums, etc.
+
+Some programs that generate tags files:
+ctags As found on most Unix systems. Only supports C. Only
+ does the basic work.
+universal ctags A maintained version of ctags based on exuberant
+ ctags. See https://ctags.io.
+ *Exuberant_ctags*
+exuberant ctags This is a very good one. It works for C, C++, Java,
+ Fortran, Eiffel and others. It can generate tags for
+ many items. See http://ctags.sourceforge.net.
+ No new version since 2009.
+etags Connected to Emacs. Supports many languages.
+JTags For Java, in Java. It can be found at
+ http://www.fleiner.com/jtags/.
+ptags.py For Python, in Python. Found in your Python source
+ directory at Tools/scripts/ptags.py.
+ptags For Perl, in Perl. It can be found at
+ http://www.eleves.ens.fr:8080/home/nthiery/Tags/.
+gnatxref For Ada. See http://www.gnuada.org/. gnatxref is
+ part of the gnat package.
+
+
+The lines in the tags file must have one of these two formats:
+
+1. {tagname} {TAB} {tagfile} {TAB} {tagaddress}
+2. {tagname} {TAB} {tagfile} {TAB} {tagaddress} {term} {field} ..
+
+Previously an old format was supported, see |tag-old-static|.
+
+The first format is a normal tag, which is completely compatible with Vi. It
+is the only format produced by traditional ctags implementations. This is
+often used for functions that are global, also referenced in other files.
+
+The lines in the tags file can end in <NL> or <CR><NL>. On the Macintosh <CR>
+also works. The <CR> and <NL> characters can never appear inside a line.
+
+The second format is new. It includes additional information in optional
+fields at the end of each line. It is backwards compatible with Vi. It is
+only supported by new versions of ctags (such as Universal ctags or Exuberant
+ctags).
+
+{tagname} The identifier. Normally the name of a function, but it can
+ be any identifier. It cannot contain a <Tab>.
+{TAB} One <Tab> character. Note: previous versions allowed any
+ white space here. This has been abandoned to allow spaces in
+ {tagfile}.
+{tagfile} The file that contains the definition of {tagname}. It can
+ have an absolute or relative path. It may contain environment
+ variables and wildcards (although the use of wildcards is
+ doubtful). It cannot contain a <Tab>.
+{tagaddress} The Ex command that positions the cursor on the tag. It can
+ be any Ex command, although restrictions apply (see
+ |tag-security|). Posix only allows line numbers and search
+ commands, which are mostly used.
+{term} ;" The two characters semicolon and double quote. This is
+ interpreted by Vi as the start of a comment, which makes the
+ following be ignored. This is for backwards compatibility
+ with Vi, it ignores the following fields. Example:
+ APP file /^static int APP;$/;" v
+ When {tagaddress} is not a line number or search pattern, then
+ {term} must be |;". Here the bar ends the command (excluding
+ the bar) and ;" is used to have Vi ignore the rest of the
+ line. Example:
+ APP file.c call cursor(3, 4)|;" v
+
+{field} .. A list of optional fields. Each field has the form:
+
+ <Tab>{fieldname}:{value}
+
+ The {fieldname} identifies the field, and can only contain
+ alphabetical characters [a-zA-Z].
+ The {value} is any string, but cannot contain a <Tab>.
+ These characters are special:
+ "\t" stands for a <Tab>
+ "\r" stands for a <CR>
+ "\n" stands for a <NL>
+ "\\" stands for a single '\' character
+
+ There is one field that doesn't have a ':'. This is the kind
+ of the tag. It is handled like it was preceded with "kind:".
+ See the documentation of ctags for the kinds it produces.
+
+ The only other field currently recognized by Vim is "file:"
+ (with an empty value). It is used for a static tag.
+
+
+The first lines in the tags file can contain lines that start with
+ !_TAG_
+These are sorted to the first lines, only rare tags that start with "!" can
+sort to before them. Vim recognizes two items. The first one is the line
+that indicates if the file was sorted. When this line is found, Vim uses
+binary searching for the tags file:
+ !_TAG_FILE_SORTED<Tab>1<Tab>{anything} ~
+
+A tag file may be case-fold sorted to avoid a linear search when case is
+ignored. (Case is ignored when 'ignorecase' is set and 'tagcase' is
+"followic", or when 'tagcase' is "ignore".) See 'tagbsearch' for details.
+The value '2' should be used then:
+ !_TAG_FILE_SORTED<Tab>2<Tab>{anything} ~
+
+The other tag that Vim recognizes is the encoding of the tags file:
+ !_TAG_FILE_ENCODING<Tab>utf-8<Tab>{anything} ~
+Here "utf-8" is the encoding used for the tags. Vim will then convert the tag
+being searched for from 'encoding' to the encoding of the tags file. And when
+listing tags the reverse happens. When the conversion fails the unconverted
+tag is used.
+
+ *tag-search*
+The command can be any Ex command, but often it is a search command.
+Examples:
+ tag1 file1 /^main(argc, argv)/ ~
+ tag2 file2 108 ~
+
+The command is always executed with 'magic' not set. The only special
+characters in a search pattern are "^" (begin-of-line) and "$" (<EOL>).
+See |pattern|. Note that you must put a backslash before each backslash in
+the search text. This is for backwards compatibility with Vi.
+
+ *E434* *E435*
+If the command is a normal search command (it starts and ends with "/" or
+"?"), some special handling is done:
+- Searching starts on line 1 of the file.
+ The direction of the search is forward for "/", backward for "?".
+ Note that 'wrapscan' does not matter, the whole file is always searched.
+- If the search fails, another try is done ignoring case. If that fails too,
+ a search is done for:
+ "^tagname[ \t]*("
+ (the tag with '^' prepended and "[ \t]*(" appended). When using function
+ names, this will find the function name when it is in column 0. This will
+ help when the arguments to the function have changed since the tags file was
+ made. If this search also fails another search is done with:
+ "^[#a-zA-Z_].*\<tagname[ \t]*("
+ This means: A line starting with '#' or an identifier and containing the tag
+ followed by white space and a '('. This will find macro names and function
+ names with a type prepended.
+
+
+ *tag-old-static*
+Until March 2019 (patch 8.1.1092) an outdated format was supported:
+ {tagfile}:{tagname} {TAB} {tagfile} {TAB} {tagaddress}
+
+This format is for a static tag only. It is obsolete now, replaced by
+the second format. It is only supported by Elvis 1.x, older Vim versions and
+a few versions of ctags. A static tag is often used for functions that are
+local, only referenced in the file {tagfile}. Note that for the static tag,
+the two occurrences of {tagfile} must be exactly the same. Also see
+|tags-option| below, for how static tags are used.
+
+The support was removed, since when you can update to the new Vim version you
+should also be able to update ctags to one that supports the second format.
+
+==============================================================================
+6. Include file searches *include-search* *definition-search*
+ *E387* *E388* *E389*
+
+These commands look for a string in the current file and in all encountered
+included files (recursively). This can be used to find the definition of a
+variable, function or macro. If you only want to search in the current
+buffer, use the commands listed at |pattern-searches|.
+
+These commands are not available when the |+find_in_path| feature was disabled
+at compile time.
+
+When a line is encountered that includes another file, that file is searched
+before continuing in the current buffer. Files included by included files are
+also searched. When an include file could not be found it is silently
+ignored. Use the |:checkpath| command to discover which files could not be
+found, possibly your 'path' option is not set up correctly. Note: the
+included file is searched, not a buffer that may be editing that file. Only
+for the current file the lines in the buffer are used.
+
+The string can be any keyword or a defined macro. For the keyword any match
+will be found. For defined macros only lines that match with the 'define'
+option will be found. The default is "^#\s*define", which is for C programs.
+For other languages you probably want to change this. See 'define' for an
+example for C++. The string cannot contain an end-of-line, only matches
+within a line are found.
+
+When a match is found for a defined macro, the displaying of lines continues
+with the next line when a line ends in a backslash.
+
+The commands that start with "[" start searching from the start of the current
+file. The commands that start with "]" start at the current cursor position.
+
+The 'include' option is used to define a line that includes another file. The
+default is "\^#\s*include", which is for C programs. Note: Vim does not
+recognize C syntax, if the 'include' option matches a line inside
+"#ifdef/#endif" or inside a comment, it is searched anyway. The 'isfname'
+option is used to recognize the file name that comes after the matched
+pattern.
+
+The 'path' option is used to find the directory for the include files that
+do not have an absolute path.
+
+The 'comments' option is used for the commands that display a single line or
+jump to a line. It defines patterns that may start a comment. Those lines
+are ignored for the search, unless [!] is used. One exception: When the line
+matches the pattern "^# *define" it is not considered to be a comment.
+
+If you want to list matches, and then select one to jump to, you could use a
+mapping to do that for you. Here is an example: >
+
+ :map <F4> [I:let nr = input("Which one: ")<Bar>exe "normal " .. nr .. "[\t"<CR>
+<
+ *[i*
+[i Display the first line that contains the keyword
+ under the cursor. The search starts at the beginning
+ of the file. Lines that look like a comment are
+ ignored (see 'comments' option). If a count is given,
+ the count'th matching line is displayed, and comment
+ lines are not ignored.
+
+ *]i*
+]i like "[i", but start at the current cursor position.
+
+ *:is* *:isearch*
+:[range]is[earch][!] [count] [/]pattern[/]
+ Like "[i" and "]i", but search in [range] lines
+ (default: whole file).
+ See |:search-args| for [/] and [!].
+
+ *[I*
+[I Display all lines that contain the keyword under the
+ cursor. Filenames and line numbers are displayed
+ for the found lines. The search starts at the
+ beginning of the file.
+
+ *]I*
+]I like "[I", but start at the current cursor position.
+
+ *:il* *:ilist*
+:[range]il[ist][!] [/]pattern[/]
+ Like "[I" and "]I", but search in [range] lines
+ (default: whole file).
+ See |:search-args| for [/] and [!].
+
+ *[_CTRL-I*
+[ CTRL-I Jump to the first line that contains the keyword
+ under the cursor. The search starts at the beginning
+ of the file. Lines that look like a comment are
+ ignored (see 'comments' option). If a count is given,
+ the count'th matching line is jumped to, and comment
+ lines are not ignored.
+
+ *]_CTRL-I*
+] CTRL-I like "[ CTRL-I", but start at the current cursor
+ position.
+
+ *:ij* *:ijump*
+:[range]ij[ump][!] [count] [/]pattern[/]
+ Like "[ CTRL-I" and "] CTRL-I", but search in
+ [range] lines (default: whole file).
+ See |:search-args| for [/] and [!].
+
+CTRL-W CTRL-I *CTRL-W_CTRL-I* *CTRL-W_i*
+CTRL-W i Open a new window, with the cursor on the first line
+ that contains the keyword under the cursor. The
+ search starts at the beginning of the file. Lines
+ that look like a comment line are ignored (see
+ 'comments' option). If a count is given, the count'th
+ matching line is jumped to, and comment lines are not
+ ignored.
+
+ *:isp* *:isplit*
+:[range]isp[lit][!] [count] [/]pattern[/]
+ Like "CTRL-W i" and "CTRL-W i", but search in
+ [range] lines (default: whole file).
+ See |:search-args| for [/] and [!].
+
+ *[d*
+[d Display the first macro definition that contains the
+ macro under the cursor. The search starts from the
+ beginning of the file. If a count is given, the
+ count'th matching line is displayed.
+
+ *]d*
+]d like "[d", but start at the current cursor position.
+
+ *:ds* *:dsearch*
+:[range]ds[earch][!] [count] [/]string[/]
+ Like "[d" and "]d", but search in [range] lines
+ (default: whole file).
+ See |:search-args| for [/] and [!].
+
+ *[D*
+[D Display all macro definitions that contain the macro
+ under the cursor. Filenames and line numbers are
+ displayed for the found lines. The search starts
+ from the beginning of the file.
+
+ *]D*
+]D like "[D", but start at the current cursor position.
+
+ *:dli* *:dlist*
+:[range]dli[st][!] [/]string[/]
+ Like `[D` and `]D`, but search in [range] lines
+ (default: whole file).
+ See |:search-args| for [/] and [!].
+ Note that `:dl` works like `:delete` with the "l"
+ flag, not `:dlist`.
+
+ *[_CTRL-D*
+[ CTRL-D Jump to the first macro definition that contains the
+ keyword under the cursor. The search starts from
+ the beginning of the file. If a count is given, the
+ count'th matching line is jumped to.
+
+ *]_CTRL-D*
+] CTRL-D like "[ CTRL-D", but start at the current cursor
+ position.
+
+ *:dj* *:djump*
+:[range]dj[ump][!] [count] [/]string[/]
+ Like "[ CTRL-D" and "] CTRL-D", but search in
+ [range] lines (default: whole file).
+ See |:search-args| for [/] and [!].
+
+CTRL-W CTRL-D *CTRL-W_CTRL-D* *CTRL-W_d*
+CTRL-W d Open a new window, with the cursor on the first
+ macro definition line that contains the keyword
+ under the cursor. The search starts from the
+ beginning of the file. If a count is given, the
+ count'th matching line is jumped to.
+
+ *:dsp* *:dsplit*
+:[range]dsp[lit][!] [count] [/]string[/]
+ Like "CTRL-W d", but search in [range] lines
+ (default: whole file).
+ See |:search-args| for [/] and [!].
+
+ *:che* *:chec* *:check* *:checkpath*
+:che[ckpath] List all the included files that could not be found.
+
+:che[ckpath]! List all the included files.
+
+ *: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 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: >
+ :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.
+
+==============================================================================
+7. Using 'tagfunc' *tag-function*
+
+It is possible to provide Vim with a function which will generate a list of
+tags used for commands like |:tag|, |:tselect| and Normal mode tag commands
+like |CTRL-]|.
+
+The function used for generating the taglist is specified by setting the
+'tagfunc' option. The function will be called with three arguments:
+ pattern The tag identifier or pattern used during the tag search.
+ flags String containing flags to control the function behavior.
+ info Dict containing the following entries:
+ buf_ffname Full filename which can be used for priority.
+ user_data Custom data String, if stored in the tag
+ stack previously by tagfunc.
+
+Note that in a legacy function "a:" needs to be prepended to the argument name
+when using it.
+
+Currently up to three flags may be passed to the tag function:
+ 'c' The function was invoked by a normal command being processed
+ (mnemonic: the tag function may use the context around the
+ cursor to perform a better job of generating the tag list.)
+ 'i' In Insert mode, the user was completing a tag (with
+ |i_CTRL-X_CTRL-]| or 'completeopt' contains `t`).
+ 'r' The first argument to tagfunc should be interpreted as a
+ |pattern| (see |tag-regexp|), such as when using: >
+ :tag /pat
+< It is also given when completing in insert mode.
+ If this flag is not present, the argument is usually taken
+ literally as the full tag name.
+
+Note that when 'tagfunc' is set, the priority of the tags described in
+|tag-priority| does not apply. Instead, the priority is exactly as the
+ordering of the elements in the list returned by the function.
+ *E987*
+The function should return a List of Dict entries. Each Dict must at least
+include the following entries and each value must be a string:
+ name Name of the tag.
+ filename Name of the file where the tag is defined. It is
+ either relative to the current directory or a full path.
+ cmd Ex command used to locate the tag in the file. This
+ can be either an Ex search pattern or a line number.
+Note that the format is similar to that of |taglist()|, which makes it possible
+to use its output to generate the result.
+The following fields are optional:
+ kind Type of the tag.
+ user_data String of custom data stored in the tag stack which
+ can be used to disambiguate tags between operations.
+
+If the function returns |v:null| instead of a List, a standard tag lookup will
+be performed instead.
+
+It is not allowed to change the tagstack from inside 'tagfunc'. *E986*
+It is not allowed to close a window or change window from inside 'tagfunc'.
+*E1299*
+
+The following is a hypothetical example of a function used for 'tagfunc'. It
+uses the output of |taglist()| to generate the result: a list of tags in the
+inverse order of file names.
+>
+ function TagFunc(pattern, flags, info)
+ function CompareFilenames(item1, item2)
+ let f1 = a:item1['filename']
+ let f2 = a:item2['filename']
+ return f1 >=# f2 ?
+ \ -1 : f1 <=# f2 ? 1 : 0
+ endfunction
+
+ let result = taglist(a:pattern)
+ call sort(result, "CompareFilenames")
+
+ return result
+ endfunc
+ set tagfunc=TagFunc
+<
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt
new file mode 100644
index 0000000..cb4c676
--- /dev/null
+++ b/runtime/doc/term.txt
@@ -0,0 +1,1182 @@
+*term.txt* For Vim version 9.0. Last change: 2023 Jan 15
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Terminal information *terminal-info*
+
+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|.
+
+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|
+
+==============================================================================
+1. Startup *startup-terminal*
+
+When Vim is started a default terminal type is assumed. For the Amiga this is
+a standard CLI window, for MS-Windows the pc terminal, for Unix an ansi
+terminal. A few other terminal types are always available, see below
+|builtin-terms|.
+
+You can give the terminal name with the '-T' Vim argument. If it is not given
+Vim will try to get the name from the TERM environment variable.
+
+ *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|.
+
+On non-Unix systems a termcap is only available if Vim was compiled with
+TERMCAP defined.
+
+ *builtin-terms* *builtin_terms*
+A number of builtin terminals are available. Since patch 9.0.0280 there is no
+difference between Vim versions. You can see a list of available builtin
+terminals in the error message you get for `:set term=xxx` (when not running
+the GUI). Also see |++builtin_terms|.
+
+If the termcap code is included Vim will try to get the strings for the
+terminal you are using from the termcap file and the builtin termcaps. Both
+are always used, if an entry for the terminal you are using is present. Which
+one is used first depends on the 'ttybuiltin' option:
+
+'ttybuiltin' on 1: builtin termcap 2: external termcap
+'ttybuiltin' off 1: external termcap 2: builtin termcap
+
+If an option is missing in one of them, it will be obtained from the other
+one. If an option is present in both, the one first encountered is used.
+
+Which external termcap file is used varies from system to system and may
+depend on the environment variables "TERMCAP" and "TERMPATH". See "man
+tgetent".
+
+Settings depending on terminal *term-dependent-settings*
+
+If you want to set options or mappings, depending on the terminal name, you
+can do this best in your .vimrc. Example: >
+
+ if &term == "xterm"
+ ... xterm maps and settings ...
+ elseif &term =~ "vt10."
+ ... vt100, vt102 maps and settings ...
+ endif
+<
+ *raw-terminal-mode*
+For normal editing the terminal will be put into "raw" mode. The strings
+defined with 't_ti', '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', 't_TE' and 't_ke' will be sent to
+the terminal. On the Amiga, with commands that execute an external command
+(e.g., "!!"), the terminal will be put into Normal mode for a moment. This
+means that you can stop the output to the screen by hitting a printing key.
+Output resumes when you hit <BS>.
+
+Note: When 't_ti' is not empty, Vim assumes that it causes switching to the
+alternate screen. This may slightly change what happens when executing a
+shell command or exiting Vim. To avoid this use 't_TI' and 't_TE' (but make
+sure to add to them, not overwrite).
+
+Vim will try to detect what keyboard protocol the terminal is using with the
+'t_RK' termcap entry. This is sent after 't_TI', but only when there is no
+work to do (no typeahead and no pending commands). That is to avoid the
+response to end up in a shell command or arrive after Vim exits.
+
+ *xterm-bracketed-paste*
+When the 't_BE' option is set then 't_BE' will be sent to the
+terminal when entering "raw" mode and 't_BD' when leaving "raw" mode. The
+terminal is then expected to put 't_PS' before pasted text and 't_PE' after
+pasted text. This way Vim can separate text that is pasted from characters
+that are typed. The pasted text is handled like when the middle mouse button
+is used, it is inserted literally and not interpreted as commands.
+
+When the cursor is in the first column, the pasted text will be inserted
+before it. Otherwise the pasted text is appended after the cursor position.
+This means one cannot paste after the first column. Unfortunately Vim does
+not have a way to tell where the mouse pointer was.
+
+Note that in some situations Vim will not recognize the bracketed paste and
+you will get the raw text. In other situations Vim will only get the first
+pasted character and drop the rest, e.g. when using the "r" command. If you
+have a problem with this, disable bracketed paste by putting this in your
+.vimrc: >
+ set t_BE=
+If this is done while Vim is running the 't_BD' will be sent to the terminal
+to disable bracketed paste.
+
+If |t_PS| or |t_PE| is not set, then |t_BE| will not be used. This is to make
+sure that bracketed paste is not enabled when the escape codes surrounding
+pasted text cannot be recognized.
+
+If your terminal supports bracketed paste, but the options are not set
+automatically, you can try using something like this: >
+
+ if &term =~ "screen"
+ let &t_BE = "\e[?2004h"
+ let &t_BD = "\e[?2004l"
+ exec "set t_PS=\e[200~"
+ exec "set t_PE=\e[201~"
+ endif
+
+The terminfo entries "BE", "BD", "PS" and "PE" were added in ncurses version
+6.4, early 2023, for some terminals. If you have this version then you may
+not have to manually configure your terminal.
+
+ *tmux-integration*
+If you experience issues when running Vim inside tmux, here are a few hints.
+You can comment-out parts if something doesn't work (it may depend on the
+terminal that tmux is running in): >
+
+ if !has('gui_running') && &term =~ '^\%(screen\|tmux\)'
+ " Better mouse support, see :help 'ttymouse'
+ set ttymouse=sgr
+
+ " Enable true colors, see :help xterm-true-color
+ let &termguicolors = v:true
+ let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
+ let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
+
+ " Enable bracketed paste mode, see :help xterm-bracketed-paste
+ let &t_BE = "\<Esc>[?2004h"
+ let &t_BD = "\<Esc>[?2004l"
+ let &t_PS = "\<Esc>[200~"
+ let &t_PE = "\<Esc>[201~"
+
+ " Enable focus event tracking, see :help xterm-focus-event
+ let &t_fe = "\<Esc>[?1004h"
+ let &t_fd = "\<Esc>[?1004l"
+ execute "set <FocusGained>=\<Esc>[I"
+ execute "set <FocusLost>=\<Esc>[O"
+
+ " Enable modified arrow keys, see :help arrow_modifiers
+ execute "silent! set <xUp>=\<Esc>[@;*A"
+ execute "silent! set <xDown>=\<Esc>[@;*B"
+ execute "silent! set <xRight>=\<Esc>[@;*C"
+ execute "silent! set <xLeft>=\<Esc>[@;*D"
+ endif
+<
+ *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.
+
+Some termcap entries assume that the highest bit is always reset. For
+example: The cursor-up entry for the Amiga could be ":ku=\E[A:". But the
+Amiga really sends "\233A". This works fine if the highest bit is reset,
+e.g., when using an Amiga over a serial line. If the cursor keys don't work,
+try the entry ":ku=\233A:".
+
+Some termcap entries have the entry ":ku=\E[A:". But the Amiga really sends
+"\233A". On output "\E[" and "\233" are often equivalent, on input they
+aren't. You will have to change the termcap entry, or change the key code with
+the :set command to fix this.
+
+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.
+
+On the Amiga the recognition of window resizing is activated only when the
+terminal name is "amiga" or "builtin_amiga".
+
+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
+impossible to distinguish a backspace and cursor-left. To avoid this problem
+CTRL-H is never recognized as cursor-left.
+
+ *vt100-cursor-keys* *xterm-cursor-keys*
+Other terminals (e.g., vt100 and xterm) have cursor keys that send <Esc>OA,
+<Esc>OB, etc. Unfortunately these are valid commands in insert mode: Stop
+insert, Open a new line above the new one, start inserting 'A', 'B', etc.
+Instead of performing these commands Vim will erroneously recognize this typed
+key sequence as a cursor key movement. To avoid this and make Vim do what you
+want in either case you could use these settings: >
+ :set notimeout " don't timeout on mappings
+ :set ttimeout " do timeout on terminal key codes
+ :set timeoutlen=100 " timeout after 100 msec
+This requires the key-codes to be sent within 100 msec in order to recognize
+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.
+
+Another special value is a termcap entry ending in "@;*X". This is for cursor
+keys, which either use "CSI X" or "CSI 1 ; modifier X". Thus the "@"
+stands for either "1" if a modifier follows, or nothing.
+ *arrow_modifiers*
+Several terminal emulators (alacritty, gnome, konsole, etc.) send special
+codes for keys with modifiers, but these do not have an entry in the
+termcap/terminfo database. You can make them work by adding a few lines in
+your vimrc. For example, to make the Control modifier work with arrow keys
+for the gnome terminal: >
+ if &term =~ 'gnome'
+ execute "set <xUp>=\<Esc>[@;*A"
+ execute "set <xDown>=\<Esc>[@;*B"
+ execute "set <xRight>=\<Esc>[@;*C"
+ execute "set <xLeft>=\<Esc>[@;*D"
+ endif
+< *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.
+
+ *xterm-terminfo-entries*
+For some time the terminfo entries were insufficient to describe all the
+features tht Vim can use. The builtin xterm termcap entries did have these,
+with the result that several terminals that were similar enough to xterm took
+advantage of these by prefixing "xterm-" to the terminal name in $TERM.
+
+This leads to problems, because quite often these terminals are not 100%
+compatible with xterm. At the start of 2023 several entries have been added
+to the terminfo database to make it possible to use these features without
+using the "xterm" workaround. These are the relevant entries (so far):
+
+ name xterm value description ~
+ RV "\033[>c" Request version |t_RV|
+
+ BE "\033[?2004h" enable bracketed paste mode |t_BE|
+ BD "\033[?2004l" disable bracketed paste mode |t_BD|
+ PS "\033[200~" pasted text start |t_PS|
+ PE "\033[201~" pasted text end |t_PE|
+
+ XM "\033[?1006;1004;1000%?%p1%{1}%=%th%el%;"
+ mouse enable / disable |t_XM|
+
+The "XM" entry includes "1006" to enable SGR style mouse reporting. This
+supports columns above 223. It also includes "1004" which enables focus
+reporting. The t_fe and t_fd entries can be left empty (they don't have
+entries in terminfo/termcap anyway).
+
+ *xterm-kitty* *kitty-terminal*
+The Kitty terminal is a special case. Mainly because it works differently
+from most other terminals, but also because, instead of trying the fit in and
+make it behave like other terminals by default, it dictates how applications
+need to work when using Kitty. This makes it very difficult for Vim to work
+in a Kitty terminal. Some exceptions have been hard coded, but it is not at
+all nice to have to make exceptions for one specific terminal.
+
+One of the problems is that the value for $TERM is set to "xterm-kitty". For
+Vim this is an indication that the terminal is xterm-compatible and the
+builtin xterm termcap entries should be used. Many other terminals depend on
+this. However, Kitty is not fully xterm compatible. The author suggested to
+ignore the "xterm-" prefix and use the terminfo entry anyway, so that is what
+happens now, the builtin xterm termcap entries are not used. However, the
+t_RV is set, otherwise other things would not work, such as automatically
+setting 'ttymouse' to "sgr" (at least until |t_XM| is being used for this).
+
+It is not clear why kitty sets $TERM to "xterm-kitty", the terminal isn't
+really xterm compatible. "kitty" would be more appropriate, but a terminfo
+entry with that name is not widespread.
+
+Note that using the kitty keyboard protocol is a separate feature, see
+|kitty-keyboard-protocol|.
+
+
+==============================================================================
+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', 't_xn' 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 *terminal-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 end of "termcap" mode *t_te* *'t_te'*
+ t_ti put terminal into "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_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 (blink) *t_vs* *'t_vs'*
+ *t_xs* *'t_xs'*
+ t_xs if non-empty, standout not erased by overwriting (hpterm)
+ *t_xn* *'t_xn'*
+ t_xn if non-empty, writing a character at the last screen cell
+ does not cause scrolling
+ 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_AU set underline color (ANSI) *t_AU* *'t_AU'*
+ t_Ce undercurl and underline end *t_Ce* *'t_Ce'*
+ t_Cs undercurl (curly underline) mode *t_Cs* *'t_Cs'*
+ t_Us double underline mode *t_Us* *'t_Us'*
+ t_ds dotted underline mode *t_ds* *'t_ds'*
+ t_Ds dashed underline mode *t_Ds* *'t_Ds'*
+ t_Te strikethrough end *t_Te* *'t_Te'*
+ t_Ts strikethrough mode *t_Ts* *'t_Ts'*
+ 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_GP get window position (Y, X) in pixels *t_GP* *'t_GP'*
+ t_WS set window size (height, width in cells) *t_WS* *'t_WS'*
+ t_VS cursor normally visible (no blink) *t_VS* *'t_VS'*
+ t_SI start insert mode (bar cursor shape) *t_SI* *'t_SI'*
+ t_SR start replace mode (underline cursor shape) *t_SR* *'t_SR'*
+ t_EI end insert or replace mode (block cursor shape) *t_EI* *'t_EI'*
+ |termcap-cursor-shape|
+ t_RV request terminal version string (works for *t_RV* *'t_RV'*
+ xterm and other terminal emulators) The
+ response is stored in |v:termresponse| |xterm-8bit|
+ |'ttymouse'| |xterm-codes|
+ t_XM enable/disable mouse reporting, *t_XM* *'t_XM'*
+ see |mouse-reporting| below
+ t_RK request terminal keyboard protocol state; *t_RK* *'t_RK'*
+ sent after |t_TI|
+ t_u7 request cursor position (for xterm) *t_u7* *'t_u7'*
+ see |'ambiwidth'|
+ The response is stored in |v:termu7resp|
+ t_RF request terminal foreground color *t_RF* *'t_RF'*
+ The response is stored in |v:termrfgresp|
+ t_RB request terminal background color *t_RB* *'t_RB'*
+ The response is stored in |v:termrbgresp|
+ t_8f set foreground color (R, G, B) *t_8f* *'t_8f'*
+ |xterm-true-color|
+ t_8b set background color (R, G, B) *t_8b* *'t_8b'*
+ |xterm-true-color|
+ t_8u set underline color (R, G, B) *t_8u* *'t_8u'*
+ t_BE enable bracketed paste mode *t_BE* *'t_BE'*
+ |xterm-bracketed-paste|
+ t_BD disable bracketed paste mode *t_BD* *'t_BD'*
+ |xterm-bracketed-paste|
+ t_SC set cursor color start *t_SC* *'t_SC'*
+ t_EC set cursor color end *t_EC* *'t_EC'*
+ t_SH set cursor shape *t_SH* *'t_SH'*
+ t_RC request terminal cursor blinking *t_RC* *'t_RC'*
+ The response is stored in |v:termblinkresp|
+ t_RS request terminal cursor style *t_RS* *'t_RS'*
+ The response is stored in |v:termstyleresp|
+ t_ST save window title to stack *t_ST* *'t_ST'*
+ t_RT restore window title from stack *t_RT* *'t_RT'*
+ t_Si save icon text to stack *t_Si* *'t_Si'*
+ t_Ri restore icon text from stack *t_Ri* *'t_Ri'*
+ t_TE end of "raw" mode *t_TE* *'t_TE'*
+ t_TI put terminal into "raw" mode *t_TI* *'t_TI'*
+ t_fe enable focus-event tracking *t_fe* *'t_fe'*
+ |xterm-focus-event|
+ t_fd disable focus-event tracking *t_fd* *'t_fd'*
+ |xterm-focus-event|
+
+Some codes have a start, middle and end part. The start and end are defined
+by the termcap option, the middle part is text.
+ set title text: t_ts {title text} t_fs
+ set icon text: t_IS {icon text} t_IE
+ set cursor color: t_SC {color name} t_EC
+
+t_SH must take one argument:
+ 0, 1 or none blinking block cursor
+ 2 block cursor
+ 3 blinking underline cursor
+ 4 underline cursor
+ 5 blinking vertical bar cursor
+ 6 vertical bar cursor
+
+t_RS is sent only if the response to t_RV has been received. It is not used
+on Mac OS when Terminal.app could be recognized from the termresponse.
+
+ *mouse-reporting*
+Many terminals can report mouse clicks and some can report mouse movement and
+dragging. Vim needs to know what codes are being used for this.
+
+The "XM" terminfo/termcap entry is used for this. Vim also has the 'ttymouse'
+option to specify the mouse protocol being used. See the option for the
+possible values.
+
+If Vim can read the "XM" terminfo/termcap entry then it will be used for
+enabling and disabling the mouse reporting. If it is missing, then the value
+from 'ttymouse' is used to decide how to do this.
+
+If the "XM" entry exists and the first number is "1006" then 'ttymouse' will
+be set to "sgr", unless it was already set earlier.
+
+
+KEY CODES *terminal-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'*
+ <kInsert> keypad insert key
+ 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>*
+
+ t_PS <PasteStart> start of bracketed paste *t_PS* *'t_PS'*
+ |xterm-bracketed-paste|
+ t_PE <PasteEnd> end of bracketed paste *t_PE* *'t_PE'*
+ |xterm-bracketed-paste|
+ <FocusGained> Vim window got focus (internal only)
+ <FocusLost> Vim window lost focus (internal only)
+
+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.
+
+One of the codes that can change is 't_Co', the number of colors. This will
+trigger a redraw. If this is a problem, reset the 'xtermcodes' option as
+early as possible: >
+ set noxtermcodes
+
+Note: Requesting the key codes is only done on startup. If the xterm options
+are changed after Vim has started, the escape sequences may not be recognized
+anymore.
+
+ *xterm-true-color*
+Vim supports using true colors in the terminal (taken from |highlight-guifg|
+and |highlight-guibg|), given that the terminal supports this. To make this
+work the 'termguicolors' option needs to be set.
+See https://github.com/termstandard/colors for a list of terminals that
+support true colors.
+
+For telling the terminal what RGB color to use the |t_8f| and |t_8b| termcap
+entries are used. These are set by default to values that work for most
+terminals. If that does not work for your terminal you can set them manually.
+The default values are set like this: >
+ let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
+ let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
+
+Some terminals accept the same sequences, but with all semicolons replaced by
+colons (this is actually more compatible, but less widely supported): >
+ let &t_8f = "\<Esc>[38:2:%lu:%lu:%lum"
+ let &t_8b = "\<Esc>[48:2:%lu:%lu:%lum"
+
+These options contain printf strings, with |printf()| (actually, its C
+equivalent hence `l` modifier) invoked with the t_ option value and three
+unsigned long integers that may have any value between 0 and 255 (inclusive)
+representing red, green and blue colors respectively.
+
+ *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.
+
+ *xterm-focus-event*
+Some terminals including xterm support the focus event tracking feature.
+If this feature is enabled by the 't_fe' sequence, special key sequences are
+sent from the terminal to Vim every time the terminal gains or loses focus.
+Vim fires focus events (|FocusGained|/|FocusLost|) by handling them accordingly.
+Focus event tracking is disabled by a 't_fd' sequence when exiting "raw" mode.
+If you would like to disable this feature, add the following to your .vimrc:
+ `set t_fd=`
+ `set t_fe=`
+If your terminal does support this but Vim does not recognize the terminal,
+you may have to set the options yourself: >
+ let &t_fe = "\<Esc>[?1004h"
+ let &t_fd = "\<Esc>[?1004l"
+ execute "set <FocusGained>=\<Esc>[I"
+ execute "set <FocusLost>=\<Esc>[O"
+If this causes garbage to show when Vim starts up then it doesn't work.
+
+ *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. Also see 'termguicolors'.
+When the GUI is running 't_Co' is set to 16777216.
+
+ *termcap-cursor-shape* *termcap-cursor-color*
+When Vim enters Insert mode the 't_SI' escape sequence is sent. When Vim
+enters Replace mode the 't_SR' escape sequence is sent if it is set, otherwise
+'t_SI' is sent. When leaving Insert mode or Replace mode 't_EI' is used.
+Note: When 't_EI' is not set then 't_SI' and 't_SR' will not be sent. And
+when 't_SI' or 't_SR' is not set then 't_EI' is sent only once.
+
+This can be used to change the shape or color of the cursor in Insert or
+Replace 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_SR = "\<Esc>]12;red\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.
+
+For Windows Terminal you can use something like this: >
+ " Note: This should be set after `set termguicolors` or `set t_Co=256`.
+ if &term =~ 'xterm' || &term == 'win32'
+ " Use DECSCUSR escape sequences
+ let &t_SI = "\e[5 q" " blink bar
+ let &t_SR = "\e[3 q" " blink underline
+ let &t_EI = "\e[1 q" " blink block
+ let &t_ti ..= "\e[1 q" " blink block
+ let &t_te ..= "\e[0 q" " default (depends on terminal, normally blink block)
+ endif
+
+{not available when compiled without the |+cursorshape| feature}
+
+ *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 and iris-ansi, 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*
+
+[This is about the size of the whole window Vim is using, not a window that is
+created with the ":split" command.]
+
+If you are running Vim on an Amiga and the terminal name is "amiga" or
+"builtin_amiga", the amiga-specific window resizing will be enabled. 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"
+
+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*
+:mod[e] [mode]
+
+Without argument this only detects the screen size and redraws the screen.
+[mode] was used on MS-DOS, but it doesn't work anymore. In |Vim9| this
+command is not supported.
+
+==============================================================================
+4. 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 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 your terminal does not support a scrolling region, but it does support
+insert/delete line commands, scrolling with multiple windows may make the
+lines jump up and down. This would happen if the 'ttyfast' option has been
+reset. Check that with: >
+ verbose set ttyfast?
+
+If your terminal scrolls very slowly, but redrawing is not slow, set the
+'ttyscroll' option to a small number, e.g., 3. This will make Vim redraw the
+screen instead of scrolling, when there are more than 3 lines to be scrolled.
+
+If you are using a color terminal that is slow, 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. This makes the screen updating a lot slower,
+making it possible to see what is happening.
+
+==============================================================================
+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|.
+
+Don't forget to enable the mouse with this command: >
+ :set mouse=a
+Otherwise Vim won't recognize the mouse in all modes (See 'mouse').
+
+Currently the mouse is supported for Unix in an xterm window, in a *BSD
+console with |sysmouse|, in a Linux console (with GPM |gpm-mouse|), and
+in a Windows console.
+Mouse clicks can be used to position the cursor, select an area and paste.
+
+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
+
+The default for 'mouse' is empty, the mouse is not used. Normally you would
+do: >
+ :set mouse=a
+to start using the mouse (this is equivalent to setting 'mouse' to "nvich").
+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.
+ *terminal-mouse*
+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.
+
+For terminals where it is not possible to have the mouse events be used by the
+terminal itself by using a modifier, a workaround is to not use mouse events
+for Vim in command-line mode: >
+ :set mouse=nvi
+Then to select text with the terminal, use ":" to go to command-line mode,
+select and copy the text to the system, then press Esc.
+
+Another way is to temporarily use ":sh" to run a shell, copy the text, then
+exit the shell. 'mouse' can remain set to "a" then.
+ *xterm-clipboard*
+In the Motif GUI version, when running in a terminal and there is
+access to the X-server (DISPLAY is set), the copy and paste will behave like
+in the GUI. If not, 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.
+
+Note: When the |-X| command line argument is used, Vim will not connect to the
+X server and copy/paste to the X clipboard (selection) will not work. Use the
+shift key with the mouse buttons to let the xterm do the selection.
+
+ *xterm-command-server*
+When the X-server clipboard is available, the command server described in
+|x11-clientserver| can be enabled with the --servername command line argument.
+
+ *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|. Also see |'ttymouse'|.
+
+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")
+
+ *mouse-mode-table* *mouse-overview*
+A short overview of what the mouse buttons do, when 'mousemodel' is "extend":
+
+Normal Mode:
+event position selection change action ~
+ cursor window ~
+<LeftMouse> yes end yes
+<C-LeftMouse> yes end yes "CTRL-]" (2)
+<S-LeftMouse> yes no change yes "*" (2) *<S-LeftMouse>*
+<LeftDrag> yes start or extend (1) no *<LeftDrag>*
+<LeftRelease> yes start or extend (1) no
+<MiddleMouse> yes if not active no put
+<MiddleMouse> yes if active no yank and put
+<RightMouse> yes start or extend yes
+<A-RightMouse> yes start or extend blockw. yes *<A-RightMouse>*
+<S-RightMouse> yes no change yes "#" (2) *<S-RightMouse>*
+<C-RightMouse> no no change no "CTRL-T"
+<RightDrag> yes extend no *<RightDrag>*
+<RightRelease> yes extend no *<RightRelease>*
+
+Insert or Replace Mode:
+event position selection change action ~
+ cursor window ~
+<LeftMouse> yes (cannot be active) yes
+<C-LeftMouse> yes (cannot be active) yes "CTRL-O^]" (2)
+<S-LeftMouse> yes (cannot be active) yes "CTRL-O*" (2)
+<LeftDrag> yes start or extend (1) no like CTRL-O (1)
+<LeftRelease> yes start or extend (1) no like CTRL-O (1)
+<MiddleMouse> no (cannot be active) no put register
+<RightMouse> yes start or extend yes like CTRL-O
+<A-RightMouse> yes start or extend blockw. yes
+<S-RightMouse> yes (cannot be active) yes "CTRL-O#" (2)
+<C-RightMouse> no (cannot be active) no "CTRL-O CTRL-T"
+
+In a help window:
+event position selection change action ~
+ cursor window ~
+<2-LeftMouse> yes (cannot be active) no "^]" (jump to help tag)
+
+When 'mousemodel' is "popup", these are different:
+
+Normal Mode:
+event position selection change action ~
+ cursor window ~
+<S-LeftMouse> yes start or extend (1) no
+<A-LeftMouse> yes start or extend blockw. no *<A-LeftMouse>*
+<RightMouse> no popup menu no
+
+Insert or Replace Mode:
+event position selection change action ~
+ cursor window ~
+<S-LeftMouse> yes start or extend (1) no like CTRL-O (1)
+<A-LeftMouse> yes start or extend blockw. no
+<RightMouse> no popup menu no
+
+(1) only if mouse pointer moved since press
+(2) only if click is in same buffer
+
+Clicking the left mouse button causes the cursor to be positioned. If the
+click is in another window that window is made the active window. When
+editing the command-line the cursor can only be positioned on the
+command-line. When in Insert mode Vim remains in Insert mode. If 'scrolloff'
+is set, and the cursor is positioned within 'scrolloff' lines from the window
+border, the text is scrolled.
+
+A selection can be started by pressing the left mouse button on the first
+character, moving the mouse to the last character, then releasing the mouse
+button. You will not always see the selection until you release the button,
+only in some versions (GUI, Win32) will the dragging be shown immediately.
+Note that you can make the text scroll by moving the mouse at least one
+character in the first/last line in the window when 'scrolloff' is non-zero.
+
+In Normal, Visual and Select mode clicking the right mouse button causes the
+Visual area to be extended. When 'mousemodel' is "popup", the left button has
+to be used while keeping the shift key pressed. When clicking in a window
+which is editing another buffer, the Visual or Select mode is stopped.
+
+In Normal, Visual and Select mode clicking the right mouse button with the alt
+key pressed causes the Visual area to become blockwise. When 'mousemodel' is
+"popup" the left button has to be used with the alt key. Note that this won't
+work on systems where the window manager consumes the mouse events when the
+alt key is pressed (it may move the window).
+
+ *double-click*
+Double, triple and quadruple clicks are supported when the GUI is active, for
+Win32, and for an xterm (if the gettimeofday() function is available). For
+selecting text, extra clicks extend the selection:
+ click select ~
+ double word or % match *<2-LeftMouse>*
+ triple line *<3-LeftMouse>*
+ quadruple rectangular block *<4-LeftMouse>*
+Exception: In a Help window a double click jumps to help for the word that is
+clicked on.
+A double click on a word selects that word. 'iskeyword' is used to specify
+which characters are included in a word. A double click on a character
+that has a match selects until that match (like using "v%"). If the match is
+an #if/#else/#endif block, the selection becomes linewise.
+For MS-Windows and xterm the time for double clicking can be set with the
+'mousetime' option. For the other systems this time is defined outside of Vim.
+An example, for using a double click to jump to the tag under the cursor: >
+ :map <2-LeftMouse> :exe "tag " .. expand("<cword>")<CR>
+
+Dragging the mouse with a double click (button-down, button-up, button-down
+and then drag) will result in whole words to be selected. This continues
+until the button is released, at which point the selection is per character
+again.
+
+For scrolling with the mouse see |scroll-mouse-wheel|.
+
+ *gpm-mouse*
+The GPM mouse is only supported when the |+mouse_gpm| feature was enabled at
+compile time. The GPM mouse driver (Linux console) does not support quadruple
+clicks.
+
+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".
+ *sysmouse*
+The sysmouse is only supported when the |+mouse_sysmouse| feature was enabled
+at compile time. The sysmouse driver (*BSD console) does not support keyboard
+modifiers.
+
+ *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:
+ code mouse button normal action ~
+ <LeftMouse> left pressed set cursor position
+ <LeftDrag> left moved while pressed extend selection
+ <LeftRelease> left released set selection end
+ <MiddleMouse> middle pressed paste text at cursor position
+ <MiddleDrag> middle moved while pressed -
+ <MiddleRelease> middle released -
+ <RightMouse> right pressed extend selection
+ <RightDrag> right moved while pressed extend selection
+ <RightRelease> right released set selection end
+ <X1Mouse> X1 button pressed - *X1Mouse*
+ <X1Drag> X1 moved while pressed - *X1Drag*
+ <X1Release> X1 button release - *X1Release*
+ <X2Mouse> X2 button pressed - *X2Mouse*
+ <X2Drag> X2 moved while pressed - *X2Drag*
+ <X2Release> X2 button release - *X2Release*
+
+The X1 and X2 buttons refer to the extra buttons found on some mice. The
+'Microsoft Explorer' mouse has these buttons available to the right thumb.
+Currently X1 and X2 only work on Win32 and X11 environments.
+
+Examples: >
+ :noremap <MiddleMouse> <LeftMouse><MiddleMouse>
+Paste at the position of the middle mouse button click (otherwise the paste
+would be done at the cursor position). >
+
+ :noremap <LeftRelease> <LeftRelease>y
+Immediately yank the selection, when using Visual mode.
+
+Note the use of ":noremap" instead of "map" to avoid a recursive mapping.
+>
+ :map <X1Mouse> <C-O>
+ :map <X2Mouse> <C-I>
+Map the X1 and X2 buttons to go forwards and backwards in the jump list, see
+|CTRL-O| and |CTRL-I|.
+
+ *mouse-swap-buttons*
+To swap the meaning of the left and right mouse buttons: >
+ :noremap <LeftMouse> <RightMouse>
+ :noremap <LeftDrag> <RightDrag>
+ :noremap <LeftRelease> <RightRelease>
+ :noremap <RightMouse> <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>
+<
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/terminal.txt b/runtime/doc/terminal.txt
new file mode 100644
index 0000000..7bd062f
--- /dev/null
+++ b/runtime/doc/terminal.txt
@@ -0,0 +1,1569 @@
+*terminal.txt* For Vim version 9.0. Last change: 2022 Nov 10
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Terminal window support *terminal* *terminal-window*
+
+
+The terminal feature is optional, use this to check if your Vim has it: >
+ echo has('terminal')
+If the result is "1" you have it.
+
+
+1. Basic use |terminal-use|
+ Typing |terminal-typing|
+ Size and color |terminal-size-color|
+ Command syntax |:terminal|
+ Resizing |terminal-resizing|
+ Terminal Modes |Terminal-mode|
+ Cursor style |terminal-cursor-style|
+ Session |terminal-session|
+ Special keys |terminal-special-keys|
+ Unix |terminal-unix|
+ MS-Windows |terminal-ms-windows|
+2. Terminal functions |terminal-function-details|
+3. Terminal communication |terminal-communication|
+ Vim to job: term_sendkeys() |terminal-to-job|
+ Job to Vim: JSON API |terminal-api|
+ Using the client-server feature |terminal-client-server|
+4. Remote testing |terminal-testing|
+5. Diffing screen dumps |terminal-diff|
+ Writing a screen dump test for Vim |terminal-dumptest|
+ Creating a screen dump |terminal-screendump|
+ Comparing screen dumps |terminal-diffscreendump|
+6. Debugging |terminal-debug|
+ Starting |termdebug-starting|
+ Example session |termdebug-example|
+ Stepping through code |termdebug-stepping|
+ Inspecting variables |termdebug-variables|
+ Other commands |termdebug-commands|
+ Events |termdebug-events|
+ Prompt mode |termdebug-prompt|
+ Communication |termdebug-communication|
+ Customizing |termdebug-customizing|
+
+{only available when compiled with the |+terminal| feature}
+The terminal feature requires the |+job| and |+channel| features.
+
+==============================================================================
+1. Basic use *terminal-use*
+
+This feature is for running a terminal emulator in a Vim window. A job can be
+started connected to the terminal emulator. For example, to run a shell: >
+ :term bash
+
+Or to run build command: >
+ :term make myprogram
+
+The job runs asynchronously from Vim, the window will be updated to show
+output from the job, also while editing in another window.
+
+
+Typing ~
+ *terminal-typing*
+When the keyboard focus is in the terminal window, typed keys will be sent to
+the job. This uses a pty when possible. You can click outside of the
+terminal window to move keyboard focus elsewhere.
+
+ *t_CTRL-W_CTRL-W* *t_CTRL-W_:*
+CTRL-W can be used to navigate between windows and other CTRL-W commands, e.g.:
+ CTRL-W CTRL-W move focus to the next window
+ CTRL-W : enter an Ex command
+See |CTRL-W| for more commands.
+
+Special in the terminal window: *t_CTRL-W_.* *t_CTRL-W_N*
+ CTRL-W . send a CTRL-W to the job in the terminal
+ CTRL-W CTRL-\ send a CTRL-\ to the job in the terminal
+ CTRL-W N go to Terminal-Normal mode, see |Terminal-mode|
+ CTRL-\ CTRL-N go to Terminal-Normal mode, see |Terminal-mode|
+ CTRL-W " {reg} paste register {reg} *t_CTRL-W_quote*
+ Also works with the = register to insert the result of
+ evaluating an expression.
+ CTRL-W CTRL-C ends the job, see below |t_CTRL-W_CTRL-C|
+ CTRL-W gt go to next tabpage, same as `gt` *t_CTRL-W_gt*
+ CTRL-W gT go to previous tabpage, same as `gT` *t_CTRL-W_gT*
+
+See option 'termwinkey' for specifying another key instead of CTRL-W that
+will work like CTRL-W. However, typing 'termwinkey' twice sends 'termwinkey'
+to the job. For example:
+ 'termwinkey' CTRL-W move focus to the next window
+ 'termwinkey' : enter an Ex command
+ 'termwinkey' 'termwinkey' send 'termwinkey' to the job in the terminal
+ 'termwinkey' . send 'termwinkey' to the job in the terminal
+ 'termwinkey' CTRL-\ send a CTRL-\ to the job in the terminal
+ 'termwinkey' N go to terminal Normal mode, see below
+ 'termwinkey' CTRL-N same as CTRL-W N |t_CTRL-W_N|
+ 'termwinkey' CTRL-C same as CTRL-W CTRL-C |t_CTRL-W_CTRL-C|
+ *t_CTRL-\_CTRL-N*
+The special key combination CTRL-\ CTRL-N can be used to switch to Normal
+mode, just like this works in any other mode.
+ *t_CTRL-W_CTRL-C*
+CTRL-W CTRL-C can be typed to forcefully end the job. On MS-Windows a
+CTRL-Break will also kill the job.
+
+If you type CTRL-C the effect depends on what the pty has been configured to
+do. For simple commands this causes a SIGINT to be sent to the job, which
+would end it. Other commands may ignore the SIGINT or handle the CTRL-C
+themselves (like Vim does).
+
+To change the keys you type use terminal mode mappings, see |:tmap|.
+These are defined like any mapping, but apply only when typing keys that are
+sent to the job running in the terminal. For example, to make F1 switch
+to Terminal-Normal mode: >
+ tnoremap <F1> <C-W>N
+You can use Esc, but you need to make sure it won't cause other keys to
+break (cursor keys start with an Esc, so they may break), this probably only
+works in the GUI: >
+ tnoremap <Esc> <C-W>N
+ set notimeout ttimeout timeoutlen=100
+
+You can also create menus similar to terminal mode mappings, but you have to
+use |:tlmenu| instead of |:tmenu|.
+
+ *options-in-terminal*
+After opening the terminal window and setting 'buftype' to "terminal" the
+|TerminalWinOpen| autocommand event is triggered. This makes it possible to set
+options specifically for the terminal window and buffer. Example: >
+ au TerminalWinOpen * setlocal bufhidden=hide
+This only works properly if the terminal is not hidden.
+
+For both hidden and non-hidden terminals this works, both for buffer-local and
+window-local options: >
+ au TerminalWinOpen,BufWinEnter * if &buftype == 'terminal'
+ \ | setlocal bufhidden=hide colorcolumn=123
+ \ | endif
+Note that for a hidden terminal the options are not set until the terminal is
+no longer hidden.
+
+There is also the |TerminalOpen| event. Keep in mind this may be triggered
+for a hidden terminal, then the current window and buffer are not that of the
+new terminal.
+You need to use <abuf>, which is set to the terminal buffer. Example: >
+ au TerminalOpen * call setbufvar(expand('<abuf>')->str2nr(),
+ \ '&termwinscroll', 1000)
+For a window-local option, you need to delay setting the option until the
+terminal window has been created (this only works for a hidden terminal): >
+ au TerminalOpen * exe printf(
+ \ 'au BufWinEnter <buffer=%d> ++once setlocal colorcolumn=%d',
+ \ expand('<abuf>')->str2nr(), 123)
+For a non-hidden terminal use |TerminalWinOpen|.
+
+Mouse events (click and drag) are passed to the terminal. Mouse move events
+are only passed when Vim itself is receiving them. For a terminal that is
+when 'balloonevalterm' is enabled.
+
+
+Size and color ~
+ *terminal-size-color*
+See option 'termwinsize' for controlling the size of the terminal window.
+(TODO: scrolling when the terminal is larger than the window)
+
+The job running in the terminal can change the colors. The default foreground
+and background colors are taken from Vim, the Normal highlight group.
+
+For a color terminal the 'background' option is used to decide whether the
+terminal window will start with a white or black background.
+
+To use a different color the Terminal highlight group can be used, for
+example: >
+ hi Terminal ctermbg=lightgrey ctermfg=blue guibg=lightgrey guifg=blue
+Instead of Terminal another group can be specified with the "term_highlight"
+option for `term_start()`.
+
+ *g:terminal_ansi_colors*
+In GUI mode or with 'termguicolors', the 16 ANSI colors used by default in new
+terminal windows may be configured using the variable
+`g:terminal_ansi_colors`, which should be a list of 16 color names or
+hexadecimal color codes, similar to those accepted by |highlight-guifg|. When
+not using GUI colors, the terminal window always uses the 16 ANSI colors of
+the underlying terminal.
+When using `term_start()` the colors can be set with the "ansi_colors" option.
+The |term_setansicolors()| function can be used to change the colors, and
+|term_getansicolors()| to get the currently used colors.
+
+
+Command syntax ~
+
+:[range]ter[minal] [options] [command] *:ter* *:terminal*
+ Open a new terminal window.
+
+ If [command] is provided run it as a job and connect
+ the input and output to the terminal.
+ If [command] is not given the 'shell' option is used.
+ if [command] is NONE no job is started, the pty of the
+ terminal can be used by a command like gdb.
+
+ If [command] is missing the default behavior is to
+ close the terminal when the shell exits. This can be
+ changed with the ++noclose argument.
+ If [command] is present the default behavior is to
+ keep the terminal open in Terminal-Normal mode. This
+ can be changed with the ++close argument.
+
+ No Vim command can follow, any | is included in
+ [command]. Use `:execute` if you must have a Vim
+ command following in the same line.
+
+ A new buffer will be created, using [command] or
+ 'shell' as the name, prefixed with a "!". If a buffer
+ by this name already exists a number is added in
+ parentheses. E.g. if "gdb" exists the second terminal
+ buffer will use "!gdb (1)".
+
+ If [range] is given the specified lines are used as
+ input for the job. It will not be possible to type
+ keys in the terminal window. For MS-Windows see the
+ ++eof argument below.
+
+ *term++close* *term++open*
+ Supported [options] are:
+ ++close The terminal window will close
+ automatically when the job terminates.
+ |terminal-close|
+ ++noclose The terminal window will NOT close
+ automatically when the job terminates.
+ ++open When the job terminates and no window
+ shows it, a window will be opened.
+ Note that this can be interruptive.
+ The last of ++close, ++noclose and ++open
+ matters and rules out earlier arguments.
+
+ ++curwin Open the terminal in the current
+ window, do not split the current
+ window. Fails if the current buffer
+ cannot be |abandon|ed.
+ ++hidden Open the terminal in a hidden buffer,
+ no window will be used.
+ ++norestore Do not include this terminal window
+ in a session file.
+ ++shell Instead of executing {command}
+ directly, use a shell, like with
+ `:!command` *E279*
+ {only works on Unix and MS-Windows}
+ ++kill={how} When trying to close the terminal
+ window kill the job with {how}. See
+ |term_setkill()| for the values.
+ ++rows={height} Use {height} for the terminal window
+ height. If the terminal uses the full
+ Vim height (no window above or below
+ the terminal window) the command line
+ height will be reduced as needed.
+ ++cols={width} Use {width} for the terminal window
+ width. If the terminal uses the full
+ Vim width (no window left or right of
+ the terminal window) this value is
+ ignored.
+ ++eof={text} When using [range]: text to send after
+ the last line was written. Cannot
+ contain white space. A CR is
+ appended. For MS-Windows the default
+ is to send CTRL-D.
+ E.g. for a shell use "++eof=exit" and
+ for Python "++eof=exit()". Special
+ codes can be used like with `:map`,
+ e.g. "<C-Z>" for CTRL-Z.
+ ++type={pty} (MS-Windows only): Use {pty} as the
+ virtual console. See 'termwintype'
+ for the values.
+ ++api={expr} Permit the function name starting with
+ {expr} to be called as |terminal-api|
+ function. If {expr} is empty then no
+ function can be called.
+
+ If you want to use more options use the |term_start()|
+ function.
+ If you want to split the window vertically, use: >
+ :vertical terminal
+< Or short: >
+ :vert ter
+
+When the buffer associated with the terminal is forcibly unloaded or wiped out
+the job is killed, similar to calling `job_stop(job, "kill")` .
+Closing the window normally results in |E947|. When a kill method was set
+with "++kill={how}" or |term_setkill()| then closing the window will use that
+way to kill or interrupt the job. For example: >
+ :term ++kill=term tail -f /tmp/log
+
+So long as the job is running the window behaves like it contains a modified
+buffer. Trying to close the window with `CTRL-W :quit` fails. When using
+`CTRL-W :quit!` the job is ended. The text in the window is lost, the buffer
+is deleted. With `CTRL-W :bunload!` the buffer remains but will be empty.
+
+Trying to close the window with `CTRL-W :close` also fails. Using
+`CTRL-W :close!` will close the window and make the buffer hidden.
+
+You can use `CTRL-W :hide` to close the terminal window and make the buffer
+hidden, the job keeps running. The `:buffer` command can be used to turn the
+current window into a terminal window. If there are unsaved changes this
+fails, use ! to force, as usual.
+
+ *terminal-close*
+When the terminal window is closed, e.g. when the shell exits and "++close"
+argument was used, and this is the last normal Vim window, then Vim will exit.
+This is like using |:quit| in a normal window. Help and preview windows are
+not counted.
+
+To have a background job run without a window, and open the window when it's
+done, use options like this: >
+ :term ++hidden ++open make
+Note that the window will open at an unexpected moment, this will interrupt
+what you are doing.
+
+ *E947* *E948*
+So long as the job is running, the buffer is considered modified and Vim
+cannot be quit easily, see |abandon|.
+
+When the job has finished and no changes were made to the buffer: closing the
+window will wipe out the buffer.
+
+Before changes can be made to a terminal buffer, the 'modifiable' option must
+be set. This is only possible when the job has finished. At the first change
+the buffer will become a normal buffer and the highlighting is removed.
+You may want to change the buffer name with |:file| to be able to write, since
+the buffer name will still be set to the command.
+
+
+Resizing ~
+ *terminal-resizing*
+The size of the terminal can be in one of three modes:
+
+1. The 'termwinsize' option is empty: The terminal size follows the window
+ size. The minimal size is 2 screen lines with 10 cells.
+
+2. The 'termwinsize' option is "rows*cols", where "rows" is the minimal number
+ of screen rows and "cols" is the minimal number of cells.
+
+3. The 'termwinsize' option is "rowsXcols" (where the x is upper or lower
+ case). The terminal size is fixed to the specified number of screen lines
+ and cells. If the window is bigger there will be unused empty space.
+
+If the window is smaller than the terminal size, only part of the terminal can
+be seen (the lower-left part).
+
+The |term_getsize()| function can be used to get the current size of the
+terminal. |term_setsize()| can be used only when in the first or second mode,
+not when 'termwinsize' is "rowsXcols".
+
+
+Terminal-Job and Terminal-Normal mode ~
+ *Terminal-mode* *Terminal-Job*
+When the job is running the contents of the terminal is under control of the
+job. That includes the cursor position. Typed keys are sent to the job.
+The terminal contents can change at any time. This is called Terminal-Job
+mode.
+
+Use CTRL-W N (or 'termwinkey' N) to switch to Terminal-Normal mode. Now the
+contents of the terminal window is under control of Vim, the job output is
+suspended. CTRL-\ CTRL-N does the same.
+
+Terminal-Job mode is where |:tmap| mappings are applied. Keys sent by
+|term_sendkeys()| are not subject to tmap, but keys from |feedkeys()| are.
+
+It is not possible to enter Insert mode from Terminal-Job mode.
+
+ *Terminal-Normal* *E946*
+In Terminal-Normal mode you can move the cursor around with the usual Vim
+commands, Visually mark text, yank text, etc. But you cannot change the
+contents of the buffer. The commands that would start insert mode, such as
+'i' and 'a', return to Terminal-Job mode. The window will be updated to show
+the contents of the terminal. |:startinsert| is ineffective.
+
+In Terminal-Normal mode the statusline and window title show "(Terminal)". If
+the job ends while in Terminal-Normal mode this changes to
+"(Terminal-finished)".
+
+When the job outputs lines in the terminal, such that the contents scrolls off
+the top, those lines are remembered and can be seen in Terminal-Normal mode.
+The number of lines is limited by the 'termwinscroll' option. When going over
+this limit, the first 10% of the scrolled lines are deleted and are lost.
+
+
+Cursor style ~
+ *terminal-cursor-style*
+By default the cursor in the terminal window uses a not blinking block. The
+normal xterm escape sequences can be used to change the blinking state and the
+shape. Once focus leaves the terminal window Vim will restore the original
+cursor.
+
+An exception is when xterm is started with the "-bc" argument, or another way
+that causes the cursor to blink. This actually means that the blinking flag
+is inverted. Since Vim cannot detect this, the terminal window cursor
+blinking will also be inverted.
+
+
+Session ~
+ *terminal-session*
+A terminal window will be restored when using a session file, if possible and
+wanted.
+
+If "terminal" was removed from 'sessionoptions' then no terminal windows will
+be restored.
+
+If the job in the terminal was finished the window will not be restored.
+
+If the terminal can be restored, the command that was used to open it will be
+used again. To change this use the |term_setrestore()| function. This can
+also be used to not restore a specific terminal by setting the command to
+"NONE".
+
+
+Special keys ~
+ *terminal-special-keys*
+Since the terminal emulator simulates an xterm, only escape sequences that
+both Vim and xterm recognize will be available in the terminal window. If you
+want to pass on other escape sequences to the job running in the terminal you
+need to set up forwarding. Example: >
+ tmap <expr> <Esc>]b SendToTerm("\<Esc>]b")
+ func SendToTerm(what)
+ call term_sendkeys('', a:what)
+ return ''
+ endfunc
+
+
+Unix ~
+ *terminal-unix*
+On Unix a pty is used to make it possible to run all kinds of commands. You
+can even run Vim in the terminal! That's used for debugging, see below.
+
+Environment variables are used to pass information to the running job:
+ TERM the name of the terminal, from the 'term' option or
+ $TERM in the GUI; falls back to "xterm" if it does not
+ start with "xterm"
+ ROWS number of rows in the terminal initially
+ LINES same as ROWS
+ COLUMNS number of columns in the terminal initially
+ COLORS number of colors, 't_Co' (256*256*256 in the GUI)
+ VIM_SERVERNAME v:servername
+ VIM_TERMINAL v:version
+
+
+MS-Windows ~
+ *terminal-ms-windows*
+On MS-Windows winpty is used to make it possible to run all kind of commands.
+Obviously, they must be commands that run in a terminal, not open their own
+window.
+
+You need the following two files from winpty:
+
+ winpty.dll
+ winpty-agent.exe
+
+You can download them from the following page:
+
+ https://github.com/rprichard/winpty
+
+Just put the files somewhere in your PATH. You can set the 'winptydll' option
+to point to the right file, if needed. If you have both the 32-bit and 64-bit
+version, rename to winpty32.dll and winpty64.dll to match the way Vim was
+build.
+ *ConPTY* *E982*
+On more recent versions of MS-Windows 10 (beginning with the "October 2018
+Update"), winpty is no longer required. On those versions, |:terminal| will use
+Windows' built-in support for hosting terminal applications, "ConPTY". When
+ConPTY is in use, there may be rendering artifacts regarding ambiguous-width
+characters. If you encounter any such issues, install "winpty". Until the
+ConPTY problems have been fixed "winpty" will be preferred.
+
+Environment variables are used to pass information to the running job:
+ VIM_SERVERNAME v:servername
+
+==============================================================================
+2. Terminal functions *terminal-function-details*
+
+ *term_dumpdiff()*
+term_dumpdiff({filename}, {filename} [, {options}])
+ Open a new window displaying the difference between the two
+ files. The files must have been created with
+ |term_dumpwrite()|.
+ Returns the buffer number or zero when the diff fails.
+ Also see |terminal-diff|.
+ NOTE: this does not work with double-width characters yet.
+
+ The top part of the buffer contains the contents of the first
+ file, the bottom part of the buffer contains the contents of
+ the second file. The middle part shows the differences.
+ The parts are separated by a line of equals.
+
+ If the {options} argument is present, it must be a Dict with
+ these possible members:
+ "term_name" name to use for the buffer name, instead
+ of the first file name.
+ "term_rows" vertical size to use for the terminal,
+ instead of using 'termwinsize', but
+ respecting the minimal size
+ "term_cols" horizontal size to use for the terminal,
+ instead of using 'termwinsize', but
+ respecting the minimal size
+ "vertical" split the window vertically
+ "curwin" use the current window, do not split the
+ window; fails if the current buffer
+ cannot be |abandon|ed
+ "bufnr" do not create a new buffer, use the
+ existing buffer "bufnr". This buffer
+ must have been previously created with
+ term_dumpdiff() or term_dumpload() and
+ visible in a window.
+ "norestore" do not add the terminal window to a
+ session file
+
+ Each character in the middle part indicates a difference. If
+ there are multiple differences only the first in this list is
+ used:
+ X different character
+ w different width
+ f different foreground color
+ b different background color
+ a different attribute
+ + missing position in first file
+ - missing position in second file
+ > cursor position in first file, not in second
+ < cursor position in second file, not in first
+
+ Using the "s" key the top and bottom parts are swapped. This
+ makes it easy to spot a difference.
+
+ Can also be used as a |method|: >
+ GetFilename()->term_dumpdiff(otherfile)
+<
+ *term_dumpload()*
+term_dumpload({filename} [, {options}])
+ Open a new window displaying the contents of {filename}
+ The file must have been created with |term_dumpwrite()|.
+ Returns the buffer number or zero when it fails.
+ Also see |terminal-diff|.
+
+ For {options} see |term_dumpdiff()|.
+
+ Can also be used as a |method|: >
+ GetFilename()->term_dumpload()
+<
+ *term_dumpwrite()*
+term_dumpwrite({buf}, {filename} [, {options}])
+ Dump the contents of the terminal screen of {buf} in the file
+ {filename}. This uses a format that can be used with
+ |term_dumpload()| and |term_dumpdiff()|.
+ If the job in the terminal already finished an error is given:
+ *E958*
+ If {filename} already exists an error is given: *E953*
+ Also see |terminal-diff|.
+
+ {options} is a dictionary with these optional entries:
+ "rows" maximum number of rows to dump
+ "columns" maximum number of columns to dump
+
+ Can also be used as a |method|, the base is used for the file
+ name: >
+ GetFilename()->term_dumpwrite(bufnr)
+
+term_getaltscreen({buf}) *term_getaltscreen()*
+ Returns 1 if the terminal of {buf} is using the alternate
+ screen.
+ {buf} is used as with |term_getsize()|.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_getaltscreen()
+
+
+term_getansicolors({buf}) *term_getansicolors()*
+ Get the ANSI color palette in use by terminal {buf}.
+ Returns a List of length 16 where each element is a String
+ representing a color in hexadecimal "#rrggbb" format.
+ Also see |term_setansicolors()| and |g:terminal_ansi_colors|.
+ If neither was used returns the default colors.
+
+ {buf} is used as with |term_getsize()|. If the buffer does not
+ exist or is not a terminal window, an empty list is returned.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_getansicolors()
+
+< {only available when compiled with GUI enabled and/or the
+ |+termguicolors| feature}
+
+term_getattr({attr}, {what}) *term_getattr()*
+ Given {attr}, a value returned by term_scrape() in the "attr"
+ item, return whether {what} is on. {what} can be one of:
+ bold
+ italic
+ underline
+ strike
+ reverse
+
+ Can also be used as a |method|: >
+ GetAttr()->term_getattr()
+
+
+term_getcursor({buf}) *term_getcursor()*
+ Get the cursor position of terminal {buf}. Returns a list with
+ two numbers and a dictionary: [row, col, dict].
+
+ "row" and "col" are one based, the first screen cell is row
+ 1, column 1. This is the cursor position of the terminal
+ itself, not of the Vim window.
+
+ "dict" can have these members:
+ "visible" one when the cursor is visible, zero when it
+ is hidden.
+ "blink" one when the cursor is blinking, zero when it
+ is not blinking.
+ "shape" 1 for a block cursor, 2 for underline and 3
+ for a vertical bar.
+ "color" color of the cursor, e.g. "green"
+
+ {buf} must be the buffer number of a terminal window. If the
+ buffer does not exist or is not a terminal window, an empty
+ list is returned.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_getcursor()
+
+term_getjob({buf}) *term_getjob()*
+ Get the Job associated with terminal window {buf}.
+ {buf} is used as with |term_getsize()|.
+ Returns |v:null| when there is no job.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_getjob()
+
+
+term_getline({buf}, {row}) *term_getline()*
+ Get a line of text from the terminal window of {buf}.
+ {buf} is used as with |term_getsize()|.
+
+ The first line has {row} one. When {row} is "." the cursor
+ line is used. When {row} is invalid an empty string is
+ returned.
+
+ To get attributes of each character use |term_scrape()|.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_getline(row)
+
+
+term_getscrolled({buf}) *term_getscrolled()*
+ Return the number of lines that scrolled to above the top of
+ terminal {buf}. This is the offset between the row number
+ used for |term_getline()| and |getline()|, so that: >
+ term_getline(buf, N)
+< is equal to: >
+ getline(N + term_getscrolled(buf))
+< (if that line exists).
+
+ {buf} is used as with |term_getsize()|.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_getscrolled()
+
+
+term_getsize({buf}) *term_getsize()*
+ Get the size of terminal {buf}. Returns a list with two
+ numbers: [rows, cols]. This is the size of the terminal, not
+ the window containing the terminal.
+
+ {buf} must be the buffer number of a terminal window. Use an
+ empty string for the current buffer. If the buffer does not
+ exist or is not a terminal window, an empty list is returned.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_getsize()
+
+
+term_getstatus({buf}) *term_getstatus()*
+ Get the status of terminal {buf}. This returns a String with
+ a comma-separated list of these items:
+ running job is running
+ finished job has finished
+ normal in Terminal-Normal mode
+ One of "running" or "finished" is always present.
+
+ {buf} must be the buffer number of a terminal window. If the
+ buffer does not exist or is not a terminal window, an empty
+ string is returned.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_getstatus()
+
+
+term_gettitle({buf}) *term_gettitle()*
+ Get the title of terminal {buf}. This is the title that the
+ job in the terminal has set.
+
+ {buf} must be the buffer number of a terminal window. If the
+ buffer does not exist or is not a terminal window, an empty
+ string is returned.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_gettitle()
+
+
+term_gettty({buf} [, {input}]) *term_gettty()*
+ Get the name of the controlling terminal associated with
+ terminal window {buf}. {buf} is used as with |term_getsize()|.
+
+ When {input} is omitted or 0, return the name for writing
+ (stdout). When {input} is 1 return the name for reading
+ (stdin). On UNIX, both return same name.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_gettty()
+
+
+term_list() *term_list()*
+ Return a list with the buffer numbers of all buffers for
+ terminal windows.
+
+
+term_scrape({buf}, {row}) *term_scrape()*
+ Get the contents of {row} of terminal screen of {buf}.
+ For {buf} see |term_getsize()|.
+
+ The first line has {row} one. When {row} is "." the cursor
+ line is used. When {row} is invalid an empty string is
+ returned.
+
+ Return a List containing a Dict for each screen cell:
+ "chars" character(s) at the cell
+ "fg" foreground color as #rrggbb
+ "bg" background color as #rrggbb
+ "attr" attributes of the cell, use |term_getattr()|
+ to get the individual flags
+ "width" cell width: 1 or 2
+ For a double-width cell there is one item, thus the list can
+ be shorter than the width of the terminal.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_scrape(row)
+
+
+term_sendkeys({buf}, {keys}) *term_sendkeys()*
+ Send keystrokes {keys} to terminal {buf}.
+ {buf} is used as with |term_getsize()|.
+
+ {keys} are translated as key sequences. For example, "\<c-x>"
+ means the character CTRL-X.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_sendkeys(keys)
+
+
+term_setansicolors({buf}, {colors}) *term_setansicolors()*
+ Set the ANSI color palette used by terminal {buf}.
+ {colors} must be a List of 16 valid color names or hexadecimal
+ color codes, like those accepted by |highlight-guifg|.
+ Also see |term_getansicolors()| and |g:terminal_ansi_colors|.
+
+ The colors normally are:
+ 0 black
+ 1 dark red
+ 2 dark green
+ 3 brown
+ 4 dark blue
+ 5 dark magenta
+ 6 dark cyan
+ 7 light grey
+ 8 dark grey
+ 9 red
+ 10 green
+ 11 yellow
+ 12 blue
+ 13 magenta
+ 14 cyan
+ 15 white
+
+ These colors are used in the GUI and in the terminal when
+ 'termguicolors' is set. When not using GUI colors (GUI mode
+ or 'termguicolors'), the terminal window always uses the 16
+ ANSI colors of the underlying terminal.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_setansicolors(colors)
+
+< {only available with GUI enabled and/or the |+termguicolors|
+ feature}
+
+
+term_setapi({buf}, {expr}) *term_setapi()*
+ Set the function name prefix to be used for the |terminal-api|
+ function in terminal {buf}. For example: >
+ :call term_setapi(buf, "Myapi_")
+ :call term_setapi(buf, "")
+<
+ The default is "Tapi_". When {expr} is an empty string then
+ no |terminal-api| function can be used for {buf}.
+
+ When used as a method the base is used for {buf}: >
+ GetBufnr()->term_setapi({expr})
+
+
+term_setkill({buf}, {how}) *term_setkill()*
+ When exiting Vim or trying to close the terminal window in
+ another way, {how} defines whether the job in the terminal can
+ be stopped.
+ When {how} is empty (the default), the job will not be
+ stopped, trying to exit will result in |E947|.
+ Otherwise, {how} specifies what signal to send to the job.
+ See |job_stop()| for the values.
+
+ After sending the signal Vim will wait for up to a second to
+ check that the job actually stopped.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_setkill(how)
+
+
+term_setrestore({buf}, {command}) *term_setrestore()*
+ Set the command to write in a session file to restore the job
+ in this terminal. The line written in the session file is: >
+ terminal ++curwin ++cols=%d ++rows=%d {command}
+< Make sure to escape the command properly.
+
+ Use an empty {command} to run 'shell'.
+ Use "NONE" to not restore this window.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_setrestore(command)
+
+
+term_setsize({buf}, {rows}, {cols}) *term_setsize()* *E955*
+ Set the size of terminal {buf}. The size of the window
+ containing the terminal will also be adjusted, if possible.
+ If {rows} or {cols} is zero or negative, that dimension is not
+ changed.
+
+ {buf} must be the buffer number of a terminal window. Use an
+ empty string for the current buffer. If the buffer does not
+ exist or is not a terminal window, an error is given.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_setsize(rows, cols)
+
+
+term_start({cmd} [, {options}]) *term_start()*
+ Open a terminal window and run {cmd} in it.
+
+ {cmd} can be a string or a List, like with |job_start()|. The
+ string "NONE" can be used to open a terminal window without
+ starting a job, the pty of the terminal can be used by a
+ command like gdb.
+
+ Returns the buffer number of the terminal window. If {cmd}
+ cannot be executed the window does open and shows an error
+ message.
+ If opening the window fails zero is returned.
+
+ {options} are similar to what is used for |job_start()|, see
+ |job-options|. However, not all options can be used. These
+ are supported:
+ all timeout options
+ "stoponexit", "cwd", "env"
+ "callback", "out_cb", "err_cb", "exit_cb", "close_cb"
+ "in_io", "in_top", "in_bot", "in_name", "in_buf"
+ "out_io", "out_name", "out_buf", "out_modifiable", "out_msg"
+ "err_io", "err_name", "err_buf", "err_modifiable", "err_msg"
+ However, at least one of stdin, stdout or stderr must be
+ connected to the terminal. When I/O is connected to the
+ terminal then the callback function for that part is not used.
+
+ There are extra options:
+ "term_name" name to use for the buffer name, instead
+ of the command name.
+ "term_rows" vertical size to use for the terminal,
+ instead of using 'termwinsize'; valid
+ range is from zero to 1000
+ "term_cols" horizontal size to use for the terminal,
+ instead of using 'termwinsize'
+ "vertical" split the window vertically; note that
+ other window position can be defined with
+ command modifiers, such as |:belowright|.
+ "curwin" use the current window, do not split the
+ window; fails if the current buffer
+ cannot be |abandon|ed
+ "hidden" do not open a window
+ "norestore" do not add the terminal window to a
+ session file
+ "term_kill" what to do when trying to close the
+ terminal window, see |term_setkill()|
+ "term_finish" What to do when the job is finished:
+ "close": close any windows
+ "open": open window if needed
+ Note that "open" can be interruptive.
+ See |term++close| and |term++open|.
+ "term_opencmd" command to use for opening the window when
+ "open" is used for "term_finish"; must
+ have "%d" where the buffer number goes,
+ e.g. "10split|buffer %d"; when not
+ specified "botright sbuf %d" is used
+ "term_highlight" highlight group to use instead of
+ "Terminal"
+ "eof_chars" Text to send after all buffer lines were
+ written to the terminal. When not set
+ CTRL-D is used on MS-Windows. For Python
+ use CTRL-Z or "exit()". For a shell use
+ "exit". A CR is always added.
+ "ansi_colors" A list of 16 color names or hex codes
+ defining the ANSI palette used in GUI
+ color modes. See |g:terminal_ansi_colors|.
+ "tty_type" (MS-Windows only): Specify which pty to
+ use. See 'termwintype' for the values.
+ "term_api" function name prefix for the
+ |terminal-api| function. See
+ |term_setapi()|.
+
+ Can also be used as a |method|: >
+ GetCommand()->term_start()
+
+
+term_wait({buf} [, {time}]) *term_wait()*
+ Wait for pending updates of {buf} to be handled.
+ {buf} is used as with |term_getsize()|.
+ {time} is how long to wait for updates to arrive in msec. If
+ not set then 10 msec will be used.
+
+ Can also be used as a |method|: >
+ GetBufnr()->term_wait()
+
+==============================================================================
+3. Terminal communication *terminal-communication*
+
+There are several ways to communicate with the job running in a terminal:
+- Use |term_sendkeys()| to send text and escape sequences from Vim to the job.
+- Use the JSON API to send encoded commands from the job to Vim.
+- Use the |client-server| mechanism. This works on machines with an X server
+ and on MS-Windows.
+
+
+Vim to job: term_sendkeys() ~
+ *terminal-to-job*
+This allows for remote controlling the job running in the terminal. It is a
+one-way mechanism. The job can update the display to signal back to Vim.
+For example, if a shell is running in a terminal, you can do: >
+ call term_sendkeys(buf, "ls *.java\<CR>")
+
+This requires for the job to be in the right state where it will do the right
+thing when receiving the keys. For the above example, the shell must be
+waiting for a command to be typed.
+
+For a job that was written for the purpose, you can use the JSON API escape
+sequence in the other direction. E.g.: >
+ call term_sendkeys(buf, "\<Esc>]51;["response"]\x07")
+
+
+Job to Vim: JSON API ~
+ *terminal-api*
+The job can send JSON to Vim, using a special escape sequence. The JSON
+encodes a command that Vim understands. Example of such a message: >
+ <Esc>]51;["drop", "README.md"]<07>
+
+The body is always a list, making it easy to find the end: ]<07>.
+The <Esc>]51;msg<07> sequence is reserved by xterm for "Emacs shell", which is
+similar to what we are doing here.
+
+Currently supported commands:
+
+ call {funcname} {argument}
+
+ Call a user defined function with {argument}.
+ The function is called with two arguments: the buffer number
+ of the terminal and {argument}, the decoded JSON argument.
+ By default, the function name must start with "Tapi_" to avoid
+ accidentally calling a function not meant to be used for the
+ terminal API. This can be changed with |term_setapi()|.
+ The user function should sanity check the argument.
+ The function can use |term_sendkeys()| to send back a reply.
+ Example in JSON: >
+ ["call", "Tapi_Impression", ["play", 14]]
+< Calls a function defined like this: >
+ function Tapi_Impression(bufnum, arglist)
+ if len(a:arglist) == 2
+ echomsg "impression " .. a:arglist[0]
+ echomsg "count " .. a:arglist[1]
+ endif
+ endfunc
+< Output from `:echo` may be erased by a redraw, use `:echomsg`
+ to be able to see it with `:messages`.
+
+ drop {filename} [options]
+
+ Let Vim open a file, like the `:drop` command. If {filename}
+ is already open in a window, switch to that window. Otherwise
+ open a new window to edit {filename}.
+ Note that both the job and Vim may change the current
+ directory, thus it's best to use the full path.
+
+ [options] is only used when opening a new window. If present,
+ it must be a Dict. Similarly to |++opt|, these entries are
+ recognized:
+ "ff" file format: "dos", "mac" or "unix"
+ "fileformat" idem
+ "enc" overrides 'fileencoding'
+ "encoding" idem
+ "bin" sets 'binary'
+ "binary" idem
+ "nobin" resets 'binary'
+ "nobinary" idem
+ "bad" specifies behavior for bad characters, see
+ |++bad|
+
+ Example in JSON: >
+ ["drop", "path/file.txt", {"ff": "dos"}]
+
+A trick to have Vim send this escape sequence: >
+ exe "set t_ts=\<Esc>]51; t_fs=\x07"
+ let &titlestring = '["call","Tapi_TryThis",["hello",123]]'
+ redraw
+ set t_ts& t_fs&
+
+Rationale: Why not allow for any command or expression? Because that might
+create a security problem.
+ *terminal-autoshelldir*
+This can be used to pass the current directory from a shell to Vim.
+Put this in your .vimrc: >
+ def g:Tapi_lcd(_, path: string)
+ if isdirectory(path)
+ execute 'silent lcd ' .. fnameescape(path)
+ endif
+ enddef
+<
+And, in a bash init file: >
+ if [[ -n "$VIM_TERMINAL" ]]; then
+ PROMPT_COMMAND='_vim_sync_PWD'
+ function _vim_sync_PWD() {
+ printf '\033]51;["call", "Tapi_lcd", "%q"]\007' "$PWD"
+ }
+ fi
+<
+Or, for zsh: >
+ if [[ -n "$VIM_TERMINAL" ]]; then
+ autoload -Uz add-zsh-hook
+ add-zsh-hook -Uz chpwd _vim_sync_PWD
+ function _vim_sync_PWD() {
+ printf '\033]51;["call", "Tapi_lcd", "%q"]\007' "$PWD"
+ }
+ fi
+<
+Or, for fish: >
+ if test -n "$VIM_TERMINAL"
+ function _vim_sync_PWD --on-variable=PWD
+ printf '\033]51;["call", "Tapi_lcd", "%s"]\007' "$PWD"
+ end
+ end
+
+
+Using the client-server feature ~
+ *terminal-client-server*
+This only works when v:servername is not empty. If needed you can set it,
+before opening the terminal, with: >
+ call remote_startserver('vim-server')
+
+$VIM_SERVERNAME is set in the terminal to pass on the server name.
+
+In the job you can then do something like: >
+ vim --servername $VIM_SERVERNAME --remote +123 some_file.c
+This will open the file "some_file.c" and put the cursor on line 123.
+
+==============================================================================
+4. Remote testing *terminal-testing*
+
+Most Vim tests execute a script inside Vim. For some tests this does not
+work, running the test interferes with the code being tested. To avoid this
+Vim is executed in a terminal window. The test sends keystrokes to it and
+inspects the resulting screen state.
+
+Functions ~
+
+|term_sendkeys()| send keystrokes to a terminal (not subject to tmap)
+|term_wait()| wait for screen to be updated
+|term_scrape()| inspect terminal screen
+
+
+==============================================================================
+5. Diffing screen dumps *terminal-diff*
+
+In some cases it can be bothersome to test that Vim displays the right
+characters on the screen. E.g. with syntax highlighting. To make this
+simpler it is possible to take a screen dump of a terminal and compare it to
+an expected screen dump.
+
+Vim uses the window size, text, color and other attributes as displayed. The
+Vim screen size, font and other properties do not matter. Therefore this
+mechanism is portable across systems. A conventional screenshot would reflect
+all differences, including font size and family.
+
+
+Writing a screen dump test for Vim ~
+ *terminal-dumptest*
+For an example see the Test_syntax_c() function in
+src/testdir/test_syntax.vim. The main parts are:
+- Write a file you want to test with. This is useful for testing syntax
+ highlighting. You can also start Vim with an empty buffer.
+- Run Vim in a terminal with a specific size. The default is 20 lines of 75
+ characters. This makes sure the dump is always this size. The function
+ RunVimInTerminal() takes care of this. Pass it the arguments for the Vim
+ command.
+- Send any commands to Vim using |term_sendkeys()|. For example: >
+ call term_sendkeys(buf, ":echo &lines &columns\<CR>")
+- Check that the screen is now in the expected state, using
+ VerifyScreenDump(). This expects the reference screen dump to be in the
+ src/testdir/dumps/ directory. Pass the name without ".dump". It is
+ recommended to use the name of the test function and a sequence number, so
+ that we know what test is using the file.
+- Repeat sending commands and checking the state.
+- Finally stop Vim by calling StopVimInTerminal().
+
+The first time you do this you won't have a screen dump yet. Create an empty
+file for now, e.g.: >
+ touch src/testdir/dumps/Test_function_name_01.dump
+
+The test will then fail, giving you the command to compare the reference dump
+and the failed dump, e.g.: >
+ call term_dumpdiff("failed/Test_func.dump", "dumps/Test_func.dump")
+
+Use this command in Vim, with the current directory set to src/testdir.
+Once you are satisfied with the test, move the failed dump in place of the
+reference: >
+ :!mv failed/Test_func.dump dumps/Test_func.dump
+
+
+Creating a screen dump ~
+ *terminal-screendump*
+To create the screen dump, run Vim (or any other program) in a terminal and
+make it show the desired state. Then use the |term_dumpwrite()| function to
+create a screen dump file. For example: >
+ :call term_dumpwrite(77, "mysyntax.dump")
+
+Here "77" is the buffer number of the terminal. Use `:ls!` to see it.
+
+You can view the screen dump with |term_dumpload()|: >
+ :call term_dumpload("mysyntax.dump")
+
+To verify that Vim still shows exactly the same screen, run Vim again with
+exactly the same way to show the desired state. Then create a screen dump
+again, using a different file name: >
+ :call term_dumpwrite(88, "test.dump")
+
+To assert that the files are exactly the same use |assert_equalfile()|: >
+ call assert_equalfile("mysyntax.dump", "test.dump")
+
+If there are differences then v:errors will contain the error message.
+
+
+Comparing screen dumps ~
+ *terminal-diffscreendump*
+|assert_equalfile()| does not make it easy to see what is different.
+To spot the problem use |term_dumpdiff()|: >
+ call term_dumpdiff("mysyntax.dump", "test.dump")
+
+This will open a window consisting of three parts:
+1. The contents of the first dump
+2. The difference between the first and second dump
+3. The contents of the second dump
+
+You can usually see what differs in the second part. Use the 'ruler' to
+relate it to the position in the first or second dump. Letters indicate the
+kind of difference:
+ X different character
+ > cursor in first but not in second
+ < cursor in second but not in first
+ w character width differs (single vs double width)
+ f foreground color differs
+ b background color differs
+ a attribute differs (bold, underline, reverse, etc.)
+ ? character missing in both
+ + character missing in first
+ - character missing in second
+
+Alternatively, press "s" to swap the first and second dump. Do this several
+times so that you can spot the difference in the context of the text.
+
+==============================================================================
+6. Debugging *terminal-debug* *terminal-debugger*
+
+The Terminal debugging plugin can be used to debug a program with gdb and view
+the source code in a Vim window. Since this is completely contained inside
+Vim this also works remotely over an ssh connection.
+
+When the |+terminal| feature is missing, the plugin will use the "prompt"
+buffer type, if possible. The running program will then use a newly opened
+terminal window. See |termdebug-prompt| below for details.
+
+
+Starting ~
+ *termdebug-starting*
+Load the plugin with this command: >
+ packadd termdebug
+< *:Termdebug*
+To start debugging use `:Termdebug` or `:TermdebugCommand` followed by the
+command name, for example: >
+ :Termdebug vim
+
+This opens two windows:
+
+gdb window A terminal window in which "gdb vim" is executed. Here you
+ can directly interact with gdb. The buffer name is "!gdb".
+
+program window A terminal window for the executed program. When "run" is
+ used in gdb the program I/O will happen in this window, so
+ that it does not interfere with controlling gdb. The buffer
+ name is "debugged program".
+
+The current window is used to show the source code. When gdb pauses the
+source file location will be displayed, if possible. A sign is used to
+highlight the current position, using highlight group debugPC.
+
+If the buffer in the current window is modified, another window will be opened
+to display the current gdb position. You can use `:Winbar` to add a window
+toolbar there.
+
+Focus the terminal of the executed program to interact with it. This works
+the same as any command running in a terminal window.
+
+When the debugger ends, typically by typing "quit" in the gdb window, the two
+opened windows are closed.
+
+Only one debugger can be active at a time.
+ *:TermdebugCommand*
+If you want to give specific commands to the command being debugged, you can
+use the `:TermdebugCommand` command followed by the command name and
+additional parameters. >
+ :TermdebugCommand vim --clean -c ':set nu'
+
+Both the `:Termdebug` and `:TermdebugCommand` support an optional "!" bang
+argument to start the command right away, without pausing at the gdb window
+(and cursor will be in the debugged window). For example: >
+ :TermdebugCommand! vim --clean
+
+To attach gdb to an already running executable or use a core file, pass extra
+arguments. E.g.: >
+ :Termdebug vim core
+ :Termdebug vim 98343
+
+If no argument is given, you'll end up in a gdb window, in which you need to
+specify which command to run using e.g. the gdb `file` command.
+
+
+Example session ~
+ *termdebug-example*
+Start in the Vim "src" directory and build Vim: >
+ % make
+Make sure that debug symbols are present, usually that means that $CFLAGS
+includes "-g".
+
+Start Vim: >
+ % ./vim
+
+Load the termdebug plugin and start debugging Vim: >
+ :packadd termdebug
+ :Termdebug vim
+You should now have three windows:
+ source - where you started, has a window toolbar with buttons
+ gdb - you can type gdb commands here
+ program - the executed program will use this window
+
+You can use CTRL-W CTRL-W or the mouse to move focus between windows.
+Put focus on the gdb window and type: >
+ break ex_help
+ run
+Vim will start running in the program window. Put focus there and type: >
+ :help gui
+Gdb will run into the ex_help breakpoint. The source window now shows the
+ex_cmds.c file. A red "1 " marker will appear in the signcolumn where the
+breakpoint was set. The line where the debugger stopped is highlighted. You
+can now step through the program. Let's use the mouse: click on the "Next"
+button in the window toolbar. You will see the highlighting move as the
+debugger executes a line of source code.
+
+Click "Next" a few times until the for loop is highlighted. Put the cursor on
+the end of "eap->arg", then click "Eval" in the toolbar. You will see this
+displayed:
+ "eap->arg": 0x555555e68855 "gui" ~
+This way you can inspect the value of local variables. You can also focus the
+gdb window and use a "print" command, e.g.: >
+ print *eap
+If mouse pointer movements are working, Vim will also show a balloon when the
+mouse rests on text that can be evaluated by gdb.
+
+Now go back to the source window and put the cursor on the first line after
+the for loop, then type: >
+ :Break
+You will see a ">>" marker appear, this indicates the new breakpoint. Now
+click "Cont" in the toolbar and the code until the breakpoint will be
+executed.
+
+You can type more advanced commands in the gdb window. For example, type: >
+ watch curbuf
+Now click "Cont" in the toolbar (or type "cont" in the gdb window). Execution
+will now continue until the value of "curbuf" changes, which is in do_ecmd().
+To remove this watchpoint again type in the gdb window: >
+ delete 3
+
+You can see the stack by typing in the gdb window: >
+ where
+Move through the stack frames, e.g. with: >
+ frame 3
+The source window will show the code, at the point where the call was made to
+a deeper level.
+
+
+Stepping through code ~
+ *termdebug-stepping*
+Put focus on the gdb window to type commands there. Some common ones are:
+- CTRL-C interrupt the program
+- next execute the current line and stop at the next line
+- step execute the current line and stop at the next statement,
+ entering functions
+- until execute until past the current cursor line or past a specified
+ position or the current stack frame returns
+- finish execute until leaving the current function
+- where show the stack
+- frame N go to the Nth stack frame
+- continue continue execution
+
+ *:Run* *:Arguments*
+In the window showing the source code these commands can be used to control
+gdb:
+ `:Run` [args] run the program with [args] or the previous arguments
+ `:Arguments` {args} set arguments for the next `:Run`
+
+ *:Break* set a breakpoint at the cursor position
+ :Break {position}
+ set a breakpoint at the specified position
+ *:Clear* delete the breakpoint at the cursor position
+
+ *:Step* execute the gdb "step" command
+ *:Over* execute the gdb "next" command (`:Next` is a Vim command)
+ *:Until* execute the gdb "until" command
+ *:Finish* execute the gdb "finish" command
+ *:Continue* execute the gdb "continue" command
+ *:Stop* interrupt the program
+
+If 'mouse' is set the plugin adds a window toolbar with these entries:
+ Step `:Step`
+ Next `:Over`
+ Finish `:Finish`
+ Cont `:Continue`
+ Stop `:Stop`
+ Eval `:Evaluate`
+This way you can use the mouse to perform the most common commands. You need
+to have the 'mouse' option set to enable mouse clicks.
+See |termdebug_winbar| for configuring this toolbar.
+ *:Winbar*
+You can add the window toolbar in other windows you open with: >
+ :Winbar
+
+If gdb stops at a source line and there is no window currently showing the
+source code, a new window will be created for the source code. This also
+happens if the buffer in the source code window has been modified and can't be
+abandoned.
+
+Gdb gives each breakpoint a number. In Vim the number shows up in the sign
+column, with a red background. You can use these gdb commands:
+- info break list breakpoints
+- delete N delete breakpoint N
+You can also use the `:Clear` command if the cursor is in the line with the
+breakpoint, or use the "Clear breakpoint" right-click menu entry.
+
+
+Inspecting variables ~
+ *termdebug-variables* *:Evaluate*
+ `:Evaluate` evaluate the expression under the cursor
+ `K` same (see |termdebug_map_K| to disable)
+ `:Evaluate` {expr} evaluate {expr}
+ `:'<,'>Evaluate` evaluate the Visually selected text
+
+This is similar to using "print" in the gdb window.
+You can usually shorten `:Evaluate` to `:Ev`.
+
+
+Other commands ~
+ *termdebug-commands*
+ *:Gdb* jump to the gdb window
+ *:Program* jump to the window with the running program
+ *:Source* jump to the window with the source code, create it if there
+ isn't one
+ *:Asm* jump to the window with the disassembly, create it if there
+ isn't one
+
+Events ~
+ *termdebug-events*
+Four autocommands can be used: >
+ au User TermdebugStartPre echomsg 'debugging starting'
+ au User TermdebugStartPost echomsg 'debugging started'
+ au User TermdebugStopPre echomsg 'debugging stopping'
+ au User TermdebugStopPost echomsg 'debugging stopped'
+<
+ *TermdebugStartPre*
+TermdebugStartPre Before starting debugging.
+ Not triggered if the debugger is already
+ running or the debugger command cannot be
+ executed.
+ *TermdebugStartPost*
+TermdebugStartPost After debugging has initialized.
+ If a "!" bang is passed to `:Termdebug` or
+ `:TermdebugCommand` the event is triggered
+ before running the provided command in gdb.
+ *TermdebugStopPre*
+TermdebugStopPre Before debugging ends, when gdb is terminated,
+ most likely after issuing a "quit" command in
+ the gdb window.
+ *TermdebugStopPost*
+TermdebugStopPost After debugging has ended, gdb-related windows
+ are closed, debug buffers wiped out and
+ the state before the debugging was restored.
+
+
+Customizing ~
+ *termdebug-customizing* *g:termdebug_config*
+In the past several global variables were used for configuration. These are
+deprecated and using the g:termdebug_config dictionary is preferred. When
+g:termdebug_config exists the other global variables will NOT be used.
+The recommended way is to start with an empty dictionary: >
+ let g:termdebug_config = {}
+
+Then you can add entries to the dictionary as mentioned below. The
+deprecated global variable names are mentioned for completeness. If you are
+switching over to using g:termdebug_config you can find the old variable name
+and take over the value, then delete the deprecated variable.
+
+
+Prompt mode ~
+ *termdebug-prompt*
+When the |+terminal| feature is not supported and on MS-Windows, gdb will run
+in a buffer with 'buftype' set to "prompt". This works slightly differently:
+- The gdb window will be in Insert mode while typing commands. Go to Normal
+ mode with <Esc>, then you can move around in the buffer, copy/paste, etc.
+ Go back to editing the gdb command with any command that starts Insert mode,
+ such as `a` or `i`.
+- The program being debugged will run in a separate window. On MS-Windows
+ this is a new console window. On Unix, if the |+terminal| feature is
+ available a Terminal window will be opened to run the debugged program in.
+
+ *termdebug_use_prompt*
+Prompt mode can be used even when the |+terminal| feature is present with: >
+ let g:termdebug_config['use_prompt'] = 1
+If there is no g:termdebug_config you can use: >
+ let g:termdebug_use_prompt = 1
+<
+ *termdebug_map_K*
+The K key is normally mapped to :Evaluate. If you do not want this use: >
+ let g:termdebug_config['map_K'] = 0
+If there is no g:termdebug_config you can use: >
+ let g:termdebug_map_K = 0
+<
+ *termdebug_disasm_window*
+If you want the Asm window shown by default, set the flag to 1.
+the "disasm_window_height" entry can be used to set the window height: >
+ let g:termdebug_config['disasm_window'] = 1
+ let g:termdebug_config['disasm_window_height'] = 15
+If there is no g:termdebug_config you can use: >
+ let g:termdebug_disasm_window = 15
+Any value greater than 1 will set the Asm window height to that value.
+
+Communication ~
+ *termdebug-communication*
+There is another, hidden, buffer, which is used for Vim to communicate with
+gdb. The buffer name is "gdb communication". Do not delete this buffer, it
+will break the debugger.
+
+Gdb has some weird behavior, the plugin does its best to work around that.
+For example, after typing "continue" in the gdb window a CTRL-C can be used to
+interrupt the running program. But after using the MI command
+"-exec-continue" pressing CTRL-C does not interrupt. Therefore you will see
+"continue" being used for the `:Continue` command, instead of using the
+communication channel.
+
+
+GDB command ~
+ *g:termdebugger*
+To change the name of the gdb command, set "debugger" entry in
+g:termdebug_config or the "g:termdebugger" variable before invoking
+`:Termdebug`: >
+ let g:termdebug_config['command'] = "mygdb"
+If there is no g:termdebug_config you can use: >
+ let g:termdebugger = "mygdb"
+
+If the command needs an argument use a List: >
+ let g:termdebug_config['command'] = ['rr', 'replay', '--']
+If there is no g:termdebug_config you can use: >
+ let g:termdebugger = ['rr', 'replay', '--']
+
+Several arguments will be added to make gdb work well for the debugger.
+If you want to modify them, add a function to filter the argument list: >
+ let g:termdebug_config['command_filter'] = MyDebugFilter
+
+If you do not want the arguments to be added, but you do need to set the
+"pty", use a function to add the necessary arguments: >
+ let g:termdebug_config['command_add_args'] = MyAddArguments
+The function will be called with the list of arguments so far, and a second
+argument that is the name of the pty.
+ *gdb-version*
+Only debuggers fully compatible with gdb will work. Vim uses the GDB/MI
+interface. The "new-ui" command requires gdb version 7.12 or later. if you
+get this error:
+ Undefined command: "new-ui". Try "help".~
+Then your gdb is too old.
+
+
+Colors ~
+ *hl-debugPC* *hl-debugBreakpoint*
+The color of the signs can be adjusted with these highlight groups:
+- debugPC the current position
+- debugBreakpoint a breakpoint
+
+The defaults are, when 'background' is "light":
+ hi debugPC term=reverse ctermbg=lightblue guibg=lightblue
+ hi debugBreakpoint term=reverse ctermbg=red guibg=red
+
+When 'background' is "dark":
+ hi debugPC term=reverse ctermbg=darkblue guibg=darkblue
+ hi debugBreakpoint term=reverse ctermbg=red guibg=red
+
+
+Shortcuts ~
+ *termdebug_shortcuts*
+You can define your own shortcuts (mappings) to control gdb, that can work in
+any window, using the TermDebugSendCommand() function. Example: >
+ map ,w :call TermDebugSendCommand('where')<CR>
+The argument is the gdb command.
+
+
+Popup menu ~
+ *termdebug_popup*
+By default the Termdebug plugin sets 'mousemodel' to "popup_setpos" and adds
+these entries to the popup menu:
+ Set breakpoint `:Break`
+ Clear breakpoint `:Clear`
+ Evaluate `:Evaluate`
+If you don't want this then disable it with: >
+ let g:termdebug_config['popup'] = 0
+If there is no g:termdebug_config you can use: >
+ let g:termdebug_popup = 0
+
+
+Window toolbar ~
+ *termdebug_winbar*
+By default the Termdebug plugin creates a window toolbar if the mouse is
+enabled (see |:Winbar|). If you don't want this then disable it with: >
+ let g:termdebug_config['winbar'] = 0
+
+
+Vim window width ~
+ *termdebug_wide*
+To change the width of the Vim window when debugging starts and use a vertical
+split: >
+ let g:termdebug_config['wide'] = 163
+If there is no g:termdebug_config you can use: >
+ let g:termdebug_wide = 163
+
+This will set 'columns' to 163 when `:Termdebug` is used. The value is
+restored when quitting the debugger.
+
+If the wide value is set and 'columns' is already a greater value, then a
+vertical split will be used without modifying 'columns'.
+
+Set the wide value to 1 to use a vertical split without ever changing
+'columns'. This is useful when the terminal can't be resized by Vim.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/test_urls.vim b/runtime/doc/test_urls.vim
new file mode 100644
index 0000000..3580b79
--- /dev/null
+++ b/runtime/doc/test_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/runtime/doc/testing.txt b/runtime/doc/testing.txt
new file mode 100644
index 0000000..2f6387d
--- /dev/null
+++ b/runtime/doc/testing.txt
@@ -0,0 +1,624 @@
+*testing.txt* For Vim version 9.0. Last change: 2022 Dec 30
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Testing Vim and Vim script *testing-support*
+
+Expression evaluation is explained in |eval.txt|. This file goes into details
+about writing tests in Vim script. This can be used for testing Vim itself
+and for testing plugins.
+
+1. Testing Vim |testing|
+2. Test functions |test-functions-details|
+3. Assert functions |assert-functions-details|
+
+==============================================================================
+1. Testing Vim *testing*
+
+Vim can be tested after building it, usually with "make test".
+The tests are located in the directory "src/testdir".
+
+There are two types of tests added over time:
+ test20.in oldest, only for tiny and small builds
+ test_something.vim new style tests
+
+ *new-style-testing*
+New tests should be added as new style tests. The test scripts are named
+test_<feature>.vim (replace <feature> with the feature under test). These use
+functions such as |assert_equal()| to keep the test commands and the expected
+result in one place.
+ *old-style-testing*
+These tests are used only for testing Vim without the |+eval| feature.
+
+Find more information in the file src/testdir/README.txt.
+
+==============================================================================
+2. Test functions *test-functions-details*
+
+test_alloc_fail({id}, {countdown}, {repeat}) *test_alloc_fail()*
+ This is for testing: If the memory allocation with {id} is
+ called, then decrement {countdown}, and when it reaches zero
+ let memory allocation fail {repeat} times. When {repeat} is
+ smaller than one it fails one time.
+
+ Can also be used as a |method|: >
+ GetAllocId()->test_alloc_fail()
+
+
+test_autochdir() *test_autochdir()*
+ Set a flag to enable the effect of 'autochdir' before Vim
+ startup has finished.
+
+
+test_feedinput({string}) *test_feedinput()*
+ Characters in {string} are queued for processing as if they
+ were typed by the user. This uses a low level input buffer.
+ This function works only when with |+unix| or GUI is running.
+
+ Can also be used as a |method|: >
+ GetText()->test_feedinput()
+
+
+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. *E1142*
+ This will not work when called from a :def function, because
+ variables on the stack will be freed.
+
+
+test_garbagecollect_soon() *test_garbagecollect_soon()*
+ Set the flag to call the garbagecollector as if in the main
+ loop. Only to be used in tests.
+
+
+test_getvalue({name}) *test_getvalue()*
+ Get the value of an internal variable. These values for
+ {name} are supported:
+ need_fileinfo
+
+ Can also be used as a |method|: >
+ GetName()->test_getvalue()
+<
+ *test_gui_event()*
+test_gui_event({event}, {args})
+ Generate a GUI {event} with arguments {args} for testing Vim
+ functionality. This function works only when the GUI is
+ running.
+
+ {event} is a String and the supported values are:
+ "dropfiles" drop one or more files in a window.
+ "findrepl" search and replace text.
+ "mouse" mouse button click event.
+ "scrollbar" move or drag the scrollbar.
+ "key" send a low-level keyboard event.
+ "tabline" select a tab page by mouse click.
+ "tabmenu" select a tabline menu entry.
+
+ {args} is a Dict and contains the arguments for the event.
+
+ "dropfiles":
+ Drop one or more files in a specified window. The supported
+ items in {args} are:
+ files: List of file names
+ row: window row number
+ col: window column number
+ modifiers: key modifiers. The supported values are:
+ 0x4 Shift
+ 0x8 Alt
+ 0x10 Ctrl
+ The files are added to the |argument-list| and the first
+ file in {files} is edited in the window. See |drag-n-drop|
+ for more information. This event works only when the
+ |drop_file| feature is present.
+
+ "findrepl":
+ {only available when the GUI has a find/replace dialog}
+ Perform a search and replace of text. The supported items
+ in {args} are:
+ find_text: string to find.
+ repl_text: replacement string.
+ flags: flags controlling the find/replace. Supported
+ values are:
+ 1 search next string (find dialog)
+ 2 search next string (replace dialog)
+ 3 replace string once
+ 4 replace all matches
+ 8 match whole words only
+ 16 match case
+ forward: set to 1 for forward search.
+
+ "mouse":
+ Inject either a mouse button click, or a mouse move, event.
+ The supported items in {args} are:
+ button: mouse button. The supported values are:
+ 0 left mouse button
+ 1 middle mouse button
+ 2 right mouse button
+ 3 mouse button release
+ 4 scroll wheel down
+ 5 scroll wheel up
+ 6 scroll wheel left
+ 7 scroll wheel right
+ row: mouse click row number. The first row of the
+ Vim window is 1 and the last row is 'lines'.
+ col: mouse click column number. The maximum value
+ of {col} is 'columns'.
+ multiclick: set to 1 to inject a multiclick mouse event.
+ modifiers: key modifiers. The supported values are:
+ 4 shift is pressed
+ 8 alt is pressed
+ 16 ctrl is pressed
+ move: Optional; if used and TRUE then a mouse move
+ event can be generated.
+ Only {args} row: and col: are used and
+ required; they are interpreted as pixels or
+ screen cells, depending on "cell".
+ Only results in an event when 'mousemoveevent'
+ is set or a popup uses mouse move events.
+ cell: Optional: when present and TRUE then "move"
+ uses screen cells instead of pixel positions
+
+ "scrollbar":
+ Set or drag the left, right or horizontal scrollbar. Only
+ works when the scrollbar actually exists. The supported
+ items in {args} are:
+ which: scrollbar. The supported values are:
+ left Left scrollbar of the current window
+ right Right scrollbar of the current window
+ hor Horizontal scrollbar
+ value: amount to scroll. For the vertical scrollbars
+ the value can be 1 to the line-count of the
+ buffer. For the horizontal scrollbar the
+ value can be between 1 and the maximum line
+ length, assuming 'wrap' is not set.
+ dragging: 1 to drag the scrollbar and 0 to click in the
+ scrollbar.
+
+ "key":
+ Send a low-level keyboard event (e.g. key-up or down).
+ Currently only supported on MS-Windows.
+ The supported items in {args} are:
+ event: The supported string values are:
+ keyup generate a keyup event
+ keydown generate a keydown event
+ keycode: Keycode to use for a keyup or a keydown event.
+ *E1291*
+
+ "tabline":
+ Inject a mouse click event on the tabline to select a
+ tabpage. The supported items in {args} are:
+ tabnr: tab page number
+
+ "tabmenu":
+ Inject an event to select a tabline menu entry. The
+ supported items in {args} are:
+ tabnr: tab page number
+ item: tab page menu item number. 1 for the first
+ menu item, 2 for the second item and so on.
+
+ After injecting the GUI events you probably should call
+ |feedkeys()| to have them processed, e.g.: >
+ call feedkeys("y", 'Lx!')
+<
+ Returns TRUE if the event is successfully added, FALSE if
+ there is a failure.
+
+ Can also be used as a |method|: >
+ GetEvent()->test_gui_event({args})
+<
+test_ignore_error({expr}) *test_ignore_error()*
+ Ignore any error containing {expr}. A normal message is given
+ instead.
+ This is only meant to be used in tests, where catching the
+ error with try/catch cannot be used (because it skips over
+ following code).
+ {expr} is used literally, not as a pattern.
+ When the {expr} is the string "RESET" then the list of ignored
+ errors is made empty.
+
+ Can also be used as a |method|: >
+ GetErrorText()->test_ignore_error()
+
+
+test_mswin_event({event}, {args}) *test_mswin_event()*
+ Generate a low-level MS-Windows {event} with arguments {args}
+ for testing Vim functionality. It works for MS-Windows GUI
+ and for the console.
+
+ {event} is a String and the supported values are:
+ "mouse" mouse event.
+ "key" keyboard event.
+
+ "mouse":
+ Inject either a mouse button click, or a mouse move, event.
+ The supported items in {args} are:
+ button: mouse button. The supported values are:
+ 0 right mouse button
+ 1 middle mouse button
+ 2 left mouse button
+ 3 mouse button release
+ 4 scroll wheel down
+ 5 scroll wheel up
+ 6 scroll wheel left
+ 7 scroll wheel right
+ row: mouse click row number. The first row of the
+ Vim window is 1 and the last row is 'lines'.
+ col: mouse click column number. The maximum value
+ of {col} is 'columns'.
+ Note: row and col are always interpreted as
+ screen cells for the console application.
+ But, they may be interpreted as pixels
+ for the GUI, depending on "cell".
+ multiclick: set to 1 to inject a double-click mouse event.
+ modifiers: key modifiers. The supported values are:
+ 4 shift is pressed
+ 8 alt is pressed
+ 16 ctrl is pressed
+ move: Optional; if used and TRUE then a mouse move
+ event can be generated.
+ Only {args} row: and col: are used and
+ required.
+ Only results in an event when 'mousemoveevent'
+ is set or a popup uses mouse move events.
+ cell: Optional for the GUI: when present and TRUE
+ then "move" uses screen cells instead of pixel
+ positions. Not used by the console.
+
+ "key":
+ Send a low-level keyboard event (e.g. keyup or keydown).
+ The supported items in {args} are:
+ event: The supported string values are:
+ keyup generate a keyup event
+ keydown generate a keydown event
+ keycode: Keycode to use for a keyup or a keydown event.
+ modifiers: Optional; key modifiers.
+ The supported values are:
+ 2 shift is pressed
+ 4 ctrl is pressed
+ 8 alt is pressed
+ Note: These values are different from the
+ mouse modifiers.
+ execute: Optional. Similar to |feedkeys()| mode x.
+ When this is included and set to true
+ (non-zero) then Vim will process any buffered
+ unprocessed key events. All other {args}
+ items are optional when this is set and true.
+
+ Returns TRUE if the event is successfully added or executed,
+ FALSE if there is a failure.
+
+ Can also be used as a |method|: >
+ GetEvent()->test_mswin_event({args})
+<
+
+test_null_blob() *test_null_blob()*
+ Return a |Blob| that is null. Only useful for testing.
+
+
+test_null_channel() *test_null_channel()*
+ Return a |Channel| that is null. Only useful for testing.
+ {only available when compiled with the +channel feature}
+
+
+test_null_dict() *test_null_dict()*
+ Return a |Dict| that is null. Only useful for testing.
+
+
+test_null_function() *test_null_function()*
+ Return a |Funcref| that is null. Only useful for testing.
+
+
+test_null_job() *test_null_job()*
+ Return a |Job| that is null. Only useful for testing.
+ {only available when compiled with the +job feature}
+
+
+test_null_list() *test_null_list()*
+ Return a |List| that is null. Only useful for testing.
+
+
+test_null_partial() *test_null_partial()*
+ Return a |Partial| that is null. Only useful for testing.
+
+
+test_null_string() *test_null_string()*
+ Return a |String| that is null. Only useful for testing.
+
+
+test_option_not_set({name}) *test_option_not_set()*
+ Reset the flag that indicates option {name} was set. Thus it
+ looks like it still has the default value. Use like this: >
+ set ambiwidth=double
+ call test_option_not_set('ambiwidth')
+< Now the 'ambiwidth' option behaves like it was never changed,
+ even though the value is "double".
+ Only to be used for testing!
+
+ Can also be used as a |method|: >
+ GetOptionName()->test_option_not_set()
+
+
+test_override({name}, {val}) *test_override()*
+ Overrides certain parts of Vim's internal processing to be able
+ to run tests. Only to be used for testing Vim!
+ The override is enabled when {val} is non-zero and removed
+ when {val} is zero.
+ Current supported values for {name} are:
+
+ {name} effect when {val} is non-zero ~
+ alloc_lines make a copy of every buffer line into allocated
+ memory, so that memory access errors can be found
+ by valgrind
+ autoload `import autoload` will load the script right
+ away, not postponed until an item is used
+ char_avail disable the char_avail() function
+ nfa_fail makes the NFA regexp engine fail to force a
+ fallback to the old engine
+ no_query_mouse do not query the mouse position for "dec"
+ terminals
+ no_wait_return set the "no_wait_return" flag. Not restored
+ with "ALL".
+ redraw disable the redrawing() function
+ redraw_flag ignore the RedrawingDisabled flag
+ starting reset the "starting" variable, see below
+ term_props reset all terminal properties when the version
+ string is detected
+ ui_delay time in msec to use in ui_delay(); overrules a
+ wait time of up to 3 seconds for messages
+ uptime overrules sysinfo.uptime
+ vterm_title setting the window title by a job running in a
+ terminal window
+ ALL clear all overrides, except alloc_lines ({val} is
+ not used)
+
+ "starting" is to be used when a test should behave like
+ startup was done. Since the tests are run by sourcing a
+ script the "starting" variable is non-zero. This is usually a
+ good thing (tests run faster), but sometimes changes behavior
+ in a way that the test doesn't work properly.
+ When using: >
+ call test_override('starting', 1)
+< The value of "starting" is saved. It is restored by: >
+ call test_override('starting', 0)
+
+< Can also be used as a |method|: >
+ GetOverrideVal()-> test_override('starting')
+
+
+test_refcount({expr}) *test_refcount()*
+ Return the reference count of {expr}. When {expr} is of a
+ type that does not have a reference count, returns -1. Only
+ to be used for testing.
+
+ Can also be used as a |method|: >
+ GetVarname()->test_refcount()
+
+
+test_setmouse({row}, {col}) *test_setmouse()*
+ Set the mouse position to be used for the next mouse action.
+ {row} and {col} are one based.
+ For example: >
+ call test_setmouse(4, 20)
+ call feedkeys("\<LeftMouse>", "xt")
+
+
+test_settime({expr}) *test_settime()*
+ Set the time Vim uses internally. Currently only used for
+ timestamps in the history, as they are used in viminfo, and
+ for undo.
+ Using a value of 1 makes Vim not sleep after a warning or
+ error message.
+ {expr} must evaluate to a number. When the value is zero the
+ normal behavior is restored.
+
+ Can also be used as a |method|: >
+ GetTime()->test_settime()
+
+
+test_srand_seed([seed]) *test_srand_seed()*
+ When [seed] is given this sets the seed value used by
+ `srand()`. When omitted the test seed is removed.
+
+
+test_unknown() *test_unknown()*
+ Return a value with unknown type. Only useful for testing.
+
+
+test_void() *test_void()*
+ Return a value with void type. Only useful for testing.
+
+==============================================================================
+3. Assert functions *assert-functions-details*
+
+
+assert_beeps({cmd}) *assert_beeps()*
+ Run {cmd} and add an error message to |v:errors| if it does
+ NOT produce a beep or visual bell.
+ Also see |assert_fails()|, |assert_nobeep()| and
+ |assert-return|.
+
+ Can also be used as a |method|: >
+ GetCmd()->assert_beeps()
+<
+ *assert_equal()*
+assert_equal({expected}, {actual} [, {msg}])
+ When {expected} and {actual} are not equal an error message is
+ added to |v:errors| and 1 is returned. Otherwise zero is
+ returned |assert-return|.
+ There is no automatic conversion, the String "4" is different
+ from the Number 4. And the number 4 is different from the
+ Float 4.0. The value of 'ignorecase' is not used here, case
+ always matters.
+ When {msg} is omitted an error in the form "Expected
+ {expected} but got {actual}" is produced.
+ Example: >
+ assert_equal('foo', 'bar')
+< Will result in a string to be added to |v:errors|:
+ test.vim line 12: Expected 'foo' but got 'bar' ~
+
+ Can also be used as a |method|, the base is passed as the
+ second argument: >
+ mylist->assert_equal([1, 2, 3])
+
+< *assert_equalfile()*
+assert_equalfile({fname-one}, {fname-two} [, {msg}])
+ When the files {fname-one} and {fname-two} do not contain
+ exactly the same text an error message is added to |v:errors|.
+ Also see |assert-return|.
+ When {fname-one} or {fname-two} does not exist the error will
+ mention that.
+ Mainly useful with |terminal-diff|.
+
+ Can also be used as a |method|: >
+ GetLog()->assert_equalfile('expected.log')
+
+assert_exception({error} [, {msg}]) *assert_exception()*
+ When v:exception does not contain the string {error} an error
+ message is added to |v:errors|. Also see |assert-return|.
+ This can be used to assert that a command throws an exception.
+ Using the error number, followed by a colon, avoids problems
+ with translations: >
+ try
+ commandthatfails
+ call assert_false(1, 'command should have failed')
+ catch
+ call assert_exception('E492:')
+ endtry
+<
+ *assert_fails()*
+assert_fails({cmd} [, {error} [, {msg} [, {lnum} [, {context}]]]])
+ Run {cmd} and add an error message to |v:errors| if it does
+ NOT produce an error or when {error} is not found in the
+ error message. Also see |assert-return|.
+ *E856*
+ When {error} is a string it must be found literally in the
+ first reported error. Most often this will be the error code,
+ including the colon, e.g. "E123:". >
+ assert_fails('bad cmd', 'E987:')
+<
+ When {error} is a |List| with one or two strings, these are
+ used as patterns. The first pattern is matched against the
+ first reported error: >
+ assert_fails('cmd', ['E987:.*expected bool'])
+< The second pattern, if present, is matched against the last
+ reported error.
+ If there is only one error then both patterns must match. This
+ can be used to check that there is only one error.
+ To only match the last error use an empty string for the first
+ error: >
+ assert_fails('cmd', ['', 'E987:'])
+<
+ If {msg} is empty then it is not used. Do this to get the
+ default message when passing the {lnum} argument.
+ *E1115*
+ When {lnum} is present and not negative, and the {error}
+ argument is present and matches, then this is compared with
+ the line number at which the error was reported. That can be
+ the line number in a function or in a script.
+ *E1116*
+ When {context} is present it is used as a pattern and matched
+ against the context (script name or function name) where
+ {lnum} is located in.
+
+ Note that beeping is not considered an error, and some failing
+ commands only beep. Use |assert_beeps()| for those.
+
+ Can also be used as a |method|: >
+ GetCmd()->assert_fails('E99:')
+
+assert_false({actual} [, {msg}]) *assert_false()*
+ When {actual} is not false an error message is added to
+ |v:errors|, like with |assert_equal()|.
+ Also see |assert-return|.
+ A value is false when it is zero. When {actual} is not a
+ number the assert fails.
+ When {msg} is omitted an error in the form
+ "Expected False but got {actual}" is produced.
+
+ Can also be used as a |method|: >
+ GetResult()->assert_false()
+
+assert_inrange({lower}, {upper}, {actual} [, {msg}]) *assert_inrange()*
+ This asserts number and |Float| values. When {actual} is lower
+ than {lower} or higher than {upper} an error message is added
+ to |v:errors|. Also see |assert-return|.
+ 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|. Also see |assert-return|.
+
+ {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' ~
+
+ Can also be used as a |method|: >
+ getFile()->assert_match('foo.*')
+<
+assert_nobeep({cmd}) *assert_nobeep()*
+ Run {cmd} and add an error message to |v:errors| if it
+ produces a beep or visual bell.
+ Also see |assert_beeps()|.
+
+ Can also be used as a |method|: >
+ GetCmd()->assert_nobeep()
+<
+ *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.
+ Also see |assert-return|.
+
+ Can also be used as a |method|: >
+ mylist->assert_notequal([1, 2, 3])
+
+< *assert_notmatch()*
+assert_notmatch({pattern}, {actual} [, {msg}])
+ The opposite of `assert_match()`: add an error message to
+ |v:errors| when {pattern} matches {actual}.
+ Also see |assert-return|.
+
+ Can also be used as a |method|: >
+ getFile()->assert_notmatch('bar.*')
+
+
+assert_report({msg}) *assert_report()*
+ Report a test failure directly, using String {msg}.
+ Always returns one.
+
+ Can also be used as a |method|: >
+ GetMessage()->assert_report()
+
+
+assert_true({actual} [, {msg}]) *assert_true()*
+ When {actual} is not true an error message is added to
+ |v:errors|, like with |assert_equal()|.
+ Also see |assert-return|.
+ A value is TRUE when it is a non-zero number. When {actual}
+ is not a number the assert fails.
+ When {msg} is omitted an error in the form "Expected True but
+ got {actual}" is produced.
+
+ Can also be used as a |method|: >
+ GetResult()->assert_true()
+<
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/textprop.txt b/runtime/doc/textprop.txt
new file mode 100644
index 0000000..8c9c0c6
--- /dev/null
+++ b/runtime/doc/textprop.txt
@@ -0,0 +1,509 @@
+*textprop.txt* For Vim version 9.0. Last change: 2022 Dec 19
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Displaying text with properties attached. *textprop* *text-properties*
+
+
+1. Introduction |text-prop-intro|
+2. Functions |text-prop-functions|
+3. When text changes |text-prop-changes|
+
+
+{not able to use text properties when the |+textprop| feature was
+disabled at compile time}
+
+==============================================================================
+1. Introduction *text-prop-intro*
+
+Text properties can be attached to text in a buffer. They will move with the
+text: If lines are deleted or inserted the properties move with the text they
+are attached to. Also when inserting/deleting text in the line before the
+text property. And when inserting/deleting text inside the text property, it
+will increase/decrease in size.
+
+The main use for text properties is to highlight text. This can be seen as a
+replacement for syntax highlighting. Instead of defining patterns to match
+the text, the highlighting is set by a script, possibly using the output of an
+external parser. This only needs to be done once, not every time when
+redrawing the screen, thus can be much faster, after the initial cost of
+attaching the text properties.
+
+Text properties can also be used for other purposes to identify text. For
+example, add a text property on a function name, so that a search can be
+defined to jump to the next/previous function.
+
+A text property is attached at a specific line and column, and has a specified
+length. The property can span multiple lines.
+
+A text property has these fields:
+ "id" a number to be used as desired
+ "type" the name of a property type
+
+
+Property Types ~
+ *E971*
+A text property normally has the name of a property type, which defines
+how to highlight the text. The property type can have these entries:
+ "highlight" name of the highlight group to use
+ "combine" when omitted or TRUE the text property highlighting is
+ combined with any syntax highlighting; when FALSE the
+ text property highlighting replaces the syntax
+ highlighting
+ "priority" when properties overlap, the one with the highest
+ priority will be used.
+ "start_incl" when TRUE inserts at the start position will be
+ included in the text property
+ "end_incl" when TRUE inserts at the end position will be
+ included in the text property
+
+
+Example ~
+
+Suppose line 11 in a buffer has this text (excluding the indent):
+
+ The number 123 is smaller than 4567.
+
+To highlight the numbers in this text: >
+ call prop_type_add('number', {'highlight': 'Constant'})
+ call prop_add(11, 12, {'length': 3, 'type': 'number'})
+ call prop_add(11, 32, {'length': 4, 'type': 'number'})
+
+Try inserting or deleting lines above the text, you will see that the text
+properties stick to the text, thus the line number is adjusted as needed.
+
+Setting "start_incl" and "end_incl" is useful when white space surrounds the
+text, e.g. for a function name. Using false is useful when the text starts
+and/or ends with a specific character, such as the quote surrounding a string.
+
+ func FuncName(arg) ~
+ ^^^^^^^^ property with start_incl and end_incl set
+
+ var = "text"; ~
+ ^^^^^^ property with start_incl and end_incl not set
+
+Nevertheless, when text is inserted or deleted the text may need to be parsed
+and the text properties updated. But this can be done asynchronously.
+
+
+Internal error *E967*
+
+If you see E967, please report the bug. You can do this at Github:
+https://github.com/vim/vim/issues/new
+
+==============================================================================
+2. Functions *text-prop-functions*
+
+Manipulating text property types:
+
+prop_type_add({name}, {props}) define a new property type
+prop_type_change({name}, {props}) change an existing property type
+prop_type_delete({name} [, {props}]) delete a property type
+prop_type_get({name} [, {props}]) get property type values
+prop_type_list([{props}]) get list of property types
+
+
+Manipulating text properties:
+
+prop_add({lnum}, {col}, {props}) add a text property
+prop_add_list({props}, [{item}, ...])
+ add a text property at multiple
+ positions.
+prop_clear({lnum} [, {lnum-end} [, {bufnr}]])
+ remove all text properties
+prop_find({props} [, {direction}]) search for a text property
+prop_list({lnum} [, {props}]) text properties in {lnum}
+prop_remove({props} [, {lnum} [, {lnum-end}]])
+ remove a text property
+
+ *prop_add()* *E965*
+prop_add({lnum}, {col}, {props})
+ Attach a text property at position {lnum}, {col}. {col} is
+ counted in bytes, use one for the first column.
+ If {lnum} is invalid an error is given. *E966*
+ If {col} is invalid an error is given. *E964*
+
+ {props} is a dictionary with these fields:
+ type name of the text property type
+ length length of text in bytes, can only be used
+ for a property that does not continue in
+ another line; can be zero
+ end_lnum line number for the end of text (inclusive)
+ end_col column just after the text; not used when
+ "length" is present; when {col} and "end_col"
+ are equal, and "end_lnum" is omitted or equal
+ to {lnum}, this is a zero-width text property
+ bufnr buffer to add the property to; when omitted
+ the current buffer is used
+ id user defined ID for the property; must be a
+ number, should be positive; when using "text"
+ then "id" must not be present and will be set
+ automatically to a negative number; otherwise
+ zero is used
+ *E1305*
+ text text to be displayed before {col}, or
+ above/below the line if {col} is zero; prepend
+ and/or append spaces for padding with
+ highlighting; cannot be used with "length",
+ "end_lnum" and "end_col"
+ See |virtual-text| for more information.
+ *E1294*
+ text_align when "text" is present and {col} is zero;
+ specifies where to display the text:
+ after after the end of the line
+ right right aligned in the window (unless
+ the text wraps to the next screen
+ line)
+ below in the next screen line
+ above just above the line
+ When omitted "after" is used. Only one
+ "right" property can fit in each line, if
+ there are two or more these will go in a
+ separate line (still right aligned).
+ text_padding_left *E1296*
+ used when "text" is present and {col} is zero;
+ padding between the end of the text line
+ (leftmost column for "below") and the virtual
+ text, not highlighted
+ text_wrap when "text" is present and {col} is zero,
+ specifies what happens if the text doesn't
+ fit:
+ wrap wrap the text to the next line
+ truncate truncate the text to make it fit
+ When omitted "truncate" is used.
+ Note that this applies to the individual text
+ property, the 'wrap' option sets the overall
+ behavior
+ All fields except "type" are optional.
+
+ It is an error when both "length" and "end_lnum" or "end_col"
+ are given. Either use "length" or "end_col" for a property
+ within one line, or use "end_lnum" and "end_col" for a
+ property that spans more than one line.
+ When neither "length" nor "end_col" are given the property
+ will be zero-width. That means it will move with the text, as
+ a kind of mark. One character will be highlighted, if the
+ type specifies highlighting.
+ The property can end exactly at the last character of the
+ text, or just after it. In the last case, if text is appended
+ to the line, the text property size will increase, also when
+ the property type does not have "end_incl" set.
+
+ "type" will first be looked up in the buffer the property is
+ added to. When not found, the global property types are used.
+ If not found an error is given.
+ *virtual-text*
+ When "text" is used and the column is non-zero then this text
+ will be displayed at the specified start location of the text
+ property. The text of the buffer line will be shifted to make
+ room. This is called "virtual text".
+ When the column is zero the virtual text will appear above,
+ after or below the buffer text. The "text_align" and
+ "text_wrap" arguments determine how it is displayed.
+ To separate the virtual text from the buffer text prepend
+ and/or append spaces to the "text" field or use the
+ "text_padding_left" value.
+
+ Make sure to use a highlight that makes clear to the user that
+ this is virtual text, otherwise it will be very confusing that
+ the text cannot be edited. When using "above" you need to
+ make clear this text belongs to the text line below it, when
+ using "below" you need to make sure it belongs to the text
+ line above it.
+
+ The text will be displayed but it is not part of the actual
+ buffer line, the cursor cannot be placed on it. A mouse click
+ in the text will move the cursor to the first character after
+ the text, or the last character of the line.
+ Any Tab and other control character in the text will be
+ changed to a space (Rationale: otherwise the size of the text
+ is difficult to compute).
+ A negative "id" will be chosen and is returned.
+
+ Before text properties with text were supported it was
+ possible to use a negative "id", even though this was very
+ rare. Now that negative "id"s are reserved for text
+ properties with text an error is given when using a negative
+ "id". When a text property with text already exists using a
+ negative "id" results in *E1293* . If a negative "id" was
+ used and later a text property with text is added results in
+ *E1339* .
+
+ Can also be used as a |method|: >
+ GetLnum()->prop_add(col, props)
+<
+ *prop_add_list()*
+prop_add_list({props}, [{item}, ...])
+ Similar to prop_add(), but attaches a text property at
+ multiple positions in a buffer.
+
+ {props} is a dictionary with these fields:
+ bufnr buffer to add the property to; when omitted
+ the current buffer is used
+ id user defined ID for the property; must be a
+ number; when omitted zero is used
+ type name of the text property type
+ All fields except "type" are optional.
+
+ The second argument is a List of items, where each {item} is a
+ list that specifies the starting and ending position of the
+ text: [{lnum}, {col}, {end-lnum}, {end-col}]
+ or: [{lnum}, {col}, {end-lnum}, {end-col}, {id}]
+
+ The first two items {lnum} and {col} specify the starting
+ position of the text where the property will be attached.
+ The next two items {end-lnum} and {end-col} specify the
+ position just after the text.
+ An optional fifth item {id} can be used to give a different ID
+ to a property. When omitted the ID from {props} is used,
+ falling back to zero if none are present.
+
+ It is not possible to add a text property with a "text" field
+ here.
+
+ Example: >
+ call prop_add_list(#{type: 'MyProp', id: 2},
+ \ [[1, 4, 1, 7],
+ \ [1, 15, 1, 20],
+ \ [2, 30, 3, 30]]
+<
+ Can also be used as a |method|: >
+ GetProp()->prop_add_list([[1, 1, 1, 2], [1, 4, 1, 8]])
+
+
+prop_clear({lnum} [, {lnum-end} [, {props}]]) *prop_clear()*
+ Remove all text properties from line {lnum}.
+ When {lnum-end} is given, remove all text properties from line
+ {lnum} to {lnum-end} (inclusive).
+
+ When {props} contains a "bufnr" item use this buffer,
+ otherwise use the current buffer.
+
+ Can also be used as a |method|: >
+ GetLnum()->prop_clear()
+<
+ *prop_find()*
+prop_find({props} [, {direction}])
+ Search for a text property as specified with {props}:
+ id property with this ID
+ type property with this type name
+ both "id" and "type" must both match
+ bufnr buffer to search in; when present a
+ start position with "lnum" and "col"
+ must be given; when omitted the
+ current buffer is used
+ lnum start in this line (when omitted start
+ at the cursor)
+ col start at this column (when omitted
+ and "lnum" is given: use column 1,
+ otherwise start at the cursor)
+ skipstart do not look for a match at the start
+ position
+
+ A property matches when either "id" or "type" matches.
+ {direction} can be "f" for forward and "b" for backward. When
+ omitted forward search is performed.
+
+ If a match is found then a Dict is returned with the entries
+ as with prop_list(), and additionally an "lnum" entry.
+ If no match is found then an empty Dict is returned.
+
+
+prop_list({lnum} [, {props}]) *prop_list()*
+ Returns a List with all the text properties in line {lnum}.
+
+ The following optional items are supported in {props}:
+ bufnr use this buffer instead of the current buffer
+ end_lnum return text properties in all the lines
+ between {lnum} and {end_lnum} (inclusive).
+ A negative value is used as an offset from the
+ last buffer line; -1 refers to the last buffer
+ line.
+ types List of property type names. Return only text
+ properties that match one of the type names.
+ ids List of property identifiers. Return only text
+ properties with one of these identifiers.
+
+ The properties are ordered by starting column and priority.
+ Each property is a Dict with these entries:
+ lnum starting line number. Present only when
+ returning text properties between {lnum} and
+ {end_lnum}.
+ col starting column
+ length length in bytes, one more if line break is
+ included
+ id property ID
+ type name of the property type, omitted if
+ the type was deleted
+ type_bufnr buffer number for which this type was defined;
+ 0 if the type is global
+ start when TRUE property starts in this line
+ end when TRUE property ends in this line
+
+ When "start" is zero the property started in a previous line,
+ the current one is a continuation.
+ When "end" is zero the property continues in the next line.
+ The line break after this line is included.
+
+ Returns an empty list on error.
+
+ Examples:
+ " get text properties placed in line 5
+ echo prop_list(5)
+ " get text properties placed in line 20 in buffer 4
+ echo prop_list(20, {'bufnr': 4})
+ " get all the text properties between line 1 and 20
+ echo prop_list(1, {'end_lnum': 20})
+ " get all the text properties of type 'myprop'
+ echo prop_list(1, {'types': ['myprop'],
+ \ 'end_lnum': -1})
+ " get all the text properties of type 'prop1' or 'prop2'
+ echo prop_list(1, {'types': ['prop1', 'prop2'],
+ \ 'end_lnum': -1})
+ " get all the text properties with ID 8
+ echo prop_list(1, {'ids': [8], 'end_lnum': line('$')})
+ " get all the text properties with ID 10 and 20
+ echo prop_list(1, {'ids': [10, 20], 'end_lnum': -1})
+ " get text properties with type 'myprop' and ID 100
+ " in buffer 4.
+ echo prop_list(1, {'bufnr': 4, 'types': ['myprop'],
+ \ 'ids': [100], 'end_lnum': -1})
+
+ Can also be used as a |method|: >
+ GetLnum()->prop_list()
+<
+ *prop_remove()* *E968* *E860*
+prop_remove({props} [, {lnum} [, {lnum-end}]])
+ Remove a matching text property from line {lnum}. When
+ {lnum-end} is given, remove matching text properties from line
+ {lnum} to {lnum-end} (inclusive).
+ When {lnum} is omitted remove matching text properties from
+ all lines (this requires going over all lines, thus will be a
+ bit slow for a buffer with many lines).
+
+ {props} is a dictionary with these fields:
+ id remove text properties with this ID
+ type remove text properties with this type name
+ types remove text properties with type names in this
+ List
+ both "id" and "type"/"types" must both match
+ bufnr use this buffer instead of the current one
+ all when TRUE remove all matching text properties,
+ not just the first one
+ Only one of "type" and "types" may be supplied. *E1295*
+
+ A property matches when either "id" or one of the supplied
+ types matches.
+ If buffer "bufnr" does not exist you get an error message.
+ If buffer "bufnr" is not loaded then nothing happens.
+
+ Returns the number of properties that were removed.
+
+ Can also be used as a |method|: >
+ GetProps()->prop_remove()
+
+
+prop_type_add({name}, {props}) *prop_type_add()* *E969* *E970*
+ Add a text property type {name}. If a property type with this
+ name already exists an error is given. Nothing is returned.
+ {props} is a dictionary with these optional fields:
+ bufnr define the property only for this buffer; this
+ avoids name collisions and automatically
+ clears the property types when the buffer is
+ deleted.
+ highlight name of highlight group to use
+ priority when a character has multiple text
+ properties the one with the highest priority
+ will be used; negative values can be used, the
+ default priority is zero
+ combine when omitted or TRUE combine the highlight
+ with any syntax highlight; when FALSE syntax
+ highlight will not be used
+ override when TRUE the highlight overrides any other,
+ including 'cursorline' and Visual
+ start_incl when TRUE inserts at the start position will
+ be included in the text property
+ end_incl when TRUE inserts at the end position will be
+ included in the text property
+
+ Can also be used as a |method|: >
+ GetPropName()->prop_type_add(props)
+
+prop_type_change({name}, {props}) *prop_type_change()*
+ Change properties of an existing text property type. If a
+ property with this name does not exist an error is given.
+ The {props} argument is just like |prop_type_add()|.
+
+ Can also be used as a |method|: >
+ GetPropName()->prop_type_change(props)
+
+prop_type_delete({name} [, {props}]) *prop_type_delete()*
+ Remove the text property type {name}. When text properties
+ using the type {name} are still in place, they will not have
+ an effect and can no longer be removed by name.
+
+ {props} can contain a "bufnr" item. When it is given, delete
+ a property type from this buffer instead of from the global
+ property types.
+
+ When text property type {name} is not found there is no error.
+
+ Can also be used as a |method|: >
+ GetPropName()->prop_type_delete()
+
+prop_type_get({name} [, {props}]) *prop_type_get()*
+ Returns the properties of property type {name}. This is a
+ dictionary with the same fields as was given to
+ prop_type_add().
+ When the property type {name} does not exist, an empty
+ dictionary is returned.
+
+ {props} can contain a "bufnr" item. When it is given, use
+ this buffer instead of the global property types.
+
+ Can also be used as a |method|: >
+ GetPropName()->prop_type_get()
+
+prop_type_list([{props}]) *prop_type_list()*
+ Returns a list with all property type names.
+
+ {props} can contain a "bufnr" item. When it is given, use
+ this buffer instead of the global property types.
+
+
+==============================================================================
+3. When text changes *text-prop-changes*
+
+Vim will do its best to keep the text properties on the text where it was
+attached. When inserting or deleting text the properties after the change
+will move accordingly.
+
+When text is deleted and a text property no longer includes any text, it is
+deleted. However, a text property that was defined as zero-width will remain,
+unless the whole line is deleted.
+ *E275*
+When a buffer is unloaded, all the text properties are gone. There is no way
+to store the properties in a file. You can only re-create them. When a
+buffer is hidden the text is preserved and so are the text properties. It is
+not possible to add text properties to an unloaded buffer.
+
+When using replace mode, the text properties stay on the same character
+positions, even though the characters themselves change.
+
+To update text properties after the text was changed, install a callback with
+`listener_add()`. E.g, if your plugin does spell checking, you can have the
+callback update spelling mistakes in the changed text. Vim will move the
+properties below the changed text, so that they still highlight the same text,
+thus you don't need to update these.
+
+
+Text property columns are not updated or copied: ~
+
+- When setting the line with |setline()| or through an interface, such as Lua,
+ Tcl or Python. Vim does not know what text got inserted or deleted.
+- With a command like `:move`, which takes a line of text out of context.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/tips.txt b/runtime/doc/tips.txt
new file mode 100644
index 0000000..ea8d538
--- /dev/null
+++ b/runtime/doc/tips.txt
@@ -0,0 +1,559 @@
+*tips.txt* For Vim version 9.0. Last change: 2021 Nov 06
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Tips and ideas for using Vim *tips*
+
+These are just a few that we thought would be helpful for many users.
+You can find many more tips on the wiki. The URL can be found on
+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|
+Executing shell commands in a window |shell-window|
+Hex editing |hex-editing|
+Using <> notation in autocommands |autocmd-<>|
+Highlighting matching parens |match-parens|
+Opening help in the current window |help-curwin|
+
+==============================================================================
+Editing C programs *C-editing*
+
+There are quite a few features in Vim to help you edit C program files. Here
+is an overview with tags to jump to:
+
+|usr_29.txt| Moving through programs chapter in the user manual.
+|usr_30.txt| Editing programs chapter in the user manual.
+|C-indenting| Automatically set the indent of a line while typing
+ text.
+|=| Re-indent a few lines.
+|format-comments| Format comments.
+
+|:checkpath| Show all recursively included files.
+|[i| Search for identifier under cursor in current and
+ included files.
+|[_CTRL-I| Jump to match for "[i"
+|[I| List all lines in current and included files where
+ identifier under the cursor matches.
+|[d| Search for define under cursor in current and included
+ files.
+
+|CTRL-]| Jump to tag under cursor (e.g., definition of a
+ function).
+|CTRL-T| Jump back to before a CTRL-] command.
+|:tselect| Select one tag out of a list of matching tags.
+
+|gd| Go to Declaration of local variable under cursor.
+|gD| Go to Declaration of global variable under cursor.
+
+|gf| Go to file name under the cursor.
+
+|%| Go to matching (), {}, [], /* */, #if, #else, #endif.
+|[/| Go to previous start of comment.
+|]/| Go to next end of comment.
+|[#| Go back to unclosed #if, #ifdef, or #else.
+|]#| Go forward to unclosed #else or #endif.
+|[(| Go back to unclosed '('
+|])| Go forward to unclosed ')'
+|[{| Go back to unclosed '{'
+|]}| Go forward to unclosed '}'
+
+|v_ab| Select "a block" from "[(" to "])", including braces
+|v_ib| Select "inner block" from "[(" to "])"
+|v_aB| Select "a block" from "[{" to "]}", including brackets
+|v_iB| Select "inner block" from "[{" to "]}"
+
+==============================================================================
+Finding where identifiers are used *ident-search*
+
+You probably already know that |tags| can be used to jump to the place where a
+function or variable is defined. But sometimes you wish you could jump to all
+the places where a function or variable is being used. This is possible in
+two ways:
+1. Using the |:grep| command. This should work on most Unix systems,
+ but can be slow (it reads all files) and only searches in one directory.
+2. Using ID utils. This is fast and works in multiple directories. It uses a
+ database to store locations. You will need some additional programs for
+ this to work. And you need to keep the database up to date.
+
+Using the GNU id-tools:
+
+What you need:
+- The GNU id-tools installed (mkid is needed to create ID and lid is needed to
+ use the macros).
+- An identifier database file called "ID" in the current directory. You can
+ create it with the shell command "mkid file1 file2 ..".
+
+Put this in your .vimrc: >
+ map _u :call ID_search()<Bar>execute "/\\<" .. g:word .. "\\>"<CR>
+ map _n :n<Bar>execute "/\\<" .. g:word .. "\\>"<CR>
+
+ function! ID_search()
+ let g:word = expand("<cword>")
+ let x = system("lid --key=none " .. g:word)
+ let x = substitute(x, "\n", " ", "g")
+ execute "next " .. x
+ endfun
+
+To use it, place the cursor on a word, type "_u" and vim will load the file
+that contains the word. Search for the next occurrence of the word in the
+same file with "n". Go to the next file with "_n".
+
+This has been tested with id-utils-3.2 (which is the name of the id-tools
+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.
+
+NOTE 1: If you recompile Vim with FEAT_XTERM_SAVE defined in feature.h, the
+builtin xterm will include the mentioned "te" and "ti" entries.
+
+NOTE 2: If you want to disable the screen switching, and you don't want to
+change your termcap, you can add these lines to your .vimrc: >
+ :set t_ti= t_te=
+
+==============================================================================
+Scrolling in Insert mode *scroll-insert*
+
+If you are in insert mode and you want to see something that is just off the
+screen, you can use CTRL-X CTRL-E and CTRL-X CTRL-Y to scroll the screen.
+ |i_CTRL-X_CTRL-E|
+
+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|.
+
+Also consider setting 'scrolloff' to a larger value, so that you can always see
+some context around the cursor. If 'scrolloff' is bigger than half the window
+height, the cursor will always be in the middle and the text is scrolled when
+the cursor is moved up/down.
+
+==============================================================================
+Smooth scrolling *scroll-smooth*
+
+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*
+
+When there are a few words that you keep on typing in the wrong way, make
+abbreviations that correct them. For example: >
+ :ab teh the
+ :ab fro for
+
+==============================================================================
+Counting words, lines, etc. *count-items*
+
+To count how often any pattern occurs in the current buffer use the substitute
+command and add the 'n' flag to avoid the substitution. The reported number
+of substitutions is the number of items. Examples: >
+
+ :%s/./&/gn characters
+ :%s/\i\+/&/gn words
+ :%s/^//n lines
+ :%s/the/&/gn "the" anywhere
+ :%s/\<the\>/&/gn "the" as a word
+
+You might want to reset 'hlsearch' or do ":nohlsearch".
+Add the 'e' flag if you don't want an error when there are no matches.
+
+An alternative is using |v_g_CTRL-G| in Visual mode.
+
+If you want to find matches in multiple files use |:vimgrep|.
+
+ *count-bytes*
+If you want to count bytes, you can use this:
+
+ Visually select the characters (block is also possible)
+ Use "y" to yank the characters
+ Use the strlen() function: >
+ :echo strlen(@")
+A line break is counted for one byte.
+
+==============================================================================
+Restoring the cursor position *restore-position*
+
+Sometimes you want to write a mapping that makes a change somewhere in the
+file and restores the cursor position, without scrolling the text. For
+example, to change the date mark in a file: >
+ :map <F2> msHmtgg/Last [cC]hange:\s*/e+1<CR>"_D"=strftime("%Y %b %d")<CR>p'tzt`s
+
+Breaking up saving the position:
+ ms store cursor position in the 's' mark
+ H go to the first line in the window
+ mt store this position in the 't' mark
+
+Breaking up restoring the position:
+ 't go to the line previously at the top of the window
+ zt scroll to move this line to the top of the window
+ `s jump to the original position of the cursor
+
+For something more advanced see |winsaveview()| and |winrestview()|.
+
+==============================================================================
+Renaming files *rename-files*
+
+Say I have a directory with the following files in them (directory picked at
+random :-):
+
+buffer.c
+charset.c
+digraph.c
+...
+
+and I want to rename *.c *.bla. I'd do it like this: >
+
+ $ vim
+ :r !ls *.c
+ :%s/\(.*\).c/mv & \1.bla
+ :w !sh
+ :q!
+
+==============================================================================
+Change a name in multiple files *change-name*
+
+Example for using a script file to change a name in several files:
+
+ Create a file "subs.vim" containing substitute commands and a :update
+ command: >
+ :%s/Jones/Smith/g
+ :%s/Allen/Peter/g
+ :update
+<
+ Execute Vim on all files you want to change, and source the script for
+ each argument: >
+
+ vim *.let
+ argdo source subs.vim
+
+See |:argdo|.
+
+==============================================================================
+Speeding up external commands *speed-up*
+
+In some situations, execution of an external command can be very slow. This
+can also slow down wildcard expansion on Unix. Here are a few suggestions to
+increase the speed.
+
+If your .cshrc (or other file, depending on the shell used) is very long, you
+should separate it into a section for interactive use and a section for
+non-interactive use (often called secondary shells). When you execute a
+command from Vim like ":!ls", you do not need the interactive things (for
+example, setting the prompt). Put the stuff that is not needed after these
+lines: >
+
+ if ($?prompt == 0) then
+ exit 0
+ endif
+
+Another way is to include the "-f" flag in the 'shell' option, e.g.: >
+
+ :set shell=csh\ -f
+
+(the backslash is needed to include the space in the option).
+This will make csh completely skip the use of the .cshrc file. This may cause
+some things to stop working though.
+
+==============================================================================
+Useful mappings *useful-mappings*
+
+Here are a few mappings that some people like to use.
+
+ *map-backtick* >
+ :map ' `
+Make the single quote work like a backtick. Puts the cursor on the column of
+a mark, instead of going to the first non-blank character in the line.
+
+ *emacs-keys*
+For Emacs-style editing on the command-line: >
+ " start of line
+ :cnoremap <C-A> <Home>
+ " back one character
+ :cnoremap <C-B> <Left>
+ " delete character under cursor
+ :cnoremap <C-D> <Del>
+ " end of line
+ :cnoremap <C-E> <End>
+ " forward one character
+ :cnoremap <C-F> <Right>
+ " recall newer command-line
+ :cnoremap <C-N> <Down>
+ " recall previous (older) command-line
+ :cnoremap <C-P> <Up>
+ " back one word
+ :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
+be able to give comments to the parts of the mapping. >
+
+ :let m = ":map _f :set ai<CR>" " need 'autoindent' set
+ :let m ..= "{O<Esc>" " add empty line above item
+ :let m ..= "}{)^W" " move to text after bullet
+ :let m ..= "i <CR> <Esc>" " add space for indent
+ :let m ..= "gq}" " format text after the bullet
+ :let m ..= "{dd" " remove the empty line
+ :let m ..= "5lDJ" " put text after bullet
+ :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'.)
+
+Note that the last comment starts with |", because the ":execute" command
+doesn't accept a comment directly.
+
+You also need to set 'textwidth' to a non-zero value, e.g., >
+ :set tw=70
+
+A mapping that does about the same, but takes the indent for the list from the
+first line (Note: this mapping is a single long line with a lot of spaces): >
+ :map _f :set ai<CR>}{a <Esc>WWmmkD`mi<CR><Esc>kkddpJgq}'mJO<Esc>j
+<
+ *collapse*
+These two mappings reduce a sequence of empty (;b) or blank (;n) lines into a
+single line >
+ :map ;b GoZ<Esc>:g/^$/.,/./-j<CR>Gdd
+ :map ;n GoZ<Esc>:g/^[ <Tab>]*$/.,/[^ <Tab>]/-j<CR>Gdd
+
+==============================================================================
+Compressing the help files *gzip-helpfile*
+
+For those of you who are really short on disk space, you can compress the help
+files and still be able to view them with Vim. This makes accessing the help
+files a bit slower and requires the "gzip" program.
+
+(1) Compress all the help files: "gzip doc/*.txt".
+
+(2) Edit "doc/tags" and change the ".txt" to ".txt.gz": >
+ :%s=\(\t.*\.txt\)\t=\1.gz\t=
+
+(3) Add this line to your vimrc: >
+ set helpfile={dirname}/help.txt.gz
+
+Where {dirname} is the directory where the help files are. The |gzip| plugin
+will take care of decompressing the files.
+You must make sure that $VIMRUNTIME is set to where the other Vim files are,
+when they are not in the same location as the compressed "doc" directory. See
+|$VIMRUNTIME|.
+
+==============================================================================
+Executing shell commands in a window *shell-window*
+
+See |terminal|.
+
+Another solution is splitting your terminal screen or display window with the
+"splitvt" program. You can probably find it on some ftp server. The person
+that knows more about this is Sam Lantinga <slouken@cs.ucdavis.edu>.
+
+Another alternative is the "window" command, found on BSD Unix systems, which
+supports multiple overlapped windows. Or the "screen" program, found at
+www.uni-erlangen.de, which supports a stack of windows.
+
+==============================================================================
+Hex editing *hex-editing* *using-xxd*
+
+See section |23.4| 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
+bit of autocmds for your <.vimrc>. Change that "*.bin" to whatever
+comma-separated list of extension(s) you find yourself wanting to edit: >
+
+ " vim -b : edit binary using xxd-format!
+ augroup Binary
+ au!
+ au BufReadPre *.bin let &bin=1
+ au BufReadPost *.bin if &bin | %!xxd
+ au BufReadPost *.bin set ft=xxd | endif
+ au BufWritePre *.bin if &bin | %!xxd -r
+ au BufWritePre *.bin endif
+ au BufWritePost *.bin if &bin | %!xxd
+ au BufWritePost *.bin set nomod | endif
+ augroup END
+
+==============================================================================
+Using <> notation in autocommands *autocmd-<>*
+
+The <> notation is not recognized in the argument of an :autocmd. To avoid
+having to use special characters, you could use a self-destroying mapping to
+get the <> notation and then call the mapping from the autocmd. Example:
+
+ *map-self-destroy* >
+ " This is for automatically adding the name of the file to the menu list.
+ " It uses a self-destroying mapping!
+ " 1. use a line in the buffer to convert the 'dots' in the file name to \.
+ " 2. store that in register '"'
+ " 3. add that name to the Buffers menu list
+ " WARNING: this does have some side effects, like overwriting the
+ " current register contents and removing any mapping for the "i" command.
+ "
+ autocmd BufNewFile,BufReadPre * nmap i :nunmap i<CR>O<C-R>%<Esc>:.g/\./s/\./\\./g<CR>0"9y$u:menu Buffers.<C-R>9 :buffer <C-R>%<C-V><CR><CR>
+ autocmd BufNewFile,BufReadPre * normal i
+
+Another method, perhaps better, is to use the ":execute" command. In the
+string you can use the <> notation by preceding it with a backslash. Don't
+forget to double the number of existing backslashes and put a backslash before
+'"'.
+>
+ autocmd BufNewFile,BufReadPre * exe "normal O\<C-R>%\<Esc>:.g/\\./s/\\./\\\\./g\<CR>0\"9y$u:menu Buffers.\<C-R>9 :buffer \<C-R>%\<C-V>\<CR>\<CR>"
+
+For a real buffer menu, user functions should be used (see |:function|), but
+then the <> notation isn't used, which defeats using it as an example here.
+
+==============================================================================
+Highlighting matching parens *match-parens*
+
+This example shows the use of a few advanced tricks:
+- using the |CursorMoved| autocommand event
+- using |searchpairpos()| to find a matching paren
+- using |synID()| to detect whether the cursor is in a string or comment
+- using |:match| to highlight something
+- using a |pattern| to match a specific position in the file.
+
+This should be put in a Vim script file, since it uses script-local variables.
+It skips matches in strings or comments, unless the cursor started in string
+or comment. This requires syntax highlighting.
+
+A slightly more advanced version is used in the |matchparen| plugin.
+>
+ let s:paren_hl_on = 0
+ function s:Highlight_Matching_Paren()
+ if s:paren_hl_on
+ match none
+ let s:paren_hl_on = 0
+ endif
+
+ let c_lnum = line('.')
+ let c_col = col('.')
+
+ let c = getline(c_lnum)[c_col - 1]
+ let plist = split(&matchpairs, ':\|,')
+ let i = index(plist, c)
+ if i < 0
+ return
+ endif
+ if i % 2 == 0
+ let s_flags = 'nW'
+ let c2 = plist[i + 1]
+ else
+ let s_flags = 'nbW'
+ let c2 = c
+ let c = plist[i - 1]
+ endif
+ if c == '['
+ let c = '\['
+ let c2 = '\]'
+ endif
+ let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' ..
+ \ '=~? "string\\|comment"'
+ execute 'if' s_skip '| let s_skip = 0 | endif'
+
+ let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip)
+
+ if m_lnum > 0 && m_lnum >= line('w0') && m_lnum <= line('w$')
+ exe 'match Search /\(\%' .. c_lnum .. 'l\%' .. c_col ..
+ \ 'c\)\|\(\%' .. m_lnum .. 'l\%' .. m_col .. 'c\)/'
+ let s:paren_hl_on = 1
+ endif
+ endfunction
+
+ autocmd CursorMoved,CursorMovedI * call s:Highlight_Matching_Paren()
+ autocmd InsertEnter * match none
+<
+
+==============================================================================
+Opening help in the current window *help-curwin*
+
+By default, help is displayed in a split window. If you prefer it opens in
+the current window, try this custom `:HelpCurwin` command:
+>
+ command -bar -nargs=? -complete=help HelpCurwin execute s:HelpCurwin(<q-args>)
+ let s:did_open_help = v:false
+
+ function s:HelpCurwin(subject) abort
+ let mods = 'silent noautocmd keepalt'
+ if !s:did_open_help
+ execute mods .. ' help'
+ execute mods .. ' helpclose'
+ let s:did_open_help = v:true
+ endif
+ if !getcompletion(a:subject, 'help')->empty()
+ execute mods .. ' edit ' .. &helpfile
+ set buftype=help
+ endif
+ return 'help ' .. a:subject
+ endfunction
+<
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
new file mode 100644
index 0000000..6792ac5
--- /dev/null
+++ b/runtime/doc/todo.txt
@@ -0,0 +1,6248 @@
+*todo.txt* For Vim version 9.0. Last change: 2023 Feb 26
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ TODO list for Vim *todo*
+
+This is a veeeery long list of known bugs, current work and desired
+improvements. To make it a little bit accessible, the older items are grouped
+by subject. In the first column of the line a classification is used to be
+able to look for "the next thing to do":
+
+Priority classification:
+9 next point release
+8 next release
+7 as soon as possible
+6 soon
+5 should be included
+4 nice to have
+3 consider including
+2 maybe not
+1 probably not
+- unclassified
+
+ *votes-for-changes*
+See |develop.txt| for development plans. You can vote for which items should
+be worked on, but only if you sponsor Vim development. See |sponsor|.
+
+Issues can also be entered online: https://github.com/vim/vim/issues
+Only use this for bug reports, not for questions! Those belong on the
+maillist. Updates will be forwarded to the |vim_dev| maillist. Issues
+entered there will not be repeated below, unless there is extra information.
+
+The #1234 numbers refer to an issue or pull request on github. To see it in a
+browser use: https://github.com/vim/vim/issues/1234
+(replace 1234 with the issue/pull number)
+ *known-bugs*
+-------------------- Known bugs and current work -----------------------
+
+Crash when splitting window: #11961. Set RedrawingDisabled in
+win_split_ins().
+
+CI: include #12008 end of February.
+
+In runtime/autoload/dist/script.vim change "set ft=" to "setlocal ft=" ?
+
+CTRL-J mapping is not used if halfway another mapping. #12002
+Is simplified mapping not used but escape code has been simplified?
+
+Include #11952 after a runtime files update.
+
+Errors when running tests with valgrind:
+- test_codestyle.vim: e.g.:
+ command line..script /home/mool/vim/vim90/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 6: keycode_check.vim: space before tab: Expected 0 but got 7
+ command line..script /home/mool/vim/vim90/src/testdir/runtest.vim[569]..function RunTheTest[52]..Test_test_files line 10: setup.vim: trailing white space: Expected 0 but got 23
+- test_gui.vim:
+ Found errors in Test_gui_mouse_event():
+
+Upcoming larger works:
+- Make spell checking work with recent .dic/.aff files, e.g. French. #4916
+ Make Vim understand the format somehow? Search for "spell" below.
+ Make sure suggestions are speedy, also with composed words (German).
+- Discuss alternatives for using other grammars (treesitter, TextMate).
+ - Possibly conversion to Vim syntax rules.
+ - Other mechanism than group and cluster to nest syntax items, to be used
+ for grammars.
+ - Possibly keeping the parsed syntax tree and incremental updates.
+ - tree-sitter doesn't handle incorrect syntax (while typing) properly.
+ - Make clear how it relates to LSP.
+ - example plugin: https://github.com/uga-rosa/dps-vsctm.vim
+
+
+Further Vim9 improvements, possibly after launch:
+- implement :class and :interface: See |vim9-classes
+ - Change access: public by default, private by prefixing "_".
+ Check for error: can't have same name twice (ignoring "_" prefix).
+ - Make ":defcompile ClassName" compile all functions and methods in the
+ class.
+ - Private methods?
+ either: private def Func()
+ or: def _Func()
+ Perhaps use "private" keyword instead of "_" prefix?
+ - "final" object members - can only be set in the constructor.
+ - accept line breaks in member initialization. #11957
+ - object empty(), len() - can class define a method to be used for them?
+ - add to help: when using a default new() method then reordering object
+ members may cause trouble. Can define new() without arguments to avoid.
+ - TODO items: check types for "implements" - members and methods
+ - how about lock/unlock?
+ - When checking "implements" also check types of members and function args.
+ - For chaining, allow using the class name as type for function return
+ value.
+ - Implement generics
+ - Add "instanceof" (exact class name). And "assignable" (class or child)?
+ - More efficient way for interface member index than iterating over list?
+ - a variant of type() that returns a different type for each class?
+ list<number> and list<string> should also differ.
+ - Issue #11822: any.Func() can be a dict or an object call, need to handle
+ this at runtime.
+- implement :type
+- implement :enum
+- Promise class, could be used to wait on a popup close callback?
+- class local to a function
+- Use Vim9 for more runtime files.
+- Inline call to map() and filter(), better type checking.
+- When evaluating constants for script variables, some functions could work:
+ has(featureName), len(someString)
+- Implement as part of an expression: ++expr, --expr, expr++, expr--.
+
+Information missing in terminfo:
+- Accept "hyper" and "meta" modifiers (16 and 32) from Kitty like Meta?
+ 8 is actually "super".
+- t_RV request terminal version string; xterm: "\033[>c"
+ change in terminfo for "RV" uses the wrong escape sequence 7 - 14 Jan only
+Codes used for focus gained and lost (currently using use_xterm_like_mouse())
+ termcodes are hard-coded in set_termname(), not named.
+ Use the XF flag? enables recognizing the focus in/out events.
+ Check if t_fe is not empty.
+ Check for "1004" in t_XM. (disadvantage: only focus events when mouse is
+ used)
+- t_fe enable focus-event tracking
+- t_fd disable focus-event tracking
+Modifiers for various keys
+- flag to indicate "xterm compatible modifiers" ?
+Underline and similar:
+- t_AU - Set underline color: like "AF" and "AB" entries.
+- t_Ce undercurl and underline end
+- t_Cs undercurl (curly underline) mode
+- t_Us double underline mode
+- t_ds dotted underline mode
+- t_Ds dashed underline mode
+- t_Te strikethrough end
+- t_Ts strikethrough mode
+Cursor codes: |termcap-cursor-shape|
+- t_RC request terminal cursor blinking
+- t_RS request terminal cursor style
+- t_VS cursor normally visible (no blink)
+- t_SI start insert mode (bar cursor shape)
+- t_SR start replace mode (underline cursor shape)
+- t_EI end insert or replace mode (block cursor shape)
+- t_SC set cursor color start
+- t_EC set cursor color end
+- t_SH set cursor shape
+State requests:
+- t_RF request terminal foreground color
+- t_RB request terminal background color
+Less important (not needed for regular editing):
+- t_IS set icon text start
+- t_IE set icon text end
+- t_ST save window title to stack
+- t_RT restore window title from stack
+- t_Si save icon text to stack
+- t_Ri restore icon text from stack
+- t_WP set window position (Y, X) in pixels
+- t_GP get window position (Y, X) in pixels
+- t_WS set window size (height, width in cells)
+Vim internal, but there should be a terminfo entry for these:
+- t_8f set foreground color (R, G, B) in printf() format
+- t_8b set background color (R, G, B) in printf() format
+- t_8u set underline color (R, G, B) in printf() format
+Probably Vim internal, not in terminfo:
+- t_TE end of "raw" mode
+- t_TI put terminal into "raw" mode
+- t_RK request terminal keyboard protocol state; sent after |t_TI|
+Already working, not properly documented:
+- t_u7 request cursor position
+
+Popup windows:
+- Add a function to redraw a specific popup window. Esp. to be used when
+ editing the command line, when screen updating doesn't happen. (Shougo)
+ #10210 Example that shows the need on the issue.
+ Probably need to update all popup windows (they may overlap)
+ If the display is scrolled need to redraw everything later.
+- Add a flag to make a popup window focusable?
+ CTRL-W P cycle over any preview window or focusable popup, end up back in
+ current window.
+ ? - switch between current window and all popup windows
+ Esc in popup window goes back to previous current window
+- Add a termcap entry for changing the cursor when it goes under the popup and
+ back. like t_SI and t_EI (t_SU and t_EU, where "U" means under?)
+- With terminal in popup, allow for popup_hide() to temporarily hide it.?
+- Make it possible to scroll horizontally when 'wrap' is off. Does this
+ require an ascii scrollbar, like with the vertical one?
+- Fire some autocommand event after a new popup window was created and
+ positioned? PopupNew? Could be used to set some options or move it out of
+ the way. (#5737)
+ However, it may also cause trouble, changing the popup of another plugin.
+- Width is not computed correctly when minwidth and maxwidth are &columns
+ and padding and a scrollbar are used. (#6676)
+- Should popup_getoptions() also return the mask? #7774
+- Add a way to use popup_menu() synchronously: instead of invoking the
+ callback, return the choice. (Ben Jackson, #6534)
+- When using a popup for the info of a completion menu, and there is not
+ enough space, let the popup overlap with the menu. (#4544)
+- Implement flip option.
+- Make redrawing more efficient and avoid flicker:
+ - put popup menu also in popup_mask?
+- Match does not have right BG color if line length equals popup width.
+ (#5658)
+- Figure out the size and position better if wrapping inserts indent
+
+'incsearch' with :s:
+- :s/foo using CTRL-G moves to another line, should not happen, or use the
+ correct line (it uses the last but one line) (Lifepillar, Aug 18, #3345)
+- Also support range: :/foo/,/bar/delete
+- Also support for user command, e.g. Cfilter
+- :%s/foo should take the first match below the cursor line, unless there
+ isn't one?
+ Then :%s?foo should take the first match above the cursor line.
+
+Prompt buffer:
+- Add a command line history, using up/down keys. issue #5010
+- delay next prompt until plugin gives OK?
+- add prompt_addtext({buf}, {expr}) none add text to a prompt buffer
+
+Terminal debugger:
+- Add a mechanism for configuration. Instead of several global variables use
+ a dictionary. Use callbacks for some things, e.g. opening a debug window in
+ a certain position.
+- Make prompt-buffer variant work better.
+- Add option to not open the program window. It's not used when attaching to
+ an already running program. (M. Kelly)
+- Use the optional token on requests, match the result with it. #10300
+- When only gdb window exists, on "quit" edit another buffer.
+- Termdebug does not work when Vim was built with mzscheme: gdb hangs just
+ after "run". Everything else works, including communication channel. Not
+ initializing mzscheme avoid the problem, thus it's not some #ifdef.
+- Add support for lldb? issue #3565
+- Could we do something similar for debugging Vim scripts? At least see the
+ script while stepping through it. Simple version would use an extra window.
+ More complete solution would actually run Vim in a Terminal and control it
+ with another Vim instance.
+
+Terminal emulator window:
+- Can escape a terminal popup with win_gotoid(), should be an error
+- No support for underline color, t_8u.
+- When in terminal-Normal mode when the job finishes, the cursor jumps to the
+ end but the window is not updated. This only happens when typing "a".
+ :term bash -c "for V in {0..5}; do echo $V; sleep 1; done"
+- When started with ":terminal ++close" and the shell exits but there is a
+ background process, the window remains open, because the channel still
+ exists (and output still shows). Perhaps close the window when an explicit
+ ++close was used? (#5931)
+- Using "CTRL-W :confirm quite" and selecting "yes" should work like ":quit!".
+ (Harm te Hennepe, #6129)
+- When the job in the terminal doesn't use mouse events, let the scroll wheel
+ scroll the scrollback, like a terminal does at the shell prompt. #2490
+ A bit like using CTRL-W N first.
+ Jump back like with "a" when any key is typed.
+ And use modeless selection. #2962
+- Use CTRL-W CTRL-K to enter a digraph? #5371
+- When Vim runs in the terminal and changes the title, the statusline needs to
+ be redrawn.
+- GUI: When using ":set go+=!" a system() call causes the hit-enter prompt.
+ (#3327)
+- Allow for specifying the directory, with ++cwd={dir}.
+- When pasting should call vterm_keyboard_start_paste(), e.g. when using
+ K_MIDDLEMOUSE, calling insert_reg().
+- Users expect parsing the :term argument like a shell does, also support
+ single quotes. E.g. with: :term grep 'alice says "hello"' (#1999)
+- Win32: Redirecting input does not work, half of Test_terminal_redir_file()
+ is disabled.
+- Win32: Redirecting output works but includes escape sequences.
+- Win32: Make terminal used for :!cmd in the GUI work better. Allow for
+ redirection.
+- When the job only outputs lines, we could handle resizing the terminal
+ better: store lines separated by line breaks, instead of screen lines,
+ then when the window is resized redraw those lines.
+- Redrawing is slow with Motif. (Ramel Eshed)
+- For the GUI fill termios with default values, perhaps like pangoterm:
+ http://bazaar.launchpad.net/~leonerd/pangoterm/trunk/view/head:/main.c#L134
+- When 'encoding' is not utf-8, or the job is using another encoding, setup
+ conversions.
+
+Patch adds showcmd() function #11708
+
+Crash when a variable is removed while listing variables (Issue #11435)
+
+Autoconf: must use autoconf 2.69, later version generates lots of warnings
+- try using autoconf 2.71 and fix all "obsolete" warnings #11322
+
+Problem with Visual highlight when 'linebreak' and 'showbreak' are set.
+#11272
+
+Can deref_func_name() and deref_function_name() be merged?
+
+After patch 8.2.4915 w_botline is computed much more often. Can this be
+reduced?
+
+Add BufDeletePost. #11041
+
+Add winid arg to col() and charcol() #11466 (request #11461)
+
+Can we make 'noendofline' and 'endoffile' visible? Should show by default,
+since it's an unusual situation.
+- Show 'noendofline' when it would be used for writing ('fileformat' "dos")
+ with an upside down exclamation mark? NonText highlighting.
+- Show 'endoffile' when it would be used for writing ('fileformat' "dos") with
+ "CTRL-Z", NonText highlighting.
+- Add 'fillchars' items to change this, default behavior like:
+ noeol:¡
+ eof:CTRL-Z
+
+Test property disappears when using CR twice in a row. OK when some text was
+entered. (#11151)
+
+Add 'keywordprg' to various ftplugin files:
+https://github.com/vim/vim/pull/5566
+
+PR #11579 to add visualtext(), return Visually selected text.
+
+Stray characters in the shell #11719, caused by requesting a response for:
+- XT key sequences
+- Whether modifyOtherKeys is active
+- Whether kitty keyboard protocol is active
+Can we not request XT key sequences, or reduce them drastically?
+
+Issue #10512: Dynamic loading broken with Perl 5.36
+Damien has a patch (2022 Dec 4)
+
+Request #11965: Allow severaql "%=" items in 'statusline', makes it possible
+to have text in the center.
+
+Add some kind of ":whathappend" command and functions to make visible what the
+last few typed keys and executed commands are. To be used when the user
+wonders what went wrong. Could also be used for statistics #12046.
+- typed keys - Normal mode command - like what is recorded in a register and
+ displayed by 'showcmd'.
+- register used - #12063
+- executed command lines
+- with more verbosity: what scripts/functions/autocommands were executed
+
+NFA regexp does not handle composing characters well: #10286
+ [ɔ̃] matches both ɔ and ɔ̃
+ \(ɔ\|ɔ̃\) matches ɔ and not ɔ̃
+
+Is there a way to make 'autowriteall' make a clean exit when the xterm is
+closed? (Dennis Nazic says files are preserved, okt 28). Perhaps handle TERM
+like HUP?
+
+Better terminal emulator support:
+ > Somehow request the terminfo entry from the terminal itself. The $TERM
+ value then is only relevant for whether this feature is supported or not.
+ Replaces the xterm mechanism to request each entry separately. #6609
+ Multiplexers (screen, tmux) can request it to the underlying terminal, and
+ pass it on with modifications.
+ How to get all the text quickly (also over ssh)? Can we use a side channel?
+ > When xterm supports sending an Escape sequence for the Esc key, should
+ have a way to request this state. That could be an XTGETTCAP entry, e.g.
+ "k!". Add "esc_sends_sequence" flag.
+ If we know this state, then do not pretend going out of Insert mode in
+ vgetorpeek(), where kitty_protocol_state is checked.
+ > If a response ends up in a shell command, one way to avoid this is by
+ sending t_RV last and delay starting a shell command until the response
+ has been seen.
+ > Can we use the req_more_codes_from_term() mechanism with more terminals?
+ Should we repeat it after executing a shell command?
+ Can also add this to the 'keyprotocol' option: "mok2+tcap"
+ > In the table of terminal names pointing to the list of termcap entries,
+ add an optional additional one. So that "xterm-kitty" can first load
+ "xterm" and then add "kitty" entries.
+
+Using "A" and "o" in manually created fold (in empty buffer) does not behave
+consistently (James McCoy, #10698)
+
+In a timer callback, when using ":echo" and then input() the message is
+overwritten. Could use ":echowin" and call redraw_cmd() in get_user_input().
+#11299
+
+Syntax include problem: #11277. Related to Patch 8.2.2761
+
+To avoid flicker: add an option that when a screen clear is requested, instead
+of clearing it draws everything and uses "clear to end of line" for every line.
+Resetting 't_ut' already causes this?
+
+When scheme can't be found by configure there is no clear "not found" message:
+ configure:5769: checking MzScheme install prefix
+ configure:5781: result:
+
+Can "CSI nr X" be used instead of outputting spaces? Is it faster? #8002
+
+Typed keys invisible after calling interrupt() from a timer. #10631
+
+With a window height of 6 and 'scrolloff' set to 3, using "j" does not scroll
+evenly. (#10545) Need to handle this in scroll_cursor_bot().
+
+Idea: when typing ":e /some/dir/" and "dir" does not exist, highlight in red.
+
+":set shellpipe&" and ":set shellredir&" should use the logic from
+initialization to figure out the default value from 'shell'. Add a test for
+this.
+
+Support translations for plugins: #11637
+- Need a tool like xgettext for Vim script, generates a .pot file.
+ Need the equivalent of _() and N_(), perhaps TR() and TRN().
+- Instructions for how to create .po files and translate.
+- Script or Makefile to generate .mo files.
+- Instructions and perhaps a script to install the .mo files in the right
+ place.
+- Add variant of gettext() that takes a package name.
+
+With concealed text mouse click doesn't put the cursor in the right position.
+(Herb Sitz) Fix by Christian Brabandt, 2011 Jun 16. Doesn't work properly,
+need to make the change in where RET_WIN_BUF_CHARTABSIZE() is called.
+IDEA: when drawing the text, store the text byte index in ScreenLinesIdx[].
+When converting screen column to text position use this.
+The line number can be obtained from win->w_lines[].
+
+Version of getchar() that does not move the cursor - #10603 Use a separate
+argument for the new flag.
+
+test_arglist func Test_all_not_allowed_from_cmdwin() hangs on MS-Windows.
+
+Can we add highlighting to ":echowindow"?
+
+Information for a specific terminal (e.g. gnome, tmux, konsole, alacritty) is
+spread out. Make a section with copy/paste examples of script and pointers to
+more information.
+
+Problem that a previous silent ":throw" causes a following try/catch not to
+work. (ZyX, 2013 Sep 28) With examples: (Malcolm Rowe, 2015 Dec 24)
+Also see #8487 for an example.
+
+Request to use "." for the cursor column in search pattern \%<.c and \%<.v.
+(#8179)
+
+":filter set termcap" only filters terminal codes, not keys. (#9297)
+
+Add an option to restrict 'incsearch' to not scroll the view. (Tavis Ormandy)
+
+Remove SPACE_IN_FILENAME ? It is only used for completion.
+
+When 'term' starts with "foot" then default t_TI and t_TE to the values used
+for the builtin xterm termcap.
+
+Adding "10" to 'spellsuggest' causes spell suggestions to become very slow.
+(#4087) Did patch 8.2.2379 help?
+Also, z= in German on a long word can take a very long time, but CTRL-C to
+interrupt does not work. Where to add ui_breakcheck()?
+New English spell files also have very slow suggestions.
+
+When 'spelloptions' is "camel" then zG doesn't work on some words.
+(Gary Johnson, 17 Oct 2022)
+
+Make "g>" and "g<" in Visual mode move the text right or left.
+Also for a block selection. #8558
+
+When using dictionary insert completion with 'ignorecase', the leading capital
+in a word should be preserved.
+
+Add optional argument to virtcol() that specifies "start", "cursor" or "end"
+to tell which value from getvvcol() should be used. (#7964)
+Value returned by virtcol() changes depending on how lines wrap. This is
+inconsistent with the documentation.
+
+globpath() does not use 'wildignorecase' at all? (related to #8350)
+
+mksession uses :buffer instead of :edit in one place but not another. #10629
+
+Add 'termguiattr' option, use "gui=" attributes in the terminal? Would work
+with 'termguicolors'. #1740
+
+Patch for blockwise paste reporting changes: #6660. Asked for a PR.
+
+Missing filetype test for bashrc, PKGBUILD, etc.
+
+Add an option to not fetch terminal codes in xterm, to avoid flicker when t_Co
+changes.
+
+Add ??= operator, "a ??= b" works like "a = a ?? b". #10343
+
+When ":redir" is used while already active, the previous one is ended. But
+when redirecting to a local variable (function or script) storing the value
+won't work. At least give an error. Is there a way to make it work?
+#10616
+
+Completion for ":runtime" should show valid values, not what's in the current
+directory. (#11447)
+
+Add an option to start_timer() to return from the input loop with K_IGNORE.
+This is useful e.g. when a popup was created that disables mappings, we need
+to return from vgetc() to make this happen. #7011
+
+Expanding <mods> should put the tab number from cmdmod.tab before "tab".
+Any way to convert "$" back by using a special value? (#6901)
+
+Can we detect true color support? https://gist.github.com/XVilka/8346728
+Try setting a color then request the current color, like using t_u7.
+
+Add a v:register_used variable, which has the name of the register used for
+the last command, e.g. put. #12003
+
+Make the jumplist behave like a tag stack. (#7738) Should there be a more
+time bound navigation, like with undo?
+
+For testing, make a copy of ml_line_ptr instead of pointing it into the data
+block, so that valgrind can do out of bounds check. Set ML_LINE_DIRTY flag or
+add ML_LINE_ALLOCED.
+
+Changing a capturing group to non-capturing changes the result: #7607
+ :echo matchstr('aaa bbb', '\(.\{-1,}\>\)\|.*')
+ aaa
+ :echo matchstr('aaa bbb', '\%(.\{-1,}\>\)\|.*')
+ aaa bbb
+Should also work without any group:
+ :echo matchstr('aaa bbb', '.\{-1,}\>\|.*')
+ aaa bbb (should be aaa)
+
+Should add a match/str/list/pos method that also returns the test and position
+of submatches. #8355
+
+Check out PR #543 (Roland Puntaier).
+Patch for multibyte characters in langmap and applying a mapping on them.
+(Christian Brabandt, 2015 Jun 12, update July 25)
+Is this the right solution? Need to cleanup langmap behavior:
+- in vgetorpeek() apply langmap to the typeahead buffer and put the result in
+ a copy-buffer, only when langmap is appropriate for the current mode. Then
+ check for mapping and let gotchars() work on the copy-buffer.
+- Remove LANGMAP_ADJUST() in other parts of the code. Make sure the mode is
+ covered by the above change.
+So that replaying the register doesn't use keymap/langmap and still does the
+same thing.
+Also see #737: langmap not applied to replaying recording.
+Perhaps also related: #5147
+
+Matchparen doesn't remove highlight after undo. (#7054)
+Is OK when syntax HL is active.
+
+Currently Del can be used to delete the last character of a typed count.
+Can it also be used to delete an incomplete Normal mode command? (#7096)
+After an operator: should work. After "a" or "i" for text objects: should
+work.
+
+Using "au!" after "filetype on" is a bit slow. Can the matching of
+autocommands be made faster? (#7056)
+
+Using a search pattern containing "\%V" and 'hlsearch' set keeps old matches
+when the Visual area changes. #11694. Do a redraw when starting a Visual
+selection?
+
+Append in Visual block mode inserts the wrong character.
+Test_visual_block_mode() already has the proper check, which is commented out.
+(#8288)
+
+Add the <=> (spaceship) operator and "cond ?< expr ?= expr ?> expr"
+ replace this:
+ let left = GetLeftFunc()
+ let right = GetRightFunc()
+ let res = left < right ? lower : left == right ? equal : upper
+ by:
+ let res = GetLeftFunc() <=> GetRightFunc() ?< lower ?= equal ?> upper
+Patch to make :q work with local arglist. (Christian Brabandt, #6286)
+
+Why does Test_invalid_sid() not work in the GUI?
+
+":pedit" ignores the local working directory when 'pvp' is set (#7267)
+
+Lua: updating wrong buffer when using newly created, unloaded buffer.
+(#6539)
+
+File marks merging has duplicates since 7.4.1925. (Ingo Karkat, #5733)
+
+A syntax plugin cannot use autocommands, it could be sourced from setting
+'syntax' in a modeline. Add a function that indicates whether "secure"
+and/or "sandbox" are set.
+
+Problem with auto-formatting - inserting space and putting cursor before added
+character. (#6154)
+Auto-formatting comments joins a following non-comment line when the comment
+ends in a space. (Adam Levy, 18 Oct 2022)
+
+When 'lazyredraw' is set sometimes the title is not updated.
+(Jason Franklin, 2020 Feb 3) Looks like a race condition.
+
+With bash ":make" does not set v:shell_error. Possible solution: set
+'shellpipe' to "2>&1| tee %s; exit ${PIPESTATUS[0]}" #5994
+
+Using mode() when "/pat" is used in Visual mode returns "v" instead of "c",
+which is not useful. Return "c/v" instead. And "c/o" when using "d/pat".
+#6127
+
+Add a cterm attribute for "dimmed" or "faint" text. (#8269)
+
+When 'fileignorecase' is set ":e testfile.c" works to edit TestFile.c, but
+":find testfile.c" does not ignore case.
+Might be related to #6088.
+
+Error for reverse range when using :vimgrep in file "[id-01] file.txt".
+(#6919)
+
+When changing the crypt key the buffer should be considered modified.
+Like when changing 'fileformat'. Save the old key in save_file_ff().
+(Ninu-Ciprian Marginean)
+
+Strange sequence of BufWipeout and BufNew events while doing omni-complete.
+(Paul Jolly, #5656)
+Get BufDelete without preceding BufNew. (Paul Jolly, #5694)
+ Later more requests for what to track.
+ Should we add new events that don't allow any buffer manipulation?
+ Really only for dealing with appearing and disappearing buffers, load and
+ unload.
+BufWinenter event not fired when saving unnamed buffer. (Paul Jolly, #5655)
+Another spurious BufDelete. (Dani Dickstein, #5701)
+
+Wrong error when using local arglist. (Harm te Hennepe, #6133)
+
+Test loose_clipboard() by selecting text before suspending.
+
+:unmap <c-n> gives error but does remove the mapping. (Antony Scriven, 2019
+Dec 19)
+
+Patch to add an option to enable/disable VTP. (Nobuhiro Takasaki, #5344)
+Should have three values: empty, "off", "on". Name it 'winterm'?
+
+Patch to fix session file when using multiple tab pages. (Jason Franklin, 2019
+May 20)
+Also put :argadd commands at the start for all buffers, so that their order
+remains equal? Then %argdel to clean it up. Do try this with 'hidden' set.
+Also #5326: netrw buffers are not restored.
+
+When 'backupdir' has a path ending in double slash (meaning: use full path of
+the file) combined with 'patchmode' the file name is wrong. (#5791)
+
+Completion mixes results from the current buffer with tags and other files.
+Happens when typing CTRL-N while still searching for results. E.g., type "b_"
+in terminal.c and then CTRL-N twice.
+Should do current file first and not split it up when more results are found.
+(Also #1890)
+
+Help for ":argadd fname" says that if "fname" is already in the argument list
+that entry is used. But instead it's always added. (#6210)
+Add flag AL_FIND_ADD, if there is one argument find it in the list.
+
+Statusline highlighting error, off by one. (#5599)
+
+":find" with 'path' set to "data*" does not find files, while completion does
+find them. (Max Kukartsev, #6218)
+
+Enable 'termbidi' if $VTE_VERSION >= 5703 ?
+
+Python 3.8 doesn't work. (Antonios Hadjigeorgalis, #5509)
+
+"--cleanFOO" does not result in an error. (#5537)
+
+Output from assert_equalfile() doesn't give a hint about what's different.
+Assuming the files are text, print the line with the difference.
+
+Result of synID() sometimes wrong in help files. (#5252)
+
+When a help file is opened that doesn't have "ft=help" in the modeline then
+the FileType is first set to "text" before it is set to "help". (#8099)
+
+Problem showing a line if the number column width changes when using "o".
+(Mateusz Morusiewicz, #4245)
+
+When using :packadd for a replacement language plugin, it is loaded after the
+default one. #4698
+
+When using :packadd files under "later" are not used, which is inconsistent
+with packages under "start". (xtal8, #1994)
+
+Patch to add new motion ]( and ]{. (Yasuhiro Matsumoto, #5320)
+Better: use the "z" prefix. or ]t) and [t(.
+
+Visual highlight not removed when 'display' is "lastline" and line doesn't
+fit. (Kevin Lawler, #4457)
+
+Current position in the changelist should be local to the buffer. (#2173)
+
+Does not build with MinGW out of the box:
+- _stat64 is not defined, need to use "struct stat" in vim.h
+- WINVER conflict, should use 0x0600 by default?
+- INT_MAX not defined: need to include <limits.h> in vim.h
+
+Display messed up with matchparen, wrapping and scrolling. (#5638)
+Screen update bug related to matchparen. (Chris Heath, 2017 Mar 4, #1532)
+
+When getting a focus event halfway a mapping this aborts the mapping. E.g.
+when "qq" is mapped and after the first "q" the mouse is moved outside of the
+gvim window (with focus follows mouse), then the K_FOCUSLOST key is put in the
+input buffer. (#5302)
+
+Check_external_diff() is used too often. (Daniel Hahler, #4800)
+
+Win32: after "[I" showing matches, scroll wheel messes up screen. (Tsakiridis,
+2007 Feb 18)
+Patch by Alex Dobrynin, 2007 Jun 3. Also fixes other scroll wheel problems.
+
+Add a WindowScrolled event. Trigger around the same time as CursorMoved.
+Can be used to update highlighting. #3127 #5181
+
+Incorrect formatting with autoindent. (Sebastian Gniazdowski, #4909)
+
+Patch to add the :bvimgrep command. (Christian Brabandt, 2014 Nov 12)
+Updated 2016 Jun 10, #858 Update 2017 Mar 28: use <buffer>.
+Better use ":bufgrep" ?
+
+Improve fallback for menu translations, to avoid having to create lots of
+files that source the actual file. E.g. menu_da_de -> menu_da
+Include part of #3242?
+
+Patch to have text objects defined by arbitrary single characters. (Daniel
+Thau, 2013 Nov 20, 2014 Jan 29, 2014 Jan 31)
+Added tests (James McCoy, 2016 Aug 3, #958). Still needs more work.
+
+Would be nice to set tab-local values for 'diffexpr' and 'diffopt'. Use
+t:diffexpr_option t:diffopt_option? (#4782)
+Also make 'scrollopt' tab-local, remove "hor" only for the current tab page.
+
+Internal diff doesn't handle binary file like external diff does. (Mike
+Williams, 2018 Oct 30)
+
+'[ mark in wrong column after put. (#4776)
+
+Problem with :tlmenu: Detach item added with all modes? Issue #3563.
+
+Add an argument to expandcmd() to expand like ":next" does.
+
+When both "a" and "l" is in 'formatoptions' then auto-formatting also happens
+in a long line. #5189
+
+The quoting of the [command] argument of :terminal is not clearly documented.
+Give a few examples. (#4288)
+
+Opening a file with --remote-tab-silent that matches 'wildignore' does not
+work, results in "E479: No match". (#4610)
+
+7 Add an option to add one pixel column to the character width? Lucida
+ Console italic is wider than the normal font ("d" overlaps with next char).
+ Opposite of 'linespace': 'columnspace'.
+Patch for this (Tristan Konolige, #1011, only added the option, no implem.)
+
+Bug: script written with "-W scriptout" contains Key codes, while the script
+read with "-s scriptin" expects escape codes. Probably "scriptout" needs to
+be adjusted. (Daniel Steinberg, 2019 Feb 24, #4041)
+
+Window size changes after closing a tab. (#4741)
+
+Problem with colors in terminal window. (Jason Franklin, 2019 May 12)
+
+Color schemes:
+NOTE: modernizing the default colorschemes _AND_ introducing new ones is now
+a project in its own right: https://github.com/vim/colorschemes. Feel free to
+reach out if you want to lend a hand.
+- Lifepillar: Updated/cleaned up color schemes:
+ https://github.com/lifepillar/vim8-colorschemes.
+- Include a few color schemes, based on popularity:
+ - http://www.vim.org/scripts/script_search_results.php?keywords=&script_type=color+scheme&order_by=rating&direction=descending&search=search
+http://vimawesome.com/?q=tag:color-scheme
+- Use names that indicate their appearance (Christian Brabandt, 2017 Aug 3)
+ - monokai - Xia Crusoe (2017 Aug 4)
+ - seoul256 - Christian Brabandt (2017 Aug 3)
+ - gruvbox - Christian Brabandt (2017 Aug 3) (simplified version from
+ Lifepillar, 2018 Jan 22, #2573)
+ - janah - Marco Hinz (2017 Aug 4)
+ - apprentice - Romain Lafourcade (2017 Aug 6) remarks about help file #1964
+- Suggested by Hiroki Kokubun:
+ - [Iceberg](https://github.com/cocopon/iceberg.vim) (my one)
+ - [hybrid](https://github.com/w0ng/vim-hybrid)
+- Include solarized color scheme?, it does not support termguicolors.
+ - Sanitized version of pablo (Lifepillar, 2017 Nov 21)
+
+Bug: "vipgw" does not put cursor back where it belongs. (Jason Franklin, 2019
+Mar 5)
+
+Some composing characters actually add a cell width to the character they are
+on top off, making the whole thing two characters wide. (#4526)
+
+Should we include some part of pull request #4505, not increment changedtick
+in some cases? E.g. for ":write" when the changed flag was already off, the
+buffer didn't change at all.
+
+When using a timer callback vgetc_busy is reset, allowing for using input().
+But in a channel callback this does not happen. We need to do something
+similar to check_due_timer(). Also see #3809.
+
+C syntax: {} inside () causes following {} to be highlighted as error.
+(Michalis Giannakidis, 2006 Jun 1)
+
+Check: __attribute__((format(printf, on semsg() and siemsg(). Where was this
+added?
+
+Add test for urxvt mouse codes. Also test that mouse coordinates can be
+negative. (see #4326)
+
+'cmdheight' has a tab-local value, but it cannot be obtained with
+`:echo gettabwinvar(2, 1, '&cmdheight')` returns the value for the _current_
+tab page. (Ingo Karkat, #4324)
+:call settabwinvar(1, 1, '&cmdheight', 2) also doesn't work well.
+
+When opening a file, allow for specifying the initial column position:
+ vim +12:5 file.txt line 12 column 5
+ :edit +12:5 file.txt
+Should probably use the column as the character index.
+
+This modeline throws unexpected errors: (#4165)
+ vim: syn=nosyntax
+
+Make balloon_show() work outside of 'balloonexpr'? Users expect it to work:
+#2948. (related to #1512?)
+Also see #2352, want better control over balloon, perhaps set the position.
+Should also be possible to add highlighting, like in the status line?
+balloonexpr() on MS-Windows GUI doesn't handle accented chars? (nivaemail,
+2018 Sep 14)
+
+More warnings from static analysis:
+https://lgtm.com/projects/g/vim/vim/alerts/?mode=list
+
+Not existing directory in CDPATH leads to two shell calls. (#4525)
+
+Use dict_iterate_start() / dict_iterate_next() instead of relying on the
+internals of the dict structure.
+
+nvo-mode mapping works on Windows, not on Linux. (#3678)
+
+Redo only remembers the last change. Could use "{count}g." to redo an older
+change. How does the user know which change? At least have a way to list
+them: ":repeats". Add to history, like search history and command line history.
+
+When 'confirm' is set a "silent q" doesn't show the prompt. It should in this
+case. (Nate Peterson, 2019 Jan 31, #3892)
+For "silent! q" it should not prompt and just fail.
+
+Add <aevent>, which expands to the currently triggered autocommand event name.
+(Daniel Hahler, #4232) Or add it to v:event (easier to use but slightly more
+expensive).
+
+Some xterm responses are not properly handled: (Markus Gömmel, 2019 Apr 1)
+ DCS 0 $ r Pt ST should be ignored.
+ DCS 0 + r/Pt/ ST already ignored?
+
+Using CTRL-L to add a character to the search string that contains \v,
+punctuation is repeated. (Smylers, 2018 Nov 17, #3621)
+
+Using single wide base character with double wide composing character gives
+drawing errors. Fill up the base character? (Dominique, #4328)
+
+When 'sidescrolloff' is set, using "zl" to go to the end of the line, suddenly
+scrolls back. Should allow for this scrolling, like 'scrolloff' does when
+using CTRL-E. (Yee Cheng Chin, #3721)
+
+Add function to make use of internal diff, working on two lists and returning
+unified diff (list of lines).
+
+When splitting a window with few text lines, the relative cursor position is
+kept, which means part of the text isn't displayed. Better show all the text
+when possible. (Dylan Lloyd, #3973)
+
+Make ":interactive !cmd" stop termcap mode, also when used in an autocommand.
+(#3692)
+
+Add something like 'fillchars' local to window, but allow for specifying a
+highlight name. Esp. for the statusline.
+And "extends" and "precedes" are also useful without 'list' set. Also in
+'fillchars' or another option?
+
+Sourceforge Vim pages still have content, make them empty, keep redirect.
+Check for PHP errors. (Wayne Davison, 2018 Oct 26)
+
+Problem with Visual yank when 'linebreak' and 'showbreak' are set.
+Patch with tests, but it's not clear how it is supposed to work. (tommm, 2018
+Nov 17) Asked about this, Dec 22. Christian will have a look.
+
+Update for xim-input-style help (Tony Mechelynck, 2019 Jan 10).
+Feedback from someone who uses this?
+
+Only output t_Cs when t_Ce is also set. do not use Cs and Ce termcap entries. (Daniel Hahler, 2018 Sep 25)
+Add t_cS and t_cR for cursor color select and reset. Use Cs and Cr terminfo
+values.
+
+Further xdiff changes:
+- More options, e.g. different kind of whitespace diff.
+- when editing text, update the surrounding diff blocks.
+- omit diff.exe from distribution
+- Can we make this show differences within a line?
+- add option to use external diff above a certain size.
+
+Difference between two regexp engines: #3373
+
+When the last line wraps, selecting with the mouse below that line only
+includes the first screen line. (2018 Aug 23, #3368)
+
+Refactored HTML indent file. (Michael Lee, #1821)
+Asked to write a test.
+
+Merge checking for 'cursorline' and 'concealcursor', see neovim #9492.
+
+Add a windowID argument to placing a sign, so that it only shows up in one
+window for the buffer.
+
+Compiler warning (geeknik, 2017 Oct 26):
+- undefined left shift in eval_string(), before hex2nr() (#2250)
+ Use unsigned for "nr".
+
+Add Native language protocol server (LSP) support. (Yegappan Lakshmanan, 2018
+Oct 28)
+
+Patch to be able to use hex numbers with :digraph. (Lcd, 2015 Sep 6)
+Update Sep 7. Update by Christian Brabandt, 2015 Sep 8, 2016 Feb 1.
+Patch to be able to disable default digraphs (incomplete) (Eric Pruitt, 2018
+Nov 22).
+
+Patch to list user digraphs. (Christian Brabandt, 2012 Apr 14)
+
+Setting 'columns' in a BufEnter autocommand causes a second tab width to
+behave strangely, as if there is a gap and a vertical window separator.
+(Michael Soyka, 2018 Sep 23, #3477)
+
+Add an option similar to 'lazyredraw' to skip redrawing while executing a
+script or function.
+
+Using a menu item while the "more" prompt is displayed doesn't work well.
+E.g. after using help->version. Have a key that ends the "more" prompt and
+does nothing otherwise?
+
+MS-Windows: write may fail if another program is reading the file.
+If 'readonly' is not set but the file appears to be readonly later, try again
+(wait a little while).
+CreateFile() returns ERROR_SHARING_VIOLATION (Linwei, 2018 May 5)
+
+Using --remote to open a file in which a # appears does not work on
+MS-Windows. Perhaps in \# the \ is seen as a path separator. (Axel Bender,
+2017 Feb 9) Can we expand wildcards first and send the path literally to the
+receiving Vim? Or make an exception for #, it's not useful remotely.
+
+Column number is wrong when using 'linebreak' and 'wrap'. (Keith Smiley, 2018
+Jan 15, #2555)
+
+Add Makefiles to the runtime/spell directory tree, since nobody uses Aap.
+Will have to explain the manual steps (downloading the .aff and .dic files,
+applying the diff, etc.
+
+User dictionary ~/.vim/spell/lang.utf-8.add not used for spell checking until a
+word is re-added to it. (Matej Cepl, 2018 Feb 6)
+
+Fold at end of the buffer behaves inconsistently. (James McCoy, 2017 Oct 9)
+
+Implement option_save() and option_restore():
+option_restore({list}) *option_restore()*
+ Restore options previously saved by option_save().
+ When buffer-local options have been saved, this function must
+ be called when the same buffer is the current buffer.
+ When window-local options have been saved, this function must
+ be called when the same window is the current window.
+ When in the wrong buffer and/or window an error is given and
+ the local options won't be restored.
+
+option_save({list}) *option_save()*
+ Saves the options named in {list}. The returned value can be
+ passed to option_restore(). Example: >
+ let s:saved_options = option_save([
+ \ 'ignorecase',
+ \ 'iskeyword',
+ \ ])
+ au <buffer> BufLeave *
+ \ call option_restore(s:saved_options)
+< The advantage over using `:let` is that global and local
+ values are handled and the script ID is restored, so that
+ `:verbose set` will show where the option was originally set,
+ not where it was restored.
+ Alternatively: save and restore ALL options. Implementation needs to use
+ copy-on-write. Return an ID from option_save(), when
+ option_restore(ID) is called give an error if another option_save()
+ was called in the meantime, they must be balanced.
+
+"gvim --remote" from a directory with non-word characters changes the current
+directory (Paulo Marcel Coelho Arabic, 2017 Oct 30, #2266)
+Also see #1689.
+
+When 'virtualedit' is "all" and 'cursorcolumn' is set, the wrong column may be
+highlighted. (van-de-bugger, 2018 Jan 23, #2576)
+
+No profile information for function that executes ":quit". (Daniel Hahler,
+2017 Dec 26, #2501)
+
+A function on a dictionary is not profiled. (ZyX, 2010 Dec 25)
+
+Add script number to profile? (#3330 breaks tests).
+
+A function defined locally and lambda's are not easily recognized.
+Mention where they were defined somewhere.
+
+ml_get errors with buggy script. (Dominique, 2017 Apr 30)
+
+Error in emsg with buggy script. (Dominique, 2017 Apr 30)
+
+Join truncates xml comment. (Dmitrii Tcyganok, 2017 Dec 24, #2494)
+Requires 'formatoptions' to include "j". (Gary Johnson, 2017 Dec 24)
+
+Patch to support hunspell. (Matej Cepl, Jan 2018, #2500) Based on older patch
+in #846)
+Doesn't work on Windows yet. Not ready to included, hard coded paths.
+
+When a timer is running and typing CTRL-R on the command line, it is not
+redrawn properly. (xtal8, 2017 Oct 23, #2241)
+
+In an optional package the "after" directory is not scanned?
+(Renato Fabbri, 2018 Feb 22)
+
+Patch for Neovim concerning restoring when closing help window. (glacambre
+neovim #7431)
+
+Patch for improving detecting Ruby on Mac in configure. (Ilya Mikhaltsou, 2017
+Nov 21)
+
+When t_Co is changed from termresponse, the OptionSet autocommand event isn't
+triggered. Use the code from the end of set_num_option() in
+set_color_count().
+
+Add another autocommand like TermResponse that is fired for the other terminal
+responses, such as bg and fg. Use "bg", "fg", "blink", etc. for the name.
+
+When using command line window, CmdlineLeave is triggered without
+CmdlineEnter. (xtal8, 2017 Oct 30, #2263)
+Add some way to get the nested state. Although CmdwinEnter is obviously
+always nested.
+
+matchit hasn't been maintained for a long time. #955.
+
+Problem with 'delcombine'. (agguser, 2017 Nov 10, #2313)
+
+'delcombine' does not work for the command line. (Tony Mechelynck, 2009 Jul
+20)
+
+MS-Windows: buffer completion doesn't work when using backslash (or slash)
+for a path separator. (xtal8, #2201)
+
+Would be nice for Insert mode completion to highlight the text that was added
+(and may change when picking another completion).
+
+Test more runtime files.
+
+Window not closed when deleting buffer. (Harm te Hennepe, 2017 Aug 27, #2029)
+
+Add options_default() / options_restore() to set several options to Vim
+defaults for a plugin. Comments from Zyx, 2017 May 10.
+Perhaps use a vimcontext / endvimcontext command block.
+
+After using :noautocmd CursorMoved may still trigger. (Andy Stewart, 2017 Sep
+13, #2084). Set old position after the command.
+
+When bracketed paste is used, pasting at the ":append" prompt does not get the
+line breaks. (Ken Takata, 2017 Aug 22)
+
+Cannot copy modeless selection when cursor is inside it. (lkintact, #2300)
+
+Test_writefile_fails_conversion failure on Solaris because if different iconv
+behavior. Skip when "uname" returns "SunOS"? (Pavel Heimlich, #1872)
+
+'tagrelative' is broken in specific situation. (xaizek, 2017 Oct 19, #2221)
+
+The ++ options for the :edit command are also useful on the Vim command line.
+
+Overlong utf-8 sequence is displayed wrong. (Harm te Hennepe, 2017 Sep 14,
+#2089) Patch with possible solution by Björn Linse.
+
+X11: Putting more than about 262040 characters of text on the clipboard and
+pasting it in another Vim doesn't work. (Dominique Pelle, 2008 Aug 21-23)
+clip_x11_request_selection_cb() is called with zero value and length.
+Also: Get an error message from free() in the process that owns the selection.
+Seems to happen when the selection is requested the second time, but before
+clip_x11_convert_selection_cb() is invoked, thus in X library code.
+Kazunobu Kuriyama is working on a proper fix. (2017 Jul 25)
+
+Problem with three-piece comment. (Michael Lee, 2017 May 11, #1696)
+
+Creating a partial with an autoload function is confused about the "self"
+attribute of the function. For an unknown function assume "self" and make
+that optional? (Bjorn Linse, 2017 Aug 5)
+
+Cindent: returning a structure has more indent for the second item.
+(Sam Pagenkopf, 2017 Sep 14, #2090)
+
+Patch from Christian Brabandt to preserve upper case marks when wiping out a
+buffer. (2013 Dec 9)
+Also fixes #2166?
+
+Profile of a dict function is lost when the dict is deleted. Would it be
+possible to collect this? (Daniel Hahler, #2350)
+
+When checking if a bufref is valid, also check the buffer number, to catch the
+case of :bwipe followed by :new.
+
+Patch to skip writing a temp file for diffing if the buffer is equal to the
+existing file. (Akria Sheng, 2017 Jul 22)
+Could also skip writing lines that are the same.
+
+MS-Windows: Opening same file in a second gvim hangs. (Sven Bruggemann, 2017
+Jul 4)
+
+Setting 'clipboard' to "unnamed" makes a global command very slow (Daniel
+Drucker, 2017 May 8).
+This was supposed to be fixed, did it break again somehow?
+Christian cannot reproduce it.
+
+Using composing char in mapping does not work properly. maparg() shows the
+wrong thing. (Nikolai Pavlov, 2017 Jul 8, #1827)
+Or is this not an actual problem?
+
+Better TeX indent file. (Christian Brabandt, 2017 May 3)
+
+Use gvimext.dll from the nightly build? (Issue #249)
+
+'synmaxcol' works with bytes instead of screen cells. (Llandon, 2017 May 31,
+#1736)
+
+Problem with using :cd when remotely editing a file. (Gerd Wachsmuth, 2017 May
+8, #1690)
+
+Memory leak in test97? The string is actually freed. Weird.
+
+assert_fails() can only check for the first error. Make it possible to have
+it catch multiple errors and check all of them.
+
+Add a toolbar in the terminal. Can be global, above all windows, or specific
+for one window.
+
+Make maparg() also return the raw rhs, so that it doesn't depend on 'cpo'.
+(Brett Stahlman, 2017 May 23)
+Even better: add a way to disable a mapping temporarily and re-enable it
+later. This is for a sub-mode that is active for a short while (one buffer).
+Still need maplist() to find the mappings. What can we use to identify a
+mapping? Something unique would be better than the LHS.
+Perhaps simpler: actually delete the mappings. Use maplist() to list matching
+mappings (with a lhs prefix, like maparg()), mapdelete() to delete,
+maprestore() to restore (using the output of maplist()).
+
+Add an argument to :mkvimrc (or add another command) to skip mappings from
+plugins (source is a Vim script). No need to put these in a .vimrc, they will
+be defined when the plugin is loaded.
+
+Use tb_set(winid, [{'text': 'stop', 'cb': callback, 'hi': 'Green'}])
+ tb_highlight(winid, 'ToolBar')
+ tb_get(winid)
+
+json_encode(): should convert to utf-8. (Nikolai Pavlov, 2016 Jan 23)
+What if there is an invalid character?
+
+Json string with trailing \u should be an error. (Lcd)
+
+import can't be used in define option when include matches too.
+(Romain Lafourcade, 2017 Jun 18, #1519)
+
+Wrong diff highlighting with three files. (2016 Oct 20, #1186)
+Also get E749 on exit.
+Another example in #1309
+
+Suggestion to improve pt-br spell checking. (Marcelo D Montu, 2016 Dec 15,
+#1330)
+
+Error in test_startup_utf8 on Solaris. (Danek Duvall, 2016 Aug 17)
+
+Rule to use "^" for statusline does not work if a space is defined with
+highlighting for both stl and stlnc. Patch by Ken Hamada (itchyny, 2016 Dec 11)
+
+Using CTRL-G_U in InsertCharPre causes trouble for redo. (Israel Chauca
+Fuentes, 2017 Feb 12, #1470)
+
+Add a "keytrans()" function, which turns the internal byte representation of a
+key into a form that can be used for :map. E.g.
+ let xx = "\<C-Home>"
+ echo keytrans(xx)
+ <C-Home>
+
+Check for errors E704 and E705 only does VAR_FUNC, should also do VAR_PARTIAL.
+(Nikolai Pavlov, 2017 Mar 13, #1557)
+Make a function to check for function-like type?
+
+Implement named arguments for functions with optional arguments:
+ func Foo(start, count = 1, all = 1)
+ call Foo(12, all = 0)
+
+Add a command to take a range of lines, filter them and put the output
+somewhere else. :{range}copy {dest} !cmd
+
+The TermResponse event is not triggered when a plugin has set 'eventignore' to
+"all". Netrw does this. (Gary Johnson, 2017 Jan 24)
+Postpone the event until 'eventignore' is reset.
+
+Expanding /**/ is slow. Idea by Luc Hermitte, 2017 Apr 14.
+
+Once .exe with updated installer is available: Add remark to download page
+about /S and /D options (Ken Takata, 2016 Apr 13)
+Or point to nightly builds: https://github.com/vim/vim-win32-installer/releases
+
+":sbr" docs state it respects 'switchbuf', but "vsplit" does not cause a
+vertical split. (Haldean Brown, 2017 Mar 1)
+
+Use ADDR_OTHER instead of ADDR_LINES for many more commands.
+E.g. all the location list commands use a count.
+Add tests for using number larger than number of lines in buffer.
+
+Might be useful to have isreadonly(), like we have islocked().
+Avoids exceptions, e.g. when using the b: namespace as a dict.
+
+Patch to make v:shell_error writable. (Christian Brabandt, 2016 Sep 27)
+Useful to restore it. Is there another solution?
+
+Patch for wrong cursor position on wrapped line, involving breakindent.
+(Ozaki Kiichi, 2016 Nov 25)
+
+Patch for 'cursorlinenr' option. (Ozaki Kiichi, 2016 Nov 30)
+
+Window resizing with 'winfixheight': With a vertical split the height changes
+anyway. (Tommy allen, 2017 Feb 21, #1502)
+
+Invalid behavior with NULL list. (Nikolai Pavlov, #768)
+E.g. deepcopy(test_null_list())
+
+Patch to make it possible to extend a list with itself.
+(Nikolai Pavlov, 2016 Sep 23)
+
+Patch to add Zstandard compressed file support. (Nick Terrell, 2016 Oct 24)
+
+On Windows buffer completion sees backslash as escape char instead of path
+separator. (Toffanim, 2016 Nov 24, #1274)
+
+Should :vmap in matchit.vim be :xmap? (Tony Mechelynck)
+
+Problem with whitespace in errorformat. (Gerd Wachsmuth, 2016 May 15, #807)
+
+Support sort(l, 'F'), convert strings to float. (#7857)
+
+sort() is not stable when using numeric/float sort (Nikolay Pavlov, 2016 Sep
+4#1038)
+
+sort() does not use 'smartcase' for the skip pattern, even though 'ignorecase'
+is used. (Filipe Brandenburger, #7322)
+
++channel:
+- Add a in_cb, invoked when the write buffer has become empty. (Matteo Landi)
+- Add ch_readlines(): for a channel in NL mode, reads as many lines as are
+ available. Should be more efficient than looping over ch_read() with
+ ch_status() to check for more.
+- If buffer contents is changed in a callback, set w_redr_status so that it
+ gets redrawn in redraw_after_callback(). #6120
+- Add a separate timeout for opening a socket. Currently it's fixed at 50
+ msec, which is too small for a remote connection. (tverniquet, #2130)
+- Writing raw mode to a buffer should still handle NL characters as line
+ breaks. (Dmitry Zotikov, 2017 Aug 16)
+- When out_cb executes :sleep, the close_cb may be invoked. (Daniel Hahler,
+ 2016 Dec 11, #1320)
+- Implement |job-term| ?
+- Calling a function when receiving a "call" on a channel, using feedkeys()
+ does not work. It does work from a timer. (Qiming Zhao, #3852)
+- Channel test fails with Motif. Sometimes kills the X11 server.
+- When a message in the queue but there is no callback, drop it after a while?
+ Add timestamp to queued messages and callbacks with ID, remove after a
+ minute. Option to set the droptime.
+- Add an option to drop text of very long lines? Default to 1 Mbyte.
+- Add remark about undo sync, is there a way to force it?
+- When starting a job, have an option to open the server socket, so we know
+ the port, and pass it to the command with --socket-fd {nr}. (Olaf Dabrunz,
+ Feb 9) How to do this on MS-Windows?
+- For connection to server, a "keep open" flag would be useful. Retry
+ connecting in the main loop with zero timeout.
+- job_start(): run job in a newly opened terminal (not a terminal window).
+ With xterm could use -S{pty}.
+ Although user could use "xterm -e 'cmd arg'".
+
+Regexp problems:
+- NFA engine can be slow for some patterns. Dominique found out that most
+ time is spent in addstate_here() copying the threads. Instead of copying,
+ let each thread point to the next one (by offset, the list is reallocated).
+ (Dominique Pelle, 2019 Feb 18)
+- Old engine: using 'incsearch' /\Zabc does not highlight the "c" if it has a
+ composing character. New engine is OK. (Tony Mechelynck, 2019 May 5)
+- When search pattern has the base character both with and without combining
+ character, search fails. E.g. "รรีบ" in "การรีบรักใคร". (agguser, #2312)
+- [:space:] only matches ASCII spaces. Add [:white:] for all space-like
+ characters, esp. including 0xa0. Use character class zero.
+- Since 7.4.704 the old regex engine fails to match [[:print:]] in 0xf6.
+ (Manuel Ortega, 2016 Apr 24)
+ Test fails on Mac. Avoid using isalpha(), isalnum(), etc? Depends on
+ LC_CTYPE
+- The old engine does not find a match for "/\%#=1\(\)\{80}", the new engine
+ matches everywhere.
+- Using win_linetabsize() can still be slow. Cache the result, store col and
+ vcol. Reset them when moving to another line.
+- Very slow with a long line and Ruby highlighting. (John Whitley, 2014 Dec 4)
+- Bug with pattern: '\vblock (\d+)\.\n.*\d+%(\1)@<!\.$'
+ (Lech Lorens, 2014 Feb 3)
+- Issue 164: freeze on regexp search.
+- Ignorecase not handled properly for multibyte characters. (Axel Bender,
+ 2013 Dec 11)
+- Using \@> and \?. (Brett Stahlman, 2013 Dec 21) Remark from Marcin
+ Szamotulski; Remark from Brett 2014 Jan 6 and 7.
+- NFA regexp doesn't handle \%<v correctly. (Ingo Karkat, 2014 May 12)
+- Does not work with NFA regexp engine:
+ \%u, \%x, \%o, \%d followed by a composing character
+- Search for \%d0\+ may fail with E363. (Christian Brabandt, 2016 Oct 4)
+- \%'[ does not work. '%'] does work. (Masaaki Nakamura, 2016 Apr 4)
+- Bug relating to back references. (Ingo Karkat, 2014 Jul 24)
+- New RE does not give an error for empty group: "\(\)\{2}" (Dominique Pelle,
+ 2015 Feb 7)
+- Using back reference before the capturing group sometimes works with the old
+ engine, can we do this with the new engine? E.g. with
+ "/\%(<\1>\)\@<=.*\%(<\/\(\w\+\)>\)\@=" matching text inside HTML tags.
+ This problem is probably the same: "\%(^\1.*$\n\)\@<=\(\d\+\).*$".
+ (guotuofeng, 2015 Jun 22)
+- Strange matching with "\(Hello\n\)\@<=A". (Anas Syed, 2015 Feb 12)
+- Problem with \v(A)@<=b+\1c. (Issue 334)
+- Diff highlighting can be very slow. (Issue 309)
+- Using %> for a virtual column has a check based on 'tabsize'. Better would
+ be to cache the result of win_linetabsize(col), storing both col and vcol,
+ and use them to decide whether win_linetabsize() needs to be called. Reset
+ col and vcol when moving to another line.
+- this doesn't work: "syntax match ErrorMsg /.\%9l\%>20c\&\%<28c/". Leaving
+ out the \& works. Seems any column check after \& fails.
+- Difference between two engines: ".*\zs\/\@>\/" on text "///"
+ (Chris Paul, 2016 Nov 13) New engine not greedy enough?
+ Another one: echom matchstr(" sdfsfsf\n sfdsdfsdf",'[^\n]*')
+ (2017 May 15, #1252)
+
+Idea from Sven: record sequence of keys. Useful to show others what they are
+doing (look over the shoulder), and also to see what happened.
+Probably list of keystrokes, with some annotations for mode changes.
+Could store in logfile to be able to analyse it with an external command.
+E.g. to see when's the last time a plugin command was used.
+
+cmap using execute() has side effects. (Killthemule, 2016 Aug 17, #983)
+
+:map X may print invalid data. (Nikolay Pavlov, 2017 Jul 3, #1816)
+
+Patch to order results from taglist(). (Duncan McDougall, 2016 Oct 25)
+
+ml_get errors when reloading file. (Chris Desjardins, 2016 Apr 19)
+Also with latest version.
+
+Completion for input() does not expand environment variables. (chdiza, 2016
+Jul 25, #948)
+
+Patch to add 'systemencoding', convert between 'encoding' and this for file
+names, shell commands and the like. (Kikuchan, 2010 Oct 14)
+Assume the system converts between the actual encoding of the filesystem to
+the system encoding (usually utf-8).
+
+MS-Windows: use WS_HIDE instead of SW_SHOWMINNOACTIVE in os_win32.c?
+Otherwise task flickers in taskbar.
+
+Second problem in #966: ins_compl_add_tv() uses get_dict_string() multiple
+times, overwrites the one buffer. (Nikolay Pavlov, 2016 Aug 5)
+
+Patch to improve map documentation. Issue #799.
+
+We can use '. to go to the last change in the current buffer, but how about
+the last change in any buffer? Can we use ', (, is next to .)?
+
+Ramel Eshed: system() is much slower than job_start(), why? (Aug 26)
+
+When generating the Unicode tables with runtime/tools/unicode.vim the
+emoji_width table has only one entry.
+
+It's possible to add ",," to 'wildignore', an empty entry. Causes problems.
+Reject the value? #710.
+
+When doing "vi buf.md" a BufNew autocommand for *.md is not triggered.
+Because of using the initial buffer? (Dun Peal, 2016 May 12)
+
+Neovim patch for utfc_ptr2char_len() https://github.com/neovim/neovim/pull/4574
+No test, needs some work to include.
+
+Patch to improve indenting for C++ constructor with initializer list.
+(Hirohito Higashi, 2016 Mar 31)
+
+Zero-out krypt key information when no longer in use. (Ben Fritz, 2017 May 15)
+
+Add stronger encryption. Could use libsodium (NaCl).
+https://github.com/jedisct1/libsodium/
+Possibly include the needed code so that it can be built everywhere.
+
+Add a way to restart a timer. It's similar to timer_stop() and timer_start(),
+but the reference remains valid.
+
+Need to try out instructions in INSTALLpc.txt about how to install all
+interfaces and how to build Vim with them.
+Appveyor build with self-installing executable, includes getting most
+interfaces: https://github.com/k-takata/vim/tree/chrisbra-appveyor-build
+result: https://ci.appveyor.com/project/k-takata/vim/history
+
+Problem using ":try" inside ":execute". (ZyX, 2013 Sep 15)
+
+Patch to make tests pass with EBCDIC. (Owen Leibman, 2016 Apr 10)
+
+Add ":read :command", to insert the output of an Ex command?
+Can already do it with ":$put =execute('command')".
+
+exists(":tearoff") does not tell you if the command is implemented. (Tony
+Mechelynck) Perhaps use exists("::tearoff") to check?
+
+Use vim.vim syntax highlighting for help file examples, but without ":" in
+'iskeyword' for syntax.
+
+Installation of .desktop files does not work everywhere.
+It's now fixed, but the target directory probably isn't right.
+Add configure check?
+Should use /usr/local/share/applications or /usr/share/applications.
+Or use $XDG_DATA_DIRS.
+Also need to run update-desktop-database (Kuriyama Kazunobu, 2015 Nov 4)
+
+Test object i{ and it do not behave the same. #1379
+Do not include the linebreak at the start?
+
+Feature request: add the "al" text object, to manipulate a screen line.
+Especially useful when using 'linebreak'
+
+Patch to avoid redrawing tabline when the popup menu is visible.
+(Christian Brabandt, 2016 Jan 28)
+
+When the CursorMovedI event triggers, and CTRL-X was typed, a script cannot
+restore the mode properly. (Andrew Stewart, 2016 Apr 20)
+Do not trigger the event?
+
+Patch to make the behavior of "w" more straightforward, but not Vi compatible.
+With a 'cpo' flag. (Christian Brabandt, 2016 Feb 8)
+
+Patch to add optionproperties(). (Anton Lindqvist, 2016 Mar 27, update Apr 13)
+
+Patch to add TagNotFound autocommand. (Anton Lindqvist, 2016 Feb 3)
+
+Patch to add Error autocommand. (Anton Lindqvist, 2016 Feb 17)
+Only remembers one error.
+
+GVim: when both Tab and CTRL-I are mapped, use CTRL-I not for Tab.
+
+Unexpected delay when using CTRL-O u. It's not timeoutlen.
+(Gary Johnson, 2015 Aug 28)
+
+Instead of separately uploading patches to the ftp site, we can get them from
+github with a URL like this:
+ https://github.com/vim/vim/compare/v7.4.920%5E...v7.4.920.diff
+Diff for version.c contains more context, can't skip a patch.
+
+Python: ":py raw_input('prompt')" doesn't work. (Manu Hack)
+
+Comparing nested structures with "==" uses a different comparator than when
+comparing individual items.
+
+Using uninitialized memory. (Dominique Pelle, 2015 Nov 4)
+
+MS-Windows: When editing a file with a leading space, writing it uses the
+wrong name. (Aram, 2014 Nov 7) Vim 7.4.
+
+Can't recognize the $ProgramFiles(x86) environment variable. Recognize it
+specifically? First try with the parens, then without.
+
+Patch to add :mapgroup, put mappings in a group like augroup.
+(Yasuhiro Matsumoto, 2016 Feb 19)
+
+Can we cache the syntax attributes, so that updates for 'relativenumber' and
+'cursorline'/'cursorcolumn' are a lot faster? Thus store the attributes
+before combining them.
+
+C highlighting: modern C allows: /* comment */ #ifdef
+and also line continuation after #include.
+I can't recommend it though.
+
+Build with Python on Mac does not always use the right library.
+(Kazunobu Kuriyama, 2015 Mar 28)
+
+To support Thai (and other languages) word boundaries, include the ICU
+library: http://userguide.icu-project.org/boundaryanalysis
+
+Patch to use two highlight groups for relative numbers. (Shaun Brady, 2016 Jan
+30)
+
+MS-Windows: Crash opening very long file name starting with "\\".
+(Christian Brock, 2012 Jun 29)
+
+The OptionSet autocommand event is not always triggered. (Rick Howe, 2015 Sep
+24): :diffthis, :diffoff.
+
+":set all&" still does not handle all side effects. Centralize handling side
+effects for when set by the user, on init and when reset to default.
+
+":tag" does not jump to the right entry of a :tselect. (James Speros, 2015 Oct
+9)
+
+The argument for "-S" is not taken literally, the ":so" command expands
+wildcards. Add a ":nowild" command modifier? (ZyX, 2015 March 4)
+
+Proposal to make options.txt easier to read. (Arnaud Decara, 2015 Aug 5)
+Update Aug 14.
+
+When using --remote-tab on MS-Windows 'encoding' hasn't been initialized yet,
+the file name ends up encoded wrong. (Raul Coronado, 2015 Dec 21)
+
+Example in editing.txt uses $HOME with the expectation that it ends in a
+slash. For me it does, but perhaps not for everybody. Add a function that
+inserts a slash when needed? pathconcat(dir, path) (Thilo Six, 2015 Aug 12)
+
+ml_updatechunk() is slow when retrying for another encoding. (John Little,
+2014 Sep 11)
+
+Patch to fix checking global option value when not using it.
+(Arnaud Decara, 2015 Jul 23)
+
+When 'showbreak' is set repeating a Visual operation counts the size of the
+'showbreak' text as part of the operation. (Axel Bender, 2015 Jul 20)
+
+Patch to add grepfile(). (Scott Prager, 2015 May 26)
+Work in progress.
+
+Would be useful to have a treemap() or deepmap() function. Like map() but
+when an item is a list or dict would recurse into it.
+
+Patch for global-local options consistency. (Arnaud Decara, 2015 Jul 22)
+Is this right?
+
+Patch to make getregtype() return the right size for non-linux systems.
+(Yasuhiro Matsumoto, 2014 Jul 8)
+Breaks test_eval. Inefficient, can we only compute y_width when needed?
+
+Patch to use different terminal mode settings for system(). (Hayaki Saito)
+Does this work for everybody?
+
+Patch for man.vim. (SungHyun Nam, 2015 May 20)
+Doesn't work completely (Dominique Orban)
+
+Patch to add a "literal" argument to bufnr(). (Olaf Dabrunz, 2015 Aug 4)
+
+Extended file attributes lost on write (backupcopy=no). Issue 306.
+
+Patch to add :lockjumps. (Carlo Baldassi, 2015 May 25)
+OK to not block marks?
+
+Patch on Issue 72: 'autochdir' causes problems for :vimgrep.
+
+When two SIGWINCH arrive very quickly, the second one may be lost.
+(Josh Triplett, 2015 Sep 17)
+
+Make comments in the test Makefile silent. (Kartik Agaram, 2014 Sep 24)
+
+Result of systemlist() does not show whether text ended in line break.
+(Bjorn Linse, 2014 Nov 27)
+
+When in 'comments' "n:x" follows after three-part comment directly it repeats
+any one-character from the previous line. (Kartik Agaram, 2014 Sep 19)
+
+Adding "~" to 'cdpath' doesn't work for completion? (Davido, 2013 Aug 19)
+
+Patch: Let rare word highlighting overrule good word highlighting.
+(Jakson A. Aquino, 2010 Jul 30, again 2011 Jul 2)
+
+Patch to add digits argument to round(). (Yasuhiro Matsumoto, 2015 Apr 26)
+
+Can assign to s:type when a function s:type has been defined.
+Also the other way around: define a function while a variable with that name
+was already defined.
+(Yasuhiro Matsumoto, 2014 Nov 3)
+
+Patch for ordered dict. (Ozaki Kiichi, 2015 May 7)
+
+Patch for building a 32bit Vim with 64bit MingW compiler.
+(Michael Soyka, 2014 Oct 15)
+
+Patch: On MS-Windows shellescape() may have to triple double quotes.
+(Ingo Karkat, 2015 Jan 16)
+
+Patch for glob(), adding slash to normal files. (Ingo Karkat, 2014 Dec 22)
+
+When entering and leaving the preview window autocommands are triggered, but
+these may not work well. Perhaps set a flag to indicate that the preview
+window is involved? (John Otter, 2015 Oct 27)
+
+Using "." to repeat an Ex command puts that command in history. Probably
+should not happen. If the command is the result of a mapping it's not put in
+history either. (Jacob Niehus, 2014 Nov 2)
+Patch from Jacob, Nov 2.
+
+"hi link" does not respect groups with GUI settings only. (Mark Lodato, 2014
+Jun 8)
+
+Bug: Autocompleting ":tag/pat" replaces "/pat" with a match but does not
+insert a space. (Micha Mos, 2014 Nov 7)
+
+No error for missing endwhile. (ZyX, 2014 Mar 20)
+
+Patch to make extend() fail early when it might fail at some point.
+(Olaf Dabrunz, 2015 May 2) Makes extend() slower, do we still want it?
+Perhaps only the checks that can be done without looping over the dict or
+arguments.
+
+Problem with transparent and matchgroup. Issue #475
+
+Idea: For a window in the middle (has window above and below it), use
+right-mouse-drag on the status line to move a window up/down without changing
+its height? It's like dragging the status bar above it at the same time.
+
+Patch to add a :domodeline command. (Christian Brabandt, 2014 Oct 21)
+
+This does not give an error: (Andre Sihera, 2014 Mar 21)
+ vim -u NONE 1 2 3 -c 'bufdo if 1 | echo 1'
+This neither: (ZyX)
+ vim -u NONE 1 2 3 -c 'bufdo while 1 | echo 1'
+
+'viewdir' default on MS-Windows is not a good choice, it's a system directory.
+Change 'viewdir' to "$HOME/vimfiles/view" and use 'viewdiralt' to also read
+from?
+
+Include a plugin manager with Vim? vim-plug seems to be the best currently:
+https://github.com/junegunn/vim-plug.
+Also Vundle: https://github.com/gmarik/vundle
+Or minpac: https://github.com/k-takata/minpac, since it leverages the builtin
+package feature.
+Long message about this from ZyX, 2014 Mar 23. And following replies.
+Also see http://vim-wiki.mawercer.de/wiki/topic/vim%20plugin%20managment.html
+User view:
+- Support multiple sources, basically any http:// URL. Or a central place that
+ will work for everybody (github? redirects from vim.org?).
+ Be able to look into the files before deciding to install.
+- Be able to try out a plugin and remove it again with (almost) no traces.
+- Each plugin needs a "manifest" file that has the version, dependencies
+ (including Vim version and features), conflicts, list of files, etc.
+ Updater uses that to decide what/how to update.
+ Dependencies can use a URL for specific versions, or short name for scripts
+ on vim.org.
+- Once a plugin is installed it remembers where it came from, updater checks
+ there. Can manually update when really needed.
+- Must be possible to install for one user. Also system wide?
+- Can edit plugin config with Vim. Can temporarily disable a plugin.
+- Run the update manually, find latest version and install.
+- Be able to download without special tools, must work for 95% of users.
+Implementation:
+- Avoid the 'runtimepath' getting long. Need some other way to keep each
+ plugin separate.
+- When installing or updating, first figure out what needs to be done. This
+ may involve recursively fetching manifest files for dependencies. Then show
+ the user what's going to change and ask for OK.
+- Scripts on Vim.org must be able to consist of several files. Is zip format
+ sufficient? Upload the manifest? Or refer to a site that has the manifest?
+- Best is to fetch individual files or use a Vimball. Reduces dependency on
+ tools that might be missing and allows inspection of the files before
+ installing.
+Out of scope:
+- Overview of plugins, ratings, comments, etc. That's another world.
+- Development work on plugins (although diff with distributed version would be
+ useful).
+
+When typing the first character of a command, e.g. "f", then using a menu, the
+menu item doesn't work. Clear typeahead when using a menu?
+
+Editing an ascii file as ucs-2 or ucs-4 causes display errors.
+(ZyX, 2014 Mar 30)
+
+":Next 1 some-arg" does not complain about trailing argument. Also for
+various other commands. (ZyX, 2014 Mar 30)
+
+Patch to skip sort if no line matches the expression.
+(Christian Brabandt, 2014 Jun 25)
+
+VMS: Select() doesn't work properly, typing ESC may hang Vim. Use sys$qiow
+instead. (Samuel Ferencik, 2013 Sep 28)
+
+Patch for XDG base directory support. (Jean François Bignolles, 2014 Mar 4)
+Remark on the docs. Should not be a compile time feature. But then what?
+Also see #2034.
+
+Patch to define macros for hardcoded values. (Elias Diem, 2013 Dec 14)
+
+Updated spec ftplugin. (Matěj Cepl, 2013 Oct 16)
+
+Patch to handle integer overflow. (Aaron Burrow, 2013 Dec 12)
+
+7 Windows XP: When using "ClearType" for text smoothing, a column of yellow
+ pixels remains when typing spaces in front of a "D" ('guifont' set to
+ "lucida_console:h8").
+Patch by Thomas Tuegel, also for GTK, 2013 Nov 24
+
+:help gives example for z?, but it does not work. m? and t? do work.
+
+Discussion about canonicalization of Hebrew. (Ron Aaron, 2011 April 10)
+
+Checking runtime scripts: Thilo Six, 2012 Jun 6.
+
+When evaluating expression in backticks, autoload doesn't work.
+(Andy Wokula, 2013 Dec 14)
+
+Using <nr>ifoobar<esc> can slow down Vim. Patch by Christian Brabandt, 2013
+Dec 13. Only helps a bit, 10000ii<Esc> is still too slow.
+
+Javascript file where indent gets stuck on: GalaxyMaster, 2012 May 3.
+
+The BufUnload event is triggered when re-using the empty buffer.
+(Pokey Rule, 2013 Jul 22)
+Patch by Marcin Szamotulski, 2013 Jul 22.
+
+Patch to allow more types in remote_expr(). (Lech Lorens, 2014 Jan 5)
+Doesn't work for string in list. Other way to pass all types of variables
+reliably?
+
+Patch to add {lhs} to :mapclear: clear all maps starting with {lhs}.
+(Christian Brabandt, 2013 Dec 9)
+
+Exception caused by argument of return is not caught by try/catch.
+(David Barnett, 2013 Nov 19)
+Bug in try/catch: return with invalid compare throws error that isn't caught.
+(ZyX, 2011 Jan 26)
+try/catch not working for argument of return. (Matt Wozniski, 2008 Sep 15)
+try/catch not working when inside a for loop. (ZyX, 2011 Jan 25)
+
+Patch to fix that 'cedit' is recognized after :normal. (Christian Brabandt,
+2013 Mar 19, later message)
+
+Patch to view coverage of the tests. (Nazri Ramliy, 2013 Feb 15)
+
+Patch to add "Q" and "A" responses to interactive :substitute. They are
+carried over when using :global. (Christian Brabandt, 2013 Jun 19)
+
+Bug with 'cursorline' in diff mode. Line being scrolled into view gets
+highlighted as the cursor line. (Alessandro Ivaldi, 2013 Jun 4)
+
+Two highlighting bugs. (ZyX, 2013 Aug 18)
+
+Patch to support 'u' in interactive substitute. (Christian Brabandt, 2012 Sep
+28) With tests: Oct 9.
+
+Dialog is too big on Linux too. (David Fishburn, 2013 Sep 2)
+
+- Add regex for 'paragraphs' and 'sections': 'parare' and 'sectre'. Combine
+ the two into a regex for searching. (Ned Konz)
+Patch by Christian Brabandt, 2013 Apr 20, unfinished.
+
+Bug: findfile("any", "file:///tmp;") does not work.
+
+Patch to add getsid(). (Tyru, 2011 Oct 2) Do we want this? Update Oct 4.
+Or use expand('<sid>')?
+
+Patch to make confirm() display colors. (Christian Brabandt, 2012 Nov 9)
+
+Problem with refresh:always in completion. (Tyler Wade, 2013 Mar 17)
+
+b:undo_ftplugin cannot call a script-local function. (Boris Danilov, 2013 Jan
+7)
+
+Win32: The Python interface only works with one version of Python, selected at
+compile time. Can this be made to work with version 2.1 and 2.2 dynamically?
+
+Python: Be able to define a Python function that can be called directly from
+Vim script. Requires converting the arguments and return value, like with
+vim.bindeval().
+
+Patch for :tabcloseleft, after closing a tab go to left tab. (William Bowers,
+2012 Aug 4)
+
+Patch to improve equivalence classes in regexp patterns.
+(Christian Brabandt, 2013 Jan 16, update Jan 17)
+
+Patch with suggestions for starting.txt. (Tony Mechelynck, 2012 Oct 24)
+But use Gnome instead of GTK?
+
+Should be possible to enable/disable matchparen per window or buffer.
+Add a check for b:no_match_paren in Highlight_matching_Pair() (Marcin
+Szamotulski, 2012 Nov 8)
+
+'iminsert' global value set when using ":setlocal iminsert"? (Wu, 2012 Jun 23)
+
+Patch to append regexp to tag commands to make it possible to select one out
+of many matches. (Cody Cutler, 2013 Mar 28)
+
+The input map for CTRL-O in mswin.vim causes problems after CTRL-X CTRL-O.
+Suggestion for another map. (Philip Mat, 2012 Jun 18)
+But use "gi" instead of "a". Or use CTRL-\ CTRL-O.
+
+When there are no command line arguments ":next" and ":argu" give E163, which
+is confusing. Should say "the argument list is empty".
+
+URXVT:
+- will get stuck if byte sequence does not contain the expected semicolon.
+- Use urxvt mouse support also in xterm. Explanations:
+ http://www.midnight-commander.org/ticket/2662
+
+Patch to add tests for if_xcmdsrv.c., Jul 8, need some more work. (Brian Burns)
+New tests Jul 13. Update Jul 17. Discussion Jul 18.
+
+Patch for input method status. (Hirohito Higashi, 2012 Apr 18)
+
+Update Vim app icon (for Gnome). (Jakub Steiner, 2013 Dec 6)
+
+Patch to use .png icons for the toolbar on MS-Windows. (Martin Gieseking, 2013
+Apr 18)
+
+Patch for has('unnamedplus') docs. (Tony Mechelynck, 2011 Sep 27)
+And one for gui_x11.txt.
+
+":cd" doesn't work when current directory path contains "**".
+finddir() has the same problem. (Yukihiro Nakadaira, 2012 Jan 10)
+Requires a rewrite of the file_file_in_path code.
+
+Should use has("browsefilter") in ftplugins. Requires patch 7.3.593.
+
+Update for vim2html.pl. (Tyru, 2013 Feb 22)
+
+Patch to sort functions starting with '<' after others. Omit dict functions,
+they can't be called. (Yasuhiro Matsumoto, 2011 Oct 11)
+
+Patch to pass list to or(), and() and xor(). (Yasuhiro Matsumoto, 2012 Feb 8)
+
+Patch to improve "it" and "at" text object matching. (Christian Brabandt, 2011
+Nov 20)
+
+Patch to improve GUI find/replace dialog. (Christian Brabandt, 2012 May 26)
+Update Jun 2.
+
+`] moves to character after insert, instead of the last inserted character.
+(Yukihiro Nakadaira, 2011 Dec 9)
+
+Plugin for Modeleasy. (Massimiliano Tripoli, 2011 Nov 29)
+
+BufWinLeave triggers too late when quitting last window in a tab page. (Lech
+Lorens, 2012 Feb 21)
+
+Patch for 'transparency' option. (Sergiu Dotenco, 2011 Sep 17)
+Only for MS-Windows. No documentation. Do we want this?
+
+Patch to support cursor shape in Cygwin console. (Ben bgold, 2011 Dec 27)
+
+On MS-Windows a temp dir with a & init causes system() to fail. (Ben Fritz,
+2012 Jun 19)
+
+'cursorline' is displayed too short when there are concealed characters and
+'list' is set. (Dennis Preiser)
+Patch 7.3.116 was the wrong solution.
+Christian Brabandt has another incomplete patch. (2011 Jul 13)
+
+Win32: Patch to use task dialogs when available. (Sergiu Dotenco, 2011 Sep 17)
+New feature, requires testing. Made some remarks.
+
+Win32: Patch for alpha-blended icons and toolbar height. (Sergiu Dotenco, 2011
+Sep 17) Asked for feedback from others.
+
+Win32: Cannot cd into a directory that starts with a space. (Andy Wokula, 2012
+Jan 19)
+
+Need to escape $HOME on Windows for fnameescape()? (ZyX, 2011 Jul 21,
+discussion 2013 Jul 4) Can't simply use a backslash, \$HOME has a different
+meaning already. Would be possible to use $$HOME where $HOME is to be used.
+
+"2" in 'formatoptions' not working in comments. (Christian Corneliussen, 2011
+Oct 26)
+
+Bug in repeating Visual "u". (Lawrence Kesteloot, 2010 Dec 20)
+
+Windows keys not set properly on Windows 7? (cncyber, 2010 Aug 26)
+
+When using a Vim server, a # in the path causes an error message.
+(Jeff Lanzarotta, 2011 Feb 17)
+
+When there is a ">" in a line that "gq" wraps to the start of the next line,
+then the following line will pick it up as a leader. Should get the leader
+from the first line, not a wrapped line. (Matt Ackeret, 2012 Feb 27)
+
+Using ":break" or something else that stops executing commands inside a
+":finally" does not rethrow a previously uncaught exception. (ZyX, 2010 Oct
+15)
+
+Vim using lots of memory when joining lines. (John Little, 2010 Dec 3)
+
+BT regexp engine: After trying a \@> match and failing, submatches are not
+cleared. See test64.
+
+On 64 bit MS-Windows "long" is only 32 bits, but we sometimes need to store a
+64 bits value. Change all number options to use nropt_T and define it to the
+right type.
+
+string() can't parse back "inf" and "nan". Fix documentation or fix code?
+(ZyX, 2010 Aug 23)
+
+When doing "redir => s:foo" in a script and then "redir END" somewhere else
+(e.g. in a function) it can't find s:foo.
+When a script contains "redir => s:foo" but doesn't end redirection, a
+following "redir" command gives an error for not being able to access s:foo.
+(ZyX, 2011 Mar 27)
+
+When setqflist() uses a filename that triggers a BufReadCmd autocommand Vim
+doesn't jump to the correct line with :cfirst. (ZyX, 2011 Sep 18)
+
+Behavior of i" and a" text objects isn't logical. (Ben Fritz, 2013 Nov 19)
+
+When setting a local option value from the global value, add a script ID that
+indicates this, so that ":verbose set" can give a hint. Check with options in
+the help file.
+
+After patch 7.3.097 still get E15. (Yukihiro Nakadaira, 2011 Jan 18)
+Also for another example (ZyX, 2011 Jan 24)
+
+"0g@$" puts '] on last byte of multibyte. (ZyX, 2011 Jan 22)
+
+Patch for :tabrecently. (Hirokazu Yoshida, 2012 Jan 30)
+
+Problem with "syn sync grouphere". (Gustavo Niemeyer, 2011 Jan 27)
+
+Loading autoload script even when usage is inside "if 0". (Christian Brabandt,
+2010 Dec 18)
+
+With a filler line in diff mode, it isn't displayed in the column with line
+number, but it is in the sign column. Doesn't look right. (ZyX 2011 Jun 5)
+Patch by Christian Brabandt, 2011 Jun 5. Introduces new problems.
+
+Add jump() function. (Marcin Szamotulski, 2013 Aug 29)
+Is this needed? CTRL-O and CTRL-I do the same, just more difficult to use.
+
+8 Add a command to jump to the next character highlighted with "Error".
+Patch by Christian Brabandt, uses ]e [e ]t and [t. 2011 Aug 9.
+
+Add event for when the text scrolls. A bit like CursorMoved. Also a similar
+one for insert mode. Use the event in matchparen to update the highlight if
+the match scrolls into view.
+
+7 Use "++--", "+++--" for different levels instead of "+---" "+----".
+Patch by Christian Brabandt, 2011 Jul 27.
+Update by Ben Fritz, with fix for TOhtml. (2011 Jul 30)
+
+9 Add %F to 'errorformat': file name without spaces. Useful on Unix to
+ avoid matching something up to a time 11:22:33.
+Patch by Christian Brabandt, 2011 Jul 27.
+
+Patch to add up to 99 match groups. (Christian Brabandt, 2010 Dec 22)
+Also add named groups: \%{name}(re) and \%{name}g
+
+In the sandbox it's not allowed to do many things, but it's possible to change
+or set variables. Add a way to prevent variables from being changed in the
+sandbox? E.g.: ":protect g:restore_settings".
+
+Win32: tear-off menu does not work when menu language is German. (Markus
+Bossler, 2011 Mar 2) Fixed by 7.3.095?
+
+Wish for NetBeans commands:
+ - make it possible to have 'defineAnnoType' also handle terminal colors.
+
+7.3.014 changed how backslash at end of line works, but still get a NUL when
+there is one backslash. (Ray Frush, 2010 Nov 18) What does the original ex
+do?
+
+New esperanto spell file can't be processed. (Dominique Pelle, 2011 Jan 30)
+- move compflags to separate growarray?
+- instead of a regexp use a hashtable. Expand '?', '*', '+'. What would be
+ the maximum repeat for * and +?
+
+"L'Italie" noted as a spell error at start of the sentence. (Dominique Pelle,
+2011 Feb 27)
+
+Editing a file with a ^M with 'ff' set to "mac", opening a help file, then the
+^M is displayed as ^J sometimes. Getting 'ff' value from wrong window/buffer?
+
+When Vim is put in the background (SIGTSTP) and then gets a SIGHUP it doesn't
+exit. It exists as soon as back in the foreground. (Stephen Liang, 2011 Jan
+9) Caused by vim_handle_signal(SIGNAL_BLOCK); in ui.c.
+
+g` not working correctly when using :edit. It works OK when editing a file on
+the command line. (Ingo Karkat, 2011 Jan 25)
+
+Since patch 7.2.46 Yankring plugin has become very slow, eventually make Vim
+crash? (Raiwil, 2010 Nov 17)
+
+Regexp engine performance:
+- Profiling:
+ ./vim -u NONE -s ~/vim/test/ruby.vim
+ ./vim -u NONE -s ~/vim/test/loop.vim
+ ./vim -u NONE -s ~/vim/test/alsa.vim
+ ./vim -s ~/vim/test/todo.vim
+ ./vim -s ~/vim/test/xml.vim
+ Dominique Pelle: xmlSyncDT is particularly slow (Jun 7)
+- More test files from the src/pkg/regexp/testdata directory in the Go repo.
+- Performance tests:
+ - Using asciidoc syntax. (Marek Schimara, 2013 Jun 6)
+ - ~/vim/text/FeiqCfg.xml (file from Netjune)
+ - ~/vim/text/edl.svg (also XML)
+ - glts has five tests. (May 25)
+ - ~/vim/test/slowsearch
+ - ~/vim/test/rgb.vim
+ - search for a.*e*exn in the vim executable. Go to last line to use
+ 'hlsearch'.
+ - Slow combination of folding and PHP syntax highlighting. Script to
+ reproduce it. Caused by "syntax sync fromstart" in combination with patch
+ 7.2.274. (Christian Brabandt, 2010 May 27) Generally, folding with
+ 'foldmethod' set to "syntax" is slow. Do profiling to find out why.
+
+Problem producing tags file when hebrew.frx is present. It has a BOM.
+Results in E670. (Tony Mechelynck, 2010 May 2)
+
+'beval' option should be global-local.
+
+Ruby: ":ruby print $buffer.number" returns zero.
+
+setpos() does not restore cursor position after :normal. (Tyru, 2010 Aug 11)
+
+With "tw=55 fo+=a" typing space before ) doesn't work well. (Scott Mcdermott,
+2010 Oct 24)
+
+Messages in message.txt are highlighted as examples.
+
+When using cp850 the NBSP (0xff) is not drawn correctly. (Brett Stahlman, 2010
+Oct 22) 'isprint' is set to "@,161-255".
+
+":echo "\x85" =~# '[\u0085]'" returns 1 instead of 0. (ZyX, 2010 Oct 3)
+
+'cindent' not correct when 'list' is set. (Zdravi Korusef, 2010 Apr 15)
+
+C-indenting: A matching { in a comment is ignored, but intermediate { are not
+checked to be in a comment. Implement FM_SKIPCOMM flag of findmatchlimit().
+Issue 46.
+
+Using CompilerSet doesn't record where an option was set from. E.g., in the
+gcc compiler plugin. (Gary Johnson, 2010 Dec 13)
+
+":helpgrep" does not put the cursor in the correct column when preceded by
+accented character. (Tony Mechelynck, 2010 Apr 15)
+
+Don't call check_restricted() for histadd(), setbufvar(), settabvar(),
+setwinvar().
+
+Patch for gVimExt to show an icon. (Dominik Riebeling, 2010 Nov 7)
+
+When 'lines' is 25 and 'scrolloff' is 12, "j" scrolls zero or two lines
+instead of one. (Constantin Pan, 2010 Sep 10)
+
+Gui menu edit/paste in block mode insert only inserts in one line (Bjorn
+Winckler, 2011 May 11)
+Requires a map mode for Insert mode started from blockwise Visual mode.
+
+Problem with cursor in the wrong column. (SungHyun Nam, 2010 Mar 11)
+Additional info by Dominique Pelle. (also on 2010 Apr 10)
+
+CreateFile and CreateFileW are used without sharing, filewritable() fails when
+the file was already open (e.g. script is being sourced). Add FILE_SHARE_READ|
+FILE_SHARE_WRITE in mch_access()? (Philippe Vaucher, 2010 Nov 2)
+
+Is ~/bin (literally) in $PATH supposed to work? (Paul, 2010 March 29)
+Looks like only bash can do it. (Yakov Lerner)
+
+Cscope "cs add" stopped working somewhat before 7.2.438. (Gary Johnson, 2010
+Jun 29) Caused by 7.2.433?
+
+Jumplist doesn't work properly in Insert mode? (Jean Johner, 2010 Mar 20)
+
+Problem with transparent cmdline. Also: Terminal title is wrong with
+non-ASCII character. (Lily White, 2010 Mar 7)
+
+iconv() doesn't fail on an illegal character, as documented. (Yongwei Wu, 2009
+Nov 15, example Nov 26) Add argument to specify whether iconv() should fail
+or replace with a character and continue?
+
+Add local time at start of --startuptime output.
+Requires configure check for localtime().
+Use format year-month-day hr:min:sec.
+
+Patch to make ":hi link" also take arguments. (Nate Soares, 2012 Dec 4)
+
+Shell not recognized properly if it ends in "csh -f". (James Vega, 2009 Nov 3)
+Find tail? Might have a / in argument. Find space? Might have space in
+path.
+
+Test 51 fails when language set to German. (Marco, 2011 Jan 9)
+Dominique can't reproduce it.
+
+'ambiwidth' should be global-local.
+
+":function f(x) keepjumps" creates a function where every command is executed
+like it has ":keepjumps" before it.
+
+Coverity: Check if there are new reported defects:
+https://scan.coverity.com/projects/241
+
+Problem with editing file in binary mode. (Ingo Krabbe, 2009 Oct 8)
+
+Display error when 'tabline' that includes a file name with double-width
+characters. (2010 Aug 14, bootleq)
+
+Problem with stop directory in findfile(). (Adam Simpkins, 2009 Aug 26)
+
+Using ']' as the end of a range in a pattern requires double escaping:
+ /[@-\\]] (Andy Wokula, 2011 Jun 28)
+
+For running gvim on a USB stick: avoid the OLE registration. Use a command
+line argument -noregister.
+
+When using an expression in 'statusline' leading white space sometimes goes
+missing (but not always). (ZyX, 2010 Nov 1)
+
+When a mapping exists both for insert mode and lang-insert mode, the last one
+doesn't work. (Tyru, 2010 May 6) Or is this intended?
+
+Still a problem with ":make" in the wrong directory. Caused by ":bufdo".
+(Ajit Thakkar, 2009 Jul 1) More information Jul 9, Jul 15.
+Caused by "doautoall syntaxset BufEnter *" in syntax/nosyntax.vim ?
+There also is a BufLeave/BufEnter aucmd to save/restore view.
+Does the patch to save/restore globaldir work?
+
+":bufdo normal gg" while 'hidden' is set leaves buffers without syntax
+highlighting. Don't disable Syntax autocommands then? Or add a flag/modifier
+to avoid changing 'eventignore'?
+
+Patch for displaying 0x200c and 0x200d. (Ali Gholami Rudi, 2009 May 6)
+Probably needs a bit of work.
+
+List of encoding aliases. (Takao Fujiwara, 2009 Jul 18)
+Are they all OK? Update Jul 22.
+
+Win32: Improved Makefile for MSVC. (Leonardo Valeri Manera, 2010 Aug 18)
+
+Win32: Expanding 'path' runs into a maximum size limit. (bgold12, 2009 Nov 15)
+
+Win32: Patch for using .png files for icons. (Charles Peacech, 2012 Feb 5)
+
+Putting a Visual block while 'visualedit' is "all" does not leave the cursor
+on the first character. (John Beckett, 2010 Aug 7)
+
+Setting 'tags' to "tagsdir/*" does not find "tagsdir/tags". (Steven K. Wong,
+2009 Jul 18)
+
+Patch to add "focusonly" to 'scrollopt', so that scrollbind also applies in
+window that doesn't have focus. (Jonathon Mah, 2009 Jan 12)
+Needs more work.
+
+Problem with <script> mappings (Andy Wokula, 2009 Mar 8)
+
+When starting Vim with "gvim -f -u non_existent_file > foo.txt" there are a
+few control characters in the output. (Dale Wiles, 2009 May 28)
+
+'cmdwinheight' is only used in last window when 'winheight' is a large value.
+(Tony Mechelynck, 2009 Apr 15)
+
+Status line containing winnr() isn't updated when splitting the window (Clark
+J. Wang, 2009 Mar 31)
+
+When $VIMRUNTIME is set in .vimrc, need to reload lang files. Already done
+for GTK, how about others? (Ron Aaron, 2010 Apr 10)
+
+":tab split fname" doesn't set the alternate file in the original window,
+because win_valid() always returns FALSE. Below win_new_tabpage() in
+ex_docmd.c.
+
+Space before comma in function definition not allowed: "function x(a , b)"
+Give a more appropriate error message. Add a remark to the docs.
+
+string_convert() should be able to convert between utf-8 and utf-16le. Used
+for GTK clipboard. Avoid requirement for iconv.
+
+Now that colnr_T is int instead of unsigned, more type casts can be removed.
+
+Don't load macmap.vim on startup, turn it into a plugin. (Ron Aaron,
+2009 Apr 7) Reminder Apr 14.
+
+Add "no_hlsearch" to winsaveview().
+
+Bug: When reloading a buffer changed outside of Vim, BufRead autocommands
+are applied to the wrong buffer/window. (Ben Fritz, 2009 Apr 2, May 11)
+Ignore window options when not in the right window?
+Perhaps we need to use a hidden window for applying autocommands to a buffer
+that doesn't have a window.
+
+When using "ab foo bar" and mapping <Tab> to <Esc>, pressing <Tab> after foo
+doesn't trigger the abbreviation like <Esc> would. (Ramana Kumar, 2009 Sep 6)
+
+getbufvar() to get a window-local option value for a buffer that's not
+displayed in a window should return the value that's stored for that buffer.
+
+":he ctrl_u" can be auto-corrected to ":he ctrl-u".
+
+Diff mode out of sync. (Gary Johnson, 2010 Aug 4)
+
+Win32: completion of file name ":e c:\!test" results in ":e c:\\!test", which
+does not work. (Nieko Maatjes, 2009 Jan 8, Ingo Karkat, 2009 Jan 22)
+
+opening/closing window causes other window with 'winfixheight' to change
+height. Also happens when there is another window in the frame, if it's not
+very high. (Yegappan Lakshmanan, 2010 Jul 22, Michael Peeters, 2010 Jul 22)
+
+Using ~ works OK on 'a' with composing char, but not on 0x0418 with composing
+char 0x0301. (Tony Mechelynck, 2009 Mar 4)
+
+This does not work yet: "a\(%C\)" (get composing characters into a submatch).
+
+Inconsistent: starting with $LANG set to es_ES.utf-8 gives Spanish
+messages, even though locale is not supported. But ":lang messages
+es_ES.utf-8" gives an error and doesn't switch messages. (Dominique Pelle,
+2009 Jan 26)
+
+When $HOME contains special characters, such as a comma, escape them when used
+in an option. (Michael Hordijk, 2009 May 5)
+Turn "esc" argument of expand_env_esc() into string of chars to be escaped.
+
+Should make 'ignorecase' global-local, so that it makes sense setting it from
+a modeline.
+
+Add cscope target to Makefile. (Tony Mechelynck, 2009 Jun 18, replies by
+Sergey Khorev)
+
+Completion for ":buf" doesn't work properly on Win32 when 'shellslash' is off.
+(Henrik Ohman, 2009, Jan 29)
+
+shellescape() depends on 'shellslash' for quoting. That doesn't work when
+'shellslash' is set but using cmd.exe. (Ben Fritz)
+Use a different option or let it depend on whether 'shell' looks like a
+unix-like shell?
+
+Bug: in Ex mode (after "Q") backslash before line break, when yanked into a
+register and executed, results in <Nul>: instead of line break.
+(Konrad Schwarz, 2010 Apr 16)
+
+Have a look at patch for utf-8 line breaking. (Yongwei Wu, 2008 Mar 1, Mar 23)
+Now at: http://vimgadgets.sourceforge.net/liblinebreak/
+
+Greek sigma character should be lower cased depending on the context. Can we
+make this work? (Dominique Pelle, 2009 Sep 24)
+
+When changing 'encoding' convert all the swap file names, so that we can
+still delete them. Also convert all buffer file names?
+
+"gqip" in Insert mode has an off-by-one error, causing it to reflow text.
+(Raul Coronado, 2009 Nov 2)
+
+MS-Windows: editing the first, empty buffer, 'ffs' set to "unix,dos", ":enew"
+doesn't set 'ff' to "unix". (Ben Fritz, 2008 Dec 5) Reusing the old buffer
+probably causes this.
+
+'scrollbind' is not respected when deleting lines or undo. (Milan Vancura,
+2009 Jan 16)
+
+Having "Syntax" in 'eventignore' for :bufdo may cause problems, e.g. for
+":bufdo e" when buffers are open in windows. ex_listdo(eap) could set the
+option only for when jumping to another buffer, not when the command argument
+is executed.
+
+":pedit %" with a BufReadPre autocommand causes the cursor to move to the
+first line. (Ingo Karkat, 2008 Jul 1) Ian Kelling is working on this.
+Similar problem with ":e". (Marc Montu, 2014 Apr 22)
+
+Cursor line moves in other window when using CTRL-W J that doesn't change
+anything. (Dasn, 2009 Apr 7)
+
+On Unix "glob('does not exist~')" returns the string. Without the "~" it
+doesn't. (John Little, 2008 Nov 9)
+Shell expansion returns unexpanded string?
+Don't use shell when "~" is not at the start?
+
+When using ":e ++enc=foo file" and the file is already loaded with
+'fileencoding' set to "bar", then do_ecmd() uses that buffer, even though the
+fileencoding differs. Reload the buffer in this situation? Need to check for
+the buffer to be unmodified.
+Unfinished patch by Ian Kelling, 2008 Jul 11. Followup Jul 14, need to have
+another look at it.
+
+c.vim: XXX in a comment is colored yellow, but not when it's after "#if 0".
+(Ilya Dogolazky, 2009 Aug 7)
+
+You can type ":w ++bad=x fname", but the ++bad argument is ignored. Give an
+error message? Or is this easy to implement? (Nathan Stratton Treadway, 2008
+Aug 20) This is in ucs2bytes(), search for 0xBF. Using the ++bad argument is
+at the other match for 0xBF.
+
+When adding "-complete=file" to a user command this also changes how the
+argument is processed for <f-args>. (Ivan Tishchenko, 2008 Aug 19)
+
+Win32: associating a type with Vim doesn't take care of space after a
+backslash? (Robert Vibrant, 2008 Jun 5)
+
+When 'rightleft' is set, cursorcolumn isn't highlighted after the end of a
+line. It's also wrong in folds. (Dominique Pelle, 2010 Aug 21)
+
+":help s/~" jumps to *s/\~*, while ":help s/\~" doesn't find anything. (Tim
+Chase) Fix by Ian Kelling, 2008 Jul 14.
+
+When mapping : to ; and ; to :, @; doesn't work like @: and @: doesn't work
+either. Matt Wozniski: nv_at() calls do_execreg() which uses
+put_in_typebuf(). Char mapped twice?
+
+Despite adding save_subexpr() this still doesn't work properly:
+Regexp: matchlist('12a4aaa', '^\(.\{-}\)\(\%5c\@<=a\+\)\(.\+\)\?')
+Returns ['12a4', 'aaa', '4aaa'], should be ['12a4', 'aaa', '']
+Backreference not cleared when retrying after \@<= fails?
+(Brett Stahlman, 2008 March 8)
+
+Problem with remote_send(). (Charles Campbell, 2008 Aug 12)
+
+ftplugin for help file should set 'isk' to help file value.
+
+Win32: remote editing fails when the current directory name contains "[".
+(Ivan Tishchenko, Liu Yubao) Suggested patch by Chris Lubinski: Avoid
+escaping characters where the backslash is not removed later. Asked Chris for
+an alternate solution, also for src/ex_getln.c.
+This also fails when the file or directory name contains "%". (Thoml, 2008
+July 7)
+Using --remote-silent while the current directory has a # in the name does not
+work, the # needs to be escaped. (Tramblay Bruno, 2012 Sep 15)
+
+When using remote-silent the -R flag is not passed on. (Axel Bender, 2012 May
+31)
+
+Win32: A --remote command that has a directory name starting with a ( doesn't
+work, the backslash is removed, assuming that it escapes the (. (Valery
+Kondakoff, 2009 May 13)
+
+Win32: Using "gvim --remote-tab-silent elŝuti.txt" doesn't work, the
+multibyte character isn't passed and edits elsuti.txt.
+(Raúl Núñez de Arenas Coronado, 2015 Dec 18)
+
+Problem with CTRL-F. (Charles Campbell, 2008 March 21)
+Only happens with "gvim -geometry "160x26+4+27" -u NONE -U NONE prop.c".
+'lines' is 54. (2008 March 27)
+
+Problem with pointer wrapping around in getvcol(). (Wolfgang Kroworsch, 2008
+Oct 19) Check for "col" being "MAXCOL" separately?
+
+Unexpectedly inserting a double quote. (Anton Woellert, 2008 Mar 23)
+Works OK when 'cmdheight' is 2.
+
+8 Use a mechanism similar to omni completion to figure out the kind of tab
+ for CTRL-] and jump to the appropriate matching tag (if there are
+ several).
+
+The utf class table is missing some entries:
+ 0x2212, minus sign
+ 0x2217, star
+ 0x2500, bar
+ 0x26ab, circle
+
+Visual line mode doesn't highlight properly when 'showbreak' is used and the
+line doesn't fit. (Dasn, 2008 May 1)
+
+GUI: In Normal mode can't yank the modeless selection. Make "gy" do this?
+Works like CTRL-Y in Command line mode.
+
+C't: On utf-8 system, editing file with umlaut through Gnome results in URL
+with %nn%nn, which is taken as two characters instead of one.
+Try to reproduce at work.
+
+Patch for default choice in file changed dialog. (Bjorn Winckler, 2008 Oct 19)
+Is there a way to list all the files first?
+
+Fail to edit file after failed register access. Error flag remains set?
+(Lech Lorens, 2010 Aug 30)
+
+Problem with 'ts' set to 9 and 'showbreak' to ">>>". (Matthew Winn, 2007 Oct
+1)
+
+":tab help" always opens a new tab, while ":help" re-uses an existing window.
+Would be more consistent when an existing tab is re-used. (Tony Mechelynck)
+
+Using Aap to build Vim: add remarks about how to set personal preferences.
+Example on http://www.calmar.ws/tmp/aap.html
+
+When 'diffopt' has "context:0" a single deleted line causes two folds to merge
+and mess up syncing. (Austin Jennings, 2008 Jan 31)
+
+Gnome improvements: Edward Catmur, 2007 Jan 7
+ Also use Save/Discard for other GUIs
+
+New PHP syntax file, use it? (Peter Hodge)
+
+":echoe" in catch block stops processing, while this doesn't happen outside of
+a catch block. (ZyX, 2011 Jun 2)
+
+Test 54 uses shell commands, that doesn't work on non-Unix systems. Use some
+other way to test buffer-local autocommands.
+
+The documentation mentions the priority for ":2match" and ":3match", but it
+appears the last one wins. (John Beckett, 2008 Jul 22) Caused by adding
+matchadd()? Suggested patch by John, 2008 Jul 24.
+
+When 'encoding' is utf-8 the command line is redrawn as a whole on every
+character typed. (Tyler Spivey, 2008 Sep 3) Only redraw cmdline for
+'arabicshape' when there is a character on the command line for which
+(ARABIC_CHAR(u8c)) is TRUE.
+
+Cheng Fang made javacomplete. (2007 Aug 11)
+Asked about latest version: 0.77.1 is on www.vim.org.
+
+More AmigaOS4 patches. (Peter Bengtsson, Nov 9)
+
+Amiga patches with vbcc. (Adrien Destugues, 2010 Aug 30)
+http://pulkomandy.ath.cx/drop/vim73_vbcc_amiga.diff
+
+Problem with compound words? (Bert, 2008 May 6)
+No warning for when flags are defined after they are used in an affix.
+
+Screen redrawing when continuously updating the buffer and resizing the
+terminal. (Yakov Lerner, 2006 Sept 7)
+
+Add option settings to help ftplugin. (David Eggum, 2006 Dec 18)
+
+Autoconf problem: when checking for iconv library we may add -L/usr/local/lib,
+but when compiling further tests -liconv is added without the -L argument,
+that may fail (e.g., sizeof(int)). (Blaine, 2007 Aug 21)
+
+Problem with ".add" files when using two languages and restarting Vim. (Raul
+Coronado, 2008 Oct 30)
+
+Popup menu redraw: Instead of first redrawing the text and then drawing the
+popup menu over it, first draw the new popup menu, remember its position and
+size and then redraw the text, skipping the characters under the popup menu.
+This should avoid flicker. Other solution by A.Politz, 2007 Aug 22.
+
+When the file name has parenthesis, e.g., "foo (bar).txt", ":!ls '%'" has the
+parenthesis escaped but not the space. That's inconsistent. Either escape
+neither or both. No escaping might be best, because it doesn't depend on
+particularities of the shell. (Zvi Har'El, 2007 Nov 10) (Teemu Likonen, 2008
+Jun 3)
+However, for backwards compatibility escaping might be necessary. Check if
+the user put quotes around the expanded item?
+
+A throw in a function causes missing an endif below the call. (Spiros
+Bousbouras, 2011 May 16)
+
+Error E324 can be given when a cron script has wiped out our temp directory.
+Give a clear error message about this (and tell them not to wipe out /tmp).
+
+Color for cUserLabel should differ from case label, so that a mistake in a
+switch list is noticed:
+ switch (i)
+ {
+ case 1:
+ foobar:
+ }
+
+Look at http://www.gtk-server.org/ . It has a Vim script implementation.
+
+Netbeans problem. Use "nc -l 127.0.0.1 55555" for the server, then run gvim
+with "gvim -nb:localhost:55555:foo". From nc do: '1:editFile!0 "foo"'. Then
+go to Insert mode and add a few lines. Then backspacing every other time
+moves the cursor instead of deleting. (Chris Kaiser, 2007 Sep 25)
+
+Windows installer could add a "open in new tab of existing Vim" menu entry.
+GvimExt: patch to add "Edit with single Vim &tabbed" menu entry.
+Just have two choices, always using one Vim and selecting between using an
+argument list or opening each file in a separate tab.
+(Erik Falor, 2008 May 21, 2008 Jun 26)
+
+Windows installer: licence text should not use indent, causes bad word wrap.
+(Benjamin Fritz, 2010 Aug 16)
+
+Changes for Win32 makefile. (Mike Williams, 2007 Jan 22, Alexei Alexandrov,
+2007 Feb 8)
+
+Win32: Can't complete shell command names. Why is setting xp_context in
+set_one_cmd_context() inside #ifndef BACKSLASH_IN_FILENAME?
+
+Win32: Patch for cscope external command. (Mike Williams, 2007 Aug 7)
+
+Win32: XPM support only works with path without spaces. Patch by Mathias
+Michaelis, 2006 Jun 9. Another patch for more path names, 2006 May 31.
+New version: http://members.tcnet.ch/michaelis/vim/patches.zip (also for other
+patches by Mathias, see mail Feb 22)
+
+Win32: compiling with normal features and OLE fails. Patch by Mathias
+Michaelis, 2006 Jun 4.
+
+Win32: using CTRL-S in Insert mode doesn't remove the "+" from the tab pages
+label. (Tsakiridis, 2007 Feb 18) Patch from Ian Kelling, 2008 Aug 6.
+
+Win32: using "gvim --remote-tab-silent fname" sometimes gives an empty screen
+with the more prompt. Caused by setting the guitablabel? (Thomas Michael
+Engelke, 2007 Dec 20 - 2008 Jan 17)
+
+Win32: patch for fullscreen mode. (Liushaolin, 2008 April 17)
+
+Win32: When 'shell' is bash shellescape() doesn't always do the right thing.
+Depends on 'shellslash', 'shellquote' and 'shellxquote', but shellescape()
+only takes 'shellslash' into account.
+
+Menu item that does "xxd -r" doesn't work when 'fileencoding' is utf-16.
+Check for this and use iconv? (Edward L. Fox, 2007 Sep 12)
+Does the conversion in the other direction work when 'fileencodings' is set
+properly?
+
+Cursor displayed in the wrong position when using 'numberwidth'. (James Vega,
+2007 Jun 21)
+
+When $VAR contains a backslash expand('$VAR') removes it. (Teemu Likonen, 2008
+Jun 18)
+
+C++ indenting wrong with "=". (James Kanze, 2007 Jan 26)
+
+":lockvar" should use copyID to avoid endless loop.
+
+When using --remote-silent and the file name matches 'wildignore' get an E479
+error. without --remote-silent it works fine. (Ben Fritz, 2008 Jun 20)
+
+GVim: dialog for closing Vim should check if Vim is busy writing a file. Then
+use a different dialog: "busy saving, really quit? yes / no".
+
+Check other interfaces for changing curbuf in a wrong way. Patch like for
+if_ruby.c.
+
+":helpgrep" should use the directory from 'helpfile'.
+
+The need_fileinfo flag is messy. Instead make the message right away and put
+it in keep_msg?
+
+Editing a file remotely that matches 'wildignore' results in a "no match"
+error. Should only happen when there are wildcards, not when giving the file
+name literally, and esp. if there is only one name.
+
+Test 61 fails sometimes. This is a timing problem: "sleep 2" sometimes takes
+longer than 2 seconds.
+
+Using ":au CursorMoved * cmd" invokes mch_FullName(), which can be slow.
+Can this be avoided? (Thomas Waba, 2008 Aug 24)
+Also for ":w" without a file name.
+The buffer has the full path in ffname, should pass this to the autocommand.
+
+"vim -C" often has 'nocompatible', because it's set in some startup script.
+Set 'compatible' after startup is done? Patch by James Vega, 2008 Feb 7.
+
+VMS: while editing a file found in complex, Vim will save file into the first
+directory of the path and not to the original location of the file.
+(Zoltan Arpadffy)
+
+VMS: VFC files are in some cases truncated during reading (Zoltan Arpadffy)
+
+input() completion should not insert a backslash to escape a space in a file
+name?
+
+Ruby completion is insecure. Can this be fixed?
+
+When 'backupskip' is set from $TEMP special characters need to be escaped.
+(patch by Grembowietz, 2007 Feb 26, not quite right)
+Another problem is that file_pat_to_reg_pat() doesn't recognize "\\", so "\\("
+will be seen as a path separator plus "\(".
+
+gvim d:\path\path\(FILE).xml should not remove the \ before the (.
+This also fails with --remote.
+
+When doing ":quit" the Netbeans "killed" event isn't sent. (Xavier de Gaye,
+2008 Nov 10) call netbeans_file_closed() at the end of buf_freeall(), or in
+all places where buf_freeall() is called?
+
+aucmd_prepbuf() should also use a window in another tab page.
+
+When unloading a buffer in a BufHidden autocommand the hidden flag is reset?
+(Bob Hiestand, 2008 Aug 26, Aug 27)
+
+Substituting an area with a line break with almost the same area does change
+the Visual area. Can this be fixed? (James Vega, 2006 Sept 15)
+
+GUI: When combining fg en bg make sure they are not equal.
+
+Use different pt_br dictionary for spell checking. (Jackson A. Aquino, 2006
+Jun 5)
+
+Use different romanian dictionary for spell checking. (Andrei Popescu, Nov
+2008) Use http://downloads.sourceforge.net/rospell/ro_RO.3.2.zip
+Or the hunspell-ro.3.2.tar.gz file, it also has a iso-8859-2 list.
+
+In a C file with spell checking, in "% integer" "nteger" is seen as an error,
+but "]s" doesn't find it. "nteger" by itself is found. (Ralf Wildenhues, 2008
+Jul 22)
+
+There should be something about spell checking in the user manual.
+
+Add an option to specify the character to use when a double-width character is
+moved to the next line. Default '>', set to a space to blank it out. Check
+that char is single width when it's set (compare with 'listchars').
+
+The generated vim.bat can avoid the loop for NT. (Carl Zmola, 2006 Sep 3)
+
+When showing a diff between a non-existent file and an existing one, with the
+cursor in the empty buffer, the other buffer only shows the last line. Change
+the "insert" into a change from one line to many? (Yakov Lerner, 2008 May 27)
+
+These two abbreviations don't give the same result:
+ let asdfasdf = "xyz\<Left>"
+ cabbr XXX <C-R>=asdfasdf<CR>
+ cabbr YYY xyz<Left>
+
+Michael Dietrich: maximized gvim sometimes displays output of external command
+partly. (2006 Dec 7)
+
+In FileChangedShell command it's no longer allowed to switch to another
+buffer. But the changed buffer may differ from the current buffer, how to
+reload it then?
+
+For Aap: include a config.arg.example file with hints how to use config.arg.
+
+Default for 'background' is wrong when using xterm with 256 colors.
+Table with estimates from Matteo Cavalleri, 2014 Jan 10.
+
+Setting 'background' resets the Normal background color:
+ highlight Normal ctermbg=DarkGray
+ set background=dark
+This is undesired, 'background' is supposed to tell Vim what the background
+color is, not reset it.
+
+Completion menu: For a wrapping line, completing a long file name, only the
+start of the path is shown in the menu. Should move the menu to the right to
+show more text of the completions. Shorten the items that don't fit in the
+middle?
+
+Accessing file#var in a function should not need the g: prepended.
+
+When exiting detects a modified buffer, instead of opening the buffer in the
+current tab, use an existing tab, if possible. Like finding a window where
+the buffer is displayed. (Antonios Tsakiridis)
+
+When ":cn" moves to an error in the same line the message isn't shortened.
+Only skip shortening for ":cc"?
+
+Problem with ":call" and dictionary function. Hari Krishna Dara, Charles
+Campbell 2006 Jul 06.
+
+A custom completion function in a ":command" cannot be a Funcref. (Andy
+Wokula, 2007 Aug 25)
+
+Problem with using :redir in user command completion function? (Hari Krishna
+Dara, 2006 June 21)
+
+Another resizing problem when setting 'columns' and 'lines' to a very large
+number. (Tony Mechelynck, 2007 Feb 6)
+
+After starting Vim, using '0 to jump somewhere in a file, ":sp" doesn't center
+the cursor line. It works OK after some other commands.
+
+Win32: Is it possible to have both postscript and Win32 printing?
+
+Problem with 'cdpath' on MS-Windows when a directory is equal to $HOME. (2006
+Jul 26, Gary Johnson)
+
+Using UTF-8 character with ":command" does not work properly. (Matt Wozniski,
+2008 Sep 29)
+
+In the Netbeans interface add a "vimeval" function, so that the other side can
+check the result of has("patch13").
+
+Cursor line at bottom of window instead of halfway after saving view and
+restoring. Only with 'nowrap'. (Robert Webb, 2008 Aug 25)
+
+Netrw has trouble executing autocommands only for a directory. Add <isdir>
+and <notisdir> to autocommand patterns? Also <isfile>?
+
+Add command modifier that skips wildcard expansion, so that you don't need to
+put backslashes before special chars, only for white space.
+
+In mswin.vim: Instead of mapping <C-V> for Insert mode in a complicated way,
+can it be done like ":imap <C-V> <MiddleMouse>" without negative side effects?
+
+When right after "vim file", "M" then CTRL-W v the windows are scrolled
+differently and unexpectedly. Caused by patch 7.2.398?
+
+The magic clipboard format "VimClipboard2" appears in several places. Should
+be only one.
+
+Win32, NTFS: When editing a specific infostream directly and 'backupcopy' is
+"auto" should detect this situation and work like 'backupcopy' is "yes". File
+name is something like "c:\path\foo.txt:bar", includes a colon. (Alex
+Jakushev, 2008 Feb 1)
+
+Small problem displaying diff filler line when opening windows with a script.
+(David Luyer, 2007 Mar 1 ~/Mail/oldmail/mool/in.15872 )
+
+Is it allowed that 'backupext' is empty? Problems when backup is in same dir
+as original file? If it's OK don't compare with 'patchmode'. (Thierry Closen)
+
+Patch for adding ":lscscope". (Navdeep Parhar, 2007 Apr 26; update 2008 Apr
+23)
+
+":mkview" isn't called with the right buffer argument. Happens when using
+tabs and the autocommand "autocmd BufWinLeave * mkview". (James Vega, 2007
+Jun 18)
+
+When completing from another file that uses a different encoding completion
+text has the wrong encoding. E.g., when 'encoding' is utf-8 and file is
+latin1. Example from Gombault Damien, 2007 Mar 24.
+
+In gvim the backspace key produces a backspace character, but on Linux the
+VERASE key is Delete. Set VERASE to Backspace? (patch by Stephane Chazelas,
+2007 Oct 16)
+
+TermResponse autocommand isn't always triggered when using vimdiff. (Aron
+Griffis, 2007 Sep 19)
+
+Create a gvimtutor.1 file and change Makefiles to install it.
+
+When 'encoding' is utf-8 typing text at the end of the line causes previously
+typed characters to be redrawn. Caused by patch 7.1.329. (Tyler Spivey, 2008
+Sep 3, 11)
+
+":vimgrep" does not recognize a recursive symlink. Is it possible to detect
+this, at least for Unix (using device/inode)?
+
+When switching between windows the cursor is often put in the middle.
+Remember the relative position and restore that, just like lnum and col are
+restored. (Luc St-Louis)
+
+Add an option for a minimal text length before inserting a line break for
+'textwidth'. Avoids very short lines when a very long word follows.
+(Kartik Agaram)
+
+
+Better plugin support (not plugin manager, see elsewhere for that):
+- Avoid use of feedkeys, add eval functions where needed:
+ - manipulating the Visual selection?
+- Add createmark(): add a mark like mM, but return a unique ID. Need some way
+ to clean them up again... Use a name + the script ID.
+ Add createmark( , 'c') to track inserts/deletes before the column.
+- Plugins need to make a lot of effort, lots of mappings, to know what
+ happened before pressing the key that triggers a plugin action. How about
+ keeping the last N pressed keys, so that they do not need to be mapped?
+- equivalent of netbeans_beval_cb(). With an autocommand?
+- Add something to enable debugging when a remote message is received.
+
+
+More patches:
+- Another patch for Javascript indenting. (Hari Kumar, 2010 Jul 11)
+ Needs a few tests.
+- Add 'cscopeignorecase' option. (Liang Wenzhi, 2006 Sept 3)
+- Extra argument to strtrans() to translate special keys to their name (Eric
+ Arnold, 2006 May 22)
+- Mac: indicate whether a buffer was modified. (Nicolas Weber, 2006 Jun 30)
+- Allow negative 'nrwidth' for left aligning. (Nathan Laredo, 2006 Aug 16)
+- ml_append_string(): efficiently append to an existing line. (Brad
+ Beveridge, 2006 Aug 26) Use in some situations, e.g., when pasting a
+ character at a time?
+- recognize hex numbers better. (Mark Manning, 2006 Sep 13)
+- Add <AbbrExpand> key, to expand an abbreviation in a mapping. (Kana
+ Natsuno, 2008 Jul 17)
+- Add 'wspara' option, also accept blank lines like empty lines for "{" and
+ "}". (Mark Lundquist, 2008 Jul 18)
+- Patch to add CTRL-T to delete part of a path on cmdline. (Adek, 2008 Jul
+ 21)
+- Instead of creating a copy of the tutor in all the shell scripts, do it in
+ vimtutor.vim. (Jan Minar, 2008 Jul 20)
+- When fsync() fails there is no hint about what went wrong. Patch by Ben
+ Schmidt, 2008 Jul 22.
+- testdir/Make_dos_sh.mak for running tests with MingW. (Bill McCarthy, 2008
+ Sep 13)
+- Replace ccomplete.vim by cppcomplete.vim from www.vim.org? script 1520 by
+ Vissale Neang. (Martin Stubenschrott) Asked Vissale to make the scripts
+ more friendly for the Vim distribution.
+ New version received 2008 Jan 6.
+ No maintenance in two years...
+- Patch to open dropped files in new tabs. (Michael Trim, 2010 Aug 3)
+
+Awaiting updated patches:
+9 Mac unicode patch (Da Woon Jung, Eckehard Berns):
+ 8 Add patch from Muraoka Taro (Mar 16) to support input method on Mac?
+ New patch 2004 Jun 16
+ - selecting proportional font breaks display
+ - UTF-8 text causes display problems. Font replacement causes this.
+ - Command-key mappings do not work. (Alan Schmitt)
+ - With 'nopaste' pasting is wrong, with 'paste' Command-V doesn't work.
+ (Alan Schmitt)
+ - remove 'macatsui' option when this has been fixed.
+ - when 'macatsui' is off should we always convert to "macroman" and ignore
+ 'termencoding'?
+9 HTML indenting can be slow. Caused by using searchpair(). Can search()
+ be used instead? A.Politz is looking into a solution.
+8 Win32: Add minidump generation. (George Reilly, 2006 Apr 24)
+7 Completion of network shares, patch by Yasuhiro Matsumoto.
+ Update 2004 Sep 6.
+ How does this work? Missing comments.
+8 Add a few more command names to the menus. Patch from Jiri Brezina
+ (28 feb 2002). Will mess the translations...
+7 ATTENTION dialog choices are more logical when "Delete it" appears
+ before "Quit". Patch by Robert Webb, 2004 May 3.
+- Include flipcase patch: ~/vim/patches/wall.flipcase2 ? Make it work
+ for multibyte characters.
+- Win32: add options to print dialog. Patch from Vipin Aravind.
+- Patch to add highlighting for whitespace. (Tom Schumm, 2003 Jul 5)
+ use the patch that keeps using HLF_8 if HLF_WS has not
+ been given values.
+ Add section in help files for these highlight groups?
+7 Add "DefaultFG" and "DefaultBG" for the colors of the menu. (Marcin
+ Dalecki has a patch for Motif and Carbon)
+- Add possibility to highlight specific columns (for Fortran). Or put a
+ line in between columns (e.g., for 'textwidth').
+ Patch to add 'hlcolumn' from Vit Stradal, 2004 May 20.
+ confirm() add "flags" argument, with 'v' for vertical
+ layout and 'c' for console dialog. (Haegg)
+ Flemming Madsen has a patch for the 'c' flag
+ (2003 May 13)
+ raisewin() raise gvim window (see HierAssist patch for
+ Tcl implementation ~/vim/HierAssist/ )
+ taglist() add argument to specify maximum number of matches.
+ useful for interactive things or completion.
+ col('^') column of first non-white character.
+ Can use "len(substitute(getline('.'), '\S.*', '', ''))
+ + 1", but that's ugly.
+7 Add patch from Benoit Cerrina to integrate Vim and Perl functions
+ better. Now also works for Ruby (2001 Nov 10)
+7 When 'rightleft' is set, the search pattern should be displayed right
+ to left as well? See patch of Dec 26. (Nadim Shaikli)
+8 Option to lock all used memory so that it doesn't get swapped to disk
+ (unencrypted). Patch by Jason Holt, 2003 May 23. Uses mlock.
+7 Add ! register, for shell commands. (patch from Grenie)
+8 In the gzip plugin, also recognize *.gz.orig, *.gz.bak, etc. Like it's
+ done for filetype detection. Patch from Walter Briscoe, 2003 Jul 1.
+7 Add a "-@ filelist" argument: read file names from a file. (David
+ Kotchan has a patch for it)
+7 Add ":justify" command. Patch from Vit Stradal 2002 Nov 25.
+- findmatch() should be adjusted for Lisp. See remark at
+ get_lisp_indent(). Esp. \( and \) should be skipped. (Dorai Sitaram,
+ incomplete patch Mar 18)
+- For GUI Find/Replace dialog support using a regexp. Patch for Motif
+ and GTK by degreneir (nov 10 and nov 18).
+- Patch for "paranoid mode" by Kevin Collins, March 7. Needs much more work.
+- Patch for redo register. (Ben Schmidt, 2007 Oct 19)
+ Await response to question to make the register writable.
+
+
+Better 'rightleft' or BIDI support:
+- Minimal Vi with bidi support: https://github.com/aligrudi/neatvi
+ By Ali Gholami Rudi, also worked on arabic.c
+
+
+Spell checking:
+- List of common misspellings in English:
+ https://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines
+ German:
+ https://de.wikipedia.org/wiki/Wikipedia:Liste_von_Tippfehlern/F%C3%BCr_Maschinen
+ There are other languages.
+- [s does not find missing capital at start of the line. #10838
+ Probably because the dot at the end of the previous line isn't seen.
+- When 'cursorline' is set and the first word should have SpellCap
+ highlighting, redrawing the line removes it when moving the cursor away
+ from the line. (#7085) Would need to inspect the end of the previous line
+ and update "capcol_lnum" and "cap_col".
+- Mixup of highlighting when there is a match and SpellBad. (ZyX, 2015 Jan 1)
+- Spell files use a latin single quote. Unicode also has another single
+ quote: 0x2019. (Ron Aaron, 2014 Apr 4)
+ New OpenOffice spell files support this with ICONV. But they are not
+ compatible with Vim spell files. The old files can no longer be
+ downloaded.
+- Add a feature to only consider two spaces after a dot to start a new
+ sentence. Don't give the capitalization error when there is one space.
+- Add a way to specify punctuation characters. Add the superscript numbers
+ by default: 0x2070, 0xb9, 0xb2, 0xb3, 0x2074 - 0x2079.
+- In popup menu: If the only problem is the case of the first character,
+ don't offer "ignore" and "add to word list".
+- Spell menu: When using the Popup menu to select a replacement word,
+ ":spellrepeat" doesn't work. SpellReplace() uses setline(). Can it use
+ "z=" somehow? Or use a new function.
+
+
+Quickfix/Location List:
+- Window size is wrong when using quickfix window. (Lifepillar, 2018 Aug 24,
+ #2999)
+- When using CTRL-W CR in the quickfix window, the jumplist in the opened
+ window is cleared, to avoid going back to the list of errors buffer (would
+ have two windows with it). Can we just remove the jump list entries for
+ the quickfix buffer?
+- When an item in the quickfix list has a file name that does not exist,
+ behave like the item was not a match for :cnext.
+- When adding an item to a new quickfix list make ":cnext" jump to that
+ item. Make a difference being at the first item and not having used
+ :cnext at all. (Afanasiy Fet, 2017 Jan 3)
+- When opening quickfix window, disable spell checking?
+- Patch for supporting count before CR in quickfix window. (AOYAMA Shotaro,
+ 2007 Jan 1)
+- Patch from Herculano de Lima Einloft Neto for better formatting of the
+ quickfix window (2004 dec 2)
+- Amiga: When using quickfix with the Manx compiler we only get the first 25
+ errors. How do we get the rest?
+8 The quickfix file is read without conversion, thus in 'encoding'. Add an
+ option to specify the encoding of the errorfile and convert it. Also for
+ ":grep" and ":helpgrep".
+ More generic solution: support a filter (e.g., by calling a function).
+7 Add a command that goes back to the position from before jumping to the
+ first quickfix location.
+
+Vi incompatibility:
+- Try new POSIX tests, made after my comments. (Geoff Clare, 2005 April 7)
+ Version 1.5 is in ~/src/posix/1.5. (Lynne Canal)
+8 With undo/redo only marks in the changed lines should be changed. Other
+ marks should be kept. Vi keeps each mark at the same text, even when it
+ is deleted or restored. (Webb)
+ Also: A mark is lost after: make change, undo, redo and undo.
+ Example: "{d''" then "u" then "d''": deletes an extra line, because the ''
+ position is one line down. (Veselinovic)
+8 When stdin is not a tty, and Vim reads commands from it, an error should
+ make Vim exit.
+7 Unix Vim (not gvim): Typing CTRL-C in Ex mode should finish the line
+ (currently you can continue typing, but it's truncated later anyway).
+ Requires a way to make CTRL-C interrupt select() when in cooked input.
+8 When loading a file in the .exrc, Vi loads the argument anyway. Vim skips
+ loading the argument if there is a file already. When no file argument
+ given, Vi starts with an empty buffer, Vim keeps the loaded file. (Bearded)
+6 In Insert mode, when using <BS> or <Del>, don't wipe out the text, but
+ only move back the cursor. Behaves like '$' in 'cpoptions'. Use a flag
+ in 'cpoptions' to switch this on/off.
+8 When editing a file which is a symbolic link, and then opening another
+ symbolic link on the same file, Vim uses the name of the first one.
+ Adjust the file name in the buffer to the last one used? Use several file
+ names in one buffer???
+ Also: When first editing file "test", which is symlink to "test2", and
+ then editing "test2", you end up editing buffer "test" again. It's not
+ logical that the name that was first used sticks with the buffer.
+7 The ":undo" command works differently in Ex mode. Edit a file, make some
+ changes, "Q", "undo" and _all_ changes are undone, like the ":visual"
+ command was one command.
+ On the other hand, an ":undo" command in an Ex script only undoes the last
+ change (e.g., use two :append commands, then :undo).
+7 The ":map" command output overwrites the command. Perhaps it should keep
+ the ":map" when it's used without arguments?
+7 CTRL-L is not the end of a section? It is for Posix! Make it an option.
+7 Add a way to send an email for a crashed edit session. Create a file when
+ making changes (containing name of the swap file), delete it when writing
+ the file. Supply a program that can check for crashed sessions (either
+ all, for a system startup, or for one user, for in a .login file).
+7 Vi doesn't do autoindenting when input is not from a tty (in Ex mode).
+7 "z3<CR>" should still use the whole window, but only redisplay 3 lines.
+7 ":tag xx" should move the cursor to the first non-blank. Or should it go
+ to the match with the tag? Option?
+7 Implement 'autoprint'/'ap' option.
+7 Add flag in 'cpoptions' that makes <BS> after a count work like <Del>
+ (Sayre).
+7 Add flag in 'cpoptions' that makes operator (yank, filter) not move the
+ cursor, at least when cancelled. (default Vi compatible).
+7 This Vi-trick doesn't work: "Q" to go to Ex mode, then "g/pattern/visual".
+ In Vi you can edit in visual mode, and when doing "Q" you jump to the next
+ match. Nvi can do it too.
+7 Support '\' for line continuation in Ex mode for these commands: (Luebking)
+ g/./a\ g/pattern1/ s/pattern2/rep1\\
+ line 1\ line 2\\
+ line 2\ line 3\\
+ . line4/
+6 ":e /tmp/$tty" doesn't work. ":e $uid" does. Is $tty not set because of
+ the way the shell is started?
+6 Vi compatibility (optional): make "ia<CR><ESC>10." do the same strange
+ thing. (only repeat insert for the first line).
+
+
+GTK+ GUI:
+9 Crash with X command server over ssh. (Ciaran McCreesh, 2006 Feb 6)
+8 GTK 2: Combining UTF-8 characters not displayed properly in menus (Mikolaj
+ Machowski) They are displayed as separate characters. Problem in
+ creating a label?
+8 GTK 2: Combining UTF-8 characters are sometimes not drawn properly.
+ Depends on the font size, "monospace 13" has the problem. Vim seems to do
+ everything right, must be a GTK bug. Is there a way to work around it?
+9 Can't paste a Visual selection from GTK-gvim to vim in xterm or Motif gvim
+ when it is longer than 4000 characters. Works OK from gvim to gvim and
+ vim to vim. Pasting through xterm (using the shift key) also works.
+ It starts working after GTK gvim loses the selection and gains it again.
+- Gnome2: When moving the toolbar out of the dock, so that it becomes
+ floating, it can no longer be moved. Therefore making it float has been
+ blocked for now.
+- Mapping with partial match not executed properly in GTK. (Ingo Karkat,
+ #7082)
+- Add more testing of the GTK GUI.
+ - gtk_test_widget_click() can be used to simulate a click in a widget.
+- Tests failing for "make testgui" with GTK:
+ - Test_setbufvar_options()
+ - Test_exit_callback_interval()
+- When adding a timer from 'balloonexpr' it won't fire, because
+ g_main_context_iteration() doesn't return. Need to trigger an event when
+ the timer expires.
+- problem with 'L' in 'guioptions' changing the window width. (Aaron
+ Cornelius, 2012 Feb 6)
+- Patch to invert characters differently in GTK. (Yukihiro Nakadaira, 2013
+ May 5)
+- drawing a double-width combining character over single-width characters
+ doesn't look right. (Dominique Pelle, 2010 Aug 8)
+- tear-off menu does not work. (Kurt Sonnenmoser, 2010 Oct 25)
+- Patch for GTK buttons X1Mouse and X2Mouse. (Christian J. Robinson, 2010
+ Aug 9)
+- When setting 'columns' in a startup script and doing ":vertical diffsplit"
+ the window isn't redrawn properly, see two vertical bars.
+- when the Tab pages bar appears or disappears while the window is maximized
+ the window is no longer maximized. Patch that has some idea but doesn't
+ work from Geoffrey Antos, 2008 May 5. Also: the window may no longer fit
+ on the screen, thus the command line is not visible.
+- Patch to support horizontal scroll wheel in GTK. Untested. (Bjorn
+ Winckler, 2010 Jun 30)
+
+
+Win32 GUI known bugs:
+- Win32: tearoff menu window should have a scrollbar when it's taller than
+ the screen.
+8 The -P argument doesn't work very well with many MDI applications.
+ The last argument of CreateWindowEx() should be used, see MSDN docs.
+ Tutorial: http://win32assembly.online.fr/tut32.html
+6 Win32 GUI: With "-u NONE -U NONE" and doing "CTRL-W v" "CTRL-W o", the ":"
+ of ":only" is highlighted like the cursor. (Lipelis)
+8 When 'encoding' is "utf-8", should use 'guifont' for both normal and wide
+ characters to make Asian languages work. Win32 fonts contain both
+ type of characters.
+7 When font smoothing is enabled, redrawing can become very slow. The reason
+ appears to be drawing with a transparent background. Would it be possible
+ to use an opaque background in most places?
+7 The cursor color indicating IME mode doesn't work properly. (Shizhu Pan,
+ 2004 May 9)
+8 Win32: When clicking on the gvim title bar, which gives it focus, produces
+ a file-changed dialog, after clicking on a button in that dialog the gvim
+ window follows the mouse. The button-up event is lost. Only with
+ MS-Windows 98?
+ Try this: ":set sw ts", get enter-prompt, then change the file in a
+ console, go back to Vim and click "reload" in the dialog for the changed
+ file: Window moves with the cursor!
+ Put focus event in input buffer and let generic Vim code handle it?
+8 When Vim is minimized and when maximizing it a file-changed dialog pops
+ up, Vim isn't maximized. It should be done before the dialog, so that it
+ appears in the right position. (Webb)
+9 When selecting at the more-prompt or hit-enter-prompt, the right mouse
+ button doesn't give popup menu.
+ At the hit-enter prompt CTRL-Y doesn't work to copy the modeless
+ selection.
+ On the command line, don't get a popup menu for the right mouse button.
+ Let the middle button paste selected text (not the clipboard but the
+ non-Visual selection)? Otherwise CTRL-Y has to be used to copy the text.
+8 When 'grepprg' doesn't execute, the error only flashes by, the
+ user can hardly see what is wrong. (Moore)
+ Could use vimrun with an "-nowait" argument to only wait when an error
+ occurs, but "command.com" doesn't return an error code.
+8 When the 'shell' cannot be executed, should give an appropriate error msg.
+ Esp. for a filter command, currently it only complains the file could not
+ be read.
+7 At the hit-enter prompt scrolling now no longer works. Need to use the
+ keyboard to get around this. Pretend <CR> was hit when the user tries to
+ scroll?
+7 Scrollbar width doesn't change when selecting other windows appearance.
+ Also background color of Toolbar and rectangle below vert. scrollbar.
+6 Drawing text transparently doesn't seem to work (when drawing part cursor).
+8 CTRL key doesn't always work in combination with ALT key. It does work
+ for function keys, not for alphabetic characters. Perhaps this is because
+ CTRL-ALT is used by Windows as AltGr?
+8 CTRL-- doesn't work for AZERTY, because it's CTRL-[ for QWERTY. How do we
+ know which keyboard is being used?
+7 When scrolling, and a background color is dithered, the dither pattern
+ doesn't always join correctly between the scrolled area and the new drawn
+ area (Koloseike).
+8 When gui_init_font() is called with "*", p_guifont is freed while it might
+ still be used somewhere. This is too tricky, do the font selection first,
+ then set the new font by name (requires putting all logfont parameters in
+ the font name).
+- When running a fast timer, the cursor no longer blinks. Was reported:
+ cursor blinks in terminal on widows with a timer. (xtal8, #2142)
+- Last message from startup doesn't show up when there is an echoerr
+ command. (Cyril Slobin, 2009 Mar 13)
+
+
+Motif:
+6 New Motif toolbar button from Marcin Dalecki:
+ - When the mouse pointer is over an Agide button the red becomes black.
+ Something with the way colors are specified in the .xpm file.
+ - The pixmap is two pixels smaller than it should be. The gap is filled
+ with grey instead of the current toolbar background color.
+9 Can configure be changed to disable netbeans if the Xpm library is
+ required and it's missing?
+8 When using the resource "Vim*borderwidth 2" the widgets are positioned
+ wrong.
+9 XIM is disabled by default for SGI/IRIX. Fix XIM so that 'imdisable' can
+ be off by default.
+9 XIM doesn't work properly for Motif. (Yasuhiro Matsumoto) For now,
+ keep XIM active at all times when the input method has the preediting
+ flag.
+8 X11: A menu that contains an umlaut is truncated at that character.
+ Happens when the locale is "C", which uses ASCII instead of IS0-8859-1.
+ Is there a way to use latin1 by default? Gnome_init() seems to do this.
+8 Perhaps use fontsets for everything?
+6 When starting in English and switching the language to Japanese, setting
+ the locale with ":lang", 'guifontset' and "hi menu font=", deleting all
+ menus and setting them again, the menus don't use the new font. Most of
+ the tooltips work though...
+7 Motif: when using a file selection dialog, the specified file name is not
+ always used (when specifying a filter or another directory).
+8 When 'encoding' is different from the current locale (e.g., utf-8) the
+ menu strings don't work. Requires conversion from 'encoding' to the
+ current locale. Workaround: set 'langmenu'.
+
+
+Motif GUI:
+- gui_mch_browsedir() is missing, browsedir() doesn't work nicely.
+7 Use XmStringCreateLocalized() instead of XmStringCreateSimple()?
+ David Harrison says it's OK (it exists in Motif 1.2).
+8 Lesstif: When deleting a menu that's torn off, the torn off menu becomes
+ very small instead of disappearing. When closing it, Vim crashes.
+ (Phillipps)
+
+
+GUI:
+9 On Solaris, creating the popup menu causes the right mouse button no
+ longer to work for extending the selection. (Halevy)
+9 When running an external program, it can't always be killed with CTRL-C.
+ e.g., on Solaris 5.5, when using "K" (Keech). Other 'guipty' problems on
+ Solaris 2.6. (Marley)
+9 On Solaris: Using a "-geometry" argument, bigger than the window where Vim
+ is started from, causes empty lines below the cmdline. (raf)
+8 When setting 'langmenu', it should be effective immediately. Store both
+ the English and the translated text in the menu structure. Re-generate
+ the translation when 'langmenu' has changed.
+8 Basic flaw in the GUI code: NextScreen is updated before calling
+ gui_write(), but the GUI code relies on NextScreen to represent the state
+ of where it is processing the output.
+ Need better separation of Vim core and GUI code.
+8 When fontset support is enabled, setting 'guifont' to a single font
+ doesn't work.
+8 Menu priority for sub-menus for: Amiga.
+8 When translating menus ignore the part after the Tab, the shortcut. So
+ that the same menu item with a different shortcut (e.g., for the Mac) are
+ still translated.
+8 Add menu separators for Amiga.
+8 Add way to specify the file filter for the browse dialog. At least for
+ browse().
+8 Add dialog for search/replace to other GUIs? Tk has something for this,
+ use that code? Or use console dialog.
+8 When selecting a font with the font dialog and the font is invalid, the
+ error message disappears too quick.
+7 More features in the find/replace dialog:
+ - regexp on/off
+ - search in selection/buffer/all buffers/directory
+ when all buffers/directory is used:
+ - filter for file name
+ when directory is used:
+ - subdirectory on/off
+ - top directory browser
+8 gui_check_colors() is not called at the right moment. Do it much later,
+ to avoid problems.
+8 gui_update_cursor() is called for a cursor shape change, even when there
+ are mappings to be processed. Only do something when going to wait for
+ input. Or maybe every 100 ms?
+8 X11: When the window size is reduced to fit on screen, there are blank
+ lines below the text and bottom scrollbar. "gvim -geometry 80x78+0+0".
+ When the "+0+0" is omitted it works.
+8 When starting an external command, and 'guipty' set, BS and DEL are mixed
+ up. Set erase character somehow?
+8 The compose key doesn't work properly (Cepas). Both for Win32 and X11.
+7 The cursor in an inactive window should be hollow. Currently it's not
+ visible.
+7 GUI on Solaris 2.5.1, using /usr/dt/..: When gvim starts, cursor is
+ hollow, after window lowered/raised it's OK. (Godfrey)
+7 When starting GUI with ":gui", and window is made smaller because it
+ doesn't fit on the screen, there is an extra redraw.
+8 When setting font with .Xdefaults, there is an extra empty line at the
+ bottom, which disappears when using ":set guifont=<Tab>". (Chadzelek)
+8 When font shape changes, but not the size, doing ":set font=" does not
+ redraw the screen with the new font. Also for Win32.
+ When the size changes, on Solaris 2.5 there isn't a redraw for the
+ remaining part of the window (Phillipps).
+- Flashes really badly in certain cases when running remotely from a Sun.
+4 Re-write the code so that the highlighting isn't changed multiple times
+ when doing a ":hi clear". The color changes happen three or more times
+ currently. This is very obvious on a 66Mhz 486.
+
+
+Win32 console:
+8 Should $USERPROFILE be preferred above $HOMEDRIVE/$HOMEPATH? No, but it's
+ a good fallback, thus use:
+ $HOME
+ $HOMEDRIVE$HOMEPATH
+ SHGetSpecialFolderPath(NULL, lpzsPath, CSIDL_APPDATA, FALSE);
+ $USERPROFILE
+ SHGetSpecialFolderPath(NULL, lpzsPath, CSIDL_COMMON_APPDATA, FALSE);
+ $ALLUSERSPROFILE
+ $SYSTEMDRIVE\
+ C:\
+8 Win32 console: <M-Up> and <M-Down> don't work. (Geddes) We don't have
+ special keys for these. Should use modifier + key.
+8 Win32 console: caps-lock makes non-alpha keys work like with shift.
+ Should work like in the GUI version.
+8 Environment variables in DOS are not case sensitive. Make a define for
+ STRCMP_ENV(), and use it when comparing environment var names.
+8 Setting 'shellslash' has no immediate effect. Change all file names when
+ it is set/reset? Or only use it when actually executing a shell command?
+8 When editing a file on a Samba server, case might matter. ":e file"
+ followed by ":e FILE" will edit "file" again, even though "FILE" might be
+ another one. Set last used name in buflist_new()? Fix do_ecmd(), etc.
+8 When a buffer is editing a file like "ftp://mach/file", which is not going
+ to be used like a normal file name, don't change the slashes to
+ backslashes. (Ronald Hoellwarth)
+
+
+Win32 console:
+9 When editing a file by its short file name, it should be expanded into its
+ long file name, to avoid problems like these: (Mccollister)
+ 1) Create a file called ".bashrc" using some other editor.
+ 2) Drag that file onto a shortcut or the actual executable.
+ 3) Note that the file name is something like BASHRC~1
+ 4) Go to File->Save As menu item and type ".bashrc" as the file name.
+ 5) Press "Yes" to indicate that I want to overwrite the file.
+ 6) Note that the message "File exists (add ! to override)" is displayed
+ and the file is not saved.
+ Use FindFirstFile() to expand a file name and directory in the path to its
+ long name.
+8 Also implement 'conskey' option for the Win32 console version? Look at
+ how Xvi does console I/O under Windows NT.
+7 Re-install the use of $TERM and support the use of different terminals,
+ besides the console.
+8 Use of <altgr> modifier doesn't work? 5.3 was OK. (Garcia-Suarez/Guckes)
+9 Mapping <C-S-Tab> doesn't work correctly. How to see the difference with
+ <C-S-i>?
+9 tmpnam() uses file in root of file system: "\asdf". That doesn't work on
+ a Netware network drive. Use same function as for Win32 GUI?
+8 In os_win32.h, HAVE_STRICMP and HAVE_STRNICMP are defined only if __GNUC__
+ is not defined. Shouldn't that be the other way around?
+
+
+Amiga:
+8 In mch_inchar() should use convert_input_safe() to handle incomplete byte
+ sequences.
+9 In mch_expandpath() a "*" is to be expanded, but "\*" isn't. Remove
+ backslashes in result.
+8 Executing a shell, only one option for 'shell' is separated. Should do
+ all options, using white space separation.
+
+
+Macintosh:
+- GUI: gui_mch_browsedir() is missing.
+7 Loading the Perl library only works on OS/X 10.2 or 10.3, never on both.
+ Load the Perl library dynamically see Python sources file dynload_mac
+ (Jack)
+ dynamic linking: http://developer.apple.com/technotes/tn2002/tn2064.html
+8 inputdialog() doesn't resize when giving more text lines. (David Fishburn,
+ 2006 Sept 28)
+8 Define vim_mkdir() for Macintosh.
+8 Define mch_writable() for Macintosh.
+9 When DiskLock is running, using a swap file causes a crash. Appears to be
+ a problem with writing a file that starts with a dot. (Giacalone)
+9 In mac_expandpath() check that handling of backslashes is done properly.
+- Build problem with small features on Mac OS X 10.6. (Rainer, 2011 Jan 24)
+- Version of netbeans.c for use with MacVim. (Kazuki Sakamoto, 2010 Nov 18)
+- Mac with X11: clipboard doesn't work properly. (Raf, 2010 Aug 16)
+- Move Carbon todo items to os_mac.txt. Note that this version is frozen,
+ try the Cocoa version.
+- After a ":vsplit" the left scrollbar doesn't appear until 'columns' is
+ changed or the window is resized.
+- Patch for configure: remove arch from ruby link args. (Knezevic, 2008 Mar
+ 5) Alternative: Kazuki Sakamoto, Mar 7.
+- trouble compiling with Motif, requires --disable-darwin. (Raf, 2008 Aug 1)
+ Reply by Ben Schmidt.
+- Using gvim: netrw window disappears. (Nick Lo, 2006 Jun 21)
+
+
+"Small" problems:
+- When using e_secure in do_one_cmd() mention the command being executed,
+ otherwise it's not clear where it comes from.
+9 For Turkish vim_tolower() and vim_toupper() also need to use utf_
+ functions for characters below 0x80. (Sertacyildiz)
+9 When the last edited file is a help file, using '0 in a new Vim doesn't
+ edit the file as a help file. 'filetype' is OK, but 'iskeyword' isn't,
+ file isn't readonly, etc.
+8 When an ":edit" is inside a try command and the ATTENTION prompt is used,
+ the :catch commands are always executed, also when the file is edited
+ normally. Should reset did_emsg and undo side effects. Also make sure
+ the ATTENTION message shows up. Servatius Brandt works on this.
+7 Vimtutor leaves escape sequence in terminal. This is the xterm response to
+ requesting the version number. (Yasuhiro Matsumoto)
+8 When redirecting and using ":silent" the current column for displaying and
+ redirection can be different. Use a separate variable to hold the column
+ for redirection.
+7 The messages for "vim --help" and "vim --version" don't use
+ 'termencoding'.
+- Could the hit-enter prompt be avoided when a message only overlaps the
+ 'showcmd' area? Clear that area when the next cmd is typed.
+8 When 'scrollbind' is set, a window won't scroll horizontally if the cursor
+ line is too short. Add a word in 'scrollopt' to allow moving the cursor
+ to longer line that is visible. A similar thing is done for the GUI when
+ using the horizontal scrollbar.
+8 When giving a ":bwipeout" command a file-changed dialog may popup for this
+ buffer, which is pointless. (Mike Williams)
+8 On MS-Windows ":make" doesn't show output while it is working. Use the
+ tee.exe from http://unxutils.sourceforge.net/ ? About 16 Kbyte in the
+ UnxUtils.zip archive.
+ Is it better than what we have in src/tee?
+8 When doing Insert mode completion a mapping cannot recursively call
+ edit(), because the completion information is global. Put everything in
+ an allocated structure?
+7 mb_off2cells() doesn't work correctly on the tail byte of a double-byte
+ character. (Yasuhiro Matsumoto) It should return 1 when used on a tail
+ byte, like for utf-8. Store second byte of double-byte in ScreenLines2[]
+ (like for DBCS_JPNU) and put a zero in the second byte (like for UTF-8).
+7 Inside a function with "perl <<EOF" a line with "$i++" is recognized as an
+ ":insert" command, causing the following "endfunction" not to be found.
+ Add skipping this perl construction inside function definitions.
+7 When 'ttimeoutlen' is 10 and 'timeoutlen' is 1000, there is a keycode
+ "<Esc>a" and a mapping <Esc>x", when typing "<Esc>a" with half a second
+ delay should not be interpreted as a keycode. (Hans Ginzel)
+7 ":botright 1 new" twice causes all window heights to be changed. Make the
+ bottom window only bigger as much as needed.
+7 The Cygwin and MingW makefiles define "PC", but it's not used anywhere.
+ Remove? (Dan Sharp)
+9 User commands use the context of the script they were defined in. This
+ causes a "s:var" argument to unexpectedly use a variable in the defining
+ script, not the calling script. Add an argument to ":command":
+ "-keepcontext". Do replace <SID>, so that a function in the defining
+ script can be called.
+8 The Japanese message translations for MS-Windows are called ja.sjis.po,
+ but they use encoding cp932. Rename the file and check that it still
+ works.
+8 A very long message in confirm() can't be quit. Make this possible with
+ CTRL-C.
+8 "gf" always excludes trailing punctuation characters. file_name_in_line()
+ is currently fixed to use ".,:;!". Add an option to make this
+ configurable?
+8 'hkmap' should probably be global-local.
+8 Using ":s" in a function changes the previous replacement string. Save
+ "old_sub" in save_search_patterns()?
+8 Should allow multibyte characters for the delimiter: ":s+a+b+" where "+"
+ is a multibyte character.
+8 When appending to a file and 'patchmode' isn't empty, a backup file is
+ always written, even when the original file already exists.
+9 When getting focus while writing a large file, could warn for this file
+ being changed outside of Vim. Avoid checking this while the file is being
+ written.
+7 The message in bt_dontwrite_msg() could be clearer.
+8 The script ID that is stored with an option and displayed with ":verbose
+ set" isn't reset when the option is set internally. For example when
+ 'foldlevel' is set from 'foldlevelstart'.
+8 Also store the line number with the script ID and use it for ":verbose",
+ so that "set nocompatible" is found when it changes other option values.
+ When an option is set indirectly mention the command? E.g. when
+ ":diffsplit" sets 'foldmethod'.
+8 In the fileformat dialog, "Cancel" isn't translated. Add a global
+ variable for this. (Eduardo Fernandez)
+9 When editing a file with 'readonly' set, there is no check for an existing
+ swap file. Then using ":write" (without making any changes) doesn't give
+ a warning either. Should check for an existing swap file without creating
+ one. Unfinished patch by Ian Kelling, 2008 July 14.
+7 When 'showbreak' is set, the amount of space a Tab occupies changes.
+ Should work like 'showbreak' is inserted without changing the Tabs.
+7 When 'mousefocus' is set and switching to another window with a typed
+ command, the mouse pointer may be moved to a part of the window that's
+ covered by another window and we lose focus. Only move in the y
+ direction, not horizontally?
+8 ":hardcopy":
+ - Using the cterm_color[] table is wrong when t_colors is > 16.
+ - Need to handle unprintable characters.
+ - Win32: On a B&W printer syntax highlighting isn't visible. Perform
+ dithering to make grey text?
+ - Add a flag in 'printoptions' to add an empty page to make the total
+ number even. "addempty"? (Mike Williams)
+ - Respect 'linebreak'. Perhaps also 'showbreak'?
+ - Should interpret CTRL-L as a page break.
+ - Grey line numbers are not always readable. Add field in 'printoptions'.
+ Default to black when no syntax highlighting.
+ - Be able to print a window in diff mode.
+ - Be able to specify a colorscheme to use for printing. And a separate
+ one for B&W printing (if that can be detected).
+8 When 'virtualedit' is "block,insert" and encoding is "utf-8", selecting a
+ block of one double-wide character, then "d" deletes only half of it.
+8 When 'virtualedit' is set, should "I" in blockwise visual mode also insert
+ in lines that don't extend into the block?
+8 With 'virtualedit' set, in Insert mode just after the end of line, CTRL-O
+ yh does not yank the last character of the line. (Pavel Papushev)
+ Doing "hl" first appears to make it work.
+8 With 'virtualedit' set it's possible to move into the blank area from
+ 'linebreak'.
+8 With 'virtualedit' set and 'selection' "exclusive", a Visual selection
+ that ends in or after a tab, "d" doesn't delete (part of) the tab.
+ (Helmut Stiegler)
+9 When jumping to a tag, the search pattern is put in the history. When
+ 'magic' is on, the pattern may not work. Translate the pattern depending
+ on p_magic when putting it in the history? Alternative: Store value of
+ 'magic' in history. (Margo)
+9 optwin.vim: Restoring a mapping for <Space> or <CR> is not correct for
+ ":noremap". Add "mapcmd({string}, {mode})? Use code from ":mkexrc".
+9 term_console is used before it is set (msdos, Amiga).
+9 Get out-of-memory for ":g/^/,$s//@/" on 1000 lines, this is not handled
+ correctly. Get many error messages while redrawing the screen, which
+ cause another redraw, etc.
+8 [<C-I> doesn't work when '*' is in 'iskeyword'. find_pattern_in_path()
+ must escape special characters in the pattern.
+8 Vim can overwrite a read-only file with ":w!". ":w" can't overwrite an
+ existing file, "w!" can, but perhaps not a read-only file? Then use
+ ":w!!" for that.
+ Or ask for permission to overwrite it (if file can be made writable) and
+ restore file to readonly afterwards.
+ Overwriting a file for which a swap file exists is similar issue.
+7 When compiled with "xterm_clipboard", startup can be slower and might get
+ error message for invalid $DISPLAY. Try connecting to the X server in the
+ background (forked), so that Vim starts up quicker? Connect as soon as
+ the clipboard is to be used (Visual select mode starts, paste from
+ clipboard)
+7 X11: Some people prefer to use CLIPBOARD instead of PRIMARY for the normal
+ selection. Add an "xclipboard" argument to the 'clipboard' option? (Mark
+ Waggoner)
+6 When the xterm reports the number of colors, a redraw occurs. This is
+ annoying on a slow connection. Wait for the xterm to report the number of
+ colors before drawing the screen. With a timeout.
+8 When the builtin xterm termcap contains codes that are not wanted, need a
+ way to avoid using the builtin termcap.
+8 Xterm sends ^[[H for <Home> and ^[[F for <End> in some mode. Also
+ recognize these keys? Mostly useful for xterm simulators, like gnometerm.
+ See http://dickey.his.com/xterm/xterm.faq.html#xterm_pc_style.
+8 '[ and '] should be set to start/end of line when using a linewise operator
+ (e.g., ":w").
+8 CTRL-A can't handle big "long" numbers, they become negative. Check for
+ "-" character, if not present, use unsigned long.
+8 Add suspending with CTRL-Z at the "more" prompt, and when executing a long
+ script in do_cmdline().
+8 When using 'hidden', many swap files will be open. When Vim runs into the
+ maximum number of open files, error messages will appear. Detect that
+ this problem is present, and close any hidden files that don't have
+ changes.
+8 Core dump within signal function: gdb doesn't show stack backtrace! Option
+ to skip catch_signals()?
+9 Repeating a "cw" with "." doesn't work if the text was pasted from the
+ clipboard. (Thomas Jones) It's because the menu/toolbar item exits Insert
+ mode and uses "gP". How to fix this without breaking inserting a block of
+ text?
+8 In Replace mode pasting from the clipboard (using menu or toolbar) inserts
+ all the text. Add ":rmenu"?
+8 Pasting with the mouse in Replace mode inserts the text, instead of
+ overwriting, when it is more than one line. Same for using <C-R>.
+9 CTRL-E and CTRL-Y don't work in small window when 'so' is 4 and lines are
+ wrapping (Acevedo/in.226). E.g., when using CTRL-E, window height 7,
+ window might actually scroll down when last line of buffer is displayed.
+ --> Remember if the previous command was "cursor follows screen" or
+ "screen follow cursor" and use this in cursupdate().
+7 tilde_replace() can only handle "~/", should also do "~user/".
+ Get the list of home directories (from /etc/passwd? Use getpwent()) and
+ use some clever algorithm to match a path with that. Find common strings
+ in the list?
+8 When dragging status line with mouse, sometimes a jump when first clicking
+ on the status line (caused by 'winheight'). Select window on button up,
+ instead of on button down.
+8 Dragging the status line doesn't scroll but redraw.
+8 When performing incremental search, should abort searching as soon as a
+ character is typed.
+8 When the value of $MAKE contains a path, configure can't handle this.
+ It's an autoconf bug. Remove the path from $MAKE to work around it.
+8 How to set VIMRC_FILE to \"something\" for configure? Why does this not
+ work: CFLAGS='-DVIMRC_FILE=\"/mydir/myfile\"' ./configure
+8 The temporary file is sometimes not writable. Check for this, and use an
+ alternate name when it isn't. Or add the 'temptemplate' option: template
+ for the temp file name ":set temptemplate=/usr/tmp/?????.tmp".
+ Also: Win32 version uses Windows temp directory, which might not work for
+ cygwin bash.
+7 Get error "*, \+ or \( operand could be empty" for pattern "\(.\)\1\{3}".
+ Remember flags for backreferences.
+7 When switching to Daylight Saving Time, Vim complains that a file has been
+ changed since last read. Can we use a function that uses GMT?
+7 When completing an environment variable after a '$', check for file names
+ that contain a '$' after all have been found.
+8 When "cm" termcap entry is missing, starting gvim shouldn't complain about
+ it. (Lohner) Try out with "vt100" entry, cm replaced with cX.
+7 When an include file starts with "../", the check for already visiting
+ this file doesn't work. Need to simplify the file name.
+7 The names and comments for the arguments of do_browse() are confusing.
+ "dflt" isn't the default file name when "initdir" is not NULL and
+ "initdir" is the default path to be used.
+7 When 'scrolloff' is exactly half the window height, "j" causes a scroll of
+ two lines at a time. "k" doesn't do this. (Cory T. Echols)
+
+
+I can't reproduce these (if you can, let me know how!):
+9 NT 4.0 on NTFS file system: Editing ".bashrc" (drag and drop), file
+ disappears. Editing ".xyz" is OK. Also, drag&drop only works for three
+ files. (McCollister)
+
+
+Problems that will (probably) not be solved:
+- GTK: when using the popup menu with spelling suggestions and releasing the
+ right mouse button before the menu appears selecting an item with the
+ right mouse button has no effect. GTK does not produce an event for this.
+- GTK 2: Cannot use the file selector. When using it many things become
+ slow. This is caused by some code in GTK that writes
+ ~/.recently-used.xbel every time an event is handled. It assumes the main
+ loop is never quit, which is a wrong assumption. Also, it overwrites the
+ file with different file permissions, which is a privacy issue. This
+ needs to be fixed in GTK. A solution in Vim would be really complicated.
+ (2008 Jul 31) This appears to be fixed in Vim 7.3.
+- xterm title: The following scenario may occur (esp. when running the Vim
+ test script): Vim 1 sets the title to "file1", then restores the title to
+ "xterm" with an ESC sequence when exiting. Vim 2 obtains the old title
+ with an X library call, this may result in "file1", because the window
+ manager hasn't processed the "xterm" title yet. Can apparently only be
+ worked around with a delay.
+- In a terminal with 'mouse' set such that the mouse is active when entering
+ a command line, after executing a shell command that scrolls up the
+ display and then pressing ":": Selecting text with the mouse works like
+ the display wasn't scrolled. Vim doesn't know how much the external
+ command scrolled up the display. Use Shift to select text.
+- X windows: When $DISPLAY points to a X server where there is no access
+ permission, trying to connect to the X server causes an error message.
+ XtOpenDisplay() prints this directly, there is no way to avoid it.
+- X windows: Setting 'guifontset' to an illegal value sometimes crashes Vim.
+ This is caused by a fault in a X library function, can't be solved in Vim.
+- Win32 tcl: has("tcl") hangs when the tcl84.dll is from cygwin.
+- Motif: When adding a menu item "Find this &Symbol", the "s" in "this" will
+ be underlined, instead of in "Symbol". Motif doesn't let us specify which
+ character gets the highlighting.
+- Moving the cursor removes color in color-xterm. This is a color-xterm
+ problem! color-xterm ver. 6.1 beta 3 and later work properly.
+- In zsh, "gvim&" changes the terminal settings. This is a zsh problem.
+ (Jennings)
+- Problem with HPterm under X: old contents of window is lost (Cosentino).
+- Amiga: The ":cq" command does not always abort the Manx compiler. Why?
+- Linux: A file with protection r--rw-rw- is seen readonly for others. The
+ access() function in GNU libc is probably wrong.
+- When doing a CTRL-Z and typing a command for the shell, while Vim is busy
+ (e.g. writing a file), the command for the shell is sometimes eaten by Vim,
+ because the terminal mode is changed from RAW to CBREAK.
+- An old version of GNU tgoto can't handle the terminfo code for "AF". The
+ "%p1" is interpreted as "%p" and "1", causing color not to be working.
+ Fix: Change the "%p1" in the "AF" and "AB" terminfo entries to "%p".
+ (Benzinger).
+- When running an external command from the GUI, typeahead is going to that
+ program, not to Vim. It looks like the shell eats the characters, Vim
+ can't get back what the external command didn't use.
+- Win32 GUI: Error code from external command not returned in shell_error.
+ It appears that cmd.exe and command.com don't return an error code.
+- Win32 GUI: The Toolbar is a bit too high when the flat style is being
+ used. We don't have control over the height of the Toolbar.
+- Win32: All files created on the day of switching from winter to summer
+ time cause "changed since editing started" messages. It goes away when
+ the file is written again the next day, or the timezone is adjusted.
+ DJGPP version is OK. (Zaimi) Looks like a problem with the Win32 library.
+ Rebooting doesn't help. Time stamps look OK in directory. (Penn)
+ Is this on FAT (stores wall clock time) or NTFS (stores UTS)?
+- Win32, MS-Windows XP: $HOME uses the wrong drive when the user profiles
+ are not on the boot disk. This is caused by a wrong value of $HOMEDRIVE.
+ This is a bug in XP, see MSKB article 818134.
+- Win32, MS-Windows: expanding plugin/**/*.vim also picks up
+ dir/ctags.vim,v. This is because the short file name is something like
+ "ctags~1.vim" and that matches the pattern.
+- SunOS 5.5.1 with Motif: The file open dialog does not have a horizontal
+ scroll bar for the "files" selection. This is a problem in the Motif
+ libraries, get a patch from Sun.
+- Solaris 2.6 with GTK and Perl: gvim crashes when started. Problem with X
+ input method called from GDK code. Without Perl it doesn't crash.
+- VMS: Vimdiff doesn't work with the VMS diff, because the output looks
+ different. This makes test 47 fail. Install a Unix-compatible diff.
+- GTK with Gnome: Produces an error message when starting up:
+ Gdk-WARNING **: locale not supported by C library
+ This is caused by the gnome library gnome_init() setting $LC_CTYPE to
+ "en_US". Not all systems support this locale name, thus causing the
+ error. Hopefully a newer version of GTK/Gnome fixes this problem.
+- GTK 2: With this mapping the hit-enter prompt is _sometimes_ below the
+ screen, at other times there is a grey area below the command line:
+ :nmap <F11> :if &guioptions=~'m' \| set guioptions-=m \| else \| set guioptions+=m \| endif<cr>
+- GTK: When pasting a selection from Vim to xclipboard gvim crashes with a
+ ABRT signal. Probably an error in the file gdkselection.c, the assert
+ always fails when XmbTextListToTextProperty() fails. (Tom Allard)
+- GTK 2: gives an assertion error for every non-builtin icon in the toolbar.
+ This is a GTK 2.4.x bug, fixed in GTK 2.4.2. (Thomas de Grenier de Latour)
+- When using an xterm that supports the termresponse feature, and the 't_Co'
+ termcap option was wrong when Vim started, it will be corrected when the
+ termresponse is received. Since the number of colors changes, the
+ highlighting needs to be initialized again. This may cause colors defined
+ in the vimrc file to be lost.
+- On Windows NT 4.0 the number of files passed to Vim with drag&drop and
+ "Edit with Vim" is limited. The maximum command line length is 255 chars.
+
+--------------------- extensions and improvements ----------------------
+ *extensions-improvements*
+
+Most interesting new features to be added when all bugs have been fixed:
+- Using ":exe edit fname" has escaping problems. Use ":edit ++(fname)".
+ Thus use "++=" to give arguments as expressions, comma-separated as if
+ calling a function.
+ With options: ":edit ++(['!', '++enc=abc'], ['+/pat'], fname)".
+ Alternative: Make a function for Ex commands: cmd_edit().
+- Add COLUMN NUMBERS to ":" commands ":line1,line2[col1,col2]cmd". Block
+ can be selected with CTRL-V. Allow '$' (end of line) for col2.
+ (issue #3292)
+- ECLIPSE plugin. Problem is: the interface is very complicated. Need to
+ implement part in Java and then connect to Vim. Some hints from Alexandru
+ Roman, 2004 Dec 15. Should then also work with Oracle Jdeveloper, see JSR
+ 198 standard http://www.jcp.org/en/jsr/detail?id=198.
+ Eclim does it: http://eclim.sourceforge.net/ (Eric Van Dewoestine)
+ Plugin that uses a terminal emulator: http://vimplugin.sf.net
+ And another one: http://www.satokar.com/viplugin/index.php
+- STICKY CURSOR: Add a way of scrolling that leaves the cursor where it is.
+ Especially when using the scrollbar. Typing a cursor-movement command
+ scrolls back to where the cursor is.
+- Scroll commands by screen line. g CTRL-E and g CTRL-Y ? Requires the
+ first line to be able to start halfway.
+8 Add a command to jump to a certain kind of tag. Allow the user to specify
+ values for the optional fields. E.g., ":tag size type=m".
+ Also allow specifying the file and command, so that the result of
+ taglist() can be used.
+- X11: Make it possible to run Vim inside a window of another program.
+ This can be done with XReparentWindow(). But how exactly?
+
+
+Documentation:
+8 List of Vim runtime directories. dotvim.txt from Charles Campbell, 2007
+ Feb 20.
+8 The GUI help should explain the Find and Find/Replace dialogs. Add a link
+ to it from ":promptrepl" and ":promptfind".
+8 List of options should mention whether environment variables are expanded
+ or not.
+8 Extend usr_27.txt a bit. (Adam Seyfarth)
+9 Make the Reference Manual more precise. For each command mention:
+ - change to cursor position and curswant
+ - if it can be undone (u/CTRL-R) and redone (.)
+ - how it works for folded lines
+ - how it works with multibyte characters
+8 Spread the windows commands over the other files. For example, ":stag"
+ should be with ":tag". Cross-link with tags to avoid too much double
+ text.
+8 Add tags for all features, e.g. "gui_running".
+7 MS-Windows: When a wrong command is typed with an ALT key, give a hint to
+ look at the help for 'winaltkeys'.
+7 Add a help.vim plugin that maps <Tab> to jump to the next tag in || and
+ <C-Tab> (and <S-Tab>) to the previous tag.
+ Patch by Balazs Kezes, 2007 Dec 30. Remark from A. Politz.
+- Check text editor compendium for vi and Vim remarks.
+
+
+Help:
+- First try using the ":help" argument literally, before using it as a
+ pattern. And then match it as part of a tag.
+- When a help item has multiple matches make it possible to use ":tn" to go
+ to the other matches.
+- Support a way to view (and edit) .info files.
+- Implement a "sticky" help window, some help text lines that are always
+ displayed in a window with fixed height. (Guckes) Use "~/.vimhelp" file,
+ user can edit it to insert favorite commands, new account can contain a
+ default contents.
+- Make 'winminheight' a local option, so that the user can set a minimal
+ height for the help window (and other windows).
+- ":help :s^I" should expand to ":help :substitute".
+- Make the help key (<F1>) context sensitive?
+- Learn mode: show short help while typing commands.
+
+
+User Friendlier:
+8 Windows install with install.exe: Use .exe instead of .bat files for
+ links, so that command line arguments are passed on unmodified? (Walter
+ Briscoe)
+8 Windows install: Be able to associate Vim with a selection of file types?
+8 Windows uninstall: Have uninstal.c delete the vimfiles directories that
+ dosinst.c creates. List the contents of the directory (recursively) if
+ the user asks for it. Requires an implementation of "rm -rf".
+8 Remember the name of the vimrc file that was used (~/.vimrc, $VIM/_vimrc,
+ $HOME/_vimrc, etc.) and add "edit vimrc" to the File menu.
+- Add a way to save local settings and mappings into a new plugin file.
+ ":mkplugin <file>"?
+- Add mappings local to a window: ":map <window> ..." #9339
+9 Add buffer-local menu. Should offer a choice between removing the menu or
+ disabling it. Be careful that tear-offs don't disappear (keep one empty
+ item?).
+ Alternative: use BufEnter and BufLeave autocommands.
+8 make a vimtutor script for Amiga and other systems.
+7 When Vim detects a file is being edited elsewhere and it's a gvim session
+ of the same user it should offer a "Raise" button, so that the other gvim
+ window can be displayed. (Eduard)
+8 Support saving and restoring session for X windows? It should work to do
+ ":mksession" and use "-S fname" for the restart command. The
+ gui_x11_wm_protocol_handler() already takes care of the rest.
+ global_event_filter() for GTK.
+
+
+Tab pages:
+9 GUI implementation for the tab pages line for other systems.
+7 GUI: Control over the appearance of the text in the labels (bold, color,
+ font, etc.)
+8 Make GUI menu in tab pages line configurable. Like the popup menu.
+8 balloons for the tab page labels that are shortened to show the full path.
+7 :tabdup duplicate the tab with all its windows.
+7 Option to put tab line at the left or right? Need an option to specify
+ its width. It's like a separate window with ":tabs" output.
+8 Add local options for each tab page? E.g., 'diffopt' could differ between
+ tab pages.
+7 Add local highlighting for each tab page?
+
+
+Spell checking:
+- Support more regions? Caolan McNamara argues it's needed for es_XX.
+ https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=219777
+- Unicode defines another quote character: 0x2019. Use it as an equivalent
+ of a single quote, thus use it as a word character like a quote and match
+ with words, replacing the curly quote with a single quote.
+- Could filter &eacute; things for HTML before doing spell checking.
+ Similarly for TeX.
+- The Hungarian spell file uses four extra characters in the FOL/UPP/LOW
+ items than other spell files with the ISO-8859-2 encoding, that causes
+ problem when changing 'spelllang'. There is no obvious way to fix this.
+- Considering Hunspell 1.1.4:
+ What does MAXNGRAMSUGS do?
+ Is COMPLEXPREFIXES necessary when we have flags for affixes?
+- There is no Finnish spell checking file. For openoffice Voikko is now
+ used, which is based on Malaga: http://home.arcor.de/bjoern-beutel/malaga/
+ (Teemu Likonen)
+8 ":mkspell" still takes much too long in Hungarian dictionary from
+ hunspell. Only solution appears to be to postpone secondary suffixes.
+8 Handle postponed prefix with COMPOUNDPERMITFLAG or COMPOUNDFORBIDFLAG.
+ WFP_COMPPERMIT and WFP_COMPFORBID
+8 implement use of <compoptions> in .spl file:
+ implement CHECKCOMPOUNDREP: when a compound word seems to be OK apply REP
+ items and check if the result is a valid word.
+ implement CHECKCOMPOUNDDUP
+ implement CHECKCOMPOUNDTRIPLE
+ Add CHECKCOMPOUNDCASE: when compounding make leading capital lower case.
+ How is it supposed to work?
+- Add a command the repeats ]s and z=, showing the misspelled word in its
+ context. Thus to spell-check a whole file.
+- suggestion for "KG" to "kg" when it's keepcase.
+- For flags on affixes: Use a "AFFCOMPSET" flag; means the compound flags of
+ the word are not used.
+- Support breakpoint character ? 0xb7 and ignore it? Makes it possible to
+ use same wordlist for hyphenation.
+- Compound word is accepted if nr of words is <= COMPOUNDWORDMAX OR nr of
+ syllables <= COMPOUNDSYLMAX. Specify using AND in the affix file?
+- NEEDCOMPOUND also used for affix? Or is this called ONLYINCOMPOUND now?
+ Or is ONLYINCOMPOUND only for inside a compound, not at start or end?
+- Do we need a flag for the rule that when compounding is done the following
+ word doesn't have a capital after a word character, even for Onecap words?
+- New hunspell home page: http://hunspell.sourceforge.net/
+ - Version 1.1.0 is out now, look into that.
+ - Lots of code depends on LANG, that isn't right. Enable each mechanism
+ in the affix file separately.
+ - Example with compounding dash is bad, gets in the way of setting
+ COMPOUNDMIN and COMPOUNDWORDMAX to a reasonable value.
+ - PSEUDOROOT == NEEDAFFIX
+ - COMPOUNDROOT -> COMPOUNDED? For a word that already is a compound word
+ Or use COMPOUNDED2, COMPOUNDED3, etc.
+- CIRCUMFIX: when a word uses a prefix marked with the CIRCUMFIX flag, then
+ the word must also have a suffix marked with the CIRCUMFIX flag. It's a
+ bit primitive, since only one flag is used, which doesn't allow matching
+ specific prefixes with suffixes.
+ Alternative:
+ PSFX {flag} {pchop} {padd} {pcond} {schop} {sadd}[/flags] {scond}
+ We might not need this at all, you can use the NEEDAFFIX flag and the
+ affix which is required.
+- When a suffix has more than one syllable, it may count as a word for
+ COMPOUNDWORDMAX.
+- Add flags to count extra syllables in a word. SYLLABLEADD1 SYLLABLEADD2,
+ etc.? Or make it possible to specify the syllable count of a word
+ directly, e.g., after another slash: /abc/3
+- MORPHO item in affix file: ignore TAB and morphological field after
+ word/flags and affix.
+- Implement multiple flags for compound words and CMP item?
+ Await comments from other spell checking authors.
+- Also see tklspell: http://tkltrans.sourceforge.net/
+8 Charles Campbell asks for method to add "contained" groups to existing
+ syntax items (to add @Spell).
+ Add ":syntax contains {pattern} add=@Spell" command? A bit like ":syn
+ cluster" but change the contains list directly for matching syntax items.
+- References: MySpell library (in OpenOffice.org).
+ http://spellchecker.mozdev.org/source.html
+ http://whiteboard.openoffice.org/source/browse/whiteboard/lingucomponent/source/spellcheck/myspell/
+ author: Kevin Hendricks <kevin.hendricks@sympatico.ca>
+8 It is currently not possible to mark "can not" as rare, because "can" and
+ "not" are good words. Find a way to let "rare" overrule "good"?
+8 Make "en-rare" spell file? Ask Charles Campbell.
+8 The English dictionaries for different regions are not consistent in their
+ use of words with a dash.
+7 Insert mode completion mechanism that uses the spell word lists.
+8 Add hl groups to 'spelllang'?
+ :set spelllang=en_us,en-rare/SpellRare,en-math/SpellMath
+ More complicated: Regions with different languages? E.g., comments
+ in English, strings in German (po file).
+
+
+Diff mode:
+9 When making small changes, e.g. deleting a character, update the diff.
+ Possibly without running diff.
+8 Also show difference with the file when editing started? Should show what
+ can be undone. (Tom Popovich)
+
+Folding:
+ (commands still available: zI zJ zK zp zP zq zQ zV zy zY;
+ secondary: zB zS zT zZ, z=)
+- Patch to make closed folds line up. (Charles Campbell, 2014 Sep 12)
+ Remark from Roland Eggner: does it cause crashes? (2014 Dec 12)
+ Updated patch by Roland Eggner, Dec 16
+ Updated patch from Charles, 2016 Jul 2
+- Patch to make fold updates much faster. (Christian Brabandt, 2012 Dec)
+- Patch to have the fold and sign column and at the last line of the buffer.
+ (Marco Hinz, 2014 Sep 25)
+ Alternate suggestion: let all columns continue, also the number column.
+- Patch to add FoldedLineNr highlighting: different highlighting for the
+ line number of a closed fold. (eXerigumo Clanjor, 2013 Jul 15)
+- Patch to use 'foldnestmax' also for "marker" foldmethod. (Arnaud Lacombe,
+ 2011 Jan 7)
+- 'foldcolumn' in modeline applied to wrong window when using a session.
+ (Teemu Likonen, March 19)
+- With foldmethod=syntax and nofoldenable comment highlighting isn't
+ removed. (Marcin Szewczyk, 2017 Apr 26)
+- The ":move" command does not honor closed folds. (Ryan Lue, #2351)
+- When completion inserts the first match, it may trigger the line to be
+ folded. Disable updating folds while completion is active? (Peter Odding,
+ 2010 Jun 9)
+- When 'foldmethod' is "indent", adding an empty line below a fold and then
+ indented text, creates a new fold instead of joining it with the previous
+ one. (Evan Laforge, 2009 Oct 17)
+- Add ":nofold". Range will apply without expanding to closed fold.
+8 Vertical folds: looks like vertically split windows, but the cursor moves
+ through the vertical separator, separator moves when scrolling.
+8 Add "z/" and "z?" for searching in not folded text only. Or use a regexp
+ item, so that it can be used in any pattern.
+8 When a closed fold is displayed open because of 'foldminlines', the
+ behavior of commands is still like the fold is closed. How to make the
+ user aware of this?
+8 Add an option 'foldskip' with values like 'foldopen' that specifies which
+ commands skip over a closed fold.
+8 "H" and "L" count buffer lines instead of window lines. (Servatius Brandt)
+8 Add a way to add fold-plugins. Johannes Zellner has one for VB.
+7 When using manual folding, the undo command should also restore folds.
+- Allow completely hiding a closed fold. E.g., by setting 'foldtext' to an
+ empty string. Require showing a character in 'foldcolumn' to avoid the
+ missing line goes unnoticed.
+ How to implement this?
+- When pressing the down arrow of a scrollbar, a closed fold doesn't scroll
+ until after a long time. How to make scrolling with closed folds
+ smoother?
+- When creating a session, also store folds for buffers in the buffer list,
+ using the wininfo in wi_folds.
+- When currently editing the first file in the argument list the session
+ file can contain:
+ args version.c main.c
+ edit version.c
+ Can editing version.c twice be avoided?
+- 'foldmethod' "textobject": fold on sections and paragraph text objects.
+- "zuf": undo change in manual fold. "zUf" redo change in manual fold. How
+ to implement this?
+- "zJ" command: add the line or fold below the fold in the fold under the
+ cursor.
+- 'foldmethod' "syntax": "fold=3" argument: set fold level for a region or
+ match.
+- Apply a new foldlevel to a range of lines. (Steve Litt)
+
+Multi-byte characters:
+- When editing a file with both utf-8 and latin1 text Vim always falls back
+ to latin1. Add a command to convert the latin1 characters to utf-8?
+ :unmix utf-8,latin1 filename
+ Would only work when 'encoding' is utf-8.
+9 When the tail byte of a double-byte character is illegal (e.g., a CR), the
+ display is messed up (Yasuhiro Matsumoto). Should check for illegal
+ double-byte characters and display them differently (display each single
+ byte).
+9 'fenc' in modeline problem: add option to reload the file when 'fenc' is
+ set to a different value in a modeline? Option can be default on. Could
+ it be done with an autocommand?
+8 Add an item in 'fileencodings' to check the first lines of a file for
+ the encoding. See Python PEP: http://www.python.org/peps/pep-0263.html.
+ To avoid getting a wrong encoding only accept something Emacs-like:
+ "-*- coding: enc-na_me.foo -*-" and "-*- coding= enc-na_me.foo -*-"
+ Match with "-\*-\s*coding[:=]\s*\([::word::-_.]\+\)\s*-\*-" and use first
+ item.
+8 Add an item in 'fileencodings' to check the first line of an XML file for
+ the encoding. <?xml version="1.0" encoding="UTF-8"?> Or "charset=UTF-8"?
+ For HTML look for "charset=utf-8".
+8 When a file was converted from 'fileencoding' to 'encoding', a tag search
+ should also do this on the search pattern. (Andrzej M. Ostruszka)
+8 When filtering changes the encoding 'fileencoding' may not work. E.g.,
+ when using xxd and 'fileencoding' is "utf-16". Add an option to set a
+ different fileencoding for filter output?
+7 When converting a file fails, mention which byte could not be converted,
+ so that the user can fix the problem.
+8 Add configure option to be able to disable using the iconv library. (Udo
+ Schweigert)
+9 'aleph' should be set to 1488 for Unicode. (Zvi Har'El)
+8 Should add test for using various commands with multibyte characters.
+8 'infercase' doesn't work with multibyte characters.
+8 toupper() function doesn't handle byte count changes.
+7 Searching and composing characters:
+ When searching, should order of composing characters be ignored?
+ Add a special item to match with a composing character, so that composing
+ characters can be manipulated.
+8 Should implement 'delcombine' for command line editing.
+8 Detect overlong UTF-8 sequences and handle them like illegal bytes.
+8 ":s/x/\u\1/" doesn't work, making uppercase isn't done for multibyte
+ characters.
+8 UTF-8: "r" in Visual mode doesn't take composing characters.
+8 UTF-8: When there is a precomposed character in the font, use it instead
+ of a character and a composing character. See xterm for an example.
+7 When a character can't be displayed, display its digraph instead.
+ 'display' option to specify this.
+7 Use ideas for nl_langinfo() from Markus Kuhn in enc_default():
+ (www.cl.cam.ac.uk/~mgk25/ucs/langinfo.c)
+- GTK and Win32: Allow selecting fonts for 'guifontset' with the
+ fontselector somehow.
+- GTK and Win32: make it possible to set the font for the menu to make it
+ possible to have 'encoding' different from the current locale.
+- dbcs_class() only works for Japanese and Korean. Implement this for
+ other encodings. The "euc-jp" and "euc-kr" choices might be wrong.
+- Find some way to automatically select the right GUI font or fontset,
+ depending on the default value of 'encoding'.
+ Irrelevant in the GTK+ 2 GUI so long as UTF-8 is used.
+ For Windows, the charset_pairs[] table could be used. But how do we know
+ if a font exists?
+- Do keyboard conversion from 'termencoding' to 'encoding' with
+ convert_input() for Mac GUI.
+- Add mnemonics from RFC1345 longer than two characters.
+ Support CTRL-K _{mnemonic}_
+- Make 'breakat' accept multibyte characters. Problem: can't use a lookup
+ table anymore (breakat_flags[]).
+ Simplistic solution: when 'formatoptions' contains "m" also break a line
+ at a multibyte character >= 0x100.
+ Making breakat support multibyte characters (Yasuhiro Matsumoto, #6598)
+ Scroll doesn't work correctly, why?
+- Add the possibility to enter mappings which are used whenever normal text
+ could be entered. E.g., for "f" command. But not in Normal mode. Sort
+ of opposite of 'langmap'. Use ":amap" command?
+- When breaking a line, take properties of multibyte characters into
+ account. The "linebreak" program from Bruno Haible can do it:
+ ftp://ftp.ilog.fr/pub/Users/haible/gnu/linebreak-0.1.tar.gz
+ But it's very complicated...
+- Problem with 'langmap' being used on the rhs of a mapping. (Nikolai
+ Weibull, 2008 May 14).
+ Possibly related problem: Alexey Muranov, 2015 Apr 2
+
+
+Printing:
+7 Implement "undercurl" for printing.
+- Add "page width" to wrap long lines.
+- Win32: use a font dialog for setting 'printfont'. Can reuse the code for
+ the 'guifont' dialog, put the common code in a separate function.
+- Add the file timestamp to the page header (with an option). (George
+ Reilly)
+- Win32: when 'printfont' is empty use 'guifont'.
+- Unix: Use some dialog box to do the obvious settings (paper size, printer
+ name, portrait/landscape, etc).
+- PostScript: Only works for text that can be converted to an 8-bit
+ character set. How to support Unicode fully?
+- Allow specifying the paper size, instead of using a standard size. Same
+ units as for the margins.
+- Support right-to-left text?
+8 Make the foreground color darkening function preserve the hue of the
+ color.
+
+
+Syntax highlighting:
+ Long term goal: faster, better, etc. Options:
+ - use treesitter, NeoVim uses it - Many people don't like it.
+ After changes requires rebuilding the library.
+ - use TextMate, vscode uses it. #9087 - Other people don't like it.
+ https://github.com/icedman/vim-textmate
+ Vscode is asked to switch to treesitter:
+ https://github.com/microsoft/vscode/issues/50140
+ - sublime grammar?
+8 Make ":syn off" use 'runtimepath' instead of $VIMRUNTIME. (Gary Johnson)
+ Should do the same for ":syn on" and ":syn manual".
+8 Support "containedin" argument for ":syn include", so that the defined
+ cluster can be added to existing syntax items.
+8 C syntax: Don't highlight {} as errors inside () when used like this:
+ "({ something })", often used in GCC code.
+7 Add a "startgroup" to a region. Used like "nextgroup" inside the region,
+ preferred item at the start of the region. (Charles Campbell)
+8 When editing a new file without a name and giving it a name (by writing
+ it) and 'filetype' is not set, detect the filetype. Avoid doing it for
+ ":wq file".
+7 For "nextgroup" we have skipwhite, skipnl and skipempty. It would be
+ really nice to be able to skip with a pattern. Or skip with a syntax
+ group. (Nikolai Weibull, 2007 Feb 27)
+8 Make conversion to HTML faster (Write it in C or pre-compile the script).
+9 There is still a redraw bug somewhere. Probably because a cached state is
+ used in a wrong way. I can't reproduce it...
+7 Be able to change only the background highlighting. Useful for Diff* and
+ Search highlighting.
+7 When 'number' is set highlight the number of the current line.
+ Must be enabled with an option, because it slows down display updating.
+8 Allow the user to add items to the Syntax menu sorted, without having to
+ change this for each release.
+8 Add a "matchcontains" for regions: items contained in the start or end
+ pattern, but not in the body.
+8 Add a "keepend-contained" argument: Don't change the end of an item this
+ one is contained in. Like "keepend" but specified on the contained item,
+ instead of the containing item.
+8 cpp.vim: In C++ it's allowed to use {} inside ().
+8 Some syntax files set 'iskeyword', they should use "syn iskeyword".
+ Also need a separate 'iskeyword' for the command line, e.g., in a help
+ window ":e /asdf/asdf/" CTRL-W works different.
+8 Add specific syntax item to match with parens/braces that don't have a
+ "%" match. :syntax nomatch cMatchError (,{,[,),},] [contained]
+8 Highlight the text between two matching parens (e.g., with a grey
+ background) when on one of the parens or in between them.
+ Option for the matchparen plugin?
+8 When using a cterm, and no ctermfg or ctermbg are defined, use start/stop
+ sequences. Add remark in docs that :if 'term' == "term-name" should be
+ used.
+8 Add @spell cluster to String and Comment groups for many languages. Will
+ allow spell checking. (Fleiner)
+8 When listing syntax items, try to sort the keywords alphabetically. And
+ re-insert the [] if possible.
+8 Make it possible to use color of text for Visual highlight group (like for
+ the Cursor).
+8 It would be useful to make the highlight group name an expression. Then
+ when there is a match, the expression would be evaluated to find out what
+ highlight group to use. Could be used to check if the shell used in a
+ password file appears in /etc/shells. (Nikolai Weibull)
+ syn match =s:checkShell(v:match) contained 'pattern'
+8 Make it possible to only highlight a sub-expression of a match. Like
+ using "\1" in a ":s" command.
+8 Support for deleting syntax items:
+ :syn keyword cTodo remove this
+ :syn match cTodo remove "pattern"
+ :syn region cString remove start="this" end="that"
+8 Add possibility to sync on something else, when the syncing in one way
+ doesn't find match. For HTML: When no {script} is found, try looking for
+ a '<'. (Fleiner)
+7 Replace the synchronizing method with a state machine specification?
+ Should be able to start at any line in the file, search forwards or
+ backwards, and use the result of matching a pattern.
+7 Use parsing like awk, so that e.g., a ( without a matching ) can be
+ detected.
+8 Make it possible to use "inverted" highlighting, invert the original
+ character. For Visual mode. (xterm-selection already does this).
+8 Highlight non-printable characters with "SpecialChar", linked to
+ "Special". Display them with the digraph characters, if possible.
+8 Highlight the clipboard-selection with a highlight group.
+8 Be able to reset highlighting to its original (default) values.
+7 Be able to write current highlighting to a file as commands, similar to
+ ":mkvimrc".
+8 Improve c.vim:
+ - Add check for unterminated strings, with a variable to switch it on:
+ "c_strict_ansi".
+ - Detect unbalanced "#endif". Requires looking back a long way...
+8 Add an option to restrict the updating of syntax highlighting to the
+ current line while in Insert mode.
+8 When guessing value of 'background', the syntax file has already been
+ loaded (from the .gvimrc). After changing 'background', load it again?
+8 Add ":syn resync" command, to re-parse the whole file until the current
+ display position.
+8 Should support "me" offset for a region start pattern. To be used to
+ allow searching for the end pattern inside the match of the end pattern.
+ Example: syn region pikeXX start="([^{]" end=")" should work on "()".
+8 When using a regexp for "contains=", should delay matching with it until
+ redrawing happens. Set a flag when a group is added, check this flag when
+ highlighting starts.
+7 It's possible for an item to be transparent, so that the colors of an item
+ lower on the stack is used. Also do this with highlighting, so that the
+ user can set transparent highlighting? E.g. a number in a C comment would
+ get the color of a comment, a number in an assignment Normal. (Nikolai
+ Weibull)
+7 Add "semitrans": Add highlighting. E.g., make the text bold, but keep the
+ colors. And add colors, so that Green+Red becomes Yellow.
+ E.g. for this html:
+ <B> bold text <I> italic+bold text </B> italic text </I>
+7 CTRL-] checks the highlight group for finding out what the tag is.
+7 Add an explanation how a list of words can be used to highlight misspelled
+ words.
+7 Should find a better way to parse the :syntax and :highlight commands.
+ Use tables or lists that can be shared by parsing for execution and
+ completion?
+8 Add ColorSchemePost autocommand event, so that scripts can set up their
+ highlighting. (Salman Halim)
+7 Add a few sets of colors (e.g. Borland Turbo C one). With a menu to
+ select one of the sets.
+8 Add offsets to sub-matches: "\(a*\) *"he=e1-1
+ 'e' is end of match 'e1' is end of sub-match 1, 's2' is start of submatch
+ 2, etc.
+8 In Insert mode, when there are typeahead characters, postpone the
+ highlighting (for "." command).
+8 Syncing on comments isn't 100% correct when / / lines mix with / * and * /.
+ For example: What about a line that starts with / / and contains * /?
+8 Ignore / * and * / inside strings, when syncing.
+7 Build a few more syntax files from the file "/usr/share/misc/vgrindefs":
+ ISP, LDL, Icon, ratfor. And check "nedit/source/highlight.c".
+6 Add possibility to have background color continue until the right edge of
+ the window. Useful for comment blocks and function headings. (Rogall)
+- Make it possible to add "contains" items for all items in a group. Useful
+ when extending an already existing syntax file.
+- Add line-continuation pattern for non-syncing items too?
+- Add possibility to highlight the whole line, including the right margin
+ (for comment blocks).
+- Add 'hlmatch' option: List of flags:
+ 'c': highlight match for character under the cursor.
+ 'b': highlight the previous (, and its match.
+ 'a': highlight all text from the previous ( until its match.
+ Also for {}, <>, etc.?
+ 'e': highlight all braces without a match (slow?)
+ OR: add an argument "cursor" to the syntax command, which means that the
+ region/match/keyword is only highlighted when the cursor is on it.
+ (Campbell)
+ Or do it like Elvis: define text objects and how to highlight them around
+ the cursor. (Iain Truskett)
+7 Make it possible to use all words in the tags files as Keyword.
+ Can also be done with a script (but it's slow).
+7 Make it possible to call a ":" command when a match is found. Should
+ allow for adding keywords from the text (e.g. variables that are set).
+ And allows for sections with different highlighting.
+7 Add highlight group for commandline: "Commandline". Make sure it
+ highlights the command line while typing a command, and any output from
+ messages. And external commands?
+8 Make a version that works like less, but with highlighting: read stdin for
+ text, exit at end of file, don't allow editing, etc. moreim? lessim?
+7 SpecialKey highlighting overrules syntax highlighting. Can't give an
+ unprintable char another color. Would be useful for ^M at end of line.
+- Syntax highlight for a region does not work with a "nextgroup" if the
+ start match is empty. #8449
+- The :syntax cchar value can only be a single character. It would be
+ useful to support combining characters. (Charles Campbell) Also #4687
+- Syntax highlighting slow (hangs) in SASS file. (Niek Bosch, 2013 Aug 21)
+- Several syntax file match "^\s*" which may get underlined if that's in the
+ highlight group. Add a "\zs" after it?
+- patch to add "combine" flag to syntax commands. (so8res, 2012 Dec 6)
+ Patch to add "combine" to :syntax, combines highlight attributes. (Nate
+ Soares, 2012 Dec 3)
+- Syntax update problem in one buffer opened in two windows, bottom window
+ is not correctly updated. (Paul Harris, 2012 Feb 27)
+- Syntax region with 'concealends' and a 'cchar' value, 'conceallevel' set
+ to 2, only one of the two ends gets the cchar displayed. (Brett Stahlman,
+ 2010 Aug 21, Ben Fritz, 2010 Sep 14)
+- Using "syn sync breaklines=2" works for when text is changed, but not when
+ scrolling or redrawing. Should start search for syntax patterns above the
+ first drawn line. (#8103)
+- Syntax priority problem. (Charles Campbell, 2011 Sep 15)
+- Syntax highlighting wrong for transparent region. (Doug Kearns, 2007 Feb
+ 26)
+- Bug in using a transparent syntax region. (Hanlen in vim-dev maillist,
+ 2007 Jul 31)
+- Syntax HL error caused by "containedin". (Peter Hodge, 2006 Oct 6)
+- Open two windows on the same C code, delete a ")" in one window, resulting
+ in highlighted "{" in that window, not in the other.
+- When using "nextgroup" and the group has an empty match, there is no
+ search at that position for another match. (Lukas Mai, 2008 April 11)
+
+
+Vim script language:
+8 Make the filename and line number available to script functions, so that
+ they can give useful debugging info. The whole call stack would be ideal.
+ At least use this for error messages.
+7 Execute a function with standard option values. No need to save and
+ restore option values. Especially useful for new options. Problem: how
+ to avoid a performance penalty (esp. for string options)?
+- range for ":exec", pass it on to the executed command. (Webb)
+7 ":include" command: just like ":source" but doesn't start a new scriptID?
+ Will be tricky for the list of script names.
+8 Have a look at VSEL. Would it be useful to include? (Bigham)
+8 Have a prefix for a function to make it unique. When using packages it
+ can be the plugin name.
+ Perhaps also have a way to remove everything that the package added?
+ including autocommands.
+7 Pre-parse or compile Vim scripts into a bytecode, like :def functions.
+ Possibilities:
+ 1. Put the bytecode with the original script, with an ":if
+ has('bytecode-1234')" around it, so that it's only used with a Vim that
+ supports the version. Update the code with a command, can be used in
+ an autocommand.
+ 2. Use a ".vic" file (like Python use .pyc). Create it when writing a
+ .vim file. Problem: distribution, non-writable directory, etc.
+ 3. Use a cache directory for each user. Disadvantage: cache lookup may
+ cost more time than bytecode wins.
+7 Add argument to winwidth() to subtract the space taken by 'foldcolumn',
+ signs and/or 'number'.
+6 Add ++ and -- operators? They only work on variables (lvals), how to
+ implement this?
+8 Add functions:
+ has(":command") Check if ":command" works. compare function
+ with "ex_ni". E.g. for ":simalt".
+ escape() Add argument to specify what to escape with.
+ modestack() Instead of just the current mode return the
+ stack of Insert / CTRL-O / :normal things.
+ realname() Get user name (first, last, full)
+ user_fullname() patch by Nikolai Weibull, Nov
+ 3 2002
+ Only add this when also implemented for
+ non-Unix systems, otherwise a shell cmd could
+ be used.
+ get_user_name() gets login name.
+ menuprop({name}, {idx}, {what})
+ Get menu property of menu {name} item {idx}.
+ menuprop("", 1, "name") returns "File".
+ menuprop("File", 1, "n") returns "nmenu
+ File.Open..." argument.
+ Patch by Ilya Sher, 2004 Apr 22
+ Return a list of menus and/or a dictionary
+ with properties instead.
+ mapname({idx}, mode) return the name of the idx'th mapping.
+ Patch by Ilya Sher, 2004 Mar 4.
+ Return a list instead.
+ char2hex() convert char string to hex string.
+ crypt() encrypt string
+ decrypt() decrypt string
+ base64enc() base 64 encoding
+ base64dec() base 64 decoding
+ attributes() return file protection flags "drwxrwxrwx"
+ filecopy(from, to) Copy a file
+ shorten(fname) shorten a file name, like home_replace()
+ perl(cmd) call Perl and return string
+ inputrl() like input() but right-to-left
+ typed() return the characters typed and consumed (to
+ find out what happened)
+ virtualmode() add argument to obtain whether "$" was used in
+ Visual block mode.
+ getacp() Win32: get codepage (Glenn Maynard)
+ libcall() Allow more than one argument.
+ libcallext() Like libcall(), but using a callback function
+ to allow the library to execute a command or
+ evaluate an expression.
+7 Make bufname("'0") return the buffer name from mark '0. How to get the
+ column and line number? col("'0") currently returns zero.
+8 argc() returns 0 when using "vim -t tag". How to detect that no file was
+ specified in any way? To be able to jump to the last edited file.
+8 Pass the command line arguments to Vim scripts in some way. As v:args
+ List? Or extra parameter to argv()?
+8 Add command arguments with three dashes, passed on to Vim scripts.
+6 User functions: Functions local to buffer "b:func()"?
+8 For Strings add ":let var[{expr}] = {expr}". When past the end of "var"
+ just ignore.
+8 The "= register should be writable, if followed by the name of a variable,
+ option or environment variable.
+8 ":let &option" should list the value of the option.
+8 ":let Func().foo = value" should work, also when "foo" doesn't exist.
+ Also: ":let Func()[foo] = value" should work. Same for a List.
+7 Add synIDlist(), making the whole list of syntax items on the syntax stack
+ available as a List.
+8 Add autocommand-event for when a variable is changed:
+ :au VarChanged {varname} {commands}
+8 Add "has("gui_capable")", to check if the GUI can be started.
+8 Add possibility to use variables like registers: characterwise (default),
+ linewise (when ending in '\n'), blockwise (when ending in '\001'). reg0,
+ rega, reg%, etc. Add functions linewise({expr}), blockwise({expr}) and
+ charwise({expr}).
+7 Make it possible to do any command on a string variable (make a buffer
+ with one line, containing the string). Maybe add an (invisible) scratch
+ buffer for this?
+ result = scratch(string, command)
+ result = apply(string, command)
+ result = execute(string, command)
+ "command" would use <> notation.
+ Does scratch buffer have a number? Or re-use same number?
+7 Add function to generate unique number (date in milliseconds).
+
+
+Robustness:
+6 Add file locking. Lock a file when starting to edit it with flock() or
+ fcntl(). This patch has advisory file locking while reading/writing
+ the file for Vim 5.4: ~/vim/patches/kahn_file_locking .
+ The patch is incomplete (needs support for more systems, autoconf).
+ Andy doesn't have time to work on it.
+ Disadvantage: Need to find ways to gracefully handle failure to obtain a
+ lock. When to release a lock: When buffer is unloaded?
+
+
+Performance:
+7 For string variables up to 3 bytes don't allocate memory, use v_list
+ itself as a character array. Use VAR_SSTRING (short string).
+7 Add 'lazysize' option: Above this size Vim doesn't load everything before
+ starting to edit a file. Things like 'fileencodings' only work up to this
+ size, modelines only work at the top. Useful for large log files where
+ you only want to look at the first few pages. Use zero to disable it.
+8 move_lines() copies every line into allocated memory, making reloading a
+ buffer a lot slower than re-editing the file. Can the memline be locked
+ so that we don't need to make a copy? Or avoid invoking ml_updatechunk(),
+ that is taking a lot of time. (Ralf Wildenhues, 2008 Jul 7)
+ With a patch, but does it work?
+8 Turn b_syn_ic and b_syn_containedin into b_syn_flags.
+9 Loading menu.vim still takes quite a bit of time. How to make it faster?
+8 in_id_list() takes much time for syntax highlighting. Cache the result?
+7 setpcmark() shifts the jumplist, this takes quite a bit of time when
+ jumping around. Instead use an index for the start?
+8 When displaying a space with only foreground highlighting, it's the same
+ as a space without attributes. Avoid displaying spaces for the "~" lines
+ when starting up in a color terminal.
+8 Avoid alloc() for scratch buffer use, esp. in syntax.c. It's very slow on
+ Win16.
+8 Profiling shows that in_id_list() is used very often for C code. Can this
+ function be improved?
+8 For an existing file, the page size of the swap file is always the
+ default, instead of using the block size of the device, because the swap
+ file is created only after setting the block size in mf_open(). How can
+ this be improved?
+8 Set default for 'ttyscroll' to half a screen height? Should speed up
+ MS-DOS version. (Negri)
+7 C syntax highlighting gets a lot slower after ":set foldmethod=syntax".
+ (Charles Campbell) Inserting a "{" is very slow. (dman)
+7 HTML syntax highlighting is slow for long lines. Try displaying
+ http://www.theregister.co.uk/content/4/22908.html. (Andre Pang)
+7 Check how performance of loading the wordlist can be improved (adding a
+ lot of abbreviations).
+7 Compile Ex commands to byte codes. Store byte codes in a vim script file
+ at the end, after "compiled:. Make it look like a single comment line
+ for old Vim versions. Insert first line "Vim script compiled <timestamp>.
+ Only used compiled code when timestamp matches the file stat.
+ Add command to compile a vim script and add it to the file in-place.
+ Split Ex command executing into a parsing and executing phase.
+ Use compiled code for functions, while loops, etc.
+8 When defining autocommands (e.g., from $VIMRUNTIME/filetype.vim), need to
+ compare each pattern with all existing patterns. Use a hash code to avoid
+ using strcmp() too often?
+7 Include turbo_loader patches, speeding up reading a file?
+ Speed up reading a file by reading it into a fixed-size buffer, creating
+ the list of indexes in another buffer, and then copying the result into a
+ memfile block with two copies. Then read the next block into another
+ fixed-size buffer, create the second list of indexes and copy text from
+ the two blocks to the memfile block.
+7 do_cmdline(): Avoid that the command line is copied to allocated memory
+ and freed again later all the time. For while loops, and for when called
+ with an argument that can be messed with.
+ Generic solution: Make a struct that contains a pointer and a flag that
+ indicates if the pointer should be freed when replaced.
+7 Check that the file size is not more than "sizeof(long)".
+- Further improve finding mappings in maphash[] in vgetorpeek()
+8 Syntax highlighting is slow when deleting lines. Try in
+ $VIMRUNTIME/filetype.vim.
+- "out of memory" after deleting (1,$d) and changing (:%s/^/> /) a lot of
+ lines (27000) a few times. Memory fragmentation?
+- Have a look at how pdksh does memory allocation (alloc.c). (Dalecki)
+- Do profiling on:
+ - :g/pat/normal cmd
+ - deleting 10Mbyte worth of lines (netscape binary)
+ - "[i" and "[d" (Yegappan Lakshmanan)
+ - ":g/^/m0" on a 450Kbyte file. And the "u".
+ - highlighting "~/vim/test/longline.tex", "~/vim/test/scwoop.tcl" and
+ "~/vim/test/lockup.pl".
+ - loading a syntax file to highlight all words not from a dictionary.
+ - editing a Vim script with syntax highlighting on (loading vim.vim).
+7 Screen updating can be further improved by only redrawing lines that were
+ changed (and lines after them, when syntax highlighting was used, and it
+ changed).
+ - On each change, remember start and end of the change.
+ - When inserting/deleting lines, remember begin, end, and line count.
+- Use macros/duarte/capicua for profiling. Nvi 1.71 is the fastest!
+- When using a file with one long line (1Mbyte), then do "$hhhh", is still
+ very slow. Avoid calling getvcol() for each "h"?
+- Executing a register, e.g. "10000@@" is slow, because ins_typebuf has to
+ move the previous commands forward each time. Pass count from
+ normal_cmd() down to do_execreg().
+- Avoid calls to plines() for cursor line, use w_cline_height.
+- After ":set nowrap" remove superfluous redraw with wrong hor. offset if
+ cursor is right of the screen.
+8 Make CTRL-C on Unix generate a signal, avoid using select() to check for a
+ CTRL-C (it's slow).
+
+
+Code size:
+8 GUI: When NO_CONSOLE is defined, more code can be excluded.
+- Put getline() and cookie in a struct, so only one argument has to be
+ passed to do_cmdline() and other functions.
+8 Make a GUI-only version for Unix?
+8 In buf_write _() isn't needed when setting errmsg, do it once when using
+ it.
+7 When compiling with a GUI-only version, the code for cterm colors can be
+ left out.
+8 When compiled with a GUI-only version, the termcap entries for terminals
+ can be removed.
+8 Can the check for libelf in configure.ac be removed?
+
+
+Messages:
+8 When using ":q" in a changed file, the error says to "add !". Add the
+ command so that beginners understand it: "use :q!".
+8 For 'verbose' level 12 prints commands from source'ed files. How to skip
+ lines that aren't executed? Perhaps move the echoing to do_cmdline()?
+8 Use 'report' for ":bdel"? (Krishna) To avoid these messages when using a
+ script.
+- Delete message after new command has been entered and have waited for key.
+ Perhaps after ten seconds?
+- Make message history available in "msg" variables: msg1, msg2, .. msg9.
+9 Check handling of overwriting of messages and delays:
+ Very wrong: errors while redrawing cause endless loop.
+ When switching to another file and screen scrolls because of the long
+ message and return must be typed, don't scroll the screen back before
+ redrawing.
+8 When address range is wrong you only get "Invalid range". Be a bit more
+ specific: Negative, beyond last line, reverse range? Include the text.
+8 Make it possible to ignore errors for a moment ('errorignore'?). Another
+ option to switch off giving error messages ('errorquiet'?). Also an option
+ not to give any messages ('quiet')? Or ":quiet on", ":quiet off".
+ Careful: For a severe error (out of memory), and when the user starts
+ typing, error messages must be switched back on.
+ Also a flag to ignore error messages for shell commands (for mappings).
+- Option to set time for emsg() sleep. Interrupt sleep when key is typed?
+ Sleep before second message?
+8 In Ex silent mode or when reading commands from a file, what exactly is
+ not printed and what is? Check ":print", ":set all", ":args", ":vers",
+ etc. At least there should be no prompt. (Smulders) And don't clear the
+ screen when reading commands from stdin. (Kendall)
+ --> Make a difference between informative messages, prompts, etc. and
+ error messages, printing text, etc.
+8 Window should be redrawn when resizing at the hit-enter prompt.
+ Also at the ":tselect" prompt. Find a generic solution for redrawing when
+ a prompt is present (with a callback function?).
+
+
+Screen updating:
+- screen_line():
+ - insert/delete character stuff.
+ - improve delete rest of line (spaces at end of line).
+- When moving or resizing window, try to avoid a complete redraw (esp. when
+ dragging the status line with the mouse).
+- When 'lazyredraw' set, don't echo :ex commands? Need a flag to redraw when
+ waiting for a character.
+8 Add a ":refresh [winnr]" command, to force updating a window. Useful from
+ an event handler where ":normal" can't be used. Also useful when
+ 'lazyredraw' is set in a mapping.
+
+Scrolling:
+8 Add "zy" command: scroll horizontally to put the cursor in the middle.
+6 Add option to set the overlap for CTRL-F and CTRL-B. (Garhi)
+- extend 'scrollbind' option: 'scrollopt' words "search", "relative", etc..
+ Also 'e'xecute some commands (search, vertical movements) in all bound
+ windows.
+7 Add 'scrollbind' feature to make the offset of one window with the next
+ one equal to the window height. When editing one file in both windows it
+ looks like each window displays a page of the buffer.
+- Allow scrolling by dragging with the mouse (grab a character and move it
+ up/down). Like the "hand" in Acrobat reader. Use Alt-LeftMouse for this?
+ (Goldfarb)
+- Add command to execute some commands (search, vertical movements) in all
+ bound windows.
+- Add 'search' option to 'scrollopt' to allow 'scrollbind' windows to
+ be bound by regexp searches
+- Add "z>" and "z<": scroll sideways one screenful. (Campbell)
+- Add option to set the number of lines when not to scroll, instead of the
+ fixed number used now (for terminals that scroll slow with a large number
+ of lines but not with a single line).
+
+
+Autoconf:
+8 Should use acconfig.h to define prototypes that are used by autoheader.
+8 Some compilers don't give an error for "-OPT:Olimit" but a warning. (Webb)
+ Add a check for the warning, so that "Olimit" can be added automatically?
+- Autoconf: Use @datadir@ for the system independent files. Make sure the
+ system dependent and system independent files are separated. (Leitner).
+- Add autoconf check for waitpid()/wait4().
+- Remove fcntl() from autoconf, all systems have it?
+- Set default for 'dictionary', add search for dictionary to autoconf.
+
+
+Perl interface:
+8 Rename typemap file to something else?
+7 Make buffers accessed as Perl arrays. (Clark)
+7 Make it possible to compile with non-ANSI C?
+6 Tcl/Tk has the "load" command: load a shared library (.so or .dll).
+
+
+Shared libraries:
+8 libcall() can keep the library around instead of always calling dlclose().
+ (Jason Felice, 2018 Mar 20)
+6 Add support for loading shared libraries, and calling functions in it.
+ :libload internal-name libname
+ :libunload internal-name
+ :liblist
+ :libcall internal-name function(arg1, arg2, ...)
+ :libcall function(arg1, arg2, ...)
+ libcall() can have only one integer or String argument at the moment.
+6 Have a look on how Perl handles loading dynamic libraries.
+
+
+Tags:
+9 With ":set tags=./tags,../tags" and a tag appears in both tags files it is
+ added twice. Requires figuring out the actual file name for each found
+ match. Remove tag_fname from the match and combine it with the fname in
+ the match (without expanding or other things that take time). When
+ 'tagrelative' is off tag_fname isn't needed at all.
+8 For 'tags' wildcard in the file name is not supported, only in the path.
+ This is due to it using |file-searching|. Suboptimal solution would be to
+ make the filename or the whole option use |wildcards| globing, better
+ would be to merge the 2 kinds of globing. originally (Erik Falor, 2008
+ April 18), updated (Ian Kelling, 2008 July 4)
+7 Can CTRL-] (jump to tag) include a following "." and "->" to restrict the
+ number of possible matches? Check tags file for an item that has members.
+ (Flemming Madsen)
+8 Scope arguments for ":tag", e.g.: ":tag class:cPage open", like Elvis.
+8 When output of ":tselect" is long, getting the more-prompt, should be able
+ to type the tag number directly.
+7 Add the possibility to use the "-t {tag}" argument multiple times. Open a
+ window for each tag.
+7 Make output of ":tselect" a bit nicer. Use highlighting?
+7 Highlight the "tag 1 of >2" message. New highlight group, or same as "hit
+ bottom" search message.
+7 When using ":tag" at the top of the tag stack, should add another entry,
+ so CTRL-T can bring you back to where you are now AND to where you were
+ before the previous ":tag" command. (Webb)
+- When doing "[^I" or "[^D" add position to tag stack.
+- Add command to put current position to tag stack: ":tpush".
+- Add functions to save and restore the tag stack? Or a command to switch
+ to another tag stack? So that you can do something else and come back to
+ what you were working on.
+7 When using CTRL-] on someClass::someMethod, separate class from method and
+ use ":ta class:someClass someMethod".
+ Include C++ tags changes (Bertin). Change "class::func" tag into "func"
+ with "class=class"? Docs in oldmail/bertin/in.xxx.
+7 Add ":tagargs", to set values for fields:
+ :tagargs class:someclass file:version.c
+ :tagargs clear
+ These are then the default values (changes the order of priority in tag
+ matching).
+7 Support for "gtags" and "global"? With ":rtag" command?
+ There is an example for how to do this in Nvi.
+ Or do it like Elvis: 'tagprg' and 'tagprgonce' options. (Yamaguchi)
+ The Elvis method is far more flexible, do it that way.
+7 Support "col:99" extra field, to position the cursor in that column. With
+ a flag in 'cpoptions' to switch it off again.
+7 Better support for jumping to where a function or variable is used. Use
+ the id-utils, with a connection to "gid" (Emacs can do it too). Add
+ ":idselect", which uses an "ID" database (made by "mkid") like "tselect".
+
+
+Win32 GUI:
+8 Make debug mode work while starting up (vim -D). Open console window for
+ the message and input?
+8 When using "Edit with Vim" for one file it changes directory, when several
+ files are selected and using "Edit with single Vim" the directory isn't
+ changed. At least change directory when the path is the same for all
+ files. Perhaps just use the path of the first file or use the longest
+ common part of the path.
+8 Add font argument to set the lfCharSet. (Bobcik)
+8 Somehow automatically detect the system language and set $LANG, so that
+ gettext and menus work.
+8 Could keep console open to run multiple commands, to avoid the need to hit
+ return in every console.
+ Also: Look at how Emacs does run external commands:
+ http://www.cs.washington.edu/homes/voelker/ntemacs.html.
+8 Need a separate PopUp menu for modeless selection. Need two new commands:
+ Copy selection to clipboard, Paste selection (as typed text).
+8 Support copy/paste for other file formats. At least HTML, perhaps RTF.
+ Add "copy special" and "paste special" commands?
+7 Use different default colors, to match the current Windows color scheme.
+ Sys_WindowText, Sys_Window, etc. (Lionel Schaffhauser)
+7 Use <C-Tab> to cycle through open windows (e.g., the find dialog).
+7 <Esc> should close a dialog.
+7 Keep the console for external commands open. Don't wait for a key to be
+ hit. Re-open it when the user has closed it anyway. Or use a prepended
+ command: ":nowait {cmd}", or ":quiet", which executes {cmd} without any
+ prompts.
+7 Should be able to set an option so that when you double click a file that
+ is associated with Vim, you can either get a new instance of Vim, or have
+ the file added into an already running Vim.
+7 The "-P" argument only works for the current codepage. Use wide
+ functions to find the window title.
+
+
+GUI:
+7 Implement ":popup" for other systems than Windows.
+8 Implement ":tearoff" for other systems than Win32 GUI.
+6 Implement ":untearoff": hide a torn-off menu.
+8 When using the scrollbar to scroll, don't move the cursor position. When
+ moving the cursor: scroll to the cursor position.
+9 Make <S-Insert> paste from the clipboard by default. (Kunze)
+7 Menu local to a buffer, like mappings. Or local to a filetype?
+8 In Buffers menu, add a choice whether selecting a buffer opens it in the
+ current window, splits the window or uses ":hide".
+8 Dragging the mouse pointer outside of a Vim Window should make the text
+ scroll. Return a value from gui_send_mouse_event() to the machine
+ specific code to indicate the time in which the event should be repeated.
+8 Make it possible to ignore a mouse click when it's used to give Vim (gvim)
+ window focus. Also when a mouse click is used to bring a window to front.
+8 Make the split into system independent code and system specific code more
+ explicit. There are too many #ifdefs in gui.c.
+ If possible, separate the Vim code completely from the GUI code, to allow
+ running them in separate processes.
+7 X11: Support cursorColor resource and "-cr" argument.
+8 X11 (and others): CTRL-; is not different from ';'. Set the modifier mask
+ to include CTRL for keys where CTRL produces the same ASCII code.
+7 Add some code to handle proportional fonts on more systems? Need to draw
+ each character separately (like xterm). Also for when a double-width font
+ is not exactly double-width. (Maeda)
+8 Should take font from xterm where gvim was started (if no other default).
+8 Selecting font names in X11 is difficult, make a script or something to
+ select one.
+8 Visual highlighting should keep the same font (bold, italic, etc.).
+8 Add flag to 'guioptions' to not put anything in the clipboard at all?
+8 Should support a way to use keys that we don't recognize yet. Add a
+ command that adds entries to special_keys somehow. How do we make this
+ portable (X11, Win32, ..)?
+7 Add a flag to 'guioptions' that tells not to remove inactive menu items.
+ For systems where greying-out or removing menu items is very slow. The
+ menu items would remain visibly normally, but not do anything.
+7 Add ":minimize" and ":maximize", which iconize the window and back.
+ Useful when using gvim to run a script (e.g. 2html.vim).
+7 X11: Is it possible to free allocated colors, so that other programs can
+ use them again? Otherwise, allow disabling allocating the default colors.
+ Or allocate an own colormap (check UAE). With an option to use it. For
+ the commandline, "-install" is mostly used for X11 programs.
+7 Should support multi-column menus.
+- Should add option for where to put the "Help" menu: like Motif at the far
+ right, or with the other menus (but still at the right).
+- Add menu item to "Keep Insert mode".
+8 ":mkgvimrc" command, that includes menus.
+6 Big change: Move GUI to separate program "vimgui", to make startup of vim a
+ lot faster, but still be able to do "vim -g" or ":gui".
+7 More explicit mouse button binding instead of 'mousemodel'?
+7 Add option to set the position of the window on the screen. 'windowpos',
+ which has a value of "123,456": <x>,<y>.
+ Or add a command, like ":winsize"?
+7 Add toolbar for more GUIs.
+8 Make it possible to use "amenu icon=BuiltIn##", so that the toolbar item
+ name can be chosen free.
+7 Make it possible to put the toolbar on top, left, right and/or bottom of
+ the window? Allows for softkey-like use.
+6 Separate the part of Vim that does the editing from the part that runs the
+ GUI. Communicate through a pseudo-tty. Vim starts up, creates a
+ pty that is connected to the terminal. When the GUI starts, the pty is
+ reconnected to the GUI process. When the GUI stops, it is connected to
+ the terminal again. Also use the pty for external processes, it looks
+ like a vt100 terminal to them. Vim uses extra commands to communicate GUI
+ things.
+7 Motif: For a confirm() dialog <Enter> should be ignored when no default
+ button selected, <Esc> should close the dialog.
+7 When using a pseudo-tty Vim should behave like some terminal (vt52 looks
+ simple enough). Terminal codes to/from shell should be translated.
+- Would it be useful to be able to quit the GUI and go back to the terminal
+ where it was started from?
+7 Support "-visual <type>" command line argument.
+
+
+Autocommands:
+9 Add WinNewPre - before creating a new window. #10635
+9 When triggering WinNew provide the window ID somehow. #10633
+9 Rework the code from FEAT_OSFILETYPE for autocmd-osfiletypes to use
+ 'filetype'. Only for when the current buffer is known.
+- Put autocommand event names in a hashtable for faster lookup?
+8 When the SwapExists event is triggered, provide information about the
+ swap file, e.g., whether the process is running, file was modified, etc.
+ Must be possible to check the situation that it's probably OK to delete
+ the swap file. (Marc Merlin)
+8 When all the patterns for an event are "*" there is no need to expand
+ buffer names to a full path. This can be slow for NFS.
+7 For autocommand events that trigger multiple times per buffer (e.g.,
+ CursorHold), go through the list once and cache the result for a specific
+ buffer. Invalidate the cache when adding/deleting autocommands or
+ changing the buffer name.
+7 Add TagJump event: do something after jumping to a tag.
+8 Add "TagJumpFile" autocommand: When jumping to another file for a tag.
+ Can be used to open "main.c.gz" when "main.c" isn't found.
+8 Use another option than 'updatetime' for the CursorHold event. The two
+ things are unrelated for the user (but the implementation is more
+ difficult).
+7 Add autocommand event for when a buffer cannot be abandoned. So that the
+ user can define the action taking (autowrite, dialog, fail) based on the
+ kind of file. (Yakov Lerner) Or is BufLeave sufficient?
+8 Autocommand for when modified files have been found, when getting input
+ focus again (e.g., FileChangedFocus).
+ Check when: getting focus, jumping to another buffer, ...
+8 Autocommands should not change registers. And marks? And the jumplist?
+ And anything else? Add a command to save and restore these things.
+8 Add autocommands, user functions and user commands to ":mkvimrc".
+6 Add KeymapChanged event, so that the effects of a different keymap can be
+ handled (e.g., other font) (Ron Aaron)
+7 When trying to open a directory, trigger an OpenDirectory event.
+7 Add file type in front of file pattern: <d> for directory, <l> for link,
+ <x> for executable, etc. With commas to separate alternatives. The
+ autocommand is only executed when both the file type AND the file pattern
+ match. (Leonard)
+5 Add option that specifies extensions which are to be discarded from the
+ file name. E.g. 'ausuffix', with ".gz,.orig". Such that file.c.gz will
+ trigger the "*.c" autocommands. (Belabas)
+7 Add something to break the autocommands for the current event, and for
+ what follows. Useful for a "BufWritePre" that wants to avoid writing the
+ file.
+8 When editing "tt.gz", which is in DOS format, 'fileformat' stays at
+ "unix", thus writing the file changes it. Somehow detect that the read
+ command used dos fileformat. Same for 'fileencoding'.
+- Add events to autocommands:
+ Error - When an error happens
+ VimLeaveCheck - Before Vim decides to exit, so that it can be cancelled
+ when exiting isn't a good idea.
+ CursorHoldC - CursorHold while command-line editing
+ WinMoved - when windows have been moved around, e.g, ":wincmd J"
+ SearchPost - After doing a search command (e.g. to do "M")
+ ShutDown - when the system is about to shut down
+ InsertCharPost - user typed a character in Insert mode, after inserting
+ the char.
+ BufModified - When a buffer becomes modified, or unmodified (for
+ putting a [+] in the window title or checking out the
+ file from CVS).
+ BufFirstChange - When making a change, when 'modified' is set. Can be
+ used to do a :preserve for remote files.
+ BufChange - after a change was made. Set some variables to indicate
+ the position and number of inserted/deleted lines, so
+ that marks can be updated. HierAssist has patch to add
+ BufChangePre, BufChangePost and RevertBuf. (Shah)
+ ViewChanged - triggered when the text scrolls and when the window size
+ changes.
+ QuickfixList - when any entry in the current list changes or another
+ list is selected
+ QuickfixPosition - when selecting another entry in the current quickfix
+ list
+
+- Write the file now and then ('autosave'):
+ *'autosave'* *'as'* *'noautosave'* *'noas'*
+ 'autosave' 'as' number (default 0)
+ Automatically write the current buffer to file N seconds after the
+ last change has been made and when |'modified'| is still set.
+ Default: 0 = do not autosave the buffer.
+ Alternative: have 'autosave' use 'updatetime' and 'updatecount' but make
+ them save the file itself besides the swapfile.
+- Buffer autocommands are a bit inconsistent. Add a separate set of
+ autocommands for the buffer lifecycle:
+ BufIsCreated (after buffer ID exists)
+ BufIsLoaded (after buffer ID has content)
+ BufIsUnloaded (after buffer ID no longer has)
+ BufIsWiped (after buffer ID was wiped)
+ BufIsRenamed (after buffer ID gets another name)
+ The buffer list and windows are locked, no changes possible
+
+
+Omni completion:
+- Add a flag to 'complete' to be able to do omni completion with CTRL-N (and
+ mix it with other kinds of completion).
+- Ideas from the Vim 7 BOF at SANE:
+ - For interpreted languages, use the interpreter to obtain information.
+ Should work for Java (Eclipse does this), Python, Tcl, etc.
+ Richard Emberson mentioned working on an interface to Java.
+ - Check Readline for its completion interface.
+- Ideas from others:
+ http://www.wholetomato.com/
+ http://www.vim.org/scripts/script.php?script_id=747
+ http://sourceforge.net/projects/insenvim
+ or http://insenvim.sourceforge.net
+ Java, XML, HTML, C++, JSP, SQL, C#
+ MS-Windows only, lots of dependencies (e.g. Perl, Internet
+ explorer), uses .dll shared libraries.
+ For C++ uses $INCLUDE environment var.
+ Uses Perl for C++.
+ Uses ctags to find the info:
+ ctags -f $allTagsFile --fields=+aiKmnsSz --language-force=C++ --C++-kinds=+cefgmnpsut-dlux -u $files
+ www.vim.org script 1213 (Java Development Environment) (Fuchuan Wang)
+ IComplete: http://www.vim.org/scripts/script.php?script_id=1265
+ and http://stud4.tuwien.ac.at/~e0125672/icomplete/
+ http://cedet.sourceforge.net/intellisense.shtml (for Emacs)
+ Ivan Villanueva has something for Java.
+ Emacs: http://www.xref-tech.com/xrefactory/more_c_completion.html
+ Completion in .NET framework SharpDevelop: http://www.icsharpcode.net
+- Pre-expand abbreviations, show which abbrevs would match?
+
+
+Insert mode completion/expansion:
+- Is it possible to keep the complete menu open when calling complete()?
+ (Prabir Shrestha, 2017 May 19, #1713)
+- When 'completeopt' has "noselect" does not insert a newline.
+ (Lifepillar, 2017 Apr 23, #1653)
+- Can 'completeopt' be made buffer-local? (#5487)
+- When complete() first argument is before where insert started and
+ 'backspace' is Vi compatible, the completion fails.
+ (Hirohito Higashi, 2015 Feb 19)
+- The CompleteDone autocommand needs some info passed to it:
+ - The word that was selected (empty if abandoned complete)
+ - Type of completion: tag, omnifunc, user func.
+- When a:base in 'completefunc' starts with a number it's passed as a
+ number, not a string. (Sean Ma) Need to add flag to call_func_retlist()
+ to force a string value.
+- When editing the text and pressing CTRL-N again goes back to originally
+ completed text, edited text is gone. (Peng Yu, 2008 Jul 24)
+ Suggestion by Ben Schmidt, 2008 Aug 6.
+- GUI implementation of the popup menu.
+7 When searching in other files the name flash by, too fast to read. Only
+ display a name every second or so, like with ":vimgrep".
+7 When expanding file names with an environment variable, add the match with
+ the unexpanded var. So $HOME/tm expands to "/home/guy/tmp" and
+ "$HOME/tmp"
+8 When there is no word before the cursor but something like "sys." complete
+ with "sys.". Works well for C and similar languages.
+9 ^X^L completion doesn't repeat correctly. It uses the first match with
+ the last added line, instead of continuing where the last match ended.
+ (Webb)
+8 Add option to set different behavior for Insert mode completion:
+ - ignore/match case
+ - different characters than 'iskeyword'
+8 Add option 'isexpand', containing characters when doing expansion (so that
+ "." and "\" can be included, without changing 'iskeyword'). (Goldfarb)
+ Also: 'istagword': characters used for CTRL-].
+ When 'isexpand' or 'istagword' are empty, use 'iskeyword'.
+ Alternative: Use a pattern so that start and end of a keyword can be
+ defined, only allow dash in the middle, etc.
+8 Add a command to undo the completion, go back to the original text.
+7 Completion of an abbreviation: Can leave letters out, like what Instant
+ text does: www.textware.com
+8 Use the class information in the tags file to do context-sensitive
+ completion. After "foo." complete all member functions/variables of
+ "foo". Need to search backwards for the class definition of foo.
+ Should work for C++ and Java.
+ Even more context would be nice: "import java.^N" -> "io", "lang", etc.
+7 When expanding $HOME/dir with ^X^F keep the $HOME (with an option?).
+7 Add CTRL-X command in Insert mode like CTRL-X CTRL-N, that completes WORDS
+ instead of words.
+8 Add CTRL-X CTRL-R: complete words from register contents.
+8 Add completion of previously inserted texts (like what CTRL-A does).
+ Requires remembering a number of insertions.
+8 Add 'f' flag to 'complete': Expand file names.
+ Also apply 'complete' to whole line completion.
+- Add a flag to 'complete' to only scan local header files, not system
+ header files. (Andri Moell)
+- Make it possible to search include files in several places. Use the
+ 'path' option? Can this be done with the dictionary completion (use
+ wildcards in the file name)?
+- Make CTRL-X CTRL-K do a binary search in the dictionary (if it's sorted).
+- Speed up CTRL-X CTRL-K dictionary searching (don't use a regexp?).
+- Set a mark at the position where the match was found (file mark, could
+ be in another file).
+- Add CTRL-A command in CTRL-X mode: show all matches.
+- Make CTRL-X CTRL-L use the 'complete' option?
+- Add command in CTRL-X mode to add following words to the completed string
+ (e.g. to complete "Pointer->element" with CTRL-X CTRL-P CTRL-W CTRL-W)
+- CTRL-X CTRL-F: Use 'path' to find completions.
+- CTRL-X CTRL-F: Option to use forward slashes on MS-Windows?
+- CTRL-X CTRL-F: Don't replace "$VIM" with the actual value. (Kelly)
+- Allow listing all matches in some way (and picking one from the list).
+
+
+Command line editing:
+7 Add commands (keys) to delete from the cursor to the end of the command
+ line.
+8 Custom completion of user commands can't use the standard completion
+ functions. Add a hook to invoke a user function that returns the type of
+ completion to be done: "file", "tag", "custom", etc.
+- Add flags to 'whichwrap' for command line editing (cursor right at end of
+ lines wraps to start of line).
+- Make editing the command line work like Insert mode in a single-line view
+ on a buffer that contains the command line history. But this has many
+ disadvantages, only implement it when these can be solved. Elvis has run
+ into these, see remarks from Steve (~/Mail/oldmail/kirkendall/in.00012).
+ - Going back in history and editing a line there would change the history.
+ Would still need to keep a copy of the history elsewhere. Like the
+ cmdwin does now already.
+ - Use CTRL-O to execute one Normal mode command. How to switch to normal
+ mode for more commands? <Esc> should cancel the command line. CTRL-T?
+ - To allow "/" and "= need to recursively call getcmdline(), overwrite the
+ cmdline. But then we are editing a command-line again. How to avoid
+ that the user gets confused by the stack of command lines?
+ - Use edit() for normal cmdline editing? Would have to integrate
+ getcmdline() into edit(). Need to solve conflicts between Insert mode
+ and Command-line mode commands. Make it work like Korn shell and tcsh.
+ Problems:
+ - Insert: completion with 'wildchar'
+ - Insert: use cmdline abbreviations
+ - Insert: CTRL-D deletes indent instead of listing matches
+ - Normal: no CTRL-W commands
+ - Normal: no ":" commands?
+ - Normal: allow Visual mode only within one line.
+ - where to show insert/normal mode message? Change highlighting of
+ character in first column?
+ - Implementation ideas:
+ - Set "curwin" and "curbuf" to the command line window and buffer.
+ - curwin->w_topline is always equal to curwin->w_cursor.lnum.
+ - never set 'number', no folding, etc. No status line.
+ - sync undo after entering a command line?
+ - use NV_NOCL flag for commands that are not allowed in Command-line
+ Mode.
+
+
+Command line completion:
+- Feature request: Complete members of a dictionary.
+ (Luc Hermitte, 2017 Jan 4, #1350)
+- Completion of ":e" is ":earlier", should be ":edit". Complete to the
+ matching command instead of doing this alphabetically. (Mikel Jorgensen)
+8 Change expand_interactively into a flag that is passed as an argument.
+8 With command line completion after '%' and '#', expand current/alternate
+ file name, so it can be edited. Also with modifiers, such as "%:h".
+8 When completing command names, either sort them on the long name, or list
+ them with the optional part inside [].
+8 Add an option to ignore case when doing interactive completion. So that
+ ":e file<Tab>" also lists "Filelist" (sorted after matching case matches).
+7 Completion of ":map x ": fill in the current mapping, so that it can be
+ edited. (Sven Guckes)
+- For 'wildmenu': Simplify "../bar" when possible.
+- When using <Up> in wildmenu mode for a submenu, should go back to the
+ current menu, not the first one. E.g., ":emenu File.Save<Up>".
+8 When using backtick expansion, the external command may write a greeting
+ message. Add an option or commands to remove lines that match a regexp?
+7 When listing matches of files, display the common path separately from the
+ file names, if this makes the listing shorter. (Webb)
+- Add command line completion for ":ilist" and friends, show matching
+ identifiers (Webb).
+8 Add command line completion for "old value" of a command. ":args <key>"
+ would result in the current list of arguments, which you can then edit.
+7 Add command line completion with CTRL-X, just like Insert mode completion.
+ Useful for ":s/word/xx/".
+- Add command to go back to the text as it was before completion started.
+ Also to be used for <Up> in the command line.
+- Add 'wildlongest' option: Key to use to find longest common match for
+ command line completion (default CTRL-L), like 'wildchar'. (Cregut)
+ Also: when there are several matches, show them line a CTRL-D.
+- With 'wildmode' set to "longest:full,full" and pressing Tab once the first
+ entry in wildmenu is highlighted, that shouldn't happen. (Yuki Watanabe,
+ 2011 Feb 12)
+- After using <Tab> for command line completion after ":ta blah" and getting
+ E33 (no tags file), further editing the command to e.g., ":echo 'blah'",
+ the command is not executed. Fix by Ian Kelling?
+- Command line completion: Scanning for tags doesn't check for typed key now
+ and then? Hangs for about 5 seconds. Appears to be caused by finding
+ include files with "foo/**" in 'path'. (Kalisiak, 2006 July 15)
+ Additional info: When using the |wildcards| ** globing, vim hangs
+ indefinitely on lots of directories. The |file-searching| globing, like in
+ ":set path=/**" does not hang as often as with globing with |wildcards|,
+ like in ":1find /**/file". This is for files that unix "find" can find
+ very quickly. Merging the 2 kinds of globing might make this an easier
+ fix. (Ian Kelling, 2008 July 4)
+- Command line completion when 'cmdheight' is maximum and 'wildmenu' is set,
+ only one buffer line displayed, causes display errors.
+- Completing with 'wildmenu' and using <Up> and <Down> to move through
+ directory tree stops unexpectedly when using ":cd " and entering a
+ directory that doesn't contain other directories.
+8 Command line completion: buffers "foo.txt" and "../b/foo.txt", completing
+ ":buf foo<Tab>" doesn't find the second one. (George V. Reilly)
+8 Add more command line completion for :syntax.
+8 Add more command line completion for :highlight.
+- Wildmenu not deleted: "gvim -u NONE", ":set nocp wildmenu cmdheight=3
+ laststatus=2", CTRL-D CTRL-H CTRL-H CTRL-H. (A.Politz, 2008 April 1) Works
+ OK with Vim in an xterm.
+- If the variable "g:x#y#z" exists completion after ":echo g:x#" doesn't
+ work.
+
+
+Command line history:
+- Add "KeyWasTyped" flag: It's reset before each command and set when a
+ character from the keyboard is consumed. Value is used to decide to put a
+ command line in history or not. Put line in history if it didn't
+ completely result from one mapping.
+- When using ":browse", also put the resulting edit command in the history,
+ so that it can be repeated. (Demirel)
+
+
+Insert mode:
+9 When 'autoindent' is set, hitting <CR> twice, while there is text after
+ the cursor, doesn't delete the autoindent in the resulting blank line.
+ (Rich Wales) This is Vi compatible, but it looks like a bug.
+8 When using CTRL-O in Insert mode, then executing an insert command
+ "a" or "i", should we return to Insert mode after <Esc>? (Eggink)
+ Perhaps it can be allowed a single time, to be able to do
+ "<C-O>10axyz<Esc>". Nesting this further is confusing.
+ ":map <F2> 5aabc<Esc>" works only once from Insert mode.
+8 When using CTRL-G CTRL-O do like CTRL-\ CTRL-O, but when returning with
+ the cursor in the same position and the text didn't change continue the
+ same change, so that "." repeats the whole insert.
+7 Use CTRL-G <count> to repeat what follows. Useful for inserting a
+ character multiple times or repeating CTRL-Y.
+- Make 'revins' work in Replace mode.
+7 Use 'matchpairs' for 'showmatch': When inserting a character check if it
+ appears in the rhs of 'matchpairs'.
+- In Insert mode (and command line editing?): Allow undo of the last typed
+ character. This is useful for CTRL-U, CTRL-W, delete and backspace, and
+ also for characters that wrap to the next line.
+ Also: be able to undo CTRL-R (insert register).
+ Possibly use 'backspace'="whole" for a mode where at least a <CR> that
+ inserts autoindent is undone by a single <BS>.
+- Use CTRL-G in Insert mode for an extra range of commands, like "g" in
+ Normal mode.
+- Make 'paste' work without resetting other options, but override their
+ value. Avoids problems when changing files and modelines or autocommands
+ are used.
+- When typing CTRL-V and a digit higher than 2, only expect two digits.
+- Insert binary numbers with CTRL-V b.
+- Make it possible to undo <BS>, <C-W> and <C-U>. Bash uses CTRL-Y.
+
+
+'cindent', 'smartindent':
+9 Wrapping a variable initialization should have extra indent:
+ char * veryLongName =
+ "very long string"
+ Also check if "cino=+10" is used correctly.
+8 Lisp indenting: "\\" confuses the indenter. (Dorai Sitaram, 2006 May 17)
+8 Why are continuation lines outside of a {} block not indented? E.g.:
+ long_type foo =
+ value;
+8 Java: Inside an anonymous class, after an "else" or "try" the indent is
+ too small. (Vincent Bergbauer)
+ Problem of using {} inside (), 'cindent' doesn't work then.
+8 In C++ it's possible to have {} inside (): (Kirshna)
+ func(
+ new String[] {
+ "asdf",
+ "asdf"
+ }
+ );
+8 In C++ a function isn't recognized inside a namespace:
+ (Chow Loong Jin)
+ namespace {
+ int
+ func(int arg) {
+ }
+ }
+6 Add 'cino' flag for this function argument layout: (Spencer Collyer)
+ func( arg1
+ , arg2
+ , arg3
+ );
+7 Add separate "(0" option into inside/outside a function (Zellner):
+ func(
+ int x) // indent like "(4"
+ {
+ if (a
+ && b) // indent like "(0"
+9 Using "{" in a comment: (Helmut Stiegler)
+ if (a)
+ {
+ if (b)
+ {
+ // {
+ }
+ } <-- this is indented incorrect
+ Problem is that find_start_brace() checks for the matching brace to be in
+ a comment, but not braces in between. Requires adding a comment check to
+ findmatchlimit().
+- Make smartindenting configurable. Add 'sioptions', e.g. '#' setting the
+ indent to 0 should be switched on/off.
+7 Support ANSI style function header, with each argument on its own line.
+- "[p" and "]p" should use 'cindent' code if it's on (only for the first
+ line).
+- Add option to 'cindent' to set indent for comments outside of {}?
+- Make a command to line up a comment after a code line with a previous
+ comment after a code line. Can 'cindent' do this automatically?
+- When 'cindent'ing a '}', showmatch is done before fixing the indent. It
+ looks better when the indent is fixed before the showmatch. (Webb)
+- Add option to make indenting work in comments too (for commented-out
+ code), unless the line starts with "*".
+- Don't use 'cindent' when doing formatting with "gq"?
+- When formatting a comment after some text, insert the '*' for the new line
+ (indent is correct if 'cindent' is set, but '*' doesn't get inserted).
+8 When 'comments' has both "s1:/*,mb:*,ex:*/" and "s1:(*,mb:*,ex:*)", the
+ 'x' flag always uses the first match. Need to continue looking for more
+ matches of "*" and remember all characters that could end the comment.
+- For smartindent: When typing 'else' line it up with matching 'if'.
+- 'smartindent': allow patterns in 'cinwords', for e.g. TeX files, where
+ lines start with "\item".
+- Support this style of comments (with an option): (Brown)
+ /* here is a comment that
+ is just autoindented, and
+ nothing else */
+- Add words to 'cinwords' to reduce the indent, e.g., "end" or "fi".
+7 Use Tabs for the indent of starting lines, pad with spaces for
+ continuation lines. Allows changing 'tabstop' without messing up the
+ indents.
+ Patch by Lech Lorens, 2010 Mar. Update by James McCoy, 2014 Mar 15.
+
+
+Java:
+8 Can have {} constructs inside parens. Include changes from Steve
+ Odendahl?
+8 Recognize "import java.util.Vector" and use $CLASSPATH to find files for
+ "[i" commands and friends.
+- For files found with 'include': handle "*" in included name, for Java.
+ (Jason)
+- How to make a "package java.util" cause all classes in the package to be
+ searched? Also for "import java.util.*". (Mark Brophy)
+
+
+'comments':
+8 When formatting C comments that are after code, the "*" isn't repeated
+ like it's done when there is no code. And there is no automatic wrapping.
+ Recognize comments that come after code. Should insert the comment leader
+ when it's "#" or "//".
+ Other way around: when a C command starts with "* 4" the "*" is repeated
+ while it should not. Use syntax HL comment recognition?
+7 When using "comments=fg:--", Vim inserts three spaces for a new line.
+ When hitting a TAB, these spaces could be removed.
+7 The 'n'esting flag doesn't do the indenting of the last (rightmost) item.
+6 Make strings in 'comments' option a RE, to be able to match more
+ complicated things. (Phillipps) Use a special flag to indicate that a
+ regexp is used.
+8 Make the 'comments' option with "/* * */" lines only repeat the "*" line
+ when there is a "/*" before it? Or include this in 'cindent'?
+
+
+Virtual edit:
+8 Make the horizontal scrollbar work to move the text further left.
+7 Allow specifying it separately for Tabs and beyond end-of-line?
+
+
+Text objects:
+8 Add text object for fold, so that it can be yanked when it's open.
+8 Add test script for text object commands "aw", "iW", etc.
+8 Add text object for part of a CamelHumpedWord and under_scored_word.
+ (Scott Graham) "ac" and "au"?
+8 Add a text object for any kind of quoting, also with multibyte
+ characters. Option to specify what quotes are recognized (default: all)
+ use "aq" and "iq". Use 'quotepairs' to define pairs of quotes, like
+ 'matchpairs'?
+8 Add text object for any kind of parens, also multibyte ones.
+8 Add a way to make an ":omap" for a user-defined text object. Requires
+ changing the starting position in oap->start.
+8 Add "gp" and "gP" commands: insert text and make sure there is a single
+ space before it, unless at the start of the line, and after it, unless at
+ the end of the line or before a ".".
+7 Add objects with backwards extension? Use "I" and "A". Thus "2dAs"
+ deletes the current and previous sentence. (Jens Paulus)
+7 Add "g{" and "g}" to move to the first/last character of a paragraph
+ (instead of the line just before/after a paragraph as with "{" and "}").
+6 Ignore comment leaders for objects. Make "das" work in reply-email.
+5 Make it possible to use syntax group matches as a text object. For
+ example, define a "ccItem" group, then do "da<ccItem>" to delete one.
+ Or, maybe just define "dai", delete-an-item, to delete the syntax item the
+ cursor is on.
+
+
+Select mode:
+8 In blockwise mode, typed characters are inserted in front of the block,
+ backspace deletes a column before the block. (Steve Hall)
+7 Alt-leftmouse starts block mode selection in MS Word.
+ See http://vim.wikia.com/wiki/Use_Alt-Mouse_to_select_blockwise.
+7 Add Cmdline-select mode. Like Select mode, but used on the command line.
+ - Change gui_send_mouse_event() to pass on mouse events when 'mouse'
+ contains 'C' or 'A'.
+ - Catch mouse events in ex_getln.c. Also shift-cursor, etc., like in
+ normal_cmd().
+ - remember start and end of selection in cmdline_info.
+ - Typing text replaces the selection.
+
+
+Visual mode:
+8 Support using "." in Visual mode. Use the operator applied to the Visual
+ selection, if possible.
+- When dragging the Visual selection with the mouse and 'scrolloff' is zero,
+ behave like 'scrolloff' is one, so that the text scrolls when the pointer
+ is in the top line.
+- Displaying size of Visual area: use 24-33 column display.
+ When selecting multiple lines, up to about a screenful, also count the
+ characters.
+8 When using "I" or "A" in Visual block mode, short lines do not get the new
+ text. Make it possible to add the text to short lines too, with padding
+ where needed.
+7 With a Visual block selected, "2x" deletes a block of double the width,
+ "3y" yanks a block of triple width, etc.
+7 When selecting linewise, using "itext" should insert "text" at the start
+ of each selected line.
+8 What is "R" supposed to do in Visual mode?
+8 Make Visual mode local to the buffer. Allow changing to another buffer.
+ When starting a new Visual selection, remove the Visual selection in any
+ other buffer. (Ron Aaron)
+8 Support dragging the Visual area to drop it somewhere else. (Ron Aaron,
+ Ben Godfrey)
+7 Support dragging the Visual area to drop it in another program, and
+ receive dropped text from another program. (Ben Godfrey)
+7 With blockwise Visual mode and "c", "C", "I", "A", etc., allow the use of
+ a <CR>. The entered lines are repeated over the Visual area.
+7 Filtering a block should only apply to the block, not to the whole lines.
+ When the number of lines is increased, add lines. When decreased, pad with
+ spaces or delete? Use ":`<,`>" on the command line.
+8 After filtering the Visual area, make "gv" select the filtered text?
+ Currently "gv" only selects a single line, not useful.
+7 Don't move the cursor when scrolling? Needed when the selection should
+ stay the same. Scroll to the cursor at any movement command. With an
+ option!
+7 In Visual block mode, need to be able to define a corner on a position
+ that doesn't have text? Also: when using the mouse, be able to select
+ part of a TAB. Even more: Add a mode where the cursor can be on a screen
+ position where there is no text. When typing, add spaces to fill the gap.
+ Other solution: Always use curswant, so that you can move the cursor to
+ the right column, and then use up/down movements to select the line,
+ without changing the column.
+6 ":left" and ":right" should work in Visual block mode.
+7 CTRL-I and CTRL-O should work in Visual mode, but only jump to marks in the
+ current buffer.
+6 In non-Block mode, "I" should insert the same text in front of each line,
+ before the first non-blank, "gI" in column 1.
+6 In non-Block mode, "A" should append the same text after each line.
+6 When in blockwise visual selection (CTRL-V), allow cursor to be placed
+ right of the line. Could also allow cursor to be placed anywhere on a TAB
+ or other special character.
+6 Add commands to move selected text, without deselecting.
+
+
+More advanced repeating commands:
+- Add "." command for visual mode: redo last visual command (e.g. ":fmt").
+- Add command to repeat last movement. Including count.
+- Add "." command after operator: repeat last command of same operator. E.g.
+ "c." will repeat last change, also when "x" used since then (Webb).
+ "y." will repeat last yank.
+ "c2." will repeat the last but one change?
+ Also: keep history of Normal mode commands, add command to list the history
+ and/or pick an older command.
+- History stack for . command? Use "g." command.
+
+
+Mappings and Abbreviations:
+8 When "0" is mapped (it is a movement command) this mapping should not be
+ used after typing another number, e.g. "20l". (Charles Campbell)
+ Is this possible without disabling the mapping of the following command?
+8 Should mapping <C-A> and <C-S-A> both work?
+7 ":abbr b byte", append "b " to an existing word still expands to "byte".
+ This is Vi compatible, but can we avoid it anyway?
+8 To make a mapping work with a prepended "x to select a register, store the
+ last _typed_ register name and access it with "&.
+8 Add ":amap", like ":amenu".
+7 Add a mapping that works always, for remapping the keyboard.
+8 Add ":cab!", abbreviations that only apply to Command-line mode and not to
+ entering search strings.
+8 Add a flag to ":abbrev" to eat the character that triggers the
+ abbreviation. Thus "abb ab xxx" and typing "ab<Space>" inserts "xxx" and
+ not the <Space>.
+8 Give a warning when using CTRL-C in the lhs of a mapping. It will never
+ (?) work.
+7 Add <0x8f> (hex), <0o33> (octal) and <123> (decimal) to <> notation?
+7 When someone tries to unmap with a trailing space, and it fails, try
+ unmapping without the trailing space. Helps for ":unmap xx | unmap yy".
+6 Context-sensitive abbreviations: Specify syntax group(s) in which the
+ abbreviations are to be used.
+- Add mappings that take arguments. Could work like the ":s" command. For
+ example, for a mouse escape sequence:
+ :mapexp <Esc>{\([0-9]*\),\([0-9]*\); H\1j\2l
+- Add optional <Number> argument for mappings:
+ :map <Number>q ^W^W<Number>G
+ :map <Number>q<Number>t ^W^W<Number1-1>G<Number2>l
+ :map q<Char> :s/<Char>/\u\0/g
+ Or implicit:
+ :map q <Register>d<Number>$
+- Add command to repeat a whole mapping ("." only repeats the last change in
+ a mapping). Also: Repeat a whole insert command, including any mappings
+ that it included. Sort-of automatic recording?
+- Include an option (or flag to 'cpoptions') that makes errors in mappings
+ not flush the rest of the mapping (like nvi does).
+- Use context sensitiveness of completion to switch abbreviations and
+ mappings off for :unab and :unmap.
+6 When using mappings in Insert mode, insert characters for incomplete
+ mappings first, then remove them again when a mapping matches. Avoids
+ that characters that are the start of some mapping are not shown until you
+ hit another character.
+- Add mappings for replace mode: ":rmap". How do we then enter mappings for
+ non-replace Insert mode?
+- Add separate mappings for Visual-character/block/line mode?
+- Add 'mapstop' command, to stop recursive mappings.
+- List mappings that have a raw escape sequence both with the name of the key
+ for that escape sequence (if there is one) and the sequence itself.
+- List mappings: Once with special keys listed as <>, once with meta chars as
+ <M-a>, once with the byte values (octal?). Sort of "spell mapping" command?
+- When entering mappings: Add the possibility to enter meta keys like they
+ are displayed, within <>: <M-a>, <~@> or <|a>.
+- Allow multiple arguments to :unmap.
+- Command to show keys that are not used and available for mapping
+ ":freekeys".
+- Allow any character except white space in abbreviations lhs (Riehm).
+
+
+Incsearch:
+- Wrong scrolling when using incsearch. Patch by Christian Brabandt, 2014
+ Dec 4. Is this a good solution?
+- Temporarily open folds to show where the search ends up. Restore the
+ folds when going to another line.
+ Patch to open folds for 'incsearch'. (Christian Brabandt, 2015 Jan 6)
+- Bug with 'incsearch' going to wrong line. (Wolfram Kresse, 2009 Aug 17)
+ Only with "vim -u NONE".
+- When no match is found and the user types more, the screen is redrawn
+ anyway. Could skip that. Esp. if the line wraps and the text is scrolled
+ up every time.
+- When incsearch used and hitting return, no need to search again in many
+ cases, saves a lot of time in big files. (Slootman wants to work on this?)
+ When not using special characters, can continue search from the last match
+ (or not at all, when there was no match). See oldmail/webb/in.872.
+9 incsearch is incorrect for "/that/<Return>/this/;//" (last search pattern
+ isn't updated).
+
+
+Searching:
+9 Should have an option for :vimgrep to find lines without a match.
+8 Add "g/" and "gb" to search for a pattern in the Visually selected text?
+ "g?" is already used for rot13.
+ The vis.vim script has a ":S" command that does something like this.
+ Can use "g/" in Normal mode, uses the '< to '> area.
+ Use "&/" for searching the text in the Visual area?
+9 Add "v" offset: "/pat/v": search for pattern and start Visual mode on the
+ matching text.
+8 Add a modifier to interpret a space like "\_s\+" to make it much easier to
+ search for a phrase.
+8 Add a mechanism for recursiveness: "\@(([^()]*\@g[^()]*)\)". \@g stands
+ for "go recursive here" and \@( \) marks the recursive part.
+ Perl does it this way:
+ $paren = qr/ \(( [^()] | (??{ $paren }) )* \) /x;
+ Here $paren is evaluated when it's encountered. This is like a regexp
+ inside a regexp. In the above terms it would be:
+ \@((\([^()]\|\@g\)*)\)
+8 Show the progress every second. Could use the code that checks for CTRL-C
+ to find out how much time has passed. Or use SIGALRM. Where to show the
+ number?
+7 Support for approximate-regexps to find similar words (agrep
+ http://www.tgries.de/agrep/ tre: http://laurikari.net/tre/index.html).
+8 Add an item for a big character range, so that one can search for a
+ chinese character: \z[234-1234] or \z[XX-YY] or \z[0x23-0x234].
+7 Add an item stack to allow matching (). One side is "push X on
+ the stack if previous atom matched". Other side is "match with top of
+ stack, pop it when it matches". Use "\@pX" and "\@m"?
+ Example: \((\@p).\{-}\@m\)*
+7 Add a flag to "/pat/" to discard an error. Useful to continue a mapping
+ when a search fails. Could be "/pat/E" (e is already used for end offset).
+7 Add pattern item to use properties of Unicode characters. In Perl it's
+ "\p{L}" for a letter. See Regular Expression Pocket Reference.
+8 Would it be possible to allow ":23,45/pat/flags" to search for "pat" in
+ lines 23 to 45? Or does this conflict with Ex range syntax?
+8 Allow identical pairs in 'matchpairs'. Restrict the search to the current
+ line.
+7 Allow longer pairs in 'matchpairs'. Use matchit.vim as an
+ example.
+8 Make it possible to define the character that "%" checks for in
+ #if/#endif. For nmake it's !if/!endif.
+- For "%" command: set hierarchy for which things include other things that
+ should be ignored (like "*/" or "#endif" inside /* */).
+ Also: use "%" to jump from start to end of syntax region and back.
+ Alternative: use matchit.vim
+8 A pattern like "\([^a]\+\)\+" takes an awful long time. Recognize that
+ the recursive "\+" is meaningless and optimize for it.
+ This one is also very slow on "/* some comment */": "^\/\*\(.*[^/]\)*$".
+7 Recognize "[a-z]", "[0-9]", etc. and replace them with the faster "\l" and
+ "\d".
+7 Add a way to specify characters in <C-M> or <Key> form. Could be
+ \%<C-M>.
+8 Add an argument after ":s/pat/str/" for a range of matches. For example,
+ ":s/pat/str/#3-4" to replace only the third and fourth "pat" in a line.
+8 When 'iskeyword' is changed the matches from 'hlsearch' may change. (Benji
+ Fisher) redraw if some options are set while 'hlsearch' is set?
+8 Add an option not to use 'hlsearch' highlighting for ":s" and ":g"
+ commands. (Kahn) It would work like ":noh" is used after that command.
+ Also: An extra flag to do this once, and a flag to keep the existing
+ search pattern.
+- Make 'hlsearch' a local/global option, so that it can be disabled in some
+ of the windows.
+- Add \%h{group-name}; to search for a specific highlight group.
+ Add \%s{syntax-group}; to search for a specific syntax group.
+- Support Perl regexp. Use PCRE (Perl Compatible RE) package. (Shade)
+ Or translate the pattern to a Vim one.
+ Don't switch on with an option for typed commands/mappings/functions, it's
+ too confusing. Use "\@@" in the pattern, to avoid incompatibilities.
+8 Add a way to access the last substitute text, what is used for ":s//~/".
+ Can't use the ~ register, it's already used for drag & drop.
+- Remember flags for backreferenced items, so that "*" can be used after it.
+ Check with "\(\S\)\1\{3}". (Hemmerling)
+8 Flags that apply to the whole pattern.
+ This works for all places where a regexp is used.
+ Add "\q" to not store this pattern as the last search pattern?
+- Add flags to search command (also for ":s"?):
+ i ignore case
+ I use case
+ p use Perl regexp syntax (or POSIX?)
+ v use Vi regexp syntax
+ f forget pattern, don't keep it for "n" command
+ F remember pattern, keep it for "n" command
+ Perl uses these too:
+ e evaluate the right side as an expression (Perl only)
+ m multiple line expression (we don't need it)
+ o compile only once (Perl only)
+ s single line expression (we don't need it)
+ x extended regexp (we don't need it)
+ When used after ":g" command, backslash needed to avoid confusion with the
+ following command.
+ Add 'searchflags' for default flags (replaces 'gdefault').
+- Add command to display the last used substitute pattern and last used
+ pattern. (Margo) Maybe make it accessible through a register (like "/
+ for search string)?
+7 Use T-search algorithm, to speed up searching for strings without special
+ characters. See C't article, August 1997.
+- Add 'fuzzycase' option, so that case doesn't matter, and '-' and '_' are
+ equivalent (for Unix filenames).
+- Add 'v' flag to search command: enter Visual mode, with the matching text
+ as Visual area. (variation on idea from Bertin)
+- Searching: "/this//that/" should find "that" after "this".
+- Add global search commands: Instead of wrapping at the end of the buffer,
+ they continue in another buffer. Use flag after search pattern:
+ a for the next file in the argument list
+ f for file in the buffer list
+ w for file edited in a window.
+ e.g. "/pat/f". Then "n" and "N" work through files too. "f" flag also for
+ ":s/pat/foo/f"??? Then when 'autowrite' and 'hidden' are both not set, ask
+ before saving files: "Save modified buffer "/path/file"? (Yes/Hide/No
+ Save-all/hide-All/Quit) ".
+- ":s/pat/foo/3": find 3rd match of "pat", like sed. (Thomas Koehler)
+7 When searching with 'n' give message when getting back where the search
+ first started. Remember start of search in '/ mark.
+7 Add option that scrolls screen to put cursor in middle of screen after
+ search always/when off-screen/never. And after a ":tag" command. Maybe
+ specify how many lines below the screen causes a redraw with the cursor in
+ the middle (default would be half a screen, zero means always).
+6 Support multiple search buffers, so macros can be made without side
+ effects.
+7 From xvim: Allow a newline in search patterns (also for :s, can delete
+ newline). Add BOW, EOW, NEWL, NLORANY, NLBUTANY, magic 'n' and 'r', etc.
+ [not in xvim:] Add option to switch on matches crossing ONE line boundary.
+7 Add ":iselect", a combination of ":ilist" and ":tselect". (Aaron) (Zellner)
+ Also ":dselect".
+- Searching for \%'> does not find anything when using line Visual
+ selection. Probably because it's using MAXCOL. #8238
+- Regexp to search for duplicate lines does not work correctly:
+ /\(^.*\n\)\1 (Chris Morgan, #6239)
+- Problem with upwards search on Windows (works OK on Linux). (Brett
+ Stahlman, 2014 Jun 8)
+- Searching mixed with Visual mode doesn't redraw properly. (James Vega,
+ 2010 Nov 22)
+- Searching for composing char works, but not when inside []. (ZyX, Benjamin
+ R. Haskell, 2010 Aug 24)
+- When 'smartcase' is set and using CTRL-L to add to the search pattern it
+ may result in no matches. Convert chars to lower case? (Erik Wognsen,
+ 2009 Apr 16)
+
+
+Undo:
+9 ":gundo" command: global undo. Undoes changes spread over multiple files
+ in the order they were made. Also ":gredo". Both with a count. Useful
+ when tests fail after making changes and you forgot in which files.
+9 After undo/redo, in the message show whether the buffer is modified or
+ not.
+8 Search for pattern in undo tree, showing when it happened and the text
+ state, so that you can jump to it.
+8 Undo tree: visually show the tree somehow (Damian Conway)
+ Show only the leaves, indicating how many changed from the branch and the
+ timestamp?
+ Put branch with most recent change on the left, older changes get more
+ indent?
+- Make it possible to undo all the commands from a mapping, including a
+ trailing unfinished command, e.g. for ":map K iX^[r".
+- When accidentally hitting "R" instead of Ctrl-R, further Ctrl-R is not
+ possible, even when typing <Esc> immediately. (Grahn) Also for "i", "a",
+ etc. Postpone saving for undo until something is really inserted?
+8 When Inserting a lot of text, it can only be undone as a whole. Make undo
+ sync points at every line or word. Could recognize the start of a new
+ word (white space and then non-white space) and backspacing.
+ Can already use CTRL-G u, but that requires remapping a lot of things.
+8 Make undo more memory-efficient: Compare text before and after change,
+ only remember the lines that really changed.
+7 Add undo for a range of lines. Can change these back to a previous
+ version without changing the rest of the file. Stop doing this when a
+ change includes only some of these lines and changes the line count. Need
+ to store these undo actions as a separate change that can be undone.
+- For u_save() include the column number. This can be used to set '[ and '].
+ And in the future the undo can be made more efficient (Webb).
+- In out-of-memory situations: Free allocated space in undo, and reduce the
+ number of undo levels (with confirmation).
+- Instead of [+], give the number of changes since the last write: [+123].
+ When undoing to before the last write, change this to a negative number:
+ [-99].
+- With undo with simple line delete/insert: optimize screen updating.
+- When executing macro's: Save each line for undo only once.
+- When doing a global substitute, causing almost all lines to be changed,
+ undo info becomes very big. Put undo info in swap file??
+- MS-Windows: when writing undo file the infostreams are copied in
+ mch_copy_file_attribute(), that seems unnecessary. (#7925) Add a flag to
+ only copy attributes?
+- undo result wrong: Masato Nishihata, #4798
+- After recovering from a swap file the undofile should not be used, it
+ causes corruption. (#6631)
+- When the computer crashes while writing the undofile, the contents may be
+ lost. Write to a temp file, fsync and rename. (#8879)
+- Undo puts cursor in wrong line after "cG<Esc>" undo.
+- Undo history wrong when ":next file" re-uses a buffer. (#5426) ex_next()
+ should pass flag to do_argfile(), then to do_ecmd(). Is there a test for
+ this?
+- Add buffer argument to undotree(). (#4001)
+- Undo problem: "g-" doesn't go back, gets stuck. (Björn Linse, 2016 Jul 18)
+- Undo message is not always properly displayed. Patch by Ken Takata, 2013
+ oct 3. Doesn't work properly according to Yukihiro Nakadaira.
+ Also see #1635.
+- When using ":diffput" through a mapping, undo in the target buffer isn't
+ synced. (Ryan Carney, 2016 Sep 14)
+- The undo file name can get too long. (Issue 346)
+ For the path use a hash instead of dir%dir%dir%name hash%name.
+- Patch to add ":undorecover", get as much text out of the undo file as
+ possible. (Christian Brabandt, 2014 Mar 12, update Aug 22)
+- Patch to support :undo absolute jump to file save number. (Christian
+ Brabandt, 2010 Nov 5)
+- There should be a way after an abbreviation has expanded to go back to
+ what was typed. CTRL-G h ? Would also undo last word or line break
+ inserted perhaps. And undo CTRL-W. CTRL-G l would redo.
+- When using 'cryptmethod' xchaha20 the undo file is not encrypted.
+ Need to handle extra bytes.
+
+
+Buffer list:
+7 Command to execute a command in another buffer: ":inbuf {bufname} {cmd}".
+ Also for other windows: ":inwin {winnr} {cmd}". How to make sure that
+ this works properly for all commands, and still be able to return to the
+ current buffer/window? E.g.: ":inbuf xxx only".
+8 Add File.{recent-files} menu entries: Recently edited files.
+ Ron Aaron has a plugin for this: mru.vim.
+8 Unix: Check all uses of fnamecmp() and fnamencmp() if they should check
+ inode too.
+7 Add another number for a buffer, which is visible for the user. When
+ creating a new buffer, use the lowest number not in use (or the highest
+ number in use plus one?).
+7 Offer some buffer selection from the command line? Like using ":ls" and
+ asking for a buffer number. (Zachmann)
+- When starting to edit a file that is already in the buffer list, use the
+ file name argument for the new short file name. (Webb)
+- Add an option to make ":bnext" and ":bprev" wrap around the end of the
+ buffer list. Also for ":next" and ":prev"?
+7 Add argument to ":ls" which is a pattern for buffers to list.
+ E.g. ":ls *.c". (Thompson)
+7 Add expansion of buffer names, so that "*.c" is expanded to all buffer
+ names. Needed for ":bdel *.c", ":bunload *.c", etc.
+8 Support for <afile> where a buffer name is expected.
+7 Add an option to mostly use slashes in file names. Separately for
+ internal use and for when executing an external program?
+8 Some file systems are case-sensitive, some are not. Besides
+ 'wildignorecase' there might be more parts inside
+ CASE_INSENSITIVE_FILENAME that are useful on Unix.
+- When using ":bwipe!" also get rid of references to be buffer, e.g. in the
+ jumplist and alternate file.
+- ":bnext" in a help buffer is supposed to go to the next help buffer, but
+ it goes to any buffer, and then :bnext skips help buffers, since they are
+ unlisted. (#4478)
+- :buffer completion does not escape "+" properly and results in a regexp
+ error. (#5467)
+- Problem with two buffers with the same name a/b, if it didn't exist before
+ and is created outside of Vim. (dskloetg, 2018 Jul 16, #3219)
+- Add an option with file patterns, to be used when unloading a buffer: If
+ there is a match, remove entries for the buffer from marks, jumplist, etc.
+ To be used for git temp files.
+
+
+Swap (.swp) files:
+8 If writing to the swap file fails, should try to open one in another
+ directory from 'dir'. Useful in case the file system is full and when
+ there are short file name problems.
+8 Also use the code to try using a short file name for the backup and swap
+ file for the Win32 and Dos 32 bit versions.
+8 When a file is edited by root, add $LOGNAME to know who did su.
+8 When the edited file is a symlink, try to put the swap file in the same
+ dir as the actual file. Adjust FullName(). Avoids editing the same file
+ twice (e.g. when using quickfix). Also try to make the name of the backup
+ file the same as the actual file?
+ Use the code for resolve()?
+7 When using 64 bit inode numbers, also store the top 32 bits. Add another
+ field for this, using part of bo_fname[], to keep it compatible.
+7 When editing a file on removable media, should put swap file somewhere
+ else. Use something like 'r' flag in 'viminfo'. 'diravoid'?
+ Also: Be able to specify minimum disk space, skip directory when not
+ enough room.
+7 Add a configure check for which directory should be used: /tmp, /var/tmp
+ or /var/preserve.
+- Add an option to create a swap file only when making the first change to
+ the buffer. (Liang) Or only when the buffer is not read-only.
+- Add option to set "umask" for backup files and swap files (Antwerpen).
+ 'backupumask' and 'swapumask'? Or 'umaskbackup' and 'umaskswap'?
+- When editing a readonly file, don't use a swap file but read parts from the
+ original file. Also do this when the file is huge (>'maxmem'). We do
+ need to load the file once to count the number of lines? Perhaps keep a
+ cached list of which line is where.
+- When editing a file with ":edit" the output of :swapname is relative,
+ while editing it with "vim file" it is absolute. (#355) Which one should
+ it be?
+- When recovering a file, put the swap file name in b:recovered_swapfile.
+ Then a command can delete it.
+- In the ATTENTION message about an existing swap file, mention the name of
+ the process that is running. It might actually be some other program,
+ e.g. after a reboot.
+- When running Vim in silent ex mode, an existing swapfile causes Vim to
+ wait for a user action without a prompt. (Maarten Billemont, 2012 Feb 3)
+ Do give the prompt? Quit with an error?
+- After doing "su" $HOME can be the old user's home, thus ~root/file is not
+ correct. Don't use it in the swap file.
+- In the swapfile dialog, add a H(elp) option that gives more info about
+ what each choice does. Similar to ":help swap-exists-choices"
+
+
+Viminfo:
+7 Can probably remove the code that checks for a writable viminfo file,
+ because we now do the chown() for root, and others can't overwrite someone
+ else's viminfo file.
+8 When there is no .viminfo file and someone does "su", runs Vim, a
+ root-owned .viminfo file is created. Is there a good way to avoid this?
+ Perhaps check the owner of the directory. Only when root?
+8 Add argument to keep the list of buffers when Vim is started with a file
+ name. (Schild)
+8 Keep the last used directory of the file browser (File/Open menu).
+8 Remember the last used register for "@@".
+8 Remember the redo buffer, so that "." works after restarting.
+8 Remember a list of last accessed files. To be used in the
+ "File.Open Recent" menu. Default is to remember 10 files or so.
+ Also remember which files have been read and written. How to display
+ this?
+7 Also store the ". register (last inserted text).
+7 Make it possible to store buffer names in viminfo file relative to some
+ directory, to make them portable over a network. (Aaron)
+6 Store a snapshot of the currently opened windows. So that when quitting
+ Vim, and then starting again (without a file name argument), you see the
+ same files in the windows. Use ":mksession" code?
+- Make marks present in .viminfo usable as file marks: Display a list of
+ "last visited files" and select one to jump to.
+- Add the debug command line history to viminfo.
+- Using "wviminfo /tmp/viminfo" does not store file marks that Vim knows
+ about, it only works when merging with an existing file. (Shougo, 2017
+ Jun 19, #1781)
+- Writing nested List and Dict in viminfo gives error message and can't be
+ read back. (Yukihiro Nakadaira, 2010 Nov 13)
+- When a register contains illegal bytes, writing viminfo in utf-8 and
+ reading it back doesn't result in utf-8. (Devin Bayer)
+8 With 'viminfo' set such that the ".viminfo" file is written on a FAT
+ filesystem, an illegal file name may be created: ".vim".
+8 For each buffer that is opened, the viminfo file is opened and read to
+ check for file marks. This can be slow.
+8 When write_viminfo() is used while there are many orphaned viminfo
+ tempfiles writing the viminfo file fails. Give a clear error message so
+ that the user knows the files have to be deleted.
+
+
+Modelines:
+8 Before trying to execute a modeline, check that it looks like one (valid
+ option names). If it's very wrong, silently ignore it.
+ Ignore a line that starts with "Subject: ".
+- Add an option to whitelist options that are allowed in a modeline. This
+ would allow careful users to use modelines, e.g., only allowing
+ 'shiftwidth'.
+- Add an option to let modelines only set local options, not global ones
+ such as 'encoding'.
+- When an option value is coming from a modeline, do not carry it over to
+ another edited file? Would need to remember the value from before the
+ modeline setting.
+- Allow setting a variable from a modeline? Only allow using fixed strings,
+ no function calls, to avoid a security problem.
+- Allow ":doauto BufRead x.cpp" in modelines, to execute autocommands for
+ .cpp files.
+- Support the "abbreviate" command in modelines (Kearns). Careful for
+ characters after <Esc>, that is a security leak.
+- Add an option setting to ask the user if the modelines are to be executed
+ or not. Same for .exrc in local dir.
+
+
+Sessions:
+- Session file contains absolute paths when "curdir" is removed form
+ 'sessionoptions', making it impossible to have a session with a relative
+ path. (#4450)
+- Session file only contains local option values for buffers that are in a
+ window, not other buffers. (#7532)
+- Script generated by :mksession does not work well if there are windows
+ with modified buffers:
+ change "silent only" into "silent only!"
+ change "edit fname" of first buffer to "hide edit fname"
+ skip "badd fname" if "fname" is already in the buffer list
+ remove remark about unloading buffers from documentation
+- When session file has name in argument list but the buffer was deleted,
+ the buffer is not deleted when using the session file. (#1393) Should add
+ the buffer in hidden state.
+- When a session file is created and there are "nofile" buffers, these are
+ not filled. Need to trigger BufReadCmd autocommands. Also handle
+ deleting the initial empty buffer better. (ZyX, 2015 March 8)
+- Setting the spell file in a session only reads the local additions, not
+ the normal spell file. (Enno Nagel, 2014 Mar 29)
+- Directory wrong in session file, caused by ":lcd" in BufEnter autocommand.
+ (Felix Kater, 2009 Mar 3)
+- Something wrong with session that has "cd" commands and "badd", in such a
+ way that Vim doesn't find the edited file in the buffer list, causing the
+ ATTENTION message? (Tony Mechelynck, 2008 Dec 1) Also: swap files are in
+ ~/tmp/ One has relative file name ".mozilla/...".
+- Session file creation: 'autochdir' causes trouble. Keep it off until
+ after loading all files.
+- Session file generates error upon loading, cause by --remote-silent-tab.
+ (7tommm (ytommm) 2010 Nov 24)
+8 DOS/Windows: ":mksession" generates a "cd" command where "aa\#bb" means
+ directory "#bb" in "aa", but it's used as "aa#bb". (Ronald Hoellwarth)
+7 When there is a "help.txt" window in a session file, restoring that
+ session will not get the "LOCAL ADDITIONS" back.
+8 With ":mksession" always store the 'sessionoptions' option, even when
+ "options" isn't in it. (St-Amant)
+8 When using ":mksession", also store a command to reset all options to
+ their default value, before setting the options that are not at their
+ default value.
+7 With ":mksession" also store the tag stack and jump history. (Michal
+ Malecki)
+
+
+Options:
+7 ":with option=value | command": temporarily set an option value and
+ restore it after the command has executed.
+8 Make "old" number options that really give a number of effects into string
+ options that are a comma-separated list. The old number values should
+ also be supported.
+8 Add commands to save and restore an option, which also preserves the flag
+ that marks if the option was set. Useful to keep the effect of setting
+ 'compatible' after ":syntax on" has been used.
+7 There is 'titleold', why is there no 'iconold'? (Chazelas)
+
+
+External commands:
+8 When filtering text, redirect stderr so that it can't mess up the screen
+ and Vim doesn't need to redraw it. Also for ":r !cmd".
+4 Set separate shell for ":sh", piping "range!filter", reading text "r !ls"
+ and writing text "w !wc". (Deutsche) Allow arguments for fast start (e.g.
+ -f).
+4 Allow direct execution, without using a shell.
+4 Run an external command in the background. But how about I/O in the GUI?
+ Careful: don't turn Vim into a shell!
+4 Add feature to disable using a shell or external commands.
+
+
+Multiple Windows:
+7 "vim -oO file ..." use both horizontal and vertical splits.
+8 Add CTRL-W T: go to the top window in the column of the current window.
+ And CTRL-W B: go to bottom window.
+7 Use CTRL-W <Tab>, like alt-tab, to switch between buffers. Repeat <Tab>
+ to select another buffer (only loaded ones?), <BS> to go back, <Enter> to
+ select buffer, <Esc> to go back to original buffer.
+7 Make it possible to edit a new buffer in the preview window. A script can
+ then fill it with something. ":popen"?
+7 Add a 'tool' window: behaves like a preview window but there can be
+ several. Don't count it in only_one_window(). (Alexei Alexandrov)
+6 Add an option to resize the shell when splitting and/or closing a window.
+ ":vsp" would make the shell wider by as many columns as needed for the new
+ window. Specify a maximum size (or use the screen size). ":close" would
+ shrink the shell by as many columns as come available. (Demirel)
+7 When starting Vim several times, instantiate a Vim server, that allows
+ communication between the different Vims. Feels like one Vim running with
+ multiple top-level windows. Esp. useful when Vim is started from an IDE
+ too. Requires some form of inter process communication.
+- Support a connection to an external viewer. Could call the viewer
+ automatically after some seconds of non-activity, or with a command.
+ Allow some way of reporting scrolling and cursor positioning in the viewer
+ to Vim, so that the link between the viewed and edited text can be made.
+
+
+Marks:
+8 Add ten marks for last changed files: ':0, ':1, etc. One mark per file.
+8 When cursor is first moved because of scrolling, set a mark at this
+ position. (Rimon Barr) Use '-.
+8 Add a command to jump to a mark and make the motion inclusive. g'm and g`m?
+8 The '" mark is set to the first line, even when doing ":next" a few times.
+ Only set the '" mark when the cursor was really moved in a file.
+8 Make `` and '', which would position the new cursor position in the middle
+ of the window, restore the old topline (or relative position) from when
+ the mark was set.
+7 Make a list of file marks in a separate window. For listing all buffers,
+ matching tags, errors, etc. Normal commands to move around. Add commands
+ to jump to the mark (in current window or new window). Start it with
+ ":browse marks"?
+6 Add a menu that lists the Marks like ":marks". (Amerige)
+7 For ":jumps", ":tags" and ":marks", for not loaded buffers, remember the
+ text at the mark. Highlight the column with the mark.
+7 Highlight each mark in some way (With "Mark" highlight group).
+ Or display marks in a separate column, like 'number' does.
+7 Use d"m to delete rectangular area from cursor to mark m (like Vile's \m
+ command).
+7 Try to keep marks in the same position when:
+ - replacing with a line break, like in ":s/pat/^M/", move marks after the
+ line break column to the next line. (Acevedo)
+ - inserting/deleting characters in a line.
+5 Include marks for start/end of the current word and section. Useful in
+ mappings.
+6 Add "unnamed mark" feature: Like marks for the ":g" command, but place and
+ unplace them with commands before doing something with the lines.
+ Highlight the marked lines somehow.
+
+
+Digraphs:
+7 Make "ga" show the keymap for a character, if it exists.
+ Also show the code of the character after conversion to 'fileencoding'.
+- Use digraph table to tell Vim about the collating sequence of special
+ characters?
+8 Add command to remove one or more (all) digraphs. (Brown)
+7 Support different sets of digraphs (depending on the character set?). At
+ least Latin1/Unicode, Latin-2, MS-DOS (esp. for Win32).
+
+
+Writing files:
+- In vim_rename(), should lock "from" file when deleting "to" file for
+ systems other than Amiga. Avoids problems with unexpected longname to
+ shortname conversion.
+8 write mch_isdevice() for Amiga, Mac, VMS, etc.
+8 When appending to a file, Vim should also make a backup and a 'patchmode'
+ file.
+8 'backupskip' doesn't write a backup file at all, a bit dangerous for some
+ applications. Add 'backupelsewhere' to write a backup file in another
+ directory? Or add a flag to 'backupdir'?
+6 Add an option to write a new, numbered, backup file each time. Like
+ 'patchmode', e.g., 'backupmode'.
+6 Make it possible to write 'patchmode' files to a different directory.
+ E.g., ":set patchmode=~/backups/*.orig". (Thomas)
+6 Add an option to prepend something to the backup file name. E.g., "#".
+ Or maybe allow a function to modify the backup file name?
+8 Only make a backup when overwriting a file for the first time. Avoids
+ losing the original when writing twice. (Slootman)
+7 On non-Unix machines, also overwrite the original file in some situations
+ (file system full, it's a link on an NFS partition).
+7 When editing a file, check that it has been changed outside of Vim more
+ often, not only when writing over it. E.g., at the time the swap file is
+ flushed. Or every ten seconds or so (use the time of day, check it before
+ waiting for a character to be typed).
+8 When a file was changed since editing started, show this in the status
+ line of the window, like "[time]".
+ Make it easier to reload all outdated files that don't have changes.
+ Automatic and/or with a command.
+
+
+Substitute:
+8 Substitute with hex/unicode number "\%xff" and "\%uabcd". Just like
+ "\%uabcd" in search pattern.
+8 Make it easier to replace in all files in the argument list. E.g.:
+ ":argsub/oldword/newword/". Works like ":argdo %s/oldword/newword/g|w".
+- :s///p prints the line after a substitution.
+- With :s///c replace \&, ~, etc. when showing the replacement pattern.
+8 With :s///c allow scrolling horizontally when 'nowrap' is effective.
+ Also allow a count before the scrolling keys.
+- Add number option to ":s//2": replace second occurrence of string? Or:
+ :s///N substitutes N times.
+- Add answers to ":substitute" with 'c' flag, used in a ":global", e.g.:
+ ":g/pat1/s/pat2/pat3/cg": 'A' do all remaining replacements, 'Q' don't do
+ any replacements, 'u' undo last substitution.
+7 Substitute in a block of text. Use {line}.{column} notation in an Ex
+ range, e.g.: ":1.3,$.5s" means to substitute from line 1 column 3 to the
+ last line column 5.
+5 Add commands to bookmark lines, display bookmarks, remove bookmarks,
+ operate on lines with bookmarks, etc. Like ":global" but with the
+ possibility to keep the bookmarks and use them with several commands.
+ (Stanislav Sitar)
+
+
+Mouse support:
+8 Add 'o' flag to 'mouse'?
+7 Be able to set a 'mouseshape' for the popup menu.
+8 Add 'mouse' flag, which sets a behavior like Visual mode, but automatic
+ yanking at the button-up event. Or like Select mode, but typing gets you
+ out of Select mode, instead of replacing the text. (Bhaskar)
+- Implement mouse support for the Amiga console.
+- Using right mouse button to extend a blockwise selection should attach to
+ the nearest corner of the rectangle (four possible corners).
+- Precede mouse click by a number to simulate double clicks?!?
+- When mouse click after 'r' command, get character that was pointed to.
+
+
+Argument list:
+6 Add command to put all filenames from the tag files in the argument list.
+ When given an argument, only use the files where that argument matches
+ (like `grep -l ident`) and jump to the first match.
+6 Add command to form an args list from all the buffers?
+
+
+Registers:
+8 Don't display empty registers with ":display". (Etienne)
+8 Add put command that overwrites existing text. Should also work for
+ blocks. Useful to move text around in a table. Works like using "R ^R r"
+ for every line.
+- When appending to a register, also report the total resulting number of
+ lines. Or just say "99 more lines yanked", add the "more".
+- When inserting a register in Insert mode with CTRL-R, don't insert comment
+ leader when line wraps?
+- The ":@r" commands should take a range and execute the register for each
+ line in the range.
+- Add "P" command to insert contents of unnamed register, move selected text
+ to position of previous deleted (to swap foo and bar in " + foo")
+8 Should be able to yank and delete into the "/ register.
+ How to take care of the flags (offset, magic)?
+- In Select mode the deleted text always goes into the unnamed register.
+ Use CTRL-R to specify the register to use. (#9531)
+- When "+ register is set then "" points to it. If another Vim grabs the "+
+ register, then "" doesn't contain anything. Make it still follow "+.
+ (#6435)
+- Pasting a register in Visual mode cannot be repeated. (Mahmoud Al-Qudsi,
+ 2018 Apr 26, #2849)
+- Patch to add option that tells whether small deletes go into the numbered
+ registers. (Aryeh Leib Taurog, 2013 Nov 18)
+- With "unamedplus" in 'clipboard' pasting in Visual mode causes error for
+ empty register. (Michael Seiwald, 2011 Jun 28) I can't reproduce it.
+- Consider making YankRing or something else that keeps a list of yanked
+ text part of standard Vim. The "1 to "9 registers are not sufficient.
+6 When yanking into the unnamed registers several times, somehow make the
+ previous contents also available (like it's done for deleting). What
+ register names to use? g"1, g"2, etc.?
+ Also do this for the small delete register "-.
+
+
+Debug mode:
+8 Add breakpoints for setting an option
+8 Add breakpoints for assigning to a variable.
+7 Store the history from debug mode in viminfo.
+7 Make the debug mode history available with histget() et al.
+- In debug mode, using CTRL-R = to evaluate a function causes stepping
+ through the function. (Hari Krishna Dara, 2006 Jun 28)
+
+
+Various improvements:
+7 Add plugins for formatting? Should be able to make a choice depending on
+ the language of a file (English/Korean/Japanese/etc.).
+ Setting the 'langformat' option to "chinese" would load the
+ "format/chinese.vim" plugin.
+ The plugin would set 'formatexpr' and define the function being called.
+ Edward L. Fox explains how it should be done for most Asian languages.
+ (2005 Nov 24)
+ Alternative: patch for utf-8 line breaking. (Yongwei Wu, 2008 Feb 23)
+7 [t to move to previous xml/html tag (like "vatov"), ]t to move to next
+ ("vatv").
+7 [< to move to previous xml/html tag, e.g., previous <li>. ]< to move to
+ next <li>, ]< to next </li>, [< to previous </li>.
+8 Add ":rename" command: rename the file of the current buffer and rename
+ the buffer. Buffer may be modified.
+7 Instead of filtering errors with a shell script it should be possible to
+ do this with Vim script. A function that filters the raw text that comes
+ from the 'makeprg'?
+- Add %b to 'errorformat': buffer number. (Yegappan Lakshmanan / Suresh
+ Govindachar)
+7 Allow a window not to have a statusline. Makes it possible to use a
+ window as a buffer-tab selection.
+8 Allow non-active windows to have a different statusline. (Yakov Lerner)
+7 Add an invisible buffer which can be edited. For use in scripts that want
+ to manipulate text without changing the window layout.
+8 Add a command to revert to the saved version of file; undo or redo until
+ all changes are gone.
+6 "vim -q -" should read the list of errors from stdin. (Gautam Mudunuri)
+8 Add "--remote-fail": When contacting the server fails, exit Vim.
+ Add "--remote-self": When contacting the server fails, do it in this Vim.
+ Overrules the default of "--remote-send" to fail and "--remote" to do it
+ in this Vim.
+8 When Vim was started without a server, make it possible to start one, as
+ if the "--servername" argument was given. ":startserver <name>"?
+8 No address range can be used before the command modifiers. This makes
+ them difficult to use in a menu for Visual mode. Accept the range and
+ have it apply to the following command.
+8 Add the possibility to set 'fileformats' to force a format and strip other
+ CR characters. For example, for "dos" files remove CR characters at the
+ end of the line, so that a file with mixed line endings is cleaned up.
+ To just not display the CR characters: Add a flag to 'display'?
+7 Some compilers give error messages in which the file name does not have a
+ path. Be able to specify that 'path' is used for these files.
+7 Xterm sends <Esc>O3F for <M-End>. Similarly for other <M-Home>, <M-Left>,
+ etc. Combinations of Alt, Ctrl and Shift are also possible. Recognize
+ these to avoid inserting the raw byte sequence, handle like the key
+ without modifier (unless mapped).
+6 Add "gG": like what "gj" is to "j": go to the N'th window line.
+8 Add command like ":normal" that accepts <Key> notation like ":map".
+9 Support ACLs on more systems.
+7 Add ModeMsgVisual, ModeMsgInsert, etc. so that each mode message can be
+ highlighted differently.
+7 Add a message area for the user. Set some option to reserve space (above
+ the command line?). Use an ":echouser" command to display the message
+ (truncated to fit in the space).
+7 Add %s to 'keywordprg': replace with word under the cursor. (Zellner)
+8 Support printing on Unix. Can use "lpansi.c" as an example. (Bookout)
+8 Add put command that replaces the text under it. Esp. for blockwise
+ Visual mode.
+7 Enhance termresponse stuff: Add t_CV(?): pattern of term response, use
+ regexp: "\e\[[>?][0-9;]*c", but only check just after sending t_RV.
+7 Add "g|" command: move to N'th column from the left margin (after wrapping
+ and applying 'leftcol'). Works as "|" like what "g0" is to "0".
+7 Support setting 'equalprg' to a user function name.
+7 Highlight the characters after the end-of-line differently.
+7 When 'whichwrap' contains "l", "$dl" should join lines?
+8 Add an argument to configure to use $CFLAGS and not modify it? (Mooney)
+8 Enabling features is a mix of configure arguments and defines in
+ feature.h. How to make this consistent? Feature.h is required for
+ non-unix systems. Perhaps let configure define CONF_XXX, and use #ifdef
+ CONF_XXX in feature.h? Then what should min-features and max-features do?
+8 Add "g^E" and "g^Y", to scroll a screen-full line up and down.
+8 Add ":confirm" handling in open_exfile(), for when file already exists.
+8 When quitting with changed files, make the dialog list the changed file
+ and allow "write all", "discard all", "write some". The last one would
+ then ask "write" or "discard" for each changed file. Patch in HierAssist
+ does something like this. (Shah)
+7 Use growarray for replace stack.
+7 Have a look at viH (Hellenic or Greek version of Vim). But a solution
+ outside of Vim might be satisfactory (Haritsis).
+3 Make "2d%" work like "d%d%" instead of "d2%"?
+7 "g CTRL-O" jumps back to last used buffer. Skip CTRL-O jumps in the same
+ buffer. Make jumplist remember the last ten accessed buffers?
+7 Make it possible to set the size of the jumplist (also to a smaller number
+ than the default). (Nikolai Weibull)
+- Add code to disable the CAPS key when going from Insert to Normal mode.
+- Set date/protection/etc. of the patchfile the same as the original file.
+- Use growarray for termcodes[] in term.c
+- Add <window-99>, like <cword> but use filename of 99'th window.
+7 Add a way to change an operator to always work characterwise-inclusive
+ (like "v" makes the operator characterwise-exclusive). "x" could be used.
+- Make a set of operations on list of names: expand wildcards, replace home
+ dir, append a string, delete a string, etc.
+- Remove using mktemp() and use tmpname() only? Ctags does this.
+- When replacing environment variables, and there is one that is not set,
+ turn it into an empty string? Only when expanding options? (Hiebert)
+- Option to set command to be executed instead of producing a beep (e.g. to
+ call "play newbeep.au").
+- Add option to show the current function name in the status line. More or
+ less what you find with "[[k", like how 'cindent' recognizes a function.
+ (Bhatt).
+- "[r" and "]r": like "p" and "P", but replace instead of insert (esp. for
+ blockwise registers).
+- Add 'timecheck' option, on by default. Makes it possible to switch off the
+ timestamp warning and question. (Dodt).
+- Add an option to set the time after which Vim should check the timestamps
+ of the files. Only check when an event occurs (e.g., character typed,
+ mouse moved). Useful for non-GUI versions where keyboard focus isn't
+ noticeable.
+- Make 'smartcase' work even though 'ic' isn't set (Webb).
+7 When formatting text, allow to break the line at a number of characters.
+ Use an option for this: 'breakchars'? Useful for formatting Fortran code.
+- Add flag to 'formatoptions' to be able to format book-style paragraphs
+ (first line of paragraph has larger indent, no empty lines between
+ paragraphs). Complements the '2' flag. Use '>' flag when larger indent
+ starts a new paragraph, use '<' flag when smaller indent starts a new
+ paragraph. Both start a new paragraph on any indent change.
+8 The 'a' flag in 'formatoptions' is too dangerous. In some way only do
+ auto-formatting in specific regions, e.g. defined by syntax highlighting.
+8 Allow using a trailing space to signal a paragraph that continues on the
+ next line (MIME text/plain; format=flowed, RFC 2646). Can be used for
+ continuous formatting. Could use 'autoformat' option, which specifies a
+ regexp which triggers auto-formatting (for one line).
+ ":set autoformat=\\s$".
+- Be able to redefine where a sentence stops. Use a regexp pattern?
+- Support multibyte characters for sentences. Example from Ben Peterson.
+7 Add command "g)" to go to the end of a sentence, "g(" to go back to the
+ end of a sentence. (Servatius Brandt)
+- Be able to redefine where a paragraph starts. For "[[" where the '{' is
+ not in column 1.
+6 Add ":cdprev": go back to the previous directory. Need to remember a
+ stack of previous directories. We also need ":cdnext".
+7 Should ":cd" for MS-DOS go to $HOME, when it's defined?
+- Make "gq<CR>" work on the last line in the file. Maybe for every operator?
+- Add more redirecting of Ex commands:
+ :redir #> bufname
+ :redir #>> bufname (append)
+- Give error message when starting :redir: twice or using END when no
+ redirection was active.
+- Setting of options, specifically for a buffer or window, with
+ ":set window.option" or ":set buffer.option=val". Or use ":buffer.set".
+ Also: "buffer.map <F1> quit".
+6 Would it be possible to change the color of the cursor in the Win32
+ console? (Klaus Hast)
+- Add :delcr command:
+ *:delcr*
+ :[range]delcr[!] Check [range] lines (default: whole buffer) for lines
+ ending in <CR>. If all lines end in <CR>, or [!] is
+ used, remove the <CR> at the end of lines in [range].
+ A CTRL-Z at the end of the file is removed. If
+ [range] is omitted, or it is the whole file, and all
+ lines end in <CR> 'textmode' is set.
+- Should integrate addstar() and file_pat_to_reg_pat().
+- When working over a serial line with 7 bit characters, remove meta
+ characters from 'isprint'.
+- Use fchdir() in init_homedir(), like in FullName().
+- In win_update(), when the GUI is active, always use the scrolling area.
+ Avoid that the last status line is deleted and needs to be redrawn.
+- That "cTx" fails when the cursor is just after 'x' is Vi compatible, but
+ may not be what you expect. Add a flag in 'cpoptions' for this? More
+ general: Add an option to allow "c" to work with a null motion.
+- Give better error messages by using errno (strerror()).
+- Give "Usage:" error message when command used with wrong arguments (like
+ Nvi).
+- Make 'restorescreen' option also work for xterm (and others), replaces the
+ SAVE_XTERM_SCREEN define.
+7 Support for ":winpos" In xterm: report the current window position.
+- Give warning message when using ":set t_xx=asdf" for a termcap code that
+ Vim doesn't know about. Add flag in 'shortmess'?
+6 Add ":che <file>", list all the include paths which lead to this file.
+- For a commandline that has several commands (:s, :d, etc.) summarize the
+ changes all together instead of for each command (e.g. for the rot13
+ macro).
+- Add command like "[I" that also shows the tree of included files.
+- ":set sm^L" results in ":set s", because short names of options are also
+ expanded. Is there a better way to do this?
+- Add ":@!" command, to ":@" like what ":source!" is to ":source".
+8 Add ":@:!": repeat last command with forceit set.
+- Add 't_normal': Used whenever t_me, t_se, t_ue or t_Zr is empty.
+- ":cab map test ^V| je", ":cunab map" doesn't work. This is vi compatible!
+- CTRL-W CTRL-E and CTRL-W CTRL-Y should move the current window up or down
+ if it is not the first or last window.
+- Include-file-search commands should look in the loaded buffer of a file (if
+ there is one) instead of the file itself.
+7 Change 'nrformats' to include the leader for each format. Example:
+ nrformats=hex:$,binary:b,octal:0
+ Add setting of 'nrformats' to syntax files.
+- 'path' can become very long, don't use NameBuff for expansion.
+- When unhiding a hidden buffer, put the same line at top of the window as
+ the one before hiding it. Or: keep the same relative cursor position (so
+ many percent down the windows).
+- Make it possible for the 'showbreak' to be displayed at the end of the
+ line. Use a comma to separate the part at the end and the start of the
+ line? #754 Highlight the linebreak characters, add flag in 'highlight'.
+ Make 'showbreak' local to a window.
+- Some string options should be expanded if they have wildcards, e.g.
+ 'dictionary' when it is "*.h".
+- Use a specific type for number and boolean options, making it possible to
+ change it for specific machines (e.g. when a long is 64 bit).
+- Add option for <Insert> in replace mode going to normal mode. (Nugent)
+- Add a next/previous possibility to "[^I" and friends.
+- Add possibility to change the HOME directory. Use the directory from the
+ passwd file? (Antwerpen)
+8 Add commands to push and pop all or individual options. ":setpush tw",
+ ":setpop tw", ":setpush all". Maybe pushing/popping all options is
+ sufficient. ":setflush" resets the option stack?
+ How to handle an aborted mapping? Remember position in tag stack when
+ mapping starts, restore it when an error aborts the mapping?
+- Change ":fixdel" into option 'fixdel', t_del will be adjusted each time
+ t_bs is set? (Webb)
+- "gc": goto character, move absolute character positions forward, also
+ counting newlines. "gC" goes backwards (Weigert).
+- When doing CTRL-^, redraw buffer with the same topline. (Demirel) Store
+ cursor row and window height to redraw cursor at same percentage of window
+ (Webb).
+- Besides remembering the last used line number of a file, also remember the
+ column. Use it with CTRL-^ et. al.
+- Check for non-digits when setting a number option (careful when entering
+ hex codes like 0xff).
+- Add option to make "." redo the "@r" command, instead of the last command
+ executed by it. Also to make "." redo the whole mapping. Basically: redo
+ the last TYPED command.
+- Support URL links for ^X^F in Insert mode, like for "gf".
+- Support %name% expansion for "gf" on Windows.
+- Make "gf" work on "file://c:/path/name". "file:/c:/" and "file:///c:/"
+ should also work?
+- Add 'urlpath', used like 'path' for when "gf" used on a URL?
+8 When using "gf" on an absolute file name, while editing a remote file
+ (starts with scp:// or http://) should prepend the method and machine
+ name.
+- When finding a URL or file name, and it doesn't exist, try removing a
+ trailing '.'.
+- Add ":path" command modifier. Should work for every command that takes a
+ file name argument, to search for the file name in 'path'. Use
+ find_file_in_path().
+- Highlight control characters on the screen: Shows the difference between
+ CTRL-X and "^" followed by "X" (Colon).
+- Integrate parsing of cmdline command and parsing for expansion.
+- Create a program that can translate a .swp file from any machine into a
+ form usable by Vim on the current machine.
+- Add ":noro" command: Reset 'ro' flag for all buffers, except ones that have
+ a readonly file. ":noro!" will reset all 'ro' flags.
+- Add a variant of CTRL-V that stops interpretation of more than one
+ character. For entering mappings on the command line where a key contains
+ several special characters, e.g. a trailing newline.
+- Make '2' option in 'formatoptions' also work inside comments.
+- Add 's' flag to 'formatoptions': Do not break when inside a string. (Dodt)
+- When window size changed (with the mouse) and made too small, set it back
+ to the minimal size.
+- Add "]>" and "[<", shift comment at end of line (command; /* comment */).
+- Should not call cursorcmd() for each vgetc() in getcmdline().
+- ":split file1 file2" adds two more windows (Webb).
+- Don't give message "Incomplete last line" when editing binary file.
+- Add ":a", ":i" for preloading of named buffers.
+- When entering text, keep other windows on same buffer updated (when a line
+ entered)?
+- Check out how screen does output optimizing. Apparently this is possible
+ as an output filter.
+- In dosub() regexec is called twice for the same line. Try to avoid this.
+- Window updating from memline.c: insert/delete/replace line.
+- Optimize ml_append() for speed, esp. for reading a file.
+- V..c should keep indent when 'ai' is set, just like [count]cc.
+- Updatescript() can be done faster with a string instead of a char.
+- Screen updating is inefficient with CTRL-F and CTRL-B when there are long
+ lines.
+- Uppercase characters in Ex commands can be made lowercase?
+8 Add option to show characters in text not as "|A" but as decimal ("^129"),
+ hex ("\x81") or octal ("\201") or meta (M-x). Nvi has the 'octal' option
+ to switch from hex to octal. Vile can show unprintable characters in hex
+ or in octal.
+7 Tighter integration with xxd to edit binary files. Make it more
+ easy/obvious to use. Command line argument?
+- How does vi detect whether a filter has messed up the screen? Check source.
+ After ":w !command" a wait_return?
+- Improve screen updating code for doput() (use s_ins()).
+- With 'p' command on last line: scroll screen up (also for terminals without
+ insert line command).
+- Use insert/delete char when terminal supports it.
+- Optimize screen redraw for slow terminals.
+- Optimize "dw" for long row of spaces (say, 30000).
+- Add "-d null" for editing from a script file without displaying.
+- In Insert mode: Remember the characters that were removed with backspace
+ and re-insert them one at a time with <key1>, all together with <key2>.
+- Amiga: Add possibility to set a keymap. The code in amiga.c does not work
+ yet.
+- Implement 'redraw' option.
+- Add special code to 'sections' option to define something else but '{' or
+ '}' as the start of a section (e.g. one shiftwidth to the right).
+7 Allow using Vim in a pipe: "ls | vim -u xxx.vim - | yyy". Only needs
+ implementing ":w" to stdout in the buffer that was read from stdin.
+ Perhaps writing to stdout will work, since stderr is used for the terminal
+ I/O.
+8 Allow opening an unnamed buffer with ":e !cmd" and ":sp !cmd". Vile can
+ do it.
+- Add commands like ]] and [[ that do not include the line jumped to.
+- When :unab without matching "from" part and several matching "to" parts,
+ delete the entry that was used last, instead of the first in the list.
+- Add text justification option.
+- Set boolean options on/off with ":set paste=off", ":set paste=on".
+- After "inv"ing an option show the value: ":set invpaste" gives "paste is
+ off".
+- Check handling of CTRL-V and '\' for ":" commands that do not have TRLBAR.
+- When a file cannot be opened but does exist, give error message.
+- Amiga: When 'r' protection bit is not set, file can still be opened but
+ gives read errors. Check protection before opening.
+- When writing check for file exists but no permission, "Permission denied".
+- If file does not exist, check if directory exists.
+- Settings edit mode: make file with ":set opt=xx", edit it, parse it as ex
+ commands.
+- ":set -w all": list one option per line.
+- Amiga: test for 'w' flag when reading a file.
+- :table command (Webb)
+- Add new operator: clear, make area white (replace with spaces): "g ".
+- Add command to ":read" a file at a certain column (blockwise read?).
+- Add sort of replace mode where case is taken from the old text (Goldfarb).
+- Allow multiple arguments for ":read", read all the files.
+- Support for tabs in specific columns: ":set tabcol=8,20,34,56" (Demirel).
+- Add 'searchdir' option: Directories to search for file name being edited
+ (Demirel).
+- Modifier for the put command: Change to linewise, charwise, blockwise, etc.
+- Add commands for saving and restoring options ":set save" "set restore",
+ for use in macro's and the like.
+- Keep output from listings in a window, so you can have a look at it while
+ working in another window. Put cmdline in a separate window?
+- Add possibility to put output of Ex commands in a buffer or file, e.g. for
+ ":set all". ":r :set all"?
+- When the 'equalalways' option is set, creating a new window should not
+ result in windows to become bigger. Deleting a window should not result in
+ a window to become smaller (Webb).
+- When resizing the whole Vim window, the windows inside should be resized
+ proportionally (Webb).
+- Include options directly in option table, no indirect pointers. Use
+ mkopttab to make option table?
+- When doing ":w dir", where "dir" is a directory name, write the current
+ file into that directory, with the current file name (without the path)?
+- Support for 'dictionary's that are sorted, makes access a lot faster
+ (Haritsis).
+- Add "^Vrx" on the command line, replace with contents of register x. Used
+ instead of CTRL-R to make repeating possible. (Marinichev)
+- Add "^Vb" on the command line, replace with word before or under the
+ cursor?
+- Support mapping for replace mode and "r" command (Vi doesn't do this)?
+8 Sorting of filenames for completion is wrong on systems that ignore
+ case of filenames. Add 'ignorefncase' option. When set, case in
+ filenames is ignored for sorting them. Patch by Mike Williams:
+ ~/vim/patches/ignorefncase. Also change what matches? Or use another
+ option name.
+8 Should be able to compile Vim in another directory, with $(srcdir) set to
+ where the sources are. Add $(srcdir) in the Makefile in a lot of places.
+ (Netherton)
+6 Make it configurable when "J" inserts a space or not. Should not add a
+ space after "(", for example.
+5 When inserting spaces after the end-of-line for 'virtualedit', use tabs
+ when the user wants this (e.g., add a "tab" field to 'virtualedit').
+ (Servatius Brandt)
+
+
+From Elvis:
+- Use "instman.sh" to install manpages?
+- Add ":alias" command.
+- Search patterns:
+ \@ match word under cursor.
+ but do:
+ \@w match the word under the cursor?
+ \@W match the WORD under the cursor?
+8 ":window" command:
+ :win + next window (up)
+ :win ++ idem, wrapping
+ :win - previous window (down)
+ :win -- idem, wrapping
+ :win nr to window number "nr"
+ :win name to window editing buffer "name"
+7 ":cc" compiles a single file (default: current one). 'ccprg' option is
+ program to use with ":cc". Use ":compile" instead of ":cc"?
+
+
+From xvi:
+- CTRL-_ : swap 8th bit of character.
+- Add egrep-like regex type, like xvi (Ned Konz) or Perl (Emmanuel Mogenet)
+
+
+From vile:
+- When horizontal scrolling, use '>' for lines continuing right of a window.
+- Support putting .swp files in /tmp: Command in rc.local to move .swp files
+ from /tmp to some directory before deleting files.
+
+
+Far future and "big" extensions:
+- Instead of using a Makefile and autoconf, use a simple shell script to
+ find the C compiler and do everything with C code. Translate something
+ like an Aap recipe and configure.ac to C. Avoids depending on Python,
+ thus will work everywhere. With batch file to find the C compiler it
+ would also work on MS-Windows.
+- Make it easy to setup Vim for groups of users: novice vi users, novice
+ Vim users, C programmers, xterm users, GUI users,...
+- Change layout of blocks in swap file: Text at the start, with '\n' in
+ between lines (just load the file without changes, except for Mac).
+ Indexes for lines are from the end of the block backwards. It's the
+ current layout mirrored.
+- Make it possible to edit a register, in a window, like a buffer.
+- Add stuff to syntax highlighting to change the text (upper-case keywords,
+ set indent, define other highlighting, etc.).
+- Mode to keep C-code formatted all the time (sort of on-line indent).
+- Several top-level windows in one Vim session. Be able to use a different
+ font in each top-level window.
+- Allow editing above start and below end of buffer (flag in 'virtualedit').
+- Smart cut/paste: recognize words and adjust spaces before/after them.
+- Add open mode, use it when terminal has no cursor positioning.
+- Special "drawing mode": a line is drawn where the cursor is moved to.
+ Backspace deletes along the line (from jvim).
+- Support for underlining (underscore-BS-char), bold (char-BS-char) and other
+ standout modes switched on/off with , 'overstrike' option (Reiter).
+- Add vertical mode (Paul Jury, Demirel): "5vdw" deletes a word in five
+ lines, "3vitextESC" will insert "text" in three lines, etc..
+4 Recognize l, #, p as 'flags' to EX commands:
+ :g/RE/#l shall print lines with line numbers and in list format.
+ :g/RE/dp shall print lines that are deleted.
+ POSIX: Commands where flags shall apply to all lines written: list,
+ number, open, print, substitute, visual, &, z. For other commands, flags
+ shall apply to the current line after the command completes. Examples:
+ :7,10j #l Join the lines 7-10 and print the result in list
+- Allow two or more users to edit the same file at the same time. Changes
+ are reflected in each Vim immediately. Could work with local files but
+ also over the internet. See http://www.codingmonkeys.de/subethaedit/.
+
+vim:tw=78:sw=4:sts=4:ts=8:noet:ft=help:norl:
+vim: set fo+=n :
diff --git a/runtime/doc/uganda.txt b/runtime/doc/uganda.txt
new file mode 100644
index 0000000..093da30
--- /dev/null
+++ b/runtime/doc/uganda.txt
@@ -0,0 +1,259 @@
+*uganda.txt* For Vim version 9.0. Last change: 2022 Mar 02
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *uganda* *Uganda* *copying* *copyright* *license*
+SUMMARY
+ *iccf* *ICCF*
+Vim is Charityware. You can use and copy it as much as you like, but you are
+encouraged to make a donation for needy children in Uganda. Please see |kcc|
+below or visit the ICCF web site, available at these URLs:
+
+ https://iccf-holland.org/
+ https://www.vim.org/iccf/
+ https://www.iccf.nl/
+
+You can also sponsor the development of Vim. Vim sponsors can vote for
+features. See |sponsor|. The money goes to Uganda anyway.
+
+The Open Publication License applies to the Vim documentation, see
+|manual-copyright|.
+
+=== begin of license ===
+
+VIM LICENSE
+
+I) There are no restrictions on distributing unmodified copies of Vim except
+ that they must include this license text. You can also distribute
+ unmodified parts of Vim, likewise unrestricted except that they must
+ include this license text. You are also allowed to include executables
+ that you made from the unmodified Vim sources, plus your own usage
+ examples and Vim scripts.
+
+II) It is allowed to distribute a modified (or extended) version of Vim,
+ including executables and/or source code, when the following four
+ conditions are met:
+ 1) This license text must be included unmodified.
+ 2) The modified Vim must be distributed in one of the following five ways:
+ a) If you make changes to Vim yourself, you must clearly describe in
+ the distribution how to contact you. When the maintainer asks you
+ (in any way) for a copy of the modified Vim you distributed, you
+ must make your changes, including source code, available to the
+ maintainer without fee. The maintainer reserves the right to
+ include your changes in the official version of Vim. What the
+ maintainer will do with your changes and under what license they
+ will be distributed is negotiable. If there has been no negotiation
+ then this license, or a later version, also applies to your changes.
+ The current maintainer is Bram Moolenaar <Bram@vim.org>. If this
+ changes it will be announced in appropriate places (most likely
+ vim.sf.net, www.vim.org and/or comp.editors). When it is completely
+ impossible to contact the maintainer, the obligation to send him
+ your changes ceases. Once the maintainer has confirmed that he has
+ received your changes they will not have to be sent again.
+ b) If you have received a modified Vim that was distributed as
+ mentioned under a) you are allowed to further distribute it
+ unmodified, as mentioned at I). If you make additional changes the
+ text under a) applies to those changes.
+ c) Provide all the changes, including source code, with every copy of
+ the modified Vim you distribute. This may be done in the form of a
+ context diff. You can choose what license to use for new code you
+ add. The changes and their license must not restrict others from
+ making their own changes to the official version of Vim.
+ d) When you have a modified Vim which includes changes as mentioned
+ under c), you can distribute it without the source code for the
+ changes if the following three conditions are met:
+ - The license that applies to the changes permits you to distribute
+ the changes to the Vim maintainer without fee or restriction, and
+ permits the Vim maintainer to include the changes in the official
+ version of Vim without fee or restriction.
+ - You keep the changes for at least three years after last
+ distributing the corresponding modified Vim. When the maintainer
+ or someone who you distributed the modified Vim to asks you (in
+ any way) for the changes within this period, you must make them
+ available to him.
+ - You clearly describe in the distribution how to contact you. This
+ contact information must remain valid for at least three years
+ after last distributing the corresponding modified Vim, or as long
+ as possible.
+ e) When the GNU General Public License (GPL) applies to the changes,
+ you can distribute the modified Vim under the GNU GPL version 2 or
+ any later version.
+ 3) A message must be added, at least in the output of the ":version"
+ command and in the intro screen, such that the user of the modified Vim
+ is able to see that it was modified. When distributing as mentioned
+ under 2)e) adding the message is only required for as far as this does
+ not conflict with the license used for the changes.
+ 4) The contact information as required under 2)a) and 2)d) must not be
+ removed or changed, except that the person himself can make
+ corrections.
+
+III) If you distribute a modified version of Vim, you are encouraged to use
+ the Vim license for your changes and make them available to the
+ maintainer, including the source code. The preferred way to do this is
+ by e-mail or by uploading the files to a server and e-mailing the URL.
+ If the number of changes is small (e.g., a modified Makefile) e-mailing a
+ context diff will do. The e-mail address to be used is
+ <maintainer@vim.org>
+
+IV) It is not allowed to remove this license from the distribution of the Vim
+ sources, parts of it or from a modified version. You may use this
+ license for previous Vim releases instead of the license that they came
+ with, at your option.
+
+=== end of license ===
+
+Note:
+
+- If you are happy with Vim, please express that by reading the rest of this
+ file and consider helping needy children in Uganda.
+
+- If you want to support further Vim development consider becoming a
+ |sponsor|. The money goes to Uganda anyway.
+
+- According to Richard Stallman the Vim license is GNU GPL compatible.
+ A few minor changes have been made since he checked it, but that should not
+ make a difference.
+
+- If you link Vim with a library that goes under the GNU GPL, this limits
+ further distribution to the GNU GPL. Also when you didn't actually change
+ anything in Vim.
+
+- Once a change is included that goes under the GNU GPL, this forces all
+ further changes to also be made under the GNU GPL or a compatible license.
+
+- If you distribute a modified version of Vim, you can include your name and
+ contact information with the "--with-modified-by" configure argument or the
+ MODIFIED_BY define.
+
+==============================================================================
+Kibaale Children's Centre *kcc* *Kibaale* *charity*
+
+Kibaale Children's Centre (KCC) is located in Kibaale, a small town in the
+south of Uganda, near Tanzania, in East Africa. The area is known as Rakai
+District. The population is mostly farmers. Although people are poor, there
+usually is enough food. But this district is suffering from AIDS more than
+any other part of the world. Some say that it started there. Estimations are
+that in the past 10 to 30% of the Ugandans are infected with HIV. Because
+parents die, there are many orphans. In this district about 60,000 children
+have lost one or both parents, out of a population of 350,000. Although AIDS
+is now mostly under control, the problems are still continuing.
+
+The children need a lot of help. The KCC is working hard to provide the needy
+with food, medical care and education. Food and medical care to keep them
+healthy now, and education so that they can take care of themselves in the
+future. KCC works on a Christian base, but help is given to children of any
+religion.
+
+The key to solving the problems in this area is education. This has been
+neglected in the past years with president Idi Amin and the following civil
+wars. Now that the government is stable again, the children and parents have
+to learn how to take care of themselves and how to avoid infections. There is
+also help for people who are ill and hungry, but the primary goal is to
+prevent people from getting ill and to teach them how to grow healthy food.
+
+Most of the orphans are living in an extended family. An uncle or older
+sister is taking care of them. Because these families are big and the income
+(if any) is low, a child is lucky if it gets healthy food. Clothes, medical
+care and schooling is beyond its reach. To help these needy children, a
+sponsorship program was put into place. A child can be financially adopted.
+For a few dollars a month KCC sees to it that the child gets indispensable
+items, is healthy, goes to school and KCC takes care of anything else that
+needs to be done for the child and the family that supports it.
+
+Besides helping the child directly, the environment where the child grows up
+needs to be improved. KCC helps schools to improve their teaching methods.
+There is a demonstration school at the centre and teacher trainings are given.
+Health workers are being trained, hygiene education is carried out and
+households are stimulated to build a proper latrine. I helped setting up a
+production site for cement slabs. These are used to build a good latrine.
+They are sold below cost price.
+
+There is a clinic at the project, which provides children and their family
+medical help. Since 2020 a maternity ward was added and 24/7 service is
+available. When needed, transport to a hospital is offered. Immunization
+programs are carried out and help is provided when an epidemic is breaking out
+(measles and cholera have been a problem).
+ *donate*
+Summer 1994 to summer 1995 I spent a whole year at the centre, working as a
+volunteer. I have helped to expand the centre and worked in the area of water
+and sanitation. I learned that the help that the KCC provides really helps.
+When I came back to Holland, I wanted to continue supporting KCC. To do this
+I'm raising funds and organizing the sponsorship program. Please consider one
+of these possibilities:
+
+1. Sponsor a child in primary school: 17 euro a month (or more).
+2. Sponsor a child in secondary school: 25 euro a month (or more).
+3. Sponsor the clinic: Any amount a month or quarter
+4. A one-time donation
+
+Compared with other organizations that do child sponsorship the amounts are
+very low. This is because the money goes directly to the centre. Less than
+5% is used for administration. This is possible because this is a small
+organization that works with volunteers. If you would like to sponsor a
+child, you should have the intention to do this for at least one year.
+
+How do you know that the money will be spent right? First of all you have my
+personal guarantee as the author of Vim. I trust the people that are working
+at the centre, I know them personally. Furthermore, the centre has been
+co-sponsored and inspected by World Vision, Save the Children Fund and is now
+under the supervision of Pacific Academy Outreach Society. The centre is
+visited about once a year to check the progress (at our own cost). I have
+visited the centre myself many times, starting in 1993. The visit reports are
+on the ICCF web site.
+
+If you have any further questions, send me e-mail: <Bram@vim.org>.
+
+The address of the centre is:
+ Kibaale Children's Centre
+ p.o. box 1658
+ Masaka, Uganda, East Africa
+
+Sending money: *iccf-donations*
+
+Check the ICCF web site for the latest information! See |iccf| for the URL.
+
+
+USA: The methods mentioned below can be used.
+ If you must send a check send it to our Canadian partner:
+ https://www.kuwasha.net/
+
+Canada: Contact Kuwasha in Surrey, Canada. They take care of the
+ Canadian sponsors for the children in Kibaale. Kuwasha
+ forwards 100% of the money to the project in Uganda. You can
+ send them a one time donation directly.
+ Please send me a note so that I know what has been donated
+ because of Vim. Look on their site for information about
+ sponsorship: https://www.kuwasha.net/
+ If you make a donation to Kuwasha you will receive a tax
+ receipt which can be submitted with your tax return.
+
+Holland: Transfer to the account of "Stichting ICCF Holland" in
+ Amersfoort. This will allow for tax deduction if you live in
+ Holland. ING bank, IBAN: NL95 INGB 0004 5487 74
+
+Germany: It is possible to make donations that allow for a tax return.
+ Check the ICCF web site for the latest information:
+ https://iccf-holland.org/germany.html
+
+Europe: Use a bank transfer if possible. See "Others" below for the
+ swift code and IBAN number.
+ Any other method should work. Ask for information about
+ sponsorship.
+
+Credit Card: You can use PayPal to send money with a Credit card. This is
+ the most widely used Internet based payment system. It's
+ really simple to use. Use this link to find more info:
+ https://www.paypal.com/en_US/mrb/pal=XAC62PML3GF8Q
+ The e-mail address for sending the money to is:
+ Bram@iccf-holland.org
+
+Others: Transfer to this account if possible:
+ ING bank: IBAN: NL95 INGB 0004 5487 74
+ Swift code: INGBNL2A
+ under the name "stichting ICCF Holland", Amersfoort
+ Checks are not accepted.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/undo.txt b/runtime/doc/undo.txt
new file mode 100644
index 0000000..cc33482
--- /dev/null
+++ b/runtime/doc/undo.txt
@@ -0,0 +1,411 @@
+*undo.txt* For Vim version 9.0. Last change: 2022 Jun 02
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+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|
+
+==============================================================================
+1. Undo and redo commands *undo-commands*
+
+<Undo> or *undo* *<Undo>* *u*
+u Undo [count] changes.
+
+ *:u* *:un* *:undo*
+:u[ndo] Undo one change.
+ *E830*
+:u[ndo] {N} Jump to after change number {N}. See |undo-branches|
+ for the meaning of {N}.
+
+ *CTRL-R*
+CTRL-R Redo [count] changes which were undone.
+
+ *:red* *:redo* *redo*
+:red[o] Redo one change which was undone.
+
+ *U*
+U Undo all latest changes on one line, the line where
+ the latest change was made. |U| itself also counts as
+ a change, and thus |U| undoes a previous |U|.
+
+The last changes are remembered. You can use the undo and redo commands above
+to revert the text to how it was before each change. You can also apply the
+changes again, getting back the text before the undo.
+
+The "U" command is treated by undo/redo just like any other command. Thus a
+"u" command undoes a "U" command and a 'CTRL-R' command redoes it again. When
+mixing "U", "u" and 'CTRL-R' you will notice that the "U" command will
+restore the situation of a line to before the previous "U" command. This may
+be confusing. Try it out to get used to it.
+The "U" command will always mark the buffer as changed. When "U" changes the
+buffer back to how it was without changes, it is still considered changed.
+Use "u" to undo changes until the buffer becomes unchanged.
+
+==============================================================================
+2. Two ways of undo *undo-two-ways*
+
+How undo and redo commands work depends on the 'u' flag in 'cpoptions'.
+There is the Vim way ('u' excluded) and the Vi-compatible way ('u' included).
+In the Vim way, "uu" undoes two changes. In the Vi-compatible way, "uu" does
+nothing (undoes an undo).
+
+'u' excluded, the Vim way:
+You can go back in time with the undo command. You can then go forward again
+with the redo command. If you make a new change after the undo command,
+the redo will not be possible anymore.
+
+'u' included, the Vi-compatible way:
+The undo command undoes the previous change, and also the previous undo
+command. The redo command repeats the previous undo command. It does NOT
+repeat a change command, use "." for that.
+
+Examples Vim way Vi-compatible way ~
+"uu" two times undo no-op
+"u CTRL-R" no-op two times undo
+
+Rationale: Nvi uses the "." command instead of CTRL-R. Unfortunately, this
+ is not Vi compatible. For example "dwdwu." in Vi deletes two
+ words, in Nvi it does nothing.
+
+==============================================================================
+3. Undo blocks *undo-blocks*
+
+One undo command normally undoes a typed command, no matter how many changes
+that command makes. This sequence of undo-able changes forms an undo block.
+Thus if the typed key(s) call a function, all the commands in the function are
+undone together.
+
+If you want to write a function or script that doesn't create a new undoable
+change but joins in with the previous change use this command:
+
+ *:undoj* *:undojoin* *E790*
+:undoj[oin] Join further changes with the previous undo block.
+ Warning: Use with care, it may prevent the user from
+ properly undoing changes. Don't use this after undo
+ or redo.
+
+This is most useful when you need to prompt the user halfway through a change.
+For example in a function that calls |getchar()|. Do make sure that there was
+a related change before this that you must join with.
+
+This doesn't work by itself, because the next key press will start a new
+change again. But you can do something like this: >
+
+ :undojoin | delete
+
+After this a "u" command will undo the delete command and the previous
+change.
+ *undo-break* *undo-close-block*
+To do the opposite, use a new undo block for the next change, in Insert mode
+use CTRL-G u. This is useful if you want an insert command to be undoable in
+parts. E.g., for each sentence. |i_CTRL-G_u|
+
+Setting the value of 'undolevels' also closes the undo block. Even when the
+new value is equal to the old value. In |Vim9| script: >
+ &undolevels = &undolevels
+In legacy script: >
+ let &undolevels = &undolevels
+
+==============================================================================
+4. Undo branches *undo-branches* *undo-tree*
+
+Above we only discussed one line of undo/redo. But it is also possible to
+branch off. This happens when you undo a few changes and then make a new
+change. The undone changes become a branch. You can go to that branch with
+the following commands.
+
+This is explained in the user manual: |usr_32.txt|.
+
+ *:undol* *:undolist*
+:undol[ist] List the leafs in the tree of changes. Example:
+ number changes when saved ~
+ 88 88 2010/01/04 14:25:53
+ 108 107 08/07 12:47:51
+ 136 46 13:33:01 7
+ 166 164 3 seconds ago
+
+ The "number" column is the change number. This number
+ continuously increases and can be used to identify a
+ specific undo-able change, see |:undo|.
+ The "changes" column is the number of changes to this
+ leaf from the root of the tree.
+ The "when" column is the date and time when this
+ change was made. The four possible formats are:
+ N seconds ago
+ HH:MM:SS hour, minute, seconds
+ MM/DD HH:MM:SS idem, with month and day
+ YYYY/MM/DD HH:MM:SS idem, with year
+ The "saved" column specifies, if this change was
+ written to disk and which file write it was. This can
+ be used with the |:later| and |:earlier| commands.
+ For more details use the |undotree()| function.
+
+ *g-*
+g- Go to older text state. With a count repeat that many
+ times.
+ *:ea* *:earlier*
+:earlier {count} Go to older text state {count} times.
+:earlier {N}s Go to older text state about {N} seconds before.
+:earlier {N}m Go to older text state about {N} minutes before.
+:earlier {N}h Go to older text state about {N} hours before.
+:earlier {N}d Go to older text state about {N} days before.
+
+:earlier {N}f Go to older text state {N} file writes before.
+ When changes were made since the last write
+ ":earlier 1f" will revert the text to the state when
+ it was written. Otherwise it will go to the write
+ before that.
+ When at the state of the first file write, or when
+ the file was not written, ":earlier 1f" will go to
+ before the first change.
+
+ *g+*
+g+ Go to newer text state. With a count repeat that many
+ times.
+ *:lat* *:later*
+:later {count} Go to newer text state {count} times.
+:later {N}s Go to newer text state about {N} seconds later.
+:later {N}m Go to newer text state about {N} minutes later.
+:later {N}h Go to newer text state about {N} hours later.
+:later {N}d Go to newer text state about {N} days later.
+
+:later {N}f Go to newer text state {N} file writes later.
+ When at the state of the last file write, ":later 1f"
+ will go to the newest text state.
+
+
+Note that text states will become unreachable when undo information is cleared
+for 'undolevels'.
+
+Don't be surprised when moving through time shows multiple changes to take
+place at a time. This happens when moving through the undo tree and then
+making a new change.
+
+EXAMPLE
+
+Start with this text:
+ one two three ~
+
+Delete the first word by pressing "x" three times:
+ ne two three ~
+ e two three ~
+ two three ~
+
+Now undo that by pressing "u" three times:
+ e two three ~
+ ne two three ~
+ one two three ~
+
+Delete the second word by pressing "x" three times:
+ one wo three ~
+ one o three ~
+ one three ~
+
+Now undo that by using "g-" three times:
+ one o three ~
+ one wo three ~
+ two three ~
+
+You are now back in the first undo branch, after deleting "one". Repeating
+"g-" will now bring you back to the original text:
+ e two three ~
+ ne two three ~
+ one two three ~
+
+Jump to the last change with ":later 1h":
+ one three ~
+
+And back to the start again with ":earlier 1h":
+ one two three ~
+
+
+Note that using "u" and CTRL-R will not get you to all possible text states
+while repeating "g-" and "g+" does.
+
+==============================================================================
+5. Undo persistence *undo-persistence* *persistent-undo*
+
+When unloading a buffer Vim normally destroys the tree of undos created for
+that buffer. By setting the 'undofile' option, Vim will automatically save
+your undo history when you write a file and restore undo history when you edit
+the file again.
+
+The 'undofile' option is checked after writing a file, before the BufWritePost
+autocommands. If you want to control what files to write undo information
+for, you can use a BufWritePre autocommand: >
+ au BufWritePre /tmp/* setlocal noundofile
+
+Vim saves undo trees in a separate undo file, one for each edited file, using
+a simple scheme that maps filesystem paths directly to undo files. Vim will
+detect if an undo file is no longer synchronized with the file it was written
+for (with a hash of the file contents) and ignore it when the file was changed
+after the undo file was written, to prevent corruption. An undo file is also
+ignored if its owner differs from the owner of the edited file, except when
+the owner of the undo file is the current user. Set 'verbose' to get a
+message about that when opening a file.
+
+Undo files are normally saved in the same directory as the file. This can be
+changed with the 'undodir' option.
+
+When the file is encrypted, the text in the undo file is also encrypted. The
+same key and method is used. |encryption|
+
+Note that text properties are not stored in the undo file. You can restore
+text properties so long as a buffer is loaded, but you cannot restore them
+from an undo file. Rationale: It would require the associated text property
+types to be defined in exactly the same was as before, which cannot be
+guaranteed.
+
+You can also save and restore undo histories by using ":wundo" and ":rundo"
+respectively:
+ *:wundo* *:rundo*
+:wundo[!] {file}
+ Write undo history to {file}.
+ When {file} exists and it does not look like an undo file
+ (the magic number at the start of the file is wrong), then
+ this fails, unless the ! was added.
+ If it exists and does look like an undo file it is
+ overwritten. If there is no undo-history, nothing will be
+ written.
+ Implementation detail: Overwriting happens by first deleting
+ the existing file and then creating a new file with the same
+ name. So it is not possible to overwrite an existing undofile
+ in a write-protected directory.
+
+:rundo {file} Read undo history from {file}.
+
+You can use these in autocommands to explicitly specify the name of the
+history file. E.g.: >
+
+ au BufReadPost * call ReadUndo()
+ au BufWritePost * call WriteUndo()
+ func ReadUndo()
+ if filereadable(expand('%:h') .. '/UNDO/' .. expand('%:t'))
+ rundo %:h/UNDO/%:t
+ endif
+ endfunc
+ func WriteUndo()
+ let dirname = expand('%:h') .. '/UNDO'
+ if !isdirectory(dirname)
+ call mkdir(dirname)
+ endif
+ wundo %:h/UNDO/%:t
+ endfunc
+
+You should keep 'undofile' off, otherwise you end up with two undo files for
+every write.
+
+You can use the |undofile()| function to find out the file name that Vim would
+use.
+
+Note that while reading/writing files and 'undofile' is set most errors will
+be silent, unless 'verbose' is set. With :wundo and :rundo you will get more
+error messages, e.g., when the file cannot be read or written.
+
+NOTE: undo files are never deleted by Vim. You need to delete them yourself.
+
+Reading an existing undo file may fail for several reasons:
+*E822* It cannot be opened, because the file permissions don't allow it.
+*E823* The magic number at the start of the file doesn't match. This usually
+ means it is not an undo file.
+*E824* The version number of the undo file indicates that it's written by a
+ newer version of Vim. You need that newer version to open it. Don't
+ write the buffer if you want to keep the undo info in the file.
+"File contents changed, cannot use undo info"
+ The file text differs from when the undo file was written. This means
+ the undo file cannot be used, it would corrupt the text. This also
+ happens when 'encoding' differs from when the undo file was written.
+*E825* The undo file does not contain valid contents and cannot be used.
+*E826* The undo file is encrypted but decryption failed.
+*E827* The undo file is encrypted but this version of Vim does not support
+ encryption. Open the file with another Vim.
+*E832* The undo file is encrypted but 'key' is not set, the text file is not
+ encrypted. This would happen if the text file was written by Vim
+ encrypted at first, and later overwritten by not encrypted text.
+ You probably want to delete this undo file.
+"Not reading undo file, owner differs"
+ The undo file is owned by someone else than the owner of the text
+ file. For safety the undo file is not used.
+
+Writing an undo file may fail for these reasons:
+*E828* The file to be written cannot be created. Perhaps you do not have
+ write permissions in the directory.
+"Cannot write undo file in any directory in 'undodir'"
+ None of the directories in 'undodir' can be used.
+"Will not overwrite with undo file, cannot read"
+ A file exists with the name of the undo file to be written, but it
+ cannot be read. You may want to delete this file or rename it.
+"Will not overwrite, this is not an undo file"
+ A file exists with the name of the undo file to be written, but it
+ does not start with the right magic number. You may want to delete
+ this file or rename it.
+"Skipping undo file write, nothing to undo"
+ There is no undo information to be written, nothing has been changed
+ or 'undolevels' is negative.
+*E829* An error occurred while writing the undo file. You may want to try
+ again.
+
+==============================================================================
+6. Remarks about undo *undo-remarks*
+
+The number of changes that are remembered is set with the 'undolevels' option.
+If it is zero, the Vi-compatible way is always used. If it is negative no
+undo is possible. Use this if you are running out of memory.
+
+ *clear-undo*
+When you set 'undolevels' to -1 the undo information is not immediately
+cleared, this happens at the next change. To force clearing the undo
+information you can use these commands: >
+ :let old_undolevels = &undolevels
+ :set undolevels=-1
+ :exe "normal a \<BS>\<Esc>"
+ :let &undolevels = old_undolevels
+ :unlet old_undolevels
+
+Marks for the buffer ('a to 'z) are also saved and restored, together with the
+text.
+
+When all changes have been undone, the buffer is not considered to be changed.
+It is then possible to exit Vim with ":q" instead of ":q!". Note
+that this is relative to the last write of the file. Typing "u" after ":w"
+actually changes the buffer, compared to what was written, so the buffer is
+considered changed then.
+
+When manual |folding| is being used, the folds are not saved and restored.
+Only changes completely within a fold will keep the fold as it was, because
+the first and last line of the fold don't change.
+
+The numbered registers can also be used for undoing deletes. Each time you
+delete text, it is put into register "1. The contents of register "1 are
+shifted to "2, etc. The contents of register "9 are lost. You can now get
+back the most recent deleted text with the put command: '"1P'. (also, if the
+deleted text was the result of the last delete or copy operation, 'P' or 'p'
+also works as this puts the contents of the unnamed register). You can get
+back the text of three deletes ago with '"3P'.
+
+ *redo-register*
+If you want to get back more than one part of deleted text, you can use a
+special feature of the repeat command ".". It will increase the number of the
+register used. So if you first do '"1P', the following "." will result in a
+'"2P'. Repeating this will result in all numbered registers being inserted.
+
+Example: If you deleted text with 'dd....' it can be restored with
+ '"1P....'.
+
+If you don't know in which register the deleted text is, you can use the
+:display command. An alternative is to try the first register with '"1P', and
+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:noet:ft=help:norl:
diff --git a/runtime/doc/userfunc.txt b/runtime/doc/userfunc.txt
new file mode 100644
index 0000000..210c2c5
--- /dev/null
+++ b/runtime/doc/userfunc.txt
@@ -0,0 +1,546 @@
+*userfunc.txt* For Vim version 9.0. Last change: 2023 Feb 02
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Defining and using functions.
+
+This is introduced in section |41.7| of the user manual.
+
+1. Defining a function |define-function|
+2. Calling a function |:call|
+3. Cleaning up in a function |:defer|
+4. Automatically loading functions |autoload-functions|
+
+==============================================================================
+
+1. Defining a function ~
+ *define-function*
+New functions can be defined. These can be called just like builtin
+functions. The function executes a sequence of Ex commands. Normal mode
+commands can be executed with the |:normal| command.
+
+The function name must start with an uppercase letter, to avoid confusion with
+builtin functions. To prevent from using the same name in different scripts
+make them script-local. If you do use a global function then avoid obvious,
+short names. A good habit is to start the function name with the name of the
+script, e.g., "HTMLcolor()".
+
+In legacy script it is also possible to use curly braces, see
+|curly-braces-names|.
+
+The |autoload| facility is useful to define a function only when it's called.
+
+ *local-function*
+A function local to a legacy script must start with "s:". A local script
+function can only be called from within the script and from functions, user
+commands and autocommands defined in the script. It is also possible to call
+the function from a mapping defined in the script, but then |<SID>| must be
+used instead of "s:" when the mapping is expanded outside of the script.
+There are only script-local functions, no buffer-local or window-local
+functions.
+
+In |Vim9| script functions are local to the script by default, prefix "g:" to
+define a global function.
+
+ *:fu* *:function* *E128* *E129* *E123* *E454*
+:fu[nction] List all functions and their arguments.
+
+:fu[nction] {name} List function {name}.
+ {name} can also be a |Dictionary| entry that is a
+ |Funcref|: >
+ :function dict.init
+
+:fu[nction] /{pattern} List functions with a name matching {pattern}.
+ Example that lists all functions ending with "File": >
+ :function /File$
+<
+ *:function-verbose*
+When 'verbose' is non-zero, listing a function will also display where it was
+last defined. Example: >
+
+ :verbose function SetFileTypeSH
+ function SetFileTypeSH(name)
+ Last set from /usr/share/vim/vim-7.0/filetype.vim
+<
+See |:verbose-cmd| for more information.
+
+ *E124* *E125* *E853* *E884*
+: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|.
+ *E1267*
+ 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|: >
+ :function dict.init(arg)
+< "dict" must be an existing dictionary. The entry
+ "init" is added if it didn't exist yet. Otherwise [!]
+ is required to overwrite an existing function. The
+ result is a |Funcref| to a numbered function. The
+ function can only be used with a |Funcref| and will be
+ deleted if there are no more references to it.
+ *E127* *E122*
+ When a function by this name already exists and [!] is
+ not used an error message is given. There is one
+ exception: When sourcing a script again, a function
+ that was previously defined in that script will be
+ silently replaced.
+ 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.
+ NOTE: In Vim9 script script-local functions cannot be
+ deleted or redefined.
+
+ For the {arguments} see |function-argument|.
+
+ *:func-range* *a:firstline* *a:lastline*
+ When the [range] argument is added, the function is
+ expected to take care of a range itself. The range is
+ passed as "a:firstline" and "a:lastline". If [range]
+ is excluded, ":{range}call" will call the function for
+ each line in the range, with the cursor on the start
+ of each line. See |function-range-example|.
+ The cursor is still moved to the first line of the
+ range, as is the case with all Ex commands.
+ *:func-abort*
+ When the [abort] argument is added, the function will
+ abort as soon as an error is detected.
+ *:func-dict*
+ When the [dict] argument is added, the function must
+ 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 "."
+ will not be changed by the function. This also
+ implies that the effect of |:nohlsearch| is undone
+ when the function returns.
+
+ *:endf* *:endfunction* *E126* *E193* *W22* *E1151*
+: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* *E131* *E933* *E1084*
+: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
+ 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.
+ If "[expr]" is not given, the number 0 is returned.
+ When a function ends without an explicit ":return",
+ the number 0 is returned.
+
+ In a :def function *E1095* is given if unreachable
+ code follows after the `:return`.
+ In legacy script there is no check for unreachable
+ lines, thus there is no warning if commands follow
+ `:return`. Also, there is no check if the following
+ line contains a valid command. Forgetting the line
+ continuation backslash may go unnoticed: >
+ return 'some text'
+ .. ' some more text'
+< Will happily return "some text" without an error. It
+ should have been: >
+ return 'some text'
+ \ .. ' some more text'
+<
+ If the ":return" is used after a |:try| but before the
+ matching |:finally| (if present), the commands
+ following the ":finally" up to the matching |:endtry|
+ are executed first. This process applies to all
+ nested ":try"s inside the function. The function
+ returns at the outermost ":endtry".
+
+ *function-argument* *a:var*
+An argument can be defined by giving its name. In the function this can then
+be used as "a:name" ("a:" for argument) (in a `:def` function "a:" is not
+used).
+ *a:0* *a:1* *a:000* *E740* *...*
+Up to 20 arguments can be given, separated by commas. After the named
+arguments an argument "..." can be specified, which means that more arguments
+may optionally be following. In the function the extra arguments can be used
+as "a:1", "a:2", etc. "a:0" is set to the number of extra arguments (which
+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* *E1090*
+The a: scope and the variables in it cannot be changed, they are fixed.
+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|.
+
+It is also possible to define a function without any arguments. You must
+still supply the () then.
+
+It is allowed to define another function inside a function body.
+
+ *optional-function-argument*
+You can provide default values for positional named arguments. This makes
+them optional for function calls. When a positional argument is not
+specified at a call, the default expression is used to initialize it.
+This only works for functions declared with `:function` or `:def`, not for
+lambda expressions |expr-lambda|.
+
+Example: >
+ function Something(key, value = 10)
+ echo a:key .. ": " .. a:value
+ endfunction
+ call Something('empty') "empty: 10"
+ call Something('key', 20) "key: 20"
+
+The argument default expressions are evaluated at the time of the function
+call, not when the function is defined. Thus it is possible to use an
+expression which is invalid the moment the function is defined. The
+expressions are also only evaluated when arguments are not specified during a
+call.
+ *none-function_argument*
+You can pass |v:none| to use the default expression. Note that this means you
+cannot pass v:none as an ordinary value when an argument has a default
+expression.
+
+Example: >
+ function Something(a = 10, b = 20, c = 30)
+ endfunction
+ call Something(1, v:none, 3) " b = 20
+<
+ *E989*
+Optional arguments with default expressions must occur after any mandatory
+arguments. You can use "..." after all optional named arguments.
+
+It is possible for later argument defaults to refer to prior arguments,
+but not the other way around. They must be prefixed with "a:", as with all
+arguments.
+
+Example that works: >
+ :function Okay(mandatory, optional = a:mandatory)
+ :endfunction
+Example that does NOT work: >
+ :function NoGood(first = a:second, second = 10)
+ :endfunction
+<
+When not using "...", the number of arguments in a function call must be at
+least equal to the number of mandatory named arguments. When using "...", the
+number of arguments may be larger than the total of mandatory and optional
+arguments.
+
+ *local-variables*
+Inside a function local variables can be used. These will disappear when the
+function returns. Global variables need to be accessed with "g:".
+Inside functions local variables are accessed without prepending anything.
+But you can also prepend "l:" if you like. This is required for some reserved
+names, such as "count".
+
+Example: >
+ :function Table(title, ...)
+ : echohl Title
+ : echo a:title
+ : echohl None
+ : echo a:0 .. " items:"
+ : for s in a:000
+ : echon ' ' .. s
+ : endfor
+ :endfunction
+
+This function can then be called with: >
+ call Table("Table", "line1", "line2")
+ call Table("Empty Table")
+
+To return more than one value, return a |List|: >
+ :function Compute(n1, n2)
+ : if a:n2 == 0
+ : return ["fail", 0]
+ : endif
+ : return ["ok", a:n1 / a:n2]
+ :endfunction
+
+This function can then be called with: >
+ :let [success, div] = Compute(102, 6)
+ :if success == "ok"
+ : echo div
+ :endif
+<
+==============================================================================
+
+2. Calling a function ~
+ *:cal* *:call* *E107*
+:[range]cal[l] {name}([arguments])
+ Call a function. The name of the function and its arguments
+ are as specified with `:function`. Up to 20 arguments can be
+ used. The returned value is discarded.
+ In |Vim9| script using `:call` is optional, these two lines do
+ the same thing: >
+ call SomeFunc(arg)
+ SomeFunc(arg)
+< Without a range and for functions that accept a range, the
+ function is called once. When a range is given the cursor is
+ positioned at the start of the first line before executing the
+ function.
+ When a range is given and the function doesn't handle it
+ itself, the function is executed for each line in the range,
+ with the cursor in the first column of that line. The cursor
+ is left at the last line (possibly moved by the last function
+ call). The arguments are re-evaluated for each line. Thus
+ this works:
+ *function-range-example* >
+ :function Mynumber(arg)
+ : echo line(".") .. " " .. a:arg
+ :endfunction
+ :1,5call Mynumber(getline("."))
+<
+ The "a:firstline" and "a:lastline" are defined anyway, they
+ can be used to do something different at the start or end of
+ the range.
+
+ Example of a function that handles the range itself: >
+
+ :function Cont() range
+ : execute (a:firstline + 1) .. "," .. a:lastline .. 's/^/\t\\ '
+ :endfunction
+ :4,8call Cont()
+<
+ This function inserts the continuation character "\" in front
+ of all the lines in the range, except the first one.
+
+ When the function returns a composite value it can be further
+ dereferenced, but the range will not be used then. Example: >
+ :4,8call GetDict().method()
+< Here GetDict() gets the range but method() does not.
+
+ *E117*
+When a function cannot be found the error "E117: Unknown function" will be
+given. If the function was using an autoload path or an autoload import and
+the script is a |Vim9| script, this may also be caused by the function not
+being exported.
+
+ *E132*
+The recursiveness of user functions is restricted with the |'maxfuncdepth'|
+option.
+
+It is also possible to use `:eval`. It does not support a range, but does
+allow for method chaining, e.g.: >
+ eval GetList()->Filter()->append('$')
+
+A function can also be called as part of evaluating an expression or when it
+is used as a method: >
+ let x = GetList()
+ let y = GetList()->Filter()
+
+==============================================================================
+
+3. Cleaning up in a function ~
+ *:defer*
+:defer {func}({args}) Call {func} when the current function is done.
+ {args} are evaluated here.
+
+Quite often a command in a function has a global effect, which must be undone
+when the function finishes. Handling this in all kinds of situations can be a
+hassle. Especially when an unexpected error is encountered. This can be done
+with `try` / `finally` blocks, but this gets complicated when there is more
+than one.
+
+A much simpler solution is using `defer`. It schedules a function call when
+the function is returning, no matter if there is an error. Example: >
+ func Filter(text) abort
+ call writefile(a:text, 'Tempfile')
+ call system('filter < Tempfile > Outfile')
+ call Handle('Outfile')
+ call delete('Tempfile')
+ call delete('Outfile')
+ endfunc
+
+Here 'Tempfile' and 'Outfile' will not be deleted if something causes the
+function to abort. `:defer` can be used to avoid that: >
+ func Filter(text) abort
+ call writefile(a:text, 'Tempfile')
+ defer delete('Tempfile')
+ defer delete('Outfile')
+ call system('filter < Tempfile > Outfile')
+ call Handle('Outfile')
+ endfunc
+
+Note that deleting "Outfile" is scheduled before calling `system()`, since it
+can be created even when `system()` fails.
+
+The deferred functions are called in reverse order, the last one added is
+executed first. A useless example: >
+ func Useless() abort
+ for s in range(3)
+ defer execute('echomsg "number ' .. s .. '"')
+ endfor
+ endfunc
+
+Now `:messages` shows:
+ number 2
+ number 1
+ number 0
+
+Any return value of the deferred function is discarded. The function cannot
+be followed by anything, such as "->func" or ".member". Currently `:defer
+GetArg()->TheFunc()` does not work, it may work in a later version.
+
+Errors are reported but do not cause aborting execution of deferred functions.
+
+No range is accepted. The function can be a partial with extra arguments, but
+not with a dictionary. *E1300*
+
+==============================================================================
+
+4. Automatically loading functions ~
+ *autoload-functions*
+When using many or large functions, it's possible to automatically define them
+only when they are used. There are two methods: with an autocommand and with
+the "autoload" directory in 'runtimepath'.
+
+In |Vim9| script there is also an autoload mechanism for imported scripts, see
+|import-autoload|.
+
+
+Using an autocommand ~
+
+This is introduced in the user manual, section |51.4|.
+
+The autocommand is useful if you have a plugin that is a long Vim script file.
+You can define the autocommand and quickly quit the script with `:finish`.
+That makes Vim startup faster. The autocommand should then load the same file
+again, setting a variable to skip the `:finish` command.
+
+Use the FuncUndefined autocommand event with a pattern that matches the
+function(s) to be defined. Example: >
+
+ :au FuncUndefined BufNet* source ~/vim/bufnetfuncs.vim
+
+The file "~/vim/bufnetfuncs.vim" should then define functions that start with
+"BufNet". Also see |FuncUndefined|.
+
+
+Using an autoload script ~
+ *autoload* *E746*
+This is introduced in the user manual, section |52.2|.
+
+Using a script in the "autoload" directory is simpler, but requires using
+exactly the right file name. A function that can be autoloaded has a name
+like this: >
+
+ :call filename#funcname()
+
+These functions are always global, in Vim9 script "g:" needs to be used: >
+ :call g:filename#funcname()
+
+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 "~/.vim/autoload/filename.vim". That file should
+then define the function like this: >
+
+ function filename#funcname()
+ echo "Done!"
+ endfunction
+
+If the file doesn't exist, Vim will also search in 'packpath' (under "start")
+to allow calling packages' functions from your .vimrc when the packages have
+not been added to 'runtimepath' yet (see |packages|).
+
+The file name and the name used before the # in the function must match
+exactly, and the defined function must have the name exactly as it will be
+called. In Vim9 script the "g:" prefix must be used: >
+ function g:filename#funcname()
+
+or for a compiled function: >
+ def g:filename#funcname()
+
+It is possible to use subdirectories. Every # in the function name works like
+a path separator. Thus when calling a function: >
+
+ :call foo#bar#func()
+
+Vim will look for the file "autoload/foo/bar.vim" in 'runtimepath'.
+
+This also works when reading a variable that has not been set yet: >
+
+ :let l = foo#bar#lvar
+
+However, when the autoload script was already loaded it won't be loaded again
+for an unknown variable.
+
+When assigning a value to such a variable nothing special happens. This can
+be used to pass settings to the autoload script before it's loaded: >
+
+ :let foo#bar#toggle = 1
+ :call foo#bar#func()
+
+Note that when you make a mistake and call a function that is supposed to be
+defined in an autoload script, but the script doesn't actually define the
+function, you will get an error message for the missing function. If you fix
+the autoload script it won't be automatically loaded again. Either restart
+Vim or manually source the script.
+
+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.
+
+In |Vim9| script you will get error *E1263* if you define a function with
+a "#" character in the name. You should use a name without "#" and use
+`:export`.
+
+Hint: If you distribute a bunch of scripts you can pack them together with the
+|vimball| utility. Also read the user manual |distribute-script|.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_01.txt b/runtime/doc/usr_01.txt
new file mode 100644
index 0000000..2cb74d4
--- /dev/null
+++ b/runtime/doc/usr_01.txt
@@ -0,0 +1,192 @@
+*usr_01.txt* For Vim version 9.0. Last change: 2019 Nov 21
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ About the manuals
+
+
+This chapter introduces the manuals available with Vim. Read this to know the
+conditions under which the commands are explained.
+
+|01.1| Two manuals
+|01.2| Vim installed
+|01.3| Using the Vim tutor
+|01.4| Copyright
+
+ Next chapter: |usr_02.txt| The first steps in Vim
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*01.1* Two manuals
+
+The Vim documentation consists of two parts:
+
+1. The User manual
+ Task oriented explanations, from simple to complex. Reads from start to
+ end like a book.
+
+2. The Reference manual
+ Precise description of how everything in Vim works.
+
+The notation used in these manuals is explained here: |notation|
+
+
+JUMPING AROUND
+
+The text contains hyperlinks between the two parts, allowing you to quickly
+jump between the description of an editing task and a precise explanation of
+the commands and options used for it. Use these two commands:
+
+ Press CTRL-] to jump to a subject under the cursor.
+ Press CTRL-O to jump back (repeat to go further back).
+
+Many links are in vertical bars, like this: |bars|. The bars themselves may
+be hidden or invisible; see below. An option name, like 'number', a command
+in double quotes like ":write" and any other word can also be used as a link.
+Try it out: Move the cursor to CTRL-] and press CTRL-] on it.
+
+Other subjects can be found with the ":help" command; see |help.txt|.
+
+The bars and stars are usually hidden with the |conceal| feature. They also
+use |hl-Ignore|, using the same color for the text as the background. You can
+make them visible with: >
+ :set conceallevel=0
+ :hi link HelpBar Normal
+ :hi link HelpStar Normal
+
+==============================================================================
+*01.2* Vim installed
+
+Most of the manuals assume that Vim has been properly installed. If you
+didn't do that yet, or if Vim doesn't run properly (e.g., files can't be found
+or in the GUI the menus do not show up) first read the chapter on
+installation: |usr_90.txt|.
+ *not-compatible*
+The manuals often assume you are using Vim with Vi-compatibility switched
+off. For most commands this doesn't matter, but sometimes it is important,
+e.g., for multi-level undo. An easy way to make sure you are using a nice
+setup is to copy the example vimrc file. By doing this inside Vim you don't
+have to check out where it is located. How to do this depends on the system
+you are using:
+
+Unix: >
+ :!cp -i $VIMRUNTIME/vimrc_example.vim ~/.vimrc
+MS-Windows: >
+ :!copy $VIMRUNTIME/vimrc_example.vim $VIM/_vimrc
+Amiga: >
+ :!copy $VIMRUNTIME/vimrc_example.vim $VIM/.vimrc
+
+If the file already exists you probably want to keep it.
+
+If you start Vim now, the 'compatible' option should be off. You can check it
+with this command: >
+
+ :set compatible?
+
+If it responds with "nocompatible" you are doing well. If the response is
+"compatible" you are in trouble. You will have to find out why the option is
+still set. Perhaps the file you wrote above is not found. Use this command
+to find out: >
+
+ :scriptnames
+
+If your file is not in the list, check its location and name. If it is in the
+list, there must be some other place where the 'compatible' option is switched
+back on.
+
+For more info see |vimrc| and |compatible-default|.
+
+ Note:
+ This manual is about using Vim in the normal way. There is an
+ alternative called "evim" (easy Vim). This is still Vim, but used in
+ a way that resembles a click-and-type editor like Notepad. It always
+ stays in Insert mode, thus it feels very different. It is not
+ explained in the user manual, since it should be mostly
+ self-explanatory. See |evim-keys| for details.
+
+==============================================================================
+*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.
+
+On Unix, if Vim has been properly installed, you can start it from the shell:
+>
+ vimtutor
+
+On MS-Windows you can find it in the Program/Vim menu. Or execute
+vimtutor.bat in the $VIMRUNTIME directory.
+
+This will make a copy of the tutor file, so that you can edit it without
+the risk of damaging the original.
+ There are a few translated versions of the tutor. To find out if yours is
+available, use the two-letter language code. For French: >
+
+ vimtutor fr
+
+On Unix, if you prefer using the GUI version of Vim, use "gvimtutor" or
+"vimtutor -g" instead of "vimtutor".
+
+For OpenVMS, if Vim has been properly installed, you can start vimtutor from a
+VMS prompt with: >
+
+ @VIM:vimtutor
+
+Optionally add the two-letter language code as above.
+
+
+On other systems, you have to do a little work:
+
+1. Copy the tutor file. You can do this with Vim (it knows where to find it):
+>
+ vim --clean -c 'e $VIMRUNTIME/tutor/tutor' -c 'w! TUTORCOPY' -c 'q'
+<
+ This will write the file "TUTORCOPY" in the current directory. To use a
+translated version of the tutor, append the two-letter language code to the
+filename. For French:
+>
+ vim --clean -c 'e $VIMRUNTIME/tutor/tutor.fr' -c 'w! TUTORCOPY' -c 'q'
+<
+2. Edit the copied file with Vim:
+>
+ vim --clean TUTORCOPY
+<
+ The --clean argument makes sure Vim is started with nice defaults.
+
+3. Delete the copied file when you are finished with it:
+>
+ del TUTORCOPY
+<
+==============================================================================
+*01.4* Copyright *manual-copyright*
+
+The Vim user manual and reference manual are Copyright (c) 1988-2003 by Bram
+Moolenaar. This material may be distributed only subject to the terms and
+conditions set forth in the Open Publication License, v1.0 or later. The
+latest version is presently available at:
+ http://www.opencontent.org/openpub/
+
+People who contribute to the manuals must agree with the above copyright
+notice.
+ *frombook*
+Parts of the user manual come from the book "Vi IMproved - Vim" by Steve
+Oualline (published by New Riders Publishing, ISBN: 0735710015). The Open
+Publication License applies to this book. Only selected parts are included
+and these have been modified (e.g., by removing the pictures, updating the
+text for Vim 6.0 and later, fixing mistakes). The omission of the |frombook|
+tag does not mean that the text does not come from the book.
+
+Many thanks to Steve Oualline and New Riders for creating this book and
+publishing it under the OPL! It has been a great help while writing the user
+manual. Not only by providing literal text, but also by setting the tone and
+style.
+
+If you make money through selling the manuals, you are strongly encouraged to
+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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_02.txt b/runtime/doc/usr_02.txt
new file mode 100644
index 0000000..680a4e6
--- /dev/null
+++ b/runtime/doc/usr_02.txt
@@ -0,0 +1,702 @@
+*usr_02.txt* For Vim version 9.0. Last change: 2021 Apr 24
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ The first steps in Vim
+
+
+This chapter provides just enough information to edit a file with Vim. Not
+well or fast, but you can edit. Take some time to practice with these
+commands, they form the base for what follows.
+
+|02.1| Running Vim for the First Time
+|02.2| Inserting text
+|02.3| Moving around
+|02.4| Deleting characters
+|02.5| Undo and Redo
+|02.6| Other editing commands
+|02.7| Getting out
+|02.8| Finding help
+
+ Next chapter: |usr_03.txt| Moving around
+ Previous chapter: |usr_01.txt| About the manuals
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*02.1* Running Vim for the First Time
+
+To start Vim, enter this command: >
+
+ gvim file.txt
+
+In UNIX you can type this at any command prompt. If you are running Microsoft
+Windows, open a Command Prompt and enter the command.
+ In either case, Vim starts editing a file called file.txt. Because this
+is a new file, you get a blank window. This is what your screen will look
+like:
+
+ +---------------------------------------+
+ |# |
+ |~ |
+ |~ |
+ |~ |
+ |~ |
+ |"file.txt" [New file] |
+ +---------------------------------------+
+ ('#' is the cursor position.)
+
+The tilde (~) lines indicate lines not in the file. In other words, when Vim
+runs out of file to display, it displays tilde lines. At the bottom of the
+screen, a message line indicates the file is named file.txt and shows that you
+are creating a new file. The message information is temporary and other
+information overwrites it.
+
+
+THE VIM COMMAND
+
+The gvim command causes the editor to create a new window for editing. If you
+use this command: >
+
+ vim file.txt
+
+the editing occurs inside your command window. In other words, if you are
+running inside an xterm, the editor uses your xterm window. If you are using
+an MS-Windows command prompt window, the editing occurs inside this window.
+The text in the window will look the same for both versions, but with gvim you
+have extra features, like a menu bar. More about that later.
+
+==============================================================================
+*02.2* Inserting text
+
+The Vim editor is a modal editor. That means that the editor behaves
+differently, depending on which mode you are in. The two basic modes are
+called Normal mode and Insert mode. In Normal mode the characters you type
+are commands. In Insert mode the characters are inserted as text.
+ Since you have just started Vim it will be in Normal mode. To start Insert
+mode you type the "i" command (i for Insert). Then you can enter
+the text. It will be inserted into the file. Do not worry if you make
+mistakes; you can correct them later. To enter the following programmer's
+limerick, this is what you type: >
+
+ iA very intelligent turtle
+ Found programming UNIX a hurdle
+
+After typing "turtle" you press the <Enter> key to start a new line. Finally
+you press the <Esc> key to stop Insert mode and go back to Normal mode. You
+now have two lines of text in your Vim window:
+
+ +---------------------------------------+
+ |A very intelligent turtle |
+ |Found programming UNIX a hurdle |
+ |~ |
+ |~ |
+ | |
+ +---------------------------------------+
+
+
+WHAT IS THE MODE?
+
+To be able to see what mode you are in, type this command: >
+
+ :set showmode
+
+You will notice that when typing the colon Vim moves the cursor to the last
+line of the window. That's where you type colon commands (commands that start
+with a colon). Finish this command by pressing the <Enter> key (all commands
+that start with a colon are finished this way).
+ Now, if you type the "i" command Vim will display --INSERT-- at the bottom
+of the window. This indicates you are in Insert mode.
+
+ +---------------------------------------+
+ |A very intelligent turtle |
+ |Found programming UNIX a hurdle |
+ |~ |
+ |~ |
+ |-- INSERT -- |
+ +---------------------------------------+
+
+If you press <Esc> to go back to Normal mode the last line will be made blank.
+
+
+GETTING OUT OF TROUBLE
+
+One of the problems for Vim novices is mode confusion, which is caused by
+forgetting which mode you are in or by accidentally typing a command that
+switches modes. To get back to Normal mode, no matter what mode you are in,
+press the <Esc> key. Sometimes you have to press it twice. If Vim beeps back
+at you, you already are in Normal mode.
+
+==============================================================================
+*02.3* Moving around
+
+After you return to Normal mode, you can move around by using these keys:
+
+ h left *hjkl*
+ j down
+ k up
+ l right
+
+At first, it may appear that these commands were chosen at random. After all,
+who ever heard of using l for right? But actually, there is a very good
+reason for these choices: Moving the cursor is the most common thing you do in
+an editor, and these keys are on the home row of your right hand. In other
+words, these commands are placed where you can type them the fastest
+(especially when you type with ten fingers).
+
+ Note:
+ You can also move the cursor by using the arrow keys. If you do,
+ however, you greatly slow down your editing because to press the arrow
+ keys, you must move your hand from the text keys to the arrow keys.
+ Considering that you might be doing it hundreds of times an hour, this
+ can take a significant amount of time.
+ Also, there are keyboards which do not have arrow keys, or which
+ locate them in unusual places; therefore, knowing the use of the hjkl
+ keys helps in those situations.
+
+One way to remember these commands is that h is on the left, l is on the
+right and j points down. In a picture: >
+
+ k
+ h l
+ j
+
+The best way to learn these commands is by using them. Use the "i" command to
+insert some more lines of text. Then use the hjkl keys to move around and
+insert a word somewhere. Don't forget to press <Esc> to go back to Normal
+mode. The |vimtutor| is also a nice way to learn by doing.
+
+For Japanese users, Hiroshi Iwatani suggested using this:
+
+ Komsomolsk
+ ^
+ |
+ Huan Ho <--- ---> Los Angeles
+ (Yellow river) |
+ v
+ Java (the island, not the programming language)
+
+==============================================================================
+*02.4* Deleting characters
+
+To delete a character, move the cursor over it and type "x". (This is a
+throwback to the old days of the typewriter, when you deleted things by typing
+xxxx over them.) Move the cursor to the beginning of the first line, for
+example, and type xxxxxxx (seven x's) to delete "A very ". The result should
+look like this:
+
+ +---------------------------------------+
+ |intelligent turtle |
+ |Found programming UNIX a hurdle |
+ |~ |
+ |~ |
+ | |
+ +---------------------------------------+
+
+Now you can insert new text, for example by typing: >
+
+ iA young <Esc>
+
+This begins an insert (the i), inserts the words "A young", and then exits
+insert mode (the final <Esc>). The result:
+
+ +---------------------------------------+
+ |A young intelligent turtle |
+ |Found programming UNIX a hurdle |
+ |~ |
+ |~ |
+ | |
+ +---------------------------------------+
+
+
+DELETING A LINE
+
+To delete a whole line use the "dd" command. The following line will
+then move up to fill the gap:
+
+ +---------------------------------------+
+ |Found programming UNIX a hurdle |
+ |~ |
+ |~ |
+ |~ |
+ | |
+ +---------------------------------------+
+
+
+DELETING A LINE BREAK
+
+In Vim you can join two lines together, which means that the line break
+between them is deleted. The "J" command does this.
+ Take these two lines:
+
+ A young intelligent ~
+ turtle ~
+
+Move the cursor to the first line and press "J":
+
+ A young intelligent turtle ~
+
+==============================================================================
+*02.5* Undo and Redo
+
+Suppose you delete too much. Well, you can type it in again, but an easier
+way exists. The "u" command undoes the last edit. Take a look at this in
+action: After using "dd" to delete the first line, "u" brings it back.
+ Another one: Move the cursor to the A in the first line:
+
+ A young intelligent turtle ~
+
+Now type xxxxxxx to delete "A young". The result is as follows:
+
+ intelligent turtle ~
+
+Type "u" to undo the last delete. That delete removed the g, so the undo
+restores the character.
+
+ g intelligent turtle ~
+
+The next "u" command restores the next-to-last character deleted:
+
+ ng intelligent turtle ~
+
+The next "u" command gives you the u, and so on:
+
+ ung intelligent turtle ~
+ oung intelligent turtle ~
+ young intelligent turtle ~
+ young intelligent turtle ~
+ A young intelligent turtle ~
+
+ Note:
+ If you type "u" twice, and the result is that you get the same text
+ back, you have Vim configured to work Vi compatible. Look here to fix
+ this: |not-compatible|.
+ This text assumes you work "The Vim Way". You might prefer to use
+ the good old Vi way, but you will have to watch out for small
+ differences in the text then.
+
+
+REDO
+
+If you undo too many times, you can press CTRL-R (redo) to reverse the
+preceding command. In other words, it undoes the undo. To see this in
+action, press CTRL-R twice. The character A and the space after it disappear:
+
+ young intelligent turtle ~
+
+There's a special version of the undo command, the "U" (undo line) command.
+The undo line command undoes all the changes made on the last line that was
+edited. Typing this command twice cancels the preceding "U".
+
+ A very intelligent turtle ~
+ xxxx Delete very
+
+ A intelligent turtle ~
+ xxxxxx Delete turtle
+
+ A intelligent ~
+ Restore line with "U"
+ A very intelligent turtle ~
+ Undo "U" with "u"
+ A intelligent ~
+
+The "U" command is a change by itself, which the "u" command undoes and CTRL-R
+redoes. This might be a bit confusing. Don't worry, with "u" and CTRL-R you
+can go to any of the situations you had. More about that in section |32.2|.
+
+==============================================================================
+*02.6* Other editing commands
+
+Vim has a large number of commands to change the text. See |Q_in| and below.
+Here are a few often used ones.
+
+
+APPENDING
+
+The "i" command inserts a character before the character under the cursor.
+That works fine; but what happens if you want to add stuff to the end of the
+line? For that you need to insert text after the cursor. This is done with
+the "a" (append) command.
+ For example, to change the line
+
+ and that's not saying much for the turtle. ~
+to
+ and that's not saying much for the turtle!!! ~
+
+move the cursor over to the dot at the end of the line. Then type "x" to
+delete the period. The cursor is now positioned at the end of the line on the
+e in turtle. Now type >
+
+ a!!!<Esc>
+
+to append three exclamation points after the e in turtle:
+
+ and that's not saying much for the turtle!!! ~
+
+
+OPENING UP A NEW LINE
+
+The "o" command creates a new, empty line below the cursor and puts Vim in
+Insert mode. Then you can type the text for the new line.
+ Suppose the cursor is somewhere in the first of these two lines:
+
+ A very intelligent turtle ~
+ Found programming UNIX a hurdle ~
+
+If you now use the "o" command and type new text: >
+
+ oThat liked using Vim<Esc>
+
+The result is:
+
+ A very intelligent turtle ~
+ That liked using Vim ~
+ Found programming UNIX a hurdle ~
+
+The "O" command (uppercase) opens a line above the cursor.
+
+
+USING A COUNT
+
+Suppose you want to move up nine lines. You can type "kkkkkkkkk" or you can
+enter the command "9k". In fact, you can precede many commands with a number.
+Earlier in this chapter, for instance, you added three exclamation points to
+the end of a line by typing "a!!!<Esc>". Another way to do this is to use the
+command "3a!<Esc>". The count of 3 tells the command that follows to triple
+its effect. Similarly, to delete three characters, use the command "3x". The
+count always comes before the command it applies to.
+
+==============================================================================
+*02.7* Getting out
+
+To exit, use the "ZZ" command. This command writes the file and exits.
+
+ Note:
+ Unlike many other editors, Vim does not automatically make a backup
+ file. If you type "ZZ", your changes are committed and there's no
+ turning back. You can configure the Vim editor to produce backup
+ files; see |07.4|.
+
+
+DISCARDING CHANGES
+
+Sometimes you will make a sequence of changes and suddenly realize you were
+better off before you started. Not to worry; Vim has a
+quit-and-throw-things-away command. It is: >
+
+ :q!
+
+Don't forget to press <Enter> to finish the command.
+
+For those of you interested in the details, the three parts of this command
+are the colon (:), which enters Command-line mode; the q command, which tells
+the editor to quit; and the override command modifier (!).
+ The override command modifier is needed because Vim is reluctant to throw
+away changes. If you were to just type ":q", Vim would display an error
+message and refuse to exit:
+
+ E37: No write since last change (use ! to override) ~
+
+By specifying the override, you are in effect telling Vim, "I know that what
+I'm doing looks stupid, but I really want to do this."
+
+If you want to continue editing with Vim: The ":e!" command reloads the
+original version of the file.
+
+==============================================================================
+*02.8* Finding help
+
+Everything you always wanted to know can be found in the Vim help files.
+Don't be afraid to ask!
+
+If you know what you are looking for, it is usually easier to search for it
+using the help system, instead of using Google. Because the subjects follow
+a certain style guide.
+
+Also the help has the advantage of belonging to your particular Vim version.
+You won't see help for commands added later. These would not work for you.
+
+To get generic help use this command: >
+
+ :help
+
+You could also use the first function key <F1>. If your keyboard has a <Help>
+key it might work as well.
+ If you don't supply a subject, ":help" displays the general help window.
+The creators of Vim did something very clever (or very lazy) with the help
+system: They made the help window a normal editing window. You can use all
+the normal Vim commands to move through the help information. Therefore h, j,
+k, and l move left, down, up and right.
+ To get out of the help window, use the same command you use to get out of
+the editor: "ZZ". This will only close the help window, not exit Vim.
+
+As you read the help text, you will notice some text enclosed in vertical bars
+(for example, |help|). This indicates a hyperlink. If you position the
+cursor anywhere between the bars and press CTRL-] (jump to tag), the help
+system takes you to the indicated subject. (For reasons not discussed here,
+the Vim terminology for a hyperlink is tag. So CTRL-] jumps to the location
+of the tag given by the word under the cursor.)
+ After a few jumps, you might want to go back. CTRL-T (pop tag) takes you
+back to the preceding position. CTRL-O (jump to older position) also works
+nicely here.
+ At the top of the help screen, there is the notation *help.txt*. This name
+between "*" characters is used by the help system to define a tag (hyperlink
+destination).
+ See |29.1| for details about using tags.
+
+To get help on a given subject, use the following command: >
+
+ :help {subject}
+
+To get help on the "x" command, for example, enter the following: >
+
+ :help x
+
+To find out how to delete text, use this command: >
+
+ :help deleting
+
+To get a complete index of all Vim commands, use the following command: >
+
+ :help index
+
+When you need to get help for a control character command (for example,
+CTRL-A), you need to spell it with the prefix "CTRL-". >
+
+ :help CTRL-A
+
+The Vim editor has many different modes. By default, the help system displays
+the normal-mode commands. For example, the following command displays help
+for the normal-mode CTRL-H command: >
+
+ :help CTRL-H
+
+To identify other modes, use a mode prefix. If you want the help for the
+insert-mode version of a command, use "i_". For CTRL-H this gives you the
+following command: >
+
+ :help i_CTRL-H
+
+When you start the Vim editor, you can use several command-line arguments.
+These all begin with a dash (-). To find what the -t argument does, for
+example, use the command: >
+
+ :help -t
+
+The Vim editor has a number of options that enable you to configure and
+customize the editor. If you want help for an option, you need to enclose it
+in single quotation marks. To find out what the 'number' option does, for
+example, use the following command: >
+
+ :help 'number'
+
+The table with all mode prefixes can be found below: |help-summary|.
+
+Special keys are enclosed in angle brackets. To find help on the up-arrow key
+in Insert mode, for instance, use this command: >
+
+ :help i_<Up>
+
+If you see an error message that you don't understand, for example:
+
+ E37: No write since last change (use ! to override) ~
+
+You can use the error ID at the start to find help about it: >
+
+ :help E37
+
+
+Summary: *help-summary* >
+
+1) Use Ctrl-D after typing a topic and let Vim show all available topics.
+ Or press Tab to complete: >
+ :help some<Tab>
+< More information on how to use the help: >
+ :help helphelp
+
+2) Follow the links in bars to related help. You can go from the detailed
+ help to the user documentation, which describes certain commands more from
+ a user perspective and less detailed. E.g. after: >
+ :help pattern.txt
+< You can see the user guide topics |03.9| and |usr_27.txt| in the
+ introduction.
+
+3) Options are enclosed in single apostrophes. To go to the help topic for the
+ list option: >
+ :help 'list'
+< If you only know you are looking for a certain option, you can also do: >
+ :help options.txt
+< to open the help page which describes all option handling and then search
+ using regular expressions, e.g. textwidth.
+ Certain options have their own namespace, e.g.: >
+ :help cpo-<letter>
+< for the corresponding flag of the 'cpoptions' settings, substitute <letter>
+ by a specific flag, e.g.: >
+ :help cpo-;
+< And for the 'guioptions' flags: >
+ :help go-<letter>
+
+4) Normal mode commands do not have a prefix. To go to the help page for the
+ "gt" command: >
+ :help gt
+
+5) Insert mode commands start with i_. Help for deleting a word: >
+ :help i_CTRL-W
+
+6) Visual mode commands start with v_. Help for jumping to the other side of
+ the Visual area: >
+ :help v_o
+
+7) Command line editing and arguments start with c_. Help for using the
+ command argument %: >
+ :help c_%
+
+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 the help
+ for the "cont" debug command: >
+ :help >cont
+
+10) Key combinations. They usually start with a single letter indicating
+ the mode for which they can be used. E.g.: >
+ :help i_CTRL-X
+< takes you to the family of CTRL-X commands for insert mode which can be
+ used to auto-complete different things. Note, that certain keys will
+ always be written the same, e.g. Control will always be CTRL.
+ For normal mode commands there is no prefix and the topic is available at
+ :h CTRL-<Letter>. E.g. >
+ :help CTRL-W
+< In contrast >
+ :help c_CTRL-R
+< will describe what the CTRL-R does when entering commands in the Command
+ line and >
+ :help v_CTRL-A
+< talks about incrementing numbers in visual mode and >
+ :help g_CTRL-A
+< talks about the "g<C-A>" command (e.g. you have to press "g" then
+ <CTRL-A>). Here the "g" stands for the normal command "g" which always
+ expects a second key before doing something similar to the commands
+ starting with "z".
+
+11) Regexp items always start with /. So to get help for the "\+" quantifier
+ in Vim regexes: >
+ :help /\+
+< If you need to know everything about regular expressions, start reading
+ at: >
+ :help pattern.txt
+
+12) Registers always start with "quote". To find out about the special ":"
+ register: >
+ :help quote:
+
+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. >
+ :help expr-!
+< will take you to the topic describing the "!" (Not) operator for Vim
+ script.
+ Also important is >
+ :help function-list
+< to find a short description of all functions available. Help topics for
+ Vim script functions always include the "()", so: >
+ :help append()
+< 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
+< to find out about the |:imap| command. Also use :map-topic
+ to find out about certain subtopics particular for mappings. e.g: >
+ :help :map-local
+< for buffer-local mappings or >
+ :help map-bar
+< for how the '|' is handled in mappings.
+
+15) Command definitions are talked about :h command-topic, so use >
+ :help command-bar
+< to find out about the '!' argument for custom commands.
+
+16) Window management commands always start with CTRL-W, so you find the
+ corresponding help at :h CTRL-W_letter. E.g. >
+ :help CTRL-W_p
+< for moving the previous accessed window. You can also access >
+ :help windows.txt
+< and read your way through if you are looking for window handling
+ commands.
+
+17) Use |:helpgrep| to search in all help pages (and also of any installed
+ plugins). See |:helpgrep| for how to use it.
+ To search for a topic: >
+ :helpgrep topic
+< This takes you to the first match. To go to the next one: >
+ :cnext
+< All matches are available in the quickfix window which can be opened
+ with: >
+ :copen
+< Move around to the match you like and press Enter to jump to that help.
+
+18) The user manual. This describes help topics for beginners in a rather
+ friendly way. Start at |usr_toc.txt| to find the table of content (as you
+ might have guessed): >
+ :help usr_toc.txt
+< Skim over the contents to find interesting topics. The "Digraphs" and
+ "Entering special characters" items are in chapter 24, so to go to that
+ particular help page: >
+ :help usr_24.txt
+< Also if you want to access a certain chapter in the help, the chapter
+ number can be accessed directly like this: >
+ :help 10.1
+< which goes to chapter 10.1 in |usr_10.txt| and talks about recording
+ macros.
+
+19) Highlighting groups. Always start with hl-groupname. E.g. >
+ :help hl-WarningMsg
+< talks about the WarningMsg highlighting group.
+
+20) Syntax highlighting is namespaced to :syn-topic. E.g. >
+ :help :syn-conceal
+< talks about the conceal argument for the ":syn" command.
+
+21) Quickfix commands usually start with :c while location list commands
+ usually start with :l
+
+22) Autocommand events can be found by their name: >
+ :help BufWinLeave
+< To see all possible events: >
+ :help autocommand-events
+
+23) Command-line switches always start with "-". So for the help of the -f
+ command switch of Vim use: >
+ :help -f
+
+24) Optional features always start with "+". To find out about the
+ conceal feature use: >
+ :help +conceal
+
+25) Documentation for included filetype specific functionality is usually
+ available in the form ft-<filetype>-<functionality>. So >
+ :help ft-c-syntax
+< talks about the C syntax file and the option it provides. Sometimes,
+ additional sections for omni completion >
+ :help ft-php-omni
+< or filetype plugins >
+ :help ft-tex-plugin
+< are available.
+
+26) Error and Warning codes can be looked up directly in the help. So >
+ :help E297
+< takes you exactly to the description of the swap error message and >
+ :help W10
+< talks about the warning "Changing a readonly file".
+ Sometimes, however, those error codes are not described, but rather are
+ listed at the Vim command that usually causes this. So: >
+ :help E128
+< takes you to the |:function| command
+
+
+==============================================================================
+
+Next chapter: |usr_03.txt| Moving around
+
+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
new file mode 100644
index 0000000..baae7f8
--- /dev/null
+++ b/runtime/doc/usr_03.txt
@@ -0,0 +1,661 @@
+*usr_03.txt* For Vim version 9.0. Last change: 2022 Oct 30
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Moving around
+
+
+Before you can insert or delete text the cursor has to be moved to the right
+place. Vim has a large number of commands to position the cursor. This
+chapter shows you how to use the most important ones. You can find a list of
+these commands below |Q_lr|.
+
+|03.1| Word movement
+|03.2| Moving to the start or end of a line
+|03.3| Moving to a character
+|03.4| Matching a parenthesis
+|03.5| Moving to a specific line
+|03.6| Telling where you are
+|03.7| Scrolling around
+|03.8| Simple searches
+|03.9| Simple search patterns
+|03.10| Using marks
+
+ Next chapter: |usr_04.txt| Making small changes
+ Previous chapter: |usr_02.txt| The first steps in Vim
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*03.1* Word movement
+
+To move the cursor forward one word, use the "w" command. Like most Vim
+commands, you can use a numeric prefix to move past multiple words. For
+example, "3w" moves three words. This figure shows how it works (starting at
+the position marked with "x"):
+
+ This is a line with example text ~
+ x-->-->->----------------->
+ w w w 3w
+
+Notice that "w" moves to the start of the next word if it already is at the
+start of a word.
+ The "b" command moves backward to the start of the previous word:
+
+ This is a line with example text ~
+ <----<--<-<---------<--x
+ b b b 2b b
+
+There is also the "e" command that moves to the next end of a word and "ge",
+which moves to the previous end of a word:
+
+ This is a line with example text ~
+ <----<----x---->------------>
+ 2ge ge e 2e
+
+If you are at the last word of a line, the "w" command will take you to the
+first word in the next line. Thus you can use this to move through a
+paragraph, much faster than using "l". "b" does the same in the other
+direction.
+
+A word ends at a non-word character, such as a ".", "-" or ")". To change
+what Vim considers to be a word, see the 'iskeyword' option. If you try this
+out in the help directly, 'iskeyword' needs to be reset for the examples to
+work: >
+ :set iskeyword&
+It is also possible to move by white-space separated WORDs. This is not a
+word in the normal sense, that's why the uppercase is used. The commands for
+moving by WORDs are also uppercase, as this figure shows:
+
+ ge b w e
+ <- <- ---> --->
+ This is-a line, with special/separated/words (and some more). ~
+ <----- <----- --------------------> ----->
+ gE B W E
+
+With this mix of lowercase and uppercase commands, you can quickly move
+forward and backward through a paragraph.
+
+==============================================================================
+*03.2* Moving to the start or end of a line
+
+The "$" command moves the cursor to the end of a line. If your keyboard has
+an <End> key it will do the same thing.
+
+The "^" command moves to the first non-blank character of the line. The "0"
+command (zero) moves to the very first character of the line, and the <Home>
+key does the same thing. In a picture ("." indicates a space):
+
+ ^
+ <-----------x
+ .....This is a line with example text ~
+ <----------------x x-------------->
+ 0 $
+
+(the "....." indicates blanks here)
+
+ The "$" command takes a count, like most movement commands. But moving to
+the end of the line several times doesn't make sense. Therefore it causes the
+editor to move to the end of another line. For example, "1$" moves you to
+the end of the first line (the one you're on), "2$" to the end of the next
+line, and so on.
+ The "0" command doesn't take a count argument, because the "0" would be
+part of the count. Unexpectedly, using a count with "^" doesn't have any
+effect.
+
+==============================================================================
+*03.3* Moving to a character
+
+One of the most useful movement commands is the single-character search
+command. The command "fx" searches forward in the line for the single
+character x. Hint: "f" stands for "Find".
+ For example, you are at the beginning of the following line. Suppose you
+want to go to the h of human. Just execute the command "fh" and the cursor
+will be positioned over the h:
+
+ To err is human. To really foul up you need a computer. ~
+ ---------->--------------->
+ fh fy
+
+This also shows that the command "fy" moves to the end of the word really.
+ You can specify a count; therefore, you can go to the "l" of "foul" with
+"3fl":
+
+ To err is human. To really foul up you need a computer. ~
+ --------------------->
+ 3fl
+
+The "F" command searches to the left:
+
+ To err is human. To really foul up you need a computer. ~
+ <---------------------
+ Fh
+
+The "tx" command works like the "fx" command, except it stops one character
+before the searched character. Hint: "t" stands for "To". The backward
+version of this command is "Tx".
+
+ To err is human. To really foul up you need a computer. ~
+ <------------ ------------->
+ Th tn
+
+These four commands can be repeated with ";". "," repeats in the other
+direction. The cursor is never moved to another line. Not even when the
+sentence continues.
+
+Sometimes you will start a search, only to realize that you have typed the
+wrong command. You type "f" to search backward, for example, only to realize
+that you really meant "F". To abort a search, press <Esc>. So "f<Esc>" is an
+aborted forward search and doesn't do anything. Note: <Esc> cancels most
+operations, not just searches.
+
+==============================================================================
+*03.4* Matching a parenthesis
+
+When writing a program you often end up with nested () constructs. Then the
+"%" command is very handy: It moves to the matching paren. If the cursor is
+on a "(" it will move to the matching ")". If it's on a ")" it will move to
+the matching "(".
+
+ %
+ <----->
+ if (a == (b * c) / d) ~
+ <---------------->
+ %
+
+This also works for [] and {} pairs. (This can be defined with the
+'matchpairs' option.)
+
+When the cursor is not on a useful character, "%" will search forward to find
+one. Thus if the cursor is at the start of the line of the previous example,
+"%" will search forward and find the first "(". Then it moves to its match:
+
+ if (a == (b * c) / d) ~
+ ---+---------------->
+ %
+
+==============================================================================
+*03.5* Moving to a specific line
+
+If you are a C or C++ programmer, you are familiar with error messages such as
+the following:
+
+ prog.c:33: j undeclared (first use in this function) ~
+
+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
+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
+|usr_30.txt|, for information on the :make command.)
+ With no argument, "G" positions you at the end of the file. A quick way to
+go to the start of a file use "gg". "1G" will do the same, but is a tiny bit
+more typing.
+
+ | first line of a file ^
+ | text text text text |
+ | text text text text | gg
+ 7G | text text text text |
+ | text text text text
+ | text text text text
+ V text text text text |
+ text text text text | G
+ text text text text |
+ last line of a file V
+
+Another way to move to a line is using the "%" command with a count. For
+example "50%" moves you to halfway the file. "90%" goes to near the end.
+
+The previous assumes that you want to move to a line in the file, no matter if
+it's currently visible or not. What if you want to move to one of the lines
+you can see? This figure shows the three commands you can use:
+
+ +---------------------------+
+ H --> | text sample text |
+ | sample text |
+ | text sample text |
+ | sample text |
+ M --> | text sample text |
+ | sample text |
+ | text sample text |
+ | sample text |
+ L --> | text sample text |
+ +---------------------------+
+
+Hints: "H" stands for Home, "M" for Middle and "L" for Last. Alternatively,
+"H" for High, "M" for Middle and "L" for Low.
+
+==============================================================================
+*03.6* Telling where you are
+
+To see where you are in a file, there are three ways:
+
+1. Use the CTRL-G command. You get a message like this (assuming the 'ruler'
+ option is off):
+
+ "usr_03.txt" line 233 of 650 --35%-- col 45-52 ~
+
+ This shows the name of the file you are editing, the line number where the
+ cursor is, the total number of lines, the percentage of the way through
+ the file and the column of the cursor.
+ Sometimes you will see a split column number. For example, "col 2-9".
+ This indicates that the cursor is positioned on the second character, but
+ because character one is a tab, occupying eight spaces worth of columns,
+ the screen column is 9.
+
+2. Set the 'number' option. This will display a line number in front of
+ every line: >
+
+ :set number
+<
+ To switch this off again: >
+
+ :set nonumber
+<
+ Since 'number' is a boolean option, prepending "no" to its name has the
+ effect of switching it off. A boolean option has only these two values,
+ it is either on or off.
+ Vim has many options. Besides the boolean ones there are options with
+ a numerical value and string options. You will see examples of this where
+ they are used.
+
+3. Set the 'ruler' option. This will display the cursor position in the
+ lower right corner of the Vim window: >
+
+ :set ruler
+
+Using the 'ruler' option has the advantage that it doesn't take much room,
+thus there is more space for your text.
+
+==============================================================================
+*03.7* Scrolling around
+
+The CTRL-U command scrolls down half a screen of text. Think of looking
+through a viewing window at the text and moving this window up by half the
+height of the window. Thus the window moves up over the text, which is
+backward in the file. Don't worry if you have a little trouble remembering
+which end is up. Most users have the same problem.
+ The CTRL-D command moves the viewing window down half a screen in the file,
+thus scrolls the text up half a screen.
+
+ +----------------+
+ | some text |
+ | some text |
+ | some text |
+ +---------------+ | some text |
+ | some text | CTRL-U --> | |
+ | | | 123456 |
+ | 123456 | +----------------+
+ | 7890 |
+ | | +----------------+
+ | example | CTRL-D --> | 7890 |
+ +---------------+ | |
+ | example |
+ | example |
+ | example |
+ | example |
+ +----------------+
+
+To scroll one line at a time use CTRL-E (scroll up) and CTRL-Y (scroll down).
+Think of CTRL-E to give you one line Extra. (If you use MS-Windows compatible
+key mappings CTRL-Y will redo a change instead of scroll.)
+
+To scroll forward by a whole screen (except for two lines) use CTRL-F. To
+scroll backwards, use CTRL-B. These should be easy to remember: F for
+Forwards and B for Backwards.
+
+A common issue is that after moving down many lines with "j" your cursor is at
+the bottom of the screen. You would like to see the context of the line with
+the cursor. That's done with the "zz" command.
+
+ +------------------+ +------------------+
+ | earlier text | | earlier text |
+ | earlier text | | earlier text |
+ | earlier text | | earlier text |
+ | earlier text | zz --> | line with cursor |
+ | earlier text | | later text |
+ | earlier text | | later text |
+ | line with cursor | | later text |
+ +------------------+ +------------------+
+
+The "zt" command puts the cursor line at the top, "zb" at the bottom. There
+are a few more scrolling commands, see |Q_sc|. To always keep a few lines of
+context around the cursor, use the 'scrolloff' option.
+
+==============================================================================
+*03.8* Simple searches
+
+To search for a string, use the "/string" command. To find the word include,
+for example, use the command: >
+
+ /include
+
+You will notice that when you type the "/" the cursor jumps to the last line
+of the Vim window, like with colon commands. That is where you type the word.
+You can press the backspace key (backarrow or <BS>) to make corrections. Use
+the <Left> and <Right> cursor keys when necessary.
+ Pressing <Enter> executes the command.
+
+ Note:
+ The characters .*[]^%/\?~$ have special meanings. If you want to use
+ them in a search you must put a \ in front of them. See below.
+
+To find the next occurrence of the same string use the "n" command. Use this
+to find the first #include after the cursor: >
+
+ /#include
+
+And then type "n" several times. You will move to each #include in the text.
+You can also use a count if you know which match you want. Thus "3n" finds
+the third match. You can also use a count with "/": "4/the" goes to the
+fourth match of "the".
+
+The "?" command works like "/" but searches backwards: >
+
+ ?word
+
+The "N" command repeats the last search the opposite direction. Thus using
+"N" after a "/" command searches backwards, using "N" after "?" searches
+forwards.
+
+
+IGNORING CASE
+
+Normally you have to type exactly what you want to find. If you don't care
+about upper or lowercase in a word, set the 'ignorecase' option: >
+
+ :set ignorecase
+
+If you now search for "word", it will also match "Word" and "WORD". To match
+case again: >
+
+ :set noignorecase
+
+
+HISTORY
+
+Suppose you do three searches: >
+
+ /one
+ /two
+ /three
+
+Now let's start searching by typing a simple "/" without pressing <Enter>. If
+you press <Up> (the cursor key), Vim puts "/three" on the command line.
+Pressing <Enter> at this point searches for three. If you do not press
+<Enter>, but press <Up> instead, Vim changes the prompt to "/two". Another
+press of <Up> moves you to "/one".
+ You can also use the <Down> cursor key to move through the history of
+search commands in the other direction.
+
+If you know what a previously used pattern starts with, and you want to use it
+again, type that character before pressing <Up>. With the previous example,
+you can type "/o<Up>" and Vim will put "/one" on the command line.
+
+The commands starting with ":" also have a history. That allows you to recall
+a previous command and execute it again. These two histories are separate.
+
+
+SEARCHING FOR A WORD IN THE TEXT
+
+Suppose you see the word "TheLongFunctionName" in the text and you want to
+find the next occurrence of it. You could type "/TheLongFunctionName", but
+that's a lot of typing. And when you make a mistake Vim won't find it.
+ There is an easier way: Position the cursor on the word and use the "*"
+command. Vim will grab the word under the cursor and use it as the search
+string.
+ The "#" command does the same in the other direction. You can prepend a
+count: "3*" searches for the third occurrence of the word under the cursor.
+
+
+SEARCHING FOR WHOLE WORDS
+
+If you type "/the" it will also match "there". To only find words that end
+in "the" use: >
+
+ /the\>
+
+The "\>" item is a special marker that only matches at the end of a word.
+Similarly "\<" only matches at the beginning of a word. Thus to search for
+the word "the" only: >
+
+ /\<the\>
+
+This does not match "there" or "soothe". Notice that the "*" and "#" commands
+use these start-of-word and end-of-word markers to only find whole words (you
+can use "g*" and "g#" to match partial words).
+
+
+HIGHLIGHTING MATCHES
+
+While editing a program you see a variable called "nr". You want to check
+where it's used. You could move the cursor to "nr" and use the "*" command
+and press "n" to go along all the matches.
+ There is another way. Type this command: >
+
+ :set hlsearch
+
+If you now search for "nr", Vim will highlight all matches. That is a very
+good way to see where the variable is used, without the need to type commands.
+ To switch this off: >
+
+ :set nohlsearch
+
+Then you need to switch it on again if you want to use it for the next search
+command. If you only want to remove the highlighting, use this command: >
+
+ :nohlsearch
+
+This doesn't reset the option. Instead, it disables the highlighting. As
+soon as you execute a search command, the highlighting will be used again.
+Also for the "n" and "N" commands.
+
+
+TUNING SEARCHES
+
+There are a few options that change how searching works. These are the
+essential ones:
+>
+ :set incsearch
+
+This makes Vim display the match for the string while you are still typing it.
+Use this to check if the right match will be found. Then press <Enter> to
+really jump to that location. Or type more to change the search string.
+>
+ :set nowrapscan
+
+This stops the search at the end of the file. Or, when you are searching
+backwards, it stops the search at the start of the file. The 'wrapscan'
+option is on by default, thus searching wraps around the end of the file.
+
+
+INTERMEZZO
+
+If you like one of the options mentioned before, and set it each time you use
+Vim, you can put the command in your Vim startup file.
+ Edit the file, as mentioned at |not-compatible|. Or use this command to
+find out where it is: >
+
+ :scriptnames
+
+Edit the file, for example with: >
+
+ :edit ~/.vimrc
+
+Then add a line with the command to set the option, just like you typed it in
+Vim. Example: >
+
+ Go:set hlsearch<Esc>
+
+"G" moves to the end of the file. "o" starts a new line, where you type the
+":set" command. You end insert mode with <Esc>. Then write and close the
+file: >
+
+ ZZ
+
+If you now start Vim again, the 'hlsearch' option will already be set.
+
+==============================================================================
+*03.9* Simple search patterns
+
+The Vim editor uses regular expressions to specify what to search for.
+Regular expressions are an extremely powerful and compact way to specify a
+search pattern. Unfortunately, this power comes at a price, because regular
+expressions are a bit tricky to specify.
+ In this section we mention only a few essential ones. More about search
+patterns and commands can be found in chapter 27 |usr_27.txt|. You can find
+the full explanation here: |pattern|.
+
+
+BEGINNING AND END OF A LINE
+
+The ^ character matches the beginning of a line. On an English-US keyboard
+you find it above the 6. The pattern "include" matches the word include
+anywhere on the line. But the pattern "^include" matches the word include
+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:
+
+ the solder holding one of the chips melted and the ~
+ xxx xxx xxx
+
+Using "/the$" we find this match:
+
+ the solder holding one of the chips melted and the ~
+ xxx
+
+And with "/^the" we find this one:
+ the solder holding one of the chips melted and the ~
+ xxx
+
+You can try searching with "/^the$"; it will only match a single line
+consisting entirely of "the". White space does matter here, thus if a line
+contains a space after the word, like "the ", the pattern will not match.
+
+
+MATCHING ANY SINGLE CHARACTER
+
+The . (dot) character matches any existing character. For example, the
+pattern "c.m" matches a string whose first character is a c, whose second
+character is anything, and whose third character is m. Example:
+
+ We use a computer that became the cummin winter. ~
+ xxx xxx xxx
+
+
+MATCHING SPECIAL CHARACTERS
+
+If you really want to match a dot, you must avoid its special meaning by
+putting a backslash before it.
+ If you search for "ter.", you will find these matches:
+
+ We use a computer that became the cummin winter. ~
+ xxxx xxxx
+
+Searching for "ter\." only finds the second match.
+
+==============================================================================
+*03.10* Using marks
+
+When you make a jump to a position with the "G" command, Vim remembers the
+position from before this jump. This position is called a mark. To go back
+where you came from, use this command: >
+
+ ``
+
+This ` is a backtick or open single-quote character.
+ If you use the same command a second time you will jump back again. That's
+because the "`" command is a jump itself, and the position from before this
+jump is remembered.
+
+Generally, every time you do a command that can move the cursor further than
+within the same line, this is called a jump. This includes the search
+commands "/" and "n" (it doesn't matter how far away the match is). But not
+the character searches with "fx" and "tx" or the word movements "w" and "e".
+ Also, "j" and "k" are not considered to be a jump, even when you use a
+count to make them move the cursor quite a long way away.
+
+The "``" command jumps back and forth, between two points. The CTRL-O command
+jumps to older positions (Hint: O for older). CTRL-I then jumps back to newer
+positions (Hint: for many common keyboard layouts, I is just next to O).
+Consider this sequence of commands: >
+
+ 33G
+ /^The
+ CTRL-O
+
+You first jump to line 33, then search for a line that starts with "The".
+Then with CTRL-O you jump back to line 33. Another CTRL-O takes you back to
+where you started. If you now use CTRL-I you jump to line 33 again. And
+to the match for "The" with another CTRL-I.
+
+
+ | example text ^ |
+ 33G | example text | CTRL-O | CTRL-I
+ | example text | |
+ V line 33 text ^ V
+ | example text | |
+ /^The | example text | CTRL-O | CTRL-I
+ V There you are | V
+ example text
+
+ Note:
+ CTRL-I is the same as <Tab>.
+
+The ":jumps" command gives a list of positions you jumped to. The entry which
+you used last is marked with a ">".
+
+
+NAMED MARKS *bookmark*
+
+Vim enables you to place your own marks in the text. The command "ma" marks
+the place under the cursor as mark a. You can place 26 marks (a through z) in
+your text. You can't see them, it's just a position that Vim remembers.
+ To go to a mark, use the command `{mark}, where {mark} is the mark letter.
+Thus to move to the a mark:
+>
+ `a
+
+The command "'mark" (single quotation mark, or apostrophe) moves you to the
+beginning of the line containing the mark. This differs from the "`mark"
+command, which also moves you to the marked column.
+
+The marks can be very useful when working on two related parts in a file.
+Suppose you have some text near the start of the file you need to look at,
+while working on some text near the end of the file.
+ Move to the text at the start and place the s (start) mark there: >
+
+ ms
+
+Then move to the text you want to work on and put the e (end) mark there: >
+
+ me
+
+Now you can move around, and when you want to look at the start of the file,
+you use this to jump there: >
+
+ 's
+
+Then you can use '' to jump back to where you were, or 'e to jump to the text
+you were working on at the end.
+ There is nothing special about using s for start and e for end, they are
+just easy to remember.
+
+You can use this command to get a list of marks: >
+
+ :marks
+
+You will notice a few special marks. These include:
+
+ ' The cursor position before doing a jump
+ " The cursor position when last editing the file
+ [ Start of the last change
+ ] End of the last change
+
+==============================================================================
+
+Next chapter: |usr_04.txt| Making small changes
+
+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
new file mode 100644
index 0000000..91c13aa
--- /dev/null
+++ b/runtime/doc/usr_04.txt
@@ -0,0 +1,516 @@
+*usr_04.txt* For Vim version 9.0. Last change: 2021 Feb 22
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Making small changes
+
+
+This chapter shows you several ways of making corrections and moving text
+around. It teaches you the three basic ways to change text: operator-motion,
+Visual mode and text objects.
+
+|04.1| Operators and motions
+|04.2| Changing text
+|04.3| Repeating a change
+|04.4| Visual mode
+|04.5| Moving text
+|04.6| Copying text
+|04.7| Using the clipboard
+|04.8| Text objects
+|04.9| Replace mode
+|04.10| Conclusion
+
+ Next chapter: |usr_05.txt| Set your settings
+ Previous chapter: |usr_03.txt| Moving around
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*04.1* Operators and motions
+
+In chapter 2 you learned the "x" command to delete a single character. And
+using a count: "4x" deletes four characters.
+ The "dw" command deletes a word. You may recognize the "w" command as the
+move word command. In fact, the "d" command may be followed by any motion
+command, and it deletes from the current location to the place where the
+cursor winds up.
+ The "4w" command, for example, moves the cursor over four words. The "d4w"
+command deletes four words.
+
+ To err is human. To really foul up you need a computer. ~
+ ------------------>
+ d4w
+
+ To err is human. you need a computer. ~
+
+Vim only deletes up to the position where the motion takes the cursor. That's
+because Vim knows that you probably don't want to delete the first character
+of a word. If you use the "e" command to move to the end of a word, Vim
+guesses that you do want to include that last character:
+
+ To err is human. you need a computer. ~
+ -------->
+ d2e
+
+ To err is human. a computer. ~
+
+Whether the character under the cursor is included depends on the command you
+used to move to that character. The reference manual calls this "exclusive"
+when the character isn't included and "inclusive" when it is.
+
+The "$" command moves to the end of a line. The "d$" command deletes from the
+cursor to the end of the line. This is an inclusive motion, thus the last
+character of the line is included in the delete operation:
+
+ To err is human. a computer. ~
+ ------------>
+ d$
+
+ To err is human ~
+
+There is a pattern here: operator-motion. You first type an operator command.
+For example, "d" is the delete operator. Then you type a motion command like
+"4l" or "w". This way you can operate on any text you can move over.
+
+==============================================================================
+*04.2* Changing text
+
+Another operator is "c", change. It acts just like the "d" operator, except
+it leaves you in Insert mode. For example, "cw" changes a word. Or more
+specifically, it deletes a word and then puts you in Insert mode.
+
+ To err is human ~
+ ------->
+ c2wbe<Esc>
+
+ To be human ~
+
+This "c2wbe<Esc>" contains these bits:
+
+ c the change operator
+ 2w move two words (they are deleted and Insert mode started)
+ be insert this text
+ <Esc> back to Normal mode
+
+You will have noticed something strange: The space before "human" isn't
+deleted. There is a saying that for every problem there is an answer that is
+simple, clear, and wrong. That is the case with the example used here for the
+"cw" command. The c operator works just like the d operator, with one
+exception: "cw". It actually works like "ce", change to end of word. Thus
+the space after the word isn't included. This is an exception that dates back
+to the old Vi. Since many people are used to it now, the inconsistency has
+remained in Vim.
+
+
+MORE CHANGES
+
+Like "dd" deletes a whole line, "cc" changes a whole line. It keeps the
+existing indent (leading white space) though.
+
+Just like "d$" deletes until the end of the line, "c$" changes until the end
+of the line. It's like doing "d$" to delete the text and then "a" to start
+Insert mode and append new text.
+
+
+SHORTCUTS
+
+Some operator-motion commands are used so often that they have been given a
+single-letter command:
+
+ x stands for dl (delete character under the cursor)
+ X stands for dh (delete character left of the cursor)
+ D stands for d$ (delete to end of the line)
+ C stands for c$ (change to end of the line)
+ s stands for cl (change one character)
+ S stands for cc (change a whole line)
+
+
+WHERE TO PUT THE COUNT
+
+The commands "3dw" and "d3w" delete three words. If you want to get really
+picky about things, the first command, "3dw", deletes one word three times;
+the command "d3w" deletes three words once. This is a difference without a
+distinction. You can actually put in two counts, however. For example,
+"3d2w" deletes two words, repeated three times, for a total of six words.
+
+
+REPLACING WITH ONE CHARACTER
+
+The "r" command is not an operator. It waits for you to type a character, and
+will replace the character under the cursor with it. You could do the same
+with "cl" or with the "s" command, but with "r" you don't have to press <Esc>
+to get back out of insert mode.
+
+ there is somerhing grong here ~
+ rT rt rw
+
+ There is something wrong here ~
+
+Using a count with "r" causes that many characters to be replaced with the
+same character. Example:
+
+ There is something wrong here ~
+ 5rx
+
+ There is something xxxxx here ~
+
+To replace a character with a line break use "r<Enter>". This deletes one
+character and inserts a line break. Using a count here only applies to the
+number of characters deleted: "4r<Enter>" replaces four characters with one
+line break.
+
+==============================================================================
+*04.3* Repeating a change
+
+The "." command is one of the simplest yet powerful commands in Vim. It
+repeats the last change. For instance, suppose you are editing an HTML file
+and want to delete all the <B> tags. You position the cursor on the first <
+and delete the <B> with the command "df>". You then go to the < of the next
+</B> and delete it using the "." command. The "." command executes the last
+change command (in this case, "df>"). To delete another tag, position the
+cursor on the < and use the "." command.
+
+ To <B>generate</B> a table of <B>contents ~
+ f< find first < --->
+ df> delete to > -->
+ f< find next < --------->
+ . repeat df> --->
+ f< find next < ------------->
+ . repeat df> -->
+
+The "." command works for all changes you make, except for "u" (undo), CTRL-R
+(redo) and commands that start with a colon (:).
+
+Another example: You want to change the word "four" to "five". It appears
+several times in your text. You can do this quickly with this sequence of
+commands:
+
+ /four<Enter> find the first string "four"
+ cwfive<Esc> change the word to "five"
+ n find the next "four"
+ . repeat the change to "five"
+ n find the next "four"
+ . repeat the change
+ etc.
+
+==============================================================================
+*04.4* Visual mode
+
+To delete simple items the operator-motion changes work quite well. But often
+it's not so easy to decide which command will move over the text you want to
+change. Then you can use Visual mode.
+
+You start Visual mode by pressing "v". You move the cursor over the text you
+want to work on. While you do this, the text is highlighted. Finally type
+the operator command.
+ For example, to delete from the middle of one word to the middle of another
+word:
+
+ This is an examination sample of visual mode ~
+ ---------->
+ velllld
+
+ This is an example of visual mode ~
+
+When doing this you don't really have to count how many times you have to
+press "l" to end up in the right position. You can immediately see what text
+will be deleted when you press "d".
+
+If at any time you decide you don't want to do anything with the highlighted
+text, just press <Esc> and Visual mode will stop without doing anything.
+
+
+SELECTING LINES
+
+If you want to work on whole lines, use "V" to start Visual mode. You will
+see right away that the whole line is highlighted, without moving around.
+When you move left or right nothing changes. When you move up or down the
+selection is extended whole lines at a time.
+ For example, select three lines with "Vjj":
+
+ +------------------------+
+ | text more text |
+ >> | more text more text | |
+ selected lines >> | text text text | | Vjj
+ >> | text more | V
+ | more text more |
+ +------------------------+
+
+
+SELECTING BLOCKS
+
+If you want to work on a rectangular block of characters, use CTRL-V to start
+Visual mode. This is very useful when working on tables.
+
+ name Q1 Q2 Q3
+ pierre 123 455 234
+ john 0 90 39
+ steve 392 63 334
+
+To delete the middle "Q2" column, move the cursor to the "Q" of "Q2". Press
+CTRL-V to start blockwise Visual mode. Now move the cursor three lines down
+with "3j" and to the next word with "w". You can see the first character of
+the last column is included. To exclude it, use "h". Now press "d" and the
+middle column is gone.
+
+
+GOING TO THE OTHER SIDE
+
+If you have selected some text in Visual mode, and discover that you need to
+change the other end of the selection, use the "o" command (Hint: o for other
+end). The cursor will go to the other end, and you can move the cursor to
+change where the selection starts. Pressing "o" again brings you back to the
+other end.
+
+When using blockwise selection, you have four corners. "o" only takes you to
+one of the other corners, diagonally. Use "O" to move to the other corner in
+the same line.
+
+Note that "o" and "O" in Visual mode work very differently from Normal mode,
+where they open a new line below or above the cursor.
+
+==============================================================================
+*04.5* Moving text
+
+When you delete something with "d", "x", or another command, the text is
+saved. You can paste it back by using the "p" command. (The Vim name for
+this is put).
+ Take a look at how this works. First you will delete an entire line, by
+putting the cursor on the line you want to delete and typing "dd". Now you
+move the cursor to where you want to put the line and use the "p" (put)
+command. The line is inserted on the line below the cursor.
+
+ a line a line a line
+ line 2 dd line 3 p line 3
+ line 3 line 2
+
+Because you deleted an entire line, the "p" command placed the text line below
+the cursor. If you delete part of a line (a word, for instance), the "p"
+command puts it just after the cursor.
+
+ Some more boring try text to out commands. ~
+ ---->
+ dw
+
+ Some more boring text to out commands. ~
+ ------->
+ welp
+
+ Some more boring text to try out commands. ~
+
+
+MORE ON PUTTING
+
+The "P" command puts text like "p", but before the cursor. When you deleted a
+whole line with "dd", "P" will put it back above the cursor. When you deleted
+a word with "dw", "P" will put it back just before the cursor.
+
+You can repeat putting as many times as you like. The same text will be used.
+
+You can use a count with "p" and "P". The text will be repeated as many times
+as specified with the count. Thus "dd" and then "3p" puts three copies of the
+same deleted line.
+
+
+SWAPPING TWO CHARACTERS
+
+Frequently when you are typing, your fingers get ahead of your brain (or the
+other way around?). The result is a typo such as "teh" for "the". Vim
+makes it easy to correct such problems. Just put the cursor on the e of "teh"
+and execute the command "xp". This works as follows: "x" deletes the
+character e and places it in a register. "p" puts the text after the cursor,
+which is after the h.
+
+ teh th the ~
+ x p
+
+==============================================================================
+*04.6* Copying text
+
+To copy text from one place to another, you could delete it, use "u" to undo
+the deletion and then "p" to put it somewhere else. There is an easier way:
+yanking. The "y" operator copies text into a register. Then a "p" command
+can be used to put it.
+ Yanking is just a Vim name for copying. The "c" letter was already used
+for the change operator, and "y" was still available. Calling this
+operator "yank" made it easier to remember to use the "y" key.
+
+Since "y" is an operator, you use "yw" to yank a word. A count is possible as
+usual. To yank two words use "y2w". Example:
+
+ let sqr = LongVariable * ~
+ -------------->
+ y2w
+
+ let sqr = LongVariable * ~
+ p
+
+ let sqr = LongVariable * LongVariable ~
+
+Notice that "yw" includes the white space after a word. If you don't want
+this, use "ye".
+
+The "yy" command yanks a whole line, just like "dd" deletes a whole line.
+Unexpectedly, while "D" deletes from the cursor to the end of the line, "Y"
+works like "yy", it yanks the whole line. Watch out for this inconsistency!
+Use "y$" to yank to the end of the line.
+
+ a text line yy a text line a text line
+ line 2 line 2 p line 2
+ last line last line a text line
+ last line
+
+==============================================================================
+*04.7* Using the clipboard
+
+If you are using the GUI version of Vim (gvim), you can find the "Copy" item
+in the "Edit" menu. First select some text with Visual mode, then use the
+Edit/Copy menu item. The selected text is now copied to the clipboard. You
+can paste the text in other programs. In Vim itself too.
+
+If you have copied text to the clipboard in another application, you can paste
+it in Vim with the Edit/Paste menu item. This works in Normal mode and Insert
+mode. In Visual mode the selected text is replaced with the pasted text.
+
+The "Cut" menu item deletes the text before it's put on the clipboard. The
+"Copy", "Cut" and "Paste" items are also available in the popup menu (only
+when there is a popup menu, of course). If your Vim has a toolbar, you can
+also find these items there.
+
+If you are not using the GUI, or if you don't like using a menu, you have to
+use another way. You use the normal "y" (yank) and "p" (put) commands, but
+prepend "* (double-quote star) before it. To copy a line to the clipboard: >
+
+ "*yy
+
+To put text from the clipboard back into the text: >
+
+ "*p
+
+This only works on versions of Vim that include clipboard support. More about
+the clipboard can be found in section |09.3| and here: |clipboard|.
+
+==============================================================================
+*04.8* Text objects
+
+If the cursor is in the middle of a word and you want to delete that word, you
+need to move back to its start before you can do "dw". There is a simpler way
+to do this: "daw".
+
+ this is some example text. ~
+ daw
+
+ this is some text. ~
+
+The "d" of "daw" is the delete operator. "aw" is a text object. Hint: "aw"
+stands for "A Word". Thus "daw" is "Delete A Word". To be precise, the white
+space after the word is also deleted (or the white space before the word if at
+the end of the line).
+
+Using text objects is the third way to make changes in Vim. We already had
+operator-motion and Visual mode. Now we add operator-text object.
+ It is very similar to operator-motion, but instead of operating on the text
+between the cursor position before and after a movement command, the text
+object is used as a whole. It doesn't matter where in the object the cursor
+was.
+
+To change a whole sentence use "cis". Take this text:
+
+ Hello there. This ~
+ is an example. Just ~
+ some text. ~
+
+Move to the start of the second line, on "is an". Now use "cis":
+
+ Hello there. Just ~
+ some text. ~
+
+The cursor is in between the blanks in the first line. Now you type the new
+sentence "Another line.":
+
+ Hello there. Another line. Just ~
+ some text. ~
+
+"cis" consists of the "c" (change) operator and the "is" text object. This
+stands for "Inner Sentence". There is also the "as" ("A Sentence") object.
+The difference is that "as" includes the white space after the sentence and
+"is" doesn't. If you would delete a sentence, you want to delete the white
+space at the same time, thus use "das". If you want to type new text the
+white space can remain, thus you use "cis".
+
+You can also use text objects in Visual mode. It will include the text object
+in the Visual selection. Visual mode continues, thus you can do this several
+times. For example, start Visual mode with "v" and select a sentence with
+"as". Now you can repeat "as" to include more sentences. Finally you use an
+operator to do something with the selected sentences.
+
+You can find a long list of text objects here: |text-objects|.
+
+==============================================================================
+*04.9* Replace mode
+
+The "R" command causes Vim to enter replace mode. In this mode, each
+character you type replaces the one under the cursor. This continues until
+you type <Esc>.
+ In this example you start Replace mode on the first "t" of "text":
+
+ This is text. ~
+ Rinteresting.<Esc>
+
+ This is interesting. ~
+
+You may have noticed that this command replaced 5 characters in the line with
+twelve others. The "R" command automatically extends the line if it runs out
+of characters to replace. It will not continue on the next line.
+
+You can switch between Insert mode and Replace mode with the <Insert> key.
+
+When you use <BS> (backspace) to make a correction, you will notice that the
+old text is put back. Thus it works like an undo command for the previously
+typed character.
+
+==============================================================================
+*04.10* Conclusion
+
+The operators, movement commands and text objects give you the possibility to
+make lots of combinations. Now that you know how they work, you can use N
+operators with M movement commands to make N * M commands!
+
+You can find a list of operators here: |operator|.
+
+For example, there are many other ways to delete pieces of text. Here are a
+few common ones:
+
+x delete character under the cursor (short for "dl")
+X delete character before the cursor (short for "dh")
+D delete from cursor to end of line (short for "d$")
+dw delete from cursor to next start of word
+db delete from cursor to previous start of word
+diw delete word under the cursor (excluding white space)
+daw delete word under the cursor (including white space)
+dG delete until the end of the file
+dgg delete until the start of the file
+
+If you use "c" instead of "d" they become change commands. And with "y" you
+yank the text. And so forth.
+
+
+There are a few common commands to make changes that didn't fit somewhere
+else:
+
+ ~ Change case of the character under the cursor, and move the
+ cursor to the next character. This is not an operator (unless
+ 'tildeop' is set), thus you can't use it with a motion
+ command. It does work in Visual mode, where it changes case
+ for all the selected text.
+
+ I Start Insert mode after moving the cursor to the first
+ non-blank in the line.
+
+ A Start Insert mode after moving the cursor to the end of the
+ line.
+
+==============================================================================
+
+Next chapter: |usr_05.txt| Set your settings
+
+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
new file mode 100644
index 0000000..bc68e61
--- /dev/null
+++ b/runtime/doc/usr_05.txt
@@ -0,0 +1,776 @@
+*usr_05.txt* For Vim version 9.0. Last change: 2019 May 23
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Set your settings
+
+
+Vim can be tuned to work like you want it to. This chapter shows you how to
+make Vim start with options set to different values. Add plugins to extend
+Vim's capabilities. Or define your own macros.
+
+|05.1| The vimrc file
+|05.2| The example vimrc file explained
+|05.3| The defaults.vim file explained
+|05.4| Simple mappings
+|05.5| Adding a package
+|05.6| Adding a plugin
+|05.7| Adding a help file
+|05.8| The option window
+|05.9| Often used options
+
+ Next chapter: |usr_06.txt| Using syntax highlighting
+ Previous chapter: |usr_04.txt| Making small changes
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*05.1* The vimrc file *vimrc-intro*
+
+You probably got tired of typing commands that you use very often. To start
+Vim with all your favorite option settings and mappings, you write them in
+what is called the vimrc file. Vim executes the commands in this file when it
+starts up.
+
+If you already have a vimrc file (e.g., when your sysadmin has one setup for
+you), you can edit it this way: >
+
+ :edit $MYVIMRC
+
+If you don't have a vimrc file yet, see |vimrc| to find out where you can
+create a vimrc file. Also, the ":version" command mentions the name of the
+"user vimrc file" Vim looks for.
+
+For Unix and Macintosh this file is always used and is recommended:
+
+ ~/.vimrc ~
+
+For MS-Windows you can use one of these:
+
+ $HOME/_vimrc ~
+ $VIM/_vimrc ~
+
+If you are creating the vimrc file for the first time, it is recommended to
+put this line at the top: >
+
+ source $VIMRUNTIME/defaults.vim
+
+This initializes Vim for new users (as opposed to traditional Vi users). See
+|defaults.vim| for the details.
+
+The vimrc file can contain all the commands that you type after a colon. The
+simplest ones are for setting options. For example, if you want Vim to always
+start with the 'incsearch' option on, add this line your vimrc file: >
+
+ set incsearch
+
+For this new line to take effect you need to exit Vim and start it again.
+Later you will learn how to do this without exiting Vim.
+
+This chapter only explains the most basic items. For more information on how
+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 (included in the
+Vim distribution) file can be used to make Vim startup in not-compatible mode
+(see |not-compatible|). The file can be found here:
+
+ $VIMRUNTIME/vimrc_example.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
+will be explained though. Use the ":help" command to find out more.
+
+>
+ " Get the defaults that most users want.
+ source $VIMRUNTIME/defaults.vim
+
+This loads the "defaults.vim" file in the $VIMRUNTIME directory. This sets up
+Vim for how most users like it. If you are one of the few that don't, then
+comment out this line. The commands are explained below:
+|defaults.vim-explained|
+
+>
+ if has("vms")
+ set nobackup
+ else
+ set backup
+ if has('persistent_undo')
+ set undofile
+ endif
+ endif
+
+This tells Vim to keep a backup copy of a file when overwriting it. But not
+on the VMS system, since it keeps old versions of files already. The backup
+file will have the same name as the original file with "~" added. See |07.4|
+
+This also sets the 'undofile' option, if available. This will store the
+multi-level undo information in a file. The result is that when you change a
+file, exit Vim, and then edit the file again, you can undo the changes made
+previously. It's a very powerful and useful feature, at the cost of storing a
+file. For more information see |undo-persistence|.
+
+The "if" command is very useful to set options
+only when some condition is met. More about that in |usr_41.txt|.
+
+>
+ if &t_Co > 2 || has("gui_running")
+ set hlsearch
+ endif
+
+This switches on the 'hlsearch' option, telling Vim to highlight matches with
+the last used search pattern.
+
+>
+ augroup vimrcEx
+ au!
+ autocmd FileType text setlocal textwidth=78
+ augroup END
+
+This makes Vim break text to avoid lines getting longer than 78 characters.
+But only for files that have been detected to be plain text. There are
+actually two parts here. "autocmd FileType text" is an autocommand. This
+defines that when the file type is set to "text" the following command is
+automatically executed. "setlocal textwidth=78" sets the 'textwidth' option
+to 78, but only locally in one file.
+
+The wrapper with "augroup vimrcEx" and "augroup END" makes it possible to
+delete the autocommand with the "au!" command. See |:augroup|.
+
+>
+ if has('syntax') && has('eval')
+ packadd! matchit
+ endif
+
+This loads the "matchit" plugin if the required features are available.
+It makes the |%| command more powerful. This is explained at
+|matchit-install|.
+
+
+==============================================================================
+*05.3* The defaults.vim file explained *defaults.vim-explained*
+
+The |defaults.vim| file is loaded when the user has no vimrc file. When you
+create a new vimrc file, add this line near the top to keep using it: >
+
+ source $VIMRUNTIME/defaults.vim
+
+Or use the vimrc_example.vim file, as explained above.
+
+The following explains what defaults.vim is doing.
+
+>
+ if exists('skip_defaults_vim')
+ finish
+ endif
+
+Loading defaults.vim can be disabled with this command: >
+ let skip_defaults_vim = 1
+This has to be done in the system vimrc file. See |system-vimrc|. If you
+have a user vimrc this is not needed, since defaults.vim will not be loaded
+automatically.
+
+>
+ set nocompatible
+
+As mentioned in the first chapter, these manuals explain Vim working in an
+improved way, thus not completely Vi compatible. Setting the 'compatible'
+option off, thus 'nocompatible' takes care of this.
+
+>
+ set backspace=indent,eol,start
+
+This specifies where in Insert mode the <BS> is allowed to delete the
+character in front of the cursor. The three items, separated by commas, tell
+Vim to delete the white space at the start of the line, a line break and the
+character before where Insert mode started. See 'backspace'.
+
+>
+ set history=200
+
+Keep 200 commands and 200 search patterns in the history. Use another number
+if you want to remember fewer or more lines. See 'history'.
+
+>
+ set ruler
+
+Always display the current cursor position in the lower right corner of the
+Vim window. See 'ruler'.
+
+>
+ set showcmd
+
+Display an incomplete command in the lower right corner of the Vim window,
+left of the ruler. For example, when you type "2f", Vim is waiting for you to
+type the character to find and "2f" is displayed. When you press "w" next,
+the "2fw" command is executed and the displayed "2f" is removed.
+
+ +-------------------------------------------------+
+ |text in the Vim window |
+ |~ |
+ |~ |
+ |-- VISUAL -- 2f 43,8 17% |
+ +-------------------------------------------------+
+ ^^^^^^^^^^^ ^^^^^^^^ ^^^^^^^^^^
+ 'showmode' 'showcmd' 'ruler'
+
+
+>
+ set wildmenu
+
+Display completion matches in a status line. That is when you type <Tab> and
+there is more than one match. See 'wildmenu'.
+
+>
+ set ttimeout
+ set ttimeoutlen=100
+
+This makes typing Esc take effect more quickly. Normally Vim waits a second
+to see if the Esc is the start of an escape sequence. If you have a very slow
+remote connection, increase the number. See 'ttimeout'.
+
+>
+ set display=truncate
+
+Show @@@ in the last line if it is truncated, instead of hiding the whole
+line. See 'display'.
+
+>
+ set incsearch
+
+Display the match for a search pattern when halfway typing it. See
+'incsearch'.
+
+>
+ set nrformats-=octal
+
+Do not recognize numbers starting with a zero as octal. See 'nrformats'.
+
+>
+ map Q gq
+
+This defines a key mapping. More about that in the next section. This
+defines the "Q" command to do formatting with the "gq" operator. This is how
+it worked before Vim 5.0. Otherwise the "Q" command starts Ex mode, but you
+will not need it.
+
+>
+ inoremap <C-U> <C-G>u<C-U>
+
+CTRL-U in insert mode deletes all entered text in the current line. Use
+CTRL-G u to first break undo, so that you can undo CTRL-U after inserting a
+line break. Revert with ":iunmap <C-U>".
+
+>
+ if has('mouse')
+ set mouse=a
+ endif
+
+Enable using the mouse if available. See 'mouse'.
+
+>
+ vnoremap _g y:exe "grep /" .. escape(@", '\\/') .. "/ *.c *.h"<CR>
+
+This mapping yanks the visually selected text and searches for it in C files.
+You can see that a mapping can be used to do quite complicated things. Still,
+it is just a sequence of commands that are executed like you typed them.
+
+>
+ syntax on
+
+Enable highlighting files in color. See |syntax|.
+
+ *vimrc-filetype* >
+ filetype plugin indent on
+
+This switches on three very clever mechanisms:
+1. Filetype detection.
+ Whenever you start editing a file, Vim will try to figure out what kind of
+ file this is. When you edit "main.c", Vim will see the ".c" extension and
+ recognize this as a "c" filetype. When you edit a file that starts with
+ "#!/bin/sh", Vim will recognize it as a "sh" filetype.
+ The filetype detection is used for syntax highlighting and the other two
+ items below.
+ See |filetypes|.
+
+2. Using filetype plugin files
+ Many different filetypes are edited with different options. For example,
+ when you edit a "c" file, it's very useful to set the 'cindent' option to
+ automatically indent the lines. These commonly useful option settings are
+ included with Vim in filetype plugins. You can also add your own, see
+ |write-filetype-plugin|.
+
+3. Using indent files
+ When editing programs, the indent of a line can often be computed
+ automatically. Vim comes with these indent rules for a number of
+ filetypes. See |:filetype-indent-on| and 'indentexpr'.
+
+
+ *restore-cursor* *last-position-jump* >
+ autocmd BufReadPost *
+ \ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit'
+ \ | exe "normal! g`\""
+ \ | endif
+
+Another autocommand. This time it is used after reading any file. The
+complicated stuff after it checks if the '" mark is defined, and jumps to it
+if so. The backslash at the start of a line is used to continue the command
+from the previous line. That avoids a line getting very long.
+See |line-continuation|. This only works in a Vim script file, not when
+typing commands at the command-line.
+
+>
+ command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis
+ \ | wincmd p | diffthis
+
+This adds the ":DiffOrig" command. Use this in a modified buffer to see the
+differences with the file it was loaded from. See |diff| and |:DiffOrig|.
+
+>
+ set nolangremap
+
+Prevent that the langmap option applies to characters that result from a
+mapping. If set (default), this may break plugins (but it's backward
+compatible). See 'langremap'.
+
+==============================================================================
+*05.4* Simple mappings
+
+A mapping enables you to bind a set of Vim commands to a single key. Suppose,
+for example, that you need to surround certain words with curly braces. In
+other words, you need to change a word such as "amount" into "{amount}". With
+the :map command, you can tell Vim that the F5 key does this job. The command
+is as follows: >
+
+ :map <F5> i{<Esc>ea}<Esc>
+<
+ Note:
+ When entering this command, you must enter <F5> by typing four
+ characters. Similarly, <Esc> is not entered by pressing the <Esc>
+ key, but by typing five characters. Watch out for this difference
+ when reading the manual!
+
+Let's break this down:
+ <F5> The F5 function key. This is the trigger key that causes the
+ command to be executed as the key is pressed.
+
+ i{<Esc> Insert the { character. The <Esc> key ends Insert mode.
+
+ e Move to the end of the word.
+
+ a}<Esc> Append the } to the word.
+
+After you execute the ":map" command, all you have to do to put {} around a
+word is to put the cursor on the first character and press F5.
+
+In this example, the trigger is a single key; it can be any string. But when
+you use an existing Vim command, that command will no longer be available.
+You better avoid that.
+ One key that can be used with mappings is the backslash. Since you
+probably want to define more than one mapping, add another character. You
+could map "\p" to add parentheses around a word, and "\c" to add curly braces,
+for example: >
+
+ :map \p i(<Esc>ea)<Esc>
+ :map \c i{<Esc>ea}<Esc>
+
+You need to type the \ and the p quickly after another, so that Vim knows they
+belong together.
+
+The ":map" command (with no arguments) lists your current mappings. At
+least the ones for Normal mode. More about mappings in section |40.1|.
+
+==============================================================================
+*05.5* Adding a package *add-package* *matchit-install*
+
+A package is a set of files that you can add to Vim. There are two kinds of
+packages: optional and automatically loaded on startup.
+
+The Vim distribution comes with a few packages that you can optionally use.
+For example, the matchit plugin. This plugin makes the "%" command jump to
+matching HTML tags, if/else/endif in Vim scripts, etc. Very useful, although
+it's not backwards compatible (that's why it is not enabled by default).
+
+To start using the matchit plugin, add one line to your vimrc file: >
+ packadd! matchit
+
+That's all! After restarting Vim you can find help about this plugin: >
+ :help matchit
+
+This works, because when `:packadd` loaded the plugin it also added the
+package directory in 'runtimepath', so that the help file can be found.
+
+You can find packages on the Internet in various places. It usually comes as
+an archive or as a repository. For an archive you can follow these steps:
+ 1. create the package directory: >
+ mkdir -p ~/.vim/pack/fancy
+< "fancy" can be any name of your liking. Use one that describes the
+ package.
+ 2. unpack the archive in that directory. This assumes the top
+ directory in the archive is "start": >
+ cd ~/.vim/pack/fancy
+ unzip /tmp/fancy.zip
+< If the archive layout is different make sure that you end up with a
+ path like this:
+ ~/.vim/pack/fancy/start/fancytext/plugin/fancy.vim ~
+ Here "fancytext" is the name of the package, it can be anything
+ else.
+
+More information about packages can be found here: |packages|.
+
+==============================================================================
+*05.6* Adding a plugin *add-plugin* *plugin*
+
+Vim's functionality can be extended by adding plugins. A plugin is nothing
+more than a Vim script file that is loaded automatically when Vim starts. You
+can add a plugin very easily by dropping it in your plugin directory.
+{not available when Vim was compiled without the |+eval| feature}
+
+There are two types of plugins:
+
+ global plugin: Used for all kinds of files
+ filetype plugin: Only used for a specific type of file
+
+The global plugins will be discussed first, then the filetype ones
+|add-filetype-plugin|.
+
+
+GLOBAL PLUGINS *standard-plugin*
+
+When you start Vim, it will automatically load a number of global plugins.
+You don't have to do anything for this. They add functionality that most
+people will want to use, but which was implemented as a Vim script instead of
+being compiled into Vim. You can find them listed in the help index
+|standard-plugin-list|. Also see |load-plugins|.
+
+ *add-global-plugin*
+You can add a global plugin to add functionality that will always be present
+when you use Vim. There are only two steps for adding a global plugin:
+1. Get a copy of the plugin.
+2. Drop it in the right directory.
+
+
+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 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|.
+- You could write one yourself, see |write-plugin|.
+
+Some plugins come as a vimball archive, see |vimball|.
+Some plugins can be updated automatically, see |getscript|.
+
+
+USING A GLOBAL PLUGIN
+
+First read the text in the plugin itself to check for any special conditions.
+Then copy the file to your plugin directory:
+
+ system plugin directory ~
+ Unix ~/.vim/plugin/
+ PC $HOME/vimfiles/plugin or $VIM/vimfiles/plugin
+ Amiga s:vimfiles/plugin
+ Macintosh $VIM:vimfiles:plugin
+ Mac OS X ~/.vim/plugin/
+
+Example for Unix (assuming you didn't have a plugin directory yet): >
+
+ mkdir ~/.vim
+ mkdir ~/.vim/plugin
+ cp /tmp/yourplugin.vim ~/.vim/plugin
+
+That's all! Now you can use the commands defined in this plugin.
+
+Instead of putting plugins directly into the plugin/ directory, you may
+better organize them by putting them into subdirectories under plugin/.
+As an example, consider using "~/.vim/plugin/perl/*.vim" for all your Perl
+plugins.
+
+
+FILETYPE PLUGINS *add-filetype-plugin* *ftplugins*
+
+The Vim distribution comes with a set of plugins for different filetypes that
+you can start using with this command: >
+
+ :filetype plugin on
+
+That's all! See |vimrc-filetype|.
+
+If you are missing a plugin for a filetype you are using, or you found a
+better one, you can add it. There are two steps for adding a filetype plugin:
+1. Get a copy of the plugin.
+2. Drop it in the right directory.
+
+
+GETTING A FILETYPE PLUGIN
+
+You can find them in the same places as the global plugins. Watch out if the
+type of file is mentioned, then you know if the plugin is a global or a
+filetype one. The scripts in $VIMRUNTIME/macros are global ones, the filetype
+plugins are in $VIMRUNTIME/ftplugin.
+
+
+USING A FILETYPE PLUGIN *ftplugin-name*
+
+You can add a filetype plugin by dropping it in the right directory. The
+name of this directory is in the same directory mentioned above for global
+plugins, but the last part is "ftplugin". Suppose you have found a plugin for
+the "stuff" filetype, and you are on Unix. Then you can move this file to the
+ftplugin directory: >
+
+ mv thefile ~/.vim/ftplugin/stuff.vim
+
+If that file already exists you already have a plugin for "stuff". You might
+want to check if the existing plugin doesn't conflict with the one you are
+adding. If it's OK, you can give the new one another name: >
+
+ mv thefile ~/.vim/ftplugin/stuff_too.vim
+
+The underscore is used to separate the name of the filetype from the rest,
+which can be anything. If you use "otherstuff.vim" it wouldn't work, it would
+be loaded for the "otherstuff" filetype.
+
+On MS-DOS like filesystems you cannot use long filenames. You would run into
+trouble if you add a second plugin and the filetype has more than six
+characters. You can use an extra directory to get around this: >
+
+ mkdir $VIM/vimfiles/ftplugin/fortran
+ copy thefile $VIM/vimfiles/ftplugin/fortran/too.vim
+
+The generic names for the filetype plugins are: >
+
+ ftplugin/<filetype>.vim
+ ftplugin/<filetype>_<name>.vim
+ ftplugin/<filetype>/<name>.vim
+
+Here "<name>" can be any name that you prefer.
+Examples for the "stuff" filetype on Unix: >
+
+ ~/.vim/ftplugin/stuff.vim
+ ~/.vim/ftplugin/stuff_def.vim
+ ~/.vim/ftplugin/stuff/header.vim
+
+The <filetype> part is the name of the filetype the plugin is to be used for.
+Only files of this filetype will use the settings from the plugin. The <name>
+part of the plugin file doesn't matter, you can use it to have several plugins
+for the same filetype. Note that it must end in ".vim".
+
+
+Further reading:
+|filetype-plugins| Documentation for the filetype plugins and information
+ about how to avoid that mappings cause problems.
+|load-plugins| When the global plugins are loaded during startup.
+|ftplugin-overrule| Overruling the settings from a global plugin.
+|write-plugin| How to write a plugin script.
+|plugin-details| For more information about using plugins or when your
+ plugin doesn't work.
+|new-filetype| How to detect a new file type.
+
+==============================================================================
+*05.7* Adding a help file *add-local-help*
+
+If you are lucky, the plugin you installed also comes with a help file. We
+will explain how to install the help file, so that you can easily find help
+for your new plugin.
+ Let us use the "doit.vim" plugin as an example. This plugin comes with
+documentation: "doit.txt". Let's first copy the plugin to the right
+directory. This time we will do it from inside Vim. (You may skip some of
+the "mkdir" commands if you already have the directory.) >
+
+ :!mkdir ~/.vim
+ :!mkdir ~/.vim/plugin
+ :!cp /tmp/doit.vim ~/.vim/plugin
+
+The "cp" command is for Unix, on MS-Windows you can use "copy".
+
+Now create a "doc" directory in one of the directories in 'runtimepath'. >
+
+ :!mkdir ~/.vim/doc
+
+Copy the help file to the "doc" directory. >
+
+ :!cp /tmp/doit.txt ~/.vim/doc
+
+Now comes the trick, which allows you to jump to the subjects in the new help
+file: Generate the local tags file with the |:helptags| command. >
+
+ :helptags ~/.vim/doc
+
+Now you can use the >
+
+ :help doit
+
+command to find help for "doit" in the help file you just added. You can see
+an entry for the local help file when you do: >
+
+ :help local-additions
+
+The title lines from the local help files are automagically added to this
+section. There you can see which local help files have been added and jump to
+them through the tag.
+
+For writing a local help file, see |write-local-help|.
+
+==============================================================================
+*05.8* The option window
+
+If you are looking for an option that does what you want, you can search in
+the help files here: |options|. Another way is by using this command: >
+
+ :options
+
+This opens a new window, with a list of options with a one-line explanation.
+The options are grouped by subject. Move the cursor to a subject and press
+<Enter> to jump there. Press <Enter> again to jump back. Or use CTRL-O.
+
+You can change the value of an option. For example, move to the "displaying
+text" subject. Then move the cursor down to this line:
+
+ set wrap nowrap ~
+
+When you hit <Enter>, the line will change to:
+
+ set nowrap wrap ~
+
+The option has now been switched off.
+
+Just above this line is a short description of the 'wrap' option. Move the
+cursor one line up to place it in this line. Now hit <Enter> and you jump to
+the full help on the 'wrap' option.
+
+For options that take a number or string argument you can edit the value.
+Then press <Enter> to apply the new value. For example, move the cursor a few
+lines up to this line:
+
+ set so=0 ~
+
+Position the cursor on the zero with "$". Change it into a five with "r5".
+Then press <Enter> to apply the new value. When you now move the cursor
+around you will notice that the text starts scrolling before you reach the
+border. This is what the 'scrolloff' option does, it specifies an offset
+from the window border where scrolling starts.
+
+==============================================================================
+*05.9* Often used options
+
+There are an awful lot of options. Most of them you will hardly ever use.
+Some of the more useful ones will be mentioned here. Don't forget you can
+find more help on these options with the ":help" command, with single quotes
+before and after the option name. For example: >
+
+ :help 'wrap'
+
+In case you have messed up an option value, you can set it back to the
+default by putting an ampersand (&) after the option name. Example: >
+
+ :set iskeyword&
+
+
+NOT WRAPPING LINES
+
+Vim normally wraps long lines, so that you can see all of the text. Sometimes
+it's better to let the text continue right of the window. Then you need to
+scroll the text left-right to see all of a long line. Switch wrapping off
+with this command: >
+
+ :set nowrap
+
+Vim will automatically scroll the text when you move to text that is not
+displayed. To see a context of ten characters, do this: >
+
+ :set sidescroll=10
+
+This doesn't change the text in the file, only the way it is displayed.
+
+
+WRAPPING MOVEMENT COMMANDS
+
+Most commands for moving around will stop moving at the start and end of a
+line. You can change that with the 'whichwrap' option. This sets it to the
+default value: >
+
+ :set whichwrap=b,s
+
+This allows the <BS> key, when used in the first position of a line, to move
+the cursor to the end of the previous line. And the <Space> key moves from
+the end of a line to the start of the next one.
+
+To allow the cursor keys <Left> and <Right> to also wrap, use this command: >
+
+ :set whichwrap=b,s,<,>
+
+This is still only for Normal mode. To let <Left> and <Right> do this in
+Insert mode as well: >
+
+ :set whichwrap=b,s,<,>,[,]
+
+There are a few other flags that can be added, see 'whichwrap'.
+
+
+VIEWING TABS
+
+When there are tabs in a file, you cannot see where they are. To make them
+visible: >
+
+ :set list
+
+Now every tab is displayed as ^I. And a $ is displayed at the end of each
+line, so that you can spot trailing spaces that would otherwise go unnoticed.
+ A disadvantage is that this looks ugly when there are many Tabs in a file.
+If you have a color terminal, or are using the GUI, Vim can show the spaces
+and tabs as highlighted characters. Use the 'listchars' option: >
+
+ :set listchars=tab:>-,trail:-
+
+Now every tab will be displayed as ">---" (with more or less "-") and trailing
+white space as "-". Looks a lot better, doesn't it?
+
+
+KEYWORDS
+
+The 'iskeyword' option specifies which characters can appear in a word: >
+
+ :set iskeyword
+< iskeyword=@,48-57,_,192-255 ~
+
+The "@" stands for all alphabetic letters. "48-57" stands for ASCII
+characters 48 to 57, which are the numbers 0 to 9. "192-255" are the
+printable latin characters.
+ Sometimes you will want to include a dash in keywords, so that commands
+like "w" consider "upper-case" to be one word. You can do it like this: >
+
+ :set iskeyword+=-
+ :set iskeyword
+< iskeyword=@,48-57,_,192-255,- ~
+
+If you look at the new value, you will see that Vim has added a comma for you.
+ To remove a character use "-=". For example, to remove the underscore: >
+
+ :set iskeyword-=_
+ :set iskeyword
+< iskeyword=@,48-57,192-255,- ~
+
+This time a comma is automatically deleted.
+
+
+ROOM FOR MESSAGES
+
+When Vim starts there is one line at the bottom that is used for messages.
+When a message is long, it is either truncated, thus you can only see part of
+it, or the text scrolls and you have to press <Enter> to continue.
+ You can set the 'cmdheight' option to the number of lines used for
+messages. Example: >
+
+ :set cmdheight=3
+
+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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_06.txt b/runtime/doc/usr_06.txt
new file mode 100644
index 0000000..2b6fa51
--- /dev/null
+++ b/runtime/doc/usr_06.txt
@@ -0,0 +1,302 @@
+*usr_06.txt* For Vim version 9.0. Last change: 2021 Nov 07
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Using syntax highlighting
+
+
+Black and white text is boring. With colors your file comes to life. This
+not only looks nice, it also speeds up your work. Change the colors used for
+the different sorts of text. Print your text, with the colors you see on the
+screen.
+
+|06.1| Switching it on
+|06.2| No or wrong colors?
+|06.3| Different colors
+|06.4| With colors or without colors
+|06.5| Printing with colors
+|06.6| Further reading
+
+ Next chapter: |usr_07.txt| Editing more than one file
+ Previous chapter: |usr_05.txt| Set your settings
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*06.1* Switching it on
+
+It all starts with one simple command: >
+
+ :syntax enable
+
+That should work in most situations to get color in your files. Vim will
+automagically detect the type of file and load the right syntax highlighting.
+Suddenly comments are blue, keywords brown and strings red. This makes it
+easy to overview the file. After a while you will find that black&white text
+slows you down!
+
+If you always want to use syntax highlighting, put the ":syntax enable"
+command in your |vimrc| file.
+
+If you want syntax highlighting only when the terminal supports colors, you
+can put this in your |vimrc| file: >
+
+ if &t_Co > 1
+ syntax enable
+ endif
+
+If you want syntax highlighting only in the GUI version, put the ":syntax
+enable" command in your |gvimrc| file.
+
+==============================================================================
+*06.2* No or wrong colors?
+
+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|.
+
+- Your terminal does support colors, but Vim doesn't know this.
+ Make sure your $TERM setting is correct. For example, when using an
+ xterm that supports colors: >
+
+ setenv TERM xterm-color
+<
+ or (depending on your shell): >
+
+ 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 file type is not recognized.
+ Vim doesn't know all file types, and sometimes it's near to impossible
+ to tell what language a file uses. Try this command: >
+
+ :set filetype
+<
+ If the result is "filetype=" then the problem is indeed that Vim
+ doesn't know what type of file this is. You can set the type
+ manually: >
+
+ :set filetype=fortran
+
+< To see which types are available, look in the directory
+ $VIMRUNTIME/syntax. For the GUI you can use the Syntax menu.
+ Setting the filetype can also be done with a |modeline|, so that the
+ file will be highlighted each time you edit it. For example, this
+ line can be used in a Makefile (put it near the start or end of the
+ file): >
+
+ # vim: syntax=make
+
+< You might know how to detect the file type yourself. Often the file
+ name extension (after the dot) can be used.
+ See |new-filetype| for how to tell Vim to detect that file type.
+
+- There is no highlighting for your file type.
+ You could try using a similar file type by manually setting it as
+ mentioned above. If that isn't good enough, you can write your own
+ syntax file, see |mysyntaxfile|.
+
+
+Or the colors could be wrong:
+
+- The colored text is very hard to read.
+ Vim guesses the background color that you are using. If it is black
+ (or another dark color) it will use light colors for text. If it is
+ white (or another light color) it will use dark colors for text. If
+ Vim guessed wrong the text will be hard to read. To solve this, set
+ the 'background' option. For a dark background: >
+
+ :set background=dark
+
+< And for a light background: >
+
+ :set background=light
+
+< Make sure you put this _before_ the ":syntax enable" command,
+ otherwise the colors will already have been set. You could do
+ ":syntax reset" after setting 'background' to make Vim set the default
+ colors again.
+
+- The colors are wrong when scrolling bottom to top.
+ Vim doesn't read the whole file to parse the text. It starts parsing
+ wherever you are viewing the file. That saves a lot of time, but
+ sometimes the colors are wrong. A simple fix is hitting CTRL-L. Or
+ scroll back a bit and then forward again.
+ For a real fix, see |:syn-sync|. Some syntax files have a way to make
+ it look further back, see the help for the specific syntax file. For
+ example, |tex.vim| for the TeX syntax.
+
+==============================================================================
+*06.3* Different colors *:syn-default-override*
+
+If you don't like the default colors, you can select another color scheme. In
+the GUI use the Edit/Color Scheme menu. You can also type the command: >
+
+ :colorscheme evening
+
+"evening" is the name of the color scheme. There are several others you might
+want to try out. Look in the directory $VIMRUNTIME/colors.
+
+When you found the color scheme that you like, add the ":colorscheme" command
+to your |vimrc| file.
+
+You could also write your own color scheme. This is how you do it:
+
+1. Select a color scheme that comes close. Copy this file to your own Vim
+ directory. For Unix, this should work: >
+
+ !mkdir ~/.vim/colors
+ !cp $VIMRUNTIME/colors/morning.vim ~/.vim/colors/mine.vim
+<
+ This is done from Vim, because it knows the value of $VIMRUNTIME.
+
+2. Edit the color scheme file. These entries are useful:
+
+ term attributes in a B&W terminal
+ cterm attributes in a color terminal
+ ctermfg foreground color in a color terminal
+ ctermbg background color in a color terminal
+ gui attributes in the GUI
+ guifg foreground color in the GUI
+ guibg background color in the GUI
+
+ For example, to make comments green: >
+
+ :highlight Comment ctermfg=green guifg=green
+<
+ Attributes you can use for "cterm" and "gui" are "bold" and "underline".
+ If you want both, use "bold,underline". For details see the |:highlight|
+ command.
+
+3. Tell Vim to always use your color scheme. Put this line in your |vimrc|: >
+
+ colorscheme mine
+
+If you want to see what the most often used color combinations look like, use
+this command: >
+
+ :runtime syntax/colortest.vim
+
+You will see text in various color combinations. You can check which ones are
+readable and look nice. These aren't the only colors available to you though.
+You can specify #rrggbb hex colors and you can define new names for hex
+colors in |v:colornames| like so: >
+
+ let v:colornames['mine_red'] = '#aa0000'
+
+If you are authoring a color scheme for others to use, it is important
+to define these colors only when they do not exist: >
+
+ call extend(v:colornames, {'mine_red': '#aa0000'}, 'keep')
+
+This allows users of the color scheme to override the precise definition of
+that color prior to loading your color scheme. For example, in a |.vimrc|
+file: >
+
+ runtime colors/lists/css_colors.vim
+ let v:colornames['your_red'] = v:colornames['css_red']
+ colorscheme yourscheme
+
+As a color scheme author, you should be able to rely on some color names for
+GUI colors. These are defined in `colors/lists/default.vim`. All such files
+found on the |'runtimepath'| are loaded each time the colorscheme command is
+run. A canonical list is provided by the vim distribution, which should
+include all X11 colors (previously defined in rgb.txt).
+
+==============================================================================
+*06.4* With colors or without colors
+
+Displaying text in color takes a lot of effort. If you find the displaying
+too slow, you might want to disable syntax highlighting for a moment: >
+
+ :syntax clear
+
+When editing another file (or the same one) the colors will come back.
+
+If you want to stop highlighting completely use: >
+
+ :syntax off
+
+This will completely disable syntax highlighting and remove it immediately for
+all buffers. See |:syntax-off| for more details.
+
+ *:syn-manual*
+If you want syntax highlighting only for specific files, use this: >
+
+ :syntax manual
+
+This will enable the syntax highlighting, but not switch it on automatically
+when starting to edit a buffer. To switch highlighting on for the current
+buffer, set the 'syntax' option: >
+
+ :set syntax=ON
+<
+==============================================================================
+*06.5* Printing with colors *syntax-printing*
+
+In the MS-Windows version you can print the current file with this command: >
+
+ :hardcopy
+
+You will get the usual printer dialog, where you can select the printer and a
+few settings. If you have a color printer, the paper output should look the
+same as what you see inside Vim. But when you use a dark background the
+colors will be adjusted to look good on white paper.
+
+There are several options that change the way Vim prints:
+ 'printdevice'
+ 'printheader'
+ 'printfont'
+ 'printoptions'
+
+To print only a range of lines, use Visual mode to select the lines and then
+type the command: >
+
+ v100j:hardcopy
+
+"v" starts Visual mode. "100j" moves a hundred lines down, they will be
+highlighted. Then ":hardcopy" will print those lines. You can use other
+commands to move in Visual mode, of course.
+
+This also works on Unix, if you have a PostScript printer. Otherwise, you
+will have to do a bit more work. You need to convert the text to HTML first,
+and then print it from a web browser.
+
+Convert the current file to HTML with this command: >
+
+ :TOhtml
+
+In case that doesn't work: >
+
+ :source $VIMRUNTIME/syntax/2html.vim
+
+You will see it crunching away, this can take quite a while for a large file.
+Some time later another window shows the HTML code. Now write this somewhere
+(doesn't matter where, you throw it away later):
+>
+ :write main.c.html
+
+Open this file in your favorite browser and print it from there. If all goes
+well, the output should look exactly as it does in Vim. See |2html.vim| for
+details. Don't forget to delete the HTML file when you are done with it.
+
+Instead of printing, you could also put the HTML file on a web server, and let
+others look at the colored text.
+
+==============================================================================
+*06.6* Further reading
+
+|usr_44.txt| Your own syntax highlighted.
+|syntax| All the details.
+
+==============================================================================
+
+Next chapter: |usr_07.txt| Editing more than one file
+
+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
new file mode 100644
index 0000000..2be3062
--- /dev/null
+++ b/runtime/doc/usr_07.txt
@@ -0,0 +1,479 @@
+*usr_07.txt* For Vim version 9.0. Last change: 2020 Mar 23
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Editing more than one file
+
+
+No matter how many files you have, you can edit them without leaving Vim.
+Define a list of files to work on and jump from one to the other. Copy text
+from one file and put it in another one.
+
+|07.1| Edit another file
+|07.2| A list of files
+|07.3| Jumping from file to file
+|07.4| Backup files
+|07.5| Copy text between files
+|07.6| Viewing a file
+|07.7| Changing the file name
+
+ Next chapter: |usr_08.txt| Splitting windows
+ Previous chapter: |usr_06.txt| Using syntax highlighting
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*07.1* Edit another file
+
+So far you had to start Vim for every file you wanted to edit. There is a
+simpler way. To start editing another file, use this command: >
+
+ :edit foo.txt
+
+You can use any file name instead of "foo.txt". Vim will close the current
+file and open the new one. If the current file has unsaved changes, however,
+Vim displays an error message and does not open the new file:
+
+ E37: No write since last change (use ! to override) ~
+
+ Note:
+ Vim puts an error ID at the start of each error message. If you do
+ not understand the message or what caused it, look in the help system
+ for this ID. In this case: >
+
+ :help E37
+
+At this point, you have a number of alternatives. You can write the file
+using this command: >
+
+ :write
+
+Or you can force Vim to discard your changes and edit the new file, using the
+force (!) character: >
+
+ :edit! foo.txt
+
+If you want to edit another file, but not write the changes in the current
+file yet, you can make it hidden: >
+
+ :hide edit foo.txt
+
+The text with changes is still there, but you can't see it. This is further
+explained in section |22.4|: The buffer list.
+
+==============================================================================
+*07.2* A list of files
+
+You can start Vim to edit a sequence of files. For example: >
+
+ vim one.c two.c three.c
+
+This command starts Vim and tells it that you will be editing three files.
+Vim displays just the first file. After you have done your thing in this
+file, to edit the next file you use this command: >
+
+ :next
+
+If you have unsaved changes in the current file, you will get an error
+message and the ":next" will not work. This is the same problem as with
+":edit" mentioned in the previous section. To abandon the changes: >
+
+ :next!
+
+But mostly you want to save the changes and move on to the next file. There
+is a special command for this: >
+
+ :wnext
+
+This does the same as using two separate commands: >
+
+ :write
+ :next
+
+
+WHERE AM I?
+
+To see which file in the argument list you are editing, look in the window
+title. It should show something like "(2 of 3)". This means you are editing
+the second file out of three files.
+ If you want to see the list of files, use this command: >
+
+ :args
+
+This is short for "arguments". The output might look like this:
+
+ one.c [two.c] three.c ~
+
+These are the files you started Vim with. The one you are currently editing,
+"two.c", is in square brackets.
+
+
+MOVING TO OTHER ARGUMENTS
+
+To go back one file: >
+
+ :previous
+
+This is just like the ":next" command, except that it moves in the other
+direction. Again, there is a shortcut command for when you want to write the
+file first: >
+
+ :wprevious
+
+To move to the very last file in the list: >
+
+ :last
+
+And to move back to the first one again: >
+
+ :first
+
+There is no ":wlast" or ":wfirst" command though!
+
+You can use a count for ":next" and ":previous". To skip two files forward: >
+
+ :2next
+
+
+AUTOMATIC WRITING
+
+When moving around the files and making changes, you have to remember to use
+":write". Otherwise you will get an error message. If you are sure you
+always want to write modified files, you can tell Vim to automatically write
+them: >
+
+ :set autowrite
+
+When you are editing a file which you may not want to write, switch it off
+again: >
+
+ :set noautowrite
+
+
+EDITING ANOTHER LIST OF FILES
+
+You can redefine the list of files without the need to exit Vim and start it
+again. Use this command to edit three other files: >
+
+ :args five.c six.c seven.h
+
+Or use a wildcard, like it's used in the shell: >
+
+ :args *.txt
+
+Vim will take you to the first file in the list. Again, if the current file
+has changes, you can either write the file first, or use ":args!" (with !
+added) to abandon the changes.
+
+
+DID YOU EDIT THE LAST FILE?
+ *arglist-quit*
+When you use a list of files, Vim assumes you want to edit them all. To
+protect you from exiting too early, you will get this error when you didn't
+edit the last file in the list yet:
+
+ E173: 46 more files to edit ~
+
+If you really want to exit, just do it again. Then it will work (but not when
+you did other commands in between).
+
+==============================================================================
+*07.3* Jumping from file to file
+
+To quickly jump between two files, press CTRL-^ (on English-US keyboards the ^
+is above the 6 key). Example: >
+
+ :args one.c two.c three.c
+
+You are now in one.c. >
+
+ :next
+
+Now you are in two.c. Now use CTRL-^ to go back to one.c. Another CTRL-^ and
+you are back in two.c. Another CTRL-^ and you are in one.c again. If you now
+do: >
+
+ :next
+
+You are in three.c. Notice that the CTRL-^ command does not change the idea
+of where you are in the list of files. Only commands like ":next" and
+":previous" do that.
+
+The file you were previously editing is called the "alternate" file. When you
+just started Vim CTRL-^ will not work, since there isn't a previous file.
+
+
+PREDEFINED MARKS
+
+After jumping to another file, you can use two predefined marks which are very
+useful: >
+
+ `"
+
+This takes you to the position where the cursor was when you left the file.
+Another mark that is remembered is the position where you made the last
+change: >
+
+ `.
+
+Suppose you are editing the file "one.txt". Somewhere halfway through the
+file you use "x" to delete a character. Then you go to the last line with "G"
+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
+the file.
+
+
+FILE MARKS
+
+In section |03.10| was explained how you can place a mark in a file with "mx"
+and jump to that position with "`x". That works within one file. If you edit
+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
+down the file ("50%") and place the F mark there (F for foo): >
+
+ 50%mF
+
+Now edit the file "bar.txt" and place the B mark (B for bar) at its last line:
+>
+ GmB
+
+Now you can use the "'F" command to jump back to halfway foo.txt. Or edit yet
+another file, type "'B" and you are at the end of bar.txt again.
+
+The file marks are remembered until they are placed somewhere else. Thus you
+can place the mark, do hours of editing and still be able to jump back to that
+mark.
+ It's often useful to think of a simple connection between the mark letter
+and where it is placed. For example, use the H mark in a header file, M in
+a Makefile and C in a C code file.
+
+To see where a specific mark is, give an argument to the ":marks" command: >
+
+ :marks M
+
+You can also give several arguments: >
+
+ :marks MCP
+
+Don't forget that you can use CTRL-O and CTRL-I to jump to older and newer
+positions without placing marks there.
+
+==============================================================================
+*07.4* Backup files
+
+Usually Vim does not produce a backup file. If you want to have one, all you
+need to do is execute the following command: >
+
+ :set backup
+
+The name of the backup file is the original file with a ~ added to the end.
+If your file is named data.txt, for example, the backup file name is
+data.txt~.
+ If you do not like the fact that the backup files end with ~, you can
+change the extension: >
+
+ :set backupext=.bak
+
+This will use data.txt.bak instead of data.txt~.
+ Another option that matters here is 'backupdir'. It specifies where the
+backup file is written. The default, to write the backup in the same
+directory as the original file, will mostly be the right thing.
+
+ Note:
+ When the 'backup' option isn't set but the 'writebackup' is, Vim will
+ still create a backup file. However, it is deleted as soon as writing
+ the file was completed successfully. This functions as a safety
+ against losing your original file when writing fails in some way (disk
+ full is the most common cause; being hit by lightning might be
+ another, although less common).
+
+
+KEEPING THE ORIGINAL FILE
+
+If you are editing source files, you might want to keep the file before you
+make any changes. But the backup file will be overwritten each time you write
+the file. Thus it only contains the previous version, not the first one.
+ To make Vim keep the original file, set the 'patchmode' option. This
+specifies the extension used for the first backup of a changed file. Usually
+you would do this: >
+
+ :set patchmode=.orig
+
+When you now edit the file data.txt for the first time, make changes and write
+the file, Vim will keep a copy of the unchanged file under the name
+"data.txt.orig".
+ If you make further changes to the file, Vim will notice that
+"data.txt.orig" already exists and leave it alone. Further backup files will
+then be called "data.txt~" (or whatever you specified with 'backupext').
+ If you leave 'patchmode' empty (that is the default), the original file
+will not be kept.
+
+==============================================================================
+*07.5* Copy text between files
+
+This explains how to copy text from one file to another. Let's start with a
+simple example. Edit the file that contains the text you want to copy. Move
+the cursor to the start of the text and press "v". This starts Visual mode.
+Now move the cursor to the end of the text and press "y". This yanks (copies)
+the selected text.
+ To copy the above paragraph, you would do: >
+
+ :edit thisfile
+ /This
+ vjjjj$y
+
+Now edit the file you want to put the text in. Move the cursor to the
+character where you want the text to appear after. Use "p" to put the text
+there. >
+ :edit otherfile
+ /There
+ p
+
+Of course you can use many other commands to yank the text. For example, to
+select whole lines start Visual mode with "V". Or use CTRL-V to select a
+rectangular block. Or use "Y" to yank a single line, "yaw" to yank-a-word,
+etc.
+ The "p" command puts the text after the cursor. Use "P" to put the text
+before the cursor. Notice that Vim remembers if you yanked a whole line or a
+block, and puts it back that way.
+
+
+USING REGISTERS
+
+When you want to copy several pieces of text from one file to another, having
+to switch between the files and writing the target file takes a lot of time.
+To avoid this, copy each piece of text to its own register.
+ A register is a place where Vim stores text. Here we will use the
+registers named a to z (later you will find out there are others). Let's copy
+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 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): >
+
+ "l3Y
+
+The count could be before the "l just as well. To yank a block of text to the
+b (for block) register: >
+
+ CTRL-Vjjww"by
+
+Notice that the register specification "b is just before the "y" command.
+This is required. If you would have put it before the "w" command, it would
+not have worked.
+ Now you have three pieces of text in the f, l and b registers. Edit
+another file, move around and place the text where you want it: >
+
+ "fp
+
+Again, the register specification "f comes before the "p" command.
+ You can put the registers in any order. And the text stays in the register
+until you yank something else into it. Thus you can put it as many times as
+you like.
+
+When you delete text, you can also specify a register. Use this to move
+several pieces of text around. For example, to delete-a-word and write it in
+the w register: >
+
+ "wdaw
+
+Again, the register specification comes before the delete command "d".
+
+
+APPENDING TO A FILE
+
+When collecting lines of text into one file, you can use this command: >
+
+ :write >> logfile
+
+This will write the text of the current file to the end of "logfile". Thus it
+is appended. This avoids that you have to copy the lines, edit the log file
+and put them there. Thus you save two steps. But you can only append to the
+end of a file.
+ To append only a few lines, select them in Visual mode before typing
+":write". In chapter 10 you will learn other ways to select a range of lines.
+
+==============================================================================
+*07.6* Viewing a file
+
+Sometimes you only want to see what a file contains, without the intention to
+ever write it back. There is the risk that you type ":w" without thinking and
+overwrite the original file anyway. To avoid this, edit the file read-only.
+ To start Vim in readonly mode, use this command: >
+
+ vim -R file
+
+On Unix this command should do the same thing: >
+
+ view file
+
+You are now editing "file" in read-only mode. When you try using ":w" you
+will get an error message and the file won't be written.
+ When you try to make a change to the file Vim will give you a warning:
+
+ W10: Warning: Changing a readonly file ~
+
+The change will be done though. This allows for formatting the file, for
+example, to be able to read it easily.
+ If you make changes to a file and forgot that it was read-only, you can
+still write it. Add the ! to the write command to force writing.
+
+If you really want to forbid making changes in a file, do this: >
+
+ vim -M file
+
+Now every attempt to change the text will fail. The help files are like this,
+for example. If you try to make a change you get this error message:
+
+ E21: Cannot make changes, 'modifiable' is off ~
+
+You could use the -M argument to setup Vim to work in a viewer mode. This is
+only voluntary though, since these commands will remove the protection: >
+
+ :set modifiable
+ :set write
+
+==============================================================================
+*07.7* Changing the file name
+
+A clever way to start editing a new file is by using an existing file that
+contains most of what you need. For example, you start writing a new program
+to move a file. You know that you already have a program that copies a file,
+thus you start with: >
+
+ :edit copy.c
+
+You can delete the stuff you don't need. Now you need to save the file under
+a new name. The ":saveas" command can be used for this: >
+
+ :saveas move.c
+
+Vim will write the file under the given name, and edit that file. Thus the
+next time you do ":write", it will write "move.c". "copy.c" remains
+unmodified.
+ When you want to change the name of the file you are editing, but don't
+want to write the file, you can use this command: >
+
+ :file move.c
+
+Vim will mark the file as "not edited". This means that Vim knows this is not
+the file you started editing. When you try to write the file, you might get
+this message:
+
+ E13: File exists (use ! to override) ~
+
+This protects you from accidentally overwriting another file.
+
+==============================================================================
+
+Next chapter: |usr_08.txt| Splitting windows
+
+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
new file mode 100644
index 0000000..148f0cf
--- /dev/null
+++ b/runtime/doc/usr_08.txt
@@ -0,0 +1,601 @@
+*usr_08.txt* For Vim version 9.0. Last change: 2021 May 20
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Splitting windows
+
+
+Display two different files above each other. Or view two locations in the
+file at the same time. See the difference between two files by putting them
+side by side. All this is possible with split windows.
+
+|08.1| Split a window
+|08.2| Split a window on another file
+|08.3| Window size
+|08.4| Vertical splits
+|08.5| Moving windows
+|08.6| Commands for all windows
+|08.7| Viewing differences with vimdiff
+|08.8| Various
+|08.9| Tab pages
+
+ Next chapter: |usr_09.txt| Using the GUI
+ Previous chapter: |usr_07.txt| Editing more than one file
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*08.1* Split a window
+
+The easiest way to open a new window is to use the following command: >
+
+ :split
+
+This command splits the screen into two windows and leaves the cursor in the
+top one:
+
+ +----------------------------------+
+ |/* file one.c */ |
+ |~ |
+ |~ |
+ |one.c=============================|
+ |/* file one.c */ |
+ |~ |
+ |one.c=============================|
+ | |
+ +----------------------------------+
+
+What you see here is two windows on the same file. The line with "====" is
+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
+the bottom one the code that uses these variables.
+
+The CTRL-W w command can be used to jump between the windows. If you are in
+the top window, CTRL-W w jumps to the window below it. If you are in the
+bottom window it will jump to the first window. (CTRL-W CTRL-W does the same
+thing, in case you let go of the CTRL key a bit later.)
+
+
+CLOSE THE WINDOW
+
+To close a window, use the command: >
+
+ :close
+
+Actually, any command that quits editing a file works, like ":quit" and "ZZ".
+But ":close" prevents you from accidentally exiting Vim when you close the
+last window.
+
+
+CLOSING ALL OTHER WINDOWS
+
+If you have opened a whole bunch of windows, but now want to concentrate on
+one of them, this command will be useful: >
+
+ :only
+
+This closes all windows, except for the current one. If any of the other
+windows has changes, you will get an error message and that window won't be
+closed.
+
+==============================================================================
+*08.2* Split a window on another file
+
+The following command opens a second window and starts editing the given file:
+>
+ :split two.c
+
+If you were editing one.c, then the result looks like this:
+
+ +----------------------------------+
+ |/* file two.c */ |
+ |~ |
+ |~ |
+ |two.c=============================|
+ |/* file one.c */ |
+ |~ |
+ |one.c=============================|
+ | |
+ +----------------------------------+
+
+To open a window on a new, empty file, use this: >
+
+ :new
+
+You can repeat the ":split" and ":new" commands to create as many windows as
+you like.
+
+==============================================================================
+*08.3* Window size
+
+The ":split" command can take a number argument. If specified, this will be
+the height of the new window. For example, the following opens a new window
+three lines high and starts editing the file alpha.c: >
+
+ :3split alpha.c
+
+For existing windows you can change the size in several ways. When you have a
+working mouse, it is easy: Move the mouse pointer to the status line that
+separates two windows, and drag it up or down.
+
+To increase the size of a window: >
+
+ CTRL-W +
+
+To decrease it: >
+
+ CTRL-W -
+
+Both of these commands take a count and increase or decrease the window size
+by that many lines. Thus "4 CTRL-W +" make the window four lines higher.
+
+To set the window height to a specified number of lines: >
+
+ {height}CTRL-W _
+
+That's: a number {height}, CTRL-W and then an underscore (the - key with Shift
+on English-US keyboards).
+ To make a window as high as it can be, use the CTRL-W _ command without a
+count.
+
+
+USING THE MOUSE
+
+In Vim you can do many things very quickly from the keyboard. Unfortunately,
+the window resizing commands require quite a bit of typing. In this case,
+using the mouse is faster. Position the mouse pointer on a status line. Now
+press the left mouse button and drag. The status line will move, thus making
+the window on one side higher and the other smaller.
+
+
+OPTIONS
+
+The 'winheight' option can be set to a minimal desired height of a window and
+'winminheight' to a hard minimum height.
+ Likewise, there is 'winwidth' for the minimal desired width and
+'winminwidth' for the hard minimum width.
+ The 'equalalways' option, when set, makes Vim equalize the windows sizes
+when a window is closed or opened.
+
+==============================================================================
+*08.4* Vertical splits
+
+The ":split" command creates the new window above the current one. To make
+the window appear at the left side, use: >
+
+ :vsplit
+
+or: >
+ :vsplit two.c
+
+The result looks something like this:
+
+ +--------------------------------------+
+ |/* file two.c */ |/* file one.c */ |
+ |~ |~ |
+ |~ |~ |
+ |~ |~ |
+ |two.c===============one.c=============|
+ | |
+ +--------------------------------------+
+
+Actually, the | lines in the middle will be in reverse video. This is called
+the vertical separator. It separates the two windows left and right of it.
+
+There is also the ":vnew" command, to open a vertically split window on a new,
+empty file. Another way to do this: >
+
+ :vertical new
+
+The ":vertical" command can be inserted before another command that splits a
+window. This will cause that command to split the window vertically instead
+of horizontally. (If the command doesn't split a window, it works
+unmodified.)
+
+
+MOVING BETWEEN WINDOWS
+
+Since you can split windows horizontally and vertically as much as you like,
+you can create almost any layout of windows. Then you can use these commands
+to move between them:
+
+ CTRL-W h move to the window on the left
+ CTRL-W j move to the window below
+ CTRL-W k move to the window above
+ CTRL-W l move to the window on the right
+
+ CTRL-W t move to the TOP window
+ CTRL-W b move to the BOTTOM window
+
+You will notice the same letters as used for moving the cursor. And the
+cursor keys can also be used, if you like.
+ More commands to move to other windows: |Q_wi|.
+
+==============================================================================
+*08.5* Moving windows
+
+You have split a few windows, but now they are in the wrong place. Then you
+need a command to move the window somewhere else. For example, you have three
+windows like this:
+
+ +----------------------------------+
+ |/* file two.c */ |
+ |~ |
+ |~ |
+ |two.c=============================|
+ |/* file three.c */ |
+ |~ |
+ |~ |
+ |three.c===========================|
+ |/* file one.c */ |
+ |~ |
+ |one.c=============================|
+ | |
+ +----------------------------------+
+
+Clearly the last one should be at the top. Go to that window (using CTRL-W w)
+and then type this command: >
+
+ CTRL-W K
+
+This uses the uppercase letter K. What happens is that the window is moved to
+the very top. You will notice that K is again used for moving upwards.
+ When you have vertical splits, CTRL-W K will move the current window to the
+top and make it occupy the full width of the Vim window. If this is your
+layout:
+
+ +-------------------------------------------+
+ |/* two.c */ |/* three.c */ |/* one.c */ |
+ |~ |~ |~ |
+ |~ |~ |~ |
+ |~ |~ |~ |
+ |~ |~ |~ |
+ |~ |~ |~ |
+ |two.c=========three.c=========one.c========|
+ | |
+ +-------------------------------------------+
+
+Then using CTRL-W K in the middle window (three.c) will result in:
+
+ +-------------------------------------------+
+ |/* three.c */ |
+ |~ |
+ |~ |
+ |three.c====================================|
+ |/* two.c */ |/* one.c */ |
+ |~ |~ |
+ |two.c==================one.c===============|
+ | |
+ +-------------------------------------------+
+
+The other three similar commands (you can probably guess these now):
+
+ CTRL-W H move window to the far left
+ CTRL-W J move window to the bottom
+ CTRL-W L move window to the far right
+
+==============================================================================
+*08.6* Commands for all windows
+
+When you have several windows open and you want to quit Vim, you can close
+each window separately. A quicker way is using this command: >
+
+ :qall
+
+This stands for "quit all". If any of the windows contain changes, Vim will
+not exit. The cursor will automatically be positioned in a window with
+changes. You can then either use ":write" to save the changes, or ":quit!" to
+throw them away.
+
+If you know there are windows with changes, and you want to save all these
+changes, use this command: >
+
+ :wall
+
+This stands for "write all". But actually, it only writes files with
+changes. Vim knows it doesn't make sense to write files that were not
+changed.
+ And then there is the combination of ":qall" and ":wall": the "write and
+quit all" command: >
+
+ :wqall
+
+This writes all modified files and quits Vim.
+ Finally, there is a command that quits Vim and throws away all changes: >
+
+ :qall!
+
+Be careful, there is no way to undo this command!
+
+
+OPENING A WINDOW FOR ALL ARGUMENTS
+
+To make Vim open a window for each file, start it with the "-o" argument: >
+
+ vim -o one.txt two.txt three.txt
+
+This results in:
+
+ +-------------------------------+
+ |file one.txt |
+ |~ |
+ |one.txt========================|
+ |file two.txt |
+ |~ |
+ |two.txt========================|
+ |file three.txt |
+ |~ |
+ |three.txt======================|
+ | |
+ +-------------------------------+
+
+The "-O" argument is used to get vertically split windows.
+ When Vim is already running, the ":all" command opens a window for each
+file in the argument list. ":vertical all" does it with vertical splits.
+
+==============================================================================
+*08.7* Viewing differences with vimdiff
+
+There is a special way to start Vim, which shows the differences between two
+files. Let's take a file "main.c" and insert a few characters in one line.
+Write this file with the 'backup' option set, so that the backup file
+"main.c~" will contain the previous version of the file.
+ Type this command in a shell (not in Vim): >
+
+ vimdiff main.c~ main.c
+
+Vim will start, with two windows side by side. You will only see the line
+in which you added characters, and a few lines above and below it.
+
+ VV VV
+ +-----------------------------------------+
+ |+ +--123 lines: /* a|+ +--123 lines: /* a| <- fold
+ | text | text |
+ | text | text |
+ | text | text |
+ | text | changed text | <- changed line
+ | text | text |
+ | text | ------------------| <- deleted line
+ | text | text |
+ | text | text |
+ | text | text |
+ |+ +--432 lines: text|+ +--432 lines: text| <- fold
+ | ~ | ~ |
+ | ~ | ~ |
+ |main.c~==============main.c==============|
+ | |
+ +-----------------------------------------+
+
+(This picture doesn't show the highlighting, use the vimdiff command for a
+better look.)
+
+The lines that were not modified have been collapsed into one line. This is
+called a closed fold. They are indicated in the picture with "<- fold". Thus
+the single fold line at the top stands for 123 text lines. These lines are
+equal in both files.
+ The line marked with "<- changed line" is highlighted, and the inserted
+text is displayed with another color. This clearly shows what the difference
+is between the two files.
+ The line that was deleted is displayed with "---" in the main.c window.
+See the "<- deleted line" marker in the picture. These characters are not
+really there. They just fill up main.c, so that it displays the same number
+of lines as the other window.
+
+
+THE FOLD COLUMN
+
+Each window has a column on the left with a slightly different background. In
+the picture above these are indicated with "VV". You notice there is a plus
+character there, in front of each closed fold. Move the mouse pointer to that
+plus and click the left button. The fold will open, and you can see the text
+that it contains.
+ The fold column contains a minus sign for an open fold. If you click on
+this -, the fold will close.
+ Obviously, this only works when you have a working mouse. You can also use
+"zo" to open a fold and "zc" to close it.
+
+
+DIFFING IN VIM
+
+Another way to start in diff mode can be done from inside Vim. Edit the
+"main.c" file, then make a split and show the differences: >
+
+ :edit main.c
+ :vertical diffsplit main.c~
+
+The ":vertical" command is used to make the window split vertically. If you
+omit this, you will get a horizontal split.
+
+If you have a patch or diff file, you can use the third way to start diff
+mode. First edit the file to which the patch applies. Then tell Vim the name
+of the patch file: >
+
+ :edit main.c
+ :vertical diffpatch main.c.diff
+
+WARNING: The patch file must contain only one patch, for the file you are
+editing. Otherwise you will get a lot of error messages, and some files might
+be patched unexpectedly.
+ The patching will only be done to the copy of the file in Vim. The file on
+your harddisk will remain unmodified (until you decide to write the file).
+
+
+SCROLL BINDING
+
+When the files have more changes, you can scroll in the usual way. Vim will
+try to keep both the windows start at the same position, so you can easily see
+the differences side by side.
+ When you don't want this for a moment, use this command: >
+
+ :set noscrollbind
+
+
+JUMPING TO CHANGES
+
+When you have disabled folding in some way, it may be difficult to find the
+changes. Use this command to jump forward to the next change: >
+
+ ]c
+
+To go the other way use: >
+
+ [c
+
+Prepended a count to jump further away.
+
+
+REMOVING CHANGES
+
+You can move text from one window to the other. This either removes
+differences or adds new ones. Vim doesn't keep the highlighting updated in
+all situations. To update it use this command: >
+
+ :diffupdate
+
+To remove a difference, you can move the text in a highlighted block from one
+window to another. Take the "main.c" and "main.c~" example above. Move the
+cursor to the left window, on the line that was deleted in the other window.
+Now type this command: >
+
+ dp
+
+The change will be removed by putting the text of the current window in the
+other window. "dp" stands for "diff put".
+ You can also do it the other way around. Move the cursor to the right
+window, to the line where "changed" was inserted. Now type this command: >
+
+ do
+
+The change will now be removed by getting the text from the other window.
+Since there are no changes left now, Vim puts all text in a closed fold.
+"do" stands for "diff obtain". "dg" would have been better, but that already
+has a different meaning ("dgg" deletes from the cursor until the first line).
+
+For details about diff mode, see |vimdiff|.
+
+==============================================================================
+*08.8* Various
+
+The 'laststatus' option can be used to specify when the last window has a
+statusline:
+
+ 0 never
+ 1 only when there are split windows (the default)
+ 2 always
+
+Many commands that edit another file have a variant that splits the window.
+For Command-line commands this is done by prepending an "s". For example:
+":tag" jumps to a tag, ":stag" splits the window and jumps to a
+tag.
+ For Normal mode commands a CTRL-W is prepended. CTRL-^ jumps to the
+alternate file, CTRL-W CTRL-^ splits the window and edits the alternate file.
+
+The 'splitbelow' option can be set to make a new window appear below the
+current window. The 'splitright' option can be set to make a vertically split
+window appear right of the current window.
+
+When splitting a window you can prepend a modifier command to tell where the
+window is to appear:
+
+ :leftabove {cmd} left or above the current window
+ :aboveleft {cmd} idem
+ :rightbelow {cmd} right or below the current window
+ :belowright {cmd} idem
+ :topleft {cmd} at the top or left of the Vim window
+ :botright {cmd} at the bottom or right of the Vim window
+
+
+==============================================================================
+*08.9* Tab pages
+
+You will have noticed that windows never overlap. That means you quickly run
+out of screen space. The solution for this is called Tab pages.
+
+Assume you are editing "thisfile". To create a new tab page use this command: >
+
+ :tabedit thatfile
+
+This will edit the file "thatfile" in a window that occupies the whole Vim
+window. And you will notice a bar at the top with the two file names:
+
+ +----------------------------------+
+ | thisfile | /thatfile/ __________X| (thatfile is bold)
+ |/* thatfile */ |
+ |that |
+ |that |
+ |~ |
+ |~ |
+ |~ |
+ | |
+ +----------------------------------+
+
+You now have two tab pages. The first one has a window for "thisfile" and the
+second one a window for "thatfile". It's like two pages that are on top of
+each other, with a tab sticking out of each page showing the file name.
+
+Now use the mouse to click on "thisfile" in the top line. The result is
+
+ +----------------------------------+
+ | /thisfile/ | thatfile __________X| (thisfile is bold)
+ |/* thisfile */ |
+ |this |
+ |this |
+ |~ |
+ |~ |
+ |~ |
+ | |
+ +----------------------------------+
+
+Thus you can switch between tab pages by clicking on the label in the top
+line. If you don't have a mouse or don't want to use it, you can use the "gt"
+command. Mnemonic: Goto Tab.
+
+Now let's create another tab page with the command: >
+
+ :tab split
+
+This makes a new tab page with one window that is editing the same buffer as
+the window we were in:
+
+ +-------------------------------------+
+ | thisfile | /thisfile/ | thatfile __X| (thisfile is bold)
+ |/* thisfile */ |
+ |this |
+ |this |
+ |~ |
+ |~ |
+ |~ |
+ | |
+ +-------------------------------------+
+
+You can put ":tab" before any Ex command that opens a window. The window will
+be opened in a new tab page. Another example: >
+
+ :tab help gt
+
+Will show the help text for "gt" in a new tab page.
+
+A few more things you can do with tab pages:
+
+- click with the mouse in the space after the last label
+ The next tab page will be selected, like with "gt".
+
+- click with the mouse on the "X" in the top right corner
+ The current tab page will be closed. Unless there are unsaved
+ changes in the current tab page.
+
+- double click with the mouse in the top line
+ A new tab page will be created.
+
+- the "tabonly" command
+ Closes all tab pages except the current one. Unless there are unsaved
+ changes in other tab pages.
+
+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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_09.txt b/runtime/doc/usr_09.txt
new file mode 100644
index 0000000..43394da
--- /dev/null
+++ b/runtime/doc/usr_09.txt
@@ -0,0 +1,290 @@
+*usr_09.txt* For Vim version 9.0. Last change: 2017 Aug 11
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Using the GUI
+
+
+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
+|09.3| The clipboard
+|09.4| Select mode
+
+ Next chapter: |usr_10.txt| Making big changes
+ Previous chapter: |usr_08.txt| Splitting windows
+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
+these commands should do it: >
+
+ gvim file.txt
+ vim -g file.txt
+
+If this doesn't work you don't have a version of Vim with GUI support. You
+will have to install one first.
+ Vim will open a window and display "file.txt" in it. What the window looks
+like depends on the version of Vim. It should resemble the following picture
+(for as far as this can be shown in ASCII!).
+
+ +----------------------------------------------------+
+ | file.txt + (~/dir) - VIM X | <- window title
+ +----------------------------------------------------+
+ | File Edit Tools Syntax Buffers Window Help | <- menubar
+ +----------------------------------------------------+
+ | aaa bbb ccc ddd eee fff ggg hhh iii jjj | <- toolbar
+ | aaa bbb ccc ddd eee fff ggg hhh iii jjj |
+ +----------------------------------------------------+
+ | file text | ^ |
+ | ~ | # |
+ | ~ | # | <- scrollbar
+ | ~ | # |
+ | ~ | # |
+ | ~ | # |
+ | | V |
+ +----------------------------------------------------+
+
+The largest space is occupied by the file text. This shows the file in the
+same way as in a terminal. With some different colors and another font
+perhaps.
+
+
+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 characters can be present:
+
+ - The file cannot be modified (e.g., a help file)
+ + The file contains changes
+ = The file is read-only
+ =+ The file is read-only, contains changes anyway
+
+If nothing is shown you have an ordinary, unchanged file.
+
+
+THE MENUBAR
+
+You know how menus work, right? Vim has the usual items, plus a few more.
+Browse them to get an idea of what you can use them for. A relevant submenu
+is Edit/Global Settings. You will find these entries:
+
+ Toggle Toolbar make the toolbar appear/disappear
+ Toggle Bottom Scrollbar make a scrollbar appear/disappear at the bottom
+ Toggle Left Scrollbar make a scrollbar appear/disappear at the left
+ Toggle Right Scrollbar make a scrollbar appear/disappear at the right
+
+On most systems you can tear-off the menus. Select the top item of the menu,
+the one that looks like a dashed line. You will get a separate window with
+the items of the menu. It will hang around until you close the window.
+
+
+THE TOOLBAR
+
+This contains icons for the most often used actions. Hopefully the icons are
+self-explanatory. There are tooltips to get an extra hint (move the mouse
+pointer to the icon without clicking and don't move it for a second).
+
+The "Edit/Global Settings/Toggle Toolbar" menu item can be used to make the
+toolbar disappear. If you never want a toolbar, use this command in your
+vimrc file: >
+
+ :set guioptions-=T
+
+This removes the 'T' flag from the 'guioptions' option. Other parts of the
+GUI can also be enabled or disabled with this option. See the help for it.
+
+
+THE SCROLLBARS
+
+By default there is one scrollbar on the right. It does the obvious thing.
+When you split the window, each window will get its own scrollbar.
+ You can make a horizontal scrollbar appear with the menu item
+Edit/Global Settings/Toggle Bottom Scrollbar. This is useful in diff mode, or
+when the 'wrap' option has been reset (more about that later).
+
+When there are vertically split windows, only the windows on the right side
+will have a scrollbar. However, when you move the cursor to a window on the
+left, it will be this one that the scrollbar controls. This takes a bit of
+time to get used to.
+ When you work with vertically split windows, consider adding a scrollbar on
+the left. This can be done with a menu item, or with the 'guioptions' option:
+>
+ :set guioptions+=l
+
+This adds the 'l' flag to 'guioptions'.
+
+==============================================================================
+*09.2* Using the mouse
+
+Standards are wonderful. In Microsoft Windows, you can use the mouse to
+select text in a standard manner. The X Window system also has a standard
+system for using the mouse. Unfortunately, these two standards are not the
+same.
+ Fortunately, you can customize Vim. You can make the behavior of the mouse
+work like an X Window system mouse or a Microsoft Windows mouse. The following
+command makes the mouse behave like an X Window mouse: >
+
+ :behave xterm
+
+The following command makes the mouse work like a Microsoft Windows mouse: >
+
+ :behave mswin
+
+The default behavior of the mouse on UNIX systems is xterm. The default
+behavior on a Microsoft Windows system is selected during the installation
+process. For details about what the two behaviors are, see |:behave|. Here
+follows a summary.
+
+
+XTERM MOUSE BEHAVIOR
+
+Left mouse click position the cursor
+Left mouse drag select text in Visual mode
+Middle mouse click paste text from the clipboard
+Right mouse click extend the selected text until the mouse
+ pointer
+
+
+MSWIN MOUSE BEHAVIOR
+
+Left mouse click position the cursor
+Left mouse drag select text in Select mode (see |09.4|)
+Left mouse click, with Shift extend the selected text until the mouse
+ pointer
+Middle mouse click paste text from the clipboard
+Right mouse click display a pop-up menu
+
+
+The mouse can be further tuned. Check out these options if you want to change
+the way how the mouse works:
+
+ 'mouse' in which mode the mouse is used by Vim
+ 'mousemodel' what effect a mouse click has
+ 'mousetime' time between clicks for a double-click
+ 'mousehide' hide the mouse while typing
+ 'selectmode' whether the mouse starts Visual or Select mode
+
+==============================================================================
+*09.3* The clipboard
+
+In section |04.7| the basic use of the clipboard was explained. There is one
+essential thing to explain about X-windows: There are actually two places to
+exchange text between programs. MS-Windows doesn't have this.
+
+In X-Windows there is the "current selection". This is the text that is
+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
+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
+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
+longer is the current selection.
+
+You don't need to select text with the mouse, using the keyboard commands for
+Visual mode works just as well.
+
+
+THE REAL CLIPBOARD
+
+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
+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
+Edit/Paste menu. You will see the text from the real clipboard is inserted.
+
+
+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:
+
+- Select two words in Visual mode.
+- Use the Edit/Copy menu to get these words onto the clipboard.
+- Select one other word in Visual mode.
+- Use the Edit/Paste menu item. What will happen is that the single selected
+ word is replaced with the two words from the clipboard.
+- Move the mouse pointer somewhere else and click the middle button. You
+ will see that the word you just overwrote with the clipboard is inserted
+ here.
+
+If you use the "current selection" and the "real clipboard" with care, you can
+do a lot of useful editing with them.
+
+
+USING THE KEYBOARD
+
+If you don't like using the mouse, you can access the current selection and
+the real clipboard with two registers. The "* register is for the current
+selection.
+ To make text become the current selection, use Visual mode. For example,
+to select a whole line just press "V".
+ To insert the current selection before the cursor: >
+
+ "*P
+
+Notice the uppercase "P". The lowercase "p" puts the text after the cursor.
+
+The "+ register is used for the real clipboard. For example, to copy the text
+from the cursor position until the end of the line to the clipboard: >
+
+ "+y$
+
+Remember, "y" is yank, which is Vim's copy command.
+ To insert the contents of the real clipboard before the cursor: >
+
+ "+P
+
+It's the same as for the current selection, but uses the plus (+) register
+instead of the star (*) register.
+
+==============================================================================
+*09.4* Select mode
+
+And now something that is used more often on MS-Windows than on X-Windows.
+But both can do it. You already know about Visual mode. Select mode is like
+Visual mode, because it is also used to select text. But there is an obvious
+difference: When typing text, the selected text is deleted and the typed text
+replaces it.
+
+To start working with Select mode, you must first enable it (for MS-Windows
+it is probably already enabled, but you can do this anyway): >
+
+ :set selectmode+=mouse
+
+Now use the mouse to select some text. It is highlighted like in Visual mode.
+Now press a letter. The selected text is deleted, and the single letter
+replaces it. You are in Insert mode now, thus you can continue typing.
+
+Since typing normal text causes the selected text to be deleted, you can not
+use the normal movement commands "hjkl", "w", etc. Instead, use the shifted
+function keys. <S-Left> (shifted cursor left key) moves the cursor left. The
+selected text is changed like in Visual mode. The other shifted cursor keys
+do what you expect. <S-End> and <S-Home> also work.
+
+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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_10.txt b/runtime/doc/usr_10.txt
new file mode 100644
index 0000000..220a7ab
--- /dev/null
+++ b/runtime/doc/usr_10.txt
@@ -0,0 +1,825 @@
+*usr_10.txt* For Vim version 9.0. Last change: 2019 Nov 22
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Making big changes
+
+
+In chapter 4 several ways to make small changes were explained. This chapter
+goes into making changes that are repeated or can affect a large amount of
+text. The Visual mode allows doing various things with blocks of text. Use
+an external program to do really complicated things.
+
+|10.1| Record and playback commands
+|10.2| Substitution
+|10.3| Command ranges
+|10.4| The global command
+|10.5| Visual block mode
+|10.6| Reading and writing part of a file
+|10.7| Formatting text
+|10.8| Changing case
+|10.9| Using an external program
+
+ Next chapter: |usr_11.txt| Recovering from a crash
+ Previous chapter: |usr_09.txt| Using the GUI
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*10.1* Record and playback commands
+
+The "." command repeats the preceding change. But what if you want to do
+something more complex than a single change? That's where command recording
+comes in. There are three steps:
+
+1. The "q{register}" command starts recording keystrokes into the register
+ named {register}. The register name must be between a and z.
+2. Type your commands.
+3. To finish recording, press q (without any extra character).
+
+You can now execute the macro by typing the command "@{register}".
+
+Take a look at how to use these commands in practice. You have a list of
+filenames that look like this:
+
+ stdio.h ~
+ fcntl.h ~
+ unistd.h ~
+ stdlib.h ~
+
+And what you want is the following:
+
+ #include "stdio.h" ~
+ #include "fcntl.h" ~
+ #include "unistd.h" ~
+ #include "stdlib.h" ~
+
+You start by moving to the first character of the first line. Next you
+execute the following commands:
+
+ qa Start recording a macro in register a.
+ ^ Move to the beginning of the line.
+ i#include "<Esc> Insert the string #include " at the beginning
+ of the line.
+ $ Move to the end of the line.
+ a"<Esc> Append the character double quotation mark (")
+ to the end of the line.
+ j Go to the next line.
+ q Stop recording the macro.
+
+Now that you have done the work once, you can repeat the change by typing the
+command "@a" three times.
+ The "@a" command can be preceded by a count, which will cause the macro to
+be executed that number of times. In this case you would type: >
+
+ 3@a
+
+
+MOVE AND EXECUTE
+
+You might have the lines you want to change in various places. Just move the
+cursor to each location and use the "@a" command. If you have done that once,
+you can do it again with "@@". That's a bit easier to type. If you now
+execute register b with "@b", the next "@@" will use register b.
+ If you compare the playback method with using ".", there are several
+differences. First of all, "." can only repeat one change. As seen in the
+example above, "@a" can do several changes, and move around as well.
+Secondly, "." can only remember the last change. Executing a register allows
+you to make any changes and then still use "@a" to replay the recorded
+commands. Finally, you can use 26 different registers. Thus you can remember
+26 different command sequences to execute.
+
+
+USING REGISTERS
+
+The registers used for recording are the same ones you used for yank and
+delete commands. This allows you to mix recording with other commands to
+manipulate the registers.
+ Suppose you have recorded a few commands in register n. When you execute
+this with "@n" you notice you did something wrong. You could try recording
+again, but perhaps you will make another mistake. Instead, use this trick:
+
+ G Go to the end of the file.
+ o<Esc> Create an empty line.
+ "np Put the text from the n register. You now see
+ the commands you typed as text in the file.
+ {edits} Change the commands that were wrong. This is
+ just like editing text.
+ 0 Go to the start of the line.
+ "ny$ Yank the corrected commands into the n
+ register.
+ dd Delete the scratch line.
+
+Now you can execute the corrected commands with "@n". (If your recorded
+commands include line breaks, adjust the last two items in the example to
+include all the lines.)
+
+
+APPENDING TO A REGISTER
+
+So far we have used a lowercase letter for the register name. To append to a
+register, use an uppercase letter.
+ Suppose you have recorded a command to change a word to register c. It
+works properly, but you would like to add a search for the next word to
+change. This can be done with: >
+
+ qC/word<Enter>q
+
+You start with "qC", which records to the c register and appends. Thus
+writing to an uppercase register name means to append to the register with
+the same letter, but lowercase.
+
+This works both with recording and with yank and delete commands. For
+example, you want to collect a sequence of lines into the a register. Yank
+the first line with: >
+
+ "aY
+
+Now move to the second line, and type: >
+
+ "AY
+
+Repeat this command for all lines. The a register now contains all those
+lines, in the order you yanked them.
+
+==============================================================================
+*10.2* Substitution *find-replace*
+
+The ":substitute" command enables you to perform string replacements on a
+whole range of lines. The general form of this command is as follows: >
+
+ :[range]substitute/from/to/[flags]
+
+This command changes the "from" string to the "to" string in the lines
+specified with [range]. For example, you can change "Professor" to "Teacher"
+in all lines with the following command: >
+
+ :%substitute/Professor/Teacher/
+<
+ Note:
+ The ":substitute" command is almost never spelled out completely.
+ Most of the time, people use the abbreviated version ":s". From here
+ on the abbreviation will be used.
+
+The "%" before the command specifies the command works on all lines. Without
+a range, ":s" only works on the current line. More about ranges in the next
+section |10.3|.
+
+By default, the ":substitute" command changes only the first occurrence on
+each line. For example, the preceding command changes the line:
+
+ Professor Smith criticized Professor Johnson today. ~
+
+to:
+
+ Teacher Smith criticized Professor Johnson today. ~
+
+To change every occurrence on the line, you need to add the g (global) flag.
+The command: >
+
+ :%s/Professor/Teacher/g
+
+results in (starting with the original line):
+
+ Teacher Smith criticized Teacher Johnson today. ~
+
+Other flags include p (print), which causes the ":substitute" command to print
+out the last line it changes. The c (confirm) flag tells ":substitute" to ask
+you for confirmation before it performs each substitution. Enter the
+following: >
+
+ :%s/Professor/Teacher/c
+
+Vim finds the first occurrence of "Professor" and displays the text it is
+about to change. You get the following prompt: >
+
+ replace with Teacher (y/n/a/q/l/^E/^Y)?
+
+At this point, you must enter one of the following answers:
+
+ y Yes; make this change.
+ n No; skip this match.
+ a All; make this change and all remaining ones without
+ further confirmation.
+ q Quit; don't make any more changes.
+ l Last; make this change and then quit.
+ CTRL-E Scroll the text one line up.
+ CTRL-Y Scroll the text one line down.
+
+
+The "from" part of the substitute command is actually a pattern. The same
+kind as used for the search command. For example, this command only
+substitutes "the" when it appears at the start of a line: >
+
+ :s/^the/these/
+
+If you are substituting with a "from" or "to" part that includes a slash, you
+need to put a backslash before it. A simpler way is to use another character
+instead of the slash. A plus, for example: >
+
+ :s+one/two+one or two+
+
+==============================================================================
+*10.3* Command ranges
+
+The ":substitute" command, and many other : commands, can be applied to a
+selection of lines. This is called a range.
+ The simple form of a range is {number},{number}. For example: >
+
+ :1,5s/this/that/g
+
+Executes the substitute command on the lines 1 to 5. Line 5 is included.
+The range is always placed before the command.
+
+A single number can be used to address one specific line: >
+
+ :54s/President/Fool/
+
+Some commands work on the whole file when you do not specify a range. To make
+them work on the current line the "." address is used. The ":write" command
+works like that. Without a range, it writes the whole file. To make it write
+only the current line into a file: >
+
+ :.write otherfile
+
+The first line always has number one. How about the last line? The "$"
+character is used for this. For example, to substitute in the lines from the
+cursor to the end: >
+
+ :.,$s/yes/no/
+
+The "%" range that we used before, is actually a short way to say "1,$", from
+the first to the last line.
+
+
+USING A PATTERN IN A RANGE
+
+Suppose you are editing a chapter in a book, and want to replace all
+occurrences of "grey" with "gray". But only in this chapter, not in the next
+one. You know that only chapter boundaries have the word "Chapter" in the
+first column. This command will work then: >
+
+ :?^Chapter?,/^Chapter/s=grey=gray=g
+
+You can see a search pattern is used twice. The first "?^Chapter?" finds the
+line above the current position that matches this pattern. Thus the ?pattern?
+range is used to search backwards. Similarly, "/^Chapter/" is used to search
+forward for the start of the next chapter.
+ To avoid confusion with the slashes, the "=" character was used in the
+substitute command here. A slash or another character would have worked as
+well.
+
+
+ADD AND SUBTRACT
+
+There is a slight error in the above command: If the title of the next chapter
+had included "grey" it would be replaced as well. Maybe that's what you
+wanted, but what if you didn't? Then you can specify an offset.
+ To search for a pattern and then use the line above it: >
+
+ /Chapter/-1
+
+You can use any number instead of the 1. To address the second line below the
+match: >
+
+ /Chapter/+2
+
+The offsets can also be used with the other items in a range. Look at this
+one: >
+
+ :.+3,$-5
+
+This specifies the range that starts three lines below the cursor and ends
+five lines before the last line in the file.
+
+
+USING MARKS
+
+Instead of figuring out the line numbers of certain positions, remembering them
+and typing them in a range, you can use marks.
+ Place the marks as mentioned in chapter 3. For example, use "mt" to mark
+the top of an area and "mb" to mark the bottom. Then you can use this range
+to specify the lines between the marks (including the lines with the marks): >
+
+ :'t,'b
+
+
+VISUAL MODE AND RANGES
+
+You can select text with Visual mode. If you then press ":" to start a colon
+command, you will see this: >
+
+ :'<,'>
+
+Now you can type the command and it will be applied to the range of lines that
+was visually selected.
+
+ Note:
+ When using Visual mode to select part of a line, or using CTRL-V to
+ select a block of text, the colon commands will still apply to whole
+ lines. This might change in a future version of Vim.
+
+The '< and '> are actually marks, placed at the start and end of the Visual
+selection. The marks remain at their position until another Visual selection
+is made. Thus you can use the "'<" command to jump to position where the
+Visual area started. And you can mix the marks with other items: >
+
+ :'>,$
+
+This addresses the lines from the end of the Visual area to the end of the
+file.
+
+
+A NUMBER OF LINES
+
+When you know how many lines you want to change, you can type the number and
+then ":". For example, when you type "5:", you will get: >
+
+ :.,.+4
+
+Now you can type the command you want to use. It will use the range "."
+(current line) until ".+4" (four lines down). Thus it spans five lines.
+
+==============================================================================
+*10.4* The global command
+
+The ":global" command is one of the more powerful features of Vim. It allows
+you to find a match for a pattern and execute a command there. The general
+form is: >
+
+ :[range]global/{pattern}/{command}
+
+This is similar to the ":substitute" command. But, instead of replacing the
+matched text with other text, the command {command} is executed.
+
+ Note:
+ The command executed for ":global" must be one that starts with a
+ colon. Normal mode commands can not be used directly. The |:normal|
+ command can do this for you.
+
+Suppose you want to change "foobar" to "barfoo", but only in C++ style
+comments. These comments start with "//". Use this command: >
+
+ :g+//+s/foobar/barfoo/g
+
+This starts with ":g". That is short for ":global", just like ":s" is short
+for ":substitute". Then the pattern, enclosed in plus characters. Since the
+pattern we are looking for contains a slash, this uses the plus character to
+separate the pattern. Next comes the substitute command that changes "foobar"
+into "barfoo".
+ The default range for the global command is the whole file. Thus no range
+was specified in this example. This is different from ":substitute", which
+works on one line without a range.
+ The command isn't perfect, since it also matches lines where "//" appears
+halfway through a line, and the substitution will also take place before the
+"//".
+
+Just like with ":substitute", any pattern can be used. When you learn more
+complicated patterns later, you can use them here.
+
+==============================================================================
+*10.5* Visual block mode
+
+With CTRL-V you can start selection of a rectangular area of text. There are
+a few commands that do something special with the text block.
+
+There is something special about using the "$" command in Visual block mode.
+When the last motion command used was "$", all lines in the Visual selection
+will extend until the end of the line, also when the line with the cursor is
+shorter. This remains effective until you use a motion command that moves the
+cursor horizontally. Thus using "j" keeps it, "h" stops it.
+
+
+INSERTING TEXT
+
+The command "I{string}<Esc>" inserts the text {string} in each line, just
+left of the visual block. You start by pressing CTRL-V to enter visual block
+mode. Now you move the cursor to define your block. Next you type I to enter
+Insert mode, followed by the text to insert. As you type, the text appears on
+the first line only.
+ After you press <Esc> to end the insert, the text will magically be
+inserted in the rest of the lines contained in the visual selection. Example:
+
+ include one ~
+ include two ~
+ include three ~
+ include four ~
+
+Move the cursor to the "o" of "one" and press CTRL-V. Move it down with "3j"
+to "four". You now have a block selection that spans four lines. Now type: >
+
+ Imain.<Esc>
+
+The result:
+
+ include main.one ~
+ include main.two ~
+ include main.three ~
+ include main.four ~
+
+If the block spans short lines that do not extend into the block, the text is
+not inserted in that line. For example, make a Visual block selection that
+includes the word "long" in the first and last line of this text, and thus has
+no text selected in the second line:
+
+ This is a long line ~
+ short ~
+ Any other long line ~
+
+ ^^^^ selected block
+
+Now use the command "Ivery <Esc>". The result is:
+
+ This is a very long line ~
+ short ~
+ Any other very long line ~
+
+In the short line no text was inserted.
+
+If the string you insert contains a newline, the "I" acts just like a Normal
+insert command and affects only the first line of the block.
+
+The "A" command works the same way, except that it appends after the right
+side of the block. And it does insert text in a short line. Thus you can
+make a choice whether you do or don't want to append text to a short line.
+ There is one special case for "A": Select a Visual block and then use "$"
+to make the block extend to the end of each line. Using "A" now will append
+the text to the end of each line.
+ Using the same example from above, and then typing "$A XXX<Esc>, you get
+this result:
+
+ This is a long line XXX ~
+ short XXX ~
+ Any other long line XXX ~
+
+This really requires using the "$" command. Vim remembers that it was used.
+Making the same selection by moving the cursor to the end of the longest line
+with other movement commands will not have the same result.
+
+
+CHANGING TEXT
+
+The Visual block "c" command deletes the block and then throws you into Insert
+mode to enable you to type in a string. The string will be inserted in each
+line in the block.
+ Starting with the same selection of the "long" words as above, then typing
+"c_LONG_<Esc>", you get this:
+
+ This is a _LONG_ line ~
+ short ~
+ Any other _LONG_ line ~
+
+Just like with "I" the short line is not changed. Also, you can't enter a
+newline in the new text.
+
+The "C" command deletes text from the left edge of the block to the end of
+line. It then puts you in Insert mode so that you can type in a string,
+which is added to the end of each line.
+ Starting with the same text again, and typing "Cnew text<Esc>" you get:
+
+ This is a new text ~
+ short ~
+ Any other new text ~
+
+Notice that, even though only the "long" word was selected, the text after it
+is deleted as well. Thus only the location of the left edge of the visual
+block really matters.
+ Again, short lines that do not reach into the block are excluded.
+
+Other commands that change the characters in the block:
+
+ ~ swap case (a -> A and A -> a)
+ U make uppercase (a -> A and A -> A)
+ u make lowercase (a -> a and A -> a)
+
+
+FILLING WITH A CHARACTER
+
+To fill the whole block with one character, use the "r" command. Again,
+starting with the same example text from above, and then typing "rx":
+
+ This is a xxxx line ~
+ short ~
+ Any other xxxx line ~
+
+
+ Note:
+ If you want to include characters beyond the end of the line in the
+ block, check out the 'virtualedit' feature in chapter 25.
+
+
+SHIFTING
+
+The command ">" shifts the selected text to the right one shift amount,
+inserting whitespace. The starting point for this shift is the left edge of
+the visual block.
+ With the same example again, ">" gives this result:
+
+ This is a long line ~
+ short ~
+ Any other long line ~
+
+The shift amount is specified with the 'shiftwidth' option. To change it to
+use 4 spaces: >
+
+ :set shiftwidth=4
+
+The "<" command removes one shift amount of whitespace at the left
+edge of the block. This command is limited by the amount of text that is
+there; so if there is less than a shift amount of whitespace available, it
+removes what it can.
+
+
+JOINING LINES
+
+The "J" command joins all selected lines together into one line. Thus it
+removes the line breaks. Actually, the line break, leading white space and
+trailing white space is replaced by one space. Two spaces are used after a
+line ending (that can be changed with the 'joinspaces' option).
+ Let's use the example that we got so familiar with now. The result of
+using the "J" command:
+
+ This is a long line short Any other long line ~
+
+The "J" command doesn't require a blockwise selection. It works with "v" and
+"V" selection in exactly the same way.
+
+If you don't want the white space to be changed, use the "gJ" command.
+
+==============================================================================
+*10.6* Reading and writing part of a file
+
+When you are writing an e-mail message, you may want to include another file.
+This can be done with the ":read {filename}" command. The text of the file is
+put below the cursor line.
+ Starting with this text:
+
+ Hi John, ~
+ Here is the diff that fixes the bug: ~
+ Bye, Pierre. ~
+
+Move the cursor to the second line and type: >
+
+ :read patch
+
+The file named "patch" will be inserted, with this result:
+
+ Hi John, ~
+ Here is the diff that fixes the bug: ~
+ 2c2 ~
+ < for (i = 0; i <= length; ++i) ~
+ --- ~
+ > for (i = 0; i < length; ++i) ~
+ Bye, Pierre. ~
+
+The ":read" command accepts a range. The file will be put below the last line
+number of this range. Thus ":$r patch" appends the file "patch" at the end of
+the file.
+ What if you want to read the file above the first line? This can be done
+with the line number zero. This line doesn't really exist, you will get an
+error message when using it with most commands. But this command is allowed:
+>
+ :0read patch
+
+The file "patch" will be put above the first line of the file.
+
+
+WRITING A RANGE OF LINES
+
+To write a range of lines to a file, the ":write" command can be used.
+Without a range it writes the whole file. With a range only the specified
+lines are written: >
+
+ :.,$write tempo
+
+This writes the lines from the cursor until the end of the file into the file
+"tempo". If this file already exists you will get an error message. Vim
+protects you from accidentally overwriting an existing file. If you know what
+you are doing and want to overwrite the file, append !: >
+
+ :.,$write! tempo
+
+CAREFUL: The ! must follow the ":write" command immediately, without white
+space. Otherwise it becomes a filter command, which is explained later in
+this chapter.
+
+
+APPENDING TO A FILE
+
+In the first section of this chapter was explained how to collect a number of
+lines into a register. The same can be done to collect lines in a file.
+Write the first line with this command: >
+
+ :.write collection
+
+Now move the cursor to the second line you want to collect, and type this: >
+
+ :.write >>collection
+
+The ">>" tells Vim the "collection" file is not to be written as a new file,
+but the line must be appended at the end. You can repeat this as many times
+as you like.
+
+==============================================================================
+*10.7* Formatting text
+
+When you are typing plain text, it's nice if the length of each line is
+automatically trimmed to fit in the window. To make this happen while
+inserting text, set the 'textwidth' option: >
+
+ :set textwidth=72
+
+You might remember that in the example vimrc file this command was used for
+every text file. Thus if you are using that vimrc file, you were already
+using it. To check the current value of 'textwidth': >
+
+ :set textwidth
+
+Now lines will be broken to take only up to 72 characters. But when you
+insert text halfway through a line, or when you delete a few words, the lines
+will get too long or too short. Vim doesn't automatically reformat the text.
+ To tell Vim to format the current paragraph: >
+
+ gqap
+
+This starts with the "gq" command, which is an operator. Following is "ap",
+the text object that stands for "a paragraph". A paragraph is separated from
+the next paragraph by an empty line.
+
+ Note:
+ A blank line, which contains white space, does NOT separate
+ paragraphs. This is hard to notice!
+
+Instead of "ap" you could use any motion or text object. If your paragraphs
+are properly separated, you can use this command to format the whole file: >
+
+ gggqG
+
+"gg" takes you to the first line, "gq" is the format operator and "G" the
+motion that jumps to the last line.
+
+In case your paragraphs aren't clearly defined, you can format just the lines
+you manually select. Move the cursor to the first line you want to format.
+Start with the command "gqj". This formats the current line and the one below
+it. If the first line was short, words from the next line will be appended.
+If it was too long, words will be moved to the next line. The cursor moves to
+the second line. Now you can use "." to repeat the command. Keep doing this
+until you are at the end of the text you want to format.
+
+==============================================================================
+*10.8* Changing case
+
+You have text with section headers in lowercase. You want to make the word
+"section" all uppercase. Do this with the "gU" operator. Start with the
+cursor in the first column: >
+
+ gUw
+< section header ----> SECTION header
+
+The "gu" operator does exactly the opposite: >
+
+ guw
+< SECTION header ----> section header
+
+You can also use "g~" to swap case. All these are operators, thus they work
+with any motion command, with text objects and in Visual mode.
+ To make an operator work on lines you double it. The delete operator is
+"d", thus to delete a line you use "dd". Similarly, "gugu" makes a whole line
+lowercase. This can be shortened to "guu". "gUgU" is shortened to "gUU" and
+"g~g~" to "g~~". Example: >
+
+ g~~
+< Some GIRLS have Fun ----> sOME girls HAVE fUN ~
+
+==============================================================================
+*10.9* Using an external program
+
+Vim has a very powerful set of commands, it can do anything. But there may
+still be something that an external command can do better or faster.
+ The command "!{motion}{program}" takes a block of text and filters it
+through an external program. In other words, it runs the system command
+represented by {program}, giving it the block of text represented by {motion}
+as input. The output of this command then replaces the selected block.
+ Because this summarizes badly if you are unfamiliar with UNIX filters, take
+a look at an example. The sort command sorts a file. If you execute the
+following command, the unsorted file input.txt will be sorted and written to
+output.txt. (This works on both UNIX and Microsoft Windows.) >
+
+ sort <input.txt >output.txt
+
+Now do the same thing in Vim. You want to sort lines 1 through 5 of a file.
+You start by putting the cursor on line 1. Next you execute the following
+command: >
+
+ !5G
+
+The "!" tells Vim that you are performing a filter operation. The Vim editor
+expects a motion command to follow, indicating which part of the file to
+filter. The "5G" command tells Vim to go to line 5, so it now knows that it
+is to filter lines 1 (the current line) through 5.
+ In anticipation of the filtering, the cursor drops to the bottom of the
+screen and a ! prompt displays. You can now type in the name of the filter
+program, in this case "sort". Therefore, your full command is as follows: >
+
+ !5Gsort<Enter>
+
+The result is that the sort program is run on the first 5 lines. The output
+of the program replaces these lines.
+
+ line 55 line 11
+ line 33 line 22
+ line 11 --> line 33
+ line 22 line 44
+ line 44 line 55
+ last line last line
+
+The "!!" command filters the current line through a filter. In Unix the "date"
+command prints the current time and date. "!!date<Enter>" replaces the current
+line with the output of "date". This is useful to add a timestamp to a file.
+
+
+WHEN IT DOESN'T WORK
+
+Starting a shell, sending it text and capturing the output requires that Vim
+knows how the shell works exactly. When you have problems with filtering,
+check the values of these options:
+
+ 'shell' specifies the program that Vim uses to execute
+ external programs.
+ 'shellcmdflag' argument to pass a command to the shell
+ 'shellquote' quote to be used around the command
+ 'shellxquote' quote to be used around the command and redirection
+ 'shelltype' kind of shell (only for the Amiga)
+ 'shellslash' use forward slashes in the command (only for
+ MS-Windows and alikes)
+ 'shellredir' string used to write the command output into a file
+
+On Unix this is hardly ever a problem, because there are two kinds of shells:
+"sh" like and "csh" like. Vim checks the 'shell' option and sets related
+options automatically, depending on whether it sees "csh" somewhere in
+'shell'.
+ On MS-Windows, however, there are many different shells and you might have
+to tune the options to make filtering work. Check the help for the options
+for more information.
+
+
+READING COMMAND OUTPUT
+
+To read the contents of the current directory into the file, use this:
+
+on Unix: >
+ :read !ls
+on MS-Windows: >
+ :read !dir
+
+The output of the "ls" or "dir" command is captured and inserted in the text,
+below the cursor. This is similar to reading a file, except that the "!" is
+used to tell Vim that a command follows.
+ The command may have arguments. And a range can be used to tell where Vim
+should put the lines: >
+
+ :0read !date -u
+
+This inserts the current time and date in UTC format at the top of the file.
+(Well, if you have a date command that accepts the "-u" argument.) Note the
+difference with using "!!date": that replaced a line, while ":read !date" will
+insert a line.
+
+
+WRITING TEXT TO A COMMAND
+
+The Unix command "wc" counts words. To count the words in the current file: >
+
+ :write !wc
+
+This is the same write command as before, but instead of a file name the "!"
+character is used and the name of an external command. The written text will
+be passed to the specified command as its standard input. The output could
+look like this:
+
+ 4 47 249 ~
+
+The "wc" command isn't verbose. This means you have 4 lines, 47 words and 249
+characters.
+
+Watch out for this mistake: >
+
+ :write! wc
+
+This will write the file "wc" in the current directory, with force. White
+space is important here!
+
+
+REDRAWING THE SCREEN
+
+If the external command produced an error message, the display may have been
+messed up. Vim is very efficient and only redraws those parts of the screen
+that it knows need redrawing. But it can't know about what another program
+has written. To tell Vim to redraw the screen: >
+
+ CTRL-L
+
+==============================================================================
+
+Next chapter: |usr_11.txt| Recovering from a crash
+
+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
new file mode 100644
index 0000000..3a61082
--- /dev/null
+++ b/runtime/doc/usr_11.txt
@@ -0,0 +1,318 @@
+*usr_11.txt* For Vim version 9.0. Last change: 2020 Oct 25
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Recovering from a crash
+
+
+Did your computer crash? And you just spent hours editing? Don't panic! Vim
+stores enough information to be able to restore most of your work. This
+chapter shows you how to get your work back and explains how the swap file is
+used.
+
+|11.1| Basic recovery
+|11.2| Where is the swap file?
+|11.3| Crashed or not?
+|11.4| Further reading
+
+ Next chapter: |usr_12.txt| Clever tricks
+ Previous chapter: |usr_10.txt| Making big changes
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*11.1* Basic recovery
+
+In most cases recovering a file is quite simple, assuming you know which file
+you were editing (and the harddisk is still working). Start Vim on the file,
+with the "-r" argument added: >
+
+ vim -r help.txt
+
+Vim will read the swap file (used to store text you were editing) and may read
+bits and pieces of the original file. If Vim recovered your changes you will
+see these messages (with different file names, of course):
+
+ Using swap file ".help.txt.swp" ~
+ Original file "~/vim/runtime/doc/help.txt" ~
+ Recovery completed. You should check if everything is OK. ~
+ (You might want to write out this file under another name ~
+ and run diff with the original file to check for changes) ~
+ You may want to delete the .swp file now. ~
+
+To be on the safe side, write this file under another name: >
+
+ :write help.txt.recovered
+
+Compare the file with the original file to check if you ended up with what you
+expected. Vimdiff is very useful for this |08.7|. For example: >
+
+ :write help.txt.recovered
+ :edit #
+ :diffsp help.txt
+
+Watch out for the original file to contain a more recent version (you saved
+the file just before the computer crashed). And check that no lines are
+missing (something went wrong that Vim could not recover).
+ If Vim produces warning messages when recovering, read them carefully.
+This is rare though.
+
+If the recovery resulted in text that is exactly the same as the file
+contents, you will get this message:
+
+ Using swap file ".help.txt.swp" ~
+ Original file "~/vim/runtime/doc/help.txt" ~
+ Recovery completed. Buffer contents equals file contents. ~
+ You may want to delete the .swp file now. ~
+
+This usually happens if you already recovered your changes, or you wrote the
+file after making changes. It is safe to delete the swap file now.
+
+It is normal that the last few changes can not be recovered. Vim flushes the
+changes to disk when you don't type for about four seconds, or after typing
+about two hundred characters. This is set with the 'updatetime' and
+'updatecount' options. Thus when Vim didn't get a chance to save itself when
+the system went down, the changes after the last flush will be lost.
+
+If you were editing without a file name, give an empty string as argument: >
+
+ vim -r ""
+
+You must be in the right directory, otherwise Vim can't find the swap file.
+
+==============================================================================
+*11.2* Where is the swap file?
+
+Vim can store the swap file in several places. Normally it is in the same
+directory as the original file. To find it, change to the directory of the
+file, and use: >
+
+ vim -r
+
+Vim will list the swap files that it can find. It will also look in other
+directories where the swap file for files in the current directory may be
+located. It will not find swap files in any other directories though, it
+doesn't search the directory tree.
+ The output could look like this:
+
+ Swap files found: ~
+ In current directory: ~
+ 1. .main.c.swp ~
+ owned by: mool dated: Tue May 29 21:00:25 2001 ~
+ file name: ~mool/vim/vim6/src/main.c ~
+ modified: YES ~
+ user name: mool host name: masaka.moolenaar.net ~
+ process ID: 12525 ~
+ In directory ~/tmp: ~
+ -- none -- ~
+ In directory /var/tmp: ~
+ -- none -- ~
+ In directory /tmp: ~
+ -- none -- ~
+
+If there are several swap files that look like they may be the one you want to
+use, a list is given of these swap files and you are requested to enter the
+number of the one you want to use. Carefully look at the dates to decide
+which one you want to use.
+ In case you don't know which one to use, just try them one by one and check
+the resulting files if they are what you expected.
+
+
+USING A SPECIFIC SWAP FILE
+
+If you know which swap file needs to be used, you can recover by giving the
+swap file name. Vim will then find out the name of the original file from
+the swap file.
+
+Example: >
+ vim -r .help.txt.swo
+
+This is also handy when the swap file is in another directory than expected.
+Vim recognizes files with the pattern *.s[uvw][a-z] as swap files.
+
+If this still does not work, see what file names Vim reports and rename the
+files accordingly. Check the 'directory' option to see where Vim may have
+put the swap file.
+
+ Note:
+ Vim tries to find the swap file by searching the directories in the
+ 'dir' option, looking for files that match "filename.sw?". If
+ wildcard expansion doesn't work (e.g., when the 'shell' option is
+ invalid), Vim does a desperate try to find the file "filename.swp".
+ If that fails too, you will have to give the name of the swapfile
+ itself to be able to recover the file.
+
+==============================================================================
+*11.3* Crashed or not? *ATTENTION* *E325*
+
+Vim tries to protect you from doing stupid things. Suppose you innocently
+start editing a file, expecting the contents of the file to show up. Instead,
+Vim produces a very long message:
+
+ E325: ATTENTION ~
+ Found a swap file by the name ".main.c.swp" ~
+ owned by: mool dated: Tue May 29 21:09:28 2001 ~
+ file name: ~mool/vim/vim6/src/main.c ~
+ modified: no ~
+ user name: mool host name: masaka.moolenaar.net ~
+ process ID: 12559 (still running) ~
+ While opening file "main.c" ~
+ dated: Tue May 29 19:46:12 2001 ~
+ ~
+ (1) Another program may be editing the same file. ~
+ If this is the case, be careful not to end up with two ~
+ different instances of the same file when making changes. ~
+ Quit, or continue with caution. ~
+ ~
+ (2) An edit session for this file crashed. ~
+ If this is the case, use ":recover" or "vim -r main.c" ~
+ to recover the changes (see ":help recovery"). ~
+ If you did this already, delete the swap file ".main.c.swp" ~
+ to avoid this message. ~
+
+You get this message, because, when starting to edit a file, Vim checks if a
+swap file already exists for that file. If there is one, there must be
+something wrong. It may be one of these two situations.
+
+1. Another edit session is active on this file. Look in the message for the
+ line with "process ID". It might look like this:
+
+ process ID: 12559 (still running) ~
+
+ The text "(still running)" indicates that the process editing this file
+ runs on the same computer. When working on a non-Unix system you will not
+ get this extra hint. When editing a file over a network, you may not see
+ the hint, because the process might be running on another computer. In
+ those two cases you must find out what the situation is yourself.
+ If there is another Vim editing the same file, continuing to edit will
+ result in two versions of the same file. The one that is written last will
+ overwrite the other one, resulting in loss of changes. You better quit
+ this Vim.
+
+2. The swap file might be the result from a previous crash of Vim or the
+ computer. Check the dates mentioned in the message. If the date of the
+ swap file is newer than the file you were editing, and this line appears:
+
+ modified: YES ~
+
+ Then you very likely have a crashed edit session that is worth recovering.
+ If the date of the file is newer than the date of the swap file, then
+ either it was changed after the crash (perhaps you recovered it earlier,
+ but didn't delete the swap file?), or else the file was saved before the
+ crash but after the last write of the swap file (then you're lucky: you
+ don't even need that old swap file). Vim will warn you for this with this
+ extra line:
+
+ NEWER than swap file! ~
+
+
+NOTE that in the following situation Vim knows the swap file is not useful and
+will automatically delete it:
+- The file is a valid swap file (Magic number is correct).
+- The flag that the file was modified is not set.
+- The process is not running.
+
+You can programmatically deal with this situation with the |FileChangedShell|
+autocommand event.
+
+
+UNREADABLE SWAP FILE ~
+
+Sometimes the line
+
+ [cannot be read] ~
+
+will appear under the name of the swap file. This can be good or bad,
+depending on circumstances.
+
+It is good if a previous editing session crashed without having made any
+changes to the file. Then a directory listing of the swap file will show
+that it has zero bytes. You may delete it and proceed.
+
+It is slightly bad if you don't have read permission for the swap file. You
+may want to view the file read-only, or quit. On multi-user systems, if you
+yourself did the last changes under a different login name, a logout
+followed by a login under that other name might cure the "read error". Or
+else you might want to find out who last edited (or is editing) the file and
+have a talk with them.
+
+It is very bad if it means there is a physical read error on the disk
+containing the swap file. Fortunately, this almost never happens.
+You may want to view the file read-only at first (if you can), to see the
+extent of the changes that were "forgotten". If you are the one in charge of
+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 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: ~
+
+O Open the file readonly. Use this when you just want to view the file and
+ don't need to recover it. You might want to use this when you know someone
+ else is editing the file, but you just want to look in it and not make
+ changes.
+
+E Edit the file anyway. Use this with caution! If the file is being edited
+ in another Vim, you might end up with two versions of the file. Vim will
+ try to warn you when this happens, but better be safe than sorry.
+
+R Recover the file from the swap file. Use this if you know that the swap
+ file contains changes that you want to recover.
+
+Q Quit. This avoids starting to edit the file. Use this if there is another
+ Vim editing the same file.
+ When you just started Vim, this will exit Vim. When starting Vim with
+ files in several windows, Vim quits only if there is a swap file for the
+ first one. When using an edit command, the file will not be loaded and you
+ are taken back to the previously edited file.
+
+A Abort. Like Quit, but also abort further commands. This is useful when
+ loading a script that edits several files, such as a session with multiple
+ windows.
+
+D Delete the swap file. Use this when you are sure you no longer need it.
+ For example, when it doesn't contain changes, or when the file itself is
+ newer than the swap file.
+ On Unix this choice is only offered when the process that created the
+ swap file does not appear to be running.
+
+If you do not get the dialog (you are running a version of Vim that does not
+support it), you will have to do it manually. To recover the file, use this
+command: >
+
+ :recover
+
+
+Vim cannot always detect that a swap file already exists for a file. This is
+the case when the other edit session puts the swap files in another directory
+or when the path name for the file is different when editing it on different
+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 remarks about encryption and the swap file, see |:recover-crypt|.
+For programmatic access to the swap file, see |swapinfo()|.
+
+==============================================================================
+*11.4* Further reading
+
+|swap-file| An explanation about where the swap file will be created and
+ what its name is.
+|:preserve| Manually flushing the swap file to disk.
+|:swapname| See the name of the swap file for the current file.
+'updatecount' Number of key strokes after which the swap file is flushed to
+ disk.
+'updatetime' Timeout after which the swap file is flushed to disk.
+'swapsync' Whether the disk is synced when the swap file is flushed.
+'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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_12.txt b/runtime/doc/usr_12.txt
new file mode 100644
index 0000000..a5f75ec
--- /dev/null
+++ b/runtime/doc/usr_12.txt
@@ -0,0 +1,358 @@
+*usr_12.txt* For Vim version 9.0. Last change: 2022 Nov 19
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Clever tricks
+
+
+By combining several commands you can make Vim do nearly everything. In this
+chapter a number of useful combinations will be presented. This uses the
+commands introduced in the previous chapters and a few more.
+
+|12.1| Replace a word
+|12.2| Change "Last, First" to "First Last"
+|12.3| Sort a list
+|12.4| Reverse line order
+|12.5| Count words
+|12.6| Find a man page
+|12.7| Trim blanks
+|12.8| Find where a word is used
+
+ Next chapter: |usr_20.txt| Typing command-line commands quickly
+ Previous chapter: |usr_11.txt| Recovering from a crash
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*12.1* Replace a word
+
+The substitute command can be used to replace all occurrences of a word with
+another word: >
+
+ :%s/four/4/g
+
+The "%" range means to replace in all lines. The "g" flag at the end causes
+all words in a line to be replaced.
+ This will not do the right thing if your file also contains "thirtyfour".
+It would be replaced with "thirty4". To avoid this, use the "\<" item to
+match the start of a word: >
+
+ :%s/\<four/4/g
+
+Obviously, this still goes wrong on "fourteen". Use "\>" to match the end of
+a word: >
+
+ :%s/\<four\>/4/g
+
+If you are programming, you might want to replace "four" in comments, but not
+in the code. Since this is difficult to specify, add the "c" flag to have the
+substitute command prompt you for each replacement: >
+
+
+ :%s/\<four\>/4/gc
+
+
+REPLACING IN SEVERAL FILES
+
+Suppose you want to replace a word in more than one file. You could edit each
+file and type the command manually. It's a lot faster to use record and
+playback.
+ Let's assume you have a directory with C++ files, all ending in ".cpp".
+There is a function called "GetResp" that you want to rename to "GetAnswer".
+
+ vim *.cpp Start Vim, defining the argument list to
+ contain all the C++ files. You are now in the
+ first file.
+ qq Start recording into the q register
+ :%s/\<GetResp\>/GetAnswer/g
+ Do the replacements in the first file.
+ :wnext Write this file and move to the next one.
+ q Stop recording.
+ @q Execute the q register. This will replay the
+ substitution and ":wnext". You can verify
+ that this doesn't produce an error message.
+ 999@q Execute the q register on the remaining files.
+
+At the last file you will get an error message, because ":wnext" cannot move
+to the next file. This stops the execution, and everything is done.
+
+ Note:
+ When playing back a recorded sequence, an error stops the execution.
+ Therefore, make sure you don't get an error message when recording.
+
+There is one catch: If one of the .cpp files does not contain the word
+"GetResp", you will get an error and replacing will stop. To avoid this, add
+the "e" flag to the substitute command: >
+
+ :%s/\<GetResp\>/GetAnswer/ge
+
+The "e" flag tells ":substitute" that not finding a match is not an error.
+
+==============================================================================
+*12.2* Change "Last, First" to "First Last"
+
+You have a list of names in this form:
+
+ Doe, John ~
+ Smith, Peter ~
+
+You want to change that to:
+
+ John Doe ~
+ Peter Smith ~
+
+This can be done with just one command: >
+
+ :%s/\([^,]*\), \(.*\)/\2 \1/
+
+Let's break this down in parts. Obviously it starts with a substitute
+command. The "%" is the line range, which stands for the whole file. Thus
+the substitution is done in every line in the file.
+ The arguments for the substitute command are "/from/to/". The slashes
+separate the "from" pattern and the "to" string. This is what the "from"
+pattern contains:
+ \([^,]*\), \(.*\) ~
+
+ The first part between \( \) matches "Last" \( \)
+ match anything but a comma [^,]
+ any number of times *
+ matches ", " literally ,
+ The second part between \( \) matches "First" \( \)
+ any character .
+ any number of times *
+
+In the "to" part we have "\2" and "\1". These are called backreferences.
+They refer to the text matched by the "\( \)" parts in the pattern. "\2"
+refers to the text matched by the second "\( \)", which is the "First" name.
+"\1" refers to the first "\( \)", which is the "Last" name.
+ You can use up to nine backreferences in the "to" part of a substitute
+command. "\0" stands for the whole matched pattern. There are a few more
+special items in a substitute command, see |sub-replace-special|.
+
+==============================================================================
+*12.3* Sort a list
+
+In a Makefile you often have a list of files. For example:
+
+ OBJS = \ ~
+ version.o \ ~
+ pch.o \ ~
+ getopt.o \ ~
+ util.o \ ~
+ getopt1.o \ ~
+ inp.o \ ~
+ patch.o \ ~
+ backup.o ~
+
+To sort this list, filter the text through the external sort command: >
+
+ /^OBJS
+ j
+ :.,/^$/-1!sort
+
+This goes to the first line, where "OBJS" is the first thing in the line.
+Then it goes one line down and filters the lines until the next empty line.
+You could also select the lines in Visual mode and then use "!sort". That's
+easier to type, but more work when there are many lines.
+ The result is this:
+
+ OBJS = \ ~
+ backup.o ~
+ getopt.o \ ~
+ getopt1.o \ ~
+ inp.o \ ~
+ patch.o \ ~
+ pch.o \ ~
+ util.o \ ~
+ version.o \ ~
+
+
+Notice that a backslash at the end of each line is used to indicate the line
+continues. After sorting, this is wrong! The "backup.o" line that was at
+the end didn't have a backslash. Now that it sorts to another place, it
+must have a backslash.
+ The simplest solution is to add the backslash with "A \<Esc>". You can
+keep the backslash in the last line, if you make sure an empty line comes
+after it. That way you don't have this problem again.
+
+==============================================================================
+*12.4* Reverse line order
+
+The |:global| command can be combined with the |:move| command to move all the
+lines before the first line, resulting in a reversed file. The command is: >
+
+ :global/^/move 0
+
+Abbreviated: >
+
+ :g/^/m 0
+
+The "^" regular expression matches the beginning of the line (even if the line
+is blank). The |:move| command moves the matching line to after the imaginary
+zeroth line, so the current matching line becomes the first line of the file.
+As the |:global| command is not confused by the changing line numbering,
+|:global| proceeds to match all remaining lines of the file and puts each as
+the first.
+
+This also works on a range of lines. First move to above the first line and
+mark it with "mt". Then move the cursor to the last line in the range and
+type: >
+
+ :'t+1,.g/^/m 't
+
+==============================================================================
+*12.5* Count words
+
+Sometimes you have to write a text with a maximum number of words. Vim can
+count the words for you.
+ When the whole file is what you want to count the words in, use this
+command: >
+
+ g CTRL-G
+
+Do not type a space after the g, this is just used here to make the command
+easy to read.
+ The output looks like this:
+
+ Col 1 of 0; Line 141 of 157; Word 748 of 774; Byte 4489 of 4976 ~
+
+You can see on which word you are (748), and the total number of words in the
+file (774).
+
+When the text is only part of a file, you could move to the start of the text,
+type "g CTRL-G", move to the end of the text, type "g CTRL-G" again, and then
+use your brain to compute the difference in the word position. That's a good
+exercise, but there is an easier way. With Visual mode, select the text you
+want to count words in. Then type g CTRL-G. The result:
+
+ Selected 5 of 293 Lines; 70 of 1884 Words; 359 of 10928 Bytes ~
+
+For other ways to count words, lines and other items, see |count-items|.
+
+==============================================================================
+*12.6* Find a man page *find-manpage*
+
+While editing a shell script or C program, you are using a command or function
+that you want to find the man page for (this is on Unix). Let's first use a
+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: >
+
+ :Man csh
+
+You can scroll around and the text is highlighted. This allows you to find
+the help you were looking for. Use CTRL-W w to jump to the window with the
+text you were working on.
+ To find a man page in a specific section, put the section number first.
+For example, to look in section 3 for "echo": >
+
+ :Man 3 echo
+
+To jump to another man page, which is in the text with the typical form
+"word(1)", press CTRL-] on it. Further ":Man" commands will use the same
+window.
+
+To display a man page for the word under the cursor, use this: >
+
+ \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
+to display the man page for strstr().
+
+==============================================================================
+*12.7* Trim blanks
+
+Some people find spaces and tabs at the end of a line useless, wasteful, and
+ugly. To remove whitespace at the end of every line, execute the following
+command: >
+
+ :%s/\s\+$//
+
+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, see |usr_27.txt|.
+ The "to" part of the substitute command is empty: "//". Thus it replaces
+with nothing, effectively deleting the matched white space.
+
+Another wasteful use of spaces is placing them before a tab. Often these can
+be deleted without changing the amount of white space. But not always!
+Therefore, you can best do this manually. Use this search command: >
+
+ /
+
+You cannot see it, but there is a space before a tab in this command. Thus
+it's "/<Space><Tab>". Now use "x" to delete the space and check that the
+amount of white space doesn't change. You might have to insert a tab if it
+does change. Type "n" to find the next match. Repeat this until no more
+matches can be found.
+
+==============================================================================
+*12.8* Find where a word is used
+
+If you are a UNIX user, you can use a combination of Vim and the grep command
+to edit all the files that contain a given word. This is extremely useful if
+you are working on a program and want to view or edit all the files that
+contain a specific variable.
+ For example, suppose you want to edit all the C program files that contain
+the word "frame_counter". To do this you use the command: >
+
+ vim `grep -l frame_counter *.c`
+
+Let's look at this command in detail. The grep command searches through a set
+of files for a given word. Because the -l argument is specified, the command
+will only list the files containing the word and not print the matching lines.
+The word it is searching for is "frame_counter". Actually, this can be any
+regular expression. (Note: What grep uses for regular expressions is not
+exactly the same as what Vim uses.)
+ The entire command is enclosed in backticks (`). This tells the UNIX shell
+to run this command and pretend that the results were typed on the command
+line. So what happens is that the grep command is run and produces a list of
+files, these files are put on the Vim command line. This results in Vim
+editing the file list that is the output of grep. You can then use commands
+like ":next" and ":first" to browse through the files.
+
+
+FINDING EACH LINE
+
+The above command only finds the files in which the word is found. You still
+have to find the word within the files.
+ Vim has a built-in command that you can use to search a set of files for a
+given string. If you want to find all occurrences of "error_string" in all C
+program files, for example, enter the following command: >
+
+ :grep error_string *.c
+
+This causes Vim to search for the string "error_string" in all the specified
+files (*.c). The editor will now open the first file where a match is found
+and position the cursor on the first matching line. To go to the next
+matching line (no matter in what file it is), use the ":cnext" command. To go
+to the previous match, use the ":cprev" command. Use ":clist" to see all the
+matches and where they are.
+ The ":grep" command uses the external commands grep (on Unix) or findstr
+(on Windows). You can change this by setting the option 'grepprg'.
+
+==============================================================================
+
+Next chapter: |usr_20.txt| Typing command-line commands quickly
+
+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
new file mode 100644
index 0000000..479f57c
--- /dev/null
+++ b/runtime/doc/usr_20.txt
@@ -0,0 +1,384 @@
+*usr_20.txt* For Vim version 9.0. Last change: 2021 Nov 18
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Typing command-line commands quickly
+
+
+Vim has a few generic features that makes it easier to enter commands. Colon
+commands can be abbreviated, edited and repeated. Completion is available for
+nearly everything.
+
+|20.1| Command line editing
+|20.2| Command line abbreviations
+|20.3| Command line completion
+|20.4| Command line history
+|20.5| Command line window
+
+ Next chapter: |usr_21.txt| Go away and come back
+ Previous chapter: |usr_12.txt| Clever tricks
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*20.1* Command line editing
+
+When you use a colon (:) command or search for a string with / or ?, Vim puts
+the cursor on the bottom of the screen. There you type the command or search
+pattern. This is called the Command line. Also when it's used for entering a
+search command.
+
+The most obvious way to edit the command you type is by pressing the <BS> key.
+This erases the character before the cursor. To erase another character,
+typed earlier, first move the cursor with the cursor keys.
+ For example, you have typed this: >
+
+ :s/col/pig/
+
+Before you hit <Enter>, you notice that "col" should be "cow". To correct
+this, you type <Left> five times. The cursor is now just after "col". Type
+<BS> and "w" to correct: >
+
+ :s/cow/pig/
+
+Now you can press <Enter> directly. You don't have to move the cursor to the
+end of the line before executing the command.
+
+The most often used keys to move around in the command line:
+
+ <Left> one character left
+ <Right> one character right
+ <S-Left> or <C-Left> one word left
+ <S-Right> or <C-Right> one word right
+ CTRL-B or <Home> to begin of command line
+ CTRL-E or <End> to end of command line
+
+ Note:
+ <S-Left> (cursor left key with Shift key pressed) and <C-Left> (cursor
+ left key with Control pressed) will not work on all keyboards. Same
+ for the other Shift and Control combinations.
+
+You can also use the mouse to move the cursor.
+
+
+DELETING
+
+As mentioned, <BS> deletes the character before the cursor. To delete a whole
+word use CTRL-W.
+
+ /the fine pig ~
+
+ CTRL-W
+
+ /the fine ~
+
+CTRL-U removes all text, thus allows you to start all over again.
+
+
+OVERSTRIKE
+
+The <Insert> key toggles between inserting characters and replacing the
+existing ones. Start with this text:
+
+ /the fine pig ~
+
+Move the cursor to the start of "fine" with <S-Left> twice (or <Left> eight
+times, if <S-Left> doesn't work). Now press <Insert> to switch to overstrike
+and type "great":
+
+ /the greatpig ~
+
+Oops, we lost the space. Now, don't use <BS>, because it would delete the
+"t" (this is different from Replace mode). Instead, press <Insert> to switch
+from overstrike to inserting, and type the space:
+
+ /the great pig ~
+
+
+CANCELLING
+
+You thought of executing a : or / command, but changed your mind. To get rid
+of what you already typed, without executing it, press CTRL-C or <Esc>.
+
+ Note:
+ <Esc> is the universal "get out" key. Unfortunately, in the good old
+ Vi pressing <Esc> in a command line executed the command! Since that
+ might be considered to be a bug, Vim uses <Esc> to cancel the command.
+ But with the 'cpoptions' option it can be made Vi compatible. And
+ when using a mapping (which might be written for Vi) <Esc> also works
+ Vi compatible. Therefore, using CTRL-C is a method that always works.
+
+If you are at the start of the command line, pressing <BS> will cancel the
+command. It's like deleting the ":" or "/" that the line starts with.
+
+==============================================================================
+*20.2* Command line abbreviations
+
+Some of the ":" commands are really long. We already mentioned that
+":substitute" can be abbreviated to ":s". This is a generic mechanism, all
+":" commands can be abbreviated.
+
+How short can a command get? There are 26 letters, and many more commands.
+For example, ":set" also starts with ":s", but ":s" doesn't start a ":set"
+command. Instead ":set" can be abbreviated to ":se".
+ When the shorter form of a command could be used for two commands, it
+stands for only one of them. There is no logic behind which one, you have to
+learn them. In the help files the shortest form that works is mentioned. For
+example: >
+
+ :s[ubstitute]
+
+This means that the shortest form of ":substitute" is ":s". The following
+characters are optional. Thus ":su" and ":sub" also work.
+
+In the user manual we will either use the full name of command, or a short
+version that is still readable. For example, ":function" can be abbreviated
+to ":fu". But since most people don't understand what that stands for, we
+will use ":fun". (Vim doesn't have a ":funny" command, otherwise ":fun" would
+be confusing too.)
+
+It is recommended that in Vim scripts you write the full command name. That
+makes it easier to read back when you make later changes. Except for some
+often used commands like ":w" (":write") and ":r" (":read").
+ A particularly confusing one is ":end", which could stand for ":endif",
+":endwhile" or ":endfunction". Therefore, always use the full name.
+
+
+SHORT OPTION NAMES
+
+In the user manual the long version of the option names is used. Many options
+also have a short name. Unlike ":" commands, there is only one short name
+that works. For example, the short name of 'autoindent' is 'ai'. Thus these
+two commands do the same thing: >
+
+ :set autoindent
+ :set ai
+
+You can find the full list of long and short names here: |option-list|.
+
+==============================================================================
+*20.3* Command line completion
+
+This is one of those Vim features that, by itself, is a reason to switch from
+Vi to Vim. Once you have used this, you can't do without.
+
+Suppose you have a directory that contains these files:
+
+ info.txt
+ intro.txt
+ bodyofthepaper.txt
+
+To edit the last one, you use the command: >
+
+ :edit bodyofthepaper.txt
+
+It's easy to type this wrong. A much quicker way is: >
+
+ :edit b<Tab>
+
+Which will result in the same command. What happened? The <Tab> key does
+completion of the word before the cursor. In this case "b". Vim looks in the
+directory and finds only one file that starts with a "b". That must be the
+one you are looking for, thus Vim completes the file name for you.
+
+Now type: >
+
+ :edit i<Tab>
+
+Vim will beep, and give you: >
+
+ :edit info.txt
+
+The beep means that Vim has found more than one match. It then uses the first
+match it found (alphabetically). If you press <Tab> again, you get: >
+
+ :edit intro.txt
+
+Thus, if the first <Tab> doesn't give you the file you were looking for, press
+it again. If there are more matches, you will see them all, one at a time.
+ If you press <Tab> on the last matching entry, you will go back to what you
+first typed: >
+
+ :edit i
+
+Then it starts all over again. Thus Vim cycles through the list of matches.
+Use CTRL-P to go through the list in the other direction:
+
+ <------------------- <Tab> -------------------------+
+ |
+ <Tab> --> <Tab> -->
+ :edit i :edit info.txt :edit intro.txt
+ <-- CTRL-P <-- CTRL-P
+ |
+ +---------------------- CTRL-P ------------------------>
+
+
+CONTEXT
+
+When you type ":set i" instead of ":edit i" and press <Tab> you get: >
+
+ :set icon
+
+Hey, why didn't you get ":set info.txt"? That's because Vim has context
+sensitive completion. The kind of words Vim will look for depends on the
+command before it. Vim knows that you cannot use a file name just after a
+":set" command, but you can use an option name.
+ Again, if you repeat typing the <Tab>, Vim will cycle through all matches.
+There are quite a few, it's better to type more characters first: >
+
+ :set isk<Tab>
+
+Gives: >
+
+ :set iskeyword
+
+Now type "=" and press <Tab>: >
+
+ :set iskeyword=@,48-57,_,192-255
+
+What happens here is that Vim inserts the old value of the option. Now you
+can edit it.
+ What is completed with <Tab> is what Vim expects in that place. Just try
+it out to see how it works. In some situations you will not get what you
+want. That's either because Vim doesn't know what you want, or because
+completion was not implemented for that situation. In that case you will get
+a <Tab> inserted (displayed as ^I).
+
+
+LIST MATCHES
+
+When there are many matches, you would like to see an overview. Do this by
+pressing CTRL-D. For example, pressing CTRL-D after: >
+
+ :set is
+
+results in: >
+
+ :set is
+ incsearch isfname isident iskeyword isprint
+ :set is
+
+Vim lists the matches and then comes back with the text you typed. You can
+now check the list for the item you wanted. If it isn't there, you can use
+<BS> to correct the word. If there are many matches, type a few more
+characters before pressing <Tab> to complete the rest.
+ If you have watched carefully, you will have noticed that "incsearch"
+doesn't start with "is". In this case "is" stands for the short name of
+"incsearch". (Many options have a short and a long name.) Vim is clever
+enough to know that you might have wanted to expand the short name of the
+option into the long name.
+
+
+THERE IS MORE
+
+The CTRL-L command completes the word to the longest unambiguous string. If
+you type ":edit i" and there are files "info.txt" and "info_backup.txt" you
+will get ":edit info".
+
+The 'wildmode' option can be used to change the way completion works.
+The 'wildmenu' option can be used to get a menu-like list of matches.
+Use the 'suffixes' option to specify files that are less important and appear
+at the end of the list of files.
+The 'wildignore' option specifies files that are not listed at all.
+
+More about all of this here: |cmdline-completion|
+
+==============================================================================
+*20.4* Command line history
+
+In chapter 3 we briefly mentioned the history. The basics are that you can
+use the <Up> key to recall an older command line. <Down> then takes you back
+to newer commands.
+
+There are actually five histories. The ones we will mention here are for ":"
+commands and for "/" and "?" search commands. The "/" and "?" commands share
+the same history, because they are both search commands. The three other
+histories are for expressions, debug mode commands and input lines for the
+input() function. |cmdline-history|
+
+Suppose you have done a ":set" command, typed ten more colon commands and then
+want to repeat that ":set" command again. You could press ":" and then ten
+times <Up>. There is a quicker way: >
+
+ :se<Up>
+
+Vim will now go back to the previous command that started with "se". You have
+a good chance that this is the ":set" command you were looking for. At least
+you should not have to press <Up> very often (unless ":set" commands is all
+you have done).
+
+The <Up> key will use the text typed so far and compare it with the lines in
+the history. Only matching lines will be used.
+ If you do not find the line you were looking for, use <Down> to go back to
+what you typed and correct that. Or use CTRL-U to start all over again.
+
+To see all the lines in the history: >
+
+ :history
+
+That's the history of ":" commands. The search history is displayed with this
+command: >
+
+ :history /
+
+CTRL-P will work like <Up>, except that it doesn't matter what you already
+typed. Similarly for CTRL-N and <Down>. CTRL-P stands for previous, CTRL-N
+for next.
+
+==============================================================================
+*20.5* Command line window
+
+Typing the text in the command line works differently from typing text in
+Insert mode. It doesn't allow many commands to change the text. For most
+commands that's OK, but sometimes you have to type a complicated command.
+That's where the command line window is useful.
+
+Open the command line window with this command: >
+
+ q:
+
+Vim now opens a (small) window at the bottom. It contains the command line
+history, and an empty line at the end:
+
+ +-------------------------------------+
+ |other window |
+ |~ |
+ |file.txt=============================|
+ |:e c |
+ |:e config.h.in |
+ |:set path=.,/usr/include,, |
+ |:set iskeyword=@,48-57,_,192-255 |
+ |:set is |
+ |:q |
+ |: |
+ |command-line=========================|
+ | |
+ +-------------------------------------+
+
+You are now in Normal mode. You can use the "hjkl" keys to move around. For
+example, move up with "5k" to the ":e config.h.in" line. Type "$h" to go to
+the "i" of "in" and type "cwout". Now you have changed the line to:
+
+ :e config.h.out ~
+
+Now press <Enter> and this command will be executed. The command line window
+will close.
+ The <Enter> command will execute the line under the cursor. It doesn't
+matter whether Vim is in Insert mode or in Normal mode.
+ Changes in the command line window are lost. They do not result in the
+history to be changed. Except that the command you execute will be added to
+the end of the history, like with all executed commands.
+
+The command line window is very useful when you want to have overview of the
+history, lookup a similar command, change it a bit and execute it. A search
+command can be used to find something.
+ In the previous example the "?config" search command could have been used
+to find the previous command that contains "config". It's a bit strange,
+because you are using a command line to search in the command line window.
+While typing that search command you can't open another command line window,
+there can be only one.
+
+==============================================================================
+
+Next chapter: |usr_21.txt| Go away and come back
+
+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
new file mode 100644
index 0000000..2f6ee9c
--- /dev/null
+++ b/runtime/doc/usr_21.txt
@@ -0,0 +1,502 @@
+*usr_21.txt* For Vim version 9.0. Last change: 2019 Apr 25
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Go away and come back
+
+
+This chapter goes into mixing the use of other programs with Vim. Either by
+executing program from inside Vim or by leaving Vim and coming back later.
+Furthermore, this is about the ways to remember the state of Vim and restore
+it later.
+
+|21.1| Suspend and resume
+|21.2| Executing shell commands
+|21.3| Remembering information; viminfo
+|21.4| Sessions
+|21.5| Views
+|21.6| Modelines
+
+ Next chapter: |usr_22.txt| Finding the file to edit
+ Previous chapter: |usr_20.txt| Typing command-line commands quickly
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*21.1* Suspend and resume
+
+Like most Unix programs Vim can be suspended by pressing CTRL-Z. This stops
+Vim and takes you back to the shell it was started in. You can then do any
+other commands until you are bored with them. Then bring back Vim with the
+"fg" command. >
+
+ CTRL-Z
+ {any sequence of shell commands}
+ fg
+
+You are right back where you left Vim, nothing has changed.
+ In case pressing CTRL-Z doesn't work, you can also use ":suspend".
+Don't forget to bring Vim back to the foreground, you would lose any changes
+that you made!
+
+Only Unix has support for this. On other systems Vim will start a shell for
+you. This also has the functionality of being able to execute shell commands.
+But it's a new shell, not the one that you started Vim from.
+ When you are running the GUI you can't go back to the shell where Vim was
+started. CTRL-Z will minimize the Vim window instead.
+
+==============================================================================
+*21.2* Executing shell commands
+
+To execute a single shell command from Vim use ":!{command}". For example, to
+see a directory listing: >
+
+ :!ls
+ :!dir
+
+The first one is for Unix, the second one for MS-Windows.
+ Vim will execute the program. When it ends you will get a prompt to hit
+<Enter>. This allows you to have a look at the output from the command before
+returning to the text you were editing.
+ The "!" is also used in other places where a program is run. Let's take
+a look at an overview:
+
+ :!{program} execute {program}
+ :r !{program} execute {program} and read its output
+ :w !{program} execute {program} and send text to its input
+ :[range]!{program} filter text through {program}
+
+Notice that the presence of a range before "!{program}" makes a big
+difference. Without it executes the program normally, with the range a number
+of text lines is filtered through the program.
+
+Executing a whole row of programs this way is possible. But a shell is much
+better at it. You can start a new shell this way: >
+
+ :shell
+
+This is similar to using CTRL-Z to suspend Vim. The difference is that a new
+shell is started.
+
+When using the GUI the shell will be using the Vim window for its input and
+output. Since Vim is not a terminal emulator, this will not work perfectly.
+If you have trouble, try toggling the 'guipty' option. If this still doesn't
+work well enough, start a new terminal to run the shell in. For example with:
+>
+ :!xterm&
+
+==============================================================================
+*21.3* Remembering information; viminfo
+
+After editing for a while you will have text in registers, marks in various
+files, a command line history filled with carefully crafted commands. When
+you exit Vim all of this is lost. But you can get it back!
+
+The viminfo file is designed to store status information:
+
+ Command-line and Search pattern history
+ Text in registers
+ Marks for various files
+ The buffer list
+ Global variables
+
+Each time you exit Vim it will store this information in a file, the viminfo
+file. When Vim starts again, the viminfo file is read and the information
+restored.
+
+The 'viminfo' option is set by default to restore a limited number of items.
+You might want to set it to remember more information. This is done through
+the following command: >
+
+ :set viminfo=string
+
+The string specifies what to save. The syntax of this string is an option
+character followed by an argument. The option/argument pairs are separated by
+commas.
+ Take a look at how you can build up your own viminfo string. First, the '
+option is used to specify how many files for which you save marks (a-z). Pick
+a nice even number for this option (1000, for instance). Your command now
+looks like this: >
+
+ :set viminfo='1000
+
+The f option controls whether global marks (A-Z and 0-9) are stored. If this
+option is 0, none are stored. If it is 1 or you do not specify an f option,
+the marks are stored. You want this feature, so now you have this: >
+
+ :set viminfo='1000,f1
+
+The < option controls how many lines are saved for each of the registers. By
+default, all the lines are saved. If 0, nothing is saved. To avoid adding
+thousands of lines to your viminfo file (which might never get used and makes
+starting Vim slower) you use a maximum of 500 lines: >
+
+ :set viminfo='1000,f1,<500
+<
+Other options you might want to use:
+ : number of lines to save from the command line history
+ @ number of lines to save from the input line history
+ / number of lines to save from the search history
+ r removable media, for which no marks will be stored (can be
+ used several times)
+ ! global variables that start with an uppercase letter and
+ don't contain lowercase letters
+ h disable 'hlsearch' highlighting when starting
+ % the buffer list (only restored when starting Vim without file
+ arguments)
+ c convert the text using 'encoding'
+ n name used for the viminfo file (must be the last option)
+
+See the 'viminfo' option and |viminfo-file| for more information.
+
+When you run Vim multiple times, the last one exiting will store its
+information. This may cause information that previously exiting Vims stored
+to be lost. Each item can be remembered only once.
+
+
+GETTING BACK TO WHERE YOU STOPPED VIM
+
+You are halfway editing a file and it's time to leave for holidays. You exit
+Vim and go enjoy yourselves, forgetting all about your work. After a couple
+of weeks you start Vim, and type:
+>
+ '0
+
+And you are right back where you left Vim. So you can get on with your work.
+ Vim creates a mark each time you exit Vim. The last one is '0. The
+position that '0 pointed to is made '1. And '1 is made to '2, and so forth.
+Mark '9 is lost.
+ The |:marks| command is useful to find out where '0 to '9 will take you.
+
+
+GETTING BACK TO SOME FILE
+
+If you want to go back to a file that you edited recently, but not when
+exiting Vim, there is a slightly more complicated way. You can see a list of
+files by typing the command: >
+
+ :oldfiles
+< 1: ~/.viminfo ~
+ 2: ~/text/resume.txt ~
+ 3: /tmp/draft ~
+
+Now you would like to edit the second file, which is in the list preceded by
+"2:". You type: >
+
+ :e #<2
+
+Instead of ":e" you can use any command that has a file name argument, the
+"#<2" item works in the same place as "%" (current file name) and "#"
+(alternate file name). So you can also split the window to edit the third
+file: >
+
+ :split #<3
+
+That #<123 thing is a bit complicated when you just want to edit a file.
+Fortunately there is a simpler way: >
+
+ :browse oldfiles
+< 1: ~/.viminfo ~
+ 2: ~/text/resume.txt ~
+ 3: /tmp/draft ~
+ -- More --
+
+You get the same list of files as with |:oldfiles|. If you want to edit
+"resume.txt" first press "q" to stop the listing. You will get a prompt:
+
+ Type number and <Enter> (empty cancels): ~
+
+Type "2" and press <Enter> to edit the second file.
+
+More info at |:oldfiles|, |v:oldfiles| and |c_#<|.
+
+
+MOVE INFO FROM ONE VIM TO ANOTHER
+
+You can use the ":wviminfo" and ":rviminfo" commands to save and restore the
+information while still running Vim. This is useful for exchanging register
+contents between two instances of Vim, for example. In the first Vim do: >
+
+ :wviminfo! ~/tmp/viminfo
+
+And in the second Vim do: >
+
+ :rviminfo! ~/tmp/viminfo
+
+Obviously, the "w" stands for "write" and the "r" for "read".
+ The ! character is used by ":wviminfo" to forcefully overwrite an existing
+file. When it is omitted, and the file exists, the information is merged into
+the file.
+ The ! character used for ":rviminfo" means that all the information is
+used, this may overwrite existing information. Without the ! only information
+that wasn't set is used.
+ These commands can also be used to store info and use it again later. You
+could make a directory full of viminfo files, each containing info for a
+different purpose.
+
+==============================================================================
+*21.4* Sessions
+
+Suppose you are editing along, and it is the end of the day. You want to quit
+work and pick up where you left off the next day. You can do this by saving
+your editing session and restoring it the next day.
+ A Vim session contains all the information about what you are editing.
+This includes things such as the file list, window layout, global variables,
+options and other information. (Exactly what is remembered is controlled by
+the 'sessionoptions' option, described below.)
+ The following command creates a session file: >
+
+ :mksession vimbook.vim
+
+Later if you want to restore this session, you can use this command: >
+
+ :source vimbook.vim
+
+If you want to start Vim and restore a specific session, you can use the
+following command: >
+
+ vim -S vimbook.vim
+
+This tells Vim to read a specific file on startup. The 'S' stands for
+session (actually, you can source any Vim script with -S, thus it might as
+well stand for "source").
+
+The windows that were open are restored, with the same position and size as
+before. Mappings and option values are like before.
+ What exactly is restored depends on the 'sessionoptions' option. The
+default value is:
+"blank,buffers,curdir,folds,help,options,tabpages,winsize,terminal".
+
+ blank keep empty windows
+ buffers all buffers, not only the ones in a window
+ curdir the current directory
+ folds folds, also manually created ones
+ help the help window
+ options all options and mappings
+ tabpages all tab pages
+ winsize window sizes
+ terminal include terminal windows
+
+Change this to your liking. To also restore the size of the Vim window, for
+example, use: >
+
+ :set sessionoptions+=resize
+
+
+SESSION HERE, SESSION THERE
+
+The obvious way to use sessions is when working on different projects.
+Suppose you store your session files in the directory "~/.vim". You are
+currently working on the "secret" project and have to switch to the "boring"
+project: >
+
+ :wall
+ :mksession! ~/.vim/secret.vim
+ :source ~/.vim/boring.vim
+
+This first uses ":wall" to write all modified files. Then the current session
+is saved, using ":mksession!". This overwrites the previous session. The
+next time you load the secret session you can continue where you were at this
+point. And finally you load the new "boring" session.
+
+If you open help windows, split and close various windows, and generally mess
+up the window layout, you can go back to the last saved session: >
+
+ :source ~/.vim/boring.vim
+
+Thus you have complete control over whether you want to continue next time
+where you are now, by saving the current setup in a session, or keep the
+session file as a starting point.
+ Another way of using sessions is to create a window layout that you like to
+use, and save this in a session. Then you can go back to this layout whenever
+you want.
+ For example, this is a nice layout to use:
+
+ +----------------------------------------+
+ | VIM - main help file |
+ | |
+ |Move around: Use the cursor keys, or "h|
+ |help.txt================================|
+ |explorer | |
+ |dir |~ |
+ |dir |~ |
+ |file |~ |
+ |file |~ |
+ |file |~ |
+ |file |~ |
+ |~/=========|[No File]===================|
+ | |
+ +----------------------------------------+
+
+This has a help window at the top, so that you can read this text. The narrow
+vertical window on the left contains a file explorer. This is a Vim plugin
+that lists the contents of a directory. You can select files to edit there.
+More about this in the next chapter.
+ Create this from a just started Vim with: >
+
+ :help
+ CTRL-W w
+ :vertical split ~/
+
+You can resize the windows a bit to your liking. Then save the session with:
+>
+ :mksession ~/.vim/mine.vim
+
+Now you can start Vim with this layout: >
+
+ vim -S ~/.vim/mine.vim
+
+Hint: To open a file you see listed in the explorer window in the empty
+window, move the cursor to the filename and press "O". Double clicking with
+the mouse will also do this.
+
+
+UNIX AND MS-WINDOWS
+
+Some people have to do work on MS-Windows systems one day and on Unix another
+day. If you are one of them, consider adding "slash" and "unix" to
+'sessionoptions'. The session files will then be written in a format that can
+be used on both systems. This is the command to put in your vimrc file: >
+
+ :set sessionoptions+=unix,slash
+
+Vim will use the Unix format then, because the MS-Windows Vim can read and
+write Unix files, but Unix Vim can't read MS-Windows format session files.
+Similarly, MS-Windows Vim understands file names with / to separate names, but
+Unix Vim doesn't understand \.
+
+
+SESSIONS AND VIMINFO
+
+Sessions store many things, but not the position of marks, contents of
+registers and the command line history. You need to use the viminfo feature
+for these things.
+ In most situations you will want to use sessions separately from viminfo.
+This can be used to switch to another session, but keep the command line
+history. And yank text into registers in one session, and paste it back in
+another session.
+ You might prefer to keep the info with the session. You will have to do
+this yourself then. Example: >
+
+ :mksession! ~/.vim/secret.vim
+ :wviminfo! ~/.vim/secret.viminfo
+
+And to restore this again: >
+
+ :source ~/.vim/secret.vim
+ :rviminfo! ~/.vim/secret.viminfo
+
+==============================================================================
+*21.5* Views
+
+A session stores the looks of the whole of Vim. When you want to store the
+properties for one window only, use a view.
+ The use of a view is for when you want to edit a file in a specific way.
+For example, you have line numbers enabled with the 'number' option and
+defined a few folds. Just like with sessions, you can remember this view on
+the file and restore it later. Actually, when you store a session, it stores
+the view of each window.
+ There are two basic ways to use views. The first is to let Vim pick a name
+for the view file. You can restore the view when you later edit the same
+file. To store the view for the current window: >
+
+ :mkview
+
+Vim will decide where to store the view. When you later edit the same file
+you get the view back with this command: >
+
+ :loadview
+
+That's easy, isn't it?
+ Now you want to view the file without the 'number' option on, or with all
+folds open, you can set the options to make the window look that way. Then
+store this view with: >
+
+ :mkview 1
+
+Obviously, you can get this back with: >
+
+ :loadview 1
+
+Now you can switch between the two views on the file by using ":loadview" with
+and without the "1" argument.
+ You can store up to ten views for the same file this way, one unnumbered
+and nine numbered 1 to 9.
+
+
+A VIEW WITH A NAME
+
+The second basic way to use views is by storing the view in a file with a name
+you choose. This view can be loaded while editing another file. Vim will
+then switch to editing the file specified in the view. Thus you can use this
+to quickly switch to editing another file, with all its options set as you
+saved them.
+ For example, to save the view of the current file: >
+
+ :mkview ~/.vim/main.vim
+
+You can restore it with: >
+
+ :source ~/.vim/main.vim
+
+==============================================================================
+*21.6* Modelines
+
+When editing a specific file, you might set options specifically for that
+file. Typing these commands each time is boring. Using a session or view for
+editing a file doesn't work when sharing the file between several people.
+ The solution for this situation is adding a modeline to the file. This is
+a line of text that tells Vim the values of options, to be used in this file
+only.
+ A typical example is a C program where you make indents by a multiple of 4
+spaces. This requires setting the 'shiftwidth' option to 4. This modeline
+will do that:
+
+ /* vim:set shiftwidth=4: */ ~
+
+Put this line as one of the first or last five lines in the file. When
+editing the file, you will notice that 'shiftwidth' will have been set to
+four. When editing another file, it's set back to the default value of eight.
+ For some files the modeline fits well in the header, thus it can be put at
+the top of the file. For text files and other files where the modeline gets
+in the way of the normal contents, put it at the end of the file.
+
+The 'modelines' option specifies how many lines at the start and end of the
+file are inspected for containing a modeline. To inspect ten lines: >
+
+ :set modelines=10
+
+The 'modeline' option can be used to switch this off. Do this when you are
+working as root on Unix or Administrator on MS-Windows, or when you don't
+trust the files you are editing: >
+
+ :set nomodeline
+
+Use this format for the modeline:
+
+ any-text vim:set {option}={value} ... : any-text ~
+
+The "any-text" indicates that you can put any text before and after the part
+that Vim will use. This allows making it look like a comment, like what was
+done above with /* and */.
+ The " vim:" part is what makes Vim recognize this line. There must be
+white space before "vim", or "vim" must be at the start of the line. Thus
+using something like "gvim:" will not work.
+ The part between the colons is a ":set" command. It works the same way as
+typing the ":set" command, except that you need to insert a backslash before a
+colon (otherwise it would be seen as the end of the modeline).
+
+Another example:
+
+ // vim:set textwidth=72 dir=c\:\tmp: use c:\tmp here ~
+
+There is an extra backslash before the first colon, so that it's included in
+the ":set" command. The text after the second colon is ignored, thus a remark
+can be placed there.
+
+For more details see |modeline|.
+
+==============================================================================
+
+Next chapter: |usr_22.txt| Finding the file to edit
+
+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
new file mode 100644
index 0000000..8ed1028
--- /dev/null
+++ b/runtime/doc/usr_22.txt
@@ -0,0 +1,414 @@
+*usr_22.txt* For Vim version 9.0. Last change: 2020 Mar 28
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Finding the file to edit
+
+
+Files can be found everywhere. So how do you find them? Vim offers various
+ways to browse the directory tree. There are commands to jump to a file that
+is mentioned in another. And Vim remembers which files have been edited
+before.
+
+|22.1| The file browser
+|22.2| The current directory
+|22.3| Finding a file
+|22.4| The buffer list
+
+ Next chapter: |usr_23.txt| Editing other files
+ Previous chapter: |usr_21.txt| Go away and come back
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*22.1* The file browser
+
+Vim has a plugin that makes it possible to edit a directory. Try this: >
+
+ :edit .
+
+Through the magic of autocommands and Vim scripts, the window will be filled
+with the contents of the directory. It looks like this:
+
+" ============================================================================ ~
+" Netrw Directory Listing (netrw v109) ~
+" Sorted by name ~
+" Sort sequence: [\/]$,\.h$,\.c$,\.cpp$,*,\.info$,\.swp$,\.o$\.obj$,\.bak$ ~
+" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec ~
+" ============================================================================ ~
+../ ~
+./ ~
+check/ ~
+Makefile ~
+autocmd.txt ~
+change.txt ~
+eval.txt~ ~
+filetype.txt~ ~
+help.txt.info ~
+
+You can see these items:
+
+1. The name of the browsing tool and its version number
+2. The name of the browsing directory
+3. The method of sorting (may be by name, time, or size)
+4. How names are to be sorted (directories first, then *.h files,
+ *.c files, etc)
+5. How to get help (use the <F1> key), and an abbreviated listing
+ of available commands
+6. A listing of files, including "../", which allows one to list
+ the parent directory.
+
+If you have syntax highlighting enabled, the different parts are highlighted
+so as to make it easier to spot them.
+
+You can use Normal mode Vim commands to move around in the text. For example,
+move the cursor atop a file and press <Enter>; you will then be editing that
+file. To go back to the browser use ":edit ." again, or use ":Explore".
+CTRL-O also works.
+
+Try using <Enter> while the cursor is atop a directory name. The result is
+that the file browser moves into that directory and displays the items found
+there. Pressing <Enter> on the first directory "../" moves you one level
+higher. Pressing "-" does the same thing, without the need to move to the
+"../" item first.
+
+You can press <F1> to get help on the things you can do in the netrw file
+browser. This is what you get: >
+
+ 9. Directory Browsing netrw-browse netrw-dir netrw-list netrw-help
+
+ MAPS netrw-maps
+ <F1>.............Help.......................................|netrw-help|
+ <cr>.............Browsing...................................|netrw-cr|
+ <del>............Deleting Files or Directories..............|netrw-delete|
+ -................Going Up...................................|netrw--|
+ a................Hiding Files or Directories................|netrw-a|
+ mb...............Bookmarking a Directory....................|netrw-mb|
+ gb...............Changing to a Bookmarked Directory.........|netrw-gb|
+ cd...............Make Browsing Directory The Current Dir....|netrw-c|
+ d................Make A New Directory.......................|netrw-d|
+ D................Deleting Files or Directories..............|netrw-D|
+ <c-h>............Edit File/Directory Hiding List............|netrw-ctrl-h|
+ i................Change Listing Style.......................|netrw-i|
+ <c-l>............Refreshing the Listing.....................|netrw-ctrl-l|
+ 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-qb|
+ r................Reversing Sorting Order....................|netrw-r|
+< (etc)
+
+The <F1> key thus brings you to a netrw directory browsing contents help page.
+It's a regular help page; use the usual |CTRL-]| to jump to tagged help items
+and |CTRL-O| to jump back.
+
+To select files for display and editing: (with the cursor is atop a filename)
+
+ <enter> Open the file in the current window. |netrw-cr|
+ o Horizontally split window and display file |netrw-o|
+ v Vertically split window and display file |netrw-v|
+ p Use the |preview-window| |netrw-p|
+ P Edit in the previous window |netrw-P|
+ t Open file in a new tab |netrw-t|
+
+The following normal-mode commands may be used to control the browser display:
+
+ i Controls listing style (thin, long, wide, and tree).
+ The long listing includes size and date information.
+ s Repeatedly pressing s will change the way the files
+ are sorted; one may sort on name, modification time,
+ or size.
+ r Reverse the sorting order.
+
+As a sampling of extra normal-mode commands:
+
+ cd Change Vim's notion of the current directory to be
+ the same as the browser directory. (see
+ |g:netrw_keepdir| to control this, too)
+ R Rename the file or directory under the cursor; a
+ prompt will be issued for the new name.
+ D Delete the file or directory under the cursor; a
+ confirmation request will be issued.
+ mb gb Make bookmark/goto bookmark
+
+
+One may also use command mode; again, just a sampling:
+
+ :Explore [directory] Browse specified/current directory
+ :NetrwSettings A comprehensive list of your current netrw
+ settings with help linkage.
+
+The netrw browser is not limited to just your local machine; one may use
+urls such as: (that trailing / is important)
+
+ :Explore ftp://somehost/path/to/dir/
+ :e scp://somehost/path/to/dir/
+
+See |netrw-browse| for more.
+
+==============================================================================
+*22.2* The current directory
+
+Just like the shell, Vim has the concept of a current directory. Suppose you
+are in your home directory and want to edit several files in a directory
+"VeryLongFileName". You could do: >
+
+ :edit VeryLongFileName/file1.txt
+ :edit VeryLongFileName/file2.txt
+ :edit VeryLongFileName/file3.txt
+
+To avoid much of the typing, do this: >
+
+ :cd VeryLongFileName
+ :edit file1.txt
+ :edit file2.txt
+ :edit file3.txt
+
+The ":cd" command changes the current directory. You can see what the current
+directory is with the ":pwd" command: >
+
+ :pwd
+ /home/Bram/VeryLongFileName
+
+Vim remembers the last directory that you used. Use "cd -" to go back to it.
+Example: >
+
+ :pwd
+ /home/Bram/VeryLongFileName
+ :cd /etc
+ :pwd
+ /etc
+ :cd -
+ :pwd
+ /home/Bram/VeryLongFileName
+ :cd -
+ :pwd
+ /etc
+
+
+WINDOW LOCAL DIRECTORY
+
+When you split a window, both windows use the same current directory. When
+you want to edit a number of files somewhere else in the new window, you can
+make it use a different directory, without changing the current directory in
+the other window. This is called a local directory. >
+
+ :pwd
+ /home/Bram/VeryLongFileName
+ :split
+ :lcd /etc
+ :pwd
+ /etc
+ CTRL-W w
+ :pwd
+ /home/Bram/VeryLongFileName
+
+So long as no `:lcd` command has been used, all windows share the same current
+directory. Doing a `:cd` command in one window will also change the current
+directory of the other window.
+ For a window where `:lcd` has been used a different current directory is
+remembered. Using `:cd` or `:lcd` in other windows will not change it.
+ When using a `:cd` command in a window that uses a different current
+directory, it will go back to using the shared directory.
+
+
+TAB LOCAL DIRECTORY
+
+When you open a new tab page, it uses the directory of the window in the
+previous tab page from which the new tab page was opened. You can change the
+directory of the current tab page using the `:tcd` command. All the windows in
+a tab page share this directory except for windows with a window-local
+directory. Any new windows opened in this tab page will use this directory as
+the current working directory. Using a `:cd` command in a tab page will not
+change the working directory of tab pages which have a tab local directory.
+When the global working directory is changed using the `:cd` command in a tab
+page, it will also change the current tab page working directory.
+
+
+==============================================================================
+*22.3* Finding a file
+
+You are editing a C program that contains this line:
+
+ #include "inits.h" ~
+
+You want to see what is in that "inits.h" file. Move the cursor on the name
+of the file and type: >
+
+ gf
+
+Vim will find the file and edit it.
+ What if the file is not in the current directory? Vim will use the 'path'
+option to find the file. This option is a list of directory names where to
+look for your file.
+ Suppose you have your include files located in "c:/prog/include". This
+command will add it to the 'path' option: >
+
+ :set path+=c:/prog/include
+
+This directory is an absolute path. No matter where you are, it will be the
+same place. What if you have located files in a subdirectory, below where the
+file is? Then you can specify a relative path name. This starts with a dot:
+>
+ :set path+=./proto
+
+This tells Vim to look in the directory "proto", below the directory where the
+file in which you use "gf" is. Thus using "gf" on "inits.h" will make Vim
+look for "proto/inits.h", starting in the directory of the file.
+ Without the "./", thus "proto", Vim would look in the "proto" directory
+below the current directory. And the current directory might not be where the
+file that you are editing is located.
+
+The 'path' option allows specifying the directories where to search for files
+in many more ways. See the help on the 'path' option.
+ The 'isfname' option is used to decide which characters are included in the
+file name, and which ones are not (e.g., the " character in the example
+above).
+
+When you know the file name, but it's not to be found in the file, you can
+type it: >
+
+ :find inits.h
+
+Vim will then use the 'path' option to try and locate the file. This is the
+same as the ":edit" command, except for the use of 'path'.
+
+To open the found file in a new window use CTRL-W f instead of "gf", or use
+":sfind" instead of ":find".
+
+
+A nice way to directly start Vim to edit a file somewhere in the 'path': >
+
+ vim "+find stdio.h"
+
+This finds the file "stdio.h" in your value of 'path'. The quotes are
+necessary to have one argument |-+c|.
+
+==============================================================================
+*22.4* The buffer list
+
+The Vim editor uses the term buffer to describe a file being edited.
+Actually, a buffer is a copy of the file that you edit. When you finish
+changing the buffer, you write the contents of the buffer to the file.
+Buffers not only contain file contents, but also all the marks, settings, and
+other stuff that goes with it.
+
+
+HIDDEN BUFFERS
+
+Suppose you are editing the file one.txt and need to edit the file two.txt.
+You could simply use ":edit two.txt", but since you made changes to one.txt
+that won't work. You also don't want to write one.txt yet. Vim has a
+solution for you: >
+
+ :hide edit two.txt
+
+The buffer "one.txt" disappears from the screen, but Vim still knows that you
+are editing this buffer, so it keeps the modified text. This is called a
+hidden buffer: The buffer contains text, but you can't see it.
+ The argument of ":hide" is another command. ":hide" makes that command
+behave as if the 'hidden' option was set. You could also set this option
+yourself. The effect is that when any buffer is abandoned, it becomes hidden.
+ Be careful! When you have hidden buffers with changes, don't exit Vim
+without making sure you have saved all the buffers.
+
+
+INACTIVE BUFFERS
+
+ When a buffer has been used once, Vim remembers some information about it.
+When it is not displayed in a window and it is not hidden, it is still in the
+buffer list. This is called an inactive buffer. Overview:
+
+ Active Appears in a window, text loaded.
+ Hidden Not in a window, text loaded.
+ Inactive Not in a window, no text loaded.
+
+The inactive buffers are remembered, because Vim keeps information about them,
+like marks. And remembering the file name is useful too, so that you can see
+which files you have edited. And edit them again.
+
+
+LISTING BUFFERS
+
+View the buffer list with this command: >
+
+ :buffers
+
+A command which does the same, is not so obvious to list buffers, but is much
+shorter to type: >
+
+ :ls
+
+The output could look like this:
+
+ 1 #h "help.txt" line 62 ~
+ 2 %a + "usr_21.txt" line 1 ~
+ 3 "usr_toc.txt" line 1 ~
+
+The first column contains the buffer number. You can use this to edit the
+buffer without having to type the name, see below.
+ After the buffer number come the flags. Then the name of the file
+and the line number where the cursor was the last time.
+ The flags that can appear are these (from left to right):
+
+ u Buffer is unlisted |unlisted-buffer|.
+ % Current buffer.
+ # Alternate buffer.
+ a Buffer is loaded and displayed.
+ h Buffer is loaded but hidden.
+ = Buffer is read-only.
+ - Buffer is not modifiable, the 'modifiable' option is off.
+ + Buffer has been modified.
+
+
+EDITING A BUFFER
+
+You can edit a buffer by its number. That avoids having to type the file
+name: >
+
+ :buffer 2
+
+But the only way to know the number is by looking in the buffer list. You can
+use the name, or part of it, instead: >
+
+ :buffer help
+
+Vim will find the best match for the name you type. If there is only one
+buffer that matches the name, it will be used. In this case "help.txt".
+ To open a buffer in a new window: >
+
+ :sbuffer 3
+
+This works with a name as well.
+
+
+USING THE BUFFER LIST
+
+You can move around in the buffer list with these commands:
+
+ :bnext go to next buffer
+ :bprevious go to previous buffer
+ :bfirst go to the first buffer
+ :blast go to the last buffer
+
+To remove a buffer from the list, use this command: >
+
+ :bdelete 3
+
+Again, this also works with a name.
+ If you delete a buffer that was active (visible in a window), that window
+will be closed. If you delete the current buffer, the current window will be
+closed. If it was the last window, Vim will find another buffer to edit. You
+can't be editing nothing!
+
+ Note:
+ Even after removing the buffer with ":bdelete" Vim still remembers it.
+ It's actually made "unlisted", it no longer appears in the list from
+ ":buffers". The ":buffers!" command will list unlisted buffers (yes,
+ Vim can do the impossible). To really make Vim forget about a buffer,
+ use ":bwipe". Also see the 'buflisted' option.
+
+==============================================================================
+
+Next chapter: |usr_23.txt| Editing other files
+
+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
new file mode 100644
index 0000000..cbcc484
--- /dev/null
+++ b/runtime/doc/usr_23.txt
@@ -0,0 +1,345 @@
+*usr_23.txt* For Vim version 9.0. Last change: 2020 Dec 19
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Editing other files
+
+
+This chapter is about editing files that are not ordinary files. With Vim you
+can edit files that are compressed or encrypted. Some files need to be
+accessed over the internet. With some restrictions, binary files can be
+edited as well.
+
+|23.1| DOS, Mac and Unix files
+|23.2| Files on the internet
+|23.3| Encryption
+|23.4| Binary files
+|23.5| Compressed files
+
+ Next chapter: |usr_24.txt| Inserting quickly
+ Previous chapter: |usr_22.txt| Finding the file to edit
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*23.1* DOS, Mac and Unix files
+
+Back in the early days, the old Teletype machines used two characters to
+start a new line. One to move the carriage back to the first position
+(carriage return, <CR>), another to move the paper up (line feed, <LF>).
+ When computers came out, storage was expensive. Some people decided that
+they did not need two characters for end-of-line. The UNIX people decided
+they could use <New Line> or <NL> only for end-of-line. The Apple people
+standardized on <CR>. The Microsoft Windows folks decided to keep the old
+<CR><NL> (we use <NL> for line feed in the help text).
+ This means that if you try to move a file from one system to another, you
+have line-break problems. The Vim editor automatically recognizes the
+different file formats and handles things properly behind your back.
+ The option 'fileformats' contains the various formats that will be tried
+when a new file is edited. The following command, for example, tells Vim to
+try UNIX format first and MS-DOS format second: >
+
+ :set fileformats=unix,dos
+
+You will notice the format in the message you get when editing a file. You
+don't see anything if you edit a native file format. Thus editing a Unix file
+on Unix won't result in a remark. But when you edit a dos file, Vim will
+notify you of this:
+
+ "/tmp/test" [dos] 3L, 71C ~
+
+For a Mac file you would see "[mac]".
+ The detected file format is stored in the 'fileformat' option. To see
+which format you have, execute the following command: >
+
+ :set fileformat?
+
+The three names that Vim uses are:
+
+ unix <NL>
+ dos <CR><NL>
+ mac <CR>
+
+
+USING THE MAC FORMAT
+
+On Unix, <NL> is used to break a line. It's not unusual to have a <CR>
+character halfway a line. Incidentally, this happens quite often in Vi (and
+Vim) scripts.
+ On the Macintosh, where <CR> is the line break character, it's possible to
+have a <NL> character halfway a line.
+ The result is that it's not possible to be 100% sure whether a file
+containing both <CR> and <NL> characters is a Mac or a Unix file. Therefore,
+Vim assumes that on Unix you probably won't edit a Mac file, and doesn't check
+for this type of file. To check for this format anyway, add "mac" to
+'fileformats': >
+
+ :set fileformats+=mac
+
+Then Vim will take a guess at the file format. Watch out for situations where
+Vim guesses wrong.
+
+
+OVERRULING THE FORMAT
+
+If you use the good old Vi and try to edit an MS-DOS format file, you will
+find that each line ends with a ^M character. (^M is <CR>). The automatic
+detection avoids this. Suppose you do want to edit the file that way? Then
+you need to overrule the format: >
+
+ :edit ++ff=unix file.txt
+
+The "++" string is an item that tells Vim that an option name follows, which
+overrules the default for this single command. "++ff" is used for
+'fileformat'. You could also use "++ff=mac" or "++ff=dos".
+ This doesn't work for any option, only "++ff" and "++enc" are currently
+implemented. The full names "++fileformat" and "++encoding" also work.
+
+
+CONVERSION
+
+You can use the 'fileformat' option to convert from one file format to
+another. Suppose, for example, that you have an MS-DOS file named README.TXT
+that you want to convert to UNIX format. Start by editing the MS-DOS format
+file: >
+ vim README.TXT
+
+Vim will recognize this as a dos format file. Now change the file format to
+UNIX: >
+
+ :set fileformat=unix
+ :write
+
+The file is written in Unix format.
+
+==============================================================================
+*23.2* Files on the internet
+
+Someone sends you an e-mail message, which refers to a file by its URL. For
+example:
+
+ You can find the information here: ~
+ ftp://ftp.vim.org/pub/vim/README ~
+
+You could start a program to download the file, save it on your local disk and
+then start Vim to edit it.
+ There is a much simpler way. Move the cursor to any character of the URL.
+Then use this command: >
+
+ gf
+
+With a bit of luck, Vim will figure out which program to use for downloading
+the file, download it and edit the copy. To open the file in a new window use
+CTRL-W f.
+ If something goes wrong you will get an error message. It's possible that
+the URL is wrong, you don't have permission to read it, the network connection
+is down, etc. Unfortunately, it's hard to tell the cause of the error. You
+might want to try the manual way of downloading the file.
+
+Accessing files over the internet works with the netrw plugin. Currently URLs
+with these formats are recognized:
+
+ ftp:// uses ftp
+ rcp:// uses rcp
+ scp:// uses scp
+ http:// uses wget (reading only)
+
+Vim doesn't do the communication itself, it relies on the mentioned programs
+to be available on your computer. On most Unix systems "ftp" and "rcp" will
+be present. "scp" and "wget" might need to be installed.
+
+Vim detects these URLs for each command that starts editing a new file, also
+with ":edit" and ":split", for example. Write commands also work, except for
+http://.
+
+For more information, also about passwords, see |netrw|.
+
+==============================================================================
+*23.3* Encryption
+
+Some information you prefer to keep to yourself. For example, when writing
+a test on a computer that students also use. You don't want clever students
+to figure out a way to read the questions before the exam starts. Vim can
+encrypt the file for you, which gives you some protection.
+ To start editing a new file with encryption, use the "-x" argument to start
+Vim. Example: >
+
+ vim -x exam.txt
+
+Vim prompts you for a key used for encrypting and decrypting the file:
+
+ Enter encryption key: ~
+
+Carefully type the secret key now. You cannot see the characters you type,
+they will be replaced by stars. To avoid the situation that a typing mistake
+will cause trouble, Vim asks you to enter the key again:
+
+ Enter same key again: ~
+
+You can now edit this file normally and put in all your secrets. When you
+finish editing the file and tell Vim to exit, the file is encrypted and
+written.
+ When you edit the file with Vim, it will ask you to enter the same key
+again. You don't need to use the "-x" argument. You can also use the normal
+":edit" command. Vim adds a magic string to the file by which it recognizes
+that the file was encrypted.
+ If you try to view this file using another program, all you get is garbage.
+Also, if you edit the file with Vim and enter the wrong key, you get garbage.
+Vim does not have a mechanism to check if the key is the right one (this makes
+it much harder to break the key).
+
+
+SWITCHING ENCRYPTION ON AND OFF
+
+To disable the encryption of a file, set the 'key' option to an empty string:
+>
+ :set key=
+
+The next time you write the file this will be done without encryption.
+ Setting the 'key' option to enable encryption is not a good idea, because
+the password appears in the clear. Anyone shoulder-surfing can read your
+password.
+ To avoid this problem, the ":X" command was created. It asks you for an
+encryption key, just like the "-x" argument did: >
+
+ :X
+ Enter encryption key: ******
+ Enter same key again: ******
+
+
+LIMITS ON ENCRYPTION
+
+The encryption algorithm used by Vim is not very strong. It is good enough to
+keep out the casual prowler, but not good enough to keep out a cryptology
+expert with lots of time on his hands. The text in the swap file and the undo
+file is also encrypted. However, this is done block-by-block and may reduce
+the time needed to crack a password. You can disable the swap file, but then
+a crash will cause you to lose your work, since Vim keeps all the text in
+memory only. The undo file can be disabled with the only disadvantage that
+you can't undo after unloading the buffer.
+ To avoid using a swap file, supply the -n argument on the command line.
+For example, to edit the encrypted file "file.txt" without a swap file use the
+following command: >
+
+ vim -x -n file.txt
+
+When already editing a file, the swapfile can be disabled with: >
+
+ :setlocal noswapfile
+
+Since there is no swapfile, recovery will be impossible. Save the file a bit
+more often to avoid the risk of losing your changes.
+
+While the file is in memory, it is in plain text. Anyone with privilege can
+look in the editor's memory and discover the contents of the file.
+ If you use a viminfo file, be aware that the contents of text registers are
+written out in the clear as well.
+ If you really want to secure the contents of a file, edit it only on a
+portable computer not connected to a network, use good encryption tools, and
+keep the computer locked up in a big safe when not in use.
+
+==============================================================================
+*23.4* Binary files
+
+You can edit binary files with Vim. Vim wasn't really made for this, thus
+there are a few restrictions. But you can read a file, change a character and
+write it back, with the result that only that one character was changed and
+the file is identical otherwise.
+ To make sure that Vim does not use its clever tricks in the wrong way, add
+the "-b" argument when starting Vim: >
+
+ vim -b datafile
+
+This sets the 'binary' option. The effect of this is that unexpected side
+effects are turned off. For example, 'textwidth' is set to zero, to avoid
+automatic formatting of lines. And files are always read in Unix file format.
+
+Binary mode can be used to change a message in a program. Be careful not to
+insert or delete any characters, it would stop the program from working. Use
+"R" to enter replace mode.
+
+Many characters in the file will be unprintable. To see them in Hex format: >
+
+ :set display=uhex
+
+Otherwise, the "ga" command can be used to see the value of the character
+under the cursor. The output, when the cursor is on an <Esc>, looks like
+this:
+
+ <^[> 27, Hex 1b, Octal 033 ~
+
+There might not be many line breaks in the file. To get some overview switch
+the 'wrap' option off: >
+
+ :set nowrap
+
+
+BYTE POSITION
+
+To see on which byte you are in the file use this command: >
+
+ g CTRL-G
+
+The output is verbose:
+
+ Col 9-16 of 9-16; Line 277 of 330; Word 1806 of 2058; Byte 10580 of 12206 ~
+
+The last two numbers are the byte position in the file and the total number of
+bytes. This takes into account how 'fileformat' changes the number of bytes
+that a line break uses.
+ To move to a specific byte in the file, use the "go" command. For
+example, to move to byte 2345: >
+
+ 2345go
+
+
+USING XXD
+
+A real binary editor shows the text in two ways: as it is and in hex format.
+You can do this in Vim by first converting the file with the "xxd" program.
+This comes with Vim.
+ First edit the file in binary mode: >
+
+ vim -b datafile
+
+Now convert the file to a hex dump with xxd: >
+
+ :%!xxd
+
+The text will look like this:
+
+ 0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49 ....9..;..tt.+NI ~
+ 0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30 K,.`.....b..4^.0 ~
+ 0000020: 373b 2731 0b22 0ca6 c1a2 d669 1035 39d9 7;'1.".....i.59. ~
+
+You can now view and edit the text as you like. Vim treats the information as
+ordinary text. Changing the hex does not cause the printable character to be
+changed, or the other way around.
+ Finally convert it back with:
+>
+ :%!xxd -r
+
+Only changes in the hex part are used. Changes in the printable text part on
+the right are ignored.
+
+See the manual page of xxd for more information.
+
+==============================================================================
+*23.5* Compressed files
+
+This is easy: You can edit a compressed file just like any other file. The
+"gzip" plugin takes care of decompressing the file when you edit it. And
+compressing it again when you write it.
+ These compression methods are currently supported:
+
+ .Z compress
+ .gz gzip
+ .bz2 bzip2
+
+Vim uses the mentioned programs to do the actual compression and
+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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_24.txt b/runtime/doc/usr_24.txt
new file mode 100644
index 0000000..361ce1b
--- /dev/null
+++ b/runtime/doc/usr_24.txt
@@ -0,0 +1,606 @@
+*usr_24.txt* For Vim version 9.0. Last change: 2018 Mar 18
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Inserting quickly
+
+
+When entering text, Vim offers various ways to reduce the number of keystrokes
+and avoid typing mistakes. Use Insert mode completion to repeat previously
+typed words. Abbreviate long words to short ones. Type characters that
+aren't on your keyboard.
+
+|24.1| Making corrections
+|24.2| Showing matches
+|24.3| Completion
+|24.4| Repeating an insert
+|24.5| Copying from another line
+|24.6| Inserting a register
+|24.7| Abbreviations
+|24.8| Entering special characters
+|24.9| Digraphs
+|24.10| Normal mode commands
+
+ Next chapter: |usr_25.txt| Editing formatted text
+ Previous chapter: |usr_23.txt| Editing other files
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*24.1* Making corrections
+
+The <BS> key was already mentioned. It deletes the character just before the
+cursor. The <Del> key does the same for the character under (after) the
+cursor.
+ When you typed a whole word wrong, use CTRL-W:
+
+ The horse had fallen to the sky ~
+ CTRL-W
+ The horse had fallen to the ~
+
+If you really messed up a line and want to start over, use CTRL-U to delete
+it. This keeps the text after the cursor and the indent. Only the text from
+the first non-blank to the cursor is deleted. With the cursor on the "f" of
+"fallen" in the next line pressing CTRL-U does this:
+
+ The horse had fallen to the ~
+ CTRL-U
+ fallen to the ~
+
+When you spot a mistake a few words back, you need to move the cursor there to
+correct it. For example, you typed this:
+
+ The horse had follen to the ground ~
+
+You need to change "follen" to "fallen". With the cursor at the end, you
+would type this to correct it: >
+
+ <Esc>4blraA
+
+< get out of Insert mode <Esc>
+ four words back 4b
+ move on top of the "o" l
+ replace with "a" ra
+ restart Insert mode A
+
+Another way to do this: >
+
+ <C-Left><C-Left><C-Left><C-Left><Right><Del>a<End>
+
+< four words back <C-Left><C-Left><C-Left><C-Left>
+ move on top of the "o" <Right>
+ delete the "o" <Del>
+ insert an "a" a
+ go to end of the line <End>
+
+This uses special keys to move around, while remaining in Insert mode. This
+resembles what you would do in a modeless editor. It's easier to remember,
+but takes more time (you have to move your hand from the letters to the cursor
+keys, and the <End> key is hard to press without looking at the keyboard).
+ These special keys are most useful when writing a mapping that doesn't
+leave Insert mode. The extra typing doesn't matter then.
+ An overview of the keys you can use in Insert mode:
+
+ <C-Home> to start of the file
+ <PageUp> a whole screenful up
+ <Home> to start of line
+ <S-Left> one word left
+ <C-Left> one word left
+ <S-Right> one word right
+ <C-Right> one word right
+ <End> to end of the line
+ <PageDown> a whole screenful down
+ <C-End> to end of the file
+
+There are a few more, see |ins-special-special|.
+
+==============================================================================
+*24.2* Showing matches
+
+When you type a ) it would be nice to see with which ( it matches. To make
+Vim do that use this command: >
+
+ :set showmatch
+
+When you now type a text like "(example)", as soon as you type the ) Vim will
+briefly move the cursor to the matching (, keep it there for half a second,
+and move back to where you were typing.
+ In case there is no matching (, Vim will beep. Then you know that you
+might have forgotten the ( somewhere, or typed a ) too many.
+ The match will also be shown for [] and {} pairs. You don't have to wait
+with typing the next character, as soon as Vim sees it the cursor will move
+back and inserting continues as before.
+ You can change the time Vim waits with the 'matchtime' option. For
+example, to make Vim wait one and a half second: >
+
+ :set matchtime=15
+
+The time is specified in tenths of a second.
+
+==============================================================================
+*24.3* Completion
+
+Vim can automatically complete words on insertion. You type the first part of
+a word, press CTRL-P, and Vim guesses the rest.
+ Suppose, for example, that you are creating a C program and want to type in
+the following:
+
+ total = ch_array[0] + ch_array[1] + ch_array[2]; ~
+
+You start by entering the following:
+
+ total = ch_array[0] + ch_ ~
+
+At this point, you tell Vim to complete the word using the command CTRL-P.
+Vim searches for a word that starts with what's in front of the cursor. In
+this case, it is "ch_", which matches with the word ch_array. So typing
+CTRL-P gives you the following:
+
+ total = ch_array[0] + ch_array ~
+
+After a little more typing, you get this (ending in a space):
+
+ total = ch_array[0] + ch_array[1] + ~
+
+If you now type CTRL-P Vim will search again for a word that completes the
+word before the cursor. Since there is nothing in front of the cursor, it
+finds the first word backwards, which is "ch_array". Typing CTRL-P again
+gives you the next word that matches, in this case "total". A third CTRL-P
+searches further back. If there is nothing else, it causes the editor to run
+out of words, so it returns to the original text, which is nothing. A fourth
+CTRL-P causes the editor to start over again with "ch_array".
+
+To search forward, use CTRL-N. Since the search wraps around the end of the
+file, CTRL-N and CTRL-P will find the same matches, but in a different
+sequence. Hint: CTRL-N is Next-match and CTRL-P is Previous-match.
+
+The Vim editor goes through a lot of effort to find words to complete. By
+default, it searches the following places:
+
+ 1. Current file
+ 2. Files in other windows
+ 3. Other loaded files (hidden buffers)
+ 4. Files which are not loaded (inactive buffers)
+ 5. Tag files
+ 6. All files #included by the current file
+
+
+OPTIONS
+
+You can customize the search order with the 'complete' option.
+
+The 'ignorecase' option is used. When it is set, case differences are ignored
+when searching for matches.
+
+A special option for completion is 'infercase'. This is useful to find
+matches while ignoring case ('ignorecase' must be set) but still using the
+case of the word typed so far. Thus if you type "For" and Vim finds a match
+"fortunately", it will result in "Fortunately".
+
+
+COMPLETING SPECIFIC ITEMS
+
+If you know what you are looking for, you can use these commands to complete
+with a certain type of item:
+
+ CTRL-X CTRL-F file names
+ CTRL-X CTRL-L whole lines
+ CTRL-X CTRL-D macro definitions (also in included files)
+ CTRL-X CTRL-I current and included files
+ CTRL-X CTRL-K words from a dictionary
+ CTRL-X CTRL-T words from a thesaurus
+ CTRL-X CTRL-] tags
+ CTRL-X CTRL-V Vim command line
+
+After each of them CTRL-N can be used to find the next match, CTRL-P to find
+the previous match.
+ More information for each of these commands here: |ins-completion|.
+
+
+COMPLETING FILE NAMES
+
+Let's take CTRL-X CTRL-F as an example. This will find file names. It scans
+the current directory for files and displays each one that matches the word in
+front of the cursor.
+ Suppose, for example, that you have the following files in the current
+directory:
+
+ main.c sub_count.c sub_done.c sub_exit.c
+
+Now enter Insert mode and start typing:
+
+ The exit code is in the file sub ~
+
+At this point, you enter the command CTRL-X CTRL-F. Vim now completes the
+current word "sub" by looking at the files in the current directory. The
+first match is sub_count.c. This is not the one you want, so you match the
+next file by typing CTRL-N. This match is sub_done.c. Typing CTRL-N again
+takes you to sub_exit.c. The results:
+
+ The exit code is in the file sub_exit.c ~
+
+If the file name starts with / (Unix) or C:\ (MS-Windows) you can find all
+files in the file system. For example, type "/u" and CTRL-X CTRL-F. This
+will match "/usr" (this is on Unix):
+
+ the file is found in /usr/ ~
+
+If you now press CTRL-N you go back to "/u". Instead, to accept the "/usr/"
+and go one directory level deeper, use CTRL-X CTRL-F again:
+
+ the file is found in /usr/X11R6/ ~
+
+The results depend on what is found in your file system, of course. The
+matches are sorted alphabetically.
+
+
+COMPLETING IN SOURCE CODE
+
+Source code files are well structured. That makes it possible to do
+completion in an intelligent way. In Vim this is called Omni completion. In
+some other editors it's called intellisense, but that is a trademark.
+
+The key to Omni completion is CTRL-X CTRL-O. Obviously the O stands for Omni
+here, so that you can remember it easier. Let's use an example for editing C
+source:
+
+ { ~
+ struct foo *p; ~
+ p-> ~
+
+The cursor is after "p->". Now type CTRL-X CTRL-O. Vim will offer you a list
+of alternatives, which are the items that "struct foo" contains. That is
+quite different from using CTRL-P, which would complete any word, while only
+members of "struct foo" are valid here.
+
+For Omni completion to work you may need to do some setup. At least make sure
+filetype plugins are enabled. Your vimrc file should contain a line like
+this: >
+ filetype plugin on
+Or: >
+ filetype plugin indent on
+
+For C code you need to create a tags file and set the 'tags' option. That is
+explained |ft-c-omni|. For other filetypes you may need to do something
+similar, look below |compl-omni-filetypes|. It only works for specific
+filetypes. Check the value of the 'omnifunc' option to find out if it would
+work.
+
+==============================================================================
+*24.4* Repeating an insert
+
+If you press CTRL-A, the editor inserts the text you typed the last time you
+were in Insert mode.
+ Assume, for example, that you have a file that begins with the following:
+
+ "file.h" ~
+ /* Main program begins */ ~
+
+You edit this file by inserting "#include " at the beginning of the first
+line:
+
+ #include "file.h" ~
+ /* Main program begins */ ~
+
+You go down to the beginning of the next line using the commands "j^". You
+now start to insert a new "#include" line. So you type: >
+
+ i CTRL-A
+
+The result is as follows:
+
+ #include "file.h" ~
+ #include /* Main program begins */ ~
+
+The "#include " was inserted because CTRL-A inserts the text of the previous
+insert. Now you type "main.h"<Enter> to finish the line:
+
+
+ #include "file.h" ~
+ #include "main.h" ~
+ /* Main program begins */ ~
+
+The CTRL-@ command does a CTRL-A and then exits Insert mode. That's a quick
+way of doing exactly the same insertion again.
+
+==============================================================================
+*24.5* Copying from another line
+
+The CTRL-Y command inserts the character above the cursor. This is useful
+when you are duplicating a previous line. For example, you have this line of
+C code:
+
+ b_array[i]->s_next = a_array[i]->s_next; ~
+
+Now you need to type the same line, but with "s_prev" instead of "s_next".
+Start the new line, and press CTRL-Y 14 times, until you are at the "n" of
+"next":
+
+ b_array[i]->s_next = a_array[i]->s_next; ~
+ b_array[i]->s_ ~
+
+Now you type "prev":
+
+ b_array[i]->s_next = a_array[i]->s_next; ~
+ b_array[i]->s_prev ~
+
+Continue pressing CTRL-Y until the following "next":
+
+ b_array[i]->s_next = a_array[i]->s_next; ~
+ b_array[i]->s_prev = a_array[i]->s_ ~
+
+Now type "prev;" to finish it off.
+
+The CTRL-E command acts like CTRL-Y except it inserts the character below the
+cursor.
+
+==============================================================================
+*24.6* Inserting a register
+
+The command CTRL-R {register} inserts the contents of the register. This is
+useful to avoid having to type a long word. For example, you need to type
+this:
+
+ r = VeryLongFunction(a) + VeryLongFunction(b) + VeryLongFunction(c) ~
+
+The function name is defined in a different file. Edit that file and move the
+cursor on top of the function name there, and yank it into register v: >
+
+ "vyiw
+
+"v is the register specification, "yiw" is yank-inner-word. Now edit the file
+where the new line is to be inserted, and type the first letters:
+
+ r = ~
+
+Now use CTRL-R v to insert the function name:
+
+ r = VeryLongFunction ~
+
+You continue to type the characters in between the function name, and use
+CTRL-R v two times more.
+ You could have done the same with completion. Using a register is useful
+when there are many words that start with the same characters.
+
+If the register contains characters such as <BS> or other special characters,
+they are interpreted as if they had been typed from the keyboard. If you do
+not want this to happen (you really want the <BS> to be inserted in the text),
+use the command CTRL-R CTRL-R {register}.
+
+==============================================================================
+*24.7* Abbreviations
+
+An abbreviation is a short word that takes the place of a long one. For
+example, "ad" stands for "advertisement". Vim enables you to type an
+abbreviation and then will automatically expand it for you.
+ To tell Vim to expand "ad" into "advertisement" every time you insert it,
+use the following command: >
+
+ :iabbrev ad advertisement
+
+Now, when you type "ad", the whole word "advertisement" will be inserted into
+the text. This is triggered by typing a character that can't be part of a
+word, for example a space:
+
+ What Is Entered What You See
+ I saw the a I saw the a ~
+ I saw the ad I saw the ad ~
+ I saw the ad<Space> I saw the advertisement<Space> ~
+
+The expansion doesn't happen when typing just "ad". That allows you to type a
+word like "add", which will not get expanded. Only whole words are checked
+for abbreviations.
+
+
+ABBREVIATING SEVERAL WORDS
+
+It is possible to define an abbreviation that results in multiple words. For
+example, to define "JB" as "Jack Benny", use the following command: >
+
+ :iabbrev JB Jack Benny
+
+As a programmer, I use two rather unusual abbreviations: >
+
+ :iabbrev #b /****************************************
+ :iabbrev #e <Space>****************************************/
+
+These are used for creating boxed comments. The comment starts with #b, which
+draws the top line. I then type the comment text and use #e to draw the
+bottom line.
+ Notice that the #e abbreviation begins with a space. In other words, the
+first two characters are space-star. Usually Vim ignores spaces between the
+abbreviation and the expansion. To avoid that problem, I spell space as seven
+characters: <, S, p, a, c, e, >.
+
+ Note:
+ ":iabbrev" is a long word to type. ":iab" works just as well.
+ That's abbreviating the abbreviate command!
+
+
+FIXING TYPING MISTAKES
+
+It's very common to make the same typing mistake every time. For example,
+typing "teh" instead of "the". You can fix this with an abbreviation: >
+
+ :abbreviate teh the
+
+You can add a whole list of these. Add one each time you discover a common
+mistake.
+
+
+LISTING ABBREVIATIONS
+
+The ":abbreviate" command lists the abbreviations:
+
+ :abbreviate
+ i #e ****************************************/
+ i #b /****************************************
+ i JB Jack Benny
+ i ad advertisement
+ ! teh the
+
+The "i" in the first column indicates Insert mode. These abbreviations are
+only active in Insert mode. Other possible characters are:
+
+ c Command-line mode :cabbrev
+ ! both Insert and Command-line mode :abbreviate
+
+Since abbreviations are not often useful in Command-line mode, you will mostly
+use the ":iabbrev" command. That avoids, for example, that "ad" gets expanded
+when typing a command like: >
+
+ :edit ad
+
+
+DELETING ABBREVIATIONS
+
+To get rid of an abbreviation, use the ":unabbreviate" command. Suppose you
+have the following abbreviation: >
+
+ :abbreviate @f fresh
+
+You can remove it with this command: >
+
+ :unabbreviate @f
+
+While you type this, you will notice that @f is expanded to "fresh". Don't
+worry about this, Vim understands it anyway (except when you have an
+abbreviation for "fresh", but that's very unlikely).
+ To remove all the abbreviations: >
+
+ :abclear
+
+":unabbreviate" and ":abclear" also come in the variants for Insert mode
+(":iunabbreviate and ":iabclear") and Command-line mode (":cunabbreviate" and
+":cabclear").
+
+
+REMAPPING ABBREVIATIONS
+
+There is one thing to watch out for when defining an abbreviation: The
+resulting string should not be mapped. For example: >
+
+ :abbreviate @a adder
+ :imap dd disk-door
+
+When you now type @a, you will get "adisk-doorer". That's not what you want.
+To avoid this, use the ":noreabbrev" command. It does the same as
+":abbreviate", but avoids that the resulting string is used for mappings: >
+
+ :noreabbrev @a adder
+
+Fortunately, it's unlikely that the result of an abbreviation is mapped.
+
+==============================================================================
+*24.8* Entering special characters
+
+The CTRL-V command is used to insert the next character literally. In other
+words, any special meaning the character has, it will be ignored. For
+example: >
+
+ CTRL-V <Esc>
+
+Inserts an escape character. Thus you don't leave Insert mode. (Don't type
+the space after CTRL-V, it's only to make this easier to read).
+
+ Note:
+ On MS-Windows CTRL-V is used to paste text. Use CTRL-Q instead of
+ CTRL-V. On Unix, on the other hand, CTRL-Q does not work on some
+ terminals, because it has a special meaning.
+
+You can also use the command CTRL-V {digits} to insert a character with the
+decimal number {digits}. For example, the character number 127 is the <Del>
+character (but not necessarily the <Del> key!). To insert <Del> type: >
+
+ CTRL-V 127
+
+You can enter characters up to 255 this way. When you type fewer than two
+digits, a non-digit will terminate the command. To avoid the need of typing a
+non-digit, prepend one or two zeros to make three digits.
+ All the next commands insert a <Tab> and then a dot:
+
+ CTRL-V 9.
+ CTRL-V 09.
+ CTRL-V 009.
+
+To enter a character in hexadecimal, use an "x" after the CTRL-V: >
+
+ CTRL-V x7f
+
+This also goes up to character 255 (CTRL-V xff). You can use "o" to type a
+character as an octal number and two more methods allow you to type up to
+a 16 bit and a 32 bit number (e.g., for a Unicode character): >
+
+ CTRL-V o123
+ CTRL-V u1234
+ CTRL-V U12345678
+
+==============================================================================
+*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: >
+
+ CTRL-K Co
+
+To find out what digraphs are available, use the following command: >
+
+ :digraphs
+
+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 ~
+
+This shows, for example, that the digraph you get by typing CTRL-K Pd is the
+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.
+ You can exchange the first and second character, if there is no digraph for
+that combination. Thus CTRL-K dP also works. Since there is no digraph for
+"dP" Vim will also search for a "Pd" digraph.
+
+ Note:
+ The digraphs depend on the character set that Vim assumes you are
+ using. Always use ":digraphs" to find out which digraphs are currently
+ available.
+
+You can define your own digraphs. Example: >
+
+ :digraph a" ä
+
+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
+
+More information about digraphs here: |digraphs|
+ Another way to insert special characters is with a keymap. More about that
+here: |45.5|
+
+==============================================================================
+*24.10* Normal mode commands
+
+Insert mode offers a limited number of commands. In Normal mode you have many
+more. When you want to use one, you usually leave Insert mode with <Esc>,
+execute the Normal mode command, and re-enter Insert mode with "i" or "a".
+ There is a quicker way. With CTRL-O {command} you can execute any Normal
+mode command from Insert mode. For example, to delete from the cursor to the
+end of the line: >
+
+ CTRL-O D
+
+You can execute only one Normal mode command this way. But you can specify a
+register or a count. A more complicated example: >
+
+ CTRL-O "g3dw
+
+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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_25.txt b/runtime/doc/usr_25.txt
new file mode 100644
index 0000000..2f25a9f
--- /dev/null
+++ b/runtime/doc/usr_25.txt
@@ -0,0 +1,583 @@
+*usr_25.txt* For Vim version 9.0. Last change: 2016 Mar 28
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Editing formatted text
+
+
+Text hardly ever comes in one sentence per line. This chapter is about
+breaking sentences to make them fit on a page and other formatting.
+Vim also has useful features for editing single-line paragraphs and tables.
+
+|25.1| Breaking lines
+|25.2| Aligning text
+|25.3| Indents and tabs
+|25.4| Dealing with long lines
+|25.5| Editing tables
+
+ Next chapter: |usr_26.txt| Repeating
+ Previous chapter: |usr_24.txt| Inserting quickly
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*25.1* Breaking lines
+
+Vim has a number of functions that make dealing with text easier. By default,
+the editor does not perform automatic line breaks. In other words, you have
+to press <Enter> yourself. This is useful when you are writing programs where
+you want to decide where the line ends. It is not so good when you are
+creating documentation and want the text to be at most 70 character wide.
+ If you set the 'textwidth' option, Vim automatically inserts line breaks.
+Suppose, for example, that you want a very narrow column of only 30
+characters. You need to execute the following command: >
+
+ :set textwidth=30
+
+Now you start typing (ruler added):
+
+ 1 2 3
+ 12345678901234567890123456789012345
+ I taught programming for a whi ~
+
+If you type "l" next, this makes the line longer than the 30-character limit.
+When Vim sees this, it inserts a line break and you get the following:
+
+ 1 2 3
+ 12345678901234567890123456789012345
+ I taught programming for a ~
+ whil ~
+
+Continuing on, you can type in the rest of the paragraph:
+
+ 1 2 3
+ 12345678901234567890123456789012345
+ I taught programming for a ~
+ while. One time, I was stopped ~
+ by the Fort Worth police, ~
+ because my homework was too ~
+ hard. True story. ~
+
+You do not have to type newlines; Vim puts them in automatically.
+
+ Note:
+ The 'wrap' option makes Vim display lines with a line break, but this
+ doesn't insert a line break in the file.
+
+
+REFORMATTING
+
+The Vim editor is not a word processor. In a word processor, if you delete
+something at the beginning of the paragraph, the line breaks are reworked. In
+Vim they are not; so if you delete the word "programming" from the first line,
+all you get is a short line:
+
+ 1 2 3
+ 12345678901234567890123456789012345
+ I taught for a ~
+ while. One time, I was stopped ~
+ by the Fort Worth police, ~
+ because my homework was too ~
+ hard. True story. ~
+
+This does not look good. To get the paragraph into shape you use the "gq"
+operator.
+ Let's first use this with a Visual selection. Starting from the first
+line, type: >
+
+ v4jgq
+
+"v" to start Visual mode, "4j" to move to the end of the paragraph and then
+the "gq" operator. The result is:
+
+ 1 2 3
+ 12345678901234567890123456789012345
+ I taught for a while. One ~
+ time, I was stopped by the ~
+ Fort Worth police, because my ~
+ homework was too hard. True ~
+ story. ~
+
+Note: there is a way to do automatic formatting for specific types of text
+layouts, see |auto-format|.
+
+Since "gq" is an operator, you can use one of the three ways to select the
+text it works on: With Visual mode, with a movement and with a text object.
+ The example above could also be done with "gq4j". That's less typing, but
+you have to know the line count. A more useful motion command is "}". This
+moves to the end of a paragraph. Thus "gq}" formats from the cursor to the
+end of the current paragraph.
+ A very useful text object to use with "gq" is the paragraph. Try this: >
+
+ gqap
+
+"ap" stands for "a-paragraph". This formats the text of one paragraph
+(separated by empty lines). Also the part before the cursor.
+ If you have your paragraphs separated by empty lines, you can format the
+whole file by typing this: >
+
+ gggqG
+
+"gg" to move to the first line, "gqG" to format until the last line.
+ Warning: If your paragraphs are not properly separated, they will be joined
+together. A common mistake is to have a line with a space or tab. That's a
+blank line, but not an empty line.
+
+Vim is able to format more than just plain text. See |fo-table| for how to
+change this. See the 'joinspaces' option to change the number of spaces used
+after a full stop.
+ It is possible to use an external program for formatting. This is useful
+if your text can't be properly formatted with Vim's builtin command. See the
+'formatprg' option.
+
+==============================================================================
+*25.2* Aligning text
+
+To center a range of lines, use the following command: >
+
+ :{range}center [width]
+
+{range} is the usual command-line range. [width] is an optional line width to
+use for centering. If [width] is not specified, it defaults to the value of
+'textwidth'. (If 'textwidth' is 0, the default is 80.)
+ For example: >
+
+ :1,5center 40
+
+results in the following:
+
+ I taught for a while. One ~
+ time, I was stopped by the ~
+ Fort Worth police, because my ~
+ homework was too hard. True ~
+ story. ~
+
+
+RIGHT ALIGNMENT
+
+Similarly, the ":right" command right-justifies the text: >
+
+ :1,5right 37
+
+gives this result:
+
+ I taught for a while. One ~
+ time, I was stopped by the ~
+ Fort Worth police, because my ~
+ homework was too hard. True ~
+ story. ~
+
+LEFT ALIGNMENT
+
+Finally there is this command: >
+
+ :{range}left [margin]
+
+Unlike ":center" and ":right", however, the argument to ":left" is not the
+length of the line. Instead it is the left margin. If it is omitted, the
+text will be put against the left side of the screen (using a zero margin
+would do the same). If it is 5, the text will be indented 5 spaces. For
+example, use these commands: >
+
+ :1left 5
+ :2,5left
+
+This results in the following:
+
+ I taught for a while. One ~
+ time, I was stopped by the ~
+ Fort Worth police, because my ~
+ homework was too hard. True ~
+ story. ~
+
+
+JUSTIFYING TEXT
+
+Vim has no built-in way of justifying text. However, there is a neat macro
+package that does the job. To use this package, execute the following
+command: >
+
+ :packadd justify
+
+Or put this line in your |vimrc|: >
+
+ packadd! justify
+
+This Vim script file defines a new visual command "_j". To justify a block of
+text, highlight the text in Visual mode and then execute "_j".
+ Look in the file for more explanations. To go there, do "gf" on this name:
+$VIMRUNTIME/pack/dist/opt/justify/plugin/justify.vim.
+
+An alternative is to filter the text through an external program. Example: >
+
+ :%!fmt
+
+==============================================================================
+*25.3* Indents and tabs
+
+Indents can be used to make text stand out from the rest. The example texts
+in this manual, for example, are indented by eight spaces or a tab. You would
+normally enter this by typing a tab at the start of each line. Take this
+text:
+ the first line ~
+ the second line ~
+
+This is entered by typing a tab, some text, <Enter>, tab and more text.
+ The 'autoindent' option inserts indents automatically: >
+
+ :set autoindent
+
+When a new line is started it gets the same indent as the previous line. In
+the above example, the tab after the <Enter> is not needed anymore.
+
+
+INCREASING INDENT
+
+To increase the amount of indent in a line, use the ">" operator. Often this
+is used as ">>", which adds indent to the current line.
+ The amount of indent added is specified with the 'shiftwidth' option. The
+default value is 8. To make ">>" insert four spaces worth of indent, for
+example, type this: >
+
+ :set shiftwidth=4
+
+When used on the second line of the example text, this is what you get:
+
+ the first line ~
+ the second line ~
+
+"4>>" will increase the indent of four lines.
+
+
+TABSTOP
+
+If you want to make indents a multiple of 4, you set 'shiftwidth' to 4. But
+when pressing a <Tab> you still get 8 spaces worth of indent. To change this,
+set the 'softtabstop' option: >
+
+ :set softtabstop=4
+
+This will make the <Tab> key insert 4 spaces worth of indent. If there are
+already four spaces, a <Tab> character is used (saving seven characters in the
+file). (If you always want spaces and no tab characters, set the 'expandtab'
+option.)
+
+ Note:
+ You could set the 'tabstop' option to 4. However, if you edit the
+ file another time, with 'tabstop' set to the default value of 8, it
+ will look wrong. In other programs and when printing the indent will
+ also be wrong. Therefore it is recommended to keep 'tabstop' at eight
+ all the time. That's the standard value everywhere.
+
+
+CHANGING TABS
+
+You edit a file which was written with a tabstop of 3. In Vim it looks ugly,
+because it uses the normal tabstop value of 8. You can fix this by setting
+'tabstop' to 3. But you have to do this every time you edit this file.
+ Vim can change the use of tabstops in your file. First, set 'tabstop' to
+make the indents look good, then use the ":retab" command: >
+
+ :set tabstop=3
+ :retab 8
+
+The ":retab" command will change 'tabstop' to 8, while changing the text such
+that it looks the same. It changes spans of white space into tabs and spaces
+for this. You can now write the file. Next time you edit it the indents will
+be right without setting an option.
+ Warning: When using ":retab" on a program, it may change white space inside
+a string constant. Therefore it's a good habit to use "\t" instead of a
+real tab.
+
+==============================================================================
+*25.4* Dealing with long lines
+
+Sometimes you will be editing a file that is wider than the number of columns
+in the window. When that occurs, Vim wraps the lines so that everything fits
+on the screen.
+ If you switch the 'wrap' option off, each line in the file shows up as one
+line on the screen. Then the ends of the long lines disappear off the screen
+to the right.
+ When you move the cursor to a character that can't be seen, Vim will scroll
+the text to show it. This is like moving a viewport over the text in the
+horizontal direction.
+ By default, Vim does not display a horizontal scrollbar in the GUI. If you
+want to enable one, use the following command: >
+
+ :set guioptions+=b
+
+One horizontal scrollbar will appear at the bottom of the Vim window.
+
+If you don't have a scrollbar or don't want to use it, use these commands to
+scroll the text. The cursor will stay in the same place, but it's moved back
+into the visible text if necessary.
+
+ zh scroll right
+ 4zh scroll four characters right
+ zH scroll half a window width right
+ ze scroll right to put the cursor at the end
+ zl scroll left
+ 4zl scroll four characters left
+ zL scroll half a window width left
+ zs scroll left to put the cursor at the start
+
+Let's attempt to show this with one line of text. The cursor is on the "w" of
+"which". The "current window" above the line indicates the text that is
+currently visible. The "window"s below the text indicate the text that is
+visible after the command left of it.
+
+ |<-- current window -->|
+ some long text, part of which is visible in the window ~
+ ze |<-- window -->|
+ zH |<-- window -->|
+ 4zh |<-- window -->|
+ zh |<-- window -->|
+ zl |<-- window -->|
+ 4zl |<-- window -->|
+ zL |<-- window -->|
+ zs |<-- window -->|
+
+
+MOVING WITH WRAP OFF
+
+When 'wrap' is off and the text has scrolled horizontally, you can use the
+following commands to move the cursor to a character you can see. Thus text
+left and right of the window is ignored. These never cause the text to
+scroll:
+
+ g0 to first visible character in this line
+ g^ to first non-blank visible character in this line
+ gm to middle of screen line
+ gM to middle of the text in this line
+ g$ to last visible character in this line
+
+ |<-- window -->|
+ some long text, part of which is visible in one line ~
+ g0 g^ gm gM g$
+
+
+BREAKING AT WORDS *edit-no-break*
+
+When preparing text for use by another program, you might have to make
+paragraphs without a line break. A disadvantage of using 'nowrap' is that you
+can't see the whole sentence you are working on. When 'wrap' is on, words are
+broken halfway, which makes them hard to read.
+ A good solution for editing this kind of paragraph is setting the
+'linebreak' option. Vim then breaks lines at an appropriate place when
+displaying the line. The text in the file remains unchanged.
+ Without 'linebreak' text might look like this:
+
+ +---------------------------------+
+ |letter generation program for a b|
+ |ank. They wanted to send out a s|
+ |pecial, personalized letter to th|
+ |eir richest 1000 customers. Unfo|
+ |rtunately for the programmer, he |
+ +---------------------------------+
+After: >
+
+ :set linebreak
+
+it looks like this:
+
+ +---------------------------------+
+ |letter generation program for a |
+ |bank. They wanted to send out a |
+ |special, personalized letter to |
+ |their richest 1000 customers. |
+ |Unfortunately for the programmer,|
+ +---------------------------------+
+
+Related options:
+'breakat' specifies the characters where a break can be inserted.
+'showbreak' specifies a string to show at the start of broken line.
+Set 'textwidth' to zero to avoid a paragraph to be split.
+
+
+MOVING BY VISIBLE LINES
+
+The "j" and "k" commands move to the next and previous lines. When used on
+a long line, this means moving a lot of screen lines at once.
+ To move only one screen line, use the "gj" and "gk" commands. When a line
+doesn't wrap they do the same as "j" and "k". When the line does wrap, they
+move to a character displayed one line below or above.
+ You might like to use these mappings, which bind these movement commands to
+the cursor keys: >
+
+ :map <Up> gk
+ :map <Down> gj
+
+
+TURNING A PARAGRAPH INTO ONE LINE *edit-paragraph-join*
+
+If you want to import text into a program like MS-Word, each paragraph should
+be a single line. If your paragraphs are currently separated with empty
+lines, this is how you turn each paragraph into a single line: >
+
+ :g/./,/^$/join
+
+That looks complicated. Let's break it up in pieces:
+
+ :g/./ A ":global" command that finds all lines that contain
+ at least one character.
+ ,/^$/ A range, starting from the current line (the non-empty
+ line) until an empty line.
+ join The ":join" command joins the range of lines together
+ into one line.
+
+Starting with this text, containing eight lines broken at column 30:
+
+ +----------------------------------+
+ |A letter generation program |
+ |for a bank. They wanted to |
+ |send out a special, |
+ |personalized letter. |
+ | |
+ |To their richest 1000 |
+ |customers. Unfortunately for |
+ |the programmer, |
+ +----------------------------------+
+
+You end up with two lines:
+
+ +----------------------------------+
+ |A letter generation program for a |
+ |bank. They wanted to send out a s|
+ |pecial, personalized letter. |
+ |To their richest 1000 customers. |
+ |Unfortunately for the programmer, |
+ +----------------------------------+
+
+Note that this doesn't work when the separating line is blank but not empty;
+when it contains spaces and/or tabs. This command does work with blank lines:
+>
+ :g/\S/,/^\s*$/join
+
+This still requires a blank or empty line at the end of the file for the last
+paragraph to be joined.
+
+==============================================================================
+*25.5* Editing tables
+
+Suppose you are editing a table with four columns:
+
+ nice table test 1 test 2 test 3 ~
+ input A 0.534 ~
+ input B 0.913 ~
+
+You need to enter numbers in the third column. You could move to the second
+line, use "A", enter a lot of spaces and type the text.
+ For this kind of editing there is a special option: >
+
+ set virtualedit=all
+
+Now you can move the cursor to positions where there isn't any text. This is
+called "virtual space". Editing a table is a lot easier this way.
+ Move the cursor by searching for the header of the last column: >
+
+ /test 3
+
+Now press "j" and you are right where you can enter the value for "input A".
+Typing "0.693" results in:
+
+ nice table test 1 test 2 test 3 ~
+ input A 0.534 0.693 ~
+ input B 0.913 ~
+
+Vim has automatically filled the gap in front of the new text for you. Now,
+to enter the next field in this column use "Bj". "B" moves back to the start
+of a white space separated word. Then "j" moves to the place where the next
+field can be entered.
+
+ Note:
+ You can move the cursor anywhere in the display, also beyond the end
+ of a line. But Vim will not insert spaces there, until you insert a
+ character in that position.
+
+
+COPYING A COLUMN
+
+You want to add a column, which should be a copy of the third column and
+placed before the "test 1" column. Do this in seven steps:
+1. Move the cursor to the left upper corner of this column, e.g., with
+ "/test 3".
+2. Press CTRL-V to start blockwise Visual mode.
+3. Move the cursor down two lines with "2j". You are now in "virtual space":
+ the "input B" line of the "test 3" column.
+4. Move the cursor right, to include the whole column in the selection, plus
+ the space that you want between the columns. "9l" should do it.
+5. Yank the selected rectangle with "y".
+6. Move the cursor to "test 1", where the new column must be placed.
+7. Press "P".
+
+The result should be:
+
+ nice table test 3 test 1 test 2 test 3 ~
+ input A 0.693 0.534 0.693 ~
+ input B 0.913 ~
+
+Notice that the whole "test 1" column was shifted right, also the line where
+the "test 3" column didn't have text.
+
+Go back to non-virtual cursor movements with: >
+
+ :set virtualedit=
+
+
+VIRTUAL REPLACE MODE
+
+The disadvantage of using 'virtualedit' is that it "feels" different. You
+can't recognize tabs or spaces beyond the end of line when moving the cursor
+around. Another method can be used: Virtual Replace mode.
+ Suppose you have a line in a table that contains both tabs and other
+characters. Use "rx" on the first tab:
+
+ inp 0.693 0.534 0.693 ~
+
+ |
+ rx |
+ V
+
+ inpx0.693 0.534 0.693 ~
+
+The layout is messed up. To avoid that, use the "gr" command:
+
+ inp 0.693 0.534 0.693 ~
+
+ |
+ grx |
+ V
+
+ inpx 0.693 0.534 0.693 ~
+
+What happens is that the "gr" command makes sure the new character takes the
+right amount of screen space. Extra spaces or tabs are inserted to fill the
+gap. Thus what actually happens is that a tab is replaced by "x" and then
+blanks added to make the text after it keep its place. In this case a
+tab is inserted.
+ When you need to replace more than one character, you use the "R" command
+to go to Replace mode (see |04.9|). This messes up the layout and replaces
+the wrong characters:
+
+ inp 0 0.534 0.693 ~
+
+ |
+ R0.786 |
+ V
+
+ inp 0.78634 0.693 ~
+
+The "gR" command uses Virtual Replace mode. This preserves the layout:
+
+ inp 0 0.534 0.693 ~
+
+ |
+ gR0.786 |
+ V
+
+ inp 0.786 0.534 0.693 ~
+
+==============================================================================
+
+Next chapter: |usr_26.txt| Repeating
+
+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
new file mode 100644
index 0000000..7fec325
--- /dev/null
+++ b/runtime/doc/usr_26.txt
@@ -0,0 +1,221 @@
+*usr_26.txt* For Vim version 9.0. Last change: 2006 Apr 24
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Repeating
+
+
+An editing task is hardly ever unstructured. A change often needs to be made
+several times. In this chapter a number of useful ways to repeat a change
+will be explained.
+
+|26.1| Repeating with Visual mode
+|26.2| Add and subtract
+|26.3| Making a change in many files
+|26.4| Using Vim from a shell script
+
+ Next chapter: |usr_27.txt| Search commands and patterns
+ Previous chapter: |usr_25.txt| Editing formatted text
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*26.1* Repeating with Visual mode
+
+Visual mode is very handy for making a change in any sequence of lines. You
+can see the highlighted text, thus you can check if the correct lines are
+changed. But making the selection takes some typing. The "gv" command
+selects the same area again. This allows you to do another operation on the
+same text.
+ Suppose you have some lines where you want to change "2001" to "2002" and
+"2000" to "2001":
+
+ The financial results for 2001 are better ~
+ than for 2000. The income increased by 50%, ~
+ even though 2001 had more rain than 2000. ~
+ 2000 2001 ~
+ income 45,403 66,234 ~
+
+First change "2001" to "2002". Select the lines in Visual mode, and use: >
+
+ :s/2001/2002/g
+
+Now use "gv" to reselect the same text. It doesn't matter where the cursor
+is. Then use ":s/2000/2001/g" to make the second change.
+ Obviously, you can repeat these changes several times.
+
+==============================================================================
+*26.2* Add and subtract
+
+When repeating the change of one number into another, you often have a fixed
+offset. In the example above, one was added to each year. Instead of typing
+a substitute command for each year that appears, the CTRL-A command can be
+used.
+ Using the same text as above, search for a year: >
+
+ /19[0-9][0-9]\|20[0-9][0-9]
+
+Now press CTRL-A. The year will be increased by one:
+
+ The financial results for 2002 are better ~
+ than for 2000. The income increased by 50%, ~
+ even though 2001 had more rain than 2000. ~
+ 2000 2001 ~
+ income 45,403 66,234 ~
+
+Use "n" to find the next year, and press "." to repeat the CTRL-A ("." is a
+bit quicker to type). Repeat "n" and "." for all years that appear.
+ Hint: set the 'hlsearch' option to see the matches you are going to change,
+then you can look ahead and do it faster.
+
+Adding more than one can be done by prepending the number to CTRL-A. Suppose
+you have this list:
+
+ 1. item four ~
+ 2. item five ~
+ 3. item six ~
+
+Move the cursor to "1." and type: >
+
+ 3 CTRL-A
+
+The "1." will change to "4.". Again, you can use "." to repeat this on the
+other numbers.
+
+Another example:
+
+ 006 foo bar ~
+ 007 foo bar ~
+
+Using CTRL-A on these numbers results in:
+
+ 007 foo bar ~
+ 010 foo bar ~
+
+7 plus one is 10? What happened here is that Vim recognized "007" as an octal
+number, because there is a leading zero. This notation is often used in C
+programs. If you do not want a number with leading zeros to be handled as
+octal, use this: >
+
+ :set nrformats-=octal
+
+The CTRL-X command does subtraction in a similar way.
+
+==============================================================================
+*26.3* Making a change in many files
+
+Suppose you have a variable called "x_cnt" and you want to change it to
+"x_counter". This variable is used in several of your C files. You need to
+change it in all files. This is how you do it.
+ Put all the relevant files in the argument list: >
+
+ :args *.c
+<
+This finds all C files and edits the first one. Now you can perform a
+substitution command on all these files: >
+
+ :argdo %s/\<x_cnt\>/x_counter/ge | update
+
+The ":argdo" command takes an argument that is another command. That command
+will be executed on all files in the argument list.
+ The "%s" substitute command that follows works on all lines. It finds the
+word "x_cnt" with "\<x_cnt\>". The "\<" and "\>" are used to match the whole
+word only, and not "px_cnt" or "x_cnt2".
+ The flags for the substitute command include "g" to replace all occurrences
+of "x_cnt" in the same line. The "e" flag is used to avoid an error message
+when "x_cnt" does not appear in the file. Otherwise ":argdo" would abort on
+the first file where "x_cnt" was not found.
+ The "|" separates two commands. The following "update" command writes the
+file only if it was changed. If no "x_cnt" was changed to "x_counter" nothing
+happens.
+
+There is also the ":windo" command, which executes its argument in all
+windows. And ":bufdo" executes its argument on all buffers. Be careful with
+this, because you might have more files in the buffer list than you think.
+Check this with the ":buffers" command (or ":ls").
+
+==============================================================================
+*26.4* Using Vim from a shell script
+
+Suppose you have a lot of files in which you need to change the string
+"-person-" to "Jones" and then print it. How do you do that? One way is to
+do a lot of typing. The other is to write a shell script to do the work.
+ The Vim editor does a superb job as a screen-oriented editor when using
+Normal mode commands. For batch processing, however, Normal mode commands do
+not result in clear, commented command files; so here you will use Ex mode
+instead. This mode gives you a nice command-line interface that makes it easy
+to put into a batch file. ("Ex command" is just another name for a
+command-line (:) command.)
+ The Ex mode commands you need are as follows: >
+
+ %s/-person-/Jones/g
+ write tempfile
+ quit
+
+You put these commands in the file "change.vim". Now to run the editor in
+batch mode, use this shell script: >
+
+ for file in *.txt; do
+ vim -e -s $file < change.vim
+ lpr -r tempfile
+ done
+
+The for-done loop is a shell construct to repeat the two lines in between,
+while the $file variable is set to a different file name each time.
+ The second line runs the Vim editor in Ex mode (-e argument) on the file
+$file and reads commands from the file "change.vim". The -s argument tells
+Vim to operate in silent mode. In other words, do not keep outputting the
+:prompt, or any other prompt for that matter.
+ The "lpr -r tempfile" command prints the resulting "tempfile" and deletes
+it (that's what the -r argument does).
+
+
+READING FROM STDIN
+
+Vim can read text on standard input. Since the normal way is to read commands
+there, you must tell Vim to read text instead. This is done by passing the
+"-" argument in place of a file. Example: >
+
+ ls | vim -
+
+This allows you to edit the output of the "ls" command, without first saving
+the text in a file.
+ If you use the standard input to read text from, you can use the "-S"
+argument to read a script: >
+
+ producer | vim -S change.vim -
+
+
+NORMAL MODE SCRIPTS
+
+If you really want to use Normal mode commands in a script, you can use it
+like this: >
+
+ vim -s script file.txt ...
+<
+ Note:
+ "-s" has a different meaning when it is used without "-e". Here it
+ means to source the "script" as Normal mode commands. When used with
+ "-e" it means to be silent, and doesn't use the next argument as a
+ file name.
+
+The commands in "script" are executed like you typed them. Don't forget that
+a line break is interpreted as pressing <Enter>. In Normal mode that moves
+the cursor to the next line.
+ To create the script you can edit the script file and type the commands.
+You need to imagine what the result would be, which can be a bit difficult.
+Another way is to record the commands while you perform them manually. This
+is how you do that: >
+
+ vim -w script file.txt ...
+
+All typed keys will be written to "script". If you make a small mistake you
+can just continue and remember to edit the script later.
+ The "-w" argument appends to an existing script. That is good when you
+want to record the script bit by bit. If you want to start from scratch and
+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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_27.txt b/runtime/doc/usr_27.txt
new file mode 100644
index 0000000..54e5c3a
--- /dev/null
+++ b/runtime/doc/usr_27.txt
@@ -0,0 +1,563 @@
+*usr_27.txt* For Vim version 9.0. Last change: 2019 Jul 14
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Search commands and patterns
+
+
+In chapter 3 a few simple search patterns were mentioned |03.9|. Vim can do
+much more complex searches. This chapter explains the most often used ones.
+A detailed specification can be found here: |pattern|
+
+|27.1| Ignoring case
+|27.2| Wrapping around the file end
+|27.3| Offsets
+|27.4| Matching multiple times
+|27.5| Alternatives
+|27.6| Character ranges
+|27.7| Character classes
+|27.8| Matching a line break
+|27.9| Examples
+
+ Next chapter: |usr_28.txt| Folding
+ Previous chapter: |usr_26.txt| Repeating
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*27.1* Ignoring case
+
+By default, Vim's searches are case sensitive. Therefore, "include",
+"INCLUDE", and "Include" are three different words and a search will match
+only one of them.
+ Now switch on the 'ignorecase' option: >
+
+ :set ignorecase
+
+Search for "include" again, and now it will match "Include", "INCLUDE" and
+"InClUDe". (Set the 'hlsearch' option to quickly see where a pattern
+matches.)
+ You can switch this off again with: >
+
+ :set noignorecase
+
+But let's keep it set, and search for "INCLUDE". It will match exactly the
+same text as "include" did. Now set the 'smartcase' option: >
+
+ :set ignorecase smartcase
+
+If you have a pattern with at least one uppercase character, the search
+becomes case sensitive. The idea is that you didn't have to type that
+uppercase character, so you must have done it because you wanted case to
+match. That's smart!
+ With these two options set you find the following matches:
+
+ pattern matches ~
+ word word, Word, WORD, WoRd, etc.
+ Word Word
+ WORD WORD
+ WoRd WoRd
+
+
+CASE IN ONE PATTERN
+
+If you want to ignore case for one specific pattern, you can do this by
+prepending the "\c" string. Using "\C" will make the pattern to match case.
+This overrules the 'ignorecase' and 'smartcase' options, when "\c" or "\C" is
+used their value doesn't matter.
+
+ pattern matches ~
+ \Cword word
+ \CWord Word
+ \cword word, Word, WORD, WoRd, etc.
+ \cWord word, Word, WORD, WoRd, etc.
+
+A big advantage of using "\c" and "\C" is that it sticks with the pattern.
+Thus if you repeat a pattern from the search history, the same will happen, no
+matter if 'ignorecase' or 'smartcase' was changed.
+
+ Note:
+ The use of "\" items in search patterns depends on the 'magic' option.
+ In this chapter we will assume 'magic' is on, because that is the
+ standard and recommended setting. If you would change 'magic', many
+ search patterns would suddenly become invalid.
+
+ Note:
+ If your search takes much longer than you expected, you can interrupt
+ it with CTRL-C on Unix and CTRL-Break on MS-Windows.
+
+==============================================================================
+*27.2* Wrapping around the file end
+
+By default, a forward search starts searching for the given string at the
+current cursor location. It then proceeds to the end of the file. If it has
+not found the string by that time, it starts from the beginning and searches
+from the start of the file to the cursor location.
+ Keep in mind that when repeating the "n" command to search for the next
+match, you eventually get back to the first match. If you don't notice this
+you keep searching forever! To give you a hint, Vim displays this message:
+
+ search hit BOTTOM, continuing at TOP ~
+
+If you use the "?" command, to search in the other direction, you get this
+message:
+
+ search hit TOP, continuing at BOTTOM ~
+
+Still, you don't know when you are back at the first match. One way to see
+this is by switching on the 'ruler' option: >
+
+ :set ruler
+
+Vim will display the cursor position in the lower righthand corner of the
+window (in the status line if there is one). It looks like this:
+
+ 101,29 84% ~
+
+The first number is the line number of the cursor. Remember the line number
+where you started, so that you can check if you passed this position again.
+
+
+NOT WRAPPING
+
+To turn off search wrapping, use the following command: >
+
+ :set nowrapscan
+
+Now when the search hits the end of the file, an error message displays:
+
+ E385: search hit BOTTOM without match for: forever ~
+
+Thus you can find all matches by going to the start of the file with "gg" and
+keep searching until you see this message.
+ If you search in the other direction, using "?", you get:
+
+ E384: search hit TOP without match for: forever ~
+
+==============================================================================
+*27.3* Offsets
+
+By default, the search command leaves the cursor positioned on the beginning
+of the pattern. You can tell Vim to leave it some other place by specifying
+an offset. For the forward search command "/", the offset is specified by
+appending a slash (/) and the offset: >
+
+ /default/2
+
+This command searches for the pattern "default" and then moves to the
+beginning of the second line past the pattern. Using this command on the
+paragraph above, Vim finds the word "default" in the first line. Then the
+cursor is moved two lines down and lands on "an offset".
+
+If the offset is a simple number, the cursor will be placed at the beginning
+of the line that many lines from the match. The offset number can be positive
+or negative. If it is positive, the cursor moves down that many lines; if
+negative, it moves up.
+
+
+CHARACTER OFFSETS
+
+The "e" offset indicates an offset from the end of the match. It moves the
+cursor onto the last character of the match. The command: >
+
+ /const/e
+
+puts the cursor on the "t" of "const".
+ From that position, adding a number moves forward that many characters.
+This command moves to the character just after the match: >
+
+ /const/e+1
+
+A positive number moves the cursor to the right, a negative number moves it to
+the left. For example: >
+
+ /const/e-1
+
+moves the cursor to the "s" of "const".
+
+If the offset begins with "b", the cursor moves to the beginning of the
+pattern. That's not very useful, since leaving out the "b" does the same
+thing. It does get useful when a number is added or subtracted. The cursor
+then goes forward or backward that many characters. For example: >
+
+ /const/b+2
+
+Moves the cursor to the beginning of the match and then two characters to the
+right. Thus it lands on the "n".
+
+
+REPEATING
+
+To repeat searching for the previously used search pattern, but with a
+different offset, leave out the pattern: >
+
+ /that
+ //e
+
+Is equal to: >
+
+ /that/e
+
+To repeat with the same offset: >
+
+ /
+
+"n" does the same thing. To repeat while removing a previously used offset: >
+
+ //
+
+
+SEARCHING BACKWARDS
+
+The "?" command uses offsets in the same way, but you must use "?" to separate
+the offset from the pattern, instead of "/": >
+
+ ?const?e-2
+
+The "b" and "e" keep their meaning, they don't change direction with the use
+of "?".
+
+
+START POSITION
+
+When starting a search, it normally starts at the cursor position. When you
+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!
+ 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!
+
+When you specify a character offset, Vim will compensate for this. Thus the
+search starts a few characters forward or backward, so that the same match
+isn't found again.
+
+==============================================================================
+*27.4* Matching multiple times
+
+The "*" item specifies that the item before it can match any number of times.
+Thus: >
+
+ /a*
+
+matches "a", "aa", "aaa", etc. But also "" (the empty string), because zero
+times is included.
+ The "*" only applies to the item directly before it. Thus "ab*" matches
+"a", "ab", "abb", "abbb", etc. To match a whole string multiple times, it
+must be grouped into one item. This is done by putting "\(" before it and
+"\)" after it. Thus this command: >
+
+ /\(ab\)*
+
+Matches: "ab", "abab", "ababab", etc. And also "".
+
+To avoid matching the empty string, use "\+". This makes the previous item
+match one or more times. >
+
+ /ab\+
+
+Matches "ab", "abb", "abbb", etc. It does not match "a" when no "b" follows.
+
+To match an optional item, use "\=". Example: >
+
+ /folders\=
+
+Matches "folder" and "folders".
+
+
+SPECIFIC COUNTS
+
+To match a specific number of items use the form "\{n,m}". "n" and "m" are
+numbers. The item before it will be matched "n" to "m" times |inclusive|.
+Example: >
+
+ /ab\{3,5}
+
+matches "abbb", "abbbb" and "abbbbb".
+ When "n" is omitted, it defaults to zero. When "m" is omitted it defaults
+to infinity. When ",m" is omitted, it matches exactly "n" times.
+Examples:
+
+ pattern match count ~
+ \{,4} 0, 1, 2, 3 or 4
+ \{3,} 3, 4, 5, etc.
+ \{0,1} 0 or 1, same as \=
+ \{0,} 0 or more, same as *
+ \{1,} 1 or more, same as \+
+ \{3} 3
+
+
+MATCHING AS LITTLE AS POSSIBLE
+
+The items so far match as many characters as they can find. To match as few
+as possible, use "\{-n,m}". It works the same as "\{n,m}", except that the
+minimal amount possible is used.
+ For example, use: >
+
+ /ab\{-1,3}
+
+Will match "ab" in "abbb". Actually, it will never match more than one b,
+because there is no reason to match more. It requires something else to force
+it to match more than the lower limit.
+ The same rules apply to removing "n" and "m". It's even possible to remove
+both of the numbers, resulting in "\{-}". This matches the item before it
+zero or more times, as few as possible. The item by itself always matches
+zero times. It is useful when combined with something else. Example: >
+
+ /a.\{-}b
+
+This matches "axb" in "axbxb". If this pattern would be used: >
+
+ /a.*b
+
+It would try to match as many characters as possible with ".*", thus it
+matches "axbxb" as a whole.
+
+==============================================================================
+*27.5* Alternatives
+
+The "or" operator in a pattern is "\|". Example: >
+
+ /foo\|bar
+
+This matches "foo" or "bar". More alternatives can be concatenated: >
+
+ /one\|two\|three
+
+Matches "one", "two" and "three".
+ To match multiple times, the whole thing must be placed in "\(" and "\)": >
+
+ /\(foo\|bar\)\+
+
+This matches "foo", "foobar", "foofoo", "barfoobar", etc.
+ Another example: >
+
+ /end\(if\|while\|for\)
+
+This matches "endif", "endwhile" and "endfor".
+
+A related item is "\&". This requires that both alternatives match in the
+same place. The resulting match uses the last alternative. Example: >
+
+ /forever\&...
+
+This matches "for" in "forever". It will not match "fortuin", for example.
+
+==============================================================================
+*27.6* Character ranges
+
+To match "a", "b" or "c" you could use "/a\|b\|c". When you want to match all
+letters from "a" to "z" this gets very long. There is a shorter method: >
+
+ /[a-z]
+
+The [] construct matches a single character. Inside you specify which
+characters to match. You can include a list of characters, like this: >
+
+ /[0123456789abcdef]
+
+This will match any of the characters included. For consecutive characters
+you can specify the range. "0-3" stands for "0123". "w-z" stands for "wxyz".
+Thus the same command as above can be shortened to: >
+
+ /[0-9a-f]
+
+To match the "-" character itself make it the first or last one in the range.
+These special characters are accepted to make it easier to use them inside a
+[] range (they can actually be used anywhere in the search pattern):
+
+ \e <Esc>
+ \t <Tab>
+ \r <CR>
+ \b <BS>
+
+There are a few more special cases for [] ranges, see |/[]| for the whole
+story.
+
+
+COMPLEMENTED RANGE
+
+To avoid matching a specific character, use "^" at the start of the range.
+The [] item then matches everything but the characters included. Example: >
+
+ /"[^"]*"
+<
+ " a double quote
+ [^"] any character that is not a double quote
+ * as many as possible
+ " a double quote again
+
+This matches "foo" and "3!x", including the double quotes.
+
+
+PREDEFINED RANGES
+
+A number of ranges are used very often. Vim provides a shortcut for these.
+For example: >
+
+ /\a
+
+Finds alphabetic characters. This is equal to using "/[a-zA-Z]". Here are a
+few more of these:
+
+ item matches equivalent ~
+ \d digit [0-9]
+ \D non-digit [^0-9]
+ \x hex digit [0-9a-fA-F]
+ \X non-hex digit [^0-9a-fA-F]
+ \s white space [ ] (<Tab> and <Space>)
+ \S non-white characters [^ ] (not <Tab> and <Space>)
+ \l lowercase alpha [a-z]
+ \L non-lowercase alpha [^a-z]
+ \u uppercase alpha [A-Z]
+ \U non-uppercase alpha [^A-Z]
+
+ Note:
+ Using these predefined ranges works a lot faster than the character
+ range it stands for.
+ These items can not be used inside []. Thus "[\d\l]" does NOT work to
+ match a digit or lowercase alpha. Use "\(\d\|\l\)" instead.
+
+See |/\s| for the whole list of these ranges.
+
+==============================================================================
+*27.7* Character classes
+
+The character range matches a fixed set of characters. A character class is
+similar, but with an essential difference: The set of characters can be
+redefined without changing the search pattern.
+ For example, search for this pattern: >
+
+ /\f\+
+
+The "\f" item stands for file name characters. Thus this matches a sequence
+of characters that can be a file name.
+ Which characters can be part of a file name depends on the system you are
+using. On MS-Windows, the backslash is included, on Unix it is not. This is
+specified with the 'isfname' option. The default value for Unix is: >
+
+ :set isfname
+ isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=
+
+For other systems the default value is different. Thus you can make a search
+pattern with "\f" to match a file name, and it will automatically adjust to
+the system you are using it on.
+
+ Note:
+ Actually, Unix allows using just about any character in a file name,
+ including white space. Including these characters in 'isfname' would
+ be theoretically correct. But it would make it impossible to find the
+ end of a file name in text. Thus the default value of 'isfname' is a
+ compromise.
+
+The character classes are:
+
+ item matches option ~
+ \i identifier characters 'isident'
+ \I like \i, excluding digits
+ \k keyword characters 'iskeyword'
+ \K like \k, excluding digits
+ \p printable characters 'isprint'
+ \P like \p, excluding digits
+ \f file name characters 'isfname'
+ \F like \f, excluding digits
+
+==============================================================================
+*27.8* Matching a line break
+
+Vim can find a pattern that includes a line break. You need to specify where
+the line break happens, because all items mentioned so far don't match a line
+break.
+ To check for a line break in a specific place, use the "\n" item: >
+
+ /one\ntwo
+
+This will match at a line that ends in "one" and the next line starts with
+"two". To match "one two" as well, you need to match a space or a line
+break. The item to use for it is "\_s": >
+
+ /one\_stwo
+
+To allow any amount of white space: >
+
+ /one\_s\+two
+
+This also matches when "one " is at the end of a line and " two" at the
+start of the next one.
+
+"\s" matches white space, "\_s" matches white space or a line break.
+Similarly, "\a" matches an alphabetic character, and "\_a" matches an
+alphabetic character or a line break. The other character classes and ranges
+can be modified in the same way by inserting a "_".
+
+Many other items can be made to match a line break by prepending "\_". For
+example: "\_." matches any character or a line break.
+
+ Note:
+ "\_.*" matches everything until the end of the file. Be careful with
+ this, it can make a search command very slow.
+
+Another example is "\_[]", a character range that includes a line break: >
+
+ /"\_[^"]*"
+
+This finds a text in double quotes that may be split up in several lines.
+
+==============================================================================
+*27.9* Examples
+
+Here are a few search patterns you might find useful. This shows how the
+items mentioned above can be combined.
+
+
+FINDING A CALIFORNIA LICENSE PLATE
+
+A sample license plate number is "1MGU103". It has one digit, three uppercase
+letters and three digits. Directly putting this into a search pattern: >
+
+ /\d\u\u\u\d\d\d
+
+Another way is to specify that there are three digits and letters with a
+count: >
+
+ /\d\u\{3}\d\{3}
+
+Using [] ranges instead: >
+
+ /[0-9][A-Z]\{3}[0-9]\{3}
+
+Which one of these you should use? Whichever one you can remember. The
+simple way you can remember is much faster than the fancy way that you can't.
+If you can remember them all, then avoid the last one, because it's both more
+typing and slower to execute.
+
+
+FINDING AN IDENTIFIER
+
+In C programs (and many other computer languages) an identifier starts with a
+letter and further consists of letters and digits. Underscores can be used
+too. This can be found with: >
+
+ /\<\h\w*\>
+
+"\<" and "\>" are used to find only whole words. "\h" stands for "[A-Za-z_]"
+and "\w" for "[0-9A-Za-z_]".
+
+ Note:
+ "\<" and "\>" depend on the 'iskeyword' option. If it includes "-",
+ for example, then "ident-" is not matched. In this situation use: >
+
+ /\w\@<!\h\w*\w\@!
+<
+ This checks if "\w" does not match before or after the identifier.
+ See |/\@<!| and |/\@!|.
+
+==============================================================================
+
+Next chapter: |usr_28.txt| Folding
+
+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
new file mode 100644
index 0000000..d0c3516
--- /dev/null
+++ b/runtime/doc/usr_28.txt
@@ -0,0 +1,426 @@
+*usr_28.txt* For Vim version 9.0. Last change: 2008 Jun 14
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Folding
+
+
+Structured text can be separated in sections. And sections in sub-sections.
+Folding allows you to display a section as one line, providing an overview.
+This chapter explains the different ways this can be done.
+
+|28.1| What is folding?
+|28.2| Manual folding
+|28.3| Working with folds
+|28.4| Saving and restoring folds
+|28.5| Folding by indent
+|28.6| Folding with markers
+|28.7| Folding by syntax
+|28.8| Folding by expression
+|28.9| Folding unchanged lines
+|28.10| Which fold method to use?
+
+ Next chapter: |usr_29.txt| Moving through programs
+ Previous chapter: |usr_27.txt| Search commands and patterns
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*28.1* What is folding?
+
+Folding is used to show a range of lines in the buffer as a single line on the
+screen. Like a piece of paper which is folded to make it shorter:
+
+ +------------------------+
+ | line 1 |
+ | line 2 |
+ | line 3 |
+ |_______________________ |
+ \ \
+ \________________________\
+ / folded lines /
+ /________________________/
+ | line 12 |
+ | line 13 |
+ | line 14 |
+ +------------------------+
+
+The text is still in the buffer, unchanged. Only the way lines are displayed
+is affected by folding.
+
+The advantage of folding is that you can get a better overview of the
+structure of text, by folding lines of a section and replacing it with a line
+that indicates that there is a section.
+
+==============================================================================
+*28.2* Manual folding
+
+Try it out: Position the cursor in a paragraph and type: >
+
+ zfap
+
+You will see that the paragraph is replaced by a highlighted line. You have
+created a fold. |zf| is an operator and |ap| a text object selection. You
+can use the |zf| operator with any movement command to create a fold for the
+text that it moved over. |zf| also works in Visual mode.
+
+To view the text again, open the fold by typing: >
+
+ zo
+
+And you can close the fold again with: >
+
+ zc
+
+All the folding commands start with "z". With some fantasy, this looks like a
+folded piece of paper, seen from the side. The letter after the "z" has a
+mnemonic meaning to make it easier to remember the commands:
+
+ zf F-old creation
+ zo O-pen a fold
+ zc C-lose a fold
+
+Folds can be nested: A region of text that contains folds can be folded
+again. For example, you can fold each paragraph in this section, and then
+fold all the sections in this chapter. Try it out. You will notice that
+opening the fold for the whole chapter will restore the nested folds as they
+were, some may be open and some may be closed.
+
+Suppose you have created several folds, and now want to view all the text.
+You could go to each fold and type "zo". To do this faster, use this command: >
+
+ zr
+
+This will R-educe the folding. The opposite is: >
+
+ zm
+
+This folds M-ore. You can repeat "zr" and "zm" to open and close nested folds
+of several levels.
+
+If you have nested several levels deep, you can open all of them with: >
+
+ zR
+
+This R-educes folds until there are none left. And you can close all folds
+with: >
+
+ zM
+
+This folds M-ore and M-ore.
+
+You can quickly disable the folding with the |zn| command. Then |zN| brings
+back the folding as it was. |zi| toggles between the two. This is a useful
+way of working:
+- create folds to get overview on your file
+- move around to where you want to do your work
+- do |zi| to look at the text and edit it
+- do |zi| again to go back to moving around
+
+More about manual folding in the reference manual: |fold-manual|
+
+==============================================================================
+*28.3* Working with folds
+
+When some folds are closed, movement commands like "j" and "k" move over a
+fold like it was a single, empty line. This allows you to quickly move around
+over folded text.
+
+You can yank, delete and put folds as if it was a single line. This is very
+useful if you want to reorder functions in a program. First make sure that
+each fold contains a whole function (or a bit less) by selecting the right
+'foldmethod'. Then delete the function with "dd", move the cursor and put it
+with "p". If some lines of the function are above or below the fold, you can
+use Visual selection:
+- put the cursor on the first line to be moved
+- hit "V" to start Visual mode
+- put the cursor on the last line to be moved
+- hit "d" to delete the selected lines.
+- move the cursor to the new position and "p"ut the lines there.
+
+It is sometimes difficult to see or remember where a fold is located, thus
+where a |zo| command would actually work. To see the defined folds: >
+
+ :set foldcolumn=4
+
+This will show a small column on the left of the window to indicate folds.
+A "+" is shown for a closed fold. A "-" is shown at the start of each open
+fold and "|" at following lines of the fold.
+
+You can use the mouse to open a fold by clicking on the "+" in the foldcolumn.
+Clicking on the "-" or a "|" below it will close an open fold.
+
+To open all folds at the cursor line use |zO|.
+To close all folds at the cursor line use |zC|.
+To delete a fold at the cursor line use |zd|.
+To delete all folds at the cursor line use |zD|.
+
+When in Insert mode, the fold at the cursor line is never closed. That allows
+you to see what you type!
+
+Folds are opened automatically when jumping around or moving the cursor left
+or right. For example, the "0" command opens the fold under the cursor
+(if 'foldopen' contains "hor", which is the default). The 'foldopen' option
+can be changed to open folds for specific commands. If you want the line
+under the cursor always to be open, do this: >
+
+ :set foldopen=all
+
+Warning: You won't be able to move onto a closed fold then. You might want to
+use this only temporarily and then set it back to the default: >
+
+ :set foldopen&
+
+You can make folds close automatically when you move out of it: >
+
+ :set foldclose=all
+
+This will re-apply 'foldlevel' to all folds that don't contain the cursor.
+You have to try it out if you like how this feels. Use |zm| to fold more and
+|zr| to fold less (reduce folds).
+
+The folding is local to the window. This allows you to open two windows on
+the same buffer, one with folds and one without folds. Or one with all folds
+closed and one with all folds open.
+
+==============================================================================
+*28.4* Saving and restoring folds
+
+When you abandon a file (starting to edit another one), the state of the folds
+is lost. If you come back to the same file later, all manually opened and
+closed folds are back to their default. When folds have been created
+manually, all folds are gone! To save the folds use the |:mkview| command: >
+
+ :mkview
+
+This will store the settings and other things that influence the view on the
+file. You can change what is stored with the 'viewoptions' option.
+When you come back to the same file later, you can load the view again: >
+
+ :loadview
+
+You can store up to ten views on one file. For example, to save the current
+setup as the third view and load the second view: >
+
+ :mkview 3
+ :loadview 2
+
+Note that when you insert or delete lines the views might become invalid.
+Also check out the 'viewdir' option, which specifies where the views are
+stored. You might want to delete old views now and then.
+
+==============================================================================
+*28.5* Folding by indent
+
+Defining folds with |zf| is a lot of work. If your text is structured by
+giving lower level items a larger indent, you can use the indent folding
+method. This will create folds for every sequence of lines with the same
+indent. Lines with a larger indent will become nested folds. This works well
+with many programming languages.
+
+Try this by setting the 'foldmethod' option: >
+
+ :set foldmethod=indent
+
+Then you can use the |zm| and |zr| commands to fold more and reduce folding.
+It's easy to see on this example text:
+
+This line is not indented
+ This line is indented once
+ This line is indented twice
+ This line is indented twice
+ This line is indented once
+This line is not indented
+ This line is indented once
+ This line is indented once
+
+Note that the relation between the amount of indent and the fold depth depends
+on the 'shiftwidth' option. Each 'shiftwidth' worth of indent adds one to the
+depth of the fold. This is called a fold level.
+
+When you use the |zr| and |zm| commands you actually increase or decrease the
+'foldlevel' option. You could also set it directly: >
+
+ :set foldlevel=3
+
+This means that all folds with three times a 'shiftwidth' indent or more will
+be closed. The lower the foldlevel, the more folds will be closed. When
+'foldlevel' is zero, all folds are closed. |zM| does set 'foldlevel' to zero.
+The opposite command |zR| sets 'foldlevel' to the deepest fold level that is
+present in the file.
+
+Thus there are two ways to open and close the folds:
+(A) By setting the fold level.
+ This gives a very quick way of "zooming out" to view the structure of the
+ text, move the cursor, and "zoom in" on the text again.
+
+(B) By using |zo| and |zc| commands to open or close specific folds.
+ This allows opening only those folds that you want to be open, while other
+ folds remain closed.
+
+This can be combined: You can first close most folds by using |zm| a few times
+and then open a specific fold with |zo|. Or open all folds with |zR| and
+then close specific folds with |zc|.
+
+But you cannot manually define folds when 'foldmethod' is "indent", as that
+would conflict with the relation between the indent and the fold level.
+
+More about folding by indent in the reference manual: |fold-indent|
+
+==============================================================================
+*28.6* Folding with markers
+
+Markers in the text are used to specify the start and end of a fold region.
+This gives precise control over which lines are included in a fold. The
+disadvantage is that the text needs to be modified.
+
+Try it: >
+
+ :set foldmethod=marker
+
+Example text, as it could appear in a C program:
+
+ /* foobar () {{{ */
+ int foobar()
+ {
+ /* return a value {{{ */
+ return 42;
+ /* }}} */
+ }
+ /* }}} */
+
+Notice that the folded line will display the text before the marker. This is
+very useful to tell what the fold contains.
+
+It's quite annoying when the markers don't pair up correctly after moving some
+lines around. This can be avoided by using numbered markers. Example:
+
+ /* global variables {{{1 */
+ int varA, varB;
+
+ /* functions {{{1 */
+ /* funcA() {{{2 */
+ void funcA() {}
+
+ /* funcB() {{{2 */
+ void funcB() {}
+ /* }}}1 */
+
+At every numbered marker a fold at the specified level begins. This will make
+any fold at a higher level stop here. You can just use numbered start markers
+to define all folds. Only when you want to explicitly stop a fold before
+another starts you need to add an end marker.
+
+More about folding with markers in the reference manual: |fold-marker|
+
+==============================================================================
+*28.7* Folding by syntax
+
+For each language Vim uses a different syntax file. This defines the colors
+for various items in the file. If you are reading this in Vim, in a terminal
+that supports colors, the colors you see are made with the "help" syntax file.
+ In the syntax files it is possible to add syntax items that have the "fold"
+argument. These define a fold region. This requires writing a syntax file
+and adding these items in it. That's not so easy to do. But once it's done,
+all folding happens automatically.
+ Here we'll assume you are using an existing syntax file. Then there is
+nothing more to explain. You can open and close folds as explained above.
+The folds will be created and deleted automatically when you edit the file.
+
+More about folding by syntax in the reference manual: |fold-syntax|
+
+==============================================================================
+*28.8* Folding by expression
+
+This is similar to folding by indent, but instead of using the indent of a
+line a user function is called to compute the fold level of a line. You can
+use this for text where something in the text indicates which lines belong
+together. An example is an e-mail message where the quoted text is indicated
+by a ">" before the line. To fold these quotes use this: >
+
+ :set foldmethod=expr
+ :set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^>].*','',''))
+
+You can try it out on this text:
+
+> quoted text he wrote
+> quoted text he wrote
+> > double quoted text I wrote
+> > double quoted text I wrote
+
+Explanation for the 'foldexpr' used in the example (inside out):
+ getline(v:lnum) gets the current line
+ substitute(...,'\\s','','g') removes all white space from the line
+ substitute(...,'[^>].*','','') removes everything after leading '>'s
+ strlen(...) counts the length of the string, which
+ is the number of '>'s found
+
+Note that a backslash must be inserted before every space, double quote and
+backslash for the ":set" command. If this confuses you, do >
+
+ :set foldexpr
+
+to check the actual resulting value. To correct a complicated expression, use
+the command-line completion: >
+
+ :set foldexpr=<Tab>
+
+Where <Tab> is a real Tab. Vim will fill in the previous value, which you can
+then edit.
+
+When the expression gets more complicated you should put it in a function and
+set 'foldexpr' to call that function.
+
+More about folding by expression in the reference manual: |fold-expr|
+
+==============================================================================
+*28.9* Folding unchanged lines
+
+This is useful when you set the 'diff' option in the same window. The
+|vimdiff| command does this for you. Example: >
+
+ :setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1
+
+Do this in every window that shows a different version of the same file. You
+will clearly see the differences between the files, while the text that didn't
+change is folded.
+
+For more details see |fold-diff|.
+
+==============================================================================
+*28.10* Which fold method to use?
+
+All these possibilities make you wonder which method you should choose.
+Unfortunately, there is no golden rule. Here are some hints.
+
+If there is a syntax file with folding for the language you are editing, that
+is probably the best choice. If there isn't one, you might try to write it.
+This requires a good knowledge of search patterns. It's not easy, but when
+it's working you will not have to define folds manually.
+
+Typing commands to manually fold regions can be used for unstructured text.
+Then use the |:mkview| command to save and restore your folds.
+
+The marker method requires you to change the file. If you are sharing the
+files with other people or you have to meet company standards, you might not
+be allowed to add them.
+ The main advantage of markers is that you can put them exactly where you
+want them. That avoids that a few lines are missed when you cut and paste
+folds. And you can add a comment about what is contained in the fold.
+
+Folding by indent is something that works in many files, but not always very
+well. Use it when you can't use one of the other methods. However, it is
+very useful for outlining. Then you specifically use one 'shiftwidth' for
+each nesting level.
+
+Folding with expressions can make folds in almost any structured text. It is
+quite simple to specify, especially if the start and end of a fold can easily
+be recognized.
+ If you use the "expr" method to define folds, but they are not exactly how
+you want them, you could switch to the "manual" method. This will not remove
+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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_29.txt b/runtime/doc/usr_29.txt
new file mode 100644
index 0000000..20712f2
--- /dev/null
+++ b/runtime/doc/usr_29.txt
@@ -0,0 +1,614 @@
+*usr_29.txt* For Vim version 9.0. Last change: 2022 Mar 13
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Moving through programs
+
+
+The creator of Vim is a computer programmer. It's no surprise that Vim
+contains many features to aid in writing programs. Jump around to find where
+identifiers are defined and used. Preview declarations in a separate window.
+There is more in the next chapter.
+
+|29.1| Using tags
+|29.2| The preview window
+|29.3| Moving through a program
+|29.4| Finding global identifiers
+|29.5| Finding local identifiers
+
+ Next chapter: |usr_30.txt| Editing programs
+ Previous chapter: |usr_28.txt| Folding
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*29.1* Using tags
+
+What is a tag? It is a location where an identifier is defined. An example
+is a function definition in a C or C++ program. A list of tags is kept in a
+tags file. This can be used by Vim to directly jump from any place to the
+tag, the place where an identifier is defined.
+ To generate the tags file for all C files in the current directory, use the
+following command: >
+
+ ctags *.c
+
+"ctags" is a separate program. Most Unix systems already have it installed.
+If you do not have it yet, you can find Universal/Exuberant ctags at:
+ http://ctags.io ~
+ http://ctags.sf.net ~
+
+Universal ctags is preferred, Exuberant ctags is no longer being developed.
+
+Now when you are in Vim and you want to go to a function definition, you can
+jump to it by using the following command: >
+
+ :tag startlist
+
+This command will find the function "startlist" even if it is in another file.
+ The CTRL-] command jumps to the tag of the word that is under the cursor.
+This makes it easy to explore a tangle of C code. Suppose, for example, that
+you are in the function "write_block". You can see that it calls
+"write_line". But what does "write_line" do? By placing the cursor on the
+call to "write_line" and pressing CTRL-], you jump to the definition of this
+function.
+ The "write_line" function calls "write_char". You need to figure out what
+it does. So you position the cursor over the call to "write_char" and press
+CTRL-]. Now you are at the definition of "write_char".
+
+ +-------------------------------------+
+ |void write_block(char **s; int cnt) |
+ |{ |
+ | int i; |
+ | for (i = 0; i < cnt; ++i) |
+ | write_line(s[i]); |
+ |} | |
+ +-----------|-------------------------+
+ |
+ CTRL-] |
+ | +----------------------------+
+ +--> |void write_line(char *s) |
+ |{ |
+ | while (*s != 0) |
+ | write_char(*s++); |
+ |} | |
+ +--------|-------------------+
+ |
+ CTRL-] |
+ | +------------------------------------+
+ +--> |void write_char(char c) |
+ |{ |
+ | putchar((int)(unsigned char)c); |
+ |} |
+ +------------------------------------+
+
+The ":tags" command shows the list of tags that you traversed through:
+
+ :tags
+ # TO tag FROM line in file/text ~
+ 1 1 write_line 8 write_block.c ~
+ 2 1 write_char 7 write_line.c ~
+ > ~
+>
+Now to go back. The CTRL-T command goes to the preceding tag. In the example
+above you get back to the "write_line" function, in the call to "write_char".
+ This command takes a count argument that indicates how many tags to jump
+back. You have gone forward, and now back. Let's go forward again. The
+following command goes to the tag on top of the list: >
+
+ :tag
+
+You can prefix it with a count and jump forward that many tags. For example:
+":3tag". CTRL-T also can be preceded with a count.
+ These commands thus allow you to go down a call tree with CTRL-] and back
+up again with CTRL-T. Use ":tags" to find out where you are.
+
+
+SPLIT WINDOWS
+
+The ":tag" command replaces the file in the current window with the one
+containing the new function. But suppose you want to see not only the old
+function but also the new one? You can split the window using the ":split"
+command followed by the ":tag" command. Vim has a shorthand command that does
+both: >
+ :stag tagname
+
+To split the current window and jump to the tag under the cursor use this
+command: >
+
+ CTRL-W ]
+
+If a count is specified, the new window will be that many lines high.
+
+
+MORE TAGS FILES
+
+When you have files in many directories, you can create a tags file in each of
+them. Vim will then only be able to jump to tags within that directory.
+ To find more tags files, set the 'tags' option to include all the relevant
+tags files. Example: >
+
+ :set tags=./tags,./../tags,./*/tags
+
+This finds a tags file in the same directory as the current file, one
+directory level higher and in all subdirectories.
+ This is quite a number of tags files, but it may still not be enough. For
+example, when editing a file in "~/proj/src", you will not find the tags file
+"~/proj/sub/tags". For this situation Vim offers to search a whole directory
+tree for tags files. Example: >
+
+ :set tags=~/proj/**/tags
+
+
+ONE TAGS FILE
+
+When Vim has to search many places for tags files, you can hear the disk
+rattling. It may get a bit slow. In that case it's better to spend this
+time while generating one big tags file. You might do this overnight.
+ This requires the Universal or Exuberant ctags program, mentioned above.
+It offers an argument to search a whole directory tree: >
+
+ cd ~/proj
+ ctags -R .
+
+The nice thing about this is that Universal/Exuberant ctags recognizes various
+file types. Thus this doesn't work just for C and C++ programs, also for
+Eiffel and even Vim scripts. See the ctags documentation to tune this.
+ Now you only need to tell Vim where your big tags file is: >
+
+ :set tags=~/proj/tags
+
+
+MULTIPLE MATCHES
+
+When a function is defined multiple times (or a method in several classes),
+the ":tag" command will jump to the first one. If there is a match in the
+current file, that one is used first.
+ You can now jump to other matches for the same tag with: >
+
+ :tnext
+
+Repeat this to find further matches. If there are many, you can select which
+one to jump to: >
+
+ :tselect tagname
+
+Vim will present you with a list of choices:
+
+ # pri kind tag file ~
+ 1 F f mch_init os_amiga.c ~
+ mch_init() ~
+ 2 F f mch_init os_mac.c ~
+ mch_init() ~
+ 3 F f mch_init os_msdos.c ~
+ mch_init(void) ~
+ 4 F f mch_init os_riscos.c ~
+ mch_init() ~
+ Enter nr of choice (<CR> to abort): ~
+
+You can now enter the number (in the first column) of the match that you would
+like to jump to. The information in the other columns give you a good idea of
+where the match is defined.
+
+To move between the matching tags, these commands can be used:
+
+ :tfirst go to first match
+ :[count]tprevious go to [count] previous match
+ :[count]tnext go to [count] next match
+ :tlast go to last match
+
+If [count] is omitted then one is used.
+
+
+GUESSING TAG NAMES
+
+Command line completion is a good way to avoid typing a long tag name. Just
+type the first bit and press <Tab>: >
+
+ :tag write_<Tab>
+
+You will get the first match. If it's not the one you want, press <Tab> until
+you find the right one.
+ Sometimes you only know part of the name of a function. Or you have many
+tags that start with the same string, but end differently. Then you can tell
+Vim to use a pattern to find the tag.
+ Suppose you want to jump to a tag that contains "block". First type
+this: >
+
+ :tag /block
+
+Now use command line completion: press <Tab>. Vim will find all tags that
+contain "block" and use the first match.
+ The "/" before a tag name tells Vim that what follows is not a literal tag
+name, but a pattern. You can use all the items for search patterns here. For
+example, suppose you want to select a tag that starts with "write_": >
+
+ :tselect /^write_
+
+The "^" specifies that the tag starts with "write_". Otherwise it would also
+be found halfway a tag name. Similarly "$" at the end makes sure the pattern
+matches until the end of a tag.
+
+
+A TAGS BROWSER
+
+Since CTRL-] takes you to the definition of the identifier under the cursor,
+you can use a list of identifier names as a table of contents. Here is an
+example.
+ First create a list of identifiers (this requires Universal or Exuberant
+ctags): >
+
+ ctags --c-types=f -f functions *.c
+
+Now start Vim without a file, and edit this file in Vim, in a vertically split
+window: >
+
+ vim
+ :vsplit functions
+
+The window contains a list of all the functions. There is some more stuff,
+but you can ignore that. Do ":setlocal ts=99" to clean it up a bit.
+ In this window, define a mapping: >
+
+ :nnoremap <buffer> <CR> 0ye<C-W>w:tag <C-R>"<CR>
+
+Move the cursor to the line that contains the function you want to go to.
+Now press <Enter>. Vim will go to the other window and jump to the selected
+function.
+
+
+RELATED ITEMS
+
+To make case in tag names be ignored, you can set 'ignorecase' while leaving
+'tagcase' as "followic", or set 'tagcase' to "ignore".
+
+The 'tagbsearch' option tells if the tags file is sorted or not. The default
+is to assume a sorted tags file, which makes a tags search a lot faster, but
+doesn't work if the tags file isn't sorted.
+
+The 'taglength' option can be used to tell Vim the number of significant
+characters in a tag.
+
+Cscope is a free program. It does not only find places where an identifier is
+declared, but also where it is used. See |cscope|.
+
+==============================================================================
+*29.2* The preview window
+
+When you edit code that contains a function call, you need to use the correct
+arguments. To know what values to pass you can look at how the function is
+defined. The tags mechanism works very well for this. Preferably the
+definition is displayed in another window. For this the preview window can be
+used.
+ To open a preview window to display the function "write_char": >
+
+ :ptag write_char
+
+Vim will open a window, and jumps to the tag "write_char". Then it takes you
+back to the original position. Thus you can continue typing without the need
+to use a CTRL-W command.
+ If the name of a function appears in the text, you can get its definition
+in the preview window with: >
+
+ CTRL-W }
+
+There is a script that automatically displays the text where the word under
+the cursor was defined. See |CursorHold-example|.
+
+To close the preview window use this command: >
+
+ :pclose
+
+To edit a specific file in the preview window, use ":pedit". This can be
+useful to edit a header file, for example: >
+
+ :pedit defs.h
+
+Finally, ":psearch" can be used to find a word in the current file and any
+included files and display the match in the preview window. This is
+especially useful when using library functions, for which you do not have a
+tags file. Example: >
+
+ :psearch popen
+
+This will show the "stdio.h" file in the preview window, with the function
+prototype for popen():
+
+ FILE *popen __P((const char *, const char *)); ~
+
+You can specify the height of the preview window, when it is opened, with the
+'previewheight' option.
+
+==============================================================================
+*29.3* Moving through a program
+
+Since a program is structured, Vim can recognize items in it. Specific
+commands can be used to move around.
+ C programs often contain constructs like this:
+
+ #ifdef USE_POPEN ~
+ fd = popen("ls", "r") ~
+ #else ~
+ fd = fopen("tmp", "w") ~
+ #endif ~
+
+But then much longer, and possibly nested. Position the cursor on the
+"#ifdef" and press %. Vim will jump to the "#else". Pressing % again takes
+you to the "#endif". Another % takes you to the "#ifdef" again.
+ When the construct is nested, Vim will find the matching items. This is a
+good way to check if you didn't forget an "#endif".
+ When you are somewhere inside a "#if" - "#endif", you can jump to the start
+of it with: >
+
+ [#
+
+If you are not after a "#if" or "#ifdef" Vim will beep. To jump forward to
+the next "#else" or "#endif" use: >
+
+ ]#
+
+These two commands skip any "#if" - "#endif" blocks that they encounter.
+Example:
+
+ #if defined(HAS_INC_H) ~
+ a = a + inc(); ~
+ # ifdef USE_THEME ~
+ a += 3; ~
+ # endif ~
+ set_width(a); ~
+
+With the cursor in the last line, "[#" moves to the first line. The "#ifdef"
+- "#endif" block in the middle is skipped.
+
+
+MOVING IN CODE BLOCKS
+
+In C code blocks are enclosed in {}. These can get pretty long. To move to
+the start of the outer block use the "[[" command. Use "][" to find the end.
+This assumes that the "{" and "}" are in the first column.
+ The "[{" command moves to the start of the current block. It skips over
+pairs of {} at the same level. "]}" jumps to the end.
+ An overview:
+
+ function(int a)
+ +-> {
+ | if (a)
+ | +-> {
+ [[ | | for (;;) --+
+ | | +-> { |
+ | [{ | | foo(32); | --+
+ | | [{ | if (bar(a)) --+ | ]} |
+ +-- | +-- break; | ]} | |
+ | } <-+ | | ][
+ +-- foobar(a) | |
+ } <-+ |
+ } <-+
+
+When writing C++ or Java, the outer {} block is for the class. The next level
+of {} is for a method. When somewhere inside a class use "[m" to find the
+previous start of a method. "]m" finds the next start of a method.
+
+Additionally, "[]" moves backward to the end of a function and "]]" moves
+forward to the start of the next function. The end of a function is defined
+by a "}" in the first column.
+
+ int func1(void)
+ {
+ return 1;
+ +----------> }
+ |
+ [] | int func2(void)
+ | +-> {
+ | [[ | if (flag)
+ start +-- +-- return flag;
+ | ][ | return 2;
+ | +-> }
+ ]] |
+ | int func3(void)
+ +----------> {
+ return 3;
+ }
+
+Don't forget you can also use "%" to move between matching (), {} and [].
+That also works when they are many lines apart.
+
+
+MOVING IN BRACES
+
+The "[(" and "])" commands work similar to "[{" and "]}", except that they
+work on () pairs instead of {} pairs.
+>
+ [(
+< <--------------------------------
+ <-------
+ if (a == b && (c == d || (e > f)) && x > y) ~
+ -------------->
+ --------------------------------> >
+ ])
+
+MOVING IN COMMENTS
+
+To move back to the start of a comment use "[/". Move forward to the end of a
+comment with "]/". This only works for /* - */ comments.
+
+ +-> +-> /*
+ | [/ | * A comment about --+
+ [/ | +-- * wonderful life. | ]/
+ | */ <-+
+ |
+ +-- foo = bar * 3; --+
+ | ]/
+ /* a short comment */ <-+
+
+==============================================================================
+*29.4* Finding global identifiers
+
+You are editing a C program and wonder if a variable is declared as "int" or
+"unsigned". A quick way to find this is with the "[I" command.
+ Suppose the cursor is on the word "column". Type: >
+
+ [I
+
+Vim will list the matching lines it can find. Not only in the current file,
+but also in all included files (and files included in them, etc.). The result
+looks like this:
+
+ structs.h ~
+ 1: 29 unsigned column; /* column number */ ~
+
+The advantage over using tags or the preview window is that included files are
+searched. In most cases this results in the right declaration to be found.
+Also when the tags file is out of date. Also when you don't have tags for the
+included files.
+ However, a few things must be right for "[I" to do its work. First of all,
+the 'include' option must specify how a file is included. The default value
+works for C and C++. For other languages you will have to change it.
+
+
+LOCATING INCLUDED FILES
+
+ Vim will find included files in the places specified with the 'path'
+option. If a directory is missing, some include files will not be found. You
+can discover this with this command: >
+
+ :checkpath
+
+It will list the include files that could not be found. Also files included
+by the files that could be found. An example of the output:
+
+ --- Included files not found in path --- ~
+ <io.h> ~
+ vim.h --> ~
+ <functions.h> ~
+ <clib/exec_protos.h> ~
+
+The "io.h" file is included by the current file and can't be found. "vim.h"
+can be found, thus ":checkpath" goes into this file and checks what it
+includes. The "functions.h" and "clib/exec_protos.h" files, included by
+"vim.h" are not found.
+
+ Note:
+ Vim is not a compiler. It does not recognize "#ifdef" statements.
+ This means every "#include" statement is used, also when it comes
+ after "#if NEVER".
+
+To fix the files that could not be found, add a directory to the 'path'
+option. A good place to find out about this is the Makefile. Look out for
+lines that contain "-I" items, like "-I/usr/local/X11". To add this directory
+use: >
+
+ :set path+=/usr/local/X11
+
+When there are many subdirectories, you can use the "*" wildcard. Example: >
+
+ :set path+=/usr/*/include
+
+This would find files in "/usr/local/include" as well as "/usr/X11/include".
+
+When working on a project with a whole nested tree of included files, the "**"
+items is useful. This will search down in all subdirectories. Example: >
+
+ :set path+=/projects/invent/**/include
+
+This will find files in the directories:
+
+ /projects/invent/include ~
+ /projects/invent/main/include ~
+ /projects/invent/main/os/include ~
+ etc.
+
+There are even more possibilities. Check out the 'path' option for info.
+ If you want to see which included files are actually found, use this
+command: >
+
+ :checkpath!
+
+You will get a (very long) list of included files, the files they include, and
+so on. To shorten the list a bit, Vim shows "(Already listed)" for files that
+were found before and doesn't list the included files in there again.
+
+
+JUMPING TO A MATCH
+
+"[I" produces a list with only one line of text. When you want to have a
+closer look at the first item, you can jump to that line with the command: >
+
+ [<Tab>
+
+You can also use "[ CTRL-I", since CTRL-I is the same as pressing <Tab>.
+
+The list that "[I" produces has a number at the start of each line. When you
+want to jump to another item than the first one, type the number first: >
+
+ 3[<Tab>
+
+Will jump to the third item in the list. Remember that you can use CTRL-O to
+jump back to where you started from.
+
+
+RELATED COMMANDS
+
+ [i only lists the first match
+ ]I only lists items below the cursor
+ ]i only lists the first item below the cursor
+
+
+FINDING DEFINED IDENTIFIERS
+
+The "[I" command finds any identifier. To find only macros, defined with
+"#define" use: >
+
+ [D
+
+Again, this searches in included files. The 'define' option specifies what a
+line looks like that defines the items for "[D". You could change it to make
+it work with other languages than C or C++.
+ The commands related to "[D" are:
+
+ [d only lists the first match
+ ]D only lists items below the cursor
+ ]d only lists the first item below the cursor
+
+==============================================================================
+*29.5* Finding local identifiers
+
+The "[I" command searches included files. To search in the current file only,
+and jump to the first place where the word under the cursor is used: >
+
+ gD
+
+Hint: Goto Definition. This command is very useful to find a variable or
+function that was declared locally ("static", in C terms). Example (cursor on
+"counter"):
+
+ +-> static int counter = 0;
+ |
+ | int get_counter(void)
+ gD | {
+ | ++counter;
+ +-- return counter;
+ }
+
+To restrict the search even further, and look only in the current function,
+use this command: >
+
+ gd
+
+This will go back to the start of the current function and find the first
+occurrence of the word under the cursor. Actually, it searches backwards to
+an empty line above a "{" in the first column. From there it searches forward
+for the identifier. Example (cursor on "idx"):
+
+ int find_entry(char *name)
+ {
+ +-> int idx;
+ |
+ gd | for (idx = 0; idx < table_len; ++idx)
+ | if (strcmp(table[idx].name, name) == 0)
+ +-- return idx;
+ }
+
+==============================================================================
+
+Next chapter: |usr_30.txt| Editing programs
+
+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
new file mode 100644
index 0000000..a23df96
--- /dev/null
+++ b/runtime/doc/usr_30.txt
@@ -0,0 +1,643 @@
+*usr_30.txt* For Vim version 9.0. Last change: 2007 Nov 10
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Editing programs
+
+
+Vim has various commands that aid in writing computer programs. Compile a
+program and directly jump to reported errors. Automatically set the indent
+for many languages and format comments.
+
+|30.1| Compiling
+|30.2| Indenting C files
+|30.3| Automatic indenting
+|30.4| Other indenting
+|30.5| Tabs and spaces
+|30.6| Formatting comments
+
+ Next chapter: |usr_31.txt| Exploiting the GUI
+ Previous chapter: |usr_29.txt| Moving through programs
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*30.1* Compiling
+
+Vim has a set of so called "quickfix" commands. They enable you to compile a
+program from within Vim and then go through the errors generated and fix them
+(hopefully). You can then recompile and fix any new errors that are found
+until finally your program compiles without any error.
+
+The following command runs the program "make" (supplying it with any argument
+you give) and captures the results: >
+
+ :make {arguments}
+
+If errors were generated, they are captured and the editor positions you where
+the first error occurred.
+ Take a look at an example ":make" session. (Typical :make sessions generate
+far more errors and fewer stupid ones.) After typing ":make" the screen looks
+like this:
+
+ :!make | &tee /tmp/vim215953.err ~
+ gcc -g -Wall -o prog main.c sub.c ~
+ main.c: In function 'main': ~
+ main.c:6: too many arguments to function 'do_sub' ~
+ main.c: At top level: ~
+ main.c:10: parse error before '}' ~
+ make: *** [prog] Error 1 ~
+
+ 2 returned ~
+ "main.c" 11L, 111C ~
+ (3 of 6): too many arguments to function 'do_sub' ~
+ Press ENTER or type command to continue ~
+
+From this you can see that you have errors in the file "main.c". When you
+press <Enter>, Vim displays the file "main.c", with the cursor positioned on
+line 6, the first line with an error. You did not need to specify the file or
+the line number, Vim knew where to go by looking in the error messages.
+
+ +---------------------------------------------------+
+ |int main() |
+ |{ |
+ | int i=3; |
+ cursor -> | do_sub("foo"); |
+ | ++i; |
+ | return (0); |
+ |} |
+ |} |
+ | ~ |
+ |(3 of 12): too many arguments to function 'do_sub' |
+ +---------------------------------------------------+
+
+The following command goes to where the next error occurs: >
+
+ :cnext
+
+Vim jumps to line 10, the last line in the file, where there is an extra '}'.
+ When there is not enough room, Vim will shorten the error message. To see
+the whole message use: >
+
+ :cc
+
+You can get an overview of all the error messages with the ":clist" command.
+The output looks like this: >
+
+ :clist
+< 3 main.c: 6:too many arguments to function 'do_sub' ~
+ 5 main.c: 10:parse error before '}' ~
+
+Only the lines where Vim recognized a file name and line number are listed
+here. It assumes those are the interesting lines and the rest is just boring
+messages. However, sometimes unrecognized lines do contain something you want
+to see. Output from the linker, for example, about an undefined function.
+To see all the messages add a "!" to the command: >
+
+ :clist!
+< 1 gcc -g -Wall -o prog main.c sub.c ~
+ 2 main.c: In function 'main': ~
+ 3 main.c:6: too many arguments to function 'do_sub' ~
+ 4 main.c: At top level: ~
+ 5 main.c:10: parse error before '}' ~
+ 6 make: *** [prog] Error 1 ~
+
+Vim will highlight the current error. To go back to the previous error, use:
+>
+ :cprevious
+
+Other commands to move around in the error list:
+
+ :cfirst to first error
+ :clast to last error
+ :cc 3 to error nr 3
+
+
+USING ANOTHER COMPILER
+
+The name of the program to run when the ":make" command is executed is defined
+by the 'makeprg' option. Usually this is set to "make", but Visual C++ users
+should set this to "nmake" by executing the following command: >
+
+ :set makeprg=nmake
+
+You can also include arguments in this option. Special characters need to
+be escaped with a backslash. Example: >
+
+ :set makeprg=nmake\ -f\ project.mak
+
+You can include special Vim keywords in the command specification. The %
+character expands to the name of the current file. So if you execute the
+command: >
+ :set makeprg=make\ %:S
+
+When you are editing main.c, then ":make" executes the following command: >
+
+ make main.c
+
+This is not too useful, so you will refine the command a little and use the :r
+(root) modifier: >
+
+ :set makeprg=make\ %:r:S.o
+
+Now the command executed is as follows: >
+
+ make main.o
+
+More about these modifiers here: |filename-modifiers|.
+
+
+OLD ERROR LISTS
+
+Suppose you ":make" a program. There is a warning message in one file and an
+error message in another. You fix the error and use ":make" again to check if
+it was really fixed. Now you want to look at the warning message. It doesn't
+show up in the last error list, since the file with the warning wasn't
+compiled again. You can go back to the previous error list with: >
+
+ :colder
+
+Then use ":clist" and ":cc {nr}" to jump to the place with the warning.
+ To go forward to the next error list: >
+
+ :cnewer
+
+Vim remembers ten error lists.
+
+
+SWITCHING COMPILERS
+
+You have to tell Vim what format the error messages are that your compiler
+produces. This is done with the 'errorformat' option. The syntax of this
+option is quite complicated and it can be made to fit almost any compiler.
+You can find the explanation here: |errorformat|.
+
+You might be using various different compilers. Setting the 'makeprg' option,
+and especially the 'errorformat' each time is not easy. Vim offers a simple
+method for this. For example, to switch to using the Microsoft Visual C++
+compiler: >
+
+ :compiler msvc
+
+This will find the Vim script for the "msvc" compiler and set the appropriate
+options.
+ You can write your own compiler files. See |write-compiler-plugin|.
+
+
+OUTPUT REDIRECTION
+
+The ":make" command redirects the output of the executed program to an error
+file. How this works depends on various things, such as the 'shell'. If your
+":make" command doesn't capture the output, check the 'makeef' and
+'shellpipe' options. The 'shellquote' and 'shellxquote' options might also
+matter.
+
+In case you can't get ":make" to redirect the file for you, an alternative is
+to compile the program in another window and redirect the output into a file.
+Then have Vim read this file with: >
+
+ :cfile {filename}
+
+Jumping to errors will work like with the ":make" command.
+
+==============================================================================
+*30.2* Indenting C style text
+
+A program is much easier to understand when the lines have been properly
+indented. Vim offers various ways to make this less work. For C or C style
+programs like Java or C++, set the 'cindent' option. Vim knows a lot about C
+programs and will try very hard to automatically set the indent for you. Set
+the 'shiftwidth' option to the amount of spaces you want for a deeper level.
+Four spaces will work fine. One ":set" command will do it: >
+
+ :set cindent shiftwidth=4
+
+With this option enabled, when you type something such as "if (x)", the next
+line will automatically be indented an additional level.
+
+ if (flag)
+ Automatic indent ---> do_the_work();
+ Automatic unindent <-- if (other_flag) {
+ Automatic indent ---> do_file();
+ keep indent do_some_more();
+ Automatic unindent <-- }
+
+When you type something in curly braces ({}), the text will be indented at the
+start and unindented at the end. The unindenting will happen after typing the
+'}', since Vim can't guess what you are going to type.
+
+One side effect of automatic indentation is that it helps you catch errors in
+your code early. When you type a } to finish a function, only to find that
+the automatic indentation gives it more indent than what you expected, there
+is probably a } missing. Use the "%" command to find out which { matches the
+} you typed.
+ A missing ) and ; also cause extra indent. Thus if you get more white
+space than you would expect, check the preceding lines.
+
+When you have code that is badly formatted, or you inserted and deleted lines,
+you need to re-indent the lines. The "=" operator does this. The simplest
+form is: >
+
+ ==
+
+This indents the current line. Like with all operators, there are three ways
+to use it. In Visual mode "=" indents the selected lines. A useful text
+object is "a{". This selects the current {} block. Thus, to re-indent the
+code block the cursor is in: >
+
+ =a{
+
+I you have really badly indented code, you can re-indent the whole file with:
+>
+ gg=G
+
+However, don't do this in files that have been carefully indented manually.
+The automatic indenting does a good job, but in some situations you might want
+to overrule it.
+
+
+SETTING INDENT STYLE
+
+Different people have different styles of indentation. By default Vim does a
+pretty good job of indenting in a way that 90% of programmers do. There are
+different styles, however; so if you want to, you can customize the
+indentation style with the 'cinoptions' option.
+ By default 'cinoptions' is empty and Vim uses the default style. You can
+add various items where you want something different. For example, to make
+curly braces be placed like this:
+
+ if (flag) ~
+ { ~
+ i = 8; ~
+ j = 0; ~
+ } ~
+
+Use this command: >
+
+ :set cinoptions+={2
+
+There are many of these items. See |cinoptions-values|.
+
+==============================================================================
+*30.3* Automatic indenting
+
+You don't want to switch on the 'cindent' option manually every time you edit
+a C file. This is how you make it work automatically: >
+
+ :filetype indent on
+
+Actually, this does a lot more than switching on 'cindent' for C files. First
+of all, it enables detecting the type of a file. That's the same as what is
+used for syntax highlighting.
+ When the filetype is known, Vim will search for an indent file for this
+type of file. The Vim distribution includes a number of these for various
+programming languages. This indent file will then prepare for automatic
+indenting specifically for this file.
+
+If you don't like the automatic indenting, you can switch it off again: >
+
+ :filetype indent off
+
+If you don't like the indenting for one specific type of file, this is how you
+avoid it. Create a file with just this one line: >
+
+ :let b:did_indent = 1
+
+Now you need to write this in a file with a specific name:
+
+ {directory}/indent/{filetype}.vim
+
+The {filetype} is the name of the file type, such as "cpp" or "java". You can
+see the exact name that Vim detected with this command: >
+
+ :set filetype
+
+In this file the output is:
+
+ filetype=help ~
+
+Thus you would use "help" for {filetype}.
+ For the {directory} part you need to use your runtime directory. Look at
+the output of this command: >
+
+ set runtimepath
+
+Now use the first item, the name before the first comma. Thus if the output
+looks like this:
+
+ runtimepath=~/.vim,/usr/local/share/vim/vim60/runtime,~/.vim/after ~
+
+You use "~/.vim" for {directory}. Then the resulting file name is:
+
+ ~/.vim/indent/help.vim ~
+
+Instead of switching the indenting off, you could write your own indent file.
+How to do that is explained here: |indent-expression|.
+
+==============================================================================
+*30.4* Other indenting
+
+The simplest form of automatic indenting is with the 'autoindent' option.
+It uses the indent from the previous line. A bit smarter is the 'smartindent'
+option. This is useful for languages where no indent file is available.
+'smartindent' is not as smart as 'cindent', but smarter than 'autoindent'.
+ With 'smartindent' set, an extra level of indentation is added for each {
+and removed for each }. An extra level of indentation will also be added for
+any of the words in the 'cinwords' option. Lines that begin with # are
+treated specially: all indentation is removed. This is done so that
+preprocessor directives will all start in column 1. The indentation is
+restored for the next line.
+
+
+CORRECTING INDENTS
+
+When you are using 'autoindent' or 'smartindent' to get the indent of the
+previous line, there will be many times when you need to add or remove one
+'shiftwidth' worth of indent. A quick way to do this is using the CTRL-D and
+CTRL-T commands in Insert mode.
+ For example, you are typing a shell script that is supposed to look like
+this:
+
+ if test -n a; then ~
+ echo a ~
+ echo "-------" ~
+ fi ~
+
+Start off by setting these options: >
+
+ :set autoindent shiftwidth=3
+
+You start by typing the first line, <Enter> and the start of the second line:
+
+ if test -n a; then ~
+ echo ~
+
+Now you see that you need an extra indent. Type CTRL-T. The result:
+
+ if test -n a; then ~
+ echo ~
+
+The CTRL-T command, in Insert mode, adds one 'shiftwidth' to the indent, no
+matter where in the line you are.
+ You continue typing the second line, <Enter> and the third line. This time
+the indent is OK. Then <Enter> and the last line. Now you have this:
+
+ if test -n a; then ~
+ echo a ~
+ echo "-------" ~
+ fi ~
+
+To remove the superfluous indent in the last line press CTRL-D. This deletes
+one 'shiftwidth' worth of indent, no matter where you are in the line.
+ When you are in Normal mode, you can use the ">>" and "<<" commands to
+shift lines. ">" and "<" are operators, thus you have the usual three ways to
+specify the lines you want to indent. A useful combination is: >
+
+ >i{
+
+This adds one indent to the current block of lines, inside {}. The { and }
+lines themselves are left unmodified. ">a{" includes them. In this example
+the cursor is on "printf":
+
+ original text after ">i{" after ">a{"
+
+ if (flag) if (flag) if (flag) ~
+ { { { ~
+ printf("yes"); printf("yes"); printf("yes"); ~
+ flag = 0; flag = 0; flag = 0; ~
+ } } } ~
+
+==============================================================================
+*30.5* Tabs and spaces
+
+'tabstop' is set to eight by default. Although you can change it, you quickly
+run into trouble later. Other programs won't know what tabstop value you
+used. They probably use the default value of eight, and your text suddenly
+looks very different. Also, most printers use a fixed tabstop value of eight.
+Thus it's best to keep 'tabstop' alone. (If you edit a file which was written
+with a different tabstop setting, see |25.3| for how to fix that.)
+ For indenting lines in a program, using a multiple of eight spaces makes
+you quickly run into the right border of the window. Using a single space
+doesn't provide enough visual difference. Many people prefer to use four
+spaces, a good compromise.
+ Since a <Tab> is eight spaces and you want to use an indent of four spaces,
+you can't use a <Tab> character to make your indent. There are two ways to
+handle this:
+
+1. Use a mix of <Tab> and space characters. Since a <Tab> takes the place of
+ eight spaces, you have fewer characters in your file. Inserting a <Tab>
+ is quicker than eight spaces. Backspacing works faster as well.
+
+2. Use spaces only. This avoids the trouble with programs that use a
+ different tabstop value.
+
+Fortunately, Vim supports both methods quite well.
+
+
+SPACES AND TABS
+
+If you are using a combination of tabs and spaces, you just edit normally.
+The Vim defaults do a fine job of handling things.
+ You can make life a little easier by setting the 'softtabstop' option.
+This option tells Vim to make the <Tab> key look and feel as if tabs were set
+at the value of 'softtabstop', but actually use a combination of tabs and
+spaces.
+ After you execute the following command, every time you press the <Tab> key
+the cursor moves to the next 4-column boundary: >
+
+ :set softtabstop=4
+
+When you start in the first column and press <Tab>, you get 4 spaces inserted
+in your text. The second time, Vim takes out the 4 spaces and puts in a <Tab>
+(thus taking you to column 8). Thus Vim uses as many <Tab>s as possible, and
+then fills up with spaces.
+ When backspacing it works the other way around. A <BS> will always delete
+the amount specified with 'softtabstop'. Then <Tab>s are used as many as
+possible and spaces to fill the gap.
+ The following shows what happens pressing <Tab> a few times, and then using
+<BS>. A "." stands for a space and "------->" for a <Tab>.
+
+ type result ~
+ <Tab> ....
+ <Tab><Tab> ------->
+ <Tab><Tab><Tab> ------->....
+ <Tab><Tab><Tab><BS> ------->
+ <Tab><Tab><Tab><BS><BS> ....
+
+An alternative is to use the 'smarttab' option. When it's set, Vim uses
+'shiftwidth' for a <Tab> typed in the indent of a line, and a real <Tab> when
+typed after the first non-blank character. However, <BS> doesn't work like
+with 'softtabstop'.
+
+
+JUST SPACES
+
+If you want absolutely no tabs in your file, you can set the 'expandtab'
+option: >
+
+ :set expandtab
+
+When this option is set, the <Tab> key inserts a series of spaces. Thus you
+get the same amount of white space as if a <Tab> character was inserted, but
+there isn't a real <Tab> character in your file.
+ The backspace key will delete each space by itself. Thus after typing one
+<Tab> you have to press the <BS> key up to eight times to undo it. If you are
+in the indent, pressing CTRL-D will be a lot quicker.
+
+
+CHANGING TABS IN SPACES (AND BACK)
+
+Setting 'expandtab' does not affect any existing tabs. In other words, any
+tabs in the document remain tabs. If you want to convert tabs to spaces, use
+the ":retab" command. Use these commands: >
+
+ :set expandtab
+ :%retab
+
+Now Vim will have changed all indents to use spaces instead of tabs. However,
+all tabs that come after a non-blank character are kept. If you want these to
+be converted as well, add a !: >
+
+ :%retab!
+
+This is a little bit dangerous, because it can also change tabs inside a
+string. To check if these exist, you could use this: >
+
+ /"[^"\t]*\t[^"]*"
+
+It's recommended not to use hard tabs inside a string. Replace them with
+"\t" to avoid trouble.
+
+The other way around works just as well: >
+
+ :set noexpandtab
+ :%retab!
+
+==============================================================================
+*30.6* Formatting comments
+
+One of the great things about Vim is that it understands comments. You can
+ask Vim to format a comment and it will do the right thing.
+ Suppose, for example, that you have the following comment:
+
+ /* ~
+ * This is a test ~
+ * of the text formatting. ~
+ */ ~
+
+You then ask Vim to format it by positioning the cursor at the start of the
+comment and type: >
+
+ gq]/
+
+"gq" is the operator to format text. "]/" is the motion that takes you to the
+end of a comment. The result is:
+
+ /* ~
+ * This is a test of the text formatting. ~
+ */ ~
+
+Notice that Vim properly handled the beginning of each line.
+ An alternative is to select the text that is to be formatted in Visual mode
+and type "gq".
+
+To add a new line to the comment, position the cursor on the middle line and
+press "o". The result looks like this:
+
+ /* ~
+ * This is a test of the text formatting. ~
+ * ~
+ */ ~
+
+Vim has automatically inserted a star and a space for you. Now you can type
+the comment text. When it gets longer than 'textwidth', Vim will break the
+line. Again, the star is inserted automatically:
+
+ /* ~
+ * This is a test of the text formatting. ~
+ * Typing a lot of text here will make Vim ~
+ * break ~
+ */ ~
+
+For this to work some flags must be present in 'formatoptions':
+
+ r insert the star when typing <Enter> in Insert mode
+ o insert the star when using "o" or "O" in Normal mode
+ c break comment text according to 'textwidth'
+
+See |fo-table| for more flags.
+
+
+DEFINING A COMMENT
+
+The 'comments' option defines what a comment looks like. Vim distinguishes
+between a single-line comment and a comment that has a different start, end
+and middle part.
+ Many single-line comments start with a specific character. In C++ // is
+used, in Makefiles #, in Vim scripts ". For example, to make Vim understand
+C++ comments: >
+
+ :set comments=://
+
+The colon separates the flags of an item from the text by which the comment is
+recognized. The general form of an item in 'comments' is:
+
+ {flags}:{text}
+
+The {flags} part can be empty, as in this case.
+ Several of these items can be concatenated, separated by commas. This
+allows recognizing different types of comments at the same time. For example,
+let's edit an e-mail message. When replying, the text that others wrote is
+preceded with ">" and "!" characters. This command would work: >
+
+ :set comments=n:>,n:!
+
+There are two items, one for comments starting with ">" and one for comments
+that start with "!". Both use the flag "n". This means that these comments
+nest. Thus a line starting with ">" may have another comment after the ">".
+This allows formatting a message like this:
+
+ > ! Did you see that site? ~
+ > ! It looks really great. ~
+ > I don't like it. The ~
+ > colors are terrible. ~
+ What is the URL of that ~
+ site? ~
+
+Try setting 'textwidth' to a different value, e.g., 80, and format the text by
+Visually selecting it and typing "gq". The result is:
+
+ > ! Did you see that site? It looks really great. ~
+ > I don't like it. The colors are terrible. ~
+ What is the URL of that site? ~
+
+You will notice that Vim did not move text from one type of comment to
+another. The "I" in the second line would have fit at the end of the first
+line, but since that line starts with "> !" and the second line with ">", Vim
+knows that this is a different kind of comment.
+
+
+A THREE PART COMMENT
+
+A C comment starts with "/*", has "*" in the middle and "*/" at the end. The
+entry in 'comments' for this looks like this: >
+
+ :set comments=s1:/*,mb:*,ex:*/
+
+The start is defined with "s1:/*". The "s" indicates the start of a
+three-piece comment. The colon separates the flags from the text by which the
+comment is recognized: "/*". There is one flag: "1". This tells Vim that the
+middle part has an offset of one space.
+ The middle part "mb:*" starts with "m", which indicates it is a middle
+part. The "b" flag means that a blank must follow the text. Otherwise Vim
+would consider text like "*pointer" also to be the middle of a comment.
+ The end part "ex:*/" has the "e" for identification. The "x" flag has a
+special meaning. It means that after Vim automatically inserted a star,
+typing / will remove the extra space.
+
+For more details see |format-comments|.
+
+==============================================================================
+
+Next chapter: |usr_31.txt| Exploiting the GUI
+
+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
new file mode 100644
index 0000000..455274f
--- /dev/null
+++ b/runtime/doc/usr_31.txt
@@ -0,0 +1,272 @@
+*usr_31.txt* For Vim version 9.0. Last change: 2020 Jul 28
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Exploiting the GUI
+
+
+Vim works well in a terminal, but the GUI has a few extra items. A file
+browser can be used for commands that use a file. A dialog to make a choice
+between alternatives. Use keyboard shortcuts to access menu items quickly.
+
+|31.1| The file browser
+|31.2| Confirmation
+|31.3| Menu shortcuts
+|31.4| Vim window position and size
+|31.5| Various
+
+ Next chapter: |usr_32.txt| The undo tree
+ Previous chapter: |usr_30.txt| Editing programs
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*31.1* The file browser
+
+When using the File/Open... menu you get a file browser. This makes it easier
+to find the file you want to edit. But what if you want to split a window to
+edit another file? There is no menu entry for this. You could first use
+Window/Split and then File/Open..., but that's more work.
+ Since you are typing most commands in Vim, opening the file browser with a
+typed command is possible as well. To make the split command use the file
+browser, prepend "browse": >
+
+ :browse split
+
+Select a file and then the ":split" command will be executed with it. If you
+cancel the file dialog nothing happens, the window isn't split.
+ You can also specify a file name argument. This is used to tell the file
+browser where to start. Example: >
+
+ :browse split /etc
+
+The file browser will pop up, starting in the directory "/etc".
+
+The ":browse" command can be prepended to just about any command that opens a
+file.
+ If no directory is specified, Vim will decide where to start the file
+browser. By default it uses the same directory as the last time. Thus when
+you used ":browse split" and selected a file in "/usr/local/share", the next
+time you use a ":browse" it will start in "/usr/local/share" again.
+ This can be changed with the 'browsedir' option. It can have one of three
+values:
+
+ last Use the last directory browsed (default)
+ buffer Use the same directory as the current buffer
+ current use the current directory
+
+For example, when you are in the directory "/usr", editing the file
+"/usr/local/share/readme", then the command: >
+
+ :set browsedir=buffer
+ :browse edit
+
+Will start the browser in "/usr/local/share". Alternatively: >
+
+ :set browsedir=current
+ :browse edit
+
+Will start the browser in "/usr".
+
+ Note:
+ To avoid using the mouse, most file browsers offer using key presses
+ to navigate. Since this is different for every system, it is not
+ explained here. Vim uses a standard browser when possible, your
+ system documentation should contain an explanation on the keyboard
+ shortcuts somewhere.
+
+When you are not using the GUI version, you could use the file explorer window
+to select files like in a file browser. However, this doesn't work for the
+":browse" command. See |netrw-browse|.
+
+==============================================================================
+*31.2* Confirmation
+
+Vim protects you from accidentally overwriting a file and other ways to lose
+changes. If you do something that might be a bad thing to do, Vim produces an
+error message and suggests appending ! if you really want to do it.
+ To avoid retyping the command with the !, you can make Vim give you a
+dialog. You can then press "OK" or "Cancel" to tell Vim what you want.
+ For example, you are editing a file and made changes to it. You start
+editing another file with: >
+
+ :confirm edit foo.txt
+
+Vim will pop up a dialog that looks something like this:
+
+ +-----------------------------------+
+ | |
+ | ? Save changes to "bar.txt"? |
+ | |
+ | YES NO CANCEL |
+ +-----------------------------------+
+
+Now make your choice. If you do want to save the changes, select "YES". If
+you want to lose the changes for ever: "NO". If you forgot what you were
+doing and want to check what really changed use "CANCEL". You will be back in
+the same file, with the changes still there.
+
+Just like ":browse", the ":confirm" command can be prepended to most commands
+that edit another file. They can also be combined: >
+
+ :confirm browse edit
+
+This will produce a dialog when the current buffer was changed. Then it will
+pop up a file browser to select the file to edit.
+
+ Note:
+ In the dialog you can use the keyboard to select the choice.
+ Typically the <Tab> key and the cursor keys change the choice.
+ Pressing <Enter> selects the choice. This depends on the system
+ though.
+
+When you are not using the GUI, the ":confirm" command works as well. Instead
+of popping up a dialog, Vim will print the message at the bottom of the Vim
+window and ask you to press a key to make a choice. >
+
+ :confirm edit main.c
+< Save changes to "Untitled"? ~
+ [Y]es, (N)o, (C)ancel: ~
+
+You can now press the single key for the choice. You don't have to press
+<Enter>, unlike other typing on the command line.
+
+==============================================================================
+*31.3* Menu shortcuts
+
+The keyboard is used for all Vim commands. The menus provide a simple way to
+select commands, without knowing what they are called. But you have to move
+your hand from the keyboard and grab the mouse.
+ Menus can often be selected with keys as well. This depends on your
+system, but most often it works this way. Use the <Alt> key in combination
+with the underlined letter of a menu. For example, <A-w> (<Alt> and w) pops
+up the Window menu.
+ In the Window menu, the "split" item has the p underlined. To select it,
+let go of the <Alt> key and press p.
+
+After the first selection of a menu with the <Alt> key, you can use the cursor
+keys to move through the menus. <Right> selects a submenu and <left> closes
+it. <Esc> also closes a menu. <Enter> selects a menu item.
+
+There is a conflict between using the <Alt> key to select menu items, and
+using <Alt> key combinations for mappings. The 'winaltkeys' option tells Vim
+what it should do with the <Alt> key.
+ The default value "menu" is the smart choice: If the key combination is a
+menu shortcut it can't be mapped. All other keys are available for mapping.
+ The value "no" doesn't use any <Alt> keys for the menus. Thus you must use
+the mouse for the menus, and all <Alt> keys can be mapped.
+ The value "yes" means that Vim will use any <Alt> keys for the menus. Some
+<Alt> key combinations may also do other things than selecting a menu.
+
+==============================================================================
+*31.4* Vim window position and size
+
+To see the current Vim window position on the screen use: >
+
+ :winpos
+
+This will only work in the GUI. The output may look like this:
+
+ Window position: X 272, Y 103 ~
+
+The position is given in screen pixels. Now you can use the numbers to move
+Vim somewhere else. For example, to move it to the left a hundred pixels: >
+
+ :winpos 172 103
+<
+ Note:
+ There may be a small offset between the reported position and where
+ the window moves. This is because of the border around the window.
+ This is added by the window manager.
+
+You can use this command in your startup script to position the window at a
+specific position.
+
+The size of the Vim window is computed in characters. Thus this depends on
+the size of the font being used. You can see the current size with this
+command: >
+
+ :set lines columns
+
+To change the size set the 'lines' and/or 'columns' options to a new value: >
+
+ :set lines=50
+ :set columns=80
+
+Obtaining the size works in a terminal just like in the GUI. Setting the size
+is not possible in most terminals.
+
+You can start the X-Windows version of gvim with an argument to specify the
+size and position of the window: >
+
+ gvim -geometry {width}x{height}+{x-offset}+{y-offset}
+
+{width} and {height} are in characters, {x-offset} and {y-offset} are in
+pixels. Example: >
+
+ gvim -geometry 80x25+100+300
+
+==============================================================================
+*31.5* Various
+
+You can use gvim to edit an e-mail message. In your e-mail program you must
+select gvim to be the editor for messages. When you try that, you will
+see that it doesn't work: The mail program thinks that editing is finished,
+while gvim is still running!
+ What happens is that gvim disconnects from the shell it was started in.
+That is fine when you start gvim in a terminal, so that you can do other work
+in that terminal. But when you really want to wait for gvim to finish, you
+must prevent it from disconnecting. The "-f" argument does this: >
+
+ gvim -f file.txt
+
+The "-f" stands for foreground. Now Vim will block the shell it was started
+in until you finish editing and exit.
+
+
+DELAYED START OF THE GUI
+
+On Unix it's possible to first start Vim in a terminal. That's useful if you
+do various tasks in the same shell. If you are editing a file and decide you
+want to use the GUI after all, you can start it with: >
+
+ :gui
+
+Vim will open the GUI window and no longer use the terminal. You can continue
+using the terminal for something else. The "-f" argument is used here to run
+the GUI in the foreground. You can also use ":gui -f".
+
+
+THE GVIM STARTUP FILE
+
+When gvim starts, it reads the gvimrc file. That's similar to the vimrc file
+used when starting Vim. The gvimrc file can be used for settings and commands
+that are only to be used when the GUI is going to be started. For example,
+you can set the 'lines' option to set a different window size: >
+
+ :set lines=55
+
+You don't want to do this in a terminal, since its size is fixed (except for
+an xterm that supports resizing).
+ The gvimrc file is searched for in the same locations as the vimrc file.
+Normally its name is "~/.gvimrc" for Unix and "$VIM/_gvimrc" for MS-Windows.
+The $MYGVIMRC environment variable is set to it, thus you can use this command
+to edit the file, if you have one: >
+
+ :edit $MYGVIMRC
+<
+ If for some reason you don't want to use the normal gvimrc file, you can
+specify another one with the "-U" argument: >
+
+ gvim -U thisrc ...
+
+That allows starting gvim for different kinds of editing. You could set
+another font size, for example.
+ To completely skip reading a gvimrc file: >
+
+ gvim -U NONE ...
+
+==============================================================================
+
+Next chapter: |usr_32.txt| The undo tree
+
+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
new file mode 100644
index 0000000..9733d70
--- /dev/null
+++ b/runtime/doc/usr_32.txt
@@ -0,0 +1,180 @@
+*usr_32.txt* For Vim version 9.0. Last change: 2010 Jul 20
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ The undo tree
+
+
+Vim provides multi-level undo. If you undo a few changes and then make a new
+change you create a branch in the undo tree. This text is about moving
+through the branches.
+
+|32.1| Undo up to a file write
+|32.2| Numbering changes
+|32.3| Jumping around the tree
+|32.4| Time travelling
+
+ Next chapter: |usr_40.txt| Make new commands
+ Previous chapter: |usr_31.txt| Exploiting the GUI
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*32.1* Undo up to a file write
+
+Sometimes you make several changes, and then discover you want to go back to
+when you have last written the file. You can do that with this command: >
+
+ :earlier 1f
+
+The "f" stands for "file" here.
+
+You can repeat this command to go further back in the past. Or use a count
+different from 1 to go back faster.
+
+If you go back too far, go forward again with: >
+
+ :later 1f
+
+Note that these commands really work in time sequence. This matters if you
+made changes after undoing some changes. It's explained in the next section.
+
+Also note that we are talking about text writes here. For writing the undo
+information in a file see |undo-persistence|.
+
+==============================================================================
+*32.2* Numbering changes
+
+In section |02.5| we only discussed one line of undo/redo. But it is also
+possible to branch off. This happens when you undo a few changes and then
+make a new change. The new changes become a branch in the undo tree.
+
+Let's start with the text "one". The first change to make is to append
+" too". And then move to the first 'o' and change it into 'w'. We then have
+two changes, numbered 1 and 2, and three states of the text:
+
+ one ~
+ |
+ change 1
+ |
+ one too ~
+ |
+ change 2
+ |
+ one two ~
+
+If we now undo one change, back to "one too", and change "one" to "me" we
+create a branch in the undo tree:
+
+ one ~
+ |
+ change 1
+ |
+ one too ~
+ / \
+ change 2 change 3
+ | |
+ one two me too ~
+
+You can now use the |u| command to undo. If you do this twice you get to
+"one". Use |CTRL-R| to redo, and you will go to "one too". One more |CTRL-R|
+takes you to "me too". Thus undo and redo go up and down in the tree, using
+the branch that was last used.
+
+What matters here is the order in which the changes are made. Undo and redo
+are not considered changes in this context. After each change you have a new
+state of the text.
+
+Note that only the changes are numbered, the text shown in the tree above has
+no identifier. They are mostly referred to by the number of the change above
+it. But sometimes by the number of one of the changes below it, especially
+when moving up in the tree, so that you know which change was just undone.
+
+==============================================================================
+*32.3* Jumping around the tree
+
+So how do you get to "one two" now? You can use this command: >
+
+ :undo 2
+
+The text is now "one two", you are below change 2. You can use the |:undo|
+command to jump to below any change in the tree.
+
+Now make another change: change "one" to "not":
+
+ one ~
+ |
+ change 1
+ |
+ one too ~
+ / \
+ change 2 change 3
+ | |
+ one two me too ~
+ |
+ change 4
+ |
+ not two ~
+
+Now you change your mind and want to go back to "me too". Use the |g-|
+command. This moves back in time. Thus it doesn't walk the tree upwards or
+downwards, but goes to the change made before.
+
+You can repeat |g-| and you will see the text change:
+ me too ~
+ one two ~
+ one too ~
+ one ~
+
+Use |g+| to move forward in time:
+ one ~
+ one too ~
+ one two ~
+ me too ~
+ not two ~
+
+Using |:undo| is useful if you know what change you want to jump to. |g-| and
+|g+| are useful if you don't know exactly what the change number is.
+
+You can type a count before |g-| and |g+| to repeat them.
+
+==============================================================================
+*32.4* Time travelling
+
+When you have been working on text for a while the tree grows to become big.
+Then you may want to go to the text of some minutes ago.
+
+To see what branches there are in the undo tree use this command: >
+
+ :undolist
+< number changes time ~
+ 3 2 16 seconds ago
+ 4 3 5 seconds ago
+
+Here you can see the number of the leaves in each branch and when the change
+was made. Assuming we are below change 4, at "not two", you can go back ten
+seconds with this command: >
+
+ :earlier 10s
+
+Depending on how much time you took for the changes you end up at a certain
+position in the tree. The |:earlier| command argument can be "m" for minutes,
+"h" for hours and "d" for days. To go all the way back use a big number: >
+
+ :earlier 100d
+
+To travel forward in time again use the |:later| command: >
+
+ :later 1m
+
+The arguments are "s", "m" and "h", just like with |:earlier|.
+
+If you want even more details, or want to manipulate the information, you can
+use the |undotree()| function. To see what it returns: >
+
+ :echo undotree()
+
+==============================================================================
+
+Next chapter: |usr_40.txt| Make new commands
+
+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
new file mode 100644
index 0000000..27323c6
--- /dev/null
+++ b/runtime/doc/usr_40.txt
@@ -0,0 +1,668 @@
+*usr_40.txt* For Vim version 9.0. Last change: 2022 Jun 23
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Make new commands
+
+
+Vim is an extensible editor. You can take a sequence of commands you use
+often and turn it into a new command. Or redefine an existing command.
+Autocommands make it possible to execute commands automatically.
+
+|40.1| Key mapping
+|40.2| Defining command-line commands
+|40.3| Autocommands
+
+ Next chapter: |usr_41.txt| Write a Vim script
+ Previous chapter: |usr_32.txt| The undo tree
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*40.1* Key mapping
+
+A simple mapping was explained in section |05.4|. The principle is that one
+sequence of key strokes is translated into another sequence of key strokes.
+This is a simple, yet powerful mechanism.
+ The simplest form is that one key is mapped to a sequence of keys. Since
+the function keys, except <F1>, have no predefined meaning in Vim, these are
+good choices to map. Example: >
+
+ :map <F2> GoDate: <Esc>:read !date<CR>kJ
+
+This shows how three modes are used. After going to the last line with "G",
+the "o" command opens a new line and starts Insert mode. The text "Date: " is
+inserted and <Esc> takes you out of insert mode.
+ Notice the use of special keys inside <>. This is called angle bracket
+notation. You type these as separate characters, not by pressing the key
+itself. This makes the mappings better readable and you can copy and paste
+the text without problems.
+ The ":" character takes Vim to the command line. The ":read !date" command
+reads the output from the "date" command and appends it below the current
+line. The <CR> is required to execute the ":read" command.
+ At this point of execution the text looks like this:
+
+ Date: ~
+ Fri Jun 15 12:54:34 CEST 2001 ~
+
+Now "kJ" moves the cursor up and joins the lines together.
+ To decide which key or keys you use for mapping, see |map-which-keys|.
+
+
+MAPPING AND MODES
+
+The ":map" command defines remapping for keys in Normal mode. You can also
+define mappings for other modes. For example, ":imap" applies to Insert mode.
+You can use it to insert a date below the cursor: >
+
+ :imap <F2> <CR>Date: <Esc>:read !date<CR>kJ
+
+It looks a lot like the mapping for <F2> in Normal mode, only the start is
+different. The <F2> mapping for Normal mode is still there. Thus you can map
+the same key differently for each mode.
+ Notice that, although this mapping starts in Insert mode, it ends in Normal
+mode. If you want it to continue in Insert mode, append an "a" to the
+mapping.
+
+Here is an overview of map commands and in which mode they work:
+
+ :map Normal, Visual and Operator-pending
+ :vmap Visual
+ :nmap Normal
+ :omap Operator-pending
+ :map! Insert and Command-line
+ :imap Insert
+ :cmap Command-line
+
+Operator-pending mode is when you typed an operator character, such as "d" or
+"y", and you are expected to type the motion command or a text object. Thus
+when you type "dw", the "w" is entered in operator-pending mode.
+
+Suppose that you want to define <F7> so that the command d<F7> deletes a C
+program block (text enclosed in curly braces, {}). Similarly y<F7> would yank
+the program block into the unnamed register. Therefore, what you need to do
+is to define <F7> to select the current program block. You can do this with
+the following command: >
+
+ :omap <F7> a{
+
+This causes <F7> to perform a select block "a{" in operator-pending mode, just
+like you typed it. This mapping is useful if typing a { on your keyboard is a
+bit difficult.
+
+
+LISTING MAPPINGS
+
+To see the currently defined mappings, use ":map" without arguments. Or one
+of the variants that include the mode in which they work. The output could
+look like this:
+
+ _g :call MyGrep(1)<CR> ~
+ v <F2> :s/^/> /<CR>:noh<CR>`` ~
+ n <F2> :.,$s/^/> /<CR>:noh<CR>`` ~
+ <xHome> <Home>
+ <xEnd> <End>
+
+
+The first column of the list shows in which mode the mapping is effective.
+This is "n" for Normal mode, "i" for Insert mode, etc. A blank is used for a
+mapping defined with ":map", thus effective in both Normal and Visual mode.
+ One useful purpose of listing the mapping is to check if special keys in <>
+form have been recognized (this only works when color is supported). For
+example, when <Esc> is displayed in color, it stands for the escape character.
+When it has the same color as the other text, it is five characters.
+
+
+REMAPPING
+
+The result of a mapping is inspected for other mappings in it. For example,
+the mappings for <F2> above could be shortened to: >
+
+ :map <F2> G<F3>
+ :imap <F2> <Esc><F3>
+ :map <F3> oDate: <Esc>:read !date<CR>kJ
+
+For Normal mode <F2> is mapped to go to the last line, and then behave like
+<F3> was pressed. In Insert mode <F2> stops Insert mode with <Esc> and then
+also uses <F3>. Then <F3> is mapped to do the actual work.
+
+Suppose you hardly ever use Ex mode, and want to use the "Q" command to format
+text (this was so in old versions of Vim). This mapping will do it: >
+
+ :map Q gq
+
+But, in rare cases you need to use Ex mode anyway. Let's map "gQ" to Q, so
+that you can still go to Ex mode: >
+
+ :map gQ Q
+
+What happens now is that when you type "gQ" it is mapped to "Q". So far so
+good. But then "Q" is mapped to "gq", thus typing "gQ" results in "gq", and
+you don't get to Ex mode at all.
+ To avoid keys to be mapped again, use the ":noremap" command: >
+
+ :noremap gQ Q
+
+Now Vim knows that the "Q" is not to be inspected for mappings that apply to
+it. There is a similar command for every mode:
+
+ :noremap Normal, Visual and Operator-pending
+ :vnoremap Visual
+ :nnoremap Normal
+ :onoremap Operator-pending
+ :noremap! Insert and Command-line
+ :inoremap Insert
+ :cnoremap Command-line
+
+
+RECURSIVE MAPPING
+
+When a mapping triggers itself, it will run forever. This can be used to
+repeat an action an unlimited number of times.
+ For example, you have a list of files that contain a version number in the
+first line. You edit these files with "vim *.txt". You are now editing the
+first file. Define this mapping: >
+
+ :map ,, :s/5.1/5.2/<CR>:wnext<CR>,,
+
+Now you type ",,". This triggers the mapping. It replaces "5.1" with "5.2"
+in the first line. Then it does a ":wnext" to write the file and edit the
+next one. The mapping ends in ",,". This triggers the same mapping again,
+thus doing the substitution, etc.
+ This continues until there is an error. In this case it could be a file
+where the substitute command doesn't find a match for "5.1". You can then
+make a change to insert "5.1" and continue by typing ",," again. Or the
+":wnext" fails, because you are in the last file in the list.
+ When a mapping runs into an error halfway, the rest of the mapping is
+discarded. CTRL-C interrupts the mapping (CTRL-Break on MS-Windows).
+
+
+DELETE A MAPPING
+
+To remove a mapping use the ":unmap" command. Again, the mode the unmapping
+applies to depends on the command used:
+
+ :unmap Normal, Visual and Operator-pending
+ :vunmap Visual
+ :nunmap Normal
+ :ounmap Operator-pending
+ :unmap! Insert and Command-line
+ :iunmap Insert
+ :cunmap Command-line
+
+There is a trick to define a mapping that works in Normal and Operator-pending
+mode, but not in Visual mode. First define it for all three modes, then
+delete it for Visual mode: >
+
+ :map <C-A> /---><CR>
+ :vunmap <C-A>
+
+Notice that the five characters "<C-A>" stand for the single key CTRL-A.
+
+To remove all mappings use the |:mapclear| command. You can guess the
+variations for different modes by now. Be careful with this command, it can't
+be undone.
+
+
+SPECIAL CHARACTERS
+
+The ":map" command can be followed by another command. A | character
+separates the two commands. This also means that a | character can't be used
+inside a map command. To include one, use <Bar> (five characters). Example:
+>
+ :map <F8> :write <Bar> !checkin %:S<CR>
+
+The same problem applies to the ":unmap" command, with the addition that you
+have to watch out for trailing white space. These two commands are different:
+>
+ :unmap a | unmap b
+ :unmap a| unmap b
+
+The first command tries to unmap "a ", with a trailing space.
+
+When using a space inside a mapping, use <Space> (seven characters): >
+
+ :map <Space> W
+
+This makes the spacebar move a blank-separated word forward.
+
+It is not possible to put a comment directly after a mapping, because the "
+character is considered to be part of the mapping. You can use |", this
+starts a new, empty command with a comment. Example: >
+
+ :map <Space> W| " Use spacebar to move forward a word
+
+
+MAPPINGS AND ABBREVIATIONS
+
+Abbreviations are a lot like Insert mode mappings. The arguments are handled
+in the same way. The main difference is the way they are triggered. An
+abbreviation is triggered by typing a non-word character after the word. A
+mapping is triggered when typing the last character.
+ Another difference is that the characters you type for an abbreviation are
+inserted in the text while you type them. When the abbreviation is triggered
+these characters are deleted and replaced by what the abbreviation produces.
+When typing the characters for a mapping, nothing is inserted until you type
+the last character that triggers it. If the 'showcmd' option is set, the
+typed characters are displayed in the last line of the Vim window.
+ An exception is when a mapping is ambiguous. Suppose you have done two
+mappings: >
+
+ :imap aa foo
+ :imap aaa bar
+
+Now, when you type "aa", Vim doesn't know if it should apply the first or the
+second mapping. It waits for another character to be typed. If it is an "a",
+the second mapping is applied and results in "bar". If it is a space, for
+example, the first mapping is applied, resulting in "foo", and then the space
+is inserted.
+
+
+ADDITIONALLY...
+
+The <script> keyword can be used to make a mapping local to a script. See
+|:map-<script>|.
+
+The <buffer> keyword can be used to make a mapping local to a specific buffer.
+See |:map-<buffer>|
+
+The <unique> keyword can be used to make defining a new mapping fail when it
+already exists. Otherwise a new mapping simply overwrites the old one. See
+|:map-<unique>|.
+
+To make a key do nothing, map it to <Nop> (five characters). This will make
+the <F7> key do nothing at all: >
+
+ :map <F7> <Nop>| map! <F7> <Nop>
+
+There must be no space after <Nop>.
+
+==============================================================================
+*40.2* Defining command-line commands
+
+The Vim editor enables you to define your own commands. You execute these
+commands just like any other Command-line mode command.
+ To define a command, use the ":command" command, as follows: >
+
+ :command DeleteFirst 1delete
+
+Now when you execute the command ":DeleteFirst" Vim executes ":1delete", which
+deletes the first line.
+
+ Note:
+ User-defined commands must start with a capital letter. You cannot
+ use ":X", ":Next" and ":Print". The underscore cannot be used! You
+ can use digits, but this is discouraged.
+
+To list the user-defined commands, execute the following command: >
+
+ :command
+
+Just like with the builtin commands, the user defined commands can be
+abbreviated. You need to type just enough to distinguish the command from
+another. Command line completion can be used to get the full name.
+
+
+NUMBER OF ARGUMENTS
+
+User-defined commands can take a series of arguments. The number of arguments
+must be specified by the -nargs option. For instance, the example
+:DeleteFirst command takes no arguments, so you could have defined it as
+follows: >
+
+ :command -nargs=0 DeleteFirst 1delete
+
+However, because zero arguments is the default, you do not need to add
+"-nargs=0". The other values of -nargs are as follows:
+
+ -nargs=0 No arguments
+ -nargs=1 One argument
+ -nargs=* Any number of arguments
+ -nargs=? Zero or one argument
+ -nargs=+ One or more arguments
+
+
+USING THE ARGUMENTS
+
+Inside the command definition, the arguments are represented by the
+<args> keyword. For example: >
+
+ :command -nargs=+ Say :echo "<args>"
+
+Now when you type >
+
+ :Say Hello World
+
+Vim echoes "Hello World". However, if you add a double quote, it won't work.
+For example: >
+
+ :Say he said "hello"
+
+To get special characters turned into a string, properly escaped to use as an
+expression, use "<q-args>": >
+
+ :command -nargs=+ Say :echo <q-args>
+
+Now the above ":Say" command will result in this to be executed: >
+
+ :echo "he said \"hello\""
+
+The <f-args> keyword contains the same information as the <args> keyword,
+except in a format suitable for use as function call arguments. For example:
+>
+ :command -nargs=* DoIt :call AFunction(<f-args>)
+ :DoIt a b c
+
+Executes the following command: >
+
+ :call AFunction("a", "b", "c")
+
+
+LINE RANGE
+
+Some commands take a range as their argument. To tell Vim that you are
+defining such a command, you need to specify a -range option. The values for
+this option are as follows:
+
+ -range Range is allowed; default is the current line.
+ -range=% Range is allowed; default is the whole file.
+ -range={count} Range is allowed; the last number in it is used as a
+ single number whose default is {count}.
+
+When a range is specified, the keywords <line1> and <line2> get the values of
+the first and last line in the range. For example, the following command
+defines the SaveIt command, which writes out the specified range to the file
+"save_file": >
+
+ :command -range=% SaveIt :<line1>,<line2>write! save_file
+
+
+OTHER OPTIONS
+
+Some of the other options and keywords are as follows:
+
+ -count={number} The command can take a count whose default is
+ {number}. The resulting count can be used
+ through the <count> keyword.
+ -bang You can use a !. If present, using <bang> will
+ result in a !.
+ -register You can specify a register. (The default is
+ the unnamed register.)
+ The register specification is available as
+ <reg> (a.k.a. <register>).
+ -complete={type} Type of command-line completion used. See
+ |:command-completion| for the list of possible
+ values.
+ -bar The command can be followed by | and another
+ command, or " and a comment.
+ -buffer The command is only available for the current
+ buffer.
+
+Finally, you have the <lt> keyword. It stands for the character <. Use this
+to escape the special meaning of the <> items mentioned.
+
+
+REDEFINING AND DELETING
+
+To redefine the same command use the ! argument: >
+
+ :command -nargs=+ Say :echo "<args>"
+ :command! -nargs=+ Say :echo <q-args>
+
+To delete a user command use ":delcommand". It takes a single argument, which
+is the name of the command. Example: >
+
+ :delcommand SaveIt
+
+To delete all the user commands: >
+
+ :comclear
+
+Careful, this can't be undone!
+
+More details about all this in the reference manual: |user-commands|.
+
+==============================================================================
+*40.3* Autocommands
+
+An autocommand is a command that is executed automatically in response to some
+event, such as a file being read or written or a buffer change. Through the
+use of autocommands you can train Vim to edit compressed files, for example.
+That is used in the |gzip| plugin.
+ Autocommands are very powerful. Use them with care and they will help you
+avoid typing many commands. Use them carelessly and they will cause a lot of
+trouble.
+
+Suppose you want to replace a datestamp on the end of a file every time it is
+written. First you define a function: >
+
+ :function DateInsert()
+ : $delete
+ : read !date
+ :endfunction
+
+You want this function to be called each time, just before a buffer is written
+to a file. This will make that happen: >
+
+ :autocmd BufWritePre * call DateInsert()
+
+"BufWritePre" is the event for which this autocommand is triggered: Just
+before (pre) writing a buffer to a file. The "*" is a pattern to match with
+the file name. In this case it matches all files.
+ With this command enabled, when you do a ":write", Vim checks for any
+matching BufWritePre autocommands and executes them, and then it
+performs the ":write".
+ The general form of the :autocmd command is as follows: >
+
+ :autocmd [group] {events} {file-pattern} [++nested] {command}
+
+The [group] name is optional. It is used in managing and calling the commands
+(more on this later). The {events} parameter is a list of events (comma
+separated) that trigger the command.
+ {file-pattern} is a filename, usually with wildcards. For example, using
+"*.txt" makes the autocommand be used for all files whose name end in ".txt".
+The optional [++nested] flag allows for nesting of autocommands (see below),
+and finally, {command} is the command to be executed.
+
+When adding an autocommand the already existing ones remain. To avoid adding
+the autocommand several times you should use this form: >
+
+ :augroup updateDate
+ : autocmd!
+ : autocmd BufWritePre * call DateInsert()
+ :augroup END
+
+This will delete any previously defined autocommand with `:autocmd!` before
+defining the new one. Groups are explained later.
+
+
+EVENTS
+
+One of the most useful events is BufReadPost. It is triggered after a new
+file is being edited. It is commonly used to set option values. For example,
+you know that "*.gsm" files are GNU assembly language. To get the syntax file
+right, define this autocommand: >
+
+ :autocmd BufReadPost *.gsm set filetype=asm
+
+If Vim is able to detect the type of file, it will set the 'filetype' option
+for you. This triggers the Filetype event. Use this to do something when a
+certain type of file is edited. For example, to load a list of abbreviations
+for text files: >
+
+ :autocmd Filetype text source ~/.vim/abbrevs.vim
+
+When starting to edit a new file, you could make Vim insert a skeleton: >
+
+ :autocmd BufNewFile *.[ch] 0read ~/skeletons/skel.c
+
+See |autocmd-events| for a complete list of events.
+
+
+PATTERNS
+
+The {file-pattern} argument can actually be a comma-separated list of file
+patterns. For example: "*.c,*.h" matches files ending in ".c" and ".h".
+ The usual file wildcards can be used. Here is a summary of the most often
+used ones:
+
+ * Match any character any number of times
+ ? Match any character once
+ [abc] Match the character a, b or c
+ . Matches a dot
+ a{b,c} Matches "ab" and "ac"
+
+When the pattern includes a slash (/) Vim will compare directory names.
+Without the slash only the last part of a file name is used. For example,
+"*.txt" matches "/home/biep/readme.txt". The pattern "/home/biep/*" would
+also match it. But "home/foo/*.txt" wouldn't.
+ When including a slash, Vim matches the pattern against both the full path
+of the file ("/home/biep/readme.txt") and the relative path (e.g.,
+"biep/readme.txt").
+
+ Note:
+ When working on a system that uses a backslash as file separator, such
+ as MS-Windows, you still use forward slashes in autocommands. This
+ makes it easier to write the pattern, since a backslash has a special
+ meaning. It also makes the autocommands portable.
+
+
+DELETING
+
+To delete an autocommand, use the same command as what it was defined with,
+but leave out the {command} at the end and use a !. Example: >
+
+ :autocmd! FileWritePre *
+
+This will delete all autocommands for the "FileWritePre" event that use the
+"*" pattern.
+
+
+LISTING
+
+To list all the currently defined autocommands, use this: >
+
+ :autocmd
+
+The list can be very long, especially when filetype detection is used. To
+list only part of the commands, specify the group, event and/or pattern. For
+example, to list all BufNewFile autocommands: >
+
+ :autocmd BufNewFile
+
+To list all autocommands for the pattern "*.c": >
+
+ :autocmd * *.c
+
+Using "*" for the event will list all the events. To list all autocommands
+for the cprograms group: >
+
+ :autocmd cprograms
+
+
+GROUPS
+
+The {group} item, used when defining an autocommand, groups related autocommands
+together. This can be used to delete all the autocommands in a certain group,
+for example.
+ When defining several autocommands for a certain group, use the ":augroup"
+command. For example, let's define autocommands for C programs: >
+
+ :augroup cprograms
+ : autocmd BufReadPost *.c,*.h :set sw=4 sts=4
+ : autocmd BufReadPost *.cpp :set sw=3 sts=3
+ :augroup END
+
+This will do the same as: >
+
+ :autocmd cprograms BufReadPost *.c,*.h :set sw=4 sts=4
+ :autocmd cprograms BufReadPost *.cpp :set sw=3 sts=3
+
+To delete all autocommands in the "cprograms" group: >
+
+ :autocmd! cprograms
+
+
+NESTING
+
+Generally, commands executed as the result of an autocommand event will not
+trigger any new events. If you read a file in response to a FileChangedShell
+event, it will not trigger the autocommands that would set the syntax, for
+example. To make the events triggered, add the "nested" argument: >
+
+ :autocmd FileChangedShell * ++nested edit
+
+
+EXECUTING AUTOCOMMANDS
+
+It is possible to trigger an autocommand by pretending an event has occurred.
+This is useful to have one autocommand trigger another one. Example: >
+
+ :autocmd BufReadPost *.new execute "doautocmd BufReadPost " . expand("<afile>:r")
+
+This defines an autocommand that is triggered when a new file has been edited.
+The file name must end in ".new". The ":execute" command uses expression
+evaluation to form a new command and execute it. When editing the file
+"tryout.c.new" the executed command will be: >
+
+ :doautocmd BufReadPost tryout.c
+
+The expand() function takes the "<afile>" argument, which stands for the file
+name the autocommand was executed for, and takes the root of the file name
+with ":r".
+
+":doautocmd" executes on the current buffer. The ":doautoall" command works
+like "doautocmd" except it executes on all the buffers.
+
+
+USING NORMAL MODE COMMANDS
+
+The commands executed by an autocommand are Command-line commands. If you
+want to use a Normal mode command, the ":normal" command can be used.
+Example: >
+
+ :autocmd BufReadPost *.log normal G
+
+This will make the cursor jump to the last line of *.log files when you start
+to edit it.
+ Using the ":normal" command is a bit tricky. First of all, make sure its
+argument is a complete command, including all the arguments. When you use "i"
+to go to Insert mode, there must also be a <Esc> to leave Insert mode again.
+If you use a "/" to start a search pattern, there must be a <CR> to execute
+it.
+ The ":normal" command uses all the text after it as commands. Thus there
+can be no | and another command following. To work around this, put the
+":normal" command inside an ":execute" command. This also makes it possible
+to pass unprintable characters in a convenient way. Example: >
+
+ :autocmd BufReadPost *.chg execute "normal ONew entry:\<Esc>" |
+ \ 1read !date
+
+This also shows the use of a backslash to break a long command into more
+lines. This can be used in Vim scripts (not at the command line).
+
+When you want the autocommand do something complicated, which involves jumping
+around in the file and then returning to the original position, you may want
+to restore the view on the file. See |restore-position| for an example.
+
+
+IGNORING EVENTS
+
+At times, you will not want to trigger an autocommand. The 'eventignore'
+option contains a list of events that will be totally ignored. For example,
+the following causes events for entering and leaving a window to be ignored: >
+
+ :set eventignore=WinEnter,WinLeave
+
+To ignore all events, use the following command: >
+
+ :set eventignore=all
+
+To set it back to the normal behavior, make 'eventignore' empty: >
+
+ :set eventignore=
+
+==============================================================================
+
+Next chapter: |usr_41.txt| Write a Vim script
+
+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
new file mode 100644
index 0000000..4e0cc48
--- /dev/null
+++ b/runtime/doc/usr_41.txt
@@ -0,0 +1,1900 @@
+*usr_41.txt* For Vim version 9.0. Last change: 2023 Jan 17
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Write a Vim script
+
+
+The Vim script language is used for the startup vimrc file, syntax files, and
+many other things. This chapter explains the items that can be used in a Vim
+script. There are a lot of them, therefore this is a long chapter.
+
+|41.1| Introduction
+|41.2| Variables
+|41.3| Expressions
+|41.4| Conditionals
+|41.5| Executing an expression
+|41.6| Using functions
+|41.7| Defining a function
+|41.8| Lists and Dictionaries
+|41.9| White space
+|41.10| Line continuation
+|41.11| Comments
+|41.12| Fileformat
+
+ Next chapter: |usr_42.txt| Add new menus
+ Previous chapter: |usr_40.txt| Make new commands
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*41.1* Introduction *vim-script-intro* *script*
+
+Your first experience with Vim scripts is the vimrc file. Vim reads it when
+it starts up and executes the commands. You can set options to the values you
+prefer, define mappings, select plugins and much more. You can use any colon
+command in it (commands that start with a ":"; these are sometimes referred to
+as Ex commands or command-line commands).
+
+Syntax files are also Vim scripts. As are files that set options for a
+specific file type. A complicated macro can be defined by a separate Vim
+script file. You can think of other uses yourself.
+
+Vim script comes in two flavors: legacy and |Vim9|. Since this help file is
+for new users, we'll teach you the newer and more convenient |Vim9| syntax.
+While legacy script is particularly for Vim, |Vim9| script looks more like
+other languages, such as JavaScript and TypeScript.
+
+To try out Vim script the best way is to edit a script file and source it.
+Basically: >
+ :edit test.vim
+ [insert the script lines you want]
+ :w
+ :source %
+
+Let's start with a simple example: >
+
+ vim9script
+ var i = 1
+ while i < 5
+ echo "count is" i
+ i += 1
+ endwhile
+<
+The output of the example code is:
+
+ count is 1 ~
+ count is 2 ~
+ count is 3 ~
+ count is 4 ~
+
+In the first line the `vim9script` command makes clear this is a new, |Vim9|
+script file. That matters for how the rest of the file is used. It is
+recommended to put it in the very fist line, before any comments.
+ *vim9-declarations*
+The `var i = 1` command declares the "i" variable and initializes it. The
+generic form is: >
+
+ var {name} = {expression}
+
+In this case the variable name is "i" and the expression is a simple value,
+the number one.
+
+The `while` command starts a loop. The generic form is: >
+
+ while {condition}
+ {statements}
+ endwhile
+
+The statements until the matching `endwhile` are executed for as long as the
+condition is true. The condition used here is the expression "i < 5". This
+is true when the variable i is smaller than five.
+ Note:
+ If you happen to write a while loop that keeps on running, you can
+ interrupt it by pressing CTRL-C (CTRL-Break on MS-Windows).
+
+The `echo` command prints its arguments. In this case the string "count is"
+and the value of the variable i. Since i is one, this will print:
+
+ count is 1 ~
+
+Then there is the `i += 1` command. This does the same thing as "i = i + 1",
+it adds one to the variable i and assigns the new value 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: >
+
+ for i in range(1, 4)
+ echo $"count is {i}"
+ endfor
+
+We won't explain how `for`, `range()`and `$"string"` work until later. Follow
+the links if you are impatient.
+
+
+TRYING OUT EXAMPLES
+
+You can easily try out most examples in these help files without saving the
+commands to a file. For example, to try out the "for" loop above do this:
+1. position the cursor on the "for"
+2. start Visual mode with "v"
+3. move down to the "endfor"
+4. press colon, then "so" and Enter
+
+After pressing colon you will see ":'<,'>", which is the range of the Visually
+selected text.
+
+For some commands it matters they are executed as in |Vim9| script. But typed
+commands normally use legacy script syntax, such as the example below that
+causes the E1004 error. For that use this fourth step:
+4. press colon, then "vim9 so" and Enter
+
+"vim9" is short for `vim9cmd`, which is a command modifier to execute the
+following command in |Vim9| syntax.
+
+Note that this won't work for examples that require a script context.
+
+
+FOUR KINDS OF NUMBERS
+
+Numbers can be decimal, hexadecimal, octal and binary.
+
+A hexadecimal number starts with "0x" or "0X". For example "0x1f" is decimal
+31 and "0x1234" is decimal 4660.
+
+An octal number starts with "0o", "0O". "0o17" is decimal 15.
+
+A binary number starts with "0b" or "0B". For example "0b101" is decimal 5.
+
+A decimal number is just digits. Careful: In legacy script don't put a zero
+before a decimal number, it will be interpreted as an octal number! That's
+one reason to use |Vim9| script.
+
+The `echo` command evaluates its argument and when it is a number always
+prints the decimal form. Example: >
+
+ echo 0x7f 0o36
+< 127 30 ~
+
+A number is made negative with a minus sign. This also works for hexadecimal,
+octal and binary numbers: >
+
+ echo -0x7f
+< -127 ~
+
+A minus sign is also used for subtraction. This can sometimes lead to
+confusion. If we put a minus sign before both numbers we get an error: >
+
+ echo -0x7f -0o36
+< E1004: White space required before and after '-' at "-0o36" ~
+
+Note: if you are not using a |Vim9| script to try out these commands but type
+them directly, they will be executed as legacy script. Then the echo command
+sees the second minus sign as subtraction. To get the error, prefix the
+command with `vim9cmd`: >
+
+ vim9cmd echo -0x7f -0o36
+< E1004: White space required before and after '-' at "-0o36" ~
+
+White space in an expression is often required to make sure it is easy to read
+and avoid errors. Such as thinking that the "-0o36" above makes the number
+negative, while it is actually seen as a subtraction.
+
+To actually have the minus sign be used for negation, you can put the second
+expression in parentheses: >
+
+ echo -0x7f (-0o36)
+< -127 -30 ~
+
+==============================================================================
+*41.2* Variables
+
+A variable name consists of ASCII letters, digits and the underscore. It
+cannot start with a digit. Valid variable names are:
+
+ counter
+ _aap3
+ very_long_variable_name_with_underscores
+ CamelCaseName
+ LENGTH
+
+Invalid names are "foo.bar" and "6var".
+
+Some variables are global. To see a list of currently defined global
+variables type this command: >
+
+ :let
+
+You can use global variables everywhere. However, it is too easy to use the
+same name in two unrelated scripts. Therefore variables declared in a script
+are local to that script. For example, if you have this in "script1.vim": >
+
+ vim9script
+ var counter = 5
+ echo counter
+< 5 ~
+
+And you try to use the variable in "script2.vim": >
+
+ vim9script
+ echo counter
+< E121: Undefined variable: counter ~
+
+Using a script-local variable means you can be sure that it is only changed in
+that script and not elsewhere.
+
+If you do want to share variables between scripts, use the "g:" prefix and
+assign the value directly, do not use `var`. And use a specific name to avoid
+mistakes. Thus in "script1.vim": >
+
+ vim9script
+ g:mash_counter = 5
+ echo g:mash_counter
+< 5 ~
+
+And then in "script2.vim": >
+
+ vim9script
+ echo g:mash_counter
+< 5 ~
+
+Global variables can also be accessed on the command line, E.g. typing this: >
+ echo g:mash_counter
+That will not work for a script-local variable.
+
+More about script-local variables here: |script-variable|.
+
+There are more kinds of variables, see |internal-variables|. The most often
+used ones are:
+
+ b:name variable local to a buffer
+ w:name variable local to a window
+ g:name global variable (also in a function)
+ v:name variable predefined by Vim
+
+
+DELETING VARIABLES
+
+Variables take up memory and show up in the output of the `let` command. To
+delete a global variable use the `unlet` command. Example: >
+
+ unlet g:counter
+
+This deletes the global variable "g:counter" to free up the memory it uses.
+If you are not sure if the variable exists, and don't want an error message
+when it doesn't, append !: >
+
+ unlet! g:counter
+
+You cannot `unlet` script-local variables in |Vim9| script, only in legacy
+script.
+
+When a script has been processed to the end, the local variables declared
+there will not be deleted. Functions defined in the script can use them.
+Example:
+>
+ vim9script
+ var counter = 0
+ def g:GetCount(): number
+ counter += 1
+ return counter
+ enddef
+
+Every time you call the function it will return the next count: >
+ :echo g:GetCount()
+< 1 ~
+>
+ :echo g:GetCount()
+< 2 ~
+
+If you are worried a script-local variable is consuming too much memory, set
+it to an empty or null value after you no longer need it. Example: >
+ var lines = readfile(...)
+ ...
+ lines = []
+
+Note: below we'll leave out the `vim9script` line from examples, so we can
+concentrate on the relevant commands, but you'll still need to put it at the
+top of your script file.
+
+
+STRING VARIABLES AND CONSTANTS
+
+So far only numbers were used for the variable value. Strings can be used as
+well. Numbers and strings are the basic types of variables that Vim supports.
+Example: >
+
+ var name = "Peter"
+ echo name
+< Peter ~
+
+Every variable has a type. Very often, as in this example, the type is
+defined by assigning a value. This is called type inference. If you do not
+want to give the variable a value yet, you need to specify the type: >
+
+ var name: string
+ var age: number
+ if male
+ name = "Peter"
+ age = 42
+ else
+ name = "Elisa"
+ age = 45
+ endif
+
+If you make a mistake and try to assign the wrong type of value you'll get an
+error: >
+
+ age = "Peter"
+< E1012: Type mismatch; expected number but got string ~
+
+More about types in |41.8|.
+
+To assign a string value to a variable, you can use a string constant. There
+are two types of these. First the string in double quotes, as we used
+already. If you want to include a double quote inside the string, put a
+backslash in front of it: >
+
+ var name = "he is \"Peter\""
+ echo name
+< he is "Peter" ~
+
+To avoid the need for backslashes, you can use a string in single quotes: >
+
+ var name = 'he is "Peter"'
+ echo name
+< he is "Peter" ~
+
+Inside a single-quote string all the characters are as they are. Only the
+single quote itself is special: you need to use two to get one. A backslash
+is taken literally, thus you can't use it to change the meaning of the
+character after it: >
+
+ var name = 'P\e''ter'''
+ echo name
+< P\e'ter' ~
+
+In double-quote strings it is possible to use special characters. Here are a
+few useful ones:
+
+ \t <Tab>
+ \n <NL>, line break
+ \r <CR>, <Enter>
+ \e <Esc>
+ \b <BS>, backspace
+ \" "
+ \\ \, backslash
+ \<Esc> <Esc>
+ \<C-W> CTRL-W
+
+The last two are just examples. The "\<name>" form can be used to include
+the special key "name".
+
+See |expr-quote| for the full list of special items in a string.
+
+==============================================================================
+*41.3* Expressions
+
+Vim has a fairly standard way to handle expressions. You can read the
+definition here: |expression-syntax|. Here we will show the most common
+items.
+
+The numbers, strings and variables mentioned above are expressions by
+themselves. Thus everywhere an expression is expected, you can use a number,
+string or variable. Other basic items in an expression are:
+
+ $NAME environment variable
+ &name option value
+ @r register contents
+
+Examples: >
+
+ echo "The value of 'tabstop' is" &ts
+ echo "Your home directory is" $HOME
+ if @a == 'text'
+
+The &name form can also be used to set an option value, do something and
+restore the old value. Example: >
+
+ var save_ic = &ic
+ set noic
+ s/The Start/The Beginning/
+ &ic = save_ic
+
+This makes sure the "The Start" pattern is used with the 'ignorecase' option
+off. Still, it keeps the value that the user had set. (Another way to do
+this would be to add "\C" to the pattern, see |/\C|.)
+
+
+MATHEMATICS
+
+It becomes more interesting if we combine these basic items. Let's start with
+mathematics on numbers:
+
+ a + b add
+ a - b subtract
+ a * b multiply
+ a / b divide
+ a % b modulo
+
+The usual precedence is used. Example: >
+
+ echo 10 + 5 * 2
+< 20 ~
+
+Grouping is done with parentheses. No surprises here. Example: >
+
+ echo (10 + 5) * 2
+< 30 ~
+
+
+OTHERS
+
+Strings can be concatenated with ".." (see |expr6|). Example: >
+
+ echo "Name: " .. name
+ Name: Peter
+
+When the "echo" command gets multiple arguments, it separates them with a
+space. In the example the argument is a single expression, thus no space is
+inserted.
+
+If you don't like the concatenation you can use the $"string" form, which
+accepts an expression in curly braces: >
+ echo $"Name: {name}"
+
+See |interpolated-string| for more information.
+
+Borrowed from the C language is the conditional expression: >
+
+ a ? b : c
+
+If "a" evaluates to true "b" is used, otherwise "c" is used. Example: >
+
+ var nr = 4
+ echo nr > 5 ? "nr is big" : "nr is small"
+< nr is small ~
+
+The three parts of the constructs are always evaluated first, thus you could
+see it works as: >
+
+ (a) ? (b) : (c)
+
+There is also the falsy operator: >
+ echo name ?? "No name given"
+See |??|.
+
+==============================================================================
+*41.4* Conditionals
+
+The `if` commands executes the following statements, until the matching
+`endif`, only when a condition is met. The generic form is:
+
+ if {condition}
+ {statements}
+ endif
+
+Only when the expression {condition} evaluates to true or one will the
+{statements} be executed. If they are not executed they must still be valid
+commands. If they contain garbage, Vim won't be able to find the matching
+`endif`.
+
+You can also use `else`. The generic form for this is:
+
+ if {condition}
+ {statements}
+ else
+ {statements}
+ endif
+
+The second {statements} block is only executed if the first one isn't.
+
+Finally, there is `elseif`
+
+ if {condition}
+ {statements}
+ elseif {condition}
+ {statements}
+ endif
+
+This works just like using `else` and then `if`, but without the need for an
+extra `endif`.
+
+A useful example for your vimrc file is checking the 'term' option and doing
+something depending upon its value: >
+
+ if &term == "xterm"
+ # Do stuff for xterm
+ elseif &term == "vt100"
+ # Do stuff for a vt100 terminal
+ else
+ # Do something for other terminals
+ endif
+
+This uses "#" to start a comment, more about that later.
+
+
+LOGIC OPERATIONS
+
+We already used some of them in the examples. These are the most often used
+ones:
+
+ a == b equal to
+ a != b not equal to
+ a > b greater than
+ a >= b greater than or equal to
+ a < b less than
+ a <= b less than or equal to
+
+The result is true if the condition is met and false otherwise. An example: >
+
+ if v:version >= 800
+ echo "congratulations"
+ else
+ echo "you are using an old version, upgrade!"
+ endif
+
+Here "v:version" is a variable defined by Vim, which has the value of the Vim
+version. 800 is for version 8.0, version 8.1 has the value 801. This is
+useful to write a script that works with multiple versions of Vim.
+See |v:version|. You can also check for a specific feature with `has()` or a
+specific patch, see |has-patch|.
+
+The logic operators work both for numbers and strings. When comparing two
+strings, the mathematical difference is used. This compares byte values,
+which may not be right for some languages.
+
+If you try to compare a string with a number you will get an error.
+
+For strings there are two more useful items:
+
+ str =~ pat matches with
+ str !~ pat does not match with
+
+The left item "str" is used as a string. The right item "pat" is used as a
+pattern, like what's used for searching. Example: >
+
+ if str =~ " "
+ echo "str contains a space"
+ endif
+ if str !~ '\.$'
+ echo "str does not end in a full stop"
+ endif
+
+Notice the use of a single-quote string for the pattern. This is useful,
+because patterns tend to contain many backslashes and backslashes need to be
+doubled in a double-quote string.
+
+The match is not anchored, if you want to match the whole string start with
+"^" and end with "$".
+
+The 'ignorecase' option is not used when comparing strings. When you do want
+to ignore case append "?". Thus "==?" compares two strings to be equal while
+ignoring case. For the full table see |expr-==|.
+
+
+MORE LOOPING
+
+The `while` command was already mentioned. Two more statements can be used in
+between the `while` and the `endwhile`:
+
+ continue Jump back to the start of the while loop; the
+ loop continues.
+ break Jump forward to the `endwhile`; the loop is
+ discontinued.
+
+Example: >
+
+ var counter = 1
+ while counter < 40
+ if skip_number(counter)
+ continue
+ endif
+ if last_number(counter)
+ break
+ endif
+ sleep 50m
+ ++counter
+ endwhile
+
+The `sleep` command makes Vim take a nap. The "50m" specifies fifty
+milliseconds. Another example is `sleep 4`, which sleeps for four seconds.
+
+`continue` and `break` can also be used in between `for` and `endfor`.
+Even more looping can be done with the `for` command, see below in |41.8|.
+
+==============================================================================
+*41.5* Executing an expression
+
+So far the commands in the script were executed by Vim directly. The
+`execute` command allows executing the result of an expression. This is a
+very powerful way to build commands and execute them.
+
+An example is to jump to a tag, which is contained in a variable: >
+
+ execute "tag " .. tag_name
+
+The ".." is used to concatenate the string "tag " with the value of variable
+"tag_name". Suppose "tag_name" has the value "get_cmd", then the command that
+will be executed is: >
+
+ tag get_cmd
+
+The `execute` command can only execute Ex commands. The `normal` command
+executes Normal mode commands. However, its argument is not an expression but
+the literal command characters. Example: >
+
+ normal gg=G
+
+This jumps to the first line with "gg" and formats all lines with the "="
+operator and the "G" movement.
+
+To make `normal` work with an expression, combine `execute` with it.
+Example: >
+
+ execute "normal " .. count .. "j"
+
+This will move the cursor "count" lines down.
+
+Make sure that the argument for `normal` is a complete command. Otherwise
+Vim will run into the end of the argument and silently abort the command. For
+example, if you start the delete operator, you must give the movement command
+also. This works: >
+
+ normal d$
+
+This does nothing: >
+
+ normal d
+
+If you start Insert mode and do not end it with Esc, it will end anyway. This
+works to insert "new text": >
+
+ execute "normal inew text"
+
+If you want to do something after inserting text you do need to end Insert
+mode: >
+
+ execute "normal inew text\<Esc>b"
+
+This inserts "new text" and puts the cursor on the first letter of "text".
+Notice the use of the special key "\<Esc>". This avoids having to enter a
+real <Esc> character in your script. That is where `execute` with a
+double-quote string comes in handy.
+
+If you don't want to execute a string as a command but evaluate it to get the
+result of the expression, you can use the eval() function: >
+
+ var optname = "path"
+ var optvalue = eval('&' .. optname)
+
+A "&" character is prepended to "path", thus the argument to eval() is
+"&path". The result will then be the value of the 'path' option.
+
+==============================================================================
+*41.6* Using functions
+
+Vim defines many functions and provides a large amount of functionality that
+way. A few examples will be given in this section. You can find the whole
+list below: |function-list|.
+
+A function is called with the parameters in between parentheses, separated by
+commas. Example: >
+
+ search("Date: ", "W")
+
+This calls the search() function, with arguments "Date: " and "W". The
+search() function uses its first argument as a search pattern and the second
+one as flags. The "W" flag means the search doesn't wrap around the end of
+the file.
+
+Using the `call` command is optional in |Vim9| script. It is required in
+legacy script and on the command line: >
+
+ call search("Date: ", "W")
+
+A function can be called in an expression. Example: >
+
+ var line = getline(".")
+ var repl = substitute(line, '\a', "*", "g")
+ setline(".", repl)
+
+The getline() function obtains a line from the current buffer. Its argument
+is a specification of the line number. In this case "." is used, which means
+the line where the cursor is.
+
+The substitute() function does something similar to the `:substitute` command.
+The first argument "line" is the string on which to perform the substitution.
+The second argument '\a' is the pattern, the third "*" is the replacement
+string. Finally, the last argument "g" is the flags.
+
+The setline() function sets the line, specified by the first argument, to a
+new string, the second argument. In this example the line under the cursor is
+replaced with the result of the substitute(). Thus the effect of the three
+statements is equal to: >
+
+ :substitute/\a/*/g
+
+Using the functions becomes interesting when you do more work before and
+after the substitute() call.
+
+
+FUNCTIONS *function-list*
+
+There are many functions. We will mention them here, grouped by what they are
+used for. You can find an alphabetical list here: |builtin-function-list|.
+Use CTRL-] on the function name to jump to detailed help on it.
+
+String manipulation: *string-functions*
+ nr2char() get a character by its number value
+ list2str() get a character string from a list of numbers
+ char2nr() get number value of a character
+ str2list() get list of numbers from a string
+ str2nr() convert a string to a Number
+ str2float() convert a string to a Float
+ printf() format a string according to % items
+ escape() escape characters in a string with a '\'
+ shellescape() escape a string for use with a shell command
+ fnameescape() escape a file name for use with a Vim command
+ tr() translate characters from one set to another
+ strtrans() translate a string to make it printable
+ keytrans() translate internal keycodes to a form that
+ can be used by |:map|
+ tolower() turn a string to lowercase
+ toupper() turn a string to uppercase
+ charclass() class of a character
+ match() position where a pattern matches in a string
+ matchend() position where a pattern match ends in a string
+ matchfuzzy() fuzzy matches a string in a list of strings
+ matchfuzzypos() fuzzy matches a string in a list of strings
+ 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
+ strlen() length of a string in bytes
+ strcharlen() length of a string in characters
+ strchars() number of characters in a string
+ strwidth() size of string when displayed
+ strdisplaywidth() size of string when displayed, deals with tabs
+ setcellwidths() set character cell width overrides
+ getcellwidths() get character cell width overrides
+ substitute() substitute a pattern match with a string
+ submatch() get a specific match in ":s" and substitute()
+ strpart() get part of a string using byte index
+ strcharpart() get part of a string using char index
+ slice() take a slice of a string, using char index in
+ Vim9 script
+ strgetchar() get character from a string using char index
+ expand() expand special keywords
+ expandcmd() expand a command like done for `:edit`
+ iconv() convert text from one encoding to another
+ byteidx() byte index of a character in a string
+ byteidxcomp() like byteidx() but count composing characters
+ charidx() character index of a byte in a string
+ repeat() repeat a string multiple times
+ eval() evaluate a string expression
+ execute() execute an Ex command and get the output
+ win_execute() like execute() but in a specified window
+ trim() trim characters from a string
+ gettext() lookup message translation
+
+List manipulation: *list-functions*
+ get() get an item without error for wrong index
+ len() number of items in a List
+ empty() check if List is empty
+ insert() insert an item somewhere in a List
+ add() append an item to a List
+ extend() append a List to a List
+ extendnew() make a new List and append items
+ remove() remove one or more items from a List
+ copy() make a shallow copy of a List
+ deepcopy() make a full copy of a List
+ filter() remove selected items from a List
+ map() change each List item
+ mapnew() make a new List with changed items
+ reduce() reduce a List to a value
+ slice() take a slice of a List
+ sort() sort a List
+ reverse() reverse the order of a List or Blob
+ uniq() remove copies of repeated adjacent items
+ split() split a String into a List
+ join() join List items into a String
+ range() return a List with a sequence of numbers
+ string() String representation of a List
+ call() call a function with List as arguments
+ index() index of a value in a List or Blob
+ indexof() index in a List or Blob where an expression
+ evaluates to true
+ max() maximum value in a List
+ min() minimum value in a List
+ count() count number of times a value appears in a List
+ repeat() repeat a List multiple times
+ flatten() flatten a List
+ flattennew() flatten a copy of a List
+
+Dictionary manipulation: *dict-functions*
+ get() get an entry without an error for a wrong key
+ len() number of entries in a Dictionary
+ has_key() check whether a key appears in a Dictionary
+ empty() check if Dictionary is empty
+ remove() remove an entry from a Dictionary
+ extend() add entries from one Dictionary to another
+ extendnew() make a new Dictionary and append items
+ filter() remove selected entries from a Dictionary
+ map() change each Dictionary entry
+ mapnew() make a new Dictionary with changed items
+ keys() get List of Dictionary keys
+ values() get List of Dictionary values
+ items() get List of Dictionary key-value pairs
+ copy() make a shallow copy of a Dictionary
+ deepcopy() make a full copy of a Dictionary
+ string() String representation of a Dictionary
+ max() maximum value in a Dictionary
+ min() minimum value in a Dictionary
+ count() count number of times a value appears
+
+Floating point computation: *float-functions*
+ float2nr() convert Float to Number
+ abs() absolute value (also works for Number)
+ round() round off
+ ceil() round up
+ floor() round down
+ trunc() remove value after decimal point
+ fmod() remainder of division
+ exp() exponential
+ log() natural logarithm (logarithm to base e)
+ log10() logarithm to base 10
+ pow() value of x to the exponent y
+ sqrt() square root
+ sin() sine
+ cos() cosine
+ tan() tangent
+ asin() arc sine
+ acos() arc cosine
+ atan() arc tangent
+ atan2() arc tangent
+ sinh() hyperbolic sine
+ cosh() hyperbolic cosine
+ tanh() hyperbolic tangent
+ isinf() check for infinity
+ isnan() check for not a number
+
+Blob manipulation: *blob-functions*
+ blob2list() get a list of numbers from a blob
+ list2blob() get a blob from a list of numbers
+
+Other computation: *bitwise-function*
+ and() bitwise AND
+ invert() bitwise invert
+ or() bitwise OR
+ xor() bitwise XOR
+ sha256() SHA-256 hash
+ rand() get a pseudo-random number
+ srand() initialize seed used by rand()
+
+Variables: *var-functions*
+ type() type of a variable as a number
+ typename() type of a variable as text
+ 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
+ getwinvar() get a variable from specific window
+ gettabvar() get a variable from specific tab page
+ gettabwinvar() get a variable from specific window & tab page
+ setwinvar() set a variable in a specific window
+ settabvar() set a variable in a specific tab page
+ settabwinvar() set a variable in a specific window & tab page
+ garbagecollect() possibly free memory
+
+Cursor and mark position: *cursor-functions* *mark-functions*
+ col() column number of the cursor or a mark
+ virtcol() screen column of the cursor or a mark
+ line() line number of the cursor or mark
+ wincol() window column number of the cursor
+ winline() window line number of the cursor
+ cursor() position the cursor at a line/column
+ screencol() get screen column of the cursor
+ screenrow() get screen row of the cursor
+ screenpos() screen row and col of a text character
+ virtcol2col() byte index of a text character on screen
+ getcurpos() get position of the cursor
+ getpos() get position of cursor, mark, etc.
+ setpos() set position of cursor, mark, etc.
+ getmarklist() list of global/local marks
+ byte2line() get line number at a specific byte count
+ line2byte() byte count at a specific line
+ diff_filler() get the number of filler lines above a line
+ screenattr() get attribute at a screen line/row
+ screenchar() get character code at a screen line/row
+ screenchars() get character codes at a screen line/row
+ screenstring() get string of characters at a screen line/row
+ charcol() character number of the cursor or a mark
+ getcharpos() get character position of cursor, mark, etc.
+ setcharpos() set character position of cursor, mark, etc.
+ getcursorcharpos() get character position of the cursor
+ setcursorcharpos() set character position of the cursor
+
+Working with text in the current buffer: *text-functions*
+ getline() get a line or list of lines from the buffer
+ setline() replace a line in the buffer
+ append() append line or list of lines in the buffer
+ indent() indent of a specific line
+ cindent() indent according to C indenting
+ lispindent() indent according to Lisp indenting
+ nextnonblank() find next non-blank line
+ prevnonblank() find previous non-blank line
+ search() find a match for a pattern
+ searchpos() find a match for a pattern
+ searchcount() get number of matches before/after the cursor
+ 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
+
+Working with text in another buffer:
+ getbufline() get a list of lines from the specified buffer
+ getbufoneline() get a one line from the specified buffer
+ setbufline() replace a line in the specified buffer
+ appendbufline() append a list of lines in the specified buffer
+ deletebufline() delete lines from a specified buffer
+
+ *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
+ fnamemodify() modify a file name
+ pathshorten() shorten directory names in a path
+ simplify() simplify a path without changing its meaning
+ executable() check if an executable program exists
+ exepath() full path of an executable program
+ 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
+ isabsolutepath() check if a path is absolute
+ isdirectory() check if a directory exists
+ getfsize() get the size of a file
+ getcwd() get the current working directory
+ haslocaldir() check if current window used |:lcd| or |:tcd|
+ tempname() get the name of a temporary file
+ mkdir() create a new directory
+ chdir() change current working directory
+ delete() delete a file
+ rename() rename a file
+ system() get the result of a shell command as a string
+ systemlist() get the result of a shell command as a list
+ environ() get all environment variables
+ getenv() get one environment variable
+ setenv() set an environment variable
+ hostname() name of the system
+ readfile() read a file into a List of lines
+ readblob() read a file into a Blob
+ readdir() get a List of file names in a directory
+ readdirex() get a List of file information in a directory
+ writefile() write a List of lines or Blob into a file
+
+Date and Time: *date-functions* *time-functions*
+ getftime() get last modification time of a file
+ localtime() get current time in seconds
+ strftime() convert time to a string
+ strptime() convert a date/time string to time
+ reltime() get the current or elapsed time accurately
+ reltimestr() convert reltime() result to a string
+ reltimefloat() convert reltime() result to a Float
+
+Autocmds: *autocmd-functions*
+ autocmd_add() add a list of autocmds and groups
+ autocmd_delete() delete a list of autocmds and groups
+ autocmd_get() return a list of autocmds
+
+ *buffer-functions* *window-functions* *arg-functions*
+Buffers, windows and the argument list:
+ argc() number of entries in the argument list
+ argidx() current position in the argument list
+ arglistid() get id of the argument list
+ argv() get one entry from the argument list
+ bufadd() add a file to the list of buffers
+ bufexists() check if a buffer exists
+ buflisted() check if a buffer exists and is listed
+ bufload() ensure a buffer is loaded
+ bufloaded() check if a buffer exists and is loaded
+ bufname() get the name of a specific buffer
+ bufnr() get the buffer number of a specific buffer
+ tabpagebuflist() return List of buffers in a tab page
+ 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
+ listener_add() add a callback to listen to changes
+ listener_flush() invoke listener callbacks
+ listener_remove() remove a listener callback
+ win_findbuf() find windows containing a buffer
+ win_getid() get window ID of a window
+ win_gettype() get type of 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
+ win_move_separator() move window vertical separator
+ win_move_statusline() move window status line
+ win_splitmove() move window to a split of another window
+ getbufinfo() get a list with buffer information
+ gettabinfo() get a list with tab page information
+ getwininfo() get a list with window information
+ getchangelist() get a list of change list entries
+ getjumplist() get a list of jump list entries
+ swapfilelist() list of existing swap files in 'directory'
+ swapinfo() information about a swap file
+ swapname() get the swap file path of a buffer
+
+Command line: *command-line-functions*
+ getcmdcompltype() get the type of the current command line
+ completion
+ getcmdline() get the current command line
+ getcmdpos() get position of the cursor in the command line
+ getcmdscreenpos() get screen position of the cursor in the
+ command line
+ setcmdline() set the current command line
+ 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
+ fullcommand() get full command name
+
+Quickfix and location lists: *quickfix-functions*
+ getqflist() list of quickfix errors
+ setqflist() modify a quickfix list
+ getloclist() list of location list items
+ setloclist() modify a location list
+
+Insert mode completion: *completion-functions*
+ complete() set found matches
+ complete_add() add to found matches
+ complete_check() check if completion should be aborted
+ complete_info() get current completion information
+ pumvisible() check if the popup menu is displayed
+ pum_getpos() position and size of popup menu if visible
+
+Folding: *folding-functions*
+ foldclosed() check for a closed fold at a specific line
+ foldclosedend() like foldclosed() but return the last line
+ foldlevel() check for the fold level at a specific line
+ foldtext() generate the line displayed for a closed fold
+ foldtextresult() get the text displayed for a closed fold
+
+Syntax and highlighting: *syntax-functions* *highlighting-functions*
+ clearmatches() clear all matches defined by |matchadd()| and
+ the |:match| commands
+ getmatches() get all matches defined by |matchadd()| and
+ the |:match| commands
+ hlexists() check if a highlight group exists
+ hlget() get highlight group attributes
+ hlset() set highlight group attributes
+ hlID() get ID of a highlight group
+ synID() get syntax ID at a specific position
+ synIDattr() get a specific attribute of a syntax ID
+ synIDtrans() get translated syntax ID
+ synstack() get list of syntax IDs at a specific position
+ synconcealed() get info about concealing
+ diff_hlID() get highlight ID for diff mode at a position
+ matchadd() define a pattern to highlight (a "match")
+ matchaddpos() define a list of positions to highlight
+ matcharg() get info about |:match| arguments
+ matchdelete() delete a match defined by |matchadd()| or a
+ |:match| command
+ setmatches() restore a list of matches saved by
+ |getmatches()|
+
+Spelling: *spell-functions*
+ spellbadword() locate badly spelled word at or after cursor
+ spellsuggest() return suggested spelling corrections
+ soundfold() return the sound-a-like equivalent of a word
+
+History: *history-functions*
+ histadd() add an item to a history
+ histdel() delete an item from a history
+ histget() get an item from a history
+ histnr() get highest index of a history list
+
+Interactive: *interactive-functions*
+ browse() put up a file requester
+ browsedir() put up a directory requester
+ confirm() let the user make a choice
+ getchar() get a character from the user
+ getcharstr() get a character from the user as a string
+ getcharmod() get modifiers for the last typed character
+ getmousepos() get last known mouse position
+ getmouseshape() get name of the current mouse shape
+ echoraw() output characters as-is
+ feedkeys() put characters in the typeahead queue
+ input() get a line from the user
+ inputlist() let the user pick an entry from a list
+ inputsecret() get a line from the user without showing it
+ inputdialog() get a line from the user in a dialog
+ inputsave() save and clear typeahead
+ inputrestore() restore typeahead
+
+GUI: *gui-functions*
+ getfontname() get name of current font being used
+ 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
+ balloon_gettext() get the text in the 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
+ remote_peek() check if there is a reply from a Vim server
+ remote_read() read a reply from a Vim server
+ foreground() move the Vim window to the foreground
+ remote_foreground() move the Vim server window to the foreground
+
+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
+ winlayout() get layout of windows in a tab page
+ winrestcmd() return command to restore window sizes
+ winsaveview() get view of current window
+ winrestview() restore saved view of current window
+
+Mappings and Menus: *mapping-functions*
+ digraph_get() get |digraph|
+ digraph_getlist() get all |digraph|s
+ digraph_set() register |digraph|
+ digraph_setlist() register multiple |digraph|s
+ hasmapto() check if a mapping exists
+ mapcheck() check if a matching mapping exists
+ maparg() get rhs of a mapping
+ maplist() get list of all mappings
+ mapset() restore a mapping
+ menu_info() get information about a menu item
+ wildmenumode() check if the wildmode is active
+
+Testing: *test-functions*
+ assert_equal() assert that two expressions values are equal
+ assert_equalfile() assert that two file contents 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_beeps() assert that a command beeps
+ assert_nobeep() assert that a command does not cause a beep
+ assert_fails() assert that a command fails
+ assert_report() report a test failure
+ test_alloc_fail() make memory allocation fail
+ test_autochdir() enable 'autochdir' during startup
+ test_override() test with Vim internal overrides
+ test_garbagecollect_now() free memory right now
+ test_garbagecollect_soon() set a flag to free memory soon
+ test_getvalue() get value of an internal variable
+ test_gui_event() generate a GUI event for testing
+ test_ignore_error() ignore a specific error message
+ test_mswin_event() generate an MS-Windows event
+ test_null_blob() return a null Blob
+ test_null_channel() return a null Channel
+ test_null_dict() return a null Dict
+ test_null_function() return a null Funcref
+ test_null_job() return a null Job
+ test_null_list() return a null List
+ test_null_partial() return a null Partial function
+ test_null_string() return a null String
+ test_settime() set the time Vim uses internally
+ test_setmouse() set the mouse position
+ test_feedinput() add key sequence to input buffer
+ test_option_not_set() reset flag indicating option was set
+ test_refcount() return an expression's reference count
+ test_srand_seed() set the seed value for srand()
+ test_unknown() return a value with unknown type
+ test_void() return a value with void type
+
+Inter-process communication: *channel-functions*
+ ch_canread() check if there is something to read
+ ch_open() open a channel
+ ch_close() close a channel
+ ch_close_in() close the in part of a channel
+ ch_read() read a message from a channel
+ ch_readblob() read a Blob from a channel
+ ch_readraw() read a raw message from a channel
+ ch_sendexpr() send a JSON message over a channel
+ ch_sendraw() send a raw message over a channel
+ ch_evalexpr() evaluate an expression over channel
+ ch_evalraw() evaluate a raw string over channel
+ ch_status() get status of a channel
+ ch_getbufnr() get the buffer number of a channel
+ ch_getjob() get the job associated with a channel
+ ch_info() get channel information
+ ch_log() write a message in the channel log file
+ ch_logfile() set the channel log file
+ ch_setoptions() set the options for a channel
+ json_encode() encode an expression to a JSON string
+ json_decode() decode a JSON string to Vim types
+ js_encode() encode an expression to a JSON string
+ js_decode() decode a JSON string to Vim types
+
+Jobs: *job-functions*
+ job_start() start a job
+ job_stop() stop a job
+ job_status() get the status of a job
+ job_getchannel() get the channel used by a job
+ job_info() get information about a job
+ job_setoptions() set options for a job
+
+Signs: *sign-functions*
+ sign_define() define or update a sign
+ sign_getdefined() get a list of defined signs
+ sign_getplaced() get a list of placed signs
+ sign_jump() jump to a sign
+ sign_place() place a sign
+ sign_placelist() place a list of signs
+ sign_undefine() undefine a sign
+ sign_unplace() unplace a sign
+ sign_unplacelist() unplace a list of signs
+
+Terminal window: *terminal-functions*
+ term_start() open a terminal window and run a job
+ term_list() get the list of terminal buffers
+ term_sendkeys() send keystrokes to a terminal
+ term_wait() wait for screen to be updated
+ term_getjob() get the job associated with a terminal
+ term_scrape() get row of a terminal screen
+ term_getline() get a line of text from a terminal
+ term_getattr() get the value of attribute {what}
+ term_getcursor() get the cursor position of a terminal
+ term_getscrolled() get the scroll count of a terminal
+ term_getaltscreen() get the alternate screen flag
+ term_getsize() get the size of a terminal
+ term_getstatus() get the status of a terminal
+ term_gettitle() get the title of a terminal
+ term_gettty() get the tty name of a terminal
+ term_setansicolors() set 16 ANSI colors, used for GUI
+ term_getansicolors() get 16 ANSI colors, used for GUI
+ term_dumpdiff() display difference between two screen dumps
+ term_dumpload() load a terminal screen dump in a window
+ term_dumpwrite() dump contents of a terminal screen to a file
+ term_setkill() set signal to stop job in a terminal
+ term_setrestore() set command to restore a terminal
+ term_setsize() set the size of a terminal
+ term_setapi() set terminal JSON API function name prefix
+
+Popup window: *popup-window-functions*
+ popup_create() create popup centered in the screen
+ popup_atcursor() create popup just above the cursor position,
+ closes when the cursor moves away
+ popup_beval() at the position indicated by v:beval_
+ variables, closes when the mouse moves away
+ popup_notification() show a notification for three seconds
+ popup_dialog() create popup centered with padding and border
+ popup_menu() prompt for selecting an item from a list
+ popup_hide() hide a popup temporarily
+ popup_show() show a previously hidden popup
+ popup_move() change the position and size of a popup
+ popup_setoptions() override options of a popup
+ popup_settext() replace the popup buffer contents
+ popup_close() close one popup
+ popup_clear() close all popups
+ popup_filter_menu() select from a list of items
+ popup_filter_yesno() block until 'y' or 'n' is pressed
+ popup_getoptions() get current options for a popup
+ popup_getpos() get actual position and size of a popup
+ popup_findecho() get window ID for popup used for `:echowindow`
+ popup_findinfo() get window ID for popup info window
+ popup_findpreview() get window ID for popup preview window
+ popup_list() get list of all popup window IDs
+ popup_locate() get popup window ID from its screen position
+
+Timers: *timer-functions*
+ timer_start() create a timer
+ timer_pause() pause or unpause a timer
+ timer_stop() stop a timer
+ timer_stopall() stop all timers
+ timer_info() get information about timers
+
+Tags: *tag-functions*
+ taglist() get list of matching tags
+ tagfiles() get a list of tags files
+ gettagstack() get the tag stack of a window
+ settagstack() modify the tag stack of a window
+
+Prompt Buffer: *promptbuffer-functions*
+ prompt_getprompt() get the effective prompt text for a buffer
+ prompt_setcallback() set prompt callback for a buffer
+ prompt_setinterrupt() set interrupt callback for a buffer
+ prompt_setprompt() set the prompt text for a buffer
+
+Registers: *register-functions*
+ getreg() get contents of a register
+ getreginfo() get information about a register
+ getregtype() get type of a register
+ setreg() set contents and type of a register
+ reg_executing() return the name of the register being executed
+ reg_recording() return the name of the register being recorded
+
+Text Properties: *text-property-functions*
+ prop_add() attach a property at a position
+ prop_add_list() attach a property at multiple positions
+ prop_clear() remove all properties from a line or lines
+ prop_find() search for a property
+ prop_list() return a list of all properties in a line
+ prop_remove() remove a property from a line
+ prop_type_add() add/define a property type
+ prop_type_change() change properties of a type
+ prop_type_delete() remove a text property type
+ prop_type_get() return the properties of a type
+ prop_type_list() return a list of all property types
+
+Sound: *sound-functions*
+ sound_clear() stop playing all sounds
+ sound_playevent() play an event's sound
+ sound_playfile() play a sound file
+ sound_stop() stop playing a sound
+
+Various: *various-functions*
+ mode() get current editing mode
+ state() get current busy state
+ visualmode() last visual mode used
+ exists() check if a variable, function, etc. exists
+ exists_compiled() like exists() but check at compile time
+ has() check if a feature is supported in Vim
+ changenr() return number of most recent change
+ cscope_connection() check if a cscope connection exists
+ did_filetype() check if a FileType autocommand was used
+ eventhandler() check if invoked by an event handler
+ getpid() get process ID of Vim
+ getscriptinfo() get list of sourced vim scripts
+ getimstatus() check if IME status is active
+ interrupt() interrupt script execution
+ windowsversion() get MS-Windows version
+ terminalprops() properties of the terminal
+
+ libcall() call a function in an external library
+ libcallnr() idem, returning a number
+
+ undofile() get the name of the undo file
+ undotree() return the state of the undo tree
+
+ shiftwidth() effective value of 'shiftwidth'
+
+ wordcount() get byte/word/char count of buffer
+
+ luaeval() evaluate |Lua| expression
+ mzeval() evaluate |MzScheme| expression
+ perleval() evaluate Perl expression (|+perl|)
+ py3eval() evaluate Python expression (|+python3|)
+ pyeval() evaluate Python expression (|+python|)
+ pyxeval() evaluate |python_x| expression
+ rubyeval() evaluate |Ruby| expression
+
+ debugbreak() interrupt a program being debugged
+
+==============================================================================
+*41.7* Defining a function
+
+Vim enables you to define your own functions. The basic function declaration
+begins as follows: >
+
+ def {name}({var1}, {var2}, ...): return-type
+ {body}
+ enddef
+<
+ Note:
+ Function names must begin with a capital letter.
+
+Let's define a short function to return the smaller of two numbers. It starts
+with this line: >
+
+ def Min(num1: number, num2: number): number
+
+This tells Vim that the function is named "Min", it takes two arguments that
+are numbers: "num1" and "num2" and returns a number.
+
+The first thing you need to do is to check to see which number is smaller:
+ >
+ if num1 < num2
+
+Let's assign the variable "smaller" the value of the smallest number: >
+
+ var smaller: number
+ if num1 < num2
+ smaller = num1
+ else
+ smaller = num2
+ endif
+
+The variable "smaller" is a local variable. It is declared to be a number,
+that way Vim can warn you for any mistakes. Variables used inside a function
+are local unless prefixed by something like "g:", "w:", or "b:".
+
+ Note:
+ To access a global variable from inside a function you must prepend
+ "g:" to it. Thus "g:today" inside a function is used for the global
+ variable "today", and "today" is another variable, local to the
+ function or the script.
+
+You now use the `return` statement to return the smallest number to the user.
+Finally, you end the function: >
+
+ return smaller
+ enddef
+
+The complete function definition is as follows: >
+
+ def Min(num1: number, num2: number): number
+ var smaller: number
+ if num1 < num2
+ smaller = num1
+ else
+ smaller = num2
+ endif
+ return smaller
+ enddef
+
+Obviously this is a verbose example. You can make it shorter by using two
+return commands: >
+
+ def Min(num1: number, num2: number): number
+ if num1 < num2
+ return num1
+ endif
+ return num2
+ enddef
+
+And if you remember the conditional expression, you need only one line: >
+
+ def Min(num1: number, num2: number): number
+ return num1 < num2 ? num1 : num2
+ enddef
+
+A user defined function is called in exactly the same way as a built-in
+function. Only the name is different. The Min function can be used like
+this: >
+
+ echo Min(5, 8)
+
+Only now will the function be executed and the lines be parsed by Vim.
+If there are mistakes, like using an undefined variable or function, you will
+now get an error message. When defining the function these errors are not
+detected. To get the errors sooner you can tell Vim to compile all the
+functions in the script: >
+
+ defcompile
+
+Compiling functions takes a little time, but does report errors early. You
+could use `:defcompile` at the end of your script while working on it, and
+comment it out when everything is fine.
+
+For a function that does not return anything simply leave out the return type: >
+
+ def SayIt(text: string)
+ echo text
+ enddef
+
+If you want to return any kind of value, you can use the "any" return type: >
+ def GetValue(): any
+This disables type checking for the return value, use only when needed.
+
+It is also possible to define a legacy function with `function` and
+`endfunction`. These do not have types and are not compiled. Therefore they
+execute much slower.
+
+
+USING A RANGE
+
+A line range can be used with a function call. The function will be called
+once for every line in the range, with the cursor in that line. Example: >
+
+ def Number()
+ echo "line " .. line(".") .. " contains: " .. getline(".")
+ enddef
+
+If you call this function with: >
+
+ :10,15Number()
+
+The function will be called six times, starting on line 10 and ending on line
+15.
+
+
+LISTING FUNCTIONS
+
+The `function` command lists the names and arguments of all user-defined
+functions: >
+
+ :function
+< def <SNR>86_Show(start: string, ...items: list<string>) ~
+ function GetVimIndent() ~
+ function SetSyn(name) ~
+
+The "<SNR>" prefix means that a function is script-local. |Vim9| functions
+will start with "def" and include argument and return types. Legacy functions
+are listed with "function".
+
+To see what a function does, use its name as an argument for `function`: >
+
+ :function SetSyn
+< 1 if &syntax == '' ~
+ 2 let &syntax = a:name ~
+ 3 endif ~
+ endfunction ~
+
+To see the "Show" function you need to include the script prefix, since
+multiple "Show" functions can be defined in different scripts. To find
+the exact name you can use `function`, but the result may be a very long list.
+To only get the functions matching a pattern you can use the `filter` prefix:
+>
+ :filter Show function
+< def <SNR>86_Show(start: string, ...items: list<string>) ~
+>
+ :function <SNR>86_Show
+< 1 echohl Title ~
+ 2 echo "start is " .. start ~
+ etc.
+
+
+DEBUGGING
+
+The line number is useful for when you get an error message or when debugging.
+See |debug-scripts| about debugging mode.
+
+You can also set the 'verbose' option to 12 or higher to see all function
+calls. Set it to 15 or higher to see every executed line.
+
+
+DELETING A FUNCTION
+
+To delete the SetSyn() function: >
+
+ :delfunction SetSyn
+
+Deleting only works for global functions and functions in legacy script, not
+for functions defined in a |Vim9| script.
+
+You get an error when the function doesn't exist or cannot be deleted.
+
+
+FUNCTION REFERENCES
+
+Sometimes it can be useful to have a variable point to one function or
+another. You can do it with a function reference variable. Often shortened
+to "funcref". Example: >
+
+ def Right(): string
+ return 'Right!'
+ enddef
+ def Wrong(): string
+ return 'Wrong!'
+ enddef
+
+ var Afunc = g:result == 1 ? Right : Wrong
+ echo Afunc()
+< Wrong! ~
+
+This assumes "g:result" is not one. See |Funcref| for details.
+
+Note that the name of a variable that holds a function reference must start
+with a capital. Otherwise it could be confused with the name of a builtin
+function.
+
+
+FURTHER READING
+
+Using a variable number of arguments is introduced in section |50.2|.
+
+More information about defining your own functions here: |user-functions|.
+
+==============================================================================
+*41.8* Lists and Dictionaries
+
+So far we have used the basic types String and Number. Vim also supports two
+composite types: List and Dictionary.
+
+A List is an ordered sequence of items. The items can be any kind of value,
+thus you can make a List of numbers, a List of Lists and even a List of mixed
+items. To create a List with three strings: >
+
+ var alist = ['aap', 'noot', 'mies']
+
+The List items are enclosed in square brackets and separated by commas. To
+create an empty List: >
+
+ var alist = []
+
+You can add items to a List with the add() function: >
+
+ var alist = []
+ add(alist, 'foo')
+ add(alist, 'bar')
+ echo alist
+< ['foo', 'bar'] ~
+
+List concatenation is done with +: >
+
+ var alist = ['foo', 'bar']
+ alist = alist + ['and', 'more']
+ echo alist
+< ['foo', 'bar', 'and', 'more'] ~
+
+Or, if you want to extend a List with a function, use `extend()`: >
+
+ var alist = ['one']
+ extend(alist, ['two', 'three'])
+ echo alist
+< ['one', 'two', 'three'] ~
+
+Notice that using `add()` will have a different effect than `extend()`: >
+
+ var alist = ['one']
+ add(alist, ['two', 'three'])
+ echo alist
+< ['one', ['two', 'three']] ~
+
+The second argument of add() is added as an item, now you have a nested list.
+
+
+FOR LOOP
+
+One of the nice things you can do with a List is iterate over it: >
+
+ var alist = ['one', 'two', 'three']
+ for n in alist
+ echo n
+ endfor
+< one ~
+ two ~
+ three ~
+
+This will loop over each element in List "alist", assigning each value to
+variable "n". The generic form of a for loop is: >
+
+ for {varname} in {list-expression}
+ {commands}
+ endfor
+
+To loop a certain number of times you need a List of a specific length. The
+range() function creates one for you: >
+
+ for a in range(3)
+ echo a
+ endfor
+< 0 ~
+ 1 ~
+ 2 ~
+
+Notice that the first item of the List that range() produces is zero, thus the
+last item is one less than the length of the list. Detail: Internally range()
+does not actually create the list, so that a large range used in a for loop
+works efficiently. When used elsewhere, the range is turned into an actual
+list, which takes more time for a long list.
+
+You can also specify the maximum value, the stride and even go backwards: >
+
+ for a in range(8, 4, -2)
+ echo a
+ endfor
+< 8 ~
+ 6 ~
+ 4 ~
+
+A more useful example, looping over all the lines in the buffer: >
+
+ for line in getline(1, 50)
+ if line =~ "Date: "
+ echo line
+ endif
+ endfor
+
+This looks into lines 1 to 50 (inclusive) and echoes any date found in there.
+
+For further reading see |Lists|.
+
+
+DICTIONARIES
+
+A Dictionary stores key-value pairs. You can quickly lookup a value if you
+know the key. A Dictionary is created with curly braces: >
+
+ var uk2nl = {one: 'een', two: 'twee', three: 'drie'}
+
+Now you can lookup words by putting the key in square brackets: >
+
+ echo uk2nl['two']
+< twee ~
+
+If the key does not have special characters, you can use the dot notation: >
+
+ echo uk2nl.two
+< twee ~
+
+The generic form for defining a Dictionary is: >
+
+ {<key> : <value>, ...}
+
+An empty Dictionary is one without any keys: >
+
+ {}
+
+The possibilities with Dictionaries are numerous. There are various functions
+for them as well. For example, you can obtain a list of the keys and loop
+over them: >
+
+ for key in keys(uk2nl)
+ echo key
+ endfor
+< three ~
+ one ~
+ two ~
+
+You will notice the keys are not ordered. You can sort the list to get a
+specific order: >
+
+ for key in sort(keys(uk2nl))
+ echo key
+ endfor
+< one ~
+ three ~
+ two ~
+
+But you can never get back the order in which items are defined. For that you
+need to use a List, it stores items in an ordered sequence.
+
+For further reading see |Dictionaries|.
+
+==============================================================================
+*41.9* White space
+
+Blank lines are allowed in a script and ignored.
+
+Leading whitespace characters (blanks and TABs) are ignored, except when using
+|:let-heredoc| without "trim".
+
+Trailing whitespace is often ignored, but not always. One command that
+includes it is `map`. You have to watch out for that, it can cause hard to
+understand mistakes. A generic solution is to never use trailing white space,
+unless you really need it.
+
+To include a whitespace character in the value of an option, it must be
+escaped by a "\" (backslash) as in the following example: >
+
+ :set tags=my\ nice\ file
+
+If it would be written as: >
+
+ :set tags=my nice file
+
+This will issue an error, because it is interpreted as: >
+
+ :set tags=my
+ :set nice
+ :set file
+
+|Vim9| script is very picky when it comes to white space. This was done
+intentionally to make sure scripts are easy to read and to avoid mistakes.
+If you use white space sensibly it will just work. When not you will get an
+error message telling you where white space is missing or should be removed.
+
+==============================================================================
+*41.10* Line continuation
+
+In legacy Vim script line continuation is done by preceding a continuation
+line with a backslash: >
+ let mylist = [
+ \ 'one',
+ \ 'two',
+ \ ]
+
+This requires the 'cpo' option to exclude the "C" flag. Normally this is done
+by putting this at the start of the script: >
+ let s:save_cpo = &cpo
+ set cpo&vim
+
+And restore the option at the end of the script: >
+ let &cpo = s:save_cpo
+ unlet s:save_cpo
+
+A few more details can be found here: |line-continuation|.
+
+In |Vim9| script the backslash can still be used, but in most places it is not
+needed: >
+ var mylist = [
+ 'one',
+ 'two',
+ ]
+
+Also, the 'cpo' option does not need to be changed. See
+|vim9-line-continuation| for details.
+
+==============================================================================
+*41.11* Comments
+
+In |Vim9| script the character # starts a comment. That character and
+everything after it until the end-of-line is considered a comment and
+is ignored, except for commands that don't consider comments, as shown in
+examples below. A comment can start on any character position on the line,
+but not when it is part of the command, e.g. inside a string.
+
+The character " (the double quote mark) starts a comment in legacy script.
+This involves some cleverness to make sure double quoted strings are not
+recognized as comments (just one reason to prefer |Vim9| script).
+
+There is a little "catch" with comments for some commands. Examples: >
+
+ abbrev dev development # shorthand
+ map <F3> o#include # insert include
+ execute cmd # do it
+ !ls *.c # list C files
+
+- The abbreviation 'dev' will be expanded to 'development # shorthand'.
+- The mapping of <F3> will actually be the whole line after the 'o# ....'
+ including the '# insert include'.
+- The `execute` command will give an error.
+- The `!` command will send everything after it to the shell, most likely
+ causing an error.
+
+There can be no comment after `map`, `abbreviate`, `execute` and `!` commands
+(there are a few more commands with this restriction). For the `map`,
+`abbreviate` and `execute` commands there is a trick: >
+
+ abbrev dev development|# shorthand
+ map <F3> o#include|# insert include
+ execute '!ls *.c' |# do it
+
+With the '|' character the command is separated from the next one. And that
+next command is only a comment. The last command, using `execute` is a
+general solution, it works for all commands that do not accept a comment or a
+'|' to separate the next command.
+
+Notice that there is no white space before the '|' in the abbreviation and
+mapping. For these commands, any character until the end-of-line or '|' is
+included. As a consequence of this behavior, you don't always see that
+trailing whitespace is included: >
+
+ map <F4> o#include
+
+Here it is intended, in other cases it might be accidental. To spot these
+problems, you can highlight trailing spaces: >
+ match Search /\s\+$/
+
+For Unix there is one special way to comment a line, that allows making a Vim
+script executable, and it also works in legacy script: >
+ #!/usr/bin/env vim -S
+ echo "this is a Vim script"
+ quit
+
+==============================================================================
+*41.12* Fileformat
+
+The end-of-line character depends on the system. For Vim scripts it is
+recommended to always use the Unix fileformat. Lines are then separated with
+the Newline character. This also works on any other system. That way you can
+copy your Vim scripts from MS-Windows to Unix and they still work. See
+|:source_crnl|. To be sure it is set right, do this before writing the file:
+>
+ :setlocal fileformat=unix
+
+When using "dos" fileformat, lines are separated with CR-NL, two characters.
+The CR character causes various problems, better avoid this.
+
+==============================================================================
+
+Advance information about writing Vim script is in |usr_50.txt|.
+
+Next chapter: |usr_42.txt| Add new menus
+
+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
new file mode 100644
index 0000000..cef7ae0
--- /dev/null
+++ b/runtime/doc/usr_42.txt
@@ -0,0 +1,366 @@
+*usr_42.txt* For Vim version 9.0. Last change: 2008 May 05
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Add new menus
+
+
+By now you know that Vim is very flexible. This includes the menus used in
+the GUI. You can define your own menu entries to make certain commands easily
+accessible. This is for mouse-happy users only.
+
+|42.1| Introduction
+|42.2| Menu commands
+|42.3| Various
+|42.4| Toolbar and popup menus
+
+ Next chapter: |usr_43.txt| Using filetypes
+ Previous chapter: |usr_41.txt| Write a Vim script
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*42.1* Introduction
+
+The menus that Vim uses are defined in the file "$VIMRUNTIME/menu.vim". If
+you want to write your own menus, you might first want to look through that
+file.
+ To define a menu item, use the ":menu" command. The basic form of this
+command is as follows: >
+
+ :menu {menu-item} {keys}
+
+The {menu-item} describes where on the menu to put the item. A typical
+{menu-item} is "File.Save", which represents the item "Save" under the
+"File" menu. A dot is used to separate the names. Example: >
+
+ :menu File.Save :update<CR>
+
+The ":update" command writes the file when it was modified.
+ You can add another level: "Edit.Settings.Shiftwidth" defines a submenu
+"Settings" under the "Edit" menu, with an item "Shiftwidth". You could use
+even deeper levels. Don't use this too much, you need to move the mouse quite
+a bit to use such an item.
+ The ":menu" command is very similar to the ":map" command: the left side
+specifies how the item is triggered and the right hand side defines the
+characters that are executed. {keys} are characters, they are used just like
+you would have typed them. Thus in Insert mode, when {keys} is plain text,
+that text is inserted.
+
+
+ACCELERATORS
+
+The ampersand character (&) is used to indicate an accelerator. For instance,
+you can use Alt-F to select "File" and S to select "Save". (The 'winaltkeys'
+option may disable this though!). Therefore, the {menu-item} looks like
+"&File.&Save". The accelerator characters will be underlined in the menu.
+ You must take care that each key is used only once in each menu. Otherwise
+you will not know which of the two will actually be used. Vim doesn't warn
+you for this.
+
+
+PRIORITIES
+
+The actual definition of the File.Save menu item is as follows: >
+
+ :menu 10.340 &File.&Save<Tab>:w :confirm w<CR>
+
+The number 10.340 is called the priority number. It is used by the editor to
+decide where it places the menu item. The first number (10) indicates the
+position on the menu bar. Lower numbered menus are positioned to the left,
+higher numbers to the right.
+ These are the priorities used for the standard menus:
+
+ 10 20 40 50 60 70 9999
+
+ +------------------------------------------------------------+
+ | File Edit Tools Syntax Buffers Window Help |
+ +------------------------------------------------------------+
+
+Notice that the Help menu is given a very high number, to make it appear on
+the far right.
+ The second number (340) determines the location of the item within the
+pull-down menu. Lower numbers go on top, higher number on the bottom. These
+are the priorities in the File menu:
+
+ +-----------------+
+ 10.310 |Open... |
+ 10.320 |Split-Open... |
+ 10.325 |New |
+ 10.330 |Close |
+ 10.335 |---------------- |
+ 10.340 |Save |
+ 10.350 |Save As... |
+ 10.400 |---------------- |
+ 10.410 |Split Diff with |
+ 10.420 |Split Patched By |
+ 10.500 |---------------- |
+ 10.510 |Print |
+ 10.600 |---------------- |
+ 10.610 |Save-Exit |
+ 10.620 |Exit |
+ +-----------------+
+
+Notice that there is room in between the numbers. This is where you can
+insert your own items, if you really want to (it's often better to leave the
+standard menus alone and add a new menu for your own items).
+ When you create a submenu, you can add another ".number" to the priority.
+Thus each name in {menu-item} has its priority number.
+
+
+SPECIAL CHARACTERS
+
+The {menu-item} in this example is "&File.&Save<Tab>:w". This brings up an
+important point: {menu-item} must be one word. If you want to put a dot,
+space or tabs in the name, you either use the <> notation (<Space> and <Tab>,
+for instance) or use the backslash (\) escape. >
+
+ :menu 10.305 &File.&Do\ It\.\.\. :exit<CR>
+
+In this example, the name of the menu item "Do It..." contains a space and the
+command is ":exit<CR>".
+
+The <Tab> character in a menu name is used to separate the part that defines
+the menu name from the part that gives a hint to the user. The part after the
+<Tab> is displayed right aligned in the menu. In the File.Save menu the name
+used is "&File.&Save<Tab>:w". Thus the menu name is "File.Save" and the hint
+is ":w".
+
+
+SEPARATORS
+
+The separator lines, used to group related menu items together, can be defined
+by using a name that starts and ends in a '-'. For example "-sep-". When
+using several separators the names must be different. Otherwise the names
+don't matter.
+ The command from a separator will never be executed, but you have to define
+one anyway. A single colon will do. Example: >
+
+ :amenu 20.510 Edit.-sep3- :
+
+==============================================================================
+*42.2* Menu commands
+
+You can define menu items that exist for only certain modes. This works just
+like the variations on the ":map" command:
+
+ :menu Normal, Visual and Operator-pending mode
+ :nmenu Normal mode
+ :vmenu Visual mode
+ :omenu Operator-pending mode
+ :menu! Insert and Command-line mode
+ :imenu Insert mode
+ :cmenu Command-line mode
+ :tlmenu Terminal mode
+ :amenu All modes (except for Terminal mode)
+
+To avoid that the commands of a menu item are being mapped, use the command
+":noremenu", ":nnoremenu", ":anoremenu", etc.
+
+
+USING :AMENU
+
+The ":amenu" command is a bit different. It assumes that the {keys} you
+give are to be executed in Normal mode. When Vim is in Visual or Insert mode
+when the menu is used, Vim first has to go back to Normal mode. ":amenu"
+inserts a CTRL-C or CTRL-O for you. For example, if you use this command:
+>
+ :amenu 90.100 Mine.Find\ Word *
+
+Then the resulting menu commands will be:
+
+ Normal mode: *
+ Visual mode: CTRL-C *
+ Operator-pending mode: CTRL-C *
+ Insert mode: CTRL-O *
+ Command-line mode: CTRL-C *
+
+When in Command-line mode the CTRL-C will abandon the command typed so far.
+In Visual and Operator-pending mode CTRL-C will stop the mode. The CTRL-O in
+Insert mode will execute the command and then return to Insert mode.
+ CTRL-O only works for one command. If you need to use two or more
+commands, put them in a function and call that function. Example: >
+
+ :amenu Mine.Next\ File :call <SID>NextFile()<CR>
+ :function <SID>NextFile()
+ : next
+ : 1/^Code
+ :endfunction
+
+This menu entry goes to the next file in the argument list with ":next". Then
+it searches for the line that starts with "Code".
+ The <SID> before the function name is the script ID. This makes the
+function local to the current Vim script file. This avoids problems when a
+function with the same name is defined in another script file. See |<SID>|.
+
+
+SILENT MENUS
+
+The menu executes the {keys} as if you typed them. For a ":" command this
+means you will see the command being echoed on the command line. If it's a
+long command, the hit-Enter prompt will appear. That can be very annoying!
+ To avoid this, make the menu silent. This is done with the <silent>
+argument. For example, take the call to NextFile() in the previous example.
+When you use this menu, you will see this on the command line:
+
+ :call <SNR>34_NextFile() ~
+
+To avoid this text on the command line, insert "<silent>" as the first
+argument: >
+
+ :amenu <silent> Mine.Next\ File :call <SID>NextFile()<CR>
+
+Don't use "<silent>" too often. It is not needed for short commands. If you
+make a menu for someone else, being able to see the executed command will give
+him a hint about what he could have typed, instead of using the mouse.
+
+
+LISTING MENUS
+
+When a menu command is used without a {keys} part, it lists the already
+defined menus. You can specify a {menu-item}, or part of it, to list specific
+menus. Example: >
+
+ :amenu
+
+This lists all menus. That's a long list! Better specify the name of a menu
+to get a shorter list: >
+
+ :amenu Edit
+
+This lists only the "Edit" menu items for all modes. To list only one
+specific menu item for Insert mode: >
+
+ :imenu Edit.Undo
+
+Take care that you type exactly the right name. Case matters here. But the
+'&' for accelerators can be omitted. The <Tab> and what comes after it can be
+left out as well.
+
+
+DELETING MENUS
+
+To delete a menu, the same command is used as for listing, but with "menu"
+changed to "unmenu". Thus ":menu" becomes, ":unmenu", ":nmenu" becomes
+":nunmenu", etc. To delete the "Tools.Make" item for Insert mode: >
+
+ :iunmenu Tools.Make
+
+You can delete a whole menu, with all its items, by using the menu name.
+Example: >
+
+ :aunmenu Syntax
+
+This deletes the Syntax menu and all the items in it.
+
+==============================================================================
+*42.3* Various
+
+You can change the appearance of the menus with flags in 'guioptions'. In the
+default value they are all included, except "M". You can remove a flag with a
+command like: >
+
+ :set guioptions-=m
+<
+ m When removed the menubar is not displayed.
+
+ M When added the default menus are not loaded.
+
+ g When removed the inactive menu items are not made grey
+ but are completely removed. (Does not work on all
+ systems.)
+
+ t When removed the tearoff feature is not enabled.
+
+The dotted line at the top of a menu is not a separator line. When you select
+this item, the menu is "teared-off": It is displayed in a separate window.
+This is called a tearoff menu. This is useful when you use the same menu
+often.
+
+For translating menu items, see |:menutrans|.
+
+Since the mouse has to be used to select a menu item, it is a good idea to use
+the ":browse" command for selecting a file. And ":confirm" to get a dialog
+instead of an error message, e.g., when the current buffer contains changes.
+These two can be combined: >
+
+ :amenu File.Open :browse confirm edit<CR>
+
+The ":browse" makes a file browser appear to select the file to edit. The
+":confirm" will pop up a dialog when the current buffer has changes. You can
+then select to save the changes, throw them away or cancel the command.
+ For more complicated items, the confirm() and inputdialog() functions can
+be used. The default menus contain a few examples.
+
+==============================================================================
+*42.4* Toolbar and popup menus
+
+There are two special menus: ToolBar and PopUp. Items that start with these
+names do not appear in the normal menu bar.
+
+
+TOOLBAR
+
+The toolbar appears only when the "T" flag is included in the 'guioptions'
+option.
+ The toolbar uses icons rather than text to represent the command. For
+example, the {menu-item} named "ToolBar.New" causes the "New" icon to appear
+on the toolbar.
+ The Vim editor has 28 built-in icons. You can find a table here:
+|builtin-tools|. Most of them are used in the default toolbar. You can
+redefine what these items do (after the default menus are setup).
+ You can add another bitmap for a toolbar item. Or define a new toolbar
+item with a bitmap. For example, define a new toolbar item with: >
+
+ :tmenu ToolBar.Compile Compile the current file
+ :amenu ToolBar.Compile :!cc %:S -o %:r:S<CR>
+
+Now you need to create the icon. For MS-Windows it must be in bitmap format,
+with the name "Compile.bmp". For Unix XPM format is used, the file name is
+"Compile.xpm". The size must be 18 by 18 pixels. On MS-Windows other sizes
+can be used as well, but it will look ugly.
+ Put the bitmap in the directory "bitmaps" in one of the directories from
+'runtimepath'. E.g., for Unix "~/.vim/bitmaps/Compile.xpm".
+
+You can define tooltips for the items in the toolbar. A tooltip is a short
+text that explains what a toolbar item will do. For example "Open file". It
+appears when the mouse pointer is on the item, without moving for a moment.
+This is very useful if the meaning of the picture isn't that obvious.
+Example: >
+
+ :tmenu ToolBar.Make Run make in the current directory
+<
+ Note:
+ Pay attention to the case used. "Toolbar" and "toolbar" are different
+ from "ToolBar"!
+
+To remove a tooltip, use the |:tunmenu| command.
+
+The 'toolbar' option can be used to display text instead of a bitmap, or both
+text and a bitmap. Most people use just the bitmap, since the text takes
+quite a bit of space.
+
+
+POPUP MENU
+
+The popup menu pops up where the mouse pointer is. On MS-Windows you activate
+it by clicking the right mouse button. Then you can select an item with the
+left mouse button. On Unix the popup menu is used by pressing and holding the
+right mouse button.
+ The popup menu only appears when the 'mousemodel' has been set to "popup"
+or "popup_setpos". The difference between the two is that "popup_setpos"
+moves the cursor to the mouse pointer position. When clicking inside a
+selection, the selection will be used unmodified. When there is a selection
+but you click outside of it, the selection is removed.
+ There is a separate popup menu for each mode. Thus there are never grey
+items like in the normal menus.
+
+What is the meaning of life, the universe and everything? *42*
+Douglas Adams, the only person who knew what this question really was about is
+now dead, unfortunately. So now you might wonder what the meaning of death
+is...
+
+==============================================================================
+
+Next chapter: |usr_43.txt| Using filetypes
+
+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
new file mode 100644
index 0000000..9095a8e
--- /dev/null
+++ b/runtime/doc/usr_43.txt
@@ -0,0 +1,179 @@
+*usr_43.txt* For Vim version 9.0. Last change: 2015 Oct 23
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Using filetypes
+
+
+When you are editing a file of a certain type, for example a C program or a
+shell script, you often use the same option settings and mappings. You
+quickly get tired of manually setting these each time. This chapter explains
+how to do it automatically.
+
+|43.1| Plugins for a filetype
+|43.2| Adding a filetype
+
+ Next chapter: |usr_44.txt| Your own syntax highlighted
+ Previous chapter: |usr_42.txt| Add new menus
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*43.1* Plugins for a filetype *filetype-plugin*
+
+How to start using filetype plugins has already been discussed here:
+|add-filetype-plugin|. But you probably are not satisfied with the default
+settings, because they have been kept minimal. Suppose that for C files you
+want to set the 'softtabstop' option to 4 and define a mapping to insert a
+three-line comment. You do this with only two steps:
+
+ *your-runtime-dir*
+1. Create your own runtime directory. On Unix this usually is "~/.vim". In
+ this directory create the "ftplugin" directory: >
+
+ mkdir ~/.vim
+ mkdir ~/.vim/ftplugin
+<
+ When you are not on Unix, check the value of the 'runtimepath' option to
+ see where Vim will look for the "ftplugin" directory: >
+
+ set runtimepath
+
+< You would normally use the first directory name (before the first comma).
+ You might want to prepend a directory name to the 'runtimepath' option in
+ your |vimrc| file if you don't like the default value.
+
+2. Create the file "~/.vim/ftplugin/c.vim", with the contents: >
+
+ setlocal softtabstop=4
+ noremap <buffer> <LocalLeader>c o/**************<CR><CR>/<Esc>
+ let b:undo_ftplugin = "setl softtabstop< | unmap <buffer> <LocalLeader>c"
+
+Try editing a C file. You should notice that the 'softtabstop' option is set
+to 4. But when you edit another file it's reset to the default zero. That is
+because the ":setlocal" command was used. This sets the 'softtabstop' option
+only locally to the buffer. As soon as you edit another buffer, it will be
+set to the value set for that buffer. For a new buffer it will get the
+default value or the value from the last ":set" command.
+
+Likewise, the mapping for "\c" will disappear when editing another buffer.
+The ":map <buffer>" command creates a mapping that is local to the current
+buffer. This works with any mapping command: ":map!", ":vmap", etc. The
+|<LocalLeader>| in the mapping is replaced with the value of the
+"maplocalleader" variable.
+
+The line to set b:undo_ftplugin is for when the filetype is set to another
+value. In that case you will want to undo your preferences. The
+b:undo_ftplugin variable is executed as a command. Watch out for characters
+with a special meaning inside a string, such as a backslash.
+
+You can find examples for filetype plugins in this directory: >
+
+ $VIMRUNTIME/ftplugin/
+
+More details about writing a filetype plugin can be found here:
+|write-plugin|.
+
+==============================================================================
+*43.2* Adding a filetype
+
+If you are using a type of file that is not recognized by Vim, this is how to
+get it recognized. You need a runtime directory of your own. See
+|your-runtime-dir| above.
+
+Create a file "filetype.vim" which contains an autocommand for your filetype.
+(Autocommands were explained in section |40.3|.) Example: >
+
+ augroup filetypedetect
+ au BufNewFile,BufRead *.xyz setf xyz
+ augroup END
+
+This will recognize all files that end in ".xyz" as the "xyz" filetype. The
+":augroup" commands put this autocommand in the "filetypedetect" group. This
+allows removing all autocommands for filetype detection when doing ":filetype
+off". The "setf" command will set the 'filetype' option to its argument,
+unless it was set already. This will make sure that 'filetype' isn't set
+twice.
+
+You can use many different patterns to match the name of your file. Directory
+names can also be included. See |autocmd-patterns|. For example, the files
+under "/usr/share/scripts/" are all "ruby" files, but don't have the expected
+file name extension. Adding this to the example above: >
+
+ augroup filetypedetect
+ au BufNewFile,BufRead *.xyz setf xyz
+ au BufNewFile,BufRead /usr/share/scripts/* setf ruby
+ augroup END
+
+However, if you now edit a file /usr/share/scripts/README.txt, this is not a
+ruby file. The danger of a pattern ending in "*" is that it quickly matches
+too many files. To avoid trouble with this, put the filetype.vim file in
+another directory, one that is at the end of 'runtimepath'. For Unix for
+example, you could use "~/.vim/after/filetype.vim".
+ You now put the detection of text files in ~/.vim/filetype.vim: >
+
+ augroup filetypedetect
+ au BufNewFile,BufRead *.txt setf text
+ augroup END
+
+That file is found in 'runtimepath' first. Then use this in
+~/.vim/after/filetype.vim, which is found last: >
+
+ augroup filetypedetect
+ au BufNewFile,BufRead /usr/share/scripts/* setf ruby
+ augroup END
+
+What will happen now is that Vim searches for "filetype.vim" files in each
+directory in 'runtimepath'. First ~/.vim/filetype.vim is found. The
+autocommand to catch *.txt files is defined there. Then Vim finds the
+filetype.vim file in $VIMRUNTIME, which is halfway 'runtimepath'. Finally
+~/.vim/after/filetype.vim is found and the autocommand for detecting ruby
+files in /usr/share/scripts is added.
+ When you now edit /usr/share/scripts/README.txt, the autocommands are
+checked in the order in which they were defined. The *.txt pattern matches,
+thus "setf text" is executed to set the filetype to "text". The pattern for
+ruby matches too, and the "setf ruby" is executed. But since 'filetype' was
+already set to "text", nothing happens here.
+ When you edit the file /usr/share/scripts/foobar the same autocommands are
+checked. Only the one for ruby matches and "setf ruby" sets 'filetype' to
+ruby.
+
+
+RECOGNIZING BY CONTENTS
+
+If your file cannot be recognized by its file name, you might be able to
+recognize it by its contents. For example, many script files start with a
+line like:
+
+ #!/bin/xyz ~
+
+To recognize this script create a file "scripts.vim" in your runtime directory
+(same place where filetype.vim goes). It might look like this: >
+
+ if did_filetype()
+ finish
+ endif
+ if getline(1) =~ '^#!.*[/\\]xyz\>'
+ setf xyz
+ endif
+
+The first check with did_filetype() is to avoid that you will check the
+contents of files for which the filetype was already detected by the file
+name. That avoids wasting time on checking the file when the "setf" command
+won't do anything.
+ The scripts.vim file is sourced by an autocommand in the default
+filetype.vim file. Therefore, the order of checks is:
+
+ 1. filetype.vim files before $VIMRUNTIME in 'runtimepath'
+ 2. first part of $VIMRUNTIME/filetype.vim
+ 3. all scripts.vim files in 'runtimepath'
+ 4. remainder of $VIMRUNTIME/filetype.vim
+ 5. filetype.vim files after $VIMRUNTIME in 'runtimepath'
+
+If this is not sufficient for you, add an autocommand that matches all files
+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:noet:ft=help:norl:
diff --git a/runtime/doc/usr_44.txt b/runtime/doc/usr_44.txt
new file mode 100644
index 0000000..11a0286
--- /dev/null
+++ b/runtime/doc/usr_44.txt
@@ -0,0 +1,708 @@
+*usr_44.txt* For Vim version 9.0. Last change: 2017 May 06
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Your own syntax highlighted
+
+
+Vim comes with highlighting for a couple of hundred different file types. If
+the file you are editing isn't included, read this chapter to find out how to
+get this type of file highlighted. Also see |:syn-define| in the reference
+manual.
+
+|44.1| Basic syntax commands
+|44.2| Keywords
+|44.3| Matches
+|44.4| Regions
+|44.5| Nested items
+|44.6| Following groups
+|44.7| Other arguments
+|44.8| Clusters
+|44.9| Including another syntax file
+|44.10| Synchronizing
+|44.11| Installing a syntax file
+|44.12| Portable syntax file layout
+
+ Next chapter: |usr_45.txt| Select your language
+ Previous chapter: |usr_43.txt| Using filetypes
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*44.1* Basic syntax commands
+
+Using an existing syntax file to start with will save you a lot of time. Try
+finding a syntax file in $VIMRUNTIME/syntax for a language that is similar.
+These files will also show you the normal layout of a syntax file. To
+understand it, you need to read the following.
+
+Let's start with the basic arguments. Before we start defining any new
+syntax, we need to clear out any old definitions: >
+
+ :syntax clear
+
+This isn't required in the final syntax file, but very useful when
+experimenting.
+
+There are more simplifications in this chapter. If you are writing a syntax
+file to be used by others, read all the way through the end to find out the
+details.
+
+
+LISTING DEFINED ITEMS
+
+To check which syntax items are currently defined, use this command: >
+
+ :syntax
+
+You can use this to check which items have actually been defined. Quite
+useful when you are experimenting with a new syntax file. It also shows the
+colors used for each item, which helps to find out what is what.
+ To list the items in a specific syntax group use: >
+
+ :syntax list {group-name}
+
+This also can be used to list clusters (explained in |44.8|). Just include
+the @ in the name.
+
+
+MATCHING CASE
+
+Some languages are not case sensitive, such as Pascal. Others, such as C, are
+case sensitive. You need to tell which type you have with the following
+commands: >
+ :syntax case match
+ :syntax case ignore
+
+The "match" argument means that Vim will match the case of syntax elements.
+Therefore, "int" differs from "Int" and "INT". If the "ignore" argument is
+used, the following are equivalent: "Procedure", "PROCEDURE" and "procedure".
+ The ":syntax case" commands can appear anywhere in a syntax file and affect
+the syntax definitions that follow. In most cases, you have only one ":syntax
+case" command in your syntax file; if you work with an unusual language that
+contains both case-sensitive and non-case-sensitive elements, however, you can
+scatter the ":syntax case" command throughout the file.
+
+==============================================================================
+*44.2* Keywords
+
+The most basic syntax elements are keywords. To define a keyword, use the
+following form: >
+
+ :syntax keyword {group} {keyword} ...
+
+The {group} is the name of a syntax group. With the ":highlight" command you
+can assign colors to a {group}. The {keyword} argument is an actual keyword.
+Here are a few examples: >
+
+ :syntax keyword xType int long char
+ :syntax keyword xStatement if then else endif
+
+This example uses the group names "xType" and "xStatement". By convention,
+each group name is prefixed by the filetype for the language being defined.
+This example defines syntax for the x language (eXample language without an
+interesting name). In a syntax file for "csh" scripts the name "cshType"
+would be used. Thus the prefix is equal to the value of 'filetype'.
+ These commands cause the words "int", "long" and "char" to be highlighted
+one way and the words "if", "then", "else" and "endif" to be highlighted
+another way. Now you need to connect the x group names to standard Vim
+names. You do this with the following commands: >
+
+ :highlight link xType Type
+ :highlight link xStatement Statement
+
+This tells Vim to highlight "xType" like "Type" and "xStatement" like
+"Statement". See |group-name| for the standard names.
+
+
+UNUSUAL KEYWORDS
+
+The characters used in a keyword must be in the 'iskeyword' option. If you
+use another character, the word will never match. Vim doesn't give a warning
+message for this.
+ The x language uses the '-' character in keywords. This is how it's done:
+>
+ :setlocal iskeyword+=-
+ :syntax keyword xStatement when-not
+
+The ":setlocal" command is used to change 'iskeyword' only for the current
+buffer. Still it does change the behavior of commands like "w" and "*". If
+that is not wanted, don't define a keyword but use a match (explained in the
+next section).
+
+The x language allows for abbreviations. For example, "next" can be
+abbreviated to "n", "ne" or "nex". You can define them by using this command:
+>
+ :syntax keyword xStatement n[ext]
+
+This doesn't match "nextone", keywords always match whole words only.
+
+==============================================================================
+*44.3* Matches
+
+Consider defining something a bit more complex. You want to match ordinary
+identifiers. To do this, you define a match syntax item. This one matches
+any word consisting of only lowercase letters: >
+
+ :syntax match xIdentifier /\<\l\+\>/
+<
+ Note:
+ Keywords overrule any other syntax item. Thus the keywords "if",
+ "then", etc., will be keywords, as defined with the ":syntax keyword"
+ commands above, even though they also match the pattern for
+ xIdentifier.
+
+The part at the end is a pattern, like it's used for searching. The // is
+used to surround the pattern (like how it's done in a ":substitute" command).
+You can use any other character, like a plus or a quote.
+
+Now define a match for a comment. In the x language it is anything from # to
+the end of a line: >
+
+ :syntax match xComment /#.*/
+
+Since you can use any search pattern, you can highlight very complex things
+with a match item. See |pattern| for help on search patterns.
+
+==============================================================================
+*44.4* Regions
+
+In the example x language, strings are enclosed in double quotation marks (").
+To highlight strings you define a region. You need a region start (double
+quote) and a region end (double quote). The definition is as follows: >
+
+ :syntax region xString start=/"/ end=/"/
+
+The "start" and "end" directives define the patterns used to find the start
+and end of the region. But what about strings that look like this?
+
+ "A string with a double quote (\") in it" ~
+
+This creates a problem: The double quotation marks in the middle of the string
+will end the region. You need to tell Vim to skip over any escaped double
+quotes in the string. Do this with the skip keyword: >
+
+ :syntax region xString start=/"/ skip=/\\"/ end=/"/
+
+The double backslash matches a single backslash, since the backslash is a
+special character in search patterns.
+
+When to use a region instead of a match? The main difference is that a match
+item is a single pattern, which must match as a whole. A region starts as
+soon as the "start" pattern matches. Whether the "end" pattern is found or
+not doesn't matter. Thus when the item depends on the "end" pattern to match,
+you cannot use a region. Otherwise, regions are often simpler to define. And
+it is easier to use nested items, as is explained in the next section.
+
+==============================================================================
+*44.5* Nested items
+
+Take a look at this comment:
+
+ %Get input TODO: Skip white space ~
+
+You want to highlight TODO in big yellow letters, even though it is in a
+comment that is highlighted blue. To let Vim know about this, you define the
+following syntax groups: >
+
+ :syntax keyword xTodo TODO contained
+ :syntax match xComment /%.*/ contains=xTodo
+
+In the first line, the "contained" argument tells Vim that this keyword can
+exist only inside another syntax item. The next line has "contains=xTodo".
+This indicates that the xTodo syntax element is inside it. The result is that
+the comment line as a whole is matched with "xComment" and made blue. The
+word TODO inside it is matched by xTodo and highlighted yellow (highlighting
+for xTodo was setup for this).
+
+
+RECURSIVE NESTING
+
+The x language defines code blocks in curly braces. And a code block may
+contain other code blocks. This can be defined this way: >
+
+ :syntax region xBlock start=/{/ end=/}/ contains=xBlock
+
+Suppose you have this text:
+
+ while i < b { ~
+ if a { ~
+ b = c; ~
+ } ~
+ } ~
+
+First a xBlock starts at the { in the first line. In the second line another
+{ is found. Since we are inside a xBlock item, and it contains itself, a
+nested xBlock item will start here. Thus the "b = c" line is inside the
+second level xBlock region. Then a } is found in the next line, which matches
+with the end pattern of the region. This ends the nested xBlock. Because the
+} is included in the nested region, it is hidden from the first xBlock region.
+Then at the last } the first xBlock region ends.
+
+
+KEEPING THE END
+
+Consider the following two syntax items: >
+
+ :syntax region xComment start=/%/ end=/$/ contained
+ :syntax region xPreProc start=/#/ end=/$/ contains=xComment
+
+You define a comment as anything from % to the end of the line. A
+preprocessor directive is anything from # to the end of the line. Because you
+can have a comment on a preprocessor line, the preprocessor definition
+includes a "contains=xComment" argument. Now look what happens with this
+text:
+
+ #define X = Y % Comment text ~
+ int foo = 1; ~
+
+What you see is that the second line is also highlighted as xPreProc. The
+preprocessor directive should end at the end of the line. That is why
+you have used "end=/$/". So what is going wrong?
+ The problem is the contained comment. The comment starts with % and ends
+at the end of the line. After the comment ends, the preprocessor syntax
+continues. This is after the end of the line has been seen, so the next
+line is included as well.
+ To avoid this problem and to avoid a contained syntax item eating a needed
+end of line, use the "keepend" argument. This takes care of
+the double end-of-line matching: >
+
+ :syntax region xComment start=/%/ end=/$/ contained
+ :syntax region xPreProc start=/#/ end=/$/ contains=xComment keepend
+
+
+CONTAINING MANY ITEMS
+
+You can use the contains argument to specify that everything can be contained.
+For example: >
+
+ :syntax region xList start=/\[/ end=/\]/ contains=ALL
+
+All syntax items will be contained in this one. It also contains itself, but
+not at the same position (that would cause an endless loop).
+ You can specify that some groups are not contained. Thus contain all
+groups but the ones that are listed:
+>
+ :syntax region xList start=/\[/ end=/\]/ contains=ALLBUT,xString
+
+With the "TOP" item you can include all items that don't have a "contained"
+argument. "CONTAINED" is used to only include items with a "contained"
+argument. See |:syn-contains| for the details.
+
+==============================================================================
+*44.6* Following groups
+
+The x language has statements in this form:
+
+ if (condition) then ~
+
+You want to highlight the three items differently. But "(condition)" and
+"then" might also appear in other places, where they get different
+highlighting. This is how you can do this: >
+
+ :syntax match xIf /if/ nextgroup=xIfCondition skipwhite
+ :syntax match xIfCondition /([^)]*)/ contained nextgroup=xThen skipwhite
+ :syntax match xThen /then/ contained
+
+The "nextgroup" argument specifies which item can come next. This is not
+required. If none of the items that are specified are found, nothing happens.
+For example, in this text:
+
+ if not (condition) then ~
+
+The "if" is matched by xIf. "not" doesn't match the specified nextgroup
+xIfCondition, thus only the "if" is highlighted.
+
+The "skipwhite" argument tells Vim that white space (spaces and tabs) may
+appear in between the items. Similar arguments are "skipnl", which allows a
+line break in between the items, and "skipempty", which allows empty lines.
+Notice that "skipnl" doesn't skip an empty line, something must match after
+the line break.
+
+==============================================================================
+*44.7* Other arguments
+
+MATCHGROUP
+
+When you define a region, the entire region is highlighted according to the
+group name specified. To highlight the text enclosed in parentheses () with
+the group xInside, for example, use the following command: >
+
+ :syntax region xInside start=/(/ end=/)/
+
+Suppose, that you want to highlight the parentheses differently. You can do
+this with a lot of convoluted region statements, or you can use the
+"matchgroup" argument. This tells Vim to highlight the start and end of a
+region with a different highlight group (in this case, the xParen group): >
+
+ :syntax region xInside matchgroup=xParen start=/(/ end=/)/
+
+The "matchgroup" argument applies to the start or end match that comes after
+it. In the previous example both start and end are highlighted with xParen.
+To highlight the end with xParenEnd: >
+
+ :syntax region xInside matchgroup=xParen start=/(/
+ \ matchgroup=xParenEnd end=/)/
+
+A side effect of using "matchgroup" is that contained items will not match in
+the start or end of the region. The example for "transparent" uses this.
+
+
+TRANSPARENT
+
+In a C language file you would like to highlight the () text after a "while"
+differently from the () text after a "for". In both of these there can be
+nested () items, which should be highlighted in the same way. You must make
+sure the () highlighting stops at the matching ). This is one way to do this:
+>
+ :syntax region cWhile matchgroup=cWhile start=/while\s*(/ end=/)/
+ \ contains=cCondNest
+ :syntax region cFor matchgroup=cFor start=/for\s*(/ end=/)/
+ \ contains=cCondNest
+ :syntax region cCondNest start=/(/ end=/)/ contained transparent
+
+Now you can give cWhile and cFor different highlighting. The cCondNest item
+can appear in either of them, but take over the highlighting of the item it is
+contained in. The "transparent" argument causes this.
+ Notice that the "matchgroup" argument has the same group as the item
+itself. Why define it then? Well, the side effect of using a matchgroup is
+that contained items are not found in the match with the start item then.
+This avoids that the cCondNest group matches the ( just after the "while" or
+"for". If this would happen, it would span the whole text until the matching
+) and the region would continue after it. Now cCondNest only matches after
+the match with the start pattern, thus after the first (.
+
+
+OFFSETS
+
+Suppose you want to define a region for the text between ( and ) after an
+"if". But you don't want to include the "if" or the ( and ). You can do this
+by specifying offsets for the patterns. Example: >
+
+ :syntax region xCond start=/if\s*(/ms=e+1 end=/)/me=s-1
+
+The offset for the start pattern is "ms=e+1". "ms" stands for Match Start.
+This defines an offset for the start of the match. Normally the match starts
+where the pattern matches. "e+1" means that the match now starts at the end
+of the pattern match, and then one character further.
+ The offset for the end pattern is "me=s-1". "me" stands for Match End.
+"s-1" means the start of the pattern match and then one character back. The
+result is that in this text:
+
+ if (foo == bar) ~
+
+Only the text "foo == bar" will be highlighted as xCond.
+
+More about offsets here: |:syn-pattern-offset|.
+
+
+ONELINE
+
+The "oneline" argument indicates that the region does not cross a line
+boundary. For example: >
+
+ :syntax region xIfThen start=/if/ end=/then/ oneline
+
+This defines a region that starts at "if" and ends at "then". But if there is
+no "then" after the "if", the region doesn't match.
+
+ Note:
+ When using "oneline" the region doesn't start if the end pattern
+ doesn't match in the same line. Without "oneline" Vim does _not_
+ check if there is a match for the end pattern. The region starts even
+ when the end pattern doesn't match in the rest of the file.
+
+
+CONTINUATION LINES AND AVOIDING THEM
+
+Things now become a little more complex. Let's define a preprocessor line.
+This starts with a # in the first column and continues until the end of the
+line. A line that ends with \ makes the next line a continuation line. The
+way you handle this is to allow the syntax item to contain a continuation
+pattern: >
+
+ :syntax region xPreProc start=/^#/ end=/$/ contains=xLineContinue
+ :syntax match xLineContinue "\\$" contained
+
+In this case, although xPreProc normally matches a single line, the group
+contained in it (namely xLineContinue) lets it go on for more than one line.
+For example, it would match both of these lines:
+
+ #define SPAM spam spam spam \ ~
+ bacon and spam ~
+
+In this case, this is what you want. If it is not what you want, you can call
+for the region to be on a single line by adding "excludenl" to the contained
+pattern. For example, you want to highlight "end" in xPreProc, but only at
+the end of the line. To avoid making the xPreProc continue on the next line,
+like xLineContinue does, use "excludenl" like this: >
+
+ :syntax region xPreProc start=/^#/ end=/$/
+ \ contains=xLineContinue,xPreProcEnd
+ :syntax match xPreProcEnd excludenl /end$/ contained
+ :syntax match xLineContinue "\\$" contained
+
+"excludenl" must be placed before the pattern. Since "xLineContinue" doesn't
+have "excludenl", a match with it will extend xPreProc to the next line as
+before.
+
+==============================================================================
+*44.8* Clusters
+
+One of the things you will notice as you start to write a syntax file is that
+you wind up generating a lot of syntax groups. Vim enables you to define a
+collection of syntax groups called a cluster.
+ Suppose you have a language that contains for loops, if statements, while
+loops, and functions. Each of them contains the same syntax elements: numbers
+and identifiers. You define them like this: >
+
+ :syntax match xFor /^for.*/ contains=xNumber,xIdent
+ :syntax match xIf /^if.*/ contains=xNumber,xIdent
+ :syntax match xWhile /^while.*/ contains=xNumber,xIdent
+
+You have to repeat the same "contains=" every time. If you want to add
+another contained item, you have to add it three times. Syntax clusters
+simplify these definitions by enabling you to have one cluster stand for
+several syntax groups.
+ To define a cluster for the two items that the three groups contain, use
+the following command: >
+
+ :syntax cluster xState contains=xNumber,xIdent
+
+Clusters are used inside other syntax items just like any syntax group.
+Their names start with @. Thus, you can define the three groups like this: >
+
+ :syntax match xFor /^for.*/ contains=@xState
+ :syntax match xIf /^if.*/ contains=@xState
+ :syntax match xWhile /^while.*/ contains=@xState
+
+You can add new group names to this cluster with the "add" argument: >
+
+ :syntax cluster xState add=xString
+
+You can remove syntax groups from this list as well: >
+
+ :syntax cluster xState remove=xNumber
+
+==============================================================================
+*44.9* Including another syntax file
+
+The C++ language syntax is a superset of the C language. Because you do not
+want to write two syntax files, you can have the C++ syntax file read in the
+one for C by using the following command: >
+
+ :runtime! syntax/c.vim
+
+The ":runtime!" command searches 'runtimepath' for all "syntax/c.vim" files.
+This makes the C parts of the C++ syntax be defined like for C files. If you
+have replaced the c.vim syntax file, or added items with an extra file, these
+will be loaded as well.
+ After loading the C syntax items the specific C++ items can be defined.
+For example, add keywords that are not used in C: >
+
+ :syntax keyword cppStatement new delete this friend using
+
+This works just like in any other syntax file.
+
+Now consider the Perl language. A Perl script consists of two distinct parts:
+a documentation section in POD format, and a program written in Perl itself.
+The POD section starts with "=head" and ends with "=cut".
+ You want to define the POD syntax in one file, and use it from the Perl
+syntax file. The ":syntax include" command reads in a syntax file and stores
+the elements it defined in a syntax cluster. For Perl, the statements are as
+follows: >
+
+ :syntax include @Pod <sfile>:p:h/pod.vim
+ :syntax region perlPOD start=/^=head/ end=/^=cut/ contains=@Pod
+
+When "=head" is found in a Perl file, the perlPOD region starts. In this
+region the @Pod cluster is contained. All the items defined as top-level
+items in the pod.vim syntax files will match here. When "=cut" is found, the
+region ends and we go back to the items defined in the Perl file.
+ The ":syntax include" command is clever enough to ignore a ":syntax clear"
+command in the included file. And an argument such as "contains=ALL" will
+only contain items defined in the included file, not in the file that includes
+it.
+ The "<sfile>:p:h/" part uses the name of the current file (<sfile>),
+expands it to a full path (:p) and then takes the head (:h). This results in
+the directory name of the file. This causes the pod.vim file in the same
+directory to be included.
+
+==============================================================================
+*44.10* Synchronizing
+
+Compilers have it easy. They start at the beginning of a file and parse it
+straight through. Vim does not have it so easy. It must start in the middle,
+where the editing is being done. So how does it tell where it is?
+ The secret is the ":syntax sync" command. This tells Vim how to figure out
+where it is. For example, the following command tells Vim to scan backward
+for the beginning or end of a C-style comment and begin syntax coloring from
+there: >
+
+ :syntax sync ccomment
+
+You can tune this processing with some arguments. The "minlines" argument
+tells Vim the minimum number of lines to look backward, and "maxlines" tells
+the editor the maximum number of lines to scan.
+ For example, the following command tells Vim to look at least 10 lines
+before the top of the screen: >
+
+ :syntax sync ccomment minlines=10 maxlines=500
+
+If it cannot figure out where it is in that space, it starts looking farther
+and farther back until it figures out what to do. But it looks no farther
+back than 500 lines. (A large "maxlines" slows down processing. A small one
+might cause synchronization to fail.)
+ To make synchronizing go a bit faster, tell Vim which syntax items can be
+skipped. Every match and region that only needs to be used when actually
+displaying text can be given the "display" argument.
+ By default, the comment to be found will be colored as part of the Comment
+syntax group. If you want to color things another way, you can specify a
+different syntax group: >
+
+ :syntax sync ccomment xAltComment
+
+If your programming language does not have C-style comments in it, you can try
+another method of synchronization. The simplest way is to tell Vim to space
+back a number of lines and try to figure out things from there. The following
+command tells Vim to go back 150 lines and start parsing from there: >
+
+ :syntax sync minlines=150
+
+A large "minlines" value can make Vim slower, especially when scrolling
+backwards in the file.
+ Finally, you can specify a syntax group to look for by using this command:
+>
+ :syntax sync match {sync-group-name}
+ \ grouphere {group-name} {pattern}
+
+This tells Vim that when it sees {pattern} the syntax group named {group-name}
+begins just after the pattern given. The {sync-group-name} is used to give a
+name to this synchronization specification. For example, the sh scripting
+language begins an if statement with "if" and ends it with "fi":
+
+ if [ --f file.txt ] ; then ~
+ echo "File exists" ~
+ fi ~
+
+To define a "grouphere" directive for this syntax, you use the following
+command: >
+
+ :syntax sync match shIfSync grouphere shIf "\<if\>"
+
+The "groupthere" argument tells Vim that the pattern ends a group. For
+example, the end of the if/fi group is as follows: >
+
+ :syntax sync match shIfSync groupthere NONE "\<fi\>"
+
+In this example, the NONE tells Vim that you are not in any special syntax
+region. In particular, you are not inside an if block.
+
+You also can define matches and regions that are with no "grouphere" or
+"groupthere" arguments. These groups are for syntax groups skipped during
+synchronization. For example, the following skips over anything inside {},
+even if it would normally match another synchronization method: >
+
+ :syntax sync match xSpecial /{.*}/
+
+More about synchronizing in the reference manual: |:syn-sync|.
+
+==============================================================================
+*44.11* Installing a syntax file
+
+When your new syntax file is ready to be used, drop it in a "syntax" directory
+in 'runtimepath'. For Unix that would be "~/.vim/syntax".
+ The name of the syntax file must be equal to the file type, with ".vim"
+added. Thus for the x language, the full path of the file would be:
+
+ ~/.vim/syntax/x.vim ~
+
+You must also make the file type be recognized. See |43.2|.
+
+If your file works well, you might want to make it available to other Vim
+users. First read the next section to make sure your file works well for
+others. Then e-mail it to the Vim maintainer: <maintainer@vim.org>. Also
+explain how the filetype can be detected. With a bit of luck your file will
+be included in the next Vim version!
+
+
+ADDING TO AN EXISTING SYNTAX FILE
+
+We were assuming you were adding a completely new syntax file. When an existing
+syntax file works, but is missing some items, you can add items in a separate
+file. That avoids changing the distributed syntax file, which will be lost
+when installing a new version of Vim.
+ Write syntax commands in your file, possibly using group names from the
+existing syntax. For example, to add new variable types to the C syntax file:
+>
+ :syntax keyword cType off_t uint
+
+Write the file with the same name as the original syntax file. In this case
+"c.vim". Place it in a directory near the end of 'runtimepath'. This makes
+it loaded after the original syntax file. For Unix this would be:
+
+ ~/.vim/after/syntax/c.vim ~
+
+==============================================================================
+*44.12* Portable syntax file layout
+
+Wouldn't it be nice if all Vim users exchange syntax files? To make this
+possible, the syntax file must follow a few guidelines.
+
+Start with a header that explains what the syntax file is for, who maintains
+it and when it was last updated. Don't include too much information about
+changes history, not many people will read it. Example: >
+
+ " Vim syntax file
+ " Language: C
+ " Maintainer: Bram Moolenaar <Bram@vim.org>
+ " Last Change: 2001 Jun 18
+ " Remark: Included by the C++ syntax.
+
+Use the same layout as the other syntax files. Using an existing syntax file
+as an example will save you a lot of time.
+
+Choose a good, descriptive name for your syntax file. Use lowercase letters
+and digits. Don't make it too long, it is used in many places: The name of
+the syntax file "name.vim", 'filetype', b:current_syntax and the start of each
+syntax group (nameType, nameStatement, nameString, etc).
+
+Start with a check for "b:current_syntax". If it is defined, some other
+syntax file, earlier in 'runtimepath' was already loaded: >
+
+ if exists("b:current_syntax")
+ finish
+ endif
+
+Set "b:current_syntax" to the name of the syntax at the end. Don't forget
+that included files do this too, you might have to reset "b:current_syntax" if
+you include two files.
+
+Do not include anything that is a user preference. Don't set 'tabstop',
+'expandtab', etc. These belong in a filetype plugin.
+
+Do not include mappings or abbreviations. Only include setting 'iskeyword' if
+it is really necessary for recognizing keywords.
+
+To allow users select their own preferred colors, make a different group name
+for every kind of highlighted item. Then link each of them to one of the
+standard highlight groups. That will make it work with every color scheme.
+If you select specific colors it will look bad with some color schemes. And
+don't forget that some people use a different background color, or have only
+eight colors available.
+
+For the linking use "hi def link", so that the user can select different
+highlighting before your syntax file is loaded. Example: >
+
+ hi def link nameString String
+ hi def link nameNumber Number
+ hi def link nameCommand Statement
+ ... etc ...
+
+Add the "display" argument to items that are not used when syncing, to speed
+up scrolling backwards and CTRL-L.
+
+==============================================================================
+
+Next chapter: |usr_45.txt| Select your language
+
+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
new file mode 100644
index 0000000..7e919a9
--- /dev/null
+++ b/runtime/doc/usr_45.txt
@@ -0,0 +1,413 @@
+*usr_45.txt* For Vim version 9.0. Last change: 2022 May 13
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Select your language (locale)
+
+
+The messages in Vim can be given in several languages. This chapter explains
+how to change which one is used. Also, the different ways to work with files
+in various languages is explained.
+
+|45.1| Language for Messages
+|45.2| Language for Menus
+|45.3| Using another encoding
+|45.4| Editing files with a different encoding
+|45.5| Entering language text
+
+ Next chapter: |usr_50.txt| Advanced Vim script writing
+ Previous chapter: |usr_44.txt| Your own syntax highlighted
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*45.1* Language for Messages
+
+When you start Vim, it checks the environment to find out what language you
+are using. Mostly this should work fine, and you get the messages in your
+language (if they are available). To see what the current language is, use
+this command: >
+
+ :language
+
+If it replies with "C", this means the default is being used, which is
+English.
+
+ Note:
+ Using different languages only works when Vim was compiled to handle
+ it. To find out if it works, use the ":version" command and check the
+ output for "+gettext" and "+multi_lang". If they are there, you are
+ OK. If you see "-gettext" or "-multi_lang" you will have to find
+ another Vim.
+
+What if you would like your messages in a different language? There are
+several ways. Which one you should use depends on the capabilities of your
+system.
+ The first way is to set the environment to the desired language before
+starting Vim. Example for Unix: >
+
+ env LANG=de_DE.ISO_8859-1 vim
+
+This only works if the language is available on your system. The advantage is
+that all the GUI messages and things in libraries will use the right language
+as well. A disadvantage is that you must do this before starting Vim. If you
+want to change language while Vim is running, you can use the second method: >
+
+ :language fr_FR.ISO_8859-1
+
+This way you can try out several names for your language. You will get an
+error message when it's not supported on your system. You don't get an error
+when translated messages are not available. Vim will silently fall back to
+using English.
+ To find out which languages are supported on your system, find the
+directory where they are listed. On my system it is "/usr/share/locale". On
+some systems it's in "/usr/lib/locale". The manual page for "setlocale"
+should give you a hint where it is found on your system.
+ Be careful to type the name exactly as it should be. Upper and lowercase
+matter, and the '-' and '_' characters are easily confused.
+
+You can also set the language separately for messages, edited text and the
+time format. See |:language|.
+
+
+DO-IT-YOURSELF MESSAGE TRANSLATION
+
+If translated messages are not available for your language, you could write
+them yourself. To do this, get the source code for Vim and the GNU gettext
+package. After unpacking the sources, instructions can be found in the
+directory src/po/README.txt.
+ It's not too difficult to do the translation. You don't need to be a
+programmer. You must know both English and the language you are translating
+to, of course.
+ When you are satisfied with the translation, consider making it available
+to others. Upload it at vim-online (http://vim.sf.net) or e-mail it to
+the Vim maintainer <maintainer@vim.org>. Or both.
+
+==============================================================================
+*45.2* Language for Menus
+
+The default menus are in English. To be able to use your local language, they
+must be translated. Normally this is automatically done for you if the
+environment is set for your language, just like with messages. You don't need
+to do anything extra for this. But it only works if translations for the
+language are available.
+ Suppose you are in Germany, with the language set to German, but prefer to
+use "File" instead of "Datei". You can switch back to using the English menus
+this way: >
+
+ :set langmenu=none
+
+It is also possible to specify a language: >
+
+ :set langmenu=nl_NL.ISO_8859-1
+
+Like above, differences between "-" and "_" matter. However, upper/lowercase
+differences are ignored here.
+ The 'langmenu' option must be set before the menus are loaded. Once the
+menus have been defined changing 'langmenu' has no direct effect. Therefore,
+put the command to set 'langmenu' in your vimrc file.
+ If you really want to switch menu language while running Vim, you can do it
+this way: >
+
+ :source $VIMRUNTIME/delmenu.vim
+ :set langmenu=de_DE.ISO_8859-1
+ :source $VIMRUNTIME/menu.vim
+
+There is one drawback: All menus that you defined yourself will be gone. You
+will need to redefine them as well.
+
+
+DO-IT-YOURSELF MENU TRANSLATION
+
+To see which menu translations are available, look in this directory:
+
+ $VIMRUNTIME/lang ~
+
+The files are called menu_{language}.vim. If you don't see the language you
+want to use, you can do your own translations. The simplest way to do this is
+by copying one of the existing language files, and change it.
+ First find out the name of your language with the ":language" command. Use
+this name, but with all letters made lowercase. Then copy the file to your
+own runtime directory, as found early in 'runtimepath'. For example, for Unix
+you would do: >
+
+ :!cp $VIMRUNTIME/lang/menu_ko_kr.euckr.vim ~/.vim/lang/menu_nl_be.iso_8859-1.vim
+
+You will find hints for the translation in "$VIMRUNTIME/lang/README.txt".
+
+==============================================================================
+*45.3* Using another encoding
+
+Vim guesses that the files you are going to edit are encoded for your
+language. For many European languages this is "latin1". Then each byte is
+one character. That means there are 256 different characters possible. For
+Asian languages this is not sufficient. These mostly use a double-byte
+encoding, providing for over ten thousand possible characters. This still
+isn't enough when a text is to contain several different languages. This is
+where Unicode comes in. It was designed to include all characters used in
+commonly used languages. This is the "Super encoding that replaces all
+others". But it isn't used that much yet.
+ Fortunately, Vim supports these three kinds of encodings. And, with some
+restrictions, you can use them even when your environment uses another
+language than the text.
+ Nevertheless, when you only edit files that are in the encoding of your
+language, the default should work fine and you don't need to do anything. The
+following is only relevant when you want to edit different languages.
+
+
+USING UNICODE IN THE GUI
+
+The nice thing about Unicode is that other encodings can be converted to it
+and back without losing information. When you make Vim use Unicode
+internally, you will be able to edit files in any encoding.
+ Unfortunately, the number of systems supporting Unicode is still limited.
+Thus it's unlikely that your language uses it. You need to tell Vim you want
+to use Unicode, and how to handle interfacing with the rest of the system.
+ Let's start with the GUI version of Vim, which is able to display Unicode
+characters. This should work: >
+
+ :set encoding=utf-8
+ :set guifont=-misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1
+
+The 'encoding' option tells Vim the encoding of the characters that you use.
+This applies to the text in buffers (files you are editing), registers, Vim
+script files, etc. You can regard 'encoding' as the setting for the internals
+of Vim.
+ This example assumes you have this font on your system. The name in the
+example is for the X Window System. This font is in a package that is used to
+enhance xterm with Unicode support. If you don't have this font, you might
+find it here:
+
+ http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz ~
+
+For MS-Windows, some fonts have a limited number of Unicode characters. Try
+using the "Courier New" font. You can use the Edit/Select Font... menu to
+select and try out the fonts available. Only fixed-width fonts can be used
+though. Example: >
+
+ :set guifont=courier_new:h12
+
+If it doesn't work well, try getting a fontpack. If Microsoft didn't move it,
+you can find it here:
+
+ http://www.microsoft.com/typography/fonts/default.aspx ~
+
+Now you have told Vim to use Unicode internally and display text with a
+Unicode font. Typed characters still arrive in the encoding of your original
+language. This requires converting them to Unicode. Tell Vim the language
+from which to convert with the 'termencoding' option. You can do it like
+this: >
+
+ :let &termencoding = &encoding
+ :set encoding=utf-8
+
+This assigns the old value of 'encoding' to 'termencoding' before setting
+'encoding' to utf-8. You will have to try out if this really works for your
+setup. It should work especially well when using an input method for an Asian
+language, and you want to edit Unicode text.
+
+
+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.
+ Start the xterm with the "-u8" argument. You might also need so specify a
+font. Example: >
+
+ xterm -u8 -fn -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1
+
+Now you can run Vim inside this terminal. Set 'encoding' to "utf-8" as
+before. That's all.
+
+
+USING UNICODE IN AN ORDINARY TERMINAL
+
+Suppose you want to work with Unicode files, but don't have a terminal with
+Unicode support. You can do this with Vim, although characters that are not
+supported by the terminal will not be displayed. The layout of the text
+will be preserved. >
+
+ :let &termencoding = &encoding
+ :set encoding=utf-8
+
+This is the same as what was used for the GUI. But it works differently: Vim
+will convert the displayed text before sending it to the terminal. That
+avoids that the display is messed up with strange characters.
+ For this to work the conversion between 'termencoding' and 'encoding' must
+be possible. Vim will convert from latin1 to Unicode, thus that always works.
+For other conversions the |+iconv| feature is required.
+ Try editing a file with Unicode characters in it. You will notice that Vim
+will put a question mark (or underscore or some other character) in places
+where a character should be that the terminal can't display. Move the cursor
+to a question mark and use this command: >
+
+ ga
+
+Vim will display a line with the code of the character. This gives you a hint
+about what character it is. You can look it up in a Unicode table. You could
+actually view a file that way, if you have lots of time at hand.
+
+ Note:
+ Since 'encoding' is used for all text inside Vim, changing it makes
+ all non-ASCII text invalid. You will notice this when using registers
+ and the 'viminfo' file (e.g., a remembered search pattern). It's
+ recommended to set 'encoding' in your vimrc file, and leave it alone.
+
+==============================================================================
+*45.4* Editing files with a different encoding
+
+Suppose you have setup Vim to use Unicode, and you want to edit a file that is
+in 16-bit Unicode. Sounds simple, right? Well, Vim actually uses utf-8
+encoding internally, thus the 16-bit encoding must be converted, since there
+is a difference between the character set (Unicode) and the encoding (utf-8 or
+16-bit).
+ Vim will try to detect what kind of file you are editing. It uses the
+encoding names in the 'fileencodings' option. When using Unicode, the default
+value is: "ucs-bom,utf-8,latin1". This means that Vim checks the file to see
+if it's one of these encodings:
+
+ ucs-bom File must start with a Byte Order Mark (BOM). This
+ allows detection of 16-bit, 32-bit and utf-8 Unicode
+ encodings.
+ utf-8 utf-8 Unicode. This is rejected when a sequence of
+ bytes is illegal in utf-8.
+ latin1 The good old 8-bit encoding. Always works.
+
+When you start editing that 16-bit Unicode file, and it has a BOM, Vim will
+detect this and convert the file to utf-8 when reading it. The 'fileencoding'
+option (without s at the end) is set to the detected value. In this case it
+is "utf-16le". That means it's Unicode, 16-bit and little-endian. This
+file format is common on MS-Windows (e.g., for registry files).
+ When writing the file, Vim will compare 'fileencoding' with 'encoding'. If
+they are different, the text will be converted.
+ An empty value for 'fileencoding' means that no conversion is to be done.
+Thus the text is assumed to be encoded with 'encoding'.
+
+If the default 'fileencodings' value is not good for you, set it to the
+encodings you want Vim to try. Only when a value is found to be invalid will
+the next one be used. Putting "latin1" first doesn't work, because it is
+never illegal. An example, to fall back to Japanese when the file doesn't
+have a BOM and isn't utf-8: >
+
+ :set fileencodings=ucs-bom,utf-8,sjis
+
+See |encoding-values| for suggested values. Other values may work as well.
+This depends on the conversion available.
+
+
+FORCING AN ENCODING
+
+If the automatic detection doesn't work you must tell Vim what encoding the
+file is. Example: >
+
+ :edit ++enc=koi8-r russian.txt
+
+The "++enc" part specifies the name of the encoding to be used for this file
+only. Vim will convert the file from the specified encoding, Russian in this
+example, to 'encoding'. 'fileencoding' will also be set to the specified
+encoding, so that the reverse conversion can be done when writing the file.
+ The same argument can be used when writing the file. This way you can
+actually use Vim to convert a file. Example: >
+
+ :write ++enc=utf-8 russian.txt
+<
+ Note:
+ Conversion may result in lost characters. Conversion from an encoding
+ to Unicode and back is mostly free of this problem, unless there are
+ illegal characters. Conversion from Unicode to other encodings often
+ loses information when there was more than one language in the file.
+
+==============================================================================
+*45.5* Entering language text
+
+Computer keyboards don't have much more than a hundred keys. Some languages
+have thousands of characters, Unicode has over hundred thousand. So how do
+you type these characters?
+ First of all, when you don't use too many of the special characters, you
+can use digraphs. This was already explained in |24.9|.
+ When you use a language that uses many more characters than keys on your
+keyboard, you will want to use an Input Method (IM). This requires learning
+the translation from typed keys to resulting character. When you need an IM
+you probably already have one on your system. It should work with Vim like
+with other programs. For details see |mbyte-XIM| for the X Window system and
+|mbyte-IME| for MS-Windows.
+
+
+KEYMAPS
+
+For some languages the character set is different from latin, but uses a
+similar number of characters. It's possible to map keys to characters. Vim
+uses keymaps for this.
+ Suppose you want to type Hebrew. You can load the keymap like this: >
+
+ :set keymap=hebrew
+
+Vim will try to find a keymap file for you. This depends on the value of
+'encoding'. If no matching file was found, you will get an error message.
+
+Now you can type Hebrew in Insert mode. In Normal mode, and when typing a ":"
+command, Vim automatically switches to English. You can use this command to
+switch between Hebrew and English: >
+
+ CTRL-^
+
+This only works in Insert mode and Command-line mode. In Normal mode it does
+something completely different (jumps to alternate file).
+ The usage of the keymap is indicated in the mode message, if you have the
+'showmode' option set. In the GUI Vim will indicate the usage of keymaps with
+a different cursor color.
+ You can also change the usage of the keymap with the 'iminsert' and
+'imsearch' options.
+
+To see the list of mappings, use this command: >
+
+ :lmap
+
+To find out which keymap files are available, in the GUI you can use the
+Edit/Keymap menu. Otherwise you can use this command: >
+
+ :echo globpath(&rtp, "keymap/*.vim")
+
+
+DO-IT-YOURSELF KEYMAPS
+
+You can create your own keymap file. It's not very difficult. Start with
+a keymap file that is similar to the language you want to use. Copy it to the
+"keymap" directory in your runtime directory. For example, for Unix, you
+would use the directory "~/.vim/keymap".
+ The name of the keymap file must look like this:
+
+ keymap/{name}.vim ~
+or
+ keymap/{name}_{encoding}.vim ~
+
+{name} is the name of the keymap. Chose a name that is obvious, but different
+from existing keymaps (unless you want to replace an existing keymap file).
+{name} cannot contain an underscore. Optionally, add the encoding used after
+an underscore. Examples:
+
+ keymap/hebrew.vim ~
+ keymap/hebrew_utf-8.vim ~
+
+The contents of the file should be self-explanatory. Look at a few of the
+keymaps that are distributed with Vim. For the details, see |mbyte-keymap|.
+
+
+LAST RESORT
+
+If all other methods fail, you can enter any character with CTRL-V:
+
+ encoding type range ~
+ 8-bit CTRL-V 123 decimal 0-255
+ 8-bit CTRL-V x a1 hexadecimal 00-ff
+ 16-bit CTRL-V u 013b hexadecimal 0000-ffff
+ 31-bit CTRL-V U 001303a4 hexadecimal 00000000-7fffffff
+
+Don't type the spaces. See |i_CTRL-V_digit| for the details.
+
+==============================================================================
+
+Next chapter: |usr_50.txt| Advanced Vim script writing
+
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_50.txt b/runtime/doc/usr_50.txt
new file mode 100644
index 0000000..fc46388
--- /dev/null
+++ b/runtime/doc/usr_50.txt
@@ -0,0 +1,131 @@
+*usr_50.txt* For Vim version 9.0. Last change: 2022 Jun 20
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Advanced Vim script writing
+
+
+|50.1| Exceptions
+|50.2| Function with variable number of arguments
+|50.3| Restoring the view
+
+ Next chapter: |usr_51.txt| Create a plugin
+ Previous chapter: |usr_45.txt| Select your language (local)
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*50.1* Exceptions
+
+Let's start with an example: >
+
+ try
+ read ~/templates/pascal.tmpl
+ catch /E484:/
+ echo "Sorry, the Pascal template file cannot be found."
+ endtry
+
+The `read` command will fail if the file does not exist. Instead of
+generating an error message, this code catches the error and gives the user a
+message with more information.
+
+For the commands in between `try` and `endtry` errors are turned into
+exceptions. An exception is a string. In the case of an error the string
+contains the error message. And every error message has a number. In this
+case, the error we catch contains "E484:". This number is guaranteed to stay
+the same (the text may change, e.g., it may be translated).
+
+Besides being able to give a nice error message, Vim will also continue
+executing commands after the `:endtry`. Otherwise, once an uncaught error is
+encountered, execution of the script/function/mapping will be aborted.
+
+When the `read` command causes another error, the pattern "E484:" will not
+match in it. Thus this exception will not be caught and result in the usual
+error message and execution is aborted.
+
+You might be tempted to do this: >
+
+ try
+ read ~/templates/pascal.tmpl
+ catch
+ echo "Sorry, the Pascal template file cannot be found."
+ endtry
+
+This means all errors are caught. But then you will not see an error that
+would indicate a completely different problem, such as "E21: Cannot make
+changes, 'modifiable' is off". Think twice before you catch any error!
+
+Another useful mechanism is the `finally` command: >
+
+ var tmp = tempname()
+ try
+ exe ":.,$write " .. tmp
+ exe "!filter " .. tmp
+ :.,$delete
+ exe ":$read " .. tmp
+ finally
+ delete(tmp)
+ endtry
+
+This filters the lines from the cursor until the end of the file through the
+"filter" command, which takes a file name argument. No matter if the
+filtering works, if something goes wrong in between `try` and `finally` or the
+user cancels the filtering by pressing CTRL-C, the `delete(tmp)` call is
+always executed. This makes sure you don't leave the temporary file behind.
+
+The `finally` does not catch the exception, the error will still abort
+further execution.
+
+More information about exception handling can be found in the reference
+manual: |exception-handling|.
+
+==============================================================================
+*50.2* Function with variable number of arguments
+
+Vim enables you to define functions that have a variable number of arguments.
+The following command, for instance, defines a function that must have 1
+argument (start) and can have up to 20 additional arguments: >
+
+ def Show(start: string, ...items: list<string>)
+
+The variable "items" will be a list in the function containing the extra
+arguments. You can use it like any list, for example: >
+
+ def Show(start: string, ...items: list<string>)
+ echohl Title
+ echo "start is " .. start
+ echohl None
+ for index in range(len(items))
+ echon $" Arg {index} is {items[index]}"
+ endfor
+ echo
+ enddef
+
+You can call it like this: >
+
+ Show('Title', 'one', 'two', 'three')
+< start is Title Arg 0 is one Arg 1 is two Arg 2 is three ~
+
+This uses the `echohl` command to specify the highlighting used for the
+following `echo` command. `echohl None` stops it again. The `echon` command
+works like `echo`, but doesn't output a line break.
+
+If you call it with one argument the "items" list will be empty.
+`range(len(items))` returns a list with the indexes, what `for` loops over,
+we'll explain that further down.
+
+==============================================================================
+*50.3* Restoring the view
+
+Sometimes you want to jump around, make a change and then go back to the same
+position and view. For example to change something in the file header. This
+can be done with two functions: >
+
+ var view = winsaveview()
+ # Move around, make changes
+ winrestview(view)
+
+==============================================================================
+
+Next chapter: |usr_51.txt| Create a plugin
+
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_51.txt b/runtime/doc/usr_51.txt
new file mode 100644
index 0000000..2eea6aa
--- /dev/null
+++ b/runtime/doc/usr_51.txt
@@ -0,0 +1,694 @@
+*usr_51.txt* For Vim version 9.0. Last change: 2022 Jun 03
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Write plugins
+
+
+Plugins can be used to define settings for a specific type of file, syntax
+highlighting and many other things. This chapter explains how to write the
+most common Vim plugins.
+
+|51.1| Writing a generic plugin
+|51.2| Writing a filetype plugin
+|51.3| Writing a compiler plugin
+|51.4| Distributing Vim scripts
+
+ Next chapter: |usr_52.txt| Write large plugins
+ Previous chapter: |usr_50.txt| Advanced Vim script writing
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*51.1* Writing a generic plugin *write-plugin*
+
+You can write a Vim script in such a way that many people can use it. This is
+called a plugin. Vim users can drop your script in their plugin directory and
+use its features right away |add-plugin|.
+
+There are actually two types of plugins:
+
+ global plugins: For all types of files.
+filetype plugins: Only for files of a specific type.
+
+In this section the first type is explained. Most items are also relevant for
+writing filetype plugins. The specifics for filetype plugins are in the next
+section |write-filetype-plugin|.
+
+We will use |Vim9| syntax here, the recommended way to write new plugins.
+Make sure the file starts with the `vim9script` command.
+
+
+NAME
+
+First of all you must choose a name for your plugin. The features provided
+by the plugin should be clear from its name. And it should be unlikely that
+someone else writes a plugin with the same name but which does something
+different.
+
+A script that corrects typing mistakes could be called "typecorrect.vim". We
+will use it here as an example.
+
+For the plugin to work for everybody, it should follow a few guidelines. This
+will be explained step-by-step. The complete example plugin is at the end.
+
+
+BODY
+
+Let's start with the body of the plugin, the lines that do the actual work: >
+
+ 12 iabbrev teh the
+ 13 iabbrev otehr other
+ 14 iabbrev wnat want
+ 15 iabbrev synchronisation
+ 16 \ synchronization
+
+The actual list should be much longer, of course.
+
+The line numbers have only been added to explain a few things, don't put them
+in your plugin file!
+
+
+FIRST LINE
+>
+ 1 vim9script noclear
+
+You need to use `vim9script` as the very first command. Best is to put it in
+the very first line.
+
+The script we are writing will have a `finish` command to bail out when it is
+loaded a second time. To avoid that the items defined in the script are lost
+the "noclear" argument is used. More info about this at |vim9-reload|.
+
+
+HEADER
+
+You will probably add new corrections to the plugin and soon have several
+versions lying around. And when distributing this file, people will want to
+know who wrote this wonderful plugin and where they can send remarks.
+Therefore, put a header at the top of your plugin: >
+
+ 2 # Vim global plugin for correcting typing mistakes
+ 3 # Last Change: 2021 Dec 30
+ 4 # Maintainer: Bram Moolenaar <Bram@vim.org>
+
+About copyright and licensing: Since plugins are very useful and it's hardly
+worth restricting their distribution, please consider making your plugin
+either public domain or use the Vim |license|. A short note about this near
+the top of the plugin should be sufficient. Example: >
+
+ 5 # License: This file is placed in the public domain.
+
+
+NOT LOADING
+
+It is possible that a user doesn't always want to load this plugin. Or the
+system administrator has dropped it in the system-wide plugin directory, but a
+user has his own plugin he wants to use. Then the user must have a chance to
+disable loading this specific plugin. These lines will make it possible: >
+
+ 7 if exists("g:loaded_typecorrect")
+ 8 finish
+ 9 endif
+ 10 g:loaded_typecorrect = 1
+
+This also avoids that when the script is loaded twice it would pointlessly
+redefine functions and cause trouble for autocommands that are added twice.
+
+The name is recommended to start with "g:loaded_" and then the file name of
+the plugin, literally. The "g:" is prepended to make the variable global, so
+that other places can check whether its functionality is available. Without
+"g:" it would be local to the script.
+
+Using `finish` stops Vim from reading the rest of the file, it's much quicker
+than using if-endif around the whole file, since Vim would still need to parse
+the commands to find the `endif`.
+
+
+MAPPING
+
+Now let's make the plugin more interesting: We will add a mapping that adds a
+correction for the word under the cursor. We could just pick a key sequence
+for this mapping, but the user might already use it for something else. To
+allow the user to define which keys a mapping in a plugin uses, the <Leader>
+item can be used: >
+
+ 20 map <unique> <Leader>a <Plug>TypecorrAdd;
+
+The "<Plug>TypecorrAdd;" thing will do the work, more about that further on.
+
+The user can set the "g:mapleader" variable to the key sequence that he wants
+plugin mappings to start with. Thus if the user has done: >
+
+ g:mapleader = "_"
+
+the mapping will define "_a". If the user didn't do this, the default value
+will be used, which is a backslash. Then a map for "\a" will be defined.
+
+Note that <unique> is used, this will cause an error message if the mapping
+already happened to exist. |:map-<unique>|
+
+But what if the user wants to define his own key sequence? We can allow that
+with this mechanism: >
+
+ 19 if !hasmapto('<Plug>TypecorrAdd;')
+ 20 map <unique> <Leader>a <Plug>TypecorrAdd;
+ 21 endif
+
+This checks if a mapping to "<Plug>TypecorrAdd;" already exists, and only
+defines the mapping from "<Leader>a" if it doesn't. The user then has a
+chance of putting this in his vimrc file: >
+
+ map ,c <Plug>TypecorrAdd;
+
+Then the mapped key sequence will be ",c" instead of "_a" or "\a".
+
+
+PIECES
+
+If a script gets longer, you often want to break up the work in pieces. You
+can use functions or mappings for this. But you don't want these functions
+and mappings to interfere with the ones from other scripts. For example, you
+could define a function Add(), but another script could try to define the same
+function. To avoid this, we define the function local to the script.
+Fortunately, in |Vim9| script this is the default. In a legacy script you
+would need to prefix the name with "s:".
+
+We will define a function that adds a new typing correction: >
+
+ 28 def Add(from: string, correct: bool)
+ 29 var to = input($"type the correction for {from}: ")
+ 30 exe $":iabbrev {from} {to}"
+ ...
+ 34 enddef
+
+Now we can call the function Add() from within this script. If another
+script also defines Add(), it will be local to that script and can only
+be called from that script. There can also be a global g:Add() function,
+which is again another function.
+
+<SID> can be used with mappings. It generates a script ID, which identifies
+the current script. In our typing correction plugin we use it like this: >
+
+ 22 noremap <unique> <script> <Plug>TypecorrAdd; <SID>Add
+ ...
+ 26 noremap <SID>Add :call <SID>Add(expand("<cword>"), true)<CR>
+
+Thus when a user types "\a", this sequence is invoked: >
+
+ \a -> <Plug>TypecorrAdd; -> <SID>Add -> :call <SID>Add(...)
+
+If another script also maps <SID>Add, it will get another script ID and
+thus define another mapping.
+
+Note that instead of Add() we use <SID>Add() here. That is because the
+mapping is typed by the user, thus outside of the script context. The <SID>
+is translated to the script ID, so that Vim knows in which script to look for
+the Add() function.
+
+This is a bit complicated, but it's required for the plugin to work together
+with other plugins. The basic rule is that you use <SID>Add() in mappings and
+Add() in other places (the script itself, autocommands, user commands).
+
+We can also add a menu entry to do the same as the mapping: >
+
+ 24 noremenu <script> Plugin.Add\ Correction <SID>Add
+
+The "Plugin" menu is recommended for adding menu items for plugins. In this
+case only one item is used. When adding more items, creating a submenu is
+recommended. For example, "Plugin.CVS" could be used for a plugin that offers
+CVS operations "Plugin.CVS.checkin", "Plugin.CVS.checkout", etc.
+
+Note that in line 28 ":noremap" is used to avoid that any other mappings cause
+trouble. Someone may have remapped ":call", for example. In line 24 we also
+use ":noremap", but we do want "<SID>Add" to be remapped. This is why
+"<script>" is used here. This only allows mappings which are local to the
+script. |:map-<script>| The same is done in line 26 for ":noremenu".
+|:menu-<script>|
+
+
+<SID> AND <Plug> *using-<Plug>*
+
+Both <SID> and <Plug> are used to avoid that mappings of typed keys interfere
+with mappings that are only to be used from other mappings. Note the
+difference between using <SID> and <Plug>:
+
+<Plug> is visible outside of the script. It is used for mappings which the
+ user might want to map a key sequence to. <Plug> is a special code
+ that a typed key will never produce.
+ To make it very unlikely that other plugins use the same sequence of
+ characters, use this structure: <Plug> scriptname mapname
+ In our example the scriptname is "Typecorr" and the mapname is "Add".
+ We add a semicolon as the terminator. This results in
+ "<Plug>TypecorrAdd;". Only the first character of scriptname and
+ mapname is uppercase, so that we can see where mapname starts.
+
+<SID> is the script ID, a unique identifier for a script.
+ Internally Vim translates <SID> to "<SNR>123_", where "123" can be any
+ number. Thus a function "<SID>Add()" will have a name "<SNR>11_Add()"
+ in one script, and "<SNR>22_Add()" in another. You can see this if
+ you use the ":function" command to get a list of functions. The
+ translation of <SID> in mappings is exactly the same, that's how you
+ can call a script-local function from a mapping.
+
+
+USER COMMAND
+
+Now let's add a user command to add a correction: >
+
+ 36 if !exists(":Correct")
+ 37 command -nargs=1 Correct :call Add(<q-args>, false)
+ 38 endif
+
+The user command is defined only if no command with the same name already
+exists. Otherwise we would get an error here. Overriding the existing user
+command with ":command!" is not a good idea, this would probably make the user
+wonder why the command he defined himself doesn't work. |:command|
+If it did happen you can find out who to blame with: >
+
+ verbose command Correct
+
+
+SCRIPT VARIABLES
+
+When a variable starts with "s:" it is a script variable. It can only be used
+inside a script. Outside the script it's not visible. This avoids trouble
+with using the same variable name in different scripts. The variables will be
+kept as long as Vim is running. And the same variables are used when sourcing
+the same script again. |s:var|
+
+The nice thing about |Vim9| script is that variables are local to the script
+by default. You can prepend "s:" if you like, but you do not need to. And
+functions in the script can also use the script variables without a prefix
+(they must be declared before the function for this to work).
+
+Script-local variables can also be used in functions, autocommands and user
+commands that are defined in the script. Thus they are the perfect way to
+share information between parts of your plugin, without it leaking out. In
+our example we can add a few lines to count the number of corrections: >
+
+ 17 var count = 4
+ ...
+ 28 def Add(from: string, correct: bool)
+ ...
+ 32 count += 1
+ 33 echo "you now have " .. count .. " corrections"
+ 34 enddef
+
+"count" is declared and initialized to 4 in the script itself. When later
+the Add() function is called, it increments "count". It doesn't matter from
+where the function was called, since it has been defined in the script, it
+will use the local variables from this script.
+
+
+THE RESULT
+
+Here is the resulting complete example: >
+
+ 1 vim9script noclear
+ 2 # Vim global plugin for correcting typing mistakes
+ 3 # Last Change: 2021 Dec 30
+ 4 # Maintainer: Bram Moolenaar <Bram@vim.org>
+ 5 # License: This file is placed in the public domain.
+ 6
+ 7 if exists("g:loaded_typecorrect")
+ 8 finish
+ 9 endif
+ 10 g:loaded_typecorrect = 1
+ 11
+ 12 iabbrev teh the
+ 13 iabbrev otehr other
+ 14 iabbrev wnat want
+ 15 iabbrev synchronisation
+ 16 \ synchronization
+ 17 var count = 4
+ 18
+ 19 if !hasmapto('<Plug>TypecorrAdd;')
+ 20 map <unique> <Leader>a <Plug>TypecorrAdd;
+ 21 endif
+ 22 noremap <unique> <script> <Plug>TypecorrAdd; <SID>Add
+ 23
+ 24 noremenu <script> Plugin.Add\ Correction <SID>Add
+ 25
+ 26 noremap <SID>Add :call <SID>Add(expand("<cword>"), true)<CR>
+ 27
+ 28 def Add(from: string, correct: bool)
+ 29 var to = input("type the correction for " .. from .. ": ")
+ 30 exe ":iabbrev " .. from .. " " .. to
+ 31 if correct | exe "normal viws\<C-R>\" \b\e" | endif
+ 32 count += 1
+ 33 echo "you now have " .. count .. " corrections"
+ 34 enddef
+ 35
+ 36 if !exists(":Correct")
+ 37 command -nargs=1 Correct call Add(<q-args>, false)
+ 38 endif
+
+Line 31 wasn't explained yet. It applies the new correction to the word under
+the cursor. The |:normal| command is used to use the new abbreviation. Note
+that mappings and abbreviations are expanded here, even though the function
+was called from a mapping defined with ":noremap".
+
+
+DOCUMENTATION *write-local-help*
+
+It's a good idea to also write some documentation for your plugin. Especially
+when its behavior can be changed by the user. See |add-local-help| for how
+they are installed.
+
+Here is a simple example for a plugin help file, called "typecorrect.txt": >
+
+ 1 *typecorrect.txt* Plugin for correcting typing mistakes
+ 2
+ 3 If you make typing mistakes, this plugin will have them corrected
+ 4 automatically.
+ 5
+ 6 There are currently only a few corrections. Add your own if you like.
+ 7
+ 8 Mappings:
+ 9 <Leader>a or <Plug>TypecorrAdd;
+ 10 Add a correction for the word under the cursor.
+ 11
+ 12 Commands:
+ 13 :Correct {word}
+ 14 Add a correction for {word}.
+ 15
+ 16 *typecorrect-settings*
+ 17 This plugin doesn't have any settings.
+
+The first line is actually the only one for which the format matters. It will
+be extracted from the help file to be put in the "LOCAL ADDITIONS:" section of
+help.txt |local-additions|. The first "*" must be in the first column of the
+first line. After adding your help file do ":help" and check that the entries
+line up nicely.
+
+You can add more tags inside ** in your help file. But be careful not to use
+existing help tags. You would probably use the name of your plugin in most of
+them, like "typecorrect-settings" in the example.
+
+Using references to other parts of the help in || is recommended. This makes
+it easy for the user to find associated help.
+
+
+SUMMARY *plugin-special*
+
+Summary of special things to use in a plugin:
+
+var name Variable local to the script.
+
+<SID> Script-ID, used for mappings and functions local to
+ the script.
+
+hasmapto() Function to test if the user already defined a mapping
+ for functionality the script offers.
+
+<Leader> Value of "mapleader", which the user defines as the
+ keys that plugin mappings start with.
+
+map <unique> Give a warning if a mapping already exists.
+
+noremap <script> Use only mappings local to the script, not global
+ mappings.
+
+exists(":Cmd") Check if a user command already exists.
+
+==============================================================================
+*51.2* Writing a filetype plugin *write-filetype-plugin* *ftplugin*
+
+A filetype plugin is like a global plugin, except that it sets options and
+defines mappings for the current buffer only. See |add-filetype-plugin| for
+how this type of plugin is used.
+
+First read the section on global plugins above |51.1|. All that is said there
+also applies to filetype plugins. There are a few extras, which are explained
+here. The essential thing is that a filetype plugin should only have an
+effect on the current buffer.
+
+
+DISABLING
+
+If you are writing a filetype plugin to be used by many people, they need a
+chance to disable loading it. Put this at the top of the plugin: >
+
+ # Only do this when not done yet for this buffer
+ if exists("b:did_ftplugin")
+ finish
+ endif
+ b:did_ftplugin = 1
+
+This also needs to be used to avoid that the same plugin is executed twice for
+the same buffer (happens when using an ":edit" command without arguments).
+
+Now users can disable loading the default plugin completely by making a
+filetype plugin with only these lines: >
+
+ vim9script
+ b:did_ftplugin = 1
+
+This does require that the filetype plugin directory comes before $VIMRUNTIME
+in 'runtimepath'!
+
+If you do want to use the default plugin, but overrule one of the settings,
+you can write the different setting in a script: >
+
+ setlocal textwidth=70
+
+Now write this in the "after" directory, so that it gets sourced after the
+distributed "vim.vim" ftplugin |after-directory|. For Unix this would be
+"~/.vim/after/ftplugin/vim.vim". Note that the default plugin will have set
+"b:did_ftplugin", it is ignored here.
+
+
+OPTIONS
+
+To make sure the filetype plugin only affects the current buffer use the >
+
+ setlocal
+
+command to set options. And only set options which are local to a buffer (see
+the help for the option to check that). When using `:setlocal` for global
+options or options local to a window, the value will change for many buffers,
+and that is not what a filetype plugin should do.
+
+When an option has a value that is a list of flags or items, consider using
+"+=" and "-=" to keep the existing value. Be aware that the user may have
+changed an option value already. First resetting to the default value and
+then changing it is often a good idea. Example: >
+
+ setlocal formatoptions& formatoptions+=ro
+
+
+MAPPINGS
+
+To make sure mappings will only work in the current buffer use the >
+
+ map <buffer>
+
+command. This needs to be combined with the two-step mapping explained above.
+An example of how to define functionality in a filetype plugin: >
+
+ if !hasmapto('<Plug>JavaImport;')
+ map <buffer> <unique> <LocalLeader>i <Plug>JavaImport;
+ endif
+ noremap <buffer> <unique> <Plug>JavaImport; oimport ""<Left><Esc>
+
+|hasmapto()| is used to check if the user has already defined a map to
+<Plug>JavaImport;. If not, then the filetype plugin defines the default
+mapping. This starts with |<LocalLeader>|, which allows the user to select
+the key(s) he wants filetype plugin mappings to start with. The default is a
+backslash.
+"<unique>" is used to give an error message if the mapping already exists or
+overlaps with an existing mapping.
+|:noremap| is used to avoid that any other mappings that the user has defined
+interferes. You might want to use ":noremap <script>" to allow remapping
+mappings defined in this script that start with <SID>.
+
+The user must have a chance to disable the mappings in a filetype plugin,
+without disabling everything. Here is an example of how this is done for a
+plugin for the mail filetype: >
+
+ # Add mappings, unless the user didn't want this.
+ if !exists("g:no_plugin_maps") && !exists("g:no_mail_maps")
+ # Quote text by inserting "> "
+ if !hasmapto('<Plug>MailQuote;')
+ vmap <buffer> <LocalLeader>q <Plug>MailQuote;
+ nmap <buffer> <LocalLeader>q <Plug>MailQuote;
+ endif
+ vnoremap <buffer> <Plug>MailQuote; :s/^/> /<CR>
+ nnoremap <buffer> <Plug>MailQuote; :.,$s/^/> /<CR>
+ endif
+
+Two global variables are used:
+|g:no_plugin_maps| disables mappings for all filetype plugins
+|g:no_mail_maps| disables mappings for the "mail" filetype
+
+
+USER COMMANDS
+
+To add a user command for a specific file type, so that it can only be used in
+one buffer, use the "-buffer" argument to |:command|. Example: >
+
+ command -buffer Make make %:r.s
+
+
+VARIABLES
+
+A filetype plugin will be sourced for each buffer of the type it's for. Local
+script variables will be shared between all invocations. Use local buffer
+variables |b:var| if you want a variable specifically for one buffer.
+
+
+FUNCTIONS
+
+When defining a function, this only needs to be done once. But the filetype
+plugin will be sourced every time a file with this filetype will be opened.
+This construct makes sure the function is only defined once: >
+
+ if !exists("*Func")
+ def Func(arg)
+ ...
+ enddef
+ endif
+<
+Don't forget to use "noclear" with the `vim9script` command to avoid that the
+function is deleted when the script is sourced a second time.
+
+
+UNDO *undo_indent* *undo_ftplugin*
+
+When the user does ":setfiletype xyz" the effect of the previous filetype
+should be undone. Set the b:undo_ftplugin variable to the commands that will
+undo the settings in your filetype plugin. Example: >
+
+ b:undo_ftplugin = "setlocal fo< com< tw< commentstring<"
+ \ .. "| unlet b:match_ignorecase b:match_words b:match_skip"
+
+Using ":setlocal" with "<" after the option name resets the option to its
+global value. That is mostly the best way to reset the option value.
+
+For undoing the effect of an indent script, the b:undo_indent variable should
+be set accordingly.
+
+Both these variables use legacy script syntax, not |Vim9| syntax.
+
+
+FILE NAME
+
+The filetype must be included in the file name |ftplugin-name|. Use one of
+these three forms:
+
+ .../ftplugin/stuff.vim
+ .../ftplugin/stuff_foo.vim
+ .../ftplugin/stuff/bar.vim
+
+"stuff" is the filetype, "foo" and "bar" are arbitrary names.
+
+
+FILETYPE DETECTION *plugin-filetype*
+
+If your filetype is not already detected by Vim, you should create a filetype
+detection snippet in a separate file. It is usually in the form of an
+autocommand that sets the filetype when the file name matches a pattern.
+Example: >
+
+ au BufNewFile,BufRead *.foo setlocal filetype=foofoo
+
+Write this single-line file as "ftdetect/foofoo.vim" in the first directory
+that appears in 'runtimepath'. For Unix that would be
+"~/.vim/ftdetect/foofoo.vim". The convention is to use the name of the
+filetype for the script name.
+
+You can make more complicated checks if you like, for example to inspect the
+contents of the file to recognize the language. Also see |new-filetype|.
+
+
+SUMMARY *ftplugin-special*
+
+Summary of special things to use in a filetype plugin:
+
+<LocalLeader> Value of "maplocalleader", which the user defines as
+ the keys that filetype plugin mappings start with.
+
+map <buffer> Define a mapping local to the buffer.
+
+noremap <script> Only remap mappings defined in this script that start
+ with <SID>.
+
+setlocal Set an option for the current buffer only.
+
+command -buffer Define a user command local to the buffer.
+
+exists("*s:Func") Check if a function was already defined.
+
+Also see |plugin-special|, the special things used for all plugins.
+
+==============================================================================
+*51.3* Writing a compiler plugin *write-compiler-plugin*
+
+A compiler plugin sets options for use with a specific compiler. The user can
+load it with the |:compiler| command. The main use is to set the
+'errorformat' and 'makeprg' options.
+
+Easiest is to have a look at examples. This command will edit all the default
+compiler plugins: >
+
+ next $VIMRUNTIME/compiler/*.vim
+
+Type `:next` to go to the next plugin file.
+
+There are two special items about these files. First is a mechanism to allow
+a user to overrule or add to the default file. The default files start with: >
+
+ vim9script
+ if exists("g:current_compiler")
+ finish
+ endif
+ g:current_compiler = "mine"
+
+When you write a compiler file and put it in your personal runtime directory
+(e.g., ~/.vim/compiler for Unix), you set the "current_compiler" variable to
+make the default file skip the settings.
+ *:CompilerSet*
+The second mechanism is to use ":set" for ":compiler!" and ":setlocal" for
+":compiler". Vim defines the ":CompilerSet" user command for this. However,
+older Vim versions don't, thus your plugin should define it then. This is an
+example: >
+
+ if exists(":CompilerSet") != 2
+ command -nargs=* CompilerSet setlocal <args>
+ endif
+ CompilerSet errorformat& " use the default 'errorformat'
+ CompilerSet makeprg=nmake
+
+When you write a compiler plugin for the Vim distribution or for a system-wide
+runtime directory, use the mechanism mentioned above. When
+"current_compiler" was already set by a user plugin nothing will be done.
+
+When you write a compiler plugin to overrule settings from a default plugin,
+don't check "current_compiler". This plugin is supposed to be loaded
+last, thus it should be in a directory at the end of 'runtimepath'. For Unix
+that could be ~/.vim/after/compiler.
+
+==============================================================================
+*51.4* Distributing Vim scripts *distribute-script*
+
+Vim users will look for scripts on the Vim website: http://www.vim.org.
+If you made something that is useful for others, share it!
+
+Another place is github. But there you need to know where to find it! The
+advantage is that most plugin managers fetch plugins from github. You'll have
+to use your favorite search engine to find them.
+
+Vim scripts can be used on any system. However, 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|.
+
+It's good if you add a line to allow automatic updating. See |glvs-plugins|.
+
+==============================================================================
+
+Next chapter: |usr_52.txt| Write large plugins
+
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_52.txt b/runtime/doc/usr_52.txt
new file mode 100644
index 0000000..787dd91
--- /dev/null
+++ b/runtime/doc/usr_52.txt
@@ -0,0 +1,343 @@
+*usr_52.txt* For Vim version 9.0. Last change: 2022 Jun 04
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Write larger plugins
+
+When plugins do more than simple things, they tend to grow big. This file
+explains how to make sure they still load fast and how to split them up in
+smaller parts.
+
+|52.1| Export and import
+|52.2| Autoloading
+|52.3| Autoloading without import/export
+|52.4| Other mechanisms to use
+|52.5| Using a Vim9 script from legacy script
+
+ Next chapter: |usr_90.txt| Installing Vim
+ Previous chapter: |usr_51.txt| Create a plugin
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*52.1* Export and import
+
+Vim9 script was designed to make it easier to write large Vim scripts. It
+looks more like other script languages, especially Typescript. Also,
+functions are compiled into instructions that can be executed quickly. This
+makes Vim9 script a lot faster, up to a 100 times.
+
+The basic idea is that a script file has items that are private, only used
+inside the script file, and items that are exported, which can be used by
+scripts that import them. That makes very clear what is defined where.
+
+Let's start with an example, a script that exports one function and has one
+private function: >
+
+ vim9script
+
+ export def GetMessage(count: string): string
+ var nr = str2nr(count)
+ var result = $'To {nr} we say '
+ result ..= GetReply(nr)
+ return result
+ enddef
+
+ def GetReply(nr: number): string
+ if nr == 42
+ return 'yes'
+ elseif nr = 22
+ return 'maybe'
+ else
+ return 'no'
+ endif
+ enddef
+
+The `vim9script` command is required, `export` only works in a |Vim9| script.
+
+The `export def GetMessage(...` line starts with `export`, meaning that this
+function can be called by other scripts. The line `def GetReply(...` does not
+start with `export`, this is a script-local function, it can only be used
+inside this script file.
+
+Now about the script where this is imported. In this example we use this
+layout, which works well for a plugin below the "pack" directory:
+ .../plugin/theplugin.vim
+ .../lib/getmessage.vim
+
+Assuming the "..." directory has been added to 'runtimepath', Vim will look
+for plugins in the "plugin" directory and source "theplugin.vim". Vim does
+not recognize the "lib" directory, you can put any scripts there.
+
+The above script that exports GetMessage() goes in lib/getmessage.vim. The
+GetMessage() function is used in plugin/theplugin.vim: >
+
+ vim9script
+
+ import "../lib/getmessage.vim"
+ command -nargs=1 ShowMessage echomsg getmessage.GetMessage(<f-args>)
+
+The `import` command uses a relative path, it starts with "../", which means
+to go one directory up. For other kinds of paths see the `:import` command.
+
+How we can try out the command that the plugin provides: >
+ ShowMessage 1
+< To 1 we say no ~
+>
+ ShowMessage 22
+< To 22 we say maybe ~
+
+Notice that the function GetMessage() is prefixed with the imported script
+name "getmessage". That way, for every imported function used, you know what
+script it was imported from. If you import several scripts each of them could
+define a GetMessage() function: >
+
+ vim9script
+
+ import "../lib/getmessage.vim"
+ import "../lib/getother.vim"
+ command -nargs=1 ShowMessage echomsg getmessage.GetMessage(<f-args>)
+ command -nargs=1 ShowOther echomsg getother.GetMessage(<f-args>)
+
+If the imported script name is long or you use it in many places, you can
+shorten it by adding an "as" argument: >
+ import "../lib/getmessage.vim" as msg
+ command -nargs=1 ShowMessage echomsg msg.GetMessage(<f-args>)
+
+
+RELOADING
+
+One thing to keep in mind: the imported "lib/getmessage.vim" script will be
+sourced only once. When it is imported a second time sourcing it will be
+skipped, since the items in it have already been created. It does not matter
+if this import command is in another script, or in the same script that is
+sourced again.
+
+This is efficient when using a plugin, but when still developing a plugin it
+means that changing "lib/getmessage.vim" after it has been imported will have
+no effect. You need to quit Vim and start it again. (Rationale: the items
+defined in the script could be used in a compiled function, sourcing the
+script again may break those functions).
+
+
+USING GLOBALS
+
+Sometimes you will want to use global variables or functions, so that they can
+be used anywhere. A good example is a global variable that passes a
+preference to a plugin. To avoid other scripts using the same name, use a
+prefix that is very unlikely to be used elsewhere. For example, if you have a
+"mytags" plugin, you could use: >
+
+ g:mytags_location = '$HOME/project'
+ g:mytags_style = 'fast'
+
+==============================================================================
+*52.2* Autoloading
+
+After splitting your large script into pieces, all the lines will still be
+loaded and executed the moment the script is used. Every `import` loads the
+imported script to find the items defined there. Although that is good for
+finding errors early, it also takes time. Which is wasted if the
+functionality is not often used.
+
+Instead of having `import` load the script immediately, it can be postponed
+until needed. Using the example above, only one change needs to be made in
+the plugin/theplugin.vim script: >
+ import autoload "../lib/getmessage.vim"
+
+Nothing in the rest of the script needs to change. However, the types will
+not be checked. Not even the existence of the GetMessage() function is
+checked until it is used. You will have to decide what is more important for
+your script: fast startup or getting errors early. You can also add the
+"autoload" argument later, after you have checked everything works.
+
+
+AUTOLOAD DIRECTORY
+
+Another form is to use autoload with a script name that is not an absolute or
+relative path: >
+ import autload "monthlib.vim"
+
+This will search for the script "monthlib.vim" in the autoload directories of
+'runtimepath'. With Unix one of the directories often is "~/.vim/autoload".
+It will also search under 'packpath', under "start".
+
+The main advantage of this is that this script can be easily shared with other
+scripts. You do need to make sure that the script name is unique, since Vim
+will search all the "autoload" directories in 'runtimepath', and if you are
+using several plugins with a plugin manager, it may add a directory to
+'runtimepath', each of which might have an "autoload" directory.
+
+Without autoload: >
+ import "monthlib.vim"
+
+Vim will search for the script "monthlib.vim" in the import directories of
+'runtimepath'. Note that in this case adding or removing "autoload" changes
+where the script is found. With a relative or absolute path the location does
+not change.
+
+==============================================================================
+*52.3* Autoloading without import/export
+
+ *write-library-script*
+A mechanism from before import/export is still useful and some users may find
+it a bit simpler. The idea is that you call a function with a special name.
+That function is then in an autoload script. We will call that one script a
+library script.
+
+The autoload mechanism is based on a function name that has "#" characters: >
+
+ mylib#myfunction(arg)
+
+Vim will recognize the function name by the embedded "#" character and when
+it is not defined yet search for the script "autoload/mylib.vim" in
+'runtimepath'. That script must define the "mylib#myfunction()" function.
+Obviously the name "mylib" is the part before the "#" and is used as the name
+of the script, adding ".vim".
+
+You can put many other functions in the mylib.vim script, you are free to
+organize your functions in library scripts. But you must use function names
+where the part before the '#' matches the script name. Otherwise Vim would
+not know what script to load. This is where it differs from the import/export
+mechanism.
+
+If you get really enthusiastic and write lots of library scripts, you may
+want to use subdirectories. Example: >
+
+ netlib#ftp#read('somefile')
+
+Here the script name is taken from the function name up to the last "#". The
+"#" in the middle are replaced by a slash, the last one by ".vim". Thus you
+get "netlib/ftp.vim". For Unix the library script used for this could be:
+
+ ~/.vim/autoload/netlib/ftp.vim
+
+Where the function is defined like this: >
+
+ def netlib#ftp#read(fname: string)
+ # Read the file fname through ftp
+ enddef
+
+Notice that the name the function is defined with is exactly the same as the
+name used for calling the function. And the part before the last '#'
+exactly matches the subdirectory and script name.
+
+You can use the same mechanism for variables: >
+
+ var weekdays = dutch#weekdays
+
+This will load the script "autoload/dutch.vim", which should contain something
+like: >
+
+ var dutch#weekdays = ['zondag', 'maandag', 'dinsdag', 'woensdag',
+ \ 'donderdag', 'vrijdag', 'zaterdag']
+
+Further reading: |autoload|.
+
+==============================================================================
+*52.4* Other mechanisms to use
+
+Some may find the use of several files a hassle and prefer to keep everything
+together in one script. To avoid this resulting in slow startup there is a
+mechanism that only defines a small part and postpones the rest to when it is
+actually used. *write-plugin-quickload*
+
+The basic idea is that the plugin is loaded twice. The first time user
+commands and mappings are defined that offer the functionality. The second
+time the functions that implement the functionality are defined.
+
+It may sound surprising that quickload means loading a script twice. What we
+mean is that it loads quickly the first time, postponing the bulk of the
+script to the second time, which only happens when you actually use it. When
+you always use the functionality it actually gets slower!
+
+This uses a FuncUndefined autocommand. This works differently from the
+|autoload| functionality explained above.
+
+The following example shows how it's done: >
+
+ " Vim global plugin for demonstrating quick loading
+ " Last Change: 2005 Feb 25
+ " Maintainer: Bram Moolenaar <Bram@vim.org>
+ " License: This file is placed in the public domain.
+
+ if !exists("s:did_load")
+ command -nargs=* BNRead call BufNetRead(<f-args>)
+ map <F19> :call BufNetWrite('something')<CR>
+
+ let s:did_load = 1
+ exe 'au FuncUndefined BufNet* source ' .. expand('<sfile>')
+ finish
+ endif
+
+ function BufNetRead(...)
+ echo 'BufNetRead(' .. string(a:000) .. ')'
+ " read functionality here
+ endfunction
+
+ function BufNetWrite(...)
+ echo 'BufNetWrite(' .. string(a:000) .. ')'
+ " write functionality here
+ endfunction
+
+When the script is first loaded "s:did_load" is not set. The commands between
+the "if" and "endif" will be executed. This ends in a |:finish| command, thus
+the rest of the script is not executed.
+
+The second time the script is loaded "s:did_load" exists and the commands
+after the "endif" are executed. This defines the (possible long)
+BufNetRead() and BufNetWrite() functions.
+
+If you drop this script in your plugin directory Vim will execute it on
+startup. This is the sequence of events that happens:
+
+1. The "BNRead" command is defined and the <F19> key is mapped when the script
+ is sourced at startup. A |FuncUndefined| autocommand is defined. The
+ ":finish" command causes the script to terminate early.
+
+2. The user types the BNRead command or presses the <F19> key. The
+ BufNetRead() or BufNetWrite() function will be called.
+
+3. Vim can't find the function and triggers the |FuncUndefined| autocommand
+ event. Since the pattern "BufNet*" matches the invoked function, the
+ command "source fname" will be executed. "fname" will be equal to the name
+ of the script, no matter where it is located, because it comes from
+ expanding "<sfile>" (see |expand()|).
+
+4. The script is sourced again, the "s:did_load" variable exists and the
+ functions are defined.
+
+Notice that the functions that are loaded afterwards match the pattern in the
+|FuncUndefined| autocommand. You must make sure that no other plugin defines
+functions that match this pattern.
+
+==============================================================================
+*52.5* Using a Vim9 script from legacy script *source-vim9-script*
+
+In some cases you have a legacy Vim script where you want to use items from a
+Vim9 script. For example in your .vimrc you want to initialize a plugin. The
+best way to do this is to use `:import`. For example: >
+
+ import 'myNicePlugin.vim'
+ call myNicePlugin.NiceInit('today')
+
+This finds the exported function "NiceInit" in the Vim9 script file and makes
+it available as script-local item "myNicePlugin.NiceInit". `:import` always
+uses the script namespace, even when "s:" is not given. If "myNicePlugin.vim"
+was already sourced it is not sourced again.
+
+Besides avoiding putting any items in the global namespace (where name clashes
+can cause unexpected errors), this also means the script is sourced only once,
+no matter how many times items from it are imported.
+
+In some cases, e.g. for testing, you may just want to source the Vim9 script.
+That is OK, but then only global items will be available. The Vim9 script
+will have to make sure to use a unique name for these global items. Example: >
+ source ~/.vim/extra/myNicePlugin.vim
+ call g:NicePluginTest()
+
+==============================================================================
+
+Next chapter: |usr_90.txt| Installing Vim
+
+
+Copyright: see |manual-copyright| vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/usr_90.txt b/runtime/doc/usr_90.txt
new file mode 100644
index 0000000..060e0d5
--- /dev/null
+++ b/runtime/doc/usr_90.txt
@@ -0,0 +1,479 @@
+*usr_90.txt* For Vim version 9.0. Last change: 2022 May 13
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Installing Vim
+
+ *install*
+Before you can use Vim you have to install it. Depending on your system it's
+simple or easy. This chapter gives a few hints and also explains how
+upgrading to a new version is done.
+
+|90.1| Unix
+|90.2| MS-Windows
+|90.3| Upgrading
+|90.4| Common installation issues
+|90.5| Uninstalling Vim
+
+ Previous chapter: |usr_52.txt| Write plugins using Vim9 script
+Table of contents: |usr_toc.txt|
+
+==============================================================================
+*90.1* Unix
+
+First you have to decide if you are going to install Vim system-wide or for a
+single user. The installation is almost the same, but the directory where Vim
+is installed in differs.
+ For a system-wide installation the base directory "/usr/local" is often
+used. But this may be different for your system. Try finding out where other
+packages are installed.
+ When installing for a single user, you can use your home directory as the
+base. The files will be placed in subdirectories like "bin" and "shared/vim".
+
+
+FROM A PACKAGE
+
+You can get precompiled binaries for many different UNIX systems. There is a
+long list with links on this page:
+
+ http://www.vim.org/binaries.html ~
+
+Volunteers maintain the binaries, so they are often out of date. It is a
+good idea to compile your own UNIX version from the source. Also, creating
+the editor from the source allows you to control which features are compiled.
+This does require a compiler though.
+
+If you have a Linux distribution, the "vi" program is probably a minimal
+version of Vim. It doesn't do syntax highlighting, for example. Try finding
+another Vim package in your distribution, or search on the web site.
+
+
+FROM SOURCES
+
+To compile and install Vim, you will need the following:
+
+ - A C compiler (GCC preferred)
+ - The GZIP program (you can get it from www.gnu.org)
+ - The Vim source and runtime archives
+
+To get the Vim archives, look in this file for a mirror near you, this should
+provide the fastest download:
+
+ ftp://ftp.vim.org/pub/vim/MIRRORS ~
+
+Or use the home site ftp.vim.org, if you think it's fast enough. Go to the
+"unix" directory and you'll find a list of files there. The version number is
+embedded in the file name. You will want to get the most recent version.
+ You can get the files for Unix in one big archive that contains everything:
+
+ vim-8.2.tar.bz2 ~
+
+You need the bzip2 program to uncompress it.
+
+
+COMPILING
+
+First create a top directory to work in, for example: >
+
+ mkdir ~/vim
+ cd ~/vim
+
+Then unpack the archives there. You can unpack it like this: >
+
+ tar xf path/vim-8.2.tar.bz2
+
+If your tar command doesn't support bz2 directly: >
+
+ bzip2 -d -c path/vim-8.2.tar.bz2 | tar xf -
+
+Change "path" to where you have downloaded the file.
+If you are satisfied with getting the default features, and your environment
+is setup properly, you should be able to compile Vim with just this: >
+
+ cd vim82/src
+ make
+
+The make program will run configure and compile everything. Further on we
+will explain how to compile with different features.
+ If there are errors while compiling, carefully look at the error messages.
+There should be a hint about what went wrong. Hopefully you will be able to
+correct it. You might have to disable some features to make Vim compile.
+Look in the Makefile for specific hints for your system.
+
+
+TESTING
+
+Now you can check if compiling worked OK: >
+
+ make test
+
+This will run a sequence of test scripts to verify that Vim works as expected.
+Vim will be started many times and all kinds of text and messages flash by.
+If it is alright you will finally see:
+
+ test results: ~
+ ALL DONE ~
+
+If you get "TEST FAILURE" some test failed. If there are one or two messages
+about failed tests, Vim might still work, but not perfectly. If you see a lot
+of error messages or Vim doesn't finish until the end, there must be something
+wrong. Either try to find out yourself, or find someone who can solve it.
+You could look in the |maillist-archive| for a solution. If everything else
+fails, you could ask in the vim |maillist| if someone can help you.
+
+
+INSTALLING
+ *install-home*
+If you want to install in your home directory, edit the Makefile and search
+for a line:
+
+ #prefix = $(HOME) ~
+
+Remove the # at the start of the line.
+ When installing for the whole system, Vim has most likely already selected
+a good installation directory for you. You can also specify one, see below.
+You need to become root for the following.
+
+To install Vim do: >
+
+ make install
+
+That should move all the relevant files to the right place. Now you can try
+running vim to verify that it works. Use two simple tests to check if Vim can
+find its runtime files: >
+
+ :help
+ :syntax enable
+
+If this doesn't work, use this command to check where Vim is looking for the
+runtime files: >
+
+ :echo $VIMRUNTIME
+
+You can also start Vim with the "-V" argument to see what happens during
+startup: >
+
+ vim -V
+
+Don't forget that the user manual assumes you Vim in a certain way. After
+installing Vim, follow the instructions at |not-compatible| to make Vim work
+as assumed in this manual.
+
+
+SELECTING FEATURES
+
+Vim has many ways to select features. One of the simple ways is to edit the
+Makefile. There are many directions and examples. Often you can enable or
+disable a feature by uncommenting a line.
+ An alternative is to run "configure" separately. This allows you to
+specify configuration options manually. The disadvantage is that you have to
+figure out what exactly to type.
+ Some of the most interesting configure arguments follow. These can also be
+enabled from the Makefile.
+
+ --prefix={directory} Top directory where to install Vim.
+
+ --with-features=tiny Compile with many features disabled.
+ --with-features=small Compile with some features disabled.
+ --with-features=big Compile with more features enabled.
+ --with-features=huge Compile with most features enabled.
+ See |+feature-list| for which feature
+ is enabled in which case.
+
+ --enable-perlinterp Enable the Perl interface. There are
+ similar arguments for ruby, python and
+ tcl.
+
+ --disable-gui Do not compile the GUI interface.
+ --without-x Do not compile X-windows features.
+ When both of these are used, Vim will
+ not connect to the X server, which
+ makes startup faster.
+
+To see the whole list use: >
+
+ ./configure --help
+
+You can find a bit of explanation for each feature, and links for more
+information here: |feature-list|.
+ For the adventurous, edit the file "feature.h". You can also change the
+source code yourself!
+
+==============================================================================
+*90.2* MS-Windows
+
+There are two ways to install the Vim program for Microsoft Windows. You can
+uncompress several archives, or use a self-installing big archive. Most users
+with fairly recent computers will prefer the second method. For the first
+one, you will need:
+
+ - An archive with binaries for Vim.
+ - The Vim runtime archive.
+ - A program to unpack the zip files.
+
+To get the Vim archives, look in this file for a mirror near you, this should
+provide the fastest download:
+
+ ftp://ftp.vim.org/pub/vim/MIRRORS ~
+
+Or use the home site ftp.vim.org, if you think it's fast enough. Go to the
+"pc" directory and you'll find a list of files there. The version number is
+embedded in the file name. You will want to get the most recent version.
+We will use "82" here, which is version 8.2.
+
+ gvim82.exe The self-installing archive.
+
+This is all you need for the second method. Just launch the executable, and
+follow the prompts.
+
+For the first method you must choose one of the binary archives. These are
+available:
+
+ gvim82.zip The normal MS-Windows GUI version.
+ gvim82ole.zip The MS-Windows GUI version with OLE support.
+ Uses more memory, supports interfacing with
+ other OLE applications.
+ vim82w32.zip 32 bit MS-Windows console version.
+
+You only need one of them. Although you could install both a GUI and a
+console version. You always need to get the archive with runtime files.
+
+ vim82rt.zip The runtime files.
+
+Use your un-zip program to unpack the files. For example, using the "unzip"
+program: >
+
+ cd c:\
+ unzip path\gvim82.zip
+ unzip path\vim82rt.zip
+
+This will unpack the files in the directory "c:\vim\vim82". If you already
+have a "vim" directory somewhere, you will want to move to the directory just
+above it.
+ Now change to the "vim\vim82" directory and run the install program: >
+
+ install
+
+Carefully look through the messages and select the options you want to use.
+If you finally select "do it" the install program will carry out the actions
+you selected.
+ The install program doesn't move the runtime files. They remain where you
+unpacked them.
+
+In case you are not satisfied with the features included in the supplied
+binaries, you could try compiling Vim yourself. Get the source archive from
+the same location as where the binaries are. You need a compiler for which a
+makefile exists. Microsoft Visual C, MinGW and Cygwin compilers can be used.
+Check the file src/INSTALLpc.txt for hints.
+
+==============================================================================
+*90.3* Upgrading
+
+If you are running one version of Vim and want to install another, here is
+what to do.
+
+
+UNIX
+
+When you type "make install" the runtime files will be copied to a directory
+which is specific for this version. Thus they will not overwrite a previous
+version. This makes it possible to use two or more versions next to
+each other.
+ The executable "vim" will overwrite an older version. If you don't care
+about keeping the old version, running "make install" will work fine. You can
+delete the old runtime files manually. Just delete the directory with the
+version number in it and all files below it. Example: >
+
+ rm -rf /usr/local/share/vim/vim74
+
+There are normally no changed files below this directory. If you did change
+the "filetype.vim" file, for example, you better merge the changes into the
+new version before deleting it.
+
+If you are careful and want to try out the new version for a while before
+switching to it, install the new version under another name. You need to
+specify a configure argument. For example: >
+
+ ./configure --with-vim-name=vim8
+
+Before running "make install", you could use "make -n install" to check that
+no valuable existing files are overwritten.
+ When you finally decide to switch to the new version, all you need to do is
+to rename the binary to "vim". For example: >
+
+ mv /usr/local/bin/vim8 /usr/local/bin/vim
+
+
+MS-WINDOWS
+
+Upgrading is mostly equal to installing a new version. Just unpack the files
+in the same place as the previous version. A new directory will be created,
+e.g., "vim82", for the files of the new version. Your runtime files, vimrc
+file, viminfo, etc. will be left alone.
+ If you want to run the new version next to the old one, you will have to do
+some handwork. Don't run the install program, it will overwrite a few files
+of the old version. Execute the new binaries by specifying the full path.
+The program should be able to automatically find the runtime files for the
+right version. However, this won't work if you set the $VIMRUNTIME variable
+somewhere.
+ If you are satisfied with the upgrade, you can delete the files of the
+previous version. See |90.5|.
+
+==============================================================================
+*90.4* Common installation issues
+
+This section describes some of the common problems that occur when installing
+Vim and suggests some solutions. It also contains answers to many
+installation questions.
+
+
+Q: I Do Not Have Root Privileges. How Do I Install Vim? (Unix)
+
+Use the following configuration command to install Vim in a directory called
+$HOME/vim: >
+
+ ./configure --prefix=$HOME
+
+This gives you a personal copy of Vim. You need to put $HOME/bin in your
+path to execute the editor. Also see |install-home|.
+
+
+Q: The Colors Are Not Right on My Screen. (Unix)
+
+Check your terminal settings by using the following command in a shell: >
+
+ echo $TERM
+
+If the terminal type listed is not correct, fix it. For more hints, see
+|06.2|. Another solution is to always use the GUI version of Vim, called
+gvim. This avoids the need for a correct terminal setup.
+
+
+Q: My Backspace And Delete Keys Don't Work Right
+
+The definition of what key sends what code is very unclear for backspace <BS>
+and Delete <Del> keys. First of all, check your $TERM setting. If there is
+nothing wrong with it, try this: >
+
+ :set t_kb=^V<BS>
+ :set t_kD=^V<Del>
+
+In the first line you need to press CTRL-V and then hit the backspace key.
+In the second line you need to press CTRL-V and then hit the Delete key.
+You can put these lines in your vimrc file, see |05.1|. A disadvantage is
+that it won't work when you use another terminal some day. Look here for
+alternate solutions: |:fixdel|.
+
+
+Q: I Am Using RedHat Linux. Can I Use the Vim That Comes with the System?
+
+By default RedHat installs a minimal version of Vim. Check your RPM packages
+for something named "Vim-enhanced-version.rpm" and install that.
+
+
+Q: How Do I Turn Syntax Coloring On? How do I make plugins work?
+
+Use the example vimrc script. You can find an explanation on how to use it
+here: |not-compatible|.
+
+See chapter 6 for information about syntax highlighting: |usr_06.txt|.
+
+
+Q: What Is a Good vimrc File to Use?
+
+See the www.vim.org Web site for several good examples.
+
+
+Q: Where Do I Find a Good Vim Plugin?
+
+See the Vim-online site: http://vim.sf.net. Many users have uploaded useful
+Vim scripts and plugins there.
+
+
+Q: Where Do I Find More Tips?
+
+See the Vim-online site: http://vim.sf.net. There is an archive with hints
+from Vim users. You might also want to search in the |maillist-archive|.
+
+==============================================================================
+*90.5* Uninstalling Vim
+
+In the unlikely event you want to uninstall Vim completely, this is how you do
+it.
+
+
+UNIX
+
+When you installed Vim as a package, check your package manager to find out
+how to remove the package again.
+ If you installed Vim from sources you can use this command: >
+
+ make uninstall
+
+However, if you have deleted the original files or you used an archive that
+someone supplied, you can't do this. Do delete the files manually, here is an
+example for when "/usr/local" was used as the root: >
+
+ rm -rf /usr/local/share/vim/vim82
+ rm /usr/local/bin/eview
+ rm /usr/local/bin/evim
+ rm /usr/local/bin/ex
+ rm /usr/local/bin/gview
+ rm /usr/local/bin/gvim
+ rm /usr/local/bin/gvim
+ rm /usr/local/bin/gvimdiff
+ rm /usr/local/bin/rgview
+ rm /usr/local/bin/rgvim
+ rm /usr/local/bin/rview
+ rm /usr/local/bin/rvim
+ rm /usr/local/bin/rvim
+ rm /usr/local/bin/view
+ rm /usr/local/bin/vim
+ rm /usr/local/bin/vimdiff
+ rm /usr/local/bin/vimtutor
+ rm /usr/local/bin/xxd
+ rm /usr/local/man/man1/eview.1
+ rm /usr/local/man/man1/evim.1
+ rm /usr/local/man/man1/ex.1
+ rm /usr/local/man/man1/gview.1
+ rm /usr/local/man/man1/gvim.1
+ rm /usr/local/man/man1/gvimdiff.1
+ rm /usr/local/man/man1/rgview.1
+ rm /usr/local/man/man1/rgvim.1
+ rm /usr/local/man/man1/rview.1
+ rm /usr/local/man/man1/rvim.1
+ rm /usr/local/man/man1/view.1
+ rm /usr/local/man/man1/vim.1
+ rm /usr/local/man/man1/vimdiff.1
+ rm /usr/local/man/man1/vimtutor.1
+ rm /usr/local/man/man1/xxd.1
+
+
+MS-WINDOWS
+
+If you installed Vim with the self-installing archive you can run
+the "uninstall-gui" program located in the same directory as the other Vim
+programs, e.g. "c:\vim\vim82". You can also launch it from the Start menu if
+installed the Vim entries there. This will remove most of the files, menu
+entries and desktop shortcuts. Some files may remain however, as they need a
+Windows restart before being deleted.
+ You will be given the option to remove the whole "vim" directory. It
+probably contains your vimrc file and other runtime files that you created, so
+be careful.
+
+Else, if you installed Vim with the zip archives, the preferred way is to use
+the "uninstall" program. You can find it in the same directory as the
+"install" program, e.g., "c:\vim\vim82". This should also work from the usual
+"install/remove software" page.
+ However, this only removes the registry entries for Vim. You have to
+delete the files yourself. Simply select the directory "vim\vim82" and delete
+it recursively. There should be no files there that you changed, but you
+might want to check that first.
+ The "vim" directory probably contains your vimrc file and other runtime
+files that you created. You might want to keep that.
+
+==============================================================================
+
+Table of contents: |usr_toc.txt|
+
+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
new file mode 100644
index 0000000..655d6a9
--- /dev/null
+++ b/runtime/doc/usr_toc.txt
@@ -0,0 +1,378 @@
+*usr_toc.txt* For Vim version 9.0. Last change: 2022 Jun 20
+
+ VIM USER MANUAL - by Bram Moolenaar
+
+ Table Of Contents *user-manual*
+
+==============================================================================
+Overview ~
+
+Getting Started ~
+|usr_01.txt| About the manuals
+|usr_02.txt| The first steps in Vim
+|usr_03.txt| Moving around
+|usr_04.txt| Making small changes
+|usr_05.txt| Set your settings
+|usr_06.txt| Using syntax highlighting
+|usr_07.txt| Editing more than one file
+|usr_08.txt| Splitting windows
+|usr_09.txt| Using the GUI
+|usr_10.txt| Making big changes
+|usr_11.txt| Recovering from a crash
+|usr_12.txt| Clever tricks
+
+Editing Effectively ~
+|usr_20.txt| Typing command-line commands quickly
+|usr_21.txt| Go away and come back
+|usr_22.txt| Finding the file to edit
+|usr_23.txt| Editing other files
+|usr_24.txt| Inserting quickly
+|usr_25.txt| Editing formatted text
+|usr_26.txt| Repeating
+|usr_27.txt| Search commands and patterns
+|usr_28.txt| Folding
+|usr_29.txt| Moving through programs
+|usr_30.txt| Editing programs
+|usr_31.txt| Exploiting the GUI
+|usr_32.txt| The undo tree
+
+Tuning Vim ~
+|usr_40.txt| Make new commands
+|usr_41.txt| Write a Vim script
+|usr_42.txt| Add new menus
+|usr_43.txt| Using filetypes
+|usr_44.txt| Your own syntax highlighted
+|usr_45.txt| Select your language (locale)
+
+Writing Vim script ~
+|usr_50.txt| Advanced Vim script writing
+|usr_51.txt| Write plugins
+|usr_52.txt| Write larger plugins
+
+Making Vim Run ~
+|usr_90.txt| Installing Vim
+
+
+Reference manual ~
+|reference_toc| More detailed information for all commands
+
+The user manual (an older version) is available as a single, ready to print
+HTML and PDF file here:
+ http://vimdoc.sf.net
+
+==============================================================================
+Getting Started ~
+
+Read this from start to end to learn the essential commands.
+
+|usr_01.txt| About the manuals
+ |01.1| Two manuals
+ |01.2| Vim installed
+ |01.3| Using the Vim tutor
+ |01.4| Copyright
+
+|usr_02.txt| The first steps in Vim
+ |02.1| Running Vim for the First Time
+ |02.2| Inserting text
+ |02.3| Moving around
+ |02.4| Deleting characters
+ |02.5| Undo and Redo
+ |02.6| Other editing commands
+ |02.7| Getting out
+ |02.8| Finding help
+
+|usr_03.txt| Moving around
+ |03.1| Word movement
+ |03.2| Moving to the start or end of a line
+ |03.3| Moving to a character
+ |03.4| Matching a paren
+ |03.5| Moving to a specific line
+ |03.6| Telling where you are
+ |03.7| Scrolling around
+ |03.8| Simple searches
+ |03.9| Simple search patterns
+ |03.10| Using marks
+
+|usr_04.txt| Making small changes
+ |04.1| Operators and motions
+ |04.2| Changing text
+ |04.3| Repeating a change
+ |04.4| Visual mode
+ |04.5| Moving text
+ |04.6| Copying text
+ |04.7| Using the clipboard
+ |04.8| Text objects
+ |04.9| Replace mode
+ |04.10| Conclusion
+
+|usr_05.txt| Set your settings
+ |05.1| The vimrc file
+ |05.2| The example vimrc file explained
+ |05.3| The defaults.vim file explained
+ |05.4| Simple mappings
+ |05.5| Adding a package
+ |05.6| Adding a plugin
+ |05.7| Adding a help file
+ |05.8| The option window
+ |05.9| Often used options
+
+|usr_06.txt| Using syntax highlighting
+ |06.1| Switching it on
+ |06.2| No or wrong colors?
+ |06.3| Different colors
+ |06.4| With colors or without colors
+ |06.5| Printing with colors
+ |06.6| Further reading
+
+|usr_07.txt| Editing more than one file
+ |07.1| Edit another file
+ |07.2| A list of files
+ |07.3| Jumping from file to file
+ |07.4| Backup files
+ |07.5| Copy text between files
+ |07.6| Viewing a file
+ |07.7| Changing the file name
+
+|usr_08.txt| Splitting windows
+ |08.1| Split a window
+ |08.2| Split a window on another file
+ |08.3| Window size
+ |08.4| Vertical splits
+ |08.5| Moving windows
+ |08.6| Commands for all windows
+ |08.7| Viewing differences with vimdiff
+ |08.8| Various
+
+|usr_09.txt| Using the GUI
+ |09.1| Parts of the GUI
+ |09.2| Using the mouse
+ |09.3| The clipboard
+ |09.4| Select mode
+
+|usr_10.txt| Making big changes
+ |10.1| Record and playback commands
+ |10.2| Substitution
+ |10.3| Command ranges
+ |10.4| The global command
+ |10.5| Visual block mode
+ |10.6| Reading and writing part of a file
+ |10.7| Formatting text
+ |10.8| Changing case
+ |10.9| Using an external program
+
+|usr_11.txt| Recovering from a crash
+ |11.1| Basic recovery
+ |11.2| Where is the swap file?
+ |11.3| Crashed or not?
+ |11.4| Further reading
+
+|usr_12.txt| Clever tricks
+ |12.1| Replace a word
+ |12.2| Change "Last, First" to "First Last"
+ |12.3| Sort a list
+ |12.4| Reverse line order
+ |12.5| Count words
+ |12.6| Find a man page
+ |12.7| Trim blanks
+ |12.8| Find where a word is used
+
+==============================================================================
+Editing Effectively ~
+
+Subjects that can be read independently.
+
+|usr_20.txt| Typing command-line commands quickly
+ |20.1| Command line editing
+ |20.2| Command line abbreviations
+ |20.3| Command line completion
+ |20.4| Command line history
+ |20.5| Command line window
+
+|usr_21.txt| Go away and come back
+ |21.1| Suspend and resume
+ |21.2| Executing shell commands
+ |21.3| Remembering information; viminfo
+ |21.4| Sessions
+ |21.5| Views
+ |21.6| Modelines
+
+|usr_22.txt| Finding the file to edit
+ |22.1| The file explorer
+ |22.2| The current directory
+ |22.3| Finding a file
+ |22.4| The buffer list
+
+|usr_23.txt| Editing other files
+ |23.1| DOS, Mac and Unix files
+ |23.2| Files on the internet
+ |23.3| Encryption
+ |23.4| Binary files
+ |23.5| Compressed files
+
+|usr_24.txt| Inserting quickly
+ |24.1| Making corrections
+ |24.2| Showing matches
+ |24.3| Completion
+ |24.4| Repeating an insert
+ |24.5| Copying from another line
+ |24.6| Inserting a register
+ |24.7| Abbreviations
+ |24.8| Entering special characters
+ |24.9| Digraphs
+ |24.10| Normal mode commands
+
+|usr_25.txt| Editing formatted text
+ |25.1| Breaking lines
+ |25.2| Aligning text
+ |25.3| Indents and tabs
+ |25.4| Dealing with long lines
+ |25.5| Editing tables
+
+|usr_26.txt| Repeating
+ |26.1| Repeating with Visual mode
+ |26.2| Add and subtract
+ |26.3| Making a change in many files
+ |26.4| Using Vim from a shell script
+
+|usr_27.txt| Search commands and patterns
+ |27.1| Ignoring case
+ |27.2| Wrapping around the file end
+ |27.3| Offsets
+ |27.4| Matching multiple times
+ |27.5| Alternatives
+ |27.6| Character ranges
+ |27.7| Character classes
+ |27.8| Matching a line break
+ |27.9| Examples
+
+|usr_28.txt| Folding
+ |28.1| What is folding?
+ |28.2| Manual folding
+ |28.3| Working with folds
+ |28.4| Saving and restoring folds
+ |28.5| Folding by indent
+ |28.6| Folding with markers
+ |28.7| Folding by syntax
+ |28.8| Folding by expression
+ |28.9| Folding unchanged lines
+ |28.10| Which fold method to use?
+
+|usr_29.txt| Moving through programs
+ |29.1| Using tags
+ |29.2| The preview window
+ |29.3| Moving through a program
+ |29.4| Finding global identifiers
+ |29.5| Finding local identifiers
+
+|usr_30.txt| Editing programs
+ |30.1| Compiling
+ |30.2| Indenting C files
+ |30.3| Automatic indenting
+ |30.4| Other indenting
+ |30.5| Tabs and spaces
+ |30.6| Formatting comments
+
+|usr_31.txt| Exploiting the GUI
+ |31.1| The file browser
+ |31.2| Confirmation
+ |31.3| Menu shortcuts
+ |31.4| Vim window position and size
+ |31.5| Various
+
+|usr_32.txt| The undo tree
+ |32.1| Undo up to a file write
+ |32.2| Numbering changes
+ |32.3| Jumping around the tree
+ |32.4| Time travelling
+
+==============================================================================
+Tuning Vim ~
+
+Make Vim work as you like it.
+
+|usr_40.txt| Make new commands
+ |40.1| Key mapping
+ |40.2| Defining command-line commands
+ |40.3| Autocommands
+
+|usr_41.txt| Write a Vim script
+ |41.1| Introduction
+ |41.2| Variables
+ |41.3| Expressions
+ |41.4| Conditionals
+ |41.5| Executing an expression
+ |41.6| Using functions
+ |41.7| Defining a function
+ |41.8| Lists and Dictionaries
+ |41.9| White space
+ |41.10| Line continuation
+ |41.11| Comments
+ |41.12| Fileformat
+
+|usr_42.txt| Add new menus
+ |42.1| Introduction
+ |42.2| Menu commands
+ |42.3| Various
+ |42.4| Toolbar and popup menus
+
+|usr_43.txt| Using filetypes
+ |43.1| Plugins for a filetype
+ |43.2| Adding a filetype
+
+|usr_44.txt| Your own syntax highlighted
+ |44.1| Basic syntax commands
+ |44.2| Keywords
+ |44.3| Matches
+ |44.4| Regions
+ |44.5| Nested items
+ |44.6| Following groups
+ |44.7| Other arguments
+ |44.8| Clusters
+ |44.9| Including another syntax file
+ |44.10| Synchronizing
+ |44.11| Installing a syntax file
+ |44.12| Portable syntax file layout
+
+|usr_45.txt| Select your language (locale)
+ |45.1| Language for Messages
+ |45.2| Language for Menus
+ |45.3| Using another encoding
+ |45.4| Editing files with a different encoding
+ |45.5| Entering language text
+
+==============================================================================
+Writing Vim script ~
+
+|usr_50.txt| Advanced Vim script writing
+ |50.1| Exceptions
+ |50.2| Function with variable number of arguments
+ |50.3| Restoring the view
+
+|usr_51.txt| Write plugins
+ |51.1| Writing a generic plugin
+ |51.2| Writing a filetype plugin
+ |51.3| Writing a compiler plugin
+ |51.4| Distributing Vim scripts
+
+|usr_52.txt| Write larger plugins
+ |52.1| Export and import
+ |52.2| Autoloading
+ |52.3| Autoloading without import/export
+ |52.4| Other mechanisms to use
+ |52.5| Using a Vim9 script from legacy script
+
+==============================================================================
+Making Vim Run ~
+
+Before you can use Vim.
+
+|usr_90.txt| Installing Vim
+ |90.1| Unix
+ |90.2| MS-Windows
+ |90.3| Upgrading
+ |90.4| Common installation issues
+ |90.5| Uninstalling Vim
+
+==============================================================================
+
+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
new file mode 100644
index 0000000..a11e166
--- /dev/null
+++ b/runtime/doc/various.txt
@@ -0,0 +1,799 @@
+*various.txt* For Vim version 9.0. Last change: 2022 Dec 13
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Various commands *various*
+
+1. Various commands |various-cmds|
+2. Using Vim like less or more |less|
+
+==============================================================================
+1. Various commands *various-cmds*
+
+ *CTRL-L*
+CTRL-L Clear and redraw the screen. The redraw may happen
+ later, after processing typeahead.
+
+ *:redr* *:redraw*
+:redr[aw][!] Redraw the screen right now. When ! is included it is
+ cleared first.
+ Useful to update the screen halfway executing a script
+ or function. Also when halfway a mapping and
+ 'lazyredraw' is set.
+
+ *:redraws* *:redrawstatus*
+:redraws[tatus][!] Redraw the status line of the current window. When !
+ is included all status lines are redrawn.
+ Useful to update the status line(s) when 'statusline'
+ includes an item that doesn't cause automatic
+ updating.
+ If the command line is being edited the redraw is
+ postponed until later.
+
+ *:redrawt* *:redrawtabline*
+:redrawt[abline] Redraw the tabline. Useful to update the tabline when
+ 'tabline' includes an item that doesn't trigger
+ automatic updating.
+
+ *N<Del>*
+<Del> When entering a number: Remove the last digit.
+ Note: if you like to use <BS> for this, add this
+ mapping to your .vimrc: >
+ :map CTRL-V <BS> CTRL-V <Del>
+< See |:fixdel| if your <Del> key does not do what you
+ want.
+
+:as[cii] or *ga* *:as* *:ascii*
+ga Print the ascii value of the character under the
+ 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:
+ <~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.
+
+ 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
+ character under the cursor, assuming it is in |UTF-8|
+ encoding. This also shows composing characters. The
+ value of 'maxcombine' doesn't matter.
+ Example of a character with two composing characters:
+ e0 b8 81 + e0 b8 b9 + e0 b9 89 ~
+
+ *8g8*
+8g8 Find an illegal UTF-8 byte sequence at or after the
+ cursor. This works in two situations:
+ 1. when 'encoding' is any 8-bit encoding
+ 2. when 'encoding' is "utf-8" and 'fileencoding' is
+ any 8-bit encoding
+ Thus it can be used when editing a file that was
+ supposed to be UTF-8 but was read as if it is an 8-bit
+ encoding because it contains illegal bytes.
+ Does not wrap around the end of the file.
+ Note that when the cursor is on an illegal byte or the
+ cursor is halfway a multibyte character the command
+ won't move the cursor.
+
+ *:p* *:pr* *:print* *E749*
+:[range]p[rint] [flags]
+ Print [range] lines (default current line).
+ Note: If you are looking for a way to print your text
+ 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
+ current line |cmdline-ranges|).
+ See |ex-flags| for [flags].
+
+ *:P* *:Print*
+:[range]P[rint] [count] [flags]
+ Just as ":print". Was apparently added to Vi for
+ people that keep the shift key pressed too long...
+ This command is not supported in |Vim9| script.
+ Note: A user command can overrule this command.
+ See |ex-flags| for [flags].
+
+ *:l* *:list*
+:[range]l[ist] [count] [flags]
+ Same as :print, but display unprintable characters
+ with '^' and put $ after the line. This can be
+ further changed with the 'listchars' option.
+ See |ex-flags| for [flags].
+
+ *:nu* *:number*
+:[range]nu[mber] [count] [flags]
+ Same as :print, but precede each line with its line
+ number. (See also 'highlight' and 'numberwidth'
+ option).
+ See |ex-flags| for [flags].
+
+ *:#*
+:[range]# [count] [flags]
+ synonym for :number.
+
+ *:#!*
+:#!{anything} Ignored, so that you can start a Vim script with: >
+ #!vim -S
+ echo "this is a Vim script"
+ quit
+<
+ *:z* *E144*
+:[range]z[+-^.=][count] Display several lines of text surrounding the line
+ specified with [range], or around the current line
+ if there is no [range].
+
+ If there is a [count], that's how many lines you'll
+ see; if there is no [count] and only one window then
+ twice the value of the 'scroll' option is used,
+ otherwise the current window height minus 3 is used.
+ This is the value of "scr" in the table below.
+
+ If there is a [count] the 'window' option is set to
+ its value.
+
+ :z can be used either alone or followed by any of
+ several marks. These have the following effect:
+
+ mark first line last line new cursor line ~
+ ---- ---------- --------- ------------
+ + current line 1 scr forward 1 scr forward
+ - 1 scr back current line current line
+ ^ 2 scr back 1 scr back 1 scr back
+ . 1/2 scr back 1/2 scr fwd 1/2 scr fwd
+ = 1/2 scr back 1/2 scr fwd current line
+
+ Specifying no mark at all is the same as "+".
+ If the mark is "=", a line of dashes is printed
+ around the current line.
+
+ *:z!*
+:[range]z![+-^.=][count]
+ Like ":z", but when [count] is not specified, it
+ defaults to the Vim window height minus one.
+
+:[range]z[!]#[+-^.=][count] *:z#*
+ Like ":z" or ":z!", but number the lines.
+
+ *:=*
+:= [flags] Print the last line number.
+ See |ex-flags| for [flags].
+
+:{range}= [flags] Prints the last line number in {range}. For example,
+ this prints the current line number: >
+ :.=
+< See |ex-flags| for [flags].
+
+:norm[al][!] {commands} *:norm* *:normal*
+ Execute Normal mode commands {commands}. This makes
+ it possible to execute Normal mode commands typed on
+ the command-line. {commands} are executed like they
+ are typed. For undo all commands are undone together.
+ Execution stops when an error is encountered.
+
+ If the [!] is given, mappings will not be used.
+ Without it, when this command is called from a
+ non-remappable mapping (|:noremap|), the argument can
+ be mapped anyway.
+
+ {commands} should be a complete command. If
+ {commands} does not finish a command, the last one
+ will be aborted as if <Esc> or <C-C> was typed.
+ This implies that an insert command must be completed
+ (to start Insert mode, see |:startinsert|). A ":"
+ command must be completed as well. And you can't use
+ "Q" or "gQ" to start Ex mode.
+
+ The display is not updated while ":normal" is busy.
+
+ {commands} cannot start with a space. Put a count of
+ 1 (one) before it, "1 " is one space.
+
+ The 'insertmode' option is ignored for {commands}.
+
+ This command cannot be followed by another command,
+ since any '|' is considered part of the command.
+
+ This command can be used recursively, but the depth is
+ limited by 'maxmapdepth'.
+
+ An alternative is to use |:execute|, which uses an
+ expression as argument. This allows the use of
+ printable characters to represent special characters.
+
+ Example: >
+ :exe "normal \<c-w>\<c-w>"
+
+:{range}norm[al][!] {commands} *:normal-range*
+ Execute Normal mode commands {commands} for each line
+ in the {range}. Before executing the {commands}, the
+ cursor is positioned in the first column of the range,
+ for each line. Otherwise it's the same as the
+ ":normal" command without a range.
+
+ *:sh* *:shell* *E371*
+:sh[ell] This command starts a shell. When the shell exits
+ (after the "exit" command) you return to Vim. The
+ name for the shell command comes from 'shell' option.
+ *E360*
+ Note: This doesn't work when Vim on the Amiga was
+ started in QuickFix mode from a compiler, because the
+ compiler will have set stdin to a non-interactive
+ mode.
+
+ *:!cmd* *:!*
+:!{cmd} Execute {cmd} with the shell. See also the 'shell'
+ and 'shelltype' option.
+ *E34*
+ Any '!' in {cmd} is replaced with the previous
+ external command (see also 'cpoptions'). But not when
+ there is a backslash before the '!', then that
+ backslash is removed. Example: ":!ls" followed by
+ ":!echo ! \! \\!" executes "echo ls ! \!".
+
+ A '|' in {cmd} is passed to the shell, you cannot use
+ it to append a Vim command. See |:bar|.
+
+ If {cmd} contains "%" it is expanded to the current
+ file name, "#" is expanded to the alternate file name.
+ Special characters in the file name are not escaped,
+ use quotes to avoid their special meaning: >
+ :!ls "%"
+< If the file name contains a "$" then single quotes
+ might work better, but this only works if the file
+ name does not contain a single quote: >
+ :!ls '%'
+< This should always work, but it's more typing: >
+ :exe "!ls " .. shellescape(expand("%"))
+< To get a literal "%" or "#" prepend it with a
+ backslash. For example, to list all files starting
+ with "%": >
+ :!ls \%*
+<
+ A newline character ends {cmd}, what follows is
+ interpreted as a following ":" command. However, if
+ there is a backslash before the newline it is removed
+ and {cmd} continues. It doesn't matter how many
+ 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|.
+
+ After the command has been executed, the timestamp and
+ size of the current file is checked |timestamp|.
+
+ 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.
+ To avoid this use: >
+ :silent !{cmd}
+< The screen is not redrawn then, thus you have to use
+ CTRL-L or ":redraw!" if the command did display
+ something. However, this depends on what the |t_ti|
+ and |t_te| termcap entries are set to.
+ Also see |shell-window|.
+
+ *:!!*
+:!! Repeat last ":!{cmd}".
+
+ *:ve* *:ver* *:version*
+:ve[rsion] Print the version number of the editor. If the
+ compiler used understands "__DATE__" the compilation
+ date is mentioned. Otherwise a fixed release-date is
+ shown.
+ The following lines contain information about which
+ features were enabled when Vim was compiled. When
+ there is a preceding '+', the feature is included,
+ when there is a '-' it is excluded. To change this,
+ you have to edit feature.h and recompile Vim.
+ To check for this in an expression, see |has()|.
+ Here is an overview of the features.
+ The first column shows the smallest version in which
+ they are included:
+ T tiny (always)
+ S small
+ N normal
+ B big
+ H huge
+ m manually enabled or depends on other features
+ - never, feature was removed
+ (none) system dependent
+ Thus if a feature is marked with "N", it is included
+ in the normal, big and huge versions of Vim.
+
+ *+feature-list*
+ *+acl* |ACL| support included
+ *+ARP* Amiga only: ARP support included
+H *+arabic* |Arabic| language support
+N *+autochdir* support 'autochdir' option
+T *+autocmd* |:autocmd|, automatic commands. Always enabled since
+ 8.0.1564
+H *+autoservername* Automatically enable |clientserver|
+m *+balloon_eval* |balloon-eval| support in the GUI. Included when
+ compiling with supported GUI (Motif, GTK, GUI) and
+ either Netbeans/Sun Workshop integration or |+eval|
+ feature.
+H *+balloon_eval_term* |balloon-eval| support in the terminal,
+ 'balloonevalterm'
+N *+browse* |:browse| command
+T *++builtin_terms* maximal terminals builtin |builtin-terms| Always
+ enabled since 9.0.0280
+N *+byte_offset* support for 'o' flag in 'statusline' option, "go"
+ and ":goto" commands.
+m *+channel* inter process communication |channel|
+T *+cindent* |'cindent'|, C indenting; Always enabled
+N *+clientserver* Unix and Win32: Remote invocation |clientserver|
+ *+clipboard* |clipboard| support compiled-in
+ *+clipboard_working* |clipboard| support compiled-in and working
+T *+cmdline_compl* command line completion |cmdline-completion|
+T *+cmdline_hist* command line history |cmdline-history|
+T *+cmdline_info* |'showcmd'| and |'ruler'|; Always enabled since
+ 9.0.0747
+T *+cmdwin* |cmdline-window| support; Always enabled since 9.0.0657
+T *+comments* |'comments'| support
+N *+conceal* "conceal" support, see |conceal| |:syn-conceal| etc.
+N *+cryptv* encryption support |encryption|
+H *+cscope* |cscope| support
+T *+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.
+N *+dialog_con_gui* Support for |:confirm| with GUI and console dialog.
+N *+diff* |vimdiff| and 'diff'
+N *+digraphs* |digraphs| *E196*
+ *+directx* Win32 GUI only: DirectX and |'renderoptions'|
+ *+dnd* Support for DnD into the "~ register |quote_~|.
+H *+emacs_tags* |emacs-tags| files
+N *+eval* expression evaluation |eval.txt|
+T *+ex_extra* always on now, used to be for Vim's extra Ex commands
+N *+extra_search* |'hlsearch'| and |'incsearch'| options.
+- *+farsi* Removed: |farsi| language
+T *+file_in_path* |gf|, |CTRL-W_f| and |<cfile>| Always enabled since
+ 9.0.265
+N *+find_in_path* include file searches: |[I|, |:isearch|,
+ |CTRL-W_CTRL-I|, |:checkpath|, etc.
+N *+folding* |folding|
+ *+footer* |gui-footer|
+ *+fork* Unix only: |fork| shell commands
+T *+float* Floating point support Always enabled since 9.0.0491
+N *+gettext* message translations |multi-lang|
+- *+GUI_Athena* Unix only: Athena |GUI|
+ *+GUI_neXtaw* Unix only: neXtaw |GUI|
+ *+GUI_GTK* Unix only: GTK+ |GUI|
+ *+GUI_Motif* Unix only: Motif |GUI|
+ *+GUI_Photon* QNX only: Photon |GUI|
+m *+hangul_input* Hangul input support |hangul|
+ *+iconv* Compiled with the |iconv()| function
+ *+iconv/dyn* Likewise |iconv-dynamic| |/dyn|
+T *+insert_expand* |insert_expand| Insert mode completion
+m *+ipv6* Support for IPv6 networking |channel|
+m *+job* starting and stopping jobs |job|
+T *+jumplist* |jumplist|; Always enabled since 8.2.3795
+H *+keymap* |'keymap'|
+N *+lambda* |lambda| and |closure|
+H *+langmap* |'langmap'|
+N *+libcall* |libcall()|
+N *+linebreak* |'linebreak'|, |'breakat'| and |'showbreak'|
+T *+lispindent* |'lisp'|
+T *+listcmds* Vim commands for the list of buffers |buffer-hidden|
+ and argument list |:argdelete|
+T *+localmap* Support for mappings local to a buffer |:map-local|
+m *+lua* |Lua| interface
+m *+lua/dyn* |Lua| interface |/dyn|
+N *+menu* |:menu|
+N *+mksession* |:mksession|
+T *+modify_fname* |filename-modifiers|
+T *+mouse* Mouse handling |mouse-using|
+N *+mouseshape* |'mouseshape'|
+N *+mouse_dec* Unix only: Dec terminal mouse handling |dec-mouse|
+N *+mouse_gpm* Unix only: Linux console mouse handling |gpm-mouse|
+m *+mouse_gpm/dyn* Same as |+mouse_gpm| with optional library dependency
+ |/dyn|
+N *+mouse_jsbterm* JSB mouse handling |jsbterm-mouse|
+N *+mouse_netterm* Unix only: netterm mouse handling |netterm-mouse|
+N *+mouse_pterm* QNX only: pterm mouse handling |qnx-terminal|
+N *+mouse_sysmouse* Unix only: *BSD console mouse handling |sysmouse|
+N *+mouse_sgr* Unix only: sgr mouse handling |sgr-mouse|
+N *+mouse_urxvt* Unix only: urxvt mouse handling |urxvt-mouse|
+N *+mouse_xterm* Unix only: xterm mouse handling |xterm-mouse|
+T *+multi_byte* Unicode support, 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|
+m *+mzscheme* Mzscheme interface |mzscheme|
+m *+mzscheme/dyn* Mzscheme interface |mzscheme-dynamic| |/dyn|
+m *+netbeans_intg* |netbeans|
+T *+num64* 64-bit Number support |Number|
+ Always enabled since 8.2.0271, use v:numbersize to
+ check the actual size of a Number.
+m *+ole* Win32 GUI only: |ole-interface|
+N *+packages* Loading |packages|
+T *+path_extra* Up/downwards search in 'path' and 'tags' Always
+ enabled since 9.0.0270
+m *+perl* Perl interface |perl|
+m *+perl/dyn* Perl interface |perl-dynamic| |/dyn|
+N *+persistent_undo* Persistent undo |undo-persistence|
+N *+popupwin* Popup windows |popup-window|
+ *+postscript* |:hardcopy| writes a PostScript file
+N *+printer* |:hardcopy| command
+H *+profile* |:profile| command
+m *+python* Python 2 interface |python|
+m *+python/dyn* Python 2 interface |python-dynamic| |/dyn|
+m *+python3* Python 3 interface |python|
+m *+python3/dyn* Python 3 interface |python-dynamic| |/dyn|
+N *+quickfix* |:make| and |quickfix| commands
+N *+reltime* |reltime()| function, 'hlsearch'/'incsearch' timeout,
+ 'redrawtime' option
+H *+rightleft* Right to left typing |'rightleft'|
+m *+ruby* Ruby interface |ruby|
+m *+ruby/dyn* Ruby interface |ruby-dynamic| |/dyn|
+T *+scrollbind* |'scrollbind'|
+N *+signs* |:sign|
+T *+smartindent* |'smartindent'|
+H *+sodium* compiled with libsodium for better encryption support
+H *+sound* |sound_playevent()|, |sound_playfile()| functions, etc.
+N *+spell* spell checking support, see |spell|
+N *+startuptime* |--startuptime| argument
+N *+statusline* Options 'statusline', 'rulerformat' and special
+ formats of 'titlestring' and 'iconstring'
+- *+sun_workshop* Removed: |workshop|
+N *+syntax* Syntax highlighting |syntax|
+ *+system()* Unix only: opposite of |+fork|
+T *+tag_binary* binary searching in tags file |tag-binary-search|
+- *+tag_old_static* Removed; method for static tags |tag-old-static|
+- *+tag_any_white* Removed; was to allow any white space in tags files
+m *+tcl* Tcl interface |tcl|
+m *+tcl/dyn* Tcl interface |tcl-dynamic| |/dyn|
+m *+terminal* Support for terminal window |terminal|
+ *+terminfo* uses |terminfo| instead of termcap
+N *+termresponse* support for |t_RV| and |v:termresponse|
+N *+termguicolors* 24-bit color in xterm-compatible terminals support
+T *+textobjects* |text-objects| selection. Always enabled since 9.0.0222.
+N *+textprop* |text-properties|
+ *+tgetent* non-Unix only: able to use external termcap
+N *+timers* the |timer_start()| function
+T *+title* Setting the window 'title' and 'icon'; Always enabled
+N *+toolbar* |gui-toolbar|
+T *+user_commands* User-defined commands. |user-commands|
+ Always enabled since 8.1.1210.
+H *+vartabs* Variable-width tabstops. |'vartabstop'|
+T *+vertsplit* Vertically split windows |:vsplit|; Always enabled
+ since 8.0.1118.
+T *+vim9script* |Vim9| script
+N *+viminfo* |'viminfo'|
+T *+virtualedit* |'virtualedit'| Always enabled since 8.1.826.
+T *+visual* Visual mode |Visual-mode| Always enabled since 7.4.200.
+T *+visualextra* extra Visual mode commands |blockwise-operators|
+T *+vreplace* |gR| and |gr|
+ *+vtp* on MS-Windows console: support for 'termguicolors'
+T *+wildignore* |'wildignore'| Always enabled since 9.0.0278
+T *+wildmenu* |'wildmenu'| Always enabled since 9.0.0279
+T *+windows* more than one window; Always enabled since 8.0.1118.
+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|
+ *+xsmp* XSMP (X session management) support
+ *+xsmp_interact* interactive XSMP (X session management) support
+N *+xterm_clipboard* Unix only: xterm clipboard handling
+m *+xterm_save* save and restore xterm screen |xterm-screens|
+N *+X11* Unix only: can restore window title |X11|
+
+ */dyn* *E370* *E448*
+ To some of the features "/dyn" is added when the
+ feature is only available when the related library can
+ be dynamically loaded.
+
+:ve[rsion] {nr} Is now ignored. This was previously used to check the
+ version number of a .vimrc file. It was removed,
+ because you can now use the ":if" command for
+ version-dependent behavior.
+
+ *:redi* *:redir*
+:redi[r][!] > {file} Redirect messages to file {file}. The messages which
+ are the output of commands are written to that file,
+ until redirection ends. The messages are also still
+ 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. 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()".
+ An alternative is to use the 'verbosefile' option,
+ this can be used in combination with ":redir".
+
+:redi[r] >> {file} Redirect messages to file {file}. Append if {file}
+ already exists.
+
+:redi[r] @{a-zA-Z}
+:redi[r] @{a-zA-Z}> Redirect messages to register {a-z}. Append to the
+ contents of the register if its name is given
+ uppercase {A-Z}. The ">" after the register name is
+ optional.
+:redi[r] @{a-z}>> Append messages to register {a-z}.
+
+:redi[r] @*>
+:redi[r] @+> Redirect messages to the selection or clipboard. For
+ backward compatibility, the ">" after the register
+ name can be omitted. See |quotestar| and |quoteplus|.
+:redi[r] @*>>
+:redi[r] @+>> Append messages to the selection or clipboard.
+
+:redi[r] @"> Redirect messages to the unnamed register. For
+ backward compatibility, the ">" after the register
+ name can be omitted.
+:redi[r] @">> Append messages to the unnamed register.
+ *E1092*
+:redi[r] => {var} Redirect messages to a variable.
+ In legacy script: If the variable doesn't exist, then
+ it is created. If the variable exists, then it is
+ initialized to an empty string. After the redirection
+ starts, if the variable is removed or locked or the
+ variable type is changed, then further command output
+ messages will cause errors. When using a local
+ variable (l:var in a function or s:var in a script)
+ and another `:redir` causes the current one to end,
+ the scope might be different and the assignment fails.
+ In Vim9 script: the variable must have been declared
+ as a string.
+ The variable will remain empty until redirection ends.
+ Only string variables can be used.
+ To get the output of one command the |execute()|
+ function can be used instead of redirection.
+
+:redi[r] =>> {var} Append messages to an existing variable. Only string
+ variables can be used.
+ *E1185*
+:redi[r] END End redirecting messages.
+
+ *:filt* *:filter*
+:filt[er][!] {pattern} {command}
+:filt[er][!] /{pattern}/ {command}
+ Restrict the output of {command} to lines matching
+ with {pattern}. 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 {pattern}.
+
+ {pattern} 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 {pattern}.
+ Without the enclosing character the pattern cannot
+ include the bar character. 'ignorecase' is not used.
+
+ 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. Some of the commands that support filtering:
+ |:#| - filter whole line
+ |:clist| - filter by file name or module name
+ |:command| - filter by command name
+ |:files| - filter by file name
+ |:highlight| - filter by highlight group
+ |:jumps| - filter by file name
+ |:let| - filter by variable name
+ |:list| - filter whole line
+ |:llist| - filter by file name or module name
+ |:marks| - filter by text in the current file,
+ or file name for other files
+ |:oldfiles| - filter by file name
+ |:registers| - filter by register contents
+ (does not work multi-line)
+ |:set| - filter by option name
+
+ 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.
+ When [!] is added, error messages will also be
+ skipped, and commands and mappings will not be aborted
+ when an error is detected. |v:errmsg| is still set.
+ When [!] is not used, an error message will cause
+ further messages to be displayed normally.
+ Redirection, started with |:redir|, will continue as
+ usual, although there might be small differences.
+ This will allow redirecting the output of a command
+ without seeing it on the screen. Example: >
+ :redir >/tmp/foobar
+ :silent g/Aap/p
+ :redir END
+< To execute a Normal mode command silently, use the
+ |:normal| command. For example, to search for a
+ string without messages: >
+ :silent exe "normal /path\<CR>"
+< ":silent!" is useful to execute a command that may
+ fail, but the failure is to be ignored. Example: >
+ :let v:errmsg = ""
+ :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".
+
+ *:uns* *:unsilent*
+:uns[ilent] {command} Execute {command} not silently. Only makes a
+ difference when |:silent| was used to get to this
+ command.
+ Use this for giving a message even when |:silent| was
+ used. In this example |:silent| is used to avoid the
+ message about reading the file and |:unsilent| to be
+ able to list the first line of each file. >
+ :silent argdo unsilent echo expand('%') .. ": " .. getline(1)
+<
+
+ *:verb* *:verbose*
+:[count]verb[ose] {command}
+ Execute {command} with 'verbose' set to [count]. If
+ [count] is omitted one is used. ":0verbose" can be
+ used to set 'verbose' to zero.
+ The additional use of ":silent" makes messages
+ generated but not displayed.
+ The combination of ":silent" and ":verbose" can be
+ used to generate messages and check them with
+ |v:statusmsg| and friends. For example: >
+ :let v:statusmsg = ""
+ :silent verbose runtime foobar.vim
+ :if v:statusmsg != ""
+ : " foobar.vim could not be found
+ :endif
+< When concatenating another command, the ":verbose"
+ only applies to the first one: >
+ :4verbose set verbose | set verbose
+< verbose=4 ~
+ verbose=0 ~
+ For logging verbose messages in a file use the
+ 'verbosefile' option.
+
+ *:verbose-cmd*
+When 'verbose' is non-zero, listing the value of a Vim option or a key map or
+an abbreviation or a user-defined function or a command or a highlight group
+or an autocommand will also display where it was last defined. If it was
+defined manually then there will be no "Last set" message. When it was
+defined while executing a function, user command or autocommand, the script in
+which it was defined is reported.
+{not available when compiled without the |+eval| feature}
+
+ *K*
+K Run a program to lookup the keyword under the
+ cursor. The name of the program is given with the
+ 'keywordprg' (kp) option (default is "man"). The
+ keyword is formed of letters, numbers and the
+ characters in 'iskeyword'. The keyword under or
+ right of the cursor is used. The same can be done
+ with the command >
+ :!{program} {keyword}
+< There is an example of a program to use in the tools
+ directory of Vim. It is called "ref" and does a
+ simple spelling check.
+ Special cases:
+ - If 'keywordprg' begins with ":" it is invoked as
+ a Vim Ex command with [count].
+ - If 'keywordprg' is empty, the ":help" command is
+ used. It's a good idea to include more characters
+ in 'iskeyword' then, to be able to find more help.
+ - When 'keywordprg' is equal to "man" or starts with
+ ":", a [count] before "K" is inserted after
+ keywordprg and before the keyword. For example,
+ using "2K" while the cursor is on "mkdir", results
+ in: >
+ !man 2 mkdir
+< - When 'keywordprg' is equal to "man -s", a count
+ before "K" is inserted after the "-s". If there is
+ no count, the "-s" is removed.
+
+ *v_K*
+{Visual}K Like "K", but use the visually highlighted text for
+ the keyword. Only works when the highlighted text is
+ not more than one line.
+
+[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
+ uses seconds. The default is one second. >
+ :sleep "sleep for one second
+ :5sleep "sleep for five seconds
+ :sleep 100m "sleep for 100 milliseconds
+ 10gs "sleep for ten seconds
+< Can be interrupted with CTRL-C (CTRL-Break on
+ MS-Windows). "gs" stands for "goto sleep".
+ While sleeping the cursor is positioned in the text,
+ if at a visible position.
+ Also process the received netbeans messages. {only
+ available when compiled with the |+netbeans_intg|
+ feature}
+
+ *:sl!* *:sleep!*
+:[N]sl[eep]! [N][m] Same as above, but hide the cursor.
+
+ *:xrestore* *:xr*
+:xr[estore] [display] Reinitializes the connection to the X11 server. Useful
+ after the X server restarts, e.g. when running Vim for
+ long time inside screen/tmux and connecting from
+ different machines.
+ [display] should be in the format of the $DISPLAY
+ environment variable (e.g. "localhost:10.0")
+ If [display] is omitted, then it reinitializes the
+ connection to the X11 server using the same value as
+ was used for the previous execution of this command.
+ If the value was never specified, then it uses the
+ value of $DISPLAY environment variable as it was when
+ Vim was started.
+ {only available when compiled with the |+clipboard|
+ feature}
+
+ *g_CTRL-A*
+g CTRL-A Only when Vim was compiled with MEM_PROFILING defined
+ (which is very rare): print memory usage statistics.
+ Only useful for debugging Vim.
+ For incrementing in Visual mode see |v_g_CTRL-A|.
+
+==============================================================================
+2. Using Vim like less or more *less*
+
+If you use the less or more program to view a file, you don't get syntax
+highlighting. Thus you would like to use Vim instead. You can do this by
+using the shell script "$VIMRUNTIME/macros/less.sh".
+
+This shell script uses the Vim script "$VIMRUNTIME/macros/less.vim". It sets
+up mappings to simulate the commands that less supports. Otherwise, you can
+still use the Vim commands.
+
+This isn't perfect. For example, when viewing a short file Vim will still use
+the whole screen. But it works well enough for most uses, and you get syntax
+highlighting.
+
+The "h" key will give you a short overview of the available commands.
+
+If you want to set options differently when using less, define the
+LessInitFunc in your vimrc, for example: >
+
+ func LessInitFunc()
+ set nocursorcolumn nocursorline
+ endfunc
+<
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/version4.txt b/runtime/doc/version4.txt
new file mode 100644
index 0000000..052cbbd
--- /dev/null
+++ b/runtime/doc/version4.txt
@@ -0,0 +1,355 @@
+*version4.txt* For Vim version 9.0. Last change: 2006 Apr 24
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+This document lists the incompatible differences between Vim 3.0 and Vim 4.0.
+Although 4.0 is mentioned here, this is also for version 4.1, 4.2, etc..
+
+This file is important for everybody upgrading from Vim 3.0. Read it
+carefully to avoid unexpected problems.
+
+'backup' option default changed |backup-changed|
+Extension for backup file changed |backup-extension|
+Structure of swap file changed |swapfile-changed|
+"-w scriptout" argument changed |scriptout-changed|
+Backspace and Delete keys |backspace-delete|
+Escape for | changed |escape-bar|
+Key codes changed |key-codes-changed|
+Terminal options changed |termcap-changed|
+'errorformat' option changed |errorformat-changed|
+'graphic' option gone |graphic-option-gone|
+'yankendofline' option gone |ye-option-gone|
+'icon' and 'title' default value changed |icon-changed|
+'highlight' option changed |highlight-changed|
+'tildeop' and 'weirdinvert' short names changed |short-name-changed|
+Use of "v", "V" and "CTRL-V" in Visual mode |use-visual-cmds|
+CTRL-B in Insert mode removed |toggle-revins|
+
+
+'backup' option default changed *backup-changed*
+-------------------------------
+
+The default value for 'backup' used to be on. This resulted in a backup file
+being made when the original file was overwritten.
+
+Now the default for 'backup' is off. As soon as the writing of the file has
+successfully finished, the backup file is deleted. If you want to keep the
+backup file, set 'backup' on in your vimrc. The reason for this change is
+that many people complained that leaving a backup file behind is not
+Vi-compatible. |'backup'|
+
+
+Extension for backup file changed *backup-extension*
+---------------------------------
+
+The extension for the backup file used to be ".bak". Since other programs
+also use this extension and some users make copies with this extension, it was
+changed to the less obvious "~". Another advantage is that this takes less
+space, which is useful when working on a system with short file names. For
+example, on MS-DOS the backup files for "longfile.c" and "longfile.h" would
+both become "longfile.bak"; now they will be "longfile.c~" and "longfile.h~".
+
+If you prefer to use ".bak", you can set the 'backupext' option: >
+ :set bex=.bak
+
+
+Structure of swap file changed *swapfile-changed*
+------------------------------
+
+The contents of the swap file were extended with several parameters. Vim
+stores the user name and other information about the edited file to make
+recovery more easy and to be able to know where the swap file comes from. The
+first part of the swap file can now be understood on a machine with a
+different byte order or sizeof(int). When you try to recover a file on such a
+machine, you will get an error message that this is not possible.
+
+Because of this change, swap files cannot be exchanged between 3.0 and 4.0.
+If you have a swap file from a crashed session with 3.0, use Vim 3.0 to
+recover the file---don't use 4.0. |swap-file|
+
+
+"-w scriptout" argument changed *scriptout-changed*
+-------------------------------
+
+"vim -w scriptout" used to append to the scriptout file. Since this was
+illogical, it now creates a new file. An existing file is not overwritten
+(to avoid destroying an existing file for those who rely on the appending).
+[This was removed again later] |-w|
+
+
+Backspace and Delete keys *backspace-delete*
+-------------------------
+
+In 3.0 both the delete key and the backspace key worked as a backspace in
+insert mode; they deleted the character to the left of the cursor. In 4.0 the
+delete key has a new function: it deletes the character under the cursor, just
+like it does on the command-line. If the cursor is after the end of the line
+and 'bs' is set, two lines are joined. |<Del>| |i_<Del>|
+
+In 3.0 the backspace key was always defined as CTRL-H and delete as CTRL-?.
+In 4.0 the code for the backspace and delete key is obtained from termcap or
+termlib, and adjusted for the "stty erase" value on Unix. This helps people
+who define the erase character according to the keyboard they are working on.
+ |<BS>| |i_<BS>|
+
+If you prefer backspace and delete in Insert mode to have the old behavior,
+put this line in your vimrc:
+
+ inoremap ^? ^H
+
+And you may also want to add these, to fix the values for <BS> and <Del>:
+
+ set t_kb=^H
+ set t_kD=^?
+
+(Enter ^H with CTRL-V CTRL-H and ^? with CTRL-V CTRL-? or <Del>.)
+
+If the value for t_kb is correct, but the t_kD value is not, use the ":fixdel"
+command. It will set t_kD according to the value of t_kb. This is useful if
+you are using several different terminals. |:fixdel|
+
+When ^H is not recognized as <BS> or <Del>, it is used like a backspace.
+
+
+Escape for | changed *escape-bar*
+--------------------
+
+When the 'b' flag is present in 'cpoptions', the backslash cannot be used to
+escape '|' in mapping and abbreviate commands, only CTRL-V can. This is
+Vi-compatible. If you work in Vi-compatible mode and had used "\|" to include
+a bar in a mapping, this needs to be replaced by "^V|". See |:bar|.
+
+
+Key codes changed *key-codes-changed*
+-----------------
+
+The internal representation of key codes has changed dramatically. In 3.0 a
+one-byte code was used to represent a key. This caused problems with
+different characters sets that also used these codes. In 4.0 a three-byte
+code is used that cannot be confused with a character. |key-notation|
+
+If you have used the single-byte key codes in your vimrc for mappings, you
+will have to replace them with the 4.0 codes. Instead of using the three-byte
+code directly, you should use the symbolic representation for this in <>. See
+the table below. The table also lists the old name, as it was used in the 3.0
+documentation.
+
+The key names in <> can be used in mappings directly. This makes it possible
+to copy/paste examples or type them literally. The <> notation has been
+introduced for this |<>|. The 'B' and '<' flags must not be present in
+'cpoptions' to enable this to work |'cpoptions'|.
+
+old name new name old code old MS-DOS code ~
+ hex dec hex dec ~
+<ESC> <Esc>
+<TAB> <Tab>
+<LF> <NL> <NewLine> <LineFeed>
+<SPACE> <Space>
+<NUL> <Nul>
+<BELL> <Bell>
+<BS> <BS> <BackSpace>
+<INSERT> <Insert>
+<DEL> <Del> <Delete>
+<HOME> <Home>
+<END> <End>
+<PAGE_UP> <PageUp>
+<PAGE_DOWN> <PageDown>
+
+<C_UP> <Up> 0x80 128 0xb0 176
+<C_DOWN> <Down> 0x81 129 0xb1 177
+<C_LEFT> <Left> 0x82 130 0xb2 178
+<C_RIGHT> <Right> 0x83 131 0xb3 179
+<SC_UP> <S-Up> 0x84 132 0xb4 180
+<SC_DOWN> <S-Down> 0x85 133 0xb5 181
+<SC_LEFT> <S-Left> 0x86 134 0xb6 182
+<SC_RIGHT> <S-Right> 0x87 135 0xb7 183
+
+<F1> <F1> 0x88 136 0xb8 184
+<F2> <F2> 0x89 137 0xb9 185
+<F3> <F3> 0x8a 138 0xba 186
+<F4> <F4> 0x8b 139 0xbb 187
+<F5> <F5> 0x8c 140 0xbc 188
+<F6> <F6> 0x8d 141 0xbd 189
+<F7> <F7> 0x8e 142 0xbe 190
+<F8> <F8> 0x8f 143 0xbf 191
+<F9> <F9> 0x90 144 0xc0 192
+<F10> <F10> 0x91 145 0xc1 193
+
+<SF1> <S-F1> 0x92 146 0xc2 194
+<SF2> <S-F2> 0x93 147 0xc3 195
+<SF3> <S-F3> 0x94 148 0xc4 196
+<SF4> <S-F4> 0x95 149 0xc5 197
+<SF5> <S-F5> 0x96 150 0xc6 198
+<SF6> <S-F6> 0x97 151 0xc7 199
+<SF7> <S-F7> 0x98 152 0xc8 200
+<SF8> <S-F8> 0x99 153 0xc9 201
+<SF9> <S-F9> 0x9a 154 0xca 202
+<SF10> <S-F10> 0x9b 155 0xcb 203
+
+<HELP> <Help> 0x9c 156 0xcc 204
+<UNDO> <Undo> 0x9d 157 0xcd 205
+
+ (not used) 0x9e 158 0xce 206
+ (not used) 0x9f 159 0xcf 207
+
+
+Terminal options changed *termcap-changed*
+------------------------
+
+The names of the terminal options have been changed to match the termcap names
+of these options. All terminal options now have the name t_xx, where xx is
+the termcap name. Normally these options are not used, unless you have a
+termcap entry that is wrong or incomplete, or you have set the highlight
+options to a different value. |terminal-options|
+
+Note that for some keys there is no termcap name. Use the <> type of name
+instead, which is a good idea anyway.
+
+Note that "t_ti" has become "t_mr" (invert/reverse output) and "t_ts" has
+become "t_ti" (init terminal mode). Be careful when you use "t_ti"!
+
+old name new name meaning ~
+t_cdl t_DL delete number of lines *t_cdl*
+t_ci t_vi cursor invisible *t_ci*
+t_cil t_AL insert number of lines *t_cil*
+t_cm t_cm move cursor
+t_cri t_RI cursor number of chars right *t_cri*
+t_cv t_ve cursor visible *t_cv*
+t_cvv t_vs cursor very visible *t_cvv*
+t_dl t_dl delete line
+t_cs t_cs scroll region
+t_ed t_cl clear display *t_ed*
+t_el t_ce clear line *t_el*
+t_il t_al insert line *t_il*
+ t_da display may be retained above the screen
+ t_db display may be retained below the screen
+t_ke t_ke put terminal out of keypad transmit mode
+t_ks t_ks put terminal in keypad transmit mode
+t_ms t_ms save to move cursor in highlight mode
+t_se t_se normal mode (undo t_so)
+t_so t_so shift out (standout) mode
+t_ti t_mr reverse highlight
+t_tb t_md bold mode *t_tb*
+t_tp t_me highlight end *t_tp*
+t_sr t_sr scroll reverse
+t_te t_te out of termcap mode
+t_ts t_ti into termcap mode *t_ts_old*
+t_vb t_vb visual bell
+t_csc t_CS cursor is relative to scroll region *t_csc*
+
+t_ku t_ku <Up> arrow up
+t_kd t_kd <Down> arrow down
+t_kr t_kr <Right> arrow right
+t_kl t_kl <Left> arrow left
+t_sku <S-Up> shifted arrow up *t_sku*
+t_skd <S-Down> shifted arrow down *t_skd*
+t_skr t_%i <S-Right> shifted arrow right *t_skr*
+t_skl t_#4 <S-Left> shifted arrow left *t_skl*
+t_f1 t_k1 <F1> function key 1 *t_f1*
+t_f2 t_k2 <F2> function key 2 *t_f2*
+t_f3 t_k3 <F3> function key 3 *t_f3*
+t_f4 t_k4 <F4> function key 4 *t_f4*
+t_f5 t_k5 <F5> function key 5 *t_f5*
+t_f6 t_k6 <F6> function key 6 *t_f6*
+t_f7 t_k7 <F7> function key 7 *t_f7*
+t_f8 t_k8 <F8> function key 8 *t_f8*
+t_f9 t_k9 <F9> function key 9 *t_f9*
+t_f10 t_k; <F10> function key 10 *t_f10*
+t_sf1 <S-F1> shifted function key 1 *t_sf1*
+t_sf2 <S-F2> shifted function key 2 *t_sf2*
+t_sf3 <S-F3> shifted function key 3 *t_sf3*
+t_sf4 <S-F4> shifted function key 4 *t_sf4*
+t_sf5 <S-F5> shifted function key 5 *t_sf5*
+t_sf6 <S-F6> shifted function key 6 *t_sf6*
+t_sf7 <S-F7> shifted function key 7 *t_sf7*
+t_sf8 <S-F8> shifted function key 8 *t_sf8*
+t_sf9 <S-F9> shifted function key 9 *t_sf9*
+t_sf10 <S-F10> shifted function key 10 *t_sf10*
+t_help t_%1 <Help> help key *t_help*
+t_undo t_&8 <Undo> undo key *t_undo*
+
+
+'errorformat' option changed *errorformat-changed*
+----------------------------
+
+'errorformat' can now contain several formats, separated by commas. The first
+format that matches is used. The default values have been adjusted to catch
+the most common formats. |errorformat|
+
+If you have a format that contains a comma, it needs to be preceded with a
+backslash. Type two backslashes, because the ":set" command will eat one.
+
+
+'graphic' option gone *graphic-option-gone*
+---------------------
+
+The 'graphic' option was used to make the characters between <~> and 0xa0
+display directly on the screen. Now the 'isprint' option takes care of this
+with many more possibilities. The default setting is the same; you only need
+to look into this if you previously set the 'graphic' option in your vimrc.
+ |'isprint'|
+
+
+'yankendofline' option gone *ye-option-gone*
+---------------------------
+
+The 'yankendofline' option has been removed. Instead you can just use
+ :map Y y$
+
+
+'icon' and 'title' default value changed *icon-changed*
+----------------------------------------
+
+The 'title' option is now only set by default if the original title can be
+restored. Avoids "Thanks for flying Vim" titles. If you want them anyway,
+put ":set title" in your vimrc. |'title'|
+
+The default for 'icon' now depends on the possibility of restoring the
+original value, just like 'title'. If you don't like your icon titles to be
+changed, add this line to your vimrc: |'icon'|
+ :set noicon
+
+
+'highlight' option changed *highlight-changed*
+--------------------------
+
+The 'i' flag now means italic highlighting, instead of invert. The 'r' flag
+is used for reverse highlighting, which is what 'i' used to be. Normally you
+won't see the difference, because italic mode is not supported on most
+terminals and reverse mode is used as a fallback. |'highlight'|
+
+When an occasion is not present in 'highlight', use the mode from the default
+value for 'highlight', instead of reverse mode.
+
+
+'tildeop' and 'weirdinvert' short names changed *short-name-changed*
+-----------------------------------------------
+
+Renamed 'to' (abbreviation for 'tildeop') to 'top'. |'tildeop'|
+Renamed 'wi' (abbreviation for 'weirdinvert') to 'wiv'. |'weirdinvert'|
+
+This was done because Vi uses 'wi' as the short name for 'window' and 'to' as
+the short name for 'timeout'. This means that if you try setting these
+options, you won't get an error message, but the effect will be different.
+
+
+Use of "v", "V" and "CTRL-V" in Visual mode *use-visual-cmds*
+-------------------------------------------
+
+In Visual mode, "v", "V", and "CTRL-V" used to end Visual mode. Now this
+happens only if the Visual mode was in the corresponding type. Otherwise the
+type of Visual mode is changed. Now only ESC can be used in all circumstances
+to end Visual mode without doing anything. |v_V|
+
+
+CTRL-B in Insert mode removed *toggle-revins*
+-----------------------------
+
+CTRL-B in Insert mode used to toggle the 'revins' option. If you don't know
+this and accidentally hit CTRL-B, it is very difficult to find out how to undo
+it. Since hardly anybody uses this feature, it is disabled by default. If
+you want to use it, define RIGHTLEFT in feature.h before compiling. |'revins'|
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/version5.txt b/runtime/doc/version5.txt
new file mode 100644
index 0000000..cde0ad0
--- /dev/null
+++ b/runtime/doc/version5.txt
@@ -0,0 +1,7813 @@
+*version5.txt* For Vim version 9.0. Last change: 2022 Nov 09
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+Welcome to Vim Version 5.0!
+
+This document lists the differences between Vim 4.x and Vim 5.0.
+Although 5.0 is mentioned here, this is also for version 5.1, 5.2, etc.
+See |vi_diff.txt| for an overview of differences between Vi and Vim 5.0.
+See |version4.txt| for differences between Vim 3.0 and Vim 4.0.
+
+INCOMPATIBLE: |incompatible-5|
+
+Default value for 'compatible' changed |cp-default|
+Text formatting command "Q" changed |Q-command-changed|
+Command-line arguments changed |cmdline-changed|
+Autocommands are kept |autocmds-kept|
+Use of 'hidden' changed |hidden-changed|
+Text object commands changed |text-objects-changed|
+X-Windows Resources removed |x-resources|
+Use of $VIM |$VIM-use|
+Use of $HOME for MS-DOS and Win32 |$HOME-use|
+Tags file format changed |tags-file-changed|
+Options changed |options-changed|
+CTRL-B in Insert mode gone |i_CTRL-B-gone|
+
+NEW FEATURES: |new-5|
+
+Syntax highlighting |new-highlighting|
+Built-in script language |new-script|
+Perl and Python support |new-perl-python|
+Win32 GUI version |added-win32-GUI|
+VMS version |added-VMS|
+BeOS version |added-BeOS|
+Macintosh GUI version |added-Mac|
+More Vi compatible |more-compatible|
+Read input from stdin |read-stdin|
+Regular expression patterns |added-regexp|
+Overloaded tags |tag-overloaded|
+New commands |new-commands|
+New options |added-options|
+New command-line arguments |added-cmdline-args|
+Various additions |added-various|
+
+IMPROVEMENTS |improvements-5|
+
+COMPILE TIME CHANGES |compile-changes-5|
+
+BUG FIXES |bug-fixes-5|
+
+VERSION 5.1 |version-5.1|
+Changed |changed-5.1|
+Added |added-5.1|
+Fixed |fixed-5.1|
+
+VERSION 5.2 |version-5.2|
+Long lines editable |long-lines|
+File browser added |file-browser-5.2|
+Dialogs added |dialogs-added|
+Popup menu added |popup-menu-added|
+Select mode added |new-Select-mode|
+Session files added |new-session-files|
+User defined functions and commands |new-user-defined|
+New interfaces |interfaces-5.2|
+New ports |ports-5.2|
+Multi-byte support |new-multi-byte|
+New functions |new-functions-5.2|
+New options |new-options-5.2|
+New Ex commands |new-ex-commands-5.2|
+Changed |changed-5.2|
+Added |added-5.2|
+Fixed |fixed-5.2|
+
+VERSION 5.3 |version-5.3|
+Changed |changed-5.3|
+Added |added-5.3|
+Fixed |fixed-5.3|
+
+VERSION 5.4 |version-5.4|
+Runtime directory introduced |new-runtime-dir|
+Filetype introduced |new-filetype-5.4|
+Vim script line continuation |new-line-continuation|
+Improved session files |improved-sessions|
+Autocommands improved |improved-autocmds-5.4|
+Encryption |new-encryption|
+GTK GUI port |new-GTK-GUI|
+Menu changes |menu-changes-5.4|
+Viminfo improved |improved-viminfo|
+Various new commands |new-commands-5.4|
+Various new options |new-options-5.4|
+Vim scripts |new-script-5.4|
+Avoid hit-enter prompt |avoid-hit-enter|
+Improved quickfix |improved-quickfix|
+Regular expressions |regexp-changes-5.4|
+Changed |changed-5.4|
+Added |added-5.4|
+Fixed |fixed-5.4|
+
+VERSION 5.5 |version-5.5|
+Changed |changed-5.5|
+Added |added-5.5|
+Fixed |fixed-5.5|
+
+VERSION 5.6 |version-5.6|
+Changed |changed-5.6|
+Added |added-5.6|
+Fixed |fixed-5.6|
+
+VERSION 5.7 |version-5.7|
+Changed |changed-5.7|
+Added |added-5.7|
+Fixed |fixed-5.7|
+
+VERSION 5.8 |version-5.8|
+Changed |changed-5.8|
+Added |added-5.8|
+Fixed |fixed-5.8|
+
+==============================================================================
+INCOMPATIBLE *incompatible-5*
+
+Default value for 'compatible' changed *cp-default*
+--------------------------------------
+
+Vim version 5.0 tries to be more Vi compatible. This helps people who use Vim
+as a drop-in replacement for Vi, but causes some things to be incompatible
+with version 4.x.
+
+In version 4.x the default value for the 'compatible' option was off. Now the
+default is on. The first thing you will notice is that the "u" command undoes
+itself. Other side effects will be that mappings may work differently or not
+work at all.
+
+Since a lot of people switching from Vim 4.x to 5.0 will find this annoying,
+the 'compatible' option is switched off if Vim finds a vimrc file. This is a
+bit of magic to make sure that 90% of the Vim users will not be bitten by
+this change.
+
+What does this mean?
+- If you prefer to run in 'compatible' mode and don't have a vimrc file, you
+ don't have to do anything.
+- If you prefer to run in 'nocompatible' mode and do have a vimrc file, you
+ don't have to do anything.
+- If you prefer to run in 'compatible' mode and do have a vimrc file, you
+ should put this line first in your vimrc file: >
+ :set compatible
+- If you prefer to run in 'nocompatible' mode and don't have a vimrc file,
+ you can do one of the following:
+ - Create an empty vimrc file (e.g.: "~/.vimrc" for Unix).
+ - Put this command in your .exrc file or $EXINIT: >
+ :set nocompatible
+< - Start Vim with the "-N" argument.
+
+If you are new to Vi and Vim, using 'nocompatible' is strongly recommended,
+because Vi has a lot of unexpected side effects, which are avoided by this
+setting. See 'compatible'.
+
+If you like some things from 'compatible' and some not, you can tune the
+compatibility with 'cpoptions'.
+
+When you invoke Vim as "ex" or "gex", Vim always starts in compatible mode.
+
+
+Text formatting command "Q" changed *Q-command-changed*
+-----------------------------------
+
+The "Q" command formerly formatted lines to the width the 'textwidth' option
+specifies. The command for this is now "gq" (see |gq| for more info). The
+reason for this change is that "Q" is the standard Vi command to enter "Ex"
+mode, and Vim now does in fact have an "Ex" mode (see |Q| for more info).
+
+If you still want to use "Q" for formatting, use this mapping: >
+ :noremap Q gq
+And if you also want to use the functionality of "Q": >
+ :noremap gQ Q
+
+
+Command-line arguments changed *cmdline-changed*
+------------------------------
+
+Command-line file-arguments and option-arguments can now be mixed. You can
+give options after the file names. Example: >
+ vim main.c -g
+
+This is not possible when editing a file that starts with a '-'. Use the "--"
+argument then |---|: >
+ vim -g -- -main.c
+
+"-v" now means to start Ex in Vi mode, use "-R" for read-only mode.
+old: "vim -v file" |-v|
+new: "vim -R file" |-R|
+
+"-e" now means to start Vi in Ex mode, use "-q" for quickfix.
+old: "vim -e errorfile" |-e|
+new: "vim -q errorfile" |-q|
+
+"-s" in Ex mode now means to run in silent (batch) mode. |-s-ex|
+
+"-x" reserved for crypt, use "-f" to avoid starting a new CLI (Amiga).
+old: "vim -x file" |-x|
+new: "vim -f file" |-f|
+
+Vim allows up to ten "+cmd" and "-c cmd" arguments. Previously Vim executed
+only the last one.
+
+"-n" now overrides any setting for 'updatecount' in a vimrc file, but not in
+a gvimrc file.
+
+
+Autocommands are kept *autocmds-kept*
+---------------------
+
+Before version 5.0, autocommands with the same event, file name pattern, and
+command could appear only once. This was fine for simple autocommands (like
+setting option values), but for more complicated autocommands, where the same
+command might appear twice, this restriction caused problems. Therefore
+Vim stores all autocommands and keeps them in the order that they are defined.
+
+The most obvious side effect of this change is that when you source a vimrc
+file twice, the autocommands in it will be defined twice. To avoid this, do
+one of these:
+
+- Remove any autocommands that might already be defined before defining
+ them. Example: >
+ :au! * *.ext
+ :au BufEnter *.ext ...
+
+- Put the autocommands inside an ":if" command. Example: >
+ if !exists("did_ext_autocmds")
+ let did_ext_autocmds = 1
+ autocmd BufEnter *.ext ...
+ endif
+
+- Put your autocommands in a different autocommand group so you can remove
+ them before defining them |:augroup|: >
+ augroup uncompress
+ au!
+ au BufReadPost *.gz ...
+ augroup END
+
+
+Use of 'hidden' changed *hidden-changed*
+-----------------------
+
+In version 4.x, only some commands used the 'hidden' option. Now all commands
+uses it whenever a buffer disappears from a window.
+
+Previously you could do ":buf xxx" in a changed buffer and that buffer would
+then become hidden. Now you must set the 'hidden' option for this to work.
+
+The new behavior is simpler: whether Vim hides buffers no longer depends on
+the specific command that you use.
+- with 'hidden' not set, you never get hidden buffers. Exceptions are the
+ ":hide" and ":close!" commands and, in rare cases, where you would otherwise
+ lose changes to the buffer.
+- With 'hidden' set, you almost never unload a buffer. Exceptions are the
+ ":bunload" or ":bdel" commands.
+
+":buffer" now supports a "!": abandon changes in current buffer. So do
+":bnext", ":brewind", etc.
+
+
+Text object commands changed *text-objects-changed*
+----------------------------
+
+Text object commands have new names. This allows more text objects and makes
+characters available for other Visual mode commands. Since no more single
+characters were available, text objects names now require two characters.
+The first one is always 'i' or 'a'.
+ OLD NEW ~
+ a aw a word |v_aw|
+ A aW a WORD |v_aW|
+ s as a sentence |v_as|
+ p ap a paragraph |v_ap|
+ S ab a () block |v_ab|
+ P aB a {} block |v_aB|
+
+There is another set of text objects that starts with "i", for "inner". These
+select the same objects, but exclude white space.
+
+
+X-Windows Resources removed *x-resources*
+--------------------------
+
+Vim no longer supports the following X resources:
+- boldColor
+- italicColor
+- underlineColor
+- cursorColor
+
+Vim now uses highlight groups to set colors. This avoids the confusion of
+using a bold Font, which would imply a certain color. See |:highlight| and
+|gui-resources|.
+
+
+Use of $VIM *$VIM-use*
+-----------
+
+Vim now uses the VIM environment variable to find all Vim system files. This
+includes the global vimrc, gvimrc, and menu.vim files and all on-line help
+and syntax files. See |$VIM|. Starting with version 5.4, |$VIMRUNTIME| can
+also be used.
+For Unix, Vim sets a default value for $VIM when doing "make install".
+When $VIM is not set, its default value is the directory from 'helpfile',
+excluding "/doc/help.txt".
+
+
+Use of $HOME for MS-DOS and Win32 *$HOME-use*
+---------------------------------
+
+The MS-DOS and Win32 versions of Vim now first check $HOME when searching for
+a vimrc or exrc file and for reading/storing the viminfo file. Previously Vim
+used $VIM for these systems, but this causes trouble on a system with several
+users. Now Vim uses $VIM only when $HOME is not set or the file is not found
+in $HOME. See |_vimrc|.
+
+
+Tags file format changed *tags-file-changed*
+------------------------
+
+Only tabs are allowed to separate fields in a tags file. This allows for
+spaces in a file name and is still Vi compatible. In previous versions of
+Vim, any white space was allowed to separate the fields. If you have a file
+which doesn't use a single tab between fields, edit the tags file and execute
+this command: >
+ :%s/\(\S*\)\s\+\(\S*\)\s\+\(.*\)/\1\t\2\t\3/
+
+
+Options changed *options-changed*
+---------------
+
+The default value of 'errorfile' has changed from "errors.vim" to "errors.err".
+The reason is that only Vim scripts should have the ".vim" extensions.
+
+The ":make" command no longer uses the 'errorfile' option. This prevents the
+output of the ":make" command from overwriting a manually saved error file.
+":make" uses the 'makeef' option instead. This also allows for generating a
+unique name, to prevent concurrently running ":make" commands from overwriting
+each other's files.
+
+With 'insertmode' set, a few more things change:
+- <Esc> in Normal mode goes to Insert mode.
+- <Esc> in Insert mode doesn't leave Insert mode.
+- When doing ":set im", go to Insert mode immediately.
+
+Vim considers a buffer to be changed when the 'fileformat' (formerly the
+'textmode' option) is different from the buffer's initial format.
+
+
+CTRL-B in Insert mode gone *i_CTRL-B-gone*
+--------------------------
+
+When Vim was compiled with the |+rightleft| feature, you could use CTRL-B to
+toggle the 'revins' option. Unfortunately, some people hit the 'B' key
+accidentally when trying to type CTRL-V or CTRL-N and then didn't know how to
+undo this. Since toggling the 'revins' option can easily be done with the
+mapping below, this use of the CTRL-B key is disabled. You can still use the
+CTRL-_ key for this |i_CTRL-_|. >
+ :imap <C-B> <C-O>:set revins!<CR>
+
+==============================================================================
+NEW FEATURES *new-5*
+
+Syntax highlighting *new-highlighting*
+-------------------
+
+Vim now has a very flexible way to highlighting just about any type of file.
+See |syntax|. Summary: >
+ :syntax on
+
+Colors and attributes can be set for the syntax highlighting, and also for
+other highlighted items with the ':' flag in the 'highlight' option. All
+highlighted items are assigned a highlight group which specifies their
+highlighting. See |:highlight|. The default colors have been improved.
+
+You can use the "Normal" group to set the default fore/background colors for a
+color terminal. For the GUI, you can use this group to specify the font, too.
+
+The "2html.vim" script can be used to convert any file that has syntax
+highlighting to HTML. The colors will be exactly the same as how you see them
+in Vim. With a HTML viewer you can also print the file with colors.
+
+
+Built-in script language *new-script*
+------------------------
+
+A few extra commands and an expression evaluator enable you to write simple
+but powerful scripts. Commands include ":if" and ":while". Expressions can
+manipulate numbers and strings. You can use the '=' register to insert
+directly the result of an expression. See |expression|.
+
+
+Perl and Python support *new-perl-python*
+-----------------------
+
+Vim can call Perl commands with ":perldo", ":perl", etc. See |perl|.
+Patches made by Sven Verdoolaege and Matt Gerassimoff.
+
+Vim can call Python commands with ":python" and ":pyfile". See |python|.
+
+Both of these are only available when enabled at compile time.
+
+
+Win32 GUI version *added-win32-GUI*
+-----------------
+
+The GUI has been ported to MS-Windows 95 and NT. All the features of the X11
+GUI are available to Windows users now. |gui-w32|
+This also fixes problems with running the Win32 console version under Windows
+95, where console support has always been bad.
+There is also a version that supports OLE automation interface. |if_ole.txt|
+Vim can be integrated with Microsoft Developer Studio using the VisVim DLL.
+It is possible to produce a DLL version of gvim with Borland C++ (Aaron).
+
+
+VMS version *added-VMS*
+-----------
+
+Vim can now also be used on VMS systems. Port done by Henk Elbers.
+This has not been tested much, but it should work.
+Sorry, no documentation!
+
+
+BeOS version *added-BeOS*
+------------
+
+Vim can be used on BeOS systems (including the BeBox). (Olaf Seibert)
+See |os_beos.txt|.
+
+
+Macintosh GUI version *added-Mac*
+---------------------
+
+Vim can now be used on the Macintosh. (Dany St-Amant)
+It has not been tested much yet, be careful!
+See |os_mac.txt|.
+
+
+More Vi compatible *more-compatible*
+------------------
+
+There is now a real Ex mode. Started with the "Q" command, or by calling the
+executable "ex" or "gex". |Ex-mode|
+
+Always allow multi-level undo, also in Vi compatible mode. When the 'u' flag
+in 'cpoptions' is included, CTRL-R is used for repeating the undo or redo
+(like "." in Nvi).
+
+
+Read input from stdin *read-stdin*
+---------------------
+
+When using the "-" command-line argument, Vim reads its text input from stdin.
+This can be used for putting Vim at the end of a pipe: >
+ grep "^a.*" *.c | vim -
+See |--|.
+
+
+Regular expression patterns *added-regexp*
+---------------------------
+
+Added specifying a range for the number of matches of an atom: "\{a,b}". |/\{|
+Added the "shortest match" regexp "\{-}" (Webb).
+Added "\s", matches a white character. Can replace "[ \t]". |/\s|
+Added "\S", matches a non-white character. Can replace "[^ \t]". |/\S|
+
+
+Overloaded tags *tag-overloaded*
+---------------
+
+When using a language like C++, there can be several tags for the same
+tagname. Commands have been added to be able to jump to any of these
+overloaded tags:
+|:tselect| List matching tags, and jump to one of them.
+|:stselect| Idem, and split window.
+|g_CTRL-]| Do ":tselect" with the word under the cursor.
+
+ After ":ta {tagname}" with multiple matches:
+|:tnext| Go to next matching tag.
+|:tprevious| Go to previous matching tag.
+|:trewind| Go to first matching tag.
+|:tlast| Go to last matching tag.
+
+The ":tag" command now also accepts wildcards. When doing command-line
+completion on tags, case-insensitive matching is also available (at the end).
+
+
+New commands *new-commands*
+------------
+
+|:amenu| Define menus for all modes, inserting a CTRL-O for Insert
+ mode, ESC for Visual and CTRL-C for Cmdline mode. "amenu" is
+ used for the default menus and the Syntax menu.
+
+|:augroup| Set group to be used for following autocommands. Allows the
+ grouping of autocommands to enable deletion of a specific
+ group.
+
+|:crewind| Go to first error.
+|:clast| Go to last error.
+
+|:doautoall| Execute autocommands for all loaded buffers.
+
+|:echo| Echo its argument, which is an expression. Can be used to
+ display messages which include variables.
+
+|:execute| Execute its argument, which is an expression. Can be used to
+ built up an Ex command with anything.
+
+|:hide| Works like ":close".
+
+|:if| Conditional execution, for built-in script language.
+
+|:intro| Show introductory message. This is always executed when Vim
+ is started without file arguments.
+
+|:let| Assign a value to an internal variable.
+
+|:omap| Map only in operator-pending mode. Makes it possible to map
+ text-object commands.
+
+|:redir| Redirect output of messages to a file.
+
+|:update| Write when buffer has changed.
+
+|:while| While-loop for built-in script language.
+
+Visual mode:
+|v_O| "O" in Visual block mode, moves the cursor to the other corner
+ horizontally.
+|v_D| "D" in Visual block mode deletes till end of line.
+
+Insert mode:
+|i_CTRL-]| Triggers abbreviation, without inserting any character.
+
+
+New options *added-options*
+-----------
+
+'background' Used for selecting highlight color defaults. Also used in
+ "syntax.vim" for selecting the syntax colors. Often set
+ automatically, depending on the terminal used.
+
+'complete' Specifies how Insert mode completion works.
+
+'eventignore' Makes it possible to ignore autocommands temporarily.
+
+'fileformat' Current file format. Replaces 'textmode'.
+'fileformats' Possible file formats. Replaces 'textauto'.
+ New is that this also supports Macintosh format: A single <CR>
+ separates lines.
+ The default for 'fileformats' for MS-DOS, Win32 and OS/2 is
+ "dos,unix", also when 'compatible' set. Unix type files
+ didn't work anyway when 'fileformats' was empty.
+
+'guicursor' Set the cursor shape and blinking in various modes.
+ Default is to adjust the cursor for Insert and Replace mode,
+ and when an operator is pending. Blinking is default on.
+
+'fkmap' Farsi key mapping.
+
+'hlsearch' Highlight all matches with the last used search pattern.
+
+'hkmapp' Phonetic Hebrew mapping. (Ilya Dogolazky)
+
+'iconstring' Define the name of the icon, when not empty. (Version 5.2: the
+ string is used literally, a newline can be used to make two
+ lines.)
+
+'lazyredraw' Don't redraw the screen while executing macros, registers or
+ other not typed commands.
+
+'makeef' Errorfile to be used for ":make". "##" is replaced with a
+ unique number. Avoids that two Vim sessions overwrite each
+ others errorfile. The Unix default is "/tmp/vim##.err"; for
+ Amiga "t:vim##.Err, for others "vim##.err".
+
+'matchtime' 1/10s of a second to show a matching paren, when 'showmatch'
+ is set. Like Nvi.
+
+'mousehide' Hide mouse pointer in GUI when typing text.
+
+'nrformats' Defines what bases Vim will consider for numbers when using
+ the CTRL-A and CTRL-X commands. Default: "hex,octal".
+
+'shellxquote' Add extra quotes around the whole shell command, including
+ redirection.
+
+'softtabstop' Make typing behave like tabstop is set at this value, without
+ changing the value of 'tabstop'. Makes it more easy to keep
+ 'ts' at 8, while still getting four spaces for a <Tab>.
+
+'titlestring' String for the window title, when not empty. (Version 5.2:
+ this string is used literally, a newline can be used to make
+ two lines.)
+
+'verbose' Level of verbosity. Makes it possible to show which .vimrc,
+ .exrc, .viminfo files etc. are used for initializing. Also
+ to show autocommands that are being executed. Can also be set
+ by using the "-V" command-line argument.
+
+
+New command-line arguments *added-cmdline-args*
+--------------------------
+
+|-U| Set the gvimrc file to be used. Like "-u" for the vimrc.
+
+|-V| Set the 'verbose' option. E.g. "vim -V10".
+
+|-N| Start in non-compatible mode.
+
+|-C| Start in compatible mode.
+
+|-Z| Start in restricted mode, disallow shell commands. Can also
+ be done by calling the executable "rvim".
+
+|-h| Show usage information and exit.
+
+
+Various additions *added-various*
+-----------------
+
+Added support for SNiFF+ connection (submitted by Toni Leherbauer). Vim can
+be used as an editor for SNiFF. No documentation available...
+
+For producing a bug report, the bugreport.vim script has been included.
+Can be used with ":so $VIMRUNTIME/bugreport.vim", which creates the file
+"bugreport.txt" in the current directory. |bugs|
+
+Added range to ":normal" command. Now you can repeat the same command for
+each line in the range. |:normal-range|
+
+Included support for the Farsi language (Shiran). Only when enabled at
+compile time. See |farsi|.
+
+==============================================================================
+IMPROVEMENTS *improvements-5*
+
+Performance:
+- When 'showcmd' was set, mappings would execute much more slowly because the
+ output would be flushed very often. Helps a lot when executing the "life"
+ macros with 'showcmd' set.
+- Included patches for binary searching in tags file (David O'Neill).
+ Can be disabled by resetting the 'tagbsearch' option.
+- Don't update the ruler when repeating insert (slowed it down a lot).
+- For Unix, file name expansion is now done internally instead of starting a
+ shell for it.
+- Expand environment variables with expand_env(), instead of calling the
+ shell. Makes ":so $VIMRUNTIME/syntax/syntax.vim" a LOT faster.
+- Reduced output for cursor positioning: Use CR-LF for moving to first few
+ columns in next few lines; Don't output CR twice when using termios.
+- Optimized cursor positioning. Use CR, BS and NL when it's shorter than
+ absolute cursor positioning.
+- Disable redrawing while repeating insert "1000ii<Esc>".
+- Made "d$" or "D" for long lines a lot faster (delete all characters at once,
+ instead of one by one).
+- Access option table by first letter, instead of searching from start.
+- Made setting special highlighting attributes a lot faster by using
+ highlight_attr[], instead of searching in the 'highlight' string.
+- Don't show the mode when redrawing is disabled.
+- When setting an option, only redraw the screen when required.
+- Improved performance of Ex commands by using a lookup table for the first
+ character.
+
+Options:
+'cinoptions' Added 'g' flag, for C++ scope declarations.
+'cpoptions' Added 'E' flag: Disallow yanking, deleting, etc. empty text
+ area. Default is to allow empty yanks. When 'E' is included,
+ "y$" in an empty line now is handled as an error (Vi
+ compatible).
+ Added 'j' flag: Only add two spaces for a join after a '.',
+ not after a '?' or '!'.
+ Added 'A' flag: don't give ATTENTION message.
+ Added 'L' flag: When not included, and 'list' is set,
+ 'textwidth' formatting works like 'list' is not set.
+ Added 'W' flag: Let ":w!" behave like Vi: don't overwrite
+ readonly files, or a file owned by someone else.
+'highlight' Added '@' flag, for '@' characters after the last line on the
+ screen, and '$' at the end of the line when 'list' is set.
+ Added 'i' flag: Set highlighting for 'incsearch'. Default
+ uses "IncSearch" highlight group, which is linked to "Visual".
+ Disallow 'h' flag in 'highlight' (wasn't used anymore since
+ 3.0).
+'guifont' Win32 GUI only: When set to "*" brings up a font requester.
+'guipty' Default on, because so many people need it.
+'path' Can contain wildcards, and "**" for searching a whole tree.
+'shortmess' Added 'I' flag to avoid the intro message.
+'viminfo' Added '%' flag: Store buffer list in viminfo file.
+
+- Increased defaults for 'maxmem' and 'maxmemtot' for Unix and Win32. Most
+ machines have much more RAM now that prices have dropped.
+- Implemented ":set all&", set all options to their default value. |:set|
+
+Swap file:
+- Don't create a swap file for a readonly file. Then create one on the first
+ change. Also create a swapfile when the amount of memory used is getting
+ too high. |swap-file|
+- Make swap file "hidden", if possible. On Unix this is done by prepending a
+ dot to the swap file name. When long file names are used, the DJGPP and
+ Win32 versions also prepend a dot, in case a file on a mounted Unix file
+ system is edited. |:swapname| On MSDOS the hidden file attribute is NOT
+ set, because this causes problems with share.exe.
+- 'updatecount' always defaults to non-zero, also for Vi compatible mode.
+ This means there is a swap file, which can be used for recovery.
+
+Tags:
+- Included ctags 2.0 (Darren Hiebert). The syntax for static tags changed
+ from
+ {tag}:{fname} {fname} {command}
+ to
+ {tag} {fname} {command};" file:
+ Which is both faster to parse, shorter and Vi compatible. The old format is
+ also still accepted, unless disabled in src/feature.h (see OLD_STATIC_TAGS).
+ |tags-file-format|
+- Completion of tags now also includes static tags for other files, at the
+ end.
+- Included "shtags" from Stephen Riehm.
+- When finding a matching tag, but the file doesn't exist, continue searching
+ for another match. Helps when using the same tags file (with links) for
+ different versions of source code.
+- Give a tag with a global match in the current file a higher priority than a
+ global match in another file.
+
+Included xxd version V1.8 (Juergen Weigert).
+
+Autocommands:
+- VimLeave autocommands are executed after writing the viminfo file, instead
+ of before. |VimLeave|
+- Allow changing autocommands while executing them. This allows for
+ self-modifying autocommands. (idea from Goldberg)
+- When using autocommands with two or more patterns, could not split
+ ":if/:endif" over two lines. Now all matching autocommands are executed in
+ one do_cmdline().
+- Autocommands no longer change the command repeated with ".".
+- Search patterns are restored after executing autocommands. This avoids
+ that the 'hlsearch' highlighting is messed up by autocommands.
+- When trying to execute an autocommand, also try matching the pattern with
+ the short file name. Helps when short file name is different from full
+ file name (expanded symbolic links). |autocmd-patterns|
+- Made the output of ":autocmd" shorter and look better.
+- Expand <sfile> in an ":autocmd" when it is defined. |<sfile>|
+- Added "nested" flag to ":autocmd", allows nesting. |autocmd-nested|
+- Added [group] argument to ":autocmd". Overrides the currently set group.
+ |autocmd-groups|
+- new events:
+ |BufUnload| before a buffer is unloaded
+ |BufDelete| before a buffer is deleted from the buffer list
+ |FileChangedShell| when a file's modification time has changed after
+ executing a shell command
+ |User| user-defined autocommand
+- When 'modified' was set by a BufRead* autocommand, it was reset again
+ afterwards. Now the ":set modified" is remembered.
+
+GUI:
+- Improved GUI scrollbar handling when redrawing is slower than the scrollbar
+ events are generated.
+- "vim -u NONE" now also stops loading the .gvimrc and other GUI inits. |-u|
+ Use "-U" to use another gvimrc file. |-U|
+- Handle CTRL-C for external command, also for systems where "setsid()" is
+ supported.
+- When starting the GUI, restrict the window size to the screen size.
+- The default menus are read from $VIMRUNTIME/menu.vim. This allows for a
+ customized default menu. |menu.vim|
+- Improved the default menus. Added File/Print, a Window menu, Syntax menu,
+ etc.
+- Added priority to the ":menu" command. Now each menu can be put in a place
+ where you want it, independent of the order in which the menus are defined.
+ |menu-priority|
+
+Give a warning in the intro screen when running the Win32 console version on
+Windows 95 because there are problems using this version under Windows 95.
+|win32-problems|
+
+Added 'e' flag for ":substitute" command: Don't complain when not finding a
+match (Campbell). |:s|
+
+When using search commands in a mapping, only the last one is kept in the
+history. Avoids that the history is trashed by long mappings.
+
+Ignore characters after "ex", "view" and "gvim" when checking startup mode.
+Allows the use of "gvim5" et. al. |gvim| "gview" starts the GUI in readonly
+mode. |gview|
+
+When resizing windows, the cursor is kept in the same relative position, if
+possible. (Webb)
+
+":all" and ":ball" no longer close and then open a window for the same buffer.
+Avoids losing options, jumplist, and other info.
+
+"-f" command-line argument is now ignored if Vim was compiled without GUI.
+|-f|
+
+In Visual block mode, the right mouse button picks up the nearest corner.
+
+Changed default mappings for DOS et al. Removed the DOS-specific mappings,
+only use the Windows ones. Added Shift-Insert, Ctrl-Insert, Ctrl-Del and
+Shift-Del.
+
+Changed the numbers in the output of ":jumps", so you can see where {count}
+CTRL-O takes you. |:jumps|
+
+Using "~" for $HOME now works for all systems. |$HOME|
+
+Unix: Besides using CTRL-C, also use the INTR character from the tty settings.
+Somebody has INTR set to DEL.
+
+Allow a <NL> in a ":help" command argument to end the help command, so another
+command can follow.
+
+Doing "%" on a line that starts with " #if" didn't jump to matching "#else".
+Don't recognize "#if", "#else" etc. for '%' when 'cpo' contains the '%' flag.
+|%|
+
+Insert mode expansion with "CTRL-N", "CTRL-P" and "CTRL-X" improved
+|ins-completion|:
+- 'complete' option added.
+- When 'nowrapscan' is set, and no match found, report the searched direction
+ in the error message.
+- Repeating CTRL-X commands adds following words/lines after the match.
+- When adding-expansions, accept single character matches.
+- Made repeated CTRL-X CTRL-N not break undo, and "." repeats the whole
+ insertion. Also fixes not being able to backspace over a word that has been
+ inserted with CTRL-N.
+
+When copying characters in Insert mode from previous/next line, with CTRL-E or
+CTRL-Y, 'textwidth' is no longer used. |i_CTRL-E|
+
+Commands that move in the arglist, like ":n" and ":rew", keep the old cursor
+position of the file (this is mostly Vi compatible).
+
+Vim now remembers the '< and '> marks for each buffer. This fixes a problem
+that a line-delete in one buffer invalidated the '< and '> marks in another
+buffer. |'<|
+
+For MSDOS, Unix and OS/2: When $VIM not set, use the path from the executable.
+When using the executable path for $VIM, remove "src/" when present. Should
+make Vim find the docs and syntax files when it is run directly after
+compiling. |$VIM|
+
+When quitting Visual mode with <Esc>, the cursor is put at start of the Visual
+area (like after executing an operator).
+
+Win32 and Unix version: Removed 1100 character limit on external commands.
+
+Added possibility to include a space in a ":edit +command" argument, by
+putting a backslash before it. |+cmd|
+
+After recovery, BufReadPost autocommands are applied. |:recover|
+
+Added color support for "os2ansi", OS/2 console. (Slootman)
+
+Allow "%:p:h" when % is empty. |:_%|
+
+Included "<sfile>": file name from the ":source" command. |<sfile>|
+
+Added "<Bslash>" special character. Helps for avoiding multiple backslashes
+in mappings and menus.
+
+In a help window, a double-click jumps to the tag under the cursor (like
+CTRL-]).
+
+<C-Left> and <C-Right> now work like <S-Left> and <S-Right>, move a word
+forward/backward (Windows compatible). |<C-Left>|
+
+Removed the requirement for a ":version" command in a .vimrc file. It wasn't
+used for anything. You can use ":if" to handle differences between versions.
+|:version|
+
+For MS-DOS, Win32 and OS/2: When comparing file names for autocommands, don't
+make a difference between '/' and '\' for path separator.
+
+New termcap options:
+"mb": blink. Can only be used by assigning it to one of the other highlight
+ options. |t_mb|
+"bc": backspace character. |t_bc|
+"nd": Used for moving the cursor right in the GUI, to avoid removing one line
+ of pixels from the last bold character. |t_nd|
+"xs": highlighting not erased by overwriting, for hpterm. Combined with
+ 'weirdinvert'. Visual mode works on hpterm now. |t_xs|
+
+Unix: Set time of patch and backup file same as original file. (Hiebert).
+
+Amiga: In QuickFix mode no longer opens another window. Shell commands can be
+used now.
+
+Added decmouse patches from David Binette. Can now use Dec and Netterm mouse.
+But only when enabled at compile time.
+
+Added '#' register: Alternate file name |quote#|. Display '#' register with
+":dis" command. |:display|
+
+Removed ':' from 'isfname' default for Unix. Check for "://" in a file name
+anyway. Also check for ":\\", for MS-DOS.
+
+Added count to "K"eyword command, when 'keywordprg' is "man", is inserted in
+the man command. "2K" results in "!man 2 <cword>". |K|
+
+When using "gf" on a relative path name, remove "../" from the file name, like
+it's done for file names in the tags file. |gf|
+
+When finishing recording, don't make the recorded register the default put
+register.
+
+When using "!!", don't put ":5,5!" on the command-line, but ":.!". And some
+other enhancements to replace the line number with "." or "$" when possible.
+
+MSDOS et al.: Renamed $VIM/viminfo to $VIM/_viminfo. It's more consistent:
+.vimrc/_vimrc and .viminfo/_viminfo
+
+For systems where case doesn't matter in file names (MSDOS, Amiga), ignore
+case while sorting file names. For buffer names too.
+
+When reading from stdin doesn't work, read from stderr (helps for "foo | xargs
+vim").
+
+32 bit MS-DOS version: Replaced csdpmi3 by csdpmi4.
+
+Changed <C-Left> and <C-Right> to skip a WORD instead of a word.
+
+Warning for changed modified time when overwriting a file now also works on
+other systems than Unix.
+
+Unix: Changed the defaults for configure to be the same as the defaults for
+Makefile: include GUI, Perl, and Python.
+
+Some versions of Motif require "-lXpm". Added check for this in configure.
+
+Don't add "-L/usr/lib" to the link line, causes problems on a few systems.
+
+==============================================================================
+COMPILE TIME CHANGES *compile-changes-5*
+
+When compiling, allow a choice for minimal, normal or maximal features in an
+easy way, by changing a single line in src/feature.h.
+The DOS16 version has been compiled with minimal features to avoid running
+out of memory too quickly.
+The Win32, DJGPP, and OS/2 versions use maximal features, because they have
+enough memory.
+The Amiga version is available with normal and maximal features.
+
+Added "make test" to Unix version Makefile. Allows for a quick check if most
+"normal" commands work properly. Also tests a few specific commands.
+
+Added setlocale() with codepage support for DJGPP version.
+
+autoconf:
+- Added autoconf check for -lXdmcp.
+- Included check for -lXmu, no longer needed to edit the Makefile for this.
+- Switched to autoconf 2.12.
+- Added configure check for <poll.h>. Seems to be needed when including
+ Perl on Linux?
+- termlib is now checked before termcap.
+- Added configure check for strncasecmp(), stricmp() and strnicmp(). Added
+ vim_stricmp() for when there's no library function for stricmp().
+- Use "datadir" in configure, instead of our own check for HELPDIR.
+
+Removed "make proto" from Makefile.manx. Could not make it work without a lot
+of #ifdefs.
+
+Removed "proto/" from paths in proto.h. Needed for the Mac port.
+
+Drastically changed Makefile.mint. Now it includes the Unix Makefile.
+
+Added support for Dos16 in Makefile.b32 (renamed Makefile.b32 to Makefile.bor)
+
+All source files are now edited with a tabstop of 8 instead of 4, which is
+better when debugging and using other tools. 'softtabstop' is set to 4, to
+make editing easier.
+
+Unix: Added "link.sh" script, which removes a few unnecessary libraries from
+the link command.
+
+Don't use HPUX digraphs by default, but only when HPUX_DIGRAPHS is defined.
+|digraphs-default|
+
+==============================================================================
+BUG FIXES *bug-fixes-5*
+
+Note: Some of these fixes may only apply to test versions which were
+ created after version 4.6, but before 5.0.
+
+
+When doing ":bdel", try going to the next loaded buffer. Don't rewind to the
+start of the buffer list.
+
+mch_isdir() for Unix returned TRUE for "" on some systems.
+
+Win32: 'shell' set to "mksnt/sh.exe" breaks ":!" commands. Don't use
+backslashes in the temp file names.
+
+On linux, with a FAT file system, could get spurious "file xxx changed since
+editing started" messages, because the time is rounded off to two seconds
+unexpectedly.
+
+Crash in GUI, when selecting a word (double click) and then extend until an
+empty line.
+
+For systems where isdigit() can't handle characters > 255, get_number() caused
+a crash when moving the mouse during the prompt for recovery.
+
+In Insert mode, "CTRL-O P" left the cursor on the last inserted character.
+Now the cursor is left after the last putted character.
+
+When quickfix found an error type other than 'e' or 'w', it was never printed.
+
+A setting for 'errorfile' in a .vimrc overruled the "-q errorfile" argument.
+
+Some systems create a file when generating a temp file name. Filtering would
+then create a backup file for this, which was never deleted. Now no backup
+file is made when filtering.
+
+simplify_filename() could remove a ".." after a link, resulting in the wrong
+file name. Made simplify_filename also work for MSDOS. Don't use it for
+Amiga, since it doesn't have "../".
+
+otherfile() was unreliable when using links. Could think that reading/writing
+was for a different file, when it was the same.
+
+Pasting with mouse in Replace mode didn't replace anything.
+
+Window height computed wrong when resizing a window with an autocommand (could
+cause a crash).
+
+":s!foo!bar!" wasn't possible (Vi compatible).
+
+do_bang() freed memory twice when called recursively, because of autocommands
+(test11). Thanks to Electric Fence!
+
+"v$d" on an empty line didn't remove the "-- VISUAL --" mode message from the
+command-line, and inverted the cursor.
+
+":mkexrc" didn't check for failure to open the file, causing a crash.
+(Felderhoff).
+
+Win32 mch_write() wrote past fixed buffer, causing terminal keys no longer to
+be recognized. Both console and GUI version.
+
+Athena GUI: Crash when removing a menu item. Now Vim doesn't crash, but the
+reversing of the menu item is still wrong.
+
+Always reset 'list' option for the help window.
+
+When 'scrolloff' is non-zero, a 'showmatch' could cause the shown match to be
+in the wrong line and the window to be scrolled (Acevedo).
+
+After ":set all&", 'lines' and 'ttytype' were still non-default, because the
+defaults never got set. Now the defaults for 'lines' and 'columns' are set
+after detecting the window size. 'term' and 'ttytype' defaults are set when
+detecting the terminal type.
+
+For (most) non-Unix systems, don't add file names with illegal characters when
+expanding. Fixes "cannot open swapfile" error when doing ":e *.burp", when
+there is no match.
+
+In X11 GUI, drawing part of the cursor obscured the text. Now the text is
+drawn over the cursor, like when it fills the block. (Seibert)
+
+when started with "-c cmd -q errfile", the cursor would be left in line 1.
+Now a ":cc" is done after executing "cmd".
+
+":ilist" never ignored case, even when 'ignorecase' set.
+
+"vim -r file" for a readonly file, then making a change, got ATTENTION message
+in insert mode, display mixed up until <Esc> typed. Also don't give ATTENTION
+message after recovering a file.
+
+The abbreviation ":ab #i #include" could not be removed.
+
+CTRL-L completion (longest common match) on command-line didn't work properly
+for case-insensitive systems (MS-DOS, Windows, etc.). (suggested by Richard
+Kilgore).
+
+For terminals that can hide the cursor ("vi" termcap entry), resizing the
+window caused the cursor to disappear.
+
+Using an invalid mark in an Ex address didn't abort the command.
+
+When 'smarttab' set, would use 'shiftround' when inserting a TAB after a
+space. Now it always rounds to a tabstop.
+
+Set '[ and '] marks for ":copy", ":move", ":append", ":insert", ":substitute"
+and ":change". (Acevedo).
+
+"d$" in an empty line still caused an error, even when 'E' is not in
+'cpoptions'.
+
+Help files were stored in the viminfo buffer list without a path.
+
+GUI: Displaying cursor was not synchronized with other displaying. Caused
+several display errors. For example, when the last two lines in the file
+start with spaces, "dd" on the last line copied text to the (then) last line.
+
+Win32: Needed to type CTRL-SHIFT-- to get CTRL-_.
+
+GUI: Moving the cursor forwards over bold text would remove one column of bold
+pixels.
+
+X11 GUI: When a bold character in the last column was scrolled up or down, one
+column of pixels would not be copied.
+
+Using <BS> to move the cursor left can sometimes erase a character. Now use
+"le" termcap entry for this.
+
+Keyword completion with regexp didn't work. e.g., for "b.*crat".
+
+Fixed: With CTRL-O that jumps to another file, cursor could end up just after
+the line.
+
+Amiga: '$' was missing from character recognized as wildcards, causing $VIM
+sometimes not to be expanded.
+
+":change" didn't adjust marks for deleted lines.
+
+":help [range]" didn't work. Also for [pattern], [count] and [quotex].
+
+For 'cindent'ing, typing "class::method" doesn't align like a label when the
+second ':' is typed.
+When inserting a CR with 'cindent' set (and a bunch of other conditions) the
+cursor went to a wrong location.
+'cindent' was wrong for a line that ends in '}'.
+'cindent' was wrong after "else {".
+
+While editing the cmdline in the GUI, could not use the mouse to select text
+from the command-line itself.
+
+When deleting lines, marks in tag stack were only adjusted for the current
+window, not for other windows on the same buffer.
+
+Tag guessing could find a function "some_func" instead of the "func" we were
+looking for.
+
+Tags file name relative to the current file didn't work.
+
+":g/pat2/s//pat2/g", causing the number of subs to be reported, used to cause
+a scroll up. Now you no longer have to hit <CR>.
+
+X11 GUI: Selecting text could cause a crash.
+
+32 bit DOS version: CTRL-C in external command killed Vim. When SHELL is set
+to "sh.exe", external commands didn't work. Removed using of command.com, no
+longer need to set 'shellquote'.
+
+Fixed crash when using ":g/pat/i".
+
+Fixed (potential) crash for X11 GUI, when using an X selection. Was giving a
+pointer on the stack to a callback function, now it's static.
+
+Using "#" and "*" with an operator didn't work. E.g. "c#".
+
+Command-line expansion didn't work properly after ":*". (Acevedo)
+
+Setting 'weirdinvert' caused highlighting to be wrong in the GUI.
+
+":e +4 #" didn't work, because the "4" was in unallocated memory (could cause
+a crash).
+
+Cursor position was wrong for ":e #", after ":e #" failed, because of changes
+to the buffer.
+
+When doing ":buf N", going to a buffer that was edited with ":view", the
+readonly flag was reset. Now make a difference between ":e file" and ":buf
+file": Only set/reset 'ro' for the first one.
+
+Avoid |hit-enter| prompt when not able to write viminfo on exit.
+
+When giving error messages in the terminal where the GUI was started, GUI
+escape codes would be written to the terminal. In an xterm this could be seen
+as a '$' after the message.
+
+Mouse would not work directly after ":gui", because full_screen isn't set,
+which causes starttermcap() not to do its work.
+
+'incsearch' did not scroll the window in the same way as the actual search.
+When 'nowrap' set, incsearch didn't show a match when it was off the side of
+the screen. Now it also shows the whole match, instead of just the cursor
+position (if possible).
+
+":unmap", ":unab" and ":unmenu" did not accept a double quote, it was seen as
+the start of a comment. Now it's Vi compatible.
+
+Using <Up><Left><Left><Up> in the command-line, when there is no previous
+cmdline in the history, inserted a NUL on the command-line.
+
+"i<Esc>" when on a <Tab> in column 0 left the cursor in the wrong place.
+
+GUI Motif: When adding a lot of menu items, the menu bar goes into two rows.
+Deleting menu items, reducing the number of rows, now also works.
+
+With ":g/pat/s//foo/c", a match in the first line was scrolled off of the
+screen, so you could not see it.
+When using ":s//c", with 'nowrap' set, a match could be off the side of the
+screen, so you could not see it.
+
+When 'helpfile' was set to a fixed, non-absolute path in feature.h, Vim would
+crash. mch_Fullname can now handle file names in read-only memory. (Lottem)
+
+When using CTRL-A or CTRL-@ in Insert mode, there could be strange effects
+when using CTRL-D next. Also, when repeating inserted text that included "0
+CTRL-D" or "^ CTRL-D" this didn't work. (Acevedo)
+Using CTRL-D after using CTRL-E or CTRL-Y in Insert mode that inserted a '0'
+or '^', removed the '0' or '^' and more indent.
+
+The command "2".p" caused the last inserted text to be executed as commands.
+(Acevedo)
+
+Repeating the insert of "CTRL-V 048" resulted in "^@" to be inserted.
+
+Repeating Insert completion could fail if there are special characters in the
+text. (Acevedo)
+
+":normal /string<CR>" caused the window to scroll. Now all ":normal" commands
+are executed without scrolling messages.
+
+Redo of CTRL-E or CTRL-Y in Insert mode interpreted special characters as
+commands.
+
+Line wrapping for 'tw' was done one character off for insert expansion
+inserts.
+
+buffer_exists() function didn't work properly for buffer names with a symbolic
+link in them (e.g. when using buffer_exists(#)).
+
+Removed the "MOTIF_COMMENT" construction from Makefile. It now works with
+FreeBSD make, and probably with NeXT make too.
+
+Matching the 'define' and 'include' arguments now honor the settings for
+'ignorecase'. (Acevedo)
+
+When one file shown in two windows, Visual selection mixed up cursor position
+in current window and other window.
+
+When doing ":e file" from a help file, the 'isk' option wasn't reset properly,
+because of a modeline in the help file.
+
+When doing ":e!", a cursor in another window on the same buffer could become
+invalid, leading to "ml_get: invalid lnum" errors.
+
+Matching buffer name for when expanded name has a different path from not
+expanded name (Brugnara).
+
+Normal mappings didn't work after an operator. For example, with ":map Q gq",
+"QQ" didn't work.
+
+When ":make" resulted in zero errors, a "No Errors" error message was given
+(which breaks mappings).
+
+When ":sourcing" a file, line length was limited to 1024 characters. CTRL-V
+before <EOL> was not handled Vi compatible. (Acevedo)
+
+Unexpected exit for X11 GUI, caused by SAVE_YOURSELF event. (Heimann)
+
+CTRL-X CTRL-I only found one match per line. (Acevedo)
+When using an illegal CTRL-X key in Insert mode, the CTRL-X mode message
+was stuck.
+
+Finally managed to ignore the "Quit" menu entry of the Window manager! Now
+Vim only exists when there are no changed buffers.
+
+Trying to start the GUI when $DISPLAY is not set resulted in a crash.
+When $DISPLAY is not set and gvim starts vim, title was restored to "Thanks
+for flying Vim".
+When $DISPLAY not set, starting "gvim" (dropping back to vim) and then
+selecting text with the mouse caused a crash.
+
+"J", with 'joinspaces' set, on a line ending in ". ", caused one space too
+many to be added. (Acevedo)
+
+In insert mode, a CTRL-R {regname} which didn't insert anything left the '"'
+on the screen.
+
+":z10" didn't work. (Clapp)
+
+"Help "*" didn't work.
+
+Renamed a lot of functions, to avoid clashes with POSIX name space.
+
+When adding characters to a line, making it wrap, the following lines were
+sometimes not shifted down (e.g. after a tag jump).
+
+CTRL-E, with 'so' set and cursor on last line, now does not move cursor as
+long as the last line is on the screen.
+
+When there are two windows, doing "^W+^W-" in the bottom window could cause
+the status line to be doubled (not redrawn correctly).
+
+This command would hang: ":n `cat`". Now connect stdin of the external
+command to /dev/null, when expanding.
+
+Fixed lalloc(0,) error for ":echo %:e:r". (Acevedo)
+
+The "+command" argument to ":split" didn't work when there was no file name.
+
+When selecting text in the GUI, which is the output of a command-line command
+or an external command, the inversion would sometimes remain.
+
+GUI: "-mh 70" argument was broken. Now, when menuheight is specified, it is
+not changed anymore.
+
+GUI: When using the scrollbar or mouse while executing an external command,
+this caused garbage characters.
+
+Showmatch sometimes jumped to the wrong position. Was caused by a call to
+findmatch() when redrawing the display (when syntax highlighting is on).
+
+Search pattern "\(a *\)\{3} did not work correctly, also matched "a a".
+Problem with brace_count not being decremented.
+
+Wildcard expansion added too many non-matching file names.
+
+When 'iskeyword' contains characters like '~', "*" and "#" didn't work
+properly. (Acevedo)
+
+On Linux, on a FAT file system, modification time can change by one second.
+Avoid a "file has changed" warning for a one second difference.
+
+When using the page-switching in an xterm, Vim would position the cursor on
+the last line of the window on exit. Also removed the cursor positioning for
+":!" commands.
+
+":g/pat/p" command (partly) overwrote the command. Now the output is on a
+separate line.
+
+With 'ic' and 'scs' set, a search for "Keyword", ignore-case matches were
+highlighted too.
+
+"^" on a line with only white space, put cursor beyond the end of the line.
+
+When deleting characters before where insertion started ('bs' == 2), could not
+use abbreviations.
+
+CTRL-E at end of file puts cursor below the file, in Visual mode, when 'so' is
+non-zero. CTRL-E didn't work when 'so' is big and the line below the window
+wraps. CTRL-E, when 'so' is non-zero, at end of the file, caused jumping
+up-down.
+
+":retab" didn't work well when 'list' is set.
+
+Amiga: When inserting characters at the last line on the screen, causing it
+to wrap, messed up the display. It appears that a '\n' on the last line
+doesn't always cause a scroll up.
+
+In Insert mode "0<C-D><C-D>" deleted an extra character, because Vim thought
+that the "0" was still there. (Acevedo)
+
+"z{count}l" ignored the count. Also for "zh" et. al. (Acevedo)
+
+"S" when 'autoindent' is off didn't delete leading white space.
+
+"/<Tab>" landed on the wrong character when 'incsearch' is set.
+
+Asking a yes/no question could cause a |hit-enter| prompt.
+
+When the file consists of one long line (>4100 characters), making changes
+caused various errors and a crash.
+
+DJGPP version could not save long lines (>64000) for undo.
+
+"yw" on the last char in the file didn't work. Also fixed "6x" at the end of
+the line. "6X" at the start of a line fails, but does not break a mapping. In
+general, a movement for an operator doesn't beep or flush a mapping, but when
+there is nothing to operate on it beeps (this is Vi compatible).
+
+"m'" and "m`" now set the '' mark at the cursor position.
+
+Unix: Resetting of signals for external program didn't work, because SIG_DFL
+and NULL are the same! For "!!yes|dd count=1|, the yes command kept on
+running.
+
+Partly fixed: Unix GUI: Typeahead while executing an external command was lost.
+Now it's not lost while the command is producing output.
+
+Typing <S-Tab> in Insert mode, when it isn't mapped, inserted "<S-Tab>". Now
+it works like a normal <Tab>, just like <C-Tab> and <M-Tab>.
+
+Redrawing ruler didn't check for old value correctly (caused UMR warnings in
+Purify).
+
+Negative array index in finish_viminfo_history().
+
+":g/^/d|mo $" deleted all the lines. The ":move" command now removes the
+:global mark from the moved lines.
+
+Using "vG" while the last line in the window is a "@" line, didn't update
+correctly. Just the "v" showed "~" lines.
+
+"daw" on the last char of the file, when it's a space, moved the cursor beyond
+the end of the line.
+
+When 'hlsearch' was set or reset, only the current buffer was redrawn, while
+this affects all windows.
+
+CTRL-^, positioning the cursor somewhere from 1/2 to 1 1/2 screen down the
+file, put the cursor at the bottom of the window, instead of halfway.
+
+When scrolling up for ":append" command, not all windows were updated
+correctly.
+
+When 'hlsearch' is set, and an auto-indent is highlighted, pressing <Esc>
+didn't remove the highlighting, although the indent was deleted.
+
+When 'ru' set and 'nosc', using "$j" showed a wrong ruler.
+
+Under Xfree 3.2, Shift-Tab didn't work (wrong keysym is used).
+
+Mapping <S-Tab> didn't work. Changed the key translations to use the shortest
+key code possible. This makes the termcode translations and mappings more
+consistent. Now all modifiers work in all combinations, not only with <Tab>,
+but also with <Space>, <CR>, etc.
+
+For Unix, restore three more signals. And Vim catches SIGINT now, so CTRL-C
+in Ex mode doesn't make Vim exit.
+
+""a5Y" yanked 25 lines instead of 5.
+
+"vrxxx<Esc>" in an empty line could not be undone.
+
+A CTRL-C that breaks ":make" caused the errorfile not to be read (annoying
+when you want to handle what ":make" produced so far).
+
+":0;/pat" didn't find "pat" in line 1.
+
+Search for "/test/s+1" at first char of file gave bottom-top message, or
+didn't work at all with 'nowrapscan'.
+
+Bug in viminfo history. Could cause a crash on exit.
+
+":print" didn't put cursor on first non-blank in line.
+
+":0r !cat </dev/null" left cursor in line zero, with very strange effects.
+
+With 'showcmd' set and 'timeoutlen' set to a few seconds, trick to position
+the cursor leftwards didn't work.
+
+AIX stty settings were restored to cs5 instead of cs8 (Winn).
+
+File name completion didn't work for "zsh" versions that put spaces between
+file names, instead of NULs.
+
+Changed "XawChain*" to "XtChain*", should work for more systems.
+
+Included quite a few fixes for rightleft mode (Lottem).
+
+Didn't ask to |hit-enter| when GUI is started and error messages are printed.
+
+When trying to edit a file in a non-existent directory, ended up with editing
+"No file".
+
+"gqap" to format a paragraph did too much redrawing.
+
+When 'hlsearch' set, only the current window was updated for a new search
+pattern.
+
+Sometimes error messages on startup didn't cause a |hit-enter| prompt,
+because of autocommands containing an empty line.
+
+Was possible to select part of the window in the border, below the command
+line.
+
+'< and '> marks were not at the correct position after linewise Visual
+selection.
+
+When translating a help argument to "CTRL-x", prepend or append a '_', when
+applicable.
+
+Blockwise visual mode wasn't correct when moving vertically over a special
+character (displayed as two screen characters).
+
+Renamed "struct option" to "struct vimoption" to avoid name clash with GNU
+getopt().
+
+":abclear" didn't work (but ":iabclear" and ":cabclear" did work).
+
+When 'nowrap' used, screen wasn't always updated correctly.
+
+"vim -c split file" displayed extra lines.
+
+After starting the GUI, searched the termcap for a "gui" term.
+
+When 'hls' used, search for "^$" caused a hang.
+When 'hls' was set, an error in the last regexp caused trouble.
+
+Unix: Only output an extra <EOL> on exit when outputted something in the
+alternate screen, or when there is a message that needs to be cleared.
+
+"/a\{" did strange things, depending on previous search.
+
+"c}" only redrew one line (with -u NONE).
+
+For mappings, CTRL-META-A was shown as <M-^A> instead of <MC-A>, while :map
+only accepts <MC-A>. Now <M-C-A> is shown.
+
+Unix: When using full path name in a tags file, which contains a link, and
+'hidden' set and jumping to a tag in the current file, would get bogus
+ATTENTION message. Solved by always expanding file names, even when starting
+with '/'.
+
+'hlsearch' highlighting of special characters (e.g., a TAB) didn't highlight
+the whole thing.
+
+"r<CR>" didn't work correctly on the last char of a line.
+
+Sometimes a window resize or other signal caused an endless loop, involving
+set_winsize().
+
+"vim -r" didn't work, it would just hang (using tgetent() while 'term' is
+empty).
+
+"gk" while 'nowrap' set moved two lines up.
+
+When windows are split, a message that causes a scroll-up messed up one of the
+windows, which required a CTRL-L to be typed.
+
+Possible endless loop when using shell command in the GUI.
+
+Menus defined in the .vimrc were removed when GUI started.
+
+Crash when pasting with the mouse in insert mode.
+
+Crash with ":unmenu *" in .gvimrc for Athena.
+
+"5>>" shifted 5 lines 5 times, instead of 1 time.
+
+CTRL-C when getting a prompt in ":global" didn't interrupt.
+
+When 'so' is non-zero, and moving the scrollbar completely to the bottom,
+there was a lot of flashing.
+
+GUI: Scrollbar ident must be long for DEC Alpha.
+
+Some functions called vim_regcomp() without setting reg_magic, which could
+lead to unpredictable magicness.
+
+Crash when clicking around the status line, could get a selection with a
+backwards range.
+
+When deleting more than one line characterwise, the last character wasn't
+deleted.
+
+GUI: Status line could be overwritten when moving the scrollbar quickly (or
+when 'wd' is non-zero).
+
+An ESC at the end of a ":normal" command caused a wait for a terminal code to
+finish. Now, a terminal code is not recognized when its start comes from a
+mapping or ":normal" command.
+
+Included patches from Robert Webb for GUI. Layout of the windows is now done
+inside Vim, instead of letting the layout manager do this. Makes Vim work
+with Lesstif!
+
+UMR warning in set_expand_context().
+
+Memory leak: b_winlnum list was never freed.
+
+Removed TIOCLSET/TIOCLGET code from os_unix.c. Was changing some of the
+terminal settings, and looked like it wasn't doing anything good. (suggested
+by Juergen Weigert).
+
+Ruler overwrote "is a directory" message. When starting up, and 'cmdheight'
+set to > 1, first message could still be in the last line.
+
+Removed prototype for putenv() from proto.h, it's already in osdef2.h.in.
+
+In replace mode, when moving the cursor and then backspacing, wrong characters
+were inserted.
+
+Win32 GUI was checking for a CTRL-C too often, making it slow.
+
+Removed mappings for MS-DOS that were already covered by commands.
+
+When visually selecting all lines in a file, cursor at last line, then "J".
+Gave ml_get errors. Was a problem with scrolling down during redrawing.
+
+When doing a linewise operator, and then an operator with a mouse click, it
+was also linewise, instead of characterwise.
+
+When 'list' is set, the column of the ruler was wrong.
+
+Spurious error message for "/\(b\+\)*".
+
+When visually selected many lines, message from ":w file" disappeared when
+redrawing the screen.
+
+":set <M-b>=^[b", then insert "^[b", waited for another character. And then
+inserted "<M-b>" instead of the real <M-b> character. Was trying to insert
+K_SPECIAL x NUL.
+
+CTRL-W ] didn't use count to set window height.
+
+GUI: "-font" command-line argument didn't override 'guifont' setting from
+.gvimrc. (Acevedo)
+
+GUI: clipboard wasn't used for "*y". And some more Win32/X11 differences
+fixed for the clipboard (Webb).
+
+Jumping from one help file to another help file, with 'compatible' set,
+removed the 'help' flag from the buffer.
+
+File-writable bit could be reset when using ":w!" for a readonly file.
+
+There was a wait for CTRL-O n in Insert mode, because the search pattern was
+shown.
+Reduced wait, to allow reading a message, from 10 to 3 seconds. It seemed
+nothing was happening.
+
+":recover" found same swap file twice.
+
+GUI: "*yy only worked the second time (when pasting to an xterm)."
+
+DJGPP version (dos32): The system flags were cleared.
+
+Dos32 version: Underscores were sometimes replaced with y-umlaut (Levin).
+
+Version 4.1 of ncurses can't handle tputs("", ..). Avoid calling tputs() with
+an empty string.
+
+<S-Tab> in the command-line worked like CTRL-P when no completion started yet.
+Now it does completion, last match first.
+
+Unix: Could get annoying "can't write viminfo" message after doing "su". Now
+the viminfo file is overwritten, and the user set back to the original one.
+
+":set term=builtin_gui" started the GUI in a wrong way. Now it's not
+allowed anymore. But "vim -T gui" does start the GUI correctly now.
+
+GUI: Triple click after a line only put last char in selection, when it is a
+single character word.
+
+When the window is bigger than the screen, the scrolling up of messages was
+wrong (e.g. ":vers", ":hi"). Also when the bottom part of the window was
+obscured by another window.
+
+When using a wrong option only an error message is printed, to avoid that the
+usage information makes it scroll off the screen.
+
+When exiting because of not being able to read from stdin, didn't preserve the
+swap files properly.
+
+Visual selecting all chars in more than one line, then hit "x" didn't leave an
+empty line. For one line it did leave an empty line.
+
+Message for which autocommand is executing messed up file write message (for
+FileWritePost event).
+
+"vim -h" included "-U" even when GUI is not available, and "-l" when lisp is
+not available.
+
+Crash for ":he <C-A>" (command-line longer than screen).
+
+":s/this/that/gc", type "y" two times, then undo, did reset the modified
+option, even though the file is still modified.
+
+Empty lines in a tags file caused a ":tag" to be aborted.
+
+When hitting 'q' at the more prompt for ":menu", still scrolled a few lines.
+
+In an xterm that uses the bold trick a single row of characters could remain
+after an erased bold character. Now erase one extra char after the bold char,
+like for the GUI.
+
+":pop!" didn't work.
+
+When the reading a buffer was interrupted, ":w" should not be able to
+overwrite the file, ":w!" is required.
+
+":cf%" caused a crash.
+
+":gui longfilename", when forking is enabled, could leave part of the
+longfilename at the shell prompt.
+
+==============================================================================
+VERSION 5.1 *version-5.1*
+
+Improvements made between version 5.0 and 5.1.
+
+This was mostly a bug-fix release, not many new features.
+
+
+Changed *changed-5.1*
+-------
+
+The expand() function now separates file names with <NL> instead of a space.
+This avoids problems for file names with embedded spaces. To get the old
+result, use substitute(expand(foo), "\n", " ", "g").
+
+For Insert-expanding dictionaries allow a backslash to be used for
+wildchars. Allows expanding "ze\kra", when 'isk' includes a backslash.
+
+New icon for the Win32 GUI.
+
+":tag", ":tselect" etc. only use the argument as a regexp when it starts
+with '/'. Avoids that ":tag xx~" gives an error message: "No previous sub.
+regexp". Also, when the :tag argument contained wildcard characters, it was
+not Vi compatible.
+When using '/', the argument is taken literally too, with a higher priority,
+so it's found before wildcard matches.
+Only when the '/' is used are matches with different case found, even though
+'ignorecase' isn't set.
+Changed "g^]" to only do ":tselect" when there is more than on matching tag.
+
+Changed some of the default colors, because they were not very readable on a
+dark background.
+
+A character offset to a search pattern can move the cursor to the next or
+previous line. Also fixes that "/pattern/e+2" got stuck on "pattern" at the
+end of a line.
+
+Double-clicks in the status line do no longer start Visual mode. Dragging a
+status line no longer stops Visual mode.
+
+Perl interface: Buffers() and Windows() now use more logical arguments, like
+they are used in the rest of Vim (Moore).
+
+Init '" mark to the first character of the first line. Makes it possible to
+use '" in an autocommand without getting an error message.
+
+
+Added *added-5.1*
+-----
+
+"shell_error" internal variable: result of last shell command.
+
+":echohl" command: Set highlighting for ":echo".
+
+'S' flag in 'highlight' and StatusLineNC highlight group: highlighting for
+status line of not-current window. Default is to use bold for current
+window.
+
+Added buffer_name() and buffer_number() functions (Aaron).
+Added flags argument "g" to substitute() function (Aaron).
+Added winheight() function.
+
+Win32: When an external command starts with "start ", no console is opened
+for it (Aaron).
+
+Win32 console: Use termcap codes for bold/reverse based on the current
+console attributes.
+
+Configure check for "strip". (Napier)
+
+CTRL-R CTRL-R x in Insert mode: Insert the contents of a register literally,
+instead of as typed.
+
+Made a few "No match" error messages more informative by adding the pattern
+that didn't match.
+
+"make install" now also copies the macro files.
+
+tools/tcltags, a shell script to generate a tags file from a TCL file.
+
+"--with-tlib" setting for configure. Easy way to use termlib: "./configure
+--with-tlib=termlib".
+
+'u' flag in 'cino' for setting the indent for contained () parts.
+
+When Win32 OLE version can't load the registered type library, ask the user
+if he wants to register Vim now. (Erhardt)
+Win32 with OLE: When registered automatically, exit Vim.
+Included VisVim 1.1b, with a few enhancements and the new icon (Heiko
+Erhardt).
+
+Added patch from Vince Negri for Win32s support. Needs to be compiled with
+VC 4.1!
+
+Perl interface: Added $curbuf. Rationalized Buffers() and Windows().
+(Moore) Added "group" argument to Msg().
+
+Included Perl files in DOS source archive. Changed Makefile.bor and
+Makefile.w32 to support building a Win32 version with Perl included.
+
+Included new Makefile.w32 from Ken Scott. Now it's able to make all Win32
+versions, including OLE, Perl and Python.
+
+Added CTRL-W g ] and CTRL-W g ^]: split window and do g] or g^].
+
+Added "g]" to always do ":tselect" for the ident under the cursor.
+Added ":tjump" and ":stjump" commands.
+Improved listing of ":tselect" when tag names are a bit long.
+
+Included patches for the Macintosh version. Also for Python interface.
+(St-Amant)
+
+":buf foo" now also restores cursor column, when the buffer was used before.
+
+Adjusted the Makefile for different final destinations for the syntax files
+and scripts (for Debian Linux).
+
+Amiga: $VIM can be used everywhere. When $VIM is not defined, "VIM:" is
+used. This fixes that "VIM:" had to be assigned for the help files, and
+$VIM set for the syntax files. Now either of these work.
+
+Some xterms send vt100 compatible function keys F1-F4. Since it's not
+possible to detect this, recognize both type of keys and translate them to
+<F1> - <F4>.
+
+Added "VimEnter" autocommand. Executed after loading all the startup stuff.
+
+BeOS version now also runs on Intel CPUs (Seibert).
+
+
+Fixed *fixed-5.1*
+-----
+
+":ts" changed position in the tag stack when cancelled with <CR>.
+":ts" changed the cursor position for CTRL-T when cancelled with <CR>.
+":tn" would always jump to the second match. Was using the wrong entry in
+the tag stack.
+Doing "tag foo", then ":tselect", overwrote the original cursor position in
+the tag stack.
+
+"make install" changed the vim.1 manpage in a wrong way, causing "doc/doc"
+to appear for the documentation files.
+
+When compiled with MAX_FEAT, xterm mouse handling failed. Was caused by DEC
+mouse handling interfering.
+
+Was leaking memory when using selection in X11.
+
+CTRL-D halfway a command-line left some characters behind the first line(s)
+of the listing.
+
+When expanding directories for ":set path=", put two extra backslashes
+before a space in a directory name.
+
+When 'lisp' set, first line of a function would be indented. Now its indent
+is set to zero. And use the indent of the first previous line that is at
+the same () level. Added test33.
+
+"so<Esc>u" in an empty file didn't work.
+
+DOS: "seek error in swap file write" errors, when using DOS 6.2 share.exe,
+because the swap file was made hidden. It's no longer hidden.
+
+":global" command would sometimes not execute on a matching line. Happened
+when a data block is full in ml_replace().
+
+For AIX use a tgetent buffer of 2048 bytes, instead of 1024.
+
+Win32 gvim now only sets the console size for external commands to 25x80
+on Windows 95, not on NT.
+
+Win32 console: Dead key could cause a crash, because of a missing "WINAPI"
+(Deshpande).
+
+The right mouse button started Visual mode, even when 'mouse' is empty, and
+in the command-line, a left click moved the cursor when 'mouse' is empty.
+In Visual mode, 'n' in 'mouse' would be used instead of 'v'.
+
+A blinking cursor or focus change cleared a non-Visual selection.
+
+CTRL-Home and CTRL-End didn't work for MS-DOS versions.
+
+Could include NUL in 'iskeyword', causing a crash when doing insert mode
+completion.
+
+Use _dos_commit() to flush the swap file to disk for MSDOS 16 bit version.
+
+In mappings, CTRL-H was replaced by the backspace key code. This caused
+problems when it was used as text, e.g. ":map _U :%s/.^H//g<CR>".
+
+":set t_Co=0" was not handled like a normal term. Now it's translated into
+":set t_Co=", which works.
+
+For ":syntax keyword" the "transparent" option did work, although not
+mentioned in the help. But synID() returned wrong name.
+
+"gqG" in a file with one-word-per-line (e.g. a dictionary) was very slow and
+not interruptible.
+
+"gq" operator inserted screen lines in the wrong situation. Now screen
+lines are inserted or deleted when this speeds up displaying.
+
+cindent was wrong when an "if" contained "((".
+
+'r' flag in 'viminfo' was not used for '%'. Could get files in the buffer
+list from removable media.
+
+Win32 GUI with OLE: if_ole_vc.mak could not be converted into a project.
+Hand-edited to fix this...
+
+With 'nosol' set, doing "$kdw" below an empty line positioned the cursor at
+the end of the line.
+
+Dos32 version changed "\dir\file" into "/dir/file", to work around a DJGPP
+bug. That bug appears to have been fixed, therefore this translation has
+been removed.
+
+"/^*" didn't work (find '*' in first column).
+
+"<afile>" was not always set for autocommands. E.g., for ":au BufEnter *
+let &tags = expand("<afile>:p:h") . "/tags".
+
+In an xterm, the window may be a child of the outer xterm window. Use the
+parent window when getting the title and icon names. (Smith)
+
+When starting with "gvim -bg black -fg white", the value of 'background' is
+only set after reading the .gvimrc file. This causes a ":syntax on" to use
+the wrong colors. Now allow using ":gui" to open the GUI window and set the
+colors. Previously ":gui" in a gvimrc crashed Vim.
+
+tempname() returned the same name all the time, unless the file was actually
+created. Now there are at least 26 different names.
+
+File name used for <afile> was sometimes full path, sometimes file name
+relative to current directory.
+
+When 'background' was set after the GUI window was opened, it could change
+colors that were set by the user in the .gvimrc file. Now it only changes
+colors that have not been set by the user.
+
+Ignore special characters after a CSI in the GUI version. These could be
+interpreted as special characters in a wrong way. (St-Amant)
+
+Memory leak in farsi code, when using search or ":s" command.
+Farsi string reversing for a mapping was only done for new mappings. Now it
+also works for replacing a mapping.
+
+Crash in Win32 when using a file name longer than _MAX_PATH. (Aaron)
+
+When BufDelete autocommands were executed, some things for the buffer were
+already deleted (esp. Perl stuff).
+
+Perl interface: Buffer specific items were deleted too soon; fixes "screen
+no longer exists" messages. (Moore)
+
+The Perl functions didn't set the 'modified' flag.
+
+link.sh did not return an error on exit, which may cause Vim to start
+installing, even though there is no executable to install. (Riehm)
+
+Vi incompatibility: In Vi "." redoes the "y" command. Added the 'y' flag to
+'cpoptions'. Only for 'compatible' mode.
+
+":echohl" defined a new group, when the argument was not an existing group.
+
+"syn on" and ":syn off" could move the cursor, if there is a hidden buffer
+that is shorter that the current cursor position.
+
+The " mark was not set when doing ":b file".
+
+When a "nextgroup" is used with "skipwhite" in syntax highlighting, space at
+the end of the line made the nextgroup also be found in the next line.
+
+":he g<CTRL-D>", then ":" and backspace to the start didn't redraw.
+
+X11 GUI: "gvim -rv" reversed the colors twice on Sun. Now Vim checks if the
+result is really reverse video (background darker than foreground).
+
+"cat link.sh | vim -" didn't set syntax highlighting.
+
+Win32: Expanding "file.sw?" matched ".file.swp". This is an error of
+FindnextFile() that we need to work around. (Kilgore)
+
+"gqgq" gave an "Invalid lnum" error on the last line.
+Formatting with "gq" didn't format the first line after a change of comment
+leader.
+
+There was no check for out-of-memory in win_alloc().
+
+"vim -h" didn't mention "-register" and "-unregister" for the OLE version.
+
+Could not increase 'cmdheight' when the last window is only one line. Now
+other windows are also made smaller, when necessary.
+
+Added a few {} to avoid "suggest braces around" warnings from gcc 2.8.x.
+Changed return type of main() from void to int. (Nam)
+
+Using '~' twice in a substitute pattern caused a crash.
+
+"syn on" and ":syn off" could scroll the window, if there is a hidden buffer
+that is shorter that the current cursor position.
+
+":if 0 | if 1 | endif | endif" didn't work. Same for ":while" and "elseif".
+
+With two windows on modified files, with 'autowrite' set, cursor in second
+window, ":qa" gave a warning for the file in the first window, but then
+auto-wrote the file in the second window. (Webb)
+
+Win32 GUI scrollbar could only handle 32767 lines. Also makes the
+intellimouse wheel use the configurable number of scrolls. (Robinson)
+
+When using 'patchmode', and the backup file is on another partition, the file
+copying messed up the write-file message.
+
+GUI X11: Alt-Backspace and Alt-Delete didn't work.
+
+"`0" could put the cursor after the last character in the line, causing
+trouble for other commands, like "i".
+
+When completing tags in insert mode with ^X^], some matches were skipped,
+because the compare with other tags was wrong. E.g., when "mnuFileSave" was
+already there, "mnuFile" would be skipped. (Negri)
+
+When scrolling up/down, a syntax item with "keepend" didn't work properly.
+Now the flags are also stored for the syntax state at the start of each line.
+
+When 'ic' was changed while 'hlsearch' is on, there was no redraw to show the
+effect.
+
+Win32 GUI: Don't display "No write since last chance" in a message box, but in
+the Vim window.
+
+==============================================================================
+VERSION 5.2 *version-5.2*
+
+Improvements made between version 5.1 and 5.2.
+
+
+Long lines editable *long-lines*
+-------------------
+
+A single long line that doesn't fit in the window doesn't show a line of @@@
+anymore. Redrawing starts at a character further on in the line, such that
+the text around the cursor can be seen. This makes it possible to edit these
+long lines when wrapping is on.
+
+
+File browser added *file-browser-5.2*
+------------------
+
+The Win32, Athena and Motif GUI bring up a file requester if the user asks to
+":browse" for the ":e", ":w", ":r", ":so", ":redirect" and
+":mkexrc/vimrc/vsess" commands. ":browse e /foo/bar" opens the requester in
+the /foo/bar directory, so you can have nice mapping rhs's like ":browse so
+$vim/macros". If no initial dir specified for ":browse e", can be compiled to
+either begin in the current directory, or that of the current buffer. (Negri
+and Kahn)
+Added the 'browsedir' option, with value "current", "last" or "buffer". Tells
+whether a browse dialog starts in last used dir, dir of current buffer, or
+current dir. ":browse w" is unaffected.
+The default menus have been changed to use the ":browse" command.
+
+
+Dialogs added *dialogs-added*
+-------------
+
+Added the ":confirm" command. Works on ":e", ":q", ":w", ":cl". Win32,
+Athena and Motif GUI uses a window-dialog. All other platforms can use
+prompt in command-line. ":confirm qa" offers a choice to save all modified
+files.
+
+confirm() function: allows user access to the confirm engine.
+
+Added 'v' flag to 'guioptions'. When included, a vertical button layout is
+always used for the Win32 GUI dialog. Otherwise, a horizontal layout is
+preferred.
+
+Win32 GUI: ":promptfind" and ":promptrepl" pop up a dialog to find/replace.
+To be used from a menu entry. (Negri)
+
+
+Popup menu added *popup-menu-added*
+----------------
+
+When the 'mousemodel' option is set to "popup", the right mouse button
+displays the top level menu headed with "PopUp" as pop-up context menu. The
+"PopUp" menu is not displayed in the normal menu bar. This currently only
+works for Win32 and Athena GUI.
+
+
+Select mode added *new-Select-mode*
+-----------------
+
+A new mode has been added: "Select mode". It is like Visual mode, but typing
+a printable character replaces the selection.
+- CTRL-G can be used to toggle between Visual mode and Select mode.
+- CTRL-O can be used to switch from Select mode to Visual mode for one command.
+- Added 'selectmode' option: tells when to start Select mode instead of Visual
+ mode.
+- Added 'mousemodel' option: Change use of mouse buttons.
+- Added 'keymodel' option: tells to use shifted special keys to start a
+ Visual or Select mode selection.
+- Added ":behave". Can be used to quickly set 'selectmode', 'mousemodel'
+ and 'keymodel' for MS-Windows and xterm behavior.
+- The xterm-like selection is now called modeless selection.
+- Visual mode mappings and menus are used in Select mode. They automatically
+ switch to Visual mode first. Afterwards, reselect the area, unless it was
+ deleted. The "gV" command can be used in a mapping to skip the reselection.
+- Added the "gh", "gH" and "g^H" commands: start Select (highlight) mode.
+- Backspace in Select mode deletes the selected area.
+
+"mswin.vim" script. Sets behavior mostly like MS-Windows.
+
+
+Session files added *new-session-files*
+-------------------
+
+":mks[ession]" acts like "mkvimrc", but also writes the full filenames of the
+currently loaded buffers and current directory, so that :so'ing the file
+re-loads those files and cd's to that directory. Also stores and restores
+windows. File names are made relative to session file.
+The 'sessionoptions' option sets behavior of ":mksession". (Negri)
+
+
+User defined functions and commands *new-user-defined*
+-----------------------------------
+
+Added user defined functions. Defined with ":function" until ":endfunction".
+Called with "Func()". Allows the use of a variable number of arguments.
+Included support for local variables "l:name". Return a value with ":return".
+See |:function|.
+Call a function with ":call". When using a range, the function is called for
+each line in the range. |:call|
+"macros/justify.vim" is an example of using user defined functions.
+User functions do not change the last used search pattern or the command to be
+redone with ".".
+'maxfuncdepth' option. Restricts the depth of function calls. Avoids trouble
+(crash because of out-of-memory) when a function uses endless recursion.
+
+User definable Ex commands: ":command", ":delcommand" and ":comclear".
+(Moore) See |user-commands|.
+
+
+New interfaces *interfaces-5.2*
+--------------
+
+Tcl interface. (Wilken) See |tcl|.
+Uses the ":tcl", ":tcldo" and "tclfile" commands.
+
+Cscope support. (Kahn) (Sekera) See |cscope|.
+Uses the ":cscope" and ":cstag" commands. Uses the options 'cscopeprg',
+'cscopetag', 'cscopetagorder' and 'cscopeverbose'.
+
+
+New ports *ports-5.2*
+---------
+
+Amiga GUI port. (Nielsen) Not tested much yet!
+
+RISC OS version. (Thomas Leonard) See |riscos|.
+This version can run either with a GUI or in text mode, depending upon where
+it is invoked.
+Deleted the "os_archie" files, they were not working anyway.
+
+
+Multi-byte support *new-multi-byte* *new-multibyte*
+------------------
+
+MultiByte support for Win32 GUI. (Baek)
+The 'fileencoding' option decides how the text in the file is encoded.
+":ascii" works for multibyte characters. Multi-byte characters work on
+Windows 95, even when using the US version. (Aaron)
+Needs to be enabled in feature.h.
+This has not been tested much yet!
+
+
+New functions *new-functions-5.2*
+-------------
+
+|browse()| puts up a file requester when available. (Negri)
+|escape()| escapes characters in a string with a backslash.
+|fnamemodify()| modifies a file name.
+|input()| asks the user to enter a line. (Aaron) There is a separate
+ history for lines typed for the input() function.
+|argc()|
+|argv()| can be used to access the argument list.
+|winbufnr()| buffer number of a window. (Aaron)
+|winnr()| window number. (Aaron)
+|matchstr()| Return matched string.
+|setline()| Set a line to a string value.
+
+
+New options *new-options-5.2*
+-----------
+
+'allowrevins' Enable the CTRL-_ command in Insert and Command-line mode.
+'browsedir' Tells in which directory a browse dialog starts.
+'confirm' when set, :q :w and :e commands always act as if ":confirm"
+ is used. (Negri)
+'cscopeprg'
+'cscopetag'
+'cscopetagorder'
+'cscopeverbose' Set the |cscope| behavior.
+'filetype' RISC-OS specific type of file.
+'grepformat'
+'grepprg' For the |:grep| command.
+'keymodel' Tells to use shifted special keys to start a Visual or Select
+ mode selection.
+'listchars' Set character to show in 'list' mode for end-of-line, tabs and
+ trailing spaces. (partly by Smith) Also sets character to
+ display if a line doesn't fit when 'nowrap' is set.
+'matchpairs' Allows matching '<' with '>', and other single character
+ pairs.
+'mousefocus' Window focus follows mouse (partly by Terhaar). Changing the
+ focus with a keyboard command moves the pointer to that
+ window. Also move the pointer when changing the window layout
+ (split window, change window height, etc.).
+'mousemodel' Change use of mouse buttons.
+'selection' When set to "inclusive" or "exclusive", the cursor can go one
+ character past the end of the line in Visual or Select mode.
+ When set to "old" the old behavior is used. When
+ "inclusive", the character under the cursor is included in the
+ operation. When using "exclusive", the new "ve" entry of
+ 'guicursor' is used. The default is a vertical bar.
+'selectmode' Tells when to start Select mode instead of Visual mode.
+'sessionoptions' Sets behavior of ":mksession". (Negri)
+'showfulltag' When completing a tag in Insert mode, show the tag search
+ pattern (tidied up) as a choice as well (if there is one).
+'swapfile' Whether to use a swap file for a buffer.
+'syntax' When it is set, the syntax by that name is loaded. Allows for
+ setting a specific syntax from a modeline.
+'ttymouse' Allows using xterm mouse codes for terminals which name
+ doesn't start with "xterm".
+'wildignore' List of patterns for files that should not be completed at
+ all.
+'wildmode' Can be used to set the type of expansion for 'wildchar'.
+ Replaces the CTRL-T command for command line completion.
+ Don't beep when listing all matches.
+'winaltkeys' Win32 and Motif GUI. When "yes", ALT keys are handled
+ entirely by the window system. When "no", ALT keys are never
+ used by the window system. When "menu" it depends on whether
+ a key is a menu shortcut.
+'winminheight' Minimal height for each window. Default is 1. Set to 0 if
+ you want zero-line windows. Scrollbar is removed for
+ zero-height windows. (Negri)
+
+
+
+New Ex commands *new-ex-commands-5.2*
+---------------
+
+|:badd| Add file name to buffer list without side effects. (Negri)
+|:behave| Quickly set MS-Windows or xterm behavior.
+|:browse| Use file selection dialog.
+|:call| Call a function, optionally with a range.
+|:cnewer|
+|:colder| To access a stack of quickfix error lists.
+|:comclear| Clear all user-defined commands.
+|:command| Define a user command.
+|:continue| Go back to ":while".
+|:confirm| Ask confirmation if something unexpected happens.
+|:cscope| Execute cscope command.
+|:cstag| Use cscope to jump to a tag.
+|:delcommand| Delete a user-defined command.
+|:delfunction| Delete a user-defined function.
+|:endfunction| End of user-defined function.
+|:function| Define a user function.
+|:grep| Works similar to ":make". (Negri)
+|:mksession| Create a session file.
+|:nohlsearch| Stop 'hlsearch' highlighting for a moment.
+|:Print| This is Vi compatible. Does the same as ":print".
+|:promptfind| Search dialog (Win32 GUI).
+|:promptrepl| Search/replace dialog (Win32 GUI).
+|:return| Return from a user-defined function.
+|:simalt| Win32 GUI: Simulate alt-key pressed. (Negri)
+|:smagic| Like ":substitute", but always use 'magic'.
+|:snomagic| Like ":substitute", but always use 'nomagic'.
+|:tcl| Execute TCL command.
+|:tcldo| Execute TCL command for a range of lines.
+|:tclfile| Execute a TCL script file.
+|:tearoff| Tear-off a menu (Win32 GUI).
+|:tmenu|
+|:tunmenu| Win32 GUI: menu tooltips. (Negri)
+|:star| :* Execute a register.
+
+
+Changed *changed-5.2*
+-------
+
+Renamed functions:
+ buffer_exists() -> bufexists()
+ buffer_name() -> bufname()
+ buffer_number() -> bufnr()
+ file_readable() -> filereadable()
+ highlight_exists() -> hlexists()
+ highlightID() -> hlID()
+ last_buffer_nr() -> bufnr("$")
+The old ones are still there, for backwards compatibility.
+
+The CTRL-_ command in Insert and Command-line mode is only available when the
+new 'allowrevins' option is set. Avoids that people who want to type SHIFT-_
+accidentally enter reverse Insert mode, and don't know how to get out.
+
+When a file name path in ":tselect" listing is too long, remove a part in the
+middle and put "..." there.
+
+Win32 GUI: Made font selector appear inside Vim window, not just any odd
+place. (Negri)
+
+":bn" skips help buffers, unless currently in a help buffer. (Negri)
+
+When there is a status line and only one window, don't show '^' in the status
+line of the current window.
+
+":*" used to be used for "'<,'>", the Visual area. But in Vi it's used as an
+alternative for ":@". When 'cpoptions' includes '*' this is Vi compatible.
+
+When 'insertmode' is set, using CTRL-O to execute a mapping will work like
+'insertmode' was not set. This allows "normal" mappings to be used even when
+'insertmode' is set.
+
+When 'mouse' was set already (e.g., in the .vimrc file), don't automatically
+set 'mouse' when the GUI starts.
+
+Removed the 'N', 'I' and 'A' flags from the 'mouse' option.
+
+Renamed "toggle option" to "boolean option". Some people thought that ":set
+xyz" would toggle 'xyz' on/off each time.
+
+The internal variable "shell_error" contains the error code from the shell,
+instead of just 0 or 1.
+
+When inserting or replacing, typing CTRL-V CTRL-<CR> used to insert "<C-CR>".
+That is not very useful. Now the CTRL key is ignored and a <CR> is inserted.
+Same for all other "normal" keys with modifiers. Mapping these modified key
+combinations is still possible.
+In Insert mode, <C-CR> and <S-Space> can be inserted by using CTRL-K and then
+the special character.
+
+Moved "quotes" file to doc/quotes.txt, and "todo" file to doc/todo.txt. They
+are now installed like other documentation files.
+
+winheight() function returns -1 for a non-existing window. It used to be
+zero, but that is a valid height now.
+
+The default for 'selection' is "inclusive", which makes a difference when
+using "$" or the mouse to move the cursor in Visual mode.
+
+":q!" does not exit when there are changed buffers which are hidden. Use
+":qa!" to exit anyway.
+
+Disabled the Perl/Python/Tcl interfaces by default. Not many people use them
+and they make the executable a lot bigger. The internal scripting language is
+now powerful enough for most tasks.
+
+The strings from the 'titlestring' and 'iconstring' options are used
+untranslated for the Window title and icon. This allows for including a <CR>.
+Previously a <CR> would be shown as "^M" (two characters).
+
+When a mapping is started in Visual or Select mode which was started from
+Insert mode (the mode shows "(insert) Visual"), don't return to Insert mode
+until the mapping has ended. Makes it possible to use a mapping in Visual
+mode that also works when the Visual mode was started from Select mode.
+
+Menus in $VIMRUNTIME/menu.vim no longer overrule existing menus. This helps
+when defining menus in the .vimrc file, or when sourcing mswin.vim.
+
+Unix: Use /var/tmp for .swp files, if it exists. Files there survive a
+reboot (at least on Linux).
+
+
+Added *added-5.2*
+-----
+
+--with-motif-lib configure argument. Allows for using a static Motif library.
+
+Support for mapping numeric keypad +,-,*,/ keys. (Negri)
+When not mapped, they produce the normal character.
+
+Win32 GUI: When directory dropped on gVim, cd there and edit new buffer.
+(Negri)
+
+Win32 GUI: Made CTRL-Break work as interrupt, so that CTRL-C can be
+used for mappings.
+
+In the output of ":map", highlight the "*" to make clear it's not part of the
+rhs. (Roemer)
+
+When showing the Visual area, the cursor is not switched off, so that it can
+be located. The Visual area is now highlighted with a grey background in the
+GUI. This makes the cursor visible when it's also reversed.
+
+Win32: When started with single full pathname (e.g. via double-clicked file),
+cd to that file's directory. (Negri)
+
+Win32 GUI: Tear-off menus, with ":tearoff <menu-name>" command. (Negri)
+'t' option to 'guioptions': Add tearoff menu items for Win32 GUI and Motif.
+It's included by default.
+Win32 GUI: tearoff menu with submenus is indicated with a ">>". (Negri)
+
+Added ^Kaa and ^KAA digraphs.
+Added "euro" symbol to digraph.c. (Corry)
+
+Support for Motif menu shortcut keys, using '&' like MS-Windows (Ollis).
+Other GUIs ignore '&' in a menu name.
+
+DJGPP: Faster screen updating (John Lange).
+
+Clustering of syntax groups ":syntax cluster" (Bigham).
+Including syntax files: ":syntax include" (Bigham).
+
+Keep column when switching buffers, when 'nosol' is set (Radics).
+
+Number function for Perl interface.
+
+Support for Intellimouse in Athena GUI. (Jensen)
+
+":sleep" also accepts an argument in milliseconds, when "m" is used.
+
+Added 'p' flag in 'guioptions': Install callbacks for enter/leave window
+events. Makes cursor blinking work for Terhaar, breaks it for me.
+
+"--help" and "--version" command-line arguments.
+
+Non-text in ":list" output is highlighted with NonText.
+
+Added text objects: "i(" and "i)" as synonym for "ib". "i{" and "i}" as
+synonym for "iB". New: "i<" and "i>", to select <thing>. All this also for
+"a" objects.
+
+'O' flag in 'shortmess': message for reading a file overwrites any previous
+message. (Negri)
+
+Win32 GUI: 'T' flag in 'guioptions': switch toolbar on/off.
+Included a list with self-made toolbar bitmaps. (Negri)
+
+Added menu priority for sub-menus. Implemented for Win32 and Motif GUI.
+Display menu priority with ":menu" command.
+Default and Syntax menus now include priority for items. Allows inserting
+menu items in between the default ones.
+
+When the 'number' option is on, highlight line numbers with the LineNr group.
+
+"Ignore" highlight group: Text highlighted with this is made blank. It is
+used to hide special characters in the help text.
+
+Included Exuberant Ctags version 2.3, with C++ support, Java support and
+recurse into directories. (Hiebert)
+
+When a tags file is not sorted, and this is detected (in a simplistic way), an
+error message is given.
+
+":unlet" accepts a "!", to ignore non-existing variables, and accepts more
+than one argument. (Roemer)
+Completion of variable names for ":unlet". (Roemer)
+
+When there is an error in a function which is called by another function, show
+the call stack in the error message.
+
+New file name modifiers:
+":.": reduce file name to be relative to current dir.
+":~": reduce file name to be relative to home dir.
+":s?pat?sub?": substitute "pat" with "sub" once.
+":gs?pat?sub?": substitute "pat" with "sub" globally.
+
+New configure arguments: --enable-min-features and --enable-max-features.
+Easy way to switch to minimum or maximum features.
+
+New compile-time feature: modify_fname. For file name modifiers, e.g,
+"%:p:h". Can be disabled to save some code (16 bit DOS).
+
+When using whole-line completion in Insert mode, and 'cindent' is set, indent
+the line properly.
+
+MSDOS and Win32 console: 'guicursor' sets cursor thickness. (Negri)
+
+Included new set of Farsi fonts. (Shiran)
+
+Accelerator text now also works in Motif. All menus can be defined with & for
+mnemonic and TAB for accelerator text. They are ignored on systems that don't
+support them.
+When removing or replacing a menu, compare the menu name only up to the <Tab>
+before the mnemonic.
+
+'i' and 'I' flags after ":substitute": ignore case or not.
+
+"make install" complains if the runtime files are missing.
+
+Unix: When finding an existing swap file that can't be opened, mention the
+owner of the file in the ATTENTION message.
+
+The 'i', 't' and 'k' options in 'complete' now also print the place where they
+are looking for matches. (Acevedo)
+
+"gJ" command: Join lines without inserting a space.
+
+Setting 'keywordprg' to "man -s" is handled specifically. The "-s" is removed
+when no count given, the count is added otherwise. Configure checks if "man
+-s 2 read" works, and sets the default for 'keywordprg' accordingly.
+
+If you do a ":bd" and there is only one window open, Vim tries to move to a
+buffer of the same type (i.e. non-help to non-help, help to help), for
+consistent behavior to :bnext/:bprev. (Negri)
+
+Allow "<Nop>" to be used as the rhs of a mapping. ":map xx <Nop>", maps "xx"
+to nothing at all.
+
+In a ":menu" command, "<Tab>" can be used instead of a real tab, in the menu
+path. This makes it more easy to type, no backslash needed.
+
+POSIX compatible character classes for regexp patterns: [:alnum:], [:alpha:],
+[:blank:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:],
+[:space:], [:upper:] and [:xdigit:]. (Briscoe)
+
+regexp character classes (for fast syntax highlight matching):
+ digits: \d [0-9] \D not digit (Roemer)
+ hex: \x [0-9a-fA-F] \X not hex
+ octal: \o [0-7] \O not octal
+ word: \w [a-zA-Z0-9_] \W not word
+ head: \h [a-zA-Z_] \H not head
+ alphabetic: \a [a-zA-Z] \A not alphabetic
+ lowercase: \l [a-z] \L not lowercase
+ uppercase: \u [A-Z] \U not uppercase
+
+":set" now accepts "+=", |^=" and "-=": add or remove parts of a string
+option, add or subtract a number from a number option. A comma is
+automagically inserted or deleted for options that are a comma-separated list.
+
+Filetype feature, for autocommands. Uses a file type instead of a pattern to
+match a file. Currently only used for RISC OS. (Leonard)
+
+In a pattern for an autocommand, environment variables can be used. They are
+expanded when the autocommand is defined.
+
+"BufFilePre" and "BufFilePost" autocommand evens: Before and after applying
+the ":file" command to change the name of a buffer.
+"VimLeavePre" autocommand event: before writing the .viminfo file.
+
+For autocommands argument: <abuf> is buffer number, like <afile>.
+
+Made syntax highlighting a bit faster when scrolling backwards, by keeping
+more syncing context.
+
+Win32 GUI: Made scrolling faster by avoiding a redraw when deleting or
+inserting screen lines.
+
+GUI: Made scrolling faster by not redrawing the scrollbar when the thumb moved
+less than a pixel.
+
+Included ":highlight" in bugreport.vim.
+
+Created install.exe program, for simplistic installation on DOS and
+MS-Windows.
+
+New register: '_', the black hole. When writing to it, nothing happens. When
+reading from it, it's always empty. Can be used to avoid a delete or change
+command to modify the registers, or reduce memory use for big changes.
+
+CTRL-V xff enters character by hex number. CTRL-V o123 enters character by
+octal number. (Aaron)
+
+Improved performance of syntax highlighting by skipping check for "keepend"
+when there isn't any.
+
+Moved the mode message ("-- INSERT --") to the last line of the screen. When
+'cmdheight' is more than one, messages will remain readable.
+
+When listing matching files, they are also sorted on 'suffixes', such that
+they are listed in the same order as CTRL-N retrieves them.
+
+synIDattr() takes a third argument (optionally), which tells for which
+terminal type to get the attributes for. This makes it possible to run
+2html.vim outside of gvim (using color names instead of #RRGGBB).
+
+Memory profiling, only for debugging. Prints at exit, and with "g^A" command.
+(Kahn)
+
+DOS: When using a file in the current drive, remove the drive name:
+"A:\dir\file" -> "\dir\file". This helps when moving a session file on a
+floppy from "A:\dir" to "B:\dir".
+
+Increased number of remembered jumps from 30 to 50 per window.
+
+Command to temporarily disable 'hls' highlighting until the next search:
+":nohlsearch".
+
+"gp" and "gP" commands: like "p" and "P", but leave the cursor just after the
+inserted text. Used for the CTRL-V command in MS-Windows mode.
+
+
+Fixed *fixed-5.2*
+-----
+
+Win32 GUI: Could draw text twice in one place, for fake-bold text. Removed
+this, Windows will handle the bold text anyway. (Negri)
+
+patch 5.1.1: Win32s GUI: pasting caused a crash (Negri)
+
+patch 5.1.2: When entering another window, where characters before the cursor
+have been deleted, could have a cursor beyond the end of the line.
+
+patch 5.1.3: Win32s GUI: Didn't wait for external command to finish. (Negri)
+
+patch 5.1.4: Makefile.w32 can now also be used to generate the OLE version
+(Scott).
+
+patch 5.1.5: Crashed when using syntax highlighting: cursor on a line that
+doesn't fit in the window, and splitting that line in two.
+
+patch 5.1.6: Visual highlighting bug: After ":set nowrap", go to end of line
+(so that the window scrolls horizontally), ":set wrap". Following Visual
+selection was wrong.
+
+patch 5.1.7: When 'tagbsearch' off, and 'ignorecase' off, still could do
+binary searching.
+
+patch 5.1.8: Win32 GUI: dragging the scrollbar didn't update the ruler.
+
+patch 5.1.9: Using ":gui" in .vimrc, caused xterm cursor to disappear.
+
+patch 5.1.10: A CTRL-N in Insert mode could cause a crash, when a buffer
+without a name exists.
+
+patch 5.1.11: "make test" didn't work in the shadow directory. Also adjusted
+"make shadow" for the links in the ctags directory.
+
+patch 5.1.12: "buf 123foo" used "123" as a count, instead as the start of a
+buffer name.
+
+patch 5.1.13: When completing file names on the command-line, reallocating the
+command-line may go wrong.
+
+patch 5.1.14: ":[nvci]unmenu" removed menu for all modes, when full menu patch
+specified.
+
+Graceful handling of NULLs in drag-dropped file list. Handle passing NULL to
+Fullname_save(). (Negri)
+
+Win32: ":!start" to invoke a program without opening a console, swapping
+screens, or waiting for completion in either console or gui version, e.g. you
+can type ":!start winfile". ALSO fixes "can't delete swapfile after spawning
+a shell" bug. (enhancement of Aaron patch) (Negri)
+
+Win32 GUI: Fix CTRL-X default keymapping to be more Windows-like. (Negri)
+
+Shorten filenames on startup. If in /foo/bar, entering "vim ../bar/bang.c"
+displays "bang.c" in status bar, not "/foo/bar/bang.c" (Negri)
+
+Win32 GUI: No copy to Windows clipboard when it's not desired.
+
+Win32s: Fix pasting from clipboard - made an assumption not valid under
+Win32s. (Negri)
+
+Win32 GUI: Speed up calls to gui_mch_draw_string() and cursor drawing
+functions. (Negri)
+
+Win32 GUI: Middle mouse button emulation now works in GUI! (Negri)
+
+Could skip messages when combining commands in one line, e.g.:
+":echo "hello" | write".
+
+Perl interpreter was disabled before executing VimLeave autocommands. Could
+not use ":perl" in them. (Aaron)
+
+Included patch for the Intellimouse (Aaron/Robinson).
+
+Could not set 'ls' to one, when last window has only one line. (Mitterand)
+
+Fixed a memory leak when removing menus.
+
+After ":only" the ruler could overwrite a message.
+
+Dos32: removed changing of __system_flags. It appears to work better when
+it's left at the default value.
+
+p_aleph was an int instead of along, caused trouble on systems where
+sizeof(int) != sizeof(long). (Schmidt)
+
+Fixed enum problems for Ultrix. (Seibert)
+
+Small redraw problem: "dd" on last line in file cleared wrong line.
+
+Didn't interpret "cmd | endif" when "cmd" starts with a range. E.g. "if 0 |
+.d | endif".
+
+Command "+|" on the last line of the file caused ml_get errors.
+
+Memory underrun in eval_vars(). (Aaron)
+
+Don't rename files in a difficult way, except on Windows 95 (was also done on
+Windows NT).
+
+Win32 GUI: An external command that produces an error code put the error
+message in a dialog box. had to close the window and close the dialog. Now
+the error code is displayed in the console. (Negri)
+
+"comctl32.lib" was missing from the GUI libraries in Makefile.w32. (Battle)
+
+In Insert mode, when entering a window in Insert mode, allow the cursor to be
+one char beyond the text.
+
+Renamed machine dependent rename() to mch_rename(). Define mch_rename() to
+rename() when it works properly.
+
+Rename vim_chdir() to mch_chdir(), because it's machine dependent.
+
+When using an arglist, and editing file 5 of 4, ":q" could cause "-1 more
+files to edit" error.
+
+In if_python.c, VimCommand() caused an assertion when a do_cmdline() failed.
+Moved the Python_Release_Vim() to before the VimErrorCheck(). (Harkins)
+
+Give an error message for an unknown argument after "--". E.g. for "vim
+--xyz".
+
+The FileChangedShell autocommand didn't set <afile> to the name of the changed
+file.
+
+When doing ":e file", causing the attention message, there sometimes was no
+hit-enter prompt. Caused by empty line or "endif" at end of sourced file.
+
+A large number of patches for the VMS version. (Hunsaker)
+
+When CTRL-L completion (find longest match) results in a shorter string, no
+completion is done (happens with ":help").
+
+Crash in Win32 GUI version, when using an Ex "@" command, because
+LinePointers[] was used while not initialized.
+
+Win32 GUI: allow mapping of Alt-Space.
+
+Output from "vim -h" was sent to stderr. Sending it to stdout is better, so
+one can use "vim -h | more".
+
+In command-line mode, ":vi[!]" should reload the file, just like ":e[!]".
+In Ex mode, ":vi" stops Ex mode, but doesn't reload the file. This is Vi
+compatible.
+
+When using a ":set ls=1" in the .gvimrc file, would get a status line for a
+single window. (Robinson)
+
+Didn't give an error message for ":set ai,xx". (Roemer)
+Didn't give an error message for ":set ai?xx", ":set ai&xx", ":set ai!xx".
+
+Non-Unix systems: That a file exists but is unreadable is recognized as "new
+file". Now check for existence when file can't be opened (like Unix).
+
+Unix: osdef.sh didn't handle declarations where the function name is at the
+first column of the line.
+
+DJGPP: Shortening of file names didn't work properly, because get_cwd()
+returned a path with backslashes. (Negri)
+
+When using a 'comments' part where a space is required after the middle part,
+always insert a space when starting a new line. Helps for C comments, below a
+line with "/****".
+
+Replacing path of home directory with "~/" could be wrong for file names
+with embedded spaces or commas.
+
+A few fixes for the Sniff interface. (Leherbauer)
+
+When asking to hit 'y' or 'n' (e.g. for ":3,1d"), using the mouse caused
+trouble. Same for ":s/x/y/c" prompt.
+
+With 'nowrap' and 'list', a Tab halfway on the screen was displayed as blanks,
+instead of the characters specified with 'listchars'. Also for other
+characters that take more than one screen character.
+
+When setting 'guifont' to an unknown font name, the previous font was lost and
+a default font would be used. (Steed)
+
+DOS: Filenames in the root directory didn't get shortened properly. (Negri)
+
+DJGPP: making a full path name out of a file name didn't work properly when
+there is no _fullpath() function. (Negri)
+
+Win32 console: ":sh" caused a crash. (Negri)
+
+Win32 console: Setting 'lines' and/or 'columns' in the _vimrc failed miserably
+(could hang Windows 95). (Negri)
+
+Win32: The change-drive function was not correct, went to the wrong drive.
+(Tsindlekht)
+
+GUI: When editing a command line in Ex mode, Tabs were sometimes not
+backspaced properly, and unprintable characters were displayed directly.
+non-GUI can still be wrong, because a system function is called for this.
+
+":set" didn't stop after an error. For example ":set no ai" gave an error for
+"no", but still set "ai". Now ":set" stops after the first error.
+
+When running configure for ctags, $LDFLAGS wasn't passed to it, causing
+trouble for IRIX.
+
+"@%" and "@#" when file name not set gave an error message. Now they just
+return an empty string. (Steed)
+
+CTRL-X and CTRL-A didn't work correctly with negative hex and octal numbers.
+(Steed)
+
+":echo" always started with a blank.
+
+Updating GUI cursor shape didn't always work (e.g., when blinking is off).
+
+In silent Ex mode ("ex -s" or "ex <file") ":s///p" didn't print a line. Also
+a few other commands that explicitly print a text line didn't work. Made this
+Vi compatible.
+
+Win32 version of _chdrive() didn't return correct value. (Tsindlekht)
+
+When using 't' in 'complete' option, no longer give an error message for a
+missing tags file.
+
+Unix: tgoto() can return NULL, which was not handled correctly in configure.
+
+When doing ":help" from a buffer where 'binary' is set, also edited the help
+file in binary mode. Caused extra ^Ms for DOS systems.
+
+Cursor position in a file was reset to 1 when closing a window.
+
+":!ls" in Ex mode switched off echo.
+
+When doing a double click in window A, while currently in window B, first
+click would reset double click time, had to click three times to select a
+word.
+
+When using <F11> in mappings, ":mkexrc" produced an exrc file that can't be
+used in Vi compatible mode. Added setting of 'cpo' to avoid this. Also, add
+a CTRL-V in front of a '<', to avoid a normal string to be interpreted as a
+special key name.
+
+Gave confusing error message for ":set guifont=-*-lucida-*": first "font is
+not fixed width", then "Unknown font".
+
+Some options were still completely left out, instead of included as hidden
+options.
+
+While running the X11 GUI, ignore SIGHUP signals. Avoids a crash after
+executing an external command (in rare cases).
+
+In os_unixx.h, signal() was defined to sigset(), while it already was.
+
+Memory leak when executing autocommands (was reported as a memory leak in
+syntax highlighting).
+
+Didn't print source of error sometimes, because pointers were the same,
+although names were different.
+
+Avoid a number of UMR errors from Purify (third argument to open()).
+
+A swap file could still be created just after setting 'updatecount' to zero,
+when there is an empty buffer and doing ":e file". (Kutschera)
+
+Test 35 failed on 64 bit machines. (Schild)
+
+With "p" and "P" commands, redrawing was slow.
+
+Awk script for html documentation didn't work correctly with AIX awk.
+Replaced "[ ,.);\] ]" with "[] ,.); ]". (Briscoe)
+The makehtml.awk script had a small problem, causing extra lines to be
+inserted. (Briscoe)
+
+"gqgq" could not be repeated. Repeating for "gugu" and "gUgU" worked in a
+wrong way. Also made "gqq" work to be consistent with "guu".
+
+C indent was wrong after "case ':':".
+
+":au BufReadPre *.c put": Line from put text was deleted, because the buffer
+was still assumed to be empty.
+
+Text pasted with the Edit/Paste menu was subject to 'textwidth' and
+'autoindent'. That was inconsistent with using the mouse to paste. Now "*p
+is used.
+
+When using CTRL-W CTRL-] on a word that's not a tag, and then CTRL-] on a tag,
+window was split.
+
+":ts" got stuck on a tags line that has two extra fields.
+
+In Insert mode, with 'showmode' on, <C-O><C-G> message was directly
+overwritten by mode message, if preceded with search command warning message.
+
+When putting the result of an expression with "=<expr>p, newlines were
+inserted like ^@ (NUL in the file). Now the string is split up in lines at
+the newline.
+
+putenv() was declared with "const char *" in pty.c, but with "char *" in
+osdef2.h.in. Made the last one also "const char *".
+
+":help {word}", where +{word} is a feature, jumped to the feature list instead
+of where the command was explained. E.g., ":help browse", ":help autocmd".
+
+Using the "\<xx>" form in an expression only got one byte, even when using a
+special character that uses several bytes (e.g., "\<F9>").
+Changed "\<BS>" to produce CTRL-H instead of the special key code for the
+backspace key. "\<Del>" produces 0x7f.
+
+":mkvimrc" didn't write a command to set 'compatible' or 'nocompatible'.
+
+The shell syntax didn't contain a "syn sync maxlines" setting. In a long file
+without recognizable items, syncing took so long it looked like Vim hangs.
+Added a maxlines setting, and made syncing interruptible.
+
+The "gs" command didn't flush output before waiting.
+
+Memory leaks for:
+ ":if 0 | let a = b . c | endif"
+ "let a = b[c]"
+ ":so {file}" where {file} contains a ":while"
+
+GUI: allocated fonts were never released. (Leonard)
+
+Makefile.bor:
+- Changed $(DEFINES) into a list of "-D" options, so that it can also be used
+ for the resource compiler. (not tested!)
+- "bcc.cfg" was used for all configurations. When building for another
+ configuration, the settings for the previous one would be used. Moved
+ "bcc.cfg" to the object directory. (Geddes)
+- Included targets for vimrun, install, ctags and xxd. Changed the default to
+ use the Borland DLL Runtime Library, makes Vim.exe a log smaller. (Aaron)
+
+"2*" search for the word under the cursor with "2" prepended. (Leonard)
+
+When deleting into a specific register, would still overwrite the non-Win32
+GUI selection. Now ""x"*P works.
+
+When deleting into the "" register, would write to the last used register.
+Now ""x always writes to the unnamed register.
+
+GUI Athena: A submenu with a '.' in it didn't work. E.g.,
+":amenu Syntax.XY\.Z.foo lll".
+
+When first doing ":tag foo" and then ":tnext" and/or ":tselect" the order of
+matching tags could change, because the current file is different. Now the
+existing matches are kept in the same order, newly found matches are added
+after them, not matter what the current file is.
+
+":ta" didn't find the second entry in a tags file, if the second entry was
+longer than the first one.
+
+When using ":set si tw=7" inserting "foo {^P}" made the "}" inserted at the
+wrong position. can_si was still TRUE when the cursor is not in the indent of
+the line.
+
+Running an external command in Win32 version had the problem that Vim exits
+when the X on the console is hit (and confirmed). Now use the "vimrun"
+command to start the external command indirectly. (Negri)
+
+Win32 GUI: When running an external filter, do it in a minimized DOS box.
+(Negri)
+
+":let" listed variables without translation into printable characters.
+
+Win32 console: When resizing the window, switching back to the old size
+(when exiting or executing an external command) sometimes failed. (Negri)
+This appears to also fix a "non fixable" problem:
+Win32 console in NT 4.0: When running Vim in a cmd window with a scrollbar,
+the scrollbar disappeared and was not restored when Vim exits. This does work
+under NT 3.51, it appears not to be a Vim problem.
+
+When executing BufDelete and BufUnload autocommands for a buffer without a
+name, the name of the current buffer was used for <afile>.
+
+When jumping to a tag it reported "tag 1 of >2", while in fact there could be
+only two matches. Changed to "tag 1 of 2 or more".
+
+":tjump tag" did a linear search in the tags file, which can be slow.
+
+Configure didn't find "LibXm.so.2.0", a Xm library with a version number.
+
+Win32 GUI: When using a shifted key with ALT, the shift modifier would remain
+set, even when it was already used by changing the used key. E.g., "<M-S-9>"
+resulted in "<M-S-(>", but it should be "<M-(>". (Negri)
+
+A call to ga_init() was often followed by setting growsize and itemsize.
+Created ga_init2() for this, which looks better. (Aaron)
+
+Function filereadable() could call fopen() with an empty string, which might
+be illegal.
+
+X Windows GUI: When executing an external command that outputs text, could
+write one character beyond the end of a buffer, which caused a crash. (Kohan)
+
+When using "*" or "#" on a string that includes '/' or '?' (when these are
+included in 'isk'), they were not escaped. (Parmelan)
+
+When adding a ToolBar menu in the Motif GUI, the submenu_id field was not
+cleared, causing random problems.
+
+When adding a menu, the check if this menu (or submenu) name already exists
+didn't compare with the simplified version (no mnemonic or accelerator) of the
+new menu. Could get two menus with the same name, e.g., "File" and "&File".
+
+Breaking a line because of 'textwidth' at the last line in the window caused a
+redraw of the whole window instead of a scroll. Speeds up normal typing with
+'textwidth' a lot for slow terminals.
+
+An invalid line number produced an "invalid range" error, even when it wasn't
+to be executed (inside "if 0").
+
+When the unnamed, first buffer is re-used, the "BufDelete" autocommand was
+not called. It would stick in a buffer list menu.
+
+When doing "%" on the NUL after the line, a "{" or "}" in the last character
+of the line was not found.
+
+The Insert mode menu was not used for the "s" command, the Operator-pending
+menu was used instead.
+
+With 'compatible' set, some syntax highlighting was not correct, because of
+using "[\t]" for a search pattern. Now use the regexps for syntax
+highlighting like the 'cpoptions' option is empty (as was documented already).
+
+When using "map <M-Space> ms" or "map <Space> sss" the output of ":map" didn't
+show any lhs for the mapping (if 'isprint' includes 160). Now always use
+<Space> and <M-Space>, even when they are printable.
+
+Adjusted the Syntax menu, so that the lowest entry fits on a small screen (for
+Athena, where menus don't wrap).
+
+When using CTRL-E or CTRL-Y in Insert mode for characters like 'o', 'x' and
+digits, repeating the insert didn't work.
+
+The file "tools/ccfilter.README.txt" could not be unpacked when using short
+file names, because of the two dots. Renamed it to
+"tools/ccfilter_README.txt".
+
+For a dark 'background', using Blue for Directory and SpecialKey highlight
+groups is not very readable. Use Cyan instead.
+
+In the function uc_scan_attr() in ex_docmd.c there was a goto that jumped into
+a block with a local variable. That's illegal for some compilers.
+
+Win32 GUI: There was a row of pixels at the bottom of the window which was not
+drawn. (Aaron)
+
+Under DOS, editing "filename/" created a swap file of "filename/.swp". Should
+be "filename/_swp".
+
+Win32 GUI: pointer was hidden when executing an external command.
+
+When 'so' is 999, "J" near the end of the file didn't redisplay correctly.
+
+":0a" inserted after the first line, instead of before the first line.
+
+Unix: Wildcard expansion didn't handle single quotes and {} patterns. Now
+":file 'window.c'" removes the quotes and ":e 'main*.c'" works (literal '*').
+":file {o}{n}{e}" now results in file name "one".
+
+Memory leak when setting a string option back to its default value.
+
+==============================================================================
+VERSION 5.3 *version-5.3*
+
+Version 5.3 was a bug-fix version of 5.2. There are not many changes.
+Improvements made between version 5.2 and 5.3:
+
+Changed *changed-5.3*
+-------
+
+Renamed "IDE" menu to "Tools" menu.
+
+
+Added *added-5.3*
+-----
+
+Win32 GUI: Give a warning when Vim is activated, and one of the files changed
+since editing started. (Negri)
+
+
+Fixed *fixed-5.3*
+-----
+
+5.2.1: Win32 GUI: space for external command was not properly allocated, could
+cause a crash. (Aaron) This was the reason to bring out 5.3 quickly after
+5.2.
+
+5.2.2: Some commands didn't complain when used without an argument, although
+they need one: ":badd", ":browse", ":call", ":confirm", ":behave",
+":delfunction", ":delcommand" and ":tearoff".
+":endfunction" outside of a function gave wrong error message: "Command not
+implemented". Should be ":endfunction not inside a function".
+
+5.2.3: Win32 GUI: When gvim was installed in "Program files", or another path
+with a space in it, executing external commands with vimrun didn't work.
+
+5.2.4: Pasting with the mouse in Insert mode left the cursor on the last
+pasted character, instead of behind it.
+
+5.2.5: In Insert mode, cursor after the end of the line, a shift-cursor-left
+didn't include the last character in the selection.
+
+5.2.6: When deleting text from Insert mode (with "<C-O>D" or the mouse), which
+includes the last character in the line, the cursor could be left on the last
+character in the line, instead of just after it.
+
+5.2.7: Win32 GUI: scrollbar was one pixel too big.
+
+5.2.8: Completion of "PopUp" menu showed the derivatives "PopUpc", "PopUPi",
+etc. ":menu" also showed these.
+
+5.2.9: When using two input() functions on a row, the prompt would not be
+drawn in column 0.
+
+5.2.10: A loop with input() could not be broken with CTRL-C.
+
+5.2.11: ":call asdf" and ":call asdf(" didn't give an error message.
+
+5.2.12: Recursively using ":normal" crashes Vim after a while. E.g.:
+":map gq :normal gq<CR>"
+
+5.2.13: Syntax highlighting used 'iskeyword' from wrong buffer. When using
+":help", then "/\k*" in another window with 'hlsearch' set.
+
+5.2.14: When using ":source" from a function, global variables would not be
+available unless "g:" was used.
+
+5.2.15: XPM files can have the extension ".pm", which is the same as for Perl
+modules. Added "syntax/pmfile.vim" to handle this.
+
+5.2.16: On Win32 and Amiga, "echo expand("%:p:h")" removed one dirname in an
+empty buffer. mch_Fullname() didn't append a slash at the end of a directory
+name.
+
+Should include the character under the cursor in the Visual area when using
+'selection' "exclusive". This wasn't done for "%", "e", "E", "t" and "f".
+
+""p would always put register 0, instead of the unnamed (last used) register.
+Reverse the change that ""x doesn't write in the unnamed (last used) register.
+It would always write in register 0, which isn't very useful. Use "-x for the
+paste mappings in Visual mode.
+
+When there is one long line on the screen, and 'showcmd' is off, "0$" didn't
+redraw the screen.
+
+Win32 GUI: When using 'mousehide', the pointer would flicker when the cursor
+shape is changed. (Negri)
+
+When cancelling Visual mode, and the cursor moves to the start, the wanted
+column wasn't set, "k" or "j" moved to the wrong column.
+
+When using ":browse" or ":confirm", was checking for a comment and separating
+bar, which can break some commands.
+
+Included fixes for Macintosh. (Kielhorn)
+
+==============================================================================
+VERSION 5.4 *version-5.4*
+
+Version 5.4 adds new features, useful changes and a lot of bug fixes.
+
+
+Runtime directory introduced *new-runtime-dir*
+----------------------------
+
+The distributed runtime files are now in $VIMRUNTIME, the user files in $VIM.
+You normally don't set $VIMRUNTIME but let Vim find it, by using
+$VIM/vim{version}, or use $VIM when that doesn't exist. This allows for
+separating the user files from the distributed files and makes it more easy to
+upgrade to another version. It also makes it possible to keep two versions of
+Vim around, each with their own runtime files.
+
+In the Unix distribution the runtime files have been moved to the "runtime"
+directory. This makes it possible to copy all the runtime files at once,
+without the need to know what needs to be copied.
+
+The archives for DOS, Windows, Amiga and OS/2 now have an extra top-level
+"vim" directory. This is to make clear that user-modified files should be put
+here. The directory that contains the executables doesn't have '-' or '.'
+characters. This avoids strange extensions.
+
+The $VIM and $VIMRUNTIME variables are set when they are first used. This
+allows them to be used by Perl, for example.
+
+The runtime files are also found in a directory called "$VIM/runtime". This
+helps when running Vim after just unpacking the runtime archive. When using
+an executable in the "src" directory, Vim checks if "vim54" or "runtime" can
+be added after removing it. This make the runtime files be found just after
+compiling.
+
+A default for $VIMRUNTIME can be given in the Unix Makefile. This is useful
+if $VIM doesn't point to above the runtime directory but to e.g., "/etc/".
+
+
+Filetype introduced *new-filetype-5.4*
+-------------------
+
+Syntax files are now loaded with the new FileType autocommand. Old
+"mysyntaxfile" files will no longer work. |filetypes|
+
+The scripts for loading syntax highlighting have been changed to use the
+new Syntax autocommand event.
+
+This combination of Filetype and Syntax events allows tuning the syntax
+highlighting a bit more, also when selected from the Syntax menu. The
+FileType autocommand can also be used to set options and mappings specifically
+for that type of file.
+
+The "$VIMRUNTIME/filetype.vim" file is not loaded automatically. The
+":filetype on" command has been added for this. ":syntax on" also loads it.
+
+The 'filetype' option has been added. It is used to trigger the FileType
+autocommand event, like the 'syntax' option does for the Syntax event.
+
+":set syntax=OFF" and ":set syntax=ON" can be used (in a modeline) to switch
+syntax highlighting on/off for the current file.
+
+The Syntax menu commands have been moved to $VIMRUNTIME/menu.vim. The Syntax
+menu is included both when ":filetype on" and when ":syntax manual" is used.
+
+Renamed the old 'filetype' option to 'osfiletype'. It was only used for
+RISCOS. 'filetype' is now used for the common file type.
+
+Added the ":syntax manual" command. Allows manual selection of the syntax to
+be used, e.g., from a modeline.
+
+
+Vim script line continuation *new-line-continuation*
+----------------------------
+
+When an Ex line starts with a backslash, it is concatenated to the previous
+line. This avoids the need for long lines. |line-continuation| (Roemer)
+Example: >
+ if has("dialog_con") ||
+ \ has("dialog_gui")
+ :let result = confirm("Enter your choice",
+ \ "&Yes\n&No\n&Maybe",
+ \ 2)
+ endif
+
+
+Improved session files *improved-sessions*
+----------------------
+
+New words for 'sessionoptions':
+- "help" Restore the help window.
+- "blank" Restore empty windows.
+- "winpos" Restore the Vim window position. Uses the new ":winpos"
+ command
+- "buffers" Restore hidden and unloaded buffers. Without it only the
+ buffers in windows are restored.
+- "slash" Replace backward by forward slashes in file names.
+- "globals" Store global variables.
+- "unix" Use unix file format (<NL> instead of <CR><NL>)
+
+The ":mksession" and 'sessionoptions' are now in the +mksession feature.
+
+The top line of the window is also restored when using a session file.
+
+":mksession" and ":mkvimrc" don't store 'fileformat', it should be detected
+when loading a file.
+
+(Most of this was done by Vince Negri and Robert Webb)
+
+
+Autocommands improved *improved-autocmds-5.4*
+---------------------
+
+New events:
+|FileType| When the file type has been detected.
+|FocusGained| When Vim got input focus. (Negri)
+|FocusLost| When Vim lost input focus. (Negri)
+|BufCreate| Called just after a new buffer has been created or has been
+ renamed. (Madsen)
+|CursorHold| Triggered when no key has been typed for 'updatetime'. Can be
+ used to do something with the word under the cursor. (Negri)
+ Implemented CursorHold autocommand event for Unix. (Zellner)
+ Also for Amiga and MS-DOS.
+|GUIEnter| Can be used to do something with the GUI window after it has
+ been created (e.g., a ":winpos 100 50").
+|BufHidden| When a buffer becomes hidden. Used to delete the
+ option-window when it becomes hidden.
+
+Also trigger |BufDelete| just before a buffer is going to be renamed. (Madsen)
+
+The "<amatch>" pattern can be used like "<afile>" for autocommands, except
+that it is the matching value for the FileType and Syntax events.
+
+When ":let @/ = <string>" is used in an autocommand, this last search pattern
+will be used after the autocommand finishes.
+
+Made loading autocommands a bit faster. Avoid doing strlen() on each exiting
+pattern for each new pattern by remembering the length.
+
+
+Encryption *new-encryption*
+----------
+
+Files can be encrypted when writing and decrypted when reading. Added the
+'key' option, "-x" command line argument and ":X" command. |encryption| (based
+on patch from Mohsin Ahmed)
+
+When reading a file, there is an automatic detection whether it has been
+encrypted. Vim will then prompt for the key.
+
+Note that the encryption method is not compatible with Vi. The encryption is
+not unbreakable. This allows it to be exported from the US.
+
+
+GTK GUI port *new-GTK-GUI*
+------------
+
+New GUI port for GTK+. Includes a toolbar, menu tearoffs, etc. |gui-gtk|
+Added the |:helpfind| command. (Kahn and Dalecki)
+
+
+Menu changes *menu-changes-5.4*
+------------
+
+Menus can now also be used in the console. It is enabled by the new
+'wildmenu' option. This shows matches for command-line completion like a
+menu. This works as a minimal file browser.
+
+The new |:emenu| command can be used to execute a menu item.
+
+Uses the last status line to list items, or inserts a line just above the
+command line. (Negri)
+
+The 'wildcharx' option can be used to trigger 'wildmenu' completion from a
+mapping.
+
+When compiled without menus, this can be detected with has("menu"). Also show
+this in the ":version" output. Allow compiling GUI versions without menu
+support. Only include toolbar support when there is menu support.
+
+Moved the "Window" menu all the way to the right (priority 70). Looks more
+familiar for people working with MS-Windows, shouldn't matter for others.
+
+Included "Buffers" menu. Works with existing autocommands and functions. It
+can be disabled by setting the "no_buffers_menu" variable. (Aaron and Madsen)
+
+Win32 supports separators in a menu: "-.*-". (Geddes)
+Menu separators for Motif now work too.
+
+Made Popup menu for Motif GUI work. (Madsen)
+
+'M' flag in 'guioptions': Don't source the system menu.
+
+All the menu code has been moved from gui.c to menu.c.
+
+
+Viminfo improved *improved-viminfo*
+----------------
+
+New flags for 'viminfo':
+'!' Store global variables in the viminfo file if they are in uppercase
+ letters. (Negri)
+'h' Do ":nohlsearch" when loading a viminfo file.
+
+Store search patterns in the viminfo file with their offset, magic, etc. Also
+store the flag whether 'hlsearch' highlighting is on or off (which is not used
+if the 'h' flag is in 'viminfo').
+
+Give an error message when setting 'viminfo' without commas.
+
+
+Various new commands *new-commands-5.4*
+--------------------
+
+Operator |g?|: rot13 encoding. (Negri)
+
+|zH| and |zL| commands: Horizontal scrolling by half a page.
+|gm| move cursor to middle of screen line. (Ideas by Campbell)
+
+Operations on Visual blocks: |v_b_I|, |v_b_A|, |v_b_c|, |v_b_C|, |v_b_r|,
+|v_b_<| and |v_b_>|. (Kelly)
+
+New command: CTRL-\ CTRL-N, which does nothing in Normal mode, and goes to
+Normal mode when in Insert or Command-line mode. Can be used by VisVim or
+other OLE programs to make sure Vim is in Normal mode, without causing a beep.
+|CTRL-\_CTRL-N|
+
+":cscope kill" command to use the connection filename. |:cscope| (Kahn)
+
+|:startinsert| command: Start Insert mode next.
+
+|:history| command, to show all four types of histories. (Roemer)
+
+|[m|, |[M|, |]m| and |]M| commands, for jumping backward/forward to start/end
+of method in a (Java) class.
+
+":@*" executes the * register. |:@| (Acevedo)
+
+|go| and |:goto| commands: Jump to byte offset in the file.
+
+|gR| and |gr| command: Virtual Replace mode. Replace characters without
+changing the layout. (Webb)
+
+":cd -" changes to the directory from before the previous ":cd" command.
+|:cd-| (Webb)
+
+Tag preview commands |:ptag|. Shows the result of a ":tag" in a dedicated
+window. Can be used to see the context of the tag (e.g., function arguments).
+(Negri)
+|:pclose| command, and CTRL-W CTRL-Z: Close preview window. (Moore)
+'previewheight' option, height for the preview window.
+Also |:ppop|, |:ptnext|, |:ptprevious|, |:ptNext|, |:ptrewind|, |:ptlast|.
+
+|:find| and |:sfind| commands: Find a file in 'path', (split window) and edit
+it.
+
+The |:options| command opens an option window that shows the current option
+values. Or use ":browse set" to open it. Options are grouped by function.
+Offers short help on each option. Hit <CR> to jump to more help. Edit the
+option value and hit <CR> on a "set" line to set a new value.
+
+
+Various new options *new-options-5.4*
+-------------------
+
+Scroll-binding: 'scrollbind' and 'scrollopt' options. Added |:syncbind|
+command. Makes windows scroll the same amount (horizontally and/or
+vertically). (Ralston)
+
+'conskey' option for MS-DOS. Use direct console I/O. This should work with
+telnet (untested!).
+
+'statusline' option: Configurable contents of the status line. Also allows
+showing the byte offset in the file. Highlighting with %1* to %9*, using the
+new highlight groups User1 to User9. (Madsen)
+
+'rulerformat' option: Configurable contents of the ruler, like 'statusline'.
+(Madsen)
+
+'write' option: When off, writing files is not allowed. Avoids overwriting a
+file even with ":w!". The |-m| command line option resets 'write'.
+
+'clipboard' option: How the clipboard is used. Value "unnamed": Use unnamed
+register like "*. (Cortopassi) Value "autoselect": Like what 'a' in
+'guioptions' does but works in the terminal.
+
+'guifontset' option: Specify fonts for the +fontset feature, for the X11 GUI
+versions. Allows using normal fonts when vim is compiled with this feature.
+(Nam)
+
+'guiheadroom' option: How much room to allow above/below the GUI window.
+Used for Motif, Athena and GTK.
+
+Implemented 'tagstack' option: When off, pushing tags onto the stack is
+disabled (Vi compatible). Useful for mappings.
+
+'shellslash' option. Only for systems that use a backslash as a file
+separator. This option will use a forward slash in file names when expanding
+it. Useful when 'shell' is sh or csh.
+
+'pastetoggle' option: Key sequence that toggles 'paste'. Works around the
+problem that mappings don't work in Insert mode when 'paste' is set.
+
+'display' option: When set to "lastline", the last line fills the window,
+instead of being replaced with "@" lines. Only the last three characters are
+replaced with "@@@", to indicate that the line has not finished yet.
+
+'switchbuf' option: Allows re-using existing windows on a buffer that is being
+jumped to, or split the window to open a new buffer. (Roemer)
+
+'titleold' option. Replaces the fixed string "Thanks for flying Vim", which
+is used to set the title when exiting. (Schild)
+
+
+Vim scripts *new-script-5.4*
+-----------
+
+The |exists()| function can also check for existence of a function. (Roemer)
+An internal function is now found with a binary search, should be a bit
+faster. (Roemer)
+
+New functions:
+- |getwinposx()| and |getwinposy()|: get Vim window position. (Webb)
+- |histnr()|, |histadd()|, |histget()| and |histdel()|: Make history
+ available. (Roemer)
+- |maparg()|: Returns rhs of a mapping. Based on a patch from Vikas.
+- |mapcheck()|: Check if a map name matches with an existing one.
+- |visualmode()|: Return type of last Visual mode. (Webb)
+- |libcall()|: Call a function in a library. Currently only for Win32. (Negri)
+- |bufwinnr()|: find window that contains the specified buffer. (Roemer)
+- |bufloaded()|: Whether a buffer exists and is loaded.
+- |localtime()| and |getftime()|: wall clock time and last modification time
+ of a file (Webb)
+- |glob()|: expand file name wildcards only.
+- |system()|: get the raw output of an external command. (based on a patch
+ from Aaron).
+- |strtrans()|: Translate String into printable characters. Used for
+ 2html.vim script.
+- |append()|: easy way to append a line of text in a buffer.
+
+Changed functions:
+- Optional argument to |strftime()| to give the time in seconds. (Webb)
+- |expand()| now also returns names for files that don't exist.
+
+Allow numbers in the name of a user command. (Webb)
+
+Use "v:" for internal Vim variables: "v:errmsg", "v:shell_error", etc. The
+ones from version 5.3 can be used without "v:" too, for backwards
+compatibility.
+
+New variables:
+"v:warningmsg" and "v:statusmsg" internal variables. Contain the last given
+warning and status message. |v:warningmsg| |v:statusmsg| (Madsen)
+"v:count1" variable: like "v:count", but defaults to one when no count is
+used. |v:count1|
+
+When compiling without expression evaluation, "if 1" can be used around the
+not supported commands to avoid it being executed. Works like in Vim 4.x.
+Some of the runtime scripts gave errors when used with a Vim that was compiled
+with minimal features. Now "if 1" is used around code that is not always
+supported.
+
+When evaluating an expression with && and ||, skip the parts that will not
+influence the outcome. This makes it faster and avoids error messages. (Webb)
+Also optimized the skipping of expressions inside an "if 0".
+
+
+Avoid hit-enter prompt *avoid-hit-enter*
+-----------------------
+
+Added 'T' flag to 'shortmess': Truncate all messages that would cause the
+hit-enter prompt (unless that would happen anyway).
+The 'O' flag in 'shortmess' now also applies to quickfix messages, e.g., from
+the ":cn" command.
+
+The default for 'shortmess' is now "filnxtToO", to make most messages fit on
+the command line, and not cause the hit-enter prompt.
+
+Previous messages can be viewed with the new |:messages| command.
+
+Some messages are shown fully, even when 'shortmess' tells to shorten
+messages, because the user is expected to want to see them in full: CTRL-G and
+some quickfix commands.
+
+
+Improved quickfix *improved-quickfix*
+-----------------
+
+Parse change-directory lines for gmake: "make[1]: Entering directory 'name'".
+Uses "%D" and "%X" in 'errorformat'.
+Also parse "Making {target} in {dir}" messages from make. Helps when not
+using GNU make. (Schandl)
+
+Use 'isfname' for "%f" in 'errorformat'.
+
+Parsing of multi-line messages. |errorformat-multi-line|
+
+Allow a range for the |:clist| command. (Roemer)
+
+Support for "global" file names, for error formats that output the file name
+once for several errors. (Roemer)
+
+|:cnfile| jumps to first error in next file.
+
+"$*" in 'makeprg' is replaced by arguments to ":make". (Roemer)
+
+
+Regular expressions *regexp-changes-5.4*
+-------------------
+
+In a regexp, a '$' before "\)" is also considered to be an end-of-line. |/$|
+In patterns "^" after "\|" or "\(" is a start-of-line. |/^| (Robinson)
+
+In a regexp, in front of "\)" and "\|" both "$" and "\$" were considered
+end-of-line. Now use "$" as end-of-line and "\$" for a literal dollar. Same
+for '^' after "\(" and "\|". |/\$| |/\^|
+
+Some search patterns can be extremely slow, even though they are not really
+illegal. For example: "\([^a-z]\+\)\+Q". Allow interrupting any regexp
+search with CTRL-C.
+
+Register "/: last search string (read-only). (Kohan) Changed to use last used
+search pattern (like what 'hlsearch' uses). Can set the search pattern with
+":let @/ = {expr}".
+
+Added character classes to search patterns, to avoid the need for removing the
+'l' flag from 'cpoptions': |[:tab:]|, |[:return:]|, |[:backspace:]| and
+|[:escape:]|.
+
+By adding a '?' after a comparative operator in an expression, the comparison
+is done by ignoring case. |expr-==?|
+
+
+Other improvements made between version 5.3 and 5.4
+---------------------------------------------------
+
+Changed *changed-5.4*
+-------
+
+Unix: Use $TMPDIR for temporary files, if it is set and exists.
+
+Removed "Empty buffer" message. It isn't useful and can cause a hit-enter
+prompt. (Negri)
+
+"ex -" now reads commands from stdin and works in silent mode. This is to be
+compatible with the original "ex" command that is used for scripts.
+
+Default range for ":tcldo" is the whole file.
+
+Cancelling Visual mode with ESC moved the cursor. There appears to be no
+reason for this. Now leave the cursor where it is.
+
+The ":grep" and ":make" commands see " as part of the arguments, instead of
+the start of a comment.
+
+In expressions the "=~" and "!~" operators no longer are affected by
+'ignorecase'.
+
+Renamed vimrc_example to vimrc_example.vim and gvimrc_example to
+gvimrc_example.vim. Makes them being recognized as vim scripts.
+
+"gd" no longer starts searching at the end of the previous function, but at
+the first blank line above the start of the current function. Avoids that
+using "gd" in the first function finds global a variable.
+
+Default for 'complete' changed from ".,b" to ".,w,b,u,t,i". Many more matches
+will be found, at the cost of time (the search can be interrupted).
+
+It is no longer possible to set 'shell*' options from a modeline. Previously
+only a warning message was given. This reduces security risks.
+
+The ordering of the index of documentation files was changed to make it more
+easy to find a subject.
+
+On MS-DOS and win32, when $VIM was not set, $HOME was used. This caused
+trouble if $HOME was set to e.g., "C:\" for some other tool, the runtime files
+would not be found. Now use $HOME only for _vimrc, _gvimrc, etc., not to find
+the runtime file.
+
+When 'tags' is "./{fname}" and there is no file name for the current buffer,
+just use it. Previously it was skipped, causing "vim -t {tag}" not to find
+many tags.
+
+When trying to select text in the 'scrolloff' area by mouse dragging, the
+resulting scrolling made this difficult. Now 'scrolloff' is temporarily set
+to 0 or 1 to avoid this. But still allow scrolling in the top line to extend
+to above the displayed text.
+
+Default for 'comments' now includes "sl:/*,mb: *,ex:*/", to make javadoc
+comments work. Also helps for C comments that start with "/*******".
+
+CTRL-X CTRL-] Insert mode tag expansion tried to expand to all tags when used
+after a non-ID character, which can take a very long time. Now limit this to
+200 matches. Also used for command-line tag completion.
+
+The OS/2 distribution has been split in two files. It was too big to fit on a
+floppy. The same runtime archive as for the PC is now used.
+
+In the documentation, items like <a-z> have been replaced with {a-z} for
+non-optional arguments. This avoids confusion with key names: <C-Z> is a
+CTRL-Z, not a character between C and Z, that is {C-Z}.
+
+
+Added *added-5.4*
+-----
+
+Color support for the iris-ansi builtin termcap entry. (Tubman)
+
+Included VisVim version 1.3a. (Erhardt)
+
+Win32 port for SNiFF+ interface. (Leherbauer)
+Documentation file for sniff interface: if_sniff.txt. (Leherbauer)
+
+Included the "SendToVim" and "OpenWithVim" programs in the OleVim directory.
+To be used with the OLE version of gvim under MS-Windows. (Schaller)
+
+Included Exuberant Ctags version 3.2.4 with Eiffel support. (Hiebert)
+
+When a file that is being edited is deleted, give a warning (like when the
+time stamp changed).
+
+Included newer versions of the HTML-generating Awk and Perl scripts. (Colombo)
+
+Linux console mouse support through "gpm". (Tsindlekht)
+
+Security fix: Disallow changing 'secure' and 'exrc' from a modeline. When
+'secure' is set, give a warning for changing options that contain a program
+name.
+
+Made the Perl interface work with Perl 5.005 and threads. (Verdoolaege)
+
+When giving an error message for an ambiguous mapping, include the offending
+mapping. (Roemer)
+
+Command line editing:
+- Command line completion of mappings. (Roemer)
+- Command line completion for ":function", ":delfunction", ":let", ":call",
+ ":if", etc. (Roemer)
+- When using CTRL-D completion for user commands that have
+ "-complete=tag_listfiles" also list the file names. (Madsen)
+- Complete the arguments of the ":command" command. (Webb)
+- CTRL-R . in command line inserts last inserted text. CTRL-F, CTRL-P, CTRL-W
+ and CTRL-A after CTRL-R are used to insert an object from under the cursor.
+ (Madsen)
+
+Made the text in uganda.txt about copying Vim a bit more clear.
+
+Updated the Vim tutor. Added the "vimtutor" command, which copies the tutor
+and starts Vim on it. "make install" now also copies the tutor.
+
+In the output of ":clist" the current entry is highlighted, with the 'i'
+highlighting (same as used for 'incsearch').
+
+For the ":clist" command, you can scroll backwards with "b" (one screenful),
+"u" (half a screenful) and "k" (one line).
+
+Multi-byte support:
+- X-input method for multibyte characters. And various fixes for multibyte
+ support. (Nam)
+- Hangul input method feature: |hangul|. (Nam)
+- Cleaned up configuration of multibyte support, XIM, fontset and Hangul
+ input. Each is now configurable separately.
+- Changed check for GTK_KEYBOARD to HANGUL_KEYBOARD_TYPE. (Nam)
+- Added doc/hangulin.txt: Documentation for the Hangul input code. (Nam)
+- XIM support for GTK+. (Nam)
+- First attempt to include support for SJIS encoding. (Nagano)
+- When a double-byte character doesn't fit at the end of the line, put a "~"
+ there and print it on the next line.
+- Optimize output of multibyte text. (Park)
+- Win32 IME: preedit style is like over-the-spot. (Nagano)
+- Win32 IME: IME mode change now done with ImmSetOpenStatus. (Nagano)
+- GUI Athena: file selection dialog can display multibyte characters.
+ (Nagano)
+- Selection reply for XA_TEXT as XA_STRING. (Nagano)
+
+"runtime/macros/diffwin.vim". Mappings to make a diff window. (Campbell)
+
+Added ".obj" to the 'suffixes' option.
+
+Reduced size of syntax/synload.vim by using the ":SynAu" user command.
+Automated numbering of Syntax menu entries in menu.vim.
+In the Syntax menu, insert separators between syntax names that start with
+a different letter. (Geddes)
+
+Xterm:
+- Clipboard support when using the mouse in an xterm. (Madsen)
+- When using the xterm mouse, track dragging of the mouse. Use xterm escape
+ sequences when possible. It is more precise than other methods, but
+ requires a fairly recent xterm version. It is enabled with "xterm2" in
+ 'ttymouse'. (Madsen)
+- Check xterm patch level, to set the value of 'ttymouse'. Has only been
+ added to xterm recently (patch level > 95). Uses the new 't_RV' termcap
+ option. Set 'ttymouse' to "xterm2" when a correct response is recognized.
+ Will make xterm mouse dragging work better.
+- Support for shifted function keys on xterm. Changed codes for shifted
+ cursor keys to what the xterm actually produces. Added codes for shifted
+ <End> and <Home>.
+- Added 't_WP' to set the window position in pixels and 't_WS' to set the
+ window size in characters. Xterm can now move (used for ":winpos") and
+ resize (use for ":set lines=" and ":set columns=").
+
+X11:
+- When in Visual mode but not owning the selection, display the Visual area
+ with the VisualNOS group to show this. (Madsen)
+- Support for requesting the type of clipboard support. Used for AIX and
+ dtterm. (Wittig)
+- Support compound_text selection (even when compiled without multibyte).
+
+Swap file:
+- New variation for naming swap files: Replace path separators into %, place
+ all swap files in one directory. Used when a name in 'dir' ends in two path
+ separators. (Madsen)
+- When a swap file is found, show whether it contains modifications or not in
+ the informative message. (Madsen)
+- When dialogs are supported, use a dialog to ask the user what to do when a
+ swapfile already exists.
+
+"popup_setpos" in 'mousemodel' option. Allows for moving the cursor when
+using the right mouse button.
+
+When a buffer is deleted, the selection for which buffer to display instead
+now uses the most recent entry from the jump list. (Madsen)
+
+When using CTRL-O/CTRL-I, skip deleted buffers.
+
+A percentage is shown in the ruler, when there is room.
+
+Used autoconf 1.13 to generate configure.
+
+Included get_lisp_indent() from Dirk van Deun. Does better Lisp indenting
+when 'p' flag in 'cpoptions' is not included.
+
+Made the 2html.vim script quite a bit faster. (based on ideas from Geddes)
+
+Unix:
+- Included the name of the user that compiled Vim and the system name it was
+ compiled on in the version message.
+- "make install" now also installs the "tools" directory. Makes them
+ available for everybody.
+- "make check" now does the same as "make test". "make test" checks for
+ Visual block mode shift, insert, replace and change.
+- Speed up comparing a file name with existing buffers by storing the
+ device/inode number with the buffer.
+- Added configure arguments "--disable-gtk", "--disable-motif" and
+ "--disable-athena", to be able to disable a specific GUI (when it doesn't
+ work).
+- Renamed the configure arguments for disabling the check for specific GUIs.
+ Should be clearer now. (Kahn)
+- On a Digital Unix system ("OSF1") check for the curses library before
+ termlib and termcap. (Schild)
+- "make uninstall_runtime" will only delete the version-specific files. Can
+ be used to delete the runtime files of a previous version.
+
+Macintosh: (St-Amant)
+- Dragging the scrollbar, like it's done for the Win32 GUI. Moved common code
+ from gui_w32.c to gui.c
+- Added dialogs and file browsing.
+- Resource fork preserved, warning when it will be lost.
+- Copy original file attributes to newly written file.
+- Set title/notitle bug solved.
+- Filename completion improved.
+- Grow box limit resize to a char by char size.
+- Use of rgb.txt for more colors (but give back bad color).
+- Apple menu works (beside the about...).
+- Internal border now vim compliant.
+- Removing a menu doesn't crash anymore.
+- Weak-linking of Python 1.5.1 (only on PPC). Python is supported when the
+ library is available.
+- If an error is encountered when sourcing the users .vimrc, the alert box now
+ shows right away with the OK button defaulted. There's no more "Delete"-key
+ sign at the start of each line
+- Better management of environment variables. Now $VIM is calculated only
+ once, not regenerated every time it is used.
+- No more CPU hog when in background.
+- In a sourced Vim script the Mac file format can be recognized, just like DOS
+ file format is.
+
+When both "unix" and "mac" are present in 'fileformats', prefer "mac" format
+when there are more CR than NL characters.
+When using "mac" fileformat, use CR instead of a NL, because NL is used for
+NUL. Will preserve all characters in a file. (Madsen)
+
+The DOS install.exe now contains checks for an existing installation. It
+avoids setting $VIM and $PATH again.
+The install program for Dos/Windows can now install Vim in the popup menu, by
+adding two registry keys.
+
+Port to EGCS/mingw32. New Makefile.ming. (Aaron)
+
+DOS 16 bit: Don't include cursor shape stuff. Save some bytes.
+
+TCL support to Makefile.w32. (Duperval)
+
+OS/2: Use argv[0] to find runtime files.
+
+When using "gf" to go to a buffer that has already been used, jump to the
+line where the cursor last was.
+
+Colored the output of ":tselect" a bit more. Different highlighting between
+tag name and file name. Highlight field name ("struct:") separately from
+argument.
+
+Backtick expansion for non-Unix systems. Based on a patch from Aaron.
+Allows the use of things like ":n `grep -l test *.c`" and
+"echo expand('`ls m*`')".
+
+Check for the 'complete' option when it is set. (Acevedo)
+'d' flag in 'complete' searches for defined names or macros.
+While searching for Insert mode completions in include files and tags files,
+check for typeahead, so that you can use matches early. (Webb)
+The '.' flag in 'complete' now scans the current buffer completely, ignoring
+'nowrapscan'. (Webb)
+
+Added '~' flag to 'whichwrap'. (Acevedo)
+
+When ending the Visual mode (e.g., with ESC) don't grab ownership of the
+selection.
+
+In a color terminal, "fg" and "bg" can be used as color names. They stand for
+the "Normal" colors.
+
+A few cscope cleanups. (Kahn)
+
+Included changed vimspell.sh from Schemenauer.
+
+Concatenation of strings in an expression with "." is a bit faster. (Roemer)
+
+The ":redir" command can now redirect to a register: ":redir @r". (Roemer)
+
+Made the output of ":marks" and ":jumps" look similar. When the mark is in
+the current file, show the text at the mark. Also for ":tags".
+
+When configure finds ftello() and fseeko(), they are used in tag.c (for when
+you have extremely big tags files).
+
+Configure check for "-FOlimit,2000" argument for the compiler. (Borsenkow)
+
+GUI:
+- When using ":gui" in a non-GUI Vim, give a clear error message.
+- "gvim -v" doesn't start the GUI (if console support is present).
+- When in Ex mode, use non-Visual selection for the whole screen.
+- When starting with "gvim -f" and using ":gui" in the .gvimrc file, Vim
+ forked anyway. Now the "-f" flag is remembered for ":gui". Added "gui -b"
+ to run gvim in the background anyway.
+
+Motif GUI:
+- Check for "-lXp" library in configure (but it doesn't work yet...).
+- Let configure check for Lesstif in "/usr/local/Lesstif/Motif*". Changed the
+ order to let a local Motif version override a system standard version.
+
+Win32 GUI:
+- When using "-register" or "-unregister" in the non-OLE version, give an
+ error message.
+- Use GTK toolbar icons. Make window border look better. Use sizing handles
+ on the lower left&right corners of the window. (Negri)
+- When starting an external command with ":!start" and the command can not be
+ executed, give an error message. (Webb)
+- Use sizing handles for the grey rectangles below the scrollbars. Can draw
+ toolbar in flat mode now, looks better. (Negri)
+- Preparations for MS-Windows 3.1 addition. Mostly changing WIN32 to MSWIN
+ and USE_GUI_WIN32 to USE_GUI_MSWIN. (Negri)
+
+Avoid allocating the same string four times in buflist_findpat(). (Williams)
+
+Set title and icon text with termcap options 't_ts', 't_fs', 't_IS' and
+'t_IE'. Allows doing this on any terminal that supports setting the title
+and/or icon text. (Schild)
+
+New 'x' flag in 'comments': Automatically insert the end part when its last
+character is typed. Helps to close a /* */ comment in C. (Webb)
+
+When expand() has a second argument which is non-zero, don't use 'suffixes'
+and 'wildignore', return all matches.
+
+'O' flag in 'cpoptions' When not included, Vim will not overwrite a file, if
+it didn't exist when editing started but it does exist when the buffer is
+written to the file. The file must have been created outside of Vim, possibly
+without the user knowing it. When this is detected after a shell command,
+give a warning message.
+
+When editing a new file, CTRL-G will show [New file]. When there were errors
+while reading the file, CTRL-G will show [Read errors].
+
+":wall" can now use a dialog and file-browsing when needed.
+
+Grouped functionality into new features, mainly to reduce the size of the
+minimal version:
++linebreak: 'showbreak', 'breakat' and 'linebreak'
++visualextra: "I"nsert and "A"ppend in Visual block mode, "c"hange all lines
+ in a block, ">" and "<": Shifting a block, "r": Replacing a
+ Visual area with one character.
++comments: 'comments'
++cmdline_info: 'ruler' and 'showcmd'. Replaces +showcmd.
+"+title" Don't add code to set title or icon for MSDOS, this was not
+ possible anyway.
++cmdline_compl Disable commandline completion at compile time, except for
+ files, directories and help items.
+
+Moved features from a list of function calls into an array. Should save a bit
+of space.
+
+While entering the body of a function, adjust indent according to "if" and
+"while" commands.
+
+VMS: Adjusted os_vms.mms a bit according to suggestions from Arpadffy.
+
+The flags in the 'comments' option can now include an offset. This makes it
+possible to align "/*****", "/* xxx" and "/*" comments with the same
+'comments' setting. The default value for 'comments' uses this.
+Added 'O' flag: Don't use this part for the "O" command. Useful for "set
+com=sO:*\ -,mO:*\ \ ,exO:*/"
+
+FileType autocommands recognize ".bak", ".orig" and "~" extensions and remove
+them to find the relevant extension.
+
+The tutorial for writing a Vim script file has been extended.
+
+Some more highlighting in help files, for items that are not typed literally.
+
+Can use "CTRL-W CTRL-G" like "CTRL-W g".
+
+"make test" for OS/2.
+
+Adjusted configure to automatically use the GUI for BeOS.
+
+
+Fixed *fixed-5.4*
+-----
+
+5.3.1: When using an autocommand for BufWritePre that changes the name of the
+buffer, freed memory would be used. (Geddes)
+
+Mac: Compiler didn't understand start of skip_class_name().
+
+Win32 GUI:
+- When cancelling the font requester, don't give an error message.
+- When a tearoff-menu is open and its menu is deleted, Vim could crash.
+ (Negri)
+- There was a problem on Windows 95 with (un)maximizing the window.
+ (Williams)
+- when 'mousehide' is set, the mouse would stay hidden when a menu is dropped
+ with the keyboard. (Ralston)
+- The tempname() function already created the file. Caused problems when
+ using ":w". Now the file is deleted.
+- Cursor disappeared when ending up in the top-left character on the screen
+ after scrolling. (Webb)
+- When adding a submenu for a torn-off menu, it was not updated.
+- Menu tooltip was using the toolbar tooltip. (Negri)
+- Setting 'notitle' didn't remove the title. (Steed)
+- Using ":!start cmd" scrolled the screen one line up, and didn't wait for
+ return when the command wasn't found.
+
+Cscope interface: Sorting of matches was wrong. Starting the interface could
+fail. (Kahn)
+
+Motif GUI: Could not compile with Motif 1.1, because some tear-off
+functionality was not in #ifdefs.
+
+Configure could sometimes not compile or link the test program for sizeof(int)
+properly. This caused alignment problems for the undo structure allocations.
+Added a safety check that SIZEOF_INT is not zero.
+
+Added configure check to test if strings.h can be included after string.h.
+Some systems can't handle it.
+Some systems need both string.h and strings.h included. Adjusted vim.h for
+that. Removed including string.h from os_unixx.h, since it's already in
+vim.h. (Savage)
+AIX: defining _NO_PROTO in os_unix.h causes a conflict between string.h and
+strings.h, but after the configure check said it was OK. Also define
+_NO_PROTO for AIX in the configure check. (Winn)
+
+When closing a window with CTRL-W c, the value of 'hidden' was not taken into
+account, the buffer was always unloaded. (Negri)
+
+Unix Makefile: "make install" always tried to rename an older executable and
+remove it. This caused an error message when it didn't exit. Added a check
+for the existence of an old executable.
+The command line for "make install" could get too long, because of the many
+syntax files. Now first do a "cd" to reduce the length.
+
+On RISCOS and MSDOS, reading a file could fail, because the short filename was
+used, which can be wrong after a ":!cd".
+
+In the DOS versions, the wrong install.exe was included (required Windows).
+Now the install.exe version is included that is the same as the Vim version.
+This also supports long file names where possible.
+
+When recording, and stopping while in Insert mode with CTRL-O q, the CTRL-O
+would also be recorded.
+
+32bit DOS version: "vim \file", while in a subdirectory, resulted in "new
+file" for "file" in the local directory, while "\file" did exist. When
+"file" in the current directory existed, this didn't happen.
+
+MSDOS: Mouse could not go beyond 80 columns in 132 columns mode. (Young)
+
+"make test" failed in the RedHat RPM, because compatible is off by default.
+
+In Insert mode <C-O><C-W><C-W> changes to other window, but the status bars
+were not updated until another character was typed.
+
+MSDOS: environment options in lowercase didn't work, although they did in the
+Win32 versions. (Negri)
+
+After ":nohlsearch", a tag command switched highlighting back on.
+
+When using "append" command as the last line in an autocommand, Vim would
+crash.
+
+RISCOS: The scroll bumpers (?) were not working properly. (Leonard)
+
+"zl" and "zh" could move the cursor, but this didn't set the column in which
+e.g., "k" would move the cursor.
+
+When doing ":set all&" the value of 'scroll' was not set correctly. This
+caused an error message when later setting any other number option.
+
+When 'hlsearch' highlighting has been disabled with ":nohlsearch",
+incremental searching would switch it back on too early.
+
+When listing tags for ":tselect", and using a non-search command, and the last
+character was equal to the first (e.g., "99"), the last char would not be
+shown.
+
+When searching for tags with ":tag" Vim would assume that all matches had been
+found when there were still more (e.g. from another tags file).
+
+Win32: Didn't recognize "c:\" (e.g., in tags file) as absolute path when
+upper/lowercase was different.
+
+Some xterms (Debian) send <Esc>OH for HOME and <Esc>OF for END. Added these
+to the builtin-xterm.
+
+In ex mode, any CR was seen as the end of the line. Only a NL should be
+handled that way. broke ":s/foo/some^Mtext/".
+
+In menu.vim, a vmenu was used to override an amenu. That didn't work, because
+the system menu file doesn't overwrite existing menus. Added explicit vunmenu
+to solve this.
+
+Configure check for terminal library could find a library that doesn't work at
+runtime (Solaris: shared library not found). Added a check that a program
+with tgoto() can run correctly.
+
+Unix: "echo -n" in the Makefile doesn't work on all systems, causing errors
+compiling pathdef.c. Replaced it with "tr".
+
+Perl: DO_JOIN was redefined by Perl. Undefined it in the perl files.
+
+Various XIM and multibyte fixes:
+- Fix user cannot see his language while he is typing his language with
+ off-the-spot method. (Nagano)
+- Fix preedit position using text/edit area (using gui.wid). (Nagano)
+- remove 'fix dead key' codes. It was needed since XNFocusWindow was
+ "x11_window", XNFocusWindow is now gui.wid. (Nagano)
+- Remove some compile warnings and fix typos. (Namsh)
+- For status area, check the gtk+ version while Vim runs. I believe it is
+ better than compile time check. (Namsh)
+- Remove one FIXME for gtk+-xim. (Namsh)
+- XIM: Dead keys didn't work for Czech. (Vyskovsky)
+- Multibyte: If user input only 3byte such as mb1_mb2_eng or eng_mb1_mb2 VIM
+ could convert it to special character. (Nam)
+- Athena/Motif with XIM: fix preedit area. (Nam)
+- XIM: Composed strings were sometimes ignored. Vim crashed when compose
+ string was longer than 256 bytes. IM's geometry control is fixed. (Nam,
+ Nagano)
+- Win32 multibyte: hollowed cursor width on a double byte char was wrong.
+ (Nagano)
+- When there is no GUI, selecting XIM caused compilation problems.
+ Automatically disable XIM when there is no GUI in configure.
+- Motif and Athena: When compiled with XIM, but the input method was not
+ enabled, there would still be a status line. Now the status line is gone if
+ the input method doesn't work. (Nam)
+
+Win32: tooltip was not removed when selecting a parent menu (it was when
+selecting a menu entry). (Negri)
+
+Unix with X: Some systems crash on exit, because of the XtCloseDisplay() call.
+Removed it, it should not be necessary when exiting.
+
+Win32: Crash on keypress when compiled with Borland C++. (Aaron)
+
+When checking for Motif library files, prefer the same location as the include
+files (with "include" replaced with "lib") above another entry.
+
+Athena GUI: Changed "XtOffset()" in gui_at_fs.c to "XtOffsetOf()", like it's
+used in gui_x11.c.
+
+Win32: When testing for a timestamp of a file on floppy, would get a dialog
+box when the floppy has been removed. Now return with an error. (Negri)
+
+Win32 OLE: When forced to come to the foreground, a minimized window was still
+minimized, now it's restored. (Zivkov)
+
+There was no check for a positive 'shiftwidth'. A negative value could cause
+a hangup, a zero value a crash.
+
+Athena GUI: horizontal scrollbar wasn't updated correctly when clicking right
+or left of the thumb.
+
+When making a Visual-block selection in one window, and trying to scroll
+another, could cause errors for accessing non-existent line numbers.
+
+When 'matchpairs' contains "`:'", jumping from the ` to the ' didn't work
+properly.
+
+Changed '\"' to '"' to make it compatible with old C compilers.
+
+The command line expansion for mappings caused a script with a TAB between lhs
+and rhs of a map command to fail. Assume the TAB is to separate lhs and rhs
+when there are no mappings to expand.
+
+When editing a file with very long lines with 'scrolloff' set, "j" would
+sometimes end up in a line which wasn't displayed.
+
+When editing a read-only file, it was completely read into memory, even when
+it would not fit. Now create a swap file for a read-only file when running
+out of memory while reading the file.
+
+When using ":set cino={s,e-s", a line after "} else {" was not indented
+properly. Also added a check for this in test3.in.
+
+The Hebrew mapping for the command line was remembered for the next command
+line. That isn't very useful, a command is not Hebrew. (Kol)
+
+When completing file names with embedded spaces, like "Program\ files", this
+didn't work. Also for user commands. Moved backslash_halve() down to
+mch_expandpath().
+
+When using "set mouse=a" in Ex mode, mouse events were handled like typed
+text. Then typing "quit" screwed up the mouse behavior of the xterm.
+
+When repeating an insert with "." that contains a CTRL-Y, a number 5 was
+inserted as "053".
+
+Yanking a Visual area, with the cursor past the line, didn't move the cursor
+back onto the line. Same for "~", "u", "U" and "g?"
+
+Win32: Default for 'grepprg' could be "findstr /n" even though there is no
+findstr.exe (Windows 95). Check if it exists, and fall back to "grep -n" if
+it doesn't.
+
+Because gui_mouse_moved() inserted a leftmouse click in the input buffer,
+remapping a leftmouse click caused strange effects. Now Insert another code
+in the input buffer. Also insert a leftmouse release, to avoid the problem
+with ":map <LeftMouse> l" that the next release is seen as the release for the
+focus click.
+
+With 'wrap' on, when using a line that doesn't fit on the screen, if the start
+of the Visual area is before the start of the screen, there was no
+highlighting. Also, 'showbreak' doesn't work properly.
+
+DOS, Win32: A pattern "[0-9]\+" didn't work in autocommands.
+
+When creating a swap file for a buffer which isn't the current buffer, could
+get a mixup of short file name, resulting in a long file name when a short
+file name was required. makeswapname() was calling modname() instead of
+buf_modname().
+
+When a function caused an error, and the error message was very long because
+of recursiveness, this would cause a crash.
+
+'suffixes' were always compared with matching case. For MS-DOS, Win32 and
+OS/2 case is now ignored.
+
+The use of CHARBITS in regexp.c didn't work on some Linux. Don't use it.
+
+When generating a script file, 'cpo' was made empty. This caused backslashes
+to disappear from mappings. Set it to "B" to avoid that.
+
+Lots of typos in the documentation. (Campbell)
+
+When editing an existing (hidden) buffer, jump to the last used cursor
+position. (Madsen)
+
+On a Sun the xterm screen was not restored properly when suspending. (Madsen)
+
+When $VIMINIT is processed, 'nocompatible' was only set after processing it.
+
+Unix: Polling for a character wasn't done for GPM, Sniff and Xterm clipboard
+all together. Cleaned up the code for using select() too.
+
+When executing external commands from the GUI, some typeahead was lost. Added
+some code to regain as much typeahead as possible.
+
+When the window height is 5 lines or fewer, <PageDown> didn't use a one-line
+overlap, while <PageUp> does. Made sure that <PageUp> uses the same overlap
+as <PageDown>, so that using them both always displays the same lines.
+
+Removed a few unused functions and variables (found with lint).
+
+Dictionary completion didn't use 'infercase'. (Raul)
+
+Configure tests failed when the Perl library was not in LD_LIBRARY_PATH.
+Don't use the Perl library for configure tests, add it to the linker line only
+when linking Vim.
+
+When using ncurses/terminfo, could get a 't_Sf' and 't_Sb' termcap entry that
+has "%d" instead of "%p1%d". The light background colors didn't work then.
+
+GTK GUI with ncurses: Crashed when starting up in tputs(). Don't use tputs()
+when the GUI is active.
+
+Could use the ":let" command to set the "count", "shell_error" and "version"
+variables, but that didn't work. Give an error message when trying to set
+them.
+
+On FreeBSD 3.0, tclsh is called tclsh8.0. Adjusted configure.in to find it.
+
+When Vim is linked with -lncurses, but python uses -ltermcap, this causes
+trouble: "OOPS". Configure now removes the -ltermcap.
+
+:@" and :*" didn't work properly, because the " was recognized as the start of
+a comment.
+
+Win32s GUI: Minimizing the console where a filter command runs in caused
+trouble for detecting that the filter command has finished. (Negri)
+
+After executing a filter command from an xterm, the mouse would be disabled.
+It would work again after changing the mode.
+
+Mac GUI: Crashed in newenv(). (St-Amant)
+
+The menus and mappings in mswin.vim didn't handle text ending in a NL
+correctly. (Acevedo)
+
+The ":k" command didn't check if it had a valid argument or extra characters.
+Now give a meaningful error message. (Webb)
+
+On SGI, the signal function doesn't always have three arguments. Check for
+struct sigcontext to find out. Might still be wrong...
+
+Could crash when using 'hlsearch' and search pattern is "^".
+
+When search patterns were saved and restored, status of no_hlsearch was not
+also saved and restored (from ":nohlsearch" command).
+
+When using setline() to make a line shorter, the cursor position was not
+adjusted.
+
+MS-DOS and Win95: When trying to edit a file and accidentally adding a slash
+or backslash at the end, the file was deleted. Probably when trying to create
+the swap file. Explicitly check for a trailing slash or backslash before
+trying to read a file.
+
+X11 GUI: When starting the GUI failed and received a deadly signal while
+setting the title, would lock up when trying to exit, because the title is
+reset again. Avoid using mch_settitle() recursively.
+
+X11 GUI: When starting the GUI fails, and then trying it again, would crash,
+because argv[] has been freed and x11_display was reset to NULL.
+
+Win32: When $HOME was set, would put "~user" in the swap file, which would
+never compare with a file name, and never cause the attention message. Put
+the full path in the swap file instead.
+
+Win32 console: There were funny characters at the end of the "vim -r" swap
+files message (direct output of CR CR LF).
+
+DOS 32 bit: "vim -r" put the text at the top of the window.
+
+GUI: With 'mousefocus' set, got mouse codes as text with "!sleep 100" or "Q".
+
+Motif and Win32 GUI: When changing 'guifont' to a font of the same size the
+screen wasn't redrawn.
+
+Unix: When using ":make", jumping to a file b.c, which is already open as a
+symbolic link a.c, opened a new buffer instead of using the existing one.
+
+Inserting text in the current buffer while sourcing the .vimrc file would
+cause a crash or hang. The memfile for the current buffer was never
+allocated. Now it's allocated as soon as something is written in the buffer.
+
+DOS 32 bit: "lightblue" background worked for text, but not drawn parts were
+black.
+
+DOS: Colors of console were not restored upon exiting.
+
+When recording, with 'cmdheight' set to 2 and typing Esc> in Insert mode
+caused the "recording" message to be doubled.
+
+Spurious "file changed" messages could happen on Windows. Now tolerate a one
+second difference, like for Linux.
+
+GUI: When returning from Ex mode, scrollbars were not updated.
+
+Win32: Copying text to the clipboard containing a <CR>, pasting it would
+replace it with a <NL> and drop the next character.
+
+Entering a double byte character didn't work if the second byte is in [xXoO].
+(Eric Lee)
+
+vim_realloc was both defined and had a prototype in proto/misc2.pro. Caused
+conflicts on Solaris.
+
+A pattern in an autocommand was treated differently on DOS et al. than on
+Unix. Now it's the same, also when using backslashes.
+
+When using <Tab> twice for command line completion, without a match, the <Tab>
+would be inserted. (Negri)
+
+Bug in MS-Visual C++ 6.0 when compiling ex_docmd.c with optimization. (Negri)
+
+Testing the result of mktemp() for failure was wrong. Could cause a crash.
+(Peters)
+
+GUI: When checking for a ".gvimrc" file in the current directory, didn't check
+for a "_gvimrc" file too.
+
+Motif GUI: When using the popup menu and then adding an item to the menu bar,
+the menu bar would get very high.
+
+Mouse clicks and special keys (e.g. cursor keys) quit the more prompt and
+dialogs. Now they are ignored.
+
+When at the more-prompt, xterm selection didn't work. Now use the 'r' flag in
+'mouse' also for the more-prompt.
+
+When selecting a Visual area of more than 1023 lines, with 'guioptions' set to
+"a", could mess up the display because of a message in free_yank(). Removed
+that message, except for the Amiga.
+
+Moved auto-selection from ui_write() to the screen update functions. Avoids
+unexpected behavior from a low-level function. Also makes the different
+feedback of owning the selection possible.
+
+Vi incompatibility: Using "i<CR>" in an indent, with 'ai' set, used the
+original indent instead of truncating it at the cursor. (Webb)
+
+":echo x" didn't stop at "q" for the more prompt.
+
+Various fixes for Macintosh. (St-Amant)
+
+When using 'selectmode' set to "exclusive", selecting a word and then using
+CTRL-] included the character under the cursor.
+
+Using ":let a:name" in a function caused a crash. (Webb)
+
+When using ":append", an empty line didn't scroll up.
+
+DOS etc.: A file name starting with '!' didn't work. Added '!' to default for
+'isfname'.
+
+BeOS: Compilation problem with prototype of skip_class_name(). (Price)
+
+When deleting more than one line, e.g., with "de", could still use "U"
+command, which didn't work properly then.
+
+Amiga: Could not compile ex_docmd.c, it was getting too big. Moved some
+functions to ex_cmds.c.
+
+The expand() function would add a trailing slash for directories.
+
+Didn't give an error message when trying to assign a value to an argument of a
+function. (Webb)
+
+Moved including sys/ptem.h to after termios.h. Needed for Sinix.
+
+OLE interface: Don't delete the object in CVimCF::Release() when the reference
+count becomes zero. (Cordell)
+VisVim could still crash on exit. (Erhardt)
+
+"case a: case b:" (two case statements in one line) aligned with the second
+case. Now it uses one 'sw' for indent. (Webb)
+
+Font initialisation wasn't right for Athena/Motif GUI. Moved the call to
+highlight_gui_started() gui_mch_init() to gui_mch_open(). (Nam)
+
+In Replace mode, backspacing over a TAB before where the replace mode started
+while 'sts' is different from 'ts', would delete the TAB.
+
+Win32 console: When executing external commands and switching between the two
+console screens, Vim would copy the text between the buffers. That caused the
+screen to be messed up for backtick expansion.
+
+":winpos -1" then ":winpos" gave wrong error message.
+
+Windows commander creates files called c:\tmp\$wc\abc.txt. Don't remove the
+backslash before the $. Environment variables were not expanded anyway,
+because of the backslash before the dollar.
+
+Using "-=" with ":set" could remove half a part when it contains a "\,".
+E.g., ":set path+=a\\,b" and then "set path-=b" removed ",b".
+
+When Visually selecting lines, with 'selection' set to "inclusive", including
+the last char of the line, "<<" moved an extra line. Also for other operators
+that always work on lines.
+
+link.sh changed "-lnsl_s" to "_s" when looking for "nsl" to be removed.
+Now it only removes whole words.
+
+When jumped to a mark or using "fz", and there is an error, the current column
+was lost. E.g. when using "$fzj".
+
+The "g CTRL-G" command could not be interrupted, even though it can take a
+long time.
+
+Some terminals do have <F4> and <xF4>. <xF4> was always interpreted as <F4>.
+Now map <xF4> to <F4>, so that the user can override this.
+
+When compiling os_win32.c with MIN_FEAT the apply_autocmds() should not be
+used. (Aaron)
+
+This autocommand looped forever: ":au FileChangedShell * ++nested e <afile>"
+Now FileChangeShell never nests. (Roemer)
+
+When evaluating an ":elseif" that was not going to matter anyway, ignore
+errors. (Roemer)
+
+GUI Lesstif: Tearoff bar was the last item, instead of the first.
+
+GUI Motif: Colors of tear-off widgets was wrong when 't' flag added to
+'guioptions' afterwards. When 't' flag in 'guioptions' is excluded, would
+still get a tearoff item in a new menu.
+
+An inode number can be "long long". Use ino_t instead of long. Added
+configure check for ino_t.
+
+Binary search for tags was using a file offset "long" instead of "off_t".
+
+Insert mode completion of tags was not using 'ignorecase' properly.
+
+In Insert mode, the <xFn> keys were not properly mapped to <Fn> for the
+default mappings. Also caused errors for ":mkvimrc" and ":mksession".
+
+When jumping to another window while in Insert mode, would get the "warning:
+changing readonly file" even when not making a change.
+
+A '(' or '{' inside a trailing "//" comment would disturb C-indenting.
+When using two labels below each other, the second one was not indented
+properly. Comments could mess up C-indenting in many places. (Roemer)
+
+Could delete or redefine a function while it was being used. Could cause a
+crash.
+In a function it's logical to prepend "g:" to a system variable, but this
+didn't work. (Roemer)
+
+Hangul input: Buffer would overflow when user inputs invalid key sequence.
+(Nam)
+
+When BufLoad or BufEnter autocommands change the topline of the buffer in the
+window, it was overruled and the cursor put halfway the window. Now only put
+the cursor halfway if the autocommands didn't change the topline.
+
+Calling exists("&option") always returned 1. (Roemer)
+
+Win32: Didn't take actually available memory into account. (Williams)
+
+White space after an automatically inserted comment leader was not removed
+when 'ai' is not set and <CR> hit just after inserting it. (Webb)
+
+A few menus had duplicated accelerators. (Roemer)
+
+Spelling errors in documentation, quite a few "the the". (Roemer)
+
+Missing prototypes for Macintosh. (Kielhorn)
+
+Win32: When using 'shellquote' or 'shellxquote', the "!start cmd" wasn't
+executed in a disconnected process.
+
+When resizing the window, causing a line before the cursor to wrap or unwrap,
+the cursor was displayed in the wrong position.
+
+There was quite a bit of dead code when compiling with minimal features.
+
+When doing a ":%s///" command that makes lines shorter, such that lines above
+the final cursor position no longer wrap, the cursor position was not updated.
+
+get_id_list() could allocate an array one too small, when a "contains=" item
+has a wildcard that matches a group name that is added just after it. E.g.:
+"contains=a.*b,axb". Give an error message for it.
+
+When yanking a Visual area and using the middle mouse button -> crash. When
+clipboard doesn't work, now make "* always use "".
+
+Win32: Using ":buf a\ b\file" didn't work, it was interpreted as "ab\file".
+
+Using ":ts ident", then hit <CR>, with 'cmdheight' set to 2: command line was
+not cleared, the tselect prompt was on the last but one line.
+
+mksession didn't restore the cursor column properly when it was after a tab.
+Could not get all windows back when using a smaller terminal screen. Didn't
+restore all windows when "winsize" was not in 'sessionoptions'. (Webb)
+
+Command line completion for ":buffer" depended on 'ignorecase' for Unix, but
+not for DOS et al. Now don't use 'ignorecase', but let it depend on whether
+file names are case sensitive or not (like when expanding file names).
+
+Win32 GUI: (Negri)
+- Redrawing the background caused flicker when resizing the window. Removed
+ _OnEraseBG(). Removed CS_HREDRAW and CS_VREDRAW flags from the
+ sndclass.style.
+- Some parts of the window were drawn in grey, instead of using the color from
+ the user color scheme.
+- Dropping a file on gvim didn't activate the window.
+- When there is no menu ('guioptions' excludes 'm'), never use the ALT key for
+ it.
+
+GUI: When resizing the window, would make the window height a bit smaller.
+Now round off to the nearest char cell size. (Negri)
+
+In Vi the ")" and "(" commands don't stop at a single space after a dot.
+Added 'J' flag in 'cpoptions' to make this behave Vi compatible. (Roemer)
+
+When saving a session without any buffers loaded, there would be a ":normal"
+command without arguments in it. (Webb)
+
+Memory leaks fixed: (Madsen)
+- eval.c: forgot to release func structure when func deleted
+- ex_docmd.c: forgot to release string after "<sfile>"
+- misc1.c: leak when completion pattern had no matches.
+- os_unix.c: forgot to release regexp after file completions
+
+Could crash when using a buffer without a name. (Madsen)
+Could crash when doing file name completion, because of backslash_halve().
+(Madsen)
+
+":@a" would do mappings on register a, which is not Vi compatible. (Roemer)
+
+":g/foo.*()/s/foobar/_&/gc" worked fine, but then "n" searched for "foobar"
+and displayed "/foo.*()". (Roemer)
+
+OS/2: get_cmd_output() was not included. Didn't check for $VIM/.vimrc file.
+
+Command line completion of options didn't work after "+=" and "-=".
+
+Unix configure: Test for memmove()/bcopy()/memcpy() tried redefining these
+functions, which could fail if they are defined already. Use mch_memmove() to
+redefine.
+
+Unix: ":let a = expand("`xterm`&")" started an xterm asynchronously, but
+":let a = expand("`xterm&`")" generated an error message, because the
+redirection was put after the '&'.
+
+Win32 GUI: Dialog buttons could not be selected properly with cursor keys,
+when the default is not the first button. (Webb)
+
+The "File has changed since editing started" (when regaining focus) could not
+always be seen. (Webb)
+
+When starting with "ex filename", the file message was overwritten with
+the "entering Ex mode" message.
+
+Output of ":tselect" listed name of file directly from the tags file. Now it
+is corrected for the position of the tags file.
+
+When 'backspace' is 0, could backspace over autoindent. Now it is no longer
+allowed (Vi compatible).
+
+In Replace mode, when 'noexpandtab' and 'smarttab' were set, and inserting
+Tabs, backspacing didn't work correctly for Tabs inserted at the start of the
+line (unless 'sts' was set too). Also, when replacing the first non-blank
+after which is a space, rounding the indent was done on the first non-blank
+instead of on the character under the cursor.
+
+When 'sw' at 4, 'ts' at 8 and 'smarttab' set: When a tab was appended after
+four spaces (they are replaced with a tab) couldn't backspace over the tab.
+
+In Insert mode, with 'bs' set to 0, couldn't backspace to before autoindent,
+even when it was removed with CTRL-D.
+
+When repeating an insert command where a <BS>, <Left> or other key causes an
+error, would flush buffers and remain in Insert mode. No longer flush
+buffers, only beep and continue with the insert command.
+
+Dos and Win32 console: Setting t_me didn't work to get another color. Made
+this works backwards compatible.
+
+For Turkish (LANG = "tr") uppercase 'i' is not an 'I'. Use ASCII uppercase
+translation in vim_strup() to avoid language problems. (Komur)
+
+Unix: Use usleep() or nanosleep() for mch_delay() when available. Hopefully
+this avoids a hangup in select(0, ..) for Solaris 2.6.
+
+Vim would crash when using a script file with 'let &sp = "| tee"', starting
+vim with "vim -u test", then doing ":set sp=". The P_WAS_SET flag wasn't set
+for a string option, could cause problems with any string option.
+
+When using "cmd | vim -", stdin is not a terminal. This gave problems with
+GPM (Linux console mouse) and when executing external commands. Now close
+stdin and re-open it as a copy of stderr.
+
+Syntax highlighting: A "nextgroup" item was not properly stored in the state
+list. This caused missing of next groups when not redrawing from start to
+end, but starting halfway.
+
+Didn't check for valid values of 'ttymouse'.
+
+When executing an external command from the GUI, waiting for the child to
+terminate might not work, causing a hang. (Parmelan)
+
+"make uninstall" didn't delete the vimrc_example.vim and gvimrc_example.vim
+files and the vimtutor.
+
+Win32: "expand("%:p:h")" with no buffer name removed the directory name.
+"fnamemodify("", ":p")" did not add a trailing slash, fname_case() removed it.
+
+Fixed: When 'hlsearch' was set and the 'c' flag was not in 'cpoptions':
+highlighting was not correct. Now overlapping matches are handled correctly.
+
+Athena, Motif and GTK GUI: When started without focus, cursor was shown as if
+with focus.
+
+Don't include 'shellpipe' when compiled without quickfix, it's not used.
+Don't include 'dictionary' option when compiled without the +insert_expand
+feature.
+Only include the 'shelltype' option for the Amiga.
+
+When making a change to a line, with 'hlsearch' on, causing it to wrap, while
+executing a register, the screen would not be updated correctly. This was a
+generic problem in update_screenline() being called while must_redraw is
+VALID.
+
+Using ":bdelete" in a BufUnload autocommand could cause a crash. The window
+height was added to another window twice in close_window().
+
+Win32 GUI: When removing a menu item, the tearoff wasn't updated. (Negri)
+
+Some performance bottlenecks removed. Allocating memory was not efficient.
+For Win32 checking for available memory was slow, don't check it every time
+now. On NT obtaining the user name takes a long time, cache the result (for
+all systems).
+
+fnamemodify() with an argument ":~:." or ":.:~" didn't work properly.
+
+When editing a new file and exiting, the marks for the buffer were not saved
+in the viminfo file.
+
+":confirm only" didn't put up a dialog.
+
+These text objects didn't work when 'selection' was "exclusive": va( vi( va{
+vi{ va< vi< vi[ va[.
+
+The dialog for writing a readonly file didn't have a valid default. (Negri)
+
+The line number used for error messages when sourcing a file was reset when
+modelines were inspected. It was wrong when executing a function.
+
+The file name and line number for an error message wasn't displayed when it
+was the same as for the last error, even when this was long ago. Now reset
+the name/lnum after a hit-enter prompt.
+
+In a session file, a "%" in a file name caused trouble, because fprintf() was
+used to write it to the file.
+
+When skipping statements, a mark in an address wasn't skipped correctly:
+"ka|if 0|'ad|else|echo|endif". (Roemer)
+
+":wall" could overwrite a not-edited file without asking.
+
+GUI: When $DISPLAY was not set or starting the GUI failed in another way, the
+console mode then started with wrong colors and skipped initializations. Now
+do an early check if the GUI can be started. Don't source the menu.vim or
+gvimrc when it will not. Also do normal terminal initializations if the GUI
+might not start.
+
+When using a BufEnter autocommand to position the cursor and scroll the
+window, the cursor was always put at the last used line and halfway the window
+anyhow.
+
+When 'wildmode' was set to "longest,list:full", ":e *.c<Tab><Tab>" didn't list
+the matches. Also avoid that listing after a "longest" lists the wrong
+matches when the first expansion changed the string in front of the cursor.
+
+When using ":insert", ":append" or ":change" inside a while loop, was not able
+to break out of it with a CTRL-C.
+
+Win32: ":e ." took an awful long time before an error message when used in
+"C:\". Was caused by adding another backslash and then trying to get the full
+name for "C:\\".
+
+":winpos -10 100" was working like ":winpos -10 -10", because a pointer was
+not advanced past the '-' sign.
+
+When obtaining the value of a hidden option, would give an error message. Now
+just use a zero value.
+
+OS/2: Was using argv[0], even though it was not a useful name. It could be
+just "vim", found in the search path.
+
+Xterm: ":set columns=78" didn't redraw properly (when lines wrap/unwrap) until
+after a delay of 'updatetime'. Didn't check for the size-changed signal.
+
+'scrollbind' didn't work in Insert mode.
+Horizontal scrollbinding didn't always work for "0" and "$" commands (e.g.,
+when 'showcmd' was off).
+
+When compiled with minimal features but with GUI, switching on the mouse in an
+xterm caused garbage, because the mouse codes were not recognized. Don't
+enable the mouse when it can't be recognized. In the GUI it also didn't work,
+the arguments to the mouse code were not interpreted.
+
+When 'showbreak' used, in Insert mode, when the cursor is just after the last
+character in the line, which is also the in the rightmost column, the cursor
+position would be like the 'showbreak' string is shown, but it wasn't.
+
+Autocommands could move the cursor in a new file, so that CTRL-W i didn't show
+the right line. Same for when using a filemark to jump to another file.
+
+When redefining the argument list, the title used for other windows could be
+showing the wrong info about the position in the argument list. Also update
+this for a ":split" command without arguments.
+
+When editing file 97 of 13, ":Next" didn't work. Now it goes to the last
+file in the argument list.
+
+Insert mode completion (for dictionaries or included files) could not be
+interrupted by typing an <Esc>. Could get hit-enter prompt after line
+completion, or whenever the informative message would get too long.
+
+When using the ":edit" command to re-edit the same file, an autocommand to
+jump to the last cursor position caused the cursor to move. Now set the last
+used cursor position to avoid this.
+
+When 'comments' has a part that starts with white space, formatting the
+comment didn't work.
+
+At the ":tselect" prompt Normal mode mappings were used. That has been
+disabled.
+
+When 'selection' is not "old", some commands still didn't allow the cursor
+past the end-of-line in Visual mode.
+
+Athena: When a menu was deleted, it would appear again (but not functional)
+when adding another menu. Now they don't reappear anymore (although they are
+not really deleted either).
+
+Borland C++ 4.x had an optimizer problem in fill_breakat_flags(). (Negri)
+
+"ze" didn't work when 'number' was on. (Davis)
+
+Win32 GUI: Intellimouse code didn't work properly on Windows 98. (Robinson)
+
+A few files were including proto.h a second time, after vim.h had already done
+that, which could cause problems with the vim_realloc() macro.
+
+Win32 console: <M-x> or ALT-x was not recognized. Also keypad '+', '-' and
+'*'. (Negri)
+MS-DOS: <M-x> didn't work, produced a two-byte code. Now the alphabetic and
+number keys work. (Negri)
+
+When finding a lot of matches for a tag completion, the check for avoiding
+double matches could take a lot of time. Add a line_breakcheck() to be able
+to interrupt this. (Deshpande)
+
+When the command line was getting longer than the screen, the more-prompt
+would be given regularly, and the cursor position would be wrong. Now only
+show the part of the command line that fits on the screen and force the cursor
+to be positioned on the visible part. There can be text after the cursor
+which isn't editable.
+
+At the more prompt and with the console dialog, a cursor key was interpreted
+as <Esc> and OA. Now recognize special keys in get_keystroke(). Ignore mouse
+and scrollbar events.
+
+When typing a BS after inserting a middle comment leader, typing the last char
+of the end comment leader still changed it into the end comment leader. (Webb)
+
+When a file system is full, writing to a swap file failed. Now first try to
+write one block to the file. Try next entry in 'dir' if it fails.
+
+When "~" is in 'whichwrap', doing "~" on last char of a line didn't update the
+display.
+
+Unix: Expanding wildcards for ":file {\\}" didn't work, because "\}" was
+translated to "}" before the shell got it. Now don't remove backslashes when
+wildcards are going to be expanded.
+
+Unix: ":e /tmp/$uid" didn't work. When expanding environment variables in a
+file name doesn't work, use the shell to expand the file name. ":e /tmp/$tty"
+still doesn't work though.
+
+"make test" didn't always work on DOS/Windows for test30, because it depended
+on the external "echo" command.
+
+The link.sh script used "make" instead of $MAKE from the Makefile. Caused
+problems for generating pathdef.c when "make" doesn't work properly.
+
+On versions that can do console and GUI: In the console a typed CSI code could
+cause trouble.
+
+The patterns in expression evaluation didn't ignore the 'l' flag in
+'cpoptions'. This broke the working of <CR> in the options window.
+
+When 'hls' off and 'ai' on, "O<Esc>" did remove the indent, but it was still
+highlighted red for trailing space.
+
+Win32 GUI: Dropping an encrypted file on a running gvim didn't work right. Vim
+would loop while outputting "*" characters. vgetc() was called recursively,
+thus it returns NUL. Added safe_vgetc(), which reads input directly from the
+user in this situation.
+
+While reading text from stdin, only an empty screen was shown. Now show that
+Vim is reading from stdin.
+
+The cursor shape wasn't set properly when returning to Insert mode, after
+using a CTRL-O /asdf command which fails. It would be OK after a few seconds.
+Now it's OK right away.
+
+The 'isfname' default for DOS/Windows didn't include the '@' character. File
+names that contained "dir\@file" could not be edited.
+
+Win32 console: <C-S-Left> could cause a crash when compiled with Borland or
+egcs. (Aaron)
+
+Unix and VMS: "#if HAVE_DIRENT_H" caused problems for some compilers. Use
+"#ifdef HAVE_DIRENT_H" instead. (Jones)
+
+When a matching tag is in the current file but has a search pattern that
+doesn't match, the cursor would jump to the first line.
+
+Unix: Dependencies for pty.c were not included in Makefile. Dependency of
+ctags/config.h was not included (only matters for parallel make).
+
+Removed a few Uninitialized Memory Reads (potential crashes). In do_call()
+calling clear_var() when not evaluating. In win32_expandpath() and
+dos_expandpath() calling backslash_halve() past the end of a file name.
+
+Removed memory leaks: Set_vim_var_string() never freed the value. The
+next_list for a syntax keyword was never freed.
+
+On non-Unix systems, using a file name with wildcards without a match would
+silently fail. E.g., ":e *.sh". Now give a "No match" error message.
+
+The life/life.mac, urm/urm.mac and hanoi/hanoi.mac files were not recognized
+as Vim scripts. Renamed them to *.vim.
+
+[Note: some numbered patches are not relevant when upgrading from version 5.3,
+they have been removed]
+
+Patch 5.4m.1
+Problem: When editing a file with a long name, would get the hit-enter
+ prompt, even though all settings are such that the name should be
+ truncated to avoid that. filemess() was printing the file name
+ without truncating it.
+Solution: Truncate the message in filemess(). Use the same code as for
+ msg_trunc_attr(), which is moved to the new function
+ msg_may_trunc().
+Files: src/message.c, src/proto/message.pro, src/fileio.c
+
+Patch 5.4m.3
+Problem: The Motif libraries were not found by configure for Digital Unix.
+Solution: Add "/usr/shlib" to the search path. (Andy Kahn)
+Files: src/configure.in, src/configure
+
+Patch 5.4m.5
+Problem: Win32 GUI: When using the Save-As menu entry and selecting an
+ existing file in the file browser, would get a dialog to confirm
+ overwriting twice. (Ed Krall)
+Solution: Removed the dialog from the file browser. It would be nicer to
+ set the "forceit" flag and skip Vim's ":confirm" dialog, but it
+ requires quite a few changes to do that.
+Files: src/gui_w32.c
+
+Patch 5.4m.6
+Problem: Win32 GUI: When reading text from stdin, e.g., "cat foo | gvim -",
+ a message box would pop up with "-stdin-" (when exiting). (Michael
+ Schaap)
+Solution: Don't switch off termcap mode for versions that are GUI-only.
+ They use another terminal to read from stdin.
+Files: src/main.c, src/fileio.c
+
+Patch 5.4m.7
+Problem: Unix: running configure with --enable-gtk-check,
+ --enable-motif-check, --enable-athena-check or --enable-gtktest
+ had the reverse effect. (Thomas Koehler)
+Solution: Use $enable_gtk_check variable correctly in AC_ARG_ENABLE().
+Files: src/configure.in, src/configure
+
+Patch 5.4m.9
+Problem: Multi-byte: With wrapping lines, the cursor was sometimes 2
+ characters to the left. Syntax highlighting was wrong when a
+ double-byte character was split for a wrapping line. When
+ 'showbreak' was on the splitting also didn't work.
+Solution: Adjust getvcol() and win_line(). (Chong-Dae Park)
+Files: src/charset.c, src/screen.c
+
+Patch 5.4m.11
+Problem: The ":call" command didn't check for illegal trailing characters.
+ (Stefan Roemer)
+Solution: Add the check in do_call().
+Files: src/eval.c
+
+Patch 5.4m.13
+Problem: With the ":s" command:
+ 1. When performing a substitute command, the mouse would be
+ disabled and enabled for every substitution.
+ 2. The cursor position could be beyond the end of the line.
+ Calling line_breakcheck() could try to position the cursor,
+ which causes a crash in the Win32 GUI.
+ 3. When using ":s" in a ":g" command, the cursor was not put on
+ the first non-white in the line.
+ 4. There was a hit-enter prompt when confirming the substitution
+ and the replacement was a bit longer.
+Solution: 1. Only disable/enable the mouse when asking for confirmation.
+ 2. Always put the cursor on the first character, it is going to be
+ moved to the first non-blank anyway.
+ Don't use the cursor position in gui_mch_draw_hollow_cursor(),
+ get the character from the screen buffer.
+ 3. Added global_need_beginline flag to call beginline() after ":g"
+ has finished all substitutions.
+ 4. Clear the need_wait_return flag after prompting the user.
+Files: src/ex_cmds.c, src/gui_w32.c
+
+Patch 5.4m.14
+Problem: When doing "vim xxx", ":opt", ":only" and then ":e xxx" we end
+ up with two swapfiles for "xxx". That is caused by the ":bdel"
+ command which is executed when unloading the option-window.
+ Also, there was no check if closing a buffer made the new one
+ invalid, this could cause a crash.
+Solution: When closing a buffer causes the current buffer to be deleted,
+ use the new buffer to replace it. Also detect that the new buffer
+ has become invalid as a side effect of closing the current one.
+ Make autocommand that calls ":bdel" in optwin.vim nested, so that
+ the buffer loading it triggers also executes autocommands.
+ Also added a test for this in test13.
+Files: runtime/optwin.vim, src/buffer.c, src/ex_cmds.c, src/globals.h
+ src/testdir/test13.in, src/testdir/test13.ok
+
+Patch 5.4m.15
+Problem: When using a BufEnter autocommand to reload the syntax file,
+ conversion to HTML caused a crash. (Sung-Hyun Nam)
+Solution: When using ":syntax clear" the current stack of syntax items was
+ not cleared. This will cause memory to be used that has already
+ been freed. Added call to invalidate_current_state() in
+ syntax_clear().
+Files: src/syntax.c
+
+Patch 5.4m.17
+Problem: When omitting a ')' in an expression it would not be seen as a
+ failure.
+ When detecting an error inside (), there would be an error message
+ for a missing ')' too.
+ When using ":echo 1+|echo 2" there was no error message. (Roemer)
+ When using ":exe 1+" there was no error message.
+ When using ":return 1+" there was no error message.
+Solution: Fix do_echo(), do_execute() and do_return() to give an error
+ message when eval1() returns FAIL.
+ Fix eval6() to handle trailing ')' correctly and return FAIL when
+ it's missing.
+Files: src/eval.c
+
+Patch 5.4m.18
+Problem: When using input() from inside an expression entered with
+ "CTRL-R =" on the command line, there could be a crash. And the
+ resulting command line was wrong.
+Solution: Added getcmdline_prompt(), which handles recursive use of
+ getcmdline() correctly. It also sets the command line prompt.
+ Removed cmdline_prompt(). Also use getcmdline_prompt() for
+ getting the crypt key in get_crypt_key().
+Files: src/proto/ex_getln.pro, src/ex_getln.c, src/eval.c, src/misc2.c
+
+Patch 5.4m.21
+Problem: When starting up, the screen structures were first allocated at
+ the minimal size, then initializations were done with Rows
+ possibly different from screen_Rows. Caused a crash in rare
+ situations (GTK with XIM and fontset).
+Solution: Call screenalloc() in main() only after calling ui_get_winsize().
+ Also avoids a potential delay because of calling screenclear()
+ while "starting" is non-zero.
+Files: src/main.c
+
+Patch 5.4m.22
+Problem: In the GUI it was possible that the screen was resized and the
+ screen structures re-allocated while redrawing the screen. This
+ could cause a crash (hard to reproduce). The call sequence goes
+ through update_screen() .. syntax_start() .. ui_breakcheck() ..
+ gui_resize_window() .. screenalloc().
+Solution: Set updating_screen while redrawing. If the window is resized
+ remember the new size and handle it only after redrawing is
+ finished.
+ This also fixes that resizing the screen while still redrawing
+ (slow syntax highlighting) would not work properly.
+ Also disable display_hint, it was never used.
+Files: src/globals.h, src/gui.c, src/screen.c, src/proto/gui.pro
+
+Patch 5.4m.23
+Problem: When using expand("<cword>") when there was no word under the
+ cursor, would get an error message. Same for <cWORD> and <cfile>.
+Solution: Don't give an error message, return an empty string.
+Files: src/eval.c
+
+Patch 5.4m.24
+Problem: ":help \|" didn't find anything. It was translated to "/\\|".
+Solution: Translate "\|" into "\\bar". First check the table for specific
+ translations before checking for "\x".
+Files: src/ex_cmds.c
+
+Patch 5.4m.25
+Problem: Unix: When using command line completion on files that contain
+ ''', '"' or '|' the file name could not be used.
+ Adding this file name to the Buffers menu caused an error message.
+Solution: Insert a backslash before these three characters.
+ Adjust Mungename() function to insert a backslash before '|'.
+Files: src/ex_getln.c, runtime/menu.vim
+
+Patch 5.4m.26
+Problem: When using a mapping of two function keys, e.g., <F1><F1>, and
+ only the first char of the second key has been read, the mapping
+ would not be recognized. Noticed on some Unix systems with xterm.
+Solution: Add 'K' flag to 'cpoptions' to wait for the whole key code, even
+ when halfway a mapping.
+Files: src/option.h, src/term.c
+
+Patch 5.4m.27
+Problem: When making test33 without the lisp feature it hangs. Interrupting
+ the execution of the script then might cause a crash.
+Solution: In inchar(), after closing a script, don't use buf[] anymore.
+ closescript() has freed typebuf[] and buf[] might be pointing
+ inside typebuf[].
+ Avoid that test33 hangs when the lisp feature is missing.
+Files: src/getchar.c src/testdir/test33.in
+
+"os2" was missing from the feature list. Useful for has("os2").
+
+BeOS:
+- Included patches from Richard Offer for BeOS R4.5.
+- menu code didn't work right. Crashed in the Buffers menu. The window title
+ wasn't set. (Offer)
+
+Patch 5.4n.3
+Problem: C-indenting was wrong after " } else". The white space was not
+ skipped. Visible when 'cino' has "+10".
+Solution: Skip white space before calling cin_iselse(). (Norbert Zeh)
+Files: src/misc1.c
+
+Patch 5.4n.4
+Problem: When the 't' flag in 'cpoptions' is included, after a
+ ":nohlsearch" the search highlighting would not be enabled again
+ after a tag search. (Norbert Zeh)
+Solution: When setting the new search pattern in jumpto_tag(), don't restore
+ no_hlsearch.
+Files: src/tag.c
+
+Patch 5.4n.5
+Problem: When using ":normal" from a CursorHold autocommand Vim hangs. The
+ autocommand is executed down from vgetc(). Calling vgetc()
+ recursively to execute the command doesn't work then.
+Solution: Forbid the use of ":normal" when vgetc_busy is set. Give an error
+ message when this happens.
+Files: src/ex_docmd.c, runtime/doc/autocmd.txt
+
+Patch 5.4n.6
+Problem: "gv" could reselect a Visual that starts and/or ends past the end
+ of a line. (Robert Webb)
+Solution: Check that the start and end of the Visual area are on a valid
+ character by calling adjust_cursor().
+Files: src/normal.c
+
+Patch 5.4n.8
+Problem: When a mark was on a non existing line (e.g., when the .viminfo
+ was edited), jumping to it caused ml_get errors. (Alexey
+ Marinichev).
+Solution: Added check_cursor_lnum() in nv_gomark().
+Files: src/normal.c
+
+Patch 5.4n.9
+Problem: ":-2" moved the cursor to a negative line number. (Ralf Schandl)
+Solution: Give an error message for a negative line number.
+Files: src/ex_docmd.c
+
+Patch 5.4n.10
+Problem: Win32 GUI: At the hit-enter prompt, it was possible to scroll the
+ text. This erased the prompt and made Vim look like it is in
+ Normal mode, while it is actually still waiting for a <CR>.
+Solution: Disallow scrolling at the hit-enter prompt for systems that use
+ on the fly scrolling.
+Files: src/message.c
+
+Patch 5.4n.14
+Problem: Win32 GUI: When using ":winsize 80 46" and the height is more than
+ what fits on the screen, the window size was made smaller than
+ asked for (that's OK) and Vim crashed (that's not OK)>
+Solution: Call check_winsize() from gui_set_winsize() to resize the windows.
+Files: src/gui.c
+
+Patch 5.4n.16
+Problem: Win32 GUI: The <F10> key both selected the menu and was handled as
+ a key hit.
+Solution: Apply 'winaltkeys' to <F10>, like it is used for Alt keys.
+Files: src/gui_w32.c
+
+Patch 5.4n.17
+Problem: Local buffer variables were freed when the buffer is unloaded.
+ That's not logical, since options are not freed. (Ron Aaron)
+Solution: Free local buffer variables only when deleting the buffer.
+Files: src/buffer.c
+
+Patch 5.4n.19
+Problem: Doing ":e" (without argument) in an option-window causes trouble.
+ The mappings for <CR> and <Space> are not removed. When there is
+ another buffer loaded, the swap file for it gets mixed up.
+ (Steve Mueller)
+Solution: Also remove the mappings at the BufUnload event, if they are still
+ present.
+ When re-editing the same file causes the current buffer to be
+ deleted, don't try editing it.
+ Also added a test for this situation.
+Files: runtime/optwin.vim, src/ex_cmds.c, src/testdir/test13.in,
+ src/testdir/test13.ok
+
+Patch 5.4n.24
+Problem: BeOS: configure never enabled the GUI, because $with_x was "no".
+ Unix prototypes caused problems, because Display and Widget are
+ undefined.
+ Freeing fonts on exit caused a crash.
+Solution: Only disable the GUI when $with_x is "no" and $BEOS is not "yes".
+ Add dummy defines for Display and Widget in proto.h.
+ Don't free the fonts in gui_exit() for BeOS.
+Files: src/configure.in, src/configure, src/proto.h, src/gui.c.
+
+
+The runtime/vim48x48.xpm icon didn't have a transparent background. (Schild)
+
+Some versions of the mingw32/egcs compiler didn't have WINBASEAPI defined.
+(Aaron)
+
+VMS:
+- mch_setenv() had two arguments instead of three.
+- The system vimrc and gvimrc files were called ".vimrc" and ".gvimrc".
+ Removed the dot.
+- call to RealWaitForChar() had one argument too many. (Campbell)
+- WaitForChar() is static, removed the prototype from proto/os_vms.pro.
+- Many file accesses failed, because Unix style file names were used.
+ Translate file names to VMS style by using vim_fopen().
+- Filtering didn't work, because the temporary file name was generated wrong.
+- There was an extra newline every 9192 characters when writing a file. Work
+ around it by writing line by line. (Campbell)
+- os_vms.c contained "# typedef int DESC". Should be "typedef int DESC;".
+ Only mattered for generating prototypes.
+- Added file name translation to many places. Made easy by defining macros
+ mch_access(), mch_fopen(), mch_fstat(), mch_lstat() and mch_stat().
+- Set default for 'tagbsearch' to off, because binary tag searching apparently
+ doesn't work for VMS.
+- make mch_get_host_name() work with /dec and /standard=vaxc. (Campbell)
+
+
+Patch 5.4o.2
+Problem: Crash when using "gf" on "file.c://comment here". (Scott Graham)
+Solution: Fix wrong use of pointers in get_file_name_in_path().
+Files: src/window.c
+
+Patch 5.4o.3
+Problem: The horizontal scrollbar was not sized correctly when 'number' is
+ set and 'wrap' not set.
+ Athena: Horizontal scrollbar wasn't updated when the cursor was
+ positioned with a mouse click just after dragging.
+Solution: Subtract 8 from the size when 'number' set and 'wrap' not set.
+ Reset gui.dragged_sb when a mouse click is received.
+Files: src/gui.c
+
+Patch 5.4o.4
+Problem: When running in an xterm and $WINDOWID is set to an illegal value,
+ Vim would exit with "Vim: Got X error".
+Solution: When using the display which was opened for the xterm clipboard,
+ check if x11_window is valid by trying to obtain the window title.
+ Also add a check in setup_xterm_clip(), for when using X calls to
+ get the pointer position in an xterm.
+Files: src/os_unix.c
+
+Patch 5.4o.5
+Problem: Motif version with Lesstif: When removing the menubar and then
+ using a menu shortcut key, Vim would crash. (raf)
+Solution: Disable the menu mnemonics when the menu bar is removed.
+Files: src/gui_motif.c
+
+Patch 5.4o.9
+Problem: The DOS install.exe program used the "move" program. That doesn't
+ work on Windows NT, where "move" is internal to cmd.exe.
+Solution: Don't use an external program for moving the executables. Use C
+ functions to copy the file and delete the original.
+Files: src/dosinst.c
+
+Motif and Athena obtained the status area height differently from GTK. Moved
+status_area_enabled from global.h to gui_x11.c and call
+xim_get_status_area_height() to get the status area height.
+
+Patch 5.4p.1
+Problem: When using auto-select, and the "gv" command is used, would not
+ always obtain ownership of the selection. Caused by the Visual
+ area still being the same, but ownership taken away by another
+ program.
+Solution: Reset the clipboard Visual mode to force updating the selection.
+Files: src/normal.c
+
+Patch 5.4p.2
+Problem: Motif and Athena with XIM: Typing 3-byte
+ <multibyte><multibyte><space> doesn't work correctly with Ami XIM.
+Solution: Avoid using key_sym XK_VoidSymbol. (Nam)
+Files: src/multbyte.c, src/gui_x11.c
+
+Patch 5.4p.4
+Problem: Win32 GUI: The scrollbar values were reduced for a file with more
+ than 32767 lines. But this info was kept global for all
+ scrollbars, causing a mixup between the windows.
+ Using the down arrow of a scrollbar in a large file didn't work.
+ Because of round-off errors there is no scroll at all.
+Solution: Give each scrollbar its own scroll_shift field. When the down
+ arrow is used, scroll several lines.
+Files: src/gui.h, src/gui_w32.c
+
+Patch 5.4p.5
+Problem: When changing buffers in a BufDelete autocommand, there could be
+ ml_line errors and/or a crash. (Schandl) Was caused by deleting
+ the current buffer.
+Solution: When the buffer to be deleted unexpectedly becomes the current
+ buffer, don't delete it.
+ Also added a check for this in test13.
+Files: src/buffer.c, src/testdir/test13.in, src/testdir/test13.ok
+
+Patch 5.4p.7
+Problem: Win32 GUI: When using 'mousemodel' set to "popup_setpos" and
+ clicking the right mouse button outside of the selected area, the
+ selected area wasn't removed until the popup menu has gone.
+ (Aaron)
+Solution: Set the cursor and update the display before showing the popup
+ menu.
+Files: src/normal.c
+
+Patch 5.4p.8
+Problem: The generated bugreport didn't contain information about
+ $VIMRUNTIME and whether runtime files actually exist.
+Solution: Added a few checks to the bugreport script.
+Files: runtime/bugreport.vim
+
+Patch 5.4p.9
+Problem: The windows install.exe created a wrong entry in the popup menu.
+ The "%1" was "". The full directory was included, even when the
+ executable had been moved elsewhere. (Ott)
+Solution: Double the '%' to get one from printf. Only include the path to
+ gvim.exe when it wasn't moved and it's not in $PATH.
+Files: src/dosinst.c
+
+Patch 5.4p.10
+Problem: Win32: On top of 5.4p.9: The "Edit with Vim" entry sometimes used
+ a short file name for a directory.
+Solution: Change the "%1" to "%L" in the registry entry.
+Files: src/dosinst.c
+
+Patch 5.4p.11
+Problem: Motif, Athena and GTK: When closing the GUI window when there is a
+ changed buffer, there was only an error message and Vim would not
+ exit.
+Solution: Put up a dialog, like for ":confirm qa". Uses the code that was
+ already used for MS-Windows.
+Files: src/gui.c, src/gui_w32.c
+
+Patch 5.4p.12
+Problem: Win32: Trying to expand a string that is longer than 256
+ characters could cause a crash. (Steed)
+Solution: For the buffer in win32_expandpath() don't use a fixed size array,
+ allocate it.
+Files: src/os_win32.c
+
+MSDOS: Added "-Wall" to Makefile.djg compile flags. Function prototypes for
+fname_case() and mch_update_cursor() were missing. "fd" was unused in
+mf_sync(). "puiLocation" was unused in myputch(). "newcmd" unused in
+mch_call_shell() for DJGPP version.
+
+==============================================================================
+VERSION 5.5 *version-5.5*
+
+Version 5.5 is a bug-fix version of 5.4.
+
+
+Changed *changed-5.5*
+-------
+
+The DJGPP version is now compiled with "-O2" instead of "-O4" to reduce the
+size of the executables.
+
+Moved the src/STYLE file to runtime/doc/develop.txt. Added the design goals
+to it.
+
+'backspace' is now a string option. See patch 5.4.15.
+
+
+Added *added-5.5*
+-----
+
+Included Exuberant Ctags version 3.3. (Darren Hiebert)
+
+In runtime/mswin.vim, map CTRL-Q to CTRL-V, so that CTRL-Q can be used
+everywhere to do what CTRL-V used to do.
+
+Support for decompression of bzip2 files in vimrc_example.vim.
+
+When a patch is included, the patch number is entered in a table in version.c.
+This allows skipping a patch without breaking a next one.
+
+Support for mouse scroll wheel in X11. See patch 5.5a.14.
+
+line2byte() can be used to get the size of the buffer. See patch 5.4.35.
+
+The CTRL-R CTRL-O r and CTRL-R CTRL-P r commands in Insert mode are used to
+insert a register literally. See patch 5.4.48.
+
+Uninstall program for MS-Windows. To be able to remove the registry entries
+for "Edit with Vim". It is registered to be run from the "Add/Remove
+programs" application. See patch 5.4.x7.
+
+
+Fixed *fixed-5.5*
+-----
+
+When using vimrc_example.vim: An error message when the cursor is on a line
+higher than the number of lines in the compressed file. Move the autocommand
+for jumping to the last known cursor position to after the decompressing
+autocommands.
+
+":mkexrc" and ":mksession" wrote the current value of 'textmode'. That may
+mark a file as modified, which causes problems. This is a buffer-specific
+setting, it should not affect all files.
+
+"vim --version" wrote two empty lines.
+
+Unix: The alarm signal could kill Vim. It is generated by the Perl alarm()
+function. Ignore SIGALRM.
+
+Win32 GUI: Toolbar still had the yellow bitmap for running a Vim script.
+
+BeOS: "tmo" must be bigtime_t, instead of double. (Seibert)
+
+Patch 5.4.1
+Problem: Test11 fails when $GZIP is set to "-v". (Matthew Jackson)
+Solution: Set $GZIP to an empty string.
+Files: src/testdir/test11.in
+
+Patch 5.4.2
+Problem: Typing <Esc> at the crypt key prompt caused a crash. (Kallingal)
+Solution: Check for a NULL pointer returned from get_crypt_key().
+Files: src/fileio.c
+
+Patch 5.4.3
+Problem: Python: Trying to use the name of an unnamed buffer caused a
+ crash. (Daniel Burrows)
+Solution: Check for b_fname being a NULL pointer.
+Files: src/if_python.c
+
+Patch 5.4.4
+Problem: Win32: When compiled without toolbar, but the 'T' flag is in
+ 'guioptions', there would be an empty space for the toolbar.
+Solution: Add two #ifdefs where checking for the 'T' flag. (Vince Negri)
+Files: src/gui.c
+
+Patch 5.4.5
+Problem: Athena GUI: Using the Buffers.Refresh menu entry caused a crash.
+ Looks like any ":unmenu" command may cause trouble.
+Solution: Disallow ":unmenu" in the Athena version. Disable the Buffers
+ menu, because the Refresh item would not work.
+Files: src/menu.c, runtime/menu.vim
+
+Patch 5.4.6
+Problem: GTK GUI: Using ":gui" in the .gvimrc file caused an error. Only
+ happens when the GUI forks.
+Solution: Don't fork in a recursive call of gui_start().
+Files: src/gui.c
+
+Patch 5.4.7
+Problem: Typing 'q' at the more prompt for the ATTENTION message causes the
+ file loading to be interrupted. (Will Day)
+Solution: Reset got_int after showing the ATTENTION message.
+Files: src/memline.c
+
+Patch 5.4.8
+Problem: Edit some file, ":he", ":opt": options from help window are shown,
+ but pressing space updates from the other window. (Phillipps)
+ Also: When there are changes in the option-window, ":q!" gives an
+ error message.
+Solution: Before creating the option-window, go to a non-help window.
+ Use ":bdel!" to delete the buffer.
+Files: runtime/optwin.vim
+
+Patch 5.4.9
+ Just updates version.h. The real patch has been moved to 5.4.x1.
+ This patch is just to keep the version number correct.
+
+Patch 5.4.10
+Problem: GTK GUI: When $DISPLAY is invalid, "gvim -f" just exits. It
+ should run in the terminal.
+Solution: Use gtk_init_check() instead of gtk_init().
+Files: src/gui_gtk_x11.c
+
+Patch 5.4.11
+Problem: When using the 'S' flag in 'cpoptions', 'tabstop' is not copied to
+ the next buffer for some commands, e.g., ":buffer".
+Solution: When the BCO_NOHELP flag is given to buf_copy_options(), still
+ copy the options used by do_help() when neither the "from" or "to"
+ buffer is a help buffer.
+Files: src/option.c
+
+Patch 5.4.12
+Problem: When using 'smartindent', there would be no extra indent if the
+ current line did not have any indent already. (Hanus Adler)
+Solution: There was a wrongly placed "else", that previously matched with
+ the "if" that set trunc_line. Removed the "else" and added a
+ check for trunc_line to be false.
+Files: src/misc1.c
+
+Patch 5.4.13
+Problem: New SGI C compilers need another option for optimisation.
+Solution: Add a check in configure for "-OPT:Olimit". (Chin A Young)
+Files: src/configure.in, src/configure
+
+Patch 5.4.14
+Problem: Motif GUI: When the popup menu is present, a tiny window appears
+ on the desktop for some users.
+Solution: Set the menu widget ID for a popup menu to 0. (Thomas Koehler)
+Files: src/gui_motif.c
+
+Patch 5.4.15
+Problem: Since 'backspace' set to 0 has been made Vi compatible, it is no
+ longer possible to only allow deleting autoindent.
+Solution: Make 'backspace' a list of parts, to allow each kind of
+ backspacing separately.
+Files: src/edit.c, src/option.c, src/option.h, src/proto/option.pro,
+ runtime/doc/option.txt, runtime/doc/insert.txt
+
+Patch 5.4.16
+Problem: Multibyte: Locale zh_TW.Big5 was not checked for in configure.
+Solution: Add zh_TW.Big5 to configure check. (Chih-Tsun Huang)
+Files: src/configure.in, src/configure
+
+Patch 5.4.17
+Problem: GUI: When started from inside gvim with ":!gvim", Vim would not
+ start. ":!gvim -f" works fine.
+Solution: After forking, wait a moment in the parent process, to give the
+ child a chance to set its process group.
+Files: src/gui.c
+
+Patch 5.4.18
+Problem: Python: The clear_history() function also exists in a library.
+Solution: Rename clear_history() to clear_hist().
+Files: src/ex_getln.c, src/eval.c, src/proto/ex_getln.pro
+
+Patch 5.4.19
+Problem: In a terminal with 25 lines, there is a more prompt after the
+ ATTENTION message. When hitting 'q' here the dialog prompt
+ doesn't appear and file loading is interrupted. (Will Day)
+Solution: Don't allow quitting the printing of a message for the dialog
+ prompt. Added the msg_noquit_more flag for this.
+Files: src/message.c
+
+Patch 5.4.20
+Problem: GTK: When starting gvim, would send escape sequences to the
+ terminal to switch the cursor off and on.
+Solution: Don't call msg_start() if the GUI is expected to start.
+Files: src/main.c
+
+Patch 5.4.21
+Problem: Motif: Toplevel menu ordering was wrong when using tear-off items.
+Solution: Don't add one to the index for a toplevel menu.
+Files: src/gui_motif.c
+
+Patch 5.4.22
+Problem: In Insert mode, <C-Left>, <S-Left>, <C-Right> and <S-Right> didn't
+ update the column used for vertical movement.
+Solution: Set curwin->w_set_curswant for those commands.
+Files: src/edit.c
+
+Patch 5.4.23
+Problem: When a Visual selection is lost to another program, and then the
+ same text is Visually selected again, the clipboard ownership
+ wasn't regained.
+Solution: Set clipboard.vmode to NUL to force regaining the clipboard.
+Files: src/normal.c
+
+Patch 5.4.24
+Problem: Encryption: When using ":r file" while 'key' has already entered,
+ the 'key' option would be messed up. When writing the file it
+ would be encrypted with an unknown key and lost! (Brad Despres)
+Solution: Don't free cryptkey when it is equal to the 'key' option.
+Files: src/fileio.c
+
+Patch 5.4.25
+Problem: When 'cindent' is set, but 'autoindent' isn't, comments are not
+ properly indented when starting a new line. (Mitterand)
+Solution: When there is a comment leader for the new line, but 'autoindent'
+ isn't set, do C-indenting.
+Files: src/misc1.c
+
+Patch 5.4.26
+Problem: Multi-byte: a multibyte character is never recognized in a file
+ name, causing a backslash before it to be removed on Windows.
+Solution: Assume that a leading-byte character is a file name character in
+ vim_isfilec().
+Files: src/charset.c
+
+Patch 5.4.27
+Problem: Entries in the PopUp[nvic] menus were added for several modes, but
+ only deleted for the mode they were used for. This resulted in
+ the entry remaining in the PopUp menu.
+ When removing a PopUp[nvic] menu, the name had been truncated,
+ could result in greying-out the whole PopUp menu.
+Solution: Remove entries for all modes from the PopUp[nvic] menus. Remove
+ the PopUp[nvic] menu entries first, before the name is changed.
+Files: src/menu.c
+
+Patch 5.4.28
+Problem: When using a BufWritePre autocommand to change 'fileformat', the
+ new value would not be used for writing the file.
+Solution: Check 'fileformat' after executing the autocommands instead of
+ before.
+Files: src/fileio.c
+
+Patch 5.4.29
+Problem: Athena GUI: When removing the 'g' flag from 'guioptions', using a
+ menu can result in a crash.
+Solution: Always grey-out menus for Athena, don't hide them.
+Files: src/menu.c
+
+Patch 5.4.30
+Problem: BeOS: Suspending Vim with CTRL-Z didn't work (killed Vim). The
+ first character typed after ":sh" goes to Vim, instead of the
+ started shell.
+Solution: Don't suspend Vim, start a new shell. Kill the async read thread
+ when starting a new shell. It will be restarted later. (Will Day)
+Files: src/os_unix.c, src/ui.c
+
+Patch 5.4.31
+Problem: GUI: When 'mousefocus' is set, moving the mouse over where a
+ window boundary was, causes a hit-enter prompt to be finished.
+ (Jeff Walker)
+Solution: Don't use 'mousefocus' at the hit-enter prompt. Also ignore it
+ for the more prompt and a few other situations. When an operator
+ is pending, abort it first.
+Files: src/gui.c
+
+Patch 5.4.32
+Problem: Unix: $LDFLAGS was not passed to configure.
+Solution: Pass $LDFLAGS to configure just like $CFLAGS. (Jon Miner)
+Files: src/Makefile
+
+Patch 5.4.33
+Problem: Unix: After expanding an environment variable with the shell, the
+ next expansion would also use the shell, even though it is not
+ needed.
+Solution: Reset "recursive" before returning from gen_expand_wildcards().
+Files: src/misc1.c
+
+Patch 5.4.34 (also see 5.4.x5)
+Problem: When editing a file, and the file name is relative to a directory
+ above the current directory, the file name was made absolute.
+ (Gregory Margo)
+Solution: Add an argument to shorten_fnames() which indicates if all file
+ names should be shortened, or only absolute names. In main() only
+ use shorten_fnames() to shorten absolute names.
+Files: src/ex_docmd.c, src/fileio.c, src/main.c, src/proto/fileio.pro
+
+Patch 5.4.35
+Problem: There is no function to get the current file size.
+Solution: Allow using line2byte() with the number of lines in the file plus
+ one. This returns the offset of the line past the end of the
+ file, which is the file size plus one.
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 5.4.36
+Problem: Comparing strings while ignoring case didn't work correctly for
+ some machines. (Mide Steed)
+Solution: vim_stricmp() and vim_strnicmp() only returned 0 or 1. Changed
+ them to return -1 when the first argument is smaller.
+Files: src/misc2.c
+
+Patch 5.4.37 (also see 5.4.40 and 5.4.43)
+Problem: Long strings from the viminfo file are truncated.
+Solution: When writing a long string to the viminfo file, first write a line
+ with the length, then the string itself in a second line.
+Files: src/eval.c, src/ex_cmds.c, src/ex_getln.c, src/mark.c, src/ops.c,
+ src/search.c, src/proto/ex_cmds.pro, runtime/syntax/viminfo.vim
+
+Patch 5.4.38
+Problem: In the option-window, ":set go&" resulted in 'go' being handled
+ like a boolean option.
+ Mappings for <Space> and <CR> were overruled by the option-window.
+Solution: When the value of an option isn't 0 or 1, don't handle it like a
+ boolean option.
+ Save and restore mappings for <Space> and <CR> when entering and
+ leaving the option-window.
+Files: runtime/optwin.vim
+
+Patch 5.4.39
+Problem: When setting a hidden option, spaces before the equal sign were
+ not skipped and cause an error message. E.g., ":set csprg =cmd".
+Solution: When skipping over a hidden option, check for a following "=val"
+ and skip it too.
+Files: src/option.c
+
+Patch 5.4.40 (depends on 5.4.37)
+Problem: Compiler error for "atol(p + 1)". (Axel Kielhorn)
+Solution: Add a typecast: "atol((char *)p + 1)".
+Files: src/ex_cmds.c
+
+Patch 5.4.41
+Problem: Some commands that were not included would give an error message,
+ even when after "if 0".
+Solution: Don't give an error message for an unsupported command when not
+ executing the command.
+Files: src/ex_docmd.c
+
+Patch 5.4.42
+Problem: ":w" would also cause a truncated message to appear in the message
+ history.
+Solution: Don't put a kept message in the message history when it starts
+ with "<".
+Files: src/message.c
+
+Patch 5.4.43 (depends on 5.4.37)
+Problem: Mixing long lines with multiple lines in a register causes errors
+ when writing the viminfo file. (Robinson)
+Solution: When reading the viminfo file to skip register contents, skip
+ lines that start with "<".
+Files: src/ops.c
+
+Patch 5.4.44
+Problem: When 'whichwrap' includes '~', a "~" command that goes on to the
+ next line cannot be properly undone. (Zellner)
+Solution: Save each line for undo in n_swapchar().
+Files: src/normal.c
+
+Patch 5.4.45 (also see 5.4.x8)
+Problem: When expand("$ASDF") fails, there is an error message.
+Solution: Remove the global expand_interactively. Pass a flag down to skip
+ the error message.
+ Also: expand("$ASDF") returns an empty string if $ASDF isn't set.
+ Previously it returned "$ASDF" when 'shell' is "sh".
+ Also: system() doesn't print an error when the command returns an
+ error code.
+Files: many
+
+Patch 5.4.46
+Problem: Backspacing did not always use 'softtabstop' after hitting <CR>,
+ inserting a register, moving the cursor, etc.
+Solution: Reset inserted_space much more often in edit().
+Files: src/edit.c
+
+Patch 5.4.47
+Problem: When executing BufWritePre or BufWritePost autocommands for a
+ hidden buffer, the cursor could be moved to a non-existing
+ position. (Vince Negri)
+Solution: Save and restore the cursor and topline for the current window
+ when it is going to be used to execute autocommands for a hidden
+ buffer. Use an existing window for the buffer when it's not
+ hidden.
+Files: src/fileio.c
+
+Patch 5.4.48
+Problem: A paste with the mouse in Insert mode was not repeated exactly the
+ same with ".". For example, when 'autoindent' is set and pasting
+ text with leading indent. (Perry)
+Solution: Add the CTRL-R CTRL-O r and CTRL-R CTRL-P r commands in Insert
+ mode, which insert the contents of a register literally.
+Files: src/edit.c, src/normal.c, runtime/doc/insert.txt
+
+Patch 5.4.49
+Problem: When pasting text with [ <MiddleMouse>, the cursor could end up
+ after the last character of the line.
+Solution: Correct the cursor position for the change in indent.
+Files: src/ops.c
+
+Patch 5.4.x1 (note: Replaces patch 5.4.9)
+Problem: Win32 GUI: menu hints were never used, because WANT_MENU is not
+ defined until vim.h is included.
+Solution: Move the #ifdef WANT_MENU from where MENUHINTS is defined to where
+ it is used.
+Files: src/gui_w32.c
+
+Patch 5.4.x2
+Problem: BeOS: When pasting text, one character was moved to the end.
+Solution: Re-enable the BeOS code in fill_input_buf(), and fix timing out
+ with acquire_sem_etc(). (Will Day)
+Files: src/os_beos.c, src/ui.c
+
+Patch 5.4.x3
+Problem: Win32 GUI: When dropping a directory on a running gvim it crashes.
+Solution: Avoid using a NULL file name. Also display a message to indicate
+ that the current directory was changed.
+Files: src/gui_w32.c
+
+Patch 5.4.x4
+Problem: Win32 GUI: Removing an item from the popup menu doesn't work.
+Solution: Don't remove the item from the menubar, but from the parent popup
+ menu.
+Files: src/gui_w32.c
+
+Patch 5.4.x5 (addition to 5.4.34)
+Files: src/gui_w32.c
+
+Patch 5.4.x6
+Problem: Win32: Expanding (dir)name starting with a dot doesn't work.
+ (McCormack) Only when there is a path before it.
+Solution: Fix the check, done before expansion, if the file name pattern
+ starts with a dot.
+Files: src/os_win32.c
+
+Patch 5.4.x7
+Problem: Win32 GUI: Removing "Edit with Vim" from registry is difficult.
+Solution: Add uninstall program to remove the registry keys. It is installed
+ in the "Add/Remove programs" list for ease of use.
+ Also: don't set $VIM when the executable is with the runtime files.
+ Also: Add a text file with a step-by-step description of how to
+ uninstall Vim for DOS and Windows.
+Files: src/uninstal.c, src/dosinst.c, src/Makefile.w32, uninstal.txt
+
+Patch 5.4.x8 (addition to 5.4.45)
+Files: many
+
+Patch 5.4.x9
+Problem: Win32 GUI: After executing an external command, focus is not
+ always regained (when using focus-follows-mouse).
+Solution: Add SetFocus() in mch_system(). (Mike Steed)
+Files: src/os_win32.c
+
+
+Patch 5.5a.1
+Problem: ":let @* = @:" did not work. The text was not put on the
+ I clipboard. (Fisher)
+Solution: Own the clipboard and put the text on it.
+Files: src/ops.c
+
+Patch 5.5a.2
+Problem: append() did not mark the buffer modified. Marks below the
+ new line were not adjusted.
+Solution: Fix the f_append() function.
+Files: src/eval.c
+
+Patch 5.5a.3
+Problem: Editing compressed ".gz" files doesn't work on non-Unix systems,
+ because there is no "mv" command.
+Solution: Add the rename() function and use it instead of ":!mv".
+ Also: Disable the automatic jump to the last position, because it
+ changes the jumplist.
+Files: src/eval.c, runtime/doc/eval.txt, runtime/vimrc_example.vim
+
+Patch 5.5a.4
+Problem: When using whole-line completion in insert mode while the cursor
+ is in the indent, get "out of memory" error. (Stekrt)
+Solution: Don't allocate a negative amount of memory in ins_complete().
+Files: src/edit.c
+
+Patch 5.5a.5
+Problem: Win32: The 'path' option can hold only up to 256 characters,
+ because _MAX_PATH is 256. (Robert Webb)
+Solution: Use a fixed path length of 1024.
+Files: src/os_win32.h
+
+Patch 5.5a.6
+Problem: Compiling with gcc on Win32, using the Unix Makefile, didn't work.
+Solution: Add $(SUFFIX) to all places where an executable is used. Also
+ pass it to ctags. (Reynolds)
+Files: src/Makefile
+
+Patch 5.5a.7
+Problem: When using "cat | vim -" in an xterm, the xterm version reply
+ would end up in the file.
+Solution: Read the file from stdin before switching the terminal to RAW
+ mode. Should also avoid problems with programs that use a
+ specific terminal setting.
+ Also: when using the GUI, print "Reading from stdin..." in the GUI
+ window, to give a hint why it doesn't do anything.
+Files: src/main.c, src/fileio.c
+
+Patch 5.5a.8
+Problem: On multi-threaded Solaris, suspending doesn't work.
+Solution: Call pause() when the SIGCONT signal was not received after
+ sending the SIGTSTP signal. (Nagano)
+Files: src/os_unix.c
+
+Patch 5.5a.9
+Problem: 'winaltkeys' could be set to an empty argument, which is illegal.
+Solution: Give an error message when doing ":set winaltkeys=".
+Files: src/option.c
+
+Patch 5.5a.10
+Problem: Win32 console: Using ALTGR on a German keyboard to produce "}"
+ doesn't work, because the 8th bit is set when ALT is pressed.
+Solution: Don't set the 8th bit when ALT and CTRL are used. (Leipert)
+Files: src/os_win32.c
+
+Patch 5.5a.11
+Problem: Tcl: Configure always uses tclsh8.0.
+ Also: Loading a library doesn't work.
+Solution: Add "--with-tclsh" configure argument to allow specifying another
+ name for the tcl shell.
+ Call Tcl_Init() in tclinit() to make loading libraries work.
+ (Johannes Zellner)
+Files: src/configure.in, src/configure, src/if_tcl.c
+
+Patch 5.5a.12
+Problem: The "user_commands" feature is called "user-commands".
+Solution: Replace "user-commands" with "user_commands". (Kim Sung-bom)
+ Keep "user-commands" for the has() function, to remain backwards
+ compatible with 5.4.
+Files: src/eval.c, src/version.c
+
+Patch 5.5a.13
+Problem: OS/2: When $HOME is not defined, "C:/" is used for the viminfo
+ file. That is very wrong when OS/2 is on another partition.
+Solution: Use $VIM for the viminfo file when it is defined, like for MSDOS.
+ Also: Makefile.os2 didn't depend on os_unix.h.
+Files: src/os_unix.h, src/Makefile.os2
+
+Patch 5.5a.14
+Problem: Athena, Motif and GTK: The Mouse scroll wheel doesn't work.
+Solution: Interpret a click of the wheel as a key press of the <MouseDown>
+ or <MouseUp> keys. Default behavior is to scroll three lines, or
+ a full page when Shift is used.
+Files: src/edit.c, src/ex_getln.c, src/gui.c, src/gui_gtk_x11.c,
+ src/gui_x11.c, src/keymap.h, src/message.c, src/misc1.c,
+ src/misc2.c, src/normal.c, src/proto/normal.pro, src/vim.h,
+ runtime/doc/scroll.txt
+
+Patch 5.5a.15
+Problem: Using CTRL-A in Insert mode doesn't work correctly when the insert
+ started with the <Insert> key. (Andreas Rohrschneider)
+Solution: Replace <Insert> with "i" before setting up the redo buffer.
+Files: src/normal.c
+
+Patch 5.5a.16
+Problem: VMS: GUI does not compile and run.
+Solution: Various fixes. (Zoltan Arpadffy)
+ Moved functions from os_unix.c to ui.c, so that VMS can use them
+ too: open_app_context(), x11_setup_atoms() and clip_x11* functions.
+ Made xterm_dpy global, it's now used by ui.c and os_unix.c.
+ Use gethostname() always, sys_hostname doesn't exist.
+Files: src/globals.h, src/gui_x11.c, src/os_vms.mms, src/os_unix.c,
+ src/os_vms.c, src/ui.c, src/proto/os_unix.pro, src/proto/ui.pro
+
+Renamed AdjustCursorForMultiByteCharacter() to AdjustCursorForMultiByteChar()
+to avoid symbol length limit of 31 characters. (Steve P. Wall)
+
+Patch 5.5b.1
+Problem: SASC complains about dead assignments and implicit type casts.
+Solution: Removed the dead assignments. Added explicit type casts.
+Files: src/buffer.c, src/edit.c, src/eval.c, src/ex_cmds.c,
+ src/ex_getln.c, src/fileio.c, src/getchar.c, src/memline.c,
+ src/menu.c, src/misc1.c, src/normal.c, src/ops.c, src/quickfix.c,
+ src/screen.c
+
+Patch 5.5b.2
+Problem: When using "CTRL-O O" in Insert mode, hit <Esc> and then "o" in
+ another line truncates that line. (Devin Weaver)
+Solution: When using a command that starts Insert mode from CTRL-O, reset
+ "restart_edit" first. This avoids that edit() is called with a
+ mix of starting a new edit command and restarting a previous one.
+Files: src/normal.c
+
+==============================================================================
+VERSION 5.6 *version-5.6*
+
+Version 5.6 is a bug-fix version of 5.5.
+
+
+Changed *changed-5.6*
+-------
+
+Small changes to OleVim files. (Christian Schaller)
+
+Inserted "/**/" between patch numbers in src/version.c. This allows for one
+line of context, which some versions of patch need.
+
+Reordered the Syntax menu to avoid long submenus. Removed keyboard shortcuts
+for alphabetical items to avoid a clash with fixed items.
+
+
+Added *added-5.6*
+-----
+
+Included Exuberant Ctags version 3.4. (Darren Hiebert)
+
+OpenWithVim in Python. (Christian Schaller)
+
+Win32 GUI: gvimext.dll, for the context menu "Edit with Vim" entry. Avoids
+the reported problems with the MS Office taskbar. Now it's a Shell Extension.
+(Tianmiao Hu)
+
+New syntax files:
+abel Abel (John Cook)
+aml Arc Macro Language (Nikki Knuit)
+apachestyle Apache-style config file (Christian Hammers)
+cf Cold Fusion (Jeff Lanzarotta)
+ctrlh files with CTRL-H sequences (Bram Moolenaar)
+cupl CUPL (John Cook)
+cuplsim CUPL simulation (John Cook)
+erlang Erlang (Kresimir Marzic)
+gedcom Gedcom (Paul Johnson)
+icon Icon (Wendell Turner)
+ist MakeIndex style (Peter Meszaros)
+jsp Java Server Pages (Rafael Garcia-Suarez)
+rcslog Rcslog (Joe Karthauser)
+remind Remind (Davide Alberani)
+sqr Structured Query Report Writer (Paul Moore)
+tads TADS (Amir Karger)
+texinfo Texinfo (Sandor Kopanyi)
+xpm2 X Pixmap v2 (Steve Wall)
+
+The 'C' flag in 'cpoptions' can be used to switch off concatenation for
+sourced lines. See patch 5.5.013 below. |line-continuation|
+
+"excludenl" argument for the ":syntax" command. See patch 5.5.032 below.
+|:syn-excludenl|
+
+Implemented |z+| and |z^| commands. See patch 5.5.050 below.
+
+Vim logo in Corel Draw format. Can be scaled to any resolution.
+
+
+Fixed *fixed-5.6*
+-----
+
+Using this mapping in Select mode, terminated completion:
+":vnoremap <C-N> <Esc>a<C-N>" (Benji Fisher)
+Ignore K_SELECT in ins_compl_prep().
+
+VMS (Zoltan Arpadffy, David Elins):
+- ioctl() in pty.c caused trouble, #ifndef VMS added.
+- Cut & paste mismatch corrected.
+- Popup menu line crash corrected. (Patch 5.5.047)
+- Motif directories during open and save as corrected.
+- Handle full file names with version numbers. (Patch 5.5.046)
+- Directory handling (CD command etc.)
+- Corrected file name conversion VMS to Unix and v.v.
+- Recovery was not working.
+- Terminal and signal handling was outdated compared to os_unix.c.
+- Improved os_vms.txt.
+
+Configure used fprintf() instead of printf() to check for __DATE__ and
+__TIME__. (John Card II)
+
+BeOS: Adjust computing the char_height and char_ascent. Round them up
+separately, avoids redrawing artifacts. (Mike Steed)
+
+Fix a few multibyte problems in menu_name_skip(), set_reg_ic(), searchc() and
+findmatchlimit(). (Taro Muraoka)
+
+GTK GUI:
+- With GTK 1.2.5 and later the scrollbars were not redrawn correctly.
+- Adjusted the gtk_form_draw() function.
+- SNiFF connection didn't work.
+- 'mousefocus' was not working. (Dalecki)
+- Some keys were not working with modifiers: Shift-Tab, Ctrl-Space and CTRL-@.
+
+
+Patch 5.5.001
+Problem: Configure in the top directory did not pass on an argument with a
+ space correctly. For example "./configure --previs="/My home".
+ (Stephane Chazelas)
+Solution: Use '"$@"' instead of '$*' to pass on the arguments.
+Files: configure
+
+Patch 5.5.002
+Problem: Compilation error for using "fds[] & POLLIN". (Jeff Walker)
+Solution: Use "fds[].revents & POLLIN".
+Files: src/os_unix.c
+
+Patch 5.5.003
+Problem: The autoconf check for sizeof(int) is wrong on machines where
+ sizeof(size_t) != sizeof(int).
+Solution: Use our own configure check. Also fixes the warning for
+ cross-compiling.
+Files: src/configure.in, src/configure
+
+Patch 5.5.004
+Problem: On Unix it's not possible to interrupt ":sleep 100".
+Solution: Switch terminal to cooked mode while asleep, to allow a SIGINT to
+ wake us up. But switch off echo, added TMODE_SLEEP.
+Files: src/term.h, src/os_unix.c
+
+Patch 5.5.005
+Problem: When using <f-args> with a user command, an empty argument to the
+ command resulted in one empty string, while no string was
+ expected.
+Solution: Catch an empty argument and pass no argument to the function.
+ (Paul Moore)
+Files: src/ex_docmd.c
+
+Patch 5.5.006
+Problem: Python: When platform-dependent files are in another directory
+ than the platform-independent files it doesn't work.
+Solution: Also check the executable directory, and add it to CFLAGS. (Tessa
+ Lau)
+Files: src/configure.in, src/configure
+
+Patch 5.5.007 (extra)
+Problem: Win32 OLE: Occasional crash when exiting while still being used
+ via OLE.
+Solution: Move OleUninitialize() to before deleting the application object.
+ (Vince Negri)
+Files: src/if_ole.cpp
+
+Patch 5.5.008
+Problem: 10000@@ takes a long time and cannot be interrupted.
+Solution: Check for CTRL-C typed while in the loop to push the register.
+Files: src/normal.c
+
+Patch 5.5.009
+Problem: Recent Sequent machines don't link with "-linet". (Kurtis Rader)
+Solution: Remove configure check for Sequent.
+Files: src/configure.in, src/configure
+
+Patch 5.5.010
+Problem: Ctags freed a memory block twice when exiting. When out of
+ memory, a misleading error message was given.
+Solution: Update to ctags 3.3.2. Also fixes a few other problems. (Darren
+ Hiebert)
+Files: src/ctags/*
+
+Patch 5.5.011
+Problem: After "CTRL-V s", the cursor jumps back to the start, while all
+ other operators leave the cursor on the last changed character.
+ (Xiangjiang Ma)
+Solution: Position cursor on last changed character, if possible.
+Files: src/ops.c
+
+Patch 5.5.012
+Problem: Using CTRL-] in Visual mode doesn't work when the text includes a
+ space (just where it's useful). (Stefan Bittner)
+Solution: Don't escape special characters in a tag name with a backslash.
+Files: src/normal.c
+
+Patch 5.5.013
+Problem: The ":append" and ":insert" commands allow using a leading
+ backslash in a line. The ":source" command concatenates those
+ lines. (Heinlein)
+Solution: Add the 'C' flag in 'cpoptions' to switch off concatenation.
+Files: src/ex_docmd.c, src/option.h, runtime/doc/options.txt,
+ runtime/filetype.vim, runtime/scripts.vim
+
+Patch 5.5.014
+Problem: When executing a register with ":@", the ":append" command would
+ get text lines with a ':' prepended. (Heinlein)
+Solution: Remove the ':' characters.
+Files: src/ex_docmd.c, src/ex_getln.c, src/globals.h
+
+Patch 5.5.015
+Problem: When using ":g/pat/p", it's hard to see where the output starts,
+ the ":g" command is overwritten. Vi keeps the ":g" command.
+Solution: Keep the ":g" command, but allow overwriting it with the report
+ for the number of changes.
+Files: src/ex_cmds.c
+
+Patch 5.5.016 (extra)
+Problem: Win32: Using regedit to install Vim in the popup menu requires the
+ user to confirm this in a dialog.
+Solution: Use "regedit /s" to avoid the dialog
+Files: src/dosinst.c
+
+Patch 5.5.017
+Problem: If an error occurs when closing the current window, Vim could get
+ stuck in the error handling.
+Solution: Don't set curwin to NULL when closing the current window.
+Files: src/window.c
+
+Patch 5.5.018
+Problem: Absolute paths in shell scripts do not always work.
+Solution: Use /usr/bin/env to find out the path.
+Files: runtime/doc/vim2html.pl, runtime/tools/efm_filter.pl,
+ runtime/tools/shtags.pl
+
+Patch 5.5.019
+Problem: A function call in 'statusline' stops using ":q" twice from
+ exiting, when the last argument hasn't been edited.
+Solution: Don't decrement quitmore when executing a function. (Madsen)
+Files: src/ex_docmd.c
+
+Patch 5.5.020
+Problem: When the output of CTRL-D completion in the commandline goes all
+ the way to the last column, there is an empty line.
+Solution: Don't add a newline when the cursor wrapped already. (Madsen)
+Files: src/ex_getln.c
+
+Patch 5.5.021
+Problem: When checking if a file name in the tags file is relative,
+ environment variables were not expanded.
+Solution: Expand the file name before checking if it is relative. (Madsen)
+Files: src/tag.c
+
+Patch 5.5.022
+Problem: When setting or resetting 'paste' the ruler wasn't updated.
+Solution: Update the status lines when 'ruler' changes because of 'paste'.
+Files: src/option.c
+
+Patch 5.5.023
+Problem: When editing a new file and autocommands change the cursor
+ position, the cursor was moved back to the first non-white, unless
+ 'startofline' was reset.
+Solution: Keep the new column, just like the line number.
+Files: src/ex_cmds.c
+
+Patch 5.5.024 (extra)
+Problem: Win32 GUI: When using confirm() to put up a dialog without a
+ default button, the dialog would not have keyboard focus.
+ (Krishna)
+Solution: Always set focus to the dialog window. Only set focus to a button
+ when a default one is specified.
+Files: src/gui_w32.c
+
+Patch 5.5.025
+Problem: When using "keepend" in a syntax region, a contained match that
+ includes the end-of-line could still force that region to
+ continue, if there is another contained match in between.
+Solution: Check the keepend_level in check_state_ends().
+Files: src/syntax.c
+
+Patch 5.5.026
+Problem: When starting Vim in a white-on-black xterm, with 'bg' set to
+ "dark", and then starting the GUI with ":gui", setting 'bg' to
+ "light" in the gvimrc, the highlighting isn't set. (Tsjokwing)
+Solution: Set the highlighting when 'bg' is changed in the gvimrc, even
+ though full_screen isn't set.
+Files: src/option.c
+
+Patch 5.5.027
+Problem: Unix: os_unix.c doesn't compile when XTERM_CLIP is used but
+ WANT_TITLE isn't. (Barnum)
+Solution: Move a few functions that are used by the X11 title and clipboard
+ and put another "#if" around it.
+Files: src/os_unix.c
+
+Patch 5.5.028 (extra)
+Problem: Win32 GUI: When a file is dropped on Win32 gvim while at the ":"
+ prompt, the file is edited but the command line is actually still
+ there, the cursor goes back to command line on the next command.
+ (Krishna)
+Solution: When dropping a file or directory on gvim while at the ":" prompt,
+ insert the name of the file/directory. Allows using the
+ file/directory name for any Ex command.
+Files: src/gui_w32.c
+
+Patch 5.5.029
+Problem: "das" at the end of the file didn't delete the last character of
+ the sentence.
+Solution: When there is no character after the sentence, make the operation
+ inclusive in current_sent().
+Files: src/search.c
+
+Patch 5.5.030
+Problem: Unix: in os_unix.c, "term_str" is used, which is also defined in
+ vim.h as a macro. (wuxin)
+Solution: Renamed "term_str" to "buf" in do_xterm_trace().
+Files: src/os_unix.c
+
+Patch 5.5.031 (extra)
+Problem: Win32 GUI: When exiting Windows, gvim will leave swap files behind
+ and will be killed ungracefully. (Krishna)
+Solution: Catch the WM_QUERYENDSESSION and WM_ENDSESSION messages and try to
+ exit gracefully. Allow the user to cancel the shutdown if there
+ is a changed buffer.
+Files: src/gui_w32.c
+
+Patch 5.5.032
+Problem: Patch 5.5.025 wasn't right. And C highlighting was still not
+ working correctly for a #define.
+Solution: Added "excludenl" argument to ":syntax", to be able not to extend
+ a containing item when there is a match with the end-of-line.
+Files: src/syntax.c, runtime/doc/syntax.txt, runtime/syntax/c.vim
+
+Patch 5.5.033
+Problem: When reading from stdin, a long line in viminfo would mess up the
+ file message. readfile() uses IObuff for keep_msg, which could be
+ overwritten by anyone.
+Solution: Copy the message from IObuff to msg_buf and set keep_msg to that.
+ Also change vim_fgets() to not use IObuff any longer.
+Files: src/fileio.c
+
+Patch 5.5.034
+Problem: "gvim -rv" caused a crash. Using 't_Co' before it's set.
+Solution: Don't try to initialize the highlighting before it has been
+ initialized from main().
+Files: src/syntax.c
+
+Patch 5.5.035
+Problem: GTK with XIM: Resizing with status area was messy, and
+ ":set guioptions+=b" didn't work.
+Solution: Make status area a separate widget, but not a separate window.
+ (Chi-Deok Hwang)
+Files: src/gui_gtk_f.c, src/gui_gtk_x11.c, src/multbyte.c
+
+Patch 5.5.036
+Problem: The GZIP_read() function in $VIMRUNTIME/vimrc_example.vim to
+ uncompress a file did not do detection for 'fileformat'. This is
+ because the filtering is done with 'binary' set.
+Solution: Split the filtering into separate write, filter and read commands.
+Files: runtime/vimrc_example.vim
+
+Patch 5.5.037
+Problem: The "U" command didn't mark the buffer as changed. (McCormack)
+Solution: Set the 'modified' flag when using "U".
+Files: src/undo.c
+
+Patch 5.5.038
+Problem: When typing a long ":" command, so that the screen scrolls up,
+ causes the hit-enter prompt, even though the user just typed
+ return to execute the command.
+Solution: Reset need_wait_return if (part of) the command was typed in
+ getcmdline().
+Files: src/ex_getln.c
+
+Patch 5.5.039
+Problem: When using a custom status line, "%a" (file # of #) reports the
+ index of the current window for all windows.
+Solution: Pass a window pointer to append_arg_number(), and pass the window
+ being updated from build_stl_str_hl(). (Stephen P. Wall)
+Files: src/buffer.c, src/screen.c, src/proto/buffer.pro
+
+Patch 5.5.040
+Problem: Multi-byte: When there is some error in xim_real_init(), it can
+ close XIM and return. After this there can be a segv.
+Solution: Test "xic" for being non-NULL, don't set "xim" to NULL. Also try
+ to find more matches for supported styles. (Sung-Hyun Nam)
+Files: src/multbyte.c
+
+Patch 5.5.041
+Problem: X11 GUI: CTRL-_ requires the SHIFT key only on some machines.
+Solution: Translate CTRL-- to CTRL-_. (Robert Webb)
+Files: src/gui_x11.c
+
+Patch 5.5.042
+Problem: X11 GUI: keys with ALT were assumed to be used for the menu, even
+ when the menu has been disabled by removing 'm' from 'guioptions'.
+Solution: Ignore keys with ALT only when gui.menu_is_active is set. (Raf)
+Files: src/gui_x11.c
+
+Patch 5.5.043
+Problem: GTK: Handling of fontset fonts was not right when 'guifontset'
+ contains exactly 14 times '-'.
+Solution: Avoid setting fonts when working with a fontset. (Sung-Hyun Nam)
+Files: src/gui_gtk_x11.c
+
+Patch 5.5.044
+Problem: pltags.pl contains an absolute path "/usr/local/bin/perl". That
+ might not work everywhere.
+Solution: Use "/usr/bin/env perl" instead.
+Files: runtime/tools/pltags.pl
+
+Patch 5.5.045
+Problem: Using "this_session" variable does not work, requires preceding it
+ with "v:". Default filename for ":mksession" isn't mentioned
+ in the docs. (Fisher)
+Solution: Support using "this_session" to be backwards compatible.
+Files: src/eval.c, runtime/doc/options.txt
+
+Patch 5.5.046 (extra)
+Problem: VMS: problems with path and filename.
+Solution: Truncate file name at last ';', etc. (Zoltan Arpadffy)
+Files: src/buffer.c, src/fileio.c, src/gui_motif.c, src/os_vms.c,
+ src/proto/os_vms.pro
+
+Patch 5.5.047
+Problem: VMS: Crash when using the popup menu
+Solution: Turn the #define MENU_MODE_CHARS into an array. (Arpadffy)
+Files: src/structs.h, src/menu.c
+
+Patch 5.5.048
+Problem: HP-UX 11: Compiling doesn't work, because both string.h and
+ strings.h are included. (Squassabia)
+Solution: The configure test for including both string.h and strings.h
+ must include <Xm/Xm.h> first, because it causes problems.
+Files: src/configure.in, src/configure, src/config.h.in
+
+Patch 5.5.049
+Problem: Unix: When installing Vim, the protection bits of files might be
+ influenced by the umask.
+Solution: Add $(FILEMOD) to Makefile. (Shetye)
+Files: src/Makefile
+
+Patch 5.5.050
+Problem: "z+" and "z^" commands are missing.
+Solution: Implemented "z+" and "z^".
+Files: src/normal.c, runtime/doc/scroll.txt, runtime/doc/index.txt
+
+Patch 5.5.051
+Problem: Several Unix systems have a problem with the optimization limits
+ check in configure.
+Solution: Removed the configure check, let the user add it manually in
+ Makefile or the environment.
+Files: src/configure.in, src/configure, src/Makefile
+
+Patch 5.5.052
+Problem: Crash when using a cursor key at the ATTENTION prompt. (Alberani)
+Solution: Ignore special keys at the console dialog. Also ignore characters
+ > 255 for other uses of tolower() and toupper().
+Files: src/menu.c, src/message.c, src/misc2.c
+
+Patch 5.5.053
+Problem: Indenting is wrong after a function when 'cino' has "fs". Another
+ problem when 'cino' has "{s".
+Solution: Put line after closing "}" of a function at the left margin.
+ Apply ind_open_extra in the right way after a '{'.
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 5.5.054
+Problem: Unix: ":e #" doesn't work if the alternate file name contains a
+ space or backslash. (Hudacek)
+Solution: When replacing "#", "%" or other items that stand for a file name,
+ prepend a backslash before special characters.
+Files: src/ex_docmd.c
+
+Patch 5.5.055
+Problem: Using "<C-V>$r-" in blockwise Visual mode replaces one character
+ beyond the end of the line. (Zivkov)
+Solution: Only replace existing characters.
+Files: src/ops.c
+
+Patch 5.5.056
+Problem: After "z20<CR>" messages were printed at the old command line
+ position once. (Veselinovic)
+Solution: Set msg_row and msg_col when changing cmdline_row in
+ win_setheight().
+Files: src/window.c
+
+Patch 5.5.057
+Problem: After "S<Esc>" it should be possible to restore the line with "U".
+ (Veselinovic)
+Solution: Don't call u_clearline() in op_delete() when changing only one
+ line.
+Files: src/ops.c
+
+Patch 5.5.058
+Problem: Using a long search pattern and then "n" causes the hit-enter
+ prompt. (Krishna)
+Solution: Truncate the echoed pattern, like other messages. Moved code for
+ truncating from msg_attr() to msg_strtrunc().
+Files: src/message.c, src/proto/message.pro, src/search.c
+
+Patch 5.5.059
+Problem: GTK GUI: When $term is invalid, using "gvim" gives an error
+ message, even though $term isn't really used. (Robbins)
+Solution: When the GUI is about to start, skip the error messages for a
+ wrong $term.
+Files: src/term.c
+
+Patch 5.5.060 (extra)
+Problem: Dos 32 bit: When a directory in 'backupdir' doesn't exist, ":w"
+ causes the file to be renamed to "axlqwqhy.ba~". (Matzdorf)
+Solution: The code to work around a LFN bug in Windows 95 doesn't handle a
+ non-existing target name correctly. When renaming fails, make
+ sure the file has its original name. Also do this for the Win32
+ version, although it's unlikely that it runs into this problem.
+Files: src/os_msdos.c, src/os_win32.c
+
+Patch 5.5.061
+Problem: When using "\:" in a modeline, the backslash is included in the
+ option value. (Mohsin)
+Solution: Remove one backslash before the ':' in a modeline.
+Files: src/buffer.c, runtime/doc/options.txt
+
+Patch 5.5.062 (extra)
+Problem: Win32 console: Temp files are created in the root of the current
+ drive, which may be read-only. (Peterson)
+Solution: Use the same mechanism of the GUI version: Use $TMP, $TEMP or the
+ current directory. Cleaned up vim_tempname() a bit.
+Files: src/fileio.c, src/os_win32.h, runtime/doc/os_dos.txt
+
+Patch 5.5.063
+Problem: When using whole-line completion in Insert mode, 'cindent' is
+ applied, even after changing the indent of the line.
+Solution: Don't reindent the completed line after inserting/removing indent.
+ (Robert Webb)
+Files: src/edit.c
+
+Patch 5.5.064
+Problem: has("sniff") doesn't work correctly.
+Solution: Return 1 when Vim was compiled with the +sniff feature. (Pruemmer)
+Files: src/eval.c
+
+Patch 5.5.065
+Problem: When dropping a file on Vim, the 'shellslash' option is not
+ effective. (Krishna)
+Solution: Fix the slashes in the dropped file names according to
+ 'shellslash'.
+Files: src/ex_docmd.c, runtime/doc/options.txt
+
+Patch 5.5.066
+Problem: For systems with backslash in file name: Setting a file name
+ option to a value starting with "\\machine" removed a backslash.
+Solution: Keep the double backslash for "\\machine", but do change
+ "\\\\machine" to "\\machine" for backwards compatibility.
+Files: src/option.c, runtime/doc/options.txt
+
+Patch 5.5.067
+Problem: With 'hlsearch' set, the pattern "\>" doesn't highlight the first
+ match in a line. (Benji Fisher)
+Solution: Fix highlighting an empty match. Also highlight the first
+ character in an empty line for "$".
+Files: src/screen.c
+
+Patch 5.5.068
+Problem: Crash when a ":while" is used with an argument that has an error.
+ (Sylvain Viart)
+Solution: Was using an uninitialized index in the cs_line[] array. The
+ crash only happened when the index was far off. Made sure the
+ uninitialized index isn't used.
+Files: src/ex_docmd.c
+
+Patch 5.5.069
+Problem: Shifting lines in blockwise Visual mode didn't set the 'modified'
+ flag.
+Solution: Do set the 'modified' flag.
+Files: src/ops.c
+
+Patch 5.5.070
+Problem: When editing a new file, creating that file outside of Vim, then
+ editing it again, ":w" still warns for overwriting an existing
+ file. (Nam)
+Solution: The BF_NEW flag in the "b_flags" field wasn't cleared properly.
+Files: src/buffer.c, src/fileio.c
+
+Patch 5.5.071
+Problem: Using a matchgroup in a ":syn region", which is the same syntax
+ group as the region, didn't stop a contained item from matching in
+ the start pattern.
+Solution: Also push an item on the stack when the syntax ID of the
+ matchgroup is the same as the syntax ID of the region.
+Files: src/syntax.c
+
+Patch 5.5.072 (extra)
+Problem: Dos 32 bit: When setting 'columns' to a too large value, Vim may
+ crash, and the DOS console too.
+Solution: Check that the value of 'columns' isn't larger than the number of
+ columns that the BIOS reports.
+Files: src/os_msdos.c, src/proto/os_msdos.pro, src/option.c
+
+Patch 5.5.073 (extra)
+Problem: Win 32 GUI: The Find and Find/Replace dialogs didn't show the
+ "match case" checkbox. The Find/Replace dialog didn't handle the
+ "match whole word" checkbox.
+Solution: Support the "match case" and "match whole word" checkboxes.
+Files: src/gui_w32.c
+
+Patch 5.6a.001
+Problem: Using <C-End> with a count doesn't work like it does with "G".
+ (Benji Fisher)
+Solution: Accept a count for <C-End> and <C-Home>.
+Files: src/normal.c
+
+Patch 5.6a.002
+Problem: The script for conversion to HTML was an older version.
+Solution: Add support for running 2html.vim on a color terminal.
+Files: runtime/syntax/2html.vim
+
+Patch 5.6a.003
+Problem: Defining a function inside a function didn't give an error
+ message. A missing ":endfunction" doesn't give an error message.
+Solution: Allow defining a function inside a function.
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 5.6a.004
+Problem: A missing ":endwhile" or ":endif" doesn't give an error message.
+ (Johannes Zellner)
+Solution: Check for missing ":endwhile" and ":endif" in sourced files.
+ Add missing ":endif" in file selection macros.
+Files: src/ex_docmd.c, runtime/macros/file_select.vim
+
+Patch 5.6a.005
+Problem: 'hlsearch' was not listed alphabetically. The value of 'toolbar'
+ was changed when 'compatible' is set.
+Solution: Moved entry of 'hlsearch' in options[] table down.
+ Don't reset 'toolbar' option to the default value when
+ 'compatible' is set.
+Files: src/option.c
+
+Patch 5.6a.006
+Problem: Using a backwards range inside ":if 0" gave an error message.
+Solution: Don't complain about a range when it is not going to be used.
+ (Stefan Roemer)
+Files: src/ex_docmd.c
+
+Patch 5.6a.007
+Problem: ":let" didn't show internal Vim variables. (Ron Aaron)
+Solution: Do show ":v" variables for ":let" and ":let v:name".
+Files: src/eval.c
+
+Patch 5.6a.008
+Problem: Selecting a syntax from the Syntax menu gives an error message.
+Solution: Replace "else if" in SetSyn() with "elseif". (Ronald Schild)
+Files: runtime/menu.vim
+
+Patch 5.6a.009
+Problem: When compiling with +extra_search but without +syntax, there is a
+ compilation error in screen.c. (Axel Kielhorn)
+Solution: Adjust the #ifdef for declaring and initializing "line" in
+ win_line(). Also solve compilation problem when +statusline is
+ used without +eval. Another one when +cmdline_compl is used
+ without +eval.
+Files: src/screen.c, src/misc2.c
+
+Patch 5.6a.010
+Problem: In a function, ":startinsert!" does not append to the end of the
+ line if a ":normal" command was used to move the cursor. (Fisher)
+Solution: Reset "w_set_curswant" to avoid that w_curswant is changed again.
+Files: src/ex_docmd.c
+
+Patch 5.6a.011 (depends on 5.6a.004)
+Problem: A missing ":endif" or ":endwhile" in a function doesn't give an
+ error message.
+Solution: Give that error message.
+Files: src/ex_docmd.c
+
+Patch 5.6a.012 (depends on 5.6a.008)
+Problem: Some Syntax menu entries caused a hit-enter prompt.
+Solution: Call a function to make the command shorter. Also rename a few
+ functions to avoid name clashes.
+Files: runtime/menu.vim
+
+Patch 5.6a.013
+Problem: Command line completion works different when another completion
+ was done earlier. (Johannes Zellner)
+Solution: Reset wim_index when starting a new completion.
+Files: src/ex_getln.c
+
+Patch 5.6a.014
+Problem: Various warning messages when compiling and running lint with
+ different combinations of features.
+Solution: Fix the warning messages.
+Files: src/eval.c, src/ex_cmds.c, src/ex_docmd.c, src/gui_gtk_x11.c,
+ src/option.c, src/screen.c, src/search.c, src/syntax.c,
+ src/feature.h, src/globals.h
+
+Patch 5.6a.015
+Problem: The vimtutor command doesn't always know the value of $VIMRUNTIME.
+Solution: Let Vim expand $VIMRUNTIME, instead of the shell.
+Files: src/vimtutor
+
+Patch 5.6a.016 (extra)
+Problem: Mac: Window size is restricted when starting. Cannot drag the
+ window all over the desktop.
+Solution: Get real screen size instead of assuming 640x400. Do not use a
+ fixed number for the drag limits. (Axel Kielhorn)
+Files: src/gui_mac.c
+
+Patch 5.6a.017
+Problem: The "Paste" entry in popup menu for Visual, Insert and Cmdline
+ mode is in the wrong position. (Stol)
+Solution: Add priority numbers for all Paste menu entries.
+Files: runtime/menu.vim
+
+Patch 5.6a.018
+Problem: GTK GUI: submenu priority doesn't work.
+ Help dialog could be destroyed too soon.
+ When closing a dialog window (e.g. the "ATTENTION" one), Vim would
+ just hang.
+ When GTK theme is changed, Vim doesn't adjust to the new colors.
+ Argument for ":promptfind" isn't used.
+Solution: Fixed the mentioned problems.
+ Made the dialogs look&feel nicer.
+ Moved functions to avoid the need for a forward declaration.
+ Fixed reentrancy of the file browser dialog.
+ Added drag&drop support for GNOME.
+ Init the text for the Find/replace dialog from the last used
+ search string. Set "match whole word" toggle button correctly.
+ Made repeat rate for drag outside of window depend on the
+ distance from the window. (Marcin Dalecki)
+ Made the drag in Visual mode actually work.
+ Removed recursiveness protection from gui_mch_get_rgb(), it might
+ cause more trouble than it solves.
+Files: src/ex_docmd.c, src/gui_gtk.c, src/gui_gtk_x11.c, src/ui.c,
+ src/proto/ui.pro, src/misc2.c
+
+Patch 5.6a.019
+Problem: When trying to recover through NFS, which uses a large block size,
+ Vim might think the swap file is empty, because mf_blocknr_max is
+ zero. (Scott McDermott)
+Solution: When computing the number of blocks of the file in mf_open(),
+ round up instead of down.
+Files: src/memfile.c
+
+Patch 5.6a.020
+Problem: GUI GTK: Could not set display for gvim.
+Solution: Add "-display" and "--display" arguments. (Marcin Dalecki)
+Files: src/gui_gtk_x11.c
+
+Patch 5.6a.021
+Problem: Recovering still may not work when the block size of the device
+ where the swap file is located is larger than 4096.
+Solution: Read block 0 with the minimal block size.
+Files: src/memline.c, src/memfile.c, src/vim.h
+
+Patch 5.6a.022 (extra)
+Problem: Win32 GUI: When an error in the vimrc causes a dialog to pop up
+ (e.g., for an existing swap file), Vim crashes. (David Elins)
+Solution: Before showing a dialog, open the main window.
+Files: src/gui_w32.c
+
+Patch 5.6a.023
+Problem: Using expand("%:gs??/?") causes a crash. (Ron Aaron)
+Solution: Check for running into the end of the string in do_string_sub().
+Files: src/eval.c
+
+Patch 5.6a.024
+Problem: Using an autocommand to delete a buffer when leaving it can cause
+ a crash when jumping to a tag. (Franz Gorkotte)
+Solution: In do_tag(), store tagstacklen before jumping to another buffer.
+ Check tagstackidx after jumping to another buffer.
+ Add extra check in win_split() if tagname isn't NULL.
+Files: src/tag.c, src/window.c
+
+Patch 5.6a.025 (extra)
+Problem: Win32 GUI: The tables for toupper() and tolower() are initialized
+ too late. (Mike Steed)
+Solution: Move the initialization to win32_init() and call it from main().
+Files: src/main.c, src/os_w32.c, src/proto/os_w32.pro
+
+Patch 5.6a.026
+Problem: When the SNiFF connection is open, shell commands hang. (Pruemmer)
+Solution: Skip a second wait() call if waitpid() already detected that the
+ child has exited.
+Files: src/os_unix.c
+
+Patch 5.6a.027 (extra)
+Problem: Win32 GUI: The "Edit with Vim" popup menu entry causes problems
+ for the Office toolbar.
+Solution: Use a shell extension dll. (Tianmiao Hu)
+ Added it to the install and uninstal programs, replaces the old
+ "Edit with Vim" menu registry entries.
+Files: src/dosinst.c, src/uninstal.c, gvimext/*, runtime/doc/gui_w32.txt
+
+Patch 5.6a.028 (extra)
+Problem: Win32 GUI: Dialogs and tear-off menus can't handle multibyte
+ characters.
+Solution: Adjust nCopyAnsiToWideChar() to handle multibyte characters
+ correctly.
+Files: src/gui_w32.c
+
+==============================================================================
+VERSION 5.7 *version-5.7*
+
+Version 5.7 is a bug-fix version of 5.6.
+
+Changed *changed-5.7*
+-------
+
+Renamed src/INSTALL.mac to INSTALL_mac.txt to avoid it being recognized with a
+wrong file type. Also renamed src/INSTALL.amiga to INSTALL_ami.txt.
+
+
+Added *added-5.7*
+-----
+
+New syntax files:
+stp Stored Procedures (Jeff Lanzarotta)
+snnsnet, snnspat, snnsres SNNS (Davide Alberani)
+mel MEL (Robert Minsk)
+ruby Ruby (Mirko Nasato)
+tli TealInfo (Kurt W. Andrews)
+ora Oracle config file (Sandor Kopanyi)
+abaqus Abaqus (Carl Osterwisch)
+jproperties Java Properties (Simon Baldwin)
+apache Apache config (Allan Kelly)
+csp CSP (Jan Bredereke)
+samba Samba config (Rafael Garcia-Suarez)
+kscript KDE script (Thomas Capricelli)
+hb Hyper Builder (Alejandro Forero Cuervo)
+fortran Fortran (rewritten) (Ajit J. Thakkar)
+sml SML (Fabrizio Zeno Cornelli)
+cvs CVS commit (Matt Dunford)
+aspperl ASP Perl (Aaron Hope)
+bc BC calculator (Vladimir Scholtz)
+latte Latte (Nick Moffitt)
+wml WML (Gerfried Fuchs)
+
+Included Exuberant ctags 3.5.1. (Darren Hiebert)
+
+"display" and "fold" arguments for syntax items. For future extension, they
+are ignored now.
+
+strftime() function for the Macintosh.
+
+macros/explorer.vim: A file browser script (M A Aziz Ahmed)
+
+
+Fixed *fixed-5.7*
+-----
+
+The 16 bit MS-DOS version is now compiled with Bcc 3.1 instead of 4.0. The
+executable is smaller.
+
+When a "make test" failed, the output file was lost. Rename it to
+test99.failed to be able to see what went wrong.
+
+After sourcing bugreport.vim, it's not clear that bugreport.txt has been
+written in the current directory. Edit bugreport.txt to avoid that.
+
+Adding IME support when using Makefile.w32 didn't work. (Taro Muraoka)
+
+Win32 console: Mouse drags were passed on even when the mouse didn't move.
+
+Perl interface: In Buffers(), type of argument to SvPV() was int, should be
+STRLEN. (Tony Leneis)
+
+Problem with prototype for index() on AIX 4.3.0. Added check for _AIX43 in
+os_unix.h. (Jake Hamby)
+
+Mappings in mswin.vim could break when some commands are mapped. Add "nore"
+to most mappings to avoid re-mapping.
+
+modify_fname() made a copy of a file name for ":p" when it already was a full
+path name, which is a bit slow.
+
+Win32 with Borland C++ 5.5: Pass the path to the compiler on to xxd and ctags,
+to avoid depending on $PATH. Fixed "make clean".
+
+Many fixes to Macintosh specific parts: (mostly by Dany StAmant)
+- Only one Help menu.
+- No more crash when removing a menu item.
+- Support as External Editor for Codewarrior (still some little glitches).
+- Popup menu support.
+- Fixed crash when pasting after application switch.
+- Color from rgb.txt properly displayed.
+- 'isprint' default includes all chars above '~'. (Axel Kielhorn)
+- mac_expandpath() was leaking memory.
+- Add digraphs table. (Axel Kielhorn)
+- Multi-byte support: (Kenichi Asai)
+ Switch keyscript when going in/out of Insert mode.
+ Draw multibyte character correctly.
+ Don't use mblen() but highest bit of char to detect multibyte char.
+ Display value of multibyte in statusline (also for other systems).
+- mouse button was not initialized properly to MOUSE_LEFT when
+ USE_CTRLCLICKMENU not defined.
+- With Japanese SJIS characters: Make "w", "b", and "e" work
+ properly. (Kenichi Asai)
+- Replaced old CodeWarrior file os_mac.CW9.hqx with os_mac.cw5.sit.hqx.
+
+Fixes for VMS: (Zoltan Arpadffy) (also see patch 5.6.045 below)
+- Added Makefile_vms.mms and vimrc.vms to src/testdir to be able to run the
+ tests.
+- Various fixes.
+- Set 'undolevels' to 1000 by default.
+- Made mch_settitle() equivalent to the one in os_unix.c.
+
+RiscOS: A few prototypes for os_riscos.c were outdated. Generate prototypes
+automatically.
+
+
+Previously released patches:
+
+Patch 5.6.001
+Problem: When using "set bs=0 si cin", Inserting "#<BS>" or "}<BS>" which
+ reduces the indent doesn't delete the "#" or "}". (Lorton)
+Solution: Adjust ai_col in ins_try_si().
+Files: src/edit.c
+
+Patch 5.6.002
+Problem: When using the vim.vim syntax file, a comment with all uppercase
+ characters causes a hang.
+Solution: Adjust pattern for vimCommentTitle (Charles Campbell)
+Files: runtime/syntax/vim.vim
+
+Patch 5.6.003
+Problem: GTK GUI: Loading a user defined toolbar bitmap gives a warning
+ about the colormap. Probably because the window has not been
+ opened yet.
+Solution: Use gdk_pixmap_colormap_create_from_xpm() to convert the xpm file.
+ (Keith Radebaugh)
+Files: src/gui_gtk.c
+
+Patch 5.6.004 (extra)
+Problem: Win32 GUI with IME: When setting 'guifont' to "*", the font
+ requester appears twice.
+Solution: In gui_mch_init_font() don't call get_logfont() but copy
+ norm_logfont from fh. (Yasuhiro Matsumoto)
+Files: src/gui_w32.c
+
+Patch 5.6.005
+Problem: When 'winminheight' is zero, CTRL-W - with a big number causes a
+ crash. (David Kotchan)
+Solution: Check for negative window height in win_setheight().
+Files: src/window.c
+
+Patch 5.6.006
+Problem: GTK GUI: Bold font cannot always be used. Memory is freed too
+ early in gui_mch_init_font().
+Solution: Move call to g_free() to after where sdup is used. (Artem Hodyush)
+Files: src/gui_gtk_x11.c
+
+Patch 5.6.007 (extra)
+Problem: Win32 IME: Font is not changed when screen font is changed. And
+ IME composition window does not trace the cursor.
+Solution: Initialize IME font. When cursor is moved, set IME composition
+ window with ImeSetCompositionWindow(). Add call to
+ ImmReleaseContext() in several places. (Taro Muraoka)
+Files: src/gui.c, src/gui_w32.c, src/proto/gui_w32.pro
+
+Patch 5.6.008 (extra)
+Problem: Win32: When two files exist with the same name but different case
+ (through NFS or Samba), fixing the file name case could cause the
+ wrong one to be edited.
+Solution: Prefer a perfect match above a match while ignoring case in
+ fname_case(). (Flemming Madsen)
+Files: src/os_win32.c
+
+Patch 5.6.009 (extra)
+Problem: Win32 GUI: Garbage in Windows Explorer help line when selecting
+ "Edit with Vim" popup menu entry.
+Solution: Only return the help line when called with the GCS_HELPTEXT flag.
+ (Tianmiao Hu)
+Files: GvimExt/gvimext.cpp
+
+Patch 5.6.010
+Problem: A file name which contains a TAB was not read correctly from the
+ viminfo file and the ":ls" listing was not aligned properly.
+Solution: Parse the buffer list lines in the viminfo file from the end
+ backwards. Count a Tab for two characters to align the ":ls" list.
+Files: src/buffer.c
+
+Patch 5.6.011
+Problem: When 'columns' is huge (using a tiny font) and 'statusline' is
+ used, Vim can crash.
+Solution: Limit maxlen to MAXPATHL in win_redr_custom(). (John Mullin)
+Files: src/screen.c
+
+Patch 5.6.012
+Problem: When using "zsh" for /bin/sh, toolcheck may hang until "exit" is
+ typed. (Kuratczyk)
+Solution: Add "-c exit" when checking for the shell version.
+Files: src/toolcheck
+
+Patch 5.6.013
+Problem: Multibyte char in tooltip is broken.
+Solution: Consider multibyte char in replace_termcodes(). (Taro Muraoka)
+Files: src/term.c
+
+Patch 5.6.014
+Problem: When cursor is at the end of line and the character under cursor
+ is a multibyte character, "yl" doesn't yank 1 multibyte-char.
+ (Takuhiro Nishioka)
+Solution: Recognize a multibyte-char at end-of-line correctly in oneright().
+ (Taro Muraoka)
+ Also: make "+quickfix" in ":version" output appear alphabetically.
+Files: src/edit.c
+
+Patch 5.6.015
+Problem: New xterm delete key sends <Esc>[3~ by default.
+Solution: Added <kDel> and <kIns> to make the set of keypad keys complete.
+Files: src/edit.c, src/ex_getln.c, src/keymap.h, src/misc1.c,
+ src/misc2.c, src/normal.c, src/os_unix.c, src/term.c
+
+Patch 5.6.016
+Problem: When deleting a search string from history from inside a mapping,
+ another entry is deleted too. (Benji Fisher)
+Solution: Reset last_maptick when deleting the last entry of the search
+ history. Also: Increment maptick when starting a mapping from
+ typed characters to avoid a just added search string being
+ overwritten or removed from history.
+Files: src/ex_getln.c, src/getchar.c
+
+Patch 5.6.017
+Problem: ":s/e/\^M/" should replace an "e" with a CTRL-M, not split the
+ line. (Calder)
+Solution: Replace the backslash with a CTRL-V internally. (Stephen P. Wall)
+Files: src/ex_cmds.c
+
+Patch 5.6.018
+Problem: ":help [:digit:]" takes a long time to jump to the wrong place.
+Solution: Insert a backslash to avoid the special meaning of '[]'.
+Files: src/ex_cmds.c
+
+Patch 5.6.019
+Problem: "snd.c", "snd.java", etc. were recognized as "mail" filetype.
+Solution: Make pattern for mail filetype more strict.
+Files: runtime/filetype.vim
+
+Patch 5.6.020 (extra)
+Problem: The DJGPP version eats processor time (Walter Briscoe).
+Solution: Call __dpmi_yield() in the busy-wait loop.
+Files: src/os_msdos.c
+
+Patch 5.6.021
+Problem: When 'selection' is "exclusive", a double mouse click in Insert
+ mode doesn't select last char in line. (Lutz)
+Solution: Allow leaving the cursor on the NUL past the line in this case.
+Files: src/edit.c
+
+Patch 5.6.022
+Problem: ":e \~<Tab>" expands to ":e ~\$ceelen", which doesn't work.
+Solution: Re-insert the backslash before the '~'.
+Files: src/ex_getln.c
+
+Patch 5.6.023 (extra)
+Problem: Various warnings for the Ming compiler.
+Solution: Changes to avoid the warnings. (Bill McCarthy)
+Files: src/ex_cmds.c, src/gui_w32.c, src/os_w32exe.c, src/os_win32.c,
+ src/syntax.c, src/vim.rc
+
+Patch 5.6.024 (extra)
+Problem: Win32 console: Entering CTRL-_ requires the shift key. (Kotchan)
+Solution: Specifically catch keycode 0xBD, like the GUI.
+Files: src/os_win32.c
+
+Patch 5.6.025
+Problem: GTK GUI: Starting the GUI could be interrupted by a SIGWINCH.
+ (Nils Lohner)
+Solution: Repeat the read() call to get the gui_in_use value when
+ interrupted by a signal.
+Files: src/gui.c
+
+Patch 5.6.026 (extra)
+Problem: Win32 GUI: Toolbar bitmaps are searched for in
+ $VIMRUNTIME/bitmaps, while GTK looks in $VIM/bitmaps. (Keith
+ Radebaugh)
+Solution: Use $VIM/bitmaps for both, because these are not part of the
+ distribution but defined by the user.
+Files: src/gui_w32.c, runtime/doc/gui.txt
+
+Patch 5.6.027
+Problem: TCL: Crash when using a Tcl script (reported for Win32).
+Solution: Call Tcl_FindExecutable() in main(). (Brent Fulgham)
+Files: src/main.c
+
+Patch 5.6.028
+Problem: Xterm patch level 126 sends codes for mouse scroll wheel.
+ Fully works with xterm patch level 131.
+Solution: Recognize the codes for button 4 (0x60) and button 5 (0x61).
+Files: src/term.c
+
+Patch 5.6.029
+Problem: GTK GUI: Shortcut keys cannot be used for a dialog. (Johannes
+ Zellner)
+Solution: Add support for shortcut keys. (Marcin Dalecki)
+Files: src/gui_gtk.c
+
+Patch 5.6.030
+Problem: When closing a window and 'ea' is set, Vim can crash. (Yasuhiro
+ Matsumoto)
+Solution: Set "curbuf" to a valid value in win_close().
+Files: src/window.c
+
+Patch 5.6.031
+Problem: Multi-byte: When a double-byte character ends in CSI, Vim waits
+ for another character to be typed.
+Solution: Recognize the CSI as the second byte of a character and don't wait
+ for another one. (Yasuhiro Matsumoto)
+Files: src/getchar.c
+
+Patch 5.6.032
+Problem: Functions with an argument that is a line number don't all accept
+ ".", "$", etc. (Ralf Arens)
+Solution: Add get_art_lnum() and use it for setline(), line2byte() and
+ synID().
+Files: src/eval.c
+
+Patch 5.6.033
+Problem: Multi-byte: "f " sometimes skips to the second space. (Sung-Hyun
+ Nam)
+Solution: Change logic in searchc() to skip trailing byte of a double-byte
+ character.
+ Also: Ask for second byte when searching for double-byte
+ character. (Park Chong-Dae)
+Files: src/search.c
+
+Patch 5.6.034 (extra)
+Problem: Compiling with Borland C++ 5.5 fails on tolower() and toupper().
+Solution: Use TO_LOWER() and TO_UPPER() instead. Also adjust the Makefile
+ to make using bcc 5.5 easier.
+Files: src/edit.c, src/ex_docmd.c, src/misc1.c, src/Makefile.bor
+
+Patch 5.6.035
+Problem: Listing the"+comments" feature in the ":version" output depended
+ on the wrong ID. (Stephen P. Wall)
+Solution: Change "CRYPTV" to "COMMENTS".
+Files: src/version.c
+
+Patch 5.6.036
+Problem: GTK GUI: Copy/paste text doesn't work between gvim and Eterm.
+Solution: Support TEXT and COMPOUND_TEXT selection targets. (ChiDeok Hwang)
+Files: src/gui_gtk_x11.c
+
+Patch 5.6.037
+Problem: Multi-byte: Can't use "f" command with multibyte character in GUI.
+Solution: Enable XIM in Normal mode for the GUI. (Sung-Hyun Nam)
+Files: src/gui_gtk_x11.c, src/multbyte.c
+
+Patch 5.6.038
+Problem: Multi-clicks in GUI are interpreted as a mouse wheel click. When
+ 'ttymouse' is "xterm" a mouse click is interpreted as a mouse
+ wheel click.
+Solution: Don't recognize the mouse wheel in check_termcode() in the GUI.
+ Use 0x43 for a mouse drag in do_xterm_trace(), not 0x63.
+Files: src/term.c, src/os_unix.c
+
+Patch 5.6.039
+Problem: Motif GUI under KDE: When trying to logout, Vim hangs up the
+ system. (Hermann Rochholz)
+Solution: When handling the WM_SAVE_YOURSELF event, set the WM_COMMAND
+ property of the window to let the session manager know we finished
+ saving ourselves.
+Files: src/gui_x11.c
+
+Patch 5.6.040
+Problem: When using ":s" command, matching the regexp is done twice.
+Solution: After copying the matched line, adjust the pointers instead of
+ finding the match again. (Loic Grenie) Added vim_regnewptr().
+Files: src/ex_cmds.c, src/regexp.c, src/proto/regexp.pro
+
+Patch 5.6.041
+Problem: GUI: Athena, Motif and GTK don't give more than 10 dialog buttons.
+Solution: Remove the limit on the number of buttons.
+ Also support the 'v' flag in 'guioptions'.
+ For GTK: Center the buttons.
+Files: src/gui_athena.c, src/gui_gtk.c, src/gui_motif.c
+
+Patch 5.6.042
+Problem: When doing "vim -u vimrc" and vimrc contains ":q", the cursor in
+ the terminal can remain off.
+Solution: Call cursor_on() in mch_windexit().
+Files: src/os_unix.c
+
+Patch 5.6.043 (extra)
+Problem: Win32 GUI: When selecting guifont with the dialog, 'guifont'
+ doesn't include the bold or italic attributes.
+Solution: Append ":i" and/or ":b" to 'guifont' in gui_mch_init_font().
+Files: src/gui_w32.c
+
+Patch 5.6.044 (extra)
+Problem: MS-DOS and Windows: The line that dosinst.exe appends to
+ autoexec.bat to set PATH is wrong when Vim is in a directory with
+ an embedded space.
+Solution: Use double quotes for the value when there is an embedded space.
+Files: src/dosinst.c
+
+Patch 5.6.045 (extra) (fixed version)
+Problem: VMS: Various small problems.
+Solution: Many small changes. (Zoltan Arpadffy)
+ File name modifier ":h" keeps the path separator.
+ File name modifier ":e" also removes version.
+ Compile with MAX_FEAT by default.
+ When checking for autocommands ignore version in file name.
+ Be aware of file names being case insensitive.
+ Added vt320 builtin termcap.
+ Be prepared for an empty default_vim_dir.
+Files: runtime/gvimrc_example.vim, runtime/vimrc_example.vim,
+ runtime/doc/os_vms.txt, src/eval.c, src/feature.h, src/fileio.c,
+ src/gui_motif.c, src/gui_vms_conf.h, src/main.c, src/memline.c,
+ src/misc1.c, src/option.c, src/os_vms_conf.h, src/os_vms.c,
+ src/os_vms.h, src/os_vms.mms, src/tag.c, src/term.c, src/version.c
+
+Patch 5.6.046
+Problem: Systems with backslash in file name: With 'shellslash' set, "vim
+ */*.c" only uses a slash for the first file name. (Har'El)
+Solution: Fix slashes in file name arguments after reading the vimrc file.
+Files: src/option.c
+
+Patch 5.6.047
+Problem: $CPPFLAGS is not passed on to ctags configure.
+Solution: Add it. (Walter Briscoe)
+Files: src/config.mk.in, src/Makefile
+
+Patch 5.6.048
+Problem: CTRL-R in Command-line mode is documented to insert text as typed,
+ but inserts text literally.
+Solution: Make CTRL-R insert text as typed, use CTRL-R CTRL-R to insert
+ literally. This is consistent with Insert mode. But characters
+ that end Command-line mode are inserted literally.
+Files: runtime/doc/index.txt, runtime/doc/cmdline.txt, src/ex_getln.c,
+ src/ops.c, src/proto/ops.pro
+
+Patch 5.6.049
+Problem: Documentation for [!] after ":ijump" is wrong way around. (Benji
+ Fisher)
+Solution: Fix the documentation. Also improve the code to check for a match
+ after a /* */ comment.
+Files: runtime/doc/tagsearch.txt, src/search.c
+
+Patch 5.6.050
+Problem: Replacing is wrong when replacing a single-byte char with
+ double-byte char or the other way around.
+Solution: Shift the text after the character when it is replaced.
+ (Yasuhiro Matsumoto)
+Files: src/normal.c, src/misc1.c
+
+Patch 5.6.051
+Problem: ":tprev" and ":tnext" don't give an error message when trying to
+ go before the first or beyond the last tag. (Robert Webb)
+Solution: Added error messages. Also: Delay a second when a file-read
+ message is going to overwrite an error message, otherwise it won't
+ be seen.
+Files: src/fileio.c, src/tag.c
+
+Patch 5.6.052
+Problem: Multi-byte: When an Ex command has a '|' or '"' as a second byte,
+ it terminates the command.
+Solution: Skip second byte of multibyte char when checking for '|' and '"'.
+ (Asai Kenichi)
+Files: src/ex_docmd.c
+
+Patch 5.6.053
+Problem: CTRL-] doesn't work on a tag that contains a '|'. (Cesar Crusius)
+Solution: Escape '|', '"' and '\' in tag names when using CTRL-] and also
+ for command-line completion.
+Files: src/ex_getln.c, src/normal.c
+
+Patch 5.6.054
+Problem: When using ":e" and ":e #" the cursor is put in the first column
+ when 'startofline' is set. (Cordell)
+Solution: Use the last known column when 'startofline' is set.
+ Also, use ECMD_LAST more often to simplify the code.
+Files: src/buffer.c, src/ex_cmds.c, src/ex_docmd.c, src/proto/buffer.pro
+
+Patch 5.6.055
+Problem: When 'statusline' only contains a text without "%" and doesn't fit
+ in the window, Vim crashes. (Ron Aaron)
+Solution: Don't use the pointer for the first item if there is no item.
+Files: src/screen.c
+
+Patch 5.6.056 (extra)
+Problem: MS-DOS: F11 and F12 don't work when 'bioskey' is set.
+Solution: Use enhanced keyboard functions. (Vince Negri)
+ Detect presence of enhanced keyboard and set bioskey_read and
+ bioskey_ready.
+Files: src/os_msdos.c
+
+Patch 5.6.057 (extra)
+Problem: Win32 GUI: Multi-byte characters are wrong in dialogs and tear-off
+ menus.
+Solution: Use system font instead of a fixed font. (Matsumoto, Muraoka)
+Files: src/gui_w32.c
+
+Patch 5.6.058
+Problem: When the 'a' flag is not in 'guioptions', non-Windows systems
+ copy Visually selected text to the clipboard/selection on a yank
+ or delete command anyway. On Windows it isn't done even when the
+ 'a' flag is included.
+Solution: Respect the 'a' flag in 'guioptions' on all systems.
+Files: src/normal.c
+
+Patch 5.6.059 (extra)
+Problem: When moving the cursor over italic text and the characters spill
+ over to the cell on the right, that spill-over is deleted.
+ Noticed in the Win32 GUI, can happen on other systems too.
+Solution: Redraw italic text starting from a blank, like this is already
+ done for bold text. (Vince Negri)
+Files: src/gui.c, src/gui.h, src/gui_w32.c
+
+Patch 5.6.060
+Problem: Some bold characters spill over to the cell on the left, that
+ spill-over can remain sometimes.
+Solution: Redraw a character when the next character was bold and needs
+ redrawing. (Robert Webb)
+Files: src/screen.c
+
+Patch 5.6.061
+Problem: When xterm sends 8-bit controls, recognizing the version response
+ doesn't work.
+ When using CSI instead of <Esc>[ for the termcap color codes,
+ using 16 colors doesn't work. (Neil Bird)
+Solution: Also accept CSI in place of <Esc>[ for the version string.
+ Also check for CSI when handling colors 8-15 in term_color().
+ Use CSI for builtin xterm termcap entries when 'term' contains
+ "8bit".
+Files: runtime/doc/term.txt, src/ex_cmds.c, src/option.c, src/term.c,
+ src/os_unix.c, src/proto/option.pro, src/proto/term.pro
+
+Patch 5.6.062
+Problem: The documentation says that setting 'smartindent' doesn't have an
+ effect when 'cindent' is set, but it does make a difference for
+ lines starting with "#". (Neil Bird)
+Solution: Really ignore 'smartindent' when 'cindent' is set.
+Files: src/misc1.c, src/ops.c
+
+Patch 5.6.063
+Problem: Using "I" in Visual-block mode doesn't accept a count. (Johannes
+ Zellner)
+Solution: Pass the count on to do_insert() and edit(). (Allan Kelly)
+Files: src/normal.c, src/ops.c, src/proto/ops.pro
+
+Patch 5.6.064
+Problem: MS-DOS and Win32 console: Mouse doesn't work correctly after
+ including patch 5.6.28. (Vince Negri)
+Solution: Don't check for mouse scroll wheel when the mouse code contains
+ the number of clicks.
+Files: src/term.c
+
+Patch 5.6.065
+Problem: After moving the cursor around in Insert mode, typing a space can
+ still trigger an abbreviation. (Benji Fisher)
+Solution: Don't check for an abbreviation after moving around in Insert mode.
+Files: src/edit.c
+
+Patch 5.6.066
+Problem: Still a few bold character spill-over remains after patch 60.
+Solution: Clear character just in front of blanking out rest of the line.
+ (Robert Webb)
+Files: src/screen.c
+
+Patch 5.6.067
+Problem: When a file name contains a NL, the viminfo file is corrupted.
+Solution: Use viminfo_writestring() to convert the NL to CTRL-V n.
+ Also fix the Buffers menu and listing a menu name with a newline.
+Files: runtime/menu.vim, src/buffer.c, src/mark.c, src/menu.c
+
+Patch 5.6.068
+Problem: Compiling the Perl interface doesn't work with Perl 5.6.0.
+ (Bernhard Rosenkraenzer)
+Solution: Also check xs_apiversion for the version number when prepending
+ defines for PL_*.
+Files: src/Makefile
+
+Patch 5.6.069
+Problem: "go" doesn't always end up at the right character when
+ 'fileformat' is "dos". (Bruce DeVisser)
+Solution: Correct computations in ml_find_line_or_offset().
+Files: src/memline.
+
+Patch 5.6.070 (depends on 5.6.068)
+Problem: Compiling the Perl interface doesn't work with Perl 5.6.0.
+ (Bernhard Rosenkraenzer)
+Solution: Simpler check instead of the one from patch 68.
+Files: src/Makefile
+
+Patch 5.6.071
+Problem: "A" in Visual block mode on a Tab positions the cursor one char to
+ the right. (Michael Haumann)
+Solution: Correct the column computation in op_insert().
+Files: src/ops.c
+
+Patch 5.6.072
+Problem: When starting Vim with "vim +startinsert", it enters Insert mode
+ only after typing the first command. (Andrew Pimlott)
+Solution: Insert a dummy command in the stuff buffer.
+Files: src/main.c
+
+Patch 5.6.073 (extra) (depends on 5.6.034)
+Problem: Win32 GUI: When compiled with Bcc 5.5 menus don't work.
+ In dosinst.c toupper() and tolower() give an "internal compiler
+ error" for Bcc 5.5.
+Solution: Define WINVER to 4 to avoid compiling for Windows 2000. (Dan
+ Sharp) Also cleaned up compilation arguments.
+ Use our own implementation of toupper() in dosinst.c. Use
+ mytoupper() instead of tolower().
+Files: src/Makefile.bor, src/dosinst.c
+
+Patch 5.6.074 (extra)
+Problem: Entering CSI directly doesn't always work, because it's recognized
+ as the start of a special key. Mostly a problem with multibyte
+ in the GUI.
+Solution: Use K_CSI for a typed CSI character. Use <CSI> for a normal CSI,
+ <xCSI> for a CSI typed in the GUI.
+Files: runtime/doc/intro.txt, src/getchar.c, src/gui_amiga.c,
+ src/gui_gtk_x11.c, src/gui_mac.c, src/gui_riscos.c, src/gui_w32.c,
+ src/keymap.h, src/misc2.c
+
+Patch 5.6.075
+Problem: When using "I" or "A" in Visual block mode while 'sts' is set may
+ change spaces to a Tab the inserted text is not correct. (Mike
+ Steed) And some other problems when using "A" to append after the
+ end of the line.
+Solution: Check for change in spaces/tabs after inserting the text. Append
+ spaces to fill the gap between the end-of-line and the right edge
+ of the block.
+Files: src/ops.c
+
+Patch 5.6.076
+Problem: GTK GUI: Mapping <M-Space> doesn't work.
+Solution: Don't use the "Alt" modifier twice in key_press_event().
+Files: src/gui_gtk_x11.c
+
+Patch 5.6.077
+Problem: GUI: When interrupting an external program with CTRL-C, gvim might
+ crash. (Benjamin Korvemaker)
+Solution: Avoid using a NULL pointer in ui_inchar_undo().
+Files: src/ui.c
+
+Patch 5.6.078
+Problem: Locale doesn't always work on FreeBSD. (David O'Brien)
+Solution: Link with the "xpg4" library when available.
+Files: src/configure.in, src/configure
+
+Patch 5.6.079
+Problem: Vim could crash when several Tcl interpreters are created and
+ destroyed.
+Solution: handle the "exit" command and nested ":tcl" commands better. (Ingo
+ Wilken)
+Files: runtime/doc/if_tcl.txt, src/if_tcl.c
+
+Patch 5.6.080
+Problem: When jumping to a tag, generating the tags file and jumping to the
+ same tag again uses the old search pattern. (Sung-Hyun Nam)
+Solution: Flush cached tag matches when executing an external command.
+Files: src/misc2.c, src/proto/tag.pro, src/tag.c
+
+Patch 5.6.081
+Problem: ":syn include" uses a level for the included file, this confuses
+ contained items included at the same level.
+Solution: Use a unique tag for each included file. Changed sp_syn_inc_lvl
+ to sp_syn_inc_tag. (Scott Bigham)
+Files: src/syntax.c, src/structs.h
+
+Patch 5.6.082
+Problem: When using cscope, Vim can crash.
+Solution: Initialize tag_fname in find_tags(). (Anton Blanchard)
+Files: src/tag.c
+
+Patch 5.6.083 (extra)
+Problem: Win32: The visual beep can't be seen. (Eric Roesinger)
+Solution: Flush the output before waiting with GdiFlush(). (Maurice S. Barnum)
+ Also: Allow specifying the delay in t_vb for the GUI.
+Files: src/gui.c, src/gui_amiga.c, src/gui_gtk_x11.c, src/gui_mac.c,
+ src/gui_riscos.c, src/gui_w32.c, src/gui_x11.c, src/gui_beos.cc,
+ src/proto/gui_amiga.pro, src/proto/gui_gtk_x11.pro,
+ src/proto/gui_mac.pro, src/proto/gui_riscos.pro,
+ src/proto/gui_w32.pro, src/proto/gui_x11.pro,
+ src/proto/gui_beos.pro
+
+Patch 5.6.084 (depends on 5.6.074)
+Problem: GUI: Entering CSI doesn't always work for Athena and Motif.
+Solution: Handle typed CSI as <xCSI> (forgot this bit in 5.6.074).
+Files: src/gui_x11.c
+
+Patch 5.6.085
+Problem: Multi-byte: Using "r" to replace a double-byte char with a
+ single-byte char moved the cursor one character. (Matsumoto)
+ Also, using a count when replacing a single-byte char with a
+ double-byte char didn't work.
+Solution: Don't use del_char() to delete the second byte.
+ Get "ptr" again after calling ins_char().
+Files: src/normal.c
+
+Patch 5.6.086 (extra)
+Problem: Win32: When using libcall() and the returned value is not a valid
+ pointer, Vim crashes.
+Solution: Use IsBadStringPtr() to check if the pointer is valid.
+Files: src/os_win32.c
+
+Patch 5.6.087
+Problem: Multi-byte: Commands and messages with multibyte characters are
+ displayed wrong.
+Solution: Detect double-byte characters. (Yasuhiro Matsumoto)
+Files: src/ex_getln.c, src/message.c, src/misc2.c, src/screen.c
+
+Patch 5.6.088
+Problem: Multi-byte with Motif or Athena: The message "XIM requires
+ fontset" is annoying when Vim was compiled with XIM support but it
+ is not being used.
+Solution: Remove that message.
+Files: src/multbyte.c
+
+Patch 5.6.089
+Problem: On non-Unix systems it's possible to overwrite a read-only file
+ without using "!".
+Solution: Check if the file permissions allow overwriting before moving the
+ file to become the backup file.
+Files: src/fileio.c
+
+Patch 5.6.090
+Problem: When editing a file in "/home/dir/home/dir" this was replaced with
+ "~~". (Andreas Jellinghaus)
+Solution: Replace the home directory only once in home_replace().
+Files: src/misc1.c
+
+Patch 5.6.091
+Problem: When editing many "no file" files, can't create swap file, because
+ .sw[a-p] have all been used. (Neil Bird)
+Solution: Also use ".sv[a-z]", ".su[a-z]", etc.
+Files: src/memline.c
+
+Patch 5.6.092
+Problem: FreeBSD: When setting $TERM to a non-valid terminal name, Vim
+ hangs in tputs().
+Solution: After tgetent() returns an error code, call it again with the
+ terminal name "dumb". This apparently creates an environment in
+ which tputs() doesn't fail.
+Files: src/term.c
+
+Patch 5.6.093 (extra)
+Problem: Win32 GUI: "ls | gvim -" will show a message box about reading
+ stdin when Vim exits. (Donohue)
+Solution: Don't write a message about the file read from stdin until the GUI
+ has started.
+Files: src/fileio.c
+
+Patch 5.6.094
+Problem: Problem with multibyte string for ":echo var".
+Solution: Check for length in msg_outtrans_len_attr(). (Sung-Hyun Nam)
+ Also make do_echo() aware of multibyte characters.
+Files: src/eval.c, src/message.c
+
+Patch 5.6.095
+Problem: With an Emacs TAGS file that include another a relative path
+ doesn't always work.
+Solution: Use expand_tag_fname() on the name of the included file.
+ (Utz-Uwe Haus)
+Files: src/tag.c
+
+Patch 5.6.096
+Problem: Unix: When editing many files, startup can be slow. (Paul
+ Ackersviller)
+Solution: Halve the number of stat() calls used to add a file to the buffer
+ list.
+Files: src/buffer.c
+
+Patch 5.7a.001
+Problem: GTK doesn't respond on drag&drop from ROX-Filer.
+Solution: Add "text/uri-list" target. (Thomas Leonard)
+ Also: fix problem with checking for trash arguments.
+Files: src/gui_gtk_x11.c
+
+Patch 5.7a.002
+Problem: Multi-byte: 'showmatch' is performed when second byte of an
+ inserted double-byte char is a paren or brace.
+Solution: Check IsTrailByte() before calling showmatch(). (Taro Muraoka)
+Files: src/misc1.c
+
+Patch 5.7a.003
+Problem: Multi-byte: After using CTRL-O in Insert mode with the cursor at
+ the end of the line on a multibyte character the cursor moves to
+ the left.
+Solution: Check for multibyte character at end-of-line. (Taro Muraoka)
+ Also: fix cls() to detect a double-byte character. (Chong-Dae Park)
+Files: src/edit.c, src/search.c
+
+Patch 5.7a.004
+Problem: When reporting the search pattern offset, the string could be
+ unterminated, which may cause a crash.
+Solution: Terminate the string for the search offset. (Stephen P. Wall)
+Files: src/search.c
+
+Patch 5.7a.005
+Problem: When ":s//~/" doesn't find a match it reports "[NULL]" for the
+ pattern.
+Solution: Use get_search_pat() to obtain the actually used pattern.
+Files: src/ex_cmds.c, src/proto/search.pro, src/search.c
+
+Patch 5.7a.006 (extra)
+Problem: VMS: Various problems, also with the VAXC compiler.
+Solution: In many places use the Unix code for VMS too.
+ Added time, date and compiler version to version message.
+ (Zoltan Arpadffy)
+Files: src/ex_cmds.c, src/ex_docmd.c, src/globals.h, src/gui_vms_conf.h,
+ src/main.c, src/message.c, src/misc1.c, src/os_vms.c,
+ src/os_vms.h, src/os_vms.mms, src/os_vms_conf.h,
+ src/proto/os_vms.pro, src/proto/version.pro, src/term.c,
+ src/version.c, src/xxd/os_vms.mms, src/xxd/xxd.c
+
+Patch 5.7a.007
+Problem: Motif and Athena GUI: CTRL-@ is interpreted as CTRL-C.
+Solution: Only use "intr_char" when it has been set.
+Files: src/gui_x11.c
+
+Patch 5.7a.008
+Problem: GTK GUI: When using CTRL-L the screen is redrawn twice, causing
+ trouble for bold characters. Also happens when moving with the
+ scrollbar. Best seen when 'writedelay' is non-zero.
+ When starting the GUI with ":gui" the screen is redrawn once with
+ the wrong colors.
+Solution: Only set the geometry hints when the window size really changed.
+ This avoids setting it each time the scrollbar is forcefully
+ redrawn.
+ Don't redraw in expose_event() when gui.starting is still set.
+Files: src/gui_gtk_x11.c
+
+
+==============================================================================
+VERSION 5.8 *version-5.8*
+
+Version 5.8 is a bug-fix version of 5.7.
+
+
+Changed *changed-5.8*
+-------
+
+Ctags is no longer included with Vim. It has grown into a project of its own.
+You can find it here: http://ctags.sf.net. It is highly recommended as a Vim
+companion when you are writing programs.
+
+
+Added *added-5.8*
+-----
+
+New syntax files:
+acedb AceDB (Stewart Morris)
+aflex Aflex (Mathieu Clabaut)
+antlr Antlr (Mathieu Clabaut)
+asm68k 68000 Assembly (Steve Wall)
+automake Automake (John Williams)
+ayacc Ayacc (Mathieu Clabaut)
+b B (Mathieu Clabaut)
+bindzone BIND zone (glory hump)
+blank Blank (Rafal Sulejman)
+cfg Configure files (Igor Prischepoff)
+changelog ChangeLog (Gediminas Paulauskas)
+cl Clever (Phil Uren)
+crontab Crontab (John Hoelzel)
+csc Essbase script (Raul Segura Acevedo)
+cynlib Cynlib(C++) (Phil Derrick)
+cynpp Cyn++ (Phil Derrick)
+debchangelog Debian Changelog (Wichert Akkerman)
+debcontrol Debian Control (Wichert Akkerman)
+dns DNS zone file (Jehsom)
+dtml Zope's DTML (Jean Jordaan)
+dylan Dylan, Dylan-intr and Dylan-lid (Brent Fulgham)
+ecd Embedix Component Description (John Beppu)
+fgl Informix 4GL (Rafal Sulejman)
+foxpro FoxPro (Powing Tse)
+gsp GNU Server Pages (Nathaniel Harward)
+gtkrc GTK rc (David Necas)
+hercules Hercules (Avant! Corporation) (Dana Edwards)
+htmlos HTML/OS by Aestiva (Jason Rust)
+inittab SysV process control (David Necas)
+iss Inno Setup (Dominique Stephan)
+jam Jam (Ralf Lemke)
+jess Jess (Paul Baleme)
+lprolog LambdaProlog (Markus Mottl)
+ia64 Intel Itanium (parth malwankar)
+kix Kixtart (Nigel Gibbs)
+mgp MaGic Point (Gerfried Fuchs)
+mason Mason (HTML with Perl) (Andrew Smith)
+mma Mathematica (Wolfgang Waltenberger)
+nqc Not Quite C (Stefan Scherer)
+omnimark Omnimark (Paul Terray)
+openroad OpenROAD (Luis Moreno Serrano)
+named BIND configuration (glory hump)
+papp PApp (Marc Lehmann)
+pfmain Postfix main config (Peter Kelemen)
+pic PIC assembly (Aleksandar Veselinovic)
+ppwiz PPWizard (Stefan Schwarzer)
+progress Progress (Phil Uren)
+psf Product Specification File (Rex Barzee)
+r R (Tom Payne)
+registry MS-Windows registry (Dominique Stephan)
+robots Robots.txt (Dominique Stephan)
+rtf Rich Text Format (Dominique Stephan)
+setl SETL (Alex Poylisher)
+sgmldecl SGML Declarations (Daniel A. Molina W.)
+sinda Sinda input (Adrian Nagle)
+sindacmp Sinda compare (Adrian Nagle)
+sindaout Sinda output (Adrian Nagle)
+smith SMITH (Rafal Sulejman)
+snobol4 Snobol 4 (Rafal Sulejman)
+strace Strace (David Necas)
+tak TAK input (Adrian Nagle)
+takcmp TAK compare (Adrian Nagle)
+takout TAK output (Adrian Nagle)
+tasm Turbo assembly (FooLman)
+texmf TeX configuration (David Necas)
+trasys Trasys input (Adrian Nagle)
+tssgm TSS Geometry (Adrian Nagle)
+tssop TSS Optics (Adrian Nagle)
+tsscl TSS Command line (Adrian Nagle)
+virata Virata Configuration Script (Manuel M.H. Stol)
+vsejcl VSE JCL (David Ondrejko)
+wdiff Wordwise diff (Gerfried Fuchs)
+wsh Windows Scripting Host (Paul Moore)
+xkb X Keyboard Extension (David Necas)
+
+Renamed php3 to php, it now also supports php4 (Lutz Eymers)
+
+Patch 5.7.015
+Problem: Syntax files for Vim 6.0 can't be used with 5.x.
+Solution: Add the "default" argument to the ":highlight" command: Ignore the
+ command if highlighting was already specified.
+Files: src/syntax.c
+
+Generate the Syntax menu with makemenu.vim, so that it doesn't have to be done
+when Vim is starting up. Reduces the startup time of the GUI.
+
+
+Fixed *fixed-5.8*
+-----
+
+Conversion of docs to HTML didn't convert "|tag|s" to a hyperlink.
+
+Fixed compiling under NeXT. (Jeroen C.M. Goudswaard)
+
+optwin.vim gave an error when used in Vi compatible mode ('cpo' contains 'C').
+
+Tcl interpreter: "buffer" command didn't check for presence of an argument.
+(Dave Bodenstab)
+
+dosinst.c: Added checks for too long file name.
+
+Amiga: a file name starting with a colon was considered absolute but it isn't.
+Amiga: ":pwd" added a slash when in the root of a drive.
+
+Macintosh: Warnings for unused variables. (Bernhard Pruemmer)
+
+Unix: When catching a deadly signal, handle it in such a way that it's
+unlikely that Vim will hang. Call _exit() instead of exit() in case of a
+severe problem.
+
+Setting the window title from nothing to something didn't work after patch 29.
+
+Check for ownership of .exrc and .vimrc was done with stat(). Use lstat() as
+well for extra security.
+
+Win32 GUI: Printing a file with 'fileformat' "unix" didn't work. Set
+'fileformat' to "dos" before writing the temp file.
+
+Unix: Could start waiting for a character when checking for a CTRL-C typed
+when an X event is received.
+
+Could not use Perl and Python at the same time on FreeBSD, because Perl used
+"-lc" and Python used the threaded C library.
+
+Win32: The Mingw compiler gave a few warning messages.
+
+When using "ZZ" and an autocommand for writing uses an abbreviation it didn't
+work. Don't stuff the ":x" command but execute it directly. (Mikael Berthe)
+
+VMS doesn't always have lstat(), added an #ifdef around it.
+
+Added a few corrections for the Macintosh. (Axel Kielhorn)
+
+Win32: GvimExt could not edit more than a few files at once, the length of the
+argument was fixed.
+
+
+Previously released patches for Vim 5.7:
+
+Patch 5.7.001
+Problem: When the current buffer is encrypted, and another modified buffer
+ isn't, ":wall" will encrypt the other buffer.
+Solution: In buf_write() use "buf" instead of "curbuf" to check for the
+ crypt key.
+Files: src/fileio.c
+
+Patch 5.7.002
+Problem: When 'showmode' is set, using "CTRL-O :r file" waits three seconds
+ before displaying the read text. (Wichert Akkerman)
+Solution: Set "keep_msg" to the file message so that the screen is redrawn
+ before the three seconds wait for displaying the mode message.
+Files: src/fileio.c
+
+Patch 5.7.003
+Problem: Searching for "[[:cntrl:]]" doesn't work.
+Solution: Exclude NUL from the matching characters, it terminates the list.
+Files: src/regexp.c
+
+Patch 5.7.004
+Problem: GTK: When selecting a new font, Vim can crash.
+Solution: In gui_mch_init_font() unreference the old font, not the new one.
+Files: src/gui_gtk_x11.c
+
+Patch 5.7.005
+Problem: Multibyte: Inserting a wrapped line corrupts kterm screen.
+ Pasting TEXT/COMPOUND_TEXT into Vim does not work.
+ On Motif no XIM status line is displayed even though it is
+ available.
+Solution: Don't use xterm trick for wrapping lines for multibyte mode.
+ Correct a missing "break", added TEXT/COMPOUND_TEXT selection
+ request.
+ Add XIMStatusArea fallback code.
+ (Katsuhito Nagano)
+Files: src/gui_gtk_x11.c, src/multbyte.c, src/screen.c, src/ui.c
+
+Patch 5.7.006
+Problem: GUI: redrawing the non-Visual selection is wrong when the window
+ is unobscured. (Jean-Pierre Etienne)
+Solution: Redraw the selection properly and don't clear it. Added "len"
+ argument to clip_may_redraw_selection().
+Files: src/gui.c, src/ui.c, src/proto/ui.pro
+
+Patch 5.7.007
+Problem: Python: Crash when using the current buffer twice.
+Solution: Increase the reference count for buffer and window objects.
+ (Johannes Zellner)
+Files: src/if_python.c
+
+Patch 5.7.008
+Problem: In Ex mode, backspacing over the first TAB doesn't work properly.
+ (Wichert Akkerman)
+Solution: Switch the cursor on before printing the newline.
+Files: src/ex_getln.c
+
+Patch 5.7.009 (extra)
+Problem: Mac: Crash when using a long file.
+Solution: Don't redefine malloc() and free(), because it will break using
+ realloc().
+Files: src/os_mac.h
+
+Patch 5.7.010
+Problem: When using CTRL-A on a very long number Vim can crash. (Michael
+ Naumann)
+Solution: Truncate the length of the new number to avoid a buffer overflow.
+Files: src/ops.c
+
+Patch 5.7.011 (extra)
+Problem: Win32 GUI on NT 5 and Win98: Displaying Hebrew is reversed.
+Solution: Output each character separately, to avoid that Windows reverses
+ the text for some fonts. (Ron Aaron)
+Files: src/gui_w32.c
+
+Patch 5.7.012
+Problem: When using "-complete=buffer" for ":command" the user command
+ fails.
+Solution: In a user command don't replace the buffer name with a count for
+ the buffer number.
+Files: src/ex_docmd.c
+
+Patch 5.7.013
+Problem: "gD" didn't always find a match in the first line, depending on
+ the column the search started at.
+Solution: Reset the column to zero before starting to search.
+Files: src/normal.c
+
+Patch 5.7.014
+Problem: Rot13 encoding was done on characters with accents, which is
+ wrong. (Sven Gottwald)
+Solution: Only do rot13 encoding on ASCII characters.
+Files: src/ops.c
+
+Patch 5.7.016
+Problem: When hitting 'n' for a ":s///c" command, the ignore-case flag was
+ not restored, some matches were skipped. (Daniel Blaustein)
+Solution: Restore the reg_ic variable when 'n' was hit.
+Files: src/ex_cmds.c
+
+Patch 5.7.017
+Problem: When using a Vim script for Vim 6.0 with <SID> before a function
+ name, it produces an error message even when inside an "if version
+ >= 600". (Charles Campbell)
+Solution: Ignore errors in the function name when the function is not going
+ to be defined.
+Files: src/eval.c
+
+Patch 5.7.018
+Problem: When running "rvim" or "vim -Z" it was still possible to execute a
+ shell command with system() and backtick-expansion. (Antonios A.
+ Kavarnos)
+Solution: Disallow executing a shell command in get_cmd_output() and
+ mch_expand_wildcards().
+Files: src/misc1.c, src/os_unix.c
+
+Patch 5.7.019
+Problem: Multibyte: In a substitute string, a multibyte character isn't
+ skipped properly, can be a problem when the second byte is a
+ backslash.
+Solution: Skip an extra byte for a double-byte character. (Muraoka Taro)
+Files: src/ex_cmds.c
+
+Patch 5.7.020
+Problem: Compilation doesn't work on MacOS-X.
+Solution: Add a couple of #ifdefs. (Jamie Curmi)
+Files: src/regexp.c, src/ctags/general.h
+
+Patch 5.7.021
+Problem: Vim sometimes produces a beep when started in an xterm. Only
+ happens when compiled without mouse support.
+Solution: Requesting the xterm version results in a K_IGNORE. This wasn't
+ handled when mouse support is disabled. Accept K_IGNORE always.
+Files: src/normal.c
+
+Patch 5.7.022
+Problem: %v in 'statusline' is not displayed when it's equal to %c.
+Solution: Check if %V or %v is used and handle them differently.
+Files: src/screen.c
+
+Patch 5.7.023
+Problem: Crash when a WinLeave autocommand deletes the buffer in the other
+ window.
+Solution: Check that after executing the WinLeave autocommands there still
+ is a window to be closed. Also update the test that was supposed
+ to check for this problem.
+Files: src/window.c, testdir/test13.in, testdir/test13.ok
+
+Patch 5.7.024
+Problem: Evaluating an expression for 'statusline' can have side effects.
+Solution: Evaluate the expression in a sandbox.
+Files: src/edit.c, src/eval.c, src/proto/eval.pro, src/ex_cmds.c,
+ src/ex_cmds.h, src/ex_docmd.c, src/globals.h, src/option.c,
+ src/screen.c, src/undo.c
+
+Patch 5.7.025 (fixed)
+Problem: Creating a temp file has a race condition.
+Solution: Create a private directory to write the temp files in.
+Files: src/fileio.c, src/misc1.c, src/proto/misc1.pro,
+ src/proto/fileio.pro, src/memline.c, src/os_unix.h
+
+Patch 5.7.026 (extra)
+Problem: Creating a temp file has a race condition.
+Solution: Create a private directory to write the temp files in.
+ This is the extra part of patch 5.7.025.
+Files: src/os_msdos.h
+
+Patch 5.7.027
+Problem: Starting to edit a file can cause a crash. For example when in
+ Insert mode, using CTRL-O :help abbr<Tab> to scroll the screen and
+ then <CR>, which edits a help file. (Robert Bogomip)
+Solution: Check if keep_msg is NULL before copying it.
+Files: src/fileio.c
+
+Patch 5.7.028
+Problem: Creating a backup or swap file could fail in rare situations.
+Solution: Use O_EXCL for open().
+Files: src/fileio.c, src/memfile.c
+
+Patch 5.7.029
+Problem: Editing a file with an extremely long name crashed Vim.
+Solution: Check for length of the name when setting the window title.
+Files: src/buffer.c
+
+Patch 5.7.030
+Problem: A ":make" or ":grep" command with a very long argument could cause
+ a crash.
+Solution: Allocate the buffer for the shell command.
+Files: src/ex_docmd.c
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/version6.txt b/runtime/doc/version6.txt
new file mode 100644
index 0000000..e14e158
--- /dev/null
+++ b/runtime/doc/version6.txt
@@ -0,0 +1,14530 @@
+*version6.txt* For Vim version 9.0. Last change: 2022 Apr 06
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Welcome to Vim Version 6.0! A large number of features has been added. This
+file mentions all the new items that have been added, changes to existing
+features and bug fixes compared to Vim 5.x.
+
+See |vi_diff.txt| for an overview of differences between Vi and Vim 6.0.
+See |version4.txt| for differences between Vim 3.0 and Vim 4.0.
+See |version5.txt| for differences between Vim 4.0 and Vim 5.0.
+
+INCOMPATIBLE CHANGES |incompatible-6|
+
+Cursor position in Visual mode |curpos-visual|
+substitute command Vi compatible |substitute-CR|
+global option values introduced |new-global-values|
+'fileencoding' changed |fileencoding-changed|
+Digraphs changed |digraphs-changed|
+Filetype detection changed |filetypedetect-changed|
+Unlisted buffers introduced |new-unlisted-buffers|
+CTRL-U in Command-line mode changed |CTRL-U-changed|
+Ctags gone |ctags-gone|
+Documentation reorganized |documentation-6|
+Modeless selection and clipboard |modeless-and-clipboard|
+Small incompatibilities |incomp-small-6|
+
+NEW FEATURES |new-6|
+
+Folding |new-folding|
+Vertically split windows |new-vertsplit|
+Diff mode |new-diff-mode|
+Easy Vim: click-and-type |new-evim|
+User manual |new-user-manual|
+Flexible indenting |new-indent-flex|
+Extended search patterns |new-searchpat|
+UTF-8 support |new-utf-8|
+Multi-language support |new-multi-lang|
+Plugin support |new-plugins|
+Filetype plugins |new-filetype-plugins|
+File browser |new-file-browser|
+Editing files over a network |new-network-files|
+Window for command-line editing |new-cmdwin|
+Debugging mode |new-debug-mode|
+Cursor in virtual position |new-virtedit|
+Debugger interface |new-debug-itf|
+Communication between Vims |new-vim-server|
+Buffer type options |new-buftype|
+Printing |new-printing|
+Ports |ports-6|
+Quickfix extended |quickfix-6|
+Operator modifiers |new-operator-mod|
+Search Path |new-search-path|
+Writing files improved |new-file-writing|
+Argument list |new-argument-list|
+Restore a View |new-View|
+Color schemes |new-color-schemes|
+Various new items |new-items-6|
+
+IMPROVEMENTS |improvements-6|
+
+COMPILE TIME CHANGES |compile-changes-6|
+
+BUG FIXES |bug-fixes-6|
+
+VERSION 6.1 |version-6.1|
+Changed |changed-6.1|
+Added |added-6.1|
+Fixed |fixed-6.1|
+
+VERSION 6.2 |version-6.2|
+Changed |changed-6.2|
+Added |added-6.2|
+Fixed |fixed-6.2|
+
+VERSION 6.3 |version-6.3|
+Changed |changed-6.3|
+Added |added-6.3|
+Fixed |fixed-6.3|
+
+VERSION 6.4 |version-6.4|
+Changed |changed-6.4|
+Added |added-6.4|
+Fixed |fixed-6.4|
+
+==============================================================================
+INCOMPATIBLE CHANGES *incompatible-6*
+
+These changes are incompatible with previous releases. Check this list if you
+run into a problem when upgrading from Vim 5.x to 6.0
+
+
+Cursor position in Visual mode *curpos-visual*
+------------------------------
+
+When going from one window to another window on the same buffer while in
+Visual mode, the cursor position of the other window is adjusted to keep the
+same Visual area. This can be used to set the start of the Visual area in one
+window and the end in another. In vim 5.x the cursor position of the other
+window would be used, which could be anywhere and was not very useful.
+
+
+Substitute command Vi compatible *substitute-CR*
+--------------------------------
+
+The substitute string (the "to" part of the substitute command) has been made
+Vi compatible. Previously a CTRL-V had a special meaning and could be used to
+prevent a <CR> to insert a line break. This made it impossible to insert a
+CTRL-V before a line break. Now a backslash is used to prevent a <CR> to
+cause a line break. Since the number of backslashes is halved, it is still
+possible to insert a line break at the end of the line. This now works just
+like Vi, but it's not compatible with Vim versions before 6.0.
+
+When a ":s" command doesn't make any substitutions, it no longer sets the '[
+and '] marks. This is not related to Vi, since it doesn't have these marks.
+
+
+Global option values introduced *new-global-values*
+-------------------------------
+
+There are now global values for options which are local to a buffer or window.
+Previously the local options were copied from one buffer to another. When
+editing another file this could cause option values from a modeline to be used
+for the wrong file. Now the global values are used when entering a buffer
+that has not been used before. Also, when editing another buffer in a window,
+the local window options are reset to their global values. The ":set" command
+sets both the local and global values, this is still compatible. But a
+modeline only sets the local value, this is not backwards compatible.
+
+":let &opt = val" now sets the local and global values, like ":set". New
+commands have been added to set the global or local value:
+ :let &opt = val like ":set"
+ :let &g:opt = val like ":setglobal"
+ :let &l:opt = val like ":setlocal"
+
+
+'fileencoding' changed *fileencoding-changed*
+----------------------
+
+'fileencoding' was used in Vim 5.x to set the encoding used inside all of Vim.
+This was a bit strange, because it was local to a buffer and worked for all
+buffers. It could never be different between buffers, because it changed the
+way text in all buffers was interpreted.
+It is now used for the encoding of the file related to the buffer. If you
+still set 'fileencoding' it is likely to be overwritten by the detected
+encoding from 'fileencodings', thus it is "mostly harmless".
+The old FileEncoding autocommand now does the same as the new EncodingChanged
+event.
+
+
+Digraphs changed *digraphs-changed*
+----------------
+
+The default digraphs now correspond to RFC1345. This is very different from
+what was used in Vim 5.x. |digraphs|
+
+
+Filetype detection changed *filetypedetect-changed*
+--------------------------
+
+The filetype detection previously was using the "filetype" autocommand group.
+This caused confusion with the FileType event name (case is ignored). The
+group is now called "filetypedetect". It still works, but if the "filetype"
+group is used the autocommands will not be removed by ":filetype off".
+ The support for 'runtimepath' has made the "myfiletypefile" and
+"mysyntaxfile" mechanism obsolete. They are still used for backwards
+compatibility.
+
+The connection between the FileType event and setting the 'syntax' option was
+previously in the "syntax" autocommand group. That caused confusion with the
+Syntax event name. The group is now called "syntaxset".
+
+The distributed syntax files no longer contain "syntax clear". That makes it
+possible to include one in the other without tricks. The syntax is now
+cleared when the 'syntax' option is set (by an autocommand added from
+synload.vim). This makes the syntax cleared when the value of 'syntax' does
+not correspond to a syntax file. Previously the existing highlighting was
+kept.
+
+
+Unlisted buffers introduced *new-unlisted-buffers*
+---------------------------
+
+There is now a difference between buffers which don't appear in the buffer
+list and buffers which are really not in the buffer list. Commands like
+":ls", ":bnext", ":blast" and the Buffers menu will skip buffers not in the
+buffer list. |unlisted-buffer|
+The 'buflisted' option can be used to make a buffer appear in the buffer list
+or not.
+
+Several commands that previously added a buffer to the buffer list now create
+an unlisted buffer. This means that a ":bnext" and ":ball" will not find these
+files until they have actually been edited. For example, buffers used for the
+alternative file by ":write file" and ":read file".
+ Other commands previously completely deleted a buffer and now only remove
+the buffer from the buffer list. Commands relying on a buffer not to be
+present might fail. For example, a ":bdelete" command in an autocommand that
+relied on something following to fail (was used in the automatic tests).
+|:bwipeout| can be used for the old meaning of ":bdelete".
+
+The BufDelete autocommand event is now triggered when a buffer is removed from
+the buffer list. The BufCreate event is only triggered when a buffer is
+created that is added to the buffer list, or when an existing buffer is added
+to the buffer list. BufAdd is a new name for BufCreate.
+The new BufNew event is for creating any buffer and BufWipeout for really
+deleting a buffer.
+
+When doing Insert mode completion, only buffers in the buffer list are
+scanned. Added the 'U' flag to 'complete' to do completion from unlisted
+buffers.
+
+Unlisted buffers are not stored in a viminfo file.
+
+
+CTRL-U in Command-line mode changed *CTRL-U-changed*
+-----------------------------------
+
+Using CTRL-U when editing the command line cleared the whole line. Most
+shells only delete the characters before the cursor. Made it work like that.
+(Steve Wall)
+
+You can get the old behavior with CTRL-E CTRL-U: >
+ :cnoremap <C-U> <C-E><C-U>
+
+
+Ctags gone *ctags-gone*
+----------
+
+Ctags is no longer part of the Vim distribution. It's now a grown-up program
+by itself, it deserves to be distributed separately.
+Ctags can be found here: http://ctags.sf.net/.
+
+
+Documentation reorganized *documentation-6*
+-------------------------
+
+The documentation has been reorganized, an item may not be where you found it
+in Vim 5.x.
+- The user manual was added, some items have been moved to it from the
+ reference manual.
+- The quick reference is now in a separate file (so that it can be printed).
+
+The examples in the documentation were previously marked with a ">" in the
+first column. This made it difficult to copy/paste them. There is now a
+single ">" before the example and it ends at a "<" or a non-blank in the first
+column. This also looks better without highlighting.
+
+'helpfile' is no longer used to find the help tags file. This allows a user
+to add its own help files (e.g., for plugins).
+
+
+Modeless selection and clipboard *modeless-and-clipboard*
+--------------------------------
+
+The modeless selection is used to select text when Visual mode can't be used,
+for example when editing the command line or at the more prompt.
+In Vim 5.x the modeless selection was always used. On MS-Windows this caused
+the clipboard to be overwritten, with no way to avoid that. The modeless
+selection now obeys the 'a' and 'A' flags in 'guioptions' and "autoselect" and
+"autoselectml" in 'clipboard'. By default there is no automatic copy on
+MS-Windows. Use the |c_CTRL-Y| command to manually copy the selection.
+
+To get the old behavior back, do this: >
+
+ :set clipboard^=autoselectml guioptions+=A
+
+
+Small incompatibilities *incomp-small-6*
+-----------------------
+
+'backupdir', 'cdpath', 'directory', 'equalprg', 'errorfile', 'formatprg',
+'grepprg', 'helpfile', 'makeef', 'makeprg', 'keywordprg', 'cscopeprg',
+'viminfo' and 'runtimepath' can no longer be set from a modeline, for better
+security.
+
+Removed '_' from the 'breakat' default: It's commonly used in keywords.
+
+The default for 'mousehide' is on, because this works well for most people.
+
+The Amiga binary is now always compiled with "big" features. The "big" binary
+archive no longer exists.
+
+The items "[RO]", "[+]", "[help]", "[Preview]" and "[filetype]" in
+'statusline' no longer have a leading space.
+
+Non-Unix systems: When expanding wildcards for the Vim arguments, don't use
+'suffixes'. It now works as if the shell had expanded the arguments.
+
+The 'lisp', 'smartindent' and 'cindent' options are not switched off when
+'paste' is set. The auto-indenting is disabled when 'paste' is set, but
+manual indenting with "=" still works.
+
+When formatting with "=" uses 'cindent' or 'indentexpr' indenting, and there
+is no change in indent, this is not counted as a change ('modified' isn't set
+and there is nothing to undo).
+
+Report 'modified' as changed when 'fileencoding' or 'fileformat' was set.
+Thus it reflects the possibility to abandon the buffer without losing changes.
+
+The "Save As" menu entry now edits the saved file. Most people expect it to
+work like this.
+
+A buffer for a directory is no longer added to the Buffers menu.
+
+Renamed <Return> to <Enter>, since that's what it's called on most keyboards.
+Thus it's now the hit-enter prompt instead of the hit-return prompt.
+Can map <Enter> just like <CR> or <Return>.
+
+The default for the 'viminfo' option is now '20,"50,h when 'compatible' isn't
+set. Most people will want to use it, including beginners, but it required
+setting the option, which isn't that easy.
+
+After using ":colder" the newer error lists are overwritten. This makes it
+possible to use ":grep" to browse in a tree-like way. Must use ":cnewer 99"
+to get the old behavior.
+
+The patterns in 'errorformat' would sometimes ignore case (MS-Windows) and
+sometimes not (Unix). Now case is always ignored. Add "\C" to the pattern to
+match case.
+
+The 16 bit MS-DOS version is now compiled without the +listcmds feature
+(buffer list manipulation commands). They are not often needed and this
+executable needs to be smaller.
+
+'sessionoptions' now includes "curdir" by default. This means that restoring
+a session will result in the current directory being restored, instead of
+going to the directory where the session file is located.
+
+A session deleted all buffers, deleting all marks. Now keep the buffer list,
+it shouldn't hurt for some existing buffers to remain present.
+When the argument list is empty ":argdel *" caused an error message.
+
+No longer put the search pattern from a tag jump in the history.
+
+Use "SpecialKey" highlighting for unprintable characters instead of "NonText".
+The idea is that unprintable text or any text that's displayed differently
+from the characters in the file is using "SpecialKey", and "NonText" is used
+for text that doesn't really exist in the file.
+
+Motif now uses the system default colors for the menu and scrollbar. Used to
+be grey. It's still possible to set the colors with ":highlight" commands and
+resources.
+
+Formatting text with "gq" breaks a paragraph at a non-empty blank line.
+Previously the line would be removed, which wasn't very useful.
+
+":normal" does no longer hang when the argument ends in half a command.
+Previously Vim would wait for more characters to be typed, without updating
+the screen. Now it pretends an <Esc> was typed.
+
+Bitmaps for the toolbar are no longer searched for in "$VIM/bitmaps" but in
+the "bitmaps" directories in 'runtimepath'.
+
+Now use the Cmdline-mode menus for the hit-enter prompt instead of the Normal
+mode menus. This generally works better and allows using the "Copy" menu to
+produce CTRL-Y to copy the modeless selection.
+
+Moved the font selection from the Window to the Edit menu, together with the
+other settings.
+
+The default values for 'isfname' include more characters to make "gf" work
+better.
+
+Changed the license for the documentation to the Open Publication License.
+This seemed fair, considering the inclusion of parts of the Vim book, which is
+also published under the OPL. The downside is that we can't force someone who
+would sell copies of the manual to contribute to Uganda.
+
+After "ayy don't let ""yy or :let @" = val overwrite the "a register.
+Use the unnamed register instead.
+
+MSDOS: A pattern "*.*" previously also matched a file name without a dot.
+This was inconsistent with other versions.
+
+In Insert mode, CTRL-O CTRL-\ CTRL-N {cmd} remains in Normal mode. Previously
+it would go back to Insert mode, thus confusing the meaning of CTRL-\ CTRL-N,
+which is supposed to take us to Normal mode (especially in ":amenu").
+
+Allow using ":" commands after an operator. Could be used to implement a new
+movement command. Thus it no longer aborts a pending operator.
+
+For the Amiga the "-d {device}" argument was possible. When compiled with the
+diff feature, this no longer works. Use "-dev {device}" instead. |-dev|
+
+Made the default mappings for <S-Insert> in Insert mode insert the text
+literally, avoids that special characters like BS cause side effects.
+
+Using ":confirm" applied to the rest of the line. Now it applies only to the
+command right after it. Thus ":confirm if x | edit | endif" no longer works,
+use ":if x | confirm edit | endif". This was the original intention, that it
+worked differently was a bug.
+
+==============================================================================
+NEW FEATURES *new-6*
+
+Folding *new-folding*
+-------
+
+Vim can now display a buffer with text folded. This allows overviewing the
+structure of a file quickly. It is also possible to yank, delete and put
+folded text, for example to move a function to another position.
+
+There is a whole bunch of new commands and options related to folding.
+See |folding|.
+
+
+Vertically split windows *new-vertsplit*
+------------------------
+
+Windows can also be split vertically. This makes it possible to have windows
+side by side. One nice use for this is to compare two similar files (see
+|new-diff-mode|). The 'scrollbind' option can be used to synchronize
+scrolling.
+
+A vertical split can be created with the commands:
+ :vsplit or CTRL-W v or CTRL-W CTRL-V |:vsplit|
+ :vnew |:vnew|
+ :vertical {cmd} |:vertical|
+The last one is a modifier, which has a meaning for any command that splits a
+window. For example: >
+ :vertical stag main
+Will vertically split the window and jump to the tag "main" in the new window.
+
+Moving from window to window horizontally can be done with the |CTRL-W_h| and
+|CTRL-W_l| commands. The |CTRL-W_k| and |CTRL-W_j| commands have been changed
+to jump to the window above or below the cursor position.
+
+The vertical and horizontal splits can be mixed as you like. Resizing windows
+is easy when using the mouse, just position the pointer on a status line or
+vertical separator and drag it. In the GUI a special mouse pointer shape
+indicates where you can drag a status or separator line.
+
+To resize vertically split windows use the |CTRL-W_<| and |CTRL-W_>| commands.
+To make a window the maximum width use the CTRL-W | command |CTRL-W_bar|.
+
+To force a new window to use the full width or height of the Vim window,
+these two modifiers are available:
+ :topleft {cmd} New window appears at the top with full
+ width or at the left with full height.
+ :botright {cmd} New window appears at the bottom with full
+ width or at the right with full height.
+This can be combined with ":vertical" to force a vertical split: >
+ :vert bot dsplit DEBUG
+This will open a window at the far right, occupying the full height of the Vim
+window, with the cursor on the first definition of "DEBUG".
+The help window is opened at the top, like ":topleft" was used, if the current
+window is fewer than 80 characters wide.
+
+A few options can be used to set the preferences for vertically split windows.
+They work similarly to their existing horizontal equivalents:
+ horizontal vertical ~
+ 'splitbelow' 'splitright'
+ 'winheight' 'winwidth'
+ 'winminheight' 'winminwidth'
+It's possible to set 'winminwidth' to zero, so that temporarily unused windows
+hardly take up space without closing them.
+
+The new 'eadirection' option tells where 'equalalways' applies:
+ :set eadirection=both both directions
+ :set eadirection=ver equalize window heights
+ :set eadirection=hor equalize windows widths
+This can be used to avoid changing window sizes when you want to keep them.
+
+Since windows can become quite narrow with vertical splits, text lines will
+often not fit. The 'sidescrolloff' has been added to keep some context left
+and right of the cursor. The 'listchars' option has been extended with the
+"precedes" item, to show a "<" for example, when there is text left off the
+screen. (Utz-Uwe Haus)
+
+"-O" command line argument: Like "-o" but split windows vertically. (Scott
+Urban)
+
+Added commands to move the current window to the very top (CTRL-W K), bottom
+(CTRL-W J), left (CTRL-W H) and right (CTRL-W L). In the new position the
+window uses the full width/height of the screen.
+
+When there is not enough room in the status line for both the file name and
+the ruler, use up to half the width for the ruler. Useful for narrow windows.
+
+
+Diff mode *new-diff-mode*
+---------
+
+In diff mode Vim shows the differences between two, three or four files.
+Folding is used to hide the parts of the file that are equal.
+Highlighting is used to show deleted and changed lines.
+See |diff-mode|.
+
+An easy way to start in diff mode is to start Vim as "vimdiff file1 file2".
+Added the vimdiff manpage.
+
+In a running Vim the |:diffsplit| command starts diff mode for the current
+file and another file. The |:diffpatch| command starts diff mode using the
+current file and a patch file. The |:diffthis| command starts diff mode for
+the current window.
+
+Differences can be removed with the |:diffget| and |:diffput| commands.
+
+- The 'diff' option switches diff mode on in a window.
+- The |:diffupdate| command refreshes the diffs.
+- The 'diffopt' option changes how diffs are displayed.
+- The 'diffexpr' option can be set how a diff is to be created.
+- The 'patchexpr' option can be set how patch is applied to a file.
+- Added the "diff" folding method. When opening a window for diff-mode, set
+ 'foldlevel' to zero and 'foldenable' on, to close the folds.
+- Added the DiffAdd, DiffChange, DiffDelete and DiffText highlight groups to
+ specify the highlighting for differences. The defaults are ugly...
+- Unix: make a vimdiff symbolic link for "make install".
+- Removed the now obsolete "vimdiff.vim" script from the distribution.
+- Added the "[c" and "]c" commands to move to the next/previous change in diff
+ mode.
+
+
+Easy Vim: click-and-type *new-evim*
+------------------------
+
+eVim stands for "Easy Vim". This is a separate program, but can also be
+started as "vim -y".
+
+This starts Vim with 'insertmode' set to allow click-and-type editing. The
+$VIMRUNTIME/evim.vim script is used to add mappings and set options to be able
+to do most things like Notepad. This is only for people who can't stand two
+modes.
+
+eView does the same but in readonly mode.
+
+In the GUI a CTRL-C now only interrupts when busy with something, not when
+waiting for a character. Allows using CTRL-C to copy text to the clipboard.
+
+
+User manual *new-user-manual*
+-----------
+
+The user manual has been added. It is organised around editing tasks. It
+reads like a book, from start to end. It should allow beginners to start
+learning Vim. It helps everybody to learn using the most useful Vim features.
+It is much easier to read than the reference manual, but omits details. See
+|user-manual|.
+
+The user manual includes parts of the Vim book by Steve Oualline |frombook|.
+It is published under the OPL |manual-copyright|.
+
+When syntax highlighting is not enabled, the characters in the help file which
+mark examples ('>' and '<') and header lines ('~') are replaced with a space.
+
+When closing the help window, the window layout is restored from before
+opening it, if the window layout didn't change since then.
+When opening the help window, put it at the top of the Vim window if the
+current window is fewer than 80 characters and not full width.
+
+
+Flexible indenting *new-indent-flex*
+------------------
+
+Automatic indenting is now possible for any language. It works with a Vim
+script, which makes it very flexible to compute the indent.
+
+The ":filetype indent on" command enables using the provided indent scripts.
+This is explained in the user manual: |30.3|.
+
+The 'indentexpr' option is evaluated to get the indent for a line. The
+'indentkeys' option tells when to trigger re-indenting. Normally these
+options are set from an indent script. Like Syntax files, indent scripts will
+be created and maintained by many people.
+
+
+Extended search patterns *new-searchpat*
+------------------------
+
+Added the possibility to match more than one line with a pattern. (partly by
+Loic Grenie)
+New items in a search pattern for multi-line matches:
+\n match end-of-line, also in []
+\_[] match characters in range and end-of-line
+\_x match character class and end-of-line
+\_. match any character or end-of-line
+\_^ match start-of-line, can be used anywhere in the regexp
+\_$ match end-of-line, can be used anywhere in the regexp
+
+Various other new items in search patterns:
+\c ignore case for the whole pattern
+\C match case for the whole pattern
+\m magic on for the following
+\M magic off for the following
+\v make following characters "very magic"
+\V make following characters "very nomagic"
+
+\@! don't match atom before this.
+ Example: "foo\(bar\)\@!" matches "foo " but not "foobar".
+\@= match atom, resulting in zero-width match
+ Example: "foo\(bar\)\@=" matches "foo" in "foobar".
+\@<! don't match preceding atom before the current position
+\@<= match preceding atom before the current position
+\@> match preceding atom as a subexpression
+
+\& match only when branch before and after it match
+
+\%[] optionally match a list of atoms; "end\%[if]" matches "end",
+ "endi" and "endif"
+\%(\) like \(\), but without creating a back-reference; there can be
+ any number of these, overcomes the limit of nine \( \) pairs
+\%^ match start-of-file (Chase Tingley)
+\%$ match end-of-file (Chase Tingley)
+\%# Match with the cursor position. (Chase Tingley)
+\? Just like "\=" but can't be used in a "?" command.
+
+\%23l match in line 23
+\%<23l match before line 23
+\%>23l match after line 23
+\%23c, \%<23c, \%>23c match in/before/after column 23
+\%23v, \%<23v, \%>23v match in/before/after virtual column 23
+
+
+For syntax items:
+\z(...\) external reference match set (in region start pattern)
+\z1 - \z9 external reference match use (in region skip or end pattern)
+ (Scott Bigham)
+
+\zs use position as start of match
+\ze use position as end of match
+
+Removed limit of matching only up to 32767 times with *, \+, etc.
+
+Added support to match multibyte characters. (partly by Muraoka Taro)
+Made "\<" and "\>" work for UTF-8. (Muraoka Taro)
+
+
+UTF-8 support *new-utf-8*
+-------------
+
+Vim can now edit files in UTF-8 encoding. Up to 31 bit characters can be
+used, but only 16 bit characters are displayed. Up to two combining
+characters are supported, they overprint the preceding character.
+Double-wide characters are also supported. See |UTF-8|.
+
+UCS-2, UCS-4 and UTF-16 encodings are supported too, they are converted to
+UTF-8 internally. There is also support for editing Unicode files in a Latin1
+environment. Other encodings are converted with iconv() or an external
+converter specified with 'charconvert'.
+
+Many new items for Multi-byte support:
+- Added 'encoding' option: specifies character encoding used inside Vim. It
+ can be any 8-bit encoding, some double-byte encodings or Unicode.
+ It is initialized from the environment when a supported value is found.
+- Added 'fileencoding' and 'fileencodings': specify character coding in a
+ file, similar to 'fileformat' and 'fileformats'.
+ When 'encoding' is "utf-8" and 'fileencodings' is "utf-8,latin1" this will
+ automatically switch to latin1 if a file does not contain valid UTF-8.
+- Added 'bomb' option and detection of a BOM at the start of a file. Can be
+ used with "ucs-bom" in 'fileencodings' to automatically detect a Unicode
+ file if it starts with a BOM. Especially useful on MS-Windows (NT and
+ 2000), which uses ucs-2le files with a BOM (e.g., when exporting the
+ registry).
+- Added the 'termencoding' option: Specifies the encoding used for the
+ terminal. Useful to put Vim in utf-8 mode while in a non-Unicode locale: >
+ :let &termencoding = &encoding
+ :set encoding=utf-8
+- When 'viminfo' contains the 'c' flag, the viminfo file is converted from the
+ 'encoding' it was written with to the current 'encoding'.
+- Added ":scriptencoding" command: convert lines in a sourced script to
+ 'encoding'. Useful for menu files.
+- Added 'guifontwide' to specify a font for double-wide characters.
+- Added Korean support for character class detection. Also fix cls() in
+ search.c. (Chong-Dae Park)
+- Win32: Typing multibyte characters without IME. (Alexander Smishlajev)
+- Win32 with Mingw: compile with iconv library. (Ron Aaron)
+- Win32 with MSVC: dynamically load iconv.dll library. (Muraoka Taro)
+- Make it possible to build a version with multibyte and iconv support with
+ Borland 5.5. (Yasuhiro Matsumoto)
+- Added 'delcombine' option: Delete combining character separately. (Ron
+ Aaron)
+- The "xfontset" feature isn't required for "xim". These are now two
+ independent features.
+- XIM: enable XIM when typing a language character (Insert mode, Search
+ pattern, "f" or "r" command). Disable XIM when typing a Normal mode
+ command.
+- When the XIM is active, show "XIM" in the 'showmode' message. (Nam SungHyun)
+- Support "CursorIM" for XIM. (Nam SungHyun)
+- Added 'm' flag to 'formatoptions': When wrapping words, allow splitting at
+ each multibyte character, not only at a space.
+- Made ":syntax keyword" work with multibyte characters.
+- Added support for Unicode upper/lowercase flipping and comparing. (based on
+ patch by Raphael Finkel)
+ Let "~" on multibyte characters that have a third case ("title case")
+ switch between the three cases. (Raphael Finkel)
+
+Allow defining digraphs for multibyte characters.
+Added RFC1345 digraphs for Unicode.
+Most Normal mode commands that accept a character argument, like "r", "t" and
+"f" now accept a digraph. The 'D' flag in 'cpoptions' disables this to remain
+Vi compatible.
+
+Added Language mapping and 'keymap' to be able to type multibyte characters:
+- Added the ":lmap" command and friends: Define mappings that are used when
+ typing characters in the language of the text. Also for "r", "t", etc. In
+ Insert and Command-line mode CTRL-^ switches the use of the mappings on/off.
+ CTRL-^ also toggles the use of an input method when no language mappings are
+ present. Allows switching the IM back on halfway typing.
+- "<char-123>" argument to ":map", allows to specify the decimal, octal or
+ hexadecimal value of a character.
+- Implemented the 'keymap' option: Load a keymap file. Uses ":lnoremap" to
+ define mappings for the keymap. The new ":loadkeymap" command is used in
+ the keymap file.
+- Added 'k' flag in 'statusline': Value of "b:keymap_name" or 'keymap' when
+ it's being used. Uses "<lang>" when no keymap is loaded and ":lmap"s are
+ active. Show this text in the default statusline too.
+- Added the 'iminsert' and 'imsearch' options: Specify use of langmap mappings
+ and Input Method with an option. (Muraoka Taro)
+ Added 'imcmdline' option: When set the input method is always enabled when
+ starting to edit a command line. Useful for a XIM that uses dead keys to
+ type accented characters.
+ Added 'imactivatekey' option to better control XIM. (Muraoka Taro)
+- When typing a mapping that's not finished yet, display the last character
+ under the cursor in Insert mode and Command-line mode. Looks good for dead
+ characters.
+- Made the 'langmap' option recognize multibyte characters. But mapping only
+ works for 8-bit characters. Helps when using UTF-8.
+- Use a different cursor for when ":lmap" mappings are active. Can specify
+ two highlight groups for an item in 'guicursor'. By default "lCursor" and
+ "Cursor" are equal, the user must set a color he likes.
+ Use the cursor color for hangul input as well. (Sung-Hyun Nam)
+- Show "(lang)" for 'showmode' when language mapping is enabled.
+- UTF-8: Made "r" work with a ":lmap" that includes a composing character.
+ Also works for "f", which now works to find a character that includes a
+ composing character.
+
+Other multibyte character additions:
+- Support double-byte single-width characters for euc-jp: Characters starting
+ with 0x8E. Added ScreenLines2[] to store the second byte.
+
+
+Multi-language support *new-multi-lang*
+----------------------
+
+The messages used in Vim can be translated. Several translations are
+available. This uses the gettext mechanism. It allows adding a translation
+without recompiling Vim. |multi-lang| (partly by Marcin Dalecki)
+
+The translation files are in the src/po directory. The src/po/README.txt file
+explains a few things about doing a translation.
+
+Menu translations are available as well. This uses the new |:menutranslate|
+command. The translations are found in the runtime directory "lang". This
+allows a user to add a translation.
+
+Added |:language| command to set the language (locale) for messages, time and
+character type. This allows switching languages in Vim without changing the
+locale outside of Vim.
+
+Made it possible to have vimtutor use different languages. (Eduardo Fernandez)
+Spanish (Eduardo Fernandez), Italian (Antonio Colombo), Japanese (Yasuhiro
+Matsumoto) and French (Adrien Beau) translations are included.
+Added "vimtutor.bat": script to start Vim on a copy of the tutor file for
+MS-Windows. (Dan Sharp)
+
+- Added v:lang variable to be able to get current language setting.
+ (Marcin Dalecki) Also v:lc_time and v:ctype.
+- Make it possible to translate the dialogs used by the menus. Uses global
+ "menutrans_" variables. ":menutrans clear" deletes them.
+- removed "broken locale" (Marcin Dalecki).
+- Don't use color names in icons, use RGB values. The names could be
+ translated.
+- Win32: Added global IME support (Muraoka)
+- Win32: Added dynamic loading of IME support.
+- ":messages" prints a message about who maintains the messages or the
+ translations. Useful to find out where to make a remark about a wrong
+ translation.
+- --disable-nls argument for configure: Disable use of gettext(). (Sung-Hyun
+ Nam)
+- Added NLS support for Win32 with the MingW compiler. (Eduardo Fernandez)
+- When available, call bind_textdomain_codeset() to have gettext() translate
+ messages to 'encoding'. This requires GNU gettext 0.10.36 or later.
+- Added gettext support for Win32. This means messages will be translated
+ when the locale is set and libintl.dll can be found. (Muraoka Taro)
+ Also made it work with MingW compiler. (Eduardo Fernandez)
+ Detect the language and set $LANG to get the appropriate translated messages
+ (if supported). Also use $LANG to select a language, v:lang is a very
+ different kind of name.
+- Made gvimext.dll use translated messages, if possible. (Yasuhiro Matsumoto)
+
+
+Plugin support *new-plugins*
+--------------
+
+To make it really easy to load a Vim script when starting Vim, the "plugin"
+runtime directory can be used. All "*.vim" files in it will be automatically
+loaded. For Unix, the directory "~/.vim/plugin" is used by default. The
+'runtimepath' option can be set to look in other directories for plugins.
+|load-plugins| |add-plugin|
+
+The |:runtime| command has been added to load one or more files in
+'runtimepath'.
+
+Standard plugins:
+netrw.vim - Edit files over a network |new-network-files|
+gzip.vim - Edit compressed files
+explorer.vim - Browse directories |new-file-browser|
+
+Added support for local help files. |add-local-help|.
+When searching for help tags, all "doc/tags" files in 'runtimepath' are used.
+Added the ":helptags" command: Generate a tags file for a help directory.
+The first line of each help file is automagically added to the "LOCAL
+ADDITIONS" section in doc/help.txt.
+
+Added the <unique> argument to ":map": only add a mapping when it wasn't
+defined before.
+
+When displaying an option value with 'verbose' set will give a message about
+where the option was last set. Very useful to find out which script did set
+the value.
+
+The new |:scriptnames| command displays a list of all scripts that have been
+sourced.
+
+GUI: For Athena, Motif and GTK look for a toolbar bitmap in the "bitmaps"
+directories in 'runtimepath'. Allows adding your own bitmaps.
+
+
+Filetype plugins *new-filetype-plugins*
+-----------------
+
+A new group of files has been added to do settings for specific file types.
+These can be options and mappings which are specifically used for one value of
+'filetype'.
+
+The files are located in "$VIMRUNTIME/ftplugin". The 'runtimepath' option
+makes it possible to use several sets of plugins: Your own, system-wide,
+included in the Vim distribution, etc.
+
+To be able to make this work, several features were added:
+- Added the "s:" variables, local to a script. Avoids name conflicts with
+ global variables. They can be used in the script and in functions,
+ autocommands and user commands defined in the script. They are kept between
+ invocations of the same script. |s:var|
+- Added the global value for local options. This value is used when opening
+ a new buffer or editing another file. The option value specified in a
+ modeline or filetype setting is not carried over to another buffer.
+ ":set" sets both the local and the global value.
+ ":setlocal" sets the local option value only.
+ ":setglobal" sets or displays the global value for a local option.
+ ":setlocal name<" sets a local option to its global value.
+- Added the buffer-local value for some global options: 'equalprg', 'makeprg',
+ 'errorformat', 'grepprg', 'path', 'dictionary', 'thesaurus', 'tags',
+ 'include' and 'define'. This allows setting a local value for these global
+ options, without making it incompatible.
+- Added mappings and abbreviations local to a buffer: ":map <buffer>".
+- In a mapping "<Leader>" can be used to get the value of the "mapleader"
+ variable. This simplifies mappings that use "mapleader". "<Leader>"
+ defaults to "\". "<LocalLeader>" does the same with "maplocalleader". This
+ is to be used for mappings local to a buffer.
+- Added <SID> Script ID to define functions and mappings local to a script.
+- Added <script> argument to ":noremap" and ":noremenu": Only remap
+ script-local mappings. Avoids that mappings from other scripts get in the
+ way, but does allow using mappings defined in the script.
+- User commands can be local to a buffer: ":command -buffer".
+
+The new ":setfiletype" command is used in the filetype detection autocommands,
+to avoid that 'filetype' is set twice.
+
+
+File browser *new-file-browser*
+------------
+
+When editing a directory, the explorer plugin will list the files in the
+directory. Pressing <Enter> on a file name edits that file. Pressing <Enter>
+on a directory moves the browser to that directory.
+
+There are several other possibilities, such as opening a file in the preview
+window, renaming files and deleting files.
+
+
+Editing files over a network *new-network-files*
+----------------------------
+
+Files starting with scp://, rcp://, ftp:// and http:// are recognized as
+remote files. An attempt is made to access these files with the indicated
+method. For http:// only reading is possible, for the others writing is also
+supported. Uses the netrw.vim script as a standard "plugin". |netrw|
+
+Made "gf" work on a URL. It no longer assumes the file is local on the
+computer (mostly didn't work anyway, because the full path was required).
+Adjusted test2 for this.
+
+Allow using a URL in 'path'. Makes ":find index.html" work.
+
+GTK: Allow dropping a http:// and ftp:// URL on Vim. The netrw plugin takes
+care of downloading the file. (Mikael Berthe)
+
+
+Window for command-line editing *new-cmdwin*
+-------------------------------
+
+The Command-line window can be used to edit a command-line with Normal and
+Insert mode commands. When it is opened it contains the history. This allows
+copying parts of previous command lines. |cmdwin|
+
+The command-line window can be opened from the command-line with the key
+specified by the 'cedit' option (like Nvi). It can also be opened directly
+from Normal mode with "q:", "q/" and "q?".
+
+The 'cmdwinheight' is used to specify the initial height of the window.
+
+In Insert mode CTRL-X CTRL-V can be used to complete an Ex command line, like
+it's done on the command-line. This is also useful for writing Vim scripts!
+
+Additionally, there is "improved Ex mode". Entered when Vim is started as
+"exim" or "vim -E", and with the "gQ" command. Works like repeated use of
+":", with full command-line editing and completion. (Ulf Carlsson)
+
+
+Debugging mode *new-debug-mode*
+--------------
+
+In debugging mode sourced scripts and user functions can be executed line by
+line. There are commands to step over a command or step into it. |debug-mode|
+
+Breakpoints can be set to run until a certain line in a script or user
+function is executed. |:breakadd|
+
+Debugging can be started with ":debug {cmd}" to debug what happens when a
+command executes. The |-D| argument can be used to debug while starting up.
+
+
+Cursor in virtual position *new-virtedit*
+--------------------------
+
+Added the 'virtualedit' option: Allow positioning the cursor where there is no
+actual character in Insert mode, Visual mode or always. (Matthias Kramm)
+This is especially useful in Visual-block mode. It allows positioning a
+corner of the area where there is no text character. (Many improvements by
+Chase Tingley)
+
+
+Debugger interface *new-debug-itf*
+------------------
+
+This was originally made to work with Sun Visual Workshop. (Gordon Prieur)
+See |debugger.txt|, |sign.txt| and |workshop.txt|.
+
+Added the ":sign" command to define and place signs. They can be displayed
+with two ASCII characters or an icon. The line after it can be highlighted.
+Useful to display breakpoints and the current PC position.
+
+Added the :wsverb command to execute debugger commands.
+
+Added balloon stuff: 'balloondelay' and 'ballooneval' options.
+
+Added "icon=" argument for ":menu". Allows defining a specific icon for a
+ToolBar item.
+
+
+Communication between Vims *new-vim-server*
+--------------------------
+
+Added communication between two Vims. Makes it possible to send commands from
+one Vim to another. Works for X-Windows and MS-Windows |clientserver|.
+
+Use "--remote" to have files be edited in an already running Vim.
+Use "--remote-wait" to do the same and wait for the editing to finish.
+Use "--remote-send" to send commands from one Vim to another.
+Use "--remote-expr" to have an expression evaluated in another Vim.
+Use "--serverlist" to list the currently available Vim servers. (X only)
+There are also functions to communicate between the server and the client.
+|remote_send()| |remote_expr()|
+
+(X-windows version implemented by Flemming Madsen, MS-Windows version by Paul
+Moore)
+
+Added the command server name to the window title, so you can see which server
+name belongs to which Vim.
+
+Removed the OleVim directory and SendToVim.exe and EditWithVim.exe from the
+distribution. Can now use "gvim --remote" and "gvim --remote-send", which is
+portable.
+
+GTK+: Support running Vim inside another window. Uses the --socketid argument
+(Neil Bird)
+
+
+Buffer type options *new-buftype*
+-------------------
+
+The 'buftype' and 'bufhidden' options have been added. They can be set to
+have different kinds of buffers. For example:
+- 'buftype' = "quickfix": buffer with error list
+- 'buftype' = "nofile" and 'bufhidden' = "delete": scratch buffer that will be
+ deleted as soon as there is no window displaying it.
+
+'bufhidden' can be used to overrule the 'hidden' option for one buffer.
+
+In combination with 'buflisted' and 'swapfile' this offers the possibility to
+use various kinds of special buffers. See |special-buffers|.
+
+
+Printing *new-printing*
+--------
+
+Included first implementation of the ":hardcopy" command for printing
+to paper. For MS-Windows any installed printer can be used. For other
+systems a PostScript file is generated, which can be printed with the
+'printexpr' option.
+(MS-Windows part by Vince Negri, Vipin Aravind, PostScript by Vince Negri and
+Mike Williams)
+
+Made ":hardcopy" work with multibyte characters. (Muraoka Taro, Yasuhiro
+Matsumoto)
+
+Added options to tune the way printing works: (Vince Negri)
+- 'printoptions' defines various things.
+- 'printheader' specifies the header format. Added "N" field to 'statusline'
+ for the page number.
+- 'printfont' specifies the font name and attributes.
+- 'printdevice' defines the default printer for ":hardcopy!".
+
+
+Ports *ports-6*
+-----
+
+Port to OS/390 Unix (Ralf Schandl)
+- A lot of changes to handle EBCDIC encoding.
+- Changed Ctrl('x') to Ctrl_x define.
+
+Included jsbmouse support. (Darren Garth)
+Support for dec mouse in Unix. (Steve Wall)
+
+Port to 16-bit MS-Windows (Windows 3.1x) (Vince Negri)
+
+Port to QNX. Supports the Photon GUI, mouse, etc. (Julian Kinraid)
+
+Allow cross-compiling the Win32 version with Make_ming.mak. (Ron Aaron)
+Added Python support for compiling with Mingw. (Ron Aaron)
+
+Dos 32 bit: Added support the Windows clipboard. (David Kotchan)
+
+Win32: Dynamically load Perl and Python. Allows compiling Vim with these
+interfaces and will try to find the DLLs at runtime. (Muraoka Taro)
+
+Compiling the Win32 GUI with Cygwin. Also compile vimrun, dosinst and
+uninstall. (Gerfried)
+
+Mac: Make Vim compile with the free MPW compiler supplied by Apple. And
+updates for CodeWarrior. (Axel Kielhorn)
+
+Added typecasts and ifdefs as a start to make Vim work on Win64 (George
+Reilly)
+
+
+Quickfix extended *quickfix-6*
+-----------------
+
+Added the "error window". It contains all the errors of the current error
+list. Pressing <Enter> in a line makes Vim jump to that line (in another
+window). This makes it easy to navigate through the error list.
+|quickfix-window|.
+
+- |:copen| opens the quickfix window.
+- |:cclose| closes the quickfix window.
+- |:cwindow| takes care that there is a quickfix window only when there are
+ recognized errors. (Dan Sharp)
+
+- Quickfix also knows "info", next to "warning" and "error" types. "%I" can be
+ used for the start of a multi-line informational message. (Tony Leneis)
+- The "%p" argument can be used in 'errorformat' to get the column number from
+ a line where "^" points to the column. (Stefan Roemer)
+- When using "%f" in 'errorformat' on a DOS/Windows system, also include "c:"
+ in the filename, even when using "%f:".
+
+
+Operator modifiers *new-operator-mod*
+------------------
+
+Insert "v", "V" or CTRL-V between an operator and a motion command to force
+the operator to work characterwise, linewise or blockwise. |o_v|
+
+
+Search Path *new-search-path*
+-----------
+
+Vim can search in a directory tree not only in downwards but also upwards.
+Works for the 'path', 'cdpath' and 'tags' options. (Ralf Schandl)
+
+Also use "**" for 'tags' option. (Ralf Schandl)
+
+Added 'includeexpr', can be used to modify file name found by 'include'
+option.
+Also use 'includeexpr' for "gf" and "<cfile>" when the file can't be found
+without modification. Useful for doing "gf" on the name after an include or
+import statement.
+
+Added the 'cdpath' option: Locations to find a ":cd" argument. (Raf)
+
+Added the 'suffixesadd' option: Suffixes to be added to a file name when
+searching for a file for the "gf", "[I", etc. commands.
+
+
+Writing files improved *new-file-writing*
+----------------------
+
+Added the 'backupcopy' option: Select whether a file is to be copied or
+renamed to make a backup file. Useful on Unix to speed up writing an ordinary
+file. Useful on other systems to preserve file attributes and when editing a
+file on a Unix filesystem.
+
+Added the 'autowriteall' option. Works like 'autowrite' but for more
+commands.
+
+Added the 'backupskip' option: A list of file patterns to skip making a backup
+file when it matches. The default for Unix includes "/tmp/*", this makes
+"crontab -e" work.
+
+Added support for Access Control Lists (ACL) for FreeBSD and Win32. The ACL
+is copied from the original file to the new file (or the backup if it's
+copied).
+ACL is also supported for AIX, Solaris and generic POSIX. (Tomas Ogren)
+And on SGI.
+
+
+Argument list *new-argument-list*
+-------------
+
+The support for the argument list has been extended. It can now be
+manipulated to contain the files you want it to contain.
+
+The argument list can now be local to a window. It is created with the
+|:arglocal| command. The |:argglobal| command can be used to go back to the
+global argument list.
+
+The |:argdo| command executes a command on all files in the argument list.
+
+File names can be added to the argument list with |:argadd|. File names can
+be removed with |:argdelete|.
+
+"##" can be used like "#", it is replaced by all the names in the argument
+list concatenated. Useful for ":grep foo ##".
+
+The |:argedit| adds a file to the argument list and edits it. Like ":argadd"
+and then ":edit".
+
+
+Restore a View *new-View*
+--------------
+
+The ":mkview" command writes a Vim script with the settings and mappings for
+one window. When the created file is sourced, the view of the window is
+restored. It's like ":mksession" for one window.
+The View also contains the local argument list and manually created, opened
+and closed folds.
+
+Added the ":loadview" command and the 'viewdir' option: Allows for saving and
+restoring views of a file with simple commands. ":mkview 1" saves view 1 for
+the current file, ":loadview 1" loads it again. Also allows quickly switching
+between two views on one file. And saving and restoring manual folds and the
+folding state.
+
+Added 'viewoptions' to specify how ":mkview" works.
+
+":mksession" now also works fine with vertical splits. It has been further
+improved and restores the view of each window. It also works properly with
+preview and quickfix windows.
+
+'sessionoptions' is used for ":mkview" as well.
+Added "curdir" and "sesdir" to 'sessionoptions'. Allows selection of what
+the current directory will be restored to.
+
+The session file now also contains the argument list(s).
+
+
+Color schemes *new-color-schemes*
+-------------
+
+Support for loading a color scheme. Added the ":colorscheme" command.
+Automatically add menu entries for available schemes.
+Should now properly reset the colors when 'background' or 't_Co' is changed.
+":highlight clear" sets the default colors again.
+":syntax reset" sets the syntax highlight colors back to the defaults.
+For ":set bg&" guess the value. This allows a color scheme to switch back to
+the default colors.
+When syntax highlighting is switched on and a color scheme was defined, reload
+the color scheme to define the colors.
+
+
+Various new items *new-items-6*
+-----------------
+
+Normal mode commands: ~
+
+"gi" Jump to the ^ mark and start Insert mode. Also works when the
+ mark is just after the line. |gi|
+
+"g'm" and "g`m"
+ Jump to a mark without changing the jumplist. Now you can use
+ g`" to jump to the last known position in a file without side
+ effects. Also useful in mappings.
+
+[', [`, ]' and ]`
+ move the cursor to the next/previous lowercase mark.
+
+g_ Go to last non-blank in line. (Steve Wall)
+
+
+Options: ~
+
+'autoread' When detected that a file changed outside of Vim,
+ automatically read a buffer again when it's not changed.
+ It has a global and a local value. Use ":setlocal autoread<"
+ to go back to using the global value for 'autoread'.
+
+'debug' When set to "msg" it will print error messages that would
+ otherwise be omitted. Useful for debugging 'indentexpr' and
+ 'foldexpr'.
+
+'lispwords' List of words used for lisp indenting. It was previously hard
+ coded. Added a number of Lisp names to the default.
+
+'fold...' Many new options for folding.
+
+'modifiable' When off, it is impossible to make changes to a buffer.
+ The %m and %M items in 'statusline' show a '-'.
+
+'previewwindow' Set in the preview window. Used in a session file to mark a
+ window as the preview window.
+
+'printfont'
+'printexpr'
+'printheader'
+'printdevice'
+'printoptions' for ":hardcopy".
+
+'buflisted' Makes a buffer appear in the buffer list or not.
+
+Use "vim{version}:" for modelines, only to be executed when the version is
+>= {version}. Also "vim>{version}", "vim<{version}" and "vim={version}".
+
+
+Ex commands: ~
+
+:sav[eas][!] {file}
+ Works like ":w file" and ":e #", but without loading the file
+ again and avoiding other side effects. |:saveas|
+
+:silent[!] {cmd}
+ Execute a command silently. Also don't use a delay that would
+ come after the message. And don't do 'showmatch'.
+ RISCOS: Removed that "!~cmd" didn't output anything, and
+ didn't wait for <Enter> afterwards. Can use ":silent !cmd"
+ now.
+:menu <silent> Add a menu that won't echo Ex commands.
+:map <silent> Add a mapping that won't echo Ex commands.
+
+:checktime Check for changed buffers.
+
+:verbose {cmd} Set 'verbose' for one command.
+
+:echomsg {expr}
+:echoerr {expr} Like ":echo" but store the message in the history. (Mark
+ Waggoner)
+
+:grepadd Works just like ":grep" but adds to the current error list
+ instead of defining a new list. |:grepadd|
+
+:finish Finish sourcing a file. Can be used to skip the rest of a Vim
+ script. |:finish|
+
+:leftabove
+:aboveleft Split left/above current window.
+
+:rightbelow
+:belowright Split right/below current window.
+
+:first, :bfirst, :ptfirst, etc.
+ Alias for ":rewind". It's more logical compared to ":last".
+
+:enew Edit a new, unnamed buffer. This is needed, because ":edit"
+ re-edits the same file. (Wall)
+
+:quitall Same as ":qall".
+
+:match Define match highlighting local to a window. Allows
+ highlighting an item in the current window without interfering
+ with syntax highlighting.
+
+:menu enable
+:menu disable Commands to enable/disable menu entries without removing them.
+ (Monish Shah)
+
+:windo Execute a command in all windows.
+:bufdo Execute a command in all buffers.
+
+:wincmd Window (CTRL-W) command. Useful when a Normal mode command
+ can't be used (e.g., for a CursorHold autocommand). See
+ |CursorHold-example| for a nice application with it.
+
+:lcd and :lchdir
+ Set local directory for a window. (Benjie Chen)
+
+:hide {command}
+ Execute {command} with 'hidden' set.
+
+:emenu in Visual mode to execute a ":vmenu" entry.
+
+:popup Pop up a popup menu.
+
+:redraw Redraw the screen even when busy with a script or function.
+
+:hardcopy Print to paper.
+
+:compiler Load a Vim script to do settings for a specific compiler.
+
+:z# List numbered lines. (Bohdan Vlasyuk)
+
+
+New marks: ~
+
+'( and ') Begin or end of current sentence. Useful in Ex commands.
+'{ and '} Begin or end of current paragraph. Useful in Ex commands.
+'. Position of the last change in the current buffer.
+'^ Position where Insert mode was stopped.
+
+Store the ^ and . marks in the viminfo file. Makes it possible to jump to the
+last insert position or changed text.
+
+
+New functions: ~
+argidx() Current index in argument list.
+buflisted() Checks if the buffer exists and has 'buflisted' set.
+cindent() Get indent according to 'cindent'.
+eventhandler() Returns 1 when inside an event handler and interactive
+ commands can't be used.
+executable() Checks if a program or batch script can be executed.
+filewritable() Checks if a file can be written. (Ron Aaron)
+foldclosed() Find out if there is a closed fold. (Johannes Zellner).
+foldclosedend() Find the end of a closed fold.
+foldlevel() Find out the foldlevel. (Johannes Zellner)
+foreground() Move the GUI window to the foreground.
+getchar() Get one character from the user. Can be used to define a
+ mapping that takes an argument.
+getcharmod() Get last used key modifier.
+getbufvar() gets the value of an option or local variable in a buffer (Ron
+ Aaron)
+getfsize() Return the size of a file.
+getwinvar() gets the value of an option or local variable in a window (Ron
+ Aaron)
+globpath() Find matching files in a list of directories.
+hasmapto() Detect if a mapping to a string is already present.
+iconv() Convert a string from one encoding to another.
+indent() gets the indent of a line (Ron Aaron)
+inputdialog() Like input() but use a GUI dialog when possible. Currently
+ only works for Win32, Motif, Athena and GTK.
+ Use inputdialog() for the Edit/Settings/Text Width menu. Also
+ for the Help/Find.. and Toolbar FindHelp items.
+ (Win32 support by Thore B. Karlsen)
+ (Win16 support by Vince Negri)
+inputsecret() Ask the user to type a string without showing the typed keys.
+ (Charles Campbell)
+libcall() for Unix (Neil Bird, Johannes Zellner, Stephen Wall)
+libcallnr() for Win32 and Unix
+lispindent() Get indent according to 'lisp'.
+mode() Return a string that indicates the current mode.
+nextnonblank() Skip blank lines forwards.
+prevnonblank() Skip blank lines backwards. Useful to for indent scripts.
+resolve() MS-Windows: resolve a shortcut to the file it points to.
+ Unix: resolve a symbolic link.
+search() Search for a pattern.
+searchpair() Search for matching pair. Can be used in indent files to find
+ the "if" matching an endif.
+setbufvar() sets an option or variable local to a buffer (Ron Aaron)
+setwinvar() sets an option or variable local to a window (Ron Aaron)
+stridx() Search for first occurrence of one string in another.
+strridx() Search for last occurrence of one string in another.
+tolower() Convert string to all-lowercase.
+toupper() Convert string to all-uppercase.
+type() Check the type of an expression.
+wincol() window column of the cursor
+winwidth() Width of a window. (Johannes Zellner)
+winline() window line of the cursor
+
+
+Added expansion of curly braces in variable and function names. This can be
+used for variable names that include the value of an option. Or a primitive
+form of arrays. (Vince Negri)
+
+
+New autocommand events: ~
+BufWinEnter Triggered when a buffer is displayed in a window, after using
+ the modelines. Can be used to load a view.
+BufWinLeave Triggered when a buffer is no longer in a window. Also
+ triggered when exiting Vim. Can be used to save views.
+FileChangedRO Triggered before making the first change to a read-only file.
+ Can be used to check-out the file. (Scott Graham)
+TermResponse Triggered when the terminal replies to the version-request.
+ The v:termresponse internal variable holds the result. Can be
+ used to react to the version of the terminal. (Ronald Schild)
+FileReadCmd Triggered before reading a file.
+BufReadCmd Triggered before reading a file into a buffer.
+FileWriteCmd Triggered before writing a file.
+BufWriteCmd Triggered before writing a buffer into a file.
+FileAppendCmd Triggered before appending to a file.
+FuncUndefined Triggered when a user function is not defined. (Ron Aaron)
+
+The autocommands for the *Cmd events read or write the file instead of normal
+file read/write. Use this in netrw.vim to be able to edit files on a remote
+system. (Charles Campbell)
+
+
+New Syntax files: ~
+
+bdf BDF font definition (Nikolai Weibull)
+catalog SGML catalog (Johannes Zellner)
+debchangelog Debian Changelog (Wichert Akkerman)
+debcontrol Debian Control (Wichert Akkerman)
+dot dot (Markus Mottl)
+dsl DSSSL syntax (Johannes Zellner)
+eterm Eterm configuration (Nikolai Weibull)
+indent Indent profile (Nikolai Weibull)
+lftp LFTP (Nikolai Weibull)
+lynx Lynx config (Doug Kearns)
+mush mush sourcecode (Bek Oberin)
+natural Natural (Marko Leipert)
+pilrc Pal resource compiler (Brian Schau)
+plm PL/M (Philippe Coulonges)
+povini Povray configuration (David Necas)
+ratpoison Ratpoison config/command (Doug Kearns)
+readline readline config (Nikolai Weibull)
+screen Screen RC (Nikolai Weibull)
+specman Specman (Or Freund)
+sqlforms SQL*Forms (Austin Ziegler)
+terminfo terminfo (Nikolai Weibull)
+tidy Tidy configuration (Doug Kearns)
+wget Wget configuration (Doug Kearns)
+
+
+Updated many syntax files to work both with Vim 5.7 and 6.0.
+
+Interface to Ruby. (Shugo Maeda)
+Support dynamic loading of the Ruby interface on MS-Windows. (Muraoka Taro)
+Support this for Mingw too. (Benoit Cerrina)
+
+Win32: Added possibility to load TCL dynamically. (Muraoka Taro)
+Also for Borland 5.5. (Dan Sharp)
+
+Win32: When editing a file that is a shortcut (*.lnk file), edit the file it
+links to. Unless 'binary' is set, then edit the shortcut file itself.
+(Yasuhiro Matsumoto)
+
+The ":command" command now accepts a "-bar" argument. This allows the user
+command to be followed by "| command".
+
+The preview window is now also used by these commands:
+- |:pedit| edits the specified file in the preview window
+- |:psearch| searches for a word in included files, like |:ijump|, and
+ displays the found text in the preview window.
+Added the CTRL-W P command: go to preview window.
+
+MS-DOS and MS-Windows also read the system-wide vimrc file $VIM/vimrc. Mostly
+for NT systems with multiple users.
+
+A double-click of the mouse on a character that has a "%" match selects from
+that character to the match. Similar to "v%".
+
+"-S session.vim" argument: Source a script file when starting up. Convenient
+way to start Vim with a session file.
+
+Added "--cmd {command}" Vim argument to execute a command before a vimrc file
+is loaded. (Vince Negri)
+
+Added the "-M" Vim argument: reset 'modifiable' and 'write', thus disallow
+making changes and writing files.
+
+Added runtime/delmenu.vim. Source this to remove all menus and prepare for
+loading new menus. Useful when changing 'langmenu'.
+
+Perl script to filter Perl error messages to quickfix usable format. (Joerg
+Ziefle)
+
+Added runtime/macros/less.vim: Vim script to simulate less, but with syntax
+highlighting.
+
+MS-Windows install program: (Jon Merz)
+- The Win32 program can now create shortcuts on the desktop and install Vim in
+ the Start menu.
+- Possibly remove old "Edit with Vim" entries.
+- The Vim executable is never moved or $PATH changed. A small batch file is
+ created in a directory in $PATH. Fewer choices to be made.
+- Detect already installed Vim versions and offer to uninstall them first.
+
+Improved the MS-Windows uninstal program. It now also deletes the entries in
+the Start menu, icons from the desktop and the created batch files. (Jon Merz)
+Also made it possible to delete only some of these. Also unregister gvim for
+OLE.
+
+Generate a self-installing Vim package for MS-Windows. This uses NSIS. (Jon
+Merz et al.)
+
+Added ":filetype detect". Try detecting the filetype again. Helps when
+writing a new shell script, after adding "#!/bin/csh".
+
+Added ":augroup! name" to delete an autocommand group. Needed for the
+client-server "--remote-wait".
+
+Add the Vim version number to the viminfo file, useful for debugging.
+
+==============================================================================
+IMPROVEMENTS *improvements-6*
+
+Added the 'n' flag in 'cpoptions': When omitted text of wrapped lines is not
+put between line numbers from 'number' option. Makes it a lot easier to read
+wrapped lines.
+
+When there is a format error in a tags file, the byte position is reported so
+that the error can be located.
+
+"gf" works in Visual mode: Use the selected text as the file name. (Chase
+Tingley)
+
+Allow ambiguous mappings. Thus "aa" and "aaa" can both be mapped, the longest
+matching one is used. Especially useful for ":lmap" and 'keymap'.
+
+Encryption: Ask the key to be typed twice when crypting the first time.
+Otherwise a typo might cause the text to be lost forever. (Chase Tingley)
+
+The window title now has "VIM" on the end. The file name comes first, useful
+in the taskbar. A "+" is added when the file is modified. "=" is added for
+a read-only file. "-" is added for a file with 'modifiable' off.
+
+In Visual mode, mention the size of the selected area in the 'showcmd'
+position.
+
+Added the "b:changedtick" variable. Incremented at each change, also for
+undo. Can be used to take action only if the buffer has been changed.
+
+In the replacement string of a ":s" command "\=" can be used to replace with
+the result of an expression. From this expression the submatch() function can
+be used to access submatches.
+
+When doing ":qall" and there is a change in a buffer that is being edited in
+another window, jump to that window, instead of editing that buffer in the
+current window.
+
+Added the "++enc=" and "++ff=" arguments to file read/write commands to force
+using the given 'encoding' or 'fileformat'. And added the "v:cmdarg"
+variable, to be used for FileReadCmd autocommands that read/write the file
+themselves.
+
+When reading stdin, first read the text in binary mode and then re-read it
+with automatic selection of 'fileformat' and 'fileencoding'. This avoids
+problems with not being able to rewind the file (e.g., when a line near the
+end of the file ends in LF instead of CR-LF).
+When reading text from stdin and the buffer is empty, don't mark it changed.
+Allows exiting without trouble.
+
+Added an ID to many error messages. This will make it easier to find help for
+a message.
+
+Insert mode:
+- "CTRL-G j" and "CTRL-G k" can be used to insert in another line in the same
+ column. Useful for editing a table.
+- Added Thesaurus completion with CTRL-X CTRL-T. (Vince Negri)
+- Added the 'thesaurus' option, to use instead of 'dictionary' for thesaurus
+ completion. Added the 's' flag in 'complete'.
+- Made CTRL-X CTRL-L in Insert mode use the 'complete' option. It now also
+ scans other loaded buffers for matching lines.
+- CTRL-R now also works in Insert mode while doing completion with CTRL-X or
+ CTRL-N. (Neil Bird)
+- When doing Insert mode completion, when completion is finished check for a
+ match with words from 'cinkeys' or 'indentkeys'.
+
+Performance:
+- Made display updating more efficient. Insert/delete lines may be used for
+ all changes, also for undo/redo.
+- The display is not redrawn when there is typeahead in Insert mode. Speeds
+ up CTRL-R a lot.
+- Improved speed of screen output for 32 bit DOS version. (Vince Negri)
+- When dragging with the mouse, there is a lookahead to skip mouse codes when
+ there is another one next. Makes dragging with the mouse a lot faster.
+- Also a memory usage improvement: When calling u_save with a single line,
+ don't save it if the line was recently saved for the same undo already.
+- When using a script that appends one character at a time, the amount of
+ allocated memory was growing steadily. Also when 'undolevels' is -1.
+ Caused by the line saved for "U" never to be freed. Now free an undo block
+ when it becomes empty.
+- GUI and Dos32: Use a vertical scroll region, to make scrolling in a
+ vertically split window faster. No need to redraw the whole window.
+- When scrolling isn't possible with terminal codes (e.g., for a vertically
+ split window) redraw from ScreenLines[]. That should be faster than going
+ through the lines with win_line(), especially when using syntax
+ highlighting.
+- The Syntax menu is now pre-generated by a separate script. Makes loading
+ the menu 70% faster. This can halve the startup time of gvim.
+- When doing ":help tag", don't open help.txt first, jump directly to the help
+ tag. It's faster and avoids an extra message.
+- Win32: When a file name doesn't end in ".lnk" don't try resolving a
+ shortcut, it takes quite a bit of time.
+- Don't update the mouse pointer shape while there are typeahead characters.
+- Change META[] from a string into an array, avoids using strchr() on it.
+- Don't clear the command line when adding characters, avoids that screen_fill
+ is called but doesn't do anything.
+
+Robustness:
+- Unix: Check for running out of stack space when executing a regexp. Avoids
+ a nasty crash. Only works when the system supports running the signal
+ function on another stack.
+- Disallow ":source <dirname>". On unix it's possible to read a directory,
+ does not make sense to use it as Vim commands.
+
+Security:
+- When reading from or writing to a temporary file, check that it isn't a
+ symbolic link. Gives some protection against symlink attacks.
+- When creating a backup file copy or a swap file, check for it already
+ existing to avoid a symlink attack. (Colin Phipps)
+- Evaluating options which are an expression is done in a |sandbox|. If the
+ option was set by a modeline, it cannot cause damage.
+- Use a secure way to generate temp file names: Create a private directory for
+ temp files. Used for Unix, MS-DOS and OS/2.
+- 'makeef' can be empty, which means that an internally generated file name is
+ used. The old default was "/tmp/file", which is a security risk.
+ Writing 'makeef' in the current directory fails in a read-only directory and
+ causes trouble when using ":grep" on all files. Made the default empty for
+ all systems, so that a temp file is used.
+- The command from a tags file is executed in the sandbox for better security.
+- The Ruby, Tcl and Python interfaces cannot be used from the sandbox. They
+ might do dangerous things. Perl is still possible, but limited to the Safe
+ environment. (Donnie Smith)
+
+Syntax highlighting:
+- Optimized the speed by caching the state stack all over the file, not just
+ the part being displayed. Required for folding.
+- Added ":syntax sync fromstart": Always parse from the start of the file.
+- Added the "display" argument for syntax items: use the item only when
+ displaying the result. Can make parsing faster for text that isn't going to
+ be displayed.
+- When using CTRL-L, the cached states are deleted, to force parsing the text
+ again.
+- Use elfhash algorithm for table of keywords. This should give a better
+ distribution and speedup keyword lookup. (Campbell)
+- Also allow the "lc" leading context for skip and end patterns. (Scott
+ Bigham)
+- Syntax items can have the "extend" argument to undo the effect of a
+ "keepend" argument of an item it is contained in. Makes it possible to have
+ some contained items extend a region while others don't.
+- ":syntax clear" now deletes the b:current_syntax variable. That's logical,
+ since no syntax is defined after this command.
+- Added ":syntax enable": switch on syntax highlighting without changing the
+ colors. This allows specifying the colors in the .vimrc file without the
+ need for a mysyntaxfile.
+- Added ":syntax reset": reset the colors to their defaults.
+- Added the "contains=TOP" and "contains=CONTAINED" arguments. Makes it
+ possible to define a transparent item that doesn't contain itself.
+- Added a "containedin" argument to syntax items. Allows adding a contained
+ item to an existing item (e.g., to highlight a name in a comment).
+
+Modeless selection:
+- When in the command-line window, use modeless selection in the other
+ windows. Makes it possible to copy visible text to the command-line window.
+- Support modeless selection on the cmdline in a terminal. Previously it was
+ only possible for the GUI.
+- Make double-right-click in modeless selection select a whole word. Single
+ right click doesn't use the word selection started by a double-left-click.
+ Makes it work like in Visual mode.
+- The modeless selection no longer has an implied automatic copy to the
+ clipboard. It now obeys the 'a' and 'A' flags in 'guioptions' or
+ "autoselect" and "autoselectml" in 'clipboard'.
+- Added the CTRL-Y command in Cmdline-mode to copy the modeless selection to
+ the clipboard. Also works at the hit-enter prompt and the more prompt.
+ Removed the mappings in runtime/mswin.vim for CTRL-Y and CTRL-Z in
+ cmdline-mode to be able to use CTRL-Y in the new way.
+
+Reduced the amount of stack space used by regmatch() to allow it to handle
+complicated patterns on a longer text.
+
+'isfname' now includes '%' and '#'. Makes "vim dir\#file" work for MS-DOS.
+
+Added keypad special keys <kEnter>, <k0> - <k9>. When not mapped they behave
+like the ASCII equivalent. (Ivan Wellesz and Vince Negri)
+Recognize a few more xterm keys: <C-Right>, <C-Left>, <C-End>, <C-Home>
+
+Also trigger the BufUnload event when Vim is going to exit. Perhaps a script
+needs to do some cleaning up.
+
+Expand expression in backticks: `={expr}`. Can be used where backtick
+expansion is done. (Vince Negri)
+
+GUI:
+- Added 'L' and 'R' flags in 'guioptions': Add a left or right scrollbar only
+ when there is a vertically split window.
+- X11: When a color can't be allocated, use the nearest match from the
+ colormap. This avoids that black is used for many things. (Monish Shah)
+ Also do this for the menu and scrollbar, to avoid that they become black.
+- Win32 and X11: Added 'mouseshape' option: Adjust the mouse pointer shape to
+ the current mode. (Vince Negri)
+- Added the 'linespace' option: Insert a pixel line between lines. (Nam)
+- Allow modeless selection (without moving the cursor) by keeping CTRL and
+ SHIFT pressed. (Ivan Wellesz)
+- Motif: added toolbar. (Gordon Prieur) Also added tooltips.
+- Athena: added toolbar and tooltips. (David Harrison -- based on Gordon
+ Prieur's work)
+- Made the 'toolbar' option work for Athena and Motif. Can now switch between
+ text and icons on the fly. (David Harrison)
+- Support menu separator lines for Athena. (David Harrison)
+- Athena: Adjust the arrow pixmap used in a pullright menu to the size of the
+ font. (David Harrison)
+- Win32: Added "c" flag to 'guifont' to be able to specify the charset. (Artem
+ Khodush)
+- When no --enable-xim argument is given, automatically enable it when a X GUI
+ is used. Required for dead key support (and multibyte input).
+- After a file selection dialog, check that the edited files were not changed
+ or deleted. The Win32 dialog allows deleting and renaming files.
+- Motif and Athena: Added support for "editres". (Marcin Dalecki)
+- Motif and Athena: Added "menuFont" to be able to specify a font or fontset
+ for the menus. Can also be set with the "Menu" highlight group. Useful
+ when the locale is different from 'encoding'. (David Harrison)
+ When FONTSET_ALWAYS is defined, always use a fontset for the menus. Should
+ avoid trouble with changing from a font to a fontset. (David Harrison)
+- Highlighting and font for the tooltips can be specified with the "Tooltip"
+ highlight group. (David Harrison)
+- The Cmdline-mode menus can be used at the more-prompt. This mostly works
+ fine, because they start with a CTRL-C. The "Copy" menu works to copy the
+ modeless selection. Allows copying the output of ":set all" or ":intro"
+ without auto-selection.
+- When starting the GUI when there is no terminal connected to stdout and
+ stderr, display error messages in a dialog. Previously they wouldn't be
+ displayed at all.
+- Allow setting 'browsedir' to the name of a directory, to be used for the
+ file dialog. (Dan Sharp)
+- b:browsefilter and g:browsefilter can be set to the filters used for the
+ file dialog. Supported for Win32 and Motif GUI. (Dan Sharp)
+
+X11:
+- Support for the clipboard selection as register "+. When exiting or
+ suspending copy the selection to cut buffer 0. Should allow copy/paste with
+ more applications in a X11-standard way. (Neil Bird)
+- Use the X clipboard in any terminal, not just in an xterm.
+ Added "exclude:" in 'clipboard': Specify a pattern to match against terminal
+ names for which no connection should be made to the X server. The default
+ currently work for FreeBSD and Linux consoles.
+- Added a few messages for when 'verbose' is non-zero to show what happens
+ when trying to connect to the X server. Should help when trying to find out
+ why startup is slow.
+
+GTK GUI: (partly by Marcin Dalecki)
+- With some fonts the characters can be taller than ascent + descent. E.g.,
+ "-misc-fixed-*-*-*-*-18-*-*-*-*-*-iso10646-1". Add one to the character
+ cell height.
+- Implement "no" value for 'winaltkeys': don't use Alt-Key as a menu shortcut,
+ when 'wak' changed after creating the menus.
+- Setting 'wak' after the GUI started works.
+- recycle text GC's to reduce communication.
+- Adjust icon size to window manager.
+- Cleanup in font handling.
+- Replace XQueryColor with GDK calls.
+- Gnome support. Detects Gnome in configure and uses different widgets.
+ Otherwise it's much like GTK. (Andy Kahn)
+ It is disabled by default, because it causes a few problems.
+- Removed the special code to fork first and then start the GUI. Now use
+ _exit() instead of exit(), this works fine without special tricks.
+- Dialogs sometimes appeared a bit far away. Position the dialogs inside
+ the gvim window. (Brent Verner)
+- When dropping a file on Vim, remove extra slashes from the start of the
+ path. Also shorten the file name if possible.
+
+Motif: (Marcin Dalecki)
+- Made the dialog layout better.
+- Added find and find/replace dialogs.
+- For the menus, change "iso-8859" to "iso_8859", Linux appears to need this.
+- Added icon to dialogs, like for GTK.
+- Use XPM bitmaps for the icon when possible. Use the Solaris XpmP.h include
+ file when it's available.
+- Change the shadow of the toolbar items to get a visual feedback of it being
+ pressed on non-LessTif.
+- Use gadgets instead of windows for some items for speed.
+
+Command line completion:
+- Complete environment variable names. (Mike Steed)
+- For ":command", added a few completion methods: "mapping", "function",
+ "expression" and "environment".
+- When a function doesn't take arguments, let completion add () instead of (.
+
+For MS-DOS, MS-Windows and OS/2: Expand %VAR% environment variables like $VAR.
+(Walter Briscoe)
+
+Redirect messages to the clipboard ":redir @*" and to the unnamed register
+":redir @"". (Wall)
+
+":let @/ = ''" clears the search pattern, instead of setting it to an empty
+string.
+
+Expression evaluation:
+- "? :" can be used like in C.
+- col("$") returns the length of the cursor line plus one. (Stephen P. Wall)
+- Optional extra argument for match(), matchend() and matchstr(): Offset to
+ start looking for a match.
+- Made third argument to strpart() optional. (Paul Moore, Zdenek Sekera)
+- exists() can also be used to check for Ex commands and defined autocommands.
+- Added extra argument to input(): Default text.
+- Also set "v:errmsg" when using ":silent! cmd".
+- Added the v:prevcount variable: v:count for the previous command.
+- Added "v:progname", name with which Vim was started. (Vince Negri)
+- In the verbose message about returning from a function, also show the return
+ value.
+
+Cscope:
+- Added the cscope_connection() function. (Andy Kahn)
+- ":cscope kill -1" kills all cscope connections. (Andy Kahn)
+- Added the 'cscopepathcomp' option. (Scott Hauck)
+- Added ":scscope" command, split window and execute Cscope command. (Jason
+ Duell)
+
+VMS:
+- Command line arguments are always uppercase. Interpret a "-X" argument as
+ "-x" and "-/X" as "-X".
+- Set 'makeprg' and 'grepprg' to meaningful defaults. (Zoltan Arpadffy)
+- Use the X-clipboard feature and the X command server. (Zoltan Arpadffy)
+
+Macintosh: (Dany St-Amant)
+- Allow a tags file to have CR, CR-LF or LF line separator. (Axel Kielhorn)
+- Carbonized (while keeping non Carbon code)
+ (Some work "stolen" from Ammon Skidmore)
+- Improved the menu item index handling (should be faster)
+- Runtime commands now handle / in file name (MacOS 9 version)
+- Added ":winpos" support.
+- Support using "~" in file names for home directory.
+
+Options:
+- When using set += or ^= , check for items used twice. Duplicates are
+ removed. (Vince Negri)
+- When setting an option that is a list of flags, remove duplicate flags.
+- If possible, use getrlimit() to set 'maxmemtot' and 'maxmem'. (Pina)
+- Added "alpha" to 'nrformats': increment or decrement an alphabetic character
+ with CTRL-A and CTRL-X.
+- ":set opt&vi" sets an option to its Vi default, ":set opt&vim" to its Vim
+ default. Useful to set 'cpo' to its Vim default without knowing what flags
+ that includes.
+- 'scrolloff' now also applies to a long, wrapped line that doesn't fit in the
+ window.
+- Added more option settings to the default menus.
+- Updated the option window with new options. Made it a bit easier to read.
+
+Internal changes:
+- Split line pointers in text part and attributes part. Allows for future
+ change to make attribute more than one byte.
+- Provide a qsort() function for systems that don't have it.
+- Changed the big switch for Normal mode commands into a table. This cleans
+ up the code considerably and avoids trouble for some optimizing compilers.
+- Assigned a negative value to special keys, to avoid them being mixed up with
+ Unicode characters.
+- Global variables expand_context and expand_pattern were not supposed to be
+ global. Pass them to ExpandOne() and all functions called by it.
+- No longer use the global reg_ic flag. It caused trouble and in a few places
+ it was not set.
+- Removed the use of the stuff buffer for "*", "K", CTRL-], etc. Avoids
+ problem with autocommands.
+- Moved some code from ex_docmd.c to ex_cmds2.c. The file was getting too
+ big. Also moved some code from screen.c to move.c.
+- Don't include the CRC table for encryption, generate it. Saves quite a bit
+ of space in the source code. (Matthias Kramm)
+- Renamed multibyte.c to mbyte.c to avoid a problem with 8.3 filesystems.
+- Removed the GTK implementation of ":findhelp", it now uses the
+ ToolBar.FindHelp menu entry.
+- Renamed mch_windexit() to mch_exit(), mch_init() to mch_early_init() and
+ mch_shellinit() to mch_init().
+
+Highlighting:
+- In a ":highlight" listing, show "xxx" with the highlight color.
+- Added support for xterm with 88 or 256 colors. The right color numbers will
+ be used for the name used in a ":highlight" command. (Steve Wall)
+- Added "default" argument for ":highlight". When included, the command is
+ ignored if highlighting for the group was already defined.
+ All syntax files now use ":hi default ..." to allow the user to specify
+ colors in his vimrc file. Also, the "if did_xxx_syntax_inits" is not needed
+ anymore. This greatly simplifies using non-default colors for a specific
+ language.
+- Adjusted colortest.vim: Included colors on normal background and reduced the
+ size by using a while loop. (Rafael Garcia-Suarez)
+- Added the "DarkYellow" color name. Just to make the list of standard colors
+ consistent, it's not really a nice color to use.
+
+When an xterm is in 8-bit mode this is detected by the code returned for
+|t_RV|. All key codes are automatically converted to their 8-bit versions.
+
+The OPT_TCAP_QUERY in xterm patch level 141 and later is used to obtain the
+actual key codes used and the number of colors for t_Co. Only when |t_RV| is
+also used.
+
+":browse set" now also works in the console mode. ":browse edit" will give an
+error message.
+
+":bdelete" and ":bunload" only report the number of deleted/unloaded buffers
+when more than 'report'. The message was annoying when deleting a buffer in a
+script.
+
+Jump list:
+- The number of marks kept in the jumplist has been increased from 50 to 100.
+- The jumplist is now stored in the viminfo file. CTRL-O can be used to jump
+ to positions from a previous edit session.
+- When doing ":split" copy the jumplist to the new window.
+
+Also set the '[ and '] marks for the "~" and "r" commands. These marks are
+now always set when making a change with a Normal mode command.
+
+Python interface: Allow setting the width of a vertically split window. (John
+Cook)
+
+Added "=word" and "=~word" to 'cinkeys' (also used in 'indentkeys').
+
+Added "j1" argument in 'cinoptions': indent {} inside () for Java. (Johannes
+Zellner)
+Added the "l" flag in 'cinoptions'. (Anduin Withers)
+Added 'C', 'U', 'w' and 'm' flags to 'cinoptions'. (Servatius Brandt)
+
+When doing ":wall" or ":wqall" and a modified buffer doesn't have a name,
+mention its buffer number in the error message.
+
+":function Name" lists the function with line numbers. Makes it easier to
+find out where an error happened.
+
+In non-blockwise Visual mode, "r" replaces all selected characters with the
+typed one, like in blockwise Visual mode.
+
+When editing the last file in the argument list in any way, allow exiting.
+Previously this was only possible when getting to that file with ":next" or
+":last".
+
+Added the '1' flag to 'formatoptions'. (Vit Stradal)
+Added 'n' flag in 'formatoptions': format a numbered list.
+
+Swap file:
+- When a swap file already exists, and the user selects "Delete" at the
+ ATTENTION prompt, use the same ".swp" swapfile, to avoid creating a ".swo"
+ file which won't always be found.
+- When giving the ATTENTION message and the date of the file is newer than the
+ date of swap file, give a warning about this.
+- Made the info for an existing swap file a bit shorter, so that it still fits
+ on a 24 line screen.
+- It was possible to make a symlink with the name of a swap file, linking to a
+ file that doesn't exist. Vim would then silently use another file (if open
+ with O_EXCL refuses a symlink). Now check for a symlink to exist. Also do
+ another check for an existing swap file just before creating it to catch a
+ symlink attack.
+
+The g CTRL-G command also works in Visual mode and counts the number of words.
+(Chase Tingley)
+
+Give an error message when using 'shell' and it's empty.
+
+Added the possibility to include "%s" in 'shellpipe'.
+
+Added "uhex" value for 'display': show non-printable characters as <xx>.
+Show unprintable characters with NonText highlighting, also in the command
+line.
+
+When asked to display the value of a hidden option, tell it's not supported.
+
+Win32:
+- When dropping a shortcut on gvim (.lnk file) edit the target, not the
+ shortcut itself. (Yasuhiro Matsumoto)
+- Added C versions of the OpenWithVim and SendToVim programs. (Walter Briscoe)
+- When 'shell' is "cmd" or "cmd.exe", set 'shellredir' to redirect stderr too.
+ Also check for the Unix shell names.
+- When $HOMEDRIVE and $HOMEPATH are defined, use them to define $HOME. (Craig
+ Barkhouse)
+
+Win32 console version:
+- Includes the user and system name in the ":version" message, when available.
+ It generates a pathdef.c file for this. (Jon Miner)
+- Set the window icon to Vim's icon (only for Windows 2000). While executing
+ a shell command, modify the window title to show this. When exiting,
+ restore the cursor position too. (Craig Barkhouse)
+- The Win32 console version can be compiled with OLE support. It can only
+ function as a client, not as an OLE server.
+
+Errorformat:
+- Let "%p" in 'errorformat' (column of error indicated by a row of characters)
+ also accept a line of dots.
+- Added "%v" item in 'errorformat': Virtual column number. (Dan Sharp)
+- Added a default 'errorformat' value for VMS. (Jim Bush)
+
+The "p" command can now be used in Visual mode. It overwrites the selected
+text with the contents of a register.
+
+Highlight the <> items in the intro message to make clear they are special.
+
+When using the "c" flag for ":substitute", allow typing "l" for replacing this
+item and then stop: "last".
+
+When printing a verbose message about sourcing another file, print the line
+number.
+
+When resizing the Vim window, don't use 'equalalways'. Avoids that making the
+Vim window smaller makes split windows bigger. And it's what the docs say.
+
+When typing CTRL-D in Insert mode, just after an autoindent, then hitting CR
+kept the remaining white space. Now made it work like BS: delete the
+autoindent to avoid a blank non-empty line results.
+
+Added a GetHwnd() call to the OLE interface. (Vince Negri)
+
+Made ":normal" work in an event handler. Useful when dropping a file on Vim
+and for CursorHold autocommands.
+
+For the MS-Windows version, don't change to the directory of the file when a
+slash is used instead of a backslash. Explorer should always use a backslash,
+the user can use a slash when typing the command.
+
+Timestamps:
+- When a buffer was changed outside of Vim and regaining focus, give a dialog
+ to allow the user to reload the file. Now also for other GUIs than
+ MS-Windows. And also used in the console, when compiled with dialog
+ support.
+- Inspect the file contents to find out if it really changed, ignore
+ situations where only the time stamp changed (e.g., checking the file out
+ from CVS).
+- When checking the timestamp, first check if the file size changed, to avoid
+ a file compare then. Makes it quicker for large (log) files that are
+ appended to.
+- Don't give a warning for a changed or deleted file when 'buftype' is set.
+- No longer warn for a changed directory. This avoids that the file explorer
+ produces warnings.
+- Checking timestamps is only done for buffers that are not hidden. These
+ will be checked when they become unhidden.
+- When checking for a file being changed outside of Vim, also check if the
+ file permissions changed. When the file contents didn't change but the
+ permissions did, give a warning.
+- Avoid checking too often, otherwise the dialog keeps popping up for a log
+ file that steadily grows.
+
+Mapping <M-A> when 'encoding' is "latin1" and then setting 'encoding' to
+"utf-8" causes the first byte of a multibyte to be mapped. Can cause very
+hard to find problems. Disallow mapping part of a multibyte character.
+
+For ":python" and ":tcl" accept an in-line script. (Johannes Zellner)
+Also for ":ruby" and ":perl". (Benoit Cerrina)
+
+Made ":syn include" use 'runtimepath' when the file name is not a full path.
+
+When 'switchbuf' contains "split" and the current window is empty, don't split
+the window.
+
+Unix: Catch SIGPWR to preserve files when the power is about to go down.
+
+Sniff interface: (Anton Leherbauer)
+- fixed windows code, esp. the event handling stuff
+- adaptations for sniff 4.x ($SNIFF_DIR4)
+- support for adding sniff requests at runtime
+
+Support the notation <A-x> as an alias for <M-x>. This logical, since the Alt
+key is used.
+
+":find" accepts a count, which means that the count'th match in 'path' is
+used.
+
+":ls" and ":buffers" output shows modified/readonly/modifiable flag. When a
+buffer is active show "a" instead of nothing. When a buffer isn't loaded
+show nothing instead of "-".
+
+Unix install:
+- When installing the tools, set absolute paths in tools scripts efm_perl.pl
+ and mve.awk. Avoids that the user has to edit these files.
+- Install Icons for KDE when the directories exist and the icons do not exist
+ yet.
+
+Added has("win95"), to be able to distinguish between MS-Windows 95/98/ME and
+NT/2000/XP in a Vim script.
+
+When a ":cd" command was typed, echo the new current directory. (Dan Sharp)
+
+When using ":winpos" before the GUI window has been opened, remember the
+values until it is opened.
+
+In the ":version" output, add "/dyn" for features that are dynamically loaded.
+This indicates the feature may not always work.
+
+On Windows NT it is possible that a directory is read-only, but a file can be
+deleted. When making a backup by renaming the file and 'backupdir' doesn't
+use the current directory, this causes the original file to be deleted,
+without the possibility to create a new file. Give an extra error message
+then to warn to user about this.
+
+Made CTRL-R CTRL-O at the command line work like CTRL-R CTRL-R, so that it's
+consistent with Insert mode.
+
+==============================================================================
+COMPILE TIME CHANGES *compile-changes-6*
+
+All generated files have been moved out of the "src" directory. This makes it
+easy to see which files are not edited by hand. The files generated by
+configure are now in the "src/auto" directory. For Unix, compiled object
+files go in the objects directory.
+
+The source archive was over the 1.4M floppy limit. The archives are now split
+up into two runtime and two source archives. Also provide a bzip2 compressed
+archive that contains all the sources and runtime files.
+
+Added "reconfig" as a target for make. Useful when changing some of the
+arguments that require flushing the cache, such as switching from GTK to
+Motif. Adjusted the meaning of GUI_INC_LOC and GUI_LIB_LOC to be consistent
+over different GUIs.
+
+Added src/README.txt to give an overview of the main parts of the source code.
+
+The Unix Makefile now fully supports using $(DESTDIR) to install to a specific
+location. Replaces the manual setting of *ENDLOC variables.
+
+Added the possibility for a maintainer of a binary version to include his
+e-mail address with the --with-compiledby configure argument.
+
+Included features are now grouped in "tiny", "small", "normal", "big" and
+"huge". This replaces "min-features" and "max-features". Using "tiny"
+disables multiple windows for a really small Vim.
+
+For the tiny version or when FEAT_WINDOWS is not defined: Firstwin and lastwin
+are equal to curwin and don't use w_next and w_prev.
+
+Added the +listcmds feature. Can be used to compile without the Vim commands
+that manipulate the buffer list and argument list (the buffer list itself is
+still there, can't do without it).
+
+Added the +vreplace feature. It is disabled in the "small" version to avoid
+that the 16 bit DOS version runs out of memory.
+
+Removed GTK+ support for versions older than 1.1.16.
+
+The configure checks for using PTYs have been improved. Code taken from a
+recent version of screen.
+
+Added configure options to install Vim, Ex and View under another name (e.g.,
+vim6, ex6 and view6).
+
+Added "--with-global-runtime" configure argument. Allows specifying the
+global directory used in the 'runtimepath' default.
+
+Made enabling the SNiFF+ interface possible with a configure argument.
+
+Configure now always checks /usr/local/lib for libraries and
+/usr/local/include for include files. Helps finding the stuff for iconv() and
+gettext().
+
+Moved the command line history stuff into the +cmdline_hist feature, to
+exclude the command line history from the tiny version.
+
+MS-Windows: Moved common functions from Win16 and Win32 to os_mswin.c. Avoids
+having to change two files for one problem. (Vince Negri)
+
+Moved common code from gui_w16.c and gui_w32.c to gui_w48.c (Vince Negri)
+
+The jumplist is now a separate feature. It is disabled for the "small"
+version (16 bit MS-DOS).
+
+Renamed all types ending in _t to end in _T. Avoids potential problems with
+system types.
+
+Added a configure check for X11 header files that implicitly define the return
+type to int. (Steve Wall)
+
+"make doslang" in the top directory makes an archive with the menu and .mo
+files for Windows. This uses the files generated on Unix, these should work
+on MS-Windows as well.
+
+Merged a large part of os_vms.c with os_unix.c. The code was duplicated in
+the past which made maintenance more work. (Zoltan Arpadffy)
+
+Updated the Borland C version 5 Makefile: (Dan Sharp)
+- Fixed the Perl build
+- Added python and tcl builds
+- Added dynamic perl and dynamic python builds
+- Added uninstal.exe build
+- Use "yes" and "no" for the options, like in Make_mvc.mak.
+
+Win32: Merged Make_gvc.mak and Make_ovc.mak into one file: Make_ivc.mak. It's
+much smaller, many unnecessary text has been removed. (Walter Briscoe)
+Added Make_dvc.mak to be able to debug exe generated with Make_mvc.mak in
+MS-Devstudio. (Walter Briscoe)
+
+MS-Windows: The big gvim.exe, which includes OLE, now also includes
+dynamically loaded Tcl, Perl and Python. This uses ActivePerl 5.6.1,
+ActivePython 2.1.1 and ActiveTCL 8.3.3
+
+Added AC_EXEEXT to configure.in, to check if the executable needs ".exe" for
+Cygwin or MingW. Renamed SUFFIX to EXEEXT in Makefile.
+
+Win32: Load comdlg32.dll delayed for faster startup. Only when using VC 6.
+(Vipin Aravind)
+
+Win32: When compiling with Borland, allow using IME. (Yasuhiro Matsumoto)
+
+Win32: Added Makefile for Borland 5 to compile gvimext.dll. (Yasuhiro
+Matsumoto)
+
+==============================================================================
+BUG FIXES *bug-fixes-6*
+
+When checking the command name for "gvim", "ex", etc. ignore case. Required
+for systems where case is ignored in command names.
+
+Search pattern "[a-c-e]" also matched a 'd' and didn't match a '-'.
+
+When double-clicking in another window, wasn't recognized as double click,
+because topline is different. Added set_mouse_topline().
+
+The BROKEN_LOCALE check was broken. (Marcin Dalecki)
+
+When "t_Co" is set, the default colors remain the same, thus wrong. Reset the
+colors after changing "t_Co". (Steve Wall)
+
+When exiting with ":wqall" the messages about writing files could overwrite
+each other and be lost forever.
+
+When starting Vim with an extremely long file name (around 1024 characters) it
+would crash. Added a few checks to avoid buffer overflows.
+
+CTRL-E could get stuck in a file with very long lines.
+
+":au syntax<Tab>" expanded event names while it should expand groups starting
+with "syntax".
+
+When expanding a file name caused an error (e.g., for <amatch>) it was
+produced even when inside an "if 0".
+
+'cindent' formatted C comments differently from what the 'comments' option
+specified. (Steve Wall)
+
+Default for 'grepprg' didn't include the file name when only grepping in one
+file. Now /dev/null has been added for Unix.
+
+Opening the option window twice caused trouble. Now the cursor goes to the
+existing option window.
+
+":sview" and ":view" didn't set 'readonly' for an existing buffer. Now do set
+'readonly', unless the buffer is also edited in another window.
+
+GTK GUI: When 'guioptions' excluded 'g', the more prompt caused the toolbar
+and menubar to disappear and resize the window (which clears the text).
+Now always grey-out the toplevel menus to avoid that the menubar changes size
+or disappears.
+
+When re-using the current buffer for a new buffer, buffer-local variables were
+not deleted.
+
+GUI: when 'scrolloff' is 0 dragging the mouse above the window didn't cause a
+down scroll. Now pass on a mouse event with mouse_row set to -1.
+
+Win32: Console version didn't work on telnet, because of switching between two
+console screens. Now use one console screen and save/restore the contents
+when needed. (Craig Barkhouse)
+
+When reading a file the magic number for encryption was included in the file
+length. (Antonio Colombo)
+
+The quickfix window contained leading whitespace and NULs for multi-line
+messages. (David Harrison)
+
+When using cscope, redundant tags were removed. This caused a numbering
+problem, because they were all listed. Don't remove redundant cscope tags.
+(David Bustos).
+
+Cscope: Test for which matches are in the current buffer sometimes failed,
+causing a jump to another match than selected. (David Bustos)
+
+Win32: Buffer overflow when adding a charset name in a font.
+
+'titlestring' and 'iconstring' were evaluating an expression in the current
+context, which could be a user function, which is a problem for local
+variables vs global variables.
+
+Win32 GUI: Mapping <M-F> didn't work. Now handle SHIFT and CTRL in
+_OnSysChar().
+
+Win32 GUI: (on no file), :vs<CR>:q<CR> left a trail of pixels down the middle.
+Could also happen for the ruler. screen_puts() didn't clear the right char in
+ScreenLines[] for the bold trick.
+
+Win32: ":%!sort|uniq" didn't work, because the input file name touches the
+"|". Insert a space before the "|".
+
+OS/2: Expanding wildcards included non-existing files. Caused ":runtime" to
+fail, which caused syntax highlighting to fail.
+
+Pasting a register containing CTRL-R on the command line could cause an
+endless loop that can't be interrupted. Now it can be stopped with CTRL-C.
+
+When 'verbose' is set, a message for file read/write could overwrite the
+previous message.
+When 'verbose' is set, the header from ":select" was put after the last
+message. Now start a new line.
+
+The hit-enter prompt reacted to the response of the t_RV string, causing
+messages at startup to disappear.
+
+When t_Co was set to 1, colors were still used. Now only use color when t_Co
+> 1.
+
+Listing functions with ":function" didn't quit when 'q' or ':' was typed at
+the more prompt.
+
+Use mkstemp() instead of mktemp() when it's available, avoids a warning for
+linking on FreeBSD.
+
+When doing Insert mode completion it's possible that b_sfname is NULL. Don't
+give it to printf() for the "Scanning" message.
+
+":set runtimepath-=$VIMRUNTIME" didn't work, because expansion of wildcards
+was done after trying to remove the string. Now for ":set opt+=val" and ":set
+opt-=val" the expansion of wildcards is done before adding or removing "val".
+
+Using CTRL-V with the "r" command with a blockwise Visual selection inserted a
+CTRL-V instead of getting a special character.
+
+Unix: Changed the order of libraries: Put -lXdmcp after -lX11 and -lSM -lICE
+after -lXdmcp. Should fix link problem on HP-UX 10.20.
+
+Don't remove the last "-lm" from the link line. Vim may link but fail later
+when the GUI starts.
+
+When the shell returns with an error when trying to expand wildcards, do
+include the pattern when the "EW_NOTFOUND" flag was set.
+When expanding wildcards with the shell fails, give a clear error message
+instead of just "1 returned".
+
+Selecting a Visual block, with the start partly on a Tab, deleting it leaves
+the cursor too far to the left. Causes "s" to work in the wrong position.
+
+Pound sign in normal.c caused trouble on some compilers. Use 0xA3 instead.
+
+Warning for changing a read-only file wasn't given when 'insertmode' was set.
+
+Win32: When 'shellxquote' is set to a double quote (e.g., using csh), ":!start
+notepad file" doesn't work. Remove the double quotes added by 'shellxquote'
+when using ":!start". (Pavol Juhas)
+
+The "<f-args>" argument of ":command" didn't accept Tabs for white space.
+Also, don't add an empty argument when there are trailing blanks.
+
+":e test\\je" edited "test\je", but ":next test\\je" edited "testje".
+Backslashes were removed one time too many for ":next".
+
+VMS: "gf" didn't work properly. Use vms_fixfilename() to translate the file
+name. (Zoltan Arpadffy)
+
+After ":hi Normal ctermbg=black ctermfg=white" and suspending Vim not all
+characters are redrawn with the right background.
+
+When doing "make test" without +eval or +windows feature, many tests failed.
+Now have test1 generate a script to copy the correct output, so that a test
+that doesn't work is skipped.
+
+On FreeBSD the Perl interface added "-lc" to the link command and Python added
+"-pthread". These two don't work together, because the libc_r library should
+be used. Removed "-lc" from Perl, it should not be needed.
+Also: Add "-pthread" to $LIBS, so that the checks for functions is done with
+libc_r. Sigaltstack() appears to be missing from libc_r.
+
+The Syntax sub-menus were getting too long, reorganized them and added another
+level for some languages.
+
+Visual block "r"eplace didn't work well when a Tab is partly included.
+(Matthias Kramm)
+
+When yanking a Visual block, where some lines end halfway the block, putting
+the text somewhere else doesn't insert a block. Padd with spaces for missing
+characters. Added "y_width" to struct yankreg. (Matthias Kramm)
+
+If a substitute string has a multibyte character after a backslash only the
+first byte of it was skipped. (Muraoka Taro)
+
+Win32: Numeric keypad keys were missing from the builtin termcap entry.
+
+When a file was read-only ":wa!" didn't force it to be written. (Vince Negri)
+
+Amiga: A file name starting with a colon was considered absolute but it isn't.
+Amiga: ":pwd" added a slash when in the root of a drive.
+
+Don't let 'ttymouse' default to "dec" when compiled with dec mouse support.
+It breaks the gpm mouse (Linux console).
+
+The prototypes for the Perl interface didn't work for threaded Perl. Added a
+sed command to remove the prototypes from proto/if_perl.pro and added them
+manually to if_perl.xs.
+
+When ":w!" resets the 'readonly' option the title and status lines were not
+updated.
+
+":args" showed the current file when the argument list was empty. Made this
+work like Vi: display nothing.
+
+"99:<C-U>echo v:count" echoed "99" in Normal mode, but 0 in Visual mode.
+Don't set v:count when executing a stuffed command.
+
+Amiga: Got a requester for "home:" because it's in the default runtime path.
+Don't bring up a requester when searching for a file in 'path', sourcing the
+.vimrc file or using ":runtime".
+
+Win16 and Win32: Considered a file "\path\file" absolute. Can cause the same
+file to appear as two different buffers.
+
+Win32: Renaming a file to an empty string crashed Vim. Happened when using
+explorer.vim and hitting ESC at the rename prompt.
+
+Win32: strftime() crashed when called with a "-1" value for the time.
+
+Win32 with Borland compiler: mch_FullName() didn't work, caused tag file not
+to be found.
+
+Cscope sometimes jumped to the wrong tag. (David Bustos)
+
+OS/2: Could not find the tags file. mch_expand_wildcards() added another
+slash to a directory name.
+
+When using ">>" the `] mark was not in the last column.
+
+When Vim was compiled without menu support, filetype.vim was still trying to
+source the menu.vim script. (Rafael Garcia-Suarez)
+
+":ptag" added an item to the tag stack.
+
+Win32 IME: "gr" didn't use IME mode.
+
+In the "vim --help" message the term "options" was used for arguments. That's
+confusing, call them "arguments".
+
+When there are two windows, and a BufUnload autocommand for closing window #1
+closed window #2, Vim would crash.
+
+When there is a preview window and only one other window, ":q" wouldn't exit.
+
+In Insert mode, when cancelling a digraph with ESC, the '?' wasn't removed.
+
+On Unix glob(".*") returned "." and "..", on Windows it didn't. On Windows
+glob("*") also returned files starting with a dot. Made this work like Unix
+on all systems.
+
+Win32: Removed old code to open a console. Vimrun is now used and works fine.
+
+Compute the room needed by the intro message accurately, so that it also fits
+on a 25 line console. (Craig Barkhouse)
+
+":ptnext" was broken. Now remember the last tag used in the preview window
+separately from the tagstack.
+
+Didn't check for "-display" being the last argument. (Wichert Akkerman)
+
+GTK GUI: When starting "gvim" under some conditions there would be an X error.
+Don't replace the error handler when creating the xterm clipboard. (Wichert
+Akkerman)
+
+Adding a space after a help tag caused the tag not to be found. E.g., ":he
+autoindent ".
+
+Was trying to expand a URL into a full path name. On Windows this resulted in
+the current directory to be prepended to the URL. Added vim_isAbsName() and
+vim_FullName() to avoid that various machine specific functions do it
+differently.
+
+":n *.c" ":cd .." ":n" didn't use the original directory of the file. Vi only
+does it for the current file (looks like a bug). Now remember the buffer used
+for the entry in the argument list and use its name (adjusted when doing
+":cd"), unless it's deleted.
+
+When inserting a special key as its name ("<F8>" as four characters) after
+moving around in Insert mode, undo didn't work properly.
+
+Motif GUI: When using the right mouse button, for some people gvim froze for
+a couple of seconds (Motif 1.2?). This doesn't happen when there is no Popup
+menu. Solved by only creating a popup menu when 'mousemodel' is "popup" or
+"popup_setpos". (David Harrison)
+
+Motif: When adding many menu items, the "Help" menu disappeared but the
+menubar didn't wrap. Now manually set the menubar height.
+
+When using <BS> in Insert mode to remove a line break, or using "J" to join
+lines, the cursor could end up halfway a multibyte character. (Muraoka Taro)
+
+Removed defining SVR4 in configure. It causes problems for some X header
+files and doesn't appear to be used anywhere.
+
+When 'wildignore' is used, 'ignorecase' for a tag match was not working.
+
+When 'wildignore' contains "*~" it was impossible to edit a file ending in a
+"~". Now don't recognize a file ending in "~" as containing wildcards.
+
+Disabled the mouse code for OS/2. It was not really used.
+
+":mksession" always used the full path name for a buffer, also when the short
+name could be used.
+":mkvimrc" and ":mksession" didn't save 'wildchar' and 'pastetoggle' in such a
+way that they would be restored. Now use the key name if possible, this is
+portable.
+
+After recovering a file and abandoning it, an ":edit" command didn't give the
+ATTENTION prompt again. Would be useful to be able to delete the file in an
+easy way. Reset the BF_RECOVERED flag when unloading the buffer.
+
+histdel() could match or ignore case, depending on what happened before it.
+Now always match case.
+
+When a window size was specified when splitting a window, it would still get
+the size from 'winheight' or 'winwidth' if it's larger.
+
+When using "append" or "insert" inside a function definition, a line starting
+with "function" or "endfunction" caused confusion. Now recognize the commands
+and skip lines until a ".".
+
+At the end of any function or sourced file need_wait_return could be reset,
+causing messages to disappear when redrawing.
+
+When in a while loop the line number for error messages stayed fixed. Now the
+line number is remembered in the while loop.
+
+"cd c:/" didn't work on MS-DOS. mch_isdir() removed a trailing slash.
+
+MS-Windows: getftime() didn't work when a directory had a trailing slash or
+backslash. Didn't show the time in the explorer because of this.
+
+When doing wildcard completion, a directory "a/" sorted after "a-b". Now
+recognize path separators when sorting files.
+
+Non-Unix systems: When editing "c:/dir/../file" and "c:/file" they were
+created as different buffers, although it's the same file. Expand to a full
+file name also when an absolute name contains "..".
+
+"g&" didn't repeat the last substitute properly.
+
+When 'clipboard' was set to "unnamed", a "Y" command would not write to "0.
+Now make a copy of register 0 to the clipboard register.
+
+When the search pattern matches in many ways, it could not always be
+interrupted with a CTRL-C. And CTRL-C would have to be hit once for every
+line when 'hlsearch' is on.
+When 'incsearch' is on and interrupting the search for a match, don't abandon
+the command line.
+
+When turning a directory name into a full path, e.g., with fnamemodify(),
+sometimes a slash was added. Make this consistent: Don't add a slash.
+
+When a file name contains a "!", using it in a shell command will cause
+trouble: ":!cat %". Escape the "!" to avoid that. Escape it another time
+when 'shell' contains "sh".
+
+Completing a file name that has a tail that starts with a "~" didn't work:
+":e view/~<Tab>".
+
+Using a ":command" argument that contains < and > but not for a special
+argument was not skipped properly.
+
+The DOS install program: On Win2000 the check for a vim.exe or gvim.exe in
+$PATH didn't work, it always found it in the current directory.
+Rename the vim.exe in the current dir to avoid this. (Walter Briscoe)
+
+In the MS-DOS/Windows install program, use %VIM% instead of an absolute path,
+so that moving Vim requires only one change in the batch file.
+
+Mac: mch_FullName() changed the "fname" argument and didn't always initialize
+the buffer.
+
+MS-DOS: mch_FullName() didn't fix forward/backward slashes in an absolute file
+name.
+
+"echo expand("%:p:h")" with an empty file name removed one directory name on
+MS-DOS. For Unix, when the file name is a directory, the directory name was
+removed. Now make it consistent: "%:p" adds a path separator for all systems,
+but no path separator is added in other situations.
+
+Unix: When checking for a CTRL-C (could happen any time) and there is an X
+event (e.g., clipboard updated) and there is typeahead, Vim would hang until a
+character was typed.
+
+MS-DOS, MS-Windows and Amiga: expanding "$ENV/foo" when $ENV ends in a colon,
+had the slash removed.
+
+":he \^=" gave an error for using \_. ":he ^=" didn't find tag :set^=. Even
+"he :set^=" didn't find it.
+
+A tags file name "D:/tags" was used as file "tags" in "D:". That doesn't work
+when the current path for D: isn't the root of the drive.
+
+Removed calls to XtInitializeWidgetClass(), they shouldn't be necessary.
+
+When using a dtterm or various other color terminals, and the Normal group has
+been set to use a different background color, the background wouldn't always
+be displayed with that color. Added check for "ut" termcap entry: If it's
+missing, clearing the screen won't give us the current background color. Need
+to draw each character instead. Vim now also works when the "cl" (clear
+screen) termcap entry is missing.
+
+When repeating a "/" search command with a line offset, the "n" did use the
+offset but didn't make the motion linewise. Made "d/pat/+2" and "dn" do the
+same.
+
+Win32: Trying to use ":tearoff" for a menu that doesn't exist caused a crash.
+
+OpenPTY() didn't work on Sequent. Add a configure check for getpseudotty().
+
+C-indenting: Indented a line starting with ")" with the matching "(", but not
+a line starting with "x)" looks strange. Also compute the indent for aligning
+with items inside the () and use the lowest indent.
+
+MS-DOS and Windows: ":n *.vim" also matched files ending in "~".
+Moved mch_expandpath() from os_win16.c and os_msdos.c to misc1.c, they are
+equal.
+
+Macintosh: (Dany St-Amant)
+- In Vi-compatible mode didn't read files with CR line separators.
+- Fixed a bug in the handling of Activate/Deactivate Event
+- Fixed a bug in gui_mch_dialog (using wrong pointer)
+
+Multibyte GDK XIM: While composing a multibyte-word, if user presses a
+mouse button, then the word is removed. It should remain and composing end.
+(Sung-Hyun Nam)
+
+MS-DOS, MS-Windows and OS/2: When reading from stdin, automatic CR-LF
+conversion by the C library got in the way of detecting a "dos" 'fileformat'.
+
+When 'smartcase' is set, patterns with "\S" would also make 'ignorecase'
+reset.
+
+When clicking the mouse in a column larger than 222, it moved to the first
+column. Can't encode a larger number in a character. Now limit the number to
+222, don't jump back to the first column.
+
+GUI: In some versions CSI would cause trouble, either when typed directly or
+when part of a multibyte sequence.
+
+When using multibyte characters in a ":normal" command, a trailing byte that
+is CSI or K_SPECIAL caused problems.
+
+Wildmenu didn't handle multibyte characters.
+
+":sleep 10" could not be interrupted on Windows, while "gs" could. Made them
+both work the same.
+
+Unix: When waiting for a character is interrupted by an X-windows event (e.g.,
+to obtain the contents of the selection), the wait time would not be honored.
+A message could be overwritten quickly. Now compute the remaining waiting
+time.
+
+Windows: Completing "\\share\c$\S" inserted a backslash before the $ and then
+the name is invalid. Don't insert the backslash.
+
+When doing an auto-write before ":make", IObuff was overwritten and the wrong
+text displayed later.
+
+On the Mac the directories "c:/tmp" and "c:/temp" were used in the defaults
+for 'backupdir' and 'directory', they don't exist.
+
+The check for a new file not to be on an MS-DOS filesystem created the file
+temporarily, which can be slow. Don't do this if there is another check for
+the swap file being on an MS-DOS filesystem.
+
+Don't give the "Changing a readonly file" warning when reading from stdin.
+
+When using the "Save As" menu entry and not entering a file name, would get an
+error message for the trailing ":edit #". Now only do that when the
+alternate file name was changed.
+
+When Vim owns the X11 selection and is being suspended, an application that
+tries to use the selection hangs. When Vim continues it could no longer
+obtain the selection. Now give up the selection when suspending.
+
+option.h and globals.h were included in some files, while they were already
+included in vim.h. Moved the definition of EXTERN to vim.h to avoid doing it
+twice.
+
+When repeating an operator that used a search pattern and the search pattern
+contained characters that have a special meaning on the cmdline (e.g., CTRL-U)
+it didn't work.
+
+Fixed various problems with using K_SPECIAL (0x80) and CSI (0x9b) as a byte in
+a (multibyte) character. For example, the "r" command could not be repeated.
+
+The DOS/Windows install program didn't always work from a directory with a
+long filename, because $VIM and the executable name would not have the same
+path.
+
+Multi-byte:
+- Using an any-but character range [^x] in a regexp didn't work for UTF-8.
+ (Muraoka Taro)
+- When backspacing over inserted characters in Replace mode multibyte
+ characters were not handled correctly. (Muraoka Taro)
+- Search commands "#" and "*" didn't work with multibyte characters. (Muraoka
+ Taro)
+- Word completion in Insert mode didn't work with multibyte characters.
+ (Muraoka Taro)
+- Athena/Motif GUI: when 'linespace' is non-zero the cursor would be drawn too
+ wide (number of bytes instead of cell width).
+- When changing 'encoding' to "euc-jp" and inserting a character Vim would
+ crash.
+- For euc-jp characters positioning the cursor would sometimes be wrong.
+ Also, with two characters with 0x8e leading byte only the first one would be
+ displayed.
+- When using DYNAMIC_ICONV on Win32 conversion might fail because of using the
+ wrong error number. (Muraoka Taro)
+- Using Alt-x in the GUI while 'encoding' was set to "utf-8" didn't produce
+ the right character.
+- When using Visual block selection and only the left half of a double-wide
+ character is selected, the highlighting continued to the end of the line.
+- Visual-block delete didn't work properly when deleting the right half of a
+ double-wide character.
+- Overstrike mode for the cmdline replaced only the first byte of a multibyte
+ character.
+- The cursor in Replace mode (also in the cmdline) was too small on a
+ double-wide character.
+- When a multibyte character contained a 0x80 byte, it didn't work (was using
+ a CSI byte instead). (Muraoka Taro)
+- Wordwise selection with the mouse didn't work.
+- Yanking a modeless selection of multibyte characters didn't work.
+- When 'selection' is "exclusive", selecting a word that ends in a multibyte
+ character used wrong highlighting for the following character.
+
+Win32 with Make_mvc.mak: Didn't compile for debugging. (Craig Barkhouse)
+
+Win32 GUI: When "vimrun.exe" is used to execute an external command, don't
+give a message box with the return value, it was already printed by vimrun.
+Also avoid printing the return value of the shell when ":silent!" is used.
+
+Win32: selecting a lot of text and using the "find/replace" dialog caused a
+crash.
+
+X11 GUI: When typing a character with the 8th bit set and the Meta/Alt
+modifier, the modifier was removed without changing the character.
+
+Truncating a message to make it fit on the command line, using "..." for the
+middle, didn't always compute the space correctly.
+
+Could not imap <C-@>. Now it works like <Nul>.
+
+VMS:
+- Fixed a few things for VAXC. os_vms_fix.com had some strange CTRL-M
+ characters. (Zoltan Arpadffy and John W. Hamill)
+- Added VMS-specific defaults for the 'isfname' and 'isprint' options.
+ (Zoltan Arpadffy)
+- Removed os_vms_osdef.h, it's no longer used.
+
+The gzip plugin used a ":normal" command, this doesn't work when dropping a
+compressed file on Vim.
+
+In very rare situations a binary search for a tag would fail, because an
+uninitialized value happens to be half the size of the tag file. (Narendran)
+
+When using BufEnter and BufLeave autocommands to enable/disable a menu, it
+wasn't updated right away.
+
+When doing a replace with the "c"onfirm flag, the cursor was positioned after
+the ruler, instead of after the question. With a long replacement string the
+screen could scroll up and cause a "more" prompt. Now the message is
+truncated to make it fit.
+
+Motif: The autoconf check for the Xp library didn't work.
+
+When 'verbose' is set to list lines of a sourced file, defining a function
+would reset the counter used for the "more" prompt.
+
+In the Win32 find/replace dialog, a '/' character caused problems. Escape it
+with a backslash.
+
+Starting a shell with ":sh" was different from starting a shell for CTRL-Z
+when suspending doesn't work. They now work the same way.
+
+Jumping to a file mark while in a changed buffer gave a "mark not set" error.
+
+":execute histget("cmd")" causes an endless loop and crashed Vim. Now catch
+all commands that cause too much recursiveness.
+
+Removed "Failed to open input method" error message, too many people got this
+when they didn't want to use a XIM.
+
+GUI: When compiled without the +windows feature, the scrollbar would start
+below line one.
+
+Removed the trick with redefining character class functions from regexp.c.
+
+Win32 GUI: Find dialog gives focus back to main window, when typing a
+character mouse pointer is blanked, it didn't reappear when moving it in the
+dialog window. (Vince Negri)
+
+When recording and typing a CTRL-C, no character was recorded. When in Insert
+mode or cancelling half a command, playing back the recorded sequence wouldn't
+work. Now record the CTRL-C.
+
+When the GUI was started, mouse codes for DEC and netterm were still checked
+for.
+
+GUI: When scrolling and 'writedelay' is non-zero, the character under the
+cursor was displayed in the wrong position (one line above/below with
+CTRL-E/CTRL-Y).
+
+A ":normal" command would reset the 'scrollbind' info. Causes problems when
+using a ":normal" command in an autocommand for opening a file.
+
+Windows GUI: a point size with a dot, like "7.5", wasn't recognized. (Muraoka
+Taro)
+
+When 'scrollbind' wasn't set would still remember the current position,
+wasting time.
+
+GTK: Crash when 'shell' doesn't exist and doing":!ls". Use _exit() instead of
+exit() when the child couldn't execute the shell.
+
+Multi-byte:
+- GUI with double-byte encoding: a mouse click in left half of double-wide
+ character put the cursor in previous char.
+- Using double-byte encoding and 'selection' is "exclusive": "vey" and "^Vey"
+ included the character after the word.
+- When using a double-byte encoding and there is a lead byte at the end of the
+ line, the preceding line would be displayed. "ga" also showed wrong info.
+- "gf" didn't include multibyte characters before the cursor properly.
+ (Muraoka Taro)
+
+GUI: The cursor was sometimes not removed when scrolling. Changed the policy
+from redrawing the cursor after each call to gui_write() to only update it at
+the end of update_screen() or when setting the cursor position. Also only
+update the scrollbars at the end of update_screen(), that's the only place
+where the window text may have been scrolled.
+
+Formatting "/*<Tab>long text", produced "* <Tab>" in the next line. Now
+remove the space before the Tab.
+Formatting "/*<Tab> long text", produced "* <Tab> long text" in the next
+line. Now keep the space after the Tab.
+
+In some places non-ASCII alphabetical characters were accepted, which could
+cause problems. For example, ":X" (X being such a character).
+
+When a pattern matches the end of the line, the last character in the line was
+highlighted for 'hlsearch'. That looks wrong for "/\%3c". Now highlight the
+character just after the line.
+
+Motif: If a dialog was closed by clicking on the "X" of the window frame Vim
+would no longer respond.
+
+When using CTRL-X or CTRL-A on a number with many leading zeros, Vim would
+crash. (Matsumoto)
+
+When 'insertmode' is set, the mapping in mswin.vim for CTRL-V didn't work in
+Select mode. Insert mode wasn't restarted after overwriting the text.
+Now allow nesting Insert mode with insert and change commands. CTRL-O
+cwfoo<Esc> now also works.
+
+Clicking with the right mouse button in another window started Visual mode,
+but used the start position of the current window. Caused ml_get errors when
+the line number was invalid. Now stay in the same window.
+
+When 'selection' is "exclusive", "gv" sometimes selected one character fewer.
+
+When 'comments' contains more than one start/middle/end triplet, the optional
+flags could be mixed up. Also didn't align the end with the middle part.
+
+Double-right-click in Visual mode didn't update the shown mode.
+
+When the Normal group has a font name, it was never used when starting up.
+Now use it when 'guifont' and 'guifontset' are empty.
+Setting a font name to a highlight group before the GUI was started didn't
+work.
+
+"make test" didn't use the name of the generated Vim executable.
+
+'cindent' problems:
+- Aligned with an "else" inside a do-while loop for a line below that loop.
+ (Meikel Brandmeyer)
+- A line before a function would be indented even when terminated with a
+ semicolon. (Meikel Brandmeyer)
+- 'cindent' gave too much indent to a line after a "};" that ends an array
+ init.
+- Support declaration lines ending in "," and "\". (Meikel Brandmeyer)
+- A case statement inside a do-while loop was used for indenting a line after
+ the do-while loop. (Meikel Brandmeyer)
+- When skipping a string in a line with one double quote it could continue in
+ the previous line. (Meikel Brandmeyer)
+
+When 'list' is set, 'hlsearch' didn't highlight a match at the end of the
+line. Now highlight the '$'.
+
+The Paste menu item in the menu bar, the popup menu and the toolbar were all
+different. Now made them all equal to how it was done in mswin.vim.
+
+st_dev can be smaller than "unsigned". The compiler may give an overflow
+warning. Added a configure check for dev_t.
+
+Athena: closing a confirm() dialog killed Vim.
+
+Various typos in the documentation. (Matt Dunford)
+
+Python interface: The definition of _DEBUG could cause trouble, undefine it.
+The error message for not being able to load the shared library wasn't
+translated. (Muraoka Taro)
+
+Mac: (Dany St-Amant and Axel Kielhorn)
+- Several fixes.
+- Vim was eating 80% of the CPU time.
+- The project os_mac.pbxproj didn't work, Moved it to a subdirectory.
+- Made the menu priority work for the menubar.
+- Fixed a problem with dragging the scrollbar.
+- Cleaned up the various #ifdefs.
+
+Unix: When catching a deadly signal and we keep getting one use _exit() to
+exit in a quick and dirty way.
+
+Athena menu ordering didn't work correctly. (David Harrison)
+
+A ":make" or ":grep" command with a long argument could cause a crash.
+
+Doing ":new file" and using "Quit" for the ATTENTION dialog still opened a new
+window.
+
+GTK: When starting the GUI and there is an error in the .vimrc file, don't
+present the wait-return prompt, since the message was given in the terminal.
+
+When there was an error in a .vimrc file the terminal where gvim was started
+could be cleared. Set msg_row in main.c before writing any messages.
+
+GTK and X11 GUI: When trying to read characters from the user (e.g. with
+input()) before the Vim window was opened caused Vim to hang when it was
+started from the desktop.
+
+OS/390 uses 31 bit pointers. That broke some computations with MAX_COL.
+Reduce MAX_COL by one bit for OS/390. (Ralf Schandl)
+
+When defining a function and it already exists, Vim didn't say it existed
+until after typing it. Now do this right away when typing it.
+
+The message remembered for displaying later (keep_msg) was sometimes pointing
+into a generic buffer, which might be changed by the time the message is
+displayed. Now make a copy of the message.
+
+When using multibyte characters in a menu and a trailing byte is a backslash,
+the menu would not be created correctly. (Muraoka Taro)
+Using a multibyte character in the substitute string where a trail byte is a
+backslash didn't work. (Muraoka Taro)
+
+When setting "t_Co" in a vimrc file, then setting it automatically from an
+xterm termresponse and then setting it again manually caused a crash.
+
+When getting the value of a string option that is not supported, the number
+zero was returned. This breaks a check like "&enc == "asdf". Now an empty
+string is returned for string options.
+
+Crashed when starting the GTK GUI while using 'notitle' in the vimrc, setting
+'title' in the gvimrc and starting the GUI with ":gui". Closed the connection
+to the X server accidentally.
+
+Had to hit return after selecting an entry for ":ts".
+
+The message from ":cn" message was sometimes cleared. Now display it after
+redrawing if it doesn't cause a scroll (truncated when necessary).
+
+hangulin.c didn't compile when the GUI was disabled. Disable it when it won't
+work.
+
+When setting a termcap option like "t_CO", the value could be displayed as
+being for a normal key with a modifier, like "<M-=>".
+
+When expanding the argument list, entries which are a directory name did not
+get included. This stopped "vim c:/" from opening the file explorer.
+
+":syn match sd "^" nextgroup=asdf" skipped the first column and matched the
+nextgroup in the second column.
+
+GUI: When 'lazyredraw' is set, 'showmatch' didn't work. Required flushing
+the output.
+
+Don't define the <NetMouse> termcode in an xterm, reduces the problem when
+someone types <Esc> } in Insert mode.
+
+Made slash_adjust() work correctly for multibyte characters. (Yasuhiro
+Matsumoto)
+Using a filename in Big5 encoding for autocommands didn't work (backslash in
+trailbyte). (Yasuhiro Matsumoto)
+
+DOS and Windows: Expanding *.vim also matched file.vimfoo. Expand path like
+Unix to avoid problems with Windows dir functions. Merged the DOS and Win32
+functions.
+
+Win32: GvimExt could not edit more than a few files at once, the length of the
+argument was fixed.
+
+"ls -1 * | xargs vim" worked, but the input was in cooked mode. Now switch to
+raw mode when needed. Use dup() to copy the stderr file descriptor to stdin
+to make shell commands work. No longer requires an external program to do
+this.
+
+When using ":filetype off", ftplugin and indent usage would be switched off at
+the same time. Don't do this, setting 'filetype' manually can still use them.
+
+GUI: When writing a double-byte character, it could be split up in two calls
+to gui_write(), which doesn't work. Now flush before the output buffer
+becomes full.
+
+When 'laststatus' is set and 'cmdheight' is two or bigger, the intro message
+would be written over the status line.
+The ":intro" command didn't work when there wasn't enough room.
+
+Configuring for Ruby failed with a recent version of Ruby. (Akinori Musha)
+
+Athena: When deleting the directory in which Vim was started, using the file
+browser made Vim exit. Removed the use of XtAppError().
+
+When using autoconf 2.50, UNIX was not defined. Moved the comment for "#undef
+UNIX" to a separate line.
+
+Win32: Disabled _OnWindowPosChanging() to make maximize work better.
+
+Win32: Compiling with VC 4.0 didn't work. (Walter Briscoe)
+
+Athena:
+- Finally fixed the problems with deleting a menu. (David Harrison)
+- Athena: When closing the confirm() dialog, worked like OK was pressed,
+ instead of Cancel.
+
+The file explorer didn't work in compatible mode, because of line
+continuation.
+
+Didn't give an error message for ":digraph a".
+
+When using Ex mode in the GUI and typing a special key, <BS> didn't delete it
+correctly. Now display '?' for a special key.
+
+When an operator is pending, clicking in another window made it apply to that
+window, even though the line numbers could be beyond the end of the buffer.
+
+When a function call doesn't have a terminating ")" Vim could crash.
+
+Perl interface: could crash on exit with perl 5.6.1. (Anduin Withers)
+
+Using %P in 'errorformat' wasn't handled correctly. (Tomas Zellerin)
+
+Using a syntax cluster that includes itself made Vim crash.
+
+GUI: With 'ls' set to 2, dragging the status line all the way up, then making
+the Vim window smaller: Could not the drag status line anymore.
+
+"vim -c startinsert! file" placed cursor on last char of a line, instead of
+after it. A ":set" command in the buffer menu set w_set_curswant. Now don't
+do this when w_curswant is MAXCOL.
+
+Win32: When the gvim window was maximized and selecting another font, the
+window would no longer fill the screen.
+
+The line with 'pastetoggle' in ":options" didn't show the right value when it
+is a special key. Hitting <CR> didn't work either.
+
+Formatting text, resulting in a % landing in the first line, repeated the % in
+the following lines, like it's the start of a comment.
+
+GTK: When adding a toolbar item while gvim is already running, it wasn't
+possible to use the tooltip. Now it works by adding the tooltip first.
+
+The output of "g CTRL-G" mentioned "Char" but it's actually bytes.
+
+Searching for the end of a oneline region didn't work correctly when there is
+an offset for the highlighting.
+
+Syntax highlighting: When synchronizing on C-comments, //*/ was seen as the
+start of a comment.
+
+Win32: Without scrollbars present, the MS mouse scroll wheel didn't work.
+Also handle the scrollbars when they are not visible.
+
+Motif: When there is no right scrollbar, the bottom scrollbar would still
+leave room for it. (Marcin Dalecki)
+
+When changing 'guicursor' and the value is invalid, some of the effects would
+still take place. Now first check for errors and only make the new value
+effective when it's OK.
+
+Using "A" In Visual block mode, appending to lines that don't extend into the
+block, padding was wrong.
+
+When pasting a block of text, a character that occupies more than one screen
+column could be deleted and spaces inserted instead. Now only do that with a
+tab.
+
+Fixed conversion of documentation to HTML using Perl. (Dan Sharp)
+
+Give an error message when a menu name starts with a dot.
+
+Avoid a hang when executing a shell from the GUI on HP-UX by pushing "ptem"
+even when sys/ptem.h isn't present.
+
+When creating the temp directory, make sure umask is 077, otherwise the
+directory is not accessible when it was set to 0177.
+
+Unix: When resizing the window and a redraw is a bit slow, could get a window
+resize event while redrawing, resulting in a messed up window. Any input
+(e.g., a mouse click) would redraw.
+
+The "%B" item in the status line became zero in Insert mode (that's normal)
+for another than the current window.
+
+The menu entries to convert to xxd and back didn't work in Insert mode.
+
+When ":vglobal" didn't find a line where the pattern doesn't match, the error
+message would be the wrong way around.
+
+When ignoring a multi-line error message with "%-A", the continuation lines
+would be used anyway. (Servatius Brandt)
+
+"grx" on a double-wide character inserted "x", instead of replacing the
+character with "x ". "gR" on <xx> ('display' set the "uhex") didn't replace
+at all. When doing "gRxx" on a control character the first "x" would be
+inserted, breaking the alignment.
+
+Added "0)" to 'cinkeys', so that when typing a ) it is put in the same place
+as where "==" would put it.
+
+Win32: When maximized, adding/removing toolbar didn't resize the text area.
+
+When using <C-RightMouse> a count was discarded.
+
+When typing CTRL-V and <RightMouse> in the command line, would insert
+<LeftMouse>.
+
+Using "vis" or "vas" when 'selection' is exclusive didn't include the last
+character.
+
+When adding to an option like 'grepprg', leading space would be lost. Don't
+expand environment variables when there is no comma separating the items.
+
+GUI: When using a bold-italic font, would still use the bold trick and
+underlining.
+
+Motif: The default button didn't work in dialogs, the first one was always
+used. Had to give input focus to the default button.
+
+When using CTRL-T to jump within the same file, the '' mark wasn't set.
+
+Undo wasn't Vi compatible when using the 'c' flag for ":s". Now it undoes the
+whole ":s" command instead of each confirmed replacement.
+
+The Buffers menu, when torn-off, disappeared when being refreshed. Add a
+dummy item to avoid this.
+
+Removed calling msg_start() in main(), it should not be needed.
+
+vim_strpbrk() did not support multibyte characters. (Muraoka Taro)
+
+The Amiga version didn't compile, the code was too big for relative jumps.
+Moved a few files from ex_docmd.c to ex_cmds2.c
+
+When evaluating the "= register resulted in the "= register being changed, Vim
+would crash.
+
+When doing ":view file" and it fails, the current buffer was made read-only.
+
+Motif: For some people the separators in the toolbar disappeared when resizing
+the Vim window. (Marcin Dalecki)
+
+Win32 GUI: when setting 'lines' to a huge number, would not compute the
+available space correctly. Was counting the menu height twice.
+
+Conversion of the docs to HTML didn't handle the line with the +quickfix tag
+correctly. (Antonio Colombo)
+
+Win32: fname_case() didn't handle multibyte characters correctly. (Yasuhiro
+Matsumoto)
+
+The Cygwin version had trouble with fchdir(). Don't use that function for
+Cygwin.
+
+The generic check in scripts.vim for "conf" syntax was done before some checks
+in filetype.vim, resulting in "conf" syntax too often.
+
+Dos32: Typing lagged behind. Would wait for one biostick when checking if a
+character is available.
+
+GTK: When setting 'columns' while starting up "gvim", would set the width of
+the terminal it was started in.
+
+When using ESC in Insert mode, an autoindent that wraps to the next line
+caused the cursor to move to the end of the line temporarily. When the
+character before the cursor was a double-wide multibyte character the cursor
+would be on the right half, which causes problems with some terminals.
+
+Didn't handle multibyte characters correctly when expanding a file name.
+(Yasuhiro Matsumoto)
+
+Win32 GUI: Errors generated before the GUI is decided to start were not
+reported.
+
+globpath() didn't reserve enough room for concatenated results. (Anduin
+Withers)
+
+When expanding an option that is very long already, don't do the expansion, it
+would be truncated to MAXPATHL. (Anduin Withers)
+
+When 'selection' is "exclusive", using "Fx" in Visual mode only moved until
+just after the character.
+
+When using IME on the console to enter a file name, the screen may scroll up.
+Redraw the screen then. (Yasuhiro Matsumoto)
+
+Motif: In the find/replace dialog the "Replace" button didn't work first time,
+second time it replaced all matches. Removed the use of ":s///c".
+GTK: Similar problems with the find/replace dialog, moved the code to a common
+function.
+
+X11: Use shared GC's for text. (Marcin Dalecki)
+
+"]i" found the match under the cursor, instead of the first one below it.
+Same for "]I", "] CTRL-I", "]d", "]D" and "] CTRL-D".
+
+Win16: When maximized and the font is changed, don't change the window size.
+(Vince Negri)
+
+When 'lbr' is set, deleting a block of text could leave the cursor in the
+wrong position.
+
+Win32: When opening a file with the "Edit with Vim" popup menu entry,
+wildcards would cause trouble. Added the "--literal" argument to avoid
+expanding file names.
+
+When using "gv", it didn't restore that "$" was used in Visual block mode.
+
+Win32 GUI: While waiting for a shell command to finish, the window wasn't
+redrawn at all. (Yasuhiro Matsumoto)
+
+Syntax highlighting: A match that continues on a next line because of a
+contained region didn't end when that region ended.
+
+The ":s" command didn't allow flags like 'e' and 'i' right after it.
+
+When using ":s" to split a line, marks were moved to the next line. Vi keeps
+them in the first line.
+
+When using ":n" ":rew", the previous context mark was at the top of the file,
+while Vi puts it in the same place as the cursor. Made it Vi compatible.
+
+Fixed Vi incompatibility: Text was not put in register 1 when using "c" and
+"d" with a motion character, when deleting within one line with one of the
+commands: % ( ) `<character> / ? N n { }
+
+Win32 GUI: The tooltip for tear-off items remained when the tear-off item was
+no longer selected.
+
+GUI: When typing ":" at the more prompt, would return to Normal mode and not
+redraw the screen.
+
+When starting Vim with an argument "-c g/at/p" the printed lines would
+overwrite each other.
+
+BeOS: Didn't compile. Configure didn't add the os_beos files, the QNX check
+removed them. Various changes to os_beos.cc. (Joshua Haberman)
+Removed the check for the hardware platform, the BeBox has not been produced
+for a long time now.
+
+Win32 GUI: don't use a message box when the shell returns an error code,
+display the message in the Vim window.
+
+Make_mvc.mak always included "/debug" for linking. "GUI=no" argument didn't
+work. Use "DEBUG=yes" instead of "DEBUG=1" to make it consistent. (Dan Sharp)
+
+When a line in the tags file ended in ;" (no TAB following) the command would
+not be recognized as a search command.
+
+X11: The inputMethod resource never worked. Don't use the "none" input method
+for SGI, it apparently makes the first character in Input method dropped.
+
+Fixed incorrect tests in os_mac.h. (Axel Kielhorn)
+
+Win32 console: When the console where Vim runs in is closed, Vim could hang in
+trying to restore the window icon. (Yasuhiro Matsumoto)
+
+When using ":3call func()" or ":3,3call func() the line number was ignored.
+
+When 'showbreak' and 'linebreak' were both set, Visual highlighting sometimes
+continued until the end of the line.
+
+GTK GUI: Tearoff items were added even when 'guioptions' didn't contain 't'
+when starting up.
+
+MS-Windows: When the current directory includes a "~", searching files with
+"gf" or ":find" didn't work. A "$" in the directory had the same problem.
+Added mch_has_exp_wildcard() functions.
+
+When reducing the Vim window height while starting up, would get an
+out-of-memory error message.
+
+When editing a very long search pattern, 'incsearch' caused the redraw of the
+command line to fail.
+
+Motif GUI: On some systems the "Help" menu would not be on the far right, as
+it should be. On some other systems (esp. IRIX) the command line would not
+completely show. Solution is to only resize the menubar for Lesstif.
+
+Using "%" in a line that contains "\\" twice didn't take care of the quotes
+properly. Now make a difference between \" and \\".
+
+For non-Unix systems a dummy file is created when finding a swap name to
+detect a 8.3 filesystem. When there is an existing swap file, would get a
+warning for the file being created outside of Vim. Also, when closing the Vim
+window the file would remain.
+
+Motif: The menu height was always computed, using a "-menuheight" argument
+was setting the room for the command line. Now make clear the argument is not
+supported.
+
+For some (EBCDIC) systems, POUND was equal to '#'. Added an #if for that to
+avoid a duplicate case in a switch.
+
+The GUI may have problems when forking. Always call _exit() instead of exit()
+in the parent, the child will call exit().
+
+Win32 GUI: Accented characters were often wrong in dialogs and tearoff menus.
+Now use CP_ACP instead of CP_OEMCP. (Vince Negri)
+
+When displaying text with syntax highlighting causes an error (e.g., running
+out of stack) the syntax highlighting is disabled to avoid further messages.
+
+When a command in a .vimrc or .gvimrc causes an ATTENTION prompt, and Vim was
+started from the desktop (no place to display messages) it would hang. Now
+open the GUI window early to be able to display the messages and pop up the
+dialog.
+
+"r<CR>" on a multibyte character deleted only the first byte of the
+character. "3r<CR>" deleted three bytes instead of three characters.
+
+When interrupting reading a file, Vi considers the buffer modified. Added the
+'i' flag in 'cpoptions' flag for this (we don't want it modified to be able to
+do ":q").
+
+When using an item in 'guicursor' that starts with a colon, Vim would get
+stuck or crash.
+
+When putting a file mark in a help file and later jumping back to it, the
+options would not be set. Extended the modeline in all help files to make
+this work better.
+
+When a modeline contained "::" the local option values would be printed. Now
+ignore it.
+
+Some help files did not use a 8.3 names, which causes problems when using
+MS-DOS unzip. Renamed "multibyte.txt" to "mbyte.txt", "rightleft.txt" to
+"rileft.txt", "tagsearch.txt" to "tagsrch.txt", "os_riscos.txt" to
+"os_risc.txt".
+
+When Visual mode is blockwise, using "iw" or "aw" made it characterwise. That
+doesn't seem right, only do this when in linewise mode. But then do it
+always, not only when start and end of Visual mode are equal.
+
+When using "viw" on a single-letter word and 'selection' is exclusive, would
+not include the word.
+
+When formatting text from Insert mode, using CTRL-O, could mess up undo
+information.
+
+While writing a file (also for the backup file) there was no check for an
+interrupt (hitting CTRL-C). Vim could hang when writing a large file over a
+slow network, and moving the mouse didn't make it appear (when 'mousehide' is
+set) and the screen wasn't updated in the GUI. Also allow interrupting when
+syncing the swap file, it can take a long time.
+
+When using ":mksession" while there is help window, it would later be restored
+to the right file but not marked as a help buffer. ":help" would then open
+another window. Now use the value "help" for 'buftype' to mark a help buffer.
+
+The session file contained absolute path names in option values, that doesn't
+work when the home directory depends on the situation. Replace the home
+directory with ~/ when possible.
+
+When using 'showbreak' a TAB just after the shown break would not be counted
+correctly, the cursor would be positioned wrong.
+
+With 'showbreak' set to "--->" or "------->" and 'sts' set to 4, inserting
+tabs did not work right. Could cause a crash. Backspacing was also wrong,
+could get stuck at a line break.
+
+Win32: crashed when tearing off a menu with over 300 items.
+
+GUI: A menu or toolbar item would appear when only a tooltip was defined for
+it.
+
+When 'scrolloff' is non-zero and "$" is in 'cpoptions', using "s" while the
+last line of the file is the first line on screen, the text wasn't displayed.
+
+When running "autoconf", delete the configure cache to force starting cleanly
+when configure is run again.
+
+When changing the Normal colors for cterm, the value of 'background' was
+changed even when the GUI was used.
+
+The warning for a missing vimrun.exe was always given on startup, but some
+people just editing a file don't need to be bothered by it. Only show it when
+vimrun would be used.
+
+When using "%" in a multibyte text it could get confused by trailbytes that
+match. (Muraoka Taro)
+
+Termcap entry for RiscOS was wrong, using 7 and 8 in octal codes.
+
+Athena: The title of a dialog window and the file selector window were not
+set. (David Harrison)
+
+The "htmlLink" highlight group specified colors, which gives problems when
+using a color scheme. Added the "Underlined" highlight group for this.
+
+After using ":insert" or ":change" the '[ mark would be one line too low.
+
+When looking for the file name after a match with 'include' one character was
+skipped. Same for 'define'.
+
+Win32 and DJGPP: When editing a file with a short name in a directory, and
+editing the same file but using the long name, would end up with two buffers
+on the same file.
+
+"gf" on a filename that starts with "../" only worked when the file being
+edited is in the current directory. An include file search didn't work
+properly for files starting with "../" or ".". Now search both relative to
+the file and to the current directory.
+
+When 'printheader', 'titlestring', 'iconstring', 'rulerformat' or 'statusline'
+contained "%{" but no following "}" memory was corrupted and a crash could
+happen.
+
+":0append" and then inserting two lines did not redraw the blank lines that
+were scrolled back down.
+
+When using insert mode completion in a narrow window, the message caused a
+scroll up. Now shorten the message if it doesn't fit and avoid writing the
+ruler over the message.
+
+XIM still didn't work correctly on some systems, especially SGI/IRIX. Added
+the 'imdisable' option, which is set by default for that system.
+
+Patch 6.0aw.008
+Problem: When the first character of a file name is over 127, the Buffers
+ menu entry would get a negative priority and cause problems.
+Solution: Reduce the multiplier for the first character when computing
+ the hash value for a Buffers menu entry.
+Files: runtime/menu.vim
+
+Patch 6.0aw.010
+Problem: Win32: ":browse edit dir/dir" didn't work. (Vikas)
+Solution: Change slashes to backslashes in the directory passed to the file
+ browser.
+Files: src/gui_w48.c
+
+Athena file browser: On some systems wcstombs() can't be used to get the
+length of a multibyte string. Use the maximum length then. (Yasuhiro
+Matsumoto)
+
+Patch 6.0ax.001
+Problem: When 'patchmode' is set, appending to a file gives an empty
+ original file. (Ed Ralston)
+Solution: Also make a backup copy when appending and 'patchmode' is set.
+Files: src/fileio.c
+
+Patch 6.0ax.002
+Problem: When 'patchmode' is set, appending to a compressed file gives an
+ uncompressed original file. (Ed Ralston)
+Solution: Create the original file before decompressing.
+Files: runtime/plugin/gzip.vim
+
+Patch 6.0ax.005
+Problem: Athena file selector keeps the title of the first invocation.
+Solution: Set the title each time the file selector is opened. (David
+ Harrison)
+Files: src/gui_at_fs.c
+
+Patch 6.0ax.007
+Problem: When using GPM (mouse driver in a Linux console) a double click is
+ interpreted as a scroll wheel click.
+Solution: Check if GPM is being used when deciding if a mouse event is for
+ the scroll wheel.
+Files: src/term.c
+
+Patch 6.0ax.010
+Problem: The Edit.Save menu and the Save toolbar button didn't work when
+ the buffer has no file name.
+Solution: Use a file browser to ask for a file name. Also fix the toolbar
+ Find item in Visual mode.
+Files: runtime/menu.vim
+
+Patch 6.0ax.012
+Problem: When 'cpoptions' contains "$", breaking a line for 'textwidth'
+ doesn't redraw properly. (Stefan Schulze)
+Solution: Remove the dollar before breaking the line.
+Files: src/edit.c
+
+Patch 6.0ax.014
+Problem: Win32: On Windows 98 ":make -f file" doesn't work when 'shell' is
+ "command.com" and 'makeprg' is "nmake". The environment isn't
+ passed on to "nmake".
+Solution: Also use vimrun.exe when redirecting the output of a command.
+Files: src/os_win32.c
+
+Patch 6.0ax.016
+Problem: The version number was reported wrong in the intro screen.
+Solution: Check for a version number with two additional letters.
+Files: src/version.c
+
+Patch 6.0ax.019
+Problem: When scrolling a window with folds upwards, switching to another
+ vertically split window and back may not update the scrollbar.
+Solution: Limit w_botline to the number of lines in the buffer plus one.
+Files: src/move.c
+
+
+==============================================================================
+VERSION 6.1 *version-6.1*
+
+This section is about improvements made between version 6.0 and 6.1.
+
+This is a bug-fix release, there are not really any new features.
+
+
+Changed *changed-6.1*
+-------
+
+'iminsert' and 'imsearch' are no longer set as a side effect of defining a
+language-mapping using ":lmap".
+
+
+Added *added-6.1*
+-----
+
+Syntax files:
+ampl AMPL (David Krief)
+ant Ant (Johannes Zellner)
+baan Baan (Her van de Vliert)
+cs C# (Johannes Zellner)
+lifelines Lifelines (Patrick Texier)
+lscript LotusScript (Taryn East)
+moo MOO (Timo Frenay)
+nsis NSIS (Alex Jakushev)
+ppd Postscript Printer Description (Bjoern Jacke)
+rpl RPL/2 (Joel Bertrand)
+scilab Scilab (Benoit Hamelin)
+splint Splint (Ralf Wildenhues)
+sqlj SQLJ (Andreas Fischbach)
+wvdial WvDial (Prahlad Vaidyanathan)
+xf86conf XFree86 config (Nikolai Weibull)
+xmodmap Xmodmap (Nikolai Weibull)
+xslt Xslt (Johannes Zellner)
+monk Monk (Mike Litherland)
+xsd Xsd (Johannes Zellner)
+cdl CDL (Raul Segura Acevedo)
+sendpr Send-pr (Hendrik Scholz)
+
+Added indent file for Scheme. (Dorai Sitaram)
+Added indent file for Prolog. (Kontra Gergely)
+Added indent file for Povray (David Necas)
+Added indent file for IDL (Aleksandar Jelenak)
+Added C# indent and ftplugin scripts.
+
+Added Ukrainian menu translations. (Bohdan Vlasyuk)
+Added ASCII version of the Czech menus. (Jiri Brezina)
+
+Added Simplified Chinese translation of the tutor. (Mendel L Chan)
+
+Added Russian keymap for yawerty keyboard.
+
+Added an explanation of using the vimrc file in the tutor.
+Changed tutor.vim to get the right encoding for the Taiwanese tutor.
+
+Added Russian tutor. (Andrey Kiselev)
+Added Polish tutor. (Mikolaj Machowski)
+
+Added darkblue color scheme. (Bohdan Vlasyuk)
+
+When packing the dos language archive automatically generate the .mo files
+that are required.
+
+Improved NSIS script to support NSIS 180. Added icons for the
+enabled/disabled status. (Mirek Pruchnik)
+
+cp1250 version of the Slovak message translations.
+
+Compiler plugins for IRIX compilers. (David Harrison)
+
+
+Fixed *fixed-6.1*
+-----
+
+The license text was updated to make the meaning clearer and make it
+compatible with the GNU GPL. Otherwise distributors have a problem when
+linking Vim with a GPL'ed library.
+
+When installing the "less.sh" script it was not made executable. (Chuck Berg)
+
+Win32: The "9" key on the numpad wasn't working. (Julian Kinraid)
+
+The NSIS install script didn't work with NSIS 1.80 or later. Also add
+Vim-specific icons. (Pruchnik)
+
+The script for conversion to HTML contained an "if" in the wrong place.
+(Michael Geddes)
+
+Allow using ":ascii" in the sandbox, it's harmless.
+
+Removed creat() from osdef2.h.in, it wasn't used and may cause a problem when
+it's redefined to creat64().
+
+The text files in the VisVim directory were in "dos" format. This caused
+problems when applying a patch. Now keep them in "unix" format and convert
+them to "dos" format only for the PC archives.
+
+Add ruby files to the dos source archive, they can be used by Make_mvc.mak.
+(Mirek Pruchnik)
+
+"cp -f" doesn't work on all systems. Change "cp -f" in the Makefile to "rm
+-f" and "cp".
+
+Didn't compile on a Compaq Tandem Himalaya OSS. (Michael A. Benzinger)
+
+The GTK file selection dialog didn't include the "Create Dir", "Delete File"
+and "Rename File" buttons.
+
+When doing ":browse source" the dialog has the title "Run Macro". Better
+would be "Source Vim script". (Yegappan Lakshmanan)
+
+Win32: Don't use the printer font as default for the font dialog.
+
+"make doslang" didn't work when configure didn't run (yet). Set $MAKEMO to
+"yes". (Mirek Pruchnik)
+
+The ToolBar TagJump item used "g]", which prompts for a selection even when
+there is only one matching tag. Use "g<C-]>" instead.
+
+The ming makefile for message translations didn't have the right list of
+files.
+
+The MS-Windows 3.1 version complains about LIBINTL.DLL not found. Compile
+this version without message translations.
+
+The Borland 5 makefile contained a check for Ruby which is no longer needed.
+The URLs for the TCL library was outdated. (Dan Sharp)
+
+The eviso.ps file was missing from the DOS runtime archive, it's needed for
+printing PostScript in the 32bit DOS version.
+
+In menu files ":scriptencoding" was used in a wrong way after patch 6.1a.032
+Now use ":scriptencoding" in the file where the translations are given. Do
+the same for all menus in latin1 encoding.
+
+Included a lot of fixes for the Macintosh, mostly to make it work with Carbon.
+(Dany StAmant, Axel Kielhorn, Benji Fisher)
+
+Improved the vimtutor shell script to use $TMPDIR when it exists, and delete
+the copied file when exiting in an abnormal way. (Max Ischenko)
+
+When "iconv.dll" can't be found, try using "libiconv.dll".
+
+When encryption is used, filtering with a shell command wasn't possible.
+
+DJGPP: ":cd c:" always failed, can't get permissions for "c:".
+Win32: ":cd c:/" failed if the previous current directory on c: had become
+invalid.
+
+DJGPP: Shift-Del and Del both produce \316\123. Default mapping for Del is
+wrong. Disabled it.
+
+Dependencies on header files in MingW makefile was wrong.
+
+Win32: Don't use ACL stuff for MSVC 4.2, it's not supported. (Walter Briscoe)
+
+Win32 with Borland: bcc.cfg was caching the value for $(BOR), but providing a
+different argument to make didn't regenerate it.
+
+Win32 with MSVC: Make_ivc.mak generates a new if_ole.h in a different
+directory, the if_ole.h in the src directory may be used instead. Delete the
+distributed file.
+
+When a window is vertically split and then ":ball" is used, the window layout
+is messed up, can cause a crash. (Muraoka Taro)
+
+When 'insertmode' is set, using File/New menu and then double clicking, "i" is
+soon inserted. (Merlin Hansen)
+
+When Select mode is active and using the Buffers menu to switch to another
+buffer, an old selection comes back. Reset VIsual_reselect for a ":buffer"
+command.
+
+When Select mode is active and 'insertmode' is set, using the Buffers menu to
+switch to another buffer, did not return to Insert mode. Make sure
+"restart_edit" is set.
+
+When double clicking on the first character of a word while 'selection' is
+"exclusive" didn't select that word.
+
+
+Patch 6.0.001
+Problem: Loading the sh.vim syntax file causes error messages. (Corinna
+ Vinschen)
+Solution: Add an "if". (Charles Campbell)
+Files: runtime/syntax/sh.vim
+
+Patch 6.0.002
+Problem: Using a '@' item in 'viminfo' doesn't work. (Marko Leipert)
+Solution: Add '@' to the list of accepted items.
+Files: src/option.c
+
+Patch 6.0.003
+Problem: The configure check for ACLs on AIX doesn't work.
+Solution: Fix the test program so that it compiles. (Tomas Ogren)
+Files: src/configure.in, src/auto/configure
+
+Patch 6.0.004
+Problem: The find/replace dialog doesn't reuse a previous argument
+ properly.
+Solution: After removing a "\V" terminate the string. (Zwane Mwaikambo)
+Files: src/gui.c
+
+Patch 6.0.005
+Problem: In Insert mode, "CTRL-O :ls" has a delay before redrawing.
+Solution: Don't delay just after wait_return() was called. Added the
+ did_wait_return flag.
+Files: src/globals.h, src/message.c, src/normal.c, src/screen.c
+
+Patch 6.0.006
+Problem: With a vertical split, 'number' set and 'scrolloff' non-zero,
+ making the window width very small causes a crash. (Niklas
+ Lindstrom)
+Solution: Check for a zero width.
+Files: src/move.c
+
+Patch 6.0.007
+Problem: When setting 'filetype' while there is no FileType autocommand, a
+ following ":setfiletype" would set 'filetype' again. (Kobus
+ Retief)
+Solution: Set did_filetype always when 'filetype' has been set.
+Files: src/option.c
+
+Patch 6.0.008
+Problem: 'imdisable' is missing from the options window. (Michael Naumann)
+Solution: Add an entry for it.
+Files: runtime/optwin.vim
+
+Patch 6.0.009
+Problem: Nextstep doesn't have S_ISBLK. (John Beppu)
+Solution: Define S_ISBLK using S_IFBLK.
+Files: src/os_unix.h
+
+Patch 6.0.010
+Problem: Using "gf" on a file name starting with "./" or "../" in a buffer
+ without a name causes a crash. (Roy Lewis)
+Solution: Check for a NULL file name.
+Files: src/misc2.c
+
+Patch 6.0.011
+Problem: Python: After replacing or deleting lines get an ml_get error.
+ (Leo Lipelis)
+Solution: Adjust the cursor position for deleted or added lines.
+Files: src/if_python.c
+
+Patch 6.0.012
+Problem: Polish translations contain printf format errors, this can result
+ in a crash when using one of them.
+Solution: Fix for translated messages. (Michal Politowski)
+Files: src/po/pl.po
+
+Patch 6.0.013
+Problem: Using ":silent! cmd" still gives some error messages, like for an
+ invalid range. (Salman Halim)
+Solution: Reset emsg_silent after calling emsg() in do_one_cmd().
+Files: src/ex_docmd.c
+
+Patch 6.0.014
+Problem: When 'modifiable' is off and 'virtualedit' is "all", "rx" on a TAB
+ still changes the buffer. (Muraoka Taro)
+Solution: Check if saving the line for undo fails.
+Files: src/normal.c
+
+Patch 6.0.015
+Problem: When 'cpoptions' includes "S" and "filetype plugin on" has been
+ used, can get an error for deleting the b:did_ftplugin variable.
+ (Ralph Henderson)
+Solution: Only delete the variable when it exists.
+Files: runtime/ftplugin.vim
+
+Patch 6.0.016
+Problem: bufnr(), bufname() and bufwinnr() don't find unlisted buffers when
+ the argument is a string. (Hari Krishna Dara)
+ Also for setbufvar() and getbufvar().
+Solution: Also find unlisted buffers.
+Files: src/eval.c
+
+Patch 6.0.017
+Problem: When 'ttybuiltin' is set and a builtin termcap entry defines t_Co
+ and the external one doesn't, it gets reset to empty. (David
+ Harrison)
+Solution: Only set t_Co when it wasn't set yet.
+Files: src/term.c
+
+Patch 6.0.018
+Problem: Initializing 'encoding' may cause a crash when setlocale() is not
+ used. (Dany St-Amant)
+Solution: Check for a NULL pointer.
+Files: src/mbyte.c
+
+Patch 6.0.019
+Problem: Converting a string with multibyte characters to a printable
+ string, e.g., with strtrans(), may cause a crash. (Tomas Zellerin)
+Solution: Correctly compute the length of the result in transstr().
+Files: src/charset.c
+
+Patch 6.0.020
+Problem: When obtaining the value of a global variable internally, could
+ get the function-local value instead. Applies to using <Leader>
+ and <LocalLeader> and resetting highlighting in a function.
+Solution: Prepend "g:" to the variable name. (Aric Blumer)
+Files: src/syntax.c, src/term.c
+
+Patch 6.0.021
+Problem: The 'cscopepathcomp' option didn't work.
+Solution: Change USE_CSCOPE to FEAT_CSCOPE. (Mark Feng)
+Files: src/option.c
+
+Patch 6.0.022
+Problem: When using the 'langmap' option, the second character of a command
+ starting with "g" isn't adjusted.
+Solution: Apply 'langmap' to the second character. (Alex Kapranoff)
+Files: src/normal.c
+
+Patch 6.0.023
+Problem: Loading the lhaskell syntax doesn't work. (Thore B. Karlsen)
+Solution: Use ":runtime" instead of "source" to load haskell.vim.
+Files: runtime/syntax/lhaskell.vim
+
+Patch 6.0.024
+Problem: Using "CTRL-V u 9900" in Insert mode may cause a crash. (Noah
+ Levitt)
+Solution: Don't insert a NUL byte in the text, use a newline.
+Files: src/misc1.c
+
+Patch 6.0.025
+Problem: The pattern "\vx(.|$)" doesn't match "x" at the end of a line.
+ (Preben Peppe Guldberg)
+Solution: Always see a "$" as end-of-line after "\v". Do the same for "^".
+Files: src/regexp.c
+
+Patch 6.0.026
+Problem: GTK: When using arrow keys to navigate through the menus, the
+ separators are selected.
+Solution: Set the separators "insensitive". (Pavel Kankovsky)
+Files: src/gui_gtk.c, src/gui_gtk_x11.c
+
+Patch 6.0.027
+Problem: VMS: Printing doesn't work, the file is deleted too quickly.
+ No longer need the VMS specific printing menu.
+ gethostname() is not available with VAXC.
+ The makefile was lacking selection of the tiny-huge feature set.
+Solution: Adjust the 'printexpr' option default. Fix the other problems and
+ update the documentation. (Zoltan Arpadffy)
+Files: runtime/doc/os_vms.txt, runtime/menu.vim, src/INSTALLvms.txt,
+ src/Make_vms.mms, src/option.c, src/os_unix.c, src/os_vms_conf.h
+
+Patch 6.0.028
+Problem: Can't compile without +virtualedit and with +visualextra. (Geza
+ Lakner)
+Solution: Add an #ifdef for +virtualedit.
+Files: src/ops.c
+
+Patch 6.0.029
+Problem: When making a change in line 1, then in line 2 and then deleting
+ line 1, undo info could be wrong. Only when the changes are undone
+ at once. (Gerhard Hochholzer)
+Solution: When not saving a line for undo because it was already done
+ before, remember for which entry the last line must be computed.
+ Added ue_getbot_entry pointer for this. When the number of lines
+ changes, adjust the position of newer undo entries.
+Files: src/structs.h, src/undo.c
+
+Patch 6.0.030
+Problem: Using ":source! file" doesn't work inside a loop or after
+ ":argdo". (Pavol Juhas)
+Solution: Execute the commands in the file right away, do not let the main
+ loop do it.
+Files: src/ex_cmds2.c, src/ex_docmd.c, src/getchar.c, src/globals.h,
+ src/proto/ex_docmd.pro, src/proto/getchar.pro
+
+Patch 6.0.031
+Problem: Nextstep doesn't have setenv() or putenv(). (John Beppu)
+Solution: Move putenv() from pty.c to misc2.c
+Files: src/misc2.c, src/pty.c
+
+Patch 6.0.032
+Problem: When changing a setting that affects all folds, they are not
+ displayed immediately.
+Solution: Set the redraw flag in foldUpdateAll().
+Files: src/fold.c
+
+Patch 6.0.033
+Problem: Using 'wildmenu' on MS-Windows, file names that include a space
+ are only displayed starting with that space. (Xie Yuheng)
+Solution: Don't recognize a backslash before a space as a path separator.
+Files: src/screen.c
+
+Patch 6.0.034
+Problem: Calling searchpair() with three arguments could result in a crash
+ or strange error message. (Kalle Bjorklid)
+Solution: Don't use the fifth argument when there is no fourth argument.
+Files: src/eval.c
+
+Patch 6.0.035
+Problem: The menu item Edit/Global_Settings/Toggle_Toolbar doesn't work
+ when 'ignorecase' is set. (Allen Castaban)
+Solution: Always match case when checking if a flag is already present in
+ 'guioptions'.
+Files: runtime/menu.vim
+
+Patch 6.0.036
+Problem: OS/2, MS-DOS and MS-Windows: Using a path that starts with a
+ slash in 'tags' doesn't work as expected. (Mathias Koehrer)
+Solution: Only use the drive, not the whole path to the current directory.
+ Also make it work for "c:dir/file".
+Files: src/misc2.c
+
+Patch 6.0.037
+Problem: When the user has set "did_install_syntax_menu" to avoid the
+ default Syntax menu it still appears. (Virgilio)
+Solution: Don't add the three default items when "did_install_syntax_menu"
+ is set.
+Files: runtime/menu.vim
+
+Patch 6.0.038
+Problem: When 'selection' is "exclusive", deleting a block of text at the
+ end of a line can leave the cursor beyond the end of the line.
+Solution: Correct the cursor position.
+Files: src/ops.c
+
+Patch 6.0.039
+Problem: "gP" leaves the cursor in the wrong position when 'virtualedit' is
+ used. Using "c" in blockwise Visual mode leaves the cursor in a
+ strange position.
+Solution: For "gP" reset the "coladd" field for the '] mark. For "c" leave
+ the cursor on the last inserted character.
+Files: src/ops.c
+
+Patch 6.0.040
+Problem: When 'fileencoding' is invalid and writing fails because of
+ this, the original file is gone. (Eric Carlier)
+Solution: Restore the original file from the backup.
+Files: src/fileio.c
+
+Patch 6.0.041
+Problem: Using ":language messages en" when LC_MESSAGES is undefined
+ results in setting LC_CTYPE. (Eric Carlier)
+Solution: Set $LC_MESSAGES instead.
+Files: src/ex_cmds2.c
+
+Patch 6.0.042
+Problem: ":mksession" can't handle file names with a space.
+Solution: Escape special characters in file names with a backslash.
+Files: src/ex_docmd.c
+
+Patch 6.0.043
+Problem: Patch 6.0.041 was wrong.
+Solution: Use mch_getenv() instead of vim_getenv().
+Files: src/ex_cmds2.c
+
+Patch 6.0.044
+Problem: Using a "containedin" list for a syntax item doesn't work for an
+ item that doesn't have a "contains" argument. Also, "containedin"
+ doesn't ignore a transparent item. (Timo Frenay)
+Solution: When there is a "containedin" argument somewhere, always check for
+ contained items. Don't check for the transparent item but the
+ item it's contained in.
+Files: src/structs.h, src/syntax.c
+
+Patch 6.0.045
+Problem: After creating a fold with a Visual selection, another window
+ with the same buffer still has inverted text. (Sami Salonen)
+Solution: Redraw the inverted text.
+Files: src/normal.c
+
+Patch 6.0.046
+Problem: When getrlimit() returns an 8 byte number the check for running
+ out of stack may fail. (Anthony Meijer)
+Solution: Skip the stack check if the limit doesn't fit in a long.
+Files: src/auto/configure, src/config.h.in, src/configure.in,
+ src/os_unix.c
+
+Patch 6.0.047
+Problem: Using a regexp with "\(\)" inside a "\%[]" item causes a crash.
+ (Samuel Lacas)
+Solution: Don't allow nested atoms inside "\%[]".
+Files: src/regexp.c
+
+Patch 6.0.048
+Problem: Win32: In the console the mouse doesn't always work correctly.
+ Sometimes after getting focus a mouse movement is interpreted like
+ a button click.
+Solution: Use a different function to obtain the number of mouse buttons.
+ Avoid recognizing a button press from undefined bits. (Vince Negri)
+Files: src/os_win32.c
+
+Patch 6.0.049
+Problem: When using evim the intro screen is misleading. (Adrian Nagle)
+Solution: Mention whether 'insertmode' is set and the menus to be used.
+Files: runtime/menu.vim, src/version.c
+
+Patch 6.0.050
+Problem: UTF-8: "viw" doesn't include non-ASCII characters before the
+ cursor. (Bertilo Wennergren)
+Solution: Use dec_cursor() instead of decrementing the column number.
+Files: src/search.c
+
+Patch 6.0.051
+Problem: UTF-8: Using CTRL-R on the command line doesn't insert composing
+ characters. (Ron Aaron)
+Solution: Also include the composing characters and fix redrawing them.
+Files: src/ex_getln.c, src/ops.c
+
+Patch 6.0.052
+Problem: The check for rlim_t in patch 6.0.046 does not work on some
+ systems. (Zdenek Sekera)
+Solution: Also look in sys/resource.h for rlim_t.
+Files: src/auto/configure, src/configure.in
+
+Patch 6.0.053 (extra)
+Problem: Various problems with QNX.
+Solution: Minor fix for configure. Switch on terminal clipboard support in
+ main.c. Fix "pterm" mouse support. os_qnx.c didn't build without
+ photon. (Julian Kinraid)
+Files: src/auto/configure, src/configure.in, src/gui_photon.c,
+ src/main.c, src/misc2.c, src/option.h, src/os_qnx.c, src/os_qnx.h,
+ src/syntax.c
+
+Patch 6.0.054
+Problem: When using mswin.vim, CTRL-V pastes a block of text like it is
+ normal text. Using CTRL-V in blockwise Visual mode leaves "x"
+ characters behind.
+Solution: Make CTRL-V work as it should. Do the same for the Paste menu
+ entries.
+Files: runtime/menu.vim, runtime/mswin.vim
+
+Patch 6.0.055
+Problem: GTK: The selection isn't copied the first time.
+Solution: Own the selection at the right moment.
+Files: src/gui_gtk_x11.c
+
+Patch 6.0.056
+Problem: Using "CTRL-O cw" in Insert mode results in a nested Insert mode.
+ <Esc> doesn't leave Insert mode then.
+Solution: Only use nested Insert mode when 'insertmode' is set or when a
+ mapping is used.
+Files: src/normal.c
+
+Patch 6.0.057
+Problem: Using ":wincmd g}" in a function doesn't work. (Gary Holloway)
+Solution: Execute the command directly, instead of putting it in the
+ typeahead buffer.
+Files: src/normal.c, src/proto/normal.pro, src/window.c
+
+Patch 6.0.058
+Problem: When a Cursorhold autocommand moved the cursor, the ruler wasn't
+ updated. (Bohdan Vlasyuk)
+Solution: Update the ruler after executing the autocommands.
+Files: src/gui.c
+
+Patch 6.0.059
+Problem: Highlighting for 'hlsearch' isn't visible in lines that are
+ highlighted for diff highlighting. (Gary Holloway)
+Solution: Let 'hlsearch' highlighting overrule diff highlighting.
+Files: src/screen.c
+
+Patch 6.0.060
+Problem: Motif: When the tooltip is to be popped up, Vim crashes.
+ (Gary Holloway)
+Solution: Check for a NULL return value from gui_motif_fontset2fontlist().
+Files: src/gui_beval.c
+
+Patch 6.0.061
+Problem: The toolbar buttons to load and save a session do not correctly
+ use v:this_session.
+Solution: Check for v:this_session to be empty instead of existing.
+Files: runtime/menu.vim
+
+Patch 6.0.062
+Problem: Crash when 'verbose' is > 3 and using ":shell". (Yegappan
+ Lakshmanan)
+Solution: Avoid giving a NULL pointer to printf(). Also output a newline
+ and switch the cursor on.
+Files: src/misc2.c
+
+Patch 6.0.063
+Problem: When 'cpoptions' includes "$", using "cw" to type a ')' on top of
+ the "$" doesn't update syntax highlighting after it.
+Solution: Stop displaying the "$" when typing a ')' in its position.
+Files: src/search.c
+
+Patch 6.0.064 (extra)
+Problem: The NSIS install script doesn't work with newer versions of NSIS.
+ The diff feature doesn't work when there isn't a good diff.exe on
+ the system.
+Solution: Replace the GetParentDir instruction by a user function.
+ Fix a few cosmetic problems. Use defined constants for the
+ version number, so that it's defined in one place only.
+ Only accept the install directory when it ends in "vim".
+ (Eduardo Fernandez)
+ Add a diff.exe and use it from the default _vimrc.
+Files: nsis/gvim.nsi, nsis/README.txt, src/dosinst.c
+
+Patch 6.0.065
+Problem: When using ":normal" in 'indentexpr' it may use redo characters
+ before its argument. (Neil Bird)
+Solution: Save and restore the stuff buffer in ex_normal().
+Files: src/ex_docmd.c, src/getchar.c, src/globals.h, src/structs.h
+
+Patch 6.0.066
+Problem: Sometimes undo for one command is split into two undo actions.
+ (Halim Salman)
+Solution: Don't set the undo-synced flag when reusing a line that was
+ already saved for undo.
+Files: src/undo.c
+
+Patch 6.0.067
+Problem: if_xcmdsrv.c doesn't compile on systems where fd_set isn't defined
+ in the usual header file (e.g., AIX). (Mark Waggoner)
+Solution: Include sys/select.h in if_xcmdsrv.c for systems that have it.
+Files: src/if_xcmdsrv.c
+
+Patch 6.0.068
+Problem: When formatting a Visually selected area with "gq" and the number
+ of lines increases the last line may not be redrawn correctly.
+ (Yegappan Lakshmanan)
+Solution: Correct the area to be redrawn for inserted/deleted lines.
+Files: src/ops.c
+
+Patch 6.0.069
+Problem: Using "K" on a word that includes a "!" causes a "No previous
+ command" error, because the "!" is expanded. (Craig Jeffries)
+Solution: Put a backslash before the "!".
+Files: src/normal.c
+
+Patch 6.0.070
+Problem: Win32: The error message for a failed dynamic linking of a Perl,
+ Ruby, Tcl and Python library is unclear about what went wrong.
+Solution: Give the name of the library or function that could not be loaded.
+ Also for the iconv and gettext libraries when 'verbose' is set.
+Files: src/eval.c, src/if_perl.xs, src/if_python.c, src/if_ruby.c,
+ src/if_tcl.c, src/mbyte.c, src/os_win32.c, src/proto/if_perl.pro,
+ src/proto/if_python.pro, src/proto/if_ruby.pro,
+ src/proto/if_tcl.pro, src/proto/mbyte.pro
+
+Patch 6.0.071
+Problem: The "iris-ansi" builtin termcap isn't very good.
+Solution: Fix the wrong entries. (David Harrison)
+Files: src/term.c
+
+Patch 6.0.072
+Problem: When 'lazyredraw' is set, a mapping that stops Visual mode, moves
+ the cursor and starts Visual mode again causes a redraw problem.
+ (Brian Silverman)
+Solution: Redraw both the old and the new Visual area when necessary.
+Files: src/normal.c, src/screen.c
+
+Patch 6.0.073 (extra)
+Problem: DJGPP: When using CTRL-Z to start a shell, the prompt is halfway
+ the text. (Volker Kiefel)
+Solution: Position the system cursor before starting the shell.
+Files: src/os_msdos.c
+
+Patch 6.0.074
+Problem: When using "&" in a substitute string a multibyte character with
+ a trailbyte 0x5c is not handled correctly.
+Solution: Recognize multibyte characters inside the "&" part. (Muraoka Taro)
+Files: src/regexp.c
+
+Patch 6.0.075
+Problem: When closing a horizontally split window while 'eadirection' is
+ "hor" another horizontally split window is still resized. (Aron
+ Griffis)
+Solution: Only resize windows in the same top frame as the window that is
+ split or closed.
+Files: src/main.c, src/proto/window.pro, src/window.c
+
+Patch 6.0.076
+Problem: Warning for wrong pointer type when compiling.
+Solution: Use char instead of char_u pointer.
+Files: src/version.c
+
+Patch 6.0.077
+Problem: Patch 6.0.075 was incomplete.
+Solution: Fix another call to win_equal().
+Files: src/option.c
+
+Patch 6.0.078
+Problem: Using "daw" at the end of a line on a single-character word didn't
+ include the white space before it. At the end of the file it
+ didn't work at all. (Gavin Sinclair)
+Solution: Include the white space before the word.
+Files: src/search.c
+
+Patch 6.0.079
+Problem: When "W" is in 'cpoptions' and 'backupcopy' is "no" or "auto", can
+ still overwrite a read-only file, because it's renamed. (Gary
+ Holloway)
+Solution: Add a check for a read-only file before renaming the file to
+ become the backup.
+Files: src/fileio.c
+
+Patch 6.0.080
+Problem: When using a session file that has the same file in two windows,
+ the fileinfo() call in do_ecmd() causes a scroll and a hit-enter
+ prompt. (Robert Webb)
+Solution: Don't scroll this message when 'shortmess' contains 'O'.
+Files: src/ex_cmds.c
+
+Patch 6.0.081
+Problem: After using ":saveas" the new buffer name is added to the Buffers
+ menu with a wrong number. (Chauk-Mean Proum)
+Solution: Trigger BufFilePre and BufFilePost events for the renamed buffer
+ and BufAdd for the old name (which is with a new buffer).
+Files: src/ex_cmds.c
+
+Patch 6.0.082
+Problem: When swapping screens in an xterm and there is an (error) message
+ from the vimrc script, the shell prompt is after the message.
+Solution: Output a newline when there was output on the alternate screen.
+ Also when starting the GUI.
+Files: src/main.c
+
+Patch 6.0.083
+Problem: GTK: When compiled without menu support the buttons in a dialog
+ don't have any text. (Erik Edelmann)
+Solution: Add the text also when GTK_USE_ACCEL isn't defined. And define
+ GTK_USE_ACCEL also when not using menus.
+Files: src/gui_gtk.c
+
+Patch 6.0.084
+Problem: UTF-8: a "r" command with an argument that is a keymap for a
+ character with a composing character can't be repeated with ".".
+ (Raphael Finkel)
+Solution: Add the composing characters to the redo buffer.
+Files: src/normal.c
+
+Patch 6.0.085
+Problem: When 'mousefocus' is set, using "s" to go to Insert mode and then
+ moving the mouse pointer to another window stops Insert mode,
+ while this doesn't happen with "a" or "i". (Robert Webb)
+Solution: Reset finish_op before calling edit().
+Files: src/normal.c
+
+Patch 6.0.086
+Problem: When using "gu" the message says "~ed".
+Solution: Make the message say "changed".
+Files: src/ops.c
+
+Patch 6.0.087 (lang)
+Problem: Message translations are incorrect, which may cause a crash.
+ (Peter Figura)
+ The Turkish translations needed more work and the maintainer
+ didn't have time.
+Solution: Fix order of printf arguments. Remove %2$d constructs.
+ Add "-v" to msgfmt to get a warning for wrong translations.
+ Don't install the Turkish translations for now.
+ Update a few more translations.
+Files: src/po/Makefile, src/po/af.po, src/po/cs.po, src/po/cs.cp1250.po,
+ src/po/de.po, src/po/es.po, src/po/fr.po, src/po/it.po,
+ src/po/ja.po, src/po/ja.sjis.po, src/po/ko.po, src/po/pl.po,
+ src/po/sk.po, src/po/uk.po, src/po/zh_CN.UTF-8.po,
+ src/po/zh_CN.cp936.po, src/po/zh_CN.po, src/po/zh_TW.po
+
+Patch 6.0.088
+Problem: "." doesn't work after using "rx" in Visual mode. (Charles
+ Campbell)
+Solution: Also store the replacement character in the redo buffer.
+Files: src/normal.c
+
+Patch 6.0.089
+Problem: In a C file, using "==" to align a line starting with "* " after
+ a line with "* -" indents one space too few. (Piet Delport)
+Solution: Align with the previous line if the comment-start-string matches
+ there.
+Files: src/misc1.c
+
+Patch 6.0.090
+Problem: When a wrapping line does not fit in a window and 'scrolloff' is
+ bigger than half the window height, moving the cursor left or
+ right causes the screen to flash badly. (Lubomir Host)
+Solution: When there is not enough room to show 'scrolloff' screen lines and
+ near the end of the line, show the end of the line.
+Files: src/move.c
+
+Patch 6.0.091
+Problem: Using CTRL-O in Insert mode, while 'virtualedit' is "all" and the
+ cursor is after the end-of-line, moves the cursor left. (Yegappan
+ Lakshmanan)
+Solution: Keep the cursor in the same position.
+Files: src/edit.c
+
+Patch 6.0.092
+Problem: The explorer plugin doesn't ignore case of 'suffixes' on
+ MS-Windows. (Mike Williams)
+Solution: Match or ignore case as appropriate for the OS.
+Files: runtime/plugin/explorer.vim
+
+Patch 6.0.093
+Problem: When the Tcl library couldn't be loaded dynamically, get an error
+ message when closing a buffer or window. (Muraoka Taro)
+Solution: Only free structures if already using the Tcl interpreter.
+Files: src/if_tcl.c
+
+Patch 6.0.094
+Problem: Athena: When clicking in the horizontal scrollbar Vim crashes.
+ (Paul Ackersviller)
+Solution: Use the thumb size instead of the window pointer of the scrollbar
+ (which is NULL). (David Harrison)
+ Also avoid that scrolling goes the wrong way in a narrow window.
+Files: src/gui_athena.c
+
+Patch 6.0.095
+Problem: Perl: Deleting lines may leave the cursor beyond the end of the
+ file.
+Solution: Check the cursor position after deleting a line. (Serguei)
+Files: src/if_perl.xs
+
+Patch 6.0.096
+Problem: When ":saveas fname" fails because the file already exists, the
+ file name is changed anyway and a following ":w" will overwrite
+ the file. (Eric Carlier)
+Solution: Don't change the file name if the file already exists.
+Files: src/ex_cmds.c
+
+Patch 6.0.097
+Problem: Re-indenting in Insert mode with CTRL-F may cause a crash with a
+ multibyte encoding.
+Solution: Avoid using a character before the start of a line. (Sergey
+ Vlasov)
+Files: src/edit.c
+
+Patch 6.0.098
+Problem: GTK: When using Gnome the "Search" and "Search and Replace" dialog
+ boxes are not translated.
+Solution: Define ENABLE_NLS before including gnome.h. (Eduardo Fernandez)
+Files: src/gui_gtk.c, src/gui_gtk_x11.c
+
+Patch 6.0.099
+Problem: Cygwin: When running Vi compatible MS-DOS line endings cause
+ trouble.
+Solution: Make the default for 'fileformats' "unix,dos" in Vi compatible
+ mode. (Michael Schaap)
+Files: src/option.h
+
+Patch 6.0.100
+Problem: ":badd +0 test%file" causes a crash.
+Solution: Take into account that the "+0" is NUL terminated when allocating
+ room for replacing the "%".
+Files: src/ex_docmd.c
+
+Patch 6.0.101
+Problem: ":mksession" doesn't restore editing a file that has a '#' or '%'
+ in its name. (Wolfgang Blankenburg)
+Solution: Put a backslash before the '#' and '%'.
+Files: src/ex_docmd.c
+
+Patch 6.0.102
+Problem: When changing folds the cursor may appear halfway a closed fold.
+ (Nam SungHyun)
+Solution: Set w_cline_folded correctly. (Yasuhiro Matsumoto)
+Files: src/move.c
+
+Patch 6.0.103
+Problem: When using 'scrollbind' a large value of 'scrolloff' will make the
+ scroll binding stop near the end of the file. (Coen Engelbarts)
+Solution: Don't use 'scrolloff' when limiting the topline for scroll
+ binding. (Dany StAmant)
+Files: src/normal.c
+
+Patch 6.0.104
+Problem: Multi-byte: When '$' is in 'cpoptions', typing a double-wide
+ character that overwrites the left half of an old double-wide
+ character causes a redraw problem and the cursor stops blinking.
+Solution: Clear the right half of the old character. (Yasuhiro Matsumoto)
+Files: src/edit.c, src/screen.c
+
+Patch 6.0.105
+Problem: Multi-byte: In a window of one column wide, with syntax
+ highlighting enabled a crash might happen.
+Solution: Skip getting the syntax attribute when the character doesn't fit
+ anyway. (Yasuhiro Matsumoto)
+Files: src/screen.c
+
+Patch 6.0.106 (extra)
+Problem: Win32: When the printer font is wrong, there is no error message.
+Solution: Give an appropriate error message. (Yasuhiro Matsumoto)
+Files: src/os_mswin.c
+
+Patch 6.0.107 (extra)
+Problem: VisVim: When editing another file, a modified file may be written
+ unexpectedly and without warning.
+Solution: Split the window if a file was modified.
+Files: VisVim/Commands.cpp
+
+Patch 6.0.108
+Problem: When using folding could try displaying line zero, resulting in an
+ error for a NULL pointer.
+Solution: Stop decrementing w_topline when the first line of a window is in
+ a closed fold.
+Files: src/window.c
+
+Patch 6.0.109
+Problem: XIM: When the input method is enabled, repeating an insertion with
+ "." disables it. (Marcel Svitalsky)
+Solution: Don't store the input method status when a command comes from the
+ stuff buffer.
+Files: src/ui.c
+
+Patch 6.0.110
+Problem: Using undo after executing "OxjAxkdd" from a register in
+ an empty buffer gives an error message. (Gerhard Hochholzer)
+Solution: Don't adjust the bottom line number of an undo block when it's
+ zero. Add a test for this problem.
+Files: src/undo.c, src/testdir/test20.in, src/testdir/test20.ok
+
+Patch 6.0.111
+Problem: The virtcol() function doesn't take care of 'virtualedit'.
+Solution: Add the column offset when needed. (Yegappan Lakshmanan)
+Files: src/eval.c
+
+Patch 6.0.112
+Problem: The explorer plugin doesn't sort directories with a space or
+ special character after a directory with a shorter name.
+Solution: Ignore the trailing slash when comparing directory names. (Mike
+ Williams)
+Files: runtime/plugin/explorer.vim
+
+Patch 6.0.113
+Problem: ":edit ~/fname" doesn't work if $HOME includes a space. Also,
+ expanding wildcards with the shell may fail. (John Daniel)
+Solution: Escape spaces with a backslash when needed.
+Files: src/ex_docmd.c, src/misc1.c, src/proto/misc1.pro, src/os_unix.c
+
+Patch 6.0.114
+Problem: Using ":p" with fnamemodify() didn't expand "~/" or "~user/" to a
+ full path. For Win32 the current directory was prepended.
+ (Michael Geddes)
+Solution: Expand the home directory.
+Files: src/eval.c
+
+Patch 6.0.115 (extra)
+Problem: Win32: When using a dialog with a textfield it cannot scroll the
+ text.
+Solution: Add ES_AUTOHSCROLL to the textfield style. (Pedro Gomes)
+Files: src/gui_w32.c
+
+Patch 6.0.116 (extra)
+Problem: MS-Windows NT/2000/XP: filewritable() doesn't work correctly for
+ filesystems that use ACLs.
+Solution: Use ACL functions to check if a file is writable. (Mike Williams)
+Files: src/eval.c, src/macros.h, src/os_win32.c, src/proto/os_win32.pro
+
+Patch 6.0.117 (extra)
+Problem: Win32: when disabling the menu, "set lines=999" doesn't use all
+ the available screen space.
+Solution: Don't subtract the fixed caption height but the real menu height
+ from the available screen space. Also: Avoid recursion in
+ gui_mswin_get_menu_height().
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 6.0.118
+Problem: When $TMPDIR is a relative path, the temp directory is missing a
+ trailing slash and isn't deleted when Vim exits. (Peter Holm)
+Solution: Add the slash after expanding the directory to an absolute path.
+Files: src/fileio.c
+
+Patch 6.0.119 (depends on patch 6.0.116)
+Problem: VMS: filewritable() doesn't work properly.
+Solution: Use the same method as for Unix. (Zoltan Arpadffy)
+Files: src/eval.c
+
+Patch 6.0.120
+Problem: The conversion to html isn't compatible with XHTML.
+Solution: Quote the values. (Jess Thrysoee)
+Files: runtime/syntax/2html.vim
+
+Patch 6.0.121 (extra) (depends on patch 6.0.116)
+Problem: Win32: After patch 6.0.116 Vim doesn't compile with mingw32.
+Solution: Add an #ifdef HAVE_ACL.
+Files: src/os_win32.c
+
+Patch 6.0.122 (extra)
+Problem: Win16: Same resize problems as patch 6.0.117 fixed for Win32. And
+ dialog textfield problem from patch 6.0.115.
+Solution: Set old_menu_height only when used. Add ES_AUTOHSCROLL flag.
+ (Vince Negri)
+Files: src/gui_w16.c
+
+Patch 6.0.123 (depends on patch 6.0.119)
+Problem: Win16: Compilation problems.
+Solution: Move "&&" to other lines. (Vince Negri)
+Files: src/eval.c
+
+Patch 6.0.124
+Problem: When using a ":substitute" command that starts with "\="
+ (evaluated as an expression), "~" was still replaced with the
+ previous substitute string.
+Solution: Skip the replacement when the substitute string starts with "\=".
+ Also adjust the documentation about doubling backslashes.
+Files: src/ex_cmds.c, runtime/doc/change.txt
+
+Patch 6.0.125 (extra)
+Problem: Win32: When using the multi_byte_ime feature pressing the shift
+ key would be handled as if a character was entered, thus mappings
+ with a shifted key didn't work. (Charles Campbell)
+Solution: Ignore pressing the shift, control and alt keys.
+Files: src/os_win32.c
+
+Patch 6.0.126
+Problem: The python library was always statically linked.
+Solution: Link the python library dynamically. (Matthias Klose)
+Files: src/auto/configure, src/configure.in
+
+Patch 6.0.127
+Problem: When using a terminal that swaps screens and the Normal background
+ color has a different background, using an external command may
+ cause the color of the wrong screen to be changed. (Mark Waggoner)
+Solution: Don't call screen_stop_highlight() in stoptermcap().
+Files: src/term.c
+
+Patch 6.0.128
+Problem: When moving a vertically split window to the far left or right,
+ the scrollbars are not adjusted. (Scott E Lee) When 'mousefocus'
+ is set the mouse pointer wasn't adjusted.
+Solution: Adjust the scrollbars and the mouse pointer.
+Files: src/window.c
+
+Patch 6.0.129
+Problem: When using a very long file name, ":ls" (repeated a few times)
+ causes a crash. Test with "vim `perl -e 'print "A"x1000'`".
+ (Tejeda)
+Solution: Terminate a string before getting its length in buflist_list().
+Files: src/buffer.c
+
+Patch 6.0.130
+Problem: When using ":cprev" while the error window is open, and the new
+ line at the top wraps, the window isn't correctly drawn.
+ (Yegappan Lakshmanan)
+Solution: When redrawing the topline don't scroll twice.
+Files: src/screen.c
+
+Patch 6.0.131
+Problem: When using bufname() and there are two matches for listed buffers
+ and one match for an unlisted buffer, the unlisted buffer is used.
+ (Aric Blumer)
+Solution: When there is a match with a listed buffer, don't check for
+ unlisted buffers.
+Files: src/buffer.c
+
+Patch 6.0.132
+Problem: When setting 'iminsert' in the vimrc and using an xterm with two
+ screens the ruler is drawn in the wrong screen. (Igor Goldenberg)
+Solution: Only draw the ruler when using the right screen.
+Files: src/option.c
+
+Patch 6.0.133
+Problem: When opening another buffer while 'keymap' is set and 'iminsert'
+ is zero, 'iminsert' is set to one unexpectedly. (Igor Goldenberg)
+Solution: Don't set 'iminsert' as a side effect of defining a ":lmap"
+ mapping. Only do that when 'keymap' is set.
+Files: src/getchar.c, src/option.c
+
+Patch 6.0.134
+Problem: When completing ":set tags=" a path with an embedded space causes
+ the completion to stop. (Sektor van Skijlen)
+Solution: Escape spaces with backslashes, like for ":set path=". Also take
+ backslashes into account when searching for the start of the path
+ to complete (e.g., for 'backupdir' and 'cscopeprg').
+Files: src/ex_docmd.c, src/ex_getln.c, src/option.c, src/structs.h
+
+Patch 6.0.135
+Problem: Menus that are not supposed to do anything used "<Nul>", which
+ still produced an error beep.
+ When CTRL-O is mapped for Insert mode, ":amenu" commands didn't
+ work in Insert mode.
+ Menu language falls back to English when $LANG ends in "@euro".
+Solution: Use "<Nop>" for a menu item that doesn't do anything, just like
+ mappings.
+ Use ":anoremenu" instead of ":amenu".
+ Ignore "@euro" in the locale name.
+Files: runtime/makemenu.vim, runtime/menu.vim, src/menu.c
+
+Patch 6.0.136
+Problem: When completing in Insert mode, a mapping could be unexpectedly
+ applied.
+Solution: Don't use mappings when checking for a typed character.
+Files: src/edit.c
+
+Patch 6.0.137
+Problem: GUI: When using the find or find/replace dialog from Insert mode,
+ the input mode is stopped.
+Solution: Don't use the input method status when the main window doesn't
+ have focus.
+Files: src/ui.c
+
+Patch 6.0.138
+Problem: GUI: When using the find or find/replace dialog from Insert mode,
+ the text is inserted when CTRL-O is mapped. (Andre Pang)
+ When opening the dialog again, a whole word search isn't
+ recognized.
+ When doing "replace all" a whole word search was never done.
+Solution: Don't put a search or replace command in the input buffer,
+ execute it directly.
+ Recognize "\<" and "\>" after removing "\V".
+ Add "\<" and "\>" also for "replace all".
+Files: src/gui.c
+
+Patch 6.0.139
+Problem: When stopping 'wildmenu' completion, the statusline of the
+ bottom-left vertically split window isn't redrawn. (Yegappan
+ Lakshmanan)
+Solution: Redraw all the bottom statuslines.
+Files: src/ex_getln.c, src/proto/screen.pro, src/screen.c
+
+Patch 6.0.140
+Problem: Memory allocated for local mappings and abbreviations is leaked
+ when the buffer is wiped out.
+Solution: Clear the local mappings when deleting a buffer.
+Files: src/buffer.c, src/getchar.c, src/proto/getchar.pro, src/vim.h
+
+Patch 6.0.141
+Problem: When using ":enew" in an empty buffer, some buffer-local things
+ are not cleared. b:keymap_name is not set.
+Solution: Clear user commands and mappings local to the buffer when re-using
+ the current buffer. Reload the keymap.
+Files: src/buffer.c
+
+Patch 6.0.142
+Problem: When Python is linked statically, loading dynamic extensions might
+ fail.
+Solution: Add an extra linking flag when needed. (Andrew Rodionoff)
+Files: src/configure.in, src/auto/configure
+
+Patch 6.0.143
+Problem: When a syntax item includes a line break in a pattern, the syntax
+ may not be updated properly when making a change.
+Solution: Add the "linebreaks" argument to ":syn sync".
+Files: runtime/doc/syntax.txt, src/screen.c, src/structs.h, src/syntax.c
+
+Patch 6.0.144
+Problem: After patch 6.0.088 redoing "veU" doesn't work.
+Solution: Don't add the "U" to the redo buffer, it will be used as an undo
+ command.
+Files: src/normal.c
+
+Patch 6.0.145
+Problem: When Vim can't read any input it might get stuck. When
+ redirecting stdin and stderr Vim would not read commands from a
+ file. (Servatius Brandt)
+Solution: When repeatedly trying to read a character when it's not possible,
+ exit Vim. When stdin and stderr are not a tty, still try reading
+ from them, but don't do a blocking wait.
+Files: src/ui.c
+
+Patch 6.0.146
+Problem: When 'statusline' contains "%{'-'}" this results in a zero.
+ (Milan Vancura)
+Solution: Don't handle numbers with a minus as a number, they were not
+ displayed anyway.
+Files: src/buffer.c
+
+Patch 6.0.147
+Problem: It's not easy to mark a Vim version as being modified. The new
+ license requires this.
+Solution: Add the --modified-by argument to configure and the MODIFIED_BY
+ define. It's used in the intro screen and the ":version" output.
+Files: src/auto/configure, src/configure.in, src/config.h.in,
+ src/feature.h, src/version.c
+
+Patch 6.0.148
+Problem: After "p" in an empty line, `[ goes to the second character.
+ (Kontra Gergely)
+Solution: Don't increment the column number in an empty line.
+Files: src/ops.c
+
+Patch 6.0.149
+Problem: The pattern "\(.\{-}\)*" causes a hang. When using a search
+ pattern that causes a stack overflow to be detected Vim could
+ still hang.
+Solution: Correctly report "operand could be empty" when using "\{-}".
+ Check for "out_of_stack" inside loops to avoid a hang.
+Files: src/regexp.c
+
+Patch 6.0.150
+Problem: When using a multibyte encoding, patch 6.0.148 causes "p" to work
+ like "P". (Sung-Hyun Nam)
+Solution: Compute the byte length of a multibyte character.
+Files: src/ops.c
+
+Patch 6.0.151
+Problem: Redrawing the status line and ruler can be wrong when it contains
+ multibyte characters.
+Solution: Use character width and byte length correctly. (Yasuhiro Matsumoto)
+Files: src/screen.c
+
+Patch 6.0.152
+Problem: strtrans() could hang on an illegal UTF-8 byte sequence.
+Solution: Skip over illegal bytes. (Yasuhiro Matsumoto)
+Files: src/charset.c
+
+Patch 6.0.153
+Problem: When using (illegal) double-byte characters and Vim syntax
+ highlighting Vim can crash. (Yasuhiro Matsumoto)
+Solution: Increase a pointer over a character instead of a byte.
+Files: src/regexp.c
+
+Patch 6.0.154
+Problem: MS-DOS and MS-Windows: The menu entries for xxd don't work when
+ there is no xxd in the path.
+ When converting back from Hex the filetype may remain "xxd" if it
+ is not detected.
+Solution: When xxd is not in the path use the one in the runtime directory,
+ where the install program has put it.
+ Clear the 'filetype' option before detecting the new value.
+Files: runtime/menu.vim
+
+Patch 6.0.155
+Problem: Mac: compilation problems in ui.c after patch 6.0.145. (Axel
+ Kielhorn)
+Solution: Don't call mch_inchar() when NO_CONSOLE is defined.
+Files: src/ui.c
+
+Patch 6.0.156
+Problem: Starting Vim with the -b argument and two files, ":next" doesn't
+ set 'binary' in the second file, like Vim 5.7. (Norman Diamond)
+Solution: Set the global value for 'binary'.
+Files: src/option.c
+
+Patch 6.0.157
+Problem: When defining a user command with "-complete=dir" files will also
+ be expanded. Also, "-complete=mapping" doesn't appear to work.
+ (Michael Naumann)
+Solution: Use the expansion flags defined with the user command.
+ Handle expanding mappings specifically.
+Files: src/ex_docmd.c
+
+Patch 6.0.158
+Problem: When getting the warning for a file being changed outside of Vim
+ and reloading the file, the 'readonly' option is reset, even when
+ the permissions didn't change. (Marcel Svitalsky)
+Solution: Keep 'readonly' set when reloading a file and the permissions
+ didn't change.
+Files: src/fileio.c
+
+Patch 6.0.159
+Problem: Wildcard expansion for ":emenu" also shows separators.
+Solution: Skip menu separators for ":emenu", ":popup" and ":tearoff".
+ Also, don't handle ":tmenu" as if it was ":tearoff". And leave
+ out the alternatives with "&" included.
+Files: src/menu.c
+
+Patch 6.0.160
+Problem: When compiling with GCC 3.0.2 and using the "-O2" argument, the
+ optimizer causes a problem that makes Vim crash.
+Solution: Add a configure check to avoid "-O2" for this version of gcc.
+Files: src/configure.in, src/auto/configure
+
+Patch 6.0.161 (extra)
+Problem: Win32: Bitmaps don't work with signs.
+Solution: Make it possible to use bitmaps with signs. (Muraoka Taro)
+Files: src/ex_cmds.c, src/feature.h, src/gui_w32.c, src/gui_x11.c,
+ src/proto/gui_w32.pro, src/proto/gui_x11.pro
+
+Patch 6.0.162
+Problem: Client-server: An error message for a wrong expression appears in
+ the server instead of the client.
+Solution: Pass the error message from the server to the client. Also
+ adjust the example code. (Flemming Madsen)
+Files: src/globals.h, src/if_xcmdsrv.c, src/main.c, src/os_mswin.c,
+ src/proto/if_xcmdsrv.pro, src/proto/os_mswin.pro,
+ runtime/doc/eval.txt, runtime/tools/xcmdsrv_client.c
+
+Patch 6.0.163
+Problem: When using a GUI dialog, a file name is sometimes used like it was
+ a directory.
+Solution: Separate path and file name properly.
+ For GTK, Motif and Athena concatenate directory and file name for
+ the default selection.
+Files: src/diff.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/gui_athena.c, src/gui_gtk.c, src/gui_motif.c, src/message.c
+
+Patch 6.0.164
+Problem: After patch 6.0.135 the menu entries for pasting don't work in
+ Insert and Visual mode. (Muraoka Taro)
+Solution: Add <script> to allow script-local mappings.
+Files: runtime/menu.vim
+
+Patch 6.0.165
+Problem: Using --remote and executing locally gives unavoidable error
+ messages.
+Solution: Add --remote-silent and --remote-wait-silent to silently execute
+ locally.
+ For Win32 there was no error message when a server didn't exist.
+Files: src/eval.c, src/if_xcmdsrv.c, src/main.c, src/os_mswin.c,
+ src/proto/if_xcmdsrv.pro, src/proto/os_mswin.pro
+
+Patch 6.0.166
+Problem: GUI: There is no way to avoid dialogs to pop up.
+Solution: Add the 'c' flag to 'guioptions': Use console dialogs. (Yegappan
+ Lakshmanan)
+Files: runtime/doc/options.txt, src/option.h, src/message.c
+
+Patch 6.0.167
+Problem: When 'fileencodings' is "latin2" some characters in the help files
+ are displayed wrong.
+Solution: Force the 'fileencoding' for the help files to be "latin1".
+Files: src/fileio.c
+
+Patch 6.0.168
+Problem: ":%s/\n/#/" doesn't replace at an empty line. (Bruce DeVisser)
+Solution: Don't skip matches after joining two lines.
+Files: src/ex_cmds.c
+
+Patch 6.0.169
+Problem: When run as evim and the GUI can't be started we get stuck in a
+ terminal without menus in Insert mode.
+Solution: Exit when using "evim" and "gvim -y" when the GUI can't be
+ started.
+Files: src/main.c
+
+Patch 6.0.170
+Problem: When printing double-width characters the size of tabs after them
+ is wrong. (Muraoka Taro)
+Solution: Correctly compute the column after a double-width character.
+Files: src/ex_cmds2.c
+
+Patch 6.0.171
+Problem: With 'keymodel' including "startsel", in Insert mode after the end
+ of a line, shift-Left does not move the cursor. (Steve Hall)
+Solution: CTRL-O doesn't move the cursor left, need to do that explicitly.
+Files: src/edit.c
+
+Patch 6.0.172
+Problem: CTRL-Q doesn't replace CTRL-V after CTRL-X in Insert mode while it
+ does in most other situations.
+Solution: Make CTRL-X CTRL-Q work like CTRL-X CTRL-V in Insert mode.
+Files: src/edit.c
+
+Patch 6.0.173
+Problem: When using "P" to insert a line break the cursor remains past the
+ end of the line.
+Solution: Check for the cursor being beyond the end of the line.
+Files: src/ops.c
+
+Patch 6.0.174
+Problem: After using "gd" or "gD" the search direction for "n" may still be
+ backwards. (Servatius Brandt)
+Solution: Reset the search direction to forward.
+Files: src/normal.c, src/search.c, src/proto/search.pro
+
+Patch 6.0.175
+Problem: ":help /\z(\)" doesn't work. (Thomas Koehler)
+Solution: Double the backslashes.
+Files: src/ex_cmds.c
+
+Patch 6.0.176
+Problem: When killed by a signal autocommands are still triggered as if
+ nothing happened.
+Solution: Add the v:dying variable to allow autocommands to work differently
+ when a deadly signal has been trapped.
+Files: src/eval.c, src/os_unix.c, src/vim.h
+
+Patch 6.0.177
+Problem: When 'commentstring' is empty and 'foldmethod' is "marker", "zf"
+ doesn't work. (Thomas S. Urban)
+Solution: Add the marker even when 'commentstring' is empty.
+Files: src/fold.c, src/normal.c
+
+Patch 6.0.178
+Problem: Uninitialized memory read from xp_backslash field.
+Solution: Initialize xp_backslash field properly.
+Files: src/eval.c, src/ex_docmd.c, src/ex_getln.c, src/misc1.c, src/tag.c
+
+Patch 6.0.179
+Problem: Win32: When displaying UTF-8 characters may read uninitialized
+ memory.
+Solution: Add utfc_ptr2len_check_len() to avoid reading past the end of a
+ string.
+Files: src/mbyte.c, src/proto/mbyte.pro, src/gui_w32.c
+
+Patch 6.0.180
+Problem: Expanding environment variables in a string that ends in a
+ backslash could go past the end of the string.
+Solution: Detect the trailing backslash.
+Files: src/misc1.c
+
+Patch 6.0.181
+Problem: When using ":cd dir" memory was leaked.
+Solution: Free the allocated memory. Also avoid an uninitialized memory
+ read.
+Files: src/misc2.c
+
+Patch 6.0.182
+Problem: When using a regexp on multibyte characters, could try to read a
+ character before the start of the line.
+Solution: Don't decrement a pointer to before the start of the line.
+Files: src/regexp.c
+
+Patch 6.0.183
+Problem: Leaking memory when ":func!" redefines a function.
+Solution: Free the function name when it's not used.
+Files: src/eval.c
+
+Patch 6.0.184
+Problem: Leaking memory when expanding option values.
+Solution: Don't always copy the expanded option into allocated memory.
+Files: src/option.c
+
+Patch 6.0.185
+Problem: Crash in Vim when pasting a selection in another application, on a
+ 64 bit machine.
+Solution: Fix the format for an Atom to 32 bits. (Peter Derr)
+Files: src/ui.c
+
+Patch 6.0.186
+Problem: X11: Three warnings when compiling the client-server code.
+Solution: Add a typecast to unsigned char.
+Files: src/if_xcmdsrv.c
+
+Patch 6.0.187
+Problem: "I" in Visual mode and then "u" reports too many changes. (Andrew
+ Stryker)
+ "I" in Visual linewise mode adjusts the indent for no apparent
+ reason.
+Solution: Only save those lines for undo that are changed.
+ Don't change the indent after inserting in Visual linewise mode.
+Files: src/ops.c
+
+Patch 6.0.188
+Problem: Win32: After patch 6.0.161 signs defined in the vimrc file don't
+ work.
+Solution: Initialize the sign icons after initializing the GUI. (Vince
+ Negri)
+Files: src/gui.c, src/gui_x11.c
+
+Patch 6.0.189
+Problem: The size of the Visual area isn't always displayed when scrolling
+ ('ruler' off, 'showcmd' on). Also not when using a search
+ command. (Sylvain Hitier)
+Solution: Redisplay the size of the selection after showing the mode.
+Files: src/screen.c
+
+Patch 6.0.190
+Problem: GUI: when 'mouse' is empty a click with the middle button still
+ moves the cursor.
+Solution: Paste at the cursor position instead of the mouse position.
+Files: src/normal.c
+
+Patch 6.0.191
+Problem: When no servers are available serverlist() gives an error instead
+ of returning an empty string. (Hari Krishna)
+Solution: Don't give an error message.
+Files: src/eval.c
+
+Patch 6.0.192
+Problem: When 'virtualedit' is set, "ylj" goes to the wrong column. (Andrew
+ Nikitin)
+Solution: Reset the flag that w_virtcol is valid when moving the cursor back
+ to the start of the operated area.
+Files: src/normal.c
+
+Patch 6.0.193
+Problem: When 'virtualedit' is set, col(".") after the end of the line
+ should return one extra.
+Solution: Add one to the column.
+Files: src/eval.c
+
+Patch 6.0.194
+Problem: "--remote-silent" tries to send a reply to the client, like it was
+ "--remote-wait".
+Solution: Properly check for the argument.
+Files: src/main.c
+
+Patch 6.0.195
+Problem: When 'virtualedit' is set and a search starts in virtual space
+ ":call search('x')" goes to the wrong position. (Eric Long)
+Solution: Reset coladd when finding a match.
+Files: src/search.c
+
+Patch 6.0.196
+Problem: When 'virtualedit' is set, 'selection' is "exclusive" and visually
+ selecting part of a tab at the start of a line, "x" joins it with
+ the previous line. Also, when the selection spans more than one
+ line the whole tab is deleted.
+Solution: Take coladd into account when adjusting for 'selection' being
+ "exclusive". Also expand a tab into spaces when deleting more
+ than one line.
+Files: src/normal.c, src/ops.c
+
+Patch 6.0.197
+Problem: When 'virtualedit' is set and 'selection' is "exclusive", "v$x"
+ doesn't delete the last character in the line. (Eric Long)
+Solution: Don't reset the inclusive flag. (Helmut Stiegler)
+Files: src/normal.c
+
+Patch 6.0.198
+Problem: When 'virtualedit' is set and 'showbreak' is not empty, moving the
+ cursor over the line break doesn't work properly. (Eric Long)
+Solution: Make getviscol() and getviscol2() use getvvcol() to obtain the
+ virtual cursor position. Adjust coladvance() and oneleft() to
+ skip over the 'showbreak' characters.
+Files: src/edit.c, src/misc2.c
+
+Patch 6.0.199
+Problem: Multi-byte: could use iconv() after calling iconv_end().
+ (Yasuhiro Matsumoto)
+Solution: Stop converting input and output stream after calling iconv_end().
+Files: src/mbyte.c
+
+Patch 6.0.200
+Problem: A script that starts with "#!perl" isn't recognized as a Perl
+ filetype.
+Solution: Ignore a missing path in a script header. Also, speed up
+ recognizing scripts by simplifying the patterns used.
+Files: runtime/scripts.vim
+
+Patch 6.0.201
+Problem: When scrollbinding and doing a long jump, switching windows jumps
+ to another position in the file. Scrolling a few lines at a time
+ is OK. (Johannes Zellner)
+Solution: When setting w_topline reset the flag that indicates w_botline is
+ valid.
+Files: src/diff.c
+
+Patch 6.0.202
+Problem: The "icon=" argument for the menu command to define a toolbar icon
+ with a file didn't work for GTK. (Christian J. Robinson)
+ For Motif and Athena a full path was required.
+Solution: Search the icon file using the specified path. Expand environment
+ variables in the file name.
+Files: src/gui_gtk.c, src/gui_x11.c
+
+Patch 6.0.203
+Problem: Can change 'fileformat' even though 'modifiable' is off.
+ (Servatius Brandt)
+Solution: Correct check for kind of set command.
+Files: src/option.c
+
+Patch 6.0.204
+Problem: ":unlet" doesn't work for variables with curly braces. (Thomas
+ Scott Urban)
+Solution: Handle variable names with curly braces properly. (Vince Negri)
+Files: src/eval.c
+
+Patch 6.0.205 (extra)
+Problem: "gvim -f" still forks when using the batch script to start Vim.
+Solution: Add an argument to "start" to use a foreground session (Michael
+ Geddes)
+Files: src/dosinst.c
+
+Patch 6.0.206
+Problem: Unix: if expanding a wildcard in a file name results in a
+ wildcard character and there are more parts in the path with a
+ wildcard, it is expanded again.
+ Windows: ":edit \[abc]" could never edit the file "[abc]".
+Solution: Don't expand wildcards in already expanded parts.
+ Don't remove backslashes used to escape the special meaning of a
+ wildcard; can edit "[abc]" if '[' is removed from 'isfname'.
+Files: src/misc1.c, src/os_unix.c
+
+Patch 6.0.207 (extra)
+Problem: Win32: The shortcuts and start menu entries let Vim startup in the
+ desktop directory, which is not very useful.
+Solution: Let shortcuts start Vim in $HOME or $HOMEDIR$HOMEPATH.
+Files: src/dosinst.c
+
+Patch 6.0.208
+Problem: GUI: When using a keymap and the cursor is not blinking, CTRL-^ in
+ Insert mode doesn't directly change the cursor color. (Alex
+ Solow)
+Solution: Force a redraw of the cursor after CTRL-^.
+Files: src/edit.c
+
+Patch 6.0.209
+Problem: GUI GTK: After selecting a 'guifont' with the font dialog there
+ are redraw problems for multibyte characters.
+Solution: Separate the font dialog from setting the new font name to avoid
+ that "*" is used to find wide and bold fonts.
+ When redrawing extra characters for the bold trick, take care of
+ UTF-8 characters.
+Files: src/gui.c, src/gui_gtk_x11.c, src/option.c, src/proto/gui.pro,
+ src/proto/gui_gtk_x11.pro
+
+Patch 6.0.210
+Problem: After patch 6.0.167 it's no longer possible to edit a help file in
+ another encoding than latin1.
+Solution: Let the "++enc=" argument overrule the encoding.
+Files: src/fileio.c
+
+Patch 6.0.211
+Problem: When reading a file fails, the buffer is empty, but it might still
+ be possible to write it with ":w" later. The original file is
+ lost then. (Steve Amerige)
+Solution: Set the 'readonly' option for the buffer.
+Files: src/fileio.c
+
+Patch 6.0.212
+Problem: GUI GTK: confirm("foo", "") causes a crash.
+Solution: Don't make a non-existing button the default. Add a default "OK"
+ button if none is specified.
+Files: src/eval.c, src/gui_gtk.c
+
+Patch 6.0.213
+Problem: When a file name contains unprintable characters, CTRL-G and other
+ commands don't work well.
+Solution: Turn unprintable into printable characters. (Yasuhiro Matsumoto)
+Files: src/buffer.c, src/charset.c
+
+Patch 6.0.214
+Problem: When there is a buffer without a name, empty entries appear in the
+ jumplist saved in the viminfo file.
+Solution: Don't write jumplist entries without a file name.
+Files: src/mark.c
+
+Patch 6.0.215
+Problem: After using "/" from Visual mode the Paste menu and Toolbar
+ entries don't work. Pasting with the middle mouse doesn't work
+ and modeless selection doesn't work.
+Solution: Use the command line mode menus and use the mouse like in the
+ command line.
+Files: src/gui.c, src/menu.c, src/ui.c
+
+Patch 6.0.216
+Problem: After reloading a file, displayed in another window than the
+ current one, which was changed outside of Vim the part of the file
+ around the cursor set by autocommands may be displayed, but
+ jumping back to the original cursor position when entering the
+ window again.
+Solution: Restore the topline of the window.
+Files: src/fileio.c
+
+Patch 6.0.217
+Problem: When getting help from a help file that was used before, an empty
+ unlisted buffer remains in the buffer list. (Eric Long)
+Solution: Wipe out the buffer used to do the tag jump from.
+Files: src/buffer.c, src/ex_cmds.c, src/proto/buffer.pro
+
+Patch 6.0.218
+Problem: With explorer plugin: "vim -o filename dirname" doesn't load the
+ explorer window until entering the window.
+Solution: Call s:EditDir() for each window after starting up.
+Files: runtime/plugin/explorer.vim
+
+Patch 6.0.219
+Problem: ":setlocal" and ":setglobal", without arguments, display terminal
+ options. (Zdenek Sekera)
+Solution: Skip terminal options for these two commands.
+Files: src/option.c
+
+Patch 6.0.220
+Problem: After patch 6.0.218 get a beep on startup. (Muraoka Taro)
+Solution: Don't try going to another window when there isn't one.
+Files: runtime/plugin/explorer.vim
+
+Patch 6.0.221
+Problem: When using ":bdel" and all other buffers are unloaded the lowest
+ numbered buffer is jumped to instead of the most recent one. (Dave
+ Cecil)
+Solution: Prefer an unloaded buffer from the jumplist.
+Files: src/buffer.c
+
+Patch 6.0.222
+Problem: When 'virtualedit' is set and using autoindent, pressing Esc after
+ starting a new line leaves behind part of the autoindent. (Helmut
+ Stiegler)
+Solution: After deleting the last char in the line adjust the cursor
+ position in del_bytes().
+Files: src/misc1.c, src/ops.c
+
+Patch 6.0.223
+Problem: When splitting a window that contains the explorer, hitting CR on
+ a file name gives error messages.
+Solution: Set the window variables after splitting the window.
+Files: runtime/plugin/explorer.vim
+
+Patch 6.0.224
+Problem: When 'sidescroll' and 'sidescrolloff' are set in a narrow window
+ the text may jump left-right and the cursor is displayed in the
+ wrong position. (Aric Blumer)
+Solution: When there is not enough room, compute the left column for the
+ window to put the cursor in the middle.
+Files: src/move.c
+
+Patch 6.0.225
+Problem: In Visual mode "gk" gets stuck in a closed fold. (Srinath
+ Avadhanula)
+Solution: Behave differently in a closed fold.
+Files: src/normal.c
+
+Patch 6.0.226
+Problem: When doing ":recover file" get the ATTENTION prompt.
+ After recovering the same file five times get a read error or a
+ crash. (Alex Davis)
+Solution: Set the recoverymode flag before setting the file name.
+ Correct the amount of used memory for the size of block zero.
+Files: src/ex_docmd.c
+
+Patch 6.0.227 (extra)
+Problem: The RISC OS port has several problems.
+Solution: Update the makefile and fix some of the problems. (Andy Wingate)
+Files: src/Make_ro.mak, src/os_riscos.c, src/os_riscos.h,
+ src/proto/os_riscos.pro, src/search.c
+
+Patch 6.0.228
+Problem: After putting text in Visual mode the '] mark is not at the end of
+ the put text.
+ Undo doesn't work properly when putting a word into a Visual
+ selection that spans more than one line.
+Solution: Correct the '] mark for the deleting the Visually selected text.
+ #ifdef code that depends on FEAT_VISUAL properly.
+ Also fix that "d" crossing line boundary puts '[ just before
+ deleted text.
+ Fix undo by saving all deleted lines at once.
+Files: src/ex_docmd.c, src/globals.h, src/normal.c, src/ops.c,
+ src/structs.h, src/vim.h
+
+Patch 6.0.229
+Problem: Multi-byte: With 'm' in 'formatoptions', formatting doesn't break
+ at a multibyte char followed by an ASCII char, and the other way
+ around. (Muraoka Taro)
+ When joining lines a space is inserted between multibyte
+ characters, which is not always wanted.
+Solution: Check for multibyte character before and after the breakpoint.
+ Don't insert a space before or after a multibyte character when
+ joining lines and the 'M' flag is in 'formatoptions'. Don't
+ insert a space between multibyte characters when the 'B' flag is
+ in 'formatoptions'.
+Files: src/edit.c, src/ops.c, src/option.h
+
+Patch 6.0.230
+Problem: The ":" used as a motion after an operator is exclusive, but
+ sometimes it should be inclusive.
+Solution: Make the "v" in between an operator and motion toggle
+ inclusive/exclusive. (Servatius Brandt)
+Files: runtime/doc/motion.txt, src/normal.c
+
+Patch 6.0.231
+Problem: "gd" and "gD" don't work when the variable matches in a comment
+ just above the match to be found. (Servatius Brandt)
+Solution: Continue searching in the first column below the comment.
+Files: src/normal.c
+
+Patch 6.0.232
+Problem: "vim --version" prints on stderr while "vim --help" prints on
+ stdout.
+Solution: Make "vim --version" use stdout.
+Files: runtime/doc/starting.txt, src/globals.h, src/main.c, src/message.c
+
+Patch 6.0.233
+Problem: "\1\{,8}" in a regexp is not allowed, but it should work, because
+ there is an upper limit. (Jim Battle)
+Solution: Allow using "\{min,max}" after an atom that can be empty if there
+ is an upper limit.
+Files: src/regexp.c
+
+Patch 6.0.234
+Problem: It's not easy to set the cursor position without modifying marks.
+Solution: Add the cursor() function. (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 6.0.235
+Problem: When writing a file and renaming the original file to make the
+ backup, permissions could change when setting the owner.
+Solution: Only set the owner when it's needed and set the permissions again
+ afterwards.
+ When 'backupcopy' is "auto" check that the owner and permissions
+ of a newly created file can be set properly.
+Files: src/fileio.c
+
+Patch 6.0.236
+Problem: ":edit" without argument should move cursor to line 1 in Vi
+ compatible mode.
+Solution: Add 'g' flag to 'cpoptions'.
+Files: runtime/doc/options.txt, src/ex_docmd.c, src/option.h
+
+Patch 6.0.237
+Problem: In a C file, using the filetype plugin, re-indenting a comment
+ with two spaces after the middle "*" doesn't align properly.
+Solution: Don't use a middle entry from a start/middle/end to line up with
+ the start of the comment when the start part doesn't match with
+ the actual comment start.
+Files: src/misc1.c
+
+Patch 6.0.238
+Problem: Using a ":substitute" command with a substitute() call in the
+ substitution expression causes errors. (Srinath Avadhanula)
+Solution: Save and restore pointers when doing substitution recursively.
+Files: src/regexp.c
+
+Patch 6.0.239
+Problem: Using "A" to append after a Visually selected block which is after
+ the end of the line, spaces are inserted in the wrong line and
+ other unexpected effects. (Michael Naumann)
+Solution: Don't advance the cursor to the next line.
+Files: src/ops.c
+
+Patch 6.0.240
+Problem: Win32: building with Python 2.2 doesn't work.
+Solution: Add support for Python 2.2 with dynamic linking. (Paul Moore)
+Files: src/if_python.c
+
+Patch 6.0.241
+Problem: Win32: Expanding the old value of an option that is a path that
+ starts with a backslash, an extra backslash is inserted.
+Solution: Only insert backslashes where needed.
+ Also handle multibyte characters properly when removing
+ backslashes.
+Files: src/option.c
+
+Patch 6.0.242
+Problem: GUI: On a system with an Exceed X server sometimes get a "Bad
+ Window" error. (Tommi Maekitalo)
+Solution: When forking, use a pipe to wait in the parent for the child to
+ have done the setsid() call.
+Files: src/gui.c
+
+Patch 6.0.243
+Problem: Unix: "vim --version" outputs a NL before the last line instead of
+ after it. (Charles Campbell)
+Solution: Send the NL to the same output stream as the text.
+Files: src/message.c, src/os_unix.c, src/proto/message.pro
+
+Patch 6.0.244
+Problem: Multi-byte: Problems with (illegal) UTF-8 characters in menu and
+ file name (e.g., icon text, status line).
+Solution: Correctly handle unprintable characters. Catch illegal UTF-8
+ characters and replace them with <xx>. Truncating the status line
+ wasn't done correctly at a multibyte character. (Yasuhiro
+ Matsumoto)
+ Added correct_cmdspos() and transchar_byte().
+Files: src/buffer.c, src/charset.c, src/ex_getln.c, src/gui.c,
+ src/message.c, src/screen.c, src/vim.h
+
+Patch 6.0.245
+Problem: After using a color scheme, setting the 'background' option might
+ not work. (Peter Horst)
+Solution: Disable the color scheme if it switches 'background' back to the
+ wrong value.
+Files: src/option.c
+
+Patch 6.0.246
+Problem: ":echomsg" didn't use the highlighting set by ":echohl". (Gary
+ Holloway)
+Solution: Use the specified attributes for the message. (Yegappan
+ Lakshmanan)
+Files: src/eval.c
+
+Patch 6.0.247
+Problem: GTK GUI: Can't use gvim in a kpart widget.
+Solution: Add the "--echo-wid" argument to let Vim echo the window ID on
+ stdout. (Philippe Fremy)
+Files: runtime/doc/starting.txt, src/globals.h, src/gui_gtk_x11.c,
+ src/main.c
+
+Patch 6.0.248
+Problem: When using compressed help files and 'encoding' isn't "latin1",
+ Vim converts the help file before decompressing. (David Reviejo)
+Solution: Don't convert a help file when 'binary' is set.
+Files: src/fileio.c
+
+Patch 6.0.249
+Problem: "vim -t edit -c 'sta ex_help'" doesn't move cursor to edit().
+Solution: Don't set the cursor on the first line for "-c" arguments when
+ there also is a "-t" argument.
+Files: src/main.c
+
+Patch 6.0.250 (extra)
+Problem: Macintosh: Various problems when compiling.
+Solution: Various fixes, mostly #ifdefs. (Dany St. Amant)
+Files: src/gui_mac.c, src/main.c, src/misc2.c, src/os_mac.h,
+ src/os_mac.pbproj/project.pbxproj, src/os_unix.c
+
+Patch 6.0.251 (extra)
+Problem: Macintosh: menu shortcuts are not very clear.
+Solution: Show the shortcut with the Mac clover symbol. (raindog)
+Files: src/gui_mac.c
+
+Patch 6.0.252
+Problem: When a user function was defined with "abort", an error that is
+ not inside if/endif or while/endwhile doesn't abort the function.
+ (Servatius Brandt)
+Solution: Don't reset did_emsg when the function is to be aborted.
+Files: src/ex_docmd.c
+
+Patch 6.0.253
+Problem: When 'insertmode' is set, after "<C-O>:edit file" the next <C-O>
+ doesn't work. (Benji Fisher) <C-L> has the same problem.
+Solution: Reset need_start_insertmode once in edit().
+Files: src/edit.c
+
+Patch 6.0.254 (extra)
+Problem: Borland C++ 5.5: Checking for stack overflow doesn't work
+ correctly. Matters when using a complicated regexp.
+Solution: Remove -N- from Make_bc5.mak. (Yasuhiro Matsumoto)
+Files: src/Make_bc5.mak
+
+Patch 6.0.255 (extra) (depends on patch 6.0.116 and 6.0.121)
+Problem: Win32: ACL support doesn't work well on Samba drives.
+Solution: Add a check for working ACL support. (Mike Williams)
+Files: src/os_win32.c
+
+Patch 6.0.256 (extra)
+Problem: Win32: ":highlight Comment guifg=asdf" does not give an error
+ message. (Randall W. Morris) Also for other systems.
+Solution: Add gui_get_color() to give one error message for all systems.
+Files: src/gui.c, src/gui_amiga.c, src/gui_athena.c, src/gui_motif.c,
+ src/gui_riscos.c, src/gui_x11.c, src/gui_gtk_x11.c,
+ src/proto/gui.pro, src/syntax.c
+
+Patch 6.0.257
+Problem: Win32: When 'mousefocus' is set and there is a BufRead
+ autocommand, after the dialog for permissions changed outside of
+ Vim: 'mousefocus' stops working. (Robert Webb)
+Solution: Reset need_mouse_correct after checking timestamps.
+Files: src/fileio.c
+
+Patch 6.0.258
+Problem: When 'scrolloff' is 999 and there are folds, the text can jump up
+ and down when moving the cursor down near the end of the file.
+ (Lubomir Host)
+Solution: When putting the cursor halfway the window start counting lines at
+ the end of a fold.
+Files: src/move.c
+
+Patch 6.0.259
+Problem: MS-DOS: after editing the command line the cursor shape may remain
+ like in Insert mode. (Volker Kiefel)
+Solution: Reset the cursor shape after editing the command line.
+Files: src/ex_getln.c
+
+Patch 6.0.260
+Problem: GUI: May crash while starting up when giving an error message for
+ missing color. (Servatius Brandt)
+Solution: Don't call gui_write() when still starting up. Don't give error
+ message for empty color name. Don't use 't_vb' while the GUI is
+ still starting up.
+Files: src/fileio.c, src/gui.c, src/misc1.c, src/ui.c
+
+Patch 6.0.261
+Problem: nr2char() and char2nr() don't work with multibyte characters.
+Solution: Use 'encoding' for these functions. (Yasuhiro Matsumoto)
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 6.0.262 (extra)
+Problem: Win32: IME doesn't work properly. OnImeComposition() isn't used
+ at all.
+Solution: Adjust various things for IME.
+Files: src/globals.h, src/gui_w32.c, src/mbyte.c, src/proto/ui.pro,
+ src/structs.h, src/ui.c
+
+Patch 6.0.263
+Problem: GTK: When a dialog is closed by the window manager, Vim hangs.
+ (Christian J. Robinson)
+Solution: Use GTK_WIDGET_DRAWABLE() instead of GTK_WIDGET_VISIBLE().
+Files: src/gui_gtk.c, src/gui_gtk_x11.c
+
+Patch 6.0.264
+Problem: The amount of virtual memory is used to initialize 'maxmemtot',
+ which may be much more than the amount of physical memory,
+ resulting in a lot of swapping.
+Solution: Get the amount of physical memory with sysctl(), sysconf() or
+ sysinfo() when possible.
+Files: src/auto/configure, src/configure.in, src/config.h.in,
+ src/os_unix.c, src/os_unix.h
+
+Patch 6.0.265
+Problem: Win32: Using backspace while 'fkmap' is set causes a crash.
+ (Jamshid Oasjmoha)
+Solution: Don't try mapping special keys.
+Files: src/farsi.c
+
+Patch 6.0.266
+Problem: The rename() function deletes the file if the old and the new name
+ are the same. (Volker Kiefel)
+Solution: Don't do anything if the names are equal.
+Files: src/fileio.c
+
+Patch 6.0.267
+Problem: UTF-8: Although 'isprint' says a character is printable,
+ utf_char2cells() still considers it unprintable.
+Solution: Use vim_isprintc() for characters up to 0x100. (Yasuhiro Matsumoto)
+Files: src/mbyte.c
+
+Patch 6.0.268 (extra) (depends on patch 6.0.255)
+Problem: Win32: ACL check crashes when using forward slash in file name.
+Solution: Improve the check for the path in the file name.
+Files: src/os_win32.c
+
+Patch 6.0.269
+Problem: Unprintable characters in a file name may cause problems when
+ using the 'statusline' option or when 'buftype' is "nofile".
+Solution: call trans_characters() for the resulting statusline. (Yasuhiro
+ Matsumoto)
+Files: src/buffer.c, src/screen.c, src/charset.c
+
+Patch 6.0.270 (depends on patch 6.0.267)
+Problem: A tab causes UTF-8 text to be displayed in the wrong position.
+ (Ron Aaron)
+Solution: Correct utf_char2cells() again.
+Files: src/mbyte.c
+
+Patch 6.1a.001 (extra)
+Problem: 32bit DOS: copying text to the clipboard may cause a crash.
+ (Jonathan D Johnston)
+Solution: Don't copy one byte too much in SetClipboardData().
+Files: src/os_msdos.c
+
+Patch 6.1a.002
+Problem: GTK: On some configurations, when closing a dialog from the window
+ manager, Vim hangs.
+Solution: Catch the "destroy" signal. (Aric Blumer)
+Files: src/gui_gtk.c
+
+Patch 6.1a.003
+Problem: Multi-byte: With UTF-8 double-wide char and 'virtualedit' set:
+ yanking in Visual mode doesn't include the last byte. (Eric Long)
+Solution: Don't add a space for a double-wide character.
+Files: src/ops.c
+
+Patch 6.1a.004 (extra)
+Problem: MINGW: undefined type. (Ron Aaron)
+Solution: Make GetCompositionString_inUCS2() static.
+Files: src/gui_w32.c, src/gui_w48.c, src/proto/gui_w32.pro
+
+Patch 6.1a.005 (extra)
+Problem: Win32: ":hardcopy" doesn't work after ":hardcopy!". (Jonathan
+ Johnston)
+Solution: Don't keep the driver context when using ":hardcopy!". (Vince
+ Negri)
+Files: src/os_mswin.c
+
+Patch 6.1a.006
+Problem: multibyte: after setting 'encoding' the window title might be
+ wrong.
+Solution: Force resetting the title. (Yasuhiro Matsumoto)
+Files: src/option.c
+
+Patch 6.1a.007
+Problem: Filetype detection for "*.inc" doesn't work.
+Solution: Use a ":let" command. (David Schweikert)
+Files: runtime/filetype.vim
+
+Patch 6.1a.008 (extra)
+Problem: Win32: ACL detection for network shares doesn't work.
+Solution: Include the trailing (back)slash in the root path. (Mike Williams)
+Files: src/os_win32.c
+
+Patch 6.1a.009
+Problem: When using "\@<=" or "\@<!" in a pattern, a "\1" may refer to a ()
+ part that follows, but it generates an error message.
+Solution: Allow a forward reference when there is a following "\@<=" or
+ "\@<!".
+Files: runtime/doc/pattern.txt, src/regexp.c
+
+Patch 6.1a.010
+Problem: When using ":help" and opening a new window, the alternate file
+ isn't set.
+Solution: Set the alternate file to the previously edited file.
+Files: src/ex_cmds.c
+
+Patch 6.1a.011
+Problem: GTK: ":set co=77", change width with the mouse, ":set co=77"
+ doesn't resize the window. (Darren Hiebert)
+Solution: Set the form size after handling a resize event.
+Files: src/gui_gtk_x11.c
+
+Patch 6.1a.012
+Problem: GTK: The file browser always returns a full path. (Lohner)
+Solution: Shorten the file name if possible.
+Files: src/gui_gtk.c
+
+Patch 6.1a.013
+Problem: When using "=~word" in 'cinkeys' or 'indentkeys', the case of the
+ last character of the word isn't ignored. (Raul Segura Acevedo)
+Solution: Ignore case when checking the last typed character.
+Files: src/edit.c
+
+Patch 6.1a.014
+Problem: After patch 6.1a.006 can't compile without the title feature.
+Solution: Add an #ifdef.
+Files: src/option.c
+
+Patch 6.1a.015
+Problem: MS-Windows: When expanding a file name that contains a '[' or '{'
+ an extra backslash is inserted. (Raul Segura Acevedo)
+Solution: Avoid adding the backslash.
+Files: src/ex_getln.c
+
+Patch 6.1a.016
+Problem: Completion after ":language" doesn't include "time". (Raul Segura
+ Acevedo)
+Solution: Add the alternative to the completions.
+Files: src/ex_cmds2.c
+
+Patch 6.1a.017
+Problem: Clicking the mouse in the top row of a window where the first line
+ doesn't fit moves the cursor to the wrong column.
+Solution: Add the skipcol also for the top row of a window.
+Files: src/ui.c
+
+Patch 6.1a.018
+Problem: When 'scrolloff' is one and the window height is one, "gj" can put
+ the cursor above the window. (Raul Segura Acevedo)
+Solution: Don't let skipcol become bigger than the cursor column.
+Files: src/move.c
+
+Patch 6.1a.019
+Problem: When using a composing character on top of an ASCII character, the
+ "l" command clears the composing character. Only when 'ruler' and
+ 'showcmd' are off. (Raphael Finkel)
+Solution: Don't move the cursor by displaying characters when there are
+ composing characters.
+Files: src/screen.c
+
+Patch 6.1a.020
+Problem: GTK: after patch 6.1a.011 resizing with the mouse doesn't always
+ work well for small sizes. (Adrien Beau)
+Solution: Use another way to avoid the problem with ":set co=77".
+Files: src/gui_gtk_x11.c
+
+Patch 6.1a.021
+Problem: Several Syntax menu entries are wrong or confusing.
+Solution: Rephrase and correct the menu entries. (Adrien Beau)
+Files: runtime/makemenu.vim, runtime/menu.vim
+
+Patch 6.1a.022
+Problem: A tags file might be used twice on case insensitive systems.
+ (Rick Swanton)
+Solution: Don't use the same file name twice in the default for the 'tags'
+ option. Ignore case when comparing names of already visited
+ files.
+Files: src/misc2.c, src/option.c
+
+Patch 6.1a.023
+Problem: When starting the GUI get "C" characters echoed in the terminal.
+Solution: Don't try sending a clear-screen command while the GUI is starting
+ up.
+Files: src/screen.c
+
+Patch 6.1a.024
+Problem: In other editors CTRL-F is often used for a find dialog.
+Solution: In evim use CTRL-F for the find dialog.
+Files: runtime/evim.vim
+
+Patch 6.1a.025
+Problem: The choices for the fileformat dialog can't be translated.
+Solution: Add g:menutrans_fileformat_choices. (Adrien Beau)
+Files: runtime/menu.vim
+
+Patch 6.1a.026
+Problem: Indenting Java files is wrong with "throws", "extends" and
+ "implements" clauses.
+Solution: Update the Java indent script.
+Files: runtime/indent/java.vim
+
+Patch 6.1a.027
+Problem: A few Syntax menu entries missing or incorrect.
+Solution: Add and correct the menu entries. (Adrien Beau)
+ Shorten a few menus to avoid they become too long.
+Files: runtime/makemenu.vim, runtime/menu.vim
+
+Patch 6.1a.028
+Problem: XIM: problems with feedback and some input methods.
+Solution: Use iconv for calculating the cells. Remove the queue for
+ key_press_event only when text was changed. (Yasuhiro Matsumoto)
+Files: src/globals.h, src/mbyte.c, src/screen.c
+
+Patch 6.1a.029
+Problem: After patch 6.1a.028 can't compile GTK version with XIM but
+ without multibyte chars.
+Solution: Add an #ifdef. (Aschwin Marsman)
+Files: src/mbyte.c
+
+Patch 6.1a.030
+Problem: With double-byte encodings toupper() and tolower() may have wrong
+ results.
+Solution: Skip double-byte characters. (Eric Long)
+Files: src/eval.c
+
+Patch 6.1a.031
+Problem: Accessing the 'balloondelay' variable may cause a crash.
+Solution: Make the variable for 'balloondelay' a long. (Olaf Seibert)
+Files: src/option.h
+
+Patch 6.1a.032 (extra)
+Problem: Some menu files used a wrong encoding name for "scriptencoding".
+Solution: Move the translations to a separate file, which is sourced after
+ setting "scriptencoding".
+ Also add Czech menu translations in ASCII and update the other
+ encodings.
+Files: runtime/lang/menu_cs_cz.iso_8859-1.vim,
+ runtime/lang/menu_cs_cz.iso_8859-2.vim,
+ runtime/lang/menu_czech_czech_republic.1250.vim,
+ runtime/lang/menu_czech_czech_republic.1252.vim,
+ runtime/lang/menu_czech_czech_republic.ascii.vim,
+ runtime/lang/menu_de_de.iso_8859-1.vim,
+ runtime/lang/menu_de_de.latin1.vim,
+ runtime/lang/menu_fr_fr.iso_8859-1.vim,
+ runtime/lang/menu_fr_fr.latin1.vim,
+ runtime/lang/menu_french_france.1252.vim,
+ runtime/lang/menu_german_germany.1252.vim,
+ runtime/lang/menu_ja_jp.euc-jp.vim,
+ runtime/lang/menu_ja_jp.utf-8.vim,
+ runtime/lang/menu_japanese_japan.932.vim
+
+Patch 6.1a.033
+Problem: XIM: doesn't reset input context.
+Solution: call xim_reset() with im_set_active(FALSE). (Takuhiro Nishioka)
+Files: src/mbyte.c
+
+Patch 6.1a.034 (extra)
+Problem: Win32: The ACL checks for a readonly file still don't work well.
+Solution: Remove the ACL checks, go back to how it worked in Vim 6.0.
+Files: src/os_win32.c
+
+Patch 6.1a.035
+Problem: multibyte: When using ":sh" in the GUI, typed and displayed
+ multibyte characters are not handled correctly.
+Solution: Deal with multibyte characters to and from the shell. (Yasuhiro
+ Matsumoto) Also handle UTF-8 composing characters.
+Files: src/os_unix.c
+
+Patch 6.1a.036
+Problem: GTK: the save-yourself event was not handled.
+Solution: Catch the save-yourself event and preserve swap files. (Neil Bird)
+Files: src/gui_gtk_x11.c
+
+Patch 6.1a.037
+Problem: The MS-Windows key mapping doesn't include CTRL-S for saving.
+ (Vlad Sandrini)
+Solution: Map CTRL-S to ":update".
+Files: runtime/mswin.vim
+
+Patch 6.1a.038
+Problem: Solaris: Including both sys/sysctl.h and sys/sysinfo.h doesn't
+ work. (Antonio Colombo)
+Solution: Don't include sys/sysinfo.h when not calling sysinfo().
+Files: src/os_unix.c
+
+Patch 6.1a.039
+Problem: Not all visual basic files are recognized.
+Solution: Add checks to catch *.ctl files. (Raul Segura Acevedo)
+Files: runtime/filetype.vim
+
+Patch 6.1a.040
+Problem: A *.pl file is recognized as Perl, but it could be a prolog file.
+Solution: Check the first non-empty line. (Kontra Gergely)
+Files: runtime/filetype.vim
+
+Patch 6.1a.041
+Problem: When pressing the left mouse button in the command line and them
+ moving the mouse upwards, nearly all the text is selected.
+Solution: Don't try extending a modeless selection when there isn't one.
+Files: src/ui.c
+
+Patch 6.1a.042
+Problem: When merging files, ":diffput" and ":diffget" are used a lot, but
+ they require a lot of typing.
+Solution: Add "dp" for ":diffput" and "do" for ":diffget".
+Files: runtime/doc/diff.txt, src/diff.c, src/normal.c, src/proto/diff.pro
+
+
+Patch 6.1b.001 (extra)
+Problem: Checking for wildcards in a path does not handle multibyte
+ characters with a trail byte which is a wildcard.
+Solution: Handle multibyte characters correctly. (Muraoka Taro)
+Files: src/os_amiga.c, src/os_mac.c, src/os_msdos.c, src/os_mswin.c,
+ src/os_unix.c
+
+Patch 6.1b.002
+Problem: A regexp that ends in "\{" is not flagged as an error. May cause
+ a stack overflow when 'incsearch' is set. (Gerhard Hochholzer)
+Solution: Handle a missing "}" as an error.
+Files: src/regexp.c
+
+Patch 6.1b.003 (extra)
+Problem: The RISC OS GUI doesn't compile.
+Solution: Include changes since Vim 5.7. (Andy Wingate)
+Files: src/Make_ro.mak, src/gui_riscos.c, src/os_riscos.c,
+ src/os_riscos.h, src/proto/gui_riscos.pro
+
+Patch 6.1b.004
+Problem: col("'>") returns a negative number for linewise selection. (Neil
+ Bird)
+Solution: Don't add one to MAXCOL.
+Files: src/eval.c
+
+Patch 6.1b.005
+Problem: Using a search pattern that causes an out-of-stack error while
+ 'hlsearch' is set keeps giving the hit-Enter prompt.
+ A search pattern that takes a long time delays typing when
+ 'incsearch' is set.
+Solution: Stop 'hlsearch' highlighting when the regexp causes an error.
+ Stop searching for 'incsearch' when a character is typed.
+Files: src/globals.h, src/message.c, src/screen.c, src/search.c,
+ src/vim.h
+
+Patch 6.1b.006
+Problem: When entering a composing character on the command line with
+ CTRL-V, the text isn't redrawn correctly.
+Solution: Redraw the text under and after the cursor.
+Files: src/ex_getln.c
+
+Patch 6.1b.007
+Problem: When the cursor is in the white space between two sentences, "dis"
+ deletes the first character of the following sentence, "das"
+ deletes a space after the sentence.
+Solution: Backup the cursor one character in these situations.
+Files: src/search.c
+
+Patch 6.1b.008
+Problem: *.xsl files are not recognized as xslt but xml.
+ Monk files are not recognized.
+Solution: Delete the duplicate line for *.xsl. (Johannes Zellner)
+ Recognize monk files.
+Files: runtime/filetype.vim
+
+Patch 6.1b.009
+Problem: Can't always compile small features and then adding eval feature,
+ "sandbox" is undefined. (Axel Kielhorn)
+Solution: Always define "sandbox" when the eval feature is used.
+Files: src/globals.h
+
+Patch 6.1b.010 (extra)
+Problem: When compiling gvimext.cpp with MSVC 4.2 get a number of warnings.
+Solution: Change "true" to "TRUE". (Walter Briscoe)
+Files: GvimExt/gvimext.cpp
+
+Patch 6.1b.011
+Problem: When using a very long string for confirm(), can't quit the
+ displaying at the more prompt. (Hari Krishna Dara)
+Solution: Jump to the end of the message to show the choices.
+Files: src/message.c
+
+Patch 6.1b.012
+Problem: Multi-byte: When 'showbreak' is set and a double-wide character
+ doesn't fit at the right window edge the cursor gets stuck there.
+ Using cursor-left gets stuck when 'virtualedit' is set. (Eric
+ Long)
+Solution: Fix the way the extra ">" character is counted when 'showbreak' is
+ set. Don't correct cursor for virtual editing on a double-wide
+ character.
+Files: src/charset.c, src/edit.c
+
+Patch 6.1b.013
+Problem: A user command that partly matches with a buffer-local user
+ command and matches full with a global user command unnecessarily
+ gives an 'ambiguous command' error.
+Solution: Find the full global match even after a partly local match.
+Files: src/ex_docmd.c
+
+Patch 6.1b.014
+Problem: EBCDIC: switching mouse events off causes garbage on screen.
+ Positioning the cursor in the GUI causes garbage.
+Solution: Insert an ESC in the terminal code. (Ralf Schandl)
+ Use "\b" instead of "\010" for KS_LE.
+Files: src/os_unix.c, src/term.c
+
+Patch 6.1b.015
+Problem: Vimtutor has a typo. Get a warning for "tempfile" if it
+ doesn't exist.
+Solution: Move a quote to the end of a line. (Max Ischenko)
+ Use "mktemp" first, more systems have it.
+Files: src/vimtutor
+
+Patch 6.1b.016
+Problem: GTK: loading a fontset that works partly, Vim might hang or crash.
+Solution: Avoid that char_width becomes zero. (Yasuhiro Matsumoto)
+Files: src/gui_gtk_x11.c
+
+Patch 6.1b.017
+Problem: GUI: When using ":shell" and there is a beep, nothing happens.
+Solution: Call vim_beep() to produce the beep from the shell. (Yasuhiro
+ Matsumoto)
+Files: src/message.c
+
+Patch 6.1b.018 (depends on 6.1b.006)
+Problem: When entering the encryption key, special keys may still reveal
+ the typed characters.
+Solution: Make sure stars are used or nothing is shown in all cases.
+Files: src/digraph.c, src/getchar.c, src/ex_getln.c
+
+Patch 6.1b.019 (depends on 6.1b.005)
+Problem: A search pattern that takes a long time slows down typing when
+ 'incsearch' is set.
+Solution: Pass SEARCH_PEEK to dosearch().
+Files: src/ex_getln.c
+
+Patch 6.1b.020
+Problem: When using the matchit plugin, "%" finds a match on the "end" of a
+ ":syntax region" command in Vim scripts.
+Solution: Skip over ":syntax region" commands by setting b:match_skip.
+Files: runtime/ftplugin/vim.vim
+
+Patch 6.1b.021
+Problem: when 'mousefocus' is set, CTRL-W CTRL-] sometimes doesn't warp the
+ pointer to the new window. (Robert Webb)
+Solution: Don't reset need_mouse_correct when checking the timestamp of a
+ file.
+Files: src/fileio.c
+
+Patch 6.1b.022
+Problem: With lots of folds "j" does not obey 'scrolloff' properly.
+ (Srinath Avadhanula)
+Solution: Go to end of the fold before counting context lines.
+Files: src/move.c
+
+Patch 6.1b.023
+Problem: On MS-Windows system() may cause checking timestamps, because Vim
+ loses and gains input focus, while this doesn't happen on Unix.
+Solution: Don't check timestamps while system() is busy.
+Files: src/ex_cmds2.c, src/fileio.c, src/globals.h, src/misc1.c
+
+Patch 6.1b.024 (extra)
+Problem: Gettext 0.11 complains that "sjis" is not a standard name.
+Solution: Use "cp932" instead.
+Files: src/po/sjiscorr.c
+
+Patch 6.1b.025 (extra)
+Problem: Win32: When closing gvim while it is minimized and has a changed
+ file, the file-changed dialog pops up in a corner of the screen.
+Solution: Put the dialog in the middle of the screen.
+Files: src/gui_w48.c
+
+Patch 6.1b.026
+Problem: When 'diffopt' contains 'iwhite' but not 'icase': differences in
+ case are not highlighted properly. (Gerhard Hochholzer)
+Solution: Don't ignore case when ignoring white space differences.
+Files: src/diff.c
+
+Patch 6.1b.027
+Problem: "vim --remote +" may cause a crash.
+Solution: Check for missing file name argument. (Martin Kahlert)
+Files: src/main.c
+
+Patch 6.1b.028 (extra)
+Problem: Win16: Can't compile after patch 6.1b.025.
+Solution: Add code specifically for Win16. (Vince Negri)
+Files: src/gui_w48.c
+
+Patch 6.1b.029
+Problem: Win32: When a directory on an NTFS partition is read/execute (no
+ delete,modify,write) and the file has modify rights, trying to
+ write the file deletes it. Making the file read/write/execute
+ (not delete) solves it. (Mark Canup)
+Solution: Use the Unix code to check for a writable directory. If not, then
+ make a backup copy and overwrite the file.
+Files: src/fileio.c
+
+Patch 6.1b.030 (extra)
+Problem: Mac: small mistake in the build script and prototypes.
+Solution: Fix the build script and add the prototypes. (Axel Kielhorn)
+Files: src/os_mac.build, src/gui_mac.c
+
+Patch 6.1b.031 (extra)
+Problem: Win32 GUI: ":set guifont=*" doesn't set 'guifont' to the resulting
+ font name. (Vlad Sandrini)
+Solution: Put the code back in gui_mch_init_font() to form the font name out
+ of the logfont.
+Files: src/gui_w48.c
+
+Patch 6.1b.032
+Problem: Athena: Setting a color scheme before the GUI has started causes a
+ crash. (Todd Blumer)
+Solution: Don't try using color names that haven't been set yet.
+Files: src/gui_athena.c
+
+Patch 6.1b.033
+Problem: When using a count after a ":s" command may get ml_get errors.
+ (Dietmar Lang)
+Solution: Check that the resulting range does not go past the end of the
+ buffer.
+Files: src/ex_cmds.c
+
+Patch 6.1b.034
+Problem: After sourcing mswin.vim, when using <C-S-Right> after
+ auto-indenting and then <Del>, get warning for allocating
+ ridiculous amount of memory. (Dave Delgreco)
+Solution: Adjust the start of the Visual area when deleting the auto-indent.
+Files: src/edit.c
+
+Patch 6.1b.035
+Problem: When using evim, dropping a file on Vim and then double clicking
+ on a word, it is changed to "i". (Merlin Hansen)
+Solution: Reset need_start_insertmode after editing the file.
+Files: src/ex_docmd.c
+
+
+==============================================================================
+VERSION 6.2 *version-6.2*
+
+This section is about improvements made between version 6.1 and 6.2.
+
+This is mainly a bug-fix release. There are also a few new features.
+
+Main new features:
+- Support for GTK 2. (Daniel Elstner)
+- Support for editing Arabic text. (Nadim Shaikli & Isam Bayazidi)
+- ":try" command and exception handling. (Servatius Brandt)
+- Support for the neXtaw GUI toolkit (mostly like Athena). (Alexey Froloff)
+- Cscope support for Win32. (Khorev Sergey)
+- Support for PostScript printing in various 8-bit encodings. (Mike Williams)
+
+
+Changed *changed-6.2*
+-------
+
+Removed the scheme indent file, the internal Lisp indenting works well now.
+
+Moved the GvimEXt, OleVim and VisVim directories into the "src" directory.
+This is more consistent with how xxd is handled.
+
+The VisVim.dll file is installed in the top directory, next to gvimext.dll,
+instead of in a subdirectory "VisVim". Fixes that NSIS was uninstalling it
+from the wrong directory.
+
+Removed the art indent file, it didn't do anything.
+
+submatch() returned line breaks with CR instead of LF.
+
+Changed the Win32 Makefiles to become more uniform and compile gvimext.dll.
+(Dan Sharp)
+
+'cindent': Align a "//" comment with a "//" comment in a previous line.
+(Helmut Stiegler)
+
+Previously only for xterm-like terminals parent widgets were followed to find
+the title and icon label. Now do this for all terminal emulators.
+
+Made it possible to recognize backslashes for "%" matching. The 'M' flag in
+'cpoptions' disables it. (Haakon Riiser)
+
+Removed the Make_tcc.mak makefile for Turbo C. It didn't work and we probably
+can't make it work (the compiler runs out of memory).
+
+Even though the documentation refers to keywords, "[ CTRL-D" was using
+'isident' to find matches. Changed it to use 'iskeyword'. Also applies to
+other commands that search for defined words in included files such as
+":dsearch", "[D" and "[d".
+
+Made 'keywordprg' global-local. (Christian Robinson)
+
+Enabled the Netbeans interface by default. Reversed the configure argument
+from "--enable-netbeans" to "--disable-netbeans".
+
+
+Added *added-6.2*
+-----
+
+New options:
+ 'arabic'
+ 'arabicshape'
+ 'ambiwidth'
+ 'autochdir'
+ 'casemap'
+ 'copyindent'
+ 'cscopequickfix'
+ 'preserveindent'
+ 'printencoding'
+ 'rightleftcmd'
+ 'termbidi'
+ 'toolbariconsize'
+ 'winfixheight'
+
+New keymaps:
+ Serbian (Aleksandar Veselinovic)
+ Chinese Pinyin (Fredrik Roubert)
+ Esperanto (Antoine J. Mechelynck)
+
+New syntax files:
+ Valgrind (Roger Luethi)
+ Smarty template (Manfred Stienstra)
+ MySQL (Kenneth Pronovici)
+ RockLinux package description (Piotr Esden-Tempski)
+ MMIX (Dirk Huesken)
+ gkrellmrc (David Necas)
+ Tilde (Tobias Rundtrom)
+ Logtalk (Paulo Moura)
+ PLP (Juerd Waalboer)
+ fvwm2m4 (David Necas)
+ IPfilter (Hendrik Scholz)
+ fstab (Radu Dineiu)
+ Quake (Nikolai Weibull)
+ Occam (Mario Schweigler)
+ lpc (Shizhu Pan)
+ Exim conf (David Necas)
+ EDIF (Artem Zankovich)
+ .cvsrc (Nikolai Weibull)
+ .fetchmailrc (Nikolai Weibull)
+ GNU gpg (Nikolai Weibull)
+ Grub (Nikolai Weibull)
+ Modconf (Nikolai Weibull)
+ RCS (Dmitry Vasiliev)
+ Art (Dorai Sitaram)
+ Renderman Interface Bytestream (Andrew J Bromage)
+ Mailcap (Doug Kearns)
+ Subversion commit file (Dmitry Vasiliev)
+ Microsoft IDL (Vadim Zeitlin)
+ WildPackets EtherPeek Decoder (Christopher Shinn)
+ Spyce (Rimon Barr)
+ Resolv.conf (Radu Dineiu)
+ A65 (Clemens Kirchgatterer)
+ sshconfig and sshdconfig (David Necas)
+ Cheetah and HTMLCheetah (Max Ischenko)
+ Packet filter (Camiel Dobbelaar)
+
+New indent files:
+ Eiffel (David Clarke)
+ Tilde (Tobias Rundtrom)
+ Occam (Mario Schweigler)
+ Art (Dorai Sitaram)
+ PHP (Miles Lott)
+ Dylan (Brent Fulgham)
+
+New tutor translations:
+ Slovak (Lubos Celko)
+ Greek (Christos Kontas)
+ German (Joachim Hofmann)
+ Norwegian (Øyvind Holm)
+
+New filetype plugins:
+ Occam (Mario Schweigler)
+ Art (Dorai Sitaram)
+ ant.vim, aspvbs.vim, config.vim, csc.vim, csh.vim, dtd.vim, html.vim,
+ jsp.vim, pascal.vim, php.vim, sgml.vim, sh.vim, svg.vim, tcsh.vim,
+ xhtml.vim, xml.vim, xsd.vim. (Dan Sharp)
+
+New compiler plugins:
+ Checkstyle (Doug Kearns)
+ g77 (Ralf Wildenhues)
+ fortran (Johann-Guenter Simon)
+ Xmllint (Doug Kearns)
+ Ruby (Tim Hammerquist)
+ Modelsim vcom (Paul Baleme)
+
+New menu translations:
+ Brazilian (José de Paula)
+ British (Mike Williams)
+ Korean in UTF-8. (Nam SungHyun)
+ Norwegian (Øyvind Holm)
+ Serbian (Aleksandar Jelenak)
+
+New message translation for Norwegian. (Øyvind Holm)
+
+New color scheme:
+ desert (Hans Fugal)
+
+Arabic specific features. 'arabicshape', 'termbidi', 'arabic' and
+'rightleftcmd' options. (Nadim Shaikli & Isam Bayazidi)
+
+Support for neXtaw GUI toolkit, mostly like Athena. (Alexey Froloff)
+
+Win32: cscope support. (Khorev Sergey)
+
+VMS: various improvements to documentation and makefiles. (Zoltan Arpadffy)
+
+Added "x" key to the explorer plugin: execute the default action. (Yasuhiro
+Matsumoto)
+
+Compile gvimext.dll with MingW. (Rene de Zwart)
+
+Add the "tohtml.vim" plugin. It defines the ":TOhtml" user command, an easy
+way to convert text to HTML.
+
+Added ":try" / ":catch" / ":finally" / ":endtry" commands. Add E999 numbers
+to all error messages, so that they can be caught by the number.
+(Servatius Brandt)
+Moved part of ex_docmd.c to the new ex_eval.c source file.
+
+Include support for GTK+ 2.2.x (Daniel Elstner)
+Adds the "~" register: drag & drop text.
+Adds the 'toolbariconsize' option.
+Add -Dalloca when running lint to work around a problem with alloca()
+prototype.
+
+When selecting an item in the error window to jump to, take some effort to
+find an ordinary window to show the file in (not a preview window).
+
+Support for PostScript printing of various 8-bit encodings. (Mike Williams)
+
+inputdialog() accepts a third argument that is used when the dialog is
+cancelled. Makes it possible to see a difference between cancelling and
+entering nothing.
+
+Included Aap recipes. Can be used to update Vim to the latest version,
+building and installing.
+
+"/" option in 'cinoptions': extra indent for comment lines. (Helmut Stiegler)
+
+Vim variable "v:register" and functions setreg(), getreg() and getregtype().
+(Michael Geddes)
+
+"v" flag in 'cpoptions': Leave text on screen with backspace in Insert mode.
+(Phillip Vandry)
+
+Dosinst.exe also finds gvimext.dll in the "GvimExt" directory. Useful when
+running install in the "src" directory for testing.
+
+Support tag files that were sorted with case ignored. (Flemming Madsen)
+
+When completing a wildcard in a leading path element, as in "../*/Makefile",
+only the last part ("Makefile") was listed. Support custom defined
+command line completion. (Flemming Madsen)
+
+Also recognize "rxvt" as an xterm-like terminal. (Tomas Styblo)
+
+Proper X11 session management. Fixes that the WM_SAVE_YOURSELF event was not
+used by popular desktops. (Neil Bird)
+Not used for Gnome 2, it has its own handling.
+
+Support BOR, DEBUG and SPAWNO arguments for the Borland 3 Makefile. (Walter
+Briscoe)
+
+Support page breaks for printing. Adds the "formfeed" field in
+'printoptions'. (Mike Williams)
+
+Mac OSX: multi-language support: iconv and gettext. (Muraoka Taro, Axel
+Kielhorn)
+
+"\Z" flag in patterns: ignore differences in combining characters. (Ron Aaron)
+
+Added 'preserveindent' and 'copyindent' options. They use existing white
+space characters instead of using Tabs as much as possible. (Chris Leishman)
+
+Updated Unicode tables to Unicode 4.0. (Raphael Finkel)
+
+Support for the mouse wheel in rxvt. (AIDA Shinra)
+
+Win32: Added ":8" file modifier to get short filename. Test50 tests the ":8"
+expansion on Win32 systems. (Michael Geddes)
+
+'cscopequickfix' option: Open quickfix window for Cscope commands. Also
+cleanup the code for giving messages. (Khorev Sergey)
+
+GUI: Support more than 222 columns for mouse positions.
+
+":stopinsert" command: Don't return to Insert mode.
+
+"interrupt" command for debug mode. Useful for simulating CTRL-C. (Servatius
+Brandt)
+
+
+Fixed *fixed-6.2*
+-----
+
+Removed a few unused #defines from config.h.in, os_os2_cfg.h and os_vms_conf.h.
+
+The Vim icons in PNG format didn't have a transparent background. (Greg
+Roelofs)
+
+Fixed a large number of spelling mistakes in the docs. (Adri Verhoef)
+
+The #defines for prototype generation were causing trouble. Changed them to
+typedefs.
+
+A new version of libintl.h uses __asm__, which confuses cproto. Define a
+dummy __asm__ macro.
+
+When 'virtualedit' is set can't move to halfway an unprintable character.
+Cripples CTRL-V selection. (Taro Muraoka)
+Allow moving to halfway an unprintable character. Don't let getvvcol() change
+the pos->coladd argument.
+
+When a tab wraps to the next line, 'listchars' is set and 'foldcolumn' is
+non-zero, only one character of the foldcolumn is highlighted. (Muraoka Taro)
+
+When using ":catch" without an argument Vim crashes. (Yasuhiro Matsumoto)
+When no argument given use the ".*" pattern.
+
+Win32: When gvim.exe is started from a shortcut with the window style property
+set to maximize Vim doesn't start with a maximized window. (Yasuhiro
+Matsumoto) Open the window with the default size and don't call ShowWindow()
+again when it's already visible. (Helmut Stiegler)
+
+gui_gtk.c used MAX, but it's undefined to avoid a conflict with system header
+files.
+
+Win32: When closing a window from a mapping some pixels remain on the
+statusline. (Yasuhiro Matsumoto)
+
+A column number in an errorformat that goes beyond the end of the line may
+cause a crash.
+
+":throw 'test'" crashes Vim. (Yasuhiro Matsumoto)
+
+The file selector's scrollbar colors are not set after doing a ":hi Scrollbar
+guifg=color". And the file selector's colors are not changed by the
+colorscheme command. (David Harrison)
+
+Motif: When compiling with FEAT_FOOTER defined, the text area gets a few
+pixels extra space on the right. Remove the special case in
+gui_get_base_width(). (David Harrison)
+
+Using CTRL-R CTRL-P in Insert mode puts the '] mark in the wrong position.
+(Helmut Stiegler)
+
+When 'formatoptions' includes "awct" a non-comment wasn't auto-formatted.
+
+Using a "--cmd" argument more than 10 times caused a crash.
+
+DEC style mouse support didn't work if the page field is not empty.
+(Uribarri)
+
+"vim -l one two" did only set 'lisp' in the first file. Vi does it for every
+file.
+
+":set tw<" didn't work. Was checking for '^' instead of '<'.
+
+In ":hardcopy > %.ps" the "%" was not expanded to the current filename.
+
+Made ":redraw" also update the Visual area.
+
+When a not implemented command, such as ":perl", has wrong arguments the less
+important error was reported, giving the user the idea the command could work.
+
+On non-Unix systems autocommands for writing did not attempt a match with the
+short file name, causing a pattern like "a/b" to fail.
+
+VMS: e_screenmode was not defined and a few other fixes for VMS. (Zoltan
+Arpadffy)
+
+redraw_msg() depended on FEAT_ARABIC instead of FEAT_RIGHTLEFT. (Walter
+Briscoe)
+
+Various changes for the PC Makefiles. (Walter Briscoe)
+
+Use _truename() instead of our own code to expand a file name into a full
+path. (Walter Briscoe)
+
+Error in filetype check for /etc/modutils. (Lubomir Host)
+
+Cscope interface: allocated a buffer too small.
+
+Win16: remove a trailing backslash from a path when obtaining the permission
+flags. (Vince Negri)
+
+When searching for tags with case ignored Vim could hang.
+
+When searching directories with a stopdir could get a crash. Did not
+re-allocate enough memory. (Vince Negri)
+
+A user command may cause a crash. Don't use the command index when it's
+negative. (Vince Negri)
+
+putenv() didn't work for MingW and Cygwin. (Dan Sharp)
+
+Many functions were common between os_msdos.c and os_win16.c. Use os_msdos.c
+for compiling the Win16 version and remove the functions from os_win16.c.
+(Vince Negri)
+
+For terminals that behave like an xterm but didn't have a name that is
+recognized, the window title would not always be set.
+
+When syntax highlighting is off ":hardcopy" could still attempt printing
+colors.
+
+Crash when using ":catch" without an argument. (Servatius Brandt)
+
+Win32: ":n #" doubled the backslashes.
+
+Fixed Arabic shaping for the command line. (Nadim Shaikli)
+
+Avoid splitting up a string displayed on the command line into individual
+characters, it breaks Arabic shaping.
+
+Updated Cygwin and MingW makefiles to use more dependencies. (Dan Sharp)
+
+2html.vim didn't work with 'nomagic' set.
+
+When a local argument list is used and doing ":only" Vim could crash later.
+(Muraoka Taro)
+
+When using "%P" in 'statusline' and the fillchar is "-", a percentage of 3%
+could result in "-3%". Also avoid changing a space inside a filename to the
+fill character.
+
+MSwin: Handling of backslashes and double quotes for command line arguments
+was not like what other applications do. (Walter Briscoe)
+
+Test32 sometimes didn't work, because test11.out was written as TEST11.OUT.
+
+Avoid pointer conversions warnings for Borland C 5.5 in dosinst.c and
+uninstal.c.
+
+More improvements for Make_bc3.mak file. (Walter Briscoe)
+
+When ":syn sync linebreaks=1" is used, editing the first line caused a redraw
+of the whole screen.
+
+Making translated messages didn't work, if_perl.xs wasn't found. (Vlad
+Sandrini)
+
+Motif and Athena: moving Vim to the foreground didn't uniconify it. Use
+XMapRaised() instead of XRaiseWindow(). (Srikanth Sankaran)
+
+When using ":ptag" in a window where 'scrollbind' is set the preview window
+would also have 'scrollbind' set. Also reset 'foldcolumn' and 'diff'.
+
+Various commands that split a window took over 'scrollbind', which is hardly
+ever desired. Esp. for "q:" and ":copen". Mostly reset 'scrollbind' when
+splitting a window.
+
+When 'shellslash' is set in the vimrc file the first entry of ":scriptnames"
+would still have backslashes. Entries in the quickfix list could also have
+wrong (back)slashes.
+
+Win32: printer dialog texts were not translated. (Yasuhiro Matsumoto)
+
+When using a multibyte character with a K_SPECIAL byte or a special key code
+with "--remote-send" the received byte sequence was mangled. Put it in the
+typeahead buffer instead of the input buffer.
+
+Win32: The cursor position was incorrect after changing cursor shape.
+(Yasuhiro Matsumoto).
+
+Win32: When 'encoding' is not the current codepage the title could not be set
+to non-ascii characters.
+
+"vim -d scp://machine/file1 scp://machine/file2" did not work, there was only
+one window. Fixed the netrw plugin not to wipe out the buffer if it is
+displayed in other windows.
+
+"/$" caused "e" in last column of screen to disappear, a highlighted blank was
+displayed instead.
+
+":s/ *\ze\n//e" removed the line break and introduced arbitrary text. Was
+using the line count including what matched after the "\ze".
+
+Using the "c" flag with ":s" changed the behavior when a line break is
+replaced and "\@<=" is used. Without "c" a following match was not found.
+
+":%s/\vA@<=\nB@=//gce" got stuck on "A\nB" when entering "n".
+
+VMS: add HAVE_STRFTIME in the config file. (Zoltan Arpadffy)
+
+When a delete prompts if a delete should continue when yanking is not
+possible, restore msg_silent afterwards.
+
+":sign" did not complain about a missing argument.
+
+When adding or deleting a sign 'hlsearch' highlighting could disappear.
+Use the generic functions for updating signs.
+
+On MS-Windows NT, 2K and XP don't use command.com but cmd.exe for testing.
+Makes the tests work on more systems.
+
+In the DOS tests don't create "/tmp" to avoid an error.
+
+Mac classic: Problems with reading files with CR vs CR/LF. Rely on the
+library version of fgets() to work correctly for Metrowerks 2.2. (Axel
+Kielhorn)
+
+When typing a password a "*" was shown for each byte instead of for each
+character. Added multibyte handling to displaying the stars. (Yasuhiro
+Matsumoto)
+
+When using Perl 5.6 accessing $curbuf doesn't work. Add an #ifdef to use
+different code for 5.6 and 5.8. (Dan Sharp)
+
+MingW and Cygwin: Don't strip the debug executable. (Dan Sharp)
+
+An assignment to a variable with curlies that includes "==" doesn't work.
+Skip over the curlies before searching for an "=". (Vince Negri)
+
+When cancelling the selection of alternate matching tags the tag stack index
+could be advanced too far, resulting in an error message when using CTRL-T.
+
+
+Patch 6.1.001
+Problem: When formatting UTF-8 text it might be wrapped at a space that is
+ followed by a composing character. (Raphael Finkel)
+ Also correct a display error for removing a composing char on top
+ of a space.
+Solution: Check for a composing character on a space.
+Files: src/edit.c, src/misc1.c, src/screen.c
+
+Patch 6.1.002 (extra)
+Problem: Win32: after a ":popup" command the mouse pointer stays hidden.
+Solution: Unhide the mouse pointer before showing the menu.
+Files: src/gui_w48.c
+
+Patch 6.1.003
+Problem: When 'laststatus' is zero and there is a vertical split, the
+ vertical separator is drawn in the command line. (Srikant
+ Sankaran)
+Solution: Don't draw the vertical separator where there is no statusline.
+Files: src/screen.c
+
+Patch 6.1.004
+Problem: Unicode 3.2 changes width and composing of a few characters.
+ (Markus Kuhn)
+Solution: Adjust the Unicode functions for the character width and composing
+ characters.
+Files: src/mbyte.c
+
+Patch 6.1.005
+Problem: When using more than 50 items in 'statusline' Vim might crash.
+ (Steve Hall)
+Solution: Increment itemcnt in check_stl_option(). (Flemming Madsen)
+Files: src/option.c
+
+Patch 6.1.006
+Problem: When using "P" in Visual mode to put linewise selected text, the
+ wrong text is deleted. (Jakub Turski)
+Solution: Put the text before the Visual area and correct the text to be
+ deleted for the inserted lines.
+ Also fix that "p" of linewise text in Visual block mode doesn't
+ work correctly.
+Files: src/normal.c, src/ops.c
+
+Patch 6.1.007
+Problem: Using ":filetype plugin off" when filetype plugins were never
+ enabled causes an error message. (Yiu Wing)
+Solution: Use ":silent!" to avoid the error message.
+Files: runtime/ftplugof.vim
+
+Patch 6.1.008
+Problem: The "%" command doesn't ignore \" inside a string, it's seen as
+ the end of the string. (Ken Clark)
+Solution: Skip a double quote preceded by an odd number of backslashes.
+Files: src/search.c
+
+Patch 6.1.009
+Problem: Vim crashes when using a huge number for the maxwid value in a
+ statusline. (Robert M. Nowotniak)
+Solution: Check for an overflow that makes maxwid negative.
+Files: src/buffer.c
+
+Patch 6.1.010
+Problem: Searching backwards for a question mark with "?\?" doesn't work.
+ (Alan Isaac) Same problem in ":s?\??" and ":g?\??".
+Solution: Change the "\?" in a pattern to "?" when using "?" as delimiter.
+Files: src/ex_cmds.c, src/ex_docmd.c, src/proto/regexp.pro, src/regexp.c,
+ src/search.c, src/syntax.c, src/tag.c
+
+Patch 6.1.011
+Problem: XIM: doesn't work correctly when 'number' is set. Also, a focus
+ problem when selecting candidates.
+Solution: Fix the XIM problems. (Yasuhiro Matsumoto)
+Files: src/mbyte.c, src/screen.c
+
+Patch 6.1.012
+Problem: A system() call might fail if fread() does CR-LF to LF
+ translation.
+Solution: Open the output file in binary mode. (Pavol Huhas)
+Files: src/misc1.c
+
+Patch 6.1.013
+Problem: Win32: The default for 'printexpr' doesn't work when there are
+ special characters in 'printdevice'.
+Solution: Add double quotes around the device name. (Mike Williams)
+Files: runtime/doc/option.txt, src/option.c
+
+Patch 6.1.014
+Problem: An operator like "r" used in Visual block mode doesn't use
+ 'virtualedit' when it's set to "block".
+Solution: Check for 'virtualedit' being active in Visual block mode when the
+ operator was started.
+Files: src/ex_docmd.c, src/globals.h, src/misc2.c, src/normal.c,
+ src/ops.c, src/undo.c
+
+Patch 6.1.015
+Problem: After patch 6.1.014 can't compile with tiny features. (Christian
+ J. Robinson)
+Solution: Add the missing define of virtual_op.
+Files: src/vim.h
+
+Patch 6.1.016 (extra)
+Problem: Win32: Outputting Hebrew or Arabic text might have a problem with
+ reversing.
+Solution: Replace the RevOut() function with ETO_IGNORELANGUAGE. (Ron Aaron)
+Files: src/gui_w32.c
+
+Patch 6.1.017
+Problem: Cygwin: After patch 6.1.012 Still doesn't do binary file I/O.
+ (Pavol Juhas)
+Solution: Define BINARY_FILE_IO for Cygwin.
+Files: src/os_unix.h
+
+Patch 6.1.018
+Problem: Error message when using cterm highlighting. (Leonardo Di Lella)
+Solution: Remove a backslash before a question mark.
+Files: runtime/syntax/cterm.vim
+
+Patch 6.1.019 (extra)
+Problem: Win32: File name is messed up when editing just a drive name.
+ (Walter Briscoe)
+Solution: Append a NUL after the drive name. (Vince Negri)
+Files: src/os_win32.c
+
+Patch 6.1.020
+Problem: col("'>") returns a huge number after using Visual line mode.
+Solution: Return the length of the line instead.
+Files: src/eval.c
+
+Patch 6.1.021 (depends on patch 6.1.009)
+Problem: Vim crashes when using a huge number for the minwid value in a
+ statusline. (Robert M. Nowotniak)
+Solution: Check for an overflow that makes minwid negative.
+Files: src/buffer.c
+
+Patch 6.1.022
+Problem: Grabbing the status line above the command-line window works like
+ the bottom status line was grabbed. (Jim Battle)
+Solution: Make it possible to grab the status line above the command-line
+ window, so that it can be resized.
+Files: src/ui.c
+
+Patch 6.1.023 (extra)
+Problem: VMS: running tests doesn't work properly.
+Solution: Adjust the makefile. (Zoltan Arpadffy)
+Files: src/testdir/Make_vms.mms
+
+Patch 6.1.024
+Problem: When header files use a new syntax for declaring functions, Vim
+ can't figure out missing prototypes properly.
+Solution: Accept braces around a function name. (M. Warner Losh)
+Files: src/osdef.sh
+
+Patch 6.1.025
+Problem: Five messages for "vim --help" don't start with a capital. (Vlad
+ Sandrini)
+Solution: Make the messages consistent.
+Files: src/main.c
+
+Patch 6.1.026
+Problem: *.patch files are not recognized as diff files. In a script a
+ "VAR=val" argument after "env" isn't ignored. PHP scripts are not
+ recognized.
+Solution: Add *.patch for diff filetypes. Ignore "VAR=val". Recognize PHP
+ scripts. (Roman Neuhauser)
+Files: runtime/filetype.vim, runtime/scripts.vim
+
+Patch 6.1.027
+Problem: When 'foldcolumn' is non-zero, a special character that wraps to
+ the next line disturbs the foldcolumn highlighting. (Yasuhiro
+ Matsumoto)
+Solution: Only use the special highlighting when drawing text characters.
+Files: src/screen.c
+
+Patch 6.1.028
+Problem: Client-server: When a --remote-expr fails, Vim still exits with
+ status zero.
+Solution: Exit Vim with a non-zero status to indicate the --remote-expr
+ failed. (Thomas Scott Urban)
+Files: src/main.c
+
+Patch 6.1.029
+Problem: When 'encoding' is an 8-bit encoding other than "latin1", editing
+ a utf-8 or other Unicode file uses the wrong conversion. (Jan
+ Fedak)
+Solution: Don't use Unicode to latin1 conversion for 8-bit encodings other
+ than "latin1".
+Files: src/fileio.c
+
+Patch 6.1.030
+Problem: When CTRL-N is mapped in Insert mode, it is also mapped after
+ CTRL-X CTRL-N, while it is not mapped after CTRL-X CTRL-F.
+ (Kontra Gergely)
+Solution: Don't map CTRL-N after CTRL-X CTRL-N. Same for CTRL-P.
+Files: src/getchar.c
+
+Patch 6.1.031
+Problem: Cygwin: Xxd could read a file in text mode instead of binary mode.
+Solution: Use "rb" or "rt" when needed. (Pavol Juhas)
+Files: src/xxd/xxd.c
+
+Patch 6.1.032
+Problem: Can't specify a quickfix file without jumping to the first error.
+Solution: Add the ":cgetfile" command. (Yegappan Lakshmanan)
+Files: runtime/doc/index.txt, runtime/doc/quickfix.txt, src/ex_cmds.h,
+ src/quickfix.c
+
+Patch 6.1.033
+Problem: GUI: When the selection is lost and the Visual highlighting is
+ changed to underlining, the cursor is left in a different
+ position. (Christian Michon)
+Solution: Update the cursor position after redrawing the selection.
+Files: src/ui.c
+
+Patch 6.1.034
+Problem: A CVS diff file isn't recognized as diff filetype.
+Solution: Skip lines starting with "? " before checking for an "Index:" line.
+Files: runtime/scripts.vim
+
+Patch 6.1.035 (extra, depends on 6.1.016)
+Problem: Win32: Outputting Hebrew or Arabic text might have a problem with
+ reversing on MS-Windows 95/98/ME.
+Solution: Restore the RevOut() function and use it in specific situations
+ only. (Ron Aaron)
+Files: src/gui_w32.c
+
+Patch 6.1.036
+Problem: This command may cause a crash: ":v/./,//-j". (Ralf Arens)
+Solution: Compute the right length of the regexp when it's empty.
+Files: src/search.c
+
+Patch 6.1.037
+Problem: When 'lazyredraw' is set, pressing "q" at the hit-enter prompt
+ causes an incomplete redraw and the cursor isn't positioned.
+ (Lubomir Host)
+Solution: Overrule 'lazyredraw' when do_redraw is set.
+Files: src/main.c, src/screen.c
+
+Patch 6.1.038
+Problem: Multi-byte: When a ":s" command contains a multibyte character
+ where the trail byte is '~' the text is messed up.
+Solution: Properly skip multibyte characters in regtilde() (Muraoka Taro)
+Files: src/regexp.c
+
+Patch 6.1.039
+Problem: When folds are defined and the file is changed outside of Vim,
+ reloading the file doesn't update the folds. (Anders
+ Schack-Nielsen)
+Solution: Recompute the folds after reloading the file.
+Files: src/fileio.c
+
+Patch 6.1.040
+Problem: When changing directory for expanding a file name fails there is
+ no error message.
+Solution: Give an error message for this situation. Don't change directory
+ if we can't return to the original directory.
+Files: src/diff.c, src/ex_docmd.c, src/globals.h, src/misc1.c,
+ src/os_unix.c
+
+Patch 6.1.041
+Problem: ":mkvimrc" doesn't handle a mapping that has a leading space in
+ the rhs. (Davyd Ondrejko)
+Solution: Insert a CTRL-V before the leading space. Also display leading
+ and trailing white space in <> form.
+Files: src/getchar.c, src/message.c
+
+Patch 6.1.042
+Problem: "vim -r" doesn't show all matches when 'wildignore' removes swap
+ files. (Steve Talley)
+Solution: Keep all matching swap file names.
+Files: src/memline.c
+
+Patch 6.1.043
+Problem: After patch 6.1.040 a few warnings are produced.
+Solution: Add a type cast to "char *" for mch_chdir(). (Axel Kielhorn)
+Files: src/diff.c, src/ex_docmd.c.c, src/misc1.c, src/os_unix.c
+
+Patch 6.1.044 (extra)
+Problem: GUI: When using the find/replace dialog with text that contains a
+ slash, an invalid substitute command is generated.
+ On Win32 a find doesn't work when 'insertmode' is set.
+Solution: Escape slashes with a backslash.
+ Make the Win32, Motif and GTK gui use common code for the
+ find/replace dialog.
+ Add the "match case" option for Motif and GTK.
+Files: src/feature.h, src/proto/gui.pro, src/gui.c, src/gui.h,
+ src/gui_motif.c, src/gui_gtk.c, src/gui_w48.c
+
+Patch 6.1.045
+Problem: In Visual mode, with lots of folds and 'scrolloff' set to 999,
+ moving the cursor down near the end of the file causes the text to
+ jump up and down. (Lubomir Host)
+Solution: Take into account that the cursor may be on the last line of a
+ closed fold.
+Files: src/move.c
+
+Patch 6.1.046
+Problem: X11 GUI: ":set lsp=2 gcr=n-v-i:hor1-blinkon0" draws a black
+ rectangle. ":set lsp=2 gcr=n-v-i:hor10-blinkon0" makes the cursor
+ disappear. (Nam SungHyun)
+Solution: Correctly compute the height of the horizontal cursor.
+Files: src/gui_gtk_x11.c, src/gui_x11.c
+
+Patch 6.1.047
+Problem: When skipping commands after an error was encountered, expressions
+ for ":if", ";elseif" and ":while" are still evaluated.
+Solution: Skip the expression after an error. (Servatius Brandt)
+Files: src/ex_docmd.c
+
+Patch 6.1.048
+Problem: Unicode 3.2 changes were missing a few Hangul Jamo characters.
+Solution: Recognize more characters as composing characters. (Jungshik Shin)
+Files: src/mbyte.c
+
+Patch 6.1.049 (extra)
+Problem: On a 32 bit display a valid color may cause an error message,
+ because its pixel value is negative. (Chris Paulson-Ellis)
+Solution: Check for -11111 instead of the color being negative.
+ Don't add one to the pixel value, -1 may be used for white.
+Files: src/globals.h, src/gui.c, src/gui.h, src/gui_amiga.c,
+ src/gui_athena.c, src/gui_beos.cc, src/gui_gtk_x11.c,
+ src/gui_mac.c, src/gui_motif.c, src/gui_photon.c,
+ src/gui_riscos.c, src/gui_w16.c, src/gui_w32.c, src/gui_w48.c,
+ src/gui_x11.c, src/mbyte.c, src/syntax.c
+
+Patch 6.1.050 (depends on 6.1.049)
+Problem: After patch 6.1.049 the non-GUI version doesn't compile.
+Solution: Add an #ifdef FEAT_GUI. (Robert Stanton)
+Files: src/syntax.c
+
+Patch 6.1.051 (depends on 6.1.044)
+Problem: Doesn't compile with GUI and small features.
+Solution: Adjust the #if for ga_append().
+Files: src/misc2.c
+
+Patch 6.1.052
+Problem: Unix: The executable() function doesn't work when the "which"
+ command isn't available.
+Solution: Go through $PATH manually. Also makes it work for VMS.
+Files: src/os_unix.c
+
+Patch 6.1.053
+Problem: When 'sessionoptions' contains "globals", or "localoptions" and an
+ option value contains a line break, the resulting script is wrong.
+Solution: Use "\n" and "\r" for a line break. (Srinath Avadhanula)
+Files: src/eval.c
+
+Patch 6.1.054
+Problem: GUI: A mouse click is not recognized at the more prompt, even when
+ 'mouse' includes 'r'.
+Solution: Recognize a mouse click at the more prompt.
+ Also accept a mouse click in the last line in the GUI.
+ Add "ml" entry in 'mouseshape'.
+Files: src/gui.c, src/message.c, src/misc1.c, src/misc2.c, src/option.c,
+ src/structs.h
+
+Patch 6.1.055
+Problem: When editing a compressed file, Vim will inspect the contents to
+ guess the filetype.
+Solution: Don't source scripts.vim for .Z, .gz, .bz2, .zip and .tgz files.
+Files: runtime/filetype.vim, runtime/plugin/gzip.vim
+
+Patch 6.1.056
+Problem: Loading the Syntax menu can take quite a bit of time.
+Solution: Add the "skip_syntax_sel_menu" variable. When it's defined the
+ available syntax files are not in the Syntax menu.
+Files: runtime/doc/gui.txt, runtime/menu.vim
+
+Patch 6.1.057
+Problem: An ESC inside a mapping doesn't work as documented when
+ 'insertmode' is set, it does go from Visual or Normal mode to
+ Insert mode. (Benji Fisher)
+Solution: Make it work as documented.
+Files: src/normal.c
+
+Patch 6.1.058
+Problem: When there is a closed fold just above the first line in the
+ window, using CTRL-X CTRL-Y in Insert mode will show only one line
+ of the fold. (Alexey Marinichev)
+Solution: Correct the topline by putting it at the start of the fold.
+Files: src/move.c
+
+Patch 6.1.059
+Problem: ":redir > ~/file" doesn't work. (Stephen Rasku)
+Solution: Expand environment variables in the ":redir >" argument.
+Files: src/ex_docmd.c
+
+Patch 6.1.060
+Problem: When 'virtualedit' is set and 'selection' is "exclusive", deleting
+ a character just before a tab changes the tab into spaces. Undo
+ doesn't restore the tab. (Helmut Stiegler)
+Solution: Don't replace the tab by spaces when it's not needed. Correctly
+ save the line before it's changed.
+Files: src/ops.c
+
+Patch 6.1.061
+Problem: When 'virtualedit' is set and 'selection' is "exclusive", a Visual
+ selection that ends just after a tab doesn't include that tab in
+ the highlighting. (Helmut Stiegler)
+Solution: Use a different way to exclude the character under the cursor.
+Files: src/screen.c
+
+Patch 6.1.062
+Problem: The "man" filetype plugin doesn't work properly on Solaris 5.
+Solution: Use a different way to detect that "man -s" should be used. (Hugh
+ Sasse)
+Files: runtime/ftplugin/man.vim
+
+Patch 6.1.063
+Problem: Java indenting doesn't work properly.
+Solution: Ignore comments when checking if the indent doesn't increase after
+ a "}".
+Files: runtime/indent/java.vim
+
+Patch 6.1.064
+Problem: The URLs that the netrw plugin recognized for ftp and rcp did not
+ conform to the standard method://[user@]host[:port]/path.
+Solution: Use ftp://[user@]host[[:#]port]/path, which supports both the new
+ and the previous style. Also added a bit of dav/cadaver support.
+ (Charles Campbell)
+Files: runtime/plugin/netrw.vim
+
+Patch 6.1.065
+Problem: VMS: The colorscheme, keymap and compiler menus are not filled in.
+Solution: Ignore case when looking for ".vim" files. (Coen Engelbarts)
+Files: runtime/menu.vim
+
+Patch 6.1.066 (extra)
+Problem: When calling system() in a plugin reading stdin hangs.
+Solution: Don't set the terminal to RAW mode when it wasn't in RAW mode
+ before the system() call.
+Files: src/os_amiga.c, src/os_msdos.c, src/os_riscos.c, src/os_unix.c,
+ src/os_win16.c, src/os_win32.c
+
+Patch 6.1.067
+Problem: ":set viminfo+=f0" is not working. (Benji Fisher)
+Solution: Check the "f" flag instead of "'" in 'viminfo'.
+Files: src/mark.c
+
+Patch 6.1.068
+Problem: When a file is reloaded after it was changed outside of Vim, diff
+ mode isn't updated. (Michael Naumann)
+Solution: Invalidate the diff info so that it's updated when needed.
+Files: src/fileio.c
+
+Patch 6.1.069
+Problem: When 'showmatch' is set and "$" is in 'cpoptions', using
+ "C}<Esc>" may forget to remove the "$". (Preben Guldberg)
+Solution: Restore dollar_vcol after displaying the matching cursor position.
+Files: src/search.c
+
+Patch 6.1.070 (depends on 6.1.060)
+Problem: Compiler warning for signed/unsigned mismatch. (Mike Williams)
+Solution: Add a typecast to int.
+Files: src/ops.c
+
+Patch 6.1.071
+Problem: When 'selection' is exclusive, g CTRL-G in Visual mode counts one
+ character too much. (David Necas)
+Solution: Subtract one from the end position.
+Files: src/ops.c
+
+Patch 6.1.072
+Problem: When a file name in a tags file starts with http:// or something
+ else for which there is a BufReadCmd autocommand, the file isn't
+ opened anyway.
+Solution: Check if there is a matching BufReadCmd autocommand and try to
+ open the file.
+Files: src/fileio.c, src/proto/fileio.pro, src/tag.c
+
+Patch 6.1.073 (extra)
+Problem: BC5: Can't easily specify a tiny, small, normal, big or huge
+ version.
+Solution: Allow selecting the version with the FEATURES variable. (Ajit
+ Thakkar)
+Files: src/Make_bc5.mak
+
+Patch 6.1.074
+Problem: When 'cdpath' includes "../..", changing to a directory in which
+ we currently already are doesn't work. ff_check_visited() adds
+ the directory both when using it as the root for searching and for
+ the actual matches. (Stephen Rasku)
+Solution: Use a separate list for the already searched directories.
+Files: src/misc2.c
+
+Patch 6.1.075 (depends on 6.1.072)
+Problem: Can't compile fileio.c on MS-Windows.
+Solution: Add a declaration for the "p" pointer. (Madoka Machitani)
+Files: src/fileio.c
+
+Patch 6.1.076 (extra)
+Problem: Macintosh: explorer plugin doesn't work on Mac Classic.
+ IME doesn't work. Dialog boxes don't work on Mac OS X
+Solution: Fix explorer plugin and key modifiers. (Axel Kielhorn)
+ Fix IME support. (Muraoka Taro)
+ Disable dialog boxes. (Benji Fisher)
+Files: src/edit.c, src/feature.h, src/gui_mac.c, src/os_mac.c
+
+Patch 6.1.077
+Problem: On a Debian system with ACL linking fails. (Lubomir Host)
+Solution: When the "acl" library is used, check if the "attr" library is
+ present and use it.
+Files: src/auto/configure, src/configure.in, src/link.sh
+
+Patch 6.1.078
+Problem: When using 'foldmethod' "marker" and the end marker appears before
+ the start marker in the file, no fold is found. (Nazri Ramliy)
+Solution: Don't let the fold depth go negative.
+Files: src/fold.c
+
+Patch 6.1.079
+Problem: When using "s" in Visual block mode with 'virtualedit' set, when
+ the selected block is after the end of some lines the wrong text
+ is inserted and some lines are skipped. (Servatius Brandt)
+Solution: Insert the right text and extend short lines.
+Files: src/ops.c
+
+Patch 6.1.080
+Problem: When using gcc with /usr/local already in the search path, adding
+ it again causes problems.
+Solution: Adjust configure.in to avoid adding /usr/local/include and
+ /usr/local/lib when using GCC and they are already used. (Johannes
+ Zellner)
+Files: src/auto/configure, src/configure.in
+
+Patch 6.1.081
+Problem: ":help CTRL-\_CTRL-N" doesn't work. (Christian J. Robinson)
+Solution: Double the backslash to avoid the special meaning of "\_".
+Files: src/ex_cmds.c
+
+Patch 6.1.082
+Problem: On MS-Windows the vimrc_example.vim script is sourced and then
+ mswin.vim. This enables using select mode, but since "p" is
+ mapped it doesn't replace the selection.
+Solution: Remove the mapping of "p" from vimrc_example.vim, it's obsolete.
+ (Vlad Sandrini)
+Files: runtime/vimrc_example.vim
+
+Patch 6.1.083
+Problem: When $LANG is "sk" or "sk_sk", the Slovak menu file isn't found.
+ (Martin Lacko)
+Solution: Guess the right menu file based on the system.
+Files: runtime/lang/menu_sk_sk.vim
+
+Patch 6.1.084 (depends on 6.1.080)
+Problem: "include" and "lib" are mixed up when checking the directories gcc
+ already searches.
+Solution: Swap the variable names. (SunHo Kim)
+Files: src/auto/configure, src/configure.in
+
+Patch 6.1.085
+Problem: When using CTRL-O CTRL-\ CTRL-N from Insert mode, the displayed
+ mode "(insert)" isn't removed. (Benji Fisher)
+Solution: Clear the command line.
+Files: src/normal.c
+
+Patch 6.1.086 (depends on 6.1.049)
+Problem: The guifg color for CursorIM doesn't take effect.
+Solution: Use the foreground color when it's defined. (Muraoka Taro)
+Files: src/gui.c
+
+Patch 6.1.087
+Problem: A thesaurus with Japanese characters has problems with characters
+ in different word classes.
+Solution: Only separate words with single-byte non-word characters.
+ (Muraoka Taro)
+Files: src/edit.c
+
+Patch 6.1.088 (extra)
+Problem: Win32: no debugging info is generated. Tags file excludes .cpp
+ files.
+Solution: Add "/map" to compiler flags. Add "*.cpp" to ctags command.
+ (Muraoka Taro)
+Files: src/Make_mvc.mak
+
+Patch 6.1.089
+Problem: On BSDI systems there is no ss_sp field in stack_t. (Robert Jan)
+Solution: Use ss_base instead.
+Files: src/auto/configure, src/configure.in, src/config.h.in,
+ src/os_unix.c
+
+Patch 6.1.090
+Problem: CTRL-F gets stuck when 'scrolloff' is non-zero and there is a mix
+ of long wrapping lines and a non-wrapping line.
+Solution: Check that CTRL-F scrolls at least one line.
+Files: src/move.c
+
+Patch 6.1.091
+Problem: GTK: Can't change preeditstate without setting 'imactivatekey'.
+Solution: Add some code to change preeditstate for OnTheSpot. (Yasuhiro
+ Matsumoto)
+Files: src/mbyte.c
+
+Patch 6.1.092
+Problem: ":mapclear <buffer>" doesn't work. (Srikanth Adayapalam)
+Solution: Allow an argument for ":mapclear".
+Files: src/ex_cmds.h
+
+Patch 6.1.093 (extra)
+Problem: Mac and MS-Windows GUI: when scrolling while ":s" is working the
+ results can be messed up, because the cursor is moved.
+Solution: Disallow direct scrolling when not waiting for a character.
+Files: src/gui_mac.c, src/gui_w16.c, src/gui_w32.c, src/gui_w48.c
+
+Patch 6.1.094
+Problem: Cygwin: Passing a file name that has backslashes isn't handled
+ very well.
+Solution: Convert file name arguments to Posix. (Chris Metcalf)
+Files: src/main.c
+
+Patch 6.1.095
+Problem: When using signs can free an item on the stack.
+ Overruling sign colors doesn't work. (Srikanth Sankaran)
+Solution: Don't free the item on the stack. Use NULL instead of "none" for
+ the value of the color.
+Files: src/gui_x11.c
+
+Patch 6.1.096
+Problem: When erasing the right half of a double-byte character, it may
+ cause further characters to be erased. (Yasuhiro Matsumoto)
+Solution: Make sure only one character is erased.
+Files: src/screen.c
+
+Patch 6.1.097 (depends on 6.1.090)
+Problem: When 'scrolloff' is set to a huge value, CTRL-F at the end of the
+ file scrolls one line. (Lubomir Host)
+Solution: Don't scroll when CTRL-F detects the end-of-file.
+Files: src/move.c
+
+Patch 6.1.098
+Problem: MS-Windows: When the xxd program is under "c:\program files" the
+ "Convert to Hex" menu doesn't work. (Brian Mathis)
+Solution: Put the path to xxd in double quotes.
+Files: runtime/menu.vim
+
+Patch 6.1.099
+Problem: Memory corrupted when closing a fold with more than 99999 lines.
+Solution: Allocate more space for the fold text. (Walter Briscoe)
+Files: src/eval.c
+
+Patch 6.1.100 (extra, depends on 6.1.088)
+Problem: Win32: VC5 and earlier don't support the /mapinfo option.
+Solution: Add "/mapinfo" only when "MAP=lines" is specified. (Muraoka Taro)
+Files: src/Make_mvc.mak
+
+Patch 6.1.101
+Problem: After using ":options" the tabstop of a new window is 15. Entry
+ in ":options" window for 'autowriteall' is wrong. (Antoine J
+ Mechelynck) Can't insert a space in an option value.
+Solution: Use ":setlocal" instead of ":set". Change "aw" to "awa".
+ Don't map space in Insert mode.
+Files: runtime/optwin.vim
+
+Patch 6.1.102
+Problem: Unprintable and multibyte characters in a statusline item are not
+ truncated correctly. (Yasuhiro Matsumoto)
+Solution: Count the width of characters instead of the number of bytes.
+Files: src/buffer.c
+
+Patch 6.1.103
+Problem: A function returning from a while loop, with 'verbose' set to 12
+ or higher, doesn't mention the return value. A function with the
+ 'abort' attribute may return -1 while the verbose message says
+ something else.
+Solution: Move the verbose message about returning from a function to
+ call_func(). (Servatius Brandt)
+Files: src/eval.c
+
+Patch 6.1.104
+Problem: GCC 3.1 appears to have an optimizer problem that makes test 3
+ crash.
+Solution: For GCC 3.1 add -fno-strength-reduce to avoid the optimizer bug.
+ Filter out extra info from "gcc --version".
+Files: src/auto/configure, src/configure.in
+
+Patch 6.1.105
+Problem: Win32: The default for 'shellpipe' doesn't redirect stderr. (Dion
+ Nicolaas)
+Solution: Redirect stderr, depending on the shell (like for 'shellredir').
+Files: src/option.c
+
+Patch 6.1.106
+Problem: The maze program crashes.
+Solution: Change "11" to "27" and it works. (Greg Roelofs)
+Files: runtime/macros/maze/mazeansi.c
+
+Patch 6.1.107
+Problem: When 'list' is set the current line in the error window may be
+ displayed wrong. (Muraoka Taro)
+Solution: Don't continue the line after the $ has been displayed and the
+ rightmost column is reached.
+Files: src/screen.c
+
+Patch 6.1.108
+Problem: When interrupting a filter command such as "!!sleep 20" the file
+ becomes read-only. (Mark Brader)
+Solution: Only set the read-only flag when opening a buffer is interrupted.
+ When the shell command was interrupted, read the output that was
+ produced so far.
+Files: src/ex_cmds.c, src/fileio.c
+
+Patch 6.1.109
+Problem: When 'eadirection' is "hor", using CTRL-W = doesn't equalize the
+ window heights. (Roman Neuhauser)
+Solution: Ignore 'eadirection' for CTRL-W =
+Files: src/window.c
+
+Patch 6.1.110
+Problem: When using ":badd file" when "file" is already present but not
+ listed, it stays unlisted. (David Frey)
+Solution: Set 'buflisted'.
+Files: src/buffer.c
+
+Patch 6.1.111
+Problem: It's not possible to detect using the Unix sources on Win32 or Mac.
+Solution: Add has("macunix") and has("win32unix").
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 6.1.112
+Problem: When using ":argdo", ":bufdo" or ":windo", CTRL-O doesn't go to
+ the cursor position from before this command but every position
+ where the argument was executed.
+Solution: Only remember the cursor position from before the ":argdo",
+ ":bufdo" and ":windo".
+Files: src/ex_cmds2.c, src/mark.c
+
+Patch 6.1.113
+Problem: ":bufdo bwipe" only wipes out half the buffers. (Roman Neuhauser)
+Solution: Decide what buffer to go to next before executing the command.
+Files: src/ex_cmds2.c
+
+Patch 6.1.114
+Problem: ":python import vim", ":python vim.current.buffer[0:0] = []" gives
+ a lalloc(0) error. (Chris Southern)
+Solution: Don't allocate an array when it's size is zero.
+Files: src/if_python.c
+
+Patch 6.1.115
+Problem: "das" on the white space at the end of a paragraph does not delete
+ the "." the sentence ends with.
+Solution: Don't exclude the last character when it is not white space.
+Files: src/search.c
+
+Patch 6.1.116
+Problem: When 'endofline' is changed while 'binary' is set a file should be
+ considered modified. (Olaf Buddenhagen)
+Solution: Remember the 'eol' value when editing started and consider the
+ file changed when the current value is different and 'binary' is
+ set. Also fix that the window title isn't updated when 'ff' or
+ 'bin' changes.
+Files: src/option.c, src/structs.h
+
+Patch 6.1.117
+Problem: Small problem with editing a file over ftp: and with Cygwin.
+Solution: Remove a dot from a ":normal" command. Use "cygdrive" where
+ appropriate. (Charles Campbell)
+Files: runtime/plugin/netrw.vim
+
+Patch 6.1.118
+Problem: When a file in diff mode is reloaded because it changed outside
+ of Vim, other windows in diff mode are not always updated.
+ (Michael Naumann)
+Solution: After reloading a file in diff mode mark all windows in diff mode
+ for redraw.
+Files: src/diff.c
+
+Patch 6.1.119 (extra)
+Problem: With the Sniff interface, using Sniff 4.0.X on HP-UX, there may be
+ a crash when connecting to Sniff.
+Solution: Initialize sniff_rq_sep such that its value can be changed.
+ (Martin Egloff)
+Files: src/if_sniff.c
+
+Patch 6.1.120 (depends on 6.1.097)
+Problem: When 'scrolloff' is non-zero and there are folds, CTRL-F at the
+ end of the file scrolls part of a closed fold. (Lubomir Host)
+Solution: Adjust the first line to the start of a fold.
+Files: src/move.c
+
+Patch 6.1.121 (depends on 6.1.098)
+Problem: When starting Select mode from Insert mode, then using the Paste
+ menu entry, the cursor is left before the last pasted character.
+ (Mario Schweigler)
+Solution: Set the cursor for Insert mode one character to the right.
+Files: runtime/menu.vim
+
+Patch 6.1.122
+Problem: ":file name" creates a new buffer to hold the old buffer name,
+ which becomes the alternate file. This buffer is unexpectedly
+ listed.
+Solution: Create the buffer for the alternate name unlisted.
+Files: src/ex_cmds.c
+
+Patch 6.1.123
+Problem: A ":match" command with more than one argument doesn't report an
+ error.
+Solution: Check for extra characters. (Servatius Brandt)
+Files: src/ex_docmd.c
+
+Patch 6.1.124
+Problem: When trying to exit and there is a hidden buffer that had 'eol'
+ off and 'bin' set exiting isn't possible. (John McGowan)
+Solution: Set b_start_eol when clearing the buffer.
+Files: src/buffer.c
+
+Patch 6.1.125
+Problem: Explorer plugin asks for saving a modified buffer even when it's
+ open in another window as well.
+Solution: Count the number of windows using the buffer.
+Files: runtime/plugin/explorer.vim
+
+Patch 6.1.126
+Problem: Adding the choices in the syntax menu is consuming much of the
+ startup time of the GUI while it's not often used.
+Solution: Only add the choices when the user wants to use them.
+Files: Makefile, runtime/makemenu.vim, runtime/menu.vim,
+ runtime/synmenu.vim, src/Makefile
+
+Patch 6.1.127
+Problem: When using "--remote file" and the server has 'insertmode' set,
+ commands are inserted instead of being executed. (Niklas Volbers)
+Solution: Go to Normal mode again after the ":drop" command.
+Files: src/main.c
+
+Patch 6.1.128
+Problem: The expression "input('very long prompt')" puts the cursor in the
+ wrong line (column is OK).
+Solution: Add the wrapped lines to the indent. (Yasuhiro Matsumoto)
+Files: src/ex_getln.c
+
+Patch 6.1.129
+Problem: On Solaris editing "file/" and then "file" results in using the
+ same buffer. (Jim Battle)
+Solution: Before using stat(), check that there is no illegal trailing
+ slash.
+Files: src/auto/configure, src/config.h.in, src/configure.in,
+ src/macros.h src/misc2.c, src/proto/misc2.pro
+
+Patch 6.1.130
+Problem: The documentation for some of the 'errorformat' items is unclear.
+Solution: Add more examples and explain hard to understand items. (Stefan
+ Roemer)
+Files: runtime/doc/quickfix.txt
+
+Patch 6.1.131
+Problem: X11 GUI: when expanding a CSI byte in the input stream to K_CSI,
+ the CSI byte itself isn't copied.
+Solution: Copy the CSI byte.
+Files: src/gui_x11.c
+
+Patch 6.1.132
+Problem: Executing a register in Ex mode may cause commands to be skipped.
+ (John McGowan)
+Solution: In Ex mode use an extra check if the register contents was
+ consumed, to avoid input goes into the typeahead buffer.
+Files: src/ex_docmd.c
+
+Patch 6.1.133
+Problem: When drawing double-wide characters in the statusline, may clear
+ half of a character. (Yasuhiro Matsumoto)
+Solution: Force redraw of the next character by setting the attributes
+ instead of putting a NUL in ScreenLines[]. Do put a NUL in
+ ScreenLines[] when overwriting half of a double-wide character.
+Files: src/screen.c
+
+Patch 6.1.134
+Problem: An error for a trailing argument of ":match" should not be given
+ after ":if 0". (Servatius Brandt)
+Solution: Only do the check when executing commands.
+Files: src/ex_docmd.c
+
+Patch 6.1.135
+Problem: Passing a command to the shell that includes a newline always has
+ a backslash before the newline.
+Solution: Remove one backslash before the newline. (Servatius Brandt)
+Files: src/ex_docmd.c
+
+Patch 6.1.136
+Problem: When $TERM is "linux" the default for 'background' is "dark", even
+ though the GUI uses a light background. (Hugh Allen)
+Solution: Don't mark the option as set when defaulting to "dark" for the
+ linux console. Also reset 'background' to "light" when the GUI
+ has a light background.
+Files: src/option.c
+
+Patch 6.1.137
+Problem: Converting to HTML has a clumsy way of dealing with tabs which may
+ change the highlighting.
+Solution: Replace tabs with spaces after converting a line to HTML. (Preben
+ Guldberg)
+Files: runtime/syntax/2html.vim
+
+Patch 6.1.138 (depends on 6.1.126)
+Problem: Adding extra items to the Syntax menu can't be done when the "Show
+ individual choices" menu is used.
+Solution: Use ":runtime!" instead of ":source", so that all synmenu.vim
+ files in the runtime path are loaded. (Servatius Brandt)
+ Also fix that a translated menu can't be removed.
+Files: runtime/menu.vim
+
+Patch 6.1.139
+Problem: Cygwin: PATH_MAX is not defined.
+Solution: Include limits.h. (Dan Sharp)
+Files: src/main.c
+
+Patch 6.1.140
+Problem: Cygwin: ":args `ls *.c`" does not work if the shell command
+ produces CR NL line separators.
+Solution: Remove the CR characters ourselves. (Pavol Juhas)
+Files: src/os_unix.c
+
+Patch 6.1.141
+Problem: ":wincmd gx" may cause problems when mixed with other commands.
+ ":wincmd c" doesn't close the window immediately. (Benji Fisher)
+Solution: Pass the extra command character directly instead of using the
+ stuff buffer and call ex_close() directly.
+Files: src/ex_docmd.c, src/normal.c, src/proto/normal.pro,
+ src/proto/window.pro, src/window.c
+
+Patch 6.1.142
+Problem: Defining paragraphs without a separating blank line isn't
+ possible. Paragraphs can't be formatted automatically.
+Solution: Allow defining paragraphs with lines that end in white space.
+ Added the 'w' and 'a' flags in 'formatoptions'.
+Files: runtime/doc/change.txt, src/edit.c, src/misc1.c, src/normal.c,
+ src/option.h, src/ops.c, src/proto/edit.pro, src/proto/ops.pro,
+ src/vim.h
+
+Patch 6.1.143 (depends on 6.1.142)
+Problem: Auto formatting near the end of the file moves the cursor to a
+ wrong position. In Insert mode some lines are made one char too
+ narrow. When deleting a line undo might not always work properly.
+Solution: Don't always move to the end of the line in the last line. Don't
+ position the cursor past the end of the line in Insert mode.
+ After deleting a line save the cursor line for undo.
+Files: src/edit.c, src/ops.c, src/normal.c
+
+Patch 6.1.144
+Problem: Obtaining the size of a line in screen characters can be wrong.
+ A pointer may wrap around zero.
+Solution: In win_linetabsize() check for a MAXCOL length argument. (Jim
+ Dunleavy)
+Files: src/charset.c
+
+Patch 6.1.145
+Problem: GTK: Drag&drop with more than 3 files may cause a crash. (Mickael
+ Marchand)
+Solution: Rewrite the code that parses the received list of files to be more
+ robust.
+Files: src/charset.c, src/gui_gtk_x11.c
+
+Patch 6.1.146
+Problem: MS-Windows: When $HOME is constructed from $HOMEDRIVE and
+ $HOMEPATH, it is not used for storing the _viminfo file. (Normal
+ Diamond)
+Solution: Set $HOME with the value obtained from $HOMEDRIVE and $HOMEPATH.
+Files: src/misc1.c
+
+Patch 6.1.147 (extra)
+Problem: MS-Windows: When a dialog has no default button, pressing Enter
+ ends it anyway and all buttons are selected.
+Solution: Don't end a dialog when there is no default button. Don't select
+ all button when there is no default. (Vince Negri)
+Files: src/gui_w32.c
+
+Patch 6.1.148 (extra)
+Problem: MS-Windows: ACL is not properly supported.
+Solution: Add an access() replacement that also works for ACL. (Mike
+ Williams)
+Files: runtime/doc/editing.txt, src/os_win32.c
+
+Patch 6.1.149 (extra)
+Problem: MS-Windows: Can't use diff mode from the file explorer.
+Solution: Add a "diff with Vim" context menu entry. (Dan Sharp)
+Files: GvimExt/gvimext.cpp, GvimExt/gvimext.h
+
+Patch 6.1.150
+Problem: OS/2, MS-Windows and MS-DOS: When 'shellslash' is set getcwd()
+ still uses backslash. (Yegappan Lakshmanan)
+Solution: Adjust slashes in getcwd().
+Files: src/eval.c
+
+Patch 6.1.151 (extra)
+Problem: Win32: The NTFS substream isn't copied.
+Solution: Copy the substream when making a backup copy. (Muraoka Taro)
+Files: src/fileio.c, src/os_win32.c, src/proto/os_win32.pro
+
+Patch 6.1.152
+Problem: When $LANG is iso8859-1 translated menus are not used.
+Solution: Change iso8859 to iso_8859.
+Files: runtime/menu.vim
+
+Patch 6.1.153
+Problem: Searching in included files may search recursively when the path
+ starts with "../". (Sven Berkvens-Matthijsse)
+Solution: Compare full file names, use inode/device when possible.
+Files: src/search.c
+
+Patch 6.1.154 (extra)
+Problem: DJGPP: "vim -h" leaves the cursor in a wrong position.
+Solution: Don't position the cursor using uninitialized variables. (Jim
+ Dunleavy)
+Files: src/os_msdos.c
+
+Patch 6.1.155
+Problem: Win32: Cursor may sometimes disappear in Insert mode.
+Solution: Change "hor10" in 'guicursor' to "hor15". (Walter Briscoe)
+Files: src/option.c
+
+Patch 6.1.156
+Problem: Conversion between DBCS and UCS-2 isn't implemented cleanly.
+Solution: Clean up a few things.
+Files: src/mbyte.c, src/structs.h
+
+Patch 6.1.157
+Problem: 'hlsearch' highlights only the second comma in ",,,,," with
+ "/,\@<=[^,]*". (Preben Guldberg)
+Solution: Also check for an empty match to start just after a previous
+ match.
+Files: src/screen.c
+
+Patch 6.1.158
+Problem: "zs" and "ze" don't work correctly with ":set nowrap siso=1".
+ (Preben Guldberg)
+Solution: Take 'siso' into account when computing the horizontal scroll
+ position for "zs" and "ze".
+Files: src/normal.c
+
+Patch 6.1.159
+Problem: When expanding an abbreviation that includes a multibyte
+ character too many characters are deleted. (Andrey Urazov)
+Solution: Delete the abbreviation counting characters instead of bytes.
+Files: src/getchar.c
+
+Patch 6.1.160
+Problem: ":$read file.gz" doesn't work. (Preben Guldberg)
+Solution: Don't use the '[ mark after it has become invalid.
+Files: runtime/plugin/gzip.vim
+
+Patch 6.1.161 (depends on 6.1.158)
+Problem: Warning for signed/unsigned compare. Can set 'siso' to a negative
+ value. (Mike Williams)
+Solution: Add a typecast. Add a check for 'siso' being negative.
+Files: src/normal.c, src/option.c
+
+Patch 6.1.162
+Problem: Python interface: Didn't initialize threads properly.
+Solution: Call PyEval_InitThreads() when starting up.
+Files: src/if_python.c
+
+Patch 6.1.163
+Problem: Win32: Can't compile with Python after 6.1.162.
+Solution: Dynamically load PyEval_InitThreads(). (Dan Sharp)
+Files: src/if_python.c
+
+Patch 6.1.164
+Problem: If 'modifiable' is off, converting to xxd fails and 'filetype' is
+ changed to "xxd" anyway.
+Solution: Don't change 'filetype' when conversion failed.
+Files: runtime/menu.vim
+
+Patch 6.1.165
+Problem: Making changes in several lines and then a change in one of these
+ lines that splits it in two or more lines, undo information was
+ corrupted. May cause a crash. (Dave Fishburn)
+Solution: When skipping to save a line for undo because it was already
+ saved, move it to become the last saved line, so that when the
+ command changes the line count other saved lines are not involved.
+Files: src/undo.c
+
+Patch 6.1.166
+Problem: When 'autoindent' is set and mswin.vim has been sourced, pasting
+ with CTRL-V just after auto-indenting removes the indent. (Shlomi
+ Fish)
+Solution: First insert an "x" and delete it again, so that the auto-indent
+ remains.
+Files: runtime/mswin.vim
+
+Patch 6.1.167
+Problem: When giving a negative argument to ":retab" strange things start
+ happening. (Hans Ginzel)
+Solution: Check for a negative value.
+Files: src/ex_cmds.c
+
+Patch 6.1.168
+Problem: Pressing CTRL-C at the hit-enter prompt doesn't end the prompt.
+Solution: Make CTRL-C stop the hit-enter prompt.
+Files: src/message.c
+
+Patch 6.1.169
+Problem: bufexists() finds a buffer by using the name of a symbolic link to
+ it, but bufnr() doesn't. (Yegappan Lakshmanan)
+Solution: When bufnr() can't find a buffer, try using the same method as
+ bufexists().
+Files: src/eval.c
+
+Patch 6.1.170
+Problem: Using ":mksession" uses the default session file name, but "vim
+ -S" doesn't. (Hans Ginzel)
+Solution: Use the default session file name if "-S" is the last command
+ line argument or another option follows.
+Files: runtime/doc/starting.txt, src/main.c
+
+Patch 6.1.171
+Problem: When opening a line just above a closed fold with "O" and the
+ comment leader is automatically inserted, the cursor is displayed
+ in the first column. (Sung-Hyun Nam)
+Solution: Update the flag that indicates the cursor is in a closed fold.
+Files: src/misc1.c
+
+Patch 6.1.172
+Problem: Command line completion of ":tag /pat" does not show the same
+ results as the tags the command actually finds. (Gilles Roy)
+Solution: Don't modify the pattern to make it a regexp.
+Files: src/ex_getln.c, src/tag.c
+
+Patch 6.1.173
+Problem: When using remote control to edit a position in a file and this
+ file is the current buffer and it's modified, the window is split
+ and the ":drop" command fails.
+Solution: Don't split the window, keep editing the same buffer.
+ Use the ":drop" command in VisVim to avoid the problem there.
+Files: src/ex_cmds.c, src/ex_cmds2.c, src/proto/ex_cmds2.pro,
+ VisVim/Commands.cpp
+
+Patch 6.1.174
+Problem: It is difficult to know in a script whether an option not only
+ exists but really works.
+Solution: Add "exists('+option')".
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 6.1.175
+Problem: When reading commands from a pipe and a CTRL-C is pressed, Vim
+ will hang. (Piet Delport)
+Solution: Don't keep reading characters to clear typeahead when an interrupt
+ was detected, stop when a single CTRL-C is read.
+Files: src/getchar.c, src/ui.c
+
+Patch 6.1.176
+Problem: When the stack limit is very big a false out-of-stack error may
+ be detected.
+Solution: Add a check for overflow of the stack limit computation. (Jim
+ Dunleavy)
+Files: src/os_unix.c
+
+Patch 6.1.177 (depends on 6.1.141)
+Problem: ":wincmd" does not allow a following command. (Gary Johnson)
+Solution: Check for a following " | cmd". Also give an error for trailing
+ characters.
+Files: src/ex_docmd.c
+
+Patch 6.1.178
+Problem: When 'expandtab' is set "r<C-V><Tab>" still expands the Tab.
+ (Bruce deVisser)
+Solution: Replace with a literal Tab.
+Files: src/normal.c
+
+Patch 6.1.179 (depends on 6.1.091)
+Problem: When using X11R5 XIMPreserveState is undefined. (Albert Chin)
+Solution: Include the missing definitions.
+Files: src/mbyte.c
+
+Patch 6.1.180
+Problem: Use of the GUI code for forking is inconsistent.
+Solution: Define MAY_FORK and use it for later #ifdefs. (Ben Fowlwer)
+Files: src/gui.c
+
+Patch 6.1.181
+Problem: If the terminal doesn't wrap from the last char in a line to the
+ next line, the last column is blanked out. (Peter Karp)
+Solution: Don't output a space to mark the wrap, but the same character
+ again.
+Files: src/screen.c
+
+Patch 6.1.182 (depends on 6.1.142)
+Problem: It is not possible to auto-format comments only. (Moshe Kaminsky)
+Solution: When the 'a' and 'c' flags are in 'formatoptions' only auto-format
+ comments.
+Files: runtime/doc/change.txt, src/edit.c
+
+Patch 6.1.183
+Problem: When 'fencs' is empty and 'enc' is utf-8, reading a file with
+ illegal bytes gives "CONVERSION ERROR" even though no conversion
+ is done. 'readonly' is set, even though writing the file results
+ in an unmodified file.
+Solution: For this specific error use "ILLEGAL BYTE" and don't set
+ 'readonly'.
+Files: src/fileio.c
+
+Patch 6.1.184 (extra)
+Problem: The extra mouse buttons found on some mice don't work.
+Solution: Support two extra buttons for MS-Windows. (Michael Geddes)
+Files: runtime/doc/term.txt, src/edit.c, src/ex_getln.c, src/gui.c,
+ src/gui_w32.c, src/gui_w48.c, src/keymap.h, src/message.c,
+ src/misc1.c, src/misc2.c, src/normal.c, src/vim.h
+
+Patch 6.1.185 (depends on 6.1.182)
+Problem: Can't compile without +comments feature.
+Solution: Add #ifdef FEAT_COMMENTS. (Christian J. Robinson)
+Files: src/edit.c
+
+Patch 6.1.186 (depends on 6.1.177)
+Problem: ":wincmd" does not allow a following comment. (Aric Blumer)
+Solution: Check for a following double quote.
+Files: src/ex_docmd.c
+
+Patch 6.1.187
+Problem: Using ":doarg" with 'hidden' set and the current file is the only
+ argument and was modified gives an error message. (Preben
+ Guldberg)
+Solution: Don't try re-editing the same file.
+Files: src/ex_cmds2.c
+
+Patch 6.1.188 (depends on 6.1.173)
+Problem: Unused variable in the small version.
+Solution: Move the declaration for "p" inside #ifdef FEAT_LISTCMDS.
+Files: src/ex_cmds2.c
+
+Patch 6.1.189
+Problem: inputdialog() doesn't work when 'c' is in 'guioptions'. (Aric
+ Blumer)
+Solution: Fall back to the input() function in this situation.
+Files: src/eval.c
+
+Patch 6.1.190 (extra)
+Problem: VMS: doesn't build with GTK GUI. Various other problems.
+Solution: Fix building for GTK. Improved Perl, Python and TCL support.
+ Improved VMS documentation. (Zoltan Arpadffy)
+ Added Vimtutor for VMS (T. R. Wyant)
+Files: runtime/doc/os_vms.txt, src/INSTALLvms.txt, src/gui_gtk_f.h,
+ src/if_tcl.c, src/main.c, src/gui_gtk_vms.h, src/Make_vms.mms,
+ src/os_vms.opt, src/proto/if_tcl.pro, vimtutor.com,
+ src/testdir/Make_vms.mms
+
+Patch 6.1.191
+Problem: When using "vim -s script" and redirecting the output, the delay
+ for the "Output is not to a terminal" warning slows Vim down too
+ much.
+Solution: Don't delay when reading commands from a script.
+Files: src/main.c
+
+Patch 6.1.192
+Problem: ":diffsplit" doesn't add "hor" to 'scrollopt'. (Gary Johnson)
+Solution: Add "hor" to 'scrollopt' each time ":diffsplit" is used.
+Files: src/diff.c, src/main.c
+
+Patch 6.1.193
+Problem: Crash in in_id_list() for an item with a "containedin" list. (Dave
+ Fishburn)
+Solution: Check for a negative syntax id, used for keywords.
+Files: src/syntax.c
+
+Patch 6.1.194
+Problem: When "t_ti" is set but it doesn't cause swapping terminal pages,
+ "ZZ" may cause the shell prompt to appear on top of the file-write
+ message.
+Solution: Scroll the text up in the Vim page before swapping to the terminal
+ page. (Michael Schroeder)
+Files: src/os_unix.c
+
+Patch 6.1.195
+Problem: The quickfix and preview windows always keep their height, while
+ other windows can't fix their height.
+Solution: Add the 'winfixheight' option, so that a fixed height can be
+ specified for any window. Also fix that the wildmenu may resize a
+ one-line window to a two-line window if 'ls' is zero.
+Files: runtime/doc/options.txt, runtime/optwin.vim, src/ex_cmds.c,
+ src/ex_getln.c, src/globals.h, src/option.c, src/quickfix.c,
+ src/screen.c, src/structs.h, src/window.c
+
+Patch 6.1.196 (depends on 6.1.084)
+Problem: On Mac OS X 10.2 generating osdef.h fails.
+Solution: Add -no-cpp-precomp to avoid using precompiled header files, which
+ disables printing the search path. (Ben Fowler)
+Files: src/auto/configure, src/configure.in
+
+Patch 6.1.197
+Problem: ":help <C-V><C-\><C-V><C-N>" (resulting in <1c><0e>) gives an
+ error message. (Servatius Brandt)
+Solution: Double the backslash in "CTRL-\".
+Files: src/ex_cmds.c
+
+Patch 6.1.198 (extra) (depends on 6.1.076)
+Problem: Mac OS X: Dialogues don't work.
+Solution: Fix a crashing problem for some GUI dialogues. Fix a problem when
+ saving to a new file from the GUI. (Peter Cucka)
+Files: src/feature.h, src/gui_mac.c
+
+Patch 6.1.199
+Problem: 'guifontwide' doesn't work on Win32.
+Solution: Output each wide character separately. (Michael Geddes)
+Files: src/gui.c
+
+Patch 6.1.200
+Problem: ":syn sync fromstart" is not skipped after ":if 0". This can make
+ syntax highlighting very slow.
+Solution: Check "eap->skip" appropriately. (Rob West)
+Files: src/syntax.c
+
+Patch 6.1.201 (depends on 6.1.192)
+Problem: Warning for illegal pointer combination. (Zoltan Arpadffy)
+Solution: Add a typecast.
+Files: src/diff.c
+
+Patch 6.1.202 (extra)(depends on 6.1.148)
+Problem: Win32: filewritable() doesn't work properly on directories.
+Solution: fix filewritable(). (Mike Williams)
+Files: src/os_win32.c
+
+Patch 6.1.203
+Problem: ":%s/~//" causes a crash after ":%s/x//". (Gary Holloway)
+Solution: Avoid reading past the end of a line when "~" is empty.
+Files: src/regexp.c
+
+Patch 6.1.204 (depends on 6.1.129)
+Problem: Warning for an illegal pointer on Solaris.
+Solution: Add a typecast. (Derek Wyatt)
+Files: src/misc2.c
+
+Patch 6.1.205
+Problem: The gzip plugin changes the alternate file when editing a
+ compressed file. (Oliver Fuchs)
+Solution: Temporarily remove the 'a' and 'A' flags from 'cpo'.
+Files: runtime/plugin/gzip.vim
+
+Patch 6.1.206
+Problem: The script generated with ":mksession" doesn't work properly when
+ some commands are mapped.
+Solution: Use ":normal!" instead of ":normal". And use ":wincmd" where
+ possible. (Muraoka Taro)
+Files: src/ex_docmd.c, src/fold.c
+
+Patch 6.1.207
+Problem: Indenting a Java file hangs below a line with a comment after a
+ command.
+Solution: Break out of a loop. (Andre Pang)
+ Also line up } with matching {.
+Files: runtime/indent/java.vim
+
+Patch 6.1.208
+Problem: Can't use the buffer number from the Python interface.
+Solution: Add buffer.number. (Michal Vitecek)
+Files: src/if_python.c
+
+Patch 6.1.209
+Problem: Printing doesn't work on Mac OS classic.
+Solution: Use a ":" for path separator when opening the resource file. (Axel
+ Kielhorn)
+Files: src/ex_cmds2.c
+
+Patch 6.1.210
+Problem: When there is an iconv() conversion error when reading a file
+ there can be an error the next time iconv() is used.
+Solution: Reset the state of the iconv() descriptor. (Yasuhiro Matsumoto)
+Files: src/fileio.c
+
+Patch 6.1.211
+Problem: The message "use ! to override" is confusing.
+Solution: Make it "add ! to override".
+Files: src/buffer.c, src/eval.c, src/ex_docmd.c, src/fileio.c,
+ src/globals.h
+
+Patch 6.1.212
+Problem: When Vim was started with "-R" ":new" creates a buffer
+ 'noreadonly' while ":enew" has 'readonly' set. (Preben Guldberg)
+Solution: Don't set 'readonly' in a new empty buffer for ":enew".
+Files: src/ex_docmd.c
+
+Patch 6.1.213
+Problem: Using CTRL-W H may cause a big gap to appear below the last
+ window. (Aric Blumer)
+Solution: Don't set the window height when there is a vertical split.
+ (Yasuhiro Matsumoto)
+Files: src/window.c
+
+Patch 6.1.214
+Problem: When installing Vim and the runtime files were checked out from
+ CVS the CVS directories will also be installed.
+Solution: Avoid installing the CVS dirs and their contents.
+Files: src/Makefile
+
+Patch 6.1.215
+Problem: Win32: ":pwd" uses backslashes even when 'shellslash' is set.
+ (Xiangjiang Ma)
+Solution: Adjust backslashes before printing the message.
+Files: src/ex_docmd.c
+
+Patch 6.1.216
+Problem: When dynamically loading the iconv library, the error codes may be
+ confused.
+Solution: Use specific error codes for iconv and redefine them for dynamic
+ loading. (Yasuhiro Matsumoto)
+Files: src/fileio.c, src/mbyte.c, src/vim.h
+
+Patch 6.1.217
+Problem: When sourcing the same Vim script using a different name (symbolic
+ link or MS-Windows 8.3 name) it is listed twice with
+ ":scriptnames". (Tony Mechelynck)
+Solution: Turn the script name into a full path before using it. On Unix
+ compare inode/device numbers.
+Files: src/ex_cmds2.c
+
+Patch 6.1.218
+Problem: No error message for using the function argument "5+". (Servatius
+ Brandt)
+Solution: Give an error message if a function or variable is expected but is
+ not found.
+Files: src/eval.c
+
+Patch 6.1.219
+Problem: When using ":amenu :b 1<CR>" with a Visual selection and
+ 'insertmode' is set, Vim does not return to Insert mode. (Mickael
+ Marchand)
+Solution: Add the command CTRL-\ CTRL-G that goes to Insert mode if
+ 'insertmode' is set and to Normal mode otherwise. Append this to
+ menus defined with ":amenu".
+Files: src/edit.c, src/ex_getln.c, src/normal.c
+
+Patch 6.1.220
+Problem: When using a BufReadPost autocommand that changes the line count,
+ e.g., "$-1join", reloading a file that was changed outside Vim
+ does not work properly. (Alan G Isaac)
+Solution: Make the buffer empty before reading the new version of the file.
+ Save the lines in a dummy buffer, so that they can be put back
+ when reading the file fails.
+Files: src/buffer.c, src/ex_cmds.c, src/fileio.c, src/globals.h,
+ src/proto/buffer.pro
+
+Patch 6.1.221
+Problem: Changing case may not work properly, depending on the current
+ locale.
+Solution: Add the 'casemap' option to let the user choose how changing case
+ is to be done.
+ Also fix lowering case when an UTF-8 character doesn't keep the
+ same byte length.
+Files: runtime/doc/options.txt, src/ascii.h, src/auto/configure,
+ src/buffer.c, src/charset.c, src/config.h.in, src/configure.in,
+ src/diff.c, src/edit.c, src/eval.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/fileio.c, src/gui_amiga.c
+ src/gui_mac.c, src/gui_photon.c, src/gui_w48.c, src/gui_beos.cc,
+ src/macros.h, src/main.c, src/mbyte.c, src/menu.c, src/message.c,
+ src/misc1.c, src/misc2.c, src/option.c, src/os_msdos.c,
+ src/os_mswin.c, src/proto/charset.pro, src/regexp.c, src/option.h,
+ src/syntax.c
+
+Patch 6.1.222 (depends on 6.1.219)
+Problem: Patch 6.1.219 was incomplete.
+Solution: Add the changes for ":amenu".
+Files: src/menu.c
+
+Patch 6.1.223 (extra)
+Problem: Win32: When IME is activated 'iminsert' is set, but it might never
+ be reset when IME is disabled. (Muraoka Taro)
+ All systems: 'iminsert' is set to 2 when leaving Insert mode, even
+ when langmap is being used. (Peter Valach)
+Solution: Don't set "b_p_iminsert" in _OnImeNotify(). (Muraoka Taro)
+ Don't store the status of the input method in 'iminsert' when
+ 'iminsert' is one. Also for editing the command line and for
+ arguments to Normal mode commands.
+Files: src/edit.c, src/ex_getln.c, src/gui_w32.c, src/normal.c
+
+Patch 6.1.224
+Problem: "expand('$VAR')" returns an empty string when the expanded $VAR
+ is not an existing file. (Aric Blumer)
+Solution: Included non-existing files, as documented.
+Files: src/eval.c
+
+Patch 6.1.225
+Problem: Using <C-O><C-^> in Insert mode has a delay when starting "vim -u
+ NONE" and ":set nocp hidden". (Emmanuel) do_ecmd() uses
+ fileinfo(), the redraw is done after a delay to give the user time
+ to read the message.
+Solution: Put the message from fileio() in "keep_msg", so that the redraw is
+ done before the delay (still needed to avoid the mode message
+ overwrites the fileinfo() message).
+Files: src/buffer.c
+
+Patch 6.1.226
+Problem: Using ":debug" with a ":normal" command may cause a hang. (Colin
+ Keith)
+Solution: Save the typeahead buffer when obtaining a debug command.
+Files: src/ex_cmds2.c, src/getchar.c, src/proto/getchar.pro
+
+Patch 6.1.227
+Problem: It is possible to use a variable name "asdf:asdf" and ":let j:asdf
+ = 5" does not give an error message. (Mikolaj Machowski)
+Solution: Check for a ":" inside the variable name.
+Files: src/eval.c
+
+Patch 6.1.228 (extra)
+Problem: Win32: The special output function for Hangul is used too often,
+ causing special handling for other situations to be skipped.
+ bInComposition is always FALSE, causing ImeGetTempComposition()
+ always to return NULL.
+Solution: Remove HanExtTextOut(). Delete the dead code around
+ bInComposition and ImeGetTempComposition().
+Files: src/gui_w16.c, src/gui_w32.c, src/gui_w48.c
+
+Patch 6.1.229
+Problem: Win32: Conversion to/from often used codepages requires the iconv
+ library, which is not always available.
+Solution: Use standard MS-Windows functions for the conversion when
+ possible. (mostly by Glenn Maynard)
+ Also fixes missing declaration for patch 6.1.220.
+Files: src/fileio.c
+
+Patch 6.1.230 (extra)
+Problem: Win16: building doesn't work.
+Solution: Exclude the XBUTTON handling. (Vince Negri)
+Files: src/gui_w48.c
+
+Patch 6.1.231
+Problem: Double clicking with the mouse to select a word does not work for
+ multibyte characters.
+Solution: Use vim_iswordc() instead of vim_isIDc(). This means 'iskeyword'
+ is used instead of 'isident'. Also fix that mixing ASCII with
+ multibyte word characters doesn't work, the mouse class for
+ punctuation and word characters was mixed up.
+Files: src/normal.c
+
+Patch 6.1.232 (depends on 6.1.226)
+Problem: Using ex_normal_busy while it might not be available. (Axel
+ Kielhorn)
+Solution: Only use ex_normal_busy when FEAT_EX_EXTRA is defined.
+Files: src/ex_cmds2.c
+
+Patch 6.1.233
+Problem: ":help expr-||" does not work.
+Solution: Don't use the '|' as a command separator
+Files: src/ex_cmds.c
+
+Patch 6.1.234 (depends on 6.1.217)
+Problem: Get a warning for using a negative value for st_dev.
+Solution: Don't assign a negative value to st_dev.
+Files: src/ex_cmds2.c
+
+Patch 6.1.235 (depends on 6.1.223)
+Problem: 'iminsert' is changed from 1 to 2 when leaving Insert mode. (Peter
+ Valach)
+Solution: Check "State" before resetting it to NORMAL.
+Files: src/edit.c
+
+Patch 6.1.236
+Problem: Memory leaks when appending lines for ":diffget" or ":diffput" and
+ when reloading a changed buffer.
+Solution: Free a line after calling ml_append().
+Files: src/diff.c, src/fileio.c
+
+Patch 6.1.237
+Problem: Putting in Visual block mode does not work correctly when "$" was
+ used or when the first line is short. (Christian Michon)
+Solution: First delete the selected text and then put the new text. Save
+ and restore registers as necessary.
+Files: src/globals.h, src/normal.c, src/ops.c, src/proto/ops.pro,
+ src/vim.h
+
+Patch 6.1.238 (extra)
+Problem: Win32: The "icon=" argument for the ":menu" command does not
+ search for the bitmap file.
+Solution: Expand environment variables and search for the bitmap file.
+ (Vince Negri)
+ Make it consistent, use the same mechanism for X11 and GTK.
+Files: src/gui.c src/gui_gtk.c, src/gui_w32.c, src/gui_x11.c,
+ src/proto/gui.pro
+
+Patch 6.1.239
+Problem: Giving an error for missing :endif or :endwhile when being
+ interrupted.
+Solution: Don't give these messages when interrupted.
+Files: src/ex_docmd.c, src/os_unix.c
+
+Patch 6.1.240 (extra)
+Problem: Win32 with BCC 5: CPU may be defined in the environment, which
+ causes a wrong argument for the compiler. (Walter Briscoe)
+Solution: Use CPUNR instead of CPU.
+Files: src/Make_bc5.mak
+
+Patch 6.1.241
+Problem: Something goes wrong when drawing or undrawing the cursor.
+Solution: Remember when the cursor invalid in a better way.
+Files: src/gui.c
+
+Patch 6.1.242
+Problem: When pasting a large number of lines on the command line it is not
+ possible to interrupt. (Jean Jordaan)
+Solution: Check for an interrupt after each pasted line.
+Files: src/ops.c
+
+Patch 6.1.243 (extra)
+Problem: Win32: When the OLE version is started and wasn't registered, a
+ message pops up to suggest registering, even when this isn't
+ possible (when the registry is not writable).
+Solution: Check if registering is possible before asking whether it should
+ be done. (Walter Briscoe)
+ Also avoid restarting Vim after registering.
+Files: src/if_ole.cpp
+
+Patch 6.1.244
+Problem: Patch 6.1.237 was missing the diff for vim.h. (Igor Goldenberg)
+Solution: Include it here.
+Files: src/vim.h
+
+Patch 6.1.245
+Problem: Comparing with ignored case does not work properly for Unicode
+ with a locale where case folding an ASCII character results in a
+ multibyte character. (Glenn Maynard)
+Solution: Handle ignore-case compare for Unicode differently.
+Files: src/mbyte.c
+
+Patch 6.1.246
+Problem: ":blast" goes to the first buffer if the last one is unlisted.
+ (Andrew Stryker)
+Solution: From the last buffer search backwards for the first listed buffer
+ instead of forwards.
+Files: src/ex_docmd.c
+
+Patch 6.1.247
+Problem: ACL support doesn't always work properly.
+Solution: Add a configure argument to disable ACL "--disable-acl". (Thierry
+ Vignaud)
+Files: src/auto/configure, src/configure.in
+
+Patch 6.1.248
+Problem: Typing 'q' at the more-prompt for ":let" does not quit the
+ listing. (Hari Krishna Dara)
+Solution: Quit the listing when got_int is set.
+Files: src/eval.c
+
+Patch 6.1.249
+Problem: Can't expand a path on the command line if it includes a "|" as a
+ trail byte of a multibyte character.
+Solution: Check for multibyte characters. (Yasuhiro Matsumoto)
+Files: src/ex_docmd.c
+
+Patch 6.1.250
+Problem: When changing the value of 'lines' inside the expression set with
+ 'diffexpr' Vim might crash. (Dave Fishburn)
+Solution: Don't allow changing the screen size while updating the screen.
+Files: src/globals.h, src/option.c, src/screen.c
+
+Patch 6.1.251
+Problem: Can't use completion for ":lcd" and ":lchdir" like ":cd".
+Solution: Expand directory names for these commands. (Servatius Brandt)
+Files: src/ex_docmd.c
+
+Patch 6.1.252
+Problem: "vi}" does not include a line break when the "}" is at the start
+ of a following line. (Kamil Burzynski)
+Solution: Include the line break.
+Files: src/search.c
+
+Patch 6.1.253 (extra)
+Problem: Win32 with Cygwin: Changes the path of arguments in a wrong way.
+ (Xiangjiang Ma)
+Solution: Don't use cygwin_conv_to_posix_path() for the Win32 version.
+ Update the Cygwin makefile to support more features. (Dan Sharp)
+Files: src/Make_cyg.mak, src/if_ole.cpp, src/main.c
+
+Patch 6.1.254
+Problem: exists("foo{bar}") does not work. ':unlet v{"a"}r' does not work.
+ ":let v{a}r1 v{a}r2" does not work. ":func F{(1)}" does not work.
+ ":delfunc F{" does not give an error message. ':delfunc F{"F"}'
+ does not work.
+Solution: Support magic braces for the exists() argument. (Vince Negri)
+ Check for trailing comments explicitly for ":unlet". Add support
+ for magic braces in further arguments of ":let". Look for a
+ parenthesis only after the function name. (Servatius Brandt)
+ Also expand magic braces for "exists('*expr')". Give an error
+ message for an invalid ":delfunc" argument. Allow quotes in the
+ ":delfunc" argument.
+Files: src/eval.c, src/ex_cmds.h, src/ex_docmd.c
+
+Patch 6.1.255 (depends on 6.1.254)
+Problem: Crash when loading menu.vim a second time. (Christian Robinson)
+ ":unlet garbage foo" tries unletting "foo" after an error message.
+ (Servatius Brandt)
+ Very long function arguments cause very long messages when
+ 'verbose' is 14 or higher.
+Solution: Avoid reading from uninitialized memory.
+ Break out of a loop after an invalid argument for ":unlet".
+ Truncate long function arguments to 80 characters.
+Files: src/eval.c
+
+Patch 6.1.256 (depends on 6.1.255)
+Problem: Defining a function after ":if 0" could still cause an error
+ message for an existing function.
+ Leaking memory when there are trailing characters for ":delfunc".
+Solution: Check the "skip" flag. Free the memory. (Servatius Brandt)
+Files: src/eval.c
+
+Patch 6.1.257
+Problem: ":cwindow" always sets the previous window to the last but one
+ window. (Benji Fisher)
+Solution: Set the previous window properly.
+Files: src/globals.c, src/quickfix.c, src/window.c
+
+Patch 6.1.258
+Problem: Buffers menu doesn't work properly for multibyte buffer names.
+Solution: Use a pattern to get the left and right part of the name.
+ (Yasuhiro Matsumoto)
+Files: runtime/menu.vim
+
+Patch 6.1.259 (extra)
+Problem: Mac: with 'patchmode' is used filenames are truncated.
+Solution: Increase the BASENAMELEN for Mac OS X. (Ed Ralston)
+Files: src/os_mac.h
+
+Patch 6.1.260 (depends on 6.1.104)
+Problem: GCC 3.2 still seems to have an optimizer problem. (Zvi Har'El)
+Solution: Use the same configure check as used for GCC 3.1.
+Files: src/auto/configure, src/configure.in
+
+Patch 6.1.261
+Problem: When deleting a line in a buffer which is not the current buffer,
+ using the Perl interface Delete(), the cursor in the current
+ window may move. (Chris Houser)
+Solution: Don't adjust the cursor position when changing another buffer.
+Files: src/if_perl.xs
+
+Patch 6.1.262
+Problem: When jumping over folds with "z[", "zj" and "zk" the previous
+ position is not remembered. (Hari Krishna Dara)
+Solution: Set the previous context mark before jumping.
+Files: src/fold.c
+
+Patch 6.1.263
+Problem: When typing a multibyte character that triggers an abbreviation
+ it is not inserted properly.
+Solution: Handle adding the typed multibyte character. (Yasuhiro Matsumoto)
+Files: src/getchar.c
+
+Patch 6.1.264 (depends on patch 6.1.254)
+Problem: exists() does not work for built-in functions. (Steve Wall)
+Solution: Don't check for the function name to start with a capital.
+Files: src/eval.c
+
+Patch 6.1.265
+Problem: libcall() can be used in 'foldexpr' to call any system function.
+ rename(), delete() and remote_send() can also be used in
+ 'foldexpr'. These are security problems. (Georgi Guninski)
+Solution: Don't allow using libcall(), rename(), delete(), remote_send() and
+ similar functions in the sandbox.
+Files: src/eval.c
+
+Patch 6.1.266 (depends on 6.1.265)
+Problem: Win32: compile error in eval.c. (Bill McCarthy)
+Solution: Move a variable declaration.
+Files: src/eval.c
+
+Patch 6.1.267
+Problem: Using "p" to paste into a Visual selected area may cause a crash.
+Solution: Allocate enough memory for saving the register contents. (Muraoka
+ Taro)
+Files: src/ops.c
+
+Patch 6.1.268
+Problem: When triggering an abbreviation with a multibyte character, this
+ character is not correctly inserted after expanding the
+ abbreviation. (Taro Muraoka)
+Solution: Add ABBR_OFF to all characters above 0xff.
+Files: src/edit.c, src/ex_getln.c, src/getchar.c
+
+Patch 6.1.269
+Problem: After using input() text written with ":redir" gets extra indent.
+ (David Fishburn)
+Solution: Restore msg_col after using input().
+Files: src/ex_getln.c
+
+Patch 6.1.270 (depends on 6.1.260)
+Problem: GCC 3.2.1 still seems to have an optimizer problem.
+Solution: Use the same configure check as used for GCC 3.1.
+Files: src/auto/configure, src/configure.in
+
+Patch 6.1.271
+Problem: When compiling without the +syntax feature there are errors.
+Solution: Don't use some code for syntax highlighting. (Roger Cornelius)
+ Make test 45 work without syntax highlighting.
+ Also fix an error in a pattern matching: "\%(" was not supported.
+Files: src/ex_cmds2.c, src/regexp.c, src/testdir/test45.in
+
+Patch 6.1.272
+Problem: After using ":set define<" a crash may happen. (Christian Robinson)
+Solution: Make a copy of the option value in allocated memory.
+Files: src/option.c
+
+Patch 6.1.273
+Problem: When the cursor doesn't blink, redrawing an exposed area may hide
+ the cursor.
+Solution: Always draw the cursor, also when it didn't move. (Muraoka Taro)
+Files: src/gui.c
+
+Patch 6.1.274 (depends on 6.1.210)
+Problem: Resetting the iconv() state after each error is wrong for an
+ incomplete sequence.
+Solution: Don't reset the iconv() state.
+Files: src/fileio.c
+
+Patch 6.1.275
+Problem: When using "v" in a startup script, get warning message that
+ terminal cannot highlight. (Charles Campbell)
+Solution: Only give the message after the terminal has been initialized.
+Files: src/normal.c
+
+Patch 6.1.276
+Problem: "gvim --remote file" doesn't prompt for an encryption key.
+Solution: The further characters the client sends to the server are used.
+ Added inputsave() and inputrestore() to allow prompting the
+ user directly and not using typeahead.
+ Also fix possible memory leak for ":normal".
+Files: src/eval.c, src/ex_cmds2.c, src/ex_docmd.c, src/getchar.c,
+ src/main.c, src/proto/getchar.pro, src/proto/ui.pro,
+ src/runtime/doc/eval.txt, src/structs.h, src/ui.c, src/vim.h
+
+Patch 6.1.277 (depends on 6.1.276)
+Problem: Compilation error when building with small features.
+Solution: Define trash_input_buf() when needed. (Kelvin Lee)
+Files: src/ui.c
+
+Patch 6.1.278
+Problem: When using signs the line number of a closed fold doesn't line up
+ with the other line numbers. (Kamil Burzynski)
+Solution: Insert two spaces for the sign column.
+Files: src/screen.c
+
+Patch 6.1.279
+Problem: The prototype for smsg() and smsg_attr() do not match the function
+ definition. This may cause trouble for some compilers. (Nix)
+Solution: Use va_list for systems that have stdarg.h. Use "int" instead of
+ "void" for the return type.
+Files: src/auto/configure, src/config.h.in, src/configure.in,
+ src/proto.h, src/message.c
+
+Patch 6.1.280
+Problem: It's possible to use an argument "firstline" or "lastline" for a
+ function but using "a:firstline" or "a:lastline" in the function
+ won't work. (Benji Fisher)
+Solution: Give an error message for these arguments.
+ Also avoid that the following function body causes a whole row of
+ errors, skip over it after an error in the first line.
+Files: src/eval.c
+
+Patch 6.1.281
+Problem: In Insert mode CTRL-X CTRL-G leaves the cursor after the ruler.
+Solution: Set the cursor position before waiting for the argument of CTRL-G.
+ (Yasuhiro Matsumoto)
+Files: src/edit.c
+
+Patch 6.1.282
+Problem: Elvis uses "se" in a modeline, Vim doesn't recognize this.
+Solution: Also accept "se " where "set " is accepted in a modeline.
+ (Yasuhiro Matsumoto)
+Files: src/buffer.c
+
+Patch 6.1.283
+Problem: For ":sign" the icon file name cannot contain a space.
+Solution: Handle backslashes in the file name. (Yasuhiro Matsumoto)
+Files: src/ex_cmds.c
+
+Patch 6.1.284
+Problem: On Solaris there is a warning for "struct utimbuf".
+Solution: Move including "utime.h" to outside the function. (Derek Wyatt)
+Files: src/fileio.c
+
+Patch 6.1.285
+Problem: Can't wipe out a buffer with 'bufhide' option.
+Solution: Add "wipe" value to 'bufhide'. (Yegappan Lakshmanan)
+Files: runtime/doc/options.txt, src/buffer.c, src/option.c,
+ src/quickfix.c
+
+Patch 6.1.286
+Problem: 'showbreak' cannot contain multibyte characters.
+Solution: Allow using all printable characters for 'showbreak'.
+Files: src/charset.c, src/move.c, src/option.c
+
+Patch 6.1.287 (depends on 6.1.285)
+Problem: Effect of "delete" and "wipe" in 'bufhide' were mixed up.
+Solution: Wipe out when wiping out is asked for.
+Files: src/buffer.c
+
+Patch 6.1.288
+Problem: ":silent function F" hangs. (Hari Krishna Dara)
+Solution: Don't use msg_col, it is not incremented when using ":silent".
+ Also made the function output look a bit better. Don't translate
+ "function".
+Files: src/eval.c
+
+Patch 6.1.289 (depends on 6.1.278)
+Problem: Compiler warning for pointer. (Axel Kielhorn)
+Solution: Add a typecast for " ".
+Files: src/screen.c
+
+Patch 6.1.290 (extra)
+Problem: Truncating long text for message box may break multibyte
+ character.
+Solution: Adjust to start of multibyte character. (Yasuhiro Matsumoto)
+Files: src/os_mswin.c
+
+Patch 6.1.291 (extra)
+Problem: Win32: CTRL-@ doesn't work. Don't even get a message for it.
+Solution: Recognize the keycode for CTRL-@. (Yasuhiro Matsumoto)
+Files: src/gui_w48.c
+
+Patch 6.1.292 (extra, depends on 6.1.253)
+Problem: Win32: Can't compile with new MingW compiler.
+ Borland 5 makefile doesn't generate pathdef.c.
+Solution: Remove -wwide-multiply argument. (Rene de Zwart)
+ Various fixes for other problems in Win32 makefiles. (Dan Sharp)
+Files: src/Make_bc5.mak, src/Make_cyg.mak, src/Make_ming.mak,
+ src/Make_mvc.mak
+
+Patch 6.1.293
+Problem: byte2line() returns a wrong result for some values.
+Solution: Change ">=" to ">" in ml_find_line_or_offset(). (Bradford C Smith)
+ Add one to the line number when at the end of a block.
+Files: src/memline.c
+
+Patch 6.1.294
+Problem: Can't include a multibyte character in a string by its hex value.
+ (Benji Fisher)
+Solution: Add "\u....": a character specified with up to four hex numbers
+ and stored according to the value of 'encoding'.
+Files: src/eval.c
+
+Patch 6.1.295 (extra)
+Problem: Processing the cs.po file generates an error. (Rahul Agrawal)
+Solution: Fix the printf format characters in the translation.
+Files: src/po/cs.po
+
+Patch 6.1.296
+Problem: Win32: When cancelling the font dialog 'guifont' remains set to
+ "*".
+Solution: Restore the old value of 'guifont' (Yasuhiro Matsumoto)
+Files: src/option.c
+
+Patch 6.1.297
+Problem: "make test" fails in test6 in an UTF-8 environment. (Benji Fisher)
+Solution: Before executing the BufReadPost autocommands save the current
+ fileencoding, so that the file isn't marked changed.
+Files: src/fileio.c
+
+Patch 6.1.298
+Problem: When using signs and the first line of a closed fold has a sign
+ it can be redrawn as if the fold was open. (Kamil Burzynski)
+Solution: Don't redraw a sign inside a closed fold.
+Files: src/screen.c
+
+Patch 6.1.299
+Problem: ":edit +set\ ro file" doesn't work.
+Solution: Halve the number of backslashes in the "+cmd" argument.
+Files: src/ex_docmd.c
+
+Patch 6.1.300 (extra)
+Problem: Handling of ETO_IGNORELANGUAGE is confusing.
+Solution: Clean up the handling of ETO_IGNORELANGUAGE. (Glenn Maynard)
+Files: src/gui_w32.c
+
+Patch 6.1.301 (extra)
+Problem: French translation of file-save dialog doesn't show file name.
+Solution: Insert a star in the printf string. (Francois Terrot)
+Files: src/po/fr.po
+
+Patch 6.1.302
+Problem: Counting lines of the Visual area is incorrect for closed folds.
+ (Mikolaj Machowski)
+Solution: Correct the start and end for the closed fold.
+Files: src/normal.c
+
+Patch 6.1.303 (extra)
+Problem: The Top/Bottom/All text does not always fit in the ruler when
+ translated to Japanese. Problem with a character being wider when
+ in a bold font.
+Solution: Use ETO_PDY to specify the width of each character. (Yasuhiro
+ Matsumoto)
+Files: src/gui_w32.c
+
+Patch 6.1.304 (extra, depends on 6.1.292)
+Problem: Win32: Postscript is always enabled in the MingW Makefile.
+ Pathdef.c isn't generated properly with Make_bc5.mak. (Yasuhiro
+ Matsumoto)
+Solution: Change an ifdef to an ifeq. (Madoka Machitani)
+ Use the Borland make redirection to generate pathdef.c. (Maurice
+ Barnum)
+Files: src/Make_bc5.mak, src/Make_ming.mak
+
+Patch 6.1.305
+Problem: When 'verbose' is 14 or higher, a function call may cause reading
+ uninitialized data. (Walter Briscoe)
+Solution: Check for end-of-string in trunc_string().
+Files: src/message.c
+
+Patch 6.1.306
+Problem: The AIX VisualAge cc compiler doesn't define __STDC__.
+Solution: Use __EXTENDED__ like __STDC__. (Jess Thrysoee)
+Files: src/os_unix.h
+
+Patch 6.1.307
+Problem: When a double-byte character has an illegal tail byte the display
+ is messed up. (Yasuhiro Matsumoto)
+Solution: Draw "XX" instead of the wrong character.
+Files: src/screen.c
+
+Patch 6.1.308
+Problem: Can't reset the Visual mode returned by visualmode().
+Solution: Use an optional argument to visualmode(). (Charles Campbell)
+Files: runtime/doc/eval.txt, src/eval.c, src/normal.c,
+ src/structs.h
+
+Patch 6.1.309
+Problem: The tutor doesn't select German if the locale name is
+ "German_Germany.1252". (Joachim Hofmann)
+Solution: Check for "German" in the locale name. Also check for
+ ".ge". And include the German and Greek tutors.
+Files: runtime/tutor/tutor.de, runtime/tutor/tutor.vim,
+ runtime/tutor/tutor.gr, runtime/tutor/tutor.gr.cp737
+
+Patch 6.1.310 (depends on 6.1.307)
+Problem: All double-byte characters are displayed as "XX".
+Solution: Use ">= 32" instead of "< 32". (Yasuhiro Matsumoto)
+Files: src/screen.c
+
+Patch 6.1.311 (extra)
+Problem: VMS: path in window title doesn't include necessary separator.
+ file version doesn't always work properly with Unix.
+ Crashes because of memory overwrite in GUI.
+ Didn't always handle files with lowercase and correct path.
+Solution: Fix the problems. Remove unnecessary file name translations.
+ (Zoltan Arpadffy)
+Files: src/buffer.c, src/ex_cmds2.c, src/fileio.c, src/memline.c,
+ src/misc1.c, src/misc2.c, src/os_unix.c, src/os_vms.c, src/tag.c
+
+Patch 6.1.312
+Problem: When using ":silent" debugging is also done silently.
+Solution: Disable silence while at the debug prompt.
+Files: src/ex_cmds2.c
+
+Patch 6.1.313
+Problem: When a ":drop fname" command is used and "fname" is open in
+ another window, it is also opened in the current window.
+Solution: Change to the window with "fname" instead.
+ Don't redefine the argument list when dropping only one file.
+Files: runtime/doc/windows.txt, src/ex_cmds2.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/proto/ex_cmds2.pro, src/proto/ex_docmd.pro
+
+Patch 6.1.314 (depends on 6.1.126)
+Problem: Missing backslash in "Generic Config file" syntax menu.
+Solution: Insert the backslash. (Zak Beck)
+Files: runtime/makemenu.vim, runtime/synmenu.vim
+
+Patch 6.1.315 (extra)
+Problem: A very long hostname may lead to an unterminated string. Failing
+ to obtain a hostname may result in garbage. (Walter Briscoe)
+Solution: Add a NUL at the end of the hostname buffer.
+Files: src/os_mac.c, src/os_msdos.c, src/os_unix.c, src/os_win16.c,
+ src/os_win32.c
+
+Patch 6.1.316
+Problem: When exiting with "wq" and there is a hidden buffer, after the
+ "file changed" dialog there is a warning for a changed buffer.
+ (Ajit Thakkar)
+Solution: Do update the buffer timestamps when exiting.
+Files: src/fileio.c
+
+Patch 6.1.317
+Problem: Closing a window may cause some of the remaining windows to be
+ positioned wrong if there is a mix of horizontal and vertical
+ splits. (Stefan Ingi Valdimarsson)
+Solution: Update the frame sizes before updating the window positions.
+Files: src/window.c
+
+Patch 6.1.318
+Problem: auto/pathdef.c can include wrong quotes when a compiler flag
+ includes quotes.
+Solution: Put a backslash before the quotes in compiler flags. (Shinra Aida)
+Files: src/Makefile
+
+Patch 6.1.319 (depends on 6.1.276)
+Problem: Using "--remote +cmd file" does not execute "cmd".
+Solution: Call inputrestore() in the same command line as inputsave(),
+ otherwise it will never get executed.
+Files: src/main.c
+
+Patch 6.1.320 (depends on 6.1.313)
+Problem: When a ":drop one\ file" command is used the file "one\ file" is
+ opened, the backslash is not removed. (Taro Muraoka)
+Solution: Handle backslashes correctly. Always set the argument list to
+ keep it simple.
+Files: runtime/doc/windows.txt, src/ex_cmds.c
+
+Patch 6.1.321
+Problem: When 'mouse' includes 'n' but not 'v', don't allow starting Visual
+ mode with the mouse.
+Solution: Don't use MOUSE_MAY_VIS when there is no 'v' in 'mouse'. (Flemming
+ Madsen)
+Files: src/normal.c
+
+Patch 6.1.322 (extra, depends on 6.1.315)
+Problem: Win32: The host name is always "PC " plus the real host name.
+Solution: Don't insert "PC " before the host name.
+Files: src/os_win32.c
+
+Patch 6.1.323
+Problem: ":registers" doesn't stop listing for a "q" at the more prompt.
+ (Hari Krishna Dara)
+Solution: Check for interrupt and got_int.
+Files: src/ops.c, src/proto/ops.pro
+
+Patch 6.1.324
+Problem: Crash when dragging a vertical separator when <LeftMouse> is
+ remapped to jump to another window.
+Solution: Pass the window pointer to the function doing the dragging instead
+ of always using the current window. (Daniel Elstner)
+ Also fix that starting a drag changes window focus.
+Files: src/normal.c, src/proto/window.pro, src/ui.c, src/vim.h,
+ src/window.c
+
+Patch 6.1.325
+Problem: Shift-Tab is not automatically recognized in an xterm.
+Solution: Add <Esc>[Z as the termcap code. (Andrew Pimlott)
+Files: src/term.c
+
+Patch 6.1.326
+Problem: Using a search pattern may read from uninitialized data (Yasuhiro
+ Matsumoto)
+Solution: Initialize pointers to NULL.
+Files: src/regexp.c
+
+Patch 6.1.327
+Problem: When opening the "mbyte.txt" help file the utf-8 characters are
+ unreadable, because the fileencoding is forced to be latin1.
+Solution: Check for utf-8 encoding first in help files. (Daniel Elstner)
+Files: runtime/doc/mbyte.txt, src/fileio.c
+
+Patch 6.1.328
+Problem: Prototype for enc_canon_search() is missing.
+Solution: Add the prototype. (Walter Briscoe)
+Files: src/mbyte.c
+
+Patch 6.1.329
+Problem: When editing a file "a b c" replacing "%" in ":Cmd %" or ":next %"
+ does not work properly. (Hari Krishna Dara)
+Solution: Always escape spaces when expanding "%". Don't split argument for
+ <f-args> in a user command when only one argument is used.
+Files: src/ex_docmd.c
+
+Patch 6.1.330
+Problem: GTK, Motif and Athena: Keypad keys produce the same code as
+ non-keypad keys, making it impossible to map them separately.
+Solution: Use different termcap codes for the keypad keys. (Neil Bird)
+Files: src/gui_gtk_x11.c, src/gui_x11.c
+
+Patch 6.1.331
+Problem: When translating the help files, "LOCAL ADDITIONS" no longer marks
+ the spot where help files from plugins are to be listed.
+Solution: Add a "local-additions" tag and use that to find the right spot.
+Files: runtime/doc/help.txt, src/ex_cmds.c
+
+Patch 6.1.332 (extra)
+Problem: Win32: Loading Perl dynamically doesn't work with Perl 5.8.
+ Perl 5.8 also does not work with Cygwin and Ming.
+Solution: Adjust the function calls. (Taro Muraoka)
+ Adjust the cyg and ming makefiles. (Dan Sharp)
+Files: src/Make_cyg.mak, src/Make_ming.mak, src/Make_mvc.mak,
+ src/if_perl.xs
+
+Patch 6.1.333 (extra)
+Problem: Win32: Can't handle Unicode text on the clipboard.
+ Can't pass NUL byte, it becomes a line break. (Bruce DeVisser)
+Solution: Support Unicode for the clipboard (Ron Aaron and Glenn Maynard)
+ Also support copy/paste of NUL bytes.
+Files: src/os_mswin.c, src/os_win16.c src/os_win32.c
+
+Patch 6.1.334 (extra, depends on 6.1.303)
+Problem: Problem with drawing Hebrew characters.
+Solution: Only use ETO_PDY for Windows NT and the like. (Yasuhiro Matsumoto)
+Files: src/gui_w32.c
+
+Patch 6.1.335 (extra)
+Problem: Failure of obtaining the cursor position and window size is
+ ignored.
+Solution: Remove a semicolon after an "if". (Walter Briscoe)
+Files: src/gui_w32.c
+
+Patch 6.1.336 (extra)
+Problem: Warning for use of function prototypes of smsg().
+Solution: Define HAVE_STDARG_H. (Walter Briscoe)
+Files: src/os_win32.h
+
+Patch 6.1.337
+Problem: When using "finish" in debug mode in function B() for ":call
+ A(B())" does not stop after B() is finished.
+Solution: Increase debug_level while evaluating a function.
+Files: src/ex_docmd.c
+
+Patch 6.1.338
+Problem: When using a menu that checks out the current file from Insert
+ mode, there is no warning for the changed file until exiting
+ Insert mode. (Srikanth Sankaran)
+Solution: Add a check for need_check_timestamps in the Insert mode loop.
+Files: src/edit.c
+
+Patch 6.1.339
+Problem: Completion doesn't allow "g:" in ":let g:did_<Tab>". (Benji
+ Fisher)
+Solution: Return "g:var" for global variables when that is what is being
+ expanded. (Flemming Madsen)
+Files: src/eval.c
+
+Patch 6.1.340 (extra, depends on 6.1.332)
+Problem: Win32: Can't compile the Perl interface with nmake.
+Solution: Don't compare the version number as a string but as a number.
+ (Juergen Kraemer)
+Files: src/Make_mvc.mak
+
+Patch 6.1.341
+Problem: In Insert mode with 'rightleft' set the cursor is drawn halfway a
+ double-wide character. For CTRL-R and CTRL-K in Insert mode the "
+ or ? is not displayed.
+Solution: Draw the cursor in the next character cell. Display the " or ?
+ over the right half of the double-wide character. (Yasuhiro
+ Matsumoto) Also fix that cancelling a digraph doesn't redraw
+ a double-byte character correctly.
+Files: src/edit.c, src/gui.c, src/mbyte.c
+
+Patch 6.1.342 (depends on 6.1.341)
+Problem: With 'rightleft' set typing "c" on a double-wide character causes
+ the cursor to be displayed one cell to the left.
+Solution: Draw the cursor in the next character cell. (Yasuhiro Matsumoto)
+Files: src/gui.c
+
+Patch 6.1.343 (depends on 6.1.342)
+Problem: Cannot compile with the +multi_byte feature but without +rightleft.
+ Cannot compile without the GUI.
+Solution: Fix the #ifdefs. (partly by Nam SungHyun)
+Files: src/gui.c, src/mbyte.c, src/ui.c
+
+Patch 6.1.344
+Problem: When using ":silent filetype" the output is still put in the
+ message history. (Hari Krishna Dara)
+Solution: Don't add messages in the history when ":silent" is used.
+Files: src/message.c
+
+Patch 6.1.345 (extra)
+Problem: Win32: 'imdisable' doesn't work.
+Solution: Make 'imdisable' work. (Yasuhiro Matsumoto)
+Files: src/gui_w32.c
+
+Patch 6.1.346
+Problem: The scroll wheel can only scroll the current window.
+Solution: Make the scroll wheel scroll the window that the mouse points to.
+ (Daniel Elstner)
+Files: src/edit.c, src/gui.c, src/normal.c, src/term.c
+
+Patch 6.1.347
+Problem: When using cscope to list matching tags, the listed number is
+ sometimes not equal to what cscope uses. (Vihren Milev)
+Solution: For cscope tags use only one table, don't give tags in the current
+ file a higher priority.
+Files: src/tag.c
+
+Patch 6.1.348
+Problem: Wildmode with wildmenu: ":set wildmode=list,full", ":colorscheme
+ <tab>" results in "zellner" instead of the first entry. (Anand
+ Hariharan)
+Solution: Don't call ExpandOne() from globpath(). (Flemming Madsen)
+Files: src/ex_getln.c
+
+Patch 6.1.349
+Problem: "vim --serverlist" when no server was ever started gives an error
+ message without "\n".
+ "vim --serverlist" doesn't exit when the X server can't be
+ contacted, it starts Vim unexpectedly. (Ricardo Signes)
+Solution: Don't give an error when no Vim server was ever started.
+ Treat failing of opening the display equal to errors inside the
+ remote*() functions. (Flemming Madsen)
+Files: src/if_xcmdsrv.c, src/main.c
+
+Patch 6.1.350
+Problem: When entering a buffer with ":bnext" for the first time, using an
+ autocommand to restore the last used cursor position doesn't work.
+ (Paolo Giarusso)
+Solution: Don't use the last known cursor position of the current Vim
+ invocation if an autocommand changed the position.
+Files: src/buffer.c
+
+Patch 6.1.351 (depends on 6.1.349)
+Problem: Crash when starting Vim the first time in an X server. (John
+ McGowan)
+Solution: Don't call xFree() with a fixed string.
+Files: src/if_xcmdsrv.c
+
+Patch 6.1.352 (extra, depends on 6.1.345)
+Problem: Win32: Crash when setting "imdisable" in _vimrc.
+Solution: Don't call IME functions when imm32.dll was not loaded (yet).
+ Also add typecasts to avoid Compiler warnings for
+ ImmAssociateContext() argument.
+Files: src/gui_w32.c
+
+Patch 6.1.353 (extra, depends on 6.1.334)
+Problem: Problem with drawing Arabic characters.
+Solution: Don't use ETO_PDY, do use padding.
+Files: src/gui_w32.c
+
+Patch 6.1.354 (extra, depends on 6.1.333)
+Problem: MS-Windows 98: Notepad can't paste text copied from Vim when
+ 'encoding' is "utf-8".
+Solution: Also make CF_TEXT available on the clipboard. (Ron Aaron)
+Files: src/os_mswin.c
+
+Patch 6.1.355
+Problem: In a regexp '\n' will never match anything in a string.
+Solution: Make '\n' match a newline character.
+Files: src/buffer.c, src/edit.c, src/eval.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/fileio.c, src/misc1.c,
+ src/option.c, src/os_mac.c, src/os_unix.c, src/quickfix.c,
+ src/regexp.c, src/search.c, src/syntax.c, src/tag.c, src/vim.h
+
+Patch 6.1.356 (extra, depends on, well, eh, several others)
+Problem: Compiler warnings for using convert_setup() and a few other
+ things.
+Solution: Add typecasts.
+Files: src/mbyte.c, src/os_mswin.c, src/proto/os_win32.pro, src/os_win32.c
+
+Patch 6.1.357
+Problem: CR in the quickfix window jumps to the error under the cursor, but
+ this doesn't work in Insert mode. (Srikanth Sankaran)
+Solution: Handle CR in Insert mode in the quickfix window.
+Files: src/edit.c
+
+Patch 6.1.358
+Problem: The tutor doesn't select another locale version properly.
+Solution: Insert the "let" command. (Yasuhiro Matsumoto)
+Files: runtime/tutor/tutor.vim
+
+Patch 6.1.359 (extra)
+Problem: Mac Carbon: Vim doesn't get focus when started from the command
+ line. Crash when using horizontal scroll bar.
+Solution: Set Vim as the frontprocess. Fix scrolling. (Peter Cucka)
+Files: src/gui_mac.c
+
+Patch 6.1.360 (depends on 6.1.341)
+Problem: In Insert mode CTRL-K ESC messes up a multibyte character.
+ (Anders Helmersson)
+Solution: Save all bytes of a character when displaying a character
+ temporarily.
+Files: src/edit.c, src/proto/screen.pro, src/screen.c
+
+Patch 6.1.361
+Problem: Cannot jump to a file mark with ":'M".
+Solution: Allow jumping to another file for a mark in an Ex address when it
+ is the only thing in the command line.
+Files: src/ex_docmd.c
+
+Patch 6.1.362
+Problem: tgetent() may return zero for success. tgetflag() may return -1
+ for an error.
+Solution: Check tgetflag() for returning a positive value. Add an autoconf
+ check for the value that tgetent() returns.
+Files: src/auto/configure, src/config.h.in, src/configure.in, src/term.c
+
+Patch 6.1.363
+Problem: byte2line() can return one more than the number of lines.
+Solution: Return -1 if the offset is one byte past the end.
+Files: src/memline.c
+
+Patch 6.1.364
+Problem: That the FileChangedShell autocommand event never nests makes it
+ difficult to reload a file in a normal way.
+Solution: Allow nesting for the FileChangedShell event but do not allow
+ triggering itself again.
+ Also avoid autocommands for the cmdline window in rare cases.
+Files: src/ex_getln.c, src/fileio.c, src/window.c
+
+Patch 6.1.365 (depends on 6.1.217)
+Problem: Setting a breakpoint in a sourced file with a relative path name
+ doesn't work. (Servatius Brandt)
+Solution: Expand the file name to a full path.
+Files: src/ex_cmds2.c
+
+Patch 6.1.366
+Problem: Can't use Vim with Netbeans.
+Solution: Add the Netbeans interface. Includes support for sign icons and
+ "-fg" and "-bg" arguments for GTK. Add the 'autochdir'
+ option. (Gordon Prieur, George Hernandez, Dave Weatherford)
+ Make it possible to display both a sign with a text and one with
+ line highlighting in the same line.
+ Add support for Agide, interface version 2.1.
+ Also fix that when 'iskeyword' includes '?' the "*" command
+ doesn't work properly on a word that includes "?" (Bill McCarthy):
+ Don't escape "?" to "\?" when searching forward.
+Files: runtime/doc/Makefile, runtime/doc/netbeans.txt,
+ runtime/doc/options.txt, runtime/doc/various.txt,
+ src/Makefile, src/auto/configure, src/buffer.c, src/config.h.in,
+ src/config.mk.in, src/configure.in, src/edit.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/feature.h, src/fileio.c, src/globals.h,
+ src/gui.c, src/gui_beval.c, src/gui_gtk_x11.c, src/gui_x11.c,
+ src/main.c, src/memline.c, src/misc1.c, src/misc2.c, src/move.c,
+ src/nbdebug.c, src/nbdebug.h, src/netbeans.c, src/normal.c,
+ src/ops.c, src/option.c, src/option.h, src/proto/buffer.pro,
+ src/proto/gui_beval.pro, src/proto/gui_gtk_x11.pro,
+ src/proto/gui_x11.pro, src/proto/misc2.pro,
+ src/proto/netbeans.pro, src/proto/normal.pro, src/proto/ui.pro,
+ src/proto.h, src/screen.c, src/structs.h, src/ui.c, src/undo.c,
+ src/vim.h, src/window.c, src/workshop.c
+
+Patch 6.1.367 (depends on 6.1.365)
+Problem: Setting a breakpoint in a function doesn't work. For a sourced
+ file it doesn't work when symbolic links are involved. (Servatius
+ Brandt)
+Solution: Expand the file name in the same way as do_source() does. Don't
+ prepend the path to a function name.
+Files: src/ex_cmds2.c
+
+Patch 6.1.368
+Problem: Completion for ":map" does not include <silent> and <script>.
+ ":mkexrc" do not save the <silent> attribute of mappings.
+Solution: Add "<silent>" to the generated map commands when appropriate.
+ (David Elstner)
+ Add <silent> and <script> to command line completion.
+Files: src/getchar.c
+
+Patch 6.1.369 (extra)
+Problem: VMS: Vim hangs when attempting to edit a read-only file in the
+ terminal. Problem with VMS filenames for quickfix.
+Solution: Rewrite low level input. Remove version number from file name in
+ a couple more places. Fix crash after patch 6.1.362. Correct
+ return code for system(). (Zoltan Arpadffy, Tomas Stehlik)
+Files: src/misc1.c, src/os_unix.c, src/os_vms.c, src/proto/os_vms.pro,
+ src/os_vms_conf.h, src/quickfix.c, src/ui.c
+
+Patch 6.1.370
+Problem: #ifdef nesting is unclear.
+Solution: Insert spaces to indicate the nesting.
+Files: src/os_unix.c
+
+Patch 6.1.371
+Problem: "%V" in 'statusline' doesn't show "0-1" in an empty line.
+Solution: Add one to the column when comparing with virtual column (Andrew
+ Pimlott)
+Files: src/buffer.c
+
+Patch 6.1.372
+Problem: With 16 bit ints there are compiler warnings. (Walter Briscoe)
+Solution: Change int into long.
+Files: src/structs.h, src/syntax.c
+
+Patch 6.1.373
+Problem: The default page header for printing is not translated.
+Solution: Add _() around the two places where "Page" is used. (Mike
+ Williams) Translate the default value of the 'titleold' and
+ 'printheader' options.
+Files: src/ex_cmds2.c, src/option.c
+
+Patch 6.1.374 (extra)
+Problem: MS-Windows: Cannot build GvimExt with MingW or Cygwin.
+Solution: Add makefile and modified resource files. (Rene de Zwart)
+ Also support Cygwin. (Alejandro Lopez_Valencia)
+Files: GvimExt/Make_cyg.mak, GvimExt/Make_ming.mak, GvimExt/Makefile,
+ GvimExt/gvimext_ming.def, GvimExt/gvimext_ming.rc
+
+Patch 6.1.375
+Problem: MS-Windows: ':!dir "%"' does not work for a file name with spaces.
+ (Xiangjiang Ma)
+Solution: Don't insert backslashes for spaces in a shell command.
+Files: src/ex_docmd.c
+
+Patch 6.1.376
+Problem: "vim --version" and "vim --help" have a non-zero exit code.
+ That is unusual. (Petesea)
+Solution: Use a zero exit code.
+Files: src/main.c
+
+Patch 6.1.377
+Problem: Can't add words to 'lispwords' option.
+Solution: Add P_COMMA and P_NODUP flags. (Haakon Riiser)
+Files: src/option.c
+
+Patch 6.1.378
+Problem: When two buffer-local user commands are ambiguous, a full match
+ with a global user command isn't found. (Hari Krishna Dara)
+Solution: Detect this situation and accept the global command.
+Files: src/ex_docmd.c
+
+Patch 6.1.379
+Problem: Linux with kernel 2.2 can't use the alternate stack in combination
+ with threading, causes an infinite loop.
+Solution: Don't use the alternate stack in this situation.
+Files: src/os_unix.c
+
+Patch 6.1.380
+Problem: When 'winminheight' is zero and the quickfix window is zero lines,
+ entering the window doesn't make it higher. (Christian J.
+ Robinson)
+Solution: Make sure the current window is at least one line high.
+Files: src/window.c
+
+Patch 6.1.381
+Problem: When a BufWriteCmd is used and it leaves the buffer modified, the
+ window may still be closed. (Hari Krishna Dara)
+Solution: Return FAIL from buf_write() when the buffer is still modified
+ after a BufWriteCmd autocommand was used.
+Files: src/fileio.c
+
+Patch 6.1.382 (extra)
+Problem: Win32 GUI: When using two monitors, the code that checks/fixes the
+ window size and position (e.g. when a font changes) doesn't work
+ properly. (George Reilly)
+Solution: Handle a double monitor situation. (Helmut Stiegler)
+Files: src/gui_w32.c
+
+Patch 6.1.383
+Problem: The filling of the status line doesn't work properly for
+ multibyte characters. (Nam SungHyun)
+ There is no check for going past the end of the buffer.
+Solution: Properly distinguish characters and bytes. Properly check for
+ running out of buffer space.
+Files: src/buffer.c, src/ex_cmds2.c, src/proto/buffer.pro, src/screen.c
+
+Patch 6.1.384
+Problem: It is not possible to find if a certain patch has been included.
+ (Lubomir Host)
+Solution: Support using has() to check if a patch was included.
+Files: runtime/doc/eval.txt, src/eval.c, src/proto/version.pro,
+ src/version.c
+
+Patch 6.1.385 (depends on 6.1.383)
+Problem: Can't compile without the multibyte feature.
+Solution: Move an #ifdef. (Christian J. Robinson)
+Files: src/buffer.c
+
+Patch 6.1.386
+Problem: Get duplicate tags when running ":helptags".
+Solution: Do the other half of moving a section to another help file.
+Files: runtime/tagsrch.txt
+
+Patch 6.1.387 (depends on 6.1.373)
+Problem: Compiler warning for pointer cast.
+Solution: Add (char_u *).
+Files: src/option.c
+
+Patch 6.1.388 (depends on 6.1.384)
+Problem: Compiler warning for pointer cast.
+Solution: Add (char *). Only include has_patch() when used.
+Files: src/eval.c, src/version.c
+
+Patch 6.1.389 (depends on 6.1.366)
+Problem: Balloon evaluation doesn't work for GTK.
+ has("balloon_eval") doesn't work.
+Solution: Add balloon evaluation for GTK. Also improve displaying of signs.
+ (Daniel Elstner)
+ Also make ":gui" start the netbeans connection and avoid using
+ netbeans functions when the connection is not open.
+Files: src/Makefile, src/feature.h, src/gui.c, src/gui.h,
+ src/gui_beval.c, src/gui_beval.h, src/gui_gtk.c,
+ src/gui_gtk_x11.c, src/eval.c, src/memline.c, src/menu.c,
+ src/netbeans.c, src/proto/gui_beval.pro, src/proto/gui_gtk.pro,
+ src/structs.h, src/syntax.c, src/ui.c, src/workshop.c
+
+Patch 6.1.390 (depends on 6.1.389)
+Problem: It's not possible to tell Vim to save and exit through the
+ Netbeans interface. Would still try to send balloon eval text
+ after the connection is closed.
+ Can't use Unicode characters for sign text.
+Solution: Add functions "saveAndExit" and "getModified". Check for a
+ working connection before sending a balloonText event.
+ various other cleanups.
+ Support any character for sign text. (Daniel Elstner)
+Files: runtime/doc/netbeans.txt, runtime/doc/sign.txt, src/ex_cmds.c,
+ src/netbeans.c, src/screen.c
+
+Patch 6.1.391
+Problem: ml_get() error when using virtualedit. (Charles Campbell)
+Solution: Get a line from a specific window, not the current one.
+Files: src/charset.c
+
+Patch 6.1.392 (depends on 6.1.383)
+Problem: Highlighting in the 'statusline' is in the wrong position when an
+ item is truncated. (Zak Beck)
+Solution: Correct the start of 'statusline' items properly for a truncated
+ item.
+Files: src/buffer.c
+
+Patch 6.1.393
+Problem: When compiled with Python and threads, detaching the terminal may
+ cause Vim to loop forever.
+Solution: Add -pthread to $CFLAGS when using Python and gcc. (Daniel
+ Elstner)
+Files: src/auto/configure,, src/configure.in
+
+Patch 6.1.394 (depends on 6.1.390)
+Problem: The netbeans interface doesn't recognize multibyte glyph names.
+Solution: Check the number of cells rather than bytes to decide
+ whether a glyph name is not a filename. (Daniel Elstner)
+Files: src/netbeans.c
+
+Patch 6.1.395 (extra, depends on 6.1.369)
+Problem: VMS: OLD_VMS is never defined. Missing function prototype.
+Solution: Define OLD_VMS in Make_vms.mms. Add vms_sys_status() to
+ os_vms.pro. (Zoltan Arpadffy)
+Files: src/Make_vms.mms, src/proto/os_vms.pro
+
+Patch 6.1.396 (depends on 6.1.330)
+Problem: Compiler warnings for using enum.
+Solution: Add typecast to char_u.
+Files: src/gui_gtk_x11.c, src/gui_x11.c
+
+Patch 6.1.397 (extra)
+Problem: The install program may use a wrong path for the diff command if
+ there is a space in the install directory path.
+Solution: Use double quotes around the path if necessary. (Alejandro
+ Lopez-Valencia) Also use double quotes around the file name
+ arguments.
+Files: src/dosinst.c
+
+Patch 6.1.398
+Problem: Saving the typeahead for debug mode causes trouble for a test
+ script. (Servatius Brandt)
+Solution: Add the ":debuggreedy" command to avoid saving the typeahead.
+Files: runtime/doc/repeat.txt, src/ex_cmds.h, src/ex_cmds2.c,
+ src/ex_docmd.c, src/proto/ex_cmds2.pro
+
+Patch 6.1.399
+Problem: Warning for unused variable.
+Solution: Remove the variable two_or_more.
+Files: src/ex_cmds.c
+
+Patch 6.1.400 (depends on 6.1.381)
+Problem: When a BufWriteCmd wipes out the buffer it may still be accessed.
+Solution: Don't try accessing a buffer that has been wiped out.
+Files: src/fileio.c
+
+Patch 6.1.401 (extra)
+Problem: Building the Win16 version with Borland 5.01 doesn't work.
+ "make test" doesn't work with Make_dos.mak. (Walter Briscoe)
+Solution: Various fixes to the w16 makefile. (Walter Briscoe)
+ Don't use deltree. Use "mkdir \tmp" instead of "mkdir /tmp".
+Files: src/Make_w16.mak, src/testdir/Make_dos.mak
+
+Patch 6.1.402
+Problem: When evaluating a function name with curly braces, an error
+ is not handled consistently.
+Solution: Accept the result of a curly braces expression when an
+ error was encountered. Skip evaluating an expression in curly
+ braces when skipping. (Servatius Brandt)
+Files: src/eval.c
+
+Patch 6.1.403 (extra)
+Problem: MS-Windows 16 bit: compiler warnings.
+Solution: Add typecasts. (Walter Briscoe)
+Files: src/ex_cmds2.c, src/gui_w48.c, src/os_mswin.c, src/os_win16.c,
+ src/syntax.c
+
+Patch 6.1.404 (extra)
+Problem: Various small problems.
+Solution: Fix comments. Various small additions, changes in indent, removal
+ of unused items and fixes.
+Files: Makefile, README.txt, runtime/menu.vim, runtime/vimrc_example.vim,
+ src/INSTALL, src/INSTALLole.txt, src/Make_bc5.mak,
+ src/Make_cyg.mak, src/Make_ming.mak, src/Makefile,
+ src/config.h.in, src/edit.c, src/eval.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/fileio.c, src/getchar.c,
+ src/gui.c, src/gui_gtk.c, src/gui_photon.c, src/if_cscope.c,
+ src/if_python.c, src/keymap.h, src/mark.c, src/mbyte.c,
+ src/message.c, src/misc1.c, src/misc2.c, src/normal.c,
+ src/option.c, src/os_os2_cfg.h, src/os_win32.c,
+ src/proto/getchar.pro, src/proto/message.pro,
+ src/proto/regexp.pro, src/screen.c, src/structs.h, src/syntax.c,
+ src/term.c, src/testdir/test15.in, src/testdir/test15.ok,
+ src/vim.rc, src/xxd/Make_cyg.mak, src/xxd/Makefile
+
+Patch 6.1.405
+Problem: A few files are missing from the toplevel Makefile.
+Solution: Add the missing files.
+Files: Makefile
+
+Patch 6.1.406 (depends on 6.1.392)
+Problem: When a statusline item doesn't fit arbitrary text appears.
+ (Christian J. Robinson)
+Solution: When there is just enough room but not for the "<" truncate the
+ statusline item like there is no room.
+Files: src/buffer.c
+
+Patch 6.1.407
+Problem: ":set scrollbind | help" scrollbinds the help window. (Andrew
+ Pimlott)
+Solution: Reset 'scrollbind' when opening a help window.
+Files: src/ex_cmds.c
+
+Patch 6.1.408
+Problem: When 'rightleft' is set unprintable character 0x0c is displayed as
+ ">c0<".
+Solution: Reverse the text of the hex character.
+Files: src/screen.c
+
+Patch 6.1.409
+Problem: Generating tags for the help doesn't work for some locales.
+Solution: Set LANG=C LC_ALL=C in the environment for "sort". (Daniel
+ Elstner)
+Files: runtime/doc/Makefile
+
+Patch 6.1.410 (depends on 6.1.390)
+Problem: Linking error when compiling with Netbeans but without sign icons.
+ (Malte Neumann)
+Solution: Don't define buf_signcount() when sign icons are unavailable.
+Files: src/buffer.c
+
+Patch 6.1.411
+Problem: When 'virtualedit' is set, highlighting a Visual block beyond the
+ end of a line may be wrong.
+Solution: Correct the virtual column when the end of the line is before the
+ displayed part of the line. (Muraoka Taro)
+Files: src/screen.c
+
+Patch 6.1.412
+Problem: When swapping terminal screens and using ":gui" to start the GUI,
+ the shell prompt may be after a hit-enter prompt.
+Solution: Output a newline in the terminal when starting the GUI and there
+ was a hit-enter prompt..
+Files: src/gui.c
+
+Patch 6.1.413
+Problem: When 'clipboard' contains "unnamed", "p" in Visual mode doesn't
+ work correctly.
+Solution: Save the register before overwriting it and put the resulting text
+ on the clipboard afterwards. (Muraoka Taro)
+Files: src/normal.c, src/ops.c
+
+Patch 6.1.414 (extra, depends on 6.1.369)
+Problem: VMS: Vim busy waits when waiting for input.
+Solution: Delay for a short while before getting another character. (Zoltan
+ Arpadffy)
+Files: src/os_vms.c
+
+Patch 6.1.415
+Problem: When there is a vertical split and a quickfix window, reducing the
+ size of the Vim window may result in a wrong window layout and a
+ crash.
+Solution: When reducing the window size and there is not enough space for
+ 'winfixheight' set the frame height to the larger height, so that
+ there is a retry while ignoring 'winfixheight'. (Yasuhiro
+ Matsumoto)
+Files: src/window.c
+
+Patch 6.1.416 (depends on 6.1.366)
+Problem: When using the Netbeans interface, a line with a sign cannot be
+ changed.
+Solution: Respect the GUARDEDOFFSET for sign IDs when checking for a guarded
+ area.
+Files: src/netbeans.c
+
+Patch 6.1.417
+Problem: Unprintable multibyte characters are not handled correctly.
+ Multi-byte characters above 0xffff are displayed as another
+ character.
+Solution: Handle unprintable multibyte characters. Display multibyte
+ characters above 0xffff with a marker. Recognize UTF-16 words and
+ BOM words as unprintable. (Daniel Elstner)
+Files: src/charset.c, src/mbyte.c, src/screen.c
+
+Patch 6.1.418
+Problem: The result of strftime() is in the current locals. Need to
+ convert it to 'encoding'.
+Solution: Obtain the current locale and convert the argument for strftime()
+ to it and the result back to 'encoding'. (Daniel Elstner)
+Files: src/eval.c, src/ex_cmds.c, src/ex_cmds2.c, src/mbyte.c,
+ src/proto/mbyte.pro, src/option.c, src/os_mswin.c
+
+Patch 6.1.419
+Problem: Vim doesn't compile on AIX 5.1.
+Solution: Don't define _NO_PROTO on this system. (Uribarri)
+Files: src/auto/configure, src/configure.in
+
+Patch 6.1.420 (extra)
+Problem: convert_input() has an unnecessary STRLEN().
+ Conversion from UCS-2 to a codepage uses word count instead of
+ byte count.
+Solution: Remove the STRLEN() call. (Daniel Elstner)
+ Always use byte count for string_convert().
+Files: src/gui_w32.c, src/mbyte.c
+
+Patch 6.1.421 (extra, depends on 6.1.354)
+Problem: MS-Windows 9x: When putting text on the clipboard it can be in
+ the wrong encoding.
+Solution: Convert text to the active codepage for CF_TEXT. (Glenn Maynard)
+Files: src/os_mswin.c
+
+Patch 6.1.422
+Problem: Error in .vimrc doesn't cause hit-enter prompt when swapping
+ screens. (Neil Bird)
+Solution: Set msg_didany also when sending a message to the terminal
+ directly.
+Files: src/message.c
+
+Patch 6.1.423
+Problem: Can't find arbitrary text in help files.
+Solution: Added the ":helpgrep" command.
+Files: runtime/doc/various.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/proto/quickfix.pro, src/quickfix.c
+
+Patch 6.1.424 (extra)
+Problem: Win32: gvim compiled with VC++ 7.0 run on Windows 95 does not show
+ menu items.
+Solution: Define $WINVER to avoid an extra item is added to MENUITEMINFO.
+ (Muraoka Taro)
+Files: src/Make_mvc.mak
+
+Patch 6.1.425
+Problem: ":helptags $VIMRUNTIME/doc" does not add the "help-tags" tag.
+Solution: Do add the "help-tags" tag for that specific directory.
+Files: src/ex_cmds.c
+
+Patch 6.1.426
+Problem: "--remote-wait +cmd file" waits forever. (Valery Kondakoff)
+Solution: Don't wait for the "+cmd" argument to have been edited.
+Files: src/main.c
+
+Patch 6.1.427
+Problem: Several error messages for regexp patterns are not translated.
+Solution: Use _() properly. (Muraoka Taro)
+Files: src/regexp.c
+
+Patch 6.1.428
+Problem: FreeBSD: wait() may hang when compiled with Python support and
+ doing a system() call in a startup script.
+Solution: Use waitpid() instead of wait() and poll every 10 msec, just like
+ what is done in the GUI.
+Files: src/os_unix.c
+
+Patch 6.1.429 (depends on 6.1.390)
+Problem: Crash when using showmarks.vim plugin. (Charles Campbell)
+Solution: Check for sign_get_text() returning a NULL pointer.
+Files: src/screen.c
+
+Patch 6.1.430
+Problem: In Lisp code backslashed parens should be ignored for "%". (Dorai)
+Solution: Skip over backslashed parens.
+Files: src/search.c
+
+Patch 6.1.431
+Problem: Debug commands end up in redirected text.
+Solution: Disable redirection while handling debug commands.
+Files: src/ex_cmds2.c
+
+Patch 6.1.432 (depends on 6.1.375)
+Problem: MS-Windows: ":make %:p" inserts extra backslashes. (David Rennalls)
+Solution: Don't add backslashes, handle it like ":!cmd".
+Files: src/ex_docmd.c
+
+Patch 6.1.433
+Problem: ":popup" only works for Win32.
+Solution: Add ":popup" support for GTK. (Daniel Elstner)
+Files: runtime/doc/gui.txt, src/ex_docmd.c, src/gui_gtk.c, src/menu.c,
+ src/proto/gui_gtk.pro
+
+Patch 6.1.434 (extra)
+Problem: Win32: When there are more than 32767 lines, the scrollbar has a
+ roundoff error.
+Solution: Make a click on an arrow move one line. Also move the code to
+ gui_w48.c, there is hardly any difference between the 16 bit and
+ 32 bit versions. (Walter Briscoe)
+Files: src/gui_w16.c, src/gui_w32.c, src/gui_w48.c
+
+Patch 6.1.435
+Problem: ":winsize x" resizes the Vim window to the minimal size. (Andrew
+ Pimlott)
+Solution: Give an error message for wrong arguments of ":winsize" and
+ ":winpos".
+Files: src/ex_docmd.c
+
+Patch 6.1.436
+Problem: When a long UTF-8 file contains an illegal byte it's hard to find
+ out where it is. (Ron Aaron)
+Solution: Add the line number to the error message.
+Files: src/fileio.c
+
+Patch 6.1.437 (extra, depends on 6.1.421)
+Problem: Using multibyte functions when they are not available.
+Solution: Put the clipboard conversion inside an #ifdef. (Vince Negri)
+ Also fix a pointer type mistake. (Walter Briscoe)
+Files: src/os_mswin.c
+
+Patch 6.1.438
+Problem: When Perl has thread support Vim cannot use the Perl interface.
+Solution: Add a configure check and disable Perl when it will not work.
+ (Aron Griffis)
+Files: src/auto/configure, src/configure.in
+
+Patch 6.1.439
+Problem: Netbeans: A "create" function doesn't actually create a buffer,
+ following functions may fail.
+Solution: Create a Vim buffer without a name when "create" is called.
+ (Gordon Prieur)
+Files: runtime/doc/netbeans.txt, src/netbeans.c
+
+Patch 6.1.440
+Problem: The "@*" command doesn't obtain the actual contents of the
+ clipboard. (Hari Krishna Dara)
+Solution: Obtain the clipboard text before executing the command.
+Files: src/ops.c
+
+Patch 6.1.441
+Problem: "zj" and "zk" cannot be used as a motion command after an
+ operator. (Ralf Hetzel)
+Solution: Accept these commands as motion commands.
+Files: src/normal.c
+
+Patch 6.1.442
+Problem: Unicode 3.2 defines more space and punctuation characters.
+Solution: Add the new characters to the Unicode tables. (Raphael Finkel)
+Files: src/mbyte.c
+
+Patch 6.1.443 (extra)
+Problem: Win32: The gvimext.dll build with Borland 5.5 requires another
+ DLL.
+Solution: Build a statically linked version by default. (Dan Sharp)
+Files: GvimExt/Make_bc5.mak
+
+Patch 6.1.444 (extra)
+Problem: Win32: Enabling a build with gettext support is not consistent.
+Solution: Use "GETTEXT" for Borland and msvc makefiles. (Dan Sharp)
+Files: src/Make_bc5.mak, src/Make_mvc.mak
+
+Patch 6.1.445 (extra)
+Problem: DJGPP: get warning for argument of putenv()
+Solution: Define HAVE_PUTENV to use DJGPP's putenv(). (Walter Briscoe)
+Files: src/os_msdos.h
+
+Patch 6.1.446 (extra)
+Problem: Win32: The MingW makefile uses a different style of arguments than
+ other makefiles.
+ Dynamic IME is not supported for Cygwin.
+Solution: Use "no" and "yes" style arguments. Remove the use of the
+ dyn-ming.h include file. (Dan Sharp)
+ Do not include the ime.h file and adjust the makefile. (Alejandro
+ Lopez-Valencia)
+Files: src/Make_cyg.mak, src/Make_ming.mak, src/gui_w32.c,
+ src/if_perl.xs, src/if_python.c, src/if_ruby.c, src/os_win32.c
+
+Patch 6.1.447
+Problem: "make install" uses "make" directly for generating help tags.
+Solution: Use $(MAKE) instead of "make". (Tim Mooney)
+Files: src/Makefile
+
+Patch 6.1.448
+Problem: 'titlestring' has a default maximum width of 50 chars per item.
+Solution: Remove the default maximum (also for 'statusline').
+Files: src/buffer.c
+
+Patch 6.1.449
+Problem: When "1" and "a" are in 'formatoptions', auto-formatting always
+ moves a newly added character to the next line. (Servatius Brandt)
+Solution: Don't move a single character to the next line when it was just
+ typed.
+Files: src/edit.c
+
+Patch 6.1.450
+Problem: Termcap entry "kB" for back-tab is not recognized.
+Solution: Use back-tab as the shift-tab code.
+Files: src/keymap.h, src/misc2.c, src/term.c
+
+Patch 6.1.451
+Problem: GUI: When text in the find dialog contains a slash, a backslash is
+ inserted the next time it is opened. (Mezz)
+Solution: Remove escaped backslashes and question marks. (Daniel Elstner)
+Files: src/gui.c
+
+Patch 6.1.452 (extra, after 6.1.446)
+Problem: Win32: IME support doesn't work for MSVC.
+Solution: Use _MSC_VER instead of __MSVC. (Alejandro Lopez-Valencia)
+Files: src/gui_w32.c
+
+Patch 6.1.453 (after 6.1.429)
+Problem: When compiled without sign icons but with sign support, adding a
+ sign may cause a crash.
+Solution: Check for the text sign to exist before using it. (Kamil
+ Burzynski)
+Files: src/screen.c
+
+Patch 6.1.454 (extra)
+Problem: Win32: pasting Russian text in Vim with 'enc' set to cp1251
+ results in utf-8 bytes. (Perelyubskiy)
+ Conversion from DBCS to UCS2 does not work when 'encoding' is not
+ the active codepage.
+Solution: Introduce enc_codepage and use it for conversion to 'encoding'
+ (Glenn Maynard)
+ Use MultiByteToWideChar() and WideCharToMultiByte() instead of
+ iconv(). Should do most needed conversions without iconv.dll.
+Files: src/globals.h, src/gui_w32.c, src/mbyte.c, src/os_mswin.c,
+ src/proto/mbyte.pro, src/proto/os_mswin.pro, src/structs.h
+
+Patch 6.1.455
+Problem: Some Unicode characters can be one or two character cells wide.
+Solution: Add the 'ambiwidth' option to tell Vim how to display these
+ characters. (Jungshik Shin)
+ Also reset the script ID when setting an option to its default
+ value, so that ":verbose set" won't give wrong info.
+Files: runtime/doc/options.txt, src/mbyte.c, src/option.c, src/option.h
+
+Patch 6.1.456 (extra, after 6.1.454)
+Problem: Win32: IME doesn't work.
+Solution: ImmGetCompositionStringW() returns the size in bytes, not words.
+ (Yasuhiro Matsumoto) Also fix typecast problem.
+Files: src/gui_w32.c, src/os_mswin.c
+
+Patch 6.1.457
+Problem: An empty register in viminfo causes conversion to fail.
+Solution: Don't convert an empty string. (Yasuhiro Matsumoto)
+Files: src/ex_cmds.c, src/mbyte.c
+
+Patch 6.1.458
+Problem: Compiler warning for pointer.
+Solution: Add a typecast.
+Files: src/ex_cmds.c
+
+Patch 6.1.459 (extra)
+Problem: Win32: libcall() may return an invalid pointer and cause Vim to
+ crash.
+Solution: Add a strict check for the returned pointer. (Bruce Mellows)
+Files: src/os_mswin.c
+
+Patch 6.1.460
+Problem: GTK: after scrolling the text one line with a key, clicking the
+ arrow of the scrollbar does not always work. (Nam SungHyun)
+Solution: Always update the scrollbar thumb when the value changed, even
+ when it would not move, like for RISCOS. (Daniel Elstner)
+Files: src/gui.c, src/gui.h
+
+Patch 6.1.461
+Problem: When a keymap is active, typing a character in Select mode does
+ not use it. (Benji Fisher)
+Solution: Apply Insert mode mapping to the character typed in Select mode.
+Files: src/normal.c
+
+Patch 6.1.462
+Problem: When autocommands wipe out a buffer, a crash may happen. (Hari
+ Krishna Dara)
+Solution: Don't decrement the window count of a buffer before calling the
+ autocommands for it. When re-using the current buffer, watch out
+ for autocommands changing the current buffer.
+Files: src/buffer.c, src/ex_cmds.c, src/proto/buffer.pro
+
+Patch 6.1.463
+Problem: When writing a compressed file, the file name that gzip stores in
+ the file is the weird temporary file name. (David Rennalls)
+Solution: Use the real file name when possible.
+Files: runtime/plugin/gzip.vim
+
+Patch 6.1.464
+Problem: Crash when using C++ syntax highlighting. (Gerhard Hochholzer)
+Solution: Check for a negative index.
+Files: src/syntax.c
+
+Patch 6.1.465 (after 6.1.454)
+Problem: Compile error when using cygwin.
+Solution: Change #ifdef WIN32 to #ifdef WIN3264. (Alejandro Lopez-Valencia)
+ Undefine WIN32 after including windows.h
+Files: src/mbyte.c
+
+Patch 6.1.466
+Problem: The "-f" argument is a bit obscure.
+Solution: Add the "--nofork" argument. Improve the help text a bit.
+Files: runtime/doc/starting.txt, src/main.c
+
+Patch 6.1.467
+Problem: Setting the window title doesn't work for Chinese.
+Solution: Use an X11 function to convert text to a text property. (Kentaro
+ Nakazawa)
+Files: src/os_unix.c
+
+Patch 6.1.468
+Problem: ":mksession" also stores folds for buffers which will not be
+ restored.
+Solution: Only store folds for a buffer with 'buftype' empty and help files.
+Files: src/ex_docmd.c
+
+Patch 6.1.469
+Problem: 'listchars' cannot contain multibyte characters.
+Solution: Handle multibyte UTF-8 list characters. (Matthew Samsonoff)
+Files: src/message.c, src/option.c, src/screen.c
+
+Patch 6.1.470 (lang)
+Problem: Polish messages don't show up correctly on MS-Windows.
+Solution: Convert messages to cp1250. (Mikolaj Machowski)
+ Also add English message translations, because it got in the way
+ of the patch.
+Files: Makefile, src/po/Makefile, src/po/en_gb.po, src/po/pl.po
+
+Patch 6.1.471
+Problem: ":jumps" output continues after pressing "q" at the more-prompt.
+ (Hari Krishna Dara)
+Solution: Check for "got_int" being set.
+Files: src/mark.c
+
+Patch 6.1.472
+Problem: When there is an authentication error when connecting to the X
+ server Vim exits.
+Solution: Use XSetIOErrorHandler() to catch the error and longjmp() to avoid
+ the exit. Also do this in the main loop, so that when the X
+ server exits a Vim running in a console isn't killed.
+Files: src/globals.h, src/main.c, src/os_unix.c
+
+Patch 6.1.473
+Problem: Referring to $curwin or $curbuf in Perl 5.6 causes a crash.
+Solution: Add "pTHX_" to cur_val(). (Yasuhiro Matsumoto)
+Files: src/if_perl.xs
+
+Patch 6.1.474
+Problem: When opening the command-line window in Ex mode it's impossible to
+ go back. (Pavol Juhas)
+Solution: Reset "exmode_active" and restore it when the command-line window
+ is closed.
+Files: src/ex_getln.c
+
+
+Patch 6.2f.001
+Problem: The configure check for Ruby didn't work properly for Ruby 1.8.0.
+Solution: Change the way the Ruby check is done. (Aron Griffis)
+Files: src/auto/configure, src/configure.in
+
+Patch 6.2f.002
+Problem: The output of ":ls" doesn't show whether a buffer had read errors.
+Solution: Add the "x" flag in the ":ls" output.
+Files: runtime/doc/windows.txt, src/buffer.c
+
+Patch 6.2f.003
+Problem: Test49 doesn't properly test the behavior of ":catch" without an
+ argument.
+Solution: Update test49. (Servatius Brandt)
+Files: src/testdir/test49.ok, src/testdir/test49.vim
+
+Patch 6.2f.004
+Problem: "vim --version" always uses CR/LF in the output.
+Solution: Omit the CR.
+Files: src/message.c, src/os_unix.c
+
+Patch 6.2f.005
+Problem: Two error messages without a colon after the number.
+Solution: Add the colon. (Taro Muraoka)
+Files: src/if_cscope.c
+
+Patch 6.2f.006
+Problem: When saving a file takes a while and Vim regains focus this can
+ result in a "file changed outside of Vim" warning and ml_get()
+ errors. (Mike Williams)
+Solution: Add the "b_saving" flag to avoid checking the timestamp while the
+ buffer is being saved. (Michael Schaap)
+Files: src/fileio.c, src/structs.h
+
+Patch 6.2f.007
+Problem: Irix compiler complains about multiple defined symbols.
+ vsnprintf() is not available. (Charles Campbell)
+Solution: Insert EXTERN for variables in globals.h. Change the configure
+ check for vsnprintf() from compiling to linking.
+Files: src/auto/configure, src/configure.in, src/globals.h
+
+Patch 6.2f.008
+Problem: The Aap recipe doesn't work with Aap 0.149.
+Solution: Change targetarg to TARGETARG. Update the mysign file.
+Files: src/main.aap, src/mysign
+
+Patch 6.2f.009 (extra)
+Problem: Small problem when building with Borland 5.01.
+Solution: Use mkdir() instead of _mkdir(). (Walter Briscoe)
+Files: src/dosinst.h
+
+Patch 6.2f.010
+Problem: Warning for missing prototypes.
+Solution: Add missing prototypes. (Walter Briscoe)
+Files: src/if_cscope.c
+
+Patch 6.2f.011
+Problem: The configure script doesn't work with autoconf 2.5x.
+Solution: Add square brackets around a header check. (Aron Griffis)
+ Note: touch src/auto/configure after applying this patch.
+Files: src/configure.in
+
+Patch 6.2f.012
+Problem: ":echoerr" doesn't work correctly inside try/endtry.
+Solution: Don't reset did_emsg inside a try/endtry. (Servatius Brandt)
+Files: src/eval.c
+
+Patch 6.2f.013 (extra)
+Problem: Macintosh: Compiler warning for a trigraph.
+Solution: Insert a backslash before each question mark. (Peter Cucka)
+Files: src/os_mac.h
+
+Patch 6.2f.014 (extra)
+Problem: Macintosh: ex_eval is not included in the project file.
+Solution: Add ex_eval. (Dany St-Amant)
+Files: src/os_mac.pbproj/project.pbxproj
+
+Patch 6.2f.015 (extra)
+Problem: Win32: When changing header files not all source files involved
+ are recompiled.
+Solution: Improve the dependency rules. (Dan Sharp)
+Files: src/Make_cyg.mak, src/Make_ming.mak
+
+Patch 6.2f.016
+Problem: "vim --version > ff" on non-Unix systems results in a file with a
+ missing line break at the end. (Bill McCarthy)
+Solution: Add a line break.
+Files: src/main.c
+
+Patch 6.2f.017
+Problem: Unix: starting Vim in the background and then bringing it to the
+ foreground may cause the terminal settings to be wrong.
+Solution: Check for tcsetattr() to return an error, retry when it does.
+ (Paul Tapper)
+Files: src/os_unix.c
+
+Patch 6.2f.018
+Problem: Mac OS X 10.2: OK is defined to zero in curses.h while Vim uses
+ one. Redefining it causes a warning message.
+Solution: Undefine OK before defining it to one. (Taro Muraoka)
+Files: src/vim.h
+
+Patch 6.2f.019
+Problem: Mac OS X 10.2: COLOR_BLACK and COLOR_WHITE are defined in
+ curses.h.
+Solution: Rename them to PRCOLOR_BLACK and PRCOLOR_WHITE.
+Files: src/ex_cmds2.c
+
+Patch 6.2f.020
+Problem: Win32: test50 produces beeps and fails with some versions of diff.
+Solution: Remove empty lines and convert the output to dos fileformat.
+Files: src/testdir/test50.in
+
+Patch 6.2f.021
+Problem: Running configure with "--enable-netbeans" disables Netbeans.
+ (Gordon Prieur)
+Solution: Fix the tests in configure.in where the default is to enable a
+ feature. Fix that "--enable-acl" reported "yes" confusingly.
+Files: src/auto/configure, src/configure.in, src/mysign
+
+Patch 6.2f.022
+Problem: A bogus value for 'foldmarker' is not rejected, possibly causing a
+ hang. (Derek Wyatt)
+Solution: Check for a non-empty string before and after the comma.
+Files: src/option.c
+
+Patch 6.2f.023
+Problem: When the help files are not in $VIMRUNTIME but 'helpfile' is
+ correct Vim still can't find the help files.
+Solution: Also look for a tags file in the directory of 'helpfile'.
+Files: src/tag.c
+
+Patch 6.2f.024
+Problem: When 'delcombine' is set and a character has more than two
+ composing characters "x" deletes them all.
+Solution: Always delete only the last composing character.
+Files: src/misc1.c
+
+Patch 6.2f.025
+Problem: When reading a file from stdin that has DOS line endings but a
+ missing end-of-line for the last line 'fileformat' becomes "unix".
+ (Bill McCarthy)
+Solution: Don't add the missing line break when re-reading the text from the
+ buffer.
+Files: src/fileio.c
+
+Patch 6.2f.026
+Problem: When typing new text at the command line, old composing characters
+ may be displayed.
+Solution: Don't read composing characters from after the end of the
+ text to be displayed.
+Files: src/ex_getln.c, src/mbyte.c, src/message.c, src/proto/mbyte.pro,
+ src/screen.c
+
+Patch 6.2f.027
+Problem: Compiler warnings for unsigned char pointers. (Tony Leneis)
+Solution: Add typecasts to char pointer.
+Files: src/quickfix.c
+
+Patch 6.2f.028
+Problem: GTK: When 'imactivatekey' is empty and XIM is inactive it can't be
+ made active again. Cursor isn't updated immediately when changing
+ XIM activation. Japanese XIM may hang when using 'imactivatekey'.
+ Can't activate XIM after typing fFtT command or ":sh".
+Solution: Properly set the flag that indicates the IM is active. Update the
+ cursor right away. Do not send a key-release event. Handle
+ Normal mode and running an external command differently.
+ (Yasuhiro Matsumoto)
+Files: src/mbyte.c
+
+Patch 6.2f.029
+Problem: Mixing use of int and enum.
+Solution: Adjust argument type of cs_usage_msg(). Fix wrong typedef.
+Files: src/if_cscope.c, src/if_cscope.h
+
+Patch 6.2f.030 (after 6.2f.028)
+Problem: Cursor moves up when using XIM.
+Solution: Reset im_preedit_cursor. (Yasuhiro Matsumoto)
+Files: src/mbyte.c
+
+Patch 6.2f.031
+Problem: Crash when listing a function argument in the debugger. (Ron Aaron)
+Solution: Init the name field of an argument to NULL.
+Files: src/eval.c
+
+Patch 6.2f.032
+Problem: When a write fails for a ":silent!" while inside try/endtry the
+ BufWritePost autocommands are not triggered.
+Solution: Check the emsg_silent flag in should_abort(). (Servatius Brandt)
+Files: src/ex_eval.c, src/testdir/test49.ok, src/testdir/test49.vim
+
+Patch 6.2f.033
+Problem: Cscope: re-entrance problem for ":cscope" command. Checking for
+ duplicate database didn't work well for Win95. Didn't check for
+ duplicate databases after an empty entry.
+Solution: Don't set postponed_split too early. Remember first empty
+ database entry. (Sergey Khorev)
+Files: src/if_cscope.c
+
+Patch 6.2f.034
+Problem: The netbeans interface cannot be used on systems without
+ vsnprintf(). (Tony Leneis)
+Solution: Use EMSG(), EMSGN() and EMSG2() instead.
+Files: src/auto/configure, src/configure.in, src/netbeans.c
+
+Patch 6.2f.035
+Problem: The configure check for the netbeans interface doesn't work if the
+ socket and nsl libraries are required.
+Solution: Check for the socket and nsl libraries before the netbeans check.
+Files: src/auto/configure, src/configure.in
+
+Patch 6.2f.036
+Problem: Moving leftwards over text with an illegal UTF-8 byte moves one
+ byte instead of one character.
+Solution: Ignore an illegal byte after the cursor position.
+Files: src/mbyte.c
+
+Patch 6.2f.037
+Problem: When receiving a Netbeans command at the hit-enter or more prompt
+ the screen is redrawn but Vim is still waiting at the prompt.
+Solution: Quit the prompt like a CTRL-C was typed.
+Files: src/netbeans.c
+
+Patch 6.2f.038
+Problem: The dependency to run autoconf causes a patch for configure.in
+ to run autoconf, even though the configure script was updated as
+ well.
+Solution: Only run autoconf with "make autoconf".
+Files: src/Makefile
+
+Patch 6.2f.039
+Problem: CTRL-W K makes the new top window very high.
+Solution: When 'equalalways' is set equalize the window heights.
+Files: src/window.c
+
+
+==============================================================================
+VERSION 6.3 *version-6.3*
+
+This section is about improvements made between version 6.2 and 6.3.
+
+This is mainly a bug-fix release. There are also a few new features.
+The major number of new items is in the runtime files and translations.
+
+
+Changed *changed-6.3*
+-------
+
+The intro message also displays a note about sponsoring Vim, mixed randomly
+with the message about helping children in Uganda.
+
+Included the translated menus, keymaps and tutors with the normal runtime
+files. The separate "lang" archive now only contains translated messages.
+
+Made the translated menu file names a bit more consistent. Use "latin1" for
+"iso_8859-1" and "iso_8859-15".
+
+Removed the "file_select.vim" script from the distribution. It's not more
+useful than other scripts that can be downloaded from www.vim.org.
+
+The "runtime/doc/tags" file is now always in unix fileformat. On MS-Windows
+it used to be dos fileformat, but ":helptags" generates a unix format file.
+
+
+Added *added-6.3*
+-----
+
+New commands:
+ :cNfile go to last error in previous file
+ :cpfile idem
+ :changes print the change list
+ :keepmarks following command keeps marks where they are
+ :keepjumps following command keeps jumplist and marks
+ :lockmarks following command keeps marks where they are
+ :redrawstatus force a redraw of the status line(s)
+
+New options:
+ 'antialias' Mac OS X: use smooth, antialiased fonts
+ 'helplang' preferred help languages
+
+Syntax files:
+ Arch inventory (Nikolai Weibull)
+ Calendar (Nikolai Weibull)
+ Ch (Wayne Cheng)
+ Controllable Regex Mutilator (Nikolai Weibull)
+ D (Jason Mills)
+ Desktop (Mikolaj Machowski)
+ Dircolors (Nikolai Weibull)
+ Elinks configuration (Nikolai Weibull)
+ FASM (Ron Aaron)
+ GrADS scripts (Stefan Fronzek)
+ Icewm menu (James Mahler)
+ LDIF (Zak Johnson)
+ Locale input, fdcc. (Dwayne Bailey)
+ Pinfo config (Nikolai Weibull)
+ Pyrex (Marco Barisione)
+ Relax NG Compact (Nikolai Weibull)
+ Slice (Morel Bodin)
+ VAX Macro Assembly (Tom Uijldert)
+ grads (Stefan Fronzek)
+ libao (Nikolai Weibull)
+ mplayer (Nikolai Weibull)
+ rst (Nikolai Weibull)
+ tcsh (Gautam Iyer)
+ yaml (Nikolai Weibull)
+
+Compiler plugins:
+ ATT dot (Marcos Macedo)
+ Apple Project Builder (Alexander von Below)
+ Intel (David Harrison)
+ bdf (Nikolai Weibull)
+ icc (Peter Puck)
+ javac (Doug Kearns)
+ neato (Marcos Macedo)
+ onsgmls (Robert B. Rowsome)
+ perl (Christian J. Robinson)
+ rst (Nikolai Weibull)
+ se (SmartEiffel) (Doug Kearns)
+ tcl (Doug Kearns)
+ xmlwf (Robert B. Rowsome)
+
+Filetype plugins:
+ Aap (Bram Moolenaar)
+ Ch (Wayne Cheng)
+ Css (Nikolai Weibull)
+ Pyrex (Marco Barisione)
+ Rst (Nikolai Weibull)
+
+Indent scripts:
+ Aap (Bram Moolenaar)
+ Ch (Wayne Cheng)
+ DocBook (Nikolai Weibull)
+ MetaPost (Eugene Minkovskii)
+ Objective-C (Kazunobu Kuriyama)
+ Pyrex (Marco Barisione)
+ Rst (Nikolai Weibull)
+ Tcsh (Gautam Iyer)
+ XFree86 configuration file (Nikolai Weibull)
+ Zsh (Nikolai Weibull)
+
+Keymaps:
+ Greek for cp1253 (Panagiotis Louridas)
+ Hungarian (Magyar) (Laszlo Zavaleta)
+ Persian-Iranian (Behnam Esfahbod)
+
+Message translations:
+ Catalan (Ernest Adrogue)
+ Russian (Vassily Ragosin)
+ Swedish (Johan Svedberg)
+
+Menu translations:
+ Catalan (Ernest Adrogue)
+ Russian (Tim Alexeevsky)
+ Swedish (Johan Svedberg)
+
+Tutor translations:
+ Catalan (Ernest Adrogue)
+ Russian in cp1251 (Alexey Froloff)
+ Slovak in cp1250 and iso8859-2 (Lubos Celko)
+ Swedish (Johan Svedberg)
+ Korean (Kee-Won Seo)
+ UTF-8 version of the Japanese tutor (Yasuhiro Matsumoto) Use this as
+ the original, create the other Japanese tutor by conversion.
+
+Included "russian.txt" help file. (Vassily Ragosin)
+
+Include Encapsulated PostScript and PDF versions of the Vim logo in the extra
+archive.
+
+The help highlighting finds the highlight groups and shows them in the color
+that is actually being used. (idea from Yakov Lerner)
+
+The big Win32 version is now compiled with Ruby interface, version 1.8. For
+Python version 2.3 is used. For Perl version 5.8 is used.
+
+The "ftdetect" directory is mentioned in the documentation. The DOS install
+program creates it.
+
+
+Fixed *fixed-6.3*
+-----
+
+Test 42 failed on MS-Windows. Set and reset 'fileformat' and 'binary' options
+here and there. (Walter Briscoe)
+
+The explorer plugin didn't work for double-byte 'encoding's.
+
+Use "copy /y" in Make_bc5.mak to avoid a prompt for overwriting.
+
+Patch 6.2.001
+Problem: The ":stopinsert" command doesn't have a help tag.
+Solution: Add the tag. (Antoine J. Mechelynck)
+Files: runtime/doc/insert.txt, runtime/doc/tags
+
+Patch 6.2.002
+Problem: When compiled with the +multi_byte feature but without +eval,
+ displaying UTF-8 characters may cause a crash. (Karsten Hopp)
+Solution: Also set the default for 'ambiwidth' when compiled without the
+ +eval feature.
+Files: src/option.c
+
+Patch 6.2.003
+Problem: GTK 2: double-wide characters below 256 are not displayed
+ correctly.
+Solution: Check the cell width for characters above 127. (Yasuhiro
+ Matsumoto)
+Files: src/gui_gtk_x11.c
+
+Patch 6.2.004
+Problem: With a line-Visual selection at the end of the file a "p" command
+ puts the text one line upwards.
+Solution: Detect that the last line was deleted and put forward. (Taro
+ Muraoka)
+Files: src/normal.c
+
+Patch 6.2.005
+Problem: GTK: the "Find" and "Find and Replace" tools don't work. (Aschwin
+ Marsman)
+Solution: Show the dialog after creating it. (David Necas)
+Files: src/gui_gtk.c
+
+Patch 6.2.006
+Problem: The Netbeans code contains an obsolete function that uses "vim61"
+ and sets the fall-back value for $VIMRUNTIME.
+Solution: Delete the obsolete function.
+Files: src/main.c, src/netbeans.c, src/proto/netbeans.pro
+
+Patch 6.2.007
+Problem: Listing tags for Cscope doesn't always work.
+Solution: Avoid using smgs_attr(). (Sergey Khorev)
+Files: src/if_cscope.c
+
+Patch 6.2.008
+Problem: XIM with GTK 2: After backspacing preedit characters are wrong.
+Solution: Reset the cursor position. (Yasuhiro Matsumoto)
+Files: src/mbyte.c
+
+Patch 6.2.009
+Problem: Win32: The self-installing executable "Full" selection only
+ selects some of the items to install. (Salman Mohsin)
+Solution: Change commas to spaces in between section numbers.
+Files: nsis/gvim.nsi
+
+Patch 6.2.010
+Problem: When 'virtualedit' is effective and a line starts with a
+ multibyte character, moving the cursor right doesn't work.
+Solution: Obtain the right character to compute the column offset. (Taro
+ Muraoka)
+Files: src/charset.c
+
+Patch 6.2.011
+Problem: Alpha OSF1: stat() is a macro and doesn't allow an #ifdef halfway.
+ (Moshe Kaminsky)
+Solution: Move the #ifdef outside of stat().
+Files: src/os_unix.c
+
+Patch 6.2.012
+Problem: May hang when polling for a character.
+Solution: Break the wait loop when not waiting for a character.
+Files: src/os_unix.c
+
+Patch 6.2.013 (extra)
+Problem: Win32: The registry key for uninstalling GvimExt still uses "6.1".
+Solution: Change the version number to "6.2". (Ajit Thakkar)
+Files: src/GvimExt/GvimExt.reg
+
+Patch 6.2.014 (after 6.2.012)
+Problem: XSMP doesn't work when using poll().
+Solution: Use xsmp_idx instead of gpm_idx. (Neil Bird)
+Files: src/os_unix.c
+
+Patch 6.2.015
+Problem: The +xsmp feature is never enabled.
+Solution: Move the #define for USE_XSMP to below where WANT_X11 is defined.
+ (Alexey Froloff)
+Files: src/feature.h
+
+Patch 6.2.016
+Problem: Using ":scscope find" with 'cscopequickfix' does not always split
+ the window. (Gary Johnson)
+ Win32: ":cscope add" could make the script that contains it
+ read-only until the corresponding ":cscope kill".
+ Errors during ":cscope add" may not be handled properly.
+Solution: When using the quickfix window may need to split the window.
+ Avoid file handle inheritance for the script.
+ Check for a failed connection and/or process. (Sergey Khorev)
+Files: src/ex_cmds2.c, src/if_cscope.c
+
+Patch 6.2.017
+Problem: Test11 sometimes prompts the user, because a file would have been
+ changed outside of Vim. (Antonio Colombo)
+Solution: Add a FileChangedShell autocommand to avoid the prompt.
+Files: src/testdir/test11.in
+
+Patch 6.2.018
+Problem: When using the XSMP protocol and reading from stdin Vim may wait
+ for a key to be pressed.
+Solution: Avoid that RealWaitForChar() is used recursively.
+Files: src/os_unix.c
+
+Patch 6.2.019 (lang)
+Problem: Loading the Portuguese menu causes an error message.
+Solution: Join two lines. (Jose Pedro Oliveira, José de Paula)
+Files: runtime/lang/menu_pt_br.vim
+
+Patch 6.2.020
+Problem: The "Syntax/Set syntax only" menu item causes an error message.
+ (Oyvind Holm)
+Solution: Set the script-local variable in a function. (Benji Fisher)
+Files: runtime/synmenu.vim
+
+Patch 6.2.021
+Problem: The user manual section on exceptions contains small mistakes.
+Solution: Give a good example of an error that could be missed and other
+ improvements. (Servatius Brandt)
+Files: runtime/doc/usr_41.txt
+
+Patch 6.2.022 (extra)
+Problem: Win32: After deleting a menu item it still appears in a tear-off
+ window.
+Solution: Set the mode to zero for the deleted item. (Yasuhiro Matsumoto)
+Files: src/gui_w32.c
+
+Patch 6.2.023 (extra)
+Problem: Win32: Make_ivc.mak does not clean everything.
+Solution: Delete more files in the clean rule. (Walter Briscoe)
+Files: src/Make_ivc.mak
+
+Patch 6.2.024 (extra)
+Problem: Win32: Compiler warnings for typecasts.
+Solution: Use DWORD instead of WORD. (Walter Briscoe)
+Files: src/gui_w32.c
+
+Patch 6.2.025
+Problem: Missing prototype for sigaltstack().
+Solution: Add the prototype when it is not found in a header file.
+Files: src/os_unix.c
+
+Patch 6.2.026
+Problem: Warning for utimes() argument.
+Solution: Add a typecast.
+Files: src/fileio.c
+
+Patch 6.2.027
+Problem: Warning for uninitialized variable.
+Solution: Set mb_l to one when not using multibyte characters.
+Files: src/message.c
+
+Patch 6.2.028
+Problem: Cscope connection may kill Vim process and others.
+Solution: Check for pid being larger than one. (Khorev Sergey)
+Files: src/if_cscope.c
+
+Patch 6.2.029
+Problem: When using the remote server functionality Vim may leak memory.
+ (Srikanth Sankaran)
+Solution: Free the result of XListProperties().
+Files: src/if_xcmdsrv.c
+
+Patch 6.2.030
+Problem: Mac: Warning for not being able to use precompiled header files.
+Solution: Don't redefine select. Use -no-cpp-precomp for compiling, so that
+ function prototypes are still found.
+Files: src/os_unix.c, src/osdef.sh
+
+Patch 6.2.031
+Problem: The langmenu entry in the options window doesn't work. (Rodolfo
+ Lima)
+ With GTK 1 the ":options" command causes an error message.
+ (Michael Naumann)
+Solution: Change "lmenu" to "langmenu". Only display the 'tbis' option for
+ GTK 2.
+Files: runtime/optwin.vim
+
+Patch 6.2.032
+Problem: The lpc filetype is never recognized. (Shizhu Pan)
+Solution: Check for g:lpc_syntax_for_c instead of the local variable
+ lpc_syntax_for_c. (Benji Fisher)
+Files: runtime/filetype.vim
+
+Patch 6.2.033 (extra)
+Problem: Mac: Various compiler warnings.
+Solution: Don't include Classic-only headers in Unix version.
+ Remove references to several unused variables. (Ben Fowler)
+ Fix double definition of DEFAULT_TERM.
+ Use int instead of unsigned short for pixel values, so that the
+ negative error values are recognized.
+Files: src/gui_mac.c, src/term.c
+
+Patch 6.2.034
+Problem: Mac: Compiler warning for redefining DEFAULT_TERM.
+Solution: Fix double definition of DEFAULT_TERM.
+Files: src/term.c
+
+Patch 6.2.035
+Problem: Mac: Compiler warnings in Python interface.
+Solution: Make a difference between pure Mac and Unix-Mac. (Peter Cucka)
+Files: src/if_python.c
+
+Patch 6.2.036 (extra)
+Problem: Mac Unix version: If foo is a directory, then ":e f<Tab>" should
+ expand to ":e foo/" instead of ":e foo" . (Vadim Zeitlin)
+Solution: Define DONT_ADD_PATHSEP_TO_DIR only for pure Mac. (Benji Fisher)
+Files: src/os_mac.h
+
+Patch 6.2.037
+Problem: Win32: converting an encoding name to a codepage could result in
+ an arbitrary number.
+Solution: make encname2codepage() return zero if the encoding name doesn't
+ contain a codepage number.
+Files: src/mbyte.c
+
+Patch 6.2.038 (extra)
+Problem: Warning messages when using the MingW compiler. (Bill McCarthy)
+ Can't compile console version without +mouse feature.
+Solution: Initialize variables, add parenthesis.
+ Add an #ifdef around g_nMouseClick. (Ajit Thakkar)
+Files: src/eval.c, src/os_win32.c, src/gui_w32.c, src/dosinst.c
+
+Patch 6.2.039 (extra)
+Problem: More warning messages when using the MingW compiler.
+Solution: Initialize variables. (Bill McCarthy)
+Files: src/os_mswin.c
+
+Patch 6.2.040
+Problem: FreeBSD: Crash while starting up when compiled with +xsmp feature.
+Solution: Pass a non-NULL argument to IceAddConnectionWatch().
+Files: src/os_unix.c
+
+Patch 6.2.041 (extra, after 6.2.033)
+Problem: Mac: Compiler warnings for conversion types, missing prototype,
+ missing return type.
+Solution: Change sscanf "%hd" to "%d", the argument is an int now. Add
+ gui_mch_init_check() prototype. Add "int" to termlib functions.
+Files: src/gui_mac.c, src/proto/gui_mac.pro, src/termlib.c.
+
+Patch 6.2.042 (extra)
+Problem: Cygwin: gcc 3.2 has an optimizer problem, sometimes causing a
+ crash.
+Solution: Add -fno-strength-reduce to the compiler arguments. (Dan Sharp)
+Files: src/Make_cyg.mak
+
+Patch 6.2.043
+Problem: Compiling with both netbeans and workshop doesn't work.
+Solution: Move the shellRectangle() function to gui_x11.c. (Gordon Prieur)
+Files: src/gui_x11.c, src/integration.c, src/netbeans.c,
+ src/proto/netbeans.pro
+
+Patch 6.2.044
+Problem: ":au filetypedetect" gives an error for a non-existing event name,
+ but it's actually a non-existing group name. (Antoine Mechelynck)
+Solution: Make the error message clearer.
+Files: src/fileio.c
+
+Patch 6.2.045
+Problem: Obtaining the '( mark changes the '' mark. (Gary Holloway)
+Solution: Don't set the '' mark when searching for the start/end of the
+ current sentence/paragraph.
+Files: src/mark.c
+
+Patch 6.2.046
+Problem: When evaluating an argument of a function throws an exception the
+ function is still called. (Hari Krishna Dara)
+Solution: Don't call the function when an exception was thrown.
+Files: src/eval.c
+
+Patch 6.2.047 (extra)
+Problem: Compiler warnings when using MingW. (Bill McCarthy)
+Solution: Give the s_dwLastClickTime variable a type. Initialize dwEndTime.
+Files: src/os_win32.c
+
+Patch 6.2.048
+Problem: The Python interface doesn't compile with Python 2.3 when
+ dynamically loaded.
+Solution: Use dll_PyObject_Malloc and dll_PyObject_Free. (Paul Moore)
+Files: src/if_python.c
+
+Patch 6.2.049
+Problem: Using a "-range=" argument with ":command" doesn't work and
+ doesn't generate an error message.
+Solution: Generate an error message.
+Files: src/ex_docmd.c
+
+Patch 6.2.050
+Problem: Test 32 didn't work on MS-Windows.
+Solution: Write the temp file in Unix fileformat. (Walter Briscoe)
+Files: src/testdir/test32.in
+
+Patch 6.2.051
+Problem: When using "\=submatch(0)" in a ":s" command, line breaks become
+ NUL characters.
+Solution: Change NL to CR characters, so that they become line breaks.
+Files: src/regexp.c
+
+Patch 6.2.052
+Problem: A few messages are not translated.
+Solution: Add _() to the messages. (Muraoka Taro)
+Files: src/ex_cmds.c
+
+Patch 6.2.053
+Problem: Prototype for bzero() doesn't match most systems.
+Solution: Use "void *" instead of "char *" and "size_t" instead of "int".
+Files: src/osdef1.h.in
+
+Patch 6.2.054
+Problem: A double-byte character with a second byte that is a backslash
+ causes problems inside a string.
+Solution: Skip over multibyte characters in a string properly. (Yasuhiro
+ Matsumoto)
+Files: src/eval.c
+
+Patch 6.2.055
+Problem: Using col('.') from CTRL-O in Insert mode does not return the
+ correct value for multibyte characters.
+Solution: Correct the cursor position when it is necessary, move to the
+ first byte of a multibyte character. (Yasuhiro Matsumoto)
+Files: src/edit.c
+
+Patch 6.2.056 (extra)
+Problem: Building with Sniff++ doesn't work.
+Solution: Use the multi-threaded libc when needed. (Holger Ditting)
+Files: src/Make_mvc.mak
+
+Patch 6.2.057 (extra)
+Problem: Mac: With -DMACOS_X putenv() is defined twice, it is in a system
+ library. Get a warning for redefining OK. Unused variables in
+ os_mac.c
+Solution: Define HAVE_PUTENV. Undefine OK after including curses.h.
+ Remove declarations for unused variables.
+Files: src/os_mac.c, src/os_mac.h, src/vim.h
+
+Patch 6.2.058
+Problem: When 'autochdir' is set ":bnext" to a buffer without a name causes
+ a crash.
+Solution: Don't call vim_chdirfile() when the file name is NULL. (Taro
+ Muraoka)
+Files: src/buffer.c
+
+Patch 6.2.059
+Problem: When 'scrolloff' is a large number and listing completion results
+ on the command line, then executing a command that jumps close to
+ where the cursor was before, part of the screen is not updated.
+ (Yakov Lerner)
+Solution: Don't skip redrawing part of the window when it was scrolled.
+Files: src/screen.c
+
+Patch 6.2.060 (extra)
+Problem: Win32: When 'encoding' is set to "iso-8859-7" copy/paste to/from
+ the clipboard gives a lalloc(0) error. (Kriton Kyrimis)
+Solution: When the string length is zero allocate one byte. Also fix that
+ when the length of the Unicode text is zero (conversion from
+ 'encoding' to UCS-2 was not possible) the normal text is used.
+Files: src/os_mswin.c
+
+Patch 6.2.061
+Problem: GUI: Using the left mouse button with the shift key should work
+ like "*" but it scrolls instead. (Martin Beller)
+Solution: Don't recognize an rxvt scroll wheel event when using the GUI.
+Files: src/term.c
+
+Patch 6.2.062
+Problem: When one buffer uses a syntax with "containedin" and another
+ buffer does not, redrawing depends on what the current buffer is.
+ (Brett Pershing Stahlman)
+Solution: Use "syn_buf" instead of "curbuf" to get the b_syn_containedin
+ flag.
+Files: src/syntax.c
+
+Patch 6.2.063
+Problem: When using custom completion end up with no matches.
+Solution: Make cmd_numfiles and cmd_files local to completion to avoid that
+ they are overwritten when ExpandOne() is called recursively by
+ f_glob().
+Files: src/eval.c, src/ex_docmd.c, src/ex_getln.c, src/proto/ex_getln.pro,
+ src/misc1.c, src/structs.h, src/tag.c
+
+Patch 6.2.064
+Problem: resolve() only handles one symbolic link, need to repeat it to
+ resolve all of them. Then need to simplify the file name.
+Solution: Make resolve() resolve all symbolic links and simplify the result.
+ Add simplify() to just simplify a file name. Fix that test49
+ doesn't work if /tmp is a symbolic link. (Servatius Brandt)
+Files: runtime/doc/eval.txt, src/eval.c, src/tag.c,
+ src/testdir/test49.vim
+
+Patch 6.2.065
+Problem: ":windo 123" only updates other windows when entering them.
+ (Walter Briscoe)
+Solution: Update the topline before going to the next window.
+Files: src/ex_cmds2.c
+
+Patch 6.2.066 (extra)
+Problem: Ruby interface doesn't work with Ruby 1.8.0.
+Solution: Change "defout" to "stdout". (Aron Griffis)
+ Change dynamic loading. (Taro Muraoka)
+Files: src/if_ruby.c, src/Make_mvc.mak
+
+Patch 6.2.067
+Problem: When searching for a string that starts with a composing character
+ the command line isn't drawn properly.
+Solution: Don't count the space to draw the composing character on and
+ adjust the cursor column after drawing the string.
+Files: src/message.c
+
+Patch 6.2.068
+Problem: Events for the netbeans interface that include a file name with
+ special characters don't work properly.
+Solution: Use nb_quote() on the file name. (Sergey Khorev)
+Files: src/netbeans.c
+
+Patch 6.2.069 (after 6.2.064)
+Problem: Unused variables "limit" and "new_st" and unused label "fail" in
+ some situation. (Bill McCarthy)
+Solution: Put the declarations inside an #ifdef. (Servatius Brandt)
+Files: src/eval.c, src/tag.c
+
+Patch 6.2.070 (after 6.2.069)
+Problem: Still unused variable "new_st". (Bill McCarthy)
+Solution: Move the declaration to the right block this time.
+Files: src/tag.c
+
+Patch 6.2.071
+Problem: 'statusline' can only contain 50 % items. (Antony Scriven)
+Solution: Allow 80 items and mention it in the docs.
+Files: runtime/doc/option.txt, src/vim.h
+
+Patch 6.2.072
+Problem: When using expression folding, foldexpr() mostly returns -1 for
+ the previous line, which makes it difficult to write a fold
+ expression.
+Solution: Make the level of the previous line available while still looking
+ for the end of a fold.
+Files: src/fold.c
+
+Patch 6.2.073
+Problem: When adding detection of a specific filetype for a plugin you need
+ to edit "filetype.vim".
+Solution: Source files from the "ftdetect" directory, so that a filetype
+ detection plugin only needs to be dropped in a directory.
+Files: runtime/doc/filetype.txt, runtime/doc/usr_05.txt,
+ runtime/doc/usr_41.txt, runtime/filetype.vim
+
+Patch 6.2.074
+Problem: Warnings when compiling the Python interface. (Ajit Thakkar)
+Solution: Use ANSI function declarations.
+Files: src/if_python.c
+
+Patch 6.2.075
+Problem: When the temp file for writing viminfo can't be used "NULL"
+ appears in the error message. (Ben Lavender)
+Solution: Print the original file name when there is no temp file name.
+Files: src/ex_cmds.c
+
+Patch 6.2.076
+Problem: The tags listed for cscope are in the wrong order. (Johannes
+ Stezenbach)
+Solution: Remove the reordering of tags for the current file. (Sergey
+ Khorev)
+Files: src/if_cscope.c
+
+Patch 6.2.077
+Problem: When a user function specifies custom completion, the function
+ gets a zero argument instead of an empty string when there is no
+ word before the cursor. (Preben Guldberg)
+Solution: Don't convert an empty string to a zero.
+Files: src/eval.c
+
+Patch 6.2.078
+Problem: "make test" doesn't work if Vim wasn't compiled yet. (Ed Avis)
+Solution: Build Vim before running the tests.
+Files: src/Makefile
+
+Patch 6.2.079
+Problem: ":w ++enc=utf-8 !cmd" doesn't work.
+Solution: Check for the "++" argument before the "!".
+Files: src/ex_docmd.c
+
+Patch 6.2.080
+Problem: When 't_ti' is not empty but doesn't swap screens, using "ZZ" in
+ an unmodified file doesn't clear the last line.
+Solution: Call msg_clr_eos() when needed. (Michael Schroeder)
+Files: src/os_unix.c
+
+Patch 6.2.081
+Problem: Problem when using a long multibyte string for the statusline.
+Solution: Use the right pointer to get the cell size. (Taro Muraoka)
+Files: src/buffer.c
+
+Patch 6.2.082
+Problem: Can't compile with Perl 5.8.1.
+Solution: Rename "e_number" to "e_number_exp". (Sascha Blank)
+Files: src/digraph.c, src/globals.h
+
+Patch 6.2.083
+Problem: When a compiler uses ^^^^ to mark a word the information is not
+ visible in the quickfix window. (Srikanth Sankaran)
+Solution: Don't remove the indent for a line that is not recognized as an
+ error message.
+Files: src/quickfix.c
+
+Patch 6.2.084
+Problem: "g_" in Visual mode always goes to the character after the line.
+ (Jean-Rene David)
+Solution: Ignore the NUL at the end of the line.
+Files: src/normal.c
+
+Patch 6.2.085
+Problem: ":verbose set ts" doesn't say an option was set with a "-c" or
+ "--cmd" argument.
+Solution: Remember the option was set from a Vim argument.
+Files: src/main.c, src/ex_cmds2.c, src/vim.h
+
+Patch 6.2.086
+Problem: "{" and "}" stop inside a closed fold.
+Solution: Only stop once inside a closed fold. (Stephen Riehm)
+Files: src/search.c
+
+Patch 6.2.087
+Problem: CTRL-^ doesn't use the 'confirm' option. Same problem with
+ ":bnext". (Yakov Lerner)
+Solution: Put up a dialog for a changed file when 'confirm' is set in more
+ situations.
+Files: src/buffer.c, src/ex_cmds.c
+
+Patch 6.2.088
+Problem: When 'sidescrolloff' is set 'showmatch' doesn't work correctly if
+ the match is less than 'sidescrolloff' off from the side of the
+ window. (Roland Stahn)
+Solution: Set 'sidescrolloff' to zero while displaying the match.
+Files: src/search.c
+
+Patch 6.2.089
+Problem: ":set isk+=" adds a comma. (Mark Waggoner)
+Solution: Don't add a comma when the added value is empty.
+Files: src/option.c
+
+Patch 6.2.090 (extra)
+Problem: Win32: MingW compiler complains about #pragmas. (Bill McCarthy)
+Solution: Put an #ifdef around the #pragmas.
+Files: src/os_win32.c
+
+Patch 6.2.091
+Problem: When an autocommand is triggered when a file is dropped on Vim and
+ it produces output, messages from a following command may be
+ scrolled unexpectedly. (David Rennalls)
+Solution: Save and restore msg_scroll in handle_drop().
+Files: src/ex_docmd.c
+
+Patch 6.2.092
+Problem: Invalid items appear in the help file tags. (Antonio Colombo)
+Solution: Only accept tags with white space before the first "*".
+Files: runtime/doc/doctags.c, src/ex_cmds.c
+
+Patch 6.2.093
+Problem: ":nnoremenu" also defines menu for Visual mode. (Klaus Bosau)
+Solution: Check the second command character for an "o", not the third.
+Files: src/menu.c
+
+Patch 6.2.094
+Problem: Can't compile with GTK and tiny features.
+Solution: Include handle_drop() and vim_chdirfile() when FEAT_DND is defined.
+ Do not try to split the window.
+Files: src/ex_docmd.c, src/misc2.c
+
+Patch 6.2.095
+Problem: The message "Cannot go to buffer x" is confusing for ":buf 6".
+ (Frans Englich)
+Solution: Make it "Buffer x does not exist".
+Files: src/buffer.c
+
+Patch 6.2.096
+Problem: Win32: ":let @* = ''" put a newline on the clipboard. (Klaus
+ Bosau)
+Solution: Put zero bytes on the clipboard for an empty string.
+Files: src/ops.c
+
+Patch 6.2.097
+Problem: Setting or resetting 'insertmode' in a BufEnter autocommand
+ doesn't always have immediate effect. (Nagger)
+Solution: When 'insertmode' is set, set need_start_insertmode, when it's
+ reset set stop_insert_mode.
+Files: src/option.c
+
+Patch 6.2.098 (after 6.2.097)
+Problem: Can't build Vim with tiny features. (Christian J. Robinson)
+Solution: Declare stop_insert_mode always.
+Files: src/edit.c, src/globals.h
+
+Patch 6.2.099 (extra)
+Problem: Test 49 fails. (Mikolaj Machowski)
+Solution: The Polish translation must not change "E116" to "R116".
+Files: src/po/pl.po
+
+Patch 6.2.100
+Problem: "make proto" fails when compiled with the Perl interface.
+Solution: Remove "-fno.*" from PERL_CFLAGS, cproto sees it as its option.
+Files: src/auto/configure, src/configure.in
+
+Patch 6.2.101
+Problem: When using syntax folding, opening a file slows down a lot when
+ it's size increases by only 20%. (Gary Johnson)
+Solution: The array with cached syntax states is leaking entries. After
+ cleaning up the list obtain the current entry again.
+Files: src/syntax.c
+
+Patch 6.2.102
+Problem: The macros equal() and CR conflict with a Carbon header file.
+Solution: Rename equal() to equalpos(). Rename CR to CAR.
+ Do this in the non-extra files only.
+Files: src/ascii.h, src/buffer.c, src/charset.c, src/edit.c, src/eval.c,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_getln.c, src/fileio.c,
+ src/getchar.c, src/gui.c, src/gui_athena.c, src/gui_gtk_x11.c,
+ src/gui_motif.c, src/macros.h, src/mark.c, src/message.c,
+ src/misc1.c, src/misc2.c, src/normal.c, src/ops.c, src/os_unix.c,
+ src/regexp.c, src/search.c, src/ui.c, src/workshop.c
+
+Patch 6.2.103 (extra)
+Problem: The macros equal() and CR conflict with a Carbon header file.
+Solution: Rename equal() to equalpos(). Rename CR to CAR.
+ Do this in the extra files only.
+Files: src/gui_photon.c, src/gui_w48.c
+
+Patch 6.2.104
+Problem: Unmatched braces in the table with options.
+Solution: Move the "}," outside of the #ifdef. (Yakov Lerner)
+Files: src/option.c
+
+Patch 6.2.105
+Problem: When the cursor is past the end of the line when calling
+ get_c_indent() a crash might occur.
+Solution: Don't look past the end of the line. (NJ Verenini)
+Files: src/misc1.c
+
+Patch 6.2.106
+Problem: Tag searching gets stuck on a very long line in the tags file.
+Solution: When skipping back to search the first matching tag remember the
+ offset where searching started looking for a line break.
+Files: src/tag.c
+
+Patch 6.2.107 (extra)
+Problem: The NetBeans interface cannot be used on Win32.
+Solution: Add support for the NetBeans for Win32. Add support for reading
+ XPM files on Win32. Also fixes that a sign icon with a space in
+ the file name did not work through the NetBeans interface.
+ (Sergey Khorev)
+ Also: avoid repeating error messages when the connection is lost.
+Files: Makefile, runtime/doc/netbeans.txt, src/Make_bc5.mak,
+ src/Make_cyg.mak, src/Make_ming.mak, src/Make_mvc.mak,
+ src/bigvim.bat, src/feature.h, src/gui_beval.c, src/gui_beval.h,
+ src/gui_w32.c, src/gui_w48.c, src/menu.c, src/nbdebug.c,
+ src/nbdebug.h, src/netbeans.c, src/os_mswin.c, src/os_win32.h,
+ src/proto/gui_beval.pro, src/proto/gui_w32.pro,
+ src/proto/netbeans.pro, src/proto.h, src/version.c, src/vim.h,
+ src/xpm_w32.c, src/xpm_w32.h
+
+Patch 6.2.108
+Problem: Crash when giving a message about ignoring case in a tag. (Manfred
+ Kuehn)
+Solution: Use a longer buffer for the message.
+Files: src/tag.c
+
+Patch 6.2.109
+Problem: Compiler warnings with various Amiga compilers.
+Solution: Add typecast, prototypes, et al. that are also useful for other
+ systems. (Flavio Stanchina)
+Files: src/eval.c, src/ops.c
+
+Patch 6.2.110
+Problem: When $LANG includes the encoding, a menu without an encoding name
+ is not found.
+Solution: Also look for a menu file without any encoding.
+Files: runtime/menu.vim
+
+Patch 6.2.111
+Problem: Encoding "cp1251" is not recognized.
+Solution: Add "cp1251" to the table of encodings. (Alexey Froloff)
+Files: src/mbyte.c
+
+Patch 6.2.112
+Problem: After applying patches test32 fails. (Antonio Colombo)
+Solution: Have "make clean" in the testdir delete *.rej and *.orig files.
+ Use this when doing "make clean" in the src directory.
+Files: src/Makefile, src/testdir/Makefile
+
+Patch 6.2.113
+Problem: Using ":startinsert" after "$" works like "a" instead of "i".
+ (Ajit Thakkar)
+Solution: Reset "w_curswant" for ":startinsert" and reset o_eol in edit().
+Files: src/edit.c, src/ex_docmd.c
+
+Patch 6.2.114
+Problem: When stdout is piped through "tee", the size of the screen may not
+ be correct.
+Solution: Use stdin instead of stdout for ioctl() when stdin is a tty and
+ stdout isn't.
+Files: src/os_unix.c
+
+Patch 6.2.115 (extra)
+Problem: Compiler warnings with various Amiga compilers.
+Solution: Add typecast, prototypes, et al. Those changes that are
+ Amiga-specific. (Flavio Stanchina)
+Files: src/fileio.c, src/memfile.c, src/os_amiga.c, src/os_amiga.h,
+ src/vim.h
+
+Patch 6.2.116 (extra)
+Problem: German keyboard with Numlock set different from system startup
+ causes problems.
+Solution: Ignore keys with code 0xff. (Helmut Stiegler)
+Files: src/gui_w48.c
+
+Patch 6.2.117
+Problem: Breakpoints in loops of sourced files and functions are not
+ detected. (Hari Krishna Dara)
+Solution: Check for breakpoints when using lines that were previously read.
+ (Servatius Brandt)
+Files: src/eval.c, src/ex_cmds2.c, src/ex_docmd.c, src/proto/eval.pro,
+ src/proto/ex_cmds2.pro
+
+Patch 6.2.118 (extra)
+Problem: Mac: Compiling is done in a non-standard way.
+Solution: Use the Unix method for Mac OS X, with autoconf. Add "CARBONGUI"
+ to Makefile and configure. (Eric Kow)
+ Move a few prototypes from os_mac.pro to gui_mac.pro.
+Files: src/Makefile, src/auto/configure, src/configure.in,
+ src/config.mk.in, src/gui_mac.c, src/os_mac.h, src/os_macosx.c,
+ src/proto/gui_mac.pro, src/proto/os_mac.pro,
+ src/infplist.xml, src/vim.h
+
+Patch 6.2.119 (after 6.2.107)
+Problem: When packing the MS-Windows archives a few files are missing.
+ (Guopeng Wen)
+Solution: Add gui_beval.* to the list of generic source files.
+Files: Makefile
+
+Patch 6.2.120
+Problem: Win32 GUI: The console dialogs are not supported on MS-Windows,
+ disabling the 'c' flag of 'guioptions'. (Servatius Brandt)
+Solution: Define FEAT_CON_DIALOG also for GUI-only builds.
+Files: src/feature.h
+
+Patch 6.2.121 (after 6.2.118)
+Problem: Not all make programs support "+=". (Charles Campbell)
+Solution: Use a normal assignment.
+Files: src/Makefile
+
+Patch 6.2.122 (after 6.2.119)
+Problem: Not all shells can expand [^~]. File missing. (Guopeng Wen)
+Solution: Use a simpler pattern. Add the Aap recipe for the maze program
+ and a clean version of the source code.
+Files: Makefile, runtime/macros/maze/Makefile,
+ runtime/macros/maze/README.txt, runtime/macros/maze/main.aap,
+ runtime/macros/maze/mazeclean.c
+
+Patch 6.2.123 (after 6.2.118)
+Problem: Running configure fails. (Tony Leneis)
+Solution: Change "==" to "=" for a test.
+Files: src/auto/configure, src/configure.in
+
+Patch 6.2.124 (after 6.2.121)(extra)
+Problem: Mac: Recursive use of M4FLAGS causes problems. When running Vim
+ directly it can't find the runtime files. (Emily Jackson)
+ Using GNU constructs causes warnings with other make programs.
+ (Ronald Schild)
+Solution: Use another name for the M4FLAGS variable.
+ Don't remove "Vim.app" from the path.
+ Update the explanation for compiling on the Mac. (Eric Kow)
+ Don't use $(shell ) and $(addprefix ).
+Files: src/INSTALLmac.txt, src/Makefile, src/misc1.c
+
+Patch 6.2.125 (after 6.2.107)
+Problem: The "winsock2.h" file isn't always available.
+Solution: Don't include this header file.
+Files: src/netbeans.c
+
+Patch 6.2.126
+Problem: Typing CTRL-C at a confirm() prompt doesn't throw an exception.
+Solution: Reset "mapped_ctrl_c" in get_keystroke(), so that "got_int" is set
+ in _OnChar().
+Files: src/misc1.c
+
+Patch 6.2.127 (extra)
+Problem: Win32 console: Typing CTRL-C doesn't throw an exception.
+Solution: Set got_int immediately when CTRL-C is typed, don't wait for
+ mch_breakcheck() being called.
+Files: src/os_win32.c
+
+Patch 6.2.128 (after 6.2.118)
+Problem: src/auto/configure is not consistent with src/configure.in.
+Solution: Use the newly generated configure script.
+Files: src/auto/configure
+
+Patch 6.2.129
+Problem: When 'number' is set 'wrapmargin' does not work Vi-compatible.
+ (Yasuhiro Matsumoto)
+Solution: Reduce the textwidth when 'number' is set. Also for 'foldcolumn'
+ and similar things.
+Files: src/edit.c
+
+Patch 6.2.130 (extra)
+Problem: Win32 console: When 'restorescreen' is not set exiting Vim causes
+ the screen to be cleared. (Michael A. Mangino)
+Solution: Don't clear the screen when exiting and 'restorescreen' isn't set.
+Files: src/os_win32.c
+
+Patch 6.2.131 (extra)
+Problem: Win32: Font handles are leaked.
+Solution: Free italic, bold and bold-italic handles before overwriting them.
+ (Michael Wookey)
+Files: src/gui_w48.c
+
+Patch 6.2.132 (extra)
+Problem: Win32: console version doesn't work on latest Windows Server 2003.
+Solution: Copy 12000 instead of 15000 cells at a time to avoid running out
+ of memory.
+Files: src/os_win32.c
+
+Patch 6.2.133
+Problem: When starting the GUI a bogus error message about 'imactivatekey'
+ may be given.
+Solution: Only check the value of 'imactivatekey' when the GUI is running.
+Files: src/gui.c, src/option.c
+
+Patch 6.2.134 (extra)
+Problem: Win32: When scrolling parts of the window are redrawn when this
+ isn't necessary.
+Solution: Only invalidate parts of the window when they are obscured by
+ other windows. (Michael Wookey)
+Files: src/gui_w48.c
+
+Patch 6.2.135
+Problem: An item <> in the ":command" argument is interpreted as <args>.
+Solution: Avoid that <> is recognized as <args>.
+Files: src/ex_docmd.c
+
+Patch 6.2.136
+Problem: ":e ++enc=latin1 newfile" doesn't set 'fenc' when the file doesn't
+ exist. (Miroslaw Dobrzanski-Neumann)
+Solution: Set 'fileencoding' to the specified encoding when editing a file
+ that does not exist.
+Files: src/fileio.c
+
+Patch 6.2.137
+Problem: "d:cmd<CR>" cannot be repeated with ".". Breaks repeating "d%"
+ when using the matchit plugin.
+Solution: Store the command to be repeated. This is restricted to
+ single-line commands.
+Files: src/ex_docmd.c, src/globals.h, src/normal.c, src/vim.h
+
+Patch 6.2.138 (extra)
+Problem: Compilation problem on VMS with dynamic buffer on the stack.
+Solution: Read one byte less than the size of the buffer, so that we can
+ check for the string length without an extra buffer.
+Files: src/os_vms.c
+
+Patch 6.2.139
+Problem: Code is repeated in the two Perl files.
+Solution: Move common code from if_perl.xs and if_perlsfio.c to vim.h.
+ Also fix a problem with generating prototypes.
+Files: src/if_perl.xs, src/if_perlsfio.c, src/vim.h
+
+Patch 6.2.140 (after 6.2.121)
+Problem: Mac: Compiling with Python and Perl doesn't work.
+Solution: Adjust the configure check for Python to use "-framework Python"
+ for Python 2.3 on Mac OS/X.
+ Move "-ldl" after "DynaLoader.a" in the link command.
+ Change "perllibs" to "PERL_LIBS".
+Files: src/auto/configure, src/configure.in, src/config.mk.in
+
+Patch 6.2.141 (extra)
+Problem: Mac: The b_FSSpec field is sometimes unused.
+Solution: Change the #ifdef to FEAT_CW_EDITOR and defined it in feature.h
+Files: src/fileio.c, src/gui_mac.c, src/structs.h, src/feature.h
+
+Patch 6.2.142 (after 6.2.124)
+Problem: Mac: building without GUI through configure doesn't work.
+ When the system is slow, unpacking the resource file takes too
+ long.
+Solution: Don't always define FEAT_GUI_MAC when MACOS is defined, define it
+ in the Makefile.
+ Add a configure option to skip Darwin detection.
+ Use a Python script to unpack the resources to avoid a race
+ condition. (Taro Muraoka)
+Files: Makefile, src/Makefile, src/auto/configure, src/configure.in,
+ src/dehqx.py, src/vim.h
+
+Patch 6.2.143
+Problem: Using "K" on Visually selected text doesn't work if it ends in
+ a multibyte character.
+Solution: Include all the bytes of the last character. (Taro Muraoka)
+Files: src/normal.c
+
+Patch 6.2.144
+Problem: When "g:html_use_css" is set the HTML header generated by the
+ 2html script is wrong.
+Solution: Add the header after adding HREF for links.
+ Also use ":normal!" instead of ":normal" to avoid mappings
+ getting in the way.
+Files: runtime/syntax/2html.vim
+
+Patch 6.2.145 (after 6.2.139)
+Problem: Undefining "bool" doesn't work for older systems. (Wojtek Pilorz)
+Solution: Only undefine "bool" on Mac OS.
+Files: src/vim.h
+
+Patch 6.2.146
+Problem: On some systems the prototype for iconv() is wrong, causing a
+ warning message.
+Solution: Use a cast (void *) to avoid the warning. (Charles Campbell)
+Files: src/fileio.c, src/mbyte.c
+
+Patch 6.2.147
+Problem: ":s/pat/\=col('.')" always replaces with "1".
+Solution: Set the cursor to the start of the match before substituting.
+ (Helmut Stiegler)
+Files: src/ex_cmds.c
+
+Patch 6.2.148
+Problem: Can't break an Insert into several undoable parts.
+Solution: Add the CTRL-G u command.
+Files: runtime/doc/insert.txt, src/edit.c
+
+Patch 6.2.149
+Problem: When the cursor is on a line past 21,474,748 the indicated
+ percentage of the position is invalid. With that many lines
+ "100%" causes a negative cursor line number, resulting in a crash.
+ (Daniel Goujot)
+Solution: Divide by 100 instead of multiplying. Avoid overflow when
+ computing the line number for "100%".
+Files: src/buffer.c, src/ex_cmds2.c, src/normal.c
+
+Patch 6.2.150
+Problem: When doing "vim - < file" lines are broken at NUL chars.
+ (Daniel Goujot)
+Solution: Change NL characters back to NUL when reading from the temp
+ buffer.
+Files: src/fileio.c
+
+Patch 6.2.151
+Problem: When doing "vim --remote +startinsert file" some commands are
+ inserted as text. (Klaus Bosau)
+Solution: Put all the init commands in one Ex line, not using a <CR>, so
+ that Insert mode isn't started too early.
+Files: src/main.c
+
+Patch 6.2.152
+Problem: The cursor() function doesn't reset the column offset for
+ 'virtualedit'.
+Solution: Reset the offset to zero. (Helmut Stiegler)
+Files: src/eval.c
+
+Patch 6.2.153
+Problem: Win32: ":lang german" doesn't use German messages.
+Solution: Add a table to translate the Win32 language names to two-letter
+ language codes.
+Files: src/ex_cmds2.c
+
+Patch 6.2.154
+Problem: Python bails out when giving a warning message. (Eugene
+ Minkovskii)
+Solution: Set sys.argv[] to an empty string.
+Files: src/if_python.c
+
+Patch 6.2.155
+Problem: Win32: Using ":tjump www" in a help file gives two results.
+ (Dave Roberts)
+Solution: Ignore differences between slashes and backslashes when checking
+ for identical tag matches.
+Files: src/tag.c
+
+Patch 6.2.156 (after 6.2.125)
+Problem: Win32: Netbeans fails to build, EINTR is not defined.
+Solution: Redefine EINTR to WSAEINTR. (Mike Williams)
+Files: src/netbeans.c
+
+Patch 6.2.157
+Problem: Using "%p" in 'errorformat' gives a column number that is too
+ high.
+Solution: Set the flag to use the number as a virtual column. (Lefteris
+ Koutsoloukas)
+Files: src/quickfix.c
+
+Patch 6.2.158
+Problem: The sed command on Solaris and HPUX doesn't work for a line that
+ doesn't end in a newline.
+Solution: Add a newline when feeding text to sed. (Mark Waggoner)
+Files: src/configure.in, src/auto/configure
+
+Patch 6.2.159
+Problem: When using expression folding and 'foldopen' is "undo" an undo
+ command doesn't always open the fold.
+Solution: Save and restore the KeyTyped variable when evaluating 'foldexpr'.
+ (Taro Muraoka)
+Files: src/fold.c
+
+Patch 6.2.160
+Problem: When 'virtualedit' is "all" and 'selection' is "exclusive",
+ selecting a double-width character below a single-width character
+ may cause a crash.
+Solution: Avoid overflow on unsigned integer decrement. (Taro Muraoka)
+Files: src/normal.c
+
+Patch 6.2.161 (extra)
+Problem: VMS: Missing header file. Reading input busy loops.
+Solution: Include termdef.h. Avoid the use of a wait function in
+ vms_read(). (Frank Ries)
+Files: src/os_unix.h, src/os_vms.c
+
+Patch 6.2.162
+Problem: ":redraw" doesn't always display the text that includes the cursor
+ position, e.g. after ":call cursor(1, 0)". (Eugene Minkovskii)
+Solution: Call update_topline() before redrawing.
+Files: src/ex_docmd.c
+
+Patch 6.2.163
+Problem: "make install" may also copy AAPDIR directories.
+Solution: Delete AAPDIR directories, just like CVS directories.
+Files: src/Makefile
+
+Patch 6.2.164 (after 6.2.144)
+Problem: When "g:html_use_css" is set the HTML header generated by the
+ 2html script is still wrong.
+Solution: Search for a string instead of jumping to a fixed line number.
+ Go to the start of the line before inserting the header.
+ (Jess Thrysoee)
+Files: runtime/syntax/2html.vim
+
+Patch 6.2.165
+Problem: The configure checks hang when using autoconf 2.57.
+Solution: Invoke AC_PROGRAM_EGREP to set $EGREP. (Aron Griffis)
+Files: src/auto/configure, src/configure.in
+
+Patch 6.2.166
+Problem: When $GZIP contains "-N" editing compressed files doesn't work
+ properly.
+Solution: Add "-n" to "gzip -d" to avoid restoring the file name. (Oyvind
+ Holm)
+Files: runtime/plugin/gzip.vim
+
+Patch 6.2.167
+Problem: The Python interface leaks memory when assigning lines to a
+ buffer. (Sergey Khorev)
+Solution: Do not copy the line when calling ml_replace().
+Files: src/if_python.c
+
+Patch 6.2.168
+Problem: Python interface: There is no way to get the indices from a range
+ object.
+Solution: Add the "start" and "end" attributes. (Maurice S. Barnum)
+Files: src/if_python.c, runtime/doc/if_pyth.txt
+
+Patch 6.2.169
+Problem: The prototype for _Xmblen() appears in a recent XFree86 header
+ file, causing a warning for our prototype. (Hisashi T Fujinaka)
+Solution: Move the prototype to an osdef file, so that it's filtered out.
+Files: src/mbyte.c, src/osdef2.h.in
+
+Patch 6.2.170
+Problem: When using Sun WorkShop the current directory isn't changed to
+ where the file is.
+Solution: Set the 'autochdir' option when using WorkShop. And avoid using
+ the basename when 'autochdir' is not set.
+Files: src/gui_x11.c, src/ex_cmds.c
+
+Patch 6.2.171 (after 6.2.163)
+Problem: The "-or" argument of "find" doesn't work for SysV systems.
+Solution: Use "-o" instead. (Gordon Prieur)
+Files: src/Makefile
+
+Patch 6.2.172 (after 6.2.169)
+Problem: The prototype for _Xmblen() still causes trouble.
+Solution: Include the X11 header file that defines the prototype.
+Files: src/osdef2.h.in, src/osdef.sh
+
+Patch 6.2.173 (extra)
+Problem: Win32: Ruby interface doesn't work with Ruby 1.8.0 for other
+ compilers than MSVC.
+Solution: Fix the BC5, Cygwin and Mingw makefiles. (Dan Sharp)
+Files: src/Make_bc5.mak, src/Make_cyg.mak, src/Make_ming.mak
+
+Patch 6.2.174
+Problem: After the ":intro" message only a mouse click in the last line
+ gets past the hit-return prompt.
+Solution: Accept a click at or below the hit-return prompt.
+Files: src/gui.c, src/message.c
+
+Patch 6.2.175
+Problem: Changing 'backupext' in a *WritePre autocommand doesn't work.
+ (William Natter)
+Solution: Move the use of p_bex to after executing the *WritePre
+ autocommands. Also avoids reading allocated memory after freeing.
+Files: src/fileio.c
+
+Patch 6.2.176
+Problem: Accented characters in translated help files are not handled
+ correctly. (Fabien Vayssiere)
+Solution: Include "192-255" in 'iskeyword' for the help window.
+Files: src/ex_cmds.c
+
+Patch 6.2.177 (extra)
+Problem: VisVim: Opening a file with a space in the name doesn't work. (Rob
+ Retter) Arbitrary commands are being executed. (Neil Bird)
+Solution: Put a backslash in front of every space in the file name.
+ (Gerard Blais) Terminate the CTRL-\ CTRL-N command with a NUL.
+Files: src/VisVim/Commands.cpp, src/VisVim/VisVim.rc
+
+Patch 6.2.178
+Problem: People who don't know how to exit Vim try pressing CTRL-C.
+Solution: Give a message how to exit Vim when CTRL-C is pressed and it
+ doesn't cancel anything.
+Files: src/normal.c
+
+Patch 6.2.179 (extra)
+Problem: The en_gb messages file isn't found on case sensitive systems.
+Solution: Rename en_gb to en_GB. (Mike Williams)
+Files: src/po/en_gb.po, src/po/en_GB.po, src/po/Make_ming.mak,
+ src/po/Make_mvc.mak, src/po/Makefile, src/po/README_mvc.txt
+
+Patch 6.2.180
+Problem: Compiling with GTK2 on Win32 doesn't work.
+Solution: Include gdkwin32.h instead of gdkx.h. (Srinath Avadhanula)
+Files: src/gui_gtk.c, src/gui_gtk_f.c, src/gui_gtk_x11.c, src/mbyte.c
+
+Patch 6.2.181 (after 6.2.171)
+Problem: The "-o" argument of "find" has lower priority than the implied
+ "and" with "-print".
+Solution: Add parenthesis around the "-o" expression. (Gordon Prieur)
+Files: src/Makefile
+
+Patch 6.2.182 (after 6.2.094)
+Problem: Compilation with tiny features fails because of missing
+ get_past_head() function.
+Solution: Adjust the #ifdef for get_past_head().
+Files: src/misc1.c
+
+Patch 6.2.183 (after 6.2.178)
+Problem: Warning for char/unsigned char mixup.
+Solution: Use MSG() instead of msg(). (Tony Leneis)
+Files: src/normal.c
+
+Patch 6.2.184
+Problem: With 'formatoptions' set to "1aw" inserting text may cause the
+ paragraph to be ended. (Alan Schmitt)
+Solution: Temporarily add an extra space to make the paragraph continue
+ after moving the word after the cursor to the next line.
+ Also format when pressing Esc.
+Files: src/edit.c, src/normal.c, src/proto/edit.pro
+
+Patch 6.2.185
+Problem: Restoring a session with zero-height windows does not work
+ properly. (Charles Campbell)
+Solution: Accept a zero argument to ":resize" as intended. Add a window
+ number argument to ":resize" to be able to set the size of other
+ windows, because the current window cannot be zero-height.
+ Fix the explorer plugin to avoid changing the window sizes. Add
+ the winrestcmd() function for this.
+Files: runtime/doc/eval.txt, runtime/plugin/explorer.vim, src/eval.c,
+ src/ex_cmds.h, src/ex_docmd.c, src/proto/window.pro, src/window.c
+
+Patch 6.2.186 (after 6.2.185)
+Problem: Documentation file eval.txt contains examples without indent.
+Solution: Insert the indent. Also fix other mistakes.
+Files: runtime/doc/eval.txt
+
+Patch 6.2.187
+Problem: Using Insure++ reveals a number of bugs. (Dominique Pelle)
+Solution: Initialize variables where needed. Free allocated memory to avoid
+ leaks. Fix comparing tags to avoid reading past allocated memory.
+Files: src/buffer.c, src/diff.c, src/fileio.c, src/mark.c, src/misc1.c,
+ src/misc2.c, src/ops.c, src/option.c, src/tag.c, src/ui.c
+
+Patch 6.2.188 (extra)
+Problem: MS-Windows: Multi-byte characters in a filename cause trouble for
+ the window title.
+Solution: Return when the wide function for setting the title did its work.
+Files: src/gui_w48.c
+
+Patch 6.2.189
+Problem: When setting 'viminfo' after editing a new buffer its marks are
+ not stored. (Keith Roberts)
+Solution: Set the "b_marks_read" flag when skipping to read marks from the
+ viminfo file.
+Files: src/fileio.c
+
+Patch 6.2.190
+Problem: When editing a compressed files, marks are lost.
+Solution: Add the ":lockmarks" modifier and use it in the gzip plugin.
+ Make exists() also check for command modifiers, so that the
+ existence of ":lockmarks" can be checked for.
+ Also add ":keepmarks" to avoid that marks are deleted when
+ filtering text.
+ When deleting lines put marks 'A - 'Z and '0 - '9 at the first
+ deleted line instead of clearing the mark. They were kept in the
+ viminfo file anyway.
+ Avoid that the gzip plugin puts deleted text in registers.
+Files: runtime/doc/motion.txt, runtime/plugin/gzip.vim, src/ex_cmds.c,
+ src/ex_docmd.c, src/mark.c, src/structs.h
+
+Patch 6.2.191
+Problem: The intro message is outdated. Information about sponsoring and
+ registering is missing.
+Solution: Show info about sponsoring and registering Vim in the intro
+ message now and then. Add help file about sponsoring.
+Files: runtime/doc/help.txt, runtime/doc/sponsor.txt, runtime/doc/tags,
+ runtime/menu.vim, src/version.c
+
+Patch 6.2.192
+Problem: Using CTRL-T and CTRL-D with "gR" messes up the text. (Jonathan
+ Hankins)
+Solution: Avoid calling change_indent() recursively.
+Files: src/edit.c
+
+Patch 6.2.193
+Problem: When recalling a search pattern from the history from a ":s,a/c,"
+ command the '/' ends the search string. (JC van Winkel)
+Solution: Store the separator character with the history entries. Escape
+ characters when needed, replace the old separator with the new one.
+ Also fixes that recalling a "/" search for a "?" command messes up
+ trailing flags.
+Files: src/eval.c, src/ex_getln.c, src/normal.c, src/proto/ex_getln.pro,
+ src/search.c, src/tag.c
+
+Patch 6.2.194 (after 6.2.068)
+Problem: For NetBeans, instead of writing the file and sending an event
+ about it, tell NetBeans to write the file.
+Solution: Add the "save" command, "netbeansBuffer" command and
+ "buttonRelease" event to the netbeans protocol. Updated the
+ interface to version 2.2. (Gordon Prieur)
+ Also: open a fold when the cursor has been positioned.
+ Also: fix memory leak, free result of nb_quote().
+Files: runtime/doc/netbeans.txt, src/fileio.c, src/netbeans.c,
+ src/normal.c, src/proto/netbeans.pro, src/structs.h
+
+Patch 6.2.195 (after 6.2.190)
+Problem: Compiling fails for missing CPO_REMMARK symbol.
+Solution: Add the patch I forgot to include...
+Files: src/option.h
+
+Patch 6.2.196 (after 6.2.191)
+Problem: Rebuilding the documentation doesn't use the sponsor.txt file.
+Solution: Add sponsor.txt to the Makefile. (Christian J. Robinson)
+Files: runtime/doc/Makefile
+
+Patch 6.2.197
+Problem: It is not possible to force a redraw of status lines. (Gary
+ Johnson)
+Solution: Add the ":redrawstatus" command.
+Files: runtime/doc/various.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/screen.c
+
+Patch 6.2.198
+Problem: A few messages are not translated. (Ernest Adrogue)
+Solution: Mark the messages to be translated.
+Files: src/ex_cmds.c
+
+Patch 6.2.199 (after 6.2.194)
+Problem: Vim doesn't work perfectly well with NetBeans.
+Solution: When NetBeans saves the file, reset the timestamp to avoid "file
+ changed" warnings. Close a buffer in a proper way. Don't try
+ giving a debug message with an invalid pointer. Send a
+ newDotAndMark message when needed. Report a change by the "r"
+ command to NetBeans. (Gordon Prieur)
+Files: src/netbeans.c, src/normal.c
+
+Patch 6.2.200
+Problem: When recovering a file, 'fileformat' is always the default, thus
+ writing the file may result in differences. (Penelope Fudd)
+Solution: Before recovering the file try reading the original file to obtain
+ the values of 'fileformat', 'fileencoding', etc.
+Files: src/memline.c
+
+Patch 6.2.201
+Problem: When 'autowriteall' is set ":qall" still refuses to exit if there
+ is a modified buffer. (Antoine Mechelynck)
+Solution: Attempt writing modified buffers as intended.
+Files: src/ex_cmds2.c
+
+Patch 6.2.202
+Problem: Filetype names of CHILL and ch script are confusing.
+Solution: Rename "ch" to "chill" and "chscript" to "ch".
+Files: runtime/filetype.vim, runtime/makemenu.vim, runtime/synmenu.vim
+ runtime/syntax/ch.vim, runtime/syntax/chill.vim
+
+Patch 6.2.203
+Problem: With characterwise text that has more than one line, "3P" works
+ wrong. "3p" has the same problem. There also is a display
+ problem. (Daniel Goujot)
+Solution: Perform characterwise puts with a count in the right position.
+Files: src/ops.c
+
+Patch 6.2.204 (after 6.2.086)
+Problem: "]]" in a file with closed folds moves to the end of the file.
+ (Nam SungHyun)
+Solution: Find one position in each closed fold, then move to after the fold.
+Files: src/search.c
+
+Patch 6.2.205 (extra)
+Problem: MS-Windows: When the taskbar is at the left or top of the screen,
+ the Vim window placement is wrong.
+Solution: Compute the size and position of the window correctly. (Taro
+ Muraoka)
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 6.2.206
+Problem: Multi-byte characters cannot be used as hotkeys in a console
+ dialog. (Mattias Erkisson)
+Solution: Handle multibyte characters properly. Also put () or [] around
+ default hotkeys.
+Files: src/message.c, src/macros.h
+
+Patch 6.2.207
+Problem: When 'encoding' is a multibyte encoding, expanding an
+ abbreviation that starts where insertion started results in
+ characters before the insertion to be deleted. (Xiangjiang Ma)
+Solution: Stop searching leftwards for the start of the word at the position
+ where insertion started.
+Files: src/getchar.c
+
+Patch 6.2.208
+Problem: When using fold markers, three lines in a row have the start
+ marker and deleting the first one with "dd", a nested fold is not
+ deleted. (Kamil Burzynski)
+ Using marker folding, a level 1 fold doesn't stop when it is
+ followed by "{{{2", starting a level 2 fold.
+Solution: Don't stop updating folds at the end of a change when the nesting
+ level of folds is larger than the fold level.
+ Correctly compute the number of folds that start at "{{{2".
+ Also avoid a crash for a NULL pointer.
+Files: src/fold.c
+
+Patch 6.2.209
+Problem: A bogus fold is created when using "P" while the cursor is in the
+ middle of a closed fold. (Kamil Burzynski)
+Solution: Correct the line number where marks are modified for closed folds.
+Files: src/ops.c
+
+Patch 6.2.210 (extra)
+Problem: Mac OSX: antialiased fonts are not supported.
+Solution: Add the 'antialias' option to switch on antialiasing on Mac OSX
+ 10.2 and later. (Peter Cucka)
+Files: runtime/doc/options.txt, src/gui_mac.c, src/option.h, src/option.c
+
+Patch 6.2.211 (extra)
+Problem: Code for handling file dropped on Vim is duplicated.
+Solution: Move the common code to gui_handle_drop().
+ Add code to drop the files in the window under the cursor.
+ Support drag&drop on the Macintosh. (Taro Muraoka)
+ When dropping a directory name edit that directory (using the
+ explorer plugin)
+ Fix that changing directory with Shift pressed didn't work for
+ relative path names.
+Files: src/fileio.c, src/gui.c, src/gui_gtk_x11.c, src/gui_mac.c,
+ src/gui_w48.c, src/proto/fileio.pro, src/proto/gui.pro
+
+Patch 6.2.212 (after 6.2.199)
+Problem: NetBeans: Replacing with a count is not handled correctly.
+Solution: Move reporting the change outside of the loop for the count.
+ (Gordon Prieur)
+Files: src/normal.c
+
+Patch 6.2.213 (after 6.2.208)
+Problem: Using marker folding, "{{{1" doesn't start a new fold when already
+ at fold level 1. (Servatius Brandt)
+Solution: Correctly compute the number of folds that start at "{{{1".
+Files: src/fold.c
+
+Patch 6.2.214 (after 6.2.211) (extra)
+Problem: Warning for an unused variable.
+Solution: Delete the declaration. (Bill McCarthy)
+Files: src/gui_w48.c
+
+Patch 6.2.215
+Problem: NetBeans: problems saving an unmodified file.
+Solution: Add isNetbeansModified() function. Disable netbeans_unmodified().
+ (Gordon Prieur)
+Files: src/fileio.c, src/netbeans.c, src/proto/netbeans.pro,
+ runtime/doc/netbeans.txt, runtime/doc/tags
+
+Patch 6.2.216 (after 6.2.206)
+Problem: Multi-byte characters still cannot be used as hotkeys in a console
+ dialog. (Mattias Erkisson)
+Solution: Make get_keystroke() handle multibyte characters.
+Files: src/misc1.c
+
+Patch 6.2.217
+Problem: GTK: setting the title doesn't always work correctly.
+Solution: Invoke gui_mch_settitle(). (Tomas Stehlik)
+Files: src/os_unix.c
+
+Patch 6.2.218
+Problem: Warning for function without prototype.
+Solution: Add argument types to the msgCB field of the BalloonEval struct.
+Files: src/gui_beval.h
+
+Patch 6.2.219
+Problem: Syntax highlighting hangs on an empty match of an item with a
+ nextgroup. (Charles Campbell)
+Solution: Remember that the item has already matched and don't match it
+ again at the same position.
+Files: src/syntax.c
+
+Patch 6.2.220
+Problem: When a Vim server runs in a console a remote command isn't handled
+ before a key is typed. (Joshua Neuheisel)
+Solution: Don't try reading more input when a client-server command has been
+ received.
+Files: src/os_unix.c
+
+Patch 6.2.221
+Problem: No file name completion for ":cscope add".
+Solution: Add the XFILE flag to ":cscope". (Gary Johnson)
+Files: src/ex_cmds.h
+
+Patch 6.2.222
+Problem: Using "--remote" several times on a row only opens some of the
+ files. (Dany St-Amant)
+Solution: Don't delete all typeahead when the server receives a command from
+ a client, only delete typed characters.
+Files: src/main.c
+
+Patch 6.2.223
+Problem: Cscope: Avoid a hang when cscope waits for a response while Vim
+ waits for a prompt.
+ Error messages from Cscope mess up the display.
+Solution: Detect the hit-enter message and respond by sending a return
+ character to cscope. (Gary Johnson)
+ Use EMSG() and strerror() when possible. Replace perror() with
+ PERROR() everywhere, add emsg3().
+Files: src/diff.c, src/if_cscope.c, src/integration.c, src/message.c,
+ src/proto/message.pro, src/misc2.c, src/netbeans.c, src/vim.h
+
+Patch 6.2.224
+Problem: Mac: Can't compile with small features. (Axel Kielhorn)
+Solution: Also include vim_chdirfile() when compiling for the Mac.
+Files: src/misc2.c
+
+Patch 6.2.225
+Problem: NetBeans: Reported modified state isn't exactly right.
+Solution: Report a file being modified in the NetBeans way.
+Files: src/netbeans.c
+
+Patch 6.2.226 (after 6.2.107) (extra)
+Problem: The "ws2-32.lib" file isn't always available.
+Solution: Use "WSock32.lib" instead. (Taro Muraoka, Dan Sharp)
+Files: src/Make_cyg.mak, src/Make_ming.mak, src/Make_mvc.mak
+
+Patch 6.2.227 (extra)
+Problem: The "PC" symbol is defined but not used anywhere.
+Solution: Remove "-DPC" from the makefiles.
+Files: src/Make_bc3.mak, src/Make_bc5.mak, src/Make_cyg.mak,
+ src/Make_ming.mak
+
+Patch 6.2.228
+Problem: Receiving CTRL-\ CTRL-N after typing "f" or "m" doesn't switch Vim
+ back to Normal mode. Same for CTRL-\ CTRL-G.
+Solution: Check if the character typed after a command is CTRL-\ and obtain
+ another character to check for CTRL-N or CTRL-G, waiting up to
+ 'ttimeoutlen' msec.
+Files: src/normal.c
+
+Patch 6.2.229
+Problem: ":function" with a name that uses magic curlies does not work
+ inside a function. (Servatius Brandt)
+Solution: Skip over the function name properly.
+Files: src/eval.c
+
+Patch 6.2.230 (extra)
+Problem: Win32: a complex pattern may cause a crash.
+Solution: Use __try and __except to catch the exception and handle it
+ gracefully, when possible. Add myresetstkoflw() to reset the
+ stack overflow. (Benjamin Peterson)
+Files: src/Make_bc5.mak, src/os_mswin.c src/os_win32.c, src/os_win32.h,
+ src/proto/os_win32.pro, src/regexp.c
+
+Patch 6.2.231 (after 6.2.046)
+Problem: Various problems when an error exception is raised from within a
+ builtin function. When it is invoked while evaluating arguments
+ to a function following arguments are still evaluated. When
+ invoked with a line range it will be called for remaining lines.
+Solution: Update "force_abort" also after calling a builtin function, so
+ that aborting() always returns the correct value. (Servatius
+ Brandt)
+Files: src/eval.c, src/ex_eval.c, src/proto/ex_eval.pro,
+ src/testdir/test49.ok, src/testdir/test49.vim
+
+Patch 6.2.232
+Problem: ":python vim.command('python print 2*2')" crashes Vim. (Eugene
+ Minkovskii)
+Solution: Disallow executing a Python command recursively and give an error
+ message.
+Files: src/if_python.c
+
+Patch 6.2.233
+Problem: On Mac OSX adding -pthread for Python only generates a warning.
+ The test for Perl threads rejects Perl while it's OK.
+ Tcl doesn't work at all.
+ The test for Ruby fails if ruby exists but there are no header
+ files. The Ruby library isn't detected properly
+Solution: Avoid adding -pthread on Mac OSX. Accept Perl threads when it's
+ not the 5.5 threads.
+ Use the Tcl framework for header files. For Ruby rename cWindow
+ to cVimWindow to avoid a name clash. (Ken Scott)
+ Only enable Ruby when the header files can be found. Use "-lruby"
+ instead of "libruby.a" when it can't be found.
+Files: src/auto/configure, src/configure.in, src/if_ruby.c
+
+Patch 6.2.234
+Problem: GTK 2 GUI: ":sp" and the ":q" leaves the cursor on the command
+ line.
+Solution: Flush output before removing scrollbars. Also do this in other
+ places where gui_mch_*() functions are invoked.
+Files: src/ex_cmds.c, src/option.c, src/window.c
+
+Patch 6.2.235 (extra)
+Problem: Win32: Cursor isn't removed with a 25x80 window and doing:
+ "1830ia<Esc>400a-<Esc>0w0". (Yasuhiro Matsumoto)
+Solution: Remove the call to gui_undraw_cursor() from gui_mch_insert_lines().
+Files: src/gui_w48.c
+
+Patch 6.2.236
+Problem: Using gvim with Agide gives "connection lost" error messages.
+Solution: Only give the "connection lost" message when the buffer was once
+ owned by NetBeans.
+Files: src/netbeans.c, src/structs.h
+
+Patch 6.2.237
+Problem: GTK 2: Thai text is drawn wrong. It changes when moving the
+ cursor over it.
+Solution: Disable the shaping engine, it moves combining characters to a
+ wrong position and combines characters, while drawing the cursor
+ doesn't combine characters.
+Files: src/gui_gtk_x11.c
+
+Patch 6.2.238 (after 6.2.231)
+Problem: ":function" does not work inside a while loop. (Servatius Brandt)
+Solution: Add get_while_line() and pass it to do_one_cmd() when in a while
+ loop, so that all lines are stored and can be used again when
+ repeating the loop.
+ Adjust test 49 so that it checks for the fixed problems.
+ (Servatius Brandt)
+Files: src/digraph.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c,
+ src/proto/ex_cmds2.pro, src/proto/ex_docmd.pro,
+ src/testdir/test49.in, src/testdir/test49.ok,
+ src/testdir/test49.vim
+
+Patch 6.2.239
+Problem: GTK 2: With closed folds the arrow buttons of a vertical scrollbar
+ often doesn't scroll. (Moshe Kaminsky)
+Solution: Hackish solution: Detect that the button was pressed from the
+ mouse pointer position.
+Files: src/gui_gtk.c, src/gui.c
+
+Patch 6.2.240
+Problem: GTK 2: Searching for bitmaps for the toolbar doesn't work as with
+ other systems. Need to explicitly use "icon=name". (Ned Konz,
+ Christian J. Robinson)
+Solution: Search for icons like done for Motif.
+Files: src/gui_gtk.c
+
+Patch 6.2.241
+Problem: GTK 2: Search and Search/Replace dialogs are synced, that makes no
+ sense. Buttons are sometimes greyed-out. (Jeremy Messenger)
+Solution: Remove the code to sync the two dialogs. Adjust the code to react
+ to an empty search string to also work for GTK2. (David Necas)
+Files: src/gui_gtk.c
+
+Patch 6.2.242
+Problem: Gnome: "vim --help" only shows the Gnome arguments, not the Vim
+ arguments.
+Solution: Don't let the Gnome code remove the "--help" argument and don't
+ exit at the end of usage().
+Files: src/gui_gtk_x11.c, src/main.c
+
+Patch 6.2.243 (extra)
+Problem: Mac: Dropping a file on a Vim icon causes a hit-enter prompt.
+Solution: Move the dropped files to the global argument list, instead of the
+ usual drop handling. (Eckehard Berns)
+Files: src/main.c, src/gui_mac.c
+
+Patch 6.2.244
+Problem: ':echo "\xf7"' displays the illegal byte as if it was a character
+ and leaves "cho" after it.
+Solution: When checking the length of a UTF-8 byte sequence and it's shorter
+ than the number of bytes available, assume it's an illegal byte.
+Files: src/mbyte.c
+
+Patch 6.2.245
+Problem: Completion doesn't work for ":keepmarks" and ":lockmarks".
+Solution: Add the command modifiers to the table of commands. (Madoka
+ Machitani)
+Files: src/ex_cmds.h, src/ex_docmd.c
+
+Patch 6.2.246
+Problem: Mac: Starting Vim from Finder doesn't show error messages.
+Solution: Recognize that output is being displayed by stderr being
+ "/dev/console". (Eckehard Berns)
+Files: src/main.c, src/message.c
+
+Patch 6.2.247 (after 6.2.193)
+Problem: When using a search pattern from the viminfo file the last
+ character is replaced with a '/'.
+Solution: Store the separator character in the right place. (Kelvin Lee)
+Files: src/ex_getln.c
+
+Patch 6.2.248
+Problem: GTK: When XIM is enabled normal "2" and keypad "2" cannot be
+ distinguished.
+Solution: Detect that XIM changes the keypad key to the expected ASCII
+ character and fall back to the non-XIM code. (Neil Bird)
+Files: src/gui_gtk_x11.c, src/mbyte.c, src/proto/mbyte.pro
+
+Patch 6.2.249
+Problem: ":cnext" moves to the error in the next file, but there is no
+ method to go back.
+Solution: Add ":cpfile" and ":cNfile".
+Files: src/ex_cmds.h, src/quickfix.c, src/vim.h, runtime/doc/quickfix.txt
+
+Patch 6.2.250
+Problem: Memory leaks when using signs. (Xavier de Gaye)
+Solution: Delete the list of signs when unloading a buffer.
+Files: src/buffer.c
+
+Patch 6.2.251
+Problem: GTK: The 'v' flag in 'guioptions' doesn't work. (Steve Hall)
+ Order of buttons is reversed for GTK 2.2.4. Don't always get
+ focus back after handling a dialog.
+Solution: Make buttons appear vertically when desired. Reverse the order in
+ which buttons are added to a dialog. Move mouse pointer around
+ when the dialog is done and we don't have focus.
+Files: src/gui_gtk.c
+
+Patch 6.2.252 (extra, after 6.2.243)
+Problem: Mac: Dropping a file on a Vim icon causes a hit-enter prompt for
+ Mac OS classic.
+Solution: Remove the #ifdef from the code that fixes it for Mac OSX.
+Files: src/gui_mac.c
+
+Patch 6.2.253
+Problem: When 'tagstack' is not set a ":tag id" command does not work after
+ a ":tjump" command.
+Solution: Set "new_tag" when 'tagstack' isn't set. (G. Narendran)
+Files: src/tag.c
+
+Patch 6.2.254
+Problem: May run out of space for error messages.
+Solution: Keep room for two more bytes.
+Files: src/quickfix.c
+
+Patch 6.2.255
+Problem: GTK: A new item in the popup menu is put just after instead of
+ just before the right item. (Gabriel Zachmann)
+Solution: Don't increment the menu item index.
+Files: src/gui_gtk.c
+
+Patch 6.2.256
+Problem: Mac: "macroman" encoding isn't recognized, need to use
+ "8bit-macroman".
+Solution: Recognize "macroman" with an alias "mac". (Eckehard Berns)
+Files: src/mbyte.c
+
+Patch 6.2.257 (after 6.2.250)
+Problem: Signs are deleted for ":bdel", but they could still be useful.
+Solution: Delete signs only for ":bwipe".
+Files: src/buffer.c
+
+Patch 6.2.258
+Problem: GUI: can't disable (grey-out) a popup menu item. (Ajit Thakkar)
+Solution: Loop over the popup menus for all modes.
+Files: src/menu.c
+
+Patch 6.2.259
+Problem: If there are messages when exiting, on the console there is a
+ hit-enter prompt while the message can be read; in the GUI the
+ message may not be visible.
+Solution: Use the hit-enter prompt when there is an error message from
+ writing the viminfo file or autocommands, or when there is any
+ output in the GUI and 'verbose' is set. Don't use a hit-enter
+ prompt for the non-GUI version unless there is an error message.
+Files: src/main.c
+
+Patch 6.2.260
+Problem: GTK 2: Can't quit a dialog with <Esc>.
+ GTK 1 and 2: <Enter> always gives a result, even when the default
+ button has been disabled.
+Solution: Handle these keys explicitly. When no default button is specified
+ use the first one (works mostly like it was before).
+Files: src/gui_gtk.c
+
+Patch 6.2.261
+Problem: When 'autoindent' and 'cindent' are set and a line is recognized
+ as a comment, starting a new line won't do 'cindent' formatting.
+Solution: Also use 'cindent' formatting for lines that are used as a
+ comment. (Servatius Brandt)
+Files: src/misc1.c
+
+Patch 6.2.262
+Problem: 1 CTRL-W w beeps, even though going to the first window is
+ possible. (Charles Campbell)
+Solution: Don't beep.
+Files: src/window.c
+
+Patch 6.2.263
+Problem: Lint warnings: Duplicate function prototypes, duplicate macros,
+ use of a zero character instead of a zero pointer, unused
+ variable. Clearing allocated memory in a complicated way.
+Solution: Remove the function prototypes from farsi.h. Remove the
+ duplicated lines in keymap.h. Change getvcol() argument from NUL
+ to NULL. Remove the "col" variable in regmatch(). Use
+ lalloc_clear() instead of lalloc(). (Walter Briscoe)
+Files: src/farsi.h, src/keymap.h, src/ops.c, src/regexp.c, src/search.c
+
+Patch 6.2.264 (after 6.2.247)
+Problem: Writing past allocated memory when using a command line from the
+ viminfo file.
+Solution: Store the NUL in the right place.
+Files: src/ex_getln.c
+
+Patch 6.2.265
+Problem: Although ":set" is not allowed in the sandbox, ":let &opt = val"
+ works.
+Solution: Do allow changing options in the sandbox, but not the ones that
+ can't be changed from a modeline.
+Files: src/ex_cmds.h, src/options.c
+
+Patch 6.2.266
+Problem: When redirecting output and using ":silent", line breaks are
+ missing from output of ":map" and ":tselect". Alignment of
+ columns is wrong.
+Solution: Insert a line break where "msg_didout" was tested. Update msg_col
+ when redirecting and using ":silent".
+Files: src/getchar.c, src/message.c
+
+Patch 6.2.267 (extra)
+Problem: Win32: "&&" in a tearoff menu is not shown. (Luc Hermitte)
+Solution: Use the "name" item from the menu instead of the "dname" item.
+Files: src/gui_w32.c, src/menu.c
+
+Patch 6.2.268
+Problem: GUI: When changing 'guioptions' part of the window may be off
+ screen. (Randall Morris)
+Solution: Adjust the size of the window when changing 'guioptions', but only
+ when adding something.
+Files: src/gui.c
+
+Patch 6.2.269
+Problem: Diff mode does not highlight a change in a combining character.
+ (Raphael Finkel)
+Solution: Make diff_find_change() multibyte aware: find the start byte of
+ a character that contains a change.
+Files: src/diff.c
+
+Patch 6.2.270
+Problem: Completion in Insert mode, then repeating with ".", doesn't handle
+ composing characters in the completed text. (Raphael Finkel)
+Solution: Don't skip over composing chars when adding completed text to the
+ redo buffer.
+Files: src/getchar.c
+
+Patch 6.2.271
+Problem: NetBeans: Can't do "tail -f" on the log. Passing socket info with
+ an argument or environment variable is not secure.
+Solution: Wait after initializing the log. Allow passing the socket info
+ through a file. (Gordon Prieur)
+Files: runtime/doc/netbeans.txt, src/main.c, src/netbeans.c
+
+Patch 6.2.272
+Problem: When the "po" directory exists, but "po/Makefile" doesn't,
+ building fails. Make loops when the "po" directory has been
+ deleted after running configure.
+Solution: Check for the "po/Makefile" instead of just the "po" directory.
+ Check this again before trying to run make with that Makefile.
+Files: src/auto/configure, src/configure.in, src/Makefile
+
+Patch 6.2.273
+Problem: Changing the sort order in an explorer window for an empty
+ directory produces error messages. (Doug Kearns)
+Solution: When an invalid range is used for a function that is not going to
+ be executed, skip over the arguments anyway.
+Files: src/eval.c
+
+Patch 6.2.274
+Problem: ":print" skips empty lines when 'list' is set and there is no
+ "eol" in 'listchars'. (Yakov Lerner)
+Solution: Skip outputting a space for an empty line only when 'list' is set
+ and the end-of-line character is not empty.
+Files: src/message.c
+
+Patch 6.2.275 (extra, after 6.2.267)
+Problem: Warning for uninitialized variable when using gcc.
+Solution: Initialize "acLen" to zero. (Bill McCarthy)
+Files: src/gui_w32.c
+
+Patch 6.2.276
+Problem: ":echo X()" does not put a line break between the message that X()
+ displays and the text that X() returns. (Yakov Lerner)
+Solution: Invoke msg_start() after evaluating the argument.
+Files: src/eval.c
+
+Patch 6.2.277
+Problem: Vim crashes when a ":runtime ftplugin/ada.vim" causes a recursive
+ loop. (Robert Nowotniak)
+Solution: Restore "msg_list" before returning from do_cmdline().
+Files: src/ex_docmd.c
+
+Patch 6.2.278
+Problem: Using "much" instead of "many".
+Solution: Correct the error message.
+Files: src/eval.c
+
+Patch 6.2.279
+Problem: There is no default choice for a confirm() dialog, now that it is
+ possible not to have a default choice.
+Solution: Make the first choice the default choice.
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 6.2.280
+Problem: "do" and ":diffget" don't work in the first line and the last line
+ of a buffer. (Aron Griffis)
+Solution: Find a difference above the first line and below the last line.
+ Also fix a few display updating bugs.
+Files: src/diff.c, src/fold.c, src/move.c
+
+Patch 6.2.281
+Problem: PostScript printing doesn't work on Mac OS X 10.3.2.
+Solution: Adjust the header file. (Mike Williams)
+Files: runtime/print/prolog.ps
+
+Patch 6.2.282
+Problem: When using CTRL-O to go back to a help file, it becomes listed.
+ (Andrew Nesbit)
+ Using ":tag" or ":tjump" in a help file doesn't keep the help file
+ settings (e.g. for 'iskeyword').
+Solution: Don't mark a buffer as listed when its help flag is set. Put all
+ the option settings for a help buffer together in do_ecmd().
+Files: src/ex_cmds.c
+
+Patch 6.2.283
+Problem: The "local additions" in help.txt are used without conversion,
+ causing latin1 characters showing up wrong when 'enc' is utf-8.
+ (Antoine J. Mechelynck)
+Solution: Convert the text to 'encoding'.
+Files: src/ex_cmds.c
+
+Patch 6.2.284
+Problem: Listing a function puts "endfunction" in the message history.
+ Typing "q" at the more prompt isn't handled correctly when listing
+ variables and functions. (Hara Krishna Dara)
+Solution: Don't use msg() for "endfunction". Check "got_int" regularly.
+Files: src/eval.c
+
+Patch 6.2.285
+Problem: GUI: In a single wrapped line that fills the window, "gj" in the
+ last screen line leaves the cursor behind. (Ivan Tarasov)
+Solution: Undraw the cursor before scrolling the text up.
+Files: src/gui.c
+
+Patch 6.2.286
+Problem: When trying to rename a file and it doesn't exist, the destination
+ file is deleted anyway. (Luc Deux)
+Solution: Don't delete the destination when the source doesn't exist. (Taro
+ Muraoka)
+Files: src/fileio.c
+
+Patch 6.2.287 (after 6.2.264)
+Problem: Duplicate lines are added to the viminfo file.
+Solution: Compare with existing entries without an offset. Also fixes
+ reading very long history lines from viminfo.
+Files: src/ex_getln.c
+
+Patch 6.2.288 (extra)
+Problem: Mac: An external program can't be interrupted.
+Solution: Don't use the 'c' key for backspace. (Eckehard Berns)
+Files: src/gui_mac.c
+
+Patch 6.2.289
+Problem: Compiling the Tcl interface with thread support causes ":make" to
+ fail. (Juergen Salk)
+Solution: Use $TCL_DEFS from the Tcl config script to obtain the required
+ compile flags for using the thread library.
+Files: src/auto/configure, src/configure.in
+
+Patch 6.2.290 (extra)
+Problem: Mac: The mousewheel doesn't work.
+Solution: Add mousewheel support. Also fix updating the thumb after a drag
+ and then using another way to scroll. (Eckehard Berns)
+Files: src/gui_mac.c
+
+Patch 6.2.291 (extra)
+Problem: Mac: the plus button and close button don't do anything.
+Solution: Make the plus button maximize the window and the close button
+ close Vim. (Eckehard Berns)
+Files: src/gui.c, src/gui_mac.c
+
+Patch 6.2.292
+Problem: Motif: When removing GUI arguments from argv[] a "ps -ef" shows
+ the last argument repeated.
+Solution: Set argv[argc] to NULL. (Michael Jarvis)
+Files: src/gui_x11.c
+
+Patch 6.2.293 (after 6.2.255)
+Problem: GTK: A new item in a menu is put before the tearoff item.
+Solution: Do increment the menu item index for non-popup menu items.
+Files: src/gui_gtk.c
+
+Patch 6.2.294 (extra)
+Problem: Mac: Cannot use modifiers with Space, Tab, Enter and Escape.
+Solution: Handle all modifiers for these keys. (Eckehard Berns)
+Files: src/gui_mac.c
+
+Patch 6.2.295
+Problem: When in debug mode, receiving a message from a remote client
+ causes a crash. Evaluating an expression causes Vim to wait for
+ "cont" to be typed, without a prompt. (Hari Krishna Dara)
+Solution: Disable debugging when evaluating an expression for a client.
+ (Michael Geddes) Don't try reading into the typeahead buffer when
+ it may have been filled in another way.
+Files: src/ex_getln.c, src/getchar.c, src/if_xcmdsrv.c, src/main.c,
+ src/misc1.c, src/proto/getchar.pro, src/proto/main.pro,
+ src/proto/os_unix.pro, src/proto/ui.pro, src/structs.h,
+ src/os_unix.c, src/ui.c
+
+Patch 6.2.296 (extra)
+Problem: Same as 6.2.295.
+Solution: Extra files for patch 6.2.295.
+Files: src/os_amiga.c, src/os_msdos.c, src/os_riscos.c, src/os_win32.c,
+ src/proto/os_amiga.pro, src/proto/os_msdos.pro,
+ src/proto/os_riscos.pro, src/proto/os_win32.pro
+
+Patch 6.2.297 (after 6.2.232)
+Problem: Cannot invoke Python commands recursively.
+Solution: With Python 2.3 and later use the available mechanisms to invoke
+ Python recursively. (Matthew Mueller)
+Files: src/if_python.c
+
+Patch 6.2.298
+Problem: A change always sets the '. mark and an insert always sets the '^
+ mark, even when this is not wanted.
+ Cannot go back to the position of older changes without undoing
+ those changes.
+Solution: Add the ":keepjumps" command modifier.
+ Add the "g," and "g;" commands.
+Files: runtime/doc/motion.txt, src/ex_cmds.h, src/ex_docmd.c, src/edit.c,
+ src/mark.c, src/misc1.c, src/normal.c, src/proto/mark.pro,
+ src/structs.h, src/undo.c
+
+Patch 6.2.299
+Problem: Can only use one language for help files.
+Solution: Add the 'helplang' option to select the preferred language(s).
+ Make ":helptags" generate tags files for all languages.
+Files: runtime/doc/options.txt, runtime/doc/various.txt, src/Makefile,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_cmds.h, src/ex_getln.c,
+ src/normal.c, src/option.c, src/option.h, src/proto/ex_cmds.pro,
+ src/proto/ex_cmds2.pro, src/proto/option.pro, src/structs.h,
+ src/tag.c, src/vim.h
+
+Patch 6.2.300 (after 6.2.297)
+Problem: Cannot build Python interface with Python 2.2 or earlier.
+Solution: Add a semicolon.
+Files: src/if_python.c
+
+Patch 6.2.301
+Problem: The "select all" item from the popup menu doesn't work for Select
+ mode.
+Solution: Use the same commands as for the "Edit.select all" menu.
+ (Benji Fisher)
+Files: runtime/menu.vim
+
+Patch 6.2.302
+Problem: Using "CTRL-O ." in Insert mode doesn't work properly. (Benji
+ Fisher)
+Solution: Restore "restart_edit" after an insert command that was not typed.
+ Avoid waiting with displaying the mode when there is no text to be
+ overwritten.
+ Fix that "CTRL-O ." sometimes doesn't put the cursor back after
+ the end-of-line. Only reset the flag that CTRL-O was used past
+ the end of the line when restarting editing. Update "o_lnum"
+ number when inserting text and "o_eol" is set.
+Files: src/edit.c, src/normal.c
+
+Patch 6.2.303
+Problem: Cannot use Unicode digraphs while 'encoding' is not Unicode.
+Solution: Convert the character from Unicode to 'encoding' when needed.
+ Use the Unicode digraphs for the Macintosh. (Eckehard Berns)
+Files: src/digraph.c
+
+Patch 6.2.304 (extra, after 6.2.256)
+Problem: Mac: No proper support for 'encoding'. Conversion without iconv()
+ is not possible.
+Solution: Convert input from 'termencoding' to 'encoding'. Add
+ mac_string_convert(). Convert text for the clipboard when needed.
+ (Eckehard Berns)
+Files: src/gui_mac.c, src/mbyte.c, src/structs.h, src/vim.h
+
+Patch 6.2.305 (after 6.2.300)
+Problem: Win32: Cannot build Python interface with Python 2.3. (Ajit
+ Thakkar)
+Solution: Add two functions to the dynamic loading feature.
+Files: src/if_python.c
+
+Patch 6.2.306 (extra)
+Problem: Win32: Building console version with BCC 5.5 gives a warning for
+ get_cmd_args() prototype missing. (Ajit Thakkar)
+Solution: Don't build os_w32exe.c for the console version.
+Files: src/Make_bc5.mak
+
+Patch 6.2.307 (after 6.2.299)
+Problem: Installing help files fails.
+Solution: Expand wildcards for translated help files separately.
+Files: src/Makefile
+
+Patch 6.2.308
+Problem: Not all systems have "whoami", resulting in an empty user name.
+Solution: Use "logname" when possible, "whoami" otherwise. (David Boyce)
+Files: src/Makefile
+
+Patch 6.2.309
+Problem: "3grx" waits for two ESC to be typed. (Jens Paulus)
+Solution: Append the ESC to the stuff buffer when redoing the "gr" insert.
+Files: src/edit.c
+
+Patch 6.2.310
+Problem: When setting 'undolevels' to -1, making a change and setting
+ 'undolevels' to a positive value an "undo list corrupt" error
+ occurs. (Madoka Machitani)
+Solution: Sync undo before changing 'undolevels'.
+Files: src/option.c
+
+Patch 6.2.311 (after 6.2.298)
+Problem: When making several changes in one line the changelist grows
+ quickly. There is no error message for reaching the end of the
+ changelist. Reading changelist marks from viminfo doesn't work
+ properly.
+Solution: Only make a new entry in the changelist when making a change in
+ another line or 'textwidth' columns away. Add E662, E663 and E664
+ error messages. Put a changelist mark from viminfo one position
+ before the end.
+Files: runtime/doc/motion.txt, src/mark.c, src/misc1.c, src/normal.c
+
+Patch 6.2.312 (after 6.2.299)
+Problem: "make install" clears the screen when installing the docs.
+Solution: Execute ":helptags" in silent mode.
+Files: runtime/doc/Makefile
+
+Patch 6.2.313
+Problem: When opening folds in a diff window, other diff windows no longer
+ show the same text.
+Solution: Sync the folds in diff windows.
+Files: src/diff.c, src/fold.c, src/move.c, src/proto/diff.pro,
+ src/proto/move.pro
+
+Patch 6.2.314
+Problem: When 'virtualedit' is set "rx" may cause a crash with a blockwise
+ selection and using "$". (Moritz Orbach)
+Solution: Don't try replacing chars in a line that has no characters in the
+ block.
+Files: src/ops.c
+
+Patch 6.2.315
+Problem: Using CTRL-C in a Visual mode mapping while 'insertmode' is set
+ stops Vim from returning to Insert mode.
+Solution: Don't reset "restart_edit" when a CTRL-C is found and 'insertmode'
+ is set.
+Files: src/normal.c
+
+Patch 6.2.316 (after 6.2.312)
+Problem: "make install" tries connecting to the X server when installing
+ the docs. (Stephen Thomas)
+Solution: Add the "-X" argument.
+Files: runtime/doc/Makefile
+
+Patch 6.2.317 (after 6.2.313)
+Problem: When using "zi" in a diff window, other diff windows are not
+ adjusted. (Richard Curnow)
+Solution: Distribute a change in 'foldenable' to other diff windows.
+Files: src/normal.c
+
+Patch 6.2.318
+Problem: When compiling with _THREAD_SAFE external commands don't echo
+ typed characters.
+Solution: Don't set the terminal mode to TMODE_SLEEP when it's already at
+ TMODE_COOK.
+Files: src/os_unix.c
+
+Patch 6.2.319 (extra)
+Problem: Building gvimext.dll with Mingw doesn't work properly.
+Solution: Use gcc instead of dllwrap. Use long option names. (Alejandro
+ Lopez-Valencia)
+Files: src/GvimExt/Make_ming.mak
+
+Patch 6.2.320
+Problem: Win32: Adding and removing the menubar resizes the Vim window.
+ (Jonathon Merz)
+Solution: Don't let a resize event change 'lines' unexpectedly.
+Files: src/gui.c
+
+Patch 6.2.321
+Problem: When using modeless selection, wrapping lines are not recognized,
+ a line break is always inserted.
+Solution: Add LineWraps[] to remember whether a line wrapped or not.
+Files: src/globals.h, src/screen.c, src/ui.c
+
+Patch 6.2.322
+Problem: With 'showcmd' set, after typing "dd" the next "d" may not be
+ displayed. (Jens Paulus)
+Solution: Redraw the command line after updating the screen, scrolling may
+ have set "clear_cmdline".
+Files: src/screen.c
+
+Patch 6.2.323
+Problem: Win32: expanding "~/file" in an autocommand pattern results in
+ backslashes, while this pattern should only have forward slashes.
+Solution: Make expanding environment variables respect 'shellslash' and set
+ p_ssl when expanding the autocommand pattern.
+Files: src/fileio.c, src/misc1.c, src/proto/fileio.pro
+
+Patch 6.2.324 (extra)
+Problem: Win32: when "vimrun.exe" has a path with white space, such as
+ "Program Files", executing external commands may fail.
+Solution: Put double quotes around the path to "vimrun".
+Files: src/os_win32.c
+
+Patch 6.2.325
+Problem: When $HOME includes a space, doing ":set tags=~/tags" doesn't
+ work, the space is used to separate file names. (Brett Stahlman)
+Solution: Escape the space with a backslash.
+Files: src/option.c
+
+Patch 6.2.326
+Problem: ":windo set syntax=foo" doesn't work. (Tim Chase)
+Solution: Don't change 'eventignore' for ":windo".
+Files: src/ex_cmds2.c
+
+Patch 6.2.327
+Problem: When formatting text all marks in the formatted lines are lost.
+ A word is not joined to a previous line when this would be
+ possible. (Mikolaj Machowski)
+Solution: Try to keep marks in the same position as much as possible.
+ Also keep mark positions when joining lines.
+ Start auto-formatting in the previous line when appropriate.
+ Add the "gw" operator: Like "gq" but keep the cursor where it is.
+Files: runtime/doc/change.txt, src/edit.c, src/globals.h, src/mark.c,
+ src/misc1.c, src/normal.c, src/ops.c, src/proto/edit.pro,
+ src/proto/mark.pro, src/proto/ops.pro, src/structs.h, src/vim.h
+
+Patch 6.2.328
+Problem: XIM with GTK: It is hard to understand what XIM is doing.
+Solution: Add xim_log() to log XIM events and help with debugging.
+Files: src/mbyte.c
+
+Patch 6.2.329
+Problem: ":=" does not work Vi compatible. (Antony Scriven)
+Solution: Print the last line number instead of the current line. Don't
+ print "line".
+Files: src/ex_cmds.h, src/ex_docmd.c
+
+Patch 6.2.330 (extra, after 6.2.267)
+Problem: Win32: Crash when tearing off a menu.
+Solution: Terminate a string with a NUL. (Yasuhiro Matsumoto)
+Files: src/gui_w32.c
+
+Patch 6.2.331 (after 6.2.327)
+Problem: "gwap" leaves cursor in the wrong line.
+Solution: Remember the cursor position before finding the ends of the
+ paragraph.
+Files: src/normal.c, src/ops.c, src/structs.h
+
+Patch 6.2.332 (extra)
+Problem: Amiga: Compile error for string array. Compiling the Amiga GUI
+ doesn't work.
+Solution: Use a char pointer instead. Move including "gui_amiga.h" to after
+ including "vim.h". Add a semicolon. (Ali Akcaagac)
+Files: src/gui_amiga.c, src/os_amiga.c
+
+Patch 6.2.333 (extra)
+Problem: Win32: printing doesn't work with specified font charset.
+Solution: Use the specified font charset. (Mike Williams)
+Files: src/os_mswin.c
+
+Patch 6.2.334 (extra, after 6.2.296)
+Problem: Win32: evaluating client expression in debug mode requires typing
+ "cont".
+Solution: Use eval_client_expr_to_string().
+Files: src/os_mswin.c
+
+Patch 6.2.335
+Problem: The ":sign" command cannot be followed by another command.
+Solution: Add TRLBAR to the command flags.
+Files: src/ex_cmds.h
+
+Patch 6.2.336 (after 6.2.327)
+Problem: Mixup of items in an expression.
+Solution: Move "== NUL" to the right spot.
+Files: src/edit.c
+
+Patch 6.2.337 (extra, after 6.2.319)
+Problem: Building gvimext.dll with Mingw doesn't work properly.
+Solution: Fix white space and other details. (Alejandro Lopez-Valencia)
+Files: src/GvimExt/Make_ming.mak
+
+Patch 6.2.338 (after 6.2.331)
+Problem: When undoing "gwap" the cursor is always put at the start of the
+ paragraph. When undoing auto-formatting the cursor may be above
+ the change.
+Solution: Try to move the cursor back to where it was or to the first line
+ that actually changed.
+Files: src/normal.c, src/ops.c, src/undo.c
+
+Patch 6.2.339
+Problem: Crash when using many different highlight groups and a User
+ highlight group. (Juergen Kraemer)
+Solution: Do not use the sg_name_u pointer when it is NULL. Also simplify
+ use of the highlight group table.
+Files: src/syntax.c
+
+Patch 6.2.340
+Problem: ":reg" doesn't show the actual contents of the clipboard if it was
+ filled outside of Vim. (Stuart MacDonald)
+Solution: Obtain the clipboard contents before displaying it.
+Files: src/ops.c
+
+Patch 6.2.341 (extra)
+Problem: Win32: When the path to diff.exe contains a space and using the
+ vimrc generated by the install program, diff mode does not work.
+Solution: Put the first double quote just before the space instead of before
+ the path.
+Files: src/dosinst.c
+
+Patch 6.2.342 (extra)
+Problem: Win32: macros are not always used as expected.
+Solution: Define WINVER to 0x0400 instead of 0x400. (Alejandro
+ Lopez-Valencia)
+Files: src/Make_bc5.mak, src/Make_cyg.mak, src/Make_mvc.mak
+
+Patch 6.2.343
+Problem: Title doesn't work with some window managers. X11: Setting the
+ text property for the window title is hard coded.
+Solution: Use STRING format when possible. Use the UTF-8 function when
+ it's available and 'encoding' is utf-8. Use
+ XStringListToTextProperty(). Do the same for the icon name.
+ (David Harrison)
+Files: src/os_unix.c
+
+Patch 6.2.344 (extra, after 6.2.337)
+Problem: Cannot build gvimext.dll with MingW on Linux.
+Solution: Add support for cross compiling. (Ronald Hoellwarth)
+Files: src/GvimExt/Make_ming.mak
+
+Patch 6.2.345 (extra)
+Problem: Win32: Copy/paste between two Vims fails if 'encoding' is not set
+ properly or there are illegal bytes.
+Solution: Use a raw byte format. Always set it when copying. When pasting
+ use the raw format if 'encoding' is the same.
+Files: src/os_mswin.c, src/os_win16.c, src/os_win32.c, src/vim.h
+
+Patch 6.2.346
+Problem: Win32 console: After using "chcp" Vim does not detect the
+ different codepage.
+Solution: Use GetConsoleCP() and when it is different from GetACP() set
+ 'termencoding'.
+Files: src/option.c
+
+Patch 6.2.347 (extra)
+Problem: Win32: XP theme support is missing.
+Solution: Add a manifest and refer to it from the resource file. (Michael
+ Wookey)
+Files: Makefile, src/gvim.exe.mnf, src/vim.rc
+
+Patch 6.2.348
+Problem: Win32: "vim c:\dir\(test)" doesn't work, because the 'isfname'
+ default value doesn't contain parentheses.
+Solution: Temporarily add '(' and ')' to 'isfname' when expanding file name
+ arguments.
+Files: src/main.c
+
+Patch 6.2.349
+Problem: Finding a match using 'matchpairs' may cause a crash.
+ 'matchpairs' is not used for 'showmatch'.
+Solution: Don't look past the NUL in 'matchpairs'. Use 'matchpairs' for
+ 'showmatch'. (Dave Olszewkski)
+Files: src/misc1.c, src/normal.c, src/proto/search.pro, src/search.c
+
+Patch 6.2.350
+Problem: Not enough info about startup timing.
+Solution: Add a few more TIME_MSG() calls.
+Files: src/main.c
+
+Patch 6.2.351
+Problem: Win32: $HOME may be set to %USERPROFILE%.
+Solution: Expand %VAR% at the start of $HOME.
+Files: src/misc1.c
+
+Patch 6.2.352 (after 6.2.335)
+Problem: ":sign texthl=||" does not work.
+Solution: Remove the check for a following command. Give an error for extra
+ arguments after "buff=1".
+Files: src/ex_cmds.c, src/ex_cmds.h
+
+Patch 6.2.353 (extra)
+Problem: Win32: Supported server name length is limited. (Paul Bossi)
+Solution: Use MAX_PATH instead of 25.
+Files: src/os_mswin.c
+
+Patch 6.2.354 (extra)
+Problem: Win32: When the mouse pointer is on a tear-off menu it is hidden
+ when typing but is not redisplayed when moved. (Markx Hackmann)
+Solution: Handle the pointer move event for the tear-off menu window.
+Files: src/gui_w32.c
+
+Patch 6.2.355 (after 6.2.303)
+Problem: When 'encoding' is a double-byte encoding different from the
+ current locale, the width of characters is not correct.
+ Possible failure and memory leak when using iconv, Unicode
+ digraphs and 'encoding' is not "utf-8".
+Solution: Use iconv() to discover the actual width of characters.
+ Add the "vc_fail" field to vimconv_T.
+ When converting a digraph, init the conversion type to NONE and
+ cleanup afterwards.
+Files: src/digraph.c, src/mbyte.c, src/structs.h
+
+Patch 6.2.356
+Problem: When using a double-byte 'encoding' and 'selection' is
+ "exclusive", "vy" only yanks the first byte of a double-byte
+ character. (Xiangjiang Ma)
+Solution: Correct the column in unadjust_for_sel() to position on the first
+ byte, always include the trailing byte of the selected text.
+Files: src/normal.c
+
+Patch 6.2.357 (after 6.2.321)
+Problem: Memory leak when resizing the Vim window.
+Solution: Free the LineWraps array.
+Files: src/screen.c
+
+Patch 6.2.358 (after 6.2.299)
+Problem: Memory leak when using ":help" and the language doesn't match.
+Solution: Free the array with matching tags.
+Files: src/ex_cmds.c
+
+Patch 6.2.359 (after 6.2.352)
+Problem: Compiler warning for long to int type cast.
+Solution: Add explicit type cast.
+Files: src/ex_cmds.c
+
+Patch 6.2.360
+Problem: "100|" in an empty line results in a ruler "1,0-100". (Pavol
+ Juhas)
+Solution: Recompute w_virtcol if the target column was not reached.
+Files: src/misc2.c
+
+Patch 6.2.361 (extra)
+Problem: Win32: Run gvim, ":set go-=m", use Alt-Tab, keep Alt pressed while
+ pressing Esc, then release Alt: Cursor disappears and typing a key
+ causes a beep. (Hari Krishna Dara)
+Solution: Don't ignore the WM_SYSKEYUP event when the menu is disabled.
+Files: src/gui_w32.c
+
+Patch 6.2.362 (extra, after 6.2.347)
+Problem: Win32: The manifest causes gvim not to work. (Dave Roberts)
+Solution: Change "x86" to "X86". (Serge Pirotte)
+Files: src/gvim.exe.mnf
+
+Patch 6.2.363
+Problem: In an empty file with 'showmode' off, "i" doesn't change the ruler
+ from "0-1" to "1". Typing "x<BS>" does show "1", but then <Esc>
+ doesn't make it "0-1" again. Same problem for ruler in
+ statusline. (Andrew Pimlott)
+Solution: Remember the "empty line" flag with Insert mode and'ed to it.
+Files: src/screen.c
+
+Patch 6.2.364
+Problem: HTML version of the documentation doesn't mention the encoding,
+ which is a problem for mbyte.txt.
+Solution: Adjust the awk script. (Ilya Sher)
+Files: runtime/doc/makehtml.awk
+
+Patch 6.2.365
+Problem: The configure checks for Perl and Python may add compile and link
+ arguments that break building Vim.
+Solution: Do a sanity check: try building with the arguments.
+Files: src/auto/configure, src/configure.in
+
+Patch 6.2.366
+Problem: When the GUI can't start because no valid font is found, there is
+ no error message. (Ugen)
+Solution: Add an error message.
+Files: src/gui.c
+
+Patch 6.2.367
+Problem: Building the help tags file while installing may fail if there is
+ another Vim in $PATH.
+Solution: Specify the just installed Vim executable. (Gordon Prieur)
+Files: src/Makefile
+
+Patch 6.2.368
+Problem: When 'autochdir' is set, closing a window doesn't change to the
+ directory of the new current window. (Salman Halim)
+Solution: Handle 'autochdir' always when a window becomes the current one.
+Files: src/window.c
+
+Patch 6.2.369
+Problem: Various memory leaks: when using globpath(), when searching for
+ help tags files, when defining a function inside a function, when
+ giving an error message through an exception, for the final "."
+ line in ":append", in expression "cond ? a : b" that fails and for
+ missing ")" in an expression. Using NULL pointer when adding
+ first user command and for pointer computations with regexp.
+ (tests by Dominique Pelle)
+Solution: Fix the leaks by freeing the allocated memory. Don't use the
+ array of user commands when there are no entries. Use a macro
+ instead of a function call for saving and restoring regexp states.
+Files: src/eval.c, src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c,
+ src/misc2.c, src/regexp.c, src/screen.c, src/tag.c
+
+Patch 6.2.370 (extra, after6.2.341)
+Problem: Win32: When the path to diff.exe contains a space and using the
+ vimrc generated by the install program, diff mode may not work.
+ (Alejandro Lopez-Valencia)
+Solution: Do not use double quotes for arguments that do not have a space.
+Files: src/dosinst.c
+
+Patch 6.2.371
+Problem: When 'virtualedit' is set and there is a Tab before the next "x",
+ "dtx" does not delete the whole Tab. (Ken Hashishi)
+Solution: Move the cursor to the last position of the Tab. Also for
+ "df<Tab>".
+Files: src/normal.c
+
+Patch 6.2.372
+Problem: When using balloon evaluation, no value is displayed for members
+ of structures and items of an array.
+Solution: Include "->", "." and "[*]" in the expression.
+Files: src/gui_beval.c, src/normal.c, src/vim.h
+
+Patch 6.2.373
+Problem: When 'winminheight' is zero and a window is reduced to zero
+ height, the ruler always says "Top" instead of the cursor
+ position. (Antoine J. Mechelynck)
+Solution: Don't recompute w_topline for a zero-height window.
+Files: src/window.c
+
+Patch 6.2.374
+Problem: ":echo "hello" | silent normal n" removes the "hello" message.
+ (Servatius Brandt)
+Solution: Don't echo the search string when ":silent" was used. Also don't
+ show the mode. In general: don't clear to the end of the screen.
+Files: src/gui.c, src/message.c, src/os_unix.c, src/proto/message.pro,
+ src/screen.c, src/search.c, src/window.c
+
+Patch 6.2.375
+Problem: When changing 'guioptions' the hit-enter prompt may be below the
+ end of the Vim window.
+Solution: Call screen_alloc() before showing the prompt.
+Files: src/message.c
+
+Patch 6.2.376
+Problem: Win32: Ruby interface cannot be dynamically linked with Ruby 1.6.
+Solution: Add #ifdefs around use of rb_w32_snprintf(). (Benoît Cerrina)
+Files: src/if_ruby.c
+
+Patch 6.2.377 (after 6.2.372)
+Problem: Compiler warnings for signed/unsigned compare. (Michael Wookey)
+Solution: Add type cast.
+Files: src/normal.c
+
+Patch 6.2.378 (extra, after 6.2.118)
+Problem: Mac: cannot build with Project Builder.
+Solution: Add remove_tail_with_ext() to locate and remove the "build"
+ directory from the runtime path. Include os_unix.c when needed.
+ (Dany St Amant)
+Files: src/misc1.c, src/os_macosx.c, src/vim.h
+
+Patch 6.2.379
+Problem: Using ":mkvimrc" in the ":options" window sets 'bufhidden' to
+ "delete". (Michael Naumann)
+Solution: Do not add buffer-specific option values to a global vimrc file.
+Files: src/option.c
+
+Patch 6.2.380 (extra)
+Problem: DOS: "make test" fails when running it again. Can't "make test"
+ with Borland C.
+Solution: Make sure ".out" files are deleted when they get in the way. Add
+ a "test" target to the Borland C Makefile.
+Files: src/Make_bc5.mak, src/testdir/Make_dos.mak
+
+Patch 6.2.381
+Problem: Setting 'fileencoding' to a comma-separated list (confusing it
+ with 'fileencodings') does not result in an error message.
+ Setting 'fileencoding' in an empty file marks it as modified.
+ There is no "+" in the title after setting 'fileencoding'.
+Solution: Check for a comma in 'fileencoding'. Only consider a non-empty
+ file modified by changing 'fileencoding'. Update the title after
+ changing 'fileencoding'.
+Files: src/option.c
+
+Patch 6.2.382
+Problem: Running "make test" puts marks from test files in viminfo.
+Solution: Specify a different viminfo file to use.
+Files: src/testdir/test15.in, src/testdir/test49.in
+
+Patch 6.2.383
+Problem: ":hi foo term='bla" crashes Vim. (Antony Scriven)
+Solution: Check that the closing ' is there.
+Files: src/syntax.c
+
+Patch 6.2.384
+Problem: ":menu a.&b" ":unmenu a.b" only works if "&b" isn't translated.
+Solution: Also compare the names without '&' characters.
+Files: src/menu.c
+
+Patch 6.2.385 (extra)
+Problem: Win32: forward_slash() and trash_input_buf() are undefined when
+ compiling with small features. (Ajit Thakkar)
+Solution: Change the #ifdefs for forward_slash(). Don't call
+ trash_input_buf() if the input buffer isn't used.
+Files: src/fileio.c, src/os_win32.c
+
+Patch 6.2.386
+Problem: Wasting time trying to read marks from the viminfo file for a
+ buffer without a name.
+Solution: Skip reading marks when the buffer has no name.
+Files: src/fileio.c
+
+Patch 6.2.387
+Problem: There is no highlighting of translated items in help files.
+Solution: Search for a "help_ab.vim" syntax file when the help file is
+ called "*.abx". Also improve the help highlighting a bit.
+Files: runtime/syntax/help.vim
+
+Patch 6.2.388
+Problem: GTK: When displaying some double-width characters they are drawn
+ as single-width, because of conversion to UTF-8.
+Solution: Check the width that GTK uses and add a space if it's one instead
+ of two.
+Files: src/gui_gtk_x11.c
+
+Patch 6.2.389
+Problem: When working over a slow connection, it's very annoying that the
+ last line is partly drawn and then cleared for every change.
+Solution: Don't redraw the bottom line if no rows were inserted or deleted.
+ Don't draw the line if we know "@" lines will be used.
+Files: src/screen.c
+
+Patch 6.2.390
+Problem: Using "r*" in Visual mode on multibyte characters only replaces
+ every other character. (Tyson Roberts)
+Solution: Correct the cursor position after replacing each character.
+Files: src/ops.c
+
+Patch 6.2.391 (extra)
+Problem: The ":highlight" command is not tested.
+Solution: Add a test script for ":highlight".
+Files: src/testdir/Makefile, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/test51.in,
+ src/testdir/test51.ok
+
+Patch 6.2.392 (after 6.2.384)
+Problem: Unused variable.
+Solution: Remove "dlen".
+Files: src/menu.c
+
+Patch 6.2.393
+Problem: When using very long lines the viminfo file can become very big.
+Solution: Add the "s" flag to 'viminfo': skip registers with more than the
+ specified Kbyte of text.
+Files: runtime/doc/options.txt, src/ops.c, src/option.c
+
+Patch 6.2.394 (after 6.2.391)
+Problem: Test 51 fails on a terminal with 8 colors. (Tony Leneis)
+Solution: Use "DarkBlue" instead of "Blue" to avoid the "bold" attribute.
+Files: src/testdir/test51.in
+
+Patch 6.2.395
+Problem: When using ":tag" or ":pop" the previous matching tag is used.
+ But since the current file is different, the ordering of the tags
+ may change.
+Solution: Remember what the current buffer was for when re-using cur_match.
+Files: src/edit.c, src/ex_cmds.c, src/proto/tag.pro, src/structs.h,
+ src/tag.c
+
+Patch 6.2.396
+Problem: When CTRL-T jumps to another file and an autocommand moves the
+ cursor to the '" mark, don't end up on the right line. (Michal
+ Malecki)
+Solution: Set the line number after loading the file.
+Files: src/tag.c
+
+Patch 6.2.397
+Problem: When using a double-byte 'encoding' mapping <M-x> doesn't work.
+ (Yasuhiro Matsumoto)
+Solution: Do not set the 8th bit of the character but use a modifier.
+Files: src/gui_gtk_x11.c, src/gui_x11.c, src/misc2.c
+
+Patch 6.2.398 (extra)
+Problem: Win32 console: no extra key modifiers are supported.
+Solution: Encode the modifiers into the input stream. Also fix that special
+ keys are converted and stop working when 'tenc' is set. Also fix
+ that when 'tenc' is initialized the input and output conversion is
+ not setup properly until 'enc' or 'tenc' is set.
+Files: src/getchar.c, src/option.c, src/os_win32.c
+
+Patch 6.2.399
+Problem: A ":set" command that fails still writes a message when it is
+ inside a try/catch block.
+Solution: Include all the text of the message in the error message.
+Files: src/charset.c, src/option.c
+
+Patch 6.2.400
+Problem: Can't compile if_xcmdsrv.c on HP-UX 11.0.
+Solution: Include header file poll.h. (Malte Neumann)
+Files: src/if_xcmdsrv.c
+
+Patch 6.2.401
+Problem: When opening a buffer that was previously opened, Vim does not
+ restore the cursor position if the first line starts with white
+ space. (Gregory Margo)
+Solution: Don't skip restoring the cursor position if it is past the blanks
+ in the first line.
+Files: src/buffer.c
+
+Patch 6.2.402
+Problem: Mac: "make install" doesn't generate help tags. (Benji Fisher)
+Solution: Generate help tags before copying the runtime files.
+Files: src/Makefile
+
+Patch 6.2.403
+Problem: ":@y" checks stdin if there are more commands to execute. This
+ fails if stdin is not connected, e.g., when starting the GUI from
+ KDE. (Ned Konz)
+Solution: Only check for a next command if there still is typeahead.
+Files: src/ex_docmd.c
+
+Patch 6.2.404
+Problem: Our own function to determine width of Unicode characters may get
+ outdated. (Markus Kuhn)
+Solution: Use wcwidth() when it is available. Also use iswprint().
+Files: src/auto/configure, src/configure.in, src/config.h.in, src/mbyte.c
+
+Patch 6.2.405
+Problem: Cannot map zero without breaking the count before a command.
+ (Benji Fisher)
+Solution: Disable mapping zero when entering a count.
+Files: src/getchar.c, src/globals.h, src/normal.c
+
+Patch 6.2.406
+Problem: ":help \zs", ":help \@=" and similar don't find useful help.
+Solution: Prepend "/\" to the arguments to find the desired help tag.
+Files: src/ex_cmds.c
+
+Patch 6.2.407 (after 6.2.299)
+Problem: ":help \@<=" doesn't find help.
+Solution: Avoid that ":help \@<=" searches for the "<=" language.
+Files: src/tag.c
+
+Patch 6.2.408
+Problem: ":compiler" is not consistent: Sets local options and a global
+ variable. (Douglas Potts) There is no error message when a
+ compiler is not supported.
+Solution: Use ":compiler!" to set a compiler globally, otherwise it's local
+ to the buffer and "b:current_compiler" is used. Give an error
+ when no compiler script could be found.
+ Note: updated compiler plugins can be found at
+ ftp://ftp.vim.org/pub/vim/runtime/compiler/
+Files: runtime/compiler/msvc.vim, runtime/doc/quickfix.txt, src/eval.c,
+ src/ex_cmds2.c
+
+Patch 6.2.409
+Problem: The cursor ends up in the last column instead of after the line
+ when doing "i//<Esc>o" with 'indentexpr' set to "cindent(v:lnum)".
+ (Toby Allsopp)
+Solution: Adjust the cursor as if in Insert mode.
+Files: src/misc1.c
+
+Patch 6.2.410 (after 6.2.389)
+Problem: In diff mode, when there are more filler lines than fit in the
+ window, they are not drawn.
+Solution: Check for filler lines when skipping to draw a line that doesn't
+ fit.
+Files: src/screen.c
+
+Patch 6.2.411
+Problem: A "\n" inside a string is not seen as a line break by the regular
+ expression matching. (Hari Krishna Dara)
+Solution: Add the vim_regexec_nl() function for strings where "\n" is to be
+ matched with a line break.
+Files: src/eval.c, src/ex_eval.c, src/proto/regexp.c, src/regexp.c
+
+Patch 6.2.412
+Problem: Ruby: "ruby << EOF" inside a function doesn't always work. Also
+ for ":python", ":tcl" and ":perl".
+Solution: Check for "<< marker" and skip until "marker" before checking for
+ "endfunction".
+Files: src/eval.c
+
+Patch 6.2.413 (after 6.2.411)
+Problem: Missing prototype for vim_regexec_nl(). (Marcel Svitalsky)
+Solution: Now really include the prototype.
+Files: src/proto/regexp.pro
+
+Patch 6.2.414
+Problem: The function used for custom completion of user commands cannot
+ have <SID> to make it local. (Hari Krishna Dara)
+Solution: Pass the SID of the script where the user command was defined on
+ to the completion. Also clean up #ifdefs.
+Files: src/ex_docmd.c, src/eval.c, src/ex_getln.c, src/structs.h
+
+Patch 6.2.415
+Problem: Vim may crash after a sequence of events that change the window
+ size. The window layout assumes a larger window than is actually
+ available. (Servatius Brandt)
+Solution: Invoke win_new_shellsize() from screenalloc() instead of from
+ set_shellsize().
+Files: src/screen.c, src/term.c
+
+Patch 6.2.416
+Problem: Compiler warning for incompatible pointer.
+Solution: Remove the "&" in the call to poll(). (Xavier de Gaye)
+Files: src/os_unix.c
+
+Patch 6.2.417 (after 6.2.393)
+Problem: Many people forget that the '"' item in 'viminfo' needs to be
+ preceded with a backslash,
+Solution: Add '<' as an alias for the '"' item.
+Files: runtime/doc/options.txt, src/ops.c, src/option.c
+
+Patch 6.2.418
+Problem: Using ":nnoremap <F12> :echo "cheese" and ":cabbr cheese xxx":
+ when pressing <F12> still uses the abbreviation. (Hari Krishna)
+Solution: Also apply "noremap" to abbreviations.
+Files: src/getchar.c
+
+Patch 6.2.419 (extra)
+Problem: Win32: Cannot open the Vim window inside another application.
+Solution: Add the "-P" argument to specify the window title of the
+ application to run inside. (Zibo Zhao)
+Files: runtime/doc/starting.txt, src/main.c, src/gui_w32.c,
+ src/gui_w48.c, src/if_ole.cpp, src/os_mswin.c,
+ src/proto/gui_w32.pro
+
+Patch 6.2.420
+Problem: Cannot specify a file to be edited in binary mode without setting
+ the global value of the 'binary' option.
+Solution: Support ":edit ++bin file".
+Files: runtime/doc/editing.txt, src/buffer.c, src/eval.c, src/ex_cmds.h,
+ src/ex_docmd.c, src/fileio.c, src/misc2.c
+
+Patch 6.2.421
+Problem: Cannot set the '[ and '] mark, which may be necessary when an
+ autocommand simulates reading a file.
+Solution: Allow using "m[" and "m]".
+Files: runtime/doc/motion.txt, src/mark.c
+
+Patch 6.2.422
+Problem: In CTRL-X completion messages the "/" makes them less readable.
+Solution: Remove the slashes. (Antony Scriven)
+Files: src/edit.c
+
+Patch 6.2.423
+Problem: ":vertical wincmd ]" does not split vertically.
+Solution: Add "postponed_split_flags".
+Files: src/ex_docmd.c, src/globals.h, src/if_cscope.c, src/tag.c
+
+Patch 6.2.424
+Problem: A BufEnter autocommand that sets an option stops 'mousefocus' from
+ working in Insert mode (Normal mode is OK). (Gregory Seidman)
+Solution: In the Insert mode loop invoke gui_mouse_correct() when needed.
+Files: src/edit.c
+
+Patch 6.2.425
+Problem: Vertical split and command line window: can only drag status line
+ above the cmdline window on the righthand side, not lefthand side.
+Solution: Check the status line row instead of the window pointer.
+Files: src/ui.c
+
+Patch 6.2.426
+Problem: A syntax region end match with a matchgroup that includes a line
+ break only highlights the last line with matchgroup. (Gary
+ Holloway)
+Solution: Also use the line number of the position where the region
+ highlighting ends.
+Files: src/syntax.c
+
+Patch 6.2.427 (extra)
+Problem: When pasting a lot of text in a multibyte encoding, conversion
+ from 'termencoding' to 'encoding' may fail for some characters.
+ (Kuang-che Wu)
+Solution: When there is an incomplete byte sequence at the end of the read
+ text keep it for the next time.
+Files: src/mbyte.c, src/os_amiga.c, src/os_mswin.c, src/proto/mbyte.pro,
+ src/proto/os_mswin.pro, src/ui.c
+
+Patch 6.2.428
+Problem: The X11 clipboard supports the Vim selection for char/line/block
+ mode, but since the encoding is not included can't copy/paste
+ between two Vims with a different 'encoding'.
+Solution: Add a new selection format that includes the 'encoding'. Perform
+ conversion when necessary.
+Files: src/gui_gtk_x11.c, src/ui.c, src/vim.h
+
+Patch 6.2.429
+Problem: Unix: glob() doesn't work for a directory with a single quote in
+ the name. (Nazri Ramliy)
+Solution: When using the shell to expand, only put double quotes around
+ spaces and single quotes, not the whole thing.
+Files: src/os_unix.c
+
+Patch 6.2.430
+Problem: BOM at start of a vim script file is not recognized and causes an
+ error message.
+Solution: Detect the BOM and skip over it. Also fix that after using
+ ":scriptencoding" the iconv() file descriptor was not closed
+ (memory leak).
+Files: src/ex_cmds2.c
+
+Patch 6.2.431
+Problem: When using the horizontal scrollbar, the scrolling is limited to
+ the length of the cursor line.
+Solution: Make the scroll limit depend on the longest visible line. The
+ cursor is moved when necessary. Including the 'h' flag in
+ 'guioptions' disables this.
+Files: runtime/doc/gui.txt, runtime/doc/options.txt, src/gui.c,
+ src/misc2.c, src/option.h
+
+Patch 6.2.432 (after 6.2.430 and 6.2.431)
+Problem: Lint warnings.
+Solution: Add type casts.
+Files: src/ex_cmds2.c, src/gui.c
+
+Patch 6.2.433
+Problem: Translating "VISUAL" and "BLOCK" separately doesn't give a good
+ result. (Alejandro Lopez Valencia)
+Solution: Use a string for each combination.
+Files: src/screen.c
+
+Patch 6.2.434 (after 6.2.431)
+Problem: Compiler warning. (Salman Halim)
+Solution: Add type casts.
+Files: src/gui.c
+
+Patch 6.2.435
+Problem: When there are vertically split windows the minimal Vim window
+ height is computed wrong.
+Solution: Use frame_minheight() to correctly compute the minimal height.
+Files: src/window.c
+
+Patch 6.2.436
+Problem: Running the tests changes the user's viminfo file.
+Solution: In test 49 tell the extra Vim to use the test viminfo file.
+Files: src/testdir/test49.vim
+
+Patch 6.2.437
+Problem: ":mksession" always puts "set nocompatible" in the session file.
+ This changes option settings. (Ron Aaron)
+Solution: Add an "if" to only change 'compatible' when needed.
+Files: src/ex_docmd.c
+
+Patch 6.2.438
+Problem: When the 'v' flag is present in 'cpoptions', backspacing and then
+ typing text again: one character too much is overtyped before
+ inserting is done again.
+Solution: Set "dollar_vcol" to the right column.
+Files: src/edit.c
+
+Patch 6.2.439
+Problem: GTK 2: Changing 'lines' may cause a mismatch between the window
+ layout and the size of the window.
+Solution: Disable the hack with force_shell_resize_idle().
+Files: src/gui_gtk_x11.c
+
+Patch 6.2.440
+Problem: When 'lazyredraw' is set the window title is still updated.
+ The size of the Visual area and the ruler are displayed too often.
+Solution: Postpone redrawing the window title. Only show the Visual area
+ size when waiting for a character. Don't draw the ruler
+ unnecessary.
+Files: src/buffer.c, src/normal.c, src/screen.c
+
+Patch 6.2.441
+Problem: ":unabbreviate foo " doesn't work, because of the trailing space,
+ while an abbreviation with a trailing space is not possible. (Paul
+ Jolly)
+Solution: Accept a match with the lhs of an abbreviation without the
+ trailing space.
+Files: src/getchar.c
+
+Patch 6.2.442
+Problem: Cannot manipulate the command line from a function.
+Solution: Add getcmdline(), getcmdpos() and setcmdpos() functions and the
+ CTRL-\ e command.
+Files: runtime/doc/cmdline.txt, runtime/doc/eval.txt, src/eval.c
+ src/ex_getln.c, src/ops.c, src/proto/ex_getln.pro,
+ src/proto/ops.pro
+
+Patch 6.2.443
+Problem: With ":silent! echoerr something" you don't get the position of
+ the error. emsg() only writes the message itself and returns.
+Solution: Also redirect the position of the error.
+Files: src/message.c
+
+Patch 6.2.444
+Problem: When adding the 'c' flag to a ":substitute" command it may replace
+ more times than without the 'c' flag. Happens for a match that
+ starts with "\ze" (Marcel Svitalsky) and when using "\@<=" (Klaus
+ Bosau).
+Solution: Correct "prev_matchcol" when replacing the line. Don't replace
+ the line when the pattern uses look-behind matching.
+Files: src/ex_cmds.c, src/proto/regexp.pro, src/regexp.c
+
+Patch 6.2.445
+Problem: Copying vimtutor to /tmp/something is not secure, a symlink may
+ cause trouble.
+Solution: Create a directory and create the file in it. Use "umask" to
+ create the directory with mode 700. (Stefan Nordhausen)
+Files: src/vimtutor
+
+Patch 6.2.446 (after 6.2.404)
+Problem: Using library functions wcwidth() and iswprint() results in
+ display problems for Hebrew characters. (Ron Aaron)
+Solution: Disable the code to use the library functions, use our own.
+Files: src/mbyte.c
+
+Patch 6.2.447 (after 6.2.440)
+Problem: Now that the title is only updated when redrawing, it is no longer
+ possible to show it while executing a function. (Madoka Machitani)
+Solution: Make ":redraw" also update the title.
+Files: src/ex_docmd.c
+
+Patch 6.2.448 (after 6.2.427)
+Problem: Mac: conversion done when 'termencoding' differs from 'encoding'
+ fails when pasting a longer text.
+Solution: Check for an incomplete sequence at the end of the chunk to be
+ converted. (Eckehard Berns)
+Files: src/mbyte.c
+
+Patch 6.2.449 (after 6.2.431)
+Problem: Get error messages when switching files.
+Solution: Check for a valid line number when calculating the width of the
+ horizontal scrollbar. (Helmut Stiegler)
+Files: src/gui.c
+
+Patch 6.2.450
+Problem: " #include" and " #define" are not recognized with the default
+ option values for 'include' and 'defined'. (RG Kiran)
+Solution: Adjust the default values to allow white space before the #.
+Files: runtime/doc/options.txt, src/option.c
+
+Patch 6.2.451
+Problem: GTK: when using XIM there are various problems, including setting
+ 'modified' and breaking undo at the wrong moment.
+Solution: Add "xim_changed_while_preediting", "preedit_end_col" and
+ im_is_preediting(). (Yasuhiro Matsumoto)
+Files: src/ex_getln.c, src/globals.h, src/gui_gtk.c, src/gui_gtk_x11.c,
+ src/mbyte.c, src/misc1.c, src/proto/mbyte.pro, src/screen.c,
+ src/undo.c
+
+Patch 6.2.452
+Problem: In diff mode, when DiffAdd and DiffText highlight settings are
+ equal, an added line is highlighted with DiffChange. (Tom Schumm)
+Solution: Remember the diff highlight type instead of the attributes.
+Files: src/screen.c
+
+Patch 6.2.453
+Problem: ":s/foo\|\nbar/x/g" does not replace two times in "foo\nbar".
+ (Pavel Papushev)
+Solution: When the pattern can match a line break also try matching at the
+ NUL at the end of a line.
+Files: src/ex_cmds.c, src/regexp.c
+
+Patch 6.2.454
+Problem: ":let b:changedtick" doesn't work. (Alan Schmitt) ":let
+ b:changedtick = 99" does not give an error message.
+Solution: Add code to recognize ":let b:changedtick".
+Files: src/eval.c
+
+Patch 6.2.455 (after 6.2.297)
+Problem: In Python commands the current locale changes how certain Python
+ functions work. (Eugene M. Minkovskii)
+Solution: Set the LC_NUMERIC locale to "C" while executing a Python command.
+Files: src/if_python.c
+
+Patch 6.2.456 (extra)
+Problem: Win32: Editing a file by its Unicode name (dropping it on Vim or
+ using the file selection dialog) doesn't work. (Yakov Lerner, Alex
+ Jakushev)
+Solution: Use wide character functions when file names are involved and
+ convert from/to 'encoding' where needed.
+Files: src/gui_w48.c, src/macros.h, src/memfile.c, src/memline.c,
+ src/os_mswin.c, src/os_win32.c
+
+Patch 6.2.457 (after 6.2.244)
+Problem: When 'encoding' is "utf-8" and writing text with chars above 0x80
+ in latin1, conversion is wrong every 8200 bytes. (Oyvind Holm)
+Solution: Correct the utf_ptr2len_check_len() function and fix the problem
+ of displaying 0xf7 in utfc_ptr2len_check_len().
+Files: src/mbyte.c
+
+Patch 6.2.458
+Problem: When 'virtualedit' is set "$" doesn't move to the end of an
+ unprintable character, causing "y$" not to include that character.
+ (Fred Ma)
+Solution: Set "coladd" to move the cursor to the end of the character.
+Files: src/misc2.c
+
+Patch 6.2.459 (after 6.2.454)
+Problem: Variable "b" cannot be written. (Salman Halim)
+Solution: Compare strings properly.
+Files: src/eval.c
+
+Patch 6.2.460 (extra, after 6.2.456)
+Problem: Compiler warnings for missing prototypes.
+Solution: Include the missing prototypes.
+Files: src/proto/os_win32.pro
+
+Patch 6.2.461
+Problem: After using a search command "x" starts putting single characters
+ in the numbered registers.
+Solution: Reset "use_reg_one" at the right moment.
+Files: src/normal.c
+
+Patch 6.2.462
+Problem: Finding a matching parenthesis does not correctly handle a
+ backslash in a trailing byte.
+Solution: Handle multibyte characters correctly. (Taro Muraoka)
+Files: src/search.c
+
+Patch 6.2.463 (extra)
+Problem: Win32: An NTFS file system may contain files with extra info
+ streams. The current method to copy them creates one and then
+ deletes it again. (Peter Toennies) Also, only three streams with
+ hard coded names are copied.
+Solution: Use BackupRead() to check which info streams the original file
+ contains and only copy these streams.
+Files: src/os_win32.c
+
+Patch 6.2.464 (extra, after 6.2.427)
+Problem: Amiga: Compilation error with gcc. (Ali Akcaagac)
+Solution: Move the #ifdef outside of Read().
+Files: src/os_amiga.c
+
+Patch 6.2.465
+Problem: When resizing the GUI window the window manager sometimes moves it
+ left of or above the screen. (Michael McCarty)
+Solution: Check the window position after resizing it and move it onto the
+ screen when it isn't.
+Files: src/gui.c
+
+Patch 6.2.466 (extra, after 6.2.456)
+Problem: Win32: Compiling with Borland C fails, and an un/signed warning.
+Solution: Redefine wcsicmp() to wcscmpi() and add type casts. (Yasuhiro
+ Matsumoto)
+Files: src/os_win32.c
+
+Patch 6.2.467 (extra, after 6.2.463)
+Problem: Win32: can't compile without multibyte feature. (Ajit Thakkar)
+Solution: Add #ifdefs around the info stream code.
+Files: src/os_win32.c
+
+Patch 6.2.468
+Problem: Compiler warnings for shadowed variables. (Matthias Mohr)
+Solution: Delete superfluous variables and rename others.
+Files: src/eval.c, src/ex_docmd.c, src/ex_eval.c, src/if_cscope.c,
+ src/fold.c, src/option.c, src/os_unix.c, src/quickfix.c,
+ src/regexp.c
+
+Patch 6.2.469 (extra, after 6.2.456)
+Problem: Win32: Can't create swap file when 'encoding' differs from the
+ active code page. (Kriton Kyrimis)
+Solution: In enc_to_ucs2() terminate the converted string with a NUL
+Files: src/os_mswin.c
+
+Patch 6.2.470
+Problem: The name returned by tempname() may be equal to the file used for
+ shell output when ignoring case.
+Solution: Skip 'O' and 'I' in tempname().
+Files: src/eval.c
+
+Patch 6.2.471
+Problem: "-L/usr/lib" is used in the link command, even though it's
+ supposed to be filtered out. "-lw" and "-ldl" are not
+ automatically added when needed for "-lXmu". (Antonio Colombo)
+Solution: Check for a space after the argument instead of before. Also
+ remove "-R/usr/lib" if it's there. Check for "-lw" and "-ldl"
+ before trying "-lXmu".
+Files: src/auto/configure, src/configure.in, src/link.sh
+
+Patch 6.2.472
+Problem: When using a FileChangedShell autocommand that changes the current
+ buffer, a buffer exists that can't be wiped out.
+ Also, Vim sometimes crashes when executing an external command
+ that changes the buffer and a FileChangedShell autocommand is
+ used. (Hari Krishna Dara)
+ Users are confused by the warning for a file being changed outside
+ of Vim.
+Solution: Avoid that the window counter for a buffer is incremented twice.
+ Avoid that buf_check_timestamp() is used recursively.
+ Add a hint to look in the help for more info.
+Files: src/ex_cmds.c, src/fileio.c
+
+Patch 6.2.473
+Problem: Using CTRL-] in a help buffer without a name causes a crash.
+Solution: Check for name to be present before using it. (Taro Muraoka)
+Files: src/tag.c
+
+Patch 6.2.474 (extra, after 6.2.456)
+Problem: When Vim is starting up conversion is done unnecessarily. Failure
+ to find the runtime files on Windows 98. (Randall W. Morris)
+Solution: Init enc_codepage negative, only use it when not negative.
+ Don't use GetFileAttributesW() on Windows 98 or earlier.
+Files: src/globals.h, src/gui_w32.c, src/gui_w48.c, src/os_mswin.c,
+ src/os_win32.c
+
+Patch 6.2.475
+Problem: Commands after "perl <<EOF" are parsed as Vim commands when they
+ are not executed.
+Solution: Properly skip over the perl commands.
+Files: src/ex_docmd.c, src/ex_getln.c, src/if_perl.xs, src/if_python.c,
+ src/if_ruby.c, src/if_tcl.c, src/misc2.c
+
+Patch 6.2.476
+Problem: When reloading a hidden buffer changed outside of Vim and the
+ current buffer is read-only, the reloaded buffer becomes
+ read-only. (Hari Krishna Dara)
+Solution: Save the 'readonly' flag of the reloaded buffer instead of the
+ current buffer.
+Files: src/fileio.c
+
+Patch 6.2.477
+Problem: Using remote_send(v:servername, "\<C-V>") causes Vim to hang.
+ (Yakov Lerner)
+Solution: When the resulting string is empty don't set received_from_client.
+Files: src/main.c
+
+Patch 6.2.478
+Problem: Win32: "--remote file" fails changing directory if the current
+ directory name starts with a single quote. (Iestyn Walters)
+Solution: Add a backslash where it will be removed later.
+Files: src/main.c, src/misc2.c, src/proto/misc2.pro
+
+Patch 6.2.479
+Problem: The error message for errors during recovery goes unnoticed.
+Solution: Avoid that the hit-enter prompt overwrites the message. Add a few
+ lines to make the error stand out.
+Files: src/main.c, src/message.c, src/memline.c
+
+Patch 6.2.480
+Problem: NetBeans: Using negative index in array. backslash at end of
+ message may cause Vim to crash. (Xavier de Gaye)
+Solution: Initialize buf_list_used to zero. Check for trailing backslash.
+Files: src/netbeans.c
+
+Patch 6.2.481
+Problem: When writing a file it is not possible to specify that hard and/or
+ symlinks are to be broken instead of preserved.
+Solution: Add the "breaksymlink" and "breakhardlink" values to 'backupcopy'.
+ (Simon Ekstrand)
+Files: runtime/doc/options.txt, src/fileio.c, src/option.c, src/option.h
+
+Patch 6.2.482
+Problem: Repeating insert of CTRL-K 1 S doesn't work. The superscript 1 is
+ considered to be a digit. (Juergen Kraemer)
+Solution: In vim_isdigit() only accept '0' to '9'. Use VIM_ISDIGIT() for
+ speed where possible. Also add vim_isxdigit().
+Files: src/buffer.c, src/charset.c, src/diff.c, src/digraph.c,
+ src/edit.c, src/eval.c,, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_eval.c, src/ex_getln.c,
+ src/if_xcmdsrv.c, src/farsi.c, src/fileio.c, src/fold.c,
+ src/getchar.c, src/gui.c, src/if_cscope.c, src/macros.h,
+ src/main.c, src/mark.c, src/mbyte.c, src/menu.c, src/misc1.c,
+ src/misc2.c, src/normal.c, src/ops.c, src/option.c,
+ src/proto/charset.pro, src/regexp.c, src/screen.c, src/search.c,
+ src/syntax.c, src/tag.c, src/term.c, src/termlib.c
+
+Patch 6.2.483 (extra, after 6.2.482)
+Problem: See 6.2.482.
+Solution: Extra part of patch 6.2.482.
+Files: src/gui_photon.c, src/gui_w48.c, src/os_msdos.c, src/os_mswin.c
+
+Patch 6.2.484
+Problem: MS-Windows: With the included diff.exe, differences after a CTRL-Z
+ are not recognized. (Peter Keresztes)
+Solution: Write the files with unix fileformat and invoke diff with --binary
+ if possible.
+Files: src/diff.c
+
+Patch 6.2.485
+Problem: A BufWriteCmd autocommand cannot know if "!" was used or not.
+ (Hari Krishna Dara)
+Solution: Add the v:cmdbang variable.
+Files: runtime/doc/eval.txt, src/eval.c, src/proto/eval.pro,
+ src/fileio.c, src/vim.h
+
+Patch 6.2.486 (6.2.482)
+Problem: Diff for eval.c is missing.
+Solution: Addition to patch 6.2.482.
+Files: src/eval.c
+
+Patch 6.2.487 (extra, after 6.2.456)
+Problem: Compiler warnings for wrong prototype. (Alejandro Lopez Valencia)
+Solution: Delete the prototype for Handle_WM_Notify().
+Files: src/proto/gui_w32.pro
+
+Patch 6.2.488
+Problem: Missing ")" in *.ch filetype detection.
+Solution: Add the ")". (Ciaran McCreesh)
+Files: runtime/filetype.vim
+
+Patch 6.2.489
+Problem: When accidentally opening a session in Vim which has already been
+ opened in another Vim there is a long row of ATTENTION prompts.
+ Need to quit each of them to get out. (Robert Webb)
+Solution: Add the "Abort" alternative to the dialog.
+Files: src/memline.c
+
+Patch 6.2.490
+Problem: With 'paragraph' it is not possible to use a single dot as a
+ paragraph boundary. (Dorai Sitaram)
+Solution: Allow using " " (two spaces) in 'paragraph' to match ".$" or
+ ". $"
+Files: src/search.c
+
+Patch 6.2.491
+Problem: Decrementing a position doesn't take care of multibyte chars.
+Solution: Adjust the column for multibyte characters. Remove mb_dec().
+ (Yasuhiro Matsumoto)
+Files: src/mbyte.c, src/misc2.c, src/proto/mbyte.pro
+
+Patch 6.2.492
+Problem: When using ":redraw" while there is a message, the next ":echo"
+ still causes text to scroll. (Yasuhiro Matsumoto)
+Solution: Reset msg_didout and msg_col, so that after ":redraw" the next
+ message overwrites an existing one.
+Files: src/ex_docmd.c
+
+Patch 6.2.493
+Problem: "@x" doesn't work when 'insertmode' is set. (Benji Fisher)
+Solution: Put "restart_edit" in the typeahead buffer, so that it's used
+ after executing the register contents.
+Files: src/ops.c
+
+Patch 6.2.494
+Problem: Using diff mode with two windows, when moving horizontally in
+ inserted lines, a fold in the other window may open.
+Solution: Compute the line number in the other window correctly.
+Files: src/diff.c
+
+Patch 6.2.495 (extra, after 6.2.456)
+Problem: Win32: The file dialog doesn't work on Windows 95.
+Solution: Put the wide code of gui_mch_browse() in gui_mch_browseW() and use
+ it only on Windows NT/2000/XP.
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 6.2.496
+Problem: FreeBSD 4.x: When compiled with the pthread library (Python) a
+ complicated pattern may cause Vim to crash. Catching the signal
+ doesn't work.
+Solution: When compiled with threads, instead of using the normal stacksize
+ limit, use the size of the initial stack.
+Files: src/auto/configure, src/config.h.in, src/configure.in,
+ src/os_unix.c
+
+Patch 6.2.497 (extra)
+Problem: Russian messages are only available in one encoding.
+Solution: Convert the messages to MS-Windows codepages. (Vassily Ragosin)
+Files: src/po/Makefile
+
+Patch 6.2.498
+Problem: Non-latin1 help files are not properly supported.
+Solution: Support utf-8 help files and convert them to 'encoding' when
+ needed.
+Files: src/fileio.c
+
+Patch 6.2.499
+Problem: When writing a file and halting the system, the file might be lost
+ when using a journaling file system.
+Solution: Use fsync() to flush the file data to disk after writing a file.
+ (Radim Kolar)
+Files: src/fileio.c
+
+Patch 6.2.500 (extra)
+Problem: The DOS/MS-Windows the installer doesn't use the --binary flag for
+ diff.
+Solution: Add --binary to the diff argument in MyDiff(). (Alejandro Lopez-
+ Valencia)
+Files: src/dosinst.c
+
+Patch 6.2.501
+Problem: Vim does not compile with MorphOS.
+Solution: Add a Makefile and a few changes to make Vim work with MorphOS.
+ (Ali Akcaagac)
+Files: runtime/doc/os_amiga.txt, src/INSTALLami.txt,
+ src/Make_morphos.mak, src/memfile.c, src/term.c
+
+Patch 6.2.502
+Problem: Building fails for generating message files.
+Solution: Add dummy message files.
+Files: src/po/ca.po, src/po/ru.po, src/po/sv.po
+
+Patch 6.2.503
+Problem: Mac: Can't compile MacRoman conversions without the GUI.
+Solution: Also link with the Carbon framework for the terminal version, for
+ the MacRoman conversion functions. (Eckehard Berns)
+ Remove -ltermcap from the GUI link command, it is not needed.
+Files: src/auto/configure, src/Makefile, src/configure.in
+
+Patch 6.2.504
+Problem: Various problems with 'cindent', among which that a
+ list of variable declarations is not indented properly.
+Solution: Fix the wrong indenting. Improve indenting of C++ methods.
+ Add the 'i', 'b' and 'W' options to 'cinoptions'. (mostly by
+ Helmut Stiegler)
+ Improve indenting of preprocessor-continuation lines.
+Files: runtime/doc/indent.txt, src/misc1.c, src/testdir/test3.in,
+ src/testdir/test3.ok
+
+Patch 6.2.505
+Problem: Help for -P argument is missing. (Ronald Hoellwarth)
+Solution: Add the patch that was missing in 6.2.419.
+Files: runtime/doc/starting.txt
+
+Patch 6.2.506 (extra)
+Problem: Win32: When 'encoding' is a codepage then reading a utf-8 file
+ only works when iconv is available. Writing a file in another
+ codepage uses the wrong kind of conversion.
+Solution: Use internal conversion functions. Enable reading and writing
+ files with 'fileencoding' different from 'encoding' for all valid
+ codepages and utf-8 without the need for iconv.
+Files: src/fileio.c, src/testdir/Make_dos.mak, src/testdir/test52.in,
+ src/testdir/test52.ok
+
+Patch 6.2.507
+Problem: The ownership of the file with the password for the NetBeans
+ connection is not checked. "-nb={file}" doesn't work for GTK.
+Solution: Only accept the file when owned by the user and not accessible by
+ others. Detect "-nb=" for GTK.
+Files: src/netbeans.c, src/gui_gtk_x11.c
+
+Patch 6.2.508
+Problem: Win32: "v:lang" does not show the current language for messages if
+ it differs from the other locale settings.
+Solution: Use the value of the $LC_MESSAGES environment variable.
+Files: src/ex_cmds2.c
+
+Patch 6.2.509 (after 6.2.508)
+Problem: Crash when $LANG is not set.
+Solution: Add check for NULL pointer. (Ron Aaron)
+Files: src/ex_cmds2.c
+
+Patch 6.2.510 (after 6.2.507)
+Problem: Warning for pointer conversion.
+Solution: Add a type cast.
+Files: src/gui_gtk_x11.c
+
+Patch 6.2.511
+Problem: Tags in Russian help files are in utf-8 encoding, which may be
+ different from 'encoding'.
+Solution: Use the "TAG_FILE_ENCODING" field in the tags file to specify the
+ encoding of the tags. Convert help tags from 'encoding' to the
+ tag file encoding when searching for matches, do the reverse when
+ listing help tags.
+Files: runtime/doc/tagsrch.txt, src/ex_cmds.c, src/tag.c
+
+Patch 6.2.512
+Problem: Translating "\"\n" is useless. (Gerfried Fuchs)
+Solution: Remove the _() around it.
+Files: src/main.c, src/memline.c
+
+Patch 6.2.513 (after 6.2.507)
+Problem: NetBeans: the check for owning the connection info file can be
+ simplified. (Nikolay Molchanov)
+Solution: Only check if the access mode is right.
+Files: src/netbeans.c
+
+Patch 6.2.514
+Problem: When a highlight/syntax group name contains invalid characters
+ there is no warning.
+Solution: Add an error for unprintable characters and a warning for other
+ invalid characters.
+Files: src/syntax.c
+
+Patch 6.2.515
+Problem: When using the options window 'swapfile' is reset.
+Solution: Use ":setlocal" instead of ":set".
+Files: runtime/optwin.vim
+
+Patch 6.2.516
+Problem: The sign column cannot be seen, looks like there are two spaces
+ before the text. (Rob Retter)
+Solution: Add the SignColumn highlight group.
+Files: runtime/doc/options.txt, runtime/doc/sign.txt, src/option.c,
+ src/screen.c, src/syntax.c, src/vim.h
+
+Patch 6.2.517
+Problem: Using "r*" in Visual mode on multibyte characters replaces
+ too many characters. In Visual Block mode replacing with a
+ multibyte character doesn't work.
+Solution: Adjust the operator end for the difference in byte length of the
+ original and the replaced character. Insert all bytes of a
+ multibyte character, take care of double-wide characters.
+Files: src/ops.c
+
+Patch 6.2.518
+Problem: Last line of a window is not updated after using "J" and then "D".
+ (Adri Verhoef)
+Solution: When no line is found below a change that doesn't need updating,
+ update all lines below the change.
+Files: src/screen.c
+
+Patch 6.2.519
+Problem: Mac: cannot read/write files in MacRoman format.
+Solution: Do internal conversion from/to MacRoman to/from utf-8 and latin1.
+ (Eckehard Berns)
+Files: src/fileio.c
+
+Patch 6.2.520 (extra)
+Problem: The NSIS installer is outdated.
+Solution: Make it work with NSIS 2.0. Also include console executables for
+ Win 95/98/ME and Win NT/2000/XP. Use LZWA compression. Use
+ "/oname" to avoid having to rename files before running NSIS.
+Files: Makefile, nsis/gvim.nsi
+
+Patch 6.2.521
+Problem: When using silent Ex mode the "changing a readonly file" warning
+ is omitted but the one second wait isn't. (Yakov Lerner)
+Solution: Skip the delay when "silent_mode" is set.
+Files: src/misc1.c
+
+Patch 6.2.522
+Problem: GUI: when changing 'cmdheight' in the gvimrc file the window
+ layout is messed up. (Keith Dart)
+Solution: Skip updating the window layout when changing 'cmdheight' while
+ still starting up.
+Files: src/option.c
+
+Patch 6.2.523
+Problem: When loading a session and aborting when a swap file already
+ exists, the user is left with useless windows. (Robert Webb)
+Solution: Load one file before creating the windows.
+Files: src/ex_docmd.c
+
+Patch 6.2.524 (extra, after 6.2.520)
+Problem: Win32: (un)installing gvimext.dll may fail if it was used.
+ The desktop and start menu links are created for the current user
+ instead of all users.
+ Using the home directory as working directory for the links is a
+ bad idea for multi-user systems.
+ Cannot use Vim from the "Open With..." menu.
+Solution: Force a reboot if necessary. (Alejandro Lopez-Valencia) Also use
+ macros for the directory of the source and runtime files. Use
+ "CSIDL_COMMON_*" instead of "CSIDL_*" when possible.
+ Do not specify a working directory in the links.
+ Add Vim to the "Open With..." menu. (Giuseppe Bilotta)
+Files: nsis/gvim.nsi, src/dosinst.c, src/dosinst.h, src/uninstal.c
+
+Patch 6.2.525
+Problem: When the history contains a very long line ":history" causes a
+ crash. (Volker Kiefel)
+Solution: Shorten the history entry to fit it in one line.
+Files: src/ex_getln.c
+
+Patch 6.2.526
+Problem: When s:lang is "ja" the Japanese menus are not used.
+Solution: Add 'encoding' to the language when there is no charset.
+Files: runtime/menu.vim
+
+Patch 6.2.527
+Problem: The 2html script uses ":wincmd p", which breaks when using some
+ autocommands.
+Solution: Remember the window numbers and jump to them with ":wincmd w".
+ Also add XHTML support. (Panagiotis Issaris)
+Files: runtime/syntax/2html.vim
+
+Patch 6.2.528
+Problem: NetBeans: Changes of the "~" command are not reported.
+Solution: Call netbeans_inserted() after performing "~". (Gordon Prieur)
+ Also change NetBeans debugging to append to the log file.
+ Also fix that "~" in Visual block mode changes too much if there
+ are multibyte characters.
+Files: src/nbdebug.c, src/normal.c, src/ops.c
+
+Patch 6.2.529 (extra)
+Problem: VisVim only works for Admin. Doing it for one user doesn't work.
+ (Alexandre Gouraud)
+Solution: When registering the module fails, simply continue.
+Files: src/VisVim/VisVim.cpp
+
+Patch 6.2.530
+Problem: Warning for missing prototype on the Amiga.
+Solution: Include time.h
+Files: src/version.c
+
+Patch 6.2.531
+Problem: In silent ex mode no messages are given, which makes debugging
+ very difficult.
+Solution: Do output messages when 'verbose' is set.
+Files: src/message.c, src/ui.c
+
+Patch 6.2.532 (extra)
+Problem: Compiling for Win32s with VC 4.1 doesn't work.
+Solution: Don't use CP_UTF8 if it's not defined. Don't use CSIDL_COMMON*
+ when not defined.
+Files: src/dosinst.h, src/fileio.c
+
+Win32 console: After patch 6.2.398 Ex mode did not work. (Yasuhiro Matsumoto)
+
+Patch 6.3a.001
+Problem: Win32: if testing for the "--binary" option fails, diff isn't used
+ at all.
+Solution: Handle the "ok" flag properly. (Yasuhiro Matsumoto)
+Files: src/diff.c
+
+Patch 6.3a.002
+Problem: NetBeans: An insert command from NetBeans beyond the end of a
+ buffer crashes Vim. (Xavier de Gaye)
+Solution: Use a local pos_T structure for the position.
+Files: src/netbeans.c
+
+Patch 6.3a.003
+Problem: E315 error with auto-formatting comments. (Henry Van Roessel)
+Solution: Pass the line number to same_leader().
+Files: src/ops.c
+
+Patch 6.3a.004
+Problem: Test32 fails on Windows XP for the DJGPP version. Renaming
+ test11.out fails.
+Solution: Don't try renaming, create new files to use for the test.
+Files: src/testdir/test32.in, src/testdir/test32.ok
+
+Patch 6.3a.005
+Problem: ":checkpath!" does not use 'includeexpr'.
+Solution: Use a file name that was found directly. When a file was not
+ found and the located name is empty, use the rest of the line.
+Files: src/search.c
+
+Patch 6.3a.006
+Problem: "yip" moves the cursor to the first yanked line, but not to the
+ first column. Looks like not all text was yanked. (Jens Paulus)
+Solution: Move the cursor to the first column.
+Files: src/search.c
+
+Patch 6.3a.007
+Problem: 'cindent' recognizes "enum" but not "typedef enum".
+Solution: Skip over "typedef" before checking for "enum". (Helmut Stiegler)
+ Also avoid that searching for this item goes too far back.
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 6.3a.008 (extra)
+Problem: Windows 98: Some of the wide functions are not implemented,
+ resulting in file I/O to fail. This depends on what Unicode
+ support is installed.
+Solution: Handle the failure and fall back to non-wide functions.
+Files: src/os_win32.c
+
+Patch 6.3a.009
+Problem: Win32: Completion of filenames does not work properly when
+ 'encoding' differs from the active code page.
+Solution: Use wide functions for expanding wildcards when appropriate.
+Files: src/misc1.c
+
+Patch 6.3a.010 (extra)
+Problem: Win32: Characters in the window title that do not appear in the
+ active codepage are replaced by a question mark.
+Solution: Use DefWindowProcW() instead of DefWindowProc() when possible.
+Files: src/glbl_ime.cpp, src/globals.h, src/proto/gui_w16.pro,
+ src/proto/gui_w32.pro, src/gui_w16.c, src/gui_w32.c, src/gui_w48.c
+
+Patch 6.3a.011
+Problem: Using the explorer plugin changes a local directory to the global
+ directory.
+Solution: Don't use ":chdir" to restore the current directory. Make
+ "expand('%:p')" remove "/../" and "/./" items from the path.
+Files: runtime/plugin/explorer.vim, src/eval.c, src/os_unix.c
+
+Patch 6.3a.012 (extra)
+Problem: On Windows 98 the installer doesn't work, don't even get the "I
+ agree" button. The check for the path ending in "vim" makes the
+ browse dialog hard to use. The default path when no previous Vim
+ is installed is "c:\vim" instead of "c:\Program Files\Vim".
+Solution: Remove the background gradient command. Change the
+ .onVerifyInstDir function to a leave function for the directory
+ page. Don't let the install program default to c:\vim when no
+ path could be found.
+Files: nsis/gvim.nsi, src/dosinst.c
+
+Patch 6.3a.013 (extra)
+Problem: Win32: Characters in the menu that are not in the active codepage
+ are garbled.
+Solution: Convert menu strings from 'encoding' to the active codepage.
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 6.3a.014
+Problem: Using multibyte text and highlighting in a statusline causes gaps
+ to appear. (Helmut Stiegler)
+Solution: Advance the column by text width instead of number of bytes. Add
+ the vim_strnsize() function.
+Files: src/charset.c, src/proto/charset.pro, src/screen.c
+
+Patch 6.3a.015
+Problem: Using the "select all" menu item when 'insertmode' is set and
+ clicking the mouse button doesn't return to Insert mode. The
+ Buffers/Delete menu doesn't offer a choice to abandon a changed
+ buffer. (Jens Paulus)
+Solution: Don't use CTRL-\ CTRL-N. Add ":confirm" for the Buffers menu
+ items.
+Files: runtime/menu.vim
+
+Patch 6.3a.016
+Problem: After cancelling the ":confirm" dialog the error message and
+ hit-enter prompt may not be displayed properly.
+Solution: Flush output after showing the dialog.
+Files: src/message.c
+
+Patch 6.3a.017
+Problem: servername() doesn't work when Vim was started with the "-X"
+ argument or when the "exclude" in 'clipboard' matches the terminal
+ name. (Robert Nowotniak)
+Solution: Force connecting to the X server when using client-server
+ commands.
+Files: src/eval.c, src/globals.h, src/os_unix.c
+
+Patch 6.3a.018 (after 6.3a.017)
+Problem: Compiler warning for return value of make_connection().
+Solution: Use void return type.
+Files: src/eval.c
+
+Patch 6.3a.019 (extra)
+Problem: Win32: typing non-latin1 characters doesn't work.
+Solution: Invoke _OnChar() directly to avoid that the argument is truncated
+ to a byte. Convert the UTF-16 character to bytes according to
+ 'encoding' and ignore 'termencoding'. Same for _OnSysChar().
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 6.3a.020 (extra)
+Problem: Missing support for AROS (AmigaOS reimplementation). Amiga GUI
+ doesn't work.
+Solution: Add AROS support. (Adam Chodorowski)
+ Fix Amiga GUI problems. (Georg Steger, Ali Akcaagac)
+Files: Makefile, src/Make_aros.mak, src/gui_amiga.c, src/gui_amiga.h,
+ src/memfile.c, src/os_amiga.c, src/term.c
+
+Patch 6.3a.021 (after 6.3a.017)
+Problem: Can't compile with X11 but without GUI.
+Solution: Put use of "gui.in_use" inside an #ifdef.
+Files: src/eval.c
+
+Patch 6.3a.022
+Problem: When typing Tabs when 'softtabstop' is used and 'list' is set a
+ tab is counted for two spaces.
+Solution: Use the "L" flag in 'cpoptions' to tell whether a tab is counted
+ as two spaces or as 'tabstop'. (Antony Scriven)
+Files: runtime/doc/options.txt, src/edit.c
+
+Patch 6.3a.023
+Problem: Completion on the command line doesn't handle backslashes
+ properly. Only the tail of matches is shown, even when not
+ completing filenames.
+Solution: When turning the string into a pattern double backslashes. Don't
+ omit the path when not expanding files or directories.
+Files: src/ex_getln.c
+
+Patch 6.3a.024
+Problem: The "save all" toolbar item fails for buffers that don't have a
+ name. When using ":wa" or closing the Vim window and there are
+ nameless buffers, browsing for a name may cause the name being
+ given to the wrong buffer or not stored properly. ":browse" only
+ worked for one file.
+Solution: Use ":confirm browse" for "save all".
+ Pass buffer argument to setfname(). Restore "browse" flag and
+ "forceit" after doing the work for one file.
+Files: runtime/menu.vim, src/buffer.c, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/fileio.c, src/memline.c,
+ src/message.c, src/window.c, src/proto/buffer.pro,
+ src/proto/ex_cmds2.pro, src/proto/memline.pro
+
+Patch 6.3a.025
+Problem: Setting 'virtualedit' moves the cursor. (Benji Fisher)
+Solution: Update the virtual column before using it.
+Files: src/option.c
+
+Patch 6.3a.026 (extra, after 6.3a.008)
+Problem: Editing files on Windows 98 doesn't work when 'encoding' is
+ "utf-8" (Antoine Mechelynck)
+ Warning for missing function prototype.
+Solution: For all wide functions check if it failed because it is not
+ implemented. Use ANSI function declaration for char_to_string().
+Files: src/gui_w48.c, src/os_mswin.c, src/os_win32.c
+
+Patch 6.3a.027 (extra, after 6.3a.026)
+Problem: Compiler warning for function argument.
+Solution: Declare both char and WCHAR arrays.
+Files: src/gui_w48.c
+
+Patch 6.3a.028
+Problem: ":normal ." doesn't work inside a function, because redo is saved
+ and restored. (Benji Fisher)
+Solution: Make a copy of the redo buffer when executing a function.
+Files: src/getchar.c
+
+Patch 6.3b.001 (extra)
+Problem: Bcc 5: The generated auto/pathdef can't be compiled.
+Solution: Fix the way quotes and backslashes are escaped.
+Files: src/Make_bc5.mak
+
+Patch 6.3b.002
+Problem: Win32: conversion during file write fails when a double-byte
+ character is split over two writes.
+Solution: Fix the conversion retry without a trailing byte. (Taro Muraoka)
+Files: src/fileio.c
+
+Patch 6.3b.003 (extra)
+Problem: Win32: When compiling with Borland C 5.5 and 'encoding' is "utf-8"
+ then Vim can't open files under MS-Windows 98. (Antoine J.
+ Mechelynck)
+Solution: Don't use _wstat(), _wopen() and _wfopen() in this situation.
+Files: src/os_mswin.c, src/os_win32.c
+
+Patch 6.3b.004
+Problem: ":helpgrep" includes a trailing CR in the text line.
+Solution: Remove the CR.
+Files: src/quickfix.c
+
+Patch 6.3b.005
+Problem: ":echo &g:ai" results in the local option value. (Salman Halim)
+Solution: Pass the flags from find_option_end() to get_option_value().
+Files: src/eval.c
+
+Patch 6.3b.006
+Problem: When using "mswin.vim", CTRL-V in Insert mode leaves cursor before
+ last pasted character. (Mathew Davis)
+Solution: Use the same Paste() function as in menu.vim.
+Files: runtime/mswin.vim
+
+Patch 6.3b.007
+Problem: Session file doesn't restore view on windows properly. (Robert
+ Webb)
+Solution: Restore window sizes both before and after restoring the view, so
+ that the view, cursor position and size are restored properly.
+Files: src/ex_docmd.c
+
+Patch 6.3b.008
+Problem: Using ":finally" in a user command doesn't always work. (Hari
+ Krishna Dara)
+Solution: Don't assume that using getexline() means the command was typed.
+Files: src/ex_docmd.c
+
+Patch 6.3b.009 (extra)
+Problem: Win32: When the -P argument is not found in a window title, there
+ is no error message.
+Solution: When the window can't be found give an error message and exit.
+ Also use try/except to catch failing to open the MDI window.
+ (Michael Wookey)
+Files: src/gui_w32.c
+
+Patch 6.3b.010
+Problem: Win32: Using the "-D" argument and expanding arguments may cause a
+ hang, because the terminal isn't initialized yet. (Vince Negri)
+Solution: Don't go into debug mode before the terminal is initialized.
+Files: src/main.c
+
+Patch 6.3b.011
+Problem: Using CTRL-\ e while obtaining an expression aborts the command
+ line. (Hari Krishna Dara)
+Solution: Insert the CTRL-\ e as typed.
+Files: src/ex_getln.c
+
+Patch 6.3b.012 (after 6.3b.010)
+Problem: Can't compile with tiny features. (Norbert Tretkowski)
+Solution: Add #ifdefs.
+Files: src/main.c
+
+Patch 6.3b.013
+Problem: Loading a session file results in editing the wrong file in the
+ first window when this is not the file at the current position in
+ the argument list. (Robert Webb)
+Solution: Check w_arg_idx_invalid to decide whether to edit a file.
+Files: src/ex_docmd.c
+
+Patch 6.3b.014
+Problem: ":runtime! foo*.vim" may using freed memory when a sourced script
+ changes the value of 'runtimepath'.
+Solution: Make a copy of 'runtimepath' when looping over the matches.
+Files: src/ex_cmds2.c
+
+Patch 6.3b.015
+Problem: Get lalloc(0) error when using "p" in Visual mode while
+ 'clipboard' contains "autoselect,unnamed". (Mark Wagonner)
+Solution: Avoid allocating zero bytes. Obtain the clipboard when necessary.
+Files: src/ops.c
+
+Patch 6.3b.016
+Problem: When 'virtualedit' is used "x" doesn't delete the last character
+ of a line that has as many characters as 'columns'. (Yakov Lerner)
+Solution: When the cursor isn't moved let oneright() return FAIL.
+Files: src/edit.c
+
+Patch 6.3b.017
+Problem: Win32: "vim --remote-wait" doesn't exit when the server finished
+ editing the file. (David Fishburn)
+Solution: In the rrhelper plugin change backslashes to forward slashes and
+ escape special characters.
+Files: runtime/plugin/rrhelper.vim
+
+Patch 6.3b.018
+Problem: The list of help files in the "local additions" table doesn't
+ recognize utf-8 encoding. (Yasuhiro Matsumoto)
+Solution: Recognize utf-8 characters.
+Files: src/ex_cmds.c
+
+Patch 6.3b.019
+Problem: When $VIMRUNTIME is not a full path name the "local additions"
+ table lists all the help files.
+Solution: Use fullpathcmp() instead of fnamecmp() to compare the directory
+ names.
+Files: src/ex_cmds.c
+
+Patch 6.3b.020
+Problem: When using CTRL-^ when entering a search string, the item in the
+ statusline that indicates the keymap is not updated. (Ilya
+ Dogolazky)
+Solution: Mark the statuslines for updating.
+Files: src/ex_getln.c
+
+Patch 6.3b.021
+Problem: The swapfile is not readable for others, the ATTENTION prompt does
+ not show all info when someone else is editing the same file.
+ (Marcel Svitalsky)
+Solution: Use the protection of original file for the swapfile and set it
+ after creating the swapfile.
+Files: src/fileio.c
+
+Patch 6.3b.022
+Problem: Using "4v" to select four times the old Visual area may put the
+ cursor beyond the end of the line. (Jens Paulus)
+Solution: Correct the cursor column.
+Files: src/normal.c
+
+Patch 6.3b.023
+Problem: When "3dip" starts in an empty line, white lines after the
+ non-white lines are not deleted. (Jens Paulus)
+Solution: Include the white lines.
+Files: src/search.c
+
+Patch 6.3b.024
+Problem: "2daw" does not delete leading white space like "daw" does. (Jens
+ Paulus)
+Solution: Include the white space when a count is used.
+Files: src/search.c
+
+Patch 6.3b.025
+Problem: Percentage in ruler isn't updated when a line is deleted. (Jens
+ Paulus)
+Solution: Check for a change in line count when deciding to update the ruler.
+Files: src/screen.c, src/structs.h
+
+Patch 6.3b.026
+Problem: When selecting "abort" at the ATTENTION prompt for a file that is
+ already being edited Vim crashes.
+Solution: Don't abort creating a new buffer when we really need it.
+Files: src/buffer.c, src/vim.h
+
+Patch 6.3b.027
+Problem: Win32: When enabling the menu in a maximized window, Vim uses more
+ lines than what is room for. (Shizhu Pan)
+Solution: When deciding to call shell_resized(), also compare the text area
+ size with Rows and Columns, not just with screen_Rows and
+ screen_Columns.
+Files: src/gui.c
+
+Patch 6.3b.028
+Problem: When in diff mode, setting 'rightleft' causes a crash. (Eddine)
+Solution: Check for last column differently when 'rightleft' is set.
+Files: src/screen.c
+
+Patch 6.3b.029
+Problem: Win32: warning for uninitialized variable.
+Solution: Initialize to zero.
+Files: src/misc1.c
+
+Patch 6.3b.030
+Problem: After Visually selecting four characters, changing it to other
+ text, Visually selecting and yanking two characters: "." changes
+ four characters, another "." changes two characters. (Robert Webb)
+Solution: Don't store the size of the Visual area when redo is active.
+Files: src/normal.c
+
+==============================================================================
+VERSION 6.4 *version-6.4*
+
+This section is about improvements made between version 6.3 and 6.4.
+
+This is a bug-fix release. There are also a few new features. The major
+number of new items is in the runtime files and translations.
+
+The big MS-Windows version now uses:
+ Ruby version 1.8.3
+ Perl version 5.8.7
+ Python version 2.4.2
+
+
+Changed *changed-6.4*
+-------
+
+Removed runtime/tools/tcltags, Exuberant ctags does it better.
+
+
+Added *added-6.4*
+-----
+
+Alsaconf syntax file (Nikolai Weibull)
+Eruby syntax, indent, compiler and ftplugin file (Doug Kearns)
+Esterel syntax file (Maurizio Tranchero)
+Mathematica indent file (Steve Layland)
+Netrc syntax file (Nikolai Weibull)
+PHP compiler file (Doug Kearns)
+Pascal indent file (Neil Carter)
+Prescribe syntax file (Klaus Muth)
+Rubyunit compiler file (Doug Kearns)
+SMTPrc syntax file (Kornel Kielczewski)
+Sudoers syntax file (Nikolai Weibull)
+TPP syntax file (Gerfried Fuchs)
+VHDL ftplugin file (R. Shankar)
+Verilog-AMS syntax file (S. Myles Prather)
+
+Bulgarian keymap (Alberto Mardegan)
+Canadian keymap (Eric Joanis)
+
+Hungarian menu translations in UTF-8 (Kantra Gergely)
+Ukrainian menu translations (Bohdan Vlasyuk)
+
+Irish message translations (Kevin Patrick Scannell)
+
+Configure also checks for tclsh8.4.
+
+
+Fixed *fixed-6.4*
+-----
+
+"dFxd;" deleted the character under the cursor, "d;" didn't remember the
+exclusiveness of the motion.
+
+When using "set laststatus=2 cmdheight=2" in the .gvimrc you may only get one
+line for the cmdline. (Christian Robinson) Invoke command_height() after the
+GUI has started up.
+
+Gcc would warn "dereferencing type-punned pointer will break strict -aliasing
+rules". Avoid using typecasts for variable pointers.
+
+Gcc 3.x interprets the -MM argument differently. Change "-I /path" to
+"-isystem /path" for "make depend".
+
+
+Patch 6.3.001
+Problem: ":browse split" gives the file selection dialog twice. (Gordon
+ Bazeley) Same problem for ":browse diffpatch".
+Solution: Reset cmdmod.browse before calling do_ecmd().
+Files: src/diff.c, src/ex_docmd.c
+
+Patch 6.3.002
+Problem: When using translated help files with non-ASCII latin1 characters
+ in the first line the utf-8 detection is wrong.
+Solution: Properly detect utf-8 characters. When a mix of encodings is
+ detected continue with the next language and avoid a "no matches"
+ error because of "got_int" being set. Add the directory name to
+ the error message for a duplicate tag.
+Files: src/ex_cmds.c
+
+Patch 6.3.003
+Problem: Crash when using a console dialog and the first choice does not
+ have a default button. (Darin Ohashi)
+Solution: Allocate two more characters for the [] around the character for
+ the default choice.
+Files: src/message.c
+
+Patch 6.3.004
+Problem: When searching for a long string (140 chars in a 80 column
+ terminal) get three hit-enter prompts. (Robert Webb)
+Solution: Avoid the hit-enter prompt when giving the message for wrapping
+ around the end of the buffer. Don't give that message again when
+ the string was not found.
+Files: src/message.c, src/search.c
+
+Patch 6.3.005
+Problem: Crash when searching for a pattern with a character offset and
+ starting in a closed fold. (Frank Butler)
+Solution: Check for the column to be past the end of the line. Also fix
+ that a pattern with a character offset relative to the end isn't
+ read back from the viminfo properly.
+Files: src/search.c
+
+Patch 6.3.006
+Problem: ":breakadd file *foo" prepends the current directory to the file
+ pattern. (Hari Krishna Dara)
+Solution: Keep the pattern as-is.
+Files: src/ex_cmds2.c
+
+Patch 6.3.007
+Problem: When there is a buffer with 'buftype' set to "nofile" and using a
+ ":cd" command, the swap file is not deleted when exiting.
+Solution: Use the full path of the swap file also for "nofile" buffers.
+Files: src/fileio.c
+
+Patch 6.3.008
+Problem: Compiling fails under OS/2.
+Solution: Include "e_screenmode" also for OS/2. (David Sanders)
+Files: src/globals.h
+
+Patch 6.3.009 (after 6.3.006)
+Problem: ":breakadd file /path/foo.vim" does not match when a symbolic link
+ is involved. (Servatius Brandt)
+Solution: Do expand the pattern when it does not start with "*".
+Files: runtime/doc/repeat.txt, src/ex_cmds2.c
+
+Patch 6.3.010
+Problem: When writing to a named pipe there is an error for fsync()
+ failing.
+Solution: Ignore the fsync() error for devices.
+Files: src/fileio.c
+
+Patch 6.3.011
+Problem: Crash when the completion function of a user-command uses a
+ "normal :cmd" command. (Hari Krishna Dara)
+Solution: Save the command line when invoking the completion function.
+Files: src/ex_getln.c
+
+Patch 6.3.012
+Problem: Internal lalloc(0) error when using a complicated multi-line
+ pattern in a substitute command. (Luc Hermitte)
+Solution: Avoid going past the end of a line.
+Files: src/ex_cmds.c
+
+Patch 6.3.013
+Problem: Crash when editing a command line and typing CTRL-R = to evaluate
+ a function that uses "normal :cmd". (Hari Krishna Dara)
+Solution: Save and restore the command line when evaluating an expression
+ for CTRL-R =.
+Files: src/ex_getln.c, src/ops.c, src/proto/ex_getln.pro,
+ src/proto/ops.pro
+
+Patch 6.3.014
+Problem: When using Chinese or Taiwanese the default for 'helplang' is
+ wrong. (Simon Liang)
+Solution: Use the part of the locale name after "zh_".
+Files: src/option.c
+
+Patch 6.3.015
+Problem: The string that winrestcmd() returns may end in garbage.
+Solution: NUL-terminate the string. (Walter Briscoe)
+Files: src/eval.c
+
+Patch 6.3.016
+Problem: The default value for 'define' has "\s" before '#'.
+Solution: Add a star after "\s". (Herculano de Lima Einloft Neto)
+Files: src/option.c
+
+Patch 6.3.017
+Problem: "8zz" may leave the cursor beyond the end of the line. (Niko
+ Maatjes)
+Solution: Correct the cursor column after moving to another line.
+Files: src/normal.c
+
+Patch 6.3.018
+Problem: ":0argadd zero" added the argument after the first one, instead of
+ before it. (Adri Verhoef)
+Solution: Accept a zero range for ":argadd".
+Files: src/ex_cmds.h
+
+Patch 6.3.019
+Problem: Crash in startup for debug version. (David Rennals)
+Solution: Move the call to nbdebug_wait() to after allocating NameBuff.
+Files: src/main.c
+
+Patch 6.3.020
+Problem: When 'encoding' is "utf-8" and 'delcombine' is set, "dw" does not
+ delete a word but only a combining character of the first
+ character, if there is one. (Raphael Finkel)
+Solution: Correctly check that one character is being deleted.
+Files: src/misc1.c
+
+Patch 6.3.021
+Problem: When the last character of a file name is a multibyte character
+ and the last byte is a path separator, the file cannot be edited.
+Solution: Check for the last byte to be part of a multibyte character.
+ (Taro Muraoka)
+Files: src/fileio.c
+
+Patch 6.3.022 (extra)
+Problem: Win32: When the last character of a file name is a multibyte
+ character and the last byte is a path separator, the file cannot
+ be written. A trail byte that is a space makes that a file cannot
+ be opened from the command line.
+Solution: Recognize double-byte characters when parsing the command line.
+ In mch_stat() check for the last byte to be part of a multibyte
+ character. (Taro Muraoka)
+Files: src/gui_w48.c, src/os_mswin.c
+
+Patch 6.3.023
+Problem: When the "to" part of a mapping starts with its "from" part,
+ abbreviations for the same characters is not possible. For
+ example, when <Space> is mapped to something that starts with a
+ space, typing <Space> does not expand abbreviations.
+Solution: Only disable expanding abbreviations when a mapping is not
+ remapped, don't disable it when the RHS of a mapping starts with
+ the LHS.
+Files: src/getchar.c, src/vim.h
+
+Patch 6.3.024
+Problem: In a few places a string in allocated memory is not terminated
+ with a NUL.
+Solution: Add ga_append(NUL) in script_get(), gui_do_findrepl() and
+ serverGetVimNames().
+Files: src/ex_getln.c, src/gui.c, src/if_xcmdsrv.c, src/os_mswin.c
+
+Patch 6.3.025 (extra)
+Problem: Missing NUL for list of server names.
+Solution: Add ga_append(NUL) in serverGetVimNames().
+Files: src/os_mswin.c
+
+Patch 6.3.026
+Problem: When ~/.vim/after/syntax/syncolor.vim contains a command that
+ reloads the colors an endless loop and/or a crash may occur.
+Solution: Only free the old value of an option when it was originally
+ allocated. Limit recursiveness of init_highlight() to 5 levels.
+Files: src/option.c, src/syntax.c
+
+Patch 6.3.027
+Problem: VMS: Writing a file may insert extra CR characters. Not all
+ terminals are recognized correctly. Vt320 doesn't support colors.
+ Environment variables are not expanded correctly.
+Solution: Use another method to write files. Add vt320 termcap codes for
+ colors. (Zoltan Arpadffy)
+Files: src/fileio.c, src/misc1.c, src/os_unix.c, src/structs.h,
+ src/term.c
+
+Patch 6.3.028
+Problem: When appending to a file the BOM marker may be written. (Alex
+ Jakushev)
+Solution: Do not write the BOM marker when appending.
+Files: src/fileio.c
+
+Patch 6.3.029
+Problem: Crash when inserting a line break. (Walter Briscoe)
+Solution: In the syntax highlighting code, don't use an old state after a
+ change was made, current_col may be past the end of the line.
+Files: src/syntax.c
+
+Patch 6.3.030
+Problem: GTK 2: Crash when sourcing a script that deletes the menus, sets
+ 'encoding' to "utf-8" and loads the menus again. GTK error
+ message when tooltip text is in a wrong encoding.
+Solution: Don't copy characters from the old screen to the new screen when
+ switching 'encoding' to utf-8, they may be invalid. Only set the
+ tooltip when it is valid utf-8.
+Files: src/gui_gtk.c, src/mbyte.c, src/proto/mbyte.pro, src/screen.c
+
+Patch 6.3.031
+Problem: When entering a mapping and pressing Tab halfway the command line
+ isn't redrawn properly. (Adri Verhoef)
+Solution: Reposition the cursor after drawing over the "..." of the
+ completion attempt.
+Files: src/ex_getln.c
+
+Patch 6.3.032
+Problem: Using Python 2.3 with threads doesn't work properly.
+Solution: Release the lock after initialization.
+Files: src/if_python.c
+
+Patch 6.3.033
+Problem: When a mapping ends in a Normal mode command of more than one
+ character Vim doesn't return to Insert mode.
+Solution: Check that the mapping has ended after obtaining all characters of
+ the Normal mode command.
+Files: src/normal.c
+
+Patch 6.3.034
+Problem: VMS: crash when using ":help".
+Solution: Avoid using "tags-??", some Open VMS systems can't handle the "?"
+ wildcard. (Zoltan Arpadffy)
+Files: src/tag.c
+
+Patch 6.3.035 (extra)
+Problem: RISC OS: Compile errors.
+Solution: Change e_screnmode to e_screenmode. Change the way
+ __riscosify_control is set. Improve the makefile. (Andy Wingate)
+Files: src/os_riscos.c, src/search.c, src/Make_ro.mak
+
+Patch 6.3.036
+Problem: ml_get errors when the whole file is a fold, switching
+ 'foldmethod' and doing "zj". (Christian J. Robinson) Was not
+ deleting the fold but creating a fold with zero lines.
+Solution: Delete the fold properly.
+Files: src/fold.c
+
+Patch 6.3.037 (after 6.3.032)
+Problem: Warning for unused variable.
+Solution: Change the #ifdefs for the saved thread stuff.
+Files: src/if_python.c
+
+Patch 6.3.038 (extra)
+Problem: Win32: When the "file changed" dialog pops up after a click that
+ gives gvim focus and not moving the mouse after that, the effect
+ of the click may occur when moving the mouse later. (Ken Clark)
+ Happened because the release event was missed.
+Solution: Clear the s_button_pending variable when any input is received.
+Files: src/gui_w48.c
+
+Patch 6.3.039
+Problem: When 'number' is set and inserting lines just above the first
+ displayed line (in another window on the same buffer), the line
+ numbers are not updated. (Hitier Sylvain)
+Solution: When 'number' is set and lines are inserted/deleted redraw all
+ lines below the change.
+Files: src/screen.c
+
+Patch 6.3.040
+Problem: Error handling does not always work properly and may cause a
+ buffer to be marked as if it's viewed in a window while it isn't.
+ Also when selecting "Abort" at the attention prompt.
+Solution: Add enter_cleanup() and leave_cleanup() functions to move
+ saving/restoring things for error handling to one place.
+ Clear a buffer read error when it's unloaded.
+Files: src/buffer.c, src/ex_docmd.c, src/ex_eval.c,
+ src/proto/ex_eval.pro, src/structs.h, src/vim.h
+
+Patch 6.3.041 (extra)
+Problem: Win32: When the path to a file has Russian characters, ":cd %:p:h"
+ doesn't work. (Valery Kondakoff)
+Solution: Use a wide function to change directory.
+Files: src/os_mswin.c
+
+Patch 6.3.042
+Problem: When there is a closed fold at the top of the window, CTRL-X
+ CTRL-E in Insert mode reduces the size of the fold instead of
+ scrolling the text up. (Gautam)
+Solution: Scroll over the closed fold.
+Files: src/move.c
+
+Patch 6.3.043
+Problem: 'hlsearch' highlighting sometimes disappears when inserting text
+ in PHP code with syntax highlighting. (Marcel Svitalsky)
+Solution: Don't use pointers to remember where a match was found, use an
+ index. The pointers may become invalid when searching in other
+ lines.
+Files: src/screen.c
+
+Patch 6.3.044 (extra)
+Problem: Mac: When 'linespace' is non-zero the Insert mode cursor leaves
+ pixels behind. (Richard Sandilands)
+Solution: Erase the character cell before drawing the text when needed.
+Files: src/gui_mac.c
+
+
+Patch 6.3.045
+Problem: Unusual characters in an option value may cause unexpected
+ behavior, especially for a modeline. (Ciaran McCreesh)
+Solution: Don't allow setting termcap options or 'printdevice' in a
+ modeline. Don't list options for "termcap" and "all" in a
+ modeline. Don't allow unusual characters in 'filetype', 'syntax',
+ 'backupext', 'keymap', 'patchmode' and 'langmenu'.
+Files: src/option.c, runtime/doc/options.txt
+
+Patch 6.3.046
+Problem: ":registers" doesn't show multibyte characters properly.
+ (Valery Kondakoff)
+Solution: Get the length of each character before displaying it.
+Files: src/ops.c
+
+Patch 6.3.047 (extra)
+Problem: Win32 with Borland C 5.5 on Windows XP: A new file is created with
+ read-only attributes. (Tony Mechelynck)
+Solution: Don't use the _wopen() function for Borland.
+Files: src/os_win32.c
+
+Patch 6.3.048 (extra)
+Problem: Build problems with VMS on IA64.
+Solution: Add dependencies to the build file. (Zoltan Arpadffy)
+Files: src/Make_vms.mms
+
+Patch 6.3.049 (after 6.3.045)
+Problem: Compiler warning for "char" vs "char_u" mixup. (Zoltan Arpadffy)
+Solution: Add a typecast.
+Files: src/option.c
+
+Patch 6.3.050
+Problem: When SIGHUP is received while busy exiting, non-reentrant
+ functions such as free() may cause a crash.
+Solution: Ignore SIGHUP when exiting because of an error. (Scott Anderson)
+Files: src/misc1.c, src/main.c
+
+Patch 6.3.051
+Problem: When 'wildmenu' is set and completed file names contain multibyte
+ characters Vim may crash.
+Solution: Reserve room for multibyte characters. (Yasuhiro Matsumoto)
+Files: src/screen.c
+
+Patch 6.3.052 (extra)
+Problem: Windows 98: typed keys that are not ASCII may not work properly.
+ For example with a Russian input method. (Jiri Jezdinsky)
+Solution: Assume that the characters arrive in the current codepage instead
+ of UCS-2. Perform conversion based on that.
+Files: src/gui_w48.c
+
+Patch 6.3.053
+Problem: Win32: ":loadview" cannot find a file with non-ASCII characters.
+ (Valerie Kondakoff)
+Solution: Use mch_open() instead of open() to open the file.
+Files: src/ex_cmds2.c
+
+Patch 6.3.054
+Problem: When 'insertmode' is set <C-L>4ixxx<C-L> hangs Vim. (Jens Paulus)
+ Vim is actually still working but redraw is disabled.
+Solution: When stopping Insert mode with CTRL-L don't put an Esc in the redo
+ buffer but a CTRL-L.
+Files: src/edit.c
+
+Patch 6.3.055 (after 6.3.013)
+Problem: Can't use getcmdline(), getcmdpos() or setcmdpos() with <C-R>=
+ when editing a command line. Using <C-\>e may crash Vim. (Peter
+ Winters)
+Solution: When moving ccline out of the way for recursive use, make it
+ available to the functions that need it. Also save and restore
+ ccline when calling get_expr_line(). Make ccline.cmdbuf NULL at
+ the end of getcmdline().
+Files: src/ex_getln.c
+
+Patch 6.3.056
+Problem: The last characters of a multibyte file name may not be displayed
+ in the window title.
+Solution: Avoid to remove a multibyte character where the last byte looks
+ like a path separator character. (Yasuhiro Matsumoto)
+Files: src/buffer.c, src/ex_getln.c
+
+Patch 6.3.057
+Problem: When filtering lines folds are not updated. (Carl Osterwisch)
+Solution: Update folds for filtered lines.
+Files: src/ex_cmds.c
+
+Patch 6.3.058
+Problem: When 'foldcolumn' is equal to the window width and 'wrap' is on
+ Vim may crash. Disabling the vertical split feature breaks
+ compiling. (Peter Winters)
+Solution: Check for zero room for wrapped text. Make compiling without
+ vertical splits possible.
+Files: src/move.c, src/quickfix.c, src/screen.c, src/netbeans.c
+
+Patch 6.3.059
+Problem: Crash when expanding an ":edit" command containing several spaces
+ with the shell. (Brian Hirt)
+Solution: Allocate enough space for the quotes.
+Files: src/os_unix.c
+
+Patch 6.3.060
+Problem: Using CTRL-R CTRL-O in Insert mode with an invalid register name
+ still causes something to be inserted.
+Solution: Check the register name for being valid.
+Files: src/edit.c
+
+Patch 6.3.061
+Problem: When editing a utf-8 file in an utf-8 xterm and there is a
+ multibyte character in the last column, displaying is messed up.
+ (Joël Rio)
+Solution: Check for a multibyte character, not a multi-column character.
+Files: src/screen.c
+
+Patch 6.3.062
+Problem: ":normal! gQ" hangs.
+Solution: Quit getcmdline() and do_exmode() when out of typeahead.
+Files: src/ex_getln.c, src/ex_docmd.c
+
+Patch 6.3.063
+Problem: When a CursorHold autocommand changes to another window
+ (temporarily) 'mousefocus' stops working.
+Solution: Call gui_mouse_correct() after triggering CursorHold.
+Files: src/gui.c
+
+Patch 6.3.064
+Problem: line2byte(line("$") + 1) sometimes returns the wrong number.
+ (Charles Campbell)
+Solution: Flush the cached line before counting the bytes.
+Files: src/memline.c
+
+Patch 6.3.065
+Problem: The euro digraph doesn't always work.
+Solution: Add an "e=" digraph for Unicode euro character and adjust the
+ help files.
+Files: src/digraph.c, runtime/doc/digraph.txt
+
+Patch 6.3.066
+Problem: Backup file may get wrong permissions.
+Solution: Use permissions of original file for backup file in more places.
+Files: src/fileio.c
+
+Patch 6.3.067 (after 6.3.066)
+Problem: Newly created file gets execute permission.
+Solution: Check for "perm" to be negative before using it.
+Files: src/fileio.c
+
+Patch 6.3.068
+Problem: When editing a compressed file xxx.gz which is a symbolic link to
+ the actual file a ":write" renames the link.
+Solution: Resolve the link, so that the actual file is renamed and
+ compressed.
+Files: runtime/plugin/gzip.vim
+
+Patch 6.3.069
+Problem: When converting text with illegal characters Vim may crash.
+Solution: Avoid that too much is subtracted from the length. (Da Woon Jung)
+Files: src/mbyte.c
+
+Patch 6.3.070
+Problem: After ":set number linebreak wrap" and a vertical split, moving
+ the vertical separator far left will crash Vim. (Georg Dahn)
+Solution: Avoid dividing by zero.
+Files: src/charset.c
+
+Patch 6.3.071
+Problem: The message for CTRL-X mode is still displayed after an error for
+ 'thesaurus' or 'dictionary' being empty.
+Solution: Clear "edit_submode".
+Files: src/edit.c
+
+Patch 6.3.072
+Problem: Crash in giving substitute message when language is Chinese and
+ encoding is utf-8. (Yongwei)
+Solution: Make the msg_buf size larger when using multibyte.
+Files: src/vim.h
+
+Patch 6.3.073
+Problem: Win32 GUI: When the Vim window is partly above or below the
+ screen, scrolling causes display errors when the taskbar is not on
+ that side.
+Solution: Use the SW_INVALIDATE flag when the Vim window is partly below or
+ above the screen.
+Files: src/gui_w48.c
+
+Patch 6.3.074
+Problem: When mswin.vim is used and 'insertmode' is set, typing text in
+ Select mode and then using CTRL-V results in <SNR>99_Pastegi.
+ (Georg Dahn)
+Solution: When restart_edit is set use "d" instead of "c" to remove the
+ selected text to avoid calling edit() twice.
+Files: src/normal.c
+
+Patch 6.3.075
+Problem: After unloading another buffer, syntax highlighting in the current
+ buffer may be wrong when it uses "containedin". (Eric Arnold)
+Solution: Use "buf" instead of "curbuf" in syntax_clear().
+Files: src/syntax.c
+
+Patch 6.3.076
+Problem: Crash when using cscope and there is a parse error (e.g., line too
+ long). (Alexey I. Froloff)
+Solution: Pass the actual number of matches to cs_manage_matches() and
+ correctly handle the error situation.
+Files: src/if_cscope.c
+
+Patch 6.3.077 (extra)
+Problem: VMS: First character input after ESC was not recognized.
+Solution: Added TRM$M_TM_TIMED in vms_read(). (Zoltan Arpadffy)
+Files: src/os_vms.c
+
+Patch 6.3.078 (extra, after 6.3.077)
+Problem: VMS: Performance issue after patch 6.3.077
+Solution: Add a timeout in the itemlist. (Zoltan Arpadffy)
+Files: src/os_vms.c
+
+Patch 6.3.079
+Problem: Crash when executing a command in the command line window while
+ syntax highlighting is enabled. (Pero Brbora)
+Solution: Don't use a pointer to a buffer that has been deleted.
+Files: src/syntax.c
+
+Patch 6.3.080 (extra)
+Problem: Win32: With 'encoding' set to utf-8 while the current codepage is
+ Chinese editing a file with some specific characters in the name
+ fails.
+Solution: Use _wfullpath() instead of _fullpath() when necessary.
+Files: src/os_mswin.c
+
+Patch 6.3.081
+Problem: Unix: glob() may execute a shell command when it's not wanted.
+ (Georgi Guninski)
+Solution: Verify the sandbox flag is not set.
+Files: src/os_unix.c
+
+Patch 6.3.082 (after 6.3.081)
+Problem: Unix: expand() may execute a shell command when it's not wanted.
+ (Georgi Guninski)
+Solution: A more generic solution than 6.3.081.
+Files: src/os_unix.c
+
+Patch 6.3.083
+Problem: VMS: The vt320 termcap entry is incomplete.
+Solution: Add missing function keys. (Zoltan Arpadffy)
+Files: src/term.c
+
+Patch 6.3.084 (extra)
+Problem: Cygwin: compiling with DEBUG doesn't work. Perl path was ignored.
+ Failure when $(OUTDIR) already exists. "po" makefile is missing.
+Solution: Use changes tested in Vim 7. (Tony Mechelynck)
+Files: src/Make_cyg.mak, src/po/Make_cyg.mak
+
+Patch 6.3.085
+Problem: Crash in syntax highlighting code. (Marc Espie)
+Solution: Prevent current_col going past the end of the line.
+Files: src/syntax.c
+
+Patch 6.3.086 (extra)
+Problem: Can't produce message translation file with msgfmt that checks
+ printf strings.
+Solution: Fix the Russian translation.
+Files: src/po/ru.po, src/po/ru.cp1251.po
+
+Patch 6.3.087
+Problem: MS-DOS: Crash. (Jason Hood)
+Solution: Don't call fname_case() with a NULL pointer.
+Files: src/ex_cmds.c
+
+Patch 6.3.088
+Problem: Editing ".in" causes error E218. (Stefan Karlsson)
+Solution: Require some characters before ".in". Same for ".orig" and others.
+Files: runtime/filetype.vim
+
+Patch 6.3.089
+Problem: A session file doesn't work when created while the current
+ directory contains a space or the directory of the session files
+ contains a space. (Paolo Giarrusso)
+Solution: Escape spaces with a backslash.
+Files: src/ex_docmd.c
+
+Patch 6.3.090
+Problem: A very big value for 'columns' or 'lines' may cause a crash.
+Solution: Limit the values to 10000 and 1000.
+Files: src/option.c
+
+Patch 6.4a.001
+Problem: The Unix Makefile contained too many dependencies and a few
+ uncommented lines.
+Solution: Run "make depend" with manual changes to avoid a gcc
+ incompatibility. Comment a few lines.
+Files: src/Makefile
+
+Patch 6.4b.001
+Problem: Vim reports "Vim 6.4a" in the ":version" output.
+Solution: Change "a" to "b". (Tony Mechelynck)
+Files: src/version.h
+
+Patch 6.4b.002
+Problem: In Insert mode, pasting a multibyte character after the end of
+ the line leaves the cursor just before that character.
+Solution: Make sure "gP" leaves the cursor in the right place when
+ 'virtualedit' is set.
+Files: src/ops.c
+
+Patch 6.4b.003 (after 6.4b.002)
+Problem: The problem still exists when 'encoding' is set to "cp936".
+Solution: Fix the problem in getvvcol(), compute the coladd field correctly.
+Files: src/charset.c, src/ops.c
+
+Patch 6.4b.004
+Problem: Selecting a {} block with "viB" includes the '}' when there is an
+ empty line before it.
+Solution: Don't advance the cursor to include a line break when it's already
+ at the line break.
+Files: src/search.c
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt
new file mode 100644
index 0000000..c7248c2
--- /dev/null
+++ b/runtime/doc/version7.txt
@@ -0,0 +1,18312 @@
+*version7.txt* For Vim version 9.0. Last change: 2021 May 17
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+ *vim7* *version-7.0* *version7.0*
+Welcome to Vim 7! A large number of features has been added. This file
+mentions all the new items, changes to existing features and bug fixes
+since Vim 6.x. Use this command to see the version you are using: >
+ :version
+
+See |vi_diff.txt| for an overview of differences between Vi and Vim 7.0.
+See |version4.txt| for differences between Vim 3.x and Vim 4.x.
+See |version5.txt| for differences between Vim 4.x and Vim 5.x.
+See |version6.txt| for differences between Vim 5.x and Vim 6.x.
+
+INCOMPATIBLE CHANGES |incompatible-7|
+
+NEW FEATURES |new-7|
+
+Vim script enhancements |new-vim-script|
+Spell checking |new-spell|
+Omni completion |new-omni-completion|
+MzScheme interface |new-MzScheme|
+Printing multibyte text |new-print-multibyte|
+Tab pages |new-tab-pages|
+Undo branches |new-undo-branches|
+Extended Unicode support |new-more-unicode|
+More highlighting |new-more-highlighting|
+Translated manual pages |new-manpage-trans|
+Internal grep |new-vimgrep|
+Scroll back in messages |new-scroll-back|
+Cursor past end of the line |new-onemore|
+POSIX compatibility |new-posix|
+Debugger support |new-debug-support|
+Remote file explorer |new-netrw-explore|
+Define an operator |new-define-operator|
+Mapping to an expression |new-map-expression|
+Visual and Select mode mappings |new-map-select|
+Location list |new-location-list|
+Various new items |new-items-7|
+
+IMPROVEMENTS |improvements-7|
+
+COMPILE TIME CHANGES |compile-changes-7|
+
+BUG FIXES |bug-fixes-7|
+
+VERSION 7.1 |version-7.1|
+Changed |changed-7.1|
+Added |added-7.1|
+Fixed |fixed-7.1|
+
+VERSION 7.2 |version-7.2|
+Changed |changed-7.2|
+Added |added-7.2|
+Fixed |fixed-7.2|
+
+VERSION 7.3 |version-7.3|
+
+Persistent undo |new-persistent-undo|
+More encryption |new-more-encryption|
+Conceal text |new-conceal|
+Lua interface |new-lua|
+Python3 interface |new-python3|
+
+Changed |changed-7.3|
+Added |added-7.3|
+Fixed |fixed-7.3|
+
+VERSION 7.4 |version-7.4|
+New regexp engine |new-regexp-engine|
+Better Python interface |better-python-interface|
+Changed |changed-7.4|
+Added |added-7.4|
+Fixed |fixed-7.4|
+
+
+==============================================================================
+INCOMPATIBLE CHANGES *incompatible-7*
+
+These changes are incompatible with previous releases. Check this list if you
+run into a problem when upgrading from Vim 6.x to 7.0.
+
+A ":write file" command no longer resets the 'modified' flag of the buffer,
+unless the '+' flag is in 'cpoptions' |cpo-+|. This was illogical, since the
+buffer is still modified compared to the original file. And when undoing
+all changes the file would actually be marked modified. It does mean that
+":quit" fails now.
+
+":helpgrep" now uses a help window to display a match.
+
+In an argument list double quotes could be used to include spaces in a file
+name. This caused a difference between ":edit" and ":next" for escaping
+double quotes and it is incompatible with some versions of Vi.
+ Command Vim 6.x file name Vim 7.x file name ~
+ :edit foo\"888 foo"888 foo"888
+ :next foo\"888 foo888 foo"888
+ :next a\"b c\"d ab cd a"b and c"d
+
+In a |literal-string| a single quote can be doubled to get one.
+":echo 'a''b'" would result in "a b", but now that two quotes stand for one it
+results in "a'b".
+
+When overwriting a file with ":w! fname" there was no warning for when "fname"
+was being edited by another Vim. Vim now gives an error message |E768|.
+
+The support for Mac OS 9 has been removed.
+
+Files ending in .tex now have 'filetype' set to "context", "plaintex", or
+"tex". |ft-tex-plugin|
+
+
+Minor incompatibilities:
+
+For filetype detection: For many types, use */.dir/filename instead of
+~/.dir/filename, so that it also works for other user's files.
+
+For quite a few filetypes the indent settings have been moved from the
+filetype plugin to the indent plugin. If you used: >
+ :filetype plugin on
+Then some indent settings may be missing. You need to use: >
+ :filetype plugin indent on
+
+":0verbose" now sets 'verbose' to zero instead of one.
+
+Removed the old and incomplete "VimBuddy" code.
+
+Buffers without a name report "No Name" instead of "No File". It was
+confusing for buffers with a name and 'buftype' set to "nofile".
+
+When ":file xxx" is used in a buffer without a name, the alternate file name
+isn't set. This avoids creating buffers without a name, they are not useful.
+
+The "2html.vim" script now converts closed folds to HTML. This means the HTML
+looks like it's displayed, with the same folds open and closed. Use "zR", or
+"let html_ignore_folding=1", if no folds should appear in the HTML. (partly by
+Carl Osterwisch)
+Diff mode is now also converted to HTML as it is displayed.
+
+Win32: The effect of the <F10> key depended on 'winaltkeys'. Now it depends
+on whether <F10> has been mapped or not. This allows mapping <F10> without
+changing 'winaltkeys'.
+
+When 'octal' is in 'nrformats' and using CTRL-A on "08" it became "018", which
+is illogical. Now it becomes "9". The leading zero(s) is(are) removed to
+avoid the number becoming octal after incrementing "009" to "010".
+
+When 'encoding' is set to a Unicode encoding, the value for 'fileencodings'
+now includes "default" before "latin1". This means that for files with 8-bit
+encodings the default is to use the encoding specified by the environment, if
+possible. Previously latin1 would always be used, which is wrong in a
+non-latin1 environment, such as Russian.
+
+Previously Vim would exit when there are two windows, both of them displaying
+a help file, and using ":quit". Now only the window is closed.
+
+"-w {scriptout}" only works when {scriptout} doesn't start with a digit.
+Otherwise it's used to set the 'window' option.
+
+Previously <Home> and <xHome> could be mapped separately. This had the
+disadvantage that all mappings (with modifiers) had to be duplicated, since
+you can't be sure what the keyboard generates. Now all <xHome> are internally
+translated to <Home>, both for the keys and for mappings. Also for <xEnd>,
+<xF1>, etc.
+
+":put" now leaves the cursor on the last inserted line.
+
+When a .gvimrc file exists then 'compatible' is off, just like when a ".vimrc"
+file exists.
+
+When making a string upper-case with "vlllU" or similar then the German sharp
+s is replaced with "SS". This does not happen with "~" to avoid backwards
+compatibility problems and because "SS" can't be changed back to a sharp s.
+
+"gd" previously found the very first occurrence of a variable in a function,
+that could be the function argument without type. Now it finds the position
+where the type is given.
+
+The line continuation in functions was not taken into account, line numbers in
+errors were logical lines, not lines in the sourced file. That made it
+difficult to locate errors. Now the line number in the sourced file is
+reported, relative to the function start. This also means that line numbers
+for ":breakadd func" are different.
+
+When defining a user command with |:command| the special items could be
+abbreviated. This caused unexpected behavior, such as <li> being recognized
+as <line1>. The items can no longer be abbreviated.
+
+When executing a FileChangedRO autocommand it is no longer allowed to switch
+to another buffer or edit another file. This is to prevent crashes (the event
+is triggered deep down in the code where changing buffers is not anticipated).
+It is still possible to reload the buffer.
+
+At the |more-prompt| and the |hit-enter-prompt|, when the 'more' option is
+set, the 'k', 'u', 'g' and 'b' keys are now used to scroll back to previous
+messages. Thus they are no longer used as typeahead.
+
+==============================================================================
+NEW FEATURES *new-7*
+
+Vim script enhancements *new-vim-script*
+-----------------------
+
+In Vim scripts the following types have been added:
+
+ |List| ordered list of items
+ |Dictionary| associative array of items
+ |Funcref| reference to a function
+
+Many functions and commands have been added to support the new types.
+
+The |string()| function can be used to get a string representation of a
+variable. Works for Numbers, Strings and composites of them. Then |eval()|
+can be used to turn the string back into the variable value.
+
+The |:let| command can now use "+=", "-=" and ".=": >
+ :let var += expr " works like :let var = var + expr
+ :let var -= expr " works like :let var = var - expr
+ :let var .= string " works like :let var = var . string
+
+With the |:profile| command you can find out where your function or script
+is wasting time.
+
+In the Python interface vim.eval() also handles Dictionaries and Lists.
+|python-eval| (G. Sumner Hayes)
+
+The |getscript| plugin was added as a convenient way to update scripts from
+www.vim.org automatically. (Charles Campbell)
+
+The |vimball| plugin was added as a convenient way to distribute a set of
+files for a plugin (plugin file, autoload script, documentation). (Charles
+Campbell)
+
+
+Spell checking *new-spell*
+--------------
+
+Spell checking has been integrated in Vim. There were a few implementations
+with scripts, but they were slow and/or required an external program.
+
+The 'spell' option is used to switch spell checking on or off
+The 'spelllang' option is used to specify the accepted language(s)
+The 'spellfile' option specifies where new words are added
+The 'spellsuggest' option specifies the methods used for making suggestions
+
+The |]s| and |[s| commands can be used to move to the next or previous error
+The |zg| and |zw| commands can be used to add good and wrong words
+The |z=| command can be used to list suggestions and correct the word
+The |:mkspell| command is used to generate a Vim spell file from word lists
+
+The "undercurl" highlighting attribute was added to nicely point out spelling
+mistakes in the GUI (based on patch from Marcin Dalecki).
+The "guisp" color can be used to give it a color different from foreground and
+background.
+The number of possible different highlight attributes was raised from about
+220 to over 30000. This allows for the attributes of spelling to be combined
+with syntax highlighting attributes. This is also used for syntax
+highlighting and marking the Visual area.
+
+Much more info here: |spell|.
+
+
+Omni completion *new-omni-completion*
+---------------
+
+This could also be called "intellisense", but that is a trademark. It is a
+smart kind of completion. The text in front of the cursor is inspected to
+figure out what could be following. This may suggest struct and class
+members, system functions, etc.
+
+Use CTRL-X CTRL-O in Insert mode to start the completion. |i_CTRL-X_CTRL-O|
+
+The 'omnifunc' option is set by filetype plugins to define the function that
+figures out the completion.
+
+Currently supported languages:
+ C |ft-c-omni|
+ (X)HTML with CSS |ft-html-omni|
+ JavaScript |ft-javascript-omni|
+ PHP |ft-php-omni|
+ Python
+ Ruby |ft-ruby-omni|
+ SQL |ft-sql-omni|
+ XML |ft-xml-omni|
+ any language with syntax highlighting |ft-syntax-omni|
+
+You can add your own omni completion scripts.
+
+When the 'completeopt' option contains "menu" then matches for Insert mode
+completion are displayed in a (rather primitive) popup menu.
+
+
+MzScheme interface *new-MzScheme*
+------------------
+
+The MzScheme interpreter is supported. |MzScheme|
+
+The |:mzscheme| command can be used to execute MzScheme commands
+The |:mzfile| command can be used to execute an MzScheme script file
+
+This depends on Vim being compiled with the |+mzscheme| feature.
+
+
+Printing multibyte text *new-print-multibyte*
+------------------------
+
+The |:hardcopy| command now supports printing multibyte characters when using
+PostScript.
+
+The 'printmbcharset' and 'printmbfont' options are used for this.
+Also see |postscript-cjk-printing|. (Mike Williams)
+
+
+Tab pages *new-tab-pages*
+---------
+
+A tab page is a page with one or more windows with a label (aka tab) at the top.
+By clicking on the label you can quickly switch between the tab pages. And
+with the keyboard, using the |gt| (Goto Tab) command. This is a convenient
+way to work with many windows.
+
+To start Vim with each file argument in a separate tab page use the |-p|
+argument. The maximum number of pages can be set with 'tabpagemax'.
+
+The line with tab labels is either made with plain text and highlighting or
+with a GUI mechanism. The GUI labels look better but are only available on a
+few systems. The line can be customized with 'tabline', 'guitablabel' and
+'guitabtooltip'. Whether it is displayed is set with 'showtabline'. Whether
+to use the GUI labels is set with the "e" flag in 'guioptions'.
+
+The |:tab| command modifier can be used to have most commands that open a new
+window open a new tab page instead.
+
+The |--remote-tab| argument can be used to edit a file in a new tab page in an
+already running Vim server.
+
+Variables starting with "t:" are local to a tab page.
+
+More info here: |tabpage|
+Most of the GUI stuff was implemented by Yegappan Lakshmanan.
+
+
+Undo branches *new-undo-branches*
+-------------
+
+Previously there was only one line of undo-redo. If, after undoing a number
+of changes, a new change was made all the undone changes were lost. This
+could lead to accidentally losing work.
+
+Vim now makes an undo branch in this situation. Thus you can go back to the
+text after any change, even if they were undone. So long as you do not run
+into 'undolevels', when undo information is freed up to limit the memory used.
+
+To be able to navigate the undo branches each change is numbered sequentially.
+The commands |g-| and |:earlier| go back in time, to older changes. The
+commands |g+| and |:later| go forward in time, to newer changes.
+
+The changes are also timestamped. Use ":earlier 10m" to go to the text as it
+was about ten minutes earlier.
+
+The |:undolist| command can be used to get an idea of which undo branches
+exist. The |:undo| command now takes an argument to directly jump to a
+specific position in this list. The |changenr()| function can be used to
+obtain the change number.
+
+There is no graphical display of the tree with changes, navigation can be
+quite confusing.
+
+
+Extended Unicode support *new-more-unicode*
+------------------------
+
+Previously only two combining characters were displayed. The limit is now
+raised to 6. This can be set with the 'maxcombine' option. The default is
+still 2.
+
+|ga| now shows all combining characters, not just the first two.
+
+Previously only 16 bit Unicode characters were supported for displaying. Now
+the full 32 bit character set can be used. Unless manually disabled at
+compile time to save a bit of memory.
+
+For pattern matching it is now possible to search for individual composing
+characters. |patterns-composing|
+
+The |8g8| command searches for an illegal UTF-8 byte sequence.
+
+
+More highlighting *new-more-highlighting*
+-----------------
+
+Highlighting matching parens:
+
+When moving the cursor through the text and it is on a paren, then the
+matching paren can be highlighted. This uses the new |CursorMoved|
+autocommand event.
+
+This means some commands are executed every time you move the cursor. If this
+slows you down too much switch it off with: >
+ :NoMatchParen
+
+See |matchparen| for more information.
+
+The plugin uses the |:match| command. It now supports three match patterns.
+The plugin uses the third one. The first one is for the user and the second
+one can be used by another plugin.
+
+Highlighting the cursor line and column:
+
+The 'cursorline' and 'cursorcolumn' options have been added. These highlight
+the screen line and screen column of the cursor. This makes the cursor
+position easier to spot. 'cursorcolumn' is also useful to align text. This
+may make screen updating quite slow. The CursorColumn and CursorLine
+highlight groups allow changing the colors used. |hl-CursorColumn|
+|hl-CursorLine|
+
+The number of possible different highlight attributes was raised from about
+220 to over 30000. This allows for the attributes of spelling to be combined
+with syntax highlighting attributes. This is also used for syntax
+highlighting, marking the Visual area, CursorColumn, etc.
+
+
+Translated manual pages *new-manpage-trans*
+-----------------------
+
+The manual page of Vim and associated programs is now also available in
+several other languages.
+
+French - translated by David Blanchet
+Italian - translated by Antonio Colombo
+Russian - translated by Vassily Ragosin
+Polish - translated by Mikolaj Machowski
+
+The Unix Makefile installs the Italian manual pages in .../man/it/man1/,
+.../man/it.ISO8859-1/man1/ and .../man/it.UTF-8/man1/. There appears to be no
+standard for what encoding goes in the "it" directory, the 8-bit encoded file
+is used there as a best guess.
+Other languages are installed in similar places.
+The translated pages are not automatically installed when Vim was configured
+with "--disable-nls", but "make install-languages install-tool-languages" will
+do it anyway.
+
+
+Internal grep *new-vimgrep*
+-------------
+
+The ":vimgrep" command can be used to search for a pattern in a list of files.
+This is like the ":grep" command, but no external program is used. Besides
+better portability, handling of different file encodings and using multi-line
+patterns, this also allows grepping in compressed and remote files.
+|:vimgrep|.
+
+If you want to use the search results in a script you can use the
+|getqflist()| function.
+
+To grep files in various directories the "**" pattern can be used. It expands
+into an arbitrary depth of directories. "**" can be used in all places where
+file names are expanded, thus also with |:next| and |:args|.
+
+
+Scroll back in messages *new-scroll-back*
+-----------------------
+
+When displaying messages, at the |more-prompt| and the |hit-enter-prompt|, The
+'k', 'u', 'g' and 'b' keys can be used to scroll back to previous messages.
+This is especially useful for commands such as ":syntax", ":autocommand" and
+":highlight". This is implemented in a generic way thus it works for all
+commands and highlighting is kept. Only works when the 'more' option is set.
+Previously it only partly worked for ":clist".
+
+The |g<| command can be used to see the last page of messages after you have
+hit <Enter> at the |hit-enter-prompt|. Then you can scroll further back.
+
+
+Cursor past end of the line *new-onemore*
+---------------------------
+
+When the 'virtualedit' option contains "onemore" the cursor can move just past
+the end of the line. As if it's on top of the line break.
+
+This makes some commands more consistent. Previously the cursor was always
+past the end of the line if the line was empty. But it is far from Vi
+compatible. It may also break some plugins or Vim scripts. Use with care!
+
+The patch was provided by Mattias Flodin.
+
+
+POSIX compatibility *new-posix*
+-------------------
+
+The POSIX test suite was used to verify POSIX compatibility. A number of
+problems have been fixed to make Vim more POSIX compatible. Some of them
+conflict with traditional Vi or expected behavior. The $VIM_POSIX environment
+variable can be set to get POSIX compatibility. See |posix|.
+
+Items that were fixed for both Vi and POSIX compatibility:
+- repeating "R" with a count only overwrites text once; added the 'X' flag to
+ 'cpoptions' |cpo-X|
+- a vertical movement command that moves to a non-existing line fails; added
+ the '-' flag to 'cpoptions' |cpo--|
+- when preserving a file and doing ":q!" the file can be recovered; added the
+ '&' flag to 'cpoptions' |cpo-&|
+- The 'window' option is partly implemented. It specifies how much CTRL-F and
+ CTRL-B scroll when there is one window. The "-w {number}" argument is now
+ accepted. "-w {scriptout}" only works when {scriptout} doesn't start with a
+ digit.
+- Allow "-c{command}" argument, no space between "-c" and {command}.
+- When writing a file with ":w!" don't reset 'readonly' when 'Z' is present in
+ 'cpoptions'.
+- Allow 'l' and '#' flags for ":list", ":print" and ":number".
+- Added the '.' flag to 'cpoptions': ":cd" fails when the buffer is modified.
+- In Ex mode with an empty buffer ":read file" doesn't keep an empty line
+ above or below the new lines.
+- Remove a backslash before a NL for the ":global" command.
+- When ":append", ":insert" or ":change" is used with ":global", get the
+ inserted lines from the command. Can use backslash-NL to separate lines.
+- Can use ":global /pat/ visual" to execute Normal mode commands at each
+ matched line. Use "Q" to continue and go to the next line.
+- The |:open| command has been partially implemented. It stops Ex mode, but
+ redraws the whole screen, not just one line as open mode is supposed to do.
+- Support using a pipe to read the output from and write input to an external
+ command. Added the 'shelltemp' option and has("filterpipe").
+- In ex silent mode the ":set" command output is displayed.
+- The ":@@" and ":**" give an error message when no register was used before.
+- The search pattern "[]-`]" matches ']', '^', '_' and '`'.
+- Autoindent for ":insert" is using the line below the insert.
+- Autoindent for ":change" is using the first changed line.
+- Editing Ex command lines is not done in cooked mode, because CTRL-D and
+ CTRL-T cannot be handled then.
+- In Ex mode, "1,3" prints three lines. "%" prints all lines.
+- In Ex mode "undo" would undo all changes since Ex mode was started.
+- Implemented the 'prompt' option.
+
+
+Debugger support *new-debug-support*
+----------------
+
+The 'balloonexpr' option has been added. This is a generic way to implement
+balloon functionality. You can use it to show info for the word under the
+mouse pointer.
+
+
+Remote file explorer *new-netrw-explore*
+--------------------
+
+The netrw plugin now also supports viewing a directory, when "scp://" is used.
+Deleting and renaming files is possible.
+
+To avoid duplicating a lot of code, the previous file explorer plugin has been
+integrated in the netrw plugin. This means browsing local and remote files
+works the same way.
+
+":browse edit" and ":browse split" use the netrw plugin when it's available
+and a GUI dialog is not possible.
+
+The netrw plugin is maintained by Charles Campbell.
+
+
+Define an operator *new-define-operator*
+------------------
+
+Previously it was not possible to define your own operator; a command that is
+followed by a {motion}. Vim 7 introduces the 'operatorfunc' option and the
+|g@| operator. This makes it possible to define a mapping that works like an
+operator. The actual work is then done by a function, which is invoked
+through the |g@| operator.
+
+See |:map-operator| for the explanation and an example.
+
+
+Mapping to an expression *new-map-expression*
+------------------------
+
+The {rhs} argument of a mapping can be an expression. That means the
+resulting characters can depend on the context. Example: >
+ :inoremap <expr> . InsertDot()
+Here the dot will be mapped to whatever InsertDot() returns.
+
+This also works for abbreviations. See |:map-<expr>| for the details.
+
+
+Visual and Select mode mappings *new-map-select*
+-------------------------------
+
+Previously Visual mode mappings applied both to Visual and Select mode. With
+a trick to have the mappings work in Select mode like they would in Visual
+mode.
+
+Commands have been added to define mappings for Visual and Select mode
+separately: |:xmap| and |:smap|. With the associated "noremap" and "unmap"
+commands.
+
+The same is done for menus: |:xmenu|, |:smenu|, etc.
+
+
+Location list *new-location-list*
+-------------
+
+The support for a per-window quickfix list (location list) is added. The
+location list can be displayed in a location window (similar to the quickfix
+window). You can open more than one location list window. A set of commands
+similar to the quickfix commands are added to browse the location list.
+(Yegappan Lakshmanan)
+
+
+Various new items *new-items-7*
+-----------------
+
+Normal mode commands: ~
+
+a", a' and a` New text objects to select quoted strings. |a'|
+i", i' and i` (Taro Muraoka)
+
+CTRL-W <Enter> In the quickfix window: opens a new window to show the
+ location of the error under the cursor.
+
+|at| and |it| text objects select a block of text between HTML or XML tags.
+
+<A-LeftMouse> ('mousemodel' "popup" or "popup-setpos")
+<A-RightMouse> ('mousemodel' "extend")
+ Make a blockwise selection. |<A-LeftMouse>|
+
+gF Start editing the filename under the cursor and jump
+ to the line number following the file name.
+ (Yegappan Lakshmanan)
+
+CTRL-W F Start editing the filename under the cursor in a new
+ window and jump to the line number following the file
+ name. (Yegappan Lakshmanan)
+
+Insert mode commands: ~
+
+CTRL-\ CTRL-O Execute a Normal mode command. Like CTRL-O but
+ without moving the cursor. |i_CTRL-\_CTRL-O|
+
+Options: ~
+
+'balloonexpr' expression for text to show in evaluation balloon
+'completefunc' The name of the function used for user-specified
+ Insert mode completion. CTRL-X CTRL-U can be used in
+ Insert mode to do any kind of completion. (Taro
+ Muraoka)
+'completeopt' Enable popup menu and other settings for Insert mode
+ completion.
+'cursorcolumn' highlight column of the cursor
+'cursorline' highlight line of the cursor
+'formatexpr' expression for formatting text with |gq| and when text
+ goes over 'textwidth' in Insert mode.
+'formatlistpat' pattern to recognize a numbered list for formatting.
+ (idea by Hugo Haas)
+'fsync' Whether fsync() is called after writing a file.
+ (Ciaran McCreesh)
+'guitablabel' expression for text to display in GUI tab page label
+'guitabtooltip' expression for text to display in GUI tab page tooltip
+'macatsui' Mac: use ATSUI text display functions
+'maxcombine' maximum number of combining characters displayed
+'maxmempattern' maximum amount of memory to use for pattern matching
+'mkspellmem' parameters for |:mkspell| memory use
+'mzquantum' Time in msec to schedule MzScheme threads.
+'numberwidth' Minimal width of the space used for the 'number' and
+ 'relativenumber' option. (Emmanuel Renieris)
+'omnifunc' The name of the function used for omni completion.
+'operatorfunc' function to be called for |g@| operator
+'printmbcharset' CJK character set to be used for :hardcopy
+'printmbfont' font names to be used for CJK output of :hardcopy
+'pumheight' maximum number of items to show in the popup menu
+'quoteescape' Characters used to escape quotes inside a string.
+ Used for the a", a' and a` text objects. |a'|
+'shelltemp' whether to use a temp file or pipes for shell commands
+'showtabline' whether to show the tab pages line
+'spell' switch spell checking on/off
+'spellcapcheck' pattern to locate the end of a sentence
+'spellfile' file where good and wrong words are added
+'spelllang' languages to check spelling for
+'spellsuggest' methods for spell suggestions
+'synmaxcol' maximum column to look for syntax items; avoids very
+ slow redrawing when there are very long lines
+'tabline' expression for text to display in the tab pages line
+'tabpagemax' maximum number of tab pages to open for |-p|
+'verbosefile' Log messages in a file.
+'wildoptions' "tagfile" value enables listing the file name of
+ matching tags for CTRL-D command line completion.
+ (based on an idea from Yegappan Lakshmanan)
+'winfixwidth' window with fixed width, similar to 'winfixheight'
+
+
+Ex commands: ~
+
+Win32: The ":winpos" command now also works in the console. (Vipin Aravind)
+
+|:startreplace| Start Replace mode. (Charles Campbell)
+|:startgreplace| Start Virtual Replace mode.
+
+|:0file| Removes the name of the buffer. (Charles Campbell)
+
+|:diffoff| Switch off diff mode in the current window or in all
+ windows.
+
+|:delmarks| Delete marks.
+
+|:exusage| Help for Ex commands (Nvi command).
+|:viusage| Help for Vi commands (Nvi command).
+
+|:sort| Sort lines in the buffer without depending on an
+ external command. (partly by Bryce Wagner)
+
+|:vimgrep| Internal grep command, search for a pattern in files.
+|:vimgrepadd| Like |:vimgrep| but don't make a new list.
+
+|:caddfile| Add error messages to an existing quickfix list
+ (Yegappan Lakshmanan).
+|:cbuffer| Read error lines from a buffer. (partly by Yegappan
+ Lakshmanan)
+|:cgetbuffer| Create a quickfix list from a buffer but don't jump to
+ the first error.
+|:caddbuffer| Add errors from the current buffer to the quickfix
+ list.
+|:cexpr| Read error messages from a Vim expression (Yegappan
+ Lakshmanan).
+|:caddexpr| Add error messages from a Vim expression to an
+ existing quickfix list. (Yegappan Lakshmanan).
+|:cgetexpr| Create a quickfix list from a Vim expression, but
+ don't jump to the first error. (Yegappan Lakshmanan).
+
+|:lfile| Like |:cfile| but use the location list.
+|:lgetfile| Like |:cgetfile| but use the location list.
+|:laddfile| Like |:caddfile| but use the location list.
+|:lbuffer| Like |:cbuffer| but use the location list.
+|:lgetbuffer| Like |:cgetbuffer| but use the location list.
+|:laddbuffer| Like |:caddbuffer| but use the location list.
+|:lexpr| Like |:cexpr| but use the location list.
+|:lgetexpr| Like |:cgetexpr| but use the location list.
+|:laddexpr| Like |:caddexpr| but use the location list.
+|:ll| Like |:cc| but use the location list.
+|:llist| Like |:clist| but use the location list.
+|:lnext| Like |:cnext| but use the location list.
+|:lprevious| Like |:cprevious| but use the location list.
+|:lNext| Like |:cNext| but use the location list.
+|:lfirst| Like |:cfirst| but use the location list.
+|:lrewind| Like |:crewind| but use the location list.
+|:llast| Like |:clast| but use the location list.
+|:lnfile| Like |:cnfile| but use the location list.
+|:lpfile| Like |:cpfile| but use the location list.
+|:lNfile| Like |:cNfile| but use the location list.
+|:lolder| Like |:colder| but use the location list.
+|:lnewer| Like |:cnewer| but use the location list.
+|:lwindow| Like |:cwindow| but use the location list.
+|:lopen| Like |:copen| but use the location list.
+|:lclose| Like |:cclose| but use the location list.
+|:lmake| Like |:make| but use the location list.
+|:lgrep| Like |:grep| but use the location list.
+|:lgrepadd| Like |:grepadd| but use the location list.
+|:lvimgrep| Like |:vimgrep| but use the location list.
+|:lvimgrepadd| Like |:vimgrepadd| but use the location list.
+|:lhelpgrep| Like |:helpgrep| but use the location list.
+|:lcscope| Like |:cscope| but use the location list.
+|:ltag| Jump to a tag and add matching tags to a location list.
+
+|:undojoin| Join a change with the previous undo block.
+|:undolist| List the leafs of the undo tree.
+
+|:earlier| Go back in time for changes in the text.
+|:later| Go forward in time for changes in the text.
+
+|:for| Loop over a |List|.
+|:endfor|
+
+|:lockvar| Lock a variable, prevents it from being changed.
+|:unlockvar| Unlock a locked variable.
+
+|:mkspell| Create a Vim spell file.
+|:spellgood| Add a word to the list of good words.
+|:spellwrong| Add a word to the list of bad words
+|:spelldump| Dump list of good words.
+|:spellinfo| Show information about the spell files used.
+|:spellrepall| Repeat a spelling correction for the whole buffer.
+|:spellundo| Remove a word from list of good and bad words.
+
+|:mzscheme| Execute MzScheme commands.
+|:mzfile| Execute an MzScheme script file.
+
+|:nbkey| Pass a key to NetBeans for processing.
+
+|:profile| Commands for Vim script profiling.
+|:profdel| Stop profiling for specified items.
+
+|:smap| Select mode mapping.
+|:smapclear|
+|:snoremap|
+|:sunmap|
+
+|:xmap| Visual mode mapping, not used for Select mode.
+|:xmapclear|
+|:xnoremap|
+|:xunmap|
+
+|:smenu| Select mode menu.
+|:snoremenu|
+|:sunmenu|
+
+|:xmenu| Visual mode menu, not used for Select mode.
+|:xnoremenu|
+|:xunmenu|
+
+|:tabclose| Close the current tab page.
+|:tabdo| Perform a command in every tab page.
+|:tabedit| Edit a file in a new tab page.
+|:tabnew| Open a new tab page.
+|:tabfind| Search for a file and open it in a new tab page.
+|:tabnext| Go to the next tab page.
+|:tabprevious| Go to the previous tab page.
+|:tabNext| Go to the previous tab page.
+|:tabfirst| Go to the first tab page.
+|:tabrewind| Go to the first tab page.
+|:tablast| Go to the last tab page.
+|:tabmove| Move the current tab page elsewhere.
+|:tabonly| Close all other tab pages.
+|:tabs| List the tab pages and the windows they contain.
+
+Ex command modifiers: ~
+
+|:keepalt| Do not change the alternate file.
+
+|:noautocmd| Do not trigger autocommand events.
+
+|:sandbox| Execute a command in the sandbox.
+
+|:tab| When opening a new window create a new tab page.
+
+
+Ex command arguments: ~
+
+|++bad| Specify what happens with characters that can't be
+ converted and illegal bytes. (code example by Yasuhiro
+ Matsumoto)
+ Also, when a conversion error occurs or illegal bytes
+ are found include the line number in the error
+ message.
+
+
+New and extended functions: ~
+
+|add()| append an item to a List
+|append()| append List of lines to the buffer
+|argv()| without an argument return the whole argument list
+|browsedir()| dialog to select a directory
+|bufnr()| takes an extra argument: create buffer
+|byteidx()| index of a character (Ilya Sher)
+|call()| call a function with List as arguments
+|changenr()| number of current change
+|complete()| set matches for Insert mode completion
+|complete_add()| add match for 'completefunc'
+|complete_check()| check for key pressed, for 'completefunc'
+|copy()| make a shallow copy of a List or Dictionary
+|count()| count nr of times a value is in a List or Dictionary
+|cursor()| also accepts an offset for 'virtualedit', and
+ the first argument can be a list: [lnum, col, off]
+|deepcopy()| make a full copy of a List or Dictionary
+|diff_filler()| returns number of filler lines above line {lnum}.
+|diff_hlID()| returns the highlight ID for diff mode
+|empty()| check if List or Dictionary is empty
+|eval()| evaluate {string} and return the result
+|extend()| append one List to another or add items from one
+ Dictionary to another
+|feedkeys()| put characters in the typeahead buffer
+|filter()| remove selected items from a List or Dictionary
+|finddir()| find a directory in 'path'
+|findfile()| find a file in 'path' (Johannes Zellner)
+|foldtextresult()| the text displayed for a closed fold at line "lnum"
+|function()| make a Funcref out of a function name
+|garbagecollect()| cleanup unused |Lists| and |Dictionaries| with circular
+ references
+|get()| get an item from a List or Dictionary
+|getbufline()| get a list of lines from a specified buffer
+ (Yegappan Lakshmanan)
+|getcmdtype()| return the current command-line type
+ (Yegappan Lakshmanan)
+|getfontname()| get actual font name being used
+|getfperm()| get file permission string (Nikolai Weibull)
+|getftype()| get type of file (Nikolai Weibull)
+|getline()| with second argument: get List with buffer lines
+|getloclist()| list of location list items (Yegappan Lakshmanan)
+|getpos()| return a list with the position of cursor, mark, etc.
+|getqflist()| list of quickfix errors (Yegappan Lakshmanan)
+|getreg()| get contents of a register
+|gettabwinvar()| get variable from window in specified tab page.
+|has_key()| check whether a key appears in a Dictionary
+|haslocaldir()| check if current window used |:lcd|
+|hasmapto()| check for a mapping to a string
+|index()| index of item in List
+|inputlist()| prompt the user to make a selection from a list
+|insert()| insert an item somewhere in a List
+|islocked()| check if a variable is locked
+|items()| get List of Dictionary key-value pairs
+|join()| join List items into a String
+|keys()| get List of Dictionary keys
+|len()| number of items in a List or Dictionary
+|map()| change each List or Dictionary item
+|maparg()| extra argument: use abbreviation
+|mapcheck()| extra argument: use abbreviation
+|match()| extra argument: count
+|matcharg()| return arguments of |:match| command
+|matchend()| extra argument: count
+|matchlist()| list with match and submatches of a pattern in a string
+|matchstr()| extra argument: count
+|max()| maximum value in a List or Dictionary
+|min()| minimum value in a List or Dictionary
+|mkdir()| create a directory
+|pathshorten()| reduce directory names to a single character
+|printf()| format text
+|pumvisible()| check whether the popup menu is displayed
+|range()| generate a List with numbers
+|readfile()| read a file into a list of lines
+|reltime()| get time value, possibly relative
+|reltimestr()| turn a time value into a string
+|remove()| remove one or more items from a List or Dictionary
+|repeat()| repeat "expr" "count" times (Christophe Poucet)
+|reverse()| reverse the order of a List
+|search()| extra argument:
+|searchdecl()| search for declaration of variable
+|searchpair()| extra argument: line to stop searching
+|searchpairpos()| return a List with the position of the match
+|searchpos()| return a List with the position of the match
+|setloclist()| modify a location list (Yegappan Lakshmanan)
+|setpos()| set cursor or mark to a position
+|setqflist()| modify a quickfix list (Yegappan Lakshmanan)
+|settabwinvar()| set variable in window of specified tab page
+|sort()| sort a List
+|soundfold()| get the sound-a-like equivalent of a word
+|spellbadword()| get a badly spelled word
+|spellsuggest()| get suggestions for correct spelling
+|split()| split a String into a List
+|str2nr()| convert a string to a number, base 2, 8, 10 or 16
+|stridx()| extra argument: start position
+|strridx()| extra argument: start position
+|string()| string representation of a List or Dictionary
+|system()| extra argument: filters {input} through a shell command
+|tabpagebuflist()| List of buffers in a tab page
+|tabpagenr()| number of current or last tab page
+|tabpagewinnr()| window number in a tab page
+|tagfiles()| List with tags file names
+|taglist()| get list of matching tags (Yegappan Lakshmanan)
+|tr()| translate characters (Ron Aaron)
+|uniq()| remove copies of repeated adjacent list items
+|values()| get List of Dictionary values
+|winnr()| takes an argument: what window to use
+|winrestview()| restore the view of the current window
+|winsaveview()| save the view of the current window
+|writefile()| write a list of lines into a file
+
+User defined functions can now be loaded automatically from the "autoload"
+directory in 'runtimepath'. See |autoload-functions|.
+
+
+New Vim variables: ~
+
+|v:insertmode| used for |InsertEnter| and |InsertChange| autocommands
+|v:val| item value in a |map()| or |filter()| function
+|v:key| item key in a |map()| or |filter()| function
+|v:profiling| non-zero after a ":profile start" command
+|v:fcs_reason| the reason why |FileChangedShell| was triggered
+|v:fcs_choice| what should happen after |FileChangedShell|
+|v:beval_bufnr| buffer number for 'balloonexpr'
+|v:beval_winnr| window number for 'balloonexpr'
+|v:beval_lnum| line number for 'balloonexpr'
+|v:beval_col| column number for 'balloonexpr'
+|v:beval_text| text under the mouse pointer for 'balloonexpr'
+|v:scrollstart| what caused the screen to be scrolled up
+|v:swapname| name of the swap file for the |SwapExists| event
+|v:swapchoice| what to do for an existing swap file
+|v:swapcommand| command to be executed after handling |SwapExists|
+|v:char| argument for evaluating 'formatexpr'
+
+
+New autocommand events: ~
+
+|ColorScheme| after loading a color scheme
+
+|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
+
+|FileChangedShellPost| after handling a file changed outside of Vim
+
+|InsertEnter| starting Insert or Replace mode
+|InsertChange| going from Insert to Replace mode or back
+|InsertLeave| leaving Insert or Replace mode
+
+|MenuPopup| just before showing popup menu
+
+|QuickFixCmdPre| before :make, :grep et al. (Ciaran McCreesh)
+|QuickFixCmdPost| after :make, :grep et al. (Ciaran McCreesh)
+
+|SessionLoadPost| after loading a session file. (Yegappan Lakshmanan)
+
+|ShellCmdPost| after executing a shell command
+|ShellFilterPost| after filtering with a shell command
+
+|SourcePre| before sourcing a Vim script
+
+|SpellFileMissing| when a spell file can't be found
+
+|SwapExists| found existing swap file when editing a file
+
+|TabEnter| just after entering a tab page
+|TabLeave| just before leaving a tab page
+
+|VimResized| after the Vim window size changed (Yakov Lerner)
+
+
+New highlight groups: ~
+
+Pmenu Popup menu: normal item |hl-Pmenu|
+PmenuSel Popup menu: selected item |hl-PmenuSel|
+PmenuThumb Popup menu: scrollbar |hl-PmenuThumb|
+PmenuSbar Popup menu: Thumb of the scrollbar |hl-PmenuSbar|
+
+TabLine tab pages line, inactive label |hl-TabLine|
+TabLineSel tab pages line, selected label |hl-TabLineSel|
+TabLineFill tab pages line, filler |hl-TabLineFill|
+
+SpellBad badly spelled word |hl-SpellBad|
+SpellCap word with wrong caps |hl-SpellCap|
+SpellRare rare word |hl-SpellRare|
+SpellLocal word only exists in other region |hl-SpellLocal|
+
+CursorColumn 'cursorcolumn' |hl-CursorColumn|
+CursorLine 'cursorline' |hl-CursorLine|
+
+MatchParen matching parens |pi_paren.txt| |hl-MatchParen|
+
+
+New items in search patterns: ~
+|/\%d| \%d123 search for character with decimal number
+|/\]| [\d123] idem, in a collection
+|/\%o| \%o103 search for character with octal number
+|/\]| [\o1o3] idem, in a collection
+|/\%x| \%x1a search for character with 2 pos. hex number
+|/\]| [\x1a] idem, in a collection
+|/\%u| \%u12ab search for character with 4 pos. hex number
+|/\]| [\u12ab] idem, in a collection
+|/\%U| \%U1234abcd search for character with 8 pos. hex number
+|/\]| [\U1234abcd] idem, in a collection
+ (The above partly by Ciaran McCreesh)
+
+|/[[=| [[=a=]] an equivalence class (only for latin1 characters)
+|/[[.| [[.a.]] a collation element (only works with single char)
+
+|/\%'m| \%'m match at mark m
+|/\%<'m| \%<'m match before mark m
+|/\%>'m| \%>'m match after mark m
+|/\%V| \%V match in Visual area
+
+Nesting |/multi| items no longer is an error when an empty match is possible.
+
+It is now possible to use \{0}, it matches the preceding atom zero times. Not
+useful, just for compatibility.
+
+
+New Syntax/Indent/FTplugin files: ~
+
+Moved all the indent settings from the filetype plugin to the indent file.
+Implemented b:undo_indent to undo indent settings when setting 'filetype' to a
+different value.
+
+a2ps syntax and ftplugin file. (Nikolai Weibull)
+ABAB/4 syntax file. (Marius van Wyk)
+alsaconf ftplugin file. (Nikolai Weibull)
+AppendMatchGroup ftplugin file. (Dave Silvia)
+arch ftplugin file. (Nikolai Weibull)
+asterisk and asteriskvm syntax file. (Tilghman Lesher)
+BDF ftplugin file. (Nikolai Weibull)
+BibTeX indent file. (Dorai Sitaram)
+BibTeX Bibliography Style syntax file. (Tim Pope)
+BTM ftplugin file. (Bram Moolenaar)
+calendar ftplugin file. (Nikolai Weibull)
+Changelog indent file. (Nikolai Weibull)
+ChordPro syntax file. (Niels Bo Andersen)
+Cmake indent and syntax file. (Andy Cedilnik)
+conf ftplugin file. (Nikolai Weibull)
+context syntax and ftplugin file. (Nikolai Weibull)
+CRM114 ftplugin file. (Nikolai Weibull)
+cvs RC ftplugin file. (Nikolai Weibull)
+D indent file. (Jason Mills)
+Debian Sources.list syntax file. (Matthijs Mohlmann)
+dictconf and dictdconf syntax, indent and ftplugin files. (Nikolai Weibull)
+diff ftplugin file. (Bram Moolenaar)
+dircolors ftplugin file. (Nikolai Weibull)
+django and htmldjango syntax file. (Dave Hodder)
+doxygen syntax file. (Michael Geddes)
+elinks ftplugin file. (Nikolai Weibull)
+eterm ftplugin file. (Nikolai Weibull)
+eviews syntax file. (Vaidotas Zemlys)
+fetchmail RC ftplugin file. (Nikolai Weibull)
+FlexWiki syntax and ftplugin file. (George Reilly)
+Generic indent file. (Dave Silvia)
+gpg ftplugin file. (Nikolai Weibull)
+gretl syntax file. (Vaidotas Zemlys)
+groovy syntax file. (Alessio Pace)
+group syntax and ftplugin file. (Nikolai Weibull)
+grub ftplugin file. (Nikolai Weibull)
+Haskell ftplugin file. (Nikolai Weibull)
+help ftplugin file. (Nikolai Weibull)
+indent ftplugin file. (Nikolai Weibull)
+Javascript ftplugin file. (Bram Moolenaar)
+Kconfig ftplugin and syntax file. (Nikolai Weibull)
+ld syntax, indent and ftplugin file. (Nikolai Weibull)
+lftp ftplugin file. (Nikolai Weibull)
+libao config ftplugin file. (Nikolai Weibull)
+limits syntax and ftplugin file. (Nikolai Weibull)
+Lisp indent file. (Sergey Khorev)
+loginaccess and logindefs syntax and ftplugin file. (Nikolai Weibull)
+m4 ftplugin file. (Nikolai Weibull)
+mailaliases syntax file. (Nikolai Weibull)
+mailcap ftplugin file. (Nikolai Weibull)
+manconf syntax and ftplugin file. (Nikolai Weibull)
+matlab ftplugin file. (Jake Wasserman)
+Maxima syntax file. (Robert Dodier)
+MGL syntax file. (Gero Kuhlmann)
+modconf ftplugin file. (Nikolai Weibull)
+mplayer config ftplugin file. (Nikolai Weibull)
+Mrxvtrc syntax and ftplugin file. (Gautam Iyer)
+MuPAD source syntax, indent and ftplugin. (Dave Silvia)
+mutt RC ftplugin file. (Nikolai Weibull)
+nanorc syntax and ftplugin file. (Nikolai Weibull)
+netrc ftplugin file. (Nikolai Weibull)
+pamconf syntax and ftplugin file. (Nikolai Weibull)
+Pascal indent file. (Neil Carter)
+passwd syntax and ftplugin file. (Nikolai Weibull)
+PHP compiler plugin. (Doug Kearns)
+pinfo ftplugin file. (Nikolai Weibull)
+plaintex syntax and ftplugin files. (Nikolai Weibull, Benji Fisher)
+procmail ftplugin file. (Nikolai Weibull)
+prolog ftplugin file. (Nikolai Weibull)
+protocols syntax and ftplugin file. (Nikolai Weibull)
+quake ftplugin file. (Nikolai Weibull)
+racc syntax and ftplugin file. (Nikolai Weibull)
+readline ftplugin file. (Nikolai Weibull)
+rhelp syntax file. (Johannes Ranke)
+rnoweb syntax file. (Johannes Ranke)
+Relax NG compact ftplugin file. (Nikolai Weibull)
+Scheme indent file. (Sergey Khorev)
+screen ftplugin file. (Nikolai Weibull)
+sensors syntax and ftplugin file. (Nikolai Weibull)
+services syntax and ftplugin file. (Nikolai Weibull)
+setserial syntax and ftplugin file. (Nikolai Weibull)
+sieve syntax and ftplugin file. (Nikolai Weibull)
+SiSU syntax file (Ralph Amissah)
+Sive syntax file. (Nikolai Weibull)
+slp config, reg and spi syntax and ftplugin files. (Nikolai Weibull)
+SML indent file. (Saikat Guha)
+SQL anywhere syntax and indent file. (David Fishburn)
+SQL indent file.
+SQL-Informix syntax file. (Dean L Hill)
+SQL: Handling of various variants. (David Fishburn)
+sshconfig ftplugin file. (Nikolai Weibull)
+Stata and SMCL syntax files. (Jeff Pitblado)
+sudoers ftplugin file. (Nikolai Weibull)
+sysctl syntax and ftplugin file. (Nikolai Weibull)
+terminfo ftplugin file. (Nikolai Weibull)
+trustees syntax file. (Nima Talebi)
+Vera syntax file. (David Eggum)
+udev config, permissions and rules syntax and ftplugin files. (Nikolai Weibull)
+updatedb syntax and ftplugin file. (Nikolai Weibull)
+VHDL indent file (Gerald Lai)
+WSML syntax file. (Thomas Haselwanter)
+Xdefaults ftplugin file. (Nikolai Weibull)
+XFree86 config ftplugin file. (Nikolai Weibull)
+xinetd syntax, indent and ftplugin file. (Nikolai Weibull)
+xmodmap ftplugin file. (Nikolai Weibull)
+Xquery syntax file. (Jean-Marc Vanel)
+xsd (XML schema) indent file.
+YAML ftplugin file. (Nikolai Weibull)
+Zsh ftplugin file. (Nikolai Weibull)
+
+
+New Keymaps: ~
+
+Sinhala (Sri Lanka) (Harshula Jayasuriya)
+Tamil in TSCII encoding (Yegappan Lakshmanan)
+Greek in cp737 (Panagiotis Louridas)
+Polish-slash (HS6_06)
+Ukrainian-jcuken (Anatoli Sakhnik)
+Kana (Edward L. Fox)
+
+
+New message translations: ~
+
+The Ukrainian messages are now also available in cp1251.
+Vietnamese message translations and menu. (Phan Vinh Thinh)
+
+
+Others: ~
+
+The |:read| command has the |++edit| argument. This means it will use the
+detected 'fileformat', 'fileencoding' and other options for the buffer. This
+also fixes the problem that editing a compressed file didn't set these
+options.
+
+The Netbeans interface was updated for Sun Studio 10. The protocol number
+goes from 2.2 to 2.3. (Gordon Prieur)
+
+Mac: When starting up Vim will load the $VIMRUNTIME/macmap.vim script to
+define default command-key mappings. (mostly by Benji Fisher)
+
+Mac: Add the selection type to the clipboard, so that Block, line and
+character selections can be used between two Vims. (Eckehard Berns)
+Also fixes the problem that setting 'clipboard' to "unnamed" breaks using
+"yyp".
+
+Mac: GUI font selector. (Peter Cucka)
+
+Mac: support for multibyte characters. (Da Woon Jung)
+This doesn't always work properly. If you see text drawing problems try
+switching the 'macatsui' option off.
+
+Mac: Support the xterm mouse in the non-GUI version.
+
+Mac: better integration with Xcode. Post a fake mouse-up event after the odoc
+event and the drag receive handler to work around a stall after Vim loads a
+file. Fixed an off-by-one line number error. (Da Woon Jung)
+
+Mac: When started from Finder change directory to the file being edited or the
+user home directory.
+
+Added the t_SI and t_EI escape sequences for starting and ending Insert mode.
+To be used to set the cursor shape to a bar or a block. No default values,
+they are not supported by termcap/terminfo.
+
+GUI font selector for Motif. (Marcin Dalecki)
+
+Nicer toolbar buttons for Motif. (Marcin Dalecki)
+
+Mnemonics for the Motif find/replace dialog. (Marcin Dalecki)
+
+Included a few improvements for Motif from Marcin Dalecki. Draw label
+contents ourselves to make them handle fonts in a way configurable by Vim and
+a bit less dependent on the X11 font management.
+
+Autocommands can be defined local to a buffer. This means they will also work
+when the buffer does not have a name or no specific name. See
+|autocmd-buflocal|. (Yakov Lerner)
+
+For xterm most combinations of modifiers with function keys are recognized.
+|xterm-modifier-keys|
+
+When 'verbose' is set the output of ":highlight" will show where a highlight
+item was last set.
+When 'verbose' is set the output of the ":map", ":abbreviate", ":command",
+":function" and ":autocmd" commands will show where it was last defined.
+(Yegappan Lakshmanan)
+
+":function /pattern" lists functions matching the pattern.
+
+"1gd" can be used like "gd" but ignores matches in a {} block that ends before
+the cursor position. Likewise for "1gD" and "gD".
+
+'scrolljump' can be set to a negative number to scroll a percentage of the
+window height.
+
+The |v:scrollstart| variable has been added to help find the location in
+your script that causes the hit-enter prompt.
+
+To make it possible to handle the situation that a file is being edited that
+is already being edited by another Vim instance, the |SwapExists| event has
+been added. The |v:swapname|, |v:swapchoice| and |v:swapcommand| variables
+can be used, for example to use the |client-server| functionality to bring the
+other Vim to the foreground.
+When starting Vim with a "-t tag" argument, there is an existing swapfile and
+the user selects "quit" or "abort" then exit Vim.
+
+Undo now also restores the '< and '> marks. "gv" selects the same area as
+before the change and undo.
+
+When editing a search pattern for a "/" or "?" command and 'incsearch' is set
+CTRL-L can be used to add a character from the current match. CTRL-R CTRL-W
+will add a word, but exclude the part of the word that was already typed.
+
+Ruby interface: add line number methods. (Ryan Paul)
+
+The $MYVIMRC environment variable is set to the first found vimrc file.
+The $MYGVIMRC environment variable is set to the first found gvimrc file.
+
+==============================================================================
+IMPROVEMENTS *improvements-7*
+
+":helpgrep" accepts a language specifier after the pattern: "pat@it".
+
+Moved the help for printing to a separate help file. It's quite a lot now.
+
+When doing completion for ":!cmd", ":r !cmd" or ":w !cmd" executable files are
+found in $PATH instead of looking for ordinary files in the current directory.
+
+When ":silent" is used and a backwards range is given for an Ex command the
+range is swapped automatically instead of asking if that is OK.
+
+The pattern matching code was changed from a recursive function to an
+iterative mechanism. This avoids out-of-stack errors. State is stored in
+allocated memory, running out of memory can always be detected. Allows
+matching more complex things, but Vim may seem to hang while doing that.
+
+Previously some options were always evaluated in the |sandbox|. Now that only
+happens when the option was set from a modeline or in secure mode. Applies to
+'balloonexpr', 'foldexpr', 'foldtext' and 'includeexpr'. (Sumner Hayes)
+
+Some commands and expressions could have nasty side effects, such as using
+CTRL-R = while editing a search pattern and the expression invokes a function
+that jumps to another window. The |textlock| has been added to prevent this
+from happening.
+
+":breakadd here" and ":breakdel here" can be used to set or delete a
+breakpoint at the cursor.
+
+It is now possible to define a function with: >
+ :exe "func Test()\n ...\n endfunc"
+
+The tutor was updated to make it simpler to use and text was added to explain
+a few more important commands. Used ideas from Gabriel Zachmann.
+
+Unix: When libcall() fails obtain an error message with dlerror() and display
+it. (Johannes Zellner)
+
+Mac and Cygwin: When editing an existing file make the file name the same case
+of the edited file. Thus when typing ":e os_UNIX.c" the file name becomes
+"os_unix.c".
+
+Added "nbsp" in 'listchars'. (David Blanchet)
+
+Added the "acwrite" value for the 'buftype' option. This is for a buffer that
+does not have a name that refers to a file and is written with BufWriteCmd
+autocommands.
+
+For lisp indenting and matching parenthesis: (Sergey Khorev)
+- square brackets are recognized properly
+- #\(, #\), #\[ and #\] are recognized as character literals
+- Lisp line comments (delimited by semicolon) are recognized
+
+Added the "count" argument to match(), matchend() and matchstr(). (Ilya Sher)
+
+winnr() takes an optional "$" or "#" argument. (Nikolai Weibull, Yegappan
+Lakshmanan)
+
+Added 's' flag to search(): set ' mark if cursor moved. (Yegappan Lakshmanan)
+Added 'n' flag to search(): don't move the cursor. (Nikolai Weibull)
+Added 'c' flag to search(): accept match at the cursor.
+Added 'e' flag to search(): move to end of the match. (Benji Fisher)
+Added 'p' flag to search(): return number of sub-pattern. (Benji Fisher)
+These also apply to searchpos(), searchpair() and searchpairpos().
+
+The search() and searchpair() functions have an extra argument to specify
+where to stop searching. Speeds up searches that should not continue too far.
+
+When uncompressing fails in the gzip plugin, give an error message but don't
+delete the raw text. Helps if the file has a .gz extension but is not
+actually compressed. (Andrew Pimlott)
+
+When C, C++ or IDL syntax is used, may additionally load doxygen syntax.
+(Michael Geddes)
+
+Support setting 'filetype' and 'syntax' to "aaa.bbb" for "aaa" plus "bbb"
+filetype or syntax.
+
+The ":registers" command now displays multibyte characters properly.
+
+VMS: In the usage message mention that a slash can be used to make a flag
+upper case. Add color support to the builtin vt320 terminal codes.
+(Zoltan Arpadffy)
+
+For the '%' item in 'viminfo', allow a number to set a maximum for the number
+of buffers.
+
+For recognizing the file type: When a file looks like a shell script, check
+for an "exec" command that starts the tcl interpreter. (suggested by Alexios
+Zavras)
+
+Support conversion between utf-8 and latin9 (iso-8859-15) internally, so that
+digraphs still work when iconv is not available.
+
+When a session file is loaded while editing an unnamed, empty buffer that
+buffer is wiped out. Avoids that there is an unused buffer in the buffer
+list.
+
+Win32: When libintl.dll supports bind_textdomain_codeset(), use it.
+(NAKADAIRA Yukihiro)
+
+Win32: Vim was not aware of hard links on NTFS file systems. These are
+detected now for when 'backupcopy' is "auto". Also fixed a bogus "file has
+been changed since reading it" error for links.
+
+When foldtext() finds no text after removing the comment leader, use the
+second line of the fold. Helps for C-style /* */ comments where the first
+line is just "/*".
+
+When editing the same file from two systems (e.g., Unix and MS-Windows) there
+mostly was no warning for an existing swap file, because the name of the
+edited file differs (e.g., y:\dir\file vs /home/me/dir/file). Added a flag to
+the swap file to indicate it is in the same directory as the edited file. The
+used path then doesn't matter and the check for editing the same file is much
+more reliable.
+
+Unix: When editing a file through a symlink the swap file would use the name
+of the symlink. Now use the name of the actual file, so that editing the same
+file twice is detected. (suggestions by Stefano Zacchiroli and James Vega)
+
+Client-server communication now supports 'encoding'. When setting 'encoding'
+in a Vim server to "utf-8", and using "vim --remote fname" in a console,
+"fname" is converted from the console encoding to utf-8. Also allows Vims
+with different 'encoding' settings to exchange messages.
+
+Internal: Changed ga_room into ga_maxlen, so that it doesn't need to be
+incremented/decremented each time.
+
+When a register is empty it is not stored in the viminfo file.
+
+Removed the tcltags script, it's obsolete.
+
+":redir @*>>" and ":redir @+>>" append to the clipboard. Better check for
+invalid characters after the register name. |:redir|
+
+":redir => variable" and ":redir =>> variable" write or append to a variable.
+(Yegappan Lakshmanan) |:redir|
+
+":redir @{a-z}>>" appends to register a to z. (Yegappan Lakshmanan)
+
+The 'verbosefile' option can be used to log messages in a file. Verbose
+messages are not displayed then. The "-V{filename}" argument can be used to
+log startup messages.
+
+":let g:" lists global variables.
+":let b:" lists buffer-local variables.
+":let w:" lists window-local variables.
+":let v:" lists Vim variables.
+
+The stridx() and strridx() functions take a third argument, where to start
+searching. (Yegappan Lakshmanan)
+
+The getreg() function takes an extra argument to be able to get the expression
+for the '=' register instead of the result of evaluating it.
+
+The setline() function can take a List argument to set multiple lines. When
+the line number is just below the last line the line is appended.
+
+g CTRL-G also shows the number of characters if it differs from the number of
+bytes.
+
+Completion for ":debug" and entering an expression for the '=' register. Skip
+":" between range and command name. (Peter Winters)
+
+CTRL-Q in Insert mode now works like CTRL-V by default. Previously it was
+ignored.
+
+When "beep" is included in 'debug' a function or script that causes a beep
+will result in a message with the source of the error.
+
+When completing buffer names, match with "\(^\|[\/]\)" instead of "^", so that
+":buf stor<Tab>" finds both "include/storage.h" and "storage/main.c".
+
+To count items (pattern matches) without changing the buffer the 'n' flag has
+been added to |:substitute|. See |count-items|.
+
+In a |:substitute| command the \u, \U, \l and \L items now also work for
+multibyte characters.
+
+The "screen.linux" $TERM name is recognized to set the default for
+'background' to "dark". (Ciaran McCreesh) Also for "cygwin" and "putty".
+
+The |FileChangedShell| autocommand event can now use the |v:fcs_reason|
+variable that specifies what triggered the event. |v:fcs_choice| can be used
+to reload the buffer or ask the user what to do.
+
+Not all modifiers were recognized for xterm function keys. Added the
+possibility in term codes to end in ";*X" or "O*X", where X is any character
+and the * stands for the modifier code.
+Added the <xUp>, <xDown>, <xLeft> and <xRight> keys, to be able to recognize
+the two forms that xterm can send their codes in and still handle all possible
+modifiers.
+
+getwinvar() now also works to obtain a buffer-local option from the specified
+window.
+
+Added the "%s" item to 'errorformat'. (Yegappan Lakshmanan)
+Added the "%>" item to 'errorformat'.
+
+For 'errorformat' it was not possible to have a file name that contains the
+character that follows after "%f". For example, in "%f:%l:%m" the file name
+could not contain ":". Now include the first ":" where the rest of the
+pattern matches. In the example a ":" not followed by a line number is
+included in the file name. (suggested by Emanuele Giaquinta)
+
+GTK GUI: use the GTK file dialog when it's available. Mix from patches by
+Grahame Bowland and Evan Webb.
+
+Added ":scriptnames" to bugreport.vim, so that we can see what plugins were
+used.
+
+Win32: If the user changes the setting for the number of lines a scroll wheel
+click scrolls it is now used immediately. Previously Vim would need to be
+restarted.
+
+When using @= in an expression the value is expression @= contains. ":let @=
+= value" can be used to set the register contents.
+
+A ! can be added to ":popup" to have the popup menu appear at the mouse
+pointer position instead of the text cursor.
+
+The table with encodings has been expanded with many MS-Windows codepages,
+such as cp1250 and cp737, so that these can also be used on Unix without
+prepending "8bit-".
+When an encoding name starts with "microsoft-cp" ignore the "microsoft-" part.
+
+Added the "customlist" completion argument to a user-defined command. The
+user-defined completion function should return the completion candidates as a
+Vim List and the returned results are not filtered by Vim. (Yegappan
+Lakshmanan)
+
+Win32: Balloons can have multiple lines if common controls supports it.
+(Sergey Khorev)
+
+For command-line completion the matches for various types of arguments are now
+sorted: user commands, variables, syntax names, etc.
+
+When no locale is set, thus using the "C" locale, Vim will work with latin1
+characters, using its own isupper()/toupper()/etc. functions.
+
+When using an rxvt terminal emulator guess the value of 'background' using the
+COLORFGBG environment variable. (Ciaran McCreesh)
+
+Also support t_SI and t_EI on Unix with normal features. (Ciaran McCreesh)
+
+When 'foldcolumn' is one then put as much info in it as possible. This allows
+closing a fold with the mouse by clicking on the '-'.
+
+input() takes an optional completion argument to specify the type of
+completion supported for the input. (Yegappan Lakshmanan)
+
+"dp" works with more than two buffers in diff mode if there is only one where
+'modifiable' is set.
+
+The 'diffopt' option has three new values: "horizontal", "vertical" and
+"foldcolumn".
+
+When the 'include' option contains \zs the file name found is what is being
+matched from \zs to the end or \ze. Useful to pass more to 'includeexpr'.
+
+Loading plugins on startup now supports subdirectories in the plugin
+directory. |load-plugins|
+
+In the foldcolumn always show the '+' for a closed fold, so that it can be
+opened easily. It may overwrite another character, esp. if 'foldcolumn' is 1.
+
+It is now possible to get the W10 message again by setting 'readonly'. Useful
+in the FileChangedRO autocommand when checking out the file fails.
+
+Unix: When open() returns EFBIG give an appropriate message.
+
+":mksession" sets the SessionLoad variable to notify plugins. A modeline is
+added to the session file to set 'filetype' to "vim".
+
+In the ATTENTION prompt put the "Delete it" choice before "Quit" to make it
+more logical. (Robert Webb)
+
+When appending to a file while the buffer has no name the name of the appended
+file would be used for the current buffer. But the buffer contents is
+actually different from the file content. Don't set the file name, unless the
+'P' flag is present in 'cpoptions'.
+
+When starting to edit a new file and the directory for the file doesn't exist
+then Vim will report "[New DIRECTORY]" instead of "[New File] to give the user
+a hint that something might be wrong.
+
+Win32: Preserve the hidden attribute of the viminfo file.
+
+In Insert mode CTRL-A didn't keep the last inserted text when using CTRL-O and
+then a cursor key. Now keep the previously inserted text if nothing is
+inserted after the CTRL-O. Allows using CTRL-O commands to move the cursor
+without losing the last inserted text.
+
+The exists() function now supports checking for autocmd group definition
+and for supported autocommand events. (Yegappan Lakshmanan)
+
+Allow using ":global" in the sandbox, it doesn't do anything harmful by
+itself.
+
+":saveas asdf.c" will set 'filetype' to c when it's empty. Also for ":w
+asdf.c" when it sets the filename for the buffer.
+
+Insert mode completion for whole lines now also searches unloaded buffers.
+
+The colortest.vim script can now be invoked directly with ":source" or
+":runtime syntax/colortest.vim".
+
+The 'statusline' option can be local to the window, so that each window can
+have a different value. (partly by Yegappan Lakshmanan)
+
+The 'statusline' option and other options that support the same format can now
+use these new features:
+- When it starts with "%!" the value is first evaluated as an expression
+ before parsing the value.
+- "%#HLname#" can be used to start highlighting with HLname.
+
+When 'statusline' is set to something that causes an error message then it is
+made empty to avoid an endless redraw loop. Also for other options, such at
+'tabline' and 'titlestring'. ":verbose set statusline" will mention that it
+was set in an error handler.
+
+When there are several matching tags, the ":tag <name>" and CTRL-] commands
+jump to the [count] matching tag. (Yegappan Lakshmanan)
+
+Win32: In the batch files generated by the install program, use $VIMRUNTIME or
+$VIM if it's set. Example provided by Mathias Michaelis.
+Also create a vimtutor.bat batch file.
+
+The 'balloonexpr' option is now |global-local|.
+
+The system() function now runs in cooked mode, thus can be interrupted by
+CTRL-C.
+
+==============================================================================
+COMPILE TIME CHANGES *compile-changes-7*
+
+Dropped the support for the BeOS and Amiga GUI. They were not maintained and
+probably didn't work. If you want to work on this: get the Vim 6.x version
+and merge it back in.
+
+When running the tests and one of them fails to produce "test.out" the
+following tests are still executed. This helps when running out of memory.
+
+When compiling with EXITFREE defined and the ccmalloc library, it is possible
+to detect memory leaks. Some memory will always be reported as leaked, such
+as allocated by X11 library functions and the memory allocated in
+alloc_cmdbuff() to store the ":quit" command.
+
+Moved the code for printing to src/hardcopy.c.
+
+Moved some code from main() to separate functions to make it easier to see
+what is being done. Using a structure to avoid a lot of arguments to the
+functions.
+
+Moved unix_expandpath() to misc1.c, so that it can also be used by os_mac.c
+without copying the code.
+
+--- Mac ---
+
+"make" now creates the Vim.app directory and "make install" copies it to its
+final destination. (Raf)
+
+Put the runtime directory not directly in Vim.app but in
+Vim.app/Contents/Resources/vim, so that it's according to Mac specs.
+
+Made it possible to compile with Motif, Athena or GTK without tricks and still
+being able to use the MacRoman conversion. Added the os_mac_conv.c file.
+
+When running "make install" the runtime files are installed as for Unix.
+Avoids that too many files are copied. When running "make" a link to the
+runtime files is created to avoid a recursive copy that takes much time.
+
+Configure will attempt to build Vim for both Intel and PowerPC. The
+--with-mac-arch configure argument can change it.
+
+--- Win32 ---
+
+The Make_mvc.mak file was adjusted to work with the latest MS compilers,
+including the free version of Visual Studio 2005. (George Reilly)
+
+INSTALLpc.txt was updated for the recent changes. (George Reilly)
+
+The distributed executable is now produced with the free Visual C++ Toolkit
+2003 and other free SDK chunks. msvcsetup.bat was added to support this.
+
+Also generate the .pdb file that can be used to generate a useful crash report
+on MS-Windows. (George Reilly)
+
+==============================================================================
+BUG FIXES *bug-fixes-7*
+
+When using PostScript printing on MS-DOS the default 'printexpr' used "lpr"
+instead of "copy". When 'printdevice' was empty the copy command did not
+work. Use "LPT1" then.
+
+The GTK font dialog uses a font size zero when the font name doesn't include a
+size. Use a default size of 10.
+
+This example in the documentation didn't work: >
+ :e `=foo . ".c"`
+Skip over the expression in `=expr` when looking for comments, |, % and #.
+
+When ":helpgrep" doesn't find anything there is no error message.
+
+"L" and "H" did not take closed folds into account.
+
+Win32: The "-P title" argument stopped at the first title that matched, even
+when it doesn't support MDI.
+
+Mac GUI: CTRL-^ and CTRL-@ did not work.
+
+"2daw" on "word." at the end of a line didn't include the preceding white
+space.
+
+Win32: Using FindExecutable() doesn't work to find a program. Use
+SearchPath() instead. For executable() use $PATHEXT when the program searched
+for doesn't have an extension.
+
+When 'virtualedit' is set, moving the cursor up after appending a character
+may move it to a different column. Was caused by auto-formatting moving the
+cursor and not putting it back where it was.
+
+When indent was added automatically and then moving the cursor, the indent was
+not deleted (like when pressing ESC). The "I" flag in 'cpoptions' can be used
+to make it work the old way.
+
+When opening a command-line window, 'textwidth' gets set to 78 by the Vim
+filetype plugin. Reset 'textwidth' to 0 to avoid lines are broken.
+
+After using cursor(line, col) moving up/down doesn't keep the same column.
+
+Win32: Borland C before 5.5 requires using ".u." for LowPart and HighPart
+fields. (Walter Briscoe)
+
+On Sinix SYS_NMLN isn't always defined. Define it ourselves. (Cristiano De
+Michele)
+
+Printing with PostScript may keep the printer waiting for more. Append a
+CTRL-D to the printer output. (Mike Williams)
+
+When converting a string with a hex or octal number the leading '-' was
+ignored. ":echo '-05' + 0" resulted in 5 instead of -5.
+
+Using "@:" to repeat a command line didn't work when it contains control
+characters. Also remove "'<,'>" when in Visual mode to avoid that it appears
+twice.
+
+When using file completion for a user command, it would not expand environment
+variables like for a regular command with a file argument.
+
+'cindent': When the argument of a #define looks like a C++ class the next line
+is indented too much.
+
+When 'comments' includes multibyte characters inserting the middle part and
+alignment may go wrong. 'cindent' also suffers from this for right-aligned
+items.
+
+Win32: when 'encoding' is set to "utf-8" getenv() still returns strings in the
+active codepage. Convert to utf-8. Also for $HOME.
+
+The default for 'helplang' was "zh" for both "zh_cn" and "zh_tw". Now use
+"cn" or "tw" as intended.
+
+When 'bin' is set and 'eol' is not set then line2byte() added the line break
+after the last line while it's not there.
+
+Using foldlevel() in a WinEnter autocommand may not work. Noticed when
+resizing the GUI shell upon startup.
+
+Python: Using buffer.append(f.readlines()) didn't work. Allow appending a
+string with a trailing newline. The newline is ignored.
+
+When using the ":saveas f2" command for buffer "f1", the Buffers menu would
+contain "f2" twice, one of them leading to "f1". Also trigger the BufFilePre
+and BufFilePost events for the alternate buffer that gets the old name.
+
+strridx() did not work well when the needle is empty. (Ciaran McCreesh)
+
+GTK: Avoid a potential hang in gui_mch_wait_for_chars() when input arrives
+just before it is invoked
+
+VMS: Occasionally CR characters were inserted in the file. Expansion of
+environment variables was not correct. (Zoltan Arpadffy)
+
+UTF-8: When 'delcombine' is set "dw" only deleted the last combining character
+from the first character of the word.
+
+When using ":sball" in an autocommand only the filetype in one buffer was
+detected. Reset did_filetype in enter_buffer().
+
+When using ":argdo" and the window already was at the first argument index,
+but not actually editing it, the current buffer would be used instead.
+
+When ":next dir/*" includes many matches, adding the names to the argument
+list may take an awful lot of time and can't be interrupted. Allow
+interrupting this.
+
+When editing a file that was already loaded in a buffer, modelines were not
+used. Now window-local options in the modeline are set. Buffer-local options
+and global options remain unmodified.
+
+Win32: When 'encoding' is set to "utf-8" in the vimrc file, files from the
+command line with non-ASCII characters are not used correctly. Recode the
+file names when 'encoding' is set, using the Unicode command line.
+
+Win32 console: When the default for 'encoding' ends up to be "latin1", the
+default value of 'isprint' was wrong.
+
+When an error message is given while waiting for a character (e.g., when an
+xterm reports the number of colors), the hit-enter prompt overwrote the last
+line. Don't reset msg_didout in normal_cmd() for K_IGNORE.
+
+Mac GUI: Shift-Tab didn't work.
+
+When defining tooltip text, don't translate terminal codes, since it's not
+going to be used like a command.
+
+GTK 2: Check the tooltip text for valid utf-8 characters to avoid getting a
+GTK error. Invalid characters may appear when 'encoding' is changed.
+
+GTK 2: Add a safety check for invalid utf-8 sequences, they can crash pango.
+
+Win32: When 'encoding' is changed while starting up, use the Unicode command
+line to convert the file arguments to 'encoding'. Both for the GUI and the
+console version.
+
+Win32 GUI: latin9 text (iso-8859-15) was not displayed correctly, because
+there is no codepage for latin9. Do our own conversion from latin9 to UCS2.
+
+When two versions of GTK+ 2 are installed it was possible to use the header
+files from one and the library from the other. Use GTK_LIBDIR to put the
+directory for the library early in the link flags.
+
+With the GUI find/replace dialog a replace only worked if the pattern was
+literal text. Now it works for any pattern.
+
+When 'equalalways' is set and 'eadirection' is "hor", ":quit" would still
+cause equalizing window heights in the vertical direction.
+
+When ":emenu" is used in a startup script the command was put in the typeahead
+buffer, causing a prompt for the crypt key to be messed up.
+
+Mac OS/X: The default for 'isprint' included characters 128-160, causes
+problems for Terminal.app.
+
+When a syntax item with "containedin" is used, it may match in the start or
+end of a region with a matchgroup, while this doesn't happen for a "contains"
+argument.
+
+When a transparent syntax items matches in another item where the highlighting
+has already stopped (because of a he= argument), the highlighting would come
+back.
+
+When cscope is used to set the quickfix error list, it didn't get set if there
+was only one match. (Sergey Khorev)
+
+When 'confirm' is set and using ":bdel" in a modified buffer, then selecting
+"cancel", would still give an error message.
+
+The PopUp menu items that started Visual mode didn't work when not in Normal
+mode. Switching between selecting a word and a line was not possible.
+
+Win32: The keypad decimal point always resulted in a '.', while on some
+keyboards it's a ','. Use MapVirtualKey(VK_DECIMAL, 2).
+
+Removed unused function DisplayCompStringOpaque() from gui_w32.c
+
+In Visual mode there is not always an indication whether the line break is
+selected or not. Highlight the character after the line when the line break
+is included, e.g., after "v$o".
+
+GTK: The <F10> key can't be mapped, it selects the menu. Disable that with a
+GTK setting and do select the menu when <F10> isn't mapped. (David Necas)
+
+After "Y" '[ and '] were not at start/end of the yanked text.
+
+When a telnet connection is dropped Vim preserves files and exits. While
+doing that a SIGHUP may arrive and disturb us, thus ignore it. (Scott
+Anderson) Also postpone SIGHUP, SIGQUIT and SIGTERM until it's safe to
+handle. Added handle_signal().
+
+When completing a file name on the command line backslashes are required for
+white space. Was only done for a space, not for a Tab.
+
+When configure could not find a terminal library, compiling continued for a
+long time before reporting the problem. Added a configure check for tgetent()
+being found in a library.
+
+When the cursor is on the first char of the last line a ":g/pat/s///" command
+may cause the cursor to be displayed below the text.
+
+Win32: Editing a file with non-ASCII characters doesn't work when 'encoding'
+is "utf-8". use _wfullpath() instead of _fullpath(). (Yu-sung Moon)
+
+When recovering the 'fileformat' and 'fileencoding' were taken from the
+original file instead of from the swapfile. When the file didn't exist, was
+empty or the option was changed (e.g., with ":e ++fenc=cp123 file") it could
+be wrong. Now store 'fileformat' and 'fileencoding' in the swapfile and use
+the values when recovering.
+
+":bufdo g/something/p" overwrites each last printed text line with the file
+message for the next buffer. Temporarily clear 'shortmess' to avoid that.
+
+Win32: Cannot edit a file starting with # with --remote. Do escape % and #
+when building the ":drop" command.
+
+A comment or | just after an expression-backtick argument was not recognized.
+E.g. in :e `="foo"`"comment.
+
+"(" does not stop at an empty sentence (single dot and white space) while ")"
+does. Also breaks "das" on that dot.
+
+When doing "yy" with the cursor on a TAB the ruler could be wrong and "k"
+moved the cursor to another column.
+
+When 'commentstring' is '"%s' and there is a double quote in the line a double
+quote before the fold marker isn't removed in the text displayed for a closed
+fold.
+
+In Visual mode, when 'bin' and 'eol' set, g CTRL-G counted the last line
+break, resulting in "selected 202 of 201 bytes".
+
+Motif: fonts were not used for dialog components. (Marcin Dalecki)
+
+Motif: After using a toolbar button the keyboard focus would be on the toolbar
+(Lesstif problem). (Marcin Dalecki)
+
+When using "y<C-V>`x" where mark x is in the first column, the last line was
+not included.
+
+Not all test scripts work properly on MS-Windows when checked out from CVS.
+Use a Vim command to fix all fileformats to dos before executing the tests.
+
+When using ":new" and the file fits in the window, lines could still be above
+the window. Now remove empty lines instead of keeping the relative position.
+
+Cmdline completion didn't work after ":let var1 var<Tab>".
+
+When using ":startinsert" or ":startreplace" when already in Insert mode
+(possible when using CTRL-R =), pressing Esc would directly restart Insert
+mode. (Peter Winters)
+
+"2daw" didn't work at end of file if the last word is a single character.
+
+Completion for ":next a'<Tab>" put a backslash before single quote, but it was
+not removed when editing a file. Now halve backslashes in save_patterns().
+Also fix expanding a file name with the shell that contains "\'".
+
+When doing "1,6d|put" only "fewer lines" was reported. Now a following "more
+lines" overwrites the message.
+
+Configure could not handle "-Dfoo=long\ long" in the TCL config output.
+
+When searching backwards, using a pattern that matches a newline and uses \zs
+after that, didn't find a match. Could also get a hang or end up in the right
+column in the wrong line.
+
+When $LANG is "sl" for slovenian, the slovak menu was used, since "slovak"
+starts with "sl".
+
+When 'paste' is set in the GUI the Paste toolbar button doesn't work. Clear
+'paste' when starting the GUI.
+
+A message about a wrong viminfo line included the trailing NL.
+
+When 'paste' is set in the GUI the toolbar button doesn't work in Insert mode.
+Use ":exe" in menu.vim to avoid duplicating the commands, instead of using a
+mapping.
+
+Treat "mlterm" as an xterm-like terminal. (Seiichi Sato)
+
+":z.4" and ":z=4" didn't work Vi compatible.
+
+When sourcing a file, editing it and sourcing it again, it could appear twice
+in ":scriptnames" and get a new <SID>, because the inode has changed.
+
+When $SHELL is set but empty the 'shell' option would be empty. Don't use an
+empty $SHELL value.
+
+A command "w! file" in .vimrc or $EXINIT didn't work. Now it writes an empty
+file.
+
+When a CTRL-F command at the end of the file failed, the cursor was still
+moved to the start of the line. Now it remains where it is.
+
+When using ":s" or "&" to repeat the last substitute and "$" was used to put
+the cursor in the last column, put the cursor in the last column again. This
+is Vi compatible.
+
+Vim is not fully POSIX compliant but sticks with traditional Vi behavior.
+Added a few flags in 'cpoptions' to behave the POSIX way when wanted. The
+$VIM_POSIX environment variable is checked to set the default.
+
+Appending to a register didn't insert a line break like Vi. Added the '>'
+flag to 'cpoptions' for this.
+
+Using "I" in a line with only blanks appended to the line. This is not Vi
+compatible. Added the 'H' flag in 'cpoptions' for this.
+
+When joining multiple lines the cursor would be at the last joint, but Vi
+leaves it at the position where "J" would put it. Added the 'q' flag in
+'cpoptions' for this.
+
+Autoindent didn't work for ":insert" and ":append".
+
+Using ":append" in an empty buffer kept the dummy line. Now it's deleted to
+be Vi compatible.
+
+When reading commands from a file and stdout goes to a terminal, would still
+request the xterm version. Vim can't read it, thus the output went to the
+shell and caused trouble there.
+
+When redirecting to a register with an invalid name the redirection would
+still be done (after an error message). Now reset "redir_reg". (Yegappan
+Lakshmanan)
+
+It was not possible to use a NL after a backslash in Ex mode. This is
+sometimes used to feed multiple lines to a shell command.
+
+When 'cmdheight' is set to 2 in .vimrc and the GUI uses the number of lines
+from the terminal we actually get 3 lines for the cmdline in gvim.
+
+When setting $HOME allocated memory would leak.
+
+Win32: bold characters may sometimes write in another character cell. Use
+unicodepdy[] as for UTF-8. (Taro Muraoka)
+
+":w fname" didn't work for files with 'buftype' set to "nofile".
+
+The method used to locate user commands for completion differed from when they
+are executed. Ambiguous command names were not completed properly.
+
+Incremental search may cause a crash when there is a custom statusline that
+indirectly invokes ":normal".
+
+Diff mode failed when $DIFF_OPTIONS was set in the environment. Unset it
+before invoking "diff".
+
+Completion didn't work after ":argdo", ":windo" and ":bufdo". Also for ":set
+&l:opt" and ":set &g:opt". (Peter Winters)
+
+When setting 'ttymouse' to "dec" in an xterm that supports the DEC mouse
+locator it doesn't work. Now switch off the mouse before selecting another
+mouse model.
+
+When the CursorHold event is triggered and the commands peek for typed
+characters the typeahead buffer may be messed up, e.g., when a mouse-up event
+is received. Avoid invoking the autocommands from the function waiting for a
+character, let it put K_CURSORHOLD in the input buffer.
+
+Removed the "COUNT" flag from ":argadd", to avoid ":argadd 1*" to be used like
+":1argadd *". Same for ":argdelete" and ":argedit".
+
+Avoid that $LANG is used for the menus when LC_MESSAGES is "en_US".
+
+Added backslashes before dashes in the vim.1 manual page to make them appear
+as real dashes. (Pierre Habouzit)
+
+Where "gq" left the cursor depended on the value of 'formatprg'. Now "gq"
+always leaves the cursor at the last line of the formatted text.
+
+When editing a compressed file, such as "changelog.Debian.gz" file, filetype
+detection may try to check the contents of the file while it's still
+compressed. Skip setting 'filetype' for compressed files until they have been
+decompressed. Required for patterns that end in a "*".
+
+Starting with an argument "+cmd" or "-S script" causes the cursor to be moved
+to the first line. That breaks a BufReadPost autocommand that uses g`".
+Don't move the cursor if it's somewhere past the first line.
+
+"gg=G" while 'modifiable' is off was uninterruptible.
+
+When 'encoding' is "sjis" inserting CTRL-V u d800 a few times causes a crash.
+Don't insert a DBCS character with a NUL second byte.
+
+In Insert mode CTRL-O <Home> didn't move the cursor. Made "ins_at_eol" global
+and reset it in nv_home().
+
+Wildcard expansion failed: ":w /tmp/$$.`echo test`". Don't put quotes around
+spaces inside backticks.
+
+After this sequence of commands: Y V p gv: the wrong line is selected. Now
+let "gv" select the text that was put, since the original text is deleted.
+This should be the most useful thing to do.
+
+":sleep 100u" sleeps for 100 seconds, not 100 usec as one might expect. Give
+an error message when the argument isn't recognized.
+
+In gui_mch_draw_string() in gui_w32.c "unibuflen" wasn't static, resulting in
+reallocating the buffer every time. (Alexei Alexandrov)
+
+When using a Python "atexit" function it was not invoked when Vim exits. Now
+call Py_Finalize() for that. (Ugo Di Girolamo)
+This breaks the thread stuff though, fixed by Ugo.
+
+GTK GUI: using a .vimrc with "set cmdheight=2 lines=43" and ":split" right
+after startup, the window layout is messed up. (Michael Schaap) Added
+win_new_shellsize() call in gui_init() to fix the topframe size.
+
+Trick to get ...MOUSE_NM not used when there are vertical splits. Now pass
+column -1 for the left most window and add MOUSE_COLOFF for others. Limits
+mouse column to 10000.
+
+searchpair() may hang when the end pattern has "\zs" at the end. Check that
+we find the same position again and advance one character.
+
+When in diff mode and making a change that causes the "changed" highlighting
+to disappear or reappear, it was still highlighted in another window.
+
+When a ":next" command fails because the user selects "Abort" at the ATTENTION
+prompt the argument index was advanced anyway.
+
+When "~" is in 'iskeyword' the "gd" doesn't work, it's used for the previous
+substitute pattern. Put "\V" in the pattern to avoid that.
+
+Use of sprintf() sometimes didn't check properly for buffer overflow. Also
+when using smsg(). Included code for snprintf() to avoid having to do size
+checks where invoking them
+
+":help \=<Tab>" didn't find "sub-replace-\=". Wild menu for help tags didn't
+show backslashes. ":he :s\=" didn't work.
+
+When reading an errorfile "~/" in a file name was not expanded.
+
+GTK GUI: When adding a scrollbar (e.g. when using ":vsplit") in a script or
+removing it the window size may change. GTK sends us resize events when we
+change the window size ourselves, but they may come at an unexpected moment.
+Peek for a character to get any window resize events and fix 'columns' and
+'lines' to undo this.
+
+When using the GTK plug mechanism, resizing and focus was not working
+properly. (Neil Bird)
+
+After deleting files from the argument list a session file generated with
+":mksession" may contain invalid ":next" commands.
+
+When 'shortmess' is empty and 'keymap' set to accents, in Insert mode CTRL-N
+may cause the hit-enter prompt. Typing 'a then didn't result in the accented
+character. Put the character typed at the prompt back in the typeahead buffer
+so that mapping is done in the right mode.
+
+setbufvar() and setwinvar() did not give error messages.
+
+It was possible to set a variable with an illegal name, e.g. with setbufvar().
+It was possible to define a function with illegal name, e.t. ":func F{-1}()"
+
+CTRL-W F and "gf" didn't use the same method to get the file name.
+
+When reporting a conversion error the line number of the last error could be
+given. Now report the first encountered error.
+
+When using ":e ++enc=name file" and iconv() was used for conversion an error
+caused a fall-back to no conversion. Now replace a character with '?' and
+continue.
+
+When opening a new buffer the local value of 'bomb' was not initialized from
+the global value.
+
+Win32: When using the "Edit with Vim" entry the file name was limited to about
+200 characters.
+
+When using command line completion for ":e *foo" and the file "+foo" exists
+the resulting command ":e +foo" doesn't work. Now insert a backslash: ":e
+\+foo".
+
+When the translation of "-- More --" was not 10 characters long the following
+message would be in the wrong position.
+
+At the more-prompt the last character in the last line wasn't drawn.
+
+When deleting non-existing text while 'virtualedit' is set the '[ and '] marks
+were not set.
+
+Win32: Could not use "**/" in 'path', it had to be "**\".
+
+The search pattern "\n" did not match at the end of the last line.
+
+Searching for a pattern backwards, starting on the NUL at the end of the line
+and 'encoding' is "utf-8" would match the pattern just before it incorrectly.
+Affected searchpair('/\*', '', '\*/').
+
+For the Find/Replace dialog it was possible that not finding the text resulted
+in an error message while redrawing, which cleared the syntax highlighting
+while it was being used, resulting in a crash. Now don't clear syntax
+highlighting, disable it with b_syn_error.
+
+Win32: Combining UTF-8 characters were drawn on the previous character.
+Could be noticed with a Thai font.
+
+Output of ":function" could leave some of the typed text behind. (Yegappan
+Lakshmanan)
+
+When the command line history has only a few lines the command line window
+would be opened with these lines above the first window line.
+
+When using a command line window for search strings ":qa" would result in
+searching for "qa" instead of quitting all windows.
+
+GUI: When scrolling with the scrollbar and there is a line that doesn't fit
+redrawing may fail. Make sure w_skipcol is valid before redrawing.
+
+Limit the values of 'columns' and 'lines' to avoid an overflow in Rows *
+Columns. Fixed bad effects when running out of memory (command line would be
+reversed, ":qa!" resulted in ":!aq").
+
+Motif: "gvim -iconic" opened the window anyway. (David Harrison)
+
+There is a tiny chance that a symlink gets created between checking for an
+existing file and creating a file. Use the O_NOFOLLOW for open() if it's
+available.
+
+In an empty line "ix<CTRL-O>0" moved the cursor to after the line instead of
+sticking to the first column.
+
+When using ":wq" and a BufWriteCmd autocmd uses inputsecret() the text was
+echoed anyway. Set terminal to raw mode in getcmdline().
+
+Unix: ":w a;b~c" caused an error in expanding wildcards.
+
+When appending to a file with ":w >>fname" in a buffer without a name, causing
+the buffer to use "fname", the modified flag was reset.
+
+When appending to the current file the "not edited" flag would be reset.
+":w" would overwrite the file accidentally.
+
+Unix: When filtering text with an external command Vim would still read input,
+causing text typed for the command (e.g., a password) to be eaten and echoed.
+Don't read input when the terminal is in cooked mode.
+
+The Cygwin version of xxd used CR/LF line separators. (Corinna Vinschen)
+
+Unix: When filtering text through a shell command some resulting text may be
+dropped. Now after detecting that the child has exited try reading some more
+of its output.
+
+When inside input(), using "CTRL-R =" and the expression throws an exception
+the command line was not abandoned but it wasn't used either. Now abandon
+typing the command line.
+
+'delcombine' was also used in Visual and Select mode and for commands like
+"cl". That was illogical and has been disabled.
+
+When recording while a CursorHold autocommand was defined special keys would
+appear in the register. Now the CursorHold event is not triggered while
+recording.
+
+Unix: the src/configure script used ${srcdir-.}, not all shells understand
+that. Use ${srcdir:-.} instead.
+
+When editing file "a" which is a symlink to file "b" that doesn't exist,
+writing file "a" to create "b" and then ":split b" resulted in two buffers on
+the same file with two different swapfile names. Now set the inode in the
+buffer when creating a new file.
+
+When 'esckeys' is not set don't send the xterm code to request the version
+string, because it may cause trouble in Insert mode.
+
+When evaluating an expression for CTRL-R = on the command line it was possible
+to call a function that opens a new window, resulting in errors for
+incremental search, and many other nasty things were possible. Now use the
+|textlock| to disallow changing the buffer or jumping to another window
+to protect from unexpected behavior. Same for CTRL-\ e.
+
+"d(" deleted the character under the cursor, while the documentation specified
+an exclusive motion. Vi also doesn't delete the character under the cursor.
+
+Shift-Insert in Insert mode could put the cursor before the last character
+when it just fits in the window. In coladvance() don't stop at the window
+edge when filling with spaces and when in Insert mode. In mswin.vim avoid
+getting a beep from the "l" command.
+
+Win32 GUI: When Alt-F4 is used to close the window and Cancel is selected in
+the dialog then Vim would insert <M-F4> in the text. Now it's ignored.
+
+When ":silent! {cmd}" caused the swap file dialog, which isn't displayed,
+there would still be a hit-enter prompt.
+
+Requesting the termresponse (|t_RV|) early may cause problems with "-c"
+arguments that invoke an external command or even "-c quit". Postpone it
+until after executing "-c" arguments.
+
+When typing in Insert mode so that a new line is started, using CTRL-G u to
+break undo and start a new change, then joining the lines with <BS> caused
+undo info to be missing. Now reset the insertion start point.
+
+Syntax HL: When a region start match has a matchgroup and an offset that
+happens to be after the end of the line then it continued in the next line and
+stopped at the region end match, making the region continue after that.
+Now check for the column being past the end of the line in syn_add_end_off().
+
+When changing a file, setting 'swapfile' off and then on again, making another
+change and killing Vim, then some blocks may be missing from the swapfile.
+When 'swapfile' is switched back on mark all blocks in the swapfile as dirty.
+Added mf_set_dirty().
+
+Expanding wildcards in a command like ":e aap;<>!" didn't work. Put
+backslashes before characters that are special to the shell. (Adri Verhoef)
+
+A CursorHold autocommand would cause a message to be cleared. Don't show the
+special key for the event for 'showcmd'.
+
+When expanding a file name for a shell command, as in "!cmd foo<Tab>" or ":r
+!cmd foo<Tab>" also escape characters that are special for the shell:
+"!;&()<>".
+
+When the name of the buffer was set by a ":r fname" command |cpo-f| no
+autocommands were triggered to notify about the change in the buffer list.
+
+In the quickfix buffer 'bufhidden' was set to "delete", which caused closing
+the quickfix window to leave an unlisted "No Name" buffer behind every time.
+
+Win32: when using two screens of different size, setting 'lines' to a large
+value didn't fill the whole screen. (SungHyun Nam)
+
+Win32 installer: The generated _vimrc contained an absolute path to diff.exe.
+After upgrading it becomes invalid. Now use $VIMRUNTIME instead.
+
+The command line was cleared too often when 'showmode' was set and ":silent
+normal vy" was used. Don't clear the command line unless the mode was
+actually displayed. Added the "mode_displayed" variable.
+
+The "load session" toolbar item could not handle a space or other special
+characters in v:this_session.
+
+":set sta ts=8 sw=4 sts=2" deleted 4 spaces halfway a line instead of 2.
+
+In a multibyte file the foldmarker could be recognized in the trail byte.
+(Taro Muraoka)
+
+Pasting with CTRL-V and menu didn't work properly when some commands are
+mapped. Use ":normal!" instead of ":normal". (Tony Apuzzo)
+
+Crashed when expanding a file name argument in backticks.
+
+In some situations the menu and scrollbar didn't work, when the value contains
+a CSI byte. (Yukihiro Nakadaira)
+
+GTK GUI: When drawing the balloon focus changes and we might get a key release
+event that removed the balloon again. Ignore the key release event.
+
+'titleold' was included in ":mkexrc" and ":mksession" files.
+
+":set background&" didn't use the same logic as was used when starting up.
+
+When "umask" is set such that nothing is writable then the viminfo file would
+be written without write permission. (Julian Bridle)
+
+Motif: In diff mode dragging one scrollbar didn't update the scrollbar of the
+other diff'ed window.
+
+When editing in an xterm with a different number of colors than expected the
+screen would be cleared and redrawn, causing the message about the edited file
+to be cleared. Now set "keep_msg" to redraw the last message.
+
+For a color terminal: When the Normal HL uses bold, possibly to make the color
+lighter, and another HL group specifies a color it might become light as well.
+Now reset bold if a HL group doesn't specify bold itself.
+
+When using 256 color xterm the color 255 would show up as color 0. Use a
+short instead of a char to store the color number.
+
+ml_get errors when searching for "\n\zs" in an empty file.
+
+When selecting a block and using "$" to select until the end of every line and
+not highlighting the character under the cursor the first character of the
+block could be unhighlighted.
+
+When counting words for the Visual block area and using "$" to select until
+the end of every line only up to the length of the last line was counted.
+
+"dip" in trailing empty lines left one empty line behind.
+
+The script ID was only remembered globally for each option. When a buffer- or
+window-local option was set the same "last set" location was changed for all
+buffers and windows. Now remember the script ID for each local option
+separately.
+
+GUI: The "Replace All" button didn't handle backslashes in the replacement in
+the same way as "Replace". Escape backslashes so that they are taken
+literally.
+
+When using Select mode from Insert mode and typing a key, causing lines to be
+deleted and a message displayed, delayed the effect of inserting the key.
+Now overwrite the message without delay.
+
+When 'whichwrap' includes "l" then "dl" and "yl" on a single letter line
+worked differently. Now recognize all operators when using "l" at the end of
+a line.
+
+GTK GUI: when the font selector returned a font name with a comma in it then
+it would be handled like two font names. Now put a backslash before the
+comma.
+
+MS-DOS, Win32: When 'encoding' defaults to "latin1" then the value for
+'iskeyword' was still for CPxxx. And when 'nocompatible' was set 'isprint'
+would also be the wrong value.
+
+When a command was defined not to take arguments and no '|' no warning message
+would be given for using a '|'. Also with ":loadkeymap".
+
+Motif: When using a fontset and 'encoding' is "utf-8" and sizeof(wchar_t) !=
+sizeof(XChar2b) then display was wrong. (Yukihiro Nakadaira)
+
+":all" always set the current window to the first window, even when it
+contains a buffer that is not in the argument list (can't be closed because it
+is modified). Now go to the window that has the first item of the argument
+list.
+
+GUI: To avoid left-over pixels from bold text all characters after a character
+with special attributes were redrawn. Now only do this for characters that
+actually are bold. Speeds up displaying considerably.
+
+When only highlighting changes and the text is scrolled at the same time
+everything is redrawn instead of using a scroll and updating the changed text.
+E.g., when using ":match" to highlight a paren that the cursor landed on.
+Added SOME_VALID: Redraw the whole window but also try to scroll to minimize
+redrawing.
+
+Win32: When using Korean IME making it active didn't work properly. (Moon,
+Yu-sung, 2005 March 21)
+
+Ruby interface: when inserting/deleting lines display wasn't updated. (Ryan
+Paul)
+
+--- fixes since Vim 7.0b ---
+
+Getting the GCC version in configure didn't work with Solaris sed. First
+strip any "darwin." and then get the version number.
+
+The "autoload" directory was missing from the self-installing executable for
+MS-Windows.
+
+The MS-Windows install program would find "vimtutor.bat" in the install
+directory. After changing to "c:" also change to "\" to avoid looking in the
+install directory.
+
+To make the 16 bit DOS version compile exclude not used highlight
+initializations and build a tiny instead of small version.
+
+finddir() and findfile() accept a negative count and return a List then.
+
+The Python indent file contained a few debugging statements, removed.
+
+Expanding {} for a function name, resulting in a name starting with "s:" was
+not handled correctly.
+
+Spelling: renamed COMPOUNDMAX to COMPOUNDWORDMAX. Added several items to be
+able to handle the new Hungarian dictionary.
+
+Mac: Default to building for the current platform only, that is much faster
+than building a universal binary. Also, using Perl/Python/etc. only works for
+the current platform.
+
+The time on undo messages disappeared for someone. Using %T for strftime()
+apparently doesn't work everywhere. Use %H:%M:%S instead.
+
+Typing BS at the "z=" prompt removed the prompt.
+
+--- fixes and changes since Vim 7.0c ---
+
+When jumping to another tab page the Vim window size was always set, even when
+nothing in the layout changed.
+
+Win32 GUI tab pages line wasn't always enabled. Do a proper check for the
+compiler version.
+
+Win32: When switching between tab pages the Vim window was moved when part of
+it was outside of the screen. Now only do that in the direction of a size
+change.
+
+Win32: added menu to GUI tab pages line. (Yegappan Lakshmanan)
+
+Mac: Added document icons. (Benji Fisher)
+
+Insert mode completion: Using Enter to accept the current match causes
+confusion. Use CTRL-Y instead. Also, use CTRL-E to go back to the typed
+text.
+
+GUI: When there are left and right scrollbars, ":tabedit" kept them instead of
+using the one that isn't needed.
+
+Using "gP" to replace al the text could leave the cursor below the last line,
+causing ml_get errors.
+
+When 'cursorline' is set don't use the highlighting when Visual mode is
+active, otherwise it's difficult to see the selected area.
+
+The matchparen plugin restricts the search to 100 lines, to avoid a long delay
+when there are closed folds.
+
+Sometimes using CTRL-X s to list spelling suggestions used text from another
+line.
+
+Win32: Set the default for 'isprint' back to the wrong default "@,~-255",
+because many people use Windows-1252 while 'encoding' is "latin1".
+
+GTK: Added a workaround for gvim crashing when used over an untrusted ssh
+link, caused by GTK doing something nasty. (Ed Catmur)
+
+Win32: The font used for the tab page labels is too big. Use the system menu
+font. (George Reilly)
+
+Win32: Adjusting the window position and size to keep it on the screen didn't
+work properly when the taskbar is on the left or top of the screen.
+
+The installman.sh and installml.sh scripts use ${10}, that didn't work with
+old shells. And use "test -f" instead of "test -e".
+
+Win32: When 'encoding' was set in the vimrc then a directory argument for diff
+mode didn't work.
+
+GUI: at the inputlist() prompt the cursorshape was adjusted as if the windows
+were still at their old position.
+
+The parenmatch plugin didn't remember the highlighting per window.
+
+Using ":bd" for a buffer that's the current window in another tab page caused
+a crash.
+
+For a new tab page the 'scroll' option wasn't set to a good default.
+
+Using an end offset for a search "/pat/e" didn't work properly for multibyte
+text. (Yukihiro Nakadaira)
+
+":s/\n/,/" doubled the text when used on the last line.
+
+When "search" is in 'foldopen' "[s" and "]s" now open folds.
+
+When using a numbered function "dict" can be omitted, but "self" didn't work
+then. Always add FC_DICT to the function flags when it's part of a
+dictionary.
+
+When "--remote-tab" executes locally it left an empty tab page.
+
+"gvim -u NONE", ":set cursorcolumn", "C" in the second line didn't update
+text. Do update further lines even though the "$" is displayed.
+
+VMS: Support GTK better, also enable +clientserver. (Zoltan Arpadffy)
+
+When highlighting of statusline or tabline is changed there was no redraw to
+show the effect.
+
+Mac: Added "CFBundleIdentifier" to infplist.xml.
+
+Added tabpage-local variables t:var.
+
+Win32: Added double-click in tab pages line creates new tab. (Yegappan
+Lakshmanan)
+
+Motif: Added GUI tab pages line. (Yegappan Lakshmanan)
+
+Fixed crash when 'lines' was set to 1000 in a modeline.
+
+When init_spellfile() finds a writable directory in 'runtimepath' but it
+doesn't contain a "spell" directory, create one.
+
+Win32: executable() also finds "xxd" in the directory where Vim was started,
+but "!xxd" doesn't work. Append the Vim starting directory to $PATH.
+
+The tab page labels are shortened, directory names are reduced to a single
+letter by default. Added the pathshorten() function to allow a user to do the
+same.
+
+":saveas" now resets 'readonly' if the file was successfully written.
+
+Set $MYVIMRC file to the first found .vimrc file.
+Set $MYGVIMRC file to the first found .gvimrc file.
+Added menu item "Startup Settings" that edits the $MYVIMRC file
+
+Added matcharg().
+
+Error message E745 appeared twice. Renamed one to E786.
+
+Fixed crash when using "au BufRead * Sexplore" and doing ":help". Was wiping
+out a buffer that's still in a window.
+
+":hardcopy" resulted in an error message when 'encoding' is "utf-8" and
+'printencoding' is empty. Now it assumes latin1. (Mike Williams)
+
+The check for the toolbar feature for Motif, depending on certain included
+files, wasn't detailed enough, causing building to fail in gui_xmebw.c.
+
+Using CTRL-E in Insert mode completion after CTRL-P inserted the first match
+instead of the original text.
+
+When displaying a UTF-8 character with a zero lower byte Vim might think the
+previous character is double-wide.
+
+The "nbsp" item of 'listchars' didn't work when 'encoding' was utf-8.
+
+Motif: when Xm/xpm.h is missing gui_xmebw.c would not compile.
+HAVE_XM_UNHIGHLIGHTT_H was missing a T.
+
+Mac: Moved the .icns files into src/os_mac_rsrc, so that they can all be
+copied at once. Adjusted the Info.plist file for three icons.
+
+When Visual mode is active while switching to another tabpage could get ml_get
+errors.
+
+When 'list' is set, 'nowrap' the $ in the first column caused 'cursorcolumn'
+to move to the right.
+
+When a line wraps, 'cursorcolumn' was never displayed past the end of the
+line.
+
+'autochdir' was only available when compiled with NetBeans and GUI. Now it's
+a separate feature, also available in the "big" version.
+
+Added CTRL-W gf: open file under cursor in new tab page.
+
+When using the menu in the tab pages line, "New Tab" opens the new tab before
+where the click was. Beyond the labels the new tab appears at the end instead
+of after the current tab page.
+
+Inside a mapping with an expression getchar() could not be used.
+
+When vgetc is used recursively vgetc_busy protects it from being used
+recursively. But after a ":normal" command the protection was reset.
+
+":s/a/b/n" didn't work when 'modifiable' was off.
+
+When $VIMRUNTIME includes a multibyte character then rgb.txt could not be
+found. (Yukihiro Nakadaira)
+
+":mkspell" didn't work correctly for non-ASCII affix flags when conversion is
+needed on the spell file.
+
+glob('/dir/\$ABC/*') didn't work.
+
+When using several tab pages and changing 'cmdheight' the display could become
+messed up. Now store the value of 'cmdheight' separately for each tab page.
+
+The user of the Enter key while the popup menu is visible was still confusing.
+Now use Enter to select the match after using a cursor key.
+
+Added "usetab" to 'switchbuf'.
+
+
+--- fixes and changes since Vim 7.0d ---
+
+Added CTRL-W T: move a window to a new tab page.
+
+Using CTRL-X s in Insert mode to complete spelling suggestions and using BS
+deleted characters before the bad word.
+
+A few small fixes for the VMS makefile. (Zoltan Arpadffy)
+
+With a window of 91 lines 45 cols, ":vsp" scrolled the window. Copy w_wrow
+when splitting a window and skip setting the height when it's already at the
+right value.
+
+Using <silent> in a mapping with a shell command and the GUI caused redraw
+to use wrong attributes.
+
+Win32: Using MSVC 4.1 for install.exe resulted in the start menu items to be
+created in the administrator directory instead of "All Users". Define the
+CSIDL_ items if they are missing.
+
+Motif: The GUI tabline did not use the space above the right scrollbar. Work
+around a bug in the Motif library. (Yegappan Lakshmanan)
+
+The extra files for XML Omni completion are now also installed.
+|xml-omni-datafile|
+
+GTK GUI: when 'm' is missing from 'guioptions' during startup and pressing
+<F10> GTK produced error messages. Now do create the menu but disable it just
+after the first gui_mch_update().
+
+":mkspell" doesn't work well with the Hungarian dictionary from the Hunspell
+project. Back to the Myspell dictionary.
+
+In help files hide the | used around tags.
+
+Renamed pycomplete to pythoncomplete.
+
+Added "tabpages" to 'sessionoptions'.
+
+When 'guitablabel' is set the effect wasn't visible right away.
+
+Fixed a few 'cindent' errors.
+
+When completing menu names, e.g., after ":emenu", don't sort the entries but
+keep them in the original order.
+
+Fixed a crash when editing a directory in diff mode. Don't trigger
+autocommands when executing the diff command.
+
+Getting a keystroke could get stuck if 'encoding' is a multibyte encoding and
+typing a special key.
+
+When 'foldignore' is set the folds were not updated right away.
+
+When a list is indexed with [a : b] and b was greater than the length an error
+message was given. Now silently truncate the result.
+
+When using BS during Insert mode completion go back to the original text, so
+that CTRL-N selects the first matching entry.
+
+Added the 'M' flag to 'cinoptions'.
+
+Win32: Make the "gvim --help" window appear in the middle of the screen
+instead of at an arbitrary position. (Randall W. Morris)
+
+Added gettabwinvar() and settabwinvar().
+
+Command line completion: pressing <Tab> after ":e /usr/*" expands the whole
+tree, because it becomes ":e /usr/**". Don't add a star if there already is
+one.
+
+Added grey10 to grey90 to all GUIs, so that they can all be used for
+initializing highlighting. Use grey40 for CursorColumn and CursorLine when
+'background' is "dark".
+
+When reading a file and using iconv for conversion, an incomplete byte
+sequence at the end caused problems. (Yukihiro Nakadaira)
+
+
+--- fixes and changes since Vim 7.0e ---
+
+Default color for MatchParen when 'background' is "dark" is now DarkCyan.
+
+":syn off" had to be used twice in a file that sets 'syntax' in a modeline.
+(Michael Geddes)
+
+When using ":vsp" or ":sp" the available space wasn't used equally between
+windows. (Servatius Brandt)
+
+Expanding <cWORD> on a trailing blank resulted in the first word in the line
+if 'encoding' is a multibyte encoding.
+
+Spell checking: spellbadword() didn't see a missing capital in the first word
+of a line. Popup menu now only suggest the capitalized word when appropriate.
+
+When using whole line completion CTRL-L moves through the matches but it
+didn't work when at the original text.
+
+When completion finds the longest match, don't go to the first match but stick
+at the original text, so that CTRL-N selects the first one.
+
+Recognize "zsh-beta" like "zsh" for setting the 'shellpipe' default. (James
+Vega)
+
+When using ":map <expr>" and the expression results in something with a
+special byte (NUL or CSI) then it didn't work properly. Now escape special
+bytes.
+
+The default Visual highlighting for a color xterm with 8 colors was a magenta
+background, which made magenta text disappear. Now use reverse in this
+specific situation.
+
+After completing the longest match "." didn't insert the same text. Repeating
+also didn't work correctly for multibyte text.
+
+When using Insert mode completion and BS the whole word that was completed
+would result in all possible matches. Now stop completion. Also fixes that
+for spell completion the previous word was deleted.
+
+GTK: When 'encoding' is "latin1" and using non-ASCII characters in a file name
+the tab page label was wrong and an error message would be given.
+
+The taglist() function could hang on a tags line with a non-ASCII character.
+
+Win32: When 'encoding' differs from the system encoding tab page labels with
+non-ASCII characters looked wrong. (Yegappan Lakshmanan)
+
+Motif: building failed when Xm/Notebook.h doesn't exist. Added a configure
+check, disable GUI tabline when it's missing.
+
+Mac: When compiled without multibyte feature the clipboard didn't work.
+
+It was possible to switch to another tab page when the cmdline window is open.
+
+Completion could hang when 'lines' is 6 and a preview window was opened.
+
+Added CTRL-W gF: open file under cursor in new tab page and jump to the line
+number following the file name.
+Added 'guitabtooltip'. Implemented for Win32 (Yegappan Lakshmanan).
+
+Added "throw" to 'debug' option: throw an exception for error messages even
+when they would otherwise be ignored.
+
+When 'keymap' is set and a line contains an invalid entry could get a "No
+mapping found" warning instead of a proper error message.
+
+Motif: default to using XpmAttributes instead of XpmAttributes_21.
+
+A few more changes for 64 bit MS-Windows. (George Reilly)
+
+Got ml_get errors when doing "o" and selecting in other window where there are
+less lines shorter than the cursor position in the other window. ins_mouse()
+was using position in wrong window.
+
+Win32 GUI: Crash when giving a lot of messages during startup. Allocate twice
+as much memory for the dialog template.
+
+Fixed a few leaks and wrong pointer use reported by coverity.
+
+When showing menus the mode character was sometimes wrong.
+
+Added feedkeys(). (Yakov Lerner)
+
+Made matchlist() always return all submatches.
+
+Moved triggering QuickFixCmdPost to before jumping to the first location.
+
+Mac: Added the 'macatsui' option as a temporary work around for text drawing
+problems.
+
+Line completion on "/**" gave error messages when scanning an unloaded buffer.
+
+--- fixes and changes since Vim 7.0f ---
+
+Win32: The height of the tab page labels is now adjusted to the font height.
+(Yegappan Lakshmanan)
+
+Win32: selecting the tab label was off by one. (Yegappan Lakshmanan)
+
+Added tooltips for Motif and GTK tab page labels. (Yegappan Lakshmanan)
+
+When 'encoding' is "utf-8" then ":help spell" would report an illegal byte and
+the file was not converted from latin1 to utf-8. Now retry with latin1 if
+reading the file as utf-8 results in illegal bytes.
+
+Escape the argument of feedkeys() before putting it in the typeahead buffer.
+(Yukihiro Nakadaira)
+
+Added the v:char variable for evaluating 'formatexpr'. (Yukihiro Nakadaira)
+
+With 8 colors Search highlighting combined with Statement highlighted text
+made the text disappear.
+
+VMS: avoid warnings for redefining MAX and MIN. (Zoltan Arpadffy)
+
+When 'virtualedit' includes "onemore", stopping Visual selection would still
+move the cursor left.
+
+Prevent that using CTRL-R = in Insert mode can start Visual mode.
+
+Fixed a crash that occurred when in Insert mode with completion active and a
+mapping caused edit() to be called recursively.
+
+When using CTRL-O in Insert mode just after the last character while
+'virtualedit' is "all", then typing CR moved the last character to the next
+line. Call coladvance() before starting the new line.
+
+When using |:shell| ignore clicks on the tab page labels. Also when using the
+command line window.
+
+When 'eventignore' is "all" then adding more to ignoring some events, e.g.,
+for ":vimgrep", would actually trigger more events.
+
+Win32: When a running Vim uses server name GVIM1 then "gvim --remote fname"
+didn't find it. When looking for a server name that doesn't end in a digit
+and it is not found then use another server with that name and a number (just
+like on Unix).
+
+When using "double" in 'spellsuggest' when the language doesn't support sound
+folding resulted in too many suggestions.
+
+Win32: Dropping a shortcut on the Vim icon didn't edit the referred file like
+editing it in another way would. Use fname_expand() in buf_set_name() instead
+of simply make the file name a full path.
+
+Using feedkeys() could cause Vim to hang.
+
+When closing another tab page from the tabline menu in Insert mode the tabline
+was not updated right away.
+
+The syntax menu didn't work in compatible mode.
+
+After using ":tag id" twice with the same "id", ":ts" and then ":pop" a ":ts"
+reported no matching tag. Clear the cached tag name.
+
+In Insert mode the matchparen plugin highlighted the wrong paren when there is
+a string just next to a paren.
+
+GTK: After opening a new tab page the text was sometimes not drawn correctly.
+Flush output and catch up with events when updating the tab page labels.
+
+In the GUI, using CTRL-W q to close the last window of a tab page could cause
+a crash.
+
+GTK: The tab pages line menu was not converted from 'encoding' to utf-8.
+
+Typing a multibyte character or a special key at the hit-enter prompt did not
+work.
+
+When 'virtualedit' contains "onemore" CTRL-O in Insert mode still moved the
+cursor left when it was after the end of the line, even though it's allowed to
+be there.
+
+Added test for using tab pages.
+
+towupper() and towlower() were not used, because of checking for
+__STDC__ISO_10646__ instead of __STDC_ISO_10646__. (sertacyildiz)
+
+For ":map <expr>" forbid changing the text, jumping to another buffer and
+using ":normal" to avoid nasty side effects.
+
+--- fixes and changes since Vim 7.0g ---
+
+Compilation error on HP-UX, use of "dlerr" must be inside a #ifdef.
+(Gary Johnson)
+
+Report +reltime feature in ":version" output.
+
+The tar and zip plugins detect failure to get the contents of the archive and
+edit the file as-is.
+
+When the result of 'guitablabel' is empty fall back to the default label.
+
+Fixed crash when using ":insert" in a while loop and missing "endwhile".
+
+"gt" and other commands could move to another window when |textlock| active
+and when the command line window was open.
+
+Spell checking a file with syntax highlighting and a bad word at the end of
+the line is ignored could make "]s" hang.
+
+Mac: inputdialog() didn't work when compiled with big features.
+
+Interrupting ":vimgrep" while it is busy loading a file left a modified and
+hidden buffer behind. Use enter_cleanup() and leave_cleanup() around
+wipe_buffer().
+
+When making 'keymap' empty the b:keymap_name variable wasn't deleted.
+
+Using CTRL-N that searches a long time, pressing space to interrupt the
+searching and accept the first match, the popup menu was still displayed
+briefly.
+
+When setting the Vim window height with -geometry the 'window' option could be
+at a value that makes CTRL-F behave differently.
+
+When opening a quickfix window in two tabs they used different buffers,
+causing redrawing problems later. Now use the same buffer for all quickfix
+windows. (Yegappan Lakshmanan)
+
+When 'mousefocus' is set moving the mouse to the text tab pages line would
+move focus to the first window. Also, the mouse pointer would jump to the
+active window.
+
+In a session file, when an empty buffer is wiped out, do this silently.
+
+When one window has the cursor on the last line and another window is resized
+to make that window smaller, the cursor line could go below the displayed
+lines. In win_new_height() subtract one from the available space.
+Also avoid that using "~" lines makes the window scroll down.
+
+Mac: When sourcing the "macmap.vim" script and then finding a .vimrc file the
+'cpo' option isn't set properly, because it was already set and restored.
+Added the <special> argument to ":map", so that 'cpo' doesn't need to be
+changed to be able to use <> notation. Also do this for ":menu" for
+consistency.
+
+When using "/encoding=abc" in a spell word list, only "bc" was used.
+
+When 'encoding' and 'printencoding' were both "utf-8" then ":hardcopy" didn't
+work. (Mike Williams)
+
+Mac: When building with "--disable-gui" the install directory would still be
+"/Applications" and Vim.app would be installed. Now install in /usr/local as
+usual for a console application.
+
+GUI: when doing completion and there is one match and still searching for
+another, the cursor was displayed at the end of the line instead of after the
+match. Now show the cursor after the match while still searching for matches.
+
+GUI: The mouse shape changed on the statusline even when 'mouse' was empty and
+they can't be dragged.
+
+GTK2: Selecting a button in the confirm() dialog with Tab or cursor keys and
+hitting Enter didn't select that button. Removed GTK 1 specific code. (Neil
+Bird)
+
+When evaluating 'balloonexpr' takes a long time it could be called
+recursively, which could cause a crash.
+
+exists() could not be used to detect whether ":2match" is supported. Added a
+check for it specifically.
+
+GTK1: Tab page labels didn't work. (Yegappan Lakshmanan)
+
+Insert mode completion: When finding matches use 'ignorecase', but when adding
+matches to the list don't use it, so that all words with different case are
+added, "word", "Word" and "WORD".
+
+When 'cursorline' and 'hlsearch' are set and the search pattern is "x\n"
+the rest of the line was highlighted as a match.
+
+Cursor moved while evaluating 'balloonexpr' that invokes ":isearch" and
+redirects the output. Don't move the cursor to the command line if msg_silent
+is set.
+
+exists() ignored text after a function name and option name, which could
+result in false positives.
+
+exists() ignored characters after the recognized word, which can be wrong when
+using a name with non-keyword characters. Specifically, these calls no longer
+allow characters after the name: exists('*funcname') exists('*funcname(...')
+exists('&option') exists(':cmd') exists('g:name') exists('g:name[n]')
+exists('g:name.n')
+
+Trigger the TabEnter autocommand only after entering the current window of the
+tab page, otherwise the commands are executed with an invalid current window.
+
+Win32: When using two monitors and Vim is on the second monitor, changing the
+width of the Vim window could make it jump to the first monitor.
+
+When scrolling back at the more prompt and the quitting a line of text would
+be left behind when 'cmdheight' is 2 or more.
+
+Fixed a few things for Insert mode completion, especially when typing BS,
+CTRL-N or a printable character while still searching for matches.
+
+
+==============================================================================
+VERSION 7.1 *version-7.1* *version7.1*
+
+This section is about improvements made between version 7.0 and 7.1.
+
+This is a bug-fix release, there are no fancy new features.
+
+
+Changed *changed-7.1*
+-------
+
+Added setting 'mouse' in vimrc_example.vim.
+
+When building with MZscheme also look for include files in the "plt"
+subdirectory. That's where they are for FreeBSD.
+
+The Ruby interface module is now called "Vim" instead of "VIM". But "VIM" is
+an alias, so it's backwards compatible. (Tim Pope)
+
+
+Added *added-7.1*
+-----
+
+New syntax files:
+ /var/log/messages (Yakov Lerner)
+ Autohotkey (Nikolai Weibull)
+ AutoIt v3 (Jared Breland)
+ Bazaar commit file "bzr". (Dmitry Vasiliev)
+ Cdrdao TOC (Nikolai Weibull)
+ Cmusrc (Nikolai Weibull)
+ Conary recipe (rPath Inc)
+ Framescript (Nikolai Weibull)
+ FreeBasic (Mark Manning)
+ Hamster (David Fishburn)
+ IBasic (Mark Manning)
+ Initng (Elan Ruusamae)
+ Ldapconf (Nikolai Weibull)
+ Litestep (Nikolai Weibull)
+ Privoxy actions file (Doug Kearns)
+ Streaming Descriptors "sd" (Puria Nafisi Azizi)
+
+New tutor files:
+ Czech (Lubos Turek)
+ Hungarian (Arpad Horvath)
+ Turkish (Serkan kkk)
+ utf-8 version of Greek tutor.
+ utf-8 version of Russian tutor.
+ utf-8 version of Slowak tutor.
+
+New filetype plugins:
+ Bst (Tim Pope)
+ Cobol (Tim Pope)
+ Fvwm (Gautam Iyer)
+ Hamster (David Fishburn)
+ Django HTML template (Dave Hodder)
+
+New indent files:
+ Bst (Tim Pope)
+ Cobol (Tim Pope)
+ Hamster (David Fishburn)
+ Django HTML template (Dave Hodder)
+ Javascript
+ JSP (David Fishburn)
+
+New keymap files:
+ Bulgarian (Boyko Bantchev)
+ Mongolian (Natsagdorj Shagdar)
+ Thaana (Ibrahim Fayaz)
+ Vietnamese (Samuel Thibault)
+
+Other new runtime files:
+ Ada support files. (Neil Bird, Martin Krischik)
+ Slovenian menu translations (Mojca Miklavec)
+ Mono C# compiler plugin (Jarek Sobiecki)
+
+
+Fixed *fixed-7.1*
+-----
+
+Could not build the Win32s version. Added a few structure definitions in
+src/gui_w32.c
+
+
+Patch 7.0.001
+Problem: ":set spellsuggest+=10" does not work. (Suresh Govindachar)
+Solution: Add P_COMMA to the 'spellsuggest' flags.
+Files: src/option.c
+
+Patch 7.0.002
+Problem: C omni completion has a problem with tags files with a path
+ containing "#" or "%".
+Solution: Escape these characters. (Sebastian Baberowski)
+Files: runtime/autoload/ccomplete.vim
+
+Patch 7.0.003
+Problem: GUI: clicking in the lower part of a label in the tab pages line
+ while 'mousefocus' is set may warp the mouse pointer. (Robert
+ Webb)
+Solution: Check for a negative mouse position.
+Files: src/gui.c
+
+Patch 7.0.004
+Problem: Compiler warning for debug_saved used before set. (Todd Blumer)
+Solution: Remove the "else" for calling save_dbg_stuff().
+Files: src/ex_docmd.c
+
+Patch 7.0.005 (extra)
+Problem: Win32: The installer doesn't remove the "autoload" and "spell"
+ directories. (David Fishburn)
+Solution: Add the directories to the list to be removed.
+Files: nsis/gvim.nsi
+
+Patch 7.0.006
+Problem: Mac: "make shadow" doesn't make a link for infplist.xml. (Axel
+ Kielhorn)
+Solution: Make the link.
+Files: src/Makefile
+
+Patch 7.0.007
+Problem: AIX: compiling fails for message.c. (Ruediger Hornig)
+Solution: Move the #if outside of memchr().
+Files: src/message.c
+
+Patch 7.0.008
+Problem: Can't call a function that uses both <SID> and {expr}. (Thomas)
+Solution: Check both the expanded and unexpanded name for <SID>.
+Files: src/eval.c
+
+Patch 7.0.009
+Problem: ml_get errors with both 'sidescroll' and 'spell' set.
+Solution: Use ml_get_buf() instead of ml_get(), get the line from the right
+ buffer, not the current one.
+Files: src/spell.c
+
+Patch 7.0.010
+Problem: The spellfile plugin required typing login name and password.
+Solution: Use "anonymous" and "vim7user" by default. No need to setup a
+ .netrc file.
+Files: runtime/autoload/spellfile.vim
+
+Patch 7.0.011
+Problem: Can't compile without the folding and with the eval feature.
+Solution: Add an #ifdef. (Vallimar)
+Files: src/option.c
+
+Patch 7.0.012
+Problem: Using the matchparen plugin, moving the cursor in Insert mode to a
+ shorter line that ends in a brace, changes the preferred column
+Solution: Use winsaveview()/winrestview() instead of getpos()/setpos().
+Files: runtime/plugin/matchparen.vim
+
+Patch 7.0.013
+Problem: Insert mode completion: using CTRL-L to add an extra character
+ also deselects the current match, making it impossible to use
+ CTRL-L a second time.
+Solution: Keep the current match. Also make CTRL-L work at the original
+ text, using the first displayed match.
+Files: src/edit.c
+
+Patch 7.0.014
+Problem: Compiling gui_xmebw.c fails on Dec Alpha Tru64. (Rolfe)
+Solution: Disable some code for Motif 1.2 and older.
+Files: src/gui_xmebw.c
+
+Patch 7.0.015
+Problem: Athena: compilation problems with modern compiler.
+Solution: Avoid type casts for lvalue. (Alexey Froloff)
+Files: src/gui_at_fs.c
+
+Patch 7.0.016
+Problem: Printing doesn't work for "dec-mcs" encoding.
+Solution: Add "dec-mcs", "mac-roman" and "hp-roman8" to the list of
+ recognized 8-bit encodings. (Mike Williams)
+Files: src/mbyte.c
+
+Patch 7.0.017 (after 7.0.014)
+Problem: Linking gui_xmebw.c fails on Dec Alpha Tru64. (Rolfe)
+Solution: Adjust defines for Motif 1.2 and older.
+Files: src/gui_xmebw.c
+
+Patch 7.0.018
+Problem: VMS: plugins are not loaded on startup.
+Solution: Remove "**" from the path. (Zoltan Arpadffy)
+Files: src/main.c
+
+Patch 7.0.019
+Problem: Repeating "VjA789" may cause a crash. (James Vega)
+Solution: Check the cursor column after moving it to another line.
+Files: src/ops.c
+
+Patch 7.0.020
+Problem: Crash when using 'mousefocus'. (William Fulton)
+Solution: Make buffer for mouse coordinates 2 bytes longer. (Juergen Weigert)
+Files: src/gui.c
+
+Patch 7.0.021
+Problem: Crash when using "\\[" and "\\]" in 'errorformat'. (Marc Weber)
+Solution: Check for valid submatches after matching the pattern.
+Files: src/quickfix.c
+
+Patch 7.0.022
+Problem: Using buffer.append() in Ruby may append the line to the wrong
+ buffer. (Alex Norman)
+Solution: Properly switch to the buffer to do the appending. Also for
+ buffer.delete() and setting a buffer line.
+Files: src/if_ruby.c
+
+Patch 7.0.023
+Problem: Crash when doing spell completion in an empty line and pressing
+ CTRL-E.
+Solution: Check for a zero pointer. (James Vega)
+ Also handle a situation without a matching pattern better, report
+ "No matches" instead of remaining in undefined CTRL-X mode. And
+ get out of CTRL-X mode when typing a letter.
+Files: src/edit.c
+
+Patch 7.0.024
+Problem: It is possible to set arbitrary "v:" variables.
+Solution: Disallow setting "v:" variables that are not predefined.
+Files: src/eval.c
+
+Patch 7.0.025
+Problem: Crash when removing an element of a:000. (Nikolai Weibull)
+Solution: Mark the a:000 list with VAR_FIXED.
+Files: src/eval.c
+
+Patch 7.0.026
+Problem: Using libcall() may show an old error.
+Solution: Invoke dlerror() to clear a previous error. (Yukihiro Nakadaira)
+Files: src/os_unix.c
+
+Patch 7.0.027 (extra)
+Problem: Win32: When compiled with SNIFF gvim may hang on exit.
+Solution: Translate and dispatch the WM_USER message. (Mathias Michaelis)
+Files: src/gui_w48.c
+
+Patch 7.0.028 (extra)
+Problem: OS/2: Vim doesn't compile with gcc 3.2.1.
+Solution: Add argument to after_pathsep(), don't define vim_handle_signal(),
+ define HAVE_STDARG_H. (David Sanders)
+Files: src/os_unix.c, src/vim.h, src/os_os2_cfg.h
+
+Patch 7.0.029
+Problem: getchar() may not position the cursor after a space.
+Solution: Position the cursor explicitly.
+Files: src/eval.c
+
+Patch 7.0.030
+Problem: The ":compiler" command can't be used in a FileChangedRO event.
+ (Hari Krishna Dara)
+Solution: Add the CMDWIN flag to the ":compiler" command.
+Files: src/ex_cmds.h
+
+Patch 7.0.031
+Problem: When deleting a buffer the buffer-local mappings for Select mode
+ remain.
+Solution: Add the Select mode bit to MAP_ALL_MODES. (Edwin Steiner)
+Files: src/vim.h
+
+Patch 7.0.032 (extra, after 7.0.027)
+Problem: Missing semicolon.
+Solution: Add the semicolon.
+Files: src/gui_w48.c
+
+Patch 7.0.033
+Problem: When pasting text, with the menu or CTRL-V, autoindent is removed.
+Solution: Use "x<BS>" to avoid indent to be removed. (Benji Fisher)
+Files: runtime/autoload/paste.vim
+
+Patch 7.0.034
+Problem: After doing completion and typing more characters or using BS
+ repeating with "." didn't work properly. (Martin Stubenschrott)
+Solution: Don't put BS and other characters in the redo buffer right away,
+ do this when finishing completion.
+Files: src/edit.c
+
+Patch 7.0.035
+Problem: Insert mode completion works when typed but not when replayed from
+ a register. (Hari Krishna Dara)
+ Also: Mappings for Insert mode completion don't always work.
+Solution: When finding a non-completion key in the input don't interrupt
+ completion when it wasn't typed.
+ Do use mappings when checking for typeahead while still finding
+ completions. Avoids that completion is interrupted too soon.
+ Use "compl_pending" in a different way.
+Files: src/edit.c
+
+Patch 7.0.036
+Problem: Can't compile with small features and syntax highlighting or the
+ diff feature.
+Solution: Define LINE_ATTR whenever syntax highlighting or the diff feature
+ is enabled.
+Files: src/screen.c
+
+Patch 7.0.037
+Problem: Crash when resizing the GUI window vertically when there is a line
+ that doesn't fit.
+Solution: Don't redraw while the screen data is invalid.
+Files: src/screen.c
+
+Patch 7.0.038
+Problem: When calling complete() from an Insert mode expression mapping
+ text could be inserted in an improper way.
+Solution: Make undo_allowed() global and use it in complete().
+Files: src/undo.c, src/proto/undo.pro, src/eval.c
+
+Patch 7.0.039
+Problem: Calling inputdialog() with a third argument in the console doesn't
+ work.
+Solution: Make a separate function for input() and inputdialog(). (Yegappan
+ Lakshmanan)
+Files: src/eval.c
+
+Patch 7.0.040
+Problem: When 'cmdheight' is larger than 1 using inputlist() or selecting
+ a spell suggestion with the mouse gets the wrong entry.
+Solution: Start listing the first alternative on the last line of the screen.
+Files: src/eval.c, src/spell.c
+
+Patch 7.0.041
+Problem: cursor([1, 1]) doesn't work. (Peter Hodge)
+Solution: Allow leaving out the third item of the list and use zero for the
+ virtual column offset.
+Files: src/eval.c
+
+Patch 7.0.042
+Problem: When pasting a block of text in Insert mode Vim hangs or crashes.
+ (Noam Halevy)
+Solution: Avoid that the cursor is positioned past the NUL of a line.
+Files: src/ops.c
+
+Patch 7.0.043
+Problem: Using "%!" at the start of 'statusline' doesn't work.
+Solution: Recognize the special item when the option is being set.
+Files: src/option.c
+
+Patch 7.0.044
+Problem: Perl: setting a buffer line in another buffer may result in
+ changing the current buffer.
+Solution: Properly change to the buffer to be changed.
+Files: src/if_perl.xs
+
+Patch 7.0.045 (extra)
+Problem: Win32: Warnings when compiling OLE version with MSVC 2005.
+Solution: Move including vim.h to before windows.h. (Ilya Bobir)
+Files: src/if_ole.cpp
+
+Patch 7.0.046
+Problem: The matchparen plugin ignores parens in strings, but not in single
+ quotes, often marked with "character".
+Solution: Also ignore parens in syntax items matching "character".
+Files: runtime/plugin/matchparen.vim
+
+Patch 7.0.047
+Problem: When running configure the exit status is wrong.
+Solution: Handle the exit status properly. (Matthew Woehlke)
+Files: configure, src/configure
+
+Patch 7.0.048
+Problem: Writing a compressed file fails when there are parens in the name.
+ (Wang Jian)
+Solution: Put quotes around the temp file name.
+Files: runtime/autoload/gzip.vim
+
+Patch 7.0.049
+Problem: Some TCL scripts are not recognized. (Steven Atkinson)
+Solution: Check for "exec wish" in the file.
+Files: runtime/scripts.vim
+
+Patch 7.0.050
+Problem: After using the netbeans interface close command a stale pointer
+ may be used.
+Solution: Clear the pointer to the closed buffer. (Xavier de Gaye)
+Files: src/netbeans.c
+
+Patch 7.0.051 (after 7.0.44)
+Problem: The Perl interface doesn't compile or doesn't work properly.
+Solution: Remove the spaces before #ifdef and avoid an empty line above it.
+Files: src/if_perl.xs
+
+Patch 7.0.052
+Problem: The user may not be aware that the Vim server allows others more
+ functionality than desired.
+Solution: When running Vim as root don't become a Vim server without an
+ explicit --servername argument.
+Files: src/main.c
+
+Patch 7.0.053
+Problem: Shortening a directory name may fail when there are multibyte
+ characters.
+Solution: Copy the correct bytes. (Titov Anatoly)
+Files: src/misc1.c
+
+Patch 7.0.054
+Problem: Mac: Using a menu name that only has a mnemonic or accelerator
+ causes a crash. (Elliot Shank)
+Solution: Check for an empty menu name. Also delete empty submenus that
+ were created before detecting the error.
+Files: src/menu.c
+
+Patch 7.0.055
+Problem: ":startinsert" in a CmdwinEnter autocommand doesn't take immediate
+ effect. (Bradley White)
+Solution: Put a NOP key in the typeahead buffer. Also avoid that using
+ CTRL-C to go back to the command line moves the cursor left.
+Files: src/edit.c, src/ex_getln.c
+
+Patch 7.0.056
+Problem: "#!something" gives an error message.
+Solution: Ignore this line, so that it can be used in an executable Vim
+ script.
+Files: src/ex_docmd.c
+
+Patch 7.0.057 (extra, after 7.0.45)
+Problem: Win32: Compilation problem with Borland C 5.5.
+Solution: Include vim.h as before. (Mark S. Williams)
+Files: src/if_ole.cpp
+
+Patch 7.0.058
+Problem: The gbk and gb18030 encodings are not recognized.
+Solution: Add aliases to cp936. (Edward L. Fox)
+Files: src/mbyte.c
+
+Patch 7.0.059
+Problem: The Perl interface doesn't compile with ActiveState Perl 5.8.8.
+Solution: Remove the __attribute__() items. (Liu Yubao)
+Files: src/if_perl.xs
+
+Patch 7.0.060 (after 7.0.51)
+Problem: Code for temporarily switching to another buffer is duplicated in
+ quite a few places.
+Solution: Use aucmd_prepbuf() and aucmd_restbuf() also when FEAT_AUTOCMD is
+ not defined.
+Files: src/buffer.c, src/eval.c, src/fileio.c, src/if_ruby.c,
+ src/if_perl.xs, src/quickfix.c, src/structs.h
+
+Patch 7.0.061
+Problem: Insert mode completion for Vim commands may crash if there is
+ nothing to complete.
+Solution: Instead of freeing the pattern make it empty, so that a "not
+ found" error is given. (Yukihiro Nakadaira)
+Files: src/edit.c
+
+Patch 7.0.062
+Problem: Mac: Crash when using the popup menu for spell correction. The
+ popup menu appears twice when letting go of the right mouse button
+ early.
+Solution: Don't show the popup menu on the release of the right mouse
+ button. Also check that a menu pointer is actually valid.
+Files: src/proto/menu.pro, src/menu.c, src/normal.c, src/term.c
+
+Patch 7.0.063
+Problem: Tiny chance for a memory leak. (coverity)
+Solution: Free pointer when next memory allocation fails.
+Files: src/eval.c
+
+Patch 7.0.064
+Problem: Using uninitialized variable. (Tony Mechelynck)
+Solution: When not used set "temp" to zero. Also avoid a warning for
+ "files" in ins_compl_dictionaries().
+Files: src/edit.c
+
+Patch 7.0.065 (extra)
+Problem: Mac: left-right movement of the scrollwheel causes up-down
+ scrolling.
+Solution: Ignore mouse wheel events that are not up-down. (Nicolas Weber)
+Files: src/gui_mac.c
+
+Patch 7.0.066
+Problem: After the popup menu for Insert mode completion overlaps the tab
+ pages line it is not completely removed.
+Solution: Redraw the tab pages line after removing the popup menu. (Ori
+ Avtalion)
+Files: src/popupmnu.c
+
+Patch 7.0.067
+Problem: Undo doesn't always work properly when using "scim" input method.
+ Undo is split up when using preediting.
+Solution: Reset xim_has_preediting also when preedit_start_col is not
+ MAXCOL. Don't split undo when <Left> is used while preediting.
+ (Yukihiro Nakadaira)
+Files: src/edit.c, src/mbyte.c
+
+Patch 7.0.068
+Problem: When 'ignorecase' is set and using Insert mode completion,
+ typing characters to change the list of matches, case is not
+ ignored. (Hugo Ahlenius)
+Solution: Store the 'ignorecase' flag with the matches where needed.
+Files: src/edit.c, src/search.c, src/spell.c
+
+Patch 7.0.069
+Problem: Setting 'guitablabel' to %!expand(\%) causes Vim to free an
+ invalid pointer. (Kim Schulz)
+Solution: Don't try freeing a constant string pointer.
+Files: src/buffer.c
+
+Patch 7.0.070
+Problem: Compiler warnings for shadowed variables and uninitialized
+ variables.
+Solution: Rename variables such as "index", "msg" and "dup". Initialize
+ variables.
+Files: src/edit.c, src/eval.c, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/gui_beval.c, src/gui_gtk.c, src/gui_gtk_x11.c,
+ src/hardcopy.c, src/if_cscope.c, src/main.c, src/mbyte.c,
+ src/memline.c, src/netbeans.c, src/normal.c, src/option.c,
+ src/os_unix.c, src/quickfix.c, src/regexp.c, src/screen.c,
+ src/search.c, src/spell.c, src/ui.c, src/undo.c, src/window.c,
+ src/version.c
+
+Patch 7.0.071
+Problem: Using an empty search pattern may cause a crash.
+Solution: Avoid using a NULL pointer.
+Files: src/search.c
+
+Patch 7.0.072
+Problem: When starting the GUI fails there is no way to adjust settings or
+ do something else.
+Solution: Add the GUIFailed autocommand event.
+Files: src/fileio.c, src/gui.c, src/vim.h
+
+Patch 7.0.073
+Problem: Insert mode completion: Typing <CR> sometimes selects the original
+ text instead of keeping what was typed. (Justin Constantino)
+Solution: Don't let <CR> select the original text if there is no popup menu.
+Files: src/edit.c
+
+Patch 7.0.074 (extra)
+Problem: Win32: tooltips were not converted from 'encoding' to Unicode.
+Solution: Set the tooltip to use Unicode and do the conversion. Also
+ cleanup the code for the tab pages tooltips. (Yukihiro Nakadaira)
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 7.0.075
+Problem: winsaveview() did not store the actual value of the desired cursor
+ column. This could move the cursor in the matchparen plugin.
+Solution: Call update_curswant() before using the value w_curswant.
+Files: src/eval.c
+
+Patch 7.0.076 (after 7.0.010)
+Problem: Automatic downloading of spell files only works for ftp.
+Solution: Don't add login and password for non-ftp URLs. (Alexander Patrakov)
+Files: runtime/autoload/spellfile.vim
+
+Patch 7.0.077
+Problem: ":unlet v:this_session" causes a crash. (Marius Roets)
+Solution: When trying to unlet a fixed variable give an error message.
+Files: src/eval.c
+
+Patch 7.0.078
+Problem: There are two error messages E46.
+Solution: Change the number for the sandbox message to E794.
+Files: src/globals.h
+
+Patch 7.0.079
+Problem: Russian tutor doesn't work when 'encoding' is "utf-8".
+Solution: Use tutor.ru.utf-8 as the master, and generate the other encodings
+ from it. Select the right tutor depending on 'encoding'. (Alexey
+ Froloff)
+Files: runtime/tutor/Makefile, runtime/tutor/tutor.vim,
+ runtime/tutor/tutor.ru.utf-8
+
+Patch 7.0.080
+Problem: Generating auto/pathdef.c fails for CFLAGS with a backslash.
+Solution: Double backslashes in the string. (Alexey Froloff)
+Files: src/Makefile
+
+Patch 7.0.081
+Problem: Command line completion doesn't work for a shell command with an
+ absolute path.
+Solution: Don't use $PATH when there is an absolute path.
+Files: src/ex_getln.c
+
+Patch 7.0.082
+Problem: Calling a function that waits for input may cause List and
+ Dictionary arguments to be freed by the garbage collector.
+Solution: Keep a list of all arguments to internal functions.
+Files: src/eval.c
+
+Patch 7.0.083
+Problem: Clicking with the mouse on an item for inputlist() doesn't work
+ when 'compatible' is set and/or when 'cmdheight' is more than one.
+ (Christian J. Robinson)
+Solution: Also decrement "lines_left" when 'more' isn't set. Set
+ "cmdline_row" to zero to get all mouse events.
+Files: src/message.c, src/misc1.c
+
+Patch 7.0.084
+Problem: The garbage collector may do its work while some Lists or
+ Dictionaries are used internally, e.g., by ":echo" that runs into
+ the more-prompt or ":echo [garbagecollect()]".
+Solution: Only do garbage collection when waiting for a character at the
+ toplevel. Let garbagecollect() set a flag that is handled at the
+ toplevel before waiting for a character.
+Files: src/eval.c, src/getchar.c, src/globals.h, src/main.c
+
+Patch 7.0.085
+Problem: When doing "make test" the viminfo file is modified.
+Solution: Use another viminfo file after setting 'compatible'.
+Files: src/testdir/test56.in
+
+Patch 7.0.086
+Problem: getqflist() returns entries for pattern and text with the number
+ zero. Passing these to setqflist() results in the string "0".
+Solution: Use an empty string instead of the number zero.
+Files: src/quickfix.c
+
+Patch 7.0.087
+Problem: After ":file fname" and ":saveas fname" the 'autochdir' option
+ does not take effect. (Yakov Lerner)
+ Commands for handling 'autochdir' are repeated many times.
+Solution: Add the DO_AUTOCHDIR macro and do_autochdir(). Use it for
+ ":file fname" and ":saveas fname".
+Files: src/proto/buffer.pro, src/buffer.c, src/ex_cmds.c, src/macros.h,
+ src/netbeans.c, src/option.c, src/window.c
+
+Patch 7.0.088
+Problem: When compiled with Perl the generated prototypes have "extern"
+ unnecessarily added.
+Solution: Remove the "-pipe" argument from PERL_CFLAGS.
+Files: src/auto/configure, src/configure.in
+
+Patch 7.0.089
+Problem: "ga" does not work properly for a non-Unicode multibyte encoding.
+Solution: Only check for composing chars for utf-8. (Taro Muraoka)
+Files: src/ex_cmds.c
+
+Patch 7.0.090
+Problem: Cancelling the conform() dialog on the console with Esc requires
+ typing it twice. (Benji Fisher)
+Solution: When the start of an escape sequence is found use 'timeoutlen' or
+ 'ttimeoutlen'.
+Files: src/misc1.c
+
+Patch 7.0.091
+Problem: Using winrestview() while 'showcmd' is set causes the cursor to be
+ displayed in the wrong position. (Yakov Lerner)
+Solution: Set the window topline properly.
+Files: src/eval.c
+
+Patch 7.0.092 (after 7.0.082 and 7.0.084)
+Problem: The list of internal function arguments is obsolete now that
+ garbage collection is only done at the toplevel.
+Solution: Remove the list of all arguments to internal functions.
+Files: src/eval.c
+
+Patch 7.0.093
+Problem: The matchparen plugin can't handle a 'matchpairs' value where a
+ colon is matched.
+Solution: Change the split() that is used to change 'matchpairs' into a
+ List.
+Files: runtime/plugin/matchparen.vim
+
+Patch 7.0.094
+Problem: When a hidden buffer is made the current buffer and another file
+ edited later, the file message will still be given. Using
+ ":silent" also doesn't prevent the file message. (Marvin Renich)
+Solution: Reset the need_fileinfo flag when reading a file. Don't set
+ need_fileinfo when msg_silent is set.
+Files: src/buffer.c, src/fileio.c
+
+Patch 7.0.095
+Problem: The Greek tutor is not available in utf-8. "el" is used for the
+ language, only "gr" for the country is recognized.
+Solution: Add the utf-8 Greek tutor. Use it for conversion to iso-8859-7
+ and cp737. (Lefteris Dimitroulakis)
+Files: runtime/tutor/Makefile, runtime/tutor/tutor.gr.utf-8,
+ runtime/tutor/tutor.vim
+
+Patch 7.0.096
+Problem: taglist() returns the filename relative to the tags file, while
+ the directory of the tags file is unknown. (Hari Krishna Dara)
+Solution: Expand the file name. (Yegappan Lakshmanan)
+Files: src/tag.c
+
+Patch 7.0.097
+Problem: ":tabclose N" that closes another tab page does not remove the tab
+ pages line. Same problem when using the mouse.
+Solution: Adjust the tab pages line when needed in tabpage_close_other().
+Files: src/ex_docmd.c
+
+Patch 7.0.098
+Problem: Redirecting command output in a cmdline completion function
+ doesn't work. (Hari Krishna Dara)
+Solution: Enable redirection when redirection is started.
+Files: src/ex_docmd.c, src/ex_getln.c
+
+Patch 7.0.099
+Problem: GUI: When the popup menu is visible using the scrollbar messes up
+ the display.
+Solution: Disallow scrolling the current window. Redraw the popup menu
+ after scrolling another window.
+Files: src/gui.c
+
+Patch 7.0.100
+Problem: "zug" may report the wrong filename. (Lawrence Kesteloot)
+Solution: Call home_replace() to fill NameBuff[].
+Files: src/spell.c
+
+Patch 7.0.101
+Problem: When the "~/.vim/spell" directory does not exist "zg" may create
+ a wrong directory. "zw" doesn't work.
+Solution: Use the directory of the file name instead of NameBuff. For "zw"
+ not only remove a good word but also add the word with "!".
+Files: src/spell.c
+
+Patch 7.0.102
+Problem: Redrawing cmdline is not correct when using SCIM.
+Solution: Don't call im_get_status(). (Yukihiro Nakadaira)
+Files: src/ex_getln.c
+
+Patch 7.0.103 (after 7.0.101)
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Init variable.
+Files: src/spell.c
+
+Patch 7.0.104
+Problem: The CursorHoldI event only triggers once in Insert mode. It also
+ triggers after CTRL-V and other two-key commands.
+Solution: Set "did_cursorhold" before getting a second key. Reset
+ "did_cursorhold" after handling a command.
+Files: src/edit.c, src/fileio.c
+
+Patch 7.0.105
+Problem: When using incremental search the statusline ruler isn't updated.
+ (Christoph Koegl)
+Solution: Update the statusline when it contains the ruler.
+Files: src/ex_getln.c
+
+Patch 7.0.106
+Problem: The spell popup menu uses ":amenu", triggering mappings. Other
+ PopupMenu autocommands are removed. (John Little)
+Solution: Use ":anoremenu" and use an autocmd group.
+Files: runtime/menu.vim
+
+Patch 7.0.107
+Problem: Incremental search doesn't redraw the text tabline. (Ilya Bobir)
+ Also happens in other situations with one window in a tab page.
+Solution: Redraw the tabline after clearing the screen.
+Files: src/screen.c
+
+Patch 7.0.108 (extra)
+Problem: Amiga: Compilation problem.
+Solution: Have mch_mkdir() return a failure flag. (Willy Catteau)
+Files: src/os_amiga.c, src/proto/os_amiga.pro
+
+Patch 7.0.109
+Problem: Lisp indenting is confused by escaped quotes in strings. (Dorai
+ Sitaram)
+Solution: Check for backslash inside strings. (Sergey Khorev)
+Files: src/misc1.c
+
+Patch 7.0.110
+Problem: Amiga: Compilation problems when not using libnix.
+Solution: Change a few #ifdefs. (Willy Catteau)
+Files: src/memfile.c
+
+Patch 7.0.111
+Problem: The gzip plugin can't handle filenames with single quotes.
+Solution: Add and use the shellescape() function. (partly by Alexey Froloff)
+Files: runtime/autoload/gzip.vim, runtime/doc/eval.txt, src/eval.c,
+ src/mbyte.c, src/misc2.c, src/proto/misc2.pro
+
+Patch 7.0.112
+Problem: Python interface does not work with Python 2.5.
+Solution: Change PyMem_DEL() to Py_DECREF(). (Sumner Hayes)
+Files: src/if_python.c
+
+Patch 7.0.113
+Problem: Using CTRL-L in Insert completion when there is no current match
+ may cause a crash. (Yukihiro Nakadaira)
+Solution: Check for compl_leader to be NULL
+Files: src/edit.c
+
+Patch 7.0.114
+Problem: When aborting an insert with CTRL-C an extra undo point is
+ created in the GUI. (Yukihiro Nakadaira)
+Solution: Call gotchars() only when advancing.
+Files: src/getchar.c
+
+Patch 7.0.115
+Problem: When 'ignorecase' is set, Insert mode completion only adds "foo"
+ and not "Foo" when both are found.
+ A found match isn't displayed right away when 'completeopt' does
+ not have "menu" or "menuone".
+Solution: Do not ignore case when checking if a completion match already
+ exists. call ins_compl_check_keys() also when not using a popup
+ menu. (Yukihiro Nakadaira)
+Files: src/edit.c
+
+Patch 7.0.116
+Problem: 64 bit Windows version reports "32 bit" in the ":version" output.
+ (M. Veerman)
+Solution: Change the text for Win64.
+Files: src/version.c
+
+Patch 7.0.117
+Problem: Using "extend" on a syntax item inside a region with "keepend", an
+ intermediate item may be truncated.
+ When applying the "keepend" and there is an offset to the end
+ pattern the highlighting of a contained item isn't adjusted.
+Solution: Use the seen_keepend flag to remember when to apply the "keepend"
+ flag. Adjust the keepend highlighting properly. (Ilya Bobir)
+Files: src/syntax.c
+
+Patch 7.0.118
+Problem: printf() does not do zero padding for strings.
+Solution: Do allow zero padding for strings.
+Files: src/message.c
+
+Patch 7.0.119
+Problem: When going back from Insert to Normal mode the CursorHold event
+ doesn't trigger. (Yakov Lerner)
+Solution: Reset "did_cursorhold" when leaving Insert mode.
+Files: src/edit.c
+
+Patch 7.0.120
+Problem: Crash when using CTRL-R = at the command line and entering
+ "getreg('=')". (James Vega)
+Solution: Avoid recursiveness of evaluating the = register.
+Files: src/ops.c
+
+Patch 7.0.121
+Problem: GUI: Dragging the last status line doesn't work when there is a
+ text tabline. (Markus Wolf)
+Solution: Take the text tabline into account when deciding to start modeless
+ selection.
+Files: src/gui.c
+
+Patch 7.0.122
+Problem: GUI: When clearing after a bold, double-wide character half a
+ character may be drawn.
+Solution: Check for double-wide character and redraw it. (Yukihiro Nakadaira)
+Files: src/screen.c
+
+Patch 7.0.123
+Problem: On SCO Openserver configure selects the wrong terminal library.
+Solution: Put terminfo before the other libraries. (Roger Cornelius)
+ Also fix a small problem compiling on Mac without Darwin.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.0.124
+Problem: getwinvar() obtains a dictionary with window-local variables, but
+ it's always for the current window.
+Solution: Get the variables of the specified window. (Geoff Reedy)
+Files: src/eval.c
+
+Patch 7.0.125
+Problem: When "autoselect" is in the 'clipboard' option then the '< and '>
+ marks are set while Visual mode is still active.
+Solution: Don't set the '< and '> marks when yanking the selected area for
+ the clipboard.
+Files: src/normal.c
+
+Patch 7.0.126
+Problem: When 'formatexpr' uses setline() and later internal formatting is
+ used undo information is not correct. (Jiri Cerny, Benji Fisher)
+Solution: Set ins_need_undo after using 'formatexpr'.
+Files: src/edit.c
+
+Patch 7.0.127
+Problem: Crash when swap file has invalid timestamp.
+Solution: Check return value of ctime() for being NULL.
+Files: src/memline.c
+
+Patch 7.0.128
+Problem: GUI: when closing gvim is cancelled because there is a changed
+ buffer the screen isn't updated to show the changed buffer in the
+ current window. (Krzysztof Kacprzak)
+Solution: Redraw when closing gvim is cancelled.
+Files: src/gui.c
+
+Patch 7.0.129
+Problem: GTK GUI: the GTK file dialog can't handle a relative path.
+Solution: Make the initial directory a full path before passing it to GTK.
+ (James Vega) Also postpone adding the default file name until
+ after setting the directory.
+Files: src/gui_gtk.c
+
+Patch 7.0.130 (extra)
+Problem: Win32: Trying to edit or write devices may cause Vim to get stuck.
+Solution: Add the 'opendevice' option, default off. Disallow
+ reading/writing from/to devices when it's off.
+ Also detect more devices by the full name starting with "\\.\".
+Files: runtime/doc/options.txt, src/fileio.c, src/option.c, src/option.h,
+ src/os_win32.c
+
+Patch 7.0.131
+Problem: Win32: "vim -r" does not list all the swap files.
+Solution: Also check for swap files starting with a dot.
+Files: src/memline.c
+
+Patch 7.0.132 (after 7.0.130)
+Problem: Win32: Crash when Vim reads from stdin.
+Solution: Only use mch_nodetype() when there is a file name.
+Files: src/fileio.c
+
+Patch 7.0.133
+Problem: When searching included files messages are added to the history.
+Solution: Set msg_hist_off for messages about scanning included files.
+ Set msg_silent to avoid message about wrapping around.
+Files: src/edit.c, src/globals.h, src/message.c, src/search.c
+
+Patch 7.0.134
+Problem: Crash when comparing a recursively looped List or Dictionary.
+Solution: Limit recursiveness for comparing to 1000.
+Files: src/eval.c
+
+Patch 7.0.135
+Problem: Crash when garbage collecting list or dict with loop.
+Solution: Don't use DEL_REFCOUNT but don't recurse into Lists and
+ Dictionaries when freeing them in the garbage collector.
+ Also add allocated Dictionaries to the list of Dictionaries to
+ avoid leaking memory.
+Files: src/eval.c, src/proto/eval.pro, src/tag.c
+
+Patch 7.0.136
+Problem: Using "O" while matching parens are highlighted may not remove the
+ highlighting. (Ilya Bobir)
+Solution: Also trigger CursorMoved when a line is inserted under the cursor.
+Files: src/misc1.c
+
+Patch 7.0.137
+Problem: Configure check for big features is wrong.
+Solution: Change "==" to "=". (Martti Kuparinen)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.0.138 (extra)
+Problem: Mac: modifiers don't work with function keys.
+Solution: Use GetEventParameter() to obtain modifiers. (Nicolas Weber)
+Files: src/gui_mac.c
+
+Patch 7.0.139
+Problem: Using CTRL-PageUp or CTRL-PageDown in Insert mode to go to another
+ tab page does not prepare for undo properly. (Stefano Zacchiroli)
+Solution: Call start_arrow() before switching tab page.
+Files: src/edit.c
+
+Patch 7.0.140 (after 7.0.134)
+Problem: Comparing recursively looped List or Dictionary doesn't work well.
+Solution: Detect comparing a List or Dictionary with itself.
+Files: src/eval.c
+
+Patch 7.0.141
+Problem: When pasting a while line on the command line an extra CR is added
+ literally.
+Solution: Don't add the trailing CR when pasting with the mouse.
+Files: src/ex_getln.c, src/proto/ops.pro, src/ops.c
+
+Patch 7.0.142
+Problem: Using the middle mouse button in Select mode to paste text results
+ in an extra "y". (Kriton Kyrimis)
+Solution: Let the middle mouse button replace the selected text with the
+ contents of the clipboard.
+Files: src/normal.c
+
+Patch 7.0.143
+Problem: Setting 'scroll' to its default value was not handled correctly.
+Solution: Compare the right field to PV_SCROLL.
+Files: src/option.c
+
+Patch 7.0.144
+Problem: May compare two unrelated pointers when matching a pattern against
+ a string. (Dominique Pelle)
+Solution: Avoid calling reg_getline() when REG_MULTI is false.
+Files: src/regexp.c
+
+Patch 7.0.145 (after 7.0.142)
+Problem: Compiler warning.
+Solution: Add type cast.
+Files: src/normal.c
+
+Patch 7.0.146
+Problem: When 'switchbuf' is set to "usetab" and the current tab has only a
+ quickfix window, jumping to an error always opens a new window.
+ Also, when the buffer is open in another tab page it's not found.
+Solution: Check for the "split" value of 'switchbuf' properly. Search in
+ other tab pages for the desired buffer. (Yegappan Lakshmanan)
+Files: src/buffer.c, src/quickfix.c
+
+Patch 7.0.147
+Problem: When creating a session file and there are several tab pages and
+ some windows have a local directory a short file name may be used
+ when it's not valid. (Marius Roets)
+ A session with multiple tab pages may result in "No Name" buffers.
+ (Bill McCarthy)
+Solution: Don't enter tab pages when going through the list, only use a
+ pointer to the first window in each tab page.
+ Use "tabedit" instead of "tabnew | edit" when possible.
+Files: src/ex_docmd.c
+
+Patch 7.0.148
+Problem: When doing "call a.xyz()" and "xyz" does not exist in dictionary
+ "a" there is no error message. (Yegappan Lakshmanan)
+Solution: Add the error message.
+Files: src/eval.c
+
+Patch 7.0.149
+Problem: When resizing a window that shows "~" lines the text sometimes
+ jumps down.
+Solution: Remove code that uses "~" lines in some situations. Fix the
+ computation of the screen line of the cursor. Also set w_skipcol
+ to handle very long lines.
+Files: src/misc1.c, src/window.c
+
+Patch 7.0.150
+Problem: When resizing the Vim window scrollbinding doesn't work. (Yakov
+ Lerner)
+Solution: Do scrollbinding in set_shellsize().
+Files: src/term.c
+
+Patch 7.0.151
+Problem: Buttons in file dialog are not according to Gnome guidelines.
+Solution: Swap Cancel and Open buttons. (Stefano Zacchiroli)
+Files: src/gui_gtk.c
+
+Patch 7.0.152
+Problem: Crash when using lesstif 2.
+Solution: Fill in the extension field. (Ben Hutchings)
+Files: src/gui_xmebw.c
+
+Patch 7.0.153
+Problem: When using cscope and opening the temp file fails Vim crashes.
+ (Kaya Bekiroglu)
+Solution: Check for NULL pointer returned from mch_open().
+Files: src/if_cscope.c
+
+Patch 7.0.154
+Problem: When 'foldnestmax' is negative Vim can hang. (James Vega)
+Solution: Avoid the fold level becoming negative.
+Files: src/fold.c, src/syntax.c
+
+Patch 7.0.155
+Problem: When getchar() returns a mouse button click there is no way to get
+ the mouse coordinates.
+Solution: Add v:mouse_win, v:mouse_lnum and v:mouse_col.
+Files: runtime/doc/eval.txt, src/eval.c, src/vim.h
+
+Patch 7.0.156 (extra)
+Problem: Vim doesn't compile for Amiga OS 4.
+Solution: Various changes for Amiga OS4. (Peter Bengtsson)
+Files: src/feature.h, src/mbyte.c, src/memfile.c, src/memline.c,
+ src/os_amiga.c, src/os_amiga.h, src/pty.c
+
+Patch 7.0.157
+Problem: When a function is used recursively the profiling information is
+ invalid. (Mikolaj Machowski)
+Solution: Put the start time on the stack instead of in the function.
+Files: src/eval.c
+
+Patch 7.0.158
+Problem: In a C file with ":set foldmethod=syntax", typing {<CR> on the
+ last line results in the cursor being in a closed fold. (Gautam
+ Iyer)
+Solution: Open fold after inserting a new line.
+Files: src/edit.c
+
+Patch 7.0.159
+Problem: When there is an I/O error in the swap file the cause of the error
+ cannot be seen.
+Solution: Use PERROR() instead of EMSG() where possible.
+Files: src/memfile.c
+
+Patch 7.0.160
+Problem: ":@a" echoes the command, Vi doesn't do that.
+Solution: Set the silent flag in the typeahead buffer to avoid echoing the
+ command.
+Files: src/ex_docmd.c, src/normal.c, src/ops.c, src/proto/ops.pro
+
+Patch 7.0.161
+Problem: Win32: Tab pages line popup menu isn't using the right encoding.
+ (Yongwei Wu)
+Solution: Convert the text when necessary. Also fixes the Find/Replace
+ dialog title. (Yegappan Lakshmanan)
+Files: src/gui_w48.c
+
+Patch 7.0.162
+Problem: "vim -o a b" when file "a" triggers the ATTENTION dialog,
+ selecting "Quit" exits Vim instead of editing "b" only.
+ When file "b" triggers the ATTENTION dialog selecting "Quit" or
+ "Abort" results in editing file "a" in that window.
+Solution: When selecting "Abort" exit Vim. When selecting "Quit" close the
+ window. Also avoid hit-enter prompt when selecting Abort.
+Files: src/buffer.c, src/main.c
+
+Patch 7.0.163
+Problem: Can't retrieve the position of a sign after it was set.
+Solution: Add the netbeans interface getAnno command. (Xavier de Gaye)
+Files: runtime/doc/netbeans.txt, src/netbeans.c
+
+Patch 7.0.164
+Problem: ":redir @+" doesn't work.
+Solution: Accept "@+" just like "@*". (Yegappan Lakshmanan)
+Files: src/ex_docmd.c
+
+Patch 7.0.165
+Problem: Using CTRL-L at the search prompt adds a "/" and other characters
+ without escaping, causing the pattern not to match.
+Solution: Escape special characters with a backslash.
+Files: src/ex_getln.c
+
+Patch 7.0.166
+Problem: Crash in cscope code when connection could not be opened.
+ (Kaya Bekiroglu)
+Solution: Check for the file descriptor to be NULL.
+Files: src/if_cscope.c
+
+Patch 7.0.167
+Problem: ":function" redefining a dict function doesn't work properly.
+ (Richard Emberson)
+Solution: Allow a function name to be a number when it's a function
+ reference.
+Files: src/eval.c
+
+Patch 7.0.168
+Problem: Using uninitialized memory and memory leak. (Dominique Pelle)
+Solution: Use alloc_clear() instead of alloc() for w_lines. Free
+ b_ml.ml_stack after recovery.
+Files: src/memline.c, src/window.c
+
+Patch 7.0.169
+Problem: With a Visual block selection, with the cursor in the left upper
+ corner, pressing "I" doesn't remove the highlighting. (Guopeng
+ Wen)
+Solution: When checking if redrawing is needed also check if Visual
+ selection is still active.
+Files: src/screen.c
+
+Patch 7.0.170 (extra)
+Problem: Win32: Using "gvim --remote-tab foo" when gvim is minimized while
+ it previously was maximized, un-maximizing doesn't work properly.
+ And the labels are not displayed properly when 'encoding' is
+ utf-8.
+Solution: When minimized check for SW_SHOWMINIMIZED. When updating the tab
+ pages line use TCM_SETITEMW instead of TCM_INSERTITEMW. (Liu
+ Yubao)
+Files: src/gui_w48.c
+
+Patch 7.0.171 (extra)
+Problem: VMS: A file name with multiple paths is written in the wrong file.
+Solution: Get the actually used file name. (Zoltan Arpadffy)
+ Also add info to the :version command about compilation.
+Files: src/Make_vms.mms, src/buffer.c, src/os_unix.c, src/version.c
+
+Patch 7.0.172
+Problem: Crash when recovering and quitting at the "press-enter" prompt.
+Solution: Check for "msg_list" to be NULL. (Liu Yubao)
+Files: src/ex_eval.c
+
+Patch 7.0.173
+Problem: ":call f().TT()" doesn't work. (Richard Emberson)
+Solution: When a function returns a Dictionary or another composite continue
+ evaluating what follows.
+Files: src/eval.c
+
+Patch 7.0.174
+Problem: ":mksession" doesn't restore window layout correctly in tab pages
+ other than the current one. (Zhibin He)
+Solution: Use the correct topframe for producing the window layout commands.
+Files: src/ex_docmd.c
+
+Patch 7.0.175
+Problem: The result of tr() is missing the terminating NUL. (Ingo Karkat)
+Solution: Add the NUL.
+Files: src/eval.c
+
+Patch 7.0.176
+Problem: ":emenu" isn't executed directly, causing the encryption key
+ prompt to fail. (Life Jazzer)
+Solution: Fix wrong #ifdef.
+Files: src/menu.c
+
+Patch 7.0.177
+Problem: When the press-enter prompt gets a character from a non-remappable
+ mapping, it's put back in the typeahead buffer as remappable,
+ which may cause an endless loop.
+Solution: Restore the non-remappable flag and the silent flag when putting a
+ char back in the typeahead buffer.
+Files: src/getchar.c, src/message.c, src/normal.c
+
+Patch 7.0.178
+Problem: When 'enc' is "utf-8" and 'ignorecase' is set the result of ":echo
+ ("\xe4" == "\xe4")" varies.
+Solution: In mb_strnicmp() avoid looking past NUL bytes.
+Files: src/mbyte.c
+
+Patch 7.0.179
+Problem: Using ":recover" or "vim -r" without a swapfile crashes Vim.
+Solution: Check for "buf" to be unequal NULL. (Yukihiro Nakadaira)
+Files: src/memline.c
+
+Patch 7.0.180 (extra, after 7.0.171)
+Problem: VMS: build failed. Problem with swapfiles.
+Solution: Add "compiled_arch". Always expand path and pass it to
+ buf_modname(). (Zoltan Arpadffy)
+Files: src/globals.h, src/memline.c, src/os_unix.c, runtime/menu.vim
+
+Patch 7.0.181
+Problem: When reloading a file that starts with an empty line, the reloaded
+ buffer has an extra empty line at the end. (Motty Lentzitzky)
+Solution: Delete all lines, don't use bufempty().
+Files: src/fileio.c
+
+Patch 7.0.182
+Problem: When using a mix of undo and "g-" it may no longer be possible to
+ go to every point in the undo tree. (Andy Wokula)
+Solution: Correctly update pointers in the undo tree.
+Files: src/undo.c
+
+Patch 7.0.183
+Problem: Crash in ":let" when redirecting to a variable that's being
+ displayed. (Thomas Link)
+Solution: When redirecting to a variable only do the assignment when
+ stopping redirection to avoid that setting the variable causes a
+ freed string to be accessed.
+Files: src/eval.c
+
+Patch 7.0.184
+Problem: When the cscope program is called "mlcscope" the Cscope interface
+ doesn't work.
+Solution: Accept "\S*cscope:" instead of "cscope:". (Frodak D. Baksik)
+Files: src/if_cscope.c
+
+Patch 7.0.185
+Problem: Multi-byte characters in a message are displayed with attributes
+ from what comes before it.
+Solution: Don't use the attributes for a multibyte character. Do use
+ attributes for special characters. (Yukihiro Nakadaira)
+Files: src/message.c
+
+Patch 7.0.186
+Problem: Get an ml_get error when 'encoding' is "utf-8" and searching for
+ "/\_s*/e" in an empty buffer. (Andrew Maykov)
+Solution: Don't try getting the line just below the last line.
+Files: src/search.c
+
+Patch 7.0.187
+Problem: Can't source a remote script properly.
+Solution: Add the SourceCmd event. (Charles Campbell)
+Files: runtime/doc/autocmd.txt, src/ex_cmds2.c, src/fileio.c, src/vim.h
+
+Patch 7.0.188 (after 7.0.186)
+Problem: Warning for wrong pointer type.
+Solution: Add a type cast.
+Files: src/search.c
+
+Patch 7.0.189
+Problem: Translated message about finding matches is truncated. (Yukihiro
+ Nakadaira)
+Solution: Enlarge the buffer. Also use vim_snprintf().
+Files: src/edit.c
+
+Patch 7.0.190
+Problem: "syntax spell default" results in an error message.
+Solution: Change 4 to 7 for STRNICMP(). (Raul Nunez de Arenas Coronado)
+Files: src/syntax.c
+
+Patch 7.0.191
+Problem: The items used by getqflist() and setqflist() don't match.
+Solution: Support the "bufnum" item for setqflist(). (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/quickfix.c
+
+Patch 7.0.192
+Problem: When 'swapfile' is switched off in an empty file it is possible
+ that not all blocks are loaded into memory, causing ml_get errors
+ later.
+Solution: Rename "dont_release" to "mf_dont_release" and also use it to
+ avoid using the cached line and locked block.
+Files: src/globals.h, src/memfile.c, src/memline.c
+
+Patch 7.0.193
+Problem: Using --remote or --remote-tab with an argument that matches
+ 'wildignore' causes a crash.
+Solution: Check the argument count before using ARGLIST[0].
+Files: src/ex_cmds.c
+
+Patch 7.0.194
+Problem: Once an ml_get error is given redrawing part of the screen may
+ cause it again, resulting in an endless loop.
+Solution: Don't give the error message for a recursive call.
+Files: src/memline.c
+
+Patch 7.0.195
+Problem: When a buffer is modified and 'autowriteall' is set, ":quit"
+ results in an endless loop when there is a conversion error while
+ writing. (Nikolai Weibull)
+Solution: Make autowrite() return FAIL if the buffer is still changed after
+ writing it.
+ /* put the cursor on the last char, for 'tw' formatting */
+Files: src/ex_cmds2.c
+
+Patch 7.0.196
+Problem: When using ":vert ball" the computation of the mouse pointer
+ position may be off by one column. (Stefan Karlsson)
+Solution: Recompute the frame width when moving the vertical separator from
+ one window to another.
+Files: src/window.c
+
+Patch 7.0.197 (extra)
+Problem: Win32: Compiling with EXITFREE doesn't work.
+Solution: Adjust a few #ifdefs. (Alexei Alexandrof)
+Files: src/misc2.c, src/os_mswin.c
+
+Patch 7.0.198 (extra)
+Problem: Win32: Compiler warnings. No need to generate gvim.exe.mnf.
+Solution: Add type casts. Use "*" for processorArchitecture. (George Reilly)
+Files: src/Make_mvc.mak, src/eval.c, src/gvim.exe.mnf, src/misc2.c
+
+Patch 7.0.199
+Problem: When using multibyte characters the combination of completion and
+ formatting may result in a wrong cursor position.
+Solution: Don't decrement the cursor column, use dec_cursor(). (Yukihiro
+ Nakadaira) Also check for the column to be zero.
+Files: src/edit.c
+
+Patch 7.0.200
+Problem: Memory leaks when out of memory.
+Solution: Free the memory.
+Files: src/edit.c, src/diff.c
+
+Patch 7.0.201
+Problem: Message for ":diffput" about buffer not being in diff mode may be
+ wrong.
+Solution: Check for buffer in diff mode but not modifiable.
+Files: src/diff.c
+
+Patch 7.0.202
+Problem: Problems on Tandem systems while compiling and at runtime.
+Solution: Recognize root uid is 65535. Check select() return value for it
+ not being supported. Avoid wrong function prototypes. Mention
+ use of -lfloss. (Matthew Woehlke)
+Files: src/Makefile, src/ex_cmds.c, src/fileio.c, src/main.c,
+ src/osdef1.h.in, src/osdef2.h.in, src/os_unix.c, src/pty.c,
+ src/vim.h
+
+Patch 7.0.203
+Problem: 0x80 characters in a register are not handled correctly for the
+ "@" command.
+Solution: Escape CSI and 0x80 characters. (Yukihiro Nakadaira)
+Files: src/ops.c
+
+Patch 7.0.204
+Problem: Cscope: Parsing matches for listing isn't done properly.
+Solution: Check for line number being found. (Yu Zhao)
+Files: src/if_cscope.c
+
+Patch 7.0.205 (after 7.0.203)
+Problem: Can't compile.
+Solution: Always include the vim_strsave_escape_csi function.
+Files: src/getchar.c
+
+Patch 7.0.206 (after 7.0.058)
+Problem: Some characters of the "gb18030" encoding are not handled
+ properly.
+Solution: Do not use "cp936" as an alias for "gb18030" encoding. Instead
+ initialize 'encoding' to "cp936".
+Files: src/mbyte.c, src/option.c
+
+Patch 7.0.207
+Problem: After patch 2.0.203 CSI and K_SPECIAL characters are escaped when
+ recorded and then again when the register is executed.
+Solution: Remove escaping before putting the recorded characters in a
+ register. (Yukihiro Nakadaira)
+Files: src/getchar.c, src/ops.c, src/proto/getchar.pro
+
+Patch 7.0.208 (after 7.0.171 and 7.0.180)
+Problem: VMS: changes to path handling cause more trouble than they solve.
+Solution: Revert changes.
+Files: src/buffer.c, src/memline.c, src/os_unix.c
+
+Patch 7.0.209
+Problem: When replacing a line through Python the cursor may end up beyond
+ the end of the line.
+Solution: Check the cursor column after replacing the line.
+Files: src/if_python.c
+
+Patch 7.0.210
+Problem: ":cbuffer" and ":lbuffer" always fail when the buffer is modified.
+ (Gary Johnson)
+Solution: Support adding a !. (Yegappan Lakshmanan)
+Files: runtime/doc/quickfix.txt, src/ex_cmds.h
+
+Patch 7.0.211
+Problem: With ":set cindent noai bs=0" using CTRL-U in Insert mode will
+ delete auto-indent. After ":set ai" it doesn't.
+Solution: Also check 'cindent' being set. (Ryan Lortie)
+Files: src/edit.c
+
+Patch 7.0.212
+Problem: The GUI can't be terminated with SIGTERM. (Mark Logan)
+Solution: Use the signal protection in the GUI as in the console, allow
+ signals when waiting for 100 msec or longer.
+Files: src/ui.c
+
+Patch 7.0.213
+Problem: When 'spellfile' has two regions that use the same sound folding
+ using "z=" will cause memory to be freed twice. (Mark Woodward)
+Solution: Clear the hashtable properly so that the items are only freed once.
+Files: src/spell.c
+
+Patch 7.0.214
+Problem: When using <f-args> in a user command it's not possible to have an
+ argument end in '\ '.
+Solution: Change the handling of backslashes. (Yakov Lerner)
+Files: runtime/doc/map.txt, src/ex_docmd.c
+
+Patch 7.0.215 (extra)
+Problem: Mac: Scrollbar size isn't set. Context menu has disabled useless
+ Help entry. Call to MoreMasterPointers() is ignored.
+Solution: Call SetControlViewSize() in gui_mch_set_scrollbar_thumb(). Use
+ kCMHelpItemRemoveHelp for ContextualMenuSelect(). Remove call to
+ MoreMasterPointers(). (Nicolas Weber)
+Files: src/gui_mac.c
+
+Patch 7.0.216
+Problem: ":tab wincmd ]" does not open a tab page. (Tony Mechelynck)
+Solution: Copy the cmdmod.tab value to postponed_split_tab and use it.
+Files: src/globals.h, src/ex_docmd.c, src/if_cscope.c, src/window.c
+
+Patch 7.0.217
+Problem: This hangs when pressing "n": ":%s/\n/,\r/gc". (Ori Avtalion)
+Solution: Set "skip_match" to advance to the next line.
+Files: src/ex_cmds.c
+
+Patch 7.0.218
+Problem: "%B" in 'statusline' always shows zero in Insert mode. (DervishD)
+Solution: Remove the exception for Insert mode, check the column for being
+ valid instead.
+Files: src/buffer.c
+
+Patch 7.0.219
+Problem: When using the 'editexisting.vim' script and a file is being
+ edited in another tab page the window is split. The "+123"
+ argument is not used.
+Solution: Make the tab page with the file the current tab page. Set
+ v:swapcommand when starting up to the first "+123" or "-c" command
+ line argument.
+Files: runtime/macros/editexisting.vim, src/main.c
+
+Patch 7.0.220
+Problem: Crash when using winnr('#') in a new tab page. (Andy Wokula)
+Solution: Check for not finding the window.
+Files: src/eval.c
+
+Patch 7.0.221
+Problem: finddir() uses 'path' by default, where "." means relative to the
+ current file. But it works relative to the current directory.
+ (Tye Zdrojewski)
+Solution: Add the current buffer name to find_file_in_path_option() for the
+ relative file name.
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.0.222
+Problem: Perl indenting using 'cindent' works almost right.
+Solution: Recognize '#' to start a comment. (Alex Manoussakis) Added '#'
+ flag in 'cinoptions'.
+Files: runtime/doc/indent.txt, src/misc1.c
+
+Patch 7.0.223
+Problem: Unprintable characters in completion text mess up the popup menu.
+ (Gombault Damien)
+Solution: Use strtrans() to make the text printable.
+Files: src/charset.c, src/popupmnu.c
+
+Patch 7.0.224
+Problem: When expanding "##" spaces are escaped twice. (Pavol Juhas)
+Solution: Don't escape the spaces that separate arguments.
+Files: src/eval.c, src/ex_docmd.c, src/proto/ex_docmd.pro
+
+Patch 7.0.225
+Problem: When using setline() in an InsertEnter autocommand and doing "A"
+ the cursor ends up on the last byte in the line. (Yukihiro
+ Nakadaira)
+Solution: Only adjust the column when using setline() for the cursor line.
+ Move it back to the head byte if necessary.
+Files: src/eval.c, src/misc2.c
+
+Patch 7.0.226
+Problem: Display flickering when updating signs through the netbeans
+ interface. (Xavier de Gaye)
+Solution: Remove the redraw_later(CLEAR) call.
+Files: src/netbeans.c
+
+Patch 7.0.227
+Problem: Crash when closing a window in the GUI. (Charles Campbell)
+Solution: Don't call out_flush() from win_free().
+Files: src/window.c
+
+Patch 7.0.228
+Problem: Cygwin: problem with symlink to DOS style path.
+Solution: Invoke cygwin_conv_to_posix_path(). (Luca Masini)
+Files: src/os_unix.c
+
+Patch 7.0.229
+Problem: When 'pastetoggle' starts with Esc then pressing Esc in Insert
+ mode will not time out. (Jeffery Small)
+Solution: Use KL_PART_KEY instead of KL_PART_MAP, so that 'ttimeout' applies
+ to the 'pastetoggle' key.
+Files: src/getchar.c
+
+Patch 7.0.230
+Problem: After using ":lcd" a script doesn't know how to restore the
+ current directory.
+Solution: Add the haslocaldir() function. (Bob Hiestand)
+Files: runtime/doc/usr_41.txt, runtime/doc/eval.txt, src/eval.c
+
+Patch 7.0.231
+Problem: When recovering from a swap file the page size is likely to be
+ different from the minimum. The block used for the first page
+ then has a buffer of the wrong size, causing a crash when it's
+ reused later. (Zephaniah Hull)
+Solution: Reallocate the buffer when the page size changes. Also check that
+ the page size is at least the minimum value.
+Files: src/memline.c
+
+Patch 7.0.232 (extra)
+Problem: Mac: doesn't support GUI tab page labels.
+Solution: Add GUI tab page labels. (Nicolas Weber)
+Files: src/feature.h, src/gui.c, src/gui.h, src/gui_mac.c,
+ src/proto/gui_mac.pro
+
+Patch 7.0.233 (extra)
+Problem: Mac: code formatted badly.
+Solution: Fix code formatting
+Files: src/gui_mac.c
+
+Patch 7.0.234
+Problem: It's possible to use feedkeys() from a modeline. That is a
+ security issue, can be used for a trojan horse.
+Solution: Disallow using feedkeys() in the sandbox.
+Files: src/eval.c
+
+Patch 7.0.235
+Problem: It is possible to use writefile() in the sandbox.
+Solution: Add a few more checks for the sandbox.
+Files: src/eval.c
+
+Patch 7.0.236
+Problem: Linux 2.4 uses sysinfo() with a mem_unit field, which is not
+ backwards compatible.
+Solution: Add an autoconf check for sysinfo.mem_unit. Let mch_total_mem()
+ return Kbyte to avoid overflow.
+Files: src/auto/configure, src/configure.in, src/config.h.in,
+ src/option.c, src/os_unix.c
+
+Patch 7.0.237
+Problem: For root it is recommended to not use 'modeline', but in
+ not-compatible mode the default is on.
+Solution: Let 'modeline' default to off for root.
+Files: runtime/doc/options.txt, src/option.c
+
+Patch 7.0.238
+Problem: Crash when ":match" pattern runs into 'maxmempattern'. (Yakov
+ Lerner)
+Solution: Don't free the regexp program of match_hl.
+Files: src/screen.c
+
+Patch 7.0.239
+Problem: When using local directories and tab pages ":mksession" uses a
+ short file name when it shouldn't. Window-local options from a
+ modeline may be applied to the wrong window. (Teemu Likonen)
+Solution: Add the did_lcd flag, use the full path when it's set. Don't use
+ window-local options from the modeline when using the current
+ window for another buffer in ":doautoall".
+Files: src/fileio.c, src/ex_docmd.c
+
+Patch 7.0.240
+Problem: Crash when splitting a window in the GUI. (opposite of 7.0.227)
+Solution: Don't call out_flush() from win_alloc(). Also avoid this for
+ win_delete(). Also block autocommands while the window structure
+ is invalid.
+Files: src/window.c
+
+Patch 7.0.241
+Problem: ":windo throw 'foo'" loops forever. (Andy Wokula)
+Solution: Detect that win_goto() doesn't work.
+Files: src/ex_cmds2.c
+
+Patch 7.0.242 (extra)
+Problem: Win32: Using "-register" in a Vim that does not support OLE causes
+ a crash.
+Solution: Don't use EMSG() but mch_errmsg(). Check p_go for being NULL.
+ (partly by Michael Wookey)
+Files: src/gui_w32.c
+
+Patch 7.0.243 (extra)
+Problem: Win32: When GvimExt is built with MSVC 2005 or later, the "Edit
+ with vim" context menu doesn't appear in the Windows Explorer.
+Solution: Embed the linker manifest file into the resources of GvimExt.dll.
+ (Mathias Michaelis)
+Files: src/GvimExt/Makefile
+
+
+Fixes after Vim 7.1a BETA:
+
+The extra archive had CVS directories included below "farsi" and
+"runtime/icons". CVS was missing the farsi icon files.
+
+Fix compiling with Gnome 2.18, undefine bind_textdomain_codeset. (Daniel
+Drake)
+
+Mac: "make install" didn't copy rgb.txt.
+
+When editing a compressed file while there are folds caused "ml_get" errors
+and some lines could be missing. When decompressing failed option values were
+not restored.
+
+
+Patch 7.1a.001
+Problem: Crash when downloading a spell file. (Szabolcs Horvat)
+Solution: Avoid that did_set_spelllang() is used recursively when a new
+ window is opened for the download.
+ Also avoid wiping out the wrong buffer.
+Files: runtime/autoload/spellfile.vim, src/buffer.c, src/ex_cmds.c,
+ src/spell.c
+
+Patch 7.1a.002 (extra)
+Problem: Compilation error with MingW.
+Solution: Check for LPTOOLTIPTEXT to be defined.
+Files: src/gui_w32.c
+
+
+Fixes after Vim 7.1b BETA:
+
+Made the Mzscheme interface build both with old and new versions of Mzscheme,
+using an #ifdef. (Sergey Khorev)
+Mzscheme interface didn't link, missing function. Changed order of libraries
+in the configure script.
+
+Ruby interface didn't compile on Mac. Changed #ifdef. (Kevin Ballard)
+
+Patch 7.1b.001 (extra)
+Problem: Random text in a source file. No idea how it got there.
+Solution: Delete the text.
+Files: src/gui_w32.c
+
+Patch 7.1b.002
+Problem: When 'maxmem' is large there can be an overflow in computations.
+ (Thomas Wiegner)
+Solution: Use the same mechanism as in mch_total_mem(): first reduce the
+ multiplier as much as possible.
+Files: src/memfile.c
+
+==============================================================================
+VERSION 7.2 *version-7.2* *version7.2*
+
+This section is about improvements made between version 7.1 and 7.2.
+
+This is mostly a bug-fix release. The main new feature is floating point
+support. |Float|
+
+
+Changed *changed-7.2*
+-------
+
+Changed the command line buffer name from "command-line" to "[Command Line]".
+
+Removed optional ! for ":caddexpr", ":cgetexpr", ":cgetfile", ":laddexpr",
+":lgetexpr" and ":lgetfile". They are not needed. (Yegappan Lakshmanan)
+
+An offset for syntax matches worked on bytes instead of characters. That is
+inconsistent and can easily be done wrong. Use character offsets now.
+(Yukihiro Nakadaira)
+
+The FileChangedShellPost event was also given when a file didn't change.
+(John Little)
+
+When the current line is long (doesn't fit) the popup menu can't be seen.
+Display it below the screen line instead of below the text line.
+(Francois Ingelrest)
+
+Switched to autoconf version 2.62.
+
+Moved including fcntl.h to vim.h and removed it from all .c files.
+
+Introduce macro STRMOVE(d, s), like STRCPY() for overlapping strings.
+Use it instead of mch_memmove(p, p + x, STRLEN(p + x) + 1).
+
+Removed the bulgarian.vim keymap file, two more standard ones replace it.
+(Boyko Bantchev)
+
+Increased the maximum number of tag matches for command line completion from
+200 to 300.
+
+Renamed help file sql.txt to ft_sql.txt and ada.txt to ft_ada.txt.
+
+
+Added *added-7.2*
+-----
+
+New syntax files:
+ CUDA (Timothy B. Terriberry)
+ Cdrdao config (Nikolai Weibull)
+ Coco/R (Ashish Shukla)
+ Denyhosts config (Nikolai Weibull)
+ Dtrace script (Nicolas Weber)
+ Git output, commit, config, rebase, send-email (Tim Pope)
+ HASTE and HastePreProc (M. Tranchero)
+ Haml (Tim Pope)
+ Host conf (Nikolai Weibull)
+ Linden script (Timo Frenay)
+ MS messages (Kevin Locke)
+ PDF (Tim Pope)
+ ProMeLa (Maurizio Tranchero)
+ Reva Foth (Ron Aaron)
+ Sass (Tim Pope)
+ Symbian meta-makefile, MMP (Ron Aaron)
+ VOS CM macro (Andrew McGill)
+ XBL (Doug Kearns)
+
+New tutor files:
+ Made UTF-8 versions of all the tutor files.
+ Greek renamed from ".gr" to ".el" (Greek vs Greece).
+ Esperanto (Dominique Pelle)
+ Croatian (Paul B. Mahol)
+
+New filetype plugins:
+ Cdrdao config (Nikolai Weibull)
+ Debian control files (Debian Vim maintainers)
+ Denyhosts (Nikolai Weibull)
+ Dos .ini file (Nikolai Weibull)
+ Dtrace script (Nicolas Weber)
+ FnameScript (Nikolai Weibull)
+ Git, Git config, Git commit, Git rebase, Git send-email (Tim Pope)
+ Haml (Tim Pope)
+ Host conf (Nikolai Weibull)
+ Host access (Nikolai Weibull)
+ Logtalk (Paulo Moura)
+ MS messages (Kevin Locke)
+ NSIS script (Nikolai Weibull)
+ PDF (Tim Pope)
+ Reva Forth (Ron Aaron)
+ Sass (Tim Pope)
+
+New indent files:
+ DTD (Nikolai Weibull)
+ Dtrace script (Nicolas Weber)
+ Erlang (Csaba Hoch)
+ FrameScript (Nikolai Weibull)
+ Git config (Tim Pope)
+ Haml (Tim Pope)
+ Logtalk (Paulo Moura)
+ Sass (Tim Pope)
+ Tiny Fugue (Christian J. Robinson)
+
+New compiler plugins:
+ RSpec (Tim Pope)
+
+New keymap files:
+ Croatian (Paul B. Mahol)
+ Russian Dvorak (Serhiy Boiko)
+ Ukrainian Dvorak (Serhiy Boiko)
+ Removed plain Bulgarian, "bds" and phonetic are sufficient.
+
+Other new runtime files:
+ Esperanto menu and message translations. (Dominique Pelle)
+ Finnish menu and message translations. (Flammie Pirinen)
+ Brazilian Portuguese message translations. (Eduardo Dobay)
+
+Added floating point support. |Float|
+
+Added argument to mode() to return a bit more detail about the current mode.
+(Ben Schmidt)
+
+Added support for BSD console mouse: |sysmouse|. (Paul B. Mahol)
+
+Added the "newtab" value for the 'switchbuf' option. (partly by Yegappan
+Lakshmanan)
+
+Improved error messages for the netbeans interface. (Philippe Fremy)
+
+Added support for using xterm mouse codes for screen. (Micah Cowan)
+
+Added support for cross compiling:
+Adjusted configure.in and added INSTALLcross.txt. (Marc Haisenko) Fixed
+mistakes in configure.in after that.
+Don't use /usr/local/include and /usr/local/lib in configure. (Philip
+Prindeville)
+For cross compiling the Cygwin version on Unix, change VIM.TLB to vim.tlb in
+src/vim.rc. (Tsuneo Nakagawa)
+
+Added v:searchforward variable: What direction we're searching in. (Yakov
+Lerner)
+
+
+Fixed *fixed-7.2*
+-----
+
+Patch 7.1.001
+Problem: Still can't build with Gnome libraries.
+Solution: Fix typo in bind_textdomain_codeset. (Mike Kelly)
+Files: src/gui_gtk.c, src/gui_gtk_x11.c
+
+Patch 7.1.002
+Problem: Oracle Pro*C/C++ files are not detected.
+Solution: Add the missing star. (Micah J. Cowan)
+Files: runtime/filetype.vim
+
+Patch 7.1.003 (extra)
+Problem: The "Tear off this menu" message appears in the message history
+ when using a menu. (Yongwei Wu)
+Solution: Disable message history when displaying the menu tip.
+Files: src/gui_w32.c
+
+Patch 7.1.004
+Problem: Crash when doing ":next directory". (Raphael Finkel)
+Solution: Do not use "buf", it may be invalid after autocommands.
+Files: src/ex_cmds.c
+
+Patch 7.1.005
+Problem: "cit" used on <foo></foo> deletes <foo>. Should not delete
+ anything and start insertion, like "ci'" does on "". (Michal
+ Bozon)
+Solution: Handle an empty object specifically. Made it work consistent for
+ various text objects.
+Files: src/search.c
+
+Patch 7.1.006
+Problem: Resetting 'modified' in a StdinReadPost autocommand doesn't work.
+Solution: Set 'modified' before the autocommands instead of after it.
+Files: src/buffer.c
+
+Patch 7.1.007 (extra)
+Problem: Mac: Context menu doesn't work on Intel Macs.
+ Scrollbars are not dimmed when Vim is not the active application.
+Solution: Remove the test whether context menus are supported. They are
+ always there in OS/X. Handle the dimming. (Nicolas Weber)
+Files: src/gui_mac.c, src/gui.h
+
+Patch 7.1.008
+Problem: getfsize() returns a negative number for very big files.
+Solution: Check for overflow and return -2.
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.1.009
+Problem: In diff mode, displaying the difference between a tab and spaces
+ is not highlighted correctly.
+Solution: Only change highlighting at the end of displaying a tab.
+Files: src/screen.c
+
+Patch 7.1.010
+Problem: The Gnome session file doesn't restore tab pages.
+Solution: Add SSOP_TABPAGES to the session flags. (Matias D'Ambrosio)
+Files: src/gui_gtk_x11.c
+
+Patch 7.1.011
+Problem: Possible buffer overflow when $VIMRUNTIME is very long. (Victor
+ Stinner)
+Solution: Use vim_snprintf().
+Files: src/main.c
+
+Patch 7.1.012
+Problem: ":let &shiftwidth = 'asdf'" doesn't produce an error message.
+Solution: Check for a string argument. (Chris Lubinski)
+Files: src/option.c
+
+Patch 7.1.013
+Problem: ":syn include" only loads the first file, while it is documented
+ as doing the equivalent of ":runtime!".
+Solution: Change the argument to source_runtime(). (James Vega)
+Files: src/syntax.c
+
+Patch 7.1.014
+Problem: Crash when doing C indenting. (Chris Monson)
+Solution: Obtain the current line again after invoking cin_islabel().
+Files: src/edit.c
+
+Patch 7.1.015
+Problem: MzScheme interface: current-library-collection-paths produces no
+ list. Interface doesn't build on a Mac.
+Solution: Use a list instead of a pair. (Bernhard Fisseni) Use "-framework"
+ argument for MZSCHEME_LIBS in configure.
+Files: src/configure.in, src/if_mzsch.c, src/auto/configure
+
+Patch 7.1.016 (after patch 7.1.012)
+Problem: Error message about setting 'diff' to a string.
+Solution: Don't pass an empty string to set_option_value() when setting
+ 'diff'.
+Files: src/quickfix.c, src/popupmnu.c
+
+Patch 7.1.017
+Problem: ":confirm w" does give a prompt when 'readonly' is set, but not
+ when the file permissions are read-only. (Michael Schaap)
+Solution: Provide a dialog in both situations. (Chris Lubinski)
+Files: src/ex_cmds.c, src/fileio.c, src/proto/fileio.pro
+
+Patch 7.1.018
+Problem: When 'virtualedit' is set a "p" of a block just past the end of
+ the line inserts before the cursor. (Engelke)
+Solution: Check for the cursor being just after the line (Chris Lubinski)
+Files: src/ops.c
+
+Patch 7.1.019
+Problem: ":py" asks for an argument, ":py asd" then gives the error that
+ ":py" isn't implemented. Should already happen for ":py".
+Solution: Compare with ex_script_ni. (Chris Lubinski)
+Files: src/ex_docmd.c
+
+Patch 7.1.020
+Problem: Reading from uninitialized memory when using a dialog. (Dominique
+ Pelle)
+Solution: In msg_show_console_dialog() append a NUL after every appended
+ character.
+Files: src/message.c
+
+Patch 7.1.021 (after 7.1.015)
+Problem: Mzscheme interface doesn't compile on Win32.
+Solution: Fix the problem that 7.1.015 fixed in a better way. (Sergey Khorev)
+Files: src/if_mzsch.c
+
+Patch 7.1.022
+Problem: When setting 'keymap' twice the b:keymap_name variable isn't set.
+ (Milan Berta)
+Solution: Don't unlet b:keymap_name for ":loadkeymap". (Martin Toft)
+Files: src/digraph.c
+
+Patch 7.1.023
+Problem: "dw" in a line with one character deletes the line. Vi and nvi
+ don't do this. (Kjell Arne Rekaa)
+Solution: Check for one-character words especially.
+Files: src/search.c
+
+Patch 7.1.024
+Problem: Using a pointer that has become invalid. (Chris Monson)
+Solution: Obtain the line pointer again after we looked at another line.
+Files: src/search.c
+
+Patch 7.1.025
+Problem: search() and searchpos() don't use match under cursor at start of
+ line when using 'bc' flags. (Viktor Kojouharov)
+Solution: Don't go to the previous line when the 'c' flag is present.
+ Also fix that "j" doesn't move the cursor to the right column.
+Files: src/eval.c, src/search.c
+
+Patch 7.1.026
+Problem: "[p" doesn't work in Visual mode. (David Brown)
+Solution: Use checkclearop() instead of checkclearopq().
+Files: src/normal.c
+
+Patch 7.1.027
+Problem: On Sun systems opening /dev/fd/N doesn't work, and they are used
+ by process substitutions.
+Solution: Allow opening specific character special files for Sun systems.
+ (Gary Johnson)
+Files: src/fileio.c, src/os_unix.h
+
+Patch 7.1.028
+Problem: Can't use last search pattern for ":sort". (Brian McKee)
+Solution: When the pattern is empty use the last search pattern. (Martin
+ Toft)
+Files: runtime/doc/change.txt, src/ex_cmds.c
+
+Patch 7.1.029 (after 7.1.019)
+Problem: Can't compile when all interfaces are used. (Taylor Venable)
+Solution: Only check for ex_script_ni when it's defined.
+Files: src/ex_docmd.c
+
+Patch 7.1.030
+Problem: The "vimtutor" shell script checks for "vim6" but not for "vim7".
+ (Christian Robinson)
+Solution: Check for more versions, but prefer using "vim".
+Files: src/vimtutor
+
+Patch 7.1.031
+Problem: virtcol([123, '$']) doesn't work. (Michael Schaap)
+Solution: When '$' is used for the column number get the last column.
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.1.032
+Problem: Potential crash when editing a command line. (Chris Monson)
+Solution: Check the position to avoid access before the start of an array.
+Files: src/ex_getln.c
+
+Patch 7.1.033
+Problem: A buffer is marked modified when it was first deleted and then
+ added again using a ":next" command. (John Mullin)
+Solution: When checking if a buffer is modified use the BF_NEVERLOADED flag.
+Files: src/option.c
+
+Patch 7.1.034
+Problem: Win64: A few compiler warnings. Problems with optimizer.
+Solution: Use int instead of size_t. Disable the optimizer in one function.
+ (George V. Reilly)
+Files: src/eval.c, src/spell.c
+
+Patch 7.1.035
+Problem: After ":s/./&/#" all listed lines have a line number. (Yakov
+ Lerner)
+Solution: Reset the line number flag when not using the "&" flag.
+Files: src/ex_cmds.c
+
+Patch 7.1.036
+Problem: Completing ":echohl" argument should include "None". (Ori
+ Avtalion) ":match" should have "none" too.
+Solution: Add flags to use expand_highlight(). Also fix that when disabling
+ FEAT_CMDL_COMPL compilation fails. (Chris Lubinski)
+Files: src/eval.c, src/ex_docmd.c, src/ex_getln.c, src/proto/syntax.pro
+ src/syntax.c
+
+Patch 7.1.037
+Problem: strcpy() used for overlapping strings. (Chris Monson)
+Solution: Use mch_memmove() instead.
+Files: src/option.c
+
+Patch 7.1.038
+Problem: When 'expandtab' is set then a Tab copied for 'copyindent' is
+ expanded to spaces, even when 'preserveindent' is set. (Alexei
+ Alexandrov)
+Solution: Remove the check for 'expandtab'. Also fix that ">>" doesn't obey
+ 'preserveindent'. (Chris Lubinski)
+Files: src/misc1.c
+
+Patch 7.1.039
+Problem: A tag in a help file that starts with "help-tags" and contains a
+ percent sign may make Vim crash. (Ulf Harnhammar)
+Solution: Use puts() instead of fprintf().
+Files: src/ex_cmds.c
+
+Patch 7.1.040
+Problem: ":match" only supports three matches.
+Solution: Add functions clearmatches(), getmatches(), matchadd(),
+ matchdelete() and setmatches(). Changed the data structures for
+ this. A small bug in syntax.c is fixed, so newly created
+ highlight groups can have their name resolved correctly from their
+ ID. (Martin Toft)
+Files: runtime/doc/eval.txt, runtime/doc/pattern.txt,
+ runtime/doc/usr_41.txt, src/eval.c, src/ex_docmd.c,
+ src/proto/window.pro, src/screen.c, src/structs.h, src/syntax.c,
+ src/testdir/Makefile, src/testdir/test63.in,
+ src/testdir/test63.ok, src/window.c
+
+Patch 7.1.041 (extra, after 7.1.040)
+Problem: Some changes for patch 7.1.040 are in extra files.
+Solution: Update the extra files.
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.1.042 (after 7.1.040)
+Problem: Internal error when using matchadd(). (David Larson)
+Solution: Check the third argument to be present before using the fourth
+ argument. (Martin Toft)
+Files: src/eval.c
+
+Patch 7.1.043
+Problem: In Ex mode using CTRL-D twice may cause a crash. Cursor isn't
+ positioned properly after CTRL-D.
+Solution: Set prev_char properly. Position the cursor correctly. (Antony
+ Scriven)
+Files: src/ex_getln.c
+
+Patch 7.1.044
+Problem: In Insert mode 0 CTRL-T deletes all indent, it should add indent.
+ (Gautam Iyer)
+Solution: Check for CTRL-D typed.
+Files: src/edit.c
+
+Patch 7.1.045
+Problem: Unnecessary screen redrawing. (Jjgod Jiang)
+Solution: Reset "must_redraw" after clearing the screen.
+Files: src/screen.c
+
+Patch 7.1.046
+Problem: ":s" command removes combining characters. (Ron Aaron)
+Solution: Copy composing characters individually. (Chris Lubinski)
+Files: src/regexp.c
+
+Patch 7.1.047
+Problem: vim_regcomp() called with invalid argument. (Xiaozhou Liu)
+Solution: Change TRUE to RE_MAGIC + RE_STRING.
+Files: src/ex_eval.c
+
+Patch 7.1.048
+Problem: The matchparen plugin doesn't update the match when scrolling with
+ the mouse wheel. (Ilya Bobir)
+Solution: Set the match highlighting for text that can be scrolled into the
+ viewable area without moving the cursor. (Chris Lubinski)
+Files: runtime/plugin/matchparen.vim
+
+Patch 7.1.049
+Problem: Cannot compile GTK2 version with Hangul input feature.
+Solution: Don't define FEAT_XFONTSET when using GTK2.
+Files: src/feature.h
+
+Patch 7.1.050
+Problem: Possible crash when using C++ indenting. (Chris Monson)
+Solution: Keep the line pointer to the line to compare with. Avoid going
+ past the end of line.
+Files: src/misc1.c
+
+Patch 7.1.051
+Problem: Accessing uninitialized memory when finding spell suggestions.
+Solution: Don't try swapping characters at the end of a word.
+Files: src/spell.c
+
+Patch 7.1.052
+Problem: When creating a new match not all fields are initialized, which
+ may lead to unpredictable results.
+Solution: Initialise rmm_ic and rmm_maxcol.
+Files: src/window.c
+
+Patch 7.1.053
+Problem: Accessing uninitialized memory when giving a message.
+Solution: Check going the length before checking for a NUL byte.
+Files: src/message.c
+
+Patch 7.1.054
+Problem: Accessing uninitialized memory when displaying the fold column.
+Solution: Add a NUL to the extra array. (Dominique Pelle). Also do this in
+ a couple of other situations.
+Files: src/screen.c
+
+Patch 7.1.055
+Problem: Using strcpy() with arguments that overlap.
+Solution: Use mch_memmove() instead.
+Files: src/buffer.c, src/charset.c, src/eval.c, src/ex_getln.c,
+ src/misc1.c, src/regexp.c, src/termlib.c
+
+Patch 7.1.056
+Problem: More prompt does not behave correctly after scrolling back.
+ (Randall W. Morris)
+Solution: Avoid lines_left becomes negative. (Chris Lubinski) Don't check
+ mp_last when deciding to show the more prompt. (Martin Toft)
+Files: src/message.c
+
+Patch 7.1.057
+Problem: Problem with CursorHoldI when using "r" in Visual mode (Max
+ Dyckhoff)
+Solution: Ignore CursorHold(I) when getting a second character for a Normal
+ mode command. Also abort the "r" command in Visual when a special
+ key is typed.
+Files: src/normal.c
+
+Patch 7.1.058
+Problem: When 'rightleft' is set the completion menu is positioned wrong.
+ (Baha-Eddine MOKADEM)
+Solution: Fix the completion menu. (Martin Toft)
+Files: src/popupmnu.c, src/proto/search.pro, src/search.c
+
+Patch 7.1.059
+Problem: When in Ex mode and doing "g/^/vi" and then pressing CTRL-C Vim
+ hangs and beeps. (Antony Scriven)
+Solution: Clear "got_int" in the main loop to avoid the hang. When typing
+ CTRL-C twice in a row abort the ":g" command. This is Vi
+ compatible.
+Files: src/main.c
+
+Patch 7.1.060
+Problem: Splitting quickfix window messes up window layout. (Marius
+ Gedminas)
+Solution: Compute the window size in a smarter way. (Martin Toft)
+Files: src/window.c
+
+Patch 7.1.061
+Problem: Win32: When 'encoding' is "latin1" 'ignorecase' doesn't work for
+ characters with umlaut. (Joachim Hofmann)
+Solution: Do not use islower()/isupper()/tolower()/toupper() but our own
+ functions. (Chris Lubinski)
+Files: src/mbyte.c, src/regexp.c, src/vim.h
+
+Patch 7.1.062 (after 7.1.038)
+Problem: Indents of C comments can be wrong. (John Mullin)
+Solution: Adjust ind_len. (Chris Lubinski)
+Files: src/misc1.c
+
+Patch 7.1.063 (after 7.1.040)
+Problem: Warning for uninitialized variable.
+Solution: Initialise it to NULL.
+Files: src/ex_docmd.c
+
+Patch 7.1.064
+Problem: On Interix some files appear not to exist.
+Solution: Remove the top bit from st_mode. (Ligesh)
+Files: src/os_unix.c
+
+Patch 7.1.065 (extra)
+Problem: Win32: Compilation problem for newer version of w32api.
+Solution: Only define __IID_DEFINED__ when needed. (Chris Sutcliffe)
+Files: src/Make_ming.mak, src/iid_ole.c
+
+Patch 7.1.066
+Problem: When 'bomb' is set or reset the file should be considered
+ modified. (Tony Mechelynck)
+Solution: Handle like 'endofline'. (Martin Toft)
+Files: src/buffer.c, src/fileio.c, src/option.c, src/structs.h
+
+Patch 7.1.067
+Problem: 'thesaurus' doesn't work when 'infercase' is set. (Mohsin)
+Solution: Don't copy the characters being completed but check the case and
+ apply it to the suggested word. Also fix that the first word in
+ the thesaurus line is not used. (Martin Toft)
+Files: src/edit.c
+
+Patch 7.1.068
+Problem: When 'equalalways' is set and splitting a window, it's possible
+ that another small window gets bigger.
+Solution: Only equalize window sizes when after a split the windows are
+ smaller than another window. (Martin Toft)
+Files: runtime/doc/options.txt, runtime/doc/windows.txt, src/window.c
+
+Patch 7.1.069
+Problem: GTK GUI: When using confirm() without a default button there still
+ is a default choice.
+Solution: Ignore Enter and Space when there is no default button. (Chris
+ Lubinski)
+Files: src/gui_gtk.c
+
+Patch 7.1.070 (extra)
+Problem: Win32 GUI: When using confirm() without a default button there
+ still is a default choice.
+Solution: Set focus on something else than a button. (Chris Lubinski)
+Files: src/gui_w32.c
+
+Patch 7.1.071 (after 7.1.040)
+Problem: Regexp patterns are not tested.
+Solution: Add a basic test, to be expanded later.
+ Also add (commented-out) support for valgrind.
+Files: src/testdir/Makefile, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.1.072 (extra, after 7.1.041 and 7.1.071)
+Problem: Some changes for patch 7.1.071 are in extra files.
+Solution: Update the extra files. Also fix a few warnings from the DOS test
+ makefile.
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.1.073 (after 7.1.062)
+Problem: Wrong cursor position and crash when 'preserveindent' is set.
+ (Charles Campbell)
+Solution: Handle the situation that we start without indent. (Chris
+ Lubinski)
+Files: src/misc1.c
+
+Patch 7.1.074
+Problem: Crash when calling string() on a recursively nested List.
+Solution: Check result value for being NULL. (Yukihiro Nakadaira)
+Files: src/eval.c
+
+Patch 7.1.075
+Problem: ":let v:statusmsg" reads memory already freed.
+Solution: Don't set v:statusmsg when listing it.
+Files: src/eval.c
+
+Patch 7.1.076
+Problem: Another strcpy() with overlapping arguments.
+Solution: Use mch_memmove(). (Dominique Pelle) And another one.
+Files: src/ex_docmd.c, src/normal.c
+
+Patch 7.1.077
+Problem: Using "can_spell" without initializing it. (Dominique Pelle)
+Solution: Set a default for get_syntax_attr().
+Files: src/syntax.c
+
+Patch 7.1.078
+Problem: Dropping a file name on gvim that contains a CSI byte doesn't work
+ when editing the command line.
+Solution: Escape the CSI byte when inserting in the input buffer. (Yukihiro
+ Nakadaira)
+Files: src/gui.c, src/ui.c
+
+Patch 7.1.079
+Problem: When the locale is "C" and 'encoding' is "latin1" then the "@"
+ character in 'isfname', 'isprint', etc. doesn't pick up accented
+ characters.
+Solution: Instead of isalpha() use MB_ISLOWER() and MB_ISUPPER().
+Files: src/charset.c, src/macros.h
+
+Patch 7.1.080 (extra)
+Problem: Compiler warnings for using "const char *" for "char *".
+Solution: Add type casts. (Chris Sutcliffe)
+Files: src/GvimExt/gvimext.cpp
+
+Patch 7.1.081
+Problem: Command line completion for a shell command: "cat </tmp/file<Tab>"
+ doesn't work.
+Solution: Start the file name at any character that can't be in a file name.
+ (Martin Toft)
+Files: src/ex_docmd.c
+
+Patch 7.1.082
+Problem: After a ":split" the matchparen highlighting isn't there.
+Solution: Install a WinEnter autocommand. Also fixes that after
+ ":NoMatchParen" only the current window is updated. (Martin Toft)
+Files: runtime/doc/pi_paren.txt, runtime/plugin/matchparen.vim
+
+Patch 7.1.083 (after 7.1.081)
+Problem: Command line completion doesn't work with wildcards.
+Solution: Add vim_isfilec_or_wc() and use it. (Martin Toft)
+Files: src/charset.c, src/proto/charset.pro, src/ex_docmd.c
+
+Patch 7.1.084
+Problem: Using the "-nb" argument twice causes netbeans not to get
+ fileOpened events.
+Solution: Change "&" to "&&". (Xavier de Gaye)
+Files: src/ex_cmds.c
+
+Patch 7.1.085
+Problem: ":e fold.c" then ":sp fold.c" results in folds of original window
+ to disappear. (Akita Noek)
+Solution: Invoke foldUpdateAll() for all windows of the changed buffer.
+ (Martin Toft)
+Files: src/ex_cmds.c
+
+Patch 7.1.086
+Problem: Crash when using specific Python syntax highlighting. (Quirk)
+Solution: Check for a negative index, coming from a keyword match at the
+ start of a line from a saved state.
+Files: src/syntax.c
+
+Patch 7.1.087
+Problem: Reading past ":cscope find" command. Writing past end of a buffer.
+Solution: Check length of the argument before using the pattern. Use
+ vim_strncpy(). (Dominique Pelle)
+Files: if_cscope.c
+
+Patch 7.1.088 (extra)
+Problem: The coordinates used by ":winpos" differ from what getwinposx()
+ and getwinposy() return.
+Solution: Use MoveWindowStructure() instead of MoveWindow(). (Michael Henry)
+Files: src/gui_mac.c
+
+Patch 7.1.089
+Problem: ":let loaded_getscriptPlugin" doesn't clear to eol, result is
+ "#1in".
+Solution: Clear to the end of the screen after displaying the first variable
+ value.
+Files: src/eval.c
+
+Patch 7.1.090
+Problem: Compiler warning on Mac OS X 10.5.
+Solution: Don't redeclare sigaltstack(). (Hisashi T Fujinaka)
+Files: src/os_unix.c
+
+Patch 7.1.091 (extra)
+Problem: Win32: Can't embed Vim inside another application.
+Solution: Add the --windowid argument. (Nageshwar)
+Files: runtime/doc/gui_w32.txt, runtime/doc/starting.txt,
+ runtime/doc/vi_diff.txt, src/globals.h, src/gui_w32.c, src/main.c
+
+Patch 7.1.092 (extra, after 7.1.088)
+Problem: Wrong arguments for MoveWindowStructure().
+Solution: Remove "TRUE". (Michael Henry)
+Files: src/gui_mac.c
+
+Patch 7.1.093
+Problem: Reading past end of a screen line when determining cell width.
+ (Dominique Pelle)
+Solution: Add an argument to mb_off2cells() for the maximum offset.
+Files: src/globals.h, src/gui.c, src/mbyte.c, src/proto/mbyte.pro,
+ src/screen.c
+
+Patch 7.1.094
+Problem: When checking if syntax highlighting is present, looking in the
+ current buffer instead of the specified one.
+Solution: Use "buf" instead of "curbuf".
+Files: src/syntax.c
+
+Patch 7.1.095
+Problem: The FocusLost and FocusGained autocommands are triggered
+ asynchronously in the GUI. This may cause arbitrary problems.
+Solution: Put the focus event in the input buffer and handle it when ready
+ for it.
+Files: src/eval.c, src/getchar.c, src/gui.c, src/gui_gtk_x11.c,
+ src/keymap.h
+
+Patch 7.1.096
+Problem: Reading past end of a string when resizing Vim. (Dominique Pelle)
+Solution: Check the string pointer before getting the char it points to.
+Files: src/message.c
+
+Patch 7.1.097
+Problem: ":setlocal stl=%!1+1" does not work.
+Solution: Adjust check for pointer. (Politz)
+Files: src/option.c
+
+Patch 7.1.098
+Problem: ":call s:var()" doesn't work if "s:var" is a Funcref. (Andy Wokula)
+Solution: Before converting "s:" into a script ID, check if it is a Funcref.
+Files: src/eval.c
+
+Patch 7.1.099
+Problem: When the 'keymap' and 'paste' options have a non-default value,
+ ":mkexrc" and ":mksession" do not correctly set the options.
+Solution: Set the options with side effects before other options.
+Files: src/option.c
+
+Patch 7.1.100
+Problem: Win32: Executing cscope doesn't always work properly.
+Solution: Use another way to invoke cscope. (Mike Williams)
+Files: src/if_cscope.c, src/if_cscope.h, src/main.c,
+ src/proto/if_cscope.pro
+
+Patch 7.1.101
+Problem: Ruby: The Buffer.line= method does not work.
+Solution: Add the "self" argument to set_current_line(). (Jonathan Hankins)
+Files: src/if_ruby.c
+
+Patch 7.1.102
+Problem: Perl interface doesn't compile with new version of Perl.
+Solution: Add two variables to the dynamic library loading. (Suresh
+ Govindachar)
+Files: src/if_perl.xs
+
+Patch 7.1.103
+Problem: Using "dw" with the cursor past the end of the last line (using
+ CTRL-\ CTRL-O from Insert mode) deletes a character. (Tim Chase)
+Solution: Don't move the cursor back when the movement failed.
+Files: src/normal.c
+
+Patch 7.1.104 (after 7.1.095)
+Problem: When 'lazyredraw' is set a focus event causes redraw to be
+ postponed until a key is pressed.
+Solution: Instead of not returning from vgetc() when a focus event is
+ encountered return K_IGNORE. Add plain_vgetc() for when the
+ caller doesn't want to get K_IGNORE.
+Files: src/digraph.c, src/edit.c, src/ex_cmds.c, src/ex_getln.c,
+ src/getchar.c, src/normal.c, src/proto/getchar.pro, src/window.c
+
+Patch 7.1.105
+Problem: Internal error when using "0 ? {'a': 1} : {}". (A.Politz)
+Solution: When parsing a dictionary value without using the value, don't try
+ obtaining the key name.
+Files: src/eval.c
+
+Patch 7.1.106
+Problem: ":messages" doesn't quit listing on ":".
+Solution: Break the loop when "got_int" is set.
+Files: src/message.c
+
+Patch 7.1.107
+Problem: When doing a block selection and using "s" to change the text,
+ while triggering auto-indenting, causes the wrong text to be
+ repeated in other lines. (Adri Verhoef)
+Solution: Compute the change of indent and compensate for that.
+Files: src/ops.c
+
+Patch 7.1.108 (after 7.1.100)
+Problem: Win32: Compilation problems in Cscope code. (Jeff Lanzarotta)
+Solution: Use (long) instead of (intptr_t) when it's not defined.
+Files: src/if_cscope.c
+
+Patch 7.1.109
+Problem: GTK: when there are many tab pages, clicking on the arrow left of
+ the labels moves to the next tab page on the right. (Simeon Bird)
+Solution: Check the X coordinate of the click and pass -1 as value for the
+ left arrow.
+Files: src/gui_gtk_x11.c, src/term.c
+
+Patch 7.1.110 (after 7.1.102)
+Problem: Win32: Still compilation problems with Perl.
+Solution: Change the #ifdefs. (Suresh Govindachar)
+Files: src/if_perl.xs
+
+Patch 7.1.111
+Problem: When using ":vimgrep" with the "j" flag folds from another buffer
+ may be displayed. (A.Politz)
+Solution: When not jumping to another buffer update the folds.
+Files: src/quickfix.c
+
+Patch 7.1.112
+Problem: Using input() with a wrong argument may crash Vim. (A.Politz)
+Solution: Init the input() return value to NULL.
+Files: src/eval.c
+
+Patch 7.1.113
+Problem: Using map() to go over an empty list causes memory to be freed
+ twice. (A.Politz)
+Solution: Don't clear the typeval in restore_vimvar().
+Files: src/eval.c
+
+Patch 7.1.114
+Problem: Memory leak in getmatches().
+Solution: Don't increment the refcount twice.
+Files: src/eval.c
+
+Patch 7.1.115 (after 7.1.105)
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Init variable to NULL.
+Files: src/eval.c
+
+Patch 7.1.116
+Problem: Cannot display Unicode characters above 0x10000.
+Solution: Remove the replacement with a question mark when UNICODE16 is not
+ defined. (partly by Nicolas Weber)
+Files: src/screen.c
+
+Patch 7.1.117
+Problem: Can't check whether Vim was compiled with Gnome. (Tony Mechelynck)
+Solution: Add gui_gnome to the has() list.
+Files: src/eval.c
+
+Patch 7.1.118 (after 7.1.107)
+Problem: Compiler warning for Visual C compiler.
+Solution: Add typecast. (Mike Williams)
+Files: src/ops.c
+
+Patch 7.1.119
+Problem: Crash when 'cmdheight' set to very large value. (A.Politz)
+Solution: Limit 'cmdheight' to 'lines' minus one. Store right value of
+ 'cmdheight' when running out of room.
+Files: src/option.c, src/window.c
+
+Patch 7.1.120
+Problem: Can't properly check memory leaks while running tests.
+Solution: Add an argument to garbagecollect(). Delete functions and
+ variables in the test scripts.
+Files: runtime/doc/eval.txt src/eval.c, src/globals.h, src/main.c,
+ src/testdir/Makefile, src/testdir/test14.in,
+ src/testdir/test26.in, src/testdir/test34.in,
+ src/testdir/test45.in, src/testdir/test47.in,
+ src/testdir/test49.in, src/testdir/test55.in,
+ src/testdir/test56.in, src/testdir/test58.in,
+ src/testdir/test59.in, src/testdir/test60.in,
+ src/testdir/test60.vim, src/testdir/test62.in,
+ src/testdir/test63.in, src/testdir/test64.in,
+
+Patch 7.1.121
+Problem: Using ":cd %:h" when editing a file in the current directory
+ results in an error message for using an empty string.
+Solution: When "%:h" results in an empty string use ".".
+Files: src/eval.c
+
+Patch 7.1.122
+Problem: Mac: building Vim.app fails. Using wrong architecture.
+Solution: Use line continuation for the gui_bundle dependency. Detect the
+ system architecture with "uname -a".
+Files: src/main.aap
+
+Patch 7.1.123
+Problem: Win32: ":edit foo ~ foo" expands "~".
+Solution: Change the call to expand_env().
+Files: src/ex_docmd.c, src/misc1.c, src/proto/misc1.pro, src/option.c
+
+Patch 7.1.124 (extra)
+Problem: Mac: When dropping a file on Vim.app that is already in the buffer
+ list (from .viminfo) results in editing an empty, unnamed buffer.
+ (Axel Kielhorn) Also: warning for unused variable.
+Solution: Move to the buffer of the first argument. Delete unused variable.
+Files: src/gui_mac.c
+
+Patch 7.1.125
+Problem: The TermResponse autocommand event is not always triggered. (Aron
+ Griffis)
+Solution: When unblocking autocommands check if v:termresponse changed and
+ trigger the event then.
+Files: src/buffer.c, src/diff.c, src/ex_getln.c, src/fileio.c,
+ src/globals.h, src/misc2.c, src/proto/fileio.pro, src/window.c
+
+Patch 7.1.126 (extra)
+Problem: ":vimgrep */*" fails when a BufRead autocommand changes directory.
+ (Bernhard Kuhn)
+Solution: Change back to the original directory after loading a file.
+ Also: use shorten_fname1() to avoid duplicating code.
+Files: src/buffer.c, src/ex_docmd.c, src/fileio.c, src/gui_gtk.c,
+ src/gui_w48.c, src/proto/ex_docmd.pro, src/proto/fileio.pro,
+ src/quickfix.c
+
+Patch 7.1.127
+Problem: Memory leak when doing cmdline completion. (Dominique Pelle)
+Solution: Free "orig" argument of ExpandOne() when it's not used.
+Files: src/ex_getln.c
+
+Patch 7.1.128 (extra)
+Problem: Build problems with new version of Cygwin.
+Solution: Remove -D__IID_DEFINED__, like with MingW. (Guopeng Wen)
+Files: src/Make_cyg.mak
+
+Patch 7.1.129 (extra)
+Problem: Win32: Can't get the user name when it is longer than 15
+ characters.
+Solution: Use UNLEN instead of MAX_COMPUTERNAME_LENGTH. (Alexei Alexandrov)
+Files: src/os_win32.c
+
+Patch 7.1.130
+Problem: Crash with specific order of undo and redo. (A.Politz)
+Solution: Clear and adjust pointers properly. Add u_check() for debugging.
+Files: src/undo.c, src/structs.h
+
+Patch 7.1.131
+Problem: ":mksession" always adds ":setlocal autoread". (Christian J.
+ Robinson)
+Solution: Skip boolean global/local option using global value.
+Files: src/option.c
+
+Patch 7.1.132
+Problem: getpos("'>") may return a negative column number for a Linewise
+ selection. (A.Politz)
+Solution: Don't add one to MAXCOL.
+Files: src/eval.c
+
+Patch 7.1.133 (after 7.1.126)
+Problem: shorten_fname1() linked when it's not needed.
+Solution: Add #ifdef.
+Files: src/fileio.c
+
+Patch 7.1.134 (extra)
+Problem: Win32: Can't build with VC8
+Solution: Detect the MSVC version instead of using NMAKE_VER.
+ (Mike Williams)
+Files: src/Make_mvc.mak
+
+Patch 7.1.135
+Problem: Win32: When editing a file c:\tmp\foo and c:\tmp\\foo we have two
+ buffers for the same file. (Suresh Govindachar)
+Solution: Invoke FullName_save() when a path contains "//" or "\\".
+Files: src/buffer.c
+
+Patch 7.1.136
+Problem: Memory leak when using Ruby syntax highlighting. (Dominique Pelle)
+Solution: Free the contained-in list.
+Files: src/syntax.c
+
+Patch 7.1.137
+Problem: Build failure when using EXITFREE. (Dominique Pelle)
+Solution: Add an #ifdef around using clip_exclude_prog.
+Files: src/misc2.c
+
+Patch 7.1.138
+Problem: The Perl Msg() function doesn't stop when "q" is typed at the more
+ prompt. (Hari Krishna Dara)
+Solution: Check got_int.
+Files: src/if_perl.xs
+
+Patch 7.1.139
+Problem: When using marker folding and ending Insert mode with CTRL-C the
+ current fold is truncated. (Fred Kater)
+Solution: Ignore got_int while updating folds.
+Files: src/fold.c
+
+Patch 7.1.140
+Problem: v:count is set only after typing a non-digit, that makes it
+ difficult to make a nice mapping.
+Solution: Set v:count while still typing the count.
+Files: src/normal.c
+
+Patch 7.1.141
+Problem: GTK: -geom argument doesn't support a negative offset.
+Solution: Compute position from the right/lower corner.
+Files: src/gui_gtk_x11.c
+
+Patch 7.1.142
+Problem: ":redir @A>" doesn't work.
+Solution: Ignore the extra ">" also when appending. (James Vega)
+Files: src/ex_docmd.c
+
+Patch 7.1.143
+Problem: Uninitialized memory read when diffing three files. (Dominique
+ Pelle)
+Solution: Remove "+ !notset" so that we don't use fields that were not
+ computed.
+Files: src/diff.c
+
+Patch 7.1.144
+Problem: After ":diffup" cursor can be in the wrong position.
+Solution: Force recomputing the cursor position.
+Files: src/diff.c
+
+Patch 7.1.145
+Problem: Insert mode completion: When using the popup menu, after
+ completing a word and typing a non-word character Vim is still
+ completing the same word, following CTRL-N doesn't work.
+ Insert mode Completion: When using CTRL-X O and there is only
+ "struct." before the cursor, typing one char to reduce the
+ matches, then BS completion stops.
+Solution: When typing a character that is not part of the item being
+ completed, stop complete mode. For whole line completion also
+ accept a space. For file name completion stop at a path
+ separator.
+ For omni completion stay in completion mode even if completing
+ with empty string.
+Files: src/edit.c
+
+Patch 7.1.146 (extra)
+Problem: VMS: Files with a very rare record organization (VFC) cannot be
+ properly written by Vim.
+ On older VAX systems mms runs into a syntax error.
+Solution: Check for this special situation. Do not wrap a comment, make it
+ one long line. (Zoltan Arpadffy)
+Files: src/fileio.c, src/Make_vms.mms
+
+Patch 7.1.147 (after 7.1.127)
+Problem: Freeing memory already freed when completing user name. (Meino
+ Cramer)
+Solution: Use a flag to remember if "orig" needs to be freed.
+Files: src/ex_getln.c
+
+Patch 7.1.148
+Problem: Some types are not found by configure.
+Solution: Test for the sys/types.h header file. (Sean Boudreau)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.1.149
+Problem: GTK GUI: When the completion popup menu is used scrolling another
+ window by the scrollbar is OK, but using the scroll wheel it
+ behaves line <Enter>.
+Solution: Ignore K_MOUSEDOWN and K_MOUSEUP. Fix redrawing the popup menu.
+Files: src/edit.c, src/gui.c
+
+Patch 7.1.150
+Problem: When 'clipboard' has "unnamed" using "p" in Visual mode doesn't
+ work correctly. (Jianrong Yu)
+Solution: When 'clipboard' has "unnamed" also obtain the selection when
+ getting the default register.
+Files: src/ops.c
+
+Patch 7.1.151
+Problem: Using whole line completion with 'ignorecase' and 'infercase' set
+ and the line is empty get an lalloc(0) error.
+Solution: Don't try changing case for an empty match. (Matthew Wozniski)
+Files: src/edit.c
+
+Patch 7.1.152
+Problem: Display problem when 'hls' and 'cursorcolumn' are set and
+ searching for "$". (John Mullin) Also when scrolling
+ horizontally when 'wrap' is off.
+Solution: Keep track of the column where highlighting was set. Check the
+ column offset when skipping characters.
+Files: src/screen.c
+
+Patch 7.1.153
+Problem: Compiler warnings on SGI. Undefined XpmAllocColor (Charles
+ Campbell)
+Solution: Add type casts. Init st_dev and st_ino separately. Don't use
+ type casts for vim_snprintf() when HAVE_STDARG_H is defined.
+ Define XpmAllocColor when needed.
+Files: src/eval.c, src/ex_cmds.c, src/fileio.c, src/misc2.c,
+ src/gui_xmebw.c
+
+Patch 7.1.154
+Problem: Compiler warning for signed/unsigned compare.
+Solution: Add type cast.
+Files: src/screen.c
+
+Patch 7.1.155
+Problem: Crash when 'undolevels' is 0 and repeating "udd". (James Vega)
+Solution: When there is only one branch use u_freeheader() to delete it.
+Files: src/undo.c
+
+Patch 7.1.156
+Problem: Overlapping arguments for strcpy() when expanding command line
+ variables.
+Solution: Use mch_memmove() instead of STRCPY(). Also fix a few typos.
+ (Dominique Pelle)
+Files: src/ex_docmd.c
+
+Patch 7.1.157
+Problem: In Ex mode, :" gives an error at end-of-file. (Michael Hordijk)
+Solution: Only give an error for an empty line, not for a comment.
+Files: src/ex_docmd.c
+
+Patch 7.1.158 (extra)
+Problem: Win32 console: When 'encoding' is "utf-8" and typing Alt-y the
+ result is wrong. Win32 GUI: Alt-y results in "u" when 'encoding'
+ is "cp1250" (Lukas Cerman)
+Solution: For utf-8 don't set the 7th bit in a byte, convert to the correct
+ byte sequence. For cp1250, when conversion to 'encoding' results
+ in the 7th bit not set, set the 7th bit after conversion.
+Files: src/os_win32.c, src/gui_w48.c
+
+Patch 7.1.159
+Problem: strcpy() has overlapping arguments.
+Solution: Use mch_memmove() instead. (Dominique Pelle)
+Files: src/ex_cmds.c
+
+Patch 7.1.160
+Problem: When a focus autocommand is defined, getting or losing focus
+ causes the hit-enter prompt to be redrawn. (Bjorn Winckler)
+Solution: Overwrite the last line.
+Files: src/message.c
+
+Patch 7.1.161
+Problem: Compilation errors with tiny features and EXITFREE.
+Solution: Add #ifdefs. (Dominique Pelle)
+Files: src/edit.c, src/misc2.c
+
+Patch 7.1.162
+Problem: Crash when using a modifier before "while" or "for". (A.Politz)
+Solution: Skip modifiers when checking for a loop command.
+Files: src/proto/ex_docmd.pro, src/ex_docmd.c, src/ex_eval.c
+
+Patch 7.1.163
+Problem: Warning for the unknown option 'bufsecret'.
+Solution: Remove the lines .vim that use this option. (Andy Wokula)
+Files: runtime/menu.vim
+
+Patch 7.1.164
+Problem: Reading past end of regexp pattern. (Dominique Pelle)
+Solution: Use utf_ptr2len().
+Files: src/regexp.c
+
+Patch 7.1.165
+Problem: Crash related to getting X window ID. (Dominique Pelle)
+Solution: Don't trust the window ID that we got in the past, check it every
+ time.
+Files: src/os_unix.c
+
+Patch 7.1.166
+Problem: Memory leak for using "gp" in Visual mode.
+Solution: Free memory in put_register(). (Dominique Pelle)
+Files: src/ops.c
+
+Patch 7.1.167
+Problem: Xxd crashes when using "xxd -b -c 110". (Debian bug 452789)
+Solution: Allocate more memory. Fix check for maximum number of columns.
+Files: src/xxd/xxd.c
+
+Patch 7.1.168 (extra)
+Problem: Win32 GUI: Since patch 7.1.095, when the Vim window does not have
+ focus, clicking in it doesn't position the cursor. (Juergen
+ Kraemer)
+Solution: Don't reset s_button_pending just after receiving focus.
+Files: src/gui_w48.c
+
+Patch 7.1.169
+Problem: Using uninitialized variable when system() fails. (Dominique
+ Pelle)
+Solution: Let system() return an empty string when it fails.
+Files: src/eval.c
+
+Patch 7.1.170
+Problem: Valgrind warning for overlapping arguments for strcpy().
+Solution: Use mch_memmove() instead. (Dominique Pelle)
+Files: src/getchar.c
+
+Patch 7.1.171
+Problem: Reading one byte before allocated memory.
+Solution: Check index not to become negative. (Dominique Pelle)
+Files: src/ex_getln.c
+
+Patch 7.1.172
+Problem: When 'buftype' is "acwrite" Vim still checks if the file or
+ directory exists before overwriting.
+Solution: Don't check for overwriting when the buffer name is not a file
+ name.
+Files: src/ex_cmds.c
+
+Patch 7.1.173
+Problem: Accessing freed memory. (Dominique Pelle)
+Solution: Don't call reg_getline() to check if a line is the first in the
+ file.
+Files: src/regexp.c
+
+Patch 7.1.174
+Problem: Writing NUL past end of a buffer.
+Solution: Copy one byte less when using strncat(). (Dominique Pelle)
+Files: src/ex_cmds.c, src/ex_docmd.c,
+
+Patch 7.1.175
+Problem: <BS> doesn't work with some combination of 'sts', 'linebreak' and
+ 'backspace'. (Francois Ingelrest)
+Solution: When adding white space results in not moving back delete one
+ character.
+Files: src/edit.c
+
+Patch 7.1.176
+Problem: Building with Aap fails when the "compiledby" argument contains
+ '<' or '>' characters. (Alex Yeh)
+Solution: Change how quoting is done in the Aap recipe.
+Files: src/main.aap
+
+Patch 7.1.177
+Problem: Freeing memory twice when in debug mode while reading a script.
+Solution: Ignore script input while in debug mode.
+Files: src/ex_cmds2.c, src/getchar.c, src/globals.h
+
+Patch 7.1.178
+Problem: "%" doesn't work on "/* comment *//* comment */".
+Solution: Don't handle the "//" in "*//*" as a C++ comment. (Markus
+ Heidelberg)
+Files: src/search.c
+
+Patch 7.1.179
+Problem: Need to check for TCL 8.5.
+Solution: Adjust configure script. (Alexey Froloff)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.1.180
+Problem: Regexp patterns not tested sufficiently.
+Solution: Add more checks to the regexp test.
+Files: src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.1.181
+Problem: Accessing uninitialized memory in Farsi mode. (Dominique Pelle)
+Solution: Only invoke lrF_sub() when there is something to do.
+Files: src/ex_cmds.c
+
+Patch 7.1.182
+Problem: When using tab pages and an argument list the session file may
+ contain wrong "next" commands. (Alexander Bluem)
+Solution: Use "argu" commands and only when needed.
+Files: src/ex_docmd.c
+
+Patch 7.1.183
+Problem: "Internal error" for ":echo matchstr('a', 'a\%[\&]')" (Mitanu
+ Paul)
+Solution: Inside "\%[]" detect \&, \| and \) as an error.
+Files: src/regexp.c
+
+Patch 7.1.184
+Problem: Crash when deleting backwards over a line break in Insert mode.
+Solution: Don't advance the cursor when it's already on the NUL after a
+ line. (Matthew Wozniski)
+Files: src/normal.c
+
+Patch 7.1.185
+Problem: Using "gR" with a multibyte encoding and typing a CR pushes
+ characters onto the replace stack incorrectly, resulting in BS
+ putting back the wrong characters. (Paul B. Mahol)
+Solution: Push multibyte characters onto the replace stack in reverse byte
+ order. Add replace_push_mb().
+Files: src/edit.c, src/misc1.c, src/proto/edit.pro
+
+Patch 7.1.186
+Problem: "expand('<afile>')" returns a bogus value after changing
+ directory. (Dave Fishburn)
+Solution: Copy "autocmd_fname" to allocated memory and expand to full
+ filename. Shorten the path when expanding <afile>.
+Files: src/ex_docmd.c, src/fileio.c
+
+Patch 7.1.187
+Problem: Win32 GUI: Custom completion using system() no longer works
+ after patch 7.1.104. (Erik Falor)
+Solution: Loop when safe_vgetc() returns K_IGNORE.
+Files: src/ex_getln.c
+
+Patch 7.1.188
+Problem: When 'showmode' is off the message for changing a readonly file is
+ given in the second column instead of the first. (Payl B. Mahol)
+Solution: Put the W10 message in the first column.
+Files: src/edit.c
+
+Patch 7.1.189 (after 7.1.104)
+Problem: Patch 7.1.104 was incomplete.
+Solution: Also call plain_vgetc() in ask_yesno().
+Files: src/misc1.c
+
+Patch 7.1.190
+Problem: Cursor after end-of-line: "iA sentence.<Esc>)"
+Solution: Move cursor back and make motion inclusive.
+Files: src/normal.c
+
+Patch 7.1.191
+Problem: Win32 GUI: after patch 7.1.168 there is still a problem when
+ clicking in a scrollbar. (Juergen Jottkaerr)
+Solution: Don't check the input buffer when dragging the scrollbar.
+Files: src/gui.c
+
+Patch 7.1.192
+Problem: With Visual block selection, "s" and typing something, CTRL-C
+ doesn't stop Vim from repeating the replacement in other lines,
+ like happens for "I".
+Solution: Check for "got_int" to be set.
+Files: src/ops.c
+
+Patch 7.1.193
+Problem: Some Vim 5.x digraphs are missing in Vim 7, even though the
+ character pairs are not used. (Philippe de Muyter)
+Solution: Add those Vim 5.x digraphs that don't conflict with others.
+Files: src/digraph.c
+
+Patch 7.1.194
+Problem: ":echo glob('~/{}')" results in /home/user//.
+Solution: Don't add a slash if there already is one.
+Files: src/os_unix.c
+
+Patch 7.1.195
+Problem: '0 mark doesn't work for "~/foo ~ foo".
+Solution: Don't expand the whole file name, only "~/".
+Files: src/mark.c
+
+Patch 7.1.196 (extra)
+Problem: Win32 GUI: "\n" in a tooltip doesn't cause a line break. (Erik
+ Falor)
+Solution: Use the TTM_SETMAXTIPWIDTH message.
+Files: src/gui_w32.c
+
+Patch 7.1.197
+Problem: Mac: "make install" doesn't work when prefix defined.
+Solution: Pass different arguments to "make installruntime". (Jjgod Jiang)
+Files: src/Makefile
+
+Patch 7.1.198
+Problem: Hang when using ":s/\n//gn". (Burak Gorkemli)
+Solution: Set "skip_match".
+Files: src/ex_cmds.c
+
+Patch 7.1.199
+Problem: Can't do command line completion for a specific file name
+ extension.
+Solution: When the pattern ends in "$" don't add a star for completion and
+ remove the "$" before matching with file names.
+Files: runtime/doc/cmdline.txt, src/ex_getln.c
+
+Patch 7.1.200 (after 7.1.177 and 7.1.182)
+Problem: Compiler warnings for uninitialized variables.
+Solution: Init variables.
+Files: src/ex_cmds2.c, src/ex_docmd.c
+
+Patch 7.1.201
+Problem: When reading stdin 'fenc' and 'ff' are not set.
+Solution: Set the options after reading stdin. (Ben Schmidt)
+Files: src/fileio.c
+
+Patch 7.1.202
+Problem: Incomplete utf-8 byte sequence is not checked for validity.
+Solution: Check the bytes that are present for being valid. (Ben Schmidt)
+Files: src/mbyte.c
+
+Patch 7.1.203
+Problem: When 'virtualedit' is "onemore" then "99|" works but ":normal 99|"
+ doesn't. (Andy Wokula)
+Solution: Check for "onemore" flag in check_cursor_col().
+Files: src/misc2.c
+
+Patch 7.1.204 (extra)
+Problem: Win32: Using the example at 'balloonexpr' the balloon disappears
+ after four seconds and then comes back again. Also moves the
+ mouse pointer a little bit. (Yongwei Wu)
+Solution: Set the autopop time to 30 seconds (the max value). (Sergey
+ Khorev) Move the mouse two pixels forward and one back to end up
+ in the same position (really!).
+Files: src/gui_w32.c
+
+Patch 7.1.205
+Problem: Can't get the operator in an ":omap".
+Solution: Add the "v:operator" variable. (Ben Schmidt)
+Files: runtime/doc/eval.txt, src/eval.c, src/normal.c, src/vim.h
+
+Patch 7.1.206
+Problem: Compiler warnings when using MODIFIED_BY.
+Solution: Add type casts. (Ben Schmidt)
+Files: src/version.c
+
+Patch 7.1.207
+Problem: Netbeans: "remove" cannot delete one line.
+Solution: Remove partial lines and whole lines properly. Avoid a memory
+ leak. (Xavier de Gaye)
+Files: src/netbeans.c
+
+Patch 7.1.208
+Problem: On Alpha get an unaligned access error.
+Solution: Store the dictitem pointer before using it. (Matthew Luckie)
+Files: src/eval.c
+
+Patch 7.1.209
+Problem: GTK: When using the netrw plugin and doing ":gui" Vim hangs.
+Solution: Stop getting a selection after three seconds. This is a hack.
+Files: src/gui_gtk_x11.c
+
+Patch 7.1.210
+Problem: Listing mapping for 0xdb fails when 'encoding' is utf-8. (Tony
+ Mechelynck)
+Solution: Recognize K_SPECIAL KS_EXTRA KE_CSI as a CSI byte.
+Files: src/mbyte.c
+
+Patch 7.1.211
+Problem: The matchparen plugin may take an unexpected amount of time, so
+ that it looks like Vim hangs.
+Solution: Add a timeout to searchpair(), searchpairpos(), search() and
+ searchpos(). Use half a second timeout in the plugin.
+Files: runtime/doc/eval.txt, runtime/plugin/matchparen.vim, src/edit.c,
+ src/eval.c, src/ex_cmds2.c, src/ex_docmd.c, src/normal.c,
+ src/proto/eval.pro, src/proto/ex_cmds2.pro, src/proto/search.pro,
+ src/search.c
+
+Patch 7.1.212
+Problem: Accessing a byte before a line.
+Solution: Check that the column is 1 or more. (Dominique Pelle)
+Files: src/edit.c
+
+Patch 7.1.213
+Problem: A ":tabedit" command that results in the "swap file exists" dialog
+ and selecting "abort" doesn't close the new tab. (Al Budden)
+Solution: Pass "old_curwin" to do_exedit().
+Files: src/ex_docmd.c
+
+Patch 7.1.214
+Problem: ":1s/g\n\zs1//" deletes characters from the first line. (A Politz)
+Solution: Start replacing in the line where the match starts.
+Files: src/ex_cmds.c
+
+Patch 7.1.215
+Problem: It is difficult to figure out what syntax items are nested at a
+ certain position.
+Solution: Add the synstack() function.
+Files: runtime/doc/eval.txt, src/eval.c, src/proto/syntax.pro,
+ src/syntax.c
+
+Patch 7.1.216
+Problem: Variants of --remote-tab are not mentioned for "vim --help".
+Solution: Display optional -wait and -silent.
+Files: src/main.c
+
+Patch 7.1.217
+Problem: The "help-tags" tag may be missing from runtime/doc/tags when it
+ was generated during "make install".
+Solution: Add the "++t" argument to ":helptags" to force adding the tag.
+Files: runtime/doc/Makefile, runtime/doc/various.txt, src/ex_cmds.c,
+ src/ex_cmds.h
+
+Patch 7.1.218
+Problem: A syntax region without a "keepend", containing a region with
+ "extend" could be truncated at the end of the containing region.
+Solution: Do not call syn_update_ends() when there are no keepend items.
+Files: src/syntax.c
+
+Patch 7.1.219 (after 7.1.215)
+Problem: synstack() returns situation after the current character, can't
+ see the state for a one-character region.
+Solution: Don't update ending states in the requested column.
+Files: runtime/doc/eval.txt, src/eval.c, src/hardcopy.c,
+ src/proto/syntax.pro, src/screen.c, src/spell.c, src/syntax.c
+
+Patch 7.1.220
+Problem: When a ")" or word movement command moves the cursor back from the
+ end of the line it may end up on the trail byte of a multibyte
+ character. It's also moved back when it isn't needed.
+Solution: Add the adjust_cursor() function.
+Files: src/normal.c
+
+Patch 7.1.221
+Problem: When inserting a "(", triggering the matchparen plugin, the
+ following highlighting may be messed up.
+Solution: Before triggering the CursorMovedI autocommands update the display
+ to update the stored syntax stacks for the change.
+Files: src/edit.c
+
+Patch 7.1.222 (after 7.1.217)
+Problem: Wildcards in argument of ":helptags" are not expanded. (Marcel
+ Svitalsky)
+Solution: Expand wildcards in the directory name.
+Files: src/ex_cmds.c
+
+Patch 7.1.223
+Problem: glob() doesn't work properly when 'shell' is "sh" or "bash" and
+ the expanded name contains spaces, '~', single quotes and other
+ special characters. (Adri Verhoef, Charles Campbell)
+Solution: For Posix shells define a vimglob() function to list the matches
+ instead of using "echo" directly.
+Files: src/os_unix.c
+
+Patch 7.1.224
+Problem: When using "vim -F -o file1 file2" only one window is
+ right-to-left. Same for "-H". (Ben Schmidt)
+Solution: use set_option_value() to set 'rightleft'.
+Files: src/main.c
+
+Patch 7.1.225
+Problem: Using uninitialized value when XGetWMNormalHints() fails.
+Solution: Check the return value. (Dominique Pelle)
+Files: src/os_unix.c
+
+Patch 7.1.226
+Problem: Command line completion doesn't work when a file name contains a
+ '&' character.
+Solution: Accept all characters in a file name, except ones that end a
+ command or white space.
+Files: src/ex_docmd.c
+
+Patch 7.1.227
+Problem: Hang in syntax HL when moving over a ")". (Dominique Pelle)
+Solution: Avoid storing a syntax state in the wrong position in the list of
+ remembered states.
+Files: src/syntax.c
+
+Patch 7.1.228
+Problem: When 'foldmethod' is "indent" and a fold is created with ">>" it
+ can't be closed with "zc". (Daniel Shahaf)
+Solution: Reset the "small" flag of a fold when adding a line to it.
+Files: src/fold.c
+
+Patch 7.1.229
+Problem: A fold is closed when it shouldn't when 'foldmethod' is "indent"
+ and backspacing a non-white character so that the indent increases.
+Solution: Keep the fold open after backspacing a character.
+Files: src/edit.c
+
+Patch 7.1.230
+Problem: Memory leak when executing SourceCmd autocommands.
+Solution: Free the memory. (Dominique Pelle)
+Files: src/ex_cmds2.c
+
+Patch 7.1.231
+Problem: When shifting lines the change is acted upon multiple times.
+Solution: Don't have shift_line() call changed_bytes.
+Files: src/edit.c, src/ops.c, src/proto/edit.pro, src/proto/ops.pro
+
+Patch 7.1.232 (after 7.1.207 and 7.1.211)
+Problem: Compiler warnings with MSVC.
+Solution: Add type casts. (Mike Williams)
+Files: src/ex_cmds2.c, src/netbeans.c
+
+Patch 7.1.233
+Problem: Crash when doing Insert mode completion for a user defined
+ command. (Yegappan Lakshmanan)
+Solution: Don't use the non-existing command line.
+Files: src/ex_getln.c
+
+Patch 7.1.234
+Problem: When diff'ing three files the third one isn't displayed correctly.
+ (Gary Johnson)
+Solution: Compute the size of diff blocks correctly when merging blocks.
+ Compute filler lines correctly when scrolling.
+Files: src/diff.c
+
+Patch 7.1.235
+Problem: Pattern matching is slow when using a lot of simple patterns.
+Solution: Avoid allocating memory by not freeing it when it's not so much.
+ (Alexei Alexandrov)
+Files: src/regexp.c
+
+Patch 7.1.236
+Problem: When using 'incsearch' and 'hlsearch' a complicated pattern may
+ make Vim hang until CTRL-C is pressed.
+Solution: Add the 'redrawtime' option.
+Files: runtime/doc/options.txt, src/ex_cmds.c, src/ex_docmd.c,
+ src/ex_getln.c, src/gui.c, src/misc1.c, src/normal.c,
+ src/option.c, src/quickfix.c, src/regexp.c, src/proto/regexp.pro,
+ src/proto/search.pro, src/search.c, src/screen.c,
+ src/option.h, src/spell.c, src/structs.h, src/syntax.c, src/tag.c,
+ src/vim.h
+
+Patch 7.1.237
+Problem: Compiler warning on an Alpha processor in Motif code.
+Solution: Change a typecast. (Adri Verhoef)
+Files: src/gui_motif.c
+
+Patch 7.1.238
+Problem: Using the 'c' flag with searchpair() may cause it to fail. Using
+ the 'r' flag doesn't work when 'wrapscan' is set. (A.Politz)
+Solution: Only use the 'c' flag for the first search, not for repeating.
+ When using 'r' imply 'W'. (Antony Scriven)
+Files: src/eval.c
+
+Patch 7.1.239 (after 7.1.233)
+Problem: Compiler warning for sprintf() argument.
+Solution: Add a typecast. (Nico Weber)
+Files: src/ex_getln.c
+
+Patch 7.1.240
+Problem: When "gUe" turns a German sharp s into SS the operation stops
+ before the end of the word. Latin2 has the same sharp s but it's
+ not changed to SS there.
+Solution: Make sure all the characters are operated upon. Detect the sharp
+ s in latin2. Also fixes that changing case of a multibyte
+ character that changes the byte count doesn't always work.
+Files: src/ops.c
+
+Patch 7.1.241
+Problem: Focus change events not always ignored. (Erik Falor)
+Solution: Ignore K_IGNORE in Insert mode in a few more places.
+Files: src/edit.c
+
+Patch 7.1.242 (after 7.1.005)
+Problem: "cib" doesn't work properly on "(x)". (Tim Pope)
+Solution: Use ltoreq() instead of lt(). Also fix "ciT" on "<a>x</a>".
+Files: src/search.c
+
+Patch 7.1.243 (after 7.1.240)
+Problem: "U" doesn't work on all text in Visual mode. (Adri Verhoef)
+Solution: Loop over all the lines to be changed. Add tests for this.
+Files: src/ops.c, src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.1.244
+Problem: GUI may have part of the command line cut off.
+Solution: Don't round the number of lines up, always round down.
+ (Tony Houghton, Scott Dillard)
+Files: src/gui.c
+
+Patch 7.1.245
+Problem: Pressing CTRL-\ three times causes Vim to quit. (Ranganath Rao).
+ Also for f CTRL-\ CTRL-\.
+Solution: When going to cooked mode in mch_delay() set a flag to ignore
+ SIGQUIT.
+Files: src/os_unix.c
+
+Patch 7.1.246
+Problem: Configure hangs when the man pager is something strange. (lorien)
+Solution: Set MANPAGER and PAGER to "cat". (Micah Cowan)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.1.247
+Problem: When using Netbeans backspacing in Insert mode skips a character
+ now and then. (Ankit Jain)
+Solution: Avoid calling netbeans_removed(), it frees the line pointer.
+ (partly by Dominique Pelle).
+Files: src/misc1.c
+
+Patch 7.1.248
+Problem: Can't set the '" mark. Can't know if setpos() was successful.
+Solution: Allow setting the '" mark with setpos(). Have setpos() return a
+ value indicating success/failure.
+Files: runtime/doc/eval.txt, src/eval.c, src/mark.c
+
+Patch 7.1.249
+Problem: After "U" the cursor can be past end of line. (Adri Verhoef)
+Solution: Adjust the cursor position in u_undoline().
+Files: src/undo.c
+
+Patch 7.1.250
+Problem: ":setglobal fenc=anything" gives an error message in a buffer
+ where 'modifiable' is off. (Ben Schmidt)
+Solution: Don't give an error if 'modifiable' doesn't matter.
+Files: src/option.c
+
+Patch 7.1.251
+Problem: Using freed memory when spell checking enabled.
+Solution: Obtain the current line again after calling spell_move_to().
+ (Dominique Pelle)
+Files: src/screen.c
+
+Patch 7.1.252 (after 7.1.243)
+Problem: Test 39 fails when the environment has a utf-8 locale. (Dominique
+ Pelle)
+Solution: Force 'encoding' to be latin1.
+Files: src/testdir/test39.in
+
+Patch 7.1.253
+Problem: ":sort" doesn't work in a one line file. (Patrick Texier)
+Solution: Don't sort if there is only one line. (Dominique Pelle)
+Files: src/ex_cmds.c
+
+Patch 7.1.254
+Problem: Tests 49 and 55 fail when the locale is French.
+Solution: Using C messages for test 49. Filter the error message in test 55
+ such that it works when the number is halfway the message.
+Files: src/testdir/test49.in, src/testdir/test55.in
+
+Patch 7.1.255
+Problem: Vim doesn't support utf-32. (Yongwei Wu)
+Solution: Add aliases for utf-32, it's the same as ucs-4.
+Files: src/mbyte.c
+
+Patch 7.1.256
+Problem: findfile() also returns directories.
+Solution: Cleanup the code for finding files and directories in a list of
+ directories. Remove the ugly global ff_search_ctx.
+Files: src/eval.c, src/misc2.c, src/vim.h, src/tag.c
+
+Patch 7.1.257
+Problem: Configure can't always find the Tcl header files.
+Solution: Also look in /usr/local/include/tcl$tclver and
+ /usr/include/tcl$tclver (James Vega)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.1.258
+Problem: Crash when doing "d/\n/e" and 'virtualedit' is "all". (Andy Wokula)
+Solution: Avoid that the column becomes negative. Also fixes other problems
+ with the end of a pattern match is in column zero. (A.Politz)
+Files: src/search.c
+
+Patch 7.1.259
+Problem: Cursor is in the wrong position when 'rightleft' is set,
+ 'encoding' is "utf-8" and on an illegal byte. (Dominique Pelle)
+Solution: Only put the cursor in the first column when actually on a
+ double-wide character. (Yukihiro Nakadaira)
+Files: src/screen.c
+
+Patch 7.1.260
+Problem: Cursor positioning problem after ^@ wrapping halfway when
+ 'encoding' is utf-8.
+Solution: Only count a position for printable characters. (partly by
+ Yukihiro Nakadaira)
+Files: src/charset.c
+
+Patch 7.1.261
+Problem: When a 2 byte BOM is detected Vim uses UCS-2, which doesn't work
+ for UTF-16 text. (Tony Mechelynck)
+Solution: Default to UTF-16.
+Files: src/fileio.c, src/testdir/test42.ok
+
+Patch 7.1.262
+Problem: Can't get the process ID of Vim.
+Solution: Implement getpid().
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 7.1.263
+Problem: The filetype can consist of two dot separated names. This works
+ for syntax and ftplugin, but not for indent. (Brett Stahlman)
+Solution: Use split() and loop over each dot separated name.
+Files: runtime/indent.vim
+
+Patch 7.1.264
+Problem: Crash when indenting lines. (Dominique Pelle)
+Solution: Set the cursor column when changing the cursor line.
+Files: src/ops.c, src/misc1.c
+
+Patch 7.1.265
+Problem: When 'isfname' contains a space, cmdline completion can hang.
+ (James Vega)
+Solution: Reset the "len" variable.
+Files: src/ex_docmd.c
+
+Patch 7.1.266
+Problem: When the version string returned by the terminal contains
+ unexpected characters, it is used as typed input. (James Vega)
+Solution: Assume the escape sequence ends in a letter.
+Files: src/term.c
+
+Patch 7.1.267
+Problem: When changing folds cursor may be positioned in the wrong place.
+Solution: Call changed_window_setting_win() instead of
+ changed_window_setting().
+Files: src/fold.c
+
+Patch 7.1.268
+Problem: Always shows "+" at end of screen line with: ":set
+ listchars=eol:$,extends:+ nowrap list cursorline" (Gary Johnson)
+Solution: Check for lcs_eol_one instead of lcs_eol.
+Files: src/screen.c
+
+Patch 7.1.269
+Problem: The matchparen plugin has an arbitrary limit for the number of
+ lines to look for a match.
+Solution: Rely on the searchpair() timeout.
+Files: runtime/plugin/matchparen.vim
+
+Patch 7.1.270
+Problem: ":?foo?" matches in current line since patch 7.1.025. (A.Politz)
+Solution: Remove the SEARCH_START flag.
+Files: src/ex_docmd.c, src/search.c
+
+Patch 7.1.271
+Problem: In a Vim build without autocommands, checking a file that was
+ changed externally causes the current buffer to be changed
+ unexpectedly. (Karsten Hopp)
+Solution: Store "curbuf" instead of "buf".
+Files: src/fileio.c
+
+Patch 7.1.272
+Problem: The special buffer name [Location List] is not used for a buffer
+ displayed in another tab page.
+Solution: Use FOR_ALL_TAB_WINDOWS instead of FOR_ALL_WINDOWS. (Hiroaki
+ Nishihara)
+Files: src/buffer.c
+
+Patch 7.1.273
+Problem: When profiling on Linux Vim exits early. (Liu Yubao)
+Solution: When profiling don't exit on SIGPROF.
+Files: src/Makefile, src/os_unix.c
+
+Patch 7.1.274 (after 7.1.272)
+Problem: Compiler warning for optimized build.
+Solution: Init win to NULL.
+Files: src/buffer.c
+
+Patch 7.1.275 (extra)
+Problem: Mac: ATSUI and 'antialias' don't work properly together.
+Solution: Fix this and the input method. (Jjgod Jiang)
+Files: src/vim.h, src/gui_mac.c
+
+Patch 7.1.276
+Problem: "gw" uses 'formatexpr', even though the docs say it doesn't.
+Solution: Don't use 'formatexpr' for "gw".
+Files: src/vim.h, src/edit.c, src/ops.c, src/proto/ops.pro
+
+Patch 7.1.277
+Problem: Default for 'paragraphs' misses some items (Colin Watson)
+Solution: Add TP, HP, Pp, Lp and It to 'paragraphs'. (James Vega)
+Files: runtime/doc/options.txt, src/option.c
+
+Patch 7.1.278 (extra, after 7.1.275)
+Problem: Build failure when USE_CARBONKEYHANDLER is not defined.
+Solution: Remove #ifdef.
+Files: src/gui_mac.c
+
+Patch 7.1.279
+Problem: When using cscope temporary files are left behind.
+Solution: Send the quit command to cscope and give it two seconds to exit
+ nicely before killing it. (partly by Dominique Pelle)
+Files: src/if_cscope.c
+
+Patch 7.1.280 (after 7.1.275)
+Problem: Mac: build problems when not using multibyte feature. (Nicholas
+ Stallard)
+Solution: Don't define USE_IM_CONTROL when not using multibyte.
+Files: src/vim.h
+
+Patch 7.1.281 (after 7.1.279)
+Problem: sa.sa_mask is not initialized. Cscope may not exit.
+Solution: Use sigemptyset(). Use SIGKILL instead of SIGTERM. (Dominique
+ Pelle)
+Files: src/if_cscope.c
+
+Patch 7.1.282 (extra)
+Problem: Win64: Edit with Vim context menu isn't installed correctly.
+ Compiler warnings and a few other things.
+Solution: Add [ and ] to entry of class name. Use UINT_PTR instead of UINT.
+ And fixes for other things. (George V. Reilly)
+Files: src/GvimExt/Makefile, src/dosinst.c, src/if_ole.cpp, src/if_ole.h,
+ src/if_ole.idl, src/INSTALLpc.txt, src/Make_mvc.mak,
+ src/os_win32.c,
+
+Patch 7.1.283
+Problem: Non-extra part for 7.1.282.
+Solution: Various changes.
+Files: src/ex_docmd.c, src/globals.h, src/if_cscope.c, src/main.c,
+ src/mark.c, src/netbeans.c, src/popupmnu.c, src/vim.h,
+ src/window.c
+
+Patch 7.1.284
+Problem: Compiler warnings for functions without prototype.
+Solution: Add the function prototypes. (Patrick Texier)
+Files: src/eval.c, src/quickfix.c
+
+Patch 7.1.285 (extra)
+Problem: Mac: dialog hotkeys don't work.
+Solution: Add hotkey support. (Dan Sandler)
+Files: src/gui_mac.c
+
+Patch 7.1.286 (after 7.1.103)
+Problem: "w" at the end of the buffer moves the cursor past the end of the
+ line. (Markus Heidelberg)
+Solution: Move the cursor back from the NUL when it was moved forward.
+Files: src/normal.c
+
+Patch 7.1.287
+Problem: Crash when reversing a list after using it. (Andy Wokula)
+Solution: Update the pointer to the last used element. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.1.288 (after 7.1.281)
+Problem: Cscope still leaves behind temp files when using gvim.
+Solution: When getting the ECHILD error loop for a while until cscope exits.
+ (Dominique Pelle)
+Files: if_cscope.c
+
+Patch 7.1.289
+Problem: When EXITFREE is defined and 'acd' is set freed memory is used.
+ (Dominique Pelle)
+Solution: Reset p_acd before freeing all buffers.
+Files: src/misc2.c
+
+Patch 7.1.290
+Problem: Reading bytes that were not written when spell checking and a line
+ has a very large indent.
+Solution: Don't copy the start of the next line when it only contains
+ spaces. (Dominique Pelle)
+Files: src/spell.c
+
+Patch 7.1.291 (after 7.1.288)
+Problem: Compiler warning.
+Solution: Change 50 to 50L.
+Files: src/if_cscope.c
+
+Patch 7.1.292
+Problem: When using a pattern with "\@<=" the submatches can be wrong.
+ (Brett Stahlman)
+Solution: Save the submatches when attempting a look-behind match.
+Files: src/regexp.c
+
+Patch 7.1.293
+Problem: Spell checking considers super- and subscript characters as word
+ characters.
+Solution: Recognize the Unicode super and subscript characters.
+Files: src/spell.c
+
+Patch 7.1.294
+Problem: Leaking memory when executing a shell command.
+Solution: Free memory when not able to save for undo. (Dominique Pelle)
+Files: src/ex_cmds.c
+
+Patch 7.1.295
+Problem: Vimtutor only works with vim, not gvim.
+Solution: Add the -g flag to vimtutor. (Dominique Pelle) Add gvimtutor.
+Files: src/Makefile, src/gvimtutor, src/vimtutor, runtime/doc/vimtutor.1
+
+Patch 7.1.296
+Problem: SELinux is not supported.
+Solution: Detect the selinux library and use mch_copy_sec(). (James Vega)
+Files: src/auto/configure, src/config.h.in, src/configure.in,
+ src/fileio.c, src/memfile.c, src/os_unix.c, src/proto/os_unix.pro
+
+Patch 7.1.297
+Problem: When using the search/replace dialog the parenmatch highlighting
+ can be wrong. (Tim Duncan)
+Solution: In the GUI redraw function invoke the CursorMoved autocmd.
+Files: src/gui.c
+
+Patch 7.1.298 (after 7.1.295)
+Problem: src/gvimtutor is not distributed.
+Solution: Add it to the list of distributed files.
+Files: Filelist
+
+Patch 7.1.299
+Problem: Filetype detection doesn't work properly for file names ending in
+ a part that is ignored and contain a space or other special
+ characters.
+Solution: Escape the special characters using the new fnameescape function.
+Files: runtime/doc/eval.txt, runtime/filetype.vim, src/eval.c,
+ src/ex_getln.c, src/proto/ex_getln.pro, src/vim.h
+
+Patch 7.1.300
+Problem: Value of asmsyntax argument isn't checked for valid characters.
+Solution: Only accepts letters and digits.
+Files: runtime/filetype.vim
+
+Patch 7.1.301
+Problem: When the "File/Save" menu is used in Insert mode, a tab page label
+ is not updated to remove the "+".
+Solution: Call draw_tabline() from showruler(). (Bjorn Winckler)
+Files: src/screen.c
+
+Patch 7.1.302 (after 7.1.299)
+Problem: Compilation error on MS-Windows.
+Solution: Don't use xp_shell when it's not defined.
+Files: src/ex_getln.c
+
+Patch 7.1.303 (after 7.1.302)
+Problem: Compilation error on MS-Windows, again.
+Solution: Declare p.
+Files: src/ex_getln.c
+
+Patch 7.1.304
+Problem: Shortpath_for_invalid_fname() does not work correctly and is
+ unnecessary complex.
+Solution: Clean up shortpath_for_invalid_fname(). (mostly by Yegappan
+ Lakshmanan)
+Files: src/eval.c
+
+Patch 7.1.305
+Problem: Editing a compressed file with special characters in the name
+ doesn't work properly.
+Solution: Escape special characters.
+Files: runtime/autoload/gzip.vim
+
+Patch 7.1.306
+Problem: Some Unicode characters are handled like word characters while
+ they are symbols.
+Solution: Adjust the table for Unicode classification.
+Files: src/mbyte.c
+
+Patch 7.1.307
+Problem: Many warnings when compiling with Python 2.5.
+Solution: Use ssize_t instead of int for some types. (James Vega)
+Files: src/if_python.c
+
+Patch 7.1.308
+Problem: When in readonly mode ":options" produces an error.
+Solution: Reset 'readonly'. (Gary Johnson)
+Files: runtime/optwin.vim
+
+Patch 7.1.309
+Problem: Installing and testing with a shadow directory doesn't work.
+ (James Vega)
+Solution: Add "po" to the list of directories to link. Also link the Vim
+ scripts in testdir. And a few more small fixes.
+Files: src/Makefile
+
+Patch 7.1.310
+Problem: Incomplete utf-8 byte sequence at end of the file is not detected.
+ Accessing memory that wasn't written.
+Solution: Check the last bytes in the buffer for being a valid utf-8
+ character. (mostly by Ben Schmidt)
+ Also fix that the reported line number of the error was wrong.
+Files: src/fileio.c
+
+Patch 7.1.311
+Problem: Compiler warning for missing sentinel in X code.
+Solution: Change 0 to NULL. (Markus Heidelberg)
+Files: src/mbyte.c
+
+Patch 7.1.312
+Problem: The .po files have mistakes in error numbers.
+Solution: Search for these mistakes in the check script. (Dominique Pelle)
+Files: src/po/check.vim
+
+Patch 7.1.313
+Problem: When the netbeans interface setModified call is used the status
+ lines and window title are not updated.
+Solution: Redraw the status lines and title. (Philippe Fremy)
+Files: src/netbeans.c
+
+Patch 7.1.314
+Problem: The value of 'pastetoggle' is written to the session file without
+ any escaping. (Randall Hansen)
+Solution: Use put_escstr(). (Ben Schmidt)
+Files: src/option.c
+
+Patch 7.1.315
+Problem: Crash with specific search pattern using look-behind match.
+ (Andreas Politz)
+Solution: Also save the value of "need_clear_subexpr".
+Files: src/regexp.c
+
+Patch 7.1.316
+Problem: When 'cscopetag' is set ":tag" gives an error message instead of
+ going to the next tag in the tag stack.
+Solution: Don't call do_cstag() when there is no argument. (Mark Goldman)
+Files: src/ex_docmd.c
+
+Patch 7.1.317
+Problem: Compiler warnings in Motif calls.
+Solution: Change zero to NULL. (Dominique Pelle)
+Files: src/gui_motif.c
+
+Patch 7.1.318
+Problem: Memory leak when closing xsmp connection. Crash on exit when
+ using Lesstif.
+Solution: Don't close the X display to work around a Lesstif bug. Free
+ clientid. Also fix a leak for Motif and Athena. (Dominique Pelle)
+Files: src/gui_x11.c, src/os_unix.c
+
+Patch 7.1.319
+Problem: When a register has an illegal utf-8 sequence, pasting it on the
+ command line causes an illegal memory access.
+Solution: Use mb_cptr2char_adv(). (Dominique Pelle)
+Files: src/ex_getln.c
+
+Patch 7.1.320 (extra)
+Problem: Win64: Warnings while compiling Python interface.
+Solution: Use PyInt in more places. Also update version message for the
+ console. (George Reilly)
+Files: src/if_python.c, src/version.c
+
+Patch 7.1.321 (extra)
+Problem: Win32 / Win64: Install file is outdated.
+Solution: Update the text for recent compiler. (George Reilly)
+Files: src/INSTALLpc.txt
+
+Patch 7.1.322
+Problem: Can't get start of Visual area in an <expr> mapping.
+Solution: Add the 'v' argument to getpos().
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.1.323
+Problem: Test 19 fails with some termcaps. (Dominique Pelle)
+Solution: Set the t_kb and t_kD termcap values.
+Files: src/testdir/test19.in, src/testdir/test38.in
+
+Patch 7.1.324
+Problem: File name path length on Unix is limited to 1024.
+Solution: Use PATH_MAX when it's more than 1000.
+Files: src/os_unix.h
+
+Patch 7.1.325
+Problem: When editing a command line that's longer than available space in
+ the window, the characters at the end are in reverse order.
+Solution: Increment the insert position even when the command line doesn't
+ fit. (Ingo Karkat)
+Files: src/ex_getln.c
+
+Patch 7.1.326
+Problem: ":s!from!to!" works, but ":smagic!from!to!" doesn't. It sees the
+ "!" as a flag to the command. Same for ":snomagic". (Johan Spetz)
+Solution: When checking for a forced command also ignore ":smagic" and
+ ":snomagic". (Ian Kelling)
+Files: src/ex_docmd.c
+
+Patch 7.1.327
+Problem: The GUI tutor is installed when there is no GUI version.
+Solution: Only install gvimtutor when building a GUI version.
+Files: src/Makefile
+
+Patch 7.1.328
+Problem: Crash when using Cygwin and non-posix path name in tags file.
+Solution: Use separate buffer for posix path. (Ben Schmidt)
+Files: src/os_unix.c
+
+Patch 7.1.329
+Problem: When the popup menu is removed a column of cells, the right half
+ of double-wide characters, may not be redrawn.
+Solution: Check if the right half of a character needs to be redrawn.
+ (Yukihiro Nakadaira)
+Files: src/screen.c
+
+Patch 7.1.330
+Problem: Reading uninitialized memory when using Del in replace mode.
+Solution: Use utfc_ptr2len_len() instead of mb_ptr2len(). (Dominique Pelle)
+Files: src/misc1.c
+
+
+Warning for missing sentinel in gui_xmldlg.c. (Dominique Pelle)
+
+A search offset from the end of a match didn't work properly for multibyte
+characters. (Yukihiro Nakadaira)
+
+When displaying the value of 'key' don't show "*****" when the value is empty.
+(Ben Schmidt)
+
+Internal error when compiled with EXITFREE and using the nerd_tree plugin.
+Set last_msg_hist to NULL when history becomes empty. Call
+free_all_functions() after garbage collection. (Dominique Pelle)
+
+GTK with XIM: <S-Space> does not work. (Yukihiro Nakadaira)
+
+Some shells do not support "echo -n", which breaks glob(). Use "echo" instead
+of "echo -n $1; echo". (Gary Johnson)
+
+"echo 22,44" printed "22" on top of the command, the error messages caused
+the rest not to be cleared. Added the need_clr_eos flag.
+
+Netbeans events are handled while updating the screen, causing a crash.
+Change the moment when events are handled. Rename nb_parse_messages() to
+netbeans_parse_messages(). (Xavier de Gaye)
+
+Test 11 was broken after patch 7.1.186 on Win32 console. (Daniel Shahaf)
+Use shellescape() on the file name.
+
+IM was turned off in im_preedit_end_cb() for no good reason. (Takuhiro
+Nishioka)
+
+A corrupted spell file could cause Vim to use lots of memory. Better
+detection for running into the end of the file. (idea from James Vega)
+
+Mac: Included a patch to make it build with GTK. Moved language init to
+mac_lang_init() function. (Ben Schmidt)
+
+Problem with 'wildmenu' after ":lcd", up/down arrows don't work. (Erik Falor)
+
+Fix configure.in to avoid "implicitly declared" warnings when running
+configure.
+
+Fixed a memory leak when redefining a keymap. (Dominique Pelle)
+
+Setting 'pastetoggle' to "jj" didn't work.
+
+'ic' and 'smartcase' don't work properly when using \%V in a search pattern.
+(Kana Natsuno)
+
+Patch 7.2a.001
+Problem: On some systems X11/Xlib.h exists (from X11-dev package) but
+ X11/Intrinsic.h does not (in Xt-dev package). This breaks the
+ build. Also, on Solaris 9 sys/ptem.h isn't found.
+Solution: Have configure only accept X11 when X11/Intrinsic.h exists.
+ Check for sys/ptem.h while including sys/stream.h. (Vladimir
+ Marek)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.2a.002
+Problem: getbufvar(N, "") gets the dictionary of the current buffer instead
+ of buffer N.
+Solution: Set curbuf before calling find_var_in_ht(). (Kana Natsuno)
+Files: src/eval.c
+
+Patch 7.2a.003
+Problem: Leaking memory when using ":file name" and using access control
+ lists.
+Solution: Invoke mch_free_acl() in vim_rename(). (Dominique Pelle)
+Files: src/fileio.c
+
+Patch 7.2a.004
+Problem: Some systems can't get spell files by ftp.
+Solution: Use http when it looks like it's possible. (James Vega)
+Files: runtime/autoload/spellfile.vim
+
+Patch 7.2a.005
+Problem: A few error messages use confusing names. Misspelling.
+Solution: Change "dissallows" to "disallows". (Dominique Pelle) Change
+ "number" to "Number".
+Files: src/eval.c, src/fileio.c
+
+Patch 7.2a.006
+Problem: Reading past NUL in a string.
+Solution: Check for invalid utf-8 byte sequence. (Dominique Pelle)
+Files: src/charset.c
+
+Patch 7.2a.007
+Problem: ":let v = 1.2.3" was OK in Vim 7.1, now it gives an error.
+Solution: Don't look for a floating point number after the "." operator.
+Files: src/eval.c
+
+Patch 7.2a.008
+Problem: printf("%g", 1) doesn't work.
+Solution: Convert Number to Float when needed.
+Files: src/message.c
+
+Patch 7.2a.009
+Problem: cygwin_conv_to_posix_path() does not specify buffer size.
+Solution: Use new Cygwin function: cygwin_conv_path(). (Corinna Vinschen)
+Files: src/main.c, src/os_unix.c
+
+Patch 7.2a.010
+Problem: When a file name has an illegal byte sequence Vim may read
+ uninitialised memory.
+Solution: Don't use UTF_COMPOSINGLIKE() on an illegal byte. In
+ msg_outtrans_len_attr() use char2cells() instead of ptr2cells().
+ In utf_ptr2char() don't check second byte when first byte is
+ illegal. (Dominique Pelle)
+Files: src/mbyte.c, src/message.c
+
+Patch 7.2a.011
+Problem: The Edit/Startup Settings menu doesn't work.
+Solution: Expand environment variables. (Ben Schmidt)
+Files: runtime/menu.vim
+
+Patch 7.2a.012
+Problem: Compiler warnings for casting int to pointer.
+Solution: Add cast to long in between. (Martin Toft)
+Files: src/gui_gtk_x11.c
+
+Patch 7.2a.013
+Problem: shellescape() does not escape "%" and "#" characters.
+Solution: Add find_cmdline_var() and use it when the second argument to
+ shellescape() is non-zero.
+Files: runtime/doc/eval.txt, src/eval.c, src/ex_docmd.c,
+ src/proto/ex_docmd.pro, src/proto/misc2.pro, src/misc2.c
+
+Patch 7.2a.014
+Problem: Problem with % in message.
+Solution: Put % in single quotes.
+Files: src/eval.c
+
+Patch 7.2a.015 (after 7.2a.010)
+Problem: Misaligned messages.
+Solution: Compute length of unprintable chars correctly.
+Files: src/message.c
+
+Patch 7.2a.016
+Problem: Using CTRL-W v in the quickfix window results in two quickfix
+ windows, which is not allowed. ":tab split" should be allowed to
+ open a new quickfix window in another tab.
+Solution: For CTRL-W v instead of splitting the window open a new one.
+ When using ":tab" do allow splitting the quickfix window (was
+ already included in patch 7.2a.013).
+Files: src/window.c
+
+Patch 7.2a.017
+Problem: ":doautoall" executes autocommands for all buffers instead of just
+ for loaded buffers.
+Solution: Change "curbuf" to "buf".
+Files: src/fileio.c
+
+Patch 7.2a.018
+Problem: Compiler warnings when compiling with Gnome. (Tony Mechelynck)
+Solution: Add type casts.
+Files: src/gui_gtk_x11.c
+
+Patch 7.2a.019
+Problem: ":let &g:tw = 44" sets the local option value. (Cyril Slobin)
+Solution: Use get_varp_scope() instead of get_varp(). (Ian Kelling)
+Files: src/option.c
+
+There is no way to avoid adding /usr/local/{include|lib} to the build
+commands. Add the --with-local-dir argument to configure. (Michael
+Haubenwallner)
+
+When using CTRL-D after ":help", the number of matches could be thousands.
+Restrict to TAG_MANY to avoid this taking too long. (Ian Kelling)
+
+The popup menu could be placed at a weird location. Caused by w_wcol computed
+by curs_columns(). (Dominique Pelle)
+
+Overlapping STRCPY() arguments when using %r item in 'errorformat'. Use
+STRMOVE() instead. (Ralf Wildenhues)
+
+Mac: On Leopard gvim, when using the mouse wheel nothing would happen until
+another event occurs, such as moving the mouse. Then the recorded scrolling
+would take place all at once. (Eckehard Berns)
+
+Solution for cursor color not reflecting IM status for GTK 2. Add
+preedit_is_active flag. (SungHyun Nam)
+
+filereadable() can hang on a FIFO on Linux. Use open() instead of fopen(),
+with O_NONBLOCK. (suggested by Lars Kotthoff)
+
+Included patch to support Perl 5.10. (Yasuhiro Matsumoto)
+
+When files are dropped on gvim while the screen is being updated, ignore the
+drop command to avoid freeing memory that is being used.
+
+In a terminal, when drawing the popup menu over double-wide characters, half
+characters may not be cleared properly. (Yukihiro Nakadaira)
+
+The #ifdef for including "vimio.h" was inconsistent. In a few files it
+depended on MSWIN, which isn't defined until later.
+
+Patch 7.2b.001
+Problem: Compilation problem: mb_fix_col() missing with multibyte feature
+ but without GUI or clipboard.
+Solution: Remove #ifdef.
+Files: src/mbyte.c
+
+Patch 7.2b.002
+Problem: Compiler warnings for signed/unsigned mismatch.
+Solution: Add type casts.
+Files: src/screen.c
+
+Patch 7.2b.003
+Problem: Still a compilation problem, check_col() and check_row() missing.
+Solution: Add FEAT_MBYTE to the #if.
+Files: src/ui.c
+
+Patch 7.2b.004
+Problem: Trying to free memory for a static string when using ":helpgrep".
+ (George Reilly)
+Solution: Set 'cpo' to empty_option instead of an empty string. Also for
+ searchpair() and substitute().
+Files: src/quickfix.c, src/eval.c
+
+Patch 7.2b.005
+Problem: The special character "!" isn't handled properly in shellescape().
+ (Jan Minar)
+Solution: Escape "!" when using a "csh" like shell and with
+ shellescape(s, 1). Twice for both. Also escape <NL>.
+Files: src/misc2.c
+
+Patch 7.2b.006
+Problem: Reading past end of string when reading info from tags line.
+Solution: Break the loop when encountering a NUL. (Dominique Pelle)
+Files: src/tag.c
+
+Patch 7.2b.007
+Problem: Part of a message cannot be translated.
+Solution: Put _() around the message.
+Files: src/search.c
+
+Patch 7.2b.008
+Problem: A few filetypes are not detected or not detected properly.
+Solution: Add filetype detection patterns. (Nikolai Weibull)
+Files: runtime/filetype.vim
+
+Patch 7.2b.009
+Problem: Reading past end of screen line. (Epicurus)
+Solution: Avoid going past the value of Columns.
+Files: src/screen.c
+
+Patch 7.2b.010
+Problem: ":mksession" doesn't work for ":map , foo", ":sunmap ,". (Ethan
+ Mallove)
+Solution: Check for "nxo", "nso" and other strange mapping combinations.
+Files: src/getchar.c
+
+Patch 7.2b.011
+Problem: Configure for TCL ends up with include file in compiler command.
+ (Richard Hogg)
+Solution: Delete items from $TCL_DEFS that do not start with a dash.
+Files: src/auto/configure, src/configure.in
+
+Patch 7.2b.012
+Problem: Build failure with +multi_byte but without +diff.
+Solution: Add #ifdef. (Patrick Texier)
+Files: src/main.c
+
+Patch 7.2b.013
+Problem: Build fails with tiny features and Perl. (Dominique Pelle)
+Solution: Define missing functions. Also when compiling Python.
+Files: src/if_perl.xs, src/if_python.c
+
+Patch 7.2b.014
+Problem: Configure uses an unsafe temp file to store commands.
+Solution: Create the temp file in local directory.
+Files: src/auto/configure, src/configure.in
+
+Patch 7.2b.015
+Problem: Build fails on Mac when using Aap.
+Solution: Fix typo in configure script.
+Files: src/auto/configure, src/configure.in
+
+Patch 7.2b.016
+Problem: Build fails with normal features but without +autocmd.
+Solution: Fix #ifdefs. (Ian Kelling)
+Files: src/eval.c, src/ex_cmds.c, src/quickfix.c, src/option.c,
+ src/ex_docmd.c
+
+Patch 7.2b.017
+Problem: "vim -O foo foo" results in only one window. (Zdenek Sekera)
+Solution: Handle result of ATTENTION prompt properly. (Ian Kelling)
+Files: src/main.c
+
+Patch 7.2b.018
+Problem: When doing command line completion on a file name for a csh-like
+ shell argument a '!' character isn't escaped properly.
+Solution: Add another backslash.
+Files: src/ex_getln.c, src/misc2.c, src/proto/misc2.pro, src/screen.c
+
+Patch 7.2b.019 (extra)
+Problem: Win32: Various compiler warnings.
+Solution: Use __w64 attribute. Comment-out unused parameters. Adjust a few
+ #ifdefs. (George Reilly)
+Files: src/gui_w48.c, src/GvimExt/gvimext.cpp, src/Make_mvc.mak,
+ src/os_mswin.c, src/os_win32.c, src/vim.h
+
+Patch 7.2b.020
+Problem: ":sort n" doesn't handle negative numbers. (James Vega)
+Solution: Include '-' in the number.
+Files: src/charset.c, src/ex_cmds.c
+
+Patch 7.2b.021
+Problem: Reloading doesn't read the BOM correctly. (Steve Gardner)
+Solution: Accept utf-8 BOM when specified file encoding is utf-8.
+Files: src/fileio.c
+
+Patch 7.2b.022
+Problem: When using ":normal" while updating the status line the count of
+ an operator is lost. (Dominique Pelle)
+Solution: Save and restore "opcount".
+Files: src/ex_docmd.c, src/globals.h, src/normal.c
+
+Patch 7.2b.023
+Problem: Crash when using the result of synstack(0,0). (Matt Wozniski)
+Solution: Check for v_list to be NULL in a few more places.
+Files: src/eval.c
+
+Patch 7.2b.024
+Problem: Using ":gui" while the netrw plugin is active causes a delay in
+ updating the display.
+Solution: Don't check for terminal codes when starting the GUI.
+Files: src/term.c
+
+Patch 7.2b.025
+Problem: When the CursorHold event triggers a pending count is lost.
+ (Juergen Kraemer)
+Solution: Save the counts and restore them.
+Files: src/normal.c, src/structs.h
+
+Patch 7.2b.026
+Problem: The GTK 2 file chooser causes the ~/.recently-used.xbel file to be
+ written over and over again. This may cause a significant
+ slowdown. (Guido Berhoerster)
+Solution: Don't use the GTK 2 file chooser.
+Files: src/gui_gtk.c
+
+Patch 7.2b.027
+Problem: Memory leak for Python, Perl, etc. script command with end marker.
+Solution: Free the memory of the end marker. (Andy Kittner)
+Files: src/ex_getln.c
+
+Patch 7.2b.028
+Problem: Reading uninitialized memory when doing ":gui -f". (Dominique
+ Pelle)
+Solution: Don't position the cursor when the screen size is invalid.
+Files: src/gui.c
+
+Patch 7.2b.029
+Problem: ":help a" doesn't jump to "a" tag in docs. (Tony Mechelynck)
+Solution: Get all tags and throw away more than TAG_MANY after sorting.
+ When there is no argument find matches for "help" to avoid a long
+ delay.
+Files: src/ex_cmds.c, src/ex_getln.c
+
+Patch 7.2b.030
+Problem: When changing the value of t_Co from 8 to 16 the Visual
+ highlighting keeps both reverse and a background color.
+Solution: Remove the attribute when setting the default highlight color.
+ (Markus Heidelberg)
+Files: src/syntax.c
+
+Error when cancelling completion menu and auto-formatting. (fixed by Ian
+Kelling)
+
+Patch 7.2c.001
+Problem: ":let x=[''] | let x += x" causes hang. (Matt Wozniski)
+Solution: Only insert elements up to the original length of the List.
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.2c.002
+Problem: fnameescape() doesn't handle a leading '+' or '>'. (Jan Minar)
+Solution: Escape a leading '+' and '>'. And a single '-'.
+Files: runtime/doc/eval.txt, src/ex_getln.c
+
+Patch 7.2c.003
+Problem: Searching for "foo\%[bar]\+" gives a "Corrupted regexp program"
+ error. (Joachim Hofmann)
+Solution: Mark the \%[] item as not being simple.
+Files: src/regexp.c
+
+On Vista access to system directories is virtualized. (Michael Mutschler)
+Adjusted the manifest file to avoid this. (George Reilly)
+
+Memory leak when using CTRL-C to cancel listing the jump list. (Dominique
+Pelle)
+
+Mac: Could not build with Perl interface.
+
+==============================================================================
+VERSION 7.3 *version-7.3* *version7.3*
+
+This section is about improvements made between version 7.2 and 7.3.
+
+This release has hundreds of bug fixes and there are a few new features. The
+most notable new features are:
+
+
+Persistent undo *new-persistent-undo*
+---------------
+
+Store undo information in a file. Can undo to before when the file was read,
+also for unloaded buffers. See |undo-persistence| (partly by Jordan Lewis)
+
+Added the ":earlier 1f" and ":later 1f" commands.
+Added file save counter to undo information.
+Added the |undotree()| and |undofile()| functions.
+
+Also added the 'undoreload' option. This makes it possible to save the
+current text when reloading the buffer, so that the reload can be undone.
+
+
+More encryption *new-more-encryption*
+---------------
+
+Support for Blowfish encryption. Added the 'cryptmethod' option.
+Mostly by Mohsin Ahmed.
+
+Also encrypt the text in the swap file and the undo file.
+
+
+Conceal text *new-conceal*
+------------
+
+Added the |+conceal| feature. (Vince Negri)
+This allows hiding stretches of text, based on syntax highlighting.
+It also allows replacing a stretch of text by a character |:syn-cchar|.
+The 'conceallevel' option specifies what happens with text matching a syntax
+item that has the conceal attribute.
+The 'concealcursor' option specifies what happens in the cursor line.
+
+The help files conceal characters used to mark tags and examples.
+
+Added the |synconcealed()| function and use it for :TOhtml. (Benjamin Fritz)
+
+Added the 'cursorbind' option, keeps the cursor in two windows with the same
+text in sync.
+
+
+Lua interface *new-lua*
+-------------
+
+Added the |Lua| interface. (Luis Carvalho)
+
+
+Python3 interface *new-python3*
+-----------------
+
+Added the Python3 interface. It exists next to Python 2.x, both can be used
+at the same time. See |python3| (Roland Puntaier)
+
+
+Changed *changed-7.3*
+-------
+
+The MS-Windows installer no longer requires the user to type anything in the
+console windows. The installer now also works on 64 bit systems, including
+the "Edit with Vim" context menu.
+The gvim executable is 32 bits, the installed gvimext.dll is either a 32 or 64
+bit version. (mostly by George Reilly)
+Made the DOS installer work with more compilers.
+The MS-Windows big gvim is now built with Python 2.7 and 3.1.2, Perl 5.12 and
+Ruby 1.9.1. You need the matching .dll files to use them.
+
+The extra and language files are no longer distributed separately.
+The source files for all systems are included in one distribution.
+
+After using ":recover" or recovering a file in another way, ":x" and "ZZ"
+didn't save what you see. This could result in work being lost. Now the text
+after recovery is compared to the original file contents. When they differ
+the buffer is marked as modified.
+
+When Vim is exiting because of a deadly signal, when v:dying is 2 or more,
+VimLeavePre, VimLeave, BufWinLeave and BufUnload autocommands are not
+executed.
+
+Removed support for GTK 1. It was no longer maintained and required a lot of
+#ifdefs in the source code. GTK 2 should be available for every system.
+(James Vega)
+
+It is no longer allowed to set the 'encoding' option from a modeline. It
+would corrupt the text. (Patrick Texier)
+
+Renamed runtime/spell/fixdup to runtime/spell/fixdup.vim.
+
+Removed obsolete Mac code.
+
+Updated spell files for Ubuntu locale names.
+
+Switched from autoconf 2.63 to 2.65.
+
+Removed Mupad indent and ftplugin files, they are not useful.
+
+The maximum number of messages remembered in the history is now 200 (was 100).
+
+
+Added *added-7.3*
+-----
+
+Added the 'relativenumber' option. (Markus Heidelberg)
+
+Added the 'colorcolumn' option: highlight one or more columns in a window.
+E.g. to highlight the column after 'textwidth'. (partly by Gregor Uhlenheuer)
+
+Added support for NetBeans in a terminal. Added |:nbstart| and |:nbclose|.
+(Xavier de Gaye)
+
+More floating point functions: |acos()|, |asin()|, |atan2()|, |cosh()|,
+|exp()|, |fmod()|, |log()|, |sinh()|, |tan()|, |tanh()|. (Bill McCarthy)
+
+Added the |gettabvar()| and |settabvar()| functions. (Yegappan Lakshmanan)
+
+Added the |strchars()|, |strwidth()| and |strdisplaywidth()| functions.
+
+Support GDK_SUPER_MASK for GTK on Mac. (Stephan Schulz)
+
+Made CTRL and ALT modifier work for mouse wheel. (Benjamin Haskell)
+
+Added support for horizontal scroll wheel. (Bjorn Winckler)
+
+When the buffer is in diff mode, have :TOhtml create HTML to show the diff
+side-by-side. (Christian Brabandt)
+
+Various improvements to ":TOhtml" and the 2html.vim script. (Benjamin Fritz)
+
+Add the 'L' item to 'cinoptions'. (Manuel Konig)
+
+Improve Javascript indenting. Add "J" flag to 'cinoptions'. (Hari Kumar G)
+
+Mac: Support disabling antialias. (LC Mi)
+
+Mac: Add clipboard support in the Mac console. (Bjorn Winckler)
+
+Make it possible to drag a tab page label to another position. (Paul B. Mahol)
+
+Better implementation of creating the Color Scheme menu. (Juergen Kraemer)
+
+In Visual mode with 'showcmd' display the number of bytes and characters.
+
+Allow synIDattr() getting GUI attributes when built without GUI. (Matt
+Wozniski)
+
+Support completion for ":find". Added test 73. (Nazri Ramliy)
+
+Command line completion for :ownsyntax and :setfiletype. (Dominique Pelle)
+
+Command line completion for :lmap and :lunmap.
+
+Support syntax and filetype completion for user commands. (Christian Brabandt)
+
+Avoid use of the GTK main_loop() so that the GtkFileChooser can be used.
+(James Vega)
+
+When 'formatexpr' evaluates to non-zero fall back to internal formatting, also
+for "gq". (James Vega)
+
+Support :browse for commands that use an error file argument. (Lech Lorens)
+
+Support wide file names in gvimext. (Szabolcs Horvat)
+
+Improve test for joining lines. (Milan Vancura)
+Make joining a range of lines much faster. (Milan Vancura)
+
+Add patch to improve support of z/OS (OS/390). (Ralf Schandl)
+
+Added the helphelp.txt file. Moved text from various.txt to it.
+
+Added "q" item for 'statusline'. Added |w:quickfix_title|. (Lech Lorens)
+
+Various improvements for VMS. (Zoltan Arpadffy)
+
+
+New syntax files: ~
+Haskell Cabal build file (Vincent Berthoux)
+ChaiScript (Jason Turner)
+Cucumber (Tim Pope)
+Datascript (Dominique Pelle)
+Fantom (Kamil Toman)
+Liquid (Tim Pope)
+Markdown (Tim Pope)
+wavefront's obj file (Vincent Berthoux)
+Perl 6 (Andy Lester)
+SDC - Synopsys Design Constraints (Maurizio Tranchero)
+SVG - Scalable Vector Graphics (Vincent Berthoux)
+task data (John Florian)
+task 42 edit (John Florian)
+
+New filetype plugins: ~
+Cucumber (Tim Pope)
+Liquid (Tim Pope)
+Logcheck (Debian)
+Markdown (Tim Pope)
+Perl 6 (Andy Lester)
+Quickfix window (Lech Lorens)
+Tcl (Robert L Hicks)
+
+New indent plugins: ~
+CUDA (Bram Moolenaar)
+ChaiScript (Jason Turner)
+Cucumber (Tim Pope)
+LifeLines (Patrick Texier)
+Liquid (Tim Pope)
+Mail (Bram Moolenaar)
+Perl 6 (Andy Lester)
+
+Other new runtime files: ~
+Breton spell file (Dominique Pelle)
+Dvorak keymap (Ashish Shukla)
+Korean translations. (SungHyun Nam)
+Python 3 completion (Aaron Griffin)
+Serbian menu translations (Aleksandar Jelenak)
+Tetum spell files
+Tutor Bairish (Sepp Hell)
+Tutor in Esperanto. (Dominique Pellé)
+Tutor in Portuguese.
+Norwegian Tutor now also available as tutor.nb
+
+Removed the Mupad runtime files, they were not maintained.
+
+
+Fixed *fixed-7.3*
+-----
+
+Patch 7.2.001
+Problem: Mac: pseudo-ttys don't work properly on Leopard, resulting in the
+ shell not to have a prompt, CTRL-C not working, etc.
+Solution: Don't use SVR4 compatible ptys, even though they are detected.
+ (Ben Schmidt)
+Files: src/pty.c
+
+Patch 7.2.002
+Problem: Leaking memory when displaying menus.
+Solution: Free allocated memory. (Dominique Pelle)
+Files: src/menu.c
+
+Patch 7.2.003
+Problem: Typo in translated message. Message not translated.
+Solution: Correct spelling. Add _(). (Dominique Pelle)
+Files: src/spell.c, src/version.c
+
+Patch 7.2.004
+Problem: Cscope help message is not translated.
+Solution: Put it in _(). (Dominique Pelle)
+Files: src/if_cscope.c, src/if_cscope.h
+
+Patch 7.2.005
+Problem: A few problems when profiling. Using flag pointer instead of flag
+ value. Allocating zero bytes. Not freeing used memory.
+Solution: Remove wrong '&' characters. Skip dumping when there is nothing
+ to dump. Free used memory. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.2.006
+Problem: HTML files are not recognized by contents.
+Solution: Add a rule to the scripts file. (Nico Weber)
+Files: runtime/scripts.vim
+
+Patch 7.2.007 (extra)
+Problem: Minor issues for VMS.
+Solution: Minor fixes for VMS. Add float support. (Zoltan Arpadffy)
+Files: runtime/doc/os_vms.txt, src/os_vms_conf.h, src/Make_vms.mms,
+ src/testdir/Make_vms.mms, src/testdir/test30.in,
+ src/testdir/test54.in
+
+Patch 7.2.008
+Problem: With a BufHidden autocommand that invokes ":bunload" the window
+ count for a buffer can be wrong. (Bob Hiestand)
+Solution: Don't call enter_buffer() when already in that buffer.
+Files: src/buffer.c
+
+Patch 7.2.009
+Problem: Can't compile with Perl 5.10 on MS-Windows. (Cesar Romani)
+Solution: Add the Perl_sv_free2 function for dynamic loading. (Dan Sharp)
+Files: src/if_perl.xs
+
+Patch 7.2.010
+Problem: When using "K" in Visual mode not all characters are properly
+ escaped. (Ben Schmidt)
+Solution: Use a function with the functionality of shellescape(). (Jan
+ Minar)
+Files: src/mbyte.c, src/misc2.c, src/normal.c
+
+Patch 7.2.011
+Problem: Get an error when inserting a float value from the expression
+ register.
+Solution: Convert the Float to a String automatically in the same place
+ where a List would be converted to a String.
+Files: src/eval.c
+
+Patch 7.2.012
+Problem: Compiler warnings when building with startup timing.
+Solution: Add type casts.
+Files: src/ex_cmds2.c
+
+Patch 7.2.013
+Problem: While waiting for the X selection Vim consumes a lot of CPU time
+ and hangs until a response is received.
+Solution: Sleep a bit when the selection event hasn't been received yet.
+ Time out after a couple of seconds to avoid a hang when the
+ selection owner isn't responding.
+Files: src/ui.c
+
+Patch 7.2.014
+Problem: synstack() doesn't work in an empty line.
+Solution: Accept column zero as a valid position.
+Files: src/eval.c
+
+Patch 7.2.015
+Problem: "make all test install" doesn't stop when the test fails. (Daniel
+ Shahaf)
+Solution: When test.log contains failures exit with non-zero status.
+Files: src/testdir/Makefile
+
+Patch 7.2.016
+Problem: The pattern being completed may be in freed memory when the
+ command line is being reallocated. (Dominique Pelle)
+Solution: Keep a pointer to the expand_T in the command line structure.
+ Don't use <S-Tab> as CTRL-P when there are no results. Clear the
+ completion when using a command line from the history.
+Files: src/ex_getln.c
+
+Patch 7.2.017
+Problem: strlen() used on text that may not end in a NUL. (Dominique Pelle)
+ Pasting a very big selection doesn't work.
+Solution: Use the length passed to the XtSelectionCallbackProc() function.
+ After getting the SelectionNotify event continue dispatching
+ events until the callback is actually called. Also dispatch the
+ PropertyNotify event.
+Files: src/ui.c
+
+Patch 7.2.018
+Problem: Memory leak when substitute is aborted.
+Solution: Free the buffer allocated for the new text. (Dominique Pelle)
+Files: src/ex_cmds.c
+
+Patch 7.2.019
+Problem: Completion of ":noautocmd" doesn't work and exists(":noautocmd")
+ returns zero. (Ben Fritz)
+Solution: Add "noautocmd" to the list of modifiers and commands.
+Files: src/ex_cmds.h, src/ex_docmd.c
+
+Patch 7.2.020
+Problem: Starting the GUI when the executable starts with 'k', but the KDE
+ version no longer exists.
+Solution: Don't have "kvim" start the GUI.
+Files: src/main.c
+
+Patch 7.2.021
+Problem: When executing autocommands getting the full file name may be
+ slow. (David Kotchan)
+Solution: Postpone calling FullName_save() until autocmd_fname is used.
+Files: src/ex_docmd.c, src/fileio.c, src/globals.h
+
+Patch 7.2.022 (extra)
+Problem: Testing is not possible when compiling with MingW.
+Solution: Add a MingW specific test Makefile. (Bill McCarthy)
+Files: Filelist, src/testdir/Make_ming.mak
+
+Patch 7.2.023
+Problem: 'cursorcolumn' is in the wrong place in a closed fold when the
+ display is shifted left. (Gary Johnson)
+Solution: Subtract w_skipcol or w_leftcol when needed.
+Files: src/screen.c
+
+Patch 7.2.024
+Problem: It's possible to set 'history' to a negative value and that causes
+ an out-of-memory error.
+Solution: Check that 'history' has a positive value. (Doug Kearns)
+Files: src/option.c
+
+Patch 7.2.025
+Problem: When a CursorHold event invokes system() it is retriggered over
+ and over again.
+Solution: Don't reset did_cursorhold when getting K_IGNORE.
+Files: src/normal.c
+
+Patch 7.2.026 (after 7.2.010)
+Problem: "K" doesn't use the length of the identifier but uses the rest of
+ the line.
+Solution: Copy the desired number of characters first.
+Files: src/normal.c
+
+Patch 7.2.027
+Problem: Can use cscope commands in the sandbox.
+Solution: Disallow them, they might not be safe.
+Files: src/ex_cmds.h
+
+Patch 7.2.028
+Problem: Confusing error message for missing ().
+Solution: Change "braces" to "parentheses". (Gary Johnson)
+Files: src/eval.c
+
+Patch 7.2.029
+Problem: No completion for ":doautoall".
+Solution: Complete ":doautoall" like ":doautocmd". (Doug Kearns)
+Files: src/ex_docmd.c
+
+Patch 7.2.030 (after 7.2.027)
+Problem: Can't compile.
+Solution: Remove prematurely added ex_oldfiles.
+Files: src/ex_cmds.h
+
+Patch 7.2.031
+Problem: Information in the viminfo file about previously edited files is
+ not available to the user. There is no way to get a complete list
+ of files edited in previous Vim sessions.
+Solution: Add v:oldfiles and fill it with the list of old file names when
+ first reading the viminfo file. Add the ":oldfiles" command,
+ ":browse oldfiles" and the "#<123" special file name. Increase
+ the default value for 'viminfo' from '20 to '100.
+Files: runtime/doc/cmdline.txt, runtime/doc/eval.txt,
+ runtime/doc/starting.txt, runtime/doc/usr_21.txt, src/eval.c,
+ src/ex_cmds.c, src/ex_cmds.h, src/ex_docmd.c, src/feature.h,
+ src/fileio.c, src/main.c, src/mark.c, src/misc1.c,
+ src/proto/eval.pro, src/proto/ex_cmds.pro, src/proto/mark.pro,
+ src/option.c, src/structs.h, src/vim.h
+
+Patch 7.2.032 (after 7.2.031)
+Problem: Can't build with EXITFREE defined. (Dominique Pelle)
+Solution: Change vv_string to vv_str.
+Files: src/eval.c
+
+Patch 7.2.033
+Problem: When detecting a little endian BOM "ucs-2le" is used, but the text
+ might be "utf-16le".
+Solution: Default to "utf-16le", it also works for "ucs-2le". (Jia Yanwei)
+Files: src/fileio.c, src/testdir/test42.ok
+
+Patch 7.2.034
+Problem: Memory leak in spell info when deleting buffer.
+Solution: Free the memory. (Dominique Pelle)
+Files: src/buffer.c
+
+Patch 7.2.035
+Problem: Mismatches between alloc/malloc, free/vim_free,
+ realloc/vim_realloc.
+Solution: Use the right function. (Dominique Pelle)
+Files: src/gui_x11.c, src/mbyte.c, src/misc2.c, src/os_unix.c
+
+Patch 7.2.036 (extra)
+Problem: Mismatches between alloc/malloc, free/vim_free,
+ realloc/vim_realloc.
+Solution: Use the right function. (Dominique Pelle)
+Files: src/gui_riscos.c, src/gui_w48.c, src/mbyte.c, src/os_vms.c,
+ src/os_w32exe.c, src/os_win16.c
+
+Patch 7.2.037
+Problem: Double free with GTK 1 and compiled with EXITFREE.
+Solution: Don't close display. (Dominique Pelle)
+Files: src/os_unix.c
+
+Patch 7.2.038
+Problem: Overlapping arguments to memcpy().
+Solution: Use mch_memmove(). (Dominique Pelle)
+Files: src/if_xcmdsrv.c
+
+Patch 7.2.039
+Problem: Accessing freed memory on exit when EXITFREE is defined.
+Solution: Call hash_init() on the v: hash table.
+Files: src/eval.c
+
+Patch 7.2.040
+Problem: When using ":e ++ff=dos fname" and the file contains a NL without
+ a CR before it and 'ffs' contains "unix" then the fileformat
+ becomes unix.
+Solution: Ignore 'ffs' when using the ++ff argument. (Ben Schmidt)
+ Also remove unreachable code.
+Files: src/fileio.c
+
+Patch 7.2.041
+Problem: In diff mode, when using two tabs, each with two diffed buffers,
+ editing a buffer of the other tab messes up the diff. (Matt
+ Mzyzik)
+Solution: Only copy options from a window where the buffer was edited that
+ doesn't have 'diff' set or is for the current tab page.
+ Also fix that window options for a buffer are stored with the
+ wrong window.
+Files: src/buffer.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/ex_getln.c, src/if_sniff.c, src/main.c, src/netbeans.c,
+ src/normal.c, src/popupmnu.c, src/proto/buffer.pro,
+ src/proto/ex_cmds.pro src/quickfix.c, src/window.c
+
+Patch 7.2.042
+Problem: When using winrestview() in a BufWinEnter autocommand the window
+ is scrolled anyway. (Matt Zyzik)
+Solution: Don't recompute topline when above 'scrolloff' from the bottom.
+ Don't always put the cursor halfway when entering a buffer. Add
+ "w_topline_was_set".
+Files: src/buffer.c, src/move.c, src/structs.h
+
+Patch 7.2.043
+Problem: VMS: Too many characters are escaped in filename and shell
+ commands.
+Solution: Escape fewer characters. (Zoltan Arpadffy)
+Files: src/vim.h
+
+Patch 7.2.044
+Problem: Crash because of STRCPY() being over protective of the destination
+ size. (Dominique Pelle)
+Solution: Add -D_FORTIFY_SOURCE=1 to CFLAGS. Use an intermediate variable
+ for the pointer to avoid a warning.
+Files: src/auto/configure, src/configure.in, src/eval.c
+
+Patch 7.2.045
+Problem: The Python interface has an empty entry in sys.path.
+Solution: Filter out the empty entry. (idea from James Vega)
+Files: src/if_python.c
+
+Patch 7.2.046
+Problem: Wrong check for filling buffer with encoding. (Danek Duvall)
+Solution: Remove pointers. (Dominique Pelle)
+Files: src/mbyte.c
+
+Patch 7.2.047
+Problem: Starting Vim with the -nb argument while it's not supported causes
+ the other side to hang.
+Solution: When -nb is used while it's not supported exit Vim. (Xavier de
+ Gaye)
+Files: src/main.c, src/vim.h
+
+Patch 7.2.048
+Problem: v:prevcount is changed too often. Counts are not multiplied when
+ setting v:count.
+Solution: Set v:prevcount properly. Multiply counts. (idea by Ben Schmidt)
+Files: src/eval.c, src/normal.c, src/proto/eval.pro
+
+Patch 7.2.049 (extra)
+Problem: Win32: the clipboard doesn't support UTF-16.
+Solution: Change UCS-2 support to UTF-16 support. (Jia Yanwei)
+Files: src/gui_w32.c, src/gui_w48.c, src/mbyte.c, src/misc1.c,
+ src/os_mswin.c, src/os_win32.c, src/proto/os_mswin.pro
+
+Patch 7.2.050
+Problem: Warnings for not checking return value of fwrite(). (Chip Campbell)
+Solution: Use the return value.
+Files: src/spell.c
+
+Patch 7.2.051
+Problem: Can't avoid 'wildignore' and 'suffixes' for glob() and globpath().
+Solution: Add an extra argument to these functions. (Ingo Karkat)
+Files: src/eval.c, src/ex_getln.c, src/proto/ex_getln.pro,
+ runtime/doc/eval.txt, runtime/doc/options.txt
+
+Patch 7.2.052
+Problem: synIDattr() doesn't support "sp" for special color.
+Solution: Recognize "sp" and "sp#". (Matt Wozniski)
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.2.053
+Problem: Crash when using WorkShop command ":ws foo". (Dominique Pelle)
+Solution: Avoid using a NULL pointer.
+Files: src/workshop.c
+
+Patch 7.2.054
+Problem: Compilation warnings for format in getchar.c.
+Solution: Use fputs() instead of fprintf(). (Dominique Pelle)
+Files: src/getchar.c
+
+Patch 7.2.055
+Problem: Various compiler warnings with strict checking.
+Solution: Avoid the warnings by using return values and renaming.
+Files: src/diff.c, src/eval.c, src/ex_cmds.c, src/ex_docmd.c,
+ src/fileio.c, src/fold.c, src/globals.h, src/gui.c,
+ src/gui_at_sb.c, src/gui_gtk_x11.c, src/gui_xmdlg.c,
+ src/gui_xmebw.c, src/main.c, src/mbyte.c, src/message.c,
+ src/netbeans.c, src/option.c, src/os_unix.c, src/spell.c,
+ src/ui.c, src/window.c
+
+Patch 7.2.056 (after 7.2.050)
+Problem: Tests 58 and 59 fail.
+Solution: Don't invoke fwrite() with a zero length. (Dominique Pelle)
+Files: src/spell.c
+
+Patch 7.2.057 (after 7.2.056)
+Problem: Combination of int and size_t may not work.
+Solution: Use size_t for variable.
+Files: src/spell.c
+
+Patch 7.2.058
+Problem: Can't add a patch name to the ":version" output.
+Solution: Add the extra_patches array.
+Files: src/version.c
+
+Patch 7.2.059
+Problem: Diff display is not always updated.
+Solution: Update the display more often.
+Files: src/diff.c
+
+Patch 7.2.060
+Problem: When a spell files has many compound rules it may take a very long
+ time making the list of suggestions. Displaying also can be slow
+ when there are misspelled words.
+ Can't parse some Hunspell .aff files.
+Solution: Check if a compounding can possibly work before trying a
+ combination, if the compound rules don't contain wildcards.
+ Implement using CHECKCOMPOUNDPATTERN.
+ Ignore COMPOUNDRULES. Ignore a comment after most items.
+ Accept ONLYINCOMPOUND as an alias for NEEDCOMPOUND.
+ Accept FORBIDDENWORD as an alias for BAD.
+Files: runtime/doc/spell.txt, src/spell.c
+
+Patch 7.2.061
+Problem: Can't create a funcref for an autoload function without loading
+ the script first. (Marc Weber)
+Solution: Accept autoload functions that don't exist yet in function().
+Files: src/eval.c
+
+Patch 7.2.062
+Problem: "[Scratch]" is not translated.
+Solution: Mark the string for translation. (Dominique Pelle)
+Files: src/buffer.c
+
+Patch 7.2.063
+Problem: Warning for NULL argument of Perl_sys_init3().
+Solution: Use Perl_sys_init() instead. (partly by Dominique Pelle)
+Files: src/if_perl.xs
+
+Patch 7.2.064
+Problem: Screen update bug when repeating "~" on a Visual block and the
+ last line doesn't change.
+Solution: Keep track of changes for all lines. (Moritz Orbach)
+Files: src/ops.c
+
+Patch 7.2.065
+Problem: GTK GUI: the cursor disappears when doing ":vsp" and the Vim
+ window is maximized. (Dominique Pelle, Denis Smolyar)
+Solution: Don't change "Columns" back to an old value at a wrong moment.
+ Do change "Rows" when it should not be a problem.
+Files: src/gui.c
+
+Patch 7.2.066
+Problem: It's not easy to see whether 'encoding' is a multibyte encoding.
+Solution: Add has('multi_byte_encoding').
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.2.067
+Problem: Session file can't load extra file when the path contains special
+ characters.
+Solution: Escape the file name. (Lech Lorens)
+Files: src/ex_docmd.c
+
+Patch 7.2.068
+Problem: Emacs tags file lines can be too long, resulting in an error
+ message. (James Vega)
+Solution: Ignore lines with errors if they are too long.
+Files: src/tag.c
+
+Patch 7.2.069 (after 7.2.060)
+Problem: Compiler warning for storing size_t in int.
+Solution: Add type cast.
+Files: src/spell.c
+
+Patch 7.2.070
+Problem: Crash when a function returns a:000. (Matt Wozniski)
+Solution: Don't put the function struct on the stack, allocate it. Free it
+ only when nothing in it is used.
+Files: src/eval.c
+
+Patch 7.2.071 (extra)
+Problem: Win32: Handling netbeans events while Vim is busy updating the
+ screen may cause a crash.
+Solution: Like with GTK, only handle netbeans messages in the main loop.
+ (Xavier de Gaye)
+Files: src/gui_w48.c, src/netbeans.c
+
+Patch 7.2.072 (extra)
+Problem: Compiler warning in Sniff code.
+Solution: Use return value of pipe(). (Dominique Pelle)
+Files: src/if_sniff.c
+
+Patch 7.2.073
+Problem: ":set <xHome>" has the same output as ":set <Home>". (Matt
+ Wozniski)
+Solution: Don't translate "x" keys to its alternative for ":set".
+Files: src/gui_mac.c, src/misc2.c, src/option.c, src/proto/misc2.pro
+
+Patch 7.2.074 (extra, after 7.2.073)
+Problem: ":set <xHome>" has the same output as ":set <Home>". (Matt
+ Wozniski)
+Solution: Don't translate "x" keys to its alternative for ":set".
+Files: src/gui_mac.c
+
+Patch 7.2.075 (after 7.2.058)
+Problem: Explanation about making a diff for extra_patches is unclear.
+Solution: Adjust comment.
+Files: src/version.c
+
+Patch 7.2.076
+Problem: rename(from, to) deletes the file if "from" and "to" are not equal
+ but still refer to the same file. E.g., on a FAT32 filesystem
+ under Unix.
+Solution: Go through another file name.
+Files: src/fileio.c
+
+Patch 7.2.077 (after 7.2.076)
+Problem: rename(from, to) doesn't work if "from" and "to" differ only in
+ case on a system that ignores case in file names.
+Solution: Go through another file name.
+Files: src/fileio.c
+
+Patch 7.2.078
+Problem: When deleting a fold that is specified with markers the cursor
+ position may be wrong. Folds may not be displayed properly after
+ a delete. Wrong fold may be deleted.
+Solution: Fix the problems. (mostly by Lech Lorens)
+Files: src/fold.c
+
+Patch 7.2.079
+Problem: "killed" netbeans events are not handled correctly.
+Solution: A "killed" netbeans event is sent when the buffer is deleted or
+ wiped out (in this case, the netbeans annotations in this buffer
+ have been removed). A user can still remove a sign with the
+ command ":sign unplace" and this does not trigger a "killed"
+ event. (Xavier de Gaye)
+Files: runtime/doc/netbeans.txt, src/buffer.c, src/globals.h,
+ src/netbeans.c, src/proto/netbeans.pro
+
+Patch 7.2.080
+Problem: When typing a composing character just after starting completion
+ may access memory before its allocation point. (Dominique Pelle)
+Solution: Don't delete before the completion start column. Add extra checks
+ for the offset not being negative.
+Files: src/edit.c
+
+Patch 7.2.081
+Problem: Compiler warning for floating point overflow on VAX.
+Solution: For VAX use a smaller number. (Zoltan Arpadffy)
+Files: src/message.c
+
+Patch 7.2.082
+Problem: When 'ff' is "mac" then "ga" on a ^J shows 0x0d instead of 0x0a.
+ (Andy Wokula)
+Solution: Use NL for this situation. (Lech Lorens)
+Files: src/ex_cmds.c
+
+Patch 7.2.083
+Problem: ":tag" does not return to the right tag entry from the tag stack.
+Solution: Don't change the current match when there is no argument.
+ (Erik Falor)
+Files: src/tag.c
+
+Patch 7.2.084
+Problem: Recursive structures are not handled properly in Python
+ vim.eval().
+Solution: Keep track of references in a better way. (Yukihiro Nakadaira)
+Files: src/if_python.c
+
+Patch 7.2.085
+Problem: ":set <M-b>=<Esc>b" does not work when 'encoding' is utf-8.
+Solution: Put the <M-b> character in the input buffer as valid utf-8.
+ (partly by Matt Wozniski)
+Files: src/term.c
+
+Patch 7.2.086
+Problem: Using ":diffget 1" in buffer 1 corrupts the text.
+Solution: Don't do anything when source and destination of ":diffget" or
+ ":diffput" is the same buffer. (Dominique Pelle)
+Files: src/diff.c
+
+Patch 7.2.087
+Problem: Adding URL to 'path' doesn't work to edit a file.
+Solution: Skip simplify_filename() for URLs. (Matt Wozniski)
+Files: src/misc2.c
+
+Patch 7.2.088 (extra)
+Problem: OpenClipboard() may fail when another application is using the
+ clipboard.
+Solution: Retry OpenClipboard() a few times. (Jianrong Yu)
+Files: src/os_mswin.c
+
+Patch 7.2.089 (extra)
+Problem: Win32: crash when using Ultramon buttons.
+Solution: Don't use a WM_OLE message of zero size. (Ray Megal)
+Files: src/if_ole.cpp, src/gui_w48.c
+
+Patch 7.2.090
+Problem: User command containing 0x80 in multibyte character does not work
+ properly. (Yasuhiro Matsumoto)
+Solution: Undo replacement of K_SPECIAL and CSI characters when executing
+ the command.
+Files: src/ex_docmd.c
+
+Patch 7.2.091
+Problem: ":cs help" output is not aligned for some languages.
+Solution: Compute character size instead of byte size. (Dominique Pelle)
+Files: src/if_cscope.c
+
+Patch 7.2.092
+Problem: Some error messages are not translated.
+Solution: Add _() around the messages. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.2.093 (extra)
+Problem: Win32: inputdialog() and find/replace dialogs can't handle
+ multibyte text.
+Solution: Use the wide version of dialog functions when available. (Yanwei
+ Jia)
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 7.2.094
+Problem: Compiler warning for signed/unsigned compare.
+Solution: Add type cast. Also fix a few typos.
+Files: src/edit.c
+
+Patch 7.2.095
+Problem: With Visual selection, "r" and then CTRL-C Visual mode is stopped
+ but the highlighting is not removed.
+Solution: Call reset_VIsual().
+Files: src/normal.c
+
+Patch 7.2.096
+Problem: After ":number" the "Press Enter" message may be on the wrong
+ screen, if switching screens for shell commands.
+Solution: Reset info_message. (James Vega)
+Files: src/ex_cmds.c
+
+Patch 7.2.097
+Problem: "!xterm&" doesn't work when 'shell' is "bash".
+Solution: Ignore SIGHUP after calling setsid(). (Simon Schubert)
+Files: src/os_unix.c
+
+Patch 7.2.098
+Problem: Warning for signed/unsigned pointer.
+Solution: Add type cast.
+Files: src/eval.c
+
+Patch 7.2.099
+Problem: Changing GUI options causes an unnecessary redraw when the GUI
+ isn't active.
+Solution: Avoid the redraw. (Lech Lorens)
+Files: src/option.c
+
+Patch 7.2.100
+Problem: When using ":source" on a FIFO or something else that can't rewind
+ the first three bytes are skipped.
+Solution: Instead of rewinding read the first line and detect a BOM in that.
+ (mostly by James Vega)
+Files: src/ex_cmds2.c
+
+Patch 7.2.101 (extra)
+Problem: MSVC version not recognized.
+Solution: Add the version number to the list. (Zhong Zhang)
+Files: src/Make_mvc.mak
+
+Patch 7.2.102 (after 7.2.100)
+Problem: When 'encoding' is "utf-8" a BOM at the start of a Vim script is
+ not removed. (Tony Mechelynck)
+Solution: When no conversion is taking place make a copy of the line without
+ the BOM.
+Files: src/ex_cmds2.c
+
+Patch 7.2.103
+Problem: When 'bomb' is changed the window title is updated to show/hide a
+ "+", but the tab page label isn't. (Patrick Texier)
+Solution: Set "redraw_tabline" in most places where "need_maketitle" is set.
+ (partly by Lech Lorens)
+Files: src/option.c
+
+Patch 7.2.104
+Problem: When using ":saveas bar.c" the tab label isn't updated right away.
+Solution: Set redraw_tabline. (Francois Ingelrest)
+Files: src/ex_cmds.c
+
+Patch 7.2.105
+Problem: Modeline setting for 'foldmethod' overrules diff options. (Ingo
+ Karkat)
+Solution: Don't set 'foldmethod' and 'wrap' from a modeline when 'diff' is
+ on.
+Files: src/option.c
+
+Patch 7.2.106
+Problem: Endless loop when using "]s" in HTML when there are no
+ misspellings. (Ingo Karkat)
+Solution: Break the search loop. Also fix pointer alignment for systems
+ with pointers larger than int.
+Files: src/spell.c
+
+Patch 7.2.107
+Problem: When using a GUI dialog and ":echo" commands the messages are
+ deleted after the dialog. (Vincent Birebent)
+Solution: Don't call msg_end_prompt() since there was no prompt.
+Files: src/message.c
+
+Patch 7.2.108 (after 7.2.105)
+Problem: Can't build without the diff feature.
+Solution: Add #ifdef.
+Files: src/option.c
+
+Patch 7.2.109
+Problem: 'langmap' does not work for multibyte characters.
+Solution: Add a list of mapped multibyte characters. (based on work by
+ Konstantin Korikov, Agathoklis Hatzimanikas)
+Files: runtime/doc/options.txt, src/edit.c, src/getchar.c, src/macros.h,
+ src/normal.c, src/option.c, src/proto/option.pro, src/window.c
+
+Patch 7.2.110
+Problem: Compiler warning for unused variable.
+Solution: Init the variable.
+Files: src/ex_docmd.c
+
+Patch 7.2.111
+Problem: When using Visual block mode with 'cursorcolumn' it's unclear what
+ is selected.
+Solution: Don't use 'cursorcolumn' highlighting inside the Visual selection.
+ (idea by Dominique Pelle)
+Files: src/screen.c
+
+Patch 7.2.112
+Problem: Cursor invisible in Visual mode when 'number' is set and cursor in
+ first column. (Matti Niemenmaa, Renato Alves)
+Solution: Check that vcol_prev is smaller than vcol.
+Files: src/screen.c
+
+Patch 7.2.113
+Problem: Crash for substitute() call using submatch(1) while there is no
+ such submatch. (Yukihiro Nakadaira)
+Solution: Also check the start of the submatch is set, it can be NULL when
+ an attempted match didn't work out.
+Files: src/regexp.c
+
+Patch 7.2.114
+Problem: Using wrong printf format.
+Solution: Use "%ld" instead of "%d". (Dominique Pelle)
+Files: src/netbeans.c
+
+Patch 7.2.115
+Problem: Some debugging code is never used.
+Solution: Remove nbtrace() and nbprt(). (Dominique Pelle)
+Files: src/nbdebug.c, src/nbdebug.h
+
+Patch 7.2.116
+Problem: Not all memory is freed when EXITFREE is defined.
+Solution: Free allocated memory on exit. (Dominique Pelle)
+Files: src/ex_docmd.c, src/gui_gtk_x11.c, src/misc2.c, src/search.c,
+ src/tag.c
+
+Patch 7.2.117
+Problem: Location list incorrectly labelled "Quickfix List".
+Solution: Break out of both loops for finding window for location list
+ buffer. (Lech Lorens)
+Files: src/buffer.c, src/quickfix.c, src/screen.c
+
+Patch 7.2.118
+Problem: <PageUp> at the more prompt only does half a page.
+Solution: Make <PageUp> go up a whole page. Also make 'f' go a page
+ forward, but not quit the more prompt. (Markus Heidelberg)
+Files: src/message.c
+
+Patch 7.2.119
+Problem: Status line is redrawn too often.
+Solution: Check ScreenLinesUC[] properly. (Yukihiro Nakadaira)
+Files: src/screen.c
+
+Patch 7.2.120
+Problem: When opening the quickfix window or splitting the window and
+ setting the location list, the location list is copied and then
+ deleted, which is inefficient.
+Solution: Don't copy the location list when not needed. (Lech Lorens)
+Files: src/quickfix.c, src/vim.h, src/window.c
+
+Patch 7.2.121
+Problem: In gvim "!grep a *.c" spews out a lot of text that can't be
+ stopped with CTRL-C.
+Solution: When looping to read and show text, do check for typed characters
+ every two seconds.
+Files: src/os_unix.c
+
+Patch 7.2.122
+Problem: Invalid memory access when the VimResized autocommand changes
+ 'columns' and/or 'lines'.
+Solution: After VimResized check for changed values. (Dominique Pelle)
+Files: src/screen.c
+
+Patch 7.2.123
+Problem: Typing 'q' at more prompt for ":map" output still displays another
+ line, causing another more prompt. (Markus Heidelberg)
+Solution: Quit listing maps when 'q' typed.
+Files: src/getchar.c
+
+Patch 7.2.124
+Problem: Typing 'q' at more prompt for ":tselect" output still displays
+ more lines, causing another more prompt. (Markus Heidelberg)
+Solution: Quit listing tags when 'q' typed.
+Files: src/tag.c
+
+Patch 7.2.125
+Problem: Leaking memory when reading XPM bitmap for a sign.
+Solution: Don't allocate the memory twice. (Dominique Pelle)
+Files: src/gui_x11.c
+
+Patch 7.2.126
+Problem: When EXITFREE is defined signs are not freed.
+Solution: Free all signs on exit. Also free keymaps. (Dominique Pelle)
+Files: src/misc2.c, src/ex_cmds.c, src/proto/ex_cmds.pro
+
+Patch 7.2.127
+Problem: When listing mappings and a wrapping line causes the more prompt,
+ after typing 'q' there can be another more prompt. (Markus
+ Heidelberg)
+Solution: Set "lines_left" to allow more lines to be displayed.
+Files: src/message.c
+
+Patch 7.2.128 (after 7.2.055)
+Problem: Using ":lcd" makes session files not work.
+Solution: Compare return value of mch_chdir() properly. (Andreas Bernauer)
+Files: src/ex_docmd.c
+
+Patch 7.2.129
+Problem: When opening a command window from input() it uses the search
+ history.
+Solution: Use get_cmdline_type(). (James Vega)
+Files: src/ex_getln.c
+
+Patch 7.2.130
+Problem: Vim may hang until CTRL-C is typed when using CTRL-Z.
+Solution: Avoid using pause(). Also use "volatile" for variables used in
+ signal functions. (Dominique Pelle)
+Files: src/auto/configure, src/configure.in, src/config.h.in,
+ src/globals.h, src/os_unix.c
+
+Patch 7.2.131
+Problem: When 'keymap' is cleared may still use the cursor highlighting for
+ when it's enabled.
+Solution: Reset 'iminsert' and 'imsearch'. (partly by Dominique Pelle)
+ Also avoid ":setlocal" for these options have a global effect.
+Files: src/option.c
+
+Patch 7.2.132
+Problem: When changing directory during a SwapExists autocmd freed memory
+ may be accessed. (Dominique Pelle)
+Solution: Add the allbuf_lock flag.
+Files: src/ex_getln.c, src/globals.h, src/fileio.c,
+ src/proto/ex_getln.pro
+
+Patch 7.2.133
+Problem: ":diffoff!" changes settings in windows not in diff mode.
+Solution: Only change settings in other windows when 'diff' is set, always
+ do it for the current window. (Lech Lorens)
+Files: src/diff.c
+
+Patch 7.2.134
+Problem: Warning for discarding "const" from pointer.
+Solution: Don't pass const pointer to mch_memmove().
+Files: src/fileio.c
+
+Patch 7.2.135
+Problem: Memory leak when redefining user command with complete argument.
+Solution: Free the old complete argument. (Dominique Pelle)
+Files: src/ex_docmd.c
+
+Patch 7.2.136 (after 7.2.132)
+Problem: ":cd" is still possible in a SwapExists autocmd.
+Solution: Check the allbuf_lock flag in ex_cd().
+Files: src/ex_docmd.c
+
+Patch 7.2.137
+Problem: When 'virtualedit' is set, a left shift of a blockwise selection
+ that starts and ends inside a tab shifts too much. (Helmut
+ Stiegler)
+Solution: Redo the block left shift code. (Lech Lorens)
+Files: src/ops.c, src/testdir/Makefile, src/testdir/test66.in,
+ src/testdir/test66.ok
+
+Patch 7.2.138 (extra part of 7.2.137)
+Problem: See 7.2.137.
+Solution: See 7.2.137.
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms
+
+Patch 7.2.139
+Problem: Crash when 'virtualedit' is "all". (James Vega)
+Solution: Avoid overflow when column is MAXCOL. (Dominique Pelle)
+Files: src/misc2.c
+
+Patch 7.2.140
+Problem: Diff highlighting isn't displayed before the Visual area if it
+ starts at the cursor position. (Markus Heidelberg)
+Solution: Also check fromcol_prev.
+Files: src/screen.c
+
+Patch 7.2.141
+Problem: When redrawing a character for bold spill this causes the next
+ character to be redrawn as well.
+Solution: Only redraw one extra character. (Yukihiro Nakadaira)
+Files: src/screen.c
+
+Patch 7.2.142
+Problem: Motif and Athena balloons don't use tooltip colors.
+Solution: Set the colors. (Matt Wozniski)
+Files: src/gui_beval.c
+
+Patch 7.2.143
+Problem: No command line completion for ":cscope" command.
+Solution: Add the completion for ":cscope". (Dominique Pelle)
+Files: src/ex_docmd.c, src/ex_getln.c, src/if_cscope.c,
+ src/proto/if_cscope.pro, src/vim.h
+
+Patch 7.2.144
+Problem: When 't_Co' is set to the value it already had the color scheme is
+ reloaded anyway.
+Solution: Only load the colorscheme when the t_Co value changes. (Dominique
+ Pelle)
+Files: src/option.c
+
+Patch 7.2.145
+Problem: White space in ":cscope find" is not ignored.
+Solution: Ignore the white space, but not when the leading white space is
+ useful for the argument.
+Files: runtime/doc/if_scop.txt, src/if_cscope.c
+
+Patch 7.2.146
+Problem: v:warningmsg isn't used for all warnings.
+Solution: Set v:warningmsg for relevant warnings. (Ingo Karkat)
+Files: src/fileio.c, src/misc1.c, src/option.c
+
+Patch 7.2.147
+Problem: When compiled as small version and 'number' is on the cursor is
+ displayed in the wrong position after a tab. (James Vega)
+Solution: Don't increment vcol when still displaying the line number.
+Files: src/screen.c
+
+Patch 7.2.148
+Problem: When searching for "$" while 'hlsearch' is set, highlighting the
+ character after the line does not work in the cursor column.
+ Also highlighting for Visual mode after the line end when this
+ isn't needed. (Markus Heidelberg)
+Solution: Only compare the cursor column in the cursor line. Only highlight
+ for Visual selection after the last character when it's needed to
+ see where the Visual selection ends.
+Files: src/screen.c
+
+Patch 7.2.149
+Problem: Using return value of function that doesn't return a value results
+ in reading uninitialized memory.
+Solution: Set the default to return zero. Make cursor() return -1 on
+ failure. Let complete() return an empty string in case of an
+ error. (partly by Dominique Pelle)
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.2.150 (extra)
+Problem: Can't use tab pages from VisVim.
+Solution: Add tab page support to VisVim. (Adam Slater)
+Files: src/VisVim/Commands.cpp, src/VisVim/Resource.h,
+ src/VisVim/VisVim.rc
+
+Patch 7.2.151
+Problem: ":hist a" doesn't work like ":hist all" as the docs suggest.
+Solution: Make ":hist a" and ":hist al" work. (Dominique Pelle)
+Files: src/ex_getln.c
+
+Patch 7.2.152
+Problem: When using "silent echo x" inside ":redir" a next echo may start
+ halfway the line. (Tony Mechelynck, Dennis Benzinger)
+Solution: Reset msg_col after redirecting silently.
+Files: src/ex_docmd.c, src/message.c, src/proto/message.pro
+
+Patch 7.2.153
+Problem: Memory leak for ":recover empty_dir/".
+Solution: Free files[] when it becomes empty. (Dominique Pelle)
+Files: src/memline.c
+
+Patch 7.2.154 (after 7.2.132)
+Problem: ":cd" is still possible in a SwapExists autocmd.
+Solution: Set allbuf_lock in do_swapexists().
+Files: src/memline.c
+
+Patch 7.2.155
+Problem: Memory leak in ":function /pat".
+Solution: Free the memory. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.2.156 (after 7.2.143)
+Problem: No completion for :scscope and :lcscope commands.
+Solution: Implement the completion. (Dominique Pelle)
+Files: src/if_cscope.c, src/ex_docmd.c, src/proto/if_cscope.pro
+
+Patch 7.2.157
+Problem: Illegal memory access when searching in path.
+Solution: Avoid looking at a byte after end of a string. (Dominique Pelle)
+Files: src/search.c
+
+Patch 7.2.158
+Problem: Warnings from VisualC compiler.
+Solution: Add type casts. (George Reilly)
+Files: src/ops.c
+
+Patch 7.2.159
+Problem: When $x_includes ends up being "NONE" configure fails.
+Solution: Check for $x_includes not to be "NONE" (Rainer)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.2.160
+Problem: Search pattern not freed on exit when 'rightleft' set.
+Solution: Free mr_pattern_alloced.
+Files: src/search.c
+
+Patch 7.2.161
+Problem: Folds messed up in other tab page. (Vlad Irnov)
+Solution: Instead of going over all windows in current tab page go over all
+ windows in all tab pages. Also free memory for location lists in
+ other tab pages when exiting. (Lech Lorens)
+Files: src/fileio.c, src/mark.c, src/misc1.c, src/misc2.c
+
+Patch 7.2.162
+Problem: The quickfix window may get wrong filetype.
+Solution: Do not detect the filetype for the quickfix window. (Lech Lorens)
+Files: src/quickfix.c
+
+Patch 7.2.163
+Problem: The command line window may get folding.
+Solution: Default to no/manual folding. (Lech Lorens)
+Files: src/ex_getln.c
+
+Patch 7.2.164
+Problem: When 'showbreak' is set the size of the Visual block may be
+ reported wrong. (Eduardo Daudt Flach)
+Solution: Temporarily make 'sbr' empty.
+Files: src/normal.c, src/ops.c
+
+Patch 7.2.165
+Problem: The argument for the FuncUndefined autocmd event is expanded like
+ a file name.
+Solution: Don't try expanding it. (Wang Xu)
+Files: src/fileio.c
+
+Patch 7.2.166
+Problem: No completion for ":sign" command.
+Solution: Add ":sign" completion. (Dominique Pelle)
+Files: src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c, src/vim.h,
+ src/proto/ex_cmds.pro
+
+Patch 7.2.167
+Problem: Splint doesn't work well for checking the code.
+Solution: Add splint arguments in the Makefile. Exclude some code from
+ splint that it can't handle. Tune splint arguments to give
+ reasonable errors. Add a filter for removing false warnings from
+ splint output. Many small changes to avoid warnings. More to
+ follow...
+Files: Filelist, src/Makefile, src/buffer.c, src/charset.c,
+ src/cleanlint.vim, src/digraph.c, src/edit.c, src/ex_cmds.c,
+ src/globals.h, src/ops.c, src/os_unix.c, src/os_unix.h,
+ src/proto/buffer.pro, src/proto/edit.pro, src/screen.c,
+ src/structs.h
+
+Patch 7.2.168
+Problem: When no ctags program can be found, "make tags" attempts to
+ execute the first C file.
+Solution: Default to "ctags" when no ctags program can be found.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.2.169
+Problem: Splint complains about a lot of things.
+Solution: Add type casts, #ifdefs and other changes to avoid warnings.
+ Change colnr_T from unsigned to int. Avoids mistakes with
+ subtracting columns.
+Files: src/cleanlint.vim, src/diff.c, src/edit.c, src/ex_cmds.c,
+ src/ex_cmds2.c, src/ex_docmd.c, src/proto/ex_cmds.pro,
+ src/proto/spell.pro, src/quickfix.c, src/spell.c, src/structs.h,
+ src/term.h, src/vim.h
+
+Patch 7.2.170
+Problem: Using b_dev while it was not set. (Dominique Pelle)
+Solution: Add the b_dev_valid flag.
+Files: src/buffer.c, src/fileio.c, src/structs.h
+
+Patch 7.2.171 (after 7.2.169)
+Problem: Compiler warnings. (Tony Mechelynck)
+Solution: Add function prototype. (Patrick Texier) Init variable.
+Files: src/ex_cmds.c
+
+Patch 7.2.172 (extra)
+Problem: Compiler warning.
+Solution: Adjust function prototype. (Patrick Texier)
+Files: src/os_mswin.c
+
+Patch 7.2.173
+Problem: Without lint there is no check for unused function arguments.
+Solution: Use gcc -Wunused-parameter instead of lint. For a few files add
+ attributes to arguments that are known not to be used.
+Files: src/auto/configure, src/buffer.c, src/charset.c, src/diff.c,
+ src/configure.in, src/config.h.in, src/edit.c, src/ex_cmds.c,
+ src/ex_cmds2.c, src/version.c, src/vim.h
+
+Patch 7.2.174
+Problem: Too many warnings from gcc -Wextra.
+Solution: Change initializer. Add UNUSED. Add type casts.
+Files: src/edit.c, src/eval.c, src/ex_cmds.c, src/ex_docmd.c,
+ src/ex_getln.c, src/fileio.c, getchar.c, globals.h, main.c,
+ memline.c, message.c, src/misc1.c, src/move.c, src/normal.c,
+ src/option.c, src/os_unix.c, src/os_unix.h, src/regexp.c,
+ src/search.c, src/tag.c
+
+Patch 7.2.175
+Problem: Compiler warning in OpenBSD.
+Solution: Add type cast for NULL. (Dasn)
+Files: src/if_cscope.c
+
+Patch 7.2.176
+Problem: Exceptions for splint are not useful.
+Solution: Remove the S_SPLINT_S ifdefs.
+Files: src/edit.c, src/ex_cmds.c, src/ex_docmd.c, src/os_unix.c,
+ src/os_unix.h, src/os_unixx.h, src/structs.h, src/term.h
+
+Patch 7.2.177
+Problem: Compiler warnings when using -Wextra
+Solution: Add UNUSED and type casts.
+Files: src/eval.c, src/ex_docmd.c, src/ex_eval.c, src/ex_getln.c,
+ src/fileio.c, src/hardcopy.c, src/if_cscope.c, src/if_xcmdsrv.c,
+ src/farsi.c, src/mark.c, src/menu.c
+
+Patch 7.2.178
+Problem: Using negative value for device number might not work.
+Solution: Use a separate flag for whether ffv_dev was set.
+Files: src/misc2.c
+
+Patch 7.2.179
+Problem: Using negative value for device number might not work.
+Solution: Use a separate flag for whether sn_dev was set.
+Files: src/ex_cmds2.c
+
+Patch 7.2.180
+Problem: Some more compiler warnings when using gcc -Wextra.
+Solution: Add UNUSED and type casts.
+Files: src/buffer.c, src/ex_cmds.c, src/macros.h, src/main.c,
+ src/menu.c, src/message.c, src/misc1.c, src/mbyte.c,
+ src/normal.c, src/option.c, src/os_unix.c, src/quickfix.c,
+ src/screen.c, src/search.c, src/spell.c, src/syntax.c, src/tag.c,
+ src/term.c, src/ui.c
+
+Patch 7.2.181
+Problem: Some more compiler warnings when using gcc -Wextra.
+Solution: Add UNUSED and type casts.
+Files: src/if_mzsch.c, src/gui.c, src/gui_gtk.c, src/gui_gtk_x11.c,
+ src/gui_gtk_f.c, src/gui_beval.c, src/netbeans.c
+
+Patch 7.2.182 (after 7.2.181)
+Problem: Compilation problems after previous patch for Motif. Gvim with
+ GTK crashes on startup.
+Solution: Add comma. Init form structure to zeroes.
+Files: src/netbeans.c, src/gui_gtk_f.c
+
+Patch 7.2.183
+Problem: Configure problem for sys/sysctl.h on OpenBSD. (Dasn)
+Solution: Add separate check for this header file. Also switch to newer
+ version of autoconf.
+Files: src/auto/configure, src/configure.in
+
+Patch 7.2.184
+Problem: Some more compiler warnings when using gcc -Wextra.
+Solution: Add UNUSED and type casts. Autoconf check for wchar_t.
+Files: src/auto/configure, src/config.h.in, src/configure.in,
+ src/gui_athena.c, src/gui_x11.c, src/gui.c, src/gui_beval.c,
+ src/gui_at_sb.c, src/gui_at_fs.c, src/gui_motif.c,
+ src/gui_xmdlg.c, src/gui_xmebw.c, src/if_python.c, src/window.c,
+ src/workshop.c
+
+Patch 7.2.185
+Problem: Some more compiler warnings when using gcc -Wextra.
+Solution: Add UNUSED and type casts.
+Files: src/Makefile, src/if_tlc.c, src/if_ruby.c
+
+Patch 7.2.186
+Problem: Some more compiler warnings when using gcc -Wextra.
+Solution: Now with the intended if_tcl.c changes.
+Files: src/if_tcl.c
+
+Patch 7.2.187 (after 7.2.186)
+Problem: Doesn't build with older versions of TCL. (Yongwei Wu)
+Solution: Add #ifdefs. (Dominique Pelle)
+Files: src/if_tcl.c
+
+Patch 7.2.188
+Problem: Crash with specific use of function calls. (Meikel Brandmeyer)
+Solution: Make sure the items referenced by a function call are not freed
+ twice. (based on patch from Nico Weber)
+Files: src/eval.c
+
+Patch 7.2.189
+Problem: Possible hang for deleting auto-indent. (Dominique Pelle)
+Solution: Make sure the position is not beyond the end of the line.
+Files: src/edit.c
+
+Patch 7.2.190
+Problem: The register executed by @@ isn't restored.
+Solution: Mark the executable register in the viminfo file.
+Files: src/ops.c
+
+Patch 7.2.191
+Problem: Mzscheme interface doesn't work on Ubuntu.
+Solution: Change autoconf rules. Define missing macro. Some changes to
+ avoid gcc warnings. Remove per-buffer namespace. (Sergey Khorev)
+Files: runtime/doc/if_mzsch.txt, src/Makefile, src/Make_ming.mak,
+ src/Make_mvc.mak, src/auto/configure, src/configure.in,
+ src/config.mk.in, src/eval.c, src/if_mzsch.c, src/if_mzsch.h,
+ src/main.c, src/proto/if_mzsch.pro
+
+Patch 7.2.192 (after 7.2.188)
+Problem: Still a crash in the garbage collector for a very rare situation.
+Solution: Make sure current_copyID is always incremented correctly. (Kent
+ Sibilev)
+Files: src/eval.c
+
+Patch 7.2.193
+Problem: Warning for uninitialized values.
+Solution: Initialize all the struct items.
+Files: src/eval.c
+
+Patch 7.2.194 (extra)
+Problem: MSVC: rem commands are echoed.
+Solution: Add commands to switch off echo. (Wang Xu)
+Files: src/msvc2008.bat
+
+Patch 7.2.195
+Problem: Leaking memory for the command Vim was started with.
+Solution: Remember the pointer and free it.
+Files: src/gui_gtk_x11.c
+
+Patch 7.2.196 (after 7.2.167)
+Problem: Turns out splint doesn't work well enough to be usable.
+Solution: Remove splint support.
+Files: Filelist, src/cleanlint.vim
+
+Patch 7.2.197
+Problem: Warning for uninitialized values.
+Solution: Initialize all the struct items of typebuf.
+Files: src/globals.h
+
+Patch 7.2.198
+Problem: Size of buffer used for tgetent() may be too small.
+Solution: Use the largest known size everywhere.
+Files: src/vim.h
+
+Patch 7.2.199
+Problem: Strange character in comment.
+Solution: Change to "message". (Yongwei Wu)
+Files: src/term.c
+
+Patch 7.2.200
+Problem: Reading past end of string when navigating the menu bar or
+ resizing the window.
+Solution: Add and use mb_ptr2len_len(). (partly by Dominique Pelle)
+ Also add mb_ptr2cells_len() to prevent more trouble.
+Files: src/gui_gtk_x11.c, src/os_unix.c, src/globals.h, src/mbyte.c,
+ src/proto/mbyte.pro
+
+Patch 7.2.201
+Problem: Cannot copy/paste HTML to/from Firefox via the clipboard.
+Solution: Implement this for GTK. Add the "html" value to 'clipboard'.
+Files: runtime/doc/options.txt, src/globals.h, src/gui_gtk_x11.c,
+ src/mbyte.c, src/proto/mbyte.pro, src/option.c
+
+Patch 7.2.202
+Problem: BufWipeout autocommand that edits another buffer causes problems.
+Solution: Check for the situation, give an error and quit the operation.
+Files: src/fileio.c
+
+Patch 7.2.203
+Problem: When reloading a buffer or doing anything else with a buffer that
+ is not displayed in a visible window, autocommands may be applied
+ to the current window, folds messed up, etc.
+Solution: Instead of using the current window for the hidden buffer use a
+ special window, splitting the current one temporarily.
+Files: src/fileio.c, src/globals.h, src/gui.c, src/if_perl.xs,
+ src/progo/gui.pro, src/proto/window.pro, src/screen.c,
+ src/structs.h, src/window.c
+
+Patch 7.2.204 (extra)
+Problem: Win32: Can't build with Visual Studio 2010 beta 1.
+Solution: Fix the makefile. (George Reilly)
+Files: src/Make_mvc.mak
+
+Patch 7.2.205 (extra)
+Problem: Win32: No support for High DPI awareness.
+Solution: Fix the manifest file. (George Reilly)
+Files: src/Make_mvc.mak, src/gvim.exe.mnf
+
+Patch 7.2.206
+Problem: Win32: Can't build netbeans interface with Visual Studio 2010.
+Solution: Undefine ECONNREFUSED. (George Reilly)
+Files: src/netbeans.c
+
+Patch 7.2.207
+Problem: Using freed memory with ":redrawstatus" when it works recursively.
+Solution: Prevent recursively updating the status line. (partly by Dominique
+ Pelle)
+Files: src/screen.c
+
+Patch 7.2.208
+Problem: "set novice" gives an error message, it should be ignored.
+Solution: Don't see "no" in "novice" as unsetting an option. (Patrick
+ Texier)
+Files: src/option.c
+
+Patch 7.2.209
+Problem: For xxd setmode() is undefined on Cygwin.
+Solution: Include io.h. (Dominique Pelle)
+Files: src/xxd/xxd.c
+
+Patch 7.2.210
+Problem: When a file that is being edited has its timestamp updated outside
+ of Vim and ":checktime" is used still get a warning when writing
+ the file. (Matt Mueller)
+Solution: Store the timestamp in b_mtime_read when the timestamp is the only
+ thing that changed.
+Files: src/fileio.c
+
+Patch 7.2.211
+Problem: Memory leak when expanding a series of file names.
+Solution: Use ga_clear_strings() instead of ga_clear().
+Files: src/misc1.c
+
+Patch 7.2.212 (extra)
+Problem: Warnings for redefining SIG macros.
+Solution: Don't define them if already defined. (Bjorn Winckler)
+Files: src/os_mac.h
+
+Patch 7.2.213
+Problem: Warning for using vsprintf().
+Solution: Use vim_vsnprintf().
+Files: src/netbeans.c
+
+Patch 7.2.214
+Problem: Crash with complete function for user command. (Andy Wokula)
+Solution: Avoid using a NULL pointer (Dominique Pelle)
+Files: src/ex_getln.c
+
+Patch 7.2.215
+Problem: ml_get error when using ":vimgrep".
+Solution: Load the memfile for the hidden buffer before putting it in a
+ window. Correct the order of splitting the window and filling
+ the window and buffer with data.
+Files: src/fileio.c, src/proto/window.pro, src/quickfix.c, src/window.c
+
+Patch 7.2.216
+Problem: Two error messages have the same number E812.
+Solution: Give one message a different number.
+Files: runtime/doc/autocmd.txt, runtime/doc/if_mzsch.txt, src/if_mzsch.c
+
+Patch 7.2.217
+Problem: Running tests with valgrind doesn't work as advertised.
+Solution: Fix the line in the Makefile.
+Files: src/testdir/Makefile
+
+Patch 7.2.218
+Problem: Cannot build GTK with hangul_input feature. (Dominique Pelle)
+Solution: Adjust #ifdef. (SungHyun Nam)
+Files: src/gui.c
+
+Patch 7.2.219 (extra)
+Problem: Photon GUI is outdated.
+Solution: Updates for QNX 6.4.0. (Sean Boudreau)
+Files: src/gui_photon.c
+
+Patch 7.2.220 (after 7.2.215)
+Problem: a BufEnter autocommand that changes directory causes problems.
+ (Ajit Thakkar)
+Solution: Disable autocommands when opening a hidden buffer in a window.
+Files: src/fileio.c
+
+Patch 7.2.221
+Problem: X cut_buffer0 text is used as-is, it may be in the wrong encoding.
+Solution: Convert between 'enc' and latin1. (James Vega)
+Files: src/gui_gtk_x11.c, src/message.c, src/ops.c, src/proto/ui.pro,
+ src/ui.c
+
+Patch 7.2.222
+Problem: ":mksession" doesn't work properly with 'acd' set.
+Solution: Make it work. (Yakov Lerner)
+Files: src/ex_docmd.c
+
+Patch 7.2.223
+Problem: When a script is run with ":silent" it is not able to give warning
+ messages.
+Solution: Add the ":unsilent" command.
+Files: runtime/doc/various.txt, src/ex_cmds.h, src/ex_docmd.c
+
+Patch 7.2.224
+Problem: Crash when using 'completefunc'. (Ingo Karkat)
+Solution: Disallow entering edit() recursively when doing completion.
+Files: src/edit.c
+
+Patch 7.2.225
+Problem: When using ":normal" a saved character may be executed.
+Solution: Also store old_char when saving typeahead.
+Files: src/getchar.c, src/structs.h
+
+Patch 7.2.226
+Problem: ml_get error after deleting the last line. (Xavier de Gaye)
+Solution: When adjusting marks a callback may be invoked. Adjust the cursor
+ position before invoking deleted_lines_mark().
+Files: src/ex_cmds.c, src/ex_docmd.c, src/if_mzsch.c, src/if_python.c,
+ src/if_perl.xs, src/misc1.c
+
+Patch 7.2.227
+Problem: When using ":cd" in a script there is no way to track this.
+Solution: Display the directory when 'verbose' is 5 or higher.
+Files: src/ex_docmd.c
+
+Patch 7.2.228
+Problem: Cscope is limited to 8 connections.
+Solution: Allocated the connection array to handle any number of
+ connections. (Dominique Pelle)
+Files: runtime/doc/if_cscop.txt, src/if_cscope.h, src/if_cscope.c
+
+Patch 7.2.229
+Problem: Warning for shadowed variable.
+Solution: Rename "wait" to "wait_time".
+Files: src/os_unix.c
+
+Patch 7.2.230
+Problem: A few old lint-style ARGUSED comments.
+Solution: Change to the new UNUSED style.
+Files: src/getchar.c
+
+Patch 7.2.231
+Problem: Warning for unreachable code.
+Solution: Add #ifdef.
+Files: src/if_perl.xs
+
+Patch 7.2.232
+Problem: Cannot debug problems with being in a wrong directory.
+Solution: When 'verbose' is 5 or higher report directory changes.
+Files: src/os_unix.c, src/os_unix.h, src/proto/os_unix.pro
+
+Patch 7.2.233 (extra part of 7.2.232)
+Problem: Cannot debug problems with being in a wrong directory.
+Solution: When 'verbose' is 5 or higher report directory changes.
+Files: src/os_msdos.c, src/os_mswin.c, src/os_riscos.c, src/os_mac.h
+
+Patch 7.2.234
+Problem: It is not possible to ignore file names without a suffix.
+Solution: Use an empty entry in 'suffixes' for file names without a dot.
+Files: runtime/doc/cmdline.txt, src/misc1.c
+
+Patch 7.2.235
+Problem: Using CTRL-O z= in Insert mode has a delay before redrawing.
+Solution: Reset msg_didout and msg_scroll.
+Files: src/misc1.c, src/spell.c
+
+Patch 7.2.236
+Problem: Mac: Compiling with Ruby doesn't always work.
+Solution: In configure filter out the --arch argument (Bjorn Winckler)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.2.237
+Problem: Crash on exit when window icon not set.
+Solution: Copy terminal name when using it for the icon name.
+Files: src/os_unix.c
+
+Patch 7.2.238
+Problem: Leaking memory when setting term to "builtin_dumb".
+Solution: Free memory when resetting term option t_Co.
+Files: src/option.c, src/proto/option.pro, src/term.c
+
+Patch 7.2.239
+Problem: Using :diffpatch twice or when patching fails causes memory
+ corruption and/or a crash. (Bryan Venteicher)
+Solution: Detect missing output file. Avoid using non-existing buffer.
+Files: src/diff.c
+
+Patch 7.2.240
+Problem: Crash when using find/replace dialog repeatedly. (Michiel
+ Hartsuiker)
+Solution: Avoid doing the operation while busy or recursively. Also refuse
+ replace when text is locked.
+Files: src/gui.c
+
+Patch 7.2.241
+Problem: When using a combination of ":bufdo" and "doautoall" we may end up
+ in the wrong directory. (Ajit Thakkar)
+ Crash when triggering an autocommand in ":vimgrep". (Yukihiro
+ Nakadaira)
+Solution: Clear w_localdir and globaldir when using the aucmd_win.
+ Use a separate flag to decide aucmd_win needs to be restored.
+Files: src/fileio.c, src/globals.h, src/structs.h
+
+Patch 7.2.242
+Problem: Setting 'lazyredraw' causes the cursor column to be recomputed.
+ (Tom Link)
+Solution: Only recompute the cursor column for a boolean option if changes
+ the cursor position.
+Files: src/option.c
+
+Patch 7.2.243
+Problem: Memory leak when using :vimgrep and resizing. (Dominique Pelle)
+Solution: Free memory for aucmd_win when resizing and don't allocate it
+ twice.
+Files: src/screen.c
+
+Patch 7.2.244
+Problem: When 'enc' is utf-8 and 'fenc' is latin1, writing a non-latin1
+ character gives a conversion error without any hint what is wrong.
+Solution: When known add the line number to the error message.
+Files: src/fileio.c
+
+Patch 7.2.245
+Problem: When 'enc' is "utf-16" and 'fenc' is "utf-8" writing a file does
+ conversion while none should be done. (Yukihiro Nakadaira) When
+ 'fenc' is empty the file is written as utf-8 instead of utf-16.
+Solution: Do proper comparison of encodings, taking into account that all
+ Unicode values for 'enc' use utf-8 internally.
+Files: src/fileio.c
+
+Patch 7.2.246
+Problem: Cscope home page link is wrong.
+Solution: Update the URL. (Sergey Khorev)
+Files: runtime/doc/if_cscop.txt
+
+Patch 7.2.247
+Problem: Mzscheme interface minor problem.
+Solution: Better error message when build fails. (Sergey Khorev)
+Files: src/if_mzsch.c
+
+Patch 7.2.248 (extra)
+Problem: Mzscheme interface building minor problems.
+Solution: Update Win32 makefiles. (Sergey Khorev)
+Files: src/Make_cyg.mak, src/Make_ming.mak, src/Make_mvc.mak
+
+Patch 7.2.249
+Problem: The script to check .po files can't handle '%' in plural forms.
+Solution: Remove "Plural-Forms:" from the checked string.
+Files: src/po/check.vim
+
+Patch 7.2.250 (extra)
+Problem: Possible buffer overflow.
+Solution: Compute the remaining space. (Dominique Pelle)
+Files: src/GvimExt/gvimext.cpp
+
+Patch 7.2.251 (after 7.2.044)
+Problem: Compiler adds invalid memory bounds check.
+Solution: Remove _FORTIFY_SOURCE=2 from CFLAGS. (Dominique Pelle)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.2.252
+Problem: When using a multibyte 'enc' the 'iskeyword' option cannot
+ contain characters above 128.
+Solution: Use mb_ptr2char_adv().
+Files: src/charset.c
+
+Patch 7.2.253
+Problem: Netbeans interface: getLength always uses current buffer.
+Solution: Use ml_get_buf() instead of ml_get(). (Xavier de Gaye)
+Files: src/netbeans.c
+
+Patch 7.2.254
+Problem: Compiler warning for assigning size_t to int.
+Solution: Use size_t for the variable. (George Reilly)
+Files: src/fileio.c
+
+Patch 7.2.255 (after 7.2.242)
+Problem: Setting 'rightleft', 'linebreak' and 'wrap' may cause cursor to be
+ in wrong place.
+Solution: Recompute the cursor column for these options.
+Files: src/option.c
+
+Patch 7.2.256
+Problem: When 'guifont' was not set GTK font dialog doesn't have a default.
+ (Andreas Metzler)
+Solution: Set default to DEFAULT_FONT. (James Vega)
+Files: src/gui_gtk_x11.c
+
+Patch 7.2.257
+Problem: With GTK 2.17 lots of assertion error messages.
+Solution: Remove check for static gravity. (Sebastian Droege)
+Files: src/gui_gtk_f.c
+
+Patch 7.2.258
+Problem: v:beval_col and b:beval_text are wrong in UTF-8 text. (Tony
+ Mechelynck)
+Solution: Use byte number instead of character number for the column.
+Files: src/ui.c
+
+Patch 7.2.259
+Problem: exists() doesn't work properly for an empty aucmd group.
+Solution: Change how au_exists() handles a missing pattern. Also add a
+ test for this. (Bob Hiestand)
+Files: src/fileio.c, src/testdir/Makefile, src/testdir/test67.in,
+ src/testdir/test67.ok
+
+Patch 7.2.260 (extra part of 7.2.259)
+Problem: exists() doesn't work properly for empty aucmd group.
+Solution: Change how au_exists() handles a missing pattern. Also add a
+ test for this. (Bob Hiestand)
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms
+
+Patch 7.2.261
+Problem: When deleting lines with a specific folding configuration E38 may
+ appear. (Shahaf)
+Solution: When adjusting nested folds for deleted lines take into account
+ that they don't start at the top of the enclosing fold.
+Files: src/fold.c
+
+Patch 7.2.262
+Problem: When using custom completion for a user command the pattern string
+ goes beyond the cursor position. (Hari Krishna Dara)
+Solution: Truncate the string at the cursor position.
+Files: src/ex_getln.c, src/structs.h
+
+Patch 7.2.263
+Problem: GTK2: when using the -geom argument with an offset from the right
+ edge and the size is smaller than the default, the Vim window is
+ not positioned properly.
+Solution: Use another function to set the size. (Vitaly Minko)
+Files: src/gui_gtk_x11.c
+
+Patch 7.2.264
+Problem: GTK2: When the Vim window is maximized setting 'columns' or
+ 'lines' doesn't work.
+Solution: Unmaximize the window before setting the size. (Vitaly Minko)
+Files: src/gui.c, src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro
+
+Patch 7.2.265
+Problem: When using ":silent broken" inside try/catch silency may persist.
+ (dr-dr xp)
+Solution: Set msg_silent when there is an error and it's bigger than the
+ saved value.
+Files: src/ex_docmd.c
+
+Patch 7.2.266
+Problem: When an expression abbreviation is triggered, the typed character
+ is unknown.
+Solution: Make the typed character available in v:char.
+Files: runtime/doc/map.txt, src/eval.c, src/getchar.c, src/ops.c,
+ src/proto/eval.pro
+
+Patch 7.2.267
+Problem: Crash for narrow window and double-width character.
+Solution: Check for zero width. (Taro Muraoka)
+Files: src/charset.c
+
+Patch 7.2.268
+Problem: Crash when using Python to set cursor beyond end of line.
+ (winterTTr)
+Solution: Check the column to be valid.
+Files: src/if_python.c
+
+Patch 7.2.269
+Problem: Many people struggle to find out why Vim startup is slow.
+Solution: Add the --startuptime command line flag.
+Files: runtime/doc/starting.txt, src/globals.h, src/feature.h,
+ src/main.c, src/macros.h
+
+Patch 7.2.270
+Problem: Using ":@c" when the c register contains a CR causes the rest to
+ be executed later. (Dexter Douglas)
+Solution: Don't check for typeahead to start with ':', keep executing
+ commands until all added typeahead has been used.
+Files: src/ex_docmd.c
+
+Patch 7.2.271
+Problem: Using freed memory in Motif GUI version when making a choice.
+Solution: Free memory only after using it. (Dominique Pelle)
+Files: src/gui_xmdlg.c
+
+Patch 7.2.272
+Problem: "_.svz" is not recognized as a swap file. (David M. Besonen)
+Solution: Accept .s[uvw][a-z] as a swap file name extension.
+Files: src/memline.c
+
+Patch 7.2.273
+Problem: Crash with redir to unknown array. (Christian Brabandt)
+Solution: Don't assign the redir result when there was an error.
+Files: src/eval.c
+
+Patch 7.2.274
+Problem: Syntax folding doesn't work properly when adding a comment.
+Solution: Fix it and add a test. (Lech Lorens)
+Files: src/fold.c, src/testdir/test45.in, src/testdir/test45.ok
+
+Patch 7.2.275
+Problem: Warning for unused argument and comparing signed and unsigned.
+Solution: Add type cast.
+Files: src/memline.c
+
+Patch 7.2.276
+Problem: Crash when setting 'isprint' to a small bullet. (Raul Coronado)
+Solution: Check for the character to be < 256. Also make it possible to
+ specify a range of multibyte characters. (Lech Lorens)
+Files: src/charset.c
+
+Patch 7.2.277
+Problem: CTRL-Y in a diff'ed window may move the cursor outside of the
+ window. (Lech Lorens)
+Solution: Limit the number of filler lines to the height of the window.
+ Don't reset filler lines to zero for an empty buffer.
+Files: src/move.c
+
+Patch 7.2.278
+Problem: Using magic number in the folding code.
+Solution: Use the defined MAX_LEVEL.
+Files: src/fold.c
+
+Patch 7.2.279
+Problem: Invalid memory read with visual mode "r". (Dominique Pelle)
+Solution: Make sure the cursor position is valid. Don't check the cursor
+ position but the position being used. And make sure we get the
+ right line.
+Files: src/misc2.c, src/ops.c
+
+Patch 7.2.280
+Problem: A redraw in a custom statusline with %! may cause a crash.
+ (Yukihiro Nakadaira)
+Solution: Make a copy of 'statusline'. Also fix typo in function name
+ redraw_custom_statusline. (partly by Dominique Pelle)
+Files: src/screen.c
+
+Patch 7.2.281
+Problem: 'cursorcolumn' highlighting is wrong in diff mode.
+Solution: Adjust the column computation. (Lech Lorens)
+Files: src/screen.c
+
+Patch 7.2.282
+Problem: A fold can't be closed.
+Solution: Initialize fd_small to MAYBE. (Lech Lorens)
+Files: src/fold.c
+
+Patch 7.2.283
+Problem: Changing font while the window is maximized doesn't keep the
+ window maximized.
+Solution: Recompute number of lines and columns after changing font. (James
+ Vega)
+Files: src/gui_gtk_x11.c
+
+Patch 7.2.284
+Problem: When editing the same buffer in two windows, one with folding,
+ display may be wrong after changes.
+Solution: Call set_topline() to take care of side effects. (Lech Lorens)
+Files: src/misc1.c
+
+Patch 7.2.285 (after 7.2.169)
+Problem: CTRL-U in Insert mode also deletes indent. (Andrey Voropaev)
+Solution: Fix mistake made in patch 7.2.169.
+Files: src/edit.c
+
+Patch 7.2.286 (after 7.2.269)
+Problem: The "--startuptime=<file>" argument is not consistent with other
+ arguments.
+Solution: Use "--startuptime <file>". Added the +startuptime feature.
+Files: runtime/doc/eval.txt, runtime/doc/starting.txt,
+ runtime/doc/various.txt, src/eval.c, src/main.c, src/version.c
+
+Patch 7.2.287
+Problem: Warning from gcc 3.4 about uninitialized variable.
+Solution: Move assignment outside of #ifdef.
+Files: src/if_perl.xs
+
+Patch 7.2.288
+Problem: Python 2.6 pyconfig.h redefines macros.
+Solution: Undefine the macros before including pyconfig.h.
+Files: src/if_python.c
+
+Patch 7.2.289
+Problem: Checking wrong struct member.
+Solution: Change tb_buf to tb_noremap. (Dominique Pelle)
+Files: src/getchar.c
+
+Patch 7.2.290
+Problem: Not freeing memory from ":lmap", ":xmap" and ":menutranslate".
+Solution: Free the memory when exiting. (Dominique Pelle)
+Files: src/misc2.c
+
+Patch 7.2.291
+Problem: Reading uninitialised memory in arabic mode.
+Solution: Use utfc_ptr2char_len() rather than utfc_ptr2char(). (Dominique
+ Pelle)
+Files: src/screen.c
+
+Patch 7.2.292
+Problem: Block right-shift doesn't work properly with multibyte encoding
+ and 'list' set.
+Solution: Add the missing "else". (Lech Lorens)
+Files: src/ops.c
+
+Patch 7.2.293
+Problem: When setting 'comments' option it may be used in a wrong way.
+Solution: Don't increment after skipping over digits. (Yukihiro Nakadaira)
+Files: src/misc1.c
+
+Patch 7.2.294
+Problem: When using TEMPDIRS dir name could get too long.
+Solution: Overwrite tail instead of appending each time. Use mkdtemp() when
+ available. (James Vega)
+Files: src/auto/configure, src/config.h.in, src/configure.in, src/fileio.c
+
+Patch 7.2.295
+Problem: When using map() on a List the index is not known.
+Solution: Set v:key to the index. (Hari Krishna Dara)
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.2.296
+Problem: Help message about startuptime is wrong. (Dominique Pelle)
+Solution: Remove the equal sign.
+Files: src/main.c
+
+Patch 7.2.297
+Problem: Reading freed memory when writing ":reg" output to a register.
+ (Dominique Pelle)
+Solution: Skip the register being written to.
+Files: src/ops.c
+
+Patch 7.2.298
+Problem: ":vimgrep" crashes when there is an autocommand that sets a
+ window-local variable.
+Solution: Initialize the w: hashtab for re-use. (Yukihiro Nakadaira)
+Files: src/fileio.c
+
+Patch 7.2.299
+Problem: Crash when comment middle is longer than start.
+Solution: Fix size computation. (Lech Lorens)
+Files: src/misc1.c
+
+Patch 7.2.300
+Problem: Vim doesn't close file descriptors when forking and executing
+ another command, e.g., ":shell".
+Solution: Use FD_CLOEXEC when available. (James Vega)
+Files: auto/configure, src/config.h.in, src/configure.in,
+ src/ex_cmdds2.c, src/fileio.c, src/memfile.c, src/memline.c
+
+Patch 7.2.301
+Problem: Formatting is wrong when 'tw' is set to a small value.
+Solution: Fix it and add tests. Also fix behavior of "1" in 'fo'. (Yukihiro
+ Nakadaira)
+Files: src/edit.c, src/testdir/Makefile, src/testdir/test68.in,
+ src/testdir/test68.ok, src/testdir/test69.in,
+ src/testdir/test69,ok
+
+Patch 7.2.302 (extra part of 7.2.301)
+Problem: Formatting wrong with small 'tw' value.
+Solution: Add build rules for tests.
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms
+
+Patch 7.2.303 (after 7.2.294)
+Problem: Can't build on MS-Windows.
+Solution: Add #ifdef around vim_settempdir(). (James Vega)
+Files: src/fileio.c
+
+Patch 7.2.304
+Problem: Compiler warning for bad pointer cast.
+Solution: Use another variable for int pointer.
+Files: src/ops.c
+
+Patch 7.2.305
+Problem: Recursively redrawing causes a memory leak. (Dominique Pelle)
+Solution: Disallow recursive screen updating.
+Files: src/screen.c
+
+Patch 7.2.306
+Problem: shellescape("10%%", 1) only escapes first %. (Christian Brabandt)
+Solution: Don't copy the character after the escaped one.
+Files: src/misc2.c
+
+Patch 7.2.307
+Problem: Crash with a very long syntax match statement. (Guy Gur Ari)
+Solution: When the offset does not fit in the two bytes available give an
+ error instead of continuing with invalid pointers.
+Files: src/regexp.c
+
+Patch 7.2.308
+Problem: When using a regexp in the "\=" expression of a substitute
+ command, submatch() returns empty strings for further lines.
+ (Clockwork Jam)
+Solution: Save and restore the line number and line count when calling
+ reg_getline().
+Files: src/regexp.c
+
+Patch 7.2.309 (after 7.2.308)
+Problem: Warning for missing function prototype. (Patrick Texier)
+Solution: Add the prototype.
+Files: src/regexp.c
+
+Patch 7.2.310
+Problem: When a filetype plugin in ~/.vim/ftdetect uses ":setfiletype" and
+ the file starts with a "# comment" it gets "conf" filetype.
+Solution: Check for "conf" filetype after using ftdetect plugins.
+Files: runtime/filetype.vim
+
+Patch 7.2.311
+Problem: Can't compile with FreeMiNT.
+Solution: Change #ifdef for limits.h. (Alan Hourihane)
+Files: src/fileio.c
+
+Patch 7.2.312
+Problem: iconv() returns an invalid character sequence when conversion
+ fails. It should return an empty string. (Yongwei Wu)
+Solution: Be more strict about invalid characters in the input.
+Files: src/mbyte.c
+
+Patch 7.2.313
+Problem: Command line completion doesn't work after "%:h" and similar.
+Solution: Expand these items before doing the completion.
+Files: src/ex_getln.c, src/misc1.c, src/proto/misc1.pro
+
+Patch 7.2.314
+Problem: Missing function in small build.
+Solution: Always include concat_str.
+Files: src/misc1.c
+
+Patch 7.2.315
+Problem: Python libs can't be found on 64 bit system.
+Solution: Add lib64 to the list of directories. (Michael Henry)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.2.316
+Problem: May get multiple _FORTIFY_SOURCE arguments. (Tony Mechelynck)
+Solution: First remove all these arguments and then add the one we want.
+ (Dominique Pelle)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.2.317
+Problem: Memory leak when adding a highlight group with unprintable
+ characters, resulting in E669.
+Solution: Free the memory. And fix a few typos. (Dominique Pelle)
+Files: src/syntax.c
+
+Patch 7.2.318
+Problem: Wrong locale value breaks floating point numbers for gvim.
+Solution: Set the locale again after doing GUI inits. (Dominique Pelle)
+Files: src/main.c
+
+Patch 7.2.319
+Problem: Motif: accessing freed memory when cancelling font dialog.
+Solution: Destroy the widget only after accessing it. (Dominique Pelle)
+Files: src/gui_xmdlg.c
+
+Patch 7.2.320
+Problem: Unused function in Mzscheme interface.
+Solution: Remove the function and what depends on it. (Dominique Pelle)
+Files: src/if_mzsch.c, src/proto/if_mzsch.pro
+
+Patch 7.2.321
+Problem: histadd() and searching with "*" fails to add entry to history
+ when it is empty.
+Solution: Initialize the history. (Lech Lorens)
+Files: src/eval.c, src/normal.c
+
+Patch 7.2.322
+Problem: Wrong indenting in virtual replace mode with CTRL-Y below a short
+ line.
+Solution: Check for character to be NUL. (suggested by Lech Lorens)
+Files: src/edit.c
+
+Patch 7.2.323 (extra)
+Problem: Balloon evaluation crashes on Win64.
+Solution: Change pointer types. (Sergey Khorev)
+Files: src/gui_w32.c
+
+Patch 7.2.324
+Problem: A negative column argument in setpos() may cause a crash.
+Solution: Check for invalid column number. (James Vega)
+Files: src/eval.c, src/misc2.c
+
+Patch 7.2.325
+Problem: A stray "w" in the startup vimrc file causes the edited file to be
+ replaced with an empty file. (Stone Kang).
+Solution: Do not write a buffer when it has never been loaded.
+Files: src/fileio.c
+
+Patch 7.2.326
+Problem: Win32: $HOME doesn't work when %HOMEPATH% is not defined.
+Solution: Use "\" for %HOMEPATH% when it is not defined.
+Files: src/misc1.c
+
+Patch 7.2.327
+Problem: Unused functions in Workshop.
+Solution: Add "#if 0" and minor cleanup. (Dominique Pelle)
+Files: src/workshop.c, src/integration.c, src/integration.h
+
+Patch 7.2.328
+Problem: has("win64") does not return 1 on 64 bit MS-Windows version.
+Solution: Also check for _WIN64 besides WIN64.
+Files: src/eval.c
+
+Patch 7.2.329
+Problem: "g_" doesn't position cursor correctly when in Visual mode and
+ 'selection' is "exclusive". (Ben Fritz)
+Solution: Call adjust_for_sel().
+Files: src/normal.c
+
+Patch 7.2.330
+Problem: Tables for Unicode case operators are outdated.
+Solution: Add a Vim script for generating the tables. Include tables for
+ Unicode 5.2.
+Files: runtime/tools/README.txt, runtime/tools/unicode.vim, src/mbyte.c
+
+Patch 7.2.331
+Problem: Can't interrupt "echo list" for a very long list.
+Solution: Call line_breakcheck() in list_join().
+Files: src/eval.c
+
+Patch 7.2.332
+Problem: Crash when spell correcting triggers an autocommand that reloads
+ the buffer.
+Solution: Make a copy of the line to be modified. (Dominique Pelle)
+Files: src/spell.c
+
+Patch 7.2.333
+Problem: Warnings from static code analysis.
+Solution: Small changes to various lines. (Dominique Pelle)
+Files: src/buffer.c, src/edit.c, src/ex_getln.c, src/fileio.c,
+ src/if_cscope.c, src/netbeans.c, src/ops.c, src/quickfix.c,
+ src/syntax.c, src/ui.c
+
+Patch 7.2.334
+Problem: Postponing keys in Netbeans interface does not work properly.
+Solution: Store the key string instead of the number. Avoid an infinite
+ loop. (Mostly by Xavier de Gaye)
+Files: src/netbeans.c, src/proto/netbeans.pro
+
+Patch 7.2.335
+Problem: The CTRL-] command escapes too many characters.
+Solution: Use a different list of characters to be escaped. (Sergey Khorev)
+Files: src/normal.c
+
+Patch 7.2.336
+Problem: MzScheme interface can't evaluate an expression.
+Solution: Add mzeval(). (Sergey Khorev)
+Files: runtime/doc/eval.txt, runtime/doc/if_mzsch.txt,
+ runtime/doc/usr_41.txt, src/eval.c, src/if_mzsch.c,
+ src/proto/eval.pro, src/proto/if_mzsch.pro,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Makefile, src/testdir/main.aap, src/testdir/test1.in,
+ src/testdir/test70.in, src/testdir/test70.ok
+
+Patch 7.2.337
+Problem: The :compiler command doesn't function properly when invoked in a
+ function.
+Solution: Add "g:" before "current_compiler". (Yukihiro Nakadaira)
+Files: src/ex_cmds2.c
+
+Patch 7.2.338 (after 7.2.300)
+Problem: Part of FD_CLOEXEC change is missing.
+Solution: Include source file skipped because of typo.
+Files: src/ex_cmds2.c
+
+Patch 7.2.339 (after 7.2.269)
+Problem: Part of --startuptime patch is missing.
+Solution: Add check for time_fd.
+Files: src/ex_cmds2.c
+
+Patch 7.2.340
+Problem: Gcc warning for condition that can never be true. (James Vega)
+Solution: Use start_lvl instead flp->lvl.
+Files: src/fold.c
+
+Patch 7.2.341
+Problem: Popup menu wraps to next line when double-wide character doesn't
+ fit. (Jiang Ma)
+Solution: Display a ">" instead. (Dominique Pelle)
+Files: src/screen.c
+
+Patch 7.2.342
+Problem: Popup menu displayed wrong in 'rightleft' mode when there are
+ multibyte characters.
+Solution: Adjust the column computations. (Dominique Pelle)
+Files: src/popupmnu.c
+
+Patch 7.2.343 (after 7.2.338)
+Problem: Can't compile on Win32.
+Solution: Insert the missing '|'.
+Files: src/ex_cmds2.c
+
+Patch 7.2.344 (after 7.2.343)
+Problem: Can't compile on some systems
+Solution: Move the #ifdef outside of the mch_open macro. (Patrick Texier)
+Files: src/ex_cmds2.c
+
+Patch 7.2.345
+Problem: Tab line is not updated when the value of 'bt' is changed.
+Solution: Call redraw_titles(). (Lech Lorens)
+Files: src/option.c
+
+Patch 7.2.346
+Problem: Repeating a command with @: causes a mapping to be applied twice.
+Solution: Do not remap characters inserted in the typeahead buffer. (Kana
+ Natsuno)
+Files: src/ops.c
+
+Patch 7.2.347
+Problem: Crash when executing <expr> mapping redefines that same mapping.
+Solution: Save the values used before evaluating the expression.
+Files: src/getchar.c
+
+Patch 7.2.348 (after 7.2.330)
+Problem: Unicode double-width characters are not up-to date.
+Solution: Produce the double-width table like the others.
+Files: runtime/tools/unicode.vim, src/mbyte.c
+
+Patch 7.2.349
+Problem: CTRL-W gf doesn't put the new tab in the same place as "tab split"
+ and "gf". (Tony Mechelynck)
+Solution: Store the tab number in cmdmod.tab.
+Files: src/window.c
+
+Patch 7.2.350
+Problem: Win32: When changing font the window may jump from the secondary
+ to the primary screen. (Michael Wookey)
+Solution: When the screen position was negative don't correct it to zero.
+Files: src/gui.c
+
+Patch 7.2.351 (after 7.2.347)
+Problem: Can't build with some compilers.
+Solution: Move the #ifdef outside of a macro. Cleanup the code.
+Files: src/getchar.c
+
+Patch 7.2.352 (extra)
+Problem: Win64: Vim doesn't work when cross-compiled with MingW libraries.
+Solution: Always return TRUE for the WM_NCCREATE message. (Andy Kittner)
+Files: src/gui_w48.c
+
+Patch 7.2.353
+Problem: No command line completion for ":profile".
+Solution: Complete the subcommand and file name.
+Files: src/ex_docmd.c, src/ex_cmds2.c, src/ex_getln.c,
+ src/proto/ex_cmds2.pro, src/vim.h
+
+Patch 7.2.354
+Problem: Japanese single-width double-byte characters not handled correctly.
+Solution: Put 0x8e in ScreenLines[] and the second byte in ScreenLines2[].
+ (partly by Kikuchan)
+Files: src/screen.c
+
+Patch 7.2.355
+Problem: Computing the cursor column in validate_cursor_col() is wrong when
+ line numbers are used and 'n' is not in 'cpoptions', causing the
+ popup menu to be positioned wrong.
+Solution: Correctly use the offset. (partly by Dominique Pelle)
+Files: src/move.c
+
+Patch 7.2.356
+Problem: When 'foldmethod' is changed not all folds are closed as expected.
+Solution: In foldUpdate() correct the start position and reset fd_flags when
+ w_foldinvalid is set. (Lech Lorens)
+Files: src/fold.c
+
+Patch 7.2.357
+Problem: When changing 'fileformat' from/to "mac" and there is a CR in the
+ text the display is wrong.
+Solution: Redraw the text when 'fileformat' is changed. (Ben Schmidt)
+Files: src/option.c
+
+Patch 7.2.358
+Problem: Compiler warnings on VMS. (Zoltan Arpadffy)
+Solution: Pass array itself instead its address. Return a value.
+Files: src/gui_gtk_x11.c, src/os_unix.c
+
+Patch 7.2.359
+Problem: Crash when using the Netbeans join command.
+Solution: Make sure the ml_flush_line() function is not used recursively.
+ (Xavier de Gaye)
+Files: src/memline.c
+
+Patch 7.2.360
+Problem: Ruby on MS-Windows: can't use sockets.
+Solution: Call NtInitialize() during initialization. (Ariya Mizutani)
+Files: src/if_ruby.c
+
+Patch 7.2.361
+Problem: Ruby 1.9 is not supported.
+Solution: Add Ruby 1.9 support. (Masaki Suketa)
+Files: src/Makefile, src/auto/configure, src/configure.in, src/if_ruby.c
+
+Patch 7.2.362 (extra, after 7.2.352)
+Problem: Win64: Vim doesn't work when cross-compiled with MingW libraries.
+Solution: Instead of handling WM_NCCREATE, create wide text area window
+ class if the parent window iw side. (Sergey Khorev)
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 7.2.363
+Problem: Can't dynamically load Perl 5.10.
+Solution: Add the function Perl_croak_xs_usage. (Sergey Khorev)
+Files: src/if_perl.xs
+
+Patch 7.2.364 (extra)
+Problem: Can't build gvimext.dll on Win 7 x64 using MinGW (John Marriott)
+Solution: Check if _MSC_VER is defined. (Andy Kittner)
+Files: src/GvimExt/gvimext.h
+
+Patch 7.2.365 (extra)
+Problem: MS-Windows with MingW: "File->Save As" does not work. (John
+ Marriott)
+Solution: Correctly fill in structure size. (Andy Kittner)
+Files: src/gui_w48.c
+
+Patch 7.2.366
+Problem: CTRL-B doesn't go back to the first line of the buffer.
+Solution: Avoid an overflow when adding MAXCOL.
+Files: src/move.c
+
+Patch 7.2.367
+Problem: "xxd -r -p" doesn't work as documented.
+Solution: Skip white space. (James Vega)
+Files: src/xxd/xxd.c
+
+Patch 7.2.368 (after 7.2.361)
+Problem: Ruby interface: Appending line doesn't work. (Michael Henry)
+Solution: Reverse check for NULL line. (James Vega)
+Files: src/if_ruby.c
+
+Patch 7.2.369
+Problem: Error message is not easy to understand.
+Solution: Add quotes. (SungHyun Nam)
+Files: src/ex_cmds2.c
+
+Patch 7.2.370 (after 7.2.356)
+Problem: A redraw may cause folds to be closed.
+Solution: Revert part of the previous patch. Add a test. (Lech Lorens)
+Files: src/diff.c, src/fold.c, src/option.c, src/testdir/test45.in,
+ src/testdir/test45.ok
+
+Patch 7.2.371
+Problem: Build problems on Tandem NonStop.
+Solution: A few changes to #ifdefs (Joachim Schmitz)
+Files: src/auto/configure, src/configure.in, src/config.h.in, src/vim.h,
+ src/if_cscope.c, src/osdef1.h.in, src/tag.c
+
+Patch 7.2.372 (extra)
+Problem: Cross-compiling GvimExt and xxd doesn't work.
+Solution: Change the build files. (Markus Heidelberg)
+Files: src/INSTALLpc.txt, src/GvimExt/Make_ming.mak, src/Make_cyg.mak,
+ src/Make_ming.mak, src/xxd/Make_cyg.mak
+
+Patch 7.2.373
+Problem: Gcc 4.5 adds more error messages. (Chris Indy)
+Solution: Update default 'errorformat'.
+Files: src/option.h
+
+Patch 7.2.374
+Problem: Ruby eval() doesn't understand Vim types.
+Solution: Add the vim_to_ruby() function. (George Gensure)
+Files: src/eval.c, src/if_ruby.c
+
+Patch 7.2.375
+Problem: ml_get errors when using ":bprevious" in a BufEnter autocmd.
+ (Dominique Pelle)
+Solution: Clear w_valid when entering another buffer.
+Files: src/buffer.c
+
+Patch 7.2.376
+Problem: ml_get error when using SiSU syntax. (Nathan Thomas)
+Solution: If the match ends below the last line move it to the end of the
+ last line.
+Files: src/syntax.c
+
+Patch 7.2.377 (extra, after 7.2.372)
+Problem: Misplaced assignment. Duplicate build line for gvimext.dll.
+Solution: Move setting CROSS_COMPILE to before ifneq. Remove the wrong
+ build line. (Markus Heidelberg)
+Files: src/Make_ming.mak
+
+Patch 7.2.378
+Problem: C function declaration indented too much. (Rui)
+Solution: Don't see a line containing { or } as a type. (Matt Wozniski)
+Files: src/misc1.c
+
+Patch 7.2.379
+Problem: 'eventignore' is set to an invalid value inside ":doau". (Antony
+ Scriven)
+Solution: Don't include the leading comma when the option was empty.
+Files: src/fileio.c
+
+Patch 7.2.380 (after 7.2.363)
+Problem: Perl interface builds with 5.10.1 but not with 5.10.0.
+Solution: Change the #ifdefs. (Sergey Khorev)
+Files: src/if_perl.xs
+
+Patch 7.2.381
+Problem: No completion for :behave.
+Solution: Add :behave completion. Minor related fixes. (Dominique Pelle)
+Files: src/ex_docmd.c, src/ex_getln.c, src/proto/ex_docmd.pro, src/vim.h
+
+Patch 7.2.382
+Problem: Accessing freed memory when closing the cmdline window when
+ 'bufhide' is set to "wipe".
+Solution: Check if the buffer still exists before invoking close_buffer()
+ (Dominique Pelle)
+Files: src/ex_getln.c
+
+Patch 7.2.383
+Problem: Vim doesn't build cleanly with MSVC 2010.
+Solution: Change a few types. (George Reilly)
+Files: src/ex_cmds2.c, src/if_python.c, src/syntax.c
+
+Patch 7.2.384 (extra)
+Problem: Vim doesn't build properly with MSVC 2010.
+Solution: Add the nmake version to the build file. (George Reilly)
+Files: src/Make_mvc.mak, src/testdir/Make_dos.mak
+
+Patch 7.2.385
+Problem: When in the command line window dragging status line only works
+ for last-but-one window. (Jean Johner)
+Solution: Remove the code that disallows this.
+Files: src/ui.c
+
+Patch 7.2.386
+Problem: Focus hack for KDE 3.1 causes problems for other window managers.
+Solution: Remove the hack. (forwarded by Joel Bradshaw)
+Files: src/gui_gtk.c
+
+Patch 7.2.387
+Problem: Ruby with MingW still doesn't build all versions.
+Solution: More #ifdefs for the Ruby code. (Sergey Khorev)
+Files: src/if_ruby.c
+
+Patch 7.2.388 (extra part of 7.2.387)
+Problem: Ruby with MingW still doesn't build all versions.
+Solution: Different approach to build file. (Sergey Khorev)
+Files: src/Make_ming.mak
+
+Patch 7.2.389
+Problem: synIDattr() cannot return the font.
+Solution: Support the "font" argument. (Christian Brabandt)
+Files: runtime/doc/eval.txt, src/eval.c, src/syntax.c
+
+Patch 7.2.390
+Problem: In some situations the popup menu can be displayed wrong.
+Solution: Remove the popup menu if the cursor moved. (Lech Lorens)
+Files: src/edit.c
+
+Patch 7.2.391
+Problem: Internal alloc(0) error when doing "CTRL-V $ c". (Martti Kuparinen)
+Solution: Fix computations in getvcol(). (partly by Lech Lorens)
+Files: src/charset.c, src/memline.c
+
+Patch 7.2.392
+Problem: Netbeans hangs reading from a socket at the maximum block size.
+Solution: Use select() or poll(). (Xavier de Gaye)
+Files: src/vim.h, src/os_unixx.h, src/if_xcmdsrv.c, src/netbeans.c
+
+Patch 7.2.393
+Problem: Mac: Can't build with different Xcode developer tools directory.
+Solution: make "Developer" directory name configurable. (Rainer Muller)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.2.394
+Problem: .lzma and .xz files are not supported.
+Solution: Recognize .lzma and .xz files so that they can be edited.
+Files: runtime/plugin/gzip.vim
+
+Patch 7.2.395
+Problem: In help CTRL=] on g?g? escapes the ?, causing it to fail. (Tony
+ Mechelynck)
+Solution: Don't escape ? for a help command. (Sergey Khorev)
+Files: src/normal.c
+
+Patch 7.2.396
+Problem: Get E38 errors. (Dasn)
+Solution: Set cursor to line 1 instead of 0. (Dominique Pelle)
+Files: src/popupmnu.c
+
+Patch 7.2.397
+Problem: Redundant check for w_lines_valid.
+Solution: Remove the if. (Lech Lorens)
+Files: src/fold.c
+
+Patch 7.2.398
+Problem: When moving windows the cursor ends up in the wrong line.
+Solution: Set the window width and height properly. (Lech Lorens)
+Files: src/window.c
+
+Patch 7.2.399 (extra, after 7.2.388)
+Problem: Cannot compile on MingW.
+Solution: Move ifneq to separate line. (Vlad Sandrini, Dominique Pelle)
+Files: src/Make_ming.mak
+
+Patch 7.2.400 (after 7.2.387)
+Problem: Dynamic Ruby is not initialised properly for version 1.9.1.
+ Ruby cannot create strings from NULL.
+Solution: Cleanup #ifdefs. Handle NULL like an empty string. Add
+ ruby_init_stack. (Sergey Khorev)
+Files: src/if_ruby.c
+
+Patch 7.2.401
+Problem: ":e dir<Tab>" with 'wildmode' set to "list" doesn't highlight
+ directory names with a space. (Alexandre Provencio)
+Solution: Remove the backslash before checking if the name is a directory.
+ (Dominique Pelle)
+Files: src/ex_getln.c
+
+Patch 7.2.402
+Problem: This gives a #705 error: let X = function('haslocaldir')
+ let X = function('getcwd')
+Solution: Don't give E705 when the name is found in the hashtab. (Sergey
+ Khorev)
+Files: src/eval.c
+
+Patch 7.2.403 (after 7.2.400)
+Problem: Compiler warning for pointer type. (Tony Mechelynck)
+Solution: Move type cast to the right place.
+Files: src/if_ruby.c
+
+Patch 7.2.404
+Problem: Pointers for composing characters are not properly initialized.
+Solution: Compute the size of the pointer, not what it points to. (Yukihiro
+ Nakadaira)
+Files: src/screen.c
+
+Patch 7.2.405
+Problem: When built with small features the matching text is not
+ highlighted for ":s/pat/repl/c".
+Solution: Remove the #ifdef for IncSearch. (James Vega)
+Files: src/syntax.c
+
+Patch 7.2.406
+Problem: Patch 7.2.119 introduces uninit mem read. (Dominique Pelle)
+Solution: Only used ScreenLinesC when ScreenLinesUC is not zero. (Yukihiro
+ Nakadaira) Also clear ScreenLinesC when allocating.
+Files: src/screen.c
+
+Patch 7.2.407
+Problem: When using an expression in ":s" backslashes in the result are
+ dropped. (Sergey Goldgaber, Christian Brabandt)
+Solution: Double backslashes.
+Files: src/regexp.c
+
+Patch 7.2.408
+Problem: With ":g/the/s/foo/bar/" the '[ and '] marks can be set to a line
+ that was not changed.
+Solution: Only set '[ and '] marks when a substitution was done.
+Files: src/ex_cmds.c
+
+Patch 7.2.409
+Problem: Summary of number of substitutes is incorrect for ":folddo". (Jean
+ Johner)
+Solution: Reset sub_nsubs and sub_nlines in global_exe().
+Files: src/ex_cmds.c
+
+Patch 7.2.410
+Problem: Highlighting directories for completion doesn't work properly.
+Solution: Don't halve backslashes when not needed, expanded "~/".
+ (Dominique Pelle)
+Files: src/ex_getln.c
+
+Patch 7.2.411
+Problem: When parsing 'cino' a comma isn't skipped properly.
+Solution: Skip the comma. (Lech Lorens)
+Files: src/misc1.c
+
+Patch 7.2.412
+Problem: [ or ] followed by mouse click doesn't work.
+Solution: Reverse check for key being a mouse event. (Dominique Pelle)
+Files: src/normal.c
+
+Patch 7.2.413
+Problem: Large file support is incorrect.
+Solution: Add AC_SYS_LARGEFILE to configure. (James Vega)
+Files: src/configure.in, src/config.h.in, src/auto/configure
+
+Patch 7.2.414
+Problem: CTRL-K <space> <space> does not produce 0xa0 as expected. (Tony
+ Mechelynck)
+Solution: Remove the Unicode range 0xe000 - 0xefff from digraphs, these are
+ not valid characters.
+Files: src/digraph.c
+
+Patch 7.2.415
+Problem: Win32: Can't open a remote file when starting Vim.
+Solution: Don't invoke cygwin_conv_path() for URLs. (Tomoya Adachi)
+Files: src/main.c
+
+Patch 7.2.416
+Problem: Logtalk.dict is not installed.
+Solution: Add it to the install target. (Markus Heidelberg)
+Files: src/Makefile
+
+Patch 7.2.417
+Problem: When 'shell' has an argument with a slash then 'shellpipe' is not
+ set properly. (Britton Kerin)
+Solution: Assume there are no spaces in the path, arguments follow.
+Files: src/option.c
+
+Patch 7.2.418
+Problem: Vim tries to set the background or foreground color in a terminal
+ to -1. (Graywh) Happens with ":hi Normal ctermbg=NONE".
+Solution: When resetting the foreground or background color don't set the
+ color, let the clear screen code do that.
+Files: src/syntax.c
+
+Patch 7.2.419
+Problem: Memory leak in Motif when clicking on "Search Vim Help".
+Solution: Free string returned by XmTextGetString(). (Dominique Pelle)
+Files: src/gui_motif.c
+
+Patch 7.2.420
+Problem: ":argedit" does not accept "++enc=utf8" as documented. (Dominique
+ Pelle)
+Solution: Add the ARGOPT flag to ":argedit".
+Files: src/ex_cmds.h
+
+Patch 7.2.421
+Problem: Folds are sometimes not updated properly and there is no way to
+ force an update.
+Solution: Make "zx" and "zX" recompute folds (suggested by Christian
+ Brabandt)
+Files: src/normal.c
+
+Patch 7.2.422
+Problem: May get E763 when using spell dictionaries.
+Solution: Avoid utf-8 case folded character to be truncated to 8 bits and
+ differ from latin1. (Dominique Pelle)
+Files: src/spell.c
+
+Patch 7.2.423
+Problem: Crash when assigning s: to variable. (Yukihiro Nakadaira)
+Solution: Make ga_scripts contain pointer to scriptvar_T instead of
+ scriptvar_T itself. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.2.424
+Problem: ":colorscheme" without an argument doesn't do anything.
+Solution: Make it echo the current color scheme name. (partly by Christian
+ Brabandt)
+Files: runtime/doc/syntax.txt, src/ex_cmds.h, src/ex_docmd.c
+
+Patch 7.2.425
+Problem: Some compilers complain about fourth EX() argument.
+Solution: Add cast to long_u.
+Files: src/ex_cmds.h
+
+Patch 7.2.426
+Problem: Commas in 'langmap' are not always handled correctly.
+Solution: Require commas to be backslash escaped. (James Vega)
+Files: src/option.c
+
+Patch 7.2.427
+Problem: The swapfile is created using the destination of a symlink, but
+ recovery doesn't follow symlinks.
+Solution: When recovering, resolve symlinks. (James Vega)
+Files: src/memline.c
+
+Patch 7.2.428
+Problem: Using setqflist([]) to clear the error list doesn't work properly.
+Solution: Set qf_nonevalid to TRUE when appropriate. (Christian Brabandt)
+Files: src/quickfix.c
+
+Patch 7.2.429
+Problem: A file that exists but access is denied may result in a "new file"
+ message. E.g. when its directory is unreadable.
+Solution: Specifically check for ENOENT to decide a file doesn't exist.
+ (partly by James Vega)
+Files: src/fileio.c
+
+Patch 7.2.430
+Problem: The ++bad argument is handled wrong, resulting in an invalid
+ memory access.
+Solution: Use the bad_char field only for the replacement character, add
+ bad_char_idx to store the position. (Dominique Pelle)
+Files: src/eval.c, src/ex_cmds.h, src/ex_docmd.c
+
+Patch 7.2.431
+Problem: ":amenu" moves the cursor when in Insert mode.
+Solution: Use CTRL-\ CTRL-O instead of CTRL-O. (Christian Brabandt)
+Files: src/menu.c
+
+Patch 7.2.432
+Problem: When menus are translated they can only be found by the translated
+ name. That makes ":emenu" difficult to use.
+Solution: Store the untranslated name and use it for completion and :emenu.
+ (Liang Peng (Bezetek James), Edward L. Fox)
+Files: src/menu.c, src/structs.h
+
+Patch 7.2.433
+Problem: Can't use cscope with QuickFixCmdPre and QuickFixCmdPost.
+Solution: Add cscope support for these autocmd events. (Bryan Venteicher)
+Files: runtime/doc/autocmd.txt, src/if_cscope.c
+
+Patch 7.2.434 (after 7.2.432)
+Problem: Compilation fails without the multi-lang feature.
+Solution: Add #ifdefs. (John Marriott)
+Files: src/menu.c
+
+Patch 7.2.435 (after 7.2.430)
+Problem: Crash when using bad_char_idx uninitialized. (Patrick Texier)
+Solution: Don't use bad_char_idx, reproduce the ++bad argument from bad_char.
+Files: src/eval.c, src/ex_cmds.h, src/ex_docmd.c
+
+Patch 7.2.436
+Problem: Reproducible crash in syntax HL. (George Reilly, Dominique Pelle)
+Solution: Make sst_stacksize an int instead of short. (Dominique Pelle)
+Files: src/structs.h
+
+Patch 7.2.437 (after 7.2.407)
+Problem: When "\\\n" appears in the expression result the \n doesn't result
+ in a line break. (Andy Wokula)
+Solution: Also replace a \n after a backslash into \r.
+Files: src/regexp.c
+
+Patch 7.2.438 (after 7.2.427)
+Problem: "vim -r" crashes.
+Solution: Don't use NULL pointer argument.
+Files: src/memline.c
+
+Patch 7.2.439
+Problem: Invalid memory access when doing thesaurus completion and
+ 'infercase' is set.
+Solution: Use the minimal length of completed word and replacement.
+ (Dominique Pelle)
+Files: src/edit.c
+
+Patch 7.2.440
+Problem: Calling a function through a funcref, where the function deletes
+ the funcref, leads to an invalid memory access.
+Solution: Make a copy of the function name. (Lech Lorens)
+Files: src/eval.c, src/testdir/test34.in, src/testdir/test34.ok
+
+Patch 7.2.441
+Problem: When using ":earlier" undo information may be wrong.
+Solution: When changing alternate branches also adjust b_u_oldhead.
+Files: src/undo.c
+
+Patch 7.2.442 (after 7.2.201)
+Problem: Copy/paste with OpenOffice doesn't work.
+Solution: Do not offer the HTML target when it is not supported. (James
+ Vega)
+Files: src/gui_gtk_x11.c, src/option.c, src/proto/gui_gtk_x11.pro
+
+Patch 7.2.443
+Problem: Using taglist() on a tag file with duplicate fields generates an
+ internal error. (Peter Odding)
+Solution: Check for duplicate field names.
+Files: src/eval.c, src/proto/eval.pro, src/tag.c
+
+Patch 7.2.444 (after 7.2.442)
+Problem: Can't build with GTK 1, gtk_selection_clear_targets() is not
+ available. (Patrick Texier)
+Solution: Don't change the targets for GTK 1, set them once.
+Files: src/gui_gtk_x11.c, src/option.c
+
+Patch 7.2.445
+Problem: Crash when using undo/redo and a FileChangedRO autocmd event that
+ reloads the buffer. (Dominique Pelle)
+Solution: Do not allow autocommands while performing and undo or redo.
+Files: src/misc1.c, src/undo.c
+
+Patch 7.2.446
+Problem: Crash in GUI when closing the last window in a tabpage. (ryo7000)
+Solution: Remove the tabpage from the list before freeing the window.
+Files: src/window.c
+
+When writing a file, switching tab pages and selecting a word the file write
+message would be displayed again. This happened in Insert mode and with
+'cmdheight' set to 2.
+
+When using ":lang" to set a locale that uses a comma for decimal separator and
+using GTK floating point numbers stop working. Use gtk_disable_setlocale().
+(James Vega)
+
+"g8" didn't produce the right value on a NUL. (Dominique Pelle)
+
+Use BASEMODLIBS instead of MODLIBS for Python configuration to pick up the
+right compiler flags. (Michael Bienia)
+
+Window title was not updated after dropping a file on Vim. (Hari G)
+
+synstack() did not return anything when just past the end of the line. Useful
+when using the cursor position in Insert mode.
+
+When entering a digraph or special character after a line that fits the window
+the '?' or '^' on the next line is not redrawn. (Ian Kelling)
+
+Composing characters in |:s| substitute text were dropped.
+
+|exists()| was causing an autoload script to be loaded.
+
+Filter out -pthread for cproto.
+
+Make CTRL-L in command line mode respect 'ignorecase' and 'smartcase'. (Martin
+Toft)
+
+Spell menu moved the cursor, causing Copy not to work. Spell replacement
+didn't work in 'compatible' mode.
+
+Various small fixes from Dominique Pelle.
+
+Fix that :mksession may generate "2argu" even though there is no such
+argument. (Peter Odding)
+
+Fixes for time in clipboard request. Also fix ownership. (David Fries)
+
+Fixed completion of file names with '%' and '*'.
+
+Fixed MSVC makefile use of /Wp64 flag.
+
+Correct use of long instead of off_t for file size. (James Vega)
+
+Add a few #ifdefs to exclude functions that are not used. (Dominique Pelle)
+
+Remove old and unused method to allocate memory for undo.
+
+Fix definition of UINT_PTR for 64 bit systems.
+
+Some versions of Ruby redefine rb_str_new2 to rb_str_new_cstr.
+
+Window title not updated after file dropped.
+
+Fixed crash for ":find" completion, might also happen in other path expansion
+usage.
+
+When 'searchhl' causes a hang make CTRL-C disable 'searchhl'.
+
+When resetting both 'title' and 'icon' the title would be set after a shell
+command.
+
+Reset 'title' and 'icon' in test47 to avoid the xterm title getting messed up.
+
+Fix for compiler warning about function prototype in pty.c.
+
+Added 'window' to the options window.
+
+Fixed: errors for allocating zero bytes when profiling an empty function.
+
+Remove -arch flag from build flags for Perl. (Bjorn Wickler)
+
+Fix 'autochdir' not showing up in :options window. (Dominique Pelle)
+
+Fix: test 69 didn't work on MS-Windows. Test 72 beeped too often.
+
+Avoid illegal memory access in spell suggestion. (Dominique Pelle)
+Fix: crash in spell checking with a 0x300 character.
+
+Avoid that running tests changes viminfo.
+
+Fix: changing case of a character removed combining characters.
+Fixed: CTRL-R in Insert mode doesn't insert composing characters.
+
+Added the WOW64 flag to OLE registration, for 64 bit Windows systems.
+
+Various fixes for coverity warnings.
+
+Fix compile warnings, esp. for 64-bit systems. (Mike Williams)
+
+Fix: :redir to a dictionary that is changed before ":redir END" causes a
+memory access error.
+
+Fix: terminal title not properly restored when there are multibyte
+characters. (partly by James Vega)
+
+Set 'wrapscan' when checking the .po files. (Mike Williams)
+
+Win32: Put quotes around the gvim.exe path for the "Open with" menu entry.
+
+On MS-Windows sometimes files with number 4913 or higher are left behind.
+
+'suffixesadd' was used for finding tags file.
+
+Removed unused code.
+
+Improved positioning of combining characters in GTK.
+
+Made test 11 pass when there is no gzip program. (John Beckett)
+
+Changed readfile() to ignore byte order marks, unless in binary mode.
+
+On MS-Windows completion of shell commands didn't work.
+
+An unprintable multibyte character at the start of the screen line caused the
+following text to be drawn at the wrong position.
+
+Got ml_get errors when using undo with 'virtualedit'.
+
+Call gui_mch_update() before triggering GuiEnter autocmd. (Ron Aaron)
+
+Unix "make install" installed a few Amiga .info files.
+
+Disallow setting 'ambiwidth' to "double" when 'listchars' or 'fillchars'
+contains a character that would become double width.
+
+Set 'wrapscan' when checking the .po files. (Mike Williams)
+
+Fixed: using expression in command line may cause a crash.
+
+Avoid warnings from the clang compiler. (Dominique Pelle)
+
+Fix: Include wchar.h in charset.c for towupper().
+
+Fixed: Using ":read file" in an empty buffer when 'compatible' is set caused
+an error. Was caused by patch 7.2.132.
+
+Make the references to features in the help more consistent. (Sylvain Hitier)
+
+==============================================================================
+VERSION 7.4 *version-7.4* *version7.4* *vim-7.4*
+
+This section is about improvements made between version 7.3 and 7.4.
+
+This release has hundreds of bug fixes and there are a few new features. The
+most notable new features are:
+
+- New regexp engine |new-regexp-engine|
+- A more pythonic Python interface |better-python-interface|
+
+
+New regexp engine *new-regexp-engine*
+-----------------
+
+What is now called the "old" regexp engine uses a backtracking algorithm. It
+tries to match the pattern with the text in one way, and when that fails it
+goes back and tries another way. This works fine for simple patterns, but
+complex patterns can be very slow on longer text.
+
+The new engine uses a state machine. It tries all possible alternatives at
+the current character and stores the possible states of the pattern. This is
+a bit slower for simple patterns, but much faster for complex patterns and
+long text.
+
+Most notably, syntax highlighting for Javascript and XML files with long lines
+is now working fine. Previously Vim could get stuck.
+
+More information here: |two-engines|
+
+
+Better Python interface *better-python-interface*
+-----------------------
+
+Added |python-bindeval| function. Unlike |python-eval| this one returns
+|python-Dictionary|, |python-List| and |python-Function| objects for
+dictionaries lists and functions respectively in place of their Python
+built-in equivalents (or None if we are talking about function references).
+ For simple types this function returns Python built-in types and not only
+Python `str()` like |python-eval| does. On Python 3 it will return `bytes()`
+objects in place of `str()` ones avoiding possibility of UnicodeDecodeError.
+ Interface of new objects mimics standard Python `dict()` and `list()`
+interfaces to some extent. Extent will be improved in the future.
+
+Added special |python-vars| objects also available for |python-buffer| and
+|python-window|. They ease access to Vim script variables from Python.
+
+Now you no longer need to alter `sys.path` to import your module: special
+hooks are responsible for importing from {rtp}/python2, {rtp}/python3 and
+{rtp}/pythonx directories (for Python 2, Python 3 and both respectively).
+See |python-special-path|.
+
+Added possibility to work with |tabpage|s through |python-tabpage| object.
+
+Added automatic conversion of Vim errors and exceptions to Python
+exceptions.
+
+Changed the behavior of the |python-buffers| object: it now uses buffer numbers
+as keys in place of the index of the buffer in the internal buffer list.
+This should not break anything as the only way to get this index was
+iterating over |python-buffers|.
+
+Added |:pydo| and |:py3do| commands.
+
+Added the |pyeval()| and |py3eval()| functions.
+
+Now in all places which previously accepted `str()` objects, `str()` and
+`unicode()` (Python 2) or `bytes()` and `str()` (Python 3) are accepted.
+
+|python-window| has gained `.col` and `.row` attributes that are currently
+the only way to get internal window positions.
+
+Added or fixed support for `dir()` in Vim Python objects.
+
+
+Changed *changed-7.4*
+-------
+
+Old Python versions (≤2.2) are no longer supported. Building with them did
+not work anyway.
+
+Options:
+ Added ability to automatically save the selection into the system
+ clipboard when using non-GUI version of Vim (autoselectplus in
+ 'clipboard'). Also added ability to use the system clipboard as
+ default register (previously only primary selection could be used).
+ (Ivan Krasilnikov, Christian Brabandt, Bram Moolenaar)
+
+ Added a special 'shiftwidth' value that makes 'sw' follow 'tabstop'.
+ As indenting via 'indentexpr' became tricky |shiftwidth()| function
+ was added. Also added equivalent special value to 'softtabstop'
+ option. (Christian Brabandt, so8res)
+
+ Show absolute number in number column when 'relativenumber' option is
+ on. Now there are four combinations with 'number' and
+ 'relativenumber'. (Christian Brabandt)
+
+Commands:
+ |:diffoff| now saves the local values of some settings and restores
+ them in place of blindly resetting them to the defaults. (Christian
+ Brabandt)
+
+Other:
+ Lua interface now also uses userdata bound to Vim structures. (Taro
+ Muraoka, Luis Carvalho)
+
+ glob() and autocommand patterns used to work with the undocumented
+ "\{n,m\}" item from a regexp. "\{" is now used for a literal "{", as
+ this is normal in shell file patterns. Now used "\\\{n,m\}" to get
+ "\{n,m}" in the regexp pattern.
+
+Added *added-7.4*
+-----
+
+Various syntax, indent and other plugins were added.
+
+Added support for |Lists| and |Dictionaries| in |viminfo|. (Christian
+Brabandt)
+
+Functions:
+ Bitwise functions: |and()|, |or()|, |invert()|, |xor()|.
+
+ Added |luaeval()| function. (Taro Muraoka, Luis Carvalho)
+
+ Added |sha256()| function. (Tyru, Hirohito Higashi)
+
+ Added |wildmenumode()| function. (Christian Brabandt)
+
+ Debugging functions: |screenattr()|, |screenchar()|, |screencol()|,
+ |screenrow()|. (Simon Ruderich, Bram Moolenaar)
+
+ Added ability to use |Dictionary-function|s for |sort()|ing, via
+ optional third argument. (Nikolay Pavlov)
+
+ Added special |expand()| argument that expands to the current line
+ number.
+
+ Made it possible to force |char2nr()| to always give unicode codepoints
+ regardless of current encoding. (Yasuhiro Matsumoto)
+
+ Made it possible for functions generating file list generate |List|
+ and not NL-separated string. (e.g. |glob()|, |expand()|) (Christian
+ Brabandt)
+
+ Functions that obtain variables from the specific window, tabpage or
+ buffer scope dictionary can now return specified default value in
+ place of empty string in case variable is not found. (|gettabvar()|,
+ |getwinvar()|, |getbufvar()|) (Shougo Matsushita, Hirohito Higashi)
+
+Autocommands:
+ Added |InsertCharPre| event launched before inserting character.
+ (Jakson A. Aquino)
+
+ Added |CompleteDone| event launched after finishing completion in
+ insert mode. (idea by Florian Klein)
+
+ Added |QuitPre| event launched when commands that can either close Vim
+ or only some window(s) are launched.
+
+ Added |TextChanged| and |TextChangedI| events launched when text is
+ changed.
+
+Commands:
+ |:syntime| command useful for debugging.
+
+ Made it possible to remove all signs from the current buffer using
+ |:sign-unplace|. (Christian Brabandt)
+
+ Added |:language| autocompletion. (Dominique Pelle)
+
+ Added more |:command-complete| completion types: |:behave| suboptions,
+ color schemes, compilers, |:cscope| suboptions, files from 'path',
+ |:history| suboptions, locale names, |:syntime| suboptions, user
+ names. (Dominique Pelle)
+
+ Added |:map-nowait| creating mapping which when having lhs that is the
+ prefix of another mapping’s lhs will not allow Vim to wait for user to
+ type more characters to resolve ambiguity, forcing Vim to take the
+ shorter alternative: one with <nowait>.
+
+Options:
+ Made it possible to ignore case when completing: 'wildignorecase'.
+
+ Added ability to delete comment leader when using |J| by `j` flag in
+ 'formatoptions' (|fo-table|). (Lech Lorens)
+
+ Added ability to control indentation inside namespaces: |cino-N|.
+ (Konstantin Lepa)
+
+ Added ability to control alignment inside `if` condition separately
+ from alignment inside function arguments: |cino-k|. (Lech Lorens)
+
+Other:
+ Improved support for cmd.exe. (Ben Fritz, Bram Moolenaar)
+
+ Added |v:windowid| variable containing current window number in GUI
+ Vim. (Christian J. Robinson, Lech Lorens)
+
+ Added rxvt-unicode and SGR mouse support. (Yiding Jia, Hayaki Saito)
+
+
+All changes in 7.4 *fixed-7.4*
+------------------
+
+Patch 7.3.001
+Problem: When editing "src/main.c" and 'path' set to "./proto",
+ ":find e<C-D" shows ./proto/eval.pro instead of eval.pro.
+Solution: Check for path separator when comparing names. (Nazri Ramliy)
+Files: src/misc1.c
+
+Patch 7.3.002
+Problem: ":find" completion doesn't work when halfway an environment
+ variable. (Dominique Pelle)
+Solution: Only use in-path completion when expanding file names. (Nazri
+ Ramliy)
+Files: src/ex_docmd.c
+
+Patch 7.3.003
+Problem: Crash with specific BufWritePost autocmd. (Peter Odding)
+Solution: Don't free the quickfix title twice. (Lech Lorens)
+Files: src/quickfix.c
+
+Patch 7.3.004
+Problem: Crash when using very long regexp. (Peter Odding)
+Solution: Reset reg_toolong. (Carlo Teubner)
+Files: src/regexp.c
+
+Patch 7.3.005
+Problem: Crash when using undotree(). (Christian Brabandt)
+Solution: Increase the list reference count. Add a test for undotree()
+ (Lech Lorens)
+Files: src/eval.c, src/testdir/Makefile, src/testdir/test61.in
+
+Patch 7.3.006
+Problem: Can't build some multibyte code with C89.
+Solution: Move code to after declarations. (Joachim Schmitz)
+Files: src/mbyte.c, src/spell.c
+
+Patch 7.3.007
+Problem: Python code defines global "buffer". Re-implements a grow-array.
+Solution: Use a grow-array instead of coding the same functionality. Handle
+ out-of-memory situation properly.
+Files: src/if_py_both.h
+
+Patch 7.3.008
+Problem: 'cursorbind' is kept in places where 'scrollbind' is reset.
+Solution: Reset 'cursorbind'.
+Files: src/buffer.c, src/diff.c, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/if_cscope.c, src/macros.h,
+ src/quickfix.c, src/search.c, src/tag.c, src/window.c
+
+Patch 7.3.009
+Problem: Win32: Crash on Windows when using a bad argument for strftime().
+ (Christian Brabandt)
+Solution: Use the bad_param_handler(). (Mike Williams)
+Files: src/os_win32.c
+
+Patch 7.3.010
+Problem: Mac GUI: Missing break statements.
+Solution: Add the break statements. (Dominique Pelle)
+Files: src/gui_mac.c
+
+Patch 7.3.011
+Problem: X11 clipboard doesn't work in Athena/Motif GUI. First selection
+ after a shell command doesn't work.
+Solution: When using the GUI use XtLastTimestampProcessed() instead of
+ changing a property. (partly by Toni Ronkko)
+ When executing a shell command disown the selection.
+Files: src/ui.c, src/os_unix.c
+
+Patch 7.3.012
+Problem: Problems building with MingW.
+Solution: Adjust the MingW makefiles. (Jon Maken)
+Files: src/Make_ming.mak, src/GvimExt/Make_ming.mak
+
+Patch 7.3.013
+Problem: Dynamic loading with Ruby doesn't work for 1.9.2.
+Solution: Handle rb_str2cstr differently. Also support dynamic loading on
+ Unix. (Jon Maken)
+Files: src/if_ruby.c
+
+Patch 7.3.014
+Problem: Ending a line in a backslash inside an ":append" or ":insert"
+ command in Ex mode doesn't work properly. (Ray Frush)
+Solution: Halve the number of backslashes, only insert a NUL after an odd
+ number of backslashes.
+Files: src/ex_getln.c
+
+Patch 7.3.015
+Problem: Test is using error message that no longer exists.
+Solution: Change E106 to E121. (Dominique Pelle)
+Files: src/testdir/test49.vim
+
+Patch 7.3.016
+Problem: Netbeans doesn't work under Athena.
+Solution: Support Athena, just like Motif. (Xavier de Gaye)
+Files: runtime/doc/netbeans.txt, src/gui.c, src/main.c, src/netbeans.c
+
+Patch 7.3.017
+Problem: smatch reports errors.
+Solution: Fix the reported errors. (Dominique Pelle)
+Files: src/spell.c, src/syntax.c
+
+Patch 7.3.018 (after 7.3.012)
+Problem: Missing argument to windres in MingW makefiles.
+Solution: Add the argument that was wrapped in the patch. (Jon Maken)
+Files: src/Make_ming.mak, src/GvimExt/Make_ming.mak
+
+Patch 7.3.019
+Problem: ":nbstart" can fail silently.
+Solution: Give an error when netbeans is not supported by the GUI. (Xavier
+ de Gaye)
+Files: src/netbeans.c
+
+Patch 7.3.020
+Problem: Cursor position wrong when joining multiple lines and
+ 'formatoptions' contains "a". (Moshe Kamensky)
+Solution: Adjust cursor position for skipped indent. (Carlo Teubner)
+Files: src/ops.c, src/testdir/test68.in, src/testdir/test68.ok
+
+Patch 7.3.021
+Problem: Conflict for defining Boolean in Mac header files.
+Solution: Define NO_X11_INCLUDES. (Rainer Muller)
+Files: src/os_macosx.m, src/vim.h
+
+Patch 7.3.022
+Problem: When opening a new window the 'spellcapcheck' option is cleared.
+Solution: Copy the correct option value. (Christian Brabandt)
+Files: src/option.c
+
+Patch 7.3.023
+Problem: External program may hang when it tries to write to the tty.
+Solution: Don't close the slave tty until after the child exits. (Nikola
+ Knezevic)
+Files: src/os_unix.c
+
+Patch 7.3.024
+Problem: Named signs do not use a negative number as intended.
+Solution: Fix the numbering of named signs. (Xavier de Gaye)
+Files: src/ex_cmds.c
+
+Patch 7.3.025
+Problem: ":mksession" does not square brackets escape file name properly.
+Solution: Improve escaping of file names. (partly by Peter Odding)
+Files: src/ex_docmd.c
+
+Patch 7.3.026
+Problem: CTRL-] in a help file doesn't always work. (Tony Mechelynck)
+Solution: Don't escape special characters. (Carlo Teubner)
+Files: src/normal.c
+
+Patch 7.3.027
+Problem: Opening a file on a network share is very slow.
+Solution: When fixing file name case append "\*" to directory, server and
+ network share names. (David Anderson, John Beckett)
+Files: src/os_win32.c
+
+Patch 7.3.028 (after 7.3.024)
+Problem: Signs don't show up. (Charles Campbell)
+Solution: Don't use negative numbers. Also assign a number to signs that
+ have a name of all digits to avoid using a sign number twice.
+Files: src/ex_cmds.c
+
+Patch 7.3.029
+Problem: ":sort n" sorts lines without a number as number zero. (Beeyawned)
+Solution: Make lines without a number sort before lines with a number. Also
+ fix sorting negative numbers.
+Files: src/ex_cmds.c, src/testdir/test57.in, src/testdir/test57.ok
+
+Patch 7.3.030
+Problem: Cannot store Dict and List in viminfo file.
+Solution: Add support for this. (Christian Brabandt)
+Files: runtime/doc/options.txt, src/eval.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/main.aap, src/testdir/test74.in,
+ src/testdir/test74.ok
+
+Patch 7.3.031
+Problem: Can't pass the X window ID to another application.
+Solution: Add v:windowid. (Christian J. Robinson, Lech Lorens)
+Files: runtime/doc/eval.txt, src/eval.c, src/gui.c, src/vim.h,
+ src/os_unix.c
+
+Patch 7.3.032
+Problem: maparg() doesn't return the flags, such as <buffer>, <script>,
+ <silent>. These are needed to save and restore a mapping.
+Solution: Improve maparg(). (also by Christian Brabandt)
+Files: runtime/doc/eval.txt, src/eval.c, src/getchar.c, src/gui_w48.c,
+ src/message.c, src/proto/getchar.pro, src/proto/message.pro,
+ src/structs.h src/testdir/test75.in, src/testdir/test75.ok
+
+Patch 7.3.033 (after 7.3.032)
+Problem: Can't build without FEAT_LOCALMAP.
+Solution: Add an #ifdef. (John Marriott)
+Files: src/getchar.c
+
+Patch 7.3.034
+Problem: Win32: may be loading .dll from the wrong directory.
+Solution: Go to the Vim executable directory when opening a library.
+Files: src/gui_w32.c, src/if_lua.c, src/if_mzsch.c, src/if_perl.xs,
+ src/if_python.c, src/if_python3.c, src/if_ruby.c, src/mbyte.c,
+ src/os_mswin.c, src/os_win32.c, src/proto/os_win32.pro
+
+Patch 7.3.035 (after 7.3.034)
+Problem: Stray semicolon after if statement. (Hari G)
+Solution: Remove the semicolon.
+Files: src/os_win32.c
+
+Patch 7.3.036
+Problem: Win32 GUI: When building without menus, the font for dialogs and
+ tab page headers also changes.
+Solution: Define USE_SYSMENU_FONT always. (Harig G.)
+Files: src/gui_w32.c
+
+Patch 7.3.037
+Problem: Compiler warnings for loss of data. (Mike Williams)
+Solution: Add type casts.
+Files: src/if_py_both.h, src/getchar.c, src/os_win32.c
+
+Patch 7.3.038
+Problem: v:windowid isn't set on MS-Windows.
+Solution: Set it to the window handle. (Chris Sutcliffe)
+Files: runtime/doc/eval.txt, src/gui_w32.c
+
+Patch 7.3.039
+Problem: Crash when using skk.vim plugin.
+Solution: Get length of expression evaluation result only after checking for
+ NULL. (Noriaki Yagi, Dominique Pelle)
+Files: src/ex_getln.c
+
+Patch 7.3.040
+Problem: Comparing strings while ignoring case goes beyond end of the
+ string when there are illegal bytes. (Dominique Pelle)
+Solution: Explicitly check for illegal bytes.
+Files: src/mbyte.c
+
+Patch 7.3.041
+Problem: Compiler warning for accessing mediumVersion. (Tony Mechelynck)
+Solution: Use the pointer instead of the array itself. (Dominique Pelle)
+Files: src/version.c
+
+Patch 7.3.042
+Problem: No spell highlighting when re-using an empty buffer.
+Solution: Clear the spell checking info only when clearing the options for a
+ buffer. (James Vega)
+Files: src/buffer.c
+
+Patch 7.3.043
+Problem: Can't load Ruby dynamically on Unix.
+Solution: Adjust the configure script. (James Vega)
+Files: src/Makefile, src/config.h.in, src/configure.in,
+ src/auto/configure, src/if_ruby.c
+
+Patch 7.3.044
+Problem: The preview window opened by the popup menu is larger than
+ specified with 'previewheight'. (Benjamin Haskell)
+Solution: Use 'previewheight' if it's set and smaller.
+Files: src/popupmnu.c
+
+Patch 7.3.045
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize the variable always.
+Files: src/getchar.c
+
+Patch 7.3.046 (after 7.3.043)
+Problem: Can't build Ruby on MS-Windows.
+Solution: Add #ifdef, don't use WIN3264 before including vim.h.
+Files: src/if_ruby.c
+
+Patch 7.3.047 (after 7.3.032)
+Problem: Missing makefile updates for test 75.
+Solution: Update the makefiles.
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Makefile, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.3.048
+Problem: ":earlier 1f" doesn't work after loading undo file.
+Solution: Set b_u_save_nr_cur when loading an undo file. (Christian
+ Brabandt)
+ Fix only showing time in ":undolist"
+Files: src/undo.c
+
+Patch 7.3.049
+Problem: PLT has rebranded their Scheme to Racket.
+Solution: Add support for Racket 5.x. (Sergey Khorev)
+Files: src/Make_cyg.mak, src/Make_ming.mak, src/Make_mvc.mak,
+ src/auto/configure, src/configure.in, src/if_mzsch.c
+
+Patch 7.3.050
+Problem: The link script is clumsy.
+Solution: Use the --as-needed linker option if available. (Kirill A.
+ Shutemov)
+Files: src/Makefile, src/auto/configure, src/config.mk.in,
+ src/configure.in, src/link.sh
+
+Patch 7.3.051
+Problem: Crash when $PATH is empty.
+Solution: Check for vim_getenv() returning NULL. (Yasuhiro Matsumoto)
+Files: src/ex_getln.c, src/os_win32.c
+
+Patch 7.3.052
+Problem: When 'completefunc' opens a new window all kinds of errors follow.
+ (Xavier Deguillard)
+Solution: When 'completefunc' goes to another window or buffer and when it
+ deletes text abort completion. Add a test for 'completefunc'.
+Files: src/edit.c, src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test76.in, src/testdir/test76.ok
+
+Patch 7.3.053
+Problem: complete() function doesn't reset complete direction. Can't use
+ an empty string in the list of matches.
+Solution: Set compl_direction to FORWARD. Add "empty" key to allow empty
+ words. (Kikuchan)
+Files: src/edit.c
+
+Patch 7.3.054
+Problem: Can define a user command for :Print, but it doesn't work. (Aaron
+ Thoma)
+Solution: Let user command :Print overrule the builtin command (Christian
+ Brabandt) Disallow :X and :Next as a user defined command.
+Files: src/ex_docmd.c
+
+Patch 7.3.055
+Problem: Recursively nested lists and dictionaries cause a near-endless
+ loop when comparing them with a copy. (ZyX)
+Solution: Limit recursiveness in a way that non-recursive structures can
+ still be nested very deep.
+Files: src/eval.c, src/testdir/test55.in, src/testdir/test55.ok
+
+Patch 7.3.056
+Problem: "getline" argument in do_cmdline() shadows global.
+Solution: Rename the argument.
+Files: src/ex_docmd.c
+
+Patch 7.3.057
+Problem: Segfault with command line abbreviation. (Randy Morris)
+Solution: Don't retrigger the abbreviation when abandoning the command line.
+ Continue editing the command line after the error.
+Files: src/ex_getln.c
+
+Patch 7.3.058
+Problem: Error "code converter not found" when loading Ruby script.
+Solution: Load Gem module. (Yasuhiro Matsumoto)
+Files: src/if_ruby.c
+
+Patch 7.3.059
+Problem: Netbeans: Problem with recursively handling messages for Athena
+ and Motif.
+Solution: Call netbeans_parse_messages() in the main loop, like it's done
+ for GTK. (Xavier de Gaye)
+Files: src/gui_x11.c, src/netbeans.c
+
+Patch 7.3.060
+Problem: Netbeans: crash when socket is disconnected unexpectedly.
+Solution: Don't cleanup when a read fails, put a message in the queue and
+ disconnect later. (Xavier de Gaye)
+Files: src/netbeans.c
+
+Patch 7.3.061
+Problem: Remote ":drop" does not respect 'autochdir'. (Peter Odding)
+Solution: Don't restore the directory when 'autochdir' is set. (Benjamin
+ Fritz)
+Files: src/main.c
+
+Patch 7.3.062
+Problem: Python doesn't work properly when installed in another directory
+ than expected.
+Solution: Figure out home directory in configure and use Py_SetPythonHome()
+ at runtime. (Roland Puntaier)
+Files: src/configure.in, src/auto/configure, src/if_python.c,
+ src/if_python3.c
+
+Patch 7.3.063
+Problem: Win32: Running a filter command makes Vim lose focus.
+Solution: Use SW_SHOWMINNOACTIVE instead of SW_SHOWMINIMIZED. (Hong Xu)
+Files: src/os_win32.c
+
+Patch 7.3.064
+Problem: Win32: ":dis +" shows nothing, but "+p does insert text.
+Solution: Display the * register, since that's what will be inserted.
+ (Christian Brabandt)
+Files: src/globals.h, src/ops.c
+
+Patch 7.3.065
+Problem: Can't get current line number in a source file.
+Solution: Add the <slnum> item, similar to <sfile>.
+Files: src/ex_docmd.c
+
+Patch 7.3.066
+Problem: Crash when changing to another window while in a :vimgrep command.
+ (Christian Brabandt)
+Solution: When wiping out the dummy before, remove it from aucmd_win.
+Files: src/quickfix.c
+
+Patch 7.3.067 (after 7.3.058)
+Problem: Ruby: Init_prelude is not always available.
+Solution: Remove use of Init_prelude. (Yasuhiro Matsumoto)
+Files: src/if_ruby.c
+
+Patch 7.3.068
+Problem: Using freed memory when doing ":saveas" and an autocommand sets
+ 'autochdir'. (Kevin Klement)
+Solution: Get the value of fname again after executing autocommands.
+Files: src/ex_cmds.c
+
+Patch 7.3.069
+Problem: GTK: pressing Enter in inputdialog() doesn't work like clicking OK
+ as documented.
+Solution: call gtk_entry_set_activates_default(). (Britton Kerin)
+Files: src/gui_gtk.c
+
+Patch 7.3.070
+Problem: Can set environment variables in the sandbox, could be abused.
+Solution: Disallow it.
+Files: src/eval.c
+
+Patch 7.3.071
+Problem: Editing a file in a window that's in diff mode resets 'diff'
+ but not cursor binding.
+Solution: Reset cursor binding in two more places.
+Files: src/quickfix.c, src/option.c
+
+Patch 7.3.072
+Problem: Can't complete file names while ignoring case.
+Solution: Add 'wildignorecase'.
+Files: src/ex_docmd.c, src/ex_getln.c, src/misc1.c, src/option.c,
+ src/option.h, src/vim.h, src/runtime/options.txt
+
+Patch 7.3.073
+Problem: Double free memory when netbeans command follows DETACH.
+Solution: Only free the node when owned. (Xavier de Gaye)
+Files: src/netbeans.c
+
+Patch 7.3.074
+Problem: Can't use the "+ register like "* for yank and put.
+Solution: Add "unnamedplus" to the 'clipboard' option. (Ivan Krasilnikov)
+Files: runtime/doc/options.txt, src/eval.c, src/globals.h, src/ops.c,
+ src/option.c
+
+Patch 7.3.075 (after 7.3.072)
+Problem: Missing part of 'wildignorecase'
+Solution: Also adjust expand()
+Files: src/eval.c
+
+Patch 7.3.076
+Problem: Clang warnings for dead code.
+Solution: Remove it. (Carlo Teubner)
+Files: src/gui_gtk.c, src/if_ruby.c, src/misc2.c, src/netbeans.c,
+ src/spell.c
+
+Patch 7.3.077
+Problem: When updating crypt of swapfile fails there is no error message.
+ (Carlo Teubner)
+Solution: Add the error message.
+Files: src/memline.c
+
+Patch 7.3.078
+Problem: Warning for unused variable.
+Solution: Adjust #ifdefs.
+Files: src/ops.c
+
+Patch 7.3.079
+Problem: Duplicate lines in makefile.
+Solution: Remove the lines. (Hong Xu)
+Files: src/Make_mvc.mak
+
+Patch 7.3.080
+Problem: Spell doesn't work on VMS.
+Solution: Use different file names. (Zoltan Bartos, Zoltan Arpadffy)
+Files: src/spell.c
+
+Patch 7.3.081
+Problem: Non-printable characters in 'statusline' cause trouble. (ZyX)
+Solution: Use transstr(). (partly by Caio Ariede)
+Files: src/screen.c
+
+Patch 7.3.082
+Problem: Leaking file descriptor when hostname doesn't exist.
+Solution: Remove old debugging lines.
+Files: src/netbeans.c
+
+Patch 7.3.083
+Problem: When a read() or write() is interrupted by a signal it fails.
+Solution: Add read_eintr() and write_eintr().
+Files: src/fileio.c, src/proto/fileio.pro, src/memfile.c, src/memline.c,
+ src/os_unix.c, src/undo.c, src/vim.h
+
+Patch 7.3.084
+Problem: When splitting the window, the new one scrolls with the cursor at
+ the top.
+Solution: Compute w_fraction before setting the new height.
+Files: src/window.c
+
+Patch 7.3.085 (after 7.3.083)
+Problem: Inconsistency with preproc symbols. void * computation.
+Solution: Include vimio.h from vim.h. Add type cast.
+Files: src/eval.c, src/ex_cmds.c, src/ex_cmds2.c, src/fileio.c,
+ src/if_cscope.c, src/if_sniff.c, src/main.c, src/memfile.c,
+ src/memline.c, src/netbeans.c, src/os_msdos.c, src/os_mswin.c,
+ src/os_win16.c, src/os_win32.c, src/spell.c, src/tag.c,
+ src/undo.c, src/vim.h
+
+Patch 7.3.086
+Problem: When using a mapping with an expression and there was no count,
+ v:count has the value of the previous command. (ZyX)
+Solution: Also set v:count and v:count1 before getting the character that
+ could be a command or a count.
+Files: src/normal.c
+
+Patch 7.3.087
+Problem: EINTR is not always defined.
+Solution: Include errno.h in vim.h.
+Files: src/if_cscope.c, src/if_tcl.c, src/integration.c, src/memline.c,
+ src/os_mswin.c, src/os_win16.c, src/os_win32.c, src/vim.h,
+ src/workshop.c
+
+Patch 7.3.088
+Problem: Ruby can't load Gems sometimes, may cause a crash.
+Solution: Undefine off_t. Use ruby_process_options(). (Yasuhiro Matsumoto)
+Files: src/if_ruby.c
+
+Patch 7.3.089
+Problem: Compiler warning on 64 bit MS-Windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/netbeans.c
+
+Patch 7.3.090
+Problem: Wrong help text for Cscope.
+Solution: Adjust the help text for "t". (Dominique Pelle)
+Files: src/if_cscope.c
+
+Patch 7.3.091
+Problem: "vim -w foo" writes special key codes for removed escape
+ sequences. (Josh Triplett)
+Solution: Don't write K_IGNORE codes.
+Files: src/getchar.c, src/misc1.c, src/term.c, src/vim.h
+
+Patch 7.3.092
+Problem: Resizing the window when exiting.
+Solution: Don't resize when exiting.
+Files: src/term.c
+
+Patch 7.3.093
+Problem: New DLL dependencies in MingW with gcc 4.5.0.
+Solution: Add STATIC_STDCPLUS, LDFLAGS and split up WINDRES. (Guopeng Wen)
+Files: src/GvimExt/Make_ming.mak, src/Make_ming.mak
+
+Patch 7.3.094
+Problem: Using abs() requires type cast to int.
+Solution: Use labs() so that the value remains long. (Hong Xu)
+Files: src/screen.c
+
+Patch 7.3.095
+Problem: Win32: In Chinese tear-off menu doesn't work. (Weasley)
+Solution: Use menu_name_equal(). (Alex Jakushev)
+Files: src/menu.c
+
+Patch 7.3.096
+Problem: "gvim -nb" is not interruptible. Leaking file descriptor on
+ netbeans connection error.
+Solution: Check for CTRL-C typed. Free file descriptor. (Xavier de Gaye)
+Files: src/netbeans.c
+
+Patch 7.3.097
+Problem: Using ":call" inside "if 0" does not see that a function returns a
+ Dict and gives error for "." as string concatenation.
+Solution: Use eval0() to skip over the expression. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.3.098
+Problem: Function that ignores error still causes called_emsg to be set.
+ E.g. when expand() fails the status line is disabled.
+Solution: Move check for emsg_not_now() up. (James Vega)
+Files: src/message.c
+
+Patch 7.3.099
+Problem: Crash when splitting a window with zero height. (Yukihiro
+ Nakadaira)
+Solution: Don't set the fraction in a window with zero height.
+Files: src/window.c
+
+Patch 7.3.100
+Problem: When using :normal v:count isn't set.
+Solution: Call normal_cmd() with toplevel set to TRUE.
+Files: src/ex_docmd.c
+
+Patch 7.3.101
+Problem: ino_t defined with wrong size.
+Solution: Move including auto/config.h before other includes. (Marius
+ Geminas)
+Files: src/if_ruby.c, src/if_lua.c
+
+Patch 7.3.102
+Problem: When using ":make", typing the next command and then getting the
+ "reload" prompt the next command is (partly) eaten by the reload
+ prompt.
+Solution: Accept ':' as a special character at the reload prompt to accept
+ the default choice and execute the command.
+Files: src/eval.c, src/fileio.c, src/gui.c, src/gui_xmdlg.c,
+ src/memline.c, src/message.c, src/proto/message.pro,
+ src/gui_athena.c, src/gui_gtk.c, src/gui_mac.c, src/gui_motif.c,
+ src/gui_photon.c, src/gui_w16.c, src/gui_w32.c, src/os_mswin.c
+ src/proto/gui_athena.pro, src/proto/gui_gtk.pro,
+ src/proto/gui_mac.pro, src/proto/gui_motif.pro,
+ src/proto/gui_photon.pro, src/proto/gui_w16.pro,
+ src/proto/gui_w32.pro
+
+Patch 7.3.103
+Problem: Changing 'fileformat' and then using ":w" in an empty file sets
+ the 'modified' option.
+Solution: In unchanged() don't ignore 'ff' for an empty file.
+Files: src/misc1.c, src/option.c, src/proto/option.pro, src/undo.c
+
+Patch 7.3.104
+Problem: Conceal: using Tab for cchar causes problems. (ZyX)
+Solution: Do not accept a control character for cchar.
+Files: src/syntax.c
+
+Patch 7.3.105
+Problem: Can't get the value of "b:changedtick" with getbufvar().
+Solution: Make it work. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.3.106
+Problem: When 'cursorbind' is set another window may scroll unexpectedly
+ when 'scrollbind' is also set. (Xavier Wang)
+Solution: Don't call update_topline() if 'scrollbind' is set.
+Files: src/move.c
+
+Patch 7.3.107
+Problem: Year number for :undolist can be confused with month or day.
+Solution: Change "%y" to "%Y".
+Files: src/undo.c
+
+Patch 7.3.108
+Problem: Useless check for NULL when calling vim_free().
+Solution: Remove the check. (Dominique Pelle)
+Files: src/eval.c, src/ex_cmds.c, src/os_win32.c
+
+Patch 7.3.109
+Problem: Processing new Esperanto spell file fails and crashes Vim.
+ (Dominique Pelle)
+Solution: When running out of memory give an error. Handle '?' in
+ COMPOUNDRULE properly.
+Files: src/spell.c
+
+Patch 7.3.110
+Problem: The "nbsp" item in 'listchars' isn't used for ":list".
+Solution: Make it work. (Christian Brabandt)
+Files: src/message.c
+
+Patch 7.3.111 (after 7.3.100)
+Problem: Executing a :normal command in 'statusline' evaluation causes the
+ cursor to move. (Dominique Pelle)
+Solution: When updating the cursor for 'cursorbind' allow the cursor beyond
+ the end of the line. When evaluating 'statusline' temporarily
+ reset 'cursorbind'.
+Files: src/move.c, src/screen.c
+
+Patch 7.3.112
+Problem: Setting 'statusline' to "%!'asdf%' reads uninitialized memory.
+Solution: Check for NUL after %.
+Files: src/buffer.c
+
+Patch 7.3.113
+Problem: Windows: Fall back directory for creating temp file is wrong.
+Solution: Use "." instead of empty string. (Hong Xu)
+Files: src/fileio.c
+
+Patch 7.3.114
+Problem: Potential problem in initialization when giving an error message
+ early.
+Solution: Initialize 'verbosefile' empty. (Ben Schmidt)
+Files: src/option.h
+
+Patch 7.3.115
+Problem: Vim can crash when tmpnam() returns NULL.
+Solution: Check for NULL. (Hong Xu)
+Files: src/fileio.c
+
+Patch 7.3.116
+Problem: 'cursorline' is displayed too short when there are concealed
+ characters and 'list' is set. (Dennis Preiser)
+Solution: Check for 'cursorline' when 'list' is set. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.3.117
+Problem: On some systems --as-needed does not work, because the "tinfo"
+ library is included indirectly from "ncurses". (Charles Campbell)
+Solution: In configure prefer using "tinfo" instead of "ncurses".
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.118
+Problem: Ruby uses SIGVTALARM which makes Vim exit. (Alec Tica)
+Solution: Ignore SIGVTALARM. (Dominique Pelle)
+Files: src/os_unix.c
+
+Patch 7.3.119
+Problem: Build problem on Mac. (Nicholas Stallard)
+Solution: Use "extern" instead of "EXTERN" for p_vfile.
+Files: src/option.h
+
+Patch 7.3.120
+Problem: The message for an existing swap file is too long to fit in a 25
+ line terminal.
+Solution: Make the message shorter. (Chad Miller)
+Files: src/memline.c
+
+Patch 7.3.121
+Problem: Complicated 'statusline' causes a crash. (Christian Brabandt)
+Solution: Check that the number of items is not too big.
+Files: src/buffer.c
+
+Patch 7.3.122
+Problem: Having auto/config.mk in the repository causes problems.
+Solution: Remove auto/config.mk from the distribution. In the toplevel
+ Makefile copy it from the "dist" file.
+Files: Makefile, src/Makefile, src/auto/config.mk
+
+Patch 7.3.123
+Problem: ml_get error when executing register being recorded into, deleting
+ lines and 'conceallevel' is set. (ZyX)
+Solution: Don't redraw a line for concealing when it doesn't exist.
+Files: src/main.c
+
+Patch 7.3.124
+Problem: When writing a file in binary mode it may be missing the final EOL
+ if a file previously read was missing the EOL. (Kevin Goodsell)
+Solution: Move the write_no_eol_lnum into the buffer struct.
+Files: src/structs.h, src/fileio.c, src/globals.h, src/os_unix.c
+
+Patch 7.3.125
+Problem: MSVC: Problem with quotes in link argument.
+Solution: Escape backslashes and quotes. (Weasley)
+Files: src/Make_mvc.mak
+
+Patch 7.3.126
+Problem: Compiler warning for signed pointer.
+Solution: Use unsigned int argument for sscanf().
+Files: src/blowfish.c
+
+Patch 7.3.127
+Problem: Compiler complains about comma.
+Solution: Remove comma after last enum element.
+Files: src/ex_cmds2.c
+
+Patch 7.3.128
+Problem: Another compiler warning for signed pointer.
+Solution: Use unsigned int argument for sscanf().
+Files: src/mark.c
+
+Patch 7.3.129
+Problem: Using integer like a boolean.
+Solution: Nicer check for integer being non-zero.
+Files: src/tag.c
+
+Patch 7.3.130
+Problem: Variable misplaced in #ifdef.
+Solution: Move clipboard_event_time outside of #ifdef.
+Files: src/gui_gtk_x11.c
+
+Patch 7.3.131
+Problem: Including errno.h too often.
+Solution: Don't include errno.h in Unix header file.
+Files: src/os_unix.h
+
+Patch 7.3.132
+Problem: C++ style comments.
+Solution: Change to C comments.
+Files: src/if_python3.c
+
+Patch 7.3.133
+Problem: When using encryption it's not clear what method was used.
+Solution: In the file message show "blowfish" when using blowfish.
+Files: src/fileio.c
+
+Patch 7.3.134
+Problem: Drag-n-drop doesn't work in KDE Dolphin.
+Solution: Add GDK_ACTION_MOVE flag. (Florian Degner)
+Files: src/gui_gtk_x11.c
+
+Patch 7.3.135
+Problem: When there is no previous substitute pattern, the previous search
+ pattern is used. The other way around doesn't work.
+Solution: When there is no previous search pattern, use the previous
+ substitute pattern if possible. (Christian Brabandt)
+Files: src/search.c
+
+Patch 7.3.136
+Problem: Duplicate include of assert.h.
+Solution: Remove it.
+Files: src/if_cscope.c
+
+Patch 7.3.137 (after 7.3.091)
+Problem: When 'lazyredraw' is set the screen may not be updated. (Ivan
+ Krasilnikov)
+Solution: Call update_screen() before waiting for input.
+Files: src/misc1.c, src/getchar.c
+
+Patch 7.3.138
+Problem: ":com" changes the multibyte text of :echo. (Dimitar Dimitrov)
+Solution: Search for K_SPECIAL as a byte, not a character. (Ben Schmidt)
+Files: src/ex_docmd.c
+
+Patch 7.3.139 (after 7.3.137)
+Problem: When 'lazyredraw' is set ":ver" output can't be read.
+Solution: Don't redraw the screen when at a prompt or command line.
+Files: src/getchar.c, src/message.c, src/misc1.c
+
+Patch 7.3.140
+Problem: Crash when drawing the "$" at end-of-line for list mode just after
+ the window border and 'cursorline' is set.
+Solution: Don't check for 'cursorline'. (Quentin Carbonneaux)
+Files: src/screen.c
+
+Patch 7.3.141
+Problem: When a key code is not set get a confusing error message.
+Solution: Change the error message to say the key code is not set.
+Files: src/option.c, runtime/doc/options.txt
+
+Patch 7.3.142
+Problem: Python stdout doesn't have a flush() method, causing an import to
+ fail.
+Solution: Add a dummy flush() method. (Tobias Columbus)
+Files: src/if_py_both.h
+
+Patch 7.3.143
+Problem: Memfile is not tested sufficiently. Looking up blocks in a
+ memfile is slow when there are many blocks.
+Solution: Add high level test and unittest. Adjust the number of hash
+ buckets to the number of blocks. (Ivan Krasilnikov)
+Files: Filelist, src/Makefile, src/main.c, src/memfile.c,
+ src/memfile_test.c src/structs.h src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mak,
+ src/testdir/Makefile, src/testdir/test77.in, src/testdir/test77.ok
+
+Patch 7.3.144
+Problem: Crash with ":python help(dir)". (Kearn Holliday)
+Solution: Fix the way the type is set on objects. (Tobias Columbus)
+Files: src/if_python.c
+
+Patch 7.3.145 (after 7.3.144)
+Problem: Can't build with Python dynamically loading.
+Solution: Add dll_PyType_Ready.
+Files: src/if_python.c
+
+Patch 7.3.146
+Problem: It's possible to assign to a read-only member of a dict.
+ It's possible to create a global variable "0". (ZyX)
+ It's possible to add a v: variable with ":let v:.name = 1".
+Solution: Add check for dict item being read-only.
+ Check the name of g: variables.
+ Disallow adding v: variables.
+Files: src/eval.c
+
+Patch 7.3.147 (after 7.3.143)
+Problem: Can't build on HP-UX.
+Solution: Remove an unnecessary backslash. (John Marriott)
+Files: src/Makefile
+
+Patch 7.3.148
+Problem: A syntax file with a huge number of items or clusters causes weird
+ behavior, a hang or a crash. (Yukihiro Nakadaira)
+Solution: Check running out of IDs. (partly by Ben Schmidt)
+Files: src/syntax.c
+
+Patch 7.3.149
+Problem: The cursor disappears after the processing of the 'setDot'
+ netbeans command when vim runs in a terminal.
+Solution: Show the cursor after a screen update. (Xavier de Gaye)
+Files: src/netbeans.c
+
+Patch 7.3.150
+Problem: readline() does not return the last line when the NL is missing.
+ (Hong Xu)
+Solution: When at the end of the file Also check for a previous line.
+Files: src/eval.c
+
+Patch 7.3.151 (after 7.3.074)
+Problem: When "unnamedplus" is in 'clipboard' the selection is sometimes
+ also copied to the star register.
+Solution: Avoid copy to the star register when undesired. (James Vega)
+Files: src/ops.c
+
+Patch 7.3.152
+Problem: Xxd does not check for errors from library functions.
+Solution: Add error checks. (Florian Zumbiehl)
+Files: src/xxd/xxd.c
+
+Patch 7.3.153 (after 7.3.152)
+Problem: Compiler warning for ambiguous else, missing prototype.
+Solution: Add braces. (Dominique Pelle) Add prototype for die().
+Files: src/xxd/xxd.c
+
+Patch 7.3.154 (after 7.3.148)
+Problem: Can't compile with tiny features. (Tony Mechelynck)
+Solution: Move #define outside of #ifdef.
+Files: src/syntax.c
+
+Patch 7.3.155
+Problem: Crash when using map(), filter() and remove() on v:. (ZyX)
+ Also for extend(). (Yukihiro Nakadaira)
+Solution: Mark v: as locked. Also correct locking error messages.
+Files: src/eval.c
+
+Patch 7.3.156
+Problem: Tty names possibly left unterminated.
+Solution: Use vim_strncpy() instead of strncpy().
+Files: src/pty.c
+
+Patch 7.3.157
+Problem: Superfluous assignment.
+Solution: Remove assignment.
+Files: src/misc1.c
+
+Patch 7.3.158
+Problem: Might use uninitialized memory in C indenting.
+Solution: Init arrays to empty.
+Files: src/misc1.c
+
+Patch 7.3.159
+Problem: Using uninitialized pointer when out of memory.
+Solution: Check for NULL return value.
+Files: src/mbyte.c
+
+Patch 7.3.160
+Problem: Unsafe string copying.
+Solution: Use vim_strncpy() instead of strcpy(). Use vim_strcat() instead
+ of strcat().
+Files: src/buffer.c, src/ex_docmd.c, src/hardcopy.c, src/menu.c,
+ src/misc1.c, src/misc2.c, src/proto/misc2.pro, src/netbeans.c,
+ src/os_unix.c, src/spell.c, src/syntax.c, src/tag.c
+
+Patch 7.3.161
+Problem: Items on the stack may be too big.
+Solution: Make items static or allocate them.
+Files: src/eval.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/fileio.c, src/hardcopy.c, src/quickfix.c, src/main.c,
+ src/netbeans.c, src/spell.c, src/tag.c, src/vim.h, src/xxd/xxd.c
+
+Patch 7.3.162
+Problem: No error message when assigning to a list with an index out of
+ range. (Yukihiro Nakadaira)
+Solution: Add the error message.
+Files: src/eval.c
+
+Patch 7.3.163
+Problem: For the default of 'shellpipe' "mksh" and "pdksh" are not
+ recognized.
+Solution: Recognize these shell names.
+Files: src/option.c
+
+Patch 7.3.164
+Problem: C-indenting: a preprocessor statement confuses detection of a
+ function declaration.
+Solution: Ignore preprocessor lines. (Lech Lorens) Also recognize the style
+ to put a comma before the argument name.
+Files: src/misc1.c, testdir/test3.in, testdir/test3.ok
+
+Patch 7.3.165
+Problem: ":find" completion does not escape spaces in a directory name.
+ (Isz)
+Solution: Add backslashes for EXPAND_FILES_IN_PATH. (Carlo Teubner)
+Files: src/ex_getln.c
+
+Patch 7.3.166
+Problem: Buffer on the stack may be too big
+Solution: Allocate the space.
+Files: src/option.c
+
+Patch 7.3.167
+Problem: When using the internal grep QuickFixCmdPost is not triggered.
+ (Yukihiro Nakadaira)
+Solution: Change the place where autocommands are triggered.
+Files: src/quickfix.c
+
+Patch 7.3.168
+Problem: When the second argument of input() contains a CR the text up to
+ that is used without asking the user. (Yasuhiro Matsumoto)
+Solution: Change CR, NL and ESC in the text to a space.
+Files: src/getchar.c
+
+Patch 7.3.169
+Problem: Freeing memory already freed, warning from static code analyzer.
+Solution: Initialize pointers to NULL, correct use of "mustfree". (partly by
+ Dominique Pelle)
+Files: src/mis1.c
+
+Patch 7.3.170
+Problem: VMS Makefile for testing was not updated for test77.
+Solution: Add test77 to the Makefile.
+Files: src/testdir/Make_vms.mms
+
+Patch 7.3.171
+Problem: When the clipboard isn't supported: ":yank*" gives a confusing
+ error message.
+Solution: Specifically mention that the register name is invalid.
+ (Jean-Rene David)
+Files: runtime/doc/change.txt, src/ex_docmd.c, src/globals.h
+
+Patch 7.3.172
+Problem: MS-Windows: rename() might delete the file if the name differs but
+ it's actually the same file.
+Solution: Use the file handle to check if it's the same file. (Yukihiro
+ Nakadaira)
+Files: src/if_cscope.c, src/fileio.c, src/os_win32.c,
+ src/proto/os_win32.pro, src/vim.h
+
+Patch 7.3.173
+Problem: After using setqflist() to make the quickfix list empty ":cwindow"
+ may open the window anyway. Also after ":vimgrep".
+Solution: Correctly check whether the list is empty. (Ingo Karkat)
+Files: src/quickfix.c
+
+Patch 7.3.174
+Problem: When Exuberant ctags binary is exctags it's not found.
+Solution: Add configure check for exctags. (Hong Xu)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.175
+Problem: When 'colorcolumn' is set locally to a window, ":new" opens a
+ window with the same highlighting but 'colorcolumn' is empty.
+ (Tyru)
+Solution: Call check_colorcolumn() after clearing and copying options.
+ (Christian Brabandt)
+Files: src/buffer.c
+
+Patch 7.3.176
+Problem: Ruby linking doesn't work properly on Mac OS X.
+Solution: Fix the configure check for Ruby. (Bjorn Winckler)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.177
+Problem: MS-Windows: mkdir() doesn't work properly when 'encoding' is
+ "utf-8".
+Solution: Convert to utf-16. (Yukihiro Nakadaira)
+Files: src/os_win32.c, src/os_win32.h, src/proto/os_win32.pro
+
+Patch 7.3.178
+Problem: C-indent doesn't handle code right after { correctly.
+Solution: Fix detecting unterminated line. (Lech Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.179
+Problem: C-indent doesn't handle colon in string correctly.
+Solution: Skip the string. (Lech Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.180
+Problem: When both a middle part of 'comments' matches and an end part, the
+ middle part was used erroneously.
+Solution: After finding the middle part match continue looking for a better
+ end part match. (partly by Lech Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.181
+Problem: When repeating the insert of CTRL-V or a digraph the display may
+ not be updated correctly.
+Solution: Only call edit_unputchar() after edit_putchar(). (Lech Lorens)
+Files: src/edit.c
+
+Patch 7.3.182 (after 7.3.180)
+Problem: Compiler warning for uninitialized variable.
+Solution: Add dummy initializer.
+Files: src/misc1.c
+
+Patch 7.3.183 (after 7.3.174)
+Problem: When Exuberant ctags binary is exuberant-ctags it's not found.
+Solution: Add configure check for exuberant-ctags.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.184
+Problem: Static code analysis errors in riscOS.
+Solution: Make buffer size bigger. (Dominique Pelle)
+Files: src/gui_riscos.c
+
+Patch 7.3.185
+Problem: ":windo g/pattern/q" closes windows and reports "N more lines".
+ (Tim Chase)
+Solution: Remember what buffer ":global" started in. (Jean-Rene David)
+Files: src/ex_cmds.c
+
+Patch 7.3.186
+Problem: When 'clipboard' contains "unnamed" or "unnamedplus" the value of
+ v:register is wrong for operators without a specific register.
+Solution: Adjust the register according to 'clipboard'. (Ingo Karkat)
+Files: src/normal.c
+
+Patch 7.3.187
+Problem: The RISC OS port has obvious errors and is not being maintained.
+Solution: Remove the RISC OS files and code.
+Files: src/ascii.h, src/eval.c, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/fileio.c, src/globals.h, src/gui.c, src/gui.h,
+ src/main.c, src/memfile.c, src/memline.c, src/misc1.c,
+ src/proto.h, src/quickfix.c, src/search.c, src/structs.h,
+ src/term.c, src/termlib.c, src/version.c, src/vim.h,
+ src/gui_riscos.h, src/os_riscos.h, src/gui_riscos.c,
+ src/os_riscos.c, runtime/doc/os_risc.txt
+
+Patch 7.3.188
+Problem: More RISC OS files to remove.
+Solution: Remove them. Update the file list.
+Files: src/proto/gui_riscos.pro, src/proto/os_riscos.pro, Filelist
+
+Patch 7.3.189 (after 7.3.186)
+Problem: Can't build without +clipboard feature. (Christian Ebert)
+Solution: Add the missing #ifdef.
+Files: src/normal.c
+
+Patch 7.3.190
+Problem: When there is a "containedin" syntax argument highlighting may be
+ wrong. (Radek)
+Solution: Reset current_next_list. (Ben Schmidt)
+Files: src/syntax.c
+
+Patch 7.3.191
+Problem: Still some RISC OS stuff to remove.
+Solution: Remove files and lines. (Hong Xu)
+ Remove the 'osfiletype' option code.
+Files: README_extra.txt, src/Make_ro.mak, src/INSTALL, src/Makefile,
+ src/buffer.c, src/eval.c, src/feature.h, src/option.c,
+ src/option.h, src/structs.h, src/version.c, src/pty.c, Filelist
+
+Patch 7.3.192
+Problem: Ex command ":s/ \?/ /g" splits multibyte characters into bytes.
+ (Dominique Pelle)
+Solution: Advance over whole character instead of one byte.
+Files: src/ex_cmds.c
+
+Patch 7.3.193
+Problem: In the command line window ":close" doesn't work properly. (Tony
+ Mechelynck)
+Solution: Use Ctrl_C instead of K_IGNORE for cmdwin_result. (Jean-Rene
+ David)
+Files: src/ex_docmd.c, src/ex_getln.c
+
+Patch 7.3.194
+Problem: When "b" is a symlink to directory "a", resolve("b/") doesn't
+ result in "a/". (ZyX)
+Solution: Remove the trailing slash. (Jean-Rene David)
+Files: src/eval.c
+
+Patch 7.3.195
+Problem: "} else" causes following lines to be indented too much. (Rouben
+ Rostamian)
+Solution: Better detection for the "else". (Lech Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.196
+Problem: Can't intercept a character that is going to be inserted.
+Solution: Add the InsertCharPre autocommand event. (Jakson A. Aquino)
+Files: runtime/doc/autocmd.txt, runtime/doc/eval.txt,
+ runtime/doc/map.txt, src/edit.c, src/eval.c, src/fileio.c,
+ src/vim.h
+
+Patch 7.3.197
+Problem: When a QuickfixCmdPost event removes all errors, Vim still tries
+ to jump to the first error, resulting in E42.
+Solution: Get the number of error after the autocmd event. (Mike Lundy)
+Files: src/quickfix.c
+
+Patch 7.3.198
+Problem: No completion for ":lang".
+Solution: Get locales to complete from. (Dominique Pelle)
+Files: src/eval.c, src/ex_cmds2.c, src/ex_getln.c,
+ src/proto/ex_cmds2.pro, src/proto/ex_getln.pro, src/vim.h
+
+Patch 7.3.199
+Problem: MS-Windows: Compilation problem of OLE with MingW compiler.
+Solution: Put #ifdef around declarations. (Guopeng Wen)
+Files: src/if_ole.h
+
+Patch 7.3.200 (after 7.3.198)
+Problem: CTRL-D doesn't complete :lang.
+Solution: Add the missing part of the change. (Dominique Pelle)
+Files: src/ex_docmd.c
+
+Patch 7.3.201 (after 7.3.195)
+Problem: "} else" still causes following lines to be indented too much.
+Solution: Better detection for the "else" block. (Lech Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.202
+Problem: Cannot influence the indent inside a namespace.
+Solution: Add the "N" 'cino' parameter. (Konstantin Lepa)
+Files: runtime/doc/indent.txt, src/misc1.c, src/testdir/test3.in,
+ src/testdir/test3.ok
+
+Patch 7.3.203
+Problem: MS-Windows: Can't run an external command without a console window.
+Solution: Support ":!start /b cmd". (Xaizek)
+Files: runtime/doc/os_win32.txt, src/os_win32.c
+
+Patch 7.3.204 (after 7.3.201)
+Problem: Compiler warning.
+Solution: Add type cast. (Mike Williams)
+Files: src/misc1.c
+
+Patch 7.3.205
+Problem: Syntax "extend" doesn't work correctly.
+Solution: Avoid calling check_state_ends() recursively (Ben Schmidt)
+Files: src/syntax.c
+
+Patch 7.3.206
+Problem: 64bit MS-Windows compiler warning.
+Solution: Use HandleToLong() instead of type cast. (Mike Williams)
+Files: src/gui_w32.c
+
+Patch 7.3.207
+Problem: Can't compile with MSVC with pentium4 and 64 bit.
+Solution: Only use SSE2 for 32 bit. (Mike Williams)
+Files: src/Make_mvc.mak
+
+Patch 7.3.208
+Problem: Early terminated if statement.
+Solution: Remove the semicolon. (Lech Lorens)
+Files: src/gui_mac.c
+
+Patch 7.3.209
+Problem: MSVC Install instructions point to wrong batch file.
+Solution: Add a batch file for use with MSVC 10.
+Files: src/msvc2010.bat, src/INSTALLpc.txt, Filelist
+
+Patch 7.3.210
+Problem: Can't always find the file when using cscope.
+Solution: Add the 'cscoperelative' option. (Raghavendra D Prabhu)
+Files: runtime/doc/if_cscop.txt, runtime/doc/options.txt,
+ src/if_cscope.c
+
+Patch 7.3.211 (after 7.3.210)
+Problem: Compiler warning.
+Solution: Add type cast.
+Files: src/if_cscope.c
+
+Patch 7.3.212
+Problem: With Python 3.2 ":py3" fails.
+Solution: Move PyEval_InitThreads() to after Py_Initialize(). (Roland
+ Puntaier) Check abiflags in configure. (Andreas Behr)
+Files: src/if_python3.c, src/auto/configure, src/configure.in
+
+Patch 7.3.213
+Problem: Javascript object literal is not indented correctly.
+Solution: Make a special case for when "J1" is in 'cino'. (Luc Deschenaux)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.214
+Problem: The text displayed by ":z-" isn't exactly like old Vi.
+Solution: Add one to the start line number. (ChangZhuo Chen)
+Files: src/ex_cmds.c
+
+Patch 7.3.215 (after 7.3.210)
+Problem: Wrong file names in previous patch. (Toothpik)
+Solution: Include the option changes.
+Files: src/option.c, src/option.h
+
+Patch 7.3.216
+Problem: When recovering a file a range of lines is missing. (Charles Jie)
+Solution: Reset the index when advancing to the next pointer block. Add a
+ test to verify recovery works.
+Files: src/memline.c, src/testdir/test78.in, src/testdir/test78.ok,
+ src/testdir/Makefile, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.3.217
+Problem: Inside an "if" a ":wincmd" causes problems.
+Solution: When skipping commands let ":wincmd" skip over its argument.
+Files: src/ex_docmd.c
+
+Patch 7.3.218 (after 7.3.212)
+Problem: Tiny configuration problem with Python 3.
+Solution: Add abiflags in one more place. (Andreas Behr)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.3.219
+Problem: Can't compile with GTK on Mac.
+Solution: Add some #ifdef trickery. (Ben Schmidt)
+Files: src/os_mac_conv.c, src/os_macosx.m, src/vim.h
+
+Patch 7.3.220
+Problem: Python 3: vim.error is a 'str' instead of an 'Exception' object,
+ so 'except' or 'raise' it causes a 'SystemError' exception.
+ Buffer objects do not support slice assignment.
+ When exchanging text between Vim and Python, multibyte texts become
+ garbage or cause Unicode Exceptions, etc.
+ 'py3file' tries to read in the file as Unicode, sometimes causes
+ UnicodeDecodeException
+Solution: Fix the problems. (lilydjwg)
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 7.3.221
+Problem: Text from the clipboard is sometimes handled as linewise, but not
+ consistently.
+Solution: Assume the text is linewise when it ends in a CR or NL.
+Files: src/gui_gtk_x11.c, src/gui_mac.c, src/ops.c, src/os_msdos.c,
+ src/os_mswin.c, src/os_qnx.c, src/ui.c
+
+Patch 7.3.222
+Problem: Warning for building GvimExt.
+Solution: Comment-out the DESCRIPTION line. (Mike Williams)
+Files: src/GvimExt/gvimext.def, src/GvimExt/gvimext_ming.def
+
+Patch 7.3.223
+Problem: MingW cross compilation doesn't work with tiny features.
+Solution: Move acp_to_enc(), enc_to_utf16() and utf16_to_enc() outside of
+ "#ifdef CLIPBOARD". Fix typo in makefile.
+Files: src/Make_ming.mak, src/os_mswin.c
+
+Patch 7.3.224
+Problem: Can't pass dict to sort function.
+Solution: Add the optional {dict} argument to sort(). (ZyX)
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.3.225
+Problem: Using "\n" in a substitute inside ":s" does not result in a line
+ break.
+Solution: Change behavior inside vim_regexec_nl(). Add tests. (Motoya
+ Kurotsu)
+Files: src/regexp.c, src/testdir/test79.in, src/testdir/test79.ok,
+ src/testdir/test80.in, src/testdir/test80.ok,
+ src/testdir/Makefile, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.3.226
+Problem: On a 64 bit system "syn sync fromstart" is very slow. (Bjorn
+ Steinbrink)
+Solution: Store the state when starting to parse from the first line.
+Files: src/syntax.c
+
+Patch 7.3.227 (after 7.3.221)
+Problem: Mac OS doesn't have the linewise clipboard fix.
+Solution: Also change the Mac OS file. (Bjorn Winckler)
+Files: src/os_macosx.m
+
+Patch 7.3.228
+Problem: "2gj" does not always move to the correct position.
+Solution: Get length of line after moving to a next line. (James Vega)
+Files: src/normal.c
+
+Patch 7.3.229
+Problem: Using fork() makes gvim crash on Mac when build with
+ CoreFoundation.
+Solution: Disallow fork() when __APPLE__ is defined. (Hisashi T Fujinaka)
+Files: src/gui.c
+
+Patch 7.3.230
+Problem: ":wundo" and ":rundo" don't unescape their argument. (Aaron
+ Thoma)
+Solution: Use FILE1 instead of XFILE.
+Files: src/ex_cmds.h
+
+Patch 7.3.231
+Problem: Runtime file patches failed.
+Solution: Redo the patches made against the patched files instead of the
+ files in the mercurial repository.
+Files: runtime/doc/indent.txt, runtime/doc/os_win32.txt
+
+Patch 7.3.232
+Problem: Python doesn't compile without +multi_byte
+Solution: Use "latin1" when MULTI_BYTE is not defined.
+Files: src/if_py_both.h
+
+Patch 7.3.233
+Problem: ":scriptnames" and ":breaklist" show long file names.
+Solution: Shorten to use "~/" when possible. (Jean-Rene David)
+Files: src/ex_cmds2.c
+
+Patch 7.3.234
+Problem: With GTK menu may be popping down.
+Solution: Use event time instead of GDK_CURRENT_TIME. (Hong Xu)
+Files: src/gui.c, src/gui.h, src/gui_gtk.c, src/gui_gtk_x11.c
+
+Patch 7.3.235
+Problem: ";" gets stuck on a "t" command, it's not useful.
+Solution: Add the ';' flag in 'cpo'. (Christian Brabandt)
+Files: runtime/doc/motion.txt, runtime/doc/options.txt, src/option.h,
+ src/search.c src/testdir/test81.in, src/testdir/test81.ok,
+ src/testdir/Makefile, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.3.236 (after 7.3.232)
+Problem: Python 3 doesn't compile without +multi_byte
+Solution: Use "latin1" when MULTI_BYTE is not defined. (lilydjwg)
+Files: src/if_python3.c
+
+Patch 7.3.237
+Problem: "filetype" completion doesn't work on Windows. (Yue Wu)
+Solution: Don't use a glob pattern for the directories, use a list of
+ directories. (Dominique Pelle)
+Files: src/ex_getln.c
+
+Patch 7.3.238
+Problem: Compiler warning for conversion.
+Solution: Add type cast. (Mike Williams)
+Files: src/ex_getln.c
+
+Patch 7.3.239
+Problem: Python corrects the cursor column without taking 'virtualedit'
+ into account. (lilydjwg)
+Solution: Call check_cursor_col_win().
+Files: src/if_py_both.h, src/mbyte.c, src/misc2.c, src/normal.c,
+ src/proto/mbyte.pro, src/proto/misc2.pro
+
+Patch 7.3.240
+Problem: External commands can't use pipes on MS-Windows.
+Solution: Implement pipes and use them when 'shelltemp' isn't set. (Vincent
+ Berthoux)
+Files: src/eval.c, src/ex_cmds.c, src/misc2.c, src/os_unix.c,
+ src/os_win32.c, src/proto/misc2.pro, src/ui.c
+
+Patch 7.3.241
+Problem: Using CTRL-R CTRL-W on the command line may insert only part of
+ the word.
+Solution: Use the cursor position instead of assuming it is at the end of
+ the command. (Tyru)
+Files: src/ex_getln.c
+
+Patch 7.3.242
+Problem: Illegal memory access in after_pathsep().
+Solution: Check that the pointer is not at the start of the file name.
+ (Dominique Pelle)
+Files: src/misc2.c
+
+Patch 7.3.243
+Problem: Illegal memory access in readline().
+Solution: Swap the conditions. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.3.244
+Problem: MS-Windows: Build problem with old compiler. (John Beckett)
+Solution: Only use HandleToLong() when available. (Mike Williams)
+Files: src/gui_w32.c
+
+Patch 7.3.245
+Problem: Python 3.2 libraries not correctly detected.
+Solution: Add the suffix to the library name. (Niclas Zeising)
+Files: src/auto/configure, src/configure.in
+
+Patch 7.3.246 (after 7.3.235)
+Problem: Repeating "f4" in "4444" skips one 4.
+Solution: Check the t_cmd flag. (Christian Brabandt)
+Files: src/search.c
+
+Patch 7.3.247
+Problem: Running tests changes the users viminfo file. Test for patch
+ 7.3.246 missing.
+Solution: Add "nviminfo" to the 'viminfo' option. Include the test.
+Files: src/testdir/test78.in, src/testdir/test81.in
+
+Patch 7.3.248
+Problem: PC Install instructions missing install instructions.
+Solution: Step-by-step explanation. (Michael Soyka)
+Files: src/INSTALLpc.txt
+
+Patch 7.3.249
+Problem: Wrong indenting for array initializer.
+Solution: Detect '}' in a better way. (Lech Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.250
+Problem: Python: Errors in Unicode characters not handled nicely.
+Solution: Add the surrogateescape error handler. (lilydjwg)
+Files: src/if_python3.c
+
+Patch 7.3.251
+Problem: "gH<Del>" deletes the current line, except when it's the last
+ line.
+Solution: Set the "include" flag to indicate the last line is to be deleted.
+Files: src/normal.c, src/ops.c
+
+Patch 7.3.252 (after 7.3.247)
+Problem: Tests fail. (David Northfield)
+Solution: Add missing update for .ok file.
+Files: src/testdir/test81.ok
+
+Patch 7.3.253
+Problem: "echo 'abc' > ''" returns 0 or 1, depending on 'ignorecase'.
+ Checks in mb_strnicmp() for illegal and truncated bytes are
+ wrong. Should not assume that byte length is equal before case
+ folding.
+Solution: Add utf_safe_read_char_adv() and utf_strnicmp(). Add a test for
+ this. (Ivan Krasilnikov)
+Files: src/mbyte.c src/testdir/test82.in, src/testdir/test82.ok,
+ src/testdir/Makefile, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.3.254
+Problem: The coladd field is not reset when setting the line number for a
+ ":call" command.
+Solution: Reset it.
+Files: src/eval.c
+
+Patch 7.3.255
+Problem: When editing a file such as "File[2010-08-15].vim" an E16 error is
+ given. (Manuel Stol)
+Solution: Don't give an error for failing to compile the regexp.
+Files: src/ex_docmd.c, src/misc1.c, src/vim.h
+
+Patch 7.3.256
+Problem: Javascript indenting not sufficiently tested.
+Solution: Add more tests. (Luc Deschenaux) Mark the lines that are indented
+ wrong.
+Files: src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.257
+Problem: Not all completions are available to user commands.
+Solution: Add "color", "compiler", "file_in_path" and "locale". (Dominique
+ Pelle)
+Files: src/ex_docmd.c, runtime/doc/map.txt
+
+Patch 7.3.258
+Problem: MS-Windows: The edit with existing vim context menu entries can be
+ unwanted.
+Solution: Let a registry entry disable them. (Jerome Vuarand)
+Files: src/GvimExt/gvimext.cpp
+
+Patch 7.3.259
+Problem: Equivalence classes only work for latin characters.
+Solution: Add the Unicode equivalence characters. (Dominique Pelle)
+Files: runtime/doc/pattern.txt, src/regexp.c, src/testdir/test44.in,
+ src/testdir/test44.ok
+
+Patch 7.3.260
+Problem: CursorHold triggers on an incomplete mapping. (Will Gray)
+Solution: Don't trigger CursorHold when there is typeahead.
+Files: src/fileio.c
+
+Patch 7.3.261
+Problem: G++ error message erroneously recognized as error.
+Solution: Ignore "In file included from" line also when it ends in a colon.
+ (Fernando Castillo)
+Files: src/option.h
+
+Patch 7.3.262
+Problem: Photon code style doesn't match Vim style.
+Solution: Clean up some of it. (Elias Diem)
+Files: src/gui_photon.c
+
+Patch 7.3.263
+Problem: Perl and Tcl have a few code style problems.
+Solution: Clean it up. (Elias Diem)
+Files: src/if_perl.xs, src/if_tcl.c
+
+Patch 7.3.264
+Problem: When the current directory name contains wildcard characters, such
+ as "foo[with]bar", the tags file can't be found. (Jeremy
+ Erickson)
+Solution: When searching for matching files also match without expanding
+ wildcards. This is a bit of a hack.
+Files: src/vim.h, src/misc1.c, src/misc2.c
+
+Patch 7.3.265
+Problem: When storing a pattern in search history there is no proper check
+ for the separator character.
+Solution: Pass the separator character to in_history(). (Taro Muraoka)
+Files: src/ex_getln.c
+
+Patch 7.3.266
+Problem: In gvim with iBus typing space in Insert mode doesn't work.
+Solution: Clear xim_expected_char after checking it.
+Files: src/mbyte.c
+
+Patch 7.3.267
+Problem: Ruby on Mac OS X 10.7 may crash.
+Solution: Avoid alloc(0). (Bjorn Winckler)
+Files: src/if_ruby.c
+
+Patch 7.3.268
+Problem: Vim freezes when executing an external command with zsh.
+Solution: Use O_NOCTTY both in the master and slave. (Bjorn Winckler)
+Files: src/os_unix.c
+
+Patch 7.3.269
+Problem: 'shellcmdflag' only works with one flag.
+Solution: Split into multiple arguments. (Gary Johnson)
+Files: src/os_unix.c
+
+Patch 7.3.270
+Problem: Illegal memory access.
+Solution: Swap conditions. (Dominique Pelle)
+Files: src/ops.c
+
+Patch 7.3.271
+Problem: Code not following Vim coding style.
+Solution: Fix the style. (Elias Diem)
+Files: src/gui_photon.c
+
+Patch 7.3.272
+Problem: ":put =list" does not add an empty line for a trailing empty
+ item.
+Solution: Add a trailing NL when turning a list into a string.
+Files: src/eval.c
+
+Patch 7.3.273
+Problem: A BOM in an error file is seen as text. (Aleksey Baibarin)
+Solution: Remove the BOM from the text before evaluating. (idea by Christian
+ Brabandt)
+Files: src/quickfix.c, src/mbyte.c, src/proto/mbyte.pro,
+ src/testdir/test10.in
+
+Patch 7.3.274
+Problem: With concealed characters tabs do not have the right size.
+Solution: Use VCOL_HLC instead of vcol. (Eiichi Sato)
+Files: src/screen.c
+
+Patch 7.3.275
+Problem: MS-Windows: When using a black background some screen updates
+ cause the window to flicker.
+Solution: Add WS_CLIPCHILDREN to CreateWindow(). (René Aguirre)
+Files: src/gui_w32.c
+
+Patch 7.3.276
+Problem: GvimExt sets $LANG in the wrong way.
+Solution: Save the environment and use it for gvim. (Yasuhiro Matsumoto)
+Files: src/GvimExt/gvimext.cpp
+
+Patch 7.3.277
+Problem: MS-Windows: some characters do not show in dialogs.
+Solution: Use the wide methods when available. (Yanwei Jia)
+Files: src/gui_w32.c, src/gui_w48.c, src/os_mswin.c, src/os_win32.c,
+ src/os_win32.h
+
+Patch 7.3.278
+Problem: Passing the file name to open in VisVim doesn't work.
+Solution: Adjust the index and check for end of buffer. (Jiri Sedlak)
+Files: src/VisVim/Commands.cpp
+
+Patch 7.3.279
+Problem: With GTK, when gvim is full-screen and a tab is opened and using a
+ specific monitor configuration the window is too big.
+Solution: Adjust the window size like on MS-Windows. (Yukihiro Nakadaira)
+Files: src/gui.c, src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro
+
+Patch 7.3.280
+Problem: ":lmake" does not update the quickfix window title.
+Solution: Update the title. (Lech Lorens)
+Files: src/quickfix.c, src/testdir/test10.in, src/testdir/test10.ok
+
+Patch 7.3.281
+Problem: After using "expand('%:8')" the buffer name is changed.
+Solution: Make a copy of the file name before shortening it.
+Files: src/eval.c
+
+Patch 7.3.282
+Problem: When using input() and :echo in a loop the displayed text is
+ incorrect. (Benjamin Fritz)
+Solution: Only restore the cursor position when there is a command line.
+ (Ben Schmidt)
+Files: src/ex_getln.c
+
+Patch 7.3.283
+Problem: An expression mapping with a multibyte character containing a
+ 0x80 byte gets messed up. (ZyX)
+Solution: Unescape the expression before evaluating it (Yukihiro Nakadaira)
+Files: src/getchar.c
+
+Patch 7.3.284
+Problem: The str2special() function doesn't handle multibyte characters
+ properly.
+Solution: Recognize multibyte characters. (partly by Vladimir Vichniakov)
+Files: src/getchar.c, src/message.c, src/misc2.c
+
+Patch 7.3.285 (after 7.3.284)
+Problem: Mapping <Char-123> no longer works.
+Solution: Properly check for "char-". Add a test for it.
+Files: src/misc2.c, src/testdir/test75.in, src/testdir/test75.ok
+
+Patch 7.3.286
+Problem: Crash when using "zd" on a large number of folds. (Sam King)
+Solution: Recompute pointer after reallocating array. Move fewer entries
+ when making room.
+Files: src/fold.c
+
+Patch 7.3.287
+Problem: Can't compile with MSVC and tiny options.
+Solution: Move variables and #ifdefs. (Sergey Khorev)
+Files: src/os_win32.c
+
+Patch 7.3.288
+Problem: has('python') may give an error message for not being able to load
+ the library after using python3.
+Solution: Only give the error when the verbose argument is true.
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.3.289
+Problem: Complete function isn't called when the leader changed.
+Solution: Call ins_compl_restart() when the leader changed. (Taro Muraoka)
+Files: src/edit.c
+
+Patch 7.3.290
+Problem: When a BufWriteCmd autocommand resets 'modified' this doesn't
+ change older buffer states to be marked as 'modified' like
+ ":write" does. (Yukihiro Nakadaira)
+Solution: When the BufWriteCmd resets 'modified' then adjust the undo
+ information like ":write" does.
+Files: src/fileio.c
+
+Patch 7.3.291
+Problem: Configure doesn't work properly with Python3.
+Solution: Put -ldl before $LDFLAGS. Add PY3_NO_RTLD_GLOBAL. (Roland
+ Puntaier)
+Files: src/config.h.in, src/auto/configure, src/configure.in
+
+Patch 7.3.292
+Problem: Crash when using fold markers and selecting a visual block that
+ includes a folded line and goes to end of line. (Sam Lidder)
+Solution: Check for the column to be MAXCOL. (James Vega)
+Files: src/screen.c
+
+Patch 7.3.293
+Problem: MSVC compiler has a problem with non-ASCII characters.
+Solution: Avoid non-ASCII characters. (Hong Xu)
+Files: src/ascii.h, src/spell.c
+
+Patch 7.3.294 (after 7.3.289)
+Problem: Patch 289 causes more problems than it solves.
+Solution: Revert the patch until a better solution is found.
+Files: src/edit.c
+
+Patch 7.3.295
+Problem: When filtering text with an external command Vim may not read all
+ the output.
+Solution: When select() is interrupted loop and try again. (James Vega)
+Files: src/os_unix.c
+
+Patch 7.3.296
+Problem: When writing to an external command a zombie process may be left
+ behind.
+Solution: Wait on the process. (James Vega)
+Files: src/os_unix.c
+
+Patch 7.3.297
+Problem: Can't load Perl 5.14 dynamically.
+Solution: Add code in #ifdefs. (Charles Cooper)
+Files: if_perl.xs
+
+Patch 7.3.298
+Problem: Built-in colors are different from rgb.txt.
+Solution: Adjust the color values. (Benjamin Haskell)
+Files: src/gui_photon.c, src/gui_w48.c
+
+Patch 7.3.299
+Problem: Source code not in Vim style.
+Solution: Adjust the style. (Elias Diem)
+Files: src/gui_photon.c
+
+Patch 7.3.300
+Problem: Python doesn't parse multibyte argument correctly.
+Solution: Use "t" instead of "s". (lilydjwg)
+Files: src/if_py_both.h
+
+Patch 7.3.301
+Problem: When 'smartindent' and 'copyindent' are set a Tab is used even
+ though 'expandtab' is set.
+Solution: Do not insert Tabs. Add a test. (Christian Brabandt)
+Files: src/misc1.c, src/testdir/test19.in, src/testdir/test19.ok
+
+Patch 7.3.302 (after 7.3.301)
+Problem: Test 19 fails without 'smartindent' and +eval.
+Solution: Don't use ":exe". Source small.vim.
+Files: src/testdir/test19.in
+
+Patch 7.3.303 (after 7.3.296)
+Problem: Compilation error.
+Solution: Correct return type from int to pid_t. (Danek Duvall)
+Files: src/os_unix.c
+
+Patch 7.3.304
+Problem: Strawberry Perl doesn't work on MS-Windows.
+Solution: Use xsubpp if needed. (Yasuhiro Matsumoto)
+Files: src/Make_ming.mak, src/Make_mvc.mak
+
+Patch 7.3.305
+Problem: Auto-loading a function while editing the command line causes
+ scrolling up the display.
+Solution: Don't set msg_scroll when defining a function and the user is not
+ typing. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.3.306
+Problem: When closing a window there is a chance that deleting a scrollbar
+ triggers a GUI resize, which uses the window while it is not in a
+ valid state.
+Solution: Set the buffer pointer to NULL to be able to detect the invalid
+ situation. Fix a few places that used the buffer pointer
+ incorrectly.
+Files: src/buffer.c, src/ex_cmds.c, src/term.c, src/window.c
+
+Patch 7.3.307
+Problem: Python 3 doesn't support slice assignment.
+Solution: Implement slices. (Brett Overesch, Roland Puntaier)
+Files: src/if_python3.c
+
+Patch 7.3.308
+Problem: Writing to 'verbosefile' has problems, e.g. for :highlight.
+Solution: Do not use a separate verbose_write() function but write with the
+ same code that does redirecting. (Yasuhiro Matsumoto)
+Files: src/message.c
+
+Patch 7.3.309 (after 7.3.307)
+Problem: Warnings for pointer types.
+Solution: Change PySliceObject to PyObject.
+Files: src/if_python3.c
+
+Patch 7.3.310
+Problem: Code not following Vim style.
+Solution: Fix the style. (Elias Diem)
+Files: src/gui_photon.c
+
+Patch 7.3.311 (replaces 7.3.289)
+Problem: Complete function isn't called when the leader changed.
+Solution: Allow the complete function to return a dictionary with a flag
+ that indicates ins_compl_restart() is to be called when the leader
+ changes. (Taro Muraoka)
+Files: runtime/insert.txt, src/edit.c, src/eval.c, src/proto/eval.pro
+
+Patch 7.3.312 (after 7.3.306)
+Problem: Can't compile with tiny features.
+Solution: Add #ifdef around win_valid().
+Files: src/buffer.c
+
+Patch 7.3.313 (after 7.3.307)
+Problem: One more warning when compiling with dynamic Python 3.
+Solution: Change PySliceObject to PyObject.
+Files: src/if_python3.c
+
+Patch 7.3.314 (after 7.3.304)
+Problem: Missing parenthesis.
+Solution: Add it. (Benjamin R. Haskell)
+Files: src/Make_mvc.mak
+
+Patch 7.3.315
+Problem: Opening a window before forking causes problems for GTK.
+Solution: Fork first, create the window in the child and report back to the
+ parent process whether it worked. If successful the parent exits,
+ if unsuccessful the child exits and the parent continues in the
+ terminal. (Tim Starling)
+Files: src/gui.c
+
+Patch 7.3.316 (after 7.3.306)
+Problem: Crash when 'colorcolumn' is set and closing buffer.
+Solution: Check for w_buffer to be NULL. (Yasuhiro Matsumoto)
+Files: src/option.c
+
+Patch 7.3.317
+Problem: Calling debug.debug() in Lua may cause Vim to hang.
+Solution: Add a better debug method. (Rob Hoelz, Luis Carvalho)
+Files: src/if_lua.c
+
+Patch 7.3.318
+Problem: "C" on the last line deletes that line if it's blank.
+Solution: Only delete the last line for a delete operation. (James Vega)
+Files: src/ops.c
+
+Patch 7.3.319 (after 7.3.311)
+Problem: Redobuff doesn't always include changes of the completion leader.
+Solution: Insert backspaces as needed. (idea by Taro Muraoka)
+Files: src/edit.c
+
+Patch 7.3.320
+Problem: When a 0xa0 character is in a sourced file the error message for
+ unrecognized command does not show the problem.
+Solution: Display 0xa0 as <a0>.
+Files: src/ex_docmd.c
+
+Patch 7.3.321
+Problem: Code not following Vim style.
+Solution: Fix the style. (Elias Diem)
+Files: src/os_qnx.c
+
+Patch 7.3.322
+Problem: #ifdef for PDP_RETVAL doesn't work, INT_PTR can be a typedef.
+Solution: Check the MSC version and 64 bit flags. (Sergiu Dotenco)
+Files: src/os_mswin.c
+
+Patch 7.3.323
+Problem: The default 'errorformat' does not ignore some "included from"
+ lines.
+Solution: Add a few more patterns. (Ben Boeckel)
+Files: src/option.h
+
+Patch 7.3.324 (after 7.3.237)
+Problem: Completion for ":compiler" shows color scheme names.
+Solution: Fix the directory name. (James Vega)
+Files: src/ex_getln.c
+
+Patch 7.3.325
+Problem: A duplicated function argument gives an internal error.
+Solution: Give a proper error message. (based on patch by Tyru)
+Files: src/eval.c
+
+Patch 7.3.326
+Problem: MingW 4.6 no longer supports the -mno-cygwin option.
+Solution: Split the Cygwin and MingW makefiles. (Matsushita Shougo)
+Files: src/GvimExt/Make_cyg.mak, src/GvimExt/Make_ming.mak,
+ src/Make_cyg.mak, src/Make_ming.mak, src/xxd/Make_ming.mak,
+ Filelist
+
+Patch 7.3.327
+Problem: When jumping to a help tag a closed fold doesn't open.
+Solution: Save and restore KeyTyped. (Yasuhiro Matsumoto)
+Files: src/ex_cmds.c
+
+Patch 7.3.328
+Problem: When command line wraps the cursor may be displayed wrong when
+ there are multibyte characters.
+Solution: Position the cursor before drawing the text. (Yasuhiro Matsumoto)
+Files: src/ex_getln.c
+
+Patch 7.3.329
+Problem: When skipping over code from ":for" to ":endfor" get an error for
+ calling a dict function. (Yasuhiro Matsumoto)
+Solution: Ignore errors when skipping over :call command.
+Files: src/ex_docmd.c, src/eval.c
+
+Patch 7.3.330
+Problem: When longjmp() is invoked if the X server gives an error the state
+ is not properly restored.
+Solution: Reset vgetc_busy. (Yukihiro Nakadaira)
+Files: src/main.c
+
+Patch 7.3.331
+Problem: "vit" selects wrong text when a tag name starts with the same text
+ as an outer tag name. (Ben Fritz)
+Solution: Add "\>" to the pattern to check for word boundary.
+Files: src/search.c
+
+Patch 7.3.332 (after 7.3.202)
+Problem: Indent after "public:" is not increased in C++ code. (Lech Lorens)
+Solution: Check for namespace after the regular checks. (partly by Martin
+ Gieseking)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.333
+Problem: Using "." to repeat a Visual delete counts the size in bytes, not
+ characters. (Connor Lane Smith)
+Solution: Store the virtual column numbers instead of byte positions.
+Files: src/normal.c
+
+Patch 7.3.334
+Problem: Latest MingW about XSUBPP referencing itself. (Gongqian Li)
+Solution: Rename the first use to XSUBPPTRY.
+Files: src/Make_ming.mak
+
+Patch 7.3.335
+Problem: When 'imdisable' is reset from an autocommand in Insert mode it
+ doesn't take effect.
+Solution: Call im_set_active() in Insert mode. (Taro Muraoka)
+Files: src/option.c
+
+Patch 7.3.336
+Problem: When a tags file specifies an encoding different from 'enc' it
+ may hang and using a pattern doesn't work.
+Solution: Convert the whole line. Continue reading the header after the
+ SORT tag. Add test83. (Yukihiro Nakadaira)
+Files: src/tag.c, src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test83-tags2, src/testdir/test83-tags3,
+ src/testdir/test83.in, src/testdir/test83.ok
+
+Patch 7.3.337 (after 7.3.295)
+Problem: Screen doesn't update after resizing the xterm until a character
+ is typed.
+Solution: When the select call is interrupted check do_resize. (Taylor
+ Hedberg)
+Files: src/os_unix.c
+
+Patch 7.3.338
+Problem: Using getchar() in an expression mapping doesn't work well.
+Solution: Don't save and restore the typeahead. (James Vega)
+Files: src/getchar.c, src/testdir/test34.ok
+
+Patch 7.3.339
+Problem: "make shadow" doesn't link all test files.
+Solution: Add a line in Makefile and Filelist.
+Files: src/Makefile, Filelist
+
+Patch 7.3.340
+Problem: When 'verbosefile' is set ftplugof.vim can give an error.
+Solution: Only remove filetypeplugin autocommands when they exist. (Yasuhiro
+ Matsumoto)
+Files: runtime/ftplugof.vim
+
+Patch 7.3.341
+Problem: Local help files are only listed in help.txt, not in translated
+ help files.
+Solution: Also find translated help files. (Yasuhiro Matsumoto)
+Files: src/ex_cmds.c
+
+Patch 7.3.342
+Problem: Code not in Vim style.
+Solution: Fix the style. (Elias Diem)
+Files: src/os_amiga.c, src/os_mac_conv.c, src/os_win16.c
+
+Patch 7.3.343
+Problem: No mouse support for urxvt.
+Solution: Implement urxvt mouse support, also for > 252 columns. (Yiding
+ Jia)
+Files: src/feature.h, src/keymap.h, src/option.h, src/os_unix.c,
+ src/term.c, src/version.c
+
+Patch 7.3.344
+Problem: Problem with GUI startup related to XInitThreads.
+Solution: Use read() and write() instead of fputs() and fread(). (James
+ Vega)
+Files: src/gui.c
+
+Patch 7.3.345
+Problem: When switching language with ":lang" the window title doesn't
+ change until later.
+Solution: Update the window title right away. (Dominique Pelle)
+Files: src/ex_cmds2.c
+
+Patch 7.3.346
+Problem: It's hard to test netbeans commands.
+Solution: Process netbeans commands after :sleep. (Xavier de Gaye)
+Files: runtime/doc/netbeans.txt, src/ex_docmd.c, src/netbeans.c
+
+Patch 7.3.347
+Problem: When dropping text from a browser on Vim it receives HTML even
+ though "html" is excluded from 'clipboard'. (Andrei Avk)
+Solution: Fix the condition for TARGET_HTML.
+Files: src/gui_gtk_x11.c
+
+Patch 7.3.348
+Problem: "call range(1, 947948399)" causes a crash. (ZyX)
+Solution: Avoid a loop in the out of memory message.
+Files: src/misc2.c
+
+Patch 7.3.349
+Problem: When running out of memory during startup trying to open a
+ swapfile will loop forever.
+Solution: Let findswapname() set dirp to NULL if out of memory.
+Files: src/memline.c
+
+Patch 7.3.350
+Problem: Block of code after ":lua << EOF" may not work. (Paul Isambert)
+Solution: Recognize the ":lua" command, skip to EOF.
+Files: src/eval.c
+
+Patch 7.3.351
+Problem: Text formatting uses start of insert position when it should not.
+ (Peter Wagenaar)
+Solution: Do not use Insstart when intentionally formatting.
+Files: src/edit.c
+
+Patch 7.3.352
+Problem: When completing methods dict functions and script-local functions
+ get in the way.
+Solution: Sort function names starting with "<" to the end. (Yasuhiro
+ Matsumoto)
+Files: src/ex_getln.c
+
+Patch 7.3.353 (after 7.3.343)
+Problem: Missing part of the urxvt patch.
+Solution: Add the change in term.c
+Files: src/term.c
+
+Patch 7.3.354
+Problem: ":set backspace+=eol" doesn't work when 'backspace' has a
+ backwards compatible value of 2.
+Solution: Convert the number to a string. (Hirohito Higashi)
+Files: src/option.c
+
+Patch 7.3.355
+Problem: GTK warnings when using netrw.vim. (Ivan Krasilnikov)
+Solution: Do not remove the beval event handler twice.
+Files: src/option.c
+
+Patch 7.3.356
+Problem: Using "o" with 'cindent' set may freeze Vim. (lolilolicon)
+Solution: Skip over {} correctly. (Hari G)
+Files: src/misc1.c
+
+Patch 7.3.357
+Problem: Compiler warning in MS-Windows console build.
+Solution: Adjust return type of PrintHookProc(). (Mike Williams)
+Files: src/os_mswin.c
+
+Patch 7.3.358 (after 7.3.353)
+Problem: Mouse support doesn't work properly.
+Solution: Add HMT_URXVT. (lilydjwg, James McCoy)
+Files: src/term.c
+
+Patch 7.3.359
+Problem: Command line completion shows dict functions.
+Solution: Skip dict functions for completion. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.3.360
+Problem: Interrupting the load of an autoload function may cause a crash.
+Solution: Do not use the hashitem when not valid. (Yukihiro Nakadaira)
+Files: src/eval.c
+
+Patch 7.3.361
+Problem: Accessing memory after it is freed when EXITFREE is defined.
+Solution: Don't access curwin when firstwin is NULL. (Dominique Pelle)
+Files: src/buffer.c
+
+Patch 7.3.362
+Problem: ml_get error when using ":g" with folded lines.
+Solution: Adjust the line number for changed_lines(). (Christian Brabandt)
+Files: src/ex_cmds.c
+
+Patch 7.3.363
+Problem: C indenting is wrong after #endif followed by a semicolon.
+Solution: Add special handling for a semicolon in a line by itself. (Lech
+ Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.364 (after 7.3.353)
+Problem: Can't compile on HP-UX. (John Marriott)
+Solution: Only use TTYM_URXVT when it is defined.
+Files: src/term.c
+
+Patch 7.3.365
+Problem: Crash when using a large Unicode character in a file that has
+ syntax highlighting. (ngollan)
+Solution: Check for going past the end of the utf tables. (Dominique Pelle)
+Files: src/mbyte.c
+
+Patch 7.3.366
+Problem: A tags file with an extremely long name causes errors.
+Solution: Ignore tags that are too long. (Arno Renevier)
+Files: src/tag.c
+
+Patch 7.3.367
+Problem: :wundo and :rundo use a wrong checksum.
+Solution: Include the last line when computing the hash. (Christian Brabandt)
+Files: src/undo.c
+
+Patch 7.3.368
+Problem: Gcc complains about redefining _FORTIFY_SOURCE.
+Solution: Undefine it before redefining it.
+Files: src/Makefile, src/configure.in, src/auto/configure
+
+Patch 7.3.369
+Problem: When compiled with Gnome get an error message when using --help.
+Solution: Don't fork. (Ivan Krasilnikov)
+Files: src/main.c
+
+Patch 7.3.370
+Problem: Compiler warns for unused variable in Lua interface.
+Solution: Remove the variable.
+Files: src/if_lua.c
+
+Patch 7.3.371
+Problem: Crash in autocomplete. (Greg Weber)
+Solution: Check not going over allocated buffer size.
+Files: src/misc2.c
+
+Patch 7.3.372
+Problem: When using a command line mapping to <Up> with file name
+ completion to go one directory up, 'wildchar' is inserted.
+ (Yasuhiro Matsumoto)
+Solution: Set the KeyTyped flag.
+Files: src/ex_getln.c
+
+Patch 7.3.373 (after 7.3.366)
+Problem: A tags file with an extremely long name may cause an infinite loop.
+Solution: When encountering a long name switch to linear search.
+Files: src/tag.c
+
+Patch 7.3.374
+Problem: ++encoding does not work properly.
+Solution: Recognize ++encoding before ++enc. (Charles Cooper)
+Files: src/ex_docmd.c
+
+Patch 7.3.375
+Problem: Duplicate return statement.
+Solution: Remove the superfluous one. (Dominique Pelle)
+Files: src/gui_mac.c
+
+Patch 7.3.376
+Problem: Win32: Toolbar repainting does not work when the mouse pointer
+ hovers over a button.
+Solution: Call DefWindowProc() when not handling an event. (Sergiu Dotenco)
+Files: src/gui_w32.c
+
+Patch 7.3.377
+Problem: No support for bitwise AND, OR, XOR and invert.
+Solution: Add and(), or(), invert() and xor() functions.
+Files: src/eval.c, src/testdir/test49.in, src/testdir/test65.in,
+ src/testdir/test65.ok, runtime/doc/eval.txt
+
+Patch 7.3.378
+Problem: When cross-compiling the check for uint32_t fails.
+Solution: Only give a warning message. (Maksim Melnikau)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.379
+Problem: C-indenting wrong for static enum.
+Solution: Skip over "static". (Lech Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.380
+Problem: C-indenting wrong for a function header.
+Solution: Skip to the start paren. (Lech Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.381
+Problem: Configure silently skips interfaces that won't work.
+Solution: Add the --enable-fail_if_missing argument. (Shlomi Fish)
+Files: src/Makefile, src/configure.in, src/auto/configure
+
+Patch 7.3.382 (after 7.3.376)
+Problem: IME characters are inserted twice.
+Solution: Do not call DefWindowProc() if the event was handled. (Yasuhiro
+ Matsumoto)
+Files: src/gui_w32.c
+
+Patch 7.3.383
+Problem: For EBCDIC pound sign is defined as 't'.
+Solution: Correctly define POUND.
+Files: src/ascii.h
+
+Patch 7.3.384
+Problem: Mapping CTRL-K in Insert mode breaks CTRL-X CTRL-K for dictionary
+ completion.
+Solution: Add CTRL-K to the list of recognized keys. (James McCoy)
+Files: src/edit.c
+
+Patch 7.3.385
+Problem: When using an expression mapping on the command line the cursor
+ ends up in the wrong place. (Yasuhiro Matsumoto)
+Solution: Save and restore msg_col and msg_row when evaluating the
+ expression.
+Files: src/getchar.
+
+Patch 7.3.386
+Problem: Test 83 fails when iconv does not support cp932. (raf)
+Solution: Test if conversion works. (Yukihiro Nakadaira)
+Files: src/testdir/test83.in
+
+Patch 7.3.387 (after 7.3.386)
+Problem: Test 83 may fail for some encodings.
+Solution: Set 'encoding' to utf-8 earlier.
+Files: src/testdir/test83.in
+
+Patch 7.3.388
+Problem: Crash on exit when EXITFREE is defined and using tiny features.
+Solution: Check for NULL window pointer. (Dominique Pelle)
+Files: src/buffer.c
+
+Patch 7.3.389
+Problem: After typing at a prompt the "MORE" message appears too soon.
+Solution: reset lines_left in msg_end_prompt(). (Eswald)
+Files: src/message.c
+
+Patch 7.3.390
+Problem: Using NULL buffer pointer in a window.
+Solution: Check for w_buffer being NULL in more places. (Bjorn Winckler)
+Files: src/ex_cmds.c, src/quickfix.c, src/window.c
+
+Patch 7.3.391
+Problem: Can't check if the XPM_W32 feature is enabled.
+Solution: Add xpm_w32 to the list of features. (kat)
+Files: src/eval.c
+
+Patch 7.3.392
+Problem: When setting 'undofile' while the file is already loaded but
+ unchanged, try reading the undo file. (Andy Wokula)
+Solution: Compute a checksum of the text when 'undofile' is set. (Christian
+ Brabandt)
+Files: src/option.c, src/testdir/test72.in, src/testdir/test72.ok
+
+Patch 7.3.393
+Problem: Win32: When resizing Vim it is always moved to the primary monitor
+ if the secondary monitor is on the left.
+Solution: Use the nearest monitor. (Yukihiro Nakadaira)
+Files: src/gui_w32.c
+
+Patch 7.3.394
+Problem: When placing a mark while starting up a screen redraw messes up
+ the screen. (lith)
+Solution: Don't redraw while still starting up. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.3.395 (after 7.3.251)
+Problem: "dv?bar" in the last line deletes too much and breaks undo.
+Solution: Only adjust the cursor position when it's after the last line of
+ the buffer. Add a test. (Christian Brabandt)
+Files: src/ops.c, src/testdir/test43.in, src/testdir/test43.ok
+
+Patch 7.3.396
+Problem: After forcing an operator to be characterwise it can still become
+ linewise when spanning whole lines.
+Solution: Don't make the operator linewise when motion_force was set.
+ (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.3.397
+Problem: ":helpgrep" does not work properly when 'encoding' is not utf-8 or
+ latin1.
+Solution: Convert non-ascii lines to 'encoding'. (Yasuhiro Matsumoto)
+Files: src/quickfix.c, src/spell.c, src/misc2.c, src/proto/misc2.pro
+
+Patch 7.3.398
+Problem: When creating more than 10 location lists and adding items one by
+ one a previous location may be used. (Audrius Kažukauskas)
+Solution: Clear the location list completely when adding the tenth one.
+Files: src/quickfix.c
+
+Patch 7.3.399
+Problem: ":cd" doesn't work when the path contains wildcards. (Yukihiro
+ Nakadaira)
+Solution: Ignore wildcard errors when the EW_NOTWILD flag is used.
+Files: src/misc1.c
+
+Patch 7.3.400
+Problem: Compiler warnings for shadowed variables.
+Solution: Remove or rename the variables.
+Files: src/charset.c, src/digraph.c, src/edit.c, src/eval.c, src/fold.c,
+ src/getchar.c, src/message.c, src/misc2.c, src/move.c,
+ src/netbeans.c, src/option.c, src/os_unix.c, src/screen.c,
+ src/search.c, src/spell.c, src/syntax.c, src/tag.c, src/window.c
+
+Patch 7.3.401
+Problem: A couple more shadowed variables.
+Solution: Rename the variables.
+Files: src/netbeans.c
+
+Patch 7.3.402
+Problem: When jumping to the first error a line of the buffer is sometimes
+ redrawn on top of the list of errors.
+Solution: Do not call update_topline_redraw() if the display was scrolled
+ up.
+Files: src/quickfix.c
+
+Patch 7.3.403
+Problem: ":helpgrep" does not trigger QuickFixCmd* autocommands.
+Solution: Trigger the autocommands. (Christian Brabandt)
+Files: src/quickfix.c
+
+Patch 7.3.404
+Problem: When a complete function uses refresh "always" redo will not work
+ properly.
+Solution: Do not reset compl_leader when compl_opt_refresh_always is set.
+ (Yasuhiro Matsumoto)
+Files: src/edit.c
+
+Patch 7.3.405
+Problem: When xterm gets back the function keys it may delete the urxvt
+ mouse termcap code.
+Solution: Check for the whole code, not just the start. (Egmont Koblinger)
+Files: src/keymap.h, src/misc2.c, src/term.c
+
+Patch 7.3.406
+Problem: Multi-byte characters in b:browsefilter are not handled correctly.
+Solution: First use convert_filter() normally and then convert to wide
+ characters. (Taro Muraoka)
+Files: src/gui_w48.c
+
+Patch 7.3.407
+Problem: ":12verbose call F()" may duplicate text while trying to truncate.
+ (Thinca)
+Solution: Only truncate when there is not enough room. Also check the byte
+ length of the buffer.
+Files: src/buffer.c, src/eval.c, src/ex_getln.c, src/message.c,
+ src/proto/message.pro
+
+Patch 7.3.408 (after 7.3.406)
+Problem: Missing declaration.
+Solution: Add the declaration. (John Marriott)
+Files: src/gui_w48.c
+
+Patch 7.3.409
+Problem: The license in pty.c is unclear.
+Solution: Add a comment about the license.
+Files: src/pty.c
+
+Patch 7.3.410
+Problem: Compiler error for // comment. (Joachim Schmitz)
+Solution: Turn into /* comment */.
+Files: src/message.c
+
+Patch 7.3.411
+Problem: Pasting in Visual mode using the "" register does not work. (John
+ Beckett)
+Solution: Detect that the write is overwriting the pasted register.
+ (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.3.412
+Problem: Storing a float in a session file has an additional '&'.
+Solution: Remove the '&'. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.3.413
+Problem: Build warnings on MS-Windows.
+Solution: Add type casts. (Mike Williams)
+Files: src/ex_getln.c, src/message.c, src/term.c
+
+Patch 7.3.414
+Problem: Using CTRL-A on "000" drops the leading zero, while on "001" it
+ doesn't.
+Solution: Detect "000" as an octal number. (James McCoy)
+Files: src/charset.c
+
+Patch 7.3.415 (after 7.3.359)
+Problem: Completion of functions stops once a dictionary is encountered.
+ (James McCoy)
+Solution: Return an empty string instead of NULL.
+Files: src/eval.c
+
+Patch 7.3.416 (after 7.3.415)
+Problem: Compiler warning for wrong pointer.
+Solution: Add type cast.
+Files: src/eval.c
+
+Patch 7.3.417 (after 7.3.395)
+Problem: Test 43 fails with a tiny build.
+Solution: Only run test 43 with at least a small build.
+Files: src/testdir/test43.in
+
+Patch 7.3.418
+Problem: When a user complete function returns -1 an error message is
+ given.
+Solution: When -2 is returned stop completion silently. (Yasuhiro Matsumoto)
+Files: src/edit.
+
+Patch 7.3.419
+Problem: DBCS encoding in a user command does not always work.
+Solution: Skip over DBCS characters. (Yasuhiro Matsumoto)
+Files: src/ex_docmd.c
+
+Patch 7.3.420
+Problem: "it" and "at" don't work properly with a dash in the tag name.
+Solution: Require a space to match the tag name. (Christian Brabandt)
+Files: src/search.c
+
+Patch 7.3.421
+Problem: Get E832 when setting 'undofile' in vimrc and there is a file to
+ be edited on the command line. (Toothpik)
+Solution: Do not try reading the undo file for a file that wasn't loaded.
+Files: src/option.c
+
+Patch 7.3.422
+Problem: Python 3 does not have __members__.
+Solution: Add "name" and "number" in another way. (lilydjwg)
+Files: src/if_py_both.h, src/if_python3.c
+
+Patch 7.3.423
+Problem: Small mistakes in comments, proto and indent.
+Solution: Fix the mistakes.
+Files: src/ex_cmds2.c, src/structs.h, src/ui.c, src/proto/ex_docmd.pro
+
+Patch 7.3.424
+Problem: Win16 version missing some functions.
+Solution: Add #defines for the functions.
+Files: src/gui_w16.c
+
+Patch 7.3.425 (after 7.3.265)
+Problem: Search history lines are duplicated. (Edwin Steiner)
+Solution: Convert separator character from space to NUL.
+Files: src/ex_getln.c
+
+Patch 7.3.426
+Problem: With '$' in 'cpoptions' the $ is not displayed in the first
+ column.
+Solution: Use -1 instead of 0 as a special value. (Hideki Eiraku and
+ Hirohito Higashi)
+Files: src/edit.c, src/globals.h, src/move.c, src/screen.c, src/search.c
+
+Patch 7.3.427
+Problem: readfile() can be slow with long lines.
+Solution: Use realloc() instead of alloc(). (John Little)
+Files: src/eval.c
+
+Patch 7.3.428
+Problem: Win32: an xpm file without a mask crashes Vim.
+Solution: Fail when the mask is missing. (Dave Bodenstab)
+Files: src/xpm_w32.c
+
+Patch 7.3.429
+Problem: When 'cpoptions' includes "E" "c0" in the first column is an
+ error. The redo register is then set to the erroneous command.
+Solution: Do not set the redo register if the command fails because of an
+ empty region. (Hideki Eiraku)
+Files: src/getchar.c, src/normal.c, src/proto/getchar.pro
+
+Patch 7.3.430
+Problem: When a custom filetype detection uses "augroup END" the conf
+ filetype detection does not have the filetypedetect group.
+Solution: Always end the group and include filetypedetect in the conf
+ autocommand. (Lech Lorens)
+Files: runtime/filetype.vim
+
+Patch 7.3.431
+Problem: Fetching a key at a prompt may be confused by escape sequences.
+ Especially when getting a prompt at a VimEnter autocommand.
+ (Alex Efros)
+Solution: Properly handle escape sequences deleted by check_termcode().
+Files: src/getchar.c, src/misc1.c, src/term.c, src/proto/term.pro
+
+Patch 7.3.432
+Problem: ACLs are not supported for ZFS or NFSv4 on Solaris.
+Solution: Add configure check and code. (Danek Duvall)
+Files: src/configure.in, src/auto/configure, src/config.h.in,
+ src/os_unix.c
+
+Patch 7.3.433
+Problem: Using continued lines in a Vim script can be slow.
+Solution: Instead of reallocating for every line use a growarray. (Yasuhiro
+ Matsumoto)
+Files: src/ex_cmds2.c
+
+Patch 7.3.434
+Problem: Using join() can be slow.
+Solution: Compute the size of the result before allocation to avoid a lot of
+ allocations and copies. (Taro Muraoka)
+Files: src/eval.c
+
+Patch 7.3.435
+Problem: Compiler warning for unused variable.
+Solution: Move the variable inside #ifdef.
+Files: src/ex_cmds2.c
+
+Patch 7.3.436
+Problem: Compiler warnings for types on Windows.
+Solution: Add type casts. (Mike Williams)
+Files: src/eval.c
+
+Patch 7.3.437
+Problem: Continue looping inside FOR_ALL_TAB_WINDOWS even when already done.
+Solution: Use goto instead of break. (Hirohito Higashi)
+Files: src/fileio.c, src/globals.h
+
+Patch 7.3.438
+Problem: There is no way to avoid ":doautoall" reading modelines.
+Solution: Add the <nomodeline> argument. Adjust documentation.
+Files: src/fileio.c, runtime/doc/autocmd.txt
+
+Patch 7.3.439
+Problem: Compiler warnings to size casts in Perl interface.
+Solution: Use XS macros. (James McCoy)
+Files: src/if_perl.xs, src/typemap
+
+Patch 7.3.440
+Problem: Vim does not support UTF8_STRING for the X selection.
+Solution: Add UTF8_STRING atom support. (Alex Efros) Use it only when
+ 'encoding' is set to Unicode.
+Files: src/ui.c
+
+Patch 7.3.441
+Problem: Newer versions of MzScheme (Racket) require earlier (trampolined)
+ initialisation.
+Solution: Call mzscheme_main() early in main(). (Sergey Khorev)
+Files: src/Make_mvc.mak, src/if_mzsch.c, src/main.c,
+ src/proto/if_mzsch.pro
+
+Patch 7.3.442 (after 7.3.438)
+Problem: Still read modelines for ":doautocmd".
+Solution: Move check for <nomodeline> to separate function.
+Files: src/fileio.c, src/ex_docmd.c, src/proto/fileio.pro,
+ runtime/doc/autocmd.txt
+
+Patch 7.3.443
+Problem: MS-Windows: 'shcf' and 'shellxquote' defaults are not very good.
+Solution: Make a better guess when 'shell' is set to "cmd.exe". (Ben Fritz)
+Files: src/option.c, runtime/doc/options.txt
+
+Patch 7.3.444
+Problem: ":all!" and ":sall!" give error E477, even though the
+ documentation says these are valid commands.
+Solution: Support the exclamation mark. (Hirohito Higashi)
+Files: src/ex_cmds.h, src/testdir/test31.in, src/testdir/test31.ok
+
+Patch 7.3.445 (after 7.3.443)
+Problem: Can't properly escape commands for cmd.exe.
+Solution: Default 'shellxquote' to '('. Append ')' to make '(command)'.
+ No need to use "/s" for 'shellcmdflag'.
+Files: src/misc2.c, src/option.c, src/os_win32.c
+
+Patch 7.3.446 (after 7.3.445)
+Problem: Win32: External commands with special characters don't work.
+Solution: Add the 'shellxescape' option.
+Files: src/misc2.c, src/option.c, src/option.h, runtime/doc/options.txt
+
+Patch 7.3.447 (after 7.3.446)
+Problem: Win32: External commands with "start" do not work.
+Solution: Unescape part of the command. (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.3.448 (after 7.3.447)
+Problem: Win32: Still a problem with "!start /b".
+Solution: Escape only '|'. (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.3.449
+Problem: Crash when a BufWinLeave autocommand closes the only other window.
+ (Daniel Hunt)
+Solution: Abort closing a buffer when it becomes the only one.
+Files: src/buffer.c, src/proto/buffer.pro, src/ex_cmds.c, src/ex_getln.c,
+ src/misc2.c, src/quickfix.c, src/window.c, src/proto/window.pro
+
+Patch 7.3.450 (after 7.3.448)
+Problem: Win32: Still a problem with "!start /b".
+Solution: Fix pointer use. (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.3.451
+Problem: Tcl doesn't work on 64 MS-Windows.
+Solution: Make it work. (Dave Bodenstab)
+Files: src/Make_mvc.mak, src/if_tcl.c
+
+Patch 7.3.452
+Problem: Undo broken when pasting close to the last line. (Andrey Radev)
+Solution: Use a flag to remember if the deleted included the last line.
+ (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.3.453
+Problem: Pasting in the command line is slow.
+Solution: Don't redraw if there is another character to read. (Dominique
+ Pelle)
+Files: src/ex_getln.c
+
+Patch 7.3.454
+Problem: Re-allocating memory slows Vim down.
+Solution: Use realloc() in ga_grow(). (Dominique Pelle)
+Files: src/misc2.c
+
+Patch 7.3.455
+Problem: Using many continuation lines can be slow.
+Solution: Adjust the reallocation size to the current length.
+Files: src/ex_cmds2.c
+
+Patch 7.3.456
+Problem: ":tab drop file" has several problems, including moving the
+ current window and opening a new tab for a file that already has a
+ window.
+Solution: Refactor ":tab drop" handling. (Hirohito Higashi)
+Files: src/buffer.c, src/testdir/test62.in, src/testdir/test62.ok
+
+Patch 7.3.457
+Problem: When setting $VIMRUNTIME later the directory for fetching
+ translated messages is not adjusted.
+Solution: Put bindtextdomain() in vim_setenv().
+Files: src/misc1.c
+
+Patch 7.3.458
+Problem: Crash when calling smsg() during startup.
+Solution: Don't use 'shortmess' when it is not set yet.
+Files: src/option.c
+
+Patch 7.3.459
+Problem: Win32: Warnings for type conversion.
+Solution: Add type casts. (Mike Williams)
+Files: src/misc2.c, src/os_win32.c
+
+Patch 7.3.460
+Problem: Win32: UPX does not compress 64 bit binaries.
+Solution: Mention and add the alternative: mpress. (Dave Bodenstab)
+Files: src/INSTALLpc.txt, src/Make_ming.mak
+
+Patch 7.3.461
+Problem: The InsertCharPre autocommand event is not triggered during
+ completion and when typing several characters quickly.
+Solution: Also trigger InsertCharPre during completion. Do not read ahead
+ when an InsertCharPre autocommand is defined. (Yasuhiro Matsumoto)
+Files: src/edit.c, src/fileio.c, src/proto/fileio.pro
+
+Patch 7.3.462
+Problem: When using ":loadview" folds may be closed unexpectedly.
+Solution: Take into account foldlevel. (Xavier de Gaye)
+Files: src/fold.c
+
+Patch 7.3.463
+Problem: When using ":s///c" the cursor is moved away from the match.
+ (Lawman)
+Solution: Don't move the cursor when do_ask is set. (Christian Brabandt)
+Files: src/ex_cmds.c
+
+Patch 7.3.464
+Problem: Compiler warning for sprintf.
+Solution: Put the length in a variable. (Dominique Pelle)
+Files: src/version.c
+
+Patch 7.3.465
+Problem: Cannot get file name with newline from glob().
+Solution: Add argument to glob() and expand() to indicate they must return a
+ list. (Christian Brabandt)
+Files: runtime/doc/eval.txt, src/eval.c, src/ex_getln.c, src/vim.h
+
+Patch 7.3.466
+Problem: Get ml_get error hen ":behave mswin" was used and selecting
+ several lines. (A. Sinan Unur)
+Solution: Adjust the end of the operation. (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.3.467
+Problem: Cursor positioned wrong at the command line when regaining focus
+ and using some input method.
+Solution: Do not position the cursor in command line mode.
+Files: src/mbyte.c
+
+Patch 7.3.468
+Problem: For some compilers the error file is not easily readable.
+Solution: Use QuickFixCmdPre for more commands. (Marcin Szamotulski)
+Files: runtime/doc/autocmd.txt, src/quickfix.c
+
+Patch 7.3.469
+Problem: Compiler warning for unused argument without some features.
+Solution: Add UNUSED.
+Files: src/buffer.c
+
+Patch 7.3.470
+Problem: Test 62 fails when compiled without GUI and X11.
+Solution: Don't test :drop when it is not supported.
+Files: src/testdir/test62.in
+
+Patch 7.3.471
+Problem: Can't abort listing placed signs.
+Solution: Check "got_int". (Christian Brabandt)
+Files: src/buffer.c, src/ex_cmds.c
+
+Patch 7.3.472
+Problem: Crash when using ":redraw" in a BufEnter autocommand and
+ switching to another tab. (驼峰)
+Solution: Move triggering the autocommands to after correcting the
+ option values. Also check the row value to be out of bounds.
+ (Christian Brabandt, Sergey Khorev)
+Files: src/screen.c, src/window.c
+
+Patch 7.3.473
+Problem: 'cursorbind' does not work correctly in combination with
+ 'virtualedit' set to "all".
+Solution: Copy coladd. (Gary Johnson)
+Files: src/move.c
+
+Patch 7.3.474
+Problem: Perl build with gcc 4 fails.
+Solution: Remove XS() statements. (Yasuhiro Matsumoto)
+Files: src/if_perl.xs
+
+Patch 7.3.475
+Problem: In a terminal with few colors the omnicomplete menu may be hard to
+ see when using the default colors.
+Solution: Use more explicit colors. (suggested by Alex Henrie)
+Files: src/syntax.c
+
+Patch 7.3.476
+Problem: When selecting a block, using "$" to include the end of each line
+ and using "A" and typing a backspace strange things happen.
+ (Yuangchen Xie)
+Solution: Avoid using a negative length. (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.3.477
+Problem: Using ":echo" to output enough lines to scroll, then using "j" and
+ "k" at the more prompt, displays the command on top of the output.
+ (Marcin Szamotulski)
+Solution: Put the output below the command. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.3.478
+Problem: Memory leak using the ':rv!' command when reading dictionary or
+ list global variables i.e. with 'viminfo' containing !.
+Solution: Free the typeval. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.3.479
+Problem: When 'cursorline' is set the line number highlighting can't be set
+ separately.
+Solution: Add "CursorLineNr". (Howard Buchholz)
+Files: src/option.c, src/screen.c, src/syntax.c, src/vim.h
+
+Patch 7.3.480
+Problem: When using ":qa" and there is a changed buffer picking the buffer
+ to jump to is not very good.
+Solution: Consider current and other tab pages. (Hirohito Higashi)
+Files: src/ex_cmds2.c
+
+Patch 7.3.481
+Problem: Changing 'virtualedit' in an operator function to "all" does not
+ have the desired effect. (Aaron Bohannon)
+Solution: Save, reset and restore virtual_op when executing an operator
+ function.
+Files: src/normal.c
+
+Patch 7.3.482
+Problem: With 'cursorbind' set moving up/down does not always keep the same
+ column.
+Solution: Set curswant appropriately. (Gary Johnson)
+Files: src/move.c
+
+Patch 7.3.483 (after 7.3.477)
+Problem: More prompt shows up too often.
+Solution: Instead of adding a line break, only start a new line in the
+ message history. (Christian Brabandt)
+Files: src/eval.c, src/message.c, src/proto/message.pro
+
+Patch 7.3.484
+Problem: The -E and --echo-wid command line arguments are not mentioned in
+ "vim --help".
+Solution: Add the help lines. (Dominique Pelle)
+Files: src/main.c
+
+Patch 7.3.485
+Problem: When building Vim LDFLAGS isn't passed on to building xxd.
+Solution: Pass the LDFLAGS value. (James McCoy)
+Files: src/Makefile
+
+Patch 7.3.486
+Problem: Build error with mingw64 on Windows 7.
+Solution: Avoid the step of going through vimres.res. (Guopeng Wen)
+Files: src/Make_ming.mak
+
+Patch 7.3.487
+Problem: When setting 'timeoutlen' or 'ttimeoutlen' the column for vertical
+ movement is reset unnecessarily.
+Solution: Do not set w_set_curswant for every option. Add a test for this.
+ (Kana Natsuno) Add the P_CURSWANT flag for options.
+Files: src/option.c, src/testdir/test84.in, src/testdir/test84.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.3.488
+Problem: ":help!" in a help file does not work as documented.
+Solution: When in a help file don't give an error message. (thinca)
+Files: src/ex_cmds.c
+
+Patch 7.3.489
+Problem: CTRL-] in Insert mode does not expand abbreviation when used in a
+ mapping. (Yichao Zhou)
+Solution: Special case using CTRL-]. (Christian Brabandt)
+Files: src/getchar.c, src/edit.c
+
+Patch 7.3.490
+Problem: Member confusion in Lua interface.
+Solution: Fix it. Add luaeval(). (Taro Muraoka, Luis Carvalho)
+Files: runtime/doc/if_lua.txt, src/eval.c, src/if_lua.c,
+ src/proto/if_lua.pro
+
+Patch 7.3.491
+Problem: No tests for Lua.
+Solution: Add some simple tests for Lua. (Luis Carvalho)
+Files: src/testdir/test1.in, src/testdir/test85.in, src/testdir/test85.ok
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.3.492
+Problem: Can't indent conditions separately from function arguments.
+Solution: Add the 'k' flag in 'cino'. (Lech Lorens)
+Files: runtime/doc/indent.txt, src/misc1.c, src/testdir/test3.in,
+ src/testdir/test3.ok
+
+Patch 7.3.493 (after 7.3.492)
+Problem: Two unused variables.
+Solution: Remove them. (Hong Xu)
+Files: src/misc1.c
+
+Patch 7.3.494 (after 7.3.491)
+Problem: Can't compile with Lua 5.1 or dynamic Lua.
+Solution: Fix dll_ methods. Fix luado(). (Muraoka Taro, Luis Carvalho)
+Files: src/if_lua.c
+
+Patch 7.3.495 (after 7.3.492)
+Problem: Compiler warnings.
+Solution: Add function declaration. Remove "offset" argument.
+Files: src/misc1.c
+
+Patch 7.3.496
+Problem: MS-DOS: When "diff" trips over difference in line separators some
+ tests fail.
+Solution: Make some .ok files use unix line separators. (David Pope)
+Files: src/testdir/Make_dos.mak, src/testdir/Make_ming.mak
+
+Patch 7.3.497
+Problem: Crash when doing ":python print" and compiled with gcc and
+ the optimizer enabled.
+Solution: Avoid the crash, doesn't really fix the problem. (Christian
+ Brabandt)
+Files: src/if_py_both.h
+
+Patch 7.3.498
+Problem: The behavior of the "- register changes depending on value of
+ the 'clipboard' option. (Szamotulski)
+Solution: Also set the "- register when the register is "*" or "+".
+ (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.3.499
+Problem: When using any interface language when Vim is waiting for a child
+ process it gets confused by a child process started through the
+ interface.
+Solution: Always used waitpid() instead of wait(). (Yasuhiro Matsumoto)
+Files: src/os_unix.c
+
+Patch 7.3.500
+Problem: Ming makefile unconditionally sets WINVER.
+Solution: Only defined when not already defined. (Yasuhiro Matsumoto)
+Files: src/Make_ming.mak
+
+Patch 7.3.501
+Problem: Error for "flush" not being defined when using Ruby command.
+Solution: Defined "flush" as a no-op method. (Kent Sibilev)
+Files: src/if_ruby.c
+
+Patch 7.3.502
+Problem: Netbeans insert halfway a line actually appends to the line.
+Solution: Insert halfway the line. (Brian Victor)
+Files: src/netbeans.c
+
+Patch 7.3.503 (after 7.3.501)
+Problem: Warning for unused argument.
+Solution: Add UNUSED.
+Files: src/if_ruby.c
+
+Patch 7.3.504
+Problem: Commands in help files are not highlighted.
+Solution: Allow for commands in backticks. Adjust CTRL-] to remove the
+ backticks.
+Files: src/ex_cmds.c
+
+Patch 7.3.505
+Problem: Test 11 fails on MS-Windows in some versions.
+Solution: Fix #ifdefs for whether filtering through a pipe is possible. Move
+ setting b_no_eol_lnum back to where it was before patch 7.3.124.
+ (David Pope)
+Files: src/feature.h, src/eval.c, src/ex_cmds.c, src/fileio.c
+
+Patch 7.3.506
+Problem: GTK gives an error when selecting a non-existent file.
+Solution: Add a handler to avoid the error. (Christian Brabandt)
+Files: src/gui_gtk.c
+
+Patch 7.3.507
+Problem: When exiting with unsaved changes, selecting an existing file in
+ the file dialog, there is no dialog to ask whether the existing
+ file should be overwritten. (Felipe G. Nievinski)
+Solution: Call check_overwrite() before writing. (Christian Brabandt)
+Files: src/ex_cmds.c, src/ex_cmds2.c, src/proto/ex_cmds.pro
+
+Patch 7.3.508
+Problem: Default for v:register is not set.
+Solution: Init v:register in eval_init(). Correct for 'clipboard' before the
+ main loop. (Ingo Karkat)
+Files: src/eval.c, src/main.c
+
+Patch 7.3.509
+Problem: ":vimgrep" fails when 'autochdir' is set.
+Solution: A more generic solution for changing directory. (Ben Fritz)
+Files: src/quickfix.c
+
+Patch 7.3.510
+Problem: Test 77 fails on Solaris 7. (Michael Soyka)
+Solution: Replace any tabs with spaces.
+Files: src/testdir/test77.in
+
+Patch 7.3.511
+Problem: Using a FileReadCmd autocommand that does ":e! {file}" may cause a
+ crash. (Christian Brabandt)
+Solution: Properly restore curwin->w_s.
+Files: src/fileio.c
+
+Patch 7.3.512
+Problem: undofile() returns a useless name when passed an empty string.
+Solution: Return an empty string. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.3.513
+Problem: Cannot use CTRL-E and CTRL-Y with "r".
+Solution: Make CTRL-E and CTRL-Y work like in Insert mode. (Christian
+ Brabandt)
+Files: src/edit.c, src/normal.c, src/proto/edit.pro
+
+Patch 7.3.514
+Problem: No completion for :history command.
+Solution: Add the completion and update the docs. Also fix ":behave"
+ completion. (Dominique Pelle)
+Files: runtime/doc/cmdline.txt, runtime/doc/map.txt, src/ex_docmd.c,
+ src/ex_getln.c, src/vim.h
+
+Patch 7.3.515
+Problem: 'wildignorecase' only applies to the last part of the path.
+Solution: Also ignore case for letters earlier in the path.
+Files: src/misc1.c
+
+Patch 7.3.516
+Problem: extend(o, o) may crash Vim.
+Solution: Fix crash and add test. (Thinca and Hirohito Higashi)
+Files: src/eval.c, src/testdir/test55.in, src/testdir/test55.ok
+
+Patch 7.3.517
+Problem: Crash when using "vipvv". (Alexandre Provencio)
+Solution: Don't let the text length become negative.
+Files: src/ops.c
+
+Patch 7.3.518
+Problem: When 'encoding' is a double-byte encoding ":helptags" may not find
+ tags correctly.
+Solution: Use vim_strbyte() instead of vim_strchr(). (Yasuhiro Matsumoto)
+Files: src/ex_cmds.c
+
+Patch 7.3.519
+Problem: When completefunction returns it cannot indicate end of completion
+ mode.
+Solution: Recognize completefunction returning -3. (Matsushita Shougo)
+Files: src/edit.c
+
+Patch 7.3.520
+Problem: gvim starts up slow on Ubuntu 12.04.
+Solution: Move the call to gui_mch_init_check() to after fork(). (Yasuhiro
+ Matsumoto) Do check $DISPLAY being set.
+Files: src/gui.c, src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro
+
+Patch 7.3.521
+Problem: Using "z=" on a multibyte character may cause a crash.
+Solution: Don't use strlen() on an int pointer.
+Files: src/spell.c
+
+Patch 7.3.522
+Problem: Crash in vim_realloc() when using MEM_PROFILE.
+Solution: Avoid using a NULL argument. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.3.523
+Problem: ":diffupdate" doesn't check for files changed elsewhere.
+Solution: Add the ! flag. (Christian Brabandt)
+Files: runtime/doc/diff.txt, src/diff.c, src/ex_cmds.h
+
+Patch 7.3.524 (after 7.3.523)
+Problem: Missing comma.
+Solution: Add the comma.
+Files: src/version.c
+
+Patch 7.3.525
+Problem: Compiler warning on 64 bit MS-Windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/ex_getln.c
+
+Patch 7.3.526
+Problem: Confusing indenting for #ifdef.
+Solution: Remove and add indent. (Elias Diem)
+Files: src/normal.c
+
+Patch 7.3.527
+Problem: Clang complains about non-ASCII characters in a string.
+Solution: Change to \x88 form. (Dominique Pelle)
+Files: src/charset.c
+
+Patch 7.3.528
+Problem: Crash when closing last window in a tab. (Alex Efros)
+Solution: Use common code in close_last_window_tabpage(). (Christian
+ Brabandt)
+Files: src/window.c
+
+Patch 7.3.529
+Problem: Using a count before "v" and "V" does not work (Kikyous)
+Solution: Make the count select that many characters or lines. (Christian
+ Brabandt)
+Files: src/normal.c
+
+Patch 7.3.530 (after 7.3.520)
+Problem: gvim does not work when 'guioptions' includes "f". (Davido)
+Solution: Call gui_mch_init_check() when running GUI in the foreground.
+ (Yasuhiro Matsumoto)
+Files: src/gui.c
+
+Patch 7.3.531 (after 7.3.530)
+Problem: GUI does not work on MS-Windows.
+Solution: Add the missing #ifdef. (Patrick Avery)
+Files: src/gui.c
+
+Patch 7.3.532
+Problem: Compiler warning from Clang.
+Solution: Use a different way to point inside a string. (Dominique Pelle)
+Files: src/syntax.c
+
+Patch 7.3.533
+Problem: Memory leak when writing undo file.
+Solution: Free the ACL. (Dominique Pelle)
+Files: src/undo.c
+
+Patch 7.3.534 (after 7.3.461)
+Problem: When using an InsertCharPre autocommand autoindent fails.
+Solution: Proper handling of v:char. (Alexey Radkov)
+Files: src/edit.c
+
+Patch 7.3.535
+Problem: Many #ifdefs for MB_MAXBYTES.
+Solution: Also define MB_MAXBYTES without the +multi_byte feature. Fix
+ places where the buffer didn't include space for a NUL byte.
+Files: src/arabic.c, src/edit.c, src/eval.c, src/getchar.c, src/mbyte.c,
+ src/misc1.c, src/screen.c, src/spell.c, src/vim.h
+
+Patch 7.3.536
+Problem: When spell checking the German sharp s is not seen as a word
+ character. (Aexl Bender)
+Solution: In utf_islower() return true for the sharp s. Note: also need
+ updated spell file for this to take effect.
+Files: src/mbyte.c
+
+Patch 7.3.537
+Problem: Unnecessary call to init_spell_chartab().
+Solution: Delete the call.
+Files: src/spell.c
+
+Patch 7.3.538
+Problem: 'efm' does not handle Tabs in pointer lines.
+Solution: Add Tab support. Improve tests. (Lech Lorens)
+Files: src/quickfix.c, src/testdir/test10.in, src/testdir/test10.ok
+
+Patch 7.3.539
+Problem: Redrawing a character on the command line does not work properly
+ for multibyte characters.
+Solution: Count the number of bytes in a character. (Yukihiro Nakadaira)
+Files: src/ex_getln.c
+
+Patch 7.3.540
+Problem: Cursor is left on the text instead of the command line.
+Solution: Don't call setcursor() in command line mode.
+Files: src/getchar.c
+
+Patch 7.3.541
+Problem: When joining lines comment leaders need to be removed manually.
+Solution: Add the 'j' flag to 'formatoptions'. (Lech Lorens)
+Files: runtime/doc/change.txt, src/edit.c, src/ex_docmd.c, src/misc1.c,
+ src/normal.c, src/ops.c, src/option.h, src/proto/misc1.pro,
+ src/proto/ops.pro, src/search.c, src/testdir/test29.in,
+ src/testdir/test29.ok
+
+Patch 7.3.542 (after 7.3.506)
+Problem: Function is sometimes unused.
+Solution: Add #ifdef.
+Files: src/gui_gtk.c
+
+Patch 7.3.543
+Problem: The cursor is in the wrong line after using ":copen". (John
+ Beckett)
+Solution: Invoke more drastic redraw method.
+Files: src/eval.c
+
+Patch 7.3.544
+Problem: There is no good way to close a quickfix window when closing the
+ last ordinary window.
+Solution: Add the QuitPre autocommand.
+Files: src/ex_docmd.c, src/fileio.c, src/vim.h
+
+Patch 7.3.545
+Problem: When closing a window or buffer autocommands may close it too,
+ causing problems for where the autocommand was invoked from.
+Solution: Add the w_closing and b_closing flags. When set disallow ":q" and
+ ":close" to prevent recursive closing.
+Files: src/structs.h, src/buffer.c, src/ex_docmd.c, src/window.c
+
+Patch 7.3.546
+Problem: Bogus line break.
+Solution: Remove the line break.
+Files: src/screen.c
+
+Patch 7.3.547 (after 7.3.541)
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize it.
+Files: src/ops.c
+
+Patch 7.3.548
+Problem: Compiler warning on 64 bit Windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/ops.c
+
+Patch 7.3.549
+Problem: In 'cinoptions' "0s" is interpreted as one shiftwidth. (David
+ Pineau)
+Solution: Use the zero as zero. (Lech Lorens)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.550 (after 7.3.541)
+Problem: With "j" in 'formatoptions' a list leader is not removed. (Gary
+ Johnson)
+Solution: Don't ignore the start of a three part comment. (Lech Lorens)
+Files: src/ops.c, src/testdir/test29.in, src/testdir/test29.ok
+
+Patch 7.3.551
+Problem: When using :tablose a TabEnter autocommand is triggered too early.
+ (Karthick)
+Solution: Don't trigger *Enter autocommands before closing the tab.
+ (Christian Brabandt)
+Files: src/buffer.c, src/eval.c, src/ex_cmds2.c, src/fileio.c,
+ src/proto/window.pro, src/window.c
+
+Patch 7.3.552
+Problem: Formatting inside comments does not use the "2" flag in
+ 'formatoptions'.
+Solution: Support the "2" flag. (Tor Perkins)
+Files: src/vim.h, src/ops.c, src/edit.c, src/misc1.c,
+ src/testdir/test68.in, src/testdir/test68.ok
+
+Patch 7.3.553
+Problem: With double-width characters and 'listchars' containing "precedes"
+ the text is displayed one cell off.
+Solution: Check for double-width character being overwritten by the
+ "precedes" character. (Yasuhiro Matsumoto)
+Files: src/screen.c
+
+Patch 7.3.554 (after 7.3.551)
+Problem: Compiler warning for unused argument.
+Solution: Add UNUSED.
+Files: src/window.c
+
+Patch 7.3.555
+Problem: Building on IBM z/OS fails.
+Solution: Adjust configure. Use the QUOTESED value from config.mk instead of
+ the hard coded one in Makefile. (Stephen Bovy)
+Files: src/configure.in, src/auto/configure, src/Makefile
+
+Patch 7.3.556
+Problem: Compiler warnings on 64 bit Windows.
+Solution: Add type casts. (Mike Williams)
+Files: src/misc1.c
+
+Patch 7.3.557
+Problem: Crash when an autocommand wipes out a buffer when it is hidden.
+Solution: Restore the current window when needed. (Christian Brabandt)
+Files: src/buffer.c
+
+Patch 7.3.558
+Problem: Memory access error. (Gary Johnson)
+Solution: Allocate one more byte. (Dominique Pelle)
+Files: src/misc1.c
+
+Patch 7.3.559
+Problem: home_replace() does not work with 8.3 filename.
+Solution: Make ":p" expand 8.3 name to full path. (Yasuhiro Matsumoto)
+Files: src/eval.c, src/misc1.c
+
+Patch 7.3.560
+Problem: Get an error for a locked argument in extend().
+Solution: Initialize the lock flag for a dictionary. (Yukihiro Nakadaira)
+Files: src/eval.c
+
+Patch 7.3.561
+Problem: Using refresh: always in a complete function breaks the "."
+ command. (Val Markovic)
+Solution: Add match leader to the redo buffer. (Yasuhiro Matsumoto)
+Files: src/edit.c
+
+Patch 7.3.562
+Problem: ":profdel" should not work when the +profile feature is disabled.
+Solution: Call ex_ni(). (Yasuhiro Matsumoto)
+Files: src/ex_cmds2.c
+
+Patch 7.3.563 (after 7.3.557)
+Problem: Can't build with tiny features.
+Solution: Add #ifdef.
+Files: src/buffer.c
+
+Patch 7.3.564 (after 7.3.559)
+Problem: Warning for pointer conversion.
+Solution: Add type cast.
+Files: src/misc1.c
+
+Patch 7.3.565
+Problem: Can't generate proto file for Python 3.
+Solution: Add PYTHON3_CFLAGS to LINT_CFLAGS.
+Files: src/Makefile
+
+Patch 7.3.566 (after 7.3.561)
+Problem: Redo after completion does not work correctly when refresh: always
+ is not used. (Raymond Ko)
+Solution: Check the compl_opt_refresh_always flag. (Christian Brabandt)
+Files: src/edit.c
+
+Patch 7.3.567
+Problem: Missing copyright notice.
+Solution: Add Vim copyright notice. (Taro Muraoka)
+Files: src/dehqx.py
+
+Patch 7.3.568
+Problem: Bad indents for #ifdefs.
+Solution: Add and remove spaces. (Elias Diem)
+Files: src/globals.h
+
+Patch 7.3.569
+Problem: Evaluating Vim expression in Python is insufficient.
+Solution: Add vim.bindeval(). Also add pyeval() and py3eval(). (ZyX)
+Files: runtime/doc/eval.txt, runtime/doc/if_pyth.txt, src/eval.c,
+ src/if_lua.c, src/if_py_both.h, src/if_python.c, src/if_python3.c,
+ src/proto/eval.pro, src/proto/if_python.pro,
+ src/proto/if_python3.pro, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Makefile,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.570
+Problem: ":vimgrep" does not obey 'wildignore'.
+Solution: Apply 'wildignore' and 'suffixes' to ":vimgrep". (Ingo Karkat)
+Files: src/ex_cmds2.c, src/proto/ex_cmds2.pro, src/quickfix.c, src/spell.c
+
+Patch 7.3.571
+Problem: Duplicated condition.
+Solution: Remove one. (Dominique Pelle)
+Files: src/os_win32.c
+
+Patch 7.3.572
+Problem: Duplicate statement in if and else. (Dominique Pelle)
+Solution: Remove the condition and add a TODO.
+Files: src/gui_xmebw.c
+
+Patch 7.3.573
+Problem: Using array index before bounds checking.
+Solution: Swap the parts of the condition. (Dominique Pelle)
+Files: src/ops.c
+
+Patch 7.3.574
+Problem: When pasting a register in the search command line a CTRL-L
+ character is not pasted. (Dominique Pelle)
+Solution: Escape the CTRL-L. (Christian Brabandt)
+Files: src/ex_getln.c
+
+Patch 7.3.575
+Problem: "ygt" tries to yank instead of giving an error. (Daniel Mueller)
+Solution: Check for a pending operator.
+Files: src/normal.c
+
+Patch 7.3.576
+Problem: Formatting of lists inside comments is not right yet.
+Solution: Use another solution and add a test. (Tor Perkins)
+Files: src/edit.c, src/misc1.c, src/testdir/test68.in,
+ src/testdir/test69.ok
+
+Patch 7.3.577
+Problem: Size of memory does not fit in 32 bit unsigned.
+Solution: Use Kbyte instead of byte. Call GlobalMemoryStatusEx() instead of
+ GlobalMemoryStatus() when available.
+Files: src/misc2.c, src/option.c, src/os_amiga.c, src/os_msdos.c,
+ src/os_win16.c, src/os_win32.c
+
+Patch 7.3.578
+Problem: Misplaced declaration.
+Solution: Move declaration to start of block.
+Files: src/if_py_both.h
+
+Patch 7.3.579 (after 7.3.569)
+Problem: Can't compile with Python 2.5.
+Solution: Use PyCObject when Capsules are not available.
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 7.3.580
+Problem: Warning on 64 bit MS-Windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/if_py_both.h
+
+Patch 7.3.581
+Problem: Problems compiling with Python.
+Solution: Pick UCS2 or UCS4 function at runtime. (lilydjwg)
+Files: src/if_python.c
+
+Patch 7.3.582 (after 7.3.576)
+Problem: Missing parts of the test OK file.
+Solution: Add the missing parts.
+Files: src/testdir/test68.ok
+
+Patch 7.3.583
+Problem: PyObject_NextNotImplemented is not defined before Python 2.7.
+ (Danek Duvall)
+Solution: Add #ifdefs.
+Files: src/if_python.c
+
+Patch 7.3.584
+Problem: PyCObject is not always defined.
+Solution: Use PyObject instead.
+Files: src/if_py_both.h, src/if_python.c
+
+Patch 7.3.585
+Problem: Calling changed_bytes() too often.
+Solution: Move changed_bytes() out of a loop. (Tor Perkins)
+Files: src/edit.c
+
+Patch 7.3.586
+Problem: When compiling with Cygwin or MingW MEMORYSTATUSEX is not defined.
+Solution: Set the default for WINVER to 0x0500.
+Files: src/Make_ming.mak, src/Make_cyg.mak
+
+Patch 7.3.587
+Problem: Compiler warning for local var shadowing global var.
+Solution: Rename the var and move it to an inner block. (Christian Brabandt)
+Files: src/buffer.c
+
+Patch 7.3.588
+Problem: Crash on NULL pointer.
+Solution: Fix the immediate problem by checking for NULL. (Lech Lorens)
+Files: src/window.c
+
+Patch 7.3.589
+Problem: Crash when $HOME is not set.
+Solution: Check for a NULL pointer. (Chris Webb)
+Files: src/misc1.c
+
+Patch 7.3.590
+Problem: The '< and '> marks cannot be set directly.
+Solution: Allow setting '< and '>. (Christian Brabandt)
+Files: src/mark.c
+
+Patch 7.3.591
+Problem: Can only move to a tab by absolute number.
+Solution: Move a number of tabs to the left or the right. (Lech Lorens)
+Files: runtime/doc/tabpage.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/testdir/test62.in, src/testdir/test62.ok, src/window.c
+
+Patch 7.3.592
+Problem: Vim on GTK does not support g:browsefilter.
+Solution: Add a GtkFileFilter to the file chooser. (Christian Brabandt)
+Files: src/gui_gtk.c
+
+Patch 7.3.593
+Problem: No easy way to decide if b:browsefilter will work.
+Solution: Add the browsefilter feature.
+Files: src/gui_gtk.c, src/eval.c, src/vim.h
+
+Patch 7.3.594
+Problem: The X command server doesn't work perfectly. It sends an empty
+ reply for as-keys requests.
+Solution: Remove duplicate ga_init2(). Do not send a reply for as-keys
+ requests. (Brian Burns)
+Files: src/if_xcmdsrv.c
+
+Patch 7.3.595
+Problem: The X command server responds slowly
+Solution: Change the loop that waits for replies. (Brian Burns)
+Files: src/if_xcmdsrv.c
+
+Patch 7.3.596
+Problem: Can't remove all signs for a file or buffer.
+Solution: Support "*" for the sign id. (Christian Brabandt)
+Files: runtime/doc/sign.txt, src/buffer.c, src/ex_cmds.c,
+ src/proto/buffer.pro
+
+Patch 7.3.597
+Problem: 'clipboard' "autoselect" only applies to the * register. (Sergey
+ Vakulenko)
+Solution: Make 'autoselect' work for the + register. (Christian Brabandt)
+ Add the "autoselectplus" option in 'clipboard' and the "P" flag in
+ 'guioptions'.
+Files: runtime/doc/options.txt, src/normal.c, src/ops.c, src/screen.c,
+ src/ui.c, src/globals.h, src/proto/ui.pro, src/option.h, src/gui.c
+
+Patch 7.3.598
+Problem: Cannot act upon end of completion. (Taro Muraoka)
+Solution: Add an autocommand event that is triggered when completion has
+ finished. (Idea by Florian Klein)
+Files: src/edit.c, src/fileio.c, src/vim.h
+
+Patch 7.3.599 (after 7.3.597)
+Problem: Missing change in one file.
+Solution: Patch for changed clip_autoselect().
+Files: src/option.c
+
+Patch 7.3.600
+Problem: <f-args> is not expanded properly with DBCS encoding.
+Solution: Skip over character instead of byte. (Yukihiro Nakadaira)
+Files: src/ex_docmd.c
+
+Patch 7.3.601
+Problem: Bad code style.
+Solution: Insert space, remove parens.
+Files: src/farsi.c
+
+Patch 7.3.602
+Problem: Missing files in distribution.
+Solution: Update the list of files.
+Files: Filelist
+
+Patch 7.3.603
+Problem: It is possible to add replace builtin functions by calling
+ extend() on g:.
+Solution: Add a flag to a dict to indicate it is a scope. Check for
+ existing functions. (ZyX)
+Files: src/buffer.c, src/eval.c, src/proto/eval.pro, src/structs.h,
+ src/testdir/test34.in, src/testdir/test34.ok, src/window.c
+
+Patch 7.3.604
+Problem: inputdialog() doesn't use the cancel argument in the console.
+ (David Fishburn)
+Solution: Use the third argument. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.3.605 (after 7.3.577)
+Problem: MS-Windows: Can't compile with older compilers. (Titov Anatoly)
+Solution: Add #ifdef for MEMORYSTATUSEX.
+Files: src/os_win32.c
+
+Patch 7.3.606
+Problem: CTRL-P completion has a problem with multibyte characters.
+Solution: Check for next character being NUL properly. (Yasuhiro Matsumoto)
+Files: src/search.c, src/macros.h
+
+Patch 7.3.607
+Problem: With an 8 color terminal the selected menu item is black on black,
+ because darkGrey as bg is the same as black.
+Solution: Swap fg and bg colors. (James McCoy)
+Files: src/syntax.c
+
+Patch 7.3.608
+Problem: winrestview() does not always restore the view correctly.
+Solution: Call win_new_height() and win_new_width(). (Lech Lorens)
+Files: src/eval.c, src/proto/window.pro, src/window.c
+
+Patch 7.3.609
+Problem: File names in :checkpath! output are garbled.
+Solution: Check for \zs in the pattern. (Lech Lorens)
+Files: src/search.c, src/testdir/test17.in, src/testdir/test17.ok
+
+Patch 7.3.610
+Problem: Cannot operate on the text that a search pattern matches.
+Solution: Add the "gn" and "gN" commands. (Christian Brabandt)
+Files: runtime/doc/index.txt, runtime/doc/visual.txt, src/normal.c,
+ src/proto/search.pro, src/search.c, src/testdir/test53.in,
+ src/testdir/test53.ok
+
+Patch 7.3.611
+Problem: Can't use Vim dictionary as self argument in Python.
+Solution: Fix the check for the "self" argument. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.612
+Problem: Auto formatting messes up text when 'fo' contains "2". (ZyX)
+Solution: Decrement "less_cols". (Tor Perkins)
+Files: src/misc1.c, src/testdir/test68.in, src/testdir/test68.ok
+
+Patch 7.3.613
+Problem: Including Python's config.c in the build causes trouble. It is
+ not clear why it was there.
+Solution: Omit the config file. (James McCoy)
+Files: src/Makefile, src/auto/configure, src/configure.in
+
+Patch 7.3.614
+Problem: Number argument gets turned into a number while it should be a
+ string.
+Solution: Add flag to the call_vim_function() call. (Yasuhiro Matsumoto)
+Files: src/edit.c, src/eval.c, src/proto/eval.pro
+
+Patch 7.3.615
+Problem: Completion for a user command does not recognize backslash before
+ a space.
+Solution: Recognize escaped characters. (Yasuhiro Matsumoto)
+Files: src/ex_docmd.c
+
+Patch 7.3.616 (after 7.3.610)
+Problem: Can't compile without +visual.
+Solution: Add #ifdef.
+Files: src/normal.c
+
+Patch 7.3.617 (after 7.3.615)
+Problem: Hang on completion.
+Solution: Skip over the space. (Yasuhiro Matsumoto)
+Files: src/ex_docmd.c
+
+Patch 7.3.618 (after 7.3.616)
+Problem: Still doesn't compile with small features.
+Solution: Move current_search() out of #ifdef. (Dominique Pelle)
+Files: src/normal.c, src/search.c
+
+Patch 7.3.619
+Problem: When executing a shell command Vim may become slow to respond.
+Solution: Don't wait after every processed message. (idea by Yasuhiro
+ Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.3.620
+Problem: Building with recent Ruby on Win32 doesn't work.
+Solution: Add a separate argument for the API version. (Yasuhiro Matsumoto)
+Files: src/Make_ming.mak, src/Make_mvc.mak
+
+Patch 7.3.621
+Problem: Compiler warnings on 64 bit windows.
+Solution: Add type casts. (Mike Williams)
+Files: src/ex_docmd.c, src/search.c
+
+Patch 7.3.622
+Problem: XPM library for Win32 can't be found.
+Solution: Suggest using the one from the Vim ftp site.
+Files: src/Make_mvc.mak
+
+Patch 7.3.623
+Problem: Perl 5.14 commands crash Vim on MS-Windows.
+Solution: Use perl_get_sv() instead of GvSV(). (Raymond Ko)
+Files: src/if_perl.xs
+
+Patch 7.3.624
+Problem: When cancelling input() it returns the third argument. That should
+ only happen for inputdialog().
+Solution: Check if inputdialog() was used. (Hirohito Higashi)
+Files: src/eval.c
+
+Patch 7.3.625
+Problem: "gn" does not handle zero-width matches correctly.
+Solution: Handle zero-width patterns specially. (Christian Brabandt)
+Files: src/search.c
+
+Patch 7.3.626
+Problem: Python interface doesn't build with Python 2.4 or older.
+Solution: Define Py_ssize_t. (Benjamin Bannier)
+Files: src/if_py_both.h
+
+Patch 7.3.627
+Problem: When using the "n" flag with the ":s" command a \= substitution
+ will not be evaluated.
+Solution: Do perform the evaluation, so that a function can be invoked at
+ every matching position without changing the text. (Christian
+ Brabandt)
+Files: src/ex_cmds.c
+
+Patch 7.3.628
+Problem: ":open" does not allow for a !, which results in a confusing error
+ message. (Shawn Wilson)
+Solution: Allow ! on ":open". (Christian Brabandt)
+Files: src/ex_cmds.h
+
+Patch 7.3.629
+Problem: There is no way to make 'shiftwidth' follow 'tabstop'.
+Solution: When 'shiftwidth' is zero use the value of 'tabstop'. (Christian
+ Brabandt)
+Files: src/edit.c, src/ex_getln.c, src/fold.c, src/misc1.c, src/ops.c,
+ src/option.c, src/proto/option.pro
+
+Patch 7.3.630
+Problem: "|" does not behave correctly when 'virtualedit' is set.
+Solution: Call validate_virtcol(). (David Bürgin)
+Files: src/normal.c
+
+Patch 7.3.631
+Problem: Cannot complete user names.
+Solution: Add user name completion. (Dominique Pelle)
+Files: runtime/doc/map.txt, src/auto/configure, src/config.h.in,
+ src/configure.in, src/ex_docmd.c, src/ex_getln.c, src/misc1.c,
+ src/misc2.c, src/proto/misc1.pro, src/vim.h
+
+Patch 7.3.632
+Problem: Cannot select beyond 222 columns with the mouse in xterm.
+Solution: Add support for SGR mouse tracking. (Hayaki Saito)
+Files: runtime/doc/options.txt, src/feature.h, src/keymap.h, src/misc2.c,
+ src/option.h, src/os_unix.c, src/term.c, src/version.c
+
+Patch 7.3.633
+Problem: Selection remains displayed as selected after selecting another
+ text.
+Solution: Call xterm_update() before select(). (Andrew Pimlott)
+Files: src/os_unix.c
+
+Patch 7.3.634
+Problem: Month/Day format for undo is confusing. (Marcin Szamotulski)
+Solution: Always use Year/Month/Day, should work for everybody.
+Files: src/undo.c
+
+Patch 7.3.635
+Problem: Issue 21: System call during startup sets 'lines' to a wrong
+ value. (Karl Yngve)
+Solution: Don't set the shell size while the GUI is still starting up.
+ (Christian Brabandt)
+Files: src/ui.c
+
+Patch 7.3.636 (after 7.3.625)
+Problem: Not all zero-width matches handled correctly for "gn".
+Solution: Move zero-width detection to a separate function. (Christian
+ Brabandt)
+Files: src/search.c
+
+Patch 7.3.637
+Problem: Cannot catch the error caused by a foldopen when there is no fold.
+ (ZyX, Issue 48)
+Solution: Do not break out of the loop early when inside try/catch.
+ (Christian Brabandt) Except when there is a syntax error.
+Files: src/ex_docmd.c, src/globals.h
+
+Patch 7.3.638
+Problem: Unnecessary redraw of the previous character.
+Solution: Check if the character is double-width. (Jon Long)
+Files: src/screen.c
+
+Patch 7.3.639
+Problem: It's not easy to build Vim on Windows with XPM support.
+Solution: Include the required files, they are quite small. Update the
+ MSVC makefile to use them. Binary files are in the next patch.
+ (Sergey Khorev)
+Files: src/xpm/COPYRIGHT, src/xpm/README.txt, src/xpm/include/simx.h,
+ src/xpm/include/xpm.h, src/Make_mvc.mak, src/bigvim.bat,
+ src/bigvim64.bat, Filelist
+
+Patch 7.3.640
+Problem: It's not easy to build Vim on Windows with XPM support.
+Solution: Binary files for 7.3.639. (Sergey Khorev)
+Files: src/xpm/x64/lib/libXpm.lib, src/xpm/x86/lib/libXpm.a,
+ src/xpm/x86/lib/libXpm.lib
+
+Patch 7.3.641
+Problem: ":mkview" uses ":normal" instead of ":normal!" for folds. (Dan)
+Solution: Add the bang. (Christian Brabandt)
+Files: src/fold.c
+
+Patch 7.3.642
+Problem: Segfault with specific autocommands. Was OK after 7.3.449 and
+ before 7.3.545. (Richard Brown)
+Solution: Pass TRUE for abort_if_last in the call to close_buffer().
+ (Christian Brabandt)
+Files: src/window.c
+
+Patch 7.3.643 (after 7.3.635)
+Problem: MS-Windows: When starting gvim maximized 'lines' and 'columns' are
+ wrong. (Christian Robinson)
+Solution: Move the check for gui.starting from ui_get_shellsize() to
+ check_shellsize().
+Files: src/ui.c, src/term.c
+
+Patch 7.3.644
+Problem: Dead code for BeOS GUI.
+Solution: Remove unused __BEOS__ stuff.
+Files: src/gui.c
+
+Patch 7.3.645
+Problem: No tests for patch 7.3.625 and 7.3.637.
+Solution: Add more tests for the "gn" command and try/catch. (Christian
+ Brabandt)
+Files: src/testdir/test53.in, src/testdir/test53.ok,
+ src/testdir/test55.in, src/testdir/test55.ok
+
+Patch 7.3.646
+Problem: When reloading a buffer the undo file becomes unusable unless ":w"
+ is executed. (Dmitri Frank)
+Solution: After reloading the buffer write the undo file. (Christian
+ Brabandt)
+Files: src/fileio.c
+
+Patch 7.3.647
+Problem: "gnd" doesn't work correctly in Visual mode.
+Solution: Handle Visual mode differently in "gn". (Christian Brabandt)
+Files: src/search.c, src/testdir/test53.in, src/testdir/test53.ok
+
+Patch 7.3.648
+Problem: Crash when using a very long file name. (ZyX)
+Solution: Properly check length of buffer space.
+Files: src/buffer.c
+
+Patch 7.3.649
+Problem: When 'clipboard' is set to "unnamed" small deletes end up in the
+ numbered registers. (Ingo Karkat)
+Solution: Use the original register name to decide whether to put a delete
+ in a numbered register. (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.3.650
+Problem: Completion after ":help \{-" gives an error message and messes up
+ the command line.
+Solution: Cancel the tag search if the pattern can't be compiled. (Yasuhiro
+ Matsumoto)
+Files: src/tag.c
+
+Patch 7.3.651
+Problem: Completion after ":help \{-" gives an error message.
+Solution: Prepend a backslash.
+Files: src/ex_cmds.c
+
+Patch 7.3.652
+Problem: Workaround for Python crash isn't perfect.
+Solution: Change the type of the length argument. (Sean Estabrooks)
+Files: src/if_py_both.h
+
+Patch 7.3.653
+Problem: MingW needs build rule for included XPM files. Object directory
+ for 32 and 64 builds is the same, also for MSVC.
+Solution: Add MingW build rule to use included XPM files. Add the CPU or
+ architecture to the object directory name. (Sergey Khorev)
+Files: src/Make_ming.mak, src/Make_mvc.mak, src/xpm/README.txt
+
+Patch 7.3.654
+Problem: When creating a Vim dictionary from Python objects an empty key
+ might be used.
+Solution: Do not use empty keys, throw an IndexError. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.655
+Problem: 64 bit MingW xpm .a file is missing.
+Solution: Add the file. (Sergey Khorev)
+Files: src/xpm/x64/lib/libXpm.a
+
+Patch 7.3.656
+Problem: Internal error in :pyeval.
+Solution: Handle failed object conversion. (ZyX)
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.3.657
+Problem: Python bindings silently truncate string values containing NUL.
+Solution: Fail when a string contains NUL. (ZyX)
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.3.658
+Problem: NUL bytes truncate strings when converted from Python.
+Solution: Handle truncation as an error. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c
+
+Patch 7.3.659
+Problem: Recent Python changes are not tested.
+Solution: Add tests for Python bindings. (ZyX)
+Files: src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.660
+Problem: ":help !" jumps to help for ":!".
+Solution: Adjust check for tag header line. (Andy Wokula)
+Files: src/tag.c
+
+Patch 7.3.661 (after 7.3.652)
+Problem: SEGV in Python code.
+Solution: Initialize len to zero. Use the right function depending on
+ version. (Maxim Philippov)
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 7.3.662
+Problem: Can't build Ruby interface with Ruby 1.9.3.
+Solution: Add missing functions. (V. Ondruch)
+Files: src/if_ruby.c
+
+Patch 7.3.663
+Problem: End of color scheme name not clear in E185. (Aaron Lewis)
+Solution: Put the name in single quotes.
+Files: src/ex_docmd.c
+
+Patch 7.3.664
+Problem: Buffer overflow in unescaping text. (Raymond Ko)
+Solution: Limit check for multibyte character to 4 bytes.
+Files: src/mbyte.c
+
+Patch 7.3.665
+Problem: MSVC 11 is not supported. (Raymond Ko)
+Solution: Recognize MSVC 11. (Gary Willoughby)
+Files: src/Make_mvc.mak
+
+Patch 7.3.666
+Problem: With MSVC 11 Win32.mak is not found.
+Solution: Add the SDK_INCLUDE_DIR variable. (Raymond Ko)
+Files: src/Make_mvc.mak
+
+Patch 7.3.667
+Problem: Unused variables in Perl interface.
+Solution: Adjust #ifdefs.
+Files: src/if_perl.xs
+
+Patch 7.3.668
+Problem: Building with Perl loaded dynamically still uses static library.
+Solution: Adjust use of PL_thr_key. (Ken Takata)
+Files: src/if_perl.xs
+
+Patch 7.3.669
+Problem: When building with Cygwin loading Python dynamically fails.
+Solution: Use DLLLIBRARY instead of INSTSONAME. (Ken Takata)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.670
+Problem: Python: memory leaks when there are exceptions.
+Solution: Add DICTKEY_UNREF in the right places. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.671
+Problem: More Python code can be shared between Python 2 and 3.
+Solution: Move code to if_py_both.h. (ZyX)
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 7.3.672
+Problem: Not possible to lock/unlock lists in Python interface.
+Solution: Add .locked and .scope attributes. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/if_python.c,
+ src/if_python3.c, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.673
+Problem: Using "gN" while 'selection' is "exclusive" misses one character.
+ (Ben Fritz)
+Solution: Check the direction when compensating for exclusive selection.
+ (Christian Brabandt)
+Files: src/search.c
+
+Patch 7.3.674
+Problem: Can't compile with Lua/dyn on Cygwin.
+Solution: Adjust configure to use the right library name. (Ken Takata)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.675
+Problem: Using uninitialized memory with very long file name.
+Solution: Put NUL after text when it is truncated. (ZyX)
+Files: src/buffer.c
+
+Patch 7.3.676
+Problem: Ruby compilation on Windows 32 bit doesn't work.
+Solution: Only use some functions for 64 bit. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 7.3.677
+Problem: buf_spname() is used inconsistently.
+Solution: Make the return type a char_u pointer. Check the size of the
+ returned string.
+Files: src/buffer.c, src/proto/buffer.pro, src/ex_cmds2.c,
+ src/ex_docmd.c, src/memline.c, src/screen.c
+
+Patch 7.3.678
+Problem: Ruby .so name may not be correct.
+Solution: Use the LIBRUBY_SO entry from the config. (Vit Ondruch)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.679
+Problem: Ruby detection uses Config, newer Ruby versions use RbConfig.
+Solution: Detect the need to use RbConfig. (Vit Ondruch)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.680
+Problem: Some files missing in the list of distributed files.
+Solution: Add lines for new files.
+Files: Filelist
+
+Patch 7.3.681 (after 7.3.680)
+Problem: List of distributed files picks up backup files.
+Solution: Make tutor patterns more specific.
+Files: Filelist
+
+Patch 7.3.682 (after 7.3.677)
+Problem: Compiler complains about incompatible types.
+Solution: Remove type casts. (hint by Danek Duvall)
+Files: src/edit.c
+
+Patch 7.3.683
+Problem: ":python" may crash when vimbindeval() returns None.
+Solution: Check for v_string to be NULL. (Yukihiro Nakadaira)
+Files: src/if_py_both.h
+
+Patch 7.3.684
+Problem: "make test" does not delete lua.vim.
+Solution: Add lua.vim to the clean target. (Simon Ruderich)
+Files: src/testdir/Makefile, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_vms.mms
+
+Patch 7.3.685
+Problem: No test for what patch 7.3.673 fixes.
+Solution: Add a test. (Christian Brabandt)
+Files: src/testdir/test53.in, src/testdir/test53.ok
+
+Patch 7.3.686
+Problem: Using CTRL-\ e mappings is useful also when entering an
+ expression, but it doesn't work. (Marcin Szamotulski)
+Solution: Allow using CTRL-\ e when entering an expression if it was not
+ typed.
+Files: src/ex_getln.c
+
+Patch 7.3.687
+Problem: Test 16 fails when $DISPLAY is not set.
+Solution: Skip the test when $DISPLAY is not set.
+Files: src/testdir/test16.in
+
+Patch 7.3.688
+Problem: Python 3.3 is not supported.
+Solution: Add Python 3.3 support (Ken Takata)
+Files: src/if_python3.c
+
+Patch 7.3.689
+Problem: MzScheme and Lua may use a NULL string.
+Solution: Use an empty string instead of NULL. (Yukihiro Nakadaira)
+Files: src/if_lua.c, src/if_mzsch.c
+
+Patch 7.3.690
+Problem: When the current directory name is exactly the maximum path length
+ Vim may crash.
+Solution: Only add "/" when there is room. (Danek Duvall)
+Files: src/os_unix.c
+
+Patch 7.3.691
+Problem: State specific to the Python thread is discarded.
+Solution: Keep state between threads. (Paul)
+Files: src/if_python.c
+
+Patch 7.3.692
+Problem: Can't build GTK version with GTK 2.0.
+Solution: Put GtkFileFilter declaration in the right place. (Yegappan
+ Lakshmanan)
+Files: src/gui_gtk.c
+
+Patch 7.3.693
+Problem: Can't make 'softtabstop' follow 'shiftwidth'.
+Solution: When 'softtabstop' is negative use the value of 'shiftwidth'.
+ (so8res)
+Files: src/edit.c, src/option.c, src/proto/option.pro
+
+Patch 7.3.694
+Problem: Now that 'shiftwidth' may use the value of 'tabstop' it is not so
+ easy to use in indent files.
+Solution: Add the shiftwidth() function. (so8res)
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.3.695
+Problem: Balloon cannot show multibyte text.
+Solution: Properly deal with multibyte characters. (Dominique Pelle)
+Files: src/gui_beval.c, src/ui.c
+
+Patch 7.3.696
+Problem: Message about added spell language can be wrong.
+Solution: Give correct message. Add g:menutrans_set_lang_to to allow for
+ translation. (Jiri Sedlak)
+Files: runtime/menu.vim
+
+Patch 7.3.697
+Problem: Leaking resources when setting GUI font.
+Solution: Free the font. (Ken Takata)
+Files: src/syntax.c
+
+Patch 7.3.698
+Problem: Python 3 does not preserve state between commands.
+Solution: Preserve the state. (Paul Ollis)
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.3.699
+Problem: When 'ttymouse' is set to "sgr" manually, it is overruled by
+ automatic detection.
+Solution: Do not use automatic detection when 'ttymouse' was set manually.
+ (Hayaki Saito)
+Files: src/term.c
+
+Patch 7.3.700
+Problem: Cannot detect URXVT and SGR mouse support.
+Solution: add +mouse_urxvt and +mouse_sgr. (Hayaki Saito)
+Files: src/feature.h, src/eval.c
+
+Patch 7.3.701
+Problem: MS-Windows: Crash with stack overflow when setting 'encoding'.
+Solution: Handle that loading the iconv library may be called recursively.
+ (Jiri Sedlak)
+Files: src/os_win32.c
+
+Patch 7.3.702
+Problem: Nmake from VS6 service pack 6 is not recognized.
+Solution: Detect the version number. (Jiri Sedlak)
+Files: src/Make_mvc.mak
+
+Patch 7.3.703
+Problem: When 'undofile' is reset the hash is computed unnecessarily.
+Solution: Only compute the hash when the option was set. (Christian Brabandt)
+Files: src/option.c
+
+Patch 7.3.704
+Problem: Repeating "cgn" does not always work correctly.
+Solution: Also fetch the operator character. (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.3.705
+Problem: Mouse features are not sorted properly. (Tony Mechelynck)
+Solution: Put the mouse features in alphabetical order.
+Files: src/version.c
+
+Patch 7.3.706 (after 7.3.697)
+Problem: Can't build Motif version.
+Solution: Fix wrongly named variable. (Ike Devolder)
+Files: src/syntax.c
+
+Patch 7.3.707 (after 7.3.701)
+Problem: Problems loading a library for a file name with non-latin
+ characters.
+Solution: Use wide system functions when possible. (Ken Takata)
+Files: src/os_win32.c, src/os_win32.h
+
+Patch 7.3.708
+Problem: Filler lines above the first line may be hidden when opening Vim.
+Solution: Change how topfill is computed. (Christian Brabandt)
+Files: src/diff.c, src/testdir/test47.in, src/testdir/test47.ok
+
+Patch 7.3.709
+Problem: Compiler warning for unused argument.
+Solution: Add UNUSED.
+Files: src/eval.c
+
+Patch 7.3.710 (after 7.3.704)
+Problem: Patch 7.3.704 breaks "fn".
+Solution: Add check for ca.cmdchar. (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.3.711 (after 7.3.688)
+Problem: vim.current.buffer is not available. (lilydjwg)
+Solution: Use py3_PyUnicode_AsUTF8 instead of py3_PyUnicode_AsUTF8String.
+ (Ken Takata)
+Files: src/if_python3.c
+
+Patch 7.3.712
+Problem: Nmake from VS2010 SP1 is not recognized.
+Solution: Add the version number. (Ken Takata)
+Files: src/Make_mvc.mak
+
+Patch 7.3.713
+Problem: printf() can only align to bytes, not characters.
+Solution: Add the "S" item. (Christian Brabandt)
+Files: runtime/doc/eval.txt, src/message.c
+
+Patch 7.3.714
+Problem: Inconsistency: :set can be used in the sandbox, but :setlocal and
+ :setglobal cannot. (Michael Henry)
+Solution: Fix the flags for :setlocal and :setglobal. (Christian Brabandt)
+Files: src/ex_cmds.h
+
+Patch 7.3.715
+Problem: Crash when calling setloclist() in BufUnload autocmd. (Marcin
+ Szamotulski)
+Solution: Set w_llist to NULL when it was freed. Also add a test.
+ (Christian Brabandt)
+Files: src/quickfix.c, src/testdir/test49.ok, src/testdir/test49.vim
+
+Patch 7.3.716
+Problem: Error on exit when using Python 3.
+Solution: Remove PythonIO_Fini(). (Roland Puntaier)
+Files: src/if_python3.c
+
+Patch 7.3.717
+Problem: When changing the font size, only MS-Windows limits the window
+ size.
+Solution: Also limit the window size on other systems. (Roland Puntaier)
+Files: src/gui.c
+
+Patch 7.3.718
+Problem: When re-using the current buffer the buffer-local options stay.
+Solution: Re-initialize the buffer-local options. (Christian Brabandt)
+Files: src/buffer.c
+
+Patch 7.3.719
+Problem: Cannot run new version of cproto, it fails on missing include
+ files.
+Solution: Add lots of #ifndef PROTO
+Files: src/os_amiga.c, src/os_amiga.h, src/gui_w16.c, src/gui_w48.c,
+ src/gui_w32.c, src/vimio.h, src/os_msdos.c, src/os_msdos.h,
+ src/os_win16.h, src/os_win16.c, src/os_win32.h, src/os_win32.c,
+ src/os_mswin.c, src/gui_photon.c, src/os_unix.h, src/os_beos.c,
+ src/os_beos.h
+
+Patch 7.3.720
+Problem: Proto files are outdated.
+Solution: Update the newly generated proto files.
+Files: src/proto/digraph.pro, src/proto/fold.pro, src/proto/misc1.pro,
+ src/proto/move.pro, src/proto/screen.pro, src/proto/search.pro,
+ src/proto/os_win32.pro, src/proto/os_mswin.pro,
+ src/proto/os_beos.pro
+
+Patch 7.3.721
+Problem: Ruby interface defines local functions globally.
+Solution: Make the functions static.
+Files: src/if_ruby.c
+
+Patch 7.3.722
+Problem: Perl flags may contain "-g", which breaks "make proto".
+Solution: Filter out the "-g" flag for cproto. (Ken Takata)
+Files: src/Makefile
+
+Patch 7.3.723
+Problem: Various tiny problems.
+Solution: Various tiny fixes.
+Files: src/gui_mac.c, src/xpm_w32.c, src/netbeans.c, src/sha256.c,
+ src/if_sniff.c, README.txt
+
+Patch 7.3.724
+Problem: Building with Ruby and Tcl on MS-Windows 64 bit does not work.
+Solution: Remove Ruby and Tcl from the big MS-Windows build.
+Files: src/bigvim64.bat
+
+Patch 7.3.725
+Problem: :aboveleft and :belowright have no effect on :copen.
+Solution: Check for cmdmod.split. (Christian Brabandt)
+Files: src/quickfix.c
+
+Patch 7.3.726
+Problem: Typos and duplicate info in README.
+Solution: Fix the text.
+Files: README.txt
+
+Patch 7.3.727
+Problem: Can't always find Win32.mak when building GvimExt.
+Solution: Use same mechanism as in Make_mvc.mak. (Cade Foster)
+Files: src/GvimExt/Makefile
+
+Patch 7.3.728
+Problem: Cannot compile with MzScheme interface on Ubuntu 12.10.
+Solution: Find the collects directory under /usr/share.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.729
+Problem: Building with Ruby fails on some systems.
+Solution: Remove "static" and add #ifndef PROTO. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 7.3.730
+Problem: Crash in PHP file when using syntastic. (Ike Devolder)
+Solution: Avoid using NULL pointer. (Christian Brabandt)
+Files: src/quickfix.c
+
+Patch 7.3.731
+Problem: Py3Init_vim() is exported unnecessarily.
+Solution: Make it static. (Ken Takata)
+Files: src/if_python3.c
+
+Patch 7.3.732
+Problem: Compiler warnings for function arguments.
+Solution: Use inteptr_t instead of long.
+Files: src/if_mzsch.c, src/main.c
+
+Patch 7.3.733
+Problem: Tests fail when including MzScheme.
+Solution: Change #ifdefs for vim_main2().
+Files: src/main.c
+
+Patch 7.3.734
+Problem: Cannot put help files in a sub-directory.
+Solution: Make :helptags work for sub-directories. (Charles Campbell)
+Files: src/ex_cmds.c
+
+Patch 7.3.735
+Problem: Cannot build Ruby 1.9 with MingW or Cygwin.
+Solution: Add another include directory. (Ken Takata)
+Files: src/Make_cyg.mak, src/Make_ming.mak
+
+Patch 7.3.736
+Problem: File name completion in input() escapes white space. (Frederic
+ Hardy)
+Solution: Do not escape white space. (Christian Brabandt)
+Files: src/ex_getln.c
+
+Patch 7.3.737
+Problem: When using do_cmdline() recursively did_endif is not reset,
+ causing messages to be overwritten.
+Solution: Reset did_endif. (Christian Brabandt)
+Files: src/ex_docmd.c
+
+Patch 7.3.738 (after 7.3.730)
+Problem: Unused function argument.
+Solution: Remove it. (Christian Brabandt)
+Files: src/quickfix.c
+
+Patch 7.3.739
+Problem: Computing number of lines may have an integer overflow.
+Solution: Check for MAXCOL explicitly. (Dominique Pelle)
+Files: src/move.c
+
+Patch 7.3.740
+Problem: IOC tool complains about undefined behavior for int.
+Solution: Change to unsigned int. (Dominique Pelle)
+Files: src/hashtab.c, src/misc2.c
+
+Patch 7.3.741 (after 7.3.737)
+Problem: Tiny build fails.
+Solution: Move #ifdef. (Ike Devolder)
+Files: src/ex_docmd.c
+
+Patch 7.3.742
+Problem: Leaking memory when :vimgrep restores the directory.
+Solution: Free the allocated memory. (Christian Brabandt)
+Files: src/quickfix.c
+
+Patch 7.3.743 (after 7.3.741)
+Problem: Tiny build still fails.
+Solution: Add #else in the right place.
+Files: src/ex_docmd.c
+
+Patch 7.3.744
+Problem: 64 bit compiler warning.
+Solution: Add type cast. (Mike Williams)
+Files: src/ex_cmds.c
+
+Patch 7.3.745
+Problem: Automatically setting 'ttymouse' doesn't work.
+Solution: Reset the "option was set" flag when using the default.
+Files: src/option.c, src/proto/option.pro, src/term.c
+
+Patch 7.3.746
+Problem: Memory leaks when using location lists.
+Solution: Set qf_title to something. (Christian Brabandt)
+Files: src/eval.c, src/quickfix.c
+
+Patch 7.3.747
+Problem: When characters are concealed text aligned with tabs are no longer
+ aligned, e.g. at ":help :index".
+Solution: Compensate space for tabs for concealed characters. (Dominique
+ Pelle)
+Files: src/screen.c
+
+Patch 7.3.748
+Problem: Cannot properly test conceal mode.
+Solution: Add the screencol() and screenrow() functions. Use them in
+ test88. (Simon Ruderich)
+Files: runtime/doc/eval.txt, src/eval.c, src/proto/screen.pro,
+ src/screen.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+ src/testdir/Makefile, src/testdir/test88.in,
+ src/testdir/test88.ok,
+
+Patch 7.3.749
+Problem: Python interface doesn't build without the multibyte feature.
+Solution: Add #ifdef. (Ken Takata)
+Files: src/if_py_both.h
+
+Patch 7.3.750
+Problem: The justify macro does not always work correctly.
+Solution: Fix off-by-one error (James McCoy)
+Files: runtime/macros/justify.vim
+
+Patch 7.3.751
+Problem: Test 61 is flaky, it fails once in a while.
+Solution: When it fails retry once.
+Files: src/testdir/Makefile
+
+Patch 7.3.752
+Problem: Test 49 script file doesn't fold properly.
+Solution: Add a colon.
+Files: src/testdir/test49.vim
+
+Patch 7.3.753
+Problem: When there is a QuitPre autocommand using ":q" twice does not work
+ for exiting when there are more files to edit.
+Solution: Do not decrement quitmore in an autocommand. (Techlive Zheng)
+Files: src/ex_docmd.c, src/fileio.c, src/proto/fileio.pro
+
+Patch 7.3.754
+Problem: Latest nmake is not recognized.
+Solution: Add nmake version 11.00.51106.1. (Raymond Ko)
+Files: src/Make_mvc.mak
+
+Patch 7.3.755
+Problem: Autoconf doesn't find Python 3 if it's called "python".
+Solution: Search for "python2" and "python3" first, then "python".
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.756
+Problem: A location list can get a wrong count in :lvimgrep.
+Solution: Check if the list was changed by autocommands. (mostly by
+ Christian Brabandt)
+Files: src/quickfix.c
+
+Patch 7.3.757
+Problem: Issue 96: May access freed memory when a put command triggers
+ autocommands. (Dominique Pelle)
+Solution: Call u_save() before getting y_array.
+Files: src/ops.c
+
+Patch 7.3.758
+Problem: Matchit plugin does not handle space in #ifdef.
+Solution: Change matching pattern to allow spaces. (Mike Morearty)
+Files: runtime/macros/matchit.vim
+
+Patch 7.3.759
+Problem: MS-Windows: Updating the tabline is slow when there are many tabs.
+Solution: Disable redrawing while performing the update. (Arseny Kapoulkine)
+Files: src/gui_w48.c
+
+Patch 7.3.760
+Problem: dv_ deletes the white space before the line.
+Solution: Move the cursor to the first non-white. (Christian Brabandt)
+Files: src/normal.c, src/testdir/test19.in, src/testdir/test19.ok
+
+Patch 7.3.761
+Problem: In Visual mode a "-p does not work. (Marcin Szamotulski)
+Solution: Avoid writing to "- before putting it. (Christian Brabandt)
+Files: src/normal.c, src/testdir/test48.in, src/testdir/test48.ok
+
+Patch 7.3.762 (after 7.3.759)
+Problem: On some systems the tabline is not redrawn.
+Solution: Call RedrawWindow(). (Charles Peacech)
+Files: src/gui_w48.c
+
+Patch 7.3.763
+Problem: Jumping to a mark does not open a fold if it is in the same line.
+ (Wiktor Ruben)
+Solution: Also compare the column after the jump. (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.3.764
+Problem: Not all message translation files are installed.
+Solution: Also install the converted files.
+Files: src/po/Makefile
+
+Patch 7.3.765
+Problem: Segfault when doing "cclose" on BufUnload in a python function.
+ (Sean Reifschneider)
+Solution: Skip window with NULL buffer. (Christian Brabandt)
+Files: src/main.c, src/window.c
+
+Patch 7.3.766
+Problem: ":help cpo-*" jumps to the wrong place.
+Solution: Make it equivalent to ":help cpo-star".
+Files: src/ex_cmds.c
+
+Patch 7.3.767
+Problem: (Win32) The _errno used for iconv may be the wrong one.
+Solution: Use the _errno from iconv.dll. (Ken Takata)
+Files: src/mbyte.c
+
+Patch 7.3.768
+Problem: settabvar() and setwinvar() may move the cursor.
+Solution: Save and restore the cursor position when appropriate. (idea by
+ Yasuhiro Matsumoto)
+Files: src/edit.c
+
+Patch 7.3.769
+Problem: 'matchpairs' does not work with multibyte characters.
+Solution: Make it work. (Christian Brabandt)
+Files: src/misc1.c, src/option.c, src/proto/option.pro, src/search.c,
+ src/testdir/test69.in, src/testdir/test69.ok
+
+Patch 7.3.770
+Problem: Vim.h indentation is inconsistent.
+Solution: Adjust the indentation. (Elias Diem)
+Files: src/vim.h
+
+Patch 7.3.771 (after 7.3.769)
+Problem: Uninitialized variable. (Yasuhiro Matsumoto)
+Solution: Set x2 to -1.
+Files: src/option.c
+
+Patch 7.3.772
+Problem: Cursor is at the wrong location and below the end of the file
+ after doing substitutions with confirm flag: %s/x/y/c
+ (Dominique Pelle)
+Solution: Update the cursor position. (Christian Brabandt & Dominique)
+Files: src/ex_cmds.c
+
+Patch 7.3.773 (after 7.3.767)
+Problem: Crash when OriginalFirstThunk is zero.
+Solution: Skip items with OriginalFirstThunk not set. (Ken Takata)
+Files: src/mbyte.c
+
+Patch 7.3.774
+Problem: Tiny GUI version misses console dialog feature.
+Solution: Define FEAT_CON_DIALOG when appropriate. (Christian Brabandt)
+Files: src/feature.h, src/gui.h
+
+Patch 7.3.775
+Problem: Cygwin and Mingw builds miss dependency on gui_w48.c.
+Solution: Add a build rule. (Ken Takata)
+Files: src/Make_cyg.mak, src/Make_ming.mak
+
+Patch 7.3.776
+Problem: ml_get error when searching, caused by curwin not matching curbuf.
+Solution: Avoid changing curbuf. (Lech Lorens)
+Files: src/charset.c, src/eval.c, src/mark.c, src/proto/charset.pro,
+ src/proto/mark.pro, src/regexp.c, src/syntax.c,
+
+Patch 7.3.777
+Problem: When building with Gnome locale gets reset.
+Solution: Set locale after gnome_program_init(). (Christian Brabandt)
+Files: src/gui_gtk_x11.c
+
+Patch 7.3.778
+Problem: Compiler error for adding up two pointers. (Titov Anatoly)
+Solution: Add a type cast. (Ken Takata)
+Files: src/mbyte.c
+
+Patch 7.3.779
+Problem: Backwards search lands in wrong place when started on a multibyte
+ character.
+Solution: Do not set extra_col for a backwards search. (Sung Pae)
+Files: src/search.c, src/testdir/test44.in, src/testdir/test44.ok
+
+Patch 7.3.780
+Problem: char2nr() and nr2char() always use 'encoding'.
+Solution: Add argument to use utf-8 characters. (Yasuhiro Matsumoto)
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.3.781
+Problem: Drawing with 'guifontwide' can be slow.
+Solution: Draw multiple characters at a time. (Taro Muraoka)
+Files: src/gui.c
+
+Patch 7.3.782
+Problem: Windows: IME composition may use a wrong font.
+Solution: Use 'guifontwide' for IME when it is set. (Taro Muraoka)
+Files: runtime/doc/options.txt, src/gui.c, src/gui_w48.c,
+ src/proto/gui_w16.pro, src/proto/gui_w32.pro
+
+Patch 7.3.783
+Problem: Crash when mark is not set. (Dominique Pelle)
+Solution: Check for NULL.
+Files: src/normal.c
+
+Patch 7.3.784 (after 7.3.781)
+Problem: Error when 'guifontwide' has a comma.
+Solution: Use gui.wide_font. (Taro Muraoka)
+Files: src/gui_w48.c
+
+Patch 7.3.785 (after 7.3.776)
+Problem: Crash with specific use of search pattern.
+Solution: Initialize reg_buf to curbuf.
+Files: src/regexp.c
+
+Patch 7.3.786
+Problem: Python threads don't run in the background (issue 103).
+Solution: Move the statements to manipulate thread state.
+Files: src/if_python.c
+
+Patch 7.3.787
+Problem: With 'relativenumber' set it is not possible to see the absolute
+ line number.
+Solution: For the cursor line show the absolute line number instead of a
+ zero. (Nazri Ramliy)
+Files: src/screen.c
+
+Patch 7.3.788
+Problem: When only using patches build fails on missing nl.po.
+Solution: Create an empty nl.po file.
+Files: src/po/Makefile
+
+Patch 7.3.789 (after 7.3.776)
+Problem: "\k" in regexp does not work in other window.
+Solution: Use the right buffer. (Yukihiro Nakadaira)
+Files: src/mbyte.c, src/proto/mbyte.pro, src/regexp.c
+
+Patch 7.3.790
+Problem: After reloading a buffer the modelines are not processed.
+Solution: call do_modelines(). (Ken Takata)
+Files: src/fileio.c
+
+Patch 7.3.791
+Problem: MzScheme interface doesn't work properly.
+Solution: Make it work better. (Sergey Khorev)
+Files: runtime/doc/if_mzsch.txt, src/configure.in, src/auto/configure,
+ src/eval.c, src/if_mzsch.c, src/if_mzsch.h, src/Make_ming.mak,
+ src/Make_mvc.mak, src/os_unix.c, src/proto/eval.pro,
+ src/testdir/test70.in, src/testdir/test70.ok
+
+Patch 7.3.792
+Problem: ":substitute" works differently without confirmation.
+Solution: Do not change the text when asking for confirmation, only display
+ it.
+Files: src/ex_cmds.c
+
+Patch 7.3.793 (after 7.3.792)
+Problem: New interactive :substitute behavior is not tested.
+Solution: Add tests. (Christian Brabandt)
+Files: src/testdir/test80.in, src/testdir/test80.ok
+
+Patch 7.3.794
+Problem: Tiny build fails. (Tony Mechelynck)
+Solution: Adjust #ifdefs.
+Files: src/charset.c
+
+Patch 7.3.795
+Problem: MzScheme does not build with tiny features.
+Solution: Add #ifdefs. Also add UNUSED to avoid warnings. And change
+ library ordering.
+Files: src/if_mzsch.c, src/Makefile
+
+Patch 7.3.796
+Problem: "/[^\n]" does match at a line break.
+Solution: Make it do the same as "/.". (Christian Brabandt)
+Files: src/regexp.c, src/testdir/test79.in, src/testdir/test79.ok
+
+Patch 7.3.797 (after 7.3.792)
+Problem: Compiler warning for size_t to int conversion. (Skeept)
+Solution: Add type casts.
+Files: src/ex_cmds.c
+
+Patch 7.3.798 (after 7.3.791)
+Problem: MzScheme: circular list does not work correctly.
+Solution: Separate Mac-specific code from generic code. (Sergey Khorev)
+Files: src/if_mzsch.c, src/testdir/test70.in
+
+Patch 7.3.799
+Problem: The color column is not correct when entering a buffer. (Ben
+ Fritz)
+Solution: Call check_colorcolumn() if 'textwidth' changed. (Christian
+ Brabandt)
+Files: src/buffer.c
+
+Patch 7.3.800
+Problem: The " mark is not adjusted when inserting lines. (Roland Eggner)
+Solution: Adjust the line number. (Christian Brabandt)
+Files: src/mark.c
+
+Patch 7.3.801
+Problem: ":window set nu?" displays the cursor line. (Nazri Ramliy)
+Solution: Do not update the cursor line when conceallevel is zero or the
+ screen has scrolled. (partly by Christian Brabandt)
+Files: src/window.c
+
+Patch 7.3.802
+Problem: After setting 'isk' to a value ending in a comma appending to the
+ option fails.
+Solution: Disallow a trailing comma for 'isk' and similar options.
+Files: src/charset.c
+
+Patch 7.3.803 (after 7.3.792)
+Problem: Substitute with confirmation and then "q" does not replace
+ anything. (John McGowan)
+Solution: Do not break the loop, skip to the end.
+Files: src/ex_cmds.c, src/testdir/test80.in, src/testdir/test80.ok
+
+Patch 7.3.804 (after 7.3.799)
+Problem: Compiler warning for tiny build. (Tony Mechelynck)
+Solution: Add #ifdefs around variable.
+Files: src/buffer.c
+
+Patch 7.3.805
+Problem: Lua version 5.2 is not detected properly on Arch Linux.
+Solution: Adjust autoconf. (lilydjwg)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.806
+Problem: Compiler warnings in Perl code when building with Visual Studio
+ 2012. (skeept)
+Solution: Add type casts. (Christian Brabandt, 2013 Jan 30)
+Files: src/if_perl.xs
+
+Patch 7.3.807
+Problem: Popup menu does not work properly with the preview window, folds
+ and 'cursorcolumn'.
+Solution: Redraw the popup menu after redrawing windows. (Christian
+ Brabandt)
+Files: src/screen.c
+
+Patch 7.3.808
+Problem: Python threads still do not work properly.
+Solution: Fix both Python 2 and 3. Add tests. (Ken Takata)
+Files: src/if_python.c, src/if_python3.c, src/testdir/test86.in,
+ src/testdir/test86.ok, src/testdir/test87.in,
+ src/testdir/test87.ok
+
+Patch 7.3.809
+Problem: The dosinst.c program has a buffer overflow. (Thomas Gwae)
+Solution: Ignore $VIMRUNTIME if it is too long.
+Files: src/dosinst.c
+
+Patch 7.3.810
+Problem: 'relativenumber' is reset unexpectedly. (François Ingelrest)
+Solution: After an option was reset also reset the global value. Add a test.
+ (Christian Brabandt)
+Files: src/option.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test89.in,
+ src/testdir/test89.ok
+
+Patch 7.3.811
+Problem: Useless termresponse parsing for SGR mouse.
+Solution: Skip the parsing. (Hayaki Saito)
+Files: src/term.c
+
+Patch 7.3.812
+Problem: When 'indentexpr' moves the cursor "curswant" not restored.
+Solution: Restore "curswant". (Sung Pae)
+Files: src/misc1.c
+
+Patch 7.3.813
+Problem: The CompleteDone event is not triggered when there are no pattern
+ matches. (Jianjun Mao)
+Solution: Trigger the event. (Christian Brabandt)
+Files: src/edit.c
+
+Patch 7.3.814
+Problem: Can't input multibyte characters on Win32 console if 'encoding' is
+ different from current codepage.
+Solution: Use convert_input_safe() instead of convert_input(). Make
+ string_convert_ext() return an error for incomplete input. (Ken
+ Takata)
+Files: src/mbyte.c, src/os_win32.c
+
+Patch 7.3.815
+Problem: Building with Cygwin and Ruby doesn't work.
+Solution: Copy some things from the MingW build file. (Ken Takata)
+Files: src/Make_cyg.mak
+
+Patch 7.3.816
+Problem: Can't compute a hash.
+Solution: Add the sha256() function. (Tyru, Hirohito Higashi)
+Files: runtime/doc/eval.txt, src/eval.c, src/proto/sha256.pro,
+ src/sha256.c, src/testdir/test90.in, src/testdir/test90.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.3.817
+Problem: Test 89 fails with tiny and small features.
+Solution: Add sourcing small.vim.
+Files: src/testdir/test89.in
+
+Patch 7.3.818
+Problem: When test 40 fails because of a bad build it may leave files
+ behind that cause it to fail later.
+Solution: Let the file names start with "X".
+Files: src/testdir/test40.in
+
+Patch 7.3.819
+Problem: Compiling without +eval and with Python isn't working.
+Solution: Add the eval feature when building with Python.
+Files: src/if_py_both.h, src/feature.h, src/eval.c, src/ex_docmd.c,
+ src/normal.c, src/ex_docmd.c, src/gui_gtk_x11.c
+
+Patch 7.3.820
+Problem: Build errors and warnings when building with small features and
+ Lua, Perl or Ruby.
+Solution: Add #ifdefs and UNUSED.
+Files: src/if_perl.xs, src/if_lua.c, src/if_ruby.c
+
+Patch 7.3.821
+Problem: Build with OLE and Cygwin is broken. (Steve Hall)
+Solution: Select static or shared stdc library. (Ken Takata)
+Files: src/Make_cyg.mak
+
+Patch 7.3.822 (after 7.3.799)
+Problem: Crash when accessing freed buffer.
+Solution: Get 'textwidth' in caller of enter_buffer(). (Christian Brabandt)
+Files: src/buffer.c
+
+Patch 7.3.823 (after 7.3.821)
+Problem: Building with Cygwin: '-lsupc++' is not needed.
+Solution: Remove it. (Ken Takata)
+Files: src/Make_cyg.mak
+
+Patch 7.3.824
+Problem: Can redefine builtin functions. (ZyX)
+Solution: Disallow adding a function to g:.
+Files: src/eval.c
+
+Patch 7.3.825
+Problem: With Python errors are not always clear.
+Solution: Print the stack trace, unless :silent is used. (ZyX)
+Files: src/if_python3.c, src/if_python.c
+
+Patch 7.3.826
+Problem: List of features in :version output is hard to read.
+Solution: Make columns. (Nazri Ramliy)
+Files: src/version.c
+
+Patch 7.3.827 (after 7.3.825)
+Problem: Python tests fail.
+Solution: Adjust the output for the stack trace.
+Files: src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.ok
+
+Patch 7.3.828
+Problem: Mappings are not aware of wildmenu mode.
+Solution: Add wildmenumode(). (Christian Brabandt)
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 7.3.829
+Problem: When compiled with the +rightleft feature 'showmatch' also shows a
+ match for the opening paren. When 'revins' is set the screen may
+ scroll.
+Solution: Only check the opening paren when the +rightleft feature was
+ enabled. Do not show a match that is not visible. (partly by
+ Christian Brabandt)
+Files: src/search.c
+
+Patch 7.3.830
+Problem: :mksession confuses bytes, columns and characters when positioning
+ the cursor.
+Solution: Use w_virtcol with "|" instead of w_cursor.col with "l".
+Files: src/ex_docmd.c
+
+Patch 7.3.831
+Problem: Clumsy to handle the situation that a variable does not exist.
+Solution: Add default value to getbufvar() et al. (Shougo Matsushita,
+ Hirohito Higashi)
+Files: runtime/doc/eval.txt, src/eval.c src/testdir/test91.in,
+ src/testdir/test91.ok, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile
+
+Patch 7.3.832
+Problem: Compiler warning.
+Solution: Add type cast. (Mike Williams)
+Files: src/version.c
+
+Patch 7.3.833
+Problem: In the terminal the scroll wheel always scrolls the active window.
+Solution: Scroll the window under the mouse pointer, like in the GUI.
+ (Bradie Rao)
+Files: src/edit.c, src/normal.c
+
+Patch 7.3.834
+Problem: Ruby 2.0 has a few API changes.
+Solution: Add handling of Ruby 2.0. (Yasuhiro Matsumoto)
+Files: src/if_ruby.c
+
+Patch 7.3.835
+Problem: "xxd -i" fails on an empty file.
+Solution: Do output the closing } for an empty file. (partly by Lawrence
+ Woodman)
+Files: src/xxd/xxd.c
+
+Patch 7.3.836
+Problem: Clipboard does not work on Win32 when compiled with Cygwin.
+Solution: Move the Win32 clipboard code to a separate file and use it when
+ building with os_unix.c. (Frodak Baksik, Ken Takata)
+Files: src/Make_bc5.mak, src/Make_cyg.mak, src/Make_ivc.mak,
+ src/Make_ming.mak, src/Make_mvc.mak, src/Make_w16.mak,
+ src/Makefile, src/config.h.in, src/configure.in,
+ src/auto/configure, src/feature.h, src/globals.h, src/mbyte.c,
+ src/os_mswin.c, src/os_unix.c, src/os_win32.c, src/proto.h,
+ src/proto/os_mswin.pro, src/proto/winclip.pro, src/term.c,
+ src/vim.h, src/winclip.c
+
+Patch 7.3.837 (after 7.3.826)
+Problem: Empty lines in :version output when 'columns' is 320.
+Solution: Simplify the logic of making columns. (Nazri Ramliy, Roland
+ Eggner)
+Files: src/version.c
+
+Patch 7.3.838 (after 7.3.830)
+Problem: Insufficient testing for mksession.
+Solution: Add tests. (mostly by Roland Eggner)
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test92.in, src/testdir/test92.ok,
+ src/testdir/test93.in, src/testdir/test93.ok,
+ src/ex_docmd.c
+
+Patch 7.3.839
+Problem: Some files missing in the list of distributed files.
+Solution: Add lines for new files.
+Files: Filelist
+
+Patch 7.3.840
+Problem: "\@<!" in regexp does not work correctly with multibyte
+ characters, especially cp932.
+Solution: Move column to start of multibyte character. (Yasuhiro Matsumoto)
+Files: src/regexp.c
+
+Patch 7.3.841
+Problem: When a "cond ? one : two" expression has a subscript it is not
+ parsed correctly. (Andy Wokula)
+Solution: Handle a subscript also when the type is unknown. (Christian
+ Brabandt)
+Files: src/eval.c
+
+Patch 7.3.842
+Problem: Compiler warning for signed/unsigned pointer.
+Solution: Add type cast. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.3.843 (after 7.3.841)
+Problem: Missing test file changes.
+Solution: Change the tests.
+Files: src/testdir/test49.vim, src/testdir/test49.ok
+
+Patch 7.3.844
+Problem: Enum is not indented correctly with "public" etc.
+Solution: Skip "public", "private" and "protected". (Hong Xu)
+Files: src/misc1.c
+
+Patch 7.3.845 (after 7.3.844)
+Problem: Enum indenting is not tested.
+Solution: Add tests. (Hong Xu)
+Files: src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.3.846
+Problem: Missing proto files.
+Solution: Add the files.
+Files: Filelist, src/proto/os_beos.pro
+
+Patch 7.3.847
+Problem: Test 55 fails when messages are translated.
+Solution: Set language to C. (Ken Takata)
+Files: src/testdir/test55.in
+
+Patch 7.3.848
+Problem: Can't build with Ruby 2.0 when using MinGW x64 or MSVC10.
+Solution: Fix it. Also detect RUBY_PLATFORM and RUBY_INSTALL_NAME for x64.
+ (Ken Takata)
+Files: src/Make_cyg.mak, src/Make_ming.mak, src/if_ruby.c
+
+Patch 7.3.849
+Problem: ":g//" gives "Pattern not found error" with E486. Should not use
+ the error number, it's not a regular error message.
+Solution: Use a normal message. (David Bürgin)
+Files: src/ex_cmds.c
+
+Patch 7.3.850
+Problem: ":vimgrep //" matches everywhere.
+Solution: Make it use the previous search pattern. (David Bürgin)
+Files: runtime/doc/quickfix.txt, src/quickfix.c
+
+Patch 7.3.851
+Problem: Using an empty pattern with :sort silently continues when there is
+ no previous search pattern.
+Solution: Give an error message. (David Bürgin)
+Files: src/ex_cmds.c
+
+Patch 7.3.852
+Problem: system() breaks clipboard text. (Yukihiro Nakadaira)
+Solution: Use Xutf8TextPropertyToTextList(). (Christian Brabandt)
+ Also do not put the text in the clip buffer if conversion fails.
+Files: src/ui.c, src/ops.c
+
+Patch 7.3.853
+Problem: Using "ra" in multiple lines on multibyte characters leaves a few
+ characters not replaced.
+Solution: Adjust the end column only in the last line. (Yasuhiro Matsumoto)
+Files: src/testdir/test69.in, src/testdir/test69.ok, src/ops.c
+
+Patch 7.3.854
+Problem: After using backspace in insert mode completion, CTRL-N and CTRL-P
+ do not highlight the right entry. (Olivier Teuliere)
+Solution: Set the current item to the shown item after using backspace.
+Files: src/edit.c
+
+Patch 7.3.855
+Problem: Compiler warnings.
+Solution: Add type casts. (Mike Williams)
+Files: src/misc1.c
+
+Patch 7.3.856
+Problem: When calling system() multibyte clipboard contents is garbled.
+Solution: Save and restore the clipboard contents. (Yukihiro Nakadaira)
+Files: src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro, src/ops.c,
+ src/proto/ops.pro, src/os_unix.c, src/proto/ui.pro, src/ui.c
+
+Patch 7.3.857
+Problem: The QuitPre autocommand event does not trigger for :qa and :wq.
+Solution: Trigger the event. (Tatsuro Fujii)
+Files: src/ex_docmd.c
+
+Patch 7.3.858
+Problem: "gv" selects the wrong area after some operators.
+Solution: Save and restore the type of selection. (Christian Brabandt)
+Files: src/testdir/test66.in, src/testdir/test66.ok, src/normal.c
+
+Patch 7.3.859
+Problem: 'ambiwidth' must be set by the user.
+Solution: Detects East Asian ambiguous width (UAX #11) state of the terminal
+ at the start-up time and 'ambiwidth' accordingly. (Hayaki Saito)
+Files: src/main.c, src/option.c, src/term.c, src/term.h,
+ src/proto/term.pro
+
+Patch 7.3.860
+Problem: When using --remote-expr try/catch does not work. (Andrey Radev)
+Solution: Set emsg_silent instead of emsg_skip.
+Files: src/main.c
+
+Patch 7.3.861
+Problem: ":setlocal number" clears global value of 'relativenumber'.
+Solution: Do it properly. (Markus Heidelberg)
+Files: src/testdir/test89.in, src/testdir/test89.ok, src/option.c
+
+Patch 7.3.862
+Problem: Dragging the status line can be slow.
+Solution: Look ahead and drop the drag event if there is a next one.
+Files: src/eval.c, src/misc1.c, src/proto/misc1.pro, src/normal.c
+
+Patch 7.3.863 (after 7.3.859)
+Problem: Problem with 'ambiwidth' detection for ANSI terminal.
+Solution: Work around not recognizing a term response. (Hayaki Saito)
+Files: src/term.c
+
+Patch 7.3.864 (after 7.3.862)
+Problem: Can't build without the mouse feature.
+Solution: Add an #ifdef. (Ike Devolder)
+Files: src/misc1.c
+
+Patch 7.3.865 (after 7.3.862)
+Problem: Mouse position may be wrong.
+Solution: Let vungetc() restore the mouse position.
+Files: src/getchar.c
+
+Patch 7.3.866
+Problem: Not serving the X selection during system() isn't nice.
+Solution: When using fork() do not loose the selection, keep serving it.
+ Add a loop similar to handling I/O. (Yukihiro Nakadaira)
+Files: src/os_unix.c
+
+Patch 7.3.867
+Problem: Matchparen does not update match when using auto-indenting.
+ (Marc Aldorasi)
+Solution: Add the TextChanged and TextChangedI autocommand events.
+Files: runtime/plugin/matchparen.vim, src/main.c, src/edit.c,
+ src/globals.h, src/vim.h, src/fileio.c, src/proto/fileio.pro,
+ runtime/doc/autocmd.txt
+
+Patch 7.3.868
+Problem: When at the hit-return prompt and using "k" while no text has
+ scrolled off screen, then using "j", an empty line is displayed.
+Solution: Only act on "k" when text scrolled off screen. Also accept
+ page-up and page-down. (cptstubing)
+Files: src/message.c
+
+Patch 7.3.869
+Problem: bufwinnr() matches buffers in other tabs.
+Solution: For bufwinnr() and ? only match buffers in the current tab.
+ (Alexey Radkov)
+Files: src/buffer.c, src/diff.c, src/eval.c, src/ex_docmd.c,
+ src/if_perl.xs, src/proto/buffer.pro
+
+Patch 7.3.870
+Problem: Compiler warnings when using MingW 4.5.3.
+Solution: Do not use MAKEINTRESOURCE. Adjust #if. (Ken Takata)
+Files: src/gui_w32.c, src/gui_w48.c, src/os_mswin.c, src/os_win32.c,
+ src/os_win32.h
+
+Patch 7.3.871
+Problem: search('^$', 'c') does not use the empty match under the cursor.
+Solution: Special handling of the 'c' flag. (Christian Brabandt)
+ Add tests.
+Files: src/search.c, src/testdir/test14.in, src/testdir/test14.ok
+
+Patch 7.3.872
+Problem: On some systems case of file names is always ignored, on others
+ never.
+Solution: Add the 'fileignorecase' option to control this at runtime.
+ Implies 'wildignorecase'.
+Files: src/buffer.c, src/edit.c, src/ex_cmds2.c, src/ex_getln.c,
+ src/fileio.c, src/misc1.c, src/misc2.c, src/option.c,
+ src/option.h, src/vim.h, runtime/doc/options.txt
+
+Patch 7.3.873
+Problem: Cannot easily use :s to make title case.
+Solution: Have "\L\u" result in title case. (James McCoy)
+Files: src/regexp.c, src/testdir/test79.in, src/testdir/test79.ok,
+ src/testdir/test80.in, src/testdir/test80.ok
+
+Patch 7.3.874
+Problem: Comparing file names does not handle multibyte characters
+ properly.
+Solution: Implement multibyte handling.
+Files: src/misc1.c, src/misc2.c
+
+Patch 7.3.875 (after 7.3.866)
+Problem: Build problem with some combination of features.
+Solution: Use FEAT_XCLIPBOARD instead of FEAT_CLIPBOARD.
+Files: src/os_unix.c
+
+Patch 7.3.876
+Problem: #if indents are off.
+Solution: Insert a space where appropriate. (Taro Muraoka)
+Files: src/gui.c
+
+Patch 7.3.877 (after 7.3.871)
+Problem: Forward searching with search() is broken.
+Solution: Fix it and add tests. (Sung Pae)
+Files: src/search.c, src/testdir/test14.in, src/testdir/test14.ok
+
+Patch 7.3.878
+Problem: 'fileignorecase' is missing in options window and quickref.
+Solution: Add the option.
+Files: runtime/optwin.vim, runtime/doc/quickref.txt
+
+Patch 7.3.879
+Problem: When using an ex command in operator pending mode, using Esc to
+ abort the command still executes the operator. (David Bürgin)
+Solution: Clear the operator when the ex command fails. (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.3.880
+Problem: When writing viminfo, old history lines may replace lines written
+ more recently by another Vim instance.
+Solution: Mark history entries that were read from viminfo and overwrite
+ them when merging with the current viminfo.
+Files: src/ex_getln.c
+
+Patch 7.3.881
+Problem: Python list does not work correctly.
+Solution: Fix it and add a test. (Yukihiro Nakadaira)
+Files: src/testdir/test86.in, src/testdir/test86.ok, src/if_py_both.h
+
+Patch 7.3.882
+Problem: CursorHold may trigger after receiving the termresponse.
+Solution: Set the did_cursorhold flag. (Hayaki Saito)
+Files: src/term.c
+
+Patch 7.3.883 (after 7.3.880)
+Problem: Can't build with some combination of features.
+Solution: Adjust #ifdefs.
+Files: src/ex_getln.c
+
+Patch 7.3.884
+Problem: Compiler warning for variable shadowing another. (John Little)
+Solution: Rename the variable. (Christian Brabandt)
+Files: src/term.c
+
+Patch 7.3.885
+Problem: Double free for list and dict in Lua. (Shougo Matsu)
+Solution: Do not unref list and dict. (Yasuhiro Matsumoto)
+Files: src/if_lua.c
+
+Patch 7.3.886
+Problem: Can't build with multibyte on Solaris 10.
+Solution: Add #ifdef X_HAVE_UTF8_STRING. (Laurent Blume)
+Files: src/ui.c
+
+Patch 7.3.887
+Problem: No tests for Visual mode operators, what 7.3.879 fixes.
+Solution: Add a new test file. (David Bürgin)
+Files: src/testdir/test94.in, src/testdir/test94.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.3.888
+Problem: Filename completion with 'fileignorecase' does not work for
+ multibyte characters.
+Solution: Make 'fileignorecase' work properly. (Hirohito Higashi)
+Files: src/misc2.c
+
+Patch 7.3.889
+Problem: Can't build with Ruby 2.0 on a 64 bit system.
+Solution: Define rb_fix2int and rb_num2int. (Kohei Suzuki)
+Files: src/if_ruby.c
+
+Patch 7.3.890
+Problem: Test 79 fails on Windows. (Michael Soyka)
+Solution: Add comment below line causing an error.
+Files: src/testdir/test79.in
+
+Patch 7.3.891
+Problem: Merging viminfo history doesn't work well.
+Solution: Don't stop when one type of history is empty. Don't merge history
+ when writing viminfo.
+Files: src/ex_getln.c
+
+Patch 7.3.892 (after 7.3.891)
+Problem: Still merging problems for viminfo history.
+Solution: Do not merge lines when writing, don't write old viminfo lines.
+Files: src/ex_getln.c, src/ex_cmds.c, src/proto/ex_getln.pro
+
+Patch 7.3.893
+Problem: Crash when using b:, w: or t: after closing the buffer, window or
+ tabpage.
+Solution: Allocate the dictionary instead of having it part of the
+ buffer/window/tabpage struct. (Yukihiro Nakadaira)
+Files: src/buffer.c, src/eval.c, src/fileio.c, src/structs.h,
+ src/window.c, src/proto/eval.pro
+
+Patch 7.3.894
+Problem: Using wrong RUBY_VER causing Ruby build to break.
+Solution: Correct the RUBY_VER value. (Yongwei Wu)
+Files: src/bigvim.bat
+
+Patch 7.3.895
+Problem: Valgrind error in test 91. (Issue 128)
+Solution: Pass scope name to find_var_in_ht().
+Files: src/eval.c
+
+Patch 7.3.896
+Problem: Memory leaks in Lua interface.
+Solution: Fix the leaks, add tests. (Yukihiro Nakadaira)
+Files: src/testdir/test85.in, src/testdir/test85.ok, src/if_lua.c
+
+Patch 7.3.897
+Problem: Configure doesn't always find the shared library.
+Solution: Change the configure script. (Ken Takata)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.898
+Problem: Memory leak reported by valgrind in test 91.
+Solution: Only use default argument when needed.
+Files: src/eval.c, src/testdir/test91.in, src/testdir/test91.ok
+
+Patch 7.3.899
+Problem: #if indents are off.
+Solution: Fix the indents.
+Files: src/os_unix.c
+
+Patch 7.3.900
+Problem: Not obvious that some mouse features are mutual-exclusive.
+Solution: Add a comment.
+Files: src/feature.h
+
+Patch 7.3.901
+Problem: Outdated comment, ugly condition.
+Solution: Update a few comments, break line.
+Files: src/getchar.c, src/misc1.c, src/undo.c
+
+Patch 7.3.902
+Problem: When deleting last buffer in other tab the tabline is not updated.
+Solution: Set the redraw_tabline flag. (Yukihiro Nakadaira)
+Files: src/window.c
+
+Patch 7.3.903 (after 7.3.892)
+Problem: Crash on exit writing viminfo. (Ron Aaron)
+Solution: Check for the history to be empty.
+Files: src/ex_getln.c
+
+Patch 7.3.904 (after 7.3.893)
+Problem: Using memory freed by the garbage collector.
+Solution: Mark items in aucmd_win as used.
+Files: src/eval.c
+
+Patch 7.3.905 (after 7.3.903)
+Problem: Crash when writing viminfo. (Ron Aaron)
+Solution: Prevent freed history info to be used.
+Files: src/ex_getln.c
+
+Patch 7.3.906
+Problem: The "sleep .2" for running tests does not work on Solaris.
+Solution: Fall back to using "sleep 1". (Laurent Blume)
+Files: src/testdir/Makefile
+
+Patch 7.3.907
+Problem: Python uses IndexError when a dict key is not found.
+Solution: Use KeyError instead. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.908
+Problem: Possible crash when using a list in Python.
+Solution: Return early if the list is NULL. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.909
+Problem: Duplicate Python code.
+Solution: Move more items to if_py_both.h. (ZyX) Also avoid compiler
+ warnings for missing initializers.
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
+
+Patch 7.3.910
+Problem: Python code in #ifdef branches with only minor differences.
+Solution: Merge the #ifdef branches. (ZyX)
+Files: src/if_py_both.h, src/if_python.c
+
+Patch 7.3.911
+Problem: Python: Access to Vim variables is not so easy.
+Solution: Define vim.vars and vim.vvars. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/eval.c, src/globals.h,
+ src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.912
+Problem: Typing a ":" command at the hit-enter dialog does not work if the
+ "file changed" dialog happens next.
+Solution: Check for changed files before giving the hit-enter dialog.
+Files: src/message.c
+
+Patch 7.3.913 (after 7.3.905)
+Problem: Still a crash when writing viminfo.
+Solution: Add checks for NULL pointers. (Ron Aaron)
+Files: src/ex_getln.c
+
+Patch 7.3.914
+Problem: ~/.viminfo is messed up when running tests.
+Solution: Set the viminfo filename.
+Files: src/testdir/test89.in, src/testdir/test94.in
+
+Patch 7.3.915
+Problem: When reading a file with encoding conversion fails at the end the
+ next encoding in 'fencs' is not used.
+Solution: Retry with another encoding when possible. (Taro Muraoka)
+Files: src/fileio.c
+
+Patch 7.3.916
+Problem: Using freed memory when pasting with the mouse (Issue 130).
+Solution: Get the byte value early. (hint by Dominique Pelle)
+Files: src/buffer.c
+
+Patch 7.3.917
+Problem: When a path ends in a backslash appending a comma has the wrong
+ effect.
+Solution: Replace a trailing backslash with a slash. (Nazri Ramliy)
+Files: src/misc1.c, src/testdir/test73.in, src/testdir/test73.ok
+
+Patch 7.3.918
+Problem: Repeating an Ex command after using a Visual motion does not work.
+Solution: Check for an Ex command being used. (David Bürgin)
+Files: src/normal.c
+
+Patch 7.3.919 (after 7.3.788)
+Problem: An empty nl.po file does not work with an old msgfmt.
+Solution: Put a single # in the file. (Laurent Blume)
+Files: src/po/Makefile
+
+Patch 7.3.920
+Problem: Compiler warning for size_t to int.
+Solution: Add a type cast. (Mike Williams)
+Files: src/misc1.c
+
+Patch 7.3.921 (after 7.3.697)
+Problem: Trying to create a fontset handle when 'guifontset' is not set.
+Solution: Add curly braces around the code block. (Max Kirillov)
+Files: src/syntax.c
+
+Patch 7.3.922
+Problem: No test for what 7.3.918 fixes.
+Solution: Add a test. (David Bürgin)
+Files: src/testdir/test94.in, src/testdir/test94.ok
+
+Patch 7.3.923
+Problem: Check for X11 header files fails on Solaris.
+Solution: Only use -Werror for gcc. (Laurent Blume)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.924
+Problem: Python interface can't easily access options.
+Solution: Add vim.options, vim.window.options and vim.buffer.options. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/eval.c, src/if_py_both.h,
+ src/if_python.c, src/if_python3.c, src/option.c,
+ src/proto/eval.pro, src/proto/option.pro, src/testdir/test86.in,
+ src/testdir/test86.ok, src/testdir/test87.in,
+ src/testdir/test87.ok, src/vim.h
+
+Patch 7.3.925
+Problem: Typos in source files.
+Solution: Fix the typos. (Ken Takata)
+Files: runtime/plugin/matchparen.vim, runtime/tools/vim_vs_net.cmd,
+ src/GvimExt/gvimext.cpp, src/INSTALLvms.txt, src/Make_cyg.mak,
+ src/Make_mvc.mak, src/Make_sas.mak, src/Make_vms.mms,
+ src/Make_w16.mak, src/Makefile, src/VisVim/OleAut.cpp,
+ src/VisVim/README_VisVim.txt, src/auto/configure, src/buffer.c,
+ src/configure.in, src/diff.c, src/dosinst.c, src/edit.c,
+ src/eval.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c,
+ src/farsi.c, src/feature.h, src/fileio.c, src/glbl_ime.cpp,
+ src/gui.c, src/gui_athena.c, src/gui_beval.c, src/gui_gtk_x11.c,
+ src/gui_mac.c, src/gui_motif.c, src/gui_photon.c, src/gui_w16.c,
+ src/gui_w32.c, src/gui_w48.c, src/gui_xmebw.c, src/gui_xmebwp.h,
+ src/hardcopy.c, src/if_cscope.c, src/if_mzsch.c, src/if_ole.cpp,
+ src/if_perl.xs, src/if_py_both.h, src/if_python.c,
+ src/if_python3.c, src/if_ruby.c, src/main.aap, src/mbyte.c,
+ src/memfile.c, src/memline.c, src/misc1.c, src/misc2.c,
+ src/nbdebug.c, src/normal.c, src/ops.c, src/os_amiga.c,
+ src/os_mac.h, src/os_msdos.c, src/os_mswin.c, src/os_win16.h,
+ src/os_win32.c, src/os_win32.h, src/quickfix.c, src/screen.c,
+ src/search.c, src/spell.c, src/structs.h, src/syntax.c,
+ src/window.c, vimtutor.com
+
+
+Patch 7.3.926
+Problem: Autocommands are triggered by setwinvar() et al. Missing BufEnter
+ on :tabclose. Duplicate WinEnter on :tabclose. Wrong order of
+ events for :tablose and :tabnew.
+Solution: Fix these autocommand events. (ZyX)
+Files: runtime/doc/eval.txt, src/buffer.c, src/eval.c, src/ex_cmds2.c,
+ src/fileio.c, src/proto/window.pro, src/testdir/test62.in,
+ src/testdir/test62.ok, src/window.c
+
+Patch 7.3.927
+Problem: Missing combining characters when putting text in a register.
+Solution: Include combining characters. (David Bürgin)
+Files: src/getchar.c, src/testdir/test44.in, src/testdir/test44.ok
+
+Patch 7.3.928 (after 7.3.924)
+Problem: Can't build with strict C compiler.
+Solution: Move declaration to start of block. (Taro Muraoka)
+Files: src/if_py_both.h
+
+Patch 7.3.929 (after 7.3.924)
+Problem: Compiler warning for unused variable. Not freeing unused string.
+Solution: Remove the variable. Clear the options.
+Files: src/option.c
+
+Patch 7.3.930
+Problem: MSVC 2012 update is not recognized.
+Solution: Update the version in the makefile. (Raymond Ko)
+Files: src/Make_mvc.mak
+
+Patch 7.3.931
+Problem: No completion for :xmap and :smap. (Yukihiro Nakadaira)
+Solution: Add the case statements. (Christian Brabandt)
+Files: src/ex_docmd.c
+
+Patch 7.3.932
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Initialize the variable.
+Files: src/option.c
+
+Patch 7.3.933
+Problem: Ruby on Mac crashes due to GC failure.
+Solution: Init the stack from main(). (Hiroshi Shirosaki)
+Files: src/main.c, src/if_ruby.c, src/proto/if_ruby.pro
+
+Patch 7.3.934
+Problem: E381 and E380 make the user think nothing happened.
+Solution: Display the message indicating what error list is now active.
+ (Christian Brabandt)
+Files: src/quickfix.c
+
+Patch 7.3.935 (after 7.3.933)
+Problem: Ruby: Init stack works differently on 64 bit systems.
+Solution: Handle 64 bit systems and also static library. (Yukihiro
+ Nakadaira)
+Files: src/if_ruby.c
+
+Patch 7.3.936 (after 7.3.935)
+Problem: Ruby 1.8: Missing piece for static linking on 64 bit systems.
+Solution: Define ruby_init_stack() (Hiroshi Shirosaki)
+ Also fix preprocessor indents.
+Files: src/if_ruby.c
+
+Patch 7.3.937
+Problem: More can be shared between Python 2 and 3.
+Solution: Move code to if_py_both.h. (ZyX)
+Files: src/if_python.c, src/if_python3.c, src/if_py_both.h
+
+Patch 7.3.938
+Problem: Python: not easy to get to window number.
+Solution: Add vim.window.number. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/proto/window.pro,
+ src/window.c
+
+Patch 7.3.939
+Problem: Using Py_BuildValue is inefficient sometimes.
+Solution: Use PyLong_FromLong(). (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.940
+Problem: Python: Can't get position of window.
+Solution: Add window.row and window.col. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h
+
+Patch 7.3.941
+Problem: Stuff in if_py_both.h is ordered badly.
+Solution: Reorder by type. (ZyX)
+Files: src/if_py_both.h, src/if_python.c
+
+Patch 7.3.942
+Problem: Python: SEGV in Buffer functions.
+Solution: Call CheckBuffer() at the right time. (ZyX)
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 7.3.943
+Problem: Python: Negative indices were failing.
+Solution: Fix negative indices. Add tests. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/testdir/test86.in,
+ src/testdir/test86.ok, src/testdir/test87.in,
+ src/testdir/test87.ok
+
+Patch 7.3.944
+Problem: External program receives the termresponse.
+Solution: Insert a delay and discard input. (Hayaki Saito)
+Files: src/term.c
+
+Patch 7.3.945
+Problem: Python: List of buffers is not very useful.
+Solution: Make vim.buffers a map. No iterator yet. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/if_python3.c,
+ src/if_python.c, src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.946
+Problem: Sometimes get stuck in waiting for cursor position report,
+ resulting in keys starting with <Esc>[ not working.
+Solution: Only wait for more characters after <Esc>[ if followed by '?', '>'
+ or a digit.
+Files: src/term.c
+
+Patch 7.3.947
+Problem: Python: No iterator for vim.list and vim.bufferlist.
+Solution: Add the iterators. Also fix name of FunctionType. Add tests for
+ vim.buffers. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/eval.c, src/if_py_both.h,
+ src/if_python3.c, src/if_python.c, src/proto/eval.pro,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.948
+Problem: Cannot build with Python 2.2
+Solution: Make Python interface work with Python 2.2
+ Make 2.2 the first supported version. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.ok, src/configure.in, src/auto/configure
+
+Patch 7.3.949
+Problem: Python: no easy access to tabpages.
+Solution: Add vim.tabpages and vim.current.tabpage. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/if_python3.c,
+ src/if_python.c, src/proto/if_python3.pro,
+ src/proto/if_python.pro, src/proto/window.pro, src/structs.h,
+ src/window.c
+
+Patch 7.3.950
+Problem: Python: Stack trace printer can't handle messages.
+Solution: Make KeyErrors use PyErr_SetObject. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
+
+Patch 7.3.951
+Problem: Python exceptions have problems.
+Solution: Change some IndexErrors to TypeErrors. Make “line number out of
+ range” an IndexError. Make “unable to get option value” a
+ RuntimeError. Make all PyErr_SetString messages start with
+ lowercase letter and use _(). (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.952
+Problem: Python: It's not easy to change window/buffer/tabpage.
+Solution: Add ability to assign to vim.current.{tabpage,buffer,window}.
+ (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h
+
+Patch 7.3.953
+Problem: Python: string exceptions are deprecated.
+Solution: Make vim.error an Exception subclass. (ZyX)
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.3.954
+Problem: No check if PyObject_IsTrue fails.
+Solution: Add a check for -1 value. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.955
+Problem: Python: Not enough tests.
+Solution: Add tests for vim.{current,window*,tabpage*}. (ZyX)
+Files: src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.956
+Problem: Python vim.bindeval() causes SIGABRT.
+Solution: Make pygilstate a local variable. (Yukihiro Nakadaira)
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 7.3.957
+Problem: Python does not have a "do" command like Perl or Lua.
+Solution: Add the ":py3do" command. (Lilydjwg)
+Files: runtime/doc/if_pyth.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/if_python3.c, src/proto/if_python3.pro
+
+Patch 7.3.958
+Problem: Python: Iteration destructor not set.
+Solution: Put IterDestructor to use. (ZyX)
+Files: src/if_py_both.c
+
+Patch 7.3.959 (after 7.3.957)
+Problem: Missing error number.
+Solution: Assign an error number.
+Files: src/if_python3.c
+
+Patch 7.3.960
+Problem: Compiler warning for unused variable.
+Solution: Put declaration in #ifdef.
+Files: src/window.c
+
+Patch 7.3.961
+Problem: Tests 86 and 87 fail when using another language than English.
+Solution: Set the language to C in the test. (Dominique Pelle)
+Files: src/testdir/test86.in, src/testdir/test87.in,
+ src/testdir/test87.ok
+
+Patch 7.3.962
+Problem: Python tests are not portable.
+Solution: Use shiftwidth instead of iminsert. (ZyX)
+Files: src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.963
+Problem: Setting curbuf without curwin causes trouble.
+Solution: Add switch_buffer() and restore_buffer(). Block autocommands to
+ avoid trouble.
+Files: src/eval.c, src/proto/eval.pro, src/proto/window.pro,
+ src/if_py_both.h, src/window.c, src/testdir/test86.ok
+
+Patch 7.3.964
+Problem: Python: not so easy to access tab pages.
+Solution: Add window.tabpage, make window.number work with non-current tab
+ pages. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/if_python3.c,
+ src/if_python.c, src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.965
+Problem: Python garbage collection not working properly.
+Solution: Add support for garbage collection. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.966
+Problem: There is ":py3do" but no ":pydo".
+Solution: Add the ":pydo" command. (Lilydjwg)
+Files: runtime/doc/if_pyth.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/if_py_both.h, src/if_python.c, src/if_python3.c,
+ src/proto/if_python.pro
+
+Patch 7.3.967 (after 7.3.965)
+Problem: Build fails on Mac OSX. (Greg Novack)
+Solution: Undefine clear().
+Files: src/if_py_both.h
+
+Patch 7.3.968
+Problem: Multi-byte support is only available when compiled with "big"
+ features.
+Solution: Include multibyte by default, with "normal" features.
+Files: src/feature.h
+
+Patch 7.3.969
+Problem: Can't build with Python 3 and without Python 2.
+Solution: Adjust #ifdef. (Xavier de Gaye)
+Files: src/window.c
+
+Patch 7.3.970
+Problem: Syntax highlighting can be slow.
+Solution: Include the NFA regexp engine. Add the 'regexpengine' option to
+ select which one is used. (various authors, including Ken Takata,
+ Andrei Aiordachioaie, Russ Cox, Xiaozhou Liua, Ian Young)
+Files: src/Make_cyg.mak, src/Make_ming.mak, src/Make_mvc.mak,
+ src/Makefile, src/regexp.c, src/regexp.h, src/regexp_nfa.c,
+ src/structs.h, src/testdir/Makefile, src/testdir/test64.in,
+ src/testdir/test64.ok, Filelist, runtime/doc/pattern.txt,
+ runtime/doc/option.txt, src/option.c, src/option.h,
+ src/testdir/test95.in, src/testdir/test95.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.3.971
+Problem: No support for VS2012 static code analysis.
+Solution: Add the ANALYZE option. (Mike Williams)
+Files: src/Make_mvc.mak
+
+Patch 7.3.972
+Problem: Cursor not restored after InsertEnter autocommand if it moved to
+ another line.
+Solution: Also restore if the saved line number is still valid. Allow
+ setting v:char to skip restoring.
+Files: src/edit.c, runtime/doc/autocmd.txt
+
+Patch 7.3.973
+Problem: Compiler warnings. Crash on startup. (Tony Mechelynck)
+Solution: Change EMSG2 to EMSGN. Make array one character longer.
+Files: src/regexp_nfa.c
+
+Patch 7.3.974
+Problem: Can't build with ruby 1.8.5.
+Solution: Only use ruby_init_stack() when RUBY_INIT_STACK is defined.
+ (Yukihiro Nakadaira)
+Files: src/if_ruby.c
+
+Patch 7.3.975
+Problem: Crash in regexp parsing.
+Solution: Correctly compute the end of allocated memory.
+Files: src/regexp_nfa.c
+
+Patch 7.3.976
+Problem: Can't build on HP-UX.
+Solution: Remove modern initialization. (John Marriott)
+Files: src/regexp_nfa.c
+
+Patch 7.3.977
+Problem: Compiler warnings on 64 bit Windows.
+Solution: Add type casts. (Mike Williams) Also fix some white space and
+ uncomment what was commented-out for testing.
+Files: src/regexp_nfa.c
+
+Patch 7.3.978
+Problem: Regexp debug logs don't have a good name.
+Solution: Use clear names and make it possible to write logs for the old and
+ new engines separately. (Taro Muraoka)
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.3.979
+Problem: Complex NFA regexp doesn't work.
+Solution: Set actual state stack end instead of using an arbitrary number.
+ (Yasuhiro Matsumoto)
+Files: src/regexp_nfa.c
+
+Patch 7.3.980
+Problem: Regexp logs may contain garbage. Character classes don't work
+ correctly for multibyte characters.
+Solution: Check for end of post list. Only use "is" functions for
+ characters up to 255. (Ken Takata)
+Files: src/regexp_nfa.c
+
+Patch 7.3.981
+Problem: In the old regexp engine \i, \I, \f and \F don't work on
+ multibyte characters.
+Solution: Dereference pointer properly.
+Files: src/regexp.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.982
+Problem: In the new regexp engine \p does not work on multibyte
+ characters.
+Solution: Don't point to an integer but the characters.
+Files: src/regexp_nfa.c, src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.983
+Problem: Unnecessary temp variable.
+Solution: Remove the variable.
+Files: src/regexp_nfa.c
+
+Patch 7.3.984
+Problem: A Visual mapping that uses CTRL-G works differently when started
+ from Insert mode. (Ein Brown)
+Solution: Reset old_mapped_len when handling typed text in Select mode.
+Files: src/normal.c
+
+Patch 7.3.985
+Problem: GTK vim not started as gvim doesn't set WM_CLASS property to a
+ useful value.
+Solution: Call g_set_prgname() on startup. (James McCoy)
+Files: src/gui_gtk_x11.c
+
+Patch 7.3.986
+Problem: Test 95 doesn't pass when 'encoding' isn't utf-8. (Yasuhiro
+ Matsumoto)
+Solution: Force 'encoding' to be utf-8.
+Files: src/testdir/test95.in
+
+Patch 7.3.987
+Problem: No easy to run an individual test. Tests 64 fails when
+ 'encoding' is not utf-8.
+Solution: Add individual test targets to the Makefile. Move some lines from
+ test 64 to 95.
+Files: src/Makefile, src/testdir/test64.in, src/testdir/test64.ok,
+ src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.988
+Problem: New regexp engine is slow.
+Solution: Break out of the loop when the state list is empty.
+Files: src/regexp_nfa.c
+
+Patch 7.3.989
+Problem: New regexp engine compares negative numbers to character.
+Solution: Add missing case statements.
+Files: src/regexp_nfa.c
+
+Patch 7.3.990
+Problem: Memory leak in new regexp engine.
+Solution: Jump to end of function to free memory. (Dominique Pelle)
+Files: src/regexp_nfa.c
+
+Patch 7.3.991
+Problem: More can be shared by Python 2 and 3.
+Solution: Move more stuff to if_py_both. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test87.ok
+
+Patch 7.3.992
+Problem: Python: Too many type casts.
+Solution: Change argument types. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
+
+Patch 7.3.993
+Problem: Python: Later patch does things slightly differently.
+Solution: Adjusted argument type changes. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
+
+Patch 7.3.994
+Problem: Python: using magic constants.
+Solution: Use descriptive values for ml_flags. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c
+
+Patch 7.3.995
+Problem: Python: Module initialization is duplicated.
+Solution: Move to shared file. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
+
+Patch 7.3.996
+Problem: Python: Can't check types of what is returned by bindeval().
+Solution: Add vim.List, vim.Dictionary and vim.Function types. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/testdir/test86.in,
+ src/testdir/test86.ok, src/testdir/test87.in,
+ src/testdir/test87.ok
+
+Patch 7.3.997
+Problem: Vim and Python exceptions are different.
+Solution: Make Vim exceptions be Python exceptions. (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.998
+Problem: Python: garbage collection issues.
+Solution: Fix the GC issues: Use proper DESTRUCTOR_FINISH: avoids negative
+ refcounts, use PyObject_GC_* for objects with tp_traverse and
+ tp_clear, add RangeTraverse and RangeClear, use Py_XDECREF in some
+ places. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
+
+Patch 7.3.999
+Problem: New regexp engine sets curbuf temporarily.
+Solution: Use reg_buf instead, like the old engine.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1000 (whoa!)
+Problem: Typo in char value causes out of bounds access.
+Solution: Fix character value. (Klemens Baum)
+Files: src/regexp.c
+
+Patch 7.3.1001
+Problem: Duplicate condition in if.
+Solution: Remove one condition.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1002
+Problem: Valgrind errors for Python interface.
+Solution: Fix memory leaks when running tests. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1003
+Problem: Python interface does not compile with Python 2.2
+Solution: Fix thread issues and True/False. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1004
+Problem: No error when option could not be set.
+Solution: Report an error. (ZyX)
+Files: src/if_py_both.h, src/option.c, src/proto/option.pro,
+ src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.1005
+Problem: Get stuck on regexp "\n*" and on "%s/^\n\+/\r".
+Solution: Fix handling of matching a line break. (idea by Hirohito Higashi)
+Files: src/regexp_nfa.c
+
+Patch 7.3.1006
+Problem: NFA engine not used for "\_[0-9]".
+Solution: Enable this, fixed in patch 1005.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1007
+Problem: Can't build on Minix 3.2.1.
+Solution: Add a condition to an #ifdef. (Gautam Tirumala)
+Files: src/memfile.c
+
+Patch 7.3.1008
+Problem: Test 95 fails on MS-Windows.
+Solution: Set 'nomore'. Change \i to \f. Change multibyte character to
+ something that is not matching \i. (Ken Takata)
+Files: src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.1009
+Problem: Compiler warning for ambiguous else.
+Solution: Add curly braces.
+Files: src/if_py_both.h
+
+Patch 7.3.1010
+Problem: New regexp: adding \Z makes every character match.
+Solution: Only apply ireg_icombine for composing characters.
+ Also add missing change from patch 1008. (Ken Takata)
+Files: src/regexp_nfa.c, src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.1011
+Problem: New regexp engine is inefficient with multibyte characters.
+Solution: Handle a character at a time instead of a byte at a time. Also
+ make \Z partly work.
+Files: src/regexp_nfa.c, src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.1012
+Problem: \Z does not work properly with the new regexp engine.
+Solution: Make \Z work. Add tests.
+Files: src/regexp_nfa.c, src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.1013
+Problem: New regexp logging is a bit messy.
+Solution: Consistently use #defines, add explanatory comment. (Taro Muraoka)
+Files: src/regexp_nfa.c
+
+Patch 7.3.1014
+Problem: New regexp state dump is hard to read.
+Solution: Make the state dump more pretty. (Taro Muraoka)
+Files: src/regexp_nfa.c
+
+Patch 7.3.1015
+Problem: New regexp engine: Matching composing characters is wrong.
+Solution: Fix matching composing characters.
+Files: src/regexp_nfa.c, src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.1016
+Problem: Unused field in nfa_state.
+Solution: Remove lastthread.
+Files: src/regexp.h, src/regexp_nfa.c
+
+Patch 7.3.1017
+Problem: Zero width match changes length of match.
+Solution: For a zero width match put new states in the current position in
+ the state list.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok,
+ src/regexp.h
+
+Patch 7.3.1018
+Problem: New regexp engine wastes memory.
+Solution: Allocate prog with actual number of states, not estimated maximum
+ number of states.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1019
+Problem: These do not work with the new regexp engine: \%o123, \%x123,
+ \%d123, \%u123 and \%U123.
+Solution: Implement these items.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1020
+Problem: Not all patterns are tested with auto / old / new engine.
+Solution: Test patterns with three values of 'regexpengine'.
+Files: src/testdir/test64.in, src/testdir/test64.ok,
+ src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.1021
+Problem: New regexp engine does not ignore order of composing chars.
+Solution: Ignore composing chars order.
+Files: src/regexp_nfa.c, src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.1022
+Problem: Compiler warning for shadowed variable. (John Little)
+Solution: Move declaration, rename variables.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1023
+Problem: Searching for composing char only and using \Z has different
+ results.
+Solution: Make it match the composing char, matching everything is not
+ useful.
+Files: src/regexp_nfa.c, src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.3.1024
+Problem: New regexp: End of matching pattern not set correctly. (Cesar
+ Romani)
+Solution: Quit the loop after finding the match. Store nfa_has_zend in the
+ program.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok,
+ src/regexp.h
+
+Patch 7.3.1025
+Problem: New regexp: not matching newline in string. (Marc Weber)
+Solution: Check for "\n" character.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1026
+Problem: New regexp: pattern that includes a new-line matches too early.
+ (John McGowan)
+Solution: Do not start searching in the second line.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1027
+Problem: New regexp performance: Calling no_Magic() very often.
+Solution: Remove magicness inline.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1028
+Problem: New regexp performance: Copying a lot of position state.
+Solution: Only copy the sub-expressions that are being used.
+Files: src/regexp_nfa.c, src/regexp.h
+
+Patch 7.3.1029
+Problem: New regexp performance: Unused position state being copied.
+Solution: Keep track of which positions are actually valid.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1030 (after 7.3.1028)
+Problem: Can't build for debugging.
+Solution: Fix struct member names.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1031
+Problem: Compiler warnings for shadowed variable. (John Little)
+Solution: Move the variable declarations to the scope where they are used.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1032
+Problem: "\ze" is not supported by the new regexp engine.
+Solution: Make "\ze" work.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1033
+Problem: "\1" .. "\9" are not supported in the new regexp engine.
+Solution: Implement them. Add a few more tests.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok,
+ src/regexp.h
+
+Patch 7.3.1034
+Problem: New regexp code using strange multibyte code.
+Solution: Use the normal code to advance and backup pointers.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1035
+Problem: Compiler warning on 64 bit windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/if_py_both.h
+
+Patch 7.3.1036
+Problem: Can't build on HP-UX.
+Solution: Give the union a name. (John Marriott)
+Files: src/regexp_nfa.c
+
+Patch 7.3.1037
+Problem: Look-behind matching is very slow on long lines.
+Solution: Add a byte limit to how far back an attempt is made.
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
+ src/testdir/test64.ok
+
+Patch 7.3.1038
+Problem: Crash when using Cscope.
+Solution: Avoid negative argument to vim_strncpy(). (Narendran
+ Gopalakrishnan)
+Files: src/if_cscope.c
+
+Patch 7.3.1039
+Problem: New regexp engine does not support \%23c, \%<23c and the like.
+Solution: Implement them. (partly by Yasuhiro Matsumoto)
+Files: src/regexp.h, src/regexp_nfa.c, src/testdir/test64.in,
+ src/testdir/test64.ok
+
+Patch 7.3.1040
+Problem: Python: Problems with debugging dynamic build.
+Solution: Python patch 1. (ZyX)
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.3.1041
+Problem: Python: Invalid read valgrind errors.
+Solution: Python patch 2: defer DICTKEY_UNREF until key is no longer needed.
+ (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1042
+Problem: Python: can't assign to vim.Buffer.name.
+Solution: Python patch 3. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/ex_cmds.c, src/if_py_both.h,
+ src/if_python3.c, src/if_python.c, src/proto/ex_cmds.pro,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1043
+Problem: Python: Dynamic compilation with 2.3 fails.
+Solution: Python patch 4. (ZyX)
+Files: src/if_python.c
+
+Patch 7.3.1044
+Problem: Python: No {Buffer,TabPage,Window}.valid attributes.
+Solution: Python patch 5: add .valid (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1045
+Problem: Python: No error handling for VimToPython function.
+Solution: Python patch 6. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1046
+Problem: Python: Using Py_BuildValue for building strings.
+Solution: Python patch 7 and 7.5: Replace Py_BuildValue with
+ PyString_FromString. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1047
+Problem: Python: dir() does not work properly.
+Solution: Python patch 8. Add __dir__ method to all objects with custom
+ tp_getattr supplemented by __members__ attribute for at least
+ python-2* versions. __members__ is not mentioned in python-3*
+ dir() output even if it is accessible. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1048
+Problem: Python: no consistent naming.
+Solution: Python patch 9: Rename d to dict and lookupDict to lookup_dict.
+ (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1049
+Problem: Python: no consistent naming
+Solution: Python patch 10: Rename DICTKEY_GET_NOTEMPTY to DICTKEY_GET. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1050
+Problem: Python: Typo in pyiter_to_tv.
+Solution: Python patch 11. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1051
+Problem: Python: possible memory leaks.
+Solution: Python patch 12: fix the leaks (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1052
+Problem: Python: possible SEGV and negative refcount.
+Solution: Python patch 13: Fix IterIter function. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1053
+Problem: Python: no flag for types with tp_traverse+tp_clear.
+Solution: Python patch 14: Add Py_TPFLAGS_HAVE_GC. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1054 (after 7.3.1042)
+Problem: Can't build without the +autocmd feature. (Elimar Riesebieter)
+Solution: Fix use of buf and curbuf.
+Files: src/ex_cmds.c, src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.1055
+Problem: Negated collection does not match newline.
+Solution: Handle newline differently. (Hiroshi Shirosaki)
+Files: src/regexp_nfa.c, src/testdir/test64.ok, src/testdir/test64.in
+
+Patch 7.3.1056
+Problem: Python: possible memory leaks.
+Solution: Python patch 15. (ZyX) Fix will follow later.
+Files: src/eval.c, src/if_py_both.h, src/proto/eval.pro
+
+Patch 7.3.1057
+Problem: Python: not enough compatibility.
+Solution: Python patch 16: Make OutputWritelines support any sequence object
+ (ZyX) Note: tests fail
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1058
+Problem: Call of funcref does not succeed in other script.
+Solution: Python patch 17: add get_expanded_name(). (ZyX)
+Files: src/eval.c, src/proto/eval.pro
+
+Patch 7.3.1059
+Problem: Python: Using fixed size buffers.
+Solution: Python patch 18: Use python's own formatter. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
+
+Patch 7.3.1060
+Problem: Python: can't repr() a function.
+Solution: Python patch 19: add FunctionRepr(). (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1061
+Problem: Python: Dictionary is not standard.
+Solution: Python patch 20: Add standard methods and fields. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/eval.c, src/if_py_both.h,
+ src/if_python3.c, src/if_python.c, src/proto/eval.pro,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1062
+Problem: Python: List is not standard.
+Solution: Python patch 21: Add standard methods and fields. (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1063
+Problem: Python: Function is not standard.
+Solution: Python patch 22: make Function subclassable. (ZyX)
+Files: src/eval.c, src/if_py_both.h, src/proto/eval.pro,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1064
+Problem: Python: insufficient error checking.
+Solution: Python patch 23. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1065
+Problem: Python: key mapping is not standard.
+Solution: Python patch 24: use PyMapping_Keys. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
+
+Patch 7.3.1066
+Problem: Python: Insufficient exception and error testing.
+Solution: Python patch 25. (ZyX)
+Files: src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1067
+Problem: Python: documentation lags behind.
+Solution: Python patch 26. (ZyX)
+Files: runtime/doc/if_pyth.txt
+
+Patch 7.3.1068
+Problem: Python: Script is auto-loaded on function creation.
+Solution: Python patch 27. (ZyX)
+Files: src/eval.c, src/if_py_both.h, src/proto/eval.pro,
+ src/testdir/test86.ok, src/testdir/test87.ok, src/vim.h
+
+Patch 7.3.1069
+Problem: Python: memory leaks.
+Solution: Python patch 28: Purge out DICTKEY_CHECK_EMPTY macros. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1070
+Problem: Vim crashes in Python tests. Compiler warning for unused function.
+Solution: Disable the tests for now. Move the function.
+Files: src/if_py_both.h, src/if_python.c, src/testdir/test86.in,
+ src/testdir/test87.in
+
+Patch 7.3.1071
+Problem: New regexp engine: backreferences don't work correctly.
+Solution: Add every possible start/end position on the state stack.
+Files: src/regexp_nfa.c, src/regexp.h, src/testdir/test64.in,
+ src/testdir/test64.ok
+
+Patch 7.3.1072
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize it.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1073
+Problem: New regexp engine may run out of states.
+Solution: Allocate states dynamically. Also make the test report errors.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok,
+ src/testdir/test95.in
+
+Patch 7.3.1074
+Problem: Compiler warning for printf format. (Manuel Ortega)
+Solution: Add type casts.
+Files: src/if_py_both.h
+
+Patch 7.3.1075
+Problem: Compiler warning for storing a long_u in an int.
+Solution: Declare the number as an int. (Mike Williams)
+Files: src/regexp_nfa.c
+
+Patch 7.3.1076
+Problem: New regexp engine: \@= and \& don't work.
+Solution: Make these items work. Add column info to logging.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1077
+Problem: Python: Allocating dict the wrong way, causing a crash.
+Solution: Use py_dict_alloc(). Fix some exception problems. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1078
+Problem: New regexp engine: \@! doesn't work.
+Solution: Implement the negated version of \@=.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1079
+Problem: Test 87 fails.
+Solution: Fix the test for Python 3.3. (ZyX) Make it pass on 32 bit systems.
+Files: src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1080
+Problem: Test 86 fails.
+Solution: Comment out the parts that don't work. Make it pass on 32 bit
+ systems.
+Files: src/testdir/test86.in, src/testdir/test86.ok
+
+Patch 7.3.1081
+Problem: Compiler warnings on 64-bit Windows.
+Solution: Change variable types. (Mike Williams)
+Files: src/if_py_both.h, src/regexp_nfa.c
+
+Patch 7.3.1082
+Problem: New regexp engine: Problem with \@= matching.
+Solution: Save and restore nfa_match.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1083
+Problem: New regexp engine: Does not support \%^ and \%$.
+Solution: Support matching start and end of file.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1084
+Problem: New regexp engine: only accepts up to \{,10}.
+Solution: Remove upper limit. Remove dead code with NFA_PLUS.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1085
+Problem: New regexp engine: Non-greedy multi doesn't work.
+Solution: Implement \{-}.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1086
+Problem: Old regexp engine accepts illegal range, new one doesn't.
+Solution: Also accept the illegal range with the new engine.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1087
+Problem: A leading star is not seen as a normal char when \{} follows.
+Solution: Save and restore the parse state properly.
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
+ src/testdir/test64.ok
+
+Patch 7.3.1088
+Problem: New regexp engine: \@<= and \@<! are not implemented.
+Solution: Implement look-behind matching. Fix off-by-one error in old
+ regexp engine.
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
+ src/testdir/test64.ok
+
+Patch 7.3.1089
+Problem: Tests 86 and 87 fail on MS-Windows. (Ken Takata)
+Solution: Fix platform-specific stuff. (ZyX)
+Files: src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1090
+Problem: New regexp engine does not support \z1 .. \z9 and \z(.
+Solution: Implement the syntax submatches.
+Files: src/regexp.h, src/regexp_nfa.c
+
+Patch 7.3.1091
+Problem: New regexp engine: no error when using \z1 or \z( where it does
+ not work.
+Solution: Give an error message.
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.3.1092
+Problem: Can't build with regexp debugging. NFA debug output shows wrong
+ pattern.
+Solution: Fix debugging code for recent changes. Add the pattern to the
+ program.
+Files: src/regexp_nfa.c, src/regexp.h
+
+Patch 7.3.1093
+Problem: New regexp engine: When a sub expression is empty \1 skips a
+ character.
+Solution: Make \1 try the current position when the match is empty.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1094
+Problem: New regexp engine: Attempts to match "^" at every character.
+Solution: Only try "^" at the start of a line.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1095
+Problem: Compiler warnings for shadowed variables. (Christian Brabandt)
+Solution: Rename new_state() to alloc_state(). Remove unnecessary
+ declaration.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1096
+Problem: Python: popitem() was not defined in a standard way.
+Solution: Remove the argument from popitem(). (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/testdir/test86.in,
+ src/testdir/test86.ok, src/testdir/test87.in,
+ src/testdir/test87.ok
+
+Patch 7.3.1097
+Problem: Python: a few recently added items are not documented.
+Solution: Update the documentation. (ZyX)
+Files: runtime/doc/if_pyth.txt
+
+Patch 7.3.1098
+Problem: Python: Possible memory leaks
+Solution: Add Py_XDECREF() calls. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1099
+Problem: Python: Changing directory with os.chdir() causes problems for
+ Vim's notion of directories.
+Solution: Add vim.chdir() and vim.fchdir(). (ZyX)
+Files: runtime/doc/if_pyth.txt, src/ex_docmd.c, src/if_py_both.h,
+ src/if_python3.c, src/if_python.c, src/proto/ex_docmd.pro,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1100
+Problem: Python: a few more memory problems.
+Solution: Add and remove Py_XDECREF(). (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1101
+Problem: Configure doesn't find Python 3 on Ubuntu 13.04.
+Solution: First try distutils.sysconfig. Also fix some indents. (Ken
+ Takata)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.1102
+Problem: Completion of ":py3do" and ":py3file" does not work after ":py3".
+Solution: Make completion work. (Taro Muraoka)
+Files: src/ex_docmd.c
+
+Patch 7.3.1103
+Problem: New regexp engine: overhead in saving and restoring.
+Solution: Make saving and restoring list IDs faster. Don't copy or check \z
+ subexpressions when they are not used.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1104
+Problem: New regexp engine does not handle "~".
+Solution: Add support for "~".
+Files: src/regexp_nfa.c, src/testdir/test24.in, src/testdir/test24.ok
+
+Patch 7.3.1105
+Problem: New regexp engine: too much code in one function. Dead code.
+Solution: Move the recursive nfa_regmatch call to a separate function.
+ Remove the dead code.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1106
+Problem: New regexp engine: saving and restoring lastlist in the states
+ takes a lot of time.
+Solution: Use a second lastlist value for the first recursive call.
+Files: src/regexp.h, src/regexp_nfa.c
+
+Patch 7.3.1107
+Problem: Compiler warnings for unused variables.
+Solution: Put the variables inside #ifdef.
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.3.1108
+Problem: Error message for os.fchdir() (Charles Peacech)
+Solution: Clear the error. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1109
+Problem: Building on MS-Windows doesn't see changes in if_py_both.h.
+Solution: Add a dependency. (Ken Takata)
+Files: src/Make_bc5.mak, src/Make_cyg.mak, src/Make_ming.mak,
+ src/Make_mvc.mak
+
+Patch 7.3.1110
+Problem: New regexp matching: Using \@= and the like can be slow.
+Solution: Decide whether to first try matching the zero-width part or what
+ follows, whatever is more likely to fail.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1111
+Problem: nfa_recognize_char_class() implementation is inefficient.
+Solution: Use bits in an int instead of chars in a string. (Dominique Pelle)
+Files: src/regexp_nfa.c, src/testdir/test36.in, src/testdir/test36.ok
+
+Patch 7.3.1112
+Problem: New regexp engine: \%V not supported.
+Solution: Implement \%V. Add tests.
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
+ src/testdir/test64.ok
+
+Patch 7.3.1113
+Problem: New regexp engine: \%'m not supported.
+Solution: Implement \%'m. Add tests.
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
+ src/testdir/test64.ok
+
+Patch 7.3.1114 (after 7.3.1110)
+Problem: Can't build without the syntax feature.
+Solution: Add #ifdefs. (Erik Falor)
+Files: src/regexp_nfa.c
+
+Patch 7.3.1115
+Problem: Many users don't like the cursor line number when 'relativenumber'
+ is set.
+Solution: Have four combinations with 'number' and 'relativenumber'.
+ (Christian Brabandt)
+Files: runtime/doc/options.txt, src/option.c, src/screen.c,
+ src/testdir/test89.in, src/testdir/test89.ok
+
+Patch 7.3.1116
+Problem: Can't build without Visual mode.
+Solution: Add #ifdefs.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1117
+Problem: New regexp engine: \%[abc] not supported.
+Solution: Implement \%[abc]. Add tests.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1118
+Problem: Match failure rate is not very specific.
+Solution: Tune the failure rate for match items.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1119
+Problem: Flags in 'cpo' are search for several times.
+Solution: Store the result and re-use the flags.
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.3.1120
+Problem: Crash when regexp logging is enabled.
+Solution: Avoid using NULL pointers. Advance over count argument.
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.3.1121
+Problem: New regexp engine: adding states that are not used.
+Solution: Don't add the states.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1122
+Problem: New regexp engine: \@> not supported.
+Solution: Implement \%>.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1123
+Problem: Can't build tiny Vim on MS-Windows.
+Solution: Adjust #ifdef around using modif_fname(). (Mike Williams)
+Files: src/misc1.c
+
+Patch 7.3.1124
+Problem: Python: Crash on MS-Windows when os.fchdir() is not available.
+Solution: Check for _chdir to be NULL. (Ken Takata)
+Files: src/if_py_both.h
+
+Patch 7.3.1125
+Problem: Error for using \%V in a pattern in tiny Vim.
+Solution: Allow using \%V but never match. (Dominique Pelle)
+Files: src/regexp_nfa.c
+
+Patch 7.3.1126
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Assign something to the variable.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1127
+Problem: No error for using empty \%[].
+Solution: Give error message.
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.3.1128
+Problem: Now that the NFA engine handles everything every failure is a
+ syntax error.
+Solution: Remove the syntax_error flag.
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.3.1129
+Problem: Can't see what pattern in syntax highlighting is slow.
+Solution: Add the ":syntime" command.
+Files: src/structs.h, src/syntax.c, src/ex_cmds.h, src/ex_docmd.c,
+ src/proto/syntax.pro, src/ex_cmds2.c, src/proto/ex_cmds2.pro,
+ runtime/doc/syntax.txt
+
+Patch 7.3.1130 (after 7.3.1129)
+Problem: Can't build with anything but huge features.
+Solution: Check for FEAT_PROFILE. (Yasuhiro Matsumoto)
+Files: src/ex_docmd.c, src/structs.h, src/syntax.c
+
+Patch 7.3.1131
+Problem: New regexp engine is a bit slow.
+Solution: Do not clear the state list. Don't copy syntax submatches when
+ not used.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1132
+Problem: Crash when debugging regexp.
+Solution: Do not try to dump subexpr that were not set. Skip over count of
+ \% items.
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.3.1133
+Problem: New regexp engine is a bit slow.
+Solution: Skip ahead to a character that must match. Don't try matching a
+ "^" patter past the start of line.
+Files: src/regexp_nfa.c, src/regexp.h
+
+Patch 7.3.1134
+Problem: Running test 49 takes a long time.
+Solution: Don't have it grep all files.
+Files: src/testdir/test49.vim
+
+Patch 7.3.1135
+Problem: Compiler warning for unused argument.
+Solution: Add UNUSED.
+Files: src/syntax.c
+
+Patch 7.3.1136
+Problem: ":func Foo" does not show attributes.
+Solution: Add "abort", "dict" and "range". (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.3.1137
+Problem: New regexp engine: collections are slow.
+Solution: Handle all characters in one go.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1138
+Problem: New regexp engine: neglist no longer used.
+Solution: Remove the now unused neglist.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1139
+Problem: New regexp engine: negated flag is hardly used.
+Solution: Add separate _NEG states, remove negated flag.
+Files: src/regexp_nfa.c, src/regexp.h
+
+Patch 7.3.1140
+Problem: New regexp engine: trying expensive match while the result is not
+ going to be used.
+Solution: Check for output state already being in the state list.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1141
+Problem: Win32: Check for available memory is not reliable and adds
+ overhead.
+Solution: Remove mch_avail_mem(). (Mike Williams)
+Files: src/os_win32.c, src/os_win32.h
+
+Patch 7.3.1142
+Problem: Memory leak in ":syntime report".
+Solution: Clear the grow array. (Dominique Pelle)
+Files: src/syntax.c
+
+Patch 7.3.1143
+Problem: When mapping NUL it is displayed as an X.
+Solution: Check for KS_ZERO instead of K_ZERO. (Yasuhiro Matsumoto)
+Files: src/message.c
+
+Patch 7.3.1144
+Problem: "RO" is not translated everywhere.
+Solution: Put inside _(). (Sergey Alyoshin)
+Files: src/buffer.c, src/screen.c
+
+Patch 7.3.1145
+Problem: New regexp engine: addstate() is called very often.
+Solution: Optimize adding the start state.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1146
+Problem: New regexp engine: look-behind match not checked when followed by
+ zero-width match.
+Solution: Do the look-behind match before adding the zero-width state.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1147
+Problem: New regexp engine: regstart is only used to find the first match.
+Solution: Use regstart whenever adding the start state.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1148
+Problem: No command line completion for ":syntime".
+Solution: Implement the completion. (Dominique Pelle)
+Files: runtime/doc/map.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/ex_getln.c, src/proto/syntax.pro, src/syntax.c, src/vim.h
+
+Patch 7.3.1149
+Problem: New regexp engine: Matching plain text could be faster.
+Solution: Detect a plain text match and handle it specifically. Add
+ vim_regfree().
+Files: src/regexp.c, src/regexp.h, src/regexp_nfa.c,
+ src/proto/regexp.pro, src/buffer.c, src/edit.c, src/eval.c,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c,
+ src/ex_getln.c, src/fileio.c, src/gui.c, src/misc1.c, src/misc2.c,
+ src/option.c, src/syntax.c, src/quickfix.c, src/search.c,
+ src/spell.c, src/tag.c, src/window.c, src/screen.c, src/macros.h,
+ src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1150
+Problem: New regexp engine: Slow when a look-behind match does not have a
+ width specified.
+Solution: Try to compute the maximum width.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1151
+Problem: New regexp engine: Slow when a look-behind match is followed by a
+ zero-width match.
+Solution: Postpone the look-behind match more often.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1152
+Problem: In tiny build ireg_icombine is undefined. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1153
+Problem: New regexp engine: Some look-behind matches are very expensive.
+Solution: Postpone invisible matches further, until a match is almost found.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1154
+Problem: New regexp_nfa engine: Unnecessary code.
+Solution: Remove unnecessary code.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1155
+Problem: MS-DOS: "make test" uses external rmdir command.
+Solution: Rename "rmdir" to "rd". (Taro Muraoka)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.3.1156
+Problem: Compiler warnings. (dv1445)
+Solution: Initialize variables, even when the value isn't really used.
+Files: src/regexp_nfa.c, src/eval.c
+
+Patch 7.3.1157
+Problem: New regexp engine fails on "\(\<command\)\@<=.*"
+Solution: Fix rule for postponing match. Further tune estimating whether
+ postponing works better. Add test.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1158
+Problem: Crash when running test 86. (Jun Takimoto)
+Solution: Define PY_SSIZE_T_CLEAN early. (Elimar Riesebieter)
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.3.1159
+Problem: The round() function is not always available. (Christ van
+ Willegen)
+Solution: Use the solution from f_round().
+Files: src/ex_cmds2.c, src/eval.c, src/proto/eval.pro
+
+Patch 7.3.1160
+Problem: Mixing long and pointer doesn't always work.
+Solution: Avoid cast to pointer.
+Files: src/undo.c
+
+Patch 7.3.1161
+Problem: Python: PyList_SetItem() is inefficient.
+Solution: Use PyList_SET_ITEM() (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1162
+Problem: Python: Memory leaks
+Solution: Add more Py_DECREF(). (ZyX)
+Files: src/if_py_both.h, src/if_python.c
+
+Patch 7.3.1163
+Problem: Not easy to load Python modules.
+Solution: Search "python2", "python3" and "pythonx" directories in
+ 'runtimepath' for Python modules. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/configure.in, src/ex_cmds2.c,
+ src/if_py_both.h, src/if_python.c, src/if_python3.c,
+ src/testdir/test86.in, src/testdir/test87.in, src/auto/configure
+
+Patch 7.3.1164
+Problem: Can't test what is actually displayed on screen.
+Solution: Add the screenchar() and screenattr() functions.
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 7.3.1165
+Problem: HP-UX compiler can't handle zero size array. (Charles Cooper)
+Solution: Make the array one item big.
+Files: src/regexp.h, src/regexp_nfa.c
+
+Patch 7.3.1166
+Problem: Loading Python modules is not tested.
+Solution: Enable commented-out tests, add missing files. (ZyX)
+Files: src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok,
+ src/testdir/python2/module.py, src/testdir/python3/module.py,
+ src/testdir/pythonx/module.py, src/testdir/pythonx/modulex.py,
+ Filelist
+
+Patch 7.3.1167
+Problem: Python configure check doesn't reject Python 2 when requesting
+ Python 3. Some systems need -pthreads instead of -pthread.
+Solution: Adjust configure accordingly. (Andrei Olsen)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.1168
+Problem: Python "sane" configure checks give a warning message.
+Solution: Use single quotes instead of escaped double quotes. (Ben Fritz)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.1169
+Problem: New regexp engine: some work is done while executing a pattern,
+ even though the result is predictable.
+Solution: Do the work while compiling the pattern.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1170
+Problem: Patch 7.3.1058 breaks backwards compatibility, not possible to use
+ a function reference as a string. (lilydjwg)
+Solution: Instead of translating the function name only translate "s:".
+Files: src/eval.c
+
+Patch 7.3.1171
+Problem: Check for digits and ascii letters can be faster.
+Solution: Use a trick with one comparison. (Dominique Pelle)
+Files: src/macros.h
+
+Patch 7.3.1172
+Problem: Python 2: loading modules doesn't work well.
+Solution: Fix the code. Add more tests. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/if_python.c,
+ src/testdir/python2/module.py, src/testdir/python3/module.py,
+ src/testdir/python_after/after.py,
+ src/testdir/python_before/before.py, src/testdir/test86.in,
+ src/testdir/test86.ok, src/testdir/test87.in,
+ src/testdir/test87.ok, Filelist
+
+Patch 7.3.1173
+Problem: Python 2 tests don't have the same output everywhere.
+Solution: Make the Python 2 tests more portable. (ZyX)
+Files: src/testdir/test86.in, src/testdir/test86.ok
+
+Patch 7.3.1174
+Problem: Python 2 and 3 use different ways to load modules.
+Solution: Use the same method. (ZyX)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/if_python3.c,
+ src/if_python.c
+
+Patch 7.3.1175
+Problem: Using isalpha() and isalnum() can be slow.
+Solution: Use range checks. (Mike Williams)
+Files: src/ex_docmd.c, src/macros.h
+
+Patch 7.3.1176
+Problem: Compiler warnings on 64 bit system.
+Solution: Add type casts. (Mike Williams)
+Files: src/eval.c, src/if_py_both.h
+
+Patch 7.3.1177
+Problem: Wasting memory on padding.
+Solution: Reorder struct fields. (Dominique Pelle)
+Files: src/structs.h, src/fileio.c
+
+Patch 7.3.1178
+Problem: Can't put all Vim config files together in one directory.
+Solution: Load ~/.vim/vimrc if ~/.vimrc does not exist. (Lech Lorens)
+Files: runtime/doc/gui.txt, runtime/doc/starting.txt, src/gui.c,
+ src/main.c, src/os_amiga.h, src/os_dos.h, src/os_unix.h
+
+Patch 7.3.1179
+Problem: When a global mapping starts with the same characters as a
+ buffer-local mapping Vim waits for a character to be typed to find
+ out whether the global mapping is to be used. (Andy Wokula)
+Solution: Use the local mapping without waiting. (Michael Henry)
+Files: runtime/doc/map.txt, src/getchar.c
+
+Patch 7.3.1180
+Problem: When current directory changes, path from cscope may no longer be
+ valid. (AS Budden)
+Solution: Always store the absolute path. (Christian Brabandt)
+Files: src/if_cscope.c
+
+Patch 7.3.1181
+Problem: Wrong error message for 1.0[0].
+Solution: Check for funcref and float separately. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.3.1182
+Problem: 'backupcopy' default on MS-Windows does not work for hard and soft
+ links.
+Solution: Check for links. (David Pope, Ken Takata)
+Files: src/fileio.c, src/os_win32.c, src/proto/os_win32.pro
+
+Patch 7.3.1183
+Problem: Python tests 86 and 87 fail.
+Solution: Add "empty" files. (ZyX)
+Files: src/testdir/python_before/before_1.py,
+ src/testdir/python_before/before_2.py
+
+Patch 7.3.1184
+Problem: Highlighting is sometimes wrong. (Axel Bender)
+Solution: Fetch regline again when returning from recursive regmatch.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1185
+Problem: New regexp engine: no match with ^ after \n. (SungHyun Nam)
+Solution: Fix it, add a test.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1186
+Problem: Python 3: test 87 may crash.
+Solution: Use _PyArg_Parse_SizeT instead of PyArg_Parse. (Jun Takimoto)
+Files: src/if_python3.c
+
+Patch 7.3.1187 (after 7.3.1170)
+Problem: "s:" is recognized but "<SID>" is not. (ZyX)
+Solution: Translate "<SID>" like "s:".
+Files: src/eval.c
+
+Patch 7.3.1188
+Problem: Newline characters messing up error message.
+Solution: Remove the newlines. (Kazunobu Kuriyama)
+Files: src/gui_x11.c
+
+Patch 7.3.1189 (after 7.3.1185)
+Problem: Highlighting is still wrong sometimes. (Dominique Pelle)
+Solution: Also restore reginput properly.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1190
+Problem: Compiler warning for parentheses. (Christian Wellenbrock)
+Solution: Change #ifdef.
+Files: src/ex_docmd.c
+
+Patch 7.3.1191
+Problem: Backreference to previous line doesn't work. (Lech Lorens)
+Solution: Implement looking in another line.
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
+ src/testdir/test64.ok
+
+Patch 7.3.1192
+Problem: Valgrind reports errors when using backreferences. (Dominique
+ Pelle)
+Solution: Do not check the end of submatches.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1193
+Problem: fail_if_missing not used for Python 3.
+Solution: Give an error when Python 3 can't be configured. (Andrei Olsen)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.1194
+Problem: Yaml highlighting is slow.
+Solution: Tune the estimation of pattern failure chance.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1195
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Set the length to the matching backref.
+Files: src/regexp.c
+
+Patch 7.3.1196
+Problem: Old regexp engine does not match pattern with backref correctly.
+ (Dominique Pelle)
+Solution: Fix setting status. Test multi-line patterns better.
+Files: src/regexp.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1197
+Problem: ":wviminfo!" does not write history previously read from a viminfo
+ file. (Roland Eggner)
+Solution: When not merging history write all entries.
+Files: src/ex_cmds.c, src/ex_getln.c, src/proto/ex_getln.pro
+
+Patch 7.3.1198
+Problem: Build error when using Perl 5.18.0 and dynamic loading.
+Solution: Change #ifdefs for Perl_croak_xs_usage. (Ike Devolder)
+Files: src/if_perl.xs
+
+Patch 7.3.1199
+Problem: When evaluating 'foldexpr' causes an error this is silently
+ ignored and evaluation is retried every time.
+Solution: Set emsg_silent instead of emsg_off. Stop evaluating 'foldexpr' is
+ it is causing errors. (Christian Brabandt)
+Files: src/fold.c
+
+Patch 7.3.1200
+Problem: When calling setline() from Insert mode, using CTRL-R =, undo does
+ not work properly. (Israel Chauca)
+Solution: Sync undo after evaluating the expression. (Christian Brabandt)
+Files: src/edit.c, src/testdir/test61.in, src/testdir/test61.ok
+
+Patch 7.3.1201
+Problem: When a startup script creates a preview window, it probably
+ becomes the current window.
+Solution: Make another window the current one. (Christian Brabandt)
+Files: src/main.c
+
+Patch 7.3.1202 (after 7.3.660)
+Problem: Tags are not found in case-folded tags file. (Darren cole, Issue
+ 90)
+Solution: Take into account that when case folding was used for the tags
+ file "!rm" sorts before the "!_TAG" header lines.
+Files: src/tag.c
+
+Patch 7.3.1203
+Problem: Matches from matchadd() might be highlighted incorrectly when they
+ are at a fixed position and inserting lines. (John Szakmeister)
+Solution: Redraw all lines below a change if there are highlighted matches.
+ (idea by Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.3.1204
+Problem: Calling gettabwinvar() in 'tabline' cancels Visual mode. (Hirohito
+ Higashi)
+Solution: Don't always use goto_tabpage_tp().
+Files: src/window.c, src/proto/window.pro, src/eval.c, src/if_py_both.h
+
+Patch 7.3.1205
+Problem: logtalk.dict is not removed on uninstall.
+Solution: Remove the file. (Kazunobu Kuriyama)
+Files: src/Makefile
+
+Patch 7.3.1206
+Problem: Inconsistent function argument declarations.
+Solution: Use ANSI style.
+Files: src/if_py_both.h
+
+Patch 7.3.1207
+Problem: New regexp engine: no match found on "#if FOO". (Lech Lorens)
+Solution: When adding a state gets skipped don't adjust the index.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1208
+Problem: Compiler warnings on MS-Windows.
+Solution: Add type cast. Move variable declaration. (Mike Williams)
+Files: src/option.c, src/os_mswin.c
+
+Patch 7.3.1209
+Problem: No completion for ":tabdo".
+Solution: Add tabdo to the list of modifiers. (Dominique Pelle)
+Files: src/ex_docmd.c
+
+Patch 7.3.1210 (after 7.3.1182)
+Problem: 'backupcopy' default on MS-Windows is wrong when 'encoding' equals
+ the current codepage.
+Solution: Change the #else block. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.3.1211
+Problem: MS-Windows: When 'encoding' differs from the current codepage
+ ":hardcopy" does not work properly.
+Solution: Use TextOutW() and SetDlgItemTextW(). (Ken Takata)
+Files: src/os_mswin.c, src/vim.rc
+
+Patch 7.3.1212
+Problem: "make test" on MS-Windows does not report failure like Unix does.
+Solution: Make it work like on Unix. (Taro Muraoka)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.3.1213
+Problem: Can't build with small features and Python.
+Solution: Adjust #ifdefs.
+Files: src/eval.c, src/buffer.c, src/eval.c, src/window.c
+
+Patch 7.3.1214
+Problem: Missing declaration for init_users() and realloc_post_list().
+ (Salman Halim)
+Solution: Add the declarations.
+Files: src/misc1.c, src/regexp_nfa.c
+
+Patch 7.3.1215
+Problem: Compiler warning for function not defined.
+Solution: Add #ifdef.
+Files: src/misc1.c
+
+Patch 7.3.1216
+Problem: Configure can't find Motif on Ubuntu.
+Solution: Search for libXm in /usr/lib/*-linux-gnu.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.3.1217
+Problem: New regexp engine: Can't handle \%[[ao]]. (Yukihiro Nakadaira)
+Solution: Support nested atoms inside \%[].
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1218
+Problem: "make test" on MS-Windows does not clean all temporary files and
+ gives some unnecessary message.
+Solution: Clean the right files. Create .failed files. (Ken Takata)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.3.1219
+Problem: No test for using []] inside \%[].
+Solution: Add a test.
+Files: src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1220
+Problem: MS-Windows: When using wide font italic and bold are not included.
+Solution: Support wide-bold, wide-italic and wide-bold-italic. (Ken Takata,
+ Taro Muraoka)
+Files: src/gui.c, src/gui.h, src/gui_w48.c
+
+Patch 7.3.1221
+Problem: When build flags change "make distclean" run into a configure
+ error.
+Solution: When CFLAGS changes delete auto/config.cache. Also avoid adding
+ duplicate text to flags. (Ken Takata)
+Files: src/Makefile, src/configure.in, src/auto/configure
+
+Patch 7.3.1222
+Problem: Cannot execute some tests from the src directly.
+Solution: Add missing targets.
+Files: src/Makefile
+
+Patch 7.3.1223
+Problem: Tests fail on MS-Windows.
+Solution: Avoid depending on OS version. Use DOS commands instead of Unix
+ commands. (Taro Muraoka, Ken Takata)
+Files: src/testdir/test17.in, src/testdir/test50.in,
+ src/testdir/test71.in, src/testdir/test77.in
+
+Patch 7.3.1224
+Problem: Clang gives warnings on xxd.
+Solution: Change how to use part of a string. (Dominique Pelle) Also avoid
+ warning for return not reached.
+Files: src/xxd/xxd.c, src/regexp_nfa.c
+
+Patch 7.3.1225
+Problem: Compiler warnings when building with Motif.
+Solution: Change set_label() argument. (Kazunobu Kuriyama)
+Files: src/gui_motif.c
+
+Patch 7.3.1226
+Problem: Python: duplicate code.
+Solution: Share code between OutputWrite() and OutputWritelines(). (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.1227
+Problem: Inconsistent string conversion.
+Solution: Use 'encoding' instead of utf-8. Use METH_O in place of
+ METH_VARARGS where appropriate. (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.1228
+Problem: Python: various inconsistencies and problems.
+Solution: StringToLine now supports both bytes() and unicode() objects.
+ Make function names consistent. Fix memory leak fixed in
+ StringToLine. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c
+
+Patch 7.3.1229
+Problem: Python: not so easy to delete/restore translating.
+Solution: Make macros do translation of exception messages. (ZyX)
+ Note: this breaks translations!
+Files: src/if_py_both.h, src/if_python3.c
+
+Patch 7.3.1230
+Problem: Python: Exception messages are not clear.
+Solution: Make exception messages more verbose. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.1231
+Problem: Python: use of numbers not consistent.
+Solution: Add support for Number protocol. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.1232
+Problem: Python: inconsistencies in variable names.
+Solution: Rename variables. (ZyX)
+Files: src/eval.c, src/if_py_both.h
+
+Patch 7.3.1233
+Problem: Various Python problems.
+Solution: Fix VimTryEnd. Crash with debug build and PYTHONDUMPREFS=1. Memory
+ leaks in StringToLine(), BufferMark() and convert_dl. (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.3.1234 (after 7.3.1229)
+Problem: Python: Strings are not marked for translation.
+Solution: Add N_() where appropriate. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.3.1235
+Problem: In insert mode CTRL-] is not inserted, on the command-line it is.
+Solution: Don't insert CTRL-] on the command line. (Yukihiro Nakadaira)
+Files: src/ex_getln.c
+
+Patch 7.3.1236
+Problem: Python: WindowSetattr() missing support for NUMBER_UNSIGNED.
+Solution: Add NUMBER_UNSIGNED, add more tests. Various fixes. (ZyX)
+Files: src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/testdir/pythonx/failing.py,
+ src/testdir/pythonx/failing_import.py, src/testdir/test86.in,
+ src/testdir/test86.ok, src/testdir/test87.in,
+ src/testdir/test87.ok, src/testdir/pythonx/topmodule/__init__.py,
+ src/testdir/pythonx/topmodule/submodule/__init__.py,
+ src/testdir/pythonx/topmodule/submodule/subsubmodule/__init__.py,
+ src/testdir/pythonx/topmodule/submodule/subsubmodule/subsubsubmodule.py
+
+Patch 7.3.1237
+Problem: Python: non-import errors not handled correctly.
+Solution: Let non-ImportError exceptions pass the finder. (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 7.3.1238
+Problem: Crash in Python interface on 64 bit machines.
+Solution: Change argument type of PyString_AsStringAndSize. (Taro Muraoka,
+ Jun Takimoto)
+Files: src/if_python.c
+
+Patch 7.3.1239
+Problem: Can't build with Python and MSVC10.
+Solution: Move #if outside of macro. (Taro Muraoka)
+Files: src/if_py_both.h
+
+Patch 7.3.1240
+Problem: Memory leak in findfile().
+Solution: Free the memory. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.3.1241 (after 7.3.1236)
+Problem: Some test files missing from the distribution.
+Solution: Update the list of files.
+Files: Filelist
+
+Patch 7.3.1242
+Problem: No failure when trying to use a number as a string.
+Solution: Give an error when StringToLine() is called with an instance of
+ the wrong type. (Jun Takimoto)
+Files: src/if_py_both.h
+
+Patch 7.3.1243
+Problem: New regexp engine: back references in look-behind match don't
+ work. (Lech Lorens)
+Solution: Copy the submatches before a recursive match. Also fix function
+ prototypes.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1244
+Problem: MS-Windows: confirm() dialog text may not fit.
+Solution: Use GetTextWidthEnc() instead of GetTextWidth(). (Yasuhiro
+ Matsumoto)
+Files: src/gui_w32.c
+
+Patch 7.3.1245
+Problem: MS-Windows: confirm() dialog text may still not fit.
+Solution: Use GetTextWidthEnc() instead of GetTextWidth() in two more
+ places. (Yasuhiro Matsumoto)
+Files: src/gui_w32.c
+
+Patch 7.3.1246
+Problem: When setting 'winfixheight' and resizing the window causes the
+ window layout to be wrong.
+Solution: Add frame_check_height() and frame_check_width() (Yukihiro
+ Nakadaira)
+Files: src/window.c
+
+Patch 7.3.1247
+Problem: New regexp engine: '[ ]\@!\p\%([ ]\@!\p\)*:' does not always match.
+Solution: When there is a PIM add a duplicate state that starts at another
+ position.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1248
+Problem: Still have old hacking code for Input Method.
+Solution: Add 'imactivatefunc' and 'imstatusfunc' as a generic solution to
+ Input Method activation. (Yukihiro Nakadaira)
+Files: runtime/doc/options.txt, src/fileio.c, src/mbyte.c, src/option.c,
+ src/option.h, src/proto/fileio.pro
+
+Patch 7.3.1249
+Problem: Modeline not recognized when using "Vim" instead of "vim".
+Solution: Also accept "Vim".
+Files: src/buffer.c
+
+Patch 7.3.1250
+Problem: Python tests fail on MS-Windows.
+Solution: Change backslashes to slashes. (Taro Muraoka)
+Files: src/testdir/test86.in, src/testdir/test87.in
+
+Patch 7.3.1251
+Problem: Test 61 messes up viminfo.
+Solution: Specify a separate viminfo file.
+Files: src/testdir/test61.in
+
+Patch 7.3.1252
+Problem: gvim does not find the toolbar bitmap files in ~/vimfiles/bitmaps
+ if the corresponding menu command contains additional characters
+ like the shortcut marker '&' or if you use a non-english locale.
+Solution: Use menu->en_dname or menu->dname. (Martin Gieseking)
+Files: src/gui_w32.c
+
+Patch 7.3.1253 (after 7.3.1200)
+Problem: Still undo problem after using CTRL-R = setline(). (Hirohito
+ Higashi)
+Solution: Set the ins_need_undo flag.
+Files: src/edit.c
+
+Patch 7.3.1254 (after 7.3.1252)
+Problem: Can't build without the multi-lang feature. (John Marriott)
+Solution: Add #ifdef.
+Files: src/gui_w32.c
+
+Patch 7.3.1255
+Problem: Clang warnings when building with Athena.
+Solution: Add type casts. (Dominique Pelle)
+Files: src/gui_at_fs.c
+
+Patch 7.3.1256
+Problem: Can't build without eval or autocmd feature.
+Solution: Add #ifdefs.
+Files: src/mbyte.c, src/window.c
+
+Patch 7.3.1257
+Problem: With GNU gettext() ":lang de_DE.utf8" does not always result in
+ German messages.
+Solution: Clear the $LANGUAGE environment variable.
+Files: src/ex_cmds2.c
+
+Patch 7.3.1258
+Problem: Using submatch() may crash Vim. (Ingo Karkat)
+Solution: Restore the number of subexpressions used.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1259
+Problem: No test for patch 7.3.1258
+Solution: Add a test entry.
+Files: src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.3.1260
+Problem: User completion does not get the whole command line in the command
+ line window.
+Solution: Pass on the whole command line. (Daniel Thau)
+Files: src/ex_getln.c, src/structs.h
+
+Patch 7.3.1261 (after patch 7.3.1179)
+Problem: A buffer-local language mapping from a keymap stops a global
+ insert mode mapping from working. (Ron Aaron)
+Solution: Do not wait for more characters to be typed only when the mapping
+ was defined with <nowait>.
+Files: runtime/doc/map.txt, src/eval.c, src/getchar.c,
+ src/testdir/test75.in, src/testdir/test75.ok
+
+Patch 7.3.1262
+Problem: Crash and compilation warnings with Cygwin.
+Solution: Check return value of XmbTextListToTextProperty(). Add type casts.
+ Adjust #ifdefs. (Lech Lorens)
+Files: src/main.c, src/os_unix.c, src/ui.c
+
+Patch 7.3.1263
+Problem: Typo in short option name.
+Solution: Change "imse" to "imsf".
+Files: src/option.c
+
+Patch 7.3.1264 (after 7.3.1261)
+Problem: Missing m_nowait.
+Solution: Include missing part of the patch.
+Files: src/structs.h
+
+Patch 7.3.1265 (after 7.3.1249)
+Problem: Accepting "Vim:" for a modeline causes errors too often.
+Solution: Require "Vim:" to be followed by "set".
+Files: src/buffer.c
+
+Patch 7.3.1266
+Problem: QNX: GUI fails to start.
+Solution: Remove the QNX-specific #ifdef. (Sean Boudreau)
+Files: src/gui.c
+
+Patch 7.3.1267
+Problem: MS-Windows ACL support doesn't work well.
+Solution: Implement more ACL support. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.3.1268
+Problem: ACL support doesn't work when compiled with MingW.
+Solution: Support ACL on MingW. (Ken Takata)
+Files: src/os_win32.c, src/os_win32.h
+
+Patch 7.3.1269
+Problem: Insert completion keeps entry selected even though the list has
+ changed. (Olivier Teuliere)
+Solution: Reset compl_shown_match and compl_curr_match. (Christian Brabandt)
+Files: src/edit.c
+
+Patch 7.3.1270
+Problem: Using "Vp" in an empty buffer can't be undone. (Hauke Petersen)
+Solution: Save one line in an empty buffer. (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.3.1271 (after 7.3.1260)
+Problem: Command line completion does not work.
+Solution: Move setting xp_line down. (Daniel Thau)
+Files: src/ex_getln.c
+
+Patch 7.3.1272
+Problem: Crash when editing Ruby file. (Aliaksandr Rahalevich)
+Solution: Reallocate the state list when necessary.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1273
+Problem: When copying a location list the index might be wrong.
+Solution: Set the index to one when using the first entry. (Lech Lorens)
+Files: src/quickfix.c
+
+Patch 7.3.1274
+Problem: When selecting an entry from a location list it may pick an
+ arbitrary window or open a new one.
+Solution: Prefer using a window related to the location list. (Lech Lorens)
+Files: src/quickfix.c
+
+Patch 7.3.1275
+Problem: "gn" does not work when the match is a single character.
+Solution: Fix it, add a test. (Christian Brabandt)
+Files: src/search.c, src/testdir/test53.in, src/testdir/test53.ok
+
+Patch 7.3.1276
+Problem: When using a cscope connection resizing the window may send
+ SIGWINCH to cscope and it quits.
+Solution: Call setpgid(0, 0) in the child process. (Narendran Gopalakrishnan)
+Files: src/if_cscope.c
+
+Patch 7.3.1277
+Problem: In diff mode 'cursorline' also draws in the non-active window.
+ When 'nu' and 'sbr' are set the 'sbr' string is not underlined.
+Solution: Only draw the cursor line in the current window. Combine the
+ 'cursorline' and other highlighting attributes. (Christian
+ Brabandt)
+Files: src/screen.c
+
+Patch 7.3.1278
+Problem: When someone sets the screen size to a huge value with "stty" Vim
+ runs out of memory before reducing the size.
+Solution: Limit Rows and Columns in more places.
+Files: src/gui.c, src/gui_gtk_x11.c, src/option.c, src/os_unix.c,
+ src/proto/term.pro, src/term.c
+
+Patch 7.3.1279
+Problem: Compiler warning for variable uninitialized. (Tony Mechelynck)
+Solution: Add an init.
+Files: src/ex_getln.c
+
+Patch 7.3.1280
+Problem: Reading memory already freed since patch 7.3.1247. (Simon
+ Ruderich, Dominique Pelle)
+Solution: Copy submatches before reallocating the state list.
+Files: src/regexp_nfa.c
+
+Patch 7.3.1281
+Problem: When 'ttymouse' is set to "xterm2" clicking in column 123 moves
+ the cursor to column 96. (Kevin Goodsell)
+Solution: Decode KE_CSI.
+Files: src/term.c
+
+Patch 7.3.1282 (after 7.3.1277)
+Problem: 'cursorline' not drawn in any other window. (Charles Campbell)
+Solution: Do draw the cursor line in other windows.
+Files: src/screen.c
+
+Patch 7.3.1283
+Problem: Test 71 fails on MS-Windows.
+Solution: Put the binary data in a separate file. (Ken Takata)
+Files: src/testdir/test71.in, src/testdir/test71a.in
+
+Patch 7.3.1284
+Problem: Compiler warnings in MS-Windows clipboard handling.
+Solution: Add type casts. (Ken Takata)
+Files: src/winclip.c
+
+Patch 7.3.1285
+Problem: No tests for picking a window when selecting an entry in a
+ location list. Not picking the right window sometimes.
+Solution: Add test 96. Set usable_win appropriately. (Lech Lorens)
+Files: src/quickfix.c, src/testdir/Makefile, src/testdir/test96.in,
+ src/testdir/test96.ok, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.3.1286
+Problem: Check for screen size missing for Athena and Motif.
+Solution: Add call to limit_screen_size().
+Files: src/gui_x11.c
+
+Patch 7.3.1287
+Problem: Python SystemExit exception is not handled properly.
+Solution: Catch the exception and give an error. (Yasuhiro Matsumoto, Ken
+ Takata)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/if_python.c,
+ src/if_python3.c
+
+Patch 7.3.1288
+Problem: The first ":echo 'hello'" command output doesn't show. Mapping
+ for <S-F3> gets triggered during startup.
+Solution: Add debugging code for the termresponse. When receiving the "Co"
+ entry and when setting 'ambiwidth' redraw right away if possible.
+ Add redraw_asap(). Don't set 'ambiwidth' if it already had the
+ right value. Do the 'ambiwidth' check in the second row to avoid
+ confusion with <S-F3>.
+Files: src/term.c, src/screen.c, src/proto/screen.pro
+
+Patch 7.3.1289
+Problem: Get GLIB warning when removing a menu item.
+Solution: Reference menu-id and also call gtk_container_remove(). (Ivan
+ Krasilnikov)
+Files: src/gui_gtk.c
+
+Patch 7.3.1290 (after 7.3.1253)
+Problem: CTRL-R = in Insert mode changes the start of the insert position.
+ (Ingo Karkat)
+Solution: Only break undo, don't start a new insert.
+Files: src/edit.c
+
+Patch 7.3.1291 (after 7.3.1288)
+Problem: Compiler warnings for uninitialized variables. (Tony Mechelynck)
+Solution: Initialize the variables.
+Files: src/screen.c
+
+Patch 7.3.1292
+Problem: Possibly using invalid pointer when searching for window. (Raichoo)
+Solution: Use "firstwin" instead of "tp_firstwin" for current tab.
+Files: src/window.c
+
+Patch 7.3.1293
+Problem: Put in empty buffer cannot be undone.
+Solution: Save one more line for undo. (Ozaki)
+Files: src/ops.c
+
+Patch 7.3.1294
+Problem: ":diffoff" resets options.
+Solution: Save and restore option values. (Christian Brabandt)
+Files: src/diff.c, src/structs.h, src/option.c
+
+Patch 7.3.1295
+Problem: glob() and globpath() do not handle escaped special characters
+ properly.
+Solution: Handle escaped characters differently. (Adnan Zafar)
+Files: src/testdir/Makefile, src/testdir/test97.in,
+ src/testdir/test97.ok, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms, src/fileio.c,
+ src/misc1.c
+
+Patch 7.3.1296
+Problem: Only MS-Windows limits the GUI window size to what fits on the
+ monitor.
+Solution: Limit the size for all systems. (Daniel Harding)
+Files: src/ui.c
+
+Patch 7.3.1297
+Problem: findfile() directory matching does not work when a star follows
+ text. (Markus Braun)
+Solution: Make a wildcard work properly. (Christian Brabandt)
+Files: src/misc2.c, src/testdir/test89.in, src/testdir/test89.ok
+
+Patch 7.3.1298 (after 7.3.1297)
+Problem: Crash.
+Solution: Use STRCPY() instead of STRCAT() and allocate one more byte.
+Files: src/misc2.c
+
+Patch 7.3.1299
+Problem: Errors when doing "make proto". Didn't do "make depend" for a
+ while.
+Solution: Add #ifdefs. Update dependencies. Update proto files.
+Files: src/if_python3.c, src/os_win32.c, src/Makefile,
+ src/proto/ex_docmd.pro, src/proto/if_python.pro,
+ src/proto/if_python3.pro, src/proto/gui_w16.pro,
+ src/proto/gui_w32.pro, src/proto/os_win32.pro
+
+Patch 7.3.1300
+Problem: Mac: tiny and small build fails.
+Solution: Don't include os_macosx.m in tiny build. Include mouse support in
+ small build. (Kazunobu Kuriyama)
+Files: src/configure.in, src/auto/configure, src/vim.h
+
+Patch 7.3.1301
+Problem: Some tests fail on MS-Windows.
+Solution: Fix path separators in test 89 and 96. Omit test 97, escaping
+ works differently. Make findfile() work on MS-Windows.
+Files: src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/test89.in,
+ src/testdir/test96.in, src/misc2.c
+
+Patch 7.3.1302
+Problem: Test 17 fails on MS-Windows. Includes line break in file name
+ everywhere.
+Solution: Fix 'fileformat'. Omit CR-LF from a line read from an included
+ file.
+Files: src/search.c, src/testdir/test17.in, src/testdir/test17.ok
+
+Patch 7.3.1303 (after 7.3.1290)
+Problem: Undo is synced whenever CTRL-R = is called, breaking some plugins.
+Solution: Only break undo when calling setline() or append().
+Files: src/globals.h, src/eval.c, src/edit.c, src/testdir/test61.in,
+ src/testdir/test61.ok
+
+Patch 7.3.1304
+Problem: Test 89 still fails on MS-Windows.
+Solution: Set 'shellslash'. (Taro Muraoka)
+Files: src/testdir/test89.in
+
+Patch 7.3.1305
+Problem: Warnings from 64 bit compiler.
+Solution: Add type casts.
+Files: src/misc2.c
+
+Patch 7.3.1306
+Problem: When redrawing the screen during startup the intro message may be
+ cleared.
+Solution: Redisplay the intro message when appropriate.
+Files: src/screen.c, src/version.c, src/proto/version.pro
+
+Patch 7.3.1307
+Problem: MS-Windows build instructions are outdated.
+Solution: Adjust for building on Windows 7. Drop Windows 95/98/ME support.
+Files: Makefile, nsis/gvim.nsi
+
+Patch 7.3.1308
+Problem: Typos in MS-Windows build settings and README.
+Solution: Minor changes to MS-Windows files.
+Files: src/msvc2008.bat, src/msvc2010.bat, src/VisVim/README_VisVim.txt
+
+Patch 7.3.1309
+Problem: When a script defines a function the flag to wait for the user to
+ hit enter is reset.
+Solution: Restore the flag. (Yasuhiro Matsumoto) Except when the user was
+ typing the function.
+Files: src/eval.c
+
+Patch 7.3.1310
+Problem: Typos in nsis script. Can use better compression.
+Solution: Fix typos. Use lzma compression. (Ken Takata)
+Files: nsis/gvim.nsi
+
+Patch 7.3.1311
+Problem: Compiler warnings on Cygwin.
+Solution: Add type casts. Add windows include files. (Ken Takata)
+Files: src/mbyte.c, src/ui.c
+
+Patch 7.3.1312 (after 7.3.1287)
+Problem: Not giving correct error messages for SystemExit().
+Solution: Move E858 into an else. (Ken Takata)
+Files: src/if_py_both.h
+
+Patch 7.3.1313
+Problem: :py and :py3 don't work when compiled with Cygwin or MingW with 64
+ bit.
+Solution: Add -DMS_WIN64 to the build command. (Ken Takata)
+Files: src/Make_cyg.mak, src/Make_ming.mak
+
+Patch 7.3.1314
+Problem: Test 87 fails with Python 3.3.
+Solution: Filter the error messages. (Taro Muraoka)
+Files: src/testdir/test87.in
+
+Patch 7.4a.001
+Problem: Script to update syntax menu is outdated.
+Solution: Add the missing items.
+Files: runtime/makemenu.vim
+
+Patch 7.4a.002
+Problem: Valgrind errors in test 89. (Simon Ruderich)
+Solution: Allocate one more byte. (Dominique Pelle)
+Files: src/misc2.c
+
+Patch 7.4a.003
+Problem: Copyright year is outdated.
+Solution: Only use the first year.
+Files: src/vim.rc, src/vim16.rc
+
+Patch 7.4a.004
+Problem: MSVC 2012 Update 3 is not recognized.
+Solution: Add the version number. (Raymond Ko)
+Files: src/Make_mvc.mak
+
+Patch 7.4a.005
+Problem: Scroll binding causes unexpected scroll.
+Solution: Store the topline after updating scroll binding. Add a test.
+ (Lech Lorens)
+Files: src/testdir/test98.in, src/testdir/test98a.in,
+ src/testdir/test98.ok, src/option.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile
+
+Patch 7.4a.006
+Problem: Failure in po file check goes unnoticed.
+Solution: Fail "make test" if the po file check fails.
+Files: src/Makefile
+
+Patch 7.4a.007
+Problem: After "g$" with 'virtualedit' set, "k" moves to a different
+ column. (Dimitar Dimitrov)
+Solution: Set w_curswant. (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.4a.008
+Problem: Python 3 doesn't handle multibyte characters properly when
+ 'encoding' is not utf-8.
+Solution: Use PyUnicode_Decode() instead of PyUnicode_FromString(). (Ken
+ Takata)
+Files: src/if_python3.c
+
+Patch 7.4a.009
+Problem: Compiler warnings for function prototypes.
+Solution: Add "void". Move list_features() prototype. (Ken Takata)
+Files: src/gui_w48.c, src/if_py_both.h, src/version.c
+
+Patch 7.4a.010
+Problem: Test 86 and 87 fail when building with Python or Python 3 and
+ using a static library.
+Solution: Add configure check to add -fPIE compiler flag.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4a.011
+Problem: Configure check for Python 3 config name isn't right.
+Solution: Always include vi_cv_var_python3_version. (Tim Harder)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4a.012
+Problem: "make test" fails when using a shadow directory.
+Solution: Create links for files in src/po. (James McCoy)
+Files: src/Makefile
+
+Patch 7.4a.013
+Problem: Setting/resetting 'lbr' in the main help file changes alignment
+ after a Tab. (Dimitar Dimitrov)
+Solution: Also use the code for conceal mode where n_extra is computed for
+ 'lbr'.
+Files: src/screen.c, src/testdir/test88.in, src/testdir/test88.ok
+
+Patch 7.4a.014
+Problem: Test 86 and 89 have a problem with using a shadow dir.
+Solution: Adjust for the different directory structure. (James McCoy)
+Files: src/testdir/test89.in, src/testdir/test86.in, src/Makefile
+
+Patch 7.4a.015
+Problem: No Japanese man pages.
+Solution: Add Japanese translations of man pages. (Ken Takata, Yukihiro
+ Nakadaira, et al.)
+Files: Filelist, src/Makefile, runtime/doc/evim-ja.UTF-8.1,
+ runtime/doc/vim-ja.UTF-8.1, runtime/doc/vimdiff-ja.UTF-8.1,
+ runtime/doc/vimtutor-ja.UTF-8.1, runtime/doc/xxd-ja.UTF-8.1
+
+Patch 7.4a.016 (after 7.4a.014)
+Problem: Features enabled in Makefile.
+Solution: Undo accidental changes.
+Files: src/Makefile
+
+Patch 7.4a.017
+Problem: When 'foldmethod' is "indent", using ">>" on a line just above a
+ fold makes the cursor line folded. (Evan Laforge)
+Solution: Call foldOpenCursor(). (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.4a.018
+Problem: Compiler warning for code unreachable. (Charles Campbell)
+Solution: Use "while" instead of endless loop. Change break to continue.
+Files: src/regexp_nfa.c, src/ui.c
+
+Patch 7.4a.019
+Problem: Invalid closing parenthesis in test 62. Command truncated at
+ double quote.
+Solution: Remove the parenthesis. Change double quote to ''. (ZyX)
+Files: src/testdir/test62.in, src/testdir/test62.ok
+
+Patch 7.4a.020
+Problem: Superfluous mb_ptr_adv().
+Solution: Remove the call. (Dominique Pelle)
+Files: src/regexp_nfa.c
+
+Patch 7.4a.021
+Problem: Using feedkeys() doesn't always work.
+Solution: Omit feedkeys(). (Ken Takata)
+Files: src/testdir/test98a.in
+
+Patch 7.4a.022
+Problem: Using "d2g$" does not delete the last character. (ZyX)
+Solution: Set the "inclusive" flag properly.
+Files: src/normal.c
+
+Patch 7.4a.023 (after 7.4a.019)
+Problem: Still another superfluous parenthesis. (ZyX)
+Solution: Remove it.
+Files: src/testdir/test62.in
+
+Patch 7.4a.024
+Problem: X11 GUI: Checking icon height twice.
+Solution: Check height and width. (Dominique Pelle)
+Files: src/gui_x11.c
+
+Patch 7.4a.025
+Problem: Get the press-Enter prompt even after using :redraw.
+Solution: Clear need_wait_return when executing :redraw.
+Files: src/ex_docmd.c
+
+Patch 7.4a.026
+Problem: ":diffoff" does not remove folds. (Ramel)
+Solution: Do not restore 'foldenable' when 'foldmethod' is "manual".
+Files: src/diff.c
+
+Patch 7.4a.027
+Problem: When Python adds lines to another buffer the cursor position is
+ wrong, it might be below the last line causing ml_get errors.
+ (Vlad Irnov)
+Solution: Temporarily change the current window, so that marks are corrected
+ properly.
+Files: src/if_py_both.h, src/window.c, src/proto/buffer.pro
+
+Patch 7.4a.028
+Problem: Crash when spell checking in new buffer.
+Solution: Set the b_p_key field. (Mike Williams)
+Files: src/spell.c, src/testdir/test58.in
+
+Patch 7.4a.029
+Problem: Can't build with MzScheme on Ubuntu 13.04.
+Solution: Add configure check for the "ffi" library.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4a.030 (after 7.4.027)
+Problem: Missing find_win_for_buf(). (toothpik)
+Solution: Add missing changes.
+Files: src/buffer.c
+
+Patch 7.4a.031
+Problem: Compiler warnings. (Charles Campbell)
+Solution: Initialize variables even when not needed.
+Files: src/regexp_nfa.c, src/search.c
+
+Patch 7.4a.032
+Problem: New regexp engine: Does not match shorter alternative. (Ingo
+ Karkat)
+Solution: Do not drop a new state when the PIM info is different.
+Files: src/regexp_nfa.c
+
+Patch 7.4a.033
+Problem: Test 98 always passes.
+Solution: Include test98a.in in test98.in, execute the crucial command in
+ one line. (Yukihiro Nakadaira)
+Files: src/testdir/test98.in, src/testdir/test98a.in
+
+Patch 7.4a.034
+Problem: The tabline may flicker when opening a new tab after 7.3.759 on
+ Win32.
+Solution: Move call to TabCtrl_SetCurSel(). (Ken Takata)
+Files: src/gui_w48.c
+
+Patch 7.4a.035
+Problem: Fix in patch 7.4a.032 is not tested.
+Solution: Add test.
+Files: src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4a.036
+Problem: "\p" in a regexp does not match double-width characters.
+ (Yukihiro Nakadaira)
+Solution: Don't count display cells, use vim_isprintc().
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
+ src/testdir/test64.ok, src/testdir/test95.in,
+ src/testdir/test95.ok
+
+Patch 7.4a.037
+Problem: Win32: When mouse is hidden and in the toolbar, moving it won't
+ make it appear. (Sami Salonen)
+Solution: Add tabline_wndproc() and toolbar_wndproc(). (Ken Takata)
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 7.4a.038
+Problem: When using MSVC 2012 there are various issues, including GUI size
+ computations.
+Solution: Use SM_CXPADDEDBORDER. (Mike Williams)
+Files: src/gui_w32.c, src/gui_w48.c, src/os_win32.h
+
+Patch 7.4a.039
+Problem: New regexp engine doesn't match pattern. (Ingo Karkat)
+Solution: When adding a state also check for different PIM if the list of
+ states has any state with a PIM.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4a.040
+Problem: Win32: using uninitialized variable.
+Solution: (Yukihiro Nakadaira)
+Files: src/os_win32.c
+
+Patch 7.4a.041
+Problem: When using ":new ++ff=unix" and "dos" is first in 'fileformats'
+ then 'ff' is set to "dos" instead of "unix". (Ingo Karkat)
+Solution: Create set_file_options() and invoke it from do_ecmd().
+Files: src/fileio.c, src/proto/fileio.pro, src/ex_cmds.c,
+ src/testdir/test91.in, src/testdir/test91.ok
+
+Patch 7.4a.042
+Problem: Crash when BufUnload autocommands close all buffers. (Andrew
+ Pimlott)
+Solution: Set curwin->w_buffer to curbuf to avoid NULL.
+Files: src/window.c, src/testdir/test8.in, src/testdir/test8.ok
+
+Patch 7.4a.043
+Problem: More ml_get errors when adding or deleting lines from Python.
+ (Vlad Irnov)
+Solution: Switch to a window with the buffer when possible.
+Files: src/if_py_both.h
+
+Patch 7.4a.044
+Problem: Test 96 sometimes fails.
+Solution: Clear window from b_wininfo in win_free(). (Suggestion by
+ Yukihiro Nakadaira)
+Files: src/window.c
+
+Patch 7.4a.045
+Problem: Configure does not always find the right library for Lua. Missing
+ support for LuaJit.
+Solution: Improve the configure detection of Lua. (Hiroshi Shirosaki)
+Files: src/Makefile, src/configure.in, src/auto/configure
+
+Patch 7.4a.046
+Problem: Can't build without mbyte feature.
+Solution: Add #ifdefs.
+Files: src/ex_cmds.c
+
+Patch 7.4a.047
+Problem: Some comments are not so nice.
+Solution: Change the comments.
+Files: src/ex_docmd.c, src/message.c, src/ops.c, src/option.c
+
+Patch 7.4b.001
+Problem: Win32: dialog may extend off-screen.
+Solution: Reduce the size, use correct borders. (Andrei Olsen)
+Files: src/gui_w32.c
+
+Patch 7.4b.002
+Problem: Crash searching for \%(\%(\|\d\|-\|\.\)*\|\*\). (Marcin
+ Szamotulski) Also for \(\)*.
+Solution: Do add a state for opening parenthesis, so that we can check if it
+ was added before at the same position.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4b.003
+Problem: Regexp code is not nicely aligned.
+Solution: Adjust white space. (Ken Takata)
+Files: src/regexp_nfa.c
+
+Patch 7.4b.004
+Problem: Regexp crash on pattern "@\%[\w\-]*". (Axel Kielhorn)
+Solution: Add \%(\) around \%[] internally.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4b.005
+Problem: Finding %s in shellpipe and shellredir does not ignore %%s.
+Solution: Skip over %%. (lcd 47)
+Files: src/ex_cmds.c
+
+Patch 7.4b.006 (after 7.3.1295)
+Problem: Using \{n,m} in an autocommand pattern no longer works.
+ Specifically, mutt temp files are not recognized. (Gary Johnson)
+Solution: Make \\\{n,m\} work.
+Files: runtime/doc/autocmd.txt, src/fileio.c
+
+Patch 7.4b.007
+Problem: On 32 bit MS-Windows :perldo does not work.
+Solution: Make sure time_t uses 32 bits. (Ken Takata)
+Files: src/if_perl.xs, src/vim.h
+
+Patch 7.4b.008
+Problem: 'autochdir' causes setbufvar() to change the current directory.
+ (Ben Fritz)
+Solution: When disabling autocommands also reset 'acd' temporarily.
+ (Christian Brabandt)
+Files: src/fileio.c
+
+Patch 7.4b.009
+Problem: When setting the Visual area manually and 'selection' is
+ exclusive, a yank includes one character too much. (Ingo Karkat)
+Solution: Default the Visual operation to "v". (Christian Brabandt)
+Files: src/mark.c
+
+Patch 7.4b.010
+Problem: Win32: Tcl library load does not use standard mechanism.
+Solution: Call vimLoadLib() instead of LoadLibraryEx(). (Ken Takata)
+Files: src/if_perl.xs, src/if_tcl.c
+
+Patch 7.4b.011
+Problem: ":he \%(\)" does not work. (ZyX)
+Solution: Add an exception to the list.
+Files: src/ex_cmds.c
+
+Patch 7.4b.012
+Problem: Output from a shell command is truncated at a NUL. (lcd 47)
+Solution: Change every NUL into an SOH.
+Files: src/misc1.c
+
+Patch 7.4b.013
+Problem: Install dir for JP man pages is wrong.
+Solution: Remove ".UTF-8" from the directory name. (Ken Takata)
+Files: src/Makefile
+
+Patch 7.4b.014 (after 7.4b.012)
+Problem: Stupid mistake.
+Solution: Changle "len" to "i".
+Files: src/misc1.c
+
+Patch 7.4b.015 (after 7.4b.008)
+Problem: Can't compile without the 'acd' feature.
+Solution: Add #ifdefs. (Kazunobu Kuriyama)
+Files: src/fileio.c
+
+Patch 7.4b.016
+Problem: Ruby detection fails on Fedora 19.
+Solution: Use one way to get the Ruby version. (Michael Henry)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4b.017
+Problem: ":he \^x" gives a strange error message. (glts)
+Solution: Do not translate \^x to \_CTRL-x.
+Files: src/ex_cmds.c
+
+Patch 7.4b.018 (after 7.4b.001)
+Problem: Win32: Dialog can still be too big.
+Solution: Move the check for height further down. (Andrei Olsen)
+Files: src/gui_w32.c
+
+Patch 7.4b.019 (after 7.4a.034)
+Problem: Tabline is not updated properly when closing a tab on Win32.
+Solution: Only reduce flickering when adding a tab. (Ken Takata)
+Files: src/gui_w48.c
+
+Patch 7.4b.020
+Problem: "g~ap" changes first character of next paragraph. (Manuel Ortega)
+Solution: Avoid subtracting (0 - 1) from todo. (Mike Williams)
+Files: src/ops.c, src/testdir/test82.in, src/testdir/test82.ok
+
+Patch 7.4b.021
+Problem: Pressing "u" after an external command results in multiple
+ press-enter messages. (glts)
+Solution: Don't call hit_return_msg() when we have K_IGNORE. (Christian
+ Brabandt)
+Files: src/message.c
+
+Patch 7.4b.022
+Problem: Not waiting for a character when the tick count overflows.
+Solution: Subtract the unsigned numbers and cast to int. (Ken Takata)
+Files: src/os_win32.c
+
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/version8.txt b/runtime/doc/version8.txt
new file mode 100644
index 0000000..fd30bbc
--- /dev/null
+++ b/runtime/doc/version8.txt
@@ -0,0 +1,41150 @@
+*version8.txt* For Vim version 9.0. Last change: 2022 Feb 26
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *vim8* *vim-8* *version-8.0* *version8.0*
+Welcome to Vim 8! A large number of bugs have been fixed and several nice
+features have been added. This file mentions all the new items and changes to
+existing features since Vim 7.4. The patches up to Vim 7.4 can be found here:
+|vim-7.4|.
+
+Use this command to see the full version and features information of the Vim
+program you are using: >
+ :version
+
+NEW FEATURES |new-8|
+ Vim script enhancements |new-vim-script-8|
+ Various new items |new-items-8|
+
+INCOMPATIBLE CHANGES |incompatible-8|
+
+IMPROVEMENTS |improvements-8|
+
+COMPILE TIME CHANGES |compile-changes-8|
+
+PATCHES |patches-8|
+
+VERSION 8.1 |version-8.1|
+Changed |changed-8.1|
+Added |added-8.1|
+Patches |patches-8.1|
+
+VERSION 8.2 |version-8.2|
+Changed |changed-8.2|
+Added |added-8.2|
+Patches |patches-8.2|
+
+
+See |vi_diff.txt| for an overview of differences between Vi and Vim 8.0.
+See |version4.txt|, |version5.txt|, |version6.txt| and |version7.txt| for
+differences between other versions.
+
+ *vim-changelog*
+You can find an overview of the most important changes (according to Martin
+Tournoij) on this site: https://www.arp242.net/vimlog/
+
+==============================================================================
+NEW FEATURES *new-8*
+
+First an overview of the more interesting new features. A comprehensive list
+is below.
+
+
+Asynchronous I/O support, channels ~
+
+Vim can now exchange messages with other processes in the background. This
+makes it possible to have servers do work and send back the results to Vim.
+See |channel-demo| for an example, this shows communicating with a Python
+server.
+
+Closely related to channels is JSON support. JSON is widely supported and can
+easily be used for inter-process communication, allowing for writing a server
+in any language. The functions to use are |json_encode()| and |json_decode()|.
+
+This makes it possible to build very complex plugins, written in any language
+and running in a separate process.
+
+
+Jobs ~
+
+Vim can now start a job, communicate with it and stop it. This is very useful
+to run a process for completion, syntax checking, etc. Channels are used to
+communicate with the job. Jobs can also read from or write to a buffer or a
+file. See |job_start()|.
+
+
+Timers ~
+
+Also asynchronous are timers. They can fire once or repeatedly and invoke a
+function to do any work. For example: >
+ let tempTimer = timer_start(4000, 'CheckTemp')
+This will call the CheckTemp() function four seconds (4000 milliseconds)
+later. See |timer_start()|.
+
+
+Partials ~
+
+Vim already had a Funcref, a reference to a function. A partial also refers
+to a function, and additionally binds arguments and/or a dictionary. This is
+especially useful for callbacks on channels and timers. E.g., for the timer
+example above, to pass an argument to the function: >
+ let tempTimer = timer_start(4000, function('CheckTemp', ['out']))
+This will call CheckTemp('out') four seconds later.
+
+
+Lambda and Closure ~
+
+A short way to create a function has been added: {args -> expr}. See |lambda|.
+This is useful for functions such as `filter()` and `map()`, which now also
+accept a function argument. Example: >
+ :call filter(mylist, {idx, val -> val > 20})
+
+A lambda can use variables defined in the scope where the lambda is defined.
+This is usually called a |closure|.
+
+User defined functions can also be a closure by adding the "closure" argument
+|:func-closure|.
+
+
+Packages ~
+
+Plugins keep growing and more of them are available than ever before. To keep
+the collection of plugins manageable package support has been added. This is
+a convenient way to get one or more plugins, drop them in a directory and
+possibly keep them updated. Vim will load them automatically, or only when
+desired. See |packages|.
+
+
+New style tests ~
+
+This is for Vim developers. So far writing tests for Vim has not been easy.
+Vim 8 adds assert functions and a framework to run tests. This makes it a lot
+simpler to write tests and keep them updated. Also new are several functions
+that are added specifically for testing. See |test-functions|.
+
+
+Window IDs ~
+
+Previously windows could only be accessed by their number. And every time a
+window would open, close or move that number changes. Each window now has a
+unique ID, so that they are easy to find. See |win_getid()| and |win_id2win()|.
+
+
+Viminfo uses timestamps ~
+
+Previously the information stored in viminfo was whatever the last Vim wrote
+there. Now timestamps are used to always keep the most recent items.
+See |viminfo-timestamp|.
+
+
+Wrapping lines with indent ~
+
+The 'breakindent' option has been added to be able to wrap lines without
+changing the amount of indent.
+
+
+Windows: DirectX support ~
+
+This adds the 'renderoptions' option to allow for switching on DirectX
+(DirectWrite) support on MS-Windows.
+
+
+GTK+ 3 support ~
+
+The GTK+ 3 GUI works just like GTK+ 2 except for hardly noticeable technical
+differences between them. Configure still chooses GTK+ 2 if both 2 and 3 are
+available. See src/Makefile for how to use GTK+ 3 instead. See
+|gui-x11-compiling| for other details.
+
+
+Vim script enhancements *new-vim-script-8*
+-----------------------
+
+In Vim script the following types have been added:
+
+ |Special| |v:false|, |v:true|, |v:none| and |v:null|
+ |Channel| connection to another process for asynchronous I/O
+ |Job| process control
+
+Many functions and commands have been added to support the new types.
+
+On some systems the numbers used in Vim script are now 64 bit. This can be
+checked with the |+num64| feature.
+
+Many items were added to support |new-style-testing|.
+
+printf() now accepts any type of argument for %s. It is converted to a string
+like with string().
+
+
+Various new items *new-items-8*
+-----------------
+
+Visual mode commands: ~
+
+|v_CTRL-A| CTRL-A add N to number in highlighted text
+|v_CTRL-X| CTRL-X subtract N from number in highlighted text
+|v_g_CTRL-A| g CTRL-A add N to number in highlighted text
+|v_g_CTRL-X| g CTRL-X subtract N from number in highlighted text
+
+
+Insert mode commands: ~
+
+|i_CTRL-G_U| CTRL-G U don't break undo with next cursor movement
+
+
+Cmdline mode commands: ~
+
+|/_CTRL-G| CTRL-G move to the next match in 'incsearch' mode
+|/_CTRL-T| CTRL-T move to the previous match in 'incsearch' mode
+
+
+Options: ~
+
+'belloff' do not ring the bell for these reasons
+'breakindent' wrapped line repeats indent
+'breakindentopt' settings for 'breakindent'.
+'emoji' emoji characters are considered full width
+'fixendofline' make sure last line in file has <EOL>
+'langremap' do apply 'langmap' to mapped characters
+'luadll' name of the Lua dynamic library
+'packpath' list of directories used for packages
+'perldll' name of the Perl dynamic library
+'pythondll' name of the Python 2 dynamic library
+'pythonthreedll' name of the Python 3 dynamic library
+'renderoptions' options for text rendering on Windows
+'rubydll' name of the Ruby dynamic library
+'signcolumn' when to display the sign column
+'tagcase' how to handle case when searching in tags files
+'tcldll' name of the Tcl dynamic library
+'termguicolors' use GUI colors for the terminal
+
+
+Ex commands: ~
+
+|:cbottom| scroll to the bottom of the quickfix window
+|:cdo| execute command in each valid error list entry
+|:cfdo| execute command in each file in error list
+|:chistory| display quickfix list stack
+|:clearjumps| clear the jump list
+|:filter| only output lines that (do not) match a pattern
+|:helpclose| close one help window
+|:lbottom| scroll to the bottom of the location window
+|:ldo| execute command in valid location list entries
+|:lfdo| execute command in each file in location list
+|:lhistory| display location list stack
+|:noswapfile| following commands don't create a swap file
+|:packadd| add a plugin from 'packpath'
+|:packloadall| load all packages under 'packpath'
+|:smile| make the user happy
+
+
+Ex command modifiers: ~
+
+|:keeppatterns| following command keeps search pattern history
+|<mods>| supply command modifiers to user defined commands
+
+
+New and extended functions: ~
+
+|arglistid()| get id of the argument list
+|assert_equal()| assert that two expressions values are equal
+|assert_exception()| assert that a command throws an exception
+|assert_fails()| assert that a function call fails
+|assert_false()| assert that an expression is false
+|assert_inrange()| assert that an expression is inside a range
+|assert_match()| assert that a pattern matches the value
+|assert_notequal()| assert that two expressions values are not equal
+|assert_notmatch()| assert that a pattern does not match the value
+|assert_true()| assert that an expression is true
+|bufwinid()| get the window ID of a specific buffer
+|byteidxcomp()| like byteidx() but count composing characters
+|ch_close()| close a channel
+|ch_close_in()| close the in part of a channel
+|ch_evalexpr()| evaluates an expression over channel
+|ch_evalraw()| evaluates a raw string over channel
+|ch_getbufnr()| get the buffer number of a channel
+|ch_getjob()| get the job associated with a channel
+|ch_info()| get channel information
+|ch_log()| write a message in the channel log file
+|ch_logfile()| set the channel log file
+|ch_open()| open a channel
+|ch_read()| read a message from a channel
+|ch_readraw()| read a raw message from a channel
+|ch_sendexpr()| send a JSON message over a channel
+|ch_sendraw()| send a raw message over a channel
+|ch_setoptions()| set the options for a channel
+|ch_status()| get status of a channel
+|execute()| execute an Ex command and get the output
+|exepath()| full path of an executable program
+|funcref()| return a reference to function {name}
+|getbufinfo()| get a list with buffer information
+|getcharsearch()| return character search information
+|getcmdwintype()| return the current command-line window type
+|getcompletion()| return a list of command-line completion matches
+|getcurpos()| get position of the cursor
+|gettabinfo()| get a list with tab page information
+|getwininfo()| get a list with window information
+|glob2regpat()| convert a glob pattern into a search pattern
+|isnan()| check for not a number
+|job_getchannel()| get the channel used by a job
+|job_info()| get information about a job
+|job_setoptions()| set options for a job
+|job_start()| start a job
+|job_status()| get the status of a job
+|job_stop()| stop a job
+|js_decode()| decode a JSON string to Vim types
+|js_encode()| encode an expression to a JSON string
+|json_decode()| decode a JSON string to Vim types
+|json_encode()| encode an expression to a JSON string
+|matchaddpos()| define a list of positions to highlight
+|matchstrpos()| match and positions of a pattern in a string
+|perleval()| evaluate Perl expression
+|reltimefloat()| convert reltime() result to a Float
+|setcharsearch()| set character search information
+|setfperm()| set the permissions of a file
+|strcharpart()| get part of a string using char index
+|strgetchar()| get character from a string using char index
+|systemlist()| get the result of a shell command as a list
+|test_alloc_fail()| make memory allocation fail
+|test_autochdir()| test 'autochdir' functionality
+|test_garbagecollect_now()| free memory right now
+|test_null_channel()| return a null Channel
+|test_null_dict()| return a null Dict
+|test_null_job()| return a null Job
+|test_null_list()| return a null List
+|test_null_partial()| return a null Partial function
+|test_null_string()| return a null String
+|test_settime()| set the time Vim uses internally
+|timer_info()| get information about timers
+|timer_pause()| pause or unpause a timer
+|timer_start()| create a timer
+|timer_stop()| stop a timer
+|timer_stopall()| stop all timers
+|uniq()| remove copies of repeated adjacent items
+|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
+|wordcount()| get byte/word/char count of buffer
+
+
+New Vim variables: ~
+
+|v:beval_winid| Window ID of the window where the mouse pointer is
+|v:completed_item| complete items for the most recently completed word
+|v:errors| errors found by assert functions
+|v:false| a Number with value zero
+|v:hlsearch| indicates whether search highlighting is on
+|v:mouse_winid| Window ID for a mouse click obtained with |getchar()|
+|v:none| an empty String, used for JSON
+|v:null| an empty String, used for JSON
+|v:option_new| new value of the option, used by |OptionSet|
+|v:option_old| old value of the option, used by |OptionSet|
+|v:option_oldlocal| old local value of the option, used by |OptionSet|
+|v:option_oldglobal| old global value of the option, used by |OptionSet|
+|v:option_type| scope of the set command, used by |OptionSet|
+|v:option_command| command used to set the option, used by |OptionSet|
+|v:progpath| the command with which Vim was invoked
+|v:t_bool| value of Boolean type
+|v:t_channel| value of Channel type
+|v:t_dict| value of Dictionary type
+|v:t_float| value of Float type
+|v:t_func| value of Funcref type
+|v:t_job| value of Job type
+|v:t_list| value of List type
+|v:t_none| value of None type
+|v:t_number| value of Number type
+|v:t_string| value of String type
+|v:testing| must be set before using `test_garbagecollect_now()`
+|v:true| a Number with value one
+|v:vim_did_enter| set just before VimEnter autocommands are triggered
+
+
+New autocommand events: ~
+
+|CmdUndefined| a user command is used but it isn't defined
+|OptionSet| after setting any option
+|TabClosed| after closing a tab page
+|TabNew| after creating a new tab page
+|TextChanged| after a change was made to the text in Normal mode
+|TextChangedI| after a change was made to the text in Insert mode
+|WinNew| after creating a new window
+
+
+New highlight groups: ~
+
+EndOfBuffer filler lines (~) after the last line in the buffer.
+ |hl-EndOfBuffer|
+
+
+New items in search patterns: ~
+
+|/\%C| \%C match any composing characters
+
+
+New Syntax/Indent/FTplugin files: ~
+
+AVR Assembler (Avra) syntax
+Arduino syntax
+Bazel syntax and indent and ftplugin
+Dockerfile syntax and ftplugin
+Eiffel ftplugin
+Euphoria 3 and 4 syntax
+Go syntax and indent and ftplugin
+Godoc syntax
+Groovy ftplugin
+HGcommit ftplugin
+Hog indent and ftplugin
+Innovation Data Processing upstream.pt syntax
+J syntax and indent and ftplugin
+Jproperties ftplugin
+Json syntax and indent and ftplugin
+Kivy syntax
+Less syntax and indent
+Mix syntax
+Motorola S-Record syntax
+R ftplugin
+ReStructuredText syntax and indent and ftplugin
+Registry ftplugin
+Rhelp indent and ftplugin
+Rmd (markdown with R code chunks) syntax and indent
+Rmd ftplugin
+Rnoweb ftplugin
+Rnoweb indent
+Scala syntax and indent and ftplugin
+SystemVerilog syntax and indent and ftplugin
+Systemd syntax and indent and ftplugin
+Teraterm (TTL) syntax and indent
+Text ftplugin
+Vroom syntax and indent and ftplugin
+
+
+New Keymaps: ~
+
+Armenian eastern and western
+Russian jcukenwintype
+Vietnamese telex and vni
+
+==============================================================================
+INCOMPATIBLE CHANGES *incompatible-8*
+
+These changes are incompatible with previous releases. Check this list if you
+run into a problem when upgrading from Vim 7.4 to 8.0.
+
+
+Better defaults without a vimrc ~
+
+When no vimrc file is found, the |defaults.vim| script is loaded to set more
+useful default values for new users. That includes setting 'nocompatible'.
+Thus Vim no longer starts up in Vi compatible mode. If you do want that,
+either create a .vimrc file that does "set compatible" or start Vim with
+"vim -C".
+
+
+Support removed ~
+
+The support for MS-DOS has been removed. It hasn't been working for a while
+(Vim doesn't fit in memory) and removing it cleans up the code quite a bit.
+
+The support for Windows 16 bit (Windows 95 and older) has been removed.
+
+The support for OS/2 has been removed. It probably hasn't been working for a
+while since nobody uses it.
+
+The SNiFF+ support has been removed.
+
+
+Minor incompatibilities: ~
+
+Probably...
+
+==============================================================================
+IMPROVEMENTS *improvements-8*
+
+The existing blowfish encryption turned out to be much weaker than it was
+supposed to be. The blowfish2 method has been added to fix that. Note that
+this still isn't a state-of-the-art encryption, but good enough for most
+usage. See 'cryptmethod'.
+
+
+==============================================================================
+COMPILE TIME CHANGES *compile-changes-8*
+
+The Vim repository was moved from Google code to github, since Google code
+was shut down. It can now be found at https://github.com/vim/vim.
+
+Functions now use ANSI-C declarations. At least a C-89 compatible compiler is
+required.
+
+The +visual feature is now always included.
+
+==============================================================================
+PATCHES *patches-8* *bug-fixes-8*
+
+The list of patches that got included since 7.4.0. This includes all the new
+features, but does not include runtime file changes (syntax, indent, help,
+etc.)
+
+Patch 7.4.001
+Problem: Character classes such as [a-z] do not react to 'ignorecase'.
+ Breaks man page highlighting. (Mario Grgic)
+Solution: Add separate items for classes that react to 'ignorecase'. Clean
+ up logic handling character classes. Add more tests.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.002
+Problem: Pattern with two alternative look-behind matches does not match.
+ (Amadeus Demarzi)
+Solution: When comparing PIMs also compare their state ID to see if they are
+ different.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.003
+Problem: Memory access error in Ruby syntax highlighting. (Christopher Chow)
+Solution: Refresh stale pointer. (James McCoy)
+Files: src/regexp_nfa.c
+
+Patch 7.4.004
+Problem: When closing a window fails ":bwipe" may hang.
+Solution: Let win_close() return FAIL and break out of the loop.
+Files: src/window.c, src/proto/window.pro, src/buffer.c
+
+Patch 7.4.005
+Problem: Using "vaB" while 'virtualedit' is set selects the wrong area.
+ (Dimitar Dimitrov)
+Solution: Reset coladd when finding a match.
+Files: src/search.c
+
+Patch 7.4.006
+Problem: mkdir("foo/bar/", "p") gives an error message. (David Barnett)
+Solution: Remove the trailing slash. (lcd)
+Files: src/eval.c
+
+Patch 7.4.007
+Problem: Creating a preview window on startup leaves the screen layout in a
+ messed up state. (Marius Gedminas)
+Solution: Don't change firstwin. (Christian Brabandt)
+Files: src/main.c
+
+Patch 7.4.008
+Problem: New regexp engine can't be interrupted.
+Solution: Check for CTRL-C pressed. (Yasuhiro Matsumoto)
+Files: src/regexp_nfa.c, src/regexp.c
+
+Patch 7.4.009
+Problem: When a file was not decrypted (yet), writing it may destroy the
+ contents.
+Solution: Mark the file as readonly until decryption was done. (Christian
+ Brabandt)
+Files: src/fileio.c
+
+Patch 7.4.010 (after 7.4.006)
+Problem: Crash with invalid argument to mkdir().
+Solution: Check for empty string. (lcd47)
+Files: src/eval.c
+
+Patch 7.4.011
+Problem: Cannot find out if "acl" and "xpm" features are supported.
+Solution: Add "acl" and "xpm" to the list of features. (Ken Takata)
+Files: src/eval.c, src/version.c
+
+Patch 7.4.012
+Problem: MS-Windows: resolving shortcut does not work properly with
+ multibyte characters.
+Solution: Use wide system functions. (Ken Takata)
+Files: src/os_mswin.c
+
+Patch 7.4.013
+Problem: MS-Windows: File name buffer too small for utf-8.
+Solution: Use character count instead of byte count. (Ken Takata)
+Files: src/os_mswin.c
+
+Patch 7.4.014
+Problem: MS-Windows: check for writing to device does not work.
+Solution: Fix #ifdefs. (Ken Takata)
+Files: src/fileio.c
+
+Patch 7.4.015
+Problem: MS-Windows: Detecting node type does not work for multibyte
+ characters.
+Solution: Use wide character function when needed. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.016
+Problem: MS-Windows: File name case can be wrong.
+Solution: Add fname_casew(). (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.017
+Problem: ":help !!" does not find the "!!" tag in the help file. (Ben
+ Fritz)
+Solution: When reading the start of the tags file do parse lines that are
+ not header lines.
+Files: src/tag.c
+
+Patch 7.4.018
+Problem: When completing item becomes unselected. (Shougo Matsu)
+Solution: Revert patch 7.3.1269.
+Files: src/edit.c
+
+Patch 7.4.019
+Problem: MS-Windows: File name completion doesn't work properly with
+ Chinese characters. (Yue Wu)
+Solution: Take care of multibyte characters when looking for the start of
+ the file name. (Ken Takata)
+Files: src/edit.c
+
+Patch 7.4.020
+Problem: NFA engine matches too much with \@>. (John McGowan)
+Solution: When a whole pattern match is found stop searching.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.021
+Problem: NFA regexp: Using \ze in one branch which doesn't match may cause
+ end of another branch to be wrong. (William Fugh)
+Solution: Set end position if it wasn't set yet.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.022
+Problem: Deadlock while exiting, because of allocating memory.
+Solution: Do not use gettext() in deathtrap(). (James McCoy)
+Files: src/os_unix.c, src/misc1.c
+
+Patch 7.4.023
+Problem: Compiler warning on 64 bit windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/edit.c
+
+Patch 7.4.024
+Problem: When root edits a file the undo file is owned by root while the
+ edited file may be owned by another user, which is not allowed.
+ (cac2s)
+Solution: Accept an undo file owned by the current user.
+Files: src/undo.c
+
+Patch 7.4.025 (after 7.4.019)
+Problem: Reading before start of a string.
+Solution: Do not call mb_ptr_back() at start of a string. (Dominique Pelle)
+Files: src/edit.c
+
+Patch 7.4.026
+Problem: Clang warning for int shift overflow.
+Solution: Use unsigned and cast back to int. (Dominique Pelle)
+Files: src/misc2.c
+
+Patch 7.4.027 (after 7.4.025)
+Problem: Another valgrind error when using CTRL-X CTRL-F at the start of
+ the line. (Dominique Pelle)
+Solution: Don't call mb_ptr_back() at the start of the line. Add a test.
+Files: src/edit.c, src/testdir/test32.in
+
+Patch 7.4.028
+Problem: Equivalence classes are not working for multibyte characters.
+Solution: Copy the rules from the old to the new regexp engine. Add a test
+ to check both engines.
+Files: src/regexp_nfa.c, src/testdir/test44.in, src/testdir/test99.in,
+ src/testdir/test99.ok, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile
+
+Patch 7.4.029
+Problem: An error in a pattern is reported twice.
+Solution: Remove the retry with the backtracking engine, it won't work.
+Files: src/regexp.c
+
+Patch 7.4.030
+Problem: The -mno-cygwin argument is no longer supported by Cygwin.
+Solution: Remove the arguments. (Steve Hall)
+Files: src/GvimExt/Make_cyg.mak, src/Make_cyg.mak, src/xxd/Make_cyg.mak
+
+Patch 7.4.031
+Problem: ":diffoff!" resets options even when 'diff' is not set. (Charles
+ Cooper)
+Solution: Only resets related options in a window where 'diff' is set.
+Files: src/diff.c
+
+Patch 7.4.032
+Problem: NFA engine does not match the NUL character. (Jonathon Merz)
+Solution: Use 0x0a instead of NUL. (Christian Brabandt)
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.033
+Problem: When the terminal has only 20 lines test 92 and 93 overwrite the
+ input file.
+Solution: Explicitly write test.out. Check that the terminal is large enough
+ to run the tests. (Hirohito Higashi)
+Files: src/testdir/test92.in, src/testdir/test93.in,
+ src/testdir/test1.in, src/testdir/Makefile
+
+Patch 7.4.034
+Problem: Using "p" in Visual block mode only changes the first line.
+Solution: Repeat the put in all text in the block. (Christian Brabandt)
+Files: runtime/doc/change.txt, src/ops.c, src/normal.c,
+ src/testdir/test20.in, src/testdir/test20.ok
+
+Patch 7.4.035
+Problem: MS-Windows: The mouse pointer flickers when going from command
+ line mode to Normal mode.
+Solution: Check for WM_NCMOUSEMOVE. (Ken Takata)
+Files: src/gui_w48.c
+
+Patch 7.4.036
+Problem: NFA engine does not capture group correctly when using \@>. (ZyX)
+Solution: Copy submatches before doing the recursive match.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.037
+Problem: Using "\ze" in a sub-pattern does not result in the end of the
+ match to be set. (Axel Bender)
+Solution: Copy the end of match position when a recursive match was
+ successful.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.038
+Problem: Using "zw" and "zg" when 'spell' is off give a confusing error
+ message. (Gary Johnson)
+Solution: Ignore the error when locating the word. Explicitly mention what
+ word was added. (Christian Brabandt)
+Files: src/normal.c, src/spell.c
+
+Patch 7.4.039
+Problem: MS-Windows: MSVC10 and earlier can't handle symlinks to a
+ directory properly.
+Solution: Add stat_symlink_aware() and wstat_symlink_aware(). (Ken Takata)
+Files: src/os_mswin.c, src/os_win32.c, src/os_win32.h
+
+Patch 7.4.040
+Problem: Valgrind error on exit when a script-local variable holds a
+ reference to the scope of another script.
+Solution: First clear all variables, then free the scopes. (ZyX)
+Files: src/eval.c
+
+Patch 7.4.041 (after 7.4.034)
+Problem: Visual selection does not remain after being copied over. (Axel
+ Bender)
+Solution: Move when VIsual_active is reset. (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.4.042
+Problem: When using ":setlocal" for 'spell' and 'spelllang' then :spelldump
+ doesn't work. (Dimitar Dimitrov)
+Solution: Copy the option variables to the new window used to show the dump.
+ (Christian Brabandt)
+Files: src/spell.c
+
+Patch 7.4.043
+Problem: VMS can't handle long function names.
+Solution: Shorten may_req_ambiguous_character_width. (Samuel Ferencik)
+Files: src/main.c, src/term.c, src/proto/term.pro
+
+
+Patch 7.4.044 (after 7.4.039)
+Problem: Can't build with old MSVC. (Wang Shoulin)
+Solution: Define OPEN_OH_ARGTYPE instead of using intptr_t directly.
+Files: src/os_mswin.c
+
+Patch 7.4.045
+Problem: substitute() does not work properly when the pattern starts with
+ "\ze".
+Solution: Detect an empty match. (Christian Brabandt)
+Files: src/eval.c, src/testdir/test80.in, src/testdir/test80.ok
+
+Patch 7.4.046
+Problem: Can't use Tcl 8.6.
+Solution: Change how Tcl_FindExecutable is called. (Jan Nijtmans)
+Files: src/if_tcl.c
+
+Patch 7.4.047
+Problem: When using input() in a function invoked by a mapping it doesn't
+ work.
+Solution: Temporarily reset ex_normal_busy. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.048
+Problem: Recent clang version complains about -fno-strength-reduce.
+Solution: Add a configure check for the clang version. (Kazunobu Kuriyama)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.049
+Problem: In Ex mode, when line numbers are enabled the substitute prompt is
+ wrong.
+Solution: Adjust for the line number size. (Benoit Pierre)
+Files: src/ex_cmds.c
+
+Patch 7.4.050
+Problem: "gn" selects too much for the pattern "\d" when there are two
+ lines with a single digit. (Ryan Carney)
+Solution: Adjust the logic of is_one_char(). (Christian Brabandt)
+Files: src/search.c, src/testdir/test53.in, src/testdir/test53.ok
+
+Patch 7.4.051
+Problem: Syntax highlighting a Yaml file causes a crash. (Blake Preston)
+Solution: Copy the pim structure before calling addstate() to avoid it
+ becoming invalid when the state list is reallocated.
+Files: src/regexp_nfa.c
+
+Patch 7.4.052
+Problem: With 'fo' set to "a2" inserting a space in the first column may
+ cause the cursor to jump to the previous line.
+Solution: Handle the case when there is no comment leader properly. (Tor
+ Perkins) Also fix that cursor is in the wrong place when spaces
+ get replaced with a Tab.
+Files: src/misc1.c, src/ops.c, src/testdir/test68.in,
+ src/testdir/test68.ok
+
+Patch 7.4.053
+Problem: Test75 has a wrong header. (ZyX)
+Solution: Fix the text and remove leading ".
+Files: src/testdir/test75.in
+
+Patch 7.4.054
+Problem: Reading past end of the 'stl' string.
+Solution: Don't increment pointer when already at the NUL. (Christian
+ Brabandt)
+Files: src/buffer.c
+
+Patch 7.4.055
+Problem: Mac: Where availability macros are defined depends on the system.
+Solution: Add a configure check. (Felix Bünemann)
+Files: src/config.h.in, src/configure.in, src/auto/configure,
+ src/os_mac.h
+
+Patch 7.4.056
+Problem: Mac: Compilation problem with OS X 10.9 Mavericks.
+Solution: Include AvailabilityMacros.h when available. (Kazunobu Kuriyama)
+Files: src/os_unix.c
+
+Patch 7.4.057
+Problem: byteidx() does not work for composing characters.
+Solution: Add byteidxcomp().
+Files: src/eval.c, src/testdir/test69.in, src/testdir/test69.ok,
+ runtime/doc/eval.txt
+
+Patch 7.4.058
+Problem: Warnings on 64 bit Windows.
+Solution: Add type casts. (Mike Williams)
+Files: src/ops.c
+
+Patch 7.4.059
+Problem: set_last_cursor() may encounter w_buffer being NULL. (Matt
+ Mkaniaris)
+Solution: Check for NULL.
+Files: src/mark.c
+
+Patch 7.4.060
+Problem: Declaration has wrong return type for PyObject_SetAttrString().
+Solution: Use int instead of PyObject. (Andreas Schwab)
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.4.061 (after 7.4.055 and 7.4.056)
+Problem: Availability macros configure check in wrong place.
+Solution: Also check when not using Darwin. Remove version check.
+Files: src/configure.in, src/auto/configure, src/os_unix.c
+
+Patch 7.4.062 (after 7.4.061)
+Problem: Configure check for AvailabilityMacros.h is wrong.
+Solution: Use AC_CHECK_HEADERS().
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.063
+Problem: Crash when using invalid key in Python dictionary.
+Solution: Check for object to be NULL. Add tests. (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.4.064
+Problem: When replacing a character in Visual block mode, entering a CR
+ does not cause a repeated line break.
+Solution: Recognize the situation and repeat the line break. (Christian
+ Brabandt)
+Files: src/normal.c, src/ops.c, src/testdir/test39.in,
+ src/testdir/test39.ok
+
+Patch 7.4.065
+Problem: When recording, the character typed at the hit-enter prompt is
+ recorded twice. (Urtica Dioica)
+Solution: Avoid recording the character twice. (Christian Brabandt)
+Files: src/message.c
+
+Patch 7.4.066
+Problem: MS-Windows: When there is a colon in the file name (sub-stream
+ feature) the swap file name is wrong.
+Solution: Change the colon to "%". (Yasuhiro Matsumoto)
+Files: src/fileio.c, src/memline.c, src/misc1.c, src/proto/misc1.pro
+
+Patch 7.4.067
+Problem: After inserting comment leader, CTRL-\ CTRL-O does move the
+ cursor. (Wiktor Ruben)
+Solution: Avoid moving the cursor. (Christian Brabandt)
+Files: src/edit.c
+
+Patch 7.4.068
+Problem: Cannot build Vim on Mac with non-Apple compilers.
+Solution: Remove the -no-cpp-precomp flag. (Misty De Meo)
+Files: src/configure.in, src/auto/configure, src/osdef.sh
+
+Patch 7.4.069
+Problem: Cannot right shift lines starting with #.
+Solution: Allow the right shift when 'cino' contains #N with N > 0.
+ (Christian Brabandt)
+ Refactor parsing 'cino', store the values in the buffer.
+Files: runtime/doc/indent.txt, src/buffer.c, src/edit.c, src/eval.c,
+ src/ex_getln.c, src/fold.c, src/misc1.c, src/ops.c,
+ src/proto/misc1.pro, src/proto/option.pro, src/structs.h,
+ src/option.c
+
+Patch 7.4.070 (after 7.4.069)
+Problem: Can't compile with tiny features. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/buffer.c
+
+Patch 7.4.071 (after 7.4.069)
+Problem: Passing limits around too often.
+Solution: Use limits from buffer.
+Files: src/edit.c, src/misc1.c, src/proto/misc1.pro
+
+Patch 7.4.072
+Problem: Crash when using Insert mode completion.
+Solution: Avoid going past the end of pum_array. (idea by Francisco Lopes)
+Files: src/popupmnu.c
+
+Patch 7.4.073
+Problem: Setting undolevels for one buffer changes undo in another.
+Solution: Make 'undolevels' a global-local option. (Christian Brabandt)
+Files: runtime/doc/options.txt, src/buffer.c, src/option.c, src/option.h
+ src/structs.h, src/undo.c
+
+Patch 7.4.074
+Problem: When undo'ing all changes and creating a new change the undo
+ structure is incorrect. (Christian Brabandt)
+Solution: When deleting the branch starting at the old header, delete the
+ whole branch, not just the first entry.
+Files: src/undo.c
+
+Patch 7.4.075
+Problem: Locally setting 'undolevels' is not tested.
+Solution: Add a test. (Christian Brabandt)
+Files: src/testdir/test100.in, src/testdir/test100.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile, src/Makefile
+
+Patch 7.4.076
+Problem: "cgn" does not wrap around the end of the file. (Dimitar Dimitrov)
+Solution: Restore 'wrapscan' earlier. (Christian Brabandt)
+Files: src/search.c
+
+Patch 7.4.077
+Problem: DOS installer creates shortcut without a path, resulting in the
+ current directory to be C:\Windows\system32.
+Solution: Use environment variables.
+Files: src/dosinst.c
+
+Patch 7.4.078
+Problem: MSVC 2013 is not supported.
+Solution: Recognize and support MSVC 2013. (Ed Brown)
+Files: src/Make_mvc.mak
+
+Patch 7.4.079
+Problem: A script cannot detect whether 'hlsearch' highlighting is actually
+ displayed.
+Solution: Add the "v:hlsearch" variable. (ZyX)
+Files: src/eval.c, src/ex_docmd.c,
+ src/option.c, src/screen.c, src/search.c, src/tag.c, src/vim.h,
+ src/testdir/test101.in, src/testdir/test101.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.080 (after 7.4.079)
+Problem: Missing documentation for v:hlsearch.
+Solution: Include the right file in the patch.
+Files: runtime/doc/eval.txt
+
+Patch 7.4.081 (after 7.4.078)
+Problem: Wrong logic when ANALYZE is "yes".
+Solution: Use or instead of and. (KF Leong)
+Files: src/Make_mvc.mak
+
+Patch 7.4.082
+Problem: Using "gf" in a changed buffer suggests adding "!", which is not
+ possible. (Tim Chase)
+Solution: Pass a flag to check_changed() whether adding ! make sense.
+Files: src/vim.h, src/ex_cmds2.c, src/proto/ex_cmds2.pro, src/globals.h,
+ src/ex_cmds.c, src/ex_docmd.c
+
+Patch 7.4.083
+Problem: It's hard to avoid adding a used pattern to the search history.
+Solution: Add the ":keeppatterns" modifier. (Christian Brabandt)
+Files: runtime/doc/cmdline.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/ex_getln.c, src/structs.h
+
+Patch 7.4.084
+Problem: Python: interrupt not being properly discarded. (Yggdroot Chen)
+Solution: Discard interrupt in VimTryEnd. (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.4.085
+Problem: When inserting text in Visual block mode and moving the cursor the
+ wrong text gets repeated in other lines.
+Solution: Use the '[ mark to find the start of the actually inserted text.
+ (Christian Brabandt)
+Files: src/ops.c, src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.4.086
+Problem: Skipping over an expression when not evaluating it does not work
+ properly for dict members.
+Solution: Skip over unrecognized expression. (ZyX)
+Files: src/eval.c, src/testdir/test34.in, src/testdir/test34.ok
+
+Patch 7.4.087
+Problem: Compiler warning on 64 bit Windows systems.
+Solution: Fix type cast. (Mike Williams)
+Files: src/ops.c
+
+Patch 7.4.088
+Problem: When spell checking is enabled Asian characters are always marked
+ as error.
+Solution: When 'spelllang' contains "cjk" do not mark Asian characters as
+ error. (Ken Takata)
+Files: runtime/doc/options.txt, runtime/doc/spell.txt, src/mbyte.c,
+ src/option.c, src/spell.c, src/structs.h
+
+Patch 7.4.089
+Problem: When editing a file in a directory mounted through sshfs Vim
+ doesn't set the security context on a renamed file.
+Solution: Add mch_copy_sec() to vim_rename(). (Peter Backes)
+Files: src/fileio.c
+
+Patch 7.4.090
+Problem: Win32: When a directory name contains an exclamation mark,
+ completion doesn't complete the contents of the directory.
+Solution: Escape the exclamation mark. (Jan Stocker)
+Files: src/ex_getln.c, src/testdir/test102.in, src/testdir/test102.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.091 (after 7.4.089)
+Problem: Missing semicolon.
+Solution: Add the semicolon.
+Files: src/fileio.c
+
+Patch 7.4.092 (after 7.4.088)
+Problem: Can't build small version.
+Solution: Add #ifdef where the b_cjk flag is used. (Ken Takata)
+Files: src/spell.c
+
+Patch 7.4.093
+Problem: Configure can't use LuaJIT on ubuntu 12.04.
+Solution: Adjust the configure regexp that locates the version number.
+ (Charles Strahan)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.094
+Problem: Configure may not find that -lint is needed for gettext().
+Solution: Check for gettext() with empty $LIBS. (Thomas De Schampheleire)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.095 (after 7.4.093)
+Problem: Regexp for LuaJIT version doesn't work on BSD.
+Solution: Use "*" instead of "\+" and "\?". (Ozaki Kiichi)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.096
+Problem: Can't change directory to an UNC path.
+Solution: Use win32_getattrs() in mch_getperm(). (Christian Brabandt)
+Files: src/os_win32.c
+
+Patch 7.4.097 (after 7.4.034)
+Problem: Unexpected behavior change related to 'virtualedit'. (Ingo Karkat)
+Solution: Update the valid cursor position. (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.4.098
+Problem: When using ":'<,'>del" errors may be given for the visual line
+ numbers being out of range.
+Solution: Reset Visual mode in ":del". (Lech Lorens)
+Files: src/ex_docmd.c, src/testdir/test103.in, src/testdir/test103.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.099
+Problem: Append in blockwise Visual mode with "$" is wrong.
+Solution: After "$" don't use the code that checks if the cursor was moved.
+ (Hirohito Higashi, Ken Takata)
+Files: src/ops.c, src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.4.100
+Problem: NFA regexp doesn't handle backreference correctly. (Ryuichi
+ Hayashida, Urtica Dioica)
+Solution: Always add NFA_SKIP, also when it already exists at the start
+ position.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.101
+Problem: Using \1 in pattern goes one line too far. (Bohr Shaw, John Little)
+Solution: Only advance the match end for the matched characters in the last
+ line.
+Files: src/regexp.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.102
+Problem: Crash when interrupting "z=".
+Solution: Add safety check for word length. (Christian Brabandt, Dominique
+ Pelle)
+Files: src/spell.c
+
+Patch 7.4.103
+Problem: Dos installer uses an old way to escape spaces in the diff
+ command.
+Solution: Adjust the quoting to the new default shellxquote. (Ben Fritz)
+Files: src/dosinst.c
+
+Patch 7.4.104
+Problem: ":help s/\_" reports an internal error. (John Beckett)
+Solution: Check for NUL and invalid character classes.
+Files: src/regexp_nfa.c
+
+Patch 7.4.105
+Problem: Completing a tag pattern may give an error for invalid pattern.
+Solution: Suppress the error, just return no matches.
+Files: src/tag.c
+
+Patch 7.4.106
+Problem: Can't build with Ruby using Cygwin.
+Solution: Fix library name in makefile. (Steve Hall)
+Files: src/Make_cyg.mak
+
+Patch 7.4.107
+Problem: Python: When vim.eval() encounters a Vim error, a try/catch in the
+ Python code doesn't catch it. (Yggdroot Chen)
+Solution: Throw exceptions on errors in vim.eval(). (ZyX)
+Files: src/ex_eval.c, src/if_py_both.h, src/proto/ex_eval.pro,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.4.108
+Problem: "zG" and "zW" leave temp files around on MS-Windows.
+Solution: Delete the temp files when exiting. (Ken Takata)
+Files: src/memline.c, src/proto/spell.pro, src/spell.c
+
+Patch 7.4.109
+Problem: ColorScheme autocommand matches with the current buffer name.
+Solution: Match with the colorscheme name. (Christian Brabandt)
+Files: runtime/doc/autocmd.txt, src/fileio.c, src/syntax.c
+
+Patch 7.4.110
+Problem: "gUgn" cannot be repeated. (Dimitar Dimitrov)
+Solution: Don't put "gn" in a different order in the redo buffer. Restore
+ 'wrapscan' when the pattern isn't found. (Christian Wellenbrock)
+Files: src/normal.c, src/search.c, src/test53.in, src/test53.ok
+
+Patch 7.4.111
+Problem: Memory leak in Python OptionsAssItem. (Ken Takata)
+Solution: Call Py_XDECREF() where needed. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.4.112
+Problem: The defaults for 'directory' and 'backupdir' on MS-Windows do not
+ include a directory that exists.
+Solution: Use $TEMP.
+Files: src/os_dos.h
+
+Patch 7.4.113
+Problem: MSVC static analysis gives warnings.
+Solution: Avoid the warnings and avoid possible bugs. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.114
+Problem: New GNU make outputs messages about changing directory in another
+ format.
+Solution: Recognize the new format.
+Files: src/option.h
+
+Patch 7.4.115
+Problem: When using Zsh expanding ~abc doesn't work when the result
+ contains a space.
+Solution: Off-by-one error in detecting the NUL. (Pavol Juhas)
+Files: src/os_unix.c
+
+Patch 7.4.116
+Problem: When a mapping starts with a space, the typed space does not show
+ up for 'showcmd'.
+Solution: Show "<20>". (Brook Hong)
+Files: src/normal.c
+
+Patch 7.4.117
+Problem: Can't build with Cygwin/MingW and Perl 5.18.
+Solution: Add a linker argument for the Perl library. (Cesar Romani)
+ Adjust CFLAGS and LIB. (Cesar Romani)
+ Move including inline.h further down. (Ken Takata)
+Files: src/Make_cyg.mak, src/Make_ming.mak, src/if_perl.xs
+
+Patch 7.4.118
+Problem: It's possible that redrawing the status lines causes
+ win_redr_custom() to be called recursively.
+Solution: Protect against recursiveness. (Yasuhiro Matsumoto)
+Files: src/screen.c
+
+Patch 7.4.119
+Problem: Vim doesn't work well on OpenVMS.
+Solution: Fix various problems. (Samuel Ferencik)
+Files: src/os_unix.c, src/os_unix.h, src/os_vms.c
+
+Patch 7.4.120 (after 7.4.117)
+Problem: Can't build with Perl 5.18 on Linux. (Lcd 47)
+Solution: Add #ifdef. (Ken Takata)
+Files: src/if_perl.xs
+
+Patch 7.4.121
+Problem: Completion doesn't work for ":py3d" and ":py3f". (Bohr Shaw)
+Solution: Skip over letters after ":py3".
+Files: src/ex_docmd.c
+
+Patch 7.4.122
+Problem: Win32: When 'encoding' is set to "utf-8" and the active codepage
+ is cp932 then ":grep" and other commands don't work for multibyte
+ characters.
+Solution: (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.4.123
+Problem: Win32: Getting user name does not use wide function.
+Solution: Use GetUserNameW() if possible. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.124
+Problem: Win32: Getting host name does not use wide function.
+Solution: Use GetComputerNameW() if possible. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.125
+Problem: Win32: Dealing with messages may not work for multibyte chars.
+Solution: Use pDispatchMessage(). (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.126
+Problem: Compiler warnings for "const" and incompatible types.
+Solution: Remove "const", add type cast. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.127
+Problem: Perl 5.18 on Unix doesn't work.
+Solution: Move workaround to after including vim.h. (Ken Takata)
+Files: src/if_perl.xs
+
+Patch 7.4.128
+Problem: Perl 5.18 for MSVC doesn't work.
+Solution: Add check in makefile and define __inline. (Ken Takata)
+Files: src/Make_mvc.mak, src/if_perl.xs
+
+Patch 7.4.129
+Problem: getline(-1) returns zero. (mvxxc)
+Solution: Return an empty string.
+Files: src/eval.c
+
+Patch 7.4.130
+Problem: Relative line numbers mix up windows when using folds.
+Solution: Use hasFoldingWin() instead of hasFolding(). (Lech Lorens)
+Files: src/misc2.c
+
+Patch 7.4.131
+Problem: Syncbind causes E315 errors in some situations. (Liang Li)
+Solution: Set and restore curbuf in ex_syncbind(). (Christian Brabandt)
+Files: src/ex_docmd.c, src/testdir/test37.ok
+
+Patch 7.4.132 (after 7.4.122)
+Problem: Win32: flags and inherit_handles arguments mixed up.
+Solution: Swap the argument. (cs86661)
+Files: src/os_win32.c
+
+Patch 7.4.133
+Problem: Clang warns for using NUL.
+Solution: Change NUL to NULL. (Dominique Pelle)
+Files: src/eval.c, src/misc2.c
+
+Patch 7.4.134
+Problem: Spurious space in MingW Makefile.
+Solution: Remove the space. (Michael Soyka)
+Files: src/Make_ming.mak
+
+Patch 7.4.135
+Problem: Missing dot in MingW test Makefile.
+Solution: Add the dot. (Michael Soyka)
+Files: src/testdir/Make_ming.mak
+
+Patch 7.4.136 (after 7.4.096)
+Problem: MS-Windows: When saving a file with a UNC path the file becomes
+ read-only.
+Solution: Don't mix up Win32 attributes and Unix attributes. (Ken Takata)
+Files: src/os_mswin.c, src/os_win32.c
+
+Patch 7.4.137
+Problem: Cannot use IME with Windows 8 console.
+Solution: Change the user of ReadConsoleInput() and PeekConsoleInput().
+ (Nobuhiro Takasaki)
+Files: src/os_win32.c
+
+Patch 7.4.138 (after 7.4.114)
+Problem: Directory change messages are not recognized.
+Solution: Fix using a character range literally. (Lech Lorens)
+Files: src/option.h
+
+Patch 7.4.139
+Problem: Crash when using :cd in autocommand. (François Ingelrest)
+Solution: Set w_localdir to NULL after freeing it. (Dominique Pelle)
+Files: src/ex_docmd.c, src/window.c
+
+Patch 7.4.140
+Problem: Crash when wiping out buffer triggers autocommand that wipes out
+ only other buffer.
+Solution: Do not delete the last buffer, make it empty. (Hirohito Higashi)
+Files: src/buffer.c
+
+Patch 7.4.141
+Problem: Problems when building with Borland: st_mode is signed short;
+ can't build with Python; temp files not ignored by Mercurial;
+ building with DEBUG doesn't define _DEBUG.
+Solution: Fix the problems. (Ken Takata)
+Files: src/Make_bc5.mak, src/if_py_both.h, src/os_win32.c
+
+Patch 7.4.142 (after 7.4.137)
+Problem: On MS-Windows 8 IME input doesn't work correctly.
+Solution: Work around the problem. (Nobuhiro Takasaki)
+Files: src/os_win32.c
+
+Patch 7.4.143
+Problem: TextChangedI is not triggered.
+Solution: Reverse check for "ready". (lilydjwg)
+Files: src/edit.c
+
+Patch 7.4.144
+Problem: MingW also supports intptr_t for OPEN_OH_ARGTYPE.
+Solution: Adjust #ifdef. (Ken Takata)
+Files: src/os_mswin.c
+
+Patch 7.4.145
+Problem: getregtype() does not return zero for unknown register.
+Solution: Adjust documentation: return empty string for unknown register.
+ Check the register name to be valid. (Yukihiro Nakadaira)
+Files: runtime/doc/eval.txt, src/ops.c
+
+Patch 7.4.146
+Problem: When starting Vim with "-u NONE" v:oldfiles is NULL.
+Solution: Set v:oldfiles to an empty list. (Yasuhiro Matsumoto)
+Files: src/main.c
+
+Patch 7.4.147
+Problem: Cursor moves to wrong position when using "gj" after "$" and
+ virtual editing is active.
+Solution: Make "gj" behave differently when virtual editing is active.
+ (Hirohito Higashi)
+Files: src/normal.c, src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.4.148
+Problem: Cannot build with Cygwin and X11.
+Solution: Include Xwindows.h instead of windows.h. (Lech Lorens)
+Files: src/mbyte.c
+
+Patch 7.4.149
+Problem: Get E685 error when assigning a function to an autoload variable.
+ (Yukihiro Nakadaira)
+Solution: Instead of having a global no_autoload variable, pass an autoload
+ flag down to where it is used. (ZyX)
+Files: src/eval.c, src/testdir/test55.in, src/testdir/test55.ok,
+ src/testdir/test60.in, src/testdir/test60.ok,
+ src/testdir/sautest/autoload/footest.vim
+
+Patch 7.4.150
+Problem: :keeppatterns is not respected for :s.
+Solution: Check the keeppatterns flag. (Yasuhiro Matsumoto)
+Files: src/search.c, src/testdir/test14.in, src/testdir/test14.ok
+
+Patch 7.4.151
+Problem: Python: slices with steps are not supported.
+Solution: Support slices in Python vim.List. (ZyX)
+Files: src/eval.c, src/if_py_both.h, src/if_python3.c, src/if_python.c,
+ src/proto/eval.pro, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.4.152
+Problem: Python: Cannot iterate over options.
+Solution: Add options iterator. (ZyX)
+Files: src/if_py_both.h, src/option.c, src/proto/option.pro,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok, src/vim.h
+
+Patch 7.4.153
+Problem: Compiler warning for pointer type.
+Solution: Add type cast.
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 7.4.154 (after 7.4.149)
+Problem: Still a problem with auto-loading.
+Solution: Pass no_autoload to deref_func_name(). (Yukihiro Nakadaira)
+Files: src/eval.c
+
+Patch 7.4.155
+Problem: ":keeppatterns /pat" does not keep search pattern offset.
+Solution: Restore the offset after doing the search.
+Files: src/search.c, src/testdir/test14.in, src/testdir/test14.ok
+
+Patch 7.4.156
+Problem: Test file missing from distribution.
+Solution: Add new directory to file list.
+Files: Filelist
+
+Patch 7.4.157
+Problem: Error number used twice. (Yukihiro Nakadaira)
+Solution: Change the one not referred in the docs.
+Files: src/undo.c
+
+Patch 7.4.158 (after 7.4.045)
+Problem: Pattern containing \zs is not handled correctly by substitute().
+Solution: Change how an empty match is skipped. (Yukihiro Nakadaira)
+Files: src/eval.c, src/testdir/test80.in, src/testdir/test80.ok
+
+Patch 7.4.159
+Problem: Completion hangs when scanning the current buffer after doing
+ keywords. (Christian Brabandt)
+Solution: Set the first match position when starting to scan the current
+ buffer.
+Files: src/edit.c
+
+Patch 7.4.160
+Problem: Win32: Crash when executing external command.
+Solution: Only close the handle when it was created. (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.4.161
+Problem: Crash in Python exception handling.
+Solution: Only use exception variables if did_throw is set. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.4.162
+Problem: Running tests in shadow dir doesn't work.
+Solution: Add testdir/sautest to the shadow target. (James McCoy)
+Files: src/Makefile
+
+Patch 7.4.163 (after 7.4.142)
+Problem: MS-Windows input doesn't work properly on Windows 7 and earlier.
+Solution: Add a check for Windows 8. (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.4.164 (after 7.4.163)
+Problem: Problem with event handling on Windows 8.
+Solution: Ignore duplicate WINDOW_BUFFER_SIZE_EVENTs. (Nobuhiro Takasaki)
+Files: src/os_win32.c
+
+Patch 7.4.165
+Problem: By default, after closing a buffer changes can't be undone.
+Solution: In the example vimrc file set 'undofile'.
+Files: runtime/vimrc_example.vim
+
+Patch 7.4.166
+Problem: Auto-loading a function for code that won't be executed.
+Solution: Do not auto-load when evaluation is off. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.167 (after 7.4.149)
+Problem: Fixes are not tested.
+Solution: Add a test for not autoloading on assignment. (Yukihiro Nakadaira)
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/sautest/autoload/Test104.vim, src/testdir/test104.in,
+ src/testdir/test104.ok
+
+Patch 7.4.168
+Problem: Can't compile with Ruby 2.1.0.
+Solution: Add support for new GC. (Kohei Suzuki)
+Files: src/if_ruby.c
+
+Patch 7.4.169
+Problem: ":sleep" puts cursor in the wrong column. (Liang Li)
+Solution: Add the window offset. (Christian Brabandt)
+Files: src/ex_docmd.c
+
+Patch 7.4.170
+Problem: Some help tags don't work with ":help". (Tim Chase)
+Solution: Add exceptions.
+Files: src/ex_cmds.c
+
+Patch 7.4.171
+Problem: Redo does not set v:count and v:count1.
+Solution: Use a separate buffer for redo, so that we can set the counts when
+ performing redo.
+Files: src/getchar.c, src/globals.h, src/normal.c, src/proto/getchar.pro,
+ src/structs.h
+
+Patch 7.4.172
+Problem: The blowfish code mentions output feedback, but the code is
+ actually doing cipher feedback.
+Solution: Adjust names and comments.
+Files: src/blowfish.c, src/fileio.c, src/proto/blowfish.pro,
+ src/memline.c
+
+Patch 7.4.173
+Problem: When using scrollbind the cursor can end up below the last line.
+ (mvxxc)
+Solution: Reset w_botfill when scrolling up. (Christian Brabandt)
+Files: src/move.c
+
+Patch 7.4.174
+Problem: Compiler warnings for Python interface. (Tony Mechelynck)
+Solution: Add type casts, initialize variable.
+Files: src/if_py_both.h
+
+Patch 7.4.175
+Problem: When a wide library function fails, falling back to the non-wide
+ function may do the wrong thing.
+Solution: Check the platform, when the wide function is supported don't fall
+ back to the non-wide function. (Ken Takata)
+Files: src/os_mswin.c, src/os_win32.c
+
+Patch 7.4.176
+Problem: Dictionary.update() throws an error when used without arguments.
+ Python programmers don't expect that.
+Solution: Make Dictionary.update() without arguments do nothing. (ZyX)
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test87.in
+
+Patch 7.4.177
+Problem: Compiler warning for unused variable. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/move.c
+
+Patch 7.4.178
+Problem: The J command does not update '[ and '] marks. (William Gardner)
+Solution: Set the marks. (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.4.179
+Problem: Warning for type-punned pointer. (Tony Mechelynck)
+Solution: Use intermediate variable.
+Files: src/if_py_both.h
+
+Patch 7.4.180 (after 7.4.174)
+Problem: Older Python versions don't support %ld.
+Solution: Use %d instead. (ZyX)
+Files: src/if_py_both.h
+
+Patch 7.4.181
+Problem: When using 'pastetoggle' the status lines are not updated. (Samuel
+ Ferencik, Jan Christoph Ebersbach)
+Solution: Update the status lines. (Nobuhiro Takasaki)
+Files: src/getchar.c
+
+Patch 7.4.182
+Problem: Building with mzscheme and racket does not work. (David Chimay)
+Solution: Adjust autoconf. (Sergey Khorev)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.183
+Problem: MSVC Visual Studio update not supported.
+Solution: Add version number. (Mike Williams)
+Files: src/Make_mvc.mak
+
+Patch 7.4.184
+Problem: match() does not work properly with a {count} argument.
+Solution: Compute the length once and update it. Quit the loop when at the
+ end. (Hirohito Higashi)
+Files: src/eval.c, src/testdir/test53.in, src/testdir/test53.ok
+
+Patch 7.4.185
+Problem: Clang gives warnings.
+Solution: Adjust how bigness is set. (Dominique Pelle)
+Files: src/ex_cmds.c
+
+Patch 7.4.186 (after 7.4.085)
+Problem: Insert in Visual mode sometimes gives incorrect results.
+ (Dominique Pelle)
+Solution: Remember the original insert start position. (Christian Brabandt,
+ Dominique Pelle)
+Files: src/edit.c, src/globals.h, src/ops.c, src/structs.h
+
+Patch 7.4.187
+Problem: Delete that crosses line break splits multibyte character.
+Solution: Advance a character instead of a byte. (Cade Foster)
+Files: src/normal.c, src/testdir/test69.in, src/testdir/test69.ok
+
+Patch 7.4.188
+Problem: SIZEOF_LONG clashes with similar defines in header files.
+Solution: Rename to a name starting with VIM_. Also for SIZEOF_INT.
+Files: src/if_ruby.c, src/vim.h, src/configure.in, src/auto/configure,
+ src/config.h.in, src/fileio.c, src/if_python.c, src/message.c,
+ src/spell.c, src/feature.h, src/os_os2_cfg.h, src/os_vms_conf.h,
+ src/os_win16.h, src/structs.h
+
+Patch 7.4.189
+Problem: Compiler warning for unused argument.
+Solution: Add UNUSED.
+Files: src/eval.c
+
+Patch 7.4.190
+Problem: Compiler warning for using %lld for off_t.
+Solution: Add type cast.
+Files: src/fileio.c
+
+Patch 7.4.191
+Problem: Escaping a file name for shell commands can't be done without a
+ function.
+Solution: Add the :S file name modifier.
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test105.in, src/testdir/test105.ok,
+ runtime/doc/cmdline.txt, runtime/doc/eval.txt,
+ runtime/doc/map.txt, runtime/doc/options.txt,
+ runtime/doc/quickfix.txt, runtime/doc/usr_30.txt,
+ runtime/doc/usr_40.txt, runtime/doc/usr_42.txt,
+ runtime/doc/vi_diff.txt, src/eval.c, src/misc2.c, src/normal.c,
+ src/proto/misc2.pro
+
+Patch 7.4.192
+Problem: Memory leak when giving E853.
+Solution: Free the argument. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.4.193
+Problem: Typos in messages.
+Solution: "then" -> "than". (Dominique Pelle)
+Files: src/if_py_both.h, src/spell.c
+
+Patch 7.4.194
+Problem: Can't build for Android.
+Solution: Add #if condition. (Fredrik Fornwall)
+Files: src/mbyte.c
+
+Patch 7.4.195 (after 7.4.193)
+Problem: Python tests fail.
+Solution: Change "then" to "than" in more places. (Dominique Pelle, Taro
+ Muraoka)
+Files: src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.4.196
+Problem: Tests fail on Solaris 9 and 10.
+Solution: Use "test -f" instead of "test -e". (Laurent Blume)
+Files: src/testdir/Makefile
+
+Patch 7.4.197
+Problem: Various problems on VMS.
+Solution: Fix several VMS problems. (Zoltan Arpadffy)
+Files: runtime/doc/os_vms.txt, src/Make_vms.mms, src/fileio.c,
+ src/os_unix.c, src/os_unix.h, src/os_vms.c, src/os_vms_conf.h,
+ src/proto/os_vms.pro, src/testdir/Make_vms.mms,
+ src/testdir/test72.in, src/testdir/test77a.com,
+ src/testdir/test77a.in, src/testdir/test77a.ok src/undo.c
+
+Patch 7.4.198
+Problem: Can't build Vim with Perl when -Dusethreads is not specified for
+ building Perl, and building Vim with --enable-perlinterp=dynamic.
+Solution: Adjust #ifdefs. (Yasuhiro Matsumoto)
+Files: src/if_perl.xs
+
+Patch 7.4.199
+Problem: (issue 197) ]P doesn't paste over Visual selection.
+Solution: Handle Visual mode specifically. (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.4.200
+Problem: Too many #ifdefs in the code.
+Solution: Enable FEAT_VISUAL always, await any complaints
+Files: src/feature.h
+
+Patch 7.4.201
+Problem: 'lispwords' is a global option.
+Solution: Make 'lispwords' global-local. (Sung Pae)
+Files: runtime/doc/options.txt, runtime/optwin.vim, src/buffer.c,
+ src/misc1.c, src/option.c, src/option.h, src/structs.h,
+ src/testdir/test100.in, src/testdir/test100.ok
+
+Patch 7.4.202
+Problem: MS-Windows: non-ASCII font names don't work.
+Solution: Convert between the current code page and 'encoding'. (Ken Takata)
+Files: src/gui_w48.c, src/os_mswin.c, src/proto/winclip.pro,
+ src/winclip.c
+
+Patch 7.4.203
+Problem: Parsing 'errorformat' is not correct.
+Solution: Reset "multiignore" at the start of a multi-line message. (Lcd)
+Files: src/quickfix.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test106.in,
+ src/testdir/test106.ok
+
+Patch 7.4.204
+Problem: A mapping where the second byte is 0x80 doesn't work.
+Solution: Unescape before checking for incomplete multibyte char. (Nobuhiro
+ Takasaki)
+Files: src/getchar.c, src/testdir/test75.in, src/testdir/test75.ok
+
+Patch 7.4.205
+Problem: ":mksession" writes command to move to second argument while it
+ does not exist. When it does exist the order might be wrong.
+Solution: Use ":argadd" for each argument instead of using ":args" with a
+ list of names. (Nobuhiro Takasaki)
+Files: src/ex_docmd.c
+
+Patch 7.4.206
+Problem: Compiler warnings on 64 bit Windows.
+Solution: Add type casts. (Mike Williams)
+Files: src/gui_w48.c, src/os_mswin.c
+
+Patch 7.4.207
+Problem: The cursor report sequence is sometimes not recognized and results
+ in entering replace mode.
+Solution: Also check for the cursor report when not asked for.
+Files: src/term.c
+
+Patch 7.4.208
+Problem: Mercurial picks up some files that are not distributed.
+Solution: Add patterns to the ignore list. (Cade Forester)
+Files: .hgignore
+
+Patch 7.4.209
+Problem: When repeating a filter command "%" and "#" are expanded.
+Solution: Escape the command when storing for redo. (Christian Brabandt)
+Files: src/ex_cmds.c
+
+Patch 7.4.210
+Problem: Visual block mode plus virtual edit doesn't work well with tabs.
+ (Liang Li)
+Solution: Take coladd into account. (Christian Brabandt)
+Files: src/ops.c, src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.4.211
+Problem: ":lu" is an abbreviation for ":lua", but it should be ":lunmap".
+ (ZyX)
+Solution: Move "lunmap" to above "lua".
+Files: src/ex_cmds.h
+
+Patch 7.4.212 (after 7.4.200)
+Problem: Now that the +visual feature is always enabled the #ifdefs for it
+ are not useful.
+Solution: Remove the checks for FEAT_VISUAL.
+Files: src/buffer.c, src/charset.c, src/edit.c, src/eval.c,
+ src/ex_cmds.c, src/ex_docmd.c, src/fold.c, src/getchar.c,
+ src/gui.c, src/gui_mac.c, src/gui_w48.c, src/main.c, src/mark.c,
+ src/menu.c, src/misc2.c, src/move.c, src/netbeans.c, src/normal.c,
+ src/ops.c, src/option.c, src/os_msdos.c, src/os_qnx.c,
+ src/quickfix.c, src/regexp.c, src/regexp_nfa.c, src/screen.c,
+ src/search.c, src/spell.c, src/syntax.c, src/term.c, src/ui.c,
+ src/undo.c, src/version.c, src/window.c, src/feature.h,
+ src/globals.h, src/option.h, src/os_win32.h, src/structs.h
+
+Patch 7.4.213
+Problem: It's not possible to open a new buffer without creating a swap
+ file.
+Solution: Add the ":noswapfile" modifier. (Christian Brabandt)
+Files: runtime/doc/recover.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/memline.c, src/structs.h
+
+Patch 7.4.214
+Problem: Compilation problems on HP_nonStop (Tandem).
+Solution: Add #defines. (Joachim Schmitz)
+Files: src/vim.h
+
+Patch 7.4.215
+Problem: Inconsistency: ":sp foo" does not reload "foo", unless "foo" is
+ the current buffer. (Liang Li)
+Solution: Do not reload the current buffer on a split command.
+Files: runtime/doc/windows.txt, src/ex_docmd.c
+
+Patch 7.4.216
+Problem: Compiler warnings. (Tony Mechelynck)
+Solution: Initialize variables, add #ifdef.
+Files: src/term.c, src/os_unix.h
+
+Patch 7.4.217
+Problem: When src/auto/configure was updated, "make clean" would run
+ configure pointlessly.
+Solution: Do not run configure for "make clean" and "make distclean" when
+ the make program supports $MAKECMDGOALS. (Ken Takata)
+Files: src/Makefile
+
+Patch 7.4.218
+Problem: It's not easy to remove duplicates from a list.
+Solution: Add the uniq() function. (Lcd)
+Files: runtime/doc/change.txt, runtime/doc/eval.txt,
+ runtime/doc/usr_41.txt, runtime/doc/version7.txt, src/eval.c,
+ src/testdir/test55.in, src/testdir/test55.ok
+
+Patch 7.4.219
+Problem: When 'relativenumber' or 'cursorline' are set the window is
+ redrawn much too often. (Patrick Hemmer, Dominique Pelle)
+Solution: Check the VALID_CROW flag instead of VALID_WROW.
+Files: src/move.c
+
+Patch 7.4.220
+Problem: Test 105 does not work in a shadow dir. (James McCoy)
+Solution: Omit "src/" from the checked path.
+Files: src/testdir/test105.in, src/testdir/test105.ok
+
+Patch 7.4.221
+Problem: Quickfix doesn't resize on ":copen 20". (issue 199)
+Solution: Resize the window when requested. (Christian Brabandt)
+Files: src/quickfix.c
+
+Patch 7.4.222
+Problem: The Ruby directory is constructed from parts.
+Solution: Use 'rubyarchhdrdir' if it exists. (James McCoy)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.223
+Problem: Still using an older autoconf version.
+Solution: Switch to autoconf 2.69.
+Files: src/Makefile, src/configure.in, src/auto/configure
+
+Patch 7.4.224
+Problem: /usr/bin/grep on Solaris does not support -F.
+Solution: Add configure check to find a good grep. (Danek Duvall)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.225
+Problem: Dynamic Ruby doesn't work on Solaris.
+Solution: Always use the stubs. (Danek Duvall, Yukihiro Nakadaira)
+Files: src/if_ruby.c
+
+Patch 7.4.226 (after 7.4.219)
+Problem: Cursorline highlighting not redrawn when scrolling. (John
+ Marriott)
+Solution: Check for required redraw in two places.
+Files: src/move.c
+
+Patch 7.4.227 (after 7.4.225)
+Problem: Can't build with Ruby 1.8.
+Solution: Do include a check for the Ruby version. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 7.4.228
+Problem: Compiler warnings when building with Python 3.2.
+Solution: Make type cast depend on Python version. (Ken Takata)
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 7.4.229
+Problem: Using ":let" for listing variables and the second one is a curly
+ braces expression may fail.
+Solution: Check for an "=" in a better way. (ZyX)
+Files: src/eval.c, src/testdir/test104.in, src/testdir/test104.ok
+
+Patch 7.4.230
+Problem: Error when using ":options".
+Solution: Fix the entry for 'lispwords'. (Kenichi Ito)
+Files: runtime/optwin.vim
+
+Patch 7.4.231
+Problem: An error in ":options" is not caught by the tests.
+Solution: Add a test for ":options". Set $VIMRUNTIME for the tests so that
+ it uses the current runtime files instead of the installed ones.
+Files: src/Makefile, src/testdir/Makefile, src/testdir/test_options.in,
+ src/testdir/test_options.ok, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.4.232
+Problem: ":%s/\n//" uses a lot of memory. (Aidan Marlin)
+Solution: Turn this into a join command. (Christian Brabandt)
+Files: src/ex_cmds.c, src/ex_docmd.c, src/proto/ex_docmd.pro
+
+Patch 7.4.233
+Problem: Escaping special characters for using "%" with a shell command is
+ inconsistent, parentheses are escaped but spaces are not.
+Solution: Only escape "!". (Gary Johnson)
+Files: src/ex_docmd.c
+
+Patch 7.4.234
+Problem: Can't get the command that was used to start Vim.
+Solution: Add v:progpath. (Viktor Kojouharov)
+Files: runtime/doc/eval.txt, src/eval.c, src/main.c, src/vim.h
+
+Patch 7.4.235
+Problem: It is not easy to get the full path of a command.
+Solution: Add the exepath() function.
+Files: src/eval.c, src/misc1.c, src/os_amiga.c, src/os_msdos.c,
+ src/os_unix.c, src/os_vms.c, src/os_win32.c,
+ src/proto/os_amiga.pro, src/proto/os_msdos.pro,
+ src/proto/os_unix.pro, src/proto/os_win32.pro,
+ runtime/doc/eval.txt
+
+Patch 7.4.236
+Problem: It's not that easy to check the Vim patch version.
+Solution: Make has("patch-7.4.123") work. (partly by Marc Weber)
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test60.in,
+ src/testdir/test60.ok
+
+Patch 7.4.237 (after 7.4.236)
+Problem: When some patches were not included has("patch-7.4.123") may return
+ true falsely.
+Solution: Check for the specific patch number.
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.4.238
+Problem: Vim does not support the smack library.
+Solution: Add smack support (Jose Bollo)
+Files: src/config.h.in, src/configure.in, src/fileio.c, src/memfile.c,
+ src/os_unix.c, src/undo.c, src/auto/configure
+
+Patch 7.4.239
+Problem: ":e +" does not position cursor at end of the file.
+Solution: Check for "+" being the last character (ZyX)
+Files: src/ex_docmd.c
+
+Patch 7.4.240
+Problem: ":tjump" shows "\n" as "\\n".
+Solution: Skip over "\" that escapes a backslash. (Gary Johnson)
+Files: src/tag.c
+
+Patch 7.4.241
+Problem: The string returned by submatch() does not distinguish between a
+ NL from a line break and a NL that stands for a NUL character.
+Solution: Add a second argument to return a list. (ZyX)
+Files: runtime/doc/eval.txt, src/eval.c, src/proto/regexp.pro,
+ src/regexp.c, src/testdir/test79.in, src/testdir/test79.ok,
+ src/testdir/test80.in, src/testdir/test80.ok
+
+Patch 7.4.242
+Problem: getreg() does not distinguish between a NL used for a line break
+ and a NL used for a NUL character.
+Solution: Add another argument to return a list. (ZyX)
+Files: runtime/doc/eval.txt, src/eval.c src/ops.c, src/proto/ops.pro,
+ src/vim.h, src/Makefile, src/testdir/test_eval.in,
+ src/testdir/test_eval.ok, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms
+
+Patch 7.4.243
+Problem: Cannot use setreg() to add text that includes a NUL.
+Solution: Make setreg() accept a list.
+Files: runtime/doc/eval.txt, src/eval.c, src/ops.c, src/proto/ops.pro,
+ src/testdir/test_eval.in, src/testdir/test_eval.ok
+
+Patch 7.4.244 (after 7.4.238)
+Problem: The smack feature causes stray error messages.
+Solution: Remove the error messages.
+Files: src/os_unix.c
+
+Patch 7.4.245
+Problem: Crash for "vim -u NONE -N -c '&&'".
+Solution: Check for the pattern to be NULL. (Dominique Pelle)
+Files: src/ex_cmds.c
+
+Patch 7.4.246
+Problem: Configure message for detecting smack are out of sequence.
+Solution: Put the messages in the right place. (Kazunobu Kuriyama)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.247
+Problem: When passing input to system() there is no way to keep NUL and
+ NL characters separate.
+Solution: Optionally use a list for the system() input. (ZyX)
+Files: runtime/doc/eval.txt, src/eval.c
+
+Patch 7.4.248
+Problem: Cannot distinguish between NL and NUL in output of system().
+Solution: Add systemlist(). (ZyX)
+Files: runtime/doc/eval.txt, src/eval.c, src/ex_cmds2.c, src/misc1.c,
+ src/proto/misc1.pro
+
+Patch 7.4.249
+Problem: Using setreg() with a list of numbers does not work.
+Solution: Use a separate buffer for numbers. (ZyX)
+Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok
+
+Patch 7.4.250
+Problem: Some test files missing from distribution.
+Solution: Add pattern for newly added tests.
+Files: Filelist
+
+Patch 7.4.251
+Problem: Crash when BufAdd autocommand wipes out the buffer.
+Solution: Check for buffer to still be valid. Postpone freeing the buffer
+ structure. (Hirohito Higashi)
+Files: src/buffer.c, src/ex_cmds.c, src/fileio.c, src/globals.h
+
+Patch 7.4.252
+Problem: Critical error in GTK, removing timer twice.
+Solution: Clear the timer after removing it. (James McCoy)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.253
+Problem: Crash when using cpp syntax file with pattern using external
+ match. (Havard Garnes)
+Solution: Discard match when end column is before start column.
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.4.254
+Problem: Smack support detection is incomplete.
+Solution: Check for attr/xattr.h and specific macro.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.255
+Problem: Configure check for smack doesn't work with all shells. (David
+ Larson)
+Solution: Remove spaces in set command.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.256 (after 7.4.248)
+Problem: Using systemlist() may cause a crash and does not handle NUL
+ characters properly.
+Solution: Increase the reference count, allocate memory by length. (Yasuhiro
+ Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.257
+Problem: Compiler warning, possibly for mismatch in parameter name.
+Solution: Rename the parameter in the declaration.
+Files: src/ops.c
+
+Patch 7.4.258
+Problem: Configure fails if $CC contains options.
+Solution: Remove quotes around $CC. (Paul Barker)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.259
+Problem: Warning for misplaced "const".
+Solution: Move the "const". (Yukihiro Nakadaira)
+Files: src/os_unix.c
+
+Patch 7.4.260
+Problem: It is possible to define a function with a colon in the name. It
+ is possible to define a function with a lower case character if a
+ "#" appears after the name.
+Solution: Disallow using a colon other than with "s:". Ignore "#" after the
+ name.
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_eval.in,
+ src/testdir/test_eval.ok
+
+Patch 7.4.261
+Problem: When updating the window involves a regexp pattern, an interactive
+ substitute to replace a "\n" with a line break fails. (Ingo
+ Karkat)
+Solution: Set reg_line_lbr in vim_regsub() and vim_regsub_multi().
+Files: src/regexp.c, src/testdir/test79.in, src/testdir/test79.ok
+
+Patch 7.4.262
+Problem: Duplicate code in regexec().
+Solution: Add line_lbr flag to regexec_nl().
+Files: src/regexp.c, src/regexp_nfa.c, src/regexp.h
+
+Patch 7.4.263
+Problem: GCC 4.8 compiler warning for hiding a declaration (François Gannaz)
+Solution: Remove the second declaration.
+Files: src/eval.c
+
+Patch 7.4.264 (after 7.4.260)
+Problem: Can't define a function starting with "g:". Can't assign a
+ funcref to a buffer-local variable.
+Solution: Skip "g:" at the start of a function name. Don't check for colons
+ when assigning to a variable.
+Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok
+
+Patch 7.4.265 (after 7.4.260)
+Problem: Can't call a global function with "g:" in an expression.
+Solution: Skip the "g:" when looking up the function.
+Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok
+
+Patch 7.4.266
+Problem: Test 62 fails.
+Solution: Set the language to C. (Christian Brabandt)
+Files: src/testdir/test62.in
+
+Patch 7.4.267 (after 7.4.178)
+Problem: The '[ mark is in the wrong position after "gq". (Ingo Karkat)
+Solution: Add the setmark argument to do_join(). (Christian Brabandt)
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_autoformat_join.in,
+ src/testdir/test_autoformat_join.ok, src/Makefile, src/edit.c,
+ src/ex_cmds.c, src/ex_docmd.c, src/normal.c, src/ops.c,
+ src/proto/ops.pro
+
+Patch 7.4.268
+Problem: Using exists() on a funcref for a script-local function does not
+ work.
+Solution: Translate <SNR> to the special byte sequence. Add a test.
+Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok,
+ src/testdir/test_eval_func.vim, Filelist
+
+Patch 7.4.269
+Problem: CTRL-U in Insert mode does not work after using a cursor key.
+ (Pine Wu)
+Solution: Use the original insert start position. (Christian Brabandt)
+Files: src/edit.c, src/testdir/test29.in, src/testdir/test29.ok
+
+Patch 7.4.270
+Problem: Comparing pointers instead of the string they point to.
+Solution: Use strcmp(). (Ken Takata)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.271
+Problem: Compiler warning on 64 bit windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/ops.c
+
+Patch 7.4.272
+Problem: Using just "$" does not cause an error message.
+Solution: Check for empty environment variable name. (Christian Brabandt)
+Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok
+
+Patch 7.4.273
+Problem: "make autoconf" and "make reconfig" may first run configure and
+ then remove the output.
+Solution: Add these targets to the exceptions. (Ken Takata)
+Files: src/Makefile
+
+Patch 7.4.274
+Problem: When doing ":update" just before running an external command that
+ changes the file, the timestamp may be unchanged and the file
+ is not reloaded.
+Solution: Also check the file size.
+Files: src/fileio.c
+
+Patch 7.4.275
+Problem: When changing the type of a sign that hasn't been placed there is
+ no error message.
+Solution: Add an error message. (Christian Brabandt)
+Files: src/ex_cmds.c
+
+Patch 7.4.276
+Problem: The fish shell is not supported.
+Solution: Use begin/end instead of () for fish. (Andy Russell)
+Files: src/ex_cmds.c, src/misc1.c, src/option.c, src/proto/misc1.pro
+
+Patch 7.4.277
+Problem: Using ":sign unplace *" may leave the cursor in the wrong position
+ (Christian Brabandt)
+Solution: Update the cursor position when removing all signs.
+Files: src/buffer.c
+
+Patch 7.4.278
+Problem: list_remove() conflicts with function defined in Sun header file.
+Solution: Rename the function. (Richard Palo)
+Files: src/eval.c, src/if_lua.c, src/if_py_both.h, src/proto/eval.pro
+
+Patch 7.4.279
+Problem: globpath() returns a string, making it difficult to get a list of
+ matches. (Greg Novack)
+Solution: Add an optional argument like with glob(). (Adnan Zafar)
+Files: runtime/doc/eval.txt, src/eval.c, src/ex_getln.c, src/misc1.c,
+ src/misc2.c, src/proto/ex_getln.pro, src/proto/misc2.pro,
+ src/testdir/test97.in, src/testdir/test97.ok
+
+Patch 7.4.280
+Problem: When using a session file the relative position of the cursor is
+ not restored if there is another tab. (Nobuhiro Takasaki)
+Solution: Update w_wrow before calculating the fraction.
+Files: src/window.c
+
+Patch 7.4.281
+Problem: When a session file has more than one tabpage and 'showtabline' is
+ one the positions may be slightly off.
+Solution: Set 'showtabline' to two while positioning windows.
+Files: src/ex_docmd.c
+
+Patch 7.4.282 (after 7.4.279)
+Problem: Test 97 fails on Mac.
+Solution: Do not ignore case in file names. (Jun Takimoto)
+Files: src/testdir/test97.in
+
+Patch 7.4.283 (after 7.4.276)
+Problem: Compiler warning about unused variable. (Charles Cooper)
+Solution: Move the variable inside the #if block.
+Files: src/ex_cmds.c
+
+Patch 7.4.284
+Problem: Setting 'langmap' in the modeline can cause trouble. E.g. mapping
+ ":" breaks many commands. (Jens-Wolfhard Schicke-Uffmann)
+Solution: Disallow setting 'langmap' from the modeline.
+Files: src/option.c
+
+Patch 7.4.285
+Problem: When 'relativenumber' is set and deleting lines or undoing that,
+ line numbers are not always updated. (Robert Arkwright)
+Solution: (Christian Brabandt)
+Files: src/misc1.c
+
+Patch 7.4.286
+Problem: Error messages are inconsistent. (ZyX)
+Solution: Change "Lists" to "list".
+Files: src/eval.c
+
+Patch 7.4.287
+Problem: Patches for .hgignore don't work, since the file is not in the
+ distribution.
+Solution: Add .hgignore to the distribution. Will be effective with the
+ next version.
+Files: Filelist
+
+Patch 7.4.288
+Problem: When 'spellfile' is set the screen is not redrawn.
+Solution: Redraw when updating the spelling info. (Christian Brabandt)
+Files: src/spell.c
+
+Patch 7.4.289
+Problem: Pattern with repeated backreference does not match with new regexp
+ engine. (Urtica Dioica)
+Solution: Also check the end of a submatch when deciding to put a state in
+ the state list.
+Files: src/testdir/test64.in, src/testdir/test64.ok, src/regexp_nfa.c
+
+Patch 7.4.290
+Problem: A non-greedy match followed by a branch is too greedy. (Ingo
+ Karkat)
+Solution: Add NFA_MATCH when it is already in the state list if the position
+ differs.
+Files: src/testdir/test64.in, src/testdir/test64.ok, src/regexp_nfa.c
+
+Patch 7.4.291
+Problem: Compiler warning for int to pointer of different size when DEBUG
+ is defined.
+Solution: use smsg() instead of EMSG3().
+Files: src/regexp.c
+
+Patch 7.4.292
+Problem: Searching for "a" does not match accented "a" with new regexp
+ engine, does match with old engine. (David Bürgin)
+ "ca" does not match "ca" with accented "a" with either engine.
+Solution: Change the old engine, check for following composing character
+ also for single-byte patterns.
+Files: src/regexp.c, src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.4.293
+Problem: It is not possible to ignore composing characters at a specific
+ point in a pattern.
+Solution: Add the %C item.
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test95.in,
+ src/testdir/test95.ok, runtime/doc/pattern.txt
+
+Patch 7.4.294 (7.4.293)
+Problem: Test files missing from patch.
+Solution: Patch the test files.
+Files: src/testdir/test95.in, src/testdir/test95.ok
+
+Patch 7.4.295
+Problem: Various typos, bad white space and unclear comments.
+Solution: Fix typos. Improve white space. Update comments.
+Files: src/testdir/test49.in, src/macros.h, src/screen.c, src/structs.h,
+ src/gui_gtk_x11.c, src/os_unix.c
+
+Patch 7.4.296
+Problem: Can't run tests on Solaris.
+Solution: Change the way VIMRUNTIME is set. (Laurent Blume)
+Files: src/testdir/Makefile
+
+Patch 7.4.297
+Problem: Memory leak from result of get_isolated_shell_name().
+Solution: Free the memory. (Dominique Pelle)
+Files: src/ex_cmds.c, src/misc1.c
+
+Patch 7.4.298
+Problem: Can't have a funcref start with "t:".
+Solution: Add "t" to the list of accepted names. (Yukihiro Nakadaira)
+Files: src/eval.c
+
+Patch 7.4.299
+Problem: When running configure twice DYNAMIC_PYTHON_DLL may become empty.
+Solution: Use AC_CACHE_VAL. (Ken Takata)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.300
+Problem: The way config.cache is removed doesn't always work.
+Solution: Always remove config.cache. (Ken Takata)
+Files: src/Makefile
+
+Patch 7.4.301 (after 7.4.280)
+Problem: Still a scrolling problem when loading a session file.
+Solution: Fix off-by-one mistake. (Nobuhiro Takasaki)
+Files: src/window.c
+
+Patch 7.4.302
+Problem: Signs placed with 'foldcolumn' set don't show up after filler
+ lines.
+Solution: Take filler lines into account. (Olaf Dabrunz)
+Files: src/screen.c
+
+Patch 7.4.303
+Problem: When using double-width characters the text displayed on the
+ command line is sometimes truncated.
+Solution: Reset the string length. (Nobuhiro Takasaki)
+Files: src/screen.c
+
+Patch 7.4.304
+Problem: Cannot always use Python with Vim.
+Solution: Add the manifest to the executable. (Jacques Germishuys)
+Files: src/Make_mvc.mak
+
+Patch 7.4.305
+Problem: Making 'ttymouse' empty after the xterm version was requested
+ causes problems. (Elijah Griffin)
+Solution: Do not check for DEC mouse sequences when the xterm version was
+ requested. Also don't request the xterm version when DEC mouse
+ was enabled.
+Files: src/term.c, src/os_unix.c, src/proto/term.pro, src/globals.h
+
+Patch 7.4.306
+Problem: getchar(0) does not return Esc.
+Solution: Do not wait for an Esc sequence to be complete. (Yasuhiro
+ Matsumoto)
+Files: src/eval.c, src/getchar.c
+
+Patch 7.4.307 (after 7.4.305)
+Problem: Can't build without the +termresponse feature.
+Solution: Add proper #ifdefs.
+Files: src/os_unix.c, src/term.c
+
+Patch 7.4.308
+Problem: When using ":diffsplit" on an empty file the cursor is displayed
+ on the command line.
+Solution: Limit the value of w_topfill.
+Files: src/diff.c
+
+Patch 7.4.309
+Problem: When increasing the size of the lower window, the upper window
+ jumps back to the top. (Ron Aaron)
+Solution: Change setting the topline. (Nobuhiro Takasaki)
+Files: src/window.c
+
+Patch 7.4.310
+Problem: getpos()/setpos() don't include curswant.
+Solution: Add a fifth number when getting/setting the cursor.
+Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok,
+ runtime/doc/eval.txt
+
+Patch 7.4.311
+Problem: Can't use winrestview to only restore part of the view.
+Solution: Handle missing items in the dict. (Christian Brabandt)
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 7.4.312
+Problem: Cannot figure out what argument list is being used for a window.
+Solution: Add the arglistid() function. (Marcin Szamotulski)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/eval.c,
+ src/ex_docmd.c, src/globals.h, src/structs.h, src/main.c
+
+Patch 7.4.313 (after 7.4.310)
+Problem: Changing the return value of getpos() causes an error. (Jie Zhu)
+Solution: Revert getpos() and add getcurpos().
+Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok,
+ runtime/doc/eval.txt
+
+Patch 7.4.314
+Problem: Completion messages can get in the way of a plugin.
+Solution: Add 'c' flag to 'shortmess' option. (Shougo Matsu)
+Files: runtime/doc/options.txt, src/edit.c, src/option.h, src/screen.c
+
+Patch 7.4.315 (after 7.4.309)
+Problem: Fixes for computation of topline not tested.
+Solution: Add test. (Hirohito Higashi)
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test107.in, src/testdir/test107.ok
+
+Patch 7.4.316
+Problem: Warning from 64-bit compiler.
+Solution: Add type cast. (Mike Williams)
+Files: src/ex_getln.c
+
+Patch 7.4.317
+Problem: Crash when starting gvim. Issue 230.
+Solution: Check for a pointer to be NULL. (Christian Brabandt)
+Files: src/window.c
+
+Patch 7.4.318
+Problem: Check for whether a highlight group has settings ignores fg and bg
+ color settings.
+Solution: Also check cterm and GUI color settings. (Christian Brabandt)
+Files: src/syntax.c
+
+Patch 7.4.319
+Problem: Crash when putting zero bytes on the clipboard.
+Solution: Do not support the utf8_atom target when not using a Unicode
+ encoding. (Naofumi Honda)
+Files: src/ui.c
+
+Patch 7.4.320
+Problem: Possible crash when an BufLeave autocommand deletes the buffer.
+Solution: Check for the window pointer being valid. Postpone freeing the
+ window until autocommands are done. (Yasuhiro Matsumoto)
+Files: src/buffer.c, src/fileio.c, src/globals.h, src/window.c
+
+Patch 7.4.321
+Problem: Can't build with strawberry perl 5.20 + mingw-w64-4.9.0.
+Solution: Define save_strlen. (Ken Takata)
+Files: src/if_perl.xs
+
+Patch 7.4.322
+Problem: Using "msgfmt" is hard coded, cannot use "gmsgfmt".
+Solution: Use the msgfmt command found by configure. (Danek Duvall)
+Files: src/config.mk.in, src/po/Makefile
+
+Patch 7.4.323
+Problem: substitute() with zero width pattern breaks multibyte character.
+Solution: Take multibyte character size into account. (Yukihiro Nakadaira)
+Files: src/eval.c src/testdir/test69.in, src/testdir/test69.ok
+
+Patch 7.4.324
+Problem: In Ex mode, cyrillic characters are not handled. (Stas Malavin)
+Solution: Support multibyte characters in Ex mode. (Yukihiro Nakadaira)
+Files: src/ex_getln.c
+
+Patch 7.4.325
+Problem: When starting the gui and changing the window size the status line
+ may not be drawn correctly.
+Solution: Catch new_win_height() being called recursively. (Christian
+ Brabandt)
+Files: src/window.c
+
+Patch 7.4.326
+Problem: Can't build Tiny version. (Elimar Riesebieter)
+Solution: Add #ifdef.
+Files: src/window.c
+
+Patch 7.4.327
+Problem: When 'verbose' is set to display the return value of a function,
+ may get E724 repeatedly.
+Solution: Do not give an error for verbose messages. Abort conversion to
+ string after an error.
+Files: src/eval.c
+
+Patch 7.4.328
+Problem: Selection of inner block is inconsistent.
+Solution: Skip indent not only for '}' but all parens. (Tom McDonald)
+Files: src/search.c
+
+Patch 7.4.329
+Problem: When moving the cursor and then switching to another window the
+ previous window isn't scrolled. (Yukihiro Nakadaira)
+Solution: Call update_topline() before leaving the window. (Christian
+ Brabandt)
+Files: src/window.c
+
+Patch 7.4.330
+Problem: Using a regexp pattern to highlight a specific position can be
+ slow.
+Solution: Add matchaddpos() to highlight specific positions efficiently.
+ (Alexey Radkov)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt,
+ runtime/plugin/matchparen.vim, src/eval.c, src/ex_docmd.c,
+ src/proto/window.pro, src/screen.c, src/structs.h,
+ src/testdir/test63.in, src/testdir/test63.ok, src/window.c
+
+Patch 7.4.331
+Problem: Relative numbering not updated after a linewise yank. Issue 235.
+Solution: Redraw after the yank. (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.4.332
+Problem: GTK: When a sign icon doesn't fit exactly there can be ugly gaps.
+Solution: Scale the sign to fit when the aspect ratio is not too far off.
+ (Christian Brabandt)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.333
+Problem: Compiler warning for unused function.
+Solution: Put the function inside the #ifdef.
+Files: src/screen.c
+
+Patch 7.4.334 (after 7.4.330)
+Problem: Uninitialized variables, causing some problems.
+Solution: Initialize the variables. (Dominique Pelle)
+Files: src/screen.c, src/window.c
+
+Patch 7.4.335
+Problem: No digraph for the new rouble sign.
+Solution: Add the digraphs =R and =P.
+Files: src/digraph.c, runtime/doc/digraph.txt
+
+Patch 7.4.336
+Problem: Setting 'history' to a big value causes out-of-memory errors.
+Solution: Limit the value to 10000. (Hirohito Higashi)
+Files: runtime/doc/options.txt, src/option.c
+
+Patch 7.4.337
+Problem: When there is an error preparing to edit the command line, the
+ command won't be executed. (Hirohito Higashi)
+Solution: Reset did_emsg before editing.
+Files: src/ex_getln.c
+
+Patch 7.4.338
+Problem: Cannot wrap lines taking indent into account.
+Solution: Add the 'breakindent' option. (many authors, final improvements by
+ Christian Brabandt)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt, runtime/optwin.vim,
+ src/buffer.c, src/charset.c, src/edit.c, src/ex_getln.c,
+ src/getchar.c, src/misc1.c, src/misc2.c, src/ops.c, src/option.c,
+ src/option.h, src/proto/charset.pro, src/proto/misc1.pro,
+ src/proto/option.pro, src/screen.c, src/structs.h,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_breakindent.in, src/testdir/test_breakindent.ok,
+ src/ui.c, src/version.c
+
+Patch 7.4.339
+Problem: Local function is available globally.
+Solution: Add "static".
+Files: src/option.c, src/proto/option.pro
+
+Patch 7.4.340
+Problem: Error from sed about illegal bytes when installing Vim.
+Solution: Prepend LC_ALL=C. (Itchyny)
+Files: src/installman.sh
+
+Patch 7.4.341
+Problem: sort() doesn't handle numbers well.
+Solution: Add an argument to specify sorting on numbers. (Christian Brabandt)
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test55.in,
+ src/testdir/test55.ok
+
+Patch 7.4.342
+Problem: Clang gives warnings.
+Solution: Add an else block. (Dominique Pelle)
+Files: src/gui_beval.c
+
+Patch 7.4.343
+Problem: matchdelete() does not always update the right lines.
+Solution: Fix off-by-one error. (Ozaki Kiichi)
+Files: src/window.c
+
+Patch 7.4.344
+Problem: Unnecessary initializations and other things related to
+ matchaddpos().
+Solution: Code cleanup. (Alexey Radkov)
+Files: runtime/doc/eval.txt, src/screen.c, src/window.c
+
+Patch 7.4.345 (after 7.4.338)
+Problem: Indent is not updated when deleting indent.
+Solution: Remember changedtick.
+Files: src/misc1.c
+
+Patch 7.4.346 (after 7.4.338)
+Problem: Indent is not updated when changing 'breakindentopt'. (itchyny)
+Solution: Do not cache "brishift". (Christian Brabandt)
+Files: src/misc1.c
+
+Patch 7.4.347
+Problem: test55 fails on some systems.
+Solution: Remove the elements that all result in zero and can end up in an
+ arbitrary position.
+Files: src/testdir/test55.in, src/testdir/test55.ok
+
+Patch 7.4.348
+Problem: When using "J1" in 'cinoptions' a line below a continuation line
+ gets too much indent.
+Solution: Fix parentheses in condition.
+Files: src/misc1.c
+
+Patch 7.4.349
+Problem: When there are matches to highlight the whole window is redrawn,
+ which is slow.
+Solution: Only redraw everything when lines were inserted or deleted.
+ Reset b_mod_xlines when needed. (Alexey Radkov)
+Files: src/screen.c, src/window.c
+
+Patch 7.4.350
+Problem: Using C indenting for Javascript does not work well for a {} block
+ inside parentheses.
+Solution: When looking for a matching paren ignore one that is before the
+ start of a {} block.
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.4.351
+Problem: sort() is not stable.
+Solution: When the items are identical, compare the pointers.
+Files: src/eval.c, src/testdir/test55.in, src/testdir/test55.ok
+
+Patch 7.4.352
+Problem: With 'linebreak' a tab causes a missing line break.
+Solution: Count a tab for what it's worth also for shorter lines.
+ (Christian Brabandt)
+Files: src/charset.c
+
+Patch 7.4.353
+Problem: 'linebreak' doesn't work with the 'list' option.
+Solution: Make it work. (Christian Brabandt)
+Files: runtime/doc/options.txt, src/charset.c, src/screen.c,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_listlbr.in, src/testdir/test_listlbr.ok
+
+Patch 7.4.354
+Problem: Compiler warning.
+Solution: Change NUL to NULL. (Ken Takata)
+Files: src/screen.c
+
+Patch 7.4.355
+Problem: Several problems with Javascript indenting.
+Solution: Improve Javascript indenting.
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.4.356
+Problem: Mercurial does not ignore memfile_test. (Daniel Hahler)
+Solution: Add memfile_test to ignored files, remove trailing spaces.
+Files: .hgignore
+
+Patch 7.4.357
+Problem: After completion some characters are not redrawn.
+Solution: Clear the command line unconditionally. (Jacob Niehus)
+Files: src/edit.c
+
+Patch 7.4.358 (after 7.4.351)
+Problem: Sort is not always stable.
+Solution: Add an index instead of relying on the pointer to remain the same.
+ Idea by Jun Takimoto.
+Files: src/eval.c
+
+Patch 7.4.359
+Problem: When 'ttymouse' is set to 'uxterm' the xterm version is not
+ requested. (Tomas Janousek)
+Solution: Do not mark uxterm as a conflict mouse and add
+ resume_get_esc_sequence().
+Files: src/term.c, src/os_unix.c, src/proto/term.pro
+
+Patch 7.4.360
+Problem: In a regexp pattern a "$" followed by \v or \V is not seen as the
+ end-of-line.
+Solution: Handle the situation. (Ozaki Kiichi)
+Files: src/regexp.c
+
+Patch 7.4.361
+Problem: Lots of flickering when filling the preview window for 'omnifunc'.
+Solution: Disable redrawing. (Hirohito Higashi)
+Files: src/popupmnu.c
+
+Patch 7.4.362
+Problem: When matchaddpos() uses a length smaller than the number of bytes
+ in the (last) character the highlight continues until the end of
+ the line.
+Solution: Change condition from equal to larger-or-equal.
+Files: src/screen.c
+
+Patch 7.4.363
+Problem: In Windows console typing 0xCE does not work.
+Solution: Convert 0xCE to K_NUL 3. (Nobuhiro Takasaki et al.)
+Files: src/os_win32.c, src/term.c
+
+Patch 7.4.364
+Problem: When the viminfo file can't be renamed there is no error message.
+ (Vladimir Berezhnoy)
+Solution: Check for the rename to fail.
+Files: src/ex_cmds.c
+
+Patch 7.4.365
+Problem: Crash when using ":botright split" when there isn't much space.
+Solution: Add a check for the minimum width/height. (Yukihiro Nakadaira)
+Files: src/window.c
+
+Patch 7.4.366
+Problem: Can't run the linebreak test on MS-Windows.
+Solution: Fix the output file name. (Taro Muraoka)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.4.367 (after 7.4.357)
+Problem: Other solution for redrawing after completion.
+Solution: Schedule a window redraw instead of just clearing the command
+ line. (Jacob Niehus)
+Files: src/edit.c
+
+Patch 7.4.368
+Problem: Restoring the window sizes after closing the command line window
+ doesn't work properly if there are nested splits.
+Solution: Restore the sizes twice. (Hirohito Higashi)
+Files: src/window.c
+
+Patch 7.4.369
+Problem: Using freed memory when exiting while compiled with EXITFREE.
+Solution: Set curwin to NULL and check for that. (Dominique Pelle)
+Files: src/buffer.c, src/window.c
+
+Patch 7.4.370
+Problem: Linebreak test fails when encoding is not utf-8. (Danek Duvall)
+Solution: Split the test in a single byte one and a utf-8 one. (Christian
+ Brabandt)
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_listlbr.in, src/testdir/test_listlbr.ok,
+ src/testdir/test_listlbr_utf8.in, src/testdir/test_listlbr_utf8.ok
+
+Patch 7.4.371
+Problem: When 'linebreak' is set control characters are not correctly
+ displayed. (Kimmy Lindvall)
+Solution: Set n_extra. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.4.372
+Problem: When 'winminheight' is zero there might not be one line for the
+ current window.
+Solution: Change the size computations. (Yukihiro Nakadaira)
+Files: src/window.c
+
+Patch 7.4.373
+Problem: Compiler warning for unused argument and unused variable.
+Solution: Add UNUSED. Move variable inside #ifdef.
+Files: src/charset.c, src/window.c
+
+Patch 7.4.374
+Problem: Character after "fb" command not mapped if it might be a composing
+ character.
+Solution: Don't disable mapping when looking for a composing character.
+ (Jacob Niehus)
+Files: src/normal.c
+
+Patch 7.4.375
+Problem: Test 63 fails when run with GUI-only Vim.
+Solution: Add guibg attributes. (suggested by Mike Soyka)
+Files: src/testdir/test63.in
+
+Patch 7.4.376 (after 7.4.367)
+Problem: Popup menu flickers too much.
+Solution: Remove the forced redraw. (Hirohito Higashi)
+Files: src/edit.c
+
+Patch 7.4.377
+Problem: When 'equalalways' is set a split may report "no room" even though
+ there is plenty of room.
+Solution: Compute the available room properly. (Yukihiro Nakadaira)
+Files: src/window.c
+
+Patch 7.4.378
+Problem: Title of quickfix list is not kept for setqflist(list, 'r').
+Solution: Keep the title. Add a test. (Lcd)
+Files: src/quickfix.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_qf_title.in,
+ src/testdir/test_qf_title.ok
+
+Patch 7.4.379
+Problem: Accessing freed memory after using setqflist(list, 'r'). (Lcd)
+Solution: Reset qf_index.
+Files: src/quickfix.c
+
+Patch 7.4.380
+Problem: Loading python may cause Vim to exit.
+Solution: Avoid loading the "site" module. (Taro Muraoka)
+Files: src/if_python.c
+
+Patch 7.4.381
+Problem: Get u_undo error when backspacing in Insert mode deletes more than
+ one line break. (Ayberk Ozgur)
+Solution: Also decrement Insstart.lnum.
+Files: src/edit.c
+
+Patch 7.4.382
+Problem: Mapping characters may not work after typing Esc in Insert mode.
+Solution: Fix the noremap flags for inserted characters. (Jacob Niehus)
+Files: src/getchar.c
+
+Patch 7.4.383
+Problem: Bad interaction between preview window and omnifunc.
+Solution: Avoid redrawing the status line. (Hirohito Higashi)
+Files: src/popupmnu.c
+
+Patch 7.4.384
+Problem: Test 102 fails when compiled with small features.
+Solution: Source small.vim. (Jacob Niehus)
+Files: src/testdir/test102.in
+
+Patch 7.4.385
+Problem: When building with tiny or small features building the .mo files
+ fails.
+Solution: In autoconf do not setup for building the .mo files when it would
+ fail.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.386
+Problem: When splitting a window the changelist position is wrong.
+Solution: Copy the changelist position. (Jacob Niehus)
+Files: src/window.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_changelist.in,
+ src/testdir/test_changelist.ok
+
+Patch 7.4.387
+Problem: "4gro" replaces one character then executes "ooo". (Urtica Dioica)
+Solution: Write the ESC in the second stuff buffer.
+Files: src/getchar.c, src/proto/getchar.pro, src/edit.c,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_insertcount.in, src/testdir/test_insertcount.ok
+
+Patch 7.4.388
+Problem: With 'linebreak' set and 'list' unset a Tab is not counted
+ properly. (Kent Sibilev)
+Solution: Check the 'list' option. (Christian Brabandt)
+Files: src/screen.c, src/testdir/test_listlbr_utf8.in,
+ src/testdir/test_listlbr_utf8.ok
+
+Patch 7.4.389
+Problem: Still sometimes Vim enters Replace mode when starting up.
+Solution: Use a different solution in detecting the termresponse and
+ location response. (Hayaki Saito)
+Files: src/globals.h, src/os_unix.c, src/term.c, src/proto/term.pro
+
+Patch 7.4.390
+Problem: Advancing pointer over end of a string.
+Solution: Init quote character to -1 instead of zero. (Dominique Pelle)
+Files: src/misc1.c
+
+Patch 7.4.391
+Problem: No 'cursorline' highlighting when the cursor is on a line with
+ diff highlighting. (Benjamin Fritz)
+Solution: Combine the highlight attributes. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.4.392
+Problem: Not easy to detect type of command line window.
+Solution: Add the getcmdwintype() function. (Jacob Niehus)
+Files: src/eval.c
+
+Patch 7.4.393
+Problem: Text drawing on newer MS-Windows systems is suboptimal. Some
+ multibyte characters are not displayed, even though the same font
+ in Notepad can display them. (Srinath Avadhanula)
+Solution: Add the 'renderoptions' option to enable DirectX drawing. (Taro
+ Muraoka)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/various.txt, src/Make_cyg.mak, src/Make_ming.mak,
+ src/Make_mvc.mak, src/eval.c, src/gui_dwrite.cpp,
+ src/gui_dwrite.h, src/gui_w32.c, src/gui_w48.c, src/option.c,
+ src/option.h, src/version.c, src/vim.h, src/proto/gui_w32.pro
+
+Patch 7.4.394 (after 7.4.393)
+Problem: When using DirectX last italic character is incomplete.
+Solution: Add one to the number of cells. (Ken Takata)
+Files: src/gui_w32.c
+
+Patch 7.4.395 (after 7.4.355)
+Problem: C indent is wrong below an if with wrapped condition followed by
+ curly braces. (Trevor Powell)
+Solution: Make a copy of tryposBrace.
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.4.396
+Problem: When 'clipboard' is "unnamed", :g/pat/d is very slow. (Praful)
+Solution: Only set the clipboard after the last delete. (Christian Brabandt)
+Files: src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/globals.h,
+ src/ops.c, src/proto/ui.pro, src/ui.c
+
+Patch 7.4.397
+Problem: Matchparen only uses the topmost syntax item.
+Solution: Go through the syntax stack to find items. (James McCoy)
+ Also use getcurpos() when possible.
+Files: runtime/plugin/matchparen.vim
+
+Patch 7.4.398 (after 7.4.393)
+Problem: Gcc error for the argument of InterlockedIncrement() and
+ InterlockedDecrement(). (Axel Bender)
+Solution: Remove "unsigned" from the cRefCount_ declaration.
+Files: src/gui_dwrite.cpp
+
+Patch 7.4.399
+Problem: Encryption implementation is messy. Blowfish encryption has a
+ weakness.
+Solution: Refactor the encryption, store the state in an allocated struct
+ instead of using a save/restore mechanism. Introduce the
+ "blowfish2" method, which does not have the weakness and encrypts
+ the whole undo file. (largely by David Leadbeater)
+Files: runtime/doc/editing.txt, runtime/doc/options.txt, src/Makefile,
+ src/blowfish.c, src/crypt.c, src/crypt_zip.c, src/ex_docmd.c,
+ src/fileio.c, src/globals.h, src/main.c, src/memline.c,
+ src/misc2.c, src/option.c, src/proto.h, src/proto/blowfish.pro,
+ src/proto/crypt.pro, src/proto/crypt_zip.pro,
+ src/proto/fileio.pro, src/proto/misc2.pro, src/structs.h,
+ src/undo.c, src/testdir/test71.in, src/testdir/test71.ok,
+ src/testdir/test71a.in, src/testdir/test72.in,
+ src/testdir/test72.ok
+
+Patch 7.4.400
+Problem: List of distributed files is incomplete.
+Solution: Add recently added files.
+Files: Filelist
+
+Patch 7.4.401 (after 7.4.399)
+Problem: Can't build on MS-Windows.
+Solution: Include the new files in all the Makefiles.
+Files: src/Make_bc3.mak, src/Make_bc5.mak, src/Make_cyg.mak,
+ src/Make_dice.mak, src/Make_djg.mak, src/Make_ivc.mak,
+ src/Make_manx.mak, src/Make_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_os2.mak, src/Make_sas.mak,
+ Make_vms.mms
+
+Patch 7.4.402
+Problem: Test 72 crashes under certain conditions. (Kazunobu Kuriyama)
+Solution: Clear the whole bufinfo_T early.
+Files: src/undo.c
+
+Patch 7.4.403
+Problem: Valgrind reports errors when running test 72. (Dominique Pelle)
+Solution: Reset the local 'cryptmethod' option before storing the seed.
+ Set the seed in the memfile even when there is no block0 yet.
+Files: src/fileio.c, src/option.c, src/memline.c
+
+Patch 7.4.404
+Problem: Windows 64 bit compiler warnings.
+Solution: Add type casts. (Mike Williams)
+Files: src/crypt.c, src/undo.c
+
+Patch 7.4.405
+Problem: Screen updating is slow when using matches.
+Solution: Do not use the ">=" as in patch 7.4.362, check the lnum.
+Files: src/screen.c, src/testdir/test63.in, src/testdir/test63.ok
+
+Patch 7.4.406
+Problem: Test 72 and 100 fail on MS-Windows.
+Solution: Set fileformat to unix in the tests. (Taro Muraoka)
+Files: src/testdir/test72.in, src/testdir/test100.in
+
+Patch 7.4.407
+Problem: Inserting text for Visual block mode, with cursor movement,
+ repeats the wrong text. (Aleksandar Ivanov)
+Solution: Reset the update_Insstart_orig flag. (Christian Brabandt)
+Files: src/edit.c, src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.4.408
+Problem: Visual block insert breaks a multibyte character.
+Solution: Calculate the position properly. (Yasuhiro Matsumoto)
+Files: src/ops.c, src/testdir/test_utf8.in, src/testdir/test_utf8.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.409
+Problem: Can't build with Perl on Fedora 20.
+Solution: Find xsubpp in another directory. (Michael Henry)
+Files: src/Makefile, src/config.mk.in, src/configure.in,
+ src/auto/configure
+
+Patch 7.4.410
+Problem: Fold does not open after search when there is a CmdwinLeave
+ autocommand.
+Solution: Restore KeyTyped. (Jacob Niehus)
+Files: src/ex_getln.c
+
+Patch 7.4.411
+Problem: "foo bar" sorts before "foo" with sort(). (John Little)
+Solution: Avoid putting quotes around strings before comparing them.
+Files: src/eval.c
+
+Patch 7.4.412
+Problem: Can't build on Windows XP with MSVC.
+Solution: Add SUBSYSTEM_VER to the Makefile. (Yongwei Wu)
+Files: src/Make_mvc.mak, src/INSTALLpc.txt
+
+Patch 7.4.413
+Problem: MS-Windows: Using US international keyboard layout, inserting dead
+ key by pressing space does not always work. Issue 250.
+Solution: Let MS-Windows translate the message. (John Wellesz)
+Files: src/gui_w48.c
+
+Patch 7.4.414
+Problem: Cannot define a command only when it's used.
+Solution: Add the CmdUndefined autocommand event. (partly by Yasuhiro
+ Matsumoto)
+Files: runtime/doc/autocmd.txt, src/ex_docmd.c, src/fileio.c,
+ src/proto/fileio.pro
+
+Patch 7.4.415 (after 7.4.414)
+Problem: Cannot build. Warning for shadowed variable. (John Little)
+Solution: Add missing change. Remove declaration.
+Files: src/vim.h, src/ex_docmd.c
+
+Patch 7.4.416
+Problem: Problem with breakindent/showbreak and tabs.
+Solution: Handle tabs differently. (Christian Brabandt)
+Files: src/testdir/test_breakindent.in, src/testdir/test_breakindent.ok,
+ src/charset.c
+
+Patch 7.4.417
+Problem: After splitting a window and setting 'breakindent' the default
+ minimum with is not respected.
+Solution: Call briopt_check() when copying options to a new window.
+Files: src/option.c, src/proto/option.pro,
+ src/testdir/test_breakindent.in
+
+Patch 7.4.418
+Problem: When leaving ":append" the cursor shape is like in Insert mode.
+ (Jacob Niehus)
+Solution: Do not have State set to INSERT when calling getline().
+Files: src/ex_cmds.c
+
+Patch 7.4.419
+Problem: When part of a list is locked it's possible to make changes.
+Solution: Check if any of the list items is locked before make a change.
+ (ZyX)
+Files: src/eval.c, src/testdir/test55.in, src/testdir/test55.ok
+
+Patch 7.4.420
+Problem: It's not obvious how to add a new test.
+Solution: Add a README file. (Christian Brabandt)
+Files: src/testdir/README.txt
+
+Patch 7.4.421
+Problem: Crash when searching for "\ze*". (Urtica Dioica)
+Solution: Disallow a multi after \ze and \zs.
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.422
+Problem: When using conceal with linebreak some text is not displayed
+ correctly. (Grüner Gimpel)
+Solution: Check for conceal mode when using linebreak. (Christian Brabandt)
+Files: src/screen.c, src/testdir/test_listlbr.in,
+ src/testdir/test_listlbr.ok
+
+Patch 7.4.423
+Problem: expand("$shell") does not work as documented.
+Solution: Do not escape the $ when expanding environment variables.
+Files: src/os_unix.c, src/misc1.c, src/vim.h
+
+Patch 7.4.424
+Problem: Get ml_get error when using Python to delete lines in a buffer
+ that is not in a window. issue 248.
+Solution: Do not try adjusting the cursor for a different buffer.
+Files: src/if_py_both.h
+
+Patch 7.4.425
+Problem: When 'showbreak' is used "gj" may move to the wrong position.
+ (Nazri Ramliy)
+Solution: Adjust virtcol when 'showbreak' is set. (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.4.426
+Problem: README File missing from list of files.
+Solution: Update the list of files.
+Files: Filelist
+
+Patch 7.4.427
+Problem: When an InsertCharPre autocommand executes system() typeahead may
+ be echoed and messes up the display. (Jacob Niehus)
+Solution: Do not set cooked mode when invoked from ":silent".
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 7.4.428
+Problem: executable() may return a wrong result on MS-Windows.
+Solution: Change the way SearchPath() is called. (Yasuhiro Matsumoto, Ken
+ Takata)
+Files: src/os_win32.c
+
+Patch 7.4.429
+Problem: Build fails with fewer features. (Elimar Riesebieter)
+Solution: Add #ifdef.
+Files: src/normal.c
+
+Patch 7.4.430
+Problem: test_listlbr fails when compiled with normal features.
+Solution: Check for the +conceal feature.
+Files: src/testdir/test_listlbr.in
+
+Patch 7.4.431
+Problem: Compiler warning.
+Solution: Add type cast. (Mike Williams)
+Files: src/ex_docmd.c
+
+Patch 7.4.432
+Problem: When the startup code expands command line arguments, setting
+ 'encoding' will not properly convert the arguments.
+Solution: Call get_cmd_argsW() early in main(). (Yasuhiro Matsumoto)
+Files: src/os_win32.c, src/main.c, src/os_mswin.c
+
+Patch 7.4.433
+Problem: Test 75 fails on MS-Windows.
+Solution: Use ":normal" instead of feedkeys(). (Michael Soyka)
+Files: src/testdir/test75.in
+
+Patch 7.4.434
+Problem: gettabvar() is not consistent with getwinvar() and getbufvar().
+Solution: Return a dict with all variables when the varname is empty.
+ (Yasuhiro Matsumoto)
+Files: src/eval.c, runtime/doc/eval.txt, src/testdir/test91.in,
+ src/testdir/test91.ok
+
+Patch 7.4.435
+Problem: Line formatting behaves differently when 'linebreak' is set.
+ (mvxxc)
+Solution: Disable 'linebreak' temporarily. (Christian Brabandt)
+Files: src/edit.c
+
+Patch 7.4.436
+Problem: ml_get error for autocommand that moves the cursor of the current
+ window.
+Solution: Check the cursor position after switching back to the current
+ buffer. (Christian Brabandt)
+Files: src/fileio.c
+
+Patch 7.4.437
+Problem: New and old regexp engine are not consistent.
+Solution: Also give an error for "\ze*" for the old regexp engine.
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.4.438
+Problem: Cached values for 'cino' not reset for ":set all&".
+Solution: Call parse_cino(). (Yukihiro Nakadaira)
+Files: src/option.c
+
+Patch 7.4.439
+Problem: Duplicate message in message history. Some quickfix messages
+ appear twice. (Gary Johnson)
+Solution: Do not reset keep_msg too early. (Hirohito Higashi)
+Files: src/main.c
+
+Patch 7.4.440
+Problem: Omni complete popup drawn incorrectly.
+Solution: Call validate_cursor() instead of check_cursor(). (Hirohito
+ Higashi)
+Files: src/edit.c
+
+Patch 7.4.441
+Problem: Endless loop and other problems when 'cedit' is set to CTRL-C.
+Solution: Do not call ex_window() when ex_normal_busy or got_int was set.
+ (Yasuhiro Matsumoto)
+Files: src/ex_getln.c
+
+Patch 7.4.442 (after 7.4.434)
+Problem: Using uninitialized variable.
+Solution: Pass the first window of the tabpage.
+Files: src/eval.c
+
+Patch 7.4.443
+Problem: Error reported by ubsan when running test 72.
+Solution: Add type cast to unsigned. (Dominique Pelle)
+Files: src/undo.c
+
+Patch 7.4.444
+Problem: Reversed question mark not recognized as punctuation. (Issue 258)
+Solution: Add the Supplemental Punctuation range.
+Files: src/mbyte.c
+
+Patch 7.4.445
+Problem: Clipboard may be cleared on startup.
+Solution: Set clip_did_set_selection to -1 during startup. (Christian
+ Brabandt)
+Files: src/main.c, src/ui.c
+
+Patch 7.4.446
+Problem: In some situations, when setting up an environment to trigger an
+ autocommand, the environment is not properly restored.
+Solution: Check the return value of switch_win() and call restore_win()
+ always. (Daniel Hahler)
+Files: src/eval.c, src/misc2.c, src/window.c
+
+Patch 7.4.447
+Problem: Spell files from Hunspell may generate a lot of errors.
+Solution: Add the IGNOREEXTRA flag.
+Files: src/spell.c, runtime/doc/spell.txt
+
+Patch 7.4.448
+Problem: Using ETO_IGNORELANGUAGE causes problems.
+Solution: Remove this flag. (Paul Moore)
+Files: src/gui_w32.c
+
+Patch 7.4.449
+Problem: Can't easily close the help window. (Chris Gaal)
+Solution: Add ":helpclose". (Christian Brabandt)
+Files: runtime/doc/helphelp.txt, runtime/doc/index.txt, src/ex_cmds.c,
+ src/ex_cmds.h, src/proto/ex_cmds.pro
+
+Patch 7.4.450
+Problem: Not all commands that edit another buffer support the +cmd
+ argument.
+Solution: Add the +cmd argument to relevant commands. (Marcin Szamotulski)
+Files: runtime/doc/windows.txt, src/ex_cmds.h, src/ex_docmd.c
+
+Patch 7.4.451
+Problem: Calling system() with empty input gives an error for writing the
+ temp file.
+Solution: Do not try writing if the string length is zero. (Olaf Dabrunz)
+Files: src/eval.c
+
+Patch 7.4.452
+Problem: Can't build with tiny features. (Tony Mechelynck)
+Solution: Use "return" instead of "break".
+Files: src/ex_cmds.c
+
+Patch 7.4.453
+Problem: Still can't build with tiny features.
+Solution: Add #ifdef.
+Files: src/ex_cmds.c
+
+Patch 7.4.454
+Problem: When using a Visual selection of multiple words and doing CTRL-W_]
+ it jumps to the tag matching the word under the cursor, not the
+ selected text. (Patrick hemmer)
+Solution: Do not reset Visual mode. (idea by Christian Brabandt)
+Files: src/window.c
+
+Patch 7.4.455
+Problem: Completion for :buf does not use 'wildignorecase'. (Akshay H)
+Solution: Pass the 'wildignorecase' flag around.
+Files: src/buffer.c
+
+Patch 7.4.456
+Problem: 'backupcopy' is global, cannot write only some files in a
+ different way.
+Solution: Make 'backupcopy' global-local. (Christian Brabandt)
+Files: runtime/doc/options.txt, src/buffer.c, src/fileio.c, src/option.c,
+ src/option.h, src/proto/option.pro, src/structs.h
+
+Patch 7.4.457
+Problem: Using getchar() in an expression mapping may result in
+ K_CURSORHOLD, which can't be recognized.
+Solution: Add the <CursorHold> key. (Hirohito Higashi)
+Files: src/misc2.c
+
+Patch 7.4.458
+Problem: Issue 252: Cursor moves in a zero-height window.
+Solution: Check for zero height. (idea by Christian Brabandt)
+Files: src/move.c
+
+Patch 7.4.459
+Problem: Can't change the icon after building Vim.
+Solution: Load the icon from a file on startup. (Yasuhiro Matsumoto)
+Files: src/gui_w32.c, src/os_mswin.c, src/os_win32.c,
+ src/proto/os_mswin.pro
+
+Patch 7.4.460 (after 7.4.454)
+Problem: Can't build without the quickfix feature. (Erik Falor)
+Solution: Add a #ifdef.
+Files: src/window.c
+
+Patch 7.4.461
+Problem: MS-Windows: When collate is on the number of copies is too high.
+Solution: Only set the collated/uncollated count when collate is on.
+ (Yasuhiro Matsumoto)
+Files: src/os_mswin.c
+
+Patch 7.4.462
+Problem: Setting the local value of 'backupcopy' empty gives an error.
+ (Peter Mattern)
+Solution: When using an empty value set the flags to zero. (Hirohito
+ Higashi)
+Files: src/option.c
+
+Patch 7.4.463
+Problem: Test 86 and 87 may hang on MS-Windows.
+Solution: Call inputrestore() after inputsave(). (Ken Takata)
+Files: src/testdir/test86.in, src/testdir/test87.in
+
+Patch 7.4.464 (after 7.4.459)
+Problem: Compiler warning.
+Solution: Add type cast. (Ken Takata)
+Files: src/gui_w32.c
+
+Patch 7.4.465 (after 7.4.016)
+Problem: Crash when expanding a very long string.
+Solution: Use wcsncpy() instead of wcscpy(). (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.466 (after 7.4.460)
+Problem: CTRL-W } does not open preview window. (Erik Falor)
+Solution: Don't set g_do_tagpreview for CTRL-W }.
+Files: src/window.c
+
+Patch 7.4.467
+Problem: 'linebreak' does not work well together with Visual mode.
+Solution: Disable 'linebreak' while applying an operator. Fix the test.
+ (Christian Brabandt)
+Files: src/normal.c, src/screen.c, src/testdir/test_listlbr.in,
+ src/testdir/test_listlbr.ok
+
+Patch 7.4.468
+Problem: Issue 26: CTRL-C does not interrupt after it was mapped and then
+ unmapped.
+Solution: Reset mapped_ctrl_c. (Christian Brabandt)
+Files: src/getchar.c
+
+Patch 7.4.469 (after 7.4.467)
+Problem: Can't build with MSVC. (Ken Takata)
+Solution: Move the assignment after the declarations.
+Files: src/normal.c
+
+Patch 7.4.470
+Problem: Test 11 and 100 do not work properly on Windows.
+Solution: Avoid using feedkeys(). (Ken Takata)
+Files: src/testdir/Make_dos.mak, src/testdir/test11.in,
+ src/testdir/test100.in
+
+Patch 7.4.471
+Problem: MS-Windows: When printer name contains multibyte, the name is
+ displayed as ???.
+Solution: Convert the printer name from the active codepage to 'encoding'.
+ (Yasuhiro Matsumoto)
+Files: src/os_mswin.c
+
+Patch 7.4.472
+Problem: The "precedes" entry in 'listchars' will be drawn when 'showbreak'
+ is set and 'list' is not.
+Solution: Only draw this character when 'list' is on. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.4.473
+Problem: Cursor movement is incorrect when there is a number/sign/fold
+ column and 'sbr' is displayed.
+Solution: Adjust the column for 'sbr'. (Christian Brabandt)
+Files: src/charset.c
+
+Patch 7.4.474
+Problem: AIX compiler can't handle // comment. Issue 265.
+Solution: Remove that line.
+Files: src/regexp_nfa.c
+
+Patch 7.4.475
+Problem: Can't compile on a system where Xutf8SetWMProperties() is not in
+ the X11 library. Issue 265.
+Solution: Add a configure check.
+Files: src/configure.in, src/auto/configure, src/config.h.in,
+ src/os_unix.c
+
+Patch 7.4.476
+Problem: MingW: compiling with "XPM=no" doesn't work.
+Solution: Check for the "no" value. (KF Leong) Also for Cygwin. (Ken
+ Takata)
+Files: src/Make_ming.mak, src/Make_cyg.mak
+
+Patch 7.4.477
+Problem: When using ":%diffput" and the other file is empty an extra empty
+ line remains.
+Solution: Set the buf_empty flag.
+Files: src/diff.c
+
+Patch 7.4.478
+Problem: Using byte length instead of character length for 'showbreak'.
+Solution: Compute the character length. (Marco Hinz)
+Files: src/charset.c
+
+Patch 7.4.479
+Problem: MS-Windows: The console title can be wrong.
+Solution: Take the encoding into account. When restoring the title use the
+ right function. (Yasuhiro Matsumoto)
+Files: src/os_mswin.c, src/os_win32.c
+
+Patch 7.4.480 (after 7.4.479)
+Problem: MS-Windows: Can't build.
+Solution: Remove goto, use a flag instead.
+Files: src/os_win32.c
+
+Patch 7.4.481 (after 7.4.471)
+Problem: Compiler warning on MS-Windows.
+Solution: Add type casts. (Ken Takata)
+Files: src/os_mswin.c
+
+Patch 7.4.482
+Problem: When 'balloonexpr' results in a list, the text has a trailing
+ newline. (Lcd)
+Solution: Remove one trailing newline.
+Files: src/gui_beval.c
+
+Patch 7.4.483
+Problem: A 0x80 byte is not handled correctly in abbreviations.
+Solution: Unescape special characters. Add a test. (Christian Brabandt)
+Files: src/getchar.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_mapping.in,
+ src/testdir/test_mapping.ok
+
+Patch 7.4.484 (after 7.4.483)
+Problem: Compiler warning on MS-Windows. (Ken Takata)
+Solution: Add type cast.
+Files: src/getchar.c
+
+Patch 7.4.485 (after 7.4.484)
+Problem: Abbreviations don't work. (Toothpik)
+Solution: Move the length computation inside the for loop. Compare against
+ the unescaped key.
+Files: src/getchar.c
+
+Patch 7.4.486
+Problem: Check for writing to a yank register is wrong.
+Solution: Negate the check. (Zyx). Also clean up the #ifdefs.
+Files: src/ex_docmd.c, src/ex_cmds.h
+
+Patch 7.4.487
+Problem: ":sign jump" may use another window even though the file is
+ already edited in the current window.
+Solution: First check if the file is in the current window. (James McCoy)
+Files: src/window.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_signs.in,
+ src/testdir/test_signs.ok
+
+Patch 7.4.488
+Problem: test_mapping fails for some people.
+Solution: Set the 'encoding' option. (Ken Takata)
+Files: src/testdir/test_mapping.in
+
+Patch 7.4.489
+Problem: Cursor movement still wrong when 'lbr' is set and there is a
+ number column. (Hirohito Higashi)
+Solution: Add correction for number column. (Hiroyuki Takagi)
+Files: src/charset.c
+
+Patch 7.4.490
+Problem: Cannot specify the buffer to use for "do" and "dp", making them
+ useless for three-way diff.
+Solution: Use the count as the buffer number. (James McCoy)
+Files: runtime/doc/diff.txt, src/diff.c, src/normal.c, src/proto/diff.pro
+
+Patch 7.4.491
+Problem: When winrestview() has a negative "topline" value there are
+ display errors.
+Solution: Correct a negative value to 1. (Hirohito Higashi)
+Files: src/eval.c
+
+Patch 7.4.492
+Problem: In Insert mode, after inserting a newline that inserts a comment
+ leader, CTRL-O moves to the right. (ZyX) Issue 57.
+Solution: Correct the condition for moving the cursor back to the NUL.
+ (Christian Brabandt)
+Files: src/edit.c, src/testdir/test4.in, src/testdir/test4.ok
+
+Patch 7.4.493
+Problem: A TextChanged autocommand is triggered when saving a file.
+ (William Gardner)
+Solution: Update last_changedtick after calling unchanged(). (Christian
+ Brabandt)
+Files: src/fileio.c
+
+Patch 7.4.494
+Problem: Cursor shape is wrong after a CompleteDone autocommand.
+Solution: Update the cursor and mouse shape after ":normal" restores the
+ state. (Jacob Niehus)
+Files: src/ex_docmd.c
+
+Patch 7.4.495
+Problem: XPM isn't used correctly in the Cygwin Makefile.
+Solution: Include the rules like in Make_ming.mak. (Ken Takata)
+Files: src/Make_cyg.mak
+
+Patch 7.4.496
+Problem: Many lines are both in Make_cyg.mak and Make_ming.mak
+Solution: Move the common parts to one file. (Ken Takata)
+Files: src/INSTALLpc.txt, src/Make_cyg.mak, src/Make_cyg_ming.mak,
+ src/Make_ming.mak, src/Make_mvc.mak, Filelist
+
+Patch 7.4.497
+Problem: With some regexp patterns the NFA engine uses many states and
+ becomes very slow. To the user it looks like Vim freezes.
+Solution: When the number of states reaches a limit fall back to the old
+ engine. (Christian Brabandt)
+Files: runtime/doc/options.txt, src/Makefile, src/regexp.c, src/regexp.h,
+ src/regexp_nfa.c, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Makefile, src/testdir/samples/re.freeze.txt,
+ src/testdir/bench_re_freeze.in, src/testdir/bench_re_freeze.vim,
+ Filelist
+
+Patch 7.4.498 (after 7.4.497)
+Problem: Typo in DOS makefile.
+Solution: Change exists to exist. (Ken Takata)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.4.499
+Problem: substitute() can be slow with long strings.
+Solution: Store a pointer to the end, instead of calling strlen() every
+ time. (Ozaki Kiichi)
+Files: src/eval.c
+
+Patch 7.4.500
+Problem: Test 72 still fails once in a while.
+Solution: Don't set 'fileformat' to unix, reset it. (Ken Takata)
+Files: src/testdir/test72.in
+
+Patch 7.4.501 (after 7.4.497)
+Problem: Typo in file pattern.
+Solution: Insert a slash and remove a dot.
+Files: Filelist
+
+Patch 7.4.502
+Problem: Language mapping also applies to mapped characters.
+Solution: Add the 'langnoremap' option, when on 'langmap' does not apply to
+ mapped characters. (Christian Brabandt)
+Files: runtime/doc/options.txt, runtime/vimrc_example.vim, src/macros.h,
+ src/option.c, src/option.h
+
+Patch 7.4.503
+Problem: Cannot append a list of lines to a file.
+Solution: Add the append option to writefile(). (Yasuhiro Matsumoto)
+Files: runtime/doc/eval.txt, src/Makefile, src/eval.c,
+ src/testdir/test_writefile.in, src/testdir/test_writefile.ok
+
+Patch 7.4.504
+Problem: Restriction of the MS-Windows installer that the path must end in
+ "Vim" prevents installing more than one version.
+Solution: Remove the restriction. (Tim Lebedkov)
+Files: nsis/gvim.nsi
+
+Patch 7.4.505
+Problem: On MS-Windows when 'encoding' is a double-byte encoding a file
+ name longer than MAX_PATH bytes but shorter than that in
+ characters causes problems.
+Solution: Fail on file names longer than MAX_PATH bytes. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.506
+Problem: MS-Windows: Cannot open a file with 259 characters.
+Solution: Fix off-by-one error. (Ken Takata)
+Files: src/os_mswin.c
+
+Patch 7.4.507 (after 7.4.496)
+Problem: Building with MingW and Perl.
+Solution: Remove quotes. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.508
+Problem: When generating ja.sjis.po the header is not correctly adjusted.
+Solution: Check for the right header string. (Ken Takata)
+Files: src/po/sjiscorr.c
+
+Patch 7.4.509
+Problem: Users are not aware their encryption is weak.
+Solution: Give a warning when prompting for the key.
+Files: src/crypt.c, src/ex_docmd.c, src/fileio.c, src/main.c,
+ src/proto/crypt.pro
+
+Patch 7.4.510
+Problem: "-fwrapv" argument breaks use of cproto.
+Solution: Remove the alphabetic arguments in a drastic way.
+Files: src/Makefile
+
+Patch 7.4.511
+Problem: Generating proto for if_ruby.c uses type not defined elsewhere.
+Solution: Do not generate a prototype for
+ rb_gc_writebarrier_unprotect_promoted()
+Files: src/if_ruby.c
+
+Patch 7.4.512
+Problem: Cannot generate prototypes for Win32 files and VMS.
+Solution: Add typedefs and #ifdef
+Files: src/os_win32.c, src/gui_w32.c, src/os_vms.c
+
+Patch 7.4.513
+Problem: Crash because reference count is wrong for list returned by
+ getreg().
+Solution: Increment the reference count. (Kimmy Lindvall)
+Files: src/eval.c
+
+Patch 7.4.514 (after 7.4.492)
+Problem: Memory access error. (Dominique Pelle)
+Solution: Update tpos. (Christian Brabandt)
+Files: src/edit.c
+
+Patch 7.4.515
+Problem: In a help buffer the global 'foldmethod' is used. (Paul Marshall)
+Solution: Reset 'foldmethod' when starting to edit a help file. Move the
+ code to a separate function.
+Files: src/ex_cmds.c
+
+Patch 7.4.516
+Problem: Completing a function name containing a # does not work. Issue
+ 253.
+Solution: Recognize the # character. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.4.517
+Problem: With a wrapping line the cursor may not end up in the right place.
+ (Nazri Ramliy)
+Solution: Adjust n_extra for a Tab that wraps. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.4.518
+Problem: Using status line height in width computations.
+Solution: Use one instead. (Hirohito Higashi)
+Files: src/window.c
+
+Patch 7.4.519 (after 7.4.497)
+Problem: Crash when using syntax highlighting.
+Solution: When regprog is freed and replaced, store the result.
+Files: src/buffer.c, src/regexp.c, src/syntax.c, src/spell.c,
+ src/ex_cmds2.c, src/fileio.c, src/proto/fileio.pro,
+ src/proto/regexp.pro, src/os_unix.c
+
+Patch 7.4.520
+Problem: Sun PCK locale is not recognized.
+Solution: Add PCK in the table. (Keiichi Oono)
+Files: src/mbyte.c
+
+Patch 7.4.521
+Problem: When using "vep" a mark is moved to the next line. (Maxi Padulo,
+ Issue 283)
+Solution: Decrement the line number. (Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.4.522
+Problem: Specifying wrong buffer size for GetLongPathName().
+Solution: Use the actual size. (Ken Takata)
+Files: src/eval.c
+
+Patch 7.4.523
+Problem: When the X11 server is stopped and restarted, while Vim is kept in
+ the background, copy/paste no longer works. (Issue 203)
+Solution: Setup the clipboard again. (Christian Brabandt)
+Files: src/os_unix.c
+
+Patch 7.4.524
+Problem: When using ":ownsyntax" spell checking is messed up. (Issue 78)
+Solution: Use the window-local option values. (Christian Brabandt)
+Files: src/option.c, src/syntax.c
+
+Patch 7.4.525
+Problem: map() leaks memory when there is an error in the expression.
+Solution: Call clear_tv(). (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.4.526
+Problem: matchstr() fails on long text. (Daniel Hahler)
+Solution: Return NFA_TOO_EXPENSIVE from regexec_nl(). (Christian Brabandt)
+Files: src/regexp.c
+
+Patch 7.4.527
+Problem: Still confusing regexp failure and NFA_TOO_EXPENSIVE.
+Solution: NFA changes equivalent of 7.4.526.
+Files: src/regexp_nfa.c
+
+Patch 7.4.528
+Problem: Crash when using matchadd() (Yasuhiro Matsumoto)
+Solution: Copy the match regprog.
+Files: src/screen.c
+
+Patch 7.4.529
+Problem: No test for what 7.4.517 fixes.
+Solution: Adjust the tests for breakindent. (Christian Brabandt)
+Files: src/testdir/test_breakindent.in, src/testdir/test_breakindent.ok
+
+Patch 7.4.530
+Problem: Many commands take a count or range that is not using line
+ numbers.
+Solution: For each command specify what kind of count it uses. For windows,
+ buffers and arguments have "$" and "." have a relevant meaning.
+ (Marcin Szamotulski)
+Files: runtime/doc/editing.txt, runtime/doc/tabpage.txt,
+ runtime/doc/windows.txt, src/Makefile, src/ex_cmds.h,
+ src/ex_docmd.c, src/testdir/Make_amiga.mak
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_argument_count.in,
+ src/testdir/test_argument_count.ok,
+ src/testdir/test_close_count.in, src/testdir/test_close_count.ok,
+ src/window.c
+
+Patch 7.4.531
+Problem: Comments about parsing an Ex command are wrong.
+Solution: Correct the step numbers.
+Files: src/ex_docmd.c
+
+Patch 7.4.532
+Problem: When using 'incsearch' "2/pattern/e" highlights the first match.
+Solution: Move the code to set extra_col inside the loop for count. (Ozaki
+ Kiichi)
+Files: src/search.c
+
+Patch 7.4.533
+Problem: ":hardcopy" leaks memory in case of errors.
+Solution: Free memory in all code paths. (Christian Brabandt)
+Files: src/hardcopy.c
+
+Patch 7.4.534
+Problem: Warnings when compiling if_ruby.c.
+Solution: Avoid the warnings. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 7.4.535 (after 7.4.530)
+Problem: Can't build with tiny features.
+Solution: Add #ifdefs and skip a test.
+Files: src/ex_docmd.c, src/testdir/test_argument_count.in
+
+Patch 7.4.536
+Problem: Test 63 fails when using a black&white terminal.
+Solution: Add attributes for a non-color terminal. (Christian Brabandt)
+Files: src/testdir/test63.in
+
+Patch 7.4.537
+Problem: Value of v:hlsearch reflects an internal variable.
+Solution: Make the value reflect whether search highlighting is actually
+ displayed. (Christian Brabandt)
+Files: runtime/doc/eval.txt, src/testdir/test101.in,
+ src/testdir/test101.ok, src/vim.h
+
+Patch 7.4.538
+Problem: Tests fail with small features plus Python.
+Solution: Disallow weird combination of options. Do not set "fdm" when
+ folding is disabled.
+Files: src/option.c, src/ex_cmds.c, src/configure.in, src/auto/configure,
+ src/feature.h
+
+Patch 7.4.539 (after 7.4.530)
+Problem: Crash when computing buffer count. Problem with range for user
+ commands. Line range wrong in Visual area.
+Solution: Avoid segfault in compute_buffer_local_count(). Check for
+ CMD_USER when checking type of range. (Marcin Szamotulski)
+Files: runtime/doc/windows.txt, src/ex_docmd.c
+
+Patch 7.4.540 (after 7.4.539)
+Problem: Cannot build with tiny and small features. (Taro Muraoka)
+Solution: Add #ifdef around CMD_USER.
+Files: src/ex_docmd.c
+
+Patch 7.4.541
+Problem: Crash when doing a range assign.
+Solution: Check for NULL pointer. (Yukihiro Nakadaira)
+Files: src/eval.c, src/testdir/test55.in, src/testdir/test55.ok
+
+Patch 7.4.542
+Problem: Using a range for window and buffer commands has a few problems.
+ Cannot specify the type of range for a user command.
+Solution: Add the -addr argument for user commands. Fix problems. (Marcin
+ Szamotulski)
+Files: src/testdir/test_command_count.in,
+ src/testdir/test_command_count.ok src/testdir/Make_amiga.mak
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, runtime/doc/map.txt, src/Makefile,
+ src/ex_cmds.h, src/ex_docmd.c, src/ex_getln.c,
+ src/proto/ex_docmd.pro, src/vim.h,
+
+Patch 7.4.543
+Problem: Since patch 7.4.232 "1,3s/\n//" joins two lines instead of three.
+ (Eliseo Martínez) Issue 287
+Solution: Correct the line count. (Christian Brabandt)
+ Also set the last used search pattern.
+Files: src/ex_cmds.c, src/search.c, src/proto/search.pro
+
+Patch 7.4.544
+Problem: Warnings for unused arguments when compiling with a combination of
+ features.
+Solution: Add "UNUSED".
+Files: src/if_cscope.c
+
+Patch 7.4.545
+Problem: Highlighting for multi-line matches is not correct.
+Solution: Stop highlight at the end of the match. (Hirohito Higashi)
+Files: src/screen.c
+
+Patch 7.4.546
+Problem: Repeated use of vim_snprintf() with a number.
+Solution: Move these vim_snprintf() calls into a function.
+Files: src/window.c
+
+Patch 7.4.547
+Problem: Using "vit" does not select a multibyte character at the end
+ correctly.
+Solution: Advance the cursor over the multibyte character. (Christian
+ Brabandt)
+Files: src/search.c
+
+Patch 7.4.548
+Problem: Compilation fails with native version of MinGW-w64, because
+ it doesn't have x86_64-w64-mingw32-windres.exe.
+Solution: Use windres instead. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.549
+Problem: Function name not recognized correctly when inside a function.
+Solution: Don't check for an alpha character. (Ozaki Kiichi)
+Files: src/eval.c, src/testdir/test_nested_function.in,
+ src/testdir/test_nested_function.ok, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile
+
+Patch 7.4.550
+Problem: curs_rows() function is always called with the second argument
+ false.
+Solution: Remove the argument. (Christian Brabandt)
+ validate_botline_win() can then also be removed.
+Files: src/move.c
+
+Patch 7.4.551
+Problem: "ygn" may yank too much. (Fritzophrenic) Issue 295.
+Solution: Check the width of the next match. (Christian Brabandt)
+Files: src/search.c, src/testdir/test53.in, src/testdir/test53.ok
+
+Patch 7.4.552
+Problem: Langmap applies to Insert mode expression mappings.
+Solution: Check for Insert mode. (Daniel Hahler)
+Files: src/getchar.c, src/testdir/test_mapping.in,
+ src/testdir/test_mapping.ok
+
+Patch 7.4.553
+Problem: Various small issues.
+Solution: Fix those issues.
+Files: src/ex_cmds.h, src/gui.h, src/message.c, src/testdir/test39.in,
+ src/proto/eval.pro, src/proto/misc1.pro, src/proto/ops.pro,
+ src/proto/screen.pro, src/proto/window.pro. src/os_unix.c,
+ src/Make_vms.mms, src/proto/os_vms.pro, src/INSTALL
+
+Patch 7.4.554
+Problem: Missing part of patch 7.4.519.
+Solution: Copy back regprog after calling vim_regexec.
+Files: src/quickfix.c
+
+Patch 7.4.555
+Problem: test_close_count may fail for some combination of features.
+Solution: Require normal features.
+Files: src/testdir/test_close_count.in
+
+Patch 7.4.556
+Problem: Failed commands in Python interface not handled correctly.
+Solution: Restore window and buffer on failure.
+Files: src/if_py_both.h
+
+Patch 7.4.557
+Problem: One more small issue.
+Solution: Update function proto.
+Files: src/proto/window.pro
+
+Patch 7.4.558
+Problem: When the X server restarts Vim may get stuck.
+Solution: Destroy the application context and create it again. (Issue 203)
+Files: src/os_unix.c
+
+Patch 7.4.559
+Problem: Appending a block in the middle of a tab does not work correctly
+ when virtualedit is set.
+Solution: Decrement spaces and count, don't reset them. (James McCoy)
+Files: src/ops.c, src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.4.560
+Problem: Memory leak using :wviminfo. Issue 296.
+Solution: Free memory when needed. (idea by Christian Brabandt)
+Files: src/ops.c
+
+Patch 7.4.561
+Problem: Ex range handling is wrong for buffer-local user commands.
+Solution: Check for CMD_USER_BUF. (Marcin Szamotulski)
+Files: src/ex_docmd.c, src/testdir/test_command_count.in,
+ src/testdir/test_command_count.ok
+
+Patch 7.4.562
+Problem: Segfault with wide screen and error in 'rulerformat'. (Ingo Karkat)
+Solution: Check there is enough space. (Christian Brabandt)
+Files: src/buffer.c, src/screen.c
+
+Patch 7.4.563
+Problem: No test for replacing on a tab in Virtual replace mode.
+Solution: Add a test. (Elias Diem)
+Files: src/testdir/test48.in, src/testdir/test48.ok
+
+Patch 7.4.564
+Problem: FEAT_OSFILETYPE is used even though it's never defined.
+Solution: Remove the code. (Christian Brabandt)
+Files: src/fileio.c
+
+Patch 7.4.565
+Problem: Ranges for arguments, buffers, tabs, etc. are not checked to be
+ valid but limited to the maximum. This can cause the wrong thing
+ to happen.
+Solution: Give an error for an invalid value. (Marcin Szamotulski)
+ Use windows range for ":wincmd".
+Files: src/ex_docmd.c, src/ex_cmds.h, src/testdir/test62.in,
+ src/testdir/test_argument_count.in,
+ src/testdir/test_argument_count.ok,
+ src/testdir/test_close_count.in,
+ src/testdir/test_command_count.in,
+ src/testdir/test_command_count.ok
+
+Patch 7.4.566
+Problem: :argdo, :bufdo, :windo and :tabdo don't take a range.
+Solution: Support the range. (Marcin Szamotulski)
+Files: runtime/doc/editing.txt, runtime/doc/tabpage.txt,
+ runtime/doc/windows.txt, src/ex_cmds.h, src/ex_cmds2.c,
+ src/testdir/test_command_count.in,
+ src/testdir/test_command_count.ok
+
+Patch 7.4.567
+Problem: Non-ascii vertical separator characters are always redrawn.
+Solution: Compare only the one byte that's stored. (Thiago Padilha)
+Files: src/screen.c
+
+Patch 7.4.568
+Problem: Giving an error for ":0wincmd w" is a problem for some plugins.
+Solution: Allow the zero in the range. (Marcin Szamotulski)
+Files: src/ex_docmd.c, src/testdir/test_command_count.ok
+
+Patch 7.4.569 (after 7.4.468)
+Problem: Having CTRL-C interrupt or not does not check the mode of the
+ mapping. (Ingo Karkat)
+Solution: Use a bitmask with the map mode. (Christian Brabandt)
+Files: src/getchar.c, src/structs.h, src/testdir/test_mapping.in,
+ src/testdir/test_mapping.ok, src/ui.c, src/globals.h
+
+Patch 7.4.570
+Problem: Building with dynamic library does not work for Ruby 2.2.0
+Solution: Change #ifdefs and #defines. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 7.4.571 (after 7.4.569)
+Problem: Can't build with tiny features. (Ike Devolder)
+Solution: Add #ifdef.
+Files: src/getchar.c
+
+Patch 7.4.572
+Problem: Address type of :wincmd depends on the argument.
+Solution: Check the argument.
+Files: src/ex_docmd.c, src/window.c, src/proto/window.pro
+
+Patch 7.4.573 (after 7.4.569)
+Problem: Mapping CTRL-C in Visual mode doesn't work. (Ingo Karkat)
+Solution: Call get_real_state() instead of using State directly.
+Files: src/ui.c, src/testdir/test_mapping.in, src/testdir/test_mapping.ok
+
+Patch 7.4.574
+Problem: No error for eval('$').
+Solution: Check for empty name. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.575
+Problem: Unicode character properties are outdated.
+Solution: Update the tables with the latest version.
+Files: src/mbyte.c
+
+Patch 7.4.576
+Problem: Redrawing problem with 'relativenumber' and 'linebreak'.
+Solution: Temporarily reset 'linebreak' and restore it in more places.
+ (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.4.577
+Problem: Matching with a virtual column has a lot of overhead on very long
+ lines. (Issue 310)
+Solution: Bail out early if there can't be a match. (Christian Brabandt)
+ Also check for CTRL-C at every position.
+Files: src/regexp_nfa.c
+
+Patch 7.4.578
+Problem: Using getcurpos() after "$" in an empty line returns a negative
+ number.
+Solution: Don't add one when this would overflow. (Hirohito Higashi)
+Files: src/eval.c
+
+Patch 7.4.579
+Problem: Wrong cursor positioning when 'linebreak' is set and lines wrap.
+Solution: Fix it. (Christian Brabandt)
+Files: src/charset.c, src/screen.c
+
+Patch 7.4.580
+Problem: ":52wincmd v" still gives an invalid range error. (Charles
+ Campbell)
+Solution: Skip over white space.
+Files: src/ex_docmd.c
+
+Patch 7.4.581
+Problem: Compiler warnings for uninitialized variables. (John Little)
+Solution: Initialize the variables.
+Files: src/ops.c
+
+Patch 7.4.582 (after 7.4.577)
+Problem: Can't match "%>80v" properly. (Axel Bender)
+Solution: Correctly handle ">". (Christian Brabandt)
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.583
+Problem: With tiny features test 16 may fail.
+Solution: Source small.vim. (Christian Brabandt)
+Files: src/testdir/test16.in
+
+Patch 7.4.584
+Problem: With tiny features test_command_count may fail.
+Solution: Source small.vim. (Christian Brabandt)
+Files: src/testdir/test_command_count.in
+
+Patch 7.4.585
+Problem: Range for :bdelete does not work. (Ronald Schild)
+Solution: Also allow unloaded buffers.
+Files: src/ex_cmds.h, src/testdir/test_command_count.in,
+ src/testdir/test_command_count.ok
+
+Patch 7.4.586
+Problem: Parallel building of the documentation html files is not reliable.
+Solution: Remove a cyclic dependency. (Reiner Herrmann)
+Files: runtime/doc/Makefile
+
+Patch 7.4.587
+Problem: Conceal does not work properly with 'linebreak'. (cs86661)
+Solution: Save and restore boguscols. (Christian Brabandt)
+Files: src/screen.c, src/testdir/test_listlbr_utf8.in,
+ src/testdir/test_listlbr_utf8.ok
+
+Patch 7.4.588
+Problem: ":0argedit foo" puts the new argument in the second place instead
+ of the first.
+Solution: Adjust the range type. (Ingo Karkat)
+Files: src/ex_cmds.h, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_argument_0count.in,
+ src/testdir/test_argument_0count.ok
+
+Patch 7.4.589
+Problem: In the MS-Windows console Vim can't handle greek characters when
+ encoding is utf-8.
+Solution: Escape K_NUL. (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.4.590
+Problem: Using ctrl_x_mode as if it contains flags.
+Solution: Don't use AND with CTRL_X_OMNI. (Hirohito Higashi)
+Files: src/edit.c
+
+Patch 7.4.591 (after 7.4.587)
+Problem: test_listlbr_utf8 fails when the conceal feature is not available.
+Solution: Check for the conceal feature. (Kazunobu Kuriyama)
+Files: src/testdir/test_listlbr_utf8.in
+
+Patch 7.4.592
+Problem: When doing ":e foobar" when already editing "foobar" and 'buftype'
+ is "nofile" the buffer is cleared. (Xavier de Gaye)
+Solution: Do no clear the buffer.
+Files: src/ex_cmds.c
+
+Patch 7.4.593
+Problem: Crash when searching for "x\{0,90000}". (Dominique Pelle)
+Solution: Bail out from the NFA engine when the max limit is much higher
+ than the min limit.
+Files: src/regexp_nfa.c, src/regexp.c, src/vim.h
+
+Patch 7.4.594
+Problem: Using a block delete while 'breakindent' is set does not work
+ properly.
+Solution: Use "line" instead of "prev_pend" as the first argument to
+ lbr_chartabsize_adv(). (Hirohito Higashi)
+Files: src/ops.c, src/testdir/test_breakindent.in,
+ src/testdir/test_breakindent.ok
+
+Patch 7.4.595
+Problem: The test_command_count test fails when using Japanese.
+Solution: Force the language to C. (Hirohito Higashi)
+Files: src/testdir/test_command_count.in
+
+Patch 7.4.596 (after 7.4.592)
+Problem: Tiny build doesn't compile. (Ike Devolder)
+Solution: Add #ifdef.
+Files: src/ex_cmds.c
+
+Patch 7.4.597
+Problem: Cannot change the result of systemlist().
+Solution: Initialize v_lock. (Yukihiro Nakadaira)
+Files: src/eval.c
+
+Patch 7.4.598
+Problem: ":tabdo windo echo 'hi'" causes "* register not to be changed.
+ (Salman Halim)
+Solution: Change how clip_did_set_selection is used and add
+ clipboard_needs_update and global_change_count. (Christian
+ Brabandt)
+Files: src/main.c, src/ui.c, src/testdir/test_eval.in,
+ src/testdir/test_eval.ok
+
+Patch 7.4.599
+Problem: Out-of-memory error.
+Solution: Avoid trying to allocate a negative amount of memory, use size_t
+ instead of int. (Dominique Pelle)
+Files: src/regexp_nfa.c
+
+Patch 7.4.600
+Problem: Memory wasted in struct because of aligning.
+Solution: Split pos in lnum and col. (Dominique Pelle)
+Files: src/regexp_nfa.c
+
+Patch 7.4.601
+Problem: It is not possible to have feedkeys() insert characters.
+Solution: Add the 'i' flag.
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 7.4.602
+Problem: ":set" does not accept hex numbers as documented.
+Solution: Use vim_str2nr(). (ZyX)
+Files: src/option.c, runtime/doc/options.txt
+
+Patch 7.4.603
+Problem: 'foldcolumn' may be set such that it fills the whole window, not
+ leaving space for text.
+Solution: Reduce the foldcolumn width when there is not sufficient room.
+ (idea by Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.4.604
+Problem: Running tests changes viminfo.
+Solution: Disable viminfo.
+Files: src/testdir/test_breakindent.in
+
+Patch 7.4.605
+Problem: The # register is not writable, it cannot be restored after
+ jumping around.
+Solution: Make the # register writable. (Marcin Szamotulski)
+Files: runtime/doc/change.txt, src/ops.c, src/buffer.c, src/globals.h
+
+Patch 7.4.606
+Problem: May crash when using a small window.
+Solution: Avoid dividing by zero. (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.4.607 (after 7.4.598)
+Problem: Compiler warnings for unused variables.
+Solution: Move them inside #ifdef. (Kazunobu Kuriyama)
+Files: src/ui.c
+
+Patch 7.4.608 (after 7.4.598)
+Problem: test_eval fails when the clipboard feature is missing.
+Solution: Skip part of the test. Reduce the text used.
+Files: src/testdir/test_eval.in, src/testdir/test_eval.ok
+
+Patch 7.4.609
+Problem: For complicated list and dict use the garbage collector can run
+ out of stack space.
+Solution: Use a stack of dicts and lists to be marked, thus making it
+ iterative instead of recursive. (Ben Fritz)
+Files: src/eval.c, src/if_lua.c, src/if_py_both.h, src/if_python.c,
+ src/if_python3.c, src/proto/eval.pro, src/proto/if_lua.pro,
+ src/proto/if_python.pro, src/proto/if_python3.pro, src/structs.h
+
+Patch 7.4.610
+Problem: Some function headers may be missing from generated .pro files.
+Solution: Add PROTO to the #ifdef.
+Files: src/option.c, src/syntax.c
+
+Patch 7.4.611 (after 7.4.609)
+Problem: Syntax error.
+Solution: Change statement to return.
+Files: src/if_python3.c
+
+Patch 7.4.612
+Problem: test_eval fails on Mac.
+Solution: Use the * register instead of the + register. (Jun Takimoto)
+Files: src/testdir/test_eval.in, src/testdir/test_eval.ok
+
+Patch 7.4.613
+Problem: The NFA engine does not implement the 'redrawtime' time limit.
+Solution: Implement the time limit.
+Files: src/regexp_nfa.c
+
+Patch 7.4.614
+Problem: There is no test for what patch 7.4.601 fixes.
+Solution: Add a test. (Christian Brabandt)
+Files: src/testdir/test_mapping.in, src/testdir/test_mapping.ok
+
+Patch 7.4.615
+Problem: Vim hangs when freeing a lot of objects.
+Solution: Do not go back to the start of the list every time. (Yasuhiro
+ Matsumoto and Ariya Mizutani)
+Files: src/eval.c
+
+Patch 7.4.616
+Problem: Cannot insert a tab in front of a block.
+Solution: Correctly compute aop->start. (Christian Brabandt)
+Files: src/ops.c, src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.4.617
+Problem: Wrong ":argdo" range does not cause an error.
+Solution: Reset "cmd" to NULL. (Marcin Szamotulski, Ingo Karkat)
+Files: src/ex_docmd.c
+
+Patch 7.4.618 (after 7.4.609)
+Problem: luaV_setref() is missing a return statement. (Ozaki Kiichi)
+Solution: Put the return statement back.
+Files: src/if_lua.c
+
+Patch 7.4.619 (after 7.4.618)
+Problem: luaV_setref() not returning the correct value.
+Solution: Return one.
+Files: src/if_lua.c
+
+Patch 7.4.620
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Initialize "did_free". (Ben Fritz)
+Files: src/eval.c
+
+Patch 7.4.621 (after 7.4.619)
+Problem: Returning 1 in the wrong function. (Raymond Ko)
+Solution: Return 1 in the right function (hopefully).
+Files: src/if_lua.c
+
+Patch 7.4.622
+Problem: Compiler warning for unused argument.
+Solution: Add UNUSED.
+Files: src/regexp_nfa.c
+
+Patch 7.4.623
+Problem: Crash with pattern: \(\)\{80000} (Dominique Pelle)
+Solution: When the max limit is large fall back to the old engine.
+Files: src/regexp_nfa.c
+
+Patch 7.4.624
+Problem: May leak memory or crash when vim_realloc() returns NULL.
+Solution: Handle a NULL value properly. (Mike Williams)
+Files: src/if_cscope.c, src/memline.c, src/misc1.c, src/netbeans.c
+
+Patch 7.4.625
+Problem: Possible NULL pointer dereference.
+Solution: Check for NULL before using it. (Mike Williams)
+Files: src/if_py_both.h
+
+Patch 7.4.626
+Problem: MSVC with W4 gives useless warnings.
+Solution: Disable more warnings. (Mike Williams)
+Files: src/vim.h
+
+Patch 7.4.627
+Problem: The last screen cell is not updated.
+Solution: Respect the "tn" termcap feature. (Hayaki Saito)
+Files: runtime/doc/term.txt, src/option.c, src/screen.c, src/term.c,
+ src/term.h
+
+Patch 7.4.628
+Problem: Compiler warning for variable might be clobbered by longjmp.
+Solution: Add volatile. (Michael Jarvis)
+Files: src/main.c
+
+Patch 7.4.629
+Problem: Coverity warning for Out-of-bounds read.
+Solution: Increase MAXWLEN to 254. (Eliseo Martínez)
+Files: src/spell.c
+
+Patch 7.4.630
+Problem: When using Insert mode completion combined with autocommands the
+ redo command may not work.
+Solution: Do not save the redo buffer when executing autocommands. (Yasuhiro
+ Matsumoto)
+Files: src/fileio.c
+
+Patch 7.4.631
+Problem: The default conceal character is documented to be a space but it's
+ initially a dash. (Christian Brabandt)
+Solution: Make the initial value a space.
+Files: src/globals.h
+
+Patch 7.4.632 (after 7.4.592)
+Problem: 7.4.592 breaks the netrw plugin, because the autocommands are
+ skipped.
+Solution: Roll back the change.
+Files: src/ex_cmds.c
+
+Patch 7.4.633
+Problem: After 7.4.630 the problem persists.
+Solution: Also skip redo when calling a user function.
+Files: src/eval.c
+
+Patch 7.4.634
+Problem: Marks are not restored after redo + undo.
+Solution: Fix the way marks are restored. (Olaf Dabrunz)
+Files: src/undo.c, src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_marks.in, src/testdir/test_marks.ok
+
+Patch 7.4.635
+Problem: If no NL or CR is found in the first block of a file then the
+ 'fileformat' may be set to "mac". (Issue 77)
+Solution: Check if a CR was found. (eswald)
+Files: src/fileio.c
+
+Patch 7.4.636
+Problem: A search with end offset gets stuck at end of file. (Gary Johnson)
+Solution: When a search doesn't move the cursor repeat it with a higher
+ count. (Christian Brabandt)
+Files: src/normal.c, src/testdir/test44.in, src/testdir/test44.ok
+
+Patch 7.4.637
+Problem: Incorrectly read the number of buffer for which an autocommand
+ should be registered.
+Solution: Reverse check for "<buffer=abuf>". (Lech Lorens)
+Files: src/fileio.c
+
+Patch 7.4.638
+Problem: Can't build with Lua 5.3 on Windows.
+Solution: use luaL_optinteger() instead of LuaL_optlong(). (Ken Takata)
+Files: src/if_lua.c
+
+Patch 7.4.639
+Problem: Combination of linebreak and conceal doesn't work well.
+Solution: Fix the display problems. (Christian Brabandt)
+Files: src/screen.c, src/testdir/test88.in, src/testdir/test88.ok,
+ src/testdir/test_listlbr_utf8.in, src/testdir/test_listlbr_utf8.ok
+
+Patch 7.4.640
+Problem: After deleting characters in Insert mode such that lines are
+ joined undo does not work properly. (issue 324)
+Solution: Use Insstart instead of Insstart_orig. (Christian Brabandt)
+Files: src/edit.c
+
+Patch 7.4.641
+Problem: The tabline menu was using ":999tabnew" which is now invalid.
+Solution: Use ":$tabnew" instead. (Florian Degner)
+Files: src/normal.c
+
+Patch 7.4.642
+Problem: When using "gf" escaped spaces are not handled.
+Solution: Recognize escaped spaces.
+Files: src/vim.h, src/window.c, src/misc2.c
+
+Patch 7.4.643
+Problem: Using the default file format for Mac files. (Issue 77)
+Solution: Reset the try_mac counter in the right place. (Oswald)
+Files: src/fileio.c, src/testdir/test30.in, src/testdir/test30.ok
+
+Patch 7.4.644
+Problem: Stratus VOS doesn't have sync().
+Solution: Use fflush(). (Karli Aurelia)
+Files: src/memfile.c
+
+Patch 7.4.645
+Problem: When splitting the window in a BufAdd autocommand while still in
+ the first, empty buffer the window count is wrong.
+Solution: Do not reset b_nwindows to zero and don't increment it.
+Files: src/buffer.c, src/ex_cmds.c
+
+Patch 7.4.646
+Problem: ":bufdo" may start at a deleted buffer.
+Solution: Find the first not deleted buffer. (Shane Harper)
+Files: src/ex_cmds2.c, src/testdir/test_command_count.in,
+ src/testdir/test_command_count.ok
+
+Patch 7.4.647
+Problem: After running the tests on MS-Windows many files differ from their
+ originals as they were checked out.
+Solution: Use a temp directory for executing the tests. (Ken Takata, Taro
+ Muraoka)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.4.648 (after 7.4.647)
+Problem: Tests broken on MS-Windows.
+Solution: Delete wrong copy line. (Ken Takata)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.4.649
+Problem: Compiler complains about ignoring return value of fwrite().
+ (Michael Jarvis)
+Solution: Add (void).
+Files: src/misc2.c
+
+Patch 7.4.650
+Problem: Configure check may fail because the dl library is not used.
+Solution: Put "-ldl" in LIBS rather than LDFLAGS. (Ozaki Kiichi)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.651 (after 7.4.582)
+Problem: Can't match "%>80v" properly for multibyte characters.
+Solution: Multiply the character number by the maximum number of bytes in a
+ character. (Yasuhiro Matsumoto)
+Files: src/regexp_nfa.c
+
+Patch 7.4.652
+Problem: Xxd lacks a few features.
+Solution: Use 8 characters for the file position. Add the -e and -o
+ arguments. (Vadim Vygonets)
+Files: src/xxd/xxd.c, runtime/doc/xxd.1
+
+Patch 7.4.653
+Problem: Insert mode completion with complete() may have CTRL-L work like
+ CTRL-P.
+Solution: Handle completion with complete() differently. (Yasuhiro
+ Matsumoto, Christian Brabandt, Hirohito Higashi)
+Files: src/edit.c
+
+Patch 7.4.654
+Problem: glob() and globpath() cannot include links to non-existing files.
+ (Charles Campbell)
+Solution: Add an argument to include all links with glob(). (James McCoy)
+ Also for globpath().
+Files: src/vim.h, src/eval.c, src/ex_getln.c
+
+Patch 7.4.655
+Problem: Text deleted by "dit" depends on indent of closing tag.
+ (Jan Parthey)
+Solution: Do not adjust oap->end in do_pending_operator(). (Christian
+ Brabandt)
+Files: src/normal.c, src/search.c, src/testdir/test53.in,
+ src/testdir/test53.ok
+
+Patch 7.4.656 (after 7.4.654)
+Problem: Missing changes for glob() in one file.
+Solution: Add the missing changes.
+Files: src/misc1.c
+
+Patch 7.4.657 (after 7.4.656)
+Problem: Compiler warnings for pointer mismatch.
+Solution: Add a typecast. (John Marriott)
+Files: src/misc1.c
+
+Patch 7.4.658
+Problem: 'formatexpr' is evaluated too often.
+Solution: Only invoke it when beyond the 'textwidth' column, as it is
+ documented. (James McCoy)
+Files: src/edit.c
+
+Patch 7.4.659
+Problem: When 'ruler' is set the preferred column is reset. (Issue 339)
+Solution: Don't set curswant when redrawing the status lines.
+Files: src/option.c
+
+Patch 7.4.660
+Problem: Using freed memory when g:colors_name is changed in the colors
+ script. (oni-link)
+Solution: Make a copy of the variable value.
+Files: src/syntax.c
+
+Patch 7.4.661
+Problem: Using "0 CTRL-D" in Insert mode may have CursorHoldI interfere.
+ (Gary Johnson)
+Solution: Don't store K_CURSORHOLD as the last character. (Christian
+ Brabandt)
+Files: src/edit.c
+
+Patch 7.4.662
+Problem: When 'M' is in the 'cpo' option then selecting a text object in
+ parentheses does not work correctly.
+Solution: Keep 'M' in 'cpo' when finding a match. (Hirohito Higashi)
+Files: src/search.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_textobjects.in,
+ src/testdir/test_textobjects.ok
+
+Patch 7.4.663
+Problem: When using netbeans a buffer is not found in another tab.
+Solution: When 'switchbuf' is set to "usetab" then switch to another tab
+ when possible. (Xavier de Gaye)
+Files: src/netbeans.c
+
+Patch 7.4.664
+Problem: When 'compatible' is reset 'numberwidth' is set to 4, but the
+ effect doesn't show until a change is made.
+Solution: Check if 'numberwidth' changed. (Christian Brabandt)
+Files: src/screen.c, src/structs.h
+
+Patch 7.4.665
+Problem: 'linebreak' does not work properly with multibyte characters.
+Solution: Compute the pointer offset with mb_head_off(). (Yasuhiro
+ Matsumoto)
+Files: src/screen.c
+
+Patch 7.4.666
+Problem: There is a chance that Vim may lock up.
+Solution: Handle timer events differently. (Aaron Burrow)
+Files: src/os_unix.c
+
+Patch 7.4.667
+Problem: 'colorcolumn' isn't drawn in a closed fold while 'cursorcolumn'
+ is. (Carlos Pita)
+Solution: Make it consistent. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.4.668
+Problem: Can't use a glob pattern as a regexp pattern.
+Solution: Add glob2regpat(). (Christian Brabandt)
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 7.4.669
+Problem: When netbeans is active the sign column always shows up.
+Solution: Only show the sign column once a sign has been added. (Xavier de
+ Gaye)
+Files: src/buffer.c, src/edit.c, src/move.c, src/netbeans.c,
+ src/screen.c, src/structs.h
+
+Patch 7.4.670
+Problem: Using 'cindent' for Javascript is less than perfect.
+Solution: Improve indenting of continuation lines. (Hirohito Higashi)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.4.671 (after 7.4.665)
+Problem: Warning for shadowing a variable.
+Solution: Rename off to mb_off. (Kazunobu Kuriyama)
+Files: src/screen.c
+
+Patch 7.4.672
+Problem: When completing a shell command, directories in the current
+ directory are not listed.
+Solution: When "." is not in $PATH also look in the current directory for
+ directories.
+Files: src/ex_getln.c, src/vim.h, src/misc1.c, src/eval.c,
+ src/os_amiga.c, src/os_msdos.c, src/os_unix.c, src/os_vms.c,
+ src/proto/os_amiga.pro, src/proto/os_msdos.pro,
+ src/proto/os_unix.pro, src/proto/os_win32.pro
+
+Patch 7.4.673
+Problem: The first syntax entry gets sequence number zero, which doesn't
+ work. (Clinton McKay)
+Solution: Start at number one. (Bjorn Linse)
+Files: src/syntax.c
+
+Patch 7.4.674 (after 7.4.672)
+Problem: Missing changes in one file.
+Solution: Also change the win32 file.
+Files: src/os_win32.c
+
+Patch 7.4.675
+Problem: When a FileReadPost autocommand moves the cursor inside a line it
+ gets moved back.
+Solution: When checking whether an autocommand moved the cursor store the
+ column as well. (Christian Brabandt)
+Files: src/ex_cmds.c
+
+Patch 7.4.676
+Problem: On Mac, when not using the default Python framework configure
+ doesn't do the right thing.
+Solution: Use a linker search path. (Kazunobu Kuriyama)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.677 (after 7.4.676)
+Problem: Configure fails when specifying a python-config-dir. (Lcd)
+Solution: Check if PYTHONFRAMEWORKPREFIX is set.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.678
+Problem: When using --remote the directory may end up being wrong.
+Solution: Use localdir() to find out what to do. (Xaizek)
+Files: src/main.c
+
+Patch 7.4.679
+Problem: Color values greater than 255 cause problems on MS-Windows.
+Solution: Truncate to 255 colors. (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.4.680
+Problem: CTRL-W in Insert mode does not work well for multibyte
+ characters.
+Solution: Use mb_get_class(). (Yasuhiro Matsumoto)
+Files: src/edit.c, src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_erasebackword.in,
+ src/testdir/test_erasebackword.ok,
+
+Patch 7.4.681
+Problem: MS-Windows: When Vim is minimized the window height is computed
+ incorrectly.
+Solution: When minimized use the previously computed size. (Ingo Karkat)
+Files: src/gui_w32.c
+
+Patch 7.4.682
+Problem: The search highlighting and match highlighting replaces the
+ cursorline highlighting, this doesn't look good.
+Solution: Combine the highlighting. (Yasuhiro Matsumoto)
+Files: src/screen.c
+
+Patch 7.4.683
+Problem: Typo in the vimtutor command.
+Solution: Fix the typo. (Corey Farwell, github pull 349)
+Files: vimtutor.com
+
+Patch 7.4.684
+Problem: When starting several Vim instances in diff mode, the temp files
+ used may not be unique. (Issue 353)
+Solution: Add an argument to vim_tempname() to keep the file.
+Files: src/diff.c, src/eval.c, src/ex_cmds.c, src/fileio.c,
+ src/hardcopy.c, src/proto/fileio.pro, src/if_cscope.c,
+ src/memline.c, src/misc1.c, src/os_unix.c, src/quickfix.c,
+ src/spell.c
+
+Patch 7.4.685
+Problem: When there are illegal utf-8 characters the old regexp engine may
+ go past the end of a string.
+Solution: Only advance to the end of the string. (Dominique Pelle)
+Files: src/regexp.c
+
+Patch 7.4.686
+Problem: "zr" and "zm" do not take a count.
+Solution: Implement the count, restrict the fold level to the maximum
+ nesting depth. (Marcin Szamotulski)
+Files: runtime/doc/fold.txt, src/normal.c
+
+Patch 7.4.687
+Problem: There is no way to use a different in Replace mode for a terminal.
+Solution: Add t_SR. (Omar Sandoval)
+Files: runtime/doc/options.txt, runtime/doc/term.txt,
+ runtime/syntax/vim.vim, src/option.c, src/term.c, src/term.h
+
+Patch 7.4.688
+Problem: When "$" is in 'cpo' the popup menu isn't undrawn correctly.
+ (Issue 166)
+Solution: When using the popup menu remove the "$".
+Files: src/edit.c
+
+Patch 7.4.689
+Problem: On MS-Windows, when 'autochdir' is set, diff mode with files in
+ different directories does not work. (Axel Bender)
+Solution: Remember the current directory and use it where needed. (Christian
+ Brabandt)
+Files: src/main.c
+
+Patch 7.4.690
+Problem: Memory access errors when changing indent in Ex mode. Also missing
+ redraw when using CTRL-U. (Knil Ino)
+Solution: Update pointers after calling ga_grow().
+Files: src/ex_getln.c
+
+Patch 7.4.691 (after 7.4.689)
+Problem: Can't build with MzScheme.
+Solution: Change "cwd" into the global variable "start_dir".
+Files: src/main.c
+
+Patch 7.4.692
+Problem: Defining SOLARIS for no good reason. (Danek Duvall)
+Solution: Remove it.
+Files: src/os_unix.h
+
+Patch 7.4.693
+Problem: Session file is not correct when there are multiple tab pages.
+Solution: Reset the current window number for each tab page. (Jacob Niehus)
+Files: src/ex_docmd.c
+
+Patch 7.4.694
+Problem: Running tests changes the .viminfo file.
+Solution: Disable viminfo in the text objects test.
+Files: src/testdir/test_textobjects.in
+
+Patch 7.4.695
+Problem: Out-of-bounds read, detected by Coverity.
+Solution: Remember the value of cmap for the first matching encoding. Reset
+ cmap to that value if first matching encoding is going to be used.
+ (Eliseo Martínez)
+Files: src/hardcopy.c
+
+Patch 7.4.696
+Problem: Not freeing memory when encountering an error.
+Solution: Free the stack before returning. (Eliseo Martínez)
+Files: src/regexp_nfa.c
+
+Patch 7.4.697
+Problem: The filename used for ":profile" must be given literally.
+Solution: Expand "~" and environment variables. (Marco Hinz)
+Files: src/ex_cmds2.c
+
+Patch 7.4.698
+Problem: Various problems with locked and fixed lists and dictionaries.
+Solution: Disallow changing locked items, fix a crash, add tests. (Olaf
+ Dabrunz)
+Files: src/structs.h, src/eval.c, src/testdir/test55.in,
+ src/testdir/test55.ok
+
+Patch 7.4.699
+Problem: E315 when trying to delete a fold. (Yutao Yuan)
+Solution: Make sure the fold doesn't go beyond the last buffer line.
+ (Christian Brabandt)
+Files: src/fold.c
+
+Patch 7.4.700
+Problem: Fold can't be opened after ":move". (Ein Brown)
+Solution: Delete the folding information and update it afterwards.
+ (Christian Brabandt)
+Files: src/ex_cmds.c, src/fold.c, src/testdir/test45.in,
+ src/testdir/test45.ok
+
+Patch 7.4.701
+Problem: Compiler warning for using uninitialized variable. (Yasuhiro
+ Matsumoto)
+Solution: Initialize it.
+Files: src/hardcopy.c
+
+Patch 7.4.702
+Problem: Joining an empty list does unnecessary work.
+Solution: Let join() return early. (Marco Hinz)
+Files: src/eval.c
+
+Patch 7.4.703
+Problem: Compiler warning for start_dir unused when building unittests.
+Solution: Move start_dir inside the #ifdef.
+Files: src/main.c
+
+Patch 7.4.704
+Problem: Searching for a character matches an illegal byte and causes
+ invalid memory access. (Dominique Pelle)
+Solution: Do not match an invalid byte when search for a character in a
+ string. Fix equivalence classes using negative numbers, which
+ result in illegal bytes.
+Files: src/misc2.c, src/regexp.c, src/testdir/test44.in
+
+Patch 7.4.705
+Problem: Can't build with Ruby 2.2.
+Solution: Add #ifdefs to handle the incompatible change. (Andrei Olsen)
+Files: src/if_ruby.c
+
+Patch 7.4.706
+Problem: Window drawn wrong when 'laststatus' is zero and there is a
+ command-line window. (Yclept Nemo)
+Solution: Set the status height a bit later. (Christian Brabandt)
+Files: src/window.c
+
+Patch 7.4.707
+Problem: Undo files can have their executable bit set.
+Solution: Strip of the executable bit. (Mikael Berthe)
+Files: src/undo.c
+
+Patch 7.4.708
+Problem: gettext() is called too often.
+Solution: Do not call gettext() for messages until they are actually used.
+ (idea by Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.709
+Problem: ":tabmove" does not work as documented.
+Solution: Make it work consistently. Update documentation and add tests.
+ (Hirohito Higashi)
+Files: src/window.c, runtime/doc/tabpage.txt, src/ex_docmd.c,
+ src/testdir/test62.in, src/testdir/test62.ok
+
+Patch 7.4.710
+Problem: It is not possible to make spaces visible in list mode.
+Solution: Add the "space" item to 'listchars'. (David Bürgin, issue 350)
+Files: runtime/doc/options.txt, src/globals.h, src/message.h,
+ src/screen.c, src/testdir/test_listchars.in,
+ src/testdir/test_listchars.ok, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile
+
+Patch 7.4.711 (after 7.4.710)
+Problem: Missing change in one file.
+Solution: Also change option.c
+Files: src/option.c
+
+Patch 7.4.712 (after 7.4.710)
+Problem: Missing change in another file.
+Solution: Also change message.c
+Files: src/message.c
+
+Patch 7.4.713
+Problem: Wrong condition for #ifdef.
+Solution: Change USR_EXRC_FILE2 to USR_VIMRC_FILE2. (Mikael Fourrier)
+Files: src/os_unix.h
+
+Patch 7.4.714
+Problem: Illegal memory access when there are illegal bytes.
+Solution: Check the byte length of the character. (Dominique Pelle)
+Files: src/regexp.c
+
+Patch 7.4.715
+Problem: Invalid memory access when there are illegal bytes.
+Solution: Get the length from the text, not from the character. (Dominique
+ Pelle)
+Files: src/regexp_nfa.c
+
+Patch 7.4.716
+Problem: When using the 'c' flag of ":substitute" and selecting "a" or "l"
+ at the prompt the flags are not remembered for ":&&". (Ingo
+ Karkat)
+Solution: Save the flag values and restore them. (Hirohito Higashi)
+Files: src/ex_cmds.c
+
+Patch 7.4.717
+Problem: ":let list += list" can change a locked list.
+Solution: Check for the lock earlier. (Olaf Dabrunz)
+Files: src/eval.c, src/testdir/test55.in, src/testdir/test55.ok
+
+Patch 7.4.718
+Problem: Autocommands triggered by quickfix cannot get the current title
+ value.
+Solution: Set w:quickfix_title earlier. (Yannick)
+ Also move the check for a title into the function.
+Files: src/quickfix.c
+
+Patch 7.4.719
+Problem: Overflow when adding MAXCOL to a pointer.
+Solution: Subtract pointers instead. (James McCoy)
+Files: src/screen.c
+
+Patch 7.4.720
+Problem: Can't build with Visual Studio 2015.
+Solution: Recognize the "version 14" numbers and omit /nodefaultlib when
+ appropriate. (Paul Moore)
+Files: src/Make_mvc.mak
+
+Patch 7.4.721
+Problem: When 'list' is set Visual mode does not highlight anything in
+ empty lines. (mgaleski)
+Solution: Check the value of lcs_eol in another place. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.4.722
+Problem: 0x202f is not recognized as a non-breaking space character.
+Solution: Add 0x202f to the list. (Christian Brabandt)
+Files: runtime/doc/options.txt, src/message.c, src/screen.c
+
+Patch 7.4.723
+Problem: For indenting, finding the C++ baseclass can be slow.
+Solution: Cache the result. (Hirohito Higashi)
+Files: src/misc1.c
+
+Patch 7.4.724
+Problem: Vim icon does not show in Windows context menu. (issue 249)
+Solution: Load the icon in GvimExt.
+Files: src/GvimExt/gvimext.cpp, src/GvimExt/gvimext.h
+
+Patch 7.4.725
+Problem: ":call setreg('"', [])" reports an internal error.
+Solution: Make the register empty. (Yasuhiro Matsumoto)
+Files: src/ops.c
+
+Patch 7.4.726 (after 7.4.724)
+Problem: Cannot build GvimExt.
+Solution: Set APPVER to 5.0. (KF Leong)
+Files: src/GvimExt/Makefile
+
+Patch 7.4.727 (after 7.4.724)
+Problem: Cannot build GvimExt with MingW.
+Solution: Add -lgdi32. (KF Leong)
+Files: src/GvimExt/Make_ming.mak
+
+Patch 7.4.728
+Problem: Can't build with some version of Visual Studio 2015.
+Solution: Recognize another version 14 number. (Sinan)
+Files: src/Make_mvc.mak
+
+Patch 7.4.729 (after 7.4.721)
+Problem: Occasional crash with 'list' set.
+Solution: Fix off-by-one error. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 7.4.730
+Problem: When setting the crypt key and using a swap file, text may be
+ encrypted twice or unencrypted text remains in the swap file.
+ (Issue 369)
+Solution: Call ml_preserve() before re-encrypting. Set correct index for
+ next pointer block.
+Files: src/memfile.c, src/memline.c, src/proto/memline.pro, src/option.c
+
+Patch 7.4.731
+Problem: The tab menu shows "Close tab" even when it doesn't work.
+Solution: Don't show "Close tab" for the last tab. (John Marriott)
+Files: src/gui_w48.c, src/gui_gtk_x11.c, src/gui_mac.c, src/gui_motif.c
+
+Patch 7.4.732
+Problem: The cursor line is not always updated for the "O" command.
+Solution: Reset the VALID_CROW flag. (Christian Brabandt)
+Files: src/normal.c
+
+Patch 7.4.733
+Problem: test_listchars breaks on MS-Windows. (Kenichi Ito)
+Solution: Set fileformat to "unix". (Christian Brabandt)
+Files: src/testdir/test_listchars.in
+
+Patch 7.4.734
+Problem: ml_get error when using "p" in a Visual selection in the last
+ line.
+Solution: Change the behavior at the last line. (Yukihiro Nakadaira)
+Files: src/normal.c, src/ops.c, src/testdir/test94.in,
+ src/testdir/test94.ok
+
+Patch 7.4.735
+Problem: Wrong argument for sizeof().
+Solution: Use a pointer argument. (Chris Hall)
+Files: src/eval.c
+
+Patch 7.4.736
+Problem: Invalid memory access.
+Solution: Avoid going over the end of a NUL terminated string. (Dominique
+ Pelle)
+Files: src/regexp.c
+
+Patch 7.4.737
+Problem: On MS-Windows vimgrep over arglist doesn't work (Issue 361)
+Solution: Only escape backslashes in ## expansion when it is not used as the
+ path separator. (James McCoy)
+Files: src/ex_docmd.c
+
+Patch 7.4.738 (after 7.4.732)
+Problem: Can't compile without the syntax highlighting feature.
+Solution: Add #ifdef around use of w_p_cul. (Hirohito Higashi)
+Files: src/normal.c, src/screen.c
+
+Patch 7.4.739
+Problem: In a string "\U" only takes 4 digits, while after CTRL-V U eight
+ digits can be used.
+Solution: Make "\U" also take eight digits. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.4.740
+Problem: ":1quit" works like ":.quit". (Bohr Shaw)
+Solution: Don't exit Vim when a range is specified. (Christian Brabandt)
+Files: src/ex_docmd.c, src/testdir/test13.in, src/testdir/test13.ok
+
+Patch 7.4.741
+Problem: When using += with ":set" a trailing comma is not recognized.
+ (Issue 365)
+Solution: Don't add a second comma. Add a test. (partly by Christian
+ Brabandt)
+Files: src/option.c, src/testdir/test_set.in, src/testdir/test_set.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.742
+Problem: Cannot specify a vertical split when loading a buffer for a
+ quickfix command.
+Solution: Add the "vsplit" value to 'switchbuf'. (Brook Hong)
+Files: runtime/doc/options.txt, src/buffer.c, src/option.h
+
+Patch 7.4.743
+Problem: "p" in Visual mode causes an unexpected line split.
+Solution: Advance the cursor first. (Yukihiro Nakadaira)
+Files: src/ops.c, src/testdir/test94.in, src/testdir/test94.ok
+
+Patch 7.4.744
+Problem: No tests for Ruby and Perl.
+Solution: Add minimal tests. (Ken Takata)
+Files: src/testdir/test_perl.in, src/testdir/test_perl.ok,
+ src/testdir/test_ruby.in, src/testdir/test_ruby.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.745
+Problem: The entries added by matchaddpos() are returned by getmatches()
+ but can't be set with setmatches(). (Lcd)
+Solution: Fix setmatches(). (Christian Brabandt)
+Files: src/eval.c, src/testdir/test63.in, src/testdir/test63.ok
+
+Patch 7.4.746
+Problem: ":[count]tag" is not always working. (cs86661)
+Solution: Set cur_match a bit later. (Hirohito Higashi)
+Files: src/tag.c,
+
+Patch 7.4.747
+Problem: ":cnext" may jump to the wrong column when setting
+ 'virtualedit=all' (cs86661)
+Solution: Reset the coladd field. (Hirohito Higashi)
+Files: src/quickfix.c
+
+Patch 7.4.748 (after 7.4.745)
+Problem: Buffer overflow.
+Solution: Make the buffer larger. (Kazunobu Kuriyama)
+Files: src/eval.c
+
+Patch 7.4.749 (after 7.4.741)
+Problem: For some options two consecutive commas are OK. (Nikolai Pavlov)
+Solution: Add the P_ONECOMMA flag.
+Files: src/option.c
+
+Patch 7.4.750
+Problem: Cannot build with clang 3.5 on Cygwin with perl enabled.
+Solution: Strip "-fdebug-prefix-map" in configure. (Ken Takata)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.751
+Problem: It is not obvious how to enable the address sanitizer.
+Solution: Add commented-out flags in the Makefile. (Dominique Pelle)
+ Also add missing test targets.
+Files: src/Makefile
+
+Patch 7.4.752
+Problem: Unicode 8.0 not supported.
+Solution: Update tables for Unicode 8.0. Avoid E36 when running the script.
+ (James McCoy)
+Files: runtime/tools/unicode.vim, src/mbyte.c
+
+Patch 7.4.753
+Problem: Appending in Visual mode with 'linebreak' set does not work
+ properly. Also when 'selection' is "exclusive". (Ingo Karkat)
+Solution: Recalculate virtual columns. (Christian Brabandt)
+Files: src/normal.c, src/testdir/test_listlbr.in,
+ src/testdir/test_listlbr.ok, src/testdir/test_listlbr_utf8.in,
+ src/testdir/test_listlbr_utf8.ok
+
+Patch 7.4.754
+Problem: Using CTRL-A in Visual mode does not work well. (Gary Johnson)
+Solution: Make it increment all numbers in the Visual area. (Christian
+ Brabandt)
+Files: runtime/doc/change.txt, src/normal.c, src/ops.c,
+ src/proto/ops.pro, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_increment.in,
+ src/testdir/test_increment.ok
+
+Patch 7.4.755
+Problem: It is not easy to count the number of characters.
+Solution: Add the skipcc argument to strchars(). (Hirohito Higashi, Ken
+ Takata)
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_utf8.in,
+ src/testdir/test_utf8.ok
+
+Patch 7.4.756
+Problem: Can't use strawberry Perl 5.22 x64 on MS-Windows.
+Solution: Add new defines and #if. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/if_perl.xs
+
+Patch 7.4.757
+Problem: Cannot detect the background color of a terminal.
+Solution: Add T_RBG to request the background color if possible. (Lubomir
+ Rintel)
+Files: src/main.c, src/term.c, src/term.h, src/proto/term.pro
+
+Patch 7.4.758
+Problem: When 'conceallevel' is 1 and quitting the command-line window with
+ CTRL-C the first character ':' is erased.
+Solution: Reset 'conceallevel' in the command-line window. (Hirohito
+ Higashi)
+Files: src/ex_getln.c
+
+Patch 7.4.759
+Problem: Building with Lua 5.3 doesn't work, symbols have changed.
+Solution: Use the new names for the new version. (Felix Schnizlein)
+Files: src/if_lua.c
+
+Patch 7.4.760
+Problem: Spelling mistakes are not displayed after ":syn spell".
+Solution: Force a redraw after ":syn spell" command. (Christian Brabandt)
+Files: src/syntax.c
+
+Patch 7.4.761 (after 7.4.757)
+Problem: The request-background termcode implementation is incomplete.
+Solution: Add the missing pieces.
+Files: src/option.c, src/term.c
+
+Patch 7.4.762 (after 7.4.757)
+Problem: Comment for may_req_bg_color() is wrong. (Christ van Willegen)
+Solution: Rewrite the comment.
+Files: src/term.c
+
+Patch 7.4.763 (after 7.4.759)
+Problem: Building with Lua 5.1 doesn't work.
+Solution: Define lua_replace and lua_remove. (KF Leong)
+Files: src/if_lua.c
+
+Patch 7.4.764 (after 7.4.754)
+Problem: test_increment fails on MS-Windows. (Ken Takata)
+Solution: Clear Visual mappings. (Taro Muraoka)
+Files: src/testdir/test_increment.in
+
+Patch 7.4.765 (after 7.4.754)
+Problem: CTRL-A and CTRL-X in Visual mode do not always work well.
+Solution: Improvements for increment and decrement. (Christian Brabandt)
+Files: src/normal.c, src/ops.c, src/testdir/test_increment.in,
+ src/testdir/test_increment.ok
+
+Patch 7.4.766 (after 7.4.757)
+Problem: Background color check does not work on Tera Term.
+Solution: Also recognize ST as a termination character. (Hirohito Higashi)
+Files: src/term.c
+
+Patch 7.4.767
+Problem: --remote-tab-silent can fail on MS-Windows.
+Solution: Use single quotes to avoid problems with backslashes. (Idea by
+ Weiyong Mao)
+Files: src/main.c
+
+Patch 7.4.768
+Problem: :diffoff only works properly once.
+Solution: Also make :diffoff work when used a second time. (Olaf Dabrunz)
+Files: src/diff.c
+
+Patch 7.4.769 (after 7.4 768)
+Problem: Behavior of :diffoff is not tested.
+Solution: Add a bit of testing. (Olaf Dabrunz)
+Files: src/testdir/test47.in, src/testdir/test47.ok
+
+Patch 7.4.770 (after 7.4.766)
+Problem: Background color response with transparency is not ignored.
+Solution: Change the way escape sequences are recognized. (partly by
+ Hirohito Higashi)
+Files: src/ascii.h, src/term.c
+
+Patch 7.4.771
+Problem: Search does not handle multibyte character at the start position
+ correctly.
+Solution: Take byte size of character into account. (Yukihiro Nakadaira)
+Files: src/search.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_search_mbyte.in,
+ src/testdir/test_search_mbyte.ok
+
+Patch 7.4.772
+Problem: Racket 6.2 is not supported on MS-Windows.
+Solution: Check for the "racket" subdirectory. (Weiyong Mao)
+Files: src/Make_mvc.mak, src/if_mzsch.c
+
+Patch 7.4.773
+Problem: 'langmap' is used in command-line mode when checking for mappings.
+ Issue 376.
+Solution: Do not use 'langmap' in command-line mode. (Larry Velazquez)
+Files: src/getchar.c, src/testdir/test_mapping.in,
+ src/testdir/test_mapping.ok
+
+Patch 7.4.774
+Problem: When using the CompleteDone autocommand event it's difficult to
+ get to the completed items.
+Solution: Add the v:completed_items variable. (Shougo Matsu)
+Files: runtime/doc/autocmd.txt, runtime/doc/eval.txt, src/edit.c,
+ src/eval.c, src/macros.h, src/proto/eval.pro, src/vim.h
+
+Patch 7.4.775
+Problem: It is not possible to avoid using the first item of completion.
+Solution: Add the "noinsert" and "noselect" values to 'completeopt'. (Shougo
+ Matsu)
+Files: runtime/doc/options.txt, src/edit.c, src/option.c
+
+Patch 7.4.776
+Problem: Equivalence class for 'd' does not work correctly.
+Solution: Fix 0x1e0f and 0x1d0b. (Dominique Pelle)
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.4.777
+Problem: The README file doesn't look nice on github.
+Solution: Add a markdown version of the README file.
+Files: Filelist, README.md
+
+Patch 7.4.778
+Problem: Coverity warns for uninitialized variable.
+Solution: Change condition of assignment.
+Files: src/ops.c
+
+Patch 7.4.779
+Problem: Using CTRL-A in a line without a number moves the cursor. May
+ cause a crash when at the start of the line. (Urtica Dioica)
+Solution: Do not move the cursor if no number was changed.
+Files: src/ops.c
+
+Patch 7.4.780
+Problem: Compiler complains about uninitialized variable and clobbered
+ variables.
+Solution: Add Initialization. Make variables static.
+Files: src/ops.c, src/main.c
+
+Patch 7.4.781
+Problem: line2byte() returns one less when 'bin' and 'noeol' are set.
+Solution: Only adjust the size for the last line. (Rob Wu)
+Files: src/memline.c
+
+Patch 7.4.782
+Problem: Still a few problems with CTRL-A and CTRL-X in Visual mode.
+Solution: Fix the reported problems. (Christian Brabandt)
+Files: src/charset.c, src/eval.c, src/ex_cmds.c, src/ex_getln.c,
+ src/misc2.c, src/normal.c, src/ops.c, src/option.c,
+ src/proto/charset.pro, src/testdir/test_increment.in,
+ src/testdir/test_increment.ok
+
+Patch 7.4.783
+Problem: copy_chars() and copy_spaces() are inefficient.
+Solution: Use memset() instead. (Dominique Pelle)
+Files: src/ex_getln.c, src/misc2.c, src/ops.c, src/proto/misc2.pro,
+ src/screen.c
+
+Patch 7.4.784
+Problem: Using both "noinsert" and "noselect" in 'completeopt' does not
+ work properly.
+Solution: Change the ins_complete() calls. (Ozaki Kiichi)
+Files: src/edit.c
+
+Patch 7.4.785
+Problem: On some systems automatically adding the missing EOL causes
+ problems. Setting 'binary' has too many side effects.
+Solution: Add the 'fixeol' option, default on. (Pavel Samarkin)
+Files: src/buffer.c, src/fileio.c, src/memline.c, src/netbeans.c,
+ src/ops.c, src/option.c, src/option.h, src/os_unix.c,
+ src/os_win32.c, src/structs.h, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_fixeol.in,
+ src/testdir/test_fixeol.ok, runtime/doc/options.txt,
+ runtime/optwin.vim
+
+Patch 7.4.786
+Problem: It is not possible for a plugin to adjust to a changed setting.
+Solution: Add the OptionSet autocommand event. (Christian Brabandt)
+Files: runtime/doc/autocmd.txt, runtime/doc/eval.txt, src/eval.c,
+ src/fileio.c, src/option.c, src/proto/eval.pro,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_autocmd_option.in,
+ src/testdir/test_autocmd_option.ok, src/vim.h
+
+Patch 7.4.787 (after 7.4.786)
+Problem: snprintf() isn't available everywhere.
+Solution: Use vim_snprintf(). (Ken Takata)
+Files: src/option.c
+
+Patch 7.4.788 (after 7.4.787)
+Problem: Can't build without the crypt feature. (John Marriott)
+Solution: Add #ifdef's.
+Files: src/option.c
+
+Patch 7.4.789 (after 7.4.788)
+Problem: Using freed memory and crash. (Dominique Pelle)
+Solution: Correct use of pointers. (Hirohito Higashi)
+Files: src/option.c
+
+Patch 7.4.790 (after 7.4.786)
+Problem: Test fails when the autochdir feature is not available. Test
+ output contains the test script.
+Solution: Check for the autochdir feature. (Kazunobu Kuriyama) Only write
+ the relevant test output.
+Files: src/testdir/test_autocmd_option.in,
+ src/testdir/test_autocmd_option.ok
+
+Patch 7.4.791
+Problem: The buffer list can be very long.
+Solution: Add an argument to ":ls" to specify the type of buffer to list.
+ (Marcin Szamotulski)
+Files: runtime/doc/windows.txt, src/buffer.c, src/ex_cmds.h
+
+Patch 7.4.792
+Problem: Can only conceal text by defining syntax items.
+Solution: Use matchadd() to define concealing. (Christian Brabandt)
+Files: runtime/doc/eval.txt, src/eval.c, src/ex_docmd.c,
+ src/proto/window.pro, src/screen.c, src/structs.h,
+ src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_match_conceal.in,
+ src/testdir/test_match_conceal.ok, src/window.c
+
+Patch 7.4.793
+Problem: Can't specify when not to ring the bell.
+Solution: Add the 'belloff' option. (Christian Brabandt)
+Files: runtime/doc/options.txt, src/edit.c, src/ex_getln.c,
+ src/hangulin.c, src/if_lua.c, src/if_mzsch.c, src/if_tcl.c,
+ src/message.c, src/misc1.c, src/normal.c, src/option.c,
+ src/option.h, src/proto/misc1.pro, src/search.c, src/spell.c
+
+Patch 7.4.794
+Problem: Visual Studio 2015 is not recognized.
+Solution: Add the version numbers to the makefile. (Taro Muraoka)
+Files: src/Make_mvc.mak
+
+Patch 7.4.795
+Problem: The 'fixeol' option is not copied to a new window.
+Solution: Copy the option value. (Yasuhiro Matsumoto)
+Files: src/option.c
+
+Patch 7.4.796
+Problem: Warning from 64 bit compiler.
+Solution: Add type cast. (Mike Williams)
+Files: src/ops.c
+
+Patch 7.4.797
+Problem: Crash when using more lines for the command line than
+ 'maxcombine'.
+Solution: Use the correct array index. Also, do not try redrawing when
+ exiting. And use screen_Columns instead of Columns.
+Files: src/screen.c
+
+Patch 7.4.798 (after 7.4.753)
+Problem: Repeating a change in Visual mode does not work as expected.
+ (Urtica Dioica)
+Solution: Make redo in Visual mode work better. (Christian Brabandt)
+Files: src/normal.c, src/testdir/test_listlbr.in,
+ src/testdir/test_listlbr.ok
+
+Patch 7.4.799
+Problem: Accessing memory before an allocated block.
+Solution: Check for not going before the start of a pattern. (Dominique
+ Pelle)
+Files: src/fileio.c
+
+Patch 7.4.800
+Problem: Using freed memory when triggering CmdUndefined autocommands.
+Solution: Set pointer to NULL. (Dominique Pelle)
+Files: src/ex_docmd.c
+
+Patch 7.4.801 (after 7.4.769)
+Problem: Test for ":diffoff" doesn't catch all potential problems.
+Solution: Add a :diffthis and a :diffoff command. (Olaf Dabrunz)
+Files: src/testdir/test47.in
+
+Patch 7.4.802
+Problem: Using "A" in Visual mode while 'linebreak' is set is not tested.
+Solution: Add a test for this, verifies the problem is fixed. (Ingo Karkat)
+Files: src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.4.803
+Problem: C indent does not support C11 raw strings. (Mark Lodato)
+Solution: Do not change indent inside the raw string.
+Files: src/search.c, src/misc1.c, src/edit.c, src/ops.c,
+ src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.4.804
+Problem: Xxd doesn't have a license notice.
+Solution: Add license as indicated by Juergen.
+Files: src/xxd/xxd.c
+
+Patch 7.4.805
+Problem: The ruler shows "Bot" even when there are only filler lines
+ missing. (Gary Johnson)
+Solution: Use "All" when the first line and one filler line are visible.
+Files: src/buffer.c
+
+Patch 7.4.806
+Problem: CTRL-A in Visual mode doesn't work properly with "alpha" in
+ 'nrformats'.
+Solution: Make it work. (Christian Brabandt)
+Files: src/ops.c, src/testdir/test_increment.in,
+ src/testdir/test_increment.ok
+
+Patch 7.4.807 (after 7.4.798)
+Problem: After CTRL-V CTRL-A mode isn't updated. (Hirohito Higashi)
+Solution: Clear the command line or update the displayed command.
+Files: src/normal.c
+
+Patch 7.4.808
+Problem: On MS-Windows 8 IME input doesn't work correctly.
+Solution: Read console input before calling MsgWaitForMultipleObjects().
+ (vim-jp, Nobuhiro Takasaki)
+Files: src/os_win32.c
+
+Patch 7.4.809 (after 7.4.802)
+Problem: Test is duplicated.
+Solution: Roll back 7.4.802.
+Files: src/testdir/test39.in, src/testdir/test39.ok
+
+Patch 7.4.810
+Problem: With a sequence of commands using buffers in diff mode E749 is
+ given. (itchyny)
+Solution: Skip unloaded buffer. (Hirohito Higashi)
+Files: src/diff.c
+
+Patch 7.4.811
+Problem: Invalid memory access when using "exe 'sc'".
+Solution: Avoid going over the end of the string. (Dominique Pelle)
+Files: src/ex_docmd.c
+
+Patch 7.4.812
+Problem: Gcc sanitizer complains about using a NULL pointer to memmove().
+Solution: Only call memmove when there is something to move. (Vittorio
+ Zecca)
+Files: src/memline.c
+
+Patch 7.4.813
+Problem: It is not possible to save and restore character search state.
+Solution: Add getcharsearch() and setcharsearch(). (James McCoy)
+Files: runtime/doc/eval.txt, src/eval.c, src/proto/search.pro,
+ src/search.c, src/testdir/test_charsearch.in,
+ src/testdir/test_charsearch.ok, src/testdir/Makefile,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms
+
+Patch 7.4.814
+Problem: Illegal memory access with "sy match a fold".
+Solution: Check for empty string. (Dominique Pelle)
+Files: src/syntax.c
+
+Patch 7.4.815
+Problem: Invalid memory access when doing ":call g:".
+Solution: Check for an empty name. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.4.816
+Problem: Invalid memory access when doing ":fun X(".
+Solution: Check for missing ')'. (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.4.817
+Problem: Invalid memory access in file_pat_to_reg_pat().
+Solution: Use vim_isspace() instead of checking for a space only. (Dominique
+ Pelle)
+Files: src/fileio.c
+
+Patch 7.4.818
+Problem: 'linebreak' breaks c% if the last Visual selection was block.
+ (Chris Morganiser, Issue 389)
+Solution: Handle Visual block mode differently. (Christian Brabandt)
+Files: src/normal.c, src/testdir/test_listlbr.in,
+ src/testdir/test_listlbr.ok
+
+Patch 7.4.819
+Problem: Beeping when running the tests.
+Solution: Fix 41 beeps. (Roland Eggner)
+Files: src/testdir/test17.in, src/testdir/test29.in,
+ src/testdir/test4.in, src/testdir/test61.in,
+ src/testdir/test82.in, src/testdir/test83.in,
+ src/testdir/test90.in, src/testdir/test95.in,
+ src/testdir/test_autoformat_join.in
+
+Patch 7.4.820
+Problem: Invalid memory access in file_pat_to_reg_pat.
+Solution: Avoid looking before the start of a string. (Dominique Pelle)
+Files: src/fileio.c
+
+Patch 7.4.821
+Problem: Coverity reports a few problems.
+Solution: Avoid the warnings. (Christian Brabandt)
+Files: src/ex_docmd.c, src/option.c, src/screen.c
+
+Patch 7.4.822
+Problem: More problems reported by coverity.
+Solution: Avoid the warnings. (Christian Brabandt)
+Files: src/os_unix.c, src/eval.c, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_getln.c, src/fold.c, src/gui.c, src/gui_w16.c,
+ src/gui_w32.c, src/if_cscope.c, src/if_xcmdsrv.c, src/move.c,
+ src/normal.c, src/regexp.c, src/syntax.c, src/ui.c, src/window.c
+
+Patch 7.4.823
+Problem: Cursor moves after CTRL-A on alphabetic character.
+Solution: (Hirohito Higashi, test by Christian Brabandt)
+Files: src/testdir/test_increment.in, src/testdir/test_increment.ok,
+ src/ops.c
+
+Patch 7.4.824 (after 7.4.813)
+Problem: Can't compile without the multibyte feature. (John Marriott)
+Solution: Add #ifdef.
+Files: src/eval.c
+
+Patch 7.4.825
+Problem: Invalid memory access for ":syn keyword x a[".
+Solution: Do not skip over the NUL. (Dominique Pelle)
+Files: src/syntax.c
+
+Patch 7.4.826
+Problem: Compiler warnings and errors.
+Solution: Make it build properly without the multibyte feature.
+Files: src/eval.c, src/search.c
+
+Patch 7.4.827
+Problem: Not all test targets are in the Makefile.
+Solution: Add the missing targets.
+Files: src/Makefile
+
+Patch 7.4.828
+Problem: Crash when using "syn keyword x c". (Dominique Pelle)
+Solution: Initialize the keyword table. (Raymond Ko, PR 397)
+Files: src/syntax.c
+
+Patch 7.4.829
+Problem: Crash when clicking in beval balloon. (Travis Lebsock)
+Solution: Use PostMessage() instead of DestroyWindow(). (Raymond Ko, PR 298)
+Files: src/gui_w32.c
+
+Patch 7.4.830
+Problem: Resetting 'encoding' when doing ":set all&" causes problems.
+ (Bjorn Linse) Display is not updated.
+Solution: Do not reset 'encoding'. Do a full redraw.
+Files: src/option.c
+
+Patch 7.4.831
+Problem: When expanding `=expr` on the command line and encountering an
+ error, the command is executed anyway.
+Solution: Bail out when an error is detected.
+Files: src/misc1.c
+
+Patch 7.4.832
+Problem: $HOME in `=$HOME . '/.vimrc'` is expanded too early.
+Solution: Skip over `=expr` when expanding environment names.
+Files: src/misc1.c
+
+Patch 7.4.833
+Problem: More side effects of ":set all&" are missing. (Björn Linse)
+Solution: Call didset_options() and add didset_options2() to collect more
+ side effects to take care of. Still not everything...
+Files: src/option.c
+
+Patch 7.4.834
+Problem: gettabvar() doesn't work after Vim start. (Szymon Wrozynski)
+Solution: Handle first window in tab still being NULL. (Christian Brabandt)
+Files: src/eval.c, src/testdir/test91.in, src/testdir/test91.ok
+
+Patch 7.4.835
+Problem: Comparing utf-8 sequences does not handle different byte sizes
+ correctly.
+Solution: Get the byte size of each character. (Dominique Pelle)
+Files: src/misc2.c
+
+Patch 7.4.836
+Problem: Accessing uninitialized memory.
+Solution: Add missing calls to init_tv(). (Dominique Pelle)
+Files: src/eval.c
+
+Patch 7.4.837
+Problem: Compiler warning with MSVC compiler when using +sniff.
+Solution: Use Sleep() instead of _sleep(). (Tux)
+Files: src/if_sniff.c
+
+Patch 7.4.838 (after 7.4.833)
+Problem: Can't compile without the crypt feature. (John Marriott)
+Solution: Add #ifdef.
+Files: src/option.c
+
+Patch 7.4.839
+Problem: Compiler warning on 64-bit system.
+Solution: Add cast to int. (Mike Williams)
+Files: src/search.c
+
+Patch 7.4.840 (after 7.4.829)
+Problem: Tooltip window stays open.
+Solution: Send a WM_CLOSE message. (Jurgen Kramer)
+Files: src/gui_w32.c
+
+Patch 7.4.841
+Problem: Can't compile without the multibyte feature. (John Marriott)
+Solution: Add more #ifdef's.
+Files: src/option.c
+
+Patch 7.4.842 (after 7.4.840)
+Problem: Sending too many messages to close the balloon.
+Solution: Only send a WM_CLOSE message. (Jurgen Kramer)
+Files: src/gui_w32.c
+
+Patch 7.4.843 (after 7.4.835)
+Problem: Still possible to go beyond the end of a string.
+Solution: Check for NUL also in second string. (Dominique Pelle)
+Files: src/misc2.c
+
+Patch 7.4.844
+Problem: When '#' is in 'isident' the is# comparator doesn't work.
+Solution: Don't use vim_isIDc(). (Yasuhiro Matsumoto)
+Files: src/eval.c, src/testdir/test_comparators.in,
+ src/testdir/test_comparators.ok, src/testdir/Makefile,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms
+
+Patch 7.4.845
+Problem: Compiler warning for possible loss of data.
+Solution: Add a type cast. (Erich Ritz)
+Files: src/misc1.c
+
+Patch 7.4.846
+Problem: Some GitHub users don't know how to use issues.
+Solution: Add a file that explains the basics of contributing.
+Files: Filelist, CONTRIBUTING.md
+
+Patch 7.4.847
+Problem: "vi)d" may leave a character behind.
+Solution: Skip over multibyte character. (Christian Brabandt)
+Files: src/search.c
+
+Patch 7.4.848
+Problem: CTRL-A on hex number in Visual block mode is incorrect.
+Solution: Account for the "0x". (Hirohito Higashi)
+Files: src/charset.c, src/testdir/test_increment.in,
+ src/testdir/test_increment.ok
+
+Patch 7.4.849
+Problem: Moving the cursor in Insert mode starts new undo sequence.
+Solution: Add CTRL-G U to keep the undo sequence for the following cursor
+ movement command. (Christian Brabandt)
+Files: runtime/doc/insert.txt, src/edit.c, src/testdir/test_mapping.in,
+ src/testdir/test_mapping.ok
+
+Patch 7.4.850 (after 7.4.846)
+Problem: <Esc> does not show up.
+Solution: Use &gt; and &lt;. (Kazunobu Kuriyama)
+Files: CONTRIBUTING.md
+
+Patch 7.4.851
+Problem: Saving and restoring the console buffer does not work properly.
+Solution: Instead of ReadConsoleOutputA/WriteConsoleOutputA use
+ CreateConsoleScreenBuffer and SetConsoleActiveScreenBuffer.
+ (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.852
+Problem: On MS-Windows console Vim uses ANSI APIs for keyboard input and
+ console output, it cannot input/output Unicode characters.
+Solution: Use Unicode APIs for console I/O. (Ken Takata, Yasuhiro Matsumoto)
+Files: src/os_win32.c, src/ui.c, runtime/doc/options.txt
+
+Patch 7.4.853
+Problem: "zt" in diff mode does not always work properly. (Gary Johnson)
+Solution: Don't count filler lines twice. (Christian Brabandt)
+Files: src/move.c
+
+Patch 7.4.854 (after 7.4.850)
+Problem: Missing information about runtime files.
+Solution: Add section about runtime files. (Christian Brabandt)
+Files: CONTRIBUTING.md
+
+Patch 7.4.855
+Problem: GTK: font glitches for combining characters
+Solution: Use pango_shape_full() instead of pango_shape(). (luchr, PR #393)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.856
+Problem: "zt" still doesn't work well with filler lines. (Gary Johnson)
+Solution: Check for filler lines above the cursor. (Christian Brabandt)
+Files: src/move.c
+
+Patch 7.4.857
+Problem: Dragging the current tab with the mouse doesn't work properly.
+Solution: Take the current tabpage index into account. (Hirohito Higashi)
+Files: src/normal.c
+
+Patch 7.4.858
+Problem: It's a bit clumsy to execute a command on a list of matches.
+Solution: Add the ":ldo", ":lfdo", ":cdo" and ":cfdo" commands. (Yegappan
+ Lakshmanan)
+Files: runtime/doc/cmdline.txt, runtime/doc/editing.txt,
+ runtime/doc/index.txt, runtime/doc/quickfix.txt,
+ runtime/doc/tabpage.txt, runtime/doc/windows.txt, src/ex_cmds.h,
+ src/ex_cmds2.c, src/ex_docmd.c, src/proto/quickfix.pro,
+ src/quickfix.c, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_os2.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/test_cdo.in,
+ src/testdir/test_cdo.ok
+
+Patch 7.4.859
+Problem: Vim doesn't recognize all htmldjango files.
+Solution: Recognize a comment. (Daniel Hahler, PR #410)
+Files: runtime/filetype.vim
+
+Patch 7.4.860
+Problem: Filetype detection is outdated.
+Solution: Include all recent and not-so-recent changes.
+Files: runtime/filetype.vim
+
+Patch 7.4.861 (after 7.4.855)
+Problem: pango_shape_full() is not always available.
+Solution: Add a configure check.
+Files: src/configure.in, src/auto/configure, src/config.h.in,
+ src/gui_gtk_x11.c
+
+Patch 7.4.862 (after 7.4.861)
+Problem: Still problems with pango_shape_full() not available.
+Solution: Change AC_TRY_COMPILE to AC_TRY_LINK.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.863 (after 7.4.856)
+Problem: plines_nofill() used without the diff feature.
+Solution: Define PLINES_NOFILL().
+Files: src/macros.h, src/move.c
+
+Patch 7.4.864 (after 7.4.858)
+Problem: Tiny build fails.
+Solution: Put qf_ items inside #ifdef.
+Files: src/ex_docmd.c
+
+Patch 7.4.865
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize.
+Files: src/ex_cmds2.c
+
+Patch 7.4.866
+Problem: Crash when changing the 'tags' option from a remote command.
+ (Benjamin Fritz)
+Solution: Instead of executing messages immediately, use a queue, like for
+ netbeans. (James Kolb)
+Files: src/ex_docmd.c, src/getchar.c, src/gui_gtk_x11.c, src/gui_w48.c,
+ src/gui_x11.c, src/if_xcmdsrv.c, src/misc2.c, src/os_unix.c,
+ src/proto/if_xcmdsrv.pro, src/proto/misc2.pro, src/macros.h
+
+Patch 7.4.867 (after 7.4.866)
+Problem: Can't build on MS-Windows. (Taro Muraoka)
+Solution: Adjust #ifdef.
+Files: src/misc2.c
+
+Patch 7.4.868
+Problem: 'smarttab' is also effective when 'paste' is enabled. (Alexander
+ Monakov)
+Solution: Disable 'smarttab' when 'paste' is set. (Christian Brabandt)
+ Do the same for 'expandtab'.
+Files: src/option.c, src/structs.h
+
+Patch 7.4.869
+Problem: MS-Windows: scrolling may cause text to disappear when using an
+ Intel GPU.
+Solution: Call GetPixel(). (Yohei Endo)
+Files: src/gui_w48.c
+
+Patch 7.4.870
+Problem: May get into an invalid state when using getchar() in an
+ expression mapping.
+Solution: Anticipate mod_mask to change. (idea by Yukihiro Nakadaira)
+Files: src/getchar.c
+
+Patch 7.4.871
+Problem: Vim leaks memory, when 'wildignore' filters out all matches.
+Solution: Free the files array when it becomes empty.
+Files: src/misc1.c
+
+Patch 7.4.872
+Problem: Not using CI services available.
+Solution: Add configuration files for travis and appveyor. (Ken Takata,
+ vim-jp, PR #401)
+Files: .travis.yml, appveyor.yml, Filelist
+
+Patch 7.4.873 (after 7.4.866)
+Problem: Compiler warning for unused variable. (Tony Mechelynck)
+Solution: Remove the variable. Also fix int vs long_u mixup.
+Files: src/if_xcmdsrv.c
+
+Patch 7.4.874
+Problem: MS-Windows: When Vim runs inside another application, the size
+ isn't right.
+Solution: When in child mode compute the size differently. (Agorgianitis
+ Loukas)
+Files: src/gui_w48.c
+
+Patch 7.4.875
+Problem: Not obvious how to contribute.
+Solution: Add a remark about CONTRIBUTING.md to README.md
+Files: README.md
+
+Patch 7.4.876
+Problem: Windows7: when using vim.exe with msys or msys2, conhost.exe
+ (console window provider on Windows7) will freeze or crash.
+Solution: Make original screen buffer active, before executing external
+ program. And when the program is finished, revert to vim's one.
+ (Taro Muraoka)
+Files: src/os_win32.c
+
+Patch 7.4.877 (after 7.4.843)
+Problem: ":find" sometimes fails. (Excanoe)
+Solution: Compare current characters instead of previous ones.
+Files: src/misc2.c
+
+Patch 7.4.878
+Problem: Coverity error for clearing only one byte of struct.
+Solution: Clear the whole struct. (Dominique Pelle)
+Files: src/ex_docmd.c
+
+Patch 7.4.879
+Problem: Can't see line numbers in nested function calls.
+Solution: Add line number to the file name. (Alberto Fanjul)
+Files: src/eval.c
+
+Patch 7.4.880
+Problem: No build and coverage status.
+Solution: Add links to the README file. (Christian Brabandt)
+Files: README.md
+
+Patch 7.4.881 (after 7.4.879)
+Problem: Test 49 fails.
+Solution: Add line number to check of call stack.
+Files: src/testdir/test49.vim
+
+Patch 7.4.882
+Problem: When leaving the command line window with CTRL-C while a
+ completion menu is displayed the menu isn't removed.
+Solution: Force a screen update. (Hirohito Higashi)
+Files: src/edit.c
+
+Patch 7.4.883 (after 7.4.818)
+Problem: Block-mode replace works characterwise instead of blockwise after
+ column 147. (Issue #422)
+Solution: Set Visual mode. (Christian Brabandt)
+Files: src/normal.c, src/testdir/test_listlbr.in,
+ src/testdir/test_listlbr.ok
+
+Patch 7.4.884
+Problem: Travis also builds on a tag push.
+Solution: Filter out tag pushes. (Kenichi Ito)
+Files: .travis.yml
+
+Patch 7.4.885
+Problem: When doing an upwards search without wildcards the search fails if
+ the initial directory doesn't exist.
+Solution: Fix the non-wildcard case. (Stefan Kempf)
+Files: src/misc2.c
+
+Patch 7.4.886 (after 7.4.876)
+Problem: Windows7: Switching screen buffer causes flicker when using
+ system().
+Solution: Instead of actually switching screen buffer, duplicate the handle.
+ (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.4.887
+Problem: Using uninitialized memory for regexp with back reference.
+ (Dominique Pelle)
+Solution: Initialize end_lnum.
+Files: src/regexp_nfa.c
+
+Patch 7.4.888
+Problem: The OptionSet autocommands are not triggered from setwinvar().
+Solution: Do not use switch_win() when not needed. (Hirohito Higashi)
+Files: src/eval.c
+
+Patch 7.4.889
+Problem: Triggering OptionSet from setwinvar() isn't tested.
+Solution: Add a test. (Christian Brabandt)
+Files: src/testdir/test_autocmd_option.in,
+ src/testdir/test_autocmd_option.ok
+
+Patch 7.4.890
+Problem: Build failure when using dynamic python but not python3.
+Solution: Adjust the #if to also include DYNAMIC_PYTHON3 and UNIX.
+Files: src/if_python3.c
+
+Patch 7.4.891
+Problem: Indentation of array initializer is wrong.
+Solution: Avoid that calling find_start_rawstring() changes the position
+ returned by find_start_comment(), add a test. (Hirohito Higashi)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.4.892
+Problem: On MS-Windows the iconv DLL may have a different name.
+Solution: Also try libiconv2.dll and libiconv-2.dll. (Yasuhiro Matsumoto)
+Files: src/mbyte.c
+
+Patch 7.4.893
+Problem: C indenting is wrong below a "case (foo):" because it is
+ recognized as a C++ base class construct. Issue #38.
+Solution: Check for the case keyword.
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.4.894
+Problem: vimrun.exe is picky about the number of spaces before -s.
+Solution: Skip all spaces. (Cam Sinclair)
+Files: src/vimrun.c
+
+Patch 7.4.895
+Problem: Custom command line completion does not work for a command
+ containing digits.
+Solution: Skip over the digits. (suggested by Yasuhiro Matsumoto)
+Files: src/ex_docmd.c
+
+Patch 7.4.896
+Problem: Editing a URL, which netrw should handle, doesn't work.
+Solution: Avoid changing slashes to backslashes. (Yasuhiro Matsumoto)
+Files: src/fileio.c, src/os_mswin.c
+
+Patch 7.4.897
+Problem: Freeze and crash when there is a sleep in a remote command.
+ (Karl Yngve Lervåg)
+Solution: Remove a message from the queue before dealing with it. (James
+ Kolb)
+Files: src/if_xcmdsrv.c
+
+Patch 7.4.898
+Problem: The 'fixendofline' option is set on with ":edit".
+Solution: Don't set the option when clearing a buffer. (Yasuhiro Matsumoto)
+Files: src/buffer.c
+
+Patch 7.4.899
+Problem: README file is not optimal.
+Solution: Move buttons, update some text. (closes #460)
+Files: README.txt, README.md
+
+Patch 7.4.900 (after 7.4.899)
+Problem: README file can still be improved
+Solution: Add a couple of links. (Christian Brabandt)
+Files: README.md
+
+Patch 7.4.901
+Problem: When a BufLeave autocommand changes folding in a way it syncs
+ undo, undo can be corrupted.
+Solution: Prevent undo sync. (Jacob Niehus)
+Files: src/popupmnu.c
+
+Patch 7.4.902
+Problem: Problems with using the MS-Windows console.
+Solution: Revert patches 7.4.851, 7.4.876 and 7.4.886 until we find a better
+ solution. (suggested by Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.903
+Problem: MS-Windows: When 'encoding' differs from the current code page,
+ expanding wildcards may cause illegal memory access.
+Solution: Allocate a longer buffer. (Ken Takata)
+Files: src/misc1.c
+
+Patch 7.4.904
+Problem: Vim does not provide .desktop files.
+Solution: Include and install .desktop files. (James McCoy, closes #455)
+Files: Filelist, runtime/vim.desktop, runtime/gvim.desktop, src/Makefile
+
+Patch 7.4.905
+Problem: Python interface can produce error "vim.message' object has no
+ attribute 'isatty'".
+Solution: Add dummy isatty(), readable(), etc. (closes #464)
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.4.906
+Problem: On MS-Windows the viminfo file is (always) given the hidden
+ attribute. (raulnac)
+Solution: Check the hidden attribute in a different way. (Ken Takata)
+Files: src/ex_cmds.c, src/os_win32.c, src/os_win32.pro
+
+Patch 7.4.907
+Problem: Libraries for dynamically loading interfaces can only be defined
+ at compile time.
+Solution: Add options to specify the dll names. (Kazuki Sakamoto,
+ closes #452)
+Files: runtime/doc/if_lua.txt, runtime/doc/if_perl.txt,
+ runtime/doc/if_pyth.txt, runtime/doc/if_ruby.txt,
+ runtime/doc/options.txt, src/if_lua.c, src/if_perl.xs,
+ src/if_python.c, src/if_python3.c, src/if_ruby.c, src/option.c,
+ src/option.h
+
+Patch 7.4.908 (after 7.4.907)
+Problem: Build error with MingW compiler. (Cesar Romani)
+Solution: Change #if into #ifdef.
+Files: src/if_perl.xs
+
+Patch 7.4.909 (after 7.4.905)
+Problem: "make install" fails.
+Solution: Only try installing desktop files if the destination directory
+ exists.
+Files: src/Makefile
+
+Patch 7.4.910 (after 7.4.905)
+Problem: Compiler complains about type punned pointer.
+Solution: Use another way to increment the ref count.
+Files: src/if_py_both.h
+
+Patch 7.4.911
+Problem: t_Ce and t_Cs are documented but not supported. (Hirohito Higashi)
+Solution: Define the options.
+Files: src/option.c
+
+Patch 7.4.912
+Problem: Wrong indenting for C++ constructor.
+Solution: Recognize ::. (Anhong)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 7.4.913
+Problem: No utf-8 support for the hangul input feature.
+Solution: Add utf-8 support. (Namsh)
+Files: src/gui.c, src/hangulin.c, src/proto/hangulin.pro, src/screen.c,
+ src/ui.c, runtime/doc/hangulin.txt, src/feature.h
+
+Patch 7.4.914
+Problem: New compiler warning: logical-not-parentheses
+Solution: Silence the warning.
+Files: src/term.c
+
+Patch 7.4.915
+Problem: When removing from 'path' and then adding, a comma may go missing.
+ (Malcolm Rowe)
+Solution: Fix the check for P_ONECOMMA. (closes #471)
+Files: src/option.c, src/testdir/test_options.in,
+ src/testdir/test_options.ok
+
+Patch 7.4.916
+Problem: When running out of memory while copying a dict memory may be
+ freed twice. (ZyX)
+Solution: Do not call the garbage collector when running out of memory.
+Files: src/misc2.c
+
+Patch 7.4.917
+Problem: Compiler warning for comparing signed and unsigned.
+Solution: Add a type cast.
+Files: src/hangulin.c
+
+Patch 7.4.918
+Problem: A digit in an option name has problems.
+Solution: Rename 'python3dll' to 'pythonthreedll'.
+Files: src/option.c, src/option.h, runtime/doc/options.txt
+
+Patch 7.4.919
+Problem: The dll options are not in the options window.
+Solution: Add the dll options. And other fixes.
+Files: runtime/optwin.vim
+
+Patch 7.4.920
+Problem: The rubydll option is not in the options window.
+Solution: Add the rubydll option.
+Files: runtime/optwin.vim
+
+Patch 7.4.921 (after 7.4.906)
+Problem: Missing proto file update. (Randall W. Morris)
+Solution: Add the missing line for mch_ishidden.
+Files: src/proto/os_win32.pro
+
+Patch 7.4.922
+Problem: Leaking memory with ":helpt {dir-not-exists}".
+Solution: Free dirname. (Dominique Pelle)
+Files: src/ex_cmds.c
+
+Patch 7.4.923
+Problem: Prototypes not always generated.
+Solution: Change #if to OR with PROTO.
+Files: src/window.c
+
+Patch 7.4.924
+Problem: DEVELOPER_DIR gets reset by configure.
+Solution: Do not reset DEVELOPER_DIR when there is no --with-developer-dir
+ argument. (Kazuki Sakamoto, closes #482)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.925
+Problem: User may yank or put using the register being recorded in.
+Solution: Add the recording register in the message. (Christian Brabandt,
+ closes #470)
+Files: runtime/doc/options.txt, runtime/doc/repeat.txt, src/ops.c,
+ src/option.h, src/screen.c
+
+Patch 7.4.926
+Problem: Completing the longest match doesn't work properly with multibyte
+ characters.
+Solution: When using multibyte characters use another way to find the
+ longest match. (Hirohito Higashi)
+Files: src/ex_getln.c, src/testdir/test_utf8.in, src/testdir/test_utf8.ok
+
+Patch 7.4.927
+Problem: Ruby crashes when there is a runtime error.
+Solution: Use ruby_options() instead of ruby_process_options(). (Damien)
+Files: src/if_ruby.c
+
+Patch 7.4.928
+Problem: A clientserver message interrupts handling keys of a mapping.
+Solution: Have mch_inchar() send control back to WaitForChar when it is
+ interrupted by server message. (James Kolb)
+Files: src/os_unix.c
+
+Patch 7.4.929
+Problem: "gv" after paste selects one character less if 'selection' is
+ "exclusive".
+Solution: Increment the end position. (Christian Brabandt)
+Files: src/normal.c, src/testdir/test94.in, src/testdir/test94.ok
+
+Patch 7.4.930
+Problem: MS-Windows: Most users appear not to like the window border.
+Solution: Remove WS_EX_CLIENTEDGE. (Ian Halliday)
+Files: src/gui_w32.c
+
+Patch 7.4.931 (after 7.4.929)
+Problem: Test 94 fails on some systems.
+Solution: Set 'encoding' to utf-8.
+Files: src/testdir/test94.in
+
+Patch 7.4.932 (after 7.4.926)
+Problem: test_utf8 has confusing dummy command.
+Solution: Use a real command instead of a colon.
+Files: src/testdir/test_utf8.in
+
+Patch 7.4.933 (after 7.4.926)
+Problem: Crash when using longest completion match.
+Solution: Fix array index.
+Files: src/ex_getln.c
+
+Patch 7.4.934
+Problem: Appveyor also builds on a tag push.
+Solution: Add a skip_tags line. (Kenichi Ito, closes #489)
+Files: appveyor.yml
+
+Patch 7.4.935 (after 7.4.932)
+Problem: test_utf8 fails on MS-Windows when executed with gvim.
+Solution: Use the insert flag on feedkeys() to put the string before the
+ ":" that was already read when checking for available chars.
+Files: src/testdir/test_utf8.in
+
+Patch 7.4.936
+Problem: Crash when dragging with the mouse.
+Solution: Add safety check for NULL pointer. Check mouse position for valid
+ value. (Hirohito Higashi)
+Files: src/window.c, src/term.c
+
+Patch 7.4.937
+Problem: Segfault reading uninitialized memory.
+Solution: Do not read match \z0, it does not exist. (Marius Gedminas, closes
+ #497)
+Files: src/regexp_nfa.c
+
+Patch 7.4.938
+Problem: X11 and GTK have more mouse buttons than Vim supports.
+Solution: Recognize more mouse buttons. (Benoit Pierre, closes #498)
+Files: src/gui_gtk_x11.c, src/gui_x11.c
+
+Patch 7.4.939
+Problem: Memory leak when encountering a syntax error.
+Solution: Free the memory. (Dominique Pelle)
+Files: src/ex_docmd.c
+
+Patch 7.4.940
+Problem: vt52 terminal codes are not correct.
+Solution: Move entries outside of #if. (Random) Adjustments based on
+ documented codes.
+Files: src/term.c
+
+Patch 7.4.941
+Problem: There is no way to ignore case only for tag searches.
+Solution: Add the 'tagcase' option. (Gary Johnson)
+Files: runtime/doc/options.txt, runtime/doc/quickref.txt,
+ runtime/doc/tagsrch.txt, runtime/doc/usr_29.txt,
+ runtime/optwin.vim, src/Makefile, src/buffer.c, src/option.c,
+ src/option.h, src/structs.h, src/tag.c,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_tagcase.in, src/testdir/test_tagcase.ok
+
+Patch 7.4.942 (after 7.4.941)
+Problem: test_tagcase breaks for small builds.
+Solution: Bail out of the test early. (Hirohito Higashi)
+Files: src/testdir/test_tagcase.in
+
+Patch 7.4.943
+Problem: Tests are not run.
+Solution: Add test_writefile to makefiles. (Ken Takata)
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.944
+Problem: Writing tests for Vim script is hard.
+Solution: Add assertEqual(), assertFalse() and assertTrue() functions. Add
+ the v:errors variable. Add the runtest script. Add a first new
+ style test script.
+Files: src/eval.c, src/vim.h, src/misc2.c, src/testdir/Makefile,
+ src/testdir/runtest.vim, src/testdir/test_assert.vim,
+ runtime/doc/eval.txt
+
+Patch 7.4.945 (after 7.4.944)
+Problem: New style testing is incomplete.
+Solution: Add the runtest script to the list of distributed files.
+ Add the new functions to the function overview.
+ Rename the functions to match Vim function style.
+ Move undolevels testing into a new style test script.
+Files: Filelist, runtime/doc/usr_41.txt, runtime/doc/eval.txt,
+ src/testdir/test_assert.vim, src/testdir/Makefile,
+ src/testdir/test_undolevels.vim, src/testdir/test100.in,
+ src/testdir/test100.ok
+
+Patch 7.4.946 (after 7.4.945)
+Problem: Missing changes in source file.
+Solution: Include changes to the eval.c file.
+Files: src/eval.c
+
+Patch 7.4.947
+Problem: Test_listchars fails with MingW. (Michael Soyka)
+Solution: Add the test to the ones that need the fileformat fixed.
+ (Christian Brabandt)
+Files: src/testdir/Make_ming.mak
+
+Patch 7.4.948
+Problem: Can't build when the insert_expand feature is disabled.
+Solution: Add #ifdefs. (Dan Pasanen, closes #499)
+Files: src/eval.c, src/fileio.c
+
+Patch 7.4.949
+Problem: When using 'colorcolumn' and there is a sign with a fullwidth
+ character the highlighting is wrong. (Andrew Stewart)
+Solution: Only increment vcol when in the right state. (Christian Brabandt)
+Files: src/screen.c, src/testdir/test_listlbr_utf8.in,
+ src/testdir/test_listlbr_utf8.ok
+
+Patch 7.4.950
+Problem: v:errors is not initialized.
+Solution: Initialize it to an empty list. (Thinca)
+Files: src/eval.c
+
+Patch 7.4.951
+Problem: Sorting number strings does not work as expected. (Luc Hermitte)
+Solution: Add the "N" argument to sort()
+Files: src/eval.c, runtime/doc/eval.txt, src/testdir/test_alot.vim,
+ src/testdir/test_sort.vim, src/testdir/Makefile
+
+Patch 7.4.952
+Problem: 'lispwords' is tested in the old way.
+Solution: Make a new style test for 'lispwords'.
+Files: src/testdir/test_alot.vim, src/testdir/test_lispwords.vim,
+ src/testdir/test100.in, src/testdir/test100.ok,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.953
+Problem: When a test script navigates to another buffer the .res file is
+ created with the wrong name.
+Solution: Use the "testname" for the .res file. (Damien)
+Files: src/testdir/runtest.vim
+
+Patch 7.4.954
+Problem: When using Lua there may be a crash. (issue #468)
+Solution: Avoid using an uninitialized tv. (Yukihiro Nakadaira)
+Files: src/if_lua.c
+
+Patch 7.4.955
+Problem: Vim doesn't recognize .pl6 and .pod6 files.
+Solution: Recognize them as perl6 and pod6. (Mike Eve, closes #511)
+Files: runtime/filetype.vim
+
+Patch 7.4.956
+Problem: A few more file name extensions not recognized.
+Solution: Add .asciidoc, .bzl, .gradle, etc.
+Files: runtime/filetype.vim
+
+Patch 7.4.957
+Problem: Test_tagcase fails when using another language than English.
+Solution: Set the messages language to C. (Kenichi Ito)
+Files: src/testdir/test_tagcase.in
+
+Patch 7.4.958
+Problem: Vim checks if the directory "$TMPDIR" exists.
+Solution: Do not check if the name starts with "$".
+Files: src/fileio.c
+
+Patch 7.4.959
+Problem: When setting 'term' the clipboard ownership is lost.
+Solution: Do not call clip_init(). (James McCoy)
+Files: src/term.c
+
+Patch 7.4.960
+Problem: Detecting every version of nmake is clumsy.
+Solution: Use a tiny C program to get the version of _MSC_VER. (Ken Takata)
+Files: src/Make_mvc.mak
+
+Patch 7.4.961
+Problem: Test107 fails in some circumstances.
+Solution: When using "zt", "zb" and "z=" recompute the fraction.
+Files: src/normal.c, src/window.c, src/proto/window.pro
+
+Patch 7.4.962
+Problem: Cannot run the tests with gvim. Cannot run individual new tests.
+Solution: Add the -f flag. Add new test targets in Makefile.
+Files: src/Makefile, src/testdir/Makefile
+
+Patch 7.4.963
+Problem: test_listlbr_utf8 sometimes fails.
+Solution: Don't use a literal multibyte character but <C-V>uXXXX. Do not
+ dump the screen highlighting. (Christian Brabandt, closes #518)
+Files: src/testdir/test_listlbr_utf8.in, src/testdir/test_listlbr_utf8.ok
+
+Patch 7.4.964
+Problem: Test 87 doesn't work in a shadow directory.
+Solution: Handle the extra subdirectory. (James McCoy, closes #515)
+Files: src/testdir/test87.in
+
+Patch 7.4.965
+Problem: On FreeBSD /dev/fd/ files are special.
+Solution: Use is_dev_fd_file() also for FreeBSD. (Derek Schrock, closes #521)
+Files: src/fileio.c
+
+Patch 7.4.966
+Problem: Configure doesn't work with a space in a path.
+Solution: Put paths in quotes. (James McCoy, closes #525)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.967
+Problem: Cross compilation on MS-windows doesn't work well.
+Solution: Tidy up cross compilation across architectures with Visual Studio.
+ (Mike Williams)
+Files: src/Make_mvc.mak
+
+Patch 7.4.968
+Problem: test86 and test87 are flaky in Appveyor.
+Solution: Reduce the count from 8 to 7. (suggested by ZyX)
+Files: src/testdir/test86.in, src/testdir/test87.in
+
+Patch 7.4.969
+Problem: Compiler warnings on Windows x64 build.
+Solution: Add type casts. (Mike Williams)
+Files: src/option.c
+
+Patch 7.4.970
+Problem: Rare crash in getvcol(). (Timo Mihaljov)
+Solution: Check for the buffer being NULL in init_preedit_start_col.
+ (Hirohito Higashi, Christian Brabandt)
+Files: src/mbyte.c
+
+Patch 7.4.971
+Problem: The asin() function can't be used.
+Solution: Sort the function table properly. (Watiko)
+Files: src/eval.c
+
+Patch 7.4.972
+Problem: Memory leak when there is an error in setting an option.
+Solution: Free the saved value (Christian Brabandt)
+Files: src/option.c
+
+Patch 7.4.973
+Problem: When pasting on the command line line breaks result in literal
+ <CR> characters. This makes pasting a long file name difficult.
+Solution: Skip the characters.
+Files: src/ex_getln.c, src/ops.c
+
+Patch 7.4.974
+Problem: When using :diffsplit the cursor jumps to the first line.
+Solution: Put the cursor on the line related to where the cursor was before
+ the split.
+Files: src/diff.c
+
+Patch 7.4.975
+Problem: Using ":sort" on a very big file sometimes causes text to be
+ corrupted. (John Beckett)
+Solution: Copy the line into a buffer before calling ml_append().
+Files: src/ex_cmds.c
+
+Patch 7.4.976
+Problem: When compiling Vim for MSYS2 (linked with msys-2.0.dll), the Win32
+ clipboard is not enabled.
+Solution: Recognize MSYS like CYGWIN. (Ken Takata)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.977
+Problem: 'linebreak' does not work properly when using "space" in
+ 'listchars'.
+Solution: (Hirohito Higashi, Christian Brabandt)
+Files: src/screen.c, src/testdir/test_listlbr.in,
+ src/testdir/test_listlbr.ok
+
+Patch 7.4.978
+Problem: test_cdo fails when using another language than English.
+Solution: Set the language to C. (Dominique Pelle, Kenichi Ito)
+Files: src/testdir/test_cdo.in
+
+Patch 7.4.979
+Problem: When changing the crypt key the blocks read from disk are not
+ decrypted.
+Solution: Also call ml_decrypt_data() when mf_old_key is set. (Ken Takata)
+Files: src/memfile.c
+
+Patch 7.4.980
+Problem: Tests for :cdo, :ldo, etc. are outdated.
+Solution: Add new style tests for these commands. (Yegappan Lakshmanan)
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/test_cdo.in, src/testdir/test_cdo.ok,
+ src/testdir/test_cdo.vim
+
+Patch 7.4.981
+Problem: An error in a test script goes unnoticed.
+Solution: Source the test script inside try/catch. (Hirohito Higashi)
+Files: src/testdir/runtest.vim
+
+Patch 7.4.982
+Problem: Keeping the list of tests updated is a hassle.
+Solution: Move the list to a separate file, so that it only needs to be
+ updated in one place.
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 7.4.983
+Problem: Executing one test after "make testclean" doesn't work.
+Solution: Add a dependency on test1.out.
+Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 7.4.984
+Problem: searchpos() always starts searching in the first column, which is
+ not what some people expect. (Brett Stahlman)
+Solution: Add the 'z' flag: start at the specified column.
+Files: src/vim.h, src/eval.c, src/search.c,
+ src/testdir/test_searchpos.vim, src/testdir/test_alot.vim,
+ runtime/doc/eval.txt
+
+Patch 7.4.985
+Problem: Can't build with Ruby 2.3.0.
+Solution: Use the new TypedData_XXX macro family instead of Data_XXX. Use
+ TypedData. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 7.4.986
+Problem: Test49 doesn't work on MS-Windows. test70 is listed twice.
+Solution: Move test49 to the group not used on Amiga and MS-Windows.
+ Remove test70 from SCRIPTS_WIN32.
+Files: src/testdir/Make_all.mak, src/testdir/Make_dos.mak
+
+Patch 7.4.987 (after 7.4.985)
+Problem: Can't build with Ruby 1.9.2.
+Solution: Require Rub 2.0 for defining USE_TYPEDDATA.
+Files: src/if_ruby.c
+
+Patch 7.4.988 (after 7.4.982)
+Problem: Default test target is test49.out.
+Solution: Add a build rule before including Make_all.mak.
+Files: src/testdir/Make_dos.mak, src/testdir/Make_amiga.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.989
+Problem: Leaking memory when hash_add() fails. Coverity error 99126.
+Solution: When hash_add() fails free the memory.
+Files: src/eval.c
+
+Patch 7.4.990
+Problem: Test 86 fails on AppVeyor.
+Solution: Do some registry magic. (Ken Takata)
+Files: appveyor.yml
+
+Patch 7.4.991
+Problem: When running new style tests the output is not visible.
+Solution: Add the testdir/messages file and show it. Update the list of
+ test names.
+Files: src/Makefile, src/testdir/Makefile, src/testdir/runtest.vim
+
+Patch 7.4.992
+Problem: Makefiles for MS-Windows in src/po are outdated.
+Solution: Make them work. (Ken Takata, Taro Muraoka)
+Files: src/po/Make_cyg.mak, src/po/Make_ming.mak, src/po/Make_mvc.mak,
+ src/po/README_mingw.txt, src/po/README_mvc.txt
+
+Patch 7.4.993
+Problem: Test 87 is flaky on AppVeyor.
+Solution: Reduce the minimum background thread count.
+Files: src/testdir/test86.in, src/testdir/test87.in
+
+Patch 7.4.994
+Problem: New style tests are not run on MS-Windows.
+Solution: Add the new style tests.
+Files: src/testdir/Make_dos.mak
+
+Patch 7.4.995
+Problem: gdk_pixbuf_new_from_inline() is deprecated.
+Solution: Generate auto/gui_gtk_gresources.c. (Kazunobu Kuriyama,
+ closes #507)
+Files: src/Makefile, src/auto/configure, src/config.h.in,
+ src/config.mk.in, src/configure.in, src/gui_gtk.c,
+ src/gui_gtk_gresources.xml, src/gui_gtk_x11.c,
+ src/proto/gui_gtk_gresources.pro,
+ pixmaps/stock_vim_build_tags.png, pixmaps/stock_vim_find_help.png,
+ pixmaps/stock_vim_save_all.png,
+ pixmaps/stock_vim_session_load.png,
+ pixmaps/stock_vim_session_new.png,
+ pixmaps/stock_vim_session_save.png, pixmaps/stock_vim_shell.png,
+ pixmaps/stock_vim_window_maximize.png,
+ pixmaps/stock_vim_window_maximize_width.png,
+ pixmaps/stock_vim_window_minimize.png,
+ pixmaps/stock_vim_window_minimize_width.png,
+ pixmaps/stock_vim_window_split.png,
+ pixmaps/stock_vim_window_split_vertical.png
+
+Patch 7.4.996
+Problem: New GDK files and testdir/Make_all.mak missing from distribution.
+ PC build instructions are outdated.
+Solution: Add the file to the list. Update PC build instructions.
+Files: Filelist, Makefile
+
+Patch 7.4.997
+Problem: "make shadow" was sometimes broken.
+Solution: Add a test for it. (James McCoy, closes #520)
+Files: .travis.yml
+
+Patch 7.4.998
+Problem: Running tests in shadow directory fails. Test 49 fails.
+Solution: Link more files for the shadow directory. Make test 49 ends up in
+ the right buffer.
+Files: src/Makefile, src/testdir/test49.in
+
+Patch 7.4.999
+Problem: "make shadow" creates a broken link. (Tony Mechelynck)
+Solution: Remove vimrc.unix from the list.
+Files: src/Makefile
+
+Patch 7.4.1000
+Problem: Test 49 is slow and doesn't work on MS-Windows.
+Solution: Start moving parts of test 49 to test_viml.
+Files: src/Makefile, src/testdir/runtest.vim, src/testdir/test_viml.vim,
+ src/testdir/test49.vim, src/testdir/test49.ok
+
+Patch 7.4.1001 (after 7.4.1000)
+Problem: test_viml isn't run.
+Solution: Include change in makefile.
+Files: src/testdir/Make_all.mak
+
+Patch 7.4.1002
+Problem: Cannot run an individual test on MS-Windows.
+Solution: Move the rule to run test1 downwards. (Ken Takata)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.4.1003
+Problem: Travis could check a few more things.
+Solution: Run autoconf on one of the builds. (James McCoy, closes #510)
+ Also build with normal features.
+Files: .travis.yml
+
+Patch 7.4.1004
+Problem: Using Makefile when auto/config.mk does not exist results in
+ warnings.
+Solution: Use default values for essential variables.
+Files: src/Makefile
+
+Patch 7.4.1005
+Problem: Vim users are not always happy.
+Solution: Make them happy.
+Files: src/ex_cmds.h, src/ex_cmds.c, src/proto/ex_cmds.pro
+
+Patch 7.4.1006
+Problem: The fix in patch 7.3.192 is not tested.
+Solution: Add a test, one for each regexp engine. (Elias Diem)
+Files: src/testdir/test44.in, src/testdir/test44.ok,
+ src/testdir/test99.in, src/testdir/test99.ok
+
+Patch 7.4.1007
+Problem: When a symbolic link points to a file in the root directory, the
+ swapfile is not correct.
+Solution: Do not try getting the full name of a file in the root directory.
+ (Milly, closes #501)
+Files: src/os_unix.c
+
+Patch 7.4.1008
+Problem: The OS/2 code pollutes the source while nobody uses it these days.
+Solution: Drop the support for OS/2.
+Files: src/feature.h, src/globals.h, src/macros.h, src/option.h,
+ src/os_unix.c, src/os_unix.h, src/proto/os_unix.pro, src/vim.h,
+ src/digraph.c, src/eval.c, src/ex_cmds.c, src/ex_docmd.c,
+ src/ex_getln.c, src/fileio.c, src/getchar.c, src/memline.c,
+ src/misc1.c, src/misc2.c, src/netbeans.c, src/option.c,
+ src/term.c, src/ui.c, src/window.c, src/os_os2_cfg.h,
+ src/Make_os2.mak, src/testdir/Make_os2.mak, src/testdir/os2.vim,
+ src/INSTALL, runtime/doc/os_os2.txt
+
+Patch 7.4.1009
+Problem: There are still #ifdefs for ARCHIE.
+Solution: Remove references to ARCHIE, the code was removed in Vim 5.
+Files: src/ex_cmds.c, src/ex_docmd.c, src/fileio.c, src/main.c,
+ src/memline.c, src/option.c, src/term.c
+
+Patch 7.4.1010
+Problem: Some developers are unhappy while running tests.
+Solution: Add a test and some color.
+Files: src/ex_cmds.c, src/testdir/test_assert.vim
+
+Patch 7.4.1011
+Problem: Can't build with Strawberry Perl.
+Solution: Include stdbool.h. (Ken Takata, closes #328)
+Files: Filelist, src/Make_mvc.mak, src/if_perl_msvc/stdbool.h
+
+Patch 7.4.1012
+Problem: Vim overwrites the value of $PYTHONHOME.
+Solution: Do not set $PYTHONHOME if it is already set. (Kazuki Sakamoto,
+ closes #500)
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.4.1013
+Problem: The local value of 'errorformat' is not used for ":lexpr" and
+ ":cexpr".
+Solution: Use the local value if it exists. (Christian Brabandt) Adjust the
+ help for this.
+Files: runtime/doc/quickfix.txt, src/quickfix.c
+
+Patch 7.4.1014
+Problem: `fnamemodify('.', ':.')` returns an empty string in Cygwin.
+Solution: Use CCP_RELATIVE in the call to cygwin_conv_path. (Jacob Niehus,
+ closes #505)
+Files: src/os_unix.c
+
+Patch 7.4.1015
+Problem: The column is not restored properly when the matchparen plugin is
+ used in Insert mode and the cursor is after the end of the line.
+Solution: Set the curswant flag. (Christian Brabandt). Also fix
+ highlighting the match of the character before the cursor.
+Files: src/eval.c, runtime/plugin/matchparen.vim
+
+Patch 7.4.1016
+Problem: Still a few OS/2 pieces remain.
+Solution: Delete more.
+Files: Filelist, README_os2.txt, testdir/todos.vim, src/xxd/Make_os2.mak
+
+Patch 7.4.1017
+Problem: When there is a backslash in an option ":set -=" doesn't work.
+Solution: Handle a backslash better. (Jacob Niehus) Add a new test, merge
+ in old test.
+Files: src/testdir/test_cdo.vim, src/testdir/test_set.vim,
+ src/testdir/test_alot.vim, src/option.c, src/testdir/test_set.in,
+ src/testdir/test_set.ok, src/Makefile
+
+Patch 7.4.1018 (after 7.4.1017)
+Problem: Failure running tests.
+Solution: Add missing change to list of old style tests.
+Files: src/testdir/Make_all.mak
+
+Patch 7.4.1019
+Problem: Directory listing of "src" is too long.
+Solution: Rename the resources file to make it shorter.
+Files: src/gui_gtk_gresources.xml, src/gui_gtk_res.xml, src/Makefile,
+ Filelist
+
+Patch 7.4.1020
+Problem: On MS-Windows there is no target to run tests with gvim.
+Solution: Add the testgvim target.
+Files: src/Make_mvc.mak
+
+Patch 7.4.1021
+Problem: Some makefiles are outdated.
+Solution: Add a note to warn developers.
+Files: src/Make_manx.mak, src/Make_bc3.mak, src/Make_bc5.mak,
+ src/Make_djg.mak, src/Make_w16.mak
+
+Patch 7.4.1022
+Problem: The README file contains some outdated information.
+Solution: Update the information about supported systems.
+Files: README.txt, README.md
+
+Patch 7.4.1023
+Problem: The distribution files for MS-Windows use CR-LF, which is
+ inconsistent with what one gets from github.
+Solution: Use LF in the distribution files.
+Files: Makefile
+
+Patch 7.4.1024
+Problem: Interfaces for MS-Windows are outdated.
+Solution: Use Python 2.7.10, Python 3.4.4, Perl 5.22, TCL 8.6.
+Files: src/bigvim.bat
+
+Patch 7.4.1025
+Problem: Version in installer needs to be updated manually.
+Solution: Generate a file with the version number. (Guopeng Wen)
+Files: Makefile, nsis/gvim.nsi, nsis/gvim_version.nsh
+
+Patch 7.4.1026
+Problem: When using MingW the tests do not clean up all files. E.g. test
+ 17 leaves Xdir1 behind. (Michael Soyka)
+Solution: Also delete directories, like Make_dos.mak. Delete files after
+ directories to reduce warnings.
+Files: src/testdir/Make_ming.mak, src/testdir/Make_dos.mak
+
+Patch 7.4.1027
+Problem: No support for binary numbers.
+Solution: Add "bin" to 'nrformats'. (Jason Schulz)
+Files: runtime/doc/change.txt, runtime/doc/eval.txt,
+ runtime/doc/version7.txt, src/charset.c, src/eval.c,
+ src/ex_cmds.c, src/ex_getln.c, src/misc2.c, src/ops.c,
+ src/option.c, src/proto/charset.pro, src/spell.c,
+ src/testdir/test57.in, src/testdir/test57.ok,
+ src/testdir/test58.in, src/testdir/test58.ok,
+ src/testdir/test_increment.in, src/testdir/test_increment.ok,
+ src/vim.h
+
+Patch 7.4.1028
+Problem: Nsis version file missing from the distribution.
+Solution: Add the file to the list.
+Files: Filelist
+
+Patch 7.4.1029 (after 7.4.1027)
+Problem: test_increment fails on systems with 32 bit long.
+Solution: Only test with 32 bits.
+Files: src/testdir/test_increment.in, src/testdir/test_increment.ok
+
+Patch 7.4.1030
+Problem: test49 is still slow.
+Solution: Move more tests from old to new style.
+Files: src/testdir/test_viml.vim, src/testdir/test49.vim,
+ src/testdir/test49.ok, src/testdir/runtest.vim
+
+Patch 7.4.1031
+Problem: Can't build with Python interface using MingW.
+Solution: Update the Makefile. (Yasuhiro Matsumoto)
+Files: src/INSTALLpc.txt, src/Make_cyg_ming.mak
+
+Patch 7.4.1032
+Problem: message from assert_false() does not look nice.
+Solution: Handle missing sourcing_name. Use right number of spaces. (Watiko)
+ Don't use line number if it's zero.
+Files: src/eval.c
+
+Patch 7.4.1033
+Problem: Memory use on MS-Windows is very conservative.
+Solution: Use the global memory status to estimate amount of memory.
+ (Mike Williams)
+Files: src/os_win32.c, src/os_win32.h, src/proto/os_win32.pro
+
+Patch 7.4.1034
+Problem: There is no test for the 'backspace' option behavior.
+Solution: Add a test. (Hirohito Higashi)
+Files: src/testdir/test_alot.vim, src/testdir/test_backspace_opt.vim
+
+Patch 7.4.1035
+Problem: An Ex range gets adjusted for folded lines even when the range is
+ not using line numbers.
+Solution: Only adjust line numbers for folding. (Christian Brabandt)
+Files: runtime/doc/fold.txt, src/ex_docmd.c
+
+Patch 7.4.1036
+Problem: Only terminals with up to 256 colors work properly.
+Solution: Use the 256 color behavior for all terminals with 256 or more
+ colors. (Robert de Bath, closes #504)
+Files: src/syntax.c
+
+Patch 7.4.1037
+Problem: Using "q!" when there is a modified hidden buffer does not unload
+ the current buffer, resulting in the need to abandon it again.
+Solution: When using "q!" unload the current buffer when needed. (Yasuhiro
+ Matsumoto, Hirohito Higashi)
+Files: src/testdir/test31.in, src/testdir/test31.ok,
+ runtime/doc/editing.txt, src/ex_cmds2.c, src/ex_docmd.c,
+ src/gui.c, src/gui_gtk_x11.c, src/os_unix.c,
+ src/proto/ex_cmds2.pro
+
+Patch 7.4.1038
+Problem: Still get a warning for a deprecated function with gdk-pixbuf
+ 2.31.
+Solution: Change minimum minor version from 32 to 31.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.1039 (after 7.4.1037)
+Problem: Test 31 fails with small build.
+Solution: Bail out for small build. (Hirohito Higashi)
+Files: src/testdir/test31.in
+
+Patch 7.4.1040
+Problem: The tee command is not available on MS-Windows.
+Solution: Adjust tee.c for MSVC and add a makefile. (Yasuhiro Matsumoto)
+Files: src/tee/tee.c, src/tee/Make_mvc.mak, src/Make_mvc.mak
+
+Patch 7.4.1041
+Problem: Various small things.
+Solution: Add file to list of distributed files. Adjust README. Fix typo.
+Files: Filelist, src/testdir/README.txt, src/testdir/test_charsearch.in,
+ src/INSTALLmac.txt
+
+Patch 7.4.1042
+Problem: g-CTRL-G shows the word count, but there is no way to get the word
+ count in a script.
+Solution: Add the wordcount() function. (Christian Brabandt)
+Files: runtime/doc/editing.txt, runtime/doc/eval.txt,
+ runtime/doc/usr_41.txt, src/eval.c, src/normal.c, src/ops.c,
+ src/proto/ops.pro, src/testdir/test_wordcount.in,
+ src/testdir/test_wordcount.ok, src/testdir/Make_all.mak
+
+Patch 7.4.1043
+Problem: Another small thing.
+Solution: Now really update the Mac install text.
+Files: src/INSTALLmac.txt
+
+Patch 7.4.1044 (after 7.4.1042)
+Problem: Can't build without the +eval feature.
+Solution: Add #ifdef.
+Files: src/ops.c
+
+Patch 7.4.1045
+Problem: Having shadow and coverage on the same build results in the source
+ files not being available in the coverage view.
+Solution: Move using shadow to the normal build.
+Files: .travis.yml
+
+Patch 7.4.1046
+Problem: No test coverage for menus.
+Solution: Load the standard menus and check there is no error.
+Files: src/testdir/test_menu.vim, src/testdir/test_alot.vim
+
+Patch 7.4.1047 (after patch 7.4.1042)
+Problem: Tests fail on MS-Windows.
+Solution: Set 'selection' to inclusive.
+Files: src/testdir/test_wordcount.in
+
+Patch 7.4.1048 (after patch 7.4.1047)
+Problem: Wordcount test still fail on MS-Windows.
+Solution: Set 'fileformat' to "unix".
+Files: src/testdir/test_wordcount.in
+
+Patch 7.4.1049 (after patch 7.4.1048)
+Problem: Wordcount test still fails on MS-Windows.
+Solution: Set 'fileformats' to "unix".
+Files: src/testdir/test_wordcount.in
+
+Patch 7.4.1050
+Problem: Warning for unused var with tiny features. (Tony Mechelynck)
+Solution: Add #ifdef. Use vim_snprintf(). Reduce number of statements.
+Files: src/ops.c
+
+Patch 7.4.1051
+Problem: Segfault when unletting "count".
+Solution: Check for readonly and locked first. (Dominique Pelle)
+ Add a test.
+Files: src/eval.c, src/testdir/test_alot.vim, src/testdir/test_unlet.vim
+
+Patch 7.4.1052
+Problem: Illegal memory access with weird syntax command. (Dominique Pelle)
+Solution: Check for column past end of line.
+Files: src/syntax.c
+
+Patch 7.4.1053
+Problem: Insufficient testing for quickfix commands.
+Solution: Add a new style quickfix test. (Yegappan Lakshmanan)
+Files: src/testdir/Make_all.mak, src/testdir/test_quickfix.vim
+
+Patch 7.4.1054
+Problem: Illegal memory access.
+Solution: Check for missing pattern. (Dominique Pelle)
+Files: src/syntax.c
+
+Patch 7.4.1055
+Problem: Running "make newtests" in src/testdir has no output.
+Solution: List the messages file when a test fails. (Christian Brabandt)
+ Update the list of tests.
+Files: src/Makefile, src/testdir/Makefile
+
+Patch 7.4.1056
+Problem: Don't know why finding spell suggestions is slow.
+Solution: Add some code to gather profiling information.
+Files: src/spell.c
+
+Patch 7.4.1057
+Problem: Typos in the :options window.
+Solution: Fix the typos. (Dominique Pelle)
+Files: runtime/optwin.vim
+
+Patch 7.4.1058
+Problem: It is not possible to test code that is only reached when memory
+ allocation fails.
+Solution: Add the alloc_fail() function. Try it out with :vimgrep.
+Files: runtime/doc/eval.txt, src/globals.h, src/eval.c, src/quickfix.c,
+ src/misc2.c, src/proto/misc2.pro, src/testdir/test_quickfix.vim
+
+Patch 7.4.1059
+Problem: Code will never be executed.
+Solution: Remove the code.
+Files: src/quickfix.c
+
+Patch 7.4.1060
+Problem: Instructions for writing tests are outdated.
+Solution: Mention Make_all.mak. Add steps for new style tests.
+Files: src/testdir/README.txt
+
+Patch 7.4.1061
+Problem: Compiler warning for ignoring return value of fwrite().
+Solution: Do use the return value. (idea: Charles Campbell)
+Files: src/misc2.c, src/proto/misc2.pro
+
+Patch 7.4.1062
+Problem: Building with Ruby on MS-Windows requires a lot of arguments.
+Solution: Make it simpler. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 7.4.1063
+Problem: TCL_VER_LONG and DYNAMIC_TCL_VER are not set when building with
+ Cygwin and MingW.
+Solution: Add TCL_VER_LONG and DYNAMIC_TCL_VER to the makefile. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1064
+Problem: When a spell file has single letter compounding creating
+ suggestions takes an awful long time.
+Solution: Add the NOCOMPOUNDSUGS flag.
+Files: runtime/doc/spell.txt, src/spell.c
+
+Patch 7.4.1065
+Problem: Cannot use the "dll" options on MS-Windows.
+Solution: Support the options on all platforms. Use the built-in name as
+ the default, so that it's clear what Vim is looking for.
+Files: src/if_python.c, src/if_python3.c, src/if_lua.c, src/if_perl.xs,
+ src/if_ruby.c, src/option.c, runtime/doc/options.txt, src/Makefile
+
+Patch 7.4.1066 (after 7.4.1065)
+Problem: Build fails on MS-Windows.
+Solution: Adjust the #ifdefs for "dll" options.
+Files: src/option.h
+
+Patch 7.4.1067 (after 7.4.1065)
+Problem: Can't build with MingW and Python on MS-Windows.
+Solution: Move the build flags to CFLAGS.
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1068
+Problem: Wrong way to check for unletting internal variables.
+Solution: Use a better way. (Olaf Dabrunz)
+Files: src/testdir/test_unlet.c, src/eval.c
+
+Patch 7.4.1069
+Problem: Compiler warning for unused argument.
+Solution: Add UNUSED.
+Files: src/misc2.c
+
+Patch 7.4.1070
+Problem: The Tcl interface can't be loaded dynamically on Unix.
+Solution: Make it possible to load it dynamically. (Ken Takata)
+Files: runtime/doc/if_tcl.txt, runtime/doc/options.txt,
+ runtime/doc/quickref.txt, runtime/optwin.vim, src/Makefile,
+ src/config.h.in, src/configure.in, src/auto/configure,
+ src/if_tcl.c, src/option.c, src/option.h
+
+Patch 7.4.1071
+Problem: New style tests are executed in arbitrary order.
+Solution: Sort the test function names. (Hirohito Higashi)
+ Fix the quickfix test that depended on the order.
+Files: src/testdir/runtest.vim, src/testdir/test_quickfix.vim
+
+Patch 7.4.1072
+Problem: Increment test is old style.
+Solution: Make the increment test a new style test. (Hirohito Higashi)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_increment.in, src/testdir/test_increment.ok,
+ src/testdir/test_increment.vim
+
+Patch 7.4.1073
+Problem: Alloc_id depends on numbers, may use the same one twice. It's not
+ clear from the number what it's for.
+Solution: Use an enum. Add a function to lookup the enum value from the
+ name.
+Files: src/misc2.c, src/vim.h, src/alloc.h, src/globals.h,
+ src/testdir/runtest.vim, src/proto/misc2.pro,
+ src/testdir/test_quickfix.vim
+
+Patch 7.4.1074
+Problem: Warning from VC2015 compiler.
+Solution: Add a type cast. (Mike Williams)
+Files: src/gui_dwrite.cpp
+
+Patch 7.4.1075
+Problem: Crash when using an invalid command.
+Solution: Fix generating the error message. (Dominique Pelle)
+Files: src/ex_docmd.c
+
+Patch 7.4.1076
+Problem: CTRL-A does not work well in right-left mode.
+Solution: Remove reversing the line, add a test. (Hirohito Higashi)
+Files: src/ops.c, src/testdir/test_increment.vim
+
+Patch 7.4.1077
+Problem: The build instructions for MS-Windows are incomplete.
+Solution: Add explanations for how to build with various interfaces. (Ken
+ Takata)
+Files: src/INSTALLpc.txt
+
+Patch 7.4.1078
+Problem: MSVC: "make clean" doesn't cleanup in the tee directory.
+Solution: Add the commands to cleanup tee. (Erich Ritz)
+Files: src/Make_mvc.mak
+
+Patch 7.4.1079 (after 7.4.1073)
+Problem: New include file missing from distribution. Missing changes to
+ quickfix code.
+Solution: Add alloc.h to the list of distributed files. Use the enum in
+ quickfix code.
+Files: Filelist, src/quickfix.c
+
+Patch 7.4.1080
+Problem: VS2015 has a function HandleToLong() that is shadowed by the macro
+ that Vim defines.
+Solution: Do not define HandleToLong() for MSVC version 1400 and later.
+ (Mike Williams)
+Files: src/gui_w32.c
+
+Patch 7.4.1081
+Problem: No test for what previously caused a crash.
+Solution: Add test for unletting errmsg.
+Files: src/testdir/test_unlet.vim
+
+Patch 7.4.1082
+Problem: The Tcl interface is always skipping memory free on exit.
+Solution: Only skip for dynamically loaded Tcl.
+Files: src/if_tcl.c
+
+Patch 7.4.1083
+Problem: Building GvimExt with VS2015 may fail.
+Solution: Adjust the makefile. (Mike Williams)
+Files: src/GvimExt/Makefile
+
+Patch 7.4.1084
+Problem: Using "." to repeat CTRL-A in Visual mode increments the wrong
+ numbers.
+Solution: Append right size to the redo buffer. (Ozaki Kiichi)
+Files: src/normal.c, src/testdir/test_increment.vim
+
+Patch 7.4.1085
+Problem: The CTRL-A and CTRL-X commands do not update the '[ and '] marks.
+Solution: (Yukihiro Nakadaira)
+Files: src/ops.c, src/testdir/test_marks.in, src/testdir/test_marks.ok
+
+Patch 7.4.1086
+Problem: Crash with an extremely long buffer name.
+Solution: Limit the return value of vim_snprintf(). (Dominique Pelle)
+Files: src/buffer.c
+
+Patch 7.4.1087
+Problem: CTRL-A and CTRL-X do not work properly with blockwise visual
+ selection if there is a mix of Tab and spaces.
+Solution: Add OP_NR_ADD and OP_NR_SUB. (Hirohito Higashi)
+Files: src/testdir/test_increment.vim, src/normal.c, src/ops.c,
+ src/proto/ops.pro, src/vim.h
+
+Patch 7.4.1088
+Problem: Coverity warns for uninitialized variables. Only one is an actual
+ problem.
+Solution: Move the conditions. Don't use endpos if handling an error.
+Files: src/ops.c
+
+Patch 7.4.1089
+Problem: Repeating CTRL-A doesn't work.
+Solution: Call prep_redo_cmd(). (Hirohito Higashi)
+Files: src/normal.c, src/testdir/test_increment.vim
+
+Patch 7.4.1090
+Problem: No tests for :hardcopy and related options.
+Solution: Add test_hardcopy.
+Files: src/testdir/test_hardcopy.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 7.4.1091
+Problem: When making a change while need_wait_return is set there is a two
+ second delay.
+Solution: Do not assume the ATTENTION prompt was given when need_wait_return
+ was set already.
+Files: src/misc1.c
+
+Patch 7.4.1092
+Problem: It is not simple to test for an exception and give a proper error
+ message.
+Solution: Add assert_exception().
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 7.4.1093
+Problem: Typo in test goes unnoticed.
+Solution: Fix the typo. Give error for wrong arguments to cursor().
+ (partly by Hirohito Higashi) Add a test for cursor().
+Files: src/testdir/test_searchpos.vim, src/testdir/test_cursor_func.vim,
+ src/eval.c, src/testdir/test_alot.vim
+
+Patch 7.4.1094
+Problem: Test for :hardcopy fails on MS-Windows.
+Solution: Check for the +postscript feature.
+Files: src/testdir/test_hardcopy.vim
+
+Patch 7.4.1095
+Problem: Can't build GvimExt with SDK 7.1.
+Solution: Support using setenv.bat instead of vcvars32.bat. (Ken Takata)
+Files: src/Make_mvc.mak, src/GvimExt/Makefile
+
+Patch 7.4.1096
+Problem: Need several lines to verify a command produces an error.
+Solution: Add assert_fails(). (suggested by Nikolai Pavlov)
+ Make the quickfix alloc test actually work.
+Files: src/testdir/test_quickfix.vim, src/eval.c, runtime/doc/eval.txt,
+ src/misc2.c, src/alloc.h
+
+Patch 7.4.1097
+Problem: Looking up the alloc ID for tests fails.
+Solution: Fix the line computation. Use assert_fails() for unlet test.
+Files: src/testdir/runtest.vim, src/testdir/test_unlet.vim
+
+Patch 7.4.1098
+Problem: Still using old style C function declarations.
+Solution: Always define __ARGS() to include types. Turn a few functions
+ into ANSI style to find out if this causes problems for anyone.
+Files: src/vim.h, src/os_unix.h, src/eval.c, src/main.c
+
+Patch 7.4.1099
+Problem: It's not easy to know if Vim supports blowfish. (Smu Johnson)
+Solution: Add has('crypt-blowfish') and has('crypt-blowfish2').
+Files: src/eval.c
+
+Patch 7.4.1100
+Problem: Cygwin makefiles are unused.
+Solution: Remove them.
+Files: src/GvimExt/Make_ming.mak, src/GvimExt/Make_cyg.mak,
+ src/xxd/Make_ming.mak, src/xxd/Make_cyg.mak
+
+Patch 7.4.1101
+Problem: With 'rightleft' and concealing the cursor may move to the wrong
+ position.
+Solution: Compute the column differently when 'rightleft' is set. (Hirohito
+ Higashi)
+Files: src/screen.c
+
+Patch 7.4.1102
+Problem: Debugger has no stack backtrace support.
+Solution: Add "backtrace", "frame", "up" and "down" commands. (Alberto
+ Fanjul, closes #433)
+Files: runtime/doc/repeat.txt, src/eval.c, src/ex_cmds2.c, src/globals.h,
+ src/testdir/Make_all.mak, src/testdir/test108.in,
+ src/testdir/test108.ok
+
+Patch 7.4.1103 (after 7.4.1100)
+Problem: Removed file still in distribution.
+Solution: Remove Make_cyg.mak from the list of files.
+Files: Filelist
+
+Patch 7.4.1104
+Problem: Various problems building with MzScheme/Racket.
+Solution: Make it work with new versions of Racket. (Yukihiro Nakadaira, Ken
+ Takata)
+Files: runtime/doc/if_mzsch.txt, src/INSTALLpc.txt,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/auto/configure,
+ src/configure.in, src/if_mzsch.c
+
+Patch 7.4.1105
+Problem: When using slices there is a mixup of variable name and namespace.
+Solution: Recognize variables that can't be a namespace. (Hirohito Higashi)
+Files: src/eval.c, src/testdir/test_eval.in, src/testdir/test_eval.ok
+
+Patch 7.4.1106
+Problem: The nsis script can't be used from the appveyor build.
+Solution: Add "ifndef" to allow for variables to be set from the command
+ line. Remove duplicate SetCompressor command. Support using other
+ gettext binaries. (Ken Takata) Update build instructions to use
+ libintl-8.dll.
+Files: Makefile, nsis/gvim.nsi, src/os_win32.c, src/proto/os_win32.pro,
+ src/main.c, os_w32exe.c
+
+Patch 7.4.1107
+Problem: Vim can create a directory but not delete it.
+Solution: Add an argument to delete() to make it possible to delete a
+ directory, also recursively.
+Files: src/fileio.c, src/eval.c, src/proto/fileio.pro,
+ src/testdir/test_delete.vim, src/testdir/test_alot.vim,
+ runtime/doc/eval.txt
+
+Patch 7.4.1108
+Problem: Expanding "~" halfway a file name.
+Solution: Handle the file name as one name. (Marco Hinz) Add a test.
+ Closes #564.
+Files: src/testdir/test27.in, src/testdir/test27.ok,
+ src/testdir/test_expand.vim, src/testdir/test_alot.vim,
+ src/Makefile, src/misc2.c
+
+Patch 7.4.1109 (after 7.4.1107)
+Problem: MS-Windows doesn't have rmdir().
+Solution: Add mch_rmdir().
+Files: src/os_win32.c, src/proto/os_win32.pro
+
+Patch 7.4.1110
+Problem: Test 108 fails when language is French.
+Solution: Force English messages. (Dominique Pelle)
+Files: src/testdir/test108.in
+
+Patch 7.4.1111
+Problem: test_expand fails on MS-Windows.
+Solution: Always use forward slashes. Remove references to test27.
+Files: src/testdir/runtest.vim, src/testdir/test_expand.vim,
+ src/testdir/Make_dos.mak, src/testdir/Make_all.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_ming.mak
+
+Patch 7.4.1112
+Problem: When using ":next" with an illegal file name no error is reported.
+Solution: Give an error message.
+Files: src/ex_cmds2.c
+
+Patch 7.4.1113 (after 7.4.1105)
+Problem: Using {ns} in variable name does not work. (lilydjwg)
+Solution: Fix recognizing colon. Add a test.
+Files: src/eval.c, src/testdir/test_viml.vim
+
+Patch 7.4.1114 (after 7.4.1107)
+Problem: delete() does not work well with symbolic links.
+Solution: Recognize symbolic links.
+Files: src/eval.c, src/fileio.c, src/os_unix.c, src/proto/os_unix.pro,
+ src/testdir/test_delete.vim, runtime/doc/eval.txt
+
+Patch 7.4.1115
+Problem: MS-Windows: make clean in testdir doesn't clean everything.
+Solution: Add command to delete X* directories. (Ken Takata)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.4.1116
+Problem: delete(x, 'rf') does not delete files starting with a dot.
+Solution: Also delete files starting with a dot.
+Files: src/misc1.c, src/fileio.c, src/vim.h
+
+Patch 7.4.1117 (after 7.4.1116)
+Problem: No longer get "." and ".." in directory list.
+Solution: Do not skip "." and ".." unless EW_DODOT is set.
+Files: src/misc1.c
+
+Patch 7.4.1118
+Problem: Tests hang in 24 line terminal.
+Solution: Set the 'more' option off.
+Files: src/testdir/runtest.vim
+
+Patch 7.4.1119
+Problem: argidx() has a wrong value after ":%argdelete". (Yegappan
+ Lakshmanan)
+Solution: Correct the value of w_arg_idx. Add a test.
+Files: src/ex_cmds2.c, src/testdir/test_arglist.vim,
+ src/testdir/Make_all.mak
+
+Patch 7.4.1120
+Problem: delete(x, 'rf') fails if a directory is empty. (Lcd)
+Solution: Ignore not finding matches in an empty directory.
+Files: src/fileio.c, src/misc1.c, src/vim.h, src/testdir/test_delete.vim
+
+Patch 7.4.1121
+Problem: test_expand leaves files behind.
+Solution: Edit another file before deleting, otherwise the swap file
+ remains.
+Files: src/testdir/test_expand.vim
+
+Patch 7.4.1122
+Problem: Test 92 and 93 fail when using gvim on a system with a non utf-8
+ locale.
+Solution: Avoid using .gvimrc by adding -U NONE. (Yukihiro Nakadaira)
+Files: src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile
+
+Patch 7.4.1123
+Problem: Using ":argadd" when there are no arguments results in the second
+ argument to be the current one. (Yegappan Lakshmanan)
+Solution: Correct the w_arg_idx value.
+Files: src/ex_cmds2.c, src/testdir/test_arglist.vim
+
+Patch 7.4.1124
+Problem: MS-Windows: dead key behavior is not ideal.
+Solution: Handle dead keys differently when not in Insert or Select mode.
+ (John Wellesz, closes #399)
+Files: src/gui_w48.c
+
+Patch 7.4.1125
+Problem: There is no perleval().
+Solution: Add perleval(). (Damien)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/eval.c,
+ src/if_perl.xs, src/proto/if_perl.pro, src/testdir/Make_all.mak,
+ src/testdir/test_perl.vim
+
+Patch 7.4.1126
+Problem: Can only get the directory of the current window.
+Solution: Add window and tab arguments to getcwd() and haslocaldir().
+ (Thinca, Hirohito Higashi)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_getcwd.in, src/testdir/test_getcwd.ok,
+ runtime/doc/eval.txt, patching file src/eval.c
+
+Patch 7.4.1127
+Problem: Both old and new style tests for Perl.
+Solution: Merge the old tests with the new style tests.
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/test_perl.in,
+ src/testdir/test_perl.ok, src/testdir/test_perl.vim
+
+Patch 7.4.1128
+Problem: MS-Windows: delete() does not recognize junctions.
+Solution: Add mch_isrealdir() for MS-Windows. Update mch_is_symbolic_link().
+ (Ken Takata)
+Files: src/fileio.c, src/os_win32.c, src/proto/os_win32.pro
+
+Patch 7.4.1129
+Problem: Python None value can't be converted to a Vim value.
+Solution: Just use zero. (Damien)
+Files: src/if_py_both.h, src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok,
+
+Patch 7.4.1130
+Problem: Memory leak in :vimgrep.
+Solution: Call FreeWild(). (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 7.4.1131
+Problem: New lines in the viminfo file are dropped.
+Solution: Copy lines starting with "|". Fix that when using :rviminfo in a
+ function global variables were restored as function-local
+ variables.
+Files: src/eval.c, src/structs.h, src/ex_cmds.c, src/misc2.c,
+ src/proto/misc2.pro, src/testdir/test_viminfo.vim,
+ src/testdir/Make_all.mak, src/testdir/test74.in,
+ src/testdir/test74.ok
+
+Patch 7.4.1132
+Problem: Old style tests for the argument list.
+Solution: Add more new style tests. (Yegappan Lakshmanan)
+Files: src/testdir/test_arglist.vim, src/testdir/test_argument_0count.in,
+ src/testdir/test_argument_0count.ok,
+ src/testdir/test_argument_count.in, src/Makefile,
+ src/testdir/test_argument_count.ok, src/testdir/Make_all.mak
+
+Patch 7.4.1133
+Problem: Generated function prototypes still have __ARGS().
+Solution: Generate function prototypes without __ARGS().
+Files: src/Makefile, src/if_ruby.c, src/os_win32.c,
+ src/proto/blowfish.pro, src/proto/buffer.pro,
+ src/proto/charset.pro, src/proto/crypt.pro,
+ src/proto/crypt_zip.pro, src/proto/diff.pro,
+ src/proto/digraph.pro, src/proto/edit.pro, src/proto/eval.pro,
+ src/proto/ex_cmds2.pro, src/proto/ex_cmds.pro,
+ src/proto/ex_docmd.pro, src/proto/ex_eval.pro,
+ src/proto/ex_getln.pro, src/proto/fileio.pro, src/proto/fold.pro,
+ src/proto/getchar.pro, src/proto/gui_athena.pro,
+ src/proto/gui_beval.pro, src/proto/gui_gtk_gresources.pro,
+ src/proto/gui_gtk.pro, src/proto/gui_gtk_x11.pro,
+ src/proto/gui_mac.pro, src/proto/gui_motif.pro,
+ src/proto/gui_photon.pro, src/proto/gui.pro,
+ src/proto/gui_w16.pro, src/proto/gui_w32.pro,
+ src/proto/gui_x11.pro, src/proto/gui_xmdlg.pro,
+ src/proto/hangulin.pro, src/proto/hardcopy.pro,
+ src/proto/hashtab.pro, src/proto/if_cscope.pro,
+ src/proto/if_lua.pro, src/proto/if_mzsch.pro,
+ src/proto/if_ole.pro, src/proto/if_perl.pro,
+ src/proto/if_perlsfio.pro, src/proto/if_python3.pro,
+ src/proto/if_python.pro, src/proto/if_ruby.pro,
+ src/proto/if_tcl.pro, src/proto/if_xcmdsrv.pro,
+ src/proto/main.pro, src/proto/mark.pro, src/proto/mbyte.pro,
+ src/proto/memfile.pro, src/proto/memline.pro, src/proto/menu.pro,
+ src/proto/message.pro, src/proto/misc1.pro, src/proto/misc2.pro,
+ src/proto/move.pro, src/proto/netbeans.pro, src/proto/normal.pro,
+ src/proto/ops.pro, src/proto/option.pro, src/proto/os_amiga.pro,
+ src/proto/os_beos.pro, src/proto/os_mac_conv.pro,
+ src/proto/os_msdos.pro, src/proto/os_mswin.pro,
+ src/proto/os_qnx.pro, src/proto/os_unix.pro, src/proto/os_vms.pro,
+ src/proto/os_win16.pro, src/proto/os_win32.pro,
+ src/proto/popupmnu.pro, src/proto/pty.pro, src/proto/quickfix.pro,
+ src/proto/regexp.pro, src/proto/screen.pro, src/proto/search.pro,
+ src/proto/sha256.pro, src/proto/spell.pro, src/proto/syntax.pro,
+ src/proto/tag.pro, src/proto/termlib.pro, src/proto/term.pro,
+ src/proto/ui.pro, src/proto/undo.pro, src/proto/version.pro,
+ src/proto/winclip.pro, src/proto/window.pro,
+ src/proto/workshop.pro
+
+Patch 7.4.1134
+Problem: The arglist test fails on MS-Windows.
+Solution: Only check for failure of argedit on Unix.
+Files: src/testdir/test_arglist.vim
+
+Patch 7.4.1135
+Problem: One more arglist test fails on MS-Windows.
+Solution: Don't edit "Y" after editing "y".
+Files: src/testdir/test_arglist.vim
+
+Patch 7.4.1136
+Problem: Wrong argument to assert_exception() causes a crash. (reported by
+ Coverity)
+Solution: Check for NULL pointer. Add a test.
+Files: src/eval.c, src/testdir/test_assert.vim
+
+Patch 7.4.1137
+Problem: Illegal memory access when using :copen and :cclose.
+Solution: Avoid that curbuf is invalid. (suggestion by Justin M. Keyes)
+ Add a test.
+Files: src/window.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1138
+Problem: When running gvim in the foreground some icons are missing.
+ (Taylor Venable)
+Solution: Move the call to gui_gtk_register_resource(). (Kazunobu Kuriyama)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.1139
+Problem: MS-Windows: getftype() returns "file" for symlink to directory.
+Solution: Make it return "dir". (Ken Takata)
+Files: src/os_mswin.c
+
+Patch 7.4.1140
+Problem: Recognizing <sid> does not work when the language is Turkish.
+ (Christian Brabandt)
+Solution: Use MB_STNICMP() instead of STNICMP().
+Files: src/eval.c
+
+Patch 7.4.1141
+Problem: Using searchpair() with a skip expression that uses syntax
+ highlighting sometimes doesn't work. (David Fishburn)
+Solution: Reset next_match_idx. (Christian Brabandt)
+Files: src/syntax.c
+
+Patch 7.4.1142
+Problem: Cannot define keyword characters for a syntax file.
+Solution: Add the ":syn iskeyword" command. (Christian Brabandt)
+Files: runtime/doc/options.txt, runtime/doc/syntax.txt, src/buffer.c,
+ src/option.c, src/structs.h, src/syntax.c,
+ src/testdir/Make_all.mak, src/testdir/test_syntax.vim
+
+Patch 7.4.1143
+Problem: Can't sort on floating point numbers.
+Solution: Add the "f" flag to ":sort". (Alex Jakushev) Also add the "f"
+ flag to sort().
+Files: runtime/doc/change.txt, src/ex_cmds.c, src/testdir/test_sort.vim,
+ src/testdir/test57.in, src/testdir/test57.ok, src/eval.c
+
+Patch 7.4.1144 (after 7.4.1143)
+Problem: Can't build on several systems.
+Solution: Include float.h. (Christian Robinson, closes #570 #571)
+Files: src/ex_cmds.c
+
+Patch 7.4.1145
+Problem: Default features are conservative.
+Solution: Make the default feature set for most of today's systems "huge".
+Files: src/feature.h, src/configure.in, src/auto/configure
+
+Patch 7.4.1146
+Problem: Can't build with Python 3 interface using MingW.
+Solution: Update the Makefile. (Yasuhiro Matsumoto, Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1147
+Problem: Conflict for "chartab". (Kazunobu Kuriyama)
+Solution: Rename the global one to something less obvious. Move it into
+ src/chartab.c.
+Files: src/macros.h, src/globals.h, src/charset.c, src/main.c,
+ src/option.c, src/screen.c, src/vim.h
+
+Patch 7.4.1148
+Problem: Default for MingW and Cygwin is still "normal".
+Solution: Use "huge" as default. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 7.4.1149 (after 7.4.1013)
+Problem: Using the local value of 'errorformat' causes more problems than
+ it solves.
+Solution: Revert 7.4.1013.
+Files: runtime/doc/quickfix.txt, src/quickfix.c
+
+Patch 7.4.1150
+Problem: 'langmap' applies to the first character typed in Select mode.
+ (David Watson)
+Solution: Check for SELECTMODE. (Christian Brabandt, closes #572)
+ Add the 'x' flag to feedkeys().
+Files: src/getchar.c, src/normal.c, src/testdir/test_langmap.vim,
+ src/ex_docmd.c, src/proto/ex_docmd.pro, src/testdir/Make_all.mak,
+ runtime/doc/eval.txt
+
+Patch 7.4.1151 (after 7.4.1150)
+Problem: Missing change to eval.c
+Solution: Also change feedkeys().
+Files: src/eval.c
+
+Patch 7.4.1152
+Problem: Langmap test fails with normal build.
+Solution: Check for +langmap feature.
+Files: src/testdir/test_langmap.vim
+
+Patch 7.4.1153
+Problem: Autocommands triggered by quickfix cannot always get the current
+ title value.
+Solution: Call qf_fill_buffer() later. (Christian Brabandt)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1154
+Problem: No support for JSON.
+Solution: Add jsonencode() and jsondecode(). Also add v:false, v:true,
+ v:null and v:none.
+Files: src/json.c, src/eval.c, src/proto.h, src/structs.h, src/vim.h,
+ src/if_lua.c, src/if_mzsch.c, src/if_ruby.c, src/if_py_both.h,
+ src/globals.h, src/Makefile, src/Make_bc3.mak, src/Make_bc5.mak,
+ src/Make_cyg_ming.mak, src/Make_dice.mak, src/Make_ivc.mak,
+ src/Make_manx.mak, src/Make_morph.mak, src/Make_mvc.mak,
+ src/Make_sas.mak, src/Make_vms.mms, src/proto/json.pro,
+ src/proto/eval.pro, src/testdir/test_json.vim,
+ src/testdir/test_alot.vim, Filelist, runtime/doc/eval.txt
+
+Patch 7.4.1155
+Problem: Build with normal features fails.
+Solution: Always define dict_lookup().
+Files: src/eval.c
+
+Patch 7.4.1156
+Problem: Coverity warns for NULL pointer and ignoring return value.
+Solution: Check for NULL pointer. When dict_add() returns FAIL free the item.
+Files: src/json.c
+
+Patch 7.4.1157
+Problem: type() does not work for v:true, v:none, etc.
+Solution: Add new type numbers.
+Files: src/eval.c, src/testdir/test_json.vim, src/testdir/test_viml.vim
+
+Patch 7.4.1158
+Problem: Still using __ARGS().
+Solution: Remove __ARGS() from eval.c
+Files: src/eval.c
+
+Patch 7.4.1159
+Problem: Automatically generated function prototypes use __ARGS.
+Solution: Remove __ARGS from osdef.sh.
+Files: src/osdef.sh, src/osdef1.h.in, src/osdef2.h.in
+
+Patch 7.4.1160
+Problem: No error for jsondecode('"').
+Solution: Give an error message for missing double quote.
+Files: src/json.c
+
+Patch 7.4.1161
+Problem: ":argadd" without argument is supposed to add the current buffer
+ name to the arglist.
+Solution: Make it work as documented. (Coot, closes #577)
+Files: src/ex_cmds.h, src/ex_cmds2.c, src/testdir/test_arglist.vim
+
+Patch 7.4.1162
+Problem: Missing error number in MzScheme. (Dominique Pelle)
+Solution: Add a proper error number.
+Files: src/if_mzsch.c
+
+Patch 7.4.1163
+Problem: Expressions "0 + v:true" and "'' . v:true" cause an error.
+Solution: Return something sensible when using a special variable as a
+ number or as a string. (suggested by Damien)
+Files: src/eval.c, src/testdir/test_viml.vim
+
+Patch 7.4.1164
+Problem: No tests for comparing special variables. Error in jsondecode()
+ not reported. test_json does not work with Japanese system.
+Solution: Set scriptencoding. (Ken Takata) Add a few more tests. Add error.
+Files: src/json.c, src/testdir/test_viml.vim, src/testdir/test_json.vim
+
+Patch 7.4.1165
+Problem: When defining DYNAMIC_ICONV_DLL in the makefile, the build fails.
+Solution: Add #ifdef's. (Taro Muraoka) Try the newer version first.
+Files: src/mbyte.c, src/os_win32.c
+
+Patch 7.4.1166
+Problem: Can't encode a Funcref into JSON. jsonencode() doesn't handle the
+ same list or dict twice properly. (Nikolai Pavlov)
+Solution: Give an error. Reset copyID when the list or dict is finished.
+Files: src/json.c, src/proto/json.pro, src/testdir/test_json.vim
+
+Patch 7.4.1167
+Problem: No tests for "is" and "isnot" with the new variables.
+Solution: Add tests.
+Files: src/testdir/test_viml.vim
+
+Patch 7.4.1168
+Problem: This doesn't give the right result: eval(string(v:true)). (Nikolai
+ Pavlov)
+Solution: Make the string "v:true" instead of "true".
+Files: src/eval.c, src/testdir/test_viml.vim
+
+Patch 7.4.1169
+Problem: The socket I/O is intertwined with the netbeans code.
+Solution: Start refactoring the netbeans communication to split off the
+ socket I/O. Add the +channel feature.
+Files: src/channel.c, src/netbeans.c, src/proto/channel.pro,
+ src/proto/netbeans.pro, src/proto/gui_w32.pro, src/gui_w32.c,
+ src/eval.c, src/os_mswin.c, src/ui.c, src/macros.h, Makefile,
+ src/proto.h, src/feature.h, src/os_unix.c, src/vim.h,
+ src/configure.in, src/auto/configure, src/config.mk.in,
+ src/config.aap.in, src/config.h.in, src/Make_bc5.mak,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 7.4.1170 (after 7.4.1169)
+Problem: Missing changes in src/Makefile, Filelist.
+Solution: Add the missing changes.
+Files: Filelist, src/Makefile
+
+Patch 7.4.1171
+Problem: Makefile dependencies are outdated.
+Solution: Run "make depend". Add GTK resource dependencies.
+Files: src/Makefile
+
+Patch 7.4.1172 (after 7.4.1169)
+Problem: Configure is overly positive.
+Solution: Insert "test".
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.1173 (after 7.4.1168)
+Problem: No test for new behavior of v:true et al.
+Solution: Add a test.
+Files: src/testdir/test_viml.vim
+
+Patch 7.4.1174
+Problem: Netbeans contains dead code inside #ifndef INIT_SOCKETS.
+Solution: Remove the dead code.
+Files: src/netbeans.c
+
+Patch 7.4.1175 (after 7.4.1169)
+Problem: Can't build with Mingw and Cygwin.
+Solution: Remove extra "endif". (Christian J. Robinson)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1176
+Problem: Missing change to proto file.
+Solution: Update the proto file. (Charles Cooper)
+Files: src/proto/gui_w32.pro
+
+Patch 7.4.1177
+Problem: The +channel feature is not in :version output. (Tony Mechelynck)
+Solution: Add the feature string.
+Files: src/version.c
+
+Patch 7.4.1178
+Problem: empty() doesn't work for the new special variables.
+Solution: Make empty() work. (Damien)
+Files: src/eval.c, src/testdir/test_viml.vim
+
+Patch 7.4.1179
+Problem: test_writefile and test_viml do not delete the tempfile.
+Solution: Delete the tempfile. (Charles Cooper) Add DeleteTheScript().
+Files: src/testdir/test_writefile.in, src/testdir/test_viml.vim
+
+Patch 7.4.1180
+Problem: Crash with invalid argument to glob2regpat().
+Solution: Check for NULL. (Justin M. Keyes, closes #596) Add a test.
+Files: src/eval.c, src/testdir/test_glob2regpat.vim,
+ src/testdir/test_alot.vim
+
+Patch 7.4.1181
+Problem: free_tv() can't handle special variables. (Damien)
+Solution: Add the variable type.
+Files: src/eval.c, src/testdir/test_viml.vim
+
+Patch 7.4.1182
+Problem: Still socket code intertwined with netbeans.
+Solution: Move code from netbeans.c to channel.c
+Files: src/channel.c, src/netbeans.c, src/proto/channel.pro,
+ src/proto/netbeans.pro, src/gui.c, src/gui_w48.c
+
+Patch 7.4.1183 (after 7.4.1182)
+Problem: MS-Windows build is broken.
+Solution: Remove init in wrong place.
+Files: src/channel.c
+
+Patch 7.4.1184 (after 7.4.1182)
+Problem: MS-Windows build is still broken.
+Solution: Change nbsock to ch_fd.
+Files: src/channel.c
+
+Patch 7.4.1185
+Problem: Can't build with TCL on some systems.
+Solution: Rename the channel_ functions.
+Files: src/if_tcl.c
+
+Patch 7.4.1186
+Problem: Error messages for security context are hard to translate.
+Solution: Use one string with %s. (Ken Takata)
+Files: src/os_unix.c
+
+Patch 7.4.1187
+Problem: MS-Windows channel code only supports one channel. Doesn't build
+ without netbeans support.
+Solution: Get the channel index from the socket in the message. Closes #600.
+Files: src/channel.c, src/netbeans.c, src/gui_w48.c,
+ src/proto/channel.pro, src/proto/netbeans.pro
+
+Patch 7.4.1188
+Problem: Using older JSON standard.
+Solution: Update the link. Adjust the text a bit.
+Files: src/json.c, runtime/doc/eval.txt
+
+Patch 7.4.1189 (after 7.4.1165)
+Problem: Using another language on MS-Windows does not work. (Yongwei Wu)
+Solution: Undo the change to try loading libintl-8.dll first.
+Files: src/os_win32.c
+
+Patch 7.4.1190
+Problem: On OSX the default flag for dlopen() is different.
+Solution: Add RTLD_LOCAL in the configure check. (sv99, closes #604)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.1191
+Problem: The channel feature isn't working yet.
+Solution: Add the connect(), disconnect(), sendexpr() and sendraw()
+ functions. Add initial documentation. Add a demo server.
+Files: src/channel.c, src/eval.c, src/proto/channel.pro,
+ src/proto/eval.pro, runtime/doc/channel.txt, runtime/doc/eval.txt,
+ runtime/doc/Makefile, runtime/tools/demoserver.py
+
+Patch 7.4.1192
+Problem: Can't build with FEAT_EVAL but without FEAT_MBYTE. (John
+ Marriott)
+Solution: Add #ifdef for FEAT_MBYTE.
+Files: src/json.c
+
+Patch 7.4.1193
+Problem: Can't build the channel feature on MS-Windows.
+Solution: Add #ifdef HAVE_POLL.
+Files: src/channel.c
+
+Patch 7.4.1194
+Problem: Compiler warning for not using return value of fwrite().
+Solution: Return OK/FAIL. (Charles Campbell)
+Files: src/channel.c, src/proto/channel.pro
+
+Patch 7.4.1195
+Problem: The channel feature does not work in the MS-Windows console.
+Solution: Add win32 console support. (Yasuhiro Matsumoto)
+Files: src/channel.c, src/gui_w32.c, src/os_mswin.c, src/os_win32.c,
+ src/proto/gui_w32.pro, src/proto/os_mswin.pro, src/vim.h
+
+Patch 7.4.1196
+Problem: Still using __ARGS.
+Solution: Remove __ARGS in several files. (script by Hirohito Higashi)
+Files: src/arabic.c, src/buffer.c, src/charset.c, src/crypt_zip.c,
+ src/diff.c, src/digraph.c, src/edit.c, src/ex_cmds.c,
+ src/ex_cmds2.c, src/ex_docmd.c
+
+Patch 7.4.1197
+Problem: Still using __ARGS.
+Solution: Remove __ARGS in several files. (script by Hirohito Higashi)
+Files: src/ex_eval.c, src/ex_getln.c, src/farsi.c, src/fileio.c,
+ src/fold.c, src/getchar.c, src/gui.c, src/gui_at_fs.c,
+ src/gui_at_sb.c, src/gui_athena.c, src/gui_beval.c,
+ src/gui_motif.c, src/gui_w32.c, src/gui_w48.c
+
+Patch 7.4.1198
+Problem: Still using __ARGS.
+Solution: Remove __ARGS in several files. (script by Hirohito Higashi)
+ Also remove use of HAVE_STDARG_H.
+Files: src/gui_x11.c, src/hangulin.c, src/hardcopy.c, src/hashtab.c,
+ src/if_cscope.c, src/if_python3.c, src/if_sniff.c,
+ src/if_xcmdsrv.c, src/main.c, src/mark.c, src/mbyte.c,
+ src/memfile.c, src/memfile_test.c, src/memline.c, src/menu.c,
+ src/message.c, src/misc1.c, src/misc2.c, src/move.c,
+ src/netbeans.c, src/normal.c
+
+Patch 7.4.1199
+Problem: Still using __ARGS.
+Solution: Remove __ARGS in several files. (script by Hirohito Higashi)
+Files: src/ops.c, src/option.c, src/os_amiga.c, src/os_mac_conv.c,
+ src/os_unix.c, src/os_vms.c, src/os_w32exe.c, src/popupmnu.c,
+ src/pty.c, src/quickfix.c, src/regexp.c, src/regexp_nfa.c,
+ src/screen.c, src/search.c, src/sha256.c, src/spell.c,
+ src/syntax.c, src/tag.c, src/term.c, src/termlib.c, src/ui.c,
+ src/undo.c, src/version.c, src/window.c
+
+Patch 7.4.1200
+Problem: Still using __ARGS.
+Solution: Remove __ARGS in several files. (script by Hirohito Higashi)
+Files: src/blowfish.c, src/ex_cmds2.c, src/ex_getln.c, src/fold.c,
+ src/gui_beval.c, src/gui_w32.c, src/os_unix.c, src/os_win16.c,
+ src/pty.c, src/regexp.c, src/syntax.c, src/xpm_w32.c,
+ src/ex_cmds.h, src/globals.h, src/gui_at_sb.h, src/gui_beval.h,
+ src/if_cscope.h, src/if_sniff.h, src/nbdebug.h, src/os_unix.h,
+ src/proto.h, src/structs.h, src/vim.h, src/xpm_w32.h,
+ src/if_perl.xs, src/proto/if_lua.pro, src/proto/pty.pro,
+ runtime/tools/xcmdsrv_client.c,
+ src/Makefile
+
+Patch 7.4.1201
+Problem: One more file still using __ARGS.
+Solution: Remove __ARGS in the last file. (script by Hirohito Higashi)
+Files: src/gui_at_sb.c
+
+Patch 7.4.1202
+Problem: Still one more file still using __ARGS.
+Solution: Remove __ARGS in the last file. (script by Hirohito Higashi)
+ (closes #612)
+Files: src/proto/os_mac_conv.pro, src/os_mac_conv.c, src/Makefile
+
+Patch 7.4.1203
+Problem: Still more files still using __ARGS.
+Solution: Remove __ARGS in really the last files.
+Files: src/proto/if_mzsch.pro, src/if_mzsch.c, src/vim.h,
+ src/proto/gui_gtk_gresources.pro, src/proto/gui_mac.pro,
+ src/proto/if_ole.pro, src/proto/os_qnx.pro, src/Makefile
+
+Patch 7.4.1204
+Problem: Latin1 characters cause encoding conversion.
+Solution: Remove the characters.
+Files: src/gui_motif.c
+
+Patch 7.4.1205
+Problem: Using old style function declarations.
+Solution: Change to new style function declarations. (script by Hirohito
+ Higashi)
+Files: src/arabic.c, src/blowfish.c, src/buffer.c, src/channel.c,
+ src/charset.c, src/crypt.c, src/crypt_zip.c, src/diff.c,
+ src/digraph.c, src/edit.c, src/eval.c
+
+Patch 7.4.1206
+Problem: Using old style function declarations.
+Solution: Change to new style function declarations. (script by Hirohito
+ Higashi)
+Files: src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c,
+ src/ex_getln.c, src/farsi.c, src/fileio.c
+
+Patch 7.4.1207
+Problem: Using old style function declarations.
+Solution: Change to new style function declarations. (script by Hirohito
+ Higashi)
+Files: src/fold.c, src/getchar.c, src/gui_at_fs.c, src/gui_athena.c,
+ src/gui_at_sb.c, src/gui_beval.c, src/gui.c, src/gui_gtk.c,
+ src/gui_gtk_x11.c, src/gui_mac.c, src/gui_motif.c
+
+Patch 7.4.1208
+Problem: Using old style function declarations.
+Solution: Change to new style function declarations. (script by Hirohito
+ Higashi)
+Files: src/gui_photon.c, src/gui_w32.c, src/gui_w48.c, src/gui_x11.c,
+ src/hangulin.c, src/hardcopy.c, src/hashtab.c, src/if_cscope.c,
+ src/if_mzsch.c, src/if_perlsfio.c, src/if_python.c,
+ src/if_python3.c, src/if_ruby.c, src/if_sniff.c, src/if_tcl.c,
+ src/if_xcmdsrv.c, src/integration.c
+
+Patch 7.4.1209 (after 7.4.1207)
+Problem: Can't build with Athena. (Elimar Riesebieter)
+Solution: Fix function declarations.
+Files: src/gui_athena.c, src/gui_x11.c, src/gui_at_sb.c, src/gui_at_fs.c
+
+Patch 7.4.1210
+Problem: Using old style function declarations.
+Solution: Change to new style function declarations. (script by Hirohito
+ Higashi)
+Files: src/main.c, src/mark.c, src/mbyte.c, src/memfile.c,
+ src/memfile_test.c, src/memline.c, src/menu.c, src/message.c
+
+Patch 7.4.1211
+Problem: Using old style function declarations.
+Solution: Change to new style function declarations. (script by Hirohito
+ Higashi)
+Files: src/misc1.c, src/misc2.c, src/move.c, src/netbeans.c,
+ src/normal.c, src/ops.c, src/option.c
+
+Patch 7.4.1212 (after 7.4.1207)
+Problem: Can't build with Motif.
+Solution: Fix function declaration.(Dominique Pelle)
+Files: src/gui_motif.c
+
+Patch 7.4.1213
+Problem: Using old style function declarations.
+Solution: Change to new style function declarations. (script by Hirohito
+ Higashi)
+Files: src/os_amiga.c, src/os_mac_conv.c, src/os_msdos.d, src/os_mswin.c,
+ src/os_qnx.c, src/os_unix.c, src/os_vms.c, src/os_win16.c,
+ src/os_win32.c, src/popupmnu.c, src/pty.c, src/quickfix.c,
+ src/regexp.c, src/regexp_nfa.c, src/screen.c
+
+Patch 7.4.1214
+Problem: Using old style function declarations.
+Solution: Change to new style function declarations. (script by Hirohito
+ Higashi)
+Files: src/search.c, src/sha256.c, src/spell.c, src/syntax.c, src/tag.c,
+ src/term.c, src/termlib.c, src/ui.c, src/undo.c
+
+Patch 7.4.1215
+Problem: Using old style function declarations.
+Solution: Change to new style function declarations. (script by Hirohito
+ Higashi)
+Files: src/version.c, src/winclip.c, src/window.c, src/workshop.c,
+ src/xpm_w32.c, runtime/doc/doctags.c,
+ runtime/tools/xcmdsrv_client.c, src/po/sjiscorr.c, src/xxd/xxd.c
+
+Patch 7.4.1216
+Problem: Still using HAVE_STDARG_H.
+Solution: Assume it's always defined.
+Files: src/eval.c, src/misc2.c, src/vim.h, src/proto.h, src/configure.in,
+ src/auto/configure, config.h.in, src/os_amiga.h, src/os_msdos.h,
+ src/os_vms_conf.h, src/os_win32.h
+
+Patch 7.4.1217
+Problem: Execution of command on channel doesn't work yet.
+Solution: Implement the "ex" and "normal" commands.
+Files: src/channel.c, src/proto/channel.pro, src/misc2.c, src/eval.c,
+ src/ex_docmd.c, src/proto/ex_docmd.pro, src/feature.h
+
+Patch 7.4.1218
+Problem: Missing change in configure. More changes for function style.
+Solution: Avoid the typos.
+Files: src/configure.in, src/config.h.in, runtime/tools/ccfilter.c,
+ src/os_msdos.c
+
+Patch 7.4.1219
+Problem: Build fails with +channel but without +float.
+Solution: Add #ifdef.
+Files: src/ex_cmds.c
+
+Patch 7.4.1220
+Problem: Warnings for unused variables in tiny build. (Tony Mechelynck)
+Solution: Move declarations inside #ifdef. (Hirohito Higashi)
+Files: src/ex_cmds.c
+
+Patch 7.4.1221
+Problem: Including netbeans and channel support in small and tiny builds.
+ Build fails with some interfaces.
+Solution: Only include these features in small build and above. Let
+ configure fail if trying to enable an interface that won't build.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.1222
+Problem: ":normal" command and others missing in tiny build.
+Solution: Graduate FEAT_EX_EXTRA.
+Files: src/feature.h, src/charset.c, src/eval.c, src/ex_cmds.c,
+ src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c, src/getchar.c,
+ src/normal.c, src/ui.c, src/version.c, src/globals.h
+
+Patch 7.4.1223
+Problem: Crash when setting v:errors to a number.
+Solution: Free the typval without assuming its type. (Yasuhiro Matsumoto)
+Files: src/eval.c, src/testdir/test_assert.vim
+
+Patch 7.4.1224
+Problem: Build problems with GTK on BSD. (Mike Williams)
+Solution: Don't use "$<". Skip building gui_gtk_gresources.h when it doesn't
+ work. (Kazunobu Kuriyama)
+Files: src/Makefile
+
+Patch 7.4.1225
+Problem: Still a few old style function declarations.
+Solution: Make them new style. (Hirohito Higashi)
+Files: runtime/tools/blink.c, src/eval.c, src/ex_cmds2.c, src/ex_getln.c,
+ src/fileio.c, src/gui_w32.c, src/gui_x11.c, src/if_perl.xs,
+ src/os_unix.c, src/po/sjiscorr.c, src/pty.c
+
+Patch 7.4.1226
+Problem: GRESOURCE_HDR is unused.
+Solution: Remove it. (Kazunobu Kuriyama)
+Files: src/configure.in, src/auto/configure, src/config.mk.in
+
+Patch 7.4.1227
+Problem: Compiler warnings.
+Solution: Add UNUSED. Add type cast. (Yegappan Lakshmanan)
+Files: src/getchar.c, src/os_macosx.m
+
+Patch 7.4.1228
+Problem: copy() and deepcopy() fail with special variables. (Nikolai
+ Pavlov)
+Solution: Make it work. Add a test. Closes #614.
+Files: src/eval.c, src/testdir/test_viml.vim
+
+Patch 7.4.1229
+Problem: "eval" and "expr" channel commands don't work yet.
+Solution: Implement them. Update the error numbers. Also add "redraw".
+Files: src/channel.c, src/eval.c, src/json.c, src/ex_docmd.c,
+ src/proto/channel.pro, src/proto/json.pro, src/proto/ex_docmd.pro,
+ runtime/doc/channel.txt
+
+Patch 7.4.1230
+Problem: Win32: opening a channel may hang. Not checking for messages
+ while waiting for characters.
+Solution: Add a zero timeout. Call parse_queued_messages(). (Yasuhiro
+ Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.4.1231
+Problem: JSON messages are not parsed properly.
+Solution: Queue received messages.
+Files: src/eval.c src/channel.c, src/json.c, src/proto/eval.pro,
+ src/proto/channel.pro, src/proto/json.pro, src/structs.h
+
+Patch 7.4.1232
+Problem: Compiler warnings when the Sniff feature is enabled.
+Solution: Add UNUSED.
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.1233
+Problem: Channel command may cause a crash.
+Solution: Check for NULL argument. (Damien)
+Files: src/channel.c
+
+Patch 7.4.1234
+Problem: Demo server only runs with Python 2.
+Solution: Make it run with Python 3 as well. (Ken Takata)
+Files: runtime/tools/demoserver.py
+
+Patch 7.4.1235 (after 7.4.1231)
+Problem: Missing change to eval.c.
+Solution: Include that change.
+Files: src/eval.c
+
+Patch 7.4.1236
+Problem: When "syntax manual" was used switching between buffers removes
+ the highlighting.
+Solution: Set the syntax option without changing the value. (Anton
+ Lindqvist)
+Files: runtime/syntax/manual.vim
+
+Patch 7.4.1237
+Problem: Can't translate message without adding a line break.
+Solution: Join the two parts of the message.
+Files: src/memline.c
+
+Patch 7.4.1238
+Problem: Can't handle two messages right after each other.
+Solution: Find the end of the JSON. Read more when incomplete. Add a C
+ test for the JSON decoding.
+Files: src/channel.c, src/json.c, src/proto/json.pro, src/eval.c,
+ src/Makefile, src/json_test.c, src/memfile_test.c, src/structs.h
+
+Patch 7.4.1239
+Problem: JSON message after the first one is dropped.
+Solution: Put remainder of message back in the queue.
+Files: src/channel.c
+
+Patch 7.4.1240
+Problem: Visual Studio tools are noisy.
+Solution: Suppress startup info. (Mike Williams)
+Files: src/GvimExt/Makefile, src/Make_mvc.mak, src/tee/Make_mvc.mak
+
+Patch 7.4.1241 (after 7.4.1238)
+Problem: Missing change in Makefile due to diff mismatch
+Solution: Update the list of object files.
+Files: src/Makefile
+
+Patch 7.4.1242 (after 7.4.1238)
+Problem: json_test fails without the eval feature.
+Solution: Add #ifdef.
+Files: src/json_test.c
+
+Patch 7.4.1243
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize it. (Elias Diem)
+Files: src/json.c
+
+Patch 7.4.1244
+Problem: The channel functions don't sort together.
+Solution: Use a common "ch_" prefix.
+Files: src/eval.c, runtime/doc/eval.txt, runtime/tools/demoserver.py
+
+Patch 7.4.1245
+Problem: File missing from distribution.
+Solution: Add json_test.c.
+Files: Filelist
+
+Patch 7.4.1246
+Problem: The channel functionality isn't tested.
+Solution: Add a test using a Python test server.
+Files: src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, src/testdir/test_channel.py,
+ src/testdir/Make_all.mak
+
+Patch 7.4.1247
+Problem: The channel test doesn't run on MS-Windows.
+Solution: Make it work on the MS-Windows console. (Ken Takata)
+Files: src/testdir/test_channel.py, src/testdir/test_channel.vim
+
+Patch 7.4.1248
+Problem: Can't reliably stop the channel test server. Can't start the
+ server if the python file is not executable.
+Solution: Use "pkill" instead of "killall". Run the python file as an
+ argument instead of as an executable.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1249
+Problem: Crash when the process a channel is connected to exits.
+Solution: Use the file descriptor properly. Add a test. (Damien)
+ Also add a test for eval().
+Files: src/channel.c, src/testdir/test_channel.py,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1250
+Problem: Running tests in shadow directory fails.
+Solution: Also link testdir/*.py
+Files: src/Makefile
+
+Patch 7.4.1251
+Problem: New test file missing from distribution.
+Solution: Add src/testdir/*.py.
+Files: Filelist
+
+Patch 7.4.1252
+Problem: The channel test server may receive two messages concatenated.
+Solution: Split the messages.
+Files: src/testdir/test_channel.py
+
+Patch 7.4.1253
+Problem: Python test server not displaying second of two commands.
+ Solaris doesn't have "pkill --full".
+Solution: Also echo the second command. Use "pkill -f".
+Files: src/testdir/test_channel.py, src/testdir/test_channel.vim
+
+Patch 7.4.1254
+Problem: Opening a second channel causes a crash. (Ken Takata)
+Solution: Don't re-allocate the array with channels.
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel.py
+
+Patch 7.4.1255
+Problem: Crash for channel "eval" command without third argument.
+Solution: Check for missing argument.
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel.py
+
+Patch 7.4.1256
+Problem: On Mac sys.exit(0) doesn't kill the test server.
+Solution: Use self.server.shutdown(). (Jun Takimoto)
+Files: src/testdir/test_channel.py
+
+Patch 7.4.1257
+Problem: Channel test fails in some configurations.
+Solution: Add check for the +channel feature.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1258
+Problem: The channel test can fail if messages arrive later.
+Solution: Add a short sleep. (Jun Takimoto)
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1259
+Problem: No test for what patch 7.3.414 fixed.
+Solution: Add a test. (Elias Diem)
+Files: src/testdir/test_increment.vim
+
+Patch 7.4.1260
+Problem: The channel feature doesn't work on Win32 GUI.
+Solution: Use WSAGetLastError(). (Ken Takata)
+Files: src/channel.c, src/testdir/test_channel.vim, src/vim.h
+
+Patch 7.4.1261
+Problem: Pending channel messages are garbage collected. Leaking memory in
+ ch_sendexpr(). Leaking memory for a decoded JSON string.
+Solution: Mark the message list as used. Free the encoded JSON. Don't save
+ the JSON string.
+Files: src/eval.c, src/channel.c, src/json.c, src/proto/channel.pro
+
+Patch 7.4.1262
+Problem: The channel callback is not invoked.
+Solution: Make a list of pending callbacks.
+Files: src/eval.c, src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1263
+Problem: ch_open() hangs when the server isn't running.
+Solution: Add a timeout. Use a dict to pass arguments. (Yasuhiro Matsumoto)
+Files: runtime/doc/eval.txt, runtime/doc/channel.txt, src/channel.c,
+ src/eval.c, src/netbeans.c, src/os_win32.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1264
+Problem: Crash when receiving an empty array.
+Solution: Check for array with wrong number of arguments. (Damien)
+Files: src/channel.c, src/eval.c, src/testdir/test_channel.py,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1265
+Problem: Not all channel commands are tested.
+Solution: Add a test for "normal", "expr" and "redraw".
+Files: src/testdir/test_channel.py, src/testdir/test_channel.vim
+
+Patch 7.4.1266
+Problem: A BufAdd autocommand may cause an ml_get error (Christian
+ Brabandt)
+Solution: Increment RedrawingDisabled earlier.
+Files: src/ex_cmds.c
+
+Patch 7.4.1267
+Problem: Easy to miss handling all types of variables.
+Solution: Change the variable type into an enum.
+Files: src/structs.h, src/eval.c
+
+Patch 7.4.1268
+Problem: Waittime is used as seconds instead of milliseconds. (Hirohito
+ Higashi)
+Solution: Divide by 1000.
+Files: src/channel.c
+
+Patch 7.4.1269
+Problem: Encoding {'key':v:none} to JSON doesn't give an error (Tyru)
+Solution: Give an error.
+Files: src/json.c, src/testdir/test_json.vim
+
+Patch 7.4.1270
+Problem: Warnings for missing values in switch.
+Solution: Change switch to if-else or add values.
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 7.4.1271
+Problem: assert_false(v:false) reports an error. (Nikolai Pavlov)
+Solution: Recognize v:true and v:false. (Closes #625)
+Files: src/eval.c, src/testdir/test_assert.vim
+
+Patch 7.4.1272 (after 7.4.1270)
+Problem: Using future enum value.
+Solution: Remove it.
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.4.1273 (after 7.4.1271)
+Problem: assert_false(v:false) still fails.
+Solution: Fix the typo.
+Files: src/eval.c
+
+Patch 7.4.1274
+Problem: Cannot run a job.
+Solution: Add job_start(), job_status() and job_stop(). Currently only works
+ for Unix.
+Files: src/eval.c, src/structs.h, runtime/doc/eval.txt, src/os_unix.c,
+ src/proto/os_unix.pro, src/feature.h, src/version.c,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1275 (after 7.4.1274)
+Problem: Build fails on MS-Windows.
+Solution: Fix wrong #ifdef.
+Files: src/eval.c
+
+Patch 7.4.1276
+Problem: Warning for not using return value of fcntl().
+Solution: Explicitly ignore the return value.
+Files: src/fileio.c, src/channel.c, src/memfile.c, src/memline.c
+
+Patch 7.4.1277
+Problem: Compiler can complain about missing enum value in switch with some
+ combination of features.
+Solution: Remove #ifdefs around case statements.
+Files: src/eval.c
+
+Patch 7.4.1278
+Problem: When jsonencode() fails it still returns something.
+Solution: Return an empty string on failure.
+Files: src/json.c, src/channel.c, src/testdir/test_json.vim,
+ src/testdir/test_channel.vim, src/testdir/test_channel.py
+
+Patch 7.4.1279
+Problem: jsonencode() is not producing strict JSON.
+Solution: Add jsencode() and jsdecode(). Make jsonencode() and jsondecode()
+ strict.
+Files: src/json.c, src/json_test.c, src/proto/json.pro, src/channel.c,
+ src/proto/channel.pro, src/eval.c, src/vim.h, src/structs.h,
+ runtime/doc/eval.txt, runtime/doc/channel.txt,
+ src/testdir/test_json.vim
+
+Patch 7.4.1280
+Problem: Missing case value.
+Solution: Add VAR_JOB.
+Files: src/if_python.c, src/if_python3.c
+
+Patch 7.4.1281
+Problem: No test for skipping over code that isn't evaluated.
+Solution: Add a test with code that would fail when not skipped.
+Files: src/testdir/test_viml.vim
+
+Patch 7.4.1282
+Problem: Crash when evaluating the pattern of ":catch" causes an error.
+ (Dominique Pelle)
+Solution: Block error messages at this point.
+Files: src/ex_eval.c
+
+Patch 7.4.1283
+Problem: The job feature isn't available on MS-Windows.
+Solution: Add the job feature. Fix argument of job_stop(). (Yasuhiro
+ Matsumoto)
+Files: src/eval.c, src/feature.h, src/os_win32.c, src/proto/os_win32.pro
+
+Patch 7.4.1284 (after 7.4.1282)
+Problem: Test 49 fails.
+Solution: Check for a different error message.
+Files: src/testdir/test49.vim
+
+Patch 7.4.1285
+Problem: Cannot measure elapsed time.
+Solution: Add reltimefloat().
+Files: src/ex_cmds2.c, src/eval.c, src/proto/ex_cmds2.pro,
+ src/testdir/test_reltime.vim, src/testdir/test_alot.vim
+
+Patch 7.4.1286
+Problem: ch_open() with a timeout doesn't work correctly.
+Solution: Change how select() is used. Don't give an error on timeout.
+ Add a test for ch_open() failing.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1287 (after 7.4.1286)
+Problem: Channel test fails.
+Solution: Use reltimefloat().
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1288
+Problem: ch_sendexpr() does not use JS encoding.
+Solution: Use the encoding that fits the channel mode. Refuse using
+ ch_sendexpr() on a raw channel.
+Files: src/channel.c, src/proto/channel.pro, src/eval.c
+
+Patch 7.4.1289
+Problem: Channel test fails on MS-Windows, connect() takes too long.
+Solution: Adjust the test for MS-Windows using "waittime".
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1290
+Problem: Coverity complains about unnecessary check for NULL.
+Solution: Remove the check.
+Files: src/eval.c
+
+Patch 7.4.1291
+Problem: On MS-Windows the channel test server doesn't quit.
+Solution: Use return instead of break. (Ken Takata)
+Files: src/testdir/test_channel.py
+
+Patch 7.4.1292
+Problem: Some compilers complain about uninitialized variable, even though
+ all possible cases are handled. (Dominique Pelle)
+Solution: Add a default initialization.
+Files: src/eval.c
+
+Patch 7.4.1293
+Problem: Sometimes a channel may hang waiting for a message that was
+ already discarded. (Ken Takata)
+Solution: Store the ID of the message blocking on in the channel.
+Files: src/channel.c
+
+Patch 7.4.1294
+Problem: job_stop() only kills the started process.
+Solution: Send the signal to the process group. (Olaf Dabrunz)
+Files: src/os_unix.c
+
+Patch 7.4.1295
+Problem: string(job) doesn't work well on MS-Windows.
+Solution: Use the process ID. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.1296
+Problem: Cursor changes column with up motion when the matchparen plugin
+ saves and restores the cursor position. (Martin Kunev)
+Solution: Make sure curswant is updated before invoking the autocommand.
+Files: src/edit.c
+
+Patch 7.4.1297
+Problem: On Mac test_channel leaves python instances running.
+Solution: Use a small waittime to make ch_open() work. (Ozaki Kiichi)
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1298
+Problem: When the channel test fails in an unexpected way the server keeps
+ running.
+Solution: Use try/catch. (Ozaki Kiichi)
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1299
+Problem: When the server sends a message with ID zero the channel handler
+ is not invoked. (Christian J. Robinson)
+Solution: Recognize zero value for the request ID. Add a test for invoking
+ the channel handler.
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel.py
+
+Patch 7.4.1300
+Problem: Cannot test CursorMovedI because there is typeahead.
+Solution: Add disable_char_avail_for_testing().
+Files: src/eval.c, src/getchar.c, src/globals.h,
+ src/testdir/test_cursor_func.vim, src/testdir/README.txt
+
+Patch 7.4.1301
+Problem: Missing options in ch_open().
+Solution: Add s:chopt like in the other calls. (Ozaki Kiichi)
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1302
+Problem: Typo in struct field name. (Ken Takata)
+Solution: Rename jf_pi to jv_pi.
+Files: src/eval.c, src/os_win32.c, src/structs.h
+
+Patch 7.4.1303
+Problem: A Funcref is not accepted as a callback.
+Solution: Make a Funcref work. (Damien)
+Files: src/eval.c, src/testdir/test_channel.vim
+
+Patch 7.4.1304
+Problem: Function names are difficult to read.
+Solution: Rename jsonencode to json_encode, jsondecode to json_decode,
+ jsencode to js_encode and jsdecode to js_decode.
+Files: src/eval.c, runtime/doc/eval.txt, src/testdir/test_json.vim
+
+Patch 7.4.1305
+Problem: "\%1l^#.*" does not match on a line starting with "#".
+Solution: Do not clear the start-of-line flag. (Christian Brabandt)
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test36.in,
+ src/testdir/test36.ok
+
+Patch 7.4.1306
+Problem: Job control doesn't work well on MS-Windows.
+Solution: Various fixes. (Ken Takata, Ozaki Kiichi, Yukihiro Nakadaira,
+ Yasuhiro Matsumoto)
+Files: src/Make_mvc.mak, src/eval.c, src/os_unix.c, src/os_win32.c,
+ src/proto/os_unix.pro, src/proto/os_win32.pro, src/structs.h
+
+Patch 7.4.1307
+Problem: Some channel tests fail on MS-Windows.
+Solution: Disable the failing tests temporarily.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1308 (after 7.4.1307)
+Problem: Typo in test.
+Solution: Change endf to endif.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1309
+Problem: When a test fails not all relevant info is listed.
+Solution: Add the errors to the messages.
+Files: src/testdir/runtest.vim
+
+Patch 7.4.1310
+Problem: Jobs don't open a channel.
+Solution: Create pipes and add them to the channel. Add ch_logfile().
+ Only Unix for now.
+Files: src/channel.c, src/eval.c, src/os_unix.c, src/structs.h,
+ src/gui_w48.c, src/proto/channel.pro, src/testdir/test_channel.vim,
+ src/testdir/test_channel_pipe.py, runtime/doc/eval.txt
+
+Patch 7.4.1311 (after 7.4.1310)
+Problem: sock_T is defined too late.
+Solution: Move it up.
+Files: src/vim.h
+
+Patch 7.4.1312 (after 7.4.1311)
+Problem: sock_T is not defined without the +channel feature.
+Solution: Always define it.
+Files: src/vim.h
+
+Patch 7.4.1313
+Problem: MS-Windows: Using socket after it was closed causes an exception.
+Solution: Don't give an error when handling WM_NETBEANS. Re-enable tests
+ for MS-Windows.
+Files: src/gui_w48.c, src/testdir/test_channel.vim
+
+Patch 7.4.1314
+Problem: Warning for uninitialized variable.
+Solution: Initialize it. (Dominique Pelle)
+Files: src/channel.c
+
+Patch 7.4.1315
+Problem: Using a channel handle does not allow for freeing it when unused.
+Solution: Add the Channel variable type.
+Files: src/structs.h, src/channel.c, src/misc2.c, src/eval.c,
+ src/if_python.c, src/if_python3.c, src/json.c, src/gui_w48.c,
+ src/netbeans.c, src/proto/channel.pro, src/os_unix.c,
+ src/testdir/test_channel.py, src/testdir/test_channel.vim
+
+Patch 7.4.1316
+Problem: Can't build MS-Windows console version. (Tux)
+Solution: Add #ifdefs.
+Files: src/eval.c
+
+Patch 7.4.1317
+Problem: MS-Windows: channel test fails.
+Solution: Temporarily disable Test_connect_waittime().
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1318
+Problem: Channel with pipes doesn't work in GUI.
+Solution: Register input handlers for pipes.
+Files: src/structs.h, src/feature.h, src/channel.c, src/eval.c,
+ src/os_unix.c, src/os_win32.c, src/gui_w48.c, src/proto/channel.pro
+
+Patch 7.4.1319 (after 7.4.1318)
+Problem: Tests fail on MS-Windows and on Unix with GUI.
+Solution: Fix unregistering.
+Files: src/structs.h, src/channel.c, src/os_unix.c, src/os_win32.c,
+ src/proto/channel.pro
+
+Patch 7.4.1320
+Problem: Building with Cygwin or MingW with channel but without Netbeans
+ doesn't work.
+Solution: Set NETBEANS to "no" when not used.
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1321
+Problem: Compiler complains about missing statement.
+Solution: Add an empty statement. (Andrei Olsen)
+Files: src/os_win32.c
+
+Patch 7.4.1322
+Problem: Crash when unletting the variable that holds the channel in a
+ callback function. (Christian Robinson)
+Solution: Increase the reference count while invoking the callback.
+Files: src/eval.c, src/channel.c, src/proto/eval.pro,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1323
+Problem: Do not get warnings when building with MingW.
+Solution: Remove the -w flag. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1324
+Problem: Channels with pipes don't work on MS-Windows.
+Solution: Add pipe I/O support. (Yasuhiro Matsumoto)
+Files: src/channel.c, src/os_win32.c, src/proto/channel.pro,
+ src/structs.h, src/vim.h, src/testdir/test_channel.vim
+
+Patch 7.4.1325
+Problem: Channel test fails on difference between Unix and DOS line endings.
+Solution: Strip off CR. Make assert show difference better.
+Files: src/eval.c, src/channel.c
+
+Patch 7.4.1326
+Problem: Build rules are bit too complicated.
+Solution: Remove -lwsock32 from Netbeans, it's already added for the channel
+ feature that it depends on. (Tony Mechelynck)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1327
+Problem: Channel test doesn't work if Python executable is python.exe.
+Solution: Find py.exe or python.exe. (Ken Takata)
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1328
+Problem: Can't compile with +job but without +channel. (John Marriott)
+Solution: Add more #ifdefs.
+Files: src/os_unix.c
+
+Patch 7.4.1329
+Problem: Crash when using channel that failed to open.
+Solution: Check for NULL. Update messages. (Yukihiro Nakadaira)
+Files: src/channel.c, src/eval.c, src/testdir/test_channel.vim
+
+Patch 7.4.1330
+Problem: fd_read() has an unused argument.
+Solution: Remove the timeout. (Yasuhiro Matsumoto)
+Files: src/channel.c
+
+Patch 7.4.1331
+Problem: Crash when closing the channel in a callback. (Christian J.
+ Robinson)
+Solution: Take the callback out of the list before invoking it.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1332
+Problem: Problem using Python3 when compiled with MingW.
+Solution: Define PYTHON3_HOME as a wide character string. (Yasuhiro
+ Matsumoto)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1333
+Problem: Channel test fails on non-darwin builds.
+Solution: Add the "osx" feature and test for that. (Kazunobu Kuriyama)
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_channel.vim
+
+Patch 7.4.1334
+Problem: Many compiler warnings with MingW.
+Solution: Add type casts. (Yasuhiro Matsumoto)
+Files: src/channel.c, src/dosinst.h, src/eval.c, src/ex_cmds2.c,
+ src/ex_getln.c, src/fileio.c, src/if_cscope.c, src/if_perl.xs,
+ src/if_python.c, src/if_python3.c, src/if_ruby.c, src/main.c,
+ src/mbyte.c, src/misc1.c, src/option.c, src/os_mswin.c,
+ src/os_win32.c
+
+Patch 7.4.1335
+Problem: Can't build on MS-Windows with +job but without +channel. (Cesar
+ Romani)
+Solution: Add #ifdefs. (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.4.1336
+Problem: Channel NL mode is not supported yet.
+Solution: Add NL mode support to channels.
+Files: src/channel.c, src/netbeans.c, src/structs.h, src/os_win32.c,
+ src/proto/channel.pro, src/proto/os_unix.pro,
+ src/proto/os_win32.pro, src/testdir/test_channel.vim,
+ src/testdir/test_channel_pipe.py
+
+Patch 7.4.1337 (after 7.4.1336)
+Problem: Part of the change is missing.
+Solution: Add changes to eval.c
+Files: src/eval.c
+
+
+Patch 7.4.1338 (after 7.4.1336)
+Problem: Another part of the change is missing.
+Solution: Type os_unix.c right this time.
+Files: src/os_unix.c
+
+Patch 7.4.1339
+Problem: Warnings when building the GUI with MingW. (Cesar Romani)
+Solution: Add type casts. (Yasuhiro Matsumoto)
+Files: src/edit.c, src/gui_w32.c, src/gui_w48.c, src/os_mswin.c,
+ src/os_win32.c
+
+Patch 7.4.1340 (after 7.4.1339)
+Problem: Merge left extra #endif behind.
+Solution: Remove the #endif
+Files: src/os_win32.c
+
+Patch 7.4.1341
+Problem: It's difficult to add more arguments to ch_sendraw() and
+ ch_sendexpr().
+Solution: Make the third option a dictionary.
+Files: src/eval.c, src/structs.h, src/channel.c, src/os_unix.c,
+ src/os_win32.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, runtime/doc/eval.txt
+
+Patch 7.4.1342
+Problem: On Mac OS/X the waittime must be > 0 for connect to work.
+Solution: Use select() in a different way. (partly by Kazunobu Kuriyama)
+ Always use a waittime of 1 or more.
+Files: src/eval.c, src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1343
+Problem: Can't compile with +job but without +channel. (Andrei Olsen)
+Solution: Move get_job_options up and adjust #ifdef.
+Files: src/eval.c
+
+Patch 7.4.1344
+Problem: Can't compile Win32 GUI with tiny features.
+Solution: Add #ifdef. (Christian Brabandt)
+Files: src/gui_w32.c
+
+Patch 7.4.1345
+Problem: A few more compiler warnings. (Axel Bender)
+Solution: Add type casts.
+Files: src/gui_w32.c, src/gui_w48.c
+
+Patch 7.4.1346
+Problem: Compiler warnings in build with -O2.
+Solution: Add initializations.
+Files: src/eval.c
+
+Patch 7.4.1347
+Problem: When there is any error Vim will use a non-zero exit code.
+Solution: When using ":silent!" do not set the exit code. (Yasuhiro
+ Matsumoto)
+Files: src/message.c
+
+Patch 7.4.1348
+Problem: More compiler warnings. (John Marriott)
+Solution: Add type casts, remove unused variable.
+Files: src/gui_w32.c
+
+Patch 7.4.1349
+Problem: And some more MingW compiler warnings. (Cesar Romani)
+Solution: Add type casts.
+Files: src/if_mzsch.c
+
+Patch 7.4.1350
+Problem: When the test server fails to start Vim hangs.
+Solution: Check that there is actually something to read from the tty fd.
+Files: src/os_unix.c
+
+Patch 7.4.1351
+Problem: When the port isn't opened yet when ch_open() is called it may
+ fail instead of waiting for the specified time.
+Solution: Loop when select() succeeds but when connect() failed. Also use
+ channel logging for jobs. Add ch_log().
+Files: src/channel.c, src/eval.c, src/netbeans.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, src/testdir/test_channel.py
+
+Patch 7.4.1352
+Problem: The test script lists all functions before executing them.
+Solution: Only list the function currently being executed.
+Files: src/testdir/runtest.vim
+
+Patch 7.4.1353
+Problem: Test_connect_waittime is skipped for MS-Windows.
+Solution: Add the test back, it works now.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1354
+Problem: MS-Windows: Mismatch between default compile options and what the
+ code expects.
+Solution: Change the default WINVER from 0x0500 to 0x0501. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 7.4.1355
+Problem: Win32 console and GUI handle channels differently.
+Solution: Consolidate code between Win32 console and GUI.
+Files: src/channel.c, src/eval.c, src/gui_w48.c, src/os_win32.c,
+ src/proto/channel.pro
+
+Patch 7.4.1356
+Problem: Job and channel options parsing is scattered.
+Solution: Move all option value parsing to get_job_options();
+Files: src/channel.c, src/eval.c, src/structs.h, src/proto/channel.pro,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1357 (after 7.4.1356)
+Problem: Error for returning value from void function.
+Solution: Don't do that.
+Files: src/eval.c
+
+Patch 7.4.1358
+Problem: Compiler warning when not building with +crypt.
+Solution: Add #ifdef. (John Marriott)
+Files: src/undo.c
+
+Patch 7.4.1359 (after 7.4.1356)
+Problem: Channel test ch_sendexpr() times out.
+Solution: Increase the timeout
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1360
+Problem: Can't remove a callback with ch_setoptions().
+Solution: When passing zero or an empty string remove the callback.
+Files: src/channel.c, src/proto/channel.pro, src/testdir/test_channel.vim
+
+Patch 7.4.1361
+Problem: Channel test fails on Solaris.
+Solution: Use the 1 msec waittime for all systems.
+Files: src/channel.c
+
+Patch 7.4.1362 (after 7.4.1356)
+Problem: Using uninitialized value.
+Solution: Initialize jo_set.
+Files: src/eval.c
+
+Patch 7.4.1363
+Problem: Compiler warnings with tiny build.
+Solution: Add #ifdefs.
+Files: src/gui_w48.c, src/gui_w32.c
+
+Patch 7.4.1364
+Problem: The Win 16 code is not maintained and unused.
+Solution: Remove the Win 16 support.
+Files: src/gui_w16.c, src/gui_w32.c, src/gui_w48.c, src/Make_w16.mak,
+ src/Makefile, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/proto/gui_w16.pro, src/proto/os_win16.pro, src/guiw16rc.h,
+ src/vim16.rc, src/vim16.def, src/tools16.bmp, src/eval.c,
+ src/gui.c, src/misc2.c, src/option.c, src/os_msdos.c,
+ src/os_mswin.c, src/os_win16.c, src/os_win16.h, src/version.c,
+ src/winclip.c, src/feature.h, src/proto.h, src/vim.h, Filelist
+
+Patch 7.4.1365
+Problem: Cannot execute a single test function.
+Solution: Add an argument to filter the functions with. (Yasuhiro Matsumoto)
+Files: src/testdir/runtest.vim
+
+Patch 7.4.1366
+Problem: Typo in test and resulting error in test result.
+Solution: Fix the typo and correct the result. (James McCoy, closes #650)
+Files: src/testdir/test_charsearch.in, src/testdir/test_charsearch.ok
+
+Patch 7.4.1367
+Problem: Compiler warning for unreachable code.
+Solution: Remove a "break". (Danek Duvall)
+Files: src/json.c
+
+Patch 7.4.1368
+Problem: One more Win16 file remains.
+Solution: Delete it.
+Files: src/proto/os_win16.pro
+
+Patch 7.4.1369
+Problem: Channels don't have a queue for stderr.
+Solution: Have a queue for each part of the channel.
+Files: src/channel.c, src/eval.c, src/structs.h, src/netbeans.c,
+ src/gui_w32.c, src/proto/channel.pro
+
+Patch 7.4.1370
+Problem: The Python test script may keep on running.
+Solution: Join the threads. (Yasuhiro Matsumoto)
+Files: src/testdir/test_channel.py
+
+Patch 7.4.1371
+Problem: X11 GUI callbacks don't specify the part of the channel.
+Solution: Pass the fd instead of the channel ID.
+Files: src/channel.c
+
+Patch 7.4.1372
+Problem: channel read implementation is incomplete.
+Solution: Add ch_read() and options for ch_readraw().
+Files: src/channel.c, src/eval.c, src/structs.h, src/proto/channel.pro,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1373
+Problem: Calling a Vim function over a channel requires turning the
+ arguments into a string.
+Solution: Add the "call" command. (Damien) Also merge "expr" and "eval"
+ into one.
+Files: src/channel.c, src/testdir/test_channel.py,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1374
+Problem: Channel test hangs on MS-Windows.
+Solution: Disable the ch_read() that is supposed to time out.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1375
+Problem: Still some Win16 code.
+Solution: Remove FEAT_GUI_W16.(Hirohito Higashi)
+Files: src/eval.c, src/ex_cmds.h, src/feature.h, src/gui.h, src/menu.c,
+ src/misc1.c, src/option.c, src/proto.h, src/structs.h, src/term.c,
+ src/vim.h, runtime/doc/gui_w16.txt
+
+Patch 7.4.1376
+Problem: ch_setoptions() cannot set all options.
+Solution: Support more options.
+Files: src/channel.c, src/eval.c, src/structs.h, runtime/doc/channel.txt,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1377
+Problem: Test_connect_waittime() is flaky.
+Solution: Ignore the "Connection reset by peer" error.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1378
+Problem: Can't change job settings after it started.
+Solution: Add job_setoptions() with the "stoponexit" flag.
+Files: src/eval.c, src/main.c, src/structs.h, src/proto/eval.pro,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1379
+Problem: Channel test fails on Win32 console.
+Solution: Don't sleep when timeout is zero. Call channel_wait() before
+ channel_read(). Channels are not polled during ":sleep". (Yukihiro
+ Nakadaira)
+Files: src/channel.c, src/misc2.c, src/gui_w32.c, src/os_win32.c
+
+Patch 7.4.1380
+Problem: The job exit callback is not implemented.
+Solution: Add the "exit-cb" option.
+Files: src/structs.h, src/eval.c, src/channel.c, src/proto/eval.pro,
+ src/misc2.c, src/macros.h, src/testdir/test_channel.vim
+
+Patch 7.4.1381 (after 7.4.1380)
+Problem: Exit value not available on MS-Windows.
+Solution: Set the exit value.
+Files: src/structs.h, src/os_win32.c
+
+Patch 7.4.1382
+Problem: Can't get the job of a channel.
+Solution: Add ch_getjob().
+Files: src/eval.c, runtime/doc/channel.txt, runtime/doc/eval.txt
+
+Patch 7.4.1383
+Problem: GvimExt only loads the old libintl.dll.
+Solution: Also try loading libint-8.dll. (Ken Takata, closes #608)
+Files: src/GvimExt/gvimext.cpp, src/GvimExt/gvimext.h
+
+Patch 7.4.1384
+Problem: It is not easy to use a set of plugins and their dependencies.
+Solution: Add packages, ":loadplugin", 'packpath'.
+Files: src/main.c, src/ex_cmds2.c, src/option.c, src/option.h,
+ src/ex_cmds.h, src/eval.c, src/version.c, src/proto/ex_cmds2.pro,
+ runtime/doc/repeat.txt, runtime/doc/options.txt,
+ runtime/optwin.vim
+
+Patch 7.4.1385
+Problem: Compiler warning for using array.
+Solution: Use the right member name. (Yegappan Lakshmanan)
+Files: src/eval.c
+
+Patch 7.4.1386
+Problem: When the Job exit callback is invoked, the job may be freed too
+ soon. (Yasuhiro Matsumoto)
+Solution: Increase refcount.
+Files: src/eval.c
+
+Patch 7.4.1387
+Problem: Win16 docs still referenced.
+Solution: Remove Win16 files from the docs Makefile. (Kenichi Ito)
+Files: runtime/doc/Makefile
+
+Patch 7.4.1388
+Problem: Compiler warning. (Cesar Romani)
+Solution: Initialize variable.
+Files: src/ex_cmds2.c
+
+Patch 7.4.1389
+Problem: Incomplete function declaration.
+Solution: Add "void". (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.1390
+Problem: When building with GTK and glib-compile-resources cannot be found
+ building Vim fails. (Michael Gehring)
+Solution: Make GLIB_COMPILE_RESOURCES empty instead of leaving it at "no".
+ (nuko8, closes #655)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.1391
+Problem: Warning for uninitialized variable.
+Solution: Set it to zero. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.4.1392
+Problem: Some tests fail for Win32 console version.
+Solution: Move the tests to SCRIPTS_MORE2. Pass VIMRUNTIME. (Christian
+ Brabandt)
+Files: src/testdir/Make_all.mak
+
+Patch 7.4.1393
+Problem: Starting a job hangs in the GUI. (Takuya Fujiwara)
+Solution: Don't check if ch_job is NULL when checking for an error.
+ (Yasuhiro Matsumoto)
+Files: src/channel.c
+
+Patch 7.4.1394
+Problem: Can't sort inside a sort function.
+Solution: Use a struct to store the sort parameters. (Jacob Niehus)
+Files: src/eval.c, src/testdir/test_sort.vim
+
+Patch 7.4.1395
+Problem: Using DETACH in quotes is not compatible with the Netbeans
+ interface. (Xavier de Gaye)
+Solution: Remove the quotes, only use them for JSON and JS mode.
+Files: src/netbeans.c, src/channel.c
+
+Patch 7.4.1396
+Problem: Compiler warnings for conversions.
+Solution: Add type cast.
+Files: src/ex_cmds2.c
+
+Patch 7.4.1397
+Problem: Sort test fails on MS-Windows.
+Solution: Correct the compare function.
+Files: src/testdir/test_sort.vim
+
+Patch 7.4.1398
+Problem: The close-cb option is not implemented yet.
+Solution: Implement close-cb. (Yasuhiro Matsumoto)
+Files: src/channel.c, src/eval.c, src/structs.h, src/proto/channel.pro,
+ src/testdir/test_channel.py, src/testdir/test_channel.vim
+
+Patch 7.4.1399
+Problem: The MS-DOS code does not build.
+Solution: Remove the old MS-DOS code.
+Files: Filelist, src/Make_bc3.mak, src/Make_bc5.mak, src/Make_djg.mak,
+ src/Makefile, src/blowfish.c, src/buffer.c, src/diff.c,
+ src/digraph.c, src/dosinst.h, src/eval.c, src/ex_cmds.c,
+ src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c, src/feature.h,
+ src/fileio.c, src/getchar.c, src/globals.h, src/macros.h,
+ src/main.c, src/mbyte.c, src/memfile.c, src/memline.c,
+ src/misc1.c, src/misc2.c, src/netbeans.c, src/option.c,
+ src/option.h, src/os_msdos.c, src/os_msdos.h, src/proto.h,
+ src/proto/os_msdos.pro, src/regexp.c, src/screen.c, src/structs.h,
+ src/syntax.c, src/term.c, src/undo.c, src/uninstal.c,
+ src/version.c, src/vim.h, src/window.c, src/xxd/Make_bc3.mak,
+ src/xxd/Make_djg.mak
+
+
+Patch 7.4.1400
+Problem: Perl eval doesn't work properly on 64-bit big-endian machine.
+Solution: Use 32 bit type for the key. (Danek Duvall)
+Files: src/if_perl.xs
+
+Patch 7.4.1401
+Problem: Having 'autochdir' set during startup and using diff mode doesn't
+ work. (Axel Bender)
+Solution: Don't use 'autochdir' while still starting up. (Christian
+ Brabandt)
+Files: src/buffer.c
+
+Patch 7.4.1402
+Problem: GTK 3 is not supported.
+Solution: Add GTK 3 support. (Kazunobu Kuriyama)
+Files: runtime/doc/eval.txt, runtime/doc/gui.txt,
+ runtime/doc/gui_x11.txt, src/auto/configure, src/channel.c,
+ src/config.h.in, src/configure.in, src/eval.c, src/gui.h,
+ src/gui_beval.c, src/gui_beval.h, src/gui_gtk.c, src/gui_gtk_f.c,
+ src/gui_gtk_f.h, src/gui_gtk_x11.c, src/if_mzsch.c, src/mbyte.c,
+ src/netbeans.c, src/structs.h, src/version.c
+
+Patch 7.4.1403
+Problem: Can't build without the quickfix feature.
+Solution: Add #ifdefs. Call ex_ni() for unimplemented commands. (Yegappan
+ Lakshmanan)
+Files: src/ex_cmds2.c, src/popupmnu.c
+
+Patch 7.4.1404
+Problem: ch_read() doesn't time out on MS-Windows.
+Solution: Instead of WM_NETBEANS use select(). (Yukihiro Nakadaira)
+Files: src/channel.c, src/gui_w32.c, src/os_win32.c, src/structs.h,
+ src/testdir/test_channel.vim, src/vim.h
+
+Patch 7.4.1405
+Problem: Completion menu flickers.
+Solution: Delay showing the popup menu. (Shougo Matsu, Justin M. Keyes,
+ closes #656)
+Files: src/edit.c
+
+Patch 7.4.1406
+Problem: Leaking memory in cs_print_tags_priv().
+Solution: Free tbuf. (idea by Forrest Fleming)
+Files: src/if_cscope.c
+
+Patch 7.4.1407
+Problem: json_encode() does not handle NaN and inf properly. (David
+ Barnett)
+Solution: For JSON turn them into "null". For JS use "NaN" and "Infinity".
+ Add isnan().
+Files: src/eval.c, src/json.c, src/testdir/test_json.vim
+
+Patch 7.4.1408
+Problem: MS-Windows doesn't have isnan() and isinf().
+Solution: Use _isnan() and _isinf().
+Files: src/eval.c, src/json.c
+
+Patch 7.4.1409 (after 7.4.1402)
+Problem: Configure includes GUI despite --disable-gui flag.
+Solution: Add SKIP_GTK3. (Kazunobu Kuriyama)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.1410
+Problem: Leaking memory in cscope interface.
+Solution: Free memory when no tab is found. (Christian Brabandt)
+Files: src/if_cscope.c
+
+Patch 7.4.1411
+Problem: Compiler warning for indent. (Ajit Thakkar)
+Solution: Indent normally.
+Files: src/ui.c
+
+Patch 7.4.1412
+Problem: Compiler warning for indent. (Dominique Pelle)
+Solution: Fix the indent.
+Files: src/farsi.c
+
+Patch 7.4.1413
+Problem: When calling ch_close() the close callback is invoked, even though
+ the docs say it isn't. (Christian J. Robinson)
+Solution: Don't call the close callback.
+Files: src/eval.c, src/channel.c, src/netbeans.c, src/proto/channel.pro
+
+Patch 7.4.1414
+Problem: Appveyor only builds one feature set.
+Solution: Build a combination of features and GUI/console. (Christian
+ Brabandt)
+Files: appveyor.yml, src/appveyor.bat
+
+Patch 7.4.1415 (after 7.4.1414)
+Problem: Dropped the skip-tags setting.
+Solution: Put it back.
+Files: appveyor.yml
+
+Patch 7.4.1416
+Problem: Using "u_char" instead of "char_u", which doesn't work everywhere.
+ (Jörg Plate)
+Solution: Use "char_u" always.
+Files: src/integration.c, src/macros.h
+
+Patch 7.4.1417 (after 7.4.1414)
+Problem: Missing appveyor.bat from the distribution.
+Solution: Add it to the list of files.
+Files: Filelist
+
+Patch 7.4.1418
+Problem: job_stop() on MS-Windows does not really stop the job.
+Solution: Make the default to stop the job forcefully. (Ken Takata)
+ Make MS-Windows and Unix more similar.
+Files: src/os_win32.c, src/os_unix.c, runtime/doc/eval.txt
+
+Patch 7.4.1419
+Problem: Tests slowed down because of the "not a terminal" warning.
+Solution: Add the --not-a-term command line argument.
+Files: src/main.c, src/testdir/Makefile, src/Make_all.mak,
+ src/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_vms.mms,
+ runtime/doc/starting.txt
+
+Patch 7.4.1420 (after 7.4.1419)
+Problem: Missing makefile.
+Solution: Type the path correctly.
+Files: src/testdir/Make_all.mak
+
+Patch 7.4.1421
+Problem: May free a channel when a callback may need to be invoked.
+Solution: Keep the channel when refcount is zero.
+Files: src/eval.c, src/channel.c, src/proto/channel.pro
+
+Patch 7.4.1422
+Problem: Error when reading fails uses wrong errno. Keeping channel open
+ after job stops results in test failing.
+Solution: Move the error up. Add ch_job_killed.
+Files: src/channel.c, src/eval.c, src/structs.h
+
+Patch 7.4.1423
+Problem: Channel test fails on MS-Windows.
+Solution: Do not give an error message when reading fails, assume the other
+ end exited.
+Files: src/channel.c
+
+Patch 7.4.1424
+Problem: Not using --not-a-term when running tests on MS-Windows.
+Solution: Use NO_PLUGIN. (Christian Brabandt)
+Files: src/testdir/Make_dos.mak
+
+Patch 7.4.1425
+Problem: There are still references to MS-DOS support.
+Solution: Remove most of the help txt and install instructions. (Ken Takata)
+Files: src/INSTALLpc.txt, runtime/doc/os_msdos.txt, csdpmi4b.zip,
+ Filelist
+
+Patch 7.4.1426
+Problem: The "out-io" option for jobs is not implemented yet.
+Solution: Implement the "buffer" value: append job output to a buffer.
+Files: src/eval.c, src/channel.c, src/structs.h, src/netbeans.c,
+ runtime/doc/channel.txt
+
+Patch 7.4.1427
+Problem: Trailing comma in enums is not ANSI C.
+Solution: Remove the trailing commas.
+Files: src/alloc.h, src/gui_mac.c
+
+Patch 7.4.1428
+Problem: Compiler warning for non-virtual destructor.
+Solution: Make it virtual. (Yasuhiro Matsumoto)
+Files: src/gui_dwrite.cpp
+
+Patch 7.4.1429
+Problem: On MS-Windows, when not use renderoptions=type:directx, drawing
+ emoji will be broken.
+Solution: Fix usage of unicodepdy. (Yasuhiro Matsumoto)
+Files: src/gui_w32.c
+
+Patch 7.4.1430
+Problem: When encoding JSON, turning NaN and Infinity into null without
+ giving an error is not useful.
+Solution: Pass NaN and Infinity on. If the receiver can't handle them it
+ will generate the error.
+Files: src/json.c, src/testdir/test_json.vim, runtime/doc/eval.txt
+
+Patch 7.4.1431
+Problem: Including header files twice.
+Solution: Remove the extra includes.
+Files: src/if_cscope.h
+
+Patch 7.4.1432
+Problem: Typo in button text.
+Solution: Fix the typo. (Dominique Pelle)
+Files: src/gui_gtk.c
+
+Patch 7.4.1433
+Problem: The Sniff interface is no longer useful, the tool has not been
+ available for may years.
+Solution: Delete the Sniff interface and related code.
+Files: src/if_sniff.c, src/if_sniff.h, src/charset.c, src/edit.c,
+ src/eval.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c,
+ src/gui_gtk_x11.c, src/gui_w32.c, src/gui_x11.c, src/normal.c,
+ src/os_unix.c, src/os_win32.c, src/term.c, src/ui.c,
+ src/version.c, src/ex_cmds.h, src/feature.h, src/keymap.h,
+ src/structs.h, src/vim.h, src/Make_mvc.mak, src/Make_vms.mms,
+ src/Makefile, src/configure.in, src/auto/configure,
+ src/config.h.in, src/config.mk.in, runtime/doc/if_sniff.txt,
+ src/config.aap.in, src/main.aap
+
+Patch 7.4.1434
+Problem: JSON encoding doesn't handle surrogate pair.
+Solution: Improve multibyte handling of JSON. (Yasuhiro Matsumoto)
+Files: src/json.c, src/testdir/test_json.vim
+
+Patch 7.4.1435
+Problem: It is confusing that ch_sendexpr() and ch_sendraw() wait for a
+ response.
+Solution: Add ch_evalexpr() and ch_evalraw().
+Files: src/eval.c, runtime/doc/channel.txt, runtime/doc/eval.txt,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1436 (after 7.4.1433)
+Problem: Sniff files still referenced in distribution.
+Solution: Remove sniff files from distribution.
+Files: Filelist
+
+Patch 7.4.1437
+Problem: Old system doesn't have isinf() and NAN. (Ben Fritz)
+Solution: Adjust #ifdefs. Detect isnan() and isinf() functions with
+ configure. Use a replacement when missing. (Kazunobu Kuriyama)
+Files: src/eval.c, src/json.c, src/macros.h, src/message.c,
+ src/config.h.in, src/configure.in, src/auto/configure
+
+Patch 7.4.1438
+Problem: Can't get buffer number of a channel.
+Solution: Add ch_getbufnr().
+Files: src/eval.c, src/channel.c, src/testdir/test_channel.vim,
+ runtime/doc/channel.txt, runtime/doc/eval.txt
+
+Patch 7.4.1439 (after 7.4.1434)
+Problem: Using uninitialized variable.
+Solution: Initialize vc_type.
+Files: src/json.c
+
+Patch 7.4.1440 (after 7.4.1437)
+Problem: Can't build on Windows.
+Solution: Change #ifdefs. Only define isnan when used.
+Files: src/macros.h, src/eval.c, src/json.c
+
+Patch 7.4.1441
+Problem: Using empty name instead of no name for channel buffer.
+Solution: Remove the empty name.
+Files: src/channel.c
+
+Patch 7.4.1442
+Problem: MS-Windows: more compilation warnings for destructor.
+Solution: Add "virtual". (Ken Takata)
+Files: src/if_ole.cpp
+
+Patch 7.4.1443
+Problem: Can't build GTK3 with small features.
+Solution: Use gtk_widget_get_window(). Fix typos. (Dominique Pelle)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.1444
+Problem: Can't build with JSON but without multibyte.
+Solution: Fix pointer name.
+Files: src/json.c
+
+Patch 7.4.1445
+Problem: Memory corruption when 'encoding' is not utf-8.
+Solution: Convert decoded string later.
+Files: src/json.c
+
+Patch 7.4.1446
+Problem: Crash when using json_decode().
+Solution: Terminate string with a NUL byte.
+Files: src/json.c
+
+Patch 7.4.1447
+Problem: Memory leak when using ch_read(). (Dominique Pelle)
+ No log message when stopping a job and a few other situations.
+ Too many "Nothing to read" messages. Channels are not freed.
+Solution: Free the listtv. Add more log messages. Remove "Nothing to read"
+ message. Remove the channel from the job when its refcount
+ becomes zero.
+Files: src/eval.c, src/channel.c
+
+Patch 7.4.1448
+Problem: JSON tests fail if 'encoding' is not utf-8.
+Solution: Force encoding to utf-8.
+Files: src/testdir/test_json.vim
+
+Patch 7.4.1449
+Problem: Build fails with job feature but without channel feature.
+Solution: Add #ifdef.
+Files: src/eval.c
+
+Patch 7.4.1450
+Problem: Json encoding still fails when encoding is not utf-8.
+Solution: Set 'encoding' before :scriptencoding. Run the json test
+ separately to avoid affecting other tests.
+Files: src/testdir/test_json.vim, src/testdir/Make_all.mak,
+ src/testdir/test_alot.vim
+
+Patch 7.4.1451
+Problem: Vim hangs when a channel has a callback but isn't referenced.
+Solution: Have channel_unref() only return TRUE when the channel was
+ actually freed.
+Files: src/eval.c, src/channel.c, src/proto/channel.pro
+
+Patch 7.4.1452
+Problem: When a callback adds a syntax item either the redraw doesn't
+ happen right away or in the GUI the cursor is in the wrong
+ position for a moment. (Jakson Alves de Aquino)
+Solution: Redraw after the callback was invoked.
+Files: src/channel.c
+
+Patch 7.4.1453
+Problem: Missing --not-a-term.
+Solution: Add the argument.
+Files: src/testdir/Make_amiga.mak
+
+Patch 7.4.1454
+Problem: The exit callback test is flaky.
+Solution: Loop to wait for a short time up to a second.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1455
+Problem: JSON decoding test for surrogate pairs is in the wrong place.
+Solution: Move the test lines. (Ken Takata)
+Files: src/testdir/test_json.vim
+
+Patch 7.4.1456
+Problem: Test 87 fails with Python 3.5.
+Solution: Work around difference. (Taro Muraoka)
+Files: src/testdir/test87.in
+
+Patch 7.4.1457
+Problem: Opening a channel with select() is not done properly.
+Solution: Also used read-fds. Use getsockopt() to check for errors. (Ozaki
+ Kiichi)
+Files: src/channel.c
+
+Patch 7.4.1458
+Problem: When a JSON channel has a callback it may never be cleared.
+Solution: Do not write "DETACH" into a JS or JSON channel.
+Files: src/channel.c
+
+Patch 7.4.1459 (after 7.4.1457)
+Problem: MS-Windows doesn't know socklen_t.
+Solution: Use previous method for WIN32.
+Files: src/channel.c
+
+Patch 7.4.1460
+Problem: Syntax error in rarely used code.
+Solution: Fix the mch_rename() declaration. (Ken Takata)
+Files: src/os_unix.c, src/proto/os_unix.pro
+
+Patch 7.4.1461
+Problem: When starting job on MS-Windows all parts of the command are put
+ in quotes.
+Solution: Only use quotes when needed. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.1462
+Problem: Two more rarely used functions with errors.
+Solution: Add proper argument types. (Dominique Pelle)
+Files: src/misc2.c, src/termlib.c
+
+Patch 7.4.1463
+Problem: Configure doesn't find isinf() and isnan() on some systems.
+Solution: Use a configure check that includes math.h.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.1464
+Problem: When the argument of sort() is zero or empty it fails.
+Solution: Make zero work as documented. (suggested by Yasuhiro Matsumoto)
+Files: src/eval.c, src/testdir/test_sort.vim
+
+Patch 7.4.1465
+Problem: Coverity reported possible use of NULL pointer when using buffer
+ output with JSON mode.
+Solution: Make it actually possible to use JSON mode with a buffer.
+ Re-encode the JSON to append it to the buffer.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1466
+Problem: Coverity reports dead code.
+Solution: Remove the two lines.
+Files: src/channel.c
+
+Patch 7.4.1467
+Problem: Can't build without the float feature.
+Solution: Add #ifdefs. (Nick Owens, closes #667)
+Files: src/eval.c, src/json.c
+
+Patch 7.4.1468
+Problem: Sort test doesn't test with "1" argument.
+Solution: Also test ignore-case sorting. (Yasuhiro Matsumoto)
+Files: src/testdir/test_sort.vim
+
+Patch 7.4.1469
+Problem: Channel test sometimes fails, especially on OS/X. (Kazunobu
+ Kuriyama)
+Solution: Change the && into ||, call getsockopt() in more situations.
+ (Ozaki Kiichi)
+Files: src/channel.c
+
+Patch 7.4.1470
+Problem: Coverity reports missing restore.
+Solution: Move json_encode() call up.
+Files: src/channel.c
+
+Patch 7.4.1471
+Problem: Missing out-of-memory check. And Coverity warning.
+Solution: Bail out when msg is NULL.
+Files: src/channel.c
+
+Patch 7.4.1472
+Problem: Coverity warning for not using return value.
+Solution: Add "(void)".
+Files: src/os_unix.c
+
+Patch 7.4.1473
+Problem: Can't build without the autocommand feature.
+Solution: Add #ifdefs. (Yegappan Lakshmanan)
+Files: src/edit.c, src/main.c, src/syntax.c
+
+Patch 7.4.1474
+Problem: Compiler warnings without the float feature.
+Solution: Move #ifdefs. (John Marriott)
+Files: src/eval.c
+
+Patch 7.4.1475
+Problem: When using hangulinput with utf-8 a CSI character is
+ misinterpreted.
+Solution: Convert CSI to K_CSI. (SungHyun Nam)
+Files: src/ui.c
+
+Patch 7.4.1476
+Problem: Function arguments marked as unused while they are not.
+Solution: Remove UNUSED. (Yegappan Lakshmanan)
+Files: src/diff.c, src/eval.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/window.c
+
+Patch 7.4.1477
+Problem: Test_reltime is flaky, it depends on timing.
+Solution: When it fails run it a second time.
+Files: src/testdir/runtest.vim
+
+Patch 7.4.1478
+Problem: ":loadplugin" doesn't take care of ftdetect files.
+Solution: Also load ftdetect scripts when appropriate.
+Files: src/ex_cmds2.c
+
+Patch 7.4.1479
+Problem: No testfor ":loadplugin".
+Solution: Add a test. Fix how option is being set.
+Files: src/ex_cmds2.c, src/testdir/test_loadplugin.vim,
+ src/testdir/Make_all.mak
+
+Patch 7.4.1480
+Problem: Cannot add a pack directory without loading a plugin.
+Solution: Add the :packadd command.
+Files: src/ex_cmds.h, src/ex_cmds2.c, src/proto/ex_cmds2.pro,
+ src/testdir/test_loadplugin.vim, runtime/doc/repeat.txt
+
+Patch 7.4.1481
+Problem: Can't build with small features.
+Solution: Add #ifdef.
+Files: src/ex_cmds2.c
+
+Patch 7.4.1482
+Problem: "timeout" option not supported on ch_eval*().
+Solution: Get and use the timeout option from the argument.
+Files: src/eval.c, src/testdir/test_channel.vim
+
+Patch 7.4.1483
+Problem: A one-time callback is not used for a raw channel.
+Solution: Use a one-time callback when it exists.
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel.py
+
+Patch 7.4.1484
+Problem: Channel "err-io" value "out" is not supported.
+Solution: Connect stderr to stdout if wanted.
+Files: src/os_unix.c, src/os_win32.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel_pipe.py
+
+Patch 7.4.1485
+Problem: Job input from buffer is not implemented.
+Solution: Implement it. Add "in-top" and "in-bot" options.
+Files: src/structs.h, src/eval.c, src/channel.c, src/proto/channel.pro,
+ src/os_unix.c, src/os_win32.c, src/testdir/test_channel.vim
+
+Patch 7.4.1486
+Problem: ":loadplugin" is not optimal, some people find it confusing.
+Solution: Only use ":packadd" with an optional "!".
+Files: src/ex_cmds.h, src/ex_cmds2.c, src/testdir/test_loadplugin.vim,
+ src/testdir/test_packadd.vim, src/testdir/Make_all.mak,
+ runtime/doc/repeat.txt
+
+Patch 7.4.1487
+Problem: For WIN32 isinf() is defined as a macro.
+Solution: Define it as an inline function. (ZyX)
+Files: src/macros.h
+
+Patch 7.4.1488 (after 7.4.1475)
+Problem: Not using key when result from hangul_string_convert() is NULL.
+Solution: Fall back to not converted string.
+Files: src/ui.c
+
+Patch 7.4.1489 (after 7.4.1487)
+Problem: "inline" is not supported by old MSVC.
+Solution: use "__inline". (Ken Takata)
+Files: src/macros.h
+
+Patch 7.4.1490
+Problem: Compiler warning for unused function.
+Solution: Add #ifdef. (Dominique Pelle)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.1491
+Problem: Visual-block shift breaks multibyte characters.
+Solution: Compute column differently. (Yasuhiro Matsumoto) Add a test.
+Files: src/ops.c, src/testdir/test_visual.vim, src/testdir/Make_all.mak
+
+Patch 7.4.1492
+Problem: No command line completion for ":packadd".
+Solution: Implement completion. (Hirohito Higashi)
+Files: src/ex_docmd.c, src/ex_getln.c, src/testdir/test_packadd.vim,
+ src/vim.h
+
+Patch 7.4.1493
+Problem: Wrong callback invoked for zero-id messages.
+Solution: Don't use the first one-time callback when the sequence number
+ doesn't match.
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel.py
+
+Patch 7.4.1494
+Problem: clr_history() does not work properly.
+Solution: Increment hisptr. Add a test. (Yegappan Lakshmanan)
+Files: src/ex_getln.c, src/testdir/test_history.vim,
+ src/testdir/Make_all.mak
+
+Patch 7.4.1495
+Problem: Compiler warnings when building on Unix with the job feature but
+ without the channel feature.
+Solution: Move #ifdefs. (Dominique Pelle)
+Files: src/os_unix.c
+
+Patch 7.4.1496
+Problem: Crash when built with GUI but it's not active. (Dominique Pelle)
+Solution: Check gui.in_use.
+Files: src/channel.c
+
+Patch 7.4.1497
+Problem: Cursor drawing problem with GTK 3.
+Solution: Handle blinking differently. (Kazunobu Kuriyama)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.1498
+Problem: Error for locked item when using json_decode(). (Shougo Matsu)
+Solution: Initialize v_lock.
+Files: src/json.c
+
+Patch 7.4.1499
+Problem: No error message when :packadd does not find anything.
+Solution: Add an error message. (Hirohito Higashi)
+Files: runtime/doc/repeat.txt, src/ex_cmds.h, src/ex_cmds2.c,
+ src/globals.h, src/testdir/test_packadd.vim
+
+Patch 7.4.1500
+Problem: Should_free flag set to FALSE.
+Solution: Set it to TRUE. (Neovim 4415)
+Files: src/ex_eval.c
+
+Patch 7.4.1501
+Problem: Garbage collection with an open channel is not tested.
+Solution: Call garbagecollect() in the test.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1502
+Problem: Writing last-but-one line of buffer to a channel isn't implemented
+ yet.
+Solution: Implement it. Fix leaving a swap file behind.
+Files: src/channel.c, src/structs.h, src/memline.c, src/proto/channel.pro
+
+Patch 7.4.1503
+Problem: Crash when using ch_getjob(). (Damien)
+Solution: Check for a NULL job.
+Files: src/eval.c, src/testdir/test_channel.vim
+
+Patch 7.4.1504 (after 7.4.1502)
+Problem: No test for reading last-but-one line.
+Solution: Add a test.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1505
+Problem: When channel log is enabled get too many "looking for messages"
+ log entries.
+Solution: Only give the message after another message.
+Files: src/channel.c
+
+Patch 7.4.1506
+Problem: Job cannot read from a file.
+Solution: Implement reading from a file for Unix.
+Files: src/eval.c, src/os_unix.c, src/os_win32.c,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1507
+Problem: Crash when starting a job fails.
+Solution: Check for the channel to be NULL. (idea by Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.1508
+Problem: Can't build GvimExt with MingW.
+Solution: Adjust the makefile. (Ben Fritz)
+Files: src/GvimExt/Make_ming.mak
+
+Patch 7.4.1509
+Problem: Keeping both a variable for a job and the channel it refers to is
+ a hassle.
+Solution: Allow passing the job where a channel is expected. (Damien)
+Files: src/eval.c, src/testdir/test_channel.vim
+
+Patch 7.4.1510
+Problem: Channel test fails on AppVeyor.
+Solution: Wait longer than 10 msec if needed.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1511
+Problem: Statusline highlighting is sometimes wrong.
+Solution: Check for Highlight type. (Christian Brabandt)
+Files: src/buffer.c
+
+Patch 7.4.1512
+Problem: Channel input from file not supported on MS-Windows.
+Solution: Implement it. (Yasuhiro Matsumoto)
+Files: src/os_win32.c, src/testdir/test_channel.vim
+
+Patch 7.4.1513
+Problem: "J" fails if there are not enough lines. (Christian Neukirchen)
+Solution: Reduce the count, only fail on the last line.
+Files: src/normal.c, src/testdir/test_join.vim, src/testdir/test_alot.vim
+
+Patch 7.4.1514
+Problem: Channel output to file not implemented yet.
+Solution: Implement it for Unix.
+Files: src/os_unix.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel_pipe.py
+
+Patch 7.4.1515
+Problem: Channel test is a bit flaky.
+Solution: Instead of a fixed sleep time wait until an expression evaluates
+ to true.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1516
+Problem: Cannot change file permissions.
+Solution: Add setfperm().
+Files: src/eval.c, runtime/doc/eval.txt, src/testdir/test_alot.vim,
+ src/testdir/test_file_perm.vim
+
+Patch 7.4.1517
+Problem: Compiler warning with 64bit compiler.
+Solution: Add typecast. (Mike Williams)
+Files: src/channel.c
+
+Patch 7.4.1518
+Problem: Channel with disconnected in/out/err is not supported.
+Solution: Implement it for Unix.
+Files: src/eval.c, src/os_unix.c, src/structs.h,
+ src/testdir/test_channel.vim, src/testdir/test_channel_pipe.py
+
+Patch 7.4.1519 (after 7.4.1514)
+Problem: Channel output to file not implemented for MS-Windows.
+Solution: Implement it. (Yasuhiro Matsumoto)
+Files: src/os_win32.c, src/testdir/test_channel.vim
+
+Patch 7.4.1520
+Problem: Channel test: Waiting for a file to appear doesn't work.
+Solution: In waitFor() ignore errors.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1521 (after 7.4.1516)
+Problem: File permission test fails on MS-Windows.
+Solution: Expect a different permission.
+Files: src/testdir/test_file_perm.vim
+
+Patch 7.4.1522
+Problem: Cannot write channel err to a buffer.
+Solution: Implement it.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1523
+Problem: Writing channel to a file fails on MS-Windows.
+Solution: Disable it for now.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1524
+Problem: Channel test fails on BSD.
+Solution: Break out of the loop when connect() succeeds. (Ozaki Kiichi)
+Files: src/channel.c
+
+Patch 7.4.1525
+Problem: On a high resolution screen the toolbar icons are too small.
+Solution: Add "huge" and "giant" to 'toolbariconsize'. (Brian Gix)
+Files: src/gui_gtk_x11.c, src/option.h
+
+Patch 7.4.1526
+Problem: Writing to file and not connecting a channel doesn't work for
+ MS-Windows.
+Solution: Make it work. (Yasuhiro Matsumoto)
+Files: src/os_win32.c, src/testdir/test_channel.vim
+
+Patch 7.4.1527
+Problem: Channel test is flaky on MS-Windows.
+Solution: Limit the select() timeout to 50 msec and try with a new socket if
+ it fails.
+Files: src/channel.c
+
+Patch 7.4.1528
+Problem: Using "ever" for packages is confusing.
+Solution: Use "start", as it's related to startup.
+Files: src/ex_cmds2.c, runtime/doc/repeat.txt
+
+Patch 7.4.1529
+Problem: Specifying buffer number for channel not implemented yet.
+Solution: Implement passing a buffer number.
+Files: src/structs.h, src/channel.c, src/eval.c,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1530
+Problem: MS-Windows job_start() closes wrong handle.
+Solution: Close hThread on the process info. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.1531
+Problem: Compiler warning for uninitialized variable. (Dominique Pelle)
+Solution: Always give the variable a value.
+Files: src/channel.c
+
+Patch 7.4.1532
+Problem: MS-Windows channel leaks file descriptor.
+Solution: Use CreateFile with the right options. (Yasuhiro Matsumoto)
+Files: src/os_win32.c
+
+Patch 7.4.1533
+Problem: Using feedkeys() with an empty string disregards 'x' option.
+Solution: Make 'x' work with an empty string. (Thinca)
+Files: src/eval.c, src/testdir/test_alot.vim,
+ src/testdir/test_feedkeys.vim
+
+Patch 7.4.1534
+Problem: Compiler warning for shadowed variable. (Kazunobu Kuriyama)
+Solution: Rename it.
+Files: src/eval.c
+
+Patch 7.4.1535
+Problem: The feedkeys test has a one second delay.
+Solution: Avoid need_wait_return() to delay. (Hirohito Higashi)
+Files: src/eval.c
+
+Patch 7.4.1536
+Problem: Cannot re-use a channel for another job.
+Solution: Add the "channel" option to job_start().
+Files: src/channel.c, src/eval.c, src/structs.h, src/os_unix.c,
+ src/os_win32.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1537
+Problem: Too many feature flags for pipes, jobs and channels.
+Solution: Only use FEAT_JOB_CHANNEL.
+Files: src/structs.h, src/feature.h, src/configure.in,
+ src/auto/configure, src/config.h.in, src/channel.c, src/eval.c,
+ src/gui.c, src/main.c, src/memline.c, src/misc2.c, src/os_mswin.c,
+ src/os_unix.c, src/os_win32.c, src/ui.c, src/version.c,
+ src/macros.h, src/proto.h, src/vim.h, src/Make_cyg_ming.mak,
+ src/Make_bc5.mak, src/Make_mvc.mak
+
+Patch 7.4.1538
+Problem: Selection with the mouse does not work in command line mode.
+Solution: Use cairo functions. (Kazunobu Kuriyama)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.1539
+Problem: Too much code in eval.c.
+Solution: Move job and channel code to channel.c.
+Files: src/eval.c, src/channel.c, src/proto/channel.pro,
+ src/proto/eval.pro
+
+Patch 7.4.1540
+Problem: Channel test is a bit flaky.
+Solution: Increase expected wait time.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1541
+Problem: Missing job_info().
+Solution: Implement it.
+Files: src/eval.c, src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, runtime/doc/eval.txt
+
+Patch 7.4.1542
+Problem: job_start() with a list is not tested.
+Solution: Call job_start() with a list.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1543
+Problem: Channel log methods are not tested.
+Solution: Log job activity and check it.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1544
+Problem: On Win32 escaping the command does not work properly.
+Solution: Reset 'ssl' when escaping the command. (Yasuhiro Matsumoto)
+Files: src/channel.c
+
+Patch 7.4.1545
+Problem: GTK3: horizontal cursor movement in Visual selection not good.
+Solution: Make it work better. (Kazunobu Kuriyama)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.1546
+Problem: Sticky type checking is more annoying than useful.
+Solution: Remove the error for changing a variable type.
+Files: src/eval.c, src/testdir/test_assign.vim,
+ src/testdir/test_alot.vim, runtime/doc/eval.txt
+
+Patch 7.4.1547
+Problem: Getting a cterm highlight attribute that is not set results in the
+ string "-1".
+Solution: Return an empty string. (Taro Muraoka)
+Files: src/syntax.c, src/testdir/test_alot.vim,
+ src/testdir/test_syn_attr.vim
+
+Patch 7.4.1548 (after 7.4.1546)
+Problem: Two tests fail.
+Solution: Adjust the expected error number. Remove check for type.
+Files: src/testdir/test101.ok, src/testdir/test55.in,
+ src/testdir/test55.ok
+
+Patch 7.4.1549 (after 7.4.1547)
+Problem: Test for syntax attributes fails in Win32 GUI.
+Solution: Use an existing font name.
+Files: src/testdir/test_syn_attr.vim
+
+Patch 7.4.1550
+Problem: Cannot load packages early.
+Solution: Add the ":packloadall" command.
+Files: src/ex_cmds.h, src/ex_cmds2.c, src/main.c,
+ src/proto/ex_cmds2.pro, src/testdir/test_packadd.vim
+
+Patch 7.4.1551
+Problem: Cannot generate help tags in all doc directories.
+Solution: Make ":helptags ALL" work.
+Files: src/ex_cmds2.c, src/proto/ex_cmds2.pro, src/ex_cmds.c, src/vim.h
+ src/testdir/test_packadd.vim
+
+Patch 7.4.1552
+Problem: ":colorscheme" does not use 'packpath'.
+Solution: Also use in "start" and "opt" directories in 'packpath'.
+Files: src/ex_cmds2.c, src/gui.c, src/hardcopy.c, src/os_mswin.c,
+ src/spell.c, src/tag.c, src/if_py_both.h, src/vim.h,
+ src/digraph.c, src/eval.c, src/ex_docmd.c, src/main.c,
+ src/option.c, src/syntax.c, src/testdir/test_packadd.vim
+
+Patch 7.4.1553
+Problem: ":runtime" does not use 'packpath'.
+Solution: Add "what" argument.
+Files: src/ex_cmds2.c, src/vim.h, runtime/doc/repeat.txt,
+ src/testdir/test_packadd.vim
+
+Patch 7.4.1554
+Problem: Completion for :colorscheme does not use 'packpath'.
+Solution: Make it work, add a test. (Hirohito Higashi)
+Files: src/ex_getln.c, src/testdir/test_packadd.vim
+
+Patch 7.4.1555
+Problem: List of test targets incomplete.
+Solution: Add newly added tests.
+Files: src/Makefile
+
+Patch 7.4.1556
+Problem: "make install" changes the help tags file, causing it to differ
+ from the repository.
+Solution: Move it aside and restore it.
+Files: src/Makefile
+
+Patch 7.4.1557
+Problem: Windows cannot be identified.
+Solution: Add a unique window number to each window and functions to use it.
+Files: src/structs.h, src/window.c, src/eval.c, src/proto/eval.pro,
+ src/proto/window.pro, src/testdir/test_window_id.vim,
+ src/testdir/Make_all.mak, runtime/doc/eval.txt
+
+Patch 7.4.1558
+Problem: It is not easy to find out what windows display a buffer.
+Solution: Add win_findbuf().
+Files: src/eval.c, src/window.c, src/proto/window.pro,
+ src/testdir/test_window_id.vim, runtime/doc/eval.txt
+
+Patch 7.4.1559
+Problem: Passing cookie to a callback is clumsy.
+Solution: Change function() to take arguments and return a partial.
+Files: src/structs.h, src/channel.c, src/eval.c, src/if_python.c,
+ src/if_python3.c, src/if_py_both.h, src/json.c,
+ src/proto/eval.pro, src/testdir/test_partial.vim,
+ src/testdir/test_alot.vim, runtime/doc/eval.txt
+
+Patch 7.4.1560
+Problem: Dict options with a dash are more difficult to use.
+Solution: Use an underscore, so that dict.err_io can be used.
+Files: src/channel.c, src/structs.h, src/testdir/test_channel.vim,
+ runtime/doc/channel.txt
+
+Patch 7.4.1561 (after 7.4.1559)
+Problem: Missing update to proto file.
+Solution: Change the proto file.
+Files: src/proto/channel.pro
+
+Patch 7.4.1562
+Problem: ":helptags ALL" crashes. (Lcd)
+Solution: Don't free twice.
+Files: src/ex_cmds.c
+
+Patch 7.4.1563
+Problem: Partial test fails on windows.
+Solution: Return 1 or -1 from compare function.
+Files: src/testdir/test_partial.vim
+
+Patch 7.4.1564
+Problem: An empty list in function() causes an error.
+Solution: Handle an empty list like there is no list of arguments.
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1565
+Problem: Crash when assert_equal() runs into a NULL string.
+Solution: Check for NULL. (Dominique) Add a test.
+Files: src/eval.c, src/testdir/test_assert.vim
+
+Patch 7.4.1566
+Problem: Compiler warning for shadowed variable. (Kazunobu Kuriyama)
+Solution: Remove the inner one.
+Files: src/eval.c
+
+Patch 7.4.1567
+Problem: Crash in assert_fails().
+Solution: Check for NULL. (Dominique Pelle) Add a test.
+Files: src/eval.c, src/testdir/test_assert.vim
+
+Patch 7.4.1568
+Problem: Using CTRL-] in help on option in parentheses doesn't work.
+Solution: Skip the "(" in "('". (Hirohito Higashi)
+Files: src/ex_cmds.c
+
+Patch 7.4.1569
+Problem: Using old style tests for quickfix.
+Solution: Change them to new style tests. (Yegappan Lakshmanan)
+Files: src/testdir/Make_all.mak, src/testdir/test106.in,
+ src/testdir/test106.ok, src/testdir/test_qf_title.in,
+ src/testdir/test_qf_title.ok, src/testdir/test_quickfix.vim
+
+Patch 7.4.1570
+Problem: There is no way to avoid the message when editing a file.
+Solution: Add the "F" flag to 'shortmess'. (Shougo Matsu, closes #686)
+Files: runtime/doc/options.txt, src/buffer.c, src/ex_cmds.c,
+ src/option.h
+
+Patch 7.4.1571
+Problem: No test for ":help".
+Solution: Add a test for what 7.4.1568 fixed. (Hirohito Higashi)
+Files: src/testdir/test_alot.vim, src/testdir/test_help_tagjump.vim
+
+Patch 7.4.1572
+Problem: Setting 'compatible' in test influences following tests.
+Solution: Turn 'compatible' off again.
+Files: src/testdir/test_backspace_opt.vim
+
+Patch 7.4.1573
+Problem: Tests get stuck at the more prompt.
+Solution: Move the backspace test out of test_alot.
+Files: src/testdir/test_alot.vim, src/testdir/Make_all.mak
+
+Patch 7.4.1574
+Problem: ":undo 0" does not work. (Florent Fayolle)
+Solution: Make it undo all the way. (closes #688)
+Files: src/undo.c, src/testdir/test_undolevels.vim,
+ src/testdir/test_ex_undo.vim, src/testdir/test_alot.vim
+
+Patch 7.4.1575
+Problem: Using wrong size for struct.
+Solution: Use the size for wide API. (Ken Takata)
+Files: src/gui_w32.c
+
+Patch 7.4.1576
+Problem: Write error of viminfo file is not handled properly. (Christian
+ Neukirchen)
+Solution: Check the return value of fclose(). (closes #682)
+Files: src/ex_cmds.c
+
+Patch 7.4.1577
+Problem: Cannot pass "dict.Myfunc" around as a partial.
+Solution: Create a partial when expected.
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1578
+Problem: There is no way to invoke a function later or periodically.
+Solution: Add timer support.
+Files: src/eval.c, src/ex_cmds2.c, src/screen.c, src/ex_docmd.c,
+ src/feature.h, src/gui.c, src/proto/eval.pro,
+ src/proto/ex_cmds2.pro, src/proto/screen.pro, src/structs.h,
+ src/version.c, src/testdir/test_alot.vim,
+ src/testdir/test_timers.vim, runtime/doc/eval.txt
+
+Patch 7.4.1579 (after 7.4.1578)
+Problem: Missing changes in channel.c
+Solution: Include the changes.
+Files: src/channel.c
+
+Patch 7.4.1580
+Problem: Crash when using function reference. (Luchr)
+Solution: Set initial refcount. (Ken Takata, closes #690)
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1581
+Problem: Using ":call dict.func()" where the function is a partial does
+ not work. Using "dict.func()" where the function does not take a
+ Dictionary does not work.
+Solution: Handle partial properly in ":call". (Yasuhiro Matsumoto)
+Files: src/eval.c, src/testdir/test_partial.vim, src/testdir/test55.ok
+
+Patch 7.4.1582
+Problem: Get E923 when using function(dict.func, [], dict). (Kent Sibilev)
+ Storing a function with a dict in a variable drops the dict if the
+ function is script-local.
+Solution: Translate the function name. Use dict arg if present.
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1583
+Problem: Warning for uninitialized variable.
+Solution: Initialize it. (Dominique)
+Files: src/ex_cmds2.c
+
+Patch 7.4.1584
+Problem: Timers don't work for Win32 console.
+Solution: Add check_due_timer() in WaitForChar().
+Files: src/os_win32.c
+
+Patch 7.4.1585
+Problem: Partial is not recognized everywhere.
+Solution: Check for partial in trans_function_name(). (Yasuhiro Matsumoto)
+ Add a test.
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1586
+Problem: Nesting partials doesn't work.
+Solution: Append arguments. (Ken Takata)
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1587
+Problem: Compiler warnings with 64 bit compiler.
+Solution: Add type casts. (Mike Williams)
+Files: src/ex_cmds2.c
+
+Patch 7.4.1588
+Problem: Old style test for quickfix.
+Solution: Turn test 96 into a new style test.
+Files: src/testdir/Make_all.mak, src/testdir/test96.in,
+ src/testdir/test96.ok, src/testdir/test_quickfix.vim
+
+Patch 7.4.1589
+Problem: Combining dict and args with partial doesn't always work.
+Solution: Use the arguments from the partial.
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1590
+Problem: Warning for shadowed variable. (Christian Brabandt)
+Solution: Move the variable into a local block.
+Files: src/eval.c
+
+Patch 7.4.1591
+Problem: The quickfix title is truncated.
+Solution: Save the command before it is truncated. (Anton Lindqvist)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1592
+Problem: Quickfix code using memory after being freed. (Dominique Pelle)
+Solution: Detect that the window was closed. (Hirohito Higashi)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1593
+Problem: Using channel timeout instead of request timeout. (Coverity)
+Solution: Remove the extra assignment.
+Files: src/channel.c
+
+Patch 7.4.1594
+Problem: Timers don't work on Unix.
+Solution: Add missing code.
+Files: src/os_unix.c
+
+Patch 7.4.1595
+Problem: Not checking for failed open(). (Coverity)
+Solution: Check file descriptor not being negative.
+Files: src/os_unix.c
+
+Patch 7.4.1596
+Problem: Memory leak. (Coverity)
+Solution: Free the pattern.
+Files: src/ex_cmds2.c
+
+Patch 7.4.1597
+Problem: Memory leak when out of memory. (Coverity)
+Solution: Free the name.
+Files: src/eval.c
+
+Patch 7.4.1598
+Problem: When starting the GUI fails a swap file is left behind. (Joerg
+ Plate)
+Solution: Preserve files before exiting. (closes #692)
+Files: src/main.c, src/gui.c
+
+Patch 7.4.1599
+Problem: No link to Coverity.
+Solution: Add Coverity badge in README.
+Files: README.md
+
+Patch 7.4.1600
+Problem: libs directory is not useful.
+Solution: Remove arp.library, it was only for very old Amiga versions.
+Files: libs/arp.library, Filelist
+
+Patch 7.4.1601
+Problem: README files take a lot of space in the top directory.
+Solution: Move most of them to "READMEdir".
+Files: Filelist, Makefile, README.txt.info, README_ami.txt,
+ README_ami.txt.info, README_amibin.txt, README_amibin.txt.info,
+ README_amisrc.txt, README_amisrc.txt.info, README_bindos.txt,
+ README_dos.txt, README_extra.txt, README_mac.txt, README_ole.txt,
+ README_os2.txt, README_os390.txt, README_src.txt,
+ README_srcdos.txt, README_unix.txt, README_vms.txt,
+ README_w32s.txt, READMEdir/README.txt.info,
+ READMEdir/README_ami.txt, READMEdir/README_ami.txt.info,
+ READMEdir/README_amibin.txt, READMEdir/README_amibin.txt.info,
+ READMEdir/README_amisrc.txt, READMEdir/README_amisrc.txt.info,
+ READMEdir/README_bindos.txt, READMEdir/README_dos.txt,
+ READMEdir/README_extra.txt, READMEdir/README_mac.txt,
+ READMEdir/README_ole.txt, READMEdir/README_os2.txt,
+ READMEdir/README_os390.txt, READMEdir/README_src.txt,
+ READMEdir/README_srcdos.txt, READMEdir/README_unix.txt,
+ READMEdir/README_vms.txt, READMEdir/README_w32s.txt,
+
+Patch 7.4.1602
+Problem: Info files take space in the top directory.
+Solution: Move them to "READMEdir".
+Files: Filelist, src.info, Contents.info, runtime.info, vimdir.info,
+ Vim.info, Xxd.info, READMEdir/src.info, READMEdir/Contents.info,
+ READMEdir/runtime.info, READMEdir/vimdir.info, READMEdir/Vim.info,
+ READMEdir/Xxd.info
+
+Patch 7.4.1603
+Problem: Timer with an ":echo" command messes up display.
+Solution: Redraw depending on the mode. (Hirohito Higashi) Avoid the more
+ prompt being used recursively.
+Files: src/screen.c, src/message.c
+
+Patch 7.4.1604
+Problem: Although emoji characters are ambiguous width, best is to treat
+ them as full width.
+Solution: Update the Unicode character tables. Add the 'emoji' options.
+ (Yasuhiro Matsumoto)
+Files: runtime/doc/options.txt, runtime/optwin.vim,
+ runtime/tools/unicode.vim, src/mbyte.c, src/option.c, src/option.h
+
+Patch 7.4.1605
+Problem: Catching exception that won't be thrown.
+Solution: Remove try/catch.
+Files: src/testdir/test55.in
+
+Patch 7.4.1606
+Problem: Having type() handle a Funcref that is or isn't a partial
+ differently causes problems for existing scripts.
+Solution: Make type() return the same value. (Thinca)
+Files: src/eval.c, src/testdir/test_viml.vim
+
+Patch 7.4.1607
+Problem: Comparing a function that exists on two dicts is not backwards
+ compatible. (Thinca)
+Solution: Only compare the function, not what the partial adds.
+Files: src/eval.c, src/testdir/test_alot.vim, src/testdir/test_expr.vim
+
+Patch 7.4.1608
+Problem: string() doesn't handle a partial.
+Solution: Make a string from a partial.
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1609
+Problem: Contents file is only for Amiga distro.
+Solution: Move it to "READMEdir". Update some info.
+Files: Filelist, Contents, READMEdir/Contents
+
+Patch 7.4.1610
+Problem: Compiler warnings for non-virtual destructor.
+Solution: Mark the classes final. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/gui_dwrite.cpp, src/if_ole.cpp
+
+Patch 7.4.1611
+Problem: The versplit feature makes the code unnecessary complicated.
+Solution: Remove FEAT_VERTSPLIT, always support vertical splits when
+ FEAT_WINDOWS is defined.
+Files: src/buffer.c, src/charset.c, src/eval.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/ex_getln.c, src/gui.c, src/if_lua.c,
+ src/if_mzsch.c, src/if_ruby.c, src/main.c, src/misc1.c,
+ src/misc2.c, src/move.c, src/normal.c, src/option.c,
+ src/quickfix.c, src/screen.c, src/syntax.c, src/term.c, src/ui.c,
+ src/window.c, src/globals.h, src/gui.h, src/if_py_both.h,
+ src/option.h, src/structs.h, src/term.h
+ src/feature.h, src/vim.h, src/version.c
+
+Patch 7.4.1612 (after 7.4.1611)
+Problem: Can't build with small features.
+Solution: Move code and #ifdefs.
+Files: src/ex_getln.c
+
+Patch 7.4.1613 (after 7.4.1612)
+Problem: Still can't build with small features.
+Solution: Adjust #ifdefs.
+Files: src/ex_getln.c
+
+Patch 7.4.1614
+Problem: Still quickfix test in old style.
+Solution: Turn test 10 into a new style test.
+Files: src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/main.aap, src/testdir/test10.in,
+ src/testdir/test10.ok, src/testdir/test_quickfix.vim,
+ src/testdir/test10a.in, src/testdir/test10a.ok
+
+Patch 7.4.1615
+Problem: Build fails with tiny features.
+Solution: Adjust #ifdefs.
+Files: src/normal.c, src/window.c
+
+Patch 7.4.1616
+Problem: Malformed channel request causes a hang.
+Solution: Drop malformed message. (Damien)
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel.py
+
+Patch 7.4.1617
+Problem: When a JSON message is split it isn't decoded.
+Solution: Wait a short time for the rest of the message to arrive.
+Files: src/channel.c, src/json.c, src/structs.h,
+ src/testdir/test_channel.vim, src/testdir/test_channel.py
+
+Patch 7.4.1618
+Problem: Starting job with output to buffer changes options in the current
+ buffer.
+Solution: Set "curbuf" earlier. (Yasuhiro Matsumoto)
+Files: src/channel.c
+
+Patch 7.4.1619
+Problem: When 'fileformats' is set in the vimrc it applies to new buffers
+ but not the initial buffer.
+Solution: Set 'fileformat' when starting up. (Mike Williams)
+Files: src/option.c
+
+Patch 7.4.1620
+Problem: Emoji characters are not considered as a kind of word character.
+Solution: Give emoji characters a word class number. (Yasuhiro Matsumoto)
+Files: src/mbyte.c
+
+Patch 7.4.1621
+Problem: Channel test doesn't work with Python 2.6.
+Solution: Add number in formatting placeholder. (Wiredool)
+Files: src/testdir/test_channel.py
+
+Patch 7.4.1622
+Problem: Channel demo doesn't work with Python 2.6.
+Solution: Add number in formatting placeholder
+Files: runtime/tools/demoserver.py
+
+Patch 7.4.1623
+Problem: All Channels share the message ID, it keeps getting bigger.
+Solution: Use a message ID per channel.
+Files: src/channel.c, src/proto/channel.pro, src/structs.h
+
+Patch 7.4.1624
+Problem: Can't get info about a channel.
+Solution: Add ch_info().
+Files: src/eval.c, src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, runtime/doc/eval.txt
+
+Patch 7.4.1625
+Problem: Trying to close file descriptor that isn't open.
+Solution: Check for negative number.
+Files: src/os_unix.c
+
+Patch 7.4.1626 (after 7.4.1624)
+Problem: Missing changes to structs.
+Solution: Include the changes.
+Files: src/structs.h
+
+Patch 7.4.1627
+Problem: Channel out_cb and err_cb are not tested.
+Solution: Add a test.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1628
+Problem: 64-bit Compiler warning.
+Solution: Change type of variable. (Mike Williams)
+Files: src/channel.c
+
+Patch 7.4.1629
+Problem: Handling emoji characters as full width has problems with
+ backwards compatibility.
+Solution: Remove ambiguous and double width characters from the emoji table.
+ Use a separate table for the character class.
+ (partly by Yasuhiro Matsumoto)
+Files: runtime/tools/unicode.vim, src/mbyte.c
+
+Patch 7.4.1630
+Problem: Unicode table for double width is outdated.
+Solution: Update to the latest Unicode standard.
+Files: src/mbyte.c
+
+Patch 7.4.1631
+Problem: Compiler doesn't understand switch on all enum values. (Tony
+ Mechelynck)
+Solution: Initialize variable.
+Files: src/channel.c
+
+Patch 7.4.1632
+Problem: List of test targets is outdated.
+Solution: Update to current list of test targets.
+Files: src/Makefile
+
+Patch 7.4.1633
+Problem: If the help tags file was removed "make install" fails. (Tony
+ Mechelynck)
+Solution: Only try moving the file if it exists.
+Files: src/Makefile
+
+Patch 7.4.1634
+Problem: Vertical movement after CTRL-A ends up in the wrong column.
+ (Urtica Dioica)
+Solution: Set curswant when appropriate. (Hirohito Higashi)
+Files: src/ops.c, src/testdir/test_increment.vim
+
+Patch 7.4.1635
+Problem: Channel test is a bit flaky.
+Solution: Remove 'DETACH' if it's there.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1636
+Problem: When 'F' is in 'shortmess' the prompt for the encryption key isn't
+ displayed. (Toothpik)
+Solution: Reset msg_silent.
+Files: src/ex_getln.c
+
+Patch 7.4.1637
+Problem: Can't build with older MinGW compiler.
+Solution: Change option from c++11 to gnu++11. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1638
+Problem: When binding a function to a dict the reference count is wrong.
+Solution: Decrement dict reference count, only reference the function when
+ actually making a copy. (Ken Takata)
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1639
+Problem: Invoking garbage collection may cause a double free.
+Solution: Don't free the dict in a partial when recursive is FALSE.
+Files: src/eval.c
+
+Patch 7.4.1640
+Problem: Crash when an autocommand changes a quickfix list. (Dominique)
+Solution: Check whether an entry is still valid. (Yegappan Lakshmanan,
+ Hirohito Higashi)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1641
+Problem: Using unterminated string.
+Solution: Add NUL before calling vim_strsave_shellescape(). (James McCoy)
+Files: src/eval.c, src/testdir/test105.in, src/testdir/test105.ok
+
+Patch 7.4.1642
+Problem: Handling emoji characters as full width has problems with
+ backwards compatibility.
+Solution: Only put characters in the 1f000 range in the emoji table.
+Files: runtime/tools/unicode.vim, src/mbyte.c
+
+Patch 7.4.1643 (after 7.4.1641)
+Problem: Terminating file name has side effects.
+Solution: Restore the character. (mostly by James McCoy, closes #713)
+Files: src/eval.c, src/testdir/test105.in, src/testdir/test105.ok
+
+Patch 7.4.1644
+Problem: Using string() on a partial that exists in the dictionary it binds
+ results in an error. (Nikolai Pavlov)
+Solution: Make string() not fail on a recursively nested structure. (Ken
+ Takata)
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1645
+Problem: When a dict contains a partial it can't be redefined as a
+ function. (Nikolai Pavlov)
+Solution: Remove the partial when overwriting with a function.
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1646
+Problem: Using Python vim.bindeval() on a partial doesn't work. (Nikolai
+ Pavlov)
+Solution: Add VAR_PARTIAL support in Python.
+Files: src/if_py_both.h, src/testdir/test_partial.vim
+
+Patch 7.4.1647
+Problem: Using freed memory after setqflist() and ":caddbuffer". (Dominique)
+Solution: Set qf_ptr when adding the first item to the quickfix list.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1648
+Problem: Compiler has a problem copying a string into di_key[]. (Yegappan
+ Lakshmanan)
+Solution: Add dictitem16_T.
+Files: src/structs.h, src/eval.c
+
+Patch 7.4.1649
+Problem: The matchit plugin needs to be copied to be used.
+Solution: Put the matchit plugin in an optional package.
+Files: Filelist, runtime/macros/matchit.vim, runtime/macros/matchit.txt,
+ runtime/macros/README.txt, src/Makefile,
+ runtime/pack/dist/opt/matchit/plugin/matchit.vim,
+ runtime/pack/dist/opt/matchit/doc/matchit.txt,
+ runtime/pack/dist/opt/matchit/doc/tags,
+ runtime/doc/usr_05.txt, runtime/doc/usr_toc.txt
+
+Patch 7.4.1650
+Problem: Quickfix test fails.
+Solution: Accept any number of matches.
+Files: src/testdir/test_quickfix.vim
+
+Patch 7.4.1651
+Problem: Some dead (MSDOS) code remains.
+Solution: Remove the unused lines. (Ken Takata)
+Files: src/misc1.c
+
+Patch 7.4.1652
+Problem: Old style test for fnamemodify().
+Solution: Turn it into a new style test.
+Files: src/testdir/test105.in, src/testdir/test105.ok,
+ src/testdir/test_fnamemodify.vim, src/testdir/test_alot.vim,
+ src/testdir/Make_all.mak
+
+Patch 7.4.1653 (after 7.4.1649)
+Problem: Users who loaded matchit.vim manually have to change their
+ startup. (Gary Johnson)
+Solution: Add a file in the old location that loads the package.
+Files: runtime/macros/matchit.vim, Filelist
+
+Patch 7.4.1654
+Problem: Crash when using expand('%:S') in a buffer without a name.
+Solution: Don't set a NUL. (James McCoy, closes #714)
+Files: src/eval.c, src/testdir/test_fnamemodify.vim
+
+Patch 7.4.1655
+Problem: remote_expr() hangs. (Ramel)
+Solution: Check for messages in the waiting loop.
+Files: src/if_xcmdsrv.c
+
+Patch 7.4.1656
+Problem: Crash when using partial with a timer.
+Solution: Increment partial reference count. (Hirohito Higashi)
+Files: src/eval.c, src/testdir/test_timers.vim
+
+Patch 7.4.1657
+Problem: On Unix in a terminal: channel messages are not handled right away.
+ (Jackson Alves de Aquino)
+Solution: Break the loop for timers when something was received.
+Files: src/os_unix.c
+
+Patch 7.4.1658
+Problem: A plugin does not know when VimEnter autocommands were already
+ triggered.
+Solution: Add the v:vim_did_enter variable.
+Files: src/eval.c, src/main.c, src/vim.h, src/testdir/test_autocmd.vim,
+ src/testdir/test_alot.vim, runtime/doc/autocmd.txt,
+ runtime/doc/eval.txt
+
+Patch 7.4.1659 (after 7.4.1657)
+Problem: Compiler warning for argument type. (Manuel Ortega)
+Solution: Remove "&".
+Files: src/os_unix.c
+
+Patch 7.4.1660
+Problem: has('patch-7.4.1') doesn't work.
+Solution: Fix off-by-one error. (Thinca)
+Files: src/eval.c, src/testdir/test_expr.vim, src/testdir/test60.in,
+ src/testdir/test60.ok
+
+Patch 7.4.1661
+Problem: No test for special characters in channel eval command.
+Solution: Testing sending and receiving text with special characters.
+Files: src/testdir/test_channel.vim, src/testdir/test_channel.py
+
+Patch 7.4.1662
+Problem: No test for an invalid Ex command on a channel.
+Solution: Test handling an invalid command gracefully. Avoid getting an
+ error message, do write it to the channel log.
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel.py
+
+Patch 7.4.1663
+Problem: In tests it's often useful to check if a pattern matches.
+Solution: Add assert_match().
+Files: src/eval.c, src/testdir/test_assert.vim,
+ src/testdir/test_channel.vim, runtime/doc/eval.txt
+
+Patch 7.4.1664
+Problem: Crash in :cgetexpr.
+Solution: Check for NULL pointer. (Dominique) Add a test.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1665
+Problem: Crash when calling job_start() with a NULL string. (Dominique)
+Solution: Check for an invalid argument.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1666
+Problem: When reading JSON from a channel all readahead is used.
+Solution: Use the fill function to reduce overhead.
+Files: src/channel.c, src/json.c, src/structs.h
+
+Patch 7.4.1667
+Problem: Win32: waiting on a pipe with fixed sleep time.
+Solution: Start with a short delay and increase it when looping.
+Files: src/channel.c
+
+Patch 7.4.1668
+Problem: channel_get_all() does multiple allocations.
+Solution: Compute the size and allocate once.
+Files: src/channel.c
+
+Patch 7.4.1669
+Problem: When writing buffer lines to a pipe Vim may block.
+Solution: Avoid blocking, write more lines later.
+Files: src/channel.c, src/misc2.c, src/os_unix.c, src/structs.h,
+ src/vim.h, src/proto/channel.pro, src/testdir/test_channel.vim
+
+Patch 7.4.1670
+Problem: Completion doesn't work well for a variable containing "#".
+Solution: Recognize the "#". (Watiko)
+Files: src/eval.c
+
+Patch 7.4.1671
+Problem: When help exists in multiple languages, adding @ab while "ab" is
+ the default help language is unnecessary.
+Solution: Leave out "@ab" when not needed. (Ken Takata)
+Files: src/ex_getln.c
+
+Patch 7.4.1672
+Problem: The Dvorak support is a bit difficult to install.
+Solution: Turn it into an optional package.
+Files: runtime/macros/dvorak, runtime/macros/README.txt,
+ runtime/pack/dist/opt/dvorak/plugin/dvorak.vim,
+ runtime/pack/dist/opt/dvorak/dvorak/enable.vim,
+ runtime/pack/dist/opt/dvorak/dvorak/disable.vim
+
+Patch 7.4.1673
+Problem: The justify plugin has to be copied or sourced to be used.
+Solution: Turn it into a package.
+Files: runtime/macros/justify.vim, runtime/macros/README.txt,
+ runtime/pack/dist/opt/justify/plugin/justify.vim, Filelist
+
+Patch 7.4.1674
+Problem: The editexisting plugin has to be copied or sourced to be used.
+Solution: Turn it into a package.
+Files: runtime/macros/editexisting.vim, runtime/macros/README.txt,
+ runtime/pack/dist/opt/editexisting/plugin/editexisting.vim,
+ Filelist
+
+Patch 7.4.1675
+Problem: The swapmous plugin has to be copied or sourced to be used.
+Solution: Turn it into the swapmouse package.
+Files: runtime/macros/swapmous.vim, runtime/macros/README.txt,
+ runtime/pack/dist/opt/swapmouse/plugin/swapmouse.vim, Filelist
+
+Patch 7.4.1676
+Problem: The shellmenu plugin has to be copied or sourced to be used.
+Solution: Turn it into a package.
+Files: runtime/macros/shellmenu.vim, runtime/macros/README.txt,
+ runtime/pack/dist/opt/shellmenu/plugin/shellmenu.vim, Filelist
+
+Patch 7.4.1677
+Problem: A reference to the removed file_select plugin remains.
+Solution: Remove it.
+Files: runtime/macros/README.txt
+
+Patch 7.4.1678
+Problem: Warning for unused argument.
+Solution: Add UNUSED. (Dominique Pelle)
+Files: src/if_mzsch.c
+
+Patch 7.4.1679
+Problem: Coverity: copying value of v_lock without initializing it.
+Solution: Init v_lock in rettv_list_alloc() and rettv_dict_alloc().
+Files: src/eval.c
+
+Patch 7.4.1680
+Problem: Coverity warns for not checking name length (false positive).
+Solution: Only copy the characters we know are there.
+Files: src/channel.c
+
+Patch 7.4.1681
+Problem: Coverity warns for fixed size buffer length (false positive).
+Solution: Add a check for the name length.
+Files: src/eval.c
+
+Patch 7.4.1682
+Problem: Coverity: no check for NULL.
+Solution: Add check for invalid argument to assert_match().
+Files: src/eval.c
+
+Patch 7.4.1683
+Problem: Generated .bat files do not support --nofork.
+Solution: Add check for --nofork. Also add "setlocal". (Kevin Cantú,
+ closes #659)
+Files: src/dosinst.c
+
+Patch 7.4.1684
+Problem: README text is slightly outdated.
+Solution: Mention the READMEdir directory.
+Files: README.md, README.txt
+
+Patch 7.4.1685
+Problem: There is no easy way to get all the information about a match.
+Solution: Add matchstrpos(). (Ozaki Kiichi)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/eval.c,
+ src/testdir/test_alot.vim, src/testdir/test_matchstrpos.vim
+
+Patch 7.4.1686
+Problem: When running tests $HOME/.viminfo is written. (James McCoy)
+Solution: Add 'nviminfo' to the 'viminfo' option. (closes #722)
+Files: src/testdir/test_backspace_opt.vim, src/testdir/test_viminfo.vim,
+ src/testdir/runtest.vim.
+
+Patch 7.4.1687
+Problem: The channel close_cb option does not work.
+Solution: Use jo_close_partial instead of jo_err_partial. (Damien)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1688
+Problem: MzScheme does not support partial.
+Solution: Add minimal partial support. (Ken Takata)
+Files: src/if_mzsch.c
+
+Patch 7.4.1689
+Problem: Ruby interface has inconsistent coding style.
+Solution: Fix the coding style. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 7.4.1690
+Problem: Can't compile with the conceal feature but without multibyte.
+Solution: Adjust #ifdef. (Owen Leibman)
+Files: src/eval.c, src/window.c
+
+Patch 7.4.1691
+Problem: When switching to a new buffer and an autocommand applies syntax
+ highlighting an ml_get error may occur.
+Solution: Check "syn_buf" against the buffer in the window. (Alexander von
+ Buddenbrock, closes #676)
+Files: src/syntax.c
+
+Patch 7.4.1692
+Problem: feedkeys('i', 'x') gets stuck, waits for a character to be typed.
+Solution: Behave like ":normal". (Yasuhiro Matsumoto)
+Files: src/eval.c, src/testdir/test_feedkeys.vim
+
+Patch 7.4.1693
+Problem: Building the Perl interface gives compiler warnings.
+Solution: Remove a pragma. Add noreturn attributes. (Damien)
+Files: src/if_perl.xs
+
+Patch 7.4.1694
+Problem: Win32 gvim doesn't work with "dvorakj" input method.
+Solution: Wait for QS_ALLINPUT instead of QS_ALLEVENTS. (Yukihiro Nakadaira)
+Files: src/gui_w32.c
+
+Patch 7.4.1695
+Problem: ":syn reset" clears the effect ":syn iskeyword". (James McCoy)
+Solution: Remove clearing the syntax keywords.
+Files: src/syntax.c
+
+Patch 7.4.1696
+Problem: When using :stopinsert in a silent mapping the "INSERT" message
+ isn't cleared. (Coacher)
+Solution: Always clear the message. (Christian Brabandt, closes #718)
+Files: src/ex_docmd.c, src/proto/screen.pro, src/screen.c
+
+Patch 7.4.1697
+Problem: Display problems when the 'ambiwidth' and 'emoji' options are not
+ set properly or the terminal doesn't behave as expected.
+Solution: After drawing an ambiguous width character always position the
+ cursor.
+Files: src/mbyte.c, src/screen.c, src/proto/mbyte.pro
+
+Patch 7.4.1698
+Problem: Two tests fail when running tests with MinGW. (Michael Soyka)
+Solution: Convert test_getcwd.ok test_wordcount.ok to unix fileformat.
+Files: src/testdir/Make_ming.mak
+
+Patch 7.4.1699
+Problem: :packadd does not work the same when used early or late.
+Solution: Always load plugins matching "plugin/**/*.vim".
+Files: src/ex_cmds2.c, src/testdir/test_packadd.vim
+
+Patch 7.4.1700
+Problem: Equivalence classes are not properly tested.
+Solution: Add tests for multibyte and latin1. Fix an error. (Owen Leibman)
+Files: src/regexp.c, src/testdir/Make_all.mak,
+ src/testdir/test_alot_latin.vim, src/testdir/test_alot_utf8.vim,
+ src/testdir/test_regexp_latin.vim,
+ src/testdir/test_regexp_utf8.vim
+
+Patch 7.4.1701
+Problem: Equivalence classes still tested in old style tests.
+Solution: Remove the duplicate.
+Files: src/testdir/test44.in, src/testdir/test44.ok,
+ src/testdir/test99.in, src/testdir/test99.ok
+
+Patch 7.4.1702
+Problem: Using freed memory when parsing 'printoptions' fails.
+Solution: Save the old options and restore them in case of an error.
+ (Dominique)
+Files: src/hardcopy.c, src/testdir/test_hardcopy.vim
+
+Patch 7.4.1703
+Problem: Can't assert for not equal and not matching.
+Solution: Add assert_notmatch() and assert_notequal().
+Files: src/eval.c, runtime/doc/eval.txt, src/testdir/test_assert.vim
+
+Patch 7.4.1704
+Problem: Using freed memory with "wincmd p". (Dominique Pelle)
+Solution: Also clear "prevwin" in other tab pages.
+Files: src/window.c
+
+Patch 7.4.1705
+Problem: The 'guifont' option does not allow for a quality setting.
+Solution: Add the "q" item, supported on MS-Windows. (Yasuhiro Matsumoto)
+Files: runtime/doc/options.txt, src/gui_w32.c, src/os_mswin.c,
+ src/proto/os_mswin.pro
+
+Patch 7.4.1706
+Problem: Old style function declaration breaks build.
+Solution: Remove __ARGS().
+Files: src/proto/os_mswin.pro
+
+Patch 7.4.1707
+Problem: Cannot use empty dictionary key, even though it can be useful.
+Solution: Allow using an empty dictionary key.
+Files: src/hashtab.c, src/eval.c, src/testdir/test_expr.vim
+
+Patch 7.4.1708
+Problem: New regexp engine does not work properly with EBCDIC.
+Solution: Define equivalence class characters. (Owen Leibman)
+Files: src/regexp_nfa.c
+
+Patch 7.4.1709
+Problem: Mistake in #ifdef.
+Solution: Change PROOF_QUALITY to DRAFT_QUALITY. (Ken Takata)
+Files: src/os_mswin.c
+
+Patch 7.4.1710
+Problem: Not all output of an external command is read.
+Solution: Avoid timing out when the process has exited. (closes #681)
+Files: src/os_unix.c
+
+Patch 7.4.1711
+Problem: When using try/catch in 'statusline' it is still considered an
+ error and the status line will be disabled.
+Solution: Check did_emsg instead of called_emsg. (haya14busa, closes #729)
+Files: src/screen.c, src/testdir/test_statusline.vim,
+ src/testdir/test_alot.vim
+
+Patch 7.4.1712
+Problem: For plugins in packages, plugin authors need to take care of all
+ dependencies.
+Solution: When loading "start" packages and for :packloadall, first add all
+ directories to 'runtimepath' before sourcing plugins.
+Files: src/ex_cmds2.c, src/testdir/test_packadd.vim
+
+Patch 7.4.1713
+Problem: GTK GUI doesn't work on Wayland.
+Solution: Specify that only the X11 backend is allowed. (Simon McVittie)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.1714
+Problem: Non-GUI specific settings in the gvimrc_example file.
+Solution: Move some settings to the vimrc_example file. Remove setting
+ 'hlsearch' again. (suggested by Hirohito Higashi)
+Files: runtime/vimrc_example.vim, runtime/gvimrc_example.vim
+
+Patch 7.4.1715
+Problem: Double free when a partial is in a cycle with a list or dict.
+ (Nikolai Pavlov)
+Solution: Do not free a nested list or dict used by the partial.
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1716
+Problem: 'autochdir' doesn't work for the first file. (Rob Hoelz)
+Solution: Call DO_AUTOCHDIR after startup. (Christian Brabandt, closes #704)
+Files: src/main.c
+
+Patch 7.4.1717
+Problem: Leaking memory when opening a channel fails.
+Solution: Unreference partials in job options.
+Files: src/eval.c, src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1718
+Problem: Coverity: not using return value of set_ref_in_item().
+Solution: Use the return value.
+Files: src/eval.c
+
+Patch 7.4.1719
+Problem: Leaking memory when there is a cycle involving a job and a
+ partial.
+Solution: Add a copyID to job and channel. Set references in items referred
+ by them. Go through all jobs and channels to find unreferenced
+ items. Also, decrement reference counts when garbage collecting.
+Files: src/eval.c, src/channel.c, src/netbeans.c, src/globals.h,
+ src/ops.c, src/regexp.c, src/tag.c, src/proto/channel.pro,
+ src/proto/eval.pro, src/testdir/test_partial.vim, src/structs.h
+
+Patch 7.4.1720
+Problem: Tests fail without the job feature.
+Solution: Skip tests when the job feature is not present.
+Files: src/testdir/test_partial.vim
+
+Patch 7.4.1721
+Problem: The vimtbar files are unused.
+Solution: Remove them. (Ken Takata)
+Files: src/vimtbar.dll, src/vimtbar.h, src/vimtbar.lib, Filelist
+
+Patch 7.4.1722
+Problem: Crash when calling garbagecollect() after starting a job.
+Solution: Set the copyID on job and channel. (Hirohito Higashi, Ozaki
+ Kiichi)
+Files: src/eval.c
+
+Patch 7.4.1723
+Problem: When using try/catch in 'tabline' it is still considered an
+ error and the tabline will be disabled.
+Solution: Check did_emsg instead of called_emsg. (haya14busa, closes #746)
+Files: src/screen.c, src/testdir/test_tabline.vim,
+ src/testdir/test_alot.vim
+
+Patch 7.4.1724 (after 7.4.1723)
+Problem: Tabline test fails in GUI.
+Solution: Remove 'e' from 'guioptions'.
+Files: src/testdir/test_tabline.vim
+
+Patch 7.4.1725
+Problem: Compiler errors for non-ANSI compilers.
+Solution: Remove // comment. Remove comma at end of enum. (Michael Jarvis)
+Files: src/eval.c
+
+Patch 7.4.1726
+Problem: ANSI compiler complains about string length.
+Solution: Split long string in two parts. (Michael Jarvis)
+Files: src/ex_cmds.c
+
+Patch 7.4.1727
+Problem: Cannot detect a crash in tests when caused by garbagecollect().
+Solution: Add garbagecollect_for_testing(). Do not free a job if is still
+ useful.
+Files: src/channel.c, src/eval.c, src/getchar.c, src/main.c, src/vim.h,
+ src/proto/eval.pro, src/testdir/runtest.vim,
+ src/testdir/test_channel.vim, runtime/doc/eval.txt
+
+Patch 7.4.1728
+Problem: The help for functions require a space after the "(".
+Solution: Make CTRL-] on a function name ignore the arguments. (Hirohito
+ Higashi)
+Files: src/ex_cmds.c, src/testdir/test_help_tagjump.vim,
+ runtime/doc/eval.txt
+
+Patch 7.4.1729
+Problem: The Perl interface cannot use 'print' operator for writing
+ directly in standard IO.
+Solution: Add a minimal implementation of PerlIO Layer feature and try to
+ use it for STDOUT/STDERR. (Damien)
+Files: src/if_perl.xs, src/testdir/test_perl.vim
+
+Patch 7.4.1730
+Problem: It is not easy to get a character out of a string.
+Solution: Add strgetchar() and strcharpart().
+Files: src/eval.c, src/testdir/test_expr.vim
+
+Patch 7.4.1731
+Problem: Python: turns partial into simple funcref.
+Solution: Use partials like partials. (Nikolai Pavlov, closes #734)
+Files: runtime/doc/if_pyth.txt, src/eval.c, src/if_py_both.h,
+ src/if_python.c, src/if_python3.c, src/proto/eval.pro,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.4.1732
+Problem: Folds may close when using autocomplete. (Anmol Sethi)
+Solution: Increment/decrement disable_fold. (Christian Brabandt, closes
+ #643)
+Files: src/edit.c, src/fold.c, src/globals.h
+
+Patch 7.4.1733
+Problem: "make install" doesn't know about cross-compiling. (Christian
+ Neukirchen)
+Solution: Add CROSS_COMPILING. (closes #740)
+Files: src/configure.in, src/auto/configure, src/config.mk.in,
+ src/Makefile
+
+Patch 7.4.1734 (after 7.4.1730)
+Problem: Test fails when not using utf-8.
+Solution: Split test in regular and utf-8 part.
+Files: src/testdir/test_expr.vim, src/testdir/test_expr_utf8.vim,
+ src/testdir/test_alot_utf8.vim
+
+Patch 7.4.1735
+Problem: It is not possible to only see part of the message history. It is
+ not possible to clear messages.
+Solution: Add a count to ":messages" and a clear argument. (Yasuhiro
+ Matsumoto)
+Files: runtime/doc/message.txt, src/ex_cmds.h, src/message.c,
+ src/testdir/test_messages.vim, src/testdir/test_alot.vim
+
+Patch 7.4.1736 (after 7.4.1731)
+Problem: Unused variable.
+Solution: Remove it. (Yasuhiro Matsumoto)
+Files: src/if_py_both.h
+
+Patch 7.4.1737
+Problem: Argument marked as unused is used.
+Solution: Remove UNUSED.
+Files: src/message.c
+
+Patch 7.4.1738
+Problem: Count for ":messages" depends on number of lines.
+Solution: Add ADDR_OTHER address type.
+Files: src/ex_cmds.h
+
+Patch 7.4.1739
+Problem: Messages test fails on MS-Windows.
+Solution: Adjust the asserts. Skip the "messages maintainer" line if not
+ showing all messages.
+Files: src/message.c, src/testdir/test_messages.vim
+
+Patch 7.4.1740
+Problem: syn-cchar defined with matchadd() does not appear if there are no
+ other syntax definitions which matches buffer text.
+Solution: Check for startcol. (Ozaki Kiichi, haya14busa, closes #757)
+Files: src/screen.c, src/testdir/Make_all.mak,
+ src/testdir/test_alot_utf8.vim, src/testdir/test_match_conceal.in,
+ src/testdir/test_match_conceal.ok,
+ src/testdir/test_matchadd_conceal.vim,
+ src/testdir/test_matchadd_conceal_utf8.vim,
+ src/testdir/test_undolevels.vim
+
+Patch 7.4.1741
+Problem: Not testing utf-8 characters.
+Solution: Move the right asserts to the test_expr_utf8 test.
+Files: src/testdir/test_expr.vim, src/testdir/test_expr_utf8.vim
+
+Patch 7.4.1742
+Problem: strgetchar() does not work correctly.
+Solution: use mb_cptr2len(). Add a test. (Naruhiko Nishino)
+Files: src/eval.c, src/testdir/test_expr_utf8.vim
+
+Patch 7.4.1743
+Problem: Clang warns for uninitialized variable. (Michael Jarvis)
+Solution: Initialize it.
+Files: src/if_py_both.h
+
+Patch 7.4.1744
+Problem: Python: Converting a sequence may leak memory.
+Solution: Decrement a reference. (Nikolai Pavlov)
+Files: src/if_py_both.h
+
+Patch 7.4.1745
+Problem: README file is not clear about where to get Vim.
+Solution: Add links to github, releases and the Windows installer.
+ (Suggested by Christian Brabandt)
+Files: README.md, README.txt
+
+Patch 7.4.1746
+Problem: Memory leak in Perl.
+Solution: Decrement the reference count. Add a test. (Damien)
+Files: src/if_perl.xs, src/testdir/test_perl.vim
+
+Patch 7.4.1747
+Problem: Coverity: missing check for NULL pointer.
+Solution: Check for out of memory.
+Files: src/if_py_both.h
+
+Patch 7.4.1748
+Problem: "gD" does not find match in first column of first line. (Gary
+ Johnson)
+Solution: Accept match at the cursor.
+Files: src/normal.c, src/testdir/test_goto.vim, src/testdir/test_alot.vim
+
+Patch 7.4.1749
+Problem: When using GTK 3.20 there are a few warnings.
+Solution: Use new functions when available. (Kazunobu Kuriyama)
+Files: src/gui_beval.c src/gui_gtk_x11.c
+
+Patch 7.4.1750
+Problem: When a buffer gets updated while in command line mode, the screen
+ may be messed up.
+Solution: Postpone the redraw when the screen is scrolled.
+Files: src/channel.c
+
+Patch 7.4.1751
+Problem: Crash when 'tagstack' is off. (Dominique Pelle)
+Solution: Fix it. (Hirohito Higashi)
+Files: src/tag.c, src/testdir/test_alot.vim, src/testdir/test_tagjump.vim
+
+Patch 7.4.1752
+Problem: When adding to the quickfix list the current position is reset.
+Solution: Do not reset the position when not needed. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1753
+Problem: "noinsert" in 'completeopt' is sometimes ignored.
+Solution: Set the variables when the 'completeopt' was set. (Ozaki Kiichi)
+Files: src/edit.c, src/option.c, src/proto/edit.pro
+
+Patch 7.4.1754
+Problem: When 'filetype' was set and reloading a buffer which does not
+ cause it to be set, the syntax isn't loaded. (KillTheMule)
+Solution: Remember whether the FileType event was fired and fire it if not.
+ (Anton Lindqvist, closes #747)
+Files: src/fileio.c, src/testdir/test_syntax.vim
+
+Patch 7.4.1755
+Problem: When using getreg() on a non-existing register a NULL list is
+ returned. (Bjorn Linse)
+Solution: Allocate an empty list. Add a test.
+Files: src/eval.c, src/testdir/test_expr.vim
+
+Patch 7.4.1756
+Problem: "dll" options are not expanded.
+Solution: Expand environment variables. (Ozaki Kiichi)
+Files: src/option.c, src/testdir/test_alot.vim,
+ src/testdir/test_expand_dllpath.vim
+
+Patch 7.4.1757
+Problem: When using complete() it may set 'modified' even though nothing
+ was inserted.
+Solution: Use Down/Up instead of Next/Previous match. (Shougo Matsu, closes
+ #745)
+Files: src/edit.c
+
+Patch 7.4.1758
+Problem: Triggering CursorHoldI when in CTRL-X mode causes problems.
+Solution: Do not trigger CursorHoldI in CTRL-X mode. Add "!" flag to
+ feedkeys() (test with that didn't work though).
+Files: src/edit.c, src/eval.c
+
+Patch 7.4.1759
+Problem: When using feedkeys() in a timer the inserted characters are not
+ used right away.
+Solution: Break the wait loop when characters have been added to typebuf.
+ use this for testing CursorHoldI.
+Files: src/gui.c, src/os_win32.c, src/os_unix.c,
+ src/testdir/test_autocmd.vim
+
+Patch 7.4.1760 (after 7.4.1759)
+Problem: Compiler warning for unused variable.
+Solution: Add #ifdef. (John Marriott)
+Files: src/os_win32.c
+
+Patch 7.4.1761
+Problem: Coverity complains about ignoring return value.
+Solution: Add "(void)" to get rid of the warning.
+Files: src/eval.c
+
+Patch 7.4.1762
+Problem: Coverity: useless assignments.
+Solution: Remove them.
+Files: src/search.c
+
+Patch 7.4.1763
+Problem: Coverity: useless assignment.
+Solution: Add #if 0.
+Files: src/spell.c
+
+Patch 7.4.1764
+Problem: C++ style comment. (Ken Takata)
+Solution: Finish the work started here: don't call perror() when stderr
+ isn't working.
+Files: src/os_unix.c
+
+Patch 7.4.1765
+Problem: Undo options are not together in the options window.
+Solution: Put them together. (Gary Johnson)
+Files: runtime/optwin.vim
+
+Patch 7.4.1766
+Problem: Building instructions for MS-Windows are outdated.
+Solution: Mention setting SDK_INCLUDE_DIR. (Ben Franklin, closes #771) Move
+ outdated instructions further down.
+Files: src/INSTALLpc.txt
+
+Patch 7.4.1767
+Problem: When installing Vim on a GTK system the icon cache is not updated.
+Solution: Update the GTK icon cache when possible. (Kazunobu Kuriyama)
+Files: src/Makefile, src/configure.in, src/config.mk.in,
+ src/auto/configure
+
+Patch 7.4.1768
+Problem: Arguments of setqflist() are not checked properly.
+Solution: Add better checks, add a test. (Nikolai Pavlov, Hirohito Higashi,
+ closes #661)
+Files: src/eval.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1769
+Problem: No "closed", "errors" and "encoding" attribute on Python output.
+Solution: Add attributes and more tests. (Roland Puntaier, closes #622)
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.4.1770
+Problem: Cannot use true color in the terminal.
+Solution: Add the 'guicolors' option. (Nikolai Pavlov)
+Files: runtime/doc/options.txt, runtime/doc/term.txt,
+ runtime/doc/various.txt, src/auto/configure, src/config.h.in,
+ src/configure.in, src/eval.c, src/globals.h, src/hardcopy.c,
+ src/option.c, src/option.h, src/proto/term.pro, src/screen.c,
+ src/structs.h, src/syntax.c, src/term.c, src/term.h,
+ src/version.c, src/vim.h
+
+Patch 7.4.1771 (after 7.4.1768)
+Problem: Warning for unused variable.
+Solution: Add #ifdef. (John Marriott)
+Files: src/eval.c
+
+Patch 7.4.1772 (after 7.4.1767)
+Problem: Installation fails when $GTK_UPDATE_ICON_CACHE is empty.
+Solution: Add quotes. (Kazunobu Kuriyama)
+Files: src/Makefile
+
+Patch 7.4.1773 (after 7.4.1770)
+Problem: Compiler warnings. (Dominique Pelle)
+Solution: Add UNUSED. Add type cast. Avoid a buffer overflow.
+Files: src/syntax.c, src/term.c
+
+Patch 7.4.1774 (after 7.4.1770)
+Problem: Cterm true color feature has warnings.
+Solution: Add type casts.
+Files: src/screen.c, src/syntax.c, src/term.c
+
+Patch 7.4.1775
+Problem: The rgb.txt file is not installed.
+Solution: Install the file. (Christian Brabandt)
+Files: src/Makefile
+
+Patch 7.4.1776
+Problem: Using wrong buffer length.
+Solution: use the right name. (Kazunobu Kuriyama)
+Files: src/term.c
+
+Patch 7.4.1777
+Problem: Newly added features can escape the sandbox.
+Solution: Add checks for restricted and secure. (Yasuhiro Matsumoto)
+Files: src/eval.c
+
+Patch 7.4.1778
+Problem: When using the term truecolor feature, the t_8f and t_8b termcap
+ options are not set by default.
+Solution: Move the values to before BT_EXTRA_KEYS. (Christian Brabandt)
+Files: src/term.c
+
+Patch 7.4.1779
+Problem: Using negative index in strcharpart(). (Yegappan Lakshmanan)
+Solution: Assume single byte when using a negative index.
+Files: src/eval.c
+
+Patch 7.4.1780
+Problem: Warnings reported by cppcheck.
+Solution: Fix the warnings. (Dominique Pelle)
+Files: src/ex_cmds2.c, src/json.c, src/misc1.c, src/ops.c,
+ src/regexp_nfa.c
+
+Patch 7.4.1781
+Problem: synIDattr() does not respect 'guicolors'.
+Solution: Change the condition for the mode. (Christian Brabandt)
+Files: src/eval.c
+
+Patch 7.4.1782
+Problem: strcharpart() does not work properly with some multibyte
+ characters.
+Solution: Use mb_cptr2len() instead of mb_char2len(). (Hirohito Higashi)
+Files: src/eval.c, src/testdir/test_expr_utf8.vim
+
+Patch 7.4.1783
+Problem: The old regexp engine doesn't handle character classes correctly.
+ (Manuel Ortega)
+Solution: Use regmbc() instead of regc(). Add a test.
+Files: src/regexp.c, src/testdir/test_regexp_utf8.vim
+
+Patch 7.4.1784
+Problem: The termtruecolor feature is enabled differently from many other
+ features.
+Solution: Enable the termtruecolor feature for the big build, not through
+ configure.
+Files: src/configure.in, src/config.h.in, src/auto/configure,
+ src/feature.h
+
+Patch 7.4.1785 (after 7.4.1783)
+Problem: Regexp test fails on windows.
+Solution: set 'isprint' to the right value for testing.
+Files: src/testdir/test_regexp_utf8.vim
+
+Patch 7.4.1786
+Problem: Compiled-in colors do not match rgb.txt.
+Solution: Use the rgb.txt colors. (Kazunobu Kuriyama)
+Files: src/term.c
+
+Patch 7.4.1787
+Problem: When a job ends the close callback is invoked before other
+ callbacks. On Windows the close callback is not called.
+Solution: First invoke out/err callbacks before the close callback.
+ Make the close callback work on Windows.
+Files: src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, src/testdir/test_channel_pipe.py
+
+Patch 7.4.1788
+Problem: NSIS script is missing packages.
+Solution: Add the missing directories. (Ken Takata)
+Files: nsis/gvim.nsi
+
+Patch 7.4.1789
+Problem: Cannot use ch_read() in the close callback.
+Solution: Do not discard the channel if there is readahead. Do not discard
+ readahead if there is a close callback.
+Files: src/eval.c, src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim
+
+Patch 7.4.1790
+Problem: Leading white space in a job command matters. (Andrew Stewart)
+Solution: Skip leading white space.
+Files: src/os_unix.c
+
+Patch 7.4.1791
+Problem: Channel could be garbage collected too early.
+Solution: Don't free a channel or remove it from a job when it is still
+ useful.
+Files: src/channel.c
+
+Patch 7.4.1792
+Problem: Color name decoding is implemented several times.
+Solution: Move it to term.c. (Christian Brabandt)
+Files: src/gui_mac.c, src/gui_photon.c, src/gui_w32.c,
+ src/proto/term.pro, src/term.c
+
+Patch 7.4.1793
+Problem: Some character classes may differ between systems. On OS/X the
+ regexp test fails.
+Solution: Make this less dependent on the system. (idea by Kazunobu Kuriyama)
+Files: src/regexp.c, src/regexp_nfa.c
+
+Patch 7.4.1794 (after 7.4.1792)
+Problem: Can't build on MS-Windows.
+Solution: Add missing declaration.
+Files: src/gui_w32.c
+
+Patch 7.4.1795
+Problem: Compiler warning for redefining RGB. (John Marriott)
+Solution: Rename it to TORGB.
+Files: src/term.c
+
+Patch 7.4.1796 (after 7.4.1795)
+Problem: Colors are wrong on MS-Windows. (Christian Robinson)
+Solution: Use existing RGB macro if it exists. (Ken Takata)
+Files: src/term.c
+
+Patch 7.4.1797
+Problem: Warning from Windows 64 bit compiler.
+Solution: Change int to size_t. (Mike Williams)
+Files: src/term.c
+
+Patch 7.4.1798
+Problem: Still compiler warning for unused return value. (Charles Campbell)
+Solution: Assign to ignoredp.
+Files: src/term.c
+
+Patch 7.4.1799
+Problem: 'guicolors' is a confusing option name.
+Solution: Use 'termguicolors' instead. (Hirohito Higashi, Ken Takata)
+Files: runtime/doc/options.txt, runtime/doc/term.txt,
+ runtime/doc/various.txt, runtime/syntax/dircolors.vim, src/eval.c,
+ src/feature.h, src/globals.h, src/hardcopy.c, src/option.c,
+ src/option.h, src/proto/term.pro, src/screen.c, src/structs.h,
+ src/syntax.c, src/term.c, src/version.c, src/vim.h
+
+Patch 7.4.1800 (after 7.4.1799)
+Problem: Unnecessary #ifdef.
+Solution: Just use USE_24BIT. (Ken Takata)
+Files: src/syntax.c
+
+Patch 7.4.1801
+Problem: Make uninstall leaves file behind.
+Solution: Delete rgb.txt. (Kazunobu Kuriyama)
+Files: src/Makefile
+
+Patch 7.4.1802
+Problem: Quickfix doesn't handle long lines well, they are split.
+Solution: Drop characters after a limit. (Anton Lindqvist)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim,
+ src/testdir/samples/quickfix.txt
+
+Patch 7.4.1803
+Problem: GTK3 doesn't handle menu separators properly.
+Solution: Use gtk_separator_menu_item_new(). (Kazunobu Kuriyama)
+Files: src/gui_gtk.c
+
+Patch 7.4.1804
+Problem: Can't use Vim as MANPAGER.
+Solution: Add manpager.vim. (Enno Nagel, closes #491)
+Files: runtime/doc/filetype.txt, runtime/plugin/manpager.vim
+
+Patch 7.4.1805
+Problem: Running tests in shadow dir fails.
+Solution: Link the samples directory
+Files: src/Makefile
+
+Patch 7.4.1806
+Problem: 'termguicolors' option missing from the options window.
+Solution: Add the entry.
+Files: runtime/optwin.vim
+
+Patch 7.4.1807
+Problem: Test_out_close_cb sometimes fails.
+Solution: Always write DETACH to out, not err.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1808 (after 7.4.1806)
+Problem: Using wrong feature name to check for 'termguicolors'.
+Solution: Use the right feature name. (Ken Takata)
+Files: runtime/optwin.vim
+
+Patch 7.4.1809 (after 7.4.1808)
+Problem: Using wrong short option name for 'termguicolors'.
+Solution: Use the option name.
+Files: runtime/optwin.vim
+
+Patch 7.4.1810
+Problem: Sending DETACH after a channel was closed isn't useful.
+Solution: Only add DETACH for a netbeans channel.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1811
+Problem: Netbeans channel gets garbage collected.
+Solution: Set reference in nb_channel.
+Files: src/eval.c, src/netbeans.c, src/proto/netbeans.pro
+
+Patch 7.4.1812
+Problem: Failure on startup with Athena and Motif.
+Solution: Check for INVALCOLOR. (Kazunobu Kuriyama)
+Files: src/syntax.c, src/vim.h
+
+Patch 7.4.1813
+Problem: Memory access error when running test_quickfix.
+Solution: Allocate one more byte. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 7.4.1814
+Problem: A channel may be garbage collected while it's still being used by
+ a job. (James McCoy)
+Solution: Mark the channel as used if the job is still used. Do the same
+ for channels that are still used.
+Files: src/eval.c, src/channel.c, src/proto/channel.pro
+
+Patch 7.4.1815
+Problem: Compiler warnings for unused variables. (Ajit Thakkar)
+Solution: Add a dummy initialization. (Yasuhiro Matsumoto)
+Files: src/quickfix.c
+
+Patch 7.4.1816
+Problem: Looping over a null list throws an error.
+Solution: Skip over the for loop.
+Files: src/eval.c, src/testdir/test_expr.vim
+
+Patch 7.4.1817
+Problem: The screen is not updated if a callback is invoked when closing a
+ channel.
+Solution: Invoke redraw_after_callback().
+Files: src/channel.c
+
+Patch 7.4.1818
+Problem: Help completion adds @en to all matches except the first one.
+Solution: Remove "break", go over all items.
+Files: src/ex_getln.c
+
+Patch 7.4.1819
+Problem: Compiler warnings when sprintf() is a macro.
+Solution: Don't interrupt sprintf() with an #ifdef. (Michael Jarvis,
+ closes #788)
+Files: src/fileio.c, src/tag.c, src/term.c
+
+Patch 7.4.1820
+Problem: Removing language from help tags too often.
+Solution: Only remove @en when not needed. (Hirohito Higashi)
+Files: src/ex_getln.c, src/testdir/test_help_tagjump.vim
+
+Patch 7.4.1821 (after 7.4.1820)
+Problem: Test fails on MS-Windows.
+Solution: Sort the completion results.
+Files: src/testdir/test_help_tagjump.vim
+
+Patch 7.4.1822
+Problem: Redirecting stdout of a channel to "null" doesn't work. (Nicola)
+Solution: Correct the file descriptor number.
+Files: src/os_unix.c
+
+Patch 7.4.1823
+Problem: Warning from 64 bit compiler.
+Solution: Add type cast. (Mike Williams)
+Files: src/quickfix.c
+
+Patch 7.4.1824
+Problem: When a job is no longer referenced and does not have an exit
+ callback the process may hang around in defunct state. (Nicola)
+Solution: Call job_status() if the job is running and won't get freed
+ because it might still be useful.
+Files: src/channel.c
+
+Patch 7.4.1825
+Problem: When job writes to buffer nothing is written. (Nicola)
+Solution: Do not discard a channel before writing is done.
+Files: src/channel.c
+
+Patch 7.4.1826
+Problem: Callbacks are invoked when it's not safe. (Andrew Stewart)
+Solution: When a channel is to be closed don't invoke callbacks right away,
+ wait for a safe moment.
+Files: src/structs.h, src/channel.c
+
+Patch 7.4.1827
+Problem: No error when invoking a callback when it's not safe.
+Solution: Add an error message. Avoid the error when freeing a channel.
+Files: src/structs.h, src/channel.c
+
+Patch 7.4.1828
+Problem: May try to access buffer that's already freed.
+Solution: When freeing a buffer remove it from any channel.
+Files: src/buffer.c, src/channel.c, src/proto/channel.pro
+
+Patch 7.4.1829 (after 7.4.1828)
+Problem: No message on channel log when buffer was freed.
+Solution: Log a message.
+Files: src/channel.c
+
+Patch 7.4.1830
+Problem: non-antialiased misnamed.
+Solution: Use NONANTIALIASED and NONANTIALIASED_QUALITY. (Kim Brouer,
+ closes #793)
+Files: src/os_mswin.c, runtime/doc/options.txt
+
+Patch 7.4.1831
+Problem: When timer_stop() is called with a string there is no proper error
+ message.
+Solution: Require getting a number. (Bjorn Linse)
+Files: src/eval.c
+
+Patch 7.4.1832
+Problem: Memory leak in debug commands.
+Solution: Free memory before overwriting the pointer. (hint by Justin Keyes)
+Files: src/ex_cmds2.c
+
+Patch 7.4.1833
+Problem: Cannot use an Ex command for 'keywordprg'.
+Solution: Accept an Ex command. (Nelo-Thara Wallus)
+Files: src/normal.c, runtime/doc/options.txt
+
+Patch 7.4.1834
+Problem: Possible crash when conceal is active.
+Solution: Check for the screen to be valid when redrawing a line.
+Files: src/screen.c
+
+Patch 7.4.1835
+Problem: When splitting and closing a window the status height changes.
+Solution: Compute the frame height correctly. (Hirohito Higashi)
+Files: src/window.c, src/testdir/test_alot.vim,
+ src/testdir/test_window_cmd.vim
+
+Patch 7.4.1836
+Problem: When using a partial on a dictionary it always gets bound to that
+ dictionary.
+Solution: Make a difference between binding a function to a dictionary
+ explicitly or automatically.
+Files: src/structs.h, src/eval.c, src/testdir/test_partial.vim,
+ runtime/doc/eval.txt
+
+Patch 7.4.1837
+Problem: The BufUnload event is triggered twice, when :bunload is used with
+ `bufhidden` set to `unload` or `delete`.
+Solution: Do not trigger the event when ml_mfp is NULL. (Hirohito Higashi)
+Files: src/buffer.c, src/testdir/test_autocmd.vim
+
+Patch 7.4.1838
+Problem: Functions specifically for testing do not sort together.
+Solution: Rename garbagecollect_for_testing() to test_garbagecollect_now().
+ Add test_null_list(), test_null_dict(), etc.
+Files: src/eval.c, src/testdir/test_expr.vim,
+ src/testdir/test_channel.vim, runtime/doc/eval.txt
+
+Patch 7.4.1839
+Problem: Cannot get the items stored in a partial.
+Solution: Support using get() on a partial.
+Files: src/eval.c, src/testdir/test_partial.vim, runtime/doc/eval.txt
+
+Patch 7.4.1840
+Problem: When using packages an "after" directory cannot be used.
+Solution: Add the "after" directory of the package to 'runtimepath' if it
+ exists.
+Files: src/ex_cmds2.c, src/testdir/test_packadd.vim
+
+Patch 7.4.1841
+Problem: The code to reallocate the buffer used for quickfix is repeated.
+Solution: Move the code to a function. (Yegappan Lakshmanan, closes #831)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1842 (after 7.4.1839)
+Problem: get() works for Partial but not for Funcref.
+Solution: Accept Funcref. Also return the function itself. (Nikolai Pavlov)
+Files: src/eval.c, src/testdir/test_partial.vim, runtime/doc/eval.txt
+
+Patch 7.4.1843
+Problem: Tests involving Python are flaky.
+Solution: Set the pt_auto field. Add tests. (Nikolai Pavlov)
+Files: runtime/doc/if_pyth.txt, src/if_py_both.h, src/testdir/test86.in,
+ src/testdir/test86.ok, src/testdir/test87.in,
+ src/testdir/test87.ok
+
+Patch 7.4.1844
+Problem: Using old function name in comment. More functions should start
+ with test_.
+Solution: Rename function in comment. (Hirohito Higashi) Rename
+ disable_char_avail_for_testing() to test_disable_char_avail().
+ And alloc_fail() to test_alloc_fail().
+Files: src/eval.c, src/getchar.c, src/testdir/runtest.vim,
+ src/testdir/test_cursor_func.vim, src/testdir/test_quickfix.vim,
+ runtime/doc/eval.txt
+
+Patch 7.4.1845
+Problem: Mentioning NetBeans when reading from channel. (Ramel Eshed)
+Solution: Make the text more generic.
+Files: src/channel.c
+
+Patch 7.4.1846
+Problem: Ubsan detects a multiplication overflow.
+Solution: Don't use orig_mouse_time when it's zero. (Dominique Pelle)
+Files: src/term.c
+
+Patch 7.4.1847
+Problem: Getting an item from a NULL dict crashes. Setting a register to a
+ NULL list crashes. (Nikolai Pavlov, issue #768) Comparing a NULL
+ dict with a NULL dict fails.
+Solution: Properly check for NULL.
+Files: src/eval.c, src/testdir/test_expr.vim
+
+Patch 7.4.1848
+Problem: Can't build with Strawberry Perl 5.24.
+Solution: Define S_SvREFCNT_dec() if needed. (Damien, Ken Takata)
+Files: src/if_perl.xs
+
+Patch 7.4.1849
+Problem: Still trying to read from channel that is going to be closed.
+ (Ramel Eshed)
+Solution: Check if ch_to_be_closed is set.
+Files: src/channel.c
+
+Patch 7.4.1850
+Problem: GUI freezes when using a job. (Shougo Matsu)
+Solution: Unregister the channel when there is an input error.
+Files: src/channel.c
+
+Patch 7.4.1851
+Problem: test_syn_attr fails when using the GUI. (Dominique Pelle)
+Solution: Escape the font name properly.
+Files: src/testdir/test_syn_attr.vim
+
+Patch 7.4.1852
+Problem: Unix: Cannot run all tests with the GUI.
+Solution: Add the "testgui" target.
+Files: src/Makefile, src/testdir/Makefile
+
+Patch 7.4.1853
+Problem: Crash when job and channel are in the same dict while using
+ partials. (Luc Hermitte)
+Solution: Do not decrement the channel reference count too early.
+Files: src/channel.c
+
+Patch 7.4.1854
+Problem: When setting 'termguicolors' the Ignore highlighting doesn't work.
+ (Charles Campbell)
+Solution: Handle the color names "fg" and "bg" when the GUI isn't running
+ and no colors are specified, fall back to black and white.
+Files: src/syntax.c
+
+Patch 7.4.1855
+Problem: Valgrind reports memory leak for job that is not freed.
+Solution: Free all jobs on exit. Add test for failing job.
+Files: src/channel.c, src/misc2.c, src/proto/channel.pro,
+ src/testdir/test_partial.vim
+
+Patch 7.4.1856 (after 7.4.1855)
+Problem: failing job test fails on MS-Windows.
+Solution: Expect "fail" status instead of "dead".
+Files: src/testdir/test_partial.vim
+
+Patch 7.4.1857
+Problem: When a channel appends to a buffer that is 'nomodifiable' there is
+ an error but appending is done anyway.
+Solution: Add the 'modifiable' option. Refuse to write to a 'nomodifiable'
+ when the value is 1.
+Files: src/structs.h, src/channel.c, src/testdir/test_channel.vim,
+ runtime/doc/channel.txt
+
+Patch 7.4.1858
+Problem: When a channel writes to a buffer it doesn't find a buffer by the
+ short name but re-uses it anyway.
+Solution: Find buffer also by the short name.
+Files: src/channel.c, src/buffer.c, src/vim.h
+
+Patch 7.4.1859
+Problem: Cannot use a function reference for "exit_cb".
+Solution: Use get_callback(). (Yegappan Lakshmanan)
+Files: src/channel.c, src/structs.h
+
+Patch 7.4.1860
+Problem: Using a partial for timer_start() may cause a crash.
+Solution: Set the copyID in timer objects. (Ozaki Kiichi)
+Files: src/testdir/test_timers.vim, src/eval.c, src/ex_cmds2.c,
+ src/proto/ex_cmds2.pro
+
+Patch 7.4.1861
+Problem: Compiler warnings with 64 bit compiler.
+Solution: Change int to size_t. (Mike Williams)
+Files: src/ex_cmds2.c
+
+Patch 7.4.1862
+Problem: string() with repeated argument does not give a result usable by
+ eval().
+Solution: Refactor echo_string and tv2string(), moving the common part to
+ echo_string_core(). (Ken Takata)
+Files: src/eval.c, src/testdir/test_viml.vim, src/testdir/test86.ok,
+ src/testdir/test87.ok
+
+Patch 7.4.1863
+Problem: Compiler warnings on Win64.
+Solution: Adjust types, add type casts. (Ken Takata)
+Files: src/if_mzsch.c, src/if_perl.xs, src/if_ruby.c, src/version.c
+
+Patch 7.4.1864
+Problem: Python: encoding error with Python 2.
+Solution: Use "getcwdu" instead of "getcwd". (Ken Takata)
+Files: src/if_py_both.h
+
+Patch 7.4.1865
+Problem: Memory leaks in test49. (Dominique Pelle)
+Solution: Use NULL instead of an empty string.
+Files: src/eval.c
+
+Patch 7.4.1866
+Problem: Invalid memory access when exiting with EXITFREE defined.
+ (Dominique Pelle)
+Solution: Set "really_exiting" and skip error messages.
+Files: src/misc2.c, src/eval.c
+
+Patch 7.4.1867
+Problem: Memory leak in test_matchstrpos.
+Solution: Free the string before overwriting. (Yegappan Lakshmanan)
+Files: src/eval.c
+
+Patch 7.4.1868
+Problem: Setting really_exiting causes memory leaks to be reported.
+Solution: Add the in_free_all_mem flag.
+Files: src/globals.h, src/misc2.c, src/eval.c
+
+Patch 7.4.1869
+Problem: Can't build with old version of Perl.
+Solution: Define PERLIO_FUNCS_DECL. (Tom G. Christensen)
+Files: src/if_perl.xs
+
+Patch 7.4.1870 (after 7.4.1863)
+Problem: One more Win64 compiler warning.
+Solution: Change declared argument type. (Ken Takata)
+Files: src/if_mzsch.c
+
+Patch 7.4.1871
+Problem: Appending to the quickfix list while the quickfix window is open
+ is very slow.
+Solution: Do not delete all the lines, only append the new ones. Avoid
+ using a window while updating the list. (closes #841)
+Files: src/quickfix.c
+
+Patch 7.4.1872
+Problem: Still build problem with old version of Perl.
+Solution: Also define SvREFCNT_inc_void_NN if needed. (Tom G. Christensen)
+Files: src/if_perl.xs
+
+Patch 7.4.1873
+Problem: When a callback adds a timer the GUI doesn't use it until later.
+ (Ramel Eshed)
+Solution: Return early if a callback adds a timer.
+Files: src/ex_cmds2.c, src/gui_gtk_x11.c, src/gui_w32.c, src/gui_x11.c,
+ src/globals.h
+
+Patch 7.4.1874
+Problem: Unused variable in Win32 code.
+Solution: Remove it. (Mike Williams)
+Files: src/gui_w32.c
+
+Patch 7.4.1875
+Problem: Comparing functions and partials doesn't work well.
+Solution: Add tests. (Nikolai Pavlov) Compare the dict and arguments in the
+ partial. (closes #813)
+Files: src/eval.c, src/testdir/test_partial.vim
+
+Patch 7.4.1876
+Problem: Typing "k" at the hit-enter prompt has no effect.
+Solution: Don't assume recursive use of the prompt if a character was typed.
+ (Hirohito Higashi)
+Files: src/message.c
+
+Patch 7.4.1877
+Problem: No test for invoking "close_cb" when writing to a buffer.
+Solution: Add using close_cb to a test case.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1878
+Problem: Whether a job has exited isn't detected until a character is
+ typed. After calling exit_cb the cursor is in the wrong place.
+Solution: Don't wait forever for a character to be typed when there is a
+ pending job. Update the screen if needed after calling exit_cb.
+Files: src/os_unix.c, src/channel.c, src/proto/channel.pro
+
+Patch 7.4.1879 (after 7.4.1877)
+Problem: Channel test is flaky.
+Solution: Wait for close_cb to be invoked.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1880
+Problem: MS-Windows console build defaults to not having +channel.
+Solution: Include the channel feature if building with huge features.
+Files: src/Make_mvc.mak
+
+Patch 7.4.1881
+Problem: Appending to a long quickfix list is slow.
+Solution: Add qf_last.
+Files: src/quickfix.c
+
+Patch 7.4.1882
+Problem: Check for line break at end of line wrong. (Dominique Pelle)
+Solution: Correct the logic.
+Files: src/quickfix.c
+
+Patch 7.4.1883
+Problem: Cppcheck found 2 incorrect printf formats.
+Solution: Use %ld and %lx. (Dominique Pelle)
+Files: src/VisVim/Commands.cpp, src/gui_mac.c
+
+Patch 7.4.1884
+Problem: Updating marks in a quickfix list is very slow when the list is
+ long.
+Solution: Only update marks if the buffer has a quickfix entry.
+Files: src/structs.h, src/quickfix.c
+
+Patch 7.4.1885
+Problem: MinGW console build defaults to not having +channel.
+Solution: Include the channel feature if building with huge features. (Ken
+ Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.1886
+Problem: When waiting for a character is interrupted by receiving channel
+ data and the first character of a mapping was typed, the mapping
+ times out. (Ramel Eshed)
+Solution: When dealing with channel data don't return from mch_inchar().
+Files: src/getchar.c, src/proto/getchar.pro, src/os_unix.c
+
+Patch 7.4.1887
+Problem: When receiving channel data 'updatetime' is not respected.
+Solution: Recompute the waiting time after being interrupted.
+Files: src/os_unix.c
+
+Patch 7.4.1888
+Problem: Wrong computation of remaining wait time in RealWaitForChar()
+Solution: Remember the original waiting time.
+Files: src/os_unix.c
+
+Patch 7.4.1889
+Problem: When umask is set to 0177 Vim can't create temp files. (Lcd)
+Solution: Also correct umask when using mkdtemp().
+Files: src/fileio.c
+
+Patch 7.4.1890
+Problem: GUI: When channel data is received the cursor blinking is
+ interrupted. (Ramel Eshed)
+Solution: Don't update the cursor when it is blinking.
+Files: src/screen.c, src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro,
+ src/gui_mac.c, src/proto/gui_mac.pro, src/gui_photon.c,
+ src/proto/gui_photon.pro, src/gui_w32.c, src/proto/gui_w32.pro,
+ src/gui_x11.c, src/proto/gui_x11.pro
+
+Patch 7.4.1891
+Problem: Channel reading very long lines is slow.
+Solution: Collapse multiple buffers until a NL is found.
+Files: src/channel.c, src/netbeans.c, src/proto/channel.pro,
+ src/structs.h
+
+Patch 7.4.1892
+Problem: balloon eval only gets the window number, not the ID.
+Solution: Add v:beval_winid.
+Files: src/eval.c, src/gui_beval.c, src/vim.h
+
+Patch 7.4.1893
+Problem: Cannot easily get the window ID for a buffer.
+Solution: Add bufwinid().
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 7.4.1894
+Problem: Cannot get the window ID for a mouse click.
+Solution: Add v:mouse_winid.
+Files: src/eval.c, src/vim.h, runtime/doc/eval.txt
+
+Patch 7.4.1895
+Problem: Cannot use a window ID where a window number is expected.
+Solution: Add LOWEST_WIN_ID, so that the window ID can be used where a
+ number is expected.
+Files: src/window.c, src/eval.c, src/vim.h, runtime/doc/eval.txt,
+ src/testdir/test_window_id.vim
+
+Patch 7.4.1896
+Problem: Invoking mark_adjust() when adding a new line below the last line
+ is pointless.
+Solution: Skip calling mark_adjust() when appending below the last line.
+Files: src/misc1.c, src/ops.c
+
+Patch 7.4.1897
+Problem: Various typos, long lines and style mistakes.
+Solution: Fix the typos, wrap lines, improve style.
+Files: src/buffer.c, src/ex_docmd.c, src/getchar.c, src/option.c,
+ src/main.aap, src/testdir/README.txt,
+ src/testdir/test_reltime.vim, src/testdir/test_tagjump.vim,
+ src/INSTALL, src/config.aap.in, src/if_mzsch.c
+
+Patch 7.4.1898
+Problem: User commands don't support modifiers.
+Solution: Add the <mods> item. (Yegappan Lakshmanan, closes #829)
+Files: runtime/doc/map.txt, src/ex_docmd.c, src/testdir/Make_all.mak,
+ src/testdir/test_usercommands.vim
+
+Patch 7.4.1899
+Problem: GTK 3: cursor blinking doesn't work well.
+Solution: Instead of gui_gtk_window_clear() use gui_mch_clear_block().
+ (Kazunobu Kuriyama)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.1900
+Problem: Using CTRL-] in the help on "{address}." doesn't work.
+Solution: Recognize an item in {}. (Hirohito Higashi, closes #814)
+Files: src/ex_cmds.c, src/testdir/test_help_tagjump.vim
+
+Patch 7.4.1901
+Problem: Win32: the "Disabled" menu items would appear enabled.
+Solution: Use submenu_id if there is a parent. (Shane Harper, closes #834)
+Files: src/gui_w32.c
+
+Patch 7.4.1902
+Problem: No test for collapsing buffers for a channel. Some text is lost.
+Solution: Add a simple test. Set rq_buflen correctly.
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel_pipe.py
+
+Patch 7.4.1903
+Problem: When writing viminfo merging current history with history in
+ viminfo may drop recent history entries.
+Solution: Add new format for viminfo lines, use it for history entries. Use
+ a timestamp for ordering the entries. Add test_settime().
+ Add the viminfo version. Does not do merging on timestamp yet.
+Files: src/eval.c, src/ex_getln.c, src/ex_cmds.c, src/structs.h,
+ src/globals.h, src/proto/ex_cmds.pro, src/proto/ex_getln.pro,
+ src/testdir/test_viminfo.vim
+
+Patch 7.4.1904 (after 7.4.1903)
+Problem: Build fails.
+Solution: Add missing changes.
+Files: src/vim.h
+
+Patch 7.4.1905 (after 7.4.1903)
+Problem: Some compilers can't handle a double semicolon.
+Solution: Remove one semicolon.
+Files: src/ex_cmds.c
+
+Patch 7.4.1906
+Problem: Collapsing channel buffers and searching for NL does not work
+ properly. (Xavier de Gaye, Ramel Eshed)
+Solution: Do not assume the buffer contains a NUL or not. Change NUL bytes
+ to NL to avoid the string is truncated.
+Files: src/channel.c, src/netbeans.c, src/proto/channel.pro
+
+Patch 7.4.1907
+Problem: Warnings from 64 bit compiler.
+Solution: Change type to size_t. (Mike Williams)
+Files: src/ex_cmds.c
+
+Patch 7.4.1908
+Problem: Netbeans uses uninitialized pointer and freed memory.
+Solution: Set "buffer" at the right place (hint by Ken Takata)
+Files: src/netbeans.c
+
+Patch 7.4.1909
+Problem: Doubled semicolons.
+Solution: Reduce to one. (Dominique Pelle)
+Files: src/dosinst.c, src/fold.c, src/gui_gtk_x11.c, src/gui_w32.c,
+ src/main.c, src/misc2.c
+
+Patch 7.4.1910
+Problem: Tests using external command to delete directory.
+Solution: Use delete().
+Files: src/testdir/test17.in, src/testdir/test73.in,
+ src/testdir/test_getcwd.in
+
+Patch 7.4.1911
+Problem: Recent history lines may be lost when exiting Vim.
+Solution: Merge history using the timestamp.
+Files: src/ex_getln.c, src/ex_cmds.c, src/vim.h, src/proto/ex_getln.pro,
+ src/testdir/test_viminfo.vim
+
+Patch 7.4.1912
+Problem: No test for using setqflist() on an older quickfix list.
+Solution: Add a couple of tests.
+Files: src/testdir/test_quickfix.vim
+
+Patch 7.4.1913
+Problem: When ":doautocmd" is used modelines are used even when no
+ autocommands were executed. (Daniel Hahler)
+Solution: Skip processing modelines. (closes #854)
+Files: src/fileio.c, src/ex_cmds.c, src/ex_docmd.c, src/proto/fileio.pro
+
+Patch 7.4.1914
+Problem: Executing autocommands while using the signal stack has a high
+ chance of crashing Vim.
+Solution: Don't invoke autocommands when on the signal stack.
+Files: src/os_unix.c
+
+Patch 7.4.1915
+Problem: The effect of the PopupMenu autocommand isn't directly visible.
+Solution: Call gui_update_menus() before displaying the popup menu. (Shane
+ Harper, closes #855)
+Files: src/menu.c
+
+Patch 7.4.1916 (after 7.4.1906)
+Problem: No proper test for what 7.4.1906 fixes.
+Solution: Add a test for reading many lines.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.1917
+Problem: History lines read from viminfo in different encoding than when
+ writing are not converted.
+Solution: Convert the history lines.
+Files: src/ex_cmds.c, src/testdir/test_viminfo.vim
+
+Patch 7.4.1918
+Problem: Not enough testing for parsing viminfo lines.
+Solution: Add test with viminfo lines in bad syntax. Fix memory leak.
+Files: src/ex_cmds.c, src/ex_getln.c, src/testdir/test_viminfo.vim
+
+Patch 7.4.1919
+Problem: Register contents is not merged when writing viminfo.
+Solution: Use timestamps for register contents.
+Files: src/ops.c, src/ex_getln.c, src/ex_cmds.c, src/proto/ex_cmds.pro,
+ src/proto/ex_getln.pro, src/proto/ops.pro, src/vim.h
+
+Patch 7.4.1920 (after 7.4.1919)
+Problem: Missing test changes.
+Solution: Update viminfo test.
+Files: src/testdir/test_viminfo.vim
+
+Patch 7.4.1921 (after 7.4.1919)
+Problem: vim_time() not included when needed.
+Solution: Adjust #ifdef.
+Files: src/ex_cmds.c
+
+Patch 7.4.1922
+Problem: Ruby 2.4.0 unifies Fixnum and Bignum into Integer.
+Solution: Use rb_cInteger. (Weiyong Mao)
+Files: src/if_ruby.c
+
+Patch 7.4.1923
+Problem: Command line editing is not tested much.
+Solution: Add tests for expanding the file name and 'wildmenu'.
+Files: src/testdir/test_cmdline.vim, src/testdir/Make_all.mak
+
+Patch 7.4.1924
+Problem: Missing "void" for functions without argument.
+Solution: Add "void". (Hirohito Higashi)
+Files: src/channel.c, src/edit.c, src/ex_cmds2.c, src/ops.c, src/screen.c
+
+Patch 7.4.1925
+Problem: Viminfo does not merge file marks properly.
+Solution: Use a timestamp. Add the :clearjumps command.
+Files: src/mark.c, src/ex_cmds.c, src/ex_docmd.c, src/proto/mark.pro,
+ src/structs.h, src/vim.h, src/ex_cmds.h,
+ src/testdir/test_viminfo.vim
+
+Patch 7.4.1926
+Problem: Possible crash with many history items.
+Solution: Avoid the index going past the last item.
+Files: src/ex_getln.c
+
+Patch 7.4.1927
+Problem: Compiler warning for signed/unsigned.
+Solution: Add type cast.
+Files: src/if_mzsch.c
+
+Patch 7.4.1928
+Problem: Overwriting pointer argument.
+Solution: Assign to what it points to. (Dominique Pelle)
+Files: src/fileio.c
+
+Patch 7.4.1929
+Problem: Inconsistent indenting and weird name.
+Solution: Fix indent, make name all upper case. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 7.4.1930
+Problem: Can't build without +spell but with +quickfix. (Charles)
+Solution: Add better #ifdef around ml_append_buf(). (closes #864)
+Files: src/memline.c
+
+Patch 7.4.1931
+Problem: Using both old and new style file mark lines from viminfo.
+Solution: Skip the old style lines if the viminfo file was written with a
+ Vim version that supports the new style.
+Files: src/ex_cmds.c
+
+Patch 7.4.1932
+Problem: When writing viminfo the jumplist is not merged with the one in
+ the viminfo file.
+Solution: Merge based on timestamp.
+Files: src/mark.c, src/testdir/test_viminfo.vim
+
+Patch 7.4.1933
+Problem: Compiler warning about uninitialized variable. (Yegappan)
+Solution: Give it a dummy value.
+Files: src/ex_getln.c
+
+Patch 7.4.1934
+Problem: New style tests not executed with MinGW compiler.
+Solution: Add new style test support. (Yegappan Lakshmanan)
+Files: src/testdir/Make_ming.mak
+
+Patch 7.4.1935
+Problem: When using the GUI search/replace a second match right after the
+ replacement is skipped.
+Solution: Add the SEARCH_START flag. (Mleddy)
+Files: src/gui.c
+
+Patch 7.4.1936
+Problem: Off-by-one error in bounds check. (Coverity)
+Solution: Check register number properly.
+Files: src/ops.c
+
+Patch 7.4.1937
+Problem: No test for directory stack in quickfix.
+Solution: Add a test. (Yegappan Lakshmanan)
+Files: src/testdir/test_quickfix.vim
+
+Patch 7.4.1938
+Problem: When writing viminfo numbered marks were duplicated.
+Solution: Check for duplicates between current numbered marks and the ones
+ read from viminfo.
+Files: src/mark.c
+
+Patch 7.4.1939
+Problem: Memory access error when reading viminfo. (Dominique Pelle)
+Solution: Correct index in jumplist when at the end.
+Files: src/mark.c, src/testdir/test_viminfo.vim
+
+Patch 7.4.1940
+Problem: "gd" hangs in some situations. (Eric Biggers)
+Solution: Remove the SEARCH_START flag when looping. Add a test.
+Files: src/normal.c, src/testdir/test_goto.vim
+
+Patch 7.4.1941
+Problem: Not all quickfix tests are also done with the location lists.
+Solution: Test more quickfix code. Use user commands instead of "exe".
+ (Yegappan Lakshmanan)
+Files: src/testdir/test_quickfix.vim
+
+Patch 7.4.1942
+Problem: Background is not drawn properly when 'termguicolors' is set.
+Solution: Check cterm_normal_bg_color. (Jacob Niehus, closes #805)
+Files: src/screen.c
+
+Patch 7.4.1943
+Problem: Coverity warns for unreachable code.
+Solution: Remove the code that won't do anything.
+Files: src/mark.c
+
+Patch 7.4.1944
+Problem: Win32: Cannot compile with XPM feature using VC2015
+Solution: Add XPM libraries compiled with VC2015, and enable to build
+ gvim.exe which supports XPM using VC2015. (Ken Takata)
+Files: src/Make_mvc.mak, src/xpm/x64/lib-vc14/libXpm.lib,
+ src/xpm/x86/lib-vc14/libXpm.lib
+
+Patch 7.4.1945
+Problem: The Man plugin doesn't work that well.
+Solution: Use "g:ft_man_open_mode" to be able open man pages in vert split
+ or separate tab. Set nomodifiable for buffer with man content. Add
+ a test. (Andrey Starodubtsev, closes #873)
+Files: runtime/ftplugin/man.vim, src/testdir/test_man.vim,
+ src/testdir/Make_all.mak
+
+Patch 7.4.1946 (after 7.4.1944)
+Problem: File list does not include new XPM libraries.
+Solution: Add the file list entries.
+Files: Filelist
+
+Patch 7.4.1947
+Problem: Viminfo continuation line with wrong length isn't skipped. (Marius
+ Gedminas)
+Solution: Skip a line when encountering an error, but not two lines.
+Files: src/ex_cmds.c
+
+Patch 7.4.1948
+Problem: Using Ctrl-A with double-byte encoding may result in garbled text.
+Solution: Skip to the start of a character. (Hirohito Higashi)
+Files: src/ops.c
+
+Patch 7.4.1949
+Problem: Minor problems with the quickfix code.
+Solution: Fix the problems. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1950
+Problem: Quickfix long lines test not executed for buffer.
+Solution: Call the function to test long lines. (Yegappan Lakshmanan)
+Files: src/testdir/test_quickfix.vim
+
+Patch 7.4.1951
+Problem: Ruby test is old style.
+Solution: Convert to a new style test. (Ken Takata)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/test_ruby.in,
+ src/testdir/test_ruby.ok, src/testdir/test_ruby.vim
+
+Patch 7.4.1952
+Problem: Cscope interface does not support finding assignments.
+Solution: Add the "a" command. (ppettina, closes #882)
+Files: runtime/doc/if_cscop.txt, src/if_cscope.c
+
+Patch 7.4.1953
+Problem: Not all parts of the quickfix code are tested.
+Solution: Add more tests. (Yegappan Lakshmanan)
+Files: src/testdir/samples/quickfix.txt,
+ src/testdir/test_quickfix.vim
+
+Patch 7.4.1954 (after 7.4.1948)
+Problem: No test for what 7.4.1948 fixes.
+Solution: Add a test. (Hirohito Higashi, closes #880)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_increment_dbcs.vim
+
+Patch 7.4.1955
+Problem: Using 32-bit Perl with 64-bit time_t causes memory corruption.
+ (Christian Brabandt)
+Solution: Use time_T instead of time_t for global variables. (Ken Takata)
+Files: src/ex_cmds.c, src/globals.h, src/misc2.c, src/proto/ex_cmds.pro,
+ src/proto/misc2.pro, src/structs.h, src/vim.h
+
+Patch 7.4.1956
+Problem: When using CTRL-W f and pressing "q" at the ATTENTION dialog the
+ newly opened window is not closed.
+Solution: Close the window and go back to the original one. (Norio Takagi,
+ Hirohito Higashi)
+Files: src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 7.4.1957
+Problem: Perl interface has obsolete workaround.
+Solution: Remove the workaround added by 7.3.623. (Ken Takata)
+Files: src/if_perl.xs
+
+Patch 7.4.1958
+Problem: Perl interface preprocessor statements not nicely indented.
+Solution: Improve the indenting. (Ken Takata)
+Files: src/if_perl.xs
+
+Patch 7.4.1959
+Problem: Crash when running test_channel.vim on Windows.
+Solution: Check for NULL pointer result from FormatMessage(). (Christian
+ Brabandt)
+Files: src/channel.c
+
+Patch 7.4.1960
+Problem: Unicode standard 9 was released.
+Solution: Update the character property tables. (Christian Brabandt)
+Files: src/mbyte.c
+
+Patch 7.4.1961
+Problem: When 'insertmode' is reset while doing completion the popup menu
+ remains even though Vim is in Normal mode.
+Solution: Ignore stop_insert_mode when the popup menu is visible. Don't set
+ stop_insert_mode when 'insertmode' was already off. (Christian
+ Brabandt)
+Files: src/edit.c, src/option.c, src/Makefile, src/testdir/test_alot.vim,
+ src/testdir/test_popup.vim
+
+Patch 7.4.1962
+Problem: Two test files for increment/decrement.
+Solution: Move the old style test into the new style test. (Hirohito
+ Higashi, closes #881)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/main.aap,
+ src/testdir/test35.in, src/testdir/test35.ok,
+ src/testdir/test_increment.vim
+
+Patch 7.4.1963
+Problem: Running Win32 Vim in mintty does not work.
+Solution: Detect mintty and give a helpful error message. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/iscygpty.c,
+ src/iscygpty.h, src/main.c, Filelist
+
+Patch 7.4.1964
+Problem: The quickfix init function is too big.
+Solution: Factor out parsing 'errorformat' to a separate function. (Yegappan
+ Lakshmanan)
+Files: src/quickfix.c
+
+Patch 7.4.1965
+Problem: When using a job in raw mode to append to a buffer garbage
+ characters are added.
+Solution: Do not replace the trailing NUL with a NL. (Ozaki Kiichi)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.1966
+Problem: Coverity reports a resource leak.
+Solution: Close "fd" also when bailing out.
+Files: src/quickfix.c
+
+Patch 7.4.1967
+Problem: Falling back from NFA to old regexp engine does not work properly.
+ (fritzophrenic)
+Solution: Do not restore nfa_match. (Christian Brabandt, closes #867)
+Files: src/regexp_nfa.c, src/testdir/test64.in, src/testdir/test64.ok
+
+Patch 7.4.1968
+Problem: Invalid memory access with "\<C-">.
+Solution: Do not recognize this as a special character. (Dominique Pelle)
+Files: src/misc2.c, src/testdir/test_expr.vim
+
+Patch 7.4.1969
+Problem: When the netbeans channel is closed consuming the buffer may cause
+ a crash.
+Solution: Check for nb_channel not to be NULL. (Xavier de Gaye)
+Files: src/netbeans.c
+
+Patch 7.4.1970
+Problem: Using ":insert" in an empty buffer sets the jump mark. (Ingo
+ Karkat)
+Solution: Don't adjust marks when replacing the empty line in an empty
+ buffer. (closes #892)
+Files: src/ex_cmds.c, src/testdir/test_jumps.vim,
+ src/testdir/test_alot.vim
+
+Patch 7.4.1971
+Problem: It is not easy to see unrecognized error lines below the current
+ error position.
+Solution: Add ":clist +count".
+Files: src/quickfix.c, runtime/doc/quickfix.txt
+
+Patch 7.4.1972
+Problem: On Solaris select() does not work as expected when there is
+ typeahead.
+Solution: Add ICANON when sleeping. (Ozaki Kiichi)
+Files: src/os_unix.c
+
+Patch 7.4.1973
+Problem: On MS-Windows the package directory may be added at the end
+ because of forward/backward slash differences. (Matthew
+ Desjardins)
+Solution: Ignore slash differences.
+Files: src/ex_cmds2.c
+
+Patch 7.4.1974
+Problem: GUI has a problem with some termcodes.
+Solution: Handle negative numbers. (Kazunobu Kuriyama)
+Files: src/gui.c
+
+Patch 7.4.1975
+Problem: On MS-Windows large files (> 2Gbyte) cause problems.
+Solution: Use "off_T" instead of "off_t". Use "stat_T" instead of "struct
+ stat". Use 64 bit system functions if available. (Ken Takata)
+Files: src/Makefile, src/buffer.c, src/diff.c, src/eval.c, src/ex_cmds.c,
+ src/ex_cmds2.c, src/fileio.c, src/gui.c, src/gui_at_fs.c,
+ src/if_cscope.c, src/main.c, src/memfile.c, src/memline.c,
+ src/misc1.c, src/misc2.c, src/netbeans.c, src/os_mswin.c,
+ src/os_win32.c, src/proto/fileio.pro, src/proto/memline.pro,
+ src/proto/os_mswin.pro, src/pty.c, src/quickfix.c, src/spell.c,
+ src/structs.h, src/tag.c, src/testdir/Make_all.mak,
+ src/testdir/test_largefile.vim, src/testdir/test_stat.vim,
+ src/undo.c, src/vim.h
+
+Patch 7.4.1976
+Problem: Number variables are not 64 bits while they could be.
+Solution: Add the num64 feature. (Ken Takata, Yasuhiro Matsumoto)
+Files: runtime/doc/eval.txt, runtime/doc/various.txt,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/charset.c,
+ src/eval.c, src/ex_cmds.c, src/ex_getln.c, src/feature.h,
+ src/fileio.c, src/fold.c, src/json.c, src/message.c, src/misc1.c,
+ src/misc2.c, src/ops.c, src/option.c, src/proto/charset.pro,
+ src/proto/eval.pro, src/quickfix.c, src/structs.h,
+ src/testdir/test_viml.vim, src/version.c
+
+Patch 7.4.1977
+Problem: With 64 bit changes don't need three calls to sprintf().
+Solution: Simplify the code, use vim_snprintf(). (Ken Takata)
+Files: src/fileio.c
+
+Patch 7.4.1978 (after 7.4.1975)
+Problem: Large file test does not delete its output.
+Solution: Delete the output. Check size properly when possible. (Ken Takata)
+Files: src/testdir/test_largefile.vim
+
+Patch 7.4.1979 (after 7.4.1976)
+Problem: Getting value of binary option is wrong. (Kent Sibilev)
+Solution: Fix type cast. Add a test.
+Files: src/option.c, src/testdir/test_expr.vim
+
+Patch 7.4.1980
+Problem: 'errorformat' is parsed for every call to ":caddexpr". Can't add
+ to two location lists asynchronously.
+Solution: Keep the previously parsed data when appropriate. (mostly by
+ Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.1981
+Problem: No testing for Farsi code.
+Solution: Add a minimal test. Clean up Farsi code.
+Files: src/farsi.c, src/Makefile, src/charset.c, src/normal.c,
+ src/proto/main.pro, src/testdir/Make_all.mak,
+ src/testdir/test_farsi.vim
+
+Patch 7.4.1982
+Problem: Viminfo file contains duplicate change marks.
+Solution: Drop duplicate marks.
+Files: src/mark.c
+
+Patch 7.4.1983
+Problem: farsi.c and arabic.c are included in a strange way.
+Solution: Build them like other files.
+Files: src/main.c, src/farsi.c, src/arabic.c, src/proto.h,
+ src/proto/main.pro, src/proto/farsi.pro, src/proto/arabic.pro,
+ src/Makefile, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_dice.mak, src/Make_ivc.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak,
+ Filelist
+
+Patch 7.4.1984
+Problem: Not all quickfix features are tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan)
+Files: src/testdir/test_quickfix.vim
+
+Patch 7.4.1985 (after 7.4.1983)
+Problem: Missing changes in VMS build file.
+Solution: Use the right file name.
+Files: src/Make_vms.mms
+
+Patch 7.4.1986
+Problem: Compiler warns for loss of data.
+Solution: Use size_t instead of int. (Christian Brabandt)
+Files: src/ex_cmds2.c
+
+Patch 7.4.1987
+Problem: When copying unrecognized lines for viminfo, end up with useless
+ continuation lines.
+Solution: Skip continuation lines.
+Files: src/ex_cmds.c
+
+Patch 7.4.1988
+Problem: When updating viminfo with file marks there is no time order.
+Solution: Remember the time when a buffer was last used, store marks for
+ the most recently used buffers.
+Files: src/buffer.c, src/structs.h, src/mark.c, src/main.c,
+ src/ex_cmds.c, src/proto/mark.pro, src/testdir/test_viminfo.vim
+
+Patch 7.4.1989
+Problem: filter() and map() only accept a string argument.
+Solution: Implement using a Funcref argument (Yasuhiro Matsumoto, Ken
+ Takata)
+Files: runtime/doc/eval.txt, src/Makefile, src/eval.c,
+ src/testdir/test_alot.vim, src/testdir/test_filter_map.vim,
+ src/testdir/test_partial.vim
+
+Patch 7.4.1990 (after 7.4.1952)
+Problem: Cscope items are not sorted.
+Solution: Put the new "a" command first. (Ken Takata)
+Files: src/if_cscope.c
+
+Patch 7.4.1991
+Problem: glob() does not add a symbolic link when there are no wildcards.
+Solution: Remove the call to mch_getperm().
+Files: src/misc1.c
+
+Patch 7.4.1992
+Problem: Values for true and false can be confusing.
+Solution: Update the documentation. Add a test. Make v:true evaluate to
+ TRUE for a non-zero-arg.
+Files: runtime/doc/eval.txt, src/eval.c, src/Makefile,
+ src/testdir/test_true_false.vim, src/testdir/test_alot.vim
+
+Patch 7.4.1993
+Problem: Not all TRUE and FALSE arguments are tested.
+Solution: Add a few more tests.
+Files: src/testdir/test_true_false.vim
+
+Patch 7.4.1994 (after 7.4.1993)
+Problem: True-false test fails.
+Solution: Filter the dict to only keep the value that matters.
+Files: src/testdir/test_true_false.vim
+
+Patch 7.4.1995
+Problem: GUI: cursor drawn in wrong place if a timer callback causes a
+ screen update. (David Samvelyan)
+Solution: Also redraw the cursor when it's blinking and on.
+Files: src/gui_gtk_x11.c, src/gui_mac.c, src/gui_photon.c, src/gui_w32.c,
+ src/gui_x11.c, src/screen.c, src/proto/gui_gtk_x11.pro,
+ src/proto/gui_mac.pro, src/proto/gui_photon.pro,
+ src/proto/gui_w32.pro, src/proto/gui_x11.pro
+
+Patch 7.4.1996
+Problem: Capturing the output of a command takes a few commands.
+Solution: Add evalcmd().
+Files: src/eval.c, runtime/doc/eval.txt, src/testdir/test_alot.vim,
+ src/Makefile, src/testdir/test_evalcmd.vim
+
+Patch 7.4.1997
+Problem: Cannot easily scroll the quickfix window.
+Solution: Add ":cbottom".
+Files: src/ex_cmds.h, src/quickfix.c, src/proto/quickfix.pro,
+ src/ex_docmd.c, src/testdir/test_quickfix.vim,
+ runtime/doc/quickfix.txt
+
+Patch 7.4.1998
+Problem: When writing buffer lines to a job there is no NL to NUL
+ conversion.
+Solution: Make it work symmetrical with writing lines from a job into a
+ buffer.
+Files: src/channel.c, src/proto/channel.pro, src/netbeans.c
+
+Patch 7.4.1999
+Problem: evalcmd() doesn't work recursively.
+Solution: Use redir_evalcmd instead of redir_vname.
+Files: src/message.c, src/eval.c, src/globals.h, src/proto/eval.pro,
+ src/testdir/test_evalcmd.vim
+
+Patch 7.4.2000 (after 7.4.1999)
+Problem: Evalcmd test fails.
+Solution: Add missing piece.
+Files: src/ex_docmd.c
+
+Patch 7.4.2001 (after 7.4.2000)
+Problem: Tiny build fails. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 7.4.2002
+Problem: Crash when passing number to filter() or map().
+Solution: Convert to a string. (Ozaki Kiichi)
+Files: src/eval.c, src/testdir/test_filter_map.vim
+
+Patch 7.4.2003
+Problem: Still cursor flickering when a callback updates the screen. (David
+ Samvelyan)
+Solution: Put the cursor in the right position after updating the screen.
+Files: src/screen.c
+
+Patch 7.4.2004
+Problem: GUI: cursor displayed in the wrong position.
+Solution: Correct screen_cur_col and screen_cur_row.
+Files: src/screen.c
+
+Patch 7.4.2005
+Problem: After using evalcmd() message output is in the wrong position.
+ (Christian Brabandt)
+Solution: Reset msg_col.
+Files: src/eval.c
+
+Patch 7.4.2006
+Problem: Crash when using tabnext in BufUnload autocmd. (Norio Takagi)
+Solution: First check that the current buffer is the right one. (Hirohito
+ Higashi)
+Files: src/buffer.c, src/testdir/test_autocmd.vim
+
+Patch 7.4.2007
+Problem: Running the tests leaves a viminfo file behind.
+Solution: Make the viminfo option empty.
+Files: src/testdir/runtest.vim
+
+Patch 7.4.2008
+Problem: evalcmd() has a confusing name.
+Solution: Rename to execute(). Make silent optional. Support a list of
+ commands.
+Files: src/eval.c, src/ex_docmd.c, src/message.c, src/globals.h,
+ src/proto/eval.pro, src/Makefile, src/testdir/test_evalcmd.vim,
+ src/testdir/test_execute_func.vim, src/testdir/test_alot.vim,
+ runtime/doc/eval.txt
+
+Patch 7.4.2009 (after 7.4.2008)
+Problem: Messages test fails.
+Solution: Don't set redir_execute before returning. Add missing version
+ number.
+Files: src/eval.c
+
+Patch 7.4.2010
+Problem: There is a :cbottom command but no :lbottom command.
+Solution: Add :lbottom. (Yegappan Lakshmanan)
+Files: runtime/doc/index.txt, runtime/doc/quickfix.txt, src/ex_cmds.h,
+ src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.2011
+Problem: It is not easy to get a list of command arguments.
+Solution: Add getcompletion(). (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/eval.c, src/ex_docmd.c,
+ src/proto/ex_docmd.pro, src/testdir/test_cmdline.vim
+
+Patch 7.4.2012 (after 7.4.2011)
+Problem: Test for getcompletion() does not pass on all systems.
+Solution: Only test what is supported.
+Files: src/testdir/test_cmdline.vim
+
+Patch 7.4.2013
+Problem: Using "noinsert" in 'completeopt' breaks redo.
+Solution: Set compl_curr_match. (Shougo Matsu, closes #874)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 7.4.2014
+Problem: Using "noinsert" in 'completeopt' does not insert match.
+Solution: Set compl_enter_selects. (Shougo Matsu, closes #875)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 7.4.2015
+Problem: When a file gets a name when writing it 'acd' is not effective.
+ (Dan Church)
+Solution: Invoke DO_AUTOCHDIR after writing the file. (Allen Haim, closes
+ #777, closes #803) Add test_autochdir() to enable 'acd' before
+ "starting" is reset.
+Files: src/ex_cmds.c, src/buffer.c, src/eval.c, src/globals.h,
+ src/Makefile, src/testdir/test_autochdir.vim,
+ src/testdir/Make_all.mak
+
+Patch 7.4.2016
+Problem: Warning from MinGW about _WIN32_WINNT redefined. (John Marriott)
+Solution: First undefine it. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.2017
+Problem: When there are many errors adding them to the quickfix list takes
+ a long time.
+Solution: Add BLN_NOOPT. Don't call buf_valid() in buf_copy_options().
+ Remember the last file name used. When going through the buffer
+ list start from the end of the list. Only call buf_valid() when
+ autocommands were executed.
+Files: src/buffer.c, src/option.c, src/quickfix.c, src/vim.h
+
+Patch 7.4.2018
+Problem: buf_valid() can be slow when there are many buffers.
+Solution: Add bufref_valid(), only go through the buffer list when a buffer
+ was freed.
+Files: src/structs.h, src/buffer.c, src/quickfix.c, src/proto/buffer.pro
+
+Patch 7.4.2019
+Problem: When ignoring case utf_fold() may consume a lot of time.
+Solution: Optimize for ASCII.
+Files: src/mbyte.c
+
+Patch 7.4.2020
+Problem: Can't build without +autocmd feature.
+Solution: Adjust #ifdefs.
+Files: src/buffer.c
+
+Patch 7.4.2021
+Problem: Still too many buf_valid() calls.
+Solution: Make au_new_curbuf a bufref. Use bufref_valid() in more places.
+Files: src/ex_cmds.c, src/buffer.c, src/globals.h
+
+Patch 7.4.2022
+Problem: Warnings from 64 bit compiler.
+Solution: Add type casts. (Mike Williams)
+Files: src/eval.c
+
+Patch 7.4.2023
+Problem: buflist_findname_stat() may find a dummy buffer.
+Solution: Set the BF_DUMMY flag after loading a dummy buffer. Start
+ finding buffers from the end of the list.
+Files: src/quickfix.c, src/buffer.c
+
+Patch 7.4.2024
+Problem: More buf_valid() calls can be optimized.
+Solution: Use bufref_valid() instead.
+Files: src/buffer.c, src/ex_cmds.c, src/structs.h, src/channel.c,
+ src/diff.c, src/eval.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/ex_getln.c, src/fileio.c, src/main.c, src/misc2.c,
+ src/netbeans.c, src/quickfix.c, src/spell.c, src/term.c,
+ src/if_py_both.h, src/window.c, src/proto/buffer.pro,
+ src/proto/window.pro
+
+Patch 7.4.2025
+Problem: The cursor blinking stops or is irregular when receiving date over
+ a channel and writing it in a buffer, and when updating the status
+ line. (Ramel Eshed)
+Solution: Make it a bit better by flushing GUI output. Don't redraw the
+ cursor after updating the screen if the blink state is off.
+Files: src/gui_gtk_x11.c, src/screen.c
+
+Patch 7.4.2026
+Problem: Reference counting for callbacks isn't right.
+Solution: Add free_callback(). (Ken Takata) Fix reference count.
+Files: src/channel.c, src/eval.c, src/ex_cmds2.c, src/proto/eval.pro
+
+Patch 7.4.2027
+Problem: Can't build with +eval but without +menu.
+Solution: Add #ifdef. (John Marriott)
+Files: src/eval.c
+
+Patch 7.4.2028
+Problem: cppcheck warns for using index before limits check.
+Solution: Swap the expressions. (Dominique Pelle)
+Files: src/mbyte.c
+
+Patch 7.4.2029
+Problem: printf() does not work with 64 bit numbers.
+Solution: use the "L" length modifier. (Ken Takata)
+Files: src/message.c, src/testdir/test_expr.vim
+
+Patch 7.4.2030
+Problem: ARCH must be set properly when using MinGW.
+Solution: Detect the default value of ARCH from the current compiler. (Ken
+ Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.2031
+Problem: The list_lbr_utf8 test fails if ~/.vim/syntax/c.vim sets
+ 'textwidth' to a non-zero value. (Oyvind A. Holm)
+Solution: Add a setup.vim file that sets 'runtimepath' and $HOME to a safe
+ value. (partly by Christian Brabandt, closes #912)
+Files: src/testdir/setup.vim, src/testdir/amiga.vim, src/testdir/dos.vim,
+ src/testdir/unix.vim, src/testdir/vms.vim, src/testdir/runtest.vim
+
+Patch 7.4.2032 (after 7.4.2030)
+Problem: Build fails with 64 bit MinGW. (Axel Bender)
+Solution: Handle dash vs. underscore. (Ken Takata, Hirohito Higashi)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.2033
+Problem: 'cscopequickfix' option does not accept new value "a".
+Solution: Adjust list of command characters. (Ken Takata)
+Files: src/option.h, src/Makefile, src/testdir/test_cscope.vim,
+ src/testdir/Make_all.mak
+
+Patch 7.4.2034 (after 7.4.2032)
+Problem: Build fails with some version of MinGW. (illusorypan)
+Solution: Recognize mingw32. (Ken Takata, closes #921)
+Files: src/Make_cyg_ming.mak
+
+Patch 7.4.2035
+Problem: On Solaris with ZFS the ACL may get removed.
+Solution: Always restore the ACL for Solaris ZFS. (Danek Duvall)
+Files: src/fileio.c
+
+Patch 7.4.2036
+Problem: Looking up a buffer by number is slow if there are many.
+Solution: Use a hashtab.
+Files: src/structs.h, src/buffer.c
+
+Patch 7.4.2037 (after 7.4.2036)
+Problem: Small build fails.
+Solution: Adjust #ifdefs.
+Files: src/hashtab.c
+
+Patch 7.4.2038 (after 7.4.2036)
+Problem: Small build still fails.
+Solution: Adjust more #ifdefs.
+Files: src/globals.h, src/buffer.c
+
+Patch 7.4.2039
+Problem: The Netbeans integration is not tested.
+Solution: Add a first Netbeans test.
+Files: src/testdir/test_netbeans.vim, src/testdir/test_netbeans.py,
+ src/testdir/Make_all.mak, src/Makefile,
+ src/testdir/test_channel.vim, src/testdir/shared.vim
+
+Patch 7.4.2040
+Problem: New files missing from distribution.
+Solution: Add new test scripts.
+Files: Filelist
+
+Patch 7.4.2041
+Problem: Netbeans file authentication not tested.
+Solution: Add a test.
+Files: src/testdir/test_netbeans.vim
+
+Patch 7.4.2042
+Problem: GTK: display updating is not done properly and can be slow.
+Solution: Use gdk_display_flush() instead of gdk_display_sync(). Don't call
+ gdk_window_process_updates(). (Kazunobu Kuriyama)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.2043
+Problem: setbuvfar() causes a screen redraw.
+Solution: Only use aucmd_prepbuf() for options.
+Files: src/eval.c
+
+Patch 7.4.2044
+Problem: filter() and map() either require a string or defining a function.
+Solution: Support lambda, a short way to define a function that evaluates an
+ expression. (Yasuhiro Matsumoto, Ken Takata)
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_alot.vim,
+ src/Makefile, src/testdir/test_channel.vim,
+ src/testdir/test_lambda.vim
+
+Patch 7.4.2045
+Problem: Memory leak when using a function callback.
+Solution: Don't save the function name when it's in the partial.
+Files: src/channel.c
+
+Patch 7.4.2046
+Problem: The qf_init_ext() function is too big.
+Solution: Refactor it. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 7.4.2047
+Problem: Compiler warning for initializing a struct.
+Solution: Initialize in another way. (Anton Lindqvist)
+Files: src/quickfix.c
+
+Patch 7.4.2048
+Problem: There is still code and help for unsupported systems.
+Solution: Remove the code and text. (Hirohito Higashi)
+Files: runtime/doc/eval.txt, runtime/lang/menu_sk_sk.vim,
+ runtime/menu.vim, runtime/optwin.vim, src/Make_bc5.mak,
+ src/ex_docmd.c, src/feature.h, src/fileio.c, src/globals.h,
+ src/main.c, src/memfile.c, src/memline.c, src/misc1.c,
+ src/misc2.c, src/option.c, src/option.h, src/os_unix.c,
+ src/os_unix.h, src/proto.h, src/term.c, src/undo.c, src/version.c,
+ src/vim.h, src/xxd/xxd.c
+
+Patch 7.4.2049
+Problem: There is no way to get a list of the error lists.
+Solution: Add ":chistory" and ":lhistory".
+Files: src/ex_cmds.h, src/quickfix.c, src/ex_docmd.c, src/message.c,
+ src/proto/quickfix.pro, src/testdir/test_quickfix.vim
+
+Patch 7.4.2050
+Problem: When using ":vimgrep" may end up with duplicate buffers.
+Solution: When adding an error list entry pass the buffer number if possible.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.2051
+Problem: No proper testing of trunc_string().
+Solution: Add a unittest for message.c.
+Files: src/Makefile, src/message.c, src/message_test.c, src/main.c,
+ src/proto/main.pro, src/structs.h
+
+Patch 7.4.2052
+Problem: Coverage report is messed up by the unittests.
+Solution: Add a separate test target for script tests. Use that when
+ collecting coverage information.
+Files: src/Makefile
+
+Patch 7.4.2053
+Problem: Can't run scripttests in the top directory.
+Solution: Add targets to the top Makefile.
+Files: Makefile
+
+Patch 7.4.2054 (after 7.4.2048)
+Problem: Wrong part of #ifdef removed.
+Solution: Use the right part. (Hirohito Higashi)
+Files: src/os_unix.c
+
+Patch 7.4.2055
+Problem: eval.c is too big
+Solution: Move Dictionary functions to dict.c
+Files: src/eval.c, src/dict.c, src/vim.h, src/globals.h,
+ src/proto/eval.pro, src/proto/dict.pro, src/Makefile, Filelist
+
+Patch 7.4.2056 (after 7.4.2055)
+Problem: Build fails.
+Solution: Add missing changes.
+Files: src/proto.h
+
+Patch 7.4.2057
+Problem: eval.c is too big.
+Solution: Move List functions to list.c
+Files: src/eval.c, src/dict.c, src/list.c, src/proto.h, src/Makefile,
+ src/globals.h, src/proto/eval.pro, src/proto/list.pro, Filelist
+
+Patch 7.4.2058
+Problem: eval.c is too big.
+Solution: Move user functions to userfunc.c
+Files: src/userfunc.c, src/eval.c, src/vim.h, src/globals.h,
+ src/structs.h, src/proto.h, src/Makefile, src/proto/eval.pro,
+ src/proto/userfunc.pro, Filelist
+
+Patch 7.4.2059
+Problem: Non-Unix builds fail.
+Solution: Update Makefiles for new files.
+Files: src/Make_bc5.mak, src/Make_cyg_ming.mak, src/Make_dice.mak,
+ src/Make_ivc.mak, src/Make_manx.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_sas.mak
+
+Patch 7.4.2060 (after 7.4.2059)
+Problem: Wrong file name.
+Solution: Fix typo.
+Files: src/Make_mvc.mak
+
+Patch 7.4.2061
+Problem: qf_init_ext() is too big.
+Solution: Move code to qf_parse_line() (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.2062
+Problem: Using dummy variable to compute struct member offset.
+Solution: Use offsetof().
+Files: src/globals.h, src/macros.h, src/vim.h, src/spell.c
+
+Patch 7.4.2063
+Problem: eval.c is still too big.
+Solution: Split off internal functions to evalfunc.c.
+Files: src/eval.c, src/evalfunc.c, src/list.c, src/proto.h,
+ src/globals.h, src/vim.h, src/proto/eval.pro,
+ src/proto/evalfunc.pro, src/proto/list.pro, src/Makefile, Filelist,
+ src/Make_bc5.mak, src/Make_cyg_ming.mak, src/Make_dice.mak,
+ src/Make_ivc.mak, src/Make_manx.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_sas.mak
+
+Patch 7.4.2064
+Problem: Coverity warns for possible buffer overflow.
+Solution: Use vim_strcat() instead of strcat().
+Files: src/quickfix.c
+
+Patch 7.4.2065
+Problem: Compiler warns for uninitialized variable. (John Marriott)
+Solution: Set lnum to the right value.
+Files: src/evalfunc.c
+
+Patch 7.4.2066
+Problem: getcompletion() not well tested.
+Solution: Add more testing.
+Files: src/testdir/test_cmdline.vim
+
+Patch 7.4.2067
+Problem: Compiler warning for char/char_u conversion. (Tony Mechelynck)
+ Inefficient code.
+Solution: Use more lines to fill with spaces. (Nikolai Pavlov) Add type cast.
+Files: src/quickfix.c
+
+Patch 7.4.2068
+Problem: Not all arguments of trunc_string() are tested. Memory access
+ error when running the message tests.
+Solution: Add another test case. (Yegappan Lakshmanan) Make it easy to run
+ unittests with valgrind. Fix the access error.
+Files: src/message.c, src/message_test.c, src/Makefile
+
+Patch 7.4.2069
+Problem: spell.c is too big.
+Solution: Split it in spell file handling and spell checking.
+Files: src/spell.c, src/spellfile.c, src/spell.h, src/Makefile,
+ src/proto/spell.pro, src/proto/spellfile.pro, src/proto.h
+ Filelist, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_dice.mak, src/Make_ivc.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak
+
+Patch 7.4.2070 (after 7.4.2069)
+Problem: Missing change to include file.
+Solution: Include the spell header file.
+Files: src/vim.h
+
+Patch 7.4.2071
+Problem: The return value of type() is difficult to use.
+Solution: Define v:t_ constants. (Ken Takata)
+Files: runtime/doc/eval.txt, src/eval.c, src/evalfunc.c,
+ src/testdir/test_channel.vim, src/testdir/test_viml.vim, src/vim.h
+
+Patch 7.4.2072
+Problem: substitute() does not support a Funcref argument.
+Solution: Support a Funcref like it supports a string starting with "\=".
+Files: src/evalfunc.c, src/regexp.c, src/eval.c, src/proto/eval.pro,
+ src/proto/regexp.pro, src/testdir/test_expr.vim
+
+Patch 7.4.2073
+Problem: rgb.txt is read for every color name.
+Solution: Load rgb.txt once. (Christian Brabandt) Add a test.
+Files: runtime/rgb.txt, src/term.c, src/testdir/test_syn_attr.vim
+
+Patch 7.4.2074
+Problem: One more place using a dummy variable.
+Solution: Use offsetof(). (Ken Takata)
+Files: src/userfunc.c
+
+Patch 7.4.2075
+Problem: No autocommand event to initialize a window or tab page.
+Solution: Add WinNew and TabNew events. (partly by Felipe Morales)
+Files: src/fileio.c, src/window.c, src/vim.h,
+ src/testdir/test_autocmd.vim, runtime/doc/autocmd.txt
+
+Patch 7.4.2076
+Problem: Syntax error when dict has '>' key.
+Solution: Check for endchar. (Ken Takata)
+Files: src/userfunc.c, src/testdir/test_lambda.vim
+
+Patch 7.4.2077
+Problem: Cannot update 'tabline' when a tab was closed.
+Solution: Add the TabClosed autocmd event. (partly by Felipe Morales)
+Files: src/fileio.c, src/window.c, src/vim.h,
+ src/testdir/test_autocmd.vim, runtime/doc/autocmd.txt
+
+Patch 7.4.2078
+Problem: Running checks in po directory fails.
+Solution: Add colors used in syntax.c to the builtin color table.
+Files: src/term.c
+
+Patch 7.4.2079
+Problem: Netbeans test fails on non-Unix systems.
+Solution: Only do the permission check on Unix systems.
+Files: src/testdir/test_netbeans.vim
+
+Patch 7.4.2080
+Problem: When using PERROR() on some systems assert_fails() does not see
+ the error.
+Solution: Make PERROR() always report the error.
+Files: src/vim.h, src/message.c, src/proto/message.pro
+
+Patch 7.4.2081
+Problem: Line numbers in the error list are not always adjusted.
+Solution: Set b_has_qf_entry properly. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/structs.h, src/testdir/test_quickfix.vim
+
+Patch 7.4.2082
+Problem: Not much test coverage for digraphs.
+Solution: Add a new style digraph test. (Christian Brabandt)
+Files: src/Makefile, src/testdir/test_alot.vim,
+ src/testdir/test_digraph.vim
+
+Patch 7.4.2083
+Problem: Coverity complains about not restoring a value.
+Solution: Restore the value, although it's not really needed. Change return
+ to jump to cleanup, might leak memory.
+Files: src/userfunc.c
+
+Patch 7.4.2084
+Problem: New digraph test makes testing hang.
+Solution: Don't set "nocp".
+Files: src/testdir/test_digraph.vim
+
+Patch 7.4.2085
+Problem: Digraph tests fails on some systems.
+Solution: Run it separately and set 'encoding' early.
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_digraph.vim
+
+Patch 7.4.2086
+Problem: Using the system default encoding makes tests unpredictable.
+Solution: Always use utf-8 or latin1 in the new style tests. Remove setting
+ encoding and scriptencoding where it is not needed.
+Files: src/testdir/runtest.vim, src/testdir/test_channel.vim,
+ src/testdir/test_digraph.vim, src/testdir/test_expand_dllpath.vim,
+ src/testdir/test_expr_utf8.vim, src/testdir/test_json.vim,
+ src/testdir/test_matchadd_conceal_utf8.vim,
+ src/testdir/test_regexp_utf8.vim, src/testdir/test_visual.vim,
+ src/testdir/test_alot_utf8.vim,
+
+Patch 7.4.2087
+Problem: Digraph code test coverage is still low.
+Solution: Add more tests. (Christian Brabandt)
+Files: src/testdir/test_digraph.vim
+
+Patch 7.4.2088 (after 7.4.2087)
+Problem: Keymap test fails with normal features.
+Solution: Bail out if the keymap feature is not supported.
+Files: src/testdir/test_digraph.vim
+
+Patch 7.4.2089
+Problem: Color handling of X11 GUIs is too complicated.
+Solution: Simplify the code. Use RGBA where appropriate. (Kazunobu
+ Kuriyama)
+Files: src/gui.h, src/gui_beval.c, src/gui_gtk_x11.c, src/netbeans.c
+
+Patch 7.4.2090
+Problem: Using submatch() in a lambda passed to substitute() is verbose.
+Solution: Use a static list and pass it as an optional argument to the
+ function. Fix memory leak.
+Files: src/structs.h, src/list.c, src/userfunc.c, src/channel.c,
+ src/eval.c, src/evalfunc.c, src/ex_cmds2.c, src/regexp.c,
+ src/proto/list.pro, src/proto/userfunc.pro,
+ src/testdir/test_expr.vim, runtime/doc/eval.txt
+
+Patch 7.4.2091
+Problem: Coverity reports a resource leak when out of memory.
+Solution: Close the file before returning.
+Files: src/term.c
+
+Patch 7.4.2092
+Problem: GTK 3 build fails with older GTK version.
+Solution: Check the pango version. (Kazunobu Kuriyama)
+Files: src/gui_beval.c
+
+Patch 7.4.2093
+Problem: Netbeans test fails once in a while. Leaving log file behind.
+Solution: Add it to the list of flaky tests. Disable logfile.
+Files: src/testdir/runtest.vim, src/testdir/test_channel.vim
+
+Patch 7.4.2094
+Problem: The color allocation in X11 is overly complicated.
+Solution: Remove find_closest_color(), XAllocColor() already does this.
+ (Kazunobu Kuriyama)
+Files: src/gui_x11.c
+
+Patch 7.4.2095
+Problem: Man test fails when run with the GUI.
+Solution: Adjust for different behavior of GUI. Add assert_inrange().
+Files: src/eval.c, src/evalfunc.c, src/proto/eval.pro,
+ src/testdir/test_assert.vim, src/testdir/test_man.vim,
+ runtime/doc/eval.txt
+
+Patch 7.4.2096
+Problem: Lambda functions show up with completion.
+Solution: Don't show lambda functions. (Ken Takata)
+Files: src/userfunc.c, src/testdir/test_cmdline.vim
+
+Patch 7.4.2097
+Problem: Warning from 64 bit compiler.
+Solution: use size_t instead of int. (Mike Williams)
+Files: src/message.c
+
+Patch 7.4.2098
+Problem: Text object tests are old style.
+Solution: Turn them into new style tests. (James McCoy, closes #941)
+Files: src/testdir/Make_all.mak, src/testdir/test_textobjects.in,
+ src/testdir/test_textobjects.ok, src/testdir/test_textobjects.vim,
+ src/Makefile
+
+Patch 7.4.2099
+Problem: When a keymap is active only "(lang)" is displayed. (Ilya
+ Dogolazky)
+Solution: Show the keymap name. (Dmitri Vereshchagin, closes #933)
+Files: src/buffer.c, src/proto/screen.pro, src/screen.c
+
+Patch 7.4.2100
+Problem: "cgn" and "dgn" do not work correctly with a single character
+ match and the replacement includes the searched pattern. (John
+ Beckett)
+Solution: If the match is found in the wrong column try in the next column.
+ Turn the test into new style. (Christian Brabandt)
+Files: src/search.c, src/testdir/Make_all.mak, src/Makefile,
+ src/testdir/test53.in, src/testdir/test53.ok,
+ src/testdir/test_gn.vim
+
+Patch 7.4.2101
+Problem: Looping over windows, buffers and tab pages is inconsistent.
+Solution: Use FOR_ALL_ macros everywhere. (Yegappan Lakshmanan)
+Files: src/buffer.c, src/diff.c, src/edit.c, src/eval.c, src/evalfunc.c,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/fileio.c,
+ src/globals.h, src/gui.c, src/gui_mac.c, src/if_lua.c,
+ src/if_mzsch.c, src/if_perl.xs, src/if_ruby.c, src/if_tcl.c,
+ src/main.c, src/mark.c, src/memfile.c, src/memline.c, src/misc1.c,
+ src/move.c, src/netbeans.c, src/normal.c, src/option.c,
+ src/quickfix.c, src/screen.c, src/spell.c, src/term.c,
+ src/window.c, src/workshop.c
+
+Patch 7.4.2102 (after 7.4.2101)
+Problem: Tiny build with GUI fails.
+Solution: Revert one FOR_ALL_ change.
+Files: src/gui.c
+
+Patch 7.4.2103
+Problem: Can't have "augroup END" right after ":au!".
+Solution: Check for the bar character before the command argument.
+Files: src/fileio.c, src/testdir/test_autocmd.vim,
+ runtime/doc/autocmd.txt
+
+Patch 7.4.2104
+Problem: Code duplication when unreferencing a function.
+Solution: De-duplicate.
+Files: src/userfunc.c
+
+Patch 7.4.2105
+Problem: Configure reports default features to be "normal" while it is
+ "huge".
+Solution: Change the default text. Build with newer autoconf.
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.2106
+Problem: Clang warns about missing field in initializer.
+Solution: Define COMMA and use it. (Kazunobu Kuriyama)
+Files: src/ex_cmds.c, src/globals.h, src/vim.h
+
+Patch 7.4.2107 (after 7.4.2106)
+Problem: Misplaced equal sign.
+Solution: Remove it.
+Files: src/globals.h
+
+Patch 7.4.2108
+Problem: Netbeans test is flaky.
+Solution: Wait for the cursor to be positioned.
+Files: src/testdir/test_netbeans.vim
+
+Patch 7.4.2109
+Problem: Setting 'display' to "lastline" is a drastic change, while
+ omitting it results in lots of "@" lines.
+Solution: Add "truncate" to show "@@@" for a truncated line.
+Files: src/option.h, src/screen.c, runtime/doc/options.txt
+
+Patch 7.4.2110
+Problem: When there is an CmdUndefined autocmd then the error for a missing
+ command is E464 instead of E492. (Manuel Ortega)
+Solution: Don't let the pointer be NULL.
+Files: src/ex_docmd.c, src/testdir/test_usercommands.vim
+
+Patch 7.4.2111
+Problem: Defaults are very conservative.
+Solution: Move settings from vimrc_example.vim to defaults.vim. Load
+ defaults.vim if no .vimrc was found.
+Files: src/main.c, src/version.c, src/os_amiga.h, src/os_dos.h,
+ src/os_mac.h, src/os_unix.h, src/feature.h, src/Makefile,
+ runtime/vimrc_example.vim, runtime/defaults.vim,
+ runtime/evim.vim, Filelist, runtime/doc/starting.txt
+
+Patch 7.4.2112
+Problem: getcompletion(.., 'dir') returns a match with trailing "*" when
+ there are no matches. (Chdiza)
+Solution: Return an empty list when there are no matches. Add a trailing
+ slash to directories. (Yegappan Lakshmanan) Add tests for no
+ matches. (closes #947)
+Files: src/evalfunc.c, src/testdir/test_cmdline.vim
+
+Patch 7.4.2113
+Problem: Test for undo is flaky.
+Solution: Turn it into a new style test. Use test_settime() to avoid
+ flakiness.
+Files: src/Makefile, src/undo.c, src/testdir/test61.in,
+ src/testdir/test61.ok, src/testdir/test_undo.vim,
+ src/testdir/test_undolevels.vim, src/testdir/Make_all.mak,
+ src/testdir/test_alot.vim
+
+Patch 7.4.2114
+Problem: Tiny build fails.
+Solution: Always include vim_time().
+Files: src/ex_cmds.c
+
+Patch 7.4.2115
+Problem: Loading defaults.vim with -C argument.
+Solution: Don't load the defaults script with -C argument. Test sourcing
+ the defaults script. Set 'display' to "truncate".
+Files: src/main.c, src/Makefile, runtime/defaults.vim,
+ src/testdir/test_startup.vim, src/testdir/Make_all.mak
+
+Patch 7.4.2116
+Problem: The default vimrc for Windows is very conservative.
+Solution: Use the defaults.vim in the Windows installer.
+Files: src/dosinst.c
+
+Patch 7.4.2117
+Problem: Deleting an augroup that still has autocmds does not give a
+ warning. The next defined augroup takes its place.
+Solution: Give a warning and prevent the index being used for another group
+ name.
+Files: src/fileio.c, src/testdir/test_autocmd.vim
+
+Patch 7.4.2118
+Problem: Mac: can't build with tiny features.
+Solution: Don't define FEAT_CLIPBOARD unconditionally. (Kazunobu Kuriyama)
+Files: src/vim.h
+
+Patch 7.4.2119
+Problem: Closures are not supported.
+Solution: Capture variables in lambdas from the outer scope. (Yasuhiro
+ Matsumoto, Ken Takata)
+Files: runtime/doc/eval.txt, src/eval.c, src/ex_cmds2.c, src/globals.h,
+ src/proto/eval.pro, src/proto/userfunc.pro,
+ src/testdir/test_lambda.vim, src/userfunc.c
+
+Patch 7.4.2120
+Problem: User defined functions can't be a closure.
+Solution: Add the "closure" argument. Allow using :unlet on a bound
+ variable. (Yasuhiro Matsumoto, Ken Takata)
+Files: runtime/doc/eval.txt, src/testdir/test_lambda.vim, src/userfunc.c,
+ src/eval.c src/proto/userfunc.pro
+
+Patch 7.4.2121
+Problem: No easy way to check if lambda and closure are supported.
+Solution: Add the +lambda feature.
+Files: src/evalfunc.c, src/version.c, src/testdir/test_lambda.vim
+
+Patch 7.4.2122 (after 7.4.2118)
+Problem: Mac: don't get +clipboard in huge build.
+Solution: Move #define down below including feature.h
+Files: src/vim.h
+
+Patch 7.4.2123
+Problem: No new style test for diff mode.
+Solution: Add a test. Check that folds are in sync.
+Files: src/Makefile, src/testdir/test_diffmode.vim,
+ src/testdir/Make_all.mak, src/testdir/test47.in,
+ src/testdir/test47.ok
+
+Patch 7.4.2124
+Problem: diffmode test leaves files behind, breaking another test.
+Solution: Delete the files.
+Files: src/testdir/test_diffmode.vim
+
+Patch 7.4.2125
+Problem: Compiler warning for loss of data.
+Solution: Add a type cast. (Christian Brabandt)
+Files: src/message.c
+
+Patch 7.4.2126
+Problem: No tests for :diffget and :diffput
+Solution: Add tests.
+Files: src/testdir/test_diffmode.vim
+
+Patch 7.4.2127
+Problem: The short form of ":noswapfile" is ":noswap" instead of ":nos".
+ (Kent Sibilev)
+Solution: Only require three characters. Add a test for the short forms.
+Files: src/ex_docmd.c, src/testdir/test_usercommands.vim
+
+Patch 7.4.2128
+Problem: Memory leak when saving for undo fails.
+Solution: Free allocated memory. (Hirohito Higashi)
+Files: src/ex_cmds.c
+
+Patch 7.4.2129
+Problem: Memory leak when using timer_start(). (Dominique Pelle)
+Solution: Don't copy the callback when using a partial.
+Files: src/evalfunc.c
+
+Patch 7.4.2130
+Problem: Pending timers cause false memory leak reports.
+Solution: Free all timers on exit.
+Files: src/ex_cmds2.c, src/proto/ex_cmds2.pro, src/misc2.c
+
+Patch 7.4.2131
+Problem: More memory leaks when using partial, e.g. for "exit-cb".
+Solution: Don't copy the callback when using a partial.
+Files: src/channel.c
+
+Patch 7.4.2132
+Problem: test_partial has memory leaks reported.
+Solution: Add a note about why this happens.
+Files: src/testdir/test_partial.vim
+
+Patch 7.4.2133 (after 7.4.2128)
+Problem: Can't build with tiny features.
+Solution: Add #ifdef.
+Files: src/ex_cmds.c
+
+Patch 7.4.2134
+Problem: No error for using function() badly.
+Solution: Check for passing wrong function name. (Ken Takata)
+Files: src/eval.c, src/evalfunc.c, src/proto/userfunc.pro,
+ src/testdir/test_expr.vim, src/userfunc.c, src/vim.h
+
+Patch 7.4.2135
+Problem: Various tiny issues.
+Solution: Update comments, white space, etc.
+Files: src/diff.c, src/digraph.c, src/testdir/test80.in,
+ src/testdir/test_channel.vim, src/testdir/Makefile,
+ runtime/menu.vim, src/INSTALLpc.txt, src/xpm/README.txt
+
+Patch 7.4.2136
+Problem: Closure function fails.
+Solution: Don't reset uf_scoped when it points to another funccal.
+Files: src/userfunc.c, src/testdir/test_lambda.vim
+
+Patch 7.4.2137
+Problem: Using function() with a name will find another function when it is
+ redefined.
+Solution: Add funcref(). Refer to lambda using a partial. Fix several
+ reference counting issues.
+Files: src/vim.h, src/structs.h, src/userfunc.c, src/eval.c,
+ src/evalfunc.c, src/channel.c, src/proto/eval.pro,
+ src/proto/userfunc.pro, src/if_mzsch.c, src/regexp.c, src/misc2.c,
+ src/if_py_both.h, src/testdir/test_expr.vim, runtime/doc/eval.txt
+
+Patch 7.4.2138
+Problem: Test 86 and 87 fail.
+Solution: Call func_ref() also for regular functions.
+Files: src/if_py_both.h
+
+Patch 7.4.2139
+Problem: :delfunction causes illegal memory access.
+Solution: Correct logic when deciding to free a function.
+Files: src/userfunc.c, src/testdir/test_lambda.vim
+
+Patch 7.4.2140
+Problem: Tiny build fails.
+Solution: Add dummy typedefs.
+Files: src/structs.h
+
+Patch 7.4.2141
+Problem: Coverity reports bogus NULL check.
+Solution: When checking for a variable in the funccal scope don't pass the
+ varname.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/eval.c
+
+Patch 7.4.2142
+Problem: Leaking memory when redefining a function.
+Solution: Don't increment the function reference count when it's found by
+ name. Don't remove the wrong function from the hashtab. More
+ reference counting fixes.
+Files: src/structs.h, src/userfunc.c
+
+Patch 7.4.2143
+Problem: A funccal is garbage collected while it can still be used.
+Solution: Set copyID in all referenced functions. Do not list lambda
+ functions with ":function".
+Files: src/userfunc.c, src/proto/userfunc.pro, src/eval.c,
+ src/testdir/test_lambda.vim
+
+Patch 7.4.2144
+Problem: On MS-Windows quickfix does not handle a line with 1023 bytes
+ ending in CR-LF properly.
+Solution: Don't consider CR a line break. (Ken Takata)
+Files: src/quickfix.c
+
+Patch 7.4.2145
+Problem: Win32: Using CreateThread/ExitThread is not safe.
+Solution: Use _beginthreadex and return from the thread. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.2146
+Problem: Not enough testing for popup menu. CTRL-E does not always work
+ properly.
+Solution: Add more tests. When using CTRL-E check if the popup menu is
+ visible. (Christian Brabandt)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 7.4.2147 (after 7.4.2146)
+Problem: test_alot fails.
+Solution: Close window.
+Files: src/testdir/test_popup.vim
+
+Patch 7.4.2148
+Problem: Not much testing for cscope.
+Solution: Add a test that uses the cscope program. (Christian Brabandt)
+Files: src/testdir/test_cscope.vim
+
+Patch 7.4.2149
+Problem: If a test leaves a window open a following test may fail.
+Solution: Always close extra windows after running a test.
+Files: src/testdir/runtest.vim, src/testdir/test_popup.vim
+
+Patch 7.4.2150
+Problem: Warning with MinGW 64. (John Marriott)
+Solution: Change return type. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 7.4.2151
+Problem: Quickfix test fails on MS-Windows.
+Solution: Close the help window. (Christian Brabandt)
+Files: src/testdir/test_quickfix.vim
+
+Patch 7.4.2152
+Problem: No proper translation of messages with a count.
+Solution: Use ngettext(). (Sergey Alyoshin)
+Files: src/evalfunc.c, src/fold.c, src/os_win32.c, src/screen.c, src/vim.h
+
+Patch 7.4.2153
+Problem: GUI test isn't testing much.
+Solution: Turn into a new style test. Execute a shell command.
+Files: src/testdir/test_gui.vim, src/testdir/test16.in,
+ src/testdir/test16.ok, src/testdir/Make_all.mak, src/Makefile,
+ src/testdir/Make_vms.mms
+
+Patch 7.4.2154
+Problem: Test_communicate() fails sometimes.
+Solution: Add it to the flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 7.4.2155
+Problem: Quotes make GUI test fail on MS-Windows.
+Solution: Remove quotes, strip white space.
+Files: src/testdir/test_gui.vim
+
+Patch 7.4.2156
+Problem: Compiler warning.
+Solution: Add type cast. (Ken Takata, Mike Williams)
+Files: src/os_win32.c
+
+Patch 7.4.2157
+Problem: Test_job_start_fails() is expected to report memory leaks, making
+ it hard to see other leaks in test_partial.
+Solution: Move Test_job_start_fails() to a separate test file.
+Files: src/testdir/test_partial.vim, src/testdir/test_job_fails.vim,
+ src/Makefile, src/testdir/Make_all.mak
+
+Patch 7.4.2158
+Problem: Result of getcompletion('', 'cscope') depends on previous
+ completion. (Christian Brabandt)
+Solution: Call set_context_in_cscope_cmd().
+Files: src/evalfunc.c, src/testdir/test_cmdline.vim
+
+Patch 7.4.2159
+Problem: Insufficient testing for cscope.
+Solution: Add more tests. (Dominique Pelle)
+Files: src/testdir/test_cscope.vim
+
+Patch 7.4.2160
+Problem: setmatches() mixes up values. (Nikolai Pavlov)
+Solution: Save the string instead of reusing a shared buffer.
+Files: src/dict.c, src/evalfunc.c, src/testdir/test_expr.vim,
+
+Patch 7.4.2161 (after 7.4.2160)
+Problem: Expression test fails without conceal feature.
+Solution: Only check "conceal" with the conceal feature.
+Files: src/testdir/test_expr.vim
+
+Patch 7.4.2162
+Problem: Result of getcompletion('', 'sign') depends on previous
+ completion.
+Solution: Call set_context_in_sign_cmd(). (Dominique Pelle)
+Files: src/evalfunc.c, src/testdir/test_cmdline.vim
+
+Patch 7.4.2163
+Problem: match() and related functions tested with old style test.
+Solution: Convert to new style test. (Hirohito Higashi)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/test63.in,
+ src/testdir/test63.ok, src/testdir/test_alot.vim,
+ src/testdir/test_match.vim, src/testdir/test_matchstrpos.vim
+
+Patch 7.4.2164
+Problem: It is not possible to use plugins in an "after" directory to tune
+ the behavior of a package.
+Solution: First load plugins from non-after directories, then packages and
+ finally plugins in after directories.
+ Reset 'loadplugins' before executing --cmd arguments.
+Files: src/main.c, src/vim.h, src/ex_cmds2.c, src/testdir/Makefile,
+ src/testdir/shared.vim, src/testdir/test_startup.vim,
+ src/testdir/setup.vim, runtime/doc/starting.txt
+
+Patch 7.4.2165 (after 7.4.2164)
+Problem: Startup test fails on MS-Windows.
+Solution: Don't check output if RunVim() returns zero.
+Files: src/testdir/test_startup.vim
+
+Patch 7.4.2166 (after 7.4.2164)
+Problem: Small build can't run startup test.
+Solution: Skip the test.
+Files: src/testdir/test_startup.vim
+
+Patch 7.4.2167 (after 7.4.2164)
+Problem: Small build can't run tests.
+Solution: Don't try setting 'packpath'.
+Files: src/testdir/setup.vim
+
+Patch 7.4.2168
+Problem: Not running the startup test on MS-Windows.
+Solution: Write vimcmd.
+Files: src/testdir/Make_ming.mak, src/testdir/Make_dos.mak
+
+Patch 7.4.2169 (after 7.4.2168)
+Problem: Startup test gets stuck on MS-Windows.
+Solution: Use double quotes.
+Files: src/testdir/shared.vim, src/testdir/test_startup.vim
+
+Patch 7.4.2170
+Problem: Cannot get information about timers.
+Solution: Add timer_info().
+Files: src/evalfunc.c, src/ex_cmds2.c, src/proto/ex_cmds2.pro,
+ runtime/doc/eval.txt
+
+Patch 7.4.2171 (after 7.4.2170)
+Problem: MS-Windows build fails.
+Solution: Add QueryPerformanceCounter().
+Files: src/ex_cmds2.c
+
+Patch 7.4.2172
+Problem: No test for "vim --help".
+Solution: Add a test.
+Files: src/testdir/test_startup.vim, src/testdir/shared.vim
+
+Patch 7.4.2173 (after 7.4.2172)
+Problem: Can't test help on MS-Windows.
+Solution: Skip the test.
+Files: src/testdir/test_startup.vim
+
+Patch 7.4.2174
+Problem: Adding duplicate flags to 'whichwrap' leaves commas behind.
+Solution: Also remove the commas. (Naruhiko Nishino)
+Files: src/Makefile, src/option.c, src/testdir/Make_all.mak,
+ src/testdir/test_alot.vim, src/testdir/test_options.in,
+ src/testdir/test_options.ok, src/testdir/test_options.vim
+
+Patch 7.4.2175
+Problem: Insufficient testing of cscope.
+Solution: Add more tests. (Dominique Pelle)
+Files: src/testdir/test_cscope.vim
+
+Patch 7.4.2176
+Problem: #ifdefs in main() are complicated.
+Solution: Always define vim_main2(). Move params to the file level.
+ (suggested by Ken Takata)
+Files: src/main.c, src/structs.h, src/vim.h, src/if_mzsch.c,
+ src/proto/if_mzsch.pro
+
+Patch 7.4.2177
+Problem: No testing for -C and -N command line flags, file arguments,
+ startuptime.
+Solution: Add tests.
+Files: src/testdir/test_startup.vim, src/testdir/shared.vim
+
+Patch 7.4.2178
+Problem: No test for reading from stdin.
+Solution: Add a test.
+Files: src/testdir/test_startup.vim, src/testdir/shared.vim
+
+Patch 7.4.2179 (after 7.4.2178)
+Problem: Reading from stdin test fails on MS-Windows.
+Solution: Strip the extra space.
+Files: src/testdir/test_startup.vim
+
+Patch 7.4.2180
+Problem: There is no easy way to stop all timers. There is no way to
+ temporary pause a timer.
+Solution: Add timer_stopall() and timer_pause().
+Files: src/evalfunc.c, src/ex_cmds2.c, src/proto/ex_cmds2.pro,
+ src/structs.h, src/testdir/test_timers.vim,
+ src/testdir/shared.vim, runtime/doc/eval.txt
+
+Patch 7.4.2181
+Problem: Compiler warning for unused variable.
+Solution: Remove it. (Dominique Pelle)
+Files: src/ex_cmds2.c
+
+Patch 7.4.2182
+Problem: Color Grey40 used in startup but not in the short list.
+Solution: Add Grey40 to the builtin colors.
+Files: src/term.c
+
+Patch 7.4.2183
+Problem: Sign tests are old style.
+Solution: Turn them into new style tests. (Dominique Pelle)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/test_signs.in,
+ src/testdir/test_signs.ok, src/testdir/test_signs.vim,
+
+Patch 7.4.2184
+Problem: Tests that use RunVim() do not actually perform the test.
+Solution: Use "return" instead of "call". (Ken Takata)
+Files: src/testdir/shared.vim
+
+Patch 7.4.2185
+Problem: Test glob2regpat does not test much.
+Solution: Add a few more test cases. (Dominique Pelle)
+Files: src/testdir/test_glob2regpat.vim
+
+Patch 7.4.2186
+Problem: Timers test is flaky.
+Solution: Relax the sleep time check.
+Files: src/testdir/test_timers.vim
+
+Patch 7.4.2187 (after 7.4.2185)
+Problem: glob2regpat test fails on Windows.
+Solution: Remove the checks that use backslashes.
+Files: src/testdir/test_glob2regpat.vim
+
+Patch 7.4.2188 (after 7.4.2146)
+Problem: Completion does not work properly with some plugins.
+Solution: Revert the part related to typing CTRL-E. (closes #972)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 7.4.2189
+Problem: Cannot detect encoding in a fifo.
+Solution: Extend the stdin way of detecting encoding to fifo. Add a test
+ for detecting encoding on stdin and fifo. (Ken Takata)
+Files: src/buffer.c, src/fileio.c, src/Makefile,
+ src/testdir/Make_all.mak, src/testdir/test_startup_utf8.vim,
+ src/vim.h
+
+Patch 7.4.2190
+Problem: When startup test fails it's not easy to find out why.
+ GUI test fails with Gnome.
+Solution: Add the help entry matches to a list an assert that.
+ Set $HOME for Gnome to create .gnome2 directory.
+Files: src/testdir/test_startup.vim, src/testdir/test_gui.vim
+
+Patch 7.4.2191
+Problem: No automatic prototype for vim_main2().
+Solution: Move the #endif. (Ken Takata)
+Files: src/main.c, src/vim.h, src/proto/main.pro
+
+Patch 7.4.2192
+Problem: Generating prototypes with Cygwin doesn't work well.
+Solution: Change #ifdefs. (Ken Takata)
+Files: src/gui.h, src/gui_w32.c, src/ops.c, src/proto/fileio.pro,
+ src/proto/message.pro, src/proto/normal.pro, src/proto/ops.pro,
+ src/vim.h
+
+Patch 7.4.2193
+Problem: With Gnome when the GUI can't start test_startup hangs.
+Solution: Call gui_mch_early_init_check(). (Hirohito Higashi)
+Files: src/gui.c, src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro
+
+Patch 7.4.2194
+Problem: Sign tests don't cover enough.
+Solution: Add more test cases. (Dominique Pelle)
+Files: src/testdir/test_signs.vim
+
+Patch 7.4.2195
+Problem: MS-Windows: The vimrun program does not support Unicode.
+Solution: Use GetCommandLineW(). Cleanup old #ifdefs. (Ken Takata)
+Files: src/vimrun.c
+
+Patch 7.4.2196
+Problem: glob2regpat test doesn't test everything on MS-Windows.
+Solution: Add patterns with backslash handling.
+Files: src/testdir/test_glob2regpat.vim
+
+Patch 7.4.2197
+Problem: All functions are freed on exit, which may hide leaks.
+Solution: Only free named functions, not reference counted ones.
+Files: src/userfunc.c
+
+Patch 7.4.2198
+Problem: Test alot sometimes fails under valgrind. (Dominique Pelle)
+Solution: Avoid passing a callback with the wrong number of arguments.
+Files: src/testdir/test_partial.vim
+
+Patch 7.4.2199
+Problem: In the GUI the cursor is hidden when redrawing any window,
+ causing flicker.
+Solution: Only undraw the cursor when updating the window it's in.
+Files: src/screen.c, src/gui.c, src/proto/gui.pro, src/gui_gtk_x11.c
+
+Patch 7.4.2200
+Problem: Cannot get all information about a quickfix list.
+Solution: Add an optional argument to get/set loc/qf list(). (Yegappan
+ Lakshmanan)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/proto/quickfix.pro,
+ src/quickfix.c, src/tag.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.2201
+Problem: The sign column disappears when the last sign is deleted.
+Solution: Add the 'signcolumn' option. (Christian Brabandt)
+Files: runtime/doc/options.txt, runtime/optwin.vim, src/edit.c,
+ src/move.c, src/option.c, src/option.h, src/proto/option.pro,
+ src/screen.c, src/structs.h, src/testdir/test_options.vim
+
+Patch 7.4.2202
+Problem: Build fails with small features.
+Solution: Correct option initialization.
+Files: src/option.c
+
+Patch 7.4.2203
+Problem: Test fails with normal features.
+Solution: Check is signs are supported.
+Files: src/testdir/test_options.vim
+
+Patch 7.4.2204
+Problem: It is not easy to get information about buffers, windows and
+ tabpages.
+Solution: Add getbufinfo(), getwininfo() and gettabinfo(). (Yegappan
+ Lakshmanan)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/dict.c,
+ src/evalfunc.c, src/option.c, src/proto/dict.pro,
+ src/proto/option.pro, src/proto/window.pro,
+ src/testdir/Make_all.mak, src/testdir/test_bufwintabinfo.vim,
+ src/window.c, src/Makefile
+
+Patch 7.4.2205
+Problem: 'wildignore' always applies to getcompletion().
+Solution: Add an option to use 'wildignore' or not. (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_cmdline.vim
+
+Patch 7.4.2206
+Problem: Warning for unused function.
+Solution: Put the function inside #ifdef. (John Marriott)
+Files: src/evalfunc.c
+
+Patch 7.4.2207
+Problem: The +xpm feature is not sorted properly in :version output.
+Solution: Move it up. (Tony Mechelynck)
+Files: src/version.c
+
+Patch 7.4.2208
+Problem: Test for mappings is old style.
+Solution: Convert the test to new style.
+Files: src/testdir/test_mapping.vim, src/testdir/test_mapping.in,
+ src/testdir/test_mapping.ok, src/Makefile,
+ src/testdir/test_alot.vim, src/testdir/Make_all.mak
+
+Patch 7.4.2209
+Problem: Cannot map <M-">. (Stephen Riehm)
+Solution: Solve the memory access problem in another way. (Dominique Pelle)
+ Allow for using <M-\"> in a string.
+Files: src/eval.c, src/gui_mac.c, src/misc2.c, src/option.c,
+ src/proto/misc2.pro, src/syntax.c, src/term.c,
+ src/testdir/test_mapping.vim
+
+Patch 7.4.2210
+Problem: On OSX configure mixes up a Python framework and the Unix layout.
+Solution: Make configure check properly. (Tim D. Smith, closes #980)
+Files: src/configure.in, src/auto/configure
+
+Patch 7.4.2211
+Problem: Mouse support is not automatically enabled with simple term.
+Solution: Recognize "st" and other names. (Manuel Schiller, closes #963)
+Files: src/os_unix.c
+
+Patch 7.4.2212
+Problem: Mark " is not set when closing a window in another tab. (Guraga)
+Solution: Check all tabs for the window to be valid. (based on patch by
+ Hirohito Higashi, closes #974)
+Files: src/window.c, src/proto/window.pro, src/buffer.c,
+ src/testdir/test_viminfo.vim
+
+Patch 7.4.2213
+Problem: Cannot highlight the "~" lines at the end of a window differently.
+Solution: Add the EndOfBuffer highlighting. (Marco Hinz, James McCoy)
+Files: runtime/doc/options.txt, runtime/doc/syntax.txt, src/option.c,
+ src/screen.c, src/syntax.c, src/vim.h
+
+Patch 7.4.2214
+Problem: A font that uses ligatures messes up the screen display.
+Solution: Put spaces between characters when building the glyph table.
+ (based on a patch from Manuel Schiller)
+Files: src/gui_gtk_x11.c
+
+Patch 7.4.2215
+Problem: It's not easy to find out if a window is a quickfix or location
+ list window.
+Solution: Add "loclist" and "quickfix" entries to the dict returned by
+ getwininfo(). (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_bufwintabinfo.vim
+
+Patch 7.4.2216 (after 7.4.2215)
+Problem: Test fails without the +sign feature.
+Solution: Only check for signcolumn with the +sign feature.
+Files: src/testdir/test_bufwintabinfo.vim
+
+Patch 7.4.2217
+Problem: When using matchaddpos() a character after the end of the line can
+ be highlighted.
+Solution: Only highlight existing characters. (Hirohito Higashi)
+Files: src/screen.c, src/structs.h, src/testdir/test_match.vim
+
+Patch 7.4.2218
+Problem: Can't build with +timers when +digraph is not included.
+Solution: Change #ifdef for e_number_exp. (Damien)
+Files: src/globals.h
+
+Patch 7.4.2219
+Problem: Recursive call to substitute gets stuck in sandbox. (Nikolai
+ Pavlov)
+Solution: Handle the recursive call. (Christian Brabandt, closes #950)
+ Add a test.
+Files: src/ex_cmds.c, src/testdir/test_regexp_latin.vim
+
+Patch 7.4.2220
+Problem: printf() gives an error when the argument for %s is not a string.
+ (Ozaki Kiichi)
+Solution: Behave like invoking string() on the argument. (Ken Takata)
+Files: runtime/doc/eval.txt, src/message.c, src/testdir/test_expr.vim
+
+Patch 7.4.2221
+Problem: printf() does not support binary format.
+Solution: Add %b and %B. (Ozaki Kiichi)
+Files: runtime/doc/eval.txt, src/message.c, src/testdir/test_expr.vim
+
+Patch 7.4.2222
+Problem: Sourcing a script where a character has 0x80 as a second byte does
+ not work. (Filipe L B Correia)
+Solution: Turn 0x80 into K_SPECIAL KS_SPECIAL KE_FILLER. (Christian
+ Brabandt, closes #728) Add a test case.
+Files: src/getchar.c, src/proto/getchar.pro, src/misc1.c,
+ src/testdir/test_regexp_utf8.vim
+
+Patch 7.4.2223
+Problem: Buffer overflow when using latin1 character with feedkeys().
+Solution: Check for an illegal character. Add a test.
+Files: src/testdir/test_regexp_utf8.vim, src/testdir/test_source_utf8.vim,
+ src/testdir/test_alot_utf8.vim, src/Makefile, src/getchar.c,
+ src/macros.h, src/evalfunc.c, src/os_unix.c, src/os_win32.c,
+ src/spell.c,
+
+Patch 7.4.2224
+Problem: Compiler warnings with older compiler and 64 bit numbers.
+Solution: Add "LL" to large values. (Mike Williams)
+Files: src/eval.c, src/evalfunc.c
+
+Patch 7.4.2225
+Problem: Crash when placing a sign in a deleted buffer.
+Solution: Check for missing buffer name. (Dominique Pelle). Add a test.
+Files: src/ex_cmds.c, src/testdir/test_signs.vim
+
+Patch 7.4.2226
+Problem: The field names used by getbufinfo(), gettabinfo() and
+ getwininfo() are not consistent.
+Solution: Use bufnr, winnr and tabnr. (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_bufwintabinfo.vim
+
+Patch 7.4.2227
+Problem: Tab page tests are old style.
+Solution: Change into new style tests. (Hirohito Higashi)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/test62.in,
+ src/testdir/test62.ok, src/testdir/test_alot.vim,
+ src/testdir/test_tabpage.vim
+
+Patch 7.4.2228
+Problem: Test files have inconsistent modelines.
+Solution: Don't set 'tabstop' to 2, use 'sts' and 'sw'.
+Files: src/testdir/README.txt, src/testdir/test_backspace_opt.vim,
+ src/testdir/test_digraph.vim, src/testdir/test_gn.vim
+ src/testdir/test_help_tagjump.vim,
+ src/testdir/test_increment_dbcs.vim,
+ src/testdir/test_increment.vim, src/testdir/test_match.vim,
+ src/testdir/test_tagjump.vim, src/testdir/test_window_cmd.vim,
+ src/testdir/test_regexp_latin.vim, src/testdir/test_timers.vim
+
+Patch 7.4.2229
+Problem: Startup test fails on Solaris.
+Solution: Recognize a character device. (Danek Duvall)
+Files: src/buffer.c, src/fileio.c, src/proto/fileio.pro, src/vim.h
+
+Patch 7.4.2230
+Problem: There is no equivalent of 'smartcase' for a tag search.
+Solution: Add value "followscs" and "smart" to 'tagcase'. (Christian
+ Brabandt, closes #712) Turn tagcase test into new style.
+Files: runtime/doc/options.txt, runtime/doc/tagsrch.txt, src/option.h,
+ src/tag.c, src/search.c, src/proto/search.pro,
+ src/testdir/test_tagcase.in, src/testdir/test_tagcase.ok,
+ src/testdir/test_tagcase.vim, src/Makefile,
+ src/testdir/Make_all.mak, src/testdir/test_alot.vim
+
+Patch 7.4.2231
+Problem: ":oldfiles" output is a very long list.
+Solution: Add a pattern argument. (Coot, closes #575)
+Files: runtime/doc/starting.txt, src/ex_cmds.h, src/eval.c,
+ src/ex_cmds.c, src/proto/eval.pro, src/proto/ex_cmds.pro,
+ src/testdir/test_viminfo.vim
+
+Patch 7.4.2232
+Problem: The default ttimeoutlen is very long.
+Solution: Use "100". (Hirohito Higashi)
+Files: runtime/defaults.vim
+
+Patch 7.4.2233
+Problem: Crash when using funcref() with invalid name. (Dominique Pelle)
+Solution: Check for NULL translated name.
+Files: src/evalfunc.c, src/testdir/test_expr.vim
+
+Patch 7.4.2234
+Problem: Can't build with +eval but without +quickfix. (John Marriott)
+Solution: Move skip_vimgrep_pat() to separate #ifdef block.
+Files: src/quickfix.c
+
+Patch 7.4.2235
+Problem: submatch() does not check for a valid argument.
+Solution: Give an error if the argument is out of range. (Dominique Pelle)
+Files: src/evalfunc.c, src/testdir/test_expr.vim
+
+Patch 7.4.2236
+Problem: The 'langnoremap' option leads to double negatives. And it does
+ not work for the last character of a mapping.
+Solution: Add 'langremap' with the opposite value. Keep 'langnoremap' for
+ backwards compatibility. Make it work for the last character of a
+ mapping. Make the test work.
+Files: runtime/doc/options.txt, runtime/defaults.vim, src/option.c,
+ src/option.h, src/macros.h, src/testdir/test_mapping.vim
+
+Patch 7.4.2237
+Problem: Can't use "." and "$" with ":tab".
+Solution: Support a range for ":tab". (Hirohito Higashi)
+Files: runtime/doc/tabpage.txt, src/ex_docmd.c,
+ src/testdir/test_tabpage.vim
+
+Patch 7.4.2238
+Problem: With SGR mouse reporting (suckless terminal) the mouse release and
+ scroll up/down is confused.
+Solution: Don't see a release as a scroll up/down. (Ralph Eastwood)
+Files: src/term.c
+
+Patch 7.4.2239
+Problem: Warning for missing declaration of skip_vimgrep_pat(). (John
+ Marriott)
+Solution: Move it to another file.
+Files: src/quickfix.c, src/proto/quickfix.pro, src/ex_cmds.c,
+ src/proto/ex_cmds.pro
+
+Patch 7.4.2240
+Problem: Tests using the sleep time can be flaky.
+Solution: Use reltime() if available. (Partly by Shane Harper)
+Files: src/testdir/shared.vim, src/testdir/test_timers.vim
+
+Patch 7.4.2241 (after 7.4.2240)
+Problem: Timer test sometimes fails.
+Solution: Increase the maximum time for repeating timer.
+Files: src/testdir/test_timers.vim
+
+Patch 7.4.2242 (after 7.4.2240)
+Problem: Timer test sometimes fails.
+Solution: Increase the maximum time for callback timer test.
+Files: src/testdir/test_timers.vim
+
+Patch 7.4.2243
+Problem: Warning for assigning negative value to unsigned. (Danek Duvall)
+Solution: Make cterm_normal_fg_gui_color and _bg_ guicolor_T, cast to long_u
+ only when an unsigned is needed.
+Files: src/structs.h, src/globals.h, src/screen.c, src/term.c,
+ src/syntax.c, src/gui_gtk_x11.c, src/gui.c, src/gui_mac.c,
+ src/gui_photon.c, src/gui_w32.c, src/gui_x11.c,
+ src/proto/term.pro, src/proto/gui_gtk_x11.pro,
+ src/proto/gui_mac.pro, src/proto/gui_photon.pro,
+ src/proto/gui_w32.pro, src/proto/gui_x11.pro
+
+Patch 7.4.2244
+Problem: Adding pattern to ":oldfiles" is not a generic solution.
+Solution: Add the ":filter /pat/ cmd" command modifier. Only works for some
+ commands right now.
+Files: src/structs.h, src/ex_docmd.c, src/ex_cmds.h, src/message.c,
+ src/proto/message.pro, runtime/doc/starting.txt,
+ runtime/doc/various.txt, src/testdir/test_viminfo.vim,
+ src/testdir/test_alot.vim, src/testdir/test_filter_cmd.vim,
+ src/Makefile
+
+Patch 7.4.2245 (after 7.4.2244)
+Problem: Filter test fails.
+Solution: Include missing changes.
+Files: src/buffer.c
+
+Patch 7.4.2246 (after 7.4.2244)
+Problem: Oldfiles test fails.
+Solution: Include missing changes.
+Files: src/ex_cmds.c
+
+Patch 7.4.2247 (after 7.4.2244)
+Problem: Tiny build fails. (Tony Mechelynck)
+Solution: Remove #ifdef.
+Files: src/ex_cmds.c
+
+Patch 7.4.2248
+Problem: When cancelling the :ptjump prompt a preview window is opened for
+ a following command.
+Solution: Reset g_do_tagpreview. (Hirohito Higashi) Add a test. Avoid that
+ the test runner gets stuck in trying to close a window.
+Files: src/tag.c, src/testdir/test_tagjump.vim, src/testdir/runtest.vim
+
+Patch 7.4.2249
+Problem: Missing colon in error message.
+Solution: Add the colon. (Dominique Pelle)
+Files: src/userfunc.c
+
+Patch 7.4.2250
+Problem: Some error messages cannot be translated.
+Solution: Enclose them in _() and N_(). (Dominique Pelle)
+Files: src/channel.c, src/evalfunc.c, src/ex_cmds.c, src/spell.c,
+ src/window.c
+
+Patch 7.4.2251
+Problem: In rare cases diffing 4 buffers is not enough.
+Solution: Raise the limit to 8. (closes #1000)
+Files: src/structs.h, runtime/doc/diff.txt
+
+Patch 7.4.2252
+Problem: Compiler warnings for signed/unsigned in expression.
+Solution: Remove type cast. (Dominique Pelle)
+Files: src/vim.h
+
+Patch 7.4.2253
+Problem: Check for Windows 3.1 will always return false. (Christian
+ Brabandt)
+Solution: Remove the dead code.
+Files: src/gui_w32.c, src/evalfunc.c, src/ex_cmds.c, src/option.c,
+ src/os_win32.c, src/version.c, src/proto/gui_w32.pro
+
+Patch 7.4.2254
+Problem: Compiler warnings in MzScheme code.
+Solution: Add UNUSED. Remove unreachable code.
+Files: src/if_mzsch.c
+
+Patch 7.4.2255
+Problem: The script that checks translations can't handle plurals.
+Solution: Check for plural msgid and msgstr entries. Leave the cursor on
+ the first error.
+Files: src/po/check.vim
+
+Patch 7.4.2256
+Problem: Coverity complains about null pointer check.
+Solution: Remove wrong and superfluous error check.
+Files: src/eval.c
+
+Patch 7.4.2257
+Problem: Coverity complains about not checking for NULL.
+Solution: Check for out of memory.
+Files: src/if_py_both.h
+
+Patch 7.4.2258
+Problem: Two JSON messages are sent without a separator.
+Solution: Separate messages with a NL. (closes #1001)
+Files: src/json.c, src/channel.c, src/vim.h, src/testdir/test_channel.py,
+ src/testdir/test_channel.vim, runtime/doc/channel.txt
+
+Patch 7.4.2259
+Problem: With 'incsearch' can only see the next match.
+Solution: Make CTRL-N/CTRL-P move to the previous/next match. (Christian
+ Brabandt)
+Files: runtime/doc/cmdline.txt, src/ex_getln.c, src/testdir/Make_all.mak,
+ src/testdir/test_search.vim, src/Makefile
+
+Patch 7.4.2260 (after 7.4.2258)
+Problem: Channel test is flaky.
+Solution: Add a newline to separate JSON messages.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.2261 (after 7.4.2259)
+Problem: Build fails with small features.
+Solution: Move "else" inside the #ifdef.
+Files: src/ex_getln.c
+
+Patch 7.4.2262
+Problem: Fail to read register content from viminfo if it is 438 characters
+ long. (John Chen)
+Solution: Adjust the check for line wrapping. (closes #1010)
+Files: src/testdir/test_viminfo.vim, src/ex_cmds.c
+
+Patch 7.4.2263
+Problem: :filter does not work for many commands. Can only get matching
+ messages.
+Solution: Make :filter work for :command, :map, :list, :number and :print.
+ Make ":filter!" show non-matching lines.
+Files: src/getchar.c, src/ex_cmds.c, src/ex_cmds.h, src/ex_docmd.c,
+ src/message.c, src/structs.h, src/testdir/test_filter_cmd.vim
+
+Patch 7.4.2264
+Problem: When adding entries to an empty quickfix list the title is reset.
+Solution: Improve handling of the title. (Yegappan Lakshmanan)
+Files: src/testdir/test_quickfix.vim, src/quickfix.c
+
+Patch 7.4.2265
+Problem: printf() isn't tested much.
+Solution: Add more tests for printf(). (Dominique Pelle)
+Files: src/testdir/test_expr.vim
+
+Patch 7.4.2266 (after 7.4.2265)
+Problem: printf() test fails on Windows. "-inf" is not used.
+Solution: Check for Windows-specific values for "nan". Add sign to "inf"
+ when appropriate.
+Files: src/message.c, src/testdir/test_expr.vim
+
+Patch 7.4.2267 (after 7.4.2266)
+Problem: Build fails on MS-Windows.
+Solution: Add define to get isinf().
+Files: src/message.c
+
+Patch 7.4.2268 (after 7.4.2259)
+Problem: Using CTRL-N and CTRL-P for incsearch shadows completion keys.
+Solution: Use CTRL-T and CTRL-G instead.
+Files: runtime/doc/cmdline.txt, src/ex_getln.c,
+ src/testdir/test_search.vim
+
+Patch 7.4.2269
+Problem: Using 'hlsearch' highlighting instead of matchpos if there is no
+ search match.
+Solution: Pass NULL as last item to next_search_hl() when searching for
+ 'hlsearch' match. (Shane Harper, closes #1013)
+Files: src/screen.c, src/testdir/test_match.vim
+
+Patch 7.4.2270
+Problem: Insufficient testing for NUL bytes on a raw channel.
+Solution: Add a test for writing and reading.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.2271
+Problem: Netbeans test doesn't read settings from file.
+Solution: Use "-Xnbauth".
+Files: src/testdir/test_netbeans.vim
+
+Patch 7.4.2272
+Problem: getbufinfo(), getwininfo() and gettabinfo() are inefficient.
+Solution: Instead of making a copy of the variables dictionary, use a
+ reference.
+Files: src/evalfunc.c
+
+Patch 7.4.2273
+Problem: getwininfo() and getbufinfo() are inefficient.
+Solution: Do not make a copy of all window/buffer-local options. Make it
+ possible to get them with gettabwinvar() or getbufvar().
+Files: src/evalfunc.c, src/eval.c, src/testdir/test_bufwintabinfo.vim,
+ runtime/doc/eval.txt
+
+Patch 7.4.2274
+Problem: Command line completion on "find **/filename" drops sub-directory.
+Solution: Handle this case separately. (Harm te Hennepe, closes #932, closes
+ #939)
+Files: src/misc1.c, src/testdir/test_cmdline.vim
+
+Patch 7.4.2275
+Problem: ":diffoff!" does not remove filler lines.
+Solution: Force a redraw and invalidate the cursor. (closes #1014)
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 7.4.2276
+Problem: Command line test fails on Windows when run twice.
+Solution: Wipe the buffer so that the directory can be deleted.
+Files: src/testdir/test_cmdline.vim
+
+Patch 7.4.2277
+Problem: Memory leak in getbufinfo() when there is a sign. (Dominique
+ Pelle)
+Solution: Remove extra vim_strsave().
+Files: src/evalfunc.c
+
+Patch 7.4.2278
+Problem: New users have no idea of the 'scrolloff' option.
+Solution: Set 'scrolloff' in defaults.vim.
+Files: runtime/defaults.vim
+
+Patch 7.4.2279
+Problem: Starting diff mode with the cursor in the last line might end up
+ only showing one closed fold. (John Beckett)
+Solution: Scroll the window to show the same relative cursor position.
+Files: src/diff.c, src/window.c, src/proto/window.pro
+
+Patch 7.4.2280
+Problem: printf() doesn't handle infinity float values correctly.
+Solution: Add a table with possible infinity values. (Dominique Pelle)
+Files: src/message.c, src/testdir/test_expr.vim
+
+Patch 7.4.2281
+Problem: Timer test fails sometimes.
+Solution: Reduce minimum time by 1 msec.
+Files: src/testdir/test_timers.vim
+
+Patch 7.4.2282
+Problem: When a child process is very fast waiting 10 msec for it is
+ noticeable. (Ramel Eshed)
+Solution: Start waiting for 1 msec and gradually increase.
+Files: src/os_unix.c
+
+Patch 7.4.2283
+Problem: Part of ":oldfiles" command isn't cleared. (Lifepillar)
+Solution: Clear the rest of the line. (closes 1018)
+Files: src/ex_cmds.c
+
+Patch 7.4.2284
+Problem: Comment in scope header file is outdated. (KillTheMule)
+Solution: Point to the help instead. (closes #1017)
+Files: src/if_cscope.h
+
+Patch 7.4.2285
+Problem: Generated files are outdated.
+Solution: Generate the files. Avoid errors when generating prototypes.
+Files: src/if_mzsch.h, src/Makefile, src/option.h, src/os_mac_conv.c,
+ src/os_amiga.c, src/vim.h, src/structs.h, src/os_win32.c,
+ src/if_lua.c, src/proto/mbyte.pro
+
+Patch 7.4.2286
+Problem: The tee program isn't included. Makefile contains build
+ instructions that don't work.
+Solution: Update the Filelist and build instructions. Remove build
+ instructions for DOS and old Windows. Add the tee program.
+Files: Filelist, Makefile, nsis/gvim.nsi
+
+Patch 7.4.2287
+Problem: The callback passed to ch_sendraw() is not used.
+Solution: Pass the read part, not the send part. (haya14busa, closes #1019)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.2288
+Problem: MS-Windows build instructions are clumsy. "dosbin" doesn't build.
+Solution: Add rename.bat. Fix building "dosbin".
+Files: Makefile, Filelist, rename.bat
+
+Patch 7.4.2289
+Problem: When installing and $DESTDIR is set the icons probably won't be
+ installed.
+Solution: Create the icon directories if $DESTDIR is not empty. (Danek
+ Duvall)
+Files: src/Makefile
+
+Patch 7.4.2290
+Problem: Compiler warning in tiny build. (Tony Mechelynck)
+Solution: Add #ifdef around infinity_str().
+Files: src/message.c
+
+Patch 7.4.2291
+Problem: printf() handles floats wrong when there is a sign.
+Solution: Fix placing the sign. Add tests. (Dominique Pelle)
+Files: src/testdir/test_expr.vim, runtime/doc/eval.txt, src/message.c
+
+Patch 7.4.2292 (after 7.4.2291)
+Problem: Not all systems understand %F in printf().
+Solution: Use %f.
+Files: src/message.c
+
+Patch 7.4.2293
+Problem: Modelines in source code are inconsistent.
+Solution: Use the same line in most files. Add 'noet'. (Naruhiko Nishino)
+Files: src/alloc.h, src/arabic.c, src/arabic.h, src/ascii.h,
+ src/blowfish.c, src/buffer.c, src/channel.c, src/charset.c,
+ src/crypt.c, src/crypt_zip.c, src/dict.c, src/diff.c,
+ src/digraph.c, src/dosinst.c, src/dosinst.h, src/edit.c,
+ src/eval.c, src/evalfunc.c, src/ex_cmds.c, src/ex_cmds.h,
+ src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c, src/ex_getln.c,
+ src/farsi.c, src/farsi.h, src/feature.h, src/fileio.c, src/fold.c,
+ src/getchar.c, src/glbl_ime.cpp, src/glbl_ime.h, src/globals.h,
+ src/gui.c, src/gui.h, src/gui_at_fs.c, src/gui_at_sb.c,
+ src/gui_at_sb.h, src/gui_athena.c, src/gui_beval.c,
+ src/gui_beval.h, src/gui_gtk.c, src/gui_gtk_f.c, src/gui_gtk_f.h,
+ src/gui_gtk_vms.h, src/gui_gtk_x11.c, src/gui_mac.c,
+ src/gui_motif.c, src/gui_photon.c, src/gui_w32.c, src/gui_x11.c,
+ src/gui_x11_pm.h, src/gui_xmdlg.c, src/gui_xmebw.c,
+ src/gui_xmebw.h, src/gui_xmebwp.h, src/hangulin.c, src/hardcopy.c,
+ src/hashtab.c, src/if_cscope.c, src/if_cscope.h, src/if_mzsch.c,
+ src/if_mzsch.h, src/if_ole.cpp, src/if_perl.xs, src/if_perlsfio.c,
+ src/if_python3.c, src/if_ruby.c, src/if_tcl.c, src/if_xcmdsrv.c,
+ src/integration.c, src/integration.h, src/iscygpty.c, src/json.c,
+ src/json_test.c, src/keymap.h, src/list.c, src/macros.h,
+ src/main.c, src/mark.c, src/mbyte.c, src/memfile.c,
+ src/memfile_test.c, src/memline.c, src/menu.c, src/message.c,
+ src/message_test.c, src/misc1.c, src/misc2.c, src/move.c,
+ src/nbdebug.c, src/nbdebug.h, src/netbeans.c, src/normal.c,
+ src/ops.c, src/option.c, src/option.h, src/os_amiga.c,
+ src/os_amiga.h, src/os_beos.c, src/os_beos.h, src/os_dos.h,
+ src/os_mac.h, src/os_mac_conv.c, src/os_macosx.m, src/os_mint.h,
+ src/os_mswin.c, src/os_qnx.c, src/os_qnx.h, src/os_unix.c,
+ src/os_unix.h, src/os_unixx.h, src/os_vms.c, src/os_w32dll.c,
+ src/os_w32exe.c, src/os_win32.c, src/os_win32.h, src/popupmnu.c,
+ src/proto.h, src/pty.c, src/quickfix.c, src/regexp.c,
+ src/regexp.h, src/regexp_nfa.c, src/screen.c, src/search.c,
+ src/sha256.c, src/spell.c, src/spell.h, src/spellfile.c,
+ src/structs.h, src/syntax.c, src/tag.c, src/term.c, src/term.h,
+ src/termlib.c, src/ui.c, src/undo.c, src/uninstal.c,
+ src/userfunc.c, src/version.c, src/version.h, src/vim.h,
+ src/vim.rc, src/vimio.h, src/vimrun.c, src/winclip.c,
+ src/window.c, src/workshop.c, src/workshop.h, src/wsdebug.c,
+ src/wsdebug.h, src/xpm_w32.c
+
+Patch 7.4.2294
+Problem: Sign test fails on MS-Windows when using the distributed zip
+ archives.
+Solution: Create dummy files instead of relying on files in the pixmaps
+ directory.
+Files: src/testdir/test_signs.vim
+
+Patch 7.4.2295 (after 7.4.2293)
+Problem: Cscope test fails.
+Solution: Avoid checking for specific line and column numbers.
+Files: src/testdir/test_cscope.vim
+
+Patch 7.4.2296
+Problem: No tests for :undolist and "U" command.
+Solution: Add tests. (Dominique Pelle)
+Files: src/testdir/test_undo.vim
+
+Patch 7.4.2297
+Problem: When starting a job that reads from a buffer and reaching the end,
+ the job hangs.
+Solution: Close the pipe or socket when all lines were read.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 7.4.2298
+Problem: It is not possible to close the "in" part of a channel.
+Solution: Add ch_close_in().
+Files: src/evalfunc.c, src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, runtime/doc/eval.txt,
+ runtime/doc/channel.txt
+
+Patch 7.4.2299
+Problem: QuickFixCmdPre and QuickFixCmdPost autocommands are not always
+ triggered.
+Solution: Also trigger on ":cexpr", ":cbuffer", etc. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 7.4.2300
+Problem: Get warning for deleting autocommand group when the autocommand
+ using the group is scheduled for deletion. (Pavol Juhas)
+Solution: Check for deleted autocommand.
+Files: src/fileio.c, src/testdir/test_autocmd.vim
+
+Patch 7.4.2301
+Problem: MS-Windows: some files remain after testing.
+Solution: Close the channel output file. Wait for the file handle to be
+ closed before deleting the file.
+Files: src/os_win32.c, src/testdir/test_channel.vim
+
+Patch 7.4.2302
+Problem: Default interface versions for MS-Windows are outdated.
+Solution: Use Active Perl 5.24, Python 3.5.2. Could only make it work with
+ Ruby 1.9.2.
+Files: src/bigvim.bat, src/bigvim64.bat, src/Make_mvc.mak
+
+Patch 7.4.2303
+Problem: When using "is" the mode isn't always updated.
+Solution: Redraw the command line. (Christian Brabandt)
+Files: src/search.c
+
+Patch 7.4.2304
+Problem: In a timer callback the timer itself can't be found or stopped.
+ (Thinca)
+Solution: Do not remove the timer from the list, remember whether it was
+ freed.
+Files: src/ex_cmds2.c, src/testdir/test_timers.vim
+
+Patch 7.4.2305
+Problem: Marks, writefile and nested function tests are old style.
+Solution: Turn them into new style tests. (Yegappan Lakshmanan)
+Files: src/testdir/Make_all.mak, src/testdir/test_marks.in,
+ src/testdir/test_marks.ok, src/testdir/test_marks.vim,
+ src/testdir/test_nested_function.in,
+ src/testdir/test_nested_function.ok,
+ src/testdir/test_nested_function.vim,
+ src/testdir/test_writefile.in, src/testdir/test_writefile.ok,
+ src/testdir/test_writefile.vim, src/Makefile
+
+Patch 7.4.2306
+Problem: Default value for 'langremap' is wrong.
+Solution: Set the right value. (Jürgen Krämer) Add a test.
+Files: src/option.c, src/testdir/test_mapping.vim
+
+Patch 7.4.2307
+Problem: Several tests are old style.
+Solution: Turn them into new style tests. (Yegappan Lakshmanan)
+Files: src/testdir/Make_all.mak, src/testdir/test102.in,
+ src/testdir/test102.ok, src/testdir/test46.in,
+ src/testdir/test46.ok, src/testdir/test81.in,
+ src/testdir/test81.ok, src/testdir/test_charsearch.in,
+ src/testdir/test_charsearch.ok, src/testdir/test_charsearch.vim,
+ src/testdir/test_fnameescape.vim, src/testdir/test_substitute.vim,
+ src/Makefile
+
+Patch 7.4.2308 (after 7.4.2307)
+Problem: Old charsearch test still listed in Makefile.
+Solution: Remove the line.
+Files: src/testdir/Make_all.mak
+
+Patch 7.4.2309
+Problem: Crash when doing tabnext in a BufUnload autocmd. (Dominique Pelle)
+Solution: When detecting that the tab page changed, don't just abort but
+ delete the window where w_buffer is NULL.
+Files: src/window.c, src/testdir/test_tabpage.vim
+
+Patch 7.4.2310 (after 7.4.2304)
+Problem: Accessing freed memory when a timer does not repeat.
+Solution: Free after removing it. (Dominique Pelle)
+Files: src/ex_cmds2.c
+
+Patch 7.4.2311
+Problem: Appveyor 64 bit build still using Python 3.4
+Solution: Switch to Python 3.5. (Ken Takata, closes #1032)
+Files: appveyor.yml, src/appveyor.bat
+
+Patch 7.4.2312
+Problem: Crash when autocommand moves to another tab. (Dominique Pelle)
+Solution: When navigating to another window halfway the :edit command go
+ back to the right window.
+Files: src/buffer.c, src/ex_cmds.c, src/ex_getln.c, src/ex_docmd.c,
+ src/window.c, src/proto/ex_getln.pro, src/testdir/test_tabpage.vim
+
+Patch 7.4.2313
+Problem: Crash when deleting an augroup and listing an autocommand.
+ (Dominique Pelle)
+Solution: Make sure deleted_augroup is valid.
+Files: src/fileio.c, src/testdir/test_autocmd.vim
+
+Patch 7.4.2314
+Problem: No error when deleting an augroup while it's the current one.
+Solution: Disallow deleting an augroup when it's the current one.
+Files: src/fileio.c, src/testdir/test_autocmd.vim
+
+Patch 7.4.2315
+Problem: Insufficient testing for Normal mode commands.
+Solution: Add a big test. (Christian Brabandt, closes #1029)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_normal.vim
+
+Patch 7.4.2316
+Problem: Channel sort test is flaky.
+Solution: Add a check the output has been read.
+Files: src/testdir/test_channel.vim
+
+Patch 7.4.2317 (after 7.4.2315)
+Problem: Normal mode tests fail on MS-Windows.
+Solution: Do some tests only on Unix. Set 'fileformat' to "unix".
+Files: src/testdir/test_normal.vim
+
+Patch 7.4.2318
+Problem: When 'incsearch' is not set CTRL-T and CTRL-G are not inserted as
+ before.
+Solution: Move #ifdef and don't use goto.
+Files: src/ex_getln.c
+
+Patch 7.4.2319
+Problem: No way for a system wide vimrc to stop loading defaults.vim.
+ (Christian Hesse)
+Solution: Bail out of defaults.vim if skip_defaults_vim was set.
+Files: runtime/defaults.vim
+
+Patch 7.4.2320
+Problem: Redraw problem when using 'incsearch'.
+Solution: Save the current view when deleting characters. (Christian
+ Brabandt) Fix that the '" mark is set in the wrong position. Don't
+ change the search start when using BS.
+Files: src/ex_getln.c, src/normal.c, src/testdir/test_search.vim
+
+Patch 7.4.2321
+Problem: When a test is commented out we forget about it.
+Solution: Let a test throw an exception with "Skipped" and list skipped test
+ functions. (Christian Brabandt)
+Files: src/testdir/Makefile, src/testdir/runtest.vim,
+ src/testdir/test_popup.vim, src/testdir/README.txt
+
+Patch 7.4.2322
+Problem: Access memory beyond the end of the line. (Dominique Pelle)
+Solution: Adjust the cursor column.
+Files: src/move.c, src/testdir/test_normal.vim
+
+Patch 7.4.2323
+Problem: Using freed memory when using 'formatexpr'. (Dominique Pelle)
+Solution: Make a copy of 'formatexpr' before evaluating it.
+Files: src/ops.c, src/testdir/test_normal.vim
+
+Patch 7.4.2324
+Problem: Crash when editing a new buffer and BufUnload autocommand wipes
+ out the new buffer. (Norio Takagi)
+Solution: Don't allow wiping out this buffer. (partly by Hirohito Higashi)
+ Move old style test13 into test_autocmd. Avoid ml_get error when
+ editing a file.
+Files: src/structs.h, src/buffer.c, src/ex_cmds.c, src/ex_docmd.c,
+ src/window.c, src/testdir/test13.in, src/testdir/test13.ok,
+ src/testdir/test_autocmd.vim, src/testdir/Make_all.mak,
+ src/Makefile
+
+Patch 7.4.2325 (after 7.4.2324)
+Problem: Tiny build fails.
+Solution: Add #ifdef.
+Files: src/buffer.c
+
+Patch 7.4.2326
+Problem: Illegal memory access when Visual selection starts in invalid
+ position. (Dominique Pelle)
+Solution: Correct position when needed.
+Files: src/normal.c, src/misc2.c, src/proto/misc2.pro
+
+Patch 7.4.2327
+Problem: Freeing a variable that is on the stack.
+Solution: Don't free res_tv or err_tv. (Ozaki Kiichi)
+Files: src/channel.c
+
+Patch 7.4.2328
+Problem: Crash when BufWinLeave autocmd goes to another tab page. (Hirohito
+ Higashi)
+Solution: Make close_buffer() go back to the right window.
+Files: src/buffer.c, src/testdir/test_autocmd.vim
+
+Patch 7.4.2329
+Problem: Error for min() and max() contains %s. (Nikolai Pavlov)
+Solution: Pass the function name. (closes #1040)
+Files: src/evalfunc.c, src/testdir/test_expr.vim
+
+Patch 7.4.2330
+Problem: Coverity complains about not checking curwin to be NULL.
+Solution: Use firstwin to avoid the warning.
+Files: src/buffer.c
+
+Patch 7.4.2331
+Problem: Using CTRL-X CTRL-V to complete a command line from Insert mode
+ does not work after entering an expression on the command line.
+Solution: Don't use "ccline" when not actually using a command line. (test
+ by Hirohito Higashi)
+Files: src/edit.c, src/ex_getln.c, src/proto/ex_getln.pro,
+ src/testdir/test_popup.vim
+
+Patch 7.4.2332
+Problem: Crash when stop_timer() is called in a callback of a callback.
+ Vim hangs when the timer callback uses too much time.
+Solution: Set tr_id to -1 when a timer is to be deleted. Don't keep calling
+ callbacks forever. (Ozaki Kiichi)
+Files: src/evalfunc.c, src/ex_cmds2.c, src/structs.h,
+ src/proto/ex_cmds2.pro, src/testdir/test_timers.vim
+
+Patch 7.4.2333
+Problem: Outdated comments in test.
+Solution: Cleanup normal mode test. (Christian Brabandt)
+Files: src/testdir/test_normal.vim
+
+Patch 7.4.2334
+Problem: On MS-Windows test_getcwd leaves Xtopdir behind.
+Solution: Set 'noswapfile'. (Michael Soyka)
+Files: src/testdir/test_getcwd.in
+
+Patch 7.4.2335
+Problem: taglist() is slow. (Luc Hermitte)
+Solution: Check for CTRL-C less often when doing a linear search. (closes
+ #1044)
+Files: src/tag.c
+
+Patch 7.4.2336
+Problem: Running normal mode tests leave a couple of files behind.
+ (Yegappan Lakshmanan)
+Solution: Delete the files. (Christian Brabandt)
+Files: src/testdir/test_normal.vim
+
+Patch 7.4.2337
+Problem: taglist() is still slow. (Luc Hermitte)
+Solution: Check for CTRL-C less often when finding duplicates.
+Files: src/tag.c
+
+Patch 7.4.2338
+Problem: Can't build with small features. (John Marriott)
+Solution: Nearly always define FEAT_TAG_BINS.
+Files: src/feature.h, src/tag.c
+
+Patch 7.4.2339
+Problem: Tab page test fails when run as fake root.
+Solution: Check 'buftype' instead of 'filetype'. (James McCoy, closes #1042)
+Files: src/testdir/test_tabpage.vim
+
+Patch 7.4.2340
+Problem: MS-Windows: Building with Ruby uses old version.
+Solution: Update to 2.2.X. Use clearer name for the API version. (Ken
+ Takata)
+Files: Makefile, src/INSTALLpc.txt, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak, src/bigvim.bat
+
+Patch 7.4.2341
+Problem: Tiny things. Test doesn't clean up properly.
+Solution: Adjust comment and white space. Restore option value.
+Files: src/ex_cmds.c, src/message.c, src/testdir/test_autocmd.vim
+
+Patch 7.4.2342
+Problem: Typo in MS-Windows build script.
+Solution: change "w2" to "22".
+Files: src/bigvim.bat
+
+Patch 7.4.2343
+Problem: Too many old style tests.
+Solution: Turn several into new style tests. (Yegappan Lakshmanan)
+Files: src/testdir/Make_all.mak, src/testdir/test101.in,
+ src/testdir/test101.ok, src/testdir/test18.in,
+ src/testdir/test18.ok, src/testdir/test2.in, src/testdir/test2.ok,
+ src/testdir/test21.in, src/testdir/test21.ok,
+ src/testdir/test6.in, src/testdir/test6.ok,
+ src/testdir/test_arglist.vim, src/testdir/test_charsearch.vim,
+ src/testdir/test_fnameescape.vim, src/testdir/test_gf.vim,
+ src/testdir/test_hlsearch.vim, src/testdir/test_smartindent.vim,
+ src/testdir/test_tagjump.vim, src/Makefile
+
+Patch 7.4.2344
+Problem: The "Reading from channel output..." message can be unwanted.
+ Appending to a buffer leaves an empty first line behind.
+Solution: Add the "out_msg" and "err_msg" options. Writing the first line
+ overwrites the first, empty line.
+Files: src/structs.h, src/channel.c, src/testdir/test_channel.vim,
+ runtime/doc/channel.txt
+
+Patch 7.4.2345 (after 7.4.2340)
+Problem: For MinGW RUBY_API_VER_LONG isn't set correctly. Many default
+ version numbers are outdated.
+Solution: Set RUBY_API_VER_LONG to RUBY_VER_LONG. Use latest stable releases
+ for defaults. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 7.4.2346
+Problem: Autocommand test fails when run directly, passes when run as part
+ of test_alot.
+Solution: Add command to make the cursor move. Close a tab page.
+Files: src/testdir/test_autocmd.vim
+
+Patch 7.4.2347
+Problem: Crash when closing a buffer while Visual mode is active.
+ (Dominique Pelle)
+Solution: Adjust the position before computing the number of lines.
+ When closing the current buffer stop Visual mode.
+Files: src/buffer.c, src/normal.c, src/testdir/test_normal.vim
+
+Patch 7.4.2348
+Problem: Crash on exit when EXITFREE is defined. (Dominique Pelle)
+Solution: Don't access curwin when exiting.
+Files: src/buffer.c
+
+Patch 7.4.2349
+Problem: Valgrind reports using uninitialized memory. (Dominique Pelle)
+Solution: Check the length before checking for a NUL.
+Files: src/message.c
+
+Patch 7.4.2350
+Problem: Test 86 and 87 fail with some version of Python.
+Solution: Unify "can't" and "cannot". Unify quotes.
+Files: src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test87.in, src/testdir/test87.ok
+
+Patch 7.4.2351
+Problem: Netbeans test fails when run from unpacked MS-Windows sources.
+Solution: Open README.txt instead of Makefile.
+Files: src/testdir/test_netbeans.py, src/testdir/test_netbeans.vim
+
+Patch 7.4.2352
+Problem: Netbeans test fails in shadow directory.
+Solution: Also copy README.txt to the shadow directory.
+Files: src/Makefile
+
+Patch 7.4.2353
+Problem: Not enough test coverage for Normal mode commands.
+Solution: Add more tests. (Christian Brabandt)
+Files: src/testdir/test_normal.vim
+
+Patch 7.4.2354
+Problem: The example that explains nested backreferences does not work
+ properly with the new regexp engine. (Harm te Hennepe)
+Solution: Also save the end position when adding a state. (closes #990)
+Files: src/regexp_nfa.c, src/testdir/test_regexp_latin.vim
+
+Patch 7.4.2355
+Problem: Regexp fails to match when using "\>\)\?". (Ramel)
+Solution: When a state is already in the list, but addstate_here() is used
+ and the existing state comes later, add the new state anyway.
+Files: src/regexp_nfa.c, src/testdir/test_regexp_latin.vim
+
+Patch 7.4.2356
+Problem: Reading past end of line when using previous substitute pattern.
+ (Dominique Pelle)
+Solution: Don't set "pat" only set "searchstr".
+Files: src/search.c, src/testdir/test_search.vim
+
+Patch 7.4.2357
+Problem: Attempt to read history entry while not initialized.
+Solution: Skip when the index is negative.
+Files: src/ex_getln.c
+
+Patch 7.4.2358
+Problem: Compiler warnings with Solaris Studio when using GTK3. (Danek
+ Duvall)
+Solution: Define FUNC2GENERIC depending on the system. (Kazunobu Kuriyama)
+Files: src/gui.h, src/gui_beval.c, src/gui_gtk_f.c
+
+Patch 7.4.2359
+Problem: Memory leak in timer_start().
+Solution: Check the right field to be NULL.
+Files: src/evalfunc.c, src/testdir/test_timers.vim
+
+Patch 7.4.2360
+Problem: Invalid memory access when formatting. (Dominique Pelle)
+Solution: Make sure cursor line and column are associated.
+Files: src/misc1.c
+
+Patch 7.4.2361
+Problem: Checking for last_timer_id to overflow is not reliable. (Ozaki
+ Kiichi)
+Solution: Check for the number not going up.
+Files: src/ex_cmds2.c
+
+Patch 7.4.2362
+Problem: Illegal memory access with ":1@". (Dominique Pelle)
+Solution: Correct cursor column after setting the line number. Also avoid
+ calling end_visual_mode() when not in Visual mode.
+Files: src/ex_docmd.c, src/buffer.c
+
+Patch 7.4.2363
+Problem: Superfluous function prototypes.
+Solution: Remove them.
+Files: src/regexp.c
+
+Patch 7.4.2364
+Problem: Sort test sometimes fails.
+Solution: Add it to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 7.4.2365
+Problem: Needless line break. Confusing directory name.
+Solution: Remove line break. Prepend "../" to "tools".
+Files: Makefile, src/normal.c
+
+Patch 7.4.2366
+Problem: MS-Windows gvim.exe does not have DirectX support.
+Solution: Add the DIRECTX to the script.
+Files: src/bigvim.bat
+
+Patch 7.4.2367 (after 7.4.2364)
+Problem: Test runner misses a comma.
+Solution: Add the comma.
+Files: src/testdir/runtest.vim
+
+
+==============================================================================
+VERSION 8.1 *version-8.1* *version8.1* *vim-8.1*
+
+This section is about improvements made between version 8.0 and 8.1.
+
+This release has hundreds of bug fixes, there is a new feature and there are
+many minor improvements.
+
+
+The terminal window *new-terminal-window*
+-------------------
+
+You can now open a window which functions as a terminal. You can use it for:
+- Running a command, such as "make", while editing in other windows
+- Running a shell and execute several commands
+- Use the terminal debugger plugin, see |terminal-debugger|
+
+All of this is especially useful when running Vim on a remote (ssh)
+connection, when you can't easily open more terminals.
+
+For more information see |terminal-window|.
+
+
+Changed *changed-8.1*
+-------
+
+Internal: A few C99 features are now allowed such as // comments and a
+comma after the last enum entry. See |style-compiler|.
+
+Since patch 8.0.0029 removed support for older MS-Windows systems, only
+MS-Windows XP and later are supported.
+
+
+Added *added-8.1*
+-----
+
+Various syntax, indent and other plugins were added.
+
+Quickfix improvements (by Yegappan Lakshmanan):
+ Added support for modifying any quickfix/location list in the quickfix
+ stack.
+ Added a unique identifier for every quickfix/location list.
+ Added support for associating any Vim type as a context information to
+ a quickfix/location list.
+ Enhanced the getqflist(), getloclist(), setqflist() and setloclist()
+ functions to get and set the various quickfix/location list attributes.
+ Added the QuickFixLine highlight group to highlight the current line
+ in the quickfix window.
+ The quickfix buffer b:changedtick variable is incremented for every
+ change to the contained quickfix list.
+ Added a changedtick variable to a quickfix/location list which is
+ incremented when the list is modified.
+ Added support for parsing text using 'errorformat' without creating a
+ new quickfix list.
+ Added support for the "module" item to a quickfix entry which can be
+ used for display purposes instead of a long file name.
+ Added support for freeing all the lists in the quickfix/location stack.
+ When opening a quickfix window using the :copen/:cwindow commands, the
+ supplied split modifiers are used.
+
+Functions:
+ All the term_ functions.
+
+ |assert_beeps()|
+ |assert_equalfile()|
+ |assert_report()|
+ |balloon_show()|
+ |balloon_split()|
+ |ch_canread()|
+ |getchangelist()|
+ |getjumplist()|
+ |getwinpos()|
+ |pyxeval()|
+ |remote_startserver()|
+ |setbufline()|
+ |test_ignore_error()|
+ |test_override()|
+ |trim()|
+ |win_screenpos()|
+
+Autocommands:
+ |CmdlineChanged|
+ |CmdlineEnter|
+ |CmdlineLeave|
+ |ColorSchemePre|
+ |DirChanged|
+ |ExitPre|
+ |TerminalOpen|
+ |TextChangedP|
+ |TextYankPost|
+
+Commands:
+ |:pyx|
+ |:pythonx|
+ |:pyxdo|
+ |:pyxfile|
+ |:terminal|
+ |:tmapclear|
+ |:tmap|
+ |:tnoremap|
+ |:tunmap|
+
+Options:
+ 'balloonevalterm'
+ 'imstyle'
+ 'mzschemedll'
+ 'mzschemegcdll'
+ 'makeencoding'
+ 'pumwidth'
+ 'pythonhome'
+ 'pythonthreehome'
+ 'pyxversion'
+ 'termwinkey'
+ 'termwinscroll'
+ 'termwinsize'
+ 'viminfofile'
+ 'winptydll'
+
+
+Patches *patches-8.1*
+-------
+
+Patch 8.0.0001
+Problem: Intro screen still mentions version7. (Paul)
+Solution: Change it to version8.
+Files: src/version.c
+
+Patch 8.0.0002
+Problem: The netrw plugin does not work.
+Solution: Make it accept version 8.0.
+Files: runtime/autoload/netrw.vim
+
+Patch 8.0.0003
+Problem: getwinvar() returns wrong Value of boolean and number options,
+ especially non big endian systems. (James McCoy)
+Solution: Cast the pointer to long or int. (closes #1060)
+Files: src/option.c, src/testdir/test_bufwintabinfo.vim
+
+Patch 8.0.0004
+Problem: A string argument for function() that is not a function name
+ results in an error message with NULL. (Christian Brabandt)
+Solution: Use the argument for the error message.
+Files: src/evalfunc.c, src/testdir/test_expr.vim
+
+Patch 8.0.0005
+Problem: Netbeans test fails with Python 3. (Jonathonf)
+Solution: Encode the string before sending it. (closes #1070)
+Files: src/testdir/test_netbeans.py
+
+Patch 8.0.0006
+Problem: ":lb" is interpreted as ":lbottom" while the documentation says it
+ means ":lbuffer".
+Solution: Adjust the order of the commands. (haya14busa, closes #1093)
+Files: src/ex_cmds.h
+
+Patch 8.0.0007
+Problem: Vim 7.4 is still mentioned in a few places.
+Solution: Update to Vim 8. (Uncle Bill, closes #1094)
+Files: src/INSTALLpc.txt, src/vimtutor, uninstal.txt
+
+Patch 8.0.0008
+Problem: Popup complete test is disabled.
+Solution: Enable the test and change the assert. (Hirohito Higashi)
+Files: src/testdir/test_popup.vim
+
+Patch 8.0.0009
+Problem: Unnecessary workaround for AppVeyor.
+Solution: Revert patch 7.4.990. (Christian Brabandt)
+Files: appveyor.yml
+
+Patch 8.0.0010
+Problem: Crash when editing file that starts with crypt header. (igor2x)
+Solution: Check for length of text. (Christian Brabandt) Add a test.
+Files: src/fileio.c, src/testdir/test_crypt.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0011
+Problem: On OSX Test_pipe_through_sort_all() sometimes fails.
+Solution: Add the test to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0012
+Problem: Typos in comments.
+Solution: Change "its" to "it's". (Matthew Brener, closes #1088)
+Files: src/evalfunc.c, src/main.aap, src/nbdebug.c, src/netbeans.c,
+ src/quickfix.c, src/workshop.c, src/wsdebug.c
+
+Patch 8.0.0013 (after 8.0.0011)
+Problem: Missing comma in list.
+Solution: Add the comma.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0014
+Problem: Crypt tests are old style.
+Solution: Convert to new style.
+Files: src/testdir/test71.in, src/testdir/test71.ok,
+ src/testdir/test71a.in, src/testdir/test_crypt.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0015
+Problem: Can't tell which part of a channel has "buffered" status.
+Solution: Add an optional argument to ch_status(). Let ch_info() also
+ return "buffered" for out_status and err_status.
+Files: src/evalfunc.c, src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, runtime/doc/eval.txt
+
+Patch 8.0.0016 (after 8.0.0015)
+Problem: Build fails.
+Solution: Include missing change.
+Files: src/eval.c
+
+Patch 8.0.0017
+Problem: Cannot get the number of the current quickfix or location list.
+Solution: Use the current list if "nr" in "what" is zero. (Yegappan
+ Lakshmanan) Remove debug command from test.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim,
+ runtime/doc/eval.txt
+
+Patch 8.0.0018
+Problem: When using ":sleep" channel input is not handled.
+Solution: When there is a channel check for input also when not in raw mode.
+ Check every 100 msec.
+Files: src/channel.c, src/proto/channel.pro, src/ui.c, src/proto/ui.pro,
+ src/ex_docmd.c, src/os_amiga.c, src/proto/os_amiga.pro,
+ src/os_unix.c, src/proto/os_unix.pro, src/os_win32.c,
+ src/proto/os_win32.pro
+
+Patch 8.0.0019
+Problem: Test_command_count is old style.
+Solution: Turn it into a new style test. (Naruhiko Nishino)
+ Use more assert functions.
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_command_count.in,
+ src/testdir/test_command_count.ok,
+ src/testdir/test_command_count.vim
+
+Patch 8.0.0020
+Problem: The regexp engines are not reentrant.
+Solution: Add regexec_T and save/restore the state when needed.
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test_expr.vim,
+ runtime/doc/eval.txt, runtime/doc/change.txt
+
+Patch 8.0.0021
+Problem: In the GUI when redrawing the cursor it may be on the second half
+ of a double byte character.
+Solution: Correct the cursor column. (Yasuhiro Matsumoto)
+Files: src/screen.c
+
+Patch 8.0.0022
+Problem: If a channel in NL mode is missing the NL at the end the remaining
+ characters are dropped.
+Solution: When the channel is closed use the remaining text. (Ozaki Kiichi)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 8.0.0023
+Problem: "gd" and "gD" may find a match in a comment or string.
+Solution: Ignore matches in comments and strings. (Anton Lindqvist)
+Files: src/normal.c, src/testdir/test_goto.vim
+
+Patch 8.0.0024
+Problem: When the netbeans channel closes, "DETACH" is put in the output
+ part. (Ozaki Kiichi)
+Solution: Write "DETACH" in the socket part.
+Files: src/channel.c, src/testdir/test_netbeans.vim
+
+Patch 8.0.0025
+Problem: Inconsistent use of spaces vs tabs in gd test.
+Solution: Use tabs. (Anton Lindqvist)
+Files: src/testdir/test_goto.vim
+
+Patch 8.0.0026
+Problem: Error format with %W, %C and %Z does not work. (Gerd Wachsmuth)
+Solution: Skip code when qf_multiignore is set. (Lcd)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0027
+Problem: A channel is closed when reading on stderr or stdout fails, but
+ there may still be something to read on another part.
+Solution: Turn ch_to_be_closed into a bitfield. (Ozaki Kiichi)
+Files: src/channel.c, src/eval.c, src/structs.h, src/proto/channel.pro,
+ src/testdir/test_channel.vim
+
+Patch 8.0.0028
+Problem: Superfluous semicolons.
+Solution: Remove them. (Ozaki Kiichi)
+Files: src/ex_cmds2.c
+
+Patch 8.0.0029
+Problem: Code for MS-Windows is complicated because of the exceptions for
+ old systems.
+Solution: Drop support for MS-Windows older than Windows XP. (Ken Takata)
+Files: runtime/doc/gui_w32.txt, runtime/doc/os_win32.txt,
+ runtime/doc/todo.txt, src/GvimExt/Makefile, src/Make_mvc.mak,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_docmd.c, src/gui_w32.c,
+ src/if_cscope.c, src/misc1.c, src/misc2.c, src/option.c,
+ src/os_mswin.c, src/os_win32.c, src/os_win32.h,
+ src/proto/os_mswin.pro, src/proto/os_win32.pro, src/version.c
+
+Patch 8.0.0030
+Problem: Mouse mode is not automatically detected for tmux.
+Solution: Check for 'term' to be "tmux". (Michael Henry)
+Files: src/os_unix.c
+
+Patch 8.0.0031
+Problem: After ":bwipeout" 'fileformat' is not set to the right default.
+Solution: Get the default from 'fileformats'. (Mike Williams)
+Files: src/option.c, src/Makefile, src/testdir/test_fileformat.vim,
+ src/testdir/test_alot.vim
+
+Patch 8.0.0032
+Problem: Tests may change the input file when something goes wrong.
+Solution: Avoid writing the input file.
+Files: src/testdir/test51.in, src/testdir/test67.in,
+ src/testdir/test97.in, src/testdir/test_tabpage.vim
+
+Patch 8.0.0033
+Problem: Cannot use overlapping positions with matchaddpos().
+Solution: Check end of match. (Ozaki Kiichi) Add a test (Hirohito Higashi)
+Files: src/screen.c, src/testdir/test_match.vim
+
+Patch 8.0.0034
+Problem: No completion for ":messages".
+Solution: Complete "clear" argument. (Hirohito Higashi)
+Files: src/ex_docmd.c, src/ex_getln.c, src/proto/ex_docmd.pro,
+ src/testdir/test_cmdline.vim, src/vim.h,
+ runtime/doc/eval.txt, runtime/doc/map.txt
+
+Patch 8.0.0035 (after 7.4.2013)
+Problem: Order of matches for 'omnifunc' is messed up. (Danny Su)
+Solution: Do not set compl_curr_match when called from complete_check().
+ (closes #1168)
+Files: src/edit.c, src/evalfunc.c, src/proto/edit.pro, src/search.c,
+ src/spell.c, src/tag.c, src/testdir/test76.in,
+ src/testdir/test76.ok, src/testdir/test_popup.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0036
+Problem: Detecting that a job has finished may take a while.
+Solution: Check for a finished job more often (Ozaki Kiichi)
+Files: src/channel.c, src/os_unix.c, src/os_win32.c,
+ src/proto/os_unix.pro, src/proto/os_win32.pro,
+ src/testdir/test_channel.vim
+
+Patch 8.0.0037
+Problem: Get E924 when switching tabs. ()
+Solution: Use win_valid_any_tab() instead of win_valid(). (Martin Vuille,
+ closes #1167, closes #1171)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0038
+Problem: OPEN_CHR_FILES not defined for FreeBSD using Debian userland
+ files.
+Solution: Check for __FreeBSD_kernel__. (James McCoy, closes #1166)
+Files: src/vim.h
+
+Patch 8.0.0039
+Problem: When Vim 8 reads an old viminfo and exits, the next time marks are
+ not read from viminfo. (Ned Batchelder)
+Solution: Set a mark when it wasn't set before, even when the timestamp is
+ zero. (closes #1170)
+Files: src/mark.c, src/testdir/test_viminfo.vim
+
+Patch 8.0.0040 (after 8.0.0033)
+Problem: Whole line highlighting with matchaddpos() does not work.
+Solution: Check for zero length. (Hirohito Higashi)
+Files: src/screen.c, src/testdir/test_match.vim
+
+Patch 8.0.0041
+Problem: When using Insert mode completion but not actually inserting
+ anything an undo item is still created. (Tommy Allen)
+Solution: Do not call stop_arrow() when not inserting anything.
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0042 (after 8.0.0041)
+Problem: When using Insert mode completion with 'completeopt' containing
+ "noinsert" change is not saved for undo. (Tommy Allen)
+Solution: Call stop_arrow() before inserting for pressing Enter.
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0043 (after 8.0.0041)
+Problem: When using Insert mode completion with 'completeopt' containing
+ "noinsert" with CTRL-N the change is not saved for undo. (Tommy
+ Allen)
+Solution: Call stop_arrow() before inserting for any key.
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0044
+Problem: In diff mode the cursor may end up below the last line, resulting
+ in an ml_get error.
+Solution: Check the line to be valid.
+Files: src/move.c, src/diff.c, src/proto/diff.pro,
+ src/testdir/test_diffmode.vim
+
+Patch 8.0.0045
+Problem: Calling job_stop() right after job_start() does not work.
+Solution: Block signals while fork is still busy. (Ozaki Kiichi, closes
+ #1155)
+Files: src/auto/configure, src/config.h.in, src/configure.in,
+ src/os_unix.c, src/testdir/test_channel.vim
+
+Patch 8.0.0046
+Problem: Using NUL instead of NULL.
+Solution: Change to NULL. (Dominique Pelle)
+Files: src/ex_cmds.c, src/json.c
+
+Patch 8.0.0047
+Problem: Crash when using the preview window from an unnamed buffer.
+ (lifepillar)
+Solution: Do not clear the wrong buffer. (closes #1200)
+Files: src/popupmnu.c
+
+Patch 8.0.0048
+Problem: On Windows job_stop() stops cmd.exe, not the processes it runs.
+ (Linwei)
+Solution: Iterate over all processes and terminate the one where the parent
+ is the job process. (Yasuhiro Matsumoto, closes #1184)
+Files: src/os_win32.c, src/structs.h
+
+Patch 8.0.0049
+Problem: When a match ends in part of concealed text highlighting, it might
+ mess up concealing by resetting prev_syntax_id.
+Solution: Do not reset prev_syntax_id and add a test to verify. (Christian
+ Brabandt, closes #1092)
+Files: src/screen.c, src/testdir/test_matchadd_conceal.vim
+
+Patch 8.0.0050
+Problem: An exiting job is detected with a large latency.
+Solution: Check for pending job more often. (Ozaki Kiichi) Change the
+ double loop in mch_inchar() into one.
+Files: src/channel.c, src/os_unix.c, src/testdir/shared.vim,
+ src/testdir/test_channel.vim
+
+Patch 8.0.0051 (after 8.0.0048)
+Problem: New code for job_stop() breaks channel test on AppVeyor.
+Solution: Revert the change.
+Files: src/os_win32.c, src/structs.h
+
+Patch 8.0.0052 (after 8.0.0049)
+Problem: Conceal test passes even without the bug fix.
+Solution: Add a redraw command. (Christian Brabandt)
+Files: src/testdir/test_matchadd_conceal.vim
+
+Patch 8.0.0053 (after 8.0.0047)
+Problem: No test for what 8.0.0047 fixes.
+Solution: Add a test. (Hirohito Higashi)
+Files: src/testdir/test_popup.vim
+
+Patch 8.0.0054 (after 8.0.0051)
+Problem: On Windows job_stop() stops cmd.exe, not the processes it runs.
+ (Linwei)
+Solution: Iterate over all processes and terminate the one where the parent
+ is the job process. Now only when there is no job object.
+ (Yasuhiro Matsumoto, closes #1203)
+Files: src/os_win32.c
+
+Patch 8.0.0055
+Problem: Minor comment and style deficiencies.
+Solution: Update comments and fix style.
+Files: src/buffer.c, src/misc2.c, src/os_unix.c
+
+Patch 8.0.0056
+Problem: When setting 'filetype' there is no check for a valid name.
+Solution: Only allow valid characters in 'filetype', 'syntax' and 'keymap'.
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.0.0057 (after 8.0.0056)
+Problem: Tests fail without the 'keymap' features.
+Solution: Check for feature in test.
+Files: src/testdir/test_options.vim
+
+Patch 8.0.0058
+Problem: Positioning of the popup menu is not good.
+Solution: Position it better. (Hirohito Higashi)
+Files: src/popupmnu.c
+
+Patch 8.0.0059
+Problem: Vim does not build on VMS systems.
+Solution: Various changes for VMS. (Zoltan Arpadffy)
+Files: src/json.c, src/macros.h, src/Make_vms.mms, src/os_unix.c,
+ src/os_unix.h, src/os_vms.c, src/os_vms_conf.h,
+ src/proto/os_vms.pro, src/testdir/Make_vms.mms
+
+Patch 8.0.0060
+Problem: When using an Ex command for 'keywordprg' it is escaped as with a
+ shell command. (Romain Lafourcade)
+Solution: Escape for an Ex command. (closes #1175)
+Files: src/normal.c, src/testdir/test_normal.vim
+
+Patch 8.0.0061 (after 8.0.0058)
+Problem: Compiler warning for unused variable.
+Solution: Add #ifdef. (John Marriott)
+Files: src/popupmnu.c
+
+Patch 8.0.0062
+Problem: No digraph for HORIZONTAL ELLIPSIS.
+Solution: Use ",.". (Hans Ginzel, closes #1226)
+Files: src/digraph.c, runtime/doc/digraph.txt
+
+Patch 8.0.0063
+Problem: Compiler warning for comparing with unsigned. (Zoltan Arpadffy)
+Solution: Change <= to ==.
+Files: src/undo.c
+
+Patch 8.0.0064 (after 8.0.0060)
+Problem: Normal test fails on MS-Windows.
+Solution: Don't try using an illegal file name.
+Files: src/testdir/test_normal.vim
+
+Patch 8.0.0065 (after 8.0.0056)
+Problem: Compiler warning for unused function in tiny build. (Tony
+ Mechelynck)
+Solution: Add #ifdef.
+Files: src/option.c
+
+Patch 8.0.0066
+Problem: when calling an operator function when 'linebreak' is set, it is
+ internally reset before calling the operator function.
+Solution: Restore 'linebreak' before calling op_function(). (Christian
+ Brabandt)
+Files: src/normal.c, src/testdir/test_normal.vim
+
+Patch 8.0.0067
+Problem: VMS has a problem with infinity.
+Solution: Avoid an overflow. (Zoltan Arpadffy)
+Files: src/json.c, src/macros.h
+
+Patch 8.0.0068
+Problem: Checking did_throw after executing autocommands is wrong. (Daniel
+ Hahler)
+Solution: Call aborting() instead, and only when autocommands were executed.
+Files: src/quickfix.c, src/if_cscope.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0069
+Problem: Compiler warning for self-comparison.
+Solution: Define ONE_WINDOW and add #ifdef.
+Files: src/globals.h, src/buffer.c, src/ex_docmd.c, src/move.c,
+ src/screen.c, src/quickfix.c, src/window.c
+
+Patch 8.0.0070
+Problem: Tests referred in Makefile that no longer exist.
+Solution: Remove test71 and test74 entries. (Michael Soyka)
+Files: src/testdir/Mak_ming.mak
+
+Patch 8.0.0071
+Problem: Exit value from a shell command is wrong. (Hexchain Tong)
+Solution: Do not check for ended jobs while waiting for a shell command.
+ (ichizok, closes #1196)
+Files: src/os_unix.c
+
+Patch 8.0.0072
+Problem: MS-Windows: Crash with long font name. (Henry Hu)
+Solution: Fix comparing with LF_FACESIZE. (Ken Takata, closes #1243)
+Files: src/os_mswin.c
+
+Patch 8.0.0073 (after 8.0.0069)
+Problem: More comparisons between firstwin and lastwin.
+Solution: Use ONE_WINDOW for consistency. (Hirohito Higashi)
+Files: src/buffer.c, src/ex_cmds.c, src/ex_docmd.c, src/option.c,
+ src/window.c
+
+Patch 8.0.0074
+Problem: Cannot make Vim fail on an internal error.
+Solution: Add IEMSG() and IEMSG2(). (Dominique Pelle) Avoid reporting an
+ internal error without mentioning where.
+Files: src/globals.h, src/blowfish.c, src/dict.c, src/edit.c, src/eval.c,
+ src/evalfunc.c, src/ex_eval.c, src/getchar.c, src/gui_beval.c,
+ src/gui_w32.c, src/hangulin.c, src/hashtab.c, src/if_cscope.c,
+ src/json.c, src/memfile.c, src/memline.c, src/message.c,
+ src/misc2.c, src/option.c, src/quickfix.c, src/regexp.c,
+ src/spell.c, src/undo.c, src/userfunc.c, src/vim.h, src/window.c,
+ src/proto/misc2.pro, src/proto/message.pro, src/Makefile
+
+Patch 8.0.0075
+Problem: Using number for exception type lacks type checking.
+Solution: Use an enum.
+Files: src/structs.h, src/ex_docmd.c, src/ex_eval.c,
+ src/proto/ex_eval.pro
+
+Patch 8.0.0076
+Problem: Channel log has double parens ()().
+Solution: Remove () for write_buf_line. (Yasuhiro Matsumoto)
+Files: src/channel.c
+
+Patch 8.0.0077
+Problem: The GUI code is not tested by Travis.
+Solution: Install the virtual framebuffer.
+Files: .travis.yml
+
+Patch 8.0.0078
+Problem: Accessing freed memory in quickfix.
+Solution: Reset pointer when freeing 'errorformat'. (Dominique Pelle)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0079
+Problem: Accessing freed memory in quickfix. (Dominique Pelle)
+Solution: Do not free the current list when adding to it.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0080
+Problem: The OS X build fails on Travis.
+Solution: Skip the virtual framebuffer on OS X.
+Files: .travis.yml
+
+Patch 8.0.0081
+Problem: Inconsistent function names.
+Solution: Rename do_cscope to ex_cscope. Clean up comments.
+Files: src/ex_cmds.h, src/if_cscope.c, src/ex_docmd.c,
+ src/proto/if_cscope.pro
+
+Patch 8.0.0082
+Problem: Extension for configure should be ".ac".
+Solution: Rename configure.in to configure.ac. (James McCoy, closes #1173)
+Files: src/configure.in, src/configure.ac, Filelist, src/Makefile,
+ src/blowfish.c, src/channel.c, src/config.h.in, src/main.aap,
+ src/os_unix.c, src/INSTALL, src/mysign
+
+Patch 8.0.0083
+Problem: Using freed memory with win_getid(). (Dominique Pelle)
+Solution: For the current tab use curwin.
+Files: src/window.c, src/testdir/test_window_id.vim
+
+Patch 8.0.0084
+Problem: Using freed memory when adding to a quickfix list. (Dominique
+ Pelle)
+Solution: Clear the directory name.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0085
+Problem: Using freed memory with recursive function call. (Dominique Pelle)
+Solution: Make a copy of the function name.
+Files: src/eval.c, src/testdir/test_nested_function.vim
+
+Patch 8.0.0086
+Problem: Cannot add a comment after ":hide". (Norio Takagi)
+Solution: Make it work, add a test. (Hirohito Higashi)
+Files: src/Makefile, src/ex_cmds.h, src/ex_docmd.c,
+ src/testdir/Make_all.mak, src/testdir/test_hide.vim
+
+Patch 8.0.0087
+Problem: When the channel callback gets job info the job may already have
+ been deleted. (lifepillar)
+Solution: Do not delete the job when the channel is still useful. (ichizok,
+ closes #1242, closes #1245)
+Files: src/channel.c, src/eval.c, src/os_unix.c, src/os_win32.c,
+ src/structs.h, src/testdir/test_channel.vim
+
+Patch 8.0.0088
+Problem: When a test fails in Setup or Teardown the problem is not reported.
+Solution: Add a try/catch. (Hirohito Higashi)
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0089
+Problem: Various problems with GTK 3.22.2.
+Solution: Fix the problems, add #ifdefs. (Kazunobu Kuriyama)
+Files: src/gui_beval.c, src/gui_gtk.c, src/gui_gtk_x11.c
+
+Patch 8.0.0090
+Problem: Cursor moved after last character when using 'breakindent'.
+Solution: Fix the cursor positioning. Turn the breakindent test into new
+ style. (Christian Brabandt)
+Files: src/screen.c, src/testdir/Make_all.mak,
+ src/testdir/test_breakindent.in, src/testdir/test_breakindent.ok,
+ src/testdir/test_breakindent.vim, src/Makefile
+
+Patch 8.0.0091
+Problem: Test_help_complete sometimes fails in MS-Windows console.
+Solution: Use getcompletion() instead of feedkeys() and command line
+ completion. (Hirohito Higashi)
+Files: src/testdir/test_help_tagjump.vim
+
+Patch 8.0.0092
+Problem: C indenting does not support nested namespaces that C++ 17 has.
+Solution: Add check that passes double colon inside a name. (Pauli, closes
+ #1214)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 8.0.0093
+Problem: Not using multiprocess build feature.
+Solution: Enable multiprocess build with MSVC 10. (Ken Takata)
+Files: src/Make_mvc.mak
+
+Patch 8.0.0094
+Problem: When vimrun.exe is not found the error message is not properly
+ encoded.
+Solution: Use utf-16 and MessageBoxW(). (Ken Takata)
+Files: src/os_win32.c
+
+Patch 8.0.0095
+Problem: Problems with GTK 3.22.2 fixed in 3.22.4.
+Solution: Adjust the #ifdefs. (Kazunobu Kuriyama)
+Files: src/gui_gtk_x11.c
+
+Patch 8.0.0096
+Problem: When the input or output is not a tty Vim appears to hang.
+Solution: Add the --ttyfail argument. Also add the "ttyin" and "ttyout"
+ features to be able to check in Vim script.
+Files: src/globals.h, src/structs.h, src/main.c, src/evalfunc.c,
+ runtime/doc/starting.txt, runtime/doc/eval.txt
+
+Patch 8.0.0097
+Problem: When a channel callback consumes a lot of time Vim becomes
+ unresponsive. (skywind)
+Solution: Bail out of checking channel readahead after 100 msec.
+Files: src/os_unix.c, src/misc2.c, src/vim.h, src/os_win32.c,
+ src/channel.c
+
+Patch 8.0.0098 (after 8.0.0097)
+Problem: Can't build on MS-Windows.
+Solution: Add missing parenthesis.
+Files: src/vim.h
+
+Patch 8.0.0099
+Problem: Popup menu always appears above the cursor when it is in the lower
+ half of the screen. (Matt Gardner)
+Solution: Compute the available space better. (Hirohito Higashi,
+ closes #1241)
+Files: src/popupmnu.c
+
+Patch 8.0.0100
+Problem: Options that are a file name may contain non-filename characters.
+Solution: Check for more invalid characters.
+Files: src/option.c
+
+Patch 8.0.0101
+Problem: Some options are not strictly checked.
+Solution: Add flags for stricter checks.
+Files: src/option.c
+
+Patch 8.0.0102 (after 8.0.0101)
+Problem: Cannot set 'dictionary' to a path.
+Solution: Allow for slash and backslash. Add a test (partly by Daisuke
+ Suzuki, closes #1279, closes #1284)
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.0.0103
+Problem: May not process channel readahead. (skywind)
+Solution: If there is readahead don't block on input.
+Files: src/channel.c, src/proto/channel.pro, src/os_unix.c,
+ src/os_win32.c, src/misc2.c
+
+Patch 8.0.0104
+Problem: Value of 'thesaurus' option not checked properly.
+Solution: Add P_NDNAME flag. (Daisuke Suzuki)
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.0.0105
+Problem: When using ch_read() with zero timeout, can't tell the difference
+ between reading an empty line and nothing available.
+Solution: Add ch_canread().
+Files: src/evalfunc.c, src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, src/testdir/shared.vim,
+ runtime/doc/eval.txt, runtime/doc/channel.txt
+
+Patch 8.0.0106 (after 8.0.0100)
+Problem: Cannot use a semicolon in 'backupext'. (Jeff)
+Solution: Allow for a few more characters when "secure" isn't set.
+Files: src/option.c
+
+Patch 8.0.0107
+Problem: When reading channel output in a timer, messages may go missing.
+ (Skywind)
+Solution: Add the "drop" option. Write error messages in the channel log.
+ Don't have ch_canread() check for the channel being open.
+Files: src/structs.h, src/channel.c, src/message.c, src/evalfunc.c,
+ src/proto/channel.pro, runtime/doc/channel.txt
+
+Patch 8.0.0108 (after 8.0.0107)
+Problem: The channel "drop" option is not tested.
+Solution: Add a test.
+Files: src/testdir/test_channel.vim
+
+Patch 8.0.0109
+Problem: Still checking if memcmp() exists while every system should have
+ it now.
+Solution: Remove vim_memcmp(). (James McCoy, closes #1295)
+Files: src/config.h.in, src/configure.ac, src/misc2.c, src/os_vms_conf.h,
+ src/osdef1.h.in, src/search.c, src/tag.c, src/vim.h
+
+Patch 8.0.0110
+Problem: Drop command doesn't use existing window.
+Solution: Check the window width properly. (Hirohito Higashi)
+Files: src/buffer.c, src/testdir/test_tabpage.vim
+
+Patch 8.0.0111
+Problem: The :history command is not tested.
+Solution: Add tests. (Dominique Pelle)
+Files: runtime/doc/cmdline.txt, src/testdir/test_history.vim
+
+Patch 8.0.0112
+Problem: Tests 92 and 93 are old style.
+Solution: Make test92 and test93 new style. (Hirohito Higashi, closes #1289)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test92.in, src/testdir/test92.ok,
+ src/testdir/test93.in, src/testdir/test93.ok,
+ src/testdir/test_mksession.vim,
+ src/testdir/test_mksession_utf8.vim
+
+Patch 8.0.0113
+Problem: MS-Windows: message box to prompt for saving changes may appear on
+ the wrong monitor.
+Solution: Adjust the CenterWindow function. (Ken Takata)
+Files: src/gui_w32.c
+
+Patch 8.0.0114
+Problem: Coding style not optimal.
+Solution: Add spaces. (Ken Takata)
+Files: src/gui_w32.c, src/os_mswin.c
+
+Patch 8.0.0115
+Problem: When building with Cygwin libwinpthread isn't found.
+Solution: Link winpthread statically. (jmmerz, closes #1255, closes #1256)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.0.0116
+Problem: When reading English help and using CTRL-] the language from
+ 'helplang' is used.
+Solution: Make help tag jumps keep the language. (Tatsuki, test by Hirohito
+ Higashi, closes #1249)
+Files: src/tag.c, src/testdir/test_help_tagjump.vim
+
+Patch 8.0.0117
+Problem: Parallel make fails. (J. Lewis Muir)
+Solution: Make sure the objects directory exists. (closes #1259)
+Files: src/Makefile
+
+Patch 8.0.0118
+Problem: "make proto" adds extra function prototype.
+Solution: Add #ifdef.
+Files: src/misc2.c
+
+Patch 8.0.0119
+Problem: No test for using CTRL-R on the command line.
+Solution: Add a test. (Dominique Pelle) And some more.
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.0.0120
+Problem: Channel test is still flaky on OS X.
+Solution: Set the drop argument to "never".
+Files: src/testdir/test_channel.vim
+
+Patch 8.0.0121
+Problem: Setting 'cursorline' changes the curswant column. (Daniel Hahler)
+Solution: Add the P_RWINONLY flag. (closes #1297)
+Files: src/option.c, src/testdir/test_goto.vim
+
+Patch 8.0.0122
+Problem: Channel test is still flaky on OS X.
+Solution: Add a short sleep.
+Files: src/testdir/test_channel.py
+
+Patch 8.0.0123
+Problem: Modern Sun compilers define "__sun" instead of "sun".
+Solution: Use __sun. (closes #1296)
+Files: src/mbyte.c, src/pty.c, src/os_unixx.h, src/vim.h
+
+Patch 8.0.0124
+Problem: Internal error for assert_inrange(1, 1).
+Solution: Adjust number of allowed arguments. (Dominique Pelle)
+Files: src/evalfunc.c, src/testdir/test_assert.vim
+
+Patch 8.0.0125
+Problem: Not enough testing for entering Ex commands.
+Solution: Add test for CTRL-\ e {expr}. (Dominique Pelle)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.0.0126
+Problem: Display problem with 'foldcolumn' and a wide character.
+ (esiegerman)
+Solution: Don't use "extra" but an allocated buffer. (Christian Brabandt,
+ closes #1310)
+Files: src/screen.c, src/testdir/Make_all.mak, src/Makefile,
+ src/testdir/test_display.vim
+
+Patch 8.0.0127
+Problem: Cancelling completion still inserts text when formatting is done
+ for 'textwidth'. (lacygoill)
+Solution: Don't format when CTRL-E was typed. (Hirohito Higashi,
+ closes #1312)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0128 (after 8.0.0126)
+Problem: Display test fails on MS-Windows.
+Solution: Set 'isprint' to "@".
+Files: src/testdir/test_display.vim
+
+Patch 8.0.0129
+Problem: Parallel make still doesn't work. (Lewis Muir)
+Solution: Define OBJ_MAIN.
+Files: src/Makefile
+
+Patch 8.0.0130
+Problem: Configure uses "ushort" while the Vim code doesn't.
+Solution: Use "unsigned short" instead. (Fredrik Fornwall, closes #1314)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.0131
+Problem: Not enough test coverage for syntax commands.
+Solution: Add more tests. (Dominique Pelle)
+Files: src/testdir/test_syntax.vim
+
+Patch 8.0.0132 (after 8.0.0131)
+Problem: Test fails because of using :finish.
+Solution: Change to return.
+Files: src/testdir/test_syntax.vim
+
+Patch 8.0.0133
+Problem: "2;'(" causes ml_get errors in an empty buffer. (Dominique Pelle)
+Solution: Check the cursor line earlier.
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.0134
+Problem: Null pointer access reported by UBsan.
+Solution: Check curwin->w_buffer is not NULL. (Yegappan Lakshmanan)
+Files: src/ex_cmds.c
+
+Patch 8.0.0135
+Problem: An address relative to the current line, ":.,+3y", does not work
+ properly on a closed fold. (Efraim Yawitz)
+Solution: Correct for including the closed fold. (Christian Brabandt)
+Files: src/ex_docmd.c, src/testdir/test_fold.vim,
+ src/testdir/Make_all.mak, src/Makefile
+
+Patch 8.0.0136
+Problem: When using indent folding and changing indent the wrong fold is
+ opened. (Jonathan Fudger)
+Solution: Open the fold under the cursor a bit later. (Christian Brabandt)
+Files: src/ops.c, src/testdir/test_fold.vim
+
+Patch 8.0.0137
+Problem: When 'maxfuncdepth' is set above 200 the nesting is limited to
+ 200. (Brett Stahlman)
+Solution: Allow for Ex command recursion depending on 'maxfuncdepth'.
+Files: src/ex_docmd.c, src/testdir/test_nested_function.vim
+
+Patch 8.0.0138 (after 8.0.0137)
+Problem: Small build fails.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.0.0139 (after 8.0.0135)
+Problem: Warning for unused argument.
+Solution: Add UNUSED.
+Files: src/ex_docmd.c
+
+Patch 8.0.0140
+Problem: Pasting inserted text in Visual mode does not work properly.
+ (Matthew Malcomson)
+Solution: Stop Visual mode before stuffing the inserted text. (Christian
+ Brabandt, from neovim #5709)
+Files: src/ops.c, src/testdir/test_visual.vim
+
+Patch 8.0.0141 (after 8.0.0137)
+Problem: Nested function test fails on AppVeyor.
+Solution: Disable the test on Windows for now.
+Files: src/testdir/test_nested_function.vim
+
+Patch 8.0.0142
+Problem: Normal colors are wrong with 'termguicolors'.
+Solution: Initialize to INVALCOLOR instead of zero. (Ben Jackson, closes
+ #1344)
+Files: src/syntax.c
+
+Patch 8.0.0143
+Problem: Line number of current buffer in getbufinfo() is wrong.
+Solution: For the current buffer use the current line number. (Ken Takata)
+Files: src/evalfunc.c
+
+Patch 8.0.0144
+Problem: When using MSVC the GvimExt directory is cleaned twice.
+Solution: Remove the lines. (Ken Takata)
+Files: src/Make_mvc.mak
+
+Patch 8.0.0145
+Problem: Running tests on MS-Windows is a little bit noisy.
+Solution: Redirect some output to "nul". (Ken Takata)
+Files: src/testdir/Make_dos.mak
+
+Patch 8.0.0146
+Problem: When using 'termguicolors' on MS-Windows the RGB definition causes
+ the colors to be wrong.
+Solution: Undefined RGB and use our own. (Gabriel Barta)
+Files: src/term.c
+
+Patch 8.0.0147
+Problem: searchpair() does not work when 'magic' is off. (Chris Paul)
+Solution: Add \m in the pattern. (Christian Brabandt, closes #1341)
+Files: src/evalfunc.c, src/testdir/test_search.vim
+
+Patch 8.0.0148
+Problem: When a C preprocessor statement has two line continuations the
+ following line does not have the right indent. (Ken Takata)
+Solution: Add the indent of the previous continuation line. (Hirohito
+ Higashi)
+Files: src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 8.0.0149
+Problem: ":earlier" and ":later" do not work after startup or reading the
+ undo file.
+Solution: Use absolute time stamps instead of relative to the Vim start
+ time. (Christian Brabandt, Pavel Juhas, closes #1300, closes
+ #1254)
+Files: src/testdir/test_undo.vim, src/undo.c
+
+Patch 8.0.0150
+Problem: When the pattern of :filter does not have a separator then
+ completion of the command fails.
+Solution: Skip over the pattern. (Ozaki Kiichi, closes #1299)
+Files: src/ex_docmd.c, src/testdir/test_filter_cmd.vim
+
+Patch 8.0.0151
+Problem: To pass buffer content to system() and systemlist() one has to
+ first create a string or list.
+Solution: Allow passing a buffer number. (LemonBoy, closes #1240)
+Files: runtime/doc/eval.txt, src/Makefile, src/evalfunc.c,
+ src/testdir/Make_all.mak, src/testdir/test_system.vim
+
+Patch 8.0.0152
+Problem: Running the channel test creates channellog.
+Solution: Delete the debug line.
+Files: src/testdir/test_channel.vim
+
+Patch 8.0.0153 (after 8.0.0151)
+Problem: system() test fails on MS-Windows.
+Solution: Deal with extra space and CR.
+Files: src/testdir/test_system.vim
+
+Patch 8.0.0154 (after 8.0.0151)
+Problem: system() test fails on OS/X.
+Solution: Deal with leading spaces.
+Files: src/testdir/test_system.vim
+
+Patch 8.0.0155
+Problem: When sorting zero elements a NULL pointer is passed to qsort(),
+ which ubsan warns for.
+Solution: Don't call qsort() if there are no elements. (Dominique Pelle)
+Files: src/syntax.c
+
+Patch 8.0.0156
+Problem: Several float functions are not covered by tests.
+Solution: Add float tests. (Dominique Pelle)
+Files: src/Makefile, src/testdir/test_alot.vim,
+ src/testdir/test_float_func.vim
+
+Patch 8.0.0157
+Problem: No command line completion for ":syntax spell" and ":syntax sync".
+Solution: Implement the completion. (Dominique Pelle)
+Files: src/syntax.c, src/testdir/test_syntax.vim
+
+Patch 8.0.0158 (after 8.0.0156)
+Problem: On MS-Windows some float functions return a different value when
+ passed unusual values. strtod() doesn't work for "inf" and "nan".
+Solution: Accept both results. Fix str2float() for MS-Windows. Also
+ reorder assert function arguments.
+Files: src/testdir/test_float_func.vim, src/eval.c
+
+Patch 8.0.0159
+Problem: Using a NULL pointer when using feedkeys() to trigger drawing a
+ tabline.
+Solution: Skip drawing a tabline if TabPageIdxs is NULL. (Dominique Pelle)
+ Also fix recursing into getcmdline() from the cmd window.
+Files: src/screen.c, src/ex_getln.c
+
+Patch 8.0.0160
+Problem: EMSG() is sometimes used for internal errors.
+Solution: Change them to IEMSG(). (Dominique Pelle) And a few more.
+Files: src/regexp_nfa.c, src/channel.c, src/eval.c
+
+Patch 8.0.0161 (after 8.0.0159)
+Problem: Build fails when using small features.
+Solution: Update #ifdef for using save_ccline. (Hirohito Higashi)
+Files: src/ex_getln.c
+
+Patch 8.0.0162
+Problem: Build error on Fedora 23 with small features and gnome2.
+Solution: Undefine ngettext(). (Hirohito Higashi)
+Files: src/gui_gtk.c, src/gui_gtk_x11.c
+
+Patch 8.0.0163
+Problem: Ruby 2.4 no longer supports rb_cFixnum.
+Solution: move rb_cFixnum into an #ifdef. (Kazuki Sakamoto, closes #1365)
+Files: src/if_ruby.c
+
+Patch 8.0.0164
+Problem: Outdated and misplaced comments.
+Solution: Fix the comments.
+Files: src/charset.c, src/getchar.c, src/list.c, src/misc2.c,
+ src/testdir/README.txt
+
+Patch 8.0.0165
+Problem: Ubsan warns for integer overflow.
+Solution: Swap two conditions. (Dominique Pelle)
+Files: src/regexp_nfa.c
+
+Patch 8.0.0166
+Problem: JSON with a duplicate key gives an internal error. (Lcd)
+Solution: Give a normal error. Avoid an error when parsing JSON from a
+ remote client fails.
+Files: src/evalfunc.c, src/json.c, src/channel.c,
+ src/testdir/test_json.vim
+
+Patch 8.0.0167
+Problem: str2nr() and str2float() do not always work with negative values.
+Solution: Be more flexible about handling signs. (LemonBoy, closes #1332)
+ Add more tests.
+Files: src/evalfunc.c, src/testdir/test_float_func.vim,
+ src/testdir/test_functions.vim, src/testdir/test_alot.vim,
+ src/Makefile
+
+Patch 8.0.0168
+Problem: Still some float functionality is not covered by tests.
+Solution: Add more tests. (Dominique Pelle, closes #1364)
+Files: src/testdir/test_float_func.vim
+
+Patch 8.0.0169
+Problem: For complicated string json_decode() may run out of stack space.
+Solution: Change the recursive solution into an iterative solution.
+Files: src/json.c
+
+Patch 8.0.0170 (after 8.0.0169)
+Problem: Channel test fails for using freed memory.
+Solution: Fix memory use in json_decode().
+Files: src/json.c
+
+Patch 8.0.0171
+Problem: JS style JSON does not support single quotes.
+Solution: Allow for single quotes. (Yasuhiro Matsumoto, closes #1371)
+Files: src/json.c, src/testdir/test_json.vim, src/json_test.c,
+ runtime/doc/eval.txt
+
+Patch 8.0.0172 (after 8.0.0159)
+Problem: The command selected in the command line window is not executed.
+ (Andrey Starodubtsev)
+Solution: Save and restore the command line at a lower level. (closes #1370)
+Files: src/ex_getln.c, src/testdir/test_history.vim
+
+Patch 8.0.0173
+Problem: When compiling with EBCDIC defined the build fails. (Yaroslav
+ Kuzmin)
+Solution: Move sortFunctions() to the right file. Avoid warning for
+ redefining __SUSV3.
+Files: src/eval.c, src/evalfunc.c, src/os_unixx.h
+
+Patch 8.0.0174
+Problem: For completion "locale -a" is executed on MS-Windows, even though
+ it most likely won't work.
+Solution: Skip executing "locale -a" on MS-Windows. (Ken Takata)
+Files: src/ex_cmds2.c
+
+Patch 8.0.0175
+Problem: Setting language in gvim on MS-Windows does not work when
+ libintl.dll is dynamically linked with msvcrt.dll.
+Solution: Use putenv() from libintl as well. (Ken Takata, closes #1082)
+Files: src/mbyte.c, src/misc1.c, src/os_win32.c, src/proto/os_win32.pro,
+ src/vim.h
+
+Patch 8.0.0176
+Problem: Using :change in between :function and :endfunction fails.
+Solution: Recognize :change inside a function. (ichizok, closes #1374)
+Files: src/userfunc.c, src/testdir/test_viml.vim
+
+Patch 8.0.0177
+Problem: When opening a buffer on a directory and inside a try/catch then
+ the BufEnter event is not triggered.
+Solution: Return NOTDONE from readfile() for a directory and deal with the
+ three possible return values. (Justin M. Keyes, closes #1375,
+ closes #1353)
+Files: src/buffer.c, src/ex_cmds.c, src/ex_docmd.c, src/fileio.c,
+ src/memline.c
+
+Patch 8.0.0178
+Problem: test_command_count may fail when a previous test interferes, seen
+ on MS-Windows.
+Solution: Run it separately.
+Files: src/testdir/test_alot.vim, src/testdir/Make_all.mak
+
+Patch 8.0.0179
+Problem: 'formatprg' is a global option but the value may depend on the
+ type of buffer. (Sung Pae)
+Solution: Make 'formatprg' global-local. (closes #1380)
+Files: src/structs.h, src/option.h, src/option.c, src/normal.c,
+ runtime/doc/options.txt, src/testdir/test_normal.vim
+
+Patch 8.0.0180
+Problem: Error E937 is used both for duplicate key in JSON and for trying
+ to delete a buffer that is in use.
+Solution: Rename the JSON error to E938. (Norio Takagi, closes #1376)
+Files: src/json.c, src/testdir/test_json.vim
+
+Patch 8.0.0181
+Problem: When 'cursorbind' and 'cursorcolumn' are both on, the column
+ highlight in non-current windows is wrong.
+Solution: Add validate_cursor(). (Masanori Misono, closes #1372)
+Files: src/move.c
+
+Patch 8.0.0182
+Problem: When 'cursorbind' and 'cursorline' are set, but 'cursorcolumn' is
+ not, then the cursor line highlighting is not updated. (Hirohito
+ Higashi)
+Solution: Call redraw_later() with NOT_VALID.
+Files: src/move.c
+
+Patch 8.0.0183
+Problem: Ubsan warns for using a pointer that is not aligned.
+Solution: First copy the address. (Yegappan Lakshmanan)
+Files: src/channel.c
+
+Patch 8.0.0184
+Problem: When in Ex mode and an error is caught by try-catch, Vim still
+ exits with a non-zero exit code.
+Solution: Don't set ex_exitval when inside a try-catch. (partly by Christian
+ Brabandt)
+Files: src/message.c, src/testdir/test_system.vim
+
+Patch 8.0.0185 (after 8.0.0184)
+Problem: The system() test fails on MS-Windows.
+Solution: Skip the test on MS-Windows.
+Files: src/testdir/test_system.vim
+
+Patch 8.0.0186
+Problem: The error message from assert_notequal() is confusing.
+Solution: Only mention the expected value.
+Files: src/eval.c, src/testdir/test_assert.vim
+
+Patch 8.0.0187
+Problem: Building with a new Ruby version fails.
+Solution: Use ruby_sysinit() instead of NtInitialize(). (Tomas Volf,
+ closes #1382)
+Files: src/if_ruby.c
+
+Patch 8.0.0188 (after 8.0.0182)
+Problem: Using NOT_VALID for redraw_later() to update the cursor
+ line/column highlighting is not efficient.
+Solution: Call validate_cursor() when 'cul' or 'cuc' is set.
+Files: src/move.c
+
+Patch 8.0.0189
+Problem: There are no tests for the :profile command.
+Solution: Add tests. (Dominique Pelle, closes #1383)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_profile.vim
+
+Patch 8.0.0190
+Problem: Detecting duplicate tags uses a slow linear search.
+Solution: Use a much faster hash table solution. (James McCoy, closes #1046)
+ But don't add hi_keylen, it makes hash tables 50% bigger.
+Files: src/tag.c
+
+Patch 8.0.0191 (after 8.0.0187)
+Problem: Some systems do not have ruby_sysinit(), causing the build to
+ fail.
+Solution: Clean up how ruby_sysinit() and NtInitialize() are used. (Taro
+ Muraoka)
+Files: src/if_ruby.c
+
+Patch 8.0.0192 (after 8.0.0190)
+Problem: Build fails with tiny features.
+Solution: Change #ifdef for hash_clear(). Avoid warning for unused
+ argument.
+Files: src/hashtab.c, src/if_cscope.c
+
+Patch 8.0.0193 (after 8.0.0188)
+Problem: Accidentally removed #ifdef.
+Solution: Put it back. (Masanori Misono)
+Files: src/move.c
+
+Patch 8.0.0194 (after 8.0.0189)
+Problem: Profile tests fails if total and self time are equal.
+Solution: Make one time optional.
+Files: src/testdir/test_profile.vim
+
+Patch 8.0.0195 (after 8.0.0190)
+Problem: Jumping to a tag that is a static item in the current file fails.
+ (Kazunobu Kuriyama)
+Solution: Make sure the first byte of the tag key is not NUL. (Suggested by
+ James McCoy, closes #1387)
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.0.0196 (after 8.0.0194)
+Problem: The test for :profile is slow and does not work on MS-Windows.
+Solution: Use the "-es" argument. (Dominique Pelle) Swap single and double
+ quotes for system()
+Files: src/testdir/test_profile.vim
+
+Patch 8.0.0197
+Problem: On MS-Windows the system() test skips a few parts.
+Solution: Swap single and double quotes for the command.
+Files: src/testdir/test_system.vim
+
+Patch 8.0.0198
+Problem: Some syntax arguments take effect even after "if 0". (Taylor
+ Venable)
+Solution: Properly skip the syntax statements. Make "syn case" and "syn
+ conceal" report the current state. Fix that "syn clear" didn't
+ reset the conceal flag. Add tests for :syntax skipping properly.
+Files: src/syntax.c, src/testdir/test_syntax.vim
+
+Patch 8.0.0199
+Problem: Warning for an unused parameter when the libcall feature is
+ disabled. Warning for a function type cast when compiling with
+ -pedantic.
+Solution: Add UNUSED. Use a different type cast. (Damien Molinier)
+Files: src/evalfunc.c, src/os_unix.c
+
+Patch 8.0.0200
+Problem: Some syntax arguments are not tested.
+Solution: Add more syntax command tests.
+Files: src/testdir/test_syntax.vim
+
+Patch 8.0.0201
+Problem: When completing a group name for a highlight or syntax command
+ cleared groups are included.
+Solution: Skip groups that have been cleared.
+Files: src/syntax.c, src/testdir/test_syntax.vim
+
+Patch 8.0.0202
+Problem: No test for invalid syntax group name.
+Solution: Add a test for group name error and warning.
+Files: src/testdir/test_syntax.vim
+
+Patch 8.0.0203
+Problem: Order of complication flags is sometimes wrong.
+Solution: Put interface-specific flags before ALL_CFLAGS. (idea by Yousong
+ Zhou, closes #1100)
+Files: src/Makefile
+
+Patch 8.0.0204
+Problem: Compiler warns for uninitialized variable. (Tony Mechelynck)
+Solution: When skipping set "id" to -1.
+Files: src/syntax.c
+
+Patch 8.0.0205
+Problem: After :undojoin some commands don't work properly, such as :redo.
+ (Matthew Malcomson)
+Solution: Don't set curbuf->b_u_curhead. (closes #1390)
+Files: src/undo.c, src/testdir/test_undo.vim
+
+Patch 8.0.0206
+Problem: Test coverage for :retab insufficient.
+Solution: Add test for :retab. (Dominique Pelle, closes #1391)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/test_retab.vim
+
+Patch 8.0.0207
+Problem: Leaking file descriptor when system() cannot find the buffer.
+ (Coverity)
+Solution: Close the file descriptor. (Dominique Pelle, closes #1398)
+Files: src/evalfunc.c
+
+Patch 8.0.0208
+Problem: Internally used commands for CTRL-Z and mouse click end up in
+ history. (Matthew Malcomson)
+Solution: Use do_cmdline_cmd() instead of stuffing them in the readahead
+ buffer. (James McCoy, closes #1395)
+Files: src/edit.c, src/normal.c
+
+Patch 8.0.0209
+Problem: When using :substitute with the "c" flag and 'cursorbind' is set
+ the cursor is not updated in other windows.
+Solution: Call do_check_cursorbind(). (Masanori Misono)
+Files: src/ex_cmds.c
+
+Patch 8.0.0210
+Problem: Vim does not support bracketed paste, as implemented by xterm and
+ other terminals.
+Solution: Add t_BE, t_BD, t_PS and t_PE.
+Files: src/term.c, src/term.h, src/option.c, src/misc2.c, src/keymap.h,
+ src/edit.c, src/normal.c, src/evalfunc.c, src/getchar.c,
+ src/vim.h, src/proto/edit.pro, runtime/doc/term.txt
+
+Patch 8.0.0211 (after 8.0.0210)
+Problem: Build fails if the multibyte feature is disabled.
+Solution: Change #ifdef around ins_char_bytes.
+Files: src/misc1.c
+
+Patch 8.0.0212
+Problem: The buffer used to store a key name theoretically could be too
+ small. (Coverity)
+Solution: Count all possible modifier characters. Add a check for the
+ length just in case.
+Files: src/keymap.h, src/misc2.c
+
+Patch 8.0.0213
+Problem: The Netbeans "specialKeys" command does not check if the argument
+ fits in the buffer. (Coverity)
+Solution: Add a length check.
+Files: src/netbeans.c
+
+Patch 8.0.0214
+Problem: Leaking memory when syntax cluster id is unknown. (Coverity)
+Solution: Free the memory.
+Files: src/syntax.c
+
+Patch 8.0.0215
+Problem: When a Cscope line contains CTRL-L a NULL pointer may be used.
+ (Coverity)
+Solution: Don't check for an emacs tag in a cscope line.
+Files: src/tag.c
+
+Patch 8.0.0216
+Problem: When decoding JSON with a JS style object the JSON test may use a
+ NULL pointer. (Coverity)
+Solution: Check for a NULL pointer.
+Files: src/json.c, src/json_test.c
+
+Patch 8.0.0217 (after 8.0.0215)
+Problem: Build fails without the cscope feature.
+Solution: Add #ifdef.
+Files: src/tag.c
+
+Patch 8.0.0218
+Problem: No command line completion for :cexpr, :cgetexpr, :caddexpr, etc.
+Solution: Make completion work. (Yegappan Lakshmanan) Add a test.
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.0219
+Problem: Ubsan reports errors for integer overflow.
+Solution: Define macros for minimum and maximum values. Select an
+ expression based on the value. (Mike Williams)
+Files: src/charset.c, src/eval.c, src/evalfunc.c, src/structs.h,
+ src/testdir/test_viml.vim
+
+Patch 8.0.0220
+Problem: Completion for :match does not show "none" and other missing
+ highlight names.
+Solution: Skip over cleared entries before checking the index to be at the
+ end.
+Files: src/syntax.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.0221
+Problem: Checking if PROTO is defined inside a function has no effect.
+Solution: Remove the check for PROTO. (Hirohito Higashi)
+Files: src/misc1.c
+
+Patch 8.0.0222
+Problem: When a multibyte character ends in a zero byte, putting blockwise
+ text puts it before the character instead of after it.
+Solution: Use int instead of char for the character under the cursor.
+ (Luchr, closes #1403) Add a test.
+Files: src/ops.c, src/testdir/test_put.vim, src/Makefile,
+ src/testdir/test_alot.vim
+
+Patch 8.0.0223
+Problem: Coverity gets confused by the flags passed to find_tags() and
+ warns about uninitialized variable.
+Solution: Disallow using cscope and help tags at the same time.
+Files: src/tag.c
+
+Patch 8.0.0224
+Problem: When 'fileformats' is changed in a BufReadPre auto command, it
+ does not take effect in readfile(). (Gary Johnson)
+Solution: Check the value of 'fileformats' after executing auto commands.
+ (Christian Brabandt)
+Files: src/fileio.c, src/testdir/test_fileformat.vim
+
+Patch 8.0.0225
+Problem: When a block is visually selected and put is used on the end of
+ the selection only one line is changed.
+Solution: Check for the end properly. (Christian Brabandt, neovim issue
+ 5781)
+Files: src/ops.c, src/testdir/test_put.vim
+
+Patch 8.0.0226
+Problem: The test for patch 8.0.0224 misses the CR characters and passes
+ even without the fix. (Christian Brabandt)
+Solution: Use double quotes and \<CR>.
+Files: src/testdir/test_fileformat.vim
+
+Patch 8.0.0227
+Problem: Crash when 'fileformat' is forced to "dos" and the first line in
+ the file is empty and does not have a CR character.
+Solution: Don't check for CR before the start of the buffer.
+Files: src/fileio.c, src/testdir/test_fileformat.vim
+
+Patch 8.0.0228 (after 8.0.0210)
+Problem: When pasting test in an xterm on the command line it is surrounded
+ by <PasteStart> and <PasteEnd>. (Johannes Kaltenbach)
+Solution: Add missing changes.
+Files: src/ex_getln.c, src/term.c
+
+Patch 8.0.0229 (after 8.0.0179)
+Problem: When freeing a buffer the local value of the 'formatprg' option is
+ not cleared.
+Solution: Add missing change.
+Files: src/buffer.c
+
+Patch 8.0.0230 (after 8.0.0210)
+Problem: When using bracketed paste line breaks are not respected.
+Solution: Turn CR characters into a line break if the text is being
+ inserted. (closes #1404)
+Files: src/edit.c
+
+Patch 8.0.0231
+Problem: There are no tests for bracketed paste mode.
+Solution: Add a test. Fix repeating with "normal .".
+Files: src/edit.c, src/testdir/test_paste.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0232
+Problem: Pasting in Insert mode does not work when bracketed paste is used
+ and 'esckeys' is off.
+Solution: When 'esckeys' is off disable bracketed paste in Insert mode.
+Files: src/edit.c
+
+Patch 8.0.0233 (after 8.0.0231)
+Problem: The paste test fails if the GUI is being used.
+Solution: Skip the test in the GUI.
+Files: src/testdir/test_paste.vim
+
+Patch 8.0.0234 (after 8.0.0225)
+Problem: When several lines are visually selected and one of them is short,
+ using put may cause a crash. (Axel Bender)
+Solution: Check for a short line. (Christian Brabandt)
+Files: src/ops.c, src/testdir/test_put.vim
+
+Patch 8.0.0235
+Problem: Memory leak detected when running tests for diff mode.
+Solution: Free p_extra_free.
+Files: src/screen.c
+
+Patch 8.0.0236 (after 8.0.0234)
+Problem: Gcc complains that a variable may be used uninitialized. Confusion
+ between variable and label name. (John Marriott)
+Solution: Initialize it. Rename end to end_lnum.
+Files: src/ops.c
+
+Patch 8.0.0237
+Problem: When setting wildoptions=tagfile the completion context is not set
+ correctly. (desjardins)
+Solution: Check for EXPAND_TAGS_LISTFILES. (Christian Brabandt, closes #1399)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.0238
+Problem: When using bracketed paste autoindent causes indent to be
+ increased.
+Solution: Disable 'ai' and set 'paste' temporarily. (Ken Takata)
+Files: src/edit.c, src/testdir/test_paste.vim
+
+Patch 8.0.0239
+Problem: The address sanitizer sometimes finds errors, but it needs to be
+ run manually.
+Solution: Add an environment to Travis with clang and the address sanitizer.
+ (Christian Brabandt) Also include changes only on github.
+Files: .travis.yml
+
+Patch 8.0.0240 (after 8.0.0239)
+Problem: The clang build on CI fails with one configuration.
+Solution: Redo a previous patch that was accidentally reverted.
+Files: .travis.yml
+
+Patch 8.0.0241
+Problem: Vim defines a mch_memmove() function but it doesn't work, thus is
+ always unused.
+Solution: Remove the mch_memmove implementation. (suggested by Dominique
+ Pelle)
+Files: src/os_unix.h, src/misc2.c, src/vim.h
+
+Patch 8.0.0242
+Problem: Completion of user defined functions is not covered by tests.
+Solution: Add tests. Also test various errors of user-defined commands.
+ (Dominique Pelle, closes #1413)
+Files: src/testdir/test_usercommands.vim
+
+Patch 8.0.0243
+Problem: When making a character lower case with tolower() changes the byte
+ count, it is not made lower case.
+Solution: Add strlow_save(). (Dominique Pelle, closes #1406)
+Files: src/evalfunc.c, src/misc2.c, src/proto/misc2.pro,
+ src/testdir/test_functions.vim
+
+Patch 8.0.0244
+Problem: When the user sets t_BE empty after startup to disable bracketed
+ paste, this has no direct effect.
+Solution: When t_BE is made empty write t_BD. When t_BE is made non-empty
+ write the new value.
+Files: src/option.c
+
+Patch 8.0.0245
+Problem: The generated zh_CN.cp936.po message file is not encoded properly.
+Solution: Instead of using zh_CN.po as input, use zh_CN.UTF-8.po.
+Files: src/po/Makefile
+
+Patch 8.0.0246
+Problem: Compiler warnings for int to pointer conversion.
+Solution: Fix macro for mch_memmove(). (John Marriott)
+Files: src/vim.h
+
+Patch 8.0.0247
+Problem: Under some circumstances, one needs to type Ctrl-N or Ctrl-P twice
+ to have a menu entry selected. (Lifepillar)
+Solution: call ins_compl_free(). (Christian Brabandt, closes #1411)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0248
+Problem: vim_strcat() cannot handle overlapping arguments.
+Solution: Use mch_memmove() instead of strcpy(). (Justin M. Keyes,
+ closes #1415)
+Files: src/misc2.c
+
+Patch 8.0.0249
+Problem: When two submits happen quick after each other, the tests for the
+ first one may error out.
+Solution: Use a git depth of 10 instead of 1. (Christian Brabandt)
+Files: .travis.yml
+
+Patch 8.0.0250
+Problem: When virtcol() gets a column that is not the first byte of a
+ multibyte character the result is unpredictable. (Christian
+ Ludwig)
+Solution: Correct the column to the first byte of a multibyte character.
+ Change the utf-8 test to new style.
+Files: src/charset.c, src/testdir/test_utf8.in, src/testdir/test_utf8.ok,
+ src/testdir/test_utf8.vim, src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_alot_utf8.vim
+
+Patch 8.0.0251
+Problem: It is not so easy to write a script that works with both Python 2
+ and Python 3, even when the Python code works with both.
+Solution: Add 'pyxversion', :pyx, etc. (Marc Weber, Ken Takata)
+Files: Filelist, runtime/doc/eval.txt, runtime/doc/if_pyth.txt,
+ runtime/doc/index.txt, runtime/doc/options.txt,
+ runtime/optwin.vim, runtime/doc/quickref.txt,
+ runtime/doc/usr_41.txt, src/Makefile, src/evalfunc.c,
+ src/ex_cmds.h, src/ex_cmds2.c, src/ex_docmd.c, src/if_python.c,
+ src/if_python3.c, src/option.c, src/option.h,
+ src/proto/ex_cmds2.pro, src/testdir/Make_all.mak,
+ src/testdir/pyxfile/py2_magic.py,
+ src/testdir/pyxfile/py2_shebang.py,
+ src/testdir/pyxfile/py3_magic.py,
+ src/testdir/pyxfile/py3_shebang.py, src/testdir/pyxfile/pyx.py,
+ src/testdir/test_pyx2.vim, src/testdir/test_pyx3.vim
+ src/userfunc.c
+
+Patch 8.0.0252
+Problem: Characters below 256 that are not one byte are not always
+ recognized as word characters.
+Solution: Make vim_iswordc() and vim_iswordp() work the same way. Add a test
+ for this. (Ozaki Kiichi)
+Files: src/Makefile, src/charset.c, src/kword_test.c, src/mbyte.c,
+ src/proto/mbyte.pro
+
+Patch 8.0.0253
+Problem: When creating a session when 'winminheight' is 2 or larger and
+ loading that session gives an error.
+Solution: Also set 'winminheight' before setting 'winheight' to 1. (Rafael
+ Bodill, neovim #5717)
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.0.0254
+Problem: When using an assert function one can either specify a message or
+ get a message about what failed, not both.
+Solution: Concatenate the error with the message.
+Files: src/eval.c, src/testdir/test_assert.vim
+
+Patch 8.0.0255
+Problem: When calling setpos() with a buffer argument it often is ignored.
+ (Matthew Malcomson)
+Solution: Make the buffer argument work for all marks local to a buffer.
+ (neovim #5713) Add more tests.
+Files: src/mark.c, src/testdir/test_marks.vim, runtime/doc/eval.txt
+
+Patch 8.0.0256 (after 8.0.0255)
+Problem: Tests fail because some changes were not included.
+Solution: Add changes to evalfunc.c
+Files: src/evalfunc.c
+
+Patch 8.0.0257 (after 8.0.0252)
+Problem: The keyword test file is not included in the archive.
+Solution: Update the list of files.
+Files: Filelist
+
+Patch 8.0.0258 (after 8.0.0253)
+Problem: mksession test leaves file behind.
+Solution: Delete the file. Rename files to start with "X".
+Files: src/testdir/test_mksession.vim
+
+Patch 8.0.0259
+Problem: Tab commands do not handle count correctly. (Ken Hamada)
+Solution: Add ADDR_TABS_RELATIVE. (Hirohito Higashi)
+Files: runtime/doc/tabpage.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/testdir/test_tabpage.vim
+
+Patch 8.0.0260
+Problem: Build fails with tiny features.
+Solution: Move get_tabpage_arg() inside #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.0.0261
+Problem: Not enough test coverage for eval functions.
+Solution: Add more tests. (Dominique Pelle, closes #1420)
+Files: src/testdir/test_functions.vim
+
+Patch 8.0.0262
+Problem: Farsi support is barely tested.
+Solution: Add more tests for Farsi. Clean up the code.
+Files: src/edit.c, src/farsi.c, src/testdir/test_farsi.vim
+
+Patch 8.0.0263
+Problem: Farsi support is not tested enough.
+Solution: Add more tests for Farsi. Clean up the code.
+Files: src/farsi.c, src/testdir/test_farsi.vim
+
+Patch 8.0.0264
+Problem: Memory error reported by ubsan, probably for using the string
+ returned by execute().
+Solution: NUL terminate the result of execute().
+Files: src/evalfunc.c
+
+Patch 8.0.0265
+Problem: May get ml_get error when :pydo deletes lines or switches to
+ another buffer. (Nikolai Pavlov, issue #1421)
+Solution: Check the buffer and line every time.
+Files: src/if_py_both.h, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0266
+Problem: Compiler warning for using uninitialized variable.
+Solution: Set tab_number also when there is an error.
+Files: src/ex_docmd.c
+
+Patch 8.0.0267
+Problem: A channel test sometimes fails on Mac.
+Solution: Add the test to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0268
+Problem: May get ml_get error when :luado deletes lines or switches to
+ another buffer. (Nikolai Pavlov, issue #1421)
+Solution: Check the buffer and line every time.
+Files: src/if_lua.c, src/testdir/test_lua.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0269
+Problem: May get ml_get error when :perldo deletes lines or switches to
+ another buffer. (Nikolai Pavlov, issue #1421)
+Solution: Check the buffer and line every time.
+Files: src/if_perl.xs, src/testdir/test_perl.vim
+
+Patch 8.0.0270
+Problem: May get ml_get error when :rubydo deletes lines or switches to
+ another buffer. (Nikolai Pavlov, issue #1421)
+Solution: Check the buffer and line every time.
+Files: src/if_ruby.c, src/testdir/test_ruby.vim
+
+Patch 8.0.0271
+Problem: May get ml_get error when :tcldo deletes lines or switches to
+ another buffer. (Nikolai Pavlov, closes #1421)
+Solution: Check the buffer and line every time.
+Files: src/if_tcl.c, src/testdir/test_tcl.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0272
+Problem: Crash on exit is not detected when running tests.
+Solution: Remove the dash before the command. (Dominique Pelle, closes
+ #1425)
+Files: src/testdir/Makefile
+
+Patch 8.0.0273
+Problem: Dead code detected by Coverity when not using gnome.
+Solution: Rearrange the #ifdefs to avoid dead code.
+Files: src/gui_gtk_x11.c
+
+Patch 8.0.0274
+Problem: When update_single_line() is called recursively, or another screen
+ update happens while it is busy, errors may occur.
+Solution: Check and update updating_screen. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 8.0.0275
+Problem: When checking for CTRL-C typed the GUI may detect a screen resize
+ and redraw the screen, causing trouble.
+Solution: Set updating_screen in ui_breakcheck().
+Files: src/ui.c
+
+Patch 8.0.0276
+Problem: Checking for FEAT_GUI_GNOME inside GTK 3 code is unnecessary.
+Solution: Remove the #ifdef. (Kazunobu Kuriyama)
+Files: src/gui_gtk_x11.c
+
+Patch 8.0.0277
+Problem: The GUI test may trigger fontconfig and take a long time.
+Solution: Set $XDG_CACHE_HOME. (Kazunobu Kuriyama)
+Files: src/testdir/unix.vim, src/testdir/test_gui.vim
+
+Patch 8.0.0278 (after 8.0.0277)
+Problem: GUI test fails on MS-Windows.
+Solution: Check that tester_HOME exists.
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0279
+Problem: With MSVC 2015 the dll name is vcruntime140.dll.
+Solution: Check the MSVC version and use the right dll name. (Ken Takata)
+Files: src/Make_mvc.mak
+
+Patch 8.0.0280
+Problem: On MS-Windows setting an environment variable with multibyte
+ strings does not work well.
+Solution: Use wputenv when possible. (Taro Muraoka, Ken Takata)
+Files: src/misc1.c, src/os_win32.c, src/os_win32.h,
+ src/proto/os_win32.pro, src/vim.h
+
+Patch 8.0.0281
+Problem: MS-Windows files are still using ARGSUSED while most other files
+ have UNUSED.
+Solution: Change ARGSUSED to UNUSED or delete it.
+Files: src/os_win32.c, src/gui_w32.c, src/os_mswin.c, src/os_w32exe.c,
+ src/winclip.c
+
+Patch 8.0.0282
+Problem: When doing a Visual selection and using "I" to go to insert mode,
+ CTRL-O needs to be used twice to go to Normal mode. (Coacher)
+Solution: Check for the return value of edit(). (Christian Brabandt,
+ closes #1290)
+Files: src/normal.c, src/ops.c
+
+Patch 8.0.0283
+Problem: The return value of mode() does not indicate that completion is
+ active in Replace and Insert mode. (Zhen-Huan (Kenny) Hu)
+Solution: Add "c" or "x" for two kinds of completion. (Yegappan Lakshmanan,
+ closes #1397) Test some more modes.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim, src/testdir/test_mapping.vim
+
+Patch 8.0.0284
+Problem: The Test_collapse_buffers() test failed once, looks like it is
+ flaky.
+Solution: Add it to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0285 (after 8.0.0277)
+Problem: Tests fail with tiny build on Unix.
+Solution: Only set g:tester_HOME when build with the +eval feature.
+Files: src/testdir/unix.vim
+
+Patch 8.0.0286
+Problem: When concealing is active and the screen is resized in the GUI it
+ is not immediately redrawn.
+Solution: Use update_prepare() and update_finish() from
+ update_single_line().
+Files: src/screen.c
+
+Patch 8.0.0287
+Problem: Cannot access the arguments of the current function in debug mode.
+ (Luc Hermitte)
+Solution: use get_funccal(). (LemonBoy, closes #1432, closes #1352)
+Files: src/userfunc.c
+
+Patch 8.0.0288 (after 8.0.0284)
+Problem: Errors reported while running tests.
+Solution: Put comma in the right place.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0289
+Problem: No test for "ga" and :ascii.
+Solution: Add a test. (Dominique Pelle, closes #1429)
+Files: src/Makefile, src/testdir/test_alot.vim, src/testdir/test_ga.vim
+
+Patch 8.0.0290
+Problem: If a wide character doesn't fit at the end of the screen line, and
+ the line doesn't fit on the screen, then the cursor position may
+ be wrong. (anliting)
+Solution: Don't skip over wide character. (Christian Brabandt, closes #1408)
+Files: src/screen.c
+
+Patch 8.0.0291 (after 8.0.0282)
+Problem: Visual block insertion does not insert in all lines.
+Solution: Don't bail out of insert too early. Add a test. (Christian
+ Brabandt, closes #1290)
+Files: src/ops.c, src/testdir/test_visual.vim
+
+Patch 8.0.0292
+Problem: The stat test is a bit slow.
+Solution: Remove a couple of sleep comments and reduce another.
+Files: src/testdir/test_stat.vim
+
+Patch 8.0.0293
+Problem: Some tests have a one or three second wait.
+Solution: Reset the 'showmode' option. Use a test time of one to disable
+ sleep after an error or warning message.
+Files: src/misc1.c, src/testdir/runtest.vim, src/testdir/test_normal.vim
+
+Patch 8.0.0294
+Problem: Argument list is not stored correctly in a session file.
+ (lgpasquale)
+Solution: Use "$argadd" instead of "argadd". (closes #1434)
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.0.0295 (after 8.0.0293)
+Problem: test_viml hangs.
+Solution: Put resetting 'more' before sourcing the script.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0296
+Problem: Bracketed paste can only append, not insert.
+Solution: When the cursor is in the first column insert the text.
+Files: src/normal.c, src/testdir/test_paste.vim, runtime/doc/term.txt
+
+Patch 8.0.0297
+Problem: Double free on exit when using a closure. (James McCoy)
+Solution: Split free_al_functions in two parts. (closes #1428)
+Files: src/userfunc.c, src/structs.h
+
+Patch 8.0.0298
+Problem: Ex command range with repeated search does not work. (Bruce
+ DeVisser)
+Solution: Skip over \/, \? and \&.
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.0299
+Problem: When the GUI window is resized Vim does not always take over the
+ new size. (Luchr)
+Solution: Reset new_p_guifont in gui_resize_shell(). Call
+ gui_may_resize_shell() in the main loop.
+Files: src/main.c, src/gui.c
+
+Patch 8.0.0300
+Problem: Cannot stop diffing hidden buffers. (Daniel Hahler)
+Solution: When using :diffoff! make the whole list if diffed buffers empty.
+ (closes #736)
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.0.0301
+Problem: No tests for ":set completion" and various errors of the :set
+ command.
+Solution: Add more :set tests. (Dominique Pelle, closes #1440)
+Files: src/testdir/test_options.vim
+
+Patch 8.0.0302
+Problem: Cannot set terminal key codes with :let.
+Solution: Make it work.
+Files: src/option.c, src/testdir/test_assign.vim
+
+Patch 8.0.0303
+Problem: Bracketed paste does not work in Visual mode.
+Solution: Delete the text before pasting
+Files: src/normal.c, src/ops.c, src/proto/ops.pro,
+ src/testdir/test_paste.vim
+
+Patch 8.0.0304 (after 8.0.0302)
+Problem: Assign test fails in the GUI.
+Solution: Skip the test for setting t_k1.
+Files: src/testdir/test_assign.vim
+
+Patch 8.0.0305
+Problem: Invalid memory access when option has duplicate flag.
+Solution: Correct pointer computation. (Dominique Pelle, closes #1442)
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.0.0306
+Problem: mode() not sufficiently tested.
+Solution: Add more tests. (Yegappan Lakshmanan)
+Files: src/testdir/test_functions.vim
+
+Patch 8.0.0307
+Problem: Asan detects a memory error when EXITFREE is defined. (Dominique
+ Pelle)
+Solution: In getvcol() check for ml_get_buf() returning an empty string.
+ Also skip adjusting the scroll position. Set "exiting" in
+ mch_exit() for all systems.
+Files: src/charset.c, src/window.c, src/os_mswin.c, src/os_win32.c,
+ src/os_amiga.c
+
+Patch 8.0.0308
+Problem: When using a symbolic link, the package path will not be inserted
+ at the right position in 'runtimepath'. (Dugan Chen, Norio Takagi)
+Solution: Resolve symbolic links when finding the right position in
+ 'runtimepath'. (Hirohito Higashi)
+Files: src/ex_cmds2.c, src/testdir/test_packadd.vim
+
+Patch 8.0.0309
+Problem: Cannot use an empty key in json.
+Solution: Allow for using an empty key.
+Files: src/json.c, src/testdir/test_json.vim
+
+Patch 8.0.0310
+Problem: Not enough testing for GUI functionality.
+Solution: Add tests for v:windowid and getwinpos[xy](). (Kazunobu Kuriyama)
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0311
+Problem: Linebreak tests are old style.
+Solution: Turn the tests into new style. Share utility functions. (Ozaki
+ Kiichi, closes #1444)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_breakindent.vim, src/testdir/test_listlbr.in,
+ src/testdir/test_listlbr.ok, src/testdir/test_listlbr.vim,
+ src/testdir/test_listlbr_utf8.in,
+ src/testdir/test_listlbr_utf8.ok,
+ src/testdir/test_listlbr_utf8.vim, src/testdir/view_util.vim
+
+Patch 8.0.0312
+Problem: When a json message arrives in pieces, the start is dropped and
+ the decoding fails.
+Solution: Do not drop the start when it is still needed. (Kay Zheng) Add a
+ test. Reset the timeout when something is received.
+Files: src/channel.c, src/testdir/test_channel.vim, src/structs.h,
+ src/testdir/test_channel_pipe.py
+
+Patch 8.0.0313 (after 8.0.0310)
+Problem: Not enough testing for GUI functionality.
+Solution: Add tests for the GUI font. (Kazunobu Kuriyama)
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0314
+Problem: getcmdtype(), getcmdpos() and getcmdline() are not tested.
+Solution: Add tests. (Yegappan Lakshmanan)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.0.0315
+Problem: ":help :[range]" does not work. (Tony Mechelynck)
+Solution: Translate to insert a backslash.
+Files: src/ex_cmds.c
+
+Patch 8.0.0316
+Problem: ":help z?" does not work. (Pavol Juhas)
+Solution: Remove exception for z?.
+Files: src/ex_cmds.c
+
+Patch 8.0.0317
+Problem: No test for setting 'guifont'.
+Solution: Add a test for X11 GUIs. (Kazunobu Kuriyama)
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0318
+Problem: Small mistake in 7x13 font name.
+Solution: Use ISO 8859-1 name instead of 10646-1. (Kazunobu Kuriyama)
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0319
+Problem: Insert mode completion does not respect "start" in 'backspace'.
+Solution: Check whether backspace can go before where insert started.
+ (Hirohito Higashi)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0320
+Problem: Warning for unused variable with small build.
+Solution: Change #ifdef to exclude FEAT_CMDWIN. (Kazunobu Kuriyama)
+Files: src/ex_getln.c
+
+Patch 8.0.0321
+Problem: When using the tiny version trying to load the matchit plugin
+ gives an error. On MS-Windows some default mappings fail.
+Solution: Add a check if the command used is available. (Christian Brabandt)
+Files: runtime/mswin.vim, runtime/macros/matchit.vim
+
+Patch 8.0.0322
+Problem: Possible overflow with spell file where the tree length is
+ corrupted.
+Solution: Check for an invalid length (suggested by shqking)
+Files: src/spellfile.c
+
+Patch 8.0.0323
+Problem: When running the command line tests there is a one second wait.
+Solution: Change an Esc to Ctrl-C. (Yegappan Lakshmanan)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.0.0324
+Problem: Illegal memory access with "1;y".
+Solution: Call check_cursor() instead of check_cursor_lnum(). (Dominique
+ Pelle, closes #1455)
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.0325
+Problem: Packadd test does not clean up symlink.
+Solution: Delete the link. (Hirohito Higashi)
+Files: src/testdir/test_packadd.vim
+
+Patch 8.0.0326 (after 8.0.0325)
+Problem: Packadd test uses wrong directory name.
+Solution: Use the variable name value. (Hirohito Higashi)
+Files: src/testdir/test_packadd.vim
+
+Patch 8.0.0327
+Problem: The E11 error message in the command line window is not
+ translated.
+Solution: use _(). (Hirohito Higashi)
+Files: src/ex_docmd.c
+
+Patch 8.0.0328
+Problem: The "zero count" error doesn't have a number. (Hirohito Higashi)
+Solution: Give it a number and be more specific about the error.
+Files: src/globals.h
+
+Patch 8.0.0329
+Problem: Xfontset and guifontwide are not tested.
+Solution: Add tests. (Kazunobu Kuriyama)
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0330
+Problem: Illegal memory access after "vapo". (Dominique Pelle)
+Solution: Fix the cursor column.
+Files: src/search.c, src/testdir/test_visual.vim
+
+Patch 8.0.0331
+Problem: Restoring help snapshot accesses freed memory. (Dominique Pelle)
+Solution: Don't restore a snapshot when the window closes.
+Files: src/window.c, src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_help.vim
+
+Patch 8.0.0332
+Problem: GUI test fails on some systems.
+Solution: Try different language settings. (Kazunobu Kuriyama)
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0333
+Problem: Illegal memory access when 'complete' ends in a backslash.
+Solution: Check for trailing backslash. (Dominique Pelle, closes #1478)
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.0.0334
+Problem: Can't access b:changedtick from a dict reference.
+Solution: Make changedtick a member of the b: dict. (inspired by neovim
+ #6112)
+Files: src/structs.h, src/buffer.c, src/edit.c, src/eval.c,
+ src/evalfunc.c, src/ex_docmd.c, src/main.c, src/globals.h,
+ src/fileio.c, src/memline.c, src/misc1.c, src/syntax.c,
+ src/proto/eval.pro, src/testdir/test_changedtick.vim,
+ src/Makefile, src/testdir/test_alot.vim, src/testdir/test91.in,
+ src/testdir/test91.ok, src/testdir/test_functions.vim
+
+Patch 8.0.0335 (after 8.0.0335)
+Problem: Functions test fails.
+Solution: Use the right buffer number.
+Files: src/testdir/test_functions.vim
+
+Patch 8.0.0336
+Problem: Flags of :substitute not sufficiently tested.
+Solution: Test up to two letter flag combinations. (James McCoy, closes
+ #1479)
+Files: src/testdir/test_substitute.vim
+
+Patch 8.0.0337
+Problem: Invalid memory access in :recover command.
+Solution: Avoid access before directory name. (Dominique Pelle,
+ closes #1488)
+Files: src/Makefile, src/memline.c, src/testdir/test_alot.vim,
+ src/testdir/test_recover.vim
+
+Patch 8.0.0338 (after 8.0.0337)
+Problem: :recover test fails on MS-Windows.
+Solution: Use non-existing directory on MS-Windows.
+Files: src/testdir/test_recover.vim
+
+Patch 8.0.0339
+Problem: Illegal memory access with vi'
+Solution: For quoted text objects bail out if the Visual area spans more
+ than one line.
+Files: src/search.c, src/testdir/test_visual.vim
+
+Patch 8.0.0340
+Problem: Not checking return value of dict_add(). (Coverity)
+Solution: Handle a failure.
+Files: src/buffer.c
+
+Patch 8.0.0341
+Problem: When using complete() and typing a character undo is saved after
+ the character was inserted. (Shougo)
+Solution: Save for undo before inserting the character.
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0342
+Problem: Double free when compiled with EXITFREE and setting 'ttytype'.
+Solution: Avoid setting P_ALLOCED on 'ttytype'. (Dominique Pelle,
+ closes #1461)
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.0.0343
+Problem: b:changedtick can be unlocked, even though it has no effect.
+ (Nikolai Pavlov)
+Solution: Add a check and error E940. (closes #1496)
+Files: src/eval.c, src/testdir/test_changedtick.vim, runtime/doc/eval.txt
+
+Patch 8.0.0344
+Problem: Unlet command leaks memory. (Nikolai Pavlov)
+Solution: Free the memory on error. (closes #1497)
+Files: src/eval.c, src/testdir/test_unlet.vim
+
+Patch 8.0.0345
+Problem: islocked('d.changedtick') does not work.
+Solution: Make it work.
+Files: src/buffer.c, src/eval.c, src/evalfunc.c, src/vim.h,
+ src/testdir/test_changedtick.vim,
+
+Patch 8.0.0346
+Problem: Vim relies on limits.h to be included indirectly, but on Solaris 9
+ it may not be. (Ben Fritz)
+Solution: Always include limits.h.
+Files: src/os_unixx.h, src/vim.h
+
+Patch 8.0.0347
+Problem: When using CTRL-X CTRL-U inside a comment, the use of the comment
+ leader may not work. (Klement)
+Solution: Save and restore did_ai. (Christian Brabandt, closes #1494)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0348
+Problem: When building with a shadow directory on macOS lacks the
+ +clipboard feature.
+Solution: Link *.m files, specifically os_macosx.m. (Kazunobu Kuriyama)
+Files: src/Makefile
+
+Patch 8.0.0349
+Problem: Redrawing errors with GTK 3.
+Solution: When updating, first clear all rectangles and then draw them.
+ (Kazunobu Kuriyama, Christian Ludwig, closes #848)
+Files: src/gui_gtk_x11.c
+
+Patch 8.0.0350
+Problem: Not enough test coverage for Perl.
+Solution: Add more Perl tests. (Dominique Pelle, closes #1500)
+Files: src/testdir/test_perl.vim
+
+Patch 8.0.0351
+Problem: No test for concatenating an empty string that results from out of
+ bounds indexing.
+Solution: Add a simple test.
+Files: src/testdir/test_expr.vim
+
+Patch 8.0.0352
+Problem: The condition for when a typval needs to be cleared is too
+ complicated.
+Solution: Init the type to VAR_UNKNOWN and always clear it.
+Files: src/eval.c
+
+Patch 8.0.0353
+Problem: If [RO] in the status line is translated to a longer string, it is
+ truncated to 4 bytes.
+Solution: Skip over the resulting string. (Jente Hidskes, closes #1499)
+Files: src/screen.c
+
+Patch 8.0.0354
+Problem: Test to check that setting termcap key fails sometimes.
+Solution: Check for "t_k1" to exist. (Christian Brabandt, closes #1459)
+Files: src/testdir/test_assign.vim
+
+Patch 8.0.0355
+Problem: Using uninitialized memory when 'isfname' is empty.
+Solution: Don't call getpwnam() without an argument. (Dominique Pelle,
+ closes #1464)
+Files: src/misc1.c, src/testdir/test_options.vim
+
+Patch 8.0.0356 (after 8.0.0342)
+Problem: Leaking memory when setting 'ttytype'.
+Solution: Get free_oldval from the right option entry.
+Files: src/option.c
+
+Patch 8.0.0357
+Problem: Crash when setting 'guicursor' to weird value.
+Solution: Avoid negative size. (Dominique Pelle, closes #1465)
+Files: src/misc2.c, src/testdir/test_options.vim
+
+Patch 8.0.0358
+Problem: Invalid memory access in C-indent code.
+Solution: Don't go over end of empty line. (Dominique Pelle, closes #1492)
+Files: src/edit.c, src/testdir/test_options.vim
+
+Patch 8.0.0359
+Problem: 'number' and 'relativenumber' are not properly tested.
+Solution: Add tests, change old style to new style tests. (Ozaki Kiichi,
+ closes #1447)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test89.in, src/testdir/test89.ok,
+ src/testdir/test_alot.vim, src/testdir/test_findfile.vim,
+ src/testdir/test_number.vim
+
+Patch 8.0.0360
+Problem: Sometimes VimL is used, which is confusing.
+Solution: Consistently use "Vim script". (Hirohito Higashi)
+Files: runtime/doc/if_mzsch.txt, runtime/doc/if_pyth.txt,
+ runtime/doc/syntax.txt, runtime/doc/usr_02.txt,
+ runtime/doc/version7.txt, src/Makefile, src/eval.c,
+ src/ex_getln.c, src/if_py_both.h, src/if_xcmdsrv.c,
+ src/testdir/Make_all.mak, src/testdir/runtest.vim,
+ src/testdir/test49.vim, src/testdir/test_vimscript.vim,
+ src/testdir/test_viml.vim
+
+Patch 8.0.0361
+Problem: GUI initialisation is not sufficiently tested.
+Solution: Add the gui_init test. (Kazunobu Kuriyama)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Makefile,
+ src/testdir/gui_init.vim, src/testdir/setup_gui.vim,
+ src/testdir/test_gui.vim, src/testdir/test_gui_init.vim, Filelist
+
+Patch 8.0.0362 (after 8.0.0361)
+Problem: Tests fail on MS-Windows.
+Solution: Use $*.vim instead of $<.
+Files: src/testdir/Make_dos.mak
+
+Patch 8.0.0363
+Problem: Travis is too slow to keep up with patches.
+Solution: Increase git depth to 20
+Files: .travis.yml
+
+Patch 8.0.0364
+Problem: ]s does not move cursor with two spell errors in one line. (Manuel
+ Ortega)
+Solution: Don't stop search immediately when wrapped, search the line first.
+ (Ken Takata) Add a test.
+Files: src/spell.c, src/Makefile, src/testdir/test_spell.vim,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0365
+Problem: Might free a dict item that wasn't allocated.
+Solution: Call dictitem_free(). (Nikolai Pavlov) Use this for
+ b:changedtick.
+Files: src/dict.c, src/structs.h, src/buffer.c, src/edit.c,
+ src/evalfunc.c, src/ex_docmd.c, src/fileio.c, src/main.c,
+ src/memline.c, src/misc1.c, src/syntax.c
+
+Patch 8.0.0366 (after 8.0.0365)
+Problem: Build fails with tiny features.
+Solution: Add #ifdef.
+Files: src/buffer.c
+
+Patch 8.0.0367
+Problem: If configure defines _LARGE_FILES some include files are included
+ before it is defined.
+Solution: Include vim.h first. (Sam Thursfield, closes #1508)
+Files: src/gui_at_sb.c, src/gui_athena.c, src/gui_motif.c, src/gui_x11.c,
+ src/gui_xmdlg.c
+
+Patch 8.0.0368
+Problem: Not all options are tested with a range of values.
+Solution: Generate a test script from the source code.
+Files: Filelist, src/gen_opt_test.vim, src/testdir/test_options.vim,
+ src/Makefile
+
+Patch 8.0.0369 (after 8.0.0368)
+Problem: The 'balloondelay', 'ballooneval' and 'balloonexpr' options are
+ not defined without the +balloon_eval feature. Testing that an
+ option value fails does not work for unsupported options.
+Solution: Make the options defined but not supported. Don't test if
+ setting unsupported options fails.
+Files: src/option.c, src/gen_opt_test.vim
+
+Patch 8.0.0370
+Problem: Invalid memory access when setting wildchar empty.
+Solution: Avoid going over the end of the option value. (Dominique Pelle,
+ closes #1509) Make option test check all number options with
+ empty value.
+Files: src/gen_opt_test.vim, src/option.c, src/testdir/test_options.vim
+
+Patch 8.0.0371 (after 8.0.0365)
+Problem: Leaking memory when setting v:completed_item.
+Solution: Or the flags instead of setting them.
+Files: src/eval.c
+
+Patch 8.0.0372
+Problem: More options are not always defined.
+Solution: Consistently define all possible options.
+Files: src/option.c, src/testdir/test_expand_dllpath.vim
+
+Patch 8.0.0373
+Problem: Build fails without +folding.
+Solution: Move misplaced #ifdef.
+Files: src/option.c
+
+Patch 8.0.0374
+Problem: Invalid memory access when using :sc in Ex mode. (Dominique Pelle)
+Solution: Avoid the column being negative. Also fix a hang in Ex mode.
+Files: src/ex_getln.c, src/ex_cmds.c, src/testdir/test_substitute.vim
+
+Patch 8.0.0375
+Problem: The "+ register is not tested.
+Solution: Add a test using another Vim instance to change the "+ register.
+ (Kazunobu Kuriyama)
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0376
+Problem: Size computations in spell file reading are not exactly right.
+Solution: Make "len" a "long" and check with LONG_MAX.
+Files: src/spellfile.c
+
+Patch 8.0.0377
+Problem: Possible overflow when reading corrupted undo file.
+Solution: Check if allocated size is not too big. (King)
+Files: src/undo.c
+
+Patch 8.0.0378
+Problem: Another possible overflow when reading corrupted undo file.
+Solution: Check if allocated size is not too big. (King)
+Files: src/undo.c
+
+Patch 8.0.0379
+Problem: CTRL-Z and mouse click use CTRL-O unnecessary.
+Solution: Remove stuffing CTRL-O. (James McCoy, closes #1453)
+Files: src/edit.c, src/normal.c
+
+Patch 8.0.0380
+Problem: With 'linebreak' set and 'breakat' includes ">" a double-wide
+ character results in "<<" displayed.
+Solution: Check for the character not to be replaced. (Ozaki Kiichi,
+ closes #1456)
+Files: src/screen.c, src/testdir/test_listlbr_utf8.vim
+
+Patch 8.0.0381
+Problem: Diff mode is not sufficiently tested.
+Solution: Add more diff mode tests. (Dominique Pelle, closes #1515)
+Files: src/testdir/test_diffmode.vim
+
+Patch 8.0.0382 (after 8.0.0380)
+Problem: Warning in tiny build for unused variable. (Tony Mechelynck)
+Solution: Add #ifdefs.
+Files: src/screen.c
+
+Patch 8.0.0383 (after 8.0.0382)
+Problem: Misplaced #ifdef. (Christ van Willegen)
+Solution: Split assignment.
+Files: src/screen.c
+
+Patch 8.0.0384
+Problem: Timer test failed for no apparent reason.
+Solution: Mark the test as flaky.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0385
+Problem: No tests for arabic.
+Solution: Add a first test for arabic. (Dominique Pelle, closes #1518)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_arabic.vim
+
+Patch 8.0.0386
+Problem: Tiny build has a problem with generating the options test.
+Solution: Change the "if" to skip over statements.
+Files: src/gen_opt_test.vim
+
+Patch 8.0.0387
+Problem: compiler warnings
+Solution: Add type casts. (Christian Brabandt)
+Files: src/channel.c, src/memline.c
+
+Patch 8.0.0388
+Problem: filtering lines through "cat", without changing the line count,
+ changes manual folds.
+Solution: Change how marks and folds are adjusted. (Matthew Malcomson, from
+ neovim #6194).
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.0.0389
+Problem: Test for arabic does not check what is displayed.
+Solution: Improve what is asserted. (Dominique Pelle, closes #1523)
+ Add a first shaping test.
+Files: src/testdir/test_arabic.vim
+
+Patch 8.0.0390
+Problem: When the window scrolls horizontally when the popup menu is
+ displayed part of it may not be cleared. (Neovim issue #6184)
+Solution: Remove the menu when the windows scrolled. (closes #1524)
+Files: src/edit.c
+
+Patch 8.0.0391
+Problem: Arabic support is verbose and not well tested.
+Solution: Simplify the code. Add more tests.
+Files: src/arabic.c, src/testdir/test_arabic.vim
+
+Patch 8.0.0392
+Problem: GUI test fails with Athena and Motif.
+Solution: Add test_ignore_error(). Use it to ignore the "failed to create
+ input context" error.
+Files: src/message.c, src/proto/message.pro, src/evalfunc.c,
+ src/testdir/test_gui.vim, runtime/doc/eval.txt
+
+Patch 8.0.0393 (after 8.0.0190)
+Problem: When the same tag appears more than once, the order is
+ unpredictable. (Charles Campbell)
+Solution: Besides using a dict for finding duplicates, use a grow array for
+ keeping the tags in sequence.
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.0.0394
+Problem: Tabs are not aligned when scrolling horizontally and a Tab doesn't
+ fit. (Axel Bender)
+Solution: Handle a Tab as a not fitting character. (Christian Brabandt)
+ Also fix that ":redraw" does not scroll horizontally to show the
+ cursor. And fix the test that depended on the old behavior.
+Files: src/screen.c, src/ex_docmd.c, src/testdir/test_listlbr.vim,
+ src/testdir/test_listlbr_utf8.vim,
+ src/testdir/test_breakindent.vim
+
+Patch 8.0.0395 (after 8.0.0392)
+Problem: Testing the + register fails with Motif.
+Solution: Also ignore the "failed to create input context" error in the
+ second gvim. Don't use msg() when it would result in a dialog.
+Files: src/message.c, src/testdir/test_gui.vim, src/testdir/setup_gui.vim
+
+Patch 8.0.0396
+Problem: 'balloonexpr' only works synchronously.
+Solution: Add balloon_show(). (Jusufadis Bakamovic, closes #1449)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/os_unix.c,
+ src/os_win32.c
+
+Patch 8.0.0397 (after 8.0.0392)
+Problem: Cannot build with the viminfo feature but without the eval
+ feature.
+Solution: Adjust #ifdef. (John Marriott)
+Files: src/message.c, src/misc2.c
+
+Patch 8.0.0398
+Problem: Illegal memory access with "t".
+Solution: Use strncmp() instead of memcmp(). (Dominique Pelle, closes #1528)
+Files: src/search.c, src/testdir/test_search.vim
+
+Patch 8.0.0399
+Problem: Crash when using balloon_show() when not supported. (Hirohito
+ Higashi)
+Solution: Check for balloonEval not to be NULL. (Ken Takata)
+Files: src/evalfunc.c, src/testdir/test_functions.vim
+
+Patch 8.0.0400
+Problem: Some tests have a one second delay.
+Solution: Add --not-a-term in RunVim().
+Files: src/testdir/shared.vim
+
+Patch 8.0.0401
+Problem: Test fails with missing balloon feature.
+Solution: Add check for balloon feature.
+Files: src/testdir/test_functions.vim
+
+Patch 8.0.0402
+Problem: :map completion does not have <special>. (Dominique Pelle)
+Solution: Recognize <special> in completion. Add a test.
+Files: src/getchar.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.0403
+Problem: GUI tests may fail.
+Solution: Ignore the E285 error better. (Kazunobu Kuriyama)
+Files: src/testdir/test_gui.vim, src/testdir/test_gui_init.vim
+
+Patch 8.0.0404
+Problem: Not enough testing for quickfix.
+Solution: Add some more tests. (Yegappan Lakshmanan)
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.0.0405
+Problem: v:progpath may become invalid after ":cd".
+Solution: Turn v:progpath into a full path if needed.
+Files: src/main.c, src/testdir/test_startup.vim, runtime/doc/eval.txt
+
+Patch 8.0.0406
+Problem: The arabic shaping code is verbose.
+Solution: Shorten the code without changing the functionality.
+Files: src/arabic.c
+
+Patch 8.0.0407 (after 8.0.0388)
+Problem: Filtering folds with marker method not tested.
+Solution: Also set 'foldmethod' to "marker".
+Files: src/testdir/test_fold.vim
+
+Patch 8.0.0408
+Problem: Updating folds does not work properly when inserting a file and a
+ few other situations.
+Solution: Adjust the way folds are updated. (Matthew Malcomson)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.0.0409
+Problem: set_progpath is defined but not always used
+Solution: Adjust #ifdef.
+Files: src/main.c
+
+Patch 8.0.0410
+Problem: Newer gettext/iconv library has extra dll file.
+Solution: Add the file to the Makefile and nsis script. (Christian Brabandt)
+Files: Makefile, nsis/gvim.nsi
+
+Patch 8.0.0411
+Problem: We can't change the case in menu entries, it breaks translations.
+Solution: Ignore case when looking up a menu translation.
+Files: src/menu.c, src/testdir/test_menu.vim
+
+Patch 8.0.0412 (after 8.0.0411)
+Problem: Menu test fails on MS-Windows.
+Solution: Use a menu entry with only ASCII characters.
+Files: src/testdir/test_menu.vim
+
+Patch 8.0.0413 (after 8.0.0412)
+Problem: Menu test fails on MS-Windows using gvim.
+Solution: First delete the English menus.
+Files: src/testdir/test_menu.vim
+
+Patch 8.0.0414
+Problem: Balloon eval is not tested.
+Solution: Add a few balloon tests. (Kazunobu Kuriyama)
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0415 (after 8.0.0414)
+Problem: Balloon test fails on MS-Windows.
+Solution: Test with 0x7fffffff instead of 0xffffffff.
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.0416
+Problem: Setting v:progpath is not quite right.
+Solution: On MS-Windows add the extension. On Unix use the full path for a
+ relative directory. (partly by James McCoy, closes #1531)
+Files: src/main.c, src/os_win32.c, src/os_unix.c
+
+Patch 8.0.0417
+Problem: Test for the clipboard fails sometimes.
+Solution: Add it to the flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0418
+Problem: ASAN logs are disabled and don't cause a failure.
+Solution: Enable ASAN logs and fail if not empty. (James McCoy,
+ closes #1425)
+Files: .travis.yml
+
+Patch 8.0.0419
+Problem: Test for v:progpath fails on MS-Windows.
+Solution: Expand to full path. Also add ".exe" when the path is an absolute
+ path.
+Files: src/os_win32.c, src/main.c
+
+Patch 8.0.0420
+Problem: When running :make the output may be in the system encoding,
+ different from 'encoding'.
+Solution: Add the 'makeencoding' option. (Ken Takata)
+Files: runtime/doc/options.txt, runtime/doc/quickfix.txt,
+ runtime/doc/quickref.txt, src/Makefile, src/buffer.c,
+ src/if_cscope.c, src/main.c, src/option.c, src/option.h,
+ src/proto/quickfix.pro, src/quickfix.c, src/structs.h,
+ src/testdir/Make_all.mak, src/testdir/test_makeencoding.py,
+ src/testdir/test_makeencoding.vim
+
+Patch 8.0.0421
+Problem: Diff mode is displayed wrong when adding a line at the end of a
+ buffer.
+Solution: Adjust marks in diff mode. (James McCoy, closes #1329)
+Files: src/misc1.c, src/ops.c, src/testdir/test_diffmode.vim
+
+Patch 8.0.0422
+Problem: Python test fails with Python 3.6.
+Solution: Convert new exception messages to old ones. (closes #1359)
+Files: src/testdir/test87.in
+
+Patch 8.0.0423
+Problem: The effect of adding "#" to 'cinoptions' is not always removed.
+ (David Briscoe)
+Solution: Reset b_ind_hash_comment. (Christian Brabandt, closes #1475)
+Files: src/misc1.c, src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_cindent.vim, src/testdir/test3.in
+
+Patch 8.0.0424
+Problem: Compiler warnings on MS-Windows. (Ajit Thakkar)
+Solution: Add type casts.
+Files: src/os_win32.c
+
+Patch 8.0.0425
+Problem: Build errors when building without folding.
+Solution: Add #ifdefs. (John Marriott)
+Files: src/diff.c, src/edit.c, src/option.c, src/syntax.c
+
+Patch 8.0.0426
+Problem: Insufficient testing for statusline.
+Solution: Add several tests. (Dominique Pelle, closes #1534)
+Files: src/testdir/test_statusline.vim
+
+Patch 8.0.0427
+Problem: 'makeencoding' missing from the options window.
+Solution: Add the entry.
+Files: runtime/optwin.vim
+
+Patch 8.0.0428
+Problem: Git and hg see new files after running tests. (Manuel Ortega)
+Solution: Add the generated file to .hgignore (or .gitignore). Delete the
+ resulting verbose file. (Christian Brabandt) Improve dependency
+ on opt_test.vim. Reset the 'more' option.
+Files: .hgignore, src/gen_opt_test.vim, src/testdir/gen_opt_test.vim,
+ src/Makefile, src/testdir/Make_all.mak, src/testdir/Makefile,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ Filelist
+
+Patch 8.0.0429
+Problem: Options test does not always test everything.
+Solution: Fix dependency for opt_test.vim. Give a message when opt_test.vim
+ was not found.
+Files: src/testdir/test_options.vim, src/testdir/gen_opt_test.vim,
+ src/testdir/Makefile, src/testdir/Make_all.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak
+
+Patch 8.0.0430
+Problem: Options test fails or hangs on MS-Windows.
+Solution: Run it separately instead of part of test_alot. Use "-S" instead
+ of "-u" to run the script. Fix failures.
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/Makefile, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/gen_opt_test.vim
+
+Patch 8.0.0431
+Problem: 'cinoptions' cannot set indent for extern block.
+Solution: Add the "E" flag in 'cinoptions'. (Hirohito Higashi)
+Files: runtime/doc/indent.txt, src/misc1.c, src/structs.h,
+ src/testdir/test_cindent.vim
+
+Patch 8.0.0432
+Problem: "make shadow" creates an invalid link.
+Solution: Don't link "*.vim". (Kazunobu Kuriyama)
+Files: src/Makefile
+
+Patch 8.0.0433
+Problem: Quite a few beeps when running tests.
+Solution: Set 'belloff' for these tests. (Christian Brabandt)
+Files: src/testdir/test103.in, src/testdir/test14.in,
+ src/testdir/test29.in, src/testdir/test30.in,
+ src/testdir/test32.in, src/testdir/test45.in,
+ src/testdir/test72.in, src/testdir/test73.in,
+ src/testdir/test77.in, src/testdir/test78.in,
+ src/testdir/test85.in, src/testdir/test94.in,
+ src/testdir/test_alot.vim, src/testdir/test_alot_utf8.vim,
+ src/testdir/test_close_count.in, src/testdir/test_cmdline.vim,
+ src/testdir/test_diffmode.vim, src/testdir/test_digraph.vim,
+ src/testdir/test_erasebackword.in, src/testdir/test_normal.vim,
+ src/testdir/test_packadd.vim, src/testdir/test_search.vim,
+ src/testdir/test_textobjects.vim, src/testdir/test_undo.vim,
+ src/testdir/test_usercommands.vim, src/testdir/test_visual.vim
+
+Patch 8.0.0434
+Problem: Clang version not correctly detected.
+Solution: Adjust the configure script. (Kazunobu Kuriyama)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.0435
+Problem: Some functions are not tested.
+Solution: Add more tests for functions. (Dominique Pelle, closes #1541)
+Files: src/testdir/test_functions.vim
+
+Patch 8.0.0436
+Problem: Running the options test sometimes resizes the terminal.
+Solution: Clear out t_WS.
+Files: src/testdir/gen_opt_test.vim
+
+Patch 8.0.0437
+Problem: The packadd test does not create the symlink correctly and does
+ not test the right thing.
+Solution: Create the directory and symlink correctly.
+Files: src/testdir/test_packadd.vim
+
+Patch 8.0.0438
+Problem: The fnamemodify test changes 'shell' in a way later tests may not
+ be able to use system().
+Solution: Save and restore 'shell'.
+Files: src/testdir/test_fnamemodify.vim
+
+Patch 8.0.0439
+Problem: Using ":%argdel" while the argument list is already empty gives an
+ error. (Pavol Juhas)
+Solution: Don't give an error. (closes #1546)
+Files: src/ex_cmds2.c, src/testdir/test_arglist.vim
+
+Patch 8.0.0440
+Problem: Not enough test coverage in Insert mode.
+Solution: Add lots of tests. Add test_override(). (Christian Brabandt,
+ closes #1521)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/edit.c,
+ src/evalfunc.c, src/globals.h, src/screen.c,
+ src/testdir/Make_all.mak, src/testdir/test_cursor_func.vim,
+ src/testdir/test_edit.vim, src/testdir/test_search.vim,
+ src/testdir/test_assert.vim, src/Makefile, src/testdir/runtest.vim
+
+Patch 8.0.0441
+Problem: Dead code in #ifdef.
+Solution: Remove the #ifdef and #else part.
+Files: src/option.c
+
+Patch 8.0.0442
+Problem: Patch shell command uses double quotes around the argument, which
+ allows for $HOME to be expanded. (Etienne)
+Solution: Use single quotes on Unix. (closes #1543)
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.0.0443
+Problem: Terminal width is set to 80 in test3.
+Solution: Instead of setting 'columns' set 'wrapmargin' depending on
+ 'columns.
+Files: src/testdir/test3.in
+
+Patch 8.0.0444 (after 8.0.0442)
+Problem: Diffpatch fails when the file name has a quote.
+Solution: Escape the name properly. (zetzei)
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.0.0445
+Problem: Getpgid is not supported on all systems.
+Solution: Add a configure check.
+Files: src/configure.ac, src/auto/configure, src/config.h.in,
+ src/os_unix.c
+
+Patch 8.0.0446
+Problem: The ";" command does not work after characters with a lower byte
+ that is NUL.
+Solution: Properly check for not having a previous character. (Hirohito
+ Higashi)
+Files: src/Makefile, src/search.c, src/testdir/test_alot_utf8.vim,
+ src/testdir/test_charsearch_utf8.vim
+
+Patch 8.0.0447
+Problem: Getting font name does not work on X11.
+Solution: Implement gui_mch_get_fontname() for X11. Add more GUI tests.
+ (Kazunobu Kuriyama)
+Files: src/gui_x11.c, src/syntax.c, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Makefile,
+ src/testdir/gui_init.vim, src/testdir/gui_preinit.vim,
+ src/testdir/test_gui.vim, src/testdir/test_gui_init.vim,
+ Filelist
+
+Patch 8.0.0448
+Problem: Some macros are in lower case, which can be confusing.
+Solution: Make a few lower case macros upper case.
+Files: src/macros.h, src/buffer.c, src/charset.c, src/ops.c, src/diff.c,
+ src/edit.c, src/evalfunc.c, src/ex_cmds.c, src/ex_getln.c,
+ src/fileio.c, src/fold.c, src/gui.c, src/gui_beval.c, src/main.c,
+ src/mark.c, src/misc1.c, src/move.c, src/normal.c,
+ src/option.c, src/popupmnu.c, src/regexp.c, src/screen.c,
+ src/search.c, src/spell.c, src/tag.c, src/ui.c, src/undo.c,
+ src/version.c, src/workshop.c, src/if_perl.xs
+
+Patch 8.0.0449 (after 8.0.0448)
+Problem: Part of fold patch accidentally included.
+Solution: Revert that part of the patch.
+Files: src/ex_cmds.c
+
+Patch 8.0.0450
+Problem: v:progpath is not reliably set.
+Solution: Read /proc/self/exe if possible. (idea by Michal Grochmal)
+ Also fixes missing #if.
+Files: src/main.c, src/config.h.in
+
+Patch 8.0.0451
+Problem: Some macros are in lower case.
+Solution: Make a few more macros upper case. Avoid lower case macros use an
+ argument twice.
+Files: src/macros.h, src/charset.c, src/misc2.c, src/proto/misc2.pro,
+ src/edit.c, src/eval.c, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/fileio.c, src/fold.c,
+ src/gui.c, src/gui_gtk.c, src/mark.c, src/memline.c, src/mbyte.c,
+ src/menu.c, src/message.c, src/misc1.c, src/ops.c, src/option.c,
+ src/os_amiga.c, src/os_mswin.c, src/os_unix.c, src/os_win32.c,
+ src/popupmnu.c, src/regexp.c, src/regexp_nfa.c, src/screen.c,
+ src/search.c, src/spell.c, src/spellfile.c, src/syntax.c,
+ src/tag.c, src/ui.c, src/undo.c, src/window.c
+
+Patch 8.0.0452
+Problem: Some macros are in lower case.
+Solution: Make a few more macros upper case.
+Files: src/vim.h, src/macros.h, src/evalfunc.c, src/fold.c,
+ src/gui_gtk.c, src/gui_gtk_x11.c, src/charset.c, src/diff.c,
+ src/edit.c, src/eval.c, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/fileio.c, src/getchar.c,
+ src/gui.c, src/gui_w32.c, src/if_cscope.c, src/mbyte.c,
+ src/menu.c, src/message.c, src/misc1.c, src/misc2.c, src/normal.c,
+ src/ops.c, src/option.c, src/os_unix.c, src/os_win32.c,
+ src/quickfix.c, src/regexp.c, src/regexp_nfa.c, src/screen.c,
+ src/search.c, src/spell.c, src/syntax.c, src/tag.c, src/userfunc.c
+
+Patch 8.0.0453
+Problem: Adding fold marker creates new comment.
+Solution: Use an existing comment if possible. (LemonBoy, closes #1549)
+Files: src/ops.c, src/proto/ops.pro, src/fold.c,
+ src/testdir/test_fold.vim
+
+Patch 8.0.0454
+Problem: Compiler warnings for comparing unsigned char with 256 always
+ being true. (Manuel Ortega)
+Solution: Add type cast.
+Files: src/screen.c, src/charset.c
+
+Patch 8.0.0455
+Problem: The mode test may hang in Test_mode(). (Michael Soyka)
+Solution: Set 'complete' to only search the current buffer (as suggested by
+ Michael)
+Files: src/testdir/test_functions.vim
+
+Patch 8.0.0456
+Problem: Typo in MinGW test makefile.
+Solution: Change an underscore to a dot. (Michael Soyka)
+Files: src/testdir/Make_ming.mak
+
+Patch 8.0.0457
+Problem: Using :move messes up manual folds.
+Solution: Split adjusting marks and folds. Add foldMoveRange(). (neovim
+ patch #6221)
+Files: src/ex_cmds.c, src/fold.c, src/mark.c, src/proto/fold.pro,
+ src/proto/mark.pro src/testdir/test_fold.vim
+
+Patch 8.0.0458
+Problem: Potential crash if adding list or dict to dict fails.
+Solution: Make sure the reference count is correct. (Nikolai Pavlov, closes
+ #1555)
+Files: src/dict.c
+
+Patch 8.0.0459 (after 8.0.0457)
+Problem: Old fix for :move messing up folding no longer needed, now that we
+ have a proper solution.
+Solution: Revert patch 7.4.700. (Christian Brabandt)
+Files: src/ex_cmds.c
+
+Patch 8.0.0460 (after 8.0.0452)
+Problem: Can't build on HPUX.
+Solution: Fix argument names in vim_stat(). (John Marriott)
+Files: src/misc2.c
+
+Patch 8.0.0461 (after 8.0.0457)
+Problem: Test 45 hangs on MS-Windows.
+Solution: Reset 'shiftwidth'. Also remove redundant function.
+Files: src/fold.c, src/testdir/test45.in
+
+Patch 8.0.0462
+Problem: If an MS-Windows tests succeeds at first and then fails in a way
+ it does not produce a test.out file it looks like the test
+ succeeded.
+Solution: Delete the previous output file.
+Files: src/testdir/Make_dos.mak
+
+Patch 8.0.0463
+Problem: Resetting 'compatible' in defaults.vim has unexpected side
+ effects. (David Fishburn)
+Solution: Only reset 'compatible' if it was set.
+Files: runtime/defaults.vim
+
+Patch 8.0.0464
+Problem: Can't find executable name on Solaris and FreeBSD.
+Solution: Check for "/proc/self/path/a.out". (Danek Duvall) And for
+ "/proc/curproc/file".
+Files: src/config.h.in, src/configure.ac, src/main.c,
+ src/auto/configure
+
+Patch 8.0.0465
+Problem: Off-by-one error in using :move with folding.
+Solution: Correct off-by-one mistakes and add more tests. (Matthew
+ Malcomson)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.0.0466
+Problem: There are still a few macros that should be all-caps.
+Solution: Make a few more macros all-caps.
+Files: src/buffer.c, src/edit.c, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/farsi.c, src/fileio.c,
+ src/getchar.c, src/gui_beval.c, src/hardcopy.c, src/if_cscope.c,
+ src/if_xcmdsrv.c, src/mark.c, src/memline.c, src/menu.c,
+ src/message.c, src/misc1.c, src/normal.c, src/ops.c, src/option.c,
+ src/quickfix.c, src/screen.c, src/search.c, src/syntax.c,
+ src/tag.c, src/term.c, src/term.h, src/ui.c, src/undo.c,
+ src/userfunc.c, src/version.c, src/vim.h
+
+Patch 8.0.0467
+Problem: Using g< after :for does not show the right output. (Marcin
+ Szamotulski)
+Solution: Call msg_sb_eol() in :echomsg.
+Files: src/eval.c
+
+Patch 8.0.0468
+Problem: After aborting an Ex command g< does not work. (Marcin
+ Szamotulski)
+Solution: Postpone clearing scrollback messages to until the command line
+ has been entered. Also fix that the screen isn't redrawn if after
+ g< the command line is cancelled.
+Files: src/message.c, src/proto/message.pro, src/ex_getln.c, src/misc2.c,
+ src/gui.c
+
+Patch 8.0.0469
+Problem: Compiler warnings on MS-Windows.
+Solution: Add type casts. (Christian Brabandt)
+Files: src/fold.c
+
+Patch 8.0.0470
+Problem: Not enough testing for help commands.
+Solution: Add a few more help tests. (Dominique Pelle, closes #1565)
+Files: src/testdir/test_help.vim, src/testdir/test_help_tagjump.vim
+
+Patch 8.0.0471
+Problem: Exit callback test sometimes fails.
+Solution: Add it to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0472
+Problem: When a test fails and test.log is created, Test_edit_CTRL_I
+ matches it instead of test1.in.
+Solution: Match with runtest.vim instead.
+Files: src/testdir/test_edit.vim
+
+Patch 8.0.0473
+Problem: No test covering arg_all().
+Solution: Add a test expanding ##.
+Files: src/testdir/test_arglist.vim
+
+Patch 8.0.0474
+Problem: The client-server feature is not tested.
+Solution: Add a test.
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/shared.vim,
+ src/testdir/test_clientserver.vim, src/os_mswin.c
+
+Patch 8.0.0475
+Problem: Not enough testing for the client-server feature.
+Solution: Add more tests. Add the remote_startserver() function. Fix that
+ a locally evaluated expression uses function-local variables.
+Files: src/if_xcmdsrv.c, src/evalfunc.c, src/os_mswin.c,
+ src/proto/main.pro, src/testdir/test_clientserver.vim,
+ runtime/doc/eval.txt
+
+Patch 8.0.0476 (after 8.0.0475)
+Problem: Missing change to main.c.
+Solution: Add new function.
+Files: src/main.c
+
+Patch 8.0.0477
+Problem: The client-server test may hang when failing.
+Solution: Set a timer. Add assert_report()
+Files: src/testdir/test_clientserver.vim, src/testdir/runtest.vim,
+ src/eval.c, src/evalfunc.c, src/proto/eval.pro, src/if_xcmdsrv.c,
+ src/os_mswin.c, runtime/doc/eval.txt
+
+Patch 8.0.0478
+Problem: Tests use assert_true(0) and assert_false(1) to report errors.
+Solution: Use assert_report().
+Files: src/testdir/test_cscope.vim, src/testdir/test_expr.vim,
+ src/testdir/test_perl.vim, src/testdir/test_channel.vim,
+ src/testdir/test_cursor_func.vim, src/testdir/test_gui.vim,
+ src/testdir/test_menu.vim, src/testdir/test_popup.vim,
+ src/testdir/test_viminfo.vim, src/testdir/test_vimscript.vim,
+ src/testdir/test_assert.vim
+
+Patch 8.0.0479
+Problem: remote_peek() is not tested.
+Solution: Add a test.
+Files: src/testdir/test_clientserver.vim, src/testdir/runtest.vim
+
+Patch 8.0.0480
+Problem: The remote_peek() test fails on MS-Windows.
+Solution: Check for pending messages. Also report errors in the first run if
+ a flaky test fails twice.
+Files: src/os_mswin.c, src/testdir/runtest.vim
+
+Patch 8.0.0481
+Problem: Unnecessary if statement.
+Solution: Remove the statement. Fix "it's" vs "its" mistakes. (Dominique
+ Pelle, closes #1568)
+Files: src/syntax.c
+
+Patch 8.0.0482
+Problem: The setbufvar() function may mess up the window layout. (Kay Z.)
+Solution: Do not check the window to be valid if it is NULL.
+Files: src/window.c, src/testdir/test_functions.vim
+
+Patch 8.0.0483
+Problem: Illegal memory access when using :all. (Dominique Pelle)
+Solution: Adjust the cursor position right after setting "curwin".
+Files: src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 8.0.0484
+Problem: Using :lhelpgrep with an argument that should fail does not
+ produce an error if the previous :helpgrep worked.
+Solution: Use another way to detect that autocommands made the quickfix info
+ invalid. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0485
+Problem: Not all windows commands are tested.
+Solution: Add more tests for windows commands. (Dominique Pelle,
+ closes #1575) Run test_autocmd separately, it interferes with
+ other tests. Fix tests that depended on side effects.
+Files: src/testdir/test_window_cmd.vim, src/testdir/test_alot.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_fnamemodify.vim,
+ src/testdir/test_functions.vim, src/testdir/test_delete.vim,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0486
+Problem: Crash and endless loop when closing windows in a SessionLoadPost
+ autocommand.
+Solution: Check for valid tabpage. (partly neovim #6308)
+Files: src/testdir/test_autocmd.vim, src/fileio.c, src/proto/window.pro,
+ src/window.c
+
+Patch 8.0.0487
+Problem: The autocmd test hangs on MS-Windows.
+Solution: Skip the hanging tests for now.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.0.0488
+Problem: Running tests leaves an "xxx" file behind.
+Solution: Delete the 'verbosefile' after resetting the option.
+Files: src/testdir/gen_opt_test.vim
+
+Patch 8.0.0489
+Problem: Clipboard and "* register is not tested.
+Solution: Add a test for Mac and X11. (Kazunobu Kuriyama)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/test_quotestar.vim, src/testdir/runtest.vim
+
+Patch 8.0.0490
+Problem: Splitting a 'winfixwidth' window vertically makes it one column
+ smaller. (Dominique Pelle)
+Solution: Add one to the width for the separator.
+Files: src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 8.0.0491
+Problem: The quotestar test fails when a required feature is missing.
+Solution: Prepend "Skipped" to the thrown exception.
+Files: src/testdir/test_quotestar.vim
+
+Patch 8.0.0492
+Problem: A failing client-server request can make Vim hang.
+Solution: Add a timeout argument to functions that wait.
+Files: src/evalfunc.c, src/if_xcmdsrv.c, src/proto/if_xcmdsrv.pro,
+ src/main.c, src/os_mswin.c, src/proto/os_mswin.pro,
+ src/vim.h, runtime/doc/eval.txt, src/testdir/test_clientserver.vim
+
+Patch 8.0.0493
+Problem: Crash with cd command with very long argument.
+Solution: Check for running out of space. (Dominique Pelle, closes #1576)
+Files: src/testdir/test_alot.vim, src/testdir/test_cd.vim, src/Makefile,
+ src/misc2.c
+
+Patch 8.0.0494
+Problem: Build failure with older compiler on MS-Windows.
+Solution: Move declaration to start of block.
+Files: src/evalfunc.c, src/main.c, src/os_mswin.c
+
+Patch 8.0.0495
+Problem: The quotestar test uses a timer instead of a timeout, thus it
+ cannot be rerun like a flaky test.
+Solution: Remove the timer and add a timeout. (Kazunobu Kuriyama)
+Files: src/testdir/test_quotestar.vim
+
+Patch 8.0.0496
+Problem: Insufficient testing for folding.
+Solution: Add a couple more fold tests. (Dominique Pelle, closes #1579)
+Files: src/testdir/test_fold.vim
+
+Patch 8.0.0497
+Problem: Arabic support is not fully tested.
+Solution: Add more tests for the untested functions. Comment out
+ unreachable code.
+Files: src/arabic.c, src/testdir/test_arabic.vim
+
+Patch 8.0.0498
+Problem: Two autocmd tests are skipped on MS-Windows.
+Solution: Make the test pass on MS-Windows. Write the messages in a file
+ instead of getting the output of system().
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.0.0499
+Problem: taglist() does not prioritize tags for a buffer.
+Solution: Add an optional buffer argument. (Duncan McDougall, closes #1194)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/proto/tag.pro,
+ src/Makefile, src/tag.c, src/testdir/test_alot.vim,
+ src/testdir/test_taglist.vim
+
+Patch 8.0.0500
+Problem: Quotestar test is still a bit flaky.
+Solution: Add a slower check for v:version.
+Files: src/testdir/test_quotestar.vim
+
+Patch 8.0.0501
+Problem: On MS-Windows ":!start" does not work as expected.
+Solution: When creating a process fails try passing the argument to
+ ShellExecute(). (Katsuya Hino, closes #1570)
+Files: runtime/doc/os_win32.txt, src/os_win32.c
+
+Patch 8.0.0502
+Problem: Coverity complains about possible NULL pointer.
+Solution: Add an assert(), let's see if this works on all systems.
+Files: src/window.c
+
+Patch 8.0.0503
+Problem: Endless loop in updating folds with 32 bit ints.
+Solution: Subtract from LHS instead of add to the RHS. (Matthew Malcomson)
+Files: src/fold.c
+
+Patch 8.0.0504
+Problem: Looking up an Ex command is a bit slow.
+Solution: Instead of just using the first letter, also use the second letter
+ to skip ahead in the list of commands. Generate the table with a
+ Perl script. (Dominique Pelle, closes #1589)
+Files: src/Makefile, src/create_cmdidxs.pl, src/ex_docmd.c, Filelist
+
+Patch 8.0.0505
+Problem: Failed window split for :stag not handled. (Coverity CID 99204)
+Solution: If the split fails skip to the end. (bstaletic, closes #1577)
+Files: src/tag.c
+
+Patch 8.0.0506 (after 8.0.0504)
+Problem: Can't build with ANSI C.
+Solution: Move declarations to start of block.
+Files: src/ex_docmd.c
+
+Patch 8.0.0507
+Problem: Client-server tests fail when $DISPLAY is not set.
+Solution: Check for E240 before running the test.
+Files: src/testdir/test_quotestar.vim, src/testdir/test_clientserver.vim
+
+Patch 8.0.0508
+Problem: Coveralls no longer shows per-file coverage.
+Solution: Add coverage from codecov.io. (Christian Brabandt)
+Files: .travis.yml
+
+Patch 8.0.0509
+Problem: No link to codecov.io results.
+Solution: Add a badge to the readme file.
+Files: README.md
+
+Patch 8.0.0510 (after 8.0.0509)
+Problem: Typo in link to codecov.io results.
+Solution: Remove duplicate https:.
+Files: README.md
+
+Patch 8.0.0511
+Problem: Message for skipping client-server tests is unclear.
+Solution: Be more specific about what's missing (Hirohito Higashi, Kazunobu
+ Kuriyama)
+Files: src/testdir/test_quotestar.vim, src/testdir/test_clientserver.vim
+
+Patch 8.0.0512
+Problem: Check for available characters takes too long.
+Solution: Only check did_start_blocking if wtime is negative. (Daisuke
+ Suzuki, closes #1591)
+Files: src/os_unix.c
+
+Patch 8.0.0513 (after 8.0.0201)
+Problem: Getting name of cleared highlight group is wrong. (Matt Wozniski)
+Solution: Only skip over cleared names for completion. (closes #1592)
+ Also fix that a cleared group causes duplicate completions.
+Files: src/syntax.c, src/proto/syntax.pro, src/evalfunc.c,
+ src/ex_cmds.c, src/testdir/test_syntax.vim,
+ src/testdir/test_cmdline.vim
+
+Patch 8.0.0514
+Problem: Script for creating cmdidxs can be improved.
+Solution: Count skipped lines instead of collecting the lines. Add "const".
+ (Dominique Pelle, closes #1594)
+Files: src/create_cmdidxs.pl, src/ex_docmd.c
+
+Patch 8.0.0515
+Problem: ml_get errors in silent Ex mode. (Dominique Pelle)
+Solution: Clear valid flags when setting the cursor. Set the topline when
+ not in full screen mode.
+Files: src/ex_docmd.c, src/move.c, src/testdir/test_startup.vim
+
+Patch 8.0.0516
+Problem: A large count on a normal command causes trouble. (Dominique
+ Pelle)
+Solution: Make "opcount" long.
+Files: src/globals.h, src/testdir/test_normal.vim
+
+Patch 8.0.0517
+Problem: There is no way to remove quickfix lists (for testing).
+Solution: Add the 'f' action to setqflist(). Add tests. (Yegappan
+ Lakshmanan)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0518
+Problem: Storing a zero byte from a multibyte character causes fold text
+ to show up wrong.
+Solution: Avoid putting zero in ScreenLines. (Christian Brabandt,
+ closes #1567)
+Files: src/screen.c, src/testdir/test_display.vim
+
+Patch 8.0.0519
+Problem: Character classes are not well tested. They can differ between
+ platforms.
+Solution: Add tests. In the documentation make clear which classes depend
+ on what library function. Only use :cntrl: and :graph: for ASCII.
+ (Kazunobu Kuriyama, Dominique Pelle, closes #1560)
+ Update the documentation.
+Files: src/regexp.c, src/regexp_nfa.c, runtime/doc/pattern.txt,
+ src/testdir/test_regexp_utf8.vim
+
+Patch 8.0.0520
+Problem: Using a function pointer instead of the actual function, which we
+ know.
+Solution: Change mb_ functions to utf_ functions when already checked for
+ Unicode. (Dominique Pelle, closes #1582)
+Files: src/message.c, src/misc2.c, src/regexp.c, src/regexp_nfa.c,
+ src/screen.c, src/spell.c
+
+Patch 8.0.0521
+Problem: GtkForm handling is outdated.
+Solution: Get rid of event filter functions. Get rid of GtkForm.width and
+ .height. Eliminate gtk_widget_size_request() calls. (Kazunobu
+ Kuriyama)
+Files: src/gui_gtk_f.c, src/gui_gtk_f.h
+
+Patch 8.0.0522
+Problem: MS-Windows: when 'clipboard' is "unnamed" yyp does not work in a
+ :global command.
+Solution: When setting the clipboard was postponed, do not clear the
+ register.
+Files: src/ops.c, src/proto/ui.pro, src/ui.c, src/globals.h,
+ src/testdir/test_global.vim, src/Makefile,
+ src/testdir/test_alot.vim
+
+Patch 8.0.0523
+Problem: dv} deletes part of a multibyte character. (Urtica Dioica)
+Solution: Include the whole character.
+Files: src/search.c, src/testdir/test_normal.vim
+
+Patch 8.0.0524 (after 8.0.0518)
+Problem: Folds are messed up when 'encoding' is "utf-8".
+Solution: Also set the fold character when it's not multibyte.
+Files: src/screen.c, src/testdir/test_display.vim
+
+Patch 8.0.0525
+Solution: Completion for user command argument not tested.
+Problem: Add a test.
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.0.0526
+Problem: Coverity complains about possible negative value.
+Solution: Check return value of ftell() not to be negative.
+Files: src/os_unix.c
+
+Patch 8.0.0527
+Problem: RISC OS support was removed long ago, but one file is still
+ included.
+Solution: Delete the file. (Thomas Dziedzic, closes #1603)
+Files: Filelist, src/swis.s
+
+Patch 8.0.0528
+Problem: When 'wildmenu' is set and 'wildmode' has "longest" then the first
+ file name is highlighted, even though the text shows the longest
+ match.
+Solution: Do not highlight the first match. (LemonBoy, closes #1602)
+Files: src/ex_getln.c
+
+Patch 8.0.0529
+Problem: Line in test commented out.
+Solution: Uncomment the lines for character classes that were failing before
+ 8.0.0519. (Dominique Pelle, closes #1599)
+Files: src/testdir/test_regexp_utf8.vim
+
+Patch 8.0.0530
+Problem: Buffer overflow when 'columns' is very big. (Nikolai Pavlov)
+Solution: Correctly compute where to truncate. Fix translation.
+ (closes #1600)
+Files: src/edit.c, src/testdir/test_edit.vim
+
+Patch 8.0.0531 (after 8.0.0530)
+Problem: Test with long directory name fails on non-unix systems.
+Solution: Skip the test on non-unix systems.
+Files: src/testdir/test_edit.vim
+
+Patch 8.0.0532 (after 8.0.0531)
+Problem: Test with long directory name fails on Mac.
+Solution: Skip the test on Mac systems.
+Files: src/testdir/test_edit.vim
+
+Patch 8.0.0533
+Problem: Abbreviation doesn't work after backspacing newline. (Hkonrk)
+Solution: Set the insert start column. (closes #1609)
+Files: src/testdir/test_mapping.vim, src/edit.c
+
+Patch 8.0.0534
+Problem: Defaults.vim does not work well with tiny features. (crd477)
+Solution: When the +eval feature is not available always reset 'compatible'.
+Files: runtime/defaults.vim
+
+Patch 8.0.0535
+Problem: Memory leak when exiting from within a user function.
+Solution: Clear the function call stack on exit.
+Files: src/userfunc.c
+
+Patch 8.0.0536
+Problem: Quickfix window not updated when freeing quickfix stack.
+Solution: Update the quickfix window. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0537
+Problem: Illegal memory access with :z and large count.
+Solution: Check for number overflow, using long instead of int. (Dominique
+ Pelle, closes #1612)
+Files: src/Makefile, src/ex_cmds.c, src/testdir/test_alot.vim,
+ src/testdir/test_ex_z.vim
+
+Patch 8.0.0538
+Problem: No test for falling back to default term value.
+Solution: Add a test.
+Files: src/testdir/test_startup.vim
+
+Patch 8.0.0539 (after 8.0.0538)
+Problem: Startup test fails on Mac.
+Solution: Use another term name, "unknown" is known. Avoid a 2 second delay.
+Files: src/testdir/test_startup.vim, src/main.c, src/proto/main.pro,
+ src/term.c
+
+Patch 8.0.0540 (after 8.0.0540)
+Problem: Building unit tests fails.
+Solution: Move params outside of #ifdef.
+Files: src/main.c, src/message_test.c
+
+Patch 8.0.0541
+Problem: Compiler warning on MS-Windows.
+Solution: Add a type cast. (Mike Williams)
+Files: src/edit.c
+
+Patch 8.0.0542
+Problem: getpos() can return a negative line number. (haya14busa)
+Solution: Handle a zero topline and botline. (closes #1613)
+Files: src/eval.c, runtime/doc/eval.txt
+
+Patch 8.0.0543
+Problem: Test_edit causes older xfce4-terminal to close. (Dominique Pelle)
+Solution: Reduce number of columns to 2000. Try to restore the window
+ position.
+Files: src/testdir/test_edit.vim, src/evalfunc.c, src/term.c,
+ src/proto/term.pro, src/term.h
+
+Patch 8.0.0544
+Problem: Cppcheck warnings.
+Solution: Use temp variable. Change NUL to NULL. Swap conditions. (Dominique
+ Pelle)
+Files: src/channel.c, src/edit.c, src/farsi.c
+
+Patch 8.0.0545
+Problem: Edit test may fail on some systems.
+Solution: If creating a directory with a very long path fails, bail out.
+Files: src/testdir/test_edit.vim
+
+Patch 8.0.0546
+Problem: Swap file exists briefly when opening the command window.
+Solution: Set the noswapfile command modifier before splitting the window.
+ (James McCoy, closes #1620)
+Files: src/ex_getln.c, src/option.c
+
+Patch 8.0.0547
+Problem: Extra line break in verbosefile when using ":echomsg". (Ingo
+ Karkat)
+Solution: Don't call msg_start(). (closes #1618)
+Files: src/eval.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.0548
+Problem: Saving the redo buffer only works one time, resulting in the "."
+ command not working well for a function call inside another
+ function call. (Ingo Karkat)
+Solution: Save the redo buffer at every user function call. (closes #1619)
+Files: src/getchar.c, src/proto/getchar.pro, src/structs.h,
+ src/fileio.c, src/userfunc.c, src/testdir/test_functions.vim
+
+Patch 8.0.0549
+Problem: No test for the 8g8 command.
+Solution: Add a test. (Dominique Pelle, closes #1615)
+Files: src/testdir/test_normal.vim
+
+Patch 8.0.0550
+Problem: Some etags format tags file use 0x01, breaking the parsing.
+Solution: Use 0x02 for TAG_SEP. (James McCoy, closes #1614)
+Files: src/tag.c, src/testdir/test_taglist.vim
+
+Patch 8.0.0551
+Problem: The typeahead buffer is reallocated too often.
+Solution: Re-use the existing buffer if possible.
+Files: src/getchar.c
+
+Patch 8.0.0552
+Problem: Toupper and tolower don't work properly for Turkish when 'casemap'
+ is empty. (Bjorn Linse)
+Solution: Check the 'casemap' options when deciding how to upper/lower case.
+Files: src/charset.c, src/testdir/test_normal.vim
+
+Patch 8.0.0553 (after 8.0.0552)
+Problem: Toupper/tolower test with Turkish locale fails on Mac.
+Solution: Skip the test on Mac.
+Files: src/testdir/test_normal.vim
+
+Patch 8.0.0554 (after 8.0.0552)
+Problem: Toupper and tolower don't work properly for Turkish when 'casemap'
+ contains "keepascii". (Bjorn Linse)
+Solution: When 'casemap' contains "keepascii" use ASCII toupper/tolower.
+Files: src/charset.c, src/testdir/test_normal.vim
+
+Patch 8.0.0555 (after 8.0.0552)
+Problem: Toupper/tolower test fails on OSX without Darwin.
+Solution: Skip that part of the test also for OSX. (Kazunobu Kuriyama)
+Files: src/testdir/test_normal.vim
+
+Patch 8.0.0556
+Problem: Getting the window position fails if both the GUI and term
+ code is built in.
+Solution: Return after getting the GUI window position. (Kazunobu Kuriyama)
+Files: src/evalfunc.c
+
+Patch 8.0.0557
+Problem: GTK: using static gravities is not useful.
+Solution: Remove setting static gravities. (Kazunobu Kuriyama)
+Files: src/gui_gtk_f.c
+
+Patch 8.0.0558
+Problem: The :ownsyntax command is not tested.
+Solution: Add a test. (Dominique Pelle, closes #1622)
+Files: src/testdir/test_syntax.vim
+
+Patch 8.0.0559
+Problem: Setting 'ttytype' to xxx does not always fail as expected. (Marvin
+ Schmidt)
+Solution: Catch both possible errors. (closes #1601)
+Files: src/testdir/test_options.vim
+
+Patch 8.0.0560
+Problem: :windo allows for ! but it's not supported.
+Solution: Disallow passing !. (Hirohito Higashi)
+Files: src/ex_cmds.h
+
+Patch 8.0.0561
+Problem: Undefined behavior when using backslash after empty line.
+Solution: Check for an empty line. (Dominique Pelle, closes #1631)
+Files: src/misc2.c, src/testdir/test_vimscript.vim
+
+Patch 8.0.0562
+Problem: Not enough test coverage for syntax commands.
+Solution: Add a few more tests. (Dominique Pelle, closes #1624)
+Files: src/testdir/test_cmdline.vim, src/testdir/test_syntax.vim
+
+Patch 8.0.0563
+Problem: Crash when getting the window position in tmux. (Marvin Schmidt)
+Solution: Add t_GP to the list of terminal options. (closes #1627)
+Files: src/option.c
+
+Patch 8.0.0564
+Problem: Cannot detect Bazel BUILD files on some systems.
+Solution: Check for BUILD after script checks. (Issue #1340)
+Files: runtime/filetype.vim
+
+Patch 8.0.0565
+Problem: Using freed memory in :caddbuf after clearing quickfix list.
+ (Dominique Pelle)
+Solution: Set qf_last to NULL.
+Files: src/quickfix.c
+
+Patch 8.0.0566
+Problem: Setting 'nocompatible' for the tiny version moves the cursor.
+Solution: Use another trick to skip commands when the +eval feature is
+ present. (Christian Brabandt, closes #1630)
+Files: runtime/defaults.vim
+
+Patch 8.0.0567
+Problem: Call for requesting color and ambiwidth is too early. (Hirohito
+ Higashi)
+Solution: Move the call down to below resetting "starting".
+Files: src/main.c
+
+Patch 8.0.0568
+Problem: "1gd" may hang.
+Solution: Don't get stuck in one position. (Christian Brabandt, closes #1643)
+Files: src/testdir/test_goto.vim, src/normal.c
+
+Patch 8.0.0569
+Problem: Bracketed paste is still enabled when executing a shell command.
+ (Michael Smith)
+Solution: Disable bracketed paste when going into cooked mode. (closes #1638)
+Files: src/term.c
+
+Patch 8.0.0570
+Problem: Can't run make with several jobs, creating directories has a race
+ condition.
+Solution: Use the MKDIR_P autoconf mechanism. (Eric N. Vander Weele,
+ closes #1639)
+Files: src/configure.ac, src/auto/configure, src/Makefile,
+ src/config.mk.in, src/install-sh, src/mkinstalldirs, Filelist
+
+Patch 8.0.0571
+Problem: The cursor line number becomes negative when using :z^ in an empty
+ buffer. (neovim #6557)
+Solution: Correct the line number. Also reset the column.
+Files: src/testdir/test_ex_z.vim, src/ex_cmds.c
+
+Patch 8.0.0572
+Problem: Building the command table requires Perl.
+Solution: Use a Vim script solution. (Dominique Pelle, closes #1641)
+Files: src/Makefile, src/create_cmdidxs.pl, src/create_cmdidxs.vim,
+ src/ex_cmdidxs.h, src/ex_docmd.c, Filelist
+
+Patch 8.0.0573
+Problem: Running parallel make after distclean fails. (Manuel Ortega)
+Solution: Instead of using targets "scratch config myself" use "reconfig".
+Files: src/Makefile, src/config.mk.dist
+
+Patch 8.0.0574
+Problem: Get only one quickfix list after :caddbuf.
+Solution: Reset qf_multiline. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0575
+Problem: Using freed memory when resetting 'indentexpr' while evaluating
+ it. (Dominique Pelle)
+Solution: Make a copy of 'indentexpr'.
+Files: src/misc1.c, src/testdir/test_options.vim
+
+Patch 8.0.0576 (after 8.0.0570 and 8.0.0573)
+Problem: Can't build when configure chooses "install-sh". (Daniel Hahler)
+Solution: Always use install-sh. Fix remaining use of mkinstalldirs.
+ (closes #1647)
+Files: src/installman.sh, src/installml.sh, src/config.mk.in,
+ src/configure.ac, src/auto/configure, src/Makefile
+
+Patch 8.0.0577 (after 8.0.0575)
+Problem: Warning for uninitialized variable. (John Marriott)
+Solution: Initialize "indent".
+Files: src/misc1.c
+
+Patch 8.0.0578
+Problem: :simalt on MS-Windows does not work properly.
+Solution: Put something in the typeahead buffer. (Christian Brabandt)
+Files: src/gui_w32.c
+
+Patch 8.0.0579
+Problem: Duplicate test case for quickfix.
+Solution: Remove the function. (Yegappan Lakshmanan)
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.0.0580
+Problem: Cannot set the valid flag with setqflist().
+Solution: Add the "valid" argument. (Yegappan Lakshmanan, closes #1642)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0581
+Problem: Moving folded text is sometimes not correct.
+Solution: Bail out when "move_end" is zero. (Matthew Malcomson)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.0.0582
+Problem: Illegal memory access with z= command. (Dominique Pelle)
+Solution: Avoid case folded text to be longer than the original text. Use
+ MB_PTR2LEN() instead of MB_BYTE2LEN().
+Files: src/spell.c, src/testdir/test_spell.vim
+
+Patch 8.0.0583
+Problem: Fold test hangs on MS-Windows.
+Solution: Avoid overflow in compare.
+Files: src/fold.c
+
+Patch 8.0.0584
+Problem: Memory leak when executing quickfix tests.
+Solution: Free the list reference. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.0.0585
+Problem: Test_options fails when run in the GUI.
+Solution: Also check the 'imactivatekey' value when the GUI is not running.
+ Specify test values that work and that fail.
+Files: src/option.c, src/testdir/gen_opt_test.vim
+
+Patch 8.0.0586
+Problem: No test for mapping timing out.
+Solution: Add a test.
+Files: src/testdir/test_mapping.vim
+
+Patch 8.0.0587
+Problem: Configure check for return value of tgetent is skipped.
+Solution: Always perform the check. (Marvin Schmidt, closes #1664)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.0588
+Problem: job_stop() often assumes the channel will be closed, while the job
+ may not actually be stopped. (Martin Gammelsæter)
+Solution: Only assume the job stops on "kill". Don't send a signal if the
+ job has already ended. (closes #1632)
+Files: src/channel.c
+
+Patch 8.0.0589 (after 8.0.0578)
+Problem: :simalt still does not work.
+Solution: Use K_NOP instead of K_IGNORE. (Christian Brabandt)
+Files: src/gui_w32.c
+
+Patch 8.0.0590
+Problem: Cannot add a context to locations.
+Solution: Add the "context" entry in location entries. (Yegappan Lakshmanan,
+ closes #1012)
+Files: src/eval.c, src/proto/quickfix.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0591
+Problem: Changes to eval functionality not documented.
+Solution: Include all the changes.
+Files: runtime/doc/eval.txt
+
+Patch 8.0.0592
+Problem: If a job writes to a buffer and the user is typing a command, the
+ screen isn't updated. When a message is displayed the changed
+ buffer may cause it to be cleared. (Ramel Eshed)
+Solution: Update the screen and then the command line if the screen didn't
+ scroll. Avoid inserting screen lines, as it clears any message.
+ Update the status line when the buffer changed.
+Files: src/channel.c, src/screen.c, src/ex_getln.c, src/globals.h,
+ src/vim.h, src/proto/ex_getln.pro, src/proto/screen.pro
+
+Patch 8.0.0593
+Problem: Duplication of code for adding a list or dict return value.
+Solution: Add rettv_dict_set() and rettv_list_set(). (Yegappan Lakshmanan)
+Files: src/dict.c, src/eval.c, src/evalfunc.c, src/if_perl.xs, src/list.c,
+ src/proto/dict.pro, src/proto/list.pro
+
+Patch 8.0.0594 (after 8.0.0592)
+Problem: Build failure when windows feature is missing.
+Solution: Add #ifdef.
+Files: src/screen.c
+
+Patch 8.0.0595 (after 8.0.0590)
+Problem: Coverity warning for not checking return value of dict_add().
+Solution: Check the return value for FAIL.
+Files: src/quickfix.c
+
+Patch 8.0.0596
+Problem: Crash when complete() is called after complete_add() in
+ 'completefunc'. (Lifepillar)
+Solution: Bail out if compl_pattern is NULL. (closes #1668)
+ Also avoid using freed memory.
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0597
+Problem: Off-by-one error in buffer size computation.
+Solution: Use ">=" instead of ">". (LemonBoy, closes #1694)
+Files: src/quickfix.c
+
+Patch 8.0.0598
+Problem: Building with gcc 7.1 yields new warnings.
+Solution: Initialize result. (John Marriott)
+Files: src/ex_docmd.c
+
+Patch 8.0.0599
+Problem: diff mode is insufficiently tested
+Solution: Add more test cases. (Dominique Pelle, closes #1685)
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.0.0600
+Problem: test_recover fails on some systems.
+Solution: Explicitly check if "/" is writable. (Ken Takata)
+Files: src/testdir/test_recover.vim
+
+Patch 8.0.0601
+Problem: No test coverage for :spellrepall.
+Solution: Add a test. (Dominique Pelle, closes #1717)
+Files: src/testdir/test_spell.vim
+
+Patch 8.0.0602
+Problem: When gF fails to edit the file the cursor still moves to the found
+ line number.
+Solution: Check the return value of do_ecmd(). (Michael Hwang)
+Files: src/normal.c, src/testdir/test_gf.vim
+
+Patch 8.0.0603 (after 8.0.0602)
+Problem: gF test fails on MS-Windows.
+Solution: Use @ instead of : before the line number
+Files: src/testdir/test_gf.vim
+
+Patch 8.0.0604 (after 8.0.0603)
+Problem: gF test still fails on MS-Windows.
+Solution: Use : before the line number and remove it from 'isfname'.
+Files: src/testdir/test_gf.vim
+
+Patch 8.0.0605
+Problem: The buffer that quickfix caches for performance may become
+ invalid. (Daniel Hahler)
+Solution: Reset qf_last_bufref in qf_init_ext(). (Daniel Hahler,
+ closes #1728, closes #1676)
+Files: src/quickfix.c
+
+Patch 8.0.0606
+Problem: Cannot set the context for a specified quickfix list.
+Solution: Use the list index instead of the current list. (Yegappan
+ Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.0607
+Problem: When creating a bufref, then using :bwipe and :new it might get
+ the same memory and bufref_valid() returns true.
+Solution: Add br_fnum to check the buffer number didn't change.
+Files: src/structs.h, src/buffer.c, src/globals.h, src/if_py_both.h,
+ src/quickfix.c
+
+Patch 8.0.0608
+Problem: Cannot manipulate other than the current quickfix list.
+Solution: Pass the list index to quickfix functions. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.0.0609
+Problem: For some people the hint about quitting is not sufficient.
+Solution: Put <Enter> separately. Also use ":qa!" to get out even when
+ there are changes.
+Files: src/normal.c
+
+Patch 8.0.0610
+Problem: The screen is redrawn when t_BG is set and used to detect the
+ value for 'background'.
+Solution: Don't redraw when the value of 'background' didn't change.
+Files: src/term.c
+
+Patch 8.0.0611
+Problem: When t_u7 is sent a few characters in the second screen line are
+ overwritten and not redrawn later. (Rastislav Barlik)
+Solution: Move redrawing the screen to after overwriting the characters.
+Files: src/main.c, src/term.c
+
+Patch 8.0.0612
+Problem: Package directories are added to 'runtimepath' only after loading
+ non-package plugins.
+Solution: Split off the code to add package directories to 'runtimepath'.
+ (Ingo Karkat, closes #1680)
+Files: src/ex_cmds2.c, src/globals.h, src/main.c, src/proto/ex_cmds2.pro,
+ src/testdir/test_startup.vim
+
+Patch 8.0.0613
+Problem: The conf filetype detection is done before ftdetect scripts from
+ packages that are added later.
+Solution: Add the FALLBACK argument to :setfiletype. (closes #1679,
+ closes #1693)
+Files: src/ex_docmd.c, runtime/filetype.vim, src/Makefile,
+ src/testdir/test_filetype.vim, src/testdir/test_alot.vim
+
+Patch 8.0.0614
+Problem: float2nr() is not exactly right.
+Solution: Make float2nr() more accurate. Turn test65 into a new style test.
+ (Hirohito Higashi, closes #1688)
+Files: src/Makefile, src/evalfunc.c, src/testdir/Make_all.mak,
+ src/testdir/Make_vms.mms, src/testdir/test65.in,
+ src/testdir/test65.ok, src/testdir/test_float_func.vim,
+ src/testdir/test_vimscript.vim, src/macros.h
+
+Patch 8.0.0615
+Problem: Using % with :hardcopy wrongly escapes spaces. (Alexey Muranov)
+Solution: Expand % differently. (Christian Brabandt, closes #1682)
+Files: src/ex_docmd.c, src/testdir/test_hardcopy.vim
+
+
+Patch 8.0.0616
+Problem: When setting the cterm background with ":hi Normal" the value of
+ 'background' may be set wrongly.
+Solution: Check that the color is less than 16. Don't set 'background' when
+ it was set explicitly. (LemonBoy, closes #1710)
+Files: src/syntax.c, src/testdir/test_syntax.vim
+
+Patch 8.0.0617 (after 8.0.0615)
+Problem: Hardcopy test hangs on MS-Windows.
+Solution: Check the postscript feature is supported.
+Files: src/testdir/test_hardcopy.vim
+
+Patch 8.0.0618
+Problem: NFA regex engine handles [0-z] incorrectly.
+Solution: Return at the right point. (James McCoy, closes #1703)
+Files: src/regexp_nfa.c, src/testdir/test36.in, src/testdir/test36.ok
+
+Patch 8.0.0619
+Problem: In the GUI, when a timer uses feedkeys(), it still waits for an
+ event. (Raymond Ko)
+Solution: Check tb_change_cnt in one more place.
+Files: src/gui.c
+
+Patch 8.0.0620
+Problem: Since we only support GTK versions that have it, the check for
+ HAVE_GTK_MULTIHEAD is no longer needed.
+Solution: Remove HAVE_GTK_MULTIHEAD. (Kazunobu Kuriyama)
+Files: src/config.h.in, src/configure.ac, src/auto/configure,
+ src/gui_beval.c, src/gui_gtk_x11.c, src/mbyte.c
+
+Patch 8.0.0621
+Problem: The ":stag" command does not respect 'switchbuf'.
+Solution: Check 'switchbuf' for tag commands that may open a new window.
+ (Ingo Karkat, closes #1681) Define macros for the return values
+ of getfile().
+Files: src/tag.c, src/testdir/test_tagjump.vim, src/vim.h, src/buffer.c,
+ src/ex_cmds.c, src/search.c,
+
+Patch 8.0.0622
+Problem: Using a text object to select quoted text fails when 'selection'
+ is set to "exclusive". (Guraga)
+Solution: Swap cursor and visual start position. (Christian Brabandt,
+ closes #1687)
+Files: src/search.c, src/testdir/test_textobjects.vim
+
+Patch 8.0.0623
+Problem: The message "Invalid range" is used for multiple errors.
+Solution: Add two more specific error messages. (Itchyny, Ken Hamada)
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test_regexp_utf8.vim
+
+Patch 8.0.0624 (after 8.0.0623)
+Problem: Warning for unused variable in tiny build. (Tony Mechelynck)
+Solution: Add an #ifdef.
+Files: src/regexp.c
+
+Patch 8.0.0625
+Problem: shellescape() always escapes a newline, which does not work with
+ some shells. (Harm te Hennepe)
+Solution: Only escape a newline when the "special" argument is non-zero.
+ (Christian Brabandt, closes #1590)
+Files: src/evalfunc.c, src/testdir/test_functions.vim
+
+Patch 8.0.0626
+Problem: In the GUI the cursor may flicker.
+Solution: Check the cmd_silent flag before updating the cursor shape.
+ (Hirohito Higashi, closes #1637)
+Files: src/getchar.c
+
+Patch 8.0.0627
+Problem: When 'wrapscan' is off "gn" does not select the whole pattern when
+ it's the last one in the text. (KeyboardFire)
+Solution: Check if the search fails. (Christian Brabandt, closes #1683)
+Files: src/search.c, src/testdir/test_gn.vim
+
+Patch 8.0.0628 (after 8.0.0626)
+Problem: Cursor disappears after silent mapping. (Ramel Eshed)
+Solution: Do restore the cursor when it was changed, but don't change it in
+ the first place for a silent mapping.
+Files: src/getchar.c
+
+
+Patch 8.0.0629 (after 8.0.0611)
+Problem: Checking for ambiguous width is not working. (Hirohito Higashi)
+Solution: Reset "starting" earlier.
+Files: src/main.c
+
+Patch 8.0.0630
+Problem: The :global command does not work recursively, which makes it
+ difficult to execute a command on a line where one pattern matches
+ and another does not match. (Miles Cranmer)
+Solution: Allow for recursion if it is for only one line. (closes #1760)
+Files: src/ex_cmds.c, src/testdir/test_global.vim, runtime/doc/repeat.txt
+
+Patch 8.0.0631
+Problem: Perl 5.26 also needs S_TOPMARK and S_POPMARK defined.
+Solution: Define the functions when needed. (Jesin, closes #1748)
+Files: src/if_perl.xs
+
+Patch 8.0.0632
+Problem: The quotestar test is still a bit flaky.
+Solution: Kill any existing server to make the retry work. Wait for the
+ register to be filled.
+Files: src/testdir/test_quotestar.vim
+
+Patch 8.0.0633
+Problem: The client-server test is still a bit flaky.
+Solution: Wait a bit for the GUI to start. Check that the version number
+ can be obtained.
+Files: src/testdir/test_clientserver.vim
+
+Patch 8.0.0634
+Problem: Cannot easily get to the last quickfix list.
+Solution: Add "$" as a value for the "nr" argument of getqflist() and
+ setqflist(). (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0635
+Problem: When 'ignorecase' is set script detection is inaccurate.
+Solution: Enforce matching case for text. (closes #1753)
+Files: runtime/scripts.vim
+
+Patch 8.0.0636
+Problem: When reading the undo file fails may use uninitialized data.
+Solution: Always clear the buffer on failure.
+Files: src/undo.c
+
+Patch 8.0.0637
+Problem: Crash when using some version of GTK 3.
+Solution: Add #ifdefs around incrementing the menu index. (Kazunobu
+ Kuriyama)
+Files: src/gui_gtk.c
+
+Patch 8.0.0638
+Problem: Cannot build with new MSVC version VS2017.
+Solution: Change the compiler arguments. (Leonardo Valeri Manera,
+ closes #1731, closes #1747)
+Files: src/GvimExt/Makefile, src/Make_mvc.mak
+
+Patch 8.0.0639
+Problem: The cursor position is set to the last position in a new commit
+ message.
+Solution: Don't set the position if the filetype matches "commit".
+ (Christian Brabandt)
+Files: runtime/defaults.vim
+
+Patch 8.0.0640
+Problem: Mismatch between help and actual message for ":syn conceal".
+Solution: Change the message to match the help. (Ken Takata)
+Files: src/syntax.c
+
+Patch 8.0.0641
+Problem: Cannot set a separate highlighting for the current line in the
+ quickfix window.
+Solution: Add QuickFixLine. (anishsane, closes #1755)
+Files: src/option.c, src/quickfix.c, src/screen.c, src/syntax.c,
+ src/vim.h, runtime/doc/options.txt, runtime/doc/quickfix.txt
+
+Patch 8.0.0642
+Problem: writefile() continues after detecting an error.
+Solution: Bail out as soon as an error is detected. (suggestions by Nikolai
+ Pavlov, closes #1476)
+Files: src/evalfunc.c, src/testdir/test_writefile.vim
+
+Patch 8.0.0643
+Problem: When 'hlsearch' is set and matching with the last search pattern
+ is very slow, Vim becomes unusable. Cannot quit search by
+ pressing CTRL-C.
+Solution: When the search times out set a flag and don't try again. Check
+ for timeout and CTRL-C in NFA loop that adds states.
+Files: src/screen.c, src/ex_cmds.c, src/quickfix.c, src/regexp.c,
+ src/proto/regexp.pro, src/regexp.h, src/search.c,
+ src/proto/search.pro, src/syntax.c, src/regexp_nfa.c, src/spell.c,
+ src/tag.c, src/gui.c, src/edit.c, src/evalfunc.c, src/ex_docmd.c,
+ src/ex_getln.c, src/normal.c
+
+Patch 8.0.0644
+Problem: There is no test for 'hlsearch' timing out.
+Solution: Add a test.
+Files: src/testdir/test_hlsearch.vim
+
+Patch 8.0.0645
+Problem: The new regexp engine does not give an error for using a back
+ reference where it is not allowed. (Dominique Pelle)
+Solution: Check the back reference like the old engine. (closes #1774)
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test_hlsearch.vim,
+ src/testdir/test_statusline.vim,
+ src/testdir/test_regexp_latin1.vim
+
+Patch 8.0.0646
+Problem: The hlsearch test fails on fast systems.
+Solution: Make the search pattern slower. Fix that the old regexp engine
+ doesn't timeout properly.
+Files: src/regexp.c, src/testdir/test_hlsearch.vim
+
+Patch 8.0.0647
+Problem: Syntax highlighting can cause a freeze.
+Solution: Apply 'redrawtime' to syntax highlighting, per window.
+Files: src/structs.h, src/screen.c, src/syntax.c, src/normal.c,
+ src/regexp.c, src/proto/syntax.pro, src/testdir/test_syntax.vim,
+ runtime/doc/options.txt
+
+Patch 8.0.0648
+Problem: Possible use of NULL pointer if buflist_new() returns NULL.
+ (Coverity)
+Solution: Check for NULL pointer in set_bufref().
+Files: src/buffer.c
+
+Patch 8.0.0649
+Problem: When opening a help file the filetype is set several times.
+Solution: When setting the filetype to the same value from a modeline, don't
+ trigger FileType autocommands. Don't set the filetype to "help"
+ when it's already set correctly.
+Files: src/ex_cmds.c, src/option.c, runtime/filetype.vim
+
+Patch 8.0.0650
+Problem: For extra help files the filetype is set more than once.
+Solution: In *.txt files check that there is no help file modline.
+Files: runtime/filetype.vim
+
+Patch 8.0.0651 (after 8.0.0649)
+Problem: Build failure without the auto command feature.
+Solution: Add #ifdef. (closes #1782)
+Files: src/ex_cmds.c
+
+Patch 8.0.0652
+Problem: Unicode information is outdated.
+Solution: Update to Unicode 10. (Christian Brabandt)
+Files: runtime/tools/unicode.vim, src/mbyte.c
+
+Patch 8.0.0653
+Problem: The default highlight for QuickFixLine does not work for several
+ color schemes. (Manas Thakur)
+Solution: Make the default use the old color. (closes #1780)
+Files: src/syntax.c
+
+Patch 8.0.0654
+Problem: Text found after :endfunction is silently ignored.
+Solution: Give a warning if 'verbose' is set. When | or \n are used,
+ execute the text as a command.
+Files: src/testdir/test_vimscript.vim, src/userfunc.c,
+ runtime/doc/eval.txt
+
+Patch 8.0.0655
+Problem: Not easy to make sure a function does not exist.
+Solution: Add ! as an optional argument to :delfunc.
+Files: src/userfunc.c, src/ex_cmds.h, src/testdir/test_vimscript.vim
+
+Patch 8.0.0656
+Problem: Cannot use ! after some user commands.
+Solution: Properly check for existing command. (Hirohito Higashi)
+Files: src/ex_docmd.c, src/testdir/test_vimscript.vim
+
+Patch 8.0.0657
+Problem: Cannot get and set quickfix list items.
+Solution: Add the "items" argument to getqflist() and setqflist(). (Yegappan
+ Lakshmanan)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0658
+Problem: Spell test is old style.
+Solution: Turn the spell test into a new style test (pschuh, closes #1778)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test58.in, src/testdir/test58.ok,
+ src/testdir/test_spell.vim
+
+Patch 8.0.0659
+Problem: No test for conceal mode.
+Solution: Add a conceal mode test. (Dominique Pelle, closes #1783)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_syntax.vim
+
+Patch 8.0.0660
+Problem: Silent install on MS-Windows does show a dialog.
+Solution: Add /SD to the default choice. (allburov, closes #1772)
+Files: nsis/gvim.nsi
+
+Patch 8.0.0661
+Problem: Recognizing urxvt mouse codes does not work well.
+Solution: Recognize "Esc[*M" and "Esc[*m". (Maurice Bos, closes #1486)
+Files: src/keymap.h, src/misc2.c, src/os_unix.c, src/term.c
+
+Patch 8.0.0662 (after 8.0.0659)
+Problem: Stray FIXME for fixed problem.
+Solution: Remove the comment. (Dominique Pelle)
+Files: src/testdir/test_syntax.vim
+
+Patch 8.0.0663
+Problem: Giving an error message only when 'verbose' set is unexpected.
+Solution: Give a warning message instead.
+Files: src/message.c, src/proto/message.pro, src/userfunc.c,
+ src/testdir/test_vimscript.vim, runtime/doc/eval.txt
+
+Patch 8.0.0664 (after 8.0.0661)
+Problem: Mouse does not work in tmux. (lilydjwg)
+Solution: Add flag for SGR release being present.
+Files: src/term.c
+
+Patch 8.0.0665 (after 8.0.0661)
+Problem: Warning for uninitialized variable. (Tony Mechelynck)
+Solution: Initialize it.
+Files: src/term.c
+
+Patch 8.0.0666
+Problem: Dead for loop. (Coverity)
+Solution: Remove the for loop.
+Files: src/term.c
+
+Patch 8.0.0667
+Problem: Memory access error when command follows :endfunction. (Nikolai
+ Pavlov)
+Solution: Make memory handling in :function straightforward. (closes #1793)
+Files: src/userfunc.c, src/testdir/test_vimscript.vim
+
+Patch 8.0.0668 (after 8.0.0660)
+Problem: Nsis installer script does not work. (Christian Brabandt)
+Solution: Fix the syntax of /SD.
+Files: nsis/gvim.nsi
+
+Patch 8.0.0669
+Problem: In Insert mode, CTRL-N at start of the buffer does not work
+ correctly. (zuloloxi)
+Solution: Wrap around the start of the buffer. (Christian Brabandt)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.0670
+Problem: Can't use input() in a timer callback. (Cosmin Popescu)
+Solution: Reset vgetc_busy and set timer_busy. (Ozaki Kiichi, closes #1790,
+ closes #1129)
+Files: src/evalfunc.c, src/ex_cmds2.c, src/globals.h,
+ src/testdir/test_timers.vim
+
+Patch 8.0.0671
+Problem: When a function invoked from a timer calls confirm() and the user
+ types CTRL-C then Vim hangs.
+Solution: Reset typebuf_was_filled. (Ozaki Kiichi, closes #1791)
+Files: src/getchar.c
+
+Patch 8.0.0672
+Problem: Third item of synconcealed() changes too often. (Dominique Pelle)
+Solution: Reset the sequence number at the start of each line.
+Files: src/syntax.c, src/testdir/test_syntax.vim, runtime/doc/eval.txt
+
+Patch 8.0.0673 (after 8.0.0673)
+Problem: Build failure without conceal feature.
+Solution: Add #ifdef.
+Files: src/syntax.c
+
+Patch 8.0.0674 (after 8.0.0670)
+Problem: Cannot build with eval but without timers.
+Solution: Add #ifdef (John Marriott)
+Files: src/evalfunc.c
+
+Patch 8.0.0675
+Problem: 'colorcolumn' has a higher priority than 'hlsearch', it should be
+ the other way around. (Nazri Ramliy)
+Solution: Change the priorities. (LemonBoy, closes #1794)
+Files: src/screen.c, src/testdir/test_listlbr_utf8.vim
+
+Patch 8.0.0676
+Problem: Crash when closing the quickfix window in a FileType autocommand
+ that triggers when the quickfix window is opened.
+Solution: Save the new value before triggering the OptionSet autocommand.
+ Add the "starting" flag to test_override() to make the text work.
+Files: src/evalfunc.c, src/option.c, runtime/doc/eval.txt
+
+Patch 8.0.0677
+Problem: Setting 'filetype' internally may cause the current buffer and
+ window to change unexpectedly.
+Solution: Set curbuf_lock. (closes #1734)
+Files: src/quickfix.c, src/ex_cmds.c, src/ex_getln.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0678
+Problem: When 'equalalways' is set and closing a window in a separate
+ frame, not all window sizes are adjusted. (Glacambre)
+Solution: Resize all windows if the new current window is not in the same
+ frame as the closed window. (closes #1707)
+Files: src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 8.0.0679 (after 8.0.0678)
+Problem: Using freed memory.
+Solution: Get the parent frame pointer earlier.
+Files: src/window.c
+
+Patch 8.0.0680 (after 8.0.0612)
+Problem: Plugins in start packages are sourced twice. (mseplowitz)
+Solution: Use the unmodified runtime path when loading plugins (test by Ingo
+ Karkat, closes #1801)
+Files: src/testdir/test_startup.vim, src/main.c, src/ex_cmds2.c,
+ src/proto/ex_cmds2.pro
+
+Patch 8.0.0681
+Problem: Unnamed register only contains the last deleted text when
+ appending deleted text to a register. (Wolfgang Jeltsch)
+Solution: Only set y_previous when not using y_append. (Christian Brabandt)
+Files: src/ops.c, src/testdir/test_put.vim
+
+Patch 8.0.0682
+Problem: No test for synIDtrans().
+Solution: Add a test. (Dominique Pelle, closes #1796)
+Files: src/testdir/test_syntax.vim
+
+Patch 8.0.0683
+Problem: When using a visual bell there is no delay, causing the flash to
+ be very short, possibly unnoticeable. Also, the flash and the
+ beep can lockup the UI when repeated often.
+Solution: Do the delay in Vim or flush the output before the delay. Limit the
+ bell to once per half a second. (Ozaki Kiichi, closes #1789)
+Files: src/misc1.c, src/proto/term.pro, src/term.c
+
+Patch 8.0.0684
+Problem: Old style tests are not nice.
+Solution: Turn two tests into new style. (pschuh, closes #1797)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test82.in, src/testdir/test82.ok,
+ src/testdir/test90.in, src/testdir/test90.ok,
+ src/testdir/test_sha256.vim, src/testdir/test_utf8_comparisons.vim
+
+Patch 8.0.0685
+Problem: When making backups is disabled and conversion with iconv fails
+ the written file is truncated. (Luo Chen)
+Solution: First try converting the file and write the file only when it did
+ not fail. (partly by Christian Brabandt)
+Files: src/fileio.c, src/testdir/test_writefile.vim
+
+Patch 8.0.0686
+Problem: When typing CTRL-L in a window that's not the first one, another
+ redraw will happen later. (Christian Brabandt)
+Solution: Reset must_redraw after calling screenclear().
+Files: src/screen.c
+
+Patch 8.0.0687
+Problem: Minor issues related to quickfix.
+Solution: Set the proper return status for all cases in setqflist() and at
+ test cases for this. Move the "adding" flag outside of
+ FEAT_WINDOWS. Minor update to the setqflist() help text. (Yegappan
+ Lakshmanan)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0688
+Problem: Cannot resize the window in a FileType autocommand. (Ingo Karkat)
+Solution: Add the CMDWIN flag to :resize. (test by Ingo Karkat,
+ closes #1804)
+Files: src/ex_cmds.h, src/testdir/test_quickfix.vim
+
+Patch 8.0.0689
+Problem: The ~ character is not escaped when adding to the search pattern
+ with CTRL-L. (Ramel Eshed)
+Solution: Escape the character. (Christian Brabandt)
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.0.0690
+Problem: Compiler warning on non-Unix system.
+Solution: Add #ifdef. (John Marriott)
+Files: src/term.c
+
+Patch 8.0.0691
+Problem: Compiler warning without the linebreak feature.
+Solution: Add #ifdef. (John Marriott)
+Files: src/edit.c
+
+Patch 8.0.0692
+Problem: Using CTRL-G with 'incsearch' and ? goes in the wrong direction.
+ (Ramel Eshed)
+Solution: Adjust search_start. (Christian Brabandt)
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.0.0693
+Problem: No terminal emulator support. Cannot properly run commands in the
+ GUI. Cannot run a job interactively with an ssh connection.
+Solution: Very early implementation of the :terminal command. Includes
+ libvterm converted to ANSI C. Many parts still missing.
+Files: src/feature.h, src/Makefile, src/configure.ac, src/auto/configure,
+ src/config.mk.in, src/config.h.in, src/terminal.c, src/structs.h,
+ src/ex_cmdidxs.h, src/ex_docmd.c, src/option.c, src/option.h,
+ src/evalfunc.c, src/proto/terminal.pro, src/proto.h,
+ runtime/doc/terminal.txt, runtime/doc/Makefile, Filelist,
+ src/libvterm/.bzrignore, src/libvterm/.gitignore,
+ src/libvterm/LICENSE, src/libvterm/README, src/libvterm/Makefile,
+ src/libvterm/tbl2inc_c.pl, src/libvterm/vterm.pc.in,
+ src/libvterm/bin/unterm.c, src/libvterm/bin/vterm-ctrl.c,
+ src/libvterm/bin/vterm-dump.c, src/libvterm/doc/URLs,
+ src/libvterm/doc/seqs.txt, src/libvterm/include/vterm.h,
+ src/libvterm/include/vterm_keycodes.h,
+ src/libvterm/src/encoding.c,
+ src/libvterm/src/encoding/DECdrawing.inc,
+ src/libvterm/src/encoding/DECdrawing.tbl,
+ src/libvterm/src/encoding/uk.inc,
+ src/libvterm/src/encoding/uk.tbl, src/libvterm/src/keyboard.c,
+ src/libvterm/src/mouse.c, src/libvterm/src/parser.c,
+ src/libvterm/src/pen.c, src/libvterm/src/rect.h,
+ src/libvterm/src/screen.c, src/libvterm/src/state.c,
+ src/libvterm/src/unicode.c, src/libvterm/src/utf8.h,
+ src/libvterm/src/vterm.c, src/libvterm/src/vterm_internal.h,
+ src/libvterm/t/02parser.test, src/libvterm/t/03encoding_utf8.test,
+ src/libvterm/t/10state_putglyph.test,
+ src/libvterm/t/11state_movecursor.test,
+ src/libvterm/t/12state_scroll.test,
+ src/libvterm/t/13state_edit.test,
+ src/libvterm/t/14state_encoding.test,
+ src/libvterm/t/15state_mode.test,
+ src/libvterm/t/16state_resize.test,
+ src/libvterm/t/17state_mouse.test,
+ src/libvterm/t/18state_termprops.test,
+ src/libvterm/t/20state_wrapping.test,
+ src/libvterm/t/21state_tabstops.test,
+ src/libvterm/t/22state_save.test,
+ src/libvterm/t/25state_input.test,
+ src/libvterm/t/26state_query.test,
+ src/libvterm/t/27state_reset.test,
+ src/libvterm/t/28state_dbl_wh.test,
+ src/libvterm/t/29state_fallback.test, src/libvterm/t/30pen.test,
+ src/libvterm/t/40screen_ascii.test,
+ src/libvterm/t/41screen_unicode.test,
+ src/libvterm/t/42screen_damage.test,
+ src/libvterm/t/43screen_resize.test,
+ src/libvterm/t/44screen_pen.test,
+ src/libvterm/t/45screen_protect.test,
+ src/libvterm/t/46screen_extent.test,
+ src/libvterm/t/47screen_dbl_wh.test,
+ src/libvterm/t/48screen_termprops.test,
+ src/libvterm/t/90vttest_01-movement-1.test,
+ src/libvterm/t/90vttest_01-movement-2.test,
+ src/libvterm/t/90vttest_01-movement-3.test,
+ src/libvterm/t/90vttest_01-movement-4.test,
+ src/libvterm/t/90vttest_02-screen-1.test,
+ src/libvterm/t/90vttest_02-screen-2.test,
+ src/libvterm/t/90vttest_02-screen-3.test,
+ src/libvterm/t/90vttest_02-screen-4.test,
+ src/libvterm/t/92lp1640917.test, src/libvterm/t/harness.c,
+ src/libvterm/t/run-test.pl
+
+Patch 8.0.0694
+Problem: Building in shadow directory does not work. Running Vim fails.
+Solution: Add the new libvterm directory. Add missing change in command
+ list.
+Files: src/Makefile, src/ex_cmds.h
+
+Patch 8.0.0695
+Problem: Missing dependencies breaks parallel make.
+Solution: Add dependencies for terminal.o.
+Files: src/Makefile
+
+Patch 8.0.0696
+Problem: The .inc files are missing in git. (Nazri Ramliy)
+Solution: Remove the .inc line from .gitignore.
+Files: src/libvterm/.gitignore
+
+Patch 8.0.0697
+Problem: Recorded key sequences may become invalid.
+Solution: Add back KE_SNIFF removed in 7.4.1433. Use fixed numbers for the
+ key_extra enum.
+Files: src/keymap.h
+
+Patch 8.0.0698
+Problem: When a timer uses ":pyeval" or another Python command and it
+ happens to be triggered while exiting a Crash may happen.
+ (Ricky Zhou)
+Solution: Avoid running a Python command after python_end() was called.
+ Do not trigger timers while exiting. (closes #1824)
+Files: src/if_python.c, src/if_python3.c, src/ex_cmds2.c
+
+Patch 8.0.0699
+Problem: Checksum tests are not actually run.
+Solution: Add the tests to the list. (Dominique Pelle, closes #1819)
+Files: src/testdir/test_alot.vim, src/testdir/test_alot_utf8.vim
+
+Patch 8.0.0700
+Problem: Segfault with QuitPre autocommand closes the window. (Marek)
+Solution: Check that the window pointer is still valid. (Christian Brabandt,
+ closes #1817)
+Files: src/testdir/test_tabpage.vim, src/ex_docmd.c
+
+Patch 8.0.0701
+Problem: System test failing when using X11 forwarding.
+Solution: Set $XAUTHORITY before changing $HOME. (closes #1812)
+ Also use a better check for the exit value.
+Files: src/testdir/setup.vim, src/testdir/test_system.vim
+
+Patch 8.0.0702
+Problem: An error in a timer can make Vim unusable.
+Solution: Don't set the error flag or exception from a timer. Stop a timer
+ if it causes an error 3 out of 3 times. Discard an exception
+ caused inside a timer.
+Files: src/ex_cmds2.c, src/structs.h, src/testdir/test_timers.vim,
+ runtime/doc/eval.txt
+
+Patch 8.0.0703
+Problem: Illegal memory access with empty :doau command.
+Solution: Check the event for being out of range. (James McCoy)
+Files: src/testdir/test_autocmd.vim, src/fileio.c
+
+Patch 8.0.0704
+Problem: Problems with autocommands when opening help.
+Solution: Avoid using invalid "varp" value. Allow using :wincmd if buffer
+ is locked. (closes #1806, closes #1804)
+Files: src/option.c, src/ex_cmds.h
+
+Patch 8.0.0705 (after 8.0.0702)
+Problem: Crash when there is an error in a timer callback. (Aron Griffis,
+ Ozaki Kiichi)
+Solution: Check did_throw before discarding an exception. NULLify
+ current_exception when no longer valid.
+Files: src/ex_eval.c, src/ex_cmds2.c
+
+Patch 8.0.0706
+Problem: Crash when cancelling the cmdline window in Ex mode. (James McCoy)
+Solution: Do not set cmdbuff to NULL, make it empty.
+Files: src/ex_getln.c
+
+Patch 8.0.0707
+Problem: Freeing wrong memory when manipulating buffers in autocommands.
+ (James McCoy)
+Solution: Also set the w_s pointer if w_buffer was NULL.
+Files: src/ex_cmds.c
+
+Patch 8.0.0708
+Problem: Some tests are old style.
+Solution: Change a few tests from old style to new style. (pschuh,
+ closes #1813)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_vms.mms, src/testdir/main.aap,
+ src/testdir/test23.in, src/testdir/test23.ok,
+ src/testdir/test24.in, src/testdir/test24.ok,
+ src/testdir/test26.in, src/testdir/test26.ok,
+ src/testdir/test67.in, src/testdir/test67.ok,
+ src/testdir/test75.in, src/testdir/test75.ok,
+ src/testdir/test97.in, src/testdir/test97.ok,
+ src/testdir/test_comparators.in, src/testdir/test_comparators.ok,
+ src/testdir/test_comparators.vim,
+ src/testdir/test_escaped_glob.vim,
+ src/testdir/test_exec_while_if.vim,
+ src/testdir/test_exists_autocmd.vim, src/testdir/test_getcwd.in,
+ src/testdir/test_getcwd.ok, src/testdir/test_getcwd.vim,
+ src/testdir/test_maparg.vim, src/testdir/test_plus_arg_edit.vim,
+ src/testdir/test_regex_char_classes.vim
+
+Patch 8.0.0709
+Problem: Libvterm cannot use vsnprintf(), it does not exist in C90.
+Solution: Use vim_vsnprintf() instead.
+Files: src/message.c, src/Makefile, src/proto.h, src/evalfunc.c,
+ src/netbeans.c, src/libvterm/src/vterm.c
+
+Patch 8.0.0710
+Problem: A job that writes to a buffer clears command line completion.
+ (Ramel Eshed)
+Solution: Do not redraw while showing the completion menu.
+Files: src/screen.c
+
+Patch 8.0.0711 (after 8.0.0710)
+Problem: Cannot build without the wildmenu feature.
+Solution: Add #ifdef
+Files: src/screen.c
+
+Patch 8.0.0712
+Problem: The terminal implementation is incomplete.
+Solution: Add the 'termkey' option.
+Files: src/option.c, src/option.h, src/structs.h
+
+Patch 8.0.0713 (after 8.0.0712)
+Problem: 'termkey' option not fully implemented.
+Solution: Add initialisation.
+Files: src/option.c
+
+Patch 8.0.0714
+Problem: When a timer causes a command line redraw the " that is displayed
+ for CTRL-R goes missing.
+Solution: Remember an extra character to display.
+Files: src/ex_getln.c
+
+Patch 8.0.0715
+Problem: Writing to the wrong buffer if the buffer that a channel writes to
+ was closed.
+Solution: Do not write to a buffer that was unloaded.
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel_write.py
+
+Patch 8.0.0716
+Problem: Not easy to start Vim cleanly without changing the viminfo file.
+ Not possible to know whether the -i command line flag was used.
+Solution: Add the --clean command line argument. Add the 'viminfofile'
+ option. Add "-u DEFAULTS".
+Files: src/main.c, runtime/doc/starting.txt, src/option.c, src/option.h,
+ src/ex_cmds.c, src/globals.h, runtime/doc/options.txt
+
+Patch 8.0.0717
+Problem: Terminal feature not included in :version output.
+Solution: Add +terminal or -terminal.
+Files: src/version.c, src/terminal.c
+
+Patch 8.0.0718
+Problem: Output of job in terminal is not displayed.
+Solution: Connect the job output to the terminal.
+Files: src/channel.c, src/proto/channel.pro, src/terminal.c,
+ src/proto/terminal.pro, src/channel.c, src/proto/channel.pro,
+ src/evalfunc.c, src/screen.c, src/proto/screen.pro
+
+Patch 8.0.0719
+Problem: Build failure without +terminal feature.
+Solution: Add #ifdefs.
+Files: src/screen.c, src/channel.c
+
+Patch 8.0.0720
+Problem: Unfinished mapping not displayed when running timer.
+Solution: Also use the extra_char while waiting for a mapping and digraph.
+ (closes #1844)
+Files: src/ex_getln.c
+
+Patch 8.0.0721
+Problem: :argedit can only have one argument.
+Solution: Allow for multiple arguments. (Christian Brabandt)
+Files: runtime/doc/editing.txt, src/ex_cmds.h, src/ex_cmds2.c,
+ src/testdir/test_arglist.vim
+
+Patch 8.0.0722
+Problem: Screen is messed by timer up at inputlist() prompt.
+Solution: Set state to ASKMORE. (closes #1843)
+Files: src/misc1.c
+
+Patch 8.0.0723 (after 8.0.0721)
+Problem: Arglist test fails if file name case is ignored.
+Solution: Wipe existing buffers, check for fname_case property.
+Files: src/testdir/test_arglist.vim
+
+Patch 8.0.0724
+Problem: The message for yanking doesn't indicate the register.
+Solution: Show the register name in the "N lines yanked" message. (LemonBoy,
+ closes #1803, closes #1809)
+Files: src/ops.c, src/Makefile, src/testdir/test_registers.vim,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0725
+Problem: A terminal window does not handle keyboard input.
+Solution: Add terminal_loop(). ":term bash -i" sort of works now.
+Files: src/main.c, src/terminal.c, src/proto/terminal.pro, src/normal.c
+
+Patch 8.0.0726
+Problem: Translations cleanup script is too conservative.
+Solution: Also delete untranslated messages.
+Files: src/po/cleanup.vim
+
+Patch 8.0.0727
+Problem: Message about what register to yank into is not translated.
+ (LemonBoy)
+Solution: Add _().
+Files: src/ops.c
+
+Patch 8.0.0728
+Problem: The terminal structure is never freed.
+Solution: Free the structure and unreference what it contains.
+Files: src/terminal.c, src/buffer.c, src/proto/terminal.pro,
+ src/channel.c, src/proto/channel.pro, src/evalfunc.c
+
+Patch 8.0.0729
+Problem: The help for the terminal configure option is wrong.
+Solution: Change "Disable" to "Enable". (E Kawashima, closes #1849)
+ Improve alignment.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.0730
+Problem: Terminal feature only supports Unix-like systems.
+Solution: Prepare for adding an MS-Windows implementation.
+Files: src/terminal.c
+
+Patch 8.0.0731
+Problem: Cannot build the terminal feature on MS-Windows.
+Solution: Add the Makefile changes. (Yasuhiro Matsumoto, closes #1851)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.0.0732
+Problem: When updating a buffer for a callback the modeless selection is
+ lost.
+Solution: Do not insert or delete screen lines when redrawing for a callback
+ and there is a modeless selection.
+Files: src/screen.c
+
+Patch 8.0.0733
+Problem: Can only add entries to one list in the quickfix stack.
+Solution: Move state variables from qf_list_T to qf_list_T. (Yegappan
+ Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.0.0734
+Problem: The script to check translations can be improved.
+Solution: Restore the view when no errors are found. Check for matching
+ line break at the end of the message. (Christian Brabandt)
+Files: src/po/check.vim
+
+Patch 8.0.0735
+Problem: There is no way to notice that the quickfix window contents has
+ changed.
+Solution: Increment b:changedtick when updating the quickfix window.
+ (Yegappan Lakshmanan)
+Files: runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0736
+Problem: The OptionSet autocommand event is not triggered when entering
+ diff mode.
+Solution: use set_option_value() instead of setting the option directly.
+ Change the tests from old to new style. (Christian Brabandt)
+Files: src/diff.c, src/testdir/Make_all.mak, src/Makefile,
+ src/testdir/test_autocmd.vim, src/testdir/test_autocmd_option.in,
+ src/testdir/test_autocmd_option.ok
+
+Patch 8.0.0737
+Problem: Crash when X11 selection is very big.
+Solution: Use static items instead of allocating them. Add callbacks.
+ (Ozaki Kiichi)
+Files: src/testdir/shared.vim, src/testdir/test_quotestar.vim,
+ src/ui.c
+
+Patch 8.0.0738
+Problem: Cannot use the mouse to resize window while the focus is in a
+ terminal window.
+Solution: Recognize nice mouse events in the terminal window. A few more
+ fixes for the terminal window.
+Files: src/terminal.c
+
+Patch 8.0.0739
+Problem: Terminal resizing doesn't work well.
+Solution: Resize the terminal to the Vim window and the other way around.
+ Avoid mapping typed keys. Set the environment properly.
+Files: src/terminal.c, src/os_unix.c, src/structs.h
+
+Patch 8.0.0740
+Problem: Cannot resize a terminal window by the command running in it.
+Solution: Add support for the window size escape sequence. Make BS work.
+Files: src/terminal.c, src/libvterm/src/state.c
+
+Patch 8.0.0741
+Problem: Cannot build with HPUX.
+Solution: Rename envbuf_TERM to envbuf_Term. (John Marriott)
+Files: src/os_unix.c
+
+Patch 8.0.0742
+Problem: Terminal feature does not work on MS-Windows.
+Solution: Use libvterm and libwinpty on MS-Windows. (Yasuhiro Matsumoto)
+Files: src/INSTALLpc.txt, src/Make_cyg_ming.mak, src/channel.c,
+ src/proto/channel.pro, src/terminal.c
+
+Patch 8.0.0743
+Problem: The 'termsize' option can be set to an invalid value.
+Solution: Check the 'termsize' option to be valid.
+Files: src/option.c, src/testdir/gen_opt_test.vim
+
+Patch 8.0.0744
+Problem: A terminal window uses pipes instead of a pty.
+Solution: Add pty support.
+Files: src/structs.h, src/os_unix.c, src/terminal.c, src/channel.c,
+ src/proto/os_unix.pro, src/os_win32.c, src/proto/os_win32.pro
+
+Patch 8.0.0745
+Problem: multibyte characters in a terminal window are not displayed
+ properly.
+Solution: Set the unused screen characters. (Yasuhiro Matsumoto, closes
+ #1857)
+Files: src/terminal.c
+
+Patch 8.0.0746
+Problem: When :term fails the job is not properly cleaned up.
+Solution: Free the terminal. Handle a job that failed to start. (closes
+ #1858)
+Files: src/os_unix.c, src/channel.c, src/terminal.c
+
+Patch 8.0.0747
+Problem: :terminal without an argument doesn't work.
+Solution: Use the 'shell' option. (Yasuhiro Matsumoto, closes #1860)
+Files: src/terminal.c
+
+Patch 8.0.0748
+Problem: When running Vim in a terminal window it does not detect the right
+ number of colors available.
+Solution: Detect the version string that libvterm returns. Pass the number
+ of colors in $COLORS.
+Files: src/term.c, src/os_unix.c
+
+Patch 8.0.0749
+Problem: Some unicode digraphs are hard to remember.
+Solution: Add alternatives with a backtick. (Chris Harding, closes #1861)
+Files: src/digraph.c
+
+Patch 8.0.0750
+Problem: OpenPTY missing in non-GUI build.
+Solution: Always include pty.c, add an #ifdef to skip over the contents.
+Files: src/pty.c, src/Makefile
+
+Patch 8.0.0751 (after 8.0.0750)
+Problem: OpenPTY missing with some combination of features. (Kazunobu
+ Kuriyama)
+Solution: Adjust #ifdef. Also include pty.pro when needed.
+Files: src/pty.c, src/misc2.c, src/proto.h
+
+Patch 8.0.0752
+Problem: Build fails on MS-Windows.
+Solution: Change #ifdef for set_color_count().
+Files: src/term.c
+
+Patch 8.0.0753
+Problem: A job running in a terminal does not get notified of changes in
+ the terminal size.
+Solution: Use ioctl() and SIGWINCH to report the terminal size.
+Files: src/terminal.c, src/os_unix.c, src/proto/os_unix.pro
+
+Patch 8.0.0754
+Problem: Terminal window does not support colors.
+Solution: Lookup the color attribute.
+Files: src/terminal.c, src/syntax.c, src/proto/syntax.pro
+
+Patch 8.0.0755
+Problem: Terminal window does not have colors in the GUI.
+Solution: Lookup the GUI color.
+Files: src/terminal.c, src/syntax.c, src/proto/syntax.pro, src/term.c,
+ src/proto/term.pro, src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro,
+ src/gui_x11.c, src/proto/gui_x11.pro, src/gui_mac.c,
+ src/proto/gui_mac.pro, src/gui_photon.c, src/proto/gui_photon.pro,
+ src/gui_w32.c, src/proto/gui_w32.pro,
+
+Patch 8.0.0756
+Problem: Cannot build libvterm with MSVC.
+Solution: Add an MSVC Makefile to libvterm. (Yasuhiro Matsumoto, closes
+ #1865)
+Files: src/INSTALLpc.txt, src/Make_mvc.mak, src/libvterm/Makefile.msc
+
+Patch 8.0.0757
+Problem: Libvterm MSVC Makefile not included in the distribution.
+Solution: Add the file to the list.
+Files: Filelist
+
+Patch 8.0.0758
+Problem: Possible crash when using a terminal window.
+Solution: Check for NULL pointers. (Yasuhiro Matsumoto, closes #1864)
+Files: src/terminal.c
+
+Patch 8.0.0759
+Problem: MS-Windows: terminal does not adjust size to the Vim window size.
+Solution: Add a call to winpty_set_size(). (Yasuhiro Matsumoto, closes #1863)
+Files: src/terminal.c
+
+Patch 8.0.0760
+Problem: Terminal window colors wrong with 'termguicolors'.
+Solution: Add 'termguicolors' support.
+Files: src/terminal.c, src/syntax.c, src/proto/syntax.pro
+
+Patch 8.0.0761
+Problem: Options of a buffer for a terminal window are not set properly.
+Solution: Add "terminal" value for 'buftype'. Make 'buftype' and
+ 'bufhidden' not depend on the quickfix feature.
+ Also set the buffer name and show "running" or "finished" in the
+ window title.
+Files: src/option.c, src/terminal.c, src/proto/terminal.pro,
+ runtime/doc/options.txt, src/quickfix.c, src/proto/quickfix.pro,
+ src/structs.h, src/buffer.c, src/ex_docmd.c, src/fileio.c,
+ src/channel.c
+
+Patch 8.0.0762
+Problem: ml_get error with :psearch in buffer without a name. (Dominique
+ Pelle)
+Solution: Use the buffer number instead of the file name. Check the cursor
+ position.
+Files: src/search.c, src/testdir/test_preview.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 8.0.0763
+Problem: Libvterm can be improved.
+Solution: Various small improvements, more comments.
+Files: src/libvterm/README, src/libvterm/include/vterm.h,
+ src/libvterm/include/vterm_keycodes.h,
+ src/libvterm/src/keyboard.c, src/libvterm/src/parser.c,
+ src/libvterm/src/screen.c, src/libvterm/src/state.c
+
+Patch 8.0.0764
+Problem: 'termkey' does not work yet.
+Solution: Implement 'termkey'.
+Files: src/terminal.c, src/option.c, src/proto/option.pro
+
+Patch 8.0.0765
+Problem: Build fails with tiny features.
+Solution: Adjust #ifdef. (John Marriott)
+Files: src/option.c, src/option.h
+
+Patch 8.0.0766
+Problem: Option test fails with +terminal feature.
+Solution: Fix using the right option when checking the value.
+Files: src/option.c
+
+Patch 8.0.0767
+Problem: Build failure with Athena and Motif.
+Solution: Move local variable declarations. (Kazunobu Kuriyama)
+Files: src/gui_x11.c
+
+Patch 8.0.0768
+Problem: Terminal window status shows "[Scratch]".
+Solution: Show "[Terminal]" when no title was set. (Yasuhiro Matsumoto)
+ Store the terminal title that vterm sends and use it. Update the
+ special buffer name. (closes #1869)
+Files: src/terminal.c, src/proto/terminal.pro, src/buffer.c
+
+Patch 8.0.0769
+Problem: Build problems with terminal on MS-Windows using MSVC.
+Solution: Remove stdbool.h dependency. Only use ScreenLinesUC when it was
+ allocated. Fix typos. (Ken Takata)
+Files: src/libvterm/bin/vterm-ctrl.c, runtime/doc/terminal.txt,
+ src/INSTALLpc.txt, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/libvterm/Makefile.msc, src/terminal.c
+
+Patch 8.0.0770
+Problem: Compiler warning for missing field initializer.
+Solution: Add two more values. (Yegappan Lakshmanan)
+Files: src/libvterm/src/encoding.c
+
+Patch 8.0.0771
+Problem: Cursor in a terminal window not always updated in the GUI.
+Solution: Call gui_update_cursor(). (Yasuhiro Matsumoto, closes #1868)
+Files: src/terminal.c
+
+Patch 8.0.0772
+Problem: Other stdbool.h dependencies in libvterm.
+Solution: Remove the dependency and use TRUE/FALSE/int. (Ken Takata)
+Files: src/libvterm/include/vterm.h, src/libvterm/src/mouse.c,
+ src/libvterm/src/pen.c, src/libvterm/t/harness.c,
+ src/libvterm/bin/unterm.c
+
+Patch 8.0.0773
+Problem: Mixing 32 and 64 bit libvterm builds fails.
+Solution: Use OUTDIR. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/libvterm/Makefile.msc
+
+Patch 8.0.0774
+Problem: Build failure without the multibyte feature on HPUX.
+Solution: Move #ifdefs. (John Marriott)
+Files: src/term.c
+
+Patch 8.0.0775
+Problem: In a terminal the cursor is updated too often.
+Solution: Only flush when needed. (Yasuhiro Matsumoto). Remember whether the
+ cursor is visible. (closes #1873)
+Files: src/terminal.c
+
+Patch 8.0.0776
+Problem: Function prototypes missing without the quickfix feature. (Tony
+ Mechelynck)
+Solution: Move non-quickfix functions to buffer.c.
+Files: src/buffer.c, src/proto/buffer.pro, src/quickfix.c,
+ src/proto/quickfix.pro
+
+Patch 8.0.0777
+Problem: Compiler warnings with 64 bit compiler.
+Solution: Add type casts. (Mike Williams)
+Files: src/libvterm/src/pen.c, src/libvterm/src/state.c, src/terminal.c
+
+Patch 8.0.0778
+Problem: In a terminal the cursor may be hidden and screen updating lags
+ behind. (Nazri Ramliy)
+Solution: Switch the cursor on and flush output when needed. (Ozaki Kiichi)
+Files: src/terminal.c
+
+Patch 8.0.0779
+Problem: :term without an argument uses empty buffer name but runs the
+ shell.
+Solution: Change the command to the shell earlier.
+Files: src/terminal.c
+
+Patch 8.0.0780
+Problem: Build failure on Travis.
+Solution: Set distribution explicitly. Use Lua and Ruby dev. (Ken Takata,
+ closes #1884)
+Files: .travis.yml
+
+Patch 8.0.0781
+Problem: MS-Windows: Memory leak when using :terminal.
+Solution: Handle failures properly. (Ken Takata)
+Files: src/terminal.c
+
+Patch 8.0.0782
+Problem: Using freed memory in quickfix code. (Dominique Pelle)
+Solution: Handle a help window differently. (Yegappan Lakshmanan)
+Files: src/buffer.c, src/proto/buffer.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim, src/ex_cmds.c, src/window.c
+
+Patch 8.0.0783
+Problem: Job of terminal may be freed too early.
+Solution: Increment job refcount. (Yasuhiro Matsumoto)
+Files: src/terminal.c
+
+Patch 8.0.0784
+Problem: Job of terminal may be garbage collected.
+Solution: Set copyID on job in terminal. (Ozaki Kiichi)
+Files: src/terminal.c, src/eval.c, src/proto/terminal.pro
+
+Patch 8.0.0785
+Problem: Wildcards are not expanded for :terminal.
+Solution: Add FILES to the command flags. (Yasuhiro Matsumoto, closes #1883)
+ Also complete commands.
+Files: src/ex_cmds.h, src/ex_docmd.c
+
+Patch 8.0.0786
+Problem: Build failures on Travis.
+Solution: Go back to precise temporarily. Disable coverage with clang.
+Files: .travis.yml
+
+Patch 8.0.0787
+Problem: Cannot send CTRL-W command to terminal job.
+Solution: Make CTRL-W . a prefix for sending a key to the job.
+Files: src/terminal.c, runtime/doc/terminal.txt, src/option.c
+
+Patch 8.0.0788
+Problem: MS-Windows: cannot build with terminal feature.
+Solution: Move set_ref_in_term(). (Ozaki Kiichi)
+Files: src/terminal.c
+
+Patch 8.0.0789
+Problem: When splitting a terminal window where the terminal follows the
+ size of the window doesn't work.
+Solution: Use the size of the smallest window. (Yasuhiro Matsumoto, closes
+ #1885)
+Files: src/terminal.c
+
+Patch 8.0.0790
+Problem: MSVC compiler warning for strncpy in libvterm.
+Solution: Add a define to stop the warnings. (Mike Williams)
+Files: src/Make_mvc.mak
+
+Patch 8.0.0791
+Problem: Terminal colors depend on the system.
+Solution: Use the highlight color lookup tables.
+Files: src/syntax.c, src/proto/syntax.pro, src/terminal.c
+
+Patch 8.0.0792
+Problem: Spell test leaves files behind.
+Solution: Delete the files.
+Files: src/testdir/test_spell.vim
+
+Patch 8.0.0793
+Problem: Using wrong terminal name for terminal window.
+Solution: When 'term' starts with "xterm" use it for $TERM in a terminal
+ window.
+Files: src/os_unix.c
+
+Patch 8.0.0794
+Problem: The script to check translations fails if there is more than one
+ NL in one line.
+Solution: Count the number of NL characters. Make count() accept a string.
+Files: src/po/check.vim, src/evalfunc.c, runtime/doc/eval.txt,
+ src/testdir/test_functions.vim
+
+Patch 8.0.0795
+Problem: Terminal feature does not build with older MSVC.
+Solution: Do not use stdint.h.
+Files: src/libvterm/include/vterm.h
+
+Patch 8.0.0796
+Problem: No coverage on Travis with clang.
+Solution: Use a specific coveralls version. (Ozaki Kiichi, closes #1888)
+Files: .travis.yml
+
+Patch 8.0.0797
+Problem: Finished job in terminal window is not handled.
+Solution: Add the scrollback buffer. Use it to fill the buffer when the job
+ has ended.
+Files: src/terminal.c, src/screen.c, src/proto/terminal.pro,
+ src/channel.c, src/os_unix.c, src/buffer.c
+
+Patch 8.0.0798
+Problem: No highlighting in a terminal window with a finished job.
+Solution: Highlight the text.
+Files: src/terminal.c, src/proto/terminal.pro, src/screen.c, src/undo.c
+
+Patch 8.0.0799
+Problem: Missing semicolon.
+Solution: Add it.
+Files: src/terminal.c
+
+Patch 8.0.0800
+Problem: Terminal window scrollback contents is wrong.
+Solution: Fix handling of multibyte characters (Yasuhiro Matsumoto) Handle
+ empty lines correctly. (closes #1891)
+Files: src/terminal.c
+
+Patch 8.0.0801
+Problem: The terminal window title sometimes still says "running" even
+ though the job has finished.
+Solution: Also consider the job finished when the channel has been closed.
+Files: src/terminal.c
+
+Patch 8.0.0802
+Problem: After a job exits the last line in the terminal window does not
+ get color attributes.
+Solution: Fix off-by-one error.
+Files: src/terminal.c
+
+Patch 8.0.0803
+Problem: Terminal window functions not yet implemented.
+Solution: Implement several functions. Add a first test. (Yasuhiro
+ Matsumoto, closes #1871)
+Files: runtime/doc/eval.txt, src/Makefile, src/evalfunc.c,
+ src/proto/evalfunc.pro, src/proto/terminal.pro, src/terminal.c,
+ src/testdir/Make_all.mak, src/testdir/test_terminal.vim
+
+Patch 8.0.0804
+Problem: Running tests fails when stdin is /dev/null. (James McCoy)
+Solution: Do not bail out from getting input if the --not-a-term argument
+ was given. (closes #1460)
+Files: src/eval.c, src/evalfunc.c
+
+Patch 8.0.0805
+Problem: GUI test fails with gnome2.
+Solution: Set $HOME to an existing directory.
+Files: src/testdir/setup.vim, src/testdir/runtest.vim
+
+Patch 8.0.0806
+Problem: Tests may try to create XfakeHOME twice.
+Solution: Avoid loading setup.vim twice.
+Files: src/testdir/setup.vim
+
+Patch 8.0.0807
+Problem: Terminal window can't handle mouse buttons. (Hirohito Higashi)
+Solution: Implement mouse buttons and many other keys. Ignore the ones that
+ are not implemented.
+Files: src/terminal.c
+
+Patch 8.0.0808
+Problem: Cannot build with terminal feature and DEBUG defined. (Christian
+ Brabandt)
+Solution: Use DEBUG_LOG3().
+Files: src/libvterm/src/pen.c
+
+Patch 8.0.0809
+Problem: MS-Windows: tests hang.
+Solution: Delete the XfakeHOME directory.
+Files: src/testdir/Make_dos.mak, src/testdir/Make_ming.mak
+
+Patch 8.0.0810
+Problem: MS-Windows: tests still hang.
+Solution: Only create the XfakeHOME directory if it does not exist yet.
+Files: src/testdir/setup.vim
+
+Patch 8.0.0811
+Problem: MS-Windows: test_expand_dllpath fails.
+Solution: Change backslashes to forward slashes
+Files: src/testdir/test_expand_dllpath.vim
+
+Patch 8.0.0812
+Problem: Terminal window colors shift when 'number' is set. (Nazri Ramliy)
+Solution: Use vcol instead of col.
+Files: src/screen.c
+
+Patch 8.0.0813
+Problem: Cannot use Vim commands in a terminal window while the job is
+ running.
+Solution: Implement Terminal Normal mode.
+Files: src/terminal.c, src/proto/terminal.pro, src/main.c, src/screen.c,
+ src/normal.c, src/option.c, runtime/doc/terminal.txt
+
+Patch 8.0.0814 (after 8.0.0757)
+Problem: File in Filelist does not exist.
+Solution: Remove the line.
+Files: Filelist
+
+Patch 8.0.0815
+Problem: Terminal window not correctly updated when 'statusline' invokes
+ ":sleep". (Nikolay Pavlov)
+Solution: Clear got_int. Repeat redrawing when needed.
+Files: src/terminal.c
+
+Patch 8.0.0816
+Problem: Crash when using invalid buffer number.
+Solution: Check for NULL buffer. (Yasuhiro Matsumoto, closes #1899)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0817
+Problem: Cannot get the line of a terminal window at the cursor.
+Solution: Make the row argument optional. (Yasuhiro Matsumoto, closes #1898)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/terminal.c
+
+Patch 8.0.0818
+Problem: Cannot get the cursor position of a terminal.
+Solution: Add term_getcursor().
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/terminal.c,
+ src/proto/terminal.pro
+
+Patch 8.0.0819
+Problem: After changing current window the cursor position in the terminal
+ window is not updated.
+Solution: Set w_wrow, w_wcol and w_valid.
+Files: src/terminal.c
+
+Patch 8.0.0820
+Problem: GUI: cursor in terminal window lags behind.
+Solution: call gui_update_cursor() under different conditions. (Ozaki
+ Kiichi, closes #1893)
+Files: src/terminal.c
+
+Patch 8.0.0821
+Problem: Cannot get the title and status of a terminal window.
+Solution: Implement term_gettitle() and term_getstatus().
+Files: src/evalfunc.c, src/terminal.c, src/proto/terminal.pro,
+ runtime/doc/eval.txt
+
+Patch 8.0.0822
+Problem: Test_with_partial_callback is a tiny bit flaky.
+Solution: Add it to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.0823
+Problem: Cannot paste text into a terminal window.
+Solution: Make CTRL-W " work.
+Files: src/terminal.c
+
+Patch 8.0.0824
+Problem: In Terminal mode the cursor and screen gets redrawn when the job
+ produces output.
+Solution: Check for tl_terminal_mode. (partly by Yasuhiro Matsumoto, closes
+ #1904)
+Files: src/terminal.c
+
+Patch 8.0.0825
+Problem: Not easy to see that a window is a terminal window.
+Solution: Add StatusLineTerm highlighting.
+Files: src/option.c, src/vim.h, src/screen.c, src/syntax.c
+
+Patch 8.0.0826
+Problem: Cannot use text objects in Terminal mode.
+Solution: Check for pending operator and Visual mode first. (Yasuhiro
+ Matsumoto, closes #1906)
+Files: src/normal.c
+
+Patch 8.0.0827
+Problem: Coverity: could leak pty file descriptor, theoretically.
+Solution: If channel is NULL, free the file descriptors.
+Files: src/os_unix.c
+
+Patch 8.0.0828
+Problem: Coverity: may dereference NULL pointer.
+Solution: Bail out if calloc_state() returns NULL.
+Files: src/regexp_nfa.c
+
+Patch 8.0.0829
+Problem: A job running in a terminal window cannot easily communicate with
+ the Vim it is running in.
+Solution: Pass v:servername in an environment variable. (closes #1908)
+Files: src/os_unix.c
+
+Patch 8.0.0830
+Problem: Translating messages is not ideal.
+Solution: Add a remark about obsolete messages. Use msgfmt in the check
+ script. (Christian Brabandt)
+Files: src/po/README.txt, src/po/check.vim
+
+Patch 8.0.0831 (after 8.0.0791)
+Problem: With 8 colors the bold attribute is not set properly.
+Solution: Move setting HL_TABLE() out of lookup_color. (closes #1901)
+Files: src/syntax.c, src/proto/syntax.pro, src/terminal.c
+
+Patch 8.0.0832
+Problem: Terminal function arguments are not consistent.
+Solution: Use one-based instead of zero-based rows and cols. Use "." for
+ the current row.
+Files: src/terminal.c, runtime/doc/eval.txt
+
+Patch 8.0.0833
+Problem: Terminal test fails.
+Solution: Update the row argument to one based.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0834
+Problem: Can't build without the client-server feature.
+Solution: Add #ifdef.
+Files: src/os_unix.c
+
+Patch 8.0.0835
+Problem: Translations check with msgfmt does not work.
+Solution: Add a space before the file name.
+Files: src/po/check.vim
+
+Patch 8.0.0836
+Problem: When a terminal buffer is changed it can still be accidentally
+ abandoned.
+Solution: When making a change reset the 'buftype' option.
+Files: src/terminal.c, src/testdir/test_terminal.vim, src/option.c
+
+Patch 8.0.0837
+Problem: Signs can be drawn on top of console messages.
+Solution: don't redraw at a prompt or when scrolled up. (Christian Brabandt,
+ closes #1907)
+Files: src/screen.c
+
+Patch 8.0.0838
+Problem: Buffer hangs around when terminal window is closed.
+Solution: When the job has ended wipe out a terminal buffer when the window
+ is closed.
+Files: src/buffer.c, src/terminal.c, src/proto/terminal.pro,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.0839
+Problem: Cannot kill a job in a terminal with CTRL-C.
+Solution: Set the controlling tty and send SIGINT. (closes #1910)
+Files: src/os_unix.c, src/terminal.c, src/proto/os_unix.pro
+
+Patch 8.0.0840
+Problem: MS-Windows: fopen() and open() prototypes do not match the ones in
+ the system header file. Can't build without FEAT_MBYTE.
+Solution: Add "const". Move macro to after including protoo.h.
+Files: src/os_win32.c, src/proto/os_win32.pro, src/macros.h, src/vim.h
+
+Patch 8.0.0841
+Problem: term_getline() may cause a crash.
+Solution: Check that the row is valid. (Hirohito Higashi)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0842
+Problem: Using slave pty after closing it.
+Solution: Do the ioctl() before dup'ing it.
+Files: src/os_unix.c
+
+Patch 8.0.0843
+Problem: MS-Windows: compiler warning for signed/unsigned.
+Solution: Add type cast. (Yasuhiro Matsumoto, closes #1912)
+Files: src/terminal.c
+
+Patch 8.0.0844
+Problem: Wrong function prototype because of missing static.
+Solution: Add "static".
+Files: src/os_win32.c, src/proto/os_win32.pro
+
+Patch 8.0.0845
+Problem: MS-Windows: missing semicolon in terminal code.
+Solution: Add it. (Naruhiko Nishino, closes #1923)
+Files: src/terminal.c
+
+Patch 8.0.0846
+Problem: Cannot get the name of the pty of a job.
+Solution: Add the "tty" entry to the job info. (Ozaki Kiichi, closes #1920)
+ Add the term_gettty() function.
+Files: runtime/doc/eval.txt, src/channel.c, src/os_unix.c, src/structs.h,
+ src/terminal.c, src/proto/terminal.pro, src/evalfunc.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.0847
+Problem: :argadd without argument can't handle space in file name. (Harm te
+ Hennepe)
+Solution: Escape the space. (Yasuhiro Matsumoto, closes #1917)
+Files: src/ex_cmds2.c, src/proto/ex_cmds2.pro,
+ src/testdir/test_arglist.vim
+
+Patch 8.0.0848
+Problem: Using multiple ch_log functions is clumsy.
+Solution: Use variable arguments. (Ozaki Kiichi, closes #1919)
+Files: src/channel.c, src/message.c, src/proto/channel.pro,
+ src/terminal.c
+
+Patch 8.0.0849
+Problem: Crash when job exit callback wipes the terminal.
+Solution: Check for b_term to be NULL. (Yasuhiro Matsumoto, closes #1922)
+ Implement options for term_start() to be able to test.
+ Make term_wait() more reliable.
+Files: src/terminal.c, src/testdir/test_terminal.vim, src/channel.c
+
+Patch 8.0.0850
+Problem: MS-Windows: Depending on the console encoding, an error message
+ that is given during startup may be broken.
+Solution: Convert the message to the console codepage. (Yasuhiro Matsumoto,
+ closes #1927)
+Files: src/message.c
+
+Patch 8.0.0851
+Problem: 'smartindent' is used even when 'indentexpr' is set.
+Solution: Ignore 'smartindent' when 'indentexpr' is set. (Hirohito Higashi)
+Files: src/misc1.c, src/testdir/test_smartindent.vim
+
+Patch 8.0.0852 (after 8.0.0850)
+Problem: MS-Windows: possible crash when giving a message on startup.
+Solution: Initialize length. (Yasuhiro Matsumoto, closes #1931)
+Files: src/message.c
+
+Patch 8.0.0853
+Problem: Crash when running terminal with unknown command.
+Solution: Check "term" not to be NULL. (Yasuhiro Matsumoto, closes #1932)
+Files: src/terminal.c
+
+Patch 8.0.0854
+Problem: No redraw after terminal was closed.
+Solution: Set typebuf_was_filled. (Yasuhiro Matsumoto, closes #1925, closes
+ #1924) Add function to check for messages even when input is
+ available.
+Files: src/terminal.c, src/os_unix.c, src/proto/os_unix.pro,
+ src/os_win32.c, src/proto/os_win32.pro, src/os_mswin.c
+
+Patch 8.0.0855
+Problem: MS-Windows: can't get tty name of terminal.
+Solution: Use the winpty process number. (Yasuhiro Matsumoto, closes #1929)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0856
+Problem: MS-Windows: terminal job doesn't take options.
+Solution: Call job_set_options(). (Yasuhiro Matsumoto)
+Files: src/terminal.c
+
+Patch 8.0.0857
+Problem: Terminal test fails on MS-Windows.
+Solution: Sleep a fraction of a second.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0858
+Problem: Can exit while a terminal is still running a job.
+Solution: Consider a buffer with a running job like a changed file.
+Files: src/undo.c, src/terminal.c, src/option.h, src/buffer.c,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/normal.c,
+ src/window.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0859
+Problem: NULL pointer access when term_free_vterm called twice.
+Solution: Return when tl_vterm is NULL. (Yasuhiro Matsumoto, closes #1934)
+Files: src/terminal.c
+
+Patch 8.0.0860
+Problem: There may be side effects when a channel appends to a buffer that
+ is not the current buffer.
+Solution: Properly switch to another buffer before appending. (Yasuhiro
+ Matsumoto, closes #1926, closes #1937)
+Files: src/channel.c, src/buffer.c, src/proto/buffer.pro,
+ src/if_py_both.h
+
+Patch 8.0.0861
+Problem: Still many old style tests.
+Solution: Convert several tests to new style. (Yegappan Lakshmanan)
+Files: src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/main.aap, src/testdir/test104.in,
+ src/testdir/test104.ok, src/testdir/test22.in,
+ src/testdir/test22.ok, src/testdir/test77.in,
+ src/testdir/test77.ok, src/testdir/test84.in,
+ src/testdir/test84.ok, src/testdir/test9.in, src/testdir/test9.ok,
+ src/testdir/test98.in, src/testdir/test98.ok,
+ src/testdir/test_autocmd.vim, src/testdir/test_curswant.vim,
+ src/testdir/test_file_size.vim, src/testdir/test_let.vim,
+ src/testdir/test_lineending.vim, src/testdir/test_scrollbind.vim,
+ src/Makefile
+
+Patch 8.0.0862 (after 8.0.0862)
+Problem: File size test fails on MS-Windows.
+Solution: Set fileformat after opening new buffer. Strip CR.
+Files: src/testdir/test_file_size.vim
+
+Patch 8.0.0863
+Problem: A remote command starting with CTRL-\ CTRL-N does not work in the
+ terminal window. (Christian J. Robinson)
+Solution: Use CTRL-\ CTRL-N as a prefix or a Normal mode command.
+Files: src/terminal.c, runtime/doc/terminal.txt
+
+Patch 8.0.0864
+Problem: Cannot specify the name of a terminal.
+Solution: Add the "term_name" option. (Yasuhiro Matsumoto, closes #1936)
+Files: src/channel.c, src/structs.h, src/terminal.c, runtime/doc/eval.txt
+
+Patch 8.0.0865
+Problem: Cannot build with channel but without terminal feature.
+Solution: Add #ifdef
+Files: src/channel.c
+
+Patch 8.0.0866
+Problem: Solaris also doesn't have MIN and MAX.
+Solution: Define MIN and MAX whenever they are not defined. (Ozaki Kiichi,
+ closes #1939)
+Files: src/terminal.c
+
+Patch 8.0.0867
+Problem: When using a job or channel value as a dict value, when turning it
+ into a string the quotes are missing.
+Solution: Add quotes to the job and channel values. (Yasuhiro Matsumoto,
+ closes #1930)
+Files: src/list.c, src/eval.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0868
+Problem: Cannot specify the terminal size on the command line.
+Solution: Use the address range for the terminal size. (Yasuhiro Matsumoto,
+ closes #1941)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0869
+Problem: Job output is sometimes not displayed in a terminal.
+Solution: Flush output before closing the channel.
+Files: src/channel.c, src/terminal.c
+
+Patch 8.0.0870
+Problem: Mouse escape codes sent to terminal unintentionally.
+Solution: Fix libvterm to send mouse codes only when enabled.
+Files: src/terminal.c, src/libvterm/src/mouse.c
+
+Patch 8.0.0871
+Problem: The status line for a terminal window always has "[+]".
+Solution: Do make the status line include "[+]" for a terminal window.
+Files: src/screen.c
+
+Patch 8.0.0872
+Problem: Using mouse scroll while a terminal window has focus and the mouse
+ pointer is on another window does not work. Same for focus in a
+ non-terminal window and the mouse pointer is over a terminal
+ window.
+Solution: Send the scroll action to the right window.
+Files: src/terminal.c, src/normal.c, src/proto/terminal.pro
+
+Patch 8.0.0873
+Problem: In a terminal window cannot use CTRL-\ CTRL-N to start Visual
+ mode.
+Solution: After CTRL-\ CTRL-N enter Terminal-Normal mode for one command.
+Files: src/main.c, src/terminal.c, src/proto/terminal.pro
+
+Patch 8.0.0874 (after 8.0.0873)
+Problem: Can't build with terminal feature.
+Solution: Include change to term_use_loop(). (Dominique Pelle)
+Files: src/normal.c
+
+Patch 8.0.0875
+Problem: Crash with weird command sequence. (Dominique Pelle)
+Solution: Use vim_snprintf() instead of STRCPY().
+Files: src/misc1.c
+
+Patch 8.0.0876
+Problem: MS-Windows: Backslashes and wildcards in backticks don't work.
+Solution: Do not handle backslashes inside backticks in the wrong place.
+ (Yasuhiro Matsumoto, closes #1942)
+Files: src/os_mswin.c, src/os_win32.c
+
+Patch 8.0.0877
+Problem: Using CTRL-\ CTRL-N in terminal is inconsistent.
+Solution: Stay in Normal mode.
+Files: src/terminal.c, src/proto/terminal.pro, src/main.c, src/normal.c,
+ src/option.c
+
+Patch 8.0.0878
+Problem: No completion for :mapclear.
+Solution: Add completion (Nobuhiro Takasaki et al. closes #1943)
+Files: runtime/doc/eval.txt, runtime/doc/map.txt, src/ex_docmd.c,
+ src/ex_getln.c, src/proto/ex_docmd.pro,
+ src/testdir/test_cmdline.vim, src/vim.h
+
+Patch 8.0.0879
+Problem: Crash when shifting with huge number.
+Solution: Check for overflow. (Dominique Pelle, closes #1945)
+Files: src/ops.c, src/testdir/test_visual.vim
+
+Patch 8.0.0880
+Problem: Travis uses an old Ubuntu version.
+Solution: Switch from precise to trusty. (Ken Takata, closes #1897)
+Files: .travis.yml, Filelist, src/testdir/if_ver-1.vim,
+ src/testdir/if_ver-2.vim, src/testdir/lsan-suppress.txt
+
+Patch 8.0.0881
+Problem: win32.mak no longer included in Windows SDK.
+Solution: Do not include win32.mak. (Ken Takata)
+Files: src/GvimExt/Makefile, src/Make_mvc.mak
+
+Patch 8.0.0882
+Problem: term_scrape() and term_getline() require two arguments but it is
+ not enforced.
+Solution: Correct minimal number of arguments. (Hirohito Higashi) Update
+ documentation. (Ken Takata)
+Files: src/evalfunc.c, runtime/doc/eval.txt
+
+Patch 8.0.0883
+Problem: Invalid memory access with nonsensical script.
+Solution: Check "dstlen" being positive. (Dominique Pelle)
+Files: src/misc1.c
+
+Patch 8.0.0884
+Problem: Can't specify the wait time for term_wait().
+Solution: Add an optional second argument.
+Files: src/evalfunc.c, src/terminal.c, runtime/doc/eval.txt
+
+Patch 8.0.0885
+Problem: Terminal window scrollback is stored inefficiently.
+Solution: Store the text in the Vim buffer.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0886
+Problem: Crash when using ":term ls".
+Solution: Fix line number computation. Add a test for this.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0887
+Problem: Can create a logfile in the sandbox.
+Solution: Disable ch_logfile() in the sandbox. (Yasuhiro Matsumoto)
+Files: src/evalfunc.c
+
+Patch 8.0.0888
+Problem: Compiler warnings with 64 bit build.
+Solution: Add type cast of change the type. (Mike Williams)
+Files: src/message.c, src/os_mswin.c, src/os_win32.c
+
+Patch 8.0.0889
+Problem: Gcc gives warnings for uninitialized variables. (Tony Mechelynck)
+Solution: Initialize variables even though they are not used.
+Files: src/terminal.c
+
+Patch 8.0.0890
+Problem: Still many old style tests.
+Solution: Convert several tests to new style. (Yegappan Lakshmanan)
+Files: src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test103.in, src/testdir/test103.ok,
+ src/testdir/test107.in, src/testdir/test107.ok,
+ src/testdir/test51.in, src/testdir/test51.ok,
+ src/testdir/test91.in, src/testdir/test91.ok,
+ src/testdir/test_getvar.vim, src/testdir/test_highlight.vim,
+ src/testdir/test_visual.vim, src/testdir/test_window_cmd.vim,
+ src/Makefile
+
+Patch 8.0.0891
+Problem: Uninitialized memory use with empty line in terminal.
+Solution: Initialize growarray earlier. (Yasuhiro Matsumoto, closes #1949)
+Files: src/terminal.c
+
+Patch 8.0.0892
+Problem: When opening a terminal the pty size doesn't always match.
+Solution: Update the pty size after opening the terminal. (Ken Takata)
+Files: src/terminal.c
+
+Patch 8.0.0893
+Problem: Cannot get the scroll count of a terminal window.
+Solution: Add term_getscrolled().
+Files: src/terminal.c, src/proto/terminal.pro, src/evalfunc.c,
+ runtime/doc/eval.txt, src/testdir/test_terminal.vim
+
+Patch 8.0.0894
+Problem: There is no test for runtime filetype detection.
+Solution: Test a list of filetypes from patterns.
+Files: src/testdir/test_filetype.vim, runtime/filetype.vim
+
+Patch 8.0.0895 (after 8.0.0894)
+Problem: Filetype test fails on MS-Windows.
+Solution: Fix file names.
+Files: src/testdir/test_filetype.vim
+
+Patch 8.0.0896
+Problem: Cannot automatically close a terminal window when the job ends.
+Solution: Add the ++close argument to :term. Add the term_finish option to
+ term_start(). (Yasuhiro Matsumoto, closes #1950) Also add
+ ++open.
+Files: runtime/doc/eval.txt, runtime/doc/terminal.txt, src/channel.c,
+ src/structs.h, src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0897 (after 8.0.0896)
+Problem: Wrong error message for invalid term_finish value
+Solution: Pass the right argument to emsg().
+Files: src/channel.c
+
+Patch 8.0.0898
+Problem: Can't use the alternate screen in a terminal window.
+Solution: Initialize the alternate screen. (Yasuhiro Matsumoto, closes
+ #1957) Add term_getaltscreen().
+Files: src/libvterm/include/vterm.h, src/terminal.c,
+ src/proto/terminal.pro, src/evalfunc.c, runtime/doc/eval.txt
+
+Patch 8.0.0899
+Problem: Function name mch_stop_job() is confusing.
+Solution: Rename to mch_signal_job().
+Files: src/channel.c, src/os_unix.c, src/proto/os_unix.pro,
+ src/os_win32.c, src/proto/os_win32.pro, src/terminal.c
+
+Patch 8.0.0900
+Problem: :tab options doesn't open a new tab page. (Aviany)
+Solution: Support the :tab modifier. (closes #1960)
+Files: src/ex_cmds2.c, runtime/optwin.vim
+
+Patch 8.0.0901
+Problem: Asan suppress file missing from distribution.
+Solution: Add the file.
+Files: Filelist
+
+Patch 8.0.0902
+Problem: Cannot specify directory or environment for a job.
+Solution: Add the "cwd" and "env" arguments to job options. (Yasuhiro
+ Matsumoto, closes #1160)
+Files: runtime/doc/channel.txt, src/channel.c, src/terminal.c,
+ src/os_unix.c, src/os_win32.c, src/structs.h,
+ src/testdir/test_channel.vim, src/testdir/test_terminal.vim
+
+Patch 8.0.0903 (after 8.0.0902)
+Problem: Early return from test function.
+Solution: Remove the return.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0904
+Problem: Cannot set a location list from text.
+Solution: Add the "text" argument to setqflist(). (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0905
+Problem: MS-Windows: broken multibyte characters in the console.
+Solution: Restore all regions of the console buffer. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 8.0.0906
+Problem: Don't recognize Couchbase files.
+Solution: Add filetype detection. (Eugene Ciurana, closes #1951)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.0.0907
+Problem: With cp932 font names might be misinterpreted.
+Solution: Do not see "_" as a space when it is the second byte of a double
+ byte character. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 8.0.0908
+Problem: Cannot set terminal size with options.
+Solution: Add "term_rows", "term_cols" and "vertical".
+Files: src/terminal.c, runtime/doc/eval.txt, src/channel.c,
+ src/proto/channel.pro, src/structs.h, src/evalfunc.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.0909
+Problem: Channel test fails.
+Solution: Allow for "cwd" and "env" arguments.
+Files: src/channel.c
+
+Patch 8.0.0910
+Problem: Cannot create a terminal in the current window.
+Solution: Add option "curwin" and ++curwin.
+Files: src/terminal.c, runtime/doc/eval.txt, src/channel.c,
+ src/structs.h, src/ex_cmds.h, src/testdir/test_terminal.vim
+
+Patch 8.0.0911
+Problem: Terminal test takes too long.
+Solution: Instead of "sleep 1" use a Python program to briefly sleep.
+Files: src/testdir/test_terminal.vim, src/testdir/test_short_sleep.py
+
+Patch 8.0.0912
+Problem: Cannot run a job in a hidden terminal.
+Solution: Add option "hidden" and ++hidden.
+Files: src/terminal.c, src/structs.h, src/channel.c, src/fileio.c,
+ runtime/doc/terminal.txt, src/testdir/test_terminal.vim
+
+Patch 8.0.0913
+Problem: MS-Windows: CTRL-C kills shell in terminal window instead of the
+ command running in the shell.
+Solution: Make CTRL-C only send a CTRL_C_EVENT and have CTRL-BREAK kill the
+ job. (partly by Yasuhiro Matsumoto, closes #1962)
+Files: src/os_win32.c, src/gui_w32.c, src/terminal.c, src/globals.h
+
+Patch 8.0.0914
+Problem: Highlight attributes are always combined.
+Solution: Add the 'nocombine' value to replace attributes instead of
+ combining them. (scauligi, closes #1963)
+Files: runtime/doc/syntax.txt, src/syntax.c, src/vim.h
+
+Patch 8.0.0915
+Problem: Wrong initialisation of global.
+Solution: Use INIT().
+Files: src/globals.h
+
+Patch 8.0.0916
+Problem: Cannot specify properties of window for when opening a window for
+ a finished terminal job.
+Solution: Add "term_opencmd".
+Files: src/channel.c, src/structs.h, src/terminal.c,
+ runtime/doc/eval.txt, src/testdir/test_terminal.vim
+
+Patch 8.0.0917
+Problem: MS-Windows:CTRL-C handling in terminal window is wrong
+Solution: Pass CTRL-C as a key. Turn CTRL-BREAK into a key stroke. (Yasuhiro
+ Matsumoto, closes #1965)
+Files: src/os_win32.c, src/terminal.c
+
+Patch 8.0.0918
+Problem: Cannot get terminal window cursor shape or attributes.
+Solution: Support cursor shape, attributes and color.
+Files: src/terminal.c, runtime/doc/eval.txt,
+ src/libvterm/include/vterm.h, src/libvterm/src/state.c,
+ src/libvterm/src/vterm.c, src/feature.h, src/ui.c,
+ src/proto/ui.pro, src/term.c, src/proto/term.pro,
+ src/option.c, src/term.h
+
+Patch 8.0.0919
+Problem: Cursor color isn't set on startup.
+Solution: Initialize showing_mode to invalid value.
+Files: src/term.c
+
+Patch 8.0.0920
+Problem: The cursor shape is wrong after switch back from an alternate
+ screen in a terminal window. (Marius Gedminas)
+Solution: Change bitfield to unsigned. Set flag that cursor shape was set.
+Files: src/terminal.c, src/libvterm/src/vterm_internal.h
+
+Patch 8.0.0921
+Problem: Terminal window cursor shape not supported in the GUI.
+Solution: Use the terminal window cursor shape in the GUI.
+Files: src/terminal.c, src/proto/terminal.pro, src/gui.c, src/syntax.c,
+ src/proto/syntax.pro
+
+Patch 8.0.0922
+Problem: Quickfix list always added after current one.
+Solution: Make it possible to add a quickfix list after the last one.
+ (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.0923
+Problem: Crash in GUI when terminal job exits. (Kazunobu Kuriyama)
+Solution: reset in_terminal_loop when a terminal is freed.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0924
+Problem: Terminal window not updated after using term_sendkeys().
+Solution: Call redraw_after_callback().
+Files: src/terminal.c
+
+Patch 8.0.0925
+Problem: MS-Windows GUI: channel I/O not handled right away.
+Solution: Don't call process_message() unless a message is available.
+ (Yasuhiro Matsumoto, closes #1969)
+Files: src/gui_w32.c
+
+Patch 8.0.0926
+Problem: When job in terminal window ends topline may be wrong.
+Solution: When the job ends adjust topline so that the active part of the
+ terminal is displayed.
+Files: src/terminal.c
+
+Patch 8.0.0927
+Problem: If a terminal job sends a blank title "running" is not shown.
+Solution: When the title is blank make it empty.
+Files: src/terminal.c
+
+Patch 8.0.0928
+Problem: MS-Windows: passing arglist to job has escaping problems.
+Solution: Improve escaping. (Yasuhiro Matsumoto, closes #1954)
+Files: src/testdir/test_channel.vim, src/testdir/test_terminal.vim,
+ src/channel.c, src/proto/channel.pro, src/terminal.c
+
+Patch 8.0.0929
+Problem: :term without argument does not work.
+Solution: Use shell for empty command. (Yasuhiro Matsumoto, closes #1970)
+Files: src/terminal.c
+
+Patch 8.0.0930
+Problem: Terminal buffers are stored in the viminfo file while they can't
+ be useful.
+Solution: Skip terminal buffers for file marks and buffer list
+Files: src/buffer.c, src/mark.c
+
+Patch 8.0.0931
+Problem: getwininfo() does not indicate a terminal window.
+Solution: Add "terminal" to the dictionary.
+Files: runtime/doc/eval.txt, src/evalfunc.c
+
+Patch 8.0.0932
+Problem: Terminal may not use right characters for BS and Enter.
+Solution: Get the characters from the tty.
+Files: src/os_unix.c, src/proto/os_unix.pro, src/terminal.c
+
+Patch 8.0.0933
+Problem: Terminal test tries to start GUI when it's not possible.
+Solution: Check if the GUI can run. (James McCoy, closes #1971)
+Files: src/testdir/shared.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_gui.vim, src/testdir/test_gui_init.vim
+
+Patch 8.0.0934 (after 8.0.0932)
+Problem: Change to struts.h missing in patch.
+Solution: Include adding ttyinfo_T.
+Files: src/structs.h
+
+Patch 8.0.0935
+Problem: Cannot recognize a terminal buffer in :ls output.
+Solution: Use R for a running job and F for a finished job.
+Files: src/buffer.c
+
+Patch 8.0.0936
+Problem: mode() returns wrong value for a terminal window.
+Solution: Return 't' when typed keys go to a job.
+Files: src/evalfunc.c, src/testdir/test_terminal.vim
+
+Patch 8.0.0937
+Problem: User highlight groups are not adjusted for StatusLineTerm.
+Solution: Combine attributes like for StatusLineNC.
+Files: src/syntax.c, src/globals.h, src/screen.c
+
+Patch 8.0.0938
+Problem: Scrolling in terminal window is inefficient.
+Solution: Use win_del_lines().
+Files: src/terminal.c
+
+Patch 8.0.0939
+Problem: Test_terminal_env is flaky. (James McCoy)
+Solution: Use WaitFor() instead of term_wait().
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0940
+Problem: Test_terminal_scrape_multibyte is flaky. (James McCoy)
+Solution: Use WaitFor() instead of term_wait().
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0941
+Problem: Existing color schemes don't work well with StatusLineTerm.
+Solution: Don't use "reverse", use fg and bg colors. Also add
+ StatusLineTermNC.
+Files: src/syntax.c, src/vim.h, src/screen.c, src/globals.h, src/option.c
+
+Patch 8.0.0942
+Problem: Using freed memory with ":terminal" if an autocommand changes
+ 'shell' when splitting the window. (Marius Gedminas)
+Solution: Make a copy of 'shell'. (closes #1974)
+Files: src/terminal.c
+
+Patch 8.0.0943
+Problem: Test_terminal_scrape_multibyte fails if the codepage is not utf-8.
+Solution: Start "cmd" with the utf-8 codepage. (micbou, closes #1975)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0944
+Problem: Test_profile is a little bit flaky.
+Solution: Accept a match when self and total time are the same. (James
+ McCoy, closes #1972)
+Files: src/testdir/test_profile.vim
+
+Patch 8.0.0945
+Problem: 64-bit compiler warnings.
+Solution: Use "size_t" instead of "int". (Mike Williams)
+Files: src/os_win32.c
+
+Patch 8.0.0946
+Problem: Using PATH_MAX does not work well on some systems.
+Solution: use MAXPATHL instead. (James McCoy, closes #1973)
+Files: src/main.c
+
+Patch 8.0.0947
+Problem: When in Insert mode and using CTRL-O CTRL-W CTRL-W to move to a
+ terminal window, get in a weird Insert mode.
+Solution: Don't go to Insert mode in a terminal window. (closes #1977)
+Files: src/normal.c
+
+Patch 8.0.0948
+Problem: Crash if timer closes window while dragging status line.
+Solution: Check if the window still exists. (Yasuhiro Matsumoto, closes
+ #1979)
+Files: src/edit.c, src/evalfunc.c, src/gui.c, src/normal.c, src/ui.c
+
+Patch 8.0.0949
+Problem: winpty.dll name is fixed.
+Solution: Add the 'winptydll' option. Make the default name depend on
+ whether it is a 32-bit or 64-bit build. (idea by Yasuhiro
+ Matsumoto, closes #1978)
+Files: src/option.c, src/option.h, src/terminal.c,
+ runtime/doc/options.txt
+
+Patch 8.0.0950
+Problem: MS-Windows: wrong #ifdef, compiler warnings for signed/unsigned.
+Solution: Change variable type. Change TERMINAL to FEAT_TERMINAL.
+Files: src/os_win32.c, src/option.h
+
+Patch 8.0.0951
+Problem: Another wrong #ifdef.
+Solution: Change TERMINAL to FEAT_TERMINAL. (closes #1981)
+Files: src/option.c
+
+Patch 8.0.0952
+Problem: MS-Windows: has('terminal') does not check existence of dll file.
+Solution: Check if the winpty dll file can be loaded. (Ken Takata)
+Files: src/evalfunc.c, src/proto/terminal.pro, src/terminal.c
+
+Patch 8.0.0953
+Problem: Get "no write since last change" error in terminal window.
+Solution: Use another message when closing a terminal window. Make ":quit!"
+ also end the job.
+Files: src/globals.h, src/buffer.c, src/proto/buffer.pro, src/ex_cmds.c,
+ src/ex_cmds2.c, src/ex_docmd.c, src/quickfix.c, src/terminal.c
+
+Patch 8.0.0954
+Problem: /proc/self/exe might be a relative path.
+Solution: Make the path a full path. (James McCoy, closes #1983)
+Files: src/main.c
+
+Patch 8.0.0955
+Problem: Test_existent_file() fails on some file systems.
+Solution: Run the test again with a sleep when the test fails without a
+ sleep. (James McCoy, closes #1984)
+Files: src/testdir/test_stat.vim
+
+Patch 8.0.0956
+Problem: Scrolling in a terminal hwindow as flicker when the Normal
+ background differs from the terminal window background.
+Solution: Set the attribute to clear with.
+Files: src/terminal.c, src/screen.c, src/proto/screen.pro, src/message.c,
+ src/move.c
+
+Patch 8.0.0957
+Problem: When term_sendkeys() sends many keys it may get stuck in writing
+ to the job.
+Solution: Make the write non-blocking, buffer keys to be sent.
+Files: src/terminal.c, src/channel.c, src/proto/channel.pro,
+ src/structs.h src/testdir/test_terminal.vim
+
+Patch 8.0.0958
+Problem: The terminal test fails on MS-Windows when compiled with the
+ terminal feature but the winpty DLL is missing.
+Solution: Check if the terminal feature works. (Ken Takata)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0959
+Problem: Build failure on MS-Windows.
+Solution: Use ioctlsocket() instead of fcntl().
+Files: src/channel.c
+
+Patch 8.0.0960
+Problem: Job in terminal does not get CTRL-C, we send a SIGINT instead.
+Solution: Don't call may_send_sigint() on CTRL-C. Make CTRL-W CTRL-C end
+ the job.
+Files: src/terminal.c, runtime/doc/terminal.txt
+
+Patch 8.0.0961
+Problem: The script to build the installer does not include winpty.
+Solution: Add winpty32.dll and winpty-agent.exe like diff.exe
+Files: nsis/gvim.nsi
+
+Patch 8.0.0962
+Problem: Crash with virtualedit and joining lines. (Joshua T Corbin, Neovim
+ #6726)
+Solution: When using a mark check that coladd is valid.
+Files: src/normal.c, src/misc2.c, src/Makefile,
+ src/testdir/test_virtualedit.vim, src/testdir/test_alot.vim
+
+Patch 8.0.0963
+Problem: Terminal test fails on macOS. (chdiza)
+Solution: Wait for the shell to echo the characters. (closes #1991)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0964
+Problem: Channel write buffer does not work with poll().
+Solution: Use the same mechanism as with select().
+Files: src/channel.c
+
+Patch 8.0.0965
+Problem: The cursor shape is not reset after it was changed in a terminal.
+Solution: Request the original cursor shape and restore it. Add t_RS.
+ Do not add t_SH for now, it does not work properly.
+Files: src/term.c, src/term.h, src/option.c, src/terminal.c
+
+Patch 8.0.0966 (after 8.0.0965)
+Problem: Build failure without terminal feature.
+Solution: Move #endif.
+Files: src/term.c
+
+Patch 8.0.0967
+Problem: Using a terminal may cause the cursor to blink.
+Solution: Do not set t_vs, since we cannot restore the old blink state.
+Files: src/term.c
+
+Patch 8.0.0968
+Problem: Crash when switching terminal modes. (Nikolai Pavlov)
+Solution: Check that there are scrollback lines.
+Files: src/terminal.c
+
+Patch 8.0.0969
+Problem: Coverity warning for unused return value.
+Solution: Add (void) to avoid the warning.
+Files: src/channel.c
+
+Patch 8.0.0970
+Problem: if there is no StatusLine highlighting and there is StatusLineNC
+ or StatusLineTermNC highlighting then an invalid highlight id is
+ passed to combine_stl_hlt(). (Coverity)
+Solution: Check id_S to be -1 instead of zero.
+Files: src/syntax.c
+
+Patch 8.0.0971
+Problem: 'winptydll' missing from :options.
+Solution: Add the entry.
+Files: runtime/optwin.vim
+
+Patch 8.0.0972
+Problem: Compiler warnings for unused variables. (Tony Mechelynck)
+Solution: Add #ifdefs.
+Files: src/term.c
+
+Patch 8.0.0973
+Problem: initial info about blinking cursor is wrong
+Solution: Invert the blink flag. Add t_VS to stop a blinking cursor.
+Files: src/term.c, src/proto/term.pro, src/term.h, src/option.c,
+ src/terminal.c
+
+Patch 8.0.0974
+Problem: Resetting a string option does not trigger OptionSet. (Rick Howe)
+Solution: Set the origval.
+Files: src/option.c, src/testdir/test_autocmd.vim
+
+Patch 8.0.0975
+Problem: Using freed memory when setting 'backspace'.
+Solution: When changing oldval also change origval.
+Files: src/option.c
+
+Patch 8.0.0976
+Problem: Cannot send lines to a terminal job.
+Solution: Make [range]terminal send selected lines to the job.
+ Use ++rows and ++cols for the terminal size.
+Files: src/ex_cmds.h, src/terminal.c, src/os_unix.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.0977
+Problem: Cannot send lines to a terminal job on MS-Windows.
+Solution: Set jv_in_buf. Command doesn't get EOF yet though.
+Files: src/terminal.c
+
+Patch 8.0.0978
+Problem: Writing to terminal job is not tested.
+Solution: Add a test.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0979
+Problem: Terminal noblock test fails on MS-Windows. (Christian Brabandt)
+Solution: Ignore empty line below "done".
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0980
+Problem: Coverity warning for failing to open /dev/null.
+Solution: When /dev/null can't be opened exit the child.
+Files: src/os_unix.c
+
+Patch 8.0.0981
+Problem: Cursor in terminal window blinks by default, while in a real xterm
+ it does not blink, unless the -bc argument is used.
+Solution: Do not use a blinking cursor by default.
+Files: src/terminal.c
+
+Patch 8.0.0982
+Problem: When 'encoding' is set to a multibyte encoding other than utf-8
+ the characters from their terminal are messed up.
+Solution: Convert displayed text from utf-8 to 'encoding' for MS-Windows.
+ (Yasuhiro Matsumoto, close #2000)
+Files: src/terminal.c
+
+Patch 8.0.0983
+Problem: Unnecessary check for NULL pointer.
+Solution: Remove the NULL check in dialog_changed(), it already happens in
+ dialog_msg(). (Ken Takata)
+Files: src/ex_cmds2.c
+
+Patch 8.0.0984
+Problem: Terminal blinking cursor not correct in the GUI.
+Solution: Set blinkoff correctly. Also make the cursor blink on MS-Windows
+ by default. (Ken Takata)
+Files: src/terminal.c
+
+Patch 8.0.0985
+Problem: Libvterm has its own idea of character width.
+Solution: Use the Vim functions for character width and composing to avoid a
+ mismatch. (idea by Yasuhiro Matsumoto)
+Files: src/Makefile, src/libvterm/src/unicode.c, src/mbyte.c,
+ src/proto/mbyte.pro, src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.0.0986
+Problem: Terminal feature always requires multibyte feature.
+Solution: Remove #ifdef FEAT_MBYTE, disable terminal without multibyte.
+Files: src/terminal.c, src/feature.h
+
+Patch 8.0.0987
+Problem: terminal: second byte of double-byte char wrong
+Solution: Set the second byte to NUL only for utf-8 and non-multibyte.
+Files: src/terminal.c
+
+Patch 8.0.0988
+Problem: Warning from Covscan about using NULL pointer.
+Solution: Add extra check for NULL. (zdohnal)
+Files: src/fileio.c, src/undo.c
+
+Patch 8.0.0989
+Problem: ActiveTcl dll name has changed in 8.6.6.
+Solution: Adjust the makefile. (Ken Takata)
+Files: src/INSTALLpc.txt, src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.0.0990
+Problem: When 'encoding' is a double-byte encoding, pasting a register into
+ a terminal ends up with the wrong characters.
+Solution: Convert from 'encoding' to utf-8. (Yasuhiro Matsumoto, closes
+ #2007)
+Files: src/terminal.c
+
+Patch 8.0.0991
+Problem: Using wrong character conversion for DBCS.
+Solution: Use utf_char2bytes instead of mb_char2bytes. (Yasuhiro Matsumoto,
+ closes #2012)
+Files: src/terminal.c
+
+Patch 8.0.0992
+Problem: Terminal title is wrong when 'encoding' is DBCS.
+Solution: Convert the title from DBCS to utf-8. (Yasuhiro Matsumoto, closes
+ #2009)
+Files: src/terminal.c
+
+Patch 8.0.0993
+Problem: Sometimes an xterm sends an extra CTRL-X after the response for
+ the background color. Related to t_RS.
+Solution: Check for the CTRL-X after the terminating 0x7.
+Files: src/term.c
+
+Patch 8.0.0994
+Problem: MS-Windows: cursor in terminal blinks even though the blinking
+ cursor was disabled on the system.
+Solution: Use GetCaretBlinkTime(). (Ken Takata)
+Files: src/terminal.c
+
+Patch 8.0.0995
+Problem: Terminal tests fail on Mac.
+Solution: Add workaround: sleep a moment in between sending keys.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.0996
+Problem: Mac: t_RS is echoed on the screen in Terminal.app. Even though
+ $TERM is set to "xterm-256colors" it cannot handle this xterm
+ escape sequence.
+Solution: Recognize Terminal.app from the termresponse and skip sending t_RS
+ if it looks like Terminal.app.
+Files: src/term.c
+
+Patch 8.0.0997 (after 8.0.0996)
+Problem: Libvterm and Terminal.app not recognized from termresponse.
+Solution: Adjust string compare.
+Files: src/term.c
+
+Patch 8.0.0998
+Problem: Strange error when using K while only spaces are selected.
+ (Christian J. Robinson)
+Solution: Check for blank argument.
+Files: src/normal.c, src/testdir/test_help.vim
+
+Patch 8.0.0999
+Problem: Indenting raw C++ strings is wrong.
+Solution: Add special handling of raw strings. (Christian Brabandt)
+Files: src/misc1.c, src/testdir/test_cindent.vim
+
+Patch 8.0.1000
+Problem: Cannot open a terminal without running a job in it.
+Solution: Make ":terminal NONE" open a terminal with a pty.
+Files: src/terminal.c, src/os_unix.c, src/proto/os_unix.pro,
+ src/channel.c, src/proto/channel.pro, src/structs.h,
+ src/testdir/test_terminal.c, src/misc2.c, src/gui_gtk_x11.c
+
+Patch 8.0.1001
+Problem: Setting 'encoding' makes 'printheader' invalid.
+Solution: Do not translate the default value of 'printheader'. (Yasuhiro
+ Matsumoto, closes #2026)
+Files: src/option.c
+
+Patch 8.0.1002
+Problem: Unnecessarily updating screen after timer callback.
+Solution: Check if calling the timer sets must_redraw.
+Files: src/ex_cmds2.c, src/channel.c, src/screen.c, src/proto/screen.pro,
+ src/terminal.c
+
+Patch 8.0.1003
+Problem: 64 bit compiler warning
+Solution: Add type cast. (Mike Williams)
+Files: src/channel.c
+
+Patch 8.0.1004
+Problem: matchstrpos() without a match returns too many items.
+Solution: Also remove the second item when the position is beyond the end of
+ the string. (Hirohito Higashi) Use an enum for the type.
+Files: src/evalfunc.c, src/testdir/test_match.vim
+
+Patch 8.0.1005
+Problem: Terminal without job updates slowly in GUI.
+Solution: Poll for input when a channel has the keep_open flag.
+Files: src/channel.c, src/proto/channel.pro, src/gui_gtk_x11.c
+
+Patch 8.0.1006
+Problem: Cannot parse text with 'errorformat' without changing a quickfix
+ list.
+Solution: Add the "text" argument to getqflist(). (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/proto/quickfix.pro,
+ src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1007
+Problem: No test for filetype detection for scripts.
+Solution: Add a first test file script filetype detection.
+Files: src/testdir/test_filetype.vim, runtime/scripts.vim
+
+Patch 8.0.1008
+Problem: Slow updating of terminal window in Motif.
+Solution: Add a timeout to the wait-for-character loop.
+Files: src/gui_x11.c
+
+Patch 8.0.1009
+Problem: Xterm cursor blinking status may be inverted.
+Solution: Use another request to get the blink status and compare with the
+ cursor style report
+Files: src/term.c, src/proto/term.pro, src/term.h, src/option.c,
+ src/terminal.c
+
+Patch 8.0.1010 (after 8.0.1009)
+Problem: Build failure without termresponse feature.
+Solution: Add #ifdef.
+Files: src/term.c
+
+Patch 8.0.1011
+Problem: Terminal test fails with Athena and Motif.
+Solution: Ignore the error for the input context. (Kazunobu Kuriyama)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1012
+Problem: MS-Windows: Problem with $HOME when it was set internally.
+Solution: Only use the $HOME default internally. (Yasuhiro Matsumoto, closes
+ #2013)
+Files: src/misc1.c, src/testdir/Make_all.mak, src/Makefile,
+ src/testdir/test_windows_home.vim
+
+Patch 8.0.1013
+Problem: A terminal window with a running job behaves different from a
+ window containing a changed buffer.
+Solution: Do not set 'bufhidden' to "hide". Fix that a buffer where a
+ terminal used to run is listed as "[Scratch]".
+Files: src/terminal.c, runtime/doc/terminal.txt, src/buffer.c
+
+Patch 8.0.1014
+Problem: Old compiler doesn't know uint32_t. Warning for using NULL instead
+ of NUL.
+Solution: Use UINT32_T. Use NUL instead of NULL.
+Files: src/mbyte.c, src/proto/mbyte.pro, src/misc1.c
+
+Patch 8.0.1015 (after 8.0.1013)
+Problem: Missing update to terminal test.
+Solution: Add the changes to the test.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1016
+Problem: Gnome terminal echoes t_RC.
+Solution: Detect Gnome terminal by the version string. Add v: variables for
+ all the term responses.
+Files: src/term.c, src/eval.c, src/vim.h, runtime/doc/eval.txt
+
+Patch 8.0.1017
+Problem: Test for MS-Windows $HOME always passes.
+Solution: Rename the test function. Make the test pass.
+Files: src/testdir/test_windows_home.vim
+
+Patch 8.0.1018
+Problem: Warnings from 64-bit compiler. (Christian Brabandt)
+Solution: Add type casts.
+Files: src/terminal.c
+
+Patch 8.0.1019
+Problem: Pasting in virtual edit happens in the wrong place.
+Solution: Do not adjust coladd when after the end of the line (closes #2015)
+Files: src/testdir/test_virtualedit.vim, src/misc2.c
+
+Patch 8.0.1020
+Problem: When a timer calls getchar(1) input is overwritten.
+Solution: Increment tb_change_cnt in inchar(). (closes #1940)
+Files: src/getchar.c
+
+Patch 8.0.1021
+Problem: Older Gnome terminal still echoes t_RC. (François Ingelrest)
+Solution: Check for version > 3000 instead of 4000.
+Files: src/term.c
+
+Patch 8.0.1022
+Problem: Test 80 is old style.
+Solution: Turn it into a new style test. (Yegappan Lakshmanan)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test80.in, src/testdir/test80.ok,
+ src/testdir/test_substitute.vim
+
+Patch 8.0.1023
+Problem: It is not easy to identify a quickfix list.
+Solution: Add the "id" field. (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1024
+Problem: Manual folds are lost when a session file has the same buffer in
+ two windows. (Jeansen)
+Solution: Use ":edit" only once. (Christian Brabandt, closes #1958)
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.0.1025
+Problem: Stray copy command in test.
+Solution: Remove the copy command.
+Files: src/testdir/test_mksession.vim
+
+Patch 8.0.1026
+Problem: GTK on-the-spot input has problems. (Gerd Wachsmuth)
+Solution: Support over-the-spot. (Yukihiro Nakadaira, Ken Takata, closes
+ #1215)
+Files: runtime/doc/mbyte.txt, runtime/doc/options.txt, src/edit.c,
+ src/ex_getln.c, src/mbyte.c, src/misc1.c, src/option.c,
+ src/option.h, src/screen.c, src/undo.c,
+ src/testdir/gen_opt_test.vim
+
+Patch 8.0.1027
+Problem: More terminals can't handle requesting cursor mode.
+Solution: Recognize Putty. (Hirohito Higashi) Also include Xfce in the
+ version check. (Dominique Pelle) Recognize Konsole.
+Files: src/term.c
+
+Patch 8.0.1028
+Problem: MS-Windows: viminfo uses $VIM/_viminfo if $HOME not set. (Yongwei
+ Wu)
+Solution: Use vim_getenv() but check it's returning the default "C:/".
+Files: src/ex_cmds.c
+
+Patch 8.0.1029
+Problem: Return value of getqflist() is inconsistent. (Lcd47)
+Solution: Always return an "items" entry.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1030
+Problem: MS-Windows: wrong size computation in is_cygpty().
+Solution: Compute the size properly. (Ken Takata)
+Files: src/iscygpty.c, src/iscygpty.h
+
+Patch 8.0.1031
+Problem: "text" argument for getqflist() is confusing. (Lcd47)
+Solution: Use "lines" instead. (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1032
+Problem: "make tags" doesn't work well on MS-Windows.
+Solution: Add or fix tags target. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.0.1033
+Problem: Detecting background color does not work in screen, even when it
+ is working like an xterm.
+Solution: Make "screen.xterm" use termcap entries like an xterm. (Lubomir
+ Rintel, closes #2048) When termresponse version is huge also
+ recognize as not being an xterm.
+Files: src/os_unix.c, src/term.c
+
+Patch 8.0.1034
+Problem: Sending buffer lines to terminal doesn't work on MS-Windows.
+Solution: Send CTRL-D to mark the end of the text. (Yasuhiro Matsumoto,
+ closes #2043) Add the "eof_chars" option.
+Files: src/channel.c, src/proto/terminal.pro, src/terminal.c,
+ src/testdir/test_terminal.vim, src/structs.h
+
+Patch 8.0.1035
+Problem: Sending buffer lines to terminal doesn't work on MS-Windows.
+Solution: Use CR instead of NL after every line. Make the EOF text work
+ properly. Add the ++eof argument to :terminal.
+Files: src/structs.h, src/channel.c, src/terminal.c,
+ runtime/doc/terminal.txt, runtime/doc/eval.txt
+
+Patch 8.0.1036
+Problem: ++eof argument for terminal only available on MS-Windows.
+Solution: Also support ++eof on Unix. Add a test.
+Files: src/channel.c, src/terminal.c, src/structs.h,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.1037
+Problem: "icase" of 'diffopt' is not used for highlighting differences.
+Solution: Also use "icase". (Rick Howe)
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.0.1038
+Problem: Strike-through text not supported.
+Solution: Add support for the "strikethrough" attribute. (Christian
+ Brabandt, Ken Takata)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/syntax.txt, runtime/doc/term.txt, src/evalfunc.c,
+ src/gui.c, src/gui.h, src/gui_gtk_x11.c, src/gui_mac.c,
+ src/gui_w32.c, src/gui_x11.c, src/option.c, src/screen.c,
+ src/syntax.c, src/term.c, src/term.h, src/terminal.c, src/vim.h
+
+Patch 8.0.1039
+Problem: Cannot change a line in a buffer other than the current one.
+Solution: Add setbufline(). (Yasuhiro Matsumoto, Ozaki Kiichi, closes #1953)
+Files: src/evalfunc.c, runtime/doc/eval.txt, src/Makefile,
+ src/testdir/test_bufline.vim, src/testdir/test_alot.vim
+
+
+Patch 8.0.1040
+Problem: Cannot use another error format in getqflist().
+Solution: Add the "efm" argument to getqflist(). (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1041
+Problem: Bogus characters appear when indenting kicks in while doing a
+ visual-block append.
+Solution: Recompute when indenting is done. (Christian Brabandt)
+Files: runtime/doc/visual.txt, src/charset.c, src/edit.c, src/misc1.c,
+ src/ops.c, src/proto/charset.pro, src/proto/misc1.pro,
+ src/screen.c, src/spell.c, src/testdir/test_cindent.vim
+
+Patch 8.0.1042 (after 8.0.1038)
+Problem: Without the syntax feature highlighting doesn't work.
+Solution: Always use unsigned short to store attributes.
+Files: src/vim.h
+
+Patch 8.0.1043
+Problem: Warning for uninitialized variable. (John Marriott)
+Solution: Move code to check indent inside "if".
+Files: src/ops.c
+
+Patch 8.0.1044
+Problem: Warning for uninitialized variable. (John Marriott)
+Solution: Initialize ind_pre.
+Files: src/ops.c
+
+Patch 8.0.1045
+Problem: Running tests may pollute shell history. (Manuel Ortega)
+Solution: Make $HISTFILE empty.
+Files: src/testdir/setup.vim
+
+Patch 8.0.1046
+Problem: Code duplication in diff mode.
+Solution: Use diff_equal_char() also in diff_cmp(). (Rick Howe)
+Files: src/diff.c
+
+Patch 8.0.1047
+Problem: Buffer overflow in Ruby.
+Solution: Allocate one more byte. (Dominique Pelle)
+Files: src/if_ruby.c
+
+Patch 8.0.1048
+Problem: No test for what 8.0.1020 fixes.
+Solution: Add test_feedinput(). Add a test. (Ozaki Kiichi, closes #2046)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_timers.vim,
+ src/ui.c
+
+Patch 8.0.1049
+Problem: Shell on Mac can't handle long text, making terminal test fail.
+Solution: Only write 1000 characters instead of 5000.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1050
+Problem: Terminal window feature not included by default.
+Solution: Include the terminal feature for the "huge" build.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1051
+Problem: Cannot run terminal with spaces in argument.
+Solution: Accept backslash to escape space and other characters. (closes
+ #1999)
+Files: src/os_unix.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1052
+Problem: term_start() does not allow in_io, out_io and err_io options.
+Solution: Add JO_OUT_IO to get_job_options().
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1053
+Problem: setline() does not work on startup. (Manuel Ortega)
+Solution: Do not check for ml_mfp to be set for the current buffer.
+ (Christian Brabandt)
+Files: src/testdir/shared.vim, src/testdir/test_alot.vim,
+ src/testdir/test_bufline.vim, src/testdir/test_timers.vim,
+ src/evalfunc.c
+
+Patch 8.0.1054
+Problem: Terminal test fails on MS-Windows.
+Solution: Disable the redirection test for now. Improve scrape test to make
+ it less flaky.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1055
+Problem: Bufline test hangs on MS-Windows.
+Solution: Avoid message for writing file. Source shared.vim when running
+ test individually.
+Files: src/testdir/test_bufline.vim, src/testdir/test_timers.vim
+
+Patch 8.0.1056
+Problem: Cannot build with the diff feature but without the multibyte
+ feature.
+Solution: Remove #ifdefs. (John Marriott)
+Files: src/diff.c
+
+Patch 8.0.1057
+Problem: Terminal scrape test waits too long, it checks for one instead of
+ three.
+Solution: Check there are three characters. (micbou)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1058
+Problem: Terminal redirection test is flaky.
+Solution: Wait for job to finish.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1059
+Problem: older Gnome terminal returns smaller version number. (antarestrue)
+Solution: Lower version limit from 2800 to 2500. (#2032)
+Files: src/term.c
+
+Patch 8.0.1060
+Problem: When imstyle is zero, mapping <Left> breaks preediting.
+Solution: Pass though preediting key-events. (Yasuhiro Matsumoto, closes
+ #2064, closes #2063)
+Files: src/getchar.c, src/mbyte.c
+
+Patch 8.0.1061
+Problem: Coverity: no check for NULL command.
+Solution: Check for NULL list item.
+Files: src/terminal.c
+
+Patch 8.0.1062
+Problem: Coverity warnings in libvterm.
+Solution: Add (void) to avoid warning for not checking return value.
+ Add "break" before "case".
+Files: src/libvterm/src/screen.c, src/libvterm/src/state.c
+
+Patch 8.0.1063
+Problem: Coverity warns for NULL check and using variable pointer as an
+ array.
+Solution: Remove the NULL check. Make "argvar" an array.
+Files: src/terminal.c
+
+Patch 8.0.1064
+Problem: Coverity warns for leaking resource.
+Solution: Free pty_master_fd on failure.
+Files: src/os_unix.c
+
+Patch 8.0.1065
+Problem: Not all macro examples are included in the self-installing
+ executable. (lkintact)
+Solution: Add the directories to the NSIS script. (closes #2065)
+Files: nsis/gvim.nsi
+
+Patch 8.0.1066
+Problem: Some terminals can't handle requesting cursor mode. (Steven
+ Hartland)
+Solution: Recognize vandyke SecureCRT. (closes #2008)
+Files: src/term.c
+
+Patch 8.0.1067
+Problem: Using try/catch in timer does not prevent it from being stopped.
+Solution: Reset the exception context and use did_emsg instead of
+ called_emsg.
+Files: src/ex_cmds2.c, src/testdir/test_timers.vim, src/globals.h,
+ src/message.c
+
+Patch 8.0.1068 (after 8.0.1066)
+Problem: Vandyke SecureCRT terminal can't handle cursor mode request.
+ (Steven Hartland)
+Solution: Fix pointer computation. (closes #2008)
+Files: src/term.c
+
+Patch 8.0.1069
+Problem: Still get CTRL-X sometimes for t_RS request.
+Solution: Also skip 0x18 after a key code response.
+Files: src/term.c
+
+Patch 8.0.1070
+Problem: Terminal test is flaky on Mac.
+Solution: Add Test_terminal_noblock() to list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.1071
+Problem: $TERM names starting with "putty" and "cygwin" are likely to have
+ a dark background, but are not recognized.
+Solution: Only check the first few characters of $TERM to match "putty" or
+ "cygwin". (Christian Brabandt)
+Files: src/option.c
+
+Patch 8.0.1072
+Problem: The :highlight command causes a redraw even when nothing changed.
+Solution: Only set "need_highlight_changed" when an attribute changed.
+Files: src/syntax.c
+
+Patch 8.0.1073
+Problem: May get an endless loop if 'statusline' changes a highlight.
+Solution: Do not let evaluating 'statusline' trigger a redraw.
+Files: src/buffer.c
+
+Patch 8.0.1074
+Problem: ":term NONE" does not work on MS-Windows.
+Solution: Make it work. Split "pty" into "pty_in" and "pty_out". (Yasuhiro
+ Matsumoto, closes #2058, closes #2045)
+Files: runtime/doc/eval.txt,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ src/channel.c, src/evalfunc.c, src/os_unix.c, src/structs.h,
+ src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1075
+Problem: MS-Windows: mouse does not work in terminal.
+Solution: Force the winpty mouse on. (Yasuhiro Matsumoto, closes #2072)
+Files: src/terminal.c
+
+Patch 8.0.1076
+Problem: term_start() does not take callbacks. When using two terminals
+ without a job only one is read from. A terminal without a window
+ returns the wrong pty.
+Solution: Support "callback", "out_cb" and "err_cb". Fix terminal without a
+ window. Fix reading from multiple channels.
+Files: src/terminal.c, src/proto/terminal.pro, src/channel.c
+
+Patch 8.0.1077
+Problem: No debugger making use of the terminal window.
+Solution: Add the term debugger plugin. So far only displays the current
+ line when stopped.
+Files: Filelist, runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.0.1078
+Problem: Using freed memory with ":hi Normal".
+Solution: Get "item" again after updating the table.
+Files: src/syntax.c
+
+Patch 8.0.1079
+Problem: Memory leak when remote_foreground() fails.
+Solution: Free the error message.
+Files: src/evalfunc.c, src/if_xcmdsrv.c
+
+Patch 8.0.1080
+Problem: Memory leak for eof_chars terminal option and buffer name.
+Solution: Free job options. Free the buffer name
+Files: src/terminal.c
+
+Patch 8.0.1081
+Problem: Memory leak for the channel write queue.
+Solution: Free the write queue when clearing a channel.
+Files: src/channel.c
+
+Patch 8.0.1082
+Problem: Tests fail when run under valgrind.
+Solution: Increase waiting times.
+Files: src/testdir/test_clientserver.vim, src/testdir/test_terminal.vim
+
+Patch 8.0.1083
+Problem: Leaking memory in input part of channel.
+Solution: Clear the input part of channel. Free the entry. Move failing
+ command test to a separate file to avoid bogus leak reports
+ clouding tests that should not leak.
+Files: src/channel.c, src/testdir/test_terminal.vim, src/Makefile,
+ src/testdir/test_terminal_fail.vim, src/testdir/Make_all.mak
+
+Patch 8.0.1084
+Problem: GTK build has compiler warnings. (Christian Brabandt)
+Solution: Get screen size with a different function. (Ken Takata, Yasuhiro
+ Matsumoto)
+Files: src/mbyte.c, src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro,
+ src/gui_beval.c
+
+Patch 8.0.1085
+Problem: The terminal debugger can't set breakpoints.
+Solution: Add :Break and :Delete commands. Also commands for stepping
+ through code.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.0.1086 (after 8.0.1084)
+Problem: Can't build with GTK 3.
+Solution: Rename function argument. (Kazunobu Kuriyama)
+Files: src/gui_gtk_x11.c
+
+Patch 8.0.1087
+Problem: Test_terminal_cwd is flaky. MS-Windows: term_start() "cwd"
+ argument does not work.
+Solution: Wait for the condition to be true instead of using a sleep.
+ Pass the directory to winpty.
+Files: src/testdir/test_terminal.vim, src/terminal.c
+
+Patch 8.0.1088
+Problem: Occasional memory use after free.
+Solution: Use the highlight table directly, don't keep a pointer.
+Files: src/syntax.c
+
+Patch 8.0.1089
+Problem: Cannot get range count in user command.
+Solution: Add <range> argument.
+Files: src/ex_docmd.c, runtime/doc/map.txt
+
+Patch 8.0.1090
+Problem: cannot get the text under the cursor like v:beval_text
+Solution: Add <cexpr>.
+Files: src/ex_docmd.c, src/testdir/test_normal.vim,
+ runtime/doc/cmdline.txt
+
+Patch 8.0.1091 (after 8.0.1090)
+Problem: Test for <cexpr> fails without +balloon_eval feature.
+Solution: Remove #ifdefs.
+Files: src/normal.c
+
+Patch 8.0.1092
+Problem: Terminal debugger can't evaluate expressions.
+Solution: Add :Evaluate and K. Various other improvements.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.0.1093
+Problem: Various small quickfix issues.
+Solution: Remove ":" prefix from title set by a user. Add the qf_id2nr().
+ function. Add a couple more tests. Update documentation.
+ (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, runtime/doc/quickfix.txt, src/evalfunc.c,
+ src/proto/quickfix.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1094
+Problem: Using ssh from Terminal.app runs into xterm incompatibility.
+Solution: Also detect Terminal.app on non-Mac systems.
+Files: src/term.c
+
+Patch 8.0.1095
+Problem: Terminal multibyte scrape test is flaky.
+Solution: Add another condition to wait for.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1096
+Problem: Terminal window in Normal mode has wrong background.
+Solution: Store the default background and use it for clearing until the
+ end of the line. Not for below the last line, since there is no
+ text there.
+Files: src/screen.c, src/terminal.c
+
+Patch 8.0.1097 (after 8.0.1096)
+Problem: Background color wrong if job changes background color.
+Solution: Get the background color from vterm.
+Files: src/terminal.c, src/screen.c
+
+Patch 8.0.1098
+Problem: Build failure if libvterm installed on the system. (Oleh
+ Hushchenkov)
+Solution: Change the CCCTERM argument order. (Ken Takata, closes #2080)
+Files: src/Makefile
+
+Patch 8.0.1099
+Problem: Warnings for GDK calls.
+Solution: Use other calls for GTK 3 and fix a few problems. (Kazunobu
+ Kuriyama)
+Files: src/mbyte.c
+
+Patch 8.0.1100
+Problem: Stuck in redraw loop when 'lazyredraw' is set.
+Solution: Don't loop on update_screen() when not redrawing. (Yasuhiro
+ Matsumoto, closes #2082)
+Files: src/terminal.c, src/screen.c, src/proto/screen.pro
+
+Patch 8.0.1101
+Problem: Channel write fails if writing to log fails.
+Solution: Ignore return value of fwrite(). (Ozaki Kiichi, closes #2081)
+Files: src/channel.c
+
+Patch 8.0.1102
+Problem: Terminal window does not use Normal colors.
+Solution: For the GUI and when 'termguicolors' is enabled, use the actual
+ foreground and background colors for the terminal. (Yasuhiro
+ Matsumoto, closes #2067)
+ Use the "Terminal" highlight group if defined.
+Files: src/terminal.c, src/syntax.c, src/proto/syntax.pro
+
+Patch 8.0.1103 (after 8.0.1102)
+Problem: Converting cterm color fails for grey ramp.
+Solution: Use index instead of number.
+Files: src/terminal.c
+
+Patch 8.0.1104
+Problem: The qf_jump() function is too long.
+Solution: Split of parts to separate functions. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.0.1105
+Problem: match() and matchend() are not tested.
+Solution: Add tests. (Ozaki Kiichi, closes #2088)
+Files: src/testdir/test_functions.vim, src/testdir/test_match.vim
+
+Patch 8.0.1106
+Problem: Terminal colors on an MS-Windows console are not matching the
+ normal colors.
+Solution: Use the normal colors for the terminal. (Yasuhiro Matsumoto,
+ closes #2087)
+Files: src/terminal.c
+
+Patch 8.0.1107
+Problem: Terminal debugger jumps to non-existing file.
+Solution: Check that the file exists. Add an option to make the Vim width
+ wide. Fix removing highlight groups.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.0.1108
+Problem: Cannot specify mappings for the terminal window.
+Solution: Add the :tmap command and associated code. (Jacob Askeland,
+ closes #2073)
+Files: runtime/doc/map.txt, runtime/doc/terminal.txt, src/ex_cmdidxs.h,
+ src/ex_cmds.h, src/ex_docmd.c, src/getchar.c, src/gui.c,
+ src/terminal.c, src/testdir/test_terminal.vim, src/vim.h,
+ src/proto/terminal.pro, src/main.c, src/evalfunc.c
+
+Patch 8.0.1109
+Problem: Timer causes error on exit from Ex mode. (xtal8)
+Solution: save and restore the ex_pressedreturn flag. (Christian Brabandt,
+ closes #2079)
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/ex_cmds2.c,
+ src/testdir/test_timers.vim
+
+Patch 8.0.1110
+Problem: FORTIFY_SOURCE from Perl causes problems. (Scott Baker)
+Solution: Filter out the flag. (Christian Brabandt, closes #2068)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1111
+Problem: Syntax error in configure when using Perl.
+Solution: Add missing quote
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1112
+Problem: Can't get size or current index from quickfix list.
+Solution: Add "idx" and "size" options. (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1113
+Problem: Can go to Insert mode from Terminal-Normal mode.
+Solution: Prevent :startinsert and "VA" to enter Insert mode. (Yasuhiro
+ Matsumoto, closes #2092)
+Files: src/normal.c
+
+Patch 8.0.1114
+Problem: Default for 'iminsert' is annoying.
+Solution: Make the default always zero. (Yasuhiro Matsumoto, closes #2071)
+Files: src/option.c, runtime/doc/options.txt
+
+Patch 8.0.1115
+Problem: Crash when using foldtextresult() recursively.
+Solution: Avoid recursive calls. (Yasuhiro Matsumoto, closes #2098)
+Files: src/evalfunc.c, src/testdir/test_fold.vim
+
+Patch 8.0.1116
+Problem: Terminal test fails on MS-Windows.
+Solution: Wait for the text to appear. (micbou, closes #2097)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1117
+Problem: Test_terminal_no_cmd hangs on MS-Windows with GUI. (Christian
+ Brabandt)
+Solution: Run the command with "start" and wait for the text to appear.
+ (micbou, closes #2096)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1118
+Problem: FEAT_WINDOWS adds a lot of #ifdefs while it is nearly always
+ enabled and only adds 7% to the binary size of the tiny build.
+Solution: Graduate FEAT_WINDOWS.
+Files: src/feature.h, src/window.c, src/vim.h, src/structs.h,
+ src/globals.h, src/gui.h, src/if_py_both.h, src/option.h,
+ src/term.h, src/buffer.c, src/charset.c, src/digraph.c,
+ src/edit.c, src/eval.c, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c, src/fileio.c,
+ src/fold.c, src/getchar.c, src/gui.c, src/gui_athena.c,
+ src/gui_beval.c, src/gui_gtk.c, src/gui_motif.c, src/gui_w32.c,
+ src/if_cscope.c, src/if_lua.c, src/if_mzsch.c, src/if_python.c,
+ src/if_python3.c, src/if_ruby.c, src/if_tcl.c, src/main.c,
+ src/mark.c, src/memline.c, src/misc1.c, src/misc2.c, src/move.c,
+ src/netbeans.c, src/normal.c, src/option.c, src/popupmnu.c,
+ src/quickfix.c, src/screen.c, src/search.c, src/spell.c,
+ src/syntax.c, src/tag.c, src/term.c, src/ui.c, src/version.c,
+ src/workshop.c, src/if_perl.xs, src/testdir/test_normal.vim
+
+Patch 8.0.1119
+Problem: Quitting a split terminal window kills the job. (Yasuhiro
+ Matsumoto)
+Solution: Only stop terminal job if it is the last window.
+Files: src/buffer.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1120 (after 8.0.1108)
+Problem: :tm means :tmap instead of :tmenu. (Taro Muraoka)
+Solution: Move the new entry below the old entry. (closes #2102)
+Files: src/ex_cmds.h, runtime/doc/map.txt
+
+Patch 8.0.1121
+Problem: Can uncheck executables in MS-Windows installer.
+Solution: Make the choice read-only. (Ken Takata, closes #2106)
+Files: nsis/gvim.nsi
+
+Patch 8.0.1122
+Problem: vimtutor.bat doesn't work well with vim.bat.
+Solution: Use "call vim". (Ken Takata, closes #2105)
+Files: vimtutor.bat
+
+Patch 8.0.1123
+Problem: Cannot define a toolbar for a window.
+Solution: Add a window-local toolbar.
+Files: src/syntax.c, src/proto/syntax.pro, src/structs.h, src/menu.c,
+ src/proto/menu.pro, src/testdir/test_winbar.vim, src/Makefile,
+ src/normal.c, src/testdir/Make_all.mak, src/if_perl.xs,
+ src/eval.c, src/evalfunc.c, src/window.c, src/ui.c,
+ src/terminal.c, src/screen.c,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ runtime/doc/gui.txt, runtime/doc/terminal.txt
+
+Patch 8.0.1124
+Problem: Use of MZSCHEME_VER is unclear.
+Solution: Add a comment. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.0.1125
+Problem: Wrong window height when splitting window with window toolbar.
+Solution: Add or subtract the window toolbar height.
+Files: src/window.c
+
+Patch 8.0.1126
+Problem: Endless resize when terminal showing in two buffers. (Hirohito
+ Higashi)
+Solution: Set a flag to prevent resizing the window.
+Files: src/terminal.c
+
+Patch 8.0.1127
+Problem: Test_peek_and_get_char fails on 32 bit system. (Elimar
+ Riesebieter)
+Solution: Avoid an integer overflow. (James McCoy, closes #2116)
+Files: src/ex_cmds2.c
+
+Patch 8.0.1128
+Problem: Old xterm sends CTRL-X in response to t_RS.
+Solution: Only send t_RS for xterm 279 and later. Remove the workaround to
+ ignore CTRL-X.
+Files: src/term.c
+
+Patch 8.0.1129
+Problem: Window toolbar missing a part of the patch.
+Solution: Add change in vim.h.
+Files: src/vim.h
+
+Patch 8.0.1130
+Problem: The qf_jump() function is still too long.
+Solution: Split of parts to separate functions. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.0.1131
+Problem: It is not easy to trigger an autocommand for new terminal window.
+ (Marco Restelli)
+Solution: Trigger BufWinEnter after setting 'buftype'.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1132
+Problem: #if condition is not portable.
+Solution: Add defined(). (Zuloloxi, closes #2136)
+Files: src/libvterm/src/vterm.c
+
+Patch 8.0.1133
+Problem: Syntax timeout not used correctly.
+Solution: Do not pass the timeout to syntax_start() but set it explicitly.
+ (Yasuhiro Matsumoto, closes #2139)
+Files: src/proto/syntax.pro, src/screen.c, src/syntax.c
+
+Patch 8.0.1134
+Problem: Superfluous call to syn_get_final_id().
+Solution: Remove it. (Ken Takata)
+Files: src/syntax.c
+
+Patch 8.0.1135
+Problem: W_WINCOL() is always the same.
+Solution: Expand the macro.
+Files: src/edit.c, src/ex_docmd.c, src/gui_gtk.c, src/gui_w32.c,
+ src/netbeans.c, src/popupmnu.c, src/screen.c, src/term.c,
+ src/terminal.c, src/ui.c, src/window.c, src/if_py_both.h,
+ src/structs.h, src/vim.h
+
+Patch 8.0.1136
+Problem: W_WIDTH() is always the same.
+Solution: Expand the macro.
+Files: src/charset.c, src/edit.c, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/getchar.c, src/gui.c, src/gui_beval.c,
+ src/gui_mac.c, src/if_lua.c, src/if_mzsch.c, src/if_py_both.h,
+ src/if_ruby.c, src/misc1.c, src/misc2.c, src/move.c, src/normal.c,
+ src/popupmnu.c, src/quickfix.c, src/screen.c, src/search.c,
+ src/structs.h, src/ui.c, src/vim.h, src/window.c
+
+Patch 8.0.1137 (after 8.0.1136)
+Problem: Cannot build with Ruby.
+Solution: Fix misplaced brace.
+Files: src/if_ruby.c
+
+Patch 8.0.1138
+Problem: Click in window toolbar starts Visual mode.
+Solution: Add the MOUSE_WINBAR flag.
+Files: src/ui.c, src/vim.h, src/normal.c
+
+Patch 8.0.1139
+Problem: Using window toolbar changes state.
+Solution: Always execute window toolbar actions in Normal mode.
+Files: runtime/doc/gui.txt, src/structs.h, src/ex_docmd.c,
+ src/proto/ex_docmd.pro, src/menu.c
+
+Patch 8.0.1140
+Problem: Still old style tests.
+Solution: Convert two tests to new style. (Yegappan Lakshmanan)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test56.in, src/testdir/test56.ok,
+ src/testdir/test57.in, src/testdir/test57.ok,
+ src/testdir/test_sort.vim, src/testdir/test_vimscript.vim
+
+Patch 8.0.1141
+Problem: MS-Windows build dependencies are incomplete.
+Solution: Fix the dependencies. (Ken Takata)
+Files: src/Make_cyg.mak, src/Make_cyg_ming.mak, src/Make_ming.mak,
+ src/Make_mvc.mak
+
+Patch 8.0.1142
+Problem: Window toolbar menu gets a tear-off item.
+Solution: Recognize the window toolbar.
+Files: src/menu.c
+
+Patch 8.0.1143
+Problem: Macros always expand to the same thing.
+Solution: Remove W_VSEP_WIDTH() and W_STATUS_HEIGHT().
+Files: src/vim.h, src/structs.h, src/gui.c, src/ex_getln.c, src/screen.c
+
+Patch 8.0.1144
+Problem: Using wrong #ifdef for computing length.
+Solution: use BACKSLASH_IN_FILENAME instead of COLON_IN_FILENAME. (Yasuhiro
+ Matsumoto, closes #2153)
+Files: src/quickfix.c
+
+Patch 8.0.1145
+Problem: Warning when compiling with Perl.
+Solution: Remove unused variable. (Ken Takata)
+Files: src/if_perl.xs
+
+Patch 8.0.1146
+Problem: Redraw when highlight is set with same names. (Ozaki Kiichi)
+Solution: Only free and save a name when it changed. (closes #2120)
+Files: src/syntax.c
+
+Patch 8.0.1147
+Problem: Fail to build with tiny features. (Tony Mechelynck)
+Solution: Move #ifdefs.
+Files: src/syntax.c
+
+Patch 8.0.1148
+Problem: "gN" doesn't work on last match with 'wrapscan' off. (fcpg)
+Solution: Adjust for searching backward. (Christian Brabandt)
+Files: src/search.c, src/testdir/test_gn.vim
+
+Patch 8.0.1149
+Problem: libvterm colors differ from xterm.
+Solution: Use the xterm colors for libvterm.
+Files: src/terminal.c, src/libvterm/src/pen.c,
+ src/testdir/xterm_ramp.vim, Filelist
+
+Patch 8.0.1150
+Problem: MS-Windows GUI: dialog font size is incorrect.
+Solution: Pass flag to indicate 'encoding' or active codepage. (Yasuhiro
+ Matsumoto, closes #2160)
+Files: src/gui_w32.c
+
+Patch 8.0.1151
+Problem: "vim -c startinsert!" doesn't append.
+Solution: Correct line number on startup. (Christian Brabandt, closes #2117)
+Files: src/ex_docmd.c, src/testdir/test_startup.vim
+
+Patch 8.0.1152
+Problem: Encoding of error message wrong in Cygwin terminal.
+Solution: Get locale from environment variables. (Ken Takata)
+Files: src/main.c, src/mbyte.c, src/proto/mbyte.pro
+
+Patch 8.0.1153
+Problem: No tests for diff_hlID() and diff_filler().
+Solution: Add tests. (Dominique Pelle, closes #2156)
+Files: src/testdir/test_diffmode.vim
+
+Patch 8.0.1154
+Problem: 'indentkeys' does not work properly. (Gary Johnson)
+Solution: Get the cursor line again. (Christian Brabandt, closes #2151)
+Files: src/edit.c, src/testdir/test_edit.vim
+
+Patch 8.0.1155
+Problem: Ruby command triggers a warning when RUBYOPT is set to "-w".
+Solution: use "-e_=0" instead of "-e0". (Masataka Pocke Kuwabara, closes
+ #2143)
+Files: src/if_ruby.c
+
+Patch 8.0.1156
+Problem: Removing one -W argument from Perl CFLAGS may cause trouble.
+Solution: Remove all -W flags. (Christian Brabandt)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1157
+Problem: Compiler warning on MS-Windows.
+Solution: Add type cast. (Yasuhiro Matsumoto)
+Files: src/main.c
+
+Patch 8.0.1158
+Problem: Still old style tests.
+Solution: Convert several tests to new style. (Yegappan Lakshmanan)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/main.aap, src/testdir/test33.in,
+ src/testdir/test33.ok, src/testdir/test41.in,
+ src/testdir/test41.ok, src/testdir/test43.in,
+ src/testdir/test43.ok, src/testdir/test53.in,
+ src/testdir/test53.ok, src/testdir/test_file_size.vim,
+ src/testdir/test_lispwords.vim, src/testdir/test_search.vim,
+ src/testdir/test_textobjects.vim
+
+Patch 8.0.1159
+Problem: Typo in #ifdef.
+Solution: Change "PROT" to "PROTO". (Nobuhiro Takasaki, closes #2165)
+Files: src/syntax.c
+
+Patch 8.0.1160
+Problem: Getting tab-local variable fails after closing window.
+Solution: set tp_firstwin and tp_lastwin. (Jason Franklin, closes #2170)
+Files: src/window.c, src/evalfunc.c, src/testdir/test_getvar.vim
+
+Patch 8.0.1161
+Problem: Popup menu drawing problem when resizing terminal.
+Solution: Redraw after resizing also when a popup menu is visible. (Ozaki
+ Kiichi, closes #2110)
+Files: src/popupmnu.c, src/term.c, src/testdir/shared.vim,
+ src/testdir/test_popup.vim
+
+Patch 8.0.1162
+Problem: Shared script for tests cannot be included twice.
+Solution: Include it where needed, it will "finish" if loaded again.
+Files: src/testdir/test_alot.vim, src/testdir/test_bufline.vim,
+ src/testdir/test_timers.vim
+
+Patch 8.0.1163
+Problem: Popup test is flaky.
+Solution: Add a WaitFor() and fix another.
+Files: src/testdir/test_popup.vim
+
+Patch 8.0.1164
+Problem: Changing StatusLine highlight while evaluating 'statusline' may
+ not change the status line color.
+Solution: When changing highlighting while redrawing don't cause another
+ redraw. (suggested by Ozaki Kiichi, closes #2171, closes #2120)
+Files: src/buffer.c, src/syntax.c
+
+Patch 8.0.1165
+Problem: Popup test is still flaky.
+Solution: Add a term_wait() call. (Ozaki Kiichi)
+Files: src/testdir/test_popup.vim
+
+Patch 8.0.1166
+Problem: :terminal doesn't work on Mac High Sierra.
+Solution: Change #ifdef for OpenPTY(). (Ozaki Kiichi, Kazunobu Kuriyama,
+ closes #2162)
+Files: src/pty.c
+
+Patch 8.0.1167
+Problem: Motif: typing in terminal window is slow.
+Solution: Do not redraw the whole terminal window but only what was changed.
+Files: src/terminal.c
+
+Patch 8.0.1168
+Problem: wrong highlighting with combination of match and 'cursorline'.
+Solution: Use "line_attr" when appropriate. (Ozaki Kiichi, closes #2111)
+ But don't highlight more than one character.
+Files: src/screen.c, src/testdir/test_highlight.vim,
+ src/testdir/view_util.vim
+
+Patch 8.0.1169
+Problem: Highlighting one char too many with 'list' and 'cul'.
+Solution: Check for 'list' being active. (Ozaki Kiichi, closes #2177)
+Files: src/screen.c, src/testdir/test_highlight.vim
+
+Patch 8.0.1170
+Problem: Using termdebug results in 100% CPU time. (tomleb)
+Solution: Use polling instead of select().
+Files: src/os_unix.c, src/channel.c, src/proto/channel.pro
+
+Patch 8.0.1171
+Problem: Popup test is still a bit flaky.
+Solution: Change term_wait() calls. (Ozaki Kiichi)
+Files: src/testdir/test_popup.vim
+
+Patch 8.0.1172
+Problem: When E734 is given option is still set.
+Solution: Assign NULL to "s". (Christian Brabandt)
+Files: src/eval.c, src/testdir/test_assign.vim
+
+Patch 8.0.1173
+Problem: Terminal window is not redrawn after CTRL-L. (Marcin Szamotulski)
+Solution: Redraw the whole terminal when w_redr_type is NOT_VALID.
+Files: src/terminal.c
+
+Patch 8.0.1174
+Problem: Mac Terminal.app has wrong color for white.
+Solution: Use white from the color cube.
+Files: src/globals.h, src/term.c, src/syntax.c
+
+Patch 8.0.1175 (after 8.0.1174)
+Problem: Build failure without +termresponse.
+Solution: Add #ifdef.
+Files: src/syntax.c
+
+Patch 8.0.1176
+Problem: Job_start() does not handle quote and backslash correctly.
+Solution: Remove quotes, recognize and remove backslashes.
+Files: src/testdir/test_channel.vim, src/os_unix.c
+
+Patch 8.0.1177
+Problem: In a terminal window the popup menu is not cleared. (Gerry
+ Agbobada)
+Solution: Redraw when SOME_VALID is used instead of NOT_VALID. (closes
+ #2194)
+Files: src/terminal.c
+
+Patch 8.0.1178
+Problem: Using old compiler on MS-Windows.
+Solution: Switch default build on MS-Windows to use MSVC 2015. (Ken Takata)
+Files: src/msvc2015.bat, src/INSTALLpc.txt, src/GvimExt/Makefile,
+ src/Make_mvc.mak, src/tee/Make_mvc.mak, src/xxd/Make_mvc.mak
+
+Patch 8.0.1179
+Problem: Test_popup_and_window_resize() does not always pass.
+Solution: Do not use $VIMPROG, pass the Vim executable in the vimcmd file.
+ (Ozaki Kiichi, closes #2186)
+Files: src/testdir/Makefile, src/testdir/shared.vim,
+ src/testdir/test_popup.vim
+
+Patch 8.0.1180
+Problem: MS-Windows testclean target deletes the color script.
+Solution: Rename the script file.
+Files: src/testdir/xterm_ramp.vim, src/testdir/color_ramp.vim
+
+Patch 8.0.1181
+Problem: Tests using Vim command fail on MS-Windows.
+Solution: Do not add quotes around the Vim command.
+Files: src/testdir/Make_dos.mak, src/testdir/Make_ming.mak
+
+Patch 8.0.1182
+Problem: Cannot see or change mzscheme dll name.
+Solution: Add 'mzschemedll' and 'mzschemegcdll'.
+Files: src/if_mzsch.c, src/option.h, src/option.c,
+ runtime/doc/if_mzsch.txt
+
+Patch 8.0.1183
+Problem: MS-Windows build instructions are outdated.
+Solution: Update instructions for MSVC 2015. Update the build script.
+Files: Filelist, Makefile, src/INSTALLpc.txt, src/bigvim.bat
+
+Patch 8.0.1184
+Problem: The :marks command is not tested.
+Solution: Add a test. (Dominique Pelle, closes #2197)
+Files: src/testdir/test_marks.vim
+
+Patch 8.0.1185
+Problem: Ruby library includes minor version number.
+Solution: Only use the API version number. (Ben Boeckel, closes #2199)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1186
+Problem: Still quite a few old style tests.
+Solution: Convert old to new style tests. (Yegappan Lakshmanan)
+ Avoid ringing the bell while running tests.
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_vms.mms, src/testdir/main.aap,
+ src/testdir/test31.in, src/testdir/test31.ok,
+ src/testdir/test4.in, src/testdir/test4.ok, src/testdir/test5.in,
+ src/testdir/test5.ok, src/testdir/test60.in,
+ src/testdir/test60.ok, src/testdir/test60.vim,
+ src/testdir/test7.in, src/testdir/test7.ok, src/testdir/test78.in,
+ src/testdir/test78.ok, src/testdir/test_autocmd.vim,
+ src/testdir/test_exists.vim, src/testdir/test_recover.vim,
+ src/testdir/test_winbuf_close.vim, src/testdir/runtest.vim
+
+Patch 8.0.1187
+Problem: Building with lua fails for OSX on Travis.
+Solution: Separate brew-update and brew-install. (Ozaki Kiichi, closes #2203)
+Files: .travis.yml
+
+Patch 8.0.1188
+Problem: Autocmd test fails on MS-Windows.
+Solution: Give the buffer a name and find the buffer to be wiped out by
+ name.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.0.1189
+Problem: E172 is not actually useful, it's only on Unix anyway.
+Solution: Remove the check and the error.
+Files: src/ex_docmd.c, runtime/doc/message.txt
+
+Patch 8.0.1190
+Problem: Vim becomes unusable after opening new window in BufWritePre
+ event.
+Solution: Call not_exiting(). (Martin Tournoij, closes #2205)
+ Also for "2q" when a help window is open. Add a test.
+Files: src/ex_docmd.c, src/testdir/test_writefile.vim
+
+Patch 8.0.1191
+Problem: MS-Windows: missing 32 and 64 bit files in installer.
+Solution: Include both 32 and 64 bit GvimExt and related dll files. Remove
+ old Windows code from the installer. (Ken Takata, closes #2144)
+Files: nsis/README.txt, nsis/gvim.nsi, src/GvimExt/gvimext.cpp,
+ src/dosinst.c, src/dosinst.h, src/uninstal.c, Makefile
+
+Patch 8.0.1192
+Problem: MS-Windows: terminal feature not enabled by default.
+Solution: Enable it. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.0.1193
+Problem: Crash when wiping out a buffer after using getbufinfo().
+ (Yegappan Lakshmanan)
+Solution: Remove b:changedtick from the buffer variables.
+Files: src/buffer.c, src/testdir/test_autocmd.vim
+
+Patch 8.0.1194
+Problem: Actual fg and bg colors of terminal are unknown.
+Solution: Add t_RF. Store response to t_RB and t_RF, use for terminal.
+Files: src/term.c, src/term.h, src/proto/term.pro, src/terminal.c,
+ src/vim.h, src/eval.c, runtime/doc/eval.txt
+
+Patch 8.0.1195 (after 8.0.1194)
+Problem: Can't build on MS-Windows.
+Solution: Adjust #ifdef and add #ifdefs.
+Files: src/term.c, src/terminal.c
+
+Patch 8.0.1196 (after 8.0.1194)
+Problem: Crash when t_RF is not set. (Brian Pina)
+Solution: Add t_RF to the list of terminal options. (Hirohito Higashi)
+Files: src/option.c
+
+Patch 8.0.1197
+Problem: MS-Windows build instructions are not up to date.
+Solution: Adjust the instructions. Fix the nsis script.
+Files: Makefile, nsis/gvim.nsi
+
+Patch 8.0.1198
+Problem: Older compilers don't know uint8_t.
+Solution: Use char_u instead.
+Files: src/term.c, src/proto/term.pro
+
+Patch 8.0.1199
+Problem: When 'clipboard' is "autoselectplus" the star register is also
+ set. (Gilles Moris)
+Solution: Don't set the star register in this situation.
+Files: src/ops.c
+
+Patch 8.0.1200
+Problem: Tests switch the bell off twice.
+Solution: Don't set 'belloff' in individual tests. (Christian Brabandt)
+Files: src/testdir/test_alot.vim, src/testdir/test_alot_utf8.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_diffmode.vim, src/testdir/test_digraph.vim,
+ src/testdir/test_edit.vim, src/testdir/test_file_size.vim,
+ src/testdir/test_gn.vim, src/testdir/test_normal.vim,
+ src/testdir/test_packadd.vim, src/testdir/test_popup.vim,
+ src/testdir/test_recover.vim, src/testdir/test_search.vim,
+ src/testdir/test_textobjects.vim, src/testdir/test_undo.vim,
+ src/testdir/test_usercommands.vim, src/testdir/test_visual.vim
+
+Patch 8.0.1201
+Problem: "yL" is affected by 'scrolloff'. (Eli the Bearded)
+Solution: Don't use 'scrolloff' when an operator is pending.
+Files: src/normal.c, runtime/doc/motion.txt
+
+Patch 8.0.1202
+Problem: :wall gives an error for a terminal window. (Marius Gedminas)
+Solution: Don't try writing a buffer that can't be written. (Yasuhiro
+ Matsumoto, closes #2190)
+Files: src/ex_cmds.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1203
+Problem: Terminal window mistreats composing characters.
+Solution: Count composing characters with the base character. (Ozaki Kiichi,
+ closes #2195)
+Files: src/mbyte.c, src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1204
+Problem: A QuitPre autocommand may get the wrong file name.
+Solution: Pass the buffer being closed to apply_autocmds(). (Rich Howe)
+Files: src/ex_docmd.c, src/testdir/test_autocmd.vim
+
+Patch 8.0.1205
+Problem: Using "1q" it is possible to unload a changed buffer. (Rick Howe)
+Solution: Check the right window for changes.
+Files: src/testdir/test_edit.vim, src/ex_docmd.c
+
+Patch 8.0.1206
+Problem: No autocmd for entering or leaving the command line.
+Solution: Add CmdlineEnter and CmdlineLeave.
+Files: runtime/doc/autocmd.txt, src/ex_getln.c, src/fileio.c, src/vim.h,
+ src/testdir/test_autocmd.vim
+
+Patch 8.0.1207
+Problem: Profiling skips the first and last script line.
+Solution: Check for BOM after setting script ID. (LemonBoy, closes #2103,
+ closes #2112) Add a test. List the trailing script lines.
+Files: src/testdir/test_profile.vim, src/ex_cmds2.c
+
+Patch 8.0.1208
+Problem: 'statusline' drops empty group with highlight change.
+Solution: Do not drop an empty group if it changes highlighting. (Marius
+ Gedminas, closes #2228)
+Files: src/buffer.c, src/testdir/test_statusline.vim
+
+Patch 8.0.1209
+Problem: Still too many old style tests.
+Solution: Convert a few more tests to new style. (Yegappan Lakshmanan,
+ closes #2230)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Makefile, src/testdir/Make_vms.mms,
+ src/testdir/main.aap, src/testdir/test34.in,
+ src/testdir/test34.ok, src/testdir/test54.in,
+ src/testdir/test54.ok, src/testdir/test8.in, src/testdir/test8.ok,
+ src/testdir/test_autocmd.vim, src/testdir/test_autoformat_join.in,
+ src/testdir/test_autoformat_join.ok, src/testdir/test_join.vim,
+ src/testdir/test_user_func.vim
+
+Patch 8.0.1210
+Problem: When typing a search pattern CTRL-G and CTRL-T are ignored when
+ there is typeahead.
+Solution: Don't pass SEARCH_PEEK and don't call char_avail(). (haya14busa,
+ closes #2233)
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.0.1211
+Problem: Cannot reorder tab pages with drag & drop.
+Solution: Support drag & drop for GTK and MS-Windows. (Ken Takata, Masamichi
+ Abe)
+Files: src/gui_gtk_x11.c, src/gui_w32.c
+
+Patch 8.0.1212
+Problem: MS-Windows: tear-off menu does not work on 64 bit. (shaggyaxe)
+Solution: Change how the menu handle is looked up. (Ken Takata, closes
+ #1205)
+Files: src/gui_w32.c
+
+Patch 8.0.1213
+Problem: Setting 'mzschemedll' has no effect.
+Solution: Move loading .vimrc to before call to mzscheme_main().
+Files: src/main.c
+
+Patch 8.0.1214
+Problem: Accessing freed memory when EXITFREE is set and there is more than
+ one tab and window. (Dominique Pelle)
+Solution: Free options later. Skip redraw when exiting.
+Files: src/screen.c, src/misc2.c
+
+Patch 8.0.1215
+Problem: Newer gcc warns for implicit fallthrough.
+Solution: Consistently use a FALLTHROUGH comment. (Christian Brabandt)
+Files: src/buffer.c, src/edit.c, src/eval.c, src/ex_docmd.c,
+ src/ex_getln.c, src/main.c, src/message.c, src/normal.c,
+ src/regexp.c, src/regexp_nfa.c, src/spell.c, src/window.c,
+ src/if_perl.xs
+
+Patch 8.0.1216
+Problem: Tabline is not always updated for :file command. (Norio Takagi)
+Solution: Set redraw_tabline. (Hirohito Higashi)
+Files: src/ex_cmds.c
+
+Patch 8.0.1217
+Problem: Can't use remote eval to inspect vars in debug mode.
+Solution: Don't discard the call stack in debug mode. (closes #2237, #2247)
+Files: src/globals.h, src/ex_cmds2.c, src/main.c
+
+Patch 8.0.1218
+Problem: Writing to freed memory in autocmd.
+Solution: Make a copy of the tag line. (Dominique Pelle, closes #2245)
+Files: src/tag.c, src/testdir/test_autocmd.vim
+
+Patch 8.0.1219
+Problem: Terminal test is flaky.
+Solution: Add test function to list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.1220
+Problem: Skipping empty statusline groups is not correct.
+Solution: Also set group_end_userhl. (itchyny)
+Files: src/buffer.c, src/testdir/test_statusline.vim
+
+Patch 8.0.1221
+Problem: Still too many old style tests.
+Solution: Convert a few more tests to new style. (Yegappan Lakshmanan,
+ closes #2256)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_vms.mms,
+ src/testdir/main.aap, src/testdir/test19.in,
+ src/testdir/test19.ok, src/testdir/test20.in,
+ src/testdir/test20.ok, src/testdir/test25.in,
+ src/testdir/test25.ok, src/testdir/test28.in,
+ src/testdir/test28.ok, src/testdir/test32.in,
+ src/testdir/test32.ok, src/testdir/test38.in,
+ src/testdir/test38.ok, src/testdir/test66.in,
+ src/testdir/test66.ok, src/testdir/test79.in,
+ src/testdir/test79.ok, src/testdir/test_ins_complete.vim,
+ src/testdir/test_source_utf8.vim, src/testdir/test_substitute.vim,
+ src/testdir/test_tab.vim, src/testdir/test_tagjump.vim,
+ src/testdir/test_undo.vim, src/testdir/test_visual.vim,
+ src/testdir/test79.ok, src/testdir/test79.in,
+ src/testdir/test28.in
+
+Patch 8.0.1222
+Problem: Test functions interfere with each other.
+Solution: Cleanup tab pages, windows and buffers. Reset option.
+Files: src/testdir/runtest.vim, src/testdir/test_filetype.vim,
+ src/testdir/test_tabpage.vim, src/testdir/test_lispwords.vim
+
+Patch 8.0.1223
+Problem: Crash when using autocomplete and tab pages.
+Solution: Check if the current tab changed. (Christian Brabandt, closes
+ #2239)
+Files: src/popupmnu.c, src/testdir/test_popup.vim, src/misc1.c,
+
+Patch 8.0.1224
+Problem: Still interference between test functions.
+Solution: Clear autocommands. Wipe all buffers. Fix tests that depend on a
+ specific start context.
+Files: src/testdir/runtest.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_arglist.vim, src/testdir/test_bufwintabinfo.vim,
+ src/testdir/test_command_count.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_hardcopy.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_packadd.vim, src/testdir/test_signs.vim,
+ src/testdir/test_autochdir.vim
+
+Patch 8.0.1225
+Problem: No check for spell region being zero. (geeknik)
+Solution: Check for zero. (closes #2252)
+Files: src/spellfile.c, src/testdir/test_spell.vim
+
+Patch 8.0.1226
+Problem: Edit and popup tests failing.
+Solution: Make the tests pass.
+Files: src/testdir/test_edit.vim, src/testdir/test_popup.vim
+
+Patch 8.0.1227
+Problem: Undefined left shift in readfile(). (Brian 'geeknik' Carpenter)
+Solution: Add cast to unsigned. (Dominique Pelle, closes #2253)
+Files: src/fileio.c
+
+Patch 8.0.1228
+Problem: Invalid memory access in GUI test.
+Solution: Check that the row is not outside of the screen.
+Files: src/screen.c
+
+Patch 8.0.1229
+Problem: Condition in vim_str2nr() is always true. (Nikolai Pavlov)
+Solution: Remove the condition. (Closes #2259)
+Files: src/charset.c
+
+Patch 8.0.1230
+Problem: CTRL-A in Visual mode uses character after selection. (Nikolai
+ Pavlov)
+Solution: Check the length before using a character.
+Files: src/charset.c
+
+Patch 8.0.1231
+Problem: Expanding file name drops dash. (stucki)
+Solution: Use the right position. (Christian Brabandt, closes #2184)
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.1232
+Problem: MS-Windows users are confused about default mappings.
+Solution: Don't map keys in the console where they don't work. Add a choice
+ in the installer to use MS-Windows key bindings or not. (Christian
+ Brabandt, Ken Takata, closes #2093)
+Files: Filelist, nsis/gvim.nsi, nsis/vimrc.ini, src/dosinst.c,
+ runtime/mswin.vim
+
+Patch 8.0.1233
+Problem: Typo in dos installer.
+Solution: Remove comma.
+Files: src/dosinst.c
+
+Patch 8.0.1234
+Problem: MS-Windows: composing characters are not shown properly.
+Solution: Pass base character and composing characters to the renderer at
+ once. (Ken Takata, closes #2206)
+Files: src/gui.c, src/gui_w32.c
+
+Patch 8.0.1235
+Problem: Cannot disable the terminal feature in a huge build. (lindhobe)
+Solution: Adjust the autoconf check. (Kazunobu Kuriyama, closes #2242)
+Files: src/configure.ac, src/auto/configure, src/Makefile
+
+Patch 8.0.1236
+Problem: Mac features are confusing.
+Solution: Make feature names more consistent, add "osxdarwin". Rename
+ feature flags, cleanup Mac code. (Kazunobu Kuriyama, closes #2178)
+ Also includes a fix for when Ruby throws an exception inside
+ :rubyfile. (ujihisa)
+Files: runtime/doc/eval.txt, runtime/doc/os_mac.txt, src/auto/configure,
+ src/config.h.in, src/configure.ac, src/digraph.c, src/edit.c,
+ src/evalfunc.c, src/feature.h, src/fileio.c, src/getchar.c,
+ src/globals.h, src/gui.c, src/gui_mac.c, src/if_python.c,
+ src/if_python3.c, src/if_ruby.c, src/keymap.h, src/macros.h,
+ src/main.c, src/mbyte.c, src/message.c, src/misc1.c, src/misc2.c,
+ src/option.c, src/os_mac.h, src/os_macosx.m, src/os_unix.c,
+ src/proto.h, src/pty.c, src/structs.h, src/term.c, src/termlib.c,
+ src/ui.c, src/undo.c, src/version.c, src/vim.h, src/window.c
+
+Patch 8.0.1237
+Problem: ":set scroll&" often gives an error.
+Solution: Don't use a fixed default value, use half the window height. Add a
+ test. (Ozaki Kiichi, closes #2104)
+Files: src/Makefile, src/option.c, src/testdir/test_alot.vim,
+ src/testdir/test_scroll_opt.vim
+
+Patch 8.0.1238
+Problem: Incremental search only shows one match.
+Solution: When 'incsearch' and 'hlsearch' are both set highlight all
+ matches. (haya14busa, itchyny, closes #2198)
+Files: runtime/doc/options.txt, src/ex_getln.c, src/proto/search.pro,
+ src/search.c, src/testdir/test_search.vim
+
+Patch 8.0.1239
+Problem: Cannot use a lambda for the skip argument to searchpair().
+Solution: Evaluate a partial, funcref and lambda. (LemonBoy, closes #1454,
+ closes #2265)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/proto/evalfunc.pro,
+ src/eval.c, src/proto/eval.pro, src/search.c,
+ src/testdir/test_search.vim
+
+Patch 8.0.1240
+Problem: MS-Windows: term_start() does not support environment.
+Solution: Implement the environment argument. (Yasuhiro Matsumoto, closes
+ #2264)
+Files: src/os_win32.c, src/proto/os_win32.pro, src/terminal.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.1241
+Problem: Popup test is flaky. (James McCoy)
+Solution: Increase the wait time. (Dominique Pelle)
+Files: src/testdir/test_popup.vim
+
+Patch 8.0.1242
+Problem: Function argument with only dash is seen as number zero. (Wang
+ Shidong)
+Solution: See a dash as a string. (Christian Brabandt)
+Files: src/testdir/test_ins_complete.vim, src/Makefile, src/eval.c
+
+Patch 8.0.1243
+Problem: No test for what 8.0.1227 fixes.
+Solution: Add a test that triggers the problem. (Christian Brabandt)
+Files: src/testdir/test_normal.vim, src/testdir/test_search.vim
+
+Patch 8.0.1244
+Problem: Search test does not work correctly on MS-Windows.
+Solution: Put text in a file instead of sending it to the terminal.
+ (Christian Brabandt)
+Files: src/testdir/test_search.vim
+
+Patch 8.0.1245
+Problem: When WaitFor() has a wrong expression it just waits a second,
+ which goes unnoticed. (James McCoy)
+Solution: When WaitFor() times out throw an exception. Fix places where the
+ expression was wrong.
+Files: src/testdir/shared.vim, src/testdir/test_channel.vim,
+ src/testdir/test_netbeans.vim, src/testdir/test_terminal.vim
+
+Patch 8.0.1246
+Problem: Popup test has an arbitrary delay.
+Solution: Wait for the ruler to show. (James McCoy)
+Files: src/testdir/test_popup.vim
+
+Patch 8.0.1247
+Problem: Not easy to find Debian build info.
+Solution: Add a badge in the README file. (Dominique Pelle)
+Files: README.md
+
+Patch 8.0.1248 (after 8.0.1247)
+Problem: Stray + in README file.
+Solution: Remove the +. Add a line break.
+Files: README.md
+
+Patch 8.0.1249
+Problem: No error when WaitFor() gets an invalid wrong expression.
+Solution: Do not ignore errors in evaluation of the expression. Fix places
+ where the expression was wrong.
+Files: src/testdir/shared.vim, src/testdir/test_netbeans.vim
+
+Patch 8.0.1250
+Problem: 'hlsearch' highlighting not removed after incsearch (lacygoill)
+Solution: Redraw all windows. Start search at the end of the match. Improve
+ how CTRL-G works with incremental search. Add tests. (Christian
+ Brabandt, Hirohito Higashi, haya14busa, closes #2267)
+Files: runtime/doc/options.txt, src/ex_getln.c,
+ src/testdir/test_search.vim
+
+Patch 8.0.1251 (after 8.0.1249)
+Problem: Invalid expression passed to WaitFor().
+Solution: Check if the variable exists.
+Files: src/testdir/test_clientserver.vim
+
+Patch 8.0.1252
+Problem: Incomplete translations makefile for MinGW/Cygwin.
+Solution: Add missing source files. Make it work with msys2's bash. (Ken
+ Takata)
+Files: src/po/Make_cyg.mak, src/po/Make_ming.mak, src/po/Make_mvc.mak
+
+Patch 8.0.1253
+Problem: Still too many old style tests.
+Solution: Convert a few more tests to new style. (Yegappan Lakshmanan,
+ closes #2272)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_vms.mms,
+ src/testdir/main.aap, src/testdir/test12.in,
+ src/testdir/test12.ok, src/testdir/test40.in,
+ src/testdir/test40.ok, src/testdir/test45.in,
+ src/testdir/test45.ok, src/testdir/test83.in,
+ src/testdir/test83.ok, src/testdir/test_autocmd.vim,
+ src/testdir/test_fold.vim, src/testdir/test_swap.vim,
+ src/testdir/test_tagjump.vim
+
+Patch 8.0.1254
+Problem: Undefined left shift in gethexchrs(). (geeknik)
+Solution: Use unsigned long. (idea by Christian Brabandt, closes #2255)
+Files: src/regexp.c, src/regexp_nfa.c
+
+
+Patch 8.0.1255 (after 8.0.1248)
+Problem: duplicate badge README file.
+Solution: Remove one. (Dominique Pelle)
+Files: README.md
+
+Patch 8.0.1256
+Problem: Typo in configure variable vim_cv_tgent. (Matthieu Guillard)
+Solution: Rename the variable. (closes #2281)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1257 (after 8.0.1254)
+Problem: No test for fix of undefined behavior.
+Solution: Add a test. (closes #2255)
+Files: src/testdir/test_search.vim
+
+Patch 8.0.1258
+Problem: 'ttymouse' is set to "sgr" even though it's not supported. (Gary
+ Johnson)
+Solution: Adjust #ifdef
+Files: src/term.c
+
+Patch 8.0.1259
+Problem: Search test can be flaky.
+Solution: Use WaitFor() instead of a delay. Make it possible to pass a
+ funcref to WaitFor() to avoid the need for global variables.
+ (James McCoy, closes #2282)
+Files: src/testdir/shared.vim, src/testdir/test_search.vim
+
+Patch 8.0.1260 (after 8.0.1259)
+Problem: Using global variables for WaitFor().
+Solution: Use a lambda function instead. Don't check a condition if
+ WaitFor() already checked it.
+Files: src/testdir/test_popup.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_channel.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_job_fails.vim, src/testdir/test_quotestar.vim
+
+Patch 8.0.1261
+Problem: Program in terminal window gets NL instead of CR. (Lifepillar)
+Solution: Check the tty setup more often. (closes #1998)
+Files: src/terminal.c
+
+Patch 8.0.1262
+Problem: Terminal redir test is flaky.
+Solution: Add it to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.1263
+Problem: Others can read the swap file if a user is careless with his
+ primary group.
+Solution: If the group permission allows for reading but the world
+ permissions doesn't, make sure the group is right.
+Files: src/fileio.c, src/testdir/test_swap.vim, src/Makefile
+
+Patch 8.0.1264
+Problem: Terminal debugger gets stuck in small window.
+Solution: Add "-quiet" to the gdb command. (Christian Brabandt, closes #2154)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.0.1265 (after 8.0.1263)
+Problem: Swap test not skipped when there is one group.
+Solution: Convert list to string for the message.
+Files: src/testdir/test_swap.vim
+
+Patch 8.0.1266 (after 8.0.1263)
+Problem: Test_swap_directory was accidentally commented out.
+Solution: Uncomment the test.
+Files: src/testdir/test_swap.vim
+
+Patch 8.0.1267 (after 8.0.1263)
+Problem: Test_swap_group may leave file behind.
+Solution: Add a try/finally.
+Files: src/testdir/test_swap.vim, src/testdir/test_undo.vim
+
+Patch 8.0.1268
+Problem: PC install instructions are incomplete.
+Solution: Update the instructions. (Ken Takata)
+Files: src/INSTALLpc.txt
+
+Patch 8.0.1269
+Problem: Effect of autocommands on marks is not tested.
+Solution: Add a couple of tests. (James McCoy, closes #2271)
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.0.1270
+Problem: Mismatching file name with Filelist.
+Solution: Rename color_ramp.vim to xterm_ramp.vim
+Files: src/testdir/color_ramp.vim, src/testdir/xterm_ramp.vim
+
+Patch 8.0.1271
+Problem: Still too many old style tests.
+Solution: Convert a few more tests to new style. (Yegappan Lakshmanan,
+ closes #2290)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/sautest/autoload/footest.vim, src/testdir/test55.in,
+ src/testdir/test55.ok, src/testdir/test_changelist.in,
+ src/testdir/test_changelist.ok, src/testdir/test_fold.vim,
+ src/testdir/test_ins_complete.vim,
+ src/testdir/test_insertcount.in, src/testdir/test_insertcount.ok,
+ src/testdir/test_listdict.vim, src/testdir/test_normal.vim,
+ src/testdir/test_search.vim, src/testdir/test_search_mbyte.in
+
+Patch 8.0.1272
+Problem: Warnings for unused variables in tiny build.
+Solution: Add #ifdef. (Dominique Pelle, closes #2288)
+Files: src/term.c
+
+Patch 8.0.1273 (after 8.0.1271)
+Problem: Old test file remaining.
+Solution: Delete it.
+Files: src/testdir/test_search_mbyte.ok
+
+Patch 8.0.1274
+Problem: setbufline() fails when using folding.
+Solution: Set "curwin" if needed. (Ozaki Kiichi, closes #2293)
+Files: src/evalfunc.c, src/testdir/test_bufline.vim
+
+Patch 8.0.1275
+Problem: CmdlineLeave autocmd prevents fold from opening. (Waivek)
+Solution: Save and restore KeyTyped. (closes #2305)
+Files: src/fileio.c
+
+Patch 8.0.1276
+Problem: Typed key is lost when the terminal window is closed in exit
+ callback. (Gabriel Barta)
+Solution: When the current window changes bail out of the wait loop. (closes
+ #2302)
+Files: src/misc2.c, src/terminal.c
+
+Patch 8.0.1277
+Problem: Terminal window CR-NL conversions may cause problems.
+Solution: Avoid most conversions, only fetch the current backspace key value
+ from the tty. (mostly by Ozaki Kiichi, closes #2278)
+Files: src/terminal.c
+
+Patch 8.0.1278
+Problem: GUI window always resizes when adding/removing a scrollbar,
+ toolbar, etc.
+Solution: Add the 'k' flag in 'guioptions' to keep the GUI window size and
+ change the number of lines/columns instead. (Ychin, closes #703)
+Files: runtime/doc/options.txt, src/gui.c, src/gui_gtk_x11.c,
+ src/gui_w32.c, src/option.h
+
+Patch 8.0.1279
+Problem: Initializing menus can be slow, especially when there are many
+ keymaps, color schemes, etc.
+Solution: Do the globbing for runtime files lazily. (Ken Takata)
+Files: runtime/doc/gui.txt, runtime/menu.vim
+
+Patch 8.0.1280
+Problem: Python None cannot be converted to a Vim type.
+Solution: Convert it to v:none. (Ken Takata)
+Files: src/if_py_both.h, src/testdir/test86.ok, src/testdir/test87.ok,
+ runtime/doc/if_pyth.txt
+
+Patch 8.0.1281
+Problem: Loading file type detection slows down startup.
+Solution: Move functions to an autoload script.
+Files: runtime/filetype.vim, runtime/autoload/filetype.vim,
+ runtime/scripts.vim
+
+Patch 8.0.1282 (after 8.0.1281)
+Problem: script-local variable defined in the wrong script
+Solution: Move variable to autoload/filetype.vim.
+Files: runtime/filetype.vim, runtime/autoload/filetype.vim
+
+Patch 8.0.1283
+Problem: Test 86 fails under ASAN.
+Solution: Fix that an item was added to a dictionary twice.
+Files: src/if_py_both.h
+
+Patch 8.0.1284
+Problem: Loading file type detection slows down startup.
+Solution: Store the last pattern of an autocommand event to make appending
+ quicker.
+Files: src/fileio.c
+
+Patch 8.0.1285
+Problem: Distributed autoload files may clash with user files. (Andy
+ Wokula)
+Solution: Use the "autoload/dist" directory.
+Files: runtime/filetype.vim, runtime/autoload/filetype.vim,
+ runtime/autoload/dist/ft.vim, runtime/scripts.vim, Filelist,
+ src/Makefile, nsis/gvim.nsi
+
+Patch 8.0.1286
+Problem: Occasional crash when using a channel. (Marek)
+Solution: Decrement reference count later. (closes #2315)
+Files: src/channel.c
+
+Patch 8.0.1287
+Problem: The temp file used when updating the viminfo file may have the
+ wrong permissions if setting the group fails.
+Solution: Check if the group matches and reduce permissions if not.
+Files: src/ex_cmds.c
+
+Patch 8.0.1288
+Problem: GUI: cannot drag the statusline of a terminal window.
+Solution: Handle the TERMINAL state. (Hirohito Higashi)
+Files: src/gui.c
+
+Patch 8.0.1289
+Problem: Mkview always includes the local directory.
+Solution: Add the "curdir" value in 'viewoptions'. (Eric Roberts, closes
+ #2316)
+Files: runtime/doc/options.txt, runtime/doc/starting.txt, src/ex_docmd.c,
+ src/option.c
+
+Patch 8.0.1290
+Problem: seq_cur of undotree() wrong after undo.
+Solution: Get the actual sequence number instead of decrementing the current
+ one. (Ozaki Kiichi, closes #2319)
+Files: src/undo.c, src/testdir/test_undo.vim
+
+Patch 8.0.1291
+Problem: C indent wrong when * immediately follows comment. (John Bowler)
+Solution: Do not see "/*" after "*" as a comment start. (closes #2321)
+Files: src/search.c, src/testdir/test3.in, src/testdir/test3.ok
+
+Patch 8.0.1292
+Problem: Quick clicks in the WinBar start Visual mode.
+Solution: Use a double click in the WinBar like a normal click.
+Files: src/ui.c
+
+Patch 8.0.1293
+Problem: Setting a breakpoint in the terminal debugger sometimes fails.
+Solution: Interrupt the program if needed. Set the interface to async.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.0.1294
+Problem: GUI: get stuck when splitting a terminal window.
+Solution: Stop blinking when values become zero. (Hirohito Higashi)
+Files: src/gui.c
+
+Patch 8.0.1295
+Problem: Cannot automatically get a server name in a terminal.
+Solution: Add the --enable-autoservername flag to configure. (Cimbali,
+ closes #2317)
+Files: runtime/doc/eval.txt, runtime/doc/various.txt, src/config.h.in,
+ src/configure.ac, src/auto/configure, src/evalfunc.c,
+ src/feature.h, src/main.c, src/version.c, src/Makefile
+
+Patch 8.0.1296 (after 8.0.1294)
+Problem: Checking the same condition twice. (John Marriott)
+Solution: Check blinkwait.
+Files: src/gui.c
+
+Patch 8.0.1297
+Problem: +autoservername does not show enabled on MS-Windows.
+Solution: Always define the flag on MS-Windows. (Ken Takata)
+Files: src/feature.h
+
+Patch 8.0.1298
+Problem: Missing test file.
+Solution: Add samples/test000. (Christian Brabandt)
+Files: src/testdir/samples/test000, Filelist
+
+Patch 8.0.1299
+Problem: Bracketed paste does not work well in terminal window.
+Solution: Send translated string to job right away. (Ozaki Kiichi, closes
+ #2341)
+Files: src/terminal.c
+
+Patch 8.0.1300
+Problem: File permissions may end up wrong when writing.
+Solution: Use fchmod() instead of chmod() when possible. Don't truncate
+ until we know we can change the file.
+Files: src/os_unix.c, src/proto/os_unix.pro, src/configure.ac,
+ src/auto/configure, src/config.h.in, src/fileio.c
+
+Patch 8.0.1301
+Problem: Generated license file for NSIS has a modeline.
+Solution: Adjust the pattern for sed. (Ken Takata)
+Files: runtime/doc/Makefile
+
+Patch 8.0.1302
+Problem: Still too many old style tests.
+Solution: Convert a few more tests to new style. (Yegappan Lakshmanan,
+ closes #2326)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_vms.mms, src/testdir/runtest.vim,
+ src/testdir/test68.in, src/testdir/test68.ok,
+ src/testdir/test73.in, src/testdir/test73.ok,
+ src/testdir/test_close_count.in, src/testdir/test_close_count.ok,
+ src/testdir/test_close_count.vim,
+ src/testdir/test_erasebackword.in,
+ src/testdir/test_erasebackword.ok,
+ src/testdir/test_erasebackword.vim,
+ src/testdir/test_find_complete.vim, src/testdir/test_fixeol.in,
+ src/testdir/test_fixeol.ok, src/testdir/test_fixeol.vim,
+ src/testdir/test_listchars.in, src/testdir/test_listchars.ok,
+ src/testdir/test_listchars.vim, src/testdir/test_textformat.vim
+
+Patch 8.0.1303
+Problem: 'ttymouse' is not set to "sgr" for Terminal.app and Iterm2.
+Solution: Recognize Iterm2 by the termresponse.
+Files: src/term.c
+
+Patch 8.0.1304
+Problem: CTRL-G/CTRL-T don't work with incsearch and empty pattern.
+Solution: Use the last search pattern. (Christian Brabandt, closes #2292)
+Files: src/ex_getln.c, src/proto/search.pro, src/search.c,
+ src/testdir/test_search.vim
+
+Patch 8.0.1305
+Problem: writefile() never calls fsync().
+Solution: Follow the 'fsync' option with override to enable or disable.
+Files: src/fileio.c, src/evalfunc.c, runtime/doc/eval.txt, src/globals.h,
+ src/testdir/test_writefile.vim
+
+Patch 8.0.1306
+Problem: ASAN error stack trace is not useful.
+Solution: Add "asan_symbolize". (James McCoy, closes #2344)
+Files: .travis.yml
+
+Patch 8.0.1307 (after 8.0.1300)
+Problem: Compiler warning for ignoring return value of ftruncate(). (Tony
+ Mechelynck)
+Solution: Assign returned value to "ignore".
+Files: src/fileio.c
+
+Patch 8.0.1308
+Problem: The "Reading from stdin" message may be undesired and there is no
+ easy way to skip it.
+Solution: Don't show the message with --not-a-term was used.
+Files: src/fileio.c
+
+Patch 8.0.1309
+Problem: Cannot use 'balloonexpr' in a terminal.
+Solution: Add 'balloonevalterm' and add code to handle mouse movements in a
+ terminal. Initial implementation for Unix with GUI.
+Files: src/option.c, src/option.h, src/os_unix.c, src/proto/os_unix.pro,
+ src/feature.h, src/misc2.c, src/keymap.h, src/edit.c,
+ src/ex_getln.c, src/message.c, src/misc1.c, src/normal.c,
+ src/terminal.c, src/getchar.c, src/ex_cmds2.c, src/gui_beval.c,
+ src/proto/gui_beval.pro, src/evalfunc.c, src/popupmnu.c,
+ src/proto/popupmnu.pro, src/version.c, src/globals.h, src/gui.c,
+ runtime/doc/options.txt, src/term.c,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.0.1310
+Problem: Cproto generates errors because of missing type.
+Solution: Define _Float128 when generating prototypes.
+Files: src/vim.h
+
+Patch 8.0.1311
+Problem: No test for strpart().
+Solution: Add a test. (Dominique Pelle, closes #2347)
+Files: src/testdir/test_functions.vim
+
+Patch 8.0.1312 (after 8.0.1309)
+Problem: balloon_show() only works in terminal when compiled with the GUI.
+Solution: Add FEAT_BEVAL_GUI and refactor to move common code out of the GUI
+ specific file.
+Files: src/feature.h, src/evalfunc.c, src/gui.c, src/gui_athena.c,
+ src/gui_beval.c, src/proto/gui_beval.pro, src/beval.c,
+ src/proto/beval.pro, src/gui_motif.c, src/gui_w32.c,
+ src/gui_x11.c, src/integration.c, src/workshop.c, src/menu.c,
+ src/netbeans.c, src/option.c, src/os_unix.c, src/os_win32.c,
+ src/syntax.c, src/version.c, src/gui.h, src/gui_beval.h,
+ src/vim.h, src/beval.h, src/option.h, src/ex_cmds2.c, src/ui.c,
+ src/getchar.c, src/normal.c, src/popupmnu.c, src/globals.h,
+ src/Makefile, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/Make_vms.mms, Filelist
+
+Patch 8.0.1313 (after 8.0.1312)
+Problem: Missing dependencies cause parallel make to fail.
+Solution: Update dependencies.
+Files: src/Makefile
+
+Patch 8.0.1314 (after 8.0.1312)
+Problem: Build fails on Mac. (chdiza)
+Solution: Add #ifdef around GUI fields.
+Files: src/beval.h
+
+Patch 8.0.1315 (after 8.0.1312)
+Problem: Build still fails on Mac. (chdiza)
+Solution: Remove bogus typedef.
+Files: src/os_macosx.m
+
+Patch 8.0.1316 (after 8.0.1312)
+Problem: Build still still fails on Mac. (chdiza)
+Solution: Remove another bogus typedef.
+Files: src/os_mac_conv.c
+
+Patch 8.0.1317
+Problem: Accessing freed memory in term_wait(). (Dominique Pelle)
+Solution: Check that the buffer still exists.
+Files: src/terminal.c
+
+Patch 8.0.1318
+Problem: Terminal balloon only shows one line.
+Solution: Split into several lines in a clever way. Add balloon_split().
+ Make balloon_show() accept a list in the terminal.
+Files: src/popupmnu.c, src/proto/popupmnu.pro, src/evalfunc.c,
+ src/beval.c, src/proto/beval.pro, src/testdir/test_popup.vim,
+ runtime/doc/eval.txt,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.0.1319
+Problem: Can't build GUI on MS-Windows.
+Solution: Don't define the balloon_split() function in a GUI-only build.
+Files: src/evalfunc.c, runtime/doc/eval.txt
+
+Patch 8.0.1320
+Problem: Popup test fails on GUI-only build.
+Solution: Don't test balloon_split() when it's not available.
+Files: src/testdir/test_popup.vim
+
+Patch 8.0.1321
+Problem: Can't build huge version with Athena. (Mark Kelly)
+Solution: Move including beval.h to before structs.h. Include beval.pro like
+ other proto files.
+Files: src/vim.h, src/beval.h, src/proto.h
+
+Patch 8.0.1322
+Problem: Textformat test isn't run. (Yegappan Lakshmanan)
+Solution: Add target to the list of tests.
+Files: src/testdir/Make_all.mak
+
+Patch 8.0.1323
+Problem: Mouse events in a terminal window may cause endless loop.
+Solution: Adjust position computation. Don't stuff a mouse event when
+ coming from normal_cmd().
+Files: src/normal.c, src/terminal.c
+
+Patch 8.0.1324
+Problem: Some xterm sends different mouse move codes.
+Solution: Also accept 0x80 as a move event.
+Files: src/term.c
+
+Patch 8.0.1325
+Problem: More tests are not run.
+Solution: Add targets to the list of tests. (Yegappan Lakshmanan)
+Files: src/testdir/Make_all.mak
+
+Patch 8.0.1326
+Problem: Largefile test fails on CI, glob test on MS-Windows.
+Solution: Remove largefile test from list of all tests. Don't run
+ Test_glob() on non-unix systems. More cleanup. (Yegappan
+ Lakshmanan, closes #2354)
+Files: src/testdir/Make_all.mak, src/testdir/test_escaped_glob.vim,
+ src/testdir/test_plus_arg_edit.vim
+
+Patch 8.0.1327
+Problem: New proto file missing from distribution.
+Solution: Add it. (closes #2355)
+Files: Filelist
+
+Patch 8.0.1328
+Problem: Trouble when using ":term ++close" with autocmd. (Gabriel Barta)
+Solution: Use aucmd_prepbuf() and aucmd_restbuf() instead of setting curbuf.
+ (closes #2339)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1329
+Problem: When a flaky test fails it also often fails the second time.
+Solution: Sleep a couple of seconds before the second try.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.1330
+Problem: MS-Windows: job in terminal can't get back to Vim.
+Solution: set VIM_SERVERNAME in the environment. (Yasuhiro Matsumoto, closes
+ #2360)
+Files: runtime/doc/terminal.txt, src/os_win32.c, src/proto/os_win32.pro,
+ src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1331
+Problem: Possible crash when window can be zero lines high. (Joseph
+ Dornisch)
+Solution: Only set w_fraction if the window is at least two lines high.
+Files: src/window.c
+
+Patch 8.0.1332
+Problem: Highlighting in quickfix window could be better. (Axel Bender)
+Solution: Use the qfSeparator highlight item. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.0.1333
+Problem: Some tests are run twice.
+Solution: Invoked most utf8 tests only from test_alot_utf8. (Yegappan
+ Lakshmanan, closes #2369)
+Files: src/testdir/Make_all.mak, src/testdir/test_alot_utf8.vim,
+ src/testdir/test_mksession_utf8.vim
+
+Patch 8.0.1334
+Problem: Splitting a window with a WinBar damages window layout.
+ (Lifepillar)
+Solution: Take the winbar into account when computing the new window
+ position. Add WINBAR_HEIGHT().
+Files: src/vim.h, src/window.c
+
+Patch 8.0.1335
+Problem: writefile() using fsync() may give an error for a device.
+ (Yasuhiro Matsumoto)
+Solution: Ignore fsync() failing. (closes #2373)
+Files: src/evalfunc.c
+
+Patch 8.0.1336
+Problem: Cannot use imactivatefunc() unless compiled with +xim.
+Solution: Allow using imactivatefunc() when not compiled with +xim.
+ (Yasuhiro Matsumoto, closes #2349)
+Files: runtime/doc/options.txt, runtime/doc/mbyte.txt, src/mbyte.c,
+ src/option.c, src/option.h, src/structs.h,
+ src/testdir/test_iminsert.vim, src/Makefile,
+ src/testdir/Make_all.mak, src/vim.h
+
+Patch 8.0.1337 (after 8.0.1336)
+Problem: Typo in #ifdef.
+Solution: Fix the #if line.
+Files: src/mbyte.c
+
+Patch 8.0.1338 (after 8.0.1337)
+Problem: USE_IM_CONTROL is confusing and incomplete.
+Solution: Just use FEAT_MBYTE. Call 'imactivatefunc' also without GUI.
+Files: src/vim.h, src/edit.c, src/ex_getln.c, src/getchar.c, src/gui.c,
+ src/gui_mac.c, src/gui_w32.c, src/mbyte.c, src/normal.c,
+ src/option.c, src/ui.c, src/globals.h, src/option.h
+
+Patch 8.0.1339
+Problem: No test for what 8.0.1335 fixes.
+Solution: Add a test. (Yasuhiro Matsumoto, closes #2373)
+Files: src/testdir/test_writefile.vim
+
+Patch 8.0.1340
+Problem: MS-Windows: cannot build GUI without IME.
+Solution: Define im_get_status() and im_set_active() when IME is not used.
+Files: src/mbyte.c
+
+Patch 8.0.1341
+Problem: 'imactivatefunc' test fails on MS-Windows.
+Solution: Skip the text.
+Files: src/testdir/test_iminsert.vim, runtime/doc/options.txt
+
+Patch 8.0.1342
+Problem: Cannot build with Motif and multibyte. (Mohamed Boughaba)
+Solution: Use the right input method status flag. (closes #2374)
+Files: src/mbyte.c
+
+Patch 8.0.1343
+Problem: MS-Windows: does not show colored emojis.
+Solution: Implement colored emojis. Improve drawing speed. Make 'taamode'
+ work. (Taro Muraoka, Yasuhiro Matsumoto, Ken Takata, close #2375)
+Files: appveyor.yml, runtime/doc/options.txt, src/gui_dwrite.cpp,
+ src/gui_dwrite.h, src/gui_w32.c, src/proto/gui_w32.pro
+
+Patch 8.0.1344
+Problem: Using 'imactivatefunc' in the GUI does not work.
+Solution: Do not use 'imactivatefunc' and 'imstatusfunc' in the GUI.
+Files: runtime/doc/options.txt, src/mbyte.c,
+ src/testdir/test_iminsert.vim
+
+Patch 8.0.1345
+Problem: Race condition between stat() and open() for the viminfo temp
+ file. (Simon Ruderich)
+Solution: use open() with O_EXCL to atomically check if the file exists.
+ Don't try using a temp file, renaming it will fail anyway.
+Files: src/ex_cmds.c
+
+Patch 8.0.1346
+Problem: Crash when passing 50 char string to balloon_split().
+Solution: Fix off-by-one error.
+Files: src/testdir/test_popup.vim, src/popupmnu.c
+
+Patch 8.0.1347
+Problem: MS-Windows: build broken by misplaced curly.
+Solution: Move curly after #endif.
+Files: src/ex_cmds.c
+
+Patch 8.0.1348
+Problem: Make testclean deletes script file on MS-Windows.
+Solution: Rename file to avoid it starting with an "x".
+Files: src/testdir/xterm_ramp.vim, src/testdir/color_ramp.vim, Filelist
+
+Patch 8.0.1349
+Problem: Options test fails when using Motif or GTK GUI.
+Solution: Use "fixed" instead of "fixedsys" for Unix. Don't try "xxx" for
+ guifonteset. Don't set 'termencoding' to anything but "utf-8" for
+ GTK. Give an error if 'termencoding' can't be converted.
+Files: src/testdir/gen_opt_test.vim, src/option.c
+
+Patch 8.0.1350
+Problem: Cannot build with +eval and -multi_byte.
+Solution: Adjust #ifdefs. (John Marriott) Always include the multi_byte
+ feature when an input method feature is enabled.
+Files: src/mbyte.c, src/feature.h
+
+Patch 8.0.1351
+Problem: Warning for unused variables building with MinGW.
+Solution: Change a few #ifdefs (suggested by John Marriott). Remove
+ superfluous checks of FEAT_MBYTE.
+Files: src/gui_w32.c
+
+Patch 8.0.1352
+Problem: Dead URLs in the help go unnoticed.
+Solution: Add a script to check URLs in the help files. (Christian Brabandt)
+Files: runtime/doc/Makefile, runtime/doc/test_urls.vim, Filelist
+
+Patch 8.0.1353
+Problem: QuickFixCmdPost is not used consistently.
+Solution: Invoke QuickFixCmdPost consistently after QuickFixCmdPre.
+ (Yegappan Lakshmanan, closes #2377)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1354
+Problem: Shift-Insert doesn't always work in MS-Windows console.
+Solution: Handle K_NUL differently. (Yasuhiro Matsumoto, closes #2381)
+Files: src/os_win32.c
+
+Patch 8.0.1355 (after 8.0.1354)
+Problem: Cursor keys don't work in MS-Windows console.
+Solution: Revert the previous patch. Also delete dead code.
+Files: src/os_win32.c
+
+Patch 8.0.1356
+Problem: Using simalt in a GUIEnter autocommand inserts strange characters.
+ (Chih-Long Chang)
+Solution: Ignore K_NOP in Insert mode. (closes #2379)
+Files: src/edit.c, src/ex_getln.c
+
+Patch 8.0.1357
+Problem: Startup test fails on OpenBSD. (Edd Barrett)
+Solution: Check for "BSD" instead of "FreeBSD" being defined. (James McCoy,
+ closes #2376, closes #2378)
+Files: src/vim.h
+
+Patch 8.0.1358
+Problem: Undercurl is not used in the terminal. (Kovid Goyal)
+Solution: Only fall back to underline when undercurl highlighting is not
+ defined. (closes #1306)
+Files: src/screen.c
+
+Patch 8.0.1359
+Problem: Libvterm ANSI colors can not always be recognized from the RGB
+ values. The default color is wrong when t_RB is empty.
+Solution: Add the ANSI color index to VTermColor.
+Files: src/libvterm/include/vterm.h, src/libvterm/src/pen.c,
+ src/terminal.c
+
+Patch 8.0.1360
+Problem: The Terminal highlighting doesn't work in a terminal. (Ozaki
+ Kiichi)
+Solution: Use the Terminal highlighting when the cterm index is zero.
+Files: src/terminal.c
+
+Patch 8.0.1361
+Problem: Some users don't want to diff with hidden buffers.
+Solution: Add the "hiddenoff" item to 'diffopt'. (Alisue, closes #2394)
+Files: runtime/doc/options.txt, src/buffer.c, src/diff.c,
+ src/proto/diff.pro, src/testdir/test_diffmode.vim
+
+Patch 8.0.1362
+Problem: Terminal window colors wrong when using Terminal highlighting.
+Solution: Set ansi_index when setting the default color. Also cache the
+ color index for Terminal. (Ozaki Kiichi, closes #2393)
+Files: src/libvterm/src/pen.c, src/proto/terminal.pro, src/syntax.c,
+ src/terminal.c
+
+Patch 8.0.1363
+Problem: Recovering does not work when swap file ends in .stz.
+Solution: Check for all possible swap file names. (Elfling, closes #2395,
+ closes #2396)
+Files: src/memline.c
+
+Patch 8.0.1364
+Problem: There is no easy way to get the window position.
+Solution: Add win_screenpos().
+Files: src/evalfunc.c, src/testdir/test_window_cmd.vim,
+ runtime/doc/eval.txt
+
+Patch 8.0.1365
+Problem: When one channel test fails others fail as well.
+Solution: Stop the job after a failure. Also add a couple of tests to the
+ list of flaky tests.
+Files: src/testdir/test_channel.vim, src/testdir/runtest.vim
+
+Patch 8.0.1366
+Problem: Balloon shows when cursor is in WinBar.
+Solution: Don't show the balloon when row is negative.
+Files: src/beval.c
+
+Patch 8.0.1367
+Problem: terminal test hangs, executing abcde. (Stucki)
+Solution: Rename abcde to abxde.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1368
+Problem: Cannot drag status line or vertical separator of new terminal
+ window. (UncleBill)
+Solution: Adjust mouse row and column computation. (Yasuhiro Matsumoto,
+ closes #2410)
+Files: src/terminal.c
+
+Patch 8.0.1369
+Problem: MS-Windows: drawing underline, curl and strikethrough is slow,
+ mFallbackDC not properly updated.
+Solution: Several performance improvements. (Ken Takata, Taro Muraoka,
+ Yasuhiro Matsumoto, closes #2401)
+Files: runtime/doc/options.txt, src/gui_dwrite.cpp, src/gui_dwrite.h,
+ src/gui_w32.c
+
+Patch 8.0.1370
+Problem: Channel test for callback is flaky.
+Solution: Add the test to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.1371
+Problem: Shift-Insert doesn't always work in MS-Windows console.
+Solution: Handle K_NUL differently if the second character is more than one
+ byte. (Yasuhiro Matsumoto, closes #2381)
+Files: src/os_win32.c
+
+Patch 8.0.1372
+Problem: Profile log may be truncated halfway a character.
+Solution: Find the start of the character. (Ozaki Kiichi, closes #2385)
+Files: src/ex_cmds2.c, src/testdir/test_profile.vim
+
+Patch 8.0.1373
+Problem: No error when setting 'renderoptions' to an invalid value before
+ starting the GUI.
+Solution: Always check the value. (Ken Takata, closes #2413)
+Files: src/gui_w32.c, src/option.c
+
+Patch 8.0.1374
+Problem: CTRL-A does not work with an empty line. (Alex)
+Solution: Decrement the end only once. (Hirohito Higashi, closes #2387)
+Files: src/ops.c, src/testdir/test_increment.vim
+
+Patch 8.0.1375
+Problem: Window size wrong after maximizing with WinBar. (Lifepillar)
+Solution: Fix height computations. Redraw window when it is zero height but
+ has a WinBar. (closes #2356)
+Files: src/window.c, src/screen.c, src/vim.h
+
+Patch 8.0.1376
+Problem: Cursor in terminal not always updated.
+Solution: Call gui_mch_flush(). (Ken Takata)
+Files: src/terminal.c
+
+Patch 8.0.1377
+Problem: Cannot call a dict function in autoloaded dict.
+Solution: Call get_lval() passing the read-only flag.
+Files: src/userfunc.c, src/eval.c, src/testdir/sautest/autoload/foo.vim,
+ src/testdir/sautest/autoload/globone.vim,
+ src/testdir/sautest/autoload/globtwo.vim,
+ src/testdir/test_escaped_glob.vim, src/Makefile,
+ src/testdir/test_autoload.vim, src/Makefile,
+ src/testdir/Make_all.mak
+
+Patch 8.0.1378
+Problem: Autoload script sources itself when defining function.
+Solution: Pass TFN_NO_AUTOLOAD to trans_function_name(). (Yasuhiro
+ Matsumoto, closes #2423)
+Files: src/userfunc.c, src/testdir/test_autoload.vim,
+ src/testdir/sautest/autoload/sourced.vim
+
+Patch 8.0.1379
+Problem: Configure check for selinux does not check for header file.
+Solution: Add an AC_CHECK_HEADER(). (Benny Siegert)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1380
+Problem: When recovering a file with "vim -r swapfile" the hit-enter prompt
+ is at the top of the window.
+Solution: Invalidate the cursor position.
+Files: src/term.c
+
+Patch 8.0.1381
+Problem: ch_readraw() waits for NL if channel mode is NL.
+Solution: Pass a "raw" flag to channel_read_block(). (Yasuhiro Matsumoto)
+Files: src/channel.c, src/proto/channel.pro,
+ src/testdir/test_channel.vim, src/testdir/test_channel_pipe.py
+
+Patch 8.0.1382
+Problem: Get "no write since last change" message if a terminal is open.
+ (Fritz mehner)
+Solution: Don't consider a buffer changed if it's a terminal window.
+Files: src/ex_cmds.c, src/undo.c, src/proto/undo.pro
+
+Patch 8.0.1383
+Problem: Local additions in help skips some files. (joshklod)
+Solution: Check the base file name length equals.
+Files: src/ex_cmds.c, src/testdir/test_help.vim
+
+Patch 8.0.1384
+Problem: Not enough quickfix help; confusing winid.
+Solution: Add more examples in the help. When the quickfix window is not
+ present, return zero for getqflist() with 'winid'. Add more tests
+ for jumping to quickfix list entries. (Yegappan Lakshmanan, closes
+ #2427)
+Files: runtime/doc/eval.txt, runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1385
+Problem: Python 3.5 is getting old.
+Solution: Make Python 3.6 the default. (Ken Takata, closes #2429)
+Files: runtime/doc/if_pyth.txt, src/INSTALLpc.txt, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak, src/bigvim.bat
+
+Patch 8.0.1386
+Problem: Cannot select modified buffers with getbufinfo().
+Solution: Add the "bufmodified" flag. (Yegappan Lakshmanan, closes #2431)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_bufwintabinfo.vim
+
+Patch 8.0.1387
+Problem: Wordcount test is old style.
+Solution: Change into a new style test. (Yegappan Lakshmanan, closes #2434)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_vms.mms, src/testdir/test_wordcount.in,
+ src/testdir/test_wordcount.ok, src/testdir/test_wordcount.vim
+
+Patch 8.0.1388
+Problem: Char not overwritten with ambiguous width char, if the ambiguous
+ char is single width but we reserve double-width space.
+Solution: First clear the screen cells. (Ozaki Kiichi, closes #2436)
+Files: src/screen.c
+
+Patch 8.0.1389
+Problem: getqflist() items are missing if not set, that makes it more
+ difficult to handle the values.
+Solution: When a value is not available return zero or another invalid
+ value. (Yegappan Lakshmanan, closes #2430)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1390
+Problem: DirectX scrolling can be slow, vertical positioning is off.
+Solution: Make scroll slightly faster when using "scrlines:1". Fix y
+ position of displayed text. Fix DirectX with non-utf8 encoding.
+ (Ken Takata, closes #2440)
+Files: src/INSTALLpc.txt, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/gui_dwrite.cpp, src/gui_w32.c
+
+Patch 8.0.1391
+Problem: Encoding empty string to JSON sometimes gives "null".
+Solution: Handle NULL string as empty string. (closes #2446)
+Files: src/testdir/test_json.vim, src/json.c
+
+Patch 8.0.1392
+Problem: Build fails with --with-features=huge --disable-channel.
+Solution: Don't enable the terminal feature when the channel feature is
+ missing. (Dominique Pelle, closes #2453)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1393
+Problem: Too much highlighting with 'hlsearch' and 'incsearch' set.
+Solution: Do not highlight matches when the pattern matches everything.
+Files: src/ex_getln.c
+
+Patch 8.0.1394
+Problem: Cannot intercept a yank command.
+Solution: Add the TextYankPost autocommand event. (Philippe Vaucher et al.,
+ closes #2333)
+Files: runtime/doc/autocmd.txt, runtime/doc/eval.txt, src/dict.c,
+ src/eval.c, src/fileio.c, src/ops.c, src/proto/dict.pro,
+ src/proto/eval.pro, src/proto/fileio.pro,
+ src/testdir/test_autocmd.vim, src/vim.h
+
+Patch 8.0.1395
+Problem: It is not easy to see if a colorscheme is well written.
+Solution: Add a script that checks for common mistakes. (Christian Brabandt)
+Files: runtime/colors/check_colors.vim, runtime/colors/README.txt
+
+Patch 8.0.1396
+Problem: Memory leak when CTRL-G in search command line fails.
+Solution: Move restore_last_search_pattern to after "if".
+Files: src/ex_getln.c
+
+Patch 8.0.1397
+Problem: Pattern with \& following nothing gives an error.
+Solution: Emit an empty node when needed.
+Files: src/regexp_nfa.c, src/testdir/test_search.vim
+
+Patch 8.0.1398
+Problem: :packadd does not load packages from the "start" directory.
+ (Alejandro Hernandez)
+Solution: Make :packadd look in the "start" directory if those packages were
+ not loaded on startup.
+Files: src/ex_cmds2.c, src/testdir/test_packadd.vim
+
+Patch 8.0.1399
+Problem: Warnings and errors when building tiny version. (Tony Mechelynck)
+Solution: Add #ifdefs.
+Files: src/ex_getln.c, src/ops.c
+
+Patch 8.0.1400
+Problem: Color scheme check script shows up as color scheme.
+Solution: Move it to the "tools" subdirectory. (closes #2457)
+Files: Filelist, runtime/colors/check_colors.vim,
+ runtime/colors/tools/check_colors.vim, runtime/colors/README.txt
+
+Patch 8.0.1401
+Problem: Cannot build with GTK but without XIM. (Guido)
+Solution: Adjust #ifdef. (closes #2461)
+Files: src/gui.c
+
+Patch 8.0.1402
+Problem: Crash with nasty autocommand. (gy741, Dominique Pelle)
+Solution: Check that the new current buffer isn't wiped out. (closes #2447)
+Files: src/buffer.c, src/testdir/test_autocmd.vim
+
+Patch 8.0.1403
+Problem: Using freed buffer in grep command. (gy741, Dominique Pelle)
+Solution: Lock the dummy buffer to avoid autocommands wiping it out.
+Files: src/quickfix.c, src/testdir/test_autocmd.vim
+
+Patch 8.0.1404
+Problem: Invalid memory access on exit when autocommands wipe out a buffer.
+ (gy741, Dominique Pelle)
+Solution: Check if the buffer is still valid. (closes #2449)
+Files: src/main.c
+
+Patch 8.0.1405
+Problem: Duplicated code for getting a typed character. CursorHold is
+ called too often in the GUI. (lilydjwg)
+Solution: Refactor code to move code up from mch_inchar(). Don't fire
+ CursorHold if feedkeys() was used. (closes #2451)
+Files: src/gui.c, src/proto/gui.pro, src/main.c, src/ui.c,
+ src/proto/ui.pro, src/os_unix.c
+
+Patch 8.0.1406
+Problem: Difficult to track changes to a quickfix list.
+Solution: Add a "changedtick" value. (Yegappan Lakshmanan, closes #2460)
+Files: runtime/doc/eval.txt, runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1407
+Problem: GUI: CursorHold may trigger before 'updatetime' when using timers.
+Solution: Check that 'updatetime' has passed.
+Files: src/gui.c
+
+Patch 8.0.1408
+Problem: Crash in setqflist().
+Solution: Check for string to be NULL. (Dominique Pelle, closes #2464)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1409
+Problem: Buffer overflow in :tags command.
+Solution: Use vim_snprintf(). (Dominique Pelle, closes #2471, closes #2475)
+ Add a test.
+Files: src/testdir/test_taglist.vim, src/tag.c
+
+Patch 8.0.1410
+Problem: Hang when using count() with an empty string.
+Solution: Return zero for an empty string. (Dominique Pelle, closes #2465)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim
+
+Patch 8.0.1411
+Problem: Reading invalid memory with CTRL-W :.
+Solution: Correct the command characters. (closes #2469)
+Files: src/normal.c, src/testdir/test_window_cmd.vim, src/ops.c
+
+Patch 8.0.1412
+Problem: Using free memory using setloclist(). (Dominique Pelle)
+Solution: Mark location list context as still in use when needed. (Yegappan
+ Lakshmanan, closes #2462)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1413
+Problem: Accessing freed memory in :cbuffer.
+Solution: Get quickfix list after executing autocmds. (closes #2470)
+Files: src/quickfix.c, src/testdir/test_autocmd.vim
+
+Patch 8.0.1414
+Problem: Accessing freed memory in :lfile.
+Solution: Get the current window after executing autocommands. (Yegappan
+ Lakshmanan, closes #2473)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1415
+Problem: Warning for unused function without timers feature.
+Solution: Add #ifdef. (John Marriott)
+Files: src/gui.c
+
+Patch 8.0.1416
+Problem: Crash when searching for a sentence.
+Solution: Return NUL when getting character at MAXCOL. (closes #2468)
+Files: src/misc1.c, src/misc2.c, src/testdir/test_search.vim,
+ src/ex_docmd.c
+
+Patch 8.0.1417
+Problem: Test doesn't search for a sentence. Still fails when searching for
+ start of sentence. (Dominique Pelle)
+Solution: Add paren. Check for MAXCOL in dec().
+Files: src/testdir/test_search.vim, src/misc2.c
+
+Patch 8.0.1418
+Problem: No test for expanding backticks.
+Solution: Add a test. (Dominique Pelle, closes #2479)
+Files: src/testdir/test_normal.vim
+
+Patch 8.0.1419
+Problem: Cursor column is not updated after ]s. (Gary Johnson)
+Solution: Set the curswant flag.
+Files: src/testdir/test_spell.vim, src/normal.c, src/evalfunc.c
+
+Patch 8.0.1420
+Problem: Accessing freed memory in vimgrep.
+Solution: Check that the quickfix list is still valid. (Yegappan Lakshmanan,
+ closes #2474)
+Files: src/quickfix.c, src/testdir/test_autocmd.vim,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1421
+Problem: Accessing invalid memory with overlong byte sequence.
+Solution: Check for NUL character. (test by Dominique Pelle, closes #2485)
+Files: src/misc2.c, src/testdir/test_functions.vim
+
+Patch 8.0.1422
+Problem: No fallback to underline when undercurl is not set. (Ben Jackson)
+Solution: Check for the value to be empty instead of NULL. (closes #2424)
+Files: src/screen.c
+
+Patch 8.0.1423
+Problem: Error in return not caught by try/catch.
+Solution: Call update_force_abort(). (Yasuhiro Matsumoto, closes #2483)
+Files: src/testdir/test_eval.in, src/testdir/test_eval_stuff.vim,
+ src/Makefile, src/testdir/Make_all.mak, src/userfunc.c
+
+Patch 8.0.1424
+Problem: The timer_pause test is flaky on Travis.
+Solution: Accept a longer sleep time on Mac.
+Files: src/testdir/test_timers.vim
+
+Patch 8.0.1425
+Problem: execute() does not work in completion of user command. (thinca)
+Solution: Switch off redir_off and restore it. (Ozaki Kiichi, closes #2492)
+Files: src/evalfunc.c, src/testdir/test_usercommands.vim
+
+Patch 8.0.1426
+Problem: "gf" and <cfile> don't accept ? and & in URL. (Dmitrii Tcyganok)
+Solution: Check for a URL and allow for extra characters. (closes #2493)
+Files: src/window.c, src/testdir/test_gf.vim
+
+Patch 8.0.1427
+Problem: The :leftabove modifier doesn't work for :copen.
+Solution: Respect the split modifier. (Yegappan Lakshmanan, closes #2496)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1428
+Problem: Compiler warning on 64 bit MS-Windows system.
+Solution: Change type from "int" to "size_t". (Mike Williams)
+Files: src/ex_getln.c
+
+Patch 8.0.1429
+Problem: Crash when calling term_start() with empty argument.
+Solution: Check for invalid argument. (Yasuhiro Matsumoto, closes #2503)
+ Fix memory leak.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1430 (after 8.0.1429)
+Problem: Crash when term_start() fails.
+Solution: Initialize winpty_err.
+Files: src/terminal.c
+
+Patch 8.0.1431
+Problem: MS-Windows: vimtutor fails if %TMP% has special chars.
+Solution: Add quotes. (Tamce, closes #2561)
+Files: vimtutor.bat
+
+Patch 8.0.1432
+Problem: After ":copen" can't get the window-ID of the quickfix window.
+ (FalacerSelene)
+Solution: Make it work without a quickfix list. Add a test. (Yegappan
+ Lakshmanan, closes #2541)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1433
+Problem: Illegal memory access after undo. (Dominique Pelle)
+Solution: Avoid the column becomes negative. (Christian Brabandt,
+ closes #2533)
+Files: src/mbyte.c, src/testdir/test_undo.vim
+
+Patch 8.0.1434
+Problem: GTK: :promtfind does not put focus on text input. (Adam Novak)
+Solution: When re-opening the dialog put focus on the text input. (Kazunobu
+ Kuriyama, closes #2563)
+Files: src/gui_gtk.c
+
+Patch 8.0.1435
+Problem: Memory leak in test_arabic.
+Solution: Free the from and to parts. (Christian Brabandt, closes #2569)
+Files: src/buffer.c, src/digraph.c, src/proto/digraph.pro
+
+Patch 8.0.1436
+Problem: Not enough information about what Python version may work.
+Solution: Add "python_compiled", "python3_compiled", "python_dynamic" and
+ "python3_dynamic" values for has().
+Files: src/evalfunc.c, runtime/doc/eval.txt
+
+Patch 8.0.1437
+Problem: Pkg-config doesn't work with cross compiling.
+Solution: Use AC_PATH_TOOL() instead of AC_PATH_PROG(). (James McCoy,
+ closes #2513)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1438
+Problem: Filetype detection test not updated for change.
+Solution: Update the test.
+Files: src/testdir/test_filetype.vim
+
+Patch 8.0.1439
+Problem: If cscope fails a search Vim may hang.
+Solution: Bail out when a search error is encountered. (Safouane Baroudi,
+ closes #2598)
+Files: src/if_cscope.c
+
+Patch 8.0.1440
+Problem: Terminal window: some vterm responses are delayed.
+Solution: After writing input. check if there is output to read. (Ozaki
+ Kiichi, closes #2594)
+Files: src/terminal.c, src/testdir/test_search.vim,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.1441
+Problem: Using ":undo 0" leaves undo in wrong state.
+Solution: Instead of searching for state 1 and go above, just use the start.
+ (Ozaki Kiichi, closes #2595)
+Files: src/undo.c, src/testdir/test_undo.vim
+
+Patch 8.0.1442 (after 8.0.1439)
+Problem: Using pointer before it is set.
+Solution: Search in whole buffer instead of next token.
+Files: src/if_cscope.c
+
+Patch 8.0.1443 (after 8.0.1441)
+Problem: Compiler complains about uninitialized variable. (Tony Mechelynck)
+Solution: Assign a value to the variable.
+Files: src/undo.c
+
+Patch 8.0.1444
+Problem: Missing -D_FILE_OFFSET_BITS=64 may cause problems if a library is
+ compiled with it.
+Solution: Include -D_FILE_OFFSET_BITS if some CFLAGS has it. (James McCoy,
+ closes #2600)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1445
+Problem: Cannot act on edits in the command line.
+Solution: Add the CmdlineChanged autocommand event. (xtal8, closes #2603,
+ closes #2524)
+Files: runtime/doc/autocmd.txt, src/ex_getln.c, src/fileio.c,
+ src/testdir/test_autocmd.vim, src/vim.h
+
+Patch 8.0.1446
+Problem: Accessing freed memory after window command in auto command.
+ (gy741)
+Solution: Adjust the pointer in the parent frame. (Christian Brabandt,
+ closes #2467)
+Files: src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 8.0.1447
+Problem: Still too many old style tests.
+Solution: Turn a few tests into new style. (Yegappan Lakshmanan,
+ closes #2509)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/main.aap, src/testdir/test15.in,
+ src/testdir/test15.ok, src/testdir/test36.in,
+ src/testdir/test36.ok, src/testdir/test50.in,
+ src/testdir/test50.ok, src/testdir/test_regex_char_classes.vim,
+ src/testdir/test_shortpathname.vim,
+ src/testdir/test_textformat.vim
+
+Patch 8.0.1448
+Problem: Segmentation fault when Ruby throws an exception inside :rubyfile
+ command.
+Solution: Use rb_protect() instead of rb_load_protect(). (ujihisa,
+ closes #2147, greywolf, closes #2512, #2511)
+Files: src/if_ruby.c, src/testdir/test_ruby.vim
+
+Patch 8.0.1449
+Problem: Slow redrawing with DirectX.
+Solution: Avoid calling gui_mch_flush() unnecessarily, especially when
+ updating the cursor. (Ken Takata, closes #2560)
+Files: runtime/doc/options.txt, src/channel.c, src/edit.c, src/getchar.c,
+ src/gui.c, src/gui_dwrite.cpp, src/gui_dwrite.h, src/gui_w32.c,
+ src/macros.h, src/main.c, src/message.c, src/netbeans.c,
+ src/proto/gui.pro, src/proto/term.pro, src/screen.c, src/search.c,
+ src/term.c, src/ui.c
+
+Patch 8.0.1450
+Problem: Endless loop when gui_mch_stop_blink() is called while blink_state
+ is BLINK_OFF. (zdohnal)
+Solution: Avoid calling gui_update_cursor() recursively.
+Files: src/gui.c, src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro,
+ src/gui_mac.c, src/proto/gui_mac.pro, src/gui_photon.c,
+ src/proto/gui_photon.pro, src/gui_w32.c, src/proto/gui_w32.pro,
+ src/gui_x11.c, src/proto/gui_x11.pro
+
+Patch 8.0.1451
+Problem: It is difficult to set the python home directory properly for
+ Python 2.7 and 3.5 since both use $PYTHONHOME.
+Solution: Add the 'pythonhome' and 'pythonthreehome' options. (Kazuki
+ Sakamoto, closes #1266)
+Files: runtime/doc/options.txt, runtime/doc/quickref.txt,
+ runtime/optwin.vim, src/if_python.c, src/if_python3.c,
+ src/option.c, src/option.h
+
+Patch 8.0.1452
+Problem: Terminal test fails on some systems. (jonathonf)
+Solution: Use "cat" instead of Python to produce the input. Add a delay.
+ (closes #2607)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1453
+Problem: Terminal test fails on some slow terminals.
+Solution: Increase timeout to 10 seconds.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1454
+Problem: When in silent mode too much output is buffered.
+Solution: Use line buffering instead of fully buffered. (Brian M. Carlson,
+ closes #2537)
+Files: src/main.c
+
+Patch 8.0.1455
+Problem: If $SHELL contains a space then the default value of 'shell' is
+ incorrect. (Matthew Horan)
+Solution: Escape spaces in $SHELL. (Christian Brabandt, closes #459)
+Files: src/option.c, runtime/doc/options.txt,
+ src/testdir/test_startup.vim
+
+Patch 8.0.1456
+Problem: Timer test on travis Mac is still flaky.
+Solution: Increase time range a bit more.
+Files: src/testdir/test_timers.vim
+
+Patch 8.0.1457
+Problem: Clojure now supports a shebang line.
+Solution: Detect clojure script from the shebang line. (David Burgin,
+ closes #2570)
+Files: runtime/scripts.vim
+
+Patch 8.0.1458
+Problem: Filetype detection test does not check all scripts.
+Solution: Add most scripts to the test
+Files: src/testdir/test_filetype.vim
+
+Patch 8.0.1459
+Problem: Cannot handle change of directory.
+Solution: Add the DirChanged autocommand event. (Andy Massimino,
+ closes #888) Avoid changing directory for 'autochdir' too often.
+Files: runtime/doc/autocmd.txt, src/buffer.c, src/ex_docmd.c,
+ src/fileio.c, src/main.c, src/vim.h, src/proto/misc2.pro,
+ src/gui_mac.c, src/netbeans.c, src/os_win32.c,
+ src/testdir/test_autocmd.vim
+
+Patch 8.0.1460 (after 8.0.1459)
+Problem: Missing file in patch.
+Solution: Add changes to missing file.
+Files: src/misc2.c
+
+Patch 8.0.1461 (after 8.0.1459)
+Problem: Missing another file in patch.
+Solution: Add changes to missing file.
+Files: src/ex_cmds.c
+
+Patch 8.0.1462 (after 8.0.1459)
+Problem: Missing yet another file in patch.
+Solution: Add changes to missing file.
+Files: src/gui.c
+
+Patch 8.0.1463
+Problem: Test fails without 'autochdir' option.
+Solution: Skip test if 'autochdir' is not supported.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.0.1464
+Problem: Completing directory after :find does not add slash.
+Solution: Adjust the flags for globpath(). (Genki Sky)
+Files: src/misc1.c, src/testdir/test_find_complete.vim
+
+Patch 8.0.1465
+Problem: Python2 and python3 detection not tested. (Matej Cepl)
+Solution: Add test for detecting python2 and python3. Also detect a script
+ using "js" as javascript.
+Files: runtime/scripts.vim, src/testdir/test_filetype.vim
+
+Patch 8.0.1466
+Problem: Older GTK versions don't have gtk_entry_get_text_length().
+Solution: Add a function with #ifdefs to take care of GTK version
+ differences. (Kazunobu Kuriyama, closes #2605)
+Files: src/gui_gtk.c
+
+Patch 8.0.1467
+Problem: Libvterm doesn't handle illegal byte sequence correctly.
+Solution: After the invalid code check if there is space to store another
+ character. Allocate one more character. (zhykzhykzhyk, closes
+ #2614, closes #2613)
+Files: src/libvterm/src/encoding.c, src/libvterm/src/state.c
+
+Patch 8.0.1468
+Problem: Illegal memory access in del_bytes().
+Solution: Check for negative byte count. (Christian Brabandt, closes #2466)
+Files: src/message.c, src/misc1.c
+
+Patch 8.0.1469
+Problem: When package path is a symlink adding it to 'runtimepath' happens
+ at the end.
+Solution: Do not resolve symlinks before locating the position in
+ 'runtimepath'. (Ozaki Kiichi, closes #2604)
+Files: src/ex_cmds2.c, src/testdir/test_packadd.vim
+
+Patch 8.0.1470
+Problem: Integer overflow when using regexp pattern. (geeknik)
+Solution: Use a long instead of int. (Christian Brabandt, closes #2251)
+Files: src/regexp_nfa.c
+
+Patch 8.0.1471 (after 8.0.1401)
+Problem: On MS-Windows CursorIM highlighting no longer works.
+Solution: Adjust #if statements. (Ken Takata)
+Files: src/gui.c
+
+Patch 8.0.1472
+Problem: MS-Windows: nsis installer is a bit slow.
+Solution: Use ReserveFile for vimrc.ini. (Ken Takata, closes #2522)
+Files: nsis/gvim.nsi
+
+Patch 8.0.1473
+Problem: MS-Windows: D&D fails between 32 and 64 bit apps.
+Solution: Add the /HIGHENTROPYVA:NO linker option. (Ken Takata, closes #2504)
+Files: src/Make_mvc.mak
+
+Patch 8.0.1474
+Problem: Visual C 2017 has multiple MSVCVER numbers.
+Solution: Assume the 2017 version if MSVCVER >= 1910. (Leonardo Valeri
+ Manera, closes #2619)
+Files: src/Make_mvc.mak
+
+Patch 8.0.1475
+Problem: Invalid memory access in read_redo(). (gy741)
+Solution: Convert the replacement character back from a negative number to
+ CR or NL. (hint by Dominique Pelle, closes #2616)
+Files: src/testdir/test_undo.vim, src/normal.c, src/vim.h, src/ops.c
+
+Patch 8.0.1476
+Problem: Screen isn't always updated right away.
+Solution: Adjust #ifdef: Call out_flush() when not running the GUI.
+Files: src/screen.c
+
+Patch 8.0.1477
+Problem: Redraw flicker when moving the mouse outside of terminal window.
+Solution: Instead of updating the cursor color and shape every time leaving
+ and entering a terminal window, only update when different from
+ the previously used cursor.
+Files: src/terminal.c
+
+Patch 8.0.1478
+Problem: Unnecessary condition for "len" being zero.
+Solution: Remove the condition. (Dominique Pelle)
+Files: src/regexp_nfa.c
+
+Patch 8.0.1479
+Problem: Insert mode completion state is confusing.
+Solution: Move ctrl_x_mode into edit.c. Add CTRL_X_NORMAL for zero.
+Files: src/edit.c, src/globals.h, src/proto/edit.pro, src/search.c,
+ src/getchar.c
+
+Patch 8.0.1480 (after 8.0.1479)
+Problem: Patch missing change.
+Solution: Add missing change.
+Files: src/evalfunc.c
+
+Patch 8.0.1481
+Problem: Clearing a pointer takes two lines.
+Solution: Add vim_clear() to free and clear the pointer.
+Files: src/misc2.c, src/proto/misc2.pro, src/edit.c
+
+Patch 8.0.1482
+Problem: Using feedkeys() does not work to test Insert mode completion.
+ (Lifepillar)
+Solution: Do not check for typed keys when executing :normal or feedkeys().
+ Fix thesaurus completion not working when 'complete' is empty.
+Files: src/edit.c, src/testdir/test_ins_complete.vim,
+ src/testdir/test_popup.vim, src/testdir/test_edit.vim
+
+Patch 8.0.1483
+Problem: searchpair() might return an invalid value on timeout.
+Solution: When the second search times out, do not accept a match from the
+ first search. (Daniel Hahler, closes #2552)
+Files: src/search.c
+
+Patch 8.0.1484
+Problem: Redundant conditions.
+Solution: Remove them. (Dominique Pelle)
+Files: src/terminal.c
+
+Patch 8.0.1485
+Problem: Weird autocmd may cause arglist to be changed recursively.
+Solution: Prevent recursively changing the argument list. (Christian
+ Brabandt, closes #2472)
+Files: src/ex_docmd.c, src/globals.h
+
+Patch 8.0.1486
+Problem: Accessing invalid memory with "it". (Dominique Pelle)
+Solution: Avoid going over the end of the line. (Christian Brabandt,
+ closes #2532)
+Files: src/search.c, src/testdir/test_textobjects.vim
+
+Patch 8.0.1487 (after 8.0.1486)
+Problem: Test 14 fails.
+Solution: Fix of-by-one error.
+Files: src/search.c
+
+Patch 8.0.1488 (after 8.0.1218)
+Problem: Emacs tags no longer work. (zdohnal)
+Solution: Do not skip over end of line.
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.0.1489
+Problem: There is no easy way to get the global directory, esp. if some
+ windows have a local directory.
+Solution: Make getcwd(-1) return the global directory. (Andy Massimino,
+ closes #2606)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_getcwd.vim
+
+Patch 8.0.1490
+Problem: Number of spell regions is spread out through the code.
+Solution: Define MAXREGIONS.
+Files: src/spell.h, src/spellfile.c
+
+Patch 8.0.1491
+Problem: The minimum width of the popup menu is hard coded.
+Solution: Add the 'pumwidth' option. (Christian Brabandt, James McCoy,
+ closes #2314)
+Files: runtime/doc/options.txt, src/option.c, src/option.h,
+ src/popupmnu.c
+
+Patch 8.0.1492
+Problem: Memory leak in balloon_split().
+Solution: Free the balloon lines. Free the balloon when exiting.
+Files: src/misc2.c, src/evalfunc.c
+
+Patch 8.0.1493
+Problem: Completion items cannot be annotated.
+Solution: Add a "user_data" entry to the completion item. (Ben Jackson,
+ closes #2608, closes #2508)
+Files: runtime/doc/insert.txt, src/edit.c, src/structs.h,
+ src/testdir/test_ins_complete.vim
+
+Patch 8.0.1494
+Problem: No autocmd triggered in Insert mode with visible popup menu.
+Solution: Add TextChangedP. (Prabir Shrestha, Christian Brabandt,
+ closes #2372, closes #1691)
+ Fix that the TextChanged autocommands are not always triggered
+ when sourcing a script.
+Files: runtime/doc/autocmd.txt, src/edit.c, src/globals.h, src/structs.h,
+ src/fileio.c, src/proto/fileio.pro, src/vim.h, src/main.c,
+ src/testdir/test_autocmd.vim
+
+Patch 8.0.1495
+Problem: Having 'pumwidth' default to zero has no merit.
+Solution: Make the default 15, as the actual default value.
+Files: src/popupmnu.c, src/option.c
+
+Patch 8.0.1496
+Problem: Clearing a pointer takes two lines.
+Solution: Add VIM_CLEAR() and replace vim_clear(). (Hirohito Higashi,
+ closes #2629)
+Files: src/buffer.c, src/channel.c, src/crypt.c, src/edit.c, src/eval.c,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/ex_getln.c, src/fileio.c, src/gui_gtk_x11.c, src/gui_photon.c,
+ src/gui_w32.c, src/gui_x11.c, src/hardcopy.c, src/if_cscope.c,
+ src/macros.h, src/main.c, src/mark.c, src/mbyte.c, src/memfile.c,
+ src/memline.c, src/menu.c, src/message.c, src/misc1.c,
+ src/misc2.c, src/netbeans.c, src/normal.c, src/ops.c,
+ src/option.c, src/os_amiga.c, src/os_mac_conv.c, src/os_mswin.c,
+ src/os_unix.c, src/os_win32.c, src/popupmnu.c,
+ src/proto/misc2.pro, src/quickfix.c, src/regexp.c,
+ src/regexp_nfa.c, src/screen.c, src/search.c, src/spell.c,
+ src/spellfile.c, src/syntax.c, src/tag.c, src/term.c,
+ src/terminal.c, src/ui.c, src/undo.c, src/userfunc.c, src/window.c
+
+Patch 8.0.1497
+Problem: Getting the jump list requires parsing the output of :jumps.
+Solution: Add getjumplist(). (Yegappan Lakshmanan, closes #2609)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/Makefile,
+ src/evalfunc.c, src/list.c, src/proto/list.pro,
+ src/testdir/Make_all.mak, src/testdir/test_jumplist.vim
+
+Patch 8.0.1498 (after 8.0.1497)
+Problem: getjumplist() returns duplicate entries. (lacygoill)
+Solution: Call cleanup_jumplist(). (Yegappan Lakshmanan)
+Files: src/evalfunc.c, src/mark.c, src/proto/mark.pro,
+ src/testdir/test_jumplist.vim
+
+Patch 8.0.1499
+Problem: Out-of-memory situation not correctly handled. (Coverity)
+Solution: Check for NULL value.
+Files: src/terminal.c
+
+Patch 8.0.1500
+Problem: Possible NULL pointer dereference. (Coverity)
+Solution: Check for the pointer not being NULL.
+Files: src/quickfix.c
+
+Patch 8.0.1501
+Problem: Out-of-memory situation not correctly handled. (Coverity)
+Solution: Check for NULL value.
+Files: src/ops.c
+
+Patch 8.0.1502
+Problem: In out-of-memory situation character is not restored. (Coverity)
+Solution: Restore the character in all situations.
+Files: src/ex_getln.c
+
+Patch 8.0.1503
+Problem: Access memory beyond end of string. (Coverity)
+Solution: Keep allocated memory in separate pointer. Avoid outputting the
+ NUL character.
+Files: src/hardcopy.c
+
+Patch 8.0.1504
+Problem: Win32: the screen may be cleared on startup.
+Solution: Only call shell_resized() when the size actually changed. (Ken
+ Takata, closes #2527)
+Files: src/os_win32.c
+
+Patch 8.0.1505
+Problem: Debugger can't break on a condition. (Charles Campbell)
+Solution: Add ":breakadd expr". (Christian Brabandt, closes #859)
+Files: runtime/doc/repeat.txt, src/eval.c, src/evalfunc.c,
+ src/userfunc.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/proto/eval.pro, src/proto/ex_cmds2.pro, src/structs.h
+
+Patch 8.0.1506
+Problem: New version of HP NonStop (Tandem) doesn't like the default header
+ for setenv().
+Solution: Put a #ifdef around the setenv() entry. (Joachim Schmitz)
+Files: src/osdef2.h.in
+
+Patch 8.0.1507
+Problem: Timer test is a bit flaky.
+Solution: Add it to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.1508
+Problem: The :drop command is not always available.
+Solution: Include :drop in all builds. (Yasuhiro Matsumoto, closes #2639)
+Files: runtime/doc/windows.txt, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/testdir/test_normal.vim,
+ src/testdir/test_tabpage.vim
+
+Patch 8.0.1509 (after 8.0.1508)
+Problem: Test for failing drag-n-drop command no longer fails.
+Solution: Check for the "dnd" feature.
+Files: src/testdir/test_normal.vim
+
+Patch 8.0.1510
+Problem: Cannot test if a command causes a beep.
+Solution: Add assert_beeps().
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/eval.c,
+ src/proto/eval.pro, src/misc1.c, src/globals.h,
+ src/testdir/test_normal.vim, src/testdir/test_assert.vim
+
+Patch 8.0.1511 (after 8.0.1505)
+Problem: Some code for the debugger watch expression is clumsy.
+Solution: Clean up the code.
+Files: src/ex_cmds2.c, src/eval.c, src/proto/eval.pro
+
+Patch 8.0.1512
+Problem: Warning for possibly using NULL pointer. (Coverity)
+Solution: Skip using the pointer if it's NULL.
+Files: src/ex_cmds.c
+
+Patch 8.0.1513
+Problem: The jumplist is not always properly cleaned up.
+Solution: Call fname2fnum() before cleanup_jumplist(). (Yegappan Lakshmanan)
+Files: src/evalfunc.c, src/mark.c, src/proto/mark.pro
+
+Patch 8.0.1514
+Problem: Getting the list of changes is not easy.
+Solution: Add the getchangelist() function. (Yegappan Lakshmanan,
+ closes #2634)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/testdir/Make_all.mak, src/testdir/test_changelist.vim,
+ src/Makefile
+
+Patch 8.0.1515
+Problem: BufWinEnter event fired when opening hidden terminal.
+Solution: Do not fire BufWinEnter when the terminal is hidden and does not
+ open a window. (Kenta Sato, closes #2636)
+Files: src/terminal.c
+
+Patch 8.0.1516
+Problem: Errors for job options are not very specific.
+Solution: Add more specific error messages.
+Files: src/channel.c, src/globals.h
+
+Patch 8.0.1517
+Problem: Invalid memory access with pattern using look-behind match.
+ (Dominique Pelle)
+Solution: Get a pointer to the right line.
+Files: src/regexp.c
+
+Patch 8.0.1518
+Problem: Error messages suppressed after ":silent! try". (Ben Reilly)
+Solution: Restore emsg_silent before executing :try. (closes #2531)
+Files: src/ex_docmd.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.0.1519
+Problem: getchangelist() does not use argument as bufname().
+Solution: Use get_buf_tv(). (Yegappan Lakshmanan, closes #2641)
+Files: src/evalfunc.c, src/testdir/test_changelist.vim
+
+Patch 8.0.1520
+Problem: Cursor is in the wrong line when using a WinBar in a Terminal
+ window.
+Solution: Adjust the row number. (Christian Brabandt, closes #2362)
+Files: src/screen.c, src/terminal.c
+
+Patch 8.0.1521
+Problem: Shift-Tab does not work in a terminal window.
+Solution: Recognize Shift-Tab key press. (Jsees Luehrs, closes #2644)
+Files: src/terminal.c
+
+Patch 8.0.1522 (after 8.0.1491)
+Problem: Popup menu is positioned in the wrong place. (Davit Samvelyan,
+ Boris Staletic)
+Solution: Correct computation of the column and the conditions for that.
+ (Hirohito Higashi, closes #2640)
+Files: src/popupmnu.c
+
+Patch 8.0.1523
+Problem: Cannot write and read terminal screendumps.
+Solution: Add term_dumpwrite(), term_dumpread() and term_dumpdiff().
+ Also add assert_equalfile().
+Files: src/terminal.c, src/proto/terminal.pro, src/evalfunc.c,
+ src/normal.c, src/eval.c, src/proto/eval.pro,
+ runtime/doc/eval.txt, src/testdir/test_assert.vim
+
+Patch 8.0.1524 (after 8.0.1523)
+Problem: Compiler warnings for uninitialized variables. (Tony Mechelynck)
+Solution: Initialize variables.
+Files: src/terminal.c
+
+Patch 8.0.1525
+Problem: Using :wqa exits even if a job runs in a terminal window. (Jason
+ Felice)
+Solution: Check if a terminal has a running job. (closes #2654)
+Files: src/ex_cmds2.c, src/buffer.c, src/proto/buffer.pro, src/ex_cmds.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.1526
+Problem: No test using a screen dump yet.
+Solution: Add a test for C syntax highlighting. Add helper functions.
+Files: src/terminal.c, src/testdir/test_syntax.vim,
+ src/testdir/shared.vim, src/testdir/screendump.vim,
+ src/testdir/dumps/Test_syntax_c_01.dump, runtime/doc/terminal.txt,
+ src/testdir/README.txt
+
+Patch 8.0.1527 (after 8.0.1526)
+Problem: Screen dump test fails on MS-Windows.
+Solution: Skip dump test on MS-Windows for now.
+Files: src/testdir/test_syntax.vim
+
+Patch 8.0.1528
+Problem: Dead code found.
+Solution: Remove the useless lines. (CodeAi, closes #2656)
+Files: src/screen.c, src/spell.c, src/syntax.c, src/window.c
+
+Patch 8.0.1529
+Problem: Assert_equalfile() does not close file descriptors. (Coverity)
+Solution: Close the file descriptors.
+Files: src/eval.c
+
+Patch 8.0.1530
+Problem: Dump test fails when using a shadow directory.
+Solution: Add the directory to the list of symlinks to make (Elimar
+ Riesebieter)
+Files: src/Makefile
+
+Patch 8.0.1531
+Problem: Cannot use 24 bit colors in MS-Windows console.
+Solution: Add support for vcon. (Nobuhiro Takasaki, Ken Takata,
+ fixes #1270, fixes #2060)
+Files: runtime/doc/options.txt, src/misc1.c, src/option.c,
+ src/evalfunc.c, src/os_win32.c, src/proto/os_win32.pro,
+ src/feature.h, src/proto/term.pro, src/screen.c, src/syntax.c,
+ src/term.c, src/testdir/gen_opt_test.vim, src/version.c
+
+Patch 8.0.1532
+Problem: Compiler warnings without termguicolors feature.
+Solution: Add #ifdef. (John Marriott) Cleanup the code a bit.
+Files: src/term.c
+
+Patch 8.0.1533
+Problem: Libterm doesn't support requesting fg and bg color.
+Solution: Implement t_RF and t_RB.
+Files: src/libvterm/src/vterm_internal.h, src/libvterm/src/state.c,
+ src/libvterm/src/vterm.c
+
+Patch 8.0.1534
+Problem: C syntax test fails when using gvim
+Solution: Force running in a terminal. Check that 'background' is correct
+ even when $COLORFGBG is set.
+Files: src/testdir/test_syntax.vim, src/testdir/screendump.vim
+
+Patch 8.0.1535 (after 8.0.1534)
+Problem: C syntax test still fails when using gvim.
+Solution: Clear Normal cterm highlighting instead of setting it.
+Files: src/testdir/test_syntax.vim, src/testdir/screendump.vim,
+ src/testdir/dumps/Test_syntax_c_01.dump
+
+Patch 8.0.1536
+Problem: Quotestar test is flaky when using the GUI.
+Solution: Add check that the star register arrived at the server. Increase
+ timeouts.
+Files: src/testdir/test_quotestar.vim
+
+Patch 8.0.1537
+Problem: Xxd does not skip NUL lines when using ebcdic.
+Solution: Check for a NUL before converting a character for ebcdic. (Tim
+ Sell, closes #2668)
+Files: src/xxd/xxd.c
+
+Patch 8.0.1538
+Problem: Popupmenu is too far left when completion is long. (Linwei)
+Solution: Adjust column computations. (Hirohito Higashi, closes #2661)
+Files: src/popupmnu.c
+
+Patch 8.0.1539
+Problem: No test for the popup menu positioning.
+Solution: Add a screendump test for the popup menu.
+Files: src/terminal.c, src/testdir/test_syntax.vim,
+ src/testdir/screendump.vim,
+ src/testdir/test_popup.vim,
+ src/testdir/dumps/Test_popup_position_01.dump,
+ src/testdir/dumps/Test_popup_position_02.dump,
+ src/testdir/dumps/Test_popup_position_03.dump,
+ runtime/doc/eval.txt
+
+Patch 8.0.1540
+Problem: Popup menu positioning fails with longer string.
+Solution: Only align with right side of window when width is less than
+ 'pumwidth' (closes #2661)
+Files: src/popupmnu.c, src/testdir/screendump.vim,
+ src/testdir/test_popup.vim,
+ src/testdir/dumps/Test_popup_position_04.dump
+
+Patch 8.0.1541
+Problem: synpat_T is taking too much memory.
+Solution: Reorder members to reduce padding. (Dominique Pelle, closes #2671)
+Files: src/syntax.c
+
+Patch 8.0.1542
+Problem: Terminal screen dump does not include cursor position.
+Solution: Mark the cursor position in the dump.
+Files: src/terminal.c,
+ src/testdir/dumps/Test_popup_position_01.dump,
+ src/testdir/dumps/Test_popup_position_02.dump,
+ src/testdir/dumps/Test_popup_position_03.dump,
+ src/testdir/dumps/Test_popup_position_04.dump,
+ src/testdir/dumps/Test_syntax_c_01.dump
+
+Patch 8.0.1543
+Problem: With 'termguicolors' Normal color doesn't work correctly.
+Solution: Set cterm_normal_bg_gui_color and cterm_normal_fg_color always.
+ (Kazunobu Kuriyama, closes #981, closes #2332)
+Files: src/syntax.c
+
+Patch 8.0.1544
+Problem: When using 'termguicolors' SpellBad doesn't show.
+Solution: When the GUI colors are not set fall back to the cterm colors.
+Files: src/syntax.c, src/screen.c, src/gui.h, src/structs.h
+
+Patch 8.0.1545
+Problem: Screen dumps not included in distribution.
+Solution: Add dumps to the list of distributed files.
+Files: Filelist
+
+Patch 8.0.1546
+Problem: Using feedkeys() in a terminal window may trigger mappings.
+ (Charles Sheridan)
+Solution: Avoid triggering a mapping when peeking for a key.
+Files: src/getchar.c, src/terminal.c
+
+Patch 8.0.1547
+Problem: Undo in the options window makes it empty.
+Solution: Set 'undolevels' while filling the buffer. (Yasuhiro Matsumoto,
+ closes #2645)
+Files: runtime/optwin.vim
+
+Patch 8.0.1548
+Problem: Screen dump test script not included in distribution.
+Solution: Add the script to the list of distributed files.
+Files: Filelist
+
+Patch 8.0.1549
+Problem: Various small problems in test files.
+Solution: Include small changes.
+Files: src/testdir/test_channel.py, src/testdir/shared.vim,
+ src/testdir/test_gui.vim, src/testdir/test_gui_init.vim
+
+Patch 8.0.1550
+Problem: Various small problems in source files.
+Solution: Fix the problems.
+Files: src/README.txt, src/beval.c, src/json_test.c, src/mbyte.c,
+ src/libvterm/include/vterm_keycodes.h, src/Makefile,
+ src/gui_gtk.c, src/if_xcmdsrv.c, src/pty.c, src/if_python.c,
+ src/if_py_both.h, uninstal.txt, src/dosinst.c, src/iscygpty.c,
+ src/vimrun.c, src/os_vms.c
+
+Patch 8.0.1551
+Problem: On Mac 'maxmemtot' is set to a weird value.
+Solution: For Mac use total memory and subtract system memory. For other
+ systems accept both a 32 bit and 64 bit result. (Ozaki Kiichi,
+ closes #2646)
+Files: src/os_unix.c
+
+Patch 8.0.1552
+Problem: May leak file descriptors when executing job.
+Solution: Close more file descriptors. (Ozaki Kiichi, closes #2651)
+Files: src/os_unix.c, src/testdir/test_channel.vim
+
+Patch 8.0.1553
+Problem: Cannot see what digraph is used to insert a character.
+Solution: Show the digraph with the "ga" command. (Christian Brabandt)
+Files: runtime/doc/various.txt, src/digraph.c, src/ex_cmds.c,
+ src/proto/digraph.pro, src/testdir/shared.vim,
+ src/testdir/test_matchadd_conceal.vim,
+ src/testdir/test_digraph.vim, src/testdir/test_ga.vim,
+ src/testdir/test_arabic.vim
+
+Patch 8.0.1554
+Problem: Custom plugins loaded with --clean.
+Solution: Do not include the home directory in 'runtimepath'.
+Files: src/option.c, src/main.c, src/proto/option.pro, src/structs.h,
+ src/os_unix.h, src/os_amiga.h, src/os_dos.h, src/os_mac.h,
+ runtime/doc/starting.txt
+
+Patch 8.0.1555
+Problem: Build error for some combination of features.
+Solution: Declare variable in more situations.
+Files: src/main.c
+
+Patch 8.0.1556
+Problem: May not parse the t_RS response correctly, resulting in wrong
+ characters in the input stream.
+Solution: When the t_RS response is partly received wait for more
+ characters.
+Files: src/term.c
+
+Patch 8.0.1557
+Problem: printf() does not work with only one argument. (Daniel Hahler)
+Solution: Allow using just the format. (Ken Takata, closes #2687)
+Files: src/evalfunc.c, src/testdir/test_expr.vim
+
+Patch 8.0.1558
+Problem: No right-click menu in a terminal.
+Solution: Implement the right click menu for the terminal.
+Files: src/popupmnu.c, src/proto/popupmnu.pro, src/normal.c, src/menu.c,
+ src/proto/menu.pro, src/feature.h
+
+Patch 8.0.1559
+Problem: Build failure without GUI.
+Solution: Adjust #ifdef for get_fpos_of_mouse().
+Files: src/ui.c
+
+Patch 8.0.1560
+Problem: Build failure without GUI on MS-Windows.
+Solution: Adjust #ifdef for vcol2col().
+Files: src/ui.c
+
+Patch 8.0.1561
+Problem: Crash with rust syntax highlighting. (Edd Barrett)
+Solution: Avoid going past the end of an empty line.
+Files: src/syntax.c
+
+Patch 8.0.1562
+Problem: The terminal debugger can't set a breakpoint with the mouse.
+Solution: Add popup menu entries.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.0.1563
+Problem: Timeout of getwinposx() can be too short. (lilydjwg)
+Solution: Add getwinpos(). (closes #2689)
+Files: src/evalfunc.c, src/term.c, src/proto/term.pro, runtime/doc/eval.txt
+
+Patch 8.0.1564
+Problem: Too many #ifdefs.
+Solution: Graduate the +autocmd feature. Takes away 450 #ifdefs and
+ increases code size of tiny Vim by only 40 Kbyte.
+Files: src/buffer.c, src/diff.c, src/edit.c, src/eval.c, src/evalfunc.c,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c,
+ src/fileio.c, src/getchar.c, src/globals.h, src/gui.c,
+ src/if_cscope.c, src/if_xcmdsrv.c, src/main.c, src/mbyte.c,
+ src/memline.c, src/menu.c, src/misc1.c, src/gui_mac.c,
+ src/misc2.c, src/move.c, src/netbeans.c, src/normal.c, src/ops.c,
+ src/option.c, src/option.h, src/feature.h, src/vim.h,
+ src/os_amiga.c, src/os_mswin.c, src/os_unix.c, src/os_win32.c,
+ src/quickfix.c, src/screen.c, src/search.c, src/spell.c,
+ src/structs.h, src/syntax.c, src/tag.c, src/term.c,
+ src/terminal.c, src/ui.c, src/undo.c, src/userfunc.c,
+ src/version.c, src/window.c
+
+Patch 8.0.1565
+Problem: Can't build Mac version without GUI.
+Solution: Adjust when IME_WITHOUT_XIM is defined.
+Files: src/vim.h
+
+Patch 8.0.1566
+Problem: Too many #ifdefs.
+Solution: Graduate FEAT_SCROLLBIND and FEAT_CURSORBIND.
+Files: src/buffer.c, src/diff.c, src/edit.c, src/evalfunc.c,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/gui.c,
+ src/main.c, src/move.c, src/normal.c, src/option.c, src/term.c,
+ src/version.c, src/window.c, src/globals.h, src/macros.h,
+ src/option.h, src/structs.h
+
+Patch 8.0.1567
+Problem: Cannot build Win32 GUI without IME. (John Marriott)
+Solution: Adjust when IME_WITHOUT_XIM and HAVE_INPUT_METHOD are defined and
+ use it in a few more places.
+Files: src/vim.h, src/gui.c
+
+Patch 8.0.1568
+Problem: Can't build on older Mac, header file is missing.
+Solution: Remove the header file. (Ozaki Kiichi, closes #2691)
+Files: src/os_unix.c
+
+Patch 8.0.1569
+Problem: Warning for uninitialized variable from gcc.
+Solution: Initialize the variable.
+Files: src/quickfix.c
+
+Patch 8.0.1570
+Problem: Can't use :popup for a menu in the terminal. (Wei Zhang)
+Solution: Make :popup work in the terminal. Also fix that entries were
+ included that don't work in the current state.
+Files: src/ex_docmd.c, src/popupmnu.c, src/proto/popupmnu.pro,
+ src/menu.c, src/proto/menu.pro
+
+Patch 8.0.1571 (after 8.0.1571)
+Problem: Can't build without GUI.
+Solution: Adjust #ifdef for gui_find_menu().
+Files: src/menu.c
+
+Patch 8.0.1572
+Problem: Mac: getting memory size doesn't work everywhere.
+Solution: Use MACOS_X instead of MACOS_X_DARWIN. (Kazunobu Kuriyama)
+Files: src/os_unix.c
+
+Patch 8.0.1573
+Problem: getwinpos(1) may cause response to be handled as command.
+Solution: Handle any cursor position report once one was requested. (partly
+ by Hirohito Higashi)
+Files: src/term.c
+
+Patch 8.0.1574
+Problem: Show cursor in wrong place when using popup menu. (Wei Zhang)
+Solution: Force updating the cursor position. Fix skipping over unused
+ entries.
+Files: src/screen.c, src/proto/screen.pro, src/popupmnu.c
+
+Patch 8.0.1575
+Problem: Crash when using virtual replace.
+Solution: Adjust orig_line_count. Add more tests. (Christian Brabandt)
+Files: src/edit.c, src/testdir/test_visual.vim
+
+Patch 8.0.1576
+Problem: Perl VIM::Buffers() does not find every buffer.
+Solution: Also find unlisted buffer by number or name. (Chris Weyl,
+ closes #2692)
+Files: src/if_perl.xs
+
+Patch 8.0.1577
+Problem: Virtual replace test fails on MS-Windows.
+Solution: Make adding a termcap entry work for a builtin terminal.
+ Restore terminal keys in a better way.
+Files: src/term.c, src/testdir/test_visual.vim
+
+Patch 8.0.1578
+Problem: No test for :popup in terminal.
+Solution: Add a screen dump test.
+Files: src/testdir/test_popup.vim,
+ src/testdir/dumps/Test_popup_command_01.dump,
+ src/testdir/dumps/Test_popup_command_02.dump,
+ src/testdir/dumps/Test_popup_command_03.dump
+
+Patch 8.0.1579
+Problem: Virtual replace test fails in GUI.
+Solution: Don't save key options if they were not set.
+Files: src/testdir/test_visual.vim
+
+Patch 8.0.1580
+Problem: FEAT_CURSORBIND and FEAT_SCROLLBIND are unused.
+Solution: Delete them.
+Files: src/feature.h
+
+Patch 8.0.1581
+Problem: Cannot build Win32 GUI without +eval.
+Solution: Define HAVE_INPUT_METHOD without +eval. (Ken Takata)
+Files: src/vim.h
+
+Patch 8.0.1582
+Problem: In the MS-Windows console mouse movement is not used.
+Solution: Pass mouse movement events when useful.
+Files: src/os_win32.c, src/proto/os_win32.pro, src/feature.h
+
+Patch 8.0.1583
+Problem: Using C99 comment.
+Solution: Use old style comment. (Kazunobu Kuriyama)
+Files: src/quickfix.c
+
+Patch 8.0.1584
+Problem: Using C99 in Mac file gives compiler warning messages.
+Solution: Add #pragmas to avoid the warnings. (Kazunobu Kuriyama)
+Files: src/os_macosx.m
+
+Patch 8.0.1585
+Problem: Enabling beval_term feature in Win32 GUI.
+Solution: Only enable beval_term in Win32 console.
+Files: src/feature.h
+
+Patch 8.0.1586
+Problem: Imactivatefunc does not work on non-GUI Mac.
+Solution: Fix logic in #ifdef.
+Files: src/vim.h
+
+Patch 8.0.1587
+Problem: inserting from the clipboard doesn't work literally
+Solution: When pasting from the * or + register always assume literally.
+Files: src/ops.c, src/proto/ops.pro, src/testdir/test_paste.vim
+
+Patch 8.0.1588
+Problem: Popup menu hangs after typing CTRL-C.
+Solution: Make CTRL-C exit the loop. (Ozaki Kiichi, closes #2697)
+Files: src/popupmnu.c
+
+Patch 8.0.1589
+Problem: Error for setting 'modifiable' when resetting it.
+Solution: Check if 'modifiable' was actually set.
+Files: src/option.c
+
+Patch 8.0.1590
+Problem: Padding in list type wastes memory.
+Solution: Reorder struct members to optimize padding. (Dominique Pelle,
+ closes #2704)
+Files: src/structs.h
+
+Patch 8.0.1591
+Problem: MS-Windows: when reparsing the arguments 'wildignore' matters.
+Solution: Save and reset 'wildignore'. (Yasuhiro Matsumoto, closes #2702)
+Files: src/os_win32.c
+
+Patch 8.0.1592
+Problem: Terminal windows in a session are not properly restored.
+Solution: Add "terminal" in 'sessionoptions'. When possible restore the
+ command running in a terminal.
+Files: src/option.c, src/option.h, src/ex_docmd.c, src/terminal.c,
+ src/proto/terminal.pro, src/evalfunc.c, src/structs.h,
+ src/channel.c, src/testdir/test_terminal.vim,
+ src/testdir/shared.vim, src/testdir/test_mksession.vim
+
+Patch 8.0.1593
+Problem: :qall never exits with an active terminal window.
+Solution: Add a way to kill a job in a terminal window.
+Files: src/ex_cmds2.c, src/terminal.c, src/proto/terminal.pro,
+ src/structs.h, src/channel.c, src/evalfunc.c,
+ src/testdir/test_terminal.vim, runtime/doc/terminal.txt,
+ runtime/doc/eval.txt
+
+Patch 8.0.1594
+Problem: :confirm qall not tested with active terminal window.
+Solution: Add a test.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1595
+Problem: No autocommand triggered before exiting.
+Solution: Add the ExitPre autocommand event.
+Files: src/ex_docmd.c, src/fileio.c, src/vim.h,
+ src/testdir/test_exit.vim, src/Makefile, src/testdir/Make_all.mak,
+ runtime/doc/autocmd.txt
+
+Patch 8.0.1596
+Problem: No autocommand specifically for opening a terminal window.
+Solution: Add TerminalOpen. (Yasuhiro Matsumoto, closes #2484)
+Files: runtime/doc/autocmd.txt, src/fileio.c, src/terminal.c,
+ src/testdir/test_terminal.vim, src/vim.h
+
+Patch 8.0.1597
+Problem: Autocommand events are not sorted.
+Solution: Sort the autocommand events.
+Files: src/vim.h
+
+Patch 8.0.1598
+Problem: Cannot select text in a terminal with the mouse.
+Solution: When a job in a terminal is not consuming mouse events, use them
+ for modeless selection. Also stop Insert mode when clicking in a
+ terminal window.
+Files: src/libvterm/include/vterm.h, src/libvterm/src/state.c,
+ src/libvterm/src/vterm_internal.h, src/terminal.c,
+ src/proto/terminal.pro, src/ui.c
+
+Patch 8.0.1599
+Problem: No error message when gdb does not support the terminal debugger.
+Solution: Check for the response to open the Machine Interface.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.0.1600
+Problem: Crash when setting t_Co to zero when 'termguicolors' is set.
+Solution: Use IS_CTERM instead of checking the number of colors.
+ (closes #2710)
+Files: src/screen.c, src/testdir/test_highlight.vim
+
+Patch 8.0.1601
+Problem: Highlight test fails on Win32.
+Solution: Check for vtp and vcon support.
+Files: src/evalfunc.c, src/testdir/test_highlight.vim
+
+Patch 8.0.1602
+Problem: Crash in parsing JSON.
+Solution: Fail when using array or dict as dict key. (Damien)
+Files: src/json.c, src/testdir/test_json.vim
+
+Patch 8.0.1603
+Problem: Cannot build with +terminal but without +menu.
+Solution: Add #ifdef. (Damien)
+Files: src/terminal.c
+
+Patch 8.0.1604
+Problem: Paste test may fail if $DISPLAY is not set.
+Solution: Add WorkingClipboard() and use it in the paste test.
+Files: src/testdir/shared.vim, src/testdir/test_paste.vim
+
+Patch 8.0.1605
+Problem: Terminal test is a bit flaky.
+Solution: Check for the shell prompt. Use more lambda functions.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1606
+Problem: Singular/plural variants not translated.
+Solution: Add NGETTEXT argument to xgettext. (Sergey Alyoshin)
+Files: src/po/Make_cyg.mak, src/po/Make_ming.mak, src/po/Make_mvc.mak,
+ src/po/Makefile
+
+Patch 8.0.1607
+Problem: --clean loads user settings from .gvimrc.
+Solution: Behave like "-U NONE" was used. (Ken Takata)
+Files: src/main.c, runtime/doc/starting.txt
+
+Patch 8.0.1608
+Problem: Win32: directx not enabled by default.
+Solution: Change Makefile to enable directx by default. (Ken Takata)
+Files: runtime/doc/various.txt, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak
+
+Patch 8.0.1609
+Problem: Shell commands in the GUI use a dumb terminal.
+Solution: Add the "!" flag to 'guioptions' to execute system commands in a
+ special terminal window. Only for Unix now.
+Files: src/os_unix.c, src/option.h, src/evalfunc.c, src/terminal.c,
+ src/proto/terminal.pro, src/channel.c, src/proto/channel.pro,
+ src/vim.h, runtime/doc/options.txt
+
+Patch 8.0.1610 (after 8.0.1609)
+Problem: Cannot build without GUI.
+Solution: Add #ifdef.
+Files: src/terminal.c
+
+Patch 8.0.1611
+Problem: CTRL-W in system terminal does not go to job.
+Solution: Do not use CTRL-W as a terminal command in a system terminal.
+Files: src/terminal.c
+
+Patch 8.0.1612
+Problem: Need to close terminal after shell stopped.
+Solution: Make :terminal without argument close the window by default.
+Files: src/terminal.c, src/testdir/test_terminal.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.0.1613
+Problem: Warning for unused variable in tiny build. (Tony Mechelynck)
+Solution: Move declaration to inner block.
+Files: src/os_unix.c
+
+Patch 8.0.1614
+Problem: "make tags" doesn't include libvterm.
+Solution: Add the libvterm sources to the tags command.
+Files: src/Makefile
+
+Patch 8.0.1615
+Problem: term_dumpload() does not use the right colors.
+Solution: Initialize colors when not using create_vterm().
+Files: src/terminal.c
+
+Patch 8.0.1616
+Problem: Win32: shell commands in the GUI open a new console.
+Solution: Use a terminal window for interactive use when 'guioptions'
+ contains "!".
+Files: src/os_win32.c
+
+Patch 8.0.1617 (after 8.0.1616)
+Problem: Win32: :shell command in the GUI crashes.
+Solution: Handle the situation that "cmd" is NULL. (Yasuhiro Matsumoto,
+ closes #2721)
+Files: src/os_win32.c
+
+Patch 8.0.1618
+Problem: Color Grey50, used for ToolbarLine, is missing in the compiled-in
+ table.
+Solution: Add the color to the list. (Kazunobu Kuriyama)
+Files: src/term.c
+
+Patch 8.0.1619
+Problem: Win32 GUI: crash when winpty is not installed and trying to use
+ :shell in a terminal window.
+Solution: Check for NULL return form term_start(). (Yasuhiro Matsumoto,
+ closes #2727)
+Files: src/os_win32.c
+
+Patch 8.0.1620
+Problem: Reading spell file has no good EOF detection.
+Solution: Check for EOF at every character read for a length field.
+Files: src/misc2.c
+
+Patch 8.0.1621
+Problem: Using invalid default value for highlight attribute.
+Solution: Use zero instead of -1.
+Files: src/syntax.c
+
+Patch 8.0.1622
+Problem: Possible NULL pointer dereference. (Coverity)
+Solution: Reverse the check for a NULL pointer.
+Files: src/quickfix.c
+
+Patch 8.0.1623
+Problem: Terminal kill tests are flaky.
+Solution: Instead of running Vim in a terminal, run it as a normal command.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1624
+Problem: Options for term_dumpdiff() and term_dumpload() not implemented
+ yet.
+Solution: Implement the relevant options.
+Files: src/terminal.c, runtime/doc/eval.txt
+
+Patch 8.0.1625
+Problem: Test_quotestar is flaky when run in GTK GUI.
+Solution: Do not call lose_selection when invoked from
+ selection_clear_event().
+Files: src/gui_gtk_x11.c
+
+Patch 8.0.1626
+Problem: Compiler warning for possible loss of data.
+Solution: Use size_t instead of int. (Christian Brabandt)
+Files: src/terminal.c
+
+Patch 8.0.1627
+Problem: Compiler warning for visibility attribute not supported on MinGW
+ builds.
+Solution: Don't add the attribute when we don't expect it to work.
+ (Christian Brabandt)
+Files: src/libvterm/src/vterm_internal.h
+
+Patch 8.0.1628
+Problem: Channel log doesn't mention exiting.
+Solution: Add a ch_log() call in getout().
+Files: src/main.c
+
+Patch 8.0.1629
+Problem: Mac: getpagesize() is deprecated.
+Solution: Use sysconf() instead. (Ozaki Kiichi, closes #2741)
+Files: src/os_unix.c
+
+Patch 8.0.1630
+Problem: Trimming white space is not that easy.
+Solution: Add the trim() function. (Bukn, Yasuhiro Matsumoto, closes #1280)
+Files: src/evalfunc.c, runtime/doc/eval.txt,
+ src/testdir/test_functions.vim
+
+Patch 8.0.1631
+Problem: Testing with Vim running in terminal is a bit flaky.
+Solution: Delete any .swp file so that later tests don't fail.
+Files: src/testdir/screendump.vim
+
+Patch 8.0.1632
+Problem: In a terminal dump NUL and space considered are different,
+ although they are displayed the same.
+Solution: When encountering NUL handle it like space.
+Files: src/terminal.c
+
+Patch 8.0.1633
+Problem: A TextChanged autocmd triggers when it is defined after creating a
+ buffer.
+Solution: Set b_last_changedtick when opening a buffer. (Hirohito Higashi,
+ closes #2742)
+Files: src/buffer.c, src/testdir/test_autocmd.vim
+
+Patch 8.0.1634
+Problem: The ex_vimgrep() function is too long.
+Solution: Split it in smaller functions. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.0.1635
+Problem: Undefining _POSIX_THREADS causes problems with Python 3. (Micah
+ Bucy, closes #2748)
+Solution: Remove the lines.
+Files: src/if_python3.c
+
+Patch 8.0.1636
+Problem: No test for term_dumpload() and term_dumpdiff().
+Solution: Add tests.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1637
+Problem: No test for term_dumpdiff() options argument.
+Solution: Add a test.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1638
+Problem: Popup test fails depending on environment variable.
+Solution: Reset $COLORFGBG when running Vim in a terminal. (closes #2693)
+Files: src/testdir/screendump.vim
+
+Patch 8.0.1639
+Problem: Libvterm code lags behind master.
+Solution: Sync to head, solve merge problems.
+Files: src/libvterm/README, src/libvterm/bin/unterm.c,
+ src/libvterm/bin/vterm-ctrl.c, src/libvterm/bin/vterm-dump.c,
+ src/libvterm/doc/URLs, src/libvterm/doc/seqs.txt,
+ src/libvterm/include/vterm.h,
+ src/libvterm/include/vterm_keycodes.h, src/libvterm/src/mouse.c,
+ src/libvterm/src/parser.c, src/libvterm/src/pen.c,
+ src/libvterm/src/screen.c, src/libvterm/src/state.c,
+ src/libvterm/src/vterm.c, src/libvterm/src/vterm_internal.h,
+ src/libvterm/t/10state_putglyph.test,
+ src/libvterm/t/25state_input.test, src/libvterm/t/harness.c,
+ src/libvterm/t/26state_query.test
+
+Patch 8.0.1640
+Problem: Test_cwd() is flaky.
+Solution: Add to list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.0.1641
+Problem: Job in terminal can't communicate with Vim.
+Solution: Add the terminal API.
+Files: src/terminal.c, src/buffer.c, src/testdir/test_terminal.vim,
+ src/testdir/screendump.vim, runtime/doc/terminal.txt
+
+Patch 8.0.1642
+Problem: Running Vim in terminal fails with two windows.
+Solution: Pass the number of rows to RunVimInTerminal().
+Files: src/testdir/screendump.vim, src/testdir/test_terminal.vim
+
+Patch 8.0.1643
+Problem: Terminal API tests fail.
+Solution: Explicitly set 'title'.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1644
+Problem: Terminal API tests still fail.
+Solution: Explicitly set 'title' in the terminal job. (Ozaki Kiichi,
+ closes #2750)
+Files: src/testdir/test_terminal.vim, src/testdir/screendump.vim
+
+Patch 8.0.1645
+Problem: Test for terminal response to escape sequence fails for some
+ people. (toothpik)
+Solution: Run "cat" and let it echo the characters.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1646
+Problem: MS-Windows: executable contains unreferenced functions and data.
+Solution: Add /opt:ref to the compiler command. (Ken Takata)
+Files: src/Make_mvc.mak
+
+Patch 8.0.1647
+Problem: Terminal API may call a function not meant to be called by this
+ API.
+Solution: Require the function to start with Tapi_.
+Files: runtime/doc/terminal.txt, src/terminal.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.1648
+Problem: Resource fork tool doesn't work on Python 3.
+Solution: Use "print()" instead of "print". (Marius Gedminas)
+Files: src/dehqx.py
+
+Patch 8.0.1649
+Problem: No completion for argument list commands.
+Solution: Add arglist completion. (Yegappan Lakshmanan, closes #2706)
+Files: runtime/doc/eval.txt, runtime/doc/map.txt, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/proto/ex_cmds2.pro,
+ src/testdir/test_cmdline.vim, src/vim.h
+
+Patch 8.0.1650
+Problem: Too many #ifdefs.
+Solution: Graduate FEAT_LISTCMDS, no reason to leave out buffer commands.
+Files: runtime/doc/various.txt, src/buffer.c, src/charset.c,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/version.c, src/feature.h
+
+Patch 8.0.1651
+Problem: Cannot filter :ls output for terminal buffers.
+Solution: Add flags for terminal buffers. (Marcin Szamotulski, closes #2751)
+Files: runtime/doc/windows.txt, src/buffer.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.1652
+Problem: term_dumpwrite() does not output composing characters.
+Solution: Use the cell index.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1653
+Problem: Screen dump is made too soon.
+Solution: Wait until the ruler is displayed. (Ozaki Kiichi, closes #2755)
+Files: src/testdir/dumps/Test_popup_command_01.dump,
+ src/testdir/dumps/Test_popup_command_02.dump,
+ src/testdir/screendump.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.1654
+Problem: Warnings for conversion of void to function pointer.
+Solution: Use a temp variable that is a function pointer.
+Files: src/if_python.c, src/if_python3.c
+
+Patch 8.0.1655
+Problem: Outdated gdb message in terminal debugger unclear.
+Solution: Specifically mention the required gdb version. Avoid getting
+ stuck on pagination.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.0.1656
+Problem: No option to have xxd produce upper case variable names.
+Solution: Add the -C argument. (Matt Panaro, closes #2772)
+Files: src/xxd/xxd.c
+
+Patch 8.0.1657
+Problem: Crash when reading a channel.
+Solution: Clear the write flag before writing. (idea by Shinya Ohyanagi,
+ closes #2769).
+Files: src/channel.c
+
+Patch 8.0.1658
+Problem: Capitalize argument not available in long form.
+Solution: Recognize -capitalize. Update man page.
+Files: src/xxd/xxd.c, runtime/doc/xxd.1, runtime/doc/xxd.man
+
+Patch 8.0.1659
+Problem: Scroll events not recognized for some xterm emulators.
+Solution: Recognize mouse codes 0x40 and 0x41 as scroll events.
+Files: src/term.c
+
+Patch 8.0.1660
+Problem: The terminal API "drop" command doesn't support options.
+Solution: Implement the options.
+Files: src/terminal.c, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/ex_cmds.h, src/eval.c, src/misc2.c, src/fileio.c,
+ src/testdir/test_terminal.vim, runtime/doc/terminal.txt
+
+Patch 8.0.1661
+Problem: Warnings from 64 bit compiler.
+Solution: Add type casts. (Mike Williams)
+Files: src/terminal.c
+
+Patch 8.0.1662
+Problem: Showing dump diff doesn't mention both file names.
+Solution: Add the file name in the separator line.
+Files: src/terminal.c
+
+Patch 8.0.1663 (after 8.0.1660)
+Problem: Cannot build without multibyte feature.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.0.1664
+Problem: Test failure because of not allocating enough space.
+Solution: Allocate more bytes.
+Files: src/terminal.c
+
+Patch 8.0.1665
+Problem: When running a terminal from the GUI 'term' is not useful.
+Solution: Use $TERM in the GUI if it starts with "xterm". (closes #2776)
+Files: src/os_unix.c, runtime/doc/terminal.txt
+
+Patch 8.0.1666
+Problem: % argument in ch_log() causes trouble.
+Solution: Use string as third argument in internal ch_log(). (Dominique
+ Pelle, closes #2784)
+Files: src/evalfunc.c, src/testdir/test_channel.vim
+
+Patch 8.0.1667
+Problem: Terminal window tests are flaky.
+Solution: Increase the waiting time for Vim to start.
+Files: src/testdir/screendump.vim
+
+Patch 8.0.1668
+Problem: Terminal debugger: can't re-open source code window.
+Solution: Add the :Source command. Also create the window if needed when
+ gdb stops at a source line.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.0.1669
+Problem: :vimgrep may add entries to the wrong quickfix list.
+Solution: Use the list identifier. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1670
+Problem: Terminal window tests are still a bit flaky.
+Solution: Increase the waiting time for the buffer to be created.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1671
+Problem: Crash when passing non-dict argument as env to job_start().
+Solution: Check for valid argument. (Ozaki Kiichi, closes #2765)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 8.0.1672
+Problem: Error during completion causes command to be cancelled.
+Solution: Reset did_emsg before waiting for another character. (Tom M.)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.0.1673
+Problem: Terminal window tests are still a bit flaky.
+Solution: Increase the waiting time even more. (Elimar Riesebieter)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1674
+Problem: Libvterm can't handle a long OSC string that is split.
+Solution: When an incomplete OSC string is received copy it to the parser
+ buffer. Increase the size of the parser buffer to be able to
+ handle longer strings.
+Files: src/libvterm/src/parser.c, src/libvterm/src/vterm.c
+
+Patch 8.0.1675
+Problem: Unused macro argument in libvterm. (Randall W. Morris)
+Solution: Remove the argument.
+Files: src/libvterm/src/parser.c
+
+Patch 8.0.1676
+Problem: No compiler warning for wrong printf format.
+Solution: Add a printf attribute for gcc. Fix reported problems. (Dominique
+ Pelle, closes #2789)
+Files: src/channel.c, src/vim.h, src/proto/channel.pro
+
+Patch 8.0.1677
+Problem: No compiler warning for wrong format in vim_snprintf().
+Solution: Add printf attribute for gcc. Fix reported problems.
+Files: src/vim.h, src/proto.h, src/eval.c, src/fileio.c, src/mbyte.c,
+ src/ops.c, src/spellfile.c, src/undo.c, src/json.c
+
+Patch 8.0.1678
+Problem: Errorformat "%r" implies "%>". (Jan Gosmann)
+Solution: Jump to before setting fmt_ptr. (Yegappan Lakshmanan,
+ closes #2785)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1679
+Problem: Compiler warning for printf format. (Chdiza)
+Solution: Change type to "long long". (closes #2791)
+Files: src/ops.c
+
+Patch 8.0.1680
+Problem: Memory allocated by libvterm does not show up in profile.
+Solution: Pass allocator functions to vterm_new().
+Files: src/terminal.c
+
+Patch 8.0.1681
+Problem: The format attribute fails with MinGW. (John Marriott)
+Solution: Don't use the format attribute with MinGW.
+Files: src/vim.h, src/proto.h, src/channel.c
+
+Patch 8.0.1682
+Problem: Auto indenting breaks inserting a block.
+Solution: Do not check for cursor movement if indent was changed. (Christian
+ Brabandt, closes #2778)
+Files: src/testdir/test_blockedit.vim, src/testdir/Make_all.mak,
+ src/Makefile, src/ops.c
+
+Patch 8.0.1683
+Problem: Python upgrade breaks Vim when defining PYTHON_HOME.
+Solution: Do not define PYTHON_HOME and PYTHON3_HOME in configure. (Naoki
+ Inada, closes #2787)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1684
+Problem: ml_get errors when using terminal window for shell command.
+ (Blay263)
+Solution: Do not change the size of the current window.
+Files: src/terminal.c
+
+Patch 8.0.1685
+Problem: Can't set ANSI colors of a terminal window.
+Solution: Add term_setansicolors(), term_getansicolors() and
+ g:term_ansi_colors. (Andy Massimino, closes #2747)
+Files: runtime/doc/eval.txt, runtime/doc/terminal.txt, src/channel.c,
+ src/evalfunc.c, src/proto/terminal.pro, src/structs.h,
+ src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1686 (after 8.0.1683)
+Problem: Python does not work when configuring with specific dir. (Rajdeep)
+Solution: Do define PYTHON_HOME and PYTHON3_HOME in configure if the Python
+ config dir was specified.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1687
+Problem: 64 bit compiler warnings.
+Solution: change type, add type cast. (Mike Williams)
+Files: src/terminal.c
+
+Patch 8.0.1688
+Problem: Some macros are used without a semicolon, causing auto-indent to be
+ wrong.
+Solution: Use the do-while(0) trick. (Ozaki Kiichi, closes #2729)
+Files: src/buffer.c, src/dosinst.c, src/ex_cmds.c, src/gui_at_sb.c,
+ src/macros.h, src/main.c, src/memline.c, src/option.c,
+ src/os_vms.c, src/screen.c, src/window.c
+
+Patch 8.0.1689
+Problem: No tests for xxd.
+Solution: Add a test. (Christian Brabandt)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Makefile,
+ src/testdir/test_xxd.vim, src/testdir/runtest.vim
+
+Patch 8.0.1690
+Problem: Not easy to run one test with gvim instead of vim.
+Solution: Add VIMTESTTARGET in Makefile.
+Files: src/Makefile
+
+Patch 8.0.1691
+Problem: Xxd test sometimes fails.
+Solution: Wipe out the XXDfile buffer.
+Files: src/testdir/test_xxd.vim
+
+Patch 8.0.1692 (after 8.0.1686)
+Problem: Python may not work when using statically linked library.
+Solution: Do not define PYTHON_HOME and PYTHON3_HOME in configure if the
+ Python library is linked statically.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1693
+Problem: Xxd is excluded from coverage statistics.
+Solution: Don't skip the xxd directory. (Christian Brabandt)
+Files: .travis.yml
+
+Patch 8.0.1694
+Problem: Terminal API test is a bit flaky.
+Solution: Wait longer for Vim to stop.
+Files: src/testdir/screendump.vim
+
+Patch 8.0.1695
+Problem: Xxd test not run on MS-Windows.
+Solution: Use xxd.exe if it exists.
+Files: src/testdir/test_xxd.vim
+
+Patch 8.0.1696
+Problem: Coverage statistics don't work.
+Solution: Include the xxd directory. (Christian Brabandt)
+Files: .travis.yml
+
+Patch 8.0.1697
+Problem: Various tests are still a bit flaky.
+Solution: Increase the default wait time to five seconds.
+Files: src/testdir/shared.vim, src/testdir/screendump.vim,
+ src/testdir/test_channel.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_quotestar.vim, src/testdir/test_terminal.vim
+
+Patch 8.0.1698
+Problem: Coverage statistics don't work on coveralls.
+Solution: Use curly braces for $SRCDIR.
+Files: .travis.yml
+
+Patch 8.0.1699
+Problem: Leftover stuff for Python 1.4.
+Solution: Remove outdated Python 1.4 stuff. (Naoki Inada, closes #2794)
+Files: src/Makefile, src/config.aap.in, src/config.mk.in,
+ src/configure.ac, src/auto/configure
+
+Patch 8.0.1700
+Problem: Coverage statistics still don't work on coveralls.
+Solution: Exclude the xxd directory again.
+Files: .travis.yml
+
+Patch 8.0.1701
+Problem: Can disable COLOR_EMOJI with MSVC but not MinGW.
+Solution: Add COLOR_EMOJI flag. Also add some empty lines for readability.
+Files: src/Make_cyg_ming.mak
+
+Patch 8.0.1702
+Problem: Leaking memory when autocommands make a quickfix list invalid.
+Solution: Call FreeWild(). (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.0.1703
+Problem: In the tutor 'showcmd' is not set.
+Solution: Set 'showcmd' in the vimtutor script. (Ken Takata, closes #2792)
+Files: src/vimtutor
+
+Patch 8.0.1704
+Problem: 'backupskip' default doesn't work for Mac.
+Solution: Use "/private/tmp". (Rainer Müller, closes #2793)
+Files: src/option.c, src/testdir/test_options.vim,
+ runtime/doc/options.txt
+
+Patch 8.0.1705
+Problem: When making a vertical split the mode message isn't always
+ updated, "VISUAL" remains. (Alexei Averchenko)
+Solution: Only reset clear_cmdline when filling all columns of the last
+ screen line. (Tom M. closes #2611)
+Files: src/screen.c, src/testdir/test_window_cmd.vim
+
+Patch 8.0.1706
+Problem: Cannot send CTRL-\ to a terminal window.
+Solution: Make CTRL-W CTRL-\ send CTRL-\ to a terminal window.
+Files: src/terminal.c, runtime/doc/terminal.txt
+
+Patch 8.0.1707
+Problem: When 'wfh' is set ":bel 10new" scrolls window. (Andrew Pyatkov)
+Solution: Set the fraction before changing the window height. (closes #2798)
+Files: src/window.c
+
+Patch 8.0.1708
+Problem: Mkdir with 'p' flag fails on existing directory, which is
+ different from the mkdir shell command.
+Solution: Don't fail if the directory already exists. (James McCoy,
+ closes #2775)
+Files: src/evalfunc.c, src/testdir/test_eval_stuff.vim,
+ runtime/doc/eval.txt
+
+Patch 8.0.1709
+Problem: Some non-C89 code may slip through.
+Solution: Enforce C89 in configure. Fix detected problems. (James McCoy,
+ closes #2735)
+Files: src/channel.c, src/configure.ac, src/auto/configure,
+ src/gui_gtk_x11.c, src/if_python3.c
+
+Patch 8.0.1710
+Problem: Building with Ruby fails.
+Solution: Don't add -ansi when building with Ruby.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1711
+Problem: Term_setsize() is not implemented yet.
+Solution: Implement it.
+Files: src/evalfunc.c, src/terminal.c, src/proto/terminal.pro,
+ src/testdir/test_terminal.vim, runtime/doc/eval.txt
+
+Patch 8.0.1712
+Problem: Terminal scrollback is not limited.
+Solution: Add the 'terminalscroll' option.
+Files: src/terminal.c, src/option.h, src/option.c,
+ runtime/doc/options.txt, runtime/doc/terminal.txt
+
+Patch 8.0.1713
+Problem: Terminal debugger doesn't handle arguments.
+Solution: Use <f-args> and pass all the arguments to gdb, e.g. the core file
+ or process number. (suggested by Christian Brabandt) Disallow
+ starting the debugger twice.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.0.1714
+Problem: Term_setsize() does not give an error in a normal buffer.
+Solution: Add an error message.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1715
+Problem: Terminal buffer can be 1 more than 'terminalscroll' lines.
+Solution: Change > to >=.
+Files: src/terminal.c
+
+Patch 8.0.1716
+Problem: Test for term_setsize() does not give a good error message.
+Solution: use assert_inrange().
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1717
+Problem: C89 check causes too much trouble.
+Solution: Remove enforcing C89 for now.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1718
+Problem: Terminal scrollback test fails on MS-Windows.
+Solution: Check for the last line of output anticipating there might be an
+ empty line below it.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1719
+Problem: Cannot specify which Python executable configure should use.
+Solution: Add --with-python-command and --with-python3-command.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1720
+Problem: When a timer is running a terminal window may not close after a
+ shell has exited.
+Solution: Call job_status() more often.
+Files: src/terminal.c
+
+Patch 8.0.1721
+Problem: No test for using the 'termsize' option.
+Solution: Add a test.
+Files: src/testdir/screendump.vim, src/testdir/test_terminal.vim
+
+Patch 8.0.1722
+Problem: Cannot specify a minimal size for a terminal window.
+Solution: Support the "rows*cols" format for 'winsize'.
+Files: src/terminal.c, src/testdir/test_terminal.vim, src/option.c,
+ runtime/doc/options.txt
+
+Patch 8.0.1723
+Problem: Using one item array size declaration is misleading.
+Solution: Instead of using "[1]" and actually using a larger array, use
+ "[]". This is to verify that this C99 feature works for all
+ compilers.
+Files: src/structs.h, src/getchar.c
+
+Patch 8.0.1724
+Problem: Declarations cannot be halfway a block.
+Solution: Move one declaration to check if this works for all compilers.
+Files: src/main.c
+
+Patch 8.0.1725
+Problem: Terminal debugger doesn't handle command arguments.
+Solution: Add the :TermdebugCommand command. Use a ! to execute right away.
+ (Christian Brabandt)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.0.1726 (after 8.0.1724)
+Problem: Older MSVC doesn't support declarations halfway a block.
+Solution: Move the declaration back to the start of the block.
+Files: src/main.c
+
+Patch 8.0.1727
+Problem: qf_get_properties() function is too long.
+Solution: Refactor the code. (Yegappan Lakshmanan, closes #2807)
+Files: src/quickfix.c
+
+Patch 8.0.1728
+Problem: Condition always false, useless code.
+Solution: Remove the code. (Nikolai Pavlov, closes #2808)
+Files: src/message.c
+
+Patch 8.0.1729
+Problem: No comma after last enum item.
+Solution: Add a few commas to check if this works for all compilers. Also
+ add a few // comments.
+Files: src/structs.h
+
+Patch 8.0.1730
+Problem: No configure check for the used C99 features.
+Solution: Add a compilation check. Tentatively document C99 features.
+Files: src/configure.ac, src/auto/configure, runtime/doc/develop.txt
+
+Patch 8.0.1731
+Problem: Characters deleted on completion. (Adrià Farrés)
+Solution: Also check the last item for the ORIGINAL_TEXT flag. (Christian
+ Brabandt, closes #1645)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.1732
+Problem: Crash when terminal API call deletes the buffer.
+Solution: Lock the buffer while calling a function. (closes #2813)
+Files: src/buffer.c, src/terminal.c, src/testdir/test_terminal.vim,
+ src/testdir/test_autocmd.vim
+
+Patch 8.0.1733
+Problem: Incomplete testing for completion fix. (Lifepillar)
+Solution: Add a test with CTRL-P.
+Files: src/testdir/test_popup.vim
+
+Patch 8.0.1734
+Problem: Package directory not added to 'rtp' if prefix matches.
+Solution: Check the match is a full match. (Ozaki Kiichi, closes #2817)
+ Also handle different ways of spelling a path.
+Files: src/testdir/test_packadd.vim, src/ex_cmds2.c
+
+Patch 8.0.1735 (after 8.0.1723 and 8.0.1730)
+Problem: Flexible array member feature not supported by HP-UX. (John
+ Marriott)
+Solution: Do not use the flexible array member feature of C99.
+Files: src/configure.ac, src/auto/configure, src/structs.h,
+ src/getchar.c, runtime/doc/develop.txt
+
+Patch 8.0.1736
+Problem: Check for C99 features is incomplete.
+Solution: Use AC_PROG_CC_C99 and when C99 isn't fully supported check the
+ features we need. (James McCoy, closes #2820)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1737
+Problem: fchown() used when it is not supported.
+Solution: Add #ifdef.
+Files: src/fileio.c
+
+Patch 8.0.1738
+Problem: ":args" output is hard to read.
+Solution: Make columns with the names if the output is more than one line.
+Files: src/ex_cmds2.c, src/version.c, src/proto/version.pro,
+ src/testdir/test_arglist.vim
+
+Patch 8.0.1739
+Problem: MS-Windows with msys2 cannot build Ruby statically.
+Solution: Define RUBY_VERSION. (Gray Wolf, closes #2826)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.0.1740
+Problem: Warning for signed-unsigned incompatibility.
+Solution: Change type from "char *" to "char_u *". (John Marriott)
+Files: src/ex_cmds2.c
+
+Patch 8.0.1741
+Problem: MS-Windows with msys2 cannot build Ruby statically.
+Solution: Add RUBY_VERSION to CFLAGS later. (Gray Wolf, closes #2833)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.0.1742
+Problem: Cannot get a list of all the jobs. Cannot get the command of
+ the job.
+Solution: When job_info() is called without an argument return a list of
+ jobs. Otherwise, include the command that the job is running.
+ (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/channel.c, src/evalfunc.c,
+ src/proto/channel.pro, src/structs.h, src/testdir/test_channel.vim
+
+Patch 8.0.1743
+Problem: Terminal window options are named inconsistently.
+Solution: prefix terminal window options with "termwin". Keep the old names
+ for now as an alias.
+Files: src/option.c, src/option.h, src/structs.h, src/terminal.c,
+ src/testdir/test_terminal.vim, src/testdir/gen_opt_test.vim,
+ runtime/doc/options.txt, runtime/doc/quickref.txt,
+ runtime/doc/terminal.txt, runtime/optwin.vim
+
+Patch 8.0.1744
+Problem: On some systems /dev/stdout isn't writable.
+Solution: Skip test if writing is not possible. (James McCoy, closes #2830)
+Files: src/testdir/test_writefile.vim
+
+Patch 8.0.1745
+Problem: Build failure on MS-Windows.
+Solution: Build job arguments for MS-Windows. Fix allocating job twice.
+Files: src/structs.h, src/channel.c, src/os_unix.c, src/misc2.c,
+ src/terminal.c, src/proto/misc2.pro
+
+Patch 8.0.1746
+Problem: MS-Windows: channel tests fail.
+Solution: Make a copy of the command before splitting it.
+Files: src/channel.c
+
+Patch 8.0.1747
+Problem: MS-Windows: term_start() does not set job_info() cmd.
+Solution: Share the code from job_start() to set jv_argv.
+Files: src/testdir/test_terminal.vim, src/channel.c, src/misc2.c,
+ src/proto/misc2.pro, src/terminal.c
+
+Patch 8.0.1748
+Problem: CmdlineEnter command uses backslash instead of slash.
+Solution: Don't treat the character as a file name. (closes #2837)
+Files: src/fileio.c, src/testdir/test_autocmd.vim
+
+Patch 8.0.1749
+Problem: VMS: 100% CPU use, redefining mch_open() and mch_fopen() fails.
+Solution: Do not wait indefinitely in RealWaitForChar(). (Neil Rieck)
+ Do not redefine mch_open() and mch_fopen() on VMS. (Zoltan
+ Arpadffy)
+Files: src/os_vms.c, src/vim.h
+
+Patch 8.0.1750
+Problem: Crash when clearing location list in autocommand.
+Solution: Check if "qi" equals "ql_info". (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1751
+Problem: #ifdef causes bad highlighting.
+Solution: Move code around. (Ozaki Kiichi, closes #2731)
+Files: src/ui.c
+
+Patch 8.0.1752
+Problem: qf_set_properties() is to long.
+Solution: Refactor the function. Define INVALID_QFIDX. (Yegappan
+ Lakshmanan, closes #2812)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1753
+Problem: Various warnings from a static analyser
+Solution: Add type casts, remove unneeded conditions. (Christian Brabandt,
+ closes #2770)
+Files: src/evalfunc.c, src/ex_cmds2.c, src/fileio.c, src/getchar.c,
+ src/normal.c, src/os_unix.c, src/search.c, src/term.c
+
+Patch 8.0.1754
+Problem: ex_helpgrep() is too long.
+Solution: Refactor the function. (Yegappan Lakshmanan, closes #2766)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1755
+Problem: MS-Windows GUI: high unicode char received as two utf-16 words.
+Solution: Keep the first word until the second word is received. (Chris
+ Morgan, closes #2800)
+Files: src/gui_w32.c
+
+Patch 8.0.1756
+Problem: GUI: after prompting for a number the mouse shape is sometimes
+ wrong.
+Solution: Call setmouse() after setting "State". (Hirohito Higashi,
+ closes #2709)
+Files: src/misc1.c
+
+Patch 8.0.1757
+Problem: Unnecessary changes in libvterm.
+Solution: Bring back // comments and trailing comma in enums.
+Files: src/libvterm/bin/unterm.c, src/libvterm/bin/vterm-ctrl.c,
+ src/libvterm/bin/vterm-dump.c, src/libvterm/include/vterm.h,
+ src/libvterm/include/vterm_keycodes.h,
+ src/libvterm/src/encoding.c, src/libvterm/src/keyboard.c,
+ src/libvterm/src/parser.c, src/libvterm/src/pen.c,
+ src/libvterm/src/screen.c, src/libvterm/src/state.c,
+ src/libvterm/src/unicode.c, src/libvterm/src/utf8.h,
+ src/libvterm/src/vterm.c, src/libvterm/src/vterm_internal.h
+
+Patch 8.0.1758
+Problem: open_line() returns TRUE/FALSE for success/failure.
+Solution: Return OK or FAIL.
+Files: src/misc1.c, src/normal.c, src/edit.c
+
+Patch 8.0.1759
+Problem: Memory leak from duplicate options. (Yegappan Lakshmanan)
+Solution: Don't set the default value twice.
+Files: src/option.c
+
+Patch 8.0.1760
+Problem: Wrong number of arguments to vms_read().
+Solution: Drop the first argument. (Ozaki Kiichi)
+Files: src/ui.c
+
+Patch 8.0.1761
+Problem: Job in terminal window with no output channel is killed.
+Solution: Keep the job running when the input is a tty. (Ozaki Kiichi,
+ closes #2734)
+Files: src/channel.c, src/os_unix.c, src/testdir/test_channel.vim
+
+Patch 8.0.1762
+Problem: Terminal debug logging is a bit complicated.
+Solution: Make log_tr() use variable arguments (Ozaki Kiichi, closes #2730)
+Files: src/term.c
+
+Patch 8.0.1763
+Problem: :argedit does not reuse an empty unnamed buffer.
+Solution: Add the BLN_CURBUF flag and fix all the side effects. (Christian
+ Brabandt, closes #2713)
+Files: src/buffer.c, src/ex_cmds2.c, src/proto/buffer.pro,
+ src/testdir/test_arglist.vim, src/testdir/test_command_count.vim
+
+Patch 8.0.1764
+Problem: Lgtm considers tutor.es to be EcmaScript.
+Solution: Add a config file for lgtm. (Bas van Schaik, closes #2844)
+Files: .lgtm.yml, Filelist
+
+Patch 8.0.1765
+Problem: CTRL-G j in Insert mode is incorrect when 'virtualedit' is set.
+Solution: Take coladd into account. (Christian Brabandt, closes #2743)
+Files: src/charset.c, src/testdir/test_virtualedit.vim
+
+Patch 8.0.1766 (after 8.0.1758)
+Problem: Expanding abbreviation doesn't work. (Tooth Pik)
+Solution: Return OK instead of FALSE and FAIL instead of TRUE. (Christian
+ Brabandt)
+Files: src/edit.c, src/testdir/test_mapping.vim
+
+Patch 8.0.1767
+Problem: With 'incsearch' text may jump up and down. ()
+Solution: Besides w_botline also save and restore w_empty_rows.
+ (closes #2530)
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_scrolling_01.dump
+
+Patch 8.0.1768
+Problem: SET_NO_HLSEARCH() used in a wrong way.
+Solution: Make it a function. (suggested by Dominique Pelle,
+ closes #2850)
+Files: src/vim.h, src/ex_docmd.c, src/proto/ex_docmd.pro, src/search.c,
+ src/ex_getln.c, src/option.c, src/screen.c, src/tag.c
+
+Patch 8.0.1769
+Problem: Repeated saving and restoring viewstate for 'incsearch'.
+Solution: Use a structure.
+Files: src/ex_getln.c
+
+Patch 8.0.1770
+Problem: Assert functions don't return anything.
+Solution: Return non-zero when the assertion fails.
+Files: src/evalfunc.c, src/eval.c, src/proto/eval.pro,
+ src/testdir/test_assert.vim, runtime/doc/eval.txt
+
+Patch 8.0.1771
+Problem: In tests, when WaitFor() fails it doesn't say why. (James McCoy)
+Solution: Add WaitForAssert(), which produces an assert error when it fails.
+Files: src/testdir/shared.vim, src/testdir/test_terminal.vim,
+ src/testdir/screendump.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_channel.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_job_fails.vim
+
+Patch 8.0.1772
+Problem: Quickfix: mixup of FALSE and FAIL, returning -1.
+Solution: Use FAIL and INVALID_QFIDX. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.0.1773
+Problem: Dialog messages are not translated.
+Solution: Add N_() and _() where needed. (Sergey Alyoshin)
+Files: src/diff.c, src/ex_cmds2.c, src/ex_docmd.c, src/message.c,
+ src/po/Make_cyg.mak, src/po/Make_ming.mak, src/po/Make_mvc.mak,
+ src/po/Makefile, src/quickfix.c, src/vim.h
+
+Patch 8.0.1774
+Problem: Reading very long lines can be slow.
+Solution: Read up to 1 Mbyte at a time to avoid a lot of copying. Add a
+ check for going over the column limit.
+Files: src/fileio.c
+
+Patch 8.0.1775
+Problem: MS-Windows: warning for unused variable.
+Solution: Move declaration inside #ifdef. (Mike Williams)
+Files: src/channel.c
+
+Patch 8.0.1776
+Problem: In tests, when WaitFor() fails it doesn't say why.
+Solution: Turn a few more WaitFor() into WaitForAssert().
+Files: src/testdir/test_popup.vim, src/testdir/test_quotestar.vim,
+ src/testdir/test_search.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_timers.vim
+
+Patch 8.0.1777
+Problem: Cannot cleanup before loading another colorscheme.
+Solution: Add the ColorSchemePre autocommand event.
+Files: src/fileio.c, src/syntax.c, src/vim.h, src/testdir/test_gui.vim,
+ runtime/colors/README.txt
+
+Patch 8.0.1778
+Problem: Script to check translations does not always work.
+Solution: Go to first line before searching for MIME.
+Files: src/po/check.vim
+
+Patch 8.0.1779
+Problem: Deleting in a block selection causes problems.
+Solution: Check the length of the line before adding bd.textcol and
+ bd.textlen. (Christian Brabandt, closes #2825)
+Files: src/ops.c, src/testdir/test_blockedit.vim
+
+Patch 8.0.1780
+Problem: Test fails because Vim in a terminal uses wrong 'encoding'.
+Solution: Set encoding in the test where it matters. (James McCoy,
+ closes #2847)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1781
+Problem: File names in quickfix window are not always shortened.
+Solution: Shorten the file name when opening the quickfix window. (Yegappan
+ Lakshmanan, closes #2851, closes #2846)
+Files: src/testdir/test_quickfix.vim, src/fileio.c, src/proto/fileio.pro,
+ src/quickfix.c
+
+Patch 8.0.1782
+Problem: No simple way to label quickfix entries.
+Solution: Add the "module" item, to be used instead of the file name for
+ display purposes. (Marcin Szamotulski, closes #1757)
+Files: runtime/doc/eval.txt, runtime/doc/quickfix.txt, src/alloc.h,
+ src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1783
+Problem: Cannot use 256 colors in a MS-Windows console.
+Solution: Add 256 color support. (Nobuhiro Takasaki, closes #2821)
+Files: src/misc1.c, src/option.c, src/os_win32.c, src/proto/os_win32.pro,
+ src/term.c, src/proto/term.pro, src/terminal.c
+
+Patch 8.0.1784 (after 8.0.1782)
+Problem: Gvim test gets stuck in dialog.
+Solution: Rename the file used.
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.0.1785 (after 8.0.1783)
+Problem: Missing symbol in Win32 small build.
+Solution: Define VTERM_ANSI_INDEX_NONE without the terminal feature. Also
+ fix unused function with #ifdef.
+Files: src/term.c, src/os_win32.c
+
+Patch 8.0.1786
+Problem: No test for 'termwinkey'.
+Solution: Add a test. Make feedkeys() handle terminal_loop() returning
+ before characters are consumed.
+Files: src/testdir/test_terminal.vim, src/terminal.c, src/evalfunc.c,
+ src/ex_docmd.c, src/getchar.c, src/keymap.h
+
+Patch 8.0.1787
+Problem: Cannot insert the whole cursor line.
+Solution: Make CTRL-R CTRL-L work. (Andy Massimino, closes #2857)
+Files: runtime/doc/cmdline.txt, src/ex_getln.c, src/ops.c,
+ src/testdir/test_cmdline.vim
+
+Patch 8.0.1788
+Problem: Tool to check a color scheme is not installed.
+Solution: Update the install rule. (Christian Brabandt)
+Files: src/Makefile
+
+Patch 8.0.1789
+Problem: BufWinEnter does not work well for a terminal window.
+Solution: Do not trigger BufWinEnter when opening a terminal window.
+Files: src/terminal.c, runtime/doc/autocmd.txt,
+ src/testdir/test_terminal.vim
+
+Patch 8.0.1790
+Problem: 'winfixwidth' is not always respected by :close.
+Solution: Prefer a frame without 'winfixwidth' or 'winfixheight'. (Jason
+ Franklin)
+Files: src/window.c, src/testdir/test_winbuf_close.vim
+
+Patch 8.0.1791
+Problem: Using uint8_t does not work everywhere.
+Solution: Use char_u instead.
+Files: src/term.c, src/proto/term.pro, src/os_win32.c
+
+Patch 8.0.1792
+Problem: MS-Windows users expect -? to work like --help.
+Solution: Add -?. (Christian Brabandt, closes #2867)
+Files: src/main.c
+
+Patch 8.0.1793
+Problem: No test for "vim -g".
+Solution: Add a test for "-g" and "-y".
+Files: src/testdir/shared.vim, src/testdir/test_gui.vim
+
+Patch 8.0.1794
+Problem: Duplicate term options after renaming.
+Solution: Remove the old names 'termkey', 'termsize' and 'terminalscroll'.
+Files: src/option.c, src/terminal.c, src/option.h,
+ src/testdir/gen_opt_test.vim, src/testdir/screendump.vim
+
+Patch 8.0.1795
+Problem: Lose contact with jobs when :gui forks.
+Solution: Don't fork when there is a running job. Make log message for a
+ died job clearer. Also close the terminal when stderr and stdout
+ are the same FD.
+Files: src/gui.h, src/gui.c, src/channel.c, src/proto/channel.pro,
+ src/os_unix.c, src/terminal.c
+
+Patch 8.0.1796
+Problem: GUI: click on tab fails when the focus is in a terminal window.
+Solution: Handle K_TABLINE.
+Files: src/terminal.c
+
+Patch 8.0.1797
+Problem: Terminal window is redrawn too often and scrolling is repeated.
+Solution: Don't scroll immediately but only when redrawing. Avoid redrawing
+ the whole terminal window on every change.
+Files: src/terminal.c, src/screen.c, src/proto/terminal.pro
+
+Patch 8.0.1798
+Problem: MS-Windows: file considered read-only when another program has
+ opened it.
+Solution: Pass file sharing flag to CreateFile(). (Linwei, closes #2860)
+Files: src/os_win32.c
+
+Patch 8.0.1799
+Problem: No test for :registers command.
+Solution: Add a test. (Dominique Pelle, closes #2880)
+Files: src/testdir/test_registers.vim
+
+Patch 8.0.1800
+Problem: X11: getting color is slow.
+Solution: Avoid using sprintf() and XParseColor(), put the RGB values in
+ XColor directly.
+Files: src/gui_x11.c
+
+Patch 8.0.1801
+Problem: MS-Windows: redirecting terminal output does not work.
+Solution: Intercept the text written to the terminal and write it to the
+ file.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1802 (after 8.0.1802)
+Problem: MS-Windows: terminal test fails.
+Solution: Close redirected output file earlier.
+Files: src/terminal.c
+
+Patch 8.0.1803
+Problem: Warning for uninitialized variable. (Tony Mechelynck)
+Solution: Initialize it.
+Files: src/terminal.c
+
+Patch 8.0.1804
+Problem: Using :normal in terminal window causes problems. (Dominique
+ Pelle)
+Solution: Don't call terminal_loop() for :normal. (closes #2886)
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/evalfunc.c
+
+Patch 8.0.1805
+Problem: qf_parse_line() is too long.
+Solution: Split it in parts. Properly handle vim_realloc() failing.
+ (Yegappan Lakshmanan, closes #2881)
+Files: src/quickfix.c
+
+Patch 8.0.1806
+Problem: InsertCharPre causes problems for autocomplete. (Lifepillar)
+Solution: Check for InsertCharPre before calling vpeekc(). (Christian
+ Brabandt, closes #2876)
+Files: src/edit.c, src/testdir/test_popup.vim
+
+Patch 8.0.1807
+Problem: Function to set terminal name is too long.
+Solution: Refactor the function. Fix typo in test.
+Files: src/term.c, src/testdir/test_options.vim
+
+Patch 8.0.1808 (after 8.0.1807)
+Problem: Can't build without TGETENT.
+Solution: Add #ifdef
+Files: src/term.c
+
+Patch 8.0.1809
+Problem: Various typos.
+Solution: Correct the mistakes, change "cursur" to "cursor". (closes #2887)
+Files: src/edit.c, src/normal.c, src/screen.c, src/proto/screen.pro,
+ src/ui.c
+
+Patch 8.0.1810
+Problem: Buffer of a terminal only updated in Terminal-Normal mode.
+Solution: Copy the terminal window content to the buffer when in
+ Terminal-Job mode.
+Files: src/terminal.c, src/proto/terminal.pro, src/ex_cmds2.c,
+ src/proto/ex_cmds2.pro
+
+Patch 8.0.1811
+Problem: No test for winrestcmd().
+Solution: Add a test. (Dominique Pelle, closes #2894)
+Files: src/testdir/test_window_cmd.vim
+
+Patch 8.0.1812
+Problem: The qf_jump_to_usable_window() function is too long.
+Solution: Split it in parts. (Yegappan Lakshmanan, closes #2891)
+Files: src/quickfix.c
+
+Patch 8.0.1813
+Problem: Windows installer doesn't install terminal debugger.
+Solution: Add the package to the list of files to install.
+Files: nsis/gvim.nsi
+
+Patch 8.0.1814
+Problem: Crash with terminal window and with 'lazyredraw' set. (Antoine)
+Solution: Check the terminal still exists after update_screen().
+Files: src/terminal.c
+
+Patch 8.0.1815 (after 8.0.1814)
+Problem: Still a crash with terminal window and with 'lazyredraw' set.
+ (Antoine)
+Solution: Do not wipe out the buffer when updating the screen.
+Files: src/terminal.c, src/proto/terminal.pro, src/screen.c,
+ src/proto/screen.pro, src/ui.c
+
+Patch 8.0.1816
+Problem: No test for setcmdpos().
+Solution: Add a test. (Dominique Pelle, closes #2901)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.0.1817
+Problem: A timer may change v:count unexpectedly.
+Solution: Save and restore v:count and similar variables when a timer
+ callback is invoked. (closes #2897)
+Files: src/eval.c, src/proto/eval.pro, src/ex_cmds2.c, src/structs.h,
+ src/testdir/test_timers.vim
+
+Patch 8.0.1818 (after 8.0.1810)
+Problem: Lines remove from wrong buffer when using terminal window.
+Solution: Make sure to use tl_buffer.
+Files: src/terminal.c
+
+Patch 8.0.1819
+Problem: Swap file warning for a file in a non-existing directory, if there
+ is another with the same file name. (Juergen Weigert)
+Solution: When expanding the file name fails compare the file names.
+Files: src/testdir/test_swap.vim, src/memline.c
+
+Patch 8.0.1820
+Problem: Terminal window redirecting stdout does not show stderr. (Matéo
+ Zanibelli)
+Solution: When stdout is not connected to pty_master_fd then use it for
+ stderr. (closes #2903)
+Files: src/os_unix.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1821
+Problem: Cursor in terminal window moves when pressing CTRL-W. (Dominique
+ Pelle)
+Solution: Do not more the cursor or redraw when not in Terminal-Normal mode.
+ (closes #2904)
+Files: src/terminal.c
+
+Patch 8.0.1822
+Problem: Make uninstall does not remove colors/tools.
+Solution: Add a line to delete the tools directory. (Kazunobu Kuriyama)
+Files: src/Makefile
+
+Patch 8.0.1823
+Problem: Test for terminal stdout redirection is flaky.
+Solution: Wait for the job to finish.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.0.1824
+Problem: Coverity warns for variable that may be uninitialized.
+Solution: Initialize the variable.
+Files: src/terminal.c
+
+Patch 8.0.1825
+Problem: Might use NULL pointer when out of memory. (Coverity)
+Solution: Handle NULL pointer better.
+Files: src/getchar.c
+
+Patch 8.0.1826
+Problem: Configure uses old compiler flag.
+Solution: Remove _DARWIN_C_SOURCE. (Kazunobu Kuriyama)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.0.1827
+Problem: Compiler warning for signed/unsigned char pointers. (Cesar Romani)
+Solution: Change the type of jv_argv.
+Files: src/channel.c, src/structs.h
+
+Patch 8.0.1828
+Problem: Get no clue why :gui does not fork.
+Solution: Add a channel log message.
+Files: src/channel.c
+
+Patch 8.0.1829
+Problem: MS-Windows: script for vimdiff can't handle ! chars.
+Solution: Escape the ! chars. (Hans Ginzel, closes #2896)
+Files: src/dosinst.c
+
+Patch 8.0.1830
+Problem: Switching to Terminal-Normal mode does not redraw. (Dominique
+ Pelle)
+Solution: Also redraw when not updating the snapshot. (closes #2904)
+Files: src/terminal.c
+
+Patch 8.0.1831
+Problem: Sometimes the quickfix title is incorrectly prefixed with ':'.
+Solution: Prepend the colon in another way. (Yegappan Lakshmanan, closes
+ #2905)
+Files: src/evalfunc.c, src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.0.1832
+Problem: Cannot use :unlet for an environment variable.
+Solution: Make it work. Use unsetenv() if available. (Yasuhiro Matsumoto,
+ closes #2855)
+Files: runtime/doc/eval.txt, src/config.h.in, src/configure.ac,
+ src/auto/configure, src/eval.c, src/misc1.c, src/proto/misc1.pro,
+ src/testdir/test_unlet.vim
+
+Patch 8.0.1833
+Problem: X11: ":echo 3.14" gives E806.
+Solution: set LC_NUMERIC to "C". (Dominique Pelle, closes #2368)
+Files: src/gui_x11.c
+
+Patch 8.0.1834
+Problem: GUI: find/replace dialog does not handle some chars properly.
+Solution: Escape '?' when needed. Always escape backslash. (closes #2418,
+ closes #2435)
+Files: src/gui.c
+
+Patch 8.0.1835
+Problem: Print document name does not support multibyte.
+Solution: Use StartDocW() if needed. (Yasuhiro Matsumoto, closes #2478)
+Files: src/os_mswin.c
+
+Patch 8.0.1836
+Problem: Buffer-local window options may not be recent if the buffer is
+ still open in another window.
+Solution: Copy the options from the window instead of the outdated window
+ options. (Bjorn Linse, closes #2336)
+Files: src/buffer.c, src/testdir/test_options.vim
+
+Patch 8.0.1837
+Problem: One character cmdline abbreviation not triggered after '<,'>.
+Solution: Skip over the special range. (Christian Brabandt, closes #2320)
+Files: src/ex_getln.c, src/testdir/test_mapping.vim
+
+Patch 8.0.1838
+Problem: Cursor in wrong position when switching to Terminal-Normal mode.
+ (Dominique Pelle)
+Solution: Move to the end of the line if coladvance() fails. Do not take a
+ snapshot a second time.
+Files: src/terminal.c
+
+Patch 8.0.1839
+Problem: Script to check .po file doesn't check for plural header.
+Solution: Add a check that the plural header is present when needed.
+Files: src/po/check.vim
+
+Patch 8.0.1840
+Problem: getwinpos() is not tested.
+Solution: Add a test. (Dominique Pelle, closes #2911)
+Files: src/testdir/test_gui.vim
+
+Patch 8.0.1841
+Problem: HP-UX does not have setenv().
+Solution: Use vim_setenv(). (John Marriott)
+Files: src/misc1.c
+
+Patch 8.0.1842
+Problem: Popup menu inside terminal window isn't cleared.
+Solution: Use NOT_VALID in pum_undisplay(). (suggested by Christian
+ Brabandt, closes #2908)
+Files: src/popupmnu.c
+
+Patch 8.0.1843
+Problem: Entry for 'wrap' in options window is wrong. (John Little)
+Solution: Make the change apply locally.
+Files: runtime/optwin.vim
+
+Patch 8.0.1844
+Problem: Superfluous quickfix code, missing examples.
+Solution: Remove unneeded code. Add a few examples. Add a bit more
+ testing. (Yegappan Lakshmanan, closes #2916)
+Files: runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.0.1845
+Problem: Various comment updates needed, missing white space.
+Solution: Update comments, add white space.
+Files: src/getchar.c, src/testdir/test_cscope.vim, src/gui_mac.c
+
+Patch 8.0.1846
+Problem: Python interface is incompatible with lldb.
+Solution: For OutputType set the base to be PyFile_Type. (Boxu Zhang)
+ Partly disabled to avoid a crash.
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 8.0.1847
+Problem: Some build options don't have an example.
+Solution: Add a couple more examples and compiler flags.
+Files: src/Makefile
+
+Patch 8.0.1848
+Problem: 'termwinscroll' does not work properly. (Dominique Pelle)
+Solution: Subtract removed scrollback from the scrollback count. Add a test
+ for 'termwinscroll'. (closes #2909)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.0.1849
+Problem: Compiler warning for unused arguments and missing prototype.
+Solution: Add UNUSED. Add static.
+Files: src/mbyte.c, src/if_ruby.c
+
+Patch 8.0.1850
+Problem: Todo items in source code not visible for users.
+Solution: Move the todo items to the help file.
+Files: src/terminal.c
+
+
+==============================================================================
+VERSION 8.2 *version-8.2* *version8.2* *vim-8.2*
+
+This section is about improvements made between version 8.1 and 8.2.
+
+This release has hundreds of bug fixes, there are several new features and
+there are many minor improvements.
+
+
+Popup windows *new-popup-window*
+-------------
+
+Popup windows can be used to display text on top of other windows. This can
+be for a simple message such as "Build finished successfully", showing a
+function prototype while editing a function call, a flexible popup menu and
+many other purposes. See |popup-window|.
+
+Popup windows are very flexible: they can be positioned relative to text, an
+absolute position or just in the middle of the screen. The size can be fixed
+or adjusts to fit the text. A "zindex" value specifies what popup window goes
+on top of others.
+
+The new 'wincolor' option allows for setting the color for the whole popup
+window. This also works for normal windows.
+
+
+Text properties *new-text-properties*
+---------------
+
+Text properties give a plugin author flexibility about what to highlight.
+This can be used with an external asynchronous parser to do syntax
+highlighting. Or to highlight text in a popup window. The text properties
+stick with the text when characters are deleted or inserted, which makes them
+also useful as text markers. See |text-properties|.
+
+The listener functions have been added to report text changes to a server so
+that it can dynamically update highlighting, mark syntax errors and the like.
+See |listener_add()|.
+
+
+Vim script improvements *new-vimscript-8.2*
+-----------------------
+
+Functions can now be called in a chain, using "->": >
+ mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
+The new `:eval` command can be used if the chain has no result.
+
+Function arguments can be made optional by giving them a default value
+|optional-function-argument|: >
+ function Something(key, value = 10)
+
+The `:scriptversion` command was added to allow for changes that are not
+backwards compatible. E.g. to only use ".." for string concatenation, so that
+"." can be used to access a dictionary member consistently.
+
+`:const` was added to allow for declaring a variable that cannot change: >
+ const TIMER_DELAY = 400
+
+A heredoc-style assignment was added to easily assign a list of lines to a
+variable without quoting or line continuation: >
+ let lines =<< trim END
+ line one
+ line two
+ END
+
+The |Blob| type was added. This makes it easy to deal with binary data.
+
+The /= and %= assignment operators were added.
+
+A Dictionary can be defined with literal keys using #{}. This avoids having
+to use a lot of quotes: >
+ let options = #{width: 30, height: 24}
+
+
+Other improvements *new-other-8.2*
+------------------
+
+- When 'incsearch' is set it also applies to `:substitute`.
+- |modifyOtherKeys| was added to allow mapping more key combinations.
+- ConPTY support was added for Windows 10, supports full color in the terminal.
+- The MS-Windows installer supports translations, silent install and looks
+ much better.
+
+
+Changed *changed-8.2*
+-------
+
+The xdiff library was included to avoid the need for an external diff program
+and to make updating diffs much faster.
+
+The code is using a few more modern C features, such as // comments.
+
+Support for old compilers has been dropped: Borland C++, MSVC 2008.
+
+Hangul input support was removed, it actually didn't work anymore.
+
+Makefiles for old Amiga compilers were removed: Dice, Manx and SAS.
+
+If a swap file is found without any changes it is automatically deleted.
+
+The FEAT_TAG_OLDSTATIC code was removed, it slowed down tag searches.
+The FEAT_TAG_ANYWHITE code was removed, it was not enabled in any build.
+The UNICODE16 code was removed, it was not useful.
+Workshop support was removed, nobody was using it.
+The Aap build files were removed, they were outdated.
+Farsi support was removed, it was outdated and unused.
+
+VIMDLL was re-implemented, this shares the common parts between vim and gvim
+to reduce the total install size.
+
+The following features are now included in all versions: |+multi_byte|,
+|+virtualedit|, |+vreplace|, |+localmap|, |+cmdline_hist|, |+cmdline_compl|,
+|+insert_expand|, |+modify_fname|, |+comments|
+
+
+Added *added-8.2*
+-----
+
+Added functions:
+ All the popup_ functions.
+ All the prop_ functions.
+ All the sign_ functions.
+ All the sound_ functions.
+
+ |appendbufline()|
+ |balloon_gettext()|
+ |bufadd()|
+ |bufload()|
+ |ch_readblob()|
+ |chdir()|
+ |debugbreak()|
+ |deletebufline()|
+ |environ()|
+ |expandcmd()|
+ |getenv()|
+ |getimstatus()|
+ |getmousepos()|
+ |gettagstack()|
+ |interrupt()|
+ |isinf()|
+ |list2str()|
+ |listener_add()|
+ |listener_flush()|
+ |listener_remove()|
+ |prompt_setcallback()|
+ |prompt_setinterrupt()|
+ |prompt_setprompt()|
+ |pum_getpos()|
+ |rand()|
+ |readdir()|
+ |reg_executing()|
+ |reg_recording()|
+ |rubyeval()|
+ |screenchars()|
+ |screenpos()|
+ |screenstring()|
+ |setenv()|
+ |settagstack()|
+ |srand()|
+ |state()|
+ |str2list()|
+ |strptime()|
+ |swapinfo()|
+ |swapname()|
+ |term_setapi()|
+ |test_getvalue()|
+ |test_null_blob()|
+ |test_refcount()|
+ test_scrollbar() (later replaced with |test_gui_event()|)
+ |test_setmouse()|
+ |win_execute()|
+ |win_splitmove()|
+ |winlayout()|
+
+Added autocommands:
+ |CompleteChanged|
+ |DiffUpdated|
+ |SafeState|
+ |SafeStateAgain|
+ |SourcePost|
+ |TerminalWinOpen|
+
+Added commands:
+ Jumping to errors relative to the cursor position:
+ `:cabove`
+ `:cafter`
+ `:cbefore`
+ `:cbelow`
+ `:labove`
+ `:lbefore`
+ `:lbelow`
+ `:lafter`
+ Tab-local directory:
+ `:tcd`
+ `:tchdir`
+ Others:
+ `:const`
+ `:eval`
+ `:redrawtabline`
+ `:scriptversion`
+ `:spellrare`
+ `:tlmenu`
+ `:tlnoremenu`
+ `:tlunmenu`
+ `:xrestore`
+
+Added options:
+ 'completepopup'
+ 'completeslash'
+ 'cursorlineopt'
+ 'modelineexpr'
+ 'previewpopup'
+ 'scrollfocus'
+ 'tagfunc'
+ 'termwintype'
+ 'varsofttabstop'
+ 'vartabstop'
+ 'wincolor'
+
+
+Patches *patches-8.2*
+-------
+
+These patches were applied after the 8.1 release and are included in the 8.2
+release.
+
+Patch 8.1.0001
+Problem: The netrw plugin does not work.
+Solution: Make it accept version 8.x.
+Files: runtime/autoload/netrw.vim
+
+Patch 8.1.0002
+Problem: :stopinsert changes the message position.
+Solution: Save and restore msg_col and msg_row in clearmode(). (Jason
+ Franklin)
+Files: src/screen.c, src/testdir/test_messages.vim
+
+Patch 8.1.0003
+Problem: The :compiler command is not tested.
+Solution: Add a test. (Dominique Pelle, closes #2930)
+Files: src/Makefile, src/testdir/test_alot.vim,
+ src/testdir/test_compiler.vim
+
+Patch 8.1.0004
+Problem: Test for :compiler command sometimes fails.
+Solution: Be less strict about the error message. (Dominique Pelle)
+Files: src/testdir/test_compiler.vim
+
+Patch 8.1.0005
+Problem: Test for :compiler command fails on MS-Windows.
+Solution: Ignore difference in path.
+Files: src/testdir/test_compiler.vim
+
+Patch 8.1.0006
+Problem: syn_id2cterm_bg() may be undefined. (Axel Bender)
+Solution: Adjust #ifdef.
+Files: src/syntax.c
+
+Patch 8.1.0007
+Problem: No test for "o" and "O" in Visual block mode.
+Solution: Add a test. (Dominique Pelle, closes #2932)
+Files: src/testdir/test_visual.vim
+
+Patch 8.1.0008
+Problem: No test for strwidth().
+Solution: Add a test. (Dominique Pelle, closes #2931)
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0009
+Problem: Tabpages insufficiently tested.
+Solution: Add more test coverage. (Dominique Pelle, closes #2934)
+Files: src/testdir/test_tabpage.vim
+
+Patch 8.1.0010
+Problem: efm_to_regpat() is too long.
+Solution: Split off three functions. (Yegappan Lakshmanan, closes #2924)
+Files: src/quickfix.c
+
+Patch 8.1.0011
+Problem: maparg() and mapcheck() confuse empty and non-existing.
+Solution: Return <Nop> for an existing non-empty mapping. (closes #2940)
+Files: src/evalfunc.c, src/testdir/test_maparg.vim
+
+Patch 8.1.0012
+Problem: Misplaced #endif.
+Solution: Move the #endif to after the expression. (David Binderman)
+Files: src/fileio.c
+
+Patch 8.1.0013
+Problem: Using freed memory when changing terminal cursor color.
+Solution: Make a copy of the color. (Dominique Pelle, closes #2938,
+ closes #2941)
+Files: src/terminal.c
+
+Patch 8.1.0014
+Problem: qf_init_ext() is too long.
+Solution: Split it into multiple functions. (Yegappan Lakshmanan,
+ closes #2939)
+Files: src/quickfix.c
+
+Patch 8.1.0015
+Problem: Cursor color wrong when closing a terminal window, ending up in
+ another terminal window. (Dominique Pelle)
+Solution: Bail out of terminal_loop() when the buffer changes.
+ (closes #2942)
+Files: src/terminal.c
+
+Patch 8.1.0016
+Problem: Possible crash in term_wait(). (Dominique Pelle)
+Solution: Check for a valid buffer after ui_delay(). (closes #2944)
+Files: src/terminal.c
+
+Patch 8.1.0017
+Problem: Shell command completion has duplicates. (Yegappan Lakshmanan)
+Solution: Use a hash table to avoid duplicates. (Ozaki Kiichi, closes #539,
+ closes #2733)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.1.0018
+Problem: Using "gn" may select wrong text when wrapping.
+Solution: Avoid wrapping when searching forward. (Christian Brabandt)
+Files: src/search.c, src/testdir/test_gn.vim
+
+Patch 8.1.0019
+Problem: Error when defining a Lambda with index of a function result.
+Solution: When not evaluating an expression and skipping a function call,
+ set the return value to VAR_UNKNOWN.
+Files: src/userfunc.c, src/testdir/test_lambda.vim
+
+Patch 8.1.0020
+Problem: Cannot tell whether a register is being used for executing or
+ recording.
+Solution: Add reg_executing() and reg_recording(). (Hirohito Higashi,
+ closes #2745) Rename the global variables for consistency. Store
+ the register name in reg_executing.
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim, src/getchar.c, src/normal.c,
+ src/ops.c, src/globals.h, src/edit.c, src/fileio.c, src/message.c,
+ src/screen.c
+
+Patch 8.1.0021
+Problem: Clang warns for undefined behavior.
+Solution: Move #ifdef outside of sprintf() call. (suggestion by Michael
+ Jarvis, closes #2946)
+Files: src/term.c
+
+Patch 8.1.0022
+Problem: Repeating put from expression register fails.
+Solution: Re-evaluate the expression register. (Andy Massimino,
+ closes #2945)
+Files: src/getchar.c, src/testdir/test_put.vim
+
+Patch 8.1.0023
+Problem: gcc 8.1 warns for use of strncpy(). (John Marriott)
+Solution: Use mch_memmove() instead of STRNCPY().
+Files: src/memline.c
+
+Patch 8.1.0024
+Problem: % command not tested on #ifdef and comment.
+Solution: Add tests. (Dominique Pelle, closes #2956)
+Files: src/testdir/test_goto.vim
+
+Patch 8.1.0025
+Problem: No test for the undofile() function.
+Solution: Add test. (Dominique Pelle, closes #2958)
+Files: src/testdir/test_undo.vim
+
+Patch 8.1.0026
+Problem: Terminal test fails with very tall terminal. (Tom)
+Solution: Fix the terminal window size in the test.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0027
+Problem: Difficult to make a plugin that feeds a line to a job.
+Solution: Add the initial code for the "prompt" buftype.
+Files: runtime/doc/channel.txt, runtime/doc/eval.txt,
+ runtime/doc/options.txt, runtime/doc/tags, runtime/doc/todo.txt,
+ src/Makefile, src/buffer.c, src/channel.c, src/diff.c, src/edit.c,
+ src/evalfunc.c, src/normal.c, src/ops.c, src/option.c,
+ src/proto/buffer.pro, src/proto/channel.pro, src/proto/edit.pro,
+ src/proto/ops.pro, src/structs.h, src/testdir/Make_all.mak,
+ src/testdir/screendump.vim, src/testdir/test_prompt_buffer.vim
+
+Patch 8.1.0028 (after 8.1.0027)
+Problem: Prompt buffer test fails on MS-Windows.
+Solution: Disable the test for now. Remove stray assert.
+Files: src/testdir/test_prompt_buffer.vim
+
+Patch 8.1.0029
+Problem: Terminal test fails on MS-Windows when "wc" exists.
+Solution: Skip test with redirection on MS-Windows.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0030
+Problem: Stopping Vim running in a terminal may not work.
+Solution: Instead of sending <Esc> send CTRL-O.
+Files: src/testdir/screendump.vim, src/testdir/test_prompt_buffer.vim
+
+Patch 8.1.0031
+Problem: Terminal test aucmd_on_close is flaky.
+Solution: Wait a bit longer.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0032
+Problem: BS in prompt buffer starts new line.
+Solution: Do not allow BS over the prompt. Make term_sendkeys() handle
+ special keys. Add a test.
+Files: src/option.c, src/terminal.c, src/testdir/test_prompt_buffer.vim
+
+Patch 8.1.0033
+Problem: Keys to stop Vim in terminal are wrong. (Marius Gedminas)
+Solution: Move ":" to before CTRL-U.
+Files: src/testdir/screendump.vim
+
+Patch 8.1.0034
+Problem: Cursor not restored with ":edit #".
+Solution: Don't assume autocommands moved the cursor when it was moved to
+ the first non-blank.
+Files: src/ex_cmds.c, src/testdir/test_edit.vim
+
+Patch 8.1.0035
+Problem: Not easy to switch between prompt buffer and other windows.
+Solution: Accept CTRL-W commands in Insert mode. Start and stop Insert mode
+ as one would expect.
+Files: src/edit.c, src/ex_docmd.c, src/structs.h, src/window.c
+
+Patch 8.1.0036
+Problem: Not restoring Insert mode if leaving a prompt buffer by using a
+ mouse click.
+Solution: Set b_prompt_insert appropriately. Also correct cursor position
+ when moving cursor to last line.
+Files: src/buffer.c, src/edit.c, src/window.c
+
+Patch 8.1.0037
+Problem: Cannot easily append lines to another buffer.
+Solution: Add appendbufline().
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_bufline.vim, src/testdir/test_edit.vim
+
+Patch 8.1.0038
+Problem: Popup test causes Vim to exit.
+Solution: Disable the broken part of the test for now.
+Files: src/testdir/test_popup.vim
+
+Patch 8.1.0039
+Problem: Cannot easily delete lines in another buffer.
+Solution: Add deletebufline().
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_bufline.vim
+
+Patch 8.1.0040
+Problem: Warnings from 64-bit compiler.
+Solution: Add type casts. (Mike Williams)
+Files: src/edit.c
+
+Patch 8.1.0041
+Problem: Attribute "width" missing from python window attribute list.
+Solution: Add the item. (Ken Takata) Order the list like the items are used
+ in the WindowAttr() function.
+Files: src/if_py_both.h, src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 8.1.0042
+Problem: If omni completion opens a window Insert mode is stopped.
+ (Hirohito Higashi)
+Solution: Only set stop_insert_mode in a prompt buffer window.
+Files: src/window.c
+
+Patch 8.1.0043
+Problem: ++bad argument of :edit does not work properly.
+Solution: Return FAIL from get_bad_opt() only when there is no valid
+ argument. (Dominique Pelle, Christian Brabandt, closes #2966,
+ closes #2947)
+Files: src/ex_docmd.c, src/testdir/test_plus_arg_edit.vim
+
+Patch 8.1.0044
+Problem: If a test function exits Vim this may go unnoticed.
+Solution: Check for a test function quitting Vim. Fix tests that did exit
+ Vim.
+Files: src/testdir/runtest.vim, src/testdir/test_assert.vim
+
+Patch 8.1.0045 (after 8.1.0038)
+Problem: Popup test isn't run completely.
+Solution: Remove "finish". Clean up function definitions.
+Files: src/testdir/test_popup.vim
+
+Patch 8.1.0046
+Problem: Loading a session file fails if 'winheight' is a big number.
+Solution: Set 'minwinheight' to zero at first. Don't give an error when
+ setting 'minwinheight' while 'winheight' is a big number.
+ Fix using vertical splits. Fix setting 'minwinwidth'.
+ (closes #2970)
+Files: src/testdir/test_mksession.vim, src/option.c, src/window.c,
+ src/proto/window.pro
+
+Patch 8.1.0047
+Problem: No completion for :unlet $VAR.
+Solution: Add completion. (Jason Franklin)
+Files: src/ex_docmd.c, src/testdir/test_unlet.vim
+
+Patch 8.1.0048
+Problem: vim_str2nr() does not handle numbers close to the maximum.
+Solution: Check for overflow more precisely. (Ken Takata, closes #2746)
+Files: src/charset.c
+
+Patch 8.1.0049
+Problem: Shell cannot tell running in a terminal window.
+Solution: Add the VIM_TERMINAL environment variable. (Christian Brabandt)
+Files: runtime/doc/terminal.txt, src/os_unix.c, src/os_win32.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.1.0050 (after 8.1.0049)
+Problem: $VIM_TERMINAL is also set when not in a terminal window.
+Solution: Pass a flag to indicate whether the job runs in a terminal.
+Files: src/channel.c, src/proto/channel.pro, src/evalfunc.c,
+ src/terminal.c, src/os_unix.c, src/proto/os_unix.pro,
+ src/os_win32.c
+
+Patch 8.1.0051 (after 8.1.0050)
+Problem: MS-Windows: missing #endif.
+Solution: Add the #endif.
+Files: src/os_win32.c
+
+Patch 8.1.0052
+Problem: When a mapping to <Nop> times out the next mapping is skipped.
+Solution: Reset "timedout" when waiting for a character. (Christian
+ Brabandt, closes #2921)
+Files: src/getchar.c
+
+Patch 8.1.0053
+Problem: The first argument given to 'completefunc' can be Number or
+ String, depending on the value.
+Solution: Avoid guessing the type of an argument, use typval_T in the
+ callers of call_vim_function(). (Ozaki Kiichi, closes #2993)
+Files: src/edit.c, src/eval.c, src/ex_getln.c, src/mbyte.c, src/normal.c,
+ src/proto/eval.pro, src/testdir/test_ins_complete.vim
+
+Patch 8.1.0054
+Problem: Compiler warning for using %ld for "long long".
+Solution: Add a type cast. (closes #3002)
+Files: src/os_unix.c
+
+Patch 8.1.0055 (after 8.1.0053)
+Problem: Complete test has wrong order of arguments. Wrong type for
+ sentinel variable.
+Solution: Swap arguments, use VAR_UNKNOWN. (Ozaki Kiichi)
+Files: src/mbyte.c, src/testdir/test_ins_complete.vim
+
+Patch 8.1.0056
+Problem: Crash when using :hardcopy with illegal byte.
+Solution: Check for string_convert() returning NULL. (Dominique Pelle)
+Files: src/hardcopy.c, src/testdir/test_hardcopy.vim
+
+Patch 8.1.0057
+Problem: Popup menu displayed wrong when using autocmd.
+Solution: Use aucmd_prepbuf(). Force updating status line if the popup menu
+ is going to be redrawn anyway. (Christian Brabandt, closes #3009)
+Files: src/edit.c, src/screen.c, src/proto/screen.pro
+
+Patch 8.1.0058
+Problem: Display problem with margins and scrolling.
+Solution: Place the cursor in the right column. (Kouichi Iwamoto,
+ closes #3016)
+Files: src/screen.c
+
+Patch 8.1.0059
+Problem: Displayed digraph for "ga" wrong with 'encoding' "cp1251".
+Solution: Convert from 'encoding' to "utf-8" if needed. (closes #3015)
+Files: src/digraph.c, src/testdir/test_digraph.vim
+
+Patch 8.1.0060
+Problem: Crash when autocommands delete the current buffer. (Dominique
+ Pelle)
+Solution: Check that autocommands don't change the buffer.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0061
+Problem: Window title is wrong after resetting and setting 'title'.
+Solution: Move resetting the title into maketitle(). (Jason Franklin)
+Files: src/option.c, src/buffer.c
+
+Patch 8.1.0062
+Problem: Popup menu broken if a callback changes the window layout. (Qiming
+ Zhao)
+Solution: Recompute the popup menu position if needed. Redraw the ruler
+ even when the popup menu is displayed.
+Files: src/popupmnu.c, src/proto/popupmnu.pro, src/screen.c
+
+Patch 8.1.0063
+Problem: Mac: NSStringPboardType is deprecated.
+Solution: Use NSPasteboardTypeString. (Akshay Hegde, closes #3022)
+Files: src/os_macosx.m
+
+Patch 8.1.0064
+Problem: Typing CTRL-W in a prompt buffer shows mode "-- --".
+Solution: Set restart_edit to 'A' and check for it.
+Files: src/edit.c, src/window.c, src/screen.c
+
+Patch 8.1.0065 (after 8.1.0062)
+Problem: Balloon displayed at the wrong position.
+Solution: Do not reposition the popup menu at the cursor position.
+Files: src/popupmnu.c
+
+Patch 8.1.0066
+Problem: Nasty autocommand causes using freed memory. (Dominique Pelle)
+Solution: Do not force executing autocommands if the value of 'syntax' or
+ 'filetype' did not change.
+Files: src/option.c
+
+Patch 8.1.0067
+Problem: Syntax highlighting not working when re-entering a buffer.
+Solution: Do force executing autocommands when not called recursively.
+Files: src/option.c
+
+Patch 8.1.0068
+Problem: Nasty autocommands can still cause using freed memory.
+Solution: Disallow using setloclist() and setqflist() recursively.
+Files: src/evalfunc.c
+
+Patch 8.1.0069
+Problem: Cannot handle pressing CTRL-C in a prompt buffer.
+Solution: Add prompt_setinterrupt().
+Files: runtime/doc/eval.txt, src/edit.c, src/evalfunc.c, src/channel.c,
+ src/proto/channel.pro
+
+Patch 8.1.0070
+Problem: Missing part of the changes for prompt_setinterrupt().
+Solution: Add the missing changes.
+Files: src/structs.h
+
+Patch 8.1.0071
+Problem: Terminal debugger only works with the terminal feature.
+Solution: Make it also work with a prompt buffer. Makes it possible to use
+ on MS-Windows. Various other improvements. (closes #3012)
+Files: runtime/doc/terminal.txt,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0072
+Problem: Use of 'termwinkey' is inconsistent.
+Solution: Change the documentation and the behavior. (Ken Takata)
+Files: src/terminal.c, runtime/doc/terminal.txt
+
+Patch 8.1.0073
+Problem: Crash when autocommands call setloclist(). (Dominique Pelle)
+Solution: If the quickfix list changes then don't jump to the error.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0074 (after 8.1.0073)
+Problem: Crash when running quickfix tests.
+Solution: Do not alloc a new location list when checking for the reference
+ to be still valid.
+Files: src/quickfix.c
+
+Patch 8.1.0075
+Problem: No Vim logo in README file.
+Solution: Add one. (Árni Dagur, closes #3024)
+Files: README.md
+
+Patch 8.1.0076
+Problem: Command getting cleared with CTRL-W : in a terminal window. (Jason
+ Franklin)
+Solution: Call redraw_after_callback() when editing the command line.
+Files: src/terminal.c
+
+Patch 8.1.0077
+Problem: Header of README file is not nice.
+Solution: Move text to the bottom.
+Files: README.md
+
+Patch 8.1.0078
+Problem: "..." used inconsistently in messages.
+Solution: Drop the space before " ...".
+Files: src/spellfile.c, src/regexp_nfa.c
+
+Patch 8.1.0079
+Problem: Superfluous space in messages.
+Solution: Remove the spaces. (closes #3030)
+Files: src/gui_w32.c
+
+Patch 8.1.0080
+Problem: Can't see the breakpoint number in the terminal debugger.
+Solution: Use the breakpoint number for the sign. (Christian Brabandt)
+Files: runtime/doc/terminal.txt,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0081
+Problem: The terminal debugger doesn't adjust to changed 'background'.
+Solution: Add an OptionSet autocommand. (Christian Brabandt)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0082
+Problem: In terminal window, typing : at more prompt, inserts ':' instead
+ of starting another Ex command.
+Solution: Add skip_term_loop and set it when putting ':' in the typeahead
+ buffer.
+Files: src/globals.h, src/main.c, src/message.c
+
+Patch 8.1.0083
+Problem: "is" and "as" have trouble with quoted punctuation.
+Solution: Check for punctuation before a quote. (Jason Franklin)
+Files: src/search.c, src/testdir/test_textobjects.vim
+
+Patch 8.1.0084
+Problem: User name completion does not work on MS-Windows.
+Solution: Use NetUserEnum() to get user names. (Yasuhiro Matsumoto)
+Files: src/Make_ivc.mak, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/misc1.c
+
+Patch 8.1.0085
+Problem: No test for completing user name and language.
+Solution: Add tests. (Dominique Pelle, closes #2978)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.1.0086
+Problem: No tests for libcall() and libcallnr().
+Solution: Add tests. (Dominique Pelle, closes #2982)
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0087
+Problem: v:shell_error is always zero when using terminal for "!cmd".
+Solution: Use "exitval" of terminal-job. (Ozaki Kiichi, closes #2994)
+Files: src/os_unix.c, src/os_win32.c, src/proto/terminal.pro,
+ src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0088
+Problem: Terminal test for stdout and stderr is a bit flaky.
+Solution: Wait for both stdout and stderr to have been processed. (Ozaki
+ Kiichi, closes #2991)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0089
+Problem: error when ending the terminal debugger
+Solution: Fix deleting defined signs for breakpoints. Make the debugger
+ work better on MS-Windows.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0090
+Problem: "..." used inconsistently in a message.
+Solution: Define the message with " ..." once. (hint by Ken Takata)
+Files: src/regexp_nfa.c
+
+Patch 8.1.0091
+Problem: MS-Windows: Cannot interrupt gdb when program is running.
+Solution: Add debugbreak() and use it in the terminal debugger.
+ Respect 'modified' in a prompt buffer.
+Files: src/evalfunc.c, runtime/doc/eval.txt, src/undo.c,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0092 (after 8.1.0091)
+Problem: Prompt buffer test fails.
+Solution: Set 'nomodified' before closing the window. (Ozaki Kiichi,
+ closes #3051)
+Files: src/testdir/test_prompt_buffer.vim
+
+Patch 8.1.0093
+Problem: non-MS-Windows: Cannot interrupt gdb when program is running.
+Solution: Only use debugbreak() on MS-Windows.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0094
+Problem: Help text "usage:" is not capitalized.
+Solution: Make it "Usage:". (closes #3044)
+Files: src/main.c
+
+Patch 8.1.0095
+Problem: Dialog for ":browse tabnew" says "new window".
+Solution: Use "new tab page". (closes #3053)
+Files: src/ex_docmd.c
+
+Patch 8.1.0096
+Problem: Inconsistent use of the word autocommands.
+Solution: Don't use auto-commands or "auto commands".
+Files: src/fileio.c
+
+Patch 8.1.0097
+Problem: Superfluous space before exclamation mark.
+Solution: Remove the space. Don't translate debug message.
+Files: src/regexp_nfa.c
+
+Patch 8.1.0098
+Problem: Segfault when pattern with \z() is very slow.
+Solution: Check for NULL regprog. Add "nfa_fail" to test_override() to be
+ able to test this. Fix that 'searchhl' resets called_emsg.
+Files: src/syntax.c, runtime/doc/eval.txt, src/evalfunc.c, src/vim.h,
+ src/testdir/test_syntax.vim, src/globals.h, src/screen.c,
+ src/regexp.c, src/regexp_nfa.c
+
+Patch 8.1.0099
+Problem: Exclamation mark in error message not needed.
+Solution: Remove the exclamation mark.
+Files: src/regexp_nfa.c
+
+Patch 8.1.0100
+Problem: Terminal debugger: error when setting a watch point.
+Solution: Don't try defining a sign for a watch point.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0101
+Problem: No test for getcmdwintype().
+Solution: Add a test. (Dominique Pelle, closes #3068)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.1.0102
+Problem: Cannot build without syntax highlighting.
+Solution: Add #ifdef around using reg_do_extmatch.
+Files: src/regexp.c
+
+Patch 8.1.0103
+Problem: Long version string cannot be translated.
+Solution: Build the string in init_longVersion().
+Files: src/globals.h, src/version.h, src/version.c,
+ src/proto/version.pro, src/main.c
+
+Patch 8.1.0104
+Problem: Can't build without the +eval feature.
+Solution: Add #ifdef.
+Files: src/regexp_nfa.c
+
+Patch 8.1.0105
+Problem: All tab stops are the same.
+Solution: Add the variable tabstop feature. (Christian Brabandt,
+ closes #2711)
+Files: runtime/doc/change.txt, runtime/doc/options.txt,
+ runtime/doc/various.txt, runtime/optwin.vim, src/beval.c,
+ src/beval.h, src/buffer.c, src/charset.c, src/edit.c,
+ src/evalfunc.c, src/ex_cmds.c, src/feature.h, src/gui_beval.c,
+ src/gui_w32.c, src/hardcopy.c, src/message.c, src/misc1.c,
+ src/ops.c, src/option.c, src/option.h, src/proto/misc1.pro,
+ src/proto/option.pro, src/screen.c, src/structs.h,
+ src/testdir/Make_all.mak, src/testdir/gen_opt_test.vim,
+ src/testdir/test_breakindent.vim, src/testdir/test_vartabs.vim,
+ src/version.c, src/workshop.c, src/Makefile
+
+Patch 8.1.0106 (after 8.1.0103)
+Problem: Build fails when HAVE_DATE_TIME is undefined.
+Solution: Always define init_longVersion(). (Christian Brabandt,
+ closes #3075)
+Files: src/version.c
+
+Patch 8.1.0107
+Problem: Python: getting buffer option clears message. (Jacob Niehus)
+Solution: Don't use aucmd_prepbuf(). (closes #3079)
+Files: src/option.c
+
+Patch 8.1.0108
+Problem: No Danish translations.
+Solution: Add Danish message translations. (closes #3073) Move list of
+ languages to a common makefile.
+Files: src/po/Makefile, src/po/Make_cyg.mak, src/po/Make_mvc.mak,
+ src/po/Make_ming.mak, src/po/Make_all.mak, src/po/da.po
+
+Patch 8.1.0109
+Problem: New po makefile missing from distribution.
+Solution: Add it to the file list.
+Files: Filelist
+
+Patch 8.1.0110
+Problem: File name not displayed with ":file" when 'F' is in 'shortmess'.
+Solution: Always display the file name when there is no argument (Christian
+ Brabandt, closes #3070)
+Files: src/ex_cmds.c, src/testdir/test_options.vim
+
+Patch 8.1.0111
+Problem: .po files do not use recommended names.
+Solution: Give a warning if the recommended name is not used. Accept the
+ recommended name for conversion. (Christian Brabandt, Ken Takata)
+Files: src/po/Makefile, src/po/sjiscorr.c, src/po/check.vim
+
+Patch 8.1.0112
+Problem: No error when using bad arguments with searchpair().
+Solution: Add error messages.
+Files: src/evalfunc.c, src/testdir/test_search.vim
+
+Patch 8.1.0113
+Problem: Compiler warning for unused variable. (Yegappan Lakshmanan)
+Solution: Add UNUSED. (Christian Brabandt)
+Files: src/screen.c
+
+Patch 8.1.0114
+Problem: Confusing variable name.
+Solution: Rename new_ts to new_vts_array. Change zero to NULL.
+Files: src/ex_cmds.c, src/option.c
+
+Patch 8.1.0115
+Problem: The matchparen plugin may throw an error.
+Solution: Change the skip argument from zero to "0".
+Files: runtime/plugin/matchparen.vim
+
+Patch 8.1.0116
+Problem: Display problem with 'vartabstop' and 'linebreak'. (Chauca
+ Fuentes)
+Solution: Call tabstop_padding(). (Christian Brabandt, closes #3076)
+Files: src/screen.c, src/testdir/test_vartabs.vim
+
+Patch 8.1.0117
+Problem: URL in install program still points to SourceForge.
+Solution: Change it to www.vim.org. (closes #3100)
+Files: src/dosinst.c
+
+Patch 8.1.0118
+Problem: Duplicate error message for put command.
+Solution: Check return value of u_save(). (Jason Franklin)
+Files: src/ops.c, src/testdir/test_messages.vim src/testdir/test_put.vim
+
+Patch 8.1.0119
+Problem: Failing test goes unnoticed because testdir/messages is not
+ written.
+Solution: Set 'nomodifiable' only local to the buffer.
+Files: src/testdir/test_put.vim
+
+Patch 8.1.0120
+Problem: Buffer 'modified' set even when :sort has no changes.
+Solution: Only set 'modified' when lines are moved. (Jason Franklin)
+Files: src/ex_cmds.c, src/testdir/test_sort.vim
+
+Patch 8.1.0121
+Problem: Crash when using ballooneval related to 'vartabstop'.
+Solution: Initialize balloonEval->vts to NULL. (Markus Braun)
+Files: src/ex_cmds2.c, src/gui_beval.c, src/gui_w32.c, src/gui.c
+
+Patch 8.1.0122
+Problem: Translators don't always understand the maintainer message.
+Solution: Add a comment that ends up in the generated po file. (Christian
+ Brabandt, closes #3037)
+Files: src/message.c
+
+Patch 8.1.0123
+Problem: MS-Windows: colors are wrong after setting 'notgc'.
+Solution: Only call control_console_color_rgb() for the win32 terminal.
+ (Nobuhiro Takasaki, closes #3107)
+Files: src/option.c
+
+Patch 8.1.0124
+Problem: has('vcon') returns true even for non-win32 terminal.
+Solution: Check the terminal type. (Nobuhiro Takasaki, closes #3106)
+Files: src/evalfunc.c
+
+Patch 8.1.0125
+Problem: Virtual edit replace with multibyte fails at end of line. (Lukas
+ Werling)
+Solution: use ins_char() to add the character. (Christian Brabandt,
+ closes #3114) Rename PCHAR() to PBYTE() to avoid mistakes like
+ this.
+Files: src/ops.c, src/testdir/test_virtualedit.vim, src/macros.h
+
+Patch 8.1.0126
+Problem: Various problems with 'vartabstop'.
+Solution: Fix memory leak. Fix crash. Add a few more tests. (Christian
+ Brabandt, closes #3076)
+Files: src/ex_cmds.c, src/option.c, src/screen.c,
+ src/testdir/test_vartabs.vim
+
+Patch 8.1.0127
+Problem: Build failure when disabling the session feature. (Pawel Slowik)
+Solution: Adjust #ifdef for vim_chdirfile().
+Files: src/misc2.c
+
+Patch 8.1.0128
+Problem: Building with MinGW does not work out-of-the-box.
+Solution: Add instructions for MSYS2. Set default WINVER. Add batch files
+ to set $PATH for MSYS2.
+Files: src/Make_cyg_ming.mak, src/INSTALLpc.txt, src/msys32.bat,
+ src/msys64.bat, Filelist
+
+Patch 8.1.0129
+Problem: Still some xterm-like terminals get a stray "p" on startup.
+Solution: Consider all terminals that reply with a version smaller than 95
+ as not an xterm. (James McCoy)
+Files: src/term.c
+
+Patch 8.1.0130
+Problem: ":profdel func" does not work if func was called already.
+ (Dominique Pelle)
+Solution: Reset uf_profiling and add a flag to indicate initialization was
+ done.
+Files: src/structs.h, src/userfunc.c
+
+Patch 8.1.0131
+Problem: :profdel is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3123)
+Files: src/testdir/test_profile.vim
+
+Patch 8.1.0132
+Problem: Lua tests are old style.
+Solution: Convert to new style tests. Improve coverage. (Dominique Pelle,
+ closes #3091)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_vms.mms,
+ src/testdir/test85.in, src/testdir/test_lua.vim
+
+Patch 8.1.0133
+Problem: tagfiles() can have duplicate entries.
+Solution: Simplify the filename to make checking for duplicates work better.
+ Add a test. (Dominique Pelle, closes #2979)
+Files: src/tag.c, src/testdir/test_taglist.vim
+
+Patch 8.1.0134
+Problem: Lua interface does not support funcref.
+Solution: Add funcref support. (Luis Carvalho)
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.1.0135
+Problem: Undo message delays screen update for CTRL-O u.
+Solution: Add smsg_attr_keep(). (closes #3125)
+Files: src/message.c, src/proto.h, src/undo.c
+
+Patch 8.1.0136
+Problem: Lua tests don't cover new features.
+Solution: Add more tests. (Dominique Pelle, closes #3130)
+Files: runtime/doc/if_lua.txt, src/testdir/test_lua.vim
+
+Patch 8.1.0137
+Problem: CI does not run with TCL.
+Solution: Add TCL to the travis config. (Dominique Pelle, closes #3133)
+Files: .travis.yml
+
+Patch 8.1.0138
+Problem: Negative value of 'softtabstop' not used correctly.
+Solution: Use get_sts_value(). (Tom Ryder)
+Files: src/edit.c, src/option.c, src/Makefile, src/testdir/test_tab.vim
+
+Patch 8.1.0139
+Problem: Lua tests fail on some platforms.
+Solution: Accept a hex number with and without "0x". (Ken Takata,
+ closes #3137)
+Files: src/testdir/test_lua.vim
+
+Patch 8.1.0140
+Problem: Recording into a register has focus events. (Michael Naumann)
+Solution: Don't record K_FOCUSGAINED and K_FOCUSLOST. (closes #3143)
+Files: src/getchar.c
+
+Patch 8.1.0141
+Problem: :cexpr no longer jumps to the first error.
+Solution: Use the quickfix list identifier. (Yegappan Lakshmanan,
+ closes #3092)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0142
+Problem: Xterm and vt320 builtin termcap missing keypad keys.
+Solution: Add the escape sequences. (Kouichi Iwamoto, closes #2973)
+Files: src/term.c
+
+Patch 8.1.0143
+Problem: Matchit and matchparen don't handle E363.
+Solution: Catch the E363 error. (Christian Brabandt)
+Files: runtime/pack/dist/opt/matchit/plugin/matchit.vim,
+ runtime/plugin/matchparen.vim
+
+Patch 8.1.0144
+Problem: The :cd command does not have good test coverage.
+Solution: Add more tests. (Dominique Pelle, closes #2972)
+Files: src/testdir/test_cd.vim
+
+Patch 8.1.0145
+Problem: Test with grep is failing on MS-Windows.
+Solution: Skip the test.
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.1.0146
+Problem: When $LANG is set the compiler test may fail.
+Solution: Unset $LANG.
+Files: src/testdir/test_compiler.vim
+
+Patch 8.1.0147
+Problem: Compiler warning when building with Python 3.7.
+Solution: #undef PySlice_GetIndicesEx before redefining it. (Ozaki Kiichi,
+ closes #3153)
+Files: src/if_python3.c
+
+Patch 8.1.0148
+Problem: Memory leak when using :tcl expr command.
+Solution: Free the result of expression evaluation. (Dominique Pelle,
+ closes #3150)
+Files: src/if_tcl.c
+
+Patch 8.1.0149
+Problem: The generated sessions file does not restore tabs properly if :lcd
+ was used in one of them.
+Solution: Create the tab pages before setting the directory. (Yee Cheng
+ Chin, closes #3152)
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.1.0150
+Problem: Insufficient test coverage for Tcl.
+Solution: Add more tests. (Dominique Pelle, closes #3140)
+Files: src/testdir/test_tcl.vim
+
+Patch 8.1.0151
+Problem: Mksession test fails on MS-Windows.
+Solution: Always use an argument for :lcd.
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.0152
+Problem: Cannot easily run individual tests on MS-Windows.
+Solution: Move the list of tests to a separate file. Add a build rule in
+ the MSVC makefile.
+Files: Filelist, src/Makefile, src/Make_all.mak, src/Make_mvc.mak
+
+Patch 8.1.0153 (after 8.1.0152)
+Problem: Build with SHADOWDIR fails. (Elimar Riesebieter)
+Solution: Create a link for Make_all.mak. (Tony Mechelynck)
+Files: src/Makefile
+
+Patch 8.1.0154
+Problem: Crash with "set smarttab shiftwidth=0 softtabstop=-1".
+Solution: Fall back to using 'tabstop'. (closes #3155)
+Files: src/edit.c, src/testdir/test_tab.vim
+
+Patch 8.1.0155
+Problem: Evim.man missing from the distribution.
+Solution: Add it to the list.
+Files: Filelist
+
+Patch 8.1.0156
+Problem: MS-Windows compiler warning.
+Solution: Add a type cast. (Mike Williams)
+Files: src/version.c
+
+Patch 8.1.0157
+Problem: Old iTerm2 is not recognized, resulting in stray output.
+Solution: Recognize the termresponse.
+Files: src/term.c
+
+Patch 8.1.0158
+Problem: GUI: input() fails if CTRL-C was pressed before. (Michael Naumann)
+Solution: call vpeekc() to drop the CTRL-C from the input stream.
+Files: src/ex_docmd.c
+
+Patch 8.1.0159
+Problem: Completion for user names does not work if a prefix is also a full
+ matching name. (Nazri Ramliy)
+Solution: Accept both full and partial matches. (Dominique Pelle)
+Files: src/misc1.c, src/ex_docmd.c
+
+Patch 8.1.0160
+Problem: No Danish manual translations.
+Solution: Add the Danish manual translations to the file list.
+Files: Filelist
+
+Patch 8.1.0161
+Problem: Buffer not updated with 'autoread' set if file was deleted.
+ (Michael Naumann)
+Solution: Don't set the timestamp to zero. (closes #3165)
+Files: src/fileio.c, src/testdir/test_stat.vim
+
+Patch 8.1.0162
+Problem: Danish and German man pages are not installed. (Tony Mechelynck)
+Solution: Adjust the makefile
+Files: src/Makefile
+
+Patch 8.1.0163
+Problem: Insufficient testing for Tcl.
+Solution: Add a few more tests. (Dominique Pelle, closes #3166)
+Files: src/testdir/test_tcl.vim
+
+Patch 8.1.0164
+Problem: luaeval('vim.buffer().name') returns an error.
+Solution: Return an empty string. (Dominique Pelle, closes #3167)
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.1.0165
+Problem: :clist output can be very long.
+Solution: Support filtering :clist entries. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0166
+Problem: Using dict_add_nr_str() is clumsy.
+Solution: Split into two functions. (Ozaki Kiichi, closes #3154)
+Files: src/channel.c, src/dict.c, src/edit.c, src/evalfunc.c,
+ src/ex_cmds2.c, src/ops.c, src/option.c, src/proto/dict.pro,
+ src/quickfix.c, src/tag.c, src/terminal.c, src/undo.c
+
+Patch 8.1.0167
+Problem: Lock flag in new dictitem is reset in many places.
+Solution: Always reset the lock flag.
+Files: src/dict.c, src/channel.c, src/ex_cmds2.c, src/userfunc.c,
+ src/if_perl.xs, src/if_py_both.h
+
+Patch 8.1.0168
+Problem: Output of :marks is too short with multibyte chars. (Tony
+ Mechelynck)
+Solution: Get more bytes from the text line.
+Files: src/mark.c, src/testdir/test_marks.vim
+
+Patch 8.1.0169 (after 8.1.0165)
+Problem: Calling message_filtered() a bit too often.
+Solution: Only call message_filtered() when filtering is already false.
+Files: src/quickfix.c, runtime/doc/quickfix.txt
+
+Patch 8.1.0170
+Problem: Invalid memory use with complicated pattern. (Andy Massimino)
+Solution: Reallocate the list of listids when needed. (closes #3175)
+ Remove unnecessary function prototypes.
+Files: src/regexp_nfa.c
+
+Patch 8.1.0171
+Problem: Typing CTRL-W n in a terminal window causes ml_get error.
+Solution: When resizing the terminal outside of terminal_loop() make sure
+ the snapshot is complete.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0172
+Problem: 'viminfofile' option does not behave like a file name.
+Solution: Add the P_EXPAND flag. (closes #3178)
+Files: src/option.c
+
+Patch 8.1.0173
+Problem: Compiler warning on MS-Windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/libvterm/src/state.c
+
+Patch 8.1.0174
+Problem: After paging up and down fold line is wrong.
+Solution: Correct the computation of w_topline and w_botline. (Hirohito
+ Higashi)
+Files: src/move.c, src/testdir/test_fold.vim
+
+Patch 8.1.0175
+Problem: Marks test fails in very wide window. (Vladimir Lomov)
+Solution: Extend the text to match 'columns'. (closes #3180, closes #3181)
+Files: src/testdir/test_marks.vim
+
+Patch 8.1.0176
+Problem: Overlapping string argument for strcpy(). (Coverity)
+Solution: Use STRMOVE() instead of STRCPY(). (Dominique Pelle, closes #3187)
+Files: src/term.c
+
+Patch 8.1.0177
+Problem: Defining function in sandbox is inconsistent, cannot use :function
+ but can define a lambda.
+Solution: Allow defining a function in the sandbox, but also use the sandbox
+ when executing it. (closes #3182)
+Files: src/userfunc.c, src/ex_cmds.h
+
+Patch 8.1.0178
+Problem: Warning for passing pointer to non-pointer argument.
+Solution: Use zero instead of NULL.
+Files: src/if_ole.cpp
+
+Patch 8.1.0179
+Problem: Redundant condition for boundary check.
+Solution: Remove the condition. (Dominique Pelle). Change FALSE to FAIL.
+Files: src/undo.c
+
+Patch 8.1.0180
+Problem: Static analysis errors in Lua interface. (Coverity)
+Solution: Check for NULL pointers.
+Files: src/if_lua.c
+
+Patch 8.1.0181
+Problem: Memory leak with trailing characters in skip expression.
+Solution: Free the return value.
+Files: src/eval.c, src/testdir/test_search.vim
+
+Patch 8.1.0182
+Problem: Unicode standard was updated.
+Solution: Include the changes. (Christian Brabandt)
+Files: src/mbyte.c
+
+Patch 8.1.0183
+Problem: Lua API changed, breaking the build.
+Solution: Adjust prototype of lua_rawgeti(). (Ken Takata,
+ closes #3157, closes #3144)
+Files: src/if_lua.c
+
+Patch 8.1.0184
+Problem: Not easy to figure out the window layout.
+Solution: Add "wincol" and "winrow" to what getwininfo() returns.
+Files: src/evalfunc.c, src/testdir/test_bufwintabinfo.vim,
+ runtime/doc/eval.txt
+
+Patch 8.1.0185
+Problem: Running tests writes lua.vim even though it is not used.
+Solution: Stop writing lua.vim.
+Files: src/testdir/test1.in, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile
+
+Patch 8.1.0186
+Problem: Test for getwininfo() fails in GUI.
+Solution: Account for missing tabline.
+Files: src/testdir/test_bufwintabinfo.vim
+
+Patch 8.1.0187 (after 8.1.0184)
+Problem: getwininfo() and win_screenpos() return different numbers.
+Solution: Add one to "wincol" and "winrow" from getwininfo().
+Files: src/evalfunc.c, src/testdir/test_bufwintabinfo.vim,
+ runtime/doc/eval.txt
+
+Patch 8.1.0188
+Problem: No test for ":cscope add".
+Solution: Add a test. (Dominique Pelle, closes #3212)
+Files: src/testdir/test_cscope.vim
+
+Patch 8.1.0189
+Problem: Function defined in sandbox not tested.
+Solution: Add a text.
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0190
+Problem: Perl refcounts are wrong.
+Solution: Improve refcounting. Add a test. (Damien)
+Files: src/if_perl.xs, src/testdir/test_perl.vim
+
+Patch 8.1.0191 (after 8.1.0190)
+Problem: Perl test fails in 24 line terminal.
+Solution: Create fewer windows.
+Files: src/testdir/test_perl.vim
+
+Patch 8.1.0192
+Problem: Executing regexp recursively fails with a crash.
+Solution: Move global variables into "rex".
+Files: src/regexp.c, src/regexp.h, src/regexp_nfa.c
+
+Patch 8.1.0193
+Problem: Terminal debugger buttons don't always work. (Dominique Pelle)
+Solution: Set 'cpo' to its default value.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0194
+Problem: Possibly use of NULL pointer. (Coverity)
+Solution: Reset the re_in_use flag earlier.
+Files: src/regexp.c
+
+Patch 8.1.0195
+Problem: Terminal debugger commands don't always work. (Dominique Pelle)
+Solution: Set 'cpo' to its default value when defining commands. (Christian
+ Brabandt)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0196
+Problem: Terminal debugger error with .gdbinit file.
+Solution: Check two lines for the "new ui" response. (hint from Hirohito
+ Higashi)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0197
+Problem: Windows GUI: title for search/replace is wrong.
+Solution: Remove remark about doubling backslash. (closes #3230)
+Files: src/gui_win32.c
+
+Patch 8.1.0198
+Problem: There is no hint that syntax is disabled for 'redrawtime'.
+Solution: Add a message.
+Files: src/syntax.c
+
+Patch 8.1.0199
+Problem: spellbadword() does not check for caps error. (Dominique Pelle)
+Solution: Adjust capcol when advancing.
+Files: src/userfunc.c
+
+Patch 8.1.0200
+Problem: spellbadword() not tested.
+Solution: Add a test. (Dominique Pelle, closes #3235)
+Files: src/testdir/test_spell.vim
+
+Patch 8.1.0201
+Problem: Newer Python uses "importlib" instead of "imp".
+Solution: Use "importlib" for newer Python versions. (Ozaki Kiichi,
+ closes #3163)
+Files: src/if_py_both.h, src/testdir/test87.in
+
+Patch 8.1.0202
+Problem: :version always shows +packages. (Takuya Fujiwara)
+Solution: Add #ifdef (closes #3198) Also for has().
+Files: src/version.c, src/evalfunc.c
+
+Patch 8.1.0203
+Problem: Building with Perl 5.28 fails on Windows.
+Solution: Define Perl_mg_get. (closes #3196)
+Files: src/if_perl.xs
+
+Patch 8.1.0204
+Problem: inputlist() is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3240)
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0205
+Problem: Invalid memory access with invalid modeline.
+Solution: Pass pointer limit. Add a test. (closes #3241)
+Files: src/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_modeline.vim, src/option.c
+
+Patch 8.1.0206 (after 8.1.0205)
+Problem: Duplicate test function name.
+Solution: Rename both functions.
+Files: src/testdir/test_modeline.vim, src/testdir/test_glob2regpat.vim
+
+Patch 8.1.0207
+Problem: Need many menu translation files to cover regions.
+Solution: When there is no region match, try without. (Christian Brabandt)
+Files: runtime/menu.vim
+
+Patch 8.1.0208 (after 8.1.0205)
+Problem: File left behind after running individual test.
+Solution: Delete the file.
+Files: src/testdir/test_modeline.vim
+
+Patch 8.1.0209
+Problem: Stderr output from Ruby messes up display.
+Solution: Turn the stderr output into a Vim message. (Masataka Pocke
+ Kuwabara, closes #3238)
+Files: src/if_ruby.c
+
+Patch 8.1.0210
+Problem: Still a few K&R function declarations.
+Solution: Use ANSI function declarations (Hirohito Higashi)
+Files: src/eval.c, src/evalfunc.c, src/list.c
+
+Patch 8.1.0211
+Problem: Expanding a file name "~" results in $HOME. (Aidan Shafran)
+Solution: Change "~" to "./~" before expanding. (closes #3072)
+Files: src/testdir/test_expand.vim, src/ex_docmd.c, src/eval.c,
+ src/proto/eval.pro, src/evalfunc.c, src/if_cscope.c, src/misc1.c
+
+Patch 8.1.0212
+Problem: Preferred cursor column not set in interfaces.
+Solution: Set w_set_curswant when setting the cursor. (David Hotham,
+ closes #3060)
+Files: src/if_lua.c, src/if_mzsch.c, src/if_perl.xs, src/if_py_both.h,
+ src/if_ruby.c, src/if_tcl.c, src/testdir/test_lua.vim,
+ src/testdir/test_perl.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/testdir/test_ruby.vim,
+ src/testdir/test_tcl.vim
+
+Patch 8.1.0213
+Problem: CTRL-W CR does not work properly in a quickfix window.
+Solution: Split the window if needed. (Jason Franklin)
+Files: src/normal.c, src/proto/quickfix.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim, src/window.c
+
+Patch 8.1.0214
+Problem: +autochdir feature not reported by has() or :version.
+Solution: Add the feature in the list.
+Files: src/evalfunc.c, src/version.c
+
+Patch 8.1.0215
+Problem: No error if configure --with-x cannot configure X.
+Solution: Check that when --with-x is used X can be configured.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.1.0216
+Problem: Part of file not indented properly.
+Solution: Adjust the indent. (Ken Takata)
+Files: src/getchar.c
+
+Patch 8.1.0217
+Problem: Compiler warning for variable set but not used.
+Solution: Move tilde_file inside #ifdef. (Hirohito Higashi, closes #3255)
+Files: src/ex_docmd.c
+
+Patch 8.1.0218
+Problem: Cannot add matches to another window. (Qiming Zhao)
+Solution: Add the "window" argument to matchadd() and matchaddpos().
+ (closes #3260)
+Files: src/evalfunc.c, runtime/doc/eval.txt, src/testdir/test_match.vim
+
+Patch 8.1.0219
+Problem: Expanding ## fails to escape backtick.
+Solution: Escape a backtick in a file name. (closes #3257)
+Files: src/ex_docmd.c, src/testdir/test_edit.vim
+
+Patch 8.1.0220
+Problem: Ruby converts v:true and v:false to a number.
+Solution: Use Qtrue and Qfalse instead. (Masataka Pocke Kuwabara,
+ closes #3259)
+Files: src/if_ruby.c, src/testdir/test_ruby.vim
+
+Patch 8.1.0221
+Problem: Not enough testing for the Ruby interface.
+Solution: Add more tests. (Dominique Pelle, closes #3252)
+Files: runtime/doc/if_ruby.txt, src/testdir/test_ruby.vim
+
+Patch 8.1.0222
+Problem: Errors are reported for "make install".
+Solution: Skip missing language files. (Christian Brabandt, closes #3254)
+Files: src/installman.sh
+
+Patch 8.1.0223
+Problem: Completing shell command finds sub-directories in $PATH.
+Solution: Remove EW_DIR when completing an item in $PATH. (Jason Franklin)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.1.0224
+Problem: Hang in bracketed paste mode when t_PE not encountered.
+Solution: Break out of the loop when got_int is set. (suggested by Christian
+ Brabandt, closes #3146)
+Files: src/edit.c
+
+Patch 8.1.0225
+Problem: Mode() does not indicate using CTRL-O from Insert mode.
+Solution: Add "niI", "niR" and "niV" to mode() result. (closes #3000)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim
+
+Patch 8.1.0226
+Problem: Too many #ifdefs.
+Solution: Graduate the +vreplace feature, it's not much code and quite a few
+ #ifdefs.
+Files: runtime/doc/change.txt, runtime/doc/various.txt, src/edit.c,
+ src/evalfunc.c, src/gui.c, src/misc1.c, src/misc2.c, src/normal.c,
+ src/ops.c, src/screen.c, src/version.c, src/feature.h,
+ src/globals.h, src/macros.h, src/vim.h
+
+Patch 8.1.0227
+Problem: Spaces instead of tabs in makefile.
+Solution: Use tabs and fix sorting. (Ken Takata)
+Files: src/po/Make_all.mak
+
+Patch 8.1.0228
+Problem: Dropping files is ignored while Vim is busy.
+Solution: Postpone the effect of dropping files until it's safe.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/gui.c, src/gui.h,
+ src/screen.c, src/main.c, src/gui_mac.c
+
+Patch 8.1.0229
+Problem: Crash when dumping profiling data.
+Solution: Reset flag indicating that initialization was done.
+Files: src/userfunc.c
+
+Patch 8.1.0230
+Problem: Directly checking 'buftype' value.
+Solution: Add the bt_normal() function. (Yegappan Lakshmanan)
+Files: src/buffer.c, src/ex_docmd.c, src/fileio.c, src/proto/buffer.pro,
+ src/quickfix.c
+
+Patch 8.1.0231
+Problem: :help -? goes to help for -+.
+Solution: Add -? to list of special cases. (Hirohito Higashi)
+Files: src/ex_cmds.c, src/testdir/test_help_tagjump.vim
+
+Patch 8.1.0232
+Problem: Ruby error does not include backtrace.
+Solution: Add an error backtrace. (Masataka Pocke Kuwabara, closes #3267)
+Files: src/if_ruby.c
+
+Patch 8.1.0233
+Problem: "safe" argument of call_vim_function() is always FALSE.
+Solution: Remove the argument.
+Files: src/eval.c, src/proto/eval.pro, src/edit.c, src/mbyte.c,
+ src/normal.c, src/ex_getln.c
+
+Patch 8.1.0234
+Problem: Incorrect reference counting in Perl interface.
+Solution: Call SvREFCNT_inc more often, add a test. (Damien)
+Files: src/if_perl.xs, src/testdir/test_perl.vim
+
+Patch 8.1.0235 (after 8.1.0231)
+Problem: More help tags that jump to the wrong location.
+Solution: Add more exceptions and a table for "expr-" tags. (Hirohito
+ Higashi)
+Files: src/ex_cmds.c, src/testdir/test_help_tagjump.vim
+
+Patch 8.1.0236 (after 8.1.0232)
+Problem: Ruby build fails when ruby_intern is missing.
+Solution: Do not use ruby_intern2. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 8.1.0237
+Problem: Ruby on Cygwin doesn't always work.
+Solution: Use LIBRUBY_SO if LIBRUBY_ALIASES isn't set. (Ken Takata)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.1.0238
+Problem: 'buftype' is cleared when using ":term ++hidden cat". (Marcin
+ Szamotulski)
+Solution: Set the "options initialized" flag earlier. (closes #3278)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0239 (after 8.1.0236)
+Problem: Now Ruby build fails on other systems.
+Solution: Always define rb_intern. (Ken Takata, closes #3275)
+Files: src/if_ruby.c
+
+Patch 8.1.0240
+Problem: g:actual_curbuf set in wrong scope. (Daniel Hahler)
+Solution: Prepend the "g:" name space. (closes #3279)
+Files: src/buffer.c
+
+Patch 8.1.0241
+Problem: Effect of ":tabmove N" is not clear.
+Solution: Add a test that shows the behavior. (Christian Brabandt,
+ closes #3288)
+Files: src/testdir/test_tabpage.vim
+
+Patch 8.1.0242
+Problem: Insert mode completion may use an invalid buffer pointer. (Akib
+ Nizam)
+Solution: Check for ins_buf to be valid. (closes #3290)
+Files: src/edit.c
+
+Patch 8.1.0243
+Problem: Using :term ++close ++hidden closes a window. (Marcin Szamotulski)
+Solution: Don't close the window if only using it temporarily for unloading
+ the terminal buffer. (closes #3287)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0244
+Problem: No redraw when using a STOP signal on Vim and then a CONT signal.
+Solution: Catch the CONT signal and force a redraw. (closes #3285)
+Files: src/os_unix.c, src/term.c, src/proto/term.pro
+
+Patch 8.1.0245
+Problem: Calling setline() in TextChangedI autocmd breaks undo. (Jason
+ Felice)
+Solution: Don't save lines for undo when already saved. (closes #3291)
+Files: src/edit.c, src/testdir/test_autocmd.vim
+
+Patch 8.1.0246 (after 8.1.0245)
+Problem: Build failure without the +eval feature.
+Solution: Add #ifdef
+Files: src/edit.c
+
+Patch 8.1.0247
+Problem: Python: error message for failing import is incorrect.
+Solution: Adjust how modules are loaded. (Ozaki Kiichi, closes #3162)
+Files: src/if_py_both.h, src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 8.1.0248
+Problem: duplicated quickfix code.
+Solution: Move the code to a function.
+Files: src/quickfix.c
+
+Patch 8.1.0249
+Problem: GTK: when screen DPI changes Vim does not handle it.
+Solution: Handle the gtk-xft-dpi signal. (Roel van de Kraats,
+ closes #2357)
+Files: src/gui_gtk_x11.c
+
+Patch 8.1.0250
+Problem: MS-Windows using VTP: windows size change incorrect.
+Solution: Call SetConsoleScreenBufferSize() first. (Nobuhiro Takasaki,
+ closes #3164)
+Files: src/os_win32.c
+
+Patch 8.1.0251
+Problem: Using a full path is supported for 'directory' but not for
+ 'backupdir'. (Mikolaj Machowski)
+Solution: Support 'backupdir' as well. (Christian Brabandt, closes #179)
+Files: runtime/doc/options.txt, src/fileio.c, src/memline.c,
+ src/proto/memline.pro, src/testdir/test_alot.vim,
+ src/testdir/test_backup.vim, src/Make_all.mak
+
+Patch 8.1.0252
+Problem: Quickfix functions are too long.
+Solution: Refactor. (Yegappan Lakshmanan, closes #2950)
+Files: src/quickfix.c
+
+Patch 8.1.0253
+Problem: Saving and restoring window title does not always work.
+Solution: Use the stack push and pop commands. (Kouichi Iwamoto,
+ closes #3059)
+Files: runtime/doc/term.txt, src/main.c, src/option.c, src/os_unix.c,
+ src/proto/term.pro, src/term.c, src/term.h, src/vim.h,
+ src/buffer.c, src/ex_docmd.c, src/option.c, src/os_amiga.c,
+ src/os_mswin.c, src/os_win32.c
+
+Patch 8.1.0254 (after 8.1.0253)
+Problem: Cannot build on MS-Windows; Unused macro HAVE_HANDLE_DROP.
+Solution: Adjust #ifdef. Delete the macro.
+Files: src/main.c, src/vim.h
+
+Patch 8.1.0255 (after 8.1.0251)
+Problem: Backup test fails when using shadow directory.
+Solution: Remove check for "src".
+Files: src/testdir/test_backup.vim
+
+Patch 8.1.0256 (after 8.1.0245)
+Problem: Using setline() in TextChangedI splits undo.
+Solution: Use another solution for undo not working properly.
+Files: src/edit.c, src/testdir/test_autocmd.vim
+
+Patch 8.1.0257
+Problem: No test for pathshorten().
+Solution: Add a test. (Dominique Pelle, closes #3295)
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0258
+Problem: Not enough testing for the CompleteDone event.
+Solution: Add a test. (closes #3297)
+Files: src/testdir/test_ins_complete.vim
+
+Patch 8.1.0259
+Problem: No test for fixed quickfix issue.
+Solution: Add a test. Clean up the code a bit. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0260
+Problem: No LGTM logo in README file.
+Solution: Add one. (Bas van Schaik, closes #3305)
+Files: README.md
+
+Patch 8.1.0261
+Problem: Coverity complains about a negative array index.
+Solution: When qf_id2nr() cannot find the list then don't set qf_curlist.
+Files: src/quickfix.c
+
+Patch 8.1.0262
+Problem: Not enough testing for getftype().
+Solution: Add a test. (Dominique Pelle, closes #3300)
+Files: src/evalfunc.c, src/testdir/test_stat.vim
+
+Patch 8.1.0263
+Problem: Channel log doesn't show part of channel.
+Solution: Add "sock", "out", "err" or "in". (Ozaki Kiichi, closes #3303)
+Files: src/channel.c
+
+Patch 8.1.0264
+Problem: Backup tests fail when CWD is in /tmp.
+Solution: Make 'backupskip' empty. (Christian Brabandt, closes #3301)
+Files: src/testdir/test_backup.vim
+
+Patch 8.1.0265
+Problem: The getcmdline() function is way too big.
+Solution: Factor out the incremental search highlighting.
+Files: src/ex_getln.c
+
+Patch 8.1.0266
+Problem: Parsing Ex address range is not a separate function.
+Solution: Refactor do_one_cmd() to separate address parsing.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro
+
+Patch 8.1.0267
+Problem: No good check if restoring quickfix list worked.
+Solution: Let qf_restore_list() return OK/FAIL. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.1.0268
+Problem: File type checking has too many #ifdef.
+Solution: Always define the S_IF macros. (Ken Takata, closes #3306)
+Files: src/buffer.c, src/evalfunc.c, src/fileio.c, src/if_cscope.c,
+ src/os_unix.c, src/os_unix.h, src/vim.h
+
+Patch 8.1.0269
+Problem: Ruby Kernel.#p method always returns nil.
+Solution: Copy p method implementation from Ruby code. (Masataka Pocke
+ Kuwabara, closes #3315)
+Files: src/if_ruby.c, src/testdir/test_ruby.vim
+
+Patch 8.1.0270
+Problem: Checking for a Tab in a line could be faster.
+Solution: Use strchr() instead of strrchr(). (closes #3312)
+Files: src/ex_cmds.c
+
+Patch 8.1.0271
+Problem: 'incsearch' doesn't work for :s, :g or :v.
+Solution: Also use 'incsearch' for other commands that use a pattern.
+Files: src/ex_getln.c, src/globals.h, src/screen.c,
+ src/testdir/test_search.vim
+
+Patch 8.1.0272
+Problem: Options test fails if temp var ends in slash. (Tom Briden)
+Solution: Check for optional slash. (closes #3308)
+Files: src/testdir/test_options.vim
+
+Patch 8.1.0273
+Problem: Invalid memory access when using 'incsearch'.
+Solution: Reset "patlen" when using previous search pattern.
+Files: src/ex_getln.c
+
+Patch 8.1.0274
+Problem: 'incsearch' triggers on ":source".
+Solution: Check for the whole command name.
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.1.0275
+Problem: 'incsearch' with :s doesn't start at cursor line.
+Solution: Set cursor before parsing address. (closes #3318)
+ Also accept a match at the start of the first line.
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.1.0276
+Problem: No test for 'incsearch' highlighting with :s.
+Solution: Add a screendump test.
+Files: src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_substitute_01.dump
+
+Patch 8.1.0277
+Problem: 'incsearch' highlighting wrong in a few cases.
+Solution: Fix using last search pattern. Restore highlighting when changing
+ command. (issue #3321)
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_substitute_02.dump,
+ src/testdir/dumps/Test_incsearch_substitute_03.dump
+
+Patch 8.1.0278
+Problem: 'incsearch' highlighting does not accept reverse range.
+Solution: Swap the range when needed. (issue #3321)
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_substitute_04.dump
+
+Patch 8.1.0279
+Problem: 'incsearch' highlighting does not skip white space.
+Solution: Skip white space after the command. (issue #3321)
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_substitute_05.dump
+
+Patch 8.1.0280
+Problem: 'incsearch' highlighting does not work for ":g!/".
+Solution: Skip the exclamation mark. (Hirohito Higashi)
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.1.0281
+Problem: Parsing command modifiers is not separated.
+Solution: Move command modifier parsing to a separate function.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/ex_cmds.h,
+ src/globals.h, src/feature.h
+
+Patch 8.1.0282
+Problem: 'incsearch' does not work with command modifiers.
+Solution: Skip command modifiers.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/ex_getln.c,
+ src/testdir/test_search.vim
+
+Patch 8.1.0283 (after 8.1.0282)
+Problem: Missing test dump.
+Solution: Add the dump file
+Files: src/testdir/dumps/Test_incsearch_substitute_06.dump
+
+Patch 8.1.0284
+Problem: 'cursorline' highlighting wrong with 'incsearch'.
+Solution: Move the cursor back if the match is outside the range.
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_substitute_07.dump
+ src/testdir/dumps/Test_incsearch_substitute_08.dump
+
+Patch 8.1.0285
+Problem: Compiler warning for conversion.
+Solution: Add a type cast. (Mike Williams)
+Files: src/ex_getln.c
+
+Patch 8.1.0286
+Problem: 'incsearch' does not apply to :smagic and :snomagic.
+Solution: Add support. (Hirohito Higashi)
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.1.0287
+Problem: MAX is not defined everywhere.
+Solution: Define MAX where needed.
+Files: src/ex_getln.c
+
+Patch 8.1.0288
+Problem: Quickfix code uses cmdidx too often.
+Solution: Add is_loclist_cmd(). (Yegappan Lakshmanan)
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/quickfix.c
+
+Patch 8.1.0289
+Problem: Cursor moves to wrong column after quickfix jump.
+Solution: Set the curswant flag. (Andy Massimino, closes #3331)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0290
+Problem: "cit" on an empty HTML tag changes the whole tag.
+Solution: Only adjust the area in Visual mode. (Andy Massimino,
+ closes #3332)
+Files: src/search.c, src/testdir/test_textobjects.vim
+
+Patch 8.1.0291
+Problem: 'incsearch' highlighting not used for :sort.
+Solution: Handle pattern in :sort command.
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_sort_01.dump
+
+Patch 8.1.0292
+Problem: MS-Windows: the text "self-installing" confuses some users.
+Solution: Remove the text from the uninstall entry. (closes #3337)
+Files: src/dosinst.c
+
+Patch 8.1.0293
+Problem: Checks for type of stack is cryptic.
+Solution: Define IS_QF_STACK() and IS_LL_STACK(). (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.1.0294
+Problem: MS-Windows: sometimes uses short directory name.
+Solution: Expand to long file name with correct caps. (Nobuhiro Takasaki,
+ closes #3334)
+Files: src/os_win32.c
+
+Patch 8.1.0295
+Problem: No 'incsearch' highlighting for :vimgrep and similar commands.
+Solution: Parse the :vimgrep command and similar ones to locate the search
+ pattern. (Hirohito Higashi, closes #3344)
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_vimgrep_01.dump,
+ src/testdir/dumps/Test_incsearch_vimgrep_02.dump,
+ src/testdir/dumps/Test_incsearch_vimgrep_03.dump,
+ src/testdir/dumps/Test_incsearch_vimgrep_04.dump,
+ src/testdir/dumps/Test_incsearch_vimgrep_05.dump
+
+Patch 8.1.0296
+Problem: Command parsing for 'incsearch' is a bit ugly.
+Solution: Return when there is no pattern. Put common checks together.
+Files: src/ex_getln.c
+
+Patch 8.1.0297 (after 8.1.0294)
+Problem: MS-Windows: tests fail, Vim crashes.
+Solution: Fix long file name handling.
+Files: src/os_win32.c
+
+Patch 8.1.0298
+Problem: Window resize test sometimes fails on Mac.
+Solution: Add Test_popup_and_window_resize() to flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0299 (after 8.1.0298)
+Problem: misplaced comment
+Solution: Remove comment
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0300
+Problem: The old window title might be freed twice. (Dominique Pelle)
+Solution: Do not free "oldtitle" in a signal handler but set a flag to have
+ it freed later.
+Files: src/os_unix.c
+
+Patch 8.1.0301
+Problem: GTK: Input method popup displayed on wrong screen.
+Solution: Add the screen position offset. (Ken Takata, closes #3268)
+Files: src/gui_beval.c, src/gui_gtk_x11.c, src/mbyte.c,
+ src/proto/gui_gtk_x11.pro
+
+Patch 8.1.0302
+Problem: Crash when using :suspend and "fg".
+Solution: Undo patch 8.1.0244.
+Files: src/os_unix.c, src/term.c, src/proto/term.pro
+
+Patch 8.1.0303
+Problem: line2byte() is wrong for last line with 'noeol' and 'nofixeol'.
+Solution: Fix off-by-one error. (Shane Harper, closes #3351)
+Files: src/memline.c, src/testdir/test_functions.vim
+
+Patch 8.1.0304
+Problem: No redraw when using a STOP signal on Vim and then a CONT signal.
+Solution: Catch the CONT signal and set the terminal to raw mode. This is
+ like 8.1.0244 but without the screen redraw and a fix for
+ multi-threading suggested by Dominique Pelle.
+Files: src/os_unix.c, src/term.c, src/proto/term.pro
+
+Patch 8.1.0305
+Problem: Missing support for Lua 5.4 32 bits on Unix.
+Solution: Define lua_newuserdatauv. (Kazunobu Kuriyama)
+Files: src/if_lua.c
+
+Patch 8.1.0306
+Problem: Plural messages are not translated properly.
+Solution: Add more usage of NGETTEXT(). (Sergey Alyoshin)
+Files: src/vim.h, src/buffer.c, src/ex_cmds.c, src/ex_docmd.c,
+ src/fileio.c, src/misc1.c, src/ops.c
+
+Patch 8.1.0307
+Problem: There is no good way to get the window layout.
+Solution: Add the winlayout() function. (Yegappan Lakshmanan)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/proto/window.pro,
+ src/window.c, src/testdir/test_window_id.vim
+
+Patch 8.1.0308
+Problem: A quick undo shows "1 seconds ago". (Tony Mechelynck)
+Solution: Add singular/plural message.
+Files: src/undo.c
+
+Patch 8.1.0309
+Problem: Profiling does not show a count for condition lines. (Daniel
+ Hahler)
+Solution: Count lines when not skipping. (Ozaki Kiichi, closes #2499)
+Files: src/ex_docmd.c, src/testdir/test_profile.vim
+
+Patch 8.1.0310
+Problem: File info message not always suppressed with 'F' in 'shortmess'.
+ (Asheq Imran)
+Solution: Save and restore msg_silent. (Christian Brabandt, closes #3221)
+Files: src/buffer.c, src/memline.c, src/testdir/test_options.vim
+
+Patch 8.1.0311
+Problem: Filtering entries in a quickfix list is not easy.
+Solution: Add the cfilter plugin. (Yegappan Lakshmanan)
+Files: runtime/pack/dist/opt/cfilter/plugin/cfilter.vim,
+ runtime/doc/quickfix.txt
+
+Patch 8.1.0312
+Problem: Wrong type for flags used in signal handlers.
+Solution: Use sig_atomic_t. (Dominique Pelle, closes #3356)
+Files: src/globals.h, src/os_unix.c, src/os_win32.h
+
+Patch 8.1.0313
+Problem: Information about a swap file is unavailable.
+Solution: Add swapinfo(). (Enzo Ferber)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/memline.c,
+ src/proto/memline.pro, src/testdir/test_swap.vim
+
+Patch 8.1.0314 (after 8.1.0313)
+Problem: Build failure without the +eval feature. (Brenton Horne)
+Solution: Add #ifdef. Also add the "dirty" item.
+Files: src/memline.c, runtime/doc/eval.txt, src/testdir/test_swap.vim
+
+Patch 8.1.0315
+Problem: Helpgrep with language doesn't work properly. (Takuya Fujiwara)
+Solution: Check for the language earlier. (Hirohito Higashi)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0316
+Problem: swapinfo() test fails on Travis.
+Solution: Handle a long host name. (Ozaki Kiichi, closes #3361)
+ Also make the version check flexible. (James McCoy)
+Files: src/testdir/test_swap.vim
+
+Patch 8.1.0317
+Problem: Cscope test fails when using shadow directory.
+Solution: Resolve symlink in Vim. (James McCoy, closes #3364)
+Files: src/testdir/test_cscope.vim
+
+Patch 8.1.0318
+Problem: The getftype() test may fail for char devices if the file
+ disappeared in between the listing and the getftype() call.
+Solution: Ignore empty result. (Ozaki Kiichi, closes #3360)
+Files: src/testdir/test_stat.vim
+
+Patch 8.1.0319
+Problem: bzero() function prototype doesn't work for Android.
+Solution: Add an #ifdef. (Elliott Hughes, closes #3365)
+Files: src/osdef1.h.in
+
+Patch 8.1.0320
+Problem: Too much 'incsearch' highlight for pattern matching everything.
+Solution: Add the skiplen to the command and remove the line range.
+ (Christian Brabandt) Check for empty pattern earlier.
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_substitute_09.dump
+
+Patch 8.1.0321 (after 8.1.0320)
+Problem: 'incsearch' regression: /\v highlights everything.
+Solution: Put back the empty_pattern() check.
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_search_01.dump,
+ src/testdir/dumps/Test_incsearch_search_02.dump
+
+Patch 8.1.0322
+Problem: Test_copy_winopt() does not restore 'hidden'.
+Solution: Restore the option, fix indent. (Ozaki Kiichi, closes #3367)
+Files: src/testdir/test_options.vim
+
+Patch 8.1.0323
+Problem: Reverse order of VTP calls only needed the first time.
+Solution: Add a flag to remember the state. (Nobuhiro Takasaki, closes #3366)
+Files: src/os_win32.c
+
+Patch 8.1.0324
+Problem: Off-by-one error in cmdidx check. (Coverity)
+Solution: Use ">=" instead of ">".
+Files: src/ex_docmd.c
+
+Patch 8.1.0325
+Problem: Strings in swap file may not be NUL terminated. (Coverity)
+Solution: Limit the length of the used string.
+Files: src/memline.c
+
+Patch 8.1.0326
+Problem: Screen dump does not consider NUL and space equal.
+Solution: Use temp variables instead of character from cell.
+Files: src/terminal.c, src/testdir/dumps/Test_syntax_c_01.dump
+
+Patch 8.1.0327
+Problem: The "g CTRL-G" command isn't tested much.
+Solution: Add more tests. (Dominique Pelle, closes #3369)
+Files: src/testdir/test_normal.vim
+
+Patch 8.1.0328
+Problem: inputlist() doesn't work with a timer. (Dominique Pelle)
+Solution: Don't redraw when cmdline_row is zero. (Hirohito Higashi,
+ closes #3239)
+Files: src/misc1.c, src/screen.c
+
+Patch 8.1.0329
+Problem: Using inputlist() during startup results in garbage. (Dominique
+ Pelle)
+Solution: Make sure the xterm tracing is stopped when disabling the mouse.
+Files: src/os_unix.c
+
+Patch 8.1.0330
+Problem: The qf_add_entries() function is too long.
+Solution: Split in two parts. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.1.0331
+Problem: Insufficient test coverage for :mkview and :loadview.
+Solution: Add tests. (Dominique Pelle, closes #3385)
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.0332
+Problem: Get Gdk-Critical error on first balloon show.
+Solution: Get screen geometry using the draw area widget. (Davit Samvelyan,
+ closes #3386)
+Files: src/gui_beval.c
+
+Patch 8.1.0333
+Problem: :mkview does not restore cursor properly after "$". (Dominique
+ Pelle)
+Solution: Position the cursor with "normal! $".
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.1.0334
+Problem: 'autowrite' takes effect when buffer is not to be written.
+Solution: Don't write buffers that are not supposed to be written. (Even Q
+ Jones, closes #3391) Add tests for 'autowrite'.
+Files: src/ex_cmds2.c, src/testdir/test_writefile.vim
+
+Patch 8.1.0335
+Problem: mkview test fails on CI.
+Solution: Attempt to force recomputing curswant after folding.
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.0336
+Problem: mkview test still fails on CI.
+Solution: Ignore curswant, don't see another solution.
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.0337
+Problem: :file fails in quickfix command.
+Solution: Allow :file without argument when curbuf_lock is set. (Jason
+ Franklin)
+Files: src/ex_docmd.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0338
+Problem: MS-Windows: VTP doesn't work properly with PowerShell.
+Solution: Adjust the color index. (Nobuhiro Takasaki, closes #3347)
+Files: src/os_win32.c
+
+Patch 8.1.0339
+Problem: Wrong highlight when 'incsearch' set and cancelling :s.
+Solution: Reset search line range. (Hirohito Higashi, Masamichi Abe)
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_substitute_10.dump
+
+Patch 8.1.0340
+Problem: No test for :spellinfo.
+Solution: Add a test. (Dominique Pelle, closes #3394)
+Files: src/testdir/test_spell.vim
+
+Patch 8.1.0341
+Problem: :argadd in empty buffer changes the buffer name. (Pavol Juhas)
+Solution: Don't re-use the current buffer when not going to edit the file.
+ (closes #3397) Do re-use the current buffer for :next.
+Files: src/ex_cmds2.c, src/testdir/test_arglist.vim,
+ src/testdir/test_command_count.vim
+
+Patch 8.1.0342
+Problem: Crash when a callback deletes a window that is being used. (Ozaki
+ Kiichi)
+Solution: Do not unload a buffer that is being displayed while redrawing the
+ screen. Also avoid invoking callbacks while redrawing.
+ (closes #2107)
+Files: src/buffer.c, src/misc2.c
+
+Patch 8.1.0343
+Problem: 'shellslash' is not used for getcwd() with local directory.
+ (Daniel Hahler)
+Solution: Call slash_adjust() later. (closes #3399)
+Files: src/evalfunc.c
+
+Patch 8.1.0344
+Problem: 'hlsearch' highlighting has a gap after /$.
+Solution: Remove suspicious code. (Ricky Zhou, closes #3400)
+Files: src/screen.c, src/testdir/test_hlsearch.vim
+
+Patch 8.1.0345
+Problem: Cannot get the window id associated with the location list.
+Solution: Add the "filewinid" argument to getloclist(). (Yegappan
+ Lakshmanan, closes #3202)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.1.0346
+Problem: Building with Aap is outdated and unused.
+Solution: Remove the Aap build files.
+Files: Filelist, src/main.aap, src/testdir/main.aap, src/config.aap.in,
+ runtime/macros/maze/main.aap
+
+Patch 8.1.0347
+Problem: Some tests fail on Solaris.
+Solution: Skip writefile test. Fix path to libc.so. Improve test for Turkish
+ case change. (Libor Bukata, Bjorn Linse, closes #3403)
+Files: src/testdir/test_functions.vim, src/testdir/test_normal.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.1.0348
+Problem: On Travis the slowest build is run last. (Dominique Pelle)
+Solution: Reorder the build entries.
+Files: .travis.yml
+
+Patch 8.1.0349
+Problem: Crash when wiping buffer in a callback.
+Solution: Do not handle messages when only peeking for a character.
+ (closes #2107) Add "redraw_flag" to test_override().
+Files: src/os_unix.c, src/os_win32.c, src/screen.c, src/evalfunc.c,
+ src/globals.h, runtime/doc/eval.txt
+
+Patch 8.1.0350
+Problem: Vim may block on ch_sendraw() when the job is sending data back to
+ Vim, which isn't read yet. (Nate Bosch)
+Solution: Add the "noblock" option to job_start(). (closes #2548)
+Files: src/channel.c, src/structs.h, src/testdir/test_channel.vim,
+ runtime/doc/channel.txt
+
+Patch 8.1.0351
+Problem: 'incsearch' for :/foo/s//<Esc> changes last search pattern.
+Solution: Save the last search pattern earlier.
+Files: src/ex_docmd.c, src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.1.0352
+Problem: Browsing compressed tar files does not always work.
+Solution: Use the "file" command to get the compression type.
+Files: runtime/autoload/tar.vim
+
+Patch 8.1.0353
+Problem: An "after" directory of a package is appended to 'rtp', which
+ will be after the user's "after" directory. ()
+Solution: Insert the package "after" directory before any other "after"
+ directory in 'rtp'. (closes #3409)
+Files: src/ex_cmds2.c, src/testdir/test_packadd.vim
+
+Patch 8.1.0354 (after 8.1.0353)
+Problem: Packadd test fails on MS-Windows.
+Solution: Ignore difference between forward and backward slashes.
+Files: src/testdir/test_packadd.vim
+
+Patch 8.1.0355
+Problem: Incorrect adjusting the popup menu for the preview window.
+Solution: Compute position and height properly. (Ronan Pigott) Also show at
+ least ten items. (closes #3414)
+Files: src/popupmnu.c
+
+Patch 8.1.0356
+Problem: Using :s with 'incsearch' prevents CTRL-R CTRL-W. (Boris Staletic)
+Solution: When past the pattern put cursor back in the start position.
+ (closes #3413)
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.1.0357
+Problem: Instructions for tests are outdated. (Jason Franklin)
+Solution: Update the text.
+Files: src/testdir/README.txt
+
+Patch 8.1.0358
+Problem: Crash when using term_dumpwrite() after the job finished.
+Solution: Check for a finished job and give an error message.
+Files: src/terminal.c
+
+Patch 8.1.0359
+Problem: No clue what test failed when using a screendump twice.
+Solution: Add an extra argument to VerifyScreenDump().
+Files: src/testdir/screendump.vim
+
+Patch 8.1.0360
+Problem: Using an external diff program is slow and inflexible.
+Solution: Include the xdiff library. (Christian Brabandt, closes #2732)
+ Use it by default.
+Files: Filelist, runtime/doc/diff.txt, runtime/doc/options.txt,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Makefile, src/diff.c,
+ src/structs.h, src/testdir/dumps/Test_diff_01.dump,
+ src/testdir/dumps/Test_diff_02.dump,
+ src/testdir/dumps/Test_diff_03.dump,
+ src/testdir/dumps/Test_diff_04.dump,
+ src/testdir/dumps/Test_diff_05.dump,
+ src/testdir/dumps/Test_diff_06.dump,
+ src/testdir/dumps/Test_diff_07.dump,
+ src/testdir/dumps/Test_diff_08.dump,
+ src/testdir/dumps/Test_diff_09.dump,
+ src/testdir/dumps/Test_diff_10.dump,
+ src/testdir/dumps/Test_diff_11.dump,
+ src/testdir/dumps/Test_diff_12.dump,
+ src/testdir/dumps/Test_diff_13.dump,
+ src/testdir/dumps/Test_diff_14.dump,
+ src/testdir/dumps/Test_diff_15.dump,
+ src/testdir/dumps/Test_diff_16.dump,
+ src/testdir/test_diffmode.vim, src/xdiff/COPYING,
+ src/xdiff/xdiff.h, src/xdiff/xdiffi.c, src/xdiff/xdiffi.h,
+ src/xdiff/xemit.c, src/xdiff/xemit.h, src/xdiff/xhistogram.c,
+ src/xdiff/xinclude.h, src/xdiff/xmacros.h, src/xdiff/xpatience.c,
+ src/xdiff/xprepare.c, src/xdiff/xprepare.h, src/xdiff/xtypes.h,
+ src/xdiff/xutils.c, src/xdiff/xutils.h, src/xdiff/README.txt
+
+Patch 8.1.0361
+Problem: Remote user not used for completion. (Stucki)
+Solution: Use $USER too. (Dominique Pelle, closes #3407)
+Files: src/misc1.c
+
+Patch 8.1.0362
+Problem: Cannot get the script line number when executing a function.
+Solution: Store the line number besides the script ID. (Ozaki Kiichi,
+ closes #3362) Also display the line number with ":verbose set".
+Files: runtime/doc/cmdline.txt, runtime/doc/eval.txt, src/Make_all.mak,
+ src/buffer.c, src/eval.c, src/evalfunc.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/fileio.c, src/getchar.c,
+ src/globals.h, src/main.c, src/menu.c, src/option.c,
+ src/proto/eval.pro, src/structs.h, src/syntax.c,
+ src/testdir/test_alot.vim, src/testdir/test_expand_func.vim,
+ src/testdir/test_maparg.vim, src/term.c src/userfunc.c
+
+Patch 8.1.0363
+Problem: Internal diff isn't used by default as advertised.
+Solution: Add "internal" to the default value of 'diffopt'.
+ Also add couple of files missing from the distribution.
+Files: src/option.c, runtime/doc/options.txt, Filelist
+
+Patch 8.1.0364
+Problem: Compiler warning in xdiff code. (Yegappan Lakshmanan)
+Solution: Initialize directly.
+Files: src/xdiff/xemit.c, src/xdiff/README.txt
+
+Patch 8.1.0365
+Problem: Function profile doesn't specify where it was defined.
+Solution: Show the script name and line number.
+Files: src/userfunc.c, src/testdir/test_profile.vim
+
+Patch 8.1.0366
+Problem: Pieces of the xdiff code are not used.
+Solution: Add "#if 0" to omit unused code.
+Files: src/xdiff/xemit.c
+
+Patch 8.1.0367
+Problem: getchar(1) no longer processes pending messages. (Yasuhiro
+ Matsumoto)
+Solution: Call parse_queued_messages().
+Files: src/evalfunc.c
+
+Patch 8.1.0368
+Problem: GTK code has too many #ifdefs and building fails with GTK 2.10.
+Solution: Always use gtk_widget_get_window() and define it for older GTK
+ versions. (Ken Takata, closes #3421)
+Files: src/gui_beval.c, src/gui_gtk.c, src/gui_gtk_f.c,
+ src/gui_gtk_x11.c, src/mbyte.c, src/vim.h
+
+Patch 8.1.0369
+Problem: Continuation lines cannot contain comments.
+Solution: Support using "\ .
+Files: src/ex_cmds2.c, src/testdir/test_eval_stuff.vim,
+ runtime/indent/vim.vim, runtime/doc/repeat.txt
+
+Patch 8.1.0370
+Problem: Not using internal diff if 'diffopt' is not changed.
+Solution: Correct initialization of diff_flags. (Christian Brabandt)
+Files: src/diff.c
+
+Patch 8.1.0371
+Problem: Argument types for select() may be wrong.
+Solution: Use a configure macro. (Tobias Ulmer)
+Files: src/config.h.in, src/configure.ac, src/auto/configure,
+ src/os_unix.c
+
+Patch 8.1.0372
+Problem: Screen updating slow when 'cursorline' is set.
+Solution: Only redraw the old and new cursor line, not all lines.
+Files: src/edit.c, src/move.c, src/screen.c, src/proto/screen.pro
+
+Patch 8.1.0373 (after 8.1.0372)
+Problem: Screen updating still slow when 'cursorline' is set.
+Solution: Fix setting last_cursorline.
+Files: src/move.c
+
+Patch 8.1.0374
+Problem: Moving the cursor is slow when 'relativenumber' is set.
+Solution: Only redraw the number column, not all lines.
+Files: src/screen.c, src/move.c
+
+Patch 8.1.0375
+Problem: Cannot use diff mode with Cygwin diff.exe. (Igor Forca)
+Solution: Skip over unrecognized lines in the diff output.
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.1.0376
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Initialize the variable.
+Files: src/screen.c
+
+Patch 8.1.0377
+Problem: Xdiff doesn't use the Vim memory allocation functions.
+Solution: Change the xdl_ defines. Check for out-of-memory. Rename
+ "ignored" to "vim_ignored".
+Files: src/xdiff/xdiff.h, src/xdiff/xpatience.c, src/xdiff/xdiffi.c,
+ src/channel.c, src/diff.c, src/evalfunc.c, src/ex_cmds.c,
+ src/fileio.c, src/main.c, src/mbyte.c, src/netbeans.c,
+ src/os_unix.c, src/os_win32.c, src/ui.c, src/window.c,
+ src/globals.h, src/term.c
+
+Patch 8.1.0378
+Problem: CI build failure.
+Solution: Include vim.h as ../vim.h. Fix compiler warning.
+Files: src/xdiff/xdiff.h, src/xdiff/xpatience.c
+
+Patch 8.1.0379
+Problem: Build dependencies are incomplete.
+Solution: Update the build dependencies, mainly for xdiff. Adjust object
+ directory for libvterm and xdiff.
+Files: src/Makefile, src/configure.ac, src/auto/configure,
+ src/libvterm/src/screen.c, src/libvterm/src/termscreen.c,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.1.0380
+Problem: "make proto" doesn't work well.
+Solution: Define a few more types for cproto. Update proto files. Fix that
+ workshop didn't build.
+Files: src/vim.h, src/protodef.h, src/if_ruby.c, src/workshop.c,
+ src/proto/digraph.pro, src/hardcopy.pro, src/proto/option.pro,
+ src/proto/window.pro
+
+Patch 8.1.0381
+Problem: Variable declaration not at start of block.
+Solution: Fix line ordering.
+Files: src/xdiff/xpatience.c
+
+Patch 8.1.0382
+Problem: Some make programs can't handle dependency on "xdiff/../".
+Solution: Strip it out.
+Files: src/Makefile
+
+Patch 8.1.0383
+Problem: Missing source file rename.
+Solution: Update the dependency.
+Files: src/Make_mvc.mak
+
+Patch 8.1.0384
+Problem: Sign ordering depends on +netbeans feature.
+Solution: Also order signs without +netbeans. (Christian Brabandt,
+ closes #3224)
+Files: src/structs.h, src/buffer.c
+
+Patch 8.1.0385
+Problem: Coveralls badge doesn't update.
+Solution: Update the URL
+Files: README.md
+
+Patch 8.1.0386
+Problem: Cannot test with non-default option value.
+Solution: Add test_option_not_set().
+Files: runtime/doc/eval.txt, src/option.c, src/proto/option.pro,
+ src/evalfunc.c
+
+Patch 8.1.0387
+Problem: No test for 'ambiwidth' detection.
+Solution: Add a test.
+Files: src/testdir/test_startup_utf8.vim
+
+Patch 8.1.0388
+Problem: Coverity complains about possible NULL pointer use.
+Solution: Use get_tv_string() instead of get_tv_string_chk().
+Files: src/evalfunc.c
+
+Patch 8.1.0389
+Problem: :behave command is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3429)
+Files: src/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_behave.vim
+
+Patch 8.1.0390
+Problem: Scrollbars are not tested.
+Solution: Add test_scrollbar() and a test.
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_gui.vim
+
+Patch 8.1.0391
+Problem: Building in a shadow directory fails.
+Solution: Don't link the xdiff directory but what's in it. (closes #3428)
+Files: src/Makefile
+
+Patch 8.1.0392
+Problem: Error while typing :/foo/s// with 'incsearch' enabled.
+Solution: Do not give search errors when highlighting matches.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/ex_getln.c,
+ src/testdir/test_search.vim
+
+Patch 8.1.0393
+Problem: Not all white space difference options available.
+Solution: Add "iblank", "iwhiteall" and "iwhiteeol" to 'diffopt'.
+Files: src/diff.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_17.dump,
+ src/testdir/dumps/Test_diff_18.dump,
+ src/testdir/dumps/Test_diff_19.dump,
+ src/testdir/dumps/Test_diff_20.dump
+
+Patch 8.1.0394
+Problem: Diffs are not always updated correctly.
+Solution: When using internal diff update for any changes properly.
+Files: src/structs.h, src/diff.c, src/proto/diff.pro, src/misc1.c,
+ src/main.c
+
+Patch 8.1.0395
+Problem: Compiler warning on 64-bit MS-Windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/diff.c
+
+Patch 8.1.0396
+Problem: Another compiler warning on 64-bit MS-Windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/xdiff/xutils.c
+
+Patch 8.1.0397
+Problem: No event triggered after updating diffs.
+Solution: Add the DiffUpdated event.
+Files: src/vim.h, src/diff.c, src/fileio.c,
+ src/testdir/test_diffmode.vim, runtime/doc/autocmd.txt
+
+Patch 8.1.0398
+Problem: No test for -o and -O command line arguments.
+Solution: Add a test. (Dominique Pelle, closes #3438)
+Files: src/testdir/test_startup.vim
+
+Patch 8.1.0399
+Problem: 'hlsearch' highlight remains in other window after cancelling
+ command.
+Solution: Redraw all windows. Also remove unnecessary delays. (closes #3437)
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_substitute_11.dump,
+ src/testdir/dumps/Test_incsearch_substitute_12.dump,
+ src/testdir/dumps/Test_incsearch_substitute_13.dump
+
+Patch 8.1.0400
+Problem: Using freed memory with :diffget.
+Solution: Skip ex_diffupdate() while updating diffs. (closes #3442)
+Files: src/diff.c
+
+Patch 8.1.0401
+Problem: Can't get swap name of another buffer.
+Solution: Add swapname(). (Ozaki Kiichi, closes #3441)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_swap.vim
+
+Patch 8.1.0402
+Problem: The DiffUpdate event isn't triggered for :diffput.
+Solution: Also trigger DiffUpdate for :diffget and :diffput.
+Files: src/diff.c
+
+Patch 8.1.0403
+Problem: Header file missing from distribution.
+Solution: Add src/protodef.h.
+Files: Filelist
+
+Patch 8.1.0404
+Problem: Accessing invalid memory with long argument name.
+Solution: Use item_count instead of checking for a terminating NULL.
+ (Dominique Pelle, closes #3444)
+Files: src/testdir/test_arglist.vim, src/version.c
+
+Patch 8.1.0405
+Problem: Too many #ifdefs for GTK.
+Solution: Define macros instead of using #ifdef. (Ken Takata, closes #3436)
+Files: src/gui_beval.c, src/gui_gtk.c, src/gui_gtk_f.c,
+ src/gui_gtk_x11.c, src/vim.h
+
+Patch 8.1.0406
+Problem: Several command line arguments are not tested.
+Solution: Add tests for -A, -F, -H, -p and -V. (Dominique Pelle,
+ closes #3446)
+Files: src/testdir/test_startup.vim
+
+Patch 8.1.0407
+Problem: Quickfix code mixes using the stack and a list pointer.
+Solution: Use a list pointer in more places. (Yegappan Lakshmanan,
+ closes #3443)
+Files: src/quickfix.c
+
+Patch 8.1.0408
+Problem: MSVC: cannot use the "x64" native compiler option.
+Solution: Ignore case for %Platform%. Improve documentation. (Ken Takata)
+Files: src/INSTALLpc.txt, src/msvc2015.bat
+
+Patch 8.1.0409 (after 8.1.0406)
+Problem: Startup test fails on MS-Windows.
+Solution: Do the Arabic test in silent Ex mode. Loosen the check for -V2.
+Files: src/testdir/test_startup.vim
+
+Patch 8.1.0410
+Problem: The ex_copen() function is too long.
+Solution: Refactor to split off two functions. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.1.0411
+Problem: Renamed file missing from distribution.
+Solution: Rename screen.c to termscreen.c (Zdenek Dohnal, closes #3449)
+Files: Filelist
+
+Patch 8.1.0412
+Problem: Cannot build with GTK 2.4.
+Solution: Add back a few #ifdefs. (Ken Takata, closes #3447)
+ Also support older GTK. (Tom Christensen)
+Files: src/gui_gtk_x11.c
+
+Patch 8.1.0413
+Problem: Test output is duplicated or missing.
+Solution: Adjust the MS-Windows and Unix test makefiles. (Ken Takata,
+ closes #3452)
+Files: src/testdir/Make_dos.mak, src/testdir/Makefile
+
+Patch 8.1.0414
+Problem: v:option_old and v:option_new are cleared when using :set in
+ OptionSet autocmd. (Gary Johnson)
+Solution: Don't trigger OptionSet recursively.
+Files: src/option.c
+
+Patch 8.1.0415
+Problem: Not actually using 16 colors with vtp.
+Solution: Always use 256 colors when vtp is used. (Nobuhiro Takasaki,
+ closes #3432)
+Files: src/option.c, src/term.c
+
+Patch 8.1.0416
+Problem: Sort doesn't report deleted lines.
+Solution: Call msgmore(). (Christian Brabandt, closes #3454)
+Files: src/ex_cmds.c, src/testdir/test_sort.vim
+
+Patch 8.1.0417
+Problem: Several command line arguments are not tested.
+Solution: Add tests for -m, -M, -R and -Vfile. (Dominique Pelle,
+ closes #3458)
+Files: src/testdir/test_startup.vim
+
+Patch 8.1.0418
+Problem: MS-Windows: cannot separate Lua include and library directories.
+Solution: Add LUA_LIBDIR and LUA_INCDIR. (Ken Takata, closes #3464)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.0419
+Problem: Cygwin: running cproto fails with -O2.
+Solution: Strip -O2 for cproto. (Ken Takata, closes #3465)
+Files: src/Makefile
+
+Patch 8.1.0420
+Problem: Generating vim.lib when using ActivePerl 5.20.3 or later.
+Solution: Redefine XS_EXTERNAL(). (Ken Takata, closes #3462)
+Files: src/if_perl.xs
+
+Patch 8.1.0421
+Problem: MS-Windows: Ruby path is wrong for Ruby 1.9 and later.
+Solution: Let -I argument depend on Ruby version. (Ken Takata, closes #3461)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.1.0422
+Problem: Cannot create map file with MinGW.
+Solution: Add support for $MAP. (Ken Takata, closes #3460)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.0423
+Problem: MS-Windows: using dup-close for flushing a file.
+Solution: Use _commit(). (Ken Takata, closes #3463)
+Files: src/memfile.c, src/os_mac.h, src/os_win32.h
+
+Patch 8.1.0424
+Problem: Test output is very verbose, loading CI log is slow.
+Solution: Redirect output to /dev/null. (Ken Takata, closes #3456)
+Files: src/testdir/Makefile
+
+Patch 8.1.0425
+Problem: ml_get error and crash with appendbufline(). (Masashi Iizuka)
+Solution: Set per-window buffer info. (Hirohito Higashi, closes #3455)
+Files: src/buffer.c, src/testdir/test_bufline.vim
+
+Patch 8.1.0426
+Problem: Accessing invalid memory in SmcOpenConnection().
+Solution: Reduce size of errorstring by one. (Dominique Pelle, closes #3469)
+Files: src/os_unix.c, src/testdir/test_startup.vim
+
+Patch 8.1.0427
+Problem: MS-Windows GUI: using invalid encoded file name.
+Solution: Drop the file name and return NULL. (Ken Takata, closes #3467)
+Files: src/gui_w32.c
+
+Patch 8.1.0428
+Problem: The :suspend command is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3472)
+Files: src/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_suspend.vim
+
+Patch 8.1.0429 (after 8.1.0343)
+Problem: No test for :lcd with 'shellslash'.
+Solution: Add a test. (Daniel Hahler, closes #3475)
+Files: src/testdir/test_getcwd.vim
+
+Patch 8.1.0430
+Problem: Xargadd file left behind after running test.
+Solution: Delete the file. (Dominique Pelle)
+Files: src/testdir/test_arglist.vim
+
+Patch 8.1.0431
+Problem: The qf_jump() function is too long.
+Solution: Refactor to split it into several functions. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.1.0432
+Problem: Compiler warning for signed/unsigned.
+Solution: Add type cast. (Mike Williams)
+Files: src/xdiff/xemit.c
+
+Patch 8.1.0433
+Problem: Mapping can obtain text from inputsecret(). (Tommy Allen)
+Solution: Disallow CTRL-R = and CTRL-\ e when using inputsecret().
+Files: src/ex_getln.c
+
+Patch 8.1.0434
+Problem: copy_loclist() is too long.
+Solution: Split in multiple functions. (Yegappan Lakshmanan)
+Files: src/proto/quickfix.pro, src/quickfix.c, src/window.c
+
+Patch 8.1.0435
+Problem: Cursorline highlight not removed in some situation. (Vitaly
+ Yashin)
+Solution: Reset last_cursorline when resetting 'cursorline'. (Christian
+ Brabandt, closes #3481)
+Files: src/move.c, src/proto/move.pro, src/option.c
+
+Patch 8.1.0436
+Problem: Can get the text of inputsecret() with getcmdline(). (Tommy Allen)
+Solution: Don't return the text.
+Files: src/ex_getln.c
+
+Patch 8.1.0437
+Problem: May access freed memory when syntax HL times out. (Philipp Gesang)
+Solution: Clear b_sst_first when clearing b_sst_array.
+Files: src/syntax.c
+
+Patch 8.1.0438
+Problem: The ex_make() function is too long.
+Solution: Split it into several functions. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.1.0439
+Problem: Recursive use of getcmdline() still not protected.
+Solution: Instead of saving the command buffer when making a call which may
+ cause recursiveness, save the buffer when actually being called
+ recursively.
+Files: src/ex_getln.c, src/proto/ex_getln.pro, src/getchar.c, src/main.c
+
+Patch 8.1.0440
+Problem: remove() with a range not sufficiently tested.
+Solution: Add a test. (Dominique Pelle, closes #3497)
+Files: src/testdir/test_listdict.vim
+
+Patch 8.1.0441
+Problem: Build failure without command line history.
+Solution: Move cmdline_init() outside of #ifdef.
+Files: src/ex_getln.c
+
+Patch 8.1.0442
+Problem: GUI: Cursor not drawn after ":redraw | sleep".
+Solution: Flush the output. (closes #3496)
+Files: src/ex_docmd.c
+
+Patch 8.1.0443
+Problem: Unnecessary static function prototypes.
+Solution: Remove unnecessary prototypes.
+Files: src/arabic.c, src/blowfish.c, src/buffer.c, src/charset.c,
+ src/crypt_zip.c, src/digraph.c, src/edit.c, src/eval.c,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/ex_eval.c, src/ex_getln.c, src/fileio.c, src/getchar.c,
+ src/gui.c, src/gui_at_fs.c, src/gui_athena.c, src/gui_gtk_x11.c,
+ src/gui_mac.c, src/gui_motif.c, src/gui_photon.c, src/gui_w32.c,
+ src/gui_x11.c, src/hangulin.c, src/hardcopy.c, src/if_cscope.c,
+ src/if_mzsch.c, src/if_python3.c, src/if_xcmdsrv.c,
+ src/integration.c, src/json.c, src/main.c, src/mbyte.c,
+ src/memline.c, src/message.c, src/misc1.c, src/misc2.c,
+ src/move.c, src/netbeans.c, src/normal.c, src/ops.c, src/option.c,
+ src/os_unix.c, src/os_win32.c, src/pty.c, src/regexp.c,
+ src/screen.c, src/search.c, src/sha256.c, src/spell.c,
+ src/spellfile.c, src/syntax.c, src/tag.c, src/term.c, src/ui.c,
+ src/undo.c, src/version.c, src/window.c, src/workshop.c
+
+Patch 8.1.0444
+Problem: Unnecessary check for NULL pointer.
+Solution: Remove check and call vim_free() directly.
+Files: src/beval.c
+
+Patch 8.1.0445
+Problem: Setting 'term' does not store location for termcap options.
+Solution: Set the script context for termcap options that are changed when
+ 'term' is set.
+Files: src/option.c, src/proto/option.pro, src/term.c,
+ src/testdir/test_options.vim
+
+Patch 8.1.0446
+Problem: Options test fails in the GUI.
+Solution: Don't try changing 'term' in the GUI.
+Files: src/testdir/test_options.vim
+
+Patch 8.1.0447
+Problem: GUI scrollbar test fails with Athena and Motif.
+Solution: When not using on-the-fly scrolling call normal_cmd().
+Files: src/evalfunc.c, src/ex_docmd.c, src/proto/ex_docmd.pro
+
+Patch 8.1.0448
+Problem: Cursorline not removed when using 'cursorbind'. (Justin Keyes)
+Solution: Store the last cursor line per window. (closes #3488)
+Files: src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_with_cursorline_01.dump,
+ src/testdir/dumps/Test_diff_with_cursorline_02.dump,
+ src/testdir/dumps/Test_diff_with_cursorline_03.dump,
+ src/structs.h, src/move.c
+
+Patch 8.1.0449
+Problem: When 'rnu' is set folded lines are not displayed correctly.
+ (Vitaly Yashin)
+Solution: When only redrawing line numbers do draw folded lines.
+ (closes #3484)
+Files: src/screen.c, src/testdir/test_fold.vim,
+ src/testdir/dumps/Test_folds_with_rnu_01.dump,
+ src/testdir/dumps/Test_folds_with_rnu_02.dump
+
+Patch 8.1.0450 (after patch 8.1.0449)
+Problem: Build failure without the +fold feature.
+Solution: Add #ifdef.
+Files: src/screen.c
+
+Patch 8.1.0451
+Problem: Win32 console: keypad keys don't work.
+Solution: Use numbers instead of characters to avoid the value becoming
+ negative. (Mike Williams)
+Files: src/os_win32.c
+
+Patch 8.1.0452
+Problem: MS-Windows: not finding intl.dll.
+Solution: Also find intl.dll next to libintl.dll. (Ken Takata)
+Files: src/os_win32.c, runtime/doc/mlang.txt
+
+Patch 8.1.0453
+Problem: MS-Windows: executable() is not reliable.
+Solution: Use $PATHEXT properly. (Yasuhiro Matsumoto, closes #3512)
+Files: src/os_win32.c, src/testdir/test_functions.vim
+
+Patch 8.1.0454
+Problem: resolve() was not tested with a symlink cycle.
+Solution: Add a test. (Dominique Pelle, closes #3513)
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0455
+Problem: Checking for empty quickfix stack is not consistent.
+Solution: Use qf_stack_empty(). (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.1.0456
+Problem: Running test hangs when the input file is being edited.
+Solution: Use a SwapExists autocommand to ignore editing the test script.
+Files: src/testdir/Makefile, src/testdir/runtest.vim
+
+Patch 8.1.0457 (after 8.1.0451)
+Problem: Win32 console: key mappings don't work.
+Solution: Use another solution for the keypad keys that doesn't break
+ mappings. Some values will be negative. (Mike Williams)
+Files: src/os_win32.c
+
+Patch 8.1.0458
+Problem: Ml_get error and crash when using "do".
+Solution: Adjust cursor position also when diffupdate is not needed.
+ (Hirohito Higashi)
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.1.0459
+Problem: Test_executable fails when there is a dog in the system.
+Solution: Rename the dog. (Hirohito Higashi)
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0460
+Problem: assert_fails() does not take a message argument
+Solution: Add the argument.
+Files: src/evalfunc.c, src/eval.c, src/testdir/test_assert.vim
+
+Patch 8.1.0461
+Problem: Quickfix code uses too many /* */ comments.
+Solution: Change to // comments. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.1.0462
+Problem: When using ConPTY Vim can be a child process.
+Solution: To find a Vim window use both EnumWindows() and
+ EnumChildWindows(). (Nobuhiro Takasaki, closes #3521)
+Files: src/os_mswin.c
+
+Patch 8.1.0463
+Problem: "simalt ~x" in .vimrc blocks swap file prompt.
+Solution: Flush buffers before prompting. (Yasuhiro Matsumoto,
+ closes #3518, closes #2192)
+Files: src/memline.c
+
+Patch 8.1.0464
+Problem: MS-Windows: job_info() has cmd without backslashes. (Daniel
+ Hahler)
+Solution: Use rem_backslash(). (closes #3517, closes #3404) Add a test.
+ (Yasuhiro Matsumoto)
+Files: src/misc2.c, src/testdir/test_channel.vim
+
+Patch 8.1.0465 (after 8.1.0452)
+Problem: Client-server test fails.
+Solution: Change logic in EnumWindows().
+Files: src/os_mswin.c
+
+Patch 8.1.0466 (after 8.1.0463)
+Problem: Autocmd test fails.
+Solution: Do call inchar() when flushing typeahead.
+Files: src/vim.h, src/getchar.c, src/proto/getchar.pro, src/memline.c,
+ src/message.c, src/misc1.c
+
+Patch 8.1.0467 (after 8.1.0063)
+Problem: Cannot build with Mac OS X 10.5.
+Solution: Change #ifdef into #if. (Akshay Hegde, closes #3022)
+Files: src/os_macosx.m
+
+Patch 8.1.0468
+Problem: MS-Windows: Filter command with pipe character fails. (Johannes
+ Riecken)
+Solution: Find the pipe character outside of quotes. (Yasuhiro Matsumoto,
+ closes #1743, closes #3523)
+Files: src/ex_cmds.c, src/testdir/test_filter_cmd.vim
+
+Patch 8.1.0469
+Problem: Too often indexing in qf_lists[].
+Solution: Use a qf_list_T pointer. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0470
+Problem: Pointer ownership around fname_expand() is unclear.
+Solution: Allow b_ffname and b_sfname to point to the same allocated memory,
+ only free one. Update comments.
+Files: src/buffer.c, src/structs.h, src/fileio.c, src/ex_cmds.c
+
+Patch 8.1.0471
+Problem: Some tests are flaky or fail on some systems.
+Solution: Increase waiting time for port number. Use "cmd /c" to execute
+ "echo" on win32. (Ken Takata, closes #3534)
+Files: src/testdir/shared.vim, src/testdir/test_channel.vim
+
+Patch 8.1.0472
+Problem: Dosinst command has a few flaws.
+Solution: Register DisplayIcon, DisplayVersion and Publisher for the
+ uninstaller. (closes #3485) Don't set 'diffexpr' if internal diff
+ is supported. Allow for using Vi compatible from the command line.
+ Remove needless sleeps. Add comments in the generated _vimrc.
+ (Ken Takata, closes #3525)
+Files: src/dosinst.c
+
+Patch 8.1.0473
+Problem: User doesn't notice file does not exist when swap file does.
+Solution: Add a note that the file cannot be found. Make the "still
+ running" notice stand out.
+Files: src/memline.c
+
+Patch 8.1.0474
+Problem: Directory where if_perl.c is written is inconsistent.
+Solution: use auto/if_perl.c for MS-Windows. (Ken Takata, closes #3540)
+Files: src/Make_bc5.mak, src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.1.0475
+Problem: Memory not freed on exit when quit in autocmd.
+Solution: Remember funccal stack when executing autocmd.
+Files: src/structs.h, src/userfunc.c, src/proto/userfunc.pro,
+ src/fileio.c, src/eval.c, src/ex_cmds2.c, src/main.c
+
+Patch 8.1.0476
+Problem: Memory leaks in test_escaped_glob.
+Solution: Avoid failure when running the shell, use the sandbox.
+Files: src/testdir/test_escaped_glob.vim
+
+Patch 8.1.0477 (after 8.1.0475)
+Problem: Tiny build fails.
+Solution: Add a dummy declaration for funccal_entry_T.
+Files: src/structs.h
+
+Patch 8.1.0478
+Problem: Cannot build with perl using MinGW.
+Solution: Add -I. (Ken Takata, Cesar Romani)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.0479
+Problem: Failure when setting 'varsofttabstop' to end in a comma. (Ralf
+ Schandl)
+Solution: Reject value with trailing comma. Add test for invalid values
+ (closes #3544)
+Files: src/testdir/test_vartabs.vim, src/option.c
+
+Patch 8.1.0480
+Problem: MinGW build file uses different -I flags than MVC.
+Solution: Add -I to $CFLAGS. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.0481
+Problem: When "Terminal" highlight is reverted cursor doesn't show.
+Solution: Get the colors of the "Terminal" group. (closes #3546)
+Files: src/terminal.c
+
+Patch 8.1.0482
+Problem: MinGW "make clean" deletes all .exe files.
+Solution: Only delete .exe files that it builds. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.0483
+Problem: MinGW does not build tee.exe.
+Solution: Add build instructions. (Yasuhiro Matsumoto, closes #3548)
+Files: src/Make_cyg_ming.mak, src/tee/Makefile
+
+Patch 8.1.0484
+Problem: Some file types are not recognized.
+Solution: Update the file type detection.
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.0485
+Problem: term_start() does not check if directory is accessible.
+Solution: Add mch_access() call. (Jason Franklin)
+Files: src/channel.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0486 (after 8.1.0485)
+Problem: Can't build in MS-Windows.
+Solution: Put mch_access() call inside #ifdef
+Files: src/channel.c
+
+Patch 8.1.0487
+Problem: No menus specifically for the terminal window.
+Solution: Add :tlmenu. (Yee Cheng Chin, closes #3439) Add a menu test.
+Files: runtime/delmenu.vim, runtime/doc/autocmd.txt, runtime/doc/gui.txt,
+ runtime/doc/index.txt, runtime/doc/terminal.txt,
+ runtime/doc/usr_42.txt, runtime/menu.vim, src/ex_cmdidxs.h,
+ src/ex_cmds.h, src/ex_docmd.c, src/menu.c, src/proto/menu.pro,
+ src/popupmnu.c, src/structs.h, src/testdir/test_menu.vim
+
+Patch 8.1.0488
+Problem: Using freed memory in quickfix code. (Dominique Pelle)
+Solution: Add the quickfix_busy() flag to postpone deleting quickfix lists
+ until it is safe. (Yegappan Lakshmanan, closes #3538)
+Files: src/quickfix.c, src/proto/quickfix.pro, src/misc2.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.1.0489
+Problem: Crash when autocmd clears vimpgrep location list.
+Solution: Return from qf_jump_edit_buffer() early. (Yegappan Lakshmanan)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0490
+Problem: MS-Windows: doesn't handle missing libwinpthread-1.dll.
+Solution: Adjust Cygwin/MinGW build file. (Ken Takata, closes #2827)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.0491
+Problem: If a terminal dump has CR it is considered corrupt.
+Solution: Ignore CR characters. (Nobuhiro Takasaki, closes #3558)
+Files: src/terminal.c
+
+Patch 8.1.0492
+Problem: "Edit with existing Vim" list can get long.
+Solution: Move the list to a submenu. (Ken Takata, closes #3561)
+Files: src/GvimExt/gvimext.cpp
+
+Patch 8.1.0493
+Problem: argv() and argc() only work on the current argument list.
+Solution: Add a window ID argument. (Yegappan Lakshmanan, closes #832)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_arglist.vim,
+ src/eval.c, src/proto/eval.pro
+
+Patch 8.1.0494
+Problem: Functions do not check for a window ID in other tabs.
+Solution: Also find the window ID in other than the current tab.
+Files: src/evalfunc.c
+
+Patch 8.1.0495
+Problem: :filter only supports some commands.
+Solution: Add :filter support for more commands. (Marcin Szamotulski,
+ closes #2856)
+Files: runtime/doc/various.txt, src/eval.c, src/mark.c, src/option.c,
+ src/syntax.c, src/testdir/test_filter_cmd.vim, src/userfunc.c
+
+Patch 8.1.0496
+Problem: No tests for indent files.
+Solution: Add a mechanism for running indent file tests. Add a first test
+ for Vim indenting.
+Files: runtime/indent/Makefile, runtime/indent/testdir/runtest.vim,
+ runtime/indent/testdir/cleantest.vim, runtime/indent/README.txt,
+ runtime/indent/testdir/README.txt, runtime/indent/testdir/vim.in,
+ runtime/indent/testdir/vim.ok, Filelist
+
+Patch 8.1.0497
+Problem: :%diffput changes order of lines. (Markus Braun)
+Solution: Do adjust marks when using internal diff.
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.1.0498
+Problem: /etc/gitconfig not recognized at a gitconfig file.
+Solution: Add pattern to filetype detection. (closes #3568)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.0499
+Problem: :2vimgrep causes an ml_get error
+Solution: Pass tomatch pointer instead of value. (Yegappan Lakshmanan)
+Files: src/ex_getln.c, src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0500
+Problem: Cleaning up in src/tee may not always work.
+Solution: Use "rm" when appropriate. (Michael Soyka, closes #3571)
+Files: src/tee/Makefile
+
+Patch 8.1.0501
+Problem: Cppcheck warns for using array index before bounds check.
+Solution: Swap the conditions. (Dominique Pelle)
+Files: src/memline.c
+
+Patch 8.1.0502
+Problem: Internal diff fails when diffing a context diff. (Hirohito Higashi)
+Solution: Only use callback calls with one line. (closes #3581)
+Files: src/diff.c, src/testdir/dumps/test_diff_of_diff_01.dump
+
+Patch 8.1.0503
+Problem: Missing change to diff test. (Hirohito Higashi)
+Solution: Add the missing test function.
+Files: src/testdir/test_diffmode.vim
+
+Patch 8.1.0504
+Problem: When CTRL-C is mapped it triggers InsertLeave.
+Solution: Make CTRL-C behave the same way when typed or used in a mapping.
+Files: src/edit.c, src/testdir/test_edit.vim
+
+Patch 8.1.0505
+Problem: Filter command test may fail if helplang is not set.
+Solution: Set 'helplang' for the test. (James McCoy, closes #3591)
+Files: src/testdir/test_filter_cmd.vim
+
+Patch 8.1.0506
+Problem: Modeline test fails when run by root.
+Solution: Set 'modeline' for the test. (James McCoy, closes #3592)
+Files: src/testdir/test_modeline.vim
+
+Patch 8.1.0507
+Problem: .raml files not properly detected.
+Solution: Recognize .raml as raml instead of yaml. (closes #3594)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.0508
+Problem: Suspend test fails when run by root.
+Solution: Accept both '$' and '#' for the prompt. (James McCoy, closes #3590)
+Files: src/testdir/test_suspend.vim
+
+Patch 8.1.0509
+Problem: Checking cwd not accessible fails for root. (James McCoy)
+Solution: Skip this part of the test for root. (closes #3595)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0510
+Problem: Filter test fails when $LANG is C.UTF-8.
+Solution: Set 'helplang' to "en" for any C language. (Christian Brabandt,
+ closes #3577)
+Files: src/option.c
+
+Patch 8.1.0511
+Problem: ml_get error when calling a function with a range.
+Solution: Don't position the cursor after the last line.
+Files: src/userfunc.c, src/testdir/test_functions.vim
+
+Patch 8.1.0512
+Problem: 'helplang' default is inconsistent for C and C.UTF-8.
+Solution: Don't accept a value unless it starts with two letters.
+Files: src/ex_cmds2.c
+
+Patch 8.1.0513
+Problem: No error for set diffopt+=algorithm:.
+Solution: Check for missing argument. (Hirohito Higashi, closes #3598)
+Files: src/diff.c, src/testdir/gen_opt_test.vim
+
+Patch 8.1.0514
+Problem: CTRL-W ^ does not work when alternate buffer has no name.
+Solution: Use another method to split and edit the alternate buffer. (Jason
+ Franklin)
+Files: src/testdir/test_normal.vim, src/testdir/test_window_cmd.vim,
+ src/normal.c, src/window.c, runtime/doc/windows.txt
+
+Patch 8.1.0515
+Problem: Reloading a script gives errors for existing functions.
+Solution: Allow redefining a function once when reloading a script.
+Files: src/testdir/test_functions.vim, src/userfunc.c, src/structs.h,
+ src/globals.h, src/buffer.c, src/ex_cmds2.c, src/main.c,
+ src/option.c, runtime/doc/eval.txt
+
+Patch 8.1.0516
+Problem: :move command marks buffer modified when nothing changed.
+Solution: Do not set 'modified'. Add a test. (Jason Franklin)
+Files: src/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_move.vim, src/ex_cmds.c
+
+Patch 8.1.0517
+Problem: Test_window_split_edit_alternate() fails on AppVeyor.
+Solution: Disable the failing part for now.
+Files: src/testdir/test_window_cmd.vim
+
+Patch 8.1.0518
+Problem: Test_window_split_edit_bufnr() fails on AppVeyor.
+Solution: Disable the failing part for now.
+Files: src/testdir/test_window_cmd.vim
+
+Patch 8.1.0519
+Problem: Cannot save and restore the tag stack.
+Solution: Add gettagstack() and settagstack(). (Yegappan Lakshmanan,
+ closes #3604)
+Files: runtime/doc/eval.txt, runtime/doc/tagsrch.txt,
+ runtime/doc/usr_41.txt, src/alloc.h, src/dict.c, src/evalfunc.c,
+ src/list.c, src/misc2.c, src/proto/dict.pro, src/proto/list.pro,
+ src/proto/misc2.pro, src/proto/tag.pro, src/tag.c,
+ src/testdir/test_tagjump.vim
+
+Patch 8.1.0520
+Problem: Screen diff test sometimes fails.
+Solution: Add to list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0521
+Problem: Cannot build with +eval but without +quickfix.
+Solution: Remove #ifdef for e_stringreq. (John Marriott)
+Files: src/evalfunc.c
+
+Patch 8.1.0522
+Problem: :terminal does not show trailing empty lines.
+Solution: Add empty lines. (Hirohito Higashi, closes #3605)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0523
+Problem: Opening window from quickfix leaves empty buffer behind.
+Solution: Add qf_jump_newwin(). (Yegappan Lakshmanan, closes #2574)
+Files: src/proto/quickfix.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.1.0524 (after 8.1.0522)
+Problem: Terminal test fails on Windows.
+Solution: Skip Test_terminal_does_not_truncate_last_newlines() for now.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0525 (after 8.1.0524)
+Problem: Terminal test skips part on Windows.
+Solution: Fix Test_terminal_does_not_truncate_last_newlines(). (Hirohito
+ Higashi, closes #3606)
+Files: src/Make_mvc.mak, src/testdir/test_terminal.vim
+
+Patch 8.1.0526
+Problem: Running out of signal stack in RealWaitForChar. (Vladimir Marek)
+Solution: Make the fd_set variables static.
+Files: src/os_unix.c
+
+Patch 8.1.0527
+Problem: Using 'shiftwidth' from wrong buffer for folding.
+Solution: Use "buf" instead of "curbuf". (Christian Brabandt)
+Files: src/fold.c
+
+Patch 8.1.0528
+Problem: Various typos in comments.
+Solution: Fix the typos.
+Files: src/fileio.c, src/gui.c, src/macros.h, src/screen.c, src/search.c,
+ src/spell.c, src/spellfile.c, src/vim.h, src/testdir/README.txt,
+ src/INSTALL, src/gui_athena.c, src/gui_gtk.c, src/gui_gtk_x11.c,
+ src/gui_motif.c, src/gui_xmebw.c, src/if_tcl.c, src/os_amiga.c,
+ src/gui_w32.c, src/os_win32.c, src/gui_mac.c, src/os_vms_fix.com
+
+Patch 8.1.0529
+Problem: Flaky test sometimes fails in different ways.
+Solution: When the second run gives a different error, try running the test
+ again, up to five times.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0530
+Problem: Channel and terminal tests that start a server can be flaky.
+Solution: Add all channel and terminal tests that start a server to the list
+ of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0531
+Problem: Flaky tests often fail with a common error message.
+Solution: Add a pattern to match an error message indicating a flaky test.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0532
+Problem: Cannot distinguish between quickfix and location list.
+Solution: Add an explicit type variable. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+Patch 8.1.0533
+Problem: Screendump tests can be flaky.
+Solution: Add VerifyScreenDump to the pattern of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0534
+Problem: MS-Windows installer uses different $HOME than Vim.
+Solution: Use the Vim logic also in the MS-Windows installer. (Ken Takata,
+ closes #3564)
+Files: src/dosinst.c, src/misc1.c
+
+Patch 8.1.0535
+Problem: Increment/decrement might get interrupted by updating folds.
+Solution: Disable fold updating for a moment. (Christian Brabandt,
+ closes #3599)
+Files: src/ops.c
+
+Patch 8.1.0536
+Problem: File time test fails when using NFS.
+Solution: Use three file times instead of localtim(). (James McCoy,
+ closes #3618)
+Files: src/testdir/test_stat.vim
+
+Patch 8.1.0537
+Problem: ui_breakcheck() may be called recursively, which doesn't work.
+Solution: When called recursively, just return. (James McCoy, closes #3617)
+Files: src/ui.c
+
+Patch 8.1.0538
+Problem: Evaluating a modeline might invoke using a shell command. (Paul
+ Huber)
+Solution: Set the sandbox flag when setting options from a modeline.
+Files: src/buffer.c
+
+Patch 8.1.0539
+Problem: Cannot build without the sandbox.
+Solution: Set the secure option instead of using the sandbox. Also restrict
+ the characters from 'spelllang' that are used for LANG.vim.
+ (suggested by Yasuhiro Matsumoto)
+Files: runtime/doc/options.txt, src/buffer.c, src/option.c
+
+Patch 8.1.0540
+Problem: May evaluate insecure value when appending to option.
+Solution: Set the secure flag when changing an option that was previously
+ set insecurely. Also allow numbers for the characters from
+ 'spelllang' that are used for LANG.vim. (closes #3623)
+Files: src/option.c
+
+Patch 8.1.0541
+Problem: Help message in dosinst.c is outdated.
+Solution: Update the comment. (Ken Takata, closes #3626)
+Files: src/dosinst.c
+
+Patch 8.1.0542
+Problem: shiftwidth() does not take 'vartabstop' into account.
+Solution: Use the cursor position or a position explicitly passed.
+ Also make >> and << work better with 'vartabstop'. (Christian
+ Brabandt)
+Files: runtime/doc/change.txt, runtime/doc/eval.txt, src/edit.c,
+ src/evalfunc.c, src/normal.c, src/ops.c, src/option.c,
+ src/proto/edit.pro, src/proto/option.pro,
+ src/testdir/test_vartabs.vim
+
+Patch 8.1.0543
+Problem: Coverity warns for leaking memory and using wrong struct.
+Solution: Free pointer when allocation fails. Change "boff" to "loff".
+ (closes #3634)
+Files: src/ex_getln.c, src/move.c
+
+Patch 8.1.0544 (after 8.1.0540)
+Problem: Setting 'filetype' in a modeline causes an error (Hirohito
+ Higashi).
+Solution: Don't add the P_INSECURE flag when setting 'filetype' from a
+ modeline. Also for 'syntax'.
+Files: src/option.c, src/testdir/test_modeline.vim
+
+Patch 8.1.0545
+Problem: When executing indent tests user preferences interfere.
+Solution: Add "--clean".
+Files: runtime/indent/Makefile, runtime/indent/testdir/runtest.vim
+
+Patch 8.1.0546
+Problem: Modeline test with keymap fails.
+Solution: Check that the keymap feature is available.
+Files: src/testdir/test_modeline.vim
+
+Patch 8.1.0547
+Problem: Modeline test with keymap still fails.
+Solution: Check that the keymap feature is available for the failure assert.
+Files: src/testdir/test_modeline.vim
+
+Patch 8.1.0548
+Problem: Crash when job callback unloads a buffer. (James McCoy)
+Solution: Don't round up the wait time to 10 msec in ui_inchar().
+Files: src/ui.c
+
+Patch 8.1.0549
+Problem: Netbeans test depends on README.txt contents.
+Solution: Use a generated file instead.
+Files: src/testdir/test_netbeans.vim, src/testdir/test_netbeans.py
+
+Patch 8.1.0550
+Problem: Expression evaluation may repeat an error message. (Jason
+ Franklin)
+Solution: Increment did_emsg and check for the value when giving an error
+ for the echo command.
+Files: src/message.c, src/eval.c, src/testdir/test108.ok
+
+Patch 8.1.0551 (after 8.1.0550)
+Problem: Expression evaluation may repeat an error message. (Jason
+ Franklin)
+Solution: Check for the value of did_emsg when giving an error
+ for the :execute command.
+Files: src/eval.c
+
+Patch 8.1.0552
+Problem: Saved last search pattern may not be restored.
+Solution: Call restore_last_search_pattern(). Add a check for balancing
+ saving and restoring the last search pattern.
+Files: src/ex_getln.c, src/search.c
+
+Patch 8.1.0553
+Problem: It is not easy to edit a script that was sourced.
+Solution: Add a count to ":scriptnames", so that ":script 40" edits the
+ script with script ID 40.
+Files: src/ex_cmds.h, src/ex_cmds2.c, src/testdir/test_scriptnames.vim,
+ src/Make_all.mak, src/testdir/Make_all.mak, runtime/doc/repeat.txt
+
+Patch 8.1.0554
+Problem: Popup menu overlaps with preview window.
+Solution: Adjust the height computation. (Hirohito Higashi, closes #3414)
+Files: src/popupmnu.c, src/testdir/test_popup.vim,
+ src/testdir/dumps/Test_popup_and_previewwindow_01.dump
+
+Patch 8.1.0555
+Problem: Crash when last search pat is set but not last substitute pat.
+Solution: Do not mix up last search pattern and last substitute pattern.
+ (closes #3647)
+Files: src/search.c, src/testdir/test_search.vim
+
+Patch 8.1.0556
+Problem: Saving/restoring search patterns share saved last_idx.
+Solution: Use a separate saved last_idx for saving search patterns for
+ functions and incremental search.
+Files: src/search.c
+
+Patch 8.1.0557
+Problem: Termdebug: gdb may use X.Y for breakpoint number. (Ryou Ezoe)
+Solution: Handle X.Y breakpoint numbers. (Yasuhiro Matsumoto, close #3641)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0558
+Problem: Some MS-Windows instructions are outdated.
+Solution: Update the uninstall instructions and the NSIS README. (Ken
+ Takata, closes #3614) Also update remark about diff.exe.
+Files: nsis/README.txt, uninstal.txt
+
+Patch 8.1.0559
+Problem: Command line completion not sufficiently tested.
+Solution: Add more tests. (Dominique Pelle, closes #3622)
+Files: src/testdir/test_arglist.vim, src/testdir/test_filetype.vim,
+ src/testdir/test_history.vim, src/testdir/test_messages.vim,
+ src/testdir/test_syntax.vim
+
+Patch 8.1.0560
+Problem: Cannot use address type "other" with user command.
+Solution: Add "other" to the list. (Daniel Hahler, closes #3655) Also
+ reject "%" for commands with "other". Add some more tests.
+Files: src/ex_docmd.c, src/testdir/test_usercommands.vim
+
+Patch 8.1.0561
+Problem: MSVC error format has changed.
+Solution: Make the space between the line number and colon optional.
+Files: src/option.h
+
+Patch 8.1.0562
+Problem: Parsing of 'diffopt' is slightly wrong.
+Solution: Fix the parsing and add a test. (Jason Franklin, Christian
+ Brabandt)
+Files: src/diff.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_09.dump,
+ src/testdir/dumps/Test_diff_11.dump, src/testdir/screendump.vim
+
+Patch 8.1.0563
+Problem: Setting v:errors to a string give confusing error. (Christian
+ Brabandt)
+Solution: Change internal error into normal error message.
+Files: src/eval.c
+
+Patch 8.1.0564
+Problem: Setting v:errors to wrong type still possible.
+Solution: Return after giving an error message. (Christian Brabandt)
+Files: src/eval.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.1.0565
+Problem: Asan complains about reading before allocated block.
+Solution: Workaround: Avoid offset from becoming negative.
+Files: src/gui.c
+
+Patch 8.1.0566
+Problem: SGR not enabled for mintty because $TERM is "xterm".
+Solution: Detect mintty by the termresponse. (Ken Takata, closes #3667)
+Files: src/term.c
+
+Patch 8.1.0567 (after 8.1.0565)
+Problem: Error for NUL byte in ScreenLines goes unnoticed.
+Solution: Add an internal error message.
+Files: src/gui.c
+
+Patch 8.1.0568 (after 8.1.0567)
+Problem: Error message for NUL byte in ScreenLines breaks Travis CI.
+Solution: Use a normal message fornow.
+Files: src/gui.c
+
+Patch 8.1.0569
+Problem: Execute() always resets display column to zero. (Sha Liu)
+Solution: Don't reset it to zero, restore the previous value. (closes #3669)
+Files: src/evalfunc.c, src/testdir/test_execute_func.vim
+
+Patch 8.1.0570
+Problem: 'commentstring' not used when adding fold marker. (Maxim Kim)
+Solution: Only use empty 'comments' middle when leader is empty. (Christian
+ Brabandt, closes #3670)
+Files: src/misc1.c, src/testdir/test_fold.vim
+
+Patch 8.1.0571 (after 8.1.0569)
+Problem: Non-silent execute() resets display column to zero.
+Solution: Keep the display column as-is.
+Files: src/evalfunc.c, src/testdir/test_execute_func.vim
+
+Patch 8.1.0572
+Problem: Stopping a job does not work properly on OpenBSD.
+Solution: Do not use getpgid() to check the process group of the job
+ process ID, always pass the negative process ID to kill().
+ (George Koehler, closes #3656)
+Files: src/os_unix.c
+
+Patch 8.1.0573
+Problem: Cannot redefine user command without ! in same script
+Solution: Allow redefining user command without ! in same script, like with
+ functions.
+Files: src/ex_docmd.c, src/testdir/test_usercommands.vim,
+ runtime/doc/map.txt
+
+Patch 8.1.0574
+Problem: 'commentstring' not used when adding fold marker in C.
+Solution: Require white space before middle comment part. (mostly by
+ Hirohito Higashi)
+Files: src/misc1.c, src/testdir/test_fold.vim
+
+Patch 8.1.0575
+Problem: Termdebug: clearing multi-breakpoint does not work.
+Solution: Delete all X.Y breakpoints. Keep more information about placed
+ breakpoints. (Ozaki Kiichi, closes #3641)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0576
+Problem: Indent script tests pick up installed scripts.
+Solution: Use current runtime indent scripts.
+Files: runtime/indent/Makefile
+
+Patch 8.1.0577
+Problem: Tabpage right-click menu never shows "Close tab".
+Solution: Always create the "Close tab" item but ignore the event if there
+ is only one tab.
+Files: src/gui_gtk_x11.c, src/gui_mac.c, src/gui_motif.c, src/gui.c
+
+Patch 8.1.0578
+Problem: Cannot disable arabic, rightleft and farsi in configure.
+Solution: Add configure flags. (Diego Fernando Carrión, closes #1867)
+Files: src/configure.ac, src/auto/configure, src/config.h.in,
+ src/feature.h, src/Makefile
+
+Patch 8.1.0579
+Problem: Cannot attach properties to text.
+Solution: First part of adding text properties.
+Files: Filelist, runtime/doc/Makefile, runtime/doc/eval.txt,
+ runtime/doc/textprop.txt, src/Make_all.mak, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak, src/Makefile, src/buffer.c, src/edit.c,
+ src/evalfunc.c, src/feature.h, src/memline.c, src/misc1.c,
+ src/misc2.c, src/proto.h, src/proto/memline.pro,
+ src/proto/textprop.pro, src/screen.c, src/structs.h,
+ src/testdir/Make_all.mak, src/testdir/test_textprop.vim,
+ src/textprop.c, src/userfunc.c, src/version.c
+
+Patch 8.1.0580
+Problem: Invalid memory access when using text properties.
+Solution: Disable text properties for now.
+Files: src/feature.h
+
+Patch 8.1.0581
+Problem: Double free without the text properties feature.
+Solution: Reset the dirty flag.
+Files: src/memline.c
+
+Patch 8.1.0582
+Problem: Text properties are not enabled.
+Solution: Fix sizeof argument and re-enable the text properties feature.
+ Fix memory leak.
+Files: src/feature.h, src/textprop.c
+
+Patch 8.1.0583
+Problem: Using illogical name for get_dict_number()/get_dict_string().
+Solution: Rename to start with dict_.
+Files: src/dict.c, src/proto/dict.pro, src/edit.c, src/eval.c,
+ src/evalfunc.c, src/quickfix.c, src/tag.c, src/terminal.c,
+ src/textprop.c
+
+Patch 8.1.0584
+Problem: With search CTRL-L does not pick up composing characters.
+Solution: Check for composing characters. (Christian Brabandt, closes #3682)
+ [code change was accidentally included in 8.1.0579]
+Files: src/testdir/test_search.vim
+
+Patch 8.1.0585
+Problem: Undo test may fail on MS-Windows.
+Solution: Also handle lower case drive letters.
+Files: src/testdir/test_undo.vim
+
+Patch 8.1.0586
+Problem: :digraph output is not easy to read.
+Solution: Add highlighting for :digraphs. (Marcin Szamotulski, closes #3572)
+ Also add section headers for :digraphs!.
+Files: src/ex_docmd.c, src/digraph.c, src/proto/digraph.pro,
+ src/ex_cmds.h, runtime/doc/digraph.txt
+
+Patch 8.1.0587
+Problem: GvimExt: realloc() failing is not handled properly.
+Solution: Check for NULL return. (Jan-Jaap Korpershoek, closes #3689)
+Files: src/GvimExt/gvimext.cpp
+
+Patch 8.1.0588
+Problem: Cannot define a sign with space in the text.
+Solution: Allow for escaping characters. (Ben Jackson, closes #2967)
+Files: src/ex_cmds.c, src/testdir/test_signs.vim
+
+Patch 8.1.0589
+Problem: Compilation error in gvimext.cpp.
+Solution: Return a value. Also fix using uninitialized variable.
+Files: src/GvimExt/gvimext.cpp, src/dosinst.c
+
+Patch 8.1.0590
+Problem: When a job ends the closed channels are not handled.
+Solution: When a job is detected to have ended, check the channels again.
+ (closes #3530)
+Files: src/channel.c, src/proto/channel.pro, src/misc2.c
+
+Patch 8.1.0591
+Problem: Channel sort test is flaky.
+Solution: Do not check if the job is running, it may have be done very fast.
+Files: src/testdir/test_channel.vim
+
+Patch 8.1.0592
+Problem: The libvterm tests are not run as part of Vim tests.
+Solution: Add testing libvterm.
+Files: src/Makefile, src/libvterm/Makefile
+
+Patch 8.1.0593
+Problem: Illegal memory access in libvterm test.
+Solution: Fix off-by-one error.
+Files: src/libvterm/src/vterm.c, src/libvterm/Makefile,
+ src/libvterm/t/run-test.pl
+
+Patch 8.1.0594
+Problem: Libvterm tests fail to run on Mac.
+Solution: Only run libvterm tests on Linux.
+Files: src/Makefile
+
+Patch 8.1.0595
+Problem: Libvterm tests are not run with coverage.
+Solution: Adjust the Travis config. Show the actually run commands.
+Files: .travis.yml, src/libvterm/Makefile
+
+Patch 8.1.0596
+Problem: Not all parts of printf() are tested.
+Solution: Add a few more test cases. (Dominique Pelle, closes #3691)
+Files: src/testdir/test_expr.vim
+
+Patch 8.1.0597
+Problem: Cannot run test_libvterm from the top directory.
+Solution: Add test target in toplevel Makefile.
+Files: Makefile
+
+Patch 8.1.0598
+Problem: Indent tests may use the wrong Vim binary.
+Solution: Pass in the just built Vim binary.
+Files: Makefile
+
+Patch 8.1.0599
+Problem: Without the +eval feature the indent tests don't work.
+Solution: Skip the body of the tests.
+Files: runtime/indent/testdir/cleantest.vim,
+ runtime/indent/testdir/runtest.vim
+
+Patch 8.1.0600
+Problem: Channel test is flaky.
+Solution: Add test to list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0601
+Problem: A few compiler warnings.
+Solution: Add type casts. (Mike Williams)
+Files: src/GvimExt/gvimext.cpp, src/memline.c, src/textprop.c
+
+Patch 8.1.0602
+Problem: DirChanged is also triggered when the directory didn't change.
+ (Daniel Hahler)
+Solution: Compare the current with the new directory. (closes #3697)
+Files: src/ex_docmd.c, src/testdir/test_autocmd.vim, src/misc2.c,
+ src/testdir/test_autochdir.vim
+
+Patch 8.1.0603
+Problem: The :stop command is not tested.
+Solution: Test :stop using a terminal window.
+Files: src/testdir/test_terminal.vim, src/testdir/shared.vim
+
+Patch 8.1.0604
+Problem: Autocommand test fails on MS-Windows.
+Solution: Use pathcmp() instead of strcmp() to check if a directory differs.
+Files: src/ex_docmd.c, src/misc2.c
+
+Patch 8.1.0605
+Problem: Running make in the top directory echoes a comment.
+Solution: Prefix with @. (closes #3698)
+Files: Makefile
+
+Patch 8.1.0606
+Problem: 'cryptmethod' defaults to a very old method.
+Solution: Default to "blowfish2", it is now widely available.
+Files: src/option.c, runtime/doc/options.txt
+
+Patch 8.1.0607
+Problem: Proto files are not in sync with the source code.
+Solution: Update the proto files.
+Files: src/os_mswin.c, src/proto/buffer.pro, src/proto/ex_cmds.pro,
+ src/proto/ex_getln.pro, src/proto/misc2.pro,
+ src/proto/userfunc.pro
+
+Patch 8.1.0608
+Problem: Coveralls is not updating.
+Solution: Adjust path in Travis config.
+Files: .travis.yml
+
+Patch 8.1.0609
+Problem: MS-Windows: unused variable, depending on the Ruby version.
+Solution: Put ruby_sysinit and NtInitialize inside #ifdef and make them
+ consistent. (Ken Takata)
+Files: src/if_ruby.c
+
+Patch 8.1.0610
+Problem: MS-Windows ctags file list differs from Unix.
+Solution: Define TAGS_FILES in the common makefile. (partly by Ken Takata)
+Files: src/Make_all.mak, src/Makefile, src/Make_mvc.mak,
+ src/Make_cyg_ming.mak
+
+Patch 8.1.0611
+Problem: Crash when using terminal with long composing characters.
+Solution: Make space for all characters. (Yasuhiro Matsumoto, closes #3619,
+ closes #3703)
+Files: src/terminal.c
+
+Patch 8.1.0612
+Problem: Cannot use two global runtime dirs with configure.
+Solution: Support a comma in --with-global-runtime. (James McCoy,
+ closes #3704)
+Files: src/config.h.in, src/configure.ac, src/feature.h, src/os_unix.h,
+ src/auto/configure, src/Makefile
+
+Patch 8.1.0613
+Problem: When executing an insecure function the secure flag is stuck.
+ (Gabriel Barta)
+Solution: Restore "secure" instead of decrementing it. (closes #3705)
+Files: src/testdir/test_autocmd.vim, src/option.c, src/buffer.c
+
+Patch 8.1.0614
+Problem: Placing signs can be complicated.
+Solution: Add functions for defining and placing signs. Introduce a group
+ name to avoid different plugins using the same signs. (Yegappan
+ Lakshmanan, closes #3652)
+Files: runtime/doc/eval.txt, runtime/doc/sign.txt,
+ runtime/doc/usr_41.txt, src/alloc.h, src/buffer.c, src/evalfunc.c,
+ src/ex_cmds.c, src/globals.h, src/list.c, src/misc2.c,
+ src/netbeans.c, src/proto/buffer.pro, src/proto/ex_cmds.pro,
+ src/proto/list.pro, src/proto/misc2.pro, src/structs.h,
+ src/testdir/test_signs.vim, src/workshop.c
+
+Patch 8.1.0615
+Problem: Get_tv function names are not consistent.
+Solution: Rename to tv_get.
+Files: src/eval.c, src/proto/eval.pro, src/channel.c, src/dict.c,
+ src/evalfunc.c, src/list.c, src/message.c, src/tag.c,
+ src/terminal.c, src/textprop.c, src/window.c, src/ex_cmds.c,
+ src/os_unix.c, src/os_win32.c, src/json.c, src/regexp.c,
+ src/edit.c, src/misc2.c, src/popupmnu.c
+
+Patch 8.1.0616
+Problem: NSIS installer is outdated.
+Solution: Use modern syntax, MUI2 and make it work better. Add translations.
+ (Guopeng Wen, Ken Takata, closes #3501)
+Files: Filelist, nsis/gvim.nsi, nsis/icons/header.svg,
+ nsis/icons/welcome.svg, nsis/icons/header.bmp,
+ nsis/icons/un_header.bmp, nsis/icons/uninstall.bmp,
+ nsis/icons/welcome.bmp, nsis/lang/danish.nsi, nsis/lang/dutch.nsi,
+ nsis/lang/english.nsi, nsis/lang/german.nsi,
+ nsis/lang/italian.nsi, nsis/lang/japanese.nsi,
+ nsis/lang/simpchinese.nsi, nsis/lang/tradchinese.nsi,
+ src/dosinst.c
+
+Patch 8.1.0617 (after 8.1.0616)
+Problem: NSIS installer gets two files from the wrong directory.
+Solution: Change ${VIMRT} to "..\".
+Files: nsis/gvim.nsi
+
+Patch 8.1.0618
+Problem: term_getjob() does not return v:null as documented.
+Solution: Do return v:null. (Damien) Add a test.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0619
+Problem: :echomsg and :echoerr do not handle List and Dict like :echo does.
+ (Daniel Hahler)
+Solution: Be more tolerant about the expression result type.
+Files: src/eval.c, src/proto/eval.pro, src/evalfunc.c,
+ src/proto/evalfunc.pro, runtime/doc/eval.txt,
+ src/testdir/test_messages.vim, src/message.c
+
+Patch 8.1.0620
+Problem: Overruling CONF_ARGS from the environment no longer works. (Tony
+ Mechelynck)
+Solution: Do not define any CONF_ARGS by default.
+Files: src/Makefile
+
+Patch 8.1.0621
+Problem: Terminal debugger does not handle unexpected debugger exit.
+Solution: Check for debugger job ended and close unused buffers. (Damien)
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.0622
+Problem: Adding quickfix items marks items as valid errors. (Daniel Hahler)
+Solution: Check when items are valid. (Yegappan Lakshmanan, closes #3683,
+ closes #3633)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0623
+Problem: Iterating through window frames is repeated.
+Solution: Define FOR_ALL_FRAMES. (Yegappan Lakshmanan)
+Files: src/ex_docmd.c, src/globals.h, src/screen.c, src/window.c
+
+Patch 8.1.0624 (after 8.1.0620)
+Problem: Overruling CONF_ARGS from the environment still does not work.
+ (Tony Mechelynck)
+Solution: Add back CONF_ARGS next to the new numbered ones.
+Files: src/Makefile
+
+Patch 8.1.0625
+Problem: MS-Windows: terminal test fails in white console.
+Solution: Accept both white and black background colors.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0626
+Problem: MS-Windows: no resize to fit parent when using --windowid.
+Solution: Pass FALSE for "mustset" in gui_set_shellsize(). (Agorgianitis
+ Loukas, closes #3616)
+Files: src/gui.c
+
+Patch 8.1.0627
+Problem: Python cannot handle function name of script-local function.
+Solution: Use <SNR> instead of the special byte code. (Ozaki Kiichi, closes
+ #3681)
+Files: src/if_py_both.h, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim
+
+Patch 8.1.0628
+Problem: Compiler warning on MS-Windows.
+Solution: Add type cast. (Mike Williams)
+Files: src/if_py_both.h
+
+Patch 8.1.0629
+Problem: "gn" selects the wrong text with a multi-line match.
+Solution: Get the end position from searchit() directly. (closes #3695)
+Files: src/testdir/test_gn.vim, src/search.c, src/proto/search.pro,
+ src/edit.c, src/evalfunc.c, src/ex_docmd.c, src/ex_getln.c,
+ src/normal.c
+
+Patch 8.1.0630
+Problem: "wincmd p" does not work after using an autocmd window.
+Solution: Store "prevwin" in aco_save_T. (Christian Brabandt, closes #3690)
+Files: src/fileio.c, src/structs.h, src/testdir/test_window_cmd.vim
+
+Patch 8.1.0631
+Problem: Test for :stop fails on Arch.
+Solution: Check five lines for the expected output. (closes #3714)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0632
+Problem: Using sign group names is inefficient.
+Solution: Store group names in a hash table and use a reference to them.
+ Also remove unnecessary use of ":exe" from the tests. (Yegappan
+ Lakshmanan, closes #3715)
+Files: src/buffer.c, src/ex_cmds.c, src/structs.h,
+ src/testdir/test_signs.vim
+
+Patch 8.1.0633
+Problem: Crash when out of memory while opening a terminal window.
+Solution: Handle out-of-memory more gracefully.
+Files: src/terminal.c, src/libvterm/src/vterm.c,
+ src/libvterm/src/state.c, src/libvterm/src/termscreen.c
+
+Patch 8.1.0634
+Problem: Text properties cannot cross line boundaries.
+Solution: Support multi-line text properties.
+Files: src/textprop.c, src/testdir/test_textprop.vim,
+ runtime/doc/eval.txt
+
+Patch 8.1.0635
+Problem: Coverity complains about null pointer use.
+Solution: Avoid using a null pointer.
+Files: src/evalfunc.c
+
+Patch 8.1.0636
+Problem: line2byte() gives wrong values with text properties. (Bjorn Linse)
+Solution: Compute byte offsets differently when text properties were added.
+ (closes #3718)
+Files: src/structs.h, src/textprop.c, src/proto/textprop.pro,
+ src/memline.c, src/testdir/test_textprop.vim
+
+Patch 8.1.0637
+Problem: Nsis file no longer used.
+Solution: Remove the file. (Ken Takata)
+Files: nsis/vimrc.ini, Filelist
+
+Patch 8.1.0638
+Problem: Text property highlighting is off by one column. (Bjorn Linse)
+Solution: Update text property highlighting earlier. Let it overrule syntax
+ highlighting.
+Files: src/structs.h, src/screen.c
+
+Patch 8.1.0639
+Problem: text properties test fails on MS-Windows
+Solution: Set fileformat to "unix".
+Files: src/testdir/test_textprop.vim
+
+Patch 8.1.0640
+Problem: Get E14 while typing command :tab with 'incsearch' set.
+Solution: Do not give an error when looking for the command. (Hirohito
+ Higashi)
+Files: src/testdir/test_search.vim, src/ex_docmd.c
+
+Patch 8.1.0641
+Problem: No check for out-of-memory when converting regexp.
+Solution: Bail out when lalloc() returns NULL. (John Marriott)
+Files: src/regexp_nfa.c
+
+Patch 8.1.0642
+Problem: swapinfo() leaks memory. (Christian Brabandt)
+Solution: Avoid allocating the strings twice.
+Files: src/memline.c, src/dict.c, src/proto/dict.pro
+
+Patch 8.1.0643
+Problem: Computing byte offset wrong. (Bjorn Linse)
+Solution: Use the right variable for array index.
+Files: src/memline.c, src/testdir/test_textprop.vim
+
+Patch 8.1.0644
+Problem: Finding next sign ID is inefficient.
+Solution: Add next_sign_id. (Yegappan Lakshmanan, closes #3717)
+Files: runtime/doc/eval.txt, src/buffer.c, src/evalfunc.c, src/ex_cmds.c,
+ src/globals.h, src/main.c, src/proto/buffer.pro, src/structs.h,
+ src/testdir/test_signs.vim
+
+Patch 8.1.0645
+Problem: Coverity warns for possible use of NULL pointer.
+Solution: Check return value of vterm_obtain_screen().
+Files: src/terminal.c
+
+Patch 8.1.0646
+Problem: Cannot build with Ruby 2.6.0.
+Solution: Add rb_ary_detransient(). (Ozaki Kiichi, closes #3724)
+Files: src/if_ruby.c
+
+Patch 8.1.0647
+Problem: MS-Windows: balloon_show() does not handle wide characters.
+Solution: Use CreateWindowExW(). (Yasuhiro Matsumoto, closes #3708)
+Files: src/gui_w32.c
+
+Patch 8.1.0648
+Problem: Custom operators can't act upon a forced motion. (Christian
+ Wellenbrock)
+Solution: Add the forced motion to the mode() result. (Christian Brabandt,
+ closes #3490)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/globals.h, src/normal.c,
+ src/testdir/test_mapping.vim
+
+Patch 8.1.0649
+Problem: setjmp() variables defined globally are used in one file.
+Solution: Move the declarations to that file.
+Files: src/globals.h, src/os_unix.c
+
+Patch 8.1.0650
+Problem: Command line argument -q [errorfile] is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3730)
+Files: src/testdir/test_startup.vim
+
+Patch 8.1.0651
+Problem: :args \"foo works like :args without argument.
+Solution: Fix check for empty argument. (closes #3728)
+Files: src/ex_cmds2.c, src/testdir/test_arglist.vim
+
+Patch 8.1.0652
+Problem: Freeing memory for balloon eval too early.
+Solution: Store the pointer in BalloonEval and free it later. (Yasuhiro
+ Matsumoto, closes #3725)
+Files: src/beval.h, src/gui_w32.c
+
+Patch 8.1.0653 (after 8.1.0651)
+Problem: Arglist test fails on MS-windows.
+Solution: Only use a file name with a double quote on Unix.
+Files: src/testdir/test_arglist.vim
+
+Patch 8.1.0654
+Problem: When deleting a line text property flags are not adjusted.
+Solution: Adjust text property flags in preceding and following lines.
+Files: src/memline.c, src/misc2.c, src/proto/misc2.pro,
+ src/testdir/test_textprop.vim
+
+Patch 8.1.0655
+Problem: When appending a line text property flags are not added.
+Solution: Add text properties to a newly added line.
+Files: src/memline.c, src/testdir/test_textprop.vim, src/textprop.c
+
+Patch 8.1.0656
+Problem: Trying to reconnect to X server may cause problems.
+Solution: Do no try reconnecting when exiting. (James McCoy)
+Files: src/os_unix.c
+
+Patch 8.1.0657 (after 8.1.0656)
+Problem: Get error for using regexp recursively. (Dominique Pelle)
+Solution: Do no check if connection is desired.
+Files: src/os_unix.c
+
+Patch 8.1.0658
+Problem: Deleting signs and completion for :sign is insufficient.
+Solution: Add deleting signs in a specified or any group from the current
+ cursor location. Add group and priority to sign command
+ completion. Add tests for different sign unplace commands. Update
+ help text. Add tests for sign jump with group. Update help for
+ sign jump. (Yegappan Lakshmanan, closes #3731)
+Files: runtime/doc/sign.txt, src/buffer.c, src/evalfunc.c, src/ex_cmds.c,
+ src/netbeans.c, src/proto/buffer.pro, src/proto/ex_cmds.pro,
+ src/testdir/test_signs.vim
+
+Patch 8.1.0659 (after 8.1.0658)
+Problem: Build failure without the sign feature.
+Solution: Put the sign struct declarations outside of the #ifdef.
+Files: src/structs.h
+
+Patch 8.1.0660
+Problem: sign_unplace() may leak memory.
+Solution: Free the group name before returning. Add a few more tests.
+ (Yegappan Lakshmanan)
+Files: src/evalfunc.c, src/testdir/test_signs.vim
+
+Patch 8.1.0661
+Problem: Clipboard regexp might be used recursively.
+Solution: Check for recursive use and bail out.
+Files: src/regexp.c, src/proto/regexp.pro, src/os_unix.c
+
+Patch 8.1.0662
+Problem: Needlessly searching for tilde in string.
+Solution: Only check the first character. (James McCoy, closes #3734)
+Files: src/misc1.c
+
+Patch 8.1.0663
+Problem: Text property display wrong when 'number' is set. (Dominique
+ Pelle)
+Solution: Compare with "vcol" instead of "col".
+Files: src/screen.c
+
+Patch 8.1.0664
+Problem: Configure "fail-if-missing" does not apply to the enable-gui
+ argument. (Rhialto)
+Solution: Make configure fail if a GUI was specified and "fail-if-missing"
+ is enabled and the GUI test fails.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.1.0665
+Problem: Text property display wrong when 'spell' is set. (Dominique Pelle)
+Solution: Remove unnecessary assignment to char_attr. Combine attributes if
+ needed. Add a screenshot test.
+Files: src/screen.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.0666 (after 8.1.0665)
+Problem: Text property test fails.
+Solution: Update screenshot.
+Files: src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.0667 (after 8.1.0665)
+Problem: Textprop test leaves file behind.
+Solution: Delete the file. (Dominique Pelle, closes #3743)
+Files: src/testdir/test_textprop.vim
+
+Patch 8.1.0668
+Problem: No test for overstrike mode in the command line.
+Solution: Add a test. (Dominique Pelle, closes #3742)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.1.0669
+Problem: The ex_sign() function is too long.
+Solution: Refactor the function. Add a bit more testing. (Yegappan
+ Lakshmanan, closes #3745)
+Files: src/testdir/test_signs.vim, src/ex_cmds.c
+
+Patch 8.1.0670
+Problem: Macro for popup menu width is unused.
+Solution: Remove it. (Hirohito Higashi)
+Files: src/popupmnu.c
+
+Patch 8.1.0671
+Problem: Cursor in the wrong column after auto-formatting.
+Solution: Check for deleting more spaces than adding. (closes #3748)
+Files: src/ops.c, src/testdir/test_textformat.vim, src/mark.c,
+ src/proto/mark.pro, src/misc1.c
+
+Patch 8.1.0672
+Problem: The Lua interface doesn't know about v:null.
+Solution: Add Lua support for v:null. (Uji, closes #3744)
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.1.0673
+Problem: Functionality for signs is spread out over several files.
+Solution: Move most of the sign functionality into sign.c. (Yegappan
+ Lakshmanan, closes #3751)
+Files: Filelist, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_dice.mak, src/Make_ivc.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak,
+ src/Make_vms.mms, src/Makefile, src/README.txt, src/buffer.c,
+ src/evalfunc.c, src/ex_cmds.c, src/proto.h, src/proto/buffer.pro,
+ src/proto/ex_cmds.pro, src/proto/sign.pro, src/sign.c
+
+Patch 8.1.0674
+Problem: Leaking memory when updating a single line.
+Solution: Do not call start_search_hl() twice.
+Files: src/screen.c
+
+Patch 8.1.0675
+Problem: Text property column is screen columns is not practical.
+Solution: Use byte values for the column.
+Files: src/structs.h, src/textprop.c, src/proto/textprop.pro,
+ runtime/doc/eval.txt, runtime/doc/textprop.txt,
+ src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.0676
+Problem: Textprop screendump test fails.
+Solution: Add missing changes.
+Files: src/screen.c
+
+Patch 8.1.0677
+Problem: Look-behind match may use the wrong line number. (Dominique Pelle)
+Solution: Use the line number in regsave instead of the one in behind_pos,
+ we may be looking at the previous line. (closes #3749)
+Files: src/regexp.c
+
+Patch 8.1.0678
+Problem: Text properties as not adjusted for inserted text.
+Solution: Adjust text properties when inserting text.
+Files: src/misc1.c, src/proto/misc1.pro, src/textprop.c,
+ src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.0679
+Problem: Sign functions do not take buffer argument as documented.
+Solution: Use get_buf_tv(). (Yegappan Lakshmanan, closes #3755)
+Files: src/evalfunc.c, src/testdir/test_signs.vim
+
+Patch 8.1.0680
+Problem: Not easy to see what features are unavailable.
+Solution: Highlight disabled features in the :version output. (Nazri Ramliy,
+ closes #3756)
+Files: src/version.c
+
+Patch 8.1.0681
+Problem: Text properties as not adjusted for deleted text.
+Solution: Adjust text properties when backspacing to delete text.
+Files: src/edit.c, src/misc1.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.0682
+Problem: Text properties are not adjusted when backspacing replaced text.
+Solution: Keep text properties on text restored in replace mode.
+Files: src/edit.c, src/textprop.c, src/globals.h,
+ src/testdir/test_textprop.vim
+
+Patch 8.1.0683
+Problem: Spell highlighting does not always end. (Gary Johnson)
+Solution: Also reset char_attr when spell errors are highlighted.
+Files: src/screen.c
+
+Patch 8.1.0684
+Problem: Warnings from 64-bit compiler.
+Solution: Add type casts. (Mike Williams)
+Files: src/memline.c, src/textprop.c
+
+Patch 8.1.0685
+Problem: get_buf_tv() is named inconsistently.
+Solution: Rename it to tv_get_buf(). (Yegappan Lakshmanan, closes #3759)
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/terminal.c,
+ src/textprop.c
+
+Patch 8.1.0686
+Problem: When 'y' is in 'cpoptions' yanking for the clipboard changes redo.
+Solution: Do not use the 'y' flag when "gui_yank" is TRUE. (Andy Massimino,
+ closes #3760)
+Files: src/normal.c
+
+Patch 8.1.0687
+Problem: Sentence text object in Visual mode is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3758)
+Files: src/testdir/test_visual.vim
+
+Patch 8.1.0688
+Problem: Text properties are not restored by undo.
+Solution: Also save text properties for undo.
+Files: src/structs.h, src/undo.c, src/memline.c, src/proto/memline.pro
+
+Patch 8.1.0689 (after 8.1.0688)
+Problem: Undo with text properties not tested.
+Solution: Add a test function.
+Files: src/testdir/test_textprop.vim
+
+Patch 8.1.0690
+Problem: setline() and setbufline() do not clear text properties.
+Solution: Clear text properties when setting the text.
+Files: src/evalfunc.c, src/testdir/test_textprop.vim
+
+Patch 8.1.0691
+Problem: Text properties are not adjusted for :substitute.
+Solution: Adjust text properties as well as possible.
+Files: src/ex_cmds.c, src/textprop.c, src/proto/textprop.pro,
+ src/testdir/test_textprop.vim
+
+Patch 8.1.0692
+Problem: If a buffer was deleted a channel can't write to it.
+Solution: When the buffer exists but was unloaded, prepare it for writing.
+ (closes #3764)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 8.1.0693 (after 8.1.0692)
+Problem: Channel test fails sometimes.
+Solution: Avoid race condition.
+Files: src/testdir/test_channel.vim
+
+Patch 8.1.0694
+Problem: When using text props may free memory that is not allocated.
+ (Andy Massimino)
+Solution: Allocate the line when adjusting text props. (closes #3766)
+Files: src/textprop.c
+
+Patch 8.1.0695
+Problem: Internal error when using :popup.
+Solution: When a menu only exists in Terminal mode give an error. (Naruhiko
+ Nishino, closes #3765)
+Files: runtime/doc/gui.txt, src/globals.h, src/menu.c, src/popupmnu.c,
+ src/testdir/test_popup.vim
+
+Patch 8.1.0696
+Problem: When test_edit fails 'insertmode' may not be reset and the next
+ test may get stuck. (James McCoy)
+Solution: Always reset 'insertmode' after executing a test. Avoid that an
+ InsertCharPre autocommand or a 'complete' function can change the
+ state. (closes #3768)
+Files: src/testdir/runtest.vim, src/edit.c
+
+Patch 8.1.0697
+Problem: ":sign place" requires the buffer argument.
+Solution: Make the argument optional. Also update the help and clean up the
+ sign test. (Yegappan Lakshmanan, closes #3767)
+Files: runtime/doc/eval.txt, runtime/doc/sign.txt, src/sign.c,
+ src/testdir/test_signs.vim
+
+Patch 8.1.0698
+Problem: Clearing the window is used too often, causing the command line
+ to be cleared when opening a tab. (Miroslav Koškár)
+Solution: Use NOT_VALID instead of CLEAR. (suggested by Jason Franklin,
+ closes #630) Also do this for a few other places where clearing
+ the screen isn't really needed.
+Files: src/window.c
+
+Patch 8.1.0699
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Add a dummy init.
+Files: src/edit.c
+
+Patch 8.1.0700 (after 8.1.0698)
+Problem: Using "gt" sometimes does not redraw a tab. (Jason Franklin)
+Solution: Always set must_redraw in redraw_all_later().
+Files: src/screen.c
+
+Patch 8.1.0701
+Problem: Sign message not translated and inconsistent spacing.
+Solution: Add _() for translation. Add a space. (Ken Takata) Also use
+ MSG_BUF_LEN instead of BUFSIZ.
+Files: src/sign.c, src/testdir/test_signs.vim
+
+Patch 8.1.0702
+Problem: ":sign place" only uses the current buffer.
+Solution: List signs for all buffers when there is no buffer argument.
+ Fix error message for invalid buffer name in sign_place().
+ (Yegappan Lakshmanan, closes #3774)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/sign.c,
+ src/testdir/test_signs.vim
+
+Patch 8.1.0703
+Problem: Compiler warnings with 64-bit compiler.
+Solution: Change types, add type casts. (Mike Williams)
+Files: src/textprop.c, src/undo.c
+
+Patch 8.1.0704
+Problem: Building with Ruby 2.6 gives compiler warnings.
+Solution: Define a stub for rb_ary_detransient. (Ozaki Kiichi, closes #3779)
+Files: src/if_ruby.c
+
+Patch 8.1.0705
+Problem: :colorscheme isn't tested enough
+Solution: Improve test coverage of :colorscheme. (Dominique Pelle, closes
+ #3777) Remove unnecessary sleep.
+Files: src/testdir/test_gui.vim
+
+Patch 8.1.0706
+Problem: Tabline is not always redrawn when something that is used in
+ 'tabline' changes.
+Solution: Add ":redrawtabline" so that a plugin can at least cause the
+ redraw when needed.
+Files: runtime/doc/various.txt, runtime/doc/options.txt, src/ex_docmd.c,
+ src/ex_cmds.h, src/screen.c, src/proto/screen.pro,
+ src/ex_cmdidxs.h, src/testdir/test_tabline.vim
+
+Patch 8.1.0707
+Problem: Text property columns are not adjusted for changed indent.
+Solution: Adjust text properties.
+Files: src/misc1.c, src/testdir/test_textprop.vim
+
+Patch 8.1.0708
+Problem: Third argument for redrawWinline() is always FALSE.
+Solution: Drop the argument. (neovim #9479)
+Files: src/edit.c, src/move.c, src/screen.c, src/proto/screen.pro
+
+Patch 8.1.0709
+Problem: Windows are updated for every added/deleted sign.
+Solution: Do not call update_debug_sign(). Only redraw when the line with
+ the sign is visible. (idea from neovim #9479)
+Files: src/sign.c, src/screen.c, src/proto/screen.pro
+
+Patch 8.1.0710
+Problem: When using timers may wait for job exit quite long.
+Solution: Return from ui_wait_for_chars_or_timer() when a job or channel
+ needs to be handled. (Ozaki Kiichi, closes #3783)
+Files: src/ui.c, src/testdir/test_channel.vim
+
+Patch 8.1.0711
+Problem: Test files still use function!.
+Solution: Remove the exclamation mark. Fix overwriting a function.
+Files: src/testdir/test49.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_charsearch.vim,
+ src/testdir/test_charsearch_utf8.vim,
+ src/testdir/test_display.vim, src/testdir/test_edit.vim,
+ src/testdir/test_eval_func.vim, src/testdir/test_fnameescape.vim,
+ src/testdir/test_getcwd.vim, src/testdir/test_highlight.vim,
+ src/testdir/test_hlsearch.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_lambda.vim, src/testdir/test_listdict.vim,
+ src/testdir/test_listlbr.vim, src/testdir/test_listlbr_utf8.vim,
+ src/testdir/test_marks.vim, src/testdir/test_matchadd_conceal.vim,
+ src/testdir/test_matchadd_conceal_utf8.vim,
+ src/testdir/test_messages.vim, src/testdir/test_number.vim,
+ src/testdir/test_options.vim, src/testdir/test_partial.vim,
+ src/testdir/test_smartindent.vim, src/testdir/test_substitute.vim,
+ src/testdir/test_system.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_textobjects.vim, src/testdir/test_utf8.vim,
+ src/testdir/test_utf8_comparisons.vim,
+ src/testdir/test_vartabs.vim, src/testdir/test_vimscript.vim,
+ src/testdir/test_window_cmd.vim, src/testdir/test_xxd.vim
+
+Patch 8.1.0712
+Problem: MS-Windows build instructions are a bit outdated.
+Solution: Update the instructions. (Ken Takata)
+Files: src/INSTALLpc.txt
+
+Patch 8.1.0713
+Problem: Images for NSIS take up too much space.
+Solution: Put the images in a zip file.
+Files: nsis/icons.zip, nsis/icons/disabled.bmp, nsis/icons/enabled.bmp,
+ nsis/icons/header.bmp, nsis/icons/header.svg,
+ nsis/icons/un_header.bmp, nsis/icons/uninstall.bmp,
+ nsis/icons/vim_16c.ico, nsis/icons/vim_uninst_16c.ico,
+ nsis/icons/welcome.bmp, nsis/icons/welcome.svg,
+ nsis/README.txt, Filelist, Makefile
+
+Patch 8.1.0714
+Problem: Unnecessary #if lines in GTK code.
+Solution: Remove the #if. (Ken Takata, closes #3785)
+Files: src/gui_beval.c, src/if_mzsch.c
+
+Patch 8.1.0715
+Problem: Superfluous call to redraw_win_later().
+Solution: Remove the call.
+Files: src/move.c
+
+Patch 8.1.0716
+Problem: Get warning message when 'completefunc' returns nothing.
+Solution: Allow for returning v:none to suppress the warning message.
+ (Yasuhiro Matsumoto, closes #3789)
+Files: runtime/doc/insert.txt, src/edit.c,
+ src/testdir/test_ins_complete.vim
+
+Patch 8.1.0717
+Problem: There is no function for the ":sign jump" command.
+Solution: Add the sign_jump() function. (Yegappan Lakshmanan, closes #3780)
+Files: runtime/doc/eval.txt, runtime/doc/sign.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/proto/sign.pro,
+ src/sign.c, src/testdir/test_signs.vim
+
+Patch 8.1.0718
+Problem: A couple compiler warnings.
+Solution: Rename shadowed variables. Add UNUSED.
+Files: src/misc1.c
+
+Patch 8.1.0719
+Problem: Too many #ifdefs.
+Solution: Always build with the +visualextra feature.
+Files: src/evalfunc.c, src/version.c, src/normal.c, src/ops.c,
+ src/feature.h, runtime/doc/various.txt
+
+Patch 8.1.0720
+Problem: Cannot easily change the current quickfix list index.
+Solution: Add the "idx" argument to setqflist(). (Yegappan Lakshmanan,
+ closes #3701)
+Files: runtime/doc/eval.txt, runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.1.0721
+Problem: Conceal mode is not sufficiently tested.
+Solution: Add screendump tests. Check all 'concealcursor' values.
+Files: src/testdir/test_conceal.vim, src/Make_all.mak,
+ src/testdir/Make_all.mak
+ src/testdir/dumps/Test_conceal_two_windows_01.dump,
+ src/testdir/dumps/Test_conceal_two_windows_02.dump,
+ src/testdir/dumps/Test_conceal_two_windows_03.dump,
+ src/testdir/dumps/Test_conceal_two_windows_04.dump,
+ src/testdir/dumps/Test_conceal_two_windows_05.dump,
+ src/testdir/dumps/Test_conceal_two_windows_06i.dump,
+ src/testdir/dumps/Test_conceal_two_windows_06v.dump,
+ src/testdir/dumps/Test_conceal_two_windows_06c.dump,
+ src/testdir/dumps/Test_conceal_two_windows_06n.dump,
+ src/testdir/dumps/Test_conceal_two_windows_07i.dump,
+ src/testdir/dumps/Test_conceal_two_windows_07v.dump,
+ src/testdir/dumps/Test_conceal_two_windows_07c.dump,
+ src/testdir/dumps/Test_conceal_two_windows_07n.dump,
+ src/testdir/dumps/Test_conceal_two_windows_08i.dump,
+ src/testdir/dumps/Test_conceal_two_windows_08v.dump,
+ src/testdir/dumps/Test_conceal_two_windows_08c.dump,
+ src/testdir/dumps/Test_conceal_two_windows_08n.dump,
+ src/testdir/dumps/Test_conceal_two_windows_09i.dump,
+ src/testdir/dumps/Test_conceal_two_windows_09v.dump,
+ src/testdir/dumps/Test_conceal_two_windows_09c.dump,
+ src/testdir/dumps/Test_conceal_two_windows_09n.dump
+
+Patch 8.1.0722
+Problem: Cannot build without the virtualedit feature.
+Solution: Make getviscol2() always available.
+Files: src/misc2.c, src/proto/misc2.pro, src/ops.c
+
+Patch 8.1.0723
+Problem: Cannot run specific test when in src/testdir the same was as in
+ the src directory.
+Solution: Move build rule to src/testdir/Makefile.
+Files: src/testdir/Make_all.mak, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/Makefile, src/Make_all.mak, src/testdir/Makefile,
+ src/testdir/README.txt, src/Make_mvc.mak
+
+Patch 8.1.0724
+Problem: Build for MinGW fails.
+Solution: Avoid specifying dependencies in included makefile.
+Files: src/testdir/Make_all.mak, src/testdir/Makefile,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak
+
+Patch 8.1.0725
+Problem: Conceal mode is not completely tested.
+Solution: Add tests for moving the cursor in Insert mode.
+Files: src/testdir/test_conceal.vim,
+ src/testdir/dumps/Test_conceal_two_windows_10.dump,
+ src/testdir/dumps/Test_conceal_two_windows_11.dump,
+ src/testdir/dumps/Test_conceal_two_windows_12.dump,
+ src/testdir/dumps/Test_conceal_two_windows_13.dump
+
+Patch 8.1.0726
+Problem: Redrawing specifically for conceal feature.
+Solution: Use generic redrawing methods.
+Files: src/edit.c, src/gui.c, src/main.c, src/normal.c, src/screen.c,
+ src/proto/screen.pro, src/window.c
+
+Patch 8.1.0727
+Problem: Compiler warning for sprintf() argument.
+Solution: Add type cast.
+Files: src/dosinst.c
+
+Patch 8.1.0728
+Problem: Cannot avoid breaking after a single space.
+Solution: Add the 'p' flag to 'formatoptions'. (Tom Ryder)
+Files: runtime/doc/change.txt, src/edit.c, src/option.h,
+ src/testdir/test_textformat.vim
+
+Patch 8.1.0729
+Problem: There is a SourcePre autocommand event but not a SourcePost.
+Solution: Add the SourcePost autocommand event. (closes #3739)
+Files: src/vim.h, src/fileio.c, src/ex_cmds2.c, runtime/doc/autocmd.txt,
+ src/testdir/test_source.vim, src/testdir/Make_all.mak
+
+Patch 8.1.0730
+Problem: Compiler warning for get_buf_arg() unused.
+Solution: Add #ifdef. (John Marriott)
+Files: src/evalfunc.c
+
+Patch 8.1.0731
+Problem: JS encoding does not handle negative infinity.
+Solution: Add support for negative infinity for JS encoding. (Dominique
+ Pelle, closes #3792)
+Files: runtime/doc/eval.txt, src/json.c, src/testdir/test_json.vim
+
+Patch 8.1.0732
+Problem: Cannot build without the eval feature.
+Solution: Make a copy of the sourced file name.
+Files: src/ex_cmds2.c
+
+Patch 8.1.0733
+Problem: Too many #ifdefs for the multibyte feature.
+Solution: Tentatively always enable the multibyte feature. If you have a
+ problem with this, please discuss on the Vim maillist.
+Files: src/configure.ac, src/auto/configure, src/feature.h, src/Makefile,
+ src/Make_bc5.mak, src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.1.0734
+Problem: The hlsearch state is not stored in a session file.
+Solution: Add "nohlsearch" if appropriate. (Jason Franklin)
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.1.0735
+Problem: Cannot handle binary data.
+Solution: Add the Blob type. (Yasuhiro Matsumoto, closes #3638)
+Files: runtime/doc/eval.txt, runtime/doc/if_perl.txt,
+ runtime/doc/if_ruby.txt, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/Makefile, src/blob.c, src/channel.c, src/eval.c,
+ src/evalfunc.c, src/if_perl.xs, src/if_py_both.h, src/if_python.c,
+ src/if_python3.c, src/if_ruby.c, src/json.c, src/netbeans.c,
+ src/proto.h, src/proto/blob.pro, src/proto/channel.pro,
+ src/structs.h, src/testdir/Make_all.mak, src/vim.h, src/globals.h,
+ src/testdir/test_blob.vim, src/testdir/test_channel.vim
+
+Patch 8.1.0736
+Problem: Code for Blob not sufficiently tested.
+Solution: Add more tests. Fix uncovered crash. Add test_null_blob().
+Files: src/testdir/test_blob.vim, src/testdir/test_assign.vim, src/eval.c,
+ src/testdir/test_eval_stuff.vim, src/testdir/test_lambda.vim,
+ runtime/doc/eval.txt, src/evalfunc.c, src/blob.c,
+ src/testdir/test49.vim
+
+Patch 8.1.0737
+Problem: Compiler warning for uninitialized variable.
+Solution: Add initialization. (John Marriott)
+Files: src/eval.c
+
+Patch 8.1.0738
+Problem: Using freed memory, for loop over blob leaks memory.
+Solution: Clear pointer after freeing memory. Decrement reference count
+ after for loop over blob.
+Files: src/eval.c
+
+Patch 8.1.0739
+Problem: Text objects in not sufficiently tested.
+Solution: Add a few more test cases. (Dominique Pelle, closes #3795)
+Files: src/testdir/test_visual.vim
+
+Patch 8.1.0740
+Problem: Tcl test fails.
+Solution: When the argument is empty don't give an error, instead rely on
+ the error reporting higher up.
+Files: src/eval.c
+
+Patch 8.1.0741
+Problem: Viminfo with Blob is not tested.
+Solution: Extend the viminfo test. Fix reading a blob. Fixed storing a
+ special variable value.
+Files: src/testdir/test_viminfo.vim, src/eval.c, src/blob.c,
+ src/proto/blob.pro
+
+Patch 8.1.0742
+Problem: Not all Blob operations are tested.
+Solution: Add more testing for Blob.
+Files: src/testdir/test_blob.vim, src/evalfunc.c,
+ src/testdir/test_eval_stuff.vim
+
+Patch 8.1.0743
+Problem: Giving error messages is not flexible.
+Solution: Add semsg(). Change argument from "char_u *" to "char *", also
+ for msg() and get rid of most MSG macros. (Ozaki Kiichi, closes
+ #3302) Also make emsg() accept a "char *" argument. Get rid of
+ an enormous number of type casts.
+Files: src/blob.c, src/blowfish.c, src/buffer.c, src/channel.c,
+ src/crypt.c, src/dict.c, src/diff.c, src/digraph.c, src/edit.c,
+ src/eval.c, src/evalfunc.c, src/ex_cmds.c, src/ex_cmds.h,
+ src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c, src/ex_getln.c,
+ src/farsi.h, src/fileio.c, src/fold.c, src/getchar.c,
+ src/globals.h, src/gui.c, src/gui_at_fs.c, src/gui_at_sb.c,
+ src/gui_beval.c, src/gui_gtk_x11.c, src/gui_mac.c,
+ src/gui_photon.c, src/gui_w32.c, src/gui_x11.c, src/hangulin.c,
+ src/hardcopy.c, src/hashtab.c, src/if_cscope.c, src/if_lua.c,
+ src/if_mzsch.c, src/if_perl.xs, src/if_py_both.h, src/if_python.c,
+ src/if_python3.c, src/if_ruby.c, src/if_tcl.c, src/if_xcmdsrv.c,
+ src/json.c, src/list.c, src/main.c, src/mark.c, src/mbyte.c,
+ src/memfile.c, src/memline.c, src/menu.c, src/message.c,
+ src/misc1.c, src/misc2.c, src/netbeans.c, src/normal.c, src/ops.c,
+ src/option.c, src/os_amiga.c, src/os_mswin.c, src/os_unix.c,
+ src/os_win32.c, src/popupmnu.c, src/proto.h, src/proto/buffer.pro,
+ src/proto/digraph.pro, src/proto/ex_docmd.pro,
+ src/proto/ex_eval.pro, src/proto/ex_getln.pro,
+ src/proto/hardcopy.pro, src/proto/mbyte.pro,
+ src/proto/message.pro, src/proto/misc2.pro, src/proto/option.pro,
+ src/proto/spell.pro, src/quickfix.c, src/regexp.c,
+ src/regexp_nfa.c, src/search.c, src/sign.c, src/spell.c,
+ src/spellfile.c, src/structs.h, src/syntax.c, src/tag.c,
+ src/term.c, src/terminal.c, src/textprop.c, src/ui.c, src/undo.c,
+ src/userfunc.c, src/version.c, src/vim.h, src/window.c,
+
+Patch 8.1.0744 (after 8.1.0743)
+Problem: Compiler warnings for signed/unsigned strings.
+Solution: A few more type cast fixes.
+Files: src/option.c, src/if_perl.xs, src/if_py_both.h, src/integration.c
+
+Patch 8.1.0745
+Problem: Compiler warnings for signed/unsigned string.
+Solution: Remove type casts. (John Marriott)
+Files: src/ex_docmd.c, src/mbyte.c
+
+Patch 8.1.0746
+Problem: Highlighting not updated with conceal and 'cursorline'. (Jason
+ Franklin)
+Solution: Do not use a zero line number. Check if 'conceallevel' is set for
+ the current window.
+Files: src/main.c, src/testdir/test_conceal.vim,
+ src/testdir/dumps/Test_conceal_cul_01.dump,
+ src/testdir/dumps/Test_conceal_cul_02.dump,
+ src/testdir/dumps/Test_conceal_cul_03.dump
+
+Patch 8.1.0747
+Problem: map() with a bad expression doesn't give an error. (Ingo Karkat)
+Solution: Check for giving an error message. (closes #3800)
+Files: src/eval.c, src/testdir/test_filter_map.vim
+
+Patch 8.1.0748
+Problem: Using sprintf() instead of semsg().
+Solution: Use semsg(). Fix bug with E888. (Ozaki Kiichi, closes #3801)
+Files: src/regexp.c
+
+Patch 8.1.0749 (after 8.1.0747)
+Problem: Error message contains garbage. (Dominique Pelle)
+Solution: Use correct pointer to failed expression.
+Files: src/eval.c
+
+Patch 8.1.0750
+Problem: When the last sign is deleted the signcolumn may not be removed
+ even though 'signcolumn' is "auto".
+Solution: When deleting the last sign redraw the buffer. (Dominique Pelle,
+ closes #3803, closes #3804)
+Files: src/sign.c
+
+Patch 8.1.0751
+Problem: Some regexp errors are not tested.
+Solution: Add a test function.
+Files: src/testdir/test_regexp_latin.vim
+
+Patch 8.1.0752
+Problem: One more compiler warning for signed/unsigned string. (Tony
+ Mechelynck)
+Solution: Remove type cast.
+Files: src/ex_docmd.c
+
+Patch 8.1.0753
+Problem: printf format not checked for semsg().
+Solution: Add GNUC attribute and fix reported problems. (Dominique Pelle,
+ closes #3805)
+Files: src/buffer.c, src/diff.c, src/eval.c, src/evalfunc.c,
+ src/ex_docmd.c, src/if_cscope.c, src/netbeans.c, src/proto.h,
+ src/proto/message.pro, src/quickfix.c, src/regexp_nfa.c,
+ src/sign.c, src/spellfile.c, src/window.c, src/gui_x11.c
+
+Patch 8.1.0754
+Problem: Preferred column is lost when setting 'cursorcolumn'.
+Solution: Change option flag to P_RWINONLY. (Takayuki Kurosawa,
+ closes #3806)
+Files: src/option.c, src/testdir/test_cursor_func.vim
+
+Patch 8.1.0755
+Problem: Error message for get() on a Blob with invalid index.
+Solution: Return an empty Blob, like get() on a List does.
+Files: src/evalfunc.c, src/testdir/test_blob.vim
+
+Patch 8.1.0756
+Problem: copy() does not make a copy of a Blob.
+Solution: Make a copy.
+Files: src/eval.c, src/testdir/test_blob.vim
+
+Patch 8.1.0757
+Problem: Not enough documentation for Blobs.
+Solution: Add a section about Blobs.
+Files: runtime/doc/eval.txt
+
+Patch 8.1.0758
+Problem: Font number is always one instead of the actual.
+Solution: Use "%d" instead of "1". (Ken Takata)
+Files: src/gui_x11.c
+
+Patch 8.1.0759
+Problem: Showing two characters for tab is limited.
+Solution: Allow for a third character for "tab:" in 'listchars'. (Nathaniel
+ Braun, Ken Takata, closes #3810)
+Files: runtime/doc/options.txt, src/globals.h, src/message.c,
+ src/option.c, src/screen.c, src/testdir/test_listchars.vim
+
+Patch 8.1.0760
+Problem: No proper test for using 'termencoding'.
+Solution: Add a screendump test. Fix using double width characters in a
+ screendump.
+Files: src/terminal.c, src/testdir/test_termencoding.vim,
+ src/testdir/Make_all.mak,
+ src/testdir/dumps/Test_tenc_euc_jp_01.dump
+
+Patch 8.1.0761
+Problem: Default value for brief_wait is wrong.
+Solution: Make the default FALSE. (Ozaki Kiichi, closes #3812, closes #3799)
+Files: src/ui.c
+
+Patch 8.1.0762
+Problem: Compiler warning.
+Solution: Add type cast. (Mike Williams)
+Files: src/channel.c
+
+Patch 8.1.0763
+Problem: Nobody is using the Sun Workshop support.
+Solution: Remove the Workshop support.
+Files: runtime/doc/workshop.txt, runtime/doc/help.txt,
+ runtime/doc/netbeans.txt, src/Makefile, src/auto/configure,
+ src/beval.c, src/buffer.c, src/config.h.in, src/config.mk.in,
+ src/configure.ac, src/evalfunc.c, src/ex_cmds.c, src/ex_cmds.h,
+ src/ex_docmd.c, src/feature.h, src/fileio.c, src/globals.h,
+ src/gui.c, src/gui_beval.c, src/gui_motif.c, src/gui_x11.c,
+ src/integration.c, src/integration.h, src/main.c, src/misc2.c,
+ src/nbdebug.c, src/netbeans.c, src/proto.h,
+ src/proto/workshop.pro, src/ui.c, src/version.c, src/vim.h,
+ src/workshop.c, src/workshop.h, src/wsdebug.c, src/wsdebug.h,
+ src/ex_cmdidxs.h
+
+Patch 8.1.0764
+Problem: List of distributed files is outdated.
+Solution: Remove workshop files. Add blob files.
+Files: Filelist
+
+Patch 8.1.0765
+Problem: String format of a Blob can't be parsed back.
+Solution: Use 0z format.
+Files: src/blob.c, src/eval.c, src/testdir/test_blob.vim
+
+Patch 8.1.0766
+Problem: Various problems when using Vim on VMS.
+Solution: Various fixes. Define long_long_T. (Zoltan Arpadffy)
+Files: src/eval.c, src/feature.h, src/fileio.c, src/gui_motif.c,
+ src/gui_x11.c, src/gui_xmebw.c, src/json.c, src/Make_vms.mms,
+ src/ops.c, src/os_vms_conf.h, src/vim.h, src/xdiff/xdiff.h,
+ src/xdiff/xinclude.h
+
+Patch 8.1.0767
+Problem: When deleting lines at the bottom signs are misplaced.
+Solution: Properly update the line number of signs at the end of a buffer
+ after a delete/undo operation. (Yegappan Lakshmanan, closes #3798)
+Files: src/sign.c, src/testdir/test_signs.vim
+
+Patch 8.1.0768
+Problem: Updating completions may cause the popup menu to flicker.
+Solution: Avoid updating the text below the popup menu before drawing the
+ popup menu.
+Files: src/popupmnu.c, src/proto/popupmnu.pro, src/edit.c, src/screen.c
+
+Patch 8.1.0769
+Problem: :stop is covered in two tests.
+Solution: Remove Test_stop_in_terminal(). Make other test exit Vim cleanly.
+ (Ozaki Kiichi, closes #3814)
+Files: src/testdir/test_terminal.vim, src/testdir/test_suspend.vim
+
+Patch 8.1.0770
+Problem: Inconsistent use of ELAPSED_FUNC.
+Solution: Consistently use ELAPSED_FUNC. Also turn ELAPSED_TYPE into a
+ typedef. (Ozaki Kiichi, closes #3815)
+Files: src/channel.c, src/gui.c, src/misc1.c, src/os_unix.c, src/vim.h
+
+Patch 8.1.0771
+Problem: Some shell filetype patterns end in a star.
+Solution: Make sure that patterns not ending in a star are preferred.
+Files: runtime/filetype.vim, runtime/autoload/dist/ft.vim
+
+Patch 8.1.0772
+Problem: The sign_define_by_name() function is too long.
+Solution: Split it into smaller functions. (Yegappan Lakshmanan,
+ closes #3819)
+Files: src/sign.c
+
+Patch 8.1.0773
+Problem: Not all crypt code is tested.
+Solution: Disable unused crypt code. Add more test coverage.
+Files: src/structs.h, src/crypt.c, src/testdir/test_crypt.vim,
+ src/proto/crypt.pro, src/fileio.c
+
+Patch 8.1.0774
+Problem: VMS build is missing the blob file.
+Solution: Add the blob file to the build rules. (Zoltan Arpadffy)
+Files: src/Make_vms.mms, runtime/doc/os_vms.txt
+
+Patch 8.1.0775
+Problem: Matching too many files as zsh. (Danek Duvall)
+Solution: Be more specific with zsh filetype patterns.
+Files: runtime/filetype.vim
+
+Patch 8.1.0776
+Problem: Travis does not build a version without GUI on Linux.
+Solution: Add an environment for tiny features without GUI.
+Files: .travis.yml
+
+Patch 8.1.0777
+Problem: Win32: using pipes for channel does not work well.
+Solution: Use a larger buffer and handle overlaps. (Yasuhiro Matsumoto,
+ closes #3782)
+Files: src/channel.c, src/os_win32.c
+
+Patch 8.1.0778
+Problem: Terminal test fails on MS-Windows.
+Solution: Temporarily skip the test on MS-Windows. Do run it both in
+ terminal and GUI on other systems.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0779
+Problem: Argument for message functions is inconsistent.
+Solution: Make first argument to msg() "char *".
+Files: src/buffer.c, src/crypt.c, src/edit.c, src/ex_cmds.c, src/eval.c,
+ src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c, src/farsi.c,
+ src/if_cscope.c, src/fileio.c, src/getchar.c, src/globals.h,
+ src/gui.c, src/if_perl.xs, src/netbeans.c, src/gui_w32.c,
+ src/hardcopy.c, src/if_mzsch.c, src/if_py_both.h, src/if_ruby.c,
+ src/if_tcl.c, src/mark.c, src/mbyte.c, src/menu.c, src/memline.c,
+ src/message.c, src/misc1.c, src/misc2.c, src/normal.c, src/ops.c,
+ src/option.c, src/os_amiga.c, src/os_unix.c, src/os_win32.c,
+ src/proto/message.pro, src/quickfix.c, src/sign.c, src/regexp.c,
+ src/ui.c, src/screen.c, src/search.c, src/spell.c,
+ src/spellfile.c, src/syntax.c, src/tag.c, src/term.c, src/undo.c,
+ src/userfunc.c, src/version.c, src/vim.h, src/window.c,
+ src/proto/eval.pro, src/evalfunc.c, src/ex_eval.c, src/farsi.h
+
+Patch 8.1.0780
+Problem: Terminal test fails on Mac.
+Solution: Skip the test on Mac.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0781
+Problem: Build error when using if_xcmdsrv.c.
+Solution: Add missing part of 8.1.0779.
+Files: src/if_xcmdsrv.c
+
+Patch 8.1.0782
+Problem: Win32: cursor blinks when Vim is not active.
+Solution: Remove call to setActiveWindow(). (Yasuhiro Matsumoto,
+ closes #3778)
+Files: src/gui_w32.c, src/proto/gui_w32.pro, src/menu.c
+
+Patch 8.1.0783
+Problem: Compiler warning for signed/unsigned.
+Solution: Add type cast. Change type of buffer. (Ozaki Kiichi, closes #3827)
+Files: src/main.c, src/message.c
+
+Patch 8.1.0784
+Problem: Messy indent in if statement.
+Solution: Improve structure of if statement. (Ozaki Kiichi, closes #3826)
+Files: src/os_win32.c
+
+Patch 8.1.0785
+Problem: Depending on the configuration some functions are unused.
+Solution: Add more #ifdefs, remove unused functions. (Dominique Pelle,
+ closes #3822)
+Files: src/buffer.c, src/channel.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/fileio.c, src/getchar.c, src/gui_gtk_x11.c, src/hashtab.c,
+ src/json.c, src/mbyte.c, src/message.c, src/misc1.c, src/misc2.c,
+ src/ops.c, src/option.c, src/os_unix.c, src/proto/os_unix.pro,
+ src/proto/regexp.pro, src/proto/terminal.pro, src/regexp.c,
+ src/screen.c, src/search.c, src/syntax.c, src/term.c,
+ src/terminal.c, src/ui.c, src/userfunc.c
+
+Patch 8.1.0786
+Problem: ml_get error when updating the status line and a terminal had its
+ scrollback cleared. (Chris Patuzzo)
+Solution: Check the cursor position when drawing the status line.
+ (closes #3830)
+Files: src/buffer.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0787
+Problem: Compiler warning for unused function. (Tony Mechelynck)
+Solution: Tune #ifdef around setjmp functions.
+Files: src/os_unix.c
+
+Patch 8.1.0788
+Problem: Cannot build with tiny features.
+Solution: Adjust #ifdefs.
+Files: src/os_unix.c
+
+Patch 8.1.0789
+Problem: Sourcing a session sets v:errmsg.
+Solution: Use "%argdel" instead of "argdel *". (Jason Franklin)
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.1.0790
+Problem: Code for creating tabpages in session is too complex.
+Solution: Simplify the code. (Jason Franklin)
+Files: src/ex_docmd.c
+
+Patch 8.1.0791
+Problem: A few compiler warnings on VMS.
+Solution: Remove type cast. Adjust #ifdef. (Zoltan Arpadffy)
+Files: src/os_unix.c, src/proto.h
+
+Patch 8.1.0792
+Problem: Popup menu is displayed on top of the cmdline window if it is
+ opened from Insert completion. (Bjorn Linse)
+Solution: Remove the popup menu. Restore the cursor position.
+ (closes #3838)
+Files: src/edit.c, src/ex_getln.c
+
+Patch 8.1.0793
+Problem: Incorrect error messages for functions that now take a Blob
+ argument.
+Solution: Adjust the error messages. (Dominique Pelle, closes #3846)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/globals.h,
+ src/testdir/test_blob.vim, src/testdir/test_listdict.vim
+
+Patch 8.1.0794
+Problem: White space before " -Ntabmove" causes problems.
+Solution: Skip whitespace. (Ozaki Kiichi, closes #3841)
+Files: src/ex_docmd.c, src/testdir/test_tabpage.vim
+
+Patch 8.1.0795 (after 8.1.0792)
+Problem: Cannot build without popup menu.
+Solution: Add #ifdef
+Files: src/ex_getln.c
+
+Patch 8.1.0796
+Problem: MS-Windows 7: problem with named pipe on channel.
+Solution: Put back the disconnect/connect calls. (Yasuhiro Matsumoto,
+ closes #3833)
+Files: src/channel.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0797
+Problem: Error E898 is used twice.
+Solution: Rename the Blob error to E899. (closes #3853)
+Files: src/evalfunc.c, runtime/doc/eval.txt,
+ src/testdir/test_listdict.vim
+
+Patch 8.1.0798
+Problem: Changing a blob while iterating over it works strangely.
+Solution: Make a copy of the Blob before iterating.
+Files: src/blob.c, src/proto/blob.pro, src/eval.c,
+ src/testdir/test_blob.vim
+
+Patch 8.1.0799
+Problem: Calling deleted function; test doesn't work on Mac.
+Solution: Wait for the function to be called before deleting it. Use a job
+ to write to the pty, unless in the GUI. (Ozaki Kiichi,
+ closes #3854)
+Files: src/testdir/test_channel.vim, src/testdir/test_terminal.vim
+
+Patch 8.1.0800
+Problem: May use a lot of memory when a function creates a cyclic
+ reference.
+Solution: After saving a funccal many times, invoke the garbage collector.
+ (closes #3835)
+Files: src/userfunc.c
+
+Patch 8.1.0801
+Problem: MinGW: no hint that tests fail because of small terminal.
+Solution: Add a rule for test1 that checks for "wrongtermsize".
+ (msoyka-of-wharton)
+Files: src/testdir/Make_ming.mak
+
+Patch 8.1.0802
+Problem: Negative index doesn't work for Blob.
+Solution: Make it work, add a test. (closes #3856)
+Files: src/blob.c, src/proto/blob.pro, src/eval.c,
+ src/testdir/test_blob.vim
+
+Patch 8.1.0803
+Problem: Session file has problem with single quote in file name. (Jon
+ Crowe)
+Solution: Use a double quoted string. Add a test.
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.1.0804
+Problem: Crash when setting v:errmsg to empty list. (Jason Franklin)
+Solution: Separate getting value and assigning result.
+Files: src/eval.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.1.0805
+Problem: Too many #ifdefs.
+Solution: Graduate FEAT_MBYTE, part 1.
+Files: src/buffer.c, src/charset.c, src/diff.c, src/digraph.c,
+ src/edit.c, src/eval.c, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c, src/fileio.c,
+ src/fold.c, src/gui.c, src/gui_mac.c, src/gui_photon.c,
+ src/gui_w32.c
+
+Patch 8.1.0806
+Problem: Too many #ifdefs.
+Solution: Graduate FEAT_MBYTE, part 2.
+Files: src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c, src/gui_w32.c,
+ src/gui_x11.c, src/hardcopy.c, src/if_xcmdsrv.c, src/json.c,
+ src/kword_test.c, src/main.c, src/mbyte.c, src/memline.c,
+ src/message.c, src/misc1.c, src/misc2.c, src/move.c, src/normal.c,
+ src/ops.c, src/option.c, src/charset.c
+
+Patch 8.1.0807
+Problem: Session test fails on MS-Windows.
+Solution: Don't try creating file with illegal name.
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.0808
+Problem: MS-Windows: build error with GUI.
+Solution: Remove "static".
+Files: src/gui_w32.c
+
+Patch 8.1.0809
+Problem: Too many #ifdefs.
+Solution: Graduate FEAT_MBYTE, part 3.
+Files: src/os_amiga.c, src/os_mswin.c, src/os_unix.c, src/os_w32exe.c,
+ src/os_win32.c, src/quickfix.c, src/regexp.c, src/regexp_nfa.c,
+ src/screen.c
+
+Patch 8.1.0810
+Problem: Too many #ifdefs.
+Solution: Graduate FEAT_MBYTE, part 4.
+Files: src/getchar.c, src/search.c, src/sign.c, src/spell.c,
+ src/spellfile.c, src/syntax.c, src/tag.c, src/term.c, src/ui.c,
+ src/version.c, src/winclip.c, src/window.c, src/glbl_ime.cpp,
+ src/ex_cmds.h, src/globals.h, src/gui.h, src/if_py_both.h,
+ src/macros.h, src/option.h, src/os_mac.h, src/os_win32.h,
+ src/proto.h, src/spell.h, src/structs.h, src/vim.h
+
+Patch 8.1.0811
+Problem: Too many #ifdefs.
+Solution: Graduate FEAT_MBYTE, the final chapter.
+Files: src/feature.h, src/vim.h, src/crypt_zip.c, src/fileio.c,
+ src/message.c, src/spell.h, src/structs.h, src/config.h.in,
+ src/configure.ac, src/auto/configure, src/testdir/runtest.vim,
+ src/testdir/test_alot_utf8.vim, src/testdir/test_arabic.vim,
+ src/testdir/test_charsearch_utf8.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_digraph.vim,
+ src/testdir/test_display.vim, src/testdir/test_edit.vim,
+ src/testdir/test_erasebackword.vim,
+ src/testdir/test_expr_utf8.vim, src/testdir/test_functions.vim,
+ src/testdir/test_ga.vim, src/testdir/test_iminsert.vim,
+ src/testdir/test_increment_dbcs.vim, src/testdir/test_json.vim,
+ src/testdir/test_makeencoding.vim, src/testdir/test_maparg.vim,
+ src/testdir/test_mapping.vim, src/testdir/test_marks.vim,
+ src/testdir/test_match.vim,
+ src/testdir/test_matchadd_conceal_utf8.vim,
+ src/testdir/test_mksession_utf8.vim, src/testdir/test_normal.vim,
+ src/testdir/test_plus_arg_edit.vim, src/testdir/test_profile.vim,
+ src/testdir/test_put.vim, src/testdir/test_regex_char_classes.vim,
+ src/testdir/test_regexp_utf8.vim, src/testdir/test_search.vim,
+ src/testdir/test_source_utf8.vim, src/testdir/test_spell.vim,
+ src/testdir/test_startup_utf8.vim,
+ src/testdir/test_termencoding.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_utf8.vim, src/testdir/test_utf8_comparisons.vim,
+ src/testdir/test_viminfo.vim, src/testdir/test_virtualedit.vim,
+ src/testdir/test_visual.vim, src/testdir/test_wordcount.vim,
+ src/testdir/test_writefile.vim, src/appveyor.bat, src/os_macosx.m
+
+Patch 8.1.0812
+Problem: Unicode 16 feature is not useful and cannot be detected.
+Solution: Remove UNICODE16.
+Files: src/screen.c, src/vim.h, src/feature.h
+
+Patch 8.1.0813
+Problem: FileChangedShell not sufficiently tested.
+Solution: Add a more comprehensive test case.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.1.0814
+Problem: :mksession cannot handle a very long 'runtimepath'. (Timothy
+ Madden)
+Solution: Expand each part separately, instead of the whole option at once.
+ (Christian Brabandt, closes #3466)
+Files: src/option.c, src/testdir/test_mksession.vim
+
+Patch 8.1.0815
+Problem: Dialog for file changed outside of Vim not tested.
+Solution: Add a test. Move FileChangedShell test. Add 'L' flag to
+ feedkeys().
+Files: src/testdir/test_autocmd.vim, src/testdir/test_filechanged.vim,
+ src/testdir/Make_all.mak, src/evalfunc.c, runtime/doc/eval.txt
+
+Patch 8.1.0816
+Problem: Test for 'runtimepath' in session fails on MS-Windows.
+Solution: Skip the test for now.
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.0817
+Problem: ":=" command is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3859)
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_ex_equal.vim
+
+Patch 8.1.0818
+Problem: MS-Windows: cannot send large data with ch_sendraw().
+Solution: Split write into several WriteFile() calls. (Yasuhiro Matsumoto,
+ closes #3823)
+Files: src/channel.c, src/os_win32.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel_pipe.py, src/vim.h
+
+Patch 8.1.0819
+Problem: A failed assert with a long string is hard to read.
+Solution: Shorten the assert message.
+Files: src/eval.c, src/testdir/test_assert.vim
+
+Patch 8.1.0820
+Problem: Test for sending large data over channel sometimes fails.
+Solution: Handle that the job may have finished early. Also fix that file
+ changed test doesn't work in the GUI and reduce flakiness. (Ozaki
+ Kiichi, closes #3861)
+Files: src/testdir/test_channel.vim, src/testdir/test_filechanged.vim
+
+Patch 8.1.0821
+Problem: Xxd "usage" output and other arguments not tested.
+Solution: Add a test to trigger the usage output in various ways. Fix
+ uncovered problem.
+Files: src/testdir/test_xxd.vim, src/xxd/xxd.c
+
+Patch 8.1.0822
+Problem: Peeking and flushing output slows down execution.
+Solution: Do not update the mode message when global_busy is set. Do not
+ flush when only peeking for a character. (Ken Takata)
+Files: src/getchar.c, src/screen.c, src/proto/screen.pro, src/edit.c
+
+Patch 8.1.0823
+Problem: Not sufficient testing of xxd.
+Solution: Add some more test coverage.
+Files: src/testdir/test_xxd.vim
+
+Patch 8.1.0824
+Problem: SunOS/Solaris has a problem with ttys.
+Solution: Add mch_isatty() with extra handling for SunOS. (Ozaki Kiichi,
+ closes #3865)
+Files: src/auto/configure, src/channel.c, src/config.h.in,
+ src/configure.ac, src/os_unix.c, src/proto/pty.pro, src/pty.c,
+ src/terminal.c
+
+Patch 8.1.0825
+Problem: Code for autocommands is mixed with file I/O code.
+Solution: Move autocommand code to a separate file. (Yegappan Lakshmanan,
+ closes #3863)
+Files: Filelist, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_dice.mak, src/Make_ivc.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak,
+ src/Make_vms.mms, src/Makefile, src/README.txt, src/autocmd.c,
+ src/fileio.c, src/globals.h, src/proto.h, src/proto/autocmd.pro,
+ src/proto/fileio.pro
+
+Patch 8.1.0826
+Problem: Too many #ifdefs.
+Solution: Graduate FEAT_VIRTUALEDIT. Adds about 10Kbyte to the code.
+Files: src/buffer.c, src/charset.c, src/edit.c, src/eval.c,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_docmd.c, src/feature.h,
+ src/globals.h, src/gui.c, src/if_py_both.h, src/macros.h,
+ src/mark.c, src/mbyte.c, src/memline.c, src/menu.c, src/misc1.c,
+ src/misc2.c, src/move.c, src/netbeans.c, src/normal.c, src/ops.c,
+ src/option.c, src/option.h, src/screen.c, src/search.c,
+ src/spell.c, src/structs.h, src/tag.c, src/ui.c, src/undo.c,
+ src/userfunc.c, src/version.c, src/vim.h, src/window.c
+
+Patch 8.1.0827 (after 8.1.0825)
+Problem: Missing dependency in Makefile.
+Solution: Add dependency from autocmd.o on auto/osdef.h
+Files: src/Makefile
+
+Patch 8.1.0828
+Problem: Still using FEAT_VIRTUALEDIT.
+Solution: Remove last use of FEAT_VIRTUALEDIT.
+Files: src/quickfix.c
+
+Patch 8.1.0829
+Problem: When 'hidden' is set session creates extra buffers.
+Solution: Move :badd commands to the end. (Jason Franklin)
+Files: src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.1.0830
+Problem: Test leaves directory behind on MS-Windows.
+Solution: Close buffer before deleting directory.
+Files: src/testdir/test_swap.vim
+
+Patch 8.1.0831
+Problem: Xxd test fails if man page has dos fileformat.
+Solution: Make a copy with unix fileformat.
+Files: src/testdir/test_xxd.vim
+
+Patch 8.1.0832
+Problem: confirm() is not tested.
+Solution: Add a test. (Dominique Pelle, closes #3868)
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0833
+Problem: Memory leak when jumps output is filtered.
+Solution: Free the filtered name. (Dominique Pelle, closes #3869)
+Files: src/mark.c
+
+Patch 8.1.0834
+Problem: GUI may wait too long before dealing with messages. Returning
+ early may cause a mapping to time out.
+Solution: Use the waiting loop from Unix also for the GUI.
+ (closes #3817, closes #3824)
+Files: src/ui.c, src/proto/ui.pro, src/os_unix.c, src/gui.c,
+ src/testdir/screendump.vim
+
+Patch 8.1.0835
+Problem: GUI build fails on MS-Windows.
+Solution: Adjust #ifdef.
+Files: src/ui.c
+
+Patch 8.1.0836
+Problem: User completion test can fail on MS-Windows.
+Solution: Allow for other names before "Administrator".
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.1.0837
+Problem: Timer interrupting cursorhold and mapping not tested.
+Solution: Add tests with timers. (Ozaki Kiichi, closes #3871)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_mapping.vim
+
+Patch 8.1.0838
+Problem: Compiler warning for type conversion.
+Solution: Add a type cast. (Mike Williams)
+Files: src/channel.c
+
+Patch 8.1.0839
+Problem: When using VTP wrong colors after a color scheme change.
+Solution: When VTP is active always clear after a color scheme change.
+ (Nobuhiro Takasaki, closes #3872)
+Files: src/ex_docmd.c
+
+Patch 8.1.0840
+Problem: getchar(0) never returns a character in the terminal.
+Solution: Call wait_func() at least once.
+Files: src/ui.c, src/testdir/test_timers.vim, src/gui_gtk_x11.c,
+ src/gui_w32.c, src/gui_photon.c, src/gui_x11.c
+
+Patch 8.1.0841
+Problem: Travis config to get Lua on macOS is too complicated.
+Solution: Use an addons entry. (Ozaki Kiichi, closes #3876)
+Files: .travis.yml
+
+Patch 8.1.0842
+Problem: getchar_zero test fails on MS-Windows.
+Solution: Disable the test for now.
+Files: src/testdir/test_timers.vim
+
+Patch 8.1.0843
+Problem: Memory leak when running "make test_cd".
+Solution: Free the stack element when failing. (Dominique Pelle,
+ closes #3877)
+Files: src/misc2.c
+
+Patch 8.1.0844
+Problem: When timer fails test will hang forever.
+Solution: Use reltime() to limit waiting time. (Ozaki Kiichi, closes #3878)
+Files: src/testdir/test_timers.vim
+
+Patch 8.1.0845
+Problem: Having job_status() free the job causes problems.
+Solution: Do not actually free the job or terminal yet, put it in a list and
+ free it a bit later. Do not use a terminal after checking the job
+ status. (closes #3873)
+Files: src/channel.c, src/terminal.c, src/proto/terminal.pro, src/misc2.c
+
+Patch 8.1.0846
+Problem: Not easy to recognize the system Vim runs on.
+Solution: Add more items to the features list. (Ozaki Kiichi, closes #3855)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_channel.vim, src/testdir/test_functions.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_writefile.vim
+
+Patch 8.1.0847
+Problem: May use terminal after it was cleaned up.
+Solution: Use the job pointer.
+Files: src/terminal.c
+
+Patch 8.1.0848
+Problem: Cannot build with Ruby 1.8. (Tom G. Christensen)
+Solution: Use rb-str_new2(). (Yasuhiro Matsumoto, closes #3883,
+ closes #3884)
+Files: src/if_ruby.c
+
+Patch 8.1.0849
+Problem: Cursorline highlight is not always updated.
+Solution: Set w_last_cursorline when redrawing. Fix resetting cursor flags
+ when using the popup menu.
+Files: src/screen.c, src/popupmnu.c, src/testdir/test_highlight.vim,
+ src/testdir/dumps/Test_cursorline_yank_01.dump
+
+Patch 8.1.0850
+Problem: Test for 'backupskip' is not correct.
+Solution: Split the option in parts and use expand(). (Michael Soyka)
+Files: src/testdir/test_options.vim
+
+Patch 8.1.0851
+Problem: feedkeys() with "L" does not work properly.
+Solution: Do not set typebuf_was_filled when using "L". (Ozaki Kiichi,
+ closes #3885)
+Files: src/evalfunc.c, src/testdir/test_autocmd.vim,
+ src/testdir/test_mapping.vim, src/testdir/test_timers.vim
+
+Patch 8.1.0852
+Problem: findfile() and finddir() are not properly tested.
+Solution: Extend the test and add more. (Dominique Pelle, closes #3880)
+Files: src/testdir/test_findfile.vim
+
+Patch 8.1.0853 (after 8.1.0850)
+Problem: Options test fails on Mac.
+Solution: Remove a trailing slash from $TMPDIR.
+Files: src/testdir/test_options.vim
+
+Patch 8.1.0854
+Problem: xxd does not work with more than 32 bit addresses.
+Solution: Add support for 64 bit addresses. (Christer Jensen, closes #3791)
+Files: src/xxd/xxd.c
+
+Patch 8.1.0855
+Problem: Cannot build xxd with MSVC 10.
+Solution: Move declaration to start of block.
+Files: src/xxd/xxd.c
+
+Patch 8.1.0856
+Problem: When scrolling a window other than the current one the cursorline
+ highlighting is not always updated. (Jason Franklin)
+Solution: Call redraw_for_cursorline() after scrolling. Only set
+ w_last_cursorline when drawing the cursor line. Reset the lines
+ to be redrawn also when redrawing the whole window.
+Files: src/move.c, src/proto/move.pro, src/normal.c
+
+Patch 8.1.0857
+Problem: Indent functionality is not separated.
+Solution: Move indent functionality into a new file. (Yegappan Lakshmanan,
+ closes #3886)
+Files: Filelist, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_dice.mak, src/Make_ivc.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak,
+ src/Make_vms.mms, src/Makefile, src/edit.c, src/indent.c,
+ src/misc1.c, src/proto.h, src/proto/edit.pro,
+ src/proto/indent.pro, src/proto/misc1.pro
+
+Patch 8.1.0858
+Problem: 'indentkeys' and 'cinkeys' defaults are different.
+Solution: Make them the same, update docs. (close #3882)
+Files: src/option.c, runtime/doc/options.txt, runtime/doc/indent.txt
+
+Patch 8.1.0859
+Problem: "%v" in 'errorformat' does not handle multibyte characters.
+Solution: Handle multibyte characters. (Yegappan Lakshmanan, closes #3700)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0860
+Problem: Debug lines left in the code.
+Solution: Delete the lines.
+Files: src/edit.c
+
+Patch 8.1.0861
+Problem: Building with MinGW and static libc doesn't work.
+Solution: Change the LIB argument. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.0862
+Problem: No verbose version of character classes.
+Solution: Add [:ident:], [:keyword:] and [:fname:]. (Ozaki Kiichi,
+ closes #1373)
+Files: runtime/doc/pattern.txt, src/regexp.c, src/regexp_nfa.c,
+ src/testdir/test_regexp_utf8.vim
+
+Patch 8.1.0863
+Problem: Cannot see what signal caused a job to end.
+Solution: Add "termsig" to job_info(). (Ozaki Kiichi, closes #3786)
+Files: runtime/doc/eval.txt, src/channel.c, src/os_unix.c, src/structs.h,
+ src/testdir/test_channel.vim
+
+Patch 8.1.0864
+Problem: Cannot have a local value for 'scrolloff' and 'sidescrolloff'.
+ (Gary Holloway)
+Solution: Make 'scrolloff' and 'sidescrolloff' global-local. (mostly by
+ Aron Widforss, closes #3539)
+Files: runtime/doc/options.txt, src/edit.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/gui.c, src/misc2.c, src/move.c, src/normal.c,
+ src/option.c, src/proto/option.pro, src/option.h, src/search.c,
+ src/structs.h, src/window.c, src/testdir/test_options.vim
+
+Patch 8.1.0865
+Problem: When 'listchars' only contains "nbsp:X" it does not work.
+Solution: Set extra_check when lcs_nbsp is set. (Ralf Schandl, closes #3889)
+Files: src/screen.c, src/testdir/test_listchars.vim
+
+Patch 8.1.0866
+Problem: Build file dependencies are outdated. (John Little)
+Solution: Run "make proto" and "make depend".
+Files: src/vim.h, src/Makefile, src/proto/sign.pro, src/proto/gui_w32.pro
+
+Patch 8.1.0867
+Problem: Cannot build Python interface with Python 2.4. (Tom G. Christensen)
+Solution: Define PyBytes_FromStringAndSize. (Ken Takata, closes #3888)
+Files: src/if_python.c
+
+Patch 8.1.0868
+Problem: Crash if triggering garbage collector after a function call.
+ (Michael Henry)
+Solution: Don't call the garbage collector right away, do it later.
+ (closes #3894)
+Files: src/userfunc.c
+
+Patch 8.1.0869
+Problem: Travis CI script is too complicated.
+Solution: Add names to environments. Move appveyor script outside of src
+ directory. (Ozaki Kiichi, closes #3890)
+Files: .travis.yml, appveyor.yml, ci/appveyor.bat, src/appveyor.bat,
+ Filelist
+
+Patch 8.1.0870
+Problem: Vim doesn't use the new ConPTY support in Windows 10.
+Solution: Use ConPTY support, if available. (Nobuhiro Takasaki, closes #3794)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/terminal.txt, src/channel.c, src/evalfunc.c,
+ src/globals.h, src/option.c, src/option.h, src/os_win32.c,
+ src/proto/terminal.pro, src/structs.h, src/terminal.c,
+ src/testdir/gen_opt_test.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_mksession.vim, src/testdir/test_terminal.vim
+
+Patch 8.1.0871
+Problem: Build error when building with Ruby 2.6.0.
+Solution: Change argument of rb_int2big_stub(). (Android Baumann,
+ closes #3899)
+Files: src/if_ruby.c
+
+Patch 8.1.0872
+Problem: Confusing condition.
+Solution: Use "==" instead of "<=".
+Files: src/gui_gtk_x11.c
+
+Patch 8.1.0873
+Problem: List if distributed files does not include the matchit autoload
+ directory.
+Solution: Add the directory.
+Files: src/Filelist
+
+Patch 8.1.0874
+Problem: Using old style comments in new file.
+Solution: Convert to // comments in new file. (Yegappan Lakshmanan)
+Files: src/indent.c
+
+Patch 8.1.0875
+Problem: Not all errors of marks and findfile()/finddir() are tested.
+Solution: Add more test coverage. (Dominique Pelle)
+Files: src/testdir/test_findfile.vim, src/testdir/test_marks.vim
+
+Patch 8.1.0876
+Problem: Completion match not displayed when popup menu is not shown.
+Solution: Call update_screen() when not displaying the popup menu to show
+ the inserted match. (Ken Takata, Hirohito Higashi)
+Files: src/edit.c
+
+Patch 8.1.0877
+Problem: New buffer used every time the quickfix window is opened.
+Solution: Reuse the buffer. (Yegappan Lakshmanan, closes #3902)
+Files: src/buffer.c, src/proto/quickfix.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.1.0878
+Problem: Test for has('bsd') fails on some BSD systems.
+Solution: Adjust the uname match. (James McCoy, closes #3909)
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0879
+Problem: MS-Windows: temp name encoding can be wrong.
+Solution: Convert from active code page to 'encoding'. (Yasuhiro Matsumoto,
+ closes #3520, closes #1698)
+Files: src/fileio.c
+
+Patch 8.1.0880
+Problem: MS-Windows: inconsistent selection of winpty/conpty.
+Solution: Name option 'termwintype', use ++type argument and "term_pty" for
+ term_start(). (Hirohito Higashi, closes #3915)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/terminal.txt, src/channel.c, src/option.c,
+ src/option.h, src/structs.h, src/terminal.c,
+ src/testdir/gen_opt_test.vim, runtime/optwin.vim,
+ runtime/doc/quickref.txt
+
+Patch 8.1.0881
+Problem: Can execute shell commands in rvim through interfaces.
+Solution: Disable using interfaces in restricted mode. Allow for writing
+ file with writefile(), histadd() and a few others.
+Files: runtime/doc/starting.txt, src/if_perl.xs, src/if_cmds.h,
+ src/ex_cmds.c, src/ex_docmd.c, src/evalfunc.c,
+ src/testdir/test_restricted.vim, src/testdir/Make_all.mak
+
+Patch 8.1.0882 (after 8.1.0879)
+Problem: Checking for FEAT_MBYTE which doesn't exist anymore. (Christ van
+ Willegen)
+Solution: Remove it.
+Files: src/fileio.c
+
+Patch 8.1.0883
+Problem: Missing some changes for Ex commands.
+Solution: Add missing changes in header file.
+Files: src/ex_cmds.h
+
+Patch 8.1.0884
+Problem: Double check for bsd systems.
+Solution: Delete the old line.
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.0885
+Problem: Test for restricted hangs on MS-Windows GUI.
+Solution: Skip the test.
+Files: src/testdir/test_restricted.vim
+
+Patch 8.1.0886
+Problem: Compiler warning for adding to NULL pointer and a condition that
+ is always true.
+Solution: Check for NULL pointer before adding. Remove useless "if".
+ (Friedirch, closes #3913)
+Files: src/dosinst.c, src/search.c
+
+Patch 8.1.0887
+Problem: The 'l' flag in :substitute is sticky.
+Solution: Reset the flag. (Dominique Pelle, closes #3925)
+Files: src/ex_cmds.c, src/testdir/test_substitute.vim
+
+Patch 8.1.0888
+Problem: The a: dict is not immutable as documented.
+Solution: Make the a:dict immutable, add a test. (Ozaki Kiichi, Yasuhiro
+ Matsumoto, closes #3929)
+Files: src/eval.c, src/userfunc.c, src/testdir/test_let.vim,
+ src/testdir/test_listdict.vim
+
+Patch 8.1.0889
+Problem: MS-Windows: a channel write may hang.
+Solution: Check for WriteFile() not writing anything. (Yasuhiro Matsumoto,
+ closes #3920)
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel_pipe.py
+
+Patch 8.1.0890
+Problem: Pty allocation wrong if using file for out channel and using null
+ for in channel and null for error channel.
+Solution: Correct using use_file_for_out in condition. (Ozaki Kiichi, closes
+ #3917)
+Files: src/os_unix.c, src/testdir/test_channel.vim
+
+Patch 8.1.0891
+Problem: Substitute command insufficiently tested.
+Solution: Add more test coverage. (Dominique Pelle)
+Files: src/testdir/test_substitute.vim
+
+Patch 8.1.0892
+Problem: Failure when closing a window when location list is in use.
+Solution: Handle the situation gracefully. Make sure memory for 'switchbuf'
+ is not freed at the wrong time. (Yegappan Lakshmanan,
+ closes #3928)
+Files: src/eval.c, src/evalfunc.c, src/proto/window.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim, src/window.c
+
+Patch 8.1.0893
+Problem: Terminal test is a bit flaky.
+Solution: Add test_terminal_no_cmd() to list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0894
+Problem: MS-Windows: resolve() does not return a reparse point.
+Solution: Improve resolve(). (Yasuhiro Matsumoto, closes #3896)
+Files: runtime/doc/eval.txt, src/buffer.c, src/evalfunc.c,
+ src/os_mswin.c, src/proto/os_mswin.pro,
+ src/testdir/test_functions.vim
+
+Patch 8.1.0895 (after 8.1.0879)
+Problem: MS-Windows: dealing with temp name encoding not quite right.
+Solution: Use more wide functions. (Ken Takata, closes #3921)
+Files: src/fileio.c
+
+Patch 8.1.0896
+Problem: Tests for restricted mode not run for MS-Windows GUI.
+Solution: Make tests also work in MS-Windows GUI.
+Files: src/testdir/test_restricted.vim
+
+Patch 8.1.0897
+Problem: Can modify a:000 when using a reference.
+Solution: Make check for locked variable stricter. (Ozaki Kiichi,
+ closes #3930)
+Files: src/dict.c, src/eval.c, src/evalfunc.c, src/proto/eval.pro,
+ src/testdir/test_channel.vim, src/testdir/test_let.vim,
+ src/userfunc.c
+
+Patch 8.1.0898
+Problem: A messed up rgb.txt can crash Vim. (Pavel Cheremushkin)
+Solution: Limit to 10000 entries. Also don't retry many times when the file
+ cannot be read.
+Files: src/term.c
+
+Patch 8.1.0899
+Problem: No need to check restricted mode for setwinvar().
+Solution: Remove check_restricted().
+Files: src/eval.c
+
+Patch 8.1.0900
+Problem: ConPTY may crash with 32-bit build.
+Solution: Fix function declarations. (Ken Takata, closes #3943)
+Files: src/terminal.c
+
+Patch 8.1.0901
+Problem: Index in getjumplist() may be wrong. (Epheien)
+Solution: Call cleanup_jumplist() earlier. (Yegappan Lakshmanan,
+ closes #3942)
+Files: src/evalfunc.c, src/testdir/test_jumplist.vim
+
+Patch 8.1.0902
+Problem: Incomplete set of assignment operators.
+Solution: Add /=, *= and %=. (Ozaki Kiichi, closes #3931)
+Files: runtime/doc/eval.txt src/eval.c src/testdir/test_vimscript.vim
+
+Patch 8.1.0903
+Problem: Struct uses more bytes than needed.
+Solution: Reorder members of regitem_S. (Dominique Pelle, closes #3936)
+Files: src/regexp.c
+
+Patch 8.1.0904
+Problem: USE_LONG_FNAME never defined.
+Solution: Remove using USE_LONG_FNAME. (Ken Takata, closes #3938)
+Files: src/buffer.c, src/ex_cmds.c, src/fileio.c
+
+Patch 8.1.0905
+Problem: Complicated regexp causes a crash. (Kuang-che Wu)
+Solution: Limit the recursiveness of addstate(). (closes #3941)
+Files: src/regexp_nfa.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.1.0906
+Problem: Using clumsy way to get console window handle.
+Solution: Use GetConsoleWindow(). (Ken Takata, closes #3940)
+Files: src/os_mswin.c
+
+Patch 8.1.0907
+Problem: CI tests on AppVeyor are failing.
+Solution: Reduce the recursiveness limit for regexp.
+Files: src/regexp_nfa.c
+
+Patch 8.1.0908
+Problem: Can't handle large value for %{nr}v in regexp. (Kuang-che Wu)
+Solution: Give an error if the value is too large. (closes #3948)
+Files: src/regexp_nfa.c
+
+Patch 8.1.0909
+Problem: MS-Windows: using ConPTY even though it is not stable.
+Solution: When ConPTY version is unstable, prefer using winpty. (Ken Takata,
+ closes #3949)
+Files: runtime/doc/options.txt, src/os_win32.c, src/proto/os_win32.pro,
+ src/terminal.c
+
+Patch 8.1.0910
+Problem: Crash with tricky search pattern. (Kuang-che Wu)
+Solution: Check for running out of memory. (closes #3950)
+Files: src/regexp_nfa.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.1.0911
+Problem: Tag line with Ex command cannot have extra fields.
+Solution: Recognize |;" as the end of the command. (closes #2402)
+Files: runtime/doc/tagsrch.txt, src/tag.c, src/testdir/test_taglist.vim
+
+Patch 8.1.0912
+Problem: MS-Windows: warning for signed/unsigned.
+Solution: Add type cast. (Nobuhiro Takasaki, closes #3945)
+Files: src/terminal.c
+
+Patch 8.1.0913
+Problem: CI crashes when running out of memory.
+Solution: Apply 'maxmempattern' also to new regexp engine.
+Files: src/regexp_nfa.c
+
+Patch 8.1.0914
+Problem: Code related to findfile() is spread out.
+Solution: Put findfile() related code into a new source file. (Yegappan
+ Lakshmanan, closes #3934)
+Files: Filelist, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_dice.mak, src/Make_ivc.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak,
+ src/Make_vms.mms, src/Makefile, src/README.txt, src/findfile.c,
+ src/misc1.c, src/misc2.c, src/proto.h, src/proto/findfile.pro,
+ src/proto/misc1.pro, src/proto/misc2.pro, src/proto/window.pro,
+ src/window.c
+
+Patch 8.1.0915
+Problem: fsync() may not work properly on Mac.
+Solution: Use fcntl() with F_FULLFSYNC. (suggested by Justin M. Keyes)
+Files: src/fileio.c, src/proto/fileio.pro, src/evalfunc.c, src/memfile.c
+
+Patch 8.1.0916
+Problem: With Python 3.7 "find_module" is not made available.
+Solution: Also add "find_module" with Python 3.7. (Joel Frederico,
+ closes #3954)
+Files: src/if_py_both.h
+
+Patch 8.1.0917
+Problem: Double free when running out of memory.
+Solution: Remove one free. (Ken Takata, closes #3955)
+Files: src/userfunc.c
+
+Patch 8.1.0918
+Problem: MS-Windows: startup messages are not converted.
+Solution: Convert messages when the current codepage differs from
+ 'encoding'. (Yasuhiro Matsumoto, closes #3914)
+Files: src/message.c, src/os_mswin.c, src/vim.h
+
+Patch 8.1.0919
+Problem: Compiler warnings.
+Solution: Add type casts. (Mike Williams)
+Files: src/message.c, src/regexp_nfa.c
+
+Patch 8.1.0920
+Problem: In Terminal-Normal mode job output messes up the window.
+Solution: Postpone scrolling and updating the buffer when in Terminal-Normal
+ mode.
+Files: src/terminal.c, src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_01.dump,
+ src/testdir/dumps/Test_terminal_02.dump,
+ src/testdir/dumps/Test_terminal_03.dump
+
+Patch 8.1.0921
+Problem: Terminal test sometimes fails; using memory after free.
+Solution: Fee memory a bit later. Add test to cover this. Disable flaky
+ screenshot test. (closes #3956)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0922
+Problem: Terminal scrollback test is flaky.
+Solution: Wait a bit before running the tail command.
+Files: src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_01.dump,
+ src/testdir/dumps/Test_terminal_02.dump,
+ src/testdir/dumps/Test_terminal_03.dump
+
+Patch 8.1.0923
+Problem: Terminal dump diff swap does not update file names.
+Solution: Also swap the file name. Add a test.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.0924
+Problem: Terminal scrollback test still flaky.
+Solution: Wait a bit longer before running the tail command.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0925
+Problem: Terminal scrollback test still still flaky.
+Solution: Explicitly set the shell. Disable ruler. (Ozaki Kiichi,
+ closes #3966)
+Files: src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_01.dump,
+ src/testdir/dumps/Test_terminal_02.dump,
+ src/testdir/dumps/Test_terminal_03.dump
+
+Patch 8.1.0926
+Problem: No test for :wnext, :wNext and :wprevious.
+Solution: Add a test. (Dominique Pelle, closes #3963)
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_wnext.vim
+
+Patch 8.1.0927
+Problem: USE_CR is never defined.
+Solution: Remove usage of USE_CR. (Ken Takata, closes #3958)
+Files: runtime/doc/options.txt, src/diff.c, src/evalfunc.c,
+ src/ex_cmds2.c, src/fileio.c, src/message.c, src/ops.c,
+ src/option.h, src/proto/ex_cmds2.pro, src/proto/fileio.pro,
+ src/tag.c
+
+Patch 8.1.0928 (after 8.1.0927)
+Problem: Stray log function call.
+Solution: Remove the log function call.
+Files: src/ex_cmds2.c
+
+Patch 8.1.0929
+Problem: No error when requesting ConPTY but it's not available.
+Solution: Add an error message. (Hirohito Higashi, closes #3967)
+Files: runtime/doc/terminal.txt, src/terminal.c
+
+Patch 8.1.0930
+Problem: Typo in Makefile.
+Solution: Change ABORT_CLFAGS to ABORT_CFLAGS. (Kuang-che Wu, closes #3977)
+Files: src/Makefile
+
+Patch 8.1.0931
+Problem: vtp_working included in GUI build but unused.
+Solution: Adjust #ifdefs. (Ken Takata, closes #3971)
+Files: src/os_win32.c
+
+Patch 8.1.0932
+Problem: Farsi support is outdated and unused.
+Solution: Delete the Farsi support.
+Files: Filelist, src/farsi.c, src/proto/farsi.pro, src/farsi.h, src/edit.c,
+ src/main.c, src/normal.c, src/option.c, src/getchar.c,
+ src/ex_cmds.c, src/search.c, src/ex_getln.c, src/charset.c,
+ src/evalfunc.c, src/screen.c, src/window.c, src/globals.h,
+ src/proto.h, farsi/README.txt, src/structs.h,
+ farsi/fonts/DOS/far-a01.com, farsi/fonts/SunOs/far-a01.fb,
+ farsi/fonts/UNIXs/far-a01.f16, farsi/fonts/UNIXs/far-a01.pcf.gz,
+ farsi/fonts/UNIXs/far-a01.pcf.Z, farsi/fonts/WINDOWS/far-a01.fon,
+ src/Makefile, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_dice.mak, src/Make_ivc.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak,
+ src/Make_vms.mms, src/configure.ac, src/auto/configure,
+ src/config.h.in, src/testdir/test_farsi.vim, src/version.c,
+ src/testdir/Make_all.mak, runtime/doc/options.txt,
+ runtime/doc/starting.txt, runtime/doc/quickref.txt,
+ runtime/doc/farsi.txt
+
+Patch 8.1.0933
+Problem: When using VTP scroll region isn't used properly.
+Solution: Make better use of the scroll region. (Nobuhiro Takasaki,
+ closes #3974)
+Files: src/os_win32.c, src/term.c
+
+Patch 8.1.0934
+Problem: Invalid memory access in search pattern. (Kuang-che Wu)
+Solution: Check for incomplete equivalence class. (closes #3970)
+Files: src/regexp.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.1.0935
+Problem: Old regexp engine may use invalid buffer for 'iskeyword' or
+ uninitialized buffer pointer. (Kuang-che Wu)
+Solution: Set rex.reg_buf when compiling the pattern. (closes #3972)
+Files: src/regexp.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.1.0936
+Problem: May leak memory when using 'vartabstop'. (Kuang-che Wu)
+Solution: Fix handling allocated memory for 'vartabstop'. (closes #3976)
+Files: src/option.c, src/buffer.c
+
+Patch 8.1.0937
+Problem: Invalid memory access in search pattern. (Kuang-che Wu)
+Solution: Check for incomplete collation element. (Dominique Pelle,
+ closes #3985)
+Files: src/regexp.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.1.0938
+Problem: Background color is wrong in MS-Windows console when not using VTP.
+Solution: Use g_attrCurrent. (Nobuhiro Takasaki, closes #3987)
+Files: src/os_win32.c
+
+Patch 8.1.0939
+Problem: No completion for sign group names.
+Solution: Add completion for sign group names and buffer names. (Yegappan
+ Lakshmanan, closes #3980)
+Files: src/sign.c, src/testdir/test_signs.vim
+
+Patch 8.1.0940
+Problem: MS-Windows console resizing not handled properly.
+Solution: Handle resizing the console better. (Nobuhiro Takasaki, Ken
+ Takata, closes #3968, closes #3611)
+Files: src/ex_docmd.c, src/normal.c, src/os_win32.c,
+ src/proto/os_win32.pro
+
+Patch 8.1.0941
+Problem: Macros for MS-Windows are inconsistent, using "32", "3264" and
+ others.
+Solution: Use MSWIN for all MS-Windows builds. Use FEAT_GUI_MSWIN for the
+ GUI build. (Hirohito Higashi, closes #3932)
+Files: src/GvimExt/gvimext.h, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_ivc.mak, src/Make_mvc.mak, src/beval.h, src/blowfish.c,
+ src/channel.c, src/edit.c, src/eval.c, src/evalfunc.c,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c,
+ src/feature.h, src/fileio.c, src/getchar.c, src/glbl_ime.cpp,
+ src/globals.h, src/gui.c, src/gui.h, src/gui_beval.c,
+ src/gui_gtk.c, src/gui_gtk_f.c, src/gui_gtk_x11.c,
+ src/if_cscope.c, src/if_cscope.h, src/if_lua.c, src/if_mzsch.c,
+ src/if_ole.cpp, src/if_perl.xs, src/if_python.c, src/if_python3.c,
+ src/if_ruby.c, src/if_tcl.c, src/macros.h, src/main.c,
+ src/mbyte.c, src/memfile.c, src/memline.c, src/menu.c,
+ src/message.c, src/misc1.c, src/misc2.c, src/nbdebug.c,
+ src/netbeans.c, src/normal.c, src/option.c, src/option.h,
+ src/os_mswin.c, src/os_unix.c, src/os_w32exe.c, src/os_win32.c,
+ src/os_win32.h, src/proto.h, src/screen.c, src/search.c,
+ src/structs.h, src/syntax.c, src/term.c, src/terminal.c, src/ui.c,
+ src/undo.c, src/version.c, src/vim.h, src/vim.rc, src/winclip.c
+
+Patch 8.1.0942
+Problem: Options window still checks for the multi_byte feature.
+Solution: Remove the unnecessary check. (Dominique Pelle, closes #3990)
+Files: runtime/optwin.vim
+
+Patch 8.1.0943
+Problem: Still a trace of Farsi support.
+Solution: Remove defining macros.
+Files: src/feature.h
+
+Patch 8.1.0944
+Problem: Format of nbdbg() arguments is not checked.
+Solution: Add format attribute. Fix reported problems. (Dominique Pelle,
+ closes #3992)
+Files: src/nbdebug.h, src/netbeans.c
+
+Patch 8.1.0945
+Problem: Internal error when using pattern with NL in the range.
+Solution: Use an actual newline for the range. (closes #3989) Also fix
+ error message. (Dominique Pelle)
+Files: src/regexp_nfa.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.1.0946
+Problem: Coveralls is not very useful.
+Solution: Remove Coveralls badge, add badge for packages.
+Files: README.md
+
+Patch 8.1.0947
+Problem: Using MSWIN before it is defined. (Cesar Romani)
+Solution: Move the block that uses MSWIN to below including vim.h. (Ken
+ Takata)
+Files: src/if_ruby.c
+
+Patch 8.1.0948
+Problem: When built without +eval "Vim --clean" produces errors. (James
+ McCoy)
+Solution: Do not enable filetype detection.
+Files: runtime/defaults.vim
+
+Patch 8.1.0949
+Problem: MS-Windows defines GUI macros different than other systems.
+Solution: Swap FEAT_GUI and FEAT_GUI_MSWIN. (Hirohito Higashi, closes #3996)
+Files: src/Make_bc5.mak, src/Make_cyg_ming.mak, src/Make_ivc.mak,
+ src/Make_mvc.mak, src/if_ole.cpp, src/vim.h, src/vim.rc
+
+Patch 8.1.0950
+Problem: Using :python sets 'pyxversion' even when not executed.
+Solution: Check the "skip" flag. (Shane Harper, closes #3995)
+Files: src/if_python.c, src/if_python3.c, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim
+
+Patch 8.1.0951
+Problem: Using WIN64 even though it is never defined.
+Solution: Only use _WIN64. (Ken Takata, closes #3997)
+Files: src/evalfunc.c
+
+Patch 8.1.0952
+Problem: Compilation warnings when building the MS-Windows installer.
+Solution: Fix buffer sizes. (Yasuhiro Matsumoto, closes #3999)
+Files: src/dosinst.c, src/dosinst.h, src/uninstal.c
+
+Patch 8.1.0953
+Problem: A very long file is truncated at 2^31 lines.
+Solution: Use LONG_MAX for MAXLNUM. (Dominique Pelle, closes #4011)
+Files: src/vim.h
+
+Patch 8.1.0954
+Problem: Arguments of semsg() and siemsg() are not checked.
+Solution: Add function prototype with __attribute__.
+Files: src/message.c, src/proto/message.pro, src/proto.h
+
+Patch 8.1.0955
+Problem: Matchit autoload directory not in installer. (Chris Morgan)
+Solution: Adjust the NSIS script. (Christian Brabandt, closes #4006)
+Files: nsis/gvim.nsi
+
+Patch 8.1.0956
+Problem: Using context:0 in 'diffopt' does not work well.
+Solution: Make zero context do the same as one line context. (closes #4005)
+Files: src/diff.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_06.0.dump,
+ src/testdir/dumps/Test_diff_06.1.dump,
+ src/testdir/dumps/Test_diff_06.2.dump
+
+Patch 8.1.0957 (after 8.1.0915)
+Problem: Mac: fsync fails on network share.
+Solution: Check for ENOTSUP. (Yee Cheng Chin, closes #4016)
+Files: src/fileio.c
+
+Patch 8.1.0958
+Problem: Compiling weird regexp pattern is very slow.
+Solution: When reallocating post list increase size by 50%. (Kuang-che Wu,
+ closes #4012) Make assert_inrange() accept float values.
+Files: src/regexp_nfa.c, src/eval.c, src/testdir/test_regexp_latin.vim,
+ src/testdir/test_assert.vim
+
+Patch 8.1.0959
+Problem: Sorting large numbers is not tested and does not work properly.
+Solution: Add test. Fix comparing lines with and without a number.
+ (Dominique Pelle, closes #4017)
+Files: src/ex_cmds.c, src/testdir/test_sort.vim
+
+Patch 8.1.0960
+Problem: When using ConPTY garbage collection has undefined behavior.
+Solution: Free the channel in a better way. (Nobuhiro Takasaki, closes #4020)
+Files: src/channel.c
+
+Patch 8.1.0961 (after 8.1.0957)
+Problem: Mac: fsync may fail sometimes.
+Solution: Do not check errno. (Yee Cheng Chin, closes #4025)
+Files: src/fileio.c
+
+Patch 8.1.0962
+Problem: Building with MinGW and static libs doesn't work. (Salman Halim)
+Solution: Add -lgcc. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.0963
+Problem: Illegal memory access when using 'incsearch'.
+Solution: Reset highlight_match when changing text. (closes #4022)
+Files: src/testdir/test_search.vim, src/misc1.c,
+ src/testdir/dumps/Test_incsearch_change_01.dump
+
+Patch 8.1.0964
+Problem: Cannot see in CI why a screenshot test failed.
+Solution: Add info about the failure.
+Files: src/testdir/screendump.vim
+
+Patch 8.1.0965
+Problem: Search test fails.
+Solution: Wait a bit longer for the 'ambiwidth' redraw.
+Files: src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_change_01.dump
+
+Patch 8.1.0966
+Problem: One terminal test is flaky.
+Solution: Add to list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.0967
+Problem: Stray dependency in test Makefile.
+Solution: Remove it. (Masato Nishihata, closes #4018)
+Files: src/testdir/Makefile
+
+Patch 8.1.0968
+Problem: Crash when using search pattern \%Ufffffc23.
+Solution: Limit character to INT_MAX. (closes #4009)
+Files: src/regexp_nfa.c, src/testdir/test_search.vim
+
+Patch 8.1.0969
+Problem: Message written during startup is truncated.
+Solution: Restore message after truncating. (closes #3969) Add a test.
+ (Yasuhiro Matsumoto)
+Files: src/message.c, src/testdir/test_startup.vim
+
+Patch 8.1.0970
+Problem: Text properties test fails when 'encoding' is not utf-8.
+Solution: Compare with original value of 'encoding'. (Christian Brabandt,
+ closes #3986)
+Files: src/testdir/runtest.vim, src/testdir/test_textprop.vim
+
+Patch 8.1.0971
+Problem: Failure for selecting quoted text object moves cursor.
+Solution: Restore the Visual selection on failure. (Christian Brabandt,
+ closes #4024)
+Files: src/search.c, src/testdir/test_textobjects.vim
+
+Patch 8.1.0972
+Problem: Cannot switch from terminal window to next tabpage.
+Solution: Make CTRL-W gt move to next tabpage.
+Files: src/window.c, src/testdir/test_terminal.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.1.0973
+Problem: Pattern with syntax error gives three error messages. (Kuang-che
+ Wu)
+Solution: Remove outdated internal error. Don't fall back to other engine
+ after an error.(closes #4035)
+Files: src/regexp_nfa.c, src/testdir/test_search.vim, src/regexp.c
+
+Patch 8.1.0974
+Problem: Cannot switch from terminal window to previous tabpage.
+Solution: Make CTRL-W gT move to previous tabpage.
+Files: src/window.c, src/testdir/test_terminal.vim,
+ runtime/doc/terminal.txt
+
+Patch 8.1.0975
+Problem: Using STRNCPY() wrongly. Warning for uninitialized variable.
+Solution: Use mch_memmove(). Initialize variable. (Yasuhiro Matsumoto,
+ closes #3979)
+Files: src/screen.c, src/textprop.c
+
+Patch 8.1.0976
+Problem: Dosinstall still has buffer overflow problems.
+Solution: Adjust buffer sizes. (Yasuhiro Matsumoto, closes #4002)
+Files: src/dosinst.c, src/dosinst.h, src/uninstal.c
+
+Patch 8.1.0977
+Problem: Blob not tested with Ruby.
+Solution: Add more test coverage. Fixes a crash. (Dominique Pelle,
+ closes #4036)
+Files: src/if_ruby.c, src/testdir/test_ruby.vim
+
+Patch 8.1.0978
+Problem: Blob not tested with Perl.
+Solution: Add more test coverage. Fixes a crash. (Dominique Pelle,
+ closes #4037)
+Files: src/if_perl.c, src/testdir/test_ruby.vim
+
+Patch 8.1.0979
+Problem: Compiler warning for unused functions. (Yasuhiro Matsumoto)
+Solution: Adjust #ifdef.
+Files: src/screen.c
+
+Patch 8.1.0980
+Problem: extend() insufficiently tested.
+Solution: Add more tests. (Dominique Pelle, closes #4040)
+Files: src/testdir/test_listdict.vim
+
+Patch 8.1.0981
+Problem: Pasting in terminal insufficiently tested.
+Solution: Add more tests. (Dominique Pelle, closes #4040)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.0982
+Problem: update_cursor() called twice in :shell.
+Solution: Remove one of the calls. (Yasuhiro Matsumoto, closes #4039)
+Files: src/terminal.c
+
+Patch 8.1.0983
+Problem: Checking __CYGWIN32__ unnecessarily.
+Solution: Remove the checks. (Ken Takata)
+Files: src/evalfunc.c, src/os_unix.c, src/os_win32.c
+
+Patch 8.1.0984
+Problem: Unnecessary #ifdefs.
+Solution: Remove the #ifdefs. (Ken Takata)
+Files: src/winclip.c
+
+Patch 8.1.0985
+Problem: Crash with large number in regexp. (Kuang-che Wu)
+Solution: Check for long becoming negative int. (closes #4042)
+Files: src/regexp.c, src/testdir/test_search.vim
+
+Patch 8.1.0986
+Problem: rename() is not properly tested.
+Solution: Add tests. (Dominique Pelle, closes #4061)
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_rename.vim
+
+Patch 8.1.0987
+Problem: Unnecessary condition in #ifdef.
+Solution: Remove using CYGWIN32. (Ken Takata)
+Files: src/os_unix.h, src/xxd/xxd.c
+
+Patch 8.1.0988
+Problem: Deleting a location list buffer breaks location list window
+ functionality.
+Solution: (Yegappan Lakshmanan, closes #4056)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.0989
+Problem: Various small code ugliness.
+Solution: Remove pointless NULL checks. Fix function calls. Fix typos.
+ (Dominique Pelle, closes #4060)
+Files: src/buffer.c, src/crypt.c, src/evalfunc.c, src/ex_cmds2.c,
+ src/globals.h, src/gui_gtk_f.c, src/gui_gtk_x11.c, src/gui_mac.c,
+ src/ops.c, src/option.h, src/os_unix.c, src/os_win32.c,
+ src/popupmnu.c, src/regexp.c, src/ui.c, src/version.c
+
+Patch 8.1.0990
+Problem: Floating point exception with "%= 0" and "/= 0".
+Solution: Avoid dividing by zero. (Dominique Pelle, closes #4058)
+Files: src/eval.c, src/testdir/test_vimscript.vim
+
+Patch 8.1.0991
+Problem: Cannot build with FEAT_EVAL defined and FEAT_SEARCH_EXTRA
+ undefined, and with FEAT_DIFF defined and FEAT_EVAL undefined.
+Solution: Add a couple of #ifdefs. (closes #4067)
+Files: src/diff.c, src/search.c
+
+Patch 8.1.0992
+Problem: A :normal command while executing a register resets the
+ reg_executing() result.
+Solution: Save and restore reg_executing. (closes #4066)
+Files: src/ex_docmd.c, src/structs.h, src/testdir/test_functions.vim
+
+Patch 8.1.0993
+Problem: ch_read() may return garbage if terminating NL is missing.
+Solution: Add terminating NUL. (Ozaki Kiichi, closes #4065)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 8.1.0994
+Problem: Relative cursor position is not calculated correctly.
+Solution: Always set topline, also when window is one line only.
+ (Robert Webb) Add more info to getwininfo() for testing.
+Files: src/window.c, src/evalfunc.c, runtime/doc/eval.txt,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.1.0995
+Problem: A getchar() call while executing a register resets the
+ reg_executing() result.
+Solution: Save and restore reg_executing. (closes #4066)
+Files: src/evalfunc.c, src/testdir/test_functions.vim
+
+Patch 8.1.0996 (after 8.1.0994)
+Problem: A few screendump tests fail because of scrolling.
+Solution: Update the screendumps.
+Files: src/testdir/dumps/Test_incsearch_substitute_11.dump,
+ src/testdir/dumps/Test_incsearch_substitute_12.dump,
+ src/testdir/dumps/Test_incsearch_substitute_13.dump
+
+Patch 8.1.0997
+Problem: Using GUI colors in vim.exe when 'termguicolors' is off.
+Solution: Add condition for 'termguicolors' set. (Ken Takata, closes #4078)
+Files: src/os_win32.c
+
+Patch 8.1.0998
+Problem: getcurpos() unexpectedly changes "curswant".
+Solution: Save and restore "curswant". (closes #4069)
+Files: src/evalfunc.c, src/testdir/test_visual.vim
+
+Patch 8.1.0999
+Problem: Use register one too often and not properly tested.
+Solution: Do not always use register one when specifying a register.
+ (closes #4085) Add more tests.
+Files: src/ops.c, src/testdir/test_registers.vim
+
+Patch 8.1.1000
+Problem: Indenting is off.
+Solution: Make indenting consistent and update comments. (Ozaki Kiichi,
+ closes #4079)
+Files: src/getchar.c, src/ops.c
+
+Patch 8.1.1001
+Problem: Visual area not correct when using 'cursorline'.
+Solution: Update w_last_cursorline also in Visual mode. (Hirohito Higashi,
+ closes #4086)
+Files: src/screen.c, src/testdir/test_highlight.vim,
+ src/testdir/dumps/Test_cursorline_with_visualmode_01.dump
+
+Patch 8.1.1002
+Problem: "gf" does not always work when URL has a port number. (Jakob
+ Schöttl)
+Solution: When a URL is recognized also accept ":". (closes #4082)
+Files: src/findfile.c, src/testdir/test_gf.vim
+
+Patch 8.1.1003
+Problem: Playing back recorded key sequence mistakes key code.
+Solution: Insert a <Nop> after the <Esc>. (closes #4068)
+Files: src/getchar.c, src/testdir/test_registers.vim
+
+Patch 8.1.1004
+Problem: Function "luaV_setref()" not covered with tests.
+Solution: Add a test. (Dominique Pelle, closes #4089)
+Files: src/testdir/test_lua.vim
+
+Patch 8.1.1005 (after 8.1.1003)
+Problem: Test fails because t_F2 is not set.
+Solution: Add try-catch.
+Files: src/testdir/test_registers.vim
+
+Patch 8.1.1006
+Problem: Repeated code in quickfix support.
+Solution: Move code to functions. (Yegappan Lakshmanan, closes #4091)
+Files: src/quickfix.c
+
+Patch 8.1.1007
+Problem: Using closure may consume a lot of memory.
+Solution: unreference items that are no longer needed. Add a test. (Ozaki
+ Kiichi, closes #3961)
+Files: src/testdir/Make_all.mak, src/testdir/test_memory_usage.vim,
+ src/userfunc.c
+
+Patch 8.1.1008
+Problem: MS-Windows: HAVE_STDINT_H only defined for non-debug version.
+Solution: Move definition of HAVE_STDINT_H up. (Taro Muraoka, closes #4109)
+Files: src/Make_mvc.mak
+
+Patch 8.1.1009
+Problem: MS-Windows: some text is not baseline aligned.
+Solution: Use bottom alignment. (Taro Muraoka, closes #4116, closes #1520)
+Files: src/gui_dwrite.cpp
+
+Patch 8.1.1010
+Problem: Lua interface leaks memory.
+Solution: Clear typeval after copying it.
+Files: src/if_lua.c
+
+Patch 8.1.1011
+Problem: Indent from autoindent not removed from blank line. (Daniel Hahler)
+Solution: Do not reset did_ai when text follows. (closes #4119)
+Files: src/misc1.c, src/testdir/test_edit.vim
+
+Patch 8.1.1012
+Problem: Memory leak with E461.
+Solution: Clear the typeval. (Dominique Pelle, closes #4111)
+Files: src/eval.c
+
+Patch 8.1.1013
+Problem: MS-Windows: Scrolling fails when dividing the screen.
+Solution: Position the cursor before calling ScrollConsoleScreenBuffer().
+ (Nobuhiro Takasaki, closes #4115)
+Files: src/os_win32.c
+
+Patch 8.1.1014
+Problem: MS-Windows: /analyze only defined for non-debug version.
+Solution: Move adding of /analyze up. (Ken Takata, closes #4114)
+Files: src/Make_mvc.mak
+
+Patch 8.1.1015
+Problem: Quickfix buffer shows up in list, can't get buffer number.
+Solution: Make the quickfix buffer unlisted when the quickfix window is
+ closed. get the quickfix buffer number with getqflist().
+ (Yegappan Lakshmanan, closes #4113)
+Files: runtime/doc/eval.txt, runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim, src/window.c
+
+Patch 8.1.1016
+Problem: MS-Windows: No color in shell when using "!" in 'guioptions'.
+Solution: Don't stop termcap when using a terminal window for the shell.
+ (Nobuhiro Takasaki, vim-jp, closes #4117)
+Files: src/ex_cmds.c
+
+Patch 8.1.1017
+Problem: Off-by-one error in filetype detection.
+Solution: Also check the last line of the file.
+Files: runtime/autoload/dist/ft.vim
+
+Patch 8.1.1018
+Problem: Window cleared when entering Terminal-Normal twice. (Epheien)
+Solution: Don't cleanup scrollback when there is no postponed scrollback.
+ (Christian Brabandt, closes #4126)
+Files: src/terminal.c
+
+Patch 8.1.1019
+Problem: Lua: may garbage collect function reference in use.
+Solution: Keep the function name instead of the typeval. Make luaV_setref()
+ handle funcref objects. (Ozaki Kiichi, closes #4127)
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.1.1020
+Problem: Compiler warning for Python3 interface.
+Solution: Add type cast. (Ozaki Kiichi, closes #4128, closes #4103)
+Files: src/if_python3.c
+
+Patch 8.1.1021
+Problem: pyeval() and py3eval() leak memory.
+Solution: Do not increase the reference count twice. (Ozaki Kiichi,
+ closes #4129)
+Files: src/if_python.c, src/if_python3.c
+
+Patch 8.1.1022
+Problem: May use NULL pointer when out of memory. (Coverity)
+Solution: Check for blob_alloc() returning NULL.
+Files: src/blob.c
+
+Patch 8.1.1023
+Problem: May use NULL pointer when indexing a blob. (Coverity)
+Solution: Break out of loop after using index on blob
+Files: src/eval.c
+
+Patch 8.1.1024
+Problem: Stray log calls in terminal code. (Christian Brabandt)
+Solution: Remove the calls.
+Files: src/terminal.c
+
+Patch 8.1.1025
+Problem: Checking NULL pointer after addition. (Coverity)
+Solution: First check for NULL, then add the column.
+Files: src/regexp.c
+
+Patch 8.1.1026
+Problem: Unused condition. (Coverity)
+Solution: Remove the condition. Also remove unused #define.
+Files: src/move.c
+
+Patch 8.1.1027
+Problem: Memory usage test sometimes fails.
+Solution: Use 80% of before.last as the lower limit. (Christian Brabandt)
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.1.1028
+Problem: MS-Windows: memory leak when creating terminal fails.
+Solution: Free the command. (Ken Takata, closes #4138)
+Files: src/os_win32.c
+
+Patch 8.1.1029
+Problem: DirectWrite doesn't take 'linespace' into account.
+Solution: Include 'linespace' in the position. (Ken Takata, closes #4137)
+Files: src/gui_dwrite.cpp, src/gui_w32.c
+
+Patch 8.1.1030
+Problem: Quickfix function arguments are inconsistent.
+Solution: Pass a list pointer instead of info and index. (Yegappan
+ Lakshmanan, closes #4135)
+Files: src/quickfix.c
+
+Patch 8.1.1031
+Problem: Memory usage test may still fail.
+Solution: Drop the unused min value. (Christian Brabandt)
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.1.1032
+Problem: Warnings from clang static analyzer. (Yegappan Lakshmanan)
+Solution: Fix relevant warnings.
+Files: src/arabic.c, src/edit.c, src/eval.c, src/fileio.c, src/normal.c,
+ src/option.c, src/os_unix.c, src/regexp.c, src/screen.c,
+ src/channel.c, src/charset.c, src/message.c
+
+Patch 8.1.1033
+Problem: Memory usage test may still fail on some systems. (Elimar
+ Riesebieter)
+Solution: Increase tolerance from 1% to 3%.
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.1.1034
+Problem: Too many #ifdefs.
+Solution: Merge FEAT_MOUSE_SGR into FEAT_MOUSE_XTERM / FEAT_MOUSE_TTY.
+Files: src/evalfunc.c, src/misc2.c, src/os_unix.c, src/term.c,
+ src/version.c, src/feature.h
+
+Patch 8.1.1035
+Problem: prop_remove() second argument is not optional.
+Solution: Fix argument count. Use "buf" instead of "curbuf". (closes #4147)
+Files: src/evalfunc.c, src/testdir/test_textprop.vim, src/textprop.c
+
+Patch 8.1.1036
+Problem: Quickfix function arguments are inconsistent.
+Solution: Pass a list pointer to more functions. (Yegappan Lakshmanan,
+ closes #4149)
+Files: src/quickfix.c
+
+Patch 8.1.1037
+Problem: Memory usage test may still fail on some systems.
+Solution: Increase tolerance from 3% to 20%.
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.1.1038
+Problem: Arabic support excludes Farsi.
+Solution: Add Farsi support to the Arabic support. (Ali Gholami Rudi,
+ Ameretat Reith)
+Files: Filelist, src/arabic.c, src/arabic.h, src/globals.h, src/macros.h,
+ src/mbyte.c, src/proto/arabic.pro, src/proto/mbyte.pro,
+ src/Makefile, src/testdir/test_arabic.vim
+
+Patch 8.1.1039
+Problem: MS-Windows build fails.
+Solution: Remove dependency on arabic.h
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Make_vms.mms
+
+Patch 8.1.1040
+Problem: FEAT_TAG_ANYWHITE is not enabled in any build.
+Solution: Remove the feature.
+Files: src/feature.h, src/tag.c, src/evalfunc.c, src/version.c,
+ src/Make_vms.mms
+
+Patch 8.1.1041
+Problem: Test for Arabic no longer needed.
+Solution: Remove the test for something that was intentionally left out.
+Files: src/testdir/test_arabic.vim
+
+Patch 8.1.1042
+Problem: The paste test doesn't work properly in the Windows console.
+Solution: Disable the test.
+Files: src/testdir/test_paste.vim
+
+Patch 8.1.1043
+Problem: Lua interface does not support Blob.
+Solution: Add support to Blob. (Ozaki Kiichi, closes #4151)
+Files: runtime/doc/if_lua.txt, src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.1.1044
+Problem: No way to check the reference count of objects.
+Solution: Add test_refcount(). (Ozaki Kiichi, closes #4124)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_vimscript.vim
+
+Patch 8.1.1045
+Problem: E315 ml_get error when using Python and hidden buffer.
+Solution: Make sure the cursor position is valid. (Ben Jackson,
+ closes #4153, closes #4154)
+Files: src/if_py_both.h, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim
+
+Patch 8.1.1046
+Problem: the "secure" variable is used inconsistently. (Justin M. Keyes)
+Solution: Set it to one instead of incrementing.
+Files: src/buffer.c, src/option.c
+
+Patch 8.1.1047
+Problem: WINCH signal is not tested.
+Solution: Add a test. (Dominique Pelle, closes #4158)
+Files: src/testdir/Make_all.mak, src/testdir/test_signals.vim
+
+Patch 8.1.1048
+Problem: Minor issues with tests.
+Solution: Delete unused test OK file. Add missing entries in list of tests.
+ Fix readme file. (Masato Nishihata, closes #4160)
+Files: src/testdir/test85.ok, src/testdir/Make_all.mak,
+ src/testdir/README.txt
+
+Patch 8.1.1049
+Problem: When user tries to exit with CTRL-C message is confusing.
+Solution: Only mention ":qa!" when there is a changed buffer. (closes #4163)
+Files: src/undo.c, src/proto/undo.pro, src/normal.c,
+ src/testdir/test_normal.vim
+
+Patch 8.1.1050
+Problem: Blank screen when DirectWrite failed.
+Solution: Call redraw_later_clear() after recreating the Direct2D render
+ target. (Ken Takata, closes #4172)
+Files: src/gui_dwrite.cpp
+
+Patch 8.1.1051
+Problem: Not all ways to switch terminal mode are tested.
+Solution: Add more test cases.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.1052
+Problem: test for CTRL-C message sometimes fails
+Solution: Make sure there are no changed buffers.
+Files: src/testdir/test_normal.vim
+
+Patch 8.1.1053
+Problem: Warning for missing return statement. (Dominique Pelle)
+Solution: Add return statement.
+Files: src/undo.c
+
+Patch 8.1.1054
+Problem: Not checking return value of ga_grow(). (Coverity)
+Solution: Only append when ga_grow() returns OK.
+Files: src/if_lua.c
+
+Patch 8.1.1055
+Problem: CTRL-G U in Insert mode doesn't work to avoid splitting the undo
+ sequence for shift-left and shift-right.
+Solution: Also check dont_sync_undo for shifted cursor keys. (Christian
+ Brabandt)
+Files: src/edit.c, src/testdir/test_mapping.vim
+
+Patch 8.1.1056
+Problem: No eval function for Ruby.
+Solution: Add rubyeval(). (Ozaki Kiichi, closes #4152)
+Files: runtime/doc/eval.txt, runtime/doc/if_ruby.txt, src/evalfunc.c,
+ src/if_ruby.c, src/proto/if_ruby.pro, src/testdir/test_ruby.vim
+
+Patch 8.1.1057
+Problem: Nsis config is too complicated.
+Solution: Use "File /r" for the macros and pack directories. (Ken Takata,
+ closes #4169)
+Files: nsis/gvim.nsi
+
+Patch 8.1.1058
+Problem: Memory usage test may still fail on some systems.
+Solution: Use 98% of the lower limit. (Christian Brabandt)
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.1.1059
+Problem: MS-Windows: PlatformId() is called unnecessarily.
+Solution: Remove calls to PlatformId(). (Ken Takata, closes #4170)
+Files: src/os_win32.c
+
+Patch 8.1.1060
+Problem: MS-Windows: get_cmd_args() is no longer needed, get_cmd_argsW() is
+ always used.
+Solution: Remove get_cmd_args(). (Ken Takata, closes #4171)
+Files: src/gui_w32.c, src/os_w32exe.c
+
+Patch 8.1.1061
+Problem: When substitute string throws error, substitute happens anyway.
+Solution: Skip substitution when aborting. (closes #4161)
+Files: src/ex_cmds.c, src/testdir/test_substitute.vim
+
+Patch 8.1.1062
+Problem: Quickfix code is repeated.
+Solution: Define FOR_ALL_QFL_ITEMS(). Move some code to separate functions.
+ (Yegappan Lakshmanan, closes #4166)
+Files: src/quickfix.c
+
+Patch 8.1.1063
+Problem: Insufficient testing for wildmenu completion.
+Solution: Extend the test case. (Dominique Pelle, closes #4182)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.1.1064
+Problem: No test for output conversion in the GTK GUI.
+Solution: Add a simplistic test.
+Files: src/testdir/test_gui.vim
+
+Patch 8.1.1065
+Problem: No test for using and deleting menu in the GUI.
+Solution: Add a test.
+Files: src/testdir/test_gui.vim
+
+Patch 8.1.1066
+Problem: VIMDLL isn't actually used.
+Solution: Remove VIMDLL support.
+Files: src/gui_w32.c, src/main.c, src/os_w32exe.c, src/Make_bc5.mak,
+ src/os_w32dll.c
+
+Patch 8.1.1067
+Problem: Issues added on github are unstructured.
+Solution: Add a bug and feature request template. (Ken Takata, closes #4183)
+Files: .github/ISSUE_TEMPLATE/feature_request.md,
+ .github/ISSUE_TEMPLATE/bug_report.md
+
+Patch 8.1.1068
+Problem: Cannot get all the information about current completion.
+Solution: Add complete_info(). (Shougo, Hirohito Higashi, closes #4106)
+Files: runtime/doc/eval.txt, runtime/doc/insert.txt,
+ runtime/doc/usr_41.txt, src/edit.c, src/evalfunc.c,
+ src/proto/edit.pro, src/testdir/test_popup.vim
+
+Patch 8.1.1069
+Problem: Source README file doesn't look nice on github.
+Solution: Turn it into markdown, still readable as plain text.
+ (WenxuanHuang, closes #4141)
+Files: src/README.txt, src/README.md, Filelist
+
+Patch 8.1.1070
+Problem: Issue templates are not good enough.
+Solution: Rephrase to anticipate unexperienced users.
+Files: .github/ISSUE_TEMPLATE/feature_request.md,
+ .github/ISSUE_TEMPLATE/bug_report.md
+
+Patch 8.1.1071
+Problem: Cannot get composing characters from the screen.
+Solution: Add screenchars() and screenstring(). (partly by Ozaki Kiichi,
+ closes #4059)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/testdir/test_utf8.vim, src/testdir/view_util.vim
+
+Patch 8.1.1072
+Problem: Extending sign and foldcolumn below the text is confusing.
+Solution: Let the sign and foldcolumn stop at the last text line, just like
+ the line number column. Also stop the command line window leader.
+ (Christian Brabandt, closes #3964)
+Files: src/screen.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_of_diff_01.dump,
+ src/testdir/dumps/Test_diff_01.dump,
+ src/testdir/dumps/Test_diff_02.dump,
+ src/testdir/dumps/Test_diff_03.dump,
+ src/testdir/dumps/Test_diff_04.dump,
+ src/testdir/dumps/Test_diff_05.dump,
+ src/testdir/dumps/Test_diff_06.dump,
+ src/testdir/dumps/Test_diff_06.0.dump,
+ src/testdir/dumps/Test_diff_06.1.dump,
+ src/testdir/dumps/Test_diff_06.2.dump,
+ src/testdir/dumps/Test_diff_10.dump,
+ src/testdir/dumps/Test_diff_11.dump,
+ src/testdir/dumps/Test_diff_12.dump,
+ src/testdir/dumps/Test_diff_13.dump,
+ src/testdir/dumps/Test_diff_14.dump,
+ src/testdir/dumps/Test_diff_15.dump,
+ src/testdir/dumps/Test_diff_16.dump,
+ src/testdir/dumps/Test_diff_17.dump,
+ src/testdir/dumps/Test_diff_18.dump,
+ src/testdir/dumps/Test_diff_19.dump,
+ src/testdir/dumps/Test_diff_20.dump,
+ src/testdir/dumps/Test_diff_with_cursorline_01.dump,
+ src/testdir/dumps/Test_diff_with_cursorline_02.dump,
+ src/testdir/dumps/Test_diff_with_cursorline_03.dump,
+ src/testdir/dumps/Test_folds_with_rnu_01.dump,
+ src/testdir/dumps/Test_folds_with_rnu_02.dump
+
+Patch 8.1.1073
+Problem: Space in number column is on wrong side with 'rightleft' set.
+Solution: Move the space to the text side. Add a test.
+Files: src/screen.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_of_diff_02.dump
+
+Patch 8.1.1074
+Problem: Python test doesn't wipe out hidden buffer.
+Solution: Wipe out the buffer. (Ben Jackson, closes #4189)
+Files: src/testdir/test_python2.vim, src/testdir/test_python3.vim
+
+Patch 8.1.1075
+Problem: Function reference count wrong in Python code.
+Solution: Use "O" instead of "N" for the arguments. (Ben Jackson,
+ closes #4188)
+Files: src/if_py_both.h
+
+Patch 8.1.1076
+Problem: File for Insert mode is much too big.
+Solution: Split off the code for Insert completion. (Yegappan Lakshmanan,
+ closes #4044)
+Files: Filelist, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_dice.mak, src/Make_ivc.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak,
+ src/Make_vms.mms, src/Makefile, src/edit.c, src/evalfunc.c,
+ src/globals.h, src/insexpand.c, src/misc2.c, src/proto.h,
+ src/proto/edit.pro, src/proto/insexpand.pro, src/search.c,
+ src/spell.c, src/structs.h, src/tag.c, src/vim.h
+
+Patch 8.1.1077
+Problem: reg_executing() is reset by calling input().
+Solution: Implement a more generic way to save and restore reg_executing.
+ (Ozaki Kiichi, closes #4192)
+Files: src/evalfunc.c, src/ex_docmd.c, src/testdir/test_functions.vim
+
+Patch 8.1.1078
+Problem: When 'listchars' is set a composing char on a space is wrong.
+Solution: Separate handling a non-breaking space and a space. (Yasuhiro
+ Matsumoto, closes #4046)
+Files: src/screen.c, src/testdir/test_listchars.vim
+
+Patch 8.1.1079
+Problem: No need for a separate ScreenLinesUtf8() test function.
+Solution: Get the composing characters with ScreenLines().
+Files: src/testdir/view_util.vim, src/testdir/test_listchars.vim,
+ src/testdir/test_utf8.vim
+
+Patch 8.1.1080
+Problem: When a screendump test fails, moving the file is a hassle.
+Solution: Instead of appending ".failed" to the file name, keep the same
+ file name but put the screendump in the "failed" directory.
+ Then the file name only needs to be typed once when moving a
+ screendump.
+Files: src/testdir/screendump.vim
+
+Patch 8.1.1081
+Problem: MS-Windows: cannot use fonts whose name cannot be represented in
+ the current code page.
+Solution: Use wide font functions. (Ken Takata, closes #4000)
+Files: src/gui_w32.c, src/os_mswin.c, src/proto/gui_w32.pro,
+ src/proto/os_mswin.pro
+
+Patch 8.1.1082
+Problem: "Conceal" match is mixed up with 'hlsearch' match.
+Solution: Check that a match is found, not a 'hlsearch' item. (Andy
+ Massimino, closes #4073)
+Files: src/screen.c
+
+Patch 8.1.1083
+Problem: MS-Windows: hang when opening a file on network share.
+Solution: Avoid using FindFirstFile(), use GetLongPathNameW(). (Ken Takata,
+ closes #3923)
+Files: src/os_win32.c
+
+Patch 8.1.1084
+Problem: Cannot delete a match from another window. (Paul Jolly)
+Solution: Add window ID argument to matchdelete(), clearmatches(),
+ getmatches() and setmatches(). (Andy Massimino, closes #4178)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_match.vim
+
+Patch 8.1.1085
+Problem: Compiler warning for possibly uninitialized variable. (Tony
+ Mechelynck)
+Solution: Make conditions more logical.
+Files: src/arabic.c
+
+Patch 8.1.1086
+Problem: Too many curly braces.
+Solution: Remove curly braces where they are not needed. (Hirohito Higashi,
+ closes #3982)
+Files: src/autocmd.c, src/buffer.c, src/crypt_zip.c, src/dosinst.c,
+ src/edit.c, src/insexpand.c, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/ex_getln.c, src/getchar.c, src/gui.c,
+ src/gui_gtk.c, src/gui_mac.c, src/gui_motif.c, src/gui_photon.c,
+ src/gui_w32.c, src/gui_x11.c, src/if_mzsch.c, src/if_python3.c,
+ src/if_ruby.c, src/if_tcl.c, src/indent.c, src/libvterm/src/pen.c,
+ src/macros.h, src/memline.c, src/menu.c, src/misc1.c, src/move.c,
+ src/netbeans.c, src/normal.c, src/ops.c, src/option.c,
+ src/os_mswin.c, src/os_qnx.c, src/os_unix.c, src/os_win32.c,
+ src/regexp_nfa.c, src/screen.c, src/spell.c, src/terminal.c
+
+Patch 8.1.1087
+Problem: tag stack is incorrect after CTRL-T and then :tag
+Solution: Handle DT_TAG differently. (test by Andy Massimino, closes #3944,
+ closes #4177)
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.1.1088
+Problem: Height of quickfix window not retained with vertical split.
+Solution: Use frame_fixed_height() and frame_fixed_width(). (Hongbo Liu,
+ closes #4013, closes #2998)
+Files: src/testdir/test_winbuf_close.vim, src/window.c
+
+Patch 8.1.1089
+Problem: Tutor does not check $LC_MESSAGES.
+Solution: Let $LC_MESSAGES overrule $LANG. (Miklos Vajna, closes #4112)
+Files: runtime/tutor/tutor.vim
+
+Patch 8.1.1090
+Problem: MS-Windows: modify_fname() has problems with some 'encoding'.
+Solution: Use GetLongPathNameW() instead of GetLongPathName(). (Ken Takata,
+ closes #4007)
+Files: src/eval.c
+
+Patch 8.1.1091
+Problem: MS-Windows: cannot use multibyte chars in environment var.
+Solution: Use the wide API. (Ken Takata, closes #4008)
+Files: src/misc1.c, src/testdir/test_let.vim
+
+Patch 8.1.1092
+Problem: Setting 'guifont' when maximized resizes the Vim window. When
+ 'guioptions' contains "k" gvim may open with a tiny window.
+Solution: Avoid un-maximizing when setting 'guifont'. (Yee Cheng Chin,
+ closes #3808)
+Files: src/gui.c
+
+Patch 8.1.1093
+Problem: Support for outdated tags format slows down tag parsing.
+Solution: Remove FEAT_TAG_OLDSTATIC.
+Files: runtime/doc/tagsrch.txt, src/feature.h, src/tag.c, src/version.c
+
+Patch 8.1.1094
+Problem: Long line in tags file causes error.
+Solution: Check for overlong line earlier. (Andy Massimino, closes #4051,
+ closes #4084)
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.1.1095
+Problem: MS-Windows: executable() fails on very long filename.
+Solution: Use much bigger buffer. (Ken Takata, closes #4015)
+Files: src/os_win32.c, src/testdir/test_functions.vim
+
+Patch 8.1.1096
+Problem: MS-Windows: cannot distinguish BS and CTRL-H.
+Solution: Add code for VK_BACK. (Linwei, closes #1833)
+Files: src/term.c, src/os_win32.c
+
+Patch 8.1.1097 (after 8.1.1092)
+Problem: Motif build fails. (Paul Jolly)
+Solution: Only use gui_mch_maximized() for MS-Windows. (closes #4194)
+Files: src/gui.c
+
+Patch 8.1.1098
+Problem: Quickfix code duplication.
+Solution: Refactor the qf_init_ext() function. (Yegappan Lakshmanan,
+ closes #4193)
+Files: src/README.md, src/quickfix.c
+
+Patch 8.1.1099
+Problem: The do_tag() function is too long.
+Solution: Factor parts out to separate functions. Move simplify_filename()
+ to a file where it fits better. (Andy Massimino, closes #4195)
+Files: src/tag.c, src/proto/tag.pro, src/findfile.c,
+ src/proto/findfile.pro
+
+Patch 8.1.1100
+Problem: Tag file without trailing newline no longer works. (Marco Hinz)
+Solution: Don't expect a newline at the end of the file. (closes #4200)
+Files: src/tag.c, src/testdir/test_taglist.vim
+
+Patch 8.1.1101
+Problem: Signals test may fail in the GUI.
+Solution: Skip the test for the GUI. (Yee Checng Chin, closes #4202)
+Files: src/testdir/test_signals.vim
+
+Patch 8.1.1102
+Problem: Win32 exe file contains unused code.
+Solution: Remove unused #ifdefs and code. (Ken Takata, closes #4198)
+Files: src/os_w32exe.c
+
+Patch 8.1.1103
+Problem: MS-Windows: old API calls are no longer needed.
+Solution: Always use the wide functions. (Ken Takata, closes #4199)
+Files: src/glbl_ime.cpp, src/globals.h, src/gui_w32.c, src/misc1.c,
+ src/os_mswin.c, src/os_win32.c, src/vim.h,
+
+Patch 8.1.1104
+Problem: MS-Windows: not all environment variables can be used.
+Solution: Use the wide version of WinMain() and main(). (Ken Takata,
+ closes #4206)
+Files: src/Make_cyg.mak, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/main.c, src/os_w32exe.c
+
+Patch 8.1.1105
+Problem: Long escape sequences may be split up.
+Solution: Assume escape sequences can be up to 80 bytes long. (Nobuhiro
+ Takasaki, closes #4196)
+Files: src/term.c
+
+Patch 8.1.1106
+Problem: No test for 'writedelay'.
+Solution: Add a test.
+Files: src/testdir/test_options.vim
+
+Patch 8.1.1107
+Problem: No test for 'visualbell'.
+Solution: Add a test.
+Files: src/testdir/test_options.vim
+
+Patch 8.1.1108
+Problem: Test for 'visualbell' doesn't work.
+Solution: Make 'belloff' empty.
+Files: src/testdir/test_options.vim
+
+Patch 8.1.1109
+Problem: Deleted file still in list of distributed files.
+Solution: Remove the src/os_w32dll.c entry.
+Files: Filelist
+
+Patch 8.1.1110
+Problem: Composing chars on space wrong when 'listchars' is set.
+Solution: Do not use "space" and "nbsp" entries of 'listchars' when there is
+ a composing character. (Yee Cheng Chin, closes #4197)
+Files: src/screen.c, src/testdir/test_listchars.vim
+
+Patch 8.1.1111
+Problem: It is not easy to check for infinity.
+Solution: Add isinf(). (Ozaki Kiichi, closes #3787)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_float_func.vim
+
+Patch 8.1.1112
+Problem: Duplicate code in quickfix file.
+Solution: Move code into functions. (Yegappan Lakshmanan, closes #4207)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.1113
+Problem: Making an autocommand trigger once is not so easy.
+Solution: Add the ++once argument. Also add ++nested as an alias for
+ "nested". (Justin M. Keyes, closes #4100)
+Files: runtime/doc/autocmd.txt, src/autocmd.c,
+ src/testdir/test_autocmd.vim, src/globals.h
+
+Patch 8.1.1114
+Problem: Confusing overloaded operator "." for string concatenation.
+Solution: Add ".." for string concatenation. Also "let a ..= b".
+Files: src/eval.c, src/testdir/test_eval_stuff.vim, runtime/doc/eval.txt
+
+Patch 8.1.1115
+Problem: Cannot build with older C compiler.
+Solution: Move variable declaration to start of block.
+Files: src/autocmd.c
+
+Patch 8.1.1116
+Problem: Cannot enforce a Vim script style.
+Solution: Add the :scriptversion command. (idea by Yasuhiro Matsumoto,
+ closes #3857)
+Files: runtime/doc/repeat.txt, runtime/doc/eval.txt, src/eval.c,
+ src/ex_cmds.h, src/evalfunc.c, src/ex_cmds2.c,
+ src/proto/ex_cmds2.pro, src/structs.h, src/buffer.c, src/main.c,
+ src/option.c, src/ex_cmdidxs.h, src/testdir/test_eval_stuff.vim
+
+Patch 8.1.1117
+Problem: Build failure without the +eval feature.
+Solution: Add #ifdef.
+Files: src/ex_cmds2.c
+
+Patch 8.1.1118
+Problem: A couple of conditions are hard to understand.
+Solution: Split the conditions into pieces. (Ozaki Kiichi, closes #3879)
+Files: src/getchar.c, src/os_unix.c
+
+Patch 8.1.1119
+Problem: No support for Windows on ARM64.
+Solution: Add ARM64 support (Leendert van Doorn)
+Files: src/GvimExt/Makefile, src/Make_mvc.mak, src/dosinst.c,
+ src/xpm/arm64/lib-vc14/libXpm.lib, Filelist, src/INSTALLpc.txt
+
+Patch 8.1.1120
+Problem: Cannot easily get directory entry matches.
+Solution: Add the readdir() function. (Yasuhiro Matsumoto, closes #2439)
+Files: runtime/doc/eval.txt, src/eval.c, src/evalfunc.c, src/misc1.c,
+ src/proto/eval.pro, src/testdir/test_functions.vim
+
+Patch 8.1.1121
+Problem: Test for term_gettitle() was disabled.
+Solution: Enable the test and bail out only when it doesn't work. (Dominique
+ Pelle, closes #3776)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.1122
+Problem: char2nr() does not handle composing characters.
+Solution: Add str2list() and list2str(). (Ozaki Kiichi, closes #4190)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/testdir/test_utf8.vim
+
+Patch 8.1.1123
+Problem: No way to avoid filtering for autocomplete function, causing
+ flickering of the popup menu.
+Solution: Add the "equal" field to complete items. (closes #3887)
+Files: runtime/doc/insert.txt, src/insexpand.c,
+ src/testdir/test_popup.vim
+
+Patch 8.1.1124
+Problem: Insert completion flags are mixed up.
+Solution: Clean up flags use of ins_compl_add() and cp_flags.
+Files: src/insexpand.c, src/proto/insexpand.pro, src/search.c, src/spell.c
+
+Patch 8.1.1125
+Problem: Libvterm does not handle the window position report.
+Solution: Let libvterm call the fallback CSI handler when not handling CSI
+ sequence. Handle the window position report in Vim.
+Files: src/libvterm/src/state.c, src/terminal.c, src/ui.c,
+ src/proto/ui.pro, src/evalfunc.c, src/testdir/test_terminal.vim
+
+Patch 8.1.1126
+Problem: Build failure with +terminal but without tgetent.
+Solution: Adjust #ifdef.
+Files: src/ui.c
+
+Patch 8.1.1127
+Problem: getwinpos() doesn't work in terminal on MS-Windows console.
+Solution: Adjust #ifdefs. Disable test for MS-Windows console.
+Files: src/ui.c, src/term.c, src/terminal.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.1.1128
+Problem: getwinpos() test does not work on MS-Windows.
+Solution: Skip the test.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.1129
+Problem: When making a new screendump test have to create the file.
+Solution: Continue creating the failed screendump, so it can be moved once
+ it is correct.
+Files: src/testdir/screendump.vim
+
+Patch 8.1.1130
+Problem: MS-Windows: warning for unused variable.
+Solution: Remove the variable.
+Files: src/evalfunc.c
+
+Patch 8.1.1131
+Problem: getwinpos() does not work in the MS-Windows console.
+Solution: Implement getwinpos().
+Files: src/ui.c, src/evalfunc.c, src/terminal.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.1.1132
+Problem: getwinpos() test fails on MS-Windows.
+Solution: Don't try running this test.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.1133
+Problem: Compiler warning for uninitialized struct member. (Yegappan
+ Lakshmanan)
+Solution: Add initializer field.
+Files: src/globals.h
+
+Patch 8.1.1134
+Problem: Buffer for quickfix window is reused for another file.
+Solution: Don't reuse the quickfix buffer. (Yegappan Lakshmanan)
+Files: src/buffer.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.1135 (after 8.1.1134)
+Problem: Build failure for small version. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/buffer.c
+
+Patch 8.1.1136
+Problem: Decoding of mouse click escape sequence is not tested.
+Solution: Add a test for xterm and SGR using low-level input. Make
+ low-level input execution with feedkeys() work.
+Files: src/testdir/test_termcodes.vim, src/testdir/Make_all.mak,
+ src/evalfunc.c, src/ex_docmd.c
+
+Patch 8.1.1137
+Problem: Xterm mouse wheel escape sequence is not tested.
+Solution: Add a test using low-level input. (Dominique Pelle, closes #4221)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1138
+Problem: Plugins don't get notified when the popup menu changes.
+Solution: Add the CompleteChanged event. (Qiming Zhao, Andy Massimino,
+ closes #4176)
+Files: runtime/doc/autocmd.txt, src/autocmd.c, src/dict.c,
+ src/insexpand.c, src/popupmnu.c, src/proto/autocmd.pro,
+ src/proto/dict.pro, src/proto/popupmnu.pro,
+ src/testdir/test_popup.vim, src/vim.h
+
+Patch 8.1.1139
+Problem: No test for what is fixed in patch 8.1.0716.
+Solution: Add a test. (Yasuhiro Matsumoto, closes #3797)
+Files: src/testdir/test_ins_complete.vim
+
+Patch 8.1.1140
+Problem: Not easy to find out what neighbors a window has.
+Solution: Add more arguments to winnr(). (Yegappan Lakshmanan, closes #3993)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/proto/window.pro,
+ src/testdir/test_window_cmd.vim, src/window.c
+
+Patch 8.1.1141
+Problem: Terminal winpos test fails with very large terminal. (Dominique
+ Pelle)
+Solution: Compute the expected size more accurately. (closes #4228)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.1142
+Problem: No test for dragging the window separators with the mouse.
+Solution: Add a test. (Dominique Pelle, closes #4226)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1143
+Problem: May pass weird strings to file name expansion.
+Solution: Check for matching characters. Disallow control characters.
+Files: src/misc1.c, src/testdir/test_spell.vim, src/option.c,
+ src/proto/option.pro, src/spell.c,
+ src/testdir/test_escaped_glob.vim
+
+Patch 8.1.1144 (after 8.1.1143)
+Problem: Too strict checking of the 'spellfile' option.
+Solution: Allow for a path.
+Files: src/option.c, src/testdir/test_spell.vim
+
+Patch 8.1.1145
+Problem: Compiler warning for unused function. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/option.c
+
+Patch 8.1.1146
+Problem: In MS-Windows console colors in a terminal window are wrong.
+Solution: Use the ansi index also for 16 colors. (Ken Takata)
+Files: src/terminal.c
+
+Patch 8.1.1147
+Problem: Desktop file translations are requiring manual updates.
+Solution: Use the .po files for desktop file translations. (Christian
+ Brabandt)
+Files: src/po/Makefile, src/po/gvim.desktop.in, src/po/vim.desktop.in,
+ CONTRIBUTING.md, Filelist, runtime/vim.desktop,
+ runtime/gvim.desktop
+
+Patch 8.1.1148
+Problem: CTRL-L with 'incsearch' does not pick up char under cursor.
+ (Smylers)
+Solution: Do not compare the position with the cursor position. (Hirohito
+ Higashi, closes #3620)
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.1.1149
+Problem: Building desktop files fails with older msgfmt.
+Solution: Add autoconf check. Avoid always building the desktop files.
+Files: src/configure.ac, src/auto/configure, src/po/Makefile,
+ src/po/Make_all.mak, src/config.mk.in
+
+Patch 8.1.1150
+Problem: Generating desktop files not tested on Travis.
+Solution: Install a newer msgfmt package. (Christian Brabandt)
+Files: .travis.yml
+
+Patch 8.1.1151
+Problem: Build fails when using shadow directory.
+Solution: Link the desktop.in files.
+Files: src/Makefile
+
+Patch 8.1.1152
+Problem: Compiler warning with VS2019.
+Solution: Specify different offset for "AMD64". (Ken Takata, closes #4235)
+Files: src/GvimExt/Makefile
+
+Patch 8.1.1153
+Problem: Msgfmt complains about missing LINGUAS file. (Tony Mechelynck)
+Solution: Add command to generate LINGUAS.
+Files: src/po/Makefile
+
+Patch 8.1.1154
+Problem: Getting a newer msgfmt on Travis is too complicated.
+Solution: Use a "sourceline" entry. (Ozaki Kiichi, closes #4236)
+Files: .travis.yml
+
+Patch 8.1.1155
+Problem: Termcodes tests can be improved.
+Solution: Add helper functions to simplify tests. Dragging statusline for
+ xterm and sgr. (Dominique Pelle, closes #4237)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1156
+Problem: Unicode emoji and other image characters not recognized.
+Solution: Add ranges for musical notation, game pieces, etc. (Martin
+ Tournoij, closes #4238)
+Files: src/mbyte.c
+
+Patch 8.1.1157
+Problem: Unicode tables are out of date.
+Solution: Update to Unicode 12. (Christian Brabandt, closes #4240)
+Files: src/mbyte.c
+
+Patch 8.1.1158
+Problem: Json encoded string is sometimes missing the final NUL.
+Solution: Add the NUL. Also for log messages.
+Files: src/json.c, src/channel.c, src/testdir/test_json.vim
+
+Patch 8.1.1159
+Problem: MS-Windows: with a silent (un)install $VIM/_vimrc is removed.
+Solution: Don't delete _vimrc in silent mode. (Ken Takata, closes #4242)
+Files: nsis/gvim.nsi
+
+Patch 8.1.1160
+Problem: Termcodes test would fail in a very big terminal.
+Solution: Bail out when the row is larger than what will work. (Dominique
+ Pelle, closes #4246)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1161
+Problem: Unreachable code.
+Solution: Remove condition that will never be true. Add tests for all ANSI
+ colors.
+Files: src/terminal.c, src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_all_ansi_colors.dump
+
+Patch 8.1.1162
+Problem: Incorrect coverage information; typo in color name.
+Solution: Fix the typo. Set environment variables to have a nested Vim
+ write the coverage info in another directory.
+Files: src/testdir/test_terminal.vim, src/testdir/screendump.vim,
+ src/testdir/dumps/Test_terminal_all_ansi_colors.dump
+
+Patch 8.1.1163
+Problem: Codecov does not report all the coverage information.
+Solution: Make a second run with the nested execution output, expect that
+ Codecov will merge the results.
+Files: .travis.yml
+
+Patch 8.1.1164
+Problem: Gettitle test is failing when server name differs. (Kenta Sato)
+Solution: Accept "VIM1" when 'autoservername' is used. (Dominique Pelle,
+ closes #4250, closes #4249)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.1165
+Problem: No test for mouse clicks in the terminal tabpage line.
+Solution: Add a test. (Dominique Pelle, closes #4247). Also init
+ TabPageIdxs[], in case it's used before a redraw.
+Files: src/screen.c, src/testdir/test_termcodes.vim
+
+Patch 8.1.1166 (after 8.1.1164)
+Problem: Gettitle test can still fail when another Vim is running.
+Solution: Accept any server name number. (Dominique Pelle, closes #4252)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.1167
+Problem: No test for closing tab by click in tabline.
+Solution: Add a test. Also fix that dragging window separator could fail in
+ a large terminal. (Dominique Pelle, closes #4253)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1168
+Problem: Not all screen update code of the terminal window is executed in
+ tests.
+Solution: Redraw before taking a screenshot.
+Files: src/testdir/screendump.vim
+
+Patch 8.1.1169
+Problem: Writing coverage info in a separate dir is not needed.
+Solution: Revert the changes to use a separate directory.
+Files: .travis.yml, src/testdir/screendump.vim
+
+Patch 8.1.1170
+Problem: Terminal ANSI color test does not cover all colors.
+Solution: Use the color number, the name is not always resulting in an ANSI
+ color when t_Co is 256.
+Files: src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_all_ansi_colors.dump
+
+Patch 8.1.1171
+Problem: Statusline test could fail in large terminal.
+Solution: Make the test work on a huge terminal. (Dominique Pelle,
+ closes #4255)
+Files: src/testdir/test_statusline.vim
+
+Patch 8.1.1172
+Problem: Cursor properties were not fully tested.
+Solution: Add a test. (Dominique Pelle, closes #4256)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.1173
+Problem: Suspend test has duplicated lines.
+Solution: Use a function.
+Files: src/testdir/test_suspend.vim
+
+Patch 8.1.1174
+Problem: Cannot build with Ruby 1.8. (Tom G. Christensen)
+Solution: Include ruby/st.h. (Ozaki Kiichi, closes #4257)
+Files: src/if_ruby.c
+
+Patch 8.1.1175
+Problem: No test for dragging a tab with the mouse and for creating a new
+ tab by double clicking in the tabline.
+Solution: Add two tests. (Dominique Pelle, closes #4258)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1176 (after 8.1.1175)
+Problem: Test for dragging a tab is flaky.
+Solution: Add a brief sleep.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1177
+Problem: .ts files are recognized as xml, while typescript is more common.
+Solution: Recognize .ts files as typescript. (closes #4264)
+Files: runtime/filetype.vim src/testdir/test_filetype.vim
+
+Patch 8.1.1178
+Problem: When mouse click tests fails value of 'ttymouse' is unknown.
+Solution: Add a message to the assert.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1179
+Problem: No test for mouse clicks in the fold column.
+Solution: Add a test. (Dominique Pelle, closes #4261)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1180
+Problem: Vim script debugger tests are old style.
+Solution: Turn into new style tests. (Yegappan Lakshmanan, closes #4259)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test108.in, src/testdir/test108.ok,
+ src/testdir/test_debugger.vim
+
+Patch 8.1.1181
+Problem: Tests for mouse clicks are a bit flaky when run in an interactive
+ terminal.
+Solution: Use "xterm2" instead of "xterm" for 'ttymouse' to avoid spurious
+ drag events.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1182
+Problem: Some function prototypes are outdated.
+Solution: Update function prototypes. (Ken Takata, closes #4267)
+Files: src/os_mswin.c, src/proto/ex_getln.pro, src/proto/gui_w32.pro,
+ src/terminal.c, src/proto/terminal.pro, src/proto/window.pro,
+ src/window.c
+
+Patch 8.1.1183
+Problem: Typos in VisVim comments.
+Solution: Correct the typos. (Christ van Willegen)
+Files: src/VisVim/Commands.cpp, src/VisVim/OleAut.cpp,
+ src/VisVim/README_VisVim.txt
+
+Patch 8.1.1184
+Problem: Undo file left behind after running test.
+Solution: Delete the undo file. (Dominique Pelle, closes #4279)
+Files: src/testdir/test_filechanged.vim
+
+Patch 8.1.1185
+Problem: Mapping for CTRL-X is inconsistent.
+Solution: Map CTRL-X to "*d also for the MS-Windows console. (Ken Takata,
+ closes #4265)
+Files: src/getchar.c
+
+Patch 8.1.1186
+Problem: readdir() allocates list twice.
+Solution: Remove second allocation. Also check for zero length.
+Files: src/evalfunc.c
+
+Patch 8.1.1187
+Problem: Cannot recognize Pipfile.
+Solution: Use existing filetypes. (Charles Ross, closes #4280)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.1188
+Problem: Not all Vim variables require the v: prefix.
+Solution: When scriptversion is 3 all Vim variables can only be used with
+ the v: prefix. (Ken Takata, closes #4274)
+Files: src/eval.c, src/ex_cmds2.c, src/testdir/test_eval_stuff.vim,
+ runtime/doc/eval.txt
+
+Patch 8.1.1189
+Problem: Mode is not cleared when leaving Insert mode.
+Solution: Clear the mode when got_int is set. (Ozaki Kiichi, closes #4270)
+Files: src/edit.c, src/testdir/test_bufline.vim,
+ src/testdir/test_messages.vim
+
+Patch 8.1.1190
+Problem: has('vimscript-3') does not work.
+Solution: Add "vimscript-3" to the list of features. (partly by Ken Takata)
+Files: src/evalfunc.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.1.1191
+Problem: Not all debug commands are covered by a test.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #4282)
+Files: src/testdir/test_debugger.vim
+
+Patch 8.1.1192
+Problem: Mode is not cleared when leaving Insert mode with mapped Esc.
+Solution: Clear the mode when redraw_cmdline is set. (closes #4269)
+Files: src/globals.h, src/screen.c, src/testdir/test_messages.vim
+
+Patch 8.1.1193
+Problem: Typos and small problems in test files.
+Solution: Small improvements.
+Files: src/testdir/test_gn.vim, src/testdir/test_quotestar.vim,
+ src/testdir/test_registers.vim, src/testdir/test_syntax.vim,
+ src/testdir/test_tabpage.vim, src/testdir/test_vartabs.vim
+
+Patch 8.1.1194
+Problem: Typos and small problems in source files.
+Solution: Small fixes.
+Files: src/channel.c, src/crypt.c, src/edit.c, src/regexp.h, src/tag.c,
+ src/term.c, src/terminal.c, src/userfunc.c, src/installman.sh
+
+Patch 8.1.1195
+Problem: Vim script debugger functionality needs cleanup.
+Solution: Move debugger code to a separate file. Add more tests. (Yegappan
+ Lakshmanan, closes #4285)
+Files: Filelist, src/Make_bc5.mak, src/Make_cyg_ming.mak,
+ src/Make_dice.mak, src/Make_ivc.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak,
+ src/Make_vms.mms, src/Makefile, src/debugger.c, src/ex_cmds2.c,
+ src/proto.h, src/proto/debugger.pro, src/proto/ex_cmds2.pro
+
+Patch 8.1.1196
+Problem: Parallel build may fail.
+Solution: Update dependencies.
+Files: src/Makefile
+
+Patch 8.1.1197
+Problem: When starting with multiple tabs file messages is confusing.
+Solution: Set 'shortmess' when loading the other tabs. (Christian Brabandt)
+Files: src/main.c, src/testdir/test_startup.vim,
+ src/testdir/dumps/Test_start_with_tabs.dump
+
+Patch 8.1.1198
+Problem: Bracketed paste may remain active after Vim exists, because the
+ terminal emulator restores the setting.
+Solution: Set/reset bracketed paste mode before setting the terminal mode.
+ (closes #3579)
+Files: src/term.c
+
+
+Patch 8.1.1199
+Problem: No test for :abclear.
+Solution: Add a test. (Dominique Pelle, closes #4292)
+Files: src/testdir/test_mapping.vim
+
+Patch 8.1.1200
+Problem: Old style comments in debugger source.
+Solution: Use new style comments. (Yegappan Lakshmanan, closes #4286)
+Files: src/README.md, src/debugger.c
+
+Patch 8.1.1201
+Problem: Output of :command is hard to read.
+Solution: Make some columns wider, some narrower. Truncate the command when
+ listing all.
+Files: src/ex_docmd.c, src/message.c, src/proto/message.pro,
+ src/getchar.c, src/menu.c
+
+Patch 8.1.1202
+Problem: Always get regexp debugging logs when building with -DDEBUG.
+Solution: By default do not create regexp debugging logs. (Ken Takata)
+Files: src/regexp.c
+
+Patch 8.1.1203
+Problem: Some autocmd tests are old style.
+Solution: Turn the tests into new style. (Yegappan Lakshmanan, closes #4295)
+Files: src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_vms.mms,
+ src/testdir/test11.in, src/testdir/test11.ok,
+ src/testdir/test_autocmd.vim
+
+Patch 8.1.1204
+Problem: Output of :command with address completion is not nice.
+Solution: Shorten the address completion names.
+Files: src/ex_docmd.c, runtime/doc/map.txt
+
+Patch 8.1.1205
+Problem: A BufReadPre autocommand may cause the cursor to move.
+Solution: Restore the cursor position after executing the autocommand,
+ unless the autocommand moved it. (Christian Brabandt,
+ closes #4302, closes #4294)
+Files: src/autocmd.c, src/proto/window.pro, src/structs.h,
+ src/testdir/test_autocmd.vim, src/window.c
+
+Patch 8.1.1206
+Problem: User command parsing and listing not properly tested.
+Solution: Add more tests. (Dominique Pelle, closes #4296)
+Files: src/testdir/test_usercommands.vim
+
+Patch 8.1.1207
+Problem: Some compilers give warning messages.
+Solution: Initialize variables, change printf() argument. (Christian
+ Brabandt, closes #4305)
+Files: src/eval.c, src/screen.c, src/undo.c, src/window.c
+
+Patch 8.1.1208
+Problem: Links to repository use wrong file name.
+Solution: Swap the file names. (Nahuel Ourthe, closes #4304)
+Files: src/README.md
+
+Patch 8.1.1209
+Problem: Clever compiler warns for buffer being too small.
+Solution: Make the buffer bigger (even though it's not really needed).
+Files: src/evalfunc.c, src/syntax.c
+
+Patch 8.1.1210
+Problem: Support for user commands is spread out. No good reason to make
+ user commands optional.
+Solution: Move user command support to usercmd.c. Always enable the
+ user_commands feature.
+Files: src/usercmd.c, src/proto/usercmd.pro, Filelist, src/Make_bc5.mak,
+ src/Make_cyg_ming.mak, src/Make_dice.mak, src/Make_ivc.mak,
+ src/Make_manx.mak, src/Make_morph.mak, src/Make_mvc.mak,
+ src/Make_sas.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/buffer.c, src/eval.c, src/evalfunc.c, src/ex_cmds.h,
+ src/ex_docmd.c, src/proto/ex_docmd.pro, src/ex_getln.c,
+ src/feature.h, src/macros.h, src/misc2.c, src/proto.h,
+ src/structs.h, src/version.c, runtime/doc/eval.txt,
+ runtime/doc/various.txt
+
+Patch 8.1.1211
+Problem: Not all user command code is tested.
+Solution: Add more tests.
+Files: src/testdir/test_usercommands.vim
+
+Patch 8.1.1212
+Problem: Signal PWR is not tested.
+Solution: Test that PWR updates the swap file. (Dominique Pelle,
+ closes #4312)
+Files: src/testdir/test_signals.vim
+
+Patch 8.1.1213
+Problem: "make clean" in top dir does not cleanup indent test output.
+Solution: Clean the indent test output. Do not rely on the vim executable
+ for that. (closes #4307)
+Files: Makefile, runtime/indent/Makefile,
+ runtime/indent/testdir/cleantest.vim
+
+Patch 8.1.1214
+Problem: Old style tests.
+Solution: Move tests from test14 to new style test files. (Yegappan
+ Lakshmanan, closes #4308)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test14.in, src/testdir/test14.ok,
+ src/testdir/test_edit.vim, src/testdir/test_normal.vim,
+ src/testdir/test_search.vim, src/testdir/test_substitute.vim,
+ src/testdir/test_visual.vim
+
+Patch 8.1.1215
+Problem: "make clean" does not remove generated src/po files.
+Solution: Remove the files for "make clean". (Christian Brabandt)
+Files: src/po/Makefile
+
+Patch 8.1.1216
+Problem: Mouse middle click is not tested.
+Solution: Add a test. (Dominique Pelle, closes #4310)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1217
+Problem: MS-Windows: no space reserved for font quality name.
+Solution: Add quality_name length if present. (Ken Takata, closes #4311)
+Files: src/gui_w32.c
+
+Patch 8.1.1218
+Problem: Cannot set a directory for a tab page.
+Solution: Add the tab-local directory. (Yegappan Lakshmanan, closes #4212)
+Files: runtime/doc/autocmd.txt, runtime/doc/editing.txt,
+ runtime/doc/eval.txt, runtime/doc/index.txt,
+ runtime/doc/options.txt, runtime/doc/usr_22.txt,
+ runtime/doc/usr_41.txt, src/eval.c, src/evalfunc.c,
+ src/ex_cmdidxs.h, src/ex_cmds.h, src/ex_docmd.c, src/if_py_both.h,
+ src/proto/eval.pro, src/proto/ex_docmd.pro, src/structs.h,
+ src/testdir/test_getcwd.vim, src/testdir/test_mksession.vim,
+ src/window.c
+
+Patch 8.1.1219
+Problem: Not checking for NULL return from alloc().
+Solution: Add checks. (Martin Kunev, closes #4303, closes #4174)
+Files: src/beval.c, src/blowfish.c, src/crypt.c, src/crypt_zip.c,
+ src/ops.c, src/option.c, src/popupmnu.c, src/proto/blowfish.pro,
+ src/proto/crypt_zip.pro, src/gui_gtk_f.c, src/gui_gtk_x11.c,
+ src/libvterm/src/state.c, src/libvterm/src/termscreen.c
+
+Patch 8.1.1220 (after 8.1.1219)
+Problem: Build fails on MS-Windows.
+Solution: Move declaration to start of block.
+Files: src/libvterm/src/state.c
+
+Patch 8.1.1221
+Problem: Filtering does not work when listing marks.
+Solution: Implement filtering marks. (Marcin Szamotulski, closes #3895)
+Files: runtime/doc/various.txt, src/mark.c,
+ src/testdir/test_filter_cmd.vim
+
+Patch 8.1.1222 (after 8.1.1219)
+Problem: Build still fails on MS-Windows.
+Solution: Move another declaration to start of block.
+Files: src/libvterm/src/state.c
+
+Patch 8.1.1223
+Problem: Middle mouse click test fails without a clipboard.
+Solution: Check if the clipboard can be used. (Dominique Pelle, Christian
+ Brabandt) Also use WorkingClipboard() instead of checking for the
+ "clipboard" feature.
+Files: src/testdir/test_termcodes.vim, src/testdir/test_quotestar.vim
+
+Patch 8.1.1224
+Problem: MS-Windows: cannot specify font weight.
+Solution: Add the "W" option to 'guifont'. (closes #4309) Move GUI font
+ explanation out of options.txt.
+Files: runtime/doc/options.txt, runtime/doc/gui.txt,
+ runtime/doc/mbyte.txt, src/gui_w32.c, src/os_mswin.c
+
+Patch 8.1.1225
+Problem: Cannot create a pty to use with :terminal on FreeBSD.
+Solution: Add support for posix_openpt(). (Ozaki Kiichi, closes #4306,
+ closes #4289)
+Files: src/configure.ac, src/config.h.in, src/auto/configure, src/pty.c
+
+Patch 8.1.1226
+Problem: {not in Vi} remarks get in the way of useful help text.
+Solution: Make a list of all Vi options, instead of mentioning what Vi does
+ not have. Update the help text for options.
+Files: runtime/doc/vi_diff.txt, runtime/doc/options.txt
+
+Patch 8.1.1227
+Problem: Duplicate entries in the generated .desktop files. (Ralf Schandl)
+Solution: Remove translated entries from the .in files. (closes #4313)
+Files: src/po/gvim.desktop.in, src/po/vim.desktop.in
+
+Patch 8.1.1228
+Problem: Not possible to process tags with a function.
+Solution: Add tagfunc() (Christian Brabandt, Andy Massimino, closes #4010)
+Files: runtime/doc/options.txt, runtime/doc/tagsrch.txt,
+ runtime/optwin.vim, src/buffer.c, src/dict.c, src/ex_cmds.c,
+ src/globals.h, src/insexpand.c, src/normal.c, src/option.c,
+ src/option.h, src/proto/dict.pro, src/structs.h, src/tag.c,
+ src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_tagfunc.vim, src/vim.h, src/window.c
+
+Patch 8.1.1229
+Problem: Warning for posix_openpt() not declared. (Tony Mechelynck)
+Solution: Add declaration.
+Files: src/pty.c
+
+Patch 8.1.1230
+Problem: A lot of code is shared between vim.exe and gvim.exe.
+Solution: Optionally put the shared code in vim.dll. (Ken Takata,
+ closes #4287)
+Files: Filelist, nsis/gvim.nsi, runtime/doc/gui_w32.txt,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/channel.c,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_docmd.c, src/feature.h,
+ src/fileio.c, src/getchar.c, src/globals.h, src/gui.c, src/gui.h,
+ src/gui_gtk_x11.c, src/gui_w32.c, src/if_mzsch.c, src/main.c,
+ src/mbyte.c, src/memline.c, src/message.c, src/misc2.c,
+ src/normal.c, src/option.c, src/os_mswin.c, src/os_w32dll.c,
+ src/os_w32exe.c, src/os_win32.c, src/os_win32.h,
+ src/proto/gui.pro, src/proto/gui_w32.pro, src/proto/misc2.pro,
+ src/proto/os_mswin.pro, src/proto/os_win32.pro, src/syntax.c,
+ src/term.c, src/terminal.c, src/ui.c, src/version.c, src/vim.rc
+
+Patch 8.1.1231
+Problem: Asking about existing swap file unnecessarily.
+Solution: When it is safe, delete the swap file. Remove
+ HAS_SWAP_EXISTS_ACTION, it is always defined. (closes #1237)
+Files: src/memline.c, src/globals.h, src/buffer.c, src/ex_cmds.c,
+ src/fileio.c, src/main.c, src/testdir/test_swap.vim,
+ runtime/doc/usr_11.txt, src/os_win32.c, src/proto/os_win32.pro,
+ src/os_unix.c, src/proto/os_unix.pro
+
+Patch 8.1.1232
+Problem: Can't build on MS-Windows.
+Solution: Define process_still_running.
+Files: src/memline.c, src/os_win32.c, src/proto/os_win32.pro,
+ src/os_unix.c, src/proto/os_unix.pro
+
+Patch 8.1.1233
+Problem: Cannot build tiny version.
+Solution: Remove #ifdef for verb_msg().
+Files: src/message.c
+
+Patch 8.1.1234
+Problem: Swap file test fails on MS-Windows.
+Solution: Only compare the tail of the file names.
+Files: src/testdir/test_swap.vim
+
+Patch 8.1.1235
+Problem: Compiler warnings for using STRLEN() value.
+Solution: Cast to int. (Christian Brabandt, Mike Williams)
+Files: src/tag.c
+
+Patch 8.1.1236
+Problem: sjiscorr.c not found in shadow directory. (Tony Mechelynck)
+Solution: Link po/*.c files with "make shadow".
+Files: src/Makefile
+
+Patch 8.1.1237
+Problem: Error for using "compl", reserved word in C++.
+Solution: Rename to "complp". (suggestion by Ken Takata)
+Files: src/usercmd.c, src/proto/usercmd.pro
+
+Patch 8.1.1238
+Problem: MS-Windows: compiler warning for sprintf() format.
+Solution: Change %d to %ld. (Ken Takata)
+Files: src/gui_w32.c
+
+Patch 8.1.1239
+Problem: Key with byte sequence containing CSI does not work.
+Solution: Do not recognize CSI as special unless the GUI is active. (Ken
+ Takata, closes #4318)
+Files: src/getchar.c
+
+Patch 8.1.1240
+Problem: Runtime desktop files are overwritten by build. (Tony Mechelynck)
+Solution: Instead of copying the files find them with "make install".
+Files: src/Makefile, src/po/Makefile
+
+Patch 8.1.1241
+Problem: Ex command info contains confusing information.
+Solution: When using the NOTADR flag use ADDR_OTHER for the address type.
+ Cleanup code using NOTADR. Check for errors in
+ create_cmdidxs.vim. Adjust Makefile to see the errors.
+Files: src/ex_cmds.h, src/ex_docmd.c, src/Makefile,
+ src/create_cmdidxs.vim, src/usercmd.c, src/ex_cmds.c,
+ src/window.c, src/testdir/test_usercommands.vim
+
+Patch 8.1.1242
+Problem: No cmdline redraw when tabpages have different 'cmdheight'.
+Solution: redraw the command line when 'cmdheight' changes when switching
+ tabpages. (closes #4321)
+Files: src/testdir/test_tabpage.vim, src/window.c,
+ src/testdir/dumps/Test_tabpage_cmdheight.dump,
+ src/testdir/screendump.vim
+
+Patch 8.1.1243 (after 8.1.1241)
+Problem: Compiler warnings for incomplete switch statement. (Tony
+ Mechelynck)
+Solution: Add ADDR_QUICKFIX to the list.
+Files: src/ex_docmd.c
+
+Patch 8.1.1244
+Problem: No tests for CTRL-mouse-click.
+Solution: Add a few tests. (Dominique Pelle, closes #4323)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1245
+Problem: ":copen 10" sets height in full-height window. (Daniel Hahler)
+Solution: Don't set the height if the quickfix window is full height.
+ (closes #4325)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.1246
+Problem: Cannot handle negative mouse coordinate from urxvt.
+Solution: Accept '-' where a digit is expected. (Vincent Vinel,
+ closes #4326)
+Files: src/term.c
+
+Patch 8.1.1247
+Problem: Urxvt mouse codes are not tested.
+Solution: Also set 'ttymouse' to "urxvt" in the termcodes test.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1248
+Problem: No test for dec mouse.
+Solution: Add some tests for dec mouse. Add "no_query_mouse".
+Files: src/evalfunc.c, src/globals.h, src/os_unix.c,
+ src/testdir/test_termcodes.vim, runtime/doc/eval.txt
+
+Patch 8.1.1249
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize it. (Christian Brabandt)
+Files: src/regexp_nfa.c
+
+Patch 8.1.1250
+Problem: No test for netterm mouse.
+Solution: Add some tests for netterm mouse.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1251
+Problem: No test for completion of mapping keys.
+Solution: Add a test. Also clean up the code.
+Files: src/getchar.c, src/term.c, src/proto/term.pro,
+ src/testdir/test_cmdline.vim
+
+Patch 8.1.1252
+Problem: Not all mapping completion is tested.
+Solution: Add a few more mapping completion tests.
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.1.1253 (after 8.1.1252)
+Problem: Mapping completion test fails.
+Solution: Fix expected output.
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.1.1254
+Problem: Mapping completion contains dead code.
+Solution: Remove the code.
+Files: src/term.c, src/testdir/test_cmdline.vim
+
+Patch 8.1.1255
+Problem: Building desktop files fails on FreeBSD. (Adam Weinberger)
+Solution: Avoid using non-portable construct in Makefile. (closes #4332)
+Files: src/po/Makefile
+
+Patch 8.1.1256
+Problem: Cannot navigate through errors relative to the cursor.
+Solution: Add :cabove, :cbelow, :labove and :lbelow. (Yegappan Lakshmanan,
+ closes #4316)
+Files: runtime/doc/index.txt, runtime/doc/quickfix.txt, src/ex_cmdidxs.h,
+ src/ex_cmds.h, src/ex_docmd.c, src/proto/quickfix.pro,
+ src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.1257
+Problem: MSVC: name of object directory not always right.
+Solution: Adjust comment. Don't use different directory for DIRECTX. Do
+ use different directory for USE_MSVCRT. (Ken Takata, closes #4333)
+Files: src/Make_mvc.mak
+
+Patch 8.1.1258
+Problem: The "N files to edit" message can not be suppressed.
+Solution: Suppress the message with --not-a-term. (closes #4320)
+Files: src/main.c
+
+Patch 8.1.1259
+Problem: Crash when exiting early. (Ralf Schandl)
+Solution: Only pop/push the title when it was set. (closes #4334)
+Files: src/os_unix.c, src/misc2.c, src/usercmd.c, src/tag.c
+
+Patch 8.1.1260
+Problem: Comparing with pointer instead of value.
+Solution: Add a "*". (Ken Takata, closes #4336)
+Files: src/usercmd.c
+
+Patch 8.1.1261
+Problem: No error for quickfix commands with negative range.
+Solution: Add ADDR_UNSIGNED and use it for quickfix commands. Make
+ assert_fails() show the command if the error doesn't match.
+Files: src/ex_cmds.h, src/ex_docmd.c, src/testdir/test_quickfix.vim,
+ runtime/doc/quickfix.txt, src/eval.c, src/quickfix.c,
+ src/proto/quickfix.pro, src/ex_cmds2.c
+
+Patch 8.1.1262
+Problem: Cannot simulate a mouse click in a test.
+Solution: Add test_setmouse().
+Files: src/evalfunc.c, runtime/doc/eval.txt, runtime/doc/usr_41.txt
+
+Patch 8.1.1263
+Problem: Mouse clicks in WinBar not tested.
+Solution: Add a test for clicking on the WinBar entries.
+Files: src/testdir/test_winbar.vim
+
+Patch 8.1.1264
+Problem: Crash when closing window from WinBar click. (Ben Jackson)
+Solution: Check that window pointer is still valid. (closes #4337)
+Files: src/menu.c
+
+Patch 8.1.1265
+Problem: When GPM mouse support is enabled double clicks in xterm do not
+ work.
+Solution: Use KS_GPM_MOUSE for GPM mouse events.
+Files: src/term.c, src/os_unix.c, src/keymap.h
+
+Patch 8.1.1266
+Problem: Winbar test doesn't test enough.
+Solution: Check that the WinBar actually shows up. Correct check for clicks
+ with no effect. (Ben Jackson, closes #4338)
+Files: src/testdir/test_winbar.vim
+
+Patch 8.1.1267
+Problem: Cannot check if GPM mouse support is working.
+Solution: Add the "mouse_gpm_enable" feature.
+Files: src/evalfunc.c, src/os_unix.c, src/proto/os_unix.pro,
+ runtime/doc/eval.txt
+
+Patch 8.1.1268
+Problem: Map completion test fails in GUI.
+Solution: Skip the test that fails.
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.1.1269
+Problem: MS-Windows GUI: multibyte chars with a 0x80 byte do not work when
+ compiled with VIMDLL.
+Solution: Adjust the condition for fixing the input buffer. (Ken Takata,
+ closes #4330)
+Files: src/getchar.c
+
+Patch 8.1.1270
+Problem: Cannot see current match position.
+Solution: Show "3/44" when using the "n" command and "S" is not in
+ 'shortmess'. (Christian Brabandt, closes #4317)
+Files: runtime/doc/options.txt, runtime/doc/pattern.txt, src/option.c,
+ src/option.h, src/search.c, src/testdir/Make_all.mak,
+ src/testdir/test_search_stat.vim
+
+Patch 8.1.1271 (after 8.1.1270)
+Problem: Compiler warnings for use of STRNCPY(). (John Marriott)
+Solution: Use mch_memmove() instead of STRNCPY().
+Files: src/search.c
+
+Patch 8.1.1272
+Problem: Click on WinBar of other window not tested.
+Solution: Add a test case.
+Files: src/testdir/test_winbar.vim
+
+Patch 8.1.1273
+Problem: Compiler warning in direct write code.
+Solution: Add a type cast.
+Files: src/gui_dwrite.cpp
+
+Patch 8.1.1274
+Problem: After :unmenu can still execute the menu with :emenu.
+Solution: Do not execute a menu that was disabled for the specified mode.
+Files: src/menu.c, src/testdir/test_menu.vim
+
+Patch 8.1.1275
+Problem: Cannot navigate to errors before/after the cursor.
+Solution: Add the :cbefore and :cafter commands. (Yegappan Lakshmanan,
+ closes #4340)
+Files: runtime/doc/index.txt, runtime/doc/quickfix.txt, src/ex_cmdidxs.h,
+ src/ex_cmds.h, src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.1276
+Problem: Cannot combine text properties with syntax highlighting.
+Solution: Add the "combine" field to prop_type_add(). (closes #4343)
+Files: runtime/doc/eval.txt, runtime/doc/textprop.txt, src/screen.c,
+ src/structs.h, src/testdir/test_textprop.vim
+
+Patch 8.1.1277 (after 8.1.1276)
+Problem: Missing screenshot update.
+Solution: Update the screenshot.
+Files: src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.1278 (after 8.1.1276)
+Problem: Missing change for "combine" field.
+Solution: Also change the textprop implementation.
+Files: src/textprop.c
+
+Patch 8.1.1279
+Problem: Cannot set 'spelllang' to "sr@latin". (Bojan Stipic)
+Solution: Allow using '@' in 'spelllang'. (closes #4342)
+Files: src/option.c, src/testdir/gen_opt_test.vim
+
+Patch 8.1.1280
+Problem: Remarks about functionality not in Vi clutters the help.
+Solution: Move all info about what is new in Vim or already existed in Vi to
+ vi_diff.txt. Remove {not in Vi} remarks. (closes #4268) Add
+ "noet" to the help files modeline. Also include many other help
+ file improvements.
+Files: runtime/doc/vi_diff.txt, runtime/doc/arabic.txt,
+ runtime/doc/autocmd.txt, runtime/doc/change.txt,
+ runtime/doc/channel.txt, runtime/doc/cmdline.txt,
+ runtime/doc/debugger.txt, runtime/doc/debug.txt,
+ runtime/doc/develop.txt, runtime/doc/diff.txt,
+ runtime/doc/digraph.txt, runtime/doc/editing.txt,
+ runtime/doc/eval.txt, runtime/doc/farsi.txt,
+ runtime/doc/filetype.txt, runtime/doc/fold.txt,
+ runtime/doc/ft_ada.txt, runtime/doc/ft_rust.txt,
+ runtime/doc/ft_sql.txt, runtime/doc/gui.txt,
+ runtime/doc/gui_w32.txt, runtime/doc/gui_x11.txt,
+ runtime/doc/hangulin.txt, runtime/doc/hebrew.txt,
+ runtime/doc/helphelp.txt, runtime/doc/help.txt,
+ runtime/doc/howto.txt, runtime/doc/if_cscop.txt,
+ runtime/doc/if_lua.txt, runtime/doc/if_mzsch.txt,
+ runtime/doc/if_ole.txt, runtime/doc/if_perl.txt,
+ runtime/doc/if_pyth.txt, runtime/doc/if_ruby.txt,
+ runtime/doc/if_sniff.txt, runtime/doc/if_tcl.txt,
+ runtime/doc/indent.txt, runtime/doc/index.txt,
+ runtime/doc/insert.txt, runtime/doc/intro.txt,
+ runtime/doc/map.txt, runtime/doc/mbyte.txt,
+ runtime/doc/message.txt, runtime/doc/mlang.txt,
+ runtime/doc/motion.txt, runtime/doc/netbeans.txt,
+ runtime/doc/options.txt, runtime/doc/os_390.txt,
+ runtime/doc/os_amiga.txt, runtime/doc/os_beos.txt,
+ runtime/doc/os_dos.txt, runtime/doc/os_mac.txt,
+ runtime/doc/os_mint.txt, runtime/doc/os_msdos.txt,
+ runtime/doc/os_os2.txt, runtime/doc/os_qnx.txt,
+ runtime/doc/os_risc.txt, runtime/doc/os_unix.txt,
+ runtime/doc/os_vms.txt, runtime/doc/os_win32.txt,
+ runtime/doc/pattern.txt, runtime/doc/pi_getscript.txt,
+ runtime/doc/pi_gzip.txt, runtime/doc/pi_logipat.txt,
+ runtime/doc/pi_netrw.txt, runtime/doc/pi_paren.txt,
+ runtime/doc/pi_spec.txt, runtime/doc/pi_tar.txt,
+ runtime/doc/pi_vimball.txt, runtime/doc/pi_zip.txt,
+ runtime/doc/print.txt, runtime/doc/quickfix.txt,
+ runtime/doc/quickref.txt, runtime/doc/quotes.txt,
+ runtime/doc/recover.txt, runtime/doc/remote.txt,
+ runtime/doc/repeat.txt, runtime/doc/rileft.txt,
+ runtime/doc/russian.txt, runtime/doc/scroll.txt,
+ runtime/doc/sign.txt, runtime/doc/spell.txt,
+ runtime/doc/sponsor.txt, runtime/doc/starting.txt,
+ runtime/doc/syntax.txt, runtime/doc/tabpage.txt,
+ runtime/doc/tagsrch.txt, runtime/doc/terminal.txt,
+ runtime/doc/term.txt, runtime/doc/textprop.txt,
+ runtime/doc/tips.txt, runtime/doc/todo.txt,
+ runtime/doc/uganda.txt, runtime/doc/undo.txt,
+ runtime/doc/usr_01.txt, runtime/doc/usr_02.txt,
+ runtime/doc/usr_03.txt, runtime/doc/usr_04.txt,
+ runtime/doc/usr_05.txt, runtime/doc/usr_06.txt,
+ runtime/doc/usr_07.txt, runtime/doc/usr_08.txt,
+ runtime/doc/usr_09.txt, runtime/doc/usr_10.txt,
+ runtime/doc/usr_11.txt, runtime/doc/usr_12.txt,
+ runtime/doc/usr_20.txt, runtime/doc/usr_21.txt,
+ runtime/doc/usr_22.txt, runtime/doc/usr_23.txt,
+ runtime/doc/usr_24.txt, runtime/doc/usr_25.txt,
+ runtime/doc/usr_26.txt, runtime/doc/usr_27.txt,
+ runtime/doc/usr_28.txt, runtime/doc/usr_29.txt,
+ runtime/doc/usr_30.txt, runtime/doc/usr_31.txt,
+ runtime/doc/usr_32.txt, runtime/doc/usr_40.txt,
+ runtime/doc/usr_41.txt, runtime/doc/usr_43.txt,
+ runtime/doc/usr_44.txt, runtime/doc/usr_45.txt,
+ runtime/doc/usr_90.txt, runtime/doc/usr_toc.txt,
+ runtime/doc/various.txt, runtime/doc/version4.txt,
+ runtime/doc/version5.txt, runtime/doc/version6.txt,
+ runtime/doc/version7.txt, runtime/doc/version8.txt,
+ runtime/doc/visual.txt, runtime/doc/windows.txt, runtime/doc/tags
+
+Patch 8.1.1281
+Problem: Cannot specify a count with :chistory.
+Solution: Add a count to :chistory and :lhistory. (Yegappan Lakshmanan,
+ closes #4344)
+Files: runtime/doc/quickfix.txt, src/ex_cmds.h, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.1.1282
+Problem: Running make in src/po leaves LINGUAS file behind. (Ken Takata)
+Solution: Delete LINGUAS after running msgfmt.
+Files: src/po/Makefile
+
+Patch 8.1.1283
+Problem: Delaying half a second after the top-bot message.
+Solution: Instead of the delay add "W" to the search count.
+Files: src/search.c, src/testdir/test_search_stat.vim
+
+Patch 8.1.1284
+Problem: Detecting *.tmpl as htmlcheetah is outdated.
+Solution: Use the generic name "template". (closes #4348)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.1285
+Problem: Test17 is old style.
+Solution: Turn into new style test. (Yegappan Lakshmanan, closes #4347)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test17.in, src/testdir/test17.ok,
+ src/testdir/test17a.in, src/testdir/test_checkpath.vim,
+ src/testdir/test_gf.vim
+
+Patch 8.1.1286
+Problem: Running tests leaves XTest_tabpage_cmdheight file behind.
+Solution: Delete the right file. (closes #4350)
+Files: src/testdir/test_tabpage.vim
+
+Patch 8.1.1287
+Problem: Cannot build with +eval but without +mouse.
+Solution: Add #ifdefs around f_test_setmouse(). (John Marriott)
+Files: src/evalfunc.c
+
+Patch 8.1.1288
+Problem: Search stats don't show for mapped command.
+Solution: Remove SEARCH_PEEK from searchit flags. Add a test. (Christian
+ Brabandt)
+Files: src/search.c, src/testdir/test_search_stat.vim
+
+Patch 8.1.1289
+Problem: May not have enough space to add "W" to search stats.
+Solution: Reserve a bit more space. (Christian Brabandt)
+Files: src/search.c
+
+Patch 8.1.1290
+Problem: .hgignore and .gitignore are either distributed or in git, not
+ both.
+Solution: Add .gitignore to the distribution and .hgignore to git. Update
+ the entries. (Christian Brabandt, Ken Takata)
+Files: .gitignore, .hgignore, Filelist
+
+Patch 8.1.1291
+Problem: Not easy to change directory and restore.
+Solution: Add the chdir() function. (Yegappan Lakshmanan, closes #4358)
+Files: runtime/doc/eval.txt, runtime/doc/todo.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/ex_docmd.c,
+ src/if_py_both.h, src/proto/ex_docmd.pro, src/structs.h,
+ src/testdir/test_cd.vim
+
+Patch 8.1.1292
+Problem: Invalid command line arguments not tested.
+Solution: Add a test. (Dominique Pelle, closes #4346)
+Files: src/testdir/test_startup.vim
+
+Patch 8.1.1293
+Problem: MSVC files are no longer useful for debugging. Newer Visual
+ Studio versions cannot read them.
+Solution: Delete the files. (Ken Takata, closes #4357)
+Files: Filelist, src/Make_dvc.mak, src/Make_ivc.mak,
+ runtime/doc/debug.txt, src/INSTALLpc.txt, src/Make_mvc.mak
+
+Patch 8.1.1294
+Problem: MS-Windows: Some fonts return wrong average char width.
+Solution: Compute the average ourselves. (Ken Takata, closes #4356)
+Files: src/gui_w32.c
+
+Patch 8.1.1295
+Problem: When vimrun.exe does not exist external command may fail.
+Solution: Use "cmd /c" twice to get the same behavior. (Ken Takata,
+ closes #4355)
+Files: src/os_win32.c
+
+Patch 8.1.1296
+Problem: Crash when using invalid command line argument.
+Solution: Check for options not being initialized.
+Files: src/term.c, src/testdir/test_startup.vim
+
+Patch 8.1.1297
+Problem: Invalid argument test fails without GTK.
+Solution: Test -display and --display separately.
+Files: src/testdir/test_startup.vim
+
+Patch 8.1.1298
+Problem: Invalid argument test fails without X clipboard.
+Solution: Test -display only with the +xterm_clipboard feature.
+Files: src/testdir/test_startup.vim
+
+Patch 8.1.1299
+Problem: "extends" from 'listchars' is used when 'list' is off. (Hiroyuki
+ Yoshinaga)
+Solution: Only use the "extends" character when 'list' is on. (Hirohito
+ Higashi, closes #4360)
+Files: src/screen.c, src/testdir/test_listchars.vim
+
+Patch 8.1.1300
+Problem: In a terminal 'ballooneval' does not work right away.
+Solution: Flush output after drawing the balloon. Add the <Ignore> key
+ code. Add a test.
+Files: src/ex_cmds2.c, src/testdir/test_balloon.vim, src/misc2.c,
+ src/testdir/Make_all.mak,
+ src/testdir/dumps/Test_balloon_eval_term_01.dump
+
+Patch 8.1.1301
+Problem: When compiled with VIMDLL some messages are not shown.
+Solution: Set/reset gui.in_use and gui.starting as needed. (Ken Takata,
+ closes #4361)
+Files: src/gui_w32.c, src/main.c, src/message.c
+
+Patch 8.1.1302
+Problem: v:beval_text is not tested in Visual mode.
+Solution: Add a screenshot of the balloon in Visual mode.
+Files: src/testdir/test_balloon.vim, src/normal.c,
+ src/testdir/dumps/Test_balloon_eval_term_01.dump,
+ src/testdir/dumps/Test_balloon_eval_term_02.dump
+
+Patch 8.1.1303
+Problem: Not possible to hide a balloon.
+Solution: Hide the balloon when balloon_show() is called with an empty
+ string or list. Add balloon_gettext().
+Files: src/evalfunc.c, src/popupmnu.c, src/gui_beval.c, src/gui_w32.c,
+ src/beval.h, src/testdir/test_balloon.vim, runtime/doc/eval.txt
+
+Patch 8.1.1304
+Problem: MS-Windows: compiler warning for unused value.
+Solution: Adjust #ifdefs. (Ken Takata, closes #4363)
+Files: src/gui.c
+
+Patch 8.1.1305
+Problem: There is no easy way to manipulate environment variables.
+Solution: Add environ(), getenv() and setenv(). (Yasuhiro Matsumoto,
+ closes #2875)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/testdir/Make_all.mak, src/testdir/test_environ.vim
+
+Patch 8.1.1306
+Problem: Borland support is outdated and doesn't work.
+Solution: Remove Borland support, there are other (free) compilers
+ available. (Thomas Dziedzic, Ken Takata, closes #4364)
+Files: .gitignore, .hgignore, Filelist, runtime/doc/debug.txt,
+ runtime/doc/develop.txt, runtime/doc/usr_90.txt,
+ src/GvimExt/Make_bc5.mak, src/GvimExt/gvimext.cpp,
+ src/GvimExt/gvimext.rc, src/INSTALLpc.txt, src/Make_bc5.mak,
+ src/dosinst.c, src/dosinst.h, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_getln.c, src/gui_w32.c, src/if_ole.cpp, src/if_py_both.h,
+ src/main.c, src/mark.c, src/message.c, src/misc1.c, src/misc2.c,
+ src/normal.c, src/option.c, src/os_mswin.c, src/os_w32exe.c,
+ src/os_win32.c, src/os_win32.h, src/proto.h, src/screen.c,
+ src/spell.c, src/spellfile.c, src/syntax.c, src/userfunc.c,
+ src/vim.h, src/vim.rc, src/vimrun.c, src/xxd/Make_bc5.mak,
+ src/xxd/xxd.c
+
+Patch 8.1.1307
+Problem: Cannot reconnect to the X server after it restarted.
+Solution: Add the :xrestore command. (Adrian Kocis, closes #844)
+Files: runtime/doc/index.txt, runtime/doc/various.txt, src/os_unix.c,
+ src/proto/os_unix.pro, src/globals.h, src/ex_cmds.h,
+ src/ex_cmdidxs.h, src/ex_docmd.c, src/testdir/test_paste.vim
+
+Patch 8.1.1308
+Problem: The Normal highlight is not defined when compiled with GUI.
+Solution: Always define Normal. (Christian Brabandt, closes #4072)
+Files: runtime/doc/syntax.txt, src/syntax.c,
+ src/testdir/test_highlight.vim
+
+Patch 8.1.1309 (after 8.1.1308)
+Problem: Test for Normal highlight fails on MS-Windows GUI.
+Solution: Skip the test for MS-Windows GUI.
+Files: src/testdir/test_highlight.vim
+
+Patch 8.1.1310
+Problem: Named function arguments are never optional.
+Solution: Support optional function arguments with a default value. (Andy
+ Massimino, closes #3952)
+Files: runtime/doc/eval.txt, src/structs.h,
+ src/testdir/test_user_func.vim, src/userfunc.c
+
+Patch 8.1.1311
+Problem: Aborting an autocmd with an exception is not tested.
+Solution: Add a test. Also shows how to abort a command by throwing an
+ exception.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.1.1312
+Problem: Coverity warning for using uninitialized variable.
+Solution: Clear exarg_T.
+Files: src/quickfix.c, src/channel.c, src/ex_cmds2.c
+
+Patch 8.1.1313
+Problem: Warnings for using localtime() and ctime().
+Solution: Use localtime_r() if available. Avoid using ctime().
+Files: src/configure.ac, src/auto/configure, src/config.h.in,
+ src/evalfunc.c, src/nbdebug.c, src/undo.c, src/memline.c,
+ src/proto/memline.pro, src/hardcopy.c
+
+Patch 8.1.1314
+Problem: MSVC makefile is not nicely indented.
+Solution: Adjust spaces in preprocessor directives. (Ken Takata)
+Files: src/Make_mvc.mak
+
+Patch 8.1.1315
+Problem: There is always a delay if a termrequest is never answered.
+Solution: When the response is not received within two seconds consider the
+ request to have failed.
+Files: src/term.c
+
+Patch 8.1.1316
+Problem: Duplicated localtime() call.
+Solution: Delete one.
+Files: src/undo.c
+
+Patch 8.1.1317
+Problem: Output from Travis can be improved.
+Solution: Add section headers. Handle errors better. (Ozaki Kiichi,
+ closes #4098)
+Files: .travis.yml, configure
+
+Patch 8.1.1318
+Problem: Code for text changes is in a "misc" file.
+Solution: Move the code to change.c.
+Files: src/misc1.c, src/proto/misc1.pro, src/change.c,
+ src/proto/change.pro, src/proto.h, src/memline.c, Filelist,
+ src/Make_cyg_ming.mak, src/Make_dice.mak, src/Make_manx.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_sas.mak,
+ src/Make_vms.mms, src/Makefile, src/README.md
+
+Patch 8.1.1319
+Problem: Computing function length name in many places.
+Solution: compute name length in call_func().
+Files: src/eval.c, src/userfunc.c, src/channel.c, src/evalfunc.c,
+ src/ex_cmds2.c, src/regexp.c, src/terminal.c
+
+Patch 8.1.1320
+Problem: It is not possible to track changes to a buffer.
+Solution: Add listener_add() and listener_remove(). No docs or tests yet.
+Files: src/structs.h, src/change.c, src/proto/change.pro
+
+Patch 8.1.1321
+Problem: No docs or tests for listener functions.
+Solution: Add help and tests for listener_add() and listener_remove().
+ Invoke the callbacks before redrawing.
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt,
+ src/testdir/test_listener.vim, src/testdir/Make_all.mak,
+ src/change.c, src/screen.c, src/evalfunc.c, src/proto/evalfunc.pro
+
+Patch 8.1.1322
+Problem: Cygwin makefile is not nicely indented.
+Solution: Adjust spaces in preprocessor directives. (Ken Takata)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.1323
+Problem: 'mouse' option is reset when using GPM mouse.
+Solution: Add flag for GPM mouse.
+Files: src/term.c
+
+Patch 8.1.1324
+Problem: Stray comma in VMS makefile.
+Solution: Remove the comma. (Naruhiko Nishino, closes #4368)
+Files: src/Make_vms.mms
+
+Patch 8.1.1325
+Problem: Cannot build with +eval but without +channel and +timers. (John
+ Marriott)
+Solution: Adjust #ifdef for get_callback().
+Files: src/evalfunc.c, src/testdir/test_autocmd.vim
+
+Patch 8.1.1326
+Problem: No test for listener with partial.
+Solution: Add a test. Add example to help.
+Files: src/testdir/test_listener.vim, runtime/doc/eval.txt
+
+Patch 8.1.1327
+Problem: Unnecessary scroll after horizontal split.
+Solution: Don't adjust to fraction if all the text fits in the window.
+ (Martin Kunev, closes #4367)
+Files: src/testdir/test_window_cmd.vim, src/window.c
+
+Patch 8.1.1328
+Problem: No test for listener with undo operation.
+Solution: Add a test.
+Files: src/testdir/test_listener.vim
+
+Patch 8.1.1329
+Problem: Plans for popup window support are spread out.
+Solution: Add a first version of the popup window help.
+Files: runtime/doc/popup.txt, runtime/doc/Makefile, runtime/doc/help.txt
+
+Patch 8.1.1330
+Problem: Using bold attribute in terminal changes the color. (Jason
+ Franklin)
+Solution: Don't set the "bold-highbright" flag in vterm unless the terminal
+ supports less than 16 colors.
+Files: src/terminal.c, src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_all_ansi_colors.dump
+
+Patch 8.1.1331
+Problem: Test 29 is old style.
+Solution: Turn it into a new style test. (Yegappan Lakshmanan, closes #4370)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test29.in, src/testdir/test29.ok,
+ src/testdir/test_backspace_opt.vim, src/testdir/test_join.vim
+
+Patch 8.1.1332
+Problem: Cannot flush change listeners without also redrawing. The line
+ numbers in the list of changes may become invalid.
+Solution: Add listener_flush(). Invoke listeners before adding a change
+ that makes line numbers invalid.
+Files: src/evalfunc.c, src/change.c, src/proto/change.pro,
+ src/screen.c, runtime/doc/eval.txt, src/testdir/test_listener.vim
+
+Patch 8.1.1333
+Problem: Text properties don't always move after changes.
+Solution: Update properties before reporting changes to listeners. Move text
+ property when splitting a line.
+Files: src/change.c, src/ex_cmds.c, src/textprop.c,
+ src/proto/textprop.pro, src/testdir/test_textprop.vim
+
+Patch 8.1.1334
+Problem: When buffer is hidden "F" in 'shortmess' is not used.
+Solution: Check the "F" flag in 'shortmess' when the buffer is already
+ loaded. (Jason Franklin) Add test_getvalue() to be able to test
+ this.
+Files: src/buffer.c, src/evalfunc.c, src/testdir/test_options.vim,
+ runtime/doc/eval.txt
+
+Patch 8.1.1335
+Problem: Listener callback is called after inserting text.
+Solution: Flush the changes before inserting or deleting a line. Store
+ changes per buffer.
+Files: src/change.c, src/proto/change.pro, src/memline.c,
+ src/structs.h, src/testdir/test_listener.vim
+
+Patch 8.1.1336
+Problem: Some eval functionality is not covered by tests.
+Solution: Add a few more test cases. (Masato Nishihata, closes #4374)
+Files: src/testdir/test_bufline.vim, src/testdir/test_cindent.vim,
+ src/testdir/test_cursor_func.vim, src/testdir/test_delete.vim,
+ src/testdir/test_expand_func.vim, src/testdir/test_float_func.vim,
+ src/testdir/test_fnamemodify.vim, src/testdir/test_functions.vim
+
+Patch 8.1.1337
+Problem: Get empty text prop when splitting line just after text prop.
+Solution: Do not create an empty text prop at the start of the line.
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.1.1338
+Problem: Hang when concealing the '>' shown for a wide char that doesn't
+ fit in the last cell.
+Solution: Put back the pointer when the '>' is not going to be displayed.
+ (closes #4377)
+Files: src/screen.c
+
+Patch 8.1.1339
+Problem: Installer needs to product name et al.
+Solution: Add a few lines to the NSIS installer script. (Ken Takata)
+Files: nsis/gvim.nsi
+
+Patch 8.1.1340
+Problem: Attributes from 'cursorline' overwrite textprop.
+Solution: Combine the attributes. (closes #3912)
+Files: src/screen.c, src/textprop.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.1341
+Problem: Text properties are lost when joining lines.
+Solution: Move the text properties to the joined line.
+Files: src/ops.c, src/textprop.c, src/proto/textprop.pro,
+ src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.1342
+Problem: Using freed memory when joining line with text property.
+Solution: Use already computed length.
+Files: src/ops.c
+
+Patch 8.1.1343
+Problem: Text properties not adjusted for Visual block mode delete.
+Solution: Call adjust_prop_columns(). (closes #4384)
+Files: src/ops.c, src/textprop.c, src/testdir/test_textprop.vim,
+ src/misc1.c, src/testdir/dumps/Test_textprop_vis_01.dump,
+ src/testdir/dumps/Test_textprop_vis_02.dump
+
+Patch 8.1.1344
+Problem: Coverity complains about possibly using a NULL pointer and copying
+ a string into a fixed size buffer.
+Solution: Check for NULL, even though it should not happen. Use
+ vim_strncpy() instead of strcpy().
+Files: src/change.c, src/memline.c
+
+Patch 8.1.1345
+Problem: Stuck in sandbox with ":s/../\=Function/gn".
+Solution: Don't skip over code to restore sandbox. (Christian Brabandt)
+Files: src/ex_cmds.c, src/testdir/test_substitute.vim
+
+Patch 8.1.1346
+Problem: Error for Python exception does not show useful info.
+Solution: Show the last line instead of the first one. (Ben Jackson,
+ closes #4381)
+Files: src/if_py_both.h, src/testdir/test86.ok, src/testdir/test87.ok,
+ src/testdir/test_python2.vim, src/testdir/test_python3.vim,
+ src/testdir/test_pyx2.vim, src/testdir/test_pyx3.vim
+
+Patch 8.1.1347 (after 8.1.1327)
+Problem: Fractional scroll position not restored after closing window.
+Solution: Do restore fraction if topline is not one.
+Files: src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 8.1.1348
+Problem: Running tests may cause the window to move.
+Solution: Correct the reported window position for the offset with the
+ position after ":winpos". Works around an xterm bug.
+Files: src/testdir/test_edit.vim
+
+Patch 8.1.1349
+Problem: If writing runs into a conversion error the backup file is
+ deleted. (Arseny Nasokin)
+Solution: Don't delete the backup file is the file was overwritten and a
+ conversion error occurred. (Christian Brabandt, closes #4387)
+Files: src/fileio.c, src/testdir/test_writefile.vim
+
+Patch 8.1.1350
+Problem: "W" for wrapping not shown when more than 99 matches.
+Solution: Adjust check for length. (Masato Nishihata, closes #4388)
+Files: src/search.c, src/testdir/test_search_stat.vim
+
+Patch 8.1.1351
+Problem: Text property wrong after :substitute.
+Solution: Save for undo before changing any text properties.
+Files: src/testdir/test_textprop.vim, src/ex_cmds.c, src/textprop.c,
+ src/proto/textprop.pro, src/change.c, src/edit.c, src/misc1.c,
+ src/ops.c
+
+Patch 8.1.1352
+Problem: Undofile() reports wrong name. (Francisco Giordano)
+Solution: Clean up the name before changing path separators. (closes #4392,
+ closes #4394)
+Files: src/evalfunc.c, src/testdir/test_undo.vim
+
+Patch 8.1.1353 (after 8.1.1352)
+Problem: Undo test fails on Mac.
+Solution: Expect "private" on the Mac.
+Files: src/testdir/test_undo.vim
+
+Patch 8.1.1354
+Problem: Getting a list of text lines is clumsy.
+Solution: Add the =<< assignment. (Yegappan Lakshmanan, closes #4386)
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_let.vim
+
+Patch 8.1.1355
+Problem: Obvious mistakes are accepted as valid expressions.
+Solution: Be more strict about parsing numbers. (Yasuhiro Matsumoto,
+ closes #3981)
+Files: src/charset.c, src/eval.c, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_getln.c, src/json.c, src/misc2.c, src/ops.c, src/option.c,
+ src/proto/charset.pro, src/testdir/test_expr.vim,
+ src/testdir/test_json.vim
+
+Patch 8.1.1356
+Problem: Some text in heredoc assignment ends the text. (Ozaki Kiichi)
+Solution: Recognize "let v =<<" and skip until the end.
+Files: src/userfunc.c, src/testdir/test_let.vim
+
+Patch 8.1.1357
+Problem: Test 37 is old style.
+Solution: Turn it into a new style test. (Yegappan Lakshmanan, closes #4398)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test37.in, src/testdir/test37.ok,
+ src/testdir/test_scrollbind.vim
+
+Patch 8.1.1358
+Problem: Cannot enter character with a CSI byte.
+Solution: Only check "gui.in_use" when VIMDLL is defined. (Ken Takata,
+ closes #4396)
+Files: src/getchar.c
+
+Patch 8.1.1359
+Problem: Text property wrong after :substitute with backslash.
+Solution: Adjust text property columns when removing backslashes.
+ (closes #4397)
+Files: src/ex_cmds.c, src/testdir/test_textprop.vim, src/vim.h,
+ src/textprop.c, src/proto/textprop.pro, src/change.c, src/edit.c,
+ src/misc1.c, src/ops.c
+
+Patch 8.1.1360 (after Patch 8.1.1345)
+Problem: Buffer left 'nomodifiable' after :substitute. (Ingo Karkat)
+Solution: Save the value of 'modifiable' earlier. (Christian Brabandt,
+ closes #4403)
+Files: src/ex_cmds.c, src/testdir/test_substitute.vim
+
+Patch 8.1.1361
+Problem: Python setuptools don't work with Python 3.
+Solution: Add dummy implementation for find_module. (Joel Frederico,
+ closes #4402, closes #3984)
+Files: src/if_py_both.h
+
+Patch 8.1.1362
+Problem: Code and data in tests can be hard to read.
+Solution: Use the new heredoc style. (Yegappan Lakshmanan, closes #4400)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_balloon.vim,
+ src/testdir/test_bufline.vim, src/testdir/test_cindent.vim,
+ src/testdir/test_conceal.vim, src/testdir/test_exit.vim,
+ src/testdir/test_fold.vim, src/testdir/test_goto.vim,
+ src/testdir/test_join.vim, src/testdir/test_mksession_utf8.vim,
+ src/testdir/test_normal.vim, src/testdir/test_profile.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_startup.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_xxd.vim
+
+Patch 8.1.1363
+Problem: ":vert options" does not make a vertical split.
+Solution: Pass the right modifiers in $OPTWIN_CMD. (Ken Takata,
+ closes #4401)
+Files: src/ex_cmds2.c, src/testdir/test_options.vim
+
+Patch 8.1.1364
+Problem: Design for popup window support needs more details.
+Solution: Add details about using a window and buffer. Rename popup_show()
+ to popup_create() and add popup_show() and popup_hide().
+Files: runtime/doc/popup.txt
+
+Patch 8.1.1365
+Problem: Source command doesn't check for the sandbox. (Armin Razmjou)
+Solution: Check for the sandbox when sourcing a file.
+Files: src/getchar.c, src/testdir/test_source.vim
+
+Patch 8.1.1366
+Problem: Using expressions in a modeline is unsafe.
+Solution: Disallow using expressions in a modeline, unless the
+ 'modelineexpr' option is set. Update help, add more tests.
+Files: runtime/doc/options.txt, src/option.c, src/option.h,
+ src/testdir/test_modeline.vim, src/testdir/test49.in
+
+Patch 8.1.1367 (after 8.1.1366)
+Problem: can set 'modelineexpr' in modeline.
+Solution: Add P_SECURE flag.
+Files: src/option.c, src/testdir/test_modeline.vim
+
+Patch 8.1.1368 (after 8.1.1366)
+Problem: Modeline test fails with python but without pythonhome.
+Solution: Correct test argument.
+Files: src/testdir/test_modeline.vim
+
+Patch 8.1.1369
+Problem: Get E484 when using system() during GUI startup.
+Solution: Check "gui.starting". (Ken Takata)
+Files: src/os_win32.c
+
+Patch 8.1.1370
+Problem: Not using the new github feature for donations.
+Solution: Add a Sponsor button. (closes #4417)
+Files: .github/FUNDING.yml
+
+Patch 8.1.1371
+Problem: Cannot recover from a swap file.
+Solution: Do not expand environment variables in the swap file name.
+ Do not check the extension when we already know a file is a swap
+ file. (Ken Takata, closes #4415, closes #4369)
+Files: src/buffer.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/gui.c, src/if_cscope.c, src/main.c, src/memline.c,
+ src/misc1.c, src/proto/memline.pro, src/proto/misc1.pro,
+ src/search.c, src/spell.c, src/spellfile.c, src/tag.c,
+ src/testdir/test_swap.vim, src/vim.h
+
+Patch 8.1.1372
+Problem: When evaluating 'statusline' the current window is unknown.
+ (Daniel Hahler)
+Solution: Set "g:actual_curwin" for %{} items. Set "g:statusline_winid"
+ when evaluating %!. (closes #4406, closes #3299)
+Files: src/buffer.c, runtime/doc/options.txt,
+ src/testdir/test_statusline.vim
+
+Patch 8.1.1373
+Problem: "[p" in Visual mode puts in wrong line.
+Solution: Call nv_put() instead of duplicating the functionality.
+ (closes #4408)
+Files: src/normal.c, src/testdir/test_put.vim
+
+Patch 8.1.1374
+Problem: Check for file changed triggers too often.
+Solution: Don't use "b_p_ar" when it is negative.
+Files: src/fileio.c
+
+Patch 8.1.1375
+Problem: Without "TS" in 'shortmess' get a hit-enter prompt often.
+Solution: Always truncate the search message. Also avoid putting it in the
+ message history. (closes #4413)
+Files: src/search.c, src/main.c, src/testdir/test_search_stat.vim
+
+Patch 8.1.1376
+Problem: Warnings for size_t/int mixups.
+Solution: Change types, add type casts. (Mike Williams)
+Files: src/search.c, src/textprop.c
+
+Patch 8.1.1377
+Problem: MS-Windows GUI uses wrong shell command for bash. (Robert Bogomip)
+Solution: Check that 'shellcmdflag' is "/c". (Ken Takata, closes #4418)
+Files: src/os_win32.c
+
+Patch 8.1.1378
+Problem: Delete() can not handle a file name that looks like a pattern.
+Solution: Use readdir() instead of appending "/*" and expanding wildcards.
+ (Ken Takata, closes #4424, closes #696)
+Files: src/testdir/test_functions.vim, src/evalfunc.c, src/fileio.c,
+ src/proto/fileio.pro
+
+Patch 8.1.1379 (after 8.1.1374)
+Problem: Filechanged test hangs.
+Solution: Do not check 'autoread'.
+Files: src/fileio.c, src/testdir/test_filechanged.vim
+
+Patch 8.1.1380
+Problem: MS-Windows building VIMDLL with MSVC: SUBSYSTEM is not set.
+Solution: Invert condition. (Ken Takata, closes #4422)
+Files: src/Make_mvc.mak
+
+Patch 8.1.1381
+Problem: MS-Windows: missing build dependency.
+Solution: Make gui_dwrite.cpp depend on gui_dwrite.h. (Ken Takata,
+ closes #4423)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.1.1382
+Problem: Error when editing test file.
+Solution: Remove part of modeline.
+Files: src/testdir/test_vimscript.vim, src/testdir/test49.vim,
+ src/testdir/test49.in
+
+Patch 8.1.1383
+Problem: Warning for size_t/int mixup.
+Solution: Change type. (Mike Williams)
+Files: src/search.c
+
+Patch 8.1.1384
+Problem: Using "int" for alloc() often results in compiler warnings.
+Solution: Use "size_t" and remove type casts. Remove alloc_check(), Vim
+ only works with 32 bit ints anyway.
+Files: src/misc2.c, src/proto/misc2.pro, src/change.c, src/ex_cmds.c,
+ src/netbeans.c, src/autocmd.c, src/buffer.c, src/change.c,
+ src/channel.c, src/charset.c, src/debugger.c, src/dict.c,
+ src/diff.c, src/digraph.c, src/edit.c, src/eval.c, src/evalfunc.c,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c,
+ src/ex_getln.c, src/fileio.c, src/findfile.c, src/fold.c,
+ src/getchar.c, src/gui.c, src/gui_at_fs.c, src/gui_gtk.c,
+ src/gui_gtk_x11.c, src/gui_motif.c, src/gui_w32.c, src/hashtab.c,
+ src/if_cscope.c, src/if_perlsfio.c, src/if_python3.c,
+ src/if_xcmdsrv.c, src/indent.c, src/insexpand.c, src/main.c,
+ src/mbyte.c, src/memfile.c, src/memline.c, src/menu.c,
+ src/message.c, src/misc1.c, src/misc2.c, src/netbeans.c,
+ src/ops.c, src/option.c, src/os_amiga.c, src/os_mswin.c,
+ src/os_unix.c, src/os_vms.c, src/os_win32.c, src/quickfix.c,
+ src/regexp.c, src/screen.c, src/spell.c, src/spellfile.c,
+ src/syntax.c, src/term.c, src/undo.c, src/usercmd.c,
+ src/userfunc.c, src/version.c, src/winclip.c
+
+Patch 8.1.1385
+Problem: Signed/unsigned compiler warning.
+Solution: Use STRLEN() instead of strlen().
+Files: src/fileio.c
+
+Patch 8.1.1386
+Problem: Unnecessary type casts for lalloc().
+Solution: Remove type casts. Change lalloc(size, TRUE) to alloc(size).
+Files: src/buffer.c, src/change.c, src/channel.c, src/diff.c, src/edit.c,
+ src/eval.c, src/ex_cmds.c, src/ex_getln.c, src/fileio.c,
+ src/getchar.c, src/gui_mac.c, src/insexpand.c, src/gui_w32.c,
+ src/gui_x11.c, src/menu.c, src/netbeans.c, src/ops.c,
+ src/os_mswin.c, src/os_amiga.c, src/os_qnx.c, src/os_unix.c,
+ src/os_win32.c, src/popupmnu.c, src/quickfix.c, src/regexp.c,
+ src/regexp_nfa.c, src/screen.c, src/search.c, src/sign.c,
+ src/spell.c, src/spellfile.c, src/syntax.c, src/tag.c,
+ src/terminal.c, src/textprop.c, src/ui.c, src/undo.c,
+ src/userfunc.c, src/winclip.c, src/window.c
+
+Patch 8.1.1387
+Problem: Calling prop_add() in an empty buffer doesn't work. (Dominique
+ Pelle)
+Solution: Open the memline before adding a text property. (closes #4412)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.1.1388
+Problem: Errors when calling prop_remove() for an unloaded buffer.
+Solution: Bail out when the buffer is not loaded. Add a few more tests for
+ failing when the buffer number is invalid.
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.1.1389
+Problem: Changes are not flushed when end and start overlap. (Paul Jolly)
+Solution: When end of a previous changes overlaps with start of a new
+ change, first flush listeners.
+Files: src/change.c, src/testdir/test_listener.vim
+
+Patch 8.1.1390
+Problem: Search stats are off when using count or offset.
+Solution: Recompute the stats when needed. (Masato Nishihata, closes #4410)
+Files: src/testdir/test_search_stat.vim, src/search.c
+
+Patch 8.1.1391
+Problem: No popup window support.
+Solution: Add initial code for popup windows. Add the 'wincolor' option.
+Files: Filelist, runtime/doc/popup.txt, runtime/doc/options.txt,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Make_vms.mms,
+ src/Makefile, src/autocmd.c, src/buffer.c, src/ex_cmds.h,
+ src/ex_cmdidxs.h, src/proto/buffer.pro, src/eval.c src/evalfunc.c
+ src/feature.h, src/globals.h, src/option.c, src/option.h,
+ src/popupwin.c, src/proto.h, src/proto/popupwin.pro,
+ src/proto/window.pro, src/screen.c, src/structs.h, src/terminal.c,
+ src/testdir/Make_all.mak, src/testdir/dumps/Test_popupwin_01.dump,
+ src/testdir/test_popupwin.vim, src/vim.h, src/window.c
+
+Patch 8.1.1392 (after 8.1.1391)
+Problem: Build failure in tiny version.
+Solution: Define ex_popupclear to ex_ni if not implemented. Add UNUSED.
+Files: src/ex_docmd.c, src/window.c
+
+Patch 8.1.1393
+Problem: Unnecessary type casts.
+Solution: Remove type casts from alloc() and lalloc() calls. (Mike Williams)
+Files: src/channel.c, src/crypt.c, src/dict.c, src/dosinst.c,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/ex_getln.c, src/fileio.c, src/findfile.c, src/if_ole.cpp,
+ src/if_py_both.h, src/list.c, src/message.c, src/misc1.c,
+ src/misc2.c, src/ops.c, src/os_vms.c, src/os_win32.c,
+ src/quickfix.c, src/regexp_nfa.c, src/screen.c, src/search.c,
+ src/sign.c, src/syntax.c, src/tag.c, src/term.c, src/terminal.c,
+ src/textprop.c
+
+Patch 8.1.1394
+Problem: Not restoring t_F2 in registers test.
+Solution: Assign to &t_F2 instead of t_F2. (Andy Massimino, closes #4434)
+Files: src/testdir/test_registers.vim
+
+Patch 8.1.1395
+Problem: Saving for undo may access invalid memory. (Dominique Pelle)
+Solution: Set ml_line_len also when returning a constant string.
+Files: src/memline.c, src/testdir/test_textprop.vim
+
+Patch 8.1.1396
+Problem: 'wincolor' does not apply to lines below the buffer.
+Solution: Also apply 'wincolor' to the "~" lines and the number column.
+Files: src/screen.c, src/testdir/test_highlight.vim,
+ src/testdir/dumps/Test_wincolor_01.dump
+
+Patch 8.1.1397
+Problem: Build fails in tiny version.
+Solution: Always define hl_combine_attr().
+Files: src/syntax.c
+
+Patch 8.1.1398
+Problem: Duplicate line in MSVC build file.
+Solution: Remove the line. (Ken Takata, closes #4436)
+Files: src/Make_mvc.mak
+
+Patch 8.1.1399
+Problem: Popup windows not adjusted when switching tabs.
+Solution: Save and restore first_tab_popupwin. Fix closing a tabpage.
+Files: src/window.c, src/popupwin.c, src/proto/popupwin.pro,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_02.dump,
+ src/testdir/dumps/Test_popupwin_03.dump,
+ src/testdir/dumps/Test_popupwin_04.dump
+
+Patch 8.1.1400
+Problem: Using global pointer for tab-local popups is clumsy.
+Solution: Use the pointer in tabpage_T.
+Files: src/popupwin.c, src/globals.h, src/eval.c, src/screen.c,
+ src/window.c
+
+Patch 8.1.1401
+Problem: Misspelled mkspellmem as makespellmem.
+Solution: Drop duplicate help entry, fix test. (Naruhiko Nishino, Yasuhiro
+ Matsumoto, closes #4437)
+Files: runtime/doc/options.txt, src/testdir/test_modeline.vim
+
+Patch 8.1.1402
+Problem: "timer" option of popup windows not supported.
+Solution: Implement the "timer" option. (Yasuhiro Matsumoto, closes #4439)
+Files: src/structs.h, src/testdir/test_popupwin.vim, src/popupwin.c,
+ src/window.c, runtime/doc/popup.txt
+
+Patch 8.1.1403
+Problem: Cannot build without the timer feature.
+Solution: Add #ifdef.
+Files: src/structs.h, src/window.c, src/popupwin.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1404
+Problem: Cannot change the patch level when building with NSIS.
+Solution: Use $PATCHLEVEL if defined. (Christian Brabandt)
+Files: nsis/gvim.nsi
+
+Patch 8.1.1405
+Problem: "highlight" option of popup windows not supported.
+Solution: Implement the "highlight" option.
+Files: src/option.c, src/proto/option.pro, src/diff.c src/popupwin.c,
+ runtime/doc/popup.txt, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_01.dump,
+ src/testdir/dumps/Test_popupwin_03.dump
+
+Patch 8.1.1406
+Problem: popup_hide() and popup_show() not implemented yet.
+Solution: Implement the functions.
+Files: src/popupwin.c, src/proto/popupwin.pro, src/evalfunc.c,
+ src/structs.h, runtime/doc/popup.txt, src/screen.c, src/vim.h,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1407
+Problem: Popup_create() does not support text properties.
+Solution: Support the third form of the text argument.
+Files: src/textprop.c, src/proto/textprop.pro, src/popupwin.c,
+ src/testdir/test_popupwin.vim, src/screen.c,
+ src/testdir/dumps/Test_popupwin_02.dump,
+ src/testdir/dumps/Test_popupwin_03.dump,
+ src/testdir/dumps/Test_popupwin_04.dump,
+ runtime/doc/popup.txt
+
+Patch 8.1.1408
+Problem: PFL_HIDDEN conflicts with system header file. (Ken Takata)
+Solution: Rename to POPF_HIDDEN.
+Files: src/popupwin.c, src/screen.c, src/vim.h
+
+Patch 8.1.1409
+Problem: Coverity warns for using uninitialized memory.
+Solution: Add a condition to clearing the growarray.
+Files: src/json.c
+
+Patch 8.1.1410
+Problem: Popup_move() is not implemented yet.
+Solution: Implement it. (Yasuhiro Matsumoto, closes #4441) Improve the
+ positioning and resizing.
+Files: runtime/doc/popup.txt, src/evalfunc.c, src/popupwin.c,
+ src/screen.c, src/structs.h, src/proto/popupwin.pro,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_05.dump
+
+Patch 8.1.1411
+Problem: Coverity warns for divide by zero.
+Solution: Make sure width is larger than zero.
+Files: src/charset.c
+
+Patch 8.1.1412
+Problem: Test 30 is old style.
+Solution: Turn it into a new style test. (Yegappan Lakshmanan, closes #4440)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test30.in, src/testdir/test30.ok,
+ src/testdir/test_fileformat.vim
+
+Patch 8.1.1413
+Problem: Error when the drive of the swap file was disconnected.
+Solution: Try closing and re-opening the swap file. (partly by Joe Orost,
+ closes #4378)
+Files: src/memfile.c, src/structs.h, src/testdir/test_startup.vim
+
+Patch 8.1.1414
+Problem: Alloc() returning "char_u *" causes a lot of type casts.
+Solution: Have it return "void *". (Mike Williams) Define ALLOC_ONE() to
+ check the simple allocations.
+Files: src/autocmd.c, src/blob.c, src/blowfish.c, src/buffer.c,
+ src/change.c, src/channel.c, src/crypt.c, src/crypt_zip.c,
+ src/dict.c, src/diff.c, src/eval.c, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c, src/ex_getln.c,
+ src/fileio.c, src/findfile.c, src/getchar.c, src/gui_gtk.c,
+ src/gui_gtk_x11.c, src/gui_mac.c, src/gui_motif.c,
+ src/gui_photon.c, src/gui_w32.c, src/gui_x11.c, src/hardcopy.c,
+ src/hashtab.c, src/if_cscope.c, src/if_mzsch.c, src/if_perlsfio.c,
+ src/if_py_both.h, src/if_python3.c, src/if_xcmdsrv.c,
+ src/insexpand.c, src/list.c, src/mark.c, src/mbyte.c,
+ src/memfile.c, src/memfile_test.c, src/memline.c, src/message.c,
+ src/misc2.c, src/netbeans.c, src/normal.c, src/ops.c,
+ src/option.c, src/os_amiga.c, src/os_mac_conv.c, src/os_mswin.c,
+ src/os_unix.c, src/os_vms.c, src/os_win32.c, src/popupmnu.c,
+ src/proto/misc2.pro, src/quickfix.c, src/regexp.c,
+ src/regexp_nfa.c, src/screen.c, src/search.c, src/sign.c,
+ src/spell.c, src/spellfile.c, src/syntax.c, src/tag.c, src/term.c,
+ src/terminal.c, src/textprop.c, src/ui.c, src/undo.c,
+ src/userfunc.c, src/version.c, src/winclip.c, src/window.c,
+ src/vim.h, src/testdir/test_cscope.vim
+
+Patch 8.1.1415 (after 8.1.1414)
+Problem: Build error in MS-Windows GUI.
+Solution: Fix the LALLOC_MULT() argument.
+Files: src/gui_w32.c
+
+Patch 8.1.1416
+Problem: Popup_getposition() not implemented yet.
+Solution: Implement it. (Yasuhiro Matsumoto, closes #4449)
+Files: runtime/doc/popup.txt, src/evalfunc.c, src/popupwin.c,
+ src/proto/popupwin.pro, src/testdir/test_popupwin.vim
+
+Patch 8.1.1417
+Problem: MS-Windows: resolve() does not resolve all components of the path.
+ (David Briscoe)
+Solution: Do not bail out for a reparse point. (Yasuhiro Matsumoto,
+ closes #4211, closes #4447)
+Files: src/os_mswin.c, src/testdir/test_functions.vim
+
+Patch 8.1.1418
+Problem: Win_execute() is not implemented yet.
+Solution: Implement it.
+Files: src/evalfunc.c, src/popupwin.c, src/testdir/test_execute_func.vim,
+ runtime/doc/popup.txt, runtime/doc/eval.txt
+
+Patch 8.1.1419
+Problem: Listener callbacks may be called recursively.
+Solution: Set "updating_screen" while listener callbacks are invoked.
+Files: src/change.c, src/screen.c, src/proto/screen.pro, src/ui.c
+
+Patch 8.1.1420
+Problem: Popup window size only uses first line length.
+Solution: Use the longest line. (Ben Jackson, closes #4451) Also deal with
+ wrapping lines.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1421
+Problem: Drawing "~" line in popup window.
+Solution: Just draw text in the last line of the popup window.
+Files: src/screen.c, src/structs.h, src/popupwin.c,
+ src/proto/popupwin.pro, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_05.dump,
+ src/testdir/dumps/Test_popupwin_06.dump
+
+Patch 8.1.1422
+Problem: Popup_getoptions() not implemented yet.
+Solution: Implement it. (closes #4452)
+Files: runtime/doc/popup.txt, src/evalfunc.c, src/popupwin.c,
+ src/proto/popupwin.pro, src/testdir/test_popupwin.vim
+
+Patch 8.1.1423
+Problem: Popup windows use options from current window and buffer.
+Solution: Clear all local options when creating a popup window.
+Files: src/popupwin.c, src/option.c, src/proto/option.pro,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1424
+Problem: Crash when popup menu is deleted while waiting for char.
+Solution: Bail out when pum_array was cleared.
+Files: src/popupmnu.c
+
+Patch 8.1.1425
+Problem: Win_execute() does not set window pointers properly.
+Solution: Use switch_win_noblock(). Also execute autocommands in a popup
+ window.
+Files: src/window.c, src/proto/window.pro, src/evalfunc.c, src/autocmd.c
+
+Patch 8.1.1426
+Problem: No test for syntax highlight in popup window.
+Solution: Add a screenshot test. Update associated documentation. Avoid
+ 'buftype' being reset by setbufvar().
+Files: runtime/doc/eval.txt, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_10.dump,
+ src/testdir/dumps/Test_popupwin_11.dump
+
+Patch 8.1.1427 (after 8.1.1426)
+Problem: Popup window screenshot test fails.
+Solution: Add missing change to popup window code.
+Files: src/popupwin.c
+
+Patch 8.1.1428
+Problem: Popup_atcursor() not implemented yet.
+Solution: Implement it. (Yasuhiro Matsumoto, closes #4456)
+Files: runtime/doc/popup.txt, src/evalfunc.c, src/popupwin.c,
+ src/proto/popupwin.pro, src/testdir/test_popupwin.vim
+
+Patch 8.1.1429
+Problem: "pos" option of popup window not supported yet.
+Solution: Implement the option. Rename popup_getposition() to
+ popup_getpos().
+Files: src/structs.h, src/popupwin.c, src/proto/popupwin.pro,
+ runtime/doc/popup.txt
+
+Patch 8.1.1430
+Problem: Popup window option "wrap" not supported.
+Solution: Implement it.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_wrap.dump,
+ src/testdir/dumps/Test_popupwin_nowrap.dump
+
+Patch 8.1.1431
+Problem: Popup window listed as "Scratch".
+Solution: List them as "Popup".
+Files: src/buffer.c, src/popupwin.c, src/testdir/test_popupwin.vim,
+ runtime/doc/popup.txt, runtime/doc/windows.txt
+
+Patch 8.1.1432 (after 8.1.1429)
+Problem: Can't build with eval feature.
+Solution: Add missing rename.
+Files: src/evalfunc.c
+
+Patch 8.1.1433
+Problem: Win_execute() may leave popup window focused, eventually leading
+ to a crash. (Bjorn Linse)
+Solution: When previous window was closed, go to the first window.
+Files: src/window.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1434
+Problem: Test 3 is old style.
+Solution: Turn into a new style test. (Yegappan Lakshmanan, closes #4460)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test3.in, src/testdir/test3.ok,
+ src/testdir/test_cindent.vim
+
+Patch 8.1.1435
+Problem: Memory usage test is a bit too flaky.
+Solution: Adjust the tolerances a bit. (Christian Brabandt)
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.1.1436
+Problem: Writefile test fails when run under /tmp.
+Solution: Adjust 'backupskip'. (Kenta Sato, closes #4462)
+Files: src/testdir/test_writefile.vim
+
+Patch 8.1.1437
+Problem: Code to handle callbacks is duplicated.
+Solution: Add callback_T and functions to deal with it.
+Files: src/structs.h, src/evalfunc.c, src/proto/evalfunc.pro,
+ src/change.c, src/channel.c, src/proto/channel.pro, src/buffer.c,
+ src/userfunc.c, src/proto/userfunc.pro, src/eval.c,
+ src/ex_cmds2.c, src/popupwin.c
+
+Patch 8.1.1438
+Problem: Some commands cause trouble in a popup window.
+Solution: Add NOT_IN_POPUP_WINDOW.
+Files: src/macros.h, src/popupwin.c, src/proto/popupwin.pro,
+ src/ex_docmd.c, src/ex_cmds2.c, src/window.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1439
+Problem: Json_encode() is very slow for large results.
+Solution: In the growarray use a growth of at least 50%. (Ken Takata,
+ closes #4461)
+Files: src/misc2.c
+
+Patch 8.1.1440
+Problem: Win_execute() test fails.
+Solution: Adjust the expected error number. Move to popup test.
+Files: src/testdir/test_execute_func.vim, src/testdir/test_popupwin.vim
+
+Patch 8.1.1441
+Problem: Popup window filter not yet implemented.
+Solution: Implement the popup filter.
+Files: src/structs.h, runtime/doc/popup.txt, src/popupwin.c,
+ src/proto/popupwin.pro, src/window.c, src/getchar.c, src/screen.c,
+ src/misc2.c, src/proto/misc2.pro, src/vim.h,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1442
+Problem: Popup windows not considered when the Vim window is resized.
+ (Ben Jackson)
+Solution: Reallocate the w_lines structure. (closes #4467)
+Files: src/screen.c
+
+Patch 8.1.1443
+Problem: Popup window padding and border not implemented yet.
+Solution: Implement padding and border. Add core position and size to
+ popup_getpos().
+Files: src/structs.h, src/popupwin.c, src/screen.c,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_20.dump, runtime/doc/popup.txt
+
+Patch 8.1.1444
+Problem: Not using double line characters for popup border.
+Solution: Use double line characters if using utf-8.
+Files: src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_21.dump
+
+Patch 8.1.1445
+Problem: Popup window border highlight not implemented yet.
+Solution: Implement the "borderhighlight" option.
+Files: src/structs.h, src/popupwin.c, src/window.c, src/screen.c,
+ src/testdir/test_popupwin.vim, runtime/doc/popup.txt,
+ src/testdir/dumps/Test_popupwin_22.dump
+
+Patch 8.1.1446
+Problem: Popup window callback not implemented yet.
+Solution: Implement the callback.
+Files: runtime/doc/popup.txt, src/popupwin.c, src/structs.h,
+ src/evalfunc.c, src/window.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1447
+Problem: Not allowed to create an empty popup.
+Solution: Remove restriction that there is some text. (closes #4470)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1448
+Problem: Statusline is sometimes drawn on top of popup.
+Solution: Redraw popups after the statusline. (Naruhiko Nishino,
+ closes #4468)
+Files: src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_behind.dump
+
+Patch 8.1.1449
+Problem: Popup text truncated at end of screen.
+Solution: Move popup left if needed. Add the "fixed" property to disable
+ that. (Ben Jackson, closes #4466)
+Files: runtime/doc/popup.txt, src/popupwin.c, src/structs.h,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1450
+Problem: Popup window positioning wrong when using padding or borders.
+Solution: Fix computing the position.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_corners.dump
+
+Patch 8.1.1451
+Problem: CTRL-L does not clear screen with a popup window.
+Solution: Do not change the type to NOT_VALID. Redraw all windows.
+ (closes #4471)
+Files: src/screen.c
+
+Patch 8.1.1452
+Problem: Line and col property of popup windows not properly checked.
+Solution: Check for "+" or "-" sign.
+Files: src/popupwin.c, src/dict.c, src/proto/dict.pro,
+ src/window.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1453
+Problem: Popup window "moved" property not implemented yet.
+Solution: Implement it.
+Files: src/main.c, src/edit.c, src/gui.c, src/globals.h, src/structs.h,
+ src/screen.c, src/popupwin.c, src/proto/popupwin.pro,
+ src/testdir/test_popupwin.vim, runtime/doc/popup.txt
+
+Patch 8.1.1454
+Problem: Build failure without the conceal feature.
+Solution: Remove #ifdef.
+Files: src/autocmd.c
+
+Patch 8.1.1455
+Problem: Popup_atcursor() not completely implemented.
+Solution: Add the default for the "moved" property.
+Files: src/popupwin.c, src/normal.c, src/vim.h,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1456
+Problem: WinBar not redrawn after scrolling one line.
+Solution: Exclude the winbar height when deciding what to redraw.
+ (closes #4473)
+Files: src/screen.c, src/testdir/test_winbar.vim
+
+Patch 8.1.1457
+Problem: Cannot reuse a buffer when loading a screen dump.
+Solution: Add the "bufnr" option.
+Files: runtime/doc/eval.txt, src/structs.h, src/channel.c,
+ src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.1458
+Problem: Crash when using gtags. (issue #4102)
+Solution: Check for negative row or col in screen_puts_len(). (Christian
+ Brabandt)
+Files: src/screen.c
+
+Patch 8.1.1459
+Problem: Popup window border looks bad when 'ambiwidth' is "double".
+ (Yasuhiro Matsumoto)
+Solution: Only use line drawing characters when 'ambiwidth' is "single".
+ (Ken Takata, closes #4477)
+Files: src/screen.c
+
+Patch 8.1.1460
+Problem: Popup window border characters may be wrong.
+Solution: Reset the border characters for each popup. Correct use of
+ 'ambiwidth'.
+Files: src/screen.c
+
+Patch 8.1.1461
+Problem: Tests do not run or are not reliable on some systems.
+Solution: Use "findstr" instead of "grep" on MS-Windows. Clear
+ PROMPT_COMMAND in the terminal test. Delete temp file. Wait for
+ output after executing a debug command. (Yegappan Lakshmanan,
+ closes #4479)
+Files: src/testdir/test_debugger.vim, src/testdir/test_environ.vim,
+ src/testdir/test_filetype.vim, src/testdir/test_source.vim,
+ src/testdir/test_terminal.vim
+
+Patch 8.1.1462
+Problem: MS-Windows: using special character requires quoting.
+Solution: Add quotes. (Ken Takata)
+Files: src/testdir/test_environ.vim
+
+Patch 8.1.1463
+Problem: Gcc warns for uninitialized variable.
+Solution: Put usage inside "if". (Ken Takata)
+Files: src/textprop.c
+
+Patch 8.1.1464
+Problem: Only 4-digit rgb termresponse is recognized.
+Solution: Also recognize 2-digit rgb response. (closes #4486)
+Files: src/term.c, src/test_termcodes.vim
+
+Patch 8.1.1465
+Problem: Allocating wrong amount of memory. (Yegappan Lakshmanan)
+Solution: Use sizeof() for right type of struct.
+Files: src/memfile_test.c
+
+Patch 8.1.1466
+Problem: Not updating priority on existing sign.
+Solution: Set the sign priority. Add a test. (Yegappan Lakshmanan)
+Files: src/sign.c, src/testdir/test_signs.vim, runtime/doc/eval.txt,
+ runtime/doc/sign.txt
+
+Patch 8.1.1467 (after 8.1.1465)
+Problem: Cscope test fails.
+Solution: Update expected text.
+Files: src/testdir/test_cscope.vim
+
+Patch 8.1.1468
+Problem: The generated desktop files may be invalid.
+Solution: Check validity with desktop-file-validate. (Christian Brabandt,
+ Will Thompson, closes #4480)
+Files: src/po/Makefile
+
+Patch 8.1.1469
+Problem: No test for checking the cursor style response.
+Solution: Add a simple test. Also include the missing part of 8.1.1464.
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.1.1470
+Problem: New Unicode character U+32FF missing from double-width table.
+Solution: Add the character.
+Files: src/mbyte.c
+
+Patch 8.1.1471
+Problem: 'background' not correctly set for 2-digit rgb termresponse.
+Solution: Adjust what digit to use. (closes #4495)
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.1.1472
+Problem: Add_termcap_entry() is not tested.
+Solution: Add a simple test.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1473
+Problem: New resolve() implementation causes problem for plugins.
+Solution: Only resolve a reparse point after checking it is needed. (Ken
+ Takata, closes #4492)
+Files: src/os_mswin.c, src/testdir/test_functions.vim
+
+Patch 8.1.1474
+Problem: 'ttybuiltin' is not tested.
+Solution: At least test that it doesn't break things.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.1475
+Problem: Search string not displayed when 'rightleft' is set.
+Solution: Clear the right part of the old text. (closes #4488, closes #4489)
+Files: src/search.c, src/testdir/test_search.vim
+
+Patch 8.1.1476
+Problem: No statistics displayed after running tests.
+Solution: Summarize the test results. (Christian Brabandt, closes #4391)
+ Also make it possible to report a skipped file.
+Files: src/Makefile, src/testdir/Makefile, src/testdir/summarize.vim,
+ src/testdir/runtest.vim, src/testdir/test_arabic.vim,
+ src/testdir/test_autochdir.vim, src/testdir/test_balloon.vim
+
+Patch 8.1.1477
+Problem: Test summary fails in the tiny version.
+Solution: set 'nocompatible'.
+Files: Filelist, src/testdir/summarize.vim
+
+Patch 8.1.1478
+Problem: Still an error when running tests with the tiny version.
+Solution: Do not try reading test.log
+Files: src/testdir/Makefile, src/testdir/summarize.vim
+
+Patch 8.1.1479
+Problem: Change included for debugging only.
+Solution: Restore the REDIR_TEST_TO_NULL line.
+Files: src/testdir/Makefile
+
+Patch 8.1.1480
+Problem: Desktop file check doesn't run on CI.
+Solution: Install the desktop-file-utils packages. (Christian Brabandt,
+ closes #4498)
+Files: .travis.yml
+
+Patch 8.1.1481
+Problem: Length for two-digit rgb termresponse is off by one.
+Solution: Adjust the length. (closes #4494)
+Files: src/term.c
+
+Patch 8.1.1482
+Problem: No test for wincol() depending on the 'number' option.
+Solution: Add a couple of tests. (Christian Brabandt, closes #4500)
+Files: src/testdir/test_gui.vim
+
+Patch 8.1.1483
+Problem: Skipped tests are not properly listed.
+Solution: Throw a "Skipped" exception instead of using ":finish" or ":return".
+Files: src/testdir/test_breakindent.vim, src/testdir/test_cdo.vim,
+ src/testdir/test_channel.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_balloon.vim, src/testdir/test_conceal.vim,
+ src/testdir/test_debugger.vim, src/testdir/test_diffmode.vim,
+ src/testdir/test_fold.vim, src/testdir/test_highlight.vim,
+ src/testdir/test_popup.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_search.vim, src/testdir/test_startup.vim,
+ src/testdir/test_startup_utf8.vim, src/testdir/test_syntax.vim,
+ src/testdir/test_tabpage.vim, src/testdir/test_termencoding.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_textprop.vim,
+ src/testdir/test_timers.vim
+
+Patch 8.1.1484
+Problem: Some tests are slow.
+Solution: Add timing to the test messages. Fix double free when quitting in
+ VimLeavePre autocmd.
+Files: src/testdir/runtest.vim, src/eval.c
+
+Patch 8.1.1485
+Problem: Double free when garbage_collect() is used in autocommand.
+Solution: Have garbage collection also set the copyID in funccal_stack.
+Files: src/eval.c, src/userfunc.c
+
+Patch 8.1.1486
+Problem: A listener change is merged even when it adds a line. (Paul Jolly)
+Solution: Do not merge a change that adds or removes a line. (closes #4490)
+Files: src/change.c, src/testdir/test_listener.vim
+
+Patch 8.1.1487
+Problem: Older msgfmt cannot generate proper .desktop file.
+Solution: Add a configure check to not use this msgfmt version. (Ken Takata)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.1.1488
+Problem: Summary of tests has incorrect failed count.
+Solution: Add to the failed count instead of setting it. (Christian Brabandt)
+Files: src/testdir/summarize.vim
+
+Patch 8.1.1489
+Problem: Sign order wrong when priority was changed.
+Solution: Reorder signs when priority is changed. (Yegappan Lakshmanan,
+ closes #4502)
+Files: src/quickfix.c, src/sign.c, src/testdir/test_signs.vim
+
+Patch 8.1.1490
+Problem: When a single test fails the exit code is not set. (Daniel Hahler)
+Solution: Add an exit command. (closes #4506)
+Files: src/testdir/Makefile
+
+Patch 8.1.1491
+Problem: When skipping over code after an exception was thrown expression
+ evaluation is aborted after a function call. (Ingo Karkat)
+Solution: Do not fail if not executing the expression. (closes #4507)
+Files: src/eval.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.1.1492
+Problem: MS-Windows: when "!" is in 'guioptions' ":!start" fails.
+Solution: Do not use a terminal window when the shell command begins with
+ "!start". (Yasuhiro Matsumoto, closes #4504)
+Files: src/misc2.c, src/os_win32.c
+
+Patch 8.1.1493
+Problem: Redrawing with popups is slow and causes flicker.
+Solution: Avoid clearing and redrawing using a zindex mask.
+Files: src/globals.h, src/screen.c, src/proto/screen.pro, src/popupwin.c,
+ src/popupmnu.c
+
+Patch 8.1.1494 (after 8.1.1493)
+Problem: Build failure.
+Solution: Add missing changes.
+Files: src/structs.h
+
+Patch 8.1.1495 (after 8.1.1494)
+Problem: Memory access error.
+Solution: Use the correct size for clearing the popup mask.
+Files: src/screen.c
+
+Patch 8.1.1496
+Problem: Popup window height is not recomputed.
+Solution: Recompute the height when needed.
+Files: src/popupwin.c, src/testdir/dumps/Test_popupwin_06.dump
+
+Patch 8.1.1497
+Problem: Accessing memory beyond allocated space.
+Solution: Check column before accessing popup mask.
+Files: src/screen.c
+
+Patch 8.1.1498
+Problem: ":write" increments b:changedtick even though nothing changed.
+ (Daniel Hahler)
+Solution: Only increment b:changedtick if the modified flag is reset.
+Files: src/change.c, src/proto/change.pro, runtime/doc/eval.txt,
+ src/buffer.c, src/ex_cmds2.c, src/fileio.c, src/memline.c,
+ src/undo.c
+
+Patch 8.1.1499
+Problem: Ruler not updated after popup window was removed.
+Solution: use popup_mask in screen_puts().
+Files: src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_07.dump,
+ src/testdir/dumps/Test_popupwin_08.dump
+
+Patch 8.1.1500
+Problem: Wrong shell command when building with VIMDLL and "!" in
+ 'guioptions'.
+Solution: Add check for GUI in use. (Ken Takata)
+Files: src/misc2.c
+
+Patch 8.1.1501
+Problem: New behavior of b:changedtick not tested.
+Solution: Add a few test cases. (Daniel Hahler)
+Files: src/testdir/test_changedtick.vim
+
+Patch 8.1.1502
+Problem: Cannot play any sound.
+Solution: Use libcanberra if available. Add sound functions.
+Files: src/configure.ac, src/auto/configure, src/config.h.in,
+ src/Makefile, src/sound.c, src/proto/sound.pro, src/proto.h,
+ src/evalfunc.c, src/feature.h, runtime/doc/eval.txt, Filelist,
+ src/version.c, src/testdir/test_sound.vim, src/testdir/silent.wav,
+ src/testdir/Make_all.mak, .travis.yml
+
+Patch 8.1.1503
+Problem: Sound test fails on Travis.
+Solution: Set AUDIODEV to "null".
+Files: .travis.yml
+
+Patch 8.1.1504
+Problem: Sound test still fails on Travis.
+Solution: Add more lines to the install section.
+Files: .travis.yml
+
+Patch 8.1.1505
+Problem: Running "make clean" twice gives errors.
+Solution: Add "-f" to "rm". (closes #4516)
+Files: src/testdir/Makefile
+
+Patch 8.1.1506
+Problem: Syntax error in Travis config.
+Solution: Set AUDIODEV in another section.
+Files: .travis.yml
+
+Patch 8.1.1507
+Problem: Sound test still fails on Travis.
+Solution: Try another dummy sound approach.
+Files: .travis.yml
+
+Patch 8.1.1508
+Problem: Sound keeps failing on Travis.
+Solution: Throw a skipped exception in the test.
+Files: src/testdir/test_sound.vim
+
+Patch 8.1.1509
+Problem: Cmdline_row can become negative, causing a crash.
+Solution: Make sure cmdline_row does not become negative. (closes #4102)
+Files: src/misc1.c
+
+Patch 8.1.1510
+Problem: A plugin cannot easily expand a command like done internally.
+Solution: Add the expandcmd() function. (Yegappan Lakshmanan, closes #4514)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/testdir/test_expand.vim
+
+Patch 8.1.1511
+Problem: Matches in a popup window are not displayed properly.
+Solution: Do display matches in a popup window. (closes #4517)
+Files: src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_matches.dump
+
+Patch 8.1.1512
+Problem: ch_evalexpr() hangs when used recursively. (Paul Jolly)
+Solution: Change ch_block_id from a single number to a list of IDs to wait
+ on.
+Files: src/channel.c, src/structs.h
+
+Patch 8.1.1513
+Problem: All popup functionality is in functions, except :popupclear.
+Solution: Add popup_clear() for consistency. Also rename sound_stopall() to
+ sound_clear().
+Files: src/ex_cmds.h, src/ex_cmdidxs.h, src/evalfunc.c, src/popupwin.c,
+ src/proto/popupwin.pro, src/sound.c, src/proto/sound.pro,
+ src/testdir/test_popupwin.vim src/testdir/test_sound.vim,
+ runtime/doc/eval.txt runtime/doc/popup.txt
+
+Patch 8.1.1514 (after 8.1.1492)
+Problem: MS-Windows: wrong shell command with ! in 'guioptions'.
+Solution: Do not check for ! in 'guioptions' when applying 'shellxquote'.
+ (Yasuhiro Matsumoto, closes #4519)
+Files: src/misc2.c
+
+Patch 8.1.1515
+Problem: Memory leak reported for sound when build with EXITFREE.
+Solution: Free sound stuff when exiting.
+Files: src/misc2.c
+
+Patch 8.1.1516
+Problem: Time reported for a test measured wrong.
+Solution: Move the computation to the end of RunTheTest(). (Ozaki Kiichi,
+ closes #4520)
+Files: src/testdir/runtest.vim
+
+Patch 8.1.1517
+Problem: When a popup changes all windows are redrawn.
+Solution: Only update the lines that were affected. Add a file for
+ profiling popup windows efficiency.
+Files: src/screen.c, src/proto/screen.pro, src/ui.c, src/popupwin.c,
+ src/globals.h, src/testdir/popupbounce.vim, Filelist
+
+Patch 8.1.1518
+Problem: Crash when setting 'columns' while a popup is visible.
+Solution: Recompute all positions when clearing the screen. (closes #4467)
+Files: src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_04a.dump
+
+Patch 8.1.1519
+Problem: 'backupskip' may contain duplicates.
+Solution: Add the P_NODUP flag. (Tom Ryder)
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.1.1520
+Problem: Popup windows are ignored when dealing with mouse position
+Solution: Find the mouse position inside a popup window. Allow for modeless
+ selection.
+Files: src/ui.c, src/proto/ui.pro, src/popupwin.c,
+ src/proto/popupwin.pro, src/screen.c, src/beval.c, src/edit.c,
+ src/evalfunc.c, src/gui.c, src/normal.c, src/structs.h
+
+Patch 8.1.1521
+Problem: When a popup window is closed the buffer remains.
+Solution: Wipe out the buffer.
+Files: src/window.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1522
+Problem: Popup_notification() not implemented yet.
+Solution: Implement it.
+Files: src/popupwin.c, src/proto/popupwin.pro, src/evalfunc.c,
+ src/structs.h, src/testdir/test_popupwin.vim,
+ runtime/doc/popup.txt
+ src/testdir/dumps/Test_popupwin_notify_01.dump,
+ src/testdir/dumps/Test_popupwin_notify_02.dump
+
+Patch 8.1.1523
+Problem: Cannot show range of buffer lines in popup window.
+Solution: Add the "firstline" property. (closes #4523)
+Files: src/popupwin.c, src/structs.h, runtime/doc/popup.txt,
+ src/testdir/test_popupwin.vim,
+ testdir/dumps/Test_popupwin_firstline.dump
+
+Patch 8.1.1524
+Problem: Tests are silently skipped.
+Solution: Throw an exception for skipped tests in more places.
+Files: src/testdir/test_assert.vim, src/testdir/test_paste.vim,
+ src/testdir/shared.vim, src/testdir/test_crypt.vim,
+ src/testdir/test_cscope.vim, src/testdir/test_digraph.vim,
+ src/testdir/test_float_func.vim, src/testdir/test_gui.vim,
+ src/testdir/test_gui_init.vim, src/testdir/test_history.vim,
+ src/testdir/test_langmap.vim, src/testdir/test_listlbr.vim,
+ src/testdir/test_listlbr_utf8.vim, src/testdir/test_lua.vim,
+ src/testdir/test_makeencoding.vim,
+ src/testdir/test_matchadd_conceal.vim,
+ src/testdir/test_matchadd_conceal_utf8.vim,
+ src/testdir/test_memory_usage.vim, src/testdir/test_menu.vim,
+ src/testdir/test_mksession.vim,
+ src/testdir/test_mksession_utf8.vim,
+ src/testdir/test_netbeans.vim, src/testdir/test_paste.vim,
+ src/testdir/test_perl.vim, src/testdir/test_profile.vim,
+ src/testdir/test_prompt_buffer.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/testdir/test_pyx2.vim,
+ src/testdir/test_pyx3.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_quotestar.vim, src/testdir/test_reltime.vim,
+ src/testdir/test_ruby.vim, src/testdir/test_sha256.vim,
+ src/testdir/test_shortpathname.vim, src/testdir/test_signals.vim,
+ src/testdir/test_signs.vim, src/testdir/test_spell.vim,
+ src/testdir/test_syntax.vim, src/testdir/test_tcl.vim,
+ src/testdir/test_termcodes.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_terminal_fail.vim,
+ src/testdir/test_textobjects.vim, src/testdir/test_textprop.vim,
+ src/testdir/test_timers.vim, src/testdir/test_vartabs.vim,
+ src/testdir/test_winbar.vim, src/testdir/test_windows_home.vim,
+ src/testdir/test_xxd.vim
+
+Patch 8.1.1525
+Problem: Cannot move a popup window with the mouse.
+Solution: Add the "drag" property and make it possible to drag a popup
+ window by its border.
+Files: src/popupwin.c, src/proto/popupwin.pro, src/structs.h, src/ui.c,
+ src/window.c, src/proto/window.pro, runtime/doc/popup.txt
+
+Patch 8.1.1526
+Problem: No numerical value for the patchlevel.
+Solution: Add v:versionlong.
+Files: src/version.c, src/eval.c, src/vim.h, runtime/doc/eval.txt,
+ src/testdir/test_eval_stuff.vim
+
+Patch 8.1.1527
+Problem: When moving a popup window over the command line it is not
+ redrawn.
+Solution: Redraw the command line. Move popup redrawing code to the popupwin
+ file.
+Files: src/screen.c, src/proto/screen.pro, src/popupwin.c,
+ src/proto/popupwin.pro, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_drag_01.dump,
+ src/testdir/dumps/Test_popupwin_drag_02.dump
+
+Patch 8.1.1528
+Problem: Popup_any_visible() is unused.
+Solution: Remove it.
+Files: src/popupwin.c, src/proto/popupwin.pro
+
+Patch 8.1.1529
+Problem: Libcanberra is linked with even when not used.
+Solution: Have configure check for libcanberra only when wanted.
+ (suggestions by Libor Bukata)
+Files: src/feature.h, src/configure.ac, src/auto/configure, src/Makefile
+
+Patch 8.1.1530
+Problem: Travis config is not optimal.
+Solution: Remove system conditions. Do not use excluding matrix. Cache OSX
+ results. (Ozaki Kiichi, closes #4521)
+Files: .travis.yml
+
+Patch 8.1.1531
+Problem: Clipboard type name is inconsistent.
+Solution: Rename VimClipboard to Clipboard_T.
+Files: src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro, src/gui_mac.c,
+ src/proto/gui_mac.pro, src/gui_x11.c, src/proto/gui_x11.pro,
+ src/ops.c, src/proto/ops.pro, src/os_qnx.c, src/proto/os_qnx.pro,
+ src/os_unix.c, src/proto/os_unix.pro, src/ui.c, src/proto/ui.pro,
+ src/winclip.c, src/proto/winclip.pro, src/globals.h, src/proto.h
+
+Patch 8.1.1532 (after 8.1.1531)
+Problem: Build fails.
+Solution: Add missing changes.
+Files: src/vim.h
+
+Patch 8.1.1533
+Problem: GUI build fails on Mac.
+Solution: Change VimClipboard type in non-C file.
+Files: src/os_macosx.m
+
+Patch 8.1.1534
+Problem: Modeless selection in popup window selects too much.
+Solution: Restrict the selection to inside of the popup window.
+Files: src/vim.h, src/ui.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_select_01.dump,
+ src/testdir/dumps/Test_popupwin_select_02.dump
+
+Patch 8.1.1535 (after 8.1.1534)
+Problem: Popup select test fails on Mac.
+Solution: Skip test if clipboard feature not available.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.1536 (after 8.1.1534)
+Problem: Popup select test still fails on Mac.
+Solution: Set 'clipboard' to "autoselect"
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.1537
+Problem: Using "tab" for popup window can be confusing.
+Solution: Use "tabpage". (Hirohito Higashi, closes #4532)
+Files: runtime/doc/popup.txt, src/popupwin.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1538
+Problem: Cannot specify highlighting for notifications.
+Solution: Use the PopupNotification group if it exists. Add a minimal width
+ to notifications.
+Files: runtime/doc/popup.txt, src/popupwin.c,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_notify_01.dump,
+ src/testdir/dumps/Test_popupwin_notify_02.dump
+
+Patch 8.1.1539
+Problem: Not easy to define a variable and lock it.
+Solution: Add ":const". (Ryuichi Hayashida, closes #4541)
+Files: runtime/doc/eval.txt, src/eval.c, src/ex_cmdidxs.h, src/ex_cmds.h,
+ src/proto/eval.pro, src/testdir/Make_all.mak,
+ src/testdir/test_const.vim
+
+Patch 8.1.1540 (after 8.1.1539)
+Problem: Cannot build without the +eval feature.
+Solution: Define ex_const if needed.
+Files: src/ex_docmd.c
+
+Patch 8.1.1541
+Problem: Check for ASAN is not reliable.
+Solution: Check the version output. (Dominique Pelle, closes #4543)
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.1.1542
+Problem: An OptionSet autocommand does not get enough info.
+Solution: Add v:option_command, v:option_oldlocal and v:option_oldglobal.
+ (Latrice Wilgus, closes #4118)
+Files: runtime/doc/autocmd.txt, runtime/doc/eval.txt,
+ runtime/doc/version8.txt, src/eval.c, src/option.c, src/structs.h,
+ src/testdir/test_autocmd.vim, src/vim.h
+
+Patch 8.1.1543
+Problem: Const test fails with small features.
+Solution: Don't unlet non-existing variables.
+Files: src/testdir/test_const.vim
+
+Patch 8.1.1544
+Problem: Some balloon tests don't run when they can.
+Solution: Split GUI balloon tests off into a separate file. (Ozaki Kiichi,
+ closes #4538) Change the feature check into a command for
+ consistency.
+Files: Filelist, src/testdir/Make_all.mak, src/testdir/check.vim,
+ src/testdir/test_arabic.vim, src/testdir/test_balloon.vim,
+ src/testdir/test_balloon_gui.vim, src/testdir/test_crypt.vim,
+ src/testdir/test_cscope.vim, src/testdir/test_digraph.vim,
+ src/testdir/test_float_func.vim, src/testdir/test_gui.vim,
+ src/testdir/test_gui_init.vim, src/testdir/test_history.vim,
+ src/testdir/test_langmap.vim, src/testdir/test_listlbr.vim,
+ src/testdir/test_listlbr_utf8.vim, src/testdir/test_lua.vim,
+ src/testdir/test_makeencoding.vim,
+ src/testdir/test_matchadd_conceal.vim,
+ src/testdir/test_matchadd_conceal_utf8.vim,
+ src/testdir/test_memory_usage.vim, src/testdir/test_menu.vim,
+ src/testdir/test_mksession.vim,
+ src/testdir/test_mksession_utf8.vim,
+ src/testdir/test_netbeans.vim, src/testdir/test_paste.vim,
+ src/testdir/test_perl.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_profile.vim, src/testdir/test_prompt_buffer.vim,
+ src/testdir/test_python2.vim, src/testdir/test_python3.vim,
+ src/testdir/test_pyx2.vim, src/testdir/test_pyx3.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_quotestar.vim,
+ src/testdir/test_reltime.vim, src/testdir/test_ruby.vim,
+ src/testdir/test_sha256.vim, src/testdir/test_shortpathname.vim,
+ src/testdir/test_signals.vim, src/testdir/test_signs.vim,
+ src/testdir/test_spell.vim, src/testdir/test_syntax.vim,
+ src/testdir/test_tcl.vim, src/testdir/test_termcodes.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_terminal_fail.vim,
+ src/testdir/test_textobjects.vim, src/testdir/test_textprop.vim,
+ src/testdir/test_timers.vim, src/testdir/test_vartabs.vim,
+ src/testdir/test_winbar.vim, src/testdir/test_windows_home.vim,
+ src/testdir/test_xxd.vim
+
+Patch 8.1.1545
+Problem: When the screen is too small there is no message about that.
+ (Daniel Hahler)
+Solution: Do not use :cquit. (closes #4534)
+Files: src/testdir/runtest.vim
+
+Patch 8.1.1546
+Problem: In some tests 'tags' is set but not restored. (Daniel Hahler)
+Solution: Restore 'tags'. (closes #4535)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_options.vim, src/testdir/test_tagcase.vim,
+ src/testdir/test_tagjump.vim, src/testdir/test_taglist.vim
+
+Patch 8.1.1547
+Problem: Functionality of bt_nofile() is confusing.
+Solution: Split into bt_nofile() and bt_nofilename().
+Files: src/buffer.c, src/proto/buffer.pro, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/fileio.c, src/popupmnu.c, src/quickfix.c
+
+Patch 8.1.1548
+Problem: Popup_dialog() is not implemented.
+Solution: Implement popup_dialog() and popup_filter_yesno().
+Files: src/popupwin.c, src/proto/popupwin.pro, src/evalfunc.c,
+ src/structs.h, src/globals.h, src/testdir/test_popupwin.vim,
+ runtime/doc/popup.txt
+
+Patch 8.1.1549 (after 8.1.1547)
+Problem: Quickfix test fails.
+Solution: Negate result of bt_quickfix().
+Files: src/quickfix.c
+
+Patch 8.1.1550
+Problem: When a popup has left padding text may be cut off.
+Solution: Add the border and padding when computing the size.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_20.dump,
+ src/testdir/dumps/Test_popupwin_21.dump
+
+Patch 8.1.1551
+Problem: Warning for shadowing popup_dragwin. (Dominique Pelle)
+Solution: Add missing change.
+Files: src/ui.c
+
+Patch 8.1.1552
+Problem: Cursor position is wrong after sign column appears or disappears.
+ (Yegappan Lakshmanan)
+Solution: Call changed_line_abv_curs() instead of changed_cline_bef_curs().
+Files: src/sign.c, src/testdir/test_signs.vim,
+ src/testdir/dumps/Test_sign_cursor_01.dump,
+ src/testdir/dumps/Test_sign_cursor_02.dump
+
+Patch 8.1.1553
+Problem: Not easy to change the text in a popup window.
+Solution: Add popup_settext(). (Ben Jackson, closes #4549)
+ Also display a space for an empty popup.
+Files: runtime/doc/popup.txt, src/evalfunc.c, src/popupwin.c,
+ src/proto/popupwin.pro,
+ src/testdir/dumps/Test_popup_settext_01.dump,
+ src/testdir/dumps/Test_popup_settext_02.dump,
+ src/testdir/dumps/Test_popup_settext_03.dump,
+ src/testdir/dumps/Test_popup_settext_04.dump,
+ src/testdir/dumps/Test_popup_settext_05.dump,
+ src/testdir/dumps/Test_popup_settext_06.dump,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1554 (after 8.1.1539)
+Problem: Docs and tests for :const can be improved.
+Solution: Improve documentation, add a few more tests. (Ryuichi Hayashida,
+ closes #4551)
+Files: runtime/doc/eval.txt, src/testdir/test_const.vim
+
+Patch 8.1.1555
+Problem: NOT_IN_POPUP_WINDOW is confusing. (Andy Massimino)
+Solution: Rename to ERROR_IF_POPUP_WINDOW().
+Files: src/popupwin.c, src/proto/popupwin.pro, src/macros.h,
+ src/ex_cmds2.c, src/ex_docmd.c, src/window.c
+
+Patch 8.1.1556
+Problem: The command displayed to show a failing screenshot does not include
+ the "testdir" directory.
+Solution: Prefix the directory name so that it can be copy-pasted.
+Files: src/testdir/screendump.vim
+
+Patch 8.1.1557
+Problem: Compiler warning for unused variables in tiny version. (Tony
+ Mechelynck)
+Solution: Add #ifdef.
+Files: src/option.c
+
+Patch 8.1.1558
+Problem: Popup_menu() and popup_filter_menu() are not implemented yet.
+Solution: Implement the functions. Fix that centering didn't take the border
+ and padding into account.
+Files: runtime/doc/popup.txt, src/popupwin.c, src/proto/popupwin.pro,
+ src/evalfunc.c, src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_menu_01.dump,
+ src/testdir/dumps/Test_popupwin_menu_02.dump,
+ src/testdir/dumps/Test_popupwin_menu_03.dump,
+ src/testdir/dumps/Test_popupwin_drag_01.dump,
+ src/testdir/dumps/Test_popupwin_drag_02.dump
+
+Patch 8.1.1559
+Problem: Popup window title property not implemented yet.
+Solution: Implement the title property.
+Files: runtime/doc/popup.txt, src/popupwin.c, src/structs.h
+ src/window.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_menu_01.dump,
+ src/testdir/dumps/Test_popupwin_menu_02.dump,
+ src/testdir/dumps/Test_popupwin_title.dump
+
+Patch 8.1.1560
+Problem: Popup window hidden option not implemented yet.
+Solution: Implement the hidden option.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1561
+Problem: Popup_setoptions() is not implemented yet.
+Solution: Implement popup_setoptions(). Also add more fields to
+ popup_getoptions().
+Files: runtime/doc/popup.txt, src/popupwin.c, src/proto/popupwin.pro,
+ src/dict.c, src/proto/dict.pro, src/evalfunc.c,
+ src/testdir/test_popupwin.vim, src/testdir/runtest.vim
+
+Patch 8.1.1562
+Problem: Popup window not always redrawn after popup_setoptions().
+Solution: Force a redraw.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_23.dump
+
+Patch 8.1.1563
+Problem: Crash when using closures.
+Solution: Set reference in varlist of funccal when running the garbage
+ collector. (Ozaki Kiichi, closes #4554, closes #4547)
+Files: src/testdir/test_vimscript.vim, src/userfunc.c
+
+Patch 8.1.1564
+Problem: Sign column takes up space. (Adam Stankiewicz)
+Solution: Optionally put signs in the number column. (Yegappan Lakshmanan,
+ closes #4555, closes #4515)
+Files: runtime/doc/options.txt, src/option.c, src/screen.c,
+ src/testdir/test_signs.vim
+
+Patch 8.1.1565
+Problem: MS-Windows: no sound support.
+Solution: Add sound support for MS-Windows. (Yasuhiro Matsumoto, Ken Takata,
+ closes #4522)
+Files: runtime/doc/eval.txt, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/sound.c, src/testdir/test_sound.vim
+
+Patch 8.1.1566
+Problem: Error message when terminal closes while it is not in the current
+ tab.
+Solution: Also set "do_set_w_closing" when using the special autocommand
+ window. (closes #4552)
+Files: src/terminal.c
+
+Patch 8.1.1567
+Problem: Localtime_r() does not respond to $TZ changes.
+Solution: If $TZ changes then call tzset(). (Tom Ryder)
+Files: src/auto/configure, src/config.h.in, src/configure.ac,
+ src/evalfunc.c, src/memline.c, src/proto/memline.pro,
+ src/testdir/test_functions.vim, src/undo.c
+
+Patch 8.1.1568 (after 8.1.1567)
+Problem: Strftime() test fails on MS-Windows.
+Solution: Skip the check for using the $TZ environment variable.
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.1569
+Problem: Cannot build with signs but without diff feature.
+Solution: Move #ifdef. (Tom Ryder)
+Files: src/screen.c
+
+Patch 8.1.1570
+Problem: Icon signs not displayed properly in the number column.
+Solution: Display them properly. (Yegappan Lakshmanan, closes #4559)
+Files: src/gui.c, src/screen.c, src/testdir/test_signs.vim
+
+Patch 8.1.1571
+Problem: textprop highlight starts too early if just after a tab.
+Solution: Check if still drawing a previous character. (closes #4558)
+Files: src/screen.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_tab.dump
+
+Patch 8.1.1572 (after 8.1.1569)
+Problem: Compiler warnings with tiny build. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/screen.c
+
+Patch 8.1.1573 (after 8.1.1571)
+Problem: Textprop test fails if screenshots do not work.
+Solution: Add check for screenshots working.
+Files: src/testdir/test_textprop.vim
+
+Patch 8.1.1574
+Problem: Tabpage option not yet implemented for popup window.
+Solution: Implement tabpage option, also for popup_getoptions().
+Files: runtime/doc/popup.txt, src/popupwin.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1575
+Problem: Callbacks may be garbage collected.
+Solution: Set reference in callbacks. (Ozaki Kiichi, closes #4564)
+Files: src/buffer.c, src/channel.c, src/eval.c, src/ex_cmds2.c,
+ src/popupwin.c, src/proto/buffer.pro, src/proto/popupwin.pro,
+ src/terminal.c, src/testdir/test_listener.vim,
+ src/testdir/test_popupwin.vim, src/testdir/test_prompt_buffer.vim,
+ src/userfunc.c
+
+Patch 8.1.1576
+Problem: Compiler warning for unused argument.
+Solution: Add "UNUSED" annotation. (Dominique Pelle, closes #4570)
+Files: src/ui.c
+
+Patch 8.1.1577
+Problem: Command line redrawn for +arabic without Arabic characters.
+ (Dominique Pelle)
+Solution: Check if there actually are any Arabic characters. Do redraw
+ after displaying incsearch. (closes #4569)
+Files: src/ex_getln.c
+
+Patch 8.1.1578
+Problem: MS-Windows: pathdef.c should depend on build options.
+Solution: Generate pathdef.c in the object directory. Fix dependencies.
+ (Ken Takata, closes #4565)
+Files: .gitignore, .hgignore, src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.1.1579
+Problem: Dict and list could be GC'ed while displaying error in a timer.
+ (Yasuhiro Matsumoto)
+Solution: Block garbage collection when executing a timer. Add
+ test_garbagecollect_soon(). Add "no_wait_return" to
+ test_override(). (closes #4571)
+Files: src/dict.c, src/testdir/test_timers.vim, src/evalfunc.c,
+ runtime/doc/eval.txt
+
+Patch 8.1.1580
+Problem: Cannot make part of a popup transparent.
+Solution: Add the "mask" option.
+Files: runtime/doc/popup.txt, src/popupwin.c, src/screen.c,
+ src/structs.h, src/window.c, src/ui.c, src/vim.h, src/globals.h,
+ src/testdir/dumps/Test_popupwin_mask_1.dump,
+ src/testdir/dumps/Test_popupwin_mask_2.dump
+
+Patch 8.1.1581
+Problem: Shared functions for testing are disorganised.
+Solution: Group functions in script files. (Ozaki Kiichi, closes #4573)
+Files: Filelist, src/testdir/screendump.vim, src/testdir/shared.vim,
+ src/testdir/term_util.vim, src/testdir/test_mksession.vim,
+ src/testdir/test_suspend.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_timers.vim, src/testdir/view_util.vim
+
+Patch 8.1.1582
+Problem: Cannot build with +textprop but without +timers.
+Solution: Add #ifdef. (Ola Söder, closes #4574)
+Files: src/popupwin.c
+
+Patch 8.1.1583
+Problem: Set_ref_in_list() only sets ref in items.
+Solution: Rename to set_ref_in_list_items() to avoid confusion.
+Files: src/eval.c, src/proto/eval.pro, src/if_lua.c, src/popupwin.c,
+ src/userfunc.c, src/if_py_both.h
+
+Patch 8.1.1584
+Problem: The evalfunc.c file is getting too big.
+Solution: Move channel and job related functions to channel.c.
+Files: src/channel.c, src/evalfunc.c, src/proto/channel.pro
+
+Patch 8.1.1585
+Problem: :let-heredoc does not trim enough.
+Solution: Trim indent from the contents based on the indent of the first
+ line. Use let-heredoc in more tests.
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_balloon.vim,
+ src/testdir/test_cindent.vim, src/testdir/test_const.vim,
+ src/testdir/test_debugger.vim, src/testdir/test_functions.vim,
+ src/testdir/test_goto.vim, src/testdir/test_gui.vim,
+ src/testdir/test_highlight.vim, src/testdir/test_join.vim,
+ src/testdir/test_let.vim, src/testdir/test_memory_usage.vim,
+ src/testdir/test_messages.vim,
+ src/testdir/test_mksession_utf8.vim, src/testdir/test_normal.vim,
+ src/testdir/test_popup.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_profile.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_xxd.vim
+
+Patch 8.1.1586
+Problem: Error number used in two places.
+Solution: Renumber one. (Ken Takata)
+Files: runtime/doc/popup.txt, src/popupwin.c
+
+Patch 8.1.1587
+Problem: Redraw problem when sign icons in the number column.
+Solution: Clear and redraw when changing related options. Right align the
+ sign icon in the GUI. (Yegappan Lakshmanan, closes #4578)
+Files: src/gui.c, src/option.c
+
+Patch 8.1.1588
+Problem: In :let-heredoc line continuation is recognized.
+Solution: Do not consume line continuation. (Ozaki Kiichi, closes #4580)
+Files: src/autocmd.c, src/digraph.c, src/eval.c, src/evalfunc.c,
+ src/ex_cmds.c, src/ex_cmds.h, src/ex_cmds2.c, src/ex_docmd.c,
+ src/ex_getln.c, src/normal.c, src/ops.c, src/proto/autocmd.pro,
+ src/proto/ex_cmds2.pro, src/proto/ex_docmd.pro,
+ src/proto/ex_getln.pro, src/proto/userfunc.pro,
+ src/testdir/test_let.vim, src/testdir/test_startup.vim,
+ src/userfunc.c
+
+Patch 8.1.1589
+Problem: Popup window does not indicate scroll position.
+Solution: Add a scrollbar.
+Files: runtime/doc/popup.txt, src/popupwin.c, src/structs.h,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_firstline.dump,
+ src/testdir/dumps/Test_popupwin_scroll_1.dump,
+ src/testdir/dumps/Test_popupwin_scroll_2.dump,
+ src/testdir/dumps/Test_popupwin_scroll_3.dump,
+ src/testdir/dumps/Test_popupwin_scroll_4.dump
+
+Patch 8.1.1590
+Problem: Popup window test fails.
+Solution: Add "scrollbar" to expected result.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.1591
+Problem: On error garbage collection may free memory in use.
+Solution: Reset may_garbage_collect when evaluating expression mapping.
+ Add tests. (Ozaki Kiichi, closes #4579)
+Files: src/ex_cmds2.c, src/getchar.c, src/testdir/test_mapping.vim,
+ src/testdir/test_timers.vim, src/testdir/test_vimscript.vim
+
+Patch 8.1.1592
+Problem: May start file dialog while exiting.
+Solution: Ignore the "browse" modifier when exiting. (Ozaki Kiichi,
+ closes #4582)
+Files: src/ex_cmds.c, src/terminal.c
+
+Patch 8.1.1593
+Problem: Filetype not detected for C++ header files without extension.
+Solution: Recognize the file by the Emacs file mode. (Dmitry Ilyin,
+ closes #4593)
+Files: runtime/scripts.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.1594
+Problem: May still start file dialog while exiting.
+Solution: Ignore the "browse" modifier in another place when exiting.
+ (Ozaki Kiichi, closes #4582)
+Files: src/ex_cmds.c
+
+Patch 8.1.1595
+Problem: MS-Windows with VIMDLL: colors wrong in the GUI.
+Solution: Do not set the terminal colors when not using the GUI. (Ken
+ Takata, closes #4588)
+Files: src/syntax.c
+
+Patch 8.1.1596
+Problem: When resizing the screen may draw popup in wrong position. (Masato
+ Nishihata)
+Solution: Check the popup is not outside of the screen. (fixes #4592)
+Files: src/popupwin.c
+
+Patch 8.1.1597
+Problem: Cannot scroll a popup window with the mouse.
+Solution: If the popup window has a scrollbar let the mouse scroll wheel
+ scroll the window.
+Files: runtime/doc/popup.txt, src/normal.c, src/popupwin.c, src/screen.c,
+ src/testdir/dumps/Test_popupwin_firstline.dump,
+ src/testdir/dumps/Test_popupwin_scroll_1.dump,
+ src/testdir/dumps/Test_popupwin_scroll_2.dump,
+ src/testdir/dumps/Test_popupwin_scroll_3.dump,
+ src/testdir/dumps/Test_popupwin_scroll_5.dump,
+ src/testdir/dumps/Test_popupwin_scroll_6.dump,
+ src/testdir/dumps/Test_popupwin_scroll_7.dump
+
+Patch 8.1.1598
+Problem: Update to test file missing.
+Solution: Update the popup window test file.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.1599
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Add a dummy assignment.
+Files: src/popupwin.c, src/normal.c
+
+Patch 8.1.1600
+Problem: Cannot specify highlighting for popup window scrollbar.
+Solution: Add "scrollbarhighlight" and "thumbhighlight" options.
+Files: src/popupwin.c, src/structs.h, src/window.c,
+ src/testdir/dumps/Test_popupwin_scroll_5.dump,
+ src/testdir/dumps/Test_popupwin_scroll_6.dump,
+ src/testdir/dumps/Test_popupwin_scroll_7.dump
+
+Patch 8.1.1601
+Problem: Missing changes to popup window test file.
+Solution: Add those changes.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.1602
+Problem: Popup window cannot overflow on the left or right.
+Solution: Only set the "fixed" option when it is in the dict. Set w_leftcol
+ to allow for the popup overflowing on the left and use it when
+ applying the mask.
+Files: src/popupwin.c
+
+Patch 8.1.1603
+Problem: Crash when using unknown highlighting in text property.
+Solution: Check for zero highlight ID.
+Files: src/screen.c, src/testdir/test_textprop.vim
+
+Patch 8.1.1604
+Problem: Popup window scroll test is flaky.
+Solution: Add a delay between scroll events.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.1605
+Problem: Vim may delay processing messages on a json channel. (Pontus
+ Leitzler)
+Solution: Try parsing json when checking if there is readahead.
+Files: src/channel.c
+
+Patch 8.1.1606
+Problem: On a narrow screen ":hi" output is confusing.
+Solution: Insert a space between highlight group name and "xxx". (Masato
+ Nishihaga, closes #4599)
+Files: src/syntax.c, src/testdir/test_highlight.vim
+
+Patch 8.1.1607
+Problem: Popup window scrollbar does not respond to click.
+Solution: Mouse click in scrollbar scrolls by one line.
+Files: src/popupwin.c, src/proto/popupwin.pro, src/structs.h, src/ui.c,
+ src/normal.c, runtime/doc/popup.txt,
+ src/testdir/dumps/Test_popupwin_scroll_8.dump,
+ src/testdir/dumps/Test_popupwin_scroll_9.dump
+
+Patch 8.1.1608
+Problem: The evalfunc.c file is too big.
+Solution: Move sign functionality to sign.c.
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/sign.c,
+ src/proto/sign.pro
+
+Patch 8.1.1609
+Problem: The user cannot easily close a popup window.
+Solution: Add the "close" property. (mostly by Masato Nishihata,
+ closes #4601)
+Files: runtime/doc/popup.txt, src/popupwin.c, src/proto/popupwin.pro,
+ src/structs.h, src/testdir/dumps/Test_popupwin_close_01.dump,
+ src/testdir/dumps/Test_popupwin_close_02.dump,
+ src/testdir/dumps/Test_popupwin_close_03.dump,
+ src/testdir/test_popupwin.vim, src/ui.c
+
+Patch 8.1.1610
+Problem: There is no way to add or load a buffer without side effects.
+Solution: Add the bufadd() and bufload() functions.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim
+
+Patch 8.1.1611
+Problem: Bufadd() reuses existing buffer without a name.
+Solution: When the name is empty always create a new buffer.
+Files: src/evalfunc.c, src/testdir/test_functions.vim
+
+Patch 8.1.1612
+Problem: Cannot show an existing buffer in a popup window.
+Solution: Support buffer number argument in popup_create().
+Files: src/buffer.c, src/proto/buffer.pro, src/evalfunc.c,
+ src/popupwin.c, src/vim.h, src/normal.c, src/screen.c, src/ui.c,
+ src/window.c, src/testdir/test_popupwin.vim, runtime/doc/popup.txt
+
+Patch 8.1.1613
+Problem: Popup window test fails with Athena and Motif.
+Solution: Compute the highlight attribute when the GUI is not active.
+Files: src/syntax.c
+
+Patch 8.1.1614
+Problem: 'numberwidth' can only go up to 10.
+Solution: Allow up to 20. (Charlie Stanton, closes #4584)
+Files: runtime/doc/options.txt, src/option.c, src/screen.c,
+ src/testdir/gen_opt_test.vim, src/testdir/test_options.vim
+
+Patch 8.1.1615
+Problem: Crash when passing buffer number to popup_create(). (Yasuhiro
+ Matsumoto)
+Solution: Initialize the window properly.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1616
+Problem: Build failure with gcc on Amiga.
+Solution: Add missing header includes. (Ola Söder, closes #4603)
+Files: src/os_amiga.h
+
+Patch 8.1.1617
+Problem: No test for popup window with mask and position fixed.
+Solution: Add a couple of screenshots. Fix detected problems.
+Files: src/popupwin.c, src/structs.h, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_mask_1.dump,
+ src/testdir/dumps/Test_popupwin_mask_2.dump,
+ src/testdir/dumps/Test_popupwin_mask_3.dump,
+ src/testdir/dumps/Test_popupwin_mask_4.dump
+
+Patch 8.1.1618
+Problem: Amiga-like systems quickly run out of stack.
+Solution: Reserve a Megabyte stack. (Ola Söder, closes #4608)
+Files: src/os_amiga.c
+
+Patch 8.1.1619
+Problem: Tests are not run with GUI on Travis.
+Solution: Add a testgui job. (Ozaki Kiichi, closes #4609)
+Files: .travis.yml, src/testdir/test_highlight.vim,
+ src/testdir/test_mapping.vim, src/testdir/test_timers.vim
+
+Patch 8.1.1620
+Problem: No test for popup window with border and mask.
+Solution: Add this popup window, fix problems.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_mask_1.dump,
+ src/testdir/dumps/Test_popupwin_mask_2.dump,
+ src/testdir/dumps/Test_popupwin_mask_3.dump,
+ src/testdir/dumps/Test_popupwin_mask_4.dump
+
+Patch 8.1.1621
+Problem: Amiga: time.h included twice.
+Solution: Remove include from evalfunc.c, move outside of #ifdef in
+ os_amiga.h. (Ola Söder, closes #4607)
+Files: src/evalfunc.c, src/os_amiga.h
+
+Patch 8.1.1622
+Problem: Wrong width if displaying a lot of lines in a popup window.
+Solution: Accurately compute the line overflow.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_firstline.dump
+
+Patch 8.1.1623
+Problem: Display wrong with signs in narrow number column.
+Solution: Increase the numbercolumn width if needed. (Yegappan Lakshmanan,
+ closes #4606)
+Files: src/option.c, src/screen.c, src/sign.c, src/testdir/test_signs.vim
+
+Patch 8.1.1624
+Problem: When testing in the GUI may try to run gvim in a terminal.
+Solution: Add the -v argument. (Yee Cheng Chin, closes #4605) Don't skip
+ tests that work now.
+Files: src/testdir/shared.vim, src/testdir/term_util.vim,
+ src/testdir/test_mapping.vim, src/testdir/test_timers.vim
+
+Patch 8.1.1625
+Problem: Script line numbers are not exactly right.
+Solution: Handle heredoc and continuation lines better. (Ozaki Kiichi,
+ closes #4611, closes #4511)
+Files: src/ex_cmds2.c, src/proto/ex_cmds2.pro,
+ src/testdir/test_vimscript.vim, src/userfunc.c
+
+Patch 8.1.1626
+Problem: No test for closing a popup window with a modified buffer.
+Solution: Add a test. Add "popups" to getbufinfo().
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1627
+Problem: Header file contains mixed comment style.
+Solution: Use // style comments.
+Files: src/structs.h
+
+Patch 8.1.1628
+Problem: Popup window functions not in list of functions.
+Solution: Add popup window functions to the list of functions. Reorganise
+ the popup window help.
+Files: runtime/doc/eval.txt, runtime/doc/popup.txt,
+ runtime/doc/usr_41.txt
+
+Patch 8.1.1629
+Problem: Terminal function help is in the wrong file.
+Solution: Move the function details to terminal.txt.
+Files: runtime/doc/eval.txt, runtime/doc/terminal.txt
+
+Patch 8.1.1630
+Problem: Various small problems.
+Solution: Various small improvements.
+Files: src/gui_beval.c, src/list.c, src/menu.c, src/message.c,
+ src/misc2.c, src/testdir/test_terminal.vim, src/os_vms_conf.h,
+ src/testdir/Make_vms.mms
+
+Patch 8.1.1631
+Problem: Displaying signs is inefficient.
+Solution: Avoid making multiple calls to get information about a placed
+ sign. (Yegappan Lakshmanan, closes #4586)
+Files: src/proto/sign.pro, src/screen.c, src/sign.c, src/structs.h
+
+Patch 8.1.1632
+Problem: Build with EXITFREE but without +arabic fails.
+Solution: Rename the function and adjust #ifdefs. (closes #4613)
+Files: src/ex_getln.c, src/proto/ex_getln.pro, src/misc2.c
+
+Patch 8.1.1633
+Problem: Cannot generate prototypes with X11 but without GUI.
+Solution: Include X11/Intrinsic.h.
+Files: src/gui.h
+
+Patch 8.1.1634
+Problem: Terminal test fails when term_getansicolors() is missing.
+ Diff test fails without +rightleft. (Dominique Pelle)
+Solution: Check if term_getansicolors() is supported. (closes #4597)
+Files: src/testdir/test_terminal.vim, src/testdir/test_diffmode.vim
+
+Patch 8.1.1635
+Problem: Warnings for unused variables in small version. (John Marriott)
+Solution: Adjust #ifdefs.
+Files: src/screen.c
+
+Patch 8.1.1636
+Problem: Crash when popup has fitting scrollbar. (Trygve Aaberge)
+Solution: Don't divide by zero if the scrollbar just fits. (closes #4615)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1637
+Problem: After running tests and clean the XfakeHOME directory remains.
+Solution: Use "rm -rf". (Hirohito Higashi)
+Files: src/testdir/Makefile, src/testdir/Make_amiga.mak
+
+Patch 8.1.1638
+Problem: Running tests leaves some files behind.
+Solution: Delete the files. (Ozaki Kiichi, closes #4617)
+Files: src/testdir/test_functions.vim, src/testdir/test_popupwin.vim
+
+Patch 8.1.1639
+Problem: Changing an autoload name into a script file name is inefficient.
+Solution: Remember the last replaced #. (Ozaki Kiichi, closes #4618)
+Files: src/eval.c
+
+Patch 8.1.1640
+Problem: The CursorHold autocommand takes down a balloon. (Paul Jolly)
+Solution: Ignore the CursorHold pseudo-key.
+Files: src/getchar.c, src/testdir/test_balloon.vim,
+ src/testdir/dumps/Test_balloon_eval_term_01.dump,
+ src/testdir/dumps/Test_balloon_eval_term_01a.dump
+
+Patch 8.1.1641
+Problem: Garbage collection may run at a wrong moment. (Trygve Aaberge)
+Solution: Postpone garbage collection while parsing messages. (closes #4620)
+Files: src/misc2.c
+
+Patch 8.1.1642 (after 8.1.0374)
+Problem: May use uninitialized variable. (Patrick Palka)
+Solution: Initialize variables earlier. (closes #4623)
+Files: src/screen.c, src/testdir/test_number.vim
+
+Patch 8.1.1643
+Problem: Sign placement is wrong when 'foldcolumn' is set.
+Solution: Adjust the column computation. (Yee Cheng Chin, closes #4627)
+Files: src/gui.c
+
+Patch 8.1.1644
+Problem: Sound test does not work on Travis.
+Solution: Use "sg" command to enable audio. (Ozaki Kiichi, closes #4624)
+Files: .travis.yml
+
+Patch 8.1.1645
+Problem: Cannot use a popup window for a balloon.
+Solution: Add popup_beval(). Add the "mousemoved" property. Add the
+ screenpos() function.
+Files: src/popupwin.c, src/proto/popupwin.pro, src/move.c,
+ src/proto/move.pro, src/beval.c, src/proto/beval.pro,
+ src/evalfunc.c, src/popupmnu.c, src/normal.c,
+ src/testdir/test_popupwin.vim, src/testdir/test_cursor_func.vim,
+ runtime/doc/popup.txt, runtime/doc/eval.txt,
+ runtime/doc/usr_41.txt,
+ src/testdir/dumps/Test_popupwin_beval_1.dump,
+ src/testdir/dumps/Test_popupwin_beval_2.dump,
+ src/testdir/dumps/Test_popupwin_beval_3.dump
+
+Patch 8.1.1646 (after 8.1.1645)
+Problem: build failure
+Solution: Add changes to structure.
+Files: src/structs.h
+
+Patch 8.1.1647
+Problem: Build error with GTK and hangulinput feature, im_get_status()
+ defined twice. (Dominique Pelle)
+Solution: Adjust im_get_status(). (closes #4628)
+Files: src/hangulin.c, src/mbyte.c
+
+Patch 8.1.1648
+Problem: MS-Windows: build error with normal features.
+Solution: Adjust #ifdef for find_word_under_cursor().
+Files: src/beval.c, src/proto/beval.pro
+
+Patch 8.1.1649
+Problem: Illegal memory access when closing popup window.
+Solution: Get w_next before closing the window.
+Files: src/popupwin.c
+
+Patch 8.1.1650
+Problem: Warning for using uninitialized variable. (Tony Mechelynck)
+Solution: Simplify the code by always using the mouse coordinates.
+Files: src/beval.c
+
+Patch 8.1.1651
+Problem: Suspend test is flaky on some systems.
+Solution: Wait for the shell prompt to show. (Yee Cheng Chin, closes #4632)
+Files: src/testdir/test_suspend.vim
+
+Patch 8.1.1652
+Problem: GUI: popup window doesn't close on mouse movement. (Paul Jolly)
+Solution: Generate mouse-move events when a popup window is visible.
+Files: src/gui.c, src/globals.h
+
+Patch 8.1.1653
+Problem: Ubsan warns for possibly passing NULL pointer.
+Solution: Skip code when length is zero. (Dominique Pelle, closes #4631)
+Files: src/channel.c
+
+Patch 8.1.1654
+Problem: GUI: screen updates from 'balloonexpr' are not displayed.
+Solution: Update the screen if needed. Also avoid the cursor being
+ displayed in the wrong position.
+Files: src/beval.c
+
+Patch 8.1.1655
+Problem: Popup window border drawn wrong with multibyte char. (Marcin
+ Szamotulski)
+Solution: Correct check in mb_fix_col(). (closes #4635)
+Files: src/mbyte.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_24.dump
+
+Patch 8.1.1656
+Problem: Popup window width is wrong when using Tabs. (Paul Jolly)
+Solution: Count tabs correctly. (closes #4637)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_11.dump
+
+Patch 8.1.1657
+Problem: Terminal: screen updates from 'balloonexpr' are not displayed.
+Solution: Update the screen if needed. Fix the word position for
+ "mousemoved".
+Files: src/beval.c, src/proto/beval.pro, src/popupwin.c, src/normal.c,
+ src/proto/normal.pro
+
+Patch 8.1.1658
+Problem: Debug statements included in patch.
+Solution: Remove the debug statements.
+Files: src/normal.c, src/popupwin.c
+
+Patch 8.1.1659
+Problem: Popup window "mousemoved" values not correct.
+Solution: Convert text column to mouse column.
+Files: src/popupwin.c, runtime/doc/popup.txt
+
+Patch 8.1.1660
+Problem: Assert_fails() does not fail inside try/catch.
+Solution: Set trylevel to zero. (Ozaki Kiichi, closes #4639)
+Files: src/eval.c, src/testdir/test_assert.vim
+
+Patch 8.1.1661
+Problem: Cannot build with +textprop but without +balloon_eval.
+Solution: Adjust #ifdefs. (closes #4645)
+Files: src/proto.h
+
+Patch 8.1.1662
+Problem: Cannot build uninstal.exe with some version of MinGW.
+Solution: Add -lole32. (Rene Nyffenegger, closes #4646)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.1663
+Problem: Compiler warning for using size_t.
+Solution: Add type cast. (Mike Williams)
+Files: src/popupwin.c
+
+Patch 8.1.1664
+Problem: GUI resize may cause changing Rows at a bad time. (Dominique
+ Pelle)
+Solution: Postpone resizing while updating the screen.
+Files: src/term.c
+
+Patch 8.1.1665
+Problem: Crash when popup window with mask is below the screen.
+Solution: Correct boundary check.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_mask_5.dump
+
+Patch 8.1.1666
+Problem: Click in popup window scrollbar with border doesn't scroll.
+Solution: Correct column for the border. (Naruhiko Nishino, closes #4650)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_scroll_9.dump
+
+Patch 8.1.1667
+Problem: Flags for Ex commands may clash with other symbols.
+Solution: Prepend with EX_.
+Files: src/ex_cmds.h, src/evalfunc.c, src/ex_docmd.c, src/ex_getln.c,
+ src/usercmd.c, src/syntax.c
+
+Patch 8.1.1668
+Problem: Popup window test is a bit flaky on some systems.
+Solution: Clear the command line. (Naruhiko Nishino, closes #4656)
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.1669
+Problem: Travis: test results section is closed even when some tests
+ failed.
+Solution: Only close the section on success. (Daniel Hahler, closes #4659)
+Files: .travis.yml
+
+Patch 8.1.1670
+Problem: Sign column not always properly aligned.
+Solution: Use "col" only after it was calculated. (Yee Cheng Chin,
+ closes #4649)
+Files: src/gui.c
+
+Patch 8.1.1671
+Problem: Copying a blob may result in it being locked.
+Solution: Reset v_lock. (Ken Takata, closes #4648)
+Files: src/blob.c, src/testdir/test_blob.vim
+
+Patch 8.1.1672 (after 8.1.1667)
+Problem: "make cmdidxs" doesn't work.
+Solution: Update macro names. (Naruhiko Nishino, closes #4660)
+Files: src/create_cmdidxs.vim
+
+Patch 8.1.1673
+Problem: Cannot easily find the popup window at a certain position.
+Solution: Add popup_locate().
+Files: runtime/doc/popup.txt, src/evalfunc.c, src/popupwin.c,
+ src/proto/popupwin.pro, src/testdir/test_popupwin.vim
+
+Patch 8.1.1674
+Problem: Script to check a colorscheme can be improved.
+Solution: Match the whole group name. Don't warn for what is usually omitted.
+Files: runtime/colors/tools/check_colors.vim
+
+Patch 8.1.1675
+Problem: Listener list not correctly updated on listener_remove().
+Solution: Only set "prev" when not removing a listener. Return one if the
+ listener was found and removed.
+Files: src/change.c
+
+Patch 8.1.1676
+Problem: "maxwidth" of popup window does not always work properly.
+Solution: Adjust the computation. (Naruhiko Nishino, closes #4653)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_menu_maxwidth_1.dump
+
+Patch 8.1.1677
+Problem: Tests get stuck when running into an existing swapfile.
+Solution: Set v:swapchoice to "q" and report an error. (Daniel Hahler,
+ closes #4644)
+Files: src/testdir/runtest.vim
+
+Patch 8.1.1678
+Problem: When using popup_menu() does not scroll to show the selected line.
+Solution: Scroll the text. (Naruhiko Nishino, closes #4651)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_menu_scroll_1.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_2.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_3.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_4.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_5.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_6.dump
+
+Patch 8.1.1679
+Problem: Test using SwapExists autocommand file may fail.
+Solution: Remove the SwapExists autocommand.
+Files: src/testdir/test_window_cmd.vim
+
+Patch 8.1.1680
+Problem: The command table is not well aligned.
+Solution: Adjust indent.
+Files: src/ex_cmds.h
+
+Patch 8.1.1681
+Problem: Insert stray "{" when listener gets buffer line. (Paul Jolly)
+Solution: Flush the cached line after invoking listeners. (closes #4455)
+Files: src/memline.c, src/testdir/test_listener.vim
+
+Patch 8.1.1682
+Problem: Placing a larger number of signs is slow.
+Solution: Add functions for dealing with a list of signs. (Yegappan
+ Lakshmanan, closes #4636)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/proto/sign.pro, src/sign.c, src/testdir/test_signs.vim
+
+Patch 8.1.1683
+Problem: Dictionary with string keys is longer than needed.
+Solution: Use *{key: val} for literal keys.
+Files: runtime/doc/eval.txt, src/eval.c, src/dict.c, src/proto/dict.pro,
+ src/testdir/test_listdict.vim, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_07.dump,
+ src/testdir/dumps/Test_popupwin_mask_2.dump,
+ src/testdir/dumps/Test_popupwin_mask_3.dump,
+ src/testdir/dumps/Test_popupwin_mask_4.dump,
+ src/testdir/dumps/Test_popupwin_mask_5.dump,
+ src/testdir/dumps/Test_popupwin_scroll_2.dump,
+ src/testdir/dumps/Test_popupwin_scroll_3.dump,
+ src/testdir/dumps/Test_popupwin_scroll_4.dump
+
+Patch 8.1.1684
+Problem: Profiling functionality is spread out.
+Solution: Put profiling functionality in profiler.c. (Yegappan Lakshmanan,
+ closes #4666)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_dice.mak,
+ src/Make_manx.mak, src/Make_morph.mak, src/Make_mvc.mak,
+ src/Make_sas.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/ex_cmds2.c, src/globals.h, src/profiler.c, src/proto.h,
+ src/proto/ex_cmds2.pro, src/proto/profiler.pro,
+ src/proto/userfunc.pro, src/structs.h, src/userfunc.c
+
+Patch 8.1.1685
+Problem: Missing file in distributed file list.
+Solution: Add profiler.pro
+Files: Filelist
+
+Patch 8.1.1686
+Problem: "*" of "*{" is recognized as multiply operator. (Yasuhiro
+ Matsumoto)
+Solution: Check for the "{".
+Files: src/eval.c, src/testdir/test_listdict.vim
+
+Patch 8.1.1687
+Problem: The evalfunc.c file is too big.
+Solution: Move testing support to a separate file.
+Files: Filelist, src/evalfunc.c, src/eval.c, src/proto/eval.pro,
+ src/testing.c, src/proto/testing.pro, src/Make_cyg_ming.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_vms.mms,
+ src/Makefile, src/README.md, src/proto.h
+
+Patch 8.1.1688
+Problem: Old makefiles are no longer useful.
+Solution: Delete the makefiles, they most likely don't work anyway.
+Files: Filelist, src/Make_dice.mak, src/Make_manx.mak, src/Make_sas.mak
+
+Patch 8.1.1689
+Problem: Profiling code is spread out.
+Solution: Move more profiling code to profiler.c. (Yegappan Lakshmanan,
+ closes #4668)
+Files: src/ex_cmds2.c, src/profiler.c, src/proto/ex_cmds2.pro,
+ src/proto/profiler.pro, src/proto/userfunc.pro, src/structs.h,
+ src/userfunc.c
+
+Patch 8.1.1690
+Problem: Default padding for popup window menu is too much.
+Solution: Only add padding left and right.
+Files: runtime/doc/popup.txt, src/popupwin.c,
+ src/testdir/dumps/Test_popupwin_menu_01.dump,
+ src/testdir/dumps/Test_popupwin_menu_02.dump,
+ src/testdir/dumps/Test_popupwin_menu_maxwidth_1.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_1.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_2.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_3.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_4.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_5.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_6.dump
+
+Patch 8.1.1691
+Problem: Diff test fails on some systems. (Elimar Riesebieter)
+Solution: Add a term_wait() call.
+Files: src/testdir/test_diffmode.vim
+
+Patch 8.1.1692
+Problem: Using *{} for literal dict is not backwards compatible. (Yasuhiro
+ Matsumoto)
+Solution: Use ~{} instead.
+Files: runtime/doc/eval.txt runtime/doc/popup.txt, src/eval.c,
+ src/testdir/test_listdict.vim src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_07.dump,
+ src/testdir/dumps/Test_popupwin_mask_2.dump,
+ src/testdir/dumps/Test_popupwin_mask_3.dump,
+ src/testdir/dumps/Test_popupwin_mask_4.dump,
+ src/testdir/dumps/Test_popupwin_mask_5.dump,
+ src/testdir/dumps/Test_popupwin_scroll_2.dump,
+ src/testdir/dumps/Test_popupwin_scroll_3.dump,
+ src/testdir/dumps/Test_popupwin_scroll_4.dump
+
+Patch 8.1.1693
+Problem: Syntax coloring and highlighting is in one big file.
+Solution: Move the highlighting to a separate file. (Yegappan Lakshmanan,
+ closes #4674)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/globals.h, src/highlight.c, src/proto.h,
+ src/proto/highlight.pro, src/proto/syntax.pro, src/structs.h,
+ src/syntax.c
+
+Patch 8.1.1694
+Problem: The RUN_VIM variable is longer than needed.
+Solution: Shorten RUN_VIM. (Daniel Hahler, closes #4643)
+Files: src/testdir/Makefile, src/testdir/shared.vim
+
+Patch 8.1.1695
+Problem: Windows 10: crash when cursor is at bottom of terminal.
+Solution: Position the cursor before resizing. (Yasuhiro Matsumoto,
+ closes #4679)
+Files: src/os_win32.c
+
+Patch 8.1.1696
+Problem: MSVC: link command line is too long.
+Solution: Use the @<< mechanism to pass the arguments via a file. (Christian
+ Brabandt)
+Files: src/Make_mvc.mak
+
+Patch 8.1.1697
+Problem: Cannot build with MSVC.
+Solution: Remove the backslashes after the @<< mechanism.
+Files: src/Make_mvc.mak
+
+Patch 8.1.1698
+Problem: Appveyor build with MSVC fails.
+Solution: Remove the sed command
+Files: ci/appveyor.bat
+
+Patch 8.1.1699
+Problem: Highlight_ga can be local instead of global.
+Solution: Move highlight_ga into highlight.c. (Yegappan Lakshmanan,
+ closes #4675)
+Files: src/globals.h, src/highlight.c, src/proto/highlight.pro,
+ src/structs.h, src/syntax.c
+
+Patch 8.1.1700
+Problem: Listener callback called for the wrong buffer.
+Solution: Invoke listeners before calling ml_append_int().
+Files: src/memline.c
+
+Patch 8.1.1701
+Problem: Appveyor build with MSVC fails puts progress bar in log.
+Solution: Adjust the sed command. (Ken Takata)
+Files: ci/appveyor.bat
+
+Patch 8.1.1702
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize it. (Christian Brabandt)
+Files: src/gui.c
+
+Patch 8.1.1703
+Problem: Breaking out of loop by checking window pointer is insufficient.
+Solution: Check the window ID and the buffer number. (closes #4683)
+Files: src/misc2.c
+
+Patch 8.1.1704
+Problem: C-R C-W does not work after C-G when using 'incsearch'.
+Solution: Put cursor at end of the match. (Yasuhiro Matsumoto, closes #4664)
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.1.1705
+Problem: Using ~{} for a literal dict is not nice.
+Solution: Use #{} instead.
+Files: runtime/doc/eval.txt runtime/doc/popup.txt, src/eval.c,
+ src/testdir/test_listdict.vim src/testdir/test_popupwin.vim
+
+Patch 8.1.1706
+Problem: Typo in #ifdef.
+Solution: Change PROT to PROTO.
+Files: src/beval.c
+
+Patch 8.1.1707
+Problem: Coverity warns for possibly using a NULL pointer.
+Solution: Change the logic to make sure no NULL pointer is used.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1708
+Problem: Coverity warns for using uninitialized variable.
+Solution: Set the start col when col is set.
+Files: src/beval.c
+
+Patch 8.1.1709
+Problem: Coverity warns for possibly using a NULL pointer.
+Solution: Make sure no NULL pointer is used.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1710
+Problem: Coverity found dead code.
+Solution: Remove merging of listener changes.
+Files: src/change.c
+
+Patch 8.1.1711
+Problem: Listener callback called at the wrong moment
+Solution: Invoke listeners before calling ml_delete_int(). (closes #4657)
+Files: src/memline.c
+
+Patch 8.1.1712
+Problem: Signs in number column cause text to be misaligned.
+Solution: Improve alignment. (Yasuhiro Matsumoto, closes #4694)
+Files: src/screen.c, src/testdir/test_signs.vim
+
+Patch 8.1.1713
+Problem: Highlighting cursor line only works with popup_menu().
+Solution: Add the "cursorline" property. (Naruhiko Nishino, closes #4671)
+Files: runtime/doc/popup.txt, src/popupwin.c,
+ src/testdir/dumps/Test_popupwin_cursorline_1.dump,
+ src/testdir/dumps/Test_popupwin_cursorline_2.dump,
+ src/testdir/dumps/Test_popupwin_cursorline_3.dump,
+ src/testdir/dumps/Test_popupwin_cursorline_4.dump,
+ src/testdir/dumps/Test_popupwin_cursorline_5.dump,
+ src/testdir/dumps/Test_popupwin_cursorline_6.dump,
+ src/testdir/dumps/Test_popupwin_menu_filter_1.dump,
+ src/testdir/dumps/Test_popupwin_menu_filter_2.dump,
+ src/testdir/dumps/Test_popupwin_menu_filter_3.dump,
+ src/testdir/dumps/Test_popupwin_menu_filter_4.dump,
+ src/testdir/test_popupwin.vim, src/vim.h
+
+Patch 8.1.1714
+Problem: Cannot preview a file in a popup window.
+Solution: Add the 'previewpopup' option.
+Files: runtime/doc/windows.txt, runtime/doc/options.txt, src/popupwin.c,
+ src/proto/popupwin.pro, src/option.c, src/option.h, src/ex_cmds.c,
+ src/testdir/dumps/Test_popupwin_previewpopup_1.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_2.dump,
+ src/ex_docmd.c, src/testdir/gen_opt_test.vim
+
+Patch 8.1.1715
+Problem: Emoji characters are seen as word characters for spelling. (Gautam
+ Iyer)
+Solution: Exclude class 3 from word characters.
+Files: src/spell.c
+
+Patch 8.1.1716
+Problem: Old style comments are wasting space
+Solution: Use new style comments in option header file. (closes #4702)
+Files: src/option.h
+
+Patch 8.1.1717
+Problem: Last char in menu popup window highlighted.
+Solution: Do not highlight an extra character twice.
+Files: src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_menu_04.dump
+
+Patch 8.1.1718
+Problem: Popup menu highlighting does not look good.
+Solution: Highlight the whole window line. Fix that sign line HL is not
+ displayed in a window with a background color.
+Files: src/popupwin.c, src/sign.c, src/proto/sign.pro, src/screen.c,
+ src/testdir/dumps/Test_popupwin_menu_scroll_1.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_2.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_3.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_4.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_5.dump,
+ src/testdir/dumps/Test_popupwin_menu_scroll_6.dump,
+ src/testdir/dumps/Test_popupwin_menu_01.dump,
+ src/testdir/dumps/Test_popupwin_menu_02.dump,
+ src/testdir/dumps/Test_popupwin_menu_04.dump
+
+Patch 8.1.1719
+Problem: Popup too wide when 'showbreak' is set.
+Solution: Set window width when computing line length. (closes #4701)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_showbreak.dump
+
+Patch 8.1.1720
+Problem: Crash with very long %[] pattern. (Reza Mirzazade farkhani)
+Solution: Check for reg_toolong. (closes #4703)
+Files: src/regexp.c, src/testdir/test_regexp_utf8.vim
+
+Patch 8.1.1721
+Problem: Build failure with normal features without netbeans interface.
+Solution: Enable signs when using the text properties feature.
+Files: src/feature.h
+
+Patch 8.1.1722
+Problem: Error when scriptversion is 2 a making a dictionary access.
+Solution: Parse the subscript even when not evaluating the sub-expression.
+ (closes #4704)
+Files: src/eval.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.1.1723
+Problem: Heredoc assignment has no room for new features. (FUJIWARA Takuya)
+Solution: Require the marker does not start with a lower case character.
+ (closes #4705)
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_let.vim
+
+Patch 8.1.1724
+Problem: Too much overhead checking for CTRL-C while processing text.
+Solution: Increase BREAKCHECK_SKIP. Remove the difference for when built
+ with the GUI. (suggested by Andy Massimino, closes #4708)
+Files: src/misc1.c, src/screen.c, src/feature.h
+
+Patch 8.1.1725
+Problem: MS-Windows: E325 message may use incorrect date format.
+Solution: Convert strftime() result to 'encoding'. Also make the message
+ translatable. (Ken Takata, closes #4685, closes #4681)
+Files: src/memline.c
+
+Patch 8.1.1726
+Problem: The eval.txt help file is too big.
+Solution: Split off testing support to testing.txt. Move function details
+ to where the functionality is explained.
+Files: runtime/doc/Makefile, runtime/doc/eval.txt,
+ runtime/doc/testing.txt, runtime/doc/sign.txt,
+ runtime/doc/textprop.txt, runtime/doc/help.txt,
+ runtime/doc/channel.txt, runtime/doc/tags
+
+Patch 8.1.1727
+Problem: Code for viminfo support is spread out.
+Solution: Move to code to viminfo.c. (Yegappan Lakshmanan, closes #4686)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/buffer.c,
+ src/eval.c, src/ex_cmds.c, src/ex_docmd.c, src/globals.h,
+ src/proto.h, src/proto/buffer.pro, src/proto/eval.pro,
+ src/proto/ex_cmds.pro, src/proto/viminfo.pro, src/structs.h,
+ src/viminfo.c
+
+Patch 8.1.1728
+Problem: Wrong place for command line history viminfo support.
+Solution: Move it to viminfo.c.
+Files: src/ex_getln.c, src/proto/ex_getln.pro, src/viminfo.c,
+ src/structs.h
+
+Patch 8.1.1729
+Problem: Heredoc with trim not properly handled in function.
+Solution: Allow for missing indent. (FUJIWARA Takuya, closes #4713)
+Files: src/userfunc.c, src/testdir/test_let.vim
+
+Patch 8.1.1730
+Problem: Wrong place for mark viminfo support.
+Solution: Move it to viminfo.c. (Yegappan Lakshmanan, closes #4716)
+Files: src/README.md, src/mark.c, src/proto/mark.pro,
+ src/proto/viminfo.pro, src/structs.h, src/viminfo.c
+
+Patch 8.1.1731
+Problem: Command line history not read from viminfo on startup.
+Solution: Get history length after initializing it.
+Files: src/viminfo.c, src/testdir/test_viminfo.vim
+
+Patch 8.1.1732
+Problem: Completion in cmdwin does not work for buffer-local commands.
+Solution: Use the right buffer. (closes #4711)
+Files: src/usercmd.c, src/testdir/test_ins_complete.vim
+
+Patch 8.1.1733
+Problem: The man ftplugin leaves an empty buffer behind.
+Solution: Don't make new window and edit, use split. (Jason Franklin)
+Files: runtime/ftplugin/man.vim, src/testdir/test_man.vim
+
+Patch 8.1.1734
+Problem: The evalfunc.c file is too big.
+Solution: Move some functions to other files.
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/json.c,
+ src/proto/json.pro src/window.c, src/proto/window.pro,
+ src/highlight.c, src/proto/highlight.pro, src/globals.h
+
+Patch 8.1.1735 (after 8.1.1734)
+Problem: Can't build with tiny features.
+Solution: Add missing #ifdefs.
+Files: src/json.c, src/highlight.c
+
+Patch 8.1.1736
+Problem: Viminfo support is spread out.
+Solution: Move more viminfo code to viminfo.c. (Yegappan Lakshmanan,
+ closes #4717) Reorder code to make most functions static.
+Files: src/fileio.c, src/ops.c, src/option.c, src/proto/ops.pro,
+ src/proto/option.pro, src/proto/search.pro, src/proto/viminfo.pro,
+ src/search.c, src/structs.h, src/viminfo.c, src/ex_cmds.c,
+ src/proto/ex_cmds.pro
+
+Patch 8.1.1737
+Problem: :args command that outputs one line gives more prompt.
+Solution: Only output line break if needed. (Daniel Hahler, closes #4715)
+Files: src/version.c, src/testdir/test_arglist.vim
+
+Patch 8.1.1738
+Problem: Testing lambda with timer is slow.
+Solution: Do not test timer accuracy, only that it works. (Daniel Hahler,
+ closes #4723)
+Files: src/testdir/test_lambda.vim
+
+Patch 8.1.1739
+Problem: Deleted match highlighting not updated in other window.
+Solution: Mark the window for refresh. (closes #4720) Also fix that
+ ambi-width check clears with wrong attributes.
+Files: src/term.c, src/highlight.c, src/testdir/test_match.vim,
+ src/testdir/dumps/Test_matchdelete_1.dump
+
+Patch 8.1.1740
+Problem: Exepath() doesn't work for "bin/cat".
+Solution: Check for any path separator. (Daniel Hahler, closes #4724,
+ closes #4710)
+Files: src/evalfunc.c, src/os_unix.c, src/testdir/test_functions.vim
+
+Patch 8.1.1741
+Problem: Cleared/added match highlighting not updated in other window.
+ (Andy Massimino)
+Solution: Mark the right window for refresh.
+Files: src/highlight.c, src/testdir/test_match.vim,
+ src/testdir/dumps/Test_matchclear_1.dump,
+ src/testdir/dumps/Test_matchadd_1.dump
+
+Patch 8.1.1742
+Problem: Still some match functions in evalfunc.c.
+Solution: Move them to highlight.c.
+Files: src/evalfunc.c, src/highlight.c, src/proto/highlight.pro,
+ src/ex_docmd.c
+
+Patch 8.1.1743
+Problem: 'hlsearch' and match highlighting in the wrong place.
+Solution: Move highlighting from inside screen functions to highlight.c.
+Files: src/screen.c, src/highlight.c, src/proto/highlight.pro
+
+Patch 8.1.1744
+Problem: Build error without the conceal feature.
+Solution: Define variables also without the conceal feature.
+Files: src/screen.c
+
+Patch 8.1.1745
+Problem: Compiler warning for unused argument.
+Solution: Add UNUSED. Change comments to new style.
+Files: src/highlight.c
+
+Patch 8.1.1746
+Problem: ":dl" is seen as ":dlist" instead of ":delete".
+Solution: Do not use cmdidxs2[] if the length is 1. (closes #4721)
+Files: src/ex_docmd.c, src/testdir/test_excmd.vim,
+ src/testdir/Make_all.mak
+
+Patch 8.1.1747
+Problem: Compiler warning for unused variables. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/screen.c
+
+Patch 8.1.1748 (after 8.1.1737)
+Problem: :args output is not aligned.
+Solution: Output a line break after the last item in a row.
+Files: src/version.c
+
+Patch 8.1.1749
+Problem: Coverity warns for using negative index.
+Solution: Move using index inside "if".
+Files: src/viminfo.c
+
+Patch 8.1.1750
+Problem: Depending on the terminal width :version may miss a line break.
+Solution: Add a line break when needed.
+Files: src/version.c
+
+Patch 8.1.1751
+Problem: When redrawing popups plines_win() may be called often.
+Solution: Pass a cache to mouse_comp_pos().
+Files: src/ui.c, src/proto/ui.pro, src/beval.c, src/evalfunc.c,
+ src/popupwin.c
+
+Patch 8.1.1752
+Problem: Resizing hashtable is inefficient.
+Solution: Avoid resizing when the final size is predictable.
+Files: src/hashtab.c, src/proto/hashtab.pro, src/popupwin.c
+
+Patch 8.1.1753
+Problem: Use of popup window mask is inefficient.
+Solution: Precompute and cache the mask.
+Files: src/popupwin.c
+
+Patch 8.1.1754 (after 8.1.1753)
+Problem: Build failure.
+Solution: Add missing change to window struct.
+Files: src/structs.h
+
+Patch 8.1.1755
+Problem: Leaking memory when using a popup window mask.
+Solution: Free the cached mask.
+Files: src/window.c
+
+Patch 8.1.1756
+Problem: Autocommand that splits window messes up window layout.
+Solution: Disallow splitting a window while closing one. In ":all" give an
+ error when moving a window will not work.
+Files: src/buffer.c, src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 8.1.1757
+Problem: Text added with appendbufline() to another buffer isn't displayed.
+Solution: Update topline. (partly by Christian Brabandt, closes #4718)
+Files: src/evalfunc.c, src/testdir/test_bufline.vim,
+ src/testdir/dumps/Test_appendbufline_1.dump
+
+Patch 8.1.1758
+Problem: Count of g$ not used correctly when text is not wrapped.
+Solution: Do use the count. (Christian Brabandt, closes #4729, closes #4566)
+Files: src/normal.c, src/testdir/test_normal.vim
+
+Patch 8.1.1759
+Problem: No mode char for terminal mapping from maparg().
+Solution: Check for TERMINAL mode. (closes #4735)
+Files: src/getchar.c, src/testdir/test_maparg.vim
+
+Patch 8.1.1760
+Problem: Extra line break for wrapping output of :args.
+Solution: Avoid the extra line break. (Daniel Hahler, closes #4737)
+Files: src/version.c, src/testdir/test_arglist.vim
+
+Patch 8.1.1761
+Problem: Filetype "vuejs" causes problems for some users.
+Solution: Rename to "vue".
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.1762
+Problem: Some filetype rules are in the wrong place.
+Solution: Move to the right place. Add a few more tests.
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.1763
+Problem: Evalfunc.c is still too big.
+Solution: Move dict and list functions to a better place.
+Files: src/evalfunc.c, src/dict.c, src/proto/dict.pro, src/list.c,
+ src/proto/list.pro, src/blob.c, src/proto/blob.pro
+
+Patch 8.1.1764
+Problem: ":browse oldfiles" is not tested.
+Solution: Add a test.
+Files: src/testdir/test_viminfo.vim
+
+Patch 8.1.1765
+Problem: get(func, dict, def) does not work properly.
+Solution: Handle NULL dict better. (Takuya Fujiwara, closes #4734)
+Files: src/evalfunc.c, src/testdir/test_getvar.vim,
+ src/testdir/test_partial.vim
+
+Patch 8.1.1766
+Problem: Code for writing session file is spread out.
+Solution: Put it in one file. (Yegappan Lakshmanan, closes #4728)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/eval.c, src/ex_docmd.c, src/misc2.c, src/proto.h,
+ src/proto/eval.pro, src/proto/misc2.pro, src/proto/session.pro,
+ src/session.c
+
+Patch 8.1.1767
+Problem: FEAT_SESSION defined separately.
+Solution: Make FEAT_SESSION depend on FEAT_EVAL.
+Files: src/feature.h, src/session.c, src/evalfunc.c, src/ex_docmd.c,
+ src/gui_gtk_x11.c, src/proto.h
+
+Patch 8.1.1768
+Problem: Man plugin changes setting in current window.
+Solution: Set options later. (Jason Franklin)
+Files: runtime/ftplugin/man.vim, src/testdir/test_man.vim
+
+Patch 8.1.1769
+Problem: 'shellslash' is also used for completion.
+Solution: Add the 'completeslash' option. (Yasuhiro Matsumoto, closes #3612)
+Files: runtime/doc/options.txt, src/ex_getln.c, src/insexpand.c,
+ src/option.c, src/option.h, src/structs.h,
+ src/testdir/test_ins_complete.vim
+
+Patch 8.1.1770
+Problem: Cannot get the window ID of the popup preview window.
+Solution: Add popup_getpreview().
+Files: src/evalfunc.c, src/popupwin.c, src/proto/popupwin.pro,
+ runtime/doc/eval.txt, runtime/doc/popup.txt,
+ src/testdir/dumps/Test_popupwin_previewpopup_3.dump
+
+Patch 8.1.1771
+Problem: Options test fails on MS-Windows.
+Solution: Add correct and incorrect values for 'completeslash'.
+Files: src/testdir/gen_opt_test.vim
+
+Patch 8.1.1772
+Problem: Options test still fails on MS-Windows.
+Solution: Check buffer-local value of 'completeslash'.
+Files: src/option.c
+
+Patch 8.1.1773
+Problem: The preview popup window may be too far to the right.
+Solution: Keep it inside the screen. Also keep the close button and
+ scrollbar visible if possible.
+Files: src/popupwin.c, src/proto/popupwin.pro, src/ex_cmds.c,
+ src/screen.c, src/vim.h, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_previewpopup_1.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_2.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_3.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_4.dump
+
+Patch 8.1.1774
+Problem: Test is silently skipped.
+Solution: Throw "Skipped".
+Files: src/testdir/test_ins_complete.vim
+
+Patch 8.1.1775
+Problem: Error message may be empty in filetype test.
+Solution: Use v:exception instead. (Daniel Hahler, closes #4744)
+Files: src/testdir/test_filetype.vim
+
+Patch 8.1.1776
+Problem: Text added with a job to another buffer isn't displayed.
+Solution: Update topline after adding a line. (closes #4745)
+Files: src/channel.c, src/testdir/test_channel.vim, src/testdir/check.vim,
+ src/testdir/dumps/Test_job_buffer_scroll_1.dump
+
+Patch 8.1.1777
+Problem: Useless checks for job feature in channel test.
+Solution: Remove the checks. Remove ch_log() calls.
+Files: src/testdir/test_channel.vim
+
+Patch 8.1.1778
+Problem: Not showing the popup window right border is confusing.
+Solution: Also show the border when there is no close button. (closes #4747)
+Files: src/popupwin.c, src/testdir/dumps/Test_popupwin_20.dump,
+ src/testdir/dumps/Test_popupwin_21.dump
+
+Patch 8.1.1779
+Problem: Not showing the popup window right border is confusing.
+Solution: Also show the border when 'wrap' is off. (closes #4747)
+Files: src/popupwin.c, src/testdir/dumps/Test_popupwin_20.dump,
+ src/testdir/dumps/Test_popupwin_21.dump
+
+Patch 8.1.1780
+Problem: Warning for file no longer available is repeated every time Vim is
+ focused. (Brian Armstrong)
+Solution: Only give the message once. (closes #4748)
+Files: src/fileio.c
+
+Patch 8.1.1781
+Problem: Amiga: no builtin OS readable version info.
+Solution: Add a "version" variable. (Ola Söder, closes #4753)
+Files: src/os_amiga.c
+
+Patch 8.1.1782
+Problem: MS-Windows: system() has temp file error with 'noshelltemp'.
+Solution: Check s_dont_use_vimrun. (Ken Takata, closes #4754)
+Files: src/os_win32.c
+
+Patch 8.1.1783
+Problem: MS-Windows: compiler test may fail when using %:S.
+Solution: Reset 'shellslash'.
+Files: src/testdir/test_compiler.vim
+
+Patch 8.1.1784
+Problem: MS-Windows: resolve() does not work if serial nr duplicated.
+Solution: Use another method to get the full path. (Ken Takata, closes #4661)
+Files: src/os_mswin.c
+
+Patch 8.1.1785
+Problem: Map functionality mixed with character input.
+Solution: Move the map functionality to a separate file. (Yegappan
+ Lakshmanan, closes #4740) Graduate the +localmap feature.
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/buffer.c, src/feature.h, src/evalfunc.c, src/ex_docmd.c,
+ src/getchar.c, src/map.c, src/proto.h, src/proto/getchar.pro,
+ src/proto/map.pro, src/version.c, src/structs.h
+
+Patch 8.1.1786
+Problem: Double click in popup scrollbar starts selection.
+Solution: Ignore the double click.
+Files: src/ui.c, src/popupwin.c, src/proto/popupwin.pro
+
+Patch 8.1.1787
+Problem: Cannot resize a popup window.
+Solution: Allow for resizing by dragging the lower right corner.
+Files: runtime/doc/popup.txt, src/popupwin.c, src/structs.h, src/vim.h,
+ src/ui.c src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_drag_01.dump,
+ src/testdir/dumps/Test_popupwin_drag_02.dump,
+ src/testdir/dumps/Test_popupwin_drag_03.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_1.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_2.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_3.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_4.dump
+
+Patch 8.1.1788 (after 8.1.1787)
+Problem: missing changes in proto file
+Solution: Update proto file.
+Files: src/proto/popupwin.pro
+
+Patch 8.1.1789
+Problem: Cannot see file name of preview popup window.
+Solution: Add the file name as the title.
+Files: src/ex_cmds.c, src/popupwin.c, src/proto/popupwin.pro,
+ src/fileio.c,
+ src/testdir/dumps/Test_popupwin_previewpopup_1.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_2.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_3.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_4.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_5.dump
+
+Patch 8.1.1790
+Problem: :mkvimrc is not tested.
+Solution: Add a test.
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.1791
+Problem: 'completeslash' also applies to globpath().
+Solution: Add the WILD_IGNORE_COMPLETESLASH flag. (test by Yasuhiro
+ Matsumoto, closes #4760)
+Files: src/testdir/test_ins_complete.vim, src/ex_getln.c, src/evalfunc.c,
+ src/vim.h
+
+Patch 8.1.1792
+Problem: The vgetorpeek() function is too long.
+Solution: Split off the part that handles mappings.
+Files: src/getchar.c
+
+Patch 8.1.1793
+Problem: Mixed comment style in globals.
+Solution: Use // comments where appropriate.
+Files: src/globals.h
+
+Patch 8.1.1794 (after 8.1.1792)
+Problem: Tests are flaky.
+Solution: Undo the change to vgetorpeek().
+Files: src/getchar.c
+
+Patch 8.1.1795
+Problem: No syntax HL after splitting windows with :bufdo. (Yasuhiro
+ Matsumoto)
+Solution: Trigger Syntax autocommands in buffers that are active.
+ (closes #4761)
+Files: src/vim.h, src/option.c, src/ex_cmds2.c,
+ src/testdir/test_syntax.vim
+
+Patch 8.1.1796
+Problem: :argdo is not tested
+Solution: Add a test.
+Files: src/testdir/test_arglist.vim
+
+Patch 8.1.1797 (after 8.1.1794)
+Problem: The vgetorpeek() function is too long.
+Solution: Split off the part that handles mappings, with fix.
+Files: src/getchar.c
+
+Patch 8.1.1798
+Problem: Warning for unused variable in tiny version. (Tony Mechelynck)
+Solution: Move inside #ifdef. Reformat code.
+Files: src/getchar.c
+
+Patch 8.1.1799
+Problem: Cannot avoid mapping for a popup window.
+Solution: Add the "mapping" property, default TRUE.
+Files: runtime/doc/popup.txt, src/getchar.c, src/popupwin.c, src/vim.h,
+ src/proto/popupwin.pro, src/testdir/test_popupwin.vim
+
+Patch 8.1.1800
+Problem: Function call functions have too many arguments.
+Solution: Pass values in a funcexe_T struct.
+Files: src/eval.c, src/structs.h, src/userfunc.c, src/proto/userfunc.pro,
+ src/list.c, src/regexp.c, src/terminal.c, src/change.c,
+ src/ex_cmds2.c, src/popupwin.c, src/channel.c
+
+Patch 8.1.1801
+Problem: Cannot build without the +eval feature.
+Solution: Always define funcexe_T.
+Files: src/structs.h
+
+Patch 8.1.1802
+Problem: Missing change to call_callback().
+Solution: Add missing change.
+Files: src/sound.c
+
+Patch 8.1.1803
+Problem: All builtin functions are global.
+Solution: Add the method call operator ->. Implemented for a limited number
+ of functions.
+Files: runtime/doc/eval.txt, src/eval.c, src/structs.h, src/userfunc.c,
+ src/globals.h, src/evalfunc.c, src/proto/evalfunc.pro,
+ src/testdir/test_method.vim, src/testdir/Make_all.mak
+
+Patch 8.1.1804
+Problem: No test for display updating without a scroll region.
+Solution: Add a test.
+Files: src/testdir/test_display.vim, src/testdir/check.vim,
+ src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_scroll_no_region_1.dump,
+ src/testdir/dumps/Test_scroll_no_region_2.dump,
+ src/testdir/dumps/Test_scroll_no_region_3.dump
+
+Patch 8.1.1805
+Problem: Au_did_filetype is declared twice.
+Solution: Remove it from autocmd.c. (closes #4767)
+Files: src/globals.h, src/autocmd.c
+
+Patch 8.1.1806
+Problem: Test for display updating doesn't check without statusline.
+Solution: Add screenshots without a status line.
+Files: src/testdir/test_display.vim,
+ src/testdir/dumps/Test_scroll_no_region_4.dump,
+ src/testdir/dumps/Test_scroll_no_region_5.dump,
+ src/testdir/dumps/Test_scroll_no_region_6.dump
+
+Patch 8.1.1807
+Problem: More functions can be used as a method.
+Solution: Add append(), appendbufline(), assert_equal(), etc.
+ Also add the :eval command.
+Files: runtime/doc/eval.txt, runtime/doc/testing.txt, src/evalfunc.c,
+ src/testdir/test_method.vim, src/ex_cmds.h, src/ex_eval.c,
+ src/proto/ex_eval.pro, src/ex_cmdidxs.h
+
+Patch 8.1.1808
+Problem: Build failure for tiny version.
+Solution: Define ex_eval to ex_ni. Clean up the ordering a bit.
+Files: src/ex_docmd.c
+
+Patch 8.1.1809
+Problem: More functions can be used as a method.
+Solution: Add has_key(), split(), str2list(), etc.
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_method.vim,
+ src/testdir/test_diffmode.vim, src/testdir/test_syntax.vim,
+ src/testdir/test_system.vim
+
+Patch 8.1.1810
+Problem: Popup_getoptions() is missing an entry for "mapping".
+Solution: Add the entry.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1811
+Problem: Popup window color cannot be set to "Normal".
+Solution: Check for non-empty 'wincolor' instead of zero attribute.
+ (closes #4772)
+Files: src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_20.dump,
+ src/testdir/dumps/Test_popupwin_21.dump
+
+Patch 8.1.1812
+Problem: Reading a truncated undo file hangs Vim.
+Solution: Check for reading EOF. (closes #4769)
+Files: src/undo.c, src/testdir/test_undo.vim
+
+Patch 8.1.1813
+Problem: ATTENTION prompt for a preview popup window.
+Solution: Close the popup window if aborting the buffer load. Avoid getting
+ the ATTENTION dialog.
+Files: src/tag.c, src/ex_cmds.c, src/memline.c, src/vim.h,
+ runtime/doc/windows.txt
+
+Patch 8.1.1814
+Problem: A long title in a popup window overflows.
+Solution: Truncate the title. (closes #4770)
+Files: src/testdir/test_popupwin.vim, src/popupwin.c,
+ src/testdir/dumps/Test_popupwin_longtitle_1.dump,
+ src/testdir/dumps/Test_popupwin_longtitle_2.dump
+
+Patch 8.1.1815
+Problem: Duplicating info for internal functions.
+Solution: Use one table to list internal functions.
+Files: src/evalfunc.c
+
+Patch 8.1.1816
+Problem: Cannot use a user defined function as a method.
+Solution: Pass the base as the first argument to the user defined function
+ after "->". (partly by FUJIWARA Takuya)
+Files: src/eval.c, src/userfunc.c, src/testdir/test_user_func.vim,
+ src/testdir/test_autoload.vim,
+ src/testdir/sautest/autoload/foo.vim
+
+Patch 8.1.1817
+Problem: Github contribution text is incomplete.
+Solution: Update the text.
+Files: CONTRIBUTING.md
+
+Patch 8.1.1818
+Problem: Unused variable.
+Solution: Remove the variable. (Mike Williams)
+Files: src/sound.c
+
+Patch 8.1.1819
+Problem: :pedit does not work with a popup preview window.
+Solution: Avoid aborting with an error. (fixes #4777) Also double check
+ that after prepare_tagpreview() the current window is not a
+ popup window.
+Files: src/ex_docmd.c, src/popupmenu.c, src/search.c, src/tag.c,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_previewpopup_6.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_7.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_8.dump
+
+Patch 8.1.1820
+Problem: Using expr->FuncRef() does not work.
+Solution: Make FuncRef work as a method.
+Files: src/eval.c, src/userfunc.c, src/testdir/test_method.vim
+
+Patch 8.1.1821
+Problem: No test for wrong number of method arguments.
+Solution: Add a test.
+Files: src/testdir/test_method.vim
+
+Patch 8.1.1822
+Problem: Confusing error message when range is not allowed.
+Solution: With ADDR_NONE give e_norange. Change e_invaddr to e_invrange for
+ consistency.
+Files: src/ex_docmd.c, src/globals.h, src/testdir/test_excmd.vim
+
+Patch 8.1.1823
+Problem: Command line history code is spread out.
+Solution: Put the code in a new file. (Yegappan Lakshmanan, closes #4779)
+ Also graduate the +cmdline_hist feature.
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/cmdhist.c, src/ex_getln.c, src/proto.h, src/proto/cmdhist.pro,
+ src/proto/ex_getln.pro, src/version.c, src/evalfunc.c,
+ src/ex_cmds.c, src/ex_docmd.c, src/misc2.c, src/normal.c,
+ src/ops.c, src/option.c, src/search.c, src/tag.c, src/usercmd.c,
+ src/viminfo.c, src/feature.h, src/globals.h
+
+Patch 8.1.1824
+Problem: Crash when correctly spelled word is very long. (Ben Kraft)
+Solution: Check word length before copying. (closes #4778)
+Files: src/spell.c, src/testdir/test_spell.vim
+
+Patch 8.1.1825
+Problem: Allocating more memory than needed for extended structs.
+Solution: Use offsetof() instead of sizeof(). (Dominique Pelle,
+ closes #4785)
+Files: src/dict.c
+
+Patch 8.1.1826
+Problem: Tests use hand coded feature and option checks.
+Solution: Use the commands from check.vim in more tests.
+Files: src/testdir/check.vim, src/testdir/shared.vim,
+ src/testdir/test_autochdir.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_balloon.vim, src/testdir/test_breakindent.vim,
+ src/testdir/test_bufline.vim, src/testdir/test_cdo.vim,
+ src/testdir/test_channel.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_conceal.vim, src/testdir/test_cscope.vim,
+ src/testdir/test_debugger.vim, src/testdir/test_filechanged.vim,
+ src/testdir/test_fold.vim, src/testdir/test_functions.vim,
+ src/testdir/test_gui.vim, src/testdir/test_gui_init.vim,
+ src/testdir/test_highlight.vim, src/testdir/test_mapping.vim,
+ src/testdir/test_match.vim, src/testdir/test_memory_usage.vim,
+ src/testdir/test_options.vim, src/testdir/test_paste.vim,
+ src/testdir/test_popup.vim, src/testdir/test_search.vim,
+ src/testdir/test_signals.vim, src/testdir/test_startup.vim,
+ src/testdir/test_syntax.vim, src/testdir/test_termcodes.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_timers.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.1.1827
+Problem: Allocating more memory than needed for extended structs.
+Solution: Use offsetof() instead of sizeof(). (Dominique Pelle,
+ closes #4786)
+Files: src/getchar.c, src/regexp.c, src/sign.c, src/structs.h,
+ src/syntax.c, src/textprop.c, src/userfunc.c
+
+Patch 8.1.1828
+Problem: Not strict enough checking syntax of method invocation.
+Solution: Check there is no white space inside ->method(.
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_method.vim
+
+Patch 8.1.1829
+Problem: Difference in screenshots.
+Solution: Update screenshots. Change checks in a few more tests.
+ (closes #4789)
+Files: src/testdir/test_balloon_gui.vim,
+ src/testdir/test_shortpathname.vim,
+ src/testdir/test_windows_home.vim,
+ src/testdir/dumps/Test_popupwin_previewpopup_1.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_2.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_3.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_4.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_5.dump
+
+Patch 8.1.1830
+Problem: Travis does not report error when tests fail.
+Solution: Explicitly do "exit 1".
+Files: .travis.yml
+
+Patch 8.1.1831
+Problem: Confusing skipped message.
+Solution: Drop "run" from "run start the GUI".
+Files: src/testdir/check.vim
+
+Patch 8.1.1832
+Problem: Win_execute() does not work in other tab. (Rick Howe)
+Solution: Take care of the tab. (closes #4792)
+Files: src/testdir/test_execute_func.vim, src/evalfunc.c, src/window.c,
+ src/proto/window.pro
+
+Patch 8.1.1833
+Problem: Allocating a bit too much when spellbadword() does not find a bad
+ word.
+Solution: Reset "len" when going to the next word. (Daniel Hahler,
+ closes #4788)
+Files: src/evalfunc.c
+
+Patch 8.1.1834
+Problem: Cannot use a lambda as a method.
+Solution: Implement ->{lambda}(). (closes #4768)
+Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_method.vim
+
+Patch 8.1.1835
+Problem: Cannot use printf() as a method.
+Solution: Pass the base as the second argument to printf().
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_method.vim
+
+Patch 8.1.1836
+Problem: Inaccurate memory estimate for Amiga-like OS.
+Solution: Adjust #ifdef for AvailMem(). (Ola Söder, closes #4797)
+Files: src/os_amiga.c
+
+Patch 8.1.1837
+Problem: Popup test fails if clipboard is supported but not working.
+Solution: Add the "clipboard_working" feature. Also use Check commands
+ instead of "if" and "throw". And remove stray ch_logfile().
+Files: src/testdir/test_popupwin.vim, src/evalfunc.c,
+ runtime/doc/eval.txt
+
+Patch 8.1.1838
+Problem: There is :spellwrong and :spellgood but not :spellrare.
+Solution: Add :spellrare. (Martin Tournoij, closes #4291)
+Files: runtime/doc/spell.txt, src/ex_cmdidxs.h, src/ex_cmds.h,
+ src/normal.c, src/proto/spellfile.pro, src/spellfile.c,
+ src/spell.h, src/testdir/Make_all.mak,
+ src/testdir/test_normal.vim, src/testdir/test_spellfile.vim
+
+Patch 8.1.1839
+Problem: Insufficient info when test fails because of screen size.
+Solution: Report the detected screen size.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.1840
+Problem: Testing: WorkingClipboard() is not accurate.
+Solution: Check feature clipboard_working instead.
+Files: src/testdir/shared.vim, src/testdir/test_paste.vim,
+ src/testdir/test_quotestar.vim, src/testdir/test_termcodes.vim
+
+Patch 8.1.1841
+Problem: No test for Ex shift commands.
+Solution: Add a test. (Dominique Pelle, closes #4801)
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_shift.vim
+
+Patch 8.1.1842
+Problem: Test listed as flaky should no longer be flaky.
+Solution: Remove Test_popup_and_window_resize from the list of flaky tests.
+ (Daniel Hahler, close #4807)
+Files: src/testdir/runtest.vim
+
+Patch 8.1.1843
+Problem: Might be freeing memory that was not allocated.
+Solution: Have next_fenc() set the fenc_alloced flag. (closes #4804)
+Files: src/fileio.c
+
+Patch 8.1.1844
+Problem: Buffer no longer unloaded when adding text properties to it.
+Solution: Do not create the memfile. (closes #4808)
+Files: runtime/doc/textprop.txt, src/testdir/test_textprop.vim,
+ src/textprop.c
+
+Patch 8.1.1845
+Problem: May use NULL pointer when running out of memory.
+Solution: Do not clear popup buffers when NULL. (closes #4802)
+Files: src/screen.c
+
+Patch 8.1.1846
+Problem: Inconsistently using GetVimCommand() and v:progpath. (Daniel
+ Hahler)
+Solution: Use GetVimCommand(). (closes #4806)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_gui.vim,
+ src/testdir/test_normal.vim, src/testdir/test_profile.vim,
+ src/testdir/test_suspend.vim, src/testdir/test_system.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.1.1847
+Problem: Suspend test is failing.
+Solution: Do not use GetVimCommandClean().
+Files: src/testdir/test_suspend.vim
+
+Patch 8.1.1848
+Problem: 'langmap' is not used for CTRL-W command in terminal.
+Solution: Push the command in the typeahead buffer instead of the stuff
+ buffer. (closes #4814)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.1849
+problem: Some insert complete functions in the wrong file.
+Solution: Move complete functions to insexpand.c. (Yegappan Lakshmanan,
+ closes #4815)
+Files: src/evalfunc.c, src/insexpand.c, src/proto/insexpand.pro
+
+Patch 8.1.1850
+Problem: Focus may remain in popup window.
+Solution: Change focus if needed.
+Files: src/popupmnu.c
+
+Patch 8.1.1851
+Problem: Crash when sound_playfile() callback plays sound.
+Solution: Invoke callback later from event loop.
+Files: src/testdir/test_sound.vim, src/ui.c, src/sound.c,
+ src/proto/sound.pro, src/feature.h, src/os_unix.c, src/ex_docmd.c,
+ src/misc2.c
+
+Patch 8.1.1852
+Problem: Timers test is flaky.
+Solution: Accept a larger count. Add test to list of flaky tests.
+Files: src/testdir/test_timers.vim, src/testdir/runtest.vim
+
+Patch 8.1.1853
+Problem: Timers test is still flaky.
+Solution: Compute the time to sleep more accurately.
+Files: src/ex_docmd.c
+
+Patch 8.1.1854
+Problem: Now another timer test is flaky.
+Solution: Add test to list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.1855
+Problem: Another failing timer test.
+Solution: Assert that timers are finished by the end of the test. Rename
+ test functions to make them easier to find.
+Files: src/testdir/test_timers.vim, src/testdir/runtest.vim
+
+Patch 8.1.1856
+Problem: popup preview test fails sometimes. (Christian Brabandt)
+Solution: Clear the command line.
+Files: src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_previewpopup_6.dump
+
+Patch 8.1.1857
+Problem: Cannot use modifier with multibyte character.
+Solution: Allow using a multibyte character, although it doesn't work
+ everywhere.
+Files: src/misc2.c, src/testdir/test_mapping.vim
+
+Patch 8.1.1858
+Problem: Test for multibyte mapping fails on some systems.
+Solution: Test in another way.
+Files: src/testdir/test_mapping.vim
+
+Patch 8.1.1859
+Problem: Timer test sometimes fails on Mac.
+Solution: Show more info when it fails.
+Files: src/testdir/test_timers.vim
+
+Patch 8.1.1860
+Problem: Map timeout test is flaky.
+Solution: Add test to list of flaky tests. Increase timeout.
+Files: src/testdir/runtest.vim, src/testdir/test_mapping.vim
+
+Patch 8.1.1861
+Problem: Only some assert functions can be used as a method.
+Solution: Allow using most assert functions as a method.
+Files: runtime/doc/testing.txt, src/evalfunc.c,
+ src/testdir/test_assert.vim
+
+Patch 8.1.1862
+Problem: Coverity warns for not using return value.
+Solution: Add "(void)" to avoid the warning.
+Files: src/normal.c
+
+Patch 8.1.1863
+Problem: Confusing error when using a builtin function as method while it
+ does not support that.
+Solution: Add a specific error message.
+Files: src/vim.h, src/evalfunc.c, src/userfunc.c,
+ src/testdir/test_method.vim
+
+Patch 8.1.1864
+Problem: Still a timer test that is flaky on Mac.
+Solution: Adjust the sleep times.
+Files: src/testdir/test_timers.vim
+
+Patch 8.1.1865
+Problem: Spellrare and spellrepall in the wrong order.
+Solution: Put spellrare below spellrepall. (closes #4820)
+Files: runtime/doc/spell.txt, src/ex_cmds.h
+
+Patch 8.1.1866
+Problem: Modeless selection in GUI does not work properly.
+Solution: Avoid going beyond the end of the line. (closes #4783)
+Files: src/ui.c
+
+Patch 8.1.1867
+Problem: Still a timer test that is flaky on Mac.
+Solution: Loop with a sleep instead of one fixed sleep.
+Files: src/testdir/test_timers.vim
+
+Patch 8.1.1868
+Problem: Multibyte characters in 'listchars' don't work correctly if
+ 'linebreak' is also enabled. (Martin Tournoij)
+Solution: Make it work correctly. (Christian Brabandt, closes #4822,
+ closes #4812)
+Files: src/screen.c, src/testdir/test_listchars.vim
+
+Patch 8.1.1869
+Problem: Code for the argument list is spread out.
+Solution: Put argument list code in arglist.c. (Yegappan Lakshmanan,
+ closes #4819)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/arglist.c, src/buffer.c, src/evalfunc.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/proto.h, src/proto/arglist.pro,
+ src/proto/buffer.pro, src/proto/ex_cmds2.pro,
+ src/proto/ex_docmd.pro
+
+Patch 8.1.1870
+Problem: Using :pedit from a help file sets the preview window to help
+ filetype. (Wang Shidong)
+Solution: Do not set "keep_help_flag". (closes #3536)
+Files: src/ex_docmd.c, src/testdir/test_window_cmd.vim
+
+Patch 8.1.1871 (after 8.1.1866)
+Problem: Modeless selection in GUI still not correct.
+Solution: Fix max_col.
+Files: src/ui.c
+
+Patch 8.1.1872
+Problem: When Vim exits because of a signal, VimLeave is not triggered.
+ (Daniel Hahler)
+Solution: Unblock autocommands when triggering VimLeave. (closes #4818)
+Files: src/main.c
+
+Patch 8.1.1873 (after 8.1.1872)
+Problem: Cannot build tiny version.
+Solution: Remove #ifdef for is_autocmd_blocked().
+Files: src/autocmd.c
+
+Patch 8.1.1874
+Problem: Modeless selection in popup window overlaps scrollbar.
+Solution: Subtract scrollbar from max_col. (closes #4773)
+Files: src/ui.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_select_01.dump
+
+Patch 8.1.1875
+Problem: Cannot get size and position of the popup menu.
+Solution: Add pum_getpos(). (Ben Jackson, closes #4827)
+Files: runtime/doc/autocmd.txt, runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_popup.vim
+
+Patch 8.1.1876
+Problem: proto file missing from distribution
+Solution: Add the file.
+Files: Filelist
+
+Patch 8.1.1877
+Problem: Graduated features scattered.
+Solution: Put graduated and obsolete features together.
+Files: src/feature.h
+
+Patch 8.1.1878
+Problem: Negative float before method not parsed correctly.
+Solution: Apply "!" and "-" in front of expression before using ->.
+Files: src/eval.c, src/proto/eval.pro, src/userfunc.c,
+ src/testdir/test_method.vim
+
+Patch 8.1.1879
+Problem: More functions can be used as methods.
+Solution: Make float functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_float_func.vim
+
+Patch 8.1.1880
+Problem: Cannot show extra info for completion in a popup window.
+Solution: Add the "popup" entry in 'completeopt'.
+Files: runtime/doc/options.txt, src/popupmnu.c, src/ex_cmds.c,
+ src/proto/ex_cmds.pro, src/ex_docmd.c, src/search.c, src/tag.c,
+ src/popupwin.c, src/proto/popupwin.pro, src/option.c, src/vim.h,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_infopopup_1.dump,
+ src/testdir/dumps/Test_popupwin_infopopup_2.dump,
+ src/testdir/dumps/Test_popupwin_infopopup_3.dump,
+ src/testdir/dumps/Test_popupwin_infopopup_4.dump
+
+Patch 8.1.1881
+Problem: Popup window test fails in some configurations.
+Solution: Check that screendumps can be made.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.1882
+Problem: Cannot specify properties of the info popup window.
+Solution: Add the 'completepopup' option. Default to PmenuSel highlight.
+Files: runtime/doc/options.txt, runtime/doc/insert.txt, src/option.c,
+ src/popupwin.c, src/proto/popupwin.pro, src/option.h,
+ src/testdir/test_popupwin.vim, src/screen.c,
+ src/testdir/dumps/Test_popupwin_infopopup_1.dump,
+ src/testdir/dumps/Test_popupwin_infopopup_2.dump,
+ src/testdir/dumps/Test_popupwin_infopopup_3.dump
+
+Patch 8.1.1883
+Problem: Options test fails.
+Solution: Add entry for 'completepopup'.
+Files: src/testdir/gen_opt_test.vim
+
+Patch 8.1.1884
+Problem: Cannot use mouse scroll wheel in popup in Insert mode. Mouse
+ clicks in popup close the popup menu.
+Solution: Check if the mouse is in a popup window. Do not let mouse events
+ close the popup menu. (closes #4544)
+Files: src/edit.c, src/popupmnu.c, src/insexpand.c
+
+Patch 8.1.1885
+Problem: Comments in libvterm are inconsistent.
+Solution: Use // comments. Also update the table of combining characters.
+Files: src/libvterm/bin/unterm.c, src/libvterm/bin/vterm-ctrl.c,
+ src/libvterm/bin/vterm-dump.c, src/libvterm/include/vterm.h,
+ src/libvterm/include/vterm_keycodes.h,
+ src/libvterm/src/encoding.c, src/libvterm/src/keyboard.c,
+ src/libvterm/src/mouse.c, src/libvterm/src/parser.c,
+ src/libvterm/src/pen.c, src/libvterm/src/rect.h,
+ src/libvterm/src/state.c, src/libvterm/src/unicode.c,
+ src/libvterm/src/utf8.h, src/libvterm/src/vterm.c,
+ src/libvterm/src/vterm_internal.h, src/libvterm/src/termscreen.c
+
+Patch 8.1.1886
+Problem: Command line expansion code is spread out.
+Solution: Move the code to cmdexpand.c. (Yegappan Lakshmanan, closes #4831)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/cmdexpand.c, src/evalfunc.c, src/ex_getln.c, src/proto.h,
+ src/proto/cmdexpand.pro, src/proto/ex_getln.pro, src/structs.h
+
+Patch 8.1.1887
+Problem: The +cmdline_compl feature is not in the tiny version.
+Solution: Graduate the +cmdline_compl feature.
+Files: src/cmdexpand.c, src/arglist.c, src/autocmd.c, src/buffer.c,
+ src/cmdhist.c, src/eval.c, src/evalfunc.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/feature.h, src/highlight.c,
+ src/if_cscope.c, src/map.c, src/menu.c, src/misc1.c, src/misc2.c,
+ src/option.c, src/sign.c, src/syntax.c, src/tag.c, src/term.c,
+ src/usercmd.c, src/userfunc.c, src/version.c, src/globals.h,
+ src/option.h, src/structs.h, runtime/doc/cmdline.txt
+
+Patch 8.1.1888
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_vimscript.vim, src/testdir/test_balloon_gui.vim,
+ src/testdir/test_popup.vim, src/testdir/test_functions.vim,
+ src/testdir/test_hide.vim, src/testdir/test_arglist.vim
+
+Patch 8.1.1889
+Problem: Coverity warns for using a NULL pointer.
+Solution: Use zero for column if pos is NULL.
+Files: src/netbeans.c
+
+Patch 8.1.1890
+Problem: Ml_get error when deleting fold marker.
+Solution: Check that the line number is not below the last line. Adjust the
+ fold when deleting the empty line. (Christian Brabandt,
+ closes #4834)
+Files: src/fold.c, src/normal.c, src/testdir/test_fold.vim
+
+Patch 8.1.1891
+Problem: Functions used in one file are global.
+Solution: Add "static". (Yegappan Lakshmanan, closes #4840)
+Files: src/autocmd.c, src/buffer.c, src/change.c, src/channel.c,
+ src/charset.c, src/dict.c, src/digraph.c, src/eval.c,
+ src/ex_cmds.c, src/ex_eval.c, src/fileio.c, src/findfile.c,
+ src/getchar.c, src/gui.c, src/indent.c, src/json.c, src/list.c,
+ src/mark.c, src/menu.c, src/message.c, src/misc1.c, src/misc2.c,
+ src/ops.c, src/option.c, src/popupwin.c, src/profiler.c,
+ src/proto/autocmd.pro, src/proto/buffer.pro, src/proto/change.pro,
+ src/proto/channel.pro, src/proto/charset.pro, src/proto/dict.pro,
+ src/proto/eval.pro, src/proto/ex_cmds.pro, src/proto/ex_eval.pro,
+ src/proto/fileio.pro, src/proto/findfile.pro,
+ src/proto/getchar.pro, src/proto/gui.pro, src/proto/indent.pro,
+ src/proto/json.pro, src/proto/list.pro, src/proto/mark.pro,
+ src/proto/menu.pro, src/proto/message.pro, src/proto/misc1.pro,
+ src/proto/misc2.pro, src/proto/ops.pro, src/proto/option.pro,
+ src/proto/popupwin.pro, src/proto/profiler.pro,
+ src/proto/quickfix.pro, src/proto/spell.pro, src/proto/term.pro,
+ src/proto/textprop.pro, src/proto/ui.pro, src/proto/undo.pro,
+ src/proto/window.pro, src/quickfix.c, src/regexp.c, src/spell.c,
+ src/term.c, src/textprop.c, src/ui.c, src/undo.c, src/window.c
+
+Patch 8.1.1892
+Problem: Missing index entry and option menu for 'completepopup'.
+Solution: Add the entries. Adjust #ifdefs to avoid dead code.
+Files: runtime/doc/quickref.txt, runtime/optwin.vim, src/option.c,
+ src/option.h, src/popupwin.c
+
+Patch 8.1.1893
+Problem: Script to summarize test results can be improved.
+Solution: Use "silent" for substitute to avoid reporting number of matches.
+ Remove duplicate "set nocp". (Daniel Hahler, closes #4845)
+Files: src/testdir/summarize.vim
+
+Patch 8.1.1894
+Problem: Not checking for out-of-memory of autoload_name().
+Solution: Check for NULL. (Dominique Pelle, closes #4846)
+Files: src/eval.c
+
+Patch 8.1.1895
+Problem: Using NULL pointer when out of memory.
+Solution: Bail out or skip the code using the pointer. (Zu-Ming Jiang,
+ closes #4805, closes #4843, closes #4939, closes #4844)
+Files: src/message.c, src/highlight.c, src/buffer.c, src/ops.c
+
+Patch 8.1.1896
+Problem: Compiler warning for unused variable.
+Solution: Add #ifdef. (John Marriott) Missing part of 8.1.1892.
+Files: src/popupmnu.c
+
+Patch 8.1.1897
+Problem: May free memory twice when out of memory.
+Solution: Check that backslash_halve_save() returns a different pointer.
+ (Dominique Pelle, closes #4847)
+Files: src/cmdexpand.c, src/misc1.c
+
+Patch 8.1.1898
+Problem: Crash when out of memory during startup.
+Solution: When out of memory message given during initialisation bail out.
+ (closes #4842)
+Files: src/misc2.c
+
+Patch 8.1.1899
+Problem: sign_place() does not work as documented.
+Solution: Make it accept line numbers like line(). (Yegappan Lakshmanan,
+ closes #4848)
+Files: src/sign.c, src/testdir/test_signs.vim
+
+Patch 8.1.1900
+Problem: Sign test fails in the GUI.
+Solution: Catch and ignore the exception.
+Files: src/testdir/test_signs.vim
+
+Patch 8.1.1901
+Problem: The +insert_expand feature is not always available.
+Solution: Graduate the +insert_expand feature.
+Files: src/feature.h, src/autocmd.c, src/buffer.c, src/change.c,
+ src/charset.c, src/edit.c, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_getln.c, src/getchar.c, src/gui.c, src/highlight.c,
+ src/indent.c, src/insexpand.c, src/misc2.c, src/move.c,
+ src/option.c, src/popupmnu.c, src/screen.c, src/search.c,
+ src/spell.c, src/tag.c, src/term.c, src/userfunc.c, src/version.c,
+ src/globals.h, src/option.h, src/proto.h, src/structs.h,
+ src/vim.h, runtime/doc/change.txt, runtime/doc/index.txt,
+ runtime/doc/insert.txt, runtime/doc/options.txt
+
+Patch 8.1.1902
+Problem: Cannot have an info popup without a border.
+Solution: Add the "border" item to 'completepopup'.
+Files: src/popupwin.c, src/proto/popupwin.pro, src/popupmnu.c,
+ src/testdir/test_popupwin.vim, src/testdir/gen_opt_test.vim,
+ src/testdir/dumps/Test_popupwin_infopopup_nb_1.dump
+
+Patch 8.1.1903
+Problem: Cannot build without the +eval feature.
+Solution: Add missing #ifdefs
+Files: src/insexpand.c, src/popupmnu.c
+
+Patch 8.1.1904
+Problem: Cannot have an info popup align with the popup menu.
+Solution: Add the "align" item to 'completepopup'.
+Files: src/popupwin.c, src/popupmnu.c, src/vim.h,
+ runtime/doc/insert.txt, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_infopopup_align_1.dump,
+ src/testdir/dumps/Test_popupwin_infopopup_align_2.dump,
+ src/testdir/dumps/Test_popupwin_infopopup_align_3.dump
+
+Patch 8.1.1905
+Problem: Cannot set all properties of the info popup.
+Solution: Add popup_findinfo(). Rename popup_getpreview() to
+ popup_findpreview().
+Files: src/popupwin.c, src/proto/popupwin.pro, src/ex_cmds.c,
+ src/ex_docmd.c, src/popupmnu.c, src/evalfunc.c,
+ runtime/doc/popup.txt, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_infopopup_align_3.dump
+
+Patch 8.1.1906
+Problem: Info popup size is sometimes incorrect.
+Solution: Compute the position and size after setting the content.
+Files: src/popupmnu.c
+
+Patch 8.1.1907
+Problem: Wrong position for info popup with scrollbar on the left.
+Solution: Take the scrollbar into account.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_infopopup_5.dump,
+ src/testdir/dumps/Test_popupwin_cursorline_3.dump,
+ src/testdir/dumps/Test_popupwin_cursorline_4.dump,
+ src/testdir/dumps/Test_popupwin_cursorline_5.dump,
+ src/testdir/dumps/Test_popupwin_cursorline_6.dump,
+ src/testdir/dumps/Test_popupwin_menu_filter_1.dump,
+ src/testdir/dumps/Test_popupwin_menu_filter_2.dump,
+ src/testdir/dumps/Test_popupwin_menu_filter_3.dump,
+ src/testdir/dumps/Test_popupwin_menu_filter_4.dump
+
+Patch 8.1.1908
+Problem: Every popup window consumes a buffer number.
+Solution: Recycle buffers only used for popup windows. Do not list popup
+ window buffers.
+Files: src/popupwin.c, src/window.c, src/vim.h, src/buffer.c,
+ src/proto/buffer.pro, src/ex_docmd.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1909
+Problem: More functions can be used as methods.
+Solution: Make a few more functions usable as a method.
+Files: runtime/doc/eval.txt, runtime/doc/testing.txt, src/evalfunc.c,
+ src/testdir/test_popupwin.vim, src/testdir/test_bufwintabinfo.vim,
+ src/testdir/test_bufline.vim, src/testdir/test_assert.vim
+
+Patch 8.1.1910
+Problem: Redrawing too much when toggling 'relativenumber'.
+Solution: Only clear when 'signcolumn' is set to "number". (Yegappan
+ Lakshmanan, closes #4852)
+Files: src/option.c
+
+Patch 8.1.1911
+Problem: More functions can be used as methods.
+Solution: Make a few more functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test69.in,
+ src/testdir/test69.ok, src/testdir/test_functions.vim
+
+Patch 8.1.1912
+Problem: More functions can be used as methods.
+Solution: Make channel and job functions usable as a method.
+Files: runtime/doc/channel.txt, src/evalfunc.c,
+ src/testdir/test_channel.vim
+
+Patch 8.1.1913
+Problem: Not easy to compute the space on the command line.
+Solution: Add v:echospace. (Daniel Hahler, closes #4732)
+Files: src/vim.h, src/eval.c, src/option.c, runtime/doc/eval.txt,
+ src/testdir/test_messages.vim
+
+Patch 8.1.1914
+Problem: Command line expansion code is spread out.
+Solution: Move set_one_cmd_context(). (Yegappan Lakshmanan, closes #4855)
+Files: src/cmdexpand.c, src/ex_docmd.c, src/proto/ex_docmd.pro
+
+Patch 8.1.1915
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim, src/testdir/test_cd.vim,
+ src/testdir/test_cindent.vim, src/testdir/test_match.vim,
+ src/testdir/test_popup.vim, src/testdir/test_cursor_func.vim,
+ src/testdir/test_method.vim, src/testdir/test_bufline.vim,
+ src/testdir/test_diffmode.vim
+
+Patch 8.1.1916
+Problem: Trying to allocate negative amount of memory when closing a popup.
+Solution: Check the rows are not out of bounds. Don't finish a selection if
+ it was never started.
+Files: src/ui.c
+
+Patch 8.1.1917
+Problem: Non-current window is not redrawn when moving popup. (Ben Jackson)
+Solution: Redraw all windows under a popup. (closes #4860)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_drag_01.dump,
+ src/testdir/dumps/Test_popupwin_drag_02.dump,
+ src/testdir/dumps/Test_popupwin_drag_03.dump
+
+Patch 8.1.1918
+Problem: Redrawing popups is inefficient.
+Solution: Fix the logic to compute what window lines to redraw. Make it
+ work below the last line. Remove redrawing all windows.
+Files: src/popupwin.c
+
+Patch 8.1.1919
+Problem: Using current window option values when passing a buffer to
+ popup_create().
+Solution: Clear the window-local options. (closes #4857)
+Files: src/option.c, src/proto/option.pro, src/popupwin.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1920
+Problem: Cannot close a popup by the X when a filter consumes all events.
+Solution: Check for a click on the close button before invoking filters.
+ (closes #4858)
+Files: src/popupwin.c, src/proto/popupwin.pro, src/ui.c,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_close_04.dump,
+ src/testdir/dumps/Test_popupwin_close_05.dump
+
+Patch 8.1.1921
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_expand.vim,
+ src/testdir/test_expand_func.vim, src/testdir/test_expr.vim,
+ src/testdir/test_findfile.vim, src/testdir/test_fnameescape.vim,
+ src/testdir/test_fnamemodify.vim, src/testdir/test_fold.vim,
+ src/testdir/test_functions.vim, src/testdir/test_search.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.1.1922
+Problem: In diff mode global operations can be very slow.
+Solution: Do not call diff_redraw() many times, call it once when redrawing.
+ And also don't update folds multiple times.
+Files: src/globals.h, src/diff.c, src/proto/diff.pro, src/screen.c,
+ src/fold.c
+
+Patch 8.1.1923
+Problem: Some source files are not in a normal encoding.
+Solution: Convert hangulin.c from euc-kr to utf-8 and digraph.c from latin1
+ to utf-8. (Daniel Hahler, closes #4731)
+Files: src/hangulin.c, src/digraph.c, .travis.yml
+
+Patch 8.1.1924
+Problem: Using empty string for current buffer is unexpected.
+Solution: Make the argument optional for bufname() and bufnr().
+Files: src/evalfunc.c, src/testdir/test_arglist.vim, runtime/doc/eval.txt
+
+Patch 8.1.1925
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_bufline.vim, src/testdir/test_bufwintabinfo.vim,
+ src/testdir/test_cd.vim, src/testdir/test_changelist.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_edit.vim,
+ src/testdir/test_environ.vim, src/testdir/test_file_perm.vim,
+ src/testdir/test_getvar.vim, src/testdir/test_jumplist.vim,
+ src/testdir/test_put.vim, src/testdir/test_stat.vim
+
+Patch 8.1.1926
+Problem: Cursorline not redrawn when putting a line above the cursor.
+Solution: Redraw when the cursor line is below a change. (closes #4862)
+Files: src/change.c
+
+Patch 8.1.1927
+Problem: Code for dealing with script files is spread out.
+Solution: Move the code to scriptfile.c. (Yegappan Lakshmanan, closes #4861)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/cmdexpand.c, src/ex_cmds2.c, src/proto.h,
+ src/proto/ex_cmds2.pro, src/proto/scriptfile.pro, src/scriptfile.c
+
+Patch 8.1.1928
+Problem: Popup windows don't move with the text when making changes.
+Solution: Add the 'textprop' property to the popup window options, position
+ the popup relative to a text property. (closes #4560)
+ No tests yet.
+Files: runtime/doc/popup.txt, src/textprop.c, src/proto/textprop.pro,
+ src/structs.h, src/popupwin.c, src/proto/popupwin.pro, src/move.c,
+ src/proto/move.pro, src/window.c
+
+Patch 8.1.1929
+Problem: No tests for text property popup window.
+Solution: Add a few tests.
+Files: src/testdir/Make_all.mak, src/textprop.c,
+ src/testdir/test_popupwin_textprop.vim,
+ src/testdir/dumps/Test_popup_textprop_01.dump,
+ src/testdir/dumps/Test_popup_textprop_02.dump,
+ src/testdir/dumps/Test_popup_textprop_03.dump,
+ src/testdir/dumps/Test_popup_textprop_04.dump,
+ src/testdir/dumps/Test_popup_textprop_05.dump,
+ src/testdir/dumps/Test_popup_textprop_06.dump
+
+Patch 8.1.1930
+Problem: Cannot recognize .jsx and .tsx files.
+Solution: Recognize them as javascriptreact and typescriptreact.
+ (closes #4830)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim,
+ runtime/syntax/javascriptreact.vim,
+ runtime/indent/javascriptreact.vim,
+ runtime/ftplugin/javascriptreact.vim
+
+Patch 8.1.1931 (after 8.1.1930)
+Problem: Syntax test fails.
+Solution: Add new javascriptreact type to completions.
+Files: src/testdir/test_syntax.vim
+
+Patch 8.1.1932
+Problem: Ml_get errors after using append(). (Alex Genco)
+Solution: Do not update the cursor twice. (closes #1737)
+Files: src/evalfunc.c, src/testdir/test_functions.vim
+
+Patch 8.1.1933
+Problem: The eval.c file is too big.
+Solution: Move code related to variables to evalvars.c. (Yegappan
+ Lakshmanan, closes #4868)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/eval.c, src/evalfunc.c, src/evalvars.c, src/globals.h,
+ src/proto.h, src/proto/eval.pro, src/proto/evalvars.pro, src/vim.h
+
+Patch 8.1.1934
+Problem: Not enough tests for text property popup window.
+Solution: Add a few more tests.
+Files: src/popupwin.c, src/testdir/test_popupwin_textprop.vim,
+ src/testdir/dumps/Test_popup_textprop_corn_1.dump,
+ src/testdir/dumps/Test_popup_textprop_corn_2.dump,
+ src/testdir/dumps/Test_popup_textprop_corn_3.dump,
+ src/testdir/dumps/Test_popup_textprop_corn_4.dump
+
+Patch 8.1.1935 (after 8.1.1934)
+Problem: Test for text property popup window is flaky.
+Solution: Remove the undo message
+Files: src/testdir/test_popupwin_textprop.vim,
+ src/testdir/dumps/Test_popup_textprop_corn_4.dump
+
+Patch 8.1.1936
+Problem: Not enough tests for text property popup window.
+Solution: Add a few more tests. Make negative offset work. Close all
+ popups when window closes.
+Files: src/popupwin.c, src/testdir/test_popupwin_textprop.vim,
+ src/testdir/dumps/Test_popup_textprop_07.dump,
+ src/testdir/dumps/Test_popup_textprop_off_1.dump,
+ src/testdir/dumps/Test_popup_textprop_off_2.dump,
+ src/testdir/dumps/Test_popup_textprop_corn_5.dump,
+ src/testdir/dumps/Test_popup_textprop_corn_6.dump
+
+Patch 8.1.1937 (after 8.1.1930)
+Problem: Errors when using javascriptreact.
+Solution: Use ":runtime" instead of ":source". (closes #4875)
+Files: runtime/syntax/javascriptreact.vim,
+ runtime/indent/javascriptreact.vim,
+ runtime/ftplugin/javascriptreact.vim
+
+Patch 8.1.1938
+Problem: May crash when out of memory.
+Solution: Initialize v_type to VAR_UNKNOWN. (Dominique Pelle, closes #4871)
+Files: src/userfunc.c
+
+Patch 8.1.1939
+Problem: Code for handling v: variables in generic eval file.
+Solution: Move v: variables to evalvars.c. (Yegappan Lakshmanan,
+ closes #4872)
+Files: src/eval.c, src/evalvars.c, src/proto/eval.pro,
+ src/proto/evalvars.pro
+
+Patch 8.1.1940 (after 8.1.1939)
+Problem: Script tests fail.
+Solution: Don't set vimvars type in set_vim_var_nr().
+Files: src/eval.c, src/evalvars.c, src/proto/evalvars.pro
+
+Patch 8.1.1941
+Problem: getftype() test fails on Mac.
+Solution: Skip /dev/fd/.
+Files: src/testdir/test_stat.vim
+
+Patch 8.1.1942
+Problem: Shadow directory gets outdated when files are added.
+Solution: Add the "shadowupdate" target and add a few comments.
+Files: src/Makefile
+
+Patch 8.1.1943
+Problem: More code can be moved to evalvars.c.
+Solution: Move it, clean up comments. Also move some window related
+ functions to window.c. (Yegappan Lakshmanan, closes #4874)
+Files: src/eval.c, src/evalfunc.c, src/evalvars.c, src/proto/eval.pro,
+ src/proto/evalvars.pro, src/proto/window.pro, src/window.c
+
+Patch 8.1.1944
+Problem: Leaking memory when using sound callback.
+Solution: Free the callback queue item.
+Files: src/sound.c
+
+Patch 8.1.1945
+Problem: Popup window "firstline" cannot be reset.
+Solution: Allow for setting "firstline" to zero. Fix that the text jumps to
+ the top when using win_execute(). (closes #4876)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_scroll_5.dump,
+ src/testdir/dumps/Test_popupwin_scroll_6.dump
+
+Patch 8.1.1946
+Problem: Memory error when profiling a function without a script ID.
+Solution: Check for missing script ID. (closes #4877)
+Files: src/testdir/test_profile.vim, src/profiler.c
+
+Patch 8.1.1947
+Problem: When executing one test the report doesn't show it.
+Solution: Adjust the regexp. (Daniel Hahler, closes #4879)
+Files: src/testdir/summarize.vim
+
+Patch 8.1.1948
+Problem: Mouse doesn't work in Linux console and causes 100% CPU. (James P.
+ Harvey)
+Solution: Loop in WaitForCharOrMouse() when gpm_process_wanted is set.
+ (closes #4828)
+Files: src/os_unix.c
+
+Patch 8.1.1949
+Problem: Cannot scroll a popup window to the very bottom.
+Solution: Scroll to the bottom when the "firstline" property was set to -1.
+ (closes #4577) Allow resetting min/max width/height.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/dict.c, src/proto/dict.pro,
+ src/testdir/dumps/Test_popupwin_firstline.dump,
+ src/testdir/dumps/Test_popupwin_firstline_1.dump,
+ src/testdir/dumps/Test_popupwin_firstline_2.dump,
+ src/testdir/dumps/Test_popupwin_scroll_10.dump
+
+Patch 8.1.1950
+Problem: Using NULL pointer after an out-of-memory.
+Solution: Check for NULL pointer. (Dominique Pelle, closes #4881)
+Files: src/syntax.c
+
+Patch 8.1.1951
+Problem: Mouse double click test is a bit flaky.
+Solution: Add to list of flaky tests. Update a couple of comments.
+Files: src/testdir/runtest.vim, src/testdir/shared.vim,
+ src/testdir/test_substitute.vim
+
+Patch 8.1.1952
+Problem: More functions can be used as a method.
+Solution: Allow more functions to be used as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_tagjump.vim, src/testdir/test_bufwintabinfo.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_getvar.vim,
+ src/testdir/test_escaped_glob.vim,
+ src/testdir/test_glob2regpat.vim
+
+Patch 8.1.1953
+Problem: More functions can be used as a method.
+Solution: Allow more functions to be used as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_blob.vim,
+ src/testdir/test_breakindent.vim, src/testdir/test_delete.vim,
+ src/testdir/test_functions.vim, src/testdir/test_getcwd.vim,
+ src/testdir/test_history.vim, src/testdir/test_listdict.vim,
+ src/testdir/test_syn_attr.vim, src/testdir/test_termcodes.vim,
+ src/testdir/test_true_false.vim
+
+Patch 8.1.1954
+Problem: More functions can be used as a method.
+Solution: Allow more functions to be used as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_arglist.vim, src/testdir/test_functions.vim,
+ src/testdir/test_json.vim, src/testdir/test_lispwords.vim,
+ src/testdir/test_listener.vim, src/testdir/test_lua.vim,
+ src/testdir/test_utf8.vim
+
+Patch 8.1.1955
+Problem: Tests contain typos.
+Solution: Correct the typos. (Dominique Pelle)
+Files: src/testdir/popupbounce.vim, src/testdir/runtest.vim,
+ src/testdir/screendump.vim, src/testdir/test49.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_cindent.vim,
+ src/testdir/test_const.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_search.vim,
+ src/testdir/test_tabpage.vim, src/testdir/test_tcl.vim
+
+Patch 8.1.1956
+Problem: Screenshot tests may use a different encoding. (Dominique Pelle)
+Solution: Always set 'encoding' to "utf-8" when running Vim in a terminal.
+ (closes #4884)
+Files: src/testdir/shared.vim, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_behind.dump
+
+Patch 8.1.1957
+Problem: More code can be moved to evalvars.c.
+Solution: Move code to where it fits better. (Yegappan Lakshmanan,
+ closes #4883)
+Files: src/eval.c, src/evalvars.c, src/ex_getln.c, src/globals.h,
+ src/if_py_both.h, src/proto/eval.pro, src/proto/evalvars.pro,
+ src/proto/ex_getln.pro, src/proto/scriptfile.pro,
+ src/scriptfile.c, src/session.c, src/viminfo.c
+
+Patch 8.1.1958
+Problem: Old style comments taking up space.
+Solution: Change to new style comments.
+Files: src/vim.h
+
+Patch 8.1.1959
+Problem: When using "firstline" in popup window text may jump when
+ redrawing it. (Nick Jensen)
+Solution: Set 'scrolloff' to zero in a popup window. (closes #4882)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_scroll_5.dump,
+ src/testdir/dumps/Test_popupwin_scroll_6.dump
+
+Patch 8.1.1960
+Problem: Fold code is spread out.
+Solution: Move fold functions to fold.c.
+Files: src/evalfunc.c, src/fold.c, src/proto/fold.pro
+
+Patch 8.1.1961
+Problem: More functions can be used as a method.
+Solution: Allow more functions to be used as a method. Add a test for
+ mapcheck().
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test70.in,
+ src/testdir/test_functions.vim, src/testdir/test_getcwd.vim,
+ src/testdir/test_maparg.vim, src/testdir/test_match.vim
+
+Patch 8.1.1962
+Problem: Leaking memory when using tagfunc().
+Solution: Free the user_data. (Dominique Pelle, closes #4886)
+Files: src/window.c
+
+Patch 8.1.1963
+Problem: Popup window filter may be called recursively when using a Normal
+ mode command. (Nick Jensen)
+Solution: Prevent recursiveness. (closes #4887) Also restore KeyTyped.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1964
+Problem: Crash when using nested map() and filter().
+Solution: Do not set the v:key type to string without clearing the pointer.
+ (closes #4888)
+Files: src/eval.c, src/testdir/test_filter_map.vim
+
+Patch 8.1.1965
+Problem: The search count message is not displayed when using a mapping.
+ (Gary Johnson)
+Solution: Ignore cmd_silent for showing the search count. (Christian
+ Brabandt)
+Files: src/search.c
+
+Patch 8.1.1966
+Problem: Some code in options.c fits better elsewhere.
+Solution: Move functions from options.c to other files. (Yegappan
+ Lakshmanan, closes #4889)
+Files: src/evalfunc.c, src/globals.h, src/indent.c, src/map.c,
+ src/option.c, src/proto/map.pro, src/proto/option.pro,
+ src/proto/quickfix.pro, src/proto/screen.pro, src/proto/spell.pro,
+ src/proto/window.pro, src/quickfix.c, src/screen.c, src/spell.c,
+ src/window.c
+
+Patch 8.1.1967
+Problem: Line() only works for the current window.
+Solution: Add an optional argument for the window to use.
+Files: runtime/eval.txt, src/evalfunc.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.1968
+Problem: Crash when using nested map().
+Solution: Clear the pointer in prepare_vimvar(). (Ozaki Kiichi,
+ closes #4890, closes #4891)
+Files: src/evalvars.c, src/testdir/test_filter_map.vim,
+ src/testdir/test_functions.vim
+
+Patch 8.1.1969
+Problem: Popup window filter is used in all modes.
+Solution: Add the "filtermode" property.
+Files: src/popupwin.c, src/vim.h, src/map.c, src/proto/map.pro,
+ src/structs.h, runtime/doc/popup.txt,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1970
+Problem: Search stat space wrong, no test for 8.1.1965.
+Solution: Fix check for cmd_silent. Add a test. (Christian Brabandt)
+Files: src/search.c, src/testdir/test_search_stat.vim
+
+Patch 8.1.1971
+Problem: Manually enabling features causes build errors. (John Marriott)
+Solution: Adjust #ifdefs.
+Files: src/proto.h, src/popupmnu.c, src/buffer.c, src/quickfix.c,
+ src/ui.c
+
+Patch 8.1.1972
+Problem: No proper test for getchar().
+Solution: Add a test with special characters.
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.1973
+Problem: Cannot build without the quickfix feature.
+Solution: Remove #ifdef for qf_info_T.
+Files: src/structs.h
+
+Patch 8.1.1974
+Problem: Coverity warns for using pointer as array.
+Solution: Call var2fpos() directly instead of using f_line().
+Files: src/evalfunc.c
+
+Patch 8.1.1975
+Problem: MS-Windows GUI responds slowly to timer.
+Solution: Break out of wait loop when timer was added or input is available.
+ (closes #4893)
+Files: src/gui_w32.c
+
+Patch 8.1.1976
+Problem: Travis log always shows test output.
+Solution: Change script to avoid if/else. (Ozaki Kiichi, closes #4892)
+Files: .travis.yml
+
+Patch 8.1.1977
+Problem: Terminal debugger plugin may hang.
+Solution: Wait longer when still reading symbols.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.1978
+Problem: The eval.c file is too big.
+Solution: Move filter() and map() to list.c.
+Files: src/eval.c, src/proto/eval.pro, src/list.c, src/proto/list.pro,
+ src/evalfunc.c
+
+Patch 8.1.1979
+Problem: Code for handling file names is spread out.
+Solution: Move code to new filepath.c file. Graduate FEAT_MODIFY_FNAME.
+Files: src/filepath.c, Filelist, src/Make_cyg_ming.mak,
+ src/Make_morph.mak, src/Make_mvc.mak, src/Make_vms.mms,
+ src/Makefile, src/README.md, src/eval.c, src/evalfunc.c,
+ src/ex_docmd.c, src/feature.h, src/findfile.c, src/if_cscope.c,
+ src/message.c, src/misc1.c, src/proto.h, src/proto/eval.pro,
+ src/proto/evalvars.pro src/proto/filepath.pro,
+ src/proto/findfile.pro, src/proto/message.pro, src/regexp.c,
+ src/version.c
+
+Patch 8.1.1980
+Problem: Fix for search stat not tested.
+Solution: Add a screenshot test. (Christian Brabandt)
+Files: src/testdir/test_search_stat.vim,
+ src/testdir/dumps/Test_searchstat_1.dump,
+ src/testdir/dumps/Test_searchstat_2.dump
+
+Patch 8.1.1981
+Problem: The evalfunc.c file is too big.
+Solution: Move undo functions to undo.c. Move cmdline functions to
+ ex_getln.c. Move some container functions to list.c.
+Files: src/evalfunc.c, src/undo.c, src/proto/undo.pro, src/ex_getln.c,
+ src/proto/ex_getln.pro, src/list.c, src/proto/list.pro
+
+Patch 8.1.1982
+Problem: More functions can be used as methods.
+Solution: Make popup functions usable as a method.
+Files: runtime/doc/popup.txt, src/evalfunc.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.1983
+Problem: Compiler nags for uninitialized variable and unused function.
+Solution: Add unnecessary initialization. Move function inside #ifdef.
+Files: src/memline.c, src/channel.c
+
+Patch 8.1.1984
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim, src/testdir/test_perl.vim,
+ src/testdir/test_prompt_buffer.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/testdir/test_pyx2.vim
+
+Patch 8.1.1985
+Problem: Code for dealing with paths is spread out.
+Solution: Move path related functions from misc1.c to filepath.c.
+ Remove NO_EXPANDPATH.
+Files: src/misc1.c, src/proto/misc1.pro, src/filepath.c,
+ src/evalfunc.c, src/globals.h, src/misc2.c, src/os_unix.c,
+ src/os_unix.h, src/proto/filepath.pro, src/scriptfile.c,
+ src/proto/misc2.pro, src/proto/scriptfile.pro, src/vim.h
+
+Patch 8.1.1986
+Problem: More functions can be used as methods.
+Solution: Make textprop functions usable as a method.
+Files: runtime/doc/textprop.txt, src/evalfunc.c,
+ src/testdir/test_textprop.vim
+
+Patch 8.1.1987
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_clientserver.vim,
+ src/testdir/test_eval_stuff.vim, src/testdir/test_functions.vim,
+ src/testdir/test_reltime.vim, src/testdir/test_rename.vim
+
+Patch 8.1.1988
+Problem: :startinsert! does not work the same way as "A".
+Solution: Use the same code to move the cursor. (closes #4896)
+Files: src/ex_docmd.c, src/normal.c, src/proto/normal.pro,
+ src/testdir/test_edit.vim
+
+Patch 8.1.1989
+Problem: The evalfunc.c file is still too big.
+Solution: Move f_pathshorten() to filepath.c. Move f_cscope_connection() to
+ if_cscope.c. Move diff_ functions to diff.c. Move timer_
+ functions to ex_cmds2.c. move callback functions to evalvars.c.
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/filepath.c,
+ src/proto/filepath.pro, src/if_cscope.c, src/proto/if_cscope.pro,
+ src/diff.c, src/proto/diff.pro, src/ex_cmds2.c,
+ src/proto/ex_cmds2.pro, src/evalvars.c, src/proto/evalvars.pro
+
+Patch 8.1.1990
+Problem: Cannot build with eval but without cscope.
+Solution: Always include if_cscope.pro.
+Files: src/proto.h
+
+Patch 8.1.1991
+Problem: Still cannot build with eval but without cscope.
+Solution: Move f_cscope_connection() outside of #ifdef.
+Files: src/if_cscope.c
+
+Patch 8.1.1992
+Problem: The search stat moves when wrapping at the end of the buffer.
+Solution: Put the "W" in front instead of at the end.
+Files: src/search.c, src/testdir/test_search_stat.vim
+
+Patch 8.1.1993
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_bufline.vim, src/testdir/test_charsearch.vim,
+ src/testdir/test_clientserver.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_cursor_func.vim, src/testdir/test_diffmode.vim,
+ src/testdir/test_environ.vim, src/testdir/test_functions.vim,
+ src/testdir/test_matchadd_conceal_utf8.vim,
+ src/testdir/test_popupwin.vim, src/testdir/test_search.vim,
+ src/testdir/test_searchpos.vim, src/testdir/test_utf8.vim
+
+Patch 8.1.1994
+Problem: MS-Windows: cannot build with eval but without cscope
+Solution: Adjust the makefiles to always build if_cscope.obj.
+Files: src/Make_mvc.mak, src/Make_cyg_ming.mak
+
+Patch 8.1.1995
+Problem: More functions can be used as methods.
+Solution: Make sign functions usable as a method.
+Files: runtime/doc/sign.txt, src/evalfunc.c, src/testdir/test_signs.vim
+
+Patch 8.1.1996
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_bufwintabinfo.vim,
+ src/testdir/test_cursor_func.vim, src/testdir/test_expr.vim,
+ src/testdir/test_functions.vim, src/testdir/test_put.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_sha256.vim,
+ src/testdir/test_tabpage.vim, src/testdir/test_tagjump.vim,
+ src/testdir/test_vartabs.vim
+
+Patch 8.1.1997
+Problem: No redraw after a popup window filter is invoked.
+Solution: Redraw if needed.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+ src/testdir/dumps/Test_popupwin_menu_filter_5.dump
+
+Patch 8.1.1998
+Problem: Redraw even when no popup window filter was invoked.
+Solution: Only redraw when must_redraw was set to a larger value.
+Files: src/popupwin.c
+
+Patch 8.1.1999
+Problem: Calling both PlaySoundW() and PlaySoundA().
+Solution: Only use PlaySoundW(). (Dan Thompson, closes #4903)
+Files: src/sound.c
+
+Patch 8.1.2000
+Problem: Plugin cannot get the current IME status.
+Solution: Add the getimstatus() function. (closes #4904)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/mbyte.c,
+ src/proto/mbyte.pro, src/testdir/test_iminsert.vim
+
+Patch 8.1.2001
+Problem: Some source files are too big.
+Solution: Move buffer and window related functions to evalbuffer.c and
+ evalwindow.c. (Yegappan Lakshmanan, closes #4898)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/buffer.c, src/channel.c, src/evalbuffer.c, src/evalfunc.c,
+ src/evalwindow.c, src/proto.h, src/proto/buffer.pro,
+ src/proto/evalbuffer.pro, src/proto/evalfunc.pro,
+ src/proto/evalwindow.pro, src/proto/window.pro, src/window.c
+
+Patch 8.1.2002
+Problem: Version number 2000 missing.
+Solution: Add the number in the list of patches.
+Files: src/version.c
+
+Patch 8.1.2003
+Problem: MS-Windows: code page 65001 is not recognized.
+Solution: Use utf-8 for code page 65001. (Dan Thompson, closes #4902)
+Files: src/mbyte.c
+
+Patch 8.1.2004
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_breakindent.vim, src/testdir/test_expr.vim,
+ src/testdir/test_functions.vim, src/testdir/test_sound.vim,
+ src/testdir/test_spell.vim, src/testdir/test_substitute.vim,
+ src/testdir/test_swap.vim, src/testdir/test_utf8.vim
+
+Patch 8.1.2005
+Problem: The regexp.c file is too big.
+Solution: Move the backtracking engine to a separate file. (Yegappan
+ Lakshmanan, closes #4905)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Makefile,
+ src/regexp.c, src/regexp_bt.c
+
+Patch 8.1.2006
+Problem: Build failure with huge features but without channel feature.
+Solution: Add #ifdef. (Dominique Pelle, closes #4906)
+Files: src/ui.c
+
+Patch 8.1.2007
+Problem: No test for what 8.1.1926 fixes.
+Solution: Add a test case.
+Files: src/testdir/test_highlight.vim
+
+Patch 8.1.2008
+Problem: Error for invalid range when using listener and undo. (Paul Jolly)
+Solution: Do not change the cursor before the lines are restored.
+ (closes #4908)
+Files: src/undo.c, src/testdir/test_listener.vim
+
+Patch 8.1.2009
+Problem: Cursorline highlighting not updated in popup window. (Marko
+ Mahnič)
+Solution: Check if the cursor position changed. (closes #4912)
+Files: src/popupwin.c, src/structs.h, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_cursorline_7.dump
+
+Patch 8.1.2010
+Problem: New file uses old style comments.
+Solution: Change to new style comments. (Yegappan Lakshmanan, closes #4910)
+Files: src/regexp_bt.c
+
+Patch 8.1.2011
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method. Make the window
+ command test faster.
+Files: runtime/doc/eval.txt, runtime/doc/testing.txt, src/evalfunc.c,
+ src/testdir/test_assert.vim, src/testdir/test_gui.vim,
+ src/testdir/test_messages.vim, src/testdir/test_options.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_taglist.vim,
+ src/testdir/test_termcodes.vim, src/testdir/test_timers.vim,
+ src/testdir/test_vimscript.vim, src/testdir/test_viminfo.vim,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.1.2012
+Problem: More functions can be used as methods.
+Solution: Make terminal functions usable as a method. Fix term_getattr().
+Files: runtime/doc/terminal.txt, src/evalfunc.c, src/terminal.c
+ src/testdir/test_mksession.vim, src/testdir/test_terminal.vim
+
+Patch 8.1.2013
+Problem: More functions can be used as methods.
+Solution: Make various functions usable as a method.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_cursor_func.vim,
+ src/testdir/test_execute_func.vim, src/testdir/test_functions.vim,
+ src/testdir/test_listchars.vim, src/testdir/test_timers.vim,
+ src/testdir/test_undo.vim, src/testdir/test_window_cmd.vim,
+ src/testdir/test_window_id.vim
+
+Patch 8.1.2014
+Problem: Terminal altscreen test fails sometimes.
+Solution: Use WaitFor().
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.2015
+Problem: Terminal altscreen test still fails sometimes.
+Solution: Write the escape sequence in a file.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.2016
+Problem: Terminal altscreen test now fails on MS-Windows.
+Solution: Skip the test on MS-Windows
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.2017
+Problem: Cannot execute commands after closing the cmdline window.
+Solution: Also trigger BufEnter and WinEnter. (closes #4762)
+Files: runtime/doc/autocmd.txt, runtime/doc/cmdline.txt, src/ex_getln.c,
+ src/testdir/test_cmdline.vim
+
+Patch 8.1.2018
+Problem: Using freed memory when out of memory and displaying message.
+Solution: Make a copy of the message first.
+Files: src/main.c, src/message.c, src/normal.c
+
+Patch 8.1.2019
+Problem: 'cursorline' always highlights the whole line.
+Solution: Add 'cursorlineopt' to specify what is highlighted.
+ (Ozaki Kiichi, closes #4693)
+Files: runtime/doc/options.txt, runtime/doc/quickref.txt,
+ runtime/doc/syntax.txt, runtime/optwin.vim, src/option.c,
+ src/option.h, src/screen.c, src/structs.h,
+ src/testdir/Make_all.mak, src/testdir/gen_opt_test.vim,
+ src/testdir/test_alot.vim, src/testdir/test_cursorline.vim
+
+Patch 8.1.2020
+Problem: It is not easy to change the window layout.
+Solution: Add win_splitmove(). (Andy Massimino, closes #4561)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/evalwindow.c,
+ src/proto/evalwindow.pro, src/testdir/test_window_cmd.vim
+
+Patch 8.1.2021
+Problem: Some global functions can be local to the file.
+Solution: Add "static". (Yegappan Lakshmanan, closes #4917)
+Files: src/ex_cmds2.c, src/filepath.c, src/hangulin.c, src/mbyte.c,
+ src/misc1.c, src/os_unix.c, src/proto/ex_cmds2.pro,
+ src/proto/filepath.pro, src/proto/hangulin.pro,
+ src/proto/mbyte.pro, src/proto/misc1.pro, src/proto/os_unix.pro,
+ src/proto/terminal.pro, src/proto/undo.pro, src/pty.c,
+ src/terminal.c, src/undo.c
+
+Patch 8.1.2022
+Problem: The option.c file is too big.
+Solution: Move option definitions to a separate file. (Yegappan Lakshmanan,
+ closes #4918)
+Files: Filelist, src/Make_mvc.mak, src/Make_vms.mms, src/Makefile,
+ src/option.c, src/optiondefs.h
+
+Patch 8.1.2023
+Problem: No test for synIDattr() returning "strikethrough".
+Solution: Extend the synIDattr() test. (Jaskaran Singh, closes #4929)
+Files: src/testdir/test_syn_attr.vim
+
+Patch 8.1.2024
+Problem: Delete call commented out for debugging.
+Solution: Restore the delete call. (Christian Brabandt)
+Files: src/testdir/test_undo.vim
+
+Patch 8.1.2025
+Problem: MS-Windows: Including shlguid.h causes problems for msys2.
+Solution: Do not include shlguid.h. (closes #4913)
+Files: src/GvimExt/gvimext.h
+
+Patch 8.1.2026
+Problem: Possibly using uninitialized memory.
+Solution: Check if "dict" is NULL. (closes #4925)
+Files: src/ops.c
+
+Patch 8.1.2027
+Problem: MS-Windows: problem with ambiwidth characters.
+Solution: handle ambiguous width characters in ConPTY on Windows 10 (1903).
+ (Nobuhiro Takasaki, closes #4411)
+Files: src/Make_mvc.mak, src/Make_cyg_ming.mak, src/libvterm/src/parser.c,
+ src/libvterm/src/state.c, src/libvterm/src/termscreen.c,
+ src/libvterm/src/unicode.c, src/libvterm/src/vterm_internal.h,
+ src/misc2.c, src/os_win32.c, src/proto/misc2.pro,
+ src/proto/os_win32.pro
+
+Patch 8.1.2028
+Problem: Options test script does not work.
+Solution: Use optiondefs.h for input.
+Files: src/testdir/Makefile, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak
+
+Patch 8.1.2029
+Problem: Cannot control 'cursorline' highlighting well.
+Solution: Add "screenline". (Christian Brabandt, closes #4933)
+Files: runtime/doc/options.txt, src/change.c, src/main.c, src/option.c,
+ src/option.h, src/optiondefs.h, src/screen.c, src/structs.h,
+ src/highlight.c, src/testdir/dumps/Test_Xcursorline_1.dump,
+ src/testdir/dumps/Test_Xcursorline_2.dump,
+ src/testdir/dumps/Test_Xcursorline_3.dump,
+ src/testdir/dumps/Test_Xcursorline_4.dump,
+ src/testdir/dumps/Test_Xcursorline_5.dump,
+ src/testdir/dumps/Test_Xcursorline_6.dump,
+ src/testdir/dumps/Test_Xcursorline_7.dump,
+ src/testdir/dumps/Test_Xcursorline_8.dump,
+ src/testdir/dumps/Test_Xcursorline_9.dump,
+ src/testdir/dumps/Test_Xcursorline_10.dump,
+ src/testdir/dumps/Test_Xcursorline_11.dump,
+ src/testdir/dumps/Test_Xcursorline_12.dump,
+ src/testdir/dumps/Test_Xcursorline_13.dump,
+ src/testdir/dumps/Test_Xcursorline_14.dump,
+ src/testdir/dumps/Test_Xcursorline_15.dump,
+ src/testdir/dumps/Test_Xcursorline_16.dump,
+ src/testdir/dumps/Test_Xcursorline_17.dump,
+ src/testdir/dumps/Test_Xcursorline_18.dump,
+ src/testdir/gen_opt_test.vim, src/testdir/test_cursorline.vim,
+ src/testdir/dumps/Test_cursorline_yank_01.dump,
+ src/testdir/dumps/Test_wincolor_01.dump,
+ src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.2030
+Problem: Tests fail when build with normal features and terminal.
+ (Dominique Pelle)
+Solution: Disable tests that won't work. (closes #4932)
+Files: src/testdir/test_popupwin.vim, src/testdir/test_terminal.vim
+
+Patch 8.1.2031
+Problem: Cursor position wrong when resizing and using conceal.
+Solution: Set the flags that the cursor position is valid when setting the
+ row and column during redrawing. (closes #4931)
+Files: src/screen.c, src/testdir/test_conceal.vim,
+ src/testdir/dumps/Test_conceal_resize_01.dump,
+ src/testdir/dumps/Test_conceal_resize_02.dump
+
+Patch 8.1.2032
+Problem: Scrollbar thumb wrong in popup window.
+Solution: Adjust thumb size and position when scrolled.
+Files: src/popupwin.c, src/testdir/dumps/Test_popupwin_scroll_2.dump
+
+Patch 8.1.2033
+Problem: Cannot build with tiny features.
+Solution: Add #ifdef.
+Files: src/screen.c
+
+Patch 8.1.2034
+Problem: Dark theme of GTK 3 not supported.
+Solution: Add the "d" flag in 'guioptions'. (Jonathan Conder, closes #4934)
+Files: runtime/doc/options.txt, src/feature.h, src/gui.c,
+ src/gui_gtk_x11.c, src/option.h, src/proto/gui_gtk_x11.pro,
+ src/testdir/test_gui.vim
+
+Patch 8.1.2035
+Problem: Recognizing octal numbers is confusing.
+Solution: Introduce scriptversion 4: do not use octal and allow for single
+ quote inside numbers.
+Files: runtime/doc/eval.txt, src/vim.h, src/eval.c, src/scriptfile.c,
+ src/evalfunc.c, src/testdir/test_eval_stuff.vim,
+ src/testdir/test_functions.vim
+
+Patch 8.1.2036 (after 8.1.2035)
+Problem: The str2nr() tests fail.
+Solution: Add missing part of patch.
+Files: src/charset.c
+
+Patch 8.1.2037
+Problem: Can call win_gotoid() in cmdline window.
+Solution: Disallow switching windows. (Yasuhiro Matsumoto, closes #4940)
+Files: src/evalwindow.c, src/testdir/test_cmdline.vim
+
+Patch 8.1.2038
+Problem: has('vimscript-4') is always 0.
+Solution: Add "vimscript-4" to the feature table. (Naruhiko Nishino,
+ closes #4941)
+Files: src/evalfunc.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.1.2039
+Problem: Character from 'showbreak' does not use 'wincolor'. (Nick Jensen)
+Solution: Mix with 'wincolor'. (closes #4938)
+Files: src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_showbreak.dump
+
+Patch 8.1.2040
+Problem: No highlighting of current line in quickfix window.
+Solution: Combine with line_attr.
+Files: src/screen.c, src/testdir/test_quickfix.vim,
+ src/testdir/dumps/Test_quickfix_cwindow_1.dump,
+ src/testdir/dumps/Test_quickfix_cwindow_2.dump
+
+Patch 8.1.2041 (after 8.1.2040)
+Problem: No test for diff mode with syntax highlighting.
+Solution: Add a test case.
+Files: src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_syntax_1.dump
+
+Patch 8.1.2042
+Problem: The evalfunc.c file is too big.
+Solution: Move getchar() and parse_queued_messages() to getchar.c.
+Files: src/getchar.c, src/proto/getchar.pro, src/evalfunc.c, src/misc2.c,
+ src/proto/misc2.pro
+
+Patch 8.1.2043
+Problem: Not sufficient testing for quoted numbers.
+Solution: Add a few more test cases.
+Files: src/testdir/test_functions.vim, src/testdir/test_eval_stuff.vim
+
+Patch 8.1.2044
+Problem: No easy way to process postponed work. (Paul Jolly)
+Solution: Add the SafeState autocommand event.
+Files: runtime/doc/autocmd.txt, src/main.c, src/proto/main.pro,
+ src/vim.h, src/autocmd.c, src/channel.c, src/edit.c,
+ src/ex_getln.c
+
+Patch 8.1.2045
+Problem: The option.c file is too big.
+Solution: Split off the code dealing with strings. (Yegappan Lakshmanan,
+ closes #4937)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/option.c, src/option.h, src/optiondefs.h, src/optionstr.c,
+ src/ops.c, src/os_unix.c, src/proto.h, src/proto/option.pro,
+ src/proto/optionstr.pro
+
+Patch 8.1.2046
+Problem: SafeState may be triggered at the wrong moment.
+Solution: Move it up higher to after where messages are processed. Add a
+ SafeStateAgain event to trigger there.
+Files: runtime/doc/autocmd.txt, src/main.c, src/proto/main.pro,
+ src/getchar.c, src/channel.c, src/autocmd.c, src/vim.h
+
+Patch 8.1.2047
+Problem: Cannot check the current state.
+Solution: Add the state() function.
+Files: runtime/doc/eval.txt, src/misc1.c, src/proto/misc1.pro,
+ src/evalfunc.c, src/proto/evalfunc.pro, src/main.c,
+ src/proto/main.pro, src/channel.c, src/proto/channel.pro,
+ src/userfunc.c, src/proto/userfunc.pro
+
+Patch 8.1.2048
+Problem: Not clear why SafeState and SafeStateAgain are not triggered.
+Solution: Add log statements.
+Files: src/getchar.c, src/main.c, src/proto/main.pro
+
+Patch 8.1.2049 (after 8.1.2048)
+Problem: Cannot build tiny version.
+Solution: Add #ifdefs.
+Files: src/main.c
+
+Patch 8.1.2050
+Problem: Popup window test fails in some configurations. (James McCoy)
+Solution: Clear the command line.
+Files: src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_scroll_10.dump
+
+Patch 8.1.2051
+Problem: Double-click test is a bit flaky.
+Solution: Correct entry in list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.2052
+Problem: Using "x" before a closed fold may delete that fold.
+Solution: Do not translate 'x' do "dl". (Christian Brabandt, closes #4927)
+Files: src/normal.c, src/testdir/test_fold.vim
+
+Patch 8.1.2053
+Problem: SafeStateAgain not triggered if callback uses feedkeys().
+Solution: Check for safe state in the input loop. Make log messages easier
+ to find. Add 'S' flag to state().
+Files: src/main.c, src/proto/main.pro, src/getchar.c,
+ runtime/doc/eval.txt
+
+Patch 8.1.2054
+Problem: Compiler test for Perl may fail.
+Solution: Accept any error line number. (James McCoy, closes #4944)
+Files: src/testdir/test_compiler.vim
+
+Patch 8.1.2055
+Problem: Not easy to jump to function line from profile.
+Solution: Use "file:99" instead of "file line 99" so that "gf" works.
+ (Daniel Hahler, closes #4951)
+Files: src/profiler.c, src/testdir/test_profile.vim
+
+Patch 8.1.2056
+Problem: "make test" for indent files doesn't cause make to fail.
+Solution: Exit the script with ":cquit". (Daniel Hahler, closes #4949)
+Files: runtime/indent/testdir/runtest.vim, .gitignore
+
+Patch 8.1.2057
+Problem: The screen.c file is much too big.
+Solution: Split it in three parts. (Yegappan Lakshmanan, closes #4943)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/drawline.c, src/drawscreen.c, src/globals.h, src/proto.h,
+ src/proto/drawline.pro, src/proto/drawscreen.pro,
+ src/proto/screen.pro, src/screen.c, src/vim.h
+
+Patch 8.1.2058
+Problem: Function for ex command is named inconsistently.
+Solution: Rename do_marks() to ex_marks().
+Files: src/mark.c, src/proto/mark.pro, src/ex_cmds.h
+
+Patch 8.1.2059
+Problem: Fix for "x" deleting a fold has side effects.
+Solution: Fix it where the fold is included.
+Files: src/normal.c
+
+Patch 8.1.2060
+Problem: "precedes" in 'listchars' not used properly.
+Solution: Correctly handle the "precedes" char in list mode for long lines.
+ (Zach Wegner, Christian Brabandt, closes #4953)
+Files: runtime/doc/options.txt, src/drawline.c,
+ src/testdir/test_display.vim, src/testdir/view_util.vim
+
+Patch 8.1.2061
+Problem: MS-Windows GUI: ":sh" crashes when trying to use a terminal.
+Solution: Check for a NULL command. (Yasuhiro Matsumoto, closes #4958)
+Files: src/os_win32.c
+
+Patch 8.1.2062
+Problem: The mouse code is spread out.
+Solution: Move all the mouse code to mouse.c. (Yegappan Lakshmanan,
+ closes #4959)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/auto/configure, src/configure.ac, src/edit.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/ex_getln.c, src/insexpand.c,
+ src/libvterm/src/termmouse.c, src/libvterm/src/mouse.c,
+ src/main.c, src/message.c, src/misc1.c, src/misc2.c, src/mouse.c,
+ src/normal.c, src/proto.h, src/proto/edit.pro,
+ src/proto/misc1.pro, src/proto/misc2.pro, src/proto/mouse.pro,
+ src/proto/normal.pro, src/proto/term.pro, src/proto/ui.pro,
+ src/search.c, src/term.c, src/ui.c, src/vim.h, src/window.c
+
+Patch 8.1.2063
+Problem: Some tests fail when +balloon_eval_term is missing but
+ _balloon_eval is present. (Dominique Pelle)
+Solution: Check the right feature in the test. (closes #4962)
+Files: src/testdir/test_popupwin.vim, src/testdir/test_terminal.vim
+
+Patch 8.1.2064
+Problem: MS-Windows: compiler warnings for unused arguments.
+Solution: Add UNUSED. (Yegappan Lakshmanan, closes #4963)
+Files: src/channel.c, src/ex_docmd.c, src/ex_getln.c, src/fileio.c,
+ src/gui_w32.c, src/main.c, src/memline.c, src/os_mswin.c,
+ src/os_win32.c, src/terminal.c, src/ui.c, src/undo.c
+
+Patch 8.1.2065
+Problem: Compiler warning building non-GUI with MinGW.
+Solution: Adjust #ifdefs. (Yegappan Lakshmanan, closes #4964)
+Files: sre/mouse.c
+
+Patch 8.1.2066
+Problem: No tests for state().
+Solution: Add tests. Clean up some feature checks. Make "a" flag work.
+Files: src/testdir/test_functions.vim, src/testdir/test_terminal.vim,
+ src/misc1.c
+
+Patch 8.1.2067
+Problem: No tests for SafeState and SafeStateAgain.
+Solution: Add tests.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.1.2068 (after 8.1.2067)
+Problem: Test for SafeState and SafeStateAgain may fail.
+Solution: Accept more possible responses
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.1.2069 (after 8.1.2068)
+Problem: Test for SafeStateAgain may still fail.
+Solution: Send another message to trigger SafeStateAgain.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.1.2070
+Problem: Mouse code is spread out.
+Solution: Move mouse terminal code parsing to mouse.c. (Yegappan Lakshmanan,
+ closes #4966)
+Files: src/mouse.c, src/proto/mouse.pro, src/proto/term.pro, src/term.c
+
+Patch 8.1.2071
+Problem: When 'wincolor' is set text property changes highlighting. (Andy
+ Stewart)
+Solution: Fix combining colors. (closes #4968)
+Files: src/drawline.c, src/testdir/test_highlight.vim,
+ src/testdir/dumps/Test_wincolor_01.dump
+
+Patch 8.1.2072
+Problem: "gk" moves to start of line instead of upwards.
+Solution: Fix off-by-one error. (Christian Brabandt, closes #4969)
+Files: src/normal.c, src/testdir/test_normal.vim
+
+Patch 8.1.2073
+Problem: When editing a buffer 'colorcolumn' may not work.
+Solution: Set the buffer before copying option values. Call
+ check_colorcolumn() after copying window options.
+Files: src/buffer.c, src/option.c, src/proto/option.pro,
+ src/proto/indent.pro, src/testdir/test_highlight.vim,
+ src/testdir/dumps/Test_colorcolumn_1.dump
+
+Patch 8.1.2074
+Problem: Test for SafeState autocommand is a bit flaky.
+Solution: Add to list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.2075
+Problem: Get many log messages when waiting for a typed character.
+Solution: Do not repeat the repeated messages when nothing happens.
+Files: src/globals.h, src/channel.c, src/main.c
+
+Patch 8.1.2076
+Problem: Crash when trying to put a terminal buffer in a popup window.
+Solution: Check for NULL buffer. Do not allow putting a terminal in a popup
+ window.
+Files: src/libvterm/src/termscreen.c, src/terminal.c, src/popupwin.c,
+ runtime/doc/popup.txt, src/testdir/test_popupwin.vim
+
+Patch 8.1.2077
+Problem: The ops.c file is too big.
+Solution: Move code for dealing with registers to a new file. (Yegappan
+ Lakshmanan, closes #4982)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms src/Makefile, src/README.md,
+ src/ops.c, src/proto.h, src/proto/ops.pro, src/proto/register.pro,
+ src/register.c, src/structs.h
+
+Patch 8.1.2078
+Problem: Build error with +textprop but without +terminal. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/popupwin.c
+
+Patch 8.1.2079
+Problem: Popup window test fails without +terminal.
+Solution: Check for the +terminal feature.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.2080
+Problem: The terminal API is limited and can't be disabled.
+Solution: Add term_setapi() to set the function prefix. (Ozaki Kiichi,
+ closes #2907)
+Files: runtime/doc/eval.txt, runtime/doc/terminal.txt, src/channel.c,
+ src/evalfunc.c, src/proto/terminal.pro, src/structs.h,
+ src/terminal.c, src/testdir/term_util.vim,
+ src/testdir/test_terminal.vim
+
+Patch 8.1.2081
+Problem: The spell.c file is too big.
+Solution: Move the code for spell suggestions to a separate file. (Yegappan
+ Lakshmanan, closes #4988)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/proto.h, src/proto/spell.pro, src/proto/spellsuggest.pro,
+ src/spell.c, src/spell.h, src/spellsuggest.c
+
+Patch 8.1.2082
+Problem: Some files have a weird name to fit in 8.3 characters.
+Solution: Use a nicer names.
+Files: Filelist, Makefile, src/popupmnu.c, src/popupmenu.c,
+ src/proto/popupmnu.pro, src/proto/popupmenu.pro,
+ src/Make_cyg_ming.mak, src/Make_morph.mak, src/Make_mvc.mak,
+ src/Make_vms.mms, src/Makefile, src/proto.h, src/README.md,
+ src/uninstal.c, src/uninstall.c, uninstal.txt, uninstall.txt,
+ nsis/gvim.nsi, src/INSTALLpc.txt, src/dosinst.c, src/dosinst.h
+
+Patch 8.1.2083
+Problem: Multi-byte chars do not work properly with "%.*S" in printf().
+Solution: Use mb_ptr2cells(). Daniel Hahler, closes #4989)
+Files: src/testdir/test_expr.vim, src/message.c
+
+Patch 8.1.2084
+Problem: Amiga: cannot get the user name.
+Solution: Use getpwuid() if available. (Ola Söder, closes #4985)
+Files: src/os_amiga.c, src/os_amiga.h
+
+Patch 8.1.2085
+Problem: MS-Windows: draw error moving cursor over double-cell character.
+Solution: Move the cursor to the left edge if needed. (Nobuhiro Takasaki,
+ closes #4986)
+Files: src/os_win32.c
+
+Patch 8.1.2086 (after 8.1.2082)
+Problem: Missing a few changes for the renamed files.
+Solution: Rename in a few more places. (Ken Takata)
+Files: nsis/README.txt, runtime/doc/gui_w32.txt, runtime/doc/usr_90.txt,
+ src/GvimExt/GvimExt.reg, src/GvimExt/README.txt,
+ src/proto/popupmenu.pro, src/proto/popupmnu.pro
+
+Patch 8.1.2087
+Problem: Cannot easily select one test function to execute.
+Solution: Support the $TEST_FILTER environment variable. (Ozaki Kiichi,
+ closes #2695)
+Files: src/Makefile, src/testdir/runtest.vim, src/testdir/summarize.vim
+
+Patch 8.1.2088
+Problem: Renamed libvterm mouse.c file not in distributed file list.
+Solution: Rename the file in the file list.
+Files: Filelist
+
+Patch 8.1.2089 (after 8.1.2087)
+Problem: Do not get a hint that $TEST_FILTER was active.
+Solution: Mention $TEST_FILTER if no functions were executed.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.2090
+Problem: Not clear why channel log file ends.
+Solution: Add a "closing" line.
+Files: src/channel.c
+
+Patch 8.1.2091
+Problem: Double free when memory allocation fails. (Zu-Ming Jiang)
+Solution: Use VIM_CLEAR() instead of vim_free(). (closes #4991)
+Files: src/getchar.c
+
+Patch 8.1.2092
+Problem: MS-Windows: redirect in system() does not work.
+Solution: Handle 'shellxescape' and 'shellxquote' better. (Yasuhiro
+ Matsumoto, closes #2054)
+Files: src/ex_cmds.c, src/misc2.c, src/testdir/test_system.vim
+
+Patch 8.1.2093
+Problem: MS-Windows: system() test fails.
+Solution: Expect CR when using systemlist().
+Files: src/testdir/test_system.vim
+
+Patch 8.1.2094
+Problem: The fileio.c file is too big.
+Solution: Move buf_write() to bufwrite.c. (Yegappan Lakshmanan,
+ closes #4990)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/bufwrite.c, src/fileio.c, src/option.c, src/proto.h,
+ src/proto/bufwrite.pro, src/proto/fileio.pro, src/structs.h
+
+Patch 8.1.2095
+Problem: Leaking memory when getting item from dict.
+Solution: Also free the key when not evaluating.
+Files: src/dict.c
+
+Patch 8.1.2096
+Problem: Too many #ifdefs.
+Solution: Graduate FEAT_COMMENTS.
+Files: src/feature.h, src/buffer.c, src/change.c, src/edit.c,
+ src/evalfunc.c, src/fold.c, src/insexpand.c, src/misc1.c,
+ src/normal.c, src/ops.c, src/option.c, src/optionstr.c,
+ src/search.c, src/version.c, src/globals.h, src/option.h,
+ src/optiondefs.h, src/structs.h, runtime/doc/change.txt,
+ runtime/doc/options.txt, runtime/doc/various.txt
+
+Patch 8.1.2097
+Problem: :mksession is not sufficiently tested.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #4992)
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.2098 (after 8.1.2097)
+Problem: mksession test fails on MS-Windows.
+Solution: Skip testing with backslashes on MS-Windows.
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.2099
+Problem: state() test fails on some Mac systems.
+Solution: Increase the wait time. (closes #4983)
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.2100
+Problem: :mksession is not sufficiently tested.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #4993)
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.2101
+Problem: write_session_file() often defined but not used.
+Solution: Adjust the #ifdef. (Yegappan Lakshmanan, closes #4998)
+Files: src/session.c
+
+Patch 8.1.2102
+Problem: Can't build with GTK and FEAT_GUI_GNOME. (Tony Mechelynck)
+Solution: Adjust the #ifdef. (Yegappan Lakshmanan)
+Files: src/session.c
+
+Patch 8.1.2103
+Problem: wrong error message if "termdebugger" is not executable.
+Solution: Check if "termdebugger" is executable and give a clear error
+ message. (Ozaki Kiichi, closes #5000) Fix indents.
+Files: runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.1.2104
+Problem: The normal.c file is too big.
+Solution: Move do_pending_operator() to ops.c. (Yegappan Lakshmanan,
+ closes #4999).
+Files: src/normal.c, src/ops.c, src/proto/normal.pro, src/proto/ops.pro,
+ src/globals.h
+
+Patch 8.1.2105
+Problem: MS-Windows: system() may crash.
+Solution: Do not use "itmp" when it is NULL. (Yasuhiro Matsumoto,
+ closes #5005)
+Files: src/ex_cmds.c
+
+Patch 8.1.2106
+Problem: No tests for dragging the mouse beyond the window.
+Solution: Add a test. (Dominique Pelle, closes #5004)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.2107
+Problem: Various memory leaks reported by asan.
+Solution: Free the memory. (Ozaki Kiichi, closes #5003)
+Files: src/buffer.c, src/change.c, src/eval.c, src/evalfunc.c,
+ src/option.c, src/popupwin.c, src/proto/change.pro,
+ src/scriptfile.c, src/terminal.c, src/testdir/test_method.vim
+
+Patch 8.1.2108
+Problem: Cannot close the cmdline window from CmdWinEnter. (George Brown)
+Solution: Reset cmdwin_result earlier. (Christian Brabandt, closes #4980)
+Files: src/ex_getln.c, src/testdir/test_autocmd.vim
+
+Patch 8.1.2109
+Problem: popup_getoptions() hangs with tab-local popup.
+Solution: Correct pointer name. (Marko Mahnič, closes #5006)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.2110
+Problem: CTRL-C closes two popups instead of one.
+Solution: Reset got_int when the filter consumed the key.
+Files: src/getchar.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.2111
+Problem: Viminfo file not sufficiently tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5009)
+Files: src/testdir/test_viminfo.vim
+
+Patch 8.1.2112
+Problem: Build number for ConPTY is outdated.
+Solution: Update to new build number. (Nobuhiro Takasaki, closes #5014)
+Files: src/os_win32.c
+
+Patch 8.1.2113
+Problem: ":help expr-!~?" only works after searching.
+Solution: Escape "~" after "expr-". (closes #5015)
+Files: src/ex_cmds.c, src/testdir/test_help.vim
+
+Patch 8.1.2114
+Problem: When a popup is closed with CTRL-C the callback aborts.
+Solution: Reset got_int when invoking the callback. (closes #5008)
+Files: src/popupwin.c
+
+Patch 8.1.2115
+Problem: MS-Windows: shell commands fail if &shell contains a space.
+Solution: Use quotes instead of escaping. (closes #4920)
+Files: src/option.c, src/os_win32.c, src/testdir/test_startup.vim,
+ src/testdir/test_system.vim, src/vimrun.c,
+
+Patch 8.1.2116
+Problem: No check for out of memory.
+Solution: Check for NULL pointer.
+Files: src/option.c
+
+Patch 8.1.2117
+Problem: CursorLine highlight used while 'cursorline' is off.
+Solution: Check 'cursorline' is set. (closes #5017)
+Files: src/drawline.c, src/testdir/test_cursorline.vim
+
+Patch 8.1.2118
+Problem: Termcodes test fails when $TERM is "dumb".
+Solution: Skip the test. (James McCoy, closes #5019)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.2119
+Problem: memory access error for empty string when 'encoding' is a single
+ byte encoding.
+Solution: Check for empty string when getting the length. (Dominique Pelle,
+ closes #5021, closes #5007)
+Files: src/macros.h
+
+Patch 8.1.2120
+Problem: Some MB_ macros are more complicated than necessary. (Dominique
+ Pelle)
+Solution: Simplify the macros. Expand inline.
+Files: src/macros.h, src/beval.c, src/diff.c src/eval.c src/evalfunc.c
+ src/ex_getln.c, src/filepath.c, src/findfile.c, src/getchar.c,
+ src/highlight.c, src/ops.c, src/os_mswin.c, src/popupmenu.c,
+ src/search.c, src/spell.c, src/spellsuggest.c, src/terminal.c
+
+Patch 8.1.2121
+Problem: Mode is not updated when switching to terminal in Insert mode.
+Solution: Redraw the mode when entering a terminal window. (Jason Franklin)
+Files: src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 8.1.2122 (after 8.1.2121)
+Problem: Cannot build without terminal feature.
+Solution: Add #ifdef.
+Files: src/window.c
+
+Patch 8.1.2123
+Problem: Parsing CSI sequence is messy.
+Solution: Generalize parsing a CSI sequence.
+Files: src/term.c
+
+Patch 8.1.2124
+Problem: Ruler is not updated if win_execute() moves cursor.
+Solution: Update the status line. (closes #5022)
+Files: src/evalwindow.c, src/testdir/test_execute_func.vim
+
+Patch 8.1.2125
+Problem: Fnamemodify() fails when repeating :e.
+Solution: Do not go before the tail. (Rob Pilling, closes #5024)
+Files: src/filepath.c, src/testdir/test_fnamemodify.vim
+
+Patch 8.1.2126
+Problem: Viminfo not sufficiently tested.
+Solution: Add more test cases. Clean up comments. (Yegappan Lakshmanan,
+ closes #5032)
+Files: src/search.c, src/structs.h, src/testdir/test_viminfo.vim,
+ src/viminfo.c
+
+Patch 8.1.2127
+Problem: The indent.c file is a bit big.
+Solution: Move C-indent code to a new cindent.c file. Move other
+ indent-related code to indent.c. (Yegappan Lakshmanan,
+ closes #5031)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/change.c, src/cindent.c, src/edit.c, src/evalfunc.c,
+ src/ex_cmds.c, src/globals.h, src/indent.c, src/misc1.c,
+ src/ops.c, src/proto.h, src/proto/cindent.pro, src/proto/edit.pro,
+ src/proto/ex_cmds.pro, src/proto/indent.pro, src/proto/misc1.pro,
+ src/proto/ops.pro, src/userfunc.c
+
+Patch 8.1.2128
+Problem: Renamed libvterm sources makes merging difficult.
+Solution: Rename back to the original name and only rename the .o files.
+ Also clean the libvterm build artifacts. (James McCoy,
+ closes #5027)
+Files: src/libvterm/src/termmouse.c, src/libvterm/src/mouse.c,
+ src/libvterm/src/termscreen.c, src/libvterm/src/screen.c,
+ src/Makefile, src/configure.ac, src/auto/configure,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.1.2129
+Problem: Using hard coded executable path in test.
+Solution: Use v:progpath. Use $VIMRUNTIME instead of "runtime". (James
+ McCoy, closes #5025)
+Files: src/testdir/test49.vim, src/testdir/test_compiler.vim,
+ src/testdir/test_spell.vim
+
+Patch 8.1.2130 (after 8.1.2128)
+Problem: MSVC build fails.
+Solution: Add the source file name explicitly.
+Files: src/Make_mvc.mak
+
+Patch 8.1.2131 (after 8.1.2129)
+Problem: MSVC tests fail.
+Solution: Replace backslashes with slashes.
+Files: src/testdir/test_compiler.vim, src/testdir/test_spell.vim
+
+Patch 8.1.2132
+Problem: MS-Windows: screen mess when not recognizing insider build.
+Solution: Always move the cursor to the first column first. (Nobuhiro
+ Takasaki, closes #5036)
+Files: src/os_win32.c
+
+Patch 8.1.2133
+Problem: Some tests fail when run as root.
+Solution: Add CheckNotRoot and use it. (James McCoy, closes #5020)
+Files: src/testdir/check.vim, src/testdir/shared.vim,
+ src/testdir/test_rename.vim, src/testdir/test_swap.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_viminfo.vim
+
+Patch 8.1.2134
+Problem: Modifier keys are not always recognized.
+Solution: Handle key codes generated by xterm with modifyOtherKeys set.
+ Add this to libvterm so we can debug it.
+Files: src/term.c, src/getchar.c, src/libvterm/src/vterm_internal.h,
+ src/libvterm/src/state.c, src/libvterm/src/keyboard.c,
+ src/libvterm/include/vterm.h, src/globals.h, src/terminal.c
+
+Patch 8.1.2135
+Problem: With modifyOtherKeys Alt-a does not work properly.
+Solution: Remove the ALT modifier. Get multibyte after applying ALT.
+Files: src/getchar.c
+
+Patch 8.1.2136
+Problem: using freed memory with autocmd from fuzzer. (Dhiraj Mishra,
+ Dominique Pelle)
+Solution: Avoid using "wp" after autocommands. (closes #5041)
+Files: src/window.c, src/testdir/test_autocmd.vim
+
+Patch 8.1.2137
+Problem: Parsing the termresponse is not tested.
+Solution: Add a first test. (related to #5042)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.2138
+Problem: Including the build number in the Win32 binary is confusing.
+Solution: Only use the patchlevel.
+Files: src/vim.rc
+
+Patch 8.1.2139
+Problem: The modifyOtherKeys codes are not tested.
+Solution: Add a test case.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.2140
+Problem: "gk" and "gj" do not work correctly in number column.
+Solution: Allow for a negative "curswant". (Zach Wegner, closes #4969)
+Files: src/testdir/test_normal.vim, src/misc2.c, src/normal.c
+
+Patch 8.1.2141
+Problem: :tselect has an extra hit-enter prompt.
+Solution: Do not set need_wait_return when only moving the cursor.
+ (closes #5040)
+Files: src/message.c, src/testdir/test_tagjump.vim,
+ src/testdir/dumps/Test_tselect_1.dump
+
+Patch 8.1.2142
+Problem: Some key mappings do not work with modifyOtherKeys.
+Solution: Remove the Shift modifier if it is already included in the key.
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.1.2143
+Problem: Cannot see each command even when 'verbose' is set.
+Solution: List each command when 'verbose' is at least 16.
+Files: src/ex_docmd.c src/testdir/test_tagjump.vim,
+ src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_verbose_option_1.dump
+
+Patch 8.1.2144
+Problem: Side effects when using t_ti to enable modifyOtherKeys.
+Solution: Add t_TI and t_TE.
+Files: runtime/doc/term.txt, src/term.c, src/optiondefs.h, src/term.h,
+
+Patch 8.1.2145
+Problem: Cannot map <C-H> when modifyOtherKeys is enabled.
+Solution: Add the <C-H> mapping twice, both with modifier and as 0x08. Use
+ only the first one when modifyOtherKeys has been detected.
+Files: src/term.c, src/eval.c, src/getchar.c, src/globals.h,
+ src/gui_mac.c, src/gui_w32.c, src/highlight.c, src/if_ole.cpp,
+ src/main.c, src/map.c, src/menu.c, src/misc2.c, src/option.c,
+ src/proto/misc2.pro, src/proto/term.pro,
+ src/testdir/test_termcodes.vim, src/structs.h, src/terminal.c,
+ src/usercmd.c, src/vim.h
+
+Patch 8.1.2146 (after 8.1.2145)
+Problem: Build failure.
+Solution: Include omitted changed file.
+Files: src/optionstr.c
+
+Patch 8.1.2147
+Problem: Crash when allocating memory fails. (Zu-Ming Jiang)
+Solution: Check that 'spellcapcheck' is not NULL. (closes #5048)
+Files: src/spell.c
+
+Patch 8.1.2148
+Problem: No test for right click extending Visual area.
+Solution: Add a test. (Dominique Pelle, closes #5018)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.2149
+Problem: Crash when running out of memory very early.
+Solution: Do not use IObuff when it's NULL. (closes #5052)
+Files: src/message.c
+
+Patch 8.1.2150
+Problem: No test for 'ttymouse' set from xterm version response.
+Solution: Test the three possible values.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.2151
+Problem: State test is a bit flaky.
+Solution: Add to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.2152
+Problem: Problems navigating tags file on macOS Catalina.
+Solution: Use fseek instead of lseek. (John Lamb, fixes #5061)
+Files: src/tag.c
+
+Patch 8.1.2153
+Problem: Combining text property and syntax highlight is wrong. (Nick
+ Jensen)
+Solution: Compute the syntax highlight attribute much earlier.
+ (closes #5057)
+Files: src/drawline.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_syn_1.dump
+
+Patch 8.1.2154
+Problem: Quickfix window height wrong when there is a tabline. (Daniel
+ Hahler)
+Solution: Take the tabline height into account. (closes #5058)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.2155
+Problem: In a terminal window 'cursorlineopt' does not work properly.
+Solution: Check the 'cursorlineopt' value. (closes #5055)
+Files: src/drawline.c, src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_normal_1.dump,
+ src/testdir/dumps/Test_terminal_normal_2.dump,
+ src/testdir/dumps/Test_terminal_normal_3.dump
+
+Patch 8.1.2156
+Problem: First character after Tab is not highlighted.
+Solution: Remember the syntax attribute for a column.
+Files: src/drawline.c, src/testdir/test_syntax.vim,
+ src/testdir/dumps/Test_syntax_c_01.dump
+
+Patch 8.1.2157
+Problem: Libvterm source files missing from distribution.
+Solution: Rename source files. (closes #5065)
+Files: Filelist
+
+Patch 8.1.2158
+Problem: Terminal attributes missing in Terminal-normal mode.
+Solution: Use "syntax_attr".
+Files: src/drawline.c, src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_dumpload.dump
+
+Patch 8.1.2159
+Problem: Some mappings are listed twice.
+Solution: Skip mappings duplicated for modifyOtherKeys. (closes #5064)
+Files: src/map.c, src/testdir/test_mapping.vim
+
+Patch 8.1.2160
+Problem: Cannot build with +syntax but without +terminal.
+Solution: Add #ifdef.
+Files: src/drawline.c
+
+Patch 8.1.2161
+Problem: Mapping test fails.
+Solution: Run the test separately.
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim
+
+Patch 8.1.2162
+Problem: Popup resize test is flaky. (Christian Brabandt)
+Solution: Add the function to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.2163
+Problem: Cannot build with +spell but without +syntax.
+Solution: Add #ifdef. (John Marriott)
+Files: src/drawline.c
+
+Patch 8.1.2164
+Problem: Stuck when using "j" in a popupwin with popup_filter_menu if a
+ line wraps.
+Solution: Check the cursor line is visible. (closes #4577)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_wrap_1.dump,
+ src/testdir/dumps/Test_popupwin_wrap_2.dump
+
+Patch 8.1.2165
+Problem: Mapping test fails on Mac.
+Solution: Remove the default Mac mapping.
+Files: src/testdir/test_mapping.vim
+
+Patch 8.1.2166
+Problem: Rubyeval() not tested as a method.
+Solution: Change a test case.
+Files: src/testdir/test_ruby.vim
+
+Patch 8.1.2167
+Problem: Mapping test fails on MS-Windows.
+Solution: Remove all the existing Insert-mode mappings.
+Files: src/testdir/test_mapping.vim
+
+Patch 8.1.2168
+Problem: Heredoc assignment not skipped in if block.
+Solution: Check if "skip" is set. (closes #5063)
+Files: src/evalvars.c, src/testdir/test_let.vim
+
+Patch 8.1.2169
+Problem: Terminal flags are never reset.
+Solution: Reset the flags when setting 'term'.
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.1.2170 (after 8.1.2169)
+Problem: Cannot build without the +termresponse feature.
+Solution: Add #ifdef.
+Files: src/term.c
+
+Patch 8.1.2171
+Problem: Mouse support not always available.
+Solution: Enable mouse support also in tiny version. Do not define
+ FEAT_MOUSE_XTERM on MS-Windows (didn't really work).
+Files: src/feature.h, src/edit.c, src/evalfunc.c, src/ex_getln.c,
+ src/getchar.c, src/message.c, src/misc1.c, src/mouse.c,
+ src/move.c, src/normal.c, src/ops.c, src/option.c,
+ src/optionstr.c, src/os_unix.c, src/os_win32.c, src/register.c,
+ src/term.c, src/testing.c, src/window.c, src/globals.h,
+ src/option.h, src/optiondefs.h, src/os_win32.h, src/vim.h,
+ src/version.c
+
+Patch 8.1.2172
+Problem: Spell highlight is wrong at start of the line.
+Solution: Fix setting the "v" variable. (closes #5078)
+Files: src/drawline.c, src/testdir/test_spell.vim,
+ src/testdir/dumps/Test_spell_1.dump
+
+Patch 8.1.2173
+Problem: Searchit() has too many arguments.
+Solution: Move optional arguments to a struct. Add the "wrapped" argument.
+Files: src/search.c, src/proto/search.pro, src/structs.h, src/evalfunc.c,
+ src/ex_docmd.c, src/gui.c, src/quickfix.c, src/spell.c, src/tag.c,
+ src/ex_getln.c, src/insexpand.c, src/normal.c
+
+Patch 8.1.2174
+Problem: Screen not recognized as supporting "sgr" mouse codes.
+Solution: Recognize screen 4.7. (Jordan Christiansen, closes #5042)
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.1.2175
+Problem: Meson files are not recognized.
+Solution: Add the meson filetype. (Liam Beguin, Nirbheek Chauhan,
+ closes #5056) Also recognize hollywood.
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.2176
+Problem: Syntax attributes not combined with Visual highlighting. (Arseny
+ Nasokin)
+Solution: Combine the attributes. (closes #5083)
+Files: src/drawline.c, src/testdir/test_syntax.vim,
+ src/testdir/dumps/Test_syntax_c_01.dump
+
+Patch 8.1.2177
+Problem: Dart files are not recognized.
+Solution: Add a filetype rule. (Eugene Ciurana, closes #5087)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.2178
+Problem: Accessing uninitialized memory in test.
+Solution: Check if there was a match before using the match position.
+ (Dominique Pelle, closes #5088)
+Files: src/search.c
+
+Patch 8.1.2179
+Problem: Pressing "q" at the more prompt doesn't stop Python output. (Daniel
+ Hahler)
+Solution: Check for got_int in writer(). (closes #5053)
+ Also do this for Lua.
+Files: src/if_py_both.h, src/if_lua.c
+
+Patch 8.1.2180
+Problem: Error E303 is not useful when 'directory' is empty.
+Solution: Skip the error message. (Daniel Hahler, #5067)
+Files: src/memline.c, src/testdir/test_recover.vim,
+ runtime/doc/options.txt, runtime/doc/message.txt
+
+Patch 8.1.2181
+Problem: Highlighting wrong when item follows tab.
+Solution: Don't use syntax attribute when n_extra is non-zero.
+ (Christian Brabandt, closes #5076)
+Files: src/drawline.c, src/feature.h,
+ src/testdir/dumps/Test_syntax_c_01.dump
+
+Patch 8.1.2182
+Problem: Test42 seen as binary by git diff.
+Solution: Add .gitattributes file. Make explicit that 'cpo' does not
+ contain 'S'. (Daniel Hahler, closes #5072)
+Files: .gitattributes, Filelist, src/testdir/test42.in
+
+Patch 8.1.2183
+Problem: Running a test is a bit verbose.
+Solution: Silence some messages. (Daniel Hahler, closes #5070)
+Files: src/testdir/Makefile
+
+Patch 8.1.2184
+Problem: Option context is not copied when splitting a window. (Daniel
+ Hahler)
+Solution: Copy the option context, so that ":verbose set" works.
+ (closes #5066)
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.1.2185 (after 8.1.2181)
+Problem: Syntax test fails.
+Solution: Add missing file patch.
+Files: src/testdir/test_syntax.vim
+
+Patch 8.1.2186 (after 8.1.2184)
+Problem: Cannot build without the +eval feature.
+Solution: Move line inside #ifdef.
+Files: src/option.c
+
+Patch 8.1.2187
+Problem: Error for bad regexp even though regexp is not used when writing
+ a file. (Arseny Nasokin)
+Solution: Ignore regexp errors. (closes #5059)
+Files: src/cmdexpand.c, src/ex_docmd.c, src/testdir/test_writefile.vim
+
+Patch 8.1.2188 (after 8.1.2187)
+Problem: Build error for missing define.
+Solution: Add missing change.
+Files: src/vim.h
+
+Patch 8.1.2189
+Problem: Syntax highlighting wrong for tab.
+Solution: Don't clear syntax attribute n_extra is non-zero.
+Files: src/drawline.c, src/testdir/test_syntax.vim,
+ src/testdir/dumps/Test_syntax_c_01.dump
+
+Patch 8.1.2190
+Problem: Syntax test fails on Mac.
+Solution: Limit the window size to 20 rows.
+Files: src/testdir/test_syntax.vim,
+ src/testdir/dumps/Test_syntax_c_01.dump
+
+Patch 8.1.2191
+Problem: When using modifyOtherKeys CTRL-X mode may not work.
+Solution: Recognize a control character also in the form with a modifier.
+Files: src/getchar.c
+
+Patch 8.1.2192
+Problem: Cannot easily fill the info popup asynchronously.
+Solution: Add the "popuphidden" value to 'completeopt'. (closes #4924)
+Files: src/popupmenu.c, src/proto/popupmenu.pro, src/popupwin.c,
+ src/proto/popupwin.pro, src/vim.h, runtime/doc/options.txt,
+ runtime/doc/insert.txt, src/ex_cmds.c, src/proto/ex_cmds.pro,
+ src/optionstr.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_infopopup_hidden_1.dump,
+ src/testdir/dumps/Test_popupwin_infopopup_hidden_2.dump,
+ src/testdir/dumps/Test_popupwin_infopopup_hidden_3.dump
+
+Patch 8.1.2193
+Problem: Popup_setoptions(popup_getoptions()) does not work.
+Solution: Also accept a list with three entries for "moved" and
+ "mousemoved". (closes #5081)
+Files: runtime/doc/popup.txt, src/popupwin.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.2194
+Problem: ModifyOtherKeys is not enabled by default.
+Solution: Add t_TI and t_TE to the builtin xterm termcap.
+Files: runtime/doc/map.txt, src/term.c
+
+Patch 8.1.2195
+Problem: Vim does not exit when closing a terminal window and it is the
+ last window.
+Solution: Exit Vim if the closed terminal window is the last one.
+ (closes #4539)
+Files: runtime/doc/terminal.txt, src/terminal.c, src/ex_docmd.c,
+ src/proto/ex_docmd.pro, src/testdir/test_terminal.vim
+
+Patch 8.1.2196
+Problem: MS-Windows: running tests with MSVC lacks updates.
+Solution: Improve running individual tests on MS-Windows. (closes #4922)
+Files: src/Make_mvc.mak, src/testdir/Make_dos.mak
+
+Patch 8.1.2197
+Problem: ExitPre autocommand may cause accessing freed memory.
+Solution: Check the window pointer is still valid. (closes #5093)
+Files: src/testdir/test_exit.vim, src/ex_docmd.c
+
+Patch 8.1.2198
+Problem: Crash when using :center in autocommand.
+Solution: Bail out early for an empty line. (Dominique Pelle, closes #5095)
+Files: src/ex_cmds.c, src/testdir/test_textformat.vim
+
+Patch 8.1.2199
+Problem: Build failure when using normal features without GUI and EXITFREE
+ defined.
+Solution: Add #ifdef. (Dominique Pelle, closes #5106)
+Files: src/scriptfile.c
+
+Patch 8.1.2200
+Problem: Crash when memory allocation fails.
+Solution: Check for NULL curwin and curbuf. (Christian Brabandt,
+ closes #4839)
+Files: src/getchar.c
+
+Patch 8.1.2201
+Problem: Cannot build with dynamically linked Python 3.8.
+Solution: Implement py3__Py_DECREF() and py3__Py_XDECREF(). (Ken Takata,
+ closes #4080)
+Files: src/if_python3.c
+
+Patch 8.1.2202
+Problem: MS-Windows: build failure with GUI and small features.
+Solution: Add #ifdef. (Michael Soyka, closes #5097)
+Files: src/gui_w32.c
+
+Patch 8.1.2203
+Problem: Running libvterm tests without the +terminal feature.
+Solution: Only add the libvterm test target when building libvterm.
+Files: src/configure.ac, src/auto/configure, src/config.mk.in,
+ src/Makefile
+
+Patch 8.1.2204
+Problem: Crash on exit when closing terminals. (Corey Hickey)
+Solution: Actually wait for the job to stop. (closes #5100)
+Files: src/terminal.c
+
+Patch 8.1.2205
+Problem: Sign entry structure has confusing name.
+Solution: Rename signlist_T to sign_entry_T and prefix se_ to the fields.
+Files: src/structs.h, src/netbeans.c, src/sign.c, src/globals.h,
+ src/drawline.c
+
+Patch 8.1.2206
+Problem: No test for fixed issue #3893.
+Solution: Add a test. (Christian Brabandt, #3893)
+Files: src/testdir/test_display.vim,
+ src/testdir/dumps/Test_winline_rnu.dump
+
+Patch 8.1.2207
+Problem: "gn" doesn't work quite right. (Jaehwang Jerry Jung)
+Solution: Improve and simplify the search logic. (Christian Brabandt,
+ closes #5103, closes #5075)
+Files: src/search.c, src/testdir/test_gn.vim
+
+Patch 8.1.2208
+Problem: Unix: Tabs in output might be expanded to spaces.
+Solution: Reset the XTABS flag. (closes #5108)
+Files: src/os_unix.c
+
+Patch 8.1.2209
+Problem: LF in escape codes may be expanded to CR-LF.
+Solution: Do not expand LF in escape codes to CR-LF. (closes #5107)
+Files: src/term.c
+
+Patch 8.1.2210
+Problem: Using negative offset for popup_create() does not work.
+Solution: Use -1 instead of zero. (closes #5111)
+Files: src/popupwin.c, src/popupwin.vim, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_corners.dump
+
+Patch 8.1.2211
+Problem: Listener callback "added" argument is not the total. (Andy
+ Massimino)
+Solution: Compute the total. (closes #5105)
+Files: src/change.c, src/testdir/test_listener.vim
+
+Patch 8.1.2212
+Problem: Cannot see the selection type in :reg output. (Ayberk Aydın)
+Solution: Add c/l/b. (Christian Brabandt, closes #5110, closes #4546)
+Files: runtime/doc/change.txt, src/register.c,
+ src/testdir/test_registers.vim
+
+Patch 8.1.2213
+Problem: Popup_textprop tests fail.
+Solution: Adjust the column and line positioning.
+Files: src/popupwin.c
+
+Patch 8.1.2214
+Problem: Too much is redrawn when 'cursorline' is set.
+Solution: Don't do a complete redraw. (closes #5079)
+Files: src/main.c, src/change.c, src/drawscreen.c,
+ src/testdir/dumps/Test_Xcursorline_13.dump,
+ src/testdir/dumps/Test_Xcursorline_14.dump,
+ src/testdir/dumps/Test_Xcursorline_15.dump,
+ src/testdir/dumps/Test_Xcursorline_16.dump,
+ src/testdir/dumps/Test_Xcursorline_17.dump,
+ src/testdir/dumps/Test_Xcursorline_18.dump
+
+Patch 8.1.2215
+Problem: Unreachable code in adjusting text prop columns.
+Solution: Remove the code. (Christian Brabandt)
+Files: src/textprop.c
+
+Patch 8.1.2216
+Problem: Text property in wrong place after :substitute.
+Solution: Pass the new column instead of the old one. (Christian Brabandt,
+ closes #4427)
+Files: src/ex_cmds.c, src/testdir/test_textprop.vim
+
+Patch 8.1.2217
+Problem: Compiler warning for unused variable.
+Solution: Move variable inside #ifdef. (John Marriott)
+Files: src/ex_cmds.c
+
+Patch 8.1.2218
+Problem: "gN" is off by one in Visual mode.
+Solution: Check moving forward. (Christian Brabandt, #5075)
+Files: src/search.c, src/testdir/test_gn.vim
+
+Patch 8.1.2219
+Problem: No autocommand for open window with terminal.
+Solution: Add TerminalWinOpen. (Christian Brabandt)
+Files: runtime/doc/autocmd.txt, src/autocmd.c, src/terminal.c,
+ src/testdir/test_terminal.vim, src/vim.h
+
+Patch 8.1.2220
+Problem: :cfile does not abort like other quickfix commands.
+Solution: Abort when desired. Add tests for aborting. (Yegappan Lakshmanan,
+ closes #5121)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.2221
+Problem: Cannot filter :disp output.
+Solution: Support filtering :disp output. (Andy Massimino, closes #5117)
+Files: runtime/doc/various.txt, src/register.c,
+ src/testdir/test_filter_cmd.vim
+
+Patch 8.1.2222
+Problem: Accessing invalid memory. (Dominique Pelle)
+Solution: Reset highlight_match every time. (closes #5125)
+Files: src/ex_getln.c
+
+Patch 8.1.2223
+Problem: Cannot see what buffer an ml_get error is for.
+Solution: Add the buffer number and name in the message
+Files: src/memline.c
+
+Patch 8.1.2224
+Problem: Cannot build Amiga version.
+Solution: Add dummy mch_setmouse(). (Ola Söder, closes #5126)
+Files: src/os_amiga.c, src/proto/os_amiga.pro
+
+Patch 8.1.2225
+Problem: The "last used" info of a buffer is under used.
+Solution: Add "lastused" to getbufinfo(). List buffers sorted by last-used
+ field. (Andy Massimino, closes #4722)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/windows.txt, src/buffer.c, src/evalbuffer.c,
+ src/ex_getln.c, src/misc1.c, src/option.c, src/option.h,
+ src/proto/misc1.pro, src/proto/viminfo.pro,
+ src/testdir/test_bufwintabinfo.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_excmd.vim, src/undo.c, src/vim.h, src/viminfo.c
+
+Patch 8.1.2226
+Problem: Cannot use system copy/paste in non-xterm terminals.
+Solution: Instead of setting 'mouse' to "a" set it to "nvi" in defaults.vim.
+Files: runtime/defaults.vim, runtime/doc/term.txt,
+ runtime/doc/options.txt
+
+Patch 8.1.2227
+Problem: Layout wrong if 'lines' changes while cmdline window is open.
+Solution: Do not restore the window layout if 'lines' changed.
+ (closes #5130)
+Files: src/window.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_cmdwin_restore_1.dump,
+ src/testdir/dumps/Test_cmdwin_restore_2.dump,
+ src/testdir/dumps/Test_cmdwin_restore_3.dump
+
+Patch 8.1.2228
+Problem: screenpos() returns wrong values when 'number' is set. (Ben
+ Jackson)
+Solution: Compare the column with the window width. (closes #5133)
+Files: src/move.c, src/testdir/test_cursor_func.vim
+
+Patch 8.1.2229
+Problem: Cannot color number column above/below cursor differently.
+Solution: Add LineNrAbove and LineNrBelow. (Shaun Brady, closes #624)
+Files: runtime/doc/syntax.txt, runtime/doc/options.txt, src/optiondefs.h,
+ src/drawline.c, src/vim.h, src/testdir/test_number.vim,
+ src/testdir/dumps/Test_relnr_colors_1.dump,
+ src/testdir/dumps/Test_relnr_colors_2.dump,
+ src/testdir/dumps/Test_relnr_colors_3.dump,
+ src/testdir/dumps/Test_relnr_colors_4.dump
+
+Patch 8.1.2230
+Problem: MS-Windows: testing external commands can be improved.
+Solution: Adjust tests, remove duplicate test. (closes #4928)
+Files: src/testdir/test_normal.vim, src/testdir/test_system.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_undo.vim
+
+Patch 8.1.2231
+Problem: Not easy to move to the middle of a text line.
+Solution: Add the gM command. (Yasuhiro Matsumoto, closes #2070)
+Files: runtime/doc/index.txt, runtime/doc/motion.txt,
+ runtime/doc/quickref.txt, runtime/doc/usr_25.txt, src/normal.c,
+ src/testdir/test_normal.vim
+
+Patch 8.1.2232
+Problem: MS-Windows: compiler warning for int size.
+Solution: Add type cast. (Mike Williams)
+Files: src/normal.c
+
+Patch 8.1.2233
+Problem: Cannot get the Vim command line arguments.
+Solution: Add v:argv. (Dmitri Vereshchagin, closes #1322)
+Files: runtime/doc/eval.txt, src/evalvars.c, src/vim.h,
+ src/proto/evalvars.pro, src/main.c, src/testdir/test_startup.vim
+
+Patch 8.1.2234
+Problem: get_short_pathname() fails depending on encoding.
+Solution: Use the wide version of the library function. (closes #5129)
+Files: src/filepath.c, src/testdir/test_shortpathname.vim
+
+Patch 8.1.2235
+Problem: "C" with 'virtualedit' set does not include multibyte char.
+Solution: Include the whole multibyte char. (Nobuhiro Takasaki,
+ closes #5152)
+Files: src/ops.c, src/testdir/test_virtualedit.vim
+
+Patch 8.1.2236
+Problem: Ml_get error if pattern matches beyond last line.
+Solution: Adjust position if needed. (Christian Brabandt, closes #5139)
+Files: src/ex_cmds.c, src/testdir/test_substitute.vim
+
+Patch 8.1.2237
+Problem: Mode() result after using "r" depends on whether CURSOR_SHAPE is
+ defined. (Christian Brabandt)
+Solution: Move the #ifdef to only skip ui_cursor_shape().
+Files: src/normal.c
+
+Patch 8.1.2238
+Problem: Error in docs tags goes unnoticed.
+Solution: Adjust tags build command. (Ken Takata, closes #5158)
+Files: Filelist, .travis.yml, runtime/doc/Makefile,
+ runtime/doc/doctags.vim
+
+Patch 8.1.2239
+Problem: CI fails when running tests without building Vim.
+Solution: Skip creating doc tags if the execute does not exist.
+Files: runtime/doc/Makefile
+
+Patch 8.1.2240
+Problem: Popup window width changes when scrolling.
+Solution: Also adjust maxwidth when applying minwidth and there is a
+ scrollbar. Fix off-by-one error. (closes #5162)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_scroll_11.dump,
+ src/testdir/dumps/Test_popupwin_scroll_12.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_4.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_5.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_7.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_8.dump,
+
+Patch 8.1.2241
+Problem: Match highlight does not combine with 'wincolor'.
+Solution: Apply 'wincolor' last on top of any other attribute. (closes #5159)
+Files: src/drawline.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_matches.dump
+ src/testdir/dumps/Test_popupwin_menu_01.dump
+ src/testdir/dumps/Test_popupwin_menu_02.dump
+ src/testdir/dumps/Test_popupwin_menu_04.dump
+
+Patch 8.1.2242
+Problem: Creating docs tags uses user preferences. (Tony Mechelynck)
+Solution: Add "--clean".
+Files: runtime/doc/Makefile
+
+Patch 8.1.2243
+Problem: Typos in comments.
+Solution: Fix the typos. (Dominique Pelle, closes #5160) Also adjust
+ formatting a bit.
+Files: src/autocmd.c, src/buffer.c, src/cindent.c, src/crypt.c,
+ src/diff.c, src/getchar.c, src/globals.h, src/gui_gtk_x11.c,
+ src/highlight.c, src/insexpand.c, src/macros.h, src/map.c,
+ src/memline.c, src/message.c, src/option.c, src/os_unix.c,
+ src/pty.c, src/quickfix.c, src/regexp_nfa.c, src/register.c,
+ src/spellsuggest.c, src/structs.h, src/textprop.c, src/ui.c,
+ src/undo.c, src/vim.h, src/viminfo.c
+
+Patch 8.1.2244
+Problem: 'wrapscan' is not used for "gn".
+Solution: Only reset 'wrapscan' for the first search round. (closes #5164)
+Files: src/search.c, src/testdir/test_gn.vim
+
+Patch 8.1.2245
+Problem: Third character of 'listchars' tab shows in wrong place when
+ 'breakindent' is set.
+Solution: Set c_final to NUL. (Naruhiko Nishino, closes #5165)
+Files: src/drawline.c, src/testdir/test_breakindent.vim
+
+Patch 8.1.2246
+Problem: Some tests are still in old style.
+Solution: Change a few tests to new style. (Yegappan Lakshmanan)
+Files: src/testdir/Make_all.mak, src/testdir/test49.ok,
+ src/testdir/test49.vim, src/testdir/test_trycatch.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.1.2247
+Problem: "make vimtags" does not work in runtime/doc.
+Solution: Test existence with "which" instead of "test -x". (Ken Takata)
+Files: runtime/doc/Makefile
+
+Patch 8.1.2248
+Problem: CTRL-W dot does not work in a terminal when modifyOtherKeys is
+ enabled.
+Solution: Use the modifier when needed. Pass the modifier along with the
+ key to avoid mistakes.
+Files: src/terminal.c, src/proto/terminal.pro, src/mouse.c
+
+Patch 8.1.2249
+Problem: "make vimtags" does not print any message.
+Solution: Add a message that the tags have been updated.
+Files: runtime/doc/Makefile
+
+Patch 8.1.2250
+Problem: CTRL-U and CTRL-D don't work in popup window.
+Solution: Initialize 'scroll'. Add "lastline" in popup_getpos().
+ (closes #5170)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ runtime/doc/popup.txt
+
+Patch 8.1.2251
+Problem: ":term command" may not work without a shell.
+Solution: Add the ++shell option to :term. (closes #3340)
+Files: runtime/doc/terminal.txt, src/terminal.c,
+ src/os_unix.c, src/proto/os_unix.pro,
+ src/testdir/test_terminal.vim
+
+Patch 8.1.2252
+Problem: Compiler warning for int size.
+Solution: Add type cast. (Mike Williams)
+Files: src/filepath.c
+
+Patch 8.1.2253
+Problem: Using "which" to check for an executable is not reliable.
+Solution: Use "command -v" instead. Also exit with error code when
+ generating tags has an error. (closes #5174)
+Files: runtime/doc/Makefile
+
+Patch 8.1.2254
+Problem: MS-Windows: mouse scroll wheel doesn't work in popup.
+Solution: Handle mouse wheel events separately. (closes #5138)
+Files: src/gui_w32.c, src/gui.c, src/proto/gui.pro
+
+Patch 8.1.2255
+Problem: ":term ++shell" does not work on MS-Windows.
+Solution: Add MS-Windows support.
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.1.2256 (after 8.1.2255)
+Problem: Test for ":term ++shell" fails on MS-Windows.
+Solution: Accept failure of "dir" executable.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.2257
+Problem: MS-Windows GUI: scroll wheel always uses current window.
+Solution: Add the 'scrollfocus' option for MS-Windows.
+Files: runtime/doc/options.txt, src/gui_w32.c, src/optiondefs.h,
+ src/option.h
+
+Patch 8.1.2258
+Problem: May get hit-enter prompt after entering a number. (Malcolm Rowe)
+Solution: Put back accidentally deleted lines. (closes #5176)
+Files: src/misc1.c
+
+Patch 8.1.2259
+Problem: Running tests may leave XfakeHOME behind.
+Solution: Source summarize.vim without using setup.vim. (closes #5177)
+ Also fix that on MS-Windows the test log isn't echoed.
+Files: src/testdir/Makefile, src/testdir/Make_dos.mak
+
+Patch 8.1.2260
+Problem: Terminal test may fail on MS-Windows.
+Solution: Catch the situation that "term dir" fails with a CreateProcess
+ error.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.1.2261
+Problem: With modifyOtherKeys set 'noesckeys' doesn't work. (James McCoy)
+Solution: Disable modifyOtherKeys while in Insert mode when 'noesckeys' is
+ set. (closes #5180)
+Files: src/edit.c, src/testdir/test_edit.vim
+
+Patch 8.1.2262
+Problem: Unpack assignment in function not recognized.
+Solution: Skip over "[a, b]". (closes #5051)
+Files: src/userfunc.c, src/testdir/test_let.vim
+
+Patch 8.1.2263
+Problem: 'noesckeys' test fails in GUI.
+Solution: Skip the test in the GUI.
+Files: src/testdir/test_edit.vim
+
+Patch 8.1.2264
+Problem: There are two test files for :let.
+Solution: Merge the two files.
+Files: src/testdir/test_assign.vim, src/testdir/test_let.vim,
+ src/testdir/Make_all.mak, src/testdir/test_alot.vim
+
+Patch 8.1.2265
+Problem: When popup with "botleft" does not fit it flips incorrectly.
+Solution: Only flip when there is more space on the other side. Add the
+ "posinvert" option to disable flipping and do it in both
+ directions if enabled. (closes #5151)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim, src/vim.h,
+ src/testdir/dumps/Test_popupwin_nospace.dump
+
+Patch 8.1.2266
+Problem: Position unknown for a mouse click in a popup window.
+Solution: Set v:mouse_col and v:mouse_lnum. (closes #5171)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.2267
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Rearrange the code.
+Files: src/buffer.c
+
+Patch 8.1.2268
+Problem: Spell file flag zero is not recognized.
+Solution: Use -1 as an error value, so that zero can be used as a valid flag
+ number.
+Files: src/spellfile.c, src/testdir/test_spell.vim
+
+Patch 8.1.2269
+Problem: Tags file with very long line stops using binary search.
+Solution: Reallocate the buffer if needed.
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.1.2270
+Problem: "gf" is not tested in Visual mode.
+Solution: Add Visual mode test and test errors. (Dominique Pelle,
+ closes #5197)
+Files: src/testdir/test_gf.vim
+
+Patch 8.1.2271
+Problem: Build error if FEAT_TAG_BINS is not defined. (John Marriott)
+Solution: Add #ifdef.
+Files: src/tag.c
+
+Patch 8.1.2272
+Problem: Test may hang at more prompt.
+Solution: Reset 'more' after resetting 'compatible'. (Michael Soyka)
+Files: src/testdir/test_vimscript.vim
+
+Patch 8.1.2273
+Problem: Wrong default when "pos" is changed with popup_atcursor().
+Solution: Adjust the default line and col when "pos" is not the default
+ value. (#5151)
+Files: runtime/doc/popup.txt, src/structs.h, src/popupwin.c,
+ src/proto/popupwin.pro, src/ex_cmds.c,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_atcursor_pos.dump
+
+Patch 8.1.2274
+Problem: Newlines in 'balloonexpr' result only work in the GUI.
+Solution: Also recognize newlines in the terminal. (closes #5193)
+Files: src/popupmenu.c, src/testdir/test_balloon.vim,
+ src/testdir/dumps/Test_balloon_eval_term_01.dump,
+ src/testdir/dumps/Test_balloon_eval_term_01a.dump,
+ src/testdir/dumps/Test_balloon_eval_term_02.dump
+
+Patch 8.1.2275
+Problem: Using "seesion" looks like a mistake.
+Solution: Use an underscore to make the function sort first.
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.2276
+Problem: MS-Windows: session test leaves files behind.
+Solution: Wipe out buffers before deleting the directory. (closes #5187)
+Files: src/testdir/test_mksession.vim
+
+Patch 8.1.2277
+Problem: Terminal window is not updated when info popup changes.
+Solution: Redraw windows when re-using an info popup. (closes #5192)
+Files: src/ex_cmds.c
+
+Patch 8.1.2278
+Problem: Using "cd" with "exe" may fail.
+Solution: Use chdir() instead.
+Files: src/testdir/test_autochdir.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_cd.vim, src/testdir/test_expand.vim,
+ src/testdir/test_find_complete.vim, src/testdir/test_findfile.vim,
+ src/testdir/test_getcwd.vim, src/testdir/test_shortpathname.vim
+
+Patch 8.1.2279
+Problem: Computation of highlight attributes is too complicated.
+Solution: Simplify the attribute computation and make it more consistent.
+ (closes #5190) Fix that 'combine' set to zero doesn't work.
+Files: src/drawline.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.1.2280
+Problem: Crash when passing partial to substitute().
+Solution: Take extra arguments into account. (closes #5186)
+Files: src/userfunc.c, src/structs.h, src/regexp.c, src/proto/regexp.pro,
+ src/testdir/test_substitute.vim
+
+Patch 8.1.2281
+Problem: 'showbreak' cannot be set for one window.
+Solution: Make 'showbreak' global-local.
+Files: src/optiondefs.h, src/option.c, src/option.h,
+ src/proto/option.pro, src/structs.h, src/charset.c,
+ src/drawline.c, src/edit.c, src/move.c, src/normal.c, src/ops.c,
+ src/optionstr.c, src/testdir/test_highlight.vim,
+ src/testdir/test_breakindent.vim, runtime/doc/options.txt
+
+Patch 8.1.2282
+Problem: Crash when passing many arguments through a partial. (Andy
+ Massimino)
+Solution: Check the number of arguments. (closes #5186)
+Files: src/userfunc.c, src/proto/userfunc.pro, src/evalfunc.c,
+ src/regexp.c, src/testdir/test_expr.vim,
+ src/testdir/test_substitute.vim
+
+Patch 8.1.2283
+Problem: Missed one use of p_sbr.
+Solution: Add missing p_sbr change.
+Files: src/indent.c
+
+Patch 8.1.2284
+Problem: Compiler warning for unused variable. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/move.c
+
+Patch 8.1.2285
+Problem: Padding in structures wastes memory.
+Solution: Move fields to avoid padding. (Dominique Pelle, closes #5202)
+Files: src/structs.h
+
+Patch 8.1.2286
+Problem: Using border highlight in popup window leaks memory.
+Solution: Free memory before overwriting. (Dominique Pelle, closes #5203)
+Files: src/popupwin.c
+
+Patch 8.1.2287
+Problem: Using EndOfBuffer highlight in popup does not look good.
+Solution: Do not EndOfBuffer highlight. (closes #5204)
+Files: src/drawscreen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_02.dump,
+ src/testdir/dumps/Test_popupwin_04.dump,
+ src/testdir/dumps/Test_popupwin_04a.dump,
+ src/testdir/dumps/Test_popupwin_05.dump,
+ src/testdir/dumps/Test_popupwin_06.dump,
+ src/testdir/dumps/Test_popupwin_07.dump,
+ src/testdir/dumps/Test_popupwin_08.dump
+
+Patch 8.1.2288
+Problem: Not using all space when popup with "topleft" flips to above.
+Solution: Recompute the height when a popup flips from below to above.
+ (closes #5151)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_nospace.dump
+
+Patch 8.1.2289
+Problem: After :diffsplit closing the window does not disable diff.
+Solution: Add "closeoff" to 'diffopt' and add it to the default.
+Files: runtime/doc/options.txt, src/optiondefs.h, src/diff.c,
+ src/proto/diff.pro, src/window.c, src/testdir/test_diffmode.vim
+
+Patch 8.1.2290
+Problem: Autocommand test fails.
+Solution: Remove 'closeoff' from 'diffopt'.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.1.2291
+Problem: Memory leak when executing command in a terminal.
+Solution: Free "argv". (Dominique Pelle, closes #5208)
+Files: src/terminal.c
+
+Patch 8.1.2292
+Problem: v:mouse_winid not set on click in popup window.
+Solution: Set v:mouse_winid. (closes #5171)
+Files: runtime/doc/popup.txt, src/popupwin.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.2293
+Problem: Join adds trailing space when second line is empty. (Brennan
+ Vincent)
+Solution: Do not add a trailing space.
+Files: src/ops.c, src/testdir/test_join.vim
+
+Patch 8.1.2294
+Problem: Cursor position wrong when characters are concealed and a search
+ causes a scroll.
+Solution: Fix the cursor column in a concealed line after window scroll.
+ (closes #5215, closes #5012)
+Files: src/drawscreen.c, src/testdir/test_matchadd_conceal.vim
+
+Patch 8.1.2295
+Problem: If buffer of popup is in another window cursorline sign shows.
+Solution: Check the group of the sign.
+Files: src/option.c, src/proto/option.pro, src/sign.c,
+ src/proto/sign.pro, src/screen.c, src/drawline.c,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_cursorline_8.dump
+
+Patch 8.1.2296
+Problem: Text properties are not combined with syntax by default.
+Solution: Make it work as documented. (closes #5190)
+Files: src/testprop.c, src/testdir/test_textprop.vim
+
+Patch 8.1.2297
+Problem: The ex_vimgrep() function is too long.
+Solution: Split it in three parts. (Yegappan Lakshmanan, closes #5211)
+Files: src/quickfix.c
+
+Patch 8.1.2298 (after 8.1.2296)
+Problem: Missing part of 8.1.2296.
+Solution: s/test/text/
+Files: src/textprop.c
+
+Patch 8.1.2299
+Problem: ConPTY in MS-Windows 1909 is still wrong.
+Solution: Use same solution as for 1903. (Nobuhiro Takasaki, closes #5217)
+Files: src/misc2.c, src/os_win32.c
+
+Patch 8.1.2300
+Problem: Redraw breaks going through list of popup windows.
+Solution: Use different flags for popup_reset_handled(). (closes #5216)
+Files: src/popupwin.c, src/proto/popupwin.pro, src/structs.h, src/vim.h,
+ src/mouse.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.2301
+Problem: MS-Windows GUI: drawing error when background color changes.
+Solution: Implement gui_mch_new_colors(). (Simon Sadler)
+Files: src/gui_w32.c
+
+Patch 8.1.2302
+Problem: :lockmarks does not work for '[ and '].
+Solution: save and restore '[ and '] marks. (James McCoy, closes #5222)
+Files: runtime/doc/motion.txt, src/bufwrite.c, src/diff.c, src/ex_cmds.c,
+ src/fileio.c, src/indent.c, src/ops.c, src/register.c,
+ src/testdir/test_autocmd.vim, src/testdir/test_diffmode.vim
+
+Patch 8.1.2303
+Problem: Cursor in wrong position after horizontal scroll.
+Solution: Set w_valid_leftcol. (closes #5214, closes #5224)
+Files: src/move.c, src/testdir/test_matchadd_conceal.vim
+
+Patch 8.1.2304
+Problem: Cannot get the mouse position when getting a mouse click.
+Solution: Add getmousepos().
+Files: runtime/doc/eval.txt, runtime/doc/popup.txt, src/mouse.c
+ src/proto/mouse.pro, src/evalfunc.c, src/popupwin.c,
+ src/popupwin.pro, src/testdir/test_popupwin.vim,
+ src/testdir/test_functions.vim
+
+Patch 8.1.2305
+Problem: No warning for wrong entry in translations.
+Solution: Check semicolons in keywords entry of desktop file.
+Files: src/po/check.vim
+
+Patch 8.1.2306
+Problem: Double and triple clicks are not tested.
+Solution: Test mouse clicks to select text. (closes #5226)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.1.2307
+Problem: Positioning popup doesn't work for buffer-local textprop.
+Solution: Make it work. (closes #5225)
+Files: src/popupwin.c, src/testdir/test_popupwin_textprop.vim
+
+Patch 8.1.2308
+Problem: Deleting text before zero-width textprop removes it.
+Solution: Keep zero-width textprop when deleting text.
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.1.2309
+Problem: Compiler warning for argument type.
+Solution: Use linenr_T and cast to varnumber_T. (John Marriott)
+Files: src/mouse.c
+
+Patch 8.1.2310
+Problem: No proper test for directory changes in quickfix.
+Solution: Add a test that uses multiple directories. (Yegappan Lakshmanan,
+ closes #5230)
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.1.2311
+Problem: Warning for missing function prototype.
+Solution: Add the proto. (Dominique Pelle, closes #5233)
+Files: src/proto/popupwin.pro
+
+Patch 8.1.2312
+Problem: "line:" field in tags file not used.
+Solution: Recognize the field and use the value. (Andy Massimino, Daniel
+ Hahler, closes #5232, closes #2546, closes #1057)
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.1.2313
+Problem: Debugging where a delay comes from is not easy.
+Solution: Use different values when calling ui_delay().
+Files: src/buffer.c, src/change.c, src/fileio.c, src/gui.c,
+ src/if_xcmdsrv.c, src/insexpand.c, src/main.c, src/normal.c,
+ src/screen.c, src/search.c, src/tag.c, src/term.c, src/ui.c
+
+Patch 8.1.2314
+Problem: vi' sometimes does not select anything.
+Solution: Recognize an empty selection. (Christian Brabandt, closes #5183)
+Files: src/search.c, src/testdir/test_textobjects.vim
+
+Patch 8.1.2315
+Problem: Not always using the right window when jumping to an error.
+Solution: Add the "uselast" flag in 'switchbuf'. (closes #1652)
+Files: runtime/doc/options.txt, src/option.h, src/optionstr.c,
+ src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.2316
+Problem: FORTIFY_SOURCE can also be present in CPPFLAGS.
+Solution: Remove it in configure. (Benedikt Morbach, closes #2786)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.1.2317
+Problem: No test for spell affix file with flag on suffix.
+Solution: Add a test case.
+Files: src/testdir/test_spell.vim
+
+Patch 8.1.2318 (after 8.1.2301)
+Problem: MS-Windows GUI: main background shows in toolbar.
+Solution: Remove transparency from the toolbar. (Simon Sadler)
+Files: src/gui_w32.c
+
+Patch 8.1.2319
+Problem: Compiler warning for int size.
+Solution: Add typecast. (Mike Williams)
+Files: src/mouse.c
+
+Patch 8.1.2320
+Problem: Insufficient test coverage for quickfix.
+Solution: Add more tests. Fix uncovered problem. (Yegappan Lakshmanan,
+ closes #5238)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.2321
+Problem: Cannot select all text with the mouse. (John Marriott)
+Solution: Move limiting the mouse column to f_getmousepos(). (closes #5242)
+Files: src/mouse.c
+
+Patch 8.1.2322 (after 8.1.2320)
+Problem: Quickfix test fails in very big terminal.
+Solution: Adjust the expected result for the width. (Masato Nishihata,
+ closes #5244)
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.1.2323
+Problem: Old MSVC version no longer tested.
+Solution: Drop support for MSVC 2008 and older. (Ken Takata, closes #5248)
+Files: src/INSTALLpc.txt, src/Make_mvc.mak, src/gui_w32.c, src/os_win32.c
+
+Patch 8.1.2324
+Problem: Width of scrollbar in popup menu not taken into account.
+Solution: Add the width of the scrollbar.
+Files: src/popupmenu.c, src/testdir/dumps/Test_popupwin_infopopup_6.dump,
+ src/testdir/test_popupwin.vim
+
+Patch 8.1.2325
+Problem: Crash when using balloon with empty line.
+Solution: Handle empty lines. (Markus Braun)
+Files: src/popupmenu.c, src/testdir/test_popup.vim
+
+Patch 8.1.2326
+Problem: Cannot parse a date/time string.
+Solution: Add strptime(). (Stephen Wall, closes #5250)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/auto/configure,
+ src/config.h.in, src/configure.ac, src/evalfunc.c, src/os_unix.h,
+ src/testdir/test_functions.vim
+
+Patch 8.1.2327
+Problem: Cannot build with Hangul input.
+Solution: Remove Hangul input support.
+Files: Filelist, src/Makefile, runtime/doc/hangulin.txt, src/feature.h,
+ src/gui_gtk_x11.c, src/gui_x11.c, src/gui.c, src/edit.c,
+ src/mbyte.c, src/screen.c, src/ui.c, src/hangulin.c,
+ src/globals.h, src/proto/hangulin.pro, src/proto.h,
+ src/evalfunc.c, src/version.c, src/configure.ac,
+ src/auto/configure, src/config.h.in, src/config.mk.in
+
+Patch 8.1.2328
+Problem: A few hangul input pieces remain.
+Solution: Update VMS makefile.
+Files: src/Make_vms.mms
+
+Patch 8.1.2329
+Problem: Mouse multiple click test is a bit flaky.
+Solution: Add it to the list of flaky tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.1.2330 (after 8.1.2314)
+Problem: vi' does not always work when 'selection' is exclusive.
+Solution: Adjust start position.
+Files: src/search.c, src/testdir/test_textobjects.vim
+
+Patch 8.1.2331
+Problem: The option.c file is still very big.
+Solution: Move a few functions to where they fit better. (Yegappan
+ Lakshmanan, closes #4895)
+Files: src/option.c, src/proto/option.pro, src/change.c,
+ src/proto/change.pro, src/ex_getln.c, src/proto/ex_getln.pro,
+ src/globals.h, src/gui.c, src/proto/gui.pro, src/ui.c,
+ src/proto/ui.pro, src/term.c, src/proto/term.pro, src/indent.c,
+ src/proto/indent.pro
+
+Patch 8.1.2332 (after 8.1.2331)
+Problem: Missing file in refactoring.
+Solution: Update missing file.
+Files: src/search.c
+
+Patch 8.1.2333
+Problem: With modifyOtherKeys CTRL-^ doesn't work.
+Solution: Handle the exception.
+Files: src/getchar.c, src/testdir/test_termcodes.vim
+
+Patch 8.1.2334
+Problem: Possible NULL pointer dereference in popup_locate(). (Coverity)
+Solution: Check for NULL pointer.
+Files: src/popupwin.c
+
+Patch 8.1.2335
+Problem: Error message for function arguments may use NULL pointer.
+ (Coverity)
+Solution: Use the original function name.
+Files: src/evalfunc.c
+
+Patch 8.1.2336
+Problem: When an expr mapping moves the cursor it is not restored.
+Solution: Position the cursor after an expr mapping. (closes #5256)
+Files: src/getchar.c, src/testdir/test_mapping.vim,
+ src/testdir/dumps/Test_map_expr_1.dump
+
+Patch 8.1.2337
+Problem: Double-click time sometimes miscomputed.
+Solution: Correct time computation. (Dominique Pelle, closes #5259)
+Files: src/mouse.c, src/testdir/runtest.vim
+
+Patch 8.1.2338
+Problem: Using Visual mark with :s gives E20 if not set.
+Solution: Ignore errors when handling 'incsearch'. (closes #3837)
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_substitute_14.dump
+
+Patch 8.1.2339
+Problem: Insufficient testing for quickfix.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #5261)
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.1.2340
+Problem: Quickfix test fails under valgrind and asan.
+Solution: Make sure long line does not overflow IObuff. (Dominique Pelle,
+ closes #5263) Put back fix for large terminals. (Yegappan
+ Lakshmanan, closes #5264)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.1.2341
+Problem: Not so easy to interrupt a script programmatically.
+Solution: Add the interrupt() function. (Yasuhiro Matsumoto, closes #2834)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/ex_eval.c,
+ src/testdir/Make_all.mak, src/testdir/test_interrupt.vim
+
+Patch 8.1.2342
+Problem: Random number generator in Vim script is slow.
+Solution: Add rand() and srand(). (Yasuhiro Matsumoto, closes #1277)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/Make_all.mak,
+ src/testdir/test_random.vim
+
+Patch 8.1.2343
+Problem: Using time() for srand() is not very random.
+Solution: use /dev/urandom if available
+Files: src/evalfunc.c, src/testdir/test_random.vim
+
+Patch 8.1.2344
+Problem: Cygwin: warning for using strptime().
+Solution: Move defining _XOPEN_SOURCE and __USE_XOPEN to vim.h. (Ken Takata,
+ closes #5265) Use 700 for _XOPEN_SOURCE for mkdtemp().
+Files: src/os_unix.h, src/vim.h
+
+Patch 8.1.2345
+Problem: .cjs files are not recognized as Javascript.
+Solution: Add the *.cjs pattern. (closes #5268)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.1.2346
+Problem: CTRL-R CTRL-R doesn't work with modifyOtherKeys.
+Solution: Allow key codes when fetching argument for CTRL-R. (closes #5266)
+ Also fix CTRL-G in Insert mode.
+Files: src/edit.c, src/ex_getln.c, src/testdir/test_termcodes.vim
+
+Patch 8.1.2347 (after 8.1.2344)
+Problem: macOS: build fails.
+Solution: Don't define _XOPEN_SOURCE for Mac.
+Files: src/vim.h
+
+Patch 8.1.2348
+Problem: :const cannot be followed by "| endif".
+Solution: Check following command for :const. (closes #5269)
+ Also fix completion after :const.
+Files: src/testdir/test_let.vim, src/testdir/test_const.vim,
+ src/ex_docmd.c, src/cmdexpand.c, src/eval.c,
+ src/testdir/test_cmdline.vim
+
+Patch 8.1.2349
+Problem: :lockvar and :unlockvar cannot be followed by "| endif".
+Solution: Check for following commands. (closes #5269)
+Files: src/testdir/test_const.vim, src/ex_docmd.c
+
+Patch 8.1.2350
+Problem: Other text for CTRL-V in Insert mode with modifyOtherKeys.
+Solution: Convert the Escape sequence back to key as if modifyOtherKeys is
+ not set, and use CTRL-SHIFT-V to get the Escape sequence itself.
+ (closes #5254)
+Files: runtime/doc/insert.txt, runtime/doc/cmdline.txt, src/edit.c,
+ src/proto/edit.pro, src/term.c, src/proto/term.pro, src/getchar.c,
+ src/proto/getchar.pro, src/testdir/test_termcodes.vim,
+ src/ex_getln.c
+
+Patch 8.1.2351
+Problem: 'wincolor' not used for > for not fitting double width char.
+ Also: popup drawn on right half of double width character looks
+ wrong.
+Solution: Adjust color for > character. Clear left half of double width
+ character if right half is being overwritten.
+Files: src/drawline.c, src/screen.c,
+ src/testdir/dumps/Test_popupwin_doublewidth_1.dump
+
+Patch 8.1.2352
+Problem: CI doesn't cover FreeBSD.
+Solution: Configure Cirrus-CI. (Christian Brabandt, closes #5273)
+Files: .cirrus.yml, README.md
+
+Patch 8.1.2353
+Problem: Build failure on FreeBSD.
+Solution: Change #ifdef to only check for Linux-like systems.
+Files: src/vim.h
+
+Patch 8.1.2354
+Problem: Cirrus CI runs on another repository.
+Solution: Run Cirrus CI on vim/vim.
+Files: .cirrus.yml, README.md
+
+Patch 8.1.2355
+Problem: Test with "man" fails on FreeBSD.
+Solution: Use "-P" instead of "--pager".
+Files: src/testdir/test_normal.vim
+
+Patch 8.1.2356
+Problem: rand() does not use the best algorithm.
+Solution: use xoshiro128** instead of xorshift. (Kaito Udagawa,
+ closes #5279)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_random.vim
+
+Patch 8.1.2357
+Problem: No test with wrong argument for rand().
+Solution: Add a test case.
+Files: src/testdir/test_random.vim
+
+Patch 8.1.2358
+Problem: Tests fail on Cirrus CI for FreeBSD.
+Solution: Fix a test and skip some. (Christian Brabandt, closes #5281)
+Files: Filelist, .cirrus.yml, src/testdir/check.vim,
+ src/testdir/test_normal.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_source_utf8.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_utf8_comparisons.vim
+
+Patch 8.1.2359
+Problem: Cannot build without FEAT_FLOAT. (John Marriott)
+Solution: Fix #ifdefs around f_srand().
+Files: src/evalfunc.c
+
+Patch 8.1.2360
+Problem: Quickfix test coverage can still be improved.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #5276)
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.1.2361
+Problem: MS-Windows: test failures related to VIMDLL.
+Solution: Adjust code and tests. (Ken Takata, closes #5283)
+Files: src/evalfunc.c, src/ex_cmds.c, src/gui_w32.c, src/mbyte.c,
+ src/menu.c, src/proto.h, src/testdir/test_highlight.vim
+
+Patch 8.1.2362
+Problem: Cannot place signs in a popup window. (Maxim Kim)
+Solution: Use the group prefix "PopUp" to specify which signs should show up
+ in a popup window. (closes #5277)
+Files: runtime/doc/sign.txt, src/popupwin.c, src/sign.c,
+ src/testdir/dumps/Test_popupwin_sign_1.dump
+
+Patch 8.1.2363
+Problem: ml_get error when accessing Visual area in 'statusline'.
+Solution: Disable Visual mode when using another window. (closes #5278)
+Files: src/testdir/test_statusline.vim, src/buffer.c
+
+Patch 8.1.2364
+Problem: Termwinscroll test is flaky on FreeBSD.
+Solution: Add to list of flaky tests. Rename function.
+Files: src/testdir/runtest.vim, src/testdir/test_terminal.vim
+
+Patch 8.1.2365
+Problem: Missing tests for recent popupwin changes.
+Solution: Add test cases.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.1.2366
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/ascii.h, src/beval.h, src/dosinst.h, src/feature.h,
+ src/glbl_ime.h, src/globals.h, src/gui_at_sb.h, src/gui_gtk_f.h,
+ src/gui_gtk_vms.h, src/gui.h, src/gui_x11_pm.h, src/gui_xmebwp.h,
+ src/if_cscope.h, src/if_mzsch.h, src/if_ole.h, src/if_py_both.h,
+ src/iscygpty.h, src/keymap.h, src/macros.h, src/nbdebug.h,
+ src/option.h, src/os_amiga.h, src/os_beos.h, src/os_dos.h,
+ src/os_mac.h, src/os_qnx.h, src/os_unix.h, src/os_unixx.h,
+ src/os_vms_conf.h, src/os_win32.h, src/proto.h, src/regexp.h,
+ src/spell.h, src/structs.h, src/term.h, src/version.h, src/vimio.h
+
+Patch 8.1.2367
+Problem: Registers are not sufficiently tested.
+Solution: Add a few more test cases. (Yegappan Lakshmanan, closes #5288)
+Files: src/testdir/test_registers.vim
+
+Patch 8.1.2368
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/autocmd.c, src/beval.c, src/blob.c, src/blowfish.c,
+ src/buffer.c, src/change.c, src/channel.c, src/charset.c,
+ src/cindent.c, src/crypt.c, src/crypt_zip.c
+
+Patch 8.1.2369
+Problem: Cannot build with quickfix and without text properties.
+Solution: Fix typo. (Naruhiko Nishino)
+Files: src/popupmenu.c
+
+Patch 8.1.2370
+Problem: Build problems on VMS.
+Solution: Adjust the build file. (Zoltan Arpadffy)
+Files: src/Make_vms.mms, src/os_unix.c, src/os_vms.c
+
+Patch 8.1.2371
+Problem: FEAT_TEXT_PROP is a confusing name.
+Solution: Use FEAT_PROP_POPUP. (Naruhiko Nishino, closes #5291)
+Files: runtime/doc/popup.txt, src/beval.c, src/buffer.c, src/change.c,
+ src/drawline.c, src/drawscreen.c, src/edit.c, src/eval.c,
+ src/evalbuffer.c, src/evalfunc.c, src/evalwindow.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/feature.h, src/fileio.c, src/getchar.c,
+ src/globals.h, src/gui.c, src/gui_w32.c, src/indent.c,
+ src/insexpand.c, src/macros.h, src/main.c, src/memline.c,
+ src/misc2.c, src/mouse.c, src/move.c, src/ops.c, src/option.h,
+ src/optiondefs.h, src/optionstr.c, src/popupmenu.c,
+ src/popupwin.c, src/proto.h, src/screen.c, src/search.c,
+ src/sign.c, src/structs.h, src/tag.c, src/testdir/runtest.vim,
+ src/testdir/test_execute_func.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_popupwin_textprop.vim, src/textprop.c, src/ui.c,
+ src/version.c, src/vim.h, src/window.c
+
+Patch 8.1.2372
+Problem: VMS: failing realloc leaks memory. (Chakshu Gupta)
+Solution: Free the memory. (partly fixes #5292)
+Files: src/os_vms.c
+
+Patch 8.1.2373
+Problem: Cannot build with +popupwin but without +quickfix. (John Marriott)
+Solution: Adjust #ifdefs.
+Files: src/ex_cmds.c, src/popupmenu.c, src/popupwin.c, src/fileio.c,
+ src/testdir/test_compiler.vim, src/testdir/test_tagjump.vim,
+ src/testdir/test86.in, src/testdir/test87.in,
+ src/testdir/test_autocmd.vim, src/testdir/test_bufwintabinfo.vim,
+ src/testdir/test_channel.vim, src/testdir/test_edit.vim,
+ src/testdir/test_execute_func.vim,
+ src/testdir/test_filter_cmd.vim, src/testdir/test_gui.vim,
+ src/testdir/test_makeencoding.vim, src/testdir/test_mksession.vim,
+ src/testdir/test_normal.vim, src/testdir/test_popup.vim,
+ src/testdir/test_popupwin.vim, src/testdir/test_preview.vim,
+ src/testdir/test_startup.vim, src/testdir/test_statusline.vim,
+ src/testdir/test_tabpage.vim, src/testdir/test_window_cmd.vim,
+ src/testdir/test_window_id.vim
+
+Patch 8.1.2374
+Problem: Unused parts of libvterm are included.
+Solution: Delete the unused files.
+Files: Filelist, src/libvterm/bin/vterm-ctrl.c,
+ src/libvterm/bin/unterm.c, src/libvterm/bin/vterm-dump.c
+
+Patch 8.1.2375
+Problem: No sufficient testing for registers.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #5296)
+ Fix that "p" on last virtual column of tab inserts spaces.
+Files: src/register.c, src/testdir/test_registers.vim,
+ src/testdir/test_virtualedit.vim, src/testdir/test_visual.vim
+
+Patch 8.1.2376
+Problem: Preprocessor indents are incorrect.
+Solution: Fix the indents. (Ken Takata, closes #5298)
+Files: src/drawline.c, src/gui_w32.c, src/os_mswin.c, src/os_win32.c,
+ src/proto.h
+
+Patch 8.1.2377
+Problem: GUI: when losing focus a pending operator is executed.
+Solution: Do not execute an operator when getting K_IGNORE. (closes #5300)
+Files: src/normal.c
+
+Patch 8.1.2378
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/dict.c, src/diff.c, src/digraph.c, src/dosinst.c, src/edit.c,
+ src/eval.c, src/evalbuffer.c, src/evalfunc.c
+
+Patch 8.1.2379
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c,
+ src/ex_getln.c, src/fileio.c, src/filepath.c, src/findfile.c,
+ src/fold.c
+
+Patch 8.1.2380
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/getchar.c, src/gui.c, src/gui_at_fs.c, src/gui_at_sb.c,
+ src/gui_athena.c, src/gui_beval.c, src/gui_gtk.c, src/gui_gtk_f.c,
+ src/gui_gtk_x11.c
+
+Patch 8.1.2381
+Problem: Not all register related code is covered by tests.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #5301)
+Files: src/testdir/test_marks.vim, src/testdir/test_registers.vim,
+ src/testdir/test_virtualedit.vim
+
+Patch 8.1.2382
+Problem: MS-Windows: When using VTP bold+inverse doesn't work.
+Solution: Compare with the default colors. (Nobuhiro Takasaki, closes #5303)
+Files: src/os_win32.c, src/proto/os_win32.pro, src/screen.c
+
+Patch 8.1.2383
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/gui_mac.c, src/gui_motif.c, src/gui_photon.c, src/gui_w32.c,
+ src/gui_x11.c, src/gui_xmdlg.c, src/gui_xmebw.c
+
+Patch 8.1.2384
+Problem: Test 48 is old style.
+Solution: Merge test cases into new style test. (Yegappan Lakshmanan,
+ closes #5307)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test48.in, src/testdir/test48.ok,
+ src/testdir/test_virtualedit.vim
+
+Patch 8.1.2385
+Problem: Opening cmdline window with feedkeys() does not work. (Yegappan
+ Lakshmanan)
+Solution: Recognize K_CMDWIN also when ex_normal_busy is set.
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.1.2386
+Problem: 'wincolor' is not used for 'listchars'.
+Solution: Combine the colors. (closes #5308)
+Files: src/drawline.c, src/testdir/test_highlight.vim,
+ src/testdir/dumps/Test_wincolor_lcs.dump
+
+Patch 8.1.2387
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/hardcopy.c, src/hashtab.c, src/if_cscope.c, src/if_lua.c,
+ src/if_mzsch.c, src/if_perlsfio.c, src/if_python.c,
+ src/if_python3.c, src/if_ruby.c, src/if_tcl.c, src/if_xcmdsrv.c
+
+Patch 8.1.2388
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/json.c, src/json_test.c, src/kword_test.c, src/list.c,
+ src/main.c, src/mark.c, src/mbyte.c, src/memfile.c,
+ src/memfile_test.c, src/memline.c, src/menu.c
+
+Patch 8.1.2389
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/libvterm/src/screen.c, src/libvterm/src/unicode.c,
+ src/libvterm/src/vterm.c, src/libvterm/t/harness.c,
+ src/libvterm/include/vterm.h, src/xdiff/xdiffi.c,
+ src/xdiff/xemit.c, src/xdiff/xhistogram.c, src/xdiff/xpatience.c,
+ src/xdiff/xutils.c, src/xdiff/xdiff.h, src/xdiff/xdiffi.h,
+ src/xdiff/xemit.h, src/xdiff/xinclude.h, src/xdiff/xmacros.h,
+ src/xdiff/xprepare.h, src/xdiff/xtypes.h, src/xdiff/xutils.h
+
+Patch 8.1.2390
+Problem: Test94 is old style, fix 7.4.441 not tested.
+Solution: Turn test94 into a new style test. Add tests for the fix in patch
+ 7.4.441. (Yegappan Lakshmanan, closes #5316)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test94.in, src/testdir/test94.ok,
+ src/testdir/test_cmdline.vim, src/testdir/test_visual.vim
+
+Patch 8.1.2391
+Problem: Cannot build when __QNXNTO__ is defined. (Ian Wayne Larson)
+Solution: Move the check for "qansi". (Ken Takata, closes #5317)
+Files: src/highlight.c
+
+Patch 8.1.2392
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/nbdebug.c, src/netbeans.c, src/normal.c, src/ops.c,
+ src/option.c
+
+Patch 8.1.2393
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/os_amiga.c, src/os_beos.c, src/os_mac_conv.c, src/os_mswin.c,
+ src/os_qnx.c, src/os_unix.c, src/os_vms.c, src/os_win32.c
+
+Patch 8.1.2394
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/popupmenu.c, src/pty.c, src/quickfix.c, src/regexp.c,
+ src/regexp_nfa.c, src/screen.c, src/search.c, src/sha256.c,
+ src/sign.c
+
+Patch 8.1.2395
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/spell.c, src/spellfile.c, src/syntax.c, src/tag.c, src/term.c,
+ src/terminal.c, src/termlib.c, src/testing.c
+
+Patch 8.1.2396
+Problem: Using old C style comments.
+Solution: Use // comments where appropriate.
+Files: src/ui.c, src/undo.c, src/uninstall.c, src/usercmd.c,
+ src/userfunc.c, src/winclip.c, src/window.c, src/xpm_w32.c
+
+Patch 8.1.2397
+Problem: Should not define __USE_XOPEN. _XOPEN_SOURCE is not needed for
+ Android.
+Solution: Remove __USE_XOPEN and adjust #ifdefs. (Ozaki Kiichi,
+ closes #5322)
+Files: src/vim.h
+
+Patch 8.1.2398
+Problem: strptime() test fails on Japanese Mac.
+Solution: Use %T instead of %X.
+Files: src/testdir/test_functions.vim
+
+Patch 8.1.2399
+Problem: Info popup on top of cursor if it doesn't fit.
+Solution: Hide the popup if it doesn't fit.
+Files: src/popupmenu.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_infopopup_wide_1.dump
+
+Patch 8.1.2400
+Problem: Test39 is old style.
+Solution: Convert the test cases into new style. (Yegappan Lakshmanan,
+ closes #5324)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test39.in, src/testdir/test39.ok,
+ src/testdir/test_blockedit.vim, src/testdir/test_visual.vim
+
+Patch 8.1.2401
+Problem: :cexpr does not handle | in expression.
+Solution: Remove EX_TRLBAR and set nextcmd pointer.
+Files: src/testdir/test_quickfix.vim, src/ex_cmds.h, src/quickfix.c
+
+Patch 8.1.2402
+Problem: Typos and other small things.
+Solution: Small fixes.
+Files: .gitignore, src/testdir/shared.vim, src/testdir/test49.vim,
+ src/message.c, src/Makefile
+
+Patch 8.1.2403
+Problem: Autocmd test fails under valgrind.
+Solution: Wait a bit longer.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.1.2404
+Problem: Channel test fails under valgrind.
+Solution: Sleep a bit longer.
+Files: src/testdir/test_channel.vim
+
+Patch 8.1.2405
+Problem: matchadd_conceal test fails under valgrind.
+Solution: Use WaitForAssert() and wait a bit longer.
+Files: src/testdir/test_matchadd_conceal.vim
+
+Patch 8.1.2406
+Problem: Leaking memory in test_paste and test_registers.
+Solution: Free the old title. Don't copy expr_line.
+Files: src/term.c, src/os_unix.c, src/register.c
+
+Patch 8.1.2407
+Problem: proto file and dependencies outdated.
+Solution: Update proto files and dependencies.
+Files: src/Makefile, src/proto/bufwrite.pro, src/proto/cmdhist.pro,
+ src/proto/optionstr.pro, src/proto/popupwin.pro,
+ src/proto/viminfo.pro, src/proto/if_cscope.pro
+
+Patch 8.1.2408
+Problem: Syntax menu and build instructions outdated.
+Solution: Update build instructions and syntax menu.
+Files: Makefile, runtime/makemenu.vim, runtime/synmenu.vim
+
+Patch 8.1.2409
+Problem: Creating the distribution doesn't work as documented.
+Solution: Adjust name of uninstall binary. Create src/auto directory if
+ needed.
+Files: tools/rename.bat, src/Make_mvc.mak
+
+Patch 8.1.2410
+Problem: MS-Windows: test_iminsert fails without IME support.
+Solution: Skip the test when imgetstatus() doesn't work.
+Files: src/testdir/test_iminsert.vim
+
+Patch 8.1.2411
+Problem: Function argument copied unnecessarily.
+Solution: Use the argument directly.
+Files: src/ex_docmd.c
+
+Patch 8.1.2412
+Problem: Crash when evaluating expression with error. (Dhiraj Mishra)
+Solution: Check parsing failed. (closes #5329)
+Files: src/eval.c, src/testdir/test_lambda.vim
+
+Patch 8.1.2413
+Problem: Cannot update ex_cmdidxs.h on MS-Windows.
+Solution: Add build rules and dependencies. (Ken Takata, closes #5337)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Make_vms.mms
+
+Patch 8.1.2414
+Problem: MS-Windows: properties dialog box shows wrong character.
+Solution: Explicitly specify encoding. (Ken Takata, closes #5338)
+Files: src/vim.rc
+
+Patch 8.1.2415
+Problem: Popup menu flickers if an info popup is used. (Nick Jensen)
+Solution: Set the pum_skip_redraw flag.
+Files: src/popupmenu.c
+
+Patch 8.1.2416
+Problem: Loading menus sets v:errmsg.
+Solution: Avoid setting v:errmsg and add a test for that. (Jason Franklin)
+Files: runtime/delmenu.vim, runtime/menu.vim, src/testdir/test_menu.vim
+
+Patch 8.1.2417
+Problem: MinGW/Cygwin build does not clean up all files.
+Solution: Delete *.map files. (Michael Soyka)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.1.2418
+Problem: bufnr('$') is wrong after recycling popup buffer.
+Solution: Sort the buffer list by buffer number. (closes #5335)
+Files: src/buffer.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.2419
+Problem: With a long file name the hit-enter prompt appears. (J. Lewis
+ Muir)
+Solution: When checking for text to wrap don't do this when outputting a CR.
+Files: src/message.c, src/testdir/test_display.vim,
+ src/testdir/dumps/Test_long_file_name_1.dump
+
+Patch 8.1.2420
+Problem: Crash when calling popup_close() in win_execute().
+Solution: Disallow popup_close() in popup window. (Yasuhiro Matsumoto,
+ closes #5345)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.1.2421
+Problem: Test88 is old style.
+Solution: Turn into a new style test. (Yegappan Lakshmanan, closes #5347)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test88.in, src/testdir/test88.ok,
+ src/testdir/test_conceal.vim, src/testdir/test_python2.vim
+ src/testdir/test_python3.vim
+
+Patch 8.1.2422
+Problem: "make depend" does not work correctly for libvterm.
+Solution: Fix build dependencies. And a few minor improvements.
+Files: src/Makefile, src/filepath.c, src/insexpand.c, src/main.c
+
+Patch 8.1.2423
+Problem: MS-Windows properties shows version as "8, 1, 0".
+Solution: Use "8.1.0". (Ken Takata, closes #5342)
+Files: src/vim.rc
+
+Patch 8.1.2424
+Problem: MS-Windows: console buffer is resized unnecessarily.
+Solution: Only call ResizeConBuf() when the size differs. (Nobuhiro
+ Takasaki, closes #5343)
+Files: src/os_win32.c
+
+==============================================================================
+
+Patch 8.2.0001 and later can be found at |patches-after-8.2|.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt
new file mode 100644
index 0000000..ef8f927
--- /dev/null
+++ b/runtime/doc/version9.txt
@@ -0,0 +1,31671 @@
+*version9.txt* For Vim version 9.0. Last change: 2022 Nov 23
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+ *vim-9.0* *vim-9* *version-9.0* *version9.0*
+Welcome to Vim 9! Several years have passed since the previous release.
+A large number of bugs have been fixed, many nice features have been added
+and the Vim9 script syntax is here! This file mentions all the new things and
+changes to existing features since Vim 8.2.0. The patches up to Vim 8.2 can be
+found here: |vim-8.2|.
+
+Use this command to see the full version and features information of the Vim
+program you are using: >
+ :version
+
+NEW FEATURES |new-9|
+ Vim script enhancements |new-vim-script-9|
+ Command line completion in a popup menu |new-popup-compl|
+ Updated colorschemes |new-colorschemes-9|
+ Various new items |new-items-9|
+
+INCOMPATIBLE CHANGES |incompatible-9|
+
+IMPROVEMENTS |improvements-9|
+
+COMPILE TIME CHANGES |compile-changes-9|
+
+PATCHES |patches-9|
+
+
+See |vi_diff.txt| for an overview of differences between Vi and Vim 9.0.
+See |version4.txt|, |version5.txt|, |version6.txt|, |version7.txt| and
+|version8.txt| for differences between Vim versions.
+
+You can find an overview of the most important changes (according to Martin
+Tournoij) on this site: https://www.arp242.net/vimlog/
+
+ *Sven-Guckes*
+Vim version 9.0 is dedicated to Sven Guckes, who passed away in February 2022
+when the release was being prepared. Sven was a long time supporter of Vim.
+He registered the vim.org domain and created the first Vim website. We will
+remember him!
+
+==============================================================================
+NEW FEATURES *new-9*
+
+First an overview of the more interesting new features. A comprehensive list
+is below.
+
+
+Vim9 script ~
+ *new-vim-script-9*
+The Vim script language has been changed step by step over many years,
+preserving backwards compatibility. Several choices made in the early days
+got in the way of making it work better. At the same time, Vim script is
+being used much more often, since there are so many plugins being used.
+
+Vim9 script provides a syntax that is much more similar to other languages.
+In other words: "less weird". Compiled functions are introduced which allow
+for a large speed improvement. You can expect around ten times faster
+execution, or even more. The price to pay is that Vim9 script is not
+backwards compatible. But don't worry, you can still use your old scripts,
+the new script language is added, it does not replace the legacy script.
+
+Information about Vim9 script can be found in the |Vim9| help file.
+
+
+Command line completion in a popup menu ~
+ *new-popup-compl*
+Before there was the 'wildmenu' option, which uses the space of one line above
+the statusline to show matches. Only a few matches fit there.
+
+Now a popup menu can be used by setting 'wildoptions' to "pum". This allows
+for showing many more matches. This requires redrawing more of the display,
+but since computers are fast enough that is not a problem.
+
+
+Updated colorschemes ~
+ *new-colorschemes-9*
+Colorschemes from https://github.com/vim/colorschemes have been included.
+They were made to work consistently across many types of terminals. Although
+generally an improvement, a lot of personal preference is involved. You can
+always get the old version if you prefer it, look here:
+https://github.com/vim/colorschemes/blob/master/legacy_colors/
+
+
+Various new items ~
+ *new-items-9*
+Options: ~
+
+'autoshelldir' change directory to the shell's current directory
+'cdhome' change directory to the home directory by ":cd"
+'cinscopedecls' words that are recognized by 'cino-g'
+'guiligatures' GTK GUI: ASCII characters that can form shapes
+'mousemoveevent' report mouse moves with <MouseMove>
+'quickfixtextfunc' function for the text in the quickfix window
+'spelloptions' options for spell checking
+'thesaurusfunc' function to be used for thesaurus completion
+'xtermcodes' request terminal codes from an xterm
+
+
+Ex commands: ~
+
+|:abstract| (reserved for future use)
+|:argdedupe| remove duplicates from the argument list
+|:balt| like ":badd" but also set the alternate file
+|:class| (reserved for future use)
+|:def| define a Vim9 user function
+|:defcompile| compile Vim9 user functions in current script
+|:disassemble| disassemble Vim9 user function
+|:echoconsole| like :echomsg but write to stdout
+|:endinterface| (reserved for future use)
+|:endclass| (reserved for future use)
+|:enddef| end of a user function started with :def
+|:endenum| (reserved for future use)
+|:enum| (reserved for future use)
+|:eval| evaluate an expression and discard the result
+|:export| Vim9: export an item from a script
+|:final| declare an immutable variable in Vim9
+|:import| Vim9: import an item from another script
+|:interface| (reserved for future use)
+|:static| (reserved for future use)
+|:type| (reserved for future use)
+|:var| variable declaration in Vim9
+|:vim9script| indicates Vim9 script file
+
+
+Ex command modifiers: ~
+
+|:legacy| make following command use legacy script syntax
+|:vim9cmd| make following command use Vim9 script syntax
+
+
+New and extended functions: ~
+
+|assert_nobeep()| assert that a command does not cause a beep
+|autocmd_add()| add a list of autocmds and groups
+|autocmd_delete()| delete a list of autocmds and groups
+|autocmd_get()| return a list of autocmds
+|blob2list()| get a list of numbers from a blob
+|charclass()| class of a character
+|charcol()| character number of the cursor or a mark
+|charidx()| character index of a byte in a string
+|digraph_get()| get digraph
+|digraph_getlist()| get all digraphs
+|digraph_set()| register digraph
+|digraph_setlist()| register multiple digraphs
+|echoraw()| output characters as-is
+|exists_compiled()| like exists() but check at compile time
+|extendnew()| make a new Dictionary and append items
+|flatten()| flatten a List
+|flattennew()| flatten a copy of a List
+|fullcommand()| get full command name
+|getcharpos()| get character position of cursor, mark, etc.
+|getcharstr()| get a character from the user as a string
+|getcmdcompltype()| return current cmdline completion type
+|getcmdscreenpos()| return the current cursor position in the cmdline
+|getcursorcharpos()| get character position of the cursor
+|getmarklist()| list of global/local marks
+|getreginfo()| get information about a register
+|gettext()| lookup message translation
+|hlget()| get highlight group attributes
+|hlset()| set highlight group attributes
+|isabsolutepath()| check if a path is absolute
+|list2blob()| get a blob from a list of numbers
+|maplist()| list of all mappings, a dict for each
+|mapnew()| make a new List with changed items
+|mapset()| restore a mapping
+|matchfuzzy()| fuzzy matches a string in a list of strings
+|matchfuzzypos()| fuzzy matches a string in a list of strings
+|menu_info()| get information about a menu item
+|popup_list()| get list of all popup window IDs
+|prompt_getprompt()| get the effective prompt text for a buffer
+|prop_add_list()| attach a property at multiple positions
+|prop_find()| search for a property
+|readblob()| read a file into a Blob
+|readdirex()| get a List of file information in a directory
+|reduce()| reduce a List to a value
+|searchcount()| get number of matches before/after the cursor
+|setcellwidths()| set character cell width overrides
+|setcharpos()| set character position of cursor, mark, etc.
+|setcursorcharpos()| set character position of the cursor
+|slice()| take a slice of a List
+|strcharlen()| length of a string in characters
+|terminalprops()| properties of the terminal
+|test_gui_event()| generate a GUI event for testing
+|test_null_function()| return a null Funcref
+|test_srand_seed()| set the seed value for srand()
+|test_unknown()| return a value with unknown type
+|test_void()| return a value with void type
+|typename()| type of a variable as text
+|virtcol2col()| byte index of a character on screen
+|win_gettype()| get type of window
+|win_move_separator()| move window vertical separator
+|win_move_statusline()| move window status line
+|windowsversion()| get MS-Windows version
+
+
+New Vim variables: ~
+
+|v:numbermax| maximum value of a number
+|v:numbermin| minimum value of a number (negative)
+|v:numbersize| number of bits in a Number
+|v:collate| current locale setting for collation order
+|v:exiting| vim exit code
+|v:colornames| dictionary that maps color names to hex color strings
+|v:sizeofint| number of bytes in an int
+|v:sizeoflong| number of bytes in a long
+|v:sizeofpointer| number of bytes in a pointer
+|v:maxcol| maximum line length
+
+
+New autocommand events: ~
+
+|CompleteDonePre| after Insert mode completion done, before clearing info
+|DirChangedPre| before the working directory will change
+|InsertLeavePre| just before leaving Insert mode
+|ModeChanged| after changing the mode
+|SigUSR1| after the SIGUSR1 signal has been detected
+|WinClosed| after closing a window
+|WinScrolled| after scrolling or resizing a window
+|VimSuspend| when suspending Vim
+|VimResume| when Vim is resumed after being suspended
+
+
+New operators: ~
+
+|>>| bitwise right shift
+|<<| bitwise left shift
+|??| falsy operator
+
+New runtime files: ~
+
+Too many to list here.
+
+==============================================================================
+INCOMPATIBLE CHANGES *incompatible-9*
+
+There is only one change that is incompatible with previous releases:
+
+- Lua arrays are now one-based, they used to be zero-based.
+
+Note that when using |Vim9| script several things work differently, see
+|vim9-differences|.
+
+==============================================================================
+IMPROVEMENTS *improvements-9*
+
+Various small and useful improvements have been made since Vim 8.2, here is a
+summary.
+
+Many memory leaks, invalid memory accesses and crashes have been fixed.
+See the list of patches below: |bug-fixes-9|.
+
+Support for Vim expression evaluation in a string. |interpolated-string|
+Support for evaluating Vim expressions in a heredoc. |:let-heredoc|
+
+Support for fuzzy matching:
+- a string in a List of strings. |fuzzy-matching|
+- completion support for command line completion using 'wildoptions'.
+- for |:vimgrep|.
+
+Added support for the |Haiku| OS.
+
+Support for "lsp" channel mode to simplify LSP server RPC communication
+|language-server-protocol|. Support for using a Unix domain socket with a
+|channel|. IPv6 support in channels |channel-address|.
+
+Support for sourcing lines from the current buffer. |:source-range|
+
+Terminal window improvements:
+- Support for opening a terminal in a popup window. |popup-terminal|
+- Allow setting underline color in terminal.
+- Detect focus events in terminal (|FocusGained| and |FocusLost|).
+- Add bell support for the terminal window. ('belloff')
+- Support mouse left-right scrolling in a terminal window.
+
+Support for stopping profiling a Vim script: `:profile stop` and dumping the
+report to a file: `:profile dump` . |:profile|
+
+Completion improvements:
+- Argument completion support for the |:breakadd|, |:breakdel|, |:diffget|,
+ |:diffput|, |:profile|, |:profdel| and |:scriptnames| commands.
+- Support using any Vim type for user_data with the completion functions
+ (|complete-items|).
+- Stop insert mode completion without changing text (|i_CTRL-X_CTRL-Z|).
+- Add the "cmdline" option to |getcompletion()| to return the command line
+ arguments.
+
+Support for setting the 'foldtext', 'completefunc', 'omnifunc',
+'operatorfunc', 'thesaurusfunc', 'quickfixtextfunc', 'tagfunc',
+'imactivatefunc' and 'imstatusfunc' options to a function reference or a
+lambda function or a script-local function.
+
+Support directly setting the 'balloonexpr', 'charconvert' 'foldexpr',
+'formatexpr', 'includeexpr', 'printexpr', 'patchexpr', 'indentexpr',
+'modelineexpr', 'diffexpr' and 'printexpr' options to a script-local function.
+
+Improvements in 'fillchars':
+- Support for configuring the character used to mark the beginning of a fold,
+ show a closed fold and show a fold separator using "foldopen", "foldclose"
+ and "foldsep" respectively in 'fillchars'.
+- Support for configuring the character displayed in non existing lines using
+ "eob" in 'fillchars'.
+- Support for using multibyte items with the "stl", "stlnc", "foldopen",
+ "foldclose" and "foldsep" items in the 'fillchars' option.
+
+Support for the XChaCha20 encryption method. 'cryptmethod'
+
+Spell checking:
+- Spell check current word with |z=| even when 'spell' is off.
+- Add "timeout" to 'spellsuggest' to limit the searching time for spell
+ suggestions.
+- Add support for spell checking CamelCased words by adding "camel" to
+ 'spelloptions'.
+
+Support for executing Ex commands in a map without changing the current mode
+|<Cmd>| and |<ScriptCmd>|.
+
+Add optional error code to |:cquit|.
+
+Recognize numbers as unsigned when "unsigned" is set in 'nrformats'.
+
+Expand script ID using expand('<SID>') and script name using
+expand('<script>'). |expand()|
+
+Jump to the last accessed tab page using |g<Tab>| and support using the
+last accessed tab page in |:tabnext| et al.
+
+Locale aware sorting using |:sort| and |sort()|.
+
+Hide cursor when sleeping using |:sleep!|.
+
+Add "multispace" to 'listchars' to show two or more spaces no matter where
+they appear. Add "leadmultispace" to 'listchars' to show two or more leading
+spaces. Add "lead" to 'listchars' to set the character used to show leading
+spaces. Support specifying a character using the hexadecimal notation in
+'listchars' (\x, \u and \U).
+
+Make 'listchars', 'virtualedit' and 'thesaurusfunc' global-local options.
+
+Support for looping over a string using `:for`.
+
+Don't reset 'wrap' for diff windows when "followwrap" is set in 'diffopt'.
+
+Support for re-evaluating the 'statusline' expression as a statusline format
+string (%{% expr %})
+
+Add |zp| and |zP| to paste in block mode without adding trailing white space.
+Add |zy| to yank without trailing white space in block mode.
+
+Add the 'P' command in visual mode to paste text in Visual mode without
+yanking the deleted text to the unnamed register. |put-Visual-mode|
+
+Add \%.l, \%<.l and \%>.l atoms to match the line the cursor is currently on.
+See |/\%l| for more information.
+
+Add "list" to 'breakindentopt' to add additional indent for lines that match
+a numbered or bulleted list. Add "column" to 'breakindentopt' to indent
+soft-wrapped lines at a specific column.
+
+Add the |hl-CursorLineSign| and |hl-CursorLineFold| default highlight groups to
+adjust sign highlighting for 'cursorline'.
+
+Add the |hl-CurSearch| default highlight group for the current search match.
+
+Add support for logging on Vim startup (|--log|).
+
+Add support for customizing the quickfix buffer contents using
+'quickfixtextfunc'. Support for the "note" error type (%t) in |errorformat|.
+Add support for parsing the end line number (%e) and end column number (%k)
+using 'errorformat'.
+
+Support truncating the tag stack using |settagstack()|.
+
+Display every option in a separate line when "!" is used with |:set|.
+
+Add "nostop" to 'backspace' to allow backspacing over the start of insert for
+|CTRL-W| and |CTRL-U| also.
+
+Sync the undo file if 'fsync' is set.
+
+Support excluding the 'runtimepath' and 'packpath' options from a session file
+using "skiprtp" in 'sessionoptions'.
+
+Support for getting the number of lines (line count) in a buffer using
+|getbufinfo()|.
+
+Support |filter()| and |map()| for blob and string types.
+
+Support for using a multi-byte character for the tag kind. |tags-file-format|
+
+Add support for checking whether a function name is valid using |exists()|.
+
+Update xdiff to version 2.33. Update libvterm to revision 789.
+
+Support 'trim' for Python/Lua/Perl/Tcl/Ruby/MzScheme interface heredoc.
+
+Add the |t_AU| and |t_8u| termcap codes for underline and undercurl. Add the
+t_fd and t_fe termcap codes for detecting focus events.
+
+Support for indenting C pragmas like normal code. (|cino-P|)
+
+Add support for defining the syntax fold level. (|:syn-foldlevel|)
+
+Add support for using \<*xxx> in a string to prepend a modifier to a
+character. (|expr-quote|)
+
+Add support trimming characters at the beginning or end of a string using
+|trim()|.
+
+Make ":verbose pwd" show the scope of the directory. |:pwd-verbose|
+
+Add the "0o" notation for specifying octal numbers. |scriptversion-4|
+
+Support for changing to the previous tab-local and window-local directories
+using the "tcd -" and "lcd -" commands. (|:tcd-| and |:lcd-|)
+
+Add support for skipping an expression using |search()|.
+
+Add support for sorting the directory contents returned by the |readdir()|
+and |readdirex()| functions by case.
+
+Add support for executing (|:@|) a register containing line continuation.
+
+Lua support:
+- Call Vim functions from Lua (vim.call() and vim.fn()).
+- Convert a Lua function and a closure to a Vim funcref so that it can be
+ accessed in a Vim script (|lua-funcref|).
+- Not backwards compatible: Make Lua arrays one based.
+- Add support for using table.insert() and table.remove() functions with Vim
+ lists.
+- Support for running multiple Ex-mode commands using vim.command().
+- Add vim.lua_version to get the Lua version.
+- Add support for accessing Vim namespace dictionaries from Lua
+ (|lua-vim-variables|).
+
+Support for new UTF-8 characters from Unicode release 13.
+
+Support for using a command block (|:command-repl|) when defining a |:command|
+or an |:autocmd|.
+
+Support for using |:z!| to use the Vim display height instead of the current
+window height.
+
+Support for deleting a buffer-local command using ":delcommand -buffer {cmd}".
+
+When formatting a // comment after a statement, find the start of the line
+comment, insert the comment leader and indent the comment properly (|fo-/|).
+
+Add the "numhl" argument to `:sign define` to use a separate highlight group
+for the line number on a line where a sign is placed. |:sign-define|
+
+When $SHELL ends in "nologin" or "false", start Vim in restricted mode.
+
+TermDebug enhancements:
+- Support for showing the disassembled code in a separate window.
+- Support for the GDB until command.
+- Use a separate group for the signs.
+
+xxd: Support for showing offset as a decimal number (-d).
+
+The C omni-complete plugin (|ft-c-omni|), the file type detection script
+(ft.vim) and the syntax menu generation script (makemenu.vim) have been
+rewritten using the Vim9 script syntax.
+
+A large number of tests have been added to verify the Vim functionality. Most
+of the old style tests have been converted to new style tests using the new
+style assert_* functions.
+
+Many Coverity static analysis warnings have been fixed.
+
+==============================================================================
+COMPILE TIME CHANGES *compile-changes-9*
+
+The following features are now enabled in all the builds:
+ |+cindent|
+ |+jumplist|
+ |+lispindent|
+ |+num64|
+ |+smartindent|
+ |+tag_binary|
+ |+title|
+
+The following features have been removed. They are either obsolete or didn't
+work properly:
+ - Athena and neXTaw GUI support (use Motif instead)
+ - EBCDIC support
+ - Atari MiNT and BeOS
+ - Mac Carbon GUI (use MacVim instead)
+
+The rgb.txt file is no longer included, use colors/lists/default.vim instead.
+
+Several large source files were split, mainly to make it easier to inspect
+code coverage information. Source files have also been refactored for
+maintainability.
+
+Support for building Vim with Mingw64 clang compiler on MS-Windows.
+
+Support for building Vim with Python 3.10, Lua 5.4.4, Perl 5.34 and
+Ruby 3.1.0.
+
+==============================================================================
+PATCHES *patches-9* *bug-fixes-9*
+ *patches-after-8.2*
+
+The list of patches that got included since 8.2.0. This includes all the new
+features, but does not include runtime file changes (syntax, indent, help,
+etc.)
+
+Patch 8.2.0001
+Problem: #endif comments do not reflect corresponding #ifdef.
+Solution: Update the comments. (Rene Nyffenegger, closes #5351)
+Files: src/ui.c
+
+Patch 8.2.0002
+Problem: "dj" only deletes first line of closed fold.
+Solution: Adjust last line of operator for linewise motion. (closes #5354)
+Files: src/ops.c, src/testdir/test_fold.vim
+
+Patch 8.2.0003
+Problem: Build file dependencies are incomplete.
+Solution: Fix the dependencies. (Ken Takata, closes #5356)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Make_vms.mms,
+ src/Makefile
+
+Patch 8.2.0004
+Problem: Get E685 and E931 if buffer reload is interrupted.
+Solution: Do not abort deleting a dummy buffer. (closes #5361)
+Files: src/buffer.c, src/proto/buffer.pro, src/testdir/test_trycatch.vim,
+ src/ex_cmds.c, src/ex_getln.c, src/misc2.c, src/quickfix.c,
+ src/window.c, src/vim.h
+
+Patch 8.2.0005
+Problem: Duplication in version info.
+Solution: Use preprocessor string concatenation. (Ken Takata, closes #5357)
+Files: src/version.h
+
+Patch 8.2.0006
+Problem: Test using long file name may fail. (Vladimir Lomov)
+Solution: Limit the name length. (Christian Brabandt, closes #5358)
+Files: src/testdir/test_display.vim
+
+Patch 8.2.0007
+Problem: Popup menu positioned wrong with folding in two tabs.
+Solution: Update the cursor line height. (closes #5353)
+Files: src/move.c, src/proto/move.pro, src/popupmenu.c,
+ src/testdir/test_ins_complete.vim,
+ src/testdir/dumps/Test_pum_with_folds_two_tabs.dump
+
+Patch 8.2.0008
+Problem: Test72 is old style.
+Solution: Convert to new style test. (Yegappan Lakshmanan, closes #5362)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test72.in, src/testdir/test72.ok,
+ src/testdir/test_undo.vim
+
+Patch 8.2.0009
+Problem: VMS: terminal version doesn't build.
+Solution: Move MIN definition. Adjust #ifdefs. (Zoltan Arpadffy)
+Files: src/bufwrite.c, src/fileio.c, src/ui.c, src/xxd/Make_vms.mms
+
+Patch 8.2.0010
+Problem: Test64 is old style.
+Solution: Convert to new style test. (Yegappan Lakshmanan, closes #5363)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test64.in, src/testdir/test64.ok,
+ src/testdir/test95.in, src/testdir/test_regexp_latin.vim
+
+Patch 8.2.0011
+Problem: Screen updating wrong when opening preview window.
+Solution: Redraw the window when the preview window opens.
+Files: src/popupmenu.c, src/testdir/test_ins_complete.vim,
+ src/testdir/dumps/Test_pum_with_preview_win.dump
+
+Patch 8.2.0012
+Problem: Some undo functionality is not tested.
+Solution: Add a few more test cases. (Dominique Pellé, closes #5364)
+Files: src/testdir/test_undo.vim
+
+Patch 8.2.0013
+Problem: Not using a typedef for condstack.
+Solution: Add a typedef.
+Files: src/structs.h, src/ex_docmd.c, src/ex_eval.c, src/userfunc.c,
+ src/ex_cmds.h, src/proto/ex_eval.pro
+
+Patch 8.2.0014
+Problem: Test69 and test95 are old style.
+Solution: Convert to new style tests. (Yegappan Lakshmanan, closes #5365)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test69.in, src/testdir/test69.ok,
+ src/testdir/test95.in, src/testdir/test95.ok,
+ src/testdir/test_regexp_utf8.vim, src/testdir/test_textformat.vim
+
+Patch 8.2.0015
+Problem: Not all modeline variants are tested.
+Solution: Add modeline tests. (Dominique Pellé, closes #5369)
+Files: src/testdir/test_modeline.vim
+
+Patch 8.2.0016
+Problem: Test name used twice, option not restored properly.
+Solution: Rename function, restore option with "&".
+Files: src/testdir/test_textformat.vim
+
+Patch 8.2.0017
+Problem: OS/2 and MS-DOS are still mentioned, even though support was
+ removed long ago.
+Solution: Update documentation. (Yegappan Lakshmanan, closes #5368)
+Files: runtime/doc/autocmd.txt, runtime/doc/change.txt,
+ runtime/doc/cmdline.txt, runtime/doc/editing.txt,
+ runtime/doc/eval.txt, runtime/doc/gui.txt, runtime/doc/insert.txt,
+ runtime/doc/options.txt, runtime/doc/print.txt,
+ runtime/doc/quickfix.txt, runtime/doc/repeat.txt,
+ runtime/doc/starting.txt, runtime/doc/usr_01.txt,
+ runtime/doc/usr_05.txt, runtime/doc/usr_41.txt,
+ runtime/doc/vi_diff.txt, runtime/gvimrc_example.vim,
+ runtime/tools/README.txt, runtime/vimrc_example.vim, src/feature.h
+
+Patch 8.2.0018
+Problem: :join does not add white space where it should. (Zdenek Dohnal)
+Solution: Handle joining multiple lines properly.
+Files: src/ops.c, src/testdir/test_join.vim
+
+Patch 8.2.0019
+Problem: Cannot get number of lines of another buffer.
+Solution: Add "linecount" to getbufinfo(). (Yasuhiro Matsumoto,
+ closes #5370)
+Files: src/evalbuffer.c, src/testdir/test_bufwintabinfo.vim,
+ runtime/doc/eval.txt
+
+Patch 8.2.0020
+Problem: Mouse clicks in the command line not tested.
+Solution: Add tests. (Dominique Pellé, closes #5366)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.2.0021
+Problem: Timer test fails too often on Travis with macOS.
+Solution: Be less strict with the time.
+Files: src/testdir/test_timers.vim
+
+Patch 8.2.0022
+Problem: Click in popup window doesn't close it in the GUI. (Sergey Vlasov)
+Solution: When processing the selection also send a button release event.
+ (closes #5367)
+Files: src/gui.c
+
+Patch 8.2.0023
+Problem: Command line editing not sufficiently tested.
+Solution: Add more tests. (Dominique Pellé, closes #5374)
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_ex_mode.vim
+
+Patch 8.2.0024
+Problem: Filetype Rego not recognized.
+Solution: Add *.rego. (Matt Dunford, closes #5376)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0025
+Problem: Repeated word in comment.
+Solution: Remove one. (Rene Nyffenegger, closes #5384)
+Files: src/structs.h
+
+Patch 8.2.0026
+Problem: Still some /* */ comments.
+Solution: Convert to // comments.
+Files: src/message.c, src/message_test.c, src/misc1.c, src/misc2.c,
+ src/move.c
+
+Patch 8.2.0027
+Problem: Still some /* */ comments.
+Solution: Convert to // comments.
+Files: src/iid_ole.c, src/indent.c, src/insexpand.c, src/iscygpty.c,
+ src/version.c
+
+Patch 8.2.0028
+Problem: Searchpairpos() is not tested.
+Solution: Add tests. Also improve searchpair() testing. (Dominique Pellé,
+ closes #5388)
+Files: src/testdir/test_search.vim
+
+Patch 8.2.0029
+Problem: MS-Windows: crash with empty job command.
+Solution: Check for NULL result. (Yasuhiro Matsumoto, closes #5390)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 8.2.0030
+Problem: "gF" does not work on output of "verbose command".
+Solution: Recognize " line " and translations. (closes #5391)
+Files: src/globals.h, src/eval.c, src/findfile.c, src/testdir/test_gf.vim
+
+Patch 8.2.0031 (after 8.2.0029)
+Problem: MS-Windows: test for empty job fails
+Solution: Check for error message, make it also fail on Unix.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 8.2.0032 (after 8.2.0031)
+Problem: MS-Windows: test for blank job fails
+Solution: Check before escaping.
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 8.2.0033
+Problem: Crash when make_extmatch() runs out of memory.
+Solution: Check for NULL. (Dominique Pellé, closes #5392)
+Files: src/regexp_bt.c, src/regexp_nfa.c
+
+Patch 8.2.0034
+Problem: Missing check for out of memory.
+Solution: Check for NULL after vim_strsave(). (Dominique Pellé,
+ closes #5393)
+Files: src/filepath.c
+
+Patch 8.2.0035
+Problem: Saving and restoring called_emsg is clumsy.
+Solution: Count the number of error messages.
+Files: src/message.c, src/buffer.c, src/channel.c, src/drawscreen.c,
+ src/ex_cmds2.c, src/gui.c, src/highlight.c, src/main.c,
+ src/regexp.c, src/search.c, src/testing.c, src/globals.h
+
+Patch 8.2.0036
+Problem: Not enough test coverage for match functions.
+Solution: Add a few more test cases. (Dominique Pellé, closes #5394)
+ Add error number.
+Files: src/testdir/test_match.vim
+
+Patch 8.2.0037
+Problem: Missing renamed message.
+Solution: Now really add the error number.
+Files: src/highlight.c
+
+Patch 8.2.0038
+Problem: Spell suggestions insufficiently tested.
+Solution: Add spell suggestion tests. (Dominique Pellé, closes #5398)
+Files: src/testdir/test_spell.vim
+
+Patch 8.2.0039
+Problem: Memory access error when "z=" has no suggestions.
+Solution: Check for negative index.
+Files: src/testdir/test_spell.vim, src/spellsuggest.c
+
+Patch 8.2.0040
+Problem: Timers test is still flaky on Travis for Mac.
+Solution: Run separately instead of as part of test_alot.
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim
+
+Patch 8.2.0041
+Problem: Leaking memory when selecting spell suggestion.
+Solution: Free previous value at the right time.
+Files: src/spellsuggest.c
+
+Patch 8.2.0042
+Problem: Clearing funccal values twice.
+Solution: Remove clearing individual fields.
+Files: src/userfunc.c
+
+Patch 8.2.0043
+Problem: Timers test is still flaky on Travis for Mac.
+Solution: Increase maximum expected time.
+Files: src/testdir/test_timers.vim
+
+Patch 8.2.0044
+Problem: Expression type is used inconsistently.
+Solution: Add "ETYPE_IS" and "ETYPE_ISNOT" as separate enum values. Rename
+ "TYPE_" to "ETYPE_" to avoid confusion.
+Files: src/structs.h, src/eval.c, src/proto/eval.pro, src/debugger.c
+
+Patch 8.2.0045 (after 8.2.0044)
+Problem: Script test fails.
+Solution: For numbers "is" and "isnot" work like "==" and "!=".
+Files: src/eval.c
+
+Patch 8.2.0046
+Problem: Tests for spell suggestions are slow.
+Solution: Use shorter words. Test with latin1 and utf-8 to cover more code.
+ (Dominique Pellé, closes #5399)
+Files: src/testdir/test_spell.vim
+
+Patch 8.2.0047
+Problem: Cannot skip tests for specific MS-Windows platform.
+Solution: Add windowsversion().
+Files: src/os_win32.c, src/globals.h, src/evalfunc.c,
+ runtime/doc/eval.txt, src/testdir/gen_opt_test.vim,
+ src/testdir/test_options.vim
+
+Patch 8.2.0048
+Problem: Another timers test is flaky on Travis for Mac.
+Solution: Increase maximum expected time.
+Files: src/testdir/test_timers.vim
+
+Patch 8.2.0049
+Problem: Command line completion not fully tested.
+Solution: Add more test cases. Make help sorting stable. (Dominique Pellé,
+ closes #5402)
+Files: src/ex_cmds.c, src/testdir/test_cd.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_help.vim,
+ src/testdir/test_menu.vim, src/testdir/test_options.vim,
+ src/testdir/test_syntax.vim
+
+Patch 8.2.0050
+Problem: After deleting a file mark it is still in viminfo.
+Solution: When a file mark was deleted more recently than the mark in the
+ merged viminfo file was updated, do not store the mark. (Pavol
+ Juhas, closes #5401, closes #1339)
+Files: src/mark.c, src/testdir/test_marks.vim,
+ src/testdir/test_viminfo.vim, src/viminfo.c
+
+Patch 8.2.0051 (after 8.2.0049)
+Problem: Command line completion test skipped. (Christian Brabandt)
+Solution: Invert condition.
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.2.0052
+Problem: More-prompt not properly tested.
+Solution: Add a test case. (Dominique Pellé, closes #5404)
+Files: src/testdir/test_messages.vim
+
+Patch 8.2.0053
+Problem: windowsversion() does not always return the right value.
+Solution: Add a compatibility section in the manifest. (Ken Takata,
+ closes #5407)
+Files: src/gvim.exe.mnf
+
+Patch 8.2.0054
+Problem: :diffget and :diffput don't have good completion.
+Solution: Add proper completion. (Dominique Pellé, closes #5409)
+Files: runtime/doc/eval.txt, src/buffer.c, src/cmdexpand.c,
+ src/testdir/test_diffmode.vim, src/usercmd.c, src/vim.h
+
+Patch 8.2.0055
+Problem: Cannot use ":gui" in vimrc with VIMDLL enabled.
+Solution: Change the logic, check "gui.starting". (Ken Takata, closes #5408)
+Files: src/gui.c
+
+Patch 8.2.0056
+Problem: Execution stack is incomplete and inefficient.
+Solution: Introduce a proper execution stack and use it instead of
+ sourcing_name/sourcing_lnum. Create a string only when used.
+Files: src/structs.h, src/globals.h, src/autocmd.c, src/buffer.c
+ src/debugger.c, src/ex_docmd.c, src/ex_eval.c, src/highlight.c,
+ src/main.c, src/map.c, src/message.c, src/proto/scriptfile.pro,
+ src/scriptfile.c, src/option.c, src/profiler.c, src/spellfile.c,
+ src/term.c, src/testing.c, src/usercmd.c, src/userfunc.c,
+ src/kword_test.c, src/testdir/test_debugger.vim
+
+Patch 8.2.0057 (after 8.2.0056)
+Problem: Cannot build with small features.
+Solution: Add #ifdefs.
+Files: src/scriptfile.c
+
+Patch 8.2.0058
+Problem: Running tests changes ~/.viminfo.
+Solution: Make 'viminfo' empty when summarizing tests results. (closes #5414)
+Files: src/testdir/summarize.vim
+
+Patch 8.2.0059
+Problem: Compiler warnings for unused variables in small build. (Tony
+ Mechelynck)
+Solution: Add #ifdef.
+Files: src/scriptfile.c
+
+Patch 8.2.0060
+Problem: Message test only runs with one encoding. (Dominique Pellé)
+Solution: Run the test with "utf-8" and "latin1". Fix underflow. (related
+ to #5410)
+Files: src/message_test.c, src/message.c
+
+Patch 8.2.0061
+Problem: The execute stack can grow big and never shrinks.
+Solution: Reduce the size in garbage collect.
+Files: src/eval.c
+
+Patch 8.2.0062
+Problem: Memory test is flaky on FreeBSD.
+Solution: Add a short sleep before getting the first size.
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.2.0063
+Problem: Wrong size argument to vim_snprintf(). (Dominique Pellé)
+Solution: Reduce the size by the length. (related to #5410)
+Files: src/ops.c
+
+Patch 8.2.0064
+Problem: Diffmode completion doesn't use per-window setting.
+Solution: Check if a window is in diff mode. (Dominique Pellé, closes #5419)
+Files: src/buffer.c, src/testdir/test_diffmode.vim
+
+Patch 8.2.0065
+Problem: Amiga and alikes: autoopen only used on Amiga OS4.
+Solution: Adjust #ifdefs. (Ola Söder, closes #5413)
+Files: src/os_amiga.c
+
+Patch 8.2.0066
+Problem: Some corners of vim_snprintf() are not tested.
+Solution: Add a test in C. (Dominique Pellé, closes #5422)
+Files: src/message_test.c
+
+Patch 8.2.0067
+Problem: ERROR_UNKNOWN clashes on some systems.
+Solution: Rename ERROR_ to FCERR_. (Ola Söder, closes #5415)
+Files: src/evalfunc.c, src/userfunc.c, src/vim.h
+
+Patch 8.2.0068
+Problem: Crash when using Python 3 with "utf32" encoding. (Dominique Pellé)
+Solution: Use "utf-8" whenever enc_utf8 is set. (closes #5423)
+Files: src/testdir/test_python3.vim, src/if_py_both.h
+
+Patch 8.2.0069
+Problem: ETYPE_ is used for two different enums.
+Solution: Rename one to use EXPR_.
+Files: src/structs.h, src/eval.c, src/debugger.c
+
+Patch 8.2.0070
+Problem: Crash when using Python 3 with "debug" encoding. (Dominique Pellé)
+Solution: Use "euc-jp" whenever enc_dbcs is set.
+Files: src/testdir/test_python3.vim, src/if_py_both.h
+
+Patch 8.2.0071
+Problem: Memory test often fails on Cirrus CI.
+Solution: Allow for more tolerance in the upper limit. Remove sleep.
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.2.0072 (after 8.2.0071)
+Problem: Memory test still fails on Cirrus CI.
+Solution: Allow for a tiny bit more tolerance in the upper limit.
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.2.0073
+Problem: Initializing globals with COMMA is clumsy.
+Solution: Use INIT2(), INIT3(), etc.
+Files: src/vim.h, src/globals.h
+
+Patch 8.2.0074
+Problem: Python 3 unicode test sometimes fails.
+Solution: Make 'termencoding' empty. Correct number of error message.
+Files: src/change.c, runtime/doc/options.txt, runtime/doc/message.txt,
+ src/testdir/test_python3.vim
+
+Patch 8.2.0075
+Problem: Python 3 unicode test still sometimes fails.
+Solution: Skip the test when 'termencoding' is not empty.
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.0076
+Problem: Python 3 unicode test fails on MS-Windows.
+Solution: Do not set 'encoding' to "debug" on MS-Windows.
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.0077
+Problem: settagstack() cannot truncate at current index.
+Solution: Add the "t" action. (Yegappan Lakshmanan, closes #5417)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/tag.c,
+ src/testdir/test_tagjump.vim
+
+Patch 8.2.0078
+Problem: Expanding <sfile> works differently the second time.
+Solution: Keep the expanded name when redefining a function. (closes #5425)
+Files: src/testdir/test_vimscript.vim, src/userfunc.c
+
+Patch 8.2.0079
+Problem: Python 3 unicode test still fails on MS-Windows.
+Solution: Do not set 'encoding' to "euc-tw" on MS-Windows.
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.0080
+Problem: Globals using INIT4() are not in the tags file.
+Solution: Adjust the tags command.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.0081
+Problem: MS-Windows also need the change to support INIT4().
+Solution: Add the ctags arguments. (Ken Takata)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.2.0082
+Problem: When reusing a buffer listeners are not cleared. (Axel Forsman)
+Solution: Clear listeners when reusing a buffer. (closes #5431)
+Files: src/testdir/test_listener.vim, src/buffer.c
+
+Patch 8.2.0083
+Problem: Text properties wrong when tabs and spaces are exchanged.
+Solution: Take text properties into account. (Nobuhiro Takasaki,
+ closes #5427)
+Files: src/edit.c, src/testdir/test_textprop.vim
+
+Patch 8.2.0084
+Problem: Complete item "user_data" can only be a string.
+Solution: Accept any type of variable. (closes #5412)
+Files: src/testdir/test_ins_complete.vim, src/insexpand.c, src/dict.c,
+ src/proto/dict.pro, src/eval.c, runtime/doc/insert.txt
+
+Patch 8.2.0085
+Problem: Dead code in builtin functions.
+Solution: Clean up the code.
+Files: src/evalvars.c, src/sound.c, src/textprop.c
+
+Patch 8.2.0086 (after 8.2.0084)
+Problem: Build error for small version. (Tony Mechelynck)
+Solution: Only use "user_data" with the +eval feature. Remove unused
+ variable.
+Files: src/insexpand.c, src/dict.c
+
+Patch 8.2.0087
+Problem: Crash in command line expansion when out of memory.
+Solution: Check for NULL pointer. Also make ExpandGeneric() static.
+ (Dominique Pellé, closes #5437)
+Files: src/cmdexpand.c, src/proto/cmdexpand.pro
+
+Patch 8.2.0088
+Problem: Insufficient tests for tags; bug in using extra tag field when
+ using an ex command to position the cursor.
+Solution: Fix the bug, add more tests. (Yegappan Lakshmanan, closes #5439)
+Files: runtime/doc/tagsrch.txt, src/tag.c,
+ src/testdir/test_ins_complete.vim, src/testdir/test_tagfunc.vim,
+ src/testdir/test_tagjump.vim, src/testdir/test_taglist.vim
+
+Patch 8.2.0089
+Problem: Crash when running out of memory in :setfiletype completion.
+Solution: Do not allocate memory. (Dominique Pellé, closes #5438)
+Files: src/cmdexpand.c
+
+Patch 8.2.0090
+Problem: Generated files show up in git status.
+Solution: Ignore a few more files.
+Files: .gitignore
+
+Patch 8.2.0091
+Problem: Compiler warnings for size_t / int types.
+Solution: Change type to size_t. (Mike Williams)
+Files: src/scriptfile.c
+
+Patch 8.2.0092
+Problem: Tags functionality insufficiently tested.
+Solution: Add more tags tests. (Yegappan Lakshmanan, closes #5446)
+Files: src/testdir/test_tagjump.vim
+
+Patch 8.2.0093
+Problem: win_splitmove() can make Vim hang.
+Solution: Check windows exists in the current tab page. (closes #5444)
+Files: src/testdir/test_window_cmd.vim, src/evalwindow.c
+
+Patch 8.2.0094
+Problem: MS-Windows: cannot build with Strawberry Perl 5.30.
+Solution: Define __builtin_expect() as a workaround. (Ken Takata,
+ closes #5267)
+Files: src/if_perl.xs
+
+Patch 8.2.0095
+Problem: Cannot specify exit code for :cquit.
+Solution: Add optional argument. (Thinca, Yegappan Lakshmanan, closes #5442)
+Files: runtime/doc/quickfix.txt, src/ex_cmds.h, src/ex_docmd.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.0096
+Problem: Cannot create tiny popup window in last column. (Daniel Steinberg)
+Solution: Remove position limit. (closes #5447)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_20.dump,
+ src/testdir/dumps/Test_popupwin_21.dump
+
+Patch 8.2.0097
+Problem: Crash with autocommand and spellfile. (Tim Pope)
+Solution: Do not pop exestack when not pushed. (closes #5450)
+Files: src/testdir/test_autocmd.vim, src/spellfile.c
+
+Patch 8.2.0098
+Problem: Exe stack length can be wrong without being detected.
+Solution: Add a check when ABORT_ON_INTERNAL_ERROR is defined.
+Files: src/macros.h, src/autocmd.c, src/buffer.c, src/ex_docmd.c,
+ src/main.c, src/map.c, src/scriptfile.c, src/spellfile.c,
+ src/userfunc.c
+
+Patch 8.2.0099
+Problem: Use of NULL pointer when out of memory.
+Solution: Check for NULL pointer. (Dominique Pellé, closes #5449)
+Files: src/cmdexpand.c
+
+Patch 8.2.0100
+Problem: Macros for Ruby are too complicated.
+Solution: Do not use DYNAMIC_RUBY_VER, use RUBY_VERSION. (Ken Takata,
+ closes #5452)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/auto/configure,
+ src/configure.ac, src/if_ruby.c
+
+Patch 8.2.0101
+Problem: Crash when passing null object to ":echomsg".
+Solution: Check for NULL pointer. (Yasuhiro Matsumoto, closes #5460)
+Files: src/eval.c, src/testdir/test_messages.vim
+
+Patch 8.2.0102
+Problem: Messages test fails in small version.
+Solution: Only use test_null_job() when available.
+Files: src/testdir/test_messages.vim
+
+Patch 8.2.0103
+Problem: Using null object with execute() has strange effects.
+Solution: Give an error message for Job and Channel.
+Files: src/testdir/test_execute_func.vim, src/globals.h, src/eval.c,
+ src/evalfunc.c
+
+Patch 8.2.0104
+Problem: Using channel or job with ":execute" has strange effects.
+Solution: Give an error message for Job and Channel.
+Files: src/testdir/test_eval_stuff.vim, src/eval.c
+
+Patch 8.2.0105
+Problem: Vim license not easy to find on github.
+Solution: Add a separate LICENCE file. (closes #5458)
+Files: LICENSE, Filelist
+
+Patch 8.2.0106
+Problem: Printf formats are not exactly right.
+Solution: Adjust signed/unsigned conversions. (Frazer Clews, closes #5456)
+Files: runtime/tools/ccfilter.c, src/libvterm/src/parser.c,
+ src/libvterm/src/pen.c, src/ui.c
+
+Patch 8.2.0107
+Problem: Hgignore is out of sync from gitignore.
+Solution: Add lines to hgignore. (Ken Takata)
+Files: .hgignore
+
+Patch 8.2.0108
+Problem: When sign text is changed a manual redraw is needed. (Pontus
+ Lietzler)
+Solution: Redraw automatically. (closes #5455)
+Files: src/testdir/test_signs.vim, src/sign.c,
+ src/testdir/dumps/Test_sign_cursor_1.dump,
+ src/testdir/dumps/Test_sign_cursor_2.dump,
+ src/testdir/dumps/Test_sign_cursor_3.dump,
+ src/testdir/dumps/Test_sign_cursor_01.dump,
+ src/testdir/dumps/Test_sign_cursor_02.dump
+
+Patch 8.2.0109
+Problem: Corrupted text properties when expanding spaces.
+Solution: Reallocate the line. (Nobuhiro Takasaki, closes #5457)
+Files: src/edit.c, src/testdir/test_textprop.vim
+
+Patch 8.2.0110
+Problem: prop_find() is not implemented.
+Solution: Implement prop_find(). (Ryan Hackett, closes #5421, closes #4970)
+Files: src/evalfunc.c, src/proto/textprop.pro,
+ src/testdir/test_textprop.vim, src/textprop.c,
+ runtime/doc/textprop.txt
+
+Patch 8.2.0111
+Problem: VAR_SPECIAL is also used for booleans.
+Solution: Add VAR_BOOL for better type checking.
+Files: src/structs.h, src/dict.c, src/eval.c, src/evalfunc.c,
+ src/evalvars.c, src/if_lua.c, src/if_mzsch.c, src/if_py_both.h,
+ src/if_ruby.c, src/json.c, src/popupmenu.c, src/proto/dict.pro,
+ src/testing.c, src/vim.h, src/viminfo.c
+
+Patch 8.2.0112
+Problem: Illegal memory access when using 'cindent'.
+Solution: Check for NUL byte. (Dominique Pellé, closes #5470)
+Files: src/cindent.c, src/testdir/test_cindent.vim
+
+Patch 8.2.0113 (after 8.2.0095)
+Problem: "make cmdidxs" fails.
+Solution: Allow address for ":cquit". Add --not-a-term to avoid a delay.
+Files: src/ex_cmds.h, src/Makefile, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak
+
+Patch 8.2.0114
+Problem: Info about sourced scripts is scattered.
+Solution: Use scriptitem_T for info about a script, including s: variables.
+ Drop ga_scripts.
+Files: src/structs.h, src/evalvars.c, src/scriptfile.c, src/eval.c
+
+Patch 8.2.0115
+Problem: Byte2line() does not work correctly with text properties. (Billie
+ Cleek)
+Solution: Take the bytes of the text properties into account.
+ (closes #5334)
+Files: src/testdir/test_textprop.vim, src/memline.c
+
+Patch 8.2.0116
+Problem: BufEnter autocmd not triggered on ":tab drop". (Andy Stewart)
+Solution: Decrement autocmd_no_enter for the last file. (closes #1660,
+ closes #5473)
+Files: src/arglist.c, src/testdir/test_tabpage.vim
+
+Patch 8.2.0117
+Problem: Crash when using gettabwinvar() with invalid arguments. (Yilin
+ Yang)
+Solution: Use "curtab" if "tp" is NULL. (closes #5475)
+Files: src/evalwindow.c, src/testdir/test_getvar.vim
+
+Patch 8.2.0118
+Problem: Crash when cycling to buffers involving popup window .
+Solution: Do not decrement buffer reference count.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_infopopup_7.dump
+
+Patch 8.2.0119
+Problem: Message test fails on some platforms. (Elimar Riesebieter)
+Solution: Add type cast to vim_snprintf() argument. (Dominique Pellé)
+Files: src/message_test.c
+
+Patch 8.2.0120
+Problem: virtcol() does not check arguments to be valid, which may lead to
+ a crash.
+Solution: Check the column to be valid. Do not decrement MAXCOL.
+ (closes #5480)
+Files: src/evalfunc.c, src/testdir/test_marks.vim
+
+Patch 8.2.0121
+Problem: filter() and map() on blob don't work.
+Solution: Correct the code. (closes #5483)
+Files: src/list.c, src/testdir/test_blob.vim
+
+Patch 8.2.0122
+Problem: Readme files still mention MS-DOS.
+Solution: Update readme files. (Ken Takata, closes #5486)
+Files: README.md, README.txt, READMEdir/README_dos.txt,
+ READMEdir/README_srcdos.txt, READMEdir/README_w32s.txt,
+ runtime/doc/os_win32.txt
+
+Patch 8.2.0123
+Problem: complete_info() does not work when CompleteDone is triggered.
+Solution: Trigger CompleteDone before clearing the info.
+Files: src/insexpand.c, runtime/doc/autocmd.txt,
+ src/testdir/test_ins_complete.vim
+
+Patch 8.2.0124
+Problem: Compiler warnings for variable types.
+Solution: Change type, add type cast. (Mike Williams)
+Files: src/memline.c
+
+Patch 8.2.0125
+Problem: :mode no longer works for any system.
+Solution: Always give an error message.
+Files: src/ex_docmd.c, runtime/doc/quickref.txt, src/os_amiga.c,
+ src/proto/os_amiga.pro, src/os_mswin.c, src/proto/os_mswin.pro,
+ src/os_unix.c, src/proto/os_unix.pro
+
+Patch 8.2.0126 (after 8.2.0124)
+Problem: Textprop test fails.
+Solution: Fix sign in computation.
+Files: src/memline.c
+
+Patch 8.2.0127
+Problem: Some buffer commands work in a popup window.
+Solution: Disallow :bnext, :bprev, etc. (Naruhiko Nishino, closes #5494)
+Files: src/ex_docmd.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.0128
+Problem: Cannot list options one per line.
+Solution: Use ":set!" to list one option per line.
+Files: src/ex_docmd.c, src/option.c, src/proto/option.pro, src/vim.h,
+ src/ex_cmds.h, src/optiondefs.h, src/testdir/test_options.vim,
+ runtime/doc/options.txt
+
+Patch 8.2.0129
+Problem: MS-Windows installer doesn't use Turkish translations.
+Solution: Enable the Turkish translations and fix a few. (Emir Sarı,
+ closes #5493)
+Files: nsis/gvim.nsi, nsis/lang/turkish.nsi
+
+Patch 8.2.0130
+Problem: Python3 ranges are not tested.
+Solution: Add test. (Dominique Pellé, closes #5498)
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.0131
+Problem: Command line is not cleared when switching tabs and the command
+ line height differs.
+Solution: Set the "clear_cmdline" flag when needed. (Naruhiko Nishino,
+ closes #5495)
+Files: src/testdir/dumps/Test_cmdlineclear_tabenter.dump,
+ src/testdir/test_cmdline.vim, src/window.c
+
+Patch 8.2.0132
+Problem: Script may be re-used when deleting and creating a new one.
+Solution: When the inode matches, also check the file name.
+Files: src/scriptfile.c, src/testdir/test_source.vim
+
+Patch 8.2.0133
+Problem: Invalid memory access with search command.
+Solution: When :normal runs out of characters in bracketed paste mode break
+ out of the loop.(closes #5511)
+Files: src/testdir/test_search.vim, src/edit.c
+
+Patch 8.2.0134
+Problem: Some map functionality not covered by tests.
+Solution: Add tests. (Yegappan Lakshmanan, closes #5504)
+Files: src/testdir/test_maparg.vim, src/testdir/test_mapping.vim
+
+Patch 8.2.0135 (after 8.2.0133)
+Problem: Bracketed paste can still cause invalid memory access. (Dominique
+ Pellé)
+Solution: Check for NULL pointer.
+Files: src/edit.c, src/testdir/test_search.vim
+
+Patch 8.2.0136
+Problem: Stray ch_logfile() call.
+Solution: Remove it. (closes #5503)
+Files: src/testdir/test_source.vim
+
+Patch 8.2.0137
+Problem: Crash when using win_execute() from a new tab.
+Solution: Set the tp_*win pointers. (Ozaki Kiichi, closes #5512)
+Files: src/testdir/test_winbuf_close.vim, src/window.c
+
+Patch 8.2.0138
+Problem: Memory leak when starting a job fails.
+Solution: Free the list of arguments. (Ozaki Kiichi, closes #5510)
+Files: src/channel.c, src/testdir/test_channel.vim
+
+Patch 8.2.0139
+Problem: MS-Windows: default for IME is inconsistent.
+Solution: Also make IME default enabled with MVC. (Ken Takata, closes #5508)
+Files: src/Make_mvc.mak
+
+Patch 8.2.0140
+Problem: CI does not test building doc tags.
+Solution: Add the vimtags/gcc build. Cleanup showing version. (Ozaki Kiichi,
+ closes #5513)
+Files: .travis.yml, Filelist, ci/if_ver-1.vim, ci/if_ver-2.vim,
+ ci/if_ver-cmd.vim, runtime/doc/Makefile, runtime/doc/doctags.vim,
+ src/testdir/if_ver-1.vim, src/testdir/if_ver-2.vim
+
+Patch 8.2.0141
+Problem: No swift filetype detection.
+Solution: Add swift, swiftgyb and sil. (Emir Sarı, closes #5517)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0142
+Problem: Possible to enter popup window with CTRL-W p. (John Devin)
+Solution: Check entered window is not a popup window. (closes #5515)
+Files: src/window.c, src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_previewpopup_9.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_10.dump
+
+Patch 8.2.0143
+Problem: Coverity warning for possible use of NULL pointer.
+Solution: Check argv is not NULL.
+Files: src/channel.c
+
+Patch 8.2.0144
+Problem: Some mapping code is not fully tested.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #5519)
+Files: src/testdir/test_langmap.vim, src/testdir/test_maparg.vim,
+ src/testdir/test_mapping.vim
+
+Patch 8.2.0145
+Problem: Using #error for compilation errors should be OK now.
+Solution: Use #error. (Ken Takata, closes #5299)
+Files: src/blowfish.c, src/vim.h
+
+Patch 8.2.0146
+Problem: Wrong indent when 'showbreak' and 'breakindent' are set and
+ 'briopt' includes "sbr".
+Solution: Reset "need_showbreak" where needed. (Ken Takata, closes #5523)
+Files: src/drawline.c, src/testdir/test_breakindent.vim
+
+Patch 8.2.0147
+Problem: Block Visual mode operators not correct when 'linebreak' set.
+Solution: Set w_p_lbr to lbr_saved more often. (Ken Takata, closes #5524)
+Files: src/ops.c, src/testdir/test_listlbr.vim
+
+Patch 8.2.0148
+Problem: Mapping related function in wrong source file.
+Solution: Move the function. Add a few more test cases. (Yegappan
+ Lakshmanan, closes #5528)
+Files: src/map.c, src/proto/term.pro, src/term.c,
+ src/testdir/test_mapping.vim
+
+Patch 8.2.0149
+Problem: Maintaining a Vim9 branch separately is more work.
+Solution: Merge the Vim9 script changes.
+Files: README.md, README_VIM9.md, runtime/doc/Makefile,
+ runtime/doc/eval.txt, runtime/doc/options.txt, runtime/doc/tags,
+ runtime/doc/vim9.txt, runtime/ftplugin/vim.vim,
+ runtime/indent/vim.vim, runtime/syntax/vim.vim,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Makefile, src/blob.c,
+ src/channel.c, src/dict.c, src/eval.c, src/evalbuffer.c,
+ src/evalfunc.c, src/evalvars.c, src/ex_cmdidxs.h, src/ex_cmds.h,
+ src/ex_docmd.c, src/ex_eval.c, src/filepath.c, src/globals.h,
+ src/gui.c, src/if_lua.c, src/if_py_both.h, src/insexpand.c,
+ src/json.c, src/list.c, src/macros.h, src/main.c, src/message.c,
+ src/misc1.c, src/proto.h, src/proto/blob.pro, src/proto/eval.pro,
+ src/proto/evalfunc.pro, src/proto/evalvars.pro,
+ src/proto/ex_docmd.pro, src/proto/ex_eval.pro, src/proto/list.pro,
+ src/proto/message.pro, src/proto/scriptfile.pro,
+ src/proto/userfunc.pro, src/proto/vim9compile.pro,
+ src/proto/vim9execute.pro, src/proto/vim9script.pro,
+ src/scriptfile.c, src/session.c, src/structs.h, src/syntax.c,
+ src/testdir/Make_all.mak, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim, src/testing.c, src/userfunc.c,
+ src/vim.h, src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/vim9script.c, src/viminfo.c
+
+Patch 8.2.0150
+Problem: Cannot define python function when using :execute. (Yasuhiro
+ Matsumoto)
+Solution: Do not recognize "def" inside "function.
+Files: src/testdir/test_vim9_script.vim, src/userfunc.c
+
+Patch 8.2.0151
+Problem: Detecting a script was already sourced is unreliable.
+Solution: Do not use the inode number.
+Files: src/scriptfile.c, src/structs.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0152
+Problem: Restoring ctrl_x_mode is not needed.
+Solution: Remove restoring the old value, it's changed again soon.
+Files: src/insexpand.c
+
+Patch 8.2.0153
+Problem: Warning shows when listing version info.
+Solution: Use "-u NONE". (Ozaki Kiichi, closes #5534)
+Files: .travis.yml
+
+Patch 8.2.0154
+Problem: Reallocating the list of scripts is inefficient.
+Solution: Instead of using a growarray of scriptitem_T, store pointers and
+ allocate each scriptitem_T separately. Also avoids that the
+ growarray pointers change when sourcing a new script.
+Files: src/globals.h, src/eval.c, src/evalvars.c, src/ex_docmd.c,
+ src/profiler.c, src/scriptfile.c, src/vim9compile.c,
+ src/vim9execute.c, src/vim9script.c
+
+Patch 8.2.0155
+Problem: Warnings from MinGW compiler. (John Marriott) Json test fails when
+ building without +float feature.
+Solution: Init variables. Fix Json parsing. Skip a few tests that require
+ the +float feature.
+Files: src/vim9script.c, src/vim9compile.c, src/vim9execute.c,
+ src/if_py_both.h, src/json.c, src/testdir/test_method.vim
+
+Patch 8.2.0156
+Problem: Various typos in source files and tests.
+Solution: Fix the typos. (Emir Sarı, closes #5532)
+Files: Makefile, src/INSTALLvms.txt, src/Make_vms.mms, src/beval.h,
+ src/buffer.c, src/charset.c, src/evalvars.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/getchar.c, src/gui.c, src/gui_mac.c,
+ src/gui_photon.c, src/if_perl.xs,
+ src/libvterm/t/11state_movecursor.test,
+ src/libvterm/t/41screen_unicode.test, src/mbyte.c, src/memline.c,
+ src/normal.c, src/ops.c, src/option.c, src/option.h,
+ src/os_unix.c, src/os_win32.c, src/quickfix.c, src/register.c,
+ src/spell.c, src/tag.c, src/term.c,
+ src/testdir/test_breakindent.vim, src/testdir/test_channel.vim,
+ src/testdir/test_cindent.vim, src/testdir/test_digraph.vim,
+ src/testdir/test_edit.vim, src/testdir/test_netbeans.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_registers.vim,
+ src/testdir/test_stat.vim, src/ui.c, src/xxd/xxd.c
+
+Patch 8.2.0157
+Problem: Vim9 script files not in list of distributed files.
+Solution: Add the entries.
+Files: Filelist
+
+Patch 8.2.0158 (after 8.2.0123)
+Problem: Triggering CompleteDone earlier is not backwards compatible.
+ (Daniel Hahler)
+Solution: Add CompleteDonePre instead.
+Files: src/insexpand.c, runtime/doc/autocmd.txt, src/autocmd.c,
+ src/vim.h, src/testdir/test_ins_complete.vim
+
+Patch 8.2.0159
+Problem: Non-materialized range() list causes problems. (Fujiwara Takuya)
+Solution: Materialize the list where needed.
+Files: src/testdir/test_functions.vim, src/testdir/test_python3.vim,
+ src/userfunc.c, src/evalfunc.c, src/highlight.c, src/evalvars.c,
+ src/popupmenu.c, src/insexpand.c, src/json.c, src/channel.c,
+ src/eval.c
+
+Patch 8.2.0160 (after 8.2.0159)
+Problem: Range test fails.
+Solution: Include change in list code. (#5541)
+Files: src/list.c
+
+Patch 8.2.0161
+Problem: Not recognizing .gv file as dot filetype.
+Solution: Add *.gv to dot pattern. (closes #5544)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0162
+Problem: Balloon test fails in the GUI.
+Solution: Skip test in the GUI.
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.0163
+Problem: Test hangs on MS-Windows console.
+Solution: use feedkeys() instead of test_feedinput(). (Ken Takata)
+Files: src/testdir/test_functions.vim, src/testing.c
+
+Patch 8.2.0164
+Problem: Test_alot takes too long.
+Solution: Run several tests individually.
+Files: src/testdir/test_alot.vim, src/testdir/Make_all.mak
+
+Patch 8.2.0165
+Problem: Coverity warning for using NULL pointer.
+Solution: Add missing "else".
+Files: src/vim9compile.c
+
+Patch 8.2.0166
+Problem: Coverity warning for using uninitialized variable.
+Solution: Check for failure.
+Files: src/vim9execute.c
+
+Patch 8.2.0167
+Problem: Coverity warning for ignoring return value.
+Solution: Check the return value and jump if failed.
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0168
+Problem: Coverity warning for assigning NULL to an option.
+Solution: Use empty string instead of NULL.
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0169
+Problem: Coverity warning for dead code.
+Solution: Check if inside try-finally.
+Files: src/vim9execute.c
+
+Patch 8.2.0170
+Problem: Coverity warning for ignoring return value.
+Solution: Check the return value and return if failed.
+Files: src/vim9compile.c
+
+Patch 8.2.0171
+Problem: Coverity warning for using uninitialized buffer.
+Solution: Check the skip flag.
+Files: src/userfunc.c
+
+Patch 8.2.0172
+Problem: Coverity warning for not restoring character.
+Solution: Restore the character also in case of failure.
+Files: src/vim9script.c
+
+Patch 8.2.0173
+Problem: Build fails with old compiler.
+Solution: Do not use anonymous unions. (John Marriott)
+Files: src/vim9compile.c, src/evalvars.c, src/list.c, src/structs.h,
+ src/evalfunc.c, src/channel.c, src/if_mzsch.c, src/if_py_both.h
+
+Patch 8.2.0174
+Problem: Various commands not completely tested.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #5551)
+Files: src/testdir/test_excmd.vim, src/testdir/test_fnameescape.vim,
+ src/testdir/test_ga.vim, src/testdir/test_global.vim,
+ src/testdir/test_move.vim, src/testdir/test_options.vim,
+ src/testdir/test_packadd.vim, src/testdir/test_sort.vim,
+ src/testdir/test_substitute.vim, src/testdir/test_textformat.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.0175
+Problem: Crash when removing list element in map().
+Solution: Lock the list. (closes #2652)
+Files: src/testdir/test_filter_map.vim, src/list.c
+
+Patch 8.2.0176
+Problem: Generating os headers does not work for Swedish.
+Solution: Set the locale to C. (Christian Brabandt, closes #5258)
+Files: src/osdef.sh
+
+Patch 8.2.0177
+Problem: Memory leak in get_tags().
+Solution: Free matches when finding a pseudo-tag line. (Dominique Pellé,
+ closes #5553)
+Files: src/tag.c
+
+Patch 8.2.0178
+Problem: With VTP the screen may not be restored properly.
+Solution: Add another set of saved RGB values. (Nobuhiro Takasaki,
+ closes #5548)
+Files: src/os_win32.c
+
+Patch 8.2.0179
+Problem: Still a few places where range() does not work.
+Solution: Fix using range() causing problems.
+Files: src/terminal.c, src/testdir/test_functions.vim,
+ src/testdir/test_popupwin.vim, src/popupwin.c, src/tag.c,
+ src/testdir/dumps/Test_popupwin_20.dump,
+ src/testdir/dumps/Test_popupwin_21.dump,
+ src/testdir/dumps/Test_popup_settext_07.dump, src/globals.h
+
+Patch 8.2.0180
+Problem: Test for wrapmargin fails if terminal is not 80 columns.
+Solution: Vertical split the window. (Ken Takata, closes #5554)
+Files: src/testdir/test_textformat.vim
+
+Patch 8.2.0181
+Problem: Problems parsing :term arguments.
+Solution: Improve parsing, fix memory leak, add tests. (Ozaki Kiichi,
+ closes #5536)
+Files: src/channel.c, src/proto/channel.pro, src/structs.h,
+ src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.0182
+Problem: Min() and max() materialize a range() list.
+Solution: Compute the result without materializing the list. (#5541)
+Files: src/evalfunc.c
+
+Patch 8.2.0183
+Problem: Tests fail when the float feature is disabled.
+Solution: Skip tests that don't work without float support.
+Files: src/testdir/shared.vim, src/testdir/test_blob.vim,
+ src/testdir/test_channel.vim, src/testdir/test_cscope.vim,
+ src/testdir/test_execute_func.vim, src/testdir/test_expr.vim,
+ src/testdir/test_functions.vim, src/testdir/test_lambda.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_lua.vim,
+ src/testdir/test_options.vim, src/testdir/test_partial.vim,
+ src/testdir/test_ruby.vim, src/testdir/test_sort.vim,
+ src/testdir/test_timers.vim, src/testdir/test_true_false.vim,
+ src/testdir/test_user_func.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vimscript.vim, src/testdir/test_regexp_latin.vim,
+ src/testdir/test_glob2regpat.vim
+
+Patch 8.2.0184
+Problem: Blob test fails.
+Solution: Check for different error when float feature is missing.
+Files: src/testdir/test_blob.vim
+
+Patch 8.2.0185
+Problem: Vim9 script: cannot use "if has()" to skip lines.
+Solution: Evaluate constant expression at runtime.
+Files: src/vim9compile.c, src/evalfunc.c, src/proto/evalfunc.pro,
+ src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0186
+Problem: A couple of tests may fail when features are missing.
+Solution: Check for features. (Dominique Pellé, closes #5561)
+Files: src/testdir/test_functions.vim, src/testdir/test_highlight.vim
+
+Patch 8.2.0187
+Problem: Redundant code.
+Solution: Remove unused assignments. (Dominique Pellé, closes #5557)
+Files: src/vim9compile.c
+
+Patch 8.2.0188
+Problem: Check commands don't work well with Vim9 script.
+Solution: Improve constant expression handling.
+Files: src/vim9compile.c, src/testdir/check.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0189
+Problem: cd() with NULL argument crashes.
+Solution: Check for NULL. (Ken Takata, closes #5558)
+Files: src/testdir/test_cd.vim, src/ex_docmd.c
+
+Patch 8.2.0190
+Problem: Kotlin files are not recognized.
+Solution: Detect Kotlin files. (Alkeryn, closes #5560)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0191
+Problem: Cannot put a terminal in a popup window.
+Solution: Allow opening a terminal in a popup window. It will always have
+ keyboard focus until closed.
+Files: src/popupwin.c, src/proto/popupwin.pro, src/terminal.c,
+ src/proto/terminal.pro, src/macros.h, src/mouse.c,
+ src/highlight.c, src/drawline.c, src/optionstr.c, src/window.c,
+ src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_popup_1.dump,
+ src/testdir/dumps/Test_terminal_popup_2.dump,
+ src/testdir/dumps/Test_terminal_popup_3.dump
+
+Patch 8.2.0192 (after 8.2.0191)
+Problem: Build failure without +terminal feature.
+Solution: Add #ifdefs.
+Files: src/popupwin.c
+
+Patch 8.2.0193 (after 8.2.0191)
+Problem: Still build failure without +terminal feature.
+Solution: Add more #ifdefs.
+Files: src/macros.h
+
+Patch 8.2.0194 (after 8.2.0193)
+Problem: Some commands can cause problems in terminal popup.
+Solution: Disallow more commands.
+Files: src/macros.h, src/popupwin.c, src/proto/popupwin.pro,
+ src/arglist.c, src/ex_docmd.c, src/window.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.2.0195
+Problem: Some tests fail when run in the GUI.
+Solution: Make sure the window width is enough. In the GUI run terminal Vim
+ in the terminal, if possible.
+Files: src/testdir/test_highlight.vim, src/testdir/check.vim,
+ src/testdir/test_terminal.vim
+
+Patch 8.2.0196
+Problem: Blocking commands for a finished job in a popup window.
+Solution: Do not block commands if the job has finished. Adjust test.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim, src/window.c,
+ src/terminal.c, src/proto/terminal.pro
+
+Patch 8.2.0197
+Problem: Some Ex commands not sufficiently tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5565)
+Files: src/testdir/test_global.vim, src/testdir/test_help.vim,
+ src/testdir/test_help_tagjump.vim, src/testdir/test_options.vim,
+ src/testdir/test_substitute.vim, src/testdir/test_textformat.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.0198
+Problem: No tests for y/n prompt.
+Solution: Add tests. (Dominique Pellé, closes #5564)
+Files: src/testdir/test_messages.vim
+
+Patch 8.2.0199
+Problem: Vim9 script commands not sufficiently tested.
+Solution: Add more tests. Fix script-local function use.
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim,
+ src/userfunc.c
+
+Patch 8.2.0200
+Problem: Vim9 script commands not sufficiently tested.
+Solution: Add more tests. Fix storing global variable. Make script
+ variables work.
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h, src/evalvars.c,
+ src/proto/evalvars.pro, src/testdir/test_vim9_script.vim,
+ src/misc1.c, src/proto/misc1.pro
+
+Patch 8.2.0201
+Problem: Cannot assign to an imported variable.
+Solution: Make it work.
+Files: src/evalvars.c, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0202
+Problem: When 'lazyredraw' is set the window title may not be updated.
+Solution: Set "do_redraw" before entering the main loop. (Jason Franklin)
+Files: src/main.c
+
+Patch 8.2.0203
+Problem: :helptags and some other functionality not tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5567)
+Files: src/testdir/test_compiler.vim, src/testdir/test_ex_mode.vim,
+ src/testdir/test_excmd.vim, src/testdir/test_filechanged.vim,
+ src/testdir/test_help.vim, src/testdir/test_help_tagjump.vim,
+ src/testdir/test_timers.vim, src/testdir/test_window_cmd.vim
+
+Patch 8.2.0204
+Problem: Crash when using winnr('j') in a popup window.
+Solution: Do not search for neighbors in a popup window. (closes #5568)
+Files: src/window.c, src/testdir/test_popupwin.vim, src/evalwindow.c
+
+Patch 8.2.0205
+Problem: Error code E899 used twice.
+Solution: Use E863 for the terminal in popup error.
+Files: src/popupwin.c
+
+Patch 8.2.0206
+Problem: Calling Vim9 function using default argument fails.
+Solution: Give an appropriate error. (closes #5572)
+Files: src/testdir/test_vim9_script.vim, src/vim9compile.c,
+ src/vim9execute.c
+
+Patch 8.2.0207
+Problem: Crash when missing member type on list argument.
+Solution: Check for invalid type. (closes #5572)
+Files: src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0208
+Problem: Fnamemodify() does not apply ":~" when followed by ":.".
+Solution: Don't let a failing ":." cause the ":~" to be skipped. (Yasuhiro
+ Matsumoto, closes #5577)
+Files: runtime/doc/cmdline.txt, src/filepath.c,
+ src/testdir/test_fnamemodify.vim
+
+Patch 8.2.0209
+Problem: Function a bit far away from where it's used.
+Solution: Move function close to where it's used. (Ken Takata, closes #5569)
+Files: src/fileio.c, src/filepath.c
+
+Patch 8.2.0210
+Problem: Coverity complains about uninitialized field.
+Solution: Initialize the field.
+Files: src/vim9compile.c
+
+Patch 8.2.0211
+Problem: Test for ANSI colors fails without an "ls" command.
+Solution: Use "dir". (Ken Takata, closes #5582)
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.0212
+Problem: Missing search/substitute pattern hardly tested.
+Solution: Add test_clear_search_pat() and tests. (Yegappan Lakshmanan,
+ closes #5579)
+Files: runtime/doc/eval.txt, runtime/doc/testing.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/proto/regexp.pro,
+ src/proto/search.pro, src/proto/testing.pro, src/regexp.c,
+ src/search.c, src/testdir/test_quickfix.vim,
+ src/testdir/test_search.vim, src/testdir/test_sort.vim,
+ src/testdir/test_substitute.vim, src/testing.c
+
+Patch 8.2.0213
+Problem: Configure does not recognize gcc 10.0 and later.
+Solution: Adjust the pattern matching the version number. (Sergei
+ Trofimovich, closes #5580)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.0214
+Problem: A popup window with a terminal can be made hidden.
+Solution: Disallow hiding a terminal popup.
+Files: src/testdir/test_terminal.vim, src/popupwin.c,
+ src/testdir/dumps/Test_terminal_popup_4.dump
+
+Patch 8.2.0215 (after 8.2.0208)
+Problem: Wrong file name shortening. (Ingo Karkat)
+Solution: Better check for path separator. (Yasuhiro Matsumoto,
+ closes #5583, closes #5584)
+Files: src/filepath.c, src/testdir/test_fnamemodify.vim
+
+Patch 8.2.0216
+Problem: Several Vim9 instructions are not tested.
+Solution: Add more tests. Fix :disassemble output. Make catch with pattern
+ work.
+Files: src/testdir/test_vim9_script.vim, src/vim9execute.c,
+ src/vim9compile.c
+
+Patch 8.2.0217 (after 8.2.0214)
+Problem: Terminal test fails on Mac.
+Solution: Add a short wait.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0218
+Problem: Several Vim9 instructions are not tested.
+Solution: Add more tests.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0219 (after 8.2.0217)
+Problem: Terminal test still fails on Mac.
+Solution: Skip part of the test on Mac.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0220
+Problem: Terminal test did pass on Mac.
+Solution: Remove the skip again.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0221
+Problem: No test for Vim9 += and ..=.
+Solution: Add tests.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0222
+Problem: Vim9: optional function arguments don't work yet.
+Solution: Implement optional function arguments.
+Files: src/userfunc.c, src/vim9compile.c, src/vim9execute.c,
+ src/structs.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0223
+Problem: Some instructions not yet tested.
+Solution: Disassemble more instructions. Move tests to a new file. Compile
+ call to s:function().
+Files: src/testdir/test_vim9_script.vim, src/testdir/Make_all.mak,
+ src/testdir/test_vim9_disassemble.vim, src/vim9compile.c,
+ src/userfunc.c, src/proto/userfunc.pro, src/vim.h
+
+Patch 8.2.0224
+Problem: compiling :elseif not tested yet.
+Solution: Add test for :elseif. Fix generating jumps.
+Files: src/testdir/test_vim9_script.vim, src/vim9compile.c,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0225
+Problem: compiling lambda not tested yet.
+Solution: Add test for lambda and funcref. Drop unused instruction arg.
+Files: src/testdir/test_vim9_disassemble.vim, src/vim9.h,
+ src/vim9execute.c
+
+Patch 8.2.0226
+Problem: Compiling for loop not tested.
+Solution: Add a test. Make variable initialization work for more types.
+Files: src/testdir/test_vim9_disassemble.vim, src/vim9compile.c
+
+Patch 8.2.0227
+Problem: Compiling a few instructions not tested.
+Solution: Add more test cases.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0228
+Problem: Configure does not recognize gcc version on BSD.
+Solution: Do not use "\+" in the pattern matching the version number. (Ozaki
+ Kiichi, closes #5590)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.0229
+Problem: Compare instructions not tested.
+Solution: Add test cases. Fix disassemble with line continuation.
+Files: src/testdir/test_vim9_disassemble.vim, src/vim9execute.c,
+ src/vim9compile.c
+
+Patch 8.2.0230
+Problem: Terminal popup test is flaky.
+Solution: Increase wait time a bit.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0231
+Problem: Silent system command may clear the screen.
+Solution: Do not clear the screen in t_te.
+Files: src/term.c
+
+Patch 8.2.0232
+Problem: The :compiler command causes a crash. (Daniel Steinberg)
+Solution: Do not use the script index if it isn't set.
+Files: src/ex_docmd.c, src/testdir/test_compiler.vim
+
+Patch 8.2.0233
+Problem: Crash when using garbagecollect() in between rand().
+Solution: Redesign the rand() and srand() implementation. (Yasuhiro
+ Matsumoto, closes #5587, closes #5588)
+Files: src/evalfunc.c, src/testdir/test_random.vim,
+ runtime/doc/testing.txt, runtime/doc/eval.txt
+
+Patch 8.2.0234
+Problem: Message test fails on SunOS.
+Solution: Adjust expectation for printf "%p". (Ozaki Kiichi, closes #5595)
+Files: src/message_test.c
+
+Patch 8.2.0235
+Problem: Draw error when an empty group is removed from 'statusline'.
+Solution: Do not use highlighting from a removed group.
+Files: src/buffer.c, src/testdir/test_statusline.vim,
+ src/testdir/dumps/Test_statusline_1.dump
+
+Patch 8.2.0236
+Problem: MS-Windows uninstall doesn't delete vimtutor.bat.
+Solution: Change directory before deletion. (Ken Takata, closes #5603)
+Files: src/uninstall.c
+
+Patch 8.2.0237
+Problem: Crash when setting 'wincolor' on finished terminal window.
+ (Bakudankun)
+Solution: Check that the vterm is not NULL. (Yasuhiro Matsumoto, closes
+ #5607, closes #5610)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.0238
+Problem: MS-Windows: job_stop() results in exit value zero.
+Solution: Call TerminateJobObject() with -1 instead of 0. (Yasuhiro
+ Matsumoto, closes #5150, closes #5614)
+Files: src/os_win32.c, src/testdir/test_channel.vim
+
+Patch 8.2.0239
+Problem: MS-Windows: 'env' job option does not override existing
+ environment variables. (Tim Pope)
+Solution: Set the environment variables later. (Yasuhiro Matsumoto,
+ closes #5485, closes #5608)
+Files: src/os_win32.c, src/testdir/test_channel.vim
+
+Patch 8.2.0240
+Problem: Using memory after it was freed. (Dominique Pellé)
+Solution: Do not mix conversion buffer with other buffer.
+Files: src/viminfo.c, src/vim.h
+
+Patch 8.2.0241
+Problem: Crash when setting 'buftype' to "quickfix".
+Solution: Check that error list is not NULL. (closes #5613)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.0242
+Problem: Preview popup window test fails with long directory name. (Jakub
+ Kądziołka)
+Solution: Use "silent cd". (closes #5615)
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.0243
+Problem: Insufficient code coverage for ex_docmd.c functions.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5618)
+Files: src/testdir/Make_all.mak, src/testdir/test_arglist.vim,
+ src/testdir/test_buffer.vim, src/testdir/test_cd.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_ex_mode.vim,
+ src/testdir/test_excmd.vim, src/testdir/test_mapping.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_search.vim,
+ src/testdir/test_sort.vim, src/testdir/test_source.vim,
+ src/testdir/test_substitute.vim, src/testdir/test_undo.vim,
+ src/testdir/test_vimscript.vim, src/testdir/test_window_cmd.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.0244
+Problem: Compiler warning in Lua interface.
+Solution: Add type cast. (Ken Takata, closes #5621)
+Files: src/if_lua.c
+
+Patch 8.2.0245
+Problem: MSVC: error message if the auto directory already exists.
+Solution: Add "if not exists". (Ken Takata, closes #5620)
+Files: src/Make_mvc.mak
+
+Patch 8.2.0246
+Problem: MSVC: deprecation warnings with Ruby.
+Solution: Move _CRT_SECURE_NO_DEPRECATE to build file. (Ken Takata,
+ closes #5622)
+Files: src/Make_mvc.mak, src/if_ruby.c, src/os_win32.h, src/vim.h,
+ src/vimio.h
+
+Patch 8.2.0247
+Problem: Misleading comment in NSIS installer script.
+Solution: Negate the meaning of the comment. (Ken Takata, closes #5627)
+Files: nsis/gvim.nsi
+
+Patch 8.2.0248
+Problem: MS-Windows: dealing with deprecation is too complicated.
+Solution: Use io.h directly. Move _CRT_SECURE_NO_DEPRECATE to the build
+ file. Suppress C4091 warning by setting "_WIN32_WINNT". (Ken
+ Takata, closes #5626)
+Files: src/Make_mvc.mak, src/dosinst.h, src/vim.h, src/vimio.h,
+ src/winclip.c, Filelist
+
+Patch 8.2.0249
+Problem: MS-Windows: various warnings.
+Solution: Set the charset to utf-8. Add _WIN32_WINNT and _USING_V110_SDK71_.
+ (Ken Takata, closes #5625)
+Files: src/GvimExt/Makefile, src/Make_mvc.mak
+
+Patch 8.2.0250
+Problem: test_clear_search_pat() is unused.
+Solution: Remove the function. (Yegappan Lakshmanan, closes #5624)
+Files: runtime/doc/eval.txt, runtime/doc/testing.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/proto/regexp.pro,
+ src/proto/search.pro, src/proto/testing.pro, src/regexp.c,
+ src/search.c, src/testdir/test_writefile.vim, src/testing.c
+
+Patch 8.2.0251
+Problem: A couple of function return types can be more specific.
+Solution: Use a better return type. (Ken Takata, closes #5629)
+Files: src/evalfunc.c, src/globals.h
+
+Patch 8.2.0252
+Problem: Windows compiler warns for using size_t.
+Solution: Change to int. (Mike Williams)
+Files: src/vim9compile.c
+
+Patch 8.2.0253
+Problem: Crash when using :disassemble without argument. (Dhiraj Mishra)
+Solution: Check for missing argument. (Dominique Pellé, closes #5635,
+ closes #5637)
+Files: src/vim9execute.c, src/testdir/test_vim9_disassemble.vim,
+ src/ex_cmds.h
+
+Patch 8.2.0254
+Problem: Compiler warning for checking size_t to be negative.
+Solution: Only check for zero. (Zoltan Arpadffy)
+Files: src/vim9compile.c
+
+Patch 8.2.0255
+Problem: VMS: missing files in build.
+Solution: Add the files. (Zoltan Arpadffy)
+Files: src/Make_vms.mms
+
+Patch 8.2.0256
+Problem: Time and timer related code is spread out.
+Solution: Move time and timer related code to a new file. (Yegappan
+ Lakshmanan, closes #5604)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_cmds2.c, src/main.c,
+ src/memline.c, src/misc1.c, src/misc2.c, src/proto.h,
+ src/proto/ex_cmds.pro, src/proto/ex_cmds2.pro, src/proto/main.pro,
+ src/proto/memline.pro, src/proto/misc1.pro, src/proto/misc2.pro,
+ src/proto/time.pro, src/time.c
+
+Patch 8.2.0257
+Problem: Cannot recognize a terminal in a popup window.
+Solution: Add the win_gettype() function.
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/evalwindow.c,
+ src/proto/evalwindow.pro, src/testdir/test_cmdline.vim,
+ src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_popup_1.dump
+
+Patch 8.2.0258
+Problem: ModifyOtherKeys cannot be temporarily disabled.
+Solution: Add echoraw() with an example for modifyOtherKeys.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim,
+ src/testdir/dumps/Test_functions_echoraw.dump
+
+Patch 8.2.0259
+Problem: Terminal in popup test sometimes fails.
+Solution: Clear the command line.
+Files: src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_popup_1.dump
+
+Patch 8.2.0260
+Problem: Several lines of code are duplicated.
+Solution: Move duplicated code to a function. (Yegappan Lakshmanan,
+ closes #5330)
+Files: src/option.c, src/os_unix.c, src/os_win32.c, src/proto/term.pro,
+ src/quickfix.c, src/regexp.c, src/regexp_bt.c, src/regexp_nfa.c,
+ src/term.c
+
+Patch 8.2.0261
+Problem: Some code not covered by tests.
+Solution: Add test cases. (Yegappan Lakshmanan, closes #5645)
+Files: src/testdir/test_buffer.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_exists.vim, src/testdir/test_filechanged.vim,
+ src/testdir/test_fileformat.vim, src/testdir/test_mapping.vim,
+ src/testdir/test_marks.vim, src/testdir/test_normal.vim,
+ src/testdir/test_plus_arg_edit.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_tabpage.vim, src/testdir/test_visual.vim,
+ src/testdir/test_window_cmd.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.0262 (after 8.2.0261)
+Problem: Fileformat test fails on MS-Windows.
+Solution: Set fileformat of buffer.
+Files: src/testdir/test_fileformat.vim
+
+Patch 8.2.0263
+Problem: A few new Vim9 messages are not localized.
+Solution: Add the gettext wrapper. (Dominique Pellé, closes #5647)
+Files: src/vim9compile.c, src/vim9execute.c
+
+Patch 8.2.0264 (after 8.2.0262)
+Problem: Fileformat test still fails on MS-Windows.
+Solution: Set fileformat of buffer in the right place.
+Files: src/testdir/test_fileformat.vim
+
+Patch 8.2.0265
+Problem: "eval" after "if 0" doesn't check for following command.
+Solution: Add "eval" to list of commands that check for a following command.
+ (closes #5640)
+Files: src/ex_docmd.c, src/testdir/test_expr.vim
+
+Patch 8.2.0266
+Problem: Terminal in popup test sometimes fails on Mac.
+Solution: Add a short delay.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0267
+Problem: No check for a following command when calling a function fails.
+Solution: Also check for a following command when inside a try block.
+ (closes #5642)
+Files: src/userfunc.c, src/testdir/test_user_func.vim
+
+Patch 8.2.0268 (after 8.2.0267)
+Problem: Trycatch test fails.
+Solution: When calling function fails only check for following command, do
+ not give another error.
+Files: src/userfunc.c
+
+Patch 8.2.0269
+Problem: Vim9: operator after list index does not work. (Yasuhiro
+ Matsumoto)
+Solution: After indexing a list change the type to the list member type.
+ (closes #5651)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0270
+Problem: Some code not covered by tests.
+Solution: Add test cases. (Yegappan Lakshmanan, closes #5649)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_buffer.vim,
+ src/testdir/test_edit.vim, src/testdir/test_ex_mode.vim,
+ src/testdir/test_excmd.vim, src/testdir/test_expand.vim,
+ src/testdir/test_filetype.vim, src/testdir/test_findfile.vim,
+ src/testdir/test_join.vim, src/testdir/test_move.vim,
+ src/testdir/test_normal.vim, src/testdir/test_registers.vim,
+ src/testdir/test_source.vim, src/testdir/test_tabpage.vim,
+ src/testdir/test_tagjump.vim, src/testdir/test_vimscript.vim,
+ src/testdir/test_visual.vim, src/testdir/test_window_cmd.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.0271
+Problem: The "num64" feature is available everywhere and building without
+ it causes problems.
+Solution: Graduate the "num64" feature. (James McCoy, closes #5650)
+Files: src/evalfunc.c, src/feature.h, src/message.c, src/structs.h,
+ src/testdir/test_expr.vim, src/testdir/test_largefile.vim,
+ src/testdir/test_sort.vim, src/testdir/test_vimscript.vim,
+ src/version.c
+
+Patch 8.2.0272
+Problem: ":helptags ALL" gives error for directories without write
+ permission. (Matěj Cepl)
+Solution: Ignore errors for ":helptags ALL". (Ken Takata, closes #5026,
+ closes #5652)
+Files: src/ex_cmds.c, src/testdir/test_help.vim
+
+Patch 8.2.0273
+Problem: MS-Windows uninstall may delete wrong batch file.
+Solution: Add specific marker in the generated batch file. (Ken Takata,
+ closes #5654)
+Files: src/Make_mvc.mak, src/dosinst.c, src/dosinst.h, src/uninstall.c
+
+Patch 8.2.0274
+Problem: Hang with combination of feedkeys(), Ex mode and :global.
+ (Yegappan Lakshmanan)
+Solution: Add the pending_exmode_active flag.
+Files: src/ex_docmd.c, src/globals.h, src/getchar.c,
+ src/testdir/test_ex_mode.vim
+
+Patch 8.2.0275
+Problem: Some Ex code not covered by tests.
+Solution: Add test cases. (Yegappan Lakshmanan, closes #5659)
+Files: src/testdir/test_arglist.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_excmd.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_search.vim, src/testdir/test_swap.vim,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.2.0276
+Problem: Vim9: not allowing space before ")" in function call is too
+ restrictive. (Ben Jackson)
+Solution: Skip space before the ")". Adjust other space checks.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0277
+Problem: Vim9: not all instructions covered by tests.
+Solution: Add more test cases.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0278
+Problem: Channel test is flaky on Mac.
+Solution: Reset variable before sending message.
+Files: src/testdir/test_channel.vim
+
+Patch 8.2.0279
+Problem: Vim9: no test for deleted :def function.
+Solution: Add a test. Clear uf_cleared flag when redefining a function.
+Files: src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0280
+Problem: Vim9: throw in :def function not caught higher up.
+Solution: Set "need_rethrow".
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0281
+Problem: Two placed signs in the same line are not combined. E.g. in the
+ terminal debugger a breakpoint and the PC cannot be both be
+ displayed.
+Solution: Combine the sign column and line highlight attributes.
+Files: src/sign.c, src/testdir/test_signs.vim,
+ src/testdir/dumps/Test_sign_cursor_3.dump,
+ src/testdir/dumps/Test_sign_cursor_4.dump
+
+Patch 8.2.0282
+Problem: Vim9: setting number option not tested.
+Solution: Add more tests. Fix assigning to global variable.
+Files: src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim,
+ src/vim9execute.c
+
+Patch 8.2.0283
+Problem: Vim9: failing to load script var not tested.
+Solution: Add more tests. Fix using s: in old script.
+Files: src/testdir/test_vim9_expr.vim, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0284
+Problem: Vim9: assignment test fails.
+Solution: Avoid duplicating "s:".
+Files: src/vim9compile.c
+
+Patch 8.2.0285
+Problem: Unused error message. Cannot create s:var.
+Solution: Remove the error message. Make assignment to s:var work.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0286
+Problem: Cannot use popup_close() for a terminal popup.
+Solution: Allow using popup_close(). (closes #5666)
+Files: src/popupwin.c, runtime/doc/popup.txt,
+ src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_popup_5.dump,
+ src/testdir/dumps/Test_terminal_popup_6.dump
+
+Patch 8.2.0287
+Problem: Vim9: return in try block not tested; catch with pattern not
+ tested.
+Solution: Add tests. Make it work.
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0288
+Problem: Vim9: some float and blob operators not tested.
+Solution: Add float and blob tests. Fix addition.
+Files: src/testdir/test_vim9_expr.vim, src/vim9compile.c
+
+Patch 8.2.0289
+Problem: Vim9: :echo did not clear the rest of the line.
+Solution: Call msg_clr_eos(). (Ken Takata, closes #5668)
+Files: src/vim9execute.c
+
+Patch 8.2.0290
+Problem: Running individual test differs from all tests.
+Solution: Pass on environment variables. (Yee Cheng Chin, closes #5672)
+Files: src/testdir/Makefile, src/testdir/README.txt
+
+Patch 8.2.0291
+Problem: Vim9: assigning [] to list<string> doesn't work.
+Solution: Use void for empty list and dict. (Ken Takata, closes #5669)
+Files: src/vim9compile.c, src/globals.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0292
+Problem: Vim9: CHECKNR and CHECKTYPE instructions not tested.
+Solution: Add tests.
+Files: src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0293
+Problem: Various Ex commands not sufficiently tested.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #5673)
+Files: src/testdir/test_arglist.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_ex_mode.vim, src/testdir/test_excmd.vim,
+ src/testdir/test_expand.vim, src/testdir/test_filetype.vim,
+ src/testdir/test_filter_cmd.vim, src/testdir/test_global.vim,
+ src/testdir/test_normal.vim, src/testdir/test_plus_arg_edit.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_trycatch.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.0294
+Problem: Cannot use Ex command that is also a function name.
+Solution: Recognize an Ex command by a colon prefix.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim,
+ runtime/doc/vim9.txt
+
+Patch 8.2.0295
+Problem: Highlighting for :s wrong when using different separator.
+Solution: Use separate argument for search direction and separator. (Rob
+ Pilling, closes #5665)
+Files: src/ex_docmd.c, src/ex_getln.c, src/gui.c, src/normal.c,
+ src/proto/search.pro, src/quickfix.c, src/search.c, src/spell.c,
+ src/tag.c, src/testdir/dumps/Test_incsearch_substitute_15.dump,
+ src/testdir/test_search.vim
+
+Patch 8.2.0296
+Problem: Mixing up "long long" and __int64 may cause problems. (John
+ Marriott)
+Solution: Pass varnumber_T to vim_snprintf(). Add v:numbersize.
+Files: src/message.c, src/eval.c, src/fileio.c, src/json.c, src/ops.c,
+ src/vim.h, src/structs.h, src/evalvars.c, runtime/doc/eval.txt,
+ runtime/doc/various.txt, src/testdir/test_eval_stuff.vim
+
+Patch 8.2.0297
+Problem: Compiler warnings for the Ruby interface.
+Solution: Undefine a few macros, fix initialization. (Ozaki Kiichi,
+ closes #5677)
+Files: src/if_ruby.c
+
+Patch 8.2.0298
+Problem: Vim9 script: cannot start command with a string constant.
+Solution: Recognize expression starting with '('.
+Files: src/ex_docmd.c, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim, runtime/doc/vim9.txt
+
+Patch 8.2.0299
+Problem: Vim9: ISN_STORE with argument not tested. Some cases in tv2bool()
+ not tested.
+Solution: Add tests. Add test_unknown() and test_void().
+Files: src/testing.c, src/proto/testing.pro, src/evalfunc.c,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, runtime/doc/eval.txt,
+ runtime/doc/testing.txt
+
+Patch 8.2.0300
+Problem: Vim9: expression test fails without channel support.
+Solution: Add has('channel') check.
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0301
+Problem: Insufficient testing for exception handling and the "attention"
+ prompt.
+Solution: Add test cases. (Yegappan Lakshmanan, closes #5681)
+Files: src/testdir/test_swap.vim, src/testdir/test_trycatch.vim
+
+Patch 8.2.0302
+Problem: Setting 'term' may cause error in TermChanged autocommand.
+Solution: Use aucmd_prepbuf() to switch to the buffer where the autocommand
+ is to be executed. (closes #5682)
+Files: src/term.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.0303
+Problem: TermChanged test fails in the GUI.
+Solution: Skip the test when running the GUI.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.0304
+Problem: Terminal test if failing on some systems.
+Solution: Wait for the job to finish. (James McCoy)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0305
+Problem: Relativenumber test fails on some systems. (James McCoy)
+Solution: Clear the command line.
+Files: src/testdir/test_number.vim,
+ src/testdir/dumps/Test_relnr_colors_2.dump,
+ src/testdir/dumps/Test_relnr_colors_3.dump
+
+Patch 8.2.0306
+Problem: Vim9: :substitute(pat(repl does not work in Vim9 script.
+Solution: Remember starting with a colon. (closes #5676)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0307
+Problem: Python 3 vim.eval not well tested.
+Solution: Add a test. (Dominique Pellé, closes #5680)
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.0308
+Problem: 'showbreak' does not work for a very long line. (John Little)
+Solution: Check whether 'briopt' contains "sbr". (Ken Takata, closes #5523,
+ closes #5684)
+Files: src/drawline.c, src/testdir/test_breakindent.vim
+
+Patch 8.2.0309
+Problem: Window-local values have confusing name.
+Solution: Rename w_p_bri* to w_briopt_*.
+Files: src/structs.h, src/indent.c, src/drawline.c
+
+Patch 8.2.0310
+Problem: Autocmd test fails on a slow system.
+Solution: Adjust the expectations. (James McCoy, closes #5685)
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.0311
+Problem: Vim9: insufficient script tests.
+Solution: Add tests. Free imports when re-using a script.
+Files: src/testdir/test_vim9_script.vim, src/scriptfile.c
+
+Patch 8.2.0312
+Problem: Vim9: insufficient script tests.
+Solution: Add more tests. Make "import * as Name" work.
+Files: src/testdir/test_vim9_script.vim, src/vim9script.c,
+ src/proto/vim9script.pro, src/vim9compile.c
+
+Patch 8.2.0313
+Problem: Vim9: insufficient script tests.
+Solution: Add tests. Make import of alphanumeric name work.
+Files: src/testdir/test_vim9_script.vim, src/vim9script.c
+
+Patch 8.2.0314
+Problem: Short name not set for terminal buffer.
+Solution: Set the short name. (closes #5687)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.0315
+Problem: Build failure on HP-UX system.
+Solution: Use LONG_LONG_MIN instead of LLONG_MIN. Add type casts for switch
+ statement. (John Marriott)
+Files: src/structs.h, src/json.c
+
+Patch 8.2.0316
+Problem: ex_getln.c code has insufficient test coverage.
+Solution: Add more tests. Fix a problem. (Yegappan Lakshmanan, closes #5693)
+Files: src/cmdhist.c, src/testdir/test_cmdline.vim,
+ src/testdir/test_functions.vim, src/testdir/test_history.vim,
+ src/testdir/test_menu.vim
+
+Patch 8.2.0317
+Problem: MSVC: _CRT_SECURE_NO_DEPRECATE not defined on DEBUG build.
+Solution: Move where CFLAGS is updated. (Ken Takata, closes #5692)
+Files: src/Make_mvc.mak
+
+Patch 8.2.0318
+Problem: Vim9: types not sufficiently tested.
+Solution: Add tests with more types.
+Files: src/globals.h, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0319
+Problem: File missing in distribution, comments outdated.
+Solution: Correct path of README file. Update comments.
+Files: Filelist, src/evalvars.c, src/register.c, src/if_python3.c
+
+Patch 8.2.0320
+Problem: No Haiku support.
+Solution: Add support for Haiku. (Emir Sarı, closes #5605)
+Files: Filelist, runtime/doc/Makefile, runtime/doc/eval.txt,
+ runtime/doc/gui.txt, runtime/doc/help.txt,
+ runtime/doc/options.txt, runtime/doc/os_haiku.txt,
+ runtime/doc/starting.txt, runtime/doc/tags,
+ runtime/gvimrc_example.vim, runtime/vimrc_example.vim,
+ src/INSTALL, src/Makefile, src/auto/configure, src/configure.ac,
+ src/evalfunc.c, src/feature.h, src/fileio.c, src/globals.h,
+ src/gui.c, src/gui.h, src/gui_haiku.cc, src/gui_haiku.h,
+ src/mbyte.c, src/menu.c, src/misc1.c, src/mouse.c, src/option.h,
+ src/os_haiku.h, src/os_haiku.rdef, src/os_unix.c, src/os_unix.h,
+ src/osdef1.h.in, src/proto.h, src/proto/gui_haiku.pro, src/pty.c,
+ src/screen.c, src/structs.h, src/term.c, src/version.c, src/vim.h
+
+Patch 8.2.0321
+Problem: Vim9: ":execute" does not work yet.
+Solution: Add ISN_EXECUTE. (closes #5699) Also make :echo work with more
+ than one argument.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0322
+Problem: Vim9: error checks not tested.
+Solution: Add more test cases. Avoid error for function loaded later.
+Files: src/vim9compile.c, src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0323
+Problem: Vim9: calling a function that is defined later is slow.
+Solution: Once the function is found update the instruction so it can be
+ called directly.
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0324
+Problem: Text property not updated correctly when inserting/deleting.
+Solution: Use the right column when deleting. Make zero-width text
+ properties respect start_incl and end_incl. (Axel Forsman,
+ closes #5696, closes #5679)
+Files: src/change.c, src/textprop.c, src/testdir/test_listener.vim,
+ src/testdir/test_textprop.vim
+
+Patch 8.2.0325
+Problem: Ex_getln.c code not covered by tests.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #5702)
+Files: src/testdir/test_cmdline.vim, src/testdir/test_ex_mode.vim,
+ src/testdir/test_functions.vim, src/testdir/test_history.vim,
+ src/testdir/test_options.vim
+
+Patch 8.2.0326
+Problem: Compiler warning for using uninitialized variable. (Yegappan
+ Lakshmanan)
+Solution: Do not jump to failed but return.
+Files: src/vim9execute.c
+
+Patch 8.2.0327
+Problem: Crash when opening and closing two popup terminal windows.
+Solution: Check that prevwin is valid. (closes #5707)
+Files: src/popupwin.c, src/testdir/test_terminal.vim
+
+Patch 8.2.0328
+Problem: No redraw when leaving terminal-normal mode in a terminal popup
+ window.
+Solution: Redraw the popup window. (closes #5708)
+Files: src/macros.h, src/vim.h, src/terminal.c, src/drawscreen.c,
+ src/move.c, src/popupwin.c, src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_popup_7.dump,
+ src/testdir/dumps/Test_terminal_popup_8.dump
+
+Patch 8.2.0329
+Problem: Popup filter converts 0x80 bytes.
+Solution: Keep 0x80 bytes as-is. (Ozaki Kiichi, closes #5706)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.0330
+Problem: Build error with popup window but without terminal.
+Solution: Add #ifdef.
+Files: src/popupwin.c
+
+Patch 8.2.0331
+Problem: Internal error when using test_void() and test_unknown().
+ (Dominique Pellé)
+Solution: Give a normal error.
+Files: src/evalfunc.c, src/testdir/test_functions.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.0332
+Problem: Some code in ex_getln.c not covered by tests.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #5710)
+Files: src/testdir/test_arabic.vim, src/testdir/test_cmdline.vim
+
+Patch 8.2.0333
+Problem: Terminal in popup test is flaky.
+Solution: Make sure redraw is done before opening the popup.
+Files: src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_popup_1.dump
+
+Patch 8.2.0334
+Problem: Abort called when using test_void(). (Dominique Pellé)
+Solution: Only give an error, don't abort.
+Files: src/message.c, src/proto/message.pro, src/evalfunc.c,
+ src/eval.c, src/json.c, src/testdir/test_functions.vim
+
+Patch 8.2.0335
+Problem: No completion for :disassemble.
+Solution: Make completion work. Also complete script-local functions if the
+ name starts with "s:".
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim,
+ runtime/doc/vim9.txt
+
+Patch 8.2.0336
+Problem: Vim9: insufficient test coverage for compiling.
+Solution: Add more tests.
+Files: src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim,
+ src/vim9.h, src/vim9compile.c, src/vim9execute.c
+
+Patch 8.2.0337
+Problem: Build fails on a few systems.
+Solution: Use vim_snprintf() instead of snprintf().
+Files: src/cmdexpand.c
+
+Patch 8.2.0338
+Problem: Build failure without the channel feature.
+Solution: Add #ifdef
+Files: src/vim9compile.c
+
+Patch 8.2.0339
+Problem: Vim9: function return type may depend on arguments.
+Solution: Instead of a fixed return type use a function to figure out the
+ return type.
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/vim9compile.c,
+ src/evalbuffer.c, src/proto/evalbuffer.pro,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0340
+Problem: Vim9: function and partial types not tested.
+Solution: Support more for partial, add tests.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0341
+Problem: Using ":for" in Vim9 script gives an error.
+Solution: Pass the LET_NO_COMMAND flag. (closes #5715)
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0342
+Problem: Some code in ex_getln.c not covered by tests.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5717)
+Files: src/testdir/test_cmdline.vim, src/testdir/test_ex_mode.vim,
+ src/testdir/test_history.vim, src/testdir/test_iminsert.vim
+
+Patch 8.2.0343
+Problem: Vim9: using wrong instruction, limited test coverage.
+Solution: Use ISN_PUSHJOB. Add a few more tests.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0344
+Problem: ":def" not skipped properly.
+Solution: Add CMD_def to list of commands the require evaluation even when
+ not being executed.
+Files: src/ex_docmd.c
+
+Patch 8.2.0345
+Problem: Compiler warning when building without the float feature.
+Solution: Add #ifdef. (John Marriott)
+Files: src/evalfunc.c
+
+Patch 8.2.0346
+Problem: Vim9: finding common list type not tested.
+Solution: Add more tests. Fix listing function. Fix overwriting type.
+Files: src/vim9compile.c, src/userfunc.c,
+ src/testdir/test_vim9_script.vim, src/testdir/runtest.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0347
+Problem: Various code not covered by tests.
+Solution: Add more test coverage. (Yegappan Lakshmanan, closes #5720)
+Files: src/testdir/gen_opt_test.vim, src/testdir/test86.in,
+ src/testdir/test_cmdline.vim, src/testdir/test_digraph.vim,
+ src/testdir/test_ex_mode.vim, src/testdir/test_history.vim
+
+Patch 8.2.0348
+Problem: Vim9: not all code tested.
+Solution: Add a few more tests. fix using "b:" in literal dictionary.
+Files: src/testdir/test_vim9_expr.vim, src/vim9compile.c,
+ src/proto/vim9compile.pro, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0349
+Problem: Vim9: constant expression not well tested.
+Solution: Add tests for "if" with constant expression.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0350
+Problem: Vim9: expression tests don't use recognized constants.
+Solution: Recognize "true" and "false" as constants. Make skipping work for
+ assignment and expression evaluation.
+Files: src/vim9compile.c
+
+Patch 8.2.0351
+Problem: Terminal in popup test is still a bit flaky.
+Solution: Clear and redraw before opening the popup.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0352
+Problem: FreeBSD: test for sourcing utf-8 is skipped.
+Solution: Run the matchadd_conceal test separately to avoid that setting
+ 'term' to "ansi" causes problems for other tests. (Ozaki Kiichi,
+ closes #5721)
+Files: src/testdir/Make_all.mak, src/testdir/test_alot_utf8.vim,
+ src/testdir/test_source_utf8.vim
+
+Patch 8.2.0353
+Problem: Vim9: while loop not tested.
+Solution: Add test with "while", "break" and "continue"
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0354
+Problem: Python 3.9 does not define _Py_DEC_REFTOTAL. (Zdenek Dohnal)
+Solution: Remove it, it was only for debugging.
+Files: src/if_python3.c
+
+Patch 8.2.0355
+Problem: Vim9: str_val is confusing, it's a number
+Solution: Rename to stnr_val.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c
+
+Patch 8.2.0356
+Problem: MS-Windows: feedkeys() with VIMDLL cannot handle CSI correctly.
+Solution: Modify mch_inchar() to encode CSI bytes. (Ozaki Kiichi, Ken
+ Takata, closes #5726)
+Files: src/getchar.c, src/os_win32.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.0357
+Problem: Cannot delete a text property matching both id and type. (Axel
+ Forsman)
+Solution: Add the "both" argument.
+Files: src/textprop.c, runtime/doc/textprop.txt,
+ src/testdir/test_textprop.vim
+
+Patch 8.2.0358
+Problem: Insufficient testing for indent.c.
+Solution: Add indent tests. (Yegappan Lakshmanan, closes #5736)
+Files: src/testdir/Make_all.mak, src/testdir/test_ex_mode.vim,
+ src/testdir/test_expand_func.vim, src/testdir/test_indent.vim,
+ src/testdir/test_lispwords.vim, src/testdir/test_smartindent.vim,
+ src/testdir/test_vartabs.vim
+
+Patch 8.2.0359
+Problem: popup_atcursor() may hang. (Yasuhiro Matsumoto)
+Solution: Take the decoration into account. (closes #5728)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.0360
+Problem: Yaml files are only recognized by the file extension.
+Solution: Check for a line starting with "%YAML". (Jason Franklin)
+Files: runtime/scripts.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0361
+Problem: Internal error when using "0" for a callback.
+Solution: Give a normal error. (closes #5743)
+Files: src/evalvars.c, src/testdir/test_timers.vim
+
+Patch 8.2.0362
+Problem: MS-Windows: channel test fails if grep is not available.
+Solution: Use another command. (Ken Takata, closes #5739)
+Files: src/testdir/test_channel.vim
+
+Patch 8.2.0363
+Problem: Some Normal mode commands not tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5746)
+Files: src/testdir/test_cindent.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_edit.vim, src/testdir/test_indent.vim,
+ src/testdir/test_normal.vim, src/testdir/test_prompt_buffer.vim,
+ src/testdir/test_virtualedit.vim, src/testdir/test_visual.vim
+
+Patch 8.2.0364
+Problem: Printf test failing on Haiku.
+Solution: Make a difference between int and short. (Dominique Pellé,
+ closes #5749)
+Files: src/message.c
+
+Patch 8.2.0365
+Problem: Tag kind can't be a multibyte character. (Marcin Szamotulski)
+Solution: Recognize multibyte character. (closes #5724)
+Files: src/tag.c, src/testdir/test_taglist.vim
+
+Patch 8.2.0366
+Problem: Hardcopy command not tested enough.
+Solution: Add tests for printing. (Dominique Pellé, closes #5748)
+Files: src/testdir/test_hardcopy.vim
+
+Patch 8.2.0367
+Problem: Can use :pedit in a popup window.
+Solution: Disallow it.
+Files: src/ex_docmd.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.0368
+Problem: Vim9: import that redefines local variable does not fail.
+Solution: Check for already defined symbols.
+Files: src/vim9script.c, src/proto/vim9script.pro, src/vim9compile.c,
+ src/proto/vim9compile.pro, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0369
+Problem: Various Normal mode commands not fully tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5751)
+Files: src/testdir/test_arglist.vim, src/testdir/test_changelist.vim,
+ src/testdir/test_charsearch.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_edit.vim, src/testdir/test_ex_mode.vim,
+ src/testdir/test_excmd.vim, src/testdir/test_gf.vim,
+ src/testdir/test_iminsert.vim, src/testdir/test_increment.vim,
+ src/testdir/test_marks.vim, src/testdir/test_normal.vim,
+ src/testdir/test_prompt_buffer.vim, src/testdir/test_put.vim,
+ src/testdir/test_registers.vim, src/testdir/test_tagjump.vim,
+ src/testdir/test_visual.vim
+
+Patch 8.2.0370
+Problem: The typebuf_was_filled flag is sometimes not reset, which may
+ cause a hang.
+Solution: Make sure typebuf_was_filled is reset when the typeahead buffer is
+ empty.
+Files: src/edit.c, src/getchar.c,
+
+Patch 8.2.0371
+Problem: Crash with combination of terminal popup and autocmd.
+Solution: Disallow closing a popup that is the current window. Add a check
+ that the current buffer is valid. (closes #5754)
+Files: src/macros.h, src/buffer.c, src/popupwin.c, src/terminal.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.2.0372
+Problem: Prop_find() may not find text property at start of the line.
+Solution: Adjust the loop to find properties. (Axel Forsman, closes #5761,
+ closes #5663)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.0373
+Problem: Type of term_sendkeys() is unknown.
+Solution: Just return zero. (closes #5762)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.0374
+Problem: Using wrong printf directive for jump location.
+Solution: Change "%lld" to "%d". (James McCoy, closes #5773)
+Files: src/vim9execute.c
+
+Patch 8.2.0375
+Problem: Coverity warning for not using return value.
+Solution: Move error message to separate function.
+Files: src/popupwin.c
+
+Patch 8.2.0376
+Problem: Nasty callback test fails on some systems.
+Solution: Increase the sleep time.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0377
+Problem: No CI test for a big-endian system.
+Solution: Test with s390x. (James McCoy, closes #5772)
+Files: .travis.yml
+
+Patch 8.2.0378
+Problem: prop_find() does not find all props.
+Solution: Check being in the start line. (Axel Forsman, closes #5776)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.0379
+Problem: Gcc warns for ambiguous else.
+Solution: Add braces. (Dominique Pellé, closes #5778)
+Files: src/textprop.c
+
+Patch 8.2.0380
+Problem: Tiny popup when creating a terminal popup without minwidth.
+Solution: Use a default minimum size of 5 lines of 20 characters.
+Files: src/popupwin.c, src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_popup_m1.dump
+
+Patch 8.2.0381
+Problem: Using freed memory with :lvimgrep and autocommand. (extracted from
+ POC by Dominique Pellé)
+Solution: Avoid deleting a dummy buffer used in a window. (closes #5777)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.0382
+Problem: Some tests fail when run under valgrind.
+Solution: Increase timeouts.
+Files: src/testdir/test_autocmd.vim, src/testdir/test_debugger.vim,
+ src/testdir/test_channel.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_popup_1.dump,
+ src/testdir/dumps/Test_terminal_popup_2.dump,
+ src/testdir/dumps/Test_terminal_popup_3.dump,
+ src/testdir/dumps/Test_terminal_popup_5.dump,
+ src/testdir/dumps/Test_terminal_popup_6.dump,
+ src/testdir/dumps/Test_terminal_popup_7.dump,
+ src/testdir/dumps/Test_terminal_popup_8.dump,
+ src/testdir/dumps/Test_terminal_popup_m1.dump
+
+Patch 8.2.0383
+Problem: Wrong feature check causes test not to be run.
+Solution: Use CheckFunction instead of CheckFeature. (Ozaki Kiichi,
+ closes #5781)
+Files: src/testdir/test_channel.vim
+
+Patch 8.2.0384
+Problem: Travis CI has warnings.
+Solution: Avoid warnings, clean up the config. (Ozaki Kiichi, closes #5779)
+Files: .travis.yml
+
+Patch 8.2.0385
+Problem: Menu functionality insufficiently tested.
+Solution: Add tests. Add menu_info(). (Yegappan Lakshmanan, closes #5760)
+Files: runtime/doc/eval.txt, runtime/doc/gui.txt, runtime/doc/usr_41.txt,
+ src/evalfunc.c, src/menu.c, src/proto/menu.pro,
+ src/testdir/test_menu.vim, src/testdir/test_popup.vim,
+ src/testdir/test_termcodes.vim
+
+Patch 8.2.0386 (after 8.2.0385)
+Problem: Part from unfinished patch got included.
+Solution: Undo that part.
+Files: src/evalfunc.c
+
+Patch 8.2.0387
+Problem: Error for possible NULL argument to qsort().
+Solution: Don't call qsort() when there is nothing to sort. (Dominique
+ Pellé, closes #5780)
+Files: src/spellsuggest.c
+
+Patch 8.2.0388
+Problem: Printmbcharset option not tested.
+Solution: Add a test. Enable PostScript for AppVeyor build. (Dominique
+ Pellé, closes #5783)
+Files: appveyor.yml, src/testdir/test_hardcopy.vim
+
+Patch 8.2.0389
+Problem: Delayed redraw when shifting text from Insert mode.
+Solution: Use msg_attr_keep() instead of msg(). (closes #5782)
+Files: src/ops.c
+
+Patch 8.2.0390
+Problem: Terminal postponed scrollback test is flaky.
+Solution: Add delay in between sending keys. Rename dump files.
+Files: src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_01.dump,
+ src/testdir/dumps/Test_terminal_02.dump,
+ src/testdir/dumps/Test_terminal_03.dump,
+ src/testdir/dumps/Test_terminal_scrollback_1.dump,
+ src/testdir/dumps/Test_terminal_scrollback_2.dump,
+ src/testdir/dumps/Test_terminal_scrollback_3.dump
+
+Patch 8.2.0391 (after 8.2.0377)
+Problem: CI test coverage dropped.
+Solution: Set $DISPLAY also for non-GUI builds. (James McCoy, closes #5788)
+Files: .travis.yml
+
+Patch 8.2.0392
+Problem: Coverity warns for using array index out of range.
+Solution: Add extra "if" to avoid warning.
+Files: src/menu.c
+
+Patch 8.2.0393
+Problem: Coverity warns for not using return value.
+Solution: Add (void).
+Files: src/popupmenu.c
+
+Patch 8.2.0394
+Problem: Coverity complains about using NULL pointer.
+Solution: Use empty string when option value is NULL.
+Files: src/optionstr.c
+
+Patch 8.2.0395
+Problem: Build fails with FEAT_EVAL but without FEAT_MENU.
+Solution: Add #ifdef. (John Marriott)
+Files: src/evalfunc.c
+
+Patch 8.2.0396
+Problem: Cmdexpand.c insufficiently tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5789)
+Files: src/testdir/test_cmdline.vim, src/testdir/test_taglist.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_usercommands.vim
+
+Patch 8.2.0397
+Problem: Delayed screen update when using undo from Insert mode.
+Solution: Update w_topline and cursor shape before sleeping. (closes #5790)
+Files: src/normal.c
+
+Patch 8.2.0398
+Problem: Profile test fails when two functions take same time.
+Solution: Add a short sleep in once function. (closes #5797)
+Files: src/testdir/test_profile.vim
+
+Patch 8.2.0399
+Problem: Various memory leaks.
+Solution: Avoid the leaks. (Ozaki Kiichi, closes #5803)
+Files: src/ex_docmd.c, src/ex_getln.c, src/menu.c, src/message.c,
+ src/scriptfile.c, src/userfunc.c
+
+Patch 8.2.0400
+Problem: Not all tests using a terminal are in the list of flaky tests.
+Solution: Introduce the test_is_flaky flag.
+Files: src/testdir/runtest.vim, src/testdir/term_util.vim,
+ src/testdir/screendump.vim, src/testdir/test_autocmd.vim
+
+Patch 8.2.0401
+Problem: Not enough test coverage for evalvars.c.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5804)
+Files: src/testdir/test_cmdline.vim, src/testdir/test_const.vim,
+ src/testdir/test_diffmode.vim, src/testdir/test_excmd.vim,
+ src/testdir/test_functions.vim, src/testdir/test_let.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_spell.vim,
+ src/testdir/test_unlet.vim, src/testdir/test_user_func.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.0402 (after 8.2.0401)
+Problem: Setting local instead of global flag.
+Solution: Prepend "g:" to "test_is_flaky".
+Files: src/testdir/term_util.vim, src/testdir/screendump.vim,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.0403
+Problem: When 'buftype' is "nofile" there is no overwrite check.
+Solution: Also check for existing file when 'buftype' is set.
+ (closes #5807)
+Files: src/ex_cmds.c, src/testdir/test_options.vim
+
+Patch 8.2.0404
+Problem: Writefile() error does not give a hint.
+Solution: Add remark about first argument.
+Files: src/filepath.c, src/testdir/test_writefile.vim
+
+Patch 8.2.0405
+Problem: MSVC: build fails with some combination of features.
+Solution: Enable CHANNEL if TERMINAL is enabled. (Mike Williams)
+Files: src/Make_mvc.mak
+
+Patch 8.2.0406
+Problem: FileReadCmd event not well tested.
+Solution: Add a test.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.0407
+Problem: No early check if :find and :sfind have an argument.
+Solution: Add EX_NEEDARG.
+Files: src/ex_cmds.h, src/testdir/test_findfile.vim,
+ src/testdir/test_find_complete.vim
+
+Patch 8.2.0408
+Problem: Delete() commented out for testing.
+Solution: Undo commenting-out.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0409
+Problem: Search test leaves file behind.
+Solution: Delete the file. Also use Check commands.
+Files: src/testdir/test_search.vim
+
+Patch 8.2.0410
+Problem: Channel test fails too often on slow Mac.
+Solution: Increase waiting time to 10 seconds.
+Files: src/testdir/test_channel.vim
+
+Patch 8.2.0411
+Problem: Mac: breakcheck is using a value from the stone ages.
+Solution: Delete BREAKCHECK_SKIP from the Mac header file. (Ben Jackson)
+Files: src/os_mac.h
+
+Patch 8.2.0412
+Problem: MS-Windows: cannot use vimtutor from the start menu.
+Solution: Better check for writable directory. Use the right path for the
+ executable. (Wu Yongwei, closes #5774, closes #5756)
+Files: vimtutor.bat
+
+Patch 8.2.0413
+Problem: Buffer menu does not handle special buffers properly.
+Solution: Keep a dictionary with buffer names to reliably keep track of
+ entries.
+ Also trigger BufFilePre and BufFilePost for command-line and
+ terminal buffers when the name changes.
+Files: src/testdir/test_alot.vim, src/testdir/Make_all.mak,
+ runtime/menu.vim, src/ex_getln.c, src/terminal.c,
+ src/testdir/test_menu.vim
+
+Patch 8.2.0414
+Problem: Channel connect_waittime() test is flaky.
+Solution: Set the test_is_flaky flag. Use test_is_flaky for more tests.
+Files: src/testdir/test_channel.vim, src/testdir/test_terminal.vim,
+ src/testdir/runtest.vim
+
+Patch 8.2.0415
+Problem: Bsdl filetype is not detected.
+Solution: Add an entry in the filetype list. (Daniel Kho, closes #5810)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0416
+Problem: Test leaves file behind.
+Solution: Delete the file.
+Files: src/testdir/test_indent.vim
+
+Patch 8.2.0417
+Problem: Travis CI config can be improved.
+Solution: Remove COVERAGE variable. Add load-snd-dummy script. add "-i NONE"
+ to avoid messages about viminfo. (Ozaki Kiichi, closes #5813)
+Files: .travis.yml, ci/load-snd-dummy.sh
+
+Patch 8.2.0418
+Problem: Code in eval.c not sufficiently covered by tests.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5815)
+Files: src/testdir/test_blob.vim, src/testdir/test_channel.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_eval_stuff.vim,
+ src/testdir/test_expr.vim, src/testdir/test_functions.vim,
+ src/testdir/test_job_fails.vim, src/testdir/test_lambda.vim,
+ src/testdir/test_let.vim, src/testdir/test_listdict.vim,
+ src/testdir/test_marks.vim, src/testdir/test_method.vim,
+ src/testdir/test_normal.vim, src/testdir/test_unlet.vim,
+ src/testdir/test_usercommands.vim, src/testdir/test_vimscript.vim,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.2.0419
+Problem: Various memory leaks in Vim9 script code.
+Solution: Fix the leaks. (Ozaki Kiichi, closes #5814)
+Files: src/proto/vim9compile.pro, src/scriptfile.c, src/structs.h,
+ src/testdir/test_vim9_script.vim, src/vim9.h, src/vim9compile.c,
+ src/vim9execute.c, src/vim9script.c
+
+Patch 8.2.0420
+Problem: Vim9: cannot interrupt a loop with CTRL-C.
+Solution: Check for CTRL-C once in a while. Doesn't fully work yet.
+Files: src/misc1.c, src/proto/misc1.pro,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0421
+Problem: Interrupting with CTRL-C does not always work.
+Solution: Recognize CTRL-C while modifyOtherKeys is set.
+Files: src/ui.c, src/testdir/test_vim9_script.vim, src/evalfunc.c
+
+Patch 8.2.0422
+Problem: Crash when passing popup window to win_splitmove(). (john Devin)
+Solution: Disallow moving a popup window. (closes #5816)
+Files: src/testdir/test_popupwin.vim, src/evalwindow.c
+
+Patch 8.2.0423
+Problem: In some environments a few tests are expected to fail.
+Solution: Add $TEST_MAY_FAIL to list tests that should not cause make to
+ fail.
+Files: src/testdir/runtest.vim
+
+Patch 8.2.0424
+Problem: Checking for wrong return value. (Tom)
+Solution: Invert the check and fix the test.
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0425
+Problem: Code for modeless selection not sufficiently tested.
+Solution: Add tests. Move mouse code functionality to a common script file.
+ (Yegappan Lakshmanan, closes #5821)
+Files: src/testdir/Make_all.mak, src/testdir/gen_opt_test.vim,
+ src/testdir/mouse.vim, src/testdir/test_edit.vim,
+ src/testdir/test_global.vim, src/testdir/test_modeless.vim,
+ src/testdir/test_normal.vim, src/testdir/test_selectmode.vim,
+ src/testdir/test_termcodes.vim, src/testdir/test_visual.vim,
+ src/ui.c
+
+Patch 8.2.0426
+Problem: Some errors were not tested for.
+Solution: Add tests. (Dominique Pellé, closes #5824)
+Files: src/testdir/test_buffer.vim, src/testdir/test_options.vim,
+ src/testdir/test_tcl.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.2.0427
+Problem: It is not possible to check for a typo in a feature name.
+Solution: Add an extra argument to has().
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/check.vim,
+ src/testdir/test_functions.vim
+
+Patch 8.2.0428
+Problem: Buffer name may leak.
+Solution: Free the buffer name before overwriting it.
+Files: src/terminal.c
+
+Patch 8.2.0429
+Problem: No warning when test checks for option that never exists.
+Solution: In tests check that the option can exist.
+Files: src/testdir/check.vim
+
+Patch 8.2.0430
+Problem: Window creation failure not properly tested.
+Solution: Improve the test. (Yegappan Lakshmanan, closes #5826)
+Files: src/testdir/test_cmdline.vim, src/testdir/test_window_cmd.vim
+
+Patch 8.2.0431
+Problem: Some compilers don't support using \e for Esc. (Yegappan
+ Lakshmanan)
+Solution: use \033 instead.
+Files: src/ui.c
+
+Patch 8.2.0432
+Problem: A few tests fail in a huge terminal.
+Solution: Make the tests pass. (Dominique Pellé, closes #5829)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_options.vim,
+ src/testdir/test_termcodes.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.2.0433
+Problem: INT signal not properly tested.
+Solution: Add a test. Also clean up some unnecessary lines. (Dominique
+ Pellé, closes #5828)
+Files: src/testdir/test_display.vim, src/testdir/test_ex_mode.vim,
+ src/testdir/test_excmd.vim, src/testdir/test_messages.vim,
+ src/testdir/test_signals.vim
+
+Patch 8.2.0434
+Problem: MS-Windows with VTP: Normal color not working.
+Solution: After changing the Normal color update the VTP console color.
+ (Nobuhiro Takasaki, closes #5836)
+Files: src/highlight.c
+
+Patch 8.2.0435
+Problem: Channel contents might be freed twice.
+Solution: Call either channel_free_channel() or channel_free(), not both.
+ (Nobuhiro Takasaki, closes #5835)
+Files: src/channel.c
+
+Patch 8.2.0436
+Problem: No warnings for incorrect printf arguments.
+Solution: Fix attribute in declaration. Fix uncovered mistakes. (Dominique
+ Pellé, closes #5834)
+Files: src/proto.h, src/eval.c, src/ops.c, src/spellfile.c,
+ src/vim9compile.c, src/vim9execute.c, src/viminfo.c, src/gui.c
+
+Patch 8.2.0437
+Problem: MS-Windows installer contains old stuff.
+Solution: Rely on Windows NT. (Ken Takata, closes #5832)
+Files: src/dosinst.c
+
+Patch 8.2.0438
+Problem: Terminal noblock test is very flaky on BSD.
+Solution: Change WaitFor() to WaitForAssert() to be able to see why it
+ failed. Add a short wait in between sending keys.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0439
+Problem: :disassemble has minor flaws.
+Solution: Format the code. Use (int) instead of (char) for %c.
+ (also by James McCoy, closes #5831)
+Files: src/vim9execute.c
+
+Patch 8.2.0440
+Problem: Terminal noblock test is still very flaky on BSD.
+Solution: Increase the waiting time.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0441
+Problem: Terminal noblock test is still failing on BSD.
+Solution: Reduce the amount of text.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0442
+Problem: Channel contents might be used after being freed.
+Solution: Reset the job channel before freeing the channel.
+Files: src/channel.c
+
+Patch 8.2.0443
+Problem: Clipboard code is spread out.
+Solution: Move clipboard code to its own file. (Yegappan Lakshmanan,
+ closes #5827)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/clipboard.c, src/ops.c, src/proto.h, src/proto/clipboard.pro,
+ src/proto/ops.pro, src/proto/register.pro, src/proto/ui.pro,
+ src/register.c, src/ui.c
+
+Patch 8.2.0444
+Problem: Swap file test fails on some systems.
+Solution: Preserve the swap file. Send NL terminated keys.
+Files: src/testdir/test_swap.vim
+
+Patch 8.2.0445
+Problem: Png and xpm files not in MS-Windows zip file.
+Solution: Move files to shared between Unix and Windows target.
+Files: Filelist
+
+Patch 8.2.0446
+Problem: Listener with undo of deleting all lines not tested.
+Solution: Add a test.
+Files: src/testdir/test_listener.vim
+
+Patch 8.2.0447
+Problem: Terminal scroll tests fails on some systems.
+Solution: Remove the fixed 100msec wait for Win32. Add a loop to wait until
+ scrolling has finished. (James McCoy, closes #5842)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0448
+Problem: Various functions not properly tested.
+Solution: Add more tests, especially for failures. (Yegappan Lakshmanan,
+ closes #5843)
+Files: runtime/doc/eval.txt, src/testdir/test_blob.vim,
+ src/testdir/test_breakindent.vim, src/testdir/test_charsearch.vim,
+ src/testdir/test_clientserver.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_exists.vim, src/testdir/test_expand_func.vim,
+ src/testdir/test_expr.vim, src/testdir/test_file_perm.vim,
+ src/testdir/test_functions.vim, src/testdir/test_gui.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_marks.vim,
+ src/testdir/test_partial.vim, src/testdir/test_registers.vim,
+ src/testdir/test_search.vim, src/testdir/test_spell.vim,
+ src/testdir/test_substitute.vim, src/testdir/test_syn_attr.vim,
+ src/testdir/test_syntax.vim, src/testdir/test_taglist.vim,
+ src/testdir/test_utf8.vim, src/testdir/test_vartabs.vim,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.2.0449
+Problem: Vim9: crash if return type is invalid. (Yegappan Lakshmanan)
+Solution: Always return some type, not NULL.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0450
+Problem: Not enough testing for restricted mode and function calls.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5847)
+Files: src/testdir/test_method.vim, src/testdir/test_restricted.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0451
+Problem: Win32: double-width character displayed incorrectly.
+Solution: First move the cursor to the first column. (Nobuhiro Takasaki,
+ closes #5848)
+Files: src/os_win32.c
+
+Patch 8.2.0452
+Problem: channel_parse_messages() fails when called recursively.
+Solution: Return for a recursive call. (closes #5835)
+Files: src/channel.c
+
+Patch 8.2.0453
+Problem: Trailing space in job_start() command causes empty argument.
+Solution: Ignore trailing space. (closes #5851)
+Files: src/misc2.c, src/testdir/test_channel.vim
+
+Patch 8.2.0454
+Problem: Some tests fail when the system is slow.
+Solution: Make the run number global, use in the test to increase the
+ waiting time. (closes #5841)
+Files: src/testdir/runtest.vim, src/testdir/test_functions.vim
+
+Patch 8.2.0455
+Problem: Cannot set the highlight group for a specific terminal.
+Solution: Add the "highlight" option to term_start(). (closes #5818)
+Files: src/terminal.c, src/structs.h, src/channel.c,
+ src/testdir/test_terminal.vim, runtime/doc/terminal.txt,
+ src/testdir/dumps/Test_terminal_popup_Terminal.dump,
+ src/testdir/dumps/Test_terminal_popup_MyTermCol.dump
+
+Patch 8.2.0456
+Problem: Test_confirm_cmd is flaky.
+Solution: Add a term_wait() call. (closes #5854)
+Files: src/testdir/test_excmd.vim
+
+Patch 8.2.0457
+Problem: Test_quotestar() often fails when run under valgrind.
+Solution: Wait longer for the GUI to start.
+Files: src/testdir/test_quotestar.vim
+
+Patch 8.2.0458
+Problem: Missing feature check in test function.
+Solution: Add check commands.
+Files: src/testdir/test_excmd.vim
+
+Patch 8.2.0459
+Problem: Cannot check if a function name is correct.
+Solution: Add "?funcname" to exists().
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_exists.vim,
+ src/testdir/check.vim
+
+Patch 8.2.0460 (after 8.2.0459)
+Problem: Build failure because of wrong feature name.
+Solution: Correct feature name.
+Files: src/evalfunc.c
+
+Patch 8.2.0461
+Problem: Confirm test fails on amd64 system. (Alimar Riesebieter)
+Solution: Add an extra WaitForAssert(). (Dominique Pellé)
+Files: src/testdir/test_excmd.vim
+
+Patch 8.2.0462
+Problem: Previewwindow test fails on some systems. (James McCoy)
+Solution: Wait a bit after sending the "o". (closes #5849)
+Files: src/testdir/test_popup.vim,
+ src/testdir/dumps/Test_popup_and_previewwindow_01.dump
+
+Patch 8.2.0463
+Problem: Build error without float and channel feature. (John Marriott)
+Solution: Define return types always.
+Files: src/globals.h, src/evalfunc.c
+
+Patch 8.2.0464
+Problem: Typos and other small problems.
+Solution: Fix the typos. Add missing files to the distribution.
+Files: Filelist, src/buffer.c, src/drawline.c, src/gui_gtk_x11.c,
+ src/os_unixx.h, src/proto/popupwin.pro
+
+Patch 8.2.0465
+Problem: Vim9: dead code and wrong return type.
+Solution: Remove dead code. Fix return type. Add more tests.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0466 (after 8.2.0452)
+Problem: Not parsing messages recursively breaks the govim plugin.
+Solution: When called recursively do handle messages but do not close
+ channels.
+Files: src/channel.c
+
+Patch 8.2.0467
+Problem: Vim9: some errors are not tested
+Solution: Add more tests. Fix that Vim9 script flag is not reset.
+Files: src/vim9compile.c, src/scriptfile.c, src/dict.c,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0468
+Problem: GUI: pixel dust with some fonts and characters.
+Solution: Always redraw the character before the cursor. (Nir Lichtman,
+ closes #5549, closes #5856)
+Files: src/gui.c, src/proto/gui.pro, src/screen.c
+
+Patch 8.2.0469
+Problem: Vim9: no error for missing ] after list.
+Solution: Add error message. Add more tests.
+Files: src/globals.h, src/list.c, src/userfunc.c,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_lambda.vim
+
+Patch 8.2.0470
+Problem: Test_confirm_cmd_cancel() can fail on a slow system.
+Solution: Use WaitForAssert(). (Ozaki Kiichi, closes #5861)
+Files: src/testdir/test_excmd.vim
+
+Patch 8.2.0471
+Problem: Missing change to compile_list().
+Solution: Add error message.
+Files: src/vim9compile.c
+
+Patch 8.2.0472
+Problem: Terminal highlight name is set twice, leaking memory.
+Solution: Delete one.
+Files: src/terminal.c
+
+Patch 8.2.0473
+Problem: Variables declared in an outer scope.
+Solution: Declare variables only in the scope where they are used.
+Files: src/evalvars.c
+
+Patch 8.2.0474 (after 8.2.0403)
+Problem: Cannot use :write when using a plugin with BufWriteCmd.
+Solution: Reset BF_NOTEDITED after BufWriteCmd. (closes #5807)
+Files: src/fileio.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.0475
+Problem: Channel out_cb test still fails sometimes on Mac.
+Solution: Use an even longer timeout.
+Files: src/testdir/test_channel.vim
+
+Patch 8.2.0476
+Problem: Terminal nasty callback test fails sometimes.
+Solution: use term_wait() instead of a sleep. (Yee Cheng Chin, closes #5865)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0477
+Problem: Vim9: error messages not tested.
+Solution: Add more tests.
+Files: src/testdir/test_vim9_expr.vim, src/vim9execute.c
+
+Patch 8.2.0478
+Problem: New buffers are not added to the Buffers menu.
+Solution: Turn number into string. (Yee Cheng Chin, closes #5864)
+Files: runtime/menu.vim, src/testdir/test_menu.vim
+
+Patch 8.2.0479
+Problem: Unloading shared libraries on exit has no purpose.
+Solution: Do not unload shared libraries on exit.
+Files: src/if_lua.c, src/if_perl.xs, src/if_python.c, src/if_python3.c,
+ src/if_ruby.c, src/if_tcl.c
+
+Patch 8.2.0480
+Problem: Vim9: some code is not tested.
+Solution: Add more tests.
+Files: src/testdir/test_vim9_expr.vim, src/vim9compile.c
+
+Patch 8.2.0481
+Problem: Travis is still using trusty.
+Solution: Adjust config to use bionic. (Ozaki Kiichi, closes #5868)
+Files: .travis.yml, src/testdir/lsan-suppress.txt
+
+Patch 8.2.0482
+Problem: Channel and sandbox code not sufficiently tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5855)
+Files: src/option.h, src/testdir/test_channel.vim,
+ src/testdir/test_clientserver.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_edit.vim, src/testdir/test_excmd.vim,
+ src/testdir/test_normal.vim, src/testdir/test_prompt_buffer.vim,
+ src/testdir/test_restricted.vim, src/testdir/test_smartindent.vim,
+ src/testdir/test_substitute.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_textformat.vim, src/testdir/test_visual.vim
+
+Patch 8.2.0483
+Problem: Vim9: "let x = x + 1" does not give an error.
+Solution: Hide the variable when compiling the expression.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0484
+Problem: Vim9: some error messages not tested.
+Solution: Add more tests.
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0485 (after 8.2.0483)
+Problem: Vim9 script test fails.
+Solution: Stricter condition for adding new local variable.
+Files: Stricter condition for adding new local variable.
+
+Patch 8.2.0486
+Problem: Vim9: some code and error messages not tested.
+Solution: Add more tests.
+Files: src/vim9compile.c, src/evalvars.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0487
+Problem: Vim9: compiling not sufficiently tested.
+Solution: Add more tests. Fix bug with PCALL.
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0488
+Problem: Vim9: Compiling can break when using a lambda inside :def.
+Solution: Do not keep a pointer to the dfunc_T for longer time.
+Files: src/vim9compile.c, src/vim9.h
+
+Patch 8.2.0489
+Problem: Vim9: memory leaks.
+Solution: Free memory in the right place. Add hints for using asan.
+Files: src/vim9compile.c, src/testdir/lsan-suppress.txt, src/Makefile
+
+Patch 8.2.0490
+Problem: Win32: VTP doesn't respect 'restorescreen'.
+Solution: Use escape codes to switch to alternate screen. (Nobuhiro
+ Takasaki, closes #5872)
+Files: src/os_win32.c
+
+Patch 8.2.0491
+Problem: Cannot recognize a <script> mapping using maparg().
+Solution: Add the "script" key. (closes #5873)
+Files: src/map.c, runtime/doc/eval.txt, src/testdir/test_maparg.vim
+
+Patch 8.2.0492
+Problem: Vim9: some error messages not tested.
+Solution: Add more tests. Remove dead code. Fix uncovered bugs.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0493
+Problem: Vim9: some error messages not tested.
+Solution: Add more tests. Fix uncovered bugs.
+Files: src/vim9compile.c, src/vim9execute.c, src/testing.c, src/eval.c,
+ src/proto/testing.pro, src/evalfunc.c, runtime/doc/eval.txt,
+ runtime/doc/testing.txt, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0494
+Problem: Vim9: asan error.
+Solution: Only get the type when there is one.
+Files: src/vim9compile.c
+
+Patch 8.2.0495
+Problem: Vim9: some code not tested.
+Solution: Add more tests. Support more const expressions.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0496
+Problem: Vim9: disassemble test fails.
+Solution: Separate test cases with recognized constant expressions.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0497
+Problem: Too verbose output from the asan build in Travis.
+Solution: Filter out suppression messages. (Ozaki Kiichi, closes #5874)
+Files: .travis.yml
+
+Patch 8.2.0498
+Problem: Coverity complains about uninitialized field.
+Solution: Initialize the whole typval_T.
+Files: src/vim9compile.c
+
+Patch 8.2.0499
+Problem: Calling a lambda is slower than evaluating a string.
+Solution: Make calling a lambda faster. (Ken Takata, closes #5727)
+Files: src/userfunc.c
+
+Patch 8.2.0500
+Problem: Using the same loop in many places.
+Solution: Define more FOR_ALL macros. (Yegappan Lakshmanan, closes #5339)
+Files: src/arglist.c, src/autocmd.c, src/buffer.c, src/change.c,
+ src/channel.c, src/cmdexpand.c, src/diff.c, src/eval.c,
+ src/evalbuffer.c, src/evalfunc.c, src/evalvars.c,
+ src/evalwindow.c, src/ex_cmds2.c, src/filepath.c, src/globals.h,
+ src/gui.c, src/if_py_both.h, src/if_ruby.c, src/insexpand.c,
+ src/list.c, src/misc2.c, src/netbeans.c, src/popupwin.c,
+ src/quickfix.c, src/screen.c, src/sign.c, src/spell.c,
+ src/spellfile.c, src/spellsuggest.c, src/tag.c, src/terminal.c,
+ src/userfunc.c, src/window.c
+
+Patch 8.2.0501
+Problem: Vim9: script test fails when channel feature is missing.
+Solution: Add a has() condition.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0502
+Problem: Vim9: some code is not tested.
+Solution: Add more tests. Fix uncovered problems.
+Files: src/vim9compile.c, src/regexp.c, src/proto/regexp.pro,
+ src/cmdexpand.c, src/ex_cmds.c, src/ex_docmd.c, src/ex_eval.c,
+ src/ex_getln.c, src/highlight.c, src/search.c, src/syntax.c,
+ src/tag.c, src/userfunc.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0503
+Problem: Vim9: some code is not tested.
+Solution: Add tests. Fix uncovered problems.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0504
+Problem: Vim9: leaking scope memory when compilation fails.
+Solution: Cleanup the scope list.
+Files: src/vim9compile.c
+
+Patch 8.2.0505
+Problem: term_gettty() not sufficiently tested.
+Solution: Add more asserts. (Dominique Pellé, closes #5877)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0506
+Problem: Coverity complains about ignoring return value.
+Solution: Add (void).
+Files: src/userfunc.c
+
+Patch 8.2.0507 (after 8.2.0472)
+Problem: Getbufvar() may get the wrong dictionary. (David le Blanc)
+Solution: Check for empty name. (closes #5878)
+Files: src/evalvars.c, src/testdir/test_functions.vim
+
+Patch 8.2.0508
+Problem: Vim9: func and partial types not done yet
+Solution: Fill in details about func declaration, drop a separate partial
+ declaration.
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/globals.h,
+ src/structs.h, src/evalfunc.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0509
+Problem: various code is not properly tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5871)
+Files: src/main.c, src/testdir/check.vim, src/testdir/shared.vim,
+ src/testdir/term_util.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_ex_mode.vim, src/testdir/test_expand.vim,
+ src/testdir/test_functions.vim, src/testdir/test_options.vim,
+ src/testdir/test_startup.vim, src/testdir/test_textformat.vim,
+ src/testdir/test_trycatch.vim, src/testdir/test_viminfo.vim
+
+Patch 8.2.0510
+Problem: Coverity complains about using uninitialized variable.
+Solution: Assign a value to "scol". Move code inside NULL check.
+Files: src/beval.c, src/popupwin.c
+
+Patch 8.2.0511
+Problem: Cscope code not fully tested.
+Solution: Add more test cases. (Dominique Pellé, closes #5886)
+Files: src/testdir/test_cscope.vim
+
+Patch 8.2.0512
+Problem: Vim9: no optional arguments in func type.
+Solution: Check for question mark after type. Find function reference
+ without function().
+Files: src/vim9compile.c, src/vim9execute.c, src/structs.h,
+ src/globals.h, src/vim.h, src/vim9.h, src/userfunc.c,
+ src/testdir/Make_all.mak, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0513
+Problem: Reading past allocated memory when using varargs.
+Solution: Fix copying function argument types.
+Files: src/vim9compile.c
+
+Patch 8.2.0514
+Problem: Several global functions are used in only one file.
+Solution: Make the functions static. (Yegappan Lakshmanan, closes #5884)
+Files: src/drawscreen.c, src/evalvars.c, src/getchar.c, src/list.c,
+ src/proto/drawscreen.pro, src/proto/evalvars.pro,
+ src/proto/getchar.pro, src/proto/list.pro, src/proto/version.pro,
+ src/version.c
+
+Patch 8.2.0515
+Problem: Some compilers cannot add to "void *".
+Solution: Cast to "char *".
+Files: src/vim9compile.c
+
+Patch 8.2.0516
+Problem: Client-server code is spread out.
+Solution: Move client-server code to a new file. (Yegappan Lakshmanan,
+ closes #5885)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/clientserver.c, src/evalfunc.c, src/main.c, src/proto.h,
+ src/proto/clientserver.pro, src/proto/main.pro
+
+Patch 8.2.0517
+Problem: Vim9: cannot separate "func" and "func(): void".
+Solution: Use VAR_ANY for "any" and VAR_UNKNOWN for "no type".
+Files: src/structs.h, src/globals.h, src/eval.c, src/evalfunc.c,
+ src/evalvars.c, src/testing.c, src/vim9compile.c,
+ src/vim9execute.c, src/viminfo.c, src/if_py_both.h, src/json.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.0518
+Problem: A terminal falls back to setting $TERM to "xterm".
+Solution: Use "xterm-color" if more than 16 colors are supported and
+ "xterm-256color" if at least 256 colors are supported.
+ (closes #5887)
+Files: src/os_unix.c
+
+Patch 8.2.0519
+Problem: Vim9: return type not properly checked.
+Solution: Check type properly, also at runtime.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0520
+Problem: Tests are not listed in sorted order.
+Solution: Move test_ex_mode. (Doug Richardson, closes #5889)
+Files: src/testdir/Make_all.mak
+
+Patch 8.2.0521
+Problem: Crash when reading a blob fails.
+Solution: Avoid keeping a pointer to a freed blob object. (Dominique Pellé,
+ closes #5890) Adjust error messages.
+Files: src/filepath.c, src/testdir/test_blob.vim
+
+Patch 8.2.0522
+Problem: Several errors are not tested for.
+Solution: Add tests. (Yegappan Lakshmanan, closes #5892)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_digraph.vim, src/testdir/test_expand.vim,
+ src/testdir/test_expr.vim, src/testdir/test_functions.vim,
+ src/testdir/test_gui.vim, src/testdir/test_highlight.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_lambda.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_normal.vim,
+ src/testdir/test_options.vim, src/testdir/test_preview.vim,
+ src/testdir/test_user_func.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_viminfo.vim,
+ src/testdir/test_vimscript.vim, src/testdir/test_window_cmd.vim
+
+Patch 8.2.0523
+Problem: Loops are repeated.
+Solution: Use FOR_ALL_ macros. (Yegappan Lakshmanan, closes #5882)
+Files: src/buffer.c, src/drawscreen.c, src/evalfunc.c, src/evalwindow.c,
+ src/globals.h, src/gui_athena.c, src/gui_gtk.c, src/gui_motif.c,
+ src/gui_w32.c, src/list.c, src/menu.c, src/popupmenu.c,
+ src/popupwin.c, src/quickfix.c, src/syntax.c, src/time.c,
+ src/userfunc.c, src/vim9compile.c
+
+Patch 8.2.0524
+Problem: Win32: searching for file matches is slow.
+Solution: Instead of making another round to find any short filename, check
+ for the short name right away. Avoid using an ordinary file like a
+ directory. (Nir Lichtman, closes #5883)
+Files: src/filepath.c
+
+Patch 8.2.0525 (after 8.2.0524)
+Problem: Win32: typo in assignment and misplaced paren.
+Solution: Fix the syntax.
+Files: src/filepath.c
+
+Patch 8.2.0526
+Problem: Gcc 9 complains about empty statement.
+Solution: Add {}. (Dominique Pellé, closes #5894)
+Files: src/evalfunc.c
+
+Patch 8.2.0527
+Problem: Vim9: function types insufficiently tested.
+Solution: Add more tests. Fix white space check. Add "test_vim9" target.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim, src/Makefile,
+ src/testdir/Makefile, src/testdir/Make_all.mak
+
+Patch 8.2.0528
+Problem: Vim9: function arguments insufficiently tested.
+Solution: Check types. Add more tests. Fix function with varargs only.
+Files: src/vim9compile.c, src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0529
+Problem: Vim9: function argument with default not checked.
+Solution: Check type of argument with default value.
+Files: src/vim9compile.c, src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0530
+Problem: Test crashes on s390. (James McCoy)
+Solution: Explicitly define an 8 big signed type. (closes #5897)
+Files: src/structs.h
+
+Patch 8.2.0531
+Problem: Various errors not tested.
+Solution: Add tests. (Yegappan Lakshmanan, closes #5895)
+Files: src/testdir/test_search.vim, src/testdir/test_source.vim,
+ src/testdir/test_syntax.vim, src/testdir/test_user_func.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.0532
+Problem: Cannot use simplify() as a method.
+Solution: Add FEARG_1. (closes #5896)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim
+
+Patch 8.2.0533
+Problem: Tests using term_wait() can still be flaky.
+Solution: Increase the wait time when rerunning a test. (James McCoy,
+ closes #5899) Halve the initial times to make tests run faster
+ when there is no rerun.
+Files: src/testdir/term_util.vim, src/testdir/test_arglist.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_balloon.vim,
+ src/testdir/test_bufline.vim, src/testdir/test_channel.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_conceal.vim,
+ src/testdir/test_cursorline.vim, src/testdir/test_debugger.vim,
+ src/testdir/test_diffmode.vim, src/testdir/test_display.vim,
+ src/testdir/test_functions.vim, src/testdir/test_highlight.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_mapping.vim,
+ src/testdir/test_match.vim, src/testdir/test_matchadd_conceal.vim,
+ src/testdir/test_messages.vim, src/testdir/test_number.vim,
+ src/testdir/test_popup.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_profile.vim, src/testdir/test_search.vim,
+ src/testdir/test_search_stat.vim, src/testdir/test_startup.vim,
+ src/testdir/test_startup_utf8.vim,
+ src/testdir/test_statusline.vim, src/testdir/test_suspend.vim,
+ src/testdir/test_swap.vim, src/testdir/test_tagjump.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_terminal_fail.vim,
+ src/testdir/test_timers.vim, src/testdir/test_vimscript.vim
+
+Patch 8.2.0534
+Problem: Client-server test fails under valgrind.
+Solution: Use WaitForAssert().
+Files: src/testdir/test_clientserver.vim
+
+Patch 8.2.0535
+Problem: Regexp patterns not fully tested.
+Solution: Add more regexp tests and others. (Yegappan Lakshmanan,
+ closes #5901)
+Files: src/testdir/test_marks.vim, src/testdir/test_options.vim,
+ src/testdir/test_regexp_latin.vim, src/testdir/test_search.vim
+
+Patch 8.2.0536
+Problem: Vim9: some compilation code not tested.
+Solution: Add more test cases.
+Files: src/evalvars.c, src/proto/evalvars.pro, src/vim9compile.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0537
+Problem: Vim9: no check for sandbox when setting v:var.
+Solution: Check for sandbox.
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0538
+Problem: Vim9: VAR_PARTIAL is not used during compilation.
+Solution: Remove VAR_PARTIAL.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c
+
+Patch 8.2.0539
+Problem: Comparing two NULL list fails.
+Solution: Change the order of comparing two lists.
+Files: src/list.c, src/testdir/test_assert.vim
+
+Patch 8.2.0540
+Problem: Regexp and other code not tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5904)
+Files: src/testdir/test_backspace_opt.vim, src/testdir/test_expr.vim,
+ src/testdir/test_increment.vim, src/testdir/test_normal.vim,
+ src/testdir/test_options.vim, src/testdir/test_regexp_latin.vim,
+ src/testdir/test_search.vim, src/testdir/test_substitute.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_virtualedit.vim
+
+Patch 8.2.0541
+Problem: Travis CI does not give compiler warnings.
+Solution: Add flags for warnings. Fix uncovered problems. (Ozaki Kiichi,
+ closes #5898)
+Files: .travis.yml, ci/config.mk.clang.sed, ci/config.mk.gcc.sed,
+ ci/config.mk.sed, src/if_perl.xs, src/if_ruby.c,
+ src/libvterm/t/harness.c
+
+Patch 8.2.0542
+Problem: No test for E386.
+Solution: Add a test. (Dominique Pellé, closes #5911)
+Files: src/testdir/test_search.vim
+
+Patch 8.2.0543
+Problem: Vim9: function with varargs does not work properly.
+Solution: Improve function type spec and add tests. Fix bugs.
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/vim9execute.c,
+ src/structs.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0544
+Problem: Memory leak in search test.
+Solution: Free msgbuf. (Dominique Pellé, closes #5912)
+Files: src/search.c
+
+Patch 8.2.0545
+Problem: Unused arguments ignored in non-standard way.
+Solution: Add UNUSED instead of (void).
+Files: src/libvterm/t/harness.c
+
+Patch 8.2.0546
+Problem: Vim9: varargs implementation is inefficient.
+Solution: Create list without moving the arguments.
+Files: src/vim9compile.c, src/vim9execute.c
+
+Patch 8.2.0547
+Problem: Win32: restoring screen not always done right.
+Solution: Use a more appropriate method. (Nobuhiro Takasaki, closes #5909)
+Files: src/os_win32.c
+
+Patch 8.2.0548
+Problem: Vim9: not all possible func type errors tested.
+Solution: Add more tests.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0549
+Problem: User systemd files not recognized.
+Solution: Add filetype patterns. (Kevin Locke, closes #5914)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0550
+Problem: Some changes in the libvterm upstream code.
+Solution: Include some changes.
+Files: src/libvterm/t/harness.c
+
+Patch 8.2.0551
+Problem: Not all code for options is tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5913)
+Files: src/testdir/test_options.vim, src/testdir/test_python3.vim,
+ src/testdir/test_undo.vim, src/testdir/test_vimscript.vim
+
+Patch 8.2.0552
+Problem: Vim9: some errors not covered by tests.
+Solution: Add more tests. Check Funcref argument types.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0553 (after 8.2.0550)
+Problem: Error for unused argument.
+Solution: Add UNUSED.
+Files: src/libvterm/t/harness.c
+
+Patch 8.2.0554
+Problem: The GUI doesn't set t_Co.
+Solution: In the GUI set t_Co to 256 * 256 * 256. (closes #5903)
+Files: src/term.c, src/proto/term.pro, src/gui.c,
+ src/testdir/test_gui.vim
+
+Patch 8.2.0555
+Problem: Vim9: line continuation is not always needed.
+Solution: Recognize continuation lines automatically in list and dict.
+Files: runtime/doc/vim9.txt, src/vim9compile.c,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0556
+Problem: Vim9: memory leak when finding common type.
+Solution: Store allocated memory in type growarray.
+Files: src/vim9compile.c
+
+Patch 8.2.0557
+Problem: No IPv6 support for channels.
+Solution: Add IPv6 support. (Ozaki Kiichi, closes #5893)
+Files: .travis.yml, runtime/doc/channel.txt, runtime/doc/various.txt,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/auto/configure,
+ src/channel.c, src/config.h.in, src/configure.ac, src/evalfunc.c,
+ src/proto/channel.pro, src/testdir/check.vim,
+ src/testdir/runtest.vim, src/testdir/test_cdo.vim,
+ src/testdir/test_channel.py, src/testdir/test_channel.vim,
+ src/testdir/test_channel_6.py, src/testdir/test_escaped_glob.vim,
+ src/testdir/test_getcwd.vim, src/testdir/test_hide.vim
+
+Patch 8.2.0558
+Problem: Vim9: dict code not covered by tests.
+Solution: Remove dead code, adjust test case.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0559
+Problem: Clearing a struct is verbose.
+Solution: Define and use CLEAR_FIELD() and CLEAR_POINTER().
+Files: src/vim.h, src/blowfish.c, src/channel.c, src/charset.c,
+ src/clipboard.c, src/diff.c, src/eval.c, src/evalfunc.c,
+ src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c, src/findfile.c,
+ src/gui_gtk_f.c, src/gui_mac.c, src/gui_motif.c, src/gui_w32.c,
+ src/gui_x11.c, src/hardcopy.c, src/hashtab.c, src/highlight.c,
+ src/if_mzsch.c, src/insexpand.c, src/kword_test.c, src/list.c,
+ src/main.c, src/map.c, src/memfile.c, src/message_test.c,
+ src/misc1.c, src/netbeans.c, src/normal.c, src/ops.c,
+ src/option.c, src/os_mswin.c, src/os_win32.c, src/popupmenu.c,
+ src/quickfix.c, src/regexp.c, src/regexp_bt.c, src/regexp_nfa.c,
+ src/search.c, src/sign.c, src/spell.c, src/spellfile.c,
+ src/spellsuggest.c, src/syntax.c, src/tag.c, src/terminal.c,
+ src/time.c, src/undo.c, src/userfunc.c, src/vim9compile.c,
+ src/vim9execute.c, src/if_py_both.h
+
+Patch 8.2.0560
+Problem: Compiler warning in tiny build.
+Solution: Move declaration inside #ifdef. (Dominique Pellé, closes #5915)
+Files: src/ex_docmd.c
+
+Patch 8.2.0561
+Problem: Vim9: cannot split function call in multiple lines.
+Solution: Find more arguments in following lines.
+Files: runtime/doc/vim9.txt, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0562
+Problem: Vim9: cannot split an expression into multiple lines.
+Solution: Continue in next line after an operator.
+Files: runtime/doc/vim9.txt, src/macros.h, src/vim9compile.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0563
+Problem: Vim9: cannot split a function line.
+Solution: Continue in next line so long as the function isn't done.
+Files: runtime/doc/vim9.txt, src/userfunc.c, src/proto/userfunc.pro,
+ src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0564
+Problem: Vim9: calling a def function from non-vim9 may fail.
+Solution: Convert varargs to a list.
+Files: src/testdir/test_vim9_func.vim, src/vim9execute.c
+
+Patch 8.2.0565
+Problem: Vim9: tests contain superfluous line continuation.
+Solution: Remove line continuation no longer needed. Skip empty lines.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0566
+Problem: Vim9: variable can be used uninitialized.
+Solution: Jump to after where variable is used.
+Files: src/vim9execute.c
+
+Patch 8.2.0567
+Problem: Vim9: cannot put comments halfway expressions.
+Solution: Support # comments in many places.
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/userfunc.c,
+ src/ex_docmd.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0568
+Problem: The man filetype plugin overwrites the unnamed register.
+Solution: Use the black hole register. (Jason Franklin)
+Files: runtime/ftplugin/man.vim, src/testdir/test_man.vim
+
+Patch 8.2.0569
+Problem: Build failure with tiny version.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.2.0570
+Problem: Vim9: no error when omitting type from argument.
+Solution: Enforce specifying argument types.
+Files: src/userfunc.c, src/ex_eval.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0571
+Problem: Double free when passing invalid argument to job_start().
+Solution: Clear the argument when freed. (Masato Nishihata, closes #5926)
+Files: src/misc2.c, src/testdir/test_channel.vim
+
+Patch 8.2.0572 (after 8.2.0571)
+Problem: Using two lines for free and reset.
+Solution: Use VIM_CLEAR() instead. (Yegappan Lakshmanan)
+Files: src/misc2.c
+
+Patch 8.2.0573
+Problem: using :version twice leaks memory
+Solution: Only initialize variables once. (Dominique Pellé, closes #5917)
+Files: src/testdir/Make_all.mak, src/testdir/test_alot.vim,
+ src/testdir/test_version.vim, src/version.c, src/globals.h
+
+Patch 8.2.0574
+Problem: Ipv6 feature not shown in :version output.
+Solution: Add ipv6 in :version output. (Ozaki Kiichi, closes #5924)
+Files: runtime/doc/eval.txt, src/version.c
+
+Patch 8.2.0575
+Problem: :digraph! not tested.
+Solution: Add a test. (Dominique Pellé, closes #5925)
+Files: src/testdir/test_digraph.vim
+
+Patch 8.2.0576
+Problem: Some errors are not covered by tests.
+Solution: Add a few more tests. (Dominique Pellé, closes #5920)
+Files: src/testdir/test_buffer.vim, src/testdir/test_digraph.vim,
+ src/testdir/test_expr.vim, src/testdir/test_messages.vim
+
+Patch 8.2.0577
+Problem: Not all modifiers supported for :options.
+Solution: Use all cmdmod.split flags. (closes #4401)
+Files: src/usercmd.c, src/proto/usercmd.pro, src/scriptfile.c,
+ src/testdir/test_options.vim, src/testdir/test_usercommands.vim
+
+Patch 8.2.0578
+Problem: Heredoc for interfaces does not support "trim".
+Solution: Update the script heredoc support to be same as the :let command.
+ (Yegappan Lakshmanan, closes #5916)
+Files: runtime/doc/if_lua.txt, runtime/doc/if_mzsch.txt,
+ runtime/doc/if_perl.txt, runtime/doc/if_pyth.txt,
+ runtime/doc/if_ruby.txt, runtime/doc/if_tcl.txt, src/evalvars.c,
+ src/ex_getln.c, src/proto/evalvars.pro, src/testdir/test86.in,
+ src/testdir/test87.in, src/testdir/test_lua.vim,
+ src/testdir/test_perl.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/testdir/test_pyx2.vim,
+ src/testdir/test_pyx3.vim, src/testdir/test_ruby.vim,
+ src/testdir/test_tcl.vim, src/userfunc.c, src/vim9compile.c
+
+Patch 8.2.0579
+Problem: Coverity warns for unused value.
+Solution: Change order and use "else if".
+Files: src/os_unix.c
+
+Patch 8.2.0580
+Problem: Window size wrong if 'ea' is off and 'splitright' is on and
+ splitting then closing a window.
+Solution: Put abandoned window space in the right place. (Mark Waggoner)
+Files: src/testdir/test_winbuf_close.vim, src/window.c
+
+Patch 8.2.0581 (after 8.2.0547)
+Problem: Win32 console: the cursor position is always top-left.
+Solution: Revert the patch for restoring screen.
+Files: src/os_win32.c
+
+Patch 8.2.0582
+Problem: Color ramp test does not show text colors.
+Solution: Add a row of 16 text colors and 16 bold text colors.
+Files: src/testdir/color_ramp.vim
+
+Patch 8.2.0583
+Problem: Vim9: # comment not recognized in :def function.
+Solution: Recognize and skip # comment.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0584
+Problem: Viminfo file uses obsolete function file_readable().
+Solution: Use filereadable(). (closes #5934)
+Files: src/session.c
+
+Patch 8.2.0585
+Problem: Vim9: # comment not recognized after :vim9script.
+Solution: Check script type. Make comment after ":echo" work. And in
+ several other places.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/eval.c,
+ src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0586
+Problem: Vim9: # comment not sufficiently tested
+Solution: Check for preceding white space.
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0587
+Problem: Compiler warning for unused variable.
+Solution: Add UNUSED.
+Files: src/ex_docmd.c
+
+Patch 8.2.0588
+Problem: Putty does not use "sgr" 'ttymouse' by default.
+Solution: Make "sgr" the default for Putty. (Christian Brabandt,
+ closes #5942)
+Files: src/term.c
+
+Patch 8.2.0589
+Problem: .bsd file type not recognized.
+Solution: Recognize .bsd as BSDL. (Daniel Kho, closes #5945)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0590
+Problem: No 'backspace' value allows ignoring the insertion point.
+Solution: Add the "nostop" and 3 values. (Christian Brabandt, closes #5940)
+Files: runtime/doc/options.txt, src/edit.c, src/option.c, src/option.h,
+ src/optionstr.c, src/testdir/gen_opt_test.vim,
+ src/testdir/test_backspace_opt.vim
+
+Patch 8.2.0591
+Problem: MS-Windows: should always support IPv6
+Solution: Add build flag. (Ozaki Kiichi, closes #5944)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.2.0592
+Problem: MS-Windows with VTP: cursor is not made invisible.
+Solution: Output the code to make the cursor visible or invisible. (Nobuhiro
+ Takasaki, closes #5941)
+Files: src/os_win32.c
+
+Patch 8.2.0593
+Problem: Finding a user command is not optimal.
+Solution: Start further down in the list of commands.
+Files: src/ex_cmds.h, src/ex_docmd.c
+
+Patch 8.2.0594
+Problem: MS-Windows: cannot build with WINVER set to 0x0501.
+Solution: Only use inet_ntop() when available. (Ozaki Kiichi, closes #5946)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/auto/configure,
+ src/channel.c, src/config.h.in, src/configure.ac
+
+Patch 8.2.0595
+Problem: Vim9: not all commands using ends_excmd() tested.
+Solution: Find # comment after regular commands. Add more tests. Report
+ error for where it was caused.
+Files: src/ex_docmd.c, src/vim9compile.c, src/vim9execute.c, src/usercmd.c,
+ src/evalfunc.c, src/userfunc.c, src/proto/userfunc.pro,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0596
+Problem: Crash in test49.
+Solution: Check the right pointer.
+Files: src/userfunc.c, src/testdir/test_eval.ok
+
+Patch 8.2.0597
+Problem: Test_eval is old style.
+Solution: Change some tests to a new style test.
+Files: src/testdir/test_eval.in, src/testdir/test_eval.ok,
+ src/testdir/test_eval_stuff.vim
+
+Patch 8.2.0598
+Problem: Test_eval_stuff fails in normal terminal.
+Solution: Close the new window.
+Files: src/testdir/test_eval_stuff.vim
+
+Patch 8.2.0599
+Problem: Netbeans interface insufficiently tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5921)
+Files: runtime/doc/netbeans.txt, src/netbeans.c, src/os_win32.c,
+ src/testdir/runtest.vim, src/testdir/test_netbeans.py,
+ src/testdir/test_netbeans.vim
+
+Patch 8.2.0600
+Problem: Vim9: cannot read or write w:, t: and b: variables.
+Solution: Implement load and store for w:, t: and b: variables.
+ (closes #5950)
+Files: src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim,
+ src/vim9.h, src/vim9compile.c, src/vim9execute.c
+
+Patch 8.2.0601
+Problem: Vim9: :unlet is not compiled.
+Solution: Implement :unlet instruction and check for errors.
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/vim9.h,
+ src/vim9execute.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/eval.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0602
+Problem: :unlet $VAR does not work properly.
+Solution: Make ":lockvar $VAR" fail. Check the "skip" flag.
+Files: src/evalvars.c, src/globals.h, src/testdir/test_vimscript.vim
+
+Patch 8.2.0603
+Problem: Configure does not detect moonjit.
+Solution: Add check for moonjit. (Shlomi Fish, closes #5947)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.0604
+Problem: :startinsert in a terminal window used later.
+Solution: Ignore :startinsert in a terminal window. (closes #5952)
+Files: src/ex_docmd.c, src/testdir/test_terminal.vim
+
+Patch 8.2.0605
+Problem: Vim9: cannot unlet an environment variable.
+Solution: Implement unlet for $VAR.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0606
+Problem: Several syntax HL errors not checked.
+Solution: Add tests. (Yegappan Lakshmanan, closes #5954)
+Files: src/testdir/test_syntax.vim
+
+Patch 8.2.0607
+Problem: Gcc warns for using uninitialized variable. (John Marriott)
+Solution: Set name_end also for environment variables.
+Files: src/evalvars.c
+
+Patch 8.2.0608
+Problem: Warning from clang when building message test.
+Solution: Use a void pointer. (Dominique Pellé, closes #5958)
+Files: src/message_test.c
+
+Patch 8.2.0609
+Problem: Configure does not detect moonjit correctly.
+Solution: Double the brackets. (Ozaki Kiichi)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.0610
+Problem: Some tests are still old style.
+Solution: Convert to new style tests. (Yegappan Lakshmanan, closes #5957)
+Files: src/testdir/test_blob.vim, src/testdir/test_cursor_func.vim,
+ src/testdir/test_eval.in, src/testdir/test_eval.ok,
+ src/testdir/test_eval_func.vim, src/testdir/test_eval_stuff.vim,
+ src/testdir/test_expr.vim, src/testdir/test_filter_map.vim,
+ src/testdir/test_functions.vim, src/testdir/test_listdict.vim,
+ src/testdir/test_sort.vim, src/testdir/test_syntax.vim,
+ src/testdir/test_utf8.vim, src/testdir/test_vimscript.vim
+
+Patch 8.2.0611
+Problem: Vim9: no check for space before #comment.
+Solution: Add space checks.
+Files: src/eval.c, src/evalvars.c, src/ex_docmd.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0612
+Problem: Vim9: no check for space before #comment.
+Solution: Add space checks.
+Files: src/ex_eval.c, src/ex_cmds.c, src/regexp.c, src/proto/regexp.pro,
+ src/gui.c, src/highlight.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_sort.vim
+
+Patch 8.2.0613
+Problem: Vim9: no check for space before #comment.
+Solution: Add space checks.
+Files: src/highlight.c, src/menu.c, src/syntax.c,
+ src/testdir/test_vim9_script.vim,
+ runtime/lang/menu_de_de.latin1.vim
+
+Patch 8.2.0614
+Problem: Get ml_get error when deleting a line in 'completefunc'. (Yegappan
+ Lakshmanan)
+Solution: Lock the text while evaluating 'completefunc'.
+Files: src/insexpand.c, src/globals.h, src/edit.c, src/ex_getln.c,
+ src/undo.c, src/testdir/test_edit.vim, src/testdir/test_excmd.vim,
+ src/testdir/test_gf.vim, src/testdir/test_popup.vim,
+ src/testdir/test_ex_mode.vim, runtime/doc/insert.txt
+
+Patch 8.2.0615
+Problem: Regexp benchmark test is old style.
+Solution: Make it a new style test. Fix using a NULL list. Add more tests.
+ (Yegappan Lakshmanan, closes #5963)
+Files: src/evalbuffer.c, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Makefile,
+ src/testdir/bench_re_freeze.in, src/testdir/bench_re_freeze.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_bench_regexp.vim,
+ src/testdir/test_blob.vim, src/testdir/test_bufline.vim,
+ src/testdir/test_channel.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_functions.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_popupwin.vim, src/testdir/test_prompt_buffer.vim,
+ src/testdir/test_tagjump.vim, src/testdir/test_window_cmd.vim
+
+Patch 8.2.0616
+Problem: Build error when disabling the diff feature.
+Solution: Move parenthesis outside of #ifdef. (Tom Ryder)
+Files: src/drawline.c
+
+Patch 8.2.0617
+Problem: New error check triggers in Swedish menu.
+Solution: Insert backslash. (Mats Tegner, closes #5966)
+Files: runtime/lang/menu_sv_se.latin1.vim
+
+Patch 8.2.0618
+Problem: Echoing a null list results in no output. (Yegappan Lakshmanan)
+Solution: Return "[]" instead of NULL in echo_string_core().
+Files: src/eval.c, src/testdir/test_messages.vim
+
+Patch 8.2.0619
+Problem: Null dict is not handled like an empty dict.
+Solution: Fix the code and add tests. (Yegappan Lakshmanan, closes #5968)
+Files: src/dict.c, src/eval.c, src/testdir/test_blob.vim,
+ src/testdir/test_expr.vim, src/testdir/test_filter_map.vim,
+ src/testdir/test_let.vim, src/testdir/test_listdict.vim,
+ src/testdir/test_search.vim, src/testdir/test_unlet.vim,
+ src/testdir/test_usercommands.vim, src/testdir/test_vimscript.vim
+
+Patch 8.2.0620
+Problem: Error in menu translations.
+Solution: Insert a backslash before a space.
+Files: runtime/lang/menu_it_it.latin1.vim,
+ runtime/lang/menu_chinese_gb.936.vim
+
+Patch 8.2.0621
+Problem: After running tests asan files may remain.
+Solution: Clean up asan files with "make testclean".
+Files: src/testdir/Makefile, src/Makefile
+
+Patch 8.2.0622
+Problem: Haiku: GUI does not compile.
+Solution: Various fixes. (Emir Sarı, closes #5961)
+Files: Filelist, README.md, READMEdir/README_haiku.txt,
+ runtime/doc/os_haiku.txt, src/Makefile, src/beval.h,
+ src/gui_haiku.cc, src/proto/gui_haiku.pro
+
+Patch 8.2.0623
+Problem: Typo in test comment. (Christ van Willegen)
+Solution: Avoid mixing up a data structure with a body part.
+Files: src/testdir/test_listdict.vim
+
+Patch 8.2.0624
+Problem: Vim9: no check for space before #comment.
+Solution: Add space checks. Fix :throw with double quoted string.
+Files: src/usercmd.c, src/userfunc.c, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0625
+Problem: Vim9: confusing error when calling unknown function.
+Solution: Give error while compiling.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.0626
+Problem: Vim9: wrong syntax of function in Vim9 script.
+Solution: Give error for missing space. Implement :echomsg and :echoerr.
+ (closes #5670)
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h, src/userfunc.c,
+ src/eval.c, src/globals.h, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0627
+Problem: Vim9: error message does not work. (Yegappan Lakshmanan)
+Solution: Swap lines.
+Files: src/userfunc.c
+
+Patch 8.2.0628
+Problem: Error in menu translations.
+Solution: Insert a backslash before a space in one more file. (Shun Bai,
+ Emir Sarı)
+Files: runtime/lang/menu_zh_cn.utf-8.vim,
+ runtime/lang/menu_ca_es.latin1.vim,
+ runtime/lang/menu_cs_cz.iso_8859-2.vim,
+ runtime/lang/menu_cs_cz.utf-8.vim,
+ runtime/lang/menu_czech_czech_republic.1250.vim,
+ runtime/lang/menu_czech_czech_republic.ascii.vim,
+ runtime/lang/menu_da.utf-8.vim,
+ runtime/lang/menu_fi_fi.latin1.vim,
+ runtime/lang/menu_hu_hu.iso_8859-2.vim,
+ runtime/lang/menu_hu_hu.utf-8.vim,
+ runtime/lang/menu_is_is.latin1.vim,
+ runtime/lang/menu_no_no.latin1.vim, runtime/lang/menu_pt_br.vim,
+ runtime/lang/menu_pt_pt.vim,
+ runtime/lang/menu_sk_sk.iso_8859-2.vim,
+ runtime/lang/menu_sl_si.latin2.vim,
+ runtime/lang/menu_slovak_slovak_republic.1250.vim,
+ runtime/lang/menu_tr_tr.cp1254.vim,
+ runtime/lang/menu_tr_tr.iso_8859-9.vim,
+ runtime/lang/menu_tr_tr.utf-8.vim, runtime/lang/menu_vi_vn.vim
+
+Patch 8.2.0629
+Problem: Setting a boolean option to v:false does not work.
+Solution: Do not use the string representation of the value. (Christian
+ Brabandt, closes #5974)
+Files: src/evalvars.c, src/testdir/test_options.vim
+
+Patch 8.2.0630
+Problem: "make tags" does not cover Haiku GUI file.
+Solution: Add *.cc files.
+Files: src/Make_all.mak
+
+Patch 8.2.0631
+Problem: Haiku file formatted with wrong tabstop.
+Solution: Use normal tabstop. Fix white space.
+Files: src/gui_haiku.cc
+
+Patch 8.2.0632
+Problem: Crash when using Haiku.
+Solution: Lock the screen. (closes #5975, closes #5973)
+Files: src/screen.c
+
+Patch 8.2.0633
+Problem: Crash when using null partial in filter().
+Solution: Fix crash. Add more tests. (Yegappan Lakshmanan, closes #5976)
+Files: src/eval.c, src/testdir/test_blob.vim,
+ src/testdir/test_channel.vim, src/testdir/test_eval_stuff.vim,
+ src/testdir/test_execute_func.vim, src/testdir/test_expr.vim,
+ src/testdir/test_filter_map.vim, src/testdir/test_fold.vim,
+ src/testdir/test_functions.vim, src/testdir/test_let.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_partial.vim,
+ src/testdir/test_usercommands.vim
+
+Patch 8.2.0634
+Problem: Crash with null partial and blob.
+Solution: Check for NULL pointer. Add more tests. (Yegappan Lakshmanan,
+ closes #5984)
+Files: src/eval.c, src/list.c, src/testdir/test_blob.vim,
+ src/testdir/test_bufwintabinfo.vim, src/testdir/test_cd.vim,
+ src/testdir/test_channel.vim, src/testdir/test_cursor_func.vim,
+ src/testdir/test_eval_stuff.vim, src/testdir/test_expr.vim,
+ src/testdir/test_filter_map.vim, src/testdir/test_fnamemodify.vim,
+ src/testdir/test_functions.vim, src/testdir/test_getvar.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_messages.vim,
+ src/testdir/test_partial.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_tabpage.vim, src/testdir/test_vimscript.vim,
+ src/testdir/test_window_cmd.vim, src/testdir/test_window_id.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.0635
+Problem: When using 256 colors DarkYellow does not show expected color.
+Solution: Use color 3 instead of 130. (Romain Lafourcade, closes #5985)
+Files: src/highlight.c
+
+Patch 8.2.0636
+Problem: :messages does not show the maintainer when $LANG is unset.
+Solution: Call get_mess_lang() if available. (closes #5978)
+Files: src/message.c
+
+Patch 8.2.0637
+Problem: Incsearch highlighting does not work for ":sort!".
+Solution: Skip over the exclamation point. (closes #5983)
+Files: src/ex_getln.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_sort_02.dump
+
+Patch 8.2.0638
+Problem: MS-Windows: messages test fails.
+Solution: Clear environment variables.
+Files: src/testdir/test_messages.vim
+
+Patch 8.2.0639
+Problem: MS-Windows: messages test still fails.
+Solution: Filter out the maintainer message.
+Files: src/testdir/test_messages.vim
+
+Patch 8.2.0640
+Problem: Vim9: expanding `=expr` does not work.
+Solution: Find wildcards in not compiled commands. Reorganize test files.
+Files: Filelist, src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/vim9.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim,
+ src/testdir/Make_all.mak
+
+Patch 8.2.0641
+Problem: Vim9: `=expr` not expanded in :hardcopy and "syntax include".
+Solution: Add the EX_EXPAND flag. Expend "syntax include".
+Files: src/ex_cmds.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.0642
+Problem: Vim9: using invalid index.
+Solution: Check index for being valid. Fix memory leak.
+Files: src/vim9compile.c, src/clientserver.c
+
+Patch 8.2.0643 (after 8.2.0635)
+Problem: Terminal uses brown instead of dark yellow. (Romain Lafourcade)
+Solution: Use color index 3 instead of 130. (closes #5993)
+Files: src/terminal.c
+
+Patch 8.2.0644
+Problem: Insufficient testing for invalid function arguments.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5988)
+Files: runtime/doc/eval.txt, src/testdir/test_bufline.vim,
+ src/testdir/test_channel.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_expr.vim, src/testdir/test_functions.vim,
+ src/testdir/test_listener.vim, src/testdir/test_match.vim,
+ src/testdir/test_menu.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_registers.vim, src/testdir/test_reltime.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_textprop.vim,
+ src/testdir/test_window_cmd.vim, src/testdir/test_window_id.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.0645
+Problem: MS-Windows terminal: CTRL-C does not get to child job.
+Solution: Remove CREATE_NEW_PROCESS_GROUP from CreateProcessW(). (Nobuhiro
+ Takasaki, closes #5987)
+Files: src/terminal.c
+
+Patch 8.2.0646
+Problem: t_Co uses the value of $COLORS in the GUI. (Masato Nishihata)
+Solution: Ignore $COLORS for the GUI. (closes #5992)
+Files: src/os_unix.c, src/term.c
+
+Patch 8.2.0647
+Problem: MS-Windows: repeat count for events was not used.
+Solution: Check the repeat count. (Nobuhiro Takasaki, closes #5989)
+Files: src/os_win32.c
+
+Patch 8.2.0648
+Problem: Semicolon search does not work in first line.
+Solution: Allow the cursor to be in line zero. (Christian Brabandt,
+ closes #5996)
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.0649
+Problem: Undo problem when an InsertLeave autocommand resets undo. (Kutsan
+ Kaplan)
+Solution: Do not create a new undo block when leaving Insert mode.
+Files: src/edit.c, src/testdir/test_edit.vim
+
+Patch 8.2.0650
+Problem: Vim9: script function can be deleted.
+Solution: Disallow deleting script function. Delete functions when sourcing
+ a script again.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/evalfunc.c,
+ src/vim9compile.c, src/vim9execute.c, src/vim9script.c,
+ src/scriptfile.c, src/testing.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0651
+Problem: Old style benchmark test still in list of distributed files.
+Solution: Remove the files from the list.
+Files: Filelist
+
+Patch 8.2.0652 (after 8.2.0650)
+Problem: Compiler warning for char conversion.
+Solution: Use unsigned char buffer.
+Files: src/userfunc.c
+
+Patch 8.2.0653 (after 8.2.0650)
+Problem: using uninitialized pointer.
+Solution: Move assignment up. (John Marriott)
+Files: src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0654
+Problem: Building with Python fails.
+Solution: Add missing argument.
+Files: src/if_py_both.h
+
+Patch 8.2.0655
+Problem: Search code not sufficiently tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #5999)
+Files: src/testdir/test_charsearch.vim, src/testdir/test_gn.vim,
+ src/testdir/test_goto.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_normal.vim, src/testdir/test_search.vim,
+ src/testdir/test_textformat.vim, src/testdir/test_textobjects.vim,
+ src/testdir/test_visual.vim
+
+Patch 8.2.0656
+Problem: MS-Windows: redrawing right screen edge may not be needed.
+Solution: Check the build version. (Nobuhiro Takasaki, closes #6002)
+Files: src/drawscreen.c, src/os_win32.c, src/proto/os_win32.pro
+
+Patch 8.2.0657
+Problem: Vim9: no check if called variable is a FuncRef.
+Solution: Add a type check.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0658 (after 8.2.0646)
+Problem: HP-UX build fails when setenv() is not defined.
+Solution: Change "colors" to "t_colors". (John Marriott)
+Files: src/os_unix.c
+
+Patch 8.2.0659
+Problem: Vim9: no test for equal func type.
+Solution: Add a test. Improve type check.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0660
+Problem: The search.c file is a bit big.
+Solution: Split off the text object code to a separate file. (Yegappan
+ Lakshmanan, closes #6007)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/proto.h, src/proto/search.pro, src/proto/textobject.pro,
+ src/search.c, src/textobject.c
+
+Patch 8.2.0661
+Problem: Eval test is still old style.
+Solution: Change into new style tests. (Yegappan Lakshmanan, closes #6009)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test_eval.in, src/testdir/test_eval.ok,
+ src/testdir/test_eval_stuff.vim
+
+Patch 8.2.0662
+Problem: Cannot use input() in a channel callback.
+Solution: Reset vgetc_busy. (closes #6010)
+Files: src/globals.h, src/ex_getln.c, src/evalfunc.c,
+ src/testdir/test_channel.vim
+
+Patch 8.2.0663
+Problem: Not all systemd temp files are recognized.
+Solution: Add two more patterns. (Jamie Macdonald, closes #6003)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0664
+Problem: Included undesired changes in Makefile.
+Solution: Revert the changes.
+Files: src/Makefile
+
+Patch 8.2.0665
+Problem: Wrongly assuming Python executable is called "python".
+Solution: Use detected python command. (Ken Takata, closes #6016)
+ Also use CheckFunction if possible.
+Files: src/testdir/test_terminal.vim, src/testdir/check.vim
+
+Patch 8.2.0666
+Problem: Ruby test fails on MS-Windows.
+Solution: Remove the "maintainer" line. (Ken Takata, closes #6015)
+Files: src/testdir/shared.vim, src/testdir/test_messages.vim,
+ src/testdir/test_ruby.vim
+
+Patch 8.2.0667
+Problem: Cannot install Haiku version from source.
+Solution: Update Makefile and rdef file. (Emir Sarı, closes #6013)
+Files: Filelist, READMEdir/README_haiku.txt, runtime/doc/os_haiku.txt,
+ src/Makefile, src/os_haiku.rdef.in, src/os_haiku.rdef
+
+Patch 8.2.0668
+Problem: Compiler warning for int/size_t usage.
+Solution: Change "int" to "size_t". (Mike Williams)
+Files: src/vim9execute.c
+
+Patch 8.2.0669
+Problem: MS-Windows: display in VTP is a bit slow.
+Solution: Optimize the code. (Nobuhiro Takasaki, closes #6014)
+Files: src/os_win32.c, src/screen.c
+
+Patch 8.2.0670
+Problem: Cannot change window when evaluating 'completefunc'.
+Solution: Make a difference between not changing text or buffers and also
+ not changing window.
+Files: src/ex_getln.c, src/beval.c, src/change.c, src/edit.c, src/eval.c,
+ src/ex_docmd.c, src/insexpand.c, src/globals.h, src/indent.c,
+ src/map.c, src/window.c, src/proto/ex_getln.pro, src/register.c,
+ src/undo.c, src/testdir/test_edit.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_popup.vim
+
+Patch 8.2.0671
+Problem: Haiku: compiler warnings.
+Solution: Avoid the warnings. Drop display_errors() copy. (Emir Sarı,
+ closes #6018)
+Files: .gitignore, src/gui.c, src/gui_haiku.cc
+
+Patch 8.2.0672
+Problem: Heredoc in scripts does not accept lower case marker.
+Solution: Allow lower case only in non-Vim scripts. (Ken Takata,
+ closes #6019)
+Files: src/evalvars.c, src/testdir/test_lua.vim,
+ src/testdir/test_perl.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/testdir/test_pyx2.vim,
+ src/testdir/test_pyx3.vim, src/testdir/test_ruby.vim
+
+Patch 8.2.0673
+Problem: Cannot build Haiku in shadow directory.
+Solution: Add symlink. (Ozaki Kiichi, closes #6023)
+Files: src/Makefile
+
+Patch 8.2.0674
+Problem: Some source files are too big.
+Solution: Move text formatting functions to a new file. (Yegappan
+ Lakshmanan, closes #6021)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/edit.c, src/getchar.c, src/ops.c, src/option.c, src/proto.h,
+ src/proto/edit.pro, src/proto/getchar.pro, src/proto/ops.pro,
+ src/proto/option.pro, src/proto/textformat.pro, src/textformat.c
+
+Patch 8.2.0675
+Problem: Vim9: no support for closures.
+Solution: Do not re-use stack entries.
+Files: src/vim9compile.c, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/evalvars.c, src/proto/evalvars.pro
+
+Patch 8.2.0676
+Problem: Pattern in list of distributed files does not match.
+Solution: Drop "testdir/test_[a-z]*.ok". Add CI sed files.
+Files: Filelist
+
+Patch 8.2.0677
+Problem: Vim9: no support for closures.
+Solution: Find variables in the outer function scope, so long as the scope
+ exists.
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/userfunc.c,
+ src/vim9execute.c, src/structs.h, src/vim9.h,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.0678
+Problem: Rare crash for popup menu.
+Solution: Check for NULL pointer. (Nobuhiro Takasaki, closes #6027)
+Files: src/popupmenu.c
+
+Patch 8.2.0679
+Problem: Vim9: incomplete support for closures.
+Solution: At the end of a function copy arguments and local variables if
+ they are still used by a referenced closure.
+Files: src/structs.h, src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.0680
+Problem: PTYGROUP and PTYMODE are unused.
+Solution: Remove from autoconf. (closes #6024)
+Files: src/configure.ac, src/auto/configure, src/config.h.in
+
+Patch 8.2.0681
+Problem: Pattern for 'hlsearch' highlighting may leak. (Dominique Pellé)
+Solution: Call end_search_hl() to make sure the previous pattern is freed.
+ (closes #6028)
+Files: src/screen.c
+
+Patch 8.2.0682
+Problem: Vim9: parsing function argument type can get stuck.
+Solution: Bail out when not making progress.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0683
+Problem: Vim9: parsing type does not always work.
+Solution: Handle func type without return value. Test more closures.
+ Fix type check offset. Fix garbage collection.
+Files: src/vim9compile.c, src/vim9execute.c, src/proto/vim9execute.pro,
+ src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0684
+Problem: Vim9: memory leak when using lambda.
+Solution: Move the funccal context to the partial. Free the function when
+ exiting.
+Files: src/vim9.h, src/structs.h, src/vim9execute.c, src/userfunc.c,
+ src/eval.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0685 (after 8.2.0684)
+Problem: Build failure.
+Solution: Include missing changes.
+Files: src/vim9compile.c
+
+Patch 8.2.0686
+Problem: Formatoptions not sufficiently tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #6031)
+Files: src/testdir/test_normal.vim, src/testdir/test_textformat.vim
+
+Patch 8.2.0687
+Problem: Some tests do not work on FreeBSD.
+Solution: Enable modeline. Use WaitFor() in more cases. (Ozaki Kiichi,
+ closes #6036)
+Files: src/testdir/test_quickfix.vim, src/testdir/test_terminal.vim
+
+Patch 8.2.0688
+Problem: Output clobbered if setting 'verbose' to see shell commands.
+Solution: Only output "Searching for" when 'verbose' is 11 or higher.
+Files: src/scriptfile.c, runtime/doc/options.txt
+
+Patch 8.2.0689
+Problem: When using getaddrinfo() the error message is unclear.
+Solution: Use gai_strerror() to get the message. (Ozaki Kiichi,
+ closes #6034)
+Files: src/channel.c
+
+Patch 8.2.0690
+Problem: Line number of option set by modeline is wrong.
+Solution: Do not double the line number. (Ozaki Kiichi, closes #6035)
+Files: src/option.c, src/testdir/test_modeline.vim
+
+Patch 8.2.0691
+Problem: Startup test fails.
+Solution: Adjust expected output from -V2 argument.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.0692
+Problem: Startup test fails on MS-Windows.
+Solution: Allow for any path.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.0693
+Problem: Closure using argument not tested.
+Solution: Add a test, make it work.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0694
+Problem: Haiku: channel and terminal do not work.
+Solution: Close files when the job has finished. (Ozaki Kiichi,
+ closes #6039)
+Files: src/channel.c, src/getchar.c, src/gui_haiku.cc, src/misc1.c
+
+Patch 8.2.0695
+Problem: Vim9: cannot define a function inside a function.
+Solution: Initial support for :def inside :def.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/vim9compile.c,
+ src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0696
+Problem: Vim9: nested function does not work properly
+Solution: Create a function reference. Check argument count.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.0697
+Problem: Vim9: memory leak when using nested function.
+Solution: Unreference function when deleting instructions. Adjust reference
+ count for local variables.
+Files: src/vim9compile.c, src/vim9execute.c
+
+Patch 8.2.0698
+Problem: Insert mode completion not fully tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #6041)
+Files: src/testdir/test_edit.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_textformat.vim
+
+Patch 8.2.0699
+Problem: Vim9: not all errors tested.
+Solution: Add test for deleted function. Bail out on first error.
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/vim9.vim
+
+Patch 8.2.0700
+Problem: Vim9: converting error message to exception not tested.
+Solution: Test exception from error. Do not continue after :echoerr.
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0701
+Problem: Vim9 test fails without job feature.
+Solution: Add feature check.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0702
+Problem: Running channel tests may leave running process behind.
+Solution: Make Python client exit when running into EOF. (Kurtis Rader,
+ part of #6046)
+Files: src/testdir/test_channel_pipe.py
+
+Patch 8.2.0703
+Problem: Vim9: closure cannot store value in outer context.
+Solution: Make storing value in outer context work. Make :disassemble
+ accept a function reference.
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h, src/eval.c,
+ src/structs.h, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.0704
+Problem: Vim9: memory leak in disassemble test.
+Solution: Decrement refcount when creating funccal.
+Files: src/vim9execute.c
+
+Patch 8.2.0705
+Problem: Indent tests don't run on CI for FreeBSD.
+Solution: Set modeline. (Ozaki Kiichi, closes #6048)
+Files: .cirrus.yml, runtime/indent/testdir/runtest.vim
+
+Patch 8.2.0706
+Problem: Vim9: using assert_fails() causes function to finish.
+Solution: Check did_emsg instead of called_emsg.
+Files: src/vim9execute.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0707
+Problem: Vim9 function test fails.
+Solution: Adjust expected error code.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.0708
+Problem: Vim9: constant expressions are not simplified.
+Solution: Simplify string concatenation.
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0709
+Problem: MS-Windows: compiler warning for int vs size_t.
+Solution: Add type cast. (Mike Williams)
+Files: src/channel.c
+
+Patch 8.2.0710
+Problem: Netbeans test sometimes fails.
+Solution: Mark any test using an external command as flaky.
+Files: src/testdir/shared.vim
+
+Patch 8.2.0711
+Problem: With a long running Vim the temp directory might be cleared on
+ some systems.
+Solution: Lock the temp directory. (closes #6044)
+Files: src/config.h.in, src/configure.ac, src/auto/configure,
+ src/fileio.c, src/globals.h, src/os_unix.h
+
+Patch 8.2.0712
+Problem: Various code not fully tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #6049)
+Files: src/testdir/test_functions.vim, src/testdir/test_options.vim,
+ src/testdir/test_system.vim, src/testdir/test_termcodes.vim
+
+Patch 8.2.0713
+Problem: The pam_environment file is not recognized.
+Solution: Add a filetype pattern for pamenv. (closes #6051)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0714
+Problem: Vim9: handling constant expression does not scale.
+Solution: Use another solution, passing typval_T.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0715
+Problem: Vim9: leaking memory.
+Solution: Free strings after concatenating them.
+Files: src/vim9compile.c
+
+Patch 8.2.0716
+Problem: Vim9: another memory leak.
+Solution: Clear typval when failing.
+Files: src/vim9compile.c
+
+Patch 8.2.0717
+Problem: Vim9: postponed constant expressions does not scale.
+Solution: Add a structure to pass around postponed constants.
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0718
+Problem: Gcc warning for returning pointer to local variable. (John
+ Marriott)
+Solution: Return another pointer.
+Files: src/evalvars.c
+
+Patch 8.2.0719
+Problem: Vim9: more expressions can be evaluated at compile time
+Solution: Recognize has('name').
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0720
+Problem: Occasional exit when encountering an X error. (Manfred Lotz)
+Solution: On an X error do not exit, do preserve files.
+Files: src/os_unix.c
+
+Patch 8.2.0721
+Problem: Vim9: leaking memory when skipping.
+Solution: Disable skipping in generate_ppconst().
+Files: src/vim9compile.c
+
+Patch 8.2.0722
+Problem: Vim9: not handling constant expression for elseif.
+Solution: Use postponed constants. Delete the code for evaluating a
+ constant expression.
+Files: src/vim9compile.c
+
+Patch 8.2.0723
+Problem: Vim9: nested constant expression not evaluated compile time.
+Solution: Use compile_expr1() for parenthesis.
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0724
+Problem: Vim9: appending to buffer/window/tab variable not tested
+Solution: Add a test.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0725
+Problem: Vim9: cannot call a function declared later in Vim9 script.
+Solution: Make two passes through the script file.
+Files: src/scriptfile.c, src/proto/scriptfile.pro, src/vim9script.c,
+ src/vim9compile.c, src/vim9execute.c, src/proto/vim9compile.pro,
+ src/userfunc.c, src/proto/userfunc.pro, src/evalvars.c,
+ src/proto/evalvars.pro, src/vim.h,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0726
+Problem: Vim9: leaking memory when calling not compiled :def function.
+Solution: Check if function is compiled earlier.
+Files: src/vim9execute.c
+
+Patch 8.2.0727
+Problem: MS-Windows: new gcc compiler does not support scanf format.
+Solution: Use "%ll" instead of "%I". (Ken Takata)
+Files: src/vim.h
+
+Patch 8.2.0728
+Problem: Messages about a deadly signal are not left aligned.
+Solution: Output a CR before the NL. (Dominique Pellé, #6055)
+Files: src/misc1.c, src/os_unix.c
+
+Patch 8.2.0729
+Problem: Vim9: When reloading a script variables are not cleared.
+Solution: When sourcing a script again clear all script-local variables.
+Files: src/dict.c, src/proto/dict.pro, src/scriptfile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0730
+Problem: Vim9: Assignment to dict member does not work.
+Solution: Parse dict assignment. Implement getting dict member.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c, src/globals.h,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0731
+Problem: Vim9: parsing declarations continues after :finish.
+Solution: Bail out when encountering :finish.
+Files: src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0732
+Problem: Vim9: storing value in dict messes up stack.
+Solution: Correct item count of stack.
+Files: src/vim9execute.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.0733
+Problem: Vim9: assigning to dict or list argument does not work.
+Solution: Recognize an argument as assignment target.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0734
+Problem: Vim9: leaking memory when using :finish.
+Solution: Do not check for next line in third pass.
+Files: src/scriptfile.c
+
+Patch 8.2.0735
+Problem: Vim9: using uninitialized memory.
+Solution: Clear the arg_lvar field.
+Files: src/vim9compile.c
+
+Patch 8.2.0736
+Problem: Some files not recognized as pamenv.
+Solution: Add pam_inv.conf. (closes #6065)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0737
+Problem: When shell doesn't support CTRL-Z Vim still handles it.
+Solution: Ignore the STOP signal if it was ignored on startup.
+ (Kurtis Rader, closes #5990, closes #6058)
+Files: src/os_unix.c
+
+Patch 8.2.0738
+Problem: Mouse handling in a terminal window not well tested.
+Solution: Add tests. (Yegappan Lakshmanan, closes #6052)
+Files: src/testdir/term_util.vim, src/testdir/test_gui.vim,
+ src/testdir/test_modeless.vim, src/testdir/test_terminal.vim
+
+Patch 8.2.0739
+Problem: Incomplete profiling when exiting because of a deadly signal.
+Solution: Call __gcov_flush() if available.
+Files: src/os_unix.c, src/Makefile, .travis.yml
+
+Patch 8.2.0740
+Problem: Minor message mistakes.
+Solution: Change vim to Vim and other fixes.
+Files: src/if_py_both.h, src/if_tcl.c, src/main.c
+
+Patch 8.2.0741
+Problem: Python tests fail because of changed message.
+Solution: Adjust the expected messages (Dominique Pellé, closes #6066)
+Files: src/testdir/test86.ok, src/testdir/test87.ok
+
+Patch 8.2.0742
+Problem: Handling of a TERM signal not tested.
+Solution: Add a test for SIGTERM. (Dominique Pellé, closes #6055)
+Files: src/testdir/test_signals.vim
+
+Patch 8.2.0743
+Problem: Can move to another buffer from a terminal in popup window.
+Solution: Do not allow "gf" or editing a file. (closes #6072)
+Files: src/normal.c, src/ex_cmds.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.0744
+Problem: The name vim is not capitalized in a message.
+Solution: Use "Vim" instead of "vim".
+Files: src/main.c
+
+Patch 8.2.0745
+Problem: Crash on exit when not all popups are closed.
+Solution: Close popups when freeing all memory. Disable checking for popup
+ when editing a file for now.
+Files: src/misc2.c, src/ex_cmds.c
+
+Patch 8.2.0746
+Problem: popup_clear() hangs when a popup can't be closed.
+Solution: Bail out when a popup can't be closed.
+Files: src/popupwin.c, src/proto/popupwin.pro
+
+Patch 8.2.0747
+Problem: Cannot forcefully close all popups.
+Solution: Add the "force" argument to popup_clear(). Use it after running a
+ test. Put back the check for a popup when editing a file.
+Files: runtime/doc/popup.txt, src/evalfunc.c, src/popupwin.c,
+ src/proto/popupwin.pro, src/tag.c, src/window.c, src/misc2.c,
+ src/ex_cmds.c, src/channel.c, src/testdir/runtest.vim,
+ src/testdir/test_terminal.vim
+
+Patch 8.2.0748
+Problem: Cannot get a list of all popups.
+Solution: Add popup_list(). Use it in the test runner.
+Files: runtime/doc/eval.txt, runtime/doc/popup.txt, src/popupwin.c,
+ src/proto/popupwin.pro, src/evalfunc.c,
+ src/testdir/test_popupwin.vim, src/testdir/runtest.vim
+
+Patch 8.2.0749
+Problem: TERM signal test fails on FreeBSD.
+Solution: Do not check the messages, the may appear anywhere. (Dominique
+ Pellé, closes #6075)
+Files: src/testdir/test_signals.vim
+
+Patch 8.2.0750
+Problem: Netbeans test is a bit flaky.
+Solution: Allow for standard sign to be defined. Use WaitForAssert().
+Files: src/testdir/test_netbeans.vim
+
+Patch 8.2.0751
+Problem: Vim9: performance can be improved.
+Solution: Don't call break. Inline check for list materialize. Make an
+ inline version of ga_grow().
+Files: src/macros.h, src/evalfunc.c, src/misc2.c,
+ src/proto/misc2.pro, src/channel.c, src/eval.c, src/evalbuffer.c,
+ src/evalvars.c, src/filepath.c, src/highlight.c, src/insexpand.c,
+ src/json.c, src/list.c, src/popupmenu.c, src/popupwin.c,
+ src/userfunc.c, src/if_py_both.h
+
+Patch 8.2.0752
+Problem: Terminal in popup window test is a bit flaky.
+Solution: Wait for shell job status to be "run". Mark as flaky test.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.0753
+Problem: Vim9: expressions are evaluated in the discovery phase.
+Solution: Bail out if an expression is not a constant. Require a type for
+ declared constants.
+Files: src/vim.h, src/evalvars.c, src/eval.c, src/ex_eval.c,
+ src/evalfunc.c, src/userfunc.c, src/dict.c, src/list.c,
+ src/vim9compile.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0754
+Problem: Vim9: No test for forward declaration.
+Solution: Add a test.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0755
+Problem: Vim9: No error when variable initializer is not a constant.
+Solution: Return FAIL when trying to get a variable value. Do not execute a
+ script when an error is detected in the first or second phase.
+Files: src/eval.c, src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0756 (after 8.2.0249)
+Problem: MS-Windows: still a compiler warning.
+Solution: Move flag to another place in the Makefile. (Ken Takata,
+ closes #6083)
+Files: src/Make_mvc.mak
+
+Patch 8.2.0757
+Problem: Vim9: no test for MEMBER instruction.
+Solution: Add a test. Make matches stricter.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0758
+Problem: Vim9: no test for STORELIST and STOREDICT.
+Solution: Add a test. Make matches stricter.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.0759 (after 8.2.0751)
+Problem: Vim9: missing changes for performance improvements
+Solution: Use GA_GROW(). Don't call breakcheck so often.
+Files: src/vim9execute.c
+
+Patch 8.2.0760
+Problem: Vim9: dict member errors not tested.
+Solution: Delete unreachable error. Add tests.
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0761
+Problem: Vim9: instructions not tested
+Solution: Use a variable instead of a constant.
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0762
+Problem: Buffer is not considered modified after setting crypt key.
+Solution: Set the modified flag. (Christian Brabandt, closes #6082)
+Files: src/optionstr.c, src/testdir/test_crypt.vim
+
+Patch 8.2.0763
+Problem: GUI test fails without the terminal feature.
+Solution: Check the terminal feature is supported. (Ken Takata,
+ closes #6084)
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.0764
+Problem: Vim9: assigning to option not fully tested.
+Solution: Add more test cases. Allow using any type for assignment.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0765
+Problem: In the GUI can't use all the modifiers. (Andri Möll)
+Solution: Do not apply Alt/Meta early, do it later like with the terminal.
+ Avoid the Motif test from crashing.
+Files: src/gui_gtk_x11.c, src/gui_x11.c, src/gui_mac.c, src/gui_w32.c,
+ src/gui_motif.c
+
+Patch 8.2.0766
+Problem: Display error when using 'number' and 'breakindent'.
+Solution: Adjust extra spaces in the first row. (Ken Takata, closes #6089,
+ closes #5986)
+Files: src/drawline.c, src/testdir/test_breakindent.vim
+
+Patch 8.2.0767
+Problem: ModifyOtherKeys active when using a shell command in autocmd.
+Solution: Output T_CTE when going to cooked mode. (closes 5617)
+Files: src/term.c
+
+Patch 8.2.0768
+Problem: Vim9: memory leak in script test.
+Solution: Clear typval before giving an error message.
+Files: src/vim9execute.c
+
+Patch 8.2.0769
+Problem: VimLeavePre not triggered when Vim is terminated.
+Solution: Unblock autocommands.
+Files: src/main.c, src/testdir/test_signals.vim
+
+Patch 8.2.0770
+Problem: Cannot map CTRL-B when using the GUI.
+Solution: Reset the CTRL modifier when used. (closes #6092)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.0771
+Problem: Vim9: cannot call a compiled closure from not compiled code.
+Solution: Pass funcexe to call_user_func().
+Files: src/userfunc.c, src/vim9execute.c, src/proto/vim9execute.pro,
+ src/eval.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.0772
+Problem: Vim9: some variable initializations not tested.
+Solution: Add a few more tests
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0773
+Problem: Switching to raw mode every time ":" is used.
+Solution: When executing a shell set cur_tmode to TMODE_UNKNOWN, so that the
+ next time TMODE_RAW is used it is set, but not every time.
+Files: src/term.h, src/os_unix.c, src/term.c, src/os_amiga.c,
+ src/os_win32.c
+
+Patch 8.2.0774
+Problem: t_TI and t_TE are output when using 'visualbell'. (Dominique
+ Pellé)
+Solution: Do not change the terminal mode for a short sleep. Do not output
+ t_TI and t_TE when switching to/from TMODE_SLEEP. Make tmode an
+ enum.
+Files: src/os_unix.c, src/proto/os_unix.pro, src/os_amiga.c,
+ src/proto/os_amiga.pro, src/os_mswin.c, src/proto/os_mswin.pro,
+ src/os_vms.c, src/proto/os_vms.pro, src/os_win32.c,
+ src/proto/os_win32.pro, src/term.c, src/term.h, src/globals.h
+
+Patch 8.2.0775
+Problem: Not easy to call a Vim function from Lua.
+Solution: Add vim.call() and vim.fn(). (Prabir Shrestha, closes #6063)
+Files: runtime/doc/if_lua.txt, src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.0776
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revision 719.
+Files: Filelist, src/libvterm/README, src/libvterm/Makefile,
+ src/libvterm/find-wide-chars.pl, src/libvterm/src/fullwidth.inc,
+ src/libvterm/src/unicode.c
+
+Patch 8.2.0777 (after 8.2.0776)
+Problem: Terminal test fails.
+Solution: Adjust character position for double-wide characters.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0778
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 720 - 723.
+Files: src/libvterm/t/10state_putglyph.test, src/libvterm/Makefile,
+ src/libvterm/t/run-test.pl, src/libvterm/src/state.c,
+ src/libvterm/t/92lp1805050.test
+
+Patch 8.2.0779
+Problem: Tmode_T not used everywhere.
+Solution: Also use tmode_T for settmode().
+Files: src/term.c, src/proto/term.pro
+
+Patch 8.2.0780
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 724 - 726.
+Files: Filelist, src/libvterm/t/40screen_ascii.test,
+ src/libvterm/t/60screen_ascii.test,
+ src/libvterm/t/41screen_unicode.test,
+ src/libvterm/t/61screen_unicode.test,
+ src/libvterm/t/42screen_damage.test,
+ src/libvterm/t/62screen_damage.test,
+ src/libvterm/t/43screen_resize.test,
+ src/libvterm/t/63screen_resize.test,
+ src/libvterm/t/44screen_pen.test,
+ src/libvterm/t/64screen_pen.test,
+ src/libvterm/t/45screen_protect.test,
+ src/libvterm/t/65screen_protect.test,
+ src/libvterm/t/46screen_extent.test,
+ src/libvterm/t/66screen_extent.test,
+ src/libvterm/t/47screen_dbl_wh.test,
+ src/libvterm/t/67screen_dbl_wh.test,
+ src/libvterm/t/48screen_termprops.test,
+ src/libvterm/t/68screen_termprops.test, src/libvterm/t/30pen.test,
+ src/libvterm/t/30state_pen.test, src/libvterm/t/92lp1805050.test,
+ src/libvterm/t/31state_rep.test, src/libvterm/doc/seqs.txt
+
+Patch 8.2.0781 (after 8.2.0775)
+Problem: Compiler warning for not using value in Lua.
+Solution: Add "(void)".
+Files: src/if_lua.c
+
+Patch 8.2.0782
+Problem: Cannot build with Lua on MS-Windows.
+Solution: Add DLL symbol for luaL_Loadstring. (Ken Takata)
+Files: src/if_lua.c
+
+Patch 8.2.0783
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 728 - 729.
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Makefile,
+ src/libvterm/src/keyboard.c, src/libvterm/t/25state_input.test,
+ src/libvterm/t/harness.c, src/libvterm/src/vterm.c,
+ src/libvterm/src/vterm_internal.h,
+ src/libvterm/t/26state_query.test
+
+Patch 8.2.0784
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 730 - 733.
+Files: src/libvterm/src/vterm.c, src/libvterm/src/state.c,
+ src/libvterm/include/vterm.h, src/libvterm/src/vterm_internal.h,
+ src/libvterm/t/harness.c
+
+Patch 8.2.0785
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 734 - 740.
+Files: src/libvterm/include/vterm.h, src/libvterm/src/pen.c,
+ src/libvterm/src/vterm.c, src/libvterm/doc/seqs.txt,
+ src/libvterm/t/30state_pen.test, src/libvterm/t/run-test.pl,
+ src/libvterm/Makefile, src/libvterm/CONTRIBUTING
+
+Patch 8.2.0786
+Problem: Channel test is flaky on FreeBSD.
+Solution: Set the socket TCP_NODELAY option. Adjust expected line count in
+ netbeans test. (Ozaki Kiichi, closes #6097)
+Files: src/testdir/test_channel.py, src/testdir/test_netbeans.vim
+
+Patch 8.2.0787
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 741 - 742.
+Files: Filelist, src/libvterm/src/screen.c
+
+Patch 8.2.0788
+Problem: Memory leak in libvterm.
+Solution: free tmpbuffer.
+Files: src/libvterm/src/vterm.c
+
+Patch 8.2.0789
+Problem: Vim9: expression testing lost coverage using constants.
+Solution: Use a few variables instead of constants.
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.0790
+Problem: Vim9: list index not well tested.
+Solution: Add a few more tests.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0791
+Problem: A second popup window with terminal causes trouble.
+Solution: Disallow opening a second terminal-popup window. (closes #6101,
+ closes #6103) Avoid defaulting to an invalid line number.
+Files: runtime/doc/popup.txt, src/popupwin.c, src/ex_docmd.c,
+ src/testdir/test_popupwin.vim, src/testdir/test_terminal.vim
+
+Patch 8.2.0792
+Problem: Build failure with small features.
+Solution: Add #ifdef.
+Files: src/popupwin.c
+
+Patch 8.2.0793
+Problem: MS-Windows: cannot build GUI with small features. (Michael Soyka)
+Solution: Add #ifdef around use of windowsVersion. (Ken Takata)
+Files: src/os_win32.c
+
+Patch 8.2.0794
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 743 - 747.
+Files: src/libvterm/src/state.c, src/libvterm/src/screen.c,
+ src/libvterm/src/vterm_internal.h, src/libvterm/include/vterm.h,
+ src/libvterm/t/67screen_dbl_wh.test, src/libvterm/t/run-test.pl
+
+Patch 8.2.0795
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 748 - 754.
+Files: src/libvterm/include/vterm.h, src/libvterm/src/screen.c,
+ src/libvterm/src/state.c, src/libvterm/t/32state_flow.test,
+ src/libvterm/t/60screen_ascii.test,
+ src/libvterm/t/62screen_damage.test,
+ src/libvterm/t/63screen_resize.test, src/libvterm/t/harness.c,
+ src/libvterm/t/run-test.pl
+
+Patch 8.2.0796
+Problem: MS-Windows: compiler can't handle C99 construct in libvterm.
+Solution: Change to C90 construct.
+Files: src/libvterm/src/state.c
+
+Patch 8.2.0797
+Problem: MS-Windows: compiler still can't handle C99 construct.
+Solution: Change to C90 construct. (Dominique Pellé, closes #6106)
+Files: src/libvterm/src/state.c
+
+Patch 8.2.0798
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 755 - 758.
+Files: src/libvterm/t/run-test.pl, src/libvterm/src/screen.c,
+ src/libvterm/t/harness.c, src/libvterm/include/vterm.h,
+ src/libvterm/src/parser.c, src/libvterm/src/state.c,
+ src/libvterm/src/vterm.c, src/libvterm/src/vterm_internal.h,
+ src/libvterm/t/02parser.test,
+ src/libvterm/t/18state_termprops.test,
+ src/libvterm/t/29state_fallback.test,
+ src/libvterm/t/68screen_termprops.test, src/terminal.c
+
+Patch 8.2.0799
+Problem: Build fails if snprintf is not available.
+Solution: Use vim_snprintf().
+Files: src/libvterm/src/state.c
+
+Patch 8.2.0800
+Problem: Errors from failing test are unclear.
+Solution: Include text where parsing failed.
+Files: src/json.c, src/testdir/test_json.vim
+
+Patch 8.2.0801
+Problem: Terminal test fails on Mac.
+Solution: Concatenate OSC pieces.
+Files: src/terminal.c
+
+Patch 8.2.0802
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 759 - 762.
+Files: src/terminal.c, src/libvterm/doc/seqs.txt,
+ src/libvterm/include/vterm.h, src/libvterm/src/pen.c,
+ src/libvterm/src/screen.c, src/libvterm/src/state.c,
+ src/libvterm/src/vterm.c, src/libvterm/src/vterm_internal.h,
+ src/libvterm/t/harness.c, src/libvterm/t/12state_scroll.test
+
+Patch 8.2.0803
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revisions 764 - 767
+Files: src/Makefile, src/libvterm/src/parser.c,
+ src/libvterm/src/vterm_internal.h, src/libvterm/t/02parser.test,
+ src/libvterm/t/run-test.pl, src/libvterm/find-wide-chars.pl,
+ src/libvterm/src/fullwidth.inc
+
+Patch 8.2.0804
+Problem: Libvterm code lags behind the upstream version.
+Solution: Include revision 727, but add the index instead of switching
+ between RGB and indexed.
+Files: src/terminal.c, src/term.c, src/libvterm/include/vterm.h,
+ src/libvterm/src/pen.c, src/libvterm/src/screen.c,
+ src/libvterm/src/vterm_internal.h,
+ src/libvterm/t/30state_pen.test,
+ src/libvterm/t/harness.c, src/libvterm/src/state.c,
+ src/libvterm/t/26state_query.test,
+ src/libvterm/t/64screen_pen.test
+
+Patch 8.2.0805
+Problem: Terminal key codes test fails on some systems.
+Solution: Skip keypad 3 and 9. (Yegappan Lakshmanan, closes #6070)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0806
+Problem: using "func!" after vim9script gives confusing error.
+Solution: Give E477. (closes #6107)
+Files: src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0807
+Problem: Cannot easily restore a mapping.
+Solution: Add mapset().
+Files: runtime/doc/eval.txt, src/map.c, src/proto/map.pro, src/evalfunc.c
+ src/testdir/test_maparg.vim
+
+Patch 8.2.0808
+Problem: Not enough testing for the terminal window.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #6069) Fix memory
+ leak.
+Files: src/testdir/test_gui.vim, src/testdir/test_terminal.vim,
+ src/terminal.c
+
+Patch 8.2.0809
+Problem: Build failure with small features. (Tony Mechelynck)
+Solution: Move "expr" inside #ifdef.
+Files: src/map.c
+
+Patch 8.2.0810
+Problem: Error when appending "tagfile" to 'wildoptions'.
+Solution: use flags P_ONECOMMA and P_NODUP. (Dmitri Vereshchagin,
+ closes #6105)
+Files: src/optiondefs.h, src/testdir/test_options.vim
+
+Patch 8.2.0811
+Problem: Terminal keycode test is flaky.
+Solution: Use WaitForAssert()
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.0812
+Problem: mapset() does not properly handle <> notation.
+Solution: Convert <> codes. (closes #6116)
+Files: src/map.c, src/testdir/test_maparg.vim
+
+Patch 8.2.0813
+Problem: libvterm code is slightly different from upstream.
+Solution: Use upstream text to avoid future merge problems. Mainly comment
+ style changes.
+Files: src/libvterm/include/vterm.h, src/libvterm/src/rect.h,
+ src/libvterm/src/utf8.h, src/libvterm/src/vterm_internal.h,
+ src/libvterm/src/encoding.c, src/libvterm/src/keyboard.c,
+ src/libvterm/src/mouse.c, src/libvterm/src/parser.c,
+ src/libvterm/src/pen.c, src/libvterm/src/screen.c,
+ src/libvterm/src/state.c, src/libvterm/src/unicode.c,
+ src/libvterm/src/vterm.c
+
+Patch 8.2.0814
+Problem: Clang warning for implicit conversion.
+Solution: Add type cast. (Dominique Pellé, closes #6124)
+Files: src/evalfunc.c
+
+Patch 8.2.0815
+Problem: maparg() does not provide enough information for mapset().
+Solution: Add "lhsraw" and "lhsrawalt" items. Drop "simplified"
+Files: src/map.c, runtime/doc/eval.txt, src/testdir/test_maparg.vim
+
+Patch 8.2.0816
+Problem: Terminal test fails when compiled with Athena.
+Solution: Do give an error when the GUI is not running. (hint by Dominique
+ Pellé, closes #5928, closes #6132)
+Files: src/globals.h, src/gui.c, src/term.c, src/channel.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.2.0817
+Problem: Not enough memory allocated when converting string with special
+ character.
+Solution: Reserve space for modifier code. (closes #6130)
+Files: src/eval.c, src/testdir/test_functions.vim
+
+Patch 8.2.0818
+Problem: Vim9: using a discovery phase doesn't work well.
+Solution: Remove the discovery phase, instead compile a function only when
+ it is used. Add :defcompile to compile def functions earlier.
+Files: runtime/doc/vim9.txt, src/vim9script.c, src/structs.h,
+ src/userfunc.c, src/proto/userfunc.pro, src/eval.c,
+ src/evalvars.c, src/proto/evalvars.pro, src/vim9compile.c,
+ src/proto/vim9compile.pro, src/vim9execute.c, src/ex_cmds.h,
+ src/ex_docmd.c, src/ex_cmdidxs.h, src/vim.h, src/testdir/vim9.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0819
+Problem: Compiler warning for unused variable.
+Solution: Remove the variable.
+Files: src/evalvars.c
+
+Patch 8.2.0820
+Problem: Vim9: function type isn't set until compiled.
+Solution: Set function type early.
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/userfunc.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.0821
+Problem: Vim9: memory leak in expr test.
+Solution: Do not decrement the length of the list of functions if the
+ current function is not at the end.
+Files: src/vim9compile.c
+
+Patch 8.2.0822
+Problem: Vim9: code left over from discovery phase.
+Solution: Remove the dead code.
+Files: src/scriptfile.c, src/proto/scriptfile.pro, src/ex_cmds.h,
+ src/evalvars.c, src/proto/evalvars.pro, src/ex_docmd.c
+
+Patch 8.2.0823
+Problem: Vim9: script reload test is disabled.
+Solution: Compile a function in the context of the script where it was
+ defined. Set execution stack for compiled function. Add a test
+ that an error is reported for the right file/function.
+Files: src/vim9compile.c, src/vim9execute.c, src/scriptfile.c,
+ src/proto/scriptfile.pro, src/userfunc.c, src/globals.h,
+ src/structs.h, src/ex_docmd.c, src/ex_eval.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0824 (after 8.2.0817)
+Problem: Still not enough memory allocated when converting string with
+ special character.
+Solution: Reserve space for expanding K_SPECIAL. (closes #6130)
+Files: src/eval.c, src/testdir/test_functions.vim
+
+Patch 8.2.0825
+Problem: def_function() may return pointer that was freed.
+Solution: Set "fp" to NULL after freeing it.
+Files: src/userfunc.c
+
+Patch 8.2.0826
+Problem: Vim9: crash in :defcompile.
+Solution: Restart the loop after a call to compile_def_function() caused the
+ hash table to resize.
+Files: src/userfunc.c
+
+Patch 8.2.0827
+Problem: Vim9: crash in :defcompile.
+Solution: Fix off-by-one error.
+Files: src/userfunc.c
+
+Patch 8.2.0828
+Problem: Travis: regexp pattern doesn't work everywhere.
+Solution: Use [:blank:] instead of \b. (Ozaki Kiichi, closes #6146)
+Files: .travis.yml, ci/config.mk.clang.sed, ci/config.mk.gcc.sed,
+ ci/config.mk.sed, src/if_ruby.c
+
+Patch 8.2.0829
+Problem: filter() may give misleading error message.
+Solution: Also mention Blob as an allowed argument.
+Files: src/list.c, src/testdir/test_filter_map.vim
+
+Patch 8.2.0830
+Problem: Motif: can't map "!". (Ben Jackson)
+Solution: Remove the shift modifier if it's already included in the key.
+ (closes #6147)
+Files: src/gui_x11.c
+
+Patch 8.2.0831
+Problem: Compiler warnings for integer sizes.
+Solution: Add type casts. (Mike Williams)
+Files: src/libvterm/src/pen.c, src/terminal.c
+
+Patch 8.2.0832
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Add initial value.
+Files: src/map.c
+
+Patch 8.2.0833
+Problem: Mapping <C-bslash> doesn't work in the GUI.
+Solution: Reset seenModifyOtherKeys when starting the GUI. (closes #6150)
+Files: src/gui.c
+
+Patch 8.2.0834
+Problem: :drop command in terminal popup causes problems.
+Solution: Check for using a popup window. (closes #6151)
+Files: src/ex_cmds.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.0835
+Problem: Motif: mapping <C-bslash> still doesn't work.
+Solution: Accept CSI for K_SPECIAL. Do not apply CTRL to the character
+ early. (closes #6150)
+Files: src/getchar.c, src/gui_x11.c
+
+Patch 8.2.0836
+Problem: Not all :cdo output is visible.
+Solution: Reset 'shortmess' temporarily. (Yegappan Lakshmanan, closes #6155)
+Files: src/ex_cmds2.c, src/testdir/test_cdo.vim
+
+Patch 8.2.0837
+Problem: Compiler warning for value set but not used.
+Solution: Move variable inside #ifdef.
+Files: src/channel.c
+
+Patch 8.2.0838
+Problem: MS-Windows: compiler warning for uninitialized variables.
+Solution: Initialize variables.
+Files: src/screen.c
+
+Patch 8.2.0839
+Problem: Dropping modifier when putting a character back in typeahead.
+Solution: Add modifier to ins_char_typebuf(). (closes #6158)
+Files: src/getchar.c, src/proto/getchar.pro, src/message.c, src/normal.c,
+ src/terminal.c, src/globals.h, src/testdir/test_messages.vim
+
+Patch 8.2.0840
+Problem: Search match count wrong when only match is in fold.
+Solution: Update search stats when in a closed fold. (Christian Brabandt,
+ closes #6160, closes #6152)
+Files: src/search.c, src/testdir/dumps/Test_searchstat_3.dump,
+ src/testdir/test_search_stat.vim
+
+Patch 8.2.0841
+Problem: 'verbose' value 16 causes duplicate output.
+Solution: Combine levels 15 and 16 into one message. (Christian Brabandt,
+ closes #6153)
+Files: runtime/doc/options.txt, src/ex_docmd.c
+
+Patch 8.2.0842 (after 8.2.0837)
+Problem: MS-Windows: channel tests fail.
+Solution: Adjust #ifdefs. (closes #6162)
+Files: src/channel.c
+
+Patch 8.2.0843
+Problem: Filetype elm not detected.
+Solution: Recognize *.elm files. (closes #6157)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0844
+Problem: Text properties crossing lines not handled correctly.
+Solution: When saving for undo include an extra line when needed and do not
+ adjust properties when undoing. (Axel Forsman, closes #5875)
+Files: src/memline.c, src/proto/memline.pro, src/undo.c, src/structs.h
+
+Patch 8.2.0845
+Problem: Text properties crossing lines not handled correctly.
+Solution: When joining lines merge text properties if possible.
+ (Axel Forsman, closes #5839, closes #5683)
+Files: src/testdir/test_textprop.vim, src/memline.c, src/ops.c,
+ src/proto/textprop.pro, src/textprop.c,
+ src/testdir/dumps/Test_textprop_01.dump
+
+Patch 8.2.0846
+Problem: Build failure with small features.
+Solution: Add #ifdef.
+Files: src/undo.c
+
+Patch 8.2.0847
+Problem: Typval related code is spread out.
+Solution: Move code to new typval.c file. (Yegappan Lakshmanan, closes #6093)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/eval.c, src/evalfunc.c, src/globals.h, src/proto.h,
+ src/proto/eval.pro, src/proto/evalfunc.pro, src/proto/typval.pro,
+ src/typval.c
+
+Patch 8.2.0848
+Problem: MS-Windows: the Windows terminal code has some flaws.
+Solution: Do not redraw the right edge of the screen. Remove the background
+ color trick. Flush the screen output buffer often. (Nobuhiro
+ Takasaki, #5546)
+Files: src/os_win32.c, src/proto/os_win32.pro, src/term.c
+
+Patch 8.2.0849
+Problem: BeOS code is not maintained and probably unused.
+Solution: Remove the BeOS code. (Emir Sarı, closes #5817)
+Files: Filelist, src/Makefile, src/configure.ac, src/auto/configure,
+ src/evalfunc.c, src/normal.c, src/os_beos.c, src/os_beos.h,
+ src/os_beos.rsrc, src/os_unix.c, src/proto.h,
+ src/proto/os_beos.pro, src/pty.c, src/screen.c, src/term.c,
+ src/testdir/test_functions.vim, src/ui.c, src/vim.h
+
+Patch 8.2.0850
+Problem: MS-Windows: exepath() works differently from cmd.exe.
+Solution: Make exepath() work better on MS-Windows. (closes #6115)
+Files: runtime/doc/eval.txt, src/os_win32.c,
+ src/testdir/test_functions.vim
+
+Patch 8.2.0851 (after 8.2.0833)
+Problem: Can't distinguish <M-a> from accented "a" in the GUI.
+Solution: Use another way to make mapping <C-bslash> work. (closes #6163)
+Files: src/gui.c, src/gui_gtk_x11.c, src/getchar.c
+
+Patch 8.2.0852
+Problem: Cannot map CTRL-S on some systems.
+Solution: Do not use CTRL-S for flow control.
+Files: src/os_unix.c
+
+Patch 8.2.0853
+Problem: ml_delete() often called with FALSE argument.
+Solution: Use ml_delete_flags(x, ML_DEL_MESSAGE) when argument is TRUE.
+Files: src/buffer.c, src/change.c, src/diff.c, src/evalbuffer.c,
+ src/ex_cmds.c, src/ex_docmd.c, src/fileio.c, src/if_lua.c,
+ src/if_mzsch.c, src/if_ruby.c, src/if_tcl.c, src/normal.c,
+ src/popupmenu.c, src/popupwin.c, src/quickfix.c, src/spell.c,
+ src/terminal.c, src/if_perl.xs, src/if_py_both.h, src/memline.c,
+ src/proto/memline.pro
+
+Patch 8.2.0854
+Problem: Xxd cannot show offset as a decimal number.
+Solution: Add the "-d" flag. (Aapo Rantalainen, closes #5616)
+Files: src/testdir/test_xxd.vim, src/xxd/xxd.c
+
+Patch 8.2.0855
+Problem: GUI tests fail because the test doesn't use a modifier.
+Solution: Add "\{xxx}" to be able to encode a modifier.
+Files: runtime/doc/eval.txt, src/typval.c, src/misc2.c, src/vim.h,
+ src/proto/misc2.pro, src/gui_mac.c, src/option.c, src/highlight.c,
+ src/term.c, src/testdir/test_backspace_opt.vim,
+ src/testdir/test_mapping.vim, src/testdir/test_messages.vim
+
+Patch 8.2.0856 (after 8.2.0852)
+Problem: CTRL-S stops output.
+Solution: Invert the IXON flag. (closes #6166)
+Files: src/os_unix.c
+
+Patch 8.2.0857
+Problem: GTK cell height can be a pixel too much.
+Solution: Subtract 3 instead of 1 when rounding. (closes #6168)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.0858
+Problem: Not easy to require Lua modules.
+Solution: Improve use of Lua path. (Prabir Shrestha, closes #6098)
+Files: Filelist, src/if_lua.c, src/optionstr.c, src/proto/if_lua.pro,
+ src/testdir/test_lua.vim,
+ src/testdir/testluaplugin/lua/testluaplugin/hello.lua,
+ src/testdir/testluaplugin/lua/testluaplugin/init.lua
+
+Patch 8.2.0859
+Problem: No Turkish translation of the manual.
+Solution: Add Turkish translations. (Emir Sarı, closes #5641)
+Files: Filelist, runtime/doc/Makefile, runtime/doc/evim-tr.1,
+ runtime/doc/evim-tr.UTF-8.1, runtime/doc/vim-tr.1,
+ runtime/doc/vim-tr.UTF-8.1, runtime/doc/vimdiff-tr.1,
+ runtime/doc/vimdiff-tr.UTF-8.1, runtime/doc/vimtutor-tr.1,
+ runtime/doc/vimtutor-tr.UTF-8.1, src/Makefile
+
+Patch 8.2.0860
+Problem: Cannot use CTRL-A and CTRL-X on unsigned numbers.
+Solution: Add "unsigned" to 'nrformats'. (Naruhiko Nishino, closes #6144)
+Files: runtime/doc/options.txt, src/ops.c, src/optionstr.c,
+ src/testdir/test_increment.vim
+
+Patch 8.2.0861
+Problem: Cannot easily get all the current marks.
+Solution: Add getmarklist(). (Yegappan Lakshmanan, closes #6032)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/mark.c, src/proto/mark.pro, src/testdir/test_marks.vim
+
+Patch 8.2.0862
+Problem: ":term ++curwin" makes the current buffer hidden. (Harm te
+ Hennepe)
+Solution: Do not hide the current buffer. (closes #6170)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.0863
+Problem: Cannot set a separate color for underline/undercurl.
+Solution: Add the t_AU and t_8u termcap codes. (Timur Celik, closes #6011)
+Files: runtime/doc/syntax.txt, runtime/doc/term.txt, src/globals.h,
+ src/highlight.c, src/optiondefs.h, src/proto/term.pro,
+ src/screen.c, src/structs.h, src/term.c, src/term.h,
+ src/testdir/test_options.vim
+
+Patch 8.2.0864
+Problem: Pragmas are indented all the way to the left.
+Solution: Add an option to indent pragmas like normal code. (Max Rumpf,
+ closes #5468)
+Files: runtime/doc/indent.txt, src/cindent.c, src/structs.h,
+ src/testdir/test_cindent.vim
+
+Patch 8.2.0865
+Problem: Syntax foldlevel is taken from the start of the line.
+Solution: Add ":syn foldlevel" to be able to use the minimal foldlevel in
+ the line. (Brad King, closes #6087)
+Files: runtime/doc/syntax.txt, src/structs.h, src/syntax.c,
+ src/testdir/test_syntax.vim
+
+Patch 8.2.0866
+Problem: Not enough tests for buffer writing.
+Solution: Add more tests. Use CheckRunVimInTerminal in more places.
+ (Yegappan Lakshmanan, closes #6167)
+Files: src/testdir/test_arglist.vim, src/testdir/test_match.vim,
+ src/testdir/test_messages.vim, src/testdir/test_netbeans.py,
+ src/testdir/test_netbeans.vim, src/testdir/test_search.vim,
+ src/testdir/test_signals.vim, src/testdir/test_signs.vim,
+ src/testdir/test_startup.vim, src/testdir/test_startup_utf8.vim,
+ src/testdir/test_syntax.vim, src/testdir/test_tabpage.vim,
+ src/testdir/test_timers.vim, src/testdir/test_vimscript.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.0867
+Problem: Using \{xxx} for encoding a modifier is not nice.
+Solution: Use \<*xxx> instead, since it's the same as \<xxx> but producing a
+ different code.
+Files: runtime/doc/eval.txt, src/typval.c, src/misc2.c, src/vim.h,
+ src/testdir/test_backspace_opt.vim, src/testdir/test_mapping.vim,
+ src/testdir/test_messages.vim
+
+Patch 8.2.0868
+Problem: trim() always trims both ends.
+Solution: Add an argument to only trim the beginning or end. (Yegappan
+ Lakshmanan, closes #6126)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim
+
+Patch 8.2.0869
+Problem: It is not possible to customize the quickfix window contents.
+Solution: Add 'quickfixtextfunc'. (Yegappan Lakshmanan, closes #5465)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/quickfix.txt, src/option.h, src/optiondefs.h,
+ src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.0870
+Problem: MS-Windows: Control keys don't work in the GUI.
+Solution: Don't set seenModifyOtherKeys for now. (Yasuhiro Matsumoto,
+ closes #6175)
+Files: src/gui.c
+
+Patch 8.2.0871
+Problem: Cannot use getmarklist() as a method.
+Solution: Make getmarklist() work as a method. Add one to the column
+ number to match getpos(). (Yegappan Lakshmanan, closes #6176)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/mark.c,
+ src/testdir/test_marks.vim
+
+Patch 8.2.0872
+Problem: XIM code is mixed with multibyte code.
+Solution: Move the XIM code to a separate file. (Yegappan Lakshmanan,
+ closes #6177)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/gui_xim.c,
+ src/mbyte.c, src/proto.h, src/proto/gui_xim.pro,
+ src/proto/mbyte.pro
+
+Patch 8.2.0873
+Problem: A .jl file can be sawfish (lisp) or Julia.
+Solution: Do not recognize *.jl as lisp, since it might be Julia.
+ (closes #6178)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0874
+Problem: Signals test is a bit flaky.
+Solution: Flush the XautoOut file. Delete files that may be left behind
+ from a failure. (Dominique Pellé, closes #6179)
+Files: src/testdir/test_signals.vim
+
+Patch 8.2.0875
+Problem: Getting attributes for directory entries is slow.
+Solution: Add readdirex(). (Ken Takata, closes #5619)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/fileio.c, src/filepath.c, src/proto/fileio.pro,
+ src/proto/filepath.pro, src/testdir/test_functions.vim
+
+Patch 8.2.0876
+Problem: :pwd does not give a hint about the scope of the directory
+Solution: Make ":verbose pwd" show the scope. (Takuya Fujiwara, closes #5469)
+Files: runtime/doc/editing.txt, src/ex_docmd.c, src/testdir/test_cd.vim
+
+Patch 8.2.0877
+Problem: Cannot get the search statistics.
+Solution: Add the searchcount() function. (Fujiwara Takuya, closes #4446)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/macros.h,
+ src/proto/search.pro, src/search.c,
+ src/testdir/test_search_stat.vim
+
+Patch 8.2.0878
+Problem: No reduce() function.
+Solution: Add a reduce() function. (closes #5481)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/globals.h, src/list.c,
+ src/proto/list.pro, src/testdir/test_listdict.vim
+
+Patch 8.2.0879
+Problem: Compiler warning for unused function argument.
+Solution: Add UNUSED.
+Files: src/search.c
+
+Patch 8.2.0880 (after 8.2.0877)
+Problem: Leaking memory when using searchcount().
+Solution: Free the last used search pattern.
+Files: src/search.c
+
+Patch 8.2.0881
+Problem: Compiler warning for argument type.
+Solution: Add type cast. (Mike Williams)
+Files: src/ops.c
+
+Patch 8.2.0882
+Problem: Leaking memory when using reduce().
+Solution: Free the intermediate value.
+Files: src/list.c
+
+Patch 8.2.0883
+Problem: Memory leak in test 49.
+Solution: Free "sfile" from the exception.
+Files: src/ex_docmd.c
+
+Patch 8.2.0884
+Problem: Searchcount() test fails on slower systems.
+Solution: Set a longer timeout.
+Files: src/search.c, src/testdir/test_search_stat.vim
+
+Patch 8.2.0885
+Problem: "make shadow" does not link new lua test dir.
+Solution: Also link testdir/testluaplugin. (Elimar Riesebieter)
+Files: src/Makefile
+
+Patch 8.2.0886
+Problem: Cannot use octal numbers in scriptversion 4.
+Solution: Add the "0o" notation. (Ken Takata, closes #5304)
+Files: runtime/doc/eval.txt, src/charset.c, src/evalfunc.c,
+ src/testdir/test_eval_stuff.vim, src/testdir/test_functions.vim,
+ src/vim.h
+
+Patch 8.2.0887
+Problem: Searchcount().exact_match is 1 right after a match.
+Solution: Use LT_POS() instead of LTOREQ_POS(). (closes #6189)
+Files: src/search.c, src/testdir/test_search_stat.vim
+
+Patch 8.2.0888
+Problem: Readdirex() returns size -2 for a directory.
+Solution: Add missing "else". (Ken Takata, closes #6185)
+Files: src/fileio.c, src/testdir/test_functions.vim
+
+Patch 8.2.0889
+Problem: Using old style comments.
+Solution: Use // comments. (Yegappan Lakshmanan, closes #6190)
+Files: src/gui_xim.c
+
+Patch 8.2.0890
+Problem: No color in terminal window when 'termguicolors' is set.
+Solution: Clear the underline color. (closes #6186)
+Files: src/highlight.c
+
+Patch 8.2.0891
+Problem: Clang warns for invalid conversion.
+Solution: Use zero instead of INVALCOLOR.
+Files: src/highlight.c
+
+Patch 8.2.0892
+Problem: Ubsan warns for undefined behavior.
+Solution: Use unsigned instead of signed variable. (Dominique Pellé,
+ closes #6193)
+Files: src/regexp_nfa.c
+
+Patch 8.2.0893
+Problem: Assert_equalfile() does not take a third argument.
+Solution: Implement the third argument. (Gary Johnson)
+Files: runtime/doc/eval.txt, runtime/doc/testing.txt, src/evalfunc.c,
+ src/testdir/test_assert.vim, src/testing.c
+
+Patch 8.2.0894
+Problem: :mkspell can take very long if the word count is high.
+Solution: Use long to avoid negative numbers. Increase the limits by 20% if
+ the compression did not have effect.
+Files: src/spellfile.c
+
+Patch 8.2.0895
+Problem: :mkspell output does not mention the tree type.
+Solution: Back out increasing the limits, it has no effect. Mention the
+ tree being compressed. Only give a message once per second.
+Files: src/spellfile.c
+
+Patch 8.2.0896
+Problem: Crash when calling searchcount() with a string.
+Solution: Check the argument is a dict. (closes #6192)
+Files: src/search.c, src/testdir/test_search_stat.vim
+
+Patch 8.2.0897
+Problem: List of functions in patched version is outdated.
+Solution: Update the function lists only.
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt
+
+Patch 8.2.0898
+Problem: Missing help for a function goes unnoticed.
+Solution: Add a test. (Gary Johnson)
+Files: src/testdir/test_function_lists.vim, src/testdir/Make_all.mak
+
+Patch 8.2.0899
+Problem: Assert_equalfile() does not give a hint about the difference.
+Solution: Display the last seen text.
+Files: src/testing.c, src/testdir/test_assert.vim
+
+Patch 8.2.0900
+Problem: Function list test fails on MS-Windows.
+Solution: Make sure the fileformat is "unix"
+Files: src/testdir/test_function_lists.vim
+
+Patch 8.2.0901
+Problem: Formatting CJK text isn't optimal.
+Solution: Properly break CJK lines. (closes #3875)
+Files: runtime/doc/change.txt, src/mbyte.c, src/ops.c, src/option.h,
+ src/proto/mbyte.pro, src/testdir/Make_all.mak, src/textformat.c,
+ src/testdir/test_cjk_linebreak.vim
+
+Patch 8.2.0902
+Problem: Using searchcount() in 'statusline' causes an error.
+Solution: Avoid saving/restoring the search pattern recursively.
+ (closes #6194)
+Files: src/search.c, src/testdir/test_search_stat.vim,
+ src/testdir/dumps/Test_searchstat_4.dump
+
+Patch 8.2.0903
+Problem: comparing WINVER does not work correctly.
+Solution: Use arithmetic expansion. (Ozaki Kiichi, closes #6197)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.2.0904
+Problem: Assuming modifyOtherKeys for rhs of mapping.
+Solution: Ignore seenModifyOtherKeys for mapped characters. (closes #6200)
+Files: src/getchar.c, src/testdir/test_gui.vim
+
+Patch 8.2.0905
+Problem: Test coverage could be better.
+Solution: Add a couple of tests. (Dominique Pellé, closes #6202)
+Files: src/testdir/test_cmdline.vim, src/testdir/test_ga.vim
+
+Patch 8.2.0906
+Problem: When setting 'termguicolors' SpellBad is no longer red.
+Solution: Only use the RGB guisp color for cterm when using the "underline"
+ or "undercurl" attributes to avoid the background color to be
+ cleared. Also make t_8u empty when the termresponse indicates a
+ real xterm. (closes #6207)
+Files: src/highlight.c, src/term.c
+
+Patch 8.2.0907
+Problem: When using :global clipboard isn't set correctly.
+Solution: Set "clip_unnamed_saved" instead of "clip_unnamed". (Christian
+ Brabandt, closes #6203, closes #6198)
+Files: src/clipboard.c, src/testdir/test_global.vim
+
+Patch 8.2.0908
+Problem: Crash when changing the function table while listing it.
+Solution: Bail out when the function table changes. (closes #6209)
+Files: src/userfunc.c, src/testdir/test_timers.vim
+
+Patch 8.2.0909
+Problem: Cannot go back to the previous local directory.
+Solution: Add "tcd -" and "lcd -". (Yegappan Lakshmanan, closes #4362)
+Files: runtime/doc/editing.txt, src/filepath.c, src/ex_docmd.c,
+ src/structs.h, src/testdir/test_cd.vim, src/window.c
+
+Patch 8.2.0910
+Problem: Vim is not reproducibly buildable.
+Solution: Use the $SOURCE_DATE_EPOCH environment variable in configure.
+ (James McCoy, closes #513) Give a warning about using it.
+Files: src/config.h.in, src/config.mk.in, src/configure.ac,
+ src/auto/configure, src/version.c, src/Makefile
+
+Patch 8.2.0911
+Problem: Crash when opening a buffer for the cmdline window fails. (Chris
+ Barber)
+Solution: Check do_ecmd() succeeds. Reset got_int if "q" was used at the
+ more prompt. (closes #6211)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_cmdwin_interrupted.dump
+
+Patch 8.2.0912
+Problem: A few test cases for CJK formatting are disabled.
+Solution: Fix the tests and enable them. (closes #6212)
+Files: src/testdir/test_cjk_linebreak.vim
+
+Patch 8.2.0913
+Problem: Code for resetting v:register is duplicated.
+Solution: Add reset_reg_var().
+Files: src/evalvars.c, src/proto/evalvars.pro, src/main.c, src/normal.c
+
+Patch 8.2.0914
+Problem: MS-Windows: cannot specify a "modified by" text.
+Solution: Add MODIFIED_BY in the MSVC build file. (Chen Lei, closes #1275)
+Files: src/Make_mvc.mak
+
+Patch 8.2.0915
+Problem: Search() cannot skip over matches like searchpair() can.
+Solution: Add an optional "skip" argument. (Christian Brabandt, closes #861)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/testdir/test_syntax.vim,
+ src/structs.h, src/evalvars.c, src/proto/evalvars.pro
+
+Patch 8.2.0916
+Problem: Mapping with partly modifyOtherKeys code does not work.
+Solution: If there is no mapping with a separate modifier include the
+ modifier in the key and then try mapping again. (closes #6200)
+Files: src/getchar.c, src/proto/getchar.pro, src/edit.c, src/term.c,
+ src/proto/term.pro, src/testdir/test_termcodes.vim
+
+Patch 8.2.0917
+Problem: Quickfix entries do not support a "note" type.
+Solution: Add support for "note". (partly by Yegappan Lakshmanan,
+ closes #5527, closes #6216)
+Files: runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.0918
+Problem: Duplicate code for evaluating expression argument.
+Solution: Merge the code and make the use more flexible.
+Files: src/evalfunc.c, src/eval.c, src/proto/eval.pro, src/evalvars.c,
+ src/proto/evalvars.pro, src/structs.h
+
+Patch 8.2.0919
+Problem: Merging modifier for modifyOtherKeys is done twice.
+Solution: Remove the merging done in vgetc().
+Files: src/getchar.c, src/ex_getln.c
+
+Patch 8.2.0920
+Problem: Writing viminfo fails with a circular reference.
+Solution: Use copyID to detect the cycle. (closes #6217)
+Files: src/testdir/test_viminfo.vim, src/viminfo.c
+
+Patch 8.2.0921
+Problem: CTRL-W T in cmdline window causes trouble.
+Solution: Disallow CTRL-W T in the cmdline window. Add more tests.
+ (Naruhiko Nishino, closes #6219)
+Files: src/testdir/test_cmdline.vim, src/window.c
+
+Patch 8.2.0922
+Problem: Search test fails.
+Solution: Remove failure tests for calls that no longer fail.
+Files: src/testdir/test_search.vim
+
+Patch 8.2.0923
+Problem: Cmdline test is slow.
+Solution: Use WaitForAssert().
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.2.0924
+Problem: Cannot save and restore a register properly.
+Solution: Add getreginfo() and make setreg() accept a dictionary. (Andy
+ Massimino, closes #3370)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/proto/register.pro, src/register.c,
+ src/testdir/test_eval_stuff.vim, src/testdir/test_registers.vim
+
+Patch 8.2.0925
+Problem: Getcompletion() does not return command line arguments.
+Solution: Add the "cmdline" option. (Shougo, closes #1140)
+Files: runtime/doc/eval.txt, src/cmdexpand.c,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.0926
+Problem: Cmdline test fails on Appveyor.
+Solution: Add CR to the commands. (Naruhiko Nishino, closes #6220)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.2.0927
+Problem: Some sshconfig and ssdhconfig files are not recognized.
+Solution: Add filetype patterns.
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0928
+Problem: Many type casts are used for vim_strnsave().
+Solution: Make the length argument size_t instead of int. (Ken Takata,
+ closes #5633) Remove some type casts.
+Files: src/misc2.c, src/proto/misc2.pro, src/autocmd.c, src/channel.c,
+ src/cmdexpand.c, src/dict.c, src/diff.c, src/digraph.c,
+ src/eval.c, src/evalfunc.c, src/highlight.c, src/syntax.c
+
+Patch 8.2.0929
+Problem: v:register is not cleared after an operator was executed.
+Solution: Clear v:register after finishing an operator (Andy Massimino,
+ closes #5305)
+Files: src/normal.c, src/testdir/test_registers.vim
+
+Patch 8.2.0930
+Problem: Script filetype detection trips over env -S argument.
+Solution: Remove "-S" and "--ignore-environment". (closes #5013)
+ Add tests.
+Files: runtime/scripts.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0931
+Problem: Some remarks about BeOS remain.
+Solution: Remove BeOS remarks from the help and other files. (Emir Sarı,
+ closes #6221)
+Files: READMEdir/README_extra.txt, runtime/doc/options.txt,
+ runtime/doc/os_beos.txt, runtime/doc/os_vms.txt,
+ runtime/doc/vi_diff.txt, src/INSTALL
+
+Patch 8.2.0932
+Problem: Misspelling spelllang.
+Solution: Add an "l". (Dominique Pellé)
+Files: src/optionstr.c, src/proto/spell.pro, src/spell.c
+
+Patch 8.2.0933
+Problem: 'quickfixtextfunc' does not get window ID of location list.
+Solution: Add "winid" to the dict argument. (Yegappan Lakshmanan,
+ closes #6222)
+Files: runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.0934
+Problem: Running lhelpgrep twice in a help window doesn't jump to the help
+ topic.
+Solution: Check whether any window with the location list is present.
+ (Yegappan Lakshmanan, closes #6215)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.0935
+Problem: Flattening a list with existing code is slow.
+Solution: Add flatten(). (Mopp, closes #3676)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/list.c, src/proto/list.pro, src/testdir/Make_all.mak,
+ src/testdir/test_flatten.vim
+
+Patch 8.2.0936
+Problem: Some terminals misinterpret the code for getting cursor style.
+Solution: Send a sequence to the terminal and check the result. (IWAMOTO
+ Kouichi, closes #2126) Merged with current code.
+Files: src/main.c, src/term.c, src/proto/term.pro,
+ src/testdir/term_util.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_startup_utf8.vim,
+ src/testdir/dumps/Test_balloon_eval_term_01.dump,
+ src/testdir/dumps/Test_balloon_eval_term_01a.dump,
+ src/testdir/dumps/Test_balloon_eval_term_02.dump,
+ src/testdir/dumps/Test_terminal_all_ansi_colors.dump
+
+Patch 8.2.0937
+Problem: Asan failure in the flatten() test.
+Solution: Free the flattened list.
+Files: src/list.c
+
+Patch 8.2.0938
+Problem: NFA regexp uses tolower() to compare ignore-case. (Thayne McCombs)
+Solution: Use utf_fold() when possible. (ref. neovim #12456)
+Files: src/macros.h, src/diff.c, src/regexp_nfa.c,
+ src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.0939
+Problem: checking for term escape sequences is long and confusing
+Solution: Refactor code into separate functions.
+Files: src/term.c
+
+Patch 8.2.0940 (after 8.2.0939)
+Problem: Build failure with tiny features.
+Solution: Add #ifdef. Add UNUSED. A bit more cleaning up.
+Files: src/term.c
+
+Patch 8.2.0941
+Problem: Detecting terminal properties is unstructured.
+Solution: Add a table with terminal properties. Set properties when a
+ terminal is detected.
+Files: src/term.c
+
+Patch 8.2.0942
+Problem: Expanding to local dir after homedir keeps "~/".
+Solution: Adjust modify_fname(). (Christian Brabandt, closes #6205,
+ closes #5979)
+Files: src/filepath.c, src/testdir/test_fnamemodify.vim
+
+Patch 8.2.0943
+Problem: Displaying ^M or ^J depends on current buffer.
+Solution: Pass the displayed buffer to transchar(). (closes #6225)
+Files: src/drawline.c, src/charset.c, src/proto/charset.pro,
+ src/ex_cmds.c, src/gui_beval.c, src/message.c,
+ src/testdir/test_display.vim,
+ src/testdir/dumps/Test_display_unprintable_01.dump,
+ src/testdir/dumps/Test_display_unprintable_02.dump
+
+Patch 8.2.0944
+Problem: Xxd test leaves file behind.
+Solution: Delete the file "XXDfile". (Christian Brabandt, closes #6228)
+Files: src/testdir/test_xxd.vim
+
+Patch 8.2.0945
+Problem: Cannot use "z=" when 'spell' is off.
+Solution: Make "z=" work even when 'spell' is off. (Christian Brabandt,
+ Gary Johnson, closes #6227)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/spell.c,
+ src/spellsuggest.c, src/testdir/test_spell.vim, src/globals.h
+
+Patch 8.2.0946
+Problem: Cannot use "q" to cancel a number prompt.
+Solution: Recognize "q" instead of ignoring it.
+Files: src/misc1.c, src/testdir/test_functions.vim
+
+Patch 8.2.0947
+Problem: Readdirex() doesn't handle broken link properly.
+Solution: Small fixes to readdirex(). (Christian Brabandt, closes #6226,
+ closes #6213)
+Files: src/fileio.c, src/testdir/test_functions.vim
+
+Patch 8.2.0948
+Problem: Spell test fails.
+Solution: Adjust expected text of the prompt.
+Files: src/testdir/test_spell.vim
+
+Patch 8.2.0949
+Problem: Strptime() does not use DST.
+Solution: Set the tm_isdst field to -1. (Tomáš Janoušek, closes #6230)
+Files: src/time.c, src/testdir/test_functions.vim
+
+Patch 8.2.0950
+Problem: Tagjump test fails.
+Solution: Adjust expected text of the prompt.
+Files: src/testdir/test_tagjump.vim
+
+Patch 8.2.0951
+Problem: Search stat test has leftover from debugging.
+Solution: Remove line that writes a file. (Christian Brabandt, closes #6224)
+Files: src/testdir/test_search_stat.vim
+
+Patch 8.2.0952
+Problem: No simple way to interrupt Vim.
+Solution: Add the SigUSR1 autocommand, triggered by SIGUSR1. (Jacob Hayes,
+ closes #1718)
+Files: runtime/doc/autocmd.txt, src/vim.h, src/autocmd.c, src/getchar.c,
+ src/globals.h, src/os_unix.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.0953
+Problem: Spell checking doesn't work for CamelCased words.
+Solution: Add the "camel" value in the new option 'spelloptions'.
+ (closes #1235)
+Files: runtime/doc/options.txt, runtime/doc/spell.txt, src/optiondefs.h,
+ src/option.h, src/option.c, src/buffer.c, src/optionstr.c,
+ src/testdir/gen_opt_test.vim, src/testdir/test_spell.vim
+
+Patch 8.2.0954
+Problem: Not all desktop files are recognized.
+Solution: Add the *.directory pattern. (Eisuke Kawashima, closes #3317)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0955 (after 8.2.0953)
+Problem: Build fails.
+Solution: Add missing struct change.
+Files: src/structs.h
+
+Patch 8.2.0956 (after 8.2.0953)
+Problem: Spell test fails.
+Solution: Add missing change the spell checking.
+Files: src/spell.c
+
+Patch 8.2.0957
+Problem: Compiler warning for uninitialized variable. (Tony Mechelynck)
+Solution: Initialize one variable.
+Files: src/spell.c
+
+Patch 8.2.0958
+Problem: Not sufficient testing for buffer writing.
+Solution: Add a few tests. (Yegappan Lakshmanan, closes #6238)
+Files: src/testdir/test_backup.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.0959
+Problem: Using 'quickfixtextfunc' is a bit slow.
+Solution: Process a list of entries. (Yegappan Lakshmanan, closes #6234)
+Files: runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.0960
+Problem: Cannot use :import in legacy Vim script.
+Solution: Support :import in any Vim script.
+Files: src/vim9script.c, src/evalvars.c, src/userfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0961
+Problem: MS-Windows: no completion for locales.
+Solution: Use the directories in $VIMRUNTIME/lang to complete locales.
+ (Christian Brabandt, closes 36248)
+Files: src/cmdexpand.c, src/ex_cmds2.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.0962
+Problem: Terminal test sometimes hangs on Travis.
+Solution: Do show output for this test temporarily.
+Files: src/testdir/Makefile
+
+Patch 8.2.0963
+Problem: Number increment/decrement does not work with 'virtualedit'.
+Solution: Handle coladd changing. (Christian Brabandt, closes #6240,
+ closes #923)
+Files: runtime/doc/options.txt, runtime/doc/various.txt, src/ops.c,
+ src/testdir/test_increment.vim
+
+Patch 8.2.0964
+Problem: TextYankPost does not provide info about Visual selection.
+Solution: Add the 'visual' key in v:event. (closes #6249)
+Files: runtime/doc/autocmd.txt, src/register.c,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.0965
+Problem: Has_funcundefined() is not used.
+Solution: Delete the function. (Dominique Pellé, closes #6242)
+Files: src/autocmd.c, src/proto/autocmd.pro
+
+Patch 8.2.0966
+Problem: 'shortmess' flag "n" not used in two places.
+Solution: Make use of the "n" flag consistent. (Nick Jensen, closes #6245,
+ closes #6244)
+Files: src/bufwrite.c, src/proto/bufwrite.pro, src/buffer.c,
+ src/fileio.c, src/testdir/dumps/Test_popup_textprop_corn_5.dump,
+ src/testdir/dumps/Test_start_with_tabs.dump
+
+Patch 8.2.0967
+Problem: Unnecessary type casts for vim_strnsave().
+Solution: Remove the type casts.
+Files: src/evalvars.c, src/ex_cmds.c, src/ex_eval.c, src/fileio.c,
+ src/filepath.c, src/findfile.c, src/highlight.c, src/if_ruby.c,
+ src/insexpand.c, src/json.c, src/mark.c, src/memline.c,
+ src/menu.c, src/misc1.c, src/ops.c, src/os_win32.c, src/regexp.c,
+ src/regexp_bt.c, src/regexp_nfa.c, src/register.c, src/search.c,
+ src/sign.c, src/syntax.c, src/term.c, src/terminal.c, src/undo.c,
+ src/usercmd.c, src/userfunc.c, src/vim9compile.c, src/if_perl.xs
+
+Patch 8.2.0968
+Problem: No proper testing of the 'cpoptions' flags.
+Solution: Add tests. (Yegappan Lakshmanan, closes #6251)
+Files: src/testdir/Make_all.mak, src/testdir/test_cpoptions.vim,
+ src/testdir/test_edit.vim, src/testdir/test_normal.vim
+
+Patch 8.2.0969
+Problem: Assert_equal() output for dicts is hard to figure out.
+Solution: Only show the different items.
+Files: src/testing.c, src/testdir/test_assert.vim
+
+Patch 8.2.0970
+Problem: Terminal properties are not available in Vim script.
+Solution: Add the terminalprops() function.
+Files: src/term.c, src/proto/term.pro, src/evalfunc.c, src/main.c,
+ src/testing.c, src/globals.h, src/testdir/test_termcodes.vim,
+ runtime/doc/usr_41.txt, runtime/doc/eval.txt,
+ runtime/doc/testing.txt
+
+Patch 8.2.0971
+Problem: Build with tiny features fails.
+Solution: Add #ifdef.
+Files: src/term.c
+
+Patch 8.2.0972
+Problem: Vim9 script variable declarations need a type.
+Solution: Make "let var: type" declare a script-local variable.
+Files: src/evalvars.c, src/vim9script.c, src/proto/vim9script.pro,
+ src/globals.h, src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0973
+Problem: Vim9: type is not checked when assigning to a script variable.
+Solution: Check the type.
+Files: src/evalvars.c, src/vim9script.c, src/proto/vim9script.pro,
+ src/vim9compile.c, src/proto/vim9compile.pro,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.0974
+Problem: Vim9: memory leak when script var has wrong type.
+Solution: Free the variable name.
+Files: src/vim9script.vim
+
+Patch 8.2.0975
+Problem: Vim9: script variable does not accept optional s: prefix.
+Solution: Adjust the accepted syntax.
+Files: src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0976
+Problem: Some 'cpoptions' not tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #6253)
+Files: src/testdir/test_cd.vim, src/testdir/test_charsearch.vim,
+ src/testdir/test_cpoptions.vim, src/testdir/test_normal.vim
+
+Patch 8.2.0977
+Problem: t_8u is made empty for the wrong terminals. (Dominique Pelle)
+Solution: Invert the check for TPR_YES. (closes #6254)
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.0978
+Problem: Leaking memory in termcodes test.
+Solution: Set t_8u with set_option_value().
+Files: src/term.c
+
+Patch 8.2.0979
+Problem: A couple of screendump tests fail.
+Solution: Do not redraw when clearing t_8u.
+Files: src/term.c
+
+Patch 8.2.0980
+Problem: Raku file extension not recognized. (Steven Penny)
+Solution: Recognize .raku and .rakumod. (closes #6255)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0981
+Problem: Vim9: cannot compile "[var, var] = list".
+Solution: Implement list assignment.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/evalvars.c,
+ src/proto/evalvars.pro, src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0982
+Problem: Insufficient testing for reading/writing files.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #6257)
+ Add "ui_delay" to test_override() and use it for the CTRL-O test.
+Files: src/testing.c, src/globals.h, src/ui.c, runtime/doc/testing.txt,
+ src/testdir/test_autocmd.vim, src/testdir/test_edit.vim,
+ src/testdir/test_filechanged.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.0983
+Problem: SConstruct file type not recognized.
+Solution: Use python for SConstruct files. (Roland Hieber)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.0984
+Problem: Not using previous window when closing a shell popup window.
+Solution: Use "prevwin" if it was set. (closes #6267)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.0985
+Problem: Simplify() does not remove slashes from "///path".
+Solution: Reduce > 2 slashes to one. (closes #6263)
+Files: src/findfile.c, src/testdir/test_functions.vim
+
+Patch 8.2.0986 (after 8.2.0985)
+Problem: MS-Windows: functions test fails.
+Solution: Only simplify ///path on Unix.
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.0987
+Problem: Vim9: cannot assign to [var; var].
+Solution: Assign rest of items to a list.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c, src/list.c,
+ src/proto/list.pro, src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.0988
+Problem: Getting directory contents is always case sorted.
+Solution: Add sort options and v:collate. (Christian Brabandt, closes #6229)
+Files: runtime/doc/eval.txt, runtime/doc/mlang.txt, src/auto/configure,
+ src/cmdexpand.c, src/config.h.in, src/configure.ac,
+ src/evalfunc.c, src/evalvars.c, src/ex_cmds2.c, src/fileio.c,
+ src/filepath.c, src/globals.h, src/proto/fileio.pro,
+ src/testdir/test_cmdline.vim, src/testdir/test_functions.vim,
+ src/vim.h
+
+Patch 8.2.0989
+Problem: Crash after resizing a terminal window. (August Masquelier)
+Solution: Add check for valid row in libvterm. (closes #6273)
+Files: src/libvterm/src/state.c, src/libvterm/src/screen.c
+
+Patch 8.2.0990 (after 8.2.0988)
+Problem: Using duplicate error number.
+Solution: Use an unused error number. Add a test for it.
+Files: src/globals.h, src/testdir/test_functions.vim
+
+Patch 8.2.0991
+Problem: Cannot get window type for autocmd and preview window.
+Solution: Add types to win_gettype(). (Yegappan Lakshmanan, closes #6277)
+Files: runtime/doc/eval.txt, src/evalwindow.c,
+ src/testdir/test_autocmd.vim, src/testdir/test_preview.vim
+
+Patch 8.2.0992
+Problem: Vim9: crash when using :import in the Vim command.
+Solution: Give an error when using :import outside of a script.
+ (closes #6271)
+Files: src/vim9script.c, src/testdir/test_vim9_script.vim,
+ src/testdir/term_util.vim
+
+Patch 8.2.0993
+Problem: Vim9 script test fails with normal features.
+Solution: Use :func instead of :def for now.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0994
+Problem: Vim9: missing function causes compilation error.
+Solution: Call test function indirectly.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.0995
+Problem: Insufficient testing for the readdir() sort option.
+Solution: Add a few more tests. (Christian Brabandt, closes #6278)
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.0996
+Problem: Using "aucmdwin" in win_gettype() is not ideal.
+Solution: Rename to "autocmd".
+Files: runtime/doc/eval.txt, src/evalwindow.c,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.0997
+Problem: Cannot execute a register containing line continuation.
+Solution: Concatenate lines where needed. (Yegappan Lakshmanan,
+ closes #6272)
+Files: runtime/doc/repeat.txt, src/register.c,
+ src/testdir/test_registers.vim
+
+Patch 8.2.0998
+Problem: Not all tag code is tested.
+Solution: Add a few more test cases. (Yegappan Lakshmanan, closes #6284)
+Files: src/testdir/test_tagjump.vim
+
+Patch 8.2.0999
+Problem: Moving to next sentence gets stuck on quote.
+Solution: When moving to the next sentence doesn't result in moving, advance
+ a character and try again. (closes #6291)
+Files: src/textobject.c, src/testdir/test_textobjects.vim
+
+Patch 8.2.1000
+Problem: Get error when leaving Ex mode with :visual and a CmdLineEnter
+ autocommand was used.
+Solution: Reset ex_pressedreturn. (closes #6293)
+Files: src/ex_docmd.c, src/testdir/test_ex_mode.vim
+
+Patch 8.2.1001
+Problem: Vim9: crash with nested "if" and assignment.
+Solution: Skip more of the assignment. Do not set ctx_skip when code is
+ reachable.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1002
+Problem: Test may fail when run directly.
+Solution: Check if g:run_nr exists. (Christian Brabandt, closes #6285)
+Files: src/testdir/term_util.vim
+
+Patch 8.2.1003
+Problem: Vim9: return type of sort() is too generic.
+Solution: Get type from the first argument. (closes #6292)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1004
+Problem: Line numbers below filler lines not always updated.
+Solution: Don't break out of the win_line() loop too early. (Christian
+ Brabandt, closes #6294, closes #6138)
+Files: src/drawline.c, src/testdir/dumps/Test_diff_rnu_01.dump,
+ src/testdir/dumps/Test_diff_rnu_02.dump,
+ src/testdir/dumps/Test_diff_rnu_03.dump,
+ src/testdir/test_diffmode.vim
+
+Patch 8.2.1005
+Problem: Vim9: using TRUE/FALSE/MAYBE for ctx_skip is confusing.
+Solution: Use an enum value.
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1006
+Problem: Vim9: require unnecessary return statement.
+Solution: Improve the use of the had_return flag. (closes #6270)
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1007
+Problem: Completion doesn't work after ":r ++arg !".
+Solution: Skip over "++arg". (Christian Brabandt, closes #6275,
+ closes #6258)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.1008
+Problem: Vim9: no test for disassembling newly added instructions.
+Solution: Add a function and check disassembly.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1009
+Problem: Vim9: some failures not checked for.
+Solution: Add test cases. Remove unused code.
+Files: src/testdir/test_vim9_script.vim, src/vim9execute.c
+
+Patch 8.2.1010
+Problem: Build failure in libvterm with debug enabled. (John Little)
+Solution: Use "->" instead of ".".
+Files: src/libvterm/src/state.c
+
+Patch 8.2.1011
+Problem: Vim9: some code not tested.
+Solution: Add a few more test cases. Reorder checks for clearer error.
+ Remove unreachable code.
+Files: src/evalvars.c, src/vim9script.c, src/vim9execute.c,
+ src/proto/vim9script.pro, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1012
+Problem: Vim9: cannot declare single character script variables.
+Solution: Don't see "b:", "s:", etc. as namespace. Fix item size of
+ sn_var_vals.
+Files: src/vim9script.c, src/scriptfile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1013
+Problem: Channel tests can be a bit flaky.
+Solution: Set the g:test_is_flaky flag in SetUp().
+Files: src/testdir/test_channel.vim
+
+Patch 8.2.1014
+Problem: Using "name" for a string result is confusing.
+Solution: Rename to "end".
+Files: src/typval.c
+
+Patch 8.2.1015
+Problem: Popup filter gets key with modifier prepended when using
+ modifyOtherKeys.
+Solution: Remove the shift modifier when it is included in the key, also
+ when the Alt or Meta modifier is used.
+Files: src/term.c, src/misc2.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1016
+Problem: Vim9: test fails when channel feature is missing.
+Solution: Process an :if command when skipping
+Files: src/vim9compile.c
+
+Patch 8.2.1017
+Problem: Appveyor output doesn't show MinGW console features.
+Solution: List the features of the console build.
+Files: ci/appveyor.bat
+
+Patch 8.2.1018
+Problem: Typo in enum value. (James McCoy)
+Solution: Fix the typo.
+Files: src/vim9compile.c
+
+Patch 8.2.1019
+Problem: Mapping <M-S-a> does not work in the GUI.
+Solution: Move the logic to remove the shift modifier to
+ may_remove_shift_modifier() and also use it in the GUI.
+Files: src/gui_gtk_x11.c, src/misc2.c, src/proto/misc2.pro, src/term.c
+
+Patch 8.2.1020
+Problem: Popupwin test fails in the GUI.
+Solution: Send GUI byte sequence for <C-S-a>.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.1021
+Problem: Ruby interface not tested enough.
+Solution: Add a couple more tests. (Dominique Pellé, closes #6301)
+Files: src/testdir/test_ruby.vim
+
+Patch 8.2.1022
+Problem: Various parts of code not covered by tests.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #6300)
+Files: src/testdir/test_blob.vim, src/testdir/test_cpoptions.vim,
+ src/testdir/test_digraph.vim, src/testdir/test_edit.vim,
+ src/testdir/test_iminsert.vim, src/testdir/test_paste.vim,
+ src/testdir/test_prompt_buffer.vim,
+ src/testdir/test_selectmode.vim, src/testdir/test_tabpage.vim,
+ src/testdir/test_tagjump.vim, src/testdir/test_textformat.vim,
+ src/testdir/test_viminfo.vim, src/testdir/test_virtualedit.vim,
+ src/testdir/test_visual.vim
+
+Patch 8.2.1023
+Problem: Vim9: redefining a function uses a new index every time.
+Solution: When redefining a function clear the contents and re-use the
+ index.
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/userfunc.c,
+ src/structs.h, src/eval.c, src/evalvars.c, src/vim9execute.c
+
+Patch 8.2.1024
+Problem: Vim9: no error for using "let g:var = val".
+Solution: Add an error.
+Files: src/evalvars.c, src/globals.h, src/structs.h, src/vim9compile.c,
+ src/scriptfile.c, src/userfunc.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1025
+Problem: Tabpage menu and tabline not sufficiently tested.
+Solution: Add tests. (Yegappan Lakshmanan, closes #6307)
+Files: src/testdir/test_digraph.vim, src/testdir/test_tabpage.vim
+
+Patch 8.2.1026
+Problem: Vim9: cannot break the line after "->".
+Solution: Check for a continuation line after "->", "[" and ".". Ignore
+ trailing white space.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1027
+Problem: GUI: multibyte characters do not work in a terminal.
+Solution: Do not assume a key is one byte. (closes #6304)
+Files: src/gui_gtk_x11.c, src/gui_x11.c
+
+Patch 8.2.1028
+Problem: Vim9: no error for declaring buffer, window, etc. variable.
+Solution: Give an error. Unify the error messages.
+Files: src/evalvars.c, src/globals.h, src/vim9compile.c,
+ src/proto/vim9compile.pro, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1029
+Problem: Vim9: cannot chain function calls with -> at line start.
+Solution: Peek ahead for a following line starting with "->". (closes #6306)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1030
+Problem: Reducing size of a terminal window may cause a crash.
+Solution: Make sure the row and column don't become negative. (closes #6273)
+Files: src/libvterm/src/state.c, src/libvterm/src/screen.c
+
+Patch 8.2.1031
+Problem: Build failure with Perl5.32.
+Solution: Define a few more functions. (Felix Yan, closes #6310)
+Files: src/if_perl.xs
+
+Patch 8.2.1032
+Problem: Error message for declaring a variable cannot be translated.
+Solution: Enclose in _(). Make environment variable a separate message.
+Files: src/globals.h, src/vim9compile.c
+
+Patch 8.2.1033
+Problem: Not easy to read the test time in the test output.
+Solution: Align the times. Make slow tests bold.
+Files: src/testdir/runtest.vim
+
+Patch 8.2.1034
+Problem: Compiler warning for uninitialized variables.
+Solution: Add initializations. (John Marriott)
+Files: src/vim9compile.c
+
+Patch 8.2.1035
+Problem: setreg() does not always clear the register.
+Solution: Clear the register if the dict argument is empty. (Andy Massimino,
+ closes #3370)
+Files: src/evalfunc.c, src/testdir/test_registers.vim
+
+Patch 8.2.1036
+Problem: Popupwin test fails sometimes.
+Solution: Use WaitForAssert() instead of a sleep.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.1037
+Problem: Vim9: crash when using line continuation inside :def.
+Solution: Check for no more lines available.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1038
+Problem: Popupwin test fails.
+Solution: Fix WaitForAssert() argument.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.1039
+Problem: Cannot put NUL byte on clipboard.
+Solution: Use the text length. (Christian Brabandt, closes #6312,
+ closes #6149)
+Files: src/winclip.c, src/testdir/test_registers.vim
+
+Patch 8.2.1040
+Problem: Not enough testing for movement commands.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #6313)
+Files: src/testdir/test_cursor_func.vim, src/testdir/test_functions.vim,
+ src/testdir/test_gf.vim, src/testdir/test_normal.vim,
+ src/testdir/test_options.vim, src/testdir/test_quickfix.vim
+
+Patch 8.2.1041
+Problem: Test summary is missing executed count.
+Solution: Adjust pattern used for counting.
+Files: src/testdir/summarize.vim
+
+Patch 8.2.1042
+Problem: Vim9: cannot put an operator on the next line.
+Solution: Require a colon before a range to see if that causes problems.
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/ex_docmd.c,
+ src/globals.h, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1043
+Problem: %a item in 'statusline' not tested.
+Solution: Add a test. (Dominique Pellé, closes #6318)
+Files: src/testdir/test_statusline.vim
+
+Patch 8.2.1044
+Problem: Not all systemd file types are recognized.
+Solution: Match several more files. (Guido Cella, closes #6319)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1045
+Problem: Vim9: line break before operator does not work.
+Solution: Peek the next line for an operator.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1046
+Problem: Insufficient tests for src/buffer.c.
+Solution: Add more tests. Move comments related tests to a separate file.
+ (Yegappan Lakshmanan, closes #6325)
+Files: src/testdir/Make_all.mak, src/testdir/test_buffer.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_comments.vim,
+ src/testdir/test_normal.vim, src/testdir/test_textformat.vim
+
+Patch 8.2.1047
+Problem: Vim9: script cannot use line continuation like in a :def function.
+Solution: Pass the getline function pointer to the eval() functions. Use it
+ for addition and multiplication operators.
+Files: src/vim.h, src/structs.h, src/globals.h, src/ex_eval.c,
+ src/eval.c, src/proto/eval.pro, src/dict.c, src/evalfunc.c,
+ src/evalvars.c, src/list.c, src/userfunc.c, src/scriptfile.c,
+ src/proto/scriptfile.pro, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1048 (after 8.2.1047)
+Problem: Build failure without the eval feature.
+Solution: Add dummy typedef.
+Files: src/structs.h
+
+Patch 8.2.1049 (after 8.2.1047)
+Problem: Vim9: leaking memory when using continuation line.
+Solution: Keep a pointer to the continuation line in evalarg_T. Centralize
+ checking for a next command.
+Files: src/structs.h, src/eval.c, src/proto/eval.pro, src/beval.c,
+ src/buffer.c, src/clientserver.c, src/evalvars.c, src/ex_docmd.c,
+ src/ex_eval.c, src/filepath.c, src/findfile.c, src/fold.c,
+ src/globals.h, src/if_ole.cpp, src/if_perl.xs, src/if_tcl.c,
+ src/map.c, src/quickfix.c, src/regexp.c, src/register.c,
+ src/screen.c, src/userfunc.c
+
+Patch 8.2.1050 (after 8.2.1049)
+Problem: Missing change in struct.
+Solution: Add missing change.
+Files: src/ex_cmds.h
+
+Patch 8.2.1051
+Problem: Crash when changing a list while using reduce() on it.
+Solution: Lock the list. (closes #6330)
+Files: src/list.c, src/testdir/test_listdict.vim
+
+Patch 8.2.1052
+Problem: Build failure with older compilers.
+Solution: Move declaration to start of block.
+Files: src/eval.c
+
+Patch 8.2.1053
+Problem: Insufficient testing for 'statusline' and 'tabline'.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #6333)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_statusline.vim,
+ src/testdir/test_tabline.vim
+
+Patch 8.2.1054
+Problem: Not so easy to pass a lua function to Vim.
+Solution: Convert a Lua function and closure to a Vim funcref. (Prabir
+ Shrestha, closes #6246)
+Files: runtime/doc/if_lua.txt, src/if_lua.c, src/proto/userfunc.pro,
+ src/structs.h, src/testdir/test_lua.vim, src/userfunc.c
+
+Patch 8.2.1055
+Problem: No filetype set for pacman config files.
+Solution: Recognize pacman.conf and *.hook. (Guido Cella, closes #6335)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1056
+Problem: Wrong display when mixing match conceal and syntax conceal.
+Solution: Adjust how conceal flags are used. (closes #6327, closes #6303)
+Files: src/drawline.c, src/highlight.c,
+ src/testdir/test_matchadd_conceal.vim
+
+Patch 8.2.1057 (after 8.2.1054)
+Problem: Cannot build with dynamic Lua.
+Solution: Add dll variables.
+Files: src/if_lua.c
+
+Patch 8.2.1058
+Problem: Multiline conceal causes display errors.
+Solution: Do not allow conceal cross over EOL. (closes #6326, closes #4854,
+ closes #6302)
+Files: src/drawline.c, src/testdir/test_conceal.vim,
+ src/testdir/test_diffmode.vim
+
+Patch 8.2.1059
+Problem: Crash when using :tabonly in an autocommand. (Yegappan Lakshmanan)
+Solution: Do not allow the autocommand window to be closed.
+Files: src/ex_docmd.c, src/window.c, src/globals.h,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.1060
+Problem: Not all elinks files are recognized.
+Solution: Just check for "elinks.conf". (Guido Cella, closes #6337)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1061
+Problem: Insufficient testing for src/window.c.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #6345)
+Files: src/testdir/test_excmd.vim, src/testdir/test_gf.vim,
+ src/testdir/test_options.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_tabpage.vim,
+ src/testdir/test_tagjump.vim, src/testdir/test_window_cmd.vim,
+ src/window.c
+
+Patch 8.2.1062
+Problem: Vim9: no line break allowed inside "cond ? val1 : val2".
+Solution: Check for operator after line break.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1063
+Problem: Vim9: no line break allowed before || or &&.
+Solution: Check for operator after line break.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1064
+Problem: Vim9: no line break allowed before comparators.
+Solution: Check for comparator after line break.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1065
+Problem: Vim9: no line break allowed inside a list.
+Solution: Handle line break inside a list in Vim9 script.
+Files: src/eval.c, src/proto/eval.pro, src/list.c, src/proto/list.pro,
+ src/vim9compile.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_arglist.vim
+
+Patch 8.2.1066
+Problem: Lua arrays are zero based.
+Solution: Make Lua arrays one based. (Prabir Shrestha, closes #6347)
+ Note: this is not backwards compatible.
+Files: runtime/doc/if_lua.txt, src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.1067
+Problem: Expression "!expr->func()" does not work.
+Solution: Apply plus and minus earlier. (closes #6348)
+Files: src/eval.c, src/proto/eval.pro, src/evalvars.c, src/userfunc.c,
+ src/testdir/test_expr.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1068
+Problem: Vim9: no line break allowed inside a dict.
+Solution: Handle line break inside a dict in Vim9 script.
+Files: src/eval.c, src/dict.c, src/proto/dict.pro,
+ src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1069
+Problem: Vim9: fail to check for white space in list.
+Solution: Add check for white space.
+Files: src/list.c
+
+Patch 8.2.1070
+Problem: Vim9: leaking memory when lacking white space in dict.
+Solution: Clear the typval.
+Files: src/dict.c
+
+Patch 8.2.1071
+Problem: Vim9: no line break allowed inside a lambda.
+Solution: Handle line break inside a lambda in Vim9 script.
+Files: src/eval.c, src/proto/eval.pro, src/evalvars.c, src/userfunc.c,
+ src/proto/userfunc.pro, src/popupwin.c, src/vim9compile.c,
+ src/ex_eval.c, src/globals.h, src/structs.h,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1072
+Problem: Missing libvterm test.
+Solution: Sync with libvterm revision 768.
+Files: src/libvterm/src/state.c, src/libvterm/t/63screen_resize.test
+
+Patch 8.2.1073
+Problem: Vim9: no line break allowed in () expression.
+Solution: Skip a line break.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1074
+Problem: Vim9: no line break allowed after some operators.
+Solution: Skip a line break after the operator. Add
+ eval_may_get_next_line() to simplify checking for a line break.
+Files: src/eval.c, src/proto/eval.pro, src/dict.c, src/list.c,
+ src/userfunc.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1075
+Problem: Vim9: no line break allowed in :echo expression.
+Solution: Skip linebreak.
+Files: src/eval.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1076
+Problem: Vim9: no line break allowed in :if expression.
+Solution: Skip linebreak.
+Files: src/eval.c, src/proto/eval.pro, src/evalvars.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1077
+Problem: No enough test coverage for highlighting.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #6351)
+Files: runtime/doc/syntax.txt, src/testdir/test_cmdline.vim,
+ src/testdir/test_highlight.vim, src/testdir/test_match.vim
+
+Patch 8.2.1078
+Problem: Highlight and match functionality together in one file.
+Solution: Move match functionality to a separate file. (Yegappan Lakshmanan,
+ closes #6352)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/highlight.c, src/match.c, src/proto.h,
+ src/proto/highlight.pro, src/proto/match.pro
+
+Patch 8.2.1079
+Problem: Vim9: no line break allowed in a while loop.
+Solution: Update stored loop lines when finding line breaks.
+Files: src/structs.h, src/globals.h, src/eval.c, src/evalvars.c,
+ src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1080
+Problem: Vim9: no line break allowed in a for loop.
+Solution: Skip line breaks in for command.
+Files: src/eval.c, src/ex_eval.c, src/proto/eval.pro, src/userfunc.c,
+ src/structs.h, src/globals.h, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1081
+Problem: Lua: cannot use table.insert() and table.remove().
+Solution: Add the list functions. (Prabir Shrestha, closes #6353)
+Files: runtime/doc/if_lua.txt, src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.1082
+Problem: Coverity complains about ignoring dict_add() return value.
+Solution: Add (void).
+Files: src/evalfunc.c
+
+Patch 8.2.1083
+Problem: Crash when using reduce() on a NULL list.
+Solution: Only access the list when not NULL.
+Files: src/list.c, src/testdir/test_listdict.vim
+
+Patch 8.2.1084
+Problem: Lua: registering function has useless code.
+Solution: Remove clearing grow arrays.
+Files: src/userfunc.c
+
+Patch 8.2.1085
+Problem: Coverity complains about ignoring dict_add() return value.
+Solution: Add (void).
+Files: src/register.c
+
+Patch 8.2.1086
+Problem: Possibly using freed memory when text properties used when
+ changing indent of a line.
+Solution: Compute the offset before calling ml_replace().
+Files: src/indent.c
+
+Patch 8.2.1087
+Problem: Possible memory leak when file expansion fails.
+Solution: Clear the grow array when returning FAIL. Use an error message
+ instead of an empty string.
+Files: src/filepath.c
+
+Patch 8.2.1088
+Problem: A very long translation might cause a buffer overflow.
+Solution: Truncate the message if needed.
+Files: src/fileio.c
+
+Patch 8.2.1089
+Problem: Coverity warns for pointer computation.
+Solution: Avoid computing a pointer to invalid memory.
+Files: src/spellfile.c
+
+Patch 8.2.1090
+Problem: May use NULL pointer when skipping over name.
+Solution: Always set ll_name_end.
+Files: src/eval.c
+
+Patch 8.2.1091
+Problem: No check if opening a pty works.
+Solution: Check for invalid file descriptor.
+Files: src/os_unix.c
+
+Patch 8.2.1092
+Problem: Not checking if saving for undo succeeds.
+Solution: Bail out if u_savesub() returns FAIL.
+Files: src/textprop.c
+
+Patch 8.2.1093
+Problem: Python: double free when adding item to dict fails.
+Solution: Remove vim_free() call.
+Files: src/if_py_both.h
+
+Patch 8.2.1094
+Problem: Dead code in libvterm.
+Solution: Remove condition that is always true.
+Files: src/libvterm/src/pen.c
+
+Patch 8.2.1095
+Problem: May use pointer after freeing it when text properties are used.
+Solution: Update redo buffer before calling ml_replace().
+Files: src/spellsuggest.c
+
+Patch 8.2.1096
+Problem: Vim9: return type of getqflist() is wrong.
+Solution: Let the return type depend on the arguments. Also for
+ getloclist(). (closes #6357)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1097
+Problem: Highlight code not sufficiently tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #6359)
+Files: src/testdir/test_filter_cmd.vim, src/testdir/test_highlight.vim
+
+Patch 8.2.1098
+Problem: Vim9: cannot use line break in :throw argument.
+Solution: Check for line break.
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1099
+Problem: Vim9: cannot use line break in :cexpr argument.
+Solution: Check for line break.
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1100
+Problem: Vim9: cannot use line break in :execute, :echomsg and :echoerr
+ argument.
+Solution: Check for line break.
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1101
+Problem: No error when using wrong arguments for setqflist() or
+ setloclist().
+Solution: Check for the error.
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.1102
+Problem: Coverity gets confused by an unnecessary NULL check.
+Solution: Remove the check for NULL.
+Files: src/quickfix.c
+
+Patch 8.2.1103
+Problem: Coverity reports an unnecessary NULL check.
+Solution: Remove the check for NULL.
+Files: src/eval.c
+
+Patch 8.2.1104
+Problem: Coverity warns for possible NULL pointer use.
+Solution: Check "pbyts" is not NULL.
+Files: src/spellsuggest.c
+
+Patch 8.2.1105
+Problem: Insufficient test coverage for Lua.
+Solution: Add tests. (Yegappan Lakshmanan, closes #6368) Fix uncovered
+ memory leak. Avoid unnecessary copy/free.
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.1106
+Problem: Crash when trying to use s: variable in typed command.
+Solution: Don't use the script index when not set. (Ken Takata,
+ closes #6366)
+Files: src/vim9compile.c, src/testdir/test_vimscript.vim
+
+Patch 8.2.1107
+Problem: 'imactivatefunc' and 'imstatusfunc' are not used in the GUI.
+Solution: Adjust the #ifdefs. (closes #6367)
+Files: runtime/doc/options.txt, src/gui_xim.c,
+ src/testdir/test_iminsert.vim
+
+Patch 8.2.1108
+Problem: Mouse left-right scroll is not supported in terminal window.
+Solution: Implement mouse codes 6 and 7. (Trygve Aaberge, closes #6363)
+Files: src/libvterm/src/mouse.c, src/mouse.c, src/terminal.c,
+ src/testdir/mouse.vim, src/testdir/test_termcodes.vim
+
+Patch 8.2.1109 (after 8.2.1106)
+Problem: Still crashing when using s:variable.
+Solution: Remove assignment. (Ken Takata)
+Files: src/vim9compile.c
+
+Patch 8.2.1110
+Problem: Vim9: line continuation does not work in function arguments.
+Solution: Pass "evalarg" to get_func_tv(). Fix seeing double quoted string
+ as comment.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/eval.c, src/ex_eval.c,
+ src/list.c, src/dict.c, src/proto/eval.pro,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1111
+Problem: Inconsistent naming of get_list_tv() and eval_dict().
+Solution: Rename get_list_tv() to eval_list(). Similarly for eval_number(),
+ eval_string(), eval_lit_string() and a few others.
+Files: src/eval.c, src/list.c, src/proto/list.pro, src/vim9compile.c,
+ src/typval.c, src/proto/typval.pro, src/vim9script.c,
+ src/evalfunc.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/vim9execute.c
+
+Patch 8.2.1112
+Problem: Vim9: no line continuation allowed in method call.
+Solution: Handle line continuation in expression before method call.
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1113
+Problem: No test for verbose output of :call.
+Solution: Add a test.
+Files: src/testdir/test_user_func.vim
+
+Patch 8.2.1114
+Problem: Terminal test sometimes times out.
+Solution: Split the test in two parts.
+Files: src/testdir/Makefile, src/testdir/Make_all.mak,
+ src/testdir/term_util.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_terminal2.vim
+
+Patch 8.2.1115
+Problem: Iminsert test fails when compiled with VIMDLL.
+Solution: Change condition. (Ken Takata, closes #6376)
+Files: src/testdir/test_iminsert.vim
+
+Patch 8.2.1116
+Problem: Vim9: parsing command checks for list twice.
+Solution: Adjust how a command is parsed.
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1117
+Problem: Coverity warns for using uninitialized field.
+Solution: Initialize v_lock.
+Files: src/if_lua.c
+
+Patch 8.2.1118
+Problem: Condition can never be true, dead code.
+Solution: Remove the dead code.
+Files: src/move.c
+
+Patch 8.2.1119
+Problem: Configure fails with Xcode 12 beta.
+Solution: use "return" instead of "exit()". (Nico Weber, closes #6381)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.1120
+Problem: Python code not tested properly.
+Solution: Add more tests and convert old-style test into new-style test.
+ (Yegappan Lakshmanan, closes #6370)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test86.in, src/testdir/test86.ok,
+ src/testdir/test_python2.vim
+
+Patch 8.2.1121
+Problem: Command completion not working after ++arg.
+Solution: Move skipping up. (Christian Brabandt, closes #6382)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.1122
+Problem: Vim9: line continuation in dict member not recognized.
+Solution: Check for line continuation.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1123
+Problem: Python 3 test is old style.
+Solution: Turn into new style test. (Yegappan Lakshmanan, closes #6385)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test87.in, src/testdir/test87.ok,
+ src/testdir/test_python2.vim, src/testdir/test_python3.vim
+
+Patch 8.2.1124
+Problem: Vim9: no line break allowed in :import command.
+Solution: Skip over line breaks.
+Files: src/vim9script.c, src/proto/vim9script.pro, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1125
+Problem: Vim9: double quote can be a string or a comment.
+Solution: Only support comments starting with # to avoid confusion.
+Files: src/eval.c, src/proto/eval.pro, src/dict.c, src/list.c,
+ src/vim9script.c
+
+Patch 8.2.1126
+Problem: Vim9: using :copen causes an error.
+Solution: Add flag LET_NO_COMMAND in set_var().
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1127
+Problem: Vim9: getting a dict member may not work.
+Solution: Clear the dict only after copying the item. (closes #6390)
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1128
+Problem: The write message mentions characters, but it's actually bytes.
+Solution: Change "C" to "B" and "characters" to "bytes".
+Files: runtime/doc/options.txt, src/fileio.c,
+ src/testdir/test_cscope.vim, src/testdir/test_netbeans.vim,
+ src/testdir/dumps/Test_diff_syntax_1.dump,
+ src/testdir/dumps/Test_long_file_name_1.dump,
+ src/testdir/dumps/Test_display_unprintable_01.dump,
+ src/testdir/dumps/Test_tselect_1.dump
+
+Patch 8.2.1129
+Problem: Vim9: bar not recognized after not compiled command.
+Solution: Check for bar for commands where this is possible. (closes #6391)
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1130
+Problem: Vim9: bar not recognized after function call
+Solution: Skip whitespace. (closes #6391)
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1131
+Problem: Vim9: error message for returning a value in a function that does
+ not return anything is not clear.
+Solution: Add a specific message.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1132
+Problem: Vim9: return type of repeat() is not specific enough.
+Solution: Return the type of the first argument. (closes #6395)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1133
+Problem: Vim9: return type of add() is not specific enough.
+Solution: Return the type of the first argument. (closes #6395)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1134
+Problem: Vim9: getting a list member may not work.
+Solution: Clear the list only after copying the item. (closes #6393)
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1135
+Problem: Vim9: getting a dict member may not work.
+Solution: Clear the dict only after copying the item.
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1136
+Problem: Vim9: return type of argv() is always any.
+Solution: Use list<string> if there is no argument.
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1137
+Problem: Vim9: modifiers not cleared after compiling function.
+Solution: Clear command modifiers. (closes #6396)
+Files: src/vim9compile.c, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/testdir/test_vim9_func.vim,
+ src/testdir/dumps/Test_vim9_silent_echo.dump
+
+Patch 8.2.1138
+Problem: Vim9: return type of copy() and deepcopy() is any.
+Solution: Use type of the argument.
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1139 (after 8.2.1137)
+Problem: Vim9: test for silent echo fails in some environments.
+Solution: Use :function instead of :def.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.1140
+Problem: Vim9: return type of extend() is any.
+Solution: Use type of the argument.
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1141
+Problem: Vim9: return type of filter() is any.
+Solution: Use type of the argument.
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1142
+Problem: Vim9: return type of insert() is any.
+Solution: Use type of the first argument.
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1143
+Problem: Vim9: return type of remove() is any.
+Solution: Use the member type of the first argument, if known.
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1144
+Problem: Vim9: return type of reverse() is any.
+Solution: Use the type of the first argument.
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1145
+Problem: Vim9: "for" only accepts a list at compile time.
+Solution: Also accept a list at runtime.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1146
+Problem: Not enough testing for Python.
+Solution: Add more tests. Fix uncovered problems. (Yegappan Lakshmanan,
+ closes #6392)
+Files: src/if_py_both.h, src/if_python3.c, src/testdir/shared.vim,
+ src/testdir/test_python2.vim, src/testdir/test_python3.vim
+
+Patch 8.2.1147
+Problem: :confirm may happen in cooked mode. (Jason Franklin)
+Solution: Switch to raw mode before prompting. (Brandon Pfeifer)
+Files: src/message.c, src/testdir/test_excmd.vim
+
+Patch 8.2.1148
+Problem: Warning for using int instead of size_t.
+Solution: Change "len" argument to size_t. (Mike Williams)
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/vim9script.c
+
+Patch 8.2.1149
+Problem: Vim9: :eval command not handled properly.
+Solution: Compile the :eval command. (closes #6408)
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1150
+Problem: ml_get error when using Python. (Yegappan Lakshmanan)
+Solution: Check the line number is not out of range. Call "Check" with
+ "fromObj" instead of "from".
+Files: src/if_py_both.h, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim
+
+Patch 8.2.1151
+Problem: Insufficient test coverage for Python.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #6415)
+Files: src/testdir/test_python2.vim, src/testdir/test_python3.vim
+
+Patch 8.2.1152
+Problem: Vim9: function reference is missing script prefix.
+Solution: Use the actual function name instead of the name searched for in
+ the script context. (closes #6412)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1153
+Problem: Vim9: script test fails on some systems.
+Solution: Return proper value from Compare().
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1154
+Problem: Vim9: crash when using imported function.
+Solution: Check for a function type. Set the script context when calling a
+ function. (closes #6412)
+Files: src/evalvars.c, src/scriptfile.c, src/proto/scriptfile.pro,
+ src/vim9execute.c, src/structs.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1155
+Problem: Vim9: cannot handle line break inside lambda.
+Solution: Pass the compilation context through. (closes #6407, closes #6409)
+Files: src/structs.h, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/eval.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1156
+Problem: Vim9: No error for invalid command in compiled function.
+Solution: Handle CMD_SIZE.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1157
+Problem: Vim9: dict.name is not recognized as an expression.
+Solution: Recognize ".name". (closes #6418)
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1158 (after 8.2.1155)
+Problem: Build error.
+Solution: Add missing change to globals.
+Files: src/globals.h
+
+Patch 8.2.1159
+Problem: Vim9: no error for missing space after a comma.
+Solution: Check for white space.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1160
+Problem: Vim9: memory leak in allocated types.
+Solution: Free the type pointers.
+Files: src/vim9script.c, src/userfunc.c, src/vim9compile.c,
+ src/proto/vim9compile.pro
+
+Patch 8.2.1161
+Problem: Vim9: using freed memory.
+Solution: Put pointer back in evalarg instead of freeing it.
+Files: src/userfunc.c, src/vim9compile.c, src/eval.c, src/proto/eval.pro,
+ src/structs.h
+
+Patch 8.2.1162
+Problem: Crash when using a lambda.
+Solution: Check for evalarg to be NULL.
+Files: src/userfunc.c
+
+Patch 8.2.1163 (after 8.2.1161)
+Problem: Build error.
+Solution: Add missing change to globals.
+Files: src/globals.h
+
+Patch 8.2.1164
+Problem: Text cleared by checking terminal properties not redrawn. (Alexey
+ Radkov)
+Solution: Mark the screen characters as invalid. (closes #6422)
+Files: src/screen.c, src/proto/screen.pro, src/term.c
+
+Patch 8.2.1165
+Problem: Insufficient testing for the Tcl interface.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #6423)
+Files: src/testdir/test_tcl.vim
+
+Patch 8.2.1166
+Problem: Once mouse move events are enabled getchar() returns them.
+Solution: Ignore K_MOUSEMOVE in getchar(). (closes #6424)
+Files: runtime/doc/eval.txt, src/getchar.c
+
+Patch 8.2.1167
+Problem: Vim9: builtin function method call only supports first argument.
+Solution: Shift arguments when needed. (closes #6305, closes #6419)
+Files: src/evalfunc.c, src/vim9compile.c, src/vim9execute.c,
+ src/vim9.h, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1168
+Problem: Wrong method argument for appendbufline().
+Solution: Use FEARG_3.
+Files: src/evalfunc.c
+
+Patch 8.2.1169
+Problem: Write NUL past allocated space using corrupted spell file.
+ (Markus Vervier)
+Solution: Init "c" every time.
+Files: src/spellfile.c
+
+Patch 8.2.1170
+Problem: Cursor off by one with block paste while 'virtualedit' is "all".
+Solution: Adjust condition. (Hugo Gualandi, closes #6430)
+Files: src/register.c, src/testdir/test_registers.vim
+
+Patch 8.2.1171
+Problem: Possible crash when out of memory.
+Solution: Check for NULL pointer. (Dominique Pellé, closes #6432)
+Files: src/syntax.c
+
+Patch 8.2.1172
+Problem: Error messages when doing "make clean" in the runtime/doc or
+ src/tee directories.
+Solution: Use "rm -f".
+Files: runtime/doc/Makefile, src/tee/Makefile
+
+Patch 8.2.1173
+Problem: Tee doesn't build on some systems.
+Solution: Include header files. (Dominique Pelle, closes #6431)
+Files: src/tee/tee.c
+
+Patch 8.2.1174
+Problem: No test for the "recording @x" message.
+Solution: Add a test. (Dominique Pellé, closes #6427)
+Files: src/testdir/test_registers.vim
+
+Patch 8.2.1175
+Problem: Vim9: Cannot split a line before ".member".
+Solution: Check for ".member" after line break.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1176
+Problem: Vim9: not enough type checking in Vim9 script.
+Solution: Use same type checking as in a :def function.
+Files: src/vim9compile.c, src/proto/vim9compile.pro,
+ src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1177
+Problem: Terminal2 test sometimes hangs in the GUI.
+Solution: Move some tests to other files to further locate the problem.
+ Set the GUI to a fixed screen size.
+Files: src/testdir/test_terminal.vim, src/testdir/test_terminal2.vim,
+ src/testdir/test_terminal3.vim, src/testdir/Make_all.mak,
+ src/testdir/runtest.vim
+
+Patch 8.2.1178
+Problem: Vim9: filter function recognized as command modifier, leading to a
+ crash.
+Solution: Clear cmdmod after freeing items. Do not recognize a command
+ modifier followed by non-white space. (closes #6434)
+Files: src/ex_docmd.c, src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1179
+Problem: Test_termwinscroll() sometimes hangs in the GUI.
+Solution: Skip the test in the GUI.
+Files: src/testdir/test_terminal2.vim
+
+Patch 8.2.1180
+Problem: Build failure in small version.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.2.1181
+Problem: Json code not fully tested.
+Solution: Add more test coverage. (Dominique Pellé, closes #6433)
+Files: src/testdir/test_json.vim
+
+Patch 8.2.1182
+Problem: Vim9: no check for whitespace after comma in lambda.
+Solution: Give error if white space is missing.
+Files: src/userfunc.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1183
+Problem: assert_fails() checks the last error message.
+Solution: Check the first error, it is more relevant. Fix all the tests
+ that rely on the old behavior.
+Files: runtime/doc/testing.txt, src/message.c, src/globals.h,
+ src/testing.c, src/testdir/test_autocmd.vim,
+ src/testdir/test_buffer.vim, src/testdir/test_cd.vim,
+ src/testdir/test_channel.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_cpoptions.vim,
+ src/testdir/test_cscope.vim, src/if_cscope.c,
+ src/testdir/test_excmd.vim, src/evalvars.c,
+ src/testdir/test_expr.vim, src/testdir/test_functions.vim,
+ src/testdir/test_json.vim, src/testdir/test_let.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_listener.vim,
+ src/testdir/test_match.vim, src/testdir/test_menu.vim,
+ src/testdir/test_method.vim, src/testdir/test_normal.vim,
+ src/testdir/test_popup.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_random.vim, src/testdir/test_search.vim,
+ src/testdir/test_signs.vim, src/testdir/test_spell.vim,
+ src/testdir/test_substitute.vim, src/testdir/test_syntax.vim,
+ src/testdir/test_tagjump.vim, src/testdir/test_taglist.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_textprop.vim,
+ src/testdir/test_trycatch.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim, src/testdir/test_viminfo.vim,
+ src/testdir/test_winbuf_close.vim,
+ src/testdir/test_window_cmd.vim, src/testdir/test_writefile.vim,
+ src/testdir/test_regexp_latin.vim, src/testdir/test_utf8.vim,
+ src/testdir/test_global.vim, src/testdir/test_tagfunc.vim
+
+Patch 8.2.1184 (after 8.2.1183)
+Problem: Some tests fail.
+Solution: Adjust tests for different assert_fails() behavior. Remove unused
+ variable.
+Files: src/testdir/test_assert.vim, src/testdir/test_eval_stuff.vim,
+ src/evalvars.c
+
+Patch 8.2.1185 (after 8.2.1183)
+Problem: Some other tests fail.
+Solution: Adjust tests for different assert_fails() behavior.
+Files: src/testdir/test_lua.vim, src/testdir/test_tcl.vim
+
+Patch 8.2.1186
+Problem: With SGR mouse codes balloon doesn't show up after click.
+Solution: Add the MOUSE_RELEASE bits to mouse_code.
+Files: src/mouse.c
+
+Patch 8.2.1187
+Problem: Terminal2 test sometimes hangs in the GUI on Travis.
+Solution: Disable Test_zz2_terminal_guioptions_bang() for now.
+Files: src/testdir/test_terminal2.vim
+
+Patch 8.2.1188
+Problem: Memory leak with invalid json input.
+Solution: Free all keys at the end. (Dominique Pellé, closes #6443,
+ closes #6442)
+Files: src/json.c, src/testdir/test_json.vim
+
+Patch 8.2.1189
+Problem: Vim9: line continuation in lambda doesn't always work.
+Solution: Do not use a local evalarg unless there isn't one. (closes #6439)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1190
+Problem: Vim9: checking for Vim9 syntax is spread out.
+Solution: Use in_vim9script().
+Files: src/vim9script.c, src/dict.c, src/eval.c, src/evalvars.c,
+ src/ex_docmd.c, src/list.c, src/scriptfile.c, src/userfunc.c
+
+Patch 8.2.1191
+Problem: Vim9: crash when function calls itself.
+Solution: Add status UF_COMPILING. (closes #6441)
+Files: src/structs.h, src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1192
+Problem: Lua test fails with older Lua version.
+Solution: Adjust expected error messages. (closes #6444)
+Files: src/testdir/test_lua.vim
+
+Patch 8.2.1193
+Problem: Terminal window not redrawn when dragging a popup window over it.
+Solution: Redraw terminal window. (fixes #6438)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_term_01.dump,
+ src/testdir/dumps/Test_popupwin_term_02.dump
+
+Patch 8.2.1194
+Problem: Test failure because shell prompt differs.
+Solution: Set the shell prompt.
+Files: src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_term_01.dump,
+ src/testdir/dumps/Test_popupwin_term_02.dump
+
+Patch 8.2.1195
+Problem: Clientserver test fails on MS-Windows.
+Solution: Expect a different error message.
+Files: src/testdir/test_clientserver.vim
+
+Patch 8.2.1196
+Problem: Build failure with normal features.
+Solution: Add #ifdef.
+Files: src/popupwin.c
+
+Patch 8.2.1197
+Problem: Clientserver test still fails on MS-Windows.
+Solution: Expect a different error message.
+Files: src/testdir/test_clientserver.vim
+
+Patch 8.2.1198
+Problem: Terminal2 test sometimes hangs in the GUI on Travis.
+Solution: Move test function to terminal3 to see if the problem moves too.
+Files: src/testdir/test_terminal2.vim, src/testdir/test_terminal3.vim
+
+Patch 8.2.1199
+Problem: Not all assert functions are fully tested.
+Solution: Test more assert functions.
+Files: src/testing.c, src/testdir/test_assert.vim
+
+Patch 8.2.1200
+Problem: Vim9: cannot disassemble a lambda function.
+Solution: Recognize "<lambda>123" as a function name.
+Files: src/vim9execute.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1201
+Problem: Vim9: crash when passing number as dict key.
+Solution: Check key type to be string. (closes #6449)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1202
+Problem: Vim9: crash when calling a closure from a builtin function.
+Solution: Use the current execution context. (closes #6441)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1203
+Problem: Unused assignments in expression evaluation.
+Solution: Move declarations and assignments to inner blocks where possible.
+Files: src/eval.c
+
+Patch 8.2.1204
+Problem: Vim9: true and false not recognized in Vim9 script.
+Solution: Recognize true and false.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1205
+Problem: Vim9: && and || work differently when not compiled.
+Solution: Keep the value.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1206
+Problem: Vim9: crash in expr test when run in the GUI.
+Solution: Temporarily comment out two test lines.
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1207
+Problem: Vim9: crash in expr test when run in the GUI.
+Solution: Break out of loop over hashtab also when function got removed and
+ added.
+Files: src/userfunc.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1208
+Problem: Build failure.
+Solution: Add missing change.
+Files: src/structs.h
+
+Patch 8.2.1209
+Problem: Vim9: test failure.
+Solution: Add missing changes to hashtab.
+Files: src/hashtab.c
+
+Patch 8.2.1210
+Problem: Using ht_used when looping through a hashtab is less reliable.
+Solution: Use ht_changed in a few more places.
+Files: src/userfunc.c, src/if_py_both.h
+
+Patch 8.2.1211 (after 8.2.1118)
+Problem: Removed more than dead code.
+Solution: Put back the decrement.
+Files: src/move.c, src/testdir/test_diffmode.vim
+
+Patch 8.2.1212
+Problem: Cannot build with Lua 5.4.
+Solution: Use luaL_typeerror instead defining it. (closes #6454)
+Files: src/if_lua.c
+
+Patch 8.2.1213
+Problem: Mouse codes not tested sufficiently.
+Solution: Add more tests for mouse codes. (closes #6436)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.2.1214
+Problem: MS-Windows: default _vimrc not correct in silent install mode.
+Solution: Add the LoadDefaultVimrc macro. (Ken Takata, closes #6451)
+Files: nsis/gvim.nsi
+
+Patch 8.2.1215
+Problem: Atari MiNT support is outdated.
+Solution: Nobody responded this code is still useful, so let's delete it.
+Files: Filelist, src/os_mint.h, src/vim.h, src/Make_mint.mak,
+ src/digraph.c, src/fileio.c, src/memfile.c, src/os_unix.c,
+ src/term.c, READMEdir/README_extra.txt, runtime/doc/os_mint.txt,
+ src/INSTALL
+
+Patch 8.2.1216
+Problem: Startup test fails.
+Solution: Adjust expected values for deleted lines.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.1217
+Problem: Startup test depends on random source file.
+Solution: Write a test file to find quickfix errors in.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.1218
+Problem: Vim9: cannot use 'text'->func().
+Solution: Recognize string at start of command.
+Files: src/vim9compile.c, src/ex_docmd.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1219
+Problem: Symlink not followed if dirname ends in //.
+Solution: Resolve symlink earlier. (Tomáš Janoušek, closes #6454)
+Files: src/memline.c, src/testdir/test_swap.vim
+
+Patch 8.2.1220
+Problem: memory access error when dragging a popup window over a buffer
+ with folding.
+Solution: Avoid going over the end of the cache. (closes #6438)
+Files: src/mouse.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_term_01.dump,
+ src/testdir/dumps/Test_popupwin_term_02.dump,
+ src/testdir/dumps/Test_popupwin_term_03.dump,
+ src/testdir/dumps/Test_popupwin_term_04.dump
+
+Patch 8.2.1221
+Problem: Memory leak when updating popup window.
+Solution: Clear search highlighting.
+Files: src/popupwin.c
+
+Patch 8.2.1222
+Problem: When using valgrind a Vim command started by a test uses the same
+ log file name which gets overwritten.
+Solution: Fix regexp to rename the log file.
+Files: src/testdir/shared.vim
+
+Patch 8.2.1223
+Problem: Vim9: invalid type error for function default value.
+Solution: Use right argument index. (closes #6458)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1224
+Problem: Vim9: arguments from partial are not used.
+Solution: Put the partial arguments on the stack. (closes #6460)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1225
+Problem: Linker errors when building with dynamic Python 3.9.
+Solution: Add #defined items. (closes #6461)
+Files: src/if_python3.c
+
+Patch 8.2.1226
+Problem: MS-Windows: windows positioning wrong when the taskbar is placed
+ at the top or left of the screen.
+Solution: Use GetWindowRect and MoveWindow APIs. (Yukihiro Nakadaira,
+ Ken Takata, closes #6455)
+Files: src/gui_w32.c
+
+Patch 8.2.1227
+Problem: Vim9: allowing both quoted and # comments is confusing.
+Solution: Only support # comments in Vim9 script.
+Files: runtime/doc/vim9.txt, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/vim9compile.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1228
+Problem: Scrollbars not flush against the window edges when maximised.
+Solution: Add padding. (Ken Takata, closes #5602, closes #6466)
+Files: src/gui.c, src/gui_athena.c, src/gui_gtk.c, src/gui_haiku.cc,
+ src/gui_mac.c, src/gui_motif.c, src/gui_photon.c, src/gui_w32.c,
+ src/proto/gui_athena.pro, src/proto/gui_gtk.pro,
+ src/proto/gui_haiku.pro, src/proto/gui_mac.pro,
+ src/proto/gui_motif.pro, src/proto/gui_photon.pro,
+ src/proto/gui_w32.pro
+
+Patch 8.2.1229
+Problem: Build error without the eval feature.
+Solution: Declare starts_with_colon. Make function local.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro
+
+Patch 8.2.1230
+Problem: Vim9: list index error not caught by try/catch.
+Solution: Do not bail out if an error is inside try/catch. (closes #6462)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1231
+Problem: MS-Windows: GUI code can be cleaned up.
+Solution: Do a bit of cleaning up. (Ken Takata, closes #6465)
+Files: src/gui_w32.c, src/proto/gui_w32.pro
+
+Patch 8.2.1232
+Problem: MS-Windows GUI: Snap cancelled by split command.
+Solution: Do not cancel Snap when splitting a window. (Ken Takata,
+ closes #6467)
+Files: src/gui_w32.c
+
+Patch 8.2.1233
+Problem: Vim9: various errors not caught by try/catch.
+Solution: Do not bail out if an error is inside try/catch.
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1234
+Problem: Lua build problem with old compiler.
+Solution: Move declarations to start of the block. (Taro Muraoka,
+ closes #6477)
+Files: src/if_lua.c
+
+Patch 8.2.1235
+Problem: Not all mouse codes covered by tests.
+Solution: Add more tests for the mouse. (Yegappan Lakshmanan, closes #6472)
+Files: src/testdir/mouse.vim, src/testdir/test_termcodes.vim
+
+Patch 8.2.1236
+Problem: Vim9: a few errors not caught by try/catch.
+Solution: Do not bail out if an error is inside try/catch. Fix that a not
+ matching catch doesn't jump to :endtry.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1237
+Problem: Changing 'completepopup' after opening a popup has no effect. (Jay
+ Sitter)
+Solution: Close the popup when the options are changed. (closes #6471)
+Files: runtime/doc/options.txt, src/popupwin.c, src/proto/popupwin.pro,
+ src/optionstr.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_infopopup_8.dump
+
+Patch 8.2.1238
+Problem: Vim9: a few remaining errors not caught by try/catch.
+Solution: Do not bail out if an error is inside try/catch.
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1239
+Problem: "maxwidth" in 'completepopup' not obeyed. (Jay Sitter)
+Solution: Add separate field for value from option. (closes #6470)
+Files: src/structs.h, src/popupwin.c, src/popupmenu.c,
+ src/testdir/dumps/Test_popupwin_infopopup_9.dump
+
+Patch 8.2.1240
+Problem: GUI tests sometimes fail because of translations.
+Solution: Reload the menus without translation. (Taro Muraoka, closes #6486)
+Files: src/testdir/runtest.vim
+
+Patch 8.2.1241
+Problem: Cannot use getbufinfo() as a method.
+Solution: Support using getbufinfo() as a method. (closes #6458)
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_bufwintabinfo.vim
+
+Patch 8.2.1242
+Problem: Vim9: no error if calling a function with wrong argument type.
+Solution: Check types of arguments. (closes #6469)
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1243
+Problem: Vim9: cannot have a comment or empty line halfway a list at script
+ level.
+Solution: Skip more than one line if needed.
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/eval.c,
+ src/scriptfile.c
+
+Patch 8.2.1244
+Problem: Vim9: in lambda index assumes a list.
+Solution: Use the value type to decide about list or dict. (closes #6479)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1245
+Problem: Build failure in tiny version.
+Solution: Add #ifdef.
+Files: src/scriptfile.c
+
+Patch 8.2.1246
+Problem: Vim9: comment after assignment doesn't work.
+Solution: Skip over white space. (closes #6481)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1247
+Problem: Vim9: cannot index a character in a string.
+Solution: Add ISN_STRINDEX instruction. (closes #6478)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1248
+Problem: Netbeans test is flaky in the GUI.
+Solution: Filter out geometry messages. (Taro Muraoka, closes #6487)
+Files: src/testdir/test_netbeans.vim
+
+Patch 8.2.1249
+Problem: Vim9: disassemble test fails.
+Solution: Change INDEX to LISTINDEX. Add test for STRINDEX.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1250
+Problem: Vim9: cannot use the g:, b:, t: and w: namespaces.
+Solution: Add instructions to push a dict for the namespaces. (closes #6480)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1251
+Problem: Vim9: warning for pointer usage, test failure undetected.
+Solution: Fix pointer indirection. Give error when executing function
+ failed for any reason. Fix instruction names.
+Files: src/vim9execute.c, src/userfunc.c, src/proto/userfunc.pro
+
+Patch 8.2.1252
+Problem: ":marks" may show '< and '> mixed up.
+Solution: Show the mark position as where '< and '> would jump.
+Files: src/mark.c, src/testdir/test_marks.vim
+
+Patch 8.2.1253
+Problem: CTRL-K in Insert mode gets <CursorHold> inserted. (Roland
+ Puntaier)
+Solution: Do not reset did_cursorhold, restore it. (closes #6447)
+Files: src/normal.c
+
+Patch 8.2.1254
+Problem: MS-Windows: regexp test may fail if 'iskeyword' set wrongly.
+Solution: Override the 'iskeyword' value. (Taro Muraoka, closes #6502)
+Files: src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.1255
+Problem: Cannot use a lambda with quickfix functions.
+Solution: Add support for lambda. (Yegappan Lakshmanan, closes #6499)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/quickfix.txt, src/channel.c, src/evalvars.c,
+ src/optionstr.c, src/proto/evalvars.pro, src/proto/quickfix.pro,
+ src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.1256
+Problem: Vim9: type wrong after getting dict item in lambda.
+Solution: Set the type to "any" after enforcing dict type. (closes #6491)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1257
+Problem: Vim9: list unpack doesn't work at the script level.
+Solution: Detect unpack assignment better. (closes #6494)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1258 (after 8.2.1253)
+Problem: CursorHold does not work well.a (Shane-XB-Qian)
+Solution: Only restore did_cursorhold when using :normal.
+Files: src/normal.c
+
+Patch 8.2.1259
+Problem: Empty group in 'tabline' may cause using an invalid pointer.
+Solution: Set the group start position. (closes #6505)
+Files: src/buffer.c, src/testdir/test_tabline.vim
+
+Patch 8.2.1260
+Problem: There is no good test for CursorHold.
+Solution: Add a test. Remove duplicated test. (Yegappan Lakshmanan,
+ closes #6503)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_buffer.vim,
+ src/testdir/test_normal.vim
+
+Patch 8.2.1261
+Problem: Vim9: common type of function not tested.
+Solution: Add a test. Fix uncovered problems.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1262
+Problem: src/ex_cmds.c file is too big.
+Solution: Move help related code to src/help.c. (Yegappan Lakshmanan,
+ closes #6506)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/cmdexpand.c, src/ex_cmds.c, src/help.c, src/proto.h,
+ src/proto/ex_cmds.pro, src/proto/help.pro
+
+Patch 8.2.1263
+Problem: Vim9: comparators use 'ignorecase' in Vim9 script.
+Solution: Ignore 'ignorecase'. Use true and false instead of 1 and 0.
+ (closes #6497)
+Files: src/eval.c, src/typval.c, src/vim9execute.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1264
+Problem: Terminal getwinpos() test is a bit flaky.
+Solution: Call getwinpos() a bit later.
+Files: src/testdir/test_terminal3.vim
+
+Patch 8.2.1265
+Problem: Crash with EXITFREE when split() fails.
+Solution: Restore 'cpoptions'.
+Files: src/evalfunc.c
+
+Patch 8.2.1266 (after 8.2.1262)
+Problem: Makefile preference were accidentally included.
+Solution: Revert the Makefile changes.
+Files: src/Makefile
+
+Patch 8.2.1267
+Problem: MS-Windows: tests may fail due to $PROMPT value.
+Solution: Set $PROMPT for testing. (Taro Muraoka, closes #6510)
+Files: src/testdir/runtest/vim
+
+Patch 8.2.1268
+Problem: Vim9: no error for using double quote comment after :func or :def.
+Solution: Only accept double quote when not in Vim9 script and not after
+ :def. (closes #6483)
+Files: src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1269
+Problem: Language and locale code spread out.
+Solution: Move relevant code to src/locale.c. (Yegappan Lakshmanan,
+ closes #6509)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_morph.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/ex_cmds2.c, src/locale.c, src/main.c, src/proto.h,
+ src/proto/ex_cmds2.pro, src/proto/locale.pro
+
+Patch 8.2.1270
+Problem: Vim9: not skipping over function type declaration with only a
+ return type.
+Solution: Skip over the return type. (issue #6507)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1271
+Problem: Vim9: Error for Funcref function argument type.
+Solution: Find the actual function type if possible. (issue #6507)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1272
+Problem: Vim9: type not checked if declaration also assigns value.
+Solution: Check the type. (issue #6507)
+Files: src/eval.c, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/vim9script.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1273
+Problem: MS-Windows: terminal test may leave file behind.
+Solution: Wait a moment for process to end before deleting the file.
+ (Taro Muraoka, closes #6513)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.1274
+Problem: Vim9: no error for missing white space in assignment at script
+ level.
+Solution: Check for white space. (closes #6495)
+Files: src/eval.c, src/evalvars.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_let.vim
+
+Patch 8.2.1275
+Problem: Vim9: compiler warning for buffer size.
+Solution: Change the offset from 10 to 15. (Dominique Pellé, closes #6518)
+Files: src/vim9script.c
+
+Patch 8.2.1276
+Problem: MS-Windows: system test may fail if more.exe is installed.
+Solution: Explicitly use more.com. (Taro Muraoka, Ken Takata, closes #6517)
+Files: src/testdir/test_system.vim
+
+Patch 8.2.1277
+Problem: Tests on Travis do not run with EXITFREE.
+Solution: Add EXITFREE to all builds to uncover any mistakes.
+Files: .travis.yml
+
+Patch 8.2.1278
+Problem: Vim9: line break after "->" only allowed in :def function.
+Solution: Only allow line break after "->". (closes #6492)
+Files: src/vim9compile.c, src/globals.h, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1279
+Problem: Some tests on Travis have EXITFREE duplicated.
+Solution: Remove EXITFREE from shadowopt. Add "shadow" to job name.
+Files: .travis.yml
+
+Patch 8.2.1280
+Problem: Ex command error cannot contain an argument.
+Solution: Add ex_errmsg() and translate earlier. Use e_trailing_arg where
+ possible.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/buffer.c,
+ src/ex_eval.c, src/match.c, src/testdir/test_tabpage.vim
+
+Patch 8.2.1281
+Problem: The "trailing characters" error can be hard to understand.
+Solution: Add the trailing characters to the message.
+Files: src/cmdhist.c, src/eval.c, src/evalfunc.c, src/evalvars.c,
+ src/ex_cmds.c, src/ex_docmd.c, src/ex_eval.c, src/json.c,
+ src/menu.c, src/quickfix.c, src/sign.c, src/userfunc.c
+
+Patch 8.2.1282
+Problem: Vim9: crash when using CheckScriptFailure() in
+ Test_vim9script_call_fail_decl().
+Solution: Do not decrement the def_functions len unless the function was
+ newly added.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1283
+Problem: Vim9: error for misplaced -> lacks argument.
+Solution: Use the pointer before it was advanced.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1284
+Problem: Vim9: skipping over type includes following white space, leading
+ to an error for missing white space.
+Solution: Do not skip over white space after the type.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1285
+Problem: Vim9: argument types are not checked on assignment.
+Solution: Check function argument types. (issue #6507)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1286
+Problem: Vim9: No error when using a type on a window variable
+Solution: Recognize the syntax and give an error. (closes #6521)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1287
+Problem: Vim9: crash when using an imported function.
+Solution: Add the function type to the imported entry. (closes #6522)
+Files: src/vim9script.c, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1288
+Problem: Vim9: cannot use mark in range.
+Solution: Use the flag that a colon was seen. (closes #6528)
+Files: src/ex_docmd.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1289
+Problem: Crash when using a custom completion function.
+Solution: Initialize all of the expand_T. (closes #6532)
+Files: src/cmdexpand.c
+
+Patch 8.2.1290
+Problem: Vim9: cannot replace a global function.
+Solution: Allow for "!" on a global function. (closes #6524) Also fix that
+ :delfunc on a :def function only made it empty.
+Files: src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1291
+Problem: Vim9: type of varargs items is not checked.
+Solution: Check the list item types. (closes #6523)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1292
+Problem: AIDL filetype not recognized.
+Solution: Add filetype detection. (Dominique Pellé, closes #6533)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1293
+Problem: Vim9: :execute mixes up () expression and function call.
+Solution: Do not skip white space when looking for the "(". (closes #6531)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1294
+Problem: Vim9: error when using vim9script in TextYankPost.
+Solution: Use EX_LOCKOK instead of the EX_CMDWIN flag for command that can
+ be used when text is locked. (closes #6529)
+Files: src/ex_cmds.h, src/ex_docmd.c
+
+Patch 8.2.1295
+Problem: Tests 44 and 99 are old style.
+Solution: Convert to new style tests. (Yegappan Lakshmanan, closes #6536)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_vms.mms,
+ src/testdir/test44.in, src/testdir/test44.ok,
+ src/testdir/test99.in, src/testdir/test99.ok,
+ src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.1296
+Problem: Some part of using 'smartcase' was not tested.
+Solution: Add more tests. (Dominique Pellé, closes #6538)
+Files: src/testdir/test_search.vim
+
+Patch 8.2.1297
+Problem: When a test fails it's often not easy to see what the call stack
+ is.
+Solution: Add more entries from the call stack in the exception message.
+Files: runtime/doc/cmdline.txt, src/scriptfile.c,
+ src/proto/scriptfile.pro, src/debugger.c, src/ex_docmd.c,
+ src/ex_eval.c, src/message.c, src/testing.c,
+ src/testdir/test_expand_func.vim
+
+Patch 8.2.1298
+Problem: Compiler warning for unused argument in small version.
+Solution: Add UNUSED.
+Files: src/scriptfile.c
+
+Patch 8.2.1299
+Problem: Compiler warning for using size_t for int and void pointer.
+Solution: Add type casts.
+Files: src/scriptfile.c
+
+Patch 8.2.1300
+Problem: Vim9: optional argument type not parsed properly.
+Solution: Skip over the "?". (issue #6507)
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/evalvars.c,
+ src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1301
+Problem: Vim9: varargs argument type not parsed properly.
+Solution: Skip over the "...". (issue #6507)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1302
+Problem: Vim9: varargs arg after optional arg does not work
+Solution: Check for the "..." first. (issue #6507)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1303
+Problem: Calling popup_setoptions() resets 'signcolumn'.
+Solution: Only set 'signcolumn' when creating the popup. (closes #6542)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1304
+Problem: Debug backtrace isn't tested much.
+Solution: Add more specific tests. (Ben Jackson, closes #6540)
+Files: src/testdir/runtest.vim, src/testdir/test_debugger.vim
+
+Patch 8.2.1305
+Problem: Some tests are still old style.
+Solution: Convert tests 52 and 70 to new style. (Yegappan Lakshmanan,
+ closes #6544) Fix error in FinishTesting().
+Files: src/testdir/runtest.vim, src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_vms.mms,
+ src/testdir/test52.in, src/testdir/test52.ok,
+ src/testdir/test70.in, src/testdir/test70.ok,
+ src/testdir/test_mzscheme.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.1306
+Problem: Checking for first character of dict key is inconsistent.
+Solution: Add eval_isdictc(). (closes #6546)
+Files: src/eval.c, src/proto/eval.pro, src/vim9compile.c,
+ src/testdir/test_listdict.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_let.vim
+
+Patch 8.2.1307
+Problem: popup window width does not include number, fold of sign column
+ width.
+Solution: Take number, fold and sign column with into account.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_sign_2.dump
+
+Patch 8.2.1308
+Problem: Vim9: accidentally using "x" causes Vim to exit.
+Solution: Disallow using ":x" or "xit" in Vim9 script. (closes #6399)
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/vim9script.c,
+ src/proto/vim9script.pro, src/ex_docmd.c, src/ex_cmds.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1309
+Problem: Build failure with tiny version.
+Solution: Add #ifdef.
+Files: src/ex_cmds.c, src/ex_docmd.c
+
+Patch 8.2.1310
+Problem: Configure with Xcode 12 fails to check for tgetent.
+Solution: Declare tgetent(). (Ozaki Kiichi, closes #6558)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.1311
+Problem: Test failures with legacy Vim script.
+Solution: Actually check for Vim9 script.
+Files: src/vim9script.c
+
+Patch 8.2.1312
+Problem: MS-Windows: terminal test may fail if dir.exe exists.
+Solution: Use dir.com. (Ken Takata, closes #6557)
+Files: src/testdir/test_terminal3.vim
+
+Patch 8.2.1313
+Problem: Vim9 script: cannot assign to environment variable.
+Solution: Recognize environment variable assignment. (closes #6548)
+ Also options and registers.
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1314
+Problem: Vim9: rule for comment after :function is confusing.
+Solution: Allow double quoted comment after :function in vim9script.
+ (closes #6556)
+Files: src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1315
+Problem: MS-Windows: test log contains escape sequences.
+Solution: Do not use t_md and t_me but ANSI escape sequences. (Ken Takata,
+ closes #6559)
+Files: src/testdir/runtest.vim
+
+Patch 8.2.1316
+Problem: Test 42 is still old style.
+Solution: Turn it into a new style test. (Yegappan Lakshmanan, closes #6561)
+Files: src/Makefile, src/testdir/Make_all.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_vms.mms,
+ src/testdir/test42.in, src/testdir/test42.ok,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.1317
+Problem: MS-Windows tests on AppVeyor are slow.
+Solution: Use GitHub Actions. (Ken Takata, closes #6569)
+Files: Filelist, .github/workflows/ci-windows.yaml, appveyor.yml,
+ ci/appveyor.bat
+
+Patch 8.2.1318
+Problem: No status badge for Github CI.
+Solution: Add a badge.
+Files: README.md
+
+Patch 8.2.1319
+Problem: Status badge for Github CI has wrong link.
+Solution: Rename and use the right link
+Files: README.md, .github/workflows/ci-windows.yaml
+
+Patch 8.2.1320
+Problem: Vim9: cannot declare some single letter variables.
+Solution: Do not recognize a colon for a namespace for single letter
+ variables. (closes #6547)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1321
+Problem: GitHub CI also runs on tag push.
+Solution: Skip CI on push. (Ken Takata, closes #6571)
+Files: .github/workflows/ci-windows.yaml
+
+Patch 8.2.1322
+Problem: Vim9: method on double quoted string doesn't work.
+Solution: Recognize double quoted string. (closes #6562)
+Files: src/ex_docmd.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1323
+Problem: Vim9: invalid operators only rejected in :def function.
+Solution: Also reject them at script level. (closes #6564)
+Files: src/eval.c, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1324
+Problem: Vim9: line break after "=" does not work.
+Solution: Also allow for NUL after "=". (closes #6549)
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1325
+Problem: Vim9: using Vim9 script for autoload not tested.
+Solution: Add a test. Update help.
+Files: runtime/doc/vim9.txt, src/testdir/test_autoload.vim,
+ src/testdir/sautest/autoload/auto9.vim
+
+Patch 8.2.1326
+Problem: Vim9: skipping over white space after list.
+Solution: Do not skip white space, a following [] would be misinterpreted.
+ (closes #6552) Fix a few side effects.
+Files: src/list.c, src/dict.c, src/eval.c, src/userfunc.c,
+ src/testdir/test_functions.vim, src/testdir/test_gn.vim,
+ src/testdir/test_popupwin.vim, src/testdir/test_tabpage.vim,
+ src/testdir/test_textprop.vim, src/testdir/test_textobjects.vim
+
+Patch 8.2.1327
+Problem: Mac: configure can't find Tcl libraries.
+Solution: Adjust configure check. (closes #6575)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.1328
+Problem: No space allowed before comma in list.
+Solution: Legacy Vim script allows it. (closes #6577)
+Files: src/dict.c, src/list.c, src/testdir/test_listdict.vim
+
+Patch 8.2.1329
+Problem: Vim9: cannot define global function inside :def function.
+Solution: Assign to global variable instead of local. (closes #6584)
+Files: src/vim9compile.c, src/userfunc.c, src/proto/userfunc.pro,
+ src/vim9.h, src/vim9execute.c, src/structs.h,
+ src/misc2.c, src/proto/misc2.pro, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1330
+Problem: Github workflow takes longer than needed.
+Solution: Do two test runs in parallel instead of sequentially. (Ken Takata,
+ closes #6579)
+Files: .github/workflows/ci-windows.yaml
+
+Patch 8.2.1331
+Problem: Vim9: :echo with two lists doesn't work.
+Solution: Do not skip white space before []. (closes #6552)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1332
+Problem: Vim9: memory leak when using nested global function.
+Solution: Delete the function when deleting the instruction. Disable test
+ that still causes a leak.
+Files: src/vim9compile.c, src/userfunc.c, src/proto/userfunc.pro,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1333
+Problem: Vim9: memory leak when using nested global function.
+Solution: Swap from and to when copying the lines.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1334
+Problem: Github workflow timeout needs tuning
+Solution: Use a 10 minute timeout. Fail when timing out. (Ken Takata,
+ closes #6590)
+Files: .github/workflows/ci-windows.yaml
+
+Patch 8.2.1335
+Problem: CTRL-C in the GUI doesn't interrupt. (Sergey Vlasov)
+Solution: Recognize "C" with CTRL modifier as CTRL-C. (issue #6565)
+Files: src/gui.c, src/proto/gui.pro, src/gui_gtk_x11.c, src/gui_x11.c,
+ src/gui_photon.c
+
+Patch 8.2.1336 (after 8.2.1335)
+Problem: Build failure on non-Unix systems.
+Solution: Add #ifdef.
+Files: src/gui.c
+
+Patch 8.2.1337
+Problem: Vim9: cannot use empty key in dict assignment.
+Solution: Allow empty key. (closes #6591)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1338
+Problem: Vim9: assigning to script-local variable doesn't check type.
+Solution: Use the type. (issue #6591)
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1339
+Problem: Vim9: assigning to global dict variable doesn't work.
+Solution: Guess variable type based in index type. (issue #6591)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1340
+Problem: Some tests fail on Cirrus CI and/or with FreeBSD.
+Solution: Make 'backupskip' empty. Do not run tests as root. Check for
+ directory when using viminfo. (Ozaki Kiichi, closes #6596)
+Files: .cirrus.yml, src/testdir/test_backup.vim,
+ src/testdir/test_edit.vim, src/testdir/test_viminfo.vim,
+ src/testdir/test_writefile.vim, src/viminfo.c
+
+Patch 8.2.1341
+Problem: Build failures.
+Solution: Add missing error message.
+Files: src/globals.h
+
+Patch 8.2.1342
+Problem: Vim9: accidentally using "x" gives a confusing error.
+Solution: Disallow using ":t" in Vim9 script. (issue #6399)
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/vim9script.c,
+ src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1343
+Problem: Vim9: cannot find global function when using g: when local
+ function with the same name exists.
+Solution: Find global function when using g:.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1344
+Problem: Vim9: No test for trying to redefine global function.
+Solution: Add a test.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.1345
+Problem: Redraw error when using visual block and scroll.
+Solution: Add check for w_topline. (closes #6597)
+Files: src/drawscreen.c, src/testdir/test_display.vim,
+ src/testdir/dumps/Test_display_visual_block_scroll.dump
+
+Patch 8.2.1346
+Problem: Small build fails.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.2.1347
+Problem: Cannot easily get the script ID.
+Solution: Support expand('<SID>').
+Files: runtime/doc/map.txt, src/ex_docmd.c,
+ src/testdir/test_expand_func.vim
+
+Patch 8.2.1348
+Problem: Build failure without the eval feature.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.2.1349
+Problem: Vim9: can define a function with the name of an import.
+Solution: Disallow using an existing name. (closes #6585)
+Files: src/userfunc.c, src/vim9compile.c, src/globals.h,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1350
+Problem: Vim9: no test for error message when redefining function.
+Solution: Add a test.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1351
+Problem: Vim9: no proper error if using namespace for nested function.
+Solution: Specifically check for a namespace. (closes #6582)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1352
+Problem: Vim9: no error for shadowing a script-local function by a nested
+ function.
+Solution: Check for script-local function. (closes #6586)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1353
+Problem: Crash when drawing double-wide character in terminal window.
+ (Masato Nishihata)
+Solution: Check getcell() returning NULL. (issue #6141)
+Files: src/libvterm/src/screen.c, src/testdir/test_terminal.vim
+
+Patch 8.2.1354
+Problem: Test 59 is old style.
+Solution: Convert into a new style test. (Yegappan Lakshmanan, closes #6604)
+Files: runtime/doc/eval.txt, src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/Make_vms.mms, src/testdir/test59.in,
+ src/testdir/test59.ok, src/testdir/test_spell_utf8.vim
+
+Patch 8.2.1355
+Problem: Vim9: no error using :let for options and registers.
+Solution: Give an error. (closes #6568)
+Files: src/evalvars.c, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1356
+Problem: Vim9: cannot get the percent register.
+Solution: Check for readable registers instead of writable. (closes #6566)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1357
+Problem: Vim9: cannot assign to / register.
+Solution: Adjust check for assignment. (issue #6566)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1358
+Problem: Vim9: test fails with +dnd is not available.
+Solution: Add condition.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1359
+Problem: Vim9: cannot assign to / register in Vim9 script.
+Solution: Adjust check for assignment in Vim9 script. (closes #6567)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1360
+Problem: Stray error for white space after expression.
+Solution: Ignore trailing white space. (closes #6608)
+Files: src/eval.c, src/testdir/test_filter_map.vim
+
+Patch 8.2.1361
+Problem: Error for white space after expression in assignment.
+Solution: Skip over white space. (closes #6617)
+Files: src/eval.c, src/testdir/test_expr.vim
+
+Patch 8.2.1362
+Problem: Last entry of ":set term=xxx" overwritten by error message when
+ 'cmdheight' is two or more. (Tony Mechelynck)
+Solution: Output extra line breaks.
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.1363
+Problem: Test trying to run terminal when it is not supported.
+Solution: Check if Vim can be run in a terminal.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.2.1364
+Problem: Invalid memory access when searching for raw string.
+Solution: Check for delimiter match before following quote. (closes #6578)
+Files: src/search.c
+
+Patch 8.2.1365
+Problem: Vim9: no error for missing white space around operator.
+Solution: Check for white space. (closes #6618)
+Files: src/eval.c, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/evalvars.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1366
+Problem: Test 49 is old style.
+Solution: Convert several tests to new style. (Yegappan Lakshmanan,
+ closes #6629)
+Files: src/testdir/script_util.vim, src/testdir/test49.ok,
+ src/testdir/test49.vim, src/testdir/test_vimscript.vim
+
+Patch 8.2.1367
+Problem: Vim9: no error for missing white space around operator.
+Solution: Check for white space around *, / and %.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1368
+Problem: Vim9: no error for missing white space around operator.
+Solution: Check for white space around <, !=, etc.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1369
+Problem: MS-Windows: autocommand test sometimes fails.
+Solution: Do not rely on the cat command.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.1370
+Problem: MS-Windows: warning for using fstat() with stat_T.
+Solution: use _fstat64() if available. (Naruhiko Nishino, closes #6625)
+Files: src/macros.h
+
+Patch 8.2.1371
+Problem: Vim9: no error for missing white space around operator.
+Solution: Check for white space around && and ||.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1372
+Problem: Vim9: no error for missing white space around operator.
+Solution: Check for white space around ? and :.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1373
+Problem: Vim9: no error for assigning to non-existing script var.
+Solution: Check that in Vim9 script the variable was defined. (closes #6630)
+Files: src/vim9compile.c, src/userfunc.c, src/structs.h,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1374
+Problem: Vim9: error for assigning empty list to script variable.
+Solution: Use t_unknown for empty list member. (closes #6595)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1375
+Problem: Vim9: method name with digit not accepted.
+Solution: Use eval_isnamec() instead of eval_isnamec1(). (closes #6613)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1376
+Problem: Vim9: expression mapping causes error for using :import.
+Solution: Add EX_LOCK_OK to :import and :export. (closes #6606)
+Files: src/ex_cmds.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1377
+Problem: Triggering the ATTENTION prompt causes typeahead to be messed up.
+Solution: Increment tb_change_cnt. (closes #6541)
+Files: src/getchar.c
+
+Patch 8.2.1378
+Problem: Cannot put space between function name and paren.
+Solution: Allow this for backwards compatibility.
+Files: src/eval.c, src/testdir/test_expr.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1379
+Problem: Curly braces expression ending in " }" does not work.
+Solution: Skip over white space when checking for "}". (closes #6634)
+Files: src/dict.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.2.1380
+Problem: Vim9: return type of getreg() is always a string.
+Solution: Use list of strings when there are three arguments. (closes #6633)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1381
+Problem: MS-Windows: crash with Python 3.5 when stdin is redirected.
+Solution: Reconnect stdin. (Yasuhiro Matsumoto, Ken Takata, closes #6641)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/if_python3.c
+
+Patch 8.2.1382
+Problem: Vim9: using :import in filetype plugin gives an error.
+Solution: Allow commands with the EX_LOCK_OK flag. (closes #6636)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1383
+Problem: Test 49 is old style.
+Solution: Convert test cases to new style. (Yegappan Lakshmanan,
+ closes #6638)
+Files: src/testdir/test49.ok, src/testdir/test49.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.1384
+Problem: No ATTENTION prompt for :vimgrep first match file.
+Solution: When there is an existing swap file do not keep the dummy buffer.
+ (closes #6649)
+Files: src/quickfix.c, src/testdir/runtest.vim,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.1385
+Problem: No testing on ARM.
+Solution: Add a test on Travis for ARM. (Ozaki Kiichi, closes #6615)
+Files: .travis.yml
+
+Patch 8.2.1386
+Problem: Backslash not removed after space in option with space in
+ 'isfname'.
+Solution: Do remove backslash before space, also when it is in 'isfname'.
+ (Yasuhiro Matsumoto, closes #6651)
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.2.1387
+Problem: Vim9: cannot assign to single letter variable with type.
+Solution: Exclude the colon from the variable name. (closes #6647)
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1388
+Problem: Vim9: += only works for numbers.
+Solution: Use += as concatenate for a list. (closes #6646)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1389
+Problem: File missing from the distribution.
+Solution: Add script_util.vim to the list of distributes files.
+Files: Filelist
+
+Patch 8.2.1390
+Problem: Vim9: type error after storing an option value.
+Solution: Drop the type after a STOREOPT instruction. (closes #6632)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1391
+Problem: Vim9: no error for shadowing a script function.
+Solution: Check for already defined items. (closes #6652)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1392
+Problem: Vim9: error line number incorrect after skipping over comment
+ lines.
+Solution: Insert empty lines for skipped lines.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1393
+Problem: Insufficient testing for script debugging.
+Solution: Add more tests. (Ben Jackson)
+Files: src/testdir/test_debugger.vim
+
+Patch 8.2.1394
+Problem: Vim9: compiling a function interferes with command modifiers.
+Solution: Save and restore command modifiers. (closes #6658)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1395
+Problem: Vim9: no error if declaring a funcref with a lower case letter.
+Solution: Check the name after the type is inferred. Fix confusing name.
+Files: src/vim9compile.c, src/dict.c, src/eval.c, src/evalvars.c,
+ src/proto/evalvars.pro, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1396
+Problem: Vim9: no error for unexpectedly returning a value.
+Solution: Only set the return type for lambda's. Make using function type
+ in a function reference work.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1397
+Problem: Vim9: return type of maparg() not adjusted for fourth argument.
+Solution: Check if fourth argument is present. (closes #6645)
+Files: src/evalfunc.c, src/testdir/test_maparg.vim
+
+Patch 8.2.1398
+Problem: Autoload script sourced twice if sourced directly.
+Solution: Do not source an autoload script again. (issue #6644)
+Files: src/scriptfile.c, src/testdir/sautest/autoload/sourced.vim
+
+Patch 8.2.1399
+Problem: Vim9: may find imported item in wrong script.
+Solution: When looking up script-local function use the embedded script ID.
+ (issue #6644)
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/userfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1400
+Problem: Vim9: test does not delete written files.
+Solution: Correct file names.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1401
+Problem: Cannot jump to the last used tabpage.
+Solution: Add g<Tab> and tabpagnr('#'). (Yegappan Lakshmanan, closes #6661,
+ neovim #11626)
+Files: runtime/doc/eval.txt, runtime/doc/index.txt,
+ runtime/doc/tabpage.txt, src/evalwindow.c, src/globals.h,
+ src/normal.c, src/proto/window.pro, src/testdir/test_tabpage.vim,
+ src/window.c
+
+Patch 8.2.1402
+Problem: s390x tests always fail.
+Solution: Temporarily disable s390x tests.
+Files: .travis.yml
+
+Patch 8.2.1403
+Problem: Vim9: Vim highlighting fails in cmdline window if it uses Vim9
+ commands.
+Solution: Allow using :vim9script, :import and :export while in the cmdline
+ window. (closes #6656)
+Files: src/ex_cmds.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1404
+Problem: Vim9: script test fails in the GUI.
+Solution: Use another key to map. Improve cleanup.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1405
+Problem: Vim9: vim9compile.c is getting too big.
+Solution: Split off type code to vim9type.c.
+Files: Filelist, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/vim9type.c, src/proto/vim9type.pro, src/proto.h,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Makefile
+
+Patch 8.2.1406
+Problem: Popupwindow lacks scrollbar if no "maxheight" is used.
+Solution: Compute the max height depending on the position. (closes #6664)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_toohigh_1.dump,
+ src/testdir/dumps/Test_popupwin_toohigh_2.dump
+
+Patch 8.2.1407
+Problem: Vim9: type of list and dict only depends on first item.
+Solution: Use all items to decide about the type.
+Files: src/vim9compile.c, src/vim9type.c, src/proto/vim9type.pro,
+ src/testdir/test_vim9_expr.vim, runtime/doc/vim9.txt
+
+Patch 8.2.1408
+Problem: Vim9: type casting not supported.
+Solution: Introduce type casting.
+Files: runtime/doc/vim9.txt, src/vim9compile.c,
+ src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1409
+Problem: Npmrc and php.ini filetypes not recognized.
+Solution: Add filetype detection. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1410
+Problem: Adding compiler plugin requires test change.
+Solution: Include compiler plugin and adjust test.
+Files: src/testdir/test_compiler.vim, runtime/compiler/xo.vim
+
+Patch 8.2.1411
+Problem: when splitting a window localdir is copied but prevdir is not.
+Solution: Also copy prevdir. (closes #6667)
+Files: src/window.c, src/testdir/test_cd.vim
+
+Patch 8.2.1412
+Problem: Vim: not operator does not result in boolean.
+Solution: Make type depend on operator. (issue 6678) Fix using "false" and
+ "true" in Vim9 script.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1413 (after 8.2.1401)
+Problem: Previous tab page not usable from an Ex command.
+Solution: Add the "#" argument for :tabnext et al. (Yegappan Lakshmanan,
+ closes #6677)
+Files: runtime/doc/tabpage.txt, src/ex_docmd.c, src/window.c,
+ src/testdir/test_tabpage.vim
+
+Patch 8.2.1414
+Problem: Popupwindow missing last couple of lines when cursor is in the
+ first line.
+Solution: Compute the max height also when top aligned. (closes #6664)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_toohigh_3.dump,
+ src/testdir/dumps/Test_popupwin_nospace.dump
+
+Patch 8.2.1415
+Problem: Closing a popup window with CTRL-C interrupts 'statusline' if it
+ calls a function.
+Solution: Reset got_int while redrawing. (closes #6675)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_ctrl_c.dump
+
+Patch 8.2.1416
+Problem: Vim9: boolean evaluation does not work as intended.
+Solution: Use tv2bool() in Vim9 script. (closes #6681)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim, src/testdir/vim9.vim
+
+Patch 8.2.1417
+Problem: Test 49 is old style.
+Solution: Convert more parts to new style test. (Yegappan Lakshmanan,
+ closes #6682)
+Files: src/testdir/test49.ok, src/testdir/test49.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.1418
+Problem: Vim9: invalid error for missing white space after function.
+Solution: Do not skip over white space. (closes #6679)
+Files: src/userfunc.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1419
+Problem: Vim9: not operator applied too early.
+Solution: Implement the "numeric_only" argument. (closes #6680)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1420
+Problem: Test 49 is old style.
+Solution: Convert remaining parts to new style. Remove obsolete items.
+ (Yegappan Lakshmanan, closes #6683)
+Files: Filelist, runtime/doc/testing.txt, src/Make_mvc.mak, src/Makefile,
+ src/testdir/Make_all.mak, src/testdir/Make_amiga.mak,
+ src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_vms.mms, src/testdir/Makefile,
+ src/testdir/README.txt, src/testdir/test49.in,
+ src/testdir/test49.ok, src/testdir/test49.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_vimscript.vim
+
+Patch 8.2.1421
+Problem: Vim9: handling "+" and "-" before number differs from Vim script.
+Solution: Use the same sequence of commands.
+Files: src/vim9compile.c
+
+Patch 8.2.1422
+Problem: The Mac GUI implementation is outdated and probably doesn't even
+ work.
+Solution: Remove the Mac GUI code. The MacVim project provides the
+ supported Vim GUI version.
+Files: Filelist, src/gui_mac.c, src/proto/gui_mac.pro, src/proto.h,
+ src/Makefile, src/configure.ac, src/auto/configure,
+ src/evalfunc.c, src/fileio.c, src/gui.c, src/if_mzsch.c,
+ src/main.c, src/misc2.c, src/mouse.c, src/os_mac_conv.c,
+ src/os_unix.c, src/feature.h, src/globals.h, src/gui.h,
+ src/option.h, src/optiondefs.h, src/os_mac.h, src/structs.h,
+ src/vim.h, src/INSTALLmac.txt
+
+Patch 8.2.1423
+Problem: Vim9: find global function when looking for script-local.
+Solution: Don't strip prefix if name starts with "s:". (closes #6688)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1424 (after 8.2.1422)
+Problem: Mac build fails.
+Solution: Adjust configure to not fall back to Athena. Adjust some other
+ files.
+Files: src/configure.ac, src/auto/configure, src/os_macosx.m,
+ src/version.c
+
+Patch 8.2.1425
+Problem: Vim9: cannot use call() without :call.
+Solution: Do not skip over "call(". (closes #6689)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1426
+Problem: Vim9: cannot call autoload function in :def function.
+Solution: Load the autoload script. (closes #6690)
+Files: src/vim9execute.c, src/vim9compile.c, src/scriptfile.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1427
+Problem: Vim9: cannot use a range with marks in :def function.
+Solution: Parse range after colon. (closes #6686)
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1428
+Problem: Vim9: :def function does not abort on nested function error.
+Solution: Check whether an error message was given. (closes #6691)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1429
+Problem: Vim9: no error for missing white after : in dict.
+Solution: Check for white space. (closes #6671) Also check that there is no
+ white before the :.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1430
+Problem: Vim9: error for missing comma instead of extra white space.
+Solution: Check if comma can be found after white space. (closes #6668)
+ Also check for extra white space in literal dict. (closes #6670)
+Files: src/list.c, src/dict.c, src/vim9compile.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1431
+Problem: Vim9: no error for white space before comma in dict.
+Solution: Check for extra white space. (closes #6674)
+Files: src/vim9compile.c, src/dict.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1432
+Problem: Various inconsistencies in test files.
+Solution: Add modelines where they were missing. Use Check commands instead
+ of silently skipping over tests. Adjust indents and comments.
+ (Ken Takata, closes #6695)
+Files: src/testdir/test_arglist.vim, src/testdir/test_assert.vim,
+ src/testdir/test_autochdir.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_autoload.vim, src/testdir/test_balloon.vim,
+ src/testdir/test_balloon_gui.vim, src/testdir/test_behave.vim,
+ src/testdir/test_blockedit.vim, src/testdir/test_breakindent.vim,
+ src/testdir/test_bufline.vim, src/testdir/test_bufwintabinfo.vim,
+ src/testdir/test_cd.vim, src/testdir/test_changedtick.vim,
+ src/testdir/test_changelist.vim, src/testdir/test_channel.vim,
+ src/testdir/test_checkpath.vim, src/testdir/test_cindent.vim,
+ src/testdir/test_cjk_linebreak.vim,
+ src/testdir/test_clientserver.vim,
+ src/testdir/test_close_count.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_command_count.vim,
+ src/testdir/test_comparators.vim, src/testdir/test_compiler.vim,
+ src/testdir/test_crypt.vim, src/testdir/test_cursorline.vim,
+ src/testdir/test_curswant.vim, src/testdir/test_debugger.vim,
+ src/testdir/test_delete.vim, src/testdir/test_diffmode.vim,
+ src/testdir/test_digraph.vim, src/testdir/test_display.vim,
+ src/testdir/test_edit.vim, src/testdir/test_environ.vim,
+ src/testdir/test_erasebackword.vim,
+ src/testdir/test_escaped_glob.vim, src/testdir/test_ex_equal.vim,
+ src/testdir/test_ex_undo.vim, src/testdir/test_ex_z.vim,
+ src/testdir/test_exec_while_if.vim, src/testdir/test_exists.vim,
+ src/testdir/test_exists_autocmd.vim, src/testdir/test_exit.vim,
+ src/testdir/test_expand_dllpath.vim,
+ src/testdir/test_expr_utf8.vim, src/testdir/test_feedkeys.vim,
+ src/testdir/test_file_size.vim, src/testdir/test_fileformat.vim,
+ src/testdir/test_filter_cmd.vim,
+ src/testdir/test_find_complete.vim, src/testdir/test_findfile.vim,
+ src/testdir/test_fixeol.vim, src/testdir/test_flatten.vim,
+ src/testdir/test_fnameescape.vim, src/testdir/test_fold.vim,
+ src/testdir/test_functions.vim, src/testdir/test_ga.vim,
+ src/testdir/test_getcwd.vim, src/testdir/test_getvar.vim,
+ src/testdir/test_glob2regpat.vim, src/testdir/test_global.vim,
+ src/testdir/test_gui.vim, src/testdir/test_gui_init.vim,
+ src/testdir/test_highlight.vim, src/testdir/test_hlsearch.vim,
+ src/testdir/test_iminsert.vim,
+ src/testdir/test_increment_dbcs.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_interrupt.vim,
+ src/testdir/test_job_fails.vim, src/testdir/test_join.vim,
+ src/testdir/test_json.vim, src/testdir/test_jumplist.vim,
+ src/testdir/test_jumps.vim, src/testdir/test_lambda.vim,
+ src/testdir/test_langmap.vim, src/testdir/test_largefile.vim,
+ src/testdir/test_lineending.vim, src/testdir/test_listchars.vim,
+ src/testdir/test_listener.vim, src/testdir/test_listlbr.vim,
+ src/testdir/test_listlbr_utf8.vim,
+ src/testdir/test_makeencoding.vim, src/testdir/test_man.vim,
+ src/testdir/test_mapping.vim, src/testdir/test_marks.vim,
+ src/testdir/test_matchadd_conceal.vim,
+ src/testdir/test_matchadd_conceal_utf8.vim,
+ src/testdir/test_memory_usage.vim, src/testdir/test_menu.vim,
+ src/testdir/test_messages.vim, src/testdir/test_mksession.vim,
+ src/testdir/test_modeline.vim,
+ src/testdir/test_nested_function.vim, src/testdir/test_number.vim,
+ src/testdir/test_options.vim, src/testdir/test_packadd.vim,
+ src/testdir/test_partial.vim, src/testdir/test_paste.vim,
+ src/testdir/test_plus_arg_edit.vim, src/testdir/test_preview.vim,
+ src/testdir/test_profile.vim, src/testdir/test_prompt_buffer.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_quotestar.vim,
+ src/testdir/test_random.vim, src/testdir/test_recover.vim,
+ src/testdir/test_regex_char_classes.vim,
+ src/testdir/test_regexp_latin.vim, src/testdir/test_registers.vim,
+ src/testdir/test_rename.vim, src/testdir/test_retab.vim,
+ src/testdir/test_scriptnames.vim, src/testdir/test_scroll_opt.vim,
+ src/testdir/test_scrollbind.vim, src/testdir/test_search_stat.vim,
+ src/testdir/test_searchpos.vim, src/testdir/test_set.vim,
+ src/testdir/test_sha256.vim, src/testdir/test_shift.vim,
+ src/testdir/test_shortpathname.vim, src/testdir/test_signs.vim,
+ src/testdir/test_sort.vim, src/testdir/test_sound.vim,
+ src/testdir/test_source_utf8.vim, src/testdir/test_spellfile.vim,
+ src/testdir/test_startup.vim, src/testdir/test_startup_utf8.vim,
+ src/testdir/test_stat.vim, src/testdir/test_suspend.vim,
+ src/testdir/test_swap.vim, src/testdir/test_syntax.vim,
+ src/testdir/test_tab.vim, src/testdir/test_tabline.vim,
+ src/testdir/test_tagcase.vim, src/testdir/test_tagjump.vim,
+ src/testdir/test_taglist.vim, src/testdir/test_termcodes.vim,
+ src/testdir/test_termencoding.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_terminal2.vim, src/testdir/test_terminal3.vim,
+ src/testdir/test_terminal_fail.vim,
+ src/testdir/test_true_false.vim,
+ src/testdir/test_utf8_comparisons.vim,
+ src/testdir/test_vartabs.vim, src/testdir/test_version.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_winbar.vim,
+ src/testdir/test_winbuf_close.vim,
+ src/testdir/test_window_cmd.vim, src/testdir/test_window_id.vim,
+ src/testdir/test_windows_home.vim, src/testdir/test_wnext.vim,
+ src/testdir/test_wordcount.vim, src/testdir/test_writefile.vim,
+ src/testdir/test_xxd.vim
+
+Patch 8.2.1433
+Problem: Vim9: cannot mingle comments in multi-line lambda.
+Solution: Skip over NULL lines. (closes #6694)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1434
+Problem: Vim9: crash when lambda uses outer function argument.
+Solution: Set the flag that the outer context is used.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1435
+Problem: Vim9: always converting to string for ".." leads to mistakes.
+Solution: Only automatically convert simple types.
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/vim9.h,
+ src/vim9execute.c, src/proto/vim9execute.pro, src/eval.c,
+ src/evalfunc.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1436
+Problem: Function implementing :substitute has unexpected name.
+Solution: Rename from do_sub() to ex_substitute().
+Files: src/ex_cmds.c, src/proto/ex_cmds.pro, src/ex_docmd.c,
+ src/ex_cmds.h
+
+Patch 8.2.1437
+Problem: Vim9: 'statusline' is evaluated using Vim9 script syntax.
+Solution: Always use legacy script syntax.
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1438
+Problem: Missing tests for interrupting script execution from debugger.
+Solution: Add tests. (Yegappan Lakshmanan, closes #6697)
+Files: src/testdir/test_debugger.vim
+
+Patch 8.2.1439
+Problem: Tiny and small builds have no test coverage.
+Solution: Restore tests that do not depend on the +eval feature.
+ (Ken Takata, closes #6696)
+Files: .travis.yml, Filelist, Makefile, runtime/doc/testing.txt,
+ src/Make_mvc.mak, src/Makefile, src/testdir/Make_all.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Make_vms.mms,
+ src/testdir/Makefile, src/testdir/runtest.vim,
+ src/testdir/test1.in, src/testdir/test1.ok, src/testdir/test20.in,
+ src/testdir/test20.ok, src/testdir/test21.in,
+ src/testdir/test21.ok, src/testdir/test22.in,
+ src/testdir/test22.ok, src/testdir/test23.in,
+ src/testdir/test23.ok, src/testdir/test24.in,
+ src/testdir/test24.ok, src/testdir/test25.in,
+ src/testdir/test25.ok, src/testdir/test26.in,
+ src/testdir/test26.ok, src/testdir/test27.in,
+ src/testdir/test27.ok, src/testdir/test_options.vim
+
+Patch 8.2.1440
+Problem: Debugger code insufficiently tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #6700)
+Files: src/testdir/test_debugger.vim, src/testdir/test_vimscript.vim
+
+Patch 8.2.1441
+Problem: Running tests in tiny version gives error for summarize.vim.
+Solution: Set 'cpoptions' to allow for line continuation. Restore
+ redirecting test output to /dev/null.
+Files: src/testdir/summarize.vim, src/testdir/Makefile
+
+Patch 8.2.1442
+Problem: Outdated references to the Mac Carbon GUI.
+Solution: Remove or update references. (Yee Cheng Chin, closes #6703)
+Files: READMEdir/README_extra.txt, src/Makefile, src/configure.ac,
+ src/auto/configure, src/gui_haiku.cc, src/os_macosx.m,
+ src/testdir/test_iminsert.vim, src/vim.h
+
+Patch 8.2.1443
+Problem: Vim9: crash when interrupting a nested :def function.
+Solution: Push a dummy return value onto the stack. (closes #6701)
+Files: src/vim9execute.c
+
+Patch 8.2.1444
+Problem: Error messages are spread out and names can be confusing.
+Solution: Start moving error messages to a separate file and use clear
+ names.
+Files: Filelist, src/vim.h, src/globals.h, src/errors.h, src/Makefile,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Make_vms.mms,
+ src/dict.c, src/evalvars.c, src/ex_docmd.c, src/list.c,
+ src/userfunc.c, src/vim9compile.c, src/vim9execute.c,
+ src/vim9script.c, src/vim9type.c
+
+Patch 8.2.1445
+Problem: Vim9: function expanded name is cleared when sourcing a script
+ again.
+Solution: Only clear the expanded name when deleting the function.
+ (closes #6707)
+Files: src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1446
+Problem: Vim9: line number in error message is not correct.
+Solution: Set SOURCING_LNUM before calling emsg(). (closes #6708)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1447
+Problem: Vim9: return type of keys() is list<any>.
+Solution: Should be list<string>. (closes #6711)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1448
+Problem: Test 77a for VMS depends on small.vim which does not exist.
+Solution: Use the 'silent while 0" trick. (issue #6696)
+Files: src/testdir/test77a.in
+
+Patch 8.2.1449
+Problem: Some test makefiles delete files that are not generated.
+Solution: Remove the deletion commands.
+Files: src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Make_amiga.mak, src/testdir/Make_vms.mms
+
+Patch 8.2.1450
+Problem: Vim9: no check that script-local items don't become global.
+Solution: Add a test.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1451
+Problem: Vim9: list type at script level only uses first item.
+Solution: Use all members, like in a compiled function. (closes #6712)
+ Also for dictionary.
+Files: src/vim9type.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1452
+Problem: Vim9: dead code in to_name_end().
+Solution: Remove check for lambda and dict, it won't be used.
+Files: src/vim9compile.c
+
+Patch 8.2.1453
+Problem: Vim9: failure to compile lambda not tested.
+Solution: Add a test case.
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1454
+Problem: Vim9: failure invoking lambda with wrong arguments.
+Solution: Handle invalid arguments. Add a test.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1455
+Problem: Vim9: crash when using typecast before constant.
+Solution: Generate constant before checking type. Add tets.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1456
+Problem: MS-Windows: test files are not deleted.
+Solution: use "del" instead of $(DEL).
+Files: src/testdir/Make_dos.mak
+
+Patch 8.2.1457
+Problem: Vim9: the output of :disassemble cannot be interrupted.
+Solution: Check got_int. (closes #6715)
+Files: src/vim9execute.c
+
+Patch 8.2.1458
+Problem: .gawk files not recognized.
+Solution: Recognize .gawk files. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1459
+Problem: Vim9: declaring a script variable at the script level does not
+ infer the type.
+Solution: Get the type from the value. (closes #6716)
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1460
+Problem: Error messages are spread out.
+Solution: Move more messages into errors.h.
+Files: src/errors.h, src/globals.h, src/vim9compile.c, src/vim9execute.c,
+ src/vim9script.c, src/vim9type.c, src/scriptfile.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/match.c, src/eval.c, src/evalvars.c,
+ src/userfunc.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1461
+Problem: Vim9: string indexes are counted in bytes.
+Solution: Use character indexes. (closes #6574)
+Files: runtime/doc/eval.txt, src/eval.c, src/proto/eval.pro,
+ src/vim9execute.c, src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1462
+Problem: Vim9: string slice not supported yet.
+Solution: Add support for string slicing.
+Files: src/errors.h, src/vim9compile.c, src/vim9.h, src/vim9execute.c,
+ src/eval.c, src/proto/eval.pro, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1463
+Problem: Vim9: list slice not supported yet.
+Solution: Add support for list slicing.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/eval.c,
+ src/list.c, src/proto/list.pro, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1464
+Problem: Vim9: build warning for unused variable.
+Solution: Delete the variable declaration.
+Files: src/vim9execute.c
+
+Patch 8.2.1465
+Problem: Vim9: subscript not handled properly.
+Solution: Adjust error message. Remove dead code. Disallow string to
+ number conversion in scripts.
+Files: src/errors.h, src/vim9compile.c, src/vim9execute.c, src/eval.c,
+ src/typval.c, src/list.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1466
+Problem: Vim9: cannot index or slice a variable with type "any".
+Solution: Add runtime index and slice.
+Files: src/eval.c, src/proto/eval.pro, src/vim9compile.c,
+ src/vim9execute.c, src/vim9.h, src/errors.h, src/list.c,
+ src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1467
+Problem: Vim9: :echomsg doesn't like a dict argument.
+Solution: Convert arguments like in legacy script. (closes #6717)
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1468
+Problem: Vim9: invalid error for missing white space.
+Solution: Don't skip over white space after index. (closes #6718)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1469
+Problem: Vim9: cannot assign string to string option.
+Solution: Change checks for option value. (closes #6720)
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1470
+Problem: Errors in spell file not tested.
+Solution: Add test for spell file errors. (Yegappan Lakshmanan,
+ closes #6721)
+Files: src/testdir/test_spellfile.vim
+
+Patch 8.2.1471
+Problem: :const only locks the variable, not the value.
+Solution: Lock the value as ":lockvar 1 var" would do. (closes #6719)
+Files: src/evalvars.c, src/testdir/test_const.vim
+
+Patch 8.2.1472
+Problem: ":argdel" does not work like ":.argdel" as documented. (Alexey
+ Demin)
+Solution: Make ":argdel" work like ":.argdel". (closes #6727)
+ Also fix giving the error "0 more files to edit".
+Files: src/arglist.c, src/ex_docmd.c, src/testdir/test_arglist.vim
+
+Patch 8.2.1473
+Problem: Items in a list given to :const can still be modified.
+Solution: Work like ":lockvar! name" but don't lock referenced items.
+ Make locking a blob work.
+Files: runtime/doc/eval.txt, src/evalvars.c, src/eval.c,
+ src/testdir/test_const.vim
+
+Patch 8.2.1474
+Problem: /usr/lib/udef/rules.d not recognized as udevrules.
+Solution: Adjust match pattern. (Haochen Tong, closes 36722)
+Files: runtime/autoload/dist/ft.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1475
+Problem: Vim9: can't use v:true for option flags.
+Solution: Add tv_get_bool_chk(). (closes #6725)
+Files: src/typval.c, src/proto/typval.pro, src/channel.c
+
+Patch 8.2.1476 (after 8.2.1474)
+Problem: Filetype test fails on MS-Windows.
+Solution: Remove "^" from pattern.
+Files: runtime/autoload/dist/ft.vim
+
+Patch 8.2.1477
+Problem: Vim9: error when using bufnr('%').
+Solution: Don't give an error for using a string argument. (closes #6723)
+Files: src/evalbuffer.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1478
+Problem: Vim9: cannot use "true" for some popup options.
+Solution: Add dict_get_bool(). (closes #6725)
+Files: src/dict.c, src/proto/dict.pro, src/popupwin.c
+
+Patch 8.2.1479
+Problem: Vim9: error for list index uses wrong line number.
+Solution: Set source line number. (closes #6724) Add a way to assert the
+ line number of the error with assert_fails().
+Files: runtime/doc/testing.txt, src/vim9execute.c, src/testing.c,
+ src/evalfunc.c, src/message.c, src/globals.h, src/testdir/vim9.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1480
+Problem: Vim9: skip expression in search() gives error.
+Solution: use tv_get_bool() eval_expr_to_bool(). (closes #6729)
+Files: src/eval.c, src/typval.c, src/proto/typval.pro,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1481
+Problem: Vim9: line number reported with error may be wrong.
+Solution: Check line number in tests.
+Files: src/testdir/test_vim9_expr.vim, src/testdir/vim9.vim,
+ src/vim9execute.c
+
+Patch 8.2.1482
+Problem: Vim9: crash when using a nested lambda.
+Solution: Do not clear the growarray when not evaluating. Correct pointer
+ when getting the next line. (closes #6731)
+Files: src/eval.c, src/scriptfile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1483
+Problem: Vim9: error for using special as number when returning "false"
+ from a popup filter.
+Solution: Use tv_get_bool(). (closes #6733)
+Files: src/popupwin.c
+
+Patch 8.2.1484
+Problem: Flaky failure in assert_fails().
+Solution: Only used fourth argument if there is a third argument.
+Files: src/testing.c
+
+Patch 8.2.1485
+Problem: Vim9: readdirex() expression doesn't accept bool.
+Solution: Accept both -1 and bool. (closes #6737)
+Files: src/filepath.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1486
+Problem: Vim9: readdir() expression doesn't accept bool.
+Solution: Merge with code for readdirex(). (closes #6737)
+Files: src/filepath.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1487
+Problem: Travis: installing snd-dummy is not always useful.
+Solution: Only install snd-dummy on amd64. (Ozaki Kiichi, closes #6738)
+Files: .travis.yml, ci/load-snd-dummy.sh
+
+Patch 8.2.1488
+Problem: Text does not scroll when inserting above first line.
+Solution: Adjust off-by-one error. (Ken Takata, closes #6739)
+Files: src/drawscreen.c, src/testdir/test_display.vim,
+ src/testdir/dumps/Test_display_scroll_at_topline.dump
+
+Patch 8.2.1489
+Problem: Vim9: error when setting an option with setbufvar().
+Solution: Do not get a number from a string value. (closes #6740)
+Files: src/evalvars.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1490
+Problem: Vim9: using /= with float and number doesn't work.
+Solution: Better support assignment with operator. (closes #6742)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1491
+Problem: Vim9: crash when compiling heredoc lines start with comment.
+Solution: Skip over NULL pointers. Do not remove comment and empty lines
+ when fetching function lines. (closes #6743)
+Files: src/vim9compile.c, src/scriptfile.c, src/proto/scriptfile.pro,
+ src/structs.h, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/ex_cmds.h, src/autocmd.c, src/proto/autocmd.pro,
+ src/ex_getln.c, src/proto/ex_getln.pro, src/userfunc.c,
+ src/proto/userfunc.pro, src/evalfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1492
+Problem: Build failures.
+Solution: Move typedef out of #ifdef. Adjust argument types. Discover
+ America.
+Files: src/structs.h, src/ex_docmd.c
+
+Patch 8.2.1493
+Problem: Not enough test coverage for the spell file handling.
+Solution: Add spell file tests. (Yegappan Lakshmanan, closes #6728)
+Files: src/spellfile.c, src/testdir/test_spellfile.vim
+
+Patch 8.2.1494
+Problem: Missing change to calling eval_getline().
+Solution: Change last argument.
+Files: src/eval.c
+
+Patch 8.2.1495
+Problem: "make clean" may delete too many files.
+Solution: Do not delete $APPDIR. (closes #6751)
+Files: src/Makefile
+
+Patch 8.2.1496
+Problem: Vim9: cannot use " #" in a mapping.
+Solution: Do not remove a comment with the EX_NOTRLCOM flag. (closes #6746)
+Files: src/ex_docmd.c, src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1497
+Problem: CursorHold test is flaky. (Jakub Kądziołka)
+Solution: Use WaitForAssert() (closes #6754)
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.1498
+Problem: On slow systems tests can be flaky.
+Solution: Use TermWait() instead of term-wait(). (Yegappan Lakshmanan,
+ closes #6756)
+Files: src/testdir/test_digraph.vim, src/testdir/test_display.vim,
+ src/testdir/test_popupwin.vim, src/testdir/test_termcodes.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_terminal3.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.1499
+Problem: Vim9: error when using "$" with col().
+Solution: Reorder getting the column value. (closes #6744)
+Files: src/eval.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1500
+Problem: Vim9: error when using address without a command.
+Solution: Execute the range itself. (closes #6747)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1501
+Problem: Vim9: concatenating to constant reverses order.
+Solution: Generate constant before option, register and environment
+ variable. (closes #6757)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1502
+Problem: Vim9: can use += with a :let command at script level.
+Solution: Give an error.
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1503
+Problem: Vim9: error for an autocmd defined in a :def function in legacy
+ Vim script.
+Solution: Don't check the variable type. (closes #6758)
+Files: src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1504
+Problem: Vim9: white space checks are only done for a :def function.
+Solution: Also do checks at the script level. Adjust the name of a few
+ error messages.
+Files: src/userfunc.c, src/errors.h, src/dict.c, src/list.c,
+ src/vim9compile.c, src/vim9script.c, src/vim9type.c,
+ src/evalvars.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/vim9.vim
+
+Patch 8.2.1505
+Problem: Not all file read and writecode is tested.
+Solution: Add a few tests. (Dominique Pellé, closes #6764)
+Files: src/testdir/test_eval_stuff.vim, src/testdir/test_fnamemodify.vim,
+ src/testdir/test_functions.vim
+
+Patch 8.2.1506
+Problem: Vim9: no error when using a number other than 0 or 1 as bool.
+Solution: Check the number is 0 or 1.
+Files: src/errors.h, src/typval.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1507
+Problem: Using malloc() directly.
+Solution: Use ALLOC_ONE(). Remove superfluous typecast. (Hussam al-Homsi,
+ closes #6768)
+Files: src/eval.c, src/memline.c, src/vimrun.c
+
+Patch 8.2.1508
+Problem: Not all debugger commands covered by tests.
+Solution: Add tests for going up/down in the stack. (Ben Jackson,
+ closes #6765)
+Files: src/testdir/test_debugger.vim
+
+Patch 8.2.1509
+Problem: Vertical separator is cleared when dragging a popup window using a
+ multi-byte character for the border.
+Solution: Only clear the character before the window if it is using a
+ multi-byte character. (closes #6766)
+Files: src/screen.c
+
+Patch 8.2.1510
+Problem: Using "var" in a :def function may refer to a legacy Vim script
+ variable.
+Solution: Require using "s:" to refer to a legacy Vim script variable.
+ (closes #6771)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1511
+Problem: Putting a string in Visual block mode ignores multi-byte
+ characters.
+Solution: Adjust the column for Visual block mode. (closes #6767)
+Files: src/register.c, src/testdir/test_visual.vim
+
+Patch 8.2.1512
+Problem: Failure after ternary expression fails.
+Solution: Restore eval_flags. (Yasuhiro Matsumoto, closes #6776)
+Files: src/eval.c, src/testdir/test_vimscript.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1513
+Problem: Cannot interrupt shell used for filename expansion. (Dominique
+ Pellé)
+Solution: Do set tmode in mch_delay(). (closes #6770)
+Files: src/vim.h, src/os_unix.c, src/proto/os_unix.pro, src/term.c,
+ src/channel.c, src/if_cscope.c, src/os_amiga.c, src/ui.c,
+ src/proto/os_amiga.pro, src/os_win32.c, src/proto/os_win32.pro
+
+Patch 8.2.1514
+Problem: Multibyte vertical separator is cleared when dragging a popup
+ window using a multi-byte character for the border.
+Solution: Only clear the character before the window if it is double width.
+ (closes #6766)
+Files: src/screen.c
+
+Patch 8.2.1515
+Problem: Vim9: can create s:var in legacy script but cannot unlet.
+Solution: Allow :unlet for legacy script var.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1516
+Problem: Vim9: error for :exe has wrong line number.
+Solution: Set line number before calling do_cmdline_cmd(). (closes #6774)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1517
+Problem: Cannot easily get the character under the cursor.
+Solution: Add the {chars} argument to strpart().
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim
+
+Patch 8.2.1518
+Problem: Vim9: cannot assign to local option.
+Solution: Skip over "&l:" and "&g:". (closes #6749)
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/testdir/vim9.vim,
+ src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1519
+Problem: Vim9: Ex command default range is not set.
+Solution: When range is not given use default. (closes #6779)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1520
+Problem: Vim9: CTRL-] used in :def function does not work.
+Solution: Omit count or prepend colon. (closes #6769)
+Files: src/normal.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1521
+Problem: Reading past end of buffer when reading spellfile. (Yegappan
+ Lakshmanan)
+Solution: Store the byte length and check for it.
+Files: src/spellfile.c, src/spell.h
+
+Patch 8.2.1522
+Problem: Not enough test coverage for the spell file handling.
+Solution: Add spell file tests. (Yegappan Lakshmanan, closes #6763)
+Files: src/testdir/test_spellfile.vim
+
+Patch 8.2.1523
+Problem: Still not enough test coverage for the spell file handling.
+Solution: Add spell file tests. (Yegappan Lakshmanan, closes #6790)
+Files: src/testdir/test_spellfile.vim
+
+Patch 8.2.1524
+Problem: No longer get an error for string concatenation with float.
+ (Tsuyoshi Cho)
+Solution: Only convert float for Vim9 script. (closes #6787)
+Files: src/eval.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.2.1525
+Problem: Messages from tests were not always displayed.
+Solution: Always show messages, the timing is always useful. (Ken Takata,
+ closes #6792)
+Files: src/testdir/Make_dos.mak, src/testdir/Make_ming.mak,
+ src/testdir/Makefile
+
+Patch 8.2.1526
+Problem: Line in testdir Makefile got commented out. (Christian Brabandt)
+Solution: Revert.
+Files: src/testdir/Makefile
+
+Patch 8.2.1527
+Problem: Vim9: cannot use a function name as a function reference at script
+ level.
+Solution: Check if a name is a function name. (closes #6789)
+Files: src/evalvars.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1528
+Problem: Vim9: :endif not found after "if false".
+Solution: When skipping still check for a following command. (closes #6797)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1529
+Problem: Vim9: :elseif may be compiled when not needed.
+Solution: Do evaluate the :elseif expression.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1530
+Problem: Vim9: test fails on MS-Windows.
+Solution: Skip Ex command inside "if false".
+Files: src/vim9compile.c
+
+Patch 8.2.1531
+Problem: Vim9: test still fails on MS-Windows.
+Solution: When skipping expect function to be NULL.
+Files: src/vim9compile.c
+
+Patch 8.2.1532
+Problem: Compiler warning for conversion of size_t to long.
+Solution: Add type cast.
+Files: src/eval.c
+
+Patch 8.2.1533
+Problem: Vim9: error when passing getreginfo() result to setreg().
+Solution: Use dict_get_bool() for "isunnamed". (closes #6784)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1534
+Problem: Vim9: type error for argument type is not at call position.
+Solution: Set the context and stack after checking the arguments.
+ (issue #6785)
+Files: src/userfunc.c, src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1535
+Problem: It is not possible to specify cell widths of characters.
+Solution: Add setcellwidths().
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/mbyte.c,
+ src/proto/mbyte.pro, src/errors.h, src/testdir/test_utf8.vim
+
+Patch 8.2.1536
+Problem: Cannot get the class of a character; emoji widths are wrong in
+ some environments.
+Solution: Add charclass(). Update some emoji widths. Add script to check
+ emoji widths.
+Files: Filelist, runtime/doc/eval.txt, runtime/doc/usr_41.txt,
+ src/evalfunc.c, src/mbyte.c, src/proto/mbyte.pro,
+ src/testdir/emoji_list.vim, src/testdir/test_functions.vim
+
+Patch 8.2.1537
+Problem: Memory access error when using setcellwidths().
+Solution: Use array and pointers correctly.
+Files: src/mbyte.c, src/errors.h, src/testdir/test_utf8.vim
+
+Patch 8.2.1538
+Problem: Python: iteration over vim objects fails to keep reference.
+Solution: Keep a reference for the object. (Paul Ollis, closes #6803,
+ closes #6806)
+Files: src/if_py_both.h, src/testdir/test_python3.vim
+
+Patch 8.2.1539
+Problem: Using invalid script ID causes a crash.
+Solution: Check the script ID to be valid. (closes #6804)
+Files: src/globals.h, src/evalvars.c, src/profiler.c, src/scriptfile.c,
+ src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1540
+Problem: The user cannot try out emoji character widths.
+Solution: Move the emoji script to the runtime/tools directory.
+Files: Filelist, src/testdir/emoji_list.vim, runtime/tools/emoji_list.vim
+
+Patch 8.2.1541
+Problem: Vim9: cannot find function reference for s:Func.
+Solution: Recognize <SNR> prefix. (closes #6805)
+Files: src/userfunc.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1542
+Problem: Vim9: test with invalid SID does not work in the GUI.
+Solution: Skip the test in the GUI.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1543
+Problem: Vim9: test with invalid SID is skipped in the GUI.
+Solution: Read the CTRL-C that feedkeys() put in typeahead.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1544
+Problem: Cannot translate messages in a Vim script.
+Solution: Add gettext(). Try it out for a few messages in the options
+ window.
+Files: Filelist, src/po/Makefile, src/po/README.txt, runtime/optwin.vim,
+ src/evalfunc.c, src/po/tojavascript.vim, src/po/fixfilenames.vim,
+ runtime/doc/eval.txt, runtime/doc/usr_41.txt
+
+Patch 8.2.1545
+Problem: ch_logfile() is unclear about closing when forking.
+Solution: Adjust the log messages.
+Files: src/channel.c, src/os_unix.c
+
+Patch 8.2.1546
+Problem: Build rule for Vim.app is unused.
+Solution: Delete the related build rules.
+Files: src/Makefile
+
+Patch 8.2.1547
+Problem: Various comment problems.
+Solution: Update comments.
+Files: src/arglist.c, src/map.c, src/mbyte.c, src/tag.c, src/undo.c,
+ src/testdir/README.txt, src/testdir/test_put.vim,
+ src/libvterm/README
+
+Patch 8.2.1548
+Problem: Cannot move position of "%%" in message translations. (Emir Sarı)
+Solution: Improve the check script.
+Files: src/po/check.vim
+
+Patch 8.2.1549
+Problem: The "r" command fails for keys with modifiers if 'esckeys' is off
+ and modifyOtherKeys is used. (Lauri Tirkkonen)
+Solution: Temporarily disable bracketed paste and modifyOtherKeys if
+ 'esckeys' is off. (closes #6809)
+Files: src/normal.c
+
+Patch 8.2.1550
+Problem: Vim9: bufname('%') gives an error.
+Solution: Only give an error for wrong argument type. (closes #6807)
+Files: src/evalbuffer.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1551
+Problem: Vim9: error for argument type does not mention the number.
+Solution: Pass the argument number to where the error is given.
+Files: src/vim9type.c, src/proto/vim9type.pro, src/vim9compile.c,
+ src/vim9execute.c, src/vim9script.c, src/eval.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1552
+Problem: Warnings from asan with clang-11. (James McCoy)
+Solution: Avoid using a NULL pointer. (issue #6811)
+Files: src/fold.c
+
+Patch 8.2.1553 (after 8.2.1552)
+Problem: Crash in edit test.
+Solution: Avoid using invalid pointer.
+Files: src/fold.c
+
+Patch 8.2.1554
+Problem: Crash in normal test.
+Solution: Skip adjusting marks if there are no folds.
+Files: src/fold.c
+
+Patch 8.2.1555
+Problem: Not all tests are executed on Github Actions.
+Solution: Copy "src" to "src2" earlier. Recognize "src2" in a couple more
+ places. Add two tests to the list of flaky tests. (Ken Takata,
+ closes #6798)
+Files: .github/workflows/ci-windows.yaml, src/testdir/runtest.vim,
+ src/testdir/test_python2.vim, src/testdir/test_python3.vim
+
+Patch 8.2.1556
+Problem: Cursorline highlighting always overrules sign highlighting.
+Solution: Combine the highlighting, use the priority to decide how.
+ (closes #6812)
+Files: runtime/doc/sign.txt, src/structs.h, src/drawline.c,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim,
+ src/testdir/test_signs.vim,
+ src/testdir/dumps/Test_sign_cursor_5.dump,
+ src/testdir/dumps/Test_sign_cursor_6.dump
+
+Patch 8.2.1557
+Problem: Crash in :vimgrep when started as "vim -n". (Raul Segura)
+Solution: Check mfp pointer. (Yegappan Lakshmanan, closes #6827)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.1558
+Problem: Signs test fails.
+Solution: Add missing change to sign.c.
+Files: src/sign.c
+
+Patch 8.2.1559
+Problem: s390x tests work again.
+Solution: re-enable s390x tests. (James McCoy, closes #6829)
+Files: .travis.yml
+
+Patch 8.2.1560
+Problem: Using NULL pointers in some code. (James McCoy)
+Solution: Avoid adding to a NULL pointer. Use byte as unsigned.
+Files: src/fold.c, src/eval.c, src/spellsuggest.c, src/spellfile.c,
+ src/vim9compile.c
+
+Patch 8.2.1561
+Problem: Using NULL pointers in fold code.
+Solution: Avoid using a NULL pointer. (Dominique Pellé, closes #6831,
+ closes #6831)
+Files: src/fold.c
+
+Patch 8.2.1562
+Problem: Vim9: error when using "%" where a buffer is expected.
+Solution: Add tv_get_buf_from_arg(). (closes #6814)
+Files: src/typval.c, src/proto/typval.pro, src/evalbuffer.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1563
+Problem: Vim9: error when using '%" with setbufvar() or getbufvar().
+Solution: Use tv_get_buf_from_arg(). (closes #6816)
+Files: src/evalvars.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1564
+Problem: A few remaining errors from ubsan.
+Solution: Avoid the warnings. (Dominique Pellé, closes #6837)
+Files: src/spellfile.c, src/spellsuggest.c, src/viminfo.c
+
+Patch 8.2.1565
+Problem: Spellfile test sometimes fails.
+Solution: Check running into the end of the file.
+Files: src/spellfile.c
+
+Patch 8.2.1566
+Problem: Not all Bazel files are recognized.
+Solution: Add *.bazel and *.BUILD. (closes #6836)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1567
+Problem: No example to use ubsan with clang.
+Solution: Add example commands. (Dominique Pellé, issue #6811)
+Files: src/Makefile
+
+Patch 8.2.1568
+Problem: prop_find() skips properties in the same line if "skipstart" is
+ used.
+Solution: Use "continue" instead of "break". (closes #6840)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.1569
+Problem: Vim9: fixes for functions not tested; failure in getchangelist().
+Solution: Add tests. (closes #6813, closes #6815, closes #6817)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1570
+Problem: Configure check for dirfd() does not work on HPUX. (Michael Osipov)
+Solution: Use AC_TRY_LINK instead of AC_TRY_COMPILE. (closes #6838)
+Files: src/configure.ac, src/auto/configure, src/fileio.c, src/globals.h
+
+Patch 8.2.1571
+Problem: Vim9: count() third argument cannot be "true".
+Solution: Use tv_get_bool_chk(). (closes #6818)
+Files: src/typval.c, src/list.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1572
+Problem: Vim9: expand() does not take "true" as argument.
+Solution: Use tv_get_bool_chk(). (closes #6819)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1573
+Problem: Vim9: getreg() does not take "true" as argument.
+Solution: Use tv_get_bool_chk(). (closes #6820)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1574
+Problem: Vim9: glob() does not take "true" as argument.
+Solution: Use tv_get_bool_chk(). (closes #6821)
+Files: src/filepath.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1575
+Problem: Vim9: globpath() does not take "true" as argument.
+Solution: Use tv_get_bool_chk(). (closes #6821)
+Files: src/filepath.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1576
+Problem: Vim9: index() does not take "true" as argument.
+Solution: Use tv_get_bool_chk(). (closes #6823)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1577
+Problem: Vim9: hasmapto(), mapcheck() and maparg() do not take "true" as
+ argument.
+Solution: Use tv_get_bool(). (closes #6822, closes #6824)
+Files: src/evalfunc.c, src/map.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1578
+Problem: Vim9: popup_clear() does not take "true" as argument.
+Solution: Use tv_get_bool(). (closes #6826)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1579
+Problem: Reports from asan are not optimal.
+Solution: Use clang with ubsan. (James McCoy, closes #6811)
+Files: .travis.yml
+
+Patch 8.2.1580
+Problem: Wildmenu does not work properly.
+Solution: Do not call may_do_incsearch_highlighting() if completion is in
+ progress.
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_1.dump,
+ src/testdir/dumps/Test_wildmenu_2.dump,
+ src/testdir/dumps/Test_wildmenu_3.dump,
+ src/testdir/dumps/Test_wildmenu_4.dump
+
+Patch 8.2.1581
+Problem: Using line() for global popup window doesn't work.
+Solution: Set tabpage to "curtab". (closes #6847)
+Files: src/evalwindow.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1582
+Problem: The channel log does not show typed text.
+Solution: Add raw typed text to the log file.
+Files: src/ui.c, src/os_win32.c
+
+Patch 8.2.1583
+Problem: MS-Windows: cannot easily measure code coverage.
+Solution: Add the COVERAGE option. (Ken Takata, closes #6842)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.2.1584
+Problem: Vim9: cannot use "true" for "skipstart" in prop_find().
+Solution: Use dict_get_bool() instead of tv_get_number(). (closes #6852)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.1585
+Problem: Messages in errors.h not translated, xgettext on MS-Windows not
+ fully supported.
+Solution: Add errors.h to list of input files. Update MS-Windows makefiles
+ to improve message translations. (Ken Takata, closes #6858)
+Files: src/po/Make_cyg.mak, src/po/Make_ming.mak, src/po/Make_mvc.mak,
+ src/po/Makefile, src/po/README.txt, src/po/fixfilenames.vim
+
+Patch 8.2.1586
+Problem: :resize command not fully tested.
+Solution: Add a couple of tests. (Dominique Pellé, closes #6857)
+Files: src/testdir/test_window_cmd.vim
+
+Patch 8.2.1587
+Problem: Loop for handling keys for the command line is too long.
+Solution: Move wild menu handling to separate functions. (Yegappan
+ Lakshmanan, closes #6856)
+Files: src/cmdexpand.c, src/proto/cmdexpand.pro, src/ex_getln.c
+
+Patch 8.2.1588
+Problem: Cannot read back the prompt of a prompt buffer.
+Solution: Add prompt_getprompt(). (Ben Jackson, closes #6851)
+Files: runtime/doc/channel.txt, runtime/doc/eval.txt,
+ runtime/doc/usr_41.txt, src/channel.c, src/edit.c, src/evalfunc.c,
+ src/proto/channel.pro, src/proto/edit.pro,
+ src/testdir/test_prompt_buffer.vim
+
+Patch 8.2.1589
+Problem: Term_start() options for size are overruled by 'termwinsize'.
+ (Sergey Vlasov)
+Solution: Set 'termwinsize' to the specified size.
+Files: src/terminal.c, src/testdir/test_terminal2.vim,
+ src/testdir/term_util.vim
+
+Patch 8.2.1590
+Problem: Vim9: bufnr() doesn't take "true" argument.
+Solution: use tv_get_bool_chk(). (closes #6863)
+Files: src/evalbuffer.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1591
+Problem: Using winheight('.') in tests works but is wrong.
+Solution: Use winheight(0). (issue #6863)
+Files: src/testdir/test_functions.vim, src/testdir/test_quickfix.vim
+
+Patch 8.2.1592
+Problem: Vim9: passing "true" to char2nr() fails.
+Solution: Use tv_get_bool_chk(). (closes #6865)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1593
+Problem: Tests do not check the error number properly.
+Solution: Add a colon after the error number. (closes #6869)
+Files: src/testdir/test_assert.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_backspace_opt.vim, src/testdir/test_channel.vim,
+ src/testdir/test_clientserver.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_const.vim, src/testdir/test_cscope.vim,
+ src/testdir/test_eval_stuff.vim, src/testdir/test_functions.vim,
+ src/testdir/test_global.vim, src/testdir/test_gui.vim,
+ src/testdir/test_hlsearch.vim, src/testdir/test_lambda.vim,
+ src/testdir/test_let.vim, src/testdir/test_listdict.vim,
+ src/testdir/test_move.vim, src/testdir/test_normal.vim,
+ src/testdir/test_popupwin.vim, src/testdir/test_put.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_rename.vim,
+ src/testdir/test_search.vim, src/testdir/test_signs.vim,
+ src/testdir/test_substitute.vim, src/testdir/test_syntax.vim,
+ src/testdir/test_tagfunc.vim, src/testdir/test_tagjump.vim,
+ src/testdir/test_taglist.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_terminal2.vim, src/testdir/test_textprop.vim,
+ src/testdir/test_timers.vim, src/testdir/test_true_false.vim,
+ src/testdir/test_user_func.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_vimscript.vim,
+ src/testdir/test_winbar.vim, src/testdir/test_winbuf_close.vim,
+ src/testdir/test_window_cmd.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.1594
+Problem: Pull requests on github do not notify a maintainer.
+Solution: Add a CODEOWNERS file with a few initial entries.
+Files: Filelist, .github/CODEOWNERS
+
+Patch 8.2.1595
+Problem: Cannot easily see what Vim sends to the terminal.
+Solution: Write output to the channel log if it contains terminal control
+ sequences. Avoid warnings for tputs() argument.
+Files: src/term.c, src/globals.h, src/edit.c, src/normal.c,
+ src/optionstr.c
+
+Patch 8.2.1596
+Problem: Using win_screenpos('.') in tests works but is wrong.
+Solution: Use win_screenpos(0).
+Files: src/testdir/test_terminal3.vim
+
+Patch 8.2.1597
+Problem: The channel source file is too big.
+Solution: Move job related code to a new source file.
+Files: Filelist, src/Makefile, src/Make_mvc.mak, src/Make_cyg_ming.mak,
+ src/channel.c, src/proto/channel.pro, src/job.c,
+ src/proto/job.pro, src/proto.h, src/edit.c, src/proto/edit.pro,
+ src/globals.h, src/configure.ac, src/auto/configure
+
+Patch 8.2.1598
+Problem: Starting a hidden terminal resizes the current window.
+Solution: Do not resize the current window for a hidden terminal.
+ (closes #6872)
+Files: src/terminal.c, src/testdir/test_terminal2.vim
+
+Patch 8.2.1599
+Problem: Missing line end when skipping a long line with :cgetfile.
+Solution: Fix off-by-one error. (closes #6870)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.1600
+Problem: Vim9: cannot use "true" with deepcopy().
+Solution: Use tv_get_bool_chk(). (closes #6867)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_listdict.vim
+
+Patch 8.2.1601
+Problem: Vim9: cannot use "true" with garbagecollect().
+Solution: Use tv_get_bool(). (closes #6871)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1602
+Problem: Vim9: cannot use "true" with getbufinfo().
+Solution: Use dict_get_bool(). (closes #6873)
+Files: src/evalbuffer.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1603
+Problem: Vim9: cannot use "true" with getchar().
+Solution: use tv_get_bool_chk(). (closes #6874)
+Files: src/getchar.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1604
+Problem: Vim9: cannot use "true" with getcompletion().
+Solution: use tv_get_bool_chk(). (closes #6875)
+Files: src/cmdexpand.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1605
+Problem: Default maintainer on github is wrong.
+Solution: Use Bram's account.
+Files: .github/CODEOWNERS
+
+Patch 8.2.1606
+Problem: Vim9: cannot use "true" with has().
+Solution: Use tv_get_bool(). (closes #6876)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1607
+Problem: Vim9: getchar() test fails on MS-Windows.
+Solution: First consume any available input.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.1608
+Problem: Vim9: getchar() test fails with GUI.
+Solution: Avoid that getchar(0) gets stuck on K_IGNORE.
+Files: src/getchar.c
+
+Patch 8.2.1609
+Problem: Vim9: test fails when build without +channel.
+Solution: Add check for +channel. (closes #6879)
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1610
+Problem: Vim9: cannot pass "true" to list2str() and str2list().
+Solution: Use tv_get_bool_chk(). (closes #6877)
+Files: src/evalfunc.c, src/list.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1611
+Problem: Vim9: cannot pass "true" to nr2char().
+Solution: use tv_get_bool_chk(). (closes #6878)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1612
+Problem: Vim9: cannot pass "true" to prop_remove().
+Solution: Use dict_get_bool(). (closes #6853)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.1613
+Problem: Vim9: cannot pass "true" to prop_type_add().
+Solution: Use tv_get_bool(). (closes #6850)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.1614
+Problem: Vim9: cannot pass "true" to searchcount().
+Solution: Use tv_get_bool_chk(). (closes #6854)
+Files: src/search.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1615
+Problem: Vim9: cannot pass "true" to searchdecl().
+Solution: use tv_get_bool_chk(). (closes #6881)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1616
+Problem: Vim9: cannot pass "true" to synID().
+Solution: Use tv_get_bool_chk(). (closes #6860)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1617
+Problem: Vim9: cannot pass "true" to win_splitmove().
+Solution: Use dict_get_bool(). (closes #6862) Alphabetize test functions.
+Files: src/evalwindow.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1618
+Problem: Vim9: cannot pass "true" to setloclist().
+Solution: Use dict_get_bool(). (closes #6882)
+Files: src/quickfix.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1619
+Problem: Vim9: cannot pass "true" to spellsuggest().
+Solution: Use tv_get_bool_chk(). (closes #6883)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1620
+Problem: searchcount() test fails.
+Solution: Restore default flag value.
+Files: src/search.c
+
+Patch 8.2.1621
+Problem: Crash when using submatch(0, 1) in substitute().
+Solution: Increment reference count. (closes #6887)
+Files: src/regexp.c, src/testdir/test_substitute.vim
+
+Patch 8.2.1622
+Problem: Loop to handle keys for the command line is too long.
+Solution: Move code to functions. (Yegappan Lakshmanan, closes #6880)
+Files: src/ex_getln.c
+
+Patch 8.2.1623
+Problem: Vim9: using :call where it is not needed.
+Solution: Remove :call. (closes #6892)
+Files: src/testdir/test_maparg.vim, src/testdir/test_textprop.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1624
+Problem: Vim9: cannot pass "true" to split(), str2nr() and strchars().
+Solution: Use tv_get_bool_chk(). (closes #6884, closes #6885, closes #6886)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1625
+Problem: Compiler warning for use of fptr_T.
+Solution: Make the type less strict.
+Files: src/regexp.c
+
+Patch 8.2.1626
+Problem: Test for strchars() fails with different error number.
+Solution: Adjust the error number.
+Files: src/testdir/test_utf8.vim
+
+Patch 8.2.1627
+Problem: Vim9: cannot pass "true" to submatch(), term_gettty() and
+ term_start()
+Solution: Use tv_get_bool_chk(). (closes #6888, closes #6890, closes #6889)
+Files: src/evalfunc.c, src/terminal.c, src/job.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1628
+Problem: Vim9: cannot pass "true" to timer_paused().
+Solution: Use tv_get_bool(). (closes #6891)
+Files: src/time.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1629
+Problem: Test fails without terminal feature.
+Solution: Check for terminal feature.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.1630
+Problem: Terminal test fails.
+Solution: Correct argument to term_start(). Correct error number.
+Files: src/testdir/test_terminal.vim, src/testdir/test_terminal2.vim
+
+Patch 8.2.1631
+Problem: test_fails() does not check the context of the line number.
+Solution: Use another argument to specify the context of the line number.
+Files: runtime/doc/testing.txt, runtime/doc/eval.txt,
+ src/testdir/test_vim9_func.vim, src/testing.c, src/globals.h,
+ src/evalfunc.c, src/message.c
+
+Patch 8.2.1632
+Problem: Not checking the context of test_fails().
+Solution: Add the line number and context arguments. Give error if
+ assert_fails() argument types are wrong.
+Files: src/testing.c, src/errors.h, src/testdir/test_assert.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1633
+Problem: Some error messages are internal but do not use iemsg().
+Solution: Use iemsg(). (Dominique Pellé, closes #6894)
+Files: src/regexp.c, src/regexp_bt.c, src/regexp_nfa.c
+
+Patch 8.2.1634
+Problem: Loop to handle keys for the command line is too long.
+Solution: Move a few more parts to separate functions. (Yegappan Lakshmanan,
+ closes #6895)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.1635
+Problem: No digraph for 0x2022 BULLET.
+Solution: Use "oo". (Hans Ginzel, closes #6904)
+Files: src/digraph.c, runtime/doc/digraph.txt
+
+Patch 8.2.1636
+Problem: Get stuck if a popup filter causes an error.
+Solution: Check whether the function can be called and does not cause an
+ error. (closes #6902)
+Files: src/structs.h, src/popupwin.c, src/testdir/test_popupwin.vim
+ src/testdir/dumps/Test_popupwin_wrong_name.dump,
+ src/testdir/dumps/Test_popupwin_three_errors_1.dump,
+ src/testdir/dumps/Test_popupwin_three_errors_2.dump
+
+Patch 8.2.1637
+Problem: Vim9: :put ={expr} does not work inside :def function.
+Solution: Add ISN_PUT. (closes #6397)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c, src/register.c,
+ src/proto/register.pro, src/edit.c, src/ex_docmd.c, src/mouse.c,
+ src/normal.c, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1638
+Problem: Leaking memory when popup filter function can't be called.
+Solution: Don't return too soon.
+Files: src/popupwin.c
+
+Patch 8.2.1639
+Problem: Options window cannot be translated.
+Solution: Get the translation for "local to" texts once and use them in many
+ places. Fix that 'whichwrap' is not a local option. (issue #6800)
+Files: runtime/optwin.vim
+
+Patch 8.2.1640
+Problem: Amiga: missing header for getgrgid().
+Solution: Add the grp.h header. (Ola Söder, closes #6906)
+Files: src/os_amiga.h
+
+Patch 8.2.1641
+Problem: Vim9: cannot use 0 or 1 where a bool is expected.
+Solution: Allow using 0 and 1 for a bool type. (closes #6903)
+Files: src/vim9compile.c, src/vim9type.c, src/proto/vim9type.pro,
+ src/structs.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1642
+Problem: Options test fails.
+Solution: Correct call to OptionG().
+Files: runtime/optwin.vim
+
+Patch 8.2.1643
+Problem: Vim9: :defcompile compiles dead functions.
+Solution: Skip over dead functions.
+Files: src/userfunc.c
+
+Patch 8.2.1644
+Problem: Vim9: cannot assign 1 and 0 to bool at script level.
+Solution: Add the TTFLAG_BOOL_OK flag to the type. Fix name of test
+ function.
+Files: src/vim9type.c, src/testdir/test_vim9_script.vim,
+ src/testdir/vim9.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1645
+Problem: GTK3: icons become broken images when resized.
+Solution: Use gtk_image_new_from_icon_name(). (closes #6916)
+ Fix compiler warnings.
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.1646
+Problem: Amiga: Unnecessary #include.
+Solution: Remove the #include. (Ola Söder, closes #6908)
+Files: src/version.c
+
+Patch 8.2.1647
+Problem: Vim9: result of expression with && and || cannot be assigned to a
+ bool variable.
+Solution: Add the TTFLAG_BOOL_OK flag and convert the value if needed.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1648
+Problem: Amiga: no common build file for Amiga (-like) systems.
+Solution: Turn Make_morph.mak into Make_ami.mak. (Ola Söder, closes #6805)
+Files: Filelist, src/Make_ami.mak, src/Make_morph.mak, src/INSTALLami.txt
+
+Patch 8.2.1649
+Problem: GTK3: using old file chooser.
+Solution: Use native file chooser on GTK 3.20 and above. (Yogeshwar
+ Velingker, closes #6909)
+Files: src/gui_gtk.c
+
+Patch 8.2.1650
+Problem: Vim9: result of && and || expression cannot be assigned to a bool
+ at the script level.
+Solution: Add the VAR_BOOL_OK flag. Convert to bool when needed.
+Files: src/structs.h, src/vim9type.c, src/proto/vim9type.pro,
+ src/vim9script.c, src/evalvars.c, src/eval.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1651
+Problem: Spellfile code not completely tested.
+Solution: Add a few more test cases. (Yegappan Lakshmanan, closes #6918)
+Files: src/testdir/test_spellfile.vim
+
+Patch 8.2.1652
+Problem: Cannot translate lines in the options window.
+Solution: Use the AddOption() function to split descriptions where indicated
+ by a line break. (issue #6800)
+Files: runtime/optwin.vim
+
+Patch 8.2.1653
+Problem: Expand('<stack>') does not include the final line number.
+Solution: Add the line number. (closes #6927)
+Files: src/vim.h, src/scriptfile.c, src/proto/scriptfile.pro,
+ src/debugger.c, src/ex_docmd.c, src/ex_eval.c, src/message.c,
+ src/testing.c, src/testdir/test_expand_func.vim
+
+Patch 8.2.1654
+Problem: When job writes to hidden buffer current window has display
+ errors. (Johnny McArthur)
+Solution: Use aucmd_prepbuf() instead of switch_to_win_for_buf().
+ (closes #6925)
+Files: src/channel.c
+
+Patch 8.2.1655
+Problem: Cannot build with Strawberry Perl 5.32.0.
+Solution: Use Perl_sv_2pvbyte_flags. (closes #6921)
+Files: src/if_perl.xs
+
+Patch 8.2.1656
+Problem: Vim9: callstack wrong if :def function calls :def function.
+Solution: Set the line number before calling. (closes #6914)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1657
+Problem: Vim9: no proper error for nested ":def!".
+Solution: Check for "!". (closes #6920)
+Files: src/errors.h, src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1658
+Problem: Expand('<stack>') has trailing "..".
+Solution: Remove the "..". (closes #6927)
+Files: src/scriptfile.c, src/testdir/test_expand_func.vim
+
+Patch 8.2.1659
+Problem: Spellfile code not completely tested.
+Solution: Add a few more test cases. (Yegappan Lakshmanan, closes #6929)
+Files: src/testdir/test_spell.vim, src/testdir/test_spellfile.vim
+
+Patch 8.2.1660
+Problem: Assert functions require passing expected result as the first
+ argument, which isn't obvious.
+Solution: Use a method, as in "runtest()->assert_equal(expected)".
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.1661
+Problem: Cannot connect to 127.0.0.1 for host with only IPv6 addresses.
+Solution: pass AI_V4MAPPED flag to getaddrinfo. (Filipe Brandenburger,
+ closes #6931)
+Files: src/channel.c
+
+Patch 8.2.1662
+Problem: :mksession does not restore shared terminal buffer properly.
+Solution: Keep a hashtab with terminal buffers. (Rob Pilling, closes #6930)
+Files: src/hashtab.c, src/proto/terminal.pro, src/session.c,
+ src/terminal.c, src/testdir/test_mksession.vim
+
+Patch 8.2.1663
+Problem: Options window entries cannot be translated.
+Solution: Use AddOption() for all explanations. (closes #6800)
+Files: runtime/optwin.vim
+
+Patch 8.2.1664
+Problem: Memory leak when using :mkview with a terminal buffer.
+Solution: Don't use a hastab for :mkview. (Rob Pilling, closes #6935)
+Files: src/session.c, src/terminal.c, src/testdir/test_mksession.vim
+
+Patch 8.2.1665
+Problem: Cannot do fuzzy string matching.
+Solution: Add matchfuzzy(). (Yegappan Lakshmanan, closes #6932)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/proto/search.pro, src/search.c, src/testdir/test_functions.vim
+
+Patch 8.2.1666
+Problem: The initial value of 'backupskip' can have duplicate items.
+Solution: Remove duplicates, like when it is set later. (Tom Ryder,
+ closes #6940)
+Files: src/option.c, src/testdir/test_options.vim
+
+Patch 8.2.1667
+Problem: Local function name cannot shadow a global function name.
+Solution: Ignore global functions when checking a script-local or scoped
+ function name. (closes #6926)
+Files: src/vim9compile.c, src/userfunc.c, src/proto/userfunc.pro,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1668
+Problem: Vim9: not accepting 0 or 1 as bool when type is any.
+Solution: Convert the type with the CHECKTYPE instruction. (closes #6913)
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1669
+Problem: Vim9: memory leak when storing a value fails.
+Solution: Free the value when not storing it.
+Files: src/evalvars.c
+
+Patch 8.2.1670
+Problem: A couple of gcc compiler warnings.
+Solution: Initialize local variables. (Dominique Pellé, closes #6944)
+Files: src/memline.c, src/option.c
+
+Patch 8.2.1671
+Problem: Vim9: stray error for missing white space.
+Solution: Do not skip over white space after member. (closes #6917)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1672
+Problem: v_lock is used when it is not initialized. (Yegappan Lakshmanan)
+Solution: Initialize the typval in eval1().
+Files: src/eval.c
+
+Patch 8.2.1673
+Problem: complete_info() selected index has an invalid value. (Ben Jackson)
+Solution: Set the index when there is only one match. (closes #6945)
+ Add test for complete_info().
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.1674
+Problem: Vim9: internal error when using variable that was not set.
+Solution: Give a meaningful error. (closes #6937)
+Files: src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1675
+Problem: MinGW: testdir makefile deletes non-existing file.
+Solution: Use another way to delete the output file if it already exists.
+ (Michael Soyka)
+Files: src/testdir/Make_ming.mak
+
+Patch 8.2.1676
+Problem: Compiler warnings for function typecast.
+Solution: Add an intermediate cast to "void *".
+Files: src/os_unix.c
+
+Patch 8.2.1677
+Problem: Memory access errors when calling setloclist() in an autocommand.
+Solution: Give an error if the list was changed unexpectedly. (closes #6946)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.1678
+Problem: Crash when using ":set" after ":ownsyntax". (Dhiraj Mishra)
+Solution: Make sure 'spelloptions' is not NULL. (closes #6950)
+Files: src/syntax.c, src/testdir/test_syntax.vim
+
+Patch 8.2.1679
+Problem: Vim9: ":*" is not recognized as a range.
+Solution: Move recognizing "*" into skip_range(). (closes #6938)
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/cmdexpand.c,
+ src/ex_getln.c, src/userfunc.c, src/vim9compile.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1680
+Problem: Vim9: line number for compare error is wrong.
+Solution: Set SOURCING_LNUM. (closes #6936)
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1681
+Problem: Vim9: unnecessary :call commands in tests.
+Solution: Remove the commands. (issue #6936)
+Files: src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1682
+Problem: Vim9: const works in an unexpected way.
+Solution: ":const" only disallows changing the variable, not the value.
+ Make "list[0] = 9" work at the script level.
+Files: src/vim9compile.c, src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1683
+Problem: Vim9: assignment test fails.
+Solution: Include changes to find Ex command.
+Files: src/ex_docmd.c
+
+Patch 8.2.1684
+Problem: "gF" does not use line number after file in Visual mode.
+Solution: Look for ":123" after the Visual area. (closes #6952)
+Files: src/findfile.c, src/testdir/test_gf.vim
+
+Patch 8.2.1685
+Problem: Vim9: cannot declare a constant value.
+Solution: Introduce ":const!".
+Files: runtime/doc/vim9.txt, src/ex_cmds.h, src/vim9compile.c,
+ src/vim9.h, src/vim9execute.c, src/evalvars.c,
+ src/proto/evalvars.pro, src/errors.h, src/vim.h, src/eval.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1686
+Problem: Vim9: "const!" not sufficiently tested.
+Solution: Add a few more test cases. Fix type checking.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1687
+Problem: Vim9: out of bounds error.
+Solution: Check that cmdidx is not negative.
+Files: src/vim9compile.c
+
+Patch 8.2.1688
+Problem: Increment/decrement removes text property.
+Solution: Insert the new number before deleting the old one. (closes #6962)
+Files: src/ops.c, src/testdir/test_textprop.vim
+
+Patch 8.2.1689
+Problem: 'colorcolumn' doesn't show in indent.
+Solution: Also draw the column when draw_state is WL_BRI or WL_SBR.
+ (Alexey Demin, closes #6948, closes #6619)
+Files: src/drawline.c, src/testdir/dumps/Test_colorcolumn_2.dump,
+ src/testdir/dumps/Test_colorcolumn_3.dump,
+ src/testdir/test_highlight.vim
+
+Patch 8.2.1690
+Problem: Text properties not adjusted for "I" in Visual block mode.
+Solution: Call inserted_bytes(). (closes #6961)
+Files: src/ops.c, src/change.c, src/proto/change.pro,
+ src/testdir/test_textprop.vim
+
+Patch 8.2.1691
+Problem: Vim9: list<any> is not accepted where list<number> is expected.
+Solution: Add functions to allocate and free a type_T, use it in
+ ISN_CHECKTYPE. (closes #6959)
+Files: src/vim9.h, src/globals.h, src/vim9compile.c, src/vim9execute.c,
+ src/vim9type.c, src/proto/vim9type.pro, src/errors.h,
+ src/evalfunc.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1692
+Problem: Build fails because TTFLAG_STATIC is missing.
+Solution: Include missing change.
+Files: src/structs.h
+
+Patch 8.2.1693
+Problem: "hi def" does not work for cleared highlight.
+Solution: Check the "sg_cleared" flag. (Maxim Kim, closes #6956,
+ closes #4405)
+Files: src/highlight.c, src/testdir/test_highlight.vim
+
+Patch 8.2.1694
+Problem: Compiler warning for loss if data.
+Solution: Add typecast.
+Files: src/ops.c
+
+Patch 8.2.1695
+Problem: Vim9: crash when using varargs type "any".
+Solution: Check if uf_va_type is &t_any. (closes #6957)
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1696
+Problem: Unused (duplicate) macros.
+Solution: Remove the macros.
+Files: src/spell.c
+
+Patch 8.2.1697
+Problem: Inconsistent capitalization of error messages.
+Solution: Always start with a capital.
+Files: src/errors.h, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim,
+ src/testdir/test_assert.vim
+
+Patch 8.2.1698
+Problem: Cannot lock a variable in legacy Vim script like in Vim9.
+Solution: Make ":lockvar 0" work.
+Files: runtime/doc/eval.txt, src/evalvars.c, src/proto/evalvars.pro,
+ src/dict.c, src/eval.c, src/list.c, src/typval.c, src/userfunc.c,
+ src/testdir/test_const.vim, src/testdir/test_listdict.vim
+
+Patch 8.2.1699
+Problem: Build failure due to missing error message.
+Solution: Add error message.
+Files: src/errors.h
+
+Patch 8.2.1700
+Problem: Vim9: try/catch causes wrong value to be returned.
+Solution: Reset tcd_return. (closes #6964)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1701
+Problem: Vim9: sort("i") does not work.
+Solution: Don't try getting a number for a string argument. (closes #6958)
+Files: src/list.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1702
+Problem: Crash when using undo after deleting folded lines.
+Solution: Check for NULL pointer. (closes #6968)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.2.1703
+Problem: ":highlight clear" does not restore default link.
+Solution: Remember the default link and restore it. (Antony Scriven,
+ closes #6970, closes #4405)
+Files: runtime/doc/syntax.txt, src/highlight.c,
+ src/testdir/test_highlight.vim
+
+Patch 8.2.1704
+Problem: Vim9: crash in for loop when autoload script has an error.
+Solution: Reset suppress_errthrow. Check for NULL list. (closes #6967)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1705
+Problem: "verbose hi Name" reports incorrect info after ":hi clear".
+Solution: Store the script context. (Antony Scriven, closes #6975)
+Files: src/highlight.c, src/testdir/test_highlight.vim
+
+Patch 8.2.1706
+Problem: Vim9: crash after running into the "Multiple closures" error.
+Solution: When a function fails still update any closures. (closes #6973)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1707
+Problem: Small inconsistency in highlight test.
+Solution: Use one argument for :execute. (Antony Scriven, #6975)
+Files: src/testdir/test_highlight.vim
+
+Patch 8.2.1708
+Problem: Vim9: error message for function has unprintable characters.
+Solution: use printable_func_name(). (closes #6965)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1709
+Problem: Vim9: memory leak when using multiple closures.
+Solution: Free the partial.
+Files: src/vim9execute.c
+
+Patch 8.2.1710
+Problem: Vim9: list of list type can be wrong.
+Solution: Use VAR_UNKNOWN for empty list. Recognize VAR_UNKNOWN when
+ looking for a common type. (closes #6979)
+Files: src/vim9type.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1711
+Problem: Vim9: leaking memory when using partial.
+Solution: Do delete the function even when it was compiled.
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/userfunc.c,
+ src/vim9execute.c
+
+Patch 8.2.1712
+Problem: Vim9: leaking memory when calling a lambda.
+Solution: Decrement function reference from ISN_DCALL.
+Files: src/vim9compile.c, src/userfunc.c, src/proto/userfunc.pro
+
+Patch 8.2.1713
+Problem: Motif GUI: crash when setting menu colors. (Andrzej Bylicki)
+Solution: Add {} to make "n" incremented correctly. (closes #6989,
+ closes #5948)
+Files: src/gui_motif.c
+
+Patch 8.2.1714
+Problem: Text properties corrupted with substitute command. (Filipe
+ Brandenburger)
+Solution: Get the changed line again after using u_savesub(). (closes #6984)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.1715
+Problem: Motif GUI: commented out code missed {}.
+Solution: Add {} and reenable the code. (similar to #6989)
+Files: src/gui_motif.c
+
+Patch 8.2.1716
+Problem: Options window has duplicate translations.
+Solution: Make one entry for "global or local to buffer". Fix wrong text.
+ (closes #6983)
+Files: runtime/optwin.vim
+
+Patch 8.2.1717
+Problem: MS-Windows installer doesn't have Russian translations.
+Solution: Add Russian translations. (closes #6985)
+Files: nsis/gvim.nsi, nsis/lang/russian.nsi
+
+Patch 8.2.1718
+Problem: Vim9: :def function disallows "firstline" and "lastline" argument
+ names for no good reason.
+Solution: Don't check the arguments for a :def function. (closes #6986)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1719
+Problem: Vim9: no error if comma is missing in between arguments.
+Solution: Give an error message.
+Files: src/errors.h, src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1720
+Problem: Vim9: memory leak with heredoc that isn't executed. (Dominique
+ Pellé)
+Solution: Don't clear the list items. (closes #6991)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1721
+Problem: MS-Windows installer doesn't work.
+Solution: Write "Russian" in ASCII. (closes #6995, see #6985).
+Files: nsis/lang/russian.nsi
+
+Patch 8.2.1722
+Problem: Vim9: cannot assign a lambda to a variable of type function.
+Solution: Allow for assigning a partial to a variable of type function.
+ (Naruhiko Nishino, closes #6996)
+Files: src/vim9type.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1723
+Problem: Vim9: Variable argument name cannot start with underscore.
+Solution: Use eval_isnamec1(). (closes #6988)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1724
+Problem: Vim9: assignment tests spread out.
+Solution: Create new test file for assignment tests.
+Files: src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/Make_all.mak
+
+Patch 8.2.1725
+Problem: Not all Pascal files are recognized.
+Solution: Add filetype patterns. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1726
+Problem: Fuzzy matching only works on strings.
+Solution: Support passing a dict. Add matchfuzzypos() to also get the match
+ positions. (Yegappan Lakshmanan, closes #6947)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/proto/search.pro, src/search.c, src/testdir/Make_all.mak,
+ src/testdir/test_functions.vim, src/testdir/test_matchfuzzy.vim
+
+Patch 8.2.1727
+Problem: A popup created with "cursorline" will ignore "firstline".
+Solution: When both "cursorline" and "firstline" are present put the cursor
+ on "firstline". (closes #7000) Add the "winid" argument to
+ getcurpos().
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/popupwin.c,
+ src/evalwindow.c, src/testdir/test_popupwin.vim,
+ src/testdir/test_functions.vim
+
+Patch 8.2.1728
+Problem: Compiler warning for using uninitialized variable. (John Marriott)
+Solution: Initialize "neighbor".
+Files: src/search.c
+
+Patch 8.2.1729
+Problem: Endless loop when ":normal" feeds popup window filter.
+Solution: Add the ex_normal_busy_done flag.
+Files: src/globals.h, src/getchar.c, src/evalfunc.c, src/ex_docmd.c,
+ src/menu.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_normal_cmd.dump
+
+Patch 8.2.1730
+Problem: Vim9: cannot use member of unknown type.
+Solution: When type is unknown use "any". (closes #6997)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1731
+Problem: Vim9: cannot use += to append to empty NULL list.
+Solution: Copy the list instead of extending it. (closes #6998)
+Files: src/eval.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1732
+Problem: Stuck when win_execute() for a popup causes an error.
+Solution: Disable the filter callback on error. (issue #6999)
+Files: src/popupwin.c, src/testdir/term_util.vim,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_win_execute.dump
+
+Patch 8.2.1733
+Problem: Vim9: memory leaks when using nested function.
+Solution: Free function when compilation fails.
+Files: src/vim9compile.c
+
+Patch 8.2.1734
+Problem: Vim9: cannot use a funcref for a closure twice.
+Solution: Instead of putting the funcref on the stack use a growarray on the
+ execution context.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1735
+Problem: Github actions appear to timeout too soon.
+Solution: use "timeout" instead of "ping".
+Files: .github/workflows/ci-windows.yaml
+
+Patch 8.2.1736
+Problem: Failure to compile a pattern not tested much.
+Solution: Add tests where a pattern fails to compile. (Yegappan Lakshmanan,
+ closes #7004)
+Files: src/testdir/gen_opt_test.vim, src/testdir/test_arglist.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_buffer.vim,
+ src/testdir/test_checkpath.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_debugger.vim, src/testdir/test_functions.vim,
+ src/testdir/test_history.vim, src/testdir/test_listdict.vim,
+ src/testdir/test_options.vim, src/testdir/test_search_stat.vim,
+ src/testdir/test_sort.vim, src/testdir/test_substitute.vim,
+ src/testdir/test_syntax.vim, src/testdir/test_tagjump.vim,
+ src/testdir/test_user_func.vim
+
+Patch 8.2.1737
+Problem: Cursor line highlight in popup window is not always updated.
+Solution: Check if the cursor has moved. (closes #7010)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+ src/testdir/dumps/Test_popupwin_win_execute_cursorline.dump
+
+Patch 8.2.1738
+Problem: Mac: str2float() recognizes comma instead of decimal point.
+Solution: Set LC_NUMERIC to "C". (closes #7003)
+Files: src/os_mac_conv.c
+
+Patch 8.2.1739
+Problem: Vim9: crash when compiling a manually defined function. (Antony
+ Scriven)
+Solution: Check that the script ID is positive. (closes #7012)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1740
+Problem: Test fails without the terminal feature.
+Solution: Skip test if the terminal feature is not available.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1741
+Problem: pathshorten() only supports using one character.
+Solution: Add an argument to control the length. (closes #7006)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/filepath.c,
+ src/proto/filepath.pro, src/testdir/test_functions.vim
+
+Patch 8.2.1742
+Problem: Test still fails without the terminal feature.
+Solution: Put check for terminal feature in separate function.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.1743
+Problem: Cannot build without the eval feature.
+Solution: Move shorten_dir outside of #ifdef.
+Files: src/filepath.c
+
+Patch 8.2.1744
+Problem: Vim9: using ":const!" is weird.
+Solution: Use "var" - "final" - "const" like Dart. "let" still works for
+ now.
+Files: runtime/doc/vim9.txt, src/ex_cmds.h, src/errors.h, src/evalvars.c,
+ src/proto/evalvars.pro, src/cmdexpand.c, src/eval.c,
+ src/ex_docmd.c, src/vim9compile.c, src/vim9execute.c,
+ src/vim9script.c, src/vim.h, src/ex_cmdidxs.h,
+ src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1745
+Problem: Tiny version doesn't build.
+Solution: Add dummy ex_var() function.
+Files: src/ex_docmd.c
+
+Patch 8.2.1746
+Problem: Vim9: Cannot use "fina" for "finally". (Naruhiko Nishino)
+Solution: Specifically check for "fina". (closes #7020)
+Files: src/ex_docmd.c, src/testdir/test_trycatch.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1747
+Problem: Result of expand() unexpectedly depends on 'completeslash'.
+Solution: Temporarily reset 'completeslash'. (Yasuhiro Matsumoto,
+ closes #7021)
+Files: src/evalfunc.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.1748
+Problem: Closing split window in other tab may cause a crash.
+Solution: Set tp_curwin properly. (Rob Pilling, closes #7018)
+Files: src/window.c, src/testdir/test_winbuf_close.vim
+
+Patch 8.2.1749
+Problem: Vim9: crash when closure fails in nested function.
+Solution: Handle function returns before dereferencing remaining closures.
+ (closes #7008)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1750
+Problem: Setting firstline with popup_setoptions() fails if cursorline is
+ set.
+Solution: Use apply_options(). Update the popup before applying "zz".
+ (closes #7010)
+Files: src/popupwin.c, src/proto/popupwin.pro, src/move.c,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_win_execute_cursorline.dump,
+ src/testdir/dumps/Test_popupwin_set_firstline_1.dump,
+ src/testdir/dumps/Test_popupwin_set_firstline_2.dump
+
+Patch 8.2.1751
+Problem: Using 2 where bool is expected may throw an error.
+Solution: Make this backwards compatible.
+Files: src/typval.c, src/evalfunc.c, src/testdir/test_search.vim,
+ src/testdir/test_terminal2.vim
+
+Patch 8.2.1752
+Problem: GTK GUI: cannot map alt-? with <A-?>. (Ingo Karkat)
+Solution: Adjust the characters for which the shift modifier is removed.
+ (closes #7016) Make Motif and Win32 use the same function as GTK.
+Files: src/misc2.c, src/gui_x11.c, src/gui_w32.c,
+ src/testdir/test_termcodes.vim
+
+Patch 8.2.1753
+Problem: Vim9: crash when using import at script level.
+Solution: Give a "not implemented yet" error. (closes #7026)
+Files: src/evalvars.c
+
+Patch 8.2.1754
+Problem: Completion with spell checking not tested.
+Solution: Add a test case. (Dominique Pellé, closes #7024)
+Files: src/testdir/test_spell.vim
+
+Patch 8.2.1755
+Problem: Vim9: crash when using invalid heredoc marker. (Dhiraj Mishra)
+Solution: Check for NULL list. (closes #7027) Fix comment character.
+Files: src/vim9compile.c, src/evalvars.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1756
+Problem: Vim9: :let will soon be disallowed.
+Solution: Add v:disallow_let temporarily. Fix tests.
+Files: src/vim.h, src/errors.h, src/evalvars.c, src/vim9compile.c,
+ src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1757
+Problem: Mac: default locale is lacking the encoding.
+Solution: Add ".UTF-8 to the locale. (Yee Cheng Chin, closes #7022)
+Files: src/os_mac_conv.c, src/testdir/test_environ.vim
+
+Patch 8.2.1758
+Problem: Vim9: type of unmaterialized list is wrong.
+Solution: Use list<number>.
+Files: src/vim9type.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1759
+Problem: Vim9: Some tests are still using :let.
+Solution: Change more declarations to use :var.
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1760
+Problem: Vim9: crash when end marker is missing. (Dhiraj Mishra)
+Solution: Check for end of function lines. (closes #7031)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1761
+Problem: Vim9: Some tests are still using :let.
+Solution: Change more declarations to use :var.
+Files: src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1762
+Problem: When a timer uses :stopinsert Insert mode completion isn't
+ stopped. (Stanley Chan)
+Solution: Call ins_compl_prep(ESC).
+Files: src/edit.c, src/testdir/test_ins_complete.vim,
+ src/testdir/dumps/Test_pum_stopped_by_timer.dump
+
+Patch 8.2.1763
+Problem: Vim9: cannot use "true" for popup window scrollbar option.
+Solution: use dict_get_bool(). (closes #7029)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1764
+Problem: Vim9: no error when assigning to script var with wrong type.
+Solution: Fix off-by-one error. (closes #7028)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1765
+Problem: Vim9: some tests use "var var".
+Solution: Use "var name". (closes #7032)
+Files: src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1766
+Problem: Vim9: Some tests are still using :let.
+Solution: Change the last few declarations to use :var.
+Files: src/testdir/runtest.vim, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_maparg.vim,
+ src/testdir/test_popupwin.vim, src/testdir/test_textprop.vim
+
+Patch 8.2.1767
+Problem: Vim9: test fails with python support.
+Solution: Use "let" in legacy function.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.1768
+Problem: Cannot use the help menu from a terminal window.
+Solution: Add ":tlnoremenu" commands. (Yee Cheng Chin, closes #7023)
+Files: runtime/menu.vim, src/testdir/test_gui.vim
+
+Patch 8.2.1769
+Problem: A popup filter interferes with using :normal to move the cursor in
+ a popup.
+Solution: Do not invoke the filter when ex_normal_busy is set.
+Files: runtime/doc/popup.txt, src/getchar.c, src/evalfunc.c,
+ src/ex_docmd.c, src/menu.c, src/globals.h,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_normal_cmd.dump
+
+Patch 8.2.1770
+Problem: Invalid memory use when using SpellFileMissing autocmd.
+Solution: Add test case. (Dominique Pellé, closes #7036) Fix using a window
+ that was closed.
+Files: src/spell.c, src/testdir/test_spell.vim
+
+Patch 8.2.1771
+Problem: synIDattr() cannot get the value of ctermul.
+Solution: Add the "ul" value for "what". (closes #7037)
+Files: runtime/doc/eval.txt, src/highlight.c, src/evalfunc.c,
+ src/testdir/test_highlight.vim
+
+Patch 8.2.1772
+Problem: Cannot use CTRL-W <Down> to move out of a terminal window.
+Solution: Use special_to_buf() instead of mb_char2bytes(). (closes #7045)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.1773
+Problem: Crash when calling mapset() with a list as first argument.
+Solution: Check for NULL. (closes #7040)
+Files: src/map.c, src/testdir/test_maparg.vim
+
+Patch 8.2.1774
+Problem: GTK: hang when forced to exit.
+Solution: Do not clean up "mainwin" when really_exiting is set.
+ (Zdenek Dohnal, closes #7042)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.1775
+Problem: MS-Windows: adding a long quickfix list is slow.
+Solution: Shorten the buffer name only for the first entry. (Yegappan
+ Lakshmanan, closes #7039, closes #7033)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.1776
+Problem: Filetype.vim may be loaded twice.
+Solution: Do "syntax on" after "filetype on". (Adam Stankiewicz,
+ closes #7049)
+Files: runtime/defaults.vim
+
+Patch 8.2.1777
+Problem: Vim9: some assignment tests in the wrong file.
+Solution: Move assignment tests to test_vim9_assign.
+Files: src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1778
+Problem: Vim9: returning from a partial call clears outer context, causing
+ a crash.
+Solution: Put the outer context in the stack frame. (closes #7044)
+Files: src/vim9execute.c, src/vim9.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1779
+Problem: Some debian changelog files are not recognized.
+Solution: Add */debian/changelog. (Jason Franklin)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1780
+Problem: Statusline not updated when splitting windows.
+Solution: Call status_redraw_all(). (Jason Franklin, closes #5496)
+Files: src/window.c, src/testdir/test_statusline.vim
+
+Patch 8.2.1781
+Problem: Writing to prompt buffer interferes with insert mode.
+Solution: Use win_enter() instead of just setting "curwin". (Ben Jackson,
+ closes #7035)
+Files: src/autocmd.c, src/testdir/test_prompt_buffer.vim
+
+Patch 8.2.1782
+Problem: Vim9: cannot pass boolean to mapset().
+Solution: Use get_tv_bool(). (closes #7041)
+Files: src/map.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1783 (after 8.2.1781)
+Problem: Try-catch test fails.
+Solution: Don't call win_enter(), only call entering_window().
+Files: src/autocmd.c, src/window.c, src/proto/window.pro,
+ src/testdir/runtest.vim
+
+Patch 8.2.1784
+Problem: commits are not scanned for security problems
+Solution: Enable Github code scanning. (Christian Brabandt, closes #7057)
+Files: .github/workflows/codeql-analysis.yml
+
+Patch 8.2.1785
+Problem: Compiler warning for strcpy() out of bounds. (Christian Brabandt)
+Solution: use memmove() instead.
+Files: src/dict.c
+
+Patch 8.2.1786
+Problem: Various Normal mode commands not fully tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #7059)
+Files: src/testdir/test_normal.vim, src/testdir/test_regexp_utf8.vim,
+ src/testdir/test_registers.vim, src/testdir/test_spellfile.vim,
+ src/testdir/test_tagjump.vim, src/testdir/test_visual.vim
+
+Patch 8.2.1787
+Problem: Crash with 'incsearch' and very long line.
+Solution: Check whether regprog becomes NULL. (closes #7063)
+Files: src/search.c, src/testdir/test_search.vim
+
+Patch 8.2.1788
+Problem: Vim9: still allows :let for declarations.
+Solution: Make the default for v:disallow_let one. It can still be set to
+ zero to allow for using :let.
+Files: src/evalvars.c, src/testdir/runtest.vim
+
+Patch 8.2.1789
+Problem: Vim9: crash with invalid list constant. (Dhiraj Mishra)
+Solution: Return FAIL when compiling the list fails. (closes #7066)
+Files: src/vim9compile.c, src/errors.h, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1790
+Problem: MS-Windows with Python: crash when executed from Vifm.
+Solution: Use NUL instead of CONIN. (Ken Takata, closes #7061, closes #7053)
+Files: src/if_python3.c
+
+Patch 8.2.1791
+Problem: Vim9: debugger test fails.
+Solution: Use "var" instead of "let".
+Files: src/testdir/test_debugger.vim
+
+Patch 8.2.1792
+Problem: Configure does not recognize Racket 6.1+.
+Solution: Add a check for "rktio". (closes #7062)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.1793
+Problem: Not consistently giving the "is a directory" warning.
+Solution: Adjust check for illegal file name and directory. (Yasuhiro
+ Matsumoto, closes #7067)
+Files: src/fileio.c, src/testdir/test_edit.vim
+
+Patch 8.2.1794
+Problem: No falsy Coalescing operator.
+Solution: Add the "??" operator. Fix mistake with function argument count.
+Files: runtime/doc/eval.txt, src/eval.c, src/vim9compile.c,
+ src/vim9type.c, src/testdir/test_expr.vim,
+ src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1795
+Problem: Vim9: operators && and || have a confusing result.
+Solution: Make the result a boolean.
+Files: runtime/doc/vim9.txt, src/eval.c, src/vim9compile.c,
+ src/vim9execute.c, src/vim9type.c, src/structs.h, src/vim9.h,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1796
+Problem: Vim9: invalid memory access with weird function name. (Dhiraj
+ Mishra)
+Solution: Check the name is valid. Add a test.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1797
+Problem: Vim9: some parts of the code not tested.
+Solution: Add a few tests.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.1798
+Problem: Vim9: ternary operator condition is too permissive.
+Solution: Use tv_get_bool_chk().
+Files: runtime/doc/vim9.txt, src/eval.c, src/vim9compile.c,
+ src/vim9execute.c, src/testdir/vim9.vim,
+ src/testdir/test_expr.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_cmd.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1799
+Problem: Some Normal mode commands not fully tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #7073)
+Files: src/testdir/test_gf.vim, src/testdir/test_goto.vim,
+ src/testdir/test_normal.vim, src/testdir/test_registers.vim,
+ src/testdir/test_startup.vim, src/testdir/test_tabpage.vim,
+ src/testdir/test_visual.vim
+
+Patch 8.2.1800
+Problem: Vim9: memory leak if "if" condition is invalid.
+Solution: Free ppconst earlier.
+Files: src/vim9compile.c
+
+Patch 8.2.1801
+Problem: Undo file not found when using ":args" or ":next".
+Solution: Handle like editing another file. (closes #7072)
+Files: src/ex_cmds.c, src/testdir/test_undo.vim
+
+Patch 8.2.1802
+Problem: Vim9: crash with unterminated dict. (Dhiraj Mishra)
+Solution: Return empty string instead of NULL. (closes #7084)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1803
+Problem: A few failures are not tested.
+Solution: Test a few failures. (Dominique Pellé, closes #7075)
+Files: src/testdir/test_arglist.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_json.vim, src/testdir/test_listdict.vim
+
+Patch 8.2.1804
+Problem: resolve('/') returns an empty string.
+Solution: Don't remove single slash. (closes #7074)
+Files: src/filepath.c, src/testdir/test_functions.vim
+
+Patch 8.2.1805
+Problem: Unix: terminal mode changed when using ":shell".
+Solution: Avoid calling settmode() when not needed. (issue #7079)
+Files: src/os_unix.c
+
+Patch 8.2.1806
+Problem: MS-Windows with Python: Vim freezes after import command.
+Solution: Use either "NUL" or "CONIN$" when reopening stdin. (Yasuhiro
+ Matsumoto, closes #7083)
+Files: src/if_python3.c
+
+Patch 8.2.1807
+Problem: Can use :help in a terminal popup window.
+Solution: Give an error. (closes #7088)
+Files: src/help.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1808
+Problem: No test coverage for ":spelldump!".
+Solution: Add a test. (Dominique Pellé, closes #7089)
+Files: src/testdir/test_spell.vim
+
+Patch 8.2.1809
+Problem: Mapping some keys with Ctrl does not work properly.
+Solution: For terminal, GTK and Motif handle "@", "^" and "_" codes.
+Files: src/misc2.c, src/proto/misc2.pro, src/term.c, src/gui_gtk_x11.c,
+ src/gui_x11.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.1810
+Problem: Some code in normal.c not covered by tests.
+Solution: Add normal mode tests. (Yegappan Lakshmanan, closes #7086)
+Files: src/testdir/test_charsearch.vim, src/testdir/test_normal.vim
+
+Patch 8.2.1811
+Problem: Mapping Ctrl-key does not work for '{', '}' and '|'.
+Solution: Remove the shift modifier. (closes #6457)
+Files: runtime/doc/map.txt, src/misc2.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.1812
+Problem: Vim9: nested closure throws an internal error.
+Solution: Do not skip a local variable with a partial. (closes #7065)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1813
+Problem: Vim9: can assign wrong type to script dict. (Christian J. Robinson)
+Solution: Check the type if known.
+Files: src/structs.h, src/eval.c, src/vim9script.c,
+ src/proto/vim9script.pro, src/proto/evalvars.pro,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1814 (after 8.2.1813)
+Problem: Missing change to remove "static".
+Solution: Add the change.
+Files: src/evalvars.c
+
+Patch 8.2.1815
+Problem: Vim9: memory leak when using function reference.
+Solution: Temporarily disable the test.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1816
+Problem: Vim9: another memory leak when using function reference.
+Solution: Temporarily disable the tests.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.1817
+Problem: Vim9: wrong instruction when reusing a local variable spot.
+Solution: Clear a newly allocated local variable. (closes #7080)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1818
+Problem: SE Linux: deprecation warning for security_context_t.
+Solution: Use "char *" instead. (James McCoy, closes #7093)
+Files: src/os_unix.c
+
+Patch 8.2.1819
+Problem: Vim9: Memory leak when using a closure.
+Solution: Compute the minimal refcount in the funcstack. Reenable disabled
+ tests.
+Files: src/vim9execute.c, src/proto/vim9execute.pro, src/structs.h,
+ src/eval.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1820
+Problem: Vim9: crash when error happens in timer callback.
+Solution: Check that current_exception is not NULL. (closes #7100)
+Files: src/ex_docmd.c
+
+Patch 8.2.1821
+Problem: Vim9: concatenating to a NULL list doesn't work.
+Solution: Handle a NULL list like an empty list. (closes #7064)
+Files: src/list.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1822 (after 8.2.1821)
+Problem: List test doesn't fail.
+Solution: Adjust the test for NULL list handling.
+Files: src/testdir/test_listdict.vim
+
+Patch 8.2.1823
+Problem: "gN" does not select the matched string.
+Solution: Move the cursor to the start of the match.
+Files: src/search.c, src/testdir/test_gn.vim
+
+Patch 8.2.1824
+Problem: Vim9: variables at the script level escape their scope.
+Solution: When leaving a scope remove variables declared in it.
+Files: src/structs.h, src/ex_eval.c, src/evalvars.c,
+ src/proto/evalvars.pro, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1825
+Problem: Vim9: accessing freed memory.
+Solution: Clear sv_name when the variable is deleted.
+Files: src/ex_eval.c
+
+Patch 8.2.1826
+Problem: Vim9: cannot use a {} block at script level.
+Solution: Recognize a {} block.
+Files: src/ex_docmd.c, src/ex_cmds.h, src/ex_cmdidxs.h, src/ex_eval.c,
+ src/structs.h, src/proto/ex_eval.pro, src/errors.h,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1827
+Problem: Filetype detection does not test enough file names.
+Solution: Test more file names. (Adam Stankiewicz, closes #7099)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1828
+Problem: Build failure without the +eval feature.
+Solution: Add dummies for ex_block and ex_endblock.
+Files: src/ex_docmd.c
+
+Patch 8.2.1829
+Problem: Warnings when executing Github actions.
+Solution: Use another method to set environment variables. (Ken Takata,
+ closes #7107)
+Files: .github/workflows/ci-windows.yaml
+
+Patch 8.2.1830
+Problem: MS-Windows: Python3 issue with stdin.
+Solution: Check if stdin is readable. (Ken Takata, closes #7106)
+Files: src/if_python3.c
+
+Patch 8.2.1831
+Problem: File missing from distribution.
+Solution: Add the github code analyses file.
+Files: Filelist
+
+Patch 8.2.1832
+Problem: readdirex() error is displayed as a message. (Yegappan Lakshmanan)
+Solution: Use semsg() instead of smsg().
+Files: src/fileio.c, src/testdir/test_functions.vim
+
+Patch 8.2.1833
+Problem: When reading from stdin dup() is called twice.
+Solution: Remove the dup() in main.c. (Ken Takata, closes #7110)
+Files: src/main.c
+
+Patch 8.2.1834
+Problem: PyEval_InitThreads() is deprecated in Python 3.9.
+Solution: Do not call PyEval_InitThreads in Python 3.9 and later. (Ken
+ Takata, closes #7113) Avoid warnings for functions.
+Files: src/if_python3.c, src/if_py_both.h
+
+Patch 8.2.1835
+Problem: ":help ??" finds the "!!" tag.
+Solution: Do not translate "?" into ".". (Naruhiko Nishino, closes #7114,
+ closes #7115)
+Files: src/help.c, src/testdir/test_help_tagjump.vim
+
+Patch 8.2.1836
+Problem: Autocmd test fails on pacifist systems.
+Solution: Check that /bin/kill exists. (James McCoy, closes #7117)
+ Tune the timing, make the autocmd test run faster.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.1837
+Problem: Using "gn" after "gN" does not work.
+Solution: Extend the other end of the Visual area. (closes #7109)
+Files: src/search.c, src/testdir/test_gn.vim
+
+Patch 8.2.1838
+Problem: Vim9: cannot insert a comment line in an expression.
+Solution: Skip comment lines at the script level. (closes #7111)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1839
+Problem: Vim9: memory leaks reported in assign test.
+Solution: Move the failing job_start() call to separate test files, it
+ causes false leak reports.
+Files: src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_fails.vim,
+ src/testdir/Make_all.mak
+
+Patch 8.2.1840
+Problem: Vim9: error message is not clear about compilation error.
+Solution: Say "compiling" instead of "processing".
+Files: src/vim9compile.c, src/message.c, src/globals.h,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1841
+Problem: Vim9: test for compilation error fails in normal build.
+Solution: Invoke CheckRunVimInTerminal in a separate function.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.1842
+Problem: Crash when USE_FNAME_CASE is defined and using :browse.
+Solution: Don't use read-only memory for ".". (Yegappan Lakshmanan,
+ closes #7123)
+Files: src/ex_cmds.c, src/ex_docmd.c, src/testdir/test_edit.vim
+
+Patch 8.2.1843
+Problem: Netbeans: with huge buffer number memory allocation may fail.
+Solution: Check for size overflow.
+Files: src/netbeans.c
+
+Patch 8.2.1844
+Problem: Using "q" at the more prompt doesn't stop a long message.
+Solution: Check for "got_int". (closes #7122)
+Files: src/message.c, src/testdir/test_messages.vim,
+ src/testdir/dumps/Test_quit_long_message.dump
+
+Patch 8.2.1845
+Problem: Vim9: function defined in a block can't use variables defined in
+ that block.
+Solution: First step: Make a second hashtab that holds all script variables,
+ also block-local ones, with more information.
+Files: src/structs.h, src/evalvars.c, src/ex_eval.c, src/vim9script.c,
+ src/proto/vim9script.pro, src/scriptfile.c
+
+Patch 8.2.1846
+Problem: Vim9: variables declared in a local block are not found in
+ when a function is compiled.
+Solution: Look for script variables in sn_all_vars.
+Files: src/structs.h, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/userfunc.c, src/proto/userfunc.pro, src/ex_eval.c,
+ src/vim9script.c, src/proto/vim9script.pro, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1847
+Problem: Vim9: using negative value for unsigned type.
+Solution: Use zero instead of -1.
+Files: src/vim9compile.c
+
+Patch 8.2.1848
+Problem: Crash when passing a NULL string or list to popup_settext().
+Solution: Check for NULL pointers. (closes #7132)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1849
+Problem: Vim9: garbage collection frees block-local variables.
+Solution: Mark all script variables as used.
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1850
+Problem: "vat" does not select tags correctly over line break.
+Solution: Adjust the search pattern. (Aufar Gilbran, closes #7136)
+Files: src/textobject.c, src/testdir/test_textobjects.vim
+
+Patch 8.2.1851
+Problem: Vim9: "!" followed by space incorrectly used.
+Solution: Skip over trailing spaces. (closes #7131)
+Files: src/eval.c, src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1852
+Problem: map() returning zero for NULL list is unexpected.
+Solution: Return the empty list. (closes #7133)
+Files: src/list.c, src/testdir/test_filter_map.vim,
+ src/testdir/test_blob.vim
+
+Patch 8.2.1853
+Problem: "to_f" is recognized at "topleft" modifier.
+Solution: Do not recognize modifier when "_" follows. (closes #7019)
+Files: src/ex_docmd.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1854
+Problem: Vim9: crash when throwing exception for NULL string. (Dhiraj
+ Mishra)
+Solution: Handle NULL string like empty string. (closes #7139)
+Files: src/vim9execute.c, src/errors.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1855
+Problem: Vim9: get error message when nothing is wrong.
+Solution: Check called_emsg instead of did_emsg. (closes #7143)
+Files: src/vim9compile.c, src/vim9execute.c, src/errors.h
+
+Patch 8.2.1856
+Problem: "2resize" uses size of current window. (Daniel Steinberg)
+Solution: Use size of resized window. (Yasuhiro Matsumoto, closes #7152)
+Files: src/ex_docmd.c, src/testdir/test_window_cmd.vim
+
+Patch 8.2.1857
+Problem: Vim9: using job_status() on an unused var gives an error.
+Solution: Return "fail". (closes #7158)
+Files: src/job.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1858
+Problem: Vim9: filter functions return number instead of bool.
+Solution: Return v:true instead of one. (closes #7144)
+Files: src/popupwin.c, src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1859
+Problem: Vim9: crash in unpack assignment.
+Solution: Make sure an error message is turned into an exception.
+ (closes #7159)
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1860
+Problem: Vim9: memory leak when throwing empty string.
+Solution: Free the empty string.
+Files: src/vim9execute.c
+
+Patch 8.2.1861
+Problem: Vim9: no specific error when parsing lambda fails.
+Solution: Also give syntax errors when not evaluating. (closes #7154)
+Files: src/dict.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1862
+Problem: vim9: memory leak when compiling lambda fails.
+Solution: Call clear_evalarg().
+Files: src/vim9compile.c
+
+Patch 8.2.1863
+Problem: Json code not sufficiently tested.
+Solution: Add more test cases. (Dominique Pellé, closes #7166)
+Files: src/testdir/test_json.vim
+
+Patch 8.2.1864
+Problem: Vim9: no error for wrong list type.
+Solution: Add flag to indicate a constant. (closes #7160)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1865
+Problem: Vim9: add() does not check type of argument.
+Solution: Inline the add() call. (closes #7160)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c, src/errors.h,
+ src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1866
+Problem: Vim9: appending to pushed blob gives wrong result.
+Solution: Set ga_maxlen when copying a blob.
+Files: src/blob.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1867
+Problem: Vim9: argument to add() not checked for blob.
+Solution: Add the BLOBAPPEND instruction.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c, src/errors.h,
+ src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1868
+Problem: Vim9: no error for missing space after comma in dict.
+Solution: Check for white space. (closes #6672)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1869
+Problem: Vim9: memory leak when using add().
+Solution: Free the added item.
+Files: src/vim9execute.c
+
+Patch 8.2.1870
+Problem: Vim9: no need to keep all script variables.
+Solution: Only keep script variables when a function was defined that could
+ use them. Fix freeing static string on exit.
+Files: src/vim9script.c, src/proto/vim9script.pro, src/structs.h,
+ src/ex_eval.c, src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.1871
+Problem: Using %v in 'errorformat' may fail before %Z.
+Solution: Set qf_viscol only when qf_col is set. (closes #7169)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.1872
+Problem: Matchfuzzy() does not prefer sequential matches.
+Solution: Give sequential matches a higher bonus. (Christian Brabandt,
+ closes #7140)
+Files: src/search.c, src/testdir/test_matchfuzzy.vim
+
+Patch 8.2.1873
+Problem: Vim9: missing white space when using <f-args>.
+Solution: Add spaces. (Christian J. Robinson)
+Files: src/usercmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1874
+Problem: Can't do something just before leaving Insert mode.
+Solution: Add the InsertLeavePre autocommand event. (closes #7177)
+Files: runtime/doc/autocmd.txt, src/edit.c, src/vim.h,
+ src/autocmd.c, src/testdir/test_edit.vim
+
+Patch 8.2.1875
+Problem: Warning when building GTK gui.
+Solution: Add missing function parameter.
+Files: src/gui_gtk_f.c
+
+Patch 8.2.1876
+Problem: Vim9: argument types for builtin functions are not checked at
+ compile time.
+Solution: Add an argument type checking mechanism. Implement type checks for
+ one function.
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/vim9compile.c,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_builtin.vim,
+ src/testdir/Make_all.mak
+
+Patch 8.2.1877 (after 8.2.1876)
+Problem: Test for function list fails.
+Solution: Move "obsolete" comments one line up.
+Files: src/evalfunc.c
+
+Patch 8.2.1878
+Problem: GTK: error for redefining function. (Tony Mechelynck)
+Solution: Remove "gtk_" prefix from local functions and prepend "gui_" to
+ global functions.
+Files: src/gui_gtk_f.c, src/gui_gtk_f.h, src/gui_gtk.c, src/gui_gtk_x11.c
+
+Patch 8.2.1879
+Problem: Vim9: argument types of insert() not checked when compiling.
+Solution: Add argument type checks for insert().
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/vim9compile.c,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.1880
+Problem: Vim9: Asan complains about adding zero to NULL.
+Solution: Check for argument count first.
+Files: src/vim9compile.c
+
+Patch 8.2.1881
+Problem: Cannot build with GTK3.
+Solution: Adjust form functions.
+Files: src/gui_gtk_f.c
+
+Patch 8.2.1882
+Problem: Vim9: v:disallow_let is no longer needed.
+Solution: Remove v:disallow_let.
+Files: src/evalvars.c, src/vim.h, src/vim9compile.c
+
+Patch 8.2.1883
+Problem: Compiler warnings when using Python.
+Solution: Adjust PyCFunction to also have the second argument. Use "int"
+ return type for some functions. Insert "(void *)" to get rid of
+ the remaining warnings.
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c
+
+Patch 8.2.1884
+Problem: Compiler warning for uninitialized variable. (John Marriott)
+Solution: Initialize with NULL.
+Files: src/vim9compile.c, src/evalfunc.c
+
+Patch 8.2.1885
+Problem: Filetype tests unnecessarily creates swap files.
+Solution: Disable 'swapfile'. (Ken Takata, closes #7183)
+Files: src/testdir/test_filetype.vim
+
+Patch 8.2.1886
+Problem: Using ":silent!" in a popup filter has unexpected effect.
+Solution: Use did_emsg instead of called_emsg. (closes #7178)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1887
+Problem: Github actions not optimally configured.
+Solution: Run CI on any pushed branches. Set fail-fast. (Ozaki Kiichi,
+ closes #7184)
+Files: .github/workflows/ci-windows.yaml
+
+Patch 8.2.1888
+Problem: Vim9: Getbufline(-1, 1, '$') gives an error.
+Solution: Return an empty list. (closes #7180)
+Files: src/evalbuffer.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.1889
+Problem: Vim9: erroneous error for missing white space after {}.
+Solution: Don't skip over white space after {}. (issue #7167)
+Files: src/dict.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1890
+Problem: Vim9: strange error for subtracting from a list.
+Solution: Check getting a number, not a string. (closes #7167)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1891
+Problem: Vim9: skipping over expression doesn't handle line breaks.
+Solution: Pass evalarg to skip_expr(). (closes #7157)
+Files: src/vim9compile.c, src/eval.c, src/proto/eval.pro, src/ex_docmd.c,
+ src/misc1.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1892
+Problem: Valgrind warns for using uninitialized access in tests.
+Solution: Fix condition for breaking out of loop. (Dominique Pellé,
+ closes #7187)
+Files: src/terminal.c
+
+Patch 8.2.1893
+Problem: Fuzzy matching does not support multiple words.
+Solution: Add support for matching white space separated words. (Yegappan
+ Lakshmanan, closes #7163)
+Files: runtime/doc/eval.txt, src/search.c,
+ src/testdir/test_matchfuzzy.vim
+
+Patch 8.2.1894
+Problem: Vim9: command modifiers are not supported.
+Solution: Support "silent" and "silent!".
+Files: src/structs.h, src/vim9compile.c, src/vim9.h, src/vim9execute.c,
+ src/evalvars.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1895 (after 8.2.1894)
+Problem: Vim9: silent command modifier test fails.
+Solution: Add missing changes.
+Files: src/ex_docmd.c
+
+Patch 8.2.1896
+Problem: Valgrind warns for using uninitialized memory.
+Solution: NUL terminate the SmcOpenConnection() error message. (Dominique
+ Pellé, closes #7194)
+Files: src/os_unix.c
+
+Patch 8.2.1897
+Problem: Command modifiers are saved and set inconsistently.
+Solution: Separate parsing and applying command modifiers. Save values in
+ cmdmod_T.
+Files: src/structs.h, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/ex_cmds.h, src/vim9compile.c
+
+Patch 8.2.1898
+Problem: Command modifier parsing always uses global cmdmod.
+Solution: Pass in cmdmod_T to use. Rename struct fields consistently.
+Files: src/structs.h, src/arglist.c, src/buffer.c, src/bufwrite.c,
+ src/diff.c, src/change.c, src/cmdhist.c, src/edit.c,
+ src/ex_cmds.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_getln.c,
+ src/fileio.c, src/filepath.c, src/gui.c, src/gui_gtk_x11.c,
+ src/help.c, src/if_cscope.c, src/indent.c, src/mark.c,
+ src/memline.c, src/message.c, src/option.c, src/ops.c,
+ src/os_unix.c, src/quickfix.c, src/register.c, src/scriptfile.c,
+ src/search.c, src/session.c, src/tag.c, src/terminal.c,
+ src/textformat.c, src/usercmd.c, src/vim9compile.c, src/window.c,
+ src/proto/ex_docmd.pro
+
+Patch 8.2.1899
+Problem: Crash in out-of-memory situation.
+Solution: Bail out if shell_name is NULL. (Dominique Pellé, closes #7196)
+Files: src/ex_cmds.c
+
+Patch 8.2.1900
+Problem: Vim9: command modifiers do not work.
+Solution: Make most command modifiers work.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/usercmd.c, src/proto/usercmd.pro, src/scriptfile.c,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1901
+Problem: Variable completion does not work in command line window.
+Solution: Use the "prevwin". (closes #7198)
+Files: src/evalvars.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.1902
+Problem: Default option values are changed when using :badd for an existing
+ buffer.
+Solution: When calling buflist_new() pass a zero line number. (closes #7195)
+Files: src/ex_cmds.c, src/testdir/test_buffer.vim
+
+Patch 8.2.1903 (after 8.2.1902)
+Problem: Buffer test fails with normal features.
+Solution: Use 'numberwidth' instead of 'conceallevel' in the test.
+Files: src/testdir/test_buffer.vim
+
+Patch 8.2.1904
+Problem: Still using default option values after using ":badd +1".
+Solution: Find a window where options were set. Don't set the window when
+ using ":badd".
+Files: src/buffer.c, src/ex_cmds.c, src/vim.h,
+ src/testdir/test_buffer.vim
+
+Patch 8.2.1905
+Problem: The wininfo list may contain stale entries.
+Solution: When closing a window remove any other entry where the window
+ pointer is NULL.
+Files: src/buffer.c, src/proto/buffer.pro, src/window.c
+
+Patch 8.2.1906
+Problem: Warning for signed/unsigned.
+Solution: Use size_t instead of int. (Mike Williams)
+Files: src/proto/usercmd.pro, src/usercmd.c, src/vim9execute.c
+
+Patch 8.2.1907
+Problem: Complete_info().selected may be wrong.
+Solution: Update cp_number if it was never set. (issue #6945)
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.1908
+Problem: Lua is initialized even when not used.
+Solution: Put lua_init() after check for "eap->skip". (Christian Brabandt,
+ closes #7191). Avoid compiler warnings.
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.1909
+Problem: Number of status line items is limited to 80.
+Solution: Dynamically allocate the arrays. (Rom Grk, closes #7181)
+Files: runtime/doc/options.txt, src/buffer.c, src/optionstr.c,
+ src/proto/buffer.pro, src/screen.c, src/structs.h,
+ src/testdir/test_options.vim, src/testdir/test_statusline.vim,
+ src/vim.h
+
+Patch 8.2.1910
+Problem: Reading past the end of the command line.
+Solution: Check for NUL. (closes #7204)
+Files: src/ex_docmd.c, src/testdir/test_edit.vim
+
+Patch 8.2.1911
+Problem: Tiny build fails.
+Solution: Add #ifdef.
+Files: src/insexpand.c
+
+Patch 8.2.1912
+Problem: With Python 3.9 some tests fail.
+Solution: Take into account the different error message. (James McCoy,
+ closes #7210)
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.1913
+Problem: GTK GUI: rounding for the cell height is too strict.
+Solution: Round up above 15/16 of a pixel. (closes #7203)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.1914
+Problem: Vim9: cannot put line break in expression for '=' register.
+Solution: Pass fgetline to set_expr_line(). (closes #7209)
+Files: src/register.c, src/proto/register.pro, src/ex_docmd.c,
+ src/eval.c, src/proto/eval.pro, src/misc2.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.1915
+Problem: Vim9: error for wrong number of arguments is not useful.
+Solution: Mention whatever we have for the name. (closes #7208)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1916
+Problem: Vim9: function call is aborted even when "silent!" is used.
+Solution: Use did_emsg instead of called_emsg. (closes #7213)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1917
+Problem: No test for improved Man command.
+Solution: Test that shell arguments are properly escaped.
+Files: src/testdir/test_man.vim
+
+Patch 8.2.1918
+Problem: Vim9: E1100 mentions :let.
+Solution: Mention "var". (closes #7207)
+Files: src/vim9script.c, src/errors.h
+
+Patch 8.2.1919
+Problem: Assert_fails() setting emsg_silent changes normal execution.
+Solution: Use a separate flag in_assert_fails.
+Files: src/testing.c, src/globals.h, src/buffer.c, src/change.c,
+ src/fileio.c, src/insexpand.c, src/message.c, src/misc1.c,
+ src/normal.c, src/screen.c, src/term.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim, src/testdir/gen_opt_test.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_mapping.vim,
+ src/testdir/test_popup.vim, src/testdir/test_terminal.vim
+
+Patch 8.2.1920
+Problem: Listlbr test fails when run after another test.
+Solution: Add test separately to list of test targets.
+Files: src/testdir/Make_all.mak, src/testdir/test_alot_utf8.vim
+
+Patch 8.2.1921
+Problem: Fuzzy matching does not recognize path separators.
+Solution: Add a bonus for slash and backslash. (Yegappan Lakshmanan,
+ closes #7225)
+Files: src/search.c, src/testdir/test_matchfuzzy.vim
+
+Patch 8.2.1922
+Problem: Win32: scrolling doesn't work properly when part of window is
+ off-screen.
+Solution: Fall back to GDI scrolling if part of the window is off-screen.
+ Handle multi-monitor setup better. (Ken Takata, closes #7219)
+Files: src/gui_w32.c
+
+Patch 8.2.1923
+Problem: Vim9: "filter" command modifier doesn't work.
+Solution: Check for space on char before argument. (closes #7216,
+ closes #7222)
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1924
+Problem: Vim9: crash when indexing dict with NULL key.
+Solution: Use empty string instead of NULL. (closes #7229) Make error
+ message more useful for empty string.
+Files: src/vim9execute.c, src/globals.h, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1925 (after 8.2.1924)
+Problem: List/dict test fails.
+Solution: Correct expected exception.
+File: src/testdir/test_listdict.vim
+
+Patch 8.2.1926
+Problem: Cannot use a space in 'spellfile'. (Filipe Brandenburger)
+Solution: Permit using a space. (closes #7230)
+Files: src/spell.c, src/testdir/gen_opt_test.vim
+
+Patch 8.2.1927
+Problem: Vim9: get unknown error with an error in a timer function.
+Solution: Use did_emsg instead of called_emsg. (closes #7231)
+Files: src/vim9compile.c, src/vim9execute.c
+
+Patch 8.2.1928
+Problem: Vim9: "silent!" not effective when list index is wrong.
+Solution: Ignore list index failure when emsg_silent is set. (closes #7232)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.1929
+Problem: MS-Windows: problem loading Perl 5.32.
+Solution: Define NO_THREAD_SAFE_LOCALE. (Ken Takata, closes #7234)
+Files: src/if_perl.xs
+
+Patch 8.2.1930
+Problem: Wrong input if removing shift results in special key code.
+Solution: Handle special key codes. (closes #7189)
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.1931
+Problem: Vim9: arguments of extend() not checked at compile time.
+Solution: Add argument type checking for extend().
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.1932
+Problem: Compiler warnings when building with Athena GUI.
+Solution: Fix function signatures.
+Files: src/gui_at_fs.c
+
+Patch 8.2.1933
+Problem: Cannot sort using locale ordering.
+Solution: Add a flag for :sort and sort() to use the locale. (Dominique
+ Pellé, closes #7237)
+Files: runtime/doc/change.txt, runtime/doc/eval.txt, src/ex_cmds.c,
+ src/list.c, src/testdir/test_sort.vim
+
+Patch 8.2.1934
+Problem: Vim9: command modifiers in :def function not tested.
+Solution: Add tests. Fix using modifier before filter command.
+Files: src/ex_docmd.c, src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1935 (after 8.2.1933)
+Problem: Sort test fails on Mac.
+Solution: Disable the sort test with locale on Mac.
+Files: src/testdir/test_sort.vim
+
+Patch 8.2.1936
+Problem: Session sets the local 'scrolloff' value to the global value.
+Solution: Do not let restoring the global option value change the local
+ value.
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.1937
+Problem: Vim9: test for confirm modifier fails in some situations.
+Solution: Add a short wait. Handle failure better.
+Files: src/testdir/term_util.vim, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1938
+Problem: Wiping out a terminal buffer makes some tests fail.
+Solution: Do not wipe out the terminal buffer unless wanted.
+Files: src/testdir/term_util.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_terminal3.vim
+
+Patch 8.2.1939
+Problem: Invalid memory access in Ex mode with global command.
+Solution: Make sure the cursor is on a valid line. (closes #7238)
+Files: src/move.c, src/testdir/test_ex_mode.vim
+
+Patch 8.2.1940
+Problem: Vim9: browse modifier test fails on Mac.
+Solution: Only test when the +browse feature is available.
+Files: src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1941
+Problem: Ex mode test fails on MS-Windows with GUI.
+Solution: Skip the test when using gvim.
+Files: src/testdir/test_ex_mode.vim
+
+Patch 8.2.1942
+Problem: Insufficient test coverage for the Netbeans interface.
+Solution: Add more tests. Fix an uncovered bug. (Yegappan Lakshmanan,
+ closes #7240)
+Files: runtime/doc/netbeans.txt, src/mouse.c,
+ src/testdir/test_netbeans.py, src/testdir/test_netbeans.vim,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.1943
+Problem: Vim9: wrong error message when colon is missing.
+Solution: Check for a missing colon. (issue #7239)
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1944
+Problem: Netbeans test is flaky.
+Solution: Add a short delay. (Yegappan Lakshmanan, closes #7246)
+Files: src/testdir/test_netbeans.vim
+
+Patch 8.2.1945
+Problem: Crash when passing NULL function to reduce().
+Solution: Check for NULL pointer and give an error. (Dominique Pellé,
+ closes #7243)
+Files: src/list.c, src/errors.h, src/testdir/test_listdict.vim
+
+Patch 8.2.1946
+Problem: sort() with NULL string not tested.
+Solution: Add a test. use v:collate. (Dominique Pellé, closes #7247)
+Files: src/testdir/test_sort.vim
+
+Patch 8.2.1947
+Problem: Crash when using "zj" without folds. (Sean Dewar)
+Solution: Check for at least one fold. (closes #7245)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.2.1948
+Problem: GUI: crash when handling message while closing a window. (Srinath
+ Avadhanula)
+Solution: Don't handle message while closing a window. (closes #7250)
+Files: src/window.c, src/globals.h, src/getchar.c
+
+Patch 8.2.1949
+Problem: Vim9: using extend() on null dict is silently ignored.
+Solution: Give an error message. Initialize a dict variable with an empty
+ dictionary. (closes #7251)
+Files: src/errors.h, src/list.c, src/evalvars.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.1950
+Problem: Vim9: crash when compiling function fails when getting type.
+Solution: Handle NULL type. (closes #7253)
+Files: src/vim9type.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1951 (after 8.2.1949)
+Problem: Test for list and dict fails.
+Solution: Adjust for using an empty list/dict for a null one.
+Files: src/testdir/test_listdict.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim
+
+Patch 8.2.1952
+Problem: Vim9: crash when using a NULL dict key.
+Solution: Use a NULL dict key like an empty string. (closes #7249)
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1953
+Problem: Vim9: extra "unknown" error after other error.
+Solution: Restore did_emsg count after EXEC instruction. (closes #7254)
+ Improve error message from assert_fails()
+Files: src/vim9execute.c, src/testing.c,
+ src/testdir/test_vim9_script.vim, src/testdir/test_assert.vim
+
+Patch 8.2.1954
+Problem: Vim9: not all command modifiers are tested.
+Solution: Add tests for "keep" modifiers. Fix that marks are lost even
+ though ":lockmarks" is used.
+Files: src/ex_cmds.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1955
+Problem: Vim9: not all command modifiers are tested.
+Solution: Add tests for remaining modifiers.
+Files: src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.1956
+Problem: Vim9: cannot specify argument types for lambda.
+Solution: Allow adding argument types. Check arguments when calling a
+ function reference.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/vim9compile.c,
+ src/eval.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.1957
+Problem: Diff and cursorcolumn highlighting don't mix.
+Solution: Fix condition for what attribute to use. (Christian Brabandt,
+ closes #7258, closes #7260)
+Files: src/drawline.c, src/testdir/dumps/Test_diff_cuc_01.dump,
+ src/testdir/dumps/Test_diff_cuc_02.dump,
+ src/testdir/dumps/Test_diff_cuc_03.dump,
+ src/testdir/dumps/Test_diff_cuc_04.dump,
+ src/testdir/test_diffmode.vim
+
+Patch 8.2.1958 (after 8.2.1956)
+Problem: Build failure with timers.
+Solution: Add missing change.
+Files: src/popupwin.c
+
+Patch 8.2.1959
+Problem: Crash when terminal buffer name is made empty. (Dhiraj Mishra)
+Solution: Fall back to "[No Name]". (closes #7262)
+Files: src/buffer.c, src/proto/buffer.pro, src/terminal.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.2.1960
+Problem: Warning for uninitialized variable.
+Solution: Initialize the variable.
+Files: src/evalfunc.c
+
+Patch 8.2.1961
+Problem: Various comments can be improved.
+Solution: Various comment adjustments.
+Files: src/dict.c, src/structs.h, src/time.c, src/testdir/shared.vim,
+ src/testdir/test_netbeans.vim, src/gui_motif.c
+
+Patch 8.2.1962
+Problem: Netbeans may access freed memory.
+Solution: Check the buffer pointer is still valid. Add a test. (Yegappan
+ Lakshmanan, closes #7248)
+Files: src/netbeans.c, src/testdir/test_netbeans.vim
+
+Patch 8.2.1963
+Problem: Crash when using a popup window with "latin1" encoding.
+Solution: Don't use ScreenLinesUC when enc_utf8 is false. (closes #7241)
+Files: src/screen.c, src/terminal.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1964
+Problem: Not all ConTeXt files are recognized.
+Solution: Add two patterns. (closes #7263)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.1965
+Problem: Vim9: tests fail without the channel feature.
+Solution: Check if the channel feature is present. (Dominique Pellé,
+ closes #7270)
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1966
+Problem: Popup becomes current window after closing a terminal window.
+Solution: When restoring the window after executing autocommands, check that
+ the window ID is still the same. (Naruhiko Nishino,
+ closes #7272)
+Files: src/autocmd.c, src/window.c, src/proto/window.pro, src/structs.h,
+ src/testdir/test_popupwin.vim
+
+Patch 8.2.1967
+Problem: The session file does not restore the alternate file.
+Solution: Add ":balt". Works like ":badd" and also sets the buffer as the
+ alternate file. Use it in the session file. (closes #7269,
+ closes #6714)
+Files: runtime/doc/windows.txt, src/ex_cmds.h, src/ex_cmdidxs.h,
+ src/ex_docmd.c, src/vim.h, src/ex_cmds.c, src/session.c,
+ src/testdir/test_buffer.vim
+
+Patch 8.2.1968
+Problem: Vim9: has() assumes a feature does not change dynamically.
+Solution: Check whether a feature may change dynamically. (closes #7265)
+Files: src/vim9compile.c, src/evalfunc.c, src/proto/evalfunc.pro,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.1969
+Problem: Vim9: map() may change the list or dict item type.
+Solution: Add mapnew().
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/list.c, src/proto/list.pro, src/testdir/test_filter_map.vim
+
+Patch 8.2.1970
+Problem: It is easy to make mistakes when cleaning up swap files after the
+ system crashed.
+Solution: Warn for the process still running after recovery. Do not
+ automatically delete a swap file created on another system.
+ (David Fries, closes #7273)
+Files: src/memline.c, src/testdir/test_swap.vim
+
+Patch 8.2.1971
+Problem: Memory leak when map() fails.
+Solution: Clear the typval.
+Files: src/list.c
+
+Patch 8.2.1972
+Problem: Crash when recreating nested fold.
+Solution: Check for empty growarray. (closes #7278)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.2.1973
+Problem: Finding a patch number can be a bit slow.
+Solution: Use binary search. (closes #7279)
+Files: src/version.c
+
+Patch 8.2.1974
+Problem: Vim9: test for has('gui_running') fails with VIMDLL.
+Solution: Adjust the #ifdef. (Ken Takata, closes #7276)
+Files: src/evalfunc.c
+
+Patch 8.2.1975
+Problem: Win32: memory leak when encoding conversion fails.
+Solution: Free the allocated memory. (Ken Takata, closes #7277)
+Files: src/os_win32.c
+
+Patch 8.2.1976
+Problem: Cannot backspace in prompt buffer after using cursor-left. (Maxim
+ Kim)
+Solution: Ignore "arrow_used" in a prompt buffer. (closes #7281)
+Files: src/edit.c, src/testdir/test_prompt_buffer.vim
+
+Patch 8.2.1977
+Problem: Vim9: error for using a string in a condition is confusing.
+Solution: Give a more specific error. Also adjust the compile time type
+ checking for || and &&.
+Files: src/vim9compile.c, src/vim9execute.c, src/proto/vim9execute.pro,
+ src/typval.c, src/errors.h, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1978
+Problem: Making a mapping work in all modes is complicated.
+Solution: Add the <Cmd> special key. (Yegappan Lakshmanan, closes #7282,
+ closes 4784, based on patch by Bjorn Linse)
+Files: runtime/doc/autocmd.txt, runtime/doc/eval.txt,
+ runtime/doc/map.txt, src/edit.c, src/errors.h, src/ex_docmd.c,
+ src/ex_getln.c, src/getchar.c, src/insexpand.c, src/keymap.h,
+ src/map.c, src/misc2.c, src/normal.c, src/ops.c,
+ src/proto/getchar.pro, src/screen.c, src/terminal.c,
+ src/testdir/test_mapping.vim
+
+Patch 8.2.1979
+Problem: "term_opencmd" option of term_start() is truncated. (Sergey
+ Vlasov)
+Solution: Allocate the buffer to hold the command. (closes #7284)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.1980
+Problem: Vim9: some tests are not done at the script level.
+Solution: Use CheckDefAndScriptSuccess() in more places. Fix uncovered
+ problems.
+Files: src/eval.c, src/list.c, src/scriptfile.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1981
+Problem: MinGW: parallel compilation might fail.
+Solution: Add dependencies on $(OUTDIR). (Masamichi Abe, closes #7287)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.2.1982
+Problem: Quickfix window not updated when adding invalid entries.
+Solution: Update the quickfix buffer properly. (Yegappan Lakshmanan, closes
+ #7291, closes #7271)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.1983
+Problem: ml_get error when using <Cmd> to open a terminal.
+Solution: If the window changed reset the incsearch state. (closes #7289)
+Files: src/ex_getln.c, src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_from_cmd.dump
+
+Patch 8.2.1984
+Problem: Cannot use :vimgrep in omni completion, causing C completion to
+ fail.
+Solution: Add the EX_LOCK_OK flag to :vimgrep. (closes #7292)
+Files: src/ex_cmds.h, src/testdir/test_quickfix.vim
+
+Patch 8.2.1985
+Problem: Crash when closing terminal popup with <Cmd> mapping.
+Solution: Check b_term is not NULL. (closes #7294)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.1986
+Problem: Expression test is flaky on Appveyor.
+Solution: Temporarily disable the test in MS-Windows.
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.1987
+Problem: MS-Windows: Win32.mak is no longer needed.
+Solution: Do not include Win32.mak. (Jason McHugh, closes #7290)
+Files: src/Make_mvc.mak, src/INSTALLpc.txt
+
+Patch 8.2.1988
+Problem: Still in Insert mode when opening terminal popup with a <Cmd>
+ mapping in Insert mode.
+Solution: Exit Insert mode. (closes #7295)
+Files: src/edit.c, src/testdir/test_terminal.vim
+
+Patch 8.2.1989
+Problem: Info popup triggers WinEnter and WinLeave autocommands.
+Solution: Suppress autocommands for the info popup. (closes #7296)
+Files: src/popupmenu.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.1990
+Problem: Cursor position wrong in terminal popup with finished job.
+Solution: Only add the top and left offset when not done already.
+ (closes #7298)
+Files: src/popupwin.c, src/structs.h, src/drawline.c, src/move.c,
+ src/terminal.c, src/testdir/dumps/Test_terminal_popup_m1.dump
+
+Patch 8.2.1991
+Problem: Coverity warns for not using the ga_grow() return value.
+Solution: Bail out if ga_grow() fails. (Yegappan Lakshmanan, closes #7303)
+Files: src/getchar.c
+
+Patch 8.2.1992
+Problem: Build fails with small features.
+Solution: Add #ifdef.
+Files: src/move.c
+
+Patch 8.2.1993
+Problem: Occasional failure of the netbeans test.
+Solution: Add "silent!". (Yegappan Lakshmanan, closes #7304)
+Files: src/testdir/test_netbeans.vim
+
+Patch 8.2.1994 (after 8.2.1981)
+Problem: MS-Windows: MinGW always does a full build.
+Solution: Only check if $OUTDIR exists. (Masamichi Abe, closes #7311)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.2.1995
+Problem: The popup menu can cause too much redrawing.
+Solution: Reduce the length of the displayed text. (Yasuhiro Matsumoto,
+ closes #7306)
+Files: src/popupmenu.c
+
+Patch 8.2.1996
+Problem: Vim9: invalid error for argument of extend().
+Solution: Check if the type could match. (closes #7299)
+Files: src/evalfunc.c, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/vim9type.c, src/proto/vim9type.pro,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.1997
+Problem: Window changes when using bufload() while in a terminal popup.
+Solution: When searching for a window by ID also find a popup window.
+ (closes #7307)
+Files: src/window.c, src/testdir/test_terminal.vim
+
+Patch 8.2.1998
+Problem: Terminal Cmd test sometimes fails to close popup.
+Solution: Add "term_finish" option.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.1999
+Problem: Terminal popup test sometimes fails.
+Solution: Wait for the popup to close.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.2000
+Problem: Vim9: dict.key assignment not implemented yet.
+Solution: Implement dict.key assignment. (closes #7312)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2001
+Problem: Vim9: :def function does not apply 'maxfuncdepth'.
+Solution: Use 'maxfuncdepth'. (issue #7313)
+Files: src/vim9execute.c, src/userfunc.c, src/proto/userfunc.pro,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2002
+Problem: Vim9: lambda argument shadowed by function name.
+Solution: Let function name be shadowed by lambda argument. (closes #7313)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2003
+Problem: Build error with +conceal but without +popupwin.
+Solution: Add #ifdef. (Tom Ryder, closes #7316)
+Files: src/drawline.c
+
+Patch 8.2.2004 (after 8.2.2002)
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize "ufunc". (John Marriott)
+Files: src/vim9compile.c
+
+Patch 8.2.2005
+Problem: Redoing a mapping with <Cmd> doesn't work properly.
+Solution: Fill the redo buffer. Use "<SNR>" instead of a key code.
+ (closes #7282)
+Files: src/ops.c, src/getchar.c, src/testdir/test_mapping.vim
+
+Patch 8.2.2006
+Problem: .pbtxt files are not recognized.
+Solution: Recognize .pbtxt as protobuf text buffers. (closes #7326)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2007
+Problem: Test for insert mode in popup is not reliable.
+Solution: Wait for the popup to disappear. (Ozaki Kiichi, closes #7321)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.2008
+Problem: MS-Windows GUI: handling channel messages lags.
+Solution: Reduce the wait time from 100 to 10 msec. (closes #7097)
+Files: src/gui_w32.c
+
+Patch 8.2.2009
+Problem: MS-Windows: setting $LANG in gvimext only causes problems.
+Solution: Do not set $LANG. (Ken Takata, closes #7325)
+Files: src/GvimExt/gvimext.cpp
+
+Patch 8.2.2010
+Problem: Vim9: compiling fails for unreachable return statement.
+Solution: Fix it. (closes #7319)
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2011
+Problem: "syn sync" reports a very large number.
+Solution: Use "at the first line".
+Files: src/syntax.c, src/testdir/test_syntax.vim
+
+Patch 8.2.2012
+Problem: Vim9: confusing error message when using bool wrongly.
+Solution: Mention "Bool" instead of "Special". (closes #7323)
+Files: src/typval.c, src/errors.h, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2013
+Problem: Vim9: not skipping white space after unary minus.
+Solution: Skip whitespace. (closes #7324)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2014
+Problem: Using CTRL-O in a prompt buffer moves cursor to start of the line.
+Solution: Do not move the cursor when restarting edit. (closes #7330)
+Files: src/job.c, src/testdir/test_prompt_buffer.vim
+
+Patch 8.2.2015
+Problem: Vim9: literal dict #{} is not like any other language.
+Solution: Support the JavaScript syntax.
+Files: runtime/doc/vim9.txt, src/vim9compile.c,
+ src/proto/vim9compile.pro, src/errors.h,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2016
+Problem: Swap file test is a little flaky.
+Solution: Don't set a byte to a fixed value, increment it.
+Files: src/testdir/test_swap.vim
+
+Patch 8.2.2017 (after 8.2.2015)
+Problem: Missing part of the dict change.
+Solution: Also change the script level dict.
+Files: src/dict.c
+
+Patch 8.2.2018
+Problem: Vim9: script variable not found from lambda.
+Solution: In a lambda also check the script hashtab for a variable without a
+ scope. (closes #7329)
+Files: src/evalvars.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2019 (after 8.2.2016)
+Problem: Swap file test fails on MS-Windows.
+Solution: Add four to the process ID. (Ken Takata, closes #7333)
+Files: src/testdir/test_swap.vim
+
+Patch 8.2.2020
+Problem: Some compilers do not like the "namespace" argument.
+Solution: Rename to "use_namespace". (closes #7332)
+Files: src/vim9compile.c, src/proto/vim9compile.pro
+
+Patch 8.2.2021
+Problem: Vim9: get E1099 when autocommand resets did_emsg.
+Solution: Add did_emsg_cumul. (closes #7336)
+Files: src/globals.h, src/ex_docmd.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2022
+Problem: Vim9: star command recognized erroneously.
+Solution: Give an error for missing colon. (issue #7335)
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2023
+Problem: Vim: memory leak when :execute fails.
+Solution: Clear the growarray.
+Files: src/vim9execute.c
+
+Patch 8.2.2024
+Problem: Flicker when redrawing a popup with a title and border.
+Solution: Do not redraw the border where the title is displayed. (Naruhiko
+ Nishino, closes #7334)
+Files: src/popupwin.c
+
+Patch 8.2.2025
+Problem: Amiga: Not all colors are used on OS4.
+Solution: Adjust the #ifdef to include __amigaos4__. (Ola Söder,
+ closes #7328)
+Files: src/term.c
+
+Patch 8.2.2026
+Problem: Coverity warns for possibly using not NUL terminated string.
+Solution: Put a NUL in b0_hname just in case.
+Files: src/memline.c
+
+Patch 8.2.2027
+Problem: Coverity warns for uninitialized field.
+Solution: Set "v_lock".
+Files: src/list.c
+
+Patch 8.2.2028
+Problem: Coverity warns for using an uninitialized variable.
+Solution: Initialize to NULL.
+Files: src/eval.c
+
+Patch 8.2.2029
+Problem: Coverity warns for not checking return value.
+Solution: Check that u_save_cursor() returns OK.
+Files: src/ops.c
+
+Patch 8.2.2030
+Problem: Some tests fail on Mac.
+Solution: Avoid Mac test failures. Add additional test for wildmenu.
+ (Yegappan Lakshmanan, closes #7341)
+Files: src/testdir/runtest.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_options.vim, src/testdir/test_popupwin.vim
+
+Patch 8.2.2031
+Problem: Some tests fail when run under valgrind.
+Solution: Avoid timing problems.
+Files: src/testdir/test_vim9_func.vim, src/testdir/test_channel.vim,
+ src/testdir/test_clientserver.vim, src/testdir/test_debugger.vim,
+ src/testdir/test_quotestar.vim
+
+Patch 8.2.2032
+Problem: Cabalconfig and cabalproject filetypes not recognized.
+Solution: Detect more cabal files. (Marcin Szamotulski, closes #7339)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2033
+Problem: Vim9: :def without argument gives compilation error.
+Solution: Add the DEF instruction. (closes #7344)
+Files: src/ex_docmd.c, src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/userfunc.c, src/proto/userfunc.pro,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2034
+Problem: Vim9: list unpack in for statement not compiled yet.
+Solution: Compile list unpack. (closes #7345)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c, src/errors.h,
+ src/eval.c, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2035
+Problem: MS-Windows: some tests may fail.
+Solution: Avoid test failures. (Yegappan Lakshmanan, closes #7346)
+Files: src/testdir/test_channel.vim, src/testdir/test_ex_mode.vim,
+ src/testdir/test_functions.vim
+
+Patch 8.2.2036
+Problem: Current buffer is messed up if creating a new buffer for the
+ quickfix window fails.
+Solution: Check that creating the buffer succeeds. (closes #7352)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim,
+ src/testdir/dumps/Test_quickfix_window_fails.dump
+
+Patch 8.2.2037
+Problem: Compiler test depends on list of compiler plugins.
+Solution: Compare with the actual list of compiler plugins.
+Files: src/testdir/test_compiler.vim
+
+Patch 8.2.2038
+Problem: Compiler test fails on MS-Windows.
+Solution: Sort the found compiler plugin names.
+Files: src/testdir/test_compiler.vim
+
+Patch 8.2.2039
+Problem: Viminfo is not written when creating a new file.
+Solution: Set "b_marks_read" in the new buffer. (Christian Brabandt,
+ closes #7350)
+Files: src/bufwrite.c, src/testdir/test_viminfo.vim
+
+Patch 8.2.2040
+Problem: Terminal buffer disappears even when 'bufhidden' is "hide".
+ (Sergey Vlasov)
+Solution: Check 'bufhidden' when a terminal buffer becomes hidden.
+ (closes #7358)
+Files: src/buffer.c, src/testdir/test_terminal.vim
+
+Patch 8.2.2041
+Problem: Haskell filetype not optimally recognized.
+Solution: Recognize all *.hsc files as Haskell. (Marcin Szamotulski,
+ closes #7354)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2042
+Problem: Build failure with +profile but without +reltime.
+Solution: Adjust #ifdef. (Christian Brabandt, closes #7361)
+Files: src/syntax.c
+
+Patch 8.2.2043
+Problem: GTK3: white border around text stands out.
+Solution: Use current theme color. (closes #7357, issue #349)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.2044
+Problem: MS-Windows: swap file test sometimes fails.
+Solution: Use a more reliable way to change the process ID. When "timeout"
+ fails use "ping" to wait up to ten minutes. (Ken Takata,
+ closes #7365)
+Files: .github/workflows/ci-windows.yaml, src/testdir/test_swap.vim
+
+Patch 8.2.2045
+Problem: Highlighting a character too much with incsearch.
+Solution: Check "search_match_endcol". (Christian Brabandt, closes #7360)
+Files: src/drawline.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_incsearch_newline1.dump,
+ src/testdir/dumps/Test_incsearch_newline2.dump,
+ src/testdir/dumps/Test_incsearch_newline3.dump,
+ src/testdir/dumps/Test_incsearch_newline4.dump,
+ src/testdir/dumps/Test_incsearch_newline5.dump
+
+Patch 8.2.2046
+Problem: Some test failures don't give a clear error.
+Solution: Use assert_match() and assert_fails() instead of assert_true().
+ (Ken Takata, closes #7368)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_backspace_opt.vim
+
+Patch 8.2.2047
+Problem: Amiga: FEAT_ARP defined when it should not.
+Solution: Adjust #ifdef. (Ola Söder, closes #7370)
+Files: src/feature.h
+
+Patch 8.2.2048
+Problem: Amiga: obsolete code.
+Solution: Remove the unused lines. (Ola Söder, closes #7373)
+Files: src/gui.c
+
+Patch 8.2.2049
+Problem: Amiga: obsolete function.
+Solution: Remove the function. (Ola Söder, closes #7374)
+Files: src/memfile.c
+
+Patch 8.2.2050
+Problem: Search test contains unneeded sleeps.
+Solution: Rename the function, remove sleeps. (Christian Brabandt,
+ closes #7369)
+Files: src/testdir/test_search.vim
+
+Patch 8.2.2051
+Problem: Vim9: crash when aborting a user function call.
+Solution: Do not use the return value when aborting. (closes #7372)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2052
+Problem: Vim9: "edit +4 fname" gives an error. (Naruhiko Nishino)
+Solution: Allow using a range in the +cmd argument. (closes #7364)
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/vim.h, src/ex_cmds.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2053
+Problem: Vim9: lambda doesn't accept argument types.
+Solution: Optionally accept argument types at the script level.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2054
+Problem: Amiga: FEAT_ARP defined when it should not.
+Solution: Adjust "||" to "&&" in #ifdef. (Ola Söder, closes #7375)
+Files: src/feature.h
+
+Patch 8.2.2055
+Problem: MS-Windows: two Vim instances may use the same temp file.
+Solution: Use the process ID for the temp name. (Ken Takata, closes #7378)
+Files: src/fileio.c
+
+Patch 8.2.2056
+Problem: Configure fails when building with the
+ "implicit-function-declaration" error enabled, specifically on Mac.
+Solution: Declear the functions like in the source code. (suggestion by
+ Clemens Lang, closes #7380)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2057
+Problem: Getting the selection may trigger TextYankPost autocmd.
+Solution: Only trigger the autocommand when yanking in Vim, not for getting
+ the selection. (closes #7367)
+Files: src/clipboard.c, src/normal.c, src/register.c,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.2058
+Problem: Using mkview/loadview changes the jumplist.
+Solution: Use ":keepjumps". Don't let ":badd" or ":balt" change the
+ jumplist. (closes #7371)
+Files: src/session.c, src/ex_docmd.c, src/testdir/test_mksession.vim
+
+Patch 8.2.2059
+Problem: Amiga: can't find plugins.
+Solution: Do not use "**" in the pattern. (Ola Söder, closes #7384)
+Files: src/main.c
+
+Patch 8.2.2060
+Problem: Check for features implemented with "if".
+Solution: Use the Check commands. (Ken Takata, closes #7383)
+Files: src/testdir/test_autocmd.vim, src/testdir/test_compiler.vim,
+ src/testdir/test_delete.vim, src/testdir/test_diffmode.vim,
+ src/testdir/test_expr.vim, src/testdir/test_fold.vim
+
+Patch 8.2.2061
+Problem: Vim9: E1030 error when using empty string for term_sendkeys().
+Solution: Don't check for an invalid type unless the terminal can't be
+ found. (closes #7382)
+Files: src/terminal.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.2062
+Problem: <Cmd> does not handle CTRL-V.
+Solution: Call get_literal() after encountering CTRL-V. (closes #7387)
+Files: src/getchar.c, src/testdir/test_mapping.vim
+
+Patch 8.2.2063
+Problem: Vim9: only one level of indexing supported.
+Solution: Handle more than one index in an assignment.
+Files: src/vim9compile.c, src/errors.h, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2064
+Problem: terminal: cursor is on while redrawing, causing flicker.
+Solution: Switch the cursor off while redrawing. Always add the top and
+ left offset to the cursor position when not done already.
+ (closes #5943)
+Files: src/terminal.c, src/popupwin.c
+
+Patch 8.2.2065
+Problem: Using map() and filter() on a range() is inefficient.
+Solution: Do not materialize the range. (closes #7388)
+Files: src/list.c, src/testdir/test_functions.vim
+
+Patch 8.2.2066
+Problem: Vim9: assignment with += doesn't work.
+Solution: Do not see the "+" as an addition operator.
+Files: src/eval.c, src/ex_docmd.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2067 (after 8.2.2064)
+Problem: Cursor position in popup terminal is wrong.
+Solution: Don't check the flags.
+Files: src/terminal.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.2068
+Problem: Transparent syntax item uses start/end of containing region.
+Solution: Do not change the startpos and endpos of a transparent region to
+ that of its containing region. (Adrian Ghizaru, closes #7349,
+ closes #7391)
+Files: src/syntax.c, src/testdir/test_syntax.vim
+
+Patch 8.2.2069
+Problem: The quickfix window is not updated after setqflist().
+Solution: Update the quickfix buffer. (Yegappan Lakshmanan, closes #7390,
+ closes #7385)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.2070
+Problem: Can't get the exit value in VimLeave or VimLeavePre autocommands.
+Solution: Add v:exiting like in Neovim. (Yegappan Lakshmanan, closes #7395)
+Files: runtime/doc/autocmd.txt, runtime/doc/eval.txt, src/evalvars.c,
+ src/main.c, src/testdir/test_exit.vim, src/vim.h
+
+Patch 8.2.2071
+Problem: Vim9: list assign doesn't accept an empty remainder list.
+Solution: Recognize list assignment with ";".
+Files: src/ex_docmd.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2072
+Problem: Vim9: list assign not well tested.
+Solution: Test with different destinations. Fix white space error.
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2073
+Problem: Vim9: for with unpack only works for local variables.
+Solution: Recognize different destinations.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2074
+Problem: Vim9: using :normal from Vim9 script can't handle range.
+Solution: Execute a :normal command in legacy script context. (closes #7401)
+Files: src/structs.h, src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2075
+Problem: Error for const argument to mapnew().
+Solution: Don't give an error. (closes #7400)
+Files: src/list.c, src/testdir/test_filter_map.vim
+
+Patch 8.2.2076
+Problem: MS-Windows console: sometimes drops typed characters.
+Solution: Do not wait longer than 10 msec for input. (issue #7164)
+Files: src/os_win32.c
+
+Patch 8.2.2077
+Problem: Build failure with small features.
+Solution: Add #ifdef.
+Files: src/structs.h, src/ex_docmd.c
+
+Patch 8.2.2078
+Problem: Illegal memory access when using :print on invalid text. (Dhiraj
+ Mishra)
+Solution: Check for more composing characters than supported. (closes #7399)
+Files: src/message.c, src/testdir/test_utf8.vim
+
+Patch 8.2.2079
+Problem: Vim9: cannot put a linebreak before or after "in" of ":for".
+Solution: Skip over linebreak.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2080
+Problem: Vim9: no proper error message for using s:var in for loop.
+Solution: Give a specific error.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2081
+Problem: Vim9: cannot handle a linebreak after "=" in assignment.
+Solution: Skip over linebreak. (closes #7407)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2082
+Problem: Vim9: can still use the deprecated #{} dict syntax.
+Solution: Remove support for #{} in Vim9 script. (closes #7406, closes #7405)
+Files: src/dict.c, src/proto/dict.pro, src/eval.c, src/vim9compile.c,
+ src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_textprop.vim
+
+Patch 8.2.2083
+Problem: Vim9: crash when using ":silent!" and getting member fails.
+Solution: Jump to on_fatal_error. (closes #7412)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2084
+Problem: CTRL-V U doesn't work to enter a Unicode character when
+ modifyOtherKeys is effective. (Ken Takata)
+Solution: Add a flag to get_literal() for the shift key. (closes #7413)
+Files: src/edit.c, src/proto/edit.pro, src/ex_getln.c, src/getchar.c,
+ src/normal.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.2085
+Problem: Qt translation file is recognized as typescript.
+Solution: Check the first line for "<?xml". (closes #7418)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2086
+Problem: Libvterm tests are only run on Linux.
+Solution: Use static libraries. (Ozaki Kiichi, closes #7419)
+Files: .travis.yml, src/Makefile, src/libvterm/Makefile,
+ src/libvterm/t/run-test.pl
+
+Patch 8.2.2087
+Problem: Vim9: memory leak when statement is truncated.
+Solution: Increment the number of local variables.
+Files: src/vim9compile.c
+
+Patch 8.2.2088
+Problem: Vim9: script test sometimes fails.
+Solution: Unlet variables.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2089
+Problem: Libvterm test fails to build on Mac.
+Solution: Adjust configure to remove a space between -L and the path that
+ follows.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2090
+Problem: Vim9: dict does not accept a key in quotes.
+Solution: Recognize a key in single or double quotes.
+Files: runtime/doc/vim9.txt, src/dict.c, src/proto/dict.pro,
+ src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2091
+Problem: MS-Windows: build warnings.
+Solution: Add a #pragma to suppress the deprecation warning. (Ken Takata)
+ Avoid using a non-ASCII character. (closes #7421)
+Files: src/message.c, src/os_win32.c
+
+Patch 8.2.2092
+Problem: Vim9: unpredictable errors for script tests.
+Solution: Use a different script file name for each run.
+Files: src/testdir/vim9.vim, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2093
+Problem: Vim9: script test sometimes fails.
+Solution: Do not find a script variable by its typval if the name was
+ cleared.
+Files: src/vim9script.c
+
+Patch 8.2.2094
+Problem: When an expression fails getting the next command may be wrong.
+Solution: Do not check for a next command after :eval fails. (closes #7415)
+Files: src/eval.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2095
+Problem: Vim9: crash when failed dict member is followed by concatenation.
+Solution: Remove the dict from the stack. (closes #7416)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2096
+Problem: Vim9: command modifiers not restored after assignment.
+Solution: Jump to nextline instead of using continue.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2097
+Problem: Vim9: using :silent! when calling a function prevents aborting
+ that function.
+Solution: Add emsg_silent_def and did_emsg_def.
+Files: src/globals.h, src/message.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2098
+Problem: Vim9: function argument of sort() and map() not tested.
+Solution: Add a couple of tests.
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2099
+Problem: Vim9: some checks are not tested.
+Solution: Add a few more tests. Give better error messages.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2100
+Problem: Insufficient testing for function range and dict.
+Solution: Add a few tests. (Dominique Pellé, closes #7428)
+Files: src/testdir/test_functions.vim, src/testdir/test_lambda.vim,
+ src/testdir/test_signals.vim, src/testdir/test_user_func.vim
+
+Patch 8.2.2101
+Problem: Vim9: memory leak when literal dict has an error and when an
+ expression is not complete.
+Solution: Clear the typval and the growarray.
+Files: src/dict.c, src/vim9compile.c
+
+Patch 8.2.2102
+Problem: Vim9: not all error messages tested.
+Solution: Add a few test cases.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.2103
+Problem: Vim9: unreachable code.
+Solution: Remove the code to prepend s: to the variable name
+Files: src/vim9compile.c
+
+Patch 8.2.2104
+Problem: Build problem with Ruby 2.7.
+Solution: Adjust function declarations. (Ozaki Kiichi, closes #7430)
+Files: src/configure.ac, src/auto/configure, src/if_ruby.c
+
+Patch 8.2.2105
+Problem: Sound test is a bit flaky.
+Solution: Use WaitForAssert(). (Dominique Pellé, closes #7429)
+Files: src/testdir/test_sound.vim
+
+Patch 8.2.2106
+Problem: TOML files are not recognized.
+Solution: Match *.toml. (issue #7432)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2107
+Problem: Vim9: some errors not tested.
+Solution: Add tests. Fix getting the right error.
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2108
+Problem: Vim9: no test to check for :let error.
+Solution: Add a test. Rename tests from _let_ to _var_.
+Files: src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2109
+Problem: "vim -" does not work well when modifyOtherKeys is enabled and a
+ shell command is executed on startup.
+Solution: Only change modifyOtherKeys when executing a shell command in raw
+ mode.
+Files: src/os_unix.c
+
+Patch 8.2.2110
+Problem: Cannot use ":shell" when reading from stdin. (Gary Johnson)
+Solution: Revert patch 8.2.1833.
+Files: src/main.c
+
+Patch 8.2.2111
+Problem: GTK: Menu background is the same color as the main window.
+Solution: Fix white space around the text in another way. (closes #7437,
+ closes #7427)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.2112
+Problem: Running tests may leave some files behind.
+Solution: Delete the right files. Fix a few typos. (Dominique Pellé,
+ closes #7436)
+Files: src/testdir/test_filetype.vim, src/testdir/test_messages.vim,
+ src/testdir/test_mksession.vim
+
+Patch 8.2.2113
+Problem: MS-Windows GUI: crash after using ":set guifont=" four times.
+Solution: Check for NULL pointer. (Ken Takata, closes #7434)
+Files: src/gui_dwrite.cpp, src/testdir/test_gui.vim
+
+Patch 8.2.2114
+Problem: Vim9: unreachable code in assignment.
+Solution: Remove impossible condition and code.
+Files: src/vim9compile.c
+
+Patch 8.2.2115
+Problem: Vim9: some errors not tested for; dead code.
+Solution: Add a test. Remove dead code.
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2116
+Problem: MS-Windows GUI: test for 'guifont' is incomplete.
+Solution: Set 'renderoptions'. (Christian Brabandt)
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.2117
+Problem: Some functions use any value as a string.
+Solution: Check that the value is a non-empty string.
+Files: src/typval.c, src/proto/typval.pro, src/mbyte.c, src/filepath.c,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2118
+Problem: Dead code in the job support. (Dominique Pellé)
+Solution: Define USE_ARGV before checking for it.
+Files: src/job.c
+
+Patch 8.2.2119
+Problem: GTK3: status line background color is wrong.
+Solution: Don't change the code for earlier GTK3 versions. (closes #7444)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.2120
+Problem: Not all Perl functionality is tested.
+Solution: Add a few more test cases. (Dominique Pellé, closes #7440)
+Files: src/testdir/test_perl.vim
+
+Patch 8.2.2121
+Problem: Internal error when using \ze before \zs in a pattern.
+Solution: Check the end is never before the start. (closes #7442)
+Files: src/regexp_bt.c, src/regexp_nfa.c,
+ src/testdir/test_regexp_latin.vim
+
+Patch 8.2.2122
+Problem: Vim9: crash when sourcing vim9script early.
+Solution: Use set_option_value() instead of setting p_cpo directly.
+ (closes #7441)
+Files: src/scriptfile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2123
+Problem: After using a complete popup the buffer is listed. (Boris
+ Staletic)
+Solution: Make the buffer unlisted.
+Files: src/popupmenu.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.2124
+Problem: Vim9: a range cannot be computed at runtime.
+Solution: Add the ISN_RANGE instruction.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2125 (after 8.2.2122)
+Problem: Vim9: leaking memory.
+Solution: Free the saved 'cpo' value.
+Files: src/scriptfile.c
+
+Patch 8.2.2126
+Problem: Ruby: missing function prototype.
+Solution: Add the prototype.
+Files: src/if_ruby.c
+
+Patch 8.2.2127
+Problem: Vim9: executing user command defined in Vim9 script not tested.
+Solution: Add a test.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2128
+Problem: There is no way to do something on CTRL-Z.
+Solution: Add VimSuspend and VimResume autocommand events. (closes #7450)
+Files: runtime/doc/autocmd.txt, src/autocmd.c, src/ex_docmd.c,
+ src/normal.c, src/testdir/test_suspend.vim, src/vim.h
+
+Patch 8.2.2129
+Problem: MS-Windows: Checking if a file name is absolute is slow.
+Solution: Do not use mch_FullName(). (closes #7033)
+Files: src/os_mswin.c
+
+Patch 8.2.2130
+Problem: Insert mode completion messages end up in message history.
+Solution: Set msg_hist_off. (closes #7452)
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.2131
+Problem: Vim9: crash when lambda uses same var as assignment.
+Solution: Do not let lookup_local change lv_from_outer, make a copy.
+ (closes #7461)
+Files: src/vim9compile.c, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/evalvars.c, src/proto/evalvars.pro,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2132
+Problem: Padding not drawn properly for popup window with title.
+Solution: Draw the padding below the title. (closes #7460)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_longtitle_3.dump,
+ src/testdir/dumps/Test_popupwin_longtitle_4.dump
+
+Patch 8.2.2133
+Problem: Vim9: checking for a non-empty string is too strict.
+Solution: Check for any string. (closes #7447)
+Files: src/typval.c, src/proto/typval.pro, src/errors.h, src/filepath.c,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2134
+Problem: Vim9: get E1099 when autocmd triggered in builtin function.
+Solution: Check that did_emsg increased instead of checking that it changed.
+ (closes #7448)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2135
+Problem: Vim9: #{ still seen as start of dict in some places.
+Solution: Remove check for { after #. (closes #7456)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2136
+Problem: Vim9: Using uninitialized variable.
+Solution: Initialize "len" to zero. Clean up fnamemodify().
+Files: src/filepath.c
+
+Patch 8.2.2137
+Problem: Vim9: :echo and :execute give error for empty argument.
+Solution: Ignore an empty argument. (closes #7468)
+Files: src/vim9compile.c, src/errors.h, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2138
+Problem: Vim9: "exit_cb" causes Vim to exit.
+Solution: Require white space after a command in Vim9 script. (closes #7467)
+ Also fix that Vim9 style heredoc was not always recognized.
+Files: src/ex_cmds.h, src/ex_docmd.c, src/errors.h, src/userfunc.c,
+ src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_let.vim
+
+Patch 8.2.2139
+Problem: Vim9: unreachable code in assignment.
+Solution: Don't check "new_local" when "has_index" is set. Add test for
+ wrong type of list index.
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2140
+Problem: Build failure with tiny features.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.2.2141
+Problem: A user command with try/catch may not catch an expression error.
+Solution: When an expression fails check for following "|". (closes #7469)
+Files: src/eval.c, src/testdir/test_trycatch.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.2142
+Problem: Memory leak when heredoc is not terminated.
+Solution: Free heredoc_trimmed.
+Files: src/userfunc.c
+
+Patch 8.2.2143
+Problem: Vim9: dead code in compiling :unlet.
+Solution: Don't check for "!" a second time.
+Files: src/vim9compile.c
+
+Patch 8.2.2144
+Problem: Vim9: some corner cases not tested.
+Solution: Add a few tests.
+Files: src/testdir/test_vim9_script.vim, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2145
+Problem: Vim9: concatenating lists does not adjust type of result.
+Solution: When list member types differ use "any" member type.
+ (closes #7473)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2146
+Problem: Vim9: automatic conversion of number to string for dict key.
+Solution: Do not convert number to string. (closes #7474)
+Files: src/dict.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2147
+Problem: Quickfix window title not updated in all tab pages.
+Solution: Update the quickfix window title in all tab pages. (Yegappan
+ Lakshmanan, closes #7481, closes #7466)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.2148
+Problem: Vim9: crash when user command doesn't match.
+Solution: Adjust command index. (closes #7479)
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2149
+Problem: Popupwin test for latin1 sometimes fails.
+Solution: Wait for the script to finish.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.2150
+Problem: Github actions CI isn't used for all available platforms.
+Solution: Update the github workflows. (Ozaki Kiichi, closes #7433)
+Files: .coveralls.yml, .github/workflows/ci-windows.yaml,
+ .github/workflows/ci.yml, .travis.yml, README.md,
+ ci/build-snd-dummy.sh, ci/setup-xvfb.sh
+
+Patch 8.2.2151
+Problem: $dir not expanded when configure checks for moonjit.
+Solution: Use double quotes instead of single quotes. (closes #7478)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2152
+Problem: screenpos() does not include the WinBar offset.
+Solution: Use W_WINROW() instead of directly using w_window. (closes #7487)
+Files: src/move.c, src/testdir/test_cursor_func.vim
+
+Patch 8.2.2153
+Problem: Popupwin test for latin1 still fails sometimes.
+Solution: Wait for the "cat" command to finish.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.2154
+Problem: Popupwin test for terminal buffer fails sometimes.
+Solution: Wait for the prompt to appear.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.2155
+Problem: Warning from Github actions for code analysis.
+Solution: Remove the "git checkout HEAD^2" block.
+Files: .github/workflows/codeql-analysis.yml
+
+Patch 8.2.2156
+Problem: Github actions run on pushing a tag.
+Solution: Don't run CI on tag push. Omit coveralls on pull-request.
+ (Ozaki Kiichi, closes #7489)
+Files: .github/workflows/ci.yml, .github/workflows/codeql-analysis.yml
+
+Patch 8.2.2157
+Problem: Vim9: can delete a Vim9 script variable from a function.
+Solution: Check the variable is defined in Vim9 script. (closes #7483)
+Files: src/evalvars.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2158
+Problem: CI on cirrus times out, coveralls doesn't always run.
+Solution: Set timeout to 20 minutes. Adjust condition. (closes #7493)
+Files: .cirrus.yml, .github/workflows/ci.yml
+
+Patch 8.2.2159
+Problem: Vim9: when declaring a list it is not allocated yet, causing a
+ following extend() to fail.
+Solution: When fetching a variable value for a list or dict that is null
+ allocate the list or dict, so it can be used. (closes #7491)
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2160
+Problem: Various typos.
+Solution: Fix spelling mistakes. (closes #7494)
+Files: src/bufwrite.c, src/cindent.c, src/cmdexpand.c, src/eval.c,
+ src/ex_cmds.c, src/feature.h, src/getchar.c, src/gui_haiku.cc,
+ src/gui_xmdlg.c, src/help.c, src/if_ole.cpp, src/insexpand.c,
+ src/list.c, src/map.c, src/memline.c, src/normal.c,
+ src/os_win32.c, src/search.c, src/term.c,
+ src/testdir/test_arglist.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_debugger.vim, src/testdir/test_increment.vim,
+ src/testdir/test_menu.vim, src/testdir/test_netbeans.vim,
+ src/testdir/test_popupwin.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/testdir/test_sort.vim,
+ src/testdir/test_terminal2.vim, src/testdir/test_terminal3.vim,
+ src/testdir/test_vartabs.vim, src/testdir/test_vimscript.vim,
+ src/textprop.c, src/userfunc.c, src/vim9.h, src/vim9compile.c,
+ src/vim9execute.c
+
+Patch 8.2.2161
+Problem: Arguments -T and -x not tested yet.
+Solution: Add a test. (Dominique Pellé, closes #7490)
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.2162
+Problem: Vim9: Cannot load or store autoload variables.
+Solution: Add ISN_LOADAUTO and ISN_STOREAUTO. (closes #7485)
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/dict.c,
+ src/eval.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2163
+Problem: Crash when discarded exception is the current exception.
+Solution: Compare the exception with current_exception. (closes #7499)
+Files: src/ex_eval.c
+
+Patch 8.2.2164
+Problem: Vim9: autoload function doesn't work in script that starts with
+ an upper case letter.
+Solution: Check for the autoload character. (closes #7502)
+Files: src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2165
+Problem: Vim9: assignment to dict member does not work.
+Solution: Fix recognizing dict member. (closes #7484)
+Files: src/ex_docmd.c, src/eval.c, src/evalvars.c, src/vim.h
+
+Patch 8.2.2166
+Problem: Auto format doesn't work when deleting text.
+Solution: Make "x" trigger auto format. (closes #7504)
+Files: src/ops.c, src/testdir/test_textformat.vim
+
+Patch 8.2.2167
+Problem: Vim9: assign test fails. (Elimar Riesebieter)
+Solution: Adjust the test for dict assignment.
+Files: src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2168
+Problem: Vim9: error for assigning to dict of dict.
+Solution: Remember the destination type. (closes #7506)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2169
+Problem: Vim9: test leaves file behind.
+Solution: Rename script files. (Dominique Pellé, closes #7511)
+ Use try/finally.
+Files: src/testdir/test_vim9_script.vim, src/testdir/vim9.vim
+
+Patch 8.2.2170
+Problem: Vim9: a global function defined in a :def function fails if it
+ uses the context.
+Solution: Create a partial to store the closure context. (see #7410)
+Files: src/userfunc.c, src/proto/userfunc.pro, src/vim9execute.c,
+ src/structs.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2171
+Problem: Valgrind warning for using uninitialized value.
+Solution: Do not use "startp" or "endp" unless there is a match.
+Files: src/regexp_nfa.c
+
+Patch 8.2.2172
+Problem: Vim9: number of arguments is not always checked. (Yegappan
+ Lakshmanan)
+Solution: Check number of arguments when calling function by name.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2173
+Problem: Vim9: get internal error when assigning to undefined variable.
+Solution: Add error message. (closes #7475)
+Files: src/vim9compile.c, src/vim9execute.c, src/errors.h,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2174
+Problem: Mac version doesn't specify the CPU architecture.
+Solution: Add "arm64" or "x86_64". (Yee Cheng Chin, closes #7519)
+Files: src/version.c
+
+Patch 8.2.2175
+Problem: Github actions: clang-11 handling suboptimal.
+Solution: Separate step of installing clang-11. Get ubuntu release name
+ dynamically. (Ozaki Kiichi, closes #7514)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.2176
+Problem: Crash with a sequence of fold commands.
+Solution: Bail out when there are no folds at all. Add a test (Dominique
+ Pellé) (closes #7515)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.2.2177
+Problem: Pattern "^" does not match if the first character in the line is
+ combining. (Rene Kita)
+Solution: Do accept a match at the start of the line. (closes #6963)
+Files: src/regexp_nfa.c, src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.2178
+Problem: Python 3: non-utf8 character cannot be handled.
+Solution: Change the string decode. (Björn Linse, closes #1053)
+Files: src/if_py_both.h, src/if_python.c, src/if_python3.c,
+ src/testdir/test_python3.vim, src/testdir/test_python2.vim
+
+Patch 8.2.2179
+Problem: Vim9: crash when indexing a dict with a number.
+Solution: Add ISN_STOREINDEX. (closes #7513)
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h,
+ src/errors.h, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2180
+Problem: Vim9: test for error after error is flaky.
+Solution: Wait for job to finish instead of a fixed delay.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2181
+Problem: Valgrind warnings for using uninitialized value.
+Solution: Do not use "start" or "end" unless there is a match.
+Files: src/regexp_nfa.c, src/regexp_bt.c
+
+Patch 8.2.2182
+Problem: Vim9: value of 'magic' is still relevant.
+Solution: Always behave like 'magic' is on in Vim9 script (closes #7509)
+Files: src/option.c, src/proto/option.pro, src/arglist.c, src/buffer.c,
+ src/cmdexpand.c, src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c,
+ src/insexpand.c, src/normal.c, src/search.c, src/tag.c,
+ src/structs.h, src/globals.h, src/ex_cmds.h,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2183
+Problem: Vim9: value of 'edcompatible' and 'gdefault' are used.
+Solution: Ignore these deprecated options in Vim9 script. (closes #7508)
+Files: src/ex_cmds.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2184
+Problem: Vim9: no error when using "2" for a line number.
+Solution: Give an error message if the line number is invalid. (closes #7492)
+Files: src/typval.c, src/evalfunc.c, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_cursor_func.vim
+
+Patch 8.2.2185
+Problem: BufUnload is not triggered for the quickfix dummy buffer.
+Solution: Do trigger BufUnload. (Pontus Leitzler, closes #7518, closes #7517)
+ Fix white space around "=".
+Files: src/quickfix.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2186
+Problem: Vim9: error when using 'opfunc'.
+Solution: Do not expect a return value from 'opfunc'. (closes #7510)
+Files: src/eval.c, src/proto/eval.pro, src/ops.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2187
+Problem: Python 3 test fails sometimes. (Christian Brabandt)
+Solution: Accept two SystemError messages.
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.2188
+Problem: Vim9: crash when calling global function from :def function.
+Solution: Set the outer context. Define the partial for the context on the
+ original function. Use a refcount to keep track of which ufunc is
+ using a dfunc. (closes #7525)
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/vim9execute.c,
+ src/proto/vim9execute.pro, src/userfunc.c, src/proto/userfunc.pro,
+ src/structs.h, src/vim9.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2189
+Problem: Cannot repeat a command that uses the small delete register.
+Solution: Store the register name instead of the contents. (Christian
+ Brabandt, closes #7527)
+Files: src/ops.c, src/register.c, src/testdir/test_registers.vim
+
+Patch 8.2.2190
+Problem: Vim9: crash when compiled with EXITFREE.
+Solution: Check that df_ufunc is not NULL.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2191
+Problem: Vim9: using wrong name with lambda in nested function.
+Solution: Copy the lambda name earlier. (closes #7525)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2192
+Problem: Codecov on github actions fails.
+Solution: Revert to codecov script. (Ozaki Kiichi, closes #7529)
+Files: Filelist, .github/workflows/ci.yml
+
+Patch 8.2.2193
+Problem: Vim9: can change constant in :def function.
+Solution: Check if a variable is locked. (issue #7526)
+Files: src/evalvars.c, src/proto/evalvars.pro, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2194
+Problem: Vim9: cannot use :const or :final at the script level.
+Solution: Support using :const and :final. (closes #7526)
+Files: src/vim.h, src/evalvars.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2195
+Problem: Failing tests for :const.
+Solution: Add missing check for ASSIGN_FINAL.
+Files: src/eval.c, src/evalvars.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2196
+Problem: :version output has extra spaces in compile and link command.
+Solution: Adjust QUOTESED. (closes #7505)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2197
+Problem: Assert arguments order reversed.
+Solution: Swap the arguments. (Christian Brabandt, closes #7531)
+Files: src/testdir/test_registers.vim
+
+Patch 8.2.2198
+Problem: ml_get error when resizing window and using text property.
+Solution: Validate botline of the right window. (closes #7528)
+Files: src/move.c, src/proto/move.pro, src/textprop.c,
+ src/testdir/test_textprop.vim
+
+Patch 8.2.2199
+Problem: First write after setting 'eol' does not have NL added. (Tomáš
+ Janoušek)
+Solution: Only use b_no_eol_lnum when doing a binary write. (closes #7535)
+Files: src/bufwrite.c, src/testdir/test_writefile.vim
+
+Patch 8.2.2200
+Problem: Vim9: lambda without white space around -> is confusing.
+Solution: Require white space in a :def function. (issue #7503)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2201
+Problem: Write file test fails on MS-Windows.
+Solution: Force edit after setting 'fileformat'.
+Files: src/testdir/test_writefile.vim
+
+Patch 8.2.2202
+Problem: Write file test still fails on MS-Windows.
+Solution: Set fileformat with the :edit command
+Files: src/testdir/test_writefile.vim
+
+Patch 8.2.2203
+Problem: Moodle gift files are not recognized.
+Solution: Add a filetype pattern. (Delim Temizer)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2204
+Problem: Vim9: using -> both for method and lambda is confusing.
+Solution: Use => for lambda in :def function.
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/userfunc.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2205
+Problem: Vim9: memory leak when parsing lambda fails.
+Solution: Clear growarrays.
+Files: src/userfunc.c
+
+Patch 8.2.2206
+Problem: :exe command line completion only works for first argument.
+Solution: Skip over text if more is following. (closes #7546)
+Files: src/eval.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.2207
+Problem: Illegal memory access if popup menu items are changed while the
+ menu is visible. (Tomáš Janoušek)
+Solution: Make a copy of the text. (closes #7537)
+Files: src/popupmenu.c, src/testdir/test_popup.vim,
+ src/testdir/dumps/Test_popup_command_04.dump,
+ src/testdir/dumps/Test_popup_command_05.dump
+
+Patch 8.2.2208
+Problem: Vim9: after reloading a script variable index may be invalid.
+Solution: When the sequence number doesn't match give an error for using a
+ script-local variable from a compiled function. (closes #7547)
+Files: src/vim9.h, src/structs.h, src/errors.h, src/vim9compile.c,
+ src/vim9execute.c, src/scriptfile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2209
+Problem: Vim9: return type of => lambda not parsed.
+Solution: Parse and use the return type.
+Files: src/vim9compile.c, src/userfunc.c, src/vim9type.c,
+ src/proto/vim9type.pro, src/vim9script.c, src/eval.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2210
+Problem: Vim9: allocating a type to set TTFLAG_BOOL_OK.
+Solution: Add t_number_bool.
+Files: src/globals.h, src/vim9type.c, src/vim9compile.c
+
+Patch 8.2.2211
+Problem: MS-Windows: can't load Python dll if not in the path.
+Solution: Use the InstallPath registry entry. (Kelvin Lee, closes #7540)
+Files: src/if_python3.c
+
+Patch 8.2.2212
+Problem: Vim9: lambda with => does not work at the script level.
+Solution: Make it work.
+Files: src/eval.c, src/vim9type.c, src/userfunc.c,
+ src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2213
+Problem: Checking white space around -> is not backwards compatible.
+Solution: Only check white space around =>.
+Files: src/userfunc.c
+
+Patch 8.2.2214
+Problem: ":e#" does not give a warning for missing white space.
+Solution: Adjust the check for white space. (closes #7545)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2215
+Problem: Vim9: `=expr` not recognized in global command.
+Solution: Skip over pattern. (issue #7541)
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2216
+Problem: Vim9: range with missing colon can be hard to spot.
+Solution: Include the start of the range in the error. (closes #7543)
+Files: src/errors.h, src/ex_docmd.c, src/vim9compile.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2217
+Problem: Vim9: command modifiers not restored in catch block.
+Solution: Restore command modifiers. (closes #7542)
+Files: src/vim9execute.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2218
+Problem: Vim9: failure if passing more arguments to a lambda than expected.
+Solution: Only put expected arguments on the stack. (closes #7548)
+Files: src/vim9execute.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2219
+Problem: Vim9: method call with expression not supported.
+Solution: Implement expr->(expr)().
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2220
+Problem: Vim9: memory leak when parsing nested parenthesis.
+Solution: Clear newargs.
+Files: src/userfunc.c
+
+Patch 8.2.2221
+Problem: If <Down> is mapped on the command line 'wildchar' is inserted.
+Solution: Set KeyTyped when using 'wildchar'. (closes #7552)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.2222
+Problem: Vim9: cannot keep script variables when reloading.
+Solution: Add the "noclear" argument to :vim9script.
+Files: runtime/doc/vim9.txt, src/structs.h, src/scriptfile.c,
+ src/vim9script.c, src/ex_cmds.h, src/ex_docmd.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2223
+Problem: Vim9: Reloading marks a :def function as deleted.
+Solution: Clear the function contents but keep the index.
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/userfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2224
+Problem: Vim9: crash if script reloaded with different variable type.
+Solution: Check the type when accessing the variable.
+Files: src/vim9execute.c, src/vim9compile.c, src/vim9.h, src/vim9type.c,
+ src/proto/vim9type.pro, src/errors.h, src/evalvars.c,
+ src/vim9script.c, src/proto/vim9script.pro,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2225
+Problem: Vim9: error when using :import in legacy script twice.
+Solution: Make it possible to redefine an import when reloading.
+Files: src/vim9script.c, src/proto/vim9script.pro, src/structs.h,
+ src/evalvars.c, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2226
+Problem: Vim9: script test fails.
+Solution: Add missing change.
+Files: src/scriptfile.c
+
+Patch 8.2.2227
+Problem: Vim9: recognizing lambda is too complicated.
+Solution: Call compile_lambda() and check for NOTDONE.
+Files: src/vim9compile.c, src/userfunc.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2228
+Problem: Vim9: cannot use ":e #" because # starts a comment.
+Solution: Support using %% instead of #.
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2229
+Problem: build failure without the +eval feature.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.2.2230
+Problem: Vim9: insert completion runs into error.
+Solution: Insert colon before range. (closes #7556)
+Files: src/insexpand.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2231
+Problem: When "--remote file" is used "file" is not reloaded.
+Solution: When a :drop command is used for a file that is already displayed
+ in a window and it has not been changed, check if it needs to be
+ reloaded. (closes #7560)
+Files: src/ex_cmds.c, src/testdir/test_clientserver.vim
+
+Patch 8.2.2232
+Problem: Compiler error for falling through into next case.
+Solution: Move FALLTHROUGH below the #endif
+Files: src/ex_docmd.c
+
+Patch 8.2.2233
+Problem: Cannot convert a byte index into a character index.
+Solution: Add charidx(). (Yegappan Lakshmanan, closes #7561)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim
+
+Patch 8.2.2234
+Problem: Command line wildmenu test often fails with Unix GUI.
+Solution: Skip the test where it is expected to fail.
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.2.2235
+Problem: Build failure with some Ruby versions.
+Solution: Adjust the code for Ruby 3.0. (Ozaki Kiichi, closes #7564)
+Files: ci/config.mk.clang.sed, src/if_ruby.c
+
+Patch 8.2.2236
+Problem: 'scroll' option can change when setting the statusline or tabline
+ but the option context is not updated.
+Solution: Update the script context when the scroll option is changed as a
+ side effect. (Christian Brabandt, closes #7533)
+Files: runtime/doc/options.txt, src/scriptfile.c,
+ src/testdir/test_options.vim, src/vim.h, src/window.c
+
+Patch 8.2.2237
+Problem: CI on Mac fails in sed command.
+Solution: Set LC_ALL to "C". (Ozaki Kiichi, closes #7565)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.2238
+Problem: Vim9: cannot load a Vim9 script without the +eval feature.
+Solution: Support Vim9 script syntax without the +eval feature.
+Files: src/ex_docmd.c, src/vim9script.c, src/globals.h, src/main.c,
+ src/autocmd.c, src/buffer.c, src/structs.h, src/menu.c,
+ src/scriptfile.c, src/usercmd.c, src/proto.h, src/errors.h
+
+Patch 8.2.2239
+Problem: Vim9: concatenating lines with backslash is inconvenient.
+Solution: Support concatenating lines starting with '|', useful for
+ :autocmd, :command, etc. (closes #6702)
+Files: runtime/doc/vim9.txt, src/scriptfile.c, src/vim9script.c,
+ src/proto/vim9script.pro, src/vim9compile.c,
+ src/proto/vim9compile.pro, src/userfunc.c, src/structs.h,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2240
+Problem: Clientserver test fails if full path is used.
+Solution: Ignore the path preceding the file name.
+Files: src/testdir/test_clientserver.vim
+
+Patch 8.2.2241
+Problem: Build with Ruby and clang may fail.
+Solution: Adjust configure and sed script. (Ozaki Kiichi, closes #7566)
+Files: ci/config.mk.clang.sed, src/auto/configure, src/configure.ac
+
+Patch 8.2.2242
+Problem: Vim9: line continuation with bar does not work at script level.
+Solution: Check for Vim9 script.
+Files: src/structs.h, src/ex_docmd.c, src/userfunc.c, src/scriptfile.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2243
+Problem: Crash when popup mask contains zeroes.
+Solution: Check boundaries properly. (closes #7569)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.2244
+Problem: Crash when making the window width of the not-current window
+ negative.
+Solution: Make sure the window width is not negative. (closes #7568)
+Files: src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 8.2.2245
+Problem: Vim9: return value of winrestcmd() cannot be executed.
+Solution: Put colons before each range. (closes #7571)
+Files: src/evalwindow.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2246
+Problem: Cursor keys not recognized at the hit-Enter prompt after executing
+ an external command.
+Solution: Change the codes for the extra cursor keys. (closes #7562)
+ Tune the delays to avoid test flakiness.
+Files: runtime/doc/term.txt, src/term.c, src/testdir/test_terminal3.vim
+
+Patch 8.2.2247
+Problem: VMS: various smaller problems.
+Solution: Fix VMS building and other problems. (Zoltan Arpadffy)
+Files: src/term.c, src/gui_gtk_vms.h, src/os_vms_conf.h, src/gui_x11.c,
+ src/Make_vms.mms, src/macros.h, src/gui.h, src/os_unix.h
+
+Patch 8.2.2248
+Problem: ASAN error on exit with GUI.
+Solution: Check the window still has lines. (Christian Brabandt,
+ closes #7573)
+Files: src/term.c
+
+Patch 8.2.2249
+Problem: Termcodes test is flaky when used over ssh with X forwarding.
+Solution: Set 'mousetime' to a larger value. (Dominique Pellé, closes #7576,
+ closes #7563)
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.2.2250
+Problem: Vim9: sublist is ambiguous.
+Solution: Require white space around the colon. (closes #7409)
+Files: src/vim9compile.c, src/eval.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2251
+Problem: Test failures in legacy script.
+Solution: Check for Vim9 script.
+Files: src/eval.c
+
+Patch 8.2.2252
+Problem: Vim9: crash when using lambda without return type in dict.
+Solution: Without a return type use t_unknown. (closes #7587)
+Files: src/vim9type.c, src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2253
+Problem: Vim9: expr test fails.
+Solution: Add missing assignment.
+Files: src/userfunc.c
+
+Patch 8.2.2254
+Problem: Vim9: bool option type is number.
+Solution: Have get_option_value() return a different value for bool and
+ number options. (closes #7583)
+Files: src/option.h, src/option.c, src/proto/option.pro, src/evalvars.c,
+ src/if_mzsch.c, src/if_ruby.c, src/spell.c, src/typval.c,
+ src/vim9compile.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2255 (after 8.2.2254)
+Problem: Tcl test fails.
+Solution: Change option handling.
+Files: src/if_tcl.c
+
+Patch 8.2.2256
+Problem: Vim9: cannot use function( after line break in :def function.
+Solution: Check for "(" after "function". (closes #7581)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2257
+Problem: Vim9: using -> for lambda is ambiguous.
+Solution: Stop supporting ->, must use =>.
+Files: src/eval.c, src/vim9compile.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2258
+Problem: Not all OCaml related files are detected.
+Solution: Update OCaml file type detection. (Markus Mottl, closes #7590)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2259
+Problem: Test_Executable() fails when using chroot.
+Solution: Ignore the difference between "sbin" and "bin".
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.2260
+Problem: Window resize test fails in very wide terminal.
+Solution: Resize using the 'columns' option. (Vladimir Lomov, closes #7592)
+Files: src/testdir/test_window_cmd.vim
+
+Patch 8.2.2261
+Problem: Vim9: boolean option gets string type.
+Solution: Check for VAR_BOOL. (closes #7588)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2262
+Problem: Vim9: converting bool to string prefixes v:.
+Solution: Do not use the v: prefix.
+Files: src/evalvars.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2263
+Problem: Vim9: compilation error with try-catch in skipped block.
+Solution: Do not bail out when generate_instr() returns NULL. (closes #7584)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2264
+Problem: Vim9: no error for mismatched :endfunc or :enddef.
+Solution: Check for the mismatch. (issue #7582)
+Files: src/errors.h, src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2265
+Problem: Error message for missing endfunc/enddef is last line.
+Solution: Report the line where the function starts. (closes #7582)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2266
+Problem: Vim9: it can be hard to see where white space is missing.
+Solution: Mention the text where the error was seen. (closes #7580)
+Files: src/errors.h, src/eval.c, src/evalvars.c, src/userfunc.c,
+ src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2267
+Problem: Vim9: cannot use unlet for a dict member.
+Solution: Pass GLV_NO_DECL to get_lval(). (closes #7585)
+Files: src/evalvars.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2268
+Problem: Vim9: list unpack seen as declaration.
+Solution: Check for "var". (closes #7594)
+Files: src/vim9compile.c, src/evalvars.c, src/eval.c, src/vim.h,
+ src/vim9execute.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2269
+Problem: Not all :hardcopy code covered by tests.
+Solution: Test more combinations. (Dominique Pellé, closes #7595)
+Files: src/testdir/test_hardcopy.vim
+
+Patch 8.2.2270
+Problem: Warning for size_t to int conversion. (Randall W. Morris)
+Solution: Add a type cast.
+Files: src/vim9execute.c
+
+Patch 8.2.2271
+Problem: ml_get error when changing hidden buffer in Python.
+Solution: Block updating folds. (closes #7598)
+Files: src/evalbuffer.c, src/testdir/test_python3.vim
+
+Patch 8.2.2272
+Problem: Vim9: extend() can violate the type of a variable.
+Solution: Add the type to the dictionary or list and check items against it.
+ (closes #7593)
+Files: src/structs.h, src/evalvars.c, src/dict.c, src/list.c,
+ src/vim9script.c, src/proto/vim9script.pro, src/vim9compile.c,
+ src/vim9execute.c, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2273
+Problem: Build failure.
+Solution: Add missing changes to header file.
+Files: src/vim9.h
+
+Patch 8.2.2274
+Problem: badge for Travis is outdated.
+Solution: Update badge for move from travis-ci.org to travis-ci.com.
+Files: README.md
+
+Patch 8.2.2275
+Problem: CTRL-C not recognized in Mintty.
+Solution: Recognize the modifyOtherKeys code ending in "u". (Christian
+ Brabandt, closes #7575)
+Files: src/ui.c
+
+Patch 8.2.2276
+Problem: List of distributed files is outdated.
+Solution: Update the file list. Minor comment updates.
+Files: Filelist, src/clipboard.c, src/fileio.c, src/option.c,
+ src/screen.c, src/testdir/test_signals.vim,
+ src/testdir/Make_vms.mms
+
+Patch 8.2.2277
+Problem: Missing backslash.
+Solution: Add backslash.
+Files: Filelist
+
+Patch 8.2.2278
+Problem: Falling back to old regexp engine can some patterns.
+Solution: Do not fall back once [[:lower:]] or [[:upper:]] is used.
+ (Christian Brabandt, closes #7572)
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.2279
+Problem: Vim9: memory leak with catch in skipped block.
+Solution: Free the pattern if not used.
+Files: src/vim9compile.c
+
+Patch 8.2.2280
+Problem: Fuzzy matching doesn't give access to the scores.
+Solution: Return the scores with a third list. (Yegappan Lakshmanan,
+ closes #7596)
+Files: runtime/doc/eval.txt, src/search.c,
+ src/testdir/test_matchfuzzy.vim
+
+Patch 8.2.2281
+Problem: Vim9: compiled "wincmd" cannot be followed by bar.
+Solution: Check for bar after "wincmd". (closes #7599)
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2282
+Problem: Length check mismatch with argument of strncmp(). (Christian
+ Brabandt)
+Solution: Adjust length check.
+Files: src/ui.c
+
+Patch 8.2.2283
+Problem: Vim9: crash when lambda has fewer arguments than expected.
+Solution: Don't check arguments when already failed. (closes #7606)
+Files: src/vim9type.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2284
+Problem: Vim9: cannot set an option to a boolean value.
+Solution: Check for VAR_BOOL. (closes #7603)
+Files: src/evalvars.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2285
+Problem: Vim9: cannot set an option to a false.
+Solution: For VAR_BOOL use string "0". (closes #7603)
+Files: src/evalvars.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2286
+Problem: Sort test fails when locale is Canadian English. (Neil H Watson)
+Solution: Expect a different sort order. (closes #7609)
+Files: src/testdir/test_sort.vim
+
+Patch 8.2.2287
+Problem: Sort test fails when locale is French Canadian.
+Solution: Expect a different sort order. (Dominique Pellé, closes #7609)
+Files: src/testdir/test_sort.vim
+
+Patch 8.2.2288
+Problem: Vim9: line break and comment not always skipped.
+Solution: Skip over white space and then line break more consistently.
+ (closes #7610)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2289
+Problem: Vim9: 'cpo' can become empty.
+Solution: Use empty_option instead of an empty string. Update quickfix
+ buffer after restoring 'cpo'. (closes #7608)
+Files: src/evalfunc.c, src/syntax.c, src/eval.c, src/quickfix.c,
+ src/evalbuffer.c, src/ex_eval.c, src/gui_motif.c, src/map.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.2290
+Problem: Vim9: unlet of global variable cannot be compiled.
+Solution: Skip over variables that might be defined later. Give an error if
+ a subscript is found. (closes #7585)
+Files: src/eval.c, src/vim9compile.c, src/vim.h,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2291
+Problem: Vim9: cannot use "null" for v:null.
+Solution: Support "null" like "true" and "false". (closes #7495)
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/evalvars.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2292
+Problem: Vim: expr test fails.
+Solution: Add missing part of "null" support.
+Files: src/eval.c
+
+Patch 8.2.2293
+Problem: Build failure with Motif. (Tony Mechelynck)
+Solution: Use empty_option instead of empty_options.
+Files: src/gui_motif.c
+
+Patch 8.2.2294
+Problem: VMS: a few remaining problems.
+Solution: Add VMS specific changes. Add Lua support. (Zoltan Arpadffy)
+Files: src/fileio.c, src/os_vms_conf.h, src/Make_vms.mms, src/macros.h,
+ src/os_vms.c, src/vim9execute.c, src/gui_xmebw.c, src/os_unix.h
+
+Patch 8.2.2295
+Problem: Incsearch does not detect empty pattern properly.
+Solution: Return magic state when skipping over a pattern. (Christian
+ Brabandt, closes #7612, closes #6420)
+Files: src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c, src/globals.h,
+ src/option.c, src/tag.c, src/proto/regexp.pro, src/regexp.c,
+ src/search.c, src/structs.h, src/vim9compile.c,
+ src/testdir/dumps/Test_incsearch_sub_01.dump,
+ src/testdir/dumps/Test_incsearch_sub_02.dump,
+ src/testdir/test_search.vim
+
+Patch 8.2.2296
+Problem: Cannot use CTRL-N and CTRL-P in a popup menu.
+Solution: Use CTRL-N like <Down> and CTRL-P like <Up>. (closes #7614)
+Files: runtime/doc/popup.txt, src/popupwin.c,
+ src/testdir/test_popupwin.vim
+
+Patch 8.2.2297
+Problem: Vim9: cannot set 'number' to a boolean value.
+Solution: Use tv_get_bool(). (closes #7615)
+Files: src/evalvars.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2298
+Problem: Vim9: comment right after "(" of function not recognized.
+Solution: Do not skip over white space before calling get_function_args().
+ (closes #7613)
+Files: src/userfunc.c, src/proto/userfunc.pro,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2299
+Problem: Vim9: invalid memory access making error message flaky.
+Solution: Do not check cmd_argt for CMD_USER. (issue #7467)
+Files: src/ex_docmd.c, src/vim9execute.c, src/errors.h,
+ src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2300
+Problem: Vim9: wrong order on type stack when using dict.
+Solution: Generate constants before a dict. (closes #7619)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2301
+Problem: Vim9: cannot unlet a dict or list item.
+Solution: Add ISN_UNLETINDEX. Refactor assignment code to use for unlet.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2302
+Problem: Vim9: using an option value may use uninitialized memory.
+Solution: Clear v_lock. (closes #7620)
+Files: src/typval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2303
+Problem: Vim9: backtick expansion doesn't work for :foldopen.
+Solution: Do recognize backtick expansion. (closes #7621)
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2304
+Problem: Vim9: no test for unletting an imported variable.
+Solution: Add a test. Fix line number in error.
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2305
+Problem: Vim9: "++var" and "--var" are silently accepted.
+Solution: Give an error message.
+Files: src/vim9compile.c, src/eval.c, src/proto/eval.pro,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2306
+Problem: Vim9: when using function reference type is not checked.
+Solution: When using a function reference lookup the type and check the
+ argument types. (issue #7629)
+Files: src/userfunc.c, src/proto/userfunc.pro, src/eval.c, src/structs.h,
+ src/vim9type.c, src/proto/vim9type.pro, src/vim9compile.c,
+ src/vim9execute.c, src/evalvars.c, src/evalfunc.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2307
+Problem: A shell command in the vimrc causes terminal output.
+Solution: Do not call starttermcap() after a shell command if the termcap
+ wasn't active before.
+Files: src/ex_cmds.c
+
+Patch 8.2.2308
+Problem: Vim9: no error when assigning lambda to funcref without return
+ value.
+Solution: Default return value to "any". (closes #7629)
+Files: src/userfunc.c, src/vim9compile.c,
+ src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2309
+Problem: 0o777 not recognized as octal.
+Solution: Use vim_isodigit(). (Ken Takata, closes #7633, closes #7631)
+Files: src/charset.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.2.2310
+Problem: Vim9: winsaveview() return type is too generic.
+Solution: use dict<number> instead of dict<any>. (closes #7626)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2311
+Problem: Vim9: cannot assign to a variable that shadows a command modifier.
+Solution: Check for assignment after possible command modifier.
+ (closes #7632)
+Files: src/vim9compile.c, src/ex_docmd.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2312
+Problem: Build failure with Ruby 3.0 and 32 bits.
+Solution: Add #ifdef. (closes #7638)
+Files: src/if_ruby.c
+
+Patch 8.2.2313
+Problem: Vim9: using uninitialized field when parsing range. ":silent!" not
+ respected when parsing range fails.
+Solution: Initialize ea.skip. On pattern failure handle it like an error.
+ (closes #7636)
+Files: src/vim9execute.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2314
+Problem: Vim9: returning zero takes two instructions.
+Solution: Add ISN_RETURN_ZERO.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2315
+Problem: Vim9: "enddef" as dict key misinterpreted as function end.
+Solution: Check for following colon. (closes #7640)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2316
+Problem: Vim9: cannot list a lambda function.
+Solution: Support the <lambda>9 notation, like :disassemble. (closes #7634)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2317
+Problem: Vim9: command modifier before list unpack doesn't work.
+Solution: Only recognize "[" directly after the name. (closes #7641)
+Files: src/ex_docmd.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2318
+Problem: Vim9: string and list index work differently.
+Solution: Make string index work like list index. (closes #7643)
+Files: src/eval.c, src/proto/eval.pro, src/vim9execute.c, src/list.c,
+ src/proto/vim9execute.pro, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2319
+Problem: "exptype_T" can be read as "expected type".
+Solution: Rename to "exprtype_T", expression type.
+Files: src/eval.c, src/typval.c, src/proto/typval.pro, src/vim9compile.c,
+ src/proto/vim9compile.pro, src/vim9execute.c, src/structs.h,
+ src/vim9.h
+
+Patch 8.2.2320
+Problem: Vim9: no error for comparing bool with string.
+Solution: Check for wrong types when comparing. (closes #7639)
+Files: src/typval.c, src/errors.h, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2321
+Problem: Vim9: cannot nest closures.
+Solution: Add the nesting level to ISN_LOADOUTER and ISN_STOREOUTER.
+ (closes #7150, closes #7635)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c, src/structs.h,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2322
+Problem: Vim9: closure nested limiting to one level.
+Solution: Add outer_T. Also make STOREOUTER work.
+Files: src/vim9execute.c, src/vim9.h, src/structs.h,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2323
+Problem: Vim9: error when inferring type from empty dict/list.
+Solution: When the member is t_unknown use t_any. (closes #7009)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2324
+Problem: Not easy to get mark en cursor position by character count.
+Solution: Add functions that use character index. (Yegappan Lakshmanan,
+ closes #7648)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/eval.c,
+ src/evalfunc.c, src/proto/eval.pro, src/tag.c,
+ src/testdir/test_cursor_func.vim, src/typval.c
+
+Patch 8.2.2325
+Problem: Vim9: crash if map() changes the item type.
+Solution: Check that the item type is still OK. (closes #7652)
+ Fix problem with mapnew() on range list.
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/vim9compile.c,
+ src/list.c, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2326
+Problem: Build error with +eval feature but without +spell.
+Solution: Adjust #ifdef. (John Marriott)
+Files: src/mbyte.c
+
+Patch 8.2.2327
+Problem: Debugging code included.
+Solution: Remove the debugging code.
+Files: src/vim9execute.c
+
+Patch 8.2.2328
+Problem: Some test files may not be deleted.
+Solution: Add a delete() call, correct name. (Dominique Pellé, closes #7654)
+Files: src/testdir/test_clientserver.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2329
+Problem: Not all ways Vim can be started are tested.
+Solution: Add a test for different program names. (Dominique Pellé,
+ closes #7651)
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.2330
+Problem: Vim9: crash when using :trow in a not executed block.
+Solution: Don't generate the instruction when skipping. (closes #7659)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2331
+Problem: Vim9: wrong error when modifying dict declared with :final.
+Solution: Do not check for writable variable when an index follows.
+ (closes #7657)
+Files: src/vim9compile.c, src/structs.h, src/vim9script.c,
+ src/proto/vim9script.pro, src/evalvars.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2332
+Problem: Vim9: missing :endif not reported when using :windo.
+Solution: Pass a getline function to do_cmdline(). (closes #7650)
+Files: src/vim9execute.c, src/structs.h, src/scriptfile.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2333
+Problem: Vim9: warning for uninitialized variable. (Tony Mechelynck)
+Solution: Initialize "res".
+Files: src/vim9execute.c
+
+Patch 8.2.2334
+Problem: Pascal-like filetypes not always detected.
+Solution: Improved Puppet, InstantFPC and Pascal detection. (Doug Kearns,
+ closes #7662)
+Files: runtime/autoload/dist/ft.vim, runtime/filetype.vim,
+ runtime/scripts.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2335
+Problem: Vim9: "silent return" does not restore command modifiers.
+Solution: Restore command modifiers before returning. (closes #7649)
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2336
+Problem: Vim9: it is not possible to extend a dictionary with different
+ item types.
+Solution: Add extendnew(). (closes #7666)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/list.c, src/proto/list.pro, src/testdir/test_listdict.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2337
+Problem: Configure test for GTK only says "no". (Harm te Hennepe)
+Solution: Hint that a -def package is needed. (closes #5229)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2338
+Problem: Vim9: no error if using job_info() result wrongly.
+Solution: Adjust return type on number of arguments. (closes #7667)
+Files: src/evalfunc.c, src/globals.h, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2339
+Problem: Cannot get the type of a value as a string.
+Solution: Add typename().
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/vim9type.c, src/proto/vim9type.pro,
+ src/testdir/test_vimscript.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2340
+Problem: win_execute() unexpectedly returns number zero when failing.
+Solution: Return an empty string. (closes #7665)
+Files: src/evalwindow.c, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_execute_func.vim
+
+Patch 8.2.2341
+Problem: Expression command line completion shows variables but not
+ functions after "g:". (Gary Johnson)
+Solution: Prefix "g:" when needed to a global function.
+Files: src/evalfunc.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.2342
+Problem: "char" functions return the wrong column in Insert mode when the
+ cursor is beyond the end of the line.
+Solution: Compute the column correctly. (Yegappan Lakshmanan, closes #7669)
+Files: src/eval.c, src/evalfunc.c, src/testdir/test_cursor_func.vim
+
+Patch 8.2.2343
+Problem: Vim9: return type of readfile() is any.
+Solution: Add readblob() so that readfile() can be expected to always
+ return a list of strings. (closes #7671)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/filepath.c, src/proto/filepath.pro,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2344
+Problem: Using inclusive index for slice is not always desired.
+Solution: Add the slice() method, which has an exclusive index. (closes
+ #7408)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/eval.c, src/proto/eval.pro, src/vim9execute.c,
+ src/proto/vim9execute.pro, src/list.c, src/proto/list.pro,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2345
+Problem: No focus events in a terminal.
+Solution: Add the t_fd and t_fe termcap entries and implement detecting
+ focus events. (Hayaki Saito, Magnus Groß, closes #7673,
+ closes #609, closes #5526)
+Files: runtime/doc/term.txt, src/optiondefs.h, src/term.c, src/term.h
+
+Patch 8.2.2346
+Problem: Codecov reports every little coverage drop.
+Solution: Tolerate a 0.05% drop. Hide the appveyor config file. (Ozaki
+ Kiichi, closes #7678)
+Files: .appveyor.yml, appveyor.yml, .codecov.yml
+
+Patch 8.2.2347
+Problem: Build failure without GUI.
+Solution: Add #ifdef.
+Files: src/term.c
+
+Patch 8.2.2348 (after 8.2.2345)
+Problem: No check for modified files after focus gained. (Mathias Stearn)
+Solution: Call ui_focus_change().
+Files: src/term.c, src/ui.c
+
+Patch 8.2.2349
+Problem: Vim9: cannot handle line break after parenthesis at line end.
+Solution: Skip over line break. (closes #7677)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2350
+Problem: Using "void" for no reason.
+Solution: Use "char *".
+Files: src/ex_docmd.c
+
+Patch 8.2.2351
+Problem: Vim9: error message for "throw" in function that was called with
+ "silent!".
+Solution: Do not throw the exception when not caught or displayed.
+ (closes #7672)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2352
+Problem: If the focus lost/gained escape sequence is received twice it is
+ not ignored. (Christ van Willegen)
+Solution: Adjust the logic to ignore the escape code.
+Files: src/term.c
+
+Patch 8.2.2353
+Problem: Sparql files are not detected.
+Solution: Add the sparql filetype. (closes #7679)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2354
+Problem: Crash with a weird combination of autocommands.
+Solution: Increment b_nwindows when needed. (closes #7674)
+Files: src/ex_cmds.c, src/buffer.c, src/proto/buffer.pro,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.2355
+Problem: Stray test failure on Appveyor.
+Solution: Finish insert command.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.2356
+Problem: Vim9: ":put =expr" does not handle a list properly.
+Solution: Use the same logic as eval_to_string_eap(). (closes #7684)
+Files: src/vim9execute.c, src/eval.c, src/proto/eval.pro,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2357
+Problem: Vim9: crash when parsing function return type fails.
+Solution: Bail out and set return type to "unknown". (closes #7685)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2358
+Problem: Wrong #ifdef for use_xterm_like_mouse().
+Solution: Use FEAT_MOUSE_XTERM.
+Files: src/term.c
+
+Patch 8.2.2359
+Problem: Strange test failure with MS-Windows.
+Solution: Skip the system() call for now.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.2360
+Problem: Test leaves file behind.
+Solution: Delete the right file. (Dominique Pellé, closes #7689)
+Files: src/testdir/test_filetype.vim
+
+Patch 8.2.2361
+Problem: Vim9: no highlight for "s///gc" when using 'opfunc'.
+Solution: Reset 'lazyredraw' temporarily. (closes #7687)
+Files: src/ex_cmds.c
+
+Patch 8.2.2362
+Problem: Vim9: check of builtin function argument type is incomplete.
+Solution: Use need_type() instead of check_arg_type().
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/evalfunc.c,
+ src/proto/evalfunc.pro, src/vim9type.c, src/proto/vim9type.pro,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2363
+Problem: curpos() does not accept a string argument as before.
+solution: Make a string argument work again. (Yegappan Lakshmanan,
+ closes #7690)
+Files: src/evalfunc.c, src/testdir/test_cursor_func.vim
+
+Patch 8.2.2364
+Problem: Vim9: line break in lambda accesses freed memory.
+Solution: Make a copy of the return type. (closes #7664)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2365
+Problem: Vim9: no check for map() changing item type at script level.
+Solution: Check the new value type.
+Files: src/list.c, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2366
+Problem: When using ":sleep" the cursor is always displayed.
+Solution: Do not display the cursor when using ":sleep!". (Jeremy Lerner,
+ closes #7688)
+Files: runtime/doc/index.txt, runtime/doc/various.txt, src/ex_cmds.h,
+ src/ex_docmd.c, src/normal.c, src/proto/ex_docmd.pro, src/term.c,
+ src/testdir/Make_all.mak, src/testdir/test_sleep.vim
+
+Patch 8.2.2367
+Problem: Test failures on some less often used systems.
+Solution: Adjust printf formats and types. (James McCoy, closes #7691)
+Files: src/errors.h, src/evalfunc.c, src/list.c, src/vim9execute.c
+
+Patch 8.2.2368
+Problem: Insufficient tests for setting options.
+Solution: Add a few tests. (Dominique Pellé, closes #7695)
+Files: src/testdir/test_options.vim
+
+Patch 8.2.2369
+Problem: Vim9: functions return true/false but can't be used as bool.
+Solution: Add ret_number_bool(). (closes #7693)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2370
+Problem: Vim9: command fails in catch block.
+Solution: Reset force_abort and need_rethrow. (closes #7692)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2371
+Problem: Vim9: crash when using types in :for with unpack.
+Solution: Check for skip_var_list() failing. Pass include_type to
+ skip_var_one(). Skip type when compiling. (closes #7694)
+Files: src/vim9compile.c, src/evalvars.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2372 (after 8.2.2371)
+Problem: Confusing error message for wrong :let command.
+Solution: Only check for type in Vim9 script.
+Files: src/evalvars.c
+
+Patch 8.2.2373
+Problem: Vim9: list assignment only accepts a number index.
+Solution: Accept "any" and do a runtime type check. (closes #7694)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2374
+Problem: Accessing uninitialized memory in test_undo.
+Solution: Do not look in typebuf.tb_buf if it is empty. (Dominique Pellé,
+ closes #7697)
+Files: src/edit.c
+
+Patch 8.2.2375
+Problem: Test for RGB color skipped in the terminal.
+Solution: Run the GUI if possible.
+Files: src/testdir/test_highlight.vim
+
+Patch 8.2.2376
+Problem: Vim9: crash when dividing by zero in compiled code using
+ constants.
+Solution: Call num_divide() and num_modulus(). (closes #7704)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2377
+Problem: Vim9: crash when using a range after another expression.
+Solution: Set the variable type to number. Fix using :put with a range and
+ the "=" register. (closes #7706)
+Files: src/vim9execute.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2378
+Problem: Vim9: no error message for dividing by zero.
+Solution: Give an error message. (issue #7704)
+Files: src/errors.h, src/eval.c, src/vim9execute.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2379
+Problem: Finding spell suggestions twice if 'spellsuggest' contains number.
+Solution: Only do internal suggestions once. (closes #7713)
+Files: src/spellsuggest.c
+
+Patch 8.2.2380
+Problem: Vim9: occasional crash when using try/catch and a timer.
+Solution: Save and restore "need_rethrow" when invoking a timer callback.
+ (closes #7708)
+Files: src/time.c
+
+Patch 8.2.2381
+Problem: Vim9: divide by zero does not abort expression execution.
+Solution: Use a "failed" flag. (issue #7704)
+Files: src/eval.c, src/proto/eval.pro, src/evalvars.c, src/vim9compile.c,
+ src/testdir/vim9.vim, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2382 (after 8.2.2381)
+Problem: Build failure.
+Solution: Add missing changes.
+Files: src/vim9execute.c
+
+Patch 8.2.2383
+Problem: Focus escape sequences are not named in ":set termcap" output.
+Solution: Add the names to the list. (closes #7718)
+Files: src/misc2.c
+
+Patch 8.2.2384
+Problem: Turtle filetype not recognized.
+Solution: Add a rule to detect turtle files. (closes #7722)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2385
+Problem: "gj" and "gk" do not work correctly when inside a fold.
+Solution: Move check for folding. (closes #7724, closes #4095)
+Files: src/normal.c, src/testdir/test_fold.vim
+
+Patch 8.2.2386
+Problem: Vim9: crash when using ":silent! put".
+Solution: When ignoring an error for ":silent!" rewind the stack and skip
+ ahead to restoring the cmdmod. (closes #7717)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2387
+Problem: Runtime type check does not mention argument index.
+Solution: Add ct_arg_idx. (closes #7720)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2388
+Problem: No easy way to get the maximum or minimum number value.
+Solution: Add v:numbermax and v:numbermin.
+Files: src/evalvars.c, src/vim.h, src/testdir/test_eval_stuff.vim,
+ runtime/doc/eval.txt
+
+Patch 8.2.2389
+Problem: Test failure on a few systems.
+Solution: Avoid that "char" value is negative.
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h
+
+Patch 8.2.2390
+Problem: Vim9: using positive offset is unexpected.
+Solution: Use int8_T instead of char. (James McCoy)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c
+
+Patch 8.2.2391
+Problem: Memory leak when creating a global function with closure.
+Solution: Create a separate partial for every instantiated function.
+Files: src/userfunc.c, src/vim9execute.c
+
+Patch 8.2.2392
+Problem: Fennel filetype not recognized.
+Solution: Detect with pattern and hashbang. (Chinmay Dalal, closes #7729)
+Files: runtime/filetype.vim, runtime/scripts.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.2393
+Problem: Vim9: error message when script line starts with "[{".
+Solution: Do not give an error for checking for end of list.
+Files: src/dict.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2394
+Problem: Vim9: min() and max() return type is "any".
+Solution: Use return type "number". (closes #7728)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2395
+Problem: Vim9: error for wrong type may report wrong line number.
+Solution: Save and restore the line number when evaluating the expression.
+ (closes #7727)
+Files: src/evalvars.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2396
+Problem: Vim9: no white space allowed before "->".
+Solution: Allow for white space. (closes #7725)
+Files: src/ex_docmd.c, src/eval.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2397
+Problem: Vim9: "%%" not seen as alternate file name for commands with a
+ buffer name argument.
+Solution: Recognize "%%" like "#". (closes #7732)
+Files: src/buffer.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2398 (after 8.2.2396)
+Problem: Method test fails.
+Solution: Adjust test for allowed white space.
+Files: src/testdir/test_method.vim
+
+Patch 8.2.2399 (after 8.2.2385)
+Problem: Fold test fails in wide terminal.
+Solution: Adjust the test. (Dominique Pelle, closes #7731, closes #7739)
+Files: src/testdir/test_fold.vim
+
+Patch 8.2.2400
+Problem: Vim9: compiled functions are not profiled.
+Solution: Add initial changes to profile compiled functions. Fix that a
+ script-local function was hard to debug.
+Files: runtime/doc/repeat.txt, src/vim9.h, src/vim9compile.c,
+ src/vim9execute.c, src/userfunc.c, src/proto/vim9compile.pro,
+ src/structs.h, src/vim9type.c, src/debugger.c, src/ex_cmds.h,
+ src/ex_docmd.c, src/profiler.c, src/proto/profiler.pro,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_profile.vim
+
+Patch 8.2.2401
+Problem: Build fails without +profiling feature.
+Solution: Add #ifdefs.
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h, src/structs.h,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2402
+Problem: Some filetypes not detected.
+Solution: Detect Ruby Signature and Puppet related files. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2403
+Problem: Vim9: profiling if/elseif/endif not correct.
+Solution: Add profile instructions. Fix that "elseif" was wrong.
+Files: src/vim9compile.c, src/testdir/test_profile.vim,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2404
+Problem: Vim9: profiling try/catch not correct.
+Solution: Add profile instructions. Fix that "entry" did not rethrow an
+ exception.
+Files: src/vim9compile.c, src/vim9execute.c, src/testdir/test_profile.vim
+
+Patch 8.2.2405
+Problem: Vim9: no need to allow white space before "(" for :def.
+Solution: Give an error for stray white space. (issue #7734)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2406
+Problem: Vim9: profiled :def function leaks memory.
+Solution: Delete the profiled instructions.
+Files: src/vim9compile.c
+
+Patch 8.2.2407
+Problem: Old jumplist code is never used.
+Solution: Delete the dead code. (Yegappan Lakshmanan, closes #7740)
+Files: src/mark.c
+
+Patch 8.2.2408
+Problem: MinGW: "--preprocessor" flag no longer supported.
+Solution: Remove the flag, use the defaults. (Christopher Wellons,
+ closes #7741)
+Files: src/GvimExt/Make_ming.mak, src/Make_cyg_ming.mak
+
+Patch 8.2.2409
+Problem: Vim9: profiling only works for one function.
+Solution: Select the right instructions when calling and returning.
+ (closes #7743)
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h,
+ src/testdir/test_profile.vim
+
+Patch 8.2.2410
+Problem: Build failure without the +profiling feature.
+Solution: Add dummy argument to macro.
+Files: src/vim9.h
+
+Patch 8.2.2411
+Problem: Profile test fails on MS-Windows.
+Solution: Do the profiling in a separate Vim command.
+Files: src/testdir/test_profile.vim
+
+Patch 8.2.2412
+Problem: Not all fields in "cstack" are initialized which might cause a
+ crash.
+Solution: Use CLEAR_FIELD().
+Files: src/ex_docmd.c
+
+Patch 8.2.2413
+Problem: Crash when using :all while using a cmdline window. (Zdenek Dohnal)
+Solution: Disallow :all from the cmdline window.
+Files: src/arglist.c, src/ex_getln.c, src/testdir/test_arglist.vim
+
+Patch 8.2.2414
+Problem: Using freed memory when closing the cmdline window.
+Solution: Check the window is still valid.
+Files: src/ex_getln.c
+
+Patch 8.2.2415
+Problem: No way to check for the cmdwin feature, cmdline_hist is now always
+ enabled.
+Solution: Add has('cmdwin') support. Skip arglist test on Windows
+ temporarily.
+Files: runtime/doc/cmdline.txt, src/evalfunc.c,
+ src/testdir/test_autocmd.vim, src/testdir/test_arglist.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_normal.vim, src/testdir/test_tabpage.vim,
+ src/testdir/test_termcodes.vim, src/testdir/test_window_cmd.vim
+
+Patch 8.2.2416
+Problem: May get stuck in command line window state.
+Solution: Reset "cmdwin_type" when editing buffer fails. Make arglist test
+ pass on MS-Windows.
+Files: src/ex_getln.c, src/testdir/test_arglist.vim
+
+Patch 8.2.2417
+Problem: Condition stack values may be used when not set.
+Solution: Clear cs_script_var_len and cs_block_id just in case they get used
+ later. (issue #7733)
+Files: src/ex_eval.c
+
+Patch 8.2.2418
+Problem: Color not changed if ModeMsg highlight is set in InsertEnter
+ autocmd event. (Paul Swanson)
+Solution: Call highlight_changed() after triggering InsertEnter.
+ (closes #7751)
+Files: src/edit.c
+
+Patch 8.2.2419
+Problem: Autocmd test was failing on MS-Windows with GUI.
+Solution: Remove stray feedkeys().
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.2420
+Problem: Too many problems with using all autocommand events.
+Solution: Disallow defining an autocommand for all events.
+Files: src/autocmd.c, src/errors.h, src/testdir/test_autocmd.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_window_cmd.vim
+
+Patch 8.2.2421
+Problem: Double free when using autocommand with "argdel". (Houyunsong)
+Solution: Add the arglist_locked flag.
+Files: src/arglist.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2422
+Problem: Crash when deleting with line number out of range. (Houyunsong)
+Solution: Avoid using a negative line number.
+Files: src/normal.c, src/testdir/test_ex_mode.vim
+
+Patch 8.2.2423 (after 8.2.2422)
+Problem: Missing error message.
+Solution: Add the error message.
+Files: src/errors.h
+
+Patch 8.2.2424
+Problem: Some tests are known to cause an error with ASAN.
+Solution: Add CheckNotAsan.
+Files: src/testdir/check.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_memory_usage.vim, src/testdir/test_ex_mode.vim
+
+Patch 8.2.2425
+Problem: Cursor on invalid line with range and :substitute.
+Solution: Do not move the cursor when skipping commands. (closes #3434)
+Files: src/ex_cmds.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.2.2426
+Problem: Allowing 'completefunc' to switch windows causes trouble.
+Solution: use "textwinlock" instead of "textlock".
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim,
+ src/testdir/test_popup.vim
+
+Patch 8.2.2427
+Problem: Can still switch windows for 'completefunc'.
+Solution: Also disallow switching windows for other completions.
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim,
+ src/testdir/test_popup.vim
+
+Patch 8.2.2428
+Problem: FocusGained does not work when 'ttymouse' is empty.
+Solution: Don't use the short mouse code if there is a longer matching code.
+ (closes #7755) Add a test.
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.2429
+Problem: :goto does not work correctly with text properties. (Sam McCall)
+Solution: Add a test. (Andrew Radev) Also use the text property size when
+ computing the remaining offset. (closes #5930)
+Files: src/memline.c, src/testdir/test_textprop.vim
+
+Patch 8.2.2430
+Problem: :vimgrep expands wildcards twice.
+Solution: Do not expand wildcards a second time.
+Files: src/quickfix.c, src/arglist.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.2431
+Problem: Warning for -fno-strength-reduce with Clang 11.
+Solution: Adjust check for clang version number.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2432
+Problem: Libvterm tests are executed even when libtool doesn't work.
+Solution: Only run libvterm tests if /usr/bin/gcc exists.
+Files: src/Makefile
+
+Patch 8.2.2433
+Problem: Opening cmdline window gives error in BufLeave autocommand.
+Solution: Reset cmdwin_type when triggering the autocommand.
+Files: src/ex_cmds.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.2434
+Problem: Vim9: no error when compiling str2nr() with a number.
+Solution: Add argument type checks. (closes #7759)
+Files: src/evalfunc.c, src/typval.c, src/proto/typval.pro,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2435
+Problem: setline() gives an error for some types.
+Solution: Allow any type, convert each item to a string.
+Files: runtime/doc/eval.txt, src/evalbuffer.c, src/typval.c,
+ src/proto/typval.pro, src/debugger.c, src/vim9execute.c,
+ src/testdir/test_bufline.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2436
+Problem: Vim9 script test is a bit flaky.
+Solution: Wait longer for exit callback.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2437
+Problem: Deprecation warnings with default configuration.
+Solution: Add -Wno-deprecated-declarations.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2438
+Problem: Out of bounds compiler warning.
+Solution: Increase the size of uf_name.
+Files: src/structs.h
+
+Patch 8.2.2439
+Problem: Not easy to figure out what packages to get when installing Vim on
+ a new Ubuntu system.
+Solution: Mention explicit commands that are easy to follow.
+Files: src/INSTALL
+
+Patch 8.2.2440
+Problem: Documentation based on patches is outdated.
+Solution: Add changes to documentation in a patch.
+Files: runtime/doc/arabic.txt, runtime/doc/autocmd.txt,
+ runtime/doc/change.txt, runtime/doc/channel.txt,
+ runtime/doc/cmdline.txt, runtime/doc/debugger.txt,
+ runtime/doc/develop.txt, runtime/doc/digraph.txt,
+ runtime/doc/editing.txt, runtime/doc/eval.txt,
+ runtime/doc/filetype.txt, runtime/doc/ft_sql.txt,
+ runtime/doc/gui.txt, runtime/doc/gui_w32.txt,
+ runtime/doc/gui_x11.txt, runtime/doc/hangulin.txt,
+ runtime/doc/helphelp.txt, runtime/doc/help.txt,
+ runtime/doc/if_lua.txt, runtime/doc/if_mzsch.txt,
+ runtime/doc/if_tcl.txt, runtime/doc/indent.txt,
+ runtime/doc/index.txt, runtime/doc/insert.txt,
+ runtime/doc/intro.txt, runtime/doc/map.txt, runtime/doc/mbyte.txt,
+ runtime/doc/message.txt, runtime/doc/mlang.txt,
+ runtime/doc/motion.txt, runtime/doc/netbeans.txt,
+ runtime/doc/options.txt, runtime/doc/os_dos.txt,
+ runtime/doc/os_haiku.txt, runtime/doc/os_unix.txt,
+ runtime/doc/os_vms.txt, runtime/doc/os_win32.txt,
+ runtime/doc/pattern.txt, runtime/doc/pi_getscript.txt,
+ runtime/doc/pi_logipat.txt, runtime/doc/pi_netrw.txt,
+ runtime/doc/pi_tar.txt, runtime/doc/pi_vimball.txt,
+ runtime/doc/pi_zip.txt, runtime/doc/popup.txt,
+ runtime/doc/print.txt, runtime/doc/quickfix.txt,
+ runtime/doc/quickref.txt, runtime/doc/recover.txt,
+ runtime/doc/remote.txt, runtime/doc/repeat.txt,
+ runtime/doc/rileft.txt, runtime/doc/sign.txt,
+ runtime/doc/spell.txt, runtime/doc/starting.txt,
+ runtime/doc/syntax.txt, runtime/doc/tabpage.txt,
+ runtime/doc/tagsrch.txt, runtime/doc/terminal.txt,
+ runtime/doc/term.txt, runtime/doc/testing.txt,
+ runtime/doc/textprop.txt, runtime/doc/tips.txt,
+ runtime/doc/todo.txt, runtime/doc/uganda.txt,
+ runtime/doc/undo.txt, runtime/doc/usr_02.txt,
+ runtime/doc/usr_03.txt, runtime/doc/usr_04.txt,
+ runtime/doc/usr_05.txt, runtime/doc/usr_07.txt,
+ runtime/doc/usr_08.txt, runtime/doc/usr_10.txt,
+ runtime/doc/usr_11.txt, runtime/doc/usr_20.txt,
+ runtime/doc/usr_22.txt, runtime/doc/usr_23.txt,
+ runtime/doc/usr_24.txt, runtime/doc/usr_27.txt,
+ runtime/doc/usr_30.txt, runtime/doc/usr_31.txt,
+ runtime/doc/usr_40.txt, runtime/doc/usr_41.txt,
+ runtime/doc/usr_42.txt, runtime/doc/usr_44.txt,
+ runtime/doc/usr_45.txt, runtime/doc/usr_46.txt,
+ runtime/doc/usr_90.txt, runtime/doc/usr_toc.txt,
+ runtime/doc/various.txt, runtime/doc/version5.txt,
+ runtime/doc/version6.txt, runtime/doc/version7.txt,
+ runtime/doc/version8.txt, runtime/doc/vi_diff.txt,
+ runtime/doc/vim9.txt, runtime/doc/visual.txt,
+ runtime/doc/windows.txt
+
+Patch 8.2.2441
+Problem: Vim9: extend() does not give an error for a type mismatch.
+Solution: Check the type of the second argument. (closes #7760)
+Files: src/list.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2442
+Problem: Automatic GUI selection does not check for GTK 3.
+Solution: Make SKIP_GTK3 empty for automatic GUI support. Set SKIP_GTK3 to
+ YES when checking for GTK2.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2443
+Problem: Vim9: no compile time error for wrong str2float argument.
+Solution: Check argument type. (closes #7759)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2444
+Problem: Vim9: compile error with combination of operator and list.
+Solution: Generate constants before parsing a list or dict. (closes #7757)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2445
+Problem: Vim9: no proper error for lambda missing return type.
+Solution: Check for this error. (closes #7758)
+Files: src/errors.h, src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2446
+Problem: Setting 'term' empty has different error if compiled with GUI.
+Solution: Insert "else". (closes #7766)
+Files: src/optionstr.c, src/testdir/test_options.vim
+
+Patch 8.2.2447
+Problem: 'foldlevel' not applied to folds restored from session.
+Solution: Set 'foldlevel' after creating the folds. (closes #7767)
+Files: src/fold.c, src/testdir/test_mksession.vim
+
+Patch 8.2.2448
+Problem: Compilation error with Ruby 3.0.
+Solution: Adjust #ifdefs and declaration. (Ken Takata, closes #7761)
+Files: src/if_ruby.c
+
+Patch 8.2.2449
+Problem: Vim9: flatten() always changes the list type.
+Solution: Disallow using flatten() and add flattennew().
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/list.c, src/proto/list.pro, src/errors.h, src/vim9compile.c,
+ src/testdir/test_flatten.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2450
+Problem: MS-Windows: ADS was not preserved if 'backupcopy' is "yes".
+Solution: Copy ADS before truncating the file. (Ken Takata, closes #7762)
+Files: src/bufwrite.c
+
+Patch 8.2.2451
+Problem: MS-Windows: Extended Attributes not preserved.
+Solution: Preserve Extended Attributes when writing a file. (Ken Takata,
+ closes #7765)
+Files: src/os_win32.c
+
+Patch 8.2.2452
+Problem: No completion for the 'filetype' option.
+Solution: Add filetype completion. (Martin Tournoij, closes #7747)
+Files: src/option.c, src/optiondefs.h, src/testdir/test_options.vim
+
+Patch 8.2.2453
+Problem: Vim9: a variable name with "->" in the next line doesn't work.
+Solution: Recognize a variable name by itself. (closes #7770)
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2454
+Problem: Leading space can not be made visible.
+Solution: Add "lead:" to 'listchars'. (closes #7772)
+Files: runtime/doc/options.txt, src/drawline.c, src/globals.h,
+ src/message.c, src/screen.c, src/testdir/test_listchars.vim
+
+Patch 8.2.2455
+Problem: Vim9: key type that can be used for literal dict and indexing is
+ inconsistent.
+Solution: Allow using number and bool as key for a literal dict. (#7771)
+Files: runtime/doc/vim9.txt, src/dict.c, src/eval.c, src/vim9compile.c,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2456
+Problem: Coverity warning for strcpy() into fixed size array.
+Solution: Add a type cast to hopefully silence the bogus warning.
+Files: src/userfunc.c
+
+Patch 8.2.2457
+Problem: Coverity warns for memory leak.
+Solution: Free memory when out of memory.
+Files: src/if_cscope.c
+
+Patch 8.2.2458
+Problem: Coverity warns for :retab using freed memory.
+Solution: Use the updated line pointer when moving text properties.
+Files: src/indent.c
+
+Patch 8.2.2459
+Problem: Coverity reports dead code.
+Solution: Remove the dead code.
+Files: src/eval.c
+
+Patch 8.2.2460
+Problem: Coverity warns for unused value.
+Solution: Do not reset the return value to OK.
+Files: src/vim9compile.c
+
+Patch 8.2.2461
+Problem: Coverity warns for unchecked return value.
+Solution: Add "(void)" to avoid the warning.
+Files: src/vim9execute.c
+
+Patch 8.2.2462
+Problem: Coverity warns for not checking for fseek() error.
+Solution: Give an error message if fseek() fails.
+Files: src/spellfile.c
+
+Patch 8.2.2463
+Problem: Using :arglocal in an autocommand may use freed memory.
+ (houyunsong)
+Solution: Check if the arglist is locked.
+Files: src/arglist.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2464
+Problem: Using freed memory if window closed in autocommand. (houyunsong)
+Solution: Check the window still exists.
+Files: src/ex_cmds.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2465
+Problem: Using freed memory in :psearch. (houyunsong)
+Solution: Check the current window is still valid. Fix flaky test.
+Files: src/search.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2466
+Problem: Max() and min() can give many error messages.
+Solution: Bail out at the first error. (closes #1039, closes #7778)
+Files: src/evalfunc.c, src/testdir/test_functions.vim
+
+Patch 8.2.2467
+Problem: Script generated by :mkview changes alternate file.
+Solution: Only write :balt in the session file. (Harish Rajagopal,
+ closes #7779)
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.2468
+Problem: Not easy to get the full command name from a shortened one.
+Solution: Add fullcommand(). (Martin Tournoij, closes #7777)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/ex_docmd.c, src/proto/evalfunc.pro,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.2469
+Problem: Confusing error if :winsize has a wrong argument.
+Solution: Quote the argument in the error. (closes #2523)
+Files: src/ex_docmd.c, src/testdir/test_excmd.vim
+
+Patch 8.2.2470
+Problem: Popup_getoptions() does not get textprop from other tab.
+Solution: use win_valid_any_tab(). (closes #7786)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.2471
+Problem: Popup_setoptions() does not set textprop in other tab.
+Solution: use win_valid_any_tab(). (closes #7788)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.2472
+Problem: Crash when using command line window in an autocommand.
+ (houyunsong)
+Solution: Save and restore au_new_curbuf.
+Files: src/ex_cmds.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2473
+Problem: Crash when leaving command line window triggers autocommand.
+ (houyunsong)
+Solution: Make sure not to close the current window or buffer.
+Files: src/ex_getln.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2474
+Problem: Using freed memory when window is closed by autocommand.
+ (houyunsong)
+Solution: Check the window pointer is still valid.
+Files: src/quickfix.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2475
+Problem: Autocommand tests hangs on MS-Windows.
+Solution: Skip one test.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.2476
+Problem: Using freed memory when using an autocommand to split a window
+ while a buffer is being closed.
+Solution: Disallow splitting when the buffer has b_locked_split set.
+Files: src/buffer.c, src/window.c, src/errors.h, src/structs.h,
+ src/popupwin.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2477
+Problem: Autocommand tests hang on MS-Windows.
+Solution: Skip a couple of tests. Fix file name.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.2478
+Problem: MS-Windows: backup files for plugins are loaded.
+Solution: Do not use the alternate file name for files ending in "~".
+Files: src/filepath.c
+
+Patch 8.2.2479
+Problem: set/getbufline test fails without the job feature.
+Solution: Check whether the job feature is supported. (Dominique Pellé,
+ closes #7790)
+Files: src/testdir/test_bufline.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2480
+Problem: Vim9: some errors for white space do not show context.
+Solution: Include the text at the error.
+Files: src/errors.h, src/dict.c, src/list.c, src/userfunc.c,
+ src/vim9compile.c, src/vim9script.c, src/vim9type.c
+
+Patch 8.2.2481
+Problem: Vim9: confusing error when variable arguments have a default
+ value.
+Solution: Give a specific error message. (closes #7793)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2482
+Problem: Build error.
+Solution: Add new error message.
+Files: src/errors.h
+
+Patch 8.2.2483
+Problem: Vim9: type error for malformed expression.
+Solution: Check for end of command before checking type. (closes #7795)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2484
+Problem: Vim9: Cannot use a comment starting with #{ after an expression.
+Solution: Remove the check for "{" since #{ dictionaries are not supported.
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2485
+Problem: When sourcing a script again the script version isn't reset.
+Solution: Set sn_version to one when sourcing a script again. Clear
+ sn_save_cpo properly. (closes #7608)
+Files: src/scriptfile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2486
+Problem: Vim9: some errors for white space do not show context.
+Solution: Include the text at the error.
+Files: src/errors.h, src/dict.c, src/list.c, src/userfunc.c,
+ src/vim9compile.c, src/vim9type.c
+
+Patch 8.2.2487
+Problem: Terminal shows garbage after double-wide character with a
+ combining character. (Kyoichiro Yamada)
+Solution: Libvterm: do not add the width of the combining character to the
+ glyph width. (closes #7801)
+Files: src/libvterm/src/state.c, src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_combining.dump
+
+Patch 8.2.2488
+Problem: json_encode() gives generic argument error.
+Solution: Mention the type that can't be encoded. (issue #7802)
+Files: src/json.c, src/errors.h, src/testdir/test_json.vim
+
+Patch 8.2.2489
+Problem: current buffer is wrong after deletebufline() fails to delete a
+ line in another buffer.
+Solution: Restore the current buffer.
+Files: src/evalbuffer.c, src/testdir/test_bufline.vim
+
+Patch 8.2.2490
+Problem: 'wrap' option is always reset when starting diff mode.
+Solution: Add the "followwrap" item in 'diffopt'. (Rick Howe, closes #7797)
+Files: runtime/doc/diff.txt, runtime/doc/options.txt, src/diff.c,
+ src/testdir/test_diffmode.vim
+
+Patch 8.2.2491
+Problem: Popup window for text property may show in first screen line.
+Solution: If the text position is invisible do not show the popup window.
+ (closes #7807)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popup_prop_not_visible_01.dump,
+ src/testdir/dumps/Test_popup_prop_not_visible_02.dump,
+ src/testdir/dumps/Test_popup_prop_not_visible_03.dump
+
+Patch 8.2.2492
+Problem: Command line buffer name cannot be translated.
+Solution: Add _(). (Gabriel Dupras, closes #7812)
+Files: src/ex_getln.c
+
+Patch 8.2.2493
+Problem: Text property for text left of window shows up.
+Solution: Check if the text property ends before the current column.
+ (closes #7806)
+Files: src/drawline.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_textprop_nowrap_01.dump,
+ src/testdir/dumps/Test_textprop_nowrap_02.dump
+
+Patch 8.2.2494
+Problem: ":rviminfo!" clears most of oldfiles.
+Solution: Add VIF_ONLY_CURBUF to read_viminfo(). (closes #1781)
+Files: src/viminfo.c, src/vim.h
+
+Patch 8.2.2495
+Problem: Text jumps up and down when moving the cursor in a small window
+ with wrapping text and 'scrolloff' set.
+Solution: Adjust the computation of w_skipcol. (partly by Ghjuvan Lacambre,
+ closes #7813)
+Files: src/move.c, src/testdir/test_breakindent.vim
+
+Patch 8.2.2496 (after 8.2.2495)
+Problem: Insufficient testing for text jumping fix.
+Solution: Add another test case.
+Files: src/testdir/test_breakindent.vim
+
+Patch 8.2.2497
+Problem: No error when using more than one character for a register name.
+Solution: In Vim9 script check for a single character string. (closes #7814)
+ Fix that VAR_BOOL and VAR_SPECIAL are not considered equal.
+Files: src/errors.h, src/evalfunc.c, src/typval.c,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2498
+Problem: No test for what 8.2.2494 fixes.
+Solution: Add a simple change to test the fix. (closes #7818)
+Files: src/testdir/test_viminfo.vim
+
+Patch 8.2.2499
+Problem: "vim -g --version" does not redirect output.
+Solution: Reset gui.starting when showing version info. (closes #7815)
+Files: src/main.c, src/testdir/test_version.vim
+
+Patch 8.2.2500 (after 8.2.2499)
+Problem: Build fails without the GUI feature.
+Solution: Add #ifdef.
+Files: src/main.c
+
+Patch 8.2.2501
+Problem: Not always clear where an error is reported.
+Solution: Add the where_T structure and pass it around. (closes #7796)
+Files: src/structs.h, src/vim9type.c, src/proto/vim9type.pro,
+ src/errors.h, src/evalvars.c, src/proto/evalvars.pro, src/eval.c,
+ src/proto/eval.pro, src/vim9execute.c, src/vim9script.c,
+ src/proto/vim9script.pro, src/dict.c, src/list.c,
+ src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2502
+Problem: A few github actions are failing.
+Solution: Install setuptools-rust. (closes #7823)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.2503
+Problem: Vim9: a caught error may leave something on the stack.
+Solution: Drop items from the stack if needed. (closes #7826)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2504
+Problem: Vim9: crash when using an argument from a closure.
+Solution: Check if gen_load_outer is NULL. (closes #7821)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2505
+Problem: Vim9: crash after defining function with invalid return type.
+Solution: Clear function growarrays. Fix memory leak.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2506
+Problem: Vim9: :continue does not work correctly in a :try block
+Solution: Add the TRYCLEANUP instruction. (closes #7827)
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2507
+Problem: Github build may fail if Ubuntu 20.04 is used. Installing rust is
+ not needed.
+Solution: Specify ubuntu-18.04 instead of latest. Update "pip" instead of
+ installing rust. (Ozaki Kiichi, closes #7820)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.2508
+Problem: Cannot change the character displayed in non existing lines.
+Solution: Add the "eob" item to 'fillchars'. (closes #7832, closes #3820)
+Files: runtime/doc/options.txt, runtime/doc/todo.txt,
+ runtime/doc/windows.txt, src/drawscreen.c, src/globals.h,
+ src/optiondefs.h, src/screen.c, src/testdir/test_display.vim
+
+Patch 8.2.2509
+Problem: Tests fail on s390 build.
+Solution: Initialize trycmd_T.
+Files: src/vim9execute.c
+
+Patch 8.2.2510
+Problem: Internal error when popup with mask is zero height or width.
+Solution: Bail out if width or height is zero. (closes #7831)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.2511
+Problem: Vim9: cannot use Vim9 script syntax in some places.
+Solution: Add the :vim9cmd command modifier. Incompatible: Makes ":vim9"
+ mean ":vim9cmd" instead of ":vim9script".
+Files: runtime/doc/vim9.txt, runtime/doc/repeat.txt, src/ex_docmd.c,
+ src/ex_cmds.h, src/structs.h, src/ex_cmdidxs.h, src/errors.h,
+ src/testdir/test_vim9_cmd.vim, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_1.dump,
+ src/testdir/dumps/Test_wildmenu_2.dump,
+ src/testdir/dumps/Test_wildmenu_3.dump,
+ src/testdir/dumps/Test_wildmenu_4.dump,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.2512
+Problem: Vim9: compiling error test sometimes fails.
+Solution: use WaitForAssert() instead of sleeping for a bit. (Dominique
+ Pellé, closes #7837)
+Files: src/testdir/term_util.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2513 (after 8.2.2511)
+Problem: Vim9: missing part of :vim9cmd change.
+Solution: Use command modifier in in_vim9script().
+Files: src/vim9script.c
+
+Patch 8.2.2514 (after 8.2.2511)
+Problem: Vim9: build error in tiny version.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.2.2515
+Problem: Memory access error when truncating an empty message.
+Solution: Check for an empty string. (Dominique Pellé, closes #7841)
+Files: src/message.c, src/message_test.c
+
+Patch 8.2.2516
+Problem: Test failure on s390. (analyses by James McCoy)
+Solution: Only set the try_finally label when not skipping.
+Files: src/vim9compile.c
+
+Patch 8.2.2517
+Problem: Vim9: fix for s390 not tested on other systems.
+Solution: Add a test.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2518
+Problem: 'listchars' should be window-local.
+Solution: Make 'listchars' global-local. (Yegappan Lakshmanan, Marco Hinz,
+ closes #5206, closes #7850)
+Files: runtime/doc/options.txt, src/buffer.c, src/charset.c,
+ src/drawline.c, src/drawscreen.c, src/evalfunc.c, src/globals.h,
+ src/indent.c, src/message.c, src/misc1.c, src/option.c,
+ src/option.h, src/optiondefs.h, src/optionstr.c,
+ src/proto/screen.pro, src/screen.c, src/structs.h,
+ src/testdir/test_listchars.vim, src/testdir/test_listlbr.vim
+
+Patch 8.2.2519
+Problem: Vim9: no reason to keep strange Vi behavior.
+Solution: ":3" and ":3|" both go to line 3. ":|" does not print the line.
+ (closes #7840)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2520
+Problem: Missing tests for 'listchars'.
+Solution: Add a few more checks. (Yegappan Lakshmanan, closes #7854)
+Files: src/testdir/test_listchars.vim
+
+Patch 8.2.2521
+Problem: Some compilers can't handle pointer initialization. (John
+ Marriott)
+Solution: Use a local struct and assign it afterwards.
+Files: src/screen.c
+
+Patch 8.2.2522
+Problem: Beancount filetype not recognized.
+Solution: Add a detection rule. (Brian Ryall, closes #7859)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2523
+Problem: Svelte filetype not recognized.
+Solution: Add a detection rule. (Brian Ryall, closes #7858)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2524
+Problem: Cannot change the characters displayed in the foldcolumn.
+Solution: Add fields to 'fillchars'. (Yegappan Lakshmanan, Matthieu Coudron,
+ closes #7860)
+Files: runtime/doc/options.txt, src/globals.h, src/mouse.c, src/screen.c,
+ src/testdir/test_display.vim
+
+Patch 8.2.2525
+Problem: Vim9: only local variables checked for a name.
+Solution: Also check arguments and script variables. (closes #7838)
+Files: src/vim9compile.c, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2526 (after 8.2.2525)
+Problem: Build failure.
+Solution: Change lookup_scriptvar() arguments.
+Files: src/evalvars.c, src/proto/evalvars.pro
+
+Patch 8.2.2527
+Problem: Vim9: lambda return type is not determined at script level.
+Solution: Compile the lambda to get the return type. (closes #7843)
+Files: src/eval.c, src/vim.h, src/vim9.h,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2528
+Problem: Vim9: crash when compiling lambda fails.
+Solution: Bail out after compilation fails. (closes #7862)
+Files: src/eval.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2529
+Problem: Vim9: Not possible to use legacy and Vim9 script in one file.
+Solution: Vim9: allow for "if false" before :vim9script. (closes #7851)
+Files: runtime/doc/vim9.txt, src/ex_docmd.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2530
+Problem: Vim9: not enough testing for profiling.
+Solution: Add a test with nested functions and a lambda. Fix profiling
+ for calling a compiled function.
+Files: src/profiler.c, src/proto/profiler.pro, src/userfunc.c,
+ src/vim9execute.c, src/testdir/test_profile.vim
+
+Patch 8.2.2531
+Problem: Vim9: the :k command is obscure.
+Solution: Disallow using :k, can use :mark instead. (closes #7874)
+Files: runtime/doc/vim9.txt, src/ex_docmd.c, src/vim9script.c,
+ src/vim9compile.c, src/ex_cmds.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2532
+Problem: Vim9: confusing error if :k is used with a range.
+Solution: Give an error about the range. (issue #7874)
+Files: src/vim9script.c, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2533
+Problem: Vim9: cannot use a range with :unlet.
+Solution: Implement ISN_UNLETRANGE.
+Files: src/errors.h, src/eval.c, src/evalvars.c, src/list.c,
+ src/proto/evalvars.pro, src/proto/list.pro, src/vim9.h,
+ src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2534
+Problem: Missing test coverage.
+Solution: Improve test coverage for completion with different encodings,
+ mapset(), and term function failures. (Dominique Pellé,
+ closes #7877)
+Files: src/testdir/test_edit.vim, src/testdir/test_maparg.vim,
+ src/testdir/test_terminal3.vim
+
+Patch 8.2.2535
+Problem: MS-Windows: cannot run all vim9 tests.
+Solution: Make test_vim9 target work.
+Files: src/Make_mvc.mak
+
+Patch 8.2.2536
+Problem: Coverity complains about unchecked return value.
+Solution: Add (void).
+Files: src/userfunc.c
+
+Patch 8.2.2537
+Problem: Vim9: crash when map() fails.
+Solution: Clear typval before using it. (closes #7884)
+Files: src/list.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2538
+Problem: Crash when using Python list iterator.
+Solution: Increment the list reference count. (closes #7886)
+Files: src/if_py_both.h, src/testdir/test_python3.vim
+
+Patch 8.2.2539
+Problem: Vim9: return from finally block causes a hang.
+Solution: Store both the finally and endtry indexes. (closes #7885)
+Files: src/vim9execute.c, src/vim9compile.c, src/vim9.h,
+ src/testdir/test_vim9_script.vim,
+
+Patch 8.2.2540
+Problem: Vim9: no error for using script var name for argument.
+Solution: Check for this error. (closes #7868)
+Files: src/userfunc.c, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2541
+Problem: Popup_create() does not allow boolean for "cursorline".
+Solution: Use dict_get_bool(). (issue #7869)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.2542
+Problem: Highlight of char beyond line end is not correct. (Chuan Wei Foo)
+Solution: Fix counting NUL as one cell. Draw one more character if the EOL
+ is part of the match. (closes #7883)
+Files: src/match.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_hlsearch_1.dump,
+ src/testdir/dumps/Test_hlsearch_2.dump
+
+Patch 8.2.2543
+Problem: Vim9: a return inside try/catch does not restore exception state
+ properly.
+Solution: When there is no ":finally" jump to ":endtry". (closes #7882)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2544
+Problem: Vim9: error for argument when checking for lambda.
+Solution: Respect the skip flag. (closes #7887)
+Files: src/userfunc.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2545
+Problem: Errors and crash when terminal window is zero height. (Leonid V.
+ Fedorenchik)
+Solution: Do not resize when width or height is zero. (closes #7890)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.2546
+Problem: Typo in mouse key name.
+Solution: Fix the typo. (issue #4725)
+Files: src/misc2.c
+
+Patch 8.2.2547
+Problem: "%" command not accurate for big files.
+Solution: Make it more accurate for files up to 21M lines. (Dominique Pellé,
+ closes #7889)
+Files: src/normal.c
+
+Patch 8.2.2548
+Problem: May get stuck in the cmdline window using :normal.
+Solution: Have nv_esc() return K_IGNORE.
+Files: src/normal.c
+
+Patch 8.2.2549
+Problem: Crash after using "g:" in a for loop.
+Solution: Increment the reference count. (closes #7892)
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2550
+Problem: Signal stack size is wrong with latest glibc 2.34.
+Solution: Use sysconf(_SC_SIGSTKSZ) if available. (Zdenek Dohnal, closes
+ #7895)
+Files: src/config.h.in, src/configure.ac, src/os_unix.c,
+ src/auto/configure
+
+Patch 8.2.2551
+Problem: MS-Windows: colors test file is not installed.
+Solution: Also copy runtime/colors/tools. (Ken Takata, closes #7902)
+Files: nsis/gvim.nsi
+
+Patch 8.2.2552
+Problem: Vim9: no reason to consider "{{{{{{{{" a command.
+Solution: Just use "{". (issue #7904)
+Files: src/ex_cmds.h
+
+Patch 8.2.2553
+Problem: Vim9: Cannot put "|" after "{".
+Solution: Add the EX_TRLBAR flag. (issue #7904)
+Files: src/ex_cmds.h, src/ex_eval.c
+
+Patch 8.2.2554
+Problem: Vim9: exporting a final is not tested.
+Solution: Add a test.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2555
+Problem: Vim9: missing test for 8.2.2553.
+Solution: Add a simple test.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2556
+Problem: Vim9: :import with "as" not fully supported.
+Solution: Implement "as" for more cases.
+Files: src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2557
+Problem: Compiler warning for shadowed variable.
+Solution: Declare "p" only once.
+Files: src/vim9script.c
+
+Patch 8.2.2558
+Problem: No error if a lambda argument shadows a variable.
+Solution: Check that the argument name shadows a local, argument or script
+ variable. (closes #7898)
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/userfunc.c,
+ src/vim9script.c, src/errors.h, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2559
+Problem: MS-Windows: guifont test fails on Windows XP.
+Solution: Check windowsversion().
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.2560
+Problem: Setting 'winminheigt' does not take tabline into account.
+Solution: Subtract the tabline from the available height. (closes #7899)
+Files: src/window.c, src/testdir/test_options.vim
+
+Patch 8.2.2561
+Problem: Not all textprop code is covered by tests.
+Solution: Add a few more test cases. (Dominique Pellé, closes #7908)
+Files: src/testdir/test_textprop.vim
+
+Patch 8.2.2562
+Problem: GUI: star register changed when 'clipboard' is "unnamedplus". (Ingo
+ Karkat)
+Solution: Do not change the star register when 'clipboard' contains
+ "unnamedplus" and not "unnamed". (closes #1516)
+Files: src/register.c
+
+Patch 8.2.2563
+Problem: Cannot use multibyte characters for folding in 'fillchars'.
+Solution: Port pull request 11568 to Vim. (Yegappan Lakshmanan,
+ closes #7924)
+Files: src/drawline.c, src/drawscreen.c, src/macros.h,
+ src/proto/screen.pro, src/screen.c, src/testdir/test_fold.vim,
+ src/testdir/test_profile.vim
+
+Patch 8.2.2564
+Problem: Focus events end Insert mode if 'esckeys' is not set.
+Solution: Do not enable focus events when 'esckeys' is off. (closes #7926)
+Files: src/term.c
+
+Patch 8.2.2565
+Problem: Vim9: "..=" not always recognized.
+Solution: Do not consider "..=" to be string concatenation. (closes #7905)
+Files: src/eval.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2566
+Problem: Vim9: Function name is not recognized.
+Solution: Change lookup_scriptvar() to also find function names.
+ (closes #7770)
+Files: src/vim9script.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2567
+Problem: Vim9: no error if variable is defined for existing function.
+Solution: Check if name isn't already in use. (closes #7897)
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2568
+Problem: Second time a preview popup is opened highlight is not set.
+ (Gabriel Dupras)
+Solution: Apply 'previewpopup' after getting the file. (closes #7928)
+Files: src/tag.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_previewpopup_2.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_3.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_4.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_5.dump
+
+Patch 8.2.2569
+Problem: 'fillchars' "stl" and "stlnc" items must be single byte.
+Solution: Accept multi-byte characters. (Christian Wellenbrock, Yegappan
+ Lakshmanan, closes #7927)
+Files: runtime/doc/options.txt, src/buffer.c, src/macros.h, src/screen.c,
+ src/testdir/test_fold.vim, src/testdir/test_statusline.vim
+
+Patch 8.2.2570
+Problem: Tests fail when run as root.
+Solution: Add a comment mentioning the expected failure. (issue #7919)
+Files: src/testdir/test_edit.vim, src/testdir/test_excmd.vim,
+ src/testdir/test_help.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.2571
+Problem: Test may leave file behind.
+Solution: Delete the temporary file. Don't profile in the running Vim
+ instance.
+Files: src/testdir/test_quickfix.vim, src/testdir/test_profile.vim
+
+Patch 8.2.2572
+Problem: Vim9: crash when getting the types for a legacy function.
+Solution: Initialize the type list growarray. (closes #7929)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2573
+Problem: Vim9: using invalid pointer for error message.
+Solution: Use the right pointer. (closes #7921)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2574
+Problem: Vim9: crash when calling partial with wrong function.
+Solution: Check argument types of called function. (closes #7912)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2575
+Problem: Vim9: a function name with "->" in the next line doesn't work.
+Solution: Recognize a function name by itself. (closes #7770)
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2576
+Problem: Vim9: defining a :func function checks for white space after a
+ comma in the arguments.
+Solution: Only check for white space in a :def function. (closes #7930)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2577
+Problem: Compiler warning for type conversion.
+Solution: Add a typecast. (Mike Williams)
+Files: src/drawline.c
+
+Patch 8.2.2578
+Problem: Lua cannot handle a passed in lambda.
+Solution: Handle VAR_PARTIAL. (Prabir Shrestha, closes #7937, closes #7936)
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.2579
+Problem: Vim9: crash in garbagecollect after for loop.
+Solution: Do not set a reference in script item when the name was cleared.
+ (closes #7935)
+Files: src/evalvars.c
+
+Patch 8.2.2580
+Problem: Vim9: checking vararg type is wrong when function is auto-loaded.
+Solution: Use the member type. (closes #7933)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2581
+Problem: Vim9: sourcing Vim9 script triggers a redraw.
+Solution: Do not let setting/restoring 'cpoptions' cause a redraw.
+ (closes #7920)
+Files: src/vim.h, src/option.c, src/optionstr.c, src/scriptfile.c,
+ src/vim9script.c, src/testdir/test_vim9_script.vim,
+ src/testdir/dumps/Test_vim9_no_redraw.dump
+
+Patch 8.2.2582 (after 8.2.2581)
+Problem: Vim9: screendump test fails on MS-Windows.
+Solution: Use :function instead of :def.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2583
+Problem: Vim9: cannot compare result of getenv() with null.
+Solution: Make the return type of getenv() "any". (closes #7943)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2584
+Problem: Vim9: type error for assigning the result of list concatenation to
+ a list.
+Solution: Do not consider concatenation result in a constant. (closes #7942)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2585
+Problem: Vim9: illegal memory access.
+Solution: Check byte right after "null", not one more.
+Files: src/vim9compile.c
+
+Patch 8.2.2586
+Problem: Process id may be invalid.
+Solution: Use sysinfo.uptime to check for recent reboot. (suggested by Hugo
+ van der Sanden, closes #7947)
+Files: src/configure.ac, src/auto/configure, src/config.h.in,
+ src/memline.c, src/testing.c, src/globals.h,
+ src/testdir/test_recover.vim
+
+Patch 8.2.2587 (after 8.2.2586)
+Problem: Recover test fails on FreeBSD.
+Solution: Check for Linux.
+Files: src/testdir/check.vim, src/testdir/test_recover.vim
+
+Patch 8.2.2588 (after 8.2.2586)
+Problem: Build failure with tiny features.
+Solution: Add #ifdef. Run recover test separately.
+Files: src/memline.c, src/testdir/Make_all.mak, src/testdir/test_alot.vim
+
+Patch 8.2.2589 (after 8.2.2586)
+Problem: Recover test hangs in the GUI.
+Solution: Add g:skipped_reason to skip a _nocatch_ test.
+Files: src/testdir/runtest.vim, src/testdir/test_recover.vim
+
+Patch 8.2.2590
+Problem: Vim9: default argument value may cause internal error.
+Solution: Hide later function arguments when compiling the expression.
+ (closes #7948)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2591
+Problem: Poke files are not recognized.
+Solution: Add a filetype entry. (Matt Ihlenfield)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2592
+Problem: Code coverage could be improved.
+Solution: Add a few more tests. (Dominique Pellé, closes #7957)
+Files: src/testdir/test_fileformat.vim, src/testdir/test_normal.vim,
+ src/testdir/test_sleep.vim, src/testdir/test_textformat.vim,
+ src/testdir/test_viminfo.vim
+
+Patch 8.2.2593
+Problem: List of distributed files is incomplete.
+Solution: Add a file and rename another.
+Files: Filelist
+
+Patch 8.2.2594
+Problem: Alternate buffer added to session file even when it's hidden.
+Solution: Check the 'buflisted' option. (closes #7951)
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.2595
+Problem: Setting 'winminheight' may cause 'lines' to change.
+Solution: Also take minimal height of other tabpages into account. (#7899)
+Files: src/window.c, src/testdir/test_options.vim
+
+Patch 8.2.2596
+Problem: :doautocmd may confuse scripts listening to WinEnter.
+Solution: Do the current buffer last. (closes #7958)
+Files: src/autocmd.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.2597
+Problem: Vim9: "import * as" does not work at script level.
+Solution: Implement using an imported namespace.
+Files: src/vim.h, src/eval.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/vim9execute.c, src/errors.h, src/vim9script.c,
+ src/proto/vim9script.pro, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2598
+Problem: Vim9: :open does not need to be supported.
+Solution: Do not support :open in Vim9 script.
+Files: src/ex_docmd.c, src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2599 (after 8.2.2597)
+Problem: Build failure.
+Solution: Add missing change.
+Files: src/vim9compile.c
+
+Patch 8.2.2600
+Problem: Vim9: crash when putting an unknown type in a dictionary.
+ (Yegappan Lakshmanan)
+Solution: Handle a NULL type pointer.
+Files: src/vim9type.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2601
+Problem: Memory usage test often fails on FreeBSD.
+Solution: Increase multiplier for upper limit.
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.2.2602
+Problem: Vim9: continue doesn't work if :while is very first command.
+ (Yegappan Lakshmanan)
+Solution: Add one to the continue instruction index.
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2603
+Problem: Vim9: no effect if user command is also a function.
+Solution: Check for paren following. (closes #7960)
+Files: src/evalvars.c, src/proto/evalvars.pro, src/ex_docmd.c,
+ src/proto/ex_docmd.pro, src/vim9compile.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2604
+Problem: GUI-specific command line arguments not tested.
+Solution: Add tests for several arguments. (Dominique Pellé, closes #7962)
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.2605
+Problem: Vim9: string index and slice does not include composing chars.
+Solution: Include composing characters. (issue #6563)
+Files: runtime/doc/vim9.txt, src/vim9execute.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2606
+Problem: strchars() defaults to counting composing characters.
+Solution: Add strcharlen() which ignores composing characters.
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/testdir/test_utf8.vim
+
+Patch 8.2.2607
+Problem: strcharpart() cannot include composing characters.
+Solution: Add the {skipcc} argument.
+Files: runtime/doc/eval.txt, src/evalfunc.c,
+ src/testdir/test_expr_utf8.vim
+
+Patch 8.2.2608
+Problem: Character input not fully tested.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #7963)
+Files: src/testdir/test_functions.vim, src/testdir/test_messages.vim,
+ src/testdir/test_paste.vim, src/testdir/test_registers.vim,
+ src/testdir/test_undo.vim
+
+Patch 8.2.2609
+Problem: Test disabled on MS-Windows even though it should work.
+Solution: Restore the condition for skipping the test. (Ken Takata,
+ closes #7970)
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.2610
+Problem: Mouse click test fails when using remote connection.
+Solution: Use a larger 'mousetime'. (Dominique Pellé, closes #7968)
+Files: src/testdir/test_selectmode.vim
+
+Patch 8.2.2611
+Problem: Conditions for startup tests are not exactly right.
+Solution: Check for type of GUI instead of MS-Windows. (Ozaki Kiichi,
+ closes #7976)
+Files: src/main.c, src/testdir/check.vim, src/testdir/test_startup.vim
+
+Patch 8.2.2612
+Problem: col('.') may get outdated column value.
+Solution: Add a note to the help how to make this work and add a test for
+ it. (closes #7971)
+Files: runtime/doc/map.txt, src/testdir/test_mapping.vim
+
+Patch 8.2.2613 (after 8.2.2612)
+Problem: New test throws exception.
+Solution: Adjust the function cleanup.
+Files: src/testdir/test_mapping.vim
+
+Patch 8.2.2614
+Problem: Vim9: function is deleted while executing.
+Solution: increment the call count, when more than zero do not delete the
+ function but mark it as dead. (closes #7977)
+Files: src/vim9execute.c, src/userfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2615 (after 8.2.2614)
+Problem: Test is sourcing the wrong file.
+Solution: Correct the file name.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2616
+Problem: Vim9: if 'cpo' is changed in Vim9 script it may be restored.
+Solution: Apply the changes to 'cpo' to the restored value.
+Files: runtime/doc/vim9.txt, src/scriptfile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2617
+Problem: Vim9: script variable in a block scope not found by a nested
+ function.
+Solution: Copy the block scope IDs before compiling the function.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2618
+Problem: Vim9: cannot use a normal list name to store function refs.
+Solution: Allow a lower case name if it is indexed.
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2619
+Problem: Vim9: no test for return type of lambda.
+Solution: Add a test.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.2620
+Problem: Vim9: Using #{ for a dictionary gives strange errors.
+Solution: Give an error when using #{ for a comment after a command.
+Files: src/vim9compile.c, src/vim9script.c, src/proto/vim9script.pro,
+ src/errors.h, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2621
+Problem: typval2type() cannot handle recursive structures.
+Solution: Use copyID. (closes #7979)
+Files: src/list.c, src/vim9script.c, src/vim9type.c,
+ src/proto/vim9type.pro, src/testdir/test_vimscript.vim
+
+Patch 8.2.2622
+Problem: GTK: error when starting up and -geometry is given. (Dominique
+ Pellé)
+Solution: Use another function to get the monitor if the window has not been
+ created yet. (closes #7978)
+Files: src/gui_gtk_x11.c, src/proto/gui_gtk_x11.pro, src/gui_beval.c,
+ src/gui_xim.c
+
+Patch 8.2.2623
+Problem: Some tests fail when run as root.
+Solution: Use CheckNotRoot.
+Files: src/testdir/test_edit.vim, src/testdir/test_excmd.vim,
+ src/testdir/test_help.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.2624
+Problem: Atom files not recognized.
+Solution: Recognize .atom as XML. (Kivin Locke, closes #7986)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2625
+Problem: Rss files not recognized.
+Solution: Recognize .rss as XML. (Kivin Locke, closes #7987)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2626
+Problem: GTK3: error when starting up and -geometry is given. (Dominique
+ Pellé)
+Solution: Use another function to get the monitor if the window has not been
+ created yet. (closes #7978)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.2627
+Problem: No need to check for BSD after checking for not root.
+Solution: Remove CheckNotBSD. (Ozaki Kiichi, closes #7989)
+Files: src/testdir/test_excmd.vim, src/testdir/test_help.vim,
+ src/testdir/check.vim
+
+Patch 8.2.2628
+Problem: Vim9: #{ can still be used at the script level.
+Solution: Give an error for #{ like in a :def function.
+Files: src/eval.c, src/ex_docmd.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2629
+Problem: Vim9: error for #{{ is not desired.
+Solution: Adjust the checks. (closes #7990)
+Files: src/errors.h, src/vim9script.c, src/ex_docmd.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2630
+Problem: Hard to see where a test gets stuck.
+Solution: Print the executed test function. (Dominique Pellé, closes #7975)
+Files: src/testdir/Makefile
+
+Patch 8.2.2631
+Problem: Commands from winrestcmd() do not always work properly. (Leonid V.
+ Fedorenchik)
+Solution: Repeat the size commands twice. (closes #7988)
+Files: src/evalwindow.c, src/testdir/test_window_cmd.vim
+
+Patch 8.2.2632
+Problem: Not all command line arguments are tested.
+Solution: Add tests for -D and -serverlist. (Dominique Pellé, closes #7992)
+Files: src/testdir/test_clientserver.vim, src/testdir/test_startup.vim
+
+Patch 8.2.2633
+Problem: Multi-byte 'fillchars' for folding do not show properly.
+Solution: Handle multi-byte characters correctly. (Yegappan Lakshmanan,
+ closes #7983, closes #7955)
+Files: src/screen.c, src/testdir/test_fold.vim
+
+Patch 8.2.2634
+Problem: 'tagfunc' does not indicate using a pattern.
+Solution: Add the "r" flag. (Andy Massimino, closes #7982)
+Files: runtime/doc/tagsrch.txt, src/tag.c, src/testdir/test_tagfunc.vim
+
+Patch 8.2.2635
+Problem: Vim9: cannot define an inline function.
+Solution: Make an inline function mostly work.
+Files: src/userfunc.c, src/errors.h, src/vim9compile.c, src/misc2.c,
+ src/proto/vim9compile.pro, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2636 (after 8.2.2635)
+Problem: Memory leak when compiling inline function.
+Solution: Free the prefetched line.
+Files: src/userfunc.c, src/vim9compile.c, src/structs.h, src/globals.h,
+ src/eval.c
+
+Patch 8.2.2637
+Problem: prop_remove() causes a redraw even when nothing changed.
+Solution: Only redraw if a property was removed. (Dominique Pellé)
+Files: src/textprop.c
+
+Patch 8.2.2638
+Problem: Cannot write a message to the terminal from the GUI.
+Solution: Add :echoconsole and use it in the test runner. (issue #7975)
+Files: runtime/doc/eval.txt, runtime/doc/index.txt, src/ex_cmds.h,
+ src/ex_cmdidxs.h, src/eval.c, src/ui.c, src/proto/ui.pro,
+ src/term.c, src/testdir/runtest.vim
+
+Patch 8.2.2639 (after 8.2.2638)
+Problem: Build failure when fsync() is not available.
+Solution: Add #ifdef.
+Files: src/ui.c
+
+Patch 8.2.2640
+Problem: screenstring() returns non-existing composing characters.
+Solution: Only use composing characters if there is a base character.
+Files: src/evalfunc.c, src/testdir/test_listchars.vim
+
+Patch 8.2.2641
+Problem: Display test fails because of lacking redraw.
+Solution: Add a redraw command.
+Files: src/testdir/test_display.vim
+
+Patch 8.2.2642
+Problem: Vim9: no clear error for wrong inline function.
+Solution: Check for something following the "{".
+Files: src/userfunc.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2643
+Problem: Various code not covered by tests.
+Solution: Add a few more test. (Yegappan Lakshmanan, closes #7995)
+Files: src/testdir/test_edit.vim, src/testdir/test_functions.vim,
+ src/testdir/test_mapping.vim, src/testdir/test_termcodes.vim,
+ src/testdir/test_undo.vim
+
+Patch 8.2.2644
+Problem: prop_clear() causes a screen update even when nothing changed.
+Solution: Only redraw when a property was cleared. (Dominique Pellé)
+Files: src/textprop.c
+
+Patch 8.2.2645
+Problem: Using inline function is not properly tested.
+Solution: Add test cases, esp. for errors. Minor code improvements.
+Files: src/userfunc.c, src/errors.h, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2646
+Problem: Vim9: error for not using string doesn't mention argument.
+Solution: Add argument number.
+Files: src/filepath.c, src/typval.c, src/proto/typval.pro, src/errors.h,
+ src/mbyte.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2647
+Problem: Terminal test sometimes hangs.
+Solution: Wait for the shell to display a prompt.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.2648
+Problem: Terminal resize test sometimes hangs.
+Solution: Wait for the shell to display a prompt and other output.
+Files: src/testdir/test_terminal2.vim
+
+Patch 8.2.2649
+Problem: Vim9: some wincmd arguments cause a white space error.
+Solution: Insert a space before the count. (closes #8001)
+Files: src/window.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2650
+Problem: Vim9: command modifiers not handled in nested function.
+Solution: Keep function-local info in a structure and save it on the stack.
+Files: src/vim9execute.c, src/vim9.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2651
+Problem: Vim9: restoring command modifiers happens after jump.
+Solution: Move the restore instruction to before the jump. (closes #8006)
+ Also handle for and while.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2652
+Problem: Vim9: can use command modifier without an effect.
+Solution: Give an error for a misplaced command modifier. Fix error message
+ number.
+Files: src/vim9compile.c, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/ex_eval.c, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2653
+Problem: Build failure.
+Solution: Add missing changes.
+Files: src/errors.h
+
+Patch 8.2.2654
+Problem: Vim9: getting a character from a string can be slow.
+Solution: Avoid a function call to get the character byte size. (#8000)
+Files: src/vim9execute.vim
+
+Patch 8.2.2655
+Problem: The -w command line argument doesn't work.
+Solution: Don't set 'window' when set with the -w argument. (closes #8011)
+Files: src/term.c, src/testdir/test_startup.vim
+
+Patch 8.2.2656
+Problem: Some command line arguments and regexp errors not tested.
+Solution: Add a few test cases. (Dominique Pellé, closes #8013)
+Files: src/testdir/test_regexp_latin.vim, src/testdir/test_startup.vim
+
+Patch 8.2.2657
+Problem: Vim9: error message for declaring variable in for loop.
+Solution: Clear variables when entering block again. (closes #8012)
+Files: src/ex_eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2658
+Problem: :for cannot loop over a string.
+Solution: Accept a string argument and iterate over its characters.
+Files: runtime/doc/eval.txt, src/eval.c, src/vim9compile.c,
+ src/vim9execute.c, src/errors.h, src/testdir/test_vimscript.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2659 (after 8.2.2658)
+Problem: Eval test fails because for loop on string works.
+Solution: Check looping over function reference fails.
+Files: src/testdir/test_eval_stuff.vim
+
+Patch 8.2.2660
+Problem: Vim9: no error for declaration with trailing text.
+Solution: Give an error. (closes #8014)
+Files: src/evalvars.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2661
+Problem: Leaking memory when looping over a string.
+Solution: Free the memory.
+Files: src/eval.c
+
+Patch 8.2.2662
+Problem: There is no way to avoid some escape sequences.
+Solution: Suppress escape sequences when the --not-a-term argument is used.
+ (Gary Johnson)
+Files: src/main.c, src/os_unix.c, src/testdir/test_startup.vim
+
+Patch 8.2.2663
+Problem: Vim9: leaking memory when inline function has an error.
+Solution: Free the partially allocated function.
+Files: src/userfunc.c
+
+Patch 8.2.2664
+Problem: Vim9: not enough function arguments checked for string.
+Solution: Check in balloon functions. Refactor function arguments.
+Files: src/typval.c, src/proto/typval.pro, src/filepath.c,
+ src/evalfunc.c, src/mbyte.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2665 (after 8.2.2664)
+Problem: Test failures.
+Solution: Check more specific feature. Add missing change.
+Files: src/testdir/test_vim9_builtin.vim, src/evalbuffer.c
+
+Patch 8.2.2666
+Problem: Vim9: not enough function arguments checked for string.
+Solution: Check in ch_logfile(), char2nr() and others.
+Files: src/channel.c, src/evalfunc.c, src/filepath.c, src/eval.c,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2667
+Problem: prop_find() cannot find item matching both id and type.
+Solution: Add the "both" argument. (Naohiro Ono, closes #8019)
+Files: runtime/doc/textprop.txt, src/testdir/test_textprop.vim,
+ src/textprop.c
+
+Patch 8.2.2668
+Problem: Vim9: omitting "call" for "confirm()" does not give an error.
+Solution: Do not recognize a modifier followed by "(".
+Files: src/ex_docmd.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2669
+Problem: Command line completion does not work after "vim9".
+Solution: Include the "9". (Naohiro Ono, closes #8025)
+Files: src/cmdexpand.c, src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.2670
+Problem: Vim9: error for append(0, text).
+Solution: Check for negative number. (closes #8022)
+Files: src/typval.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2671 (after 8.2.2670)
+Problem: Error for line number in legacy script.
+Solution: Check for number type.
+Files: src/typval.c
+
+Patch 8.2.2672
+Problem: Vim9: cannot use :lockvar and :unlockvar in compiled script.
+Solution: Implement locking support.
+Files: src/vim9compile.c, src/errors.h, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2673
+Problem: Vim9: script-local funcref can have lower case name.
+Solution: Require an upper case name.
+Files: src/evalvars.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2674
+Problem: Motif: cancelling the font dialog resets the font.
+Solution: When no font is selected to not change the font. (closes #7825,
+ closes #8035) Fix compiler warnings.
+Files: src/gui_x11.c, src/gui_motif.c
+
+Patch 8.2.2675
+Problem: Directory change in a terminal window shell is not followed.
+Solution: Add the 'autoshelldir' option. (closes #6290)
+Files: runtime/doc/options.txt, runtime/doc/quickref.txt,
+ runtime/optwin.vim, src/charset.c, src/feature.h, src/option.h,
+ src/optiondefs.h, src/terminal.c, src/testdir/check.vim,
+ src/testdir/test_terminal3.vim
+
+Patch 8.2.2676
+Problem: Missing error message.
+Solution: Add new error message.
+Files: src/errors.h
+
+Patch 8.2.2677
+Problem: Vim9: cannot use only some of the default arguments.
+Solution: Use v:none to use default argument value. Remove
+ uf_def_arg_idx[], use JUMP_IF_ARG_SET. (closes #6504)
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/vim9execute.c,
+ src/userfunc.c, src/structs.h, src/vim9.h,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2678
+Problem: Test for 'autoshelldir' does not reset the option.
+Solution: Reset the option after testing.
+Files: src/testdir/test_terminal3.vim
+
+Patch 8.2.2679
+Problem: Winbar drawn over status line for non-current window with winbar
+ if frame is zero height. (Leonid V. Fedorenchik)
+Solution: Do not draw the window if the frame height is zero. (closes #8037)
+Files: src/drawscreen.c, src/testdir/test_winbar.vim,
+ src/testdir/dumps/Test_winbar_not_visible.dump
+
+Patch 8.2.2680
+Problem: Vim9: problem defining a script variable from legacy function.
+Solution: Check if the script is Vim9, not the current syntax.
+ (closes #8032)
+Files: src/vim9script.c, src/proto/vim9script.pro, src/evalvars.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2681
+Problem: Vim9: test fails for redeclaring script variable.
+Solution: It's OK to assign to an existing script variable in legacy.
+Files: src/evalvars.c
+
+Patch 8.2.2682
+Problem: Vim9: cannot find Name.Func from "import * as Name". (Alexander
+ Goussas)
+Solution: When no variable found try finding a function. (closes #8045)
+ Check that the function was exported.
+Files: src/vim9compile.c, src/vim9script.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2683
+Problem: Build failure without the +eval feature.
+Solution: Add #ifdef.
+Files: src/vim9script.c
+
+Patch 8.2.2684
+Problem: Not enough folding code is tested.
+Solution: Add more test cases. (Yegappan Lakshmanan, closes #8046)
+Files: src/testdir/test_fold.vim, src/testdir/test_mksession.vim,
+ src/testdir/test_source.vim
+
+Patch 8.2.2685 (after 8.2.2152)
+Problem: Custom statusline not drawn correctly with WinBar.
+Solution: Also adjust the column for the custom status line. (Yee Cheng
+ Chin, closes #8047)
+Files: src/drawscreen.c, src/proto/drawscreen.pro, src/screen.c,
+ src/testdir/dumps/Test_winbar_not_visible_custom_statusline.dump,
+ src/testdir/test_winbar.vim
+
+Patch 8.2.2686
+Problem: Status line is not updated when going to cmdline mode.
+Solution: Redraw status lines if 'statusline' is set and going to status
+ line mode. (based on patch from Justin M. Keyes et al.,
+ closes #8044)
+Files: src/ex_getln.c, src/testdir/test_statusline.vim,
+ src/testdir/dumps/Test_statusline_mode_1.dump,
+ src/testdir/dumps/Test_statusline_mode_2.dump
+
+Patch 8.2.2687
+Problem: Vim9: cannot use "const" for global variable in :def function.
+Solution: Do allow using :const for a global variable. (closes #8030)
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2688
+Problem: Vim9: crash when using s: for script variable.
+Solution: Pass the end pointer. (closes #8045)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2689
+Problem: Tiny build fails.
+Solution: Add #ifdef around use of p_stl.
+Files: src/ex_getln.c
+
+Patch 8.2.2690
+Problem: PowerShell files are not recognized.
+Solution: Recognize several PowerShell extension. (Heath Stewart,
+ closes #8051)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2691
+Problem: Autoconf may mess up compiler flags.
+Solution: Handle removing FORTIFY_SOURCE a bit better. (Vladimir Lomov,
+ closes #8049)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2692
+Problem: Vim9: locked script variable can be changed.
+Solution: Check for locked value. (closes #8031)
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2693
+Problem: Vim9: locked script variable can be changed.
+Solution: Check legacy script variable for being locked. (issue #8031)
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2694
+Problem: When 'matchpairs' is empty every character beeps. (Marco Hinz)
+Solution: Bail out when no character in 'matchpairs' was found.
+ (closes #8053) Add assert_nobeep().
+Files: runtime/doc/testing.txt, runtime/doc/eval.txt, src/search.c,
+ src/testing.c, src/proto/testing.pro, src/evalfunc.c,
+ src/testdir/test_textformat.vim
+
+Patch 8.2.2695
+Problem: Cursor position reset with nested autocommands.
+Solution: Only check and reset line numbers for not nested autocommands.
+ (closes #5820)
+Files: src/autocmd.c, src/testdir/test_terminal.vim
+
+Patch 8.2.2696
+Problem: Lua test fails with Lua 5.4.3 and later.
+Solution: Check for different error messages. (Yegappan Lakshmanan,
+ closes #8050)
+Files: src/testdir/test_lua.vim
+
+Patch 8.2.2697
+Problem: Function list test fails.
+Solution: Add missing function. (Yegappan Lakshmanan)
+Files: runtime/doc/usr_41.txt
+
+Patch 8.2.2698 (after 8.2.2696)
+Problem: Lua test fails on MS-Windows.
+Solution: Fall back to old method if "lua -v" doesn't work.
+Files: src/testdir/test_lua.vim
+
+Patch 8.2.2699
+Problem: Lua test fails.
+Solution: Fix condition. (Yegappan Lakshmanan, closes #8060)
+Files: src/testdir/test_lua.vim
+
+Patch 8.2.2700
+Problem: Nested autocmd test fails sometimes.
+Solution: Wait for the job to finish.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.2701
+Problem: Order of removing FORTIFY_SOURCE is wrong.
+Solution: Use the more specific pattern first.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2702
+Problem: Compiler completion test fails when more scripts are added.
+Solution: Add a more generic pattern.
+Files: src/testdir/test_compiler.vim
+
+Patch 8.2.2703
+Problem: Vim9: memory leak when failing on locked variable.
+Solution: Free the memory.
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2704
+Problem: Adding a lot of completions can be a bit slow.
+Solution: Use fast_breakcheck() instead of ui_breakcheck() when adding a
+ list of completions. (Ben Jackson, closes #8061)
+Files: src/insexpand.c
+
+Patch 8.2.2705
+Problem: Vim9: misleading reported line number for wrong type.
+Solution: Remember and use the line number at the start. (closes #8059)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2706
+Problem: Vim9: wrong line number reported for boolean operator.
+Solution: Use the line number before skipping over line break.
+ (closes #8058)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2707 (after 8.2.2704)
+Problem: Adding a lot of completions can still be a bit slow.
+Solution: Add the check for CP_FAST. (Ben Jackson)
+Files: src/insexpand.c
+
+Patch 8.2.2708
+Problem: Test sometimes fails waiting for shell in terminal.
+Solution: Use WaitForAssert() so we can see the actual job status. Use
+ Run_shell_in_terminal().
+Files: src/testdir/term_util.vim, src/testdir/test_mksession.vim
+
+Patch 8.2.2709
+Problem: The GTK GUI has a gap next to the scrollbar.
+Solution: Calculate the scrollbar padding for GTK. (closes #8027)
+Files: src/gui_gtk.c
+
+Patch 8.2.2710
+Problem: Vim9: not all tests cover script and :def function.
+Solution: Run tests in both if possible. Fix differences.
+Files: src/eval.c, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/vim9.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2711
+Problem: "gj" in a closed fold does not move out of the fold. (Marco Hinz)
+Solution: Add a check for being in a closed fold. (closes #8062)
+Files: src/normal.c, src/testdir/test_fold.vim
+
+Patch 8.2.2712
+Problem: Memory leak when adding to a blob fails.
+Solution: Clear the second typval before returning.
+Files: src/eval.c
+
+Patch 8.2.2713
+Problem: Folding code not sufficiently tested.
+Solution: Add a few more test cases. (Yegappan Lakshmanan, closes #8064)
+Files: src/testdir/test_fold.vim
+
+Patch 8.2.2714
+Problem: Filetype pattern ending in star is too far up.
+Solution: Move down to where patterns ending in star belong. (closes #8065)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2715
+Problem: Vim9: tests fail without the channel feature. (Dominique Pellé)
+Solution: Check for the channel feature. (closes #8063)
+Files: src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2716
+Problem: The equivalent class regexp is missing some characters.
+Solution: Update the list of equivalent characters. (Dominique Pellé,
+ closes #8029)
+Files: src/regexp_bt.c, src/regexp_nfa.c,
+ src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.2717
+Problem: GTK menu items don't show a tooltip.
+Solution: Add a callback to show the tooltip. (Leonid V. Fedorenchik,
+ closes #8067, closes #7810)
+Files: src/gui_gtk.c
+
+Patch 8.2.2718
+Problem: Vim9: no explicit test for using a global function without the g:
+ prefix.
+Solution: Add a test case.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.2719
+Problem: Vim9: appending to dict item doesn't work in a :def function.
+Solution: Implement assignment with operator on indexed item.
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2720
+Problem: GTK menu tooltip moves the cursor.
+Solution: Position the cursor after displaying the tooltip. Do not show the
+ tooltip when editing the command line.
+Files: src/gui_gtk.c
+
+Patch 8.2.2721
+Problem: Vim9: cannot have a linebreak inside a lambda.
+Solution: Compile the expression before the arguments.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2722
+Problem: Vim9: crash when using LHS with double index.
+Solution: Handle lhs_dest which is "dest_expr". (closes #8068)
+ Fix confusing error message for missing dict item.
+Files: src/vim9compile.c, src/eval.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2723 (after 8.2.2722)
+Problem: Assignment test fails.
+Solution: Adjust error number.
+Files: src/testdir/test_let.vim
+
+Patch 8.2.2724 (after 8.2.2722)
+Problem: Vim9: concatenating to list in dict not tested.
+Solution: Add a test. (issue #8068)
+Files: src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2725
+Problem: Vim9: message about compiling is wrong when using try/catch.
+Solution: Store the compiling flag with the message. (closes #8071)
+Files: src/ex_docmd.c, src/ex_eval.c, src/structs.h,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2726
+Problem: Confusing error message with white space before comma in the
+ arguments of a function declaration.
+Solution: Give a specific error message. (closes #2235)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2727 (after 8.2.2726)
+Problem: Function test fails.
+Solution: Adjust expected error number.
+Files: src/testdir/test_user_func.vim
+
+Patch 8.2.2728
+Problem: Special key names don't work if 'isident' is cleared.
+Solution: Add vim_isNormalIDc() and use it for special key names.
+ (closes #2389)
+Files: src/charset.c, src/proto/charset.pro, src/misc2.c,
+ src/testdir/test_mapping.vim
+
+Patch 8.2.2729
+Problem: Vim9: wrong error message for referring to legacy script variable.
+Solution: Do allow referring to a variable in legacy script without "s:" if
+ it exists at compile time. (closes #8076)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2730
+Problem: Coverity complains about not restoring character.
+Solution: Also restore the character in case of an error.
+Files: src/vim9compile.c
+
+Patch 8.2.2731
+Problem: Mac: SF symbols are not displayed properly.
+Solution: Add custom range to list of double-width characters. (Yee Cheng
+ Chin, closes #8077)
+Files: src/mbyte.c
+
+Patch 8.2.2732
+Problem: Prompt for s///c in Ex mode can be wrong.
+Solution: Position the cursor before showing the prompt. (closes #8073)
+Files: src/ex_cmds.c, src/testdir/test_ex_mode.vim
+
+Patch 8.2.2733
+Problem: Detecting Lua version is not reliable.
+Solution: Add "vim.lua_version". (Ozaki Kiichi, closes #8080)
+Files: runtime/doc/if_lua.txt, ci/if_ver-1.vim, src/if_lua.c,
+ src/testdir/test_lua.vim
+
+Patch 8.2.2734
+Problem: Vim9: cannot use legacy script-local var from :def function.
+Solution: Do not insist on using "s:" prefix. (closes #8076)
+Files: src/vim9compile.c, src/proto/vim9compile.pro,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2735
+Problem: Vim9: function reference found with prefix, not without.
+Solution: Also find function reference without prefix.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2736
+Problem: Vim9: for loop over string is a bit slow.
+Solution: Avoid using strlen().
+Files: src/vim9execute.c
+
+Patch 8.2.2737
+Problem: Status line not updated when local 'statusline' option set.
+Solution: Check the 'statusline' option of each window.
+Files: src/ex_getln.c, src/testdir/test_statusline.vim,
+ src/testdir/dumps/Test_statusline_mode_1.dump,
+ src/testdir/dumps/Test_statusline_mode_2.dump
+
+Patch 8.2.2738
+Problem: Extending a list with itself can give wrong result.
+Solution: Remember the item before where the insertion happens and skip to
+ after the already inserted items. (closes #1112)
+Files: src/list.c, src/testdir/test_listdict.vim
+
+Patch 8.2.2739
+Problem: Vim9: a lambda accepts too many arguments at the script level.
+Solution: Do not set uf_varargs in Vim9 script.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2740
+Problem: Vim9: lambda with varargs doesn't work.
+Solution: Make "...name" work. Require type to be a list.
+Files: src/userfunc.c, src/vim9compile.c, src/vim9execute.c,
+ src/errors.h, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2741
+Problem: Vim9: Partial call does not check right arguments.
+Solution: Adjust the offset for whether the partial is before or after the
+ arguments. (closes #8091)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2742
+Problem: Vim9: when compiling a function fails it is cleared.
+Solution: Keep the function lines, prevent execution with a different
+ status. (closes #8093)
+Files: src/vim9compile.c, src/structs.h, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2743
+Problem: Vim9: function state stuck when compiling with ":silent!".
+Solution: Check for uf_def_status to be UF_COMPILING.
+Files: src/vim9compile.c, src/message.c, src/globals.h,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2744
+Problem: Vim9: no way to explicitly ignore an argument.
+Solution: Use the underscore as the name for an ignored argument.
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/eval.c,
+ src/evalvars.c, src/errors.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2745 (after 8.2.2744)
+Problem: Vim9: missing part of the argument change.
+Solution: Add missing changes.
+Files: src/userfunc.c
+
+Patch 8.2.2746 (after 8.2.2745)
+Problem: Check for duplicate arguments does not work.
+Solution: Correct condition.
+Files: src/userfunc.c
+
+Patch 8.2.2747
+Problem: Vim9: not always an error for too many function arguments.
+Solution: Check for getting too many arguments.
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2748
+Problem: Vim9: memory leak when calling :def function fails.
+Solution: Jump to failed_early instead of returning.
+Files: src/vim9execute.c
+
+Patch 8.2.2749
+Problem: Vim9: test for error can be a bit flaky.
+Solution: Increase the wait time a bit.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.2750
+Problem: Vim9: error for using underscore in nested function.
+Solution: Do not consider "_" already defined. (closes #8096)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2751
+Problem: Coverity warns for using NULL pointer.
+Solution: Check for NULL in calling function.
+Files: src/userfunc.c
+
+Patch 8.2.2752
+problem: coverity reports unreachable code.
+Solution: Remove check for positive index.
+Files: src/typval.c
+
+Patch 8.2.2753
+Problem: Vim9: cannot ignore an item in assignment unpack.
+Solution: Allow using an underscore.
+Files: runtime/doc/vim9.txt, src/vim.h, src/evalvars.c, src/eval.c,
+ src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2754
+Problem: :sleep! does not always hide the cursor.
+Solution: Add the cursor_is_asleep flag. (Jeremy Lerner, closes #8097,
+ closes #7998)
+Files: src/drawscreen.c, src/ex_docmd.c, src/gui.c, src/proto/term.pro,
+ src/term.c
+
+Patch 8.2.2755
+Problem: Vim9: no error for using a number in a condition.
+Solution: Also use ISN_COND2BOOL if the type is t_number_bool.
+ (closes #7644)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2756
+Problem: Vim9: blob index and slice not implemented yet.
+Solution: Implement blob index and slice.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/eval.c,
+ src/blob.c, src/proto/blob.pro, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2757
+Problem: Vim9: blob tests for legacy and Vim9 script are separate.
+Solution: Add CheckLegacyAndVim9Success(). Make blob index assign work.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/errors.h,
+ src/blob.c, src/proto/blob.pro, src/eval.c, src/ex_docmd.c,
+ src/testdir/vim9.vim, src/testdir/test_blob.vim
+
+Patch 8.2.2758
+Problem: Vim9: wrong line number for autoload function with wrong name.
+Solution: Set and restore SOURCING_LNUM. (closes #8100)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2759
+Problem: Vim9: for loop infers type of loop variable.
+Solution: Do not get the member type. (closes #8102)
+Files: src/vim9type.c, src/proto/vim9type.pro, src/list.c,
+ src/vim9script.c, src/proto/vim9script.pro, src/vim.h,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2760
+Problem: Vim9: no error for changing a for loop variable.
+Solution: Make the loop variable read-only. (issue #8102)
+Files: src/eval.c, src/evalvars.c, src/vim9compile.c, src/vim.h,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2761
+Problem: Using "syn include" does not work properly.
+Solution: Don't add current_syn_inc_tag to topgrp. (Jaehwang Jerry Jung,
+ closes #8104)
+Files: src/syntax.c, src/testdir/test_syntax.vim
+
+Patch 8.2.2762
+Problem: Vim9: function line truncated when compiling.
+Solution: Copy the line before processing it. (closes #8101)
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2763
+Problem: Vim9: cannot use type in for loop unpack at script level.
+Solution: Advance over the type name.
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2764
+Problem: Memory leak when default function argument is allocated.
+Solution: Free the expression result.
+Files: src/userfunc.c, src/testdir/test_functions.vim
+
+Patch 8.2.2765
+Problem: Vim9: not all blob operations work.
+Solution: Run more tests also with Vim9 script and :def functions. Fix what
+ doesn't work.
+Files: src/eval.c, src/blob.c, src/proto/blob.pro, src/vim9execute.c,
+ src/errors.h, src/testdir/vim9.vim, src/testdir/test_blob.vim
+
+Patch 8.2.2766 (after 8.2.2765)
+Problem: Test failure.
+Solution: Add change to Vim9 compilation error message.
+Files: src/vim9compile.c
+
+Patch 8.2.2767 (after 8.2.2765)
+Problem: Compiler warning for unused argument.
+Solution: Remove the argument.
+Files: src/blob.c, src/proto/blob.pro, src/vim9execute.c, src/eval.c
+
+Patch 8.2.2768
+Problem: Vim9: memory leak with blob range error.
+Solution: Jump to end instead of returning.
+Files: src/vim9compile.c
+
+Patch 8.2.2769
+Problem: Modula-3 config files are not recognized.
+Solution: Add filetype patterns. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2770
+Problem: Vim9: type of loop variable is not used.
+Solution: Parse and check the variable type. (closes #8107)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2771
+Problem: Vim9: assignment not recognized if declaration was skipped.
+Solution: Also recognized an assignment if the variable does not exist.
+ (closes #8108)
+Files: src/ex_docmd.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2772
+Problem: Problems when restoring 'runtimepath' from a session file.
+Solution: Add the "skiprtp" item in 'sessionoptions'.
+Files: runtime/doc/options.txt, src/session.c, src/optionstr.c,
+ src/option.h, src/vim.h, src/option.c,
+ src/testdir/test_mksession.vim
+
+Patch 8.2.2773
+Problem: PSL filetype not recognized.
+Solution: Add a filetype pattern. (Daniel Kho, closes #8117)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2774
+Problem: Vim9: cannot import an existing name even when using "as".
+Solution: Do not check for an existing name when using "as". (closes #8113)
+Files: src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2775
+Problem: Vim9: wrong line number used for some commands.
+Solution: For :exe, :echo and the like use the line number of the start of
+ the command. When calling a function set the line number in the
+ script context.
+Files: src/vim9compile.c, src/vim9execute.c, src/structs.h,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2776
+Problem: :mksession uses current value of 'splitbelow' and 'splitright'
+ even though "options" is not in 'sessionoptions'. (Maxim Kim)
+Solution: Save and restore the values, instead of setting to the current
+ value. (closes #8119)
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.2777
+Problem: Vim9: blob operations not tested in all ways.
+Solution: Run tests with CheckLegacyAndVim9Success(). Make blob assign with
+ index work.
+Files: src/vim9compile.c, src/vim9execute.c, src/errors.h, src/blob.c,
+ src/proto/blob.pro, src/testdir/test_blob.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2778
+Problem: Problem restoring 'packpath' in session.
+Solution: Let "skiprtp" also apply to 'packpath'.
+Files: runtime/doc/options.txt, src/option.c,
+ src/testdir/test_mksession.vim
+
+Patch 8.2.2779
+Problem: Memory access error in remove() for blob.
+Solution: Adjust length for memmove().
+Files: src/blob.c
+
+Patch 8.2.2780
+Problem: Vim9: for loop over blob doesn't work.
+Solution: Make it work.
+Files: src/vim9compile.c, src/vim9execute.c, src/testdir/test_blob.vim
+
+Patch 8.2.2781
+Problem: Add() silently skips when adding to null list or blob.
+Solution: Give an error in Vim9 script. Allocate blob when it is NULL like
+ with list and dict.
+Files: src/list.c, src/evalvars.c, src/vim9execute.c,
+ src/testdir/test_blob.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2782
+Problem: Vim9: blob operations not fully tested.
+Solution: Make more blob tests run in Vim9 script. Fix filter(). Make
+ insert() give an error for a null blob, like add().
+Files: src/list.c, src/testdir/test_blob.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2783
+Problem: Duplicate code for setting byte in blob, blob test may fail.
+Solution: Call blob_set_append(). Test sort failure with "N".
+Files: src/eval.c, src/testdir/test_blob.vim
+
+Patch 8.2.2784
+Problem: Vim9: cannot use \=expr in :substitute.
+Solution: Compile the expression into instructions and execute them when
+ invoked.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/proto/vim9execute.pro, src/regexp.c, src/ex_cmds.c,
+ src/proto/ex_cmds.pro, src/globals.h,
+ src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2785
+Problem: Vim9: cannot redirect to local variable.
+Solution: Compile :redir when redirecting to a variable.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/errors.h,
+ src/evalvars.c, src/proto/evalvars.pro,
+ src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2786
+Problem: Vim9: memory leak when using :s with expression.
+Solution: Clean up the instruction list.
+Files: src/vim9compile.c
+
+Patch 8.2.2787
+Problem: MS-Windows: crash when using :echoconsole.
+Solution: Do not write a NUL when it's already there.
+Files: src/os_win32.c
+
+Patch 8.2.2788
+Problem: Raku is now the only name what once was called perl6.
+Solution: Adjust the filetype detection. (closes #8120)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2789
+Problem: Vim9: using \=expr in :substitute does not handle jumps.
+Solution: Start with instruction count zero. (closes #8128)
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2790 (after 8.2.2788)
+Problem: filetype test fails
+Solution: Also update the scripts detection
+Files: runtime/scripts.vim
+
+Patch 8.2.2791
+Problem: Vim9: memory leak when using \=expr in :substitute.
+Solution: Do not allocate a new instruction list.
+Files: src/vim9compile.c
+
+Patch 8.2.2792
+Problem: Vim9: :disas shows instructions for default args but no text.
+Solution: Show the expression test above the default argument instructions.
+ (closes #8129)
+Files: src/vim9execute.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2793
+Problem: MS-Windows: string literals are writable with MSVC.
+Solution: Add the /GF compiler flag. Make mch_write() safer. (Ken Takata,
+ closes #8133)
+Files: src/Make_mvc.mak, src/os_win32.c
+
+Patch 8.2.2794
+Problem: Linux users don't know how to get ncurses.
+Solution: Add the name of the package. (closes #8132)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2795
+Problem: Coverity warns for not using return value.
+Solution: Check the return value of compiling the substitute expression.
+Files: src/vim9compile.c
+
+Patch 8.2.2796
+Problem: Vim9: redir to variable does not accept an index.
+Solution: Make the index work.
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2797
+Problem: Search highlight disappears in the Visual area.
+Solution: Combine the search attributes. (closes #8134)
+Files: src/drawline.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_hlsearch_visual_1.dump
+
+Patch 8.2.2798
+Problem: Vim9: redir to variable with append does not accept an index.
+Solution: Make the appending work.
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2799
+Problem: Vim9: type casts don't fully work at the script level.
+Solution: Implement the missing piece.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2800
+Problem: After a timer displays text a hit-enter prompt is given.
+Solution: Reset msg_didany and need_wait_return. (closes #8136)
+Files: src/drawscreen.c, src/testdir/test_timers.vim
+
+Patch 8.2.2801
+Problem: Free Pascal makefile not recognized.
+Solution: Add the fpcmake filetype. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2802
+Problem: Vim9: illegal memory access.
+Solution: Check for comment before checking for white space. (closes #8142)
+Files: src/eval.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2803
+Problem: Flicker when the popup menu has an info popup.
+Solution: Avoid drawing over the popup when it's going to be redrawn in the
+ same position. (closes #8131) Also avoid redrawing the scrollbar.
+Files: src/popupmenu.c, src/proto/popupmenu.pro, src/drawscreen.c,
+ src/globals.h
+
+Patch 8.2.2804
+Problem: Setting buffer local mapping with mapset() changes global mapping.
+Solution: Only set the local mapping. (closes #8143)
+Files: src/map.c, src/testdir/test_maparg.vim
+
+Patch 8.2.2805
+Problem: Vim9: cannot use legacy syntax in Vim9 script.
+Solution: Add the :legacy command.
+Files: src/ex_cmds.h, runtime/doc/vim9.txt, runtime/doc/index.txt
+ src/ex_cmdidxs.h, src/ex_docmd.c, src/structs.h, src/vim9script.c,
+ src/vim9compile.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2806
+Problem: Vim9: using "++nr" as a command might not work.
+Solution: Do not recognize "++" and "--" in a following line as addition or
+ subtraction.
+Files: src/vim9compile.c, src/ex_docmd.c, src/ex_cmds.h, src/ex_cmdidxs.h,
+ src/vim9script.c, src/proto/vim9script.pro, src/eval.c,
+ src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2807
+Problem: Build fails with tiny features.
+Solution: Use a dummy function for ex_incdec().
+Files: src/ex_docmd.c
+
+Patch 8.2.2808
+Problem: Vim9: increment and decrement not sufficiently tested.
+Solution: Add assertions.
+Files: src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2809
+Problem: Vim9: :def function compilation fails when using :legacy.
+Solution: Reset CMOD_LEGACY when compiling a function. (closes #8137)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2810
+Problem: Vim9: crash when calling a function in a substitute expression.
+Solution: Set the instructions back to the substitute expression
+ instructions. (closes #8148)
+Files: src/vim9execute.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2811
+Problem: Vim9: error for missing white space doesn't say where it is
+ missing
+Solution: Mention the command. (closes #8149)
+Files: src/ex_docmd.c, src/errors.h, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2812
+Problem: Vim9: still crash when using substitute expression.
+Solution: Put the instruction list in the stack frame. (closes #8154)
+Files: src/vim9execute.c, src/vim9.h, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2813
+Problem: Cannot grep using fuzzy matching.
+Solution: Add the "f" flag to :vimgrep. (Yegappan Lakshmanan, closes #8152)
+Files: runtime/doc/quickfix.txt, src/ex_cmds.c, src/proto/search.pro,
+ src/quickfix.c, src/search.c, src/vim.h,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.2814 (after 8.2.2812)
+Problem: Vim9: unused variable. (John Marriott)
+Solution: Adjust #ifdef.
+Files: src/vim9execute.c
+
+Patch 8.2.2815
+Problem: Status line flickers when redrawing popup menu info.
+Solution: Do not redraw the status line when the focus is in the popup
+ window. (issue #8144)
+Files: src/popupmenu.c
+
+Patch 8.2.2816
+Problem: Vim9: comment below expression in lambda causes problems.
+Solution: Use a single space for empty and comment lines. (closes #8156)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2817
+Problem: Vim9: script sourcing continues after an error.
+Solution: Make an error in any command in "vim9script" abort sourcing.
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2818
+Problem: No jump added to jumplist when opening terminal in current window.
+Solution: Call setpcmark(). (closes #8158)
+Files: src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.2819
+Problem: Finishing an abbreviation with a multi-byte char may not work.
+Solution: Escape K_SPECIAL in the typed character. (closes #8160)
+Files: src/map.c, src/testdir/test_mapping.vim
+
+Patch 8.2.2820
+Problem: Session file may divide by zero.
+Solution: Avoid writing divide by zero. (closes #8162)
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.2821
+Problem: MS-Windows: unnecessarily loading libraries when registering OLE.
+Solution: Skip loading libraries when invoked with "-register".
+Files: src/main.c, src/globals.h, src/os_win32.c
+
+Patch 8.2.2822 (after 8.2.2821)
+Problem: MS-Windows: unnecessarily loading libraries when unregistering OLE.
+Solution: Also skip loading libraries when invoked with "-unregister". Run
+ Vim for README.txt with user privileges.
+Files: src/main.c, nsis/gvim.nsi, nsis/README.txt
+
+Patch 8.2.2823
+Problem: MS-Windows: launching Vim from installer doesn't open README.
+Solution: Adjust the quotes.
+Files: nsis/gvim.nsi
+
+Patch 8.2.2824
+Problem: MS-Windows: build failure with MSVC.
+Solution: Adjust the list of distributed files. Add hint about python.
+ Adjust path for reading runtime files.
+Files: Filelist, src/testdir/shared.vim,
+ src/testdir/test_function_lists.vim
+
+Patch 8.2.2825
+Problem: Code in checkreadonly() not fully tested.
+Solution: Add more tests. (Dominique Pellé, closes #8169)
+Files: src/testdir/test_excmd.vim
+
+Patch 8.2.2826
+Problem: Compiler warnings for int to size_t conversion. (Randall W.
+ Morris)
+Solution: Add type casts.
+Files: src/map.c, src/quickfix.c
+
+Patch 8.2.2827
+Problem: Test file was not deleted.
+Solution: Uncomment the delete() call. (Dominique Pellé, closes #8172)
+Files: src/testdir/test_mksession.vim
+
+Patch 8.2.2828
+Problem: Coverity complains about not checking the rename() return value.
+Solution: Add "(void)", can't do anything in case of a failure.
+Files: src/fileio.c
+
+Patch 8.2.2829
+Problem: Some comments are not correct or clear.
+Solution: Adjust the comments. Add test for cursor position.
+Files: src/regexp_bt.c, src/regexp_nfa.c,
+ src/testdir/test_exec_while_if.vim,
+ src/testdir/test_substitute.vim
+
+Patch 8.2.2830
+Problem: Terminal colors are not updated when 'background' is set.
+Solution: Call term_update_colors() for all terminals. (Marcin Szamotulski,
+ closes #8171, closes #8150)
+Files: src/terminal.c, src/proto/terminal.pro, src/optionstr.c
+
+Patch 8.2.2831
+Problem: Vim9: expandcmd() not tested.
+Solution: Add a test.
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2832
+Problem: Operator cancelled by moving mouse when using popup. (Sergey
+ Vlasov)
+Solution: Do not trigger an operator for a mouse move events. (closes #8176)
+Files: src/normal.c
+
+Patch 8.2.2833
+Problem: Two key command cancelled by moving mouse when using popup.
+ (Sergey Vlasov)
+Solution: Ignore K_MOUSEMOVE in plain_vgetc().
+Files: src/getchar.c
+
+Patch 8.2.2834
+Problem: Vim9: :cexpr does not work with local variables.
+Solution: Compile :cexpr.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/quickfix.c,
+ src/proto/quickfix.pro, src/testdir/test_quickfix.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2835 (after 8.2.2834)
+Problem: Vim9: leaking memory in :cexpr.
+Solution: Also free the command line copy.
+Files: src/vim9compile.c
+
+Patch 8.2.2836 (after 8.2.2834)
+Problem: Build failure without the +quickfix feature. (John Marriott)
+Solution: Add #ifdef.
+Files: src/vim9compile.c, src/vim9execute.c, src/tag.c
+
+Patch 8.2.2837
+Problem: Various code lines not covered by tests.
+Solution: Add test cases. (Dominique Pellé, closes #8178)
+Files: src/testdir/test_excmd.vim, src/testdir/test_functions.vim,
+ src/testdir/test_options.vim, src/testdir/test_startup.vim,
+ src/testdir/test_syntax.vim, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2838
+Problem: File extension .wrap not recognized.
+Solution: Use dosini filetype for .wrap files. (Liam Beguin, closes #8177)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2839
+Problem: Default redirection missing "ash" and "dash".
+Solution: Recognize "ash" and "dash". (Natanael Copa, closes #8180)
+Files: runtime/doc/options.txt, src/option.c
+
+Patch 8.2.2840
+Problem: Vim9: member operation not fully tested.
+Solution: Add a few tests.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2841
+Problem: MS-Windows: cursor in wrong position when 'lazyredraw' and
+ 'statusline' are set.
+Solution: Call compute_cmdrow(). (closes #8170, closes #8184)
+Files: src/os_win32.c
+
+Patch 8.2.2842
+Problem: Vim9: skip argument to searchpair() is not compiled.
+Solution: Add VAR_INSTR.
+Files: src/structs.h, src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/proto/vim9execute.pro, src/eval.c, src/evalfunc.c, src/vim.h,
+ src/evalvars.c, src/typval.c, src/vim9type.c, src/testing.c,
+ src/viminfo.c, src/if_py_both.h, src/json.c,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2843 (after 8.2.2842)
+Problem: Vim9: skip argument to searchpairpos() is not compiled.
+Solution: Handle like searchpair(). Also for search() and searchpos().
+Files: src/vim9compile.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2844
+Problem: Vim9: memory leak when using searchpair().
+Solution: Free the v_instr field.
+Files: src/typval.c
+
+Patch 8.2.2845
+Problem: MS-Windows: warning for signed/unsigned comparison.
+Solution: Add type cast.
+Files: src/terminal.c
+
+Patch 8.2.2846
+Problem: Vim9: "echo Func()" does not give an error for a function without
+ a return value.
+Solution: Give an error. Be more specific about why a value is invalid.
+Files: src/globals.h, src/errors.h, src/eval.c, src/evalfunc.c,
+ src/typval.c, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2847
+Problem: Perl not tested sufficiently.
+Solution: Add test. Also test W17. (Dominique Pellé, closes #8193)
+Files: src/testdir/test_arabic.vim, src/testdir/test_perl.vim
+
+Patch 8.2.2848
+Problem: Crash when calling partial.
+Solution: Check for NULL pointer. (Dominique Pellé, closes #8202)
+Files: src/eval.c, src/evalfunc.c, src/testdir/test_functions.vim,
+ src/testdir/test_listdict.vim
+
+Patch 8.2.2849
+Problem: Bufwrite not sufficiently tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8192)
+Files: src/testdir/test_startup.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.2850
+Problem: Recalling commands from history is not tested.
+Solution: Add tests. (closes #8194)
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.2.2851
+Problem: Using <Cmd> mapping on the command line triggers CmdlineChanged.
+ (Naohiro Ono)
+Solution: Jump to cmdline_not_changed if the command line didn't change.
+ (closes #8208)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.2852
+Problem: Configure can add --as-needed a second time.
+Solution: Only add --as-needed if not already there. (Natanael Copa,
+ closes #8189, closes #8181)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2853 (after 8.2.2851)
+Problem: Window is not updated after using <Cmd> mapping.
+Solution: So jump to cmdline_changed but skip autocommand.
+Files: src/ex_getln.c
+
+Patch 8.2.2854
+Problem: Custom statusline cannot contain % items.
+Solution: Add "%{% expr %}". (closes #8190)
+Files: runtime/doc/options.txt, src/buffer.c, src/optionstr.c,
+ src/testdir/test_statusline.vim
+
+Patch 8.2.2855
+Problem: White space after "->" does not give E274.
+Solution: Do not skip white space in legacy script. (closes #8212)
+Files: src/eval.c, src/testdir/test_method.vim
+
+Patch 8.2.2856
+Problem: Get readonly error for device that can't be written to.
+Solution: Check for being able to write first. (closes #8205)
+Files: src/ex_cmds.c, src/testdir/test_writefile.vim
+
+Patch 8.2.2857
+Problem: Vim9: exception in ISN_INSTR caught at wrong level.
+Solution: Set the starting trylevel in exec_instructions(). (closes #8214)
+Files: src/vim9compile.c, src/vim9execute.c, src/globals.h,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2858 (after 8.2.2857)
+Problem: Test fails because of changed error message.
+Solution: Adjust the expected error message.
+Files: src/testdir/test_ex_mode.vim
+
+Patch 8.2.2859 (after 8.2.2857)
+Problem: Tcl test fails because of changed error message.
+Solution: Adjust the expected error message.
+Files: src/testdir/test_tcl.vim
+
+Patch 8.2.2860
+Problem: Adding a text property causes the whole window to be redrawn.
+Solution: Use changed_lines_buf() to only redraw the affected lines.
+Files: src/change.c, src/proto/change.pro, src/textprop.c
+
+Patch 8.2.2861
+Problem: Vim9: "legacy return" is not recognized as a return statement.
+Solution: Specifically check for a return command. (closes #8213)
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2862
+Problem: Removing a text property causes the whole window to be redrawn.
+Solution: Use changed_lines_buf() to only redraw the affected lines.
+Files: src/textprop.c
+
+Patch 8.2.2863 (after 8.2.2862)
+Problem: Removing a text property does not redraw optimally.
+Solution: Only redraw the lines that mithg actually have been changed.
+Files: src/textprop.c
+
+Patch 8.2.2864
+Problem: Vim9: crash when using inline function.
+Solution: Check for NULL pointer. Make using inline function work inside
+ lambda. (closes #8217)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2865 (after 8.2.2864)
+Problem: Skipping over function body fails.
+Solution: Do not define the function when skipping.
+Files: src/userfunc.c
+
+Patch 8.2.2866
+Problem: Vim9: memory leak when using inline function.
+Solution: Remember what strings to free.
+Files: src/userfunc.c, src/structs.h, src/eval.c
+
+Patch 8.2.2867 (after 8.2.2866)
+Problem: Build failure.
+Solution: Add missing part of the change.
+Files: src/globals.h
+
+Patch 8.2.2868
+Problem: Vim9: When executing a compiled expression the trylevel at start
+ is changed but not restored. (closes #8214)
+Solution: Restore the trylevel at start.
+Files: src/vim9execute.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2869
+Problem: Using unified diff is not tested.
+Solution: Test all cases also with unified diff. (issue #8197)
+Files: src/testdir/test_diffmode.vim
+
+Patch 8.2.2870
+Problem: CmdlineChange event triggered twice for CTRL-R.
+Solution: Return CMDLINE_NOT_CHANGED from cmdline_insert_reg().
+ (closes #8219)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.2871
+Problem: Unnecessary VIM_ISDIGIT() calls, badly indented code.
+Solution: Call skipdigits() on the next character. Improve indenting.
+ (Dominique Pellé, closes #8227)
+Files: src/charset.c, src/evalfunc.c, src/ex_docmd.c, src/json.c,
+ src/ops.c, src/tag.c, src/vim9compile.c
+
+Patch 8.2.2872
+Problem: Python tests fail without the channel feature.
+Solution: Add a feature check. (Dominique Pellé, closes #8226)
+Files: src/testdir/test_python2.vim, src/testdir/test_python3.vim
+
+Patch 8.2.2873
+Problem: Not enough tests for writing buffers.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8229)
+Files: src/testdir/test_buffer.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_functions.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.2874
+Problem: MS-Windows: screen redraws too often.
+Solution: Do not redraw when peeking for a character. (closes #8230,
+ closes #8211)
+Files: src/os_win32.c
+
+Patch 8.2.2875
+Problem: Cancelling inputlist() after a digit does not return zero.
+Solution: Always return zero when cancelling. (closes #8231)
+Files: src/misc1.c, src/testdir/test_functions.vim
+
+Patch 8.2.2876
+Problem: Configure cannot detect Python 3.10.
+Solution: Use sys.version_info. (closes #8233)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2877
+Problem: Insufficient tests for popup menu rightleft.
+Solution: Add tests. (Yegappan Lakshmanan, closes #8235)
+Files: src/testdir/test_popup.vim,
+ src/testdir/dumps/Test_pum_rightleft_01.dump,
+ src/testdir/dumps/Test_pum_rightleft_02.dump,
+ src/testdir/dumps/Test_pum_scrollbar_01.dump,
+ src/testdir/dumps/Test_pum_scrollbar_02.dump
+
+Patch 8.2.2878
+Problem: Vim9: for loop list unpack only allows for one "_".
+Solution: Drop the value when the variable is "_". (closes #8232)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2879
+Problem: File extension .hsig not recognized.
+Solution: Use Haskell filetype for .hsig files. (Marcin Szamotulski,
+ closes #8236)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2880
+Problem: Unified diff fails if actually used.
+Solution: Invoke :diffupdate in the test. Fix the check for working external
+ diff. (Ghjuvan Lacambre, Christian Brabandt, closes #8197)
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.2.2881
+Problem: Various pieces of code not covered by tests.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8245)
+Files: src/testdir/test_const.vim, src/testdir/test_functions.vim,
+ src/testdir/test_python2.vim, src/testdir/test_python3.vim,
+ src/testdir/test_user_func.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2882
+Problem: Vim9: memory leak when lambda has an error.
+Solution: Free the list of argument types on failure.
+Files: src/userfunc.c
+
+Patch 8.2.2883
+Problem: MS-Windows manifest file name is misleading.
+Solution: Rename the file. (closes #8241)
+Files: .gitignore, .hgignore, Filelist, Makefile, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak, src/gvim.exe.mnf, src/vim.manifest, src/vim.rc
+
+Patch 8.2.2884
+Problem: Not enough cscope code is covered by tests.
+Solution: Add a few test cases. (Dominique Pellé, closes #8246)
+Files: src/testdir/test_cscope.vim
+
+Patch 8.2.2885
+Problem: searching for \%'> does not match linewise end of line. (Tim Chase)
+Solution: Match end of line if column is MAXCOL. (closes #8238)
+Files: src/regexp_nfa.c, src/regexp_bt.c, src/testdir/test_search.vim
+
+Patch 8.2.2886
+Problem: Various pieces of code not covered by tests.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8255)
+Files: src/testdir/test_expr.vim, src/testdir/test_functions.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_registers.vim,
+ src/testdir/test_user_func.vim, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2887
+Problem: Crash when passing null string to fullcommand().
+Solution: Check for NULL pointer. (closes #8256)
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.2888
+Problem: Vim9: "k" command recognized in Vim9 script.
+Solution: Do not recognize "k" or "s" and "d" with flags.
+Files: src/ex_docmd.c, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.2889
+Problem: Typo and verbose comment in Makefiles.
+Solution: Fix typo. Use @#. (Ken Takata, closes #8252)
+Files: Makefile, src/testdir/Makefile
+
+Patch 8.2.2890
+Problem: Text property duplicated when data block splits.
+Solution: Do not continue text prop from previous line. (closes #8261)
+Files: src/memline.c, src/structs.h, src/testdir/test_textprop.vim
+
+Patch 8.2.2891
+Problem: Cannot build with Perl 5.34.
+Solution: Add Perl_SvTRUE_common(). (Ozaki Kiichi, closes #8266,
+ closes #8250)
+Files: src/if_perl.xs
+
+Patch 8.2.2892
+Problem: Error message contains random characters.
+Solution: Pass the right pointer to error_white_both(). (closes #8272,
+ closes #8263)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2893
+Problem: Multi-byte text in popup title shows up wrong.
+Solution: Use the character width instead of the byte length. (Ralf Schandl,
+ closes #8267, closes #8264)
+Files: src/popupwin.c, src/message_test.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_multibytetitle.dump
+
+Patch 8.2.2894
+Problem: MS-Windows: using enc_locale() for strftime() might not work.
+Solution: Use wcsftime(). (Ken Takata, closes #8271)
+Files: src/time.c
+
+Patch 8.2.2895
+Problem: Vim9: random characters appear in some error messages.
+Solution: Pass the correct pointer. (closes #8277)
+Files: src/eval.c, src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2896
+Problem: Spellfile functionality not fully tested.
+Solution: Add tests for CHECKCOMPOUNDPATTERN and COMMON. (Dominique Pellé,
+ closes #8270)
+Files: src/testdir/test_spellfile.vim
+
+Patch 8.2.2897
+Problem: Vim9: can use reserved words at the script level.
+Solution: Check variable names for reserved words. (closes #8253)
+Files: src/vim9compile.c, src/vim9script.c, src/proto/vim9script.pro,
+ src/eval.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2898
+Problem: QuitPre and ExitPre not triggered when GUI window is closed.
+Solution: Call before_quit_autocmds(). (closes #8242)
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/gui.c
+
+Patch 8.2.2899
+Problem: Appveyor script does not detect nmake failure.
+Solution: Explicitly check for executable. (Ken Takata, closes #8281)
+Files: ci/appveyor.bat
+
+Patch 8.2.2900
+Problem: QuitPre is triggered before :wq writes the file, which is
+ different from other commands.
+Solution: Trigger QuitPre after writing the file. (closes #8279)
+Files: src/ex_docmd.c, src/testdir/test_writefile.vim
+
+Patch 8.2.2901
+Problem: Some operators not fully tested.
+Solution: Add a few test cases. (Yegappan Lakshmanan, closes #8282)
+Files: src/testdir/test_cpoptions.vim, src/testdir/test_increment.vim,
+ src/testdir/test_normal.vim, src/testdir/test_virtualedit.vim,
+ src/testdir/test_visual.vim
+
+Patch 8.2.2902
+Problem: Spellfile functionality not fully tested.
+Solution: Add tests for CIRCUMFIX, NOBREAK and others. (Dominique Pellé,
+ closes #8283)
+Files: src/testdir/test_spellfile.vim
+
+Patch 8.2.2903
+Problem: Cursor position wrong on wrapped line with 'signcolumn'.
+Solution: Don't add space for showbreak twice. (Christian Brabandt,
+ closes #8262)
+Files: src/drawline.c, src/testdir/test_display.vim
+
+Patch 8.2.2904
+Problem: "g$" causes scroll if half a double width char is visible.
+Solution: Advance to the last fully visible character. (closes #8254)
+Files: src/normal.c, src/testdir/test_normal.vim
+
+Patch 8.2.2905
+Problem: No error when defaults.vim cannot be loaded.
+Solution: Add an error message. (Christian Brabandt, closes #8248)
+Files: runtime/doc/starting.txt, src/errors.h, src/main.c,
+ src/testdir/test_startup.vim
+
+Patch 8.2.2906 (after 8.2.2905)
+Problem: ASAN reports errors for test_startup for unknown reasons.
+Solution: Temporarily disable the new test.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.2907
+Problem: Memory leak when running out of memory.
+Solution: Free the allocated memory. (Dominique Pellé, closes #8284)
+Files: src/term.c
+
+Patch 8.2.2908
+Problem: Crash when using a terminal popup window from the cmdline window.
+Solution: Instead of checking cmdwin_type call cmdwin_is_active().
+ (closes #8286)
+Files: src/terminal.c, src/errors.h, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_cmdwin_no_terminal.dump
+
+Patch 8.2.2909
+Problem: Build error with non-Unix system.
+Solution: Always include limits.h.
+Files: src/vim.h
+
+Patch 8.2.2910
+Problem: Test for cmdline window and terminal fails on MS-Windows.
+Solution: Skip the test on MS-Windows.
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.2.2911
+Problem: Pattern "\%V" does not match all of block selection. (Rick Howe)
+Solution: Use the value of vi_curswant. (closes #8285)
+Files: src/regexp.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_hlsearch_block_visual_match.dump
+
+Patch 8.2.2912
+Problem: MS-Windows: most users expect using Unicode.
+Solution: Default 'encoding' to utf-8 on MS-Windows. (Ken Takata,
+ closes #3907)
+Files: runtime/doc/options.txt, src/mbyte.c, src/option.c, src/option.h,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.2913
+Problem: MS-Windows conpty supports using mouse events.
+Solution: When enabling the mouse enable mouse input and disable quick edit
+ mode. (Wez Furlong, closes #8280)
+Files: src/os_win32.c
+
+Patch 8.2.2914
+Problem: Cannot paste a block without adding padding.
+Solution: Add "zp" and "zP" which paste without adding padding. (Christian
+ Brabandt, closes #8289)
+Files: runtime/doc/change.txt, runtime/doc/index.txt, src/normal.c,
+ src/register.c, src/vim.h, src/testdir/test_normal.vim,
+ src/testdir/test_visual.vim
+
+Patch 8.2.2915
+Problem: MS-Windows: when using "default" for encoding utf-8 is used.
+Solution: Use the system encoding. (Ken Takata, closes #8300)
+Files: src/mbyte.c, runtime/doc/options.txt
+
+Patch 8.2.2916
+Problem: Operators are not fully tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8290)
+Files: src/ops.c, src/testdir/test_netbeans.vim,
+ src/testdir/test_normal.vim, src/testdir/test_visual.vim
+
+Patch 8.2.2917
+Problem: Spellfile functionality not fully tested.
+Solution: Add tests for SFX with removal of characters, spelling
+ suggestions with NOBREAK and others. (Dominique Pellé,
+ closes #8293)
+Files: src/testdir/test_spellfile.vim
+
+Patch 8.2.2918
+Problem: Builtin function can be shadowed by global variable.
+Solution: Check for builtin function before variable. (Yasuhiro Matsumoto,
+ closes #8302)
+Files: src/eval.c, src/testdir/test_functions.vim
+
+Patch 8.2.2919
+Problem: Using ":!command" does not work if the command uses posix_spawn().
+Solution: Do not call ioctl() with TIOCSCTTY. (Felipe Contreras)
+Files: src/os_unix.c
+
+Patch 8.2.2920
+Problem: Still a way to shadow a builtin function. (Yasuhiro Matsumoto)
+Solution: Check the key when using extend(). (issue #8302)
+Files: src/eval.c, src/dict.c, src/proto/dict.pro,
+ src/testdir/test_functions.vim
+
+Patch 8.2.2921
+Problem: E704 for script local variable is not backwards compatible.
+ (Yasuhiro Matsumoto)
+Solution: Only give the error in Vim9 script. Also check for function-local
+ variable.
+Files: src/dict.c, src/testdir/test_functions.vim
+
+Patch 8.2.2922
+Problem: Computing array length is done in various ways.
+Solution: Use ARRAY_LENGTH everywhere. (Ken Takata, closes #8305)
+Files: src/arabic.c, src/blowfish.c, src/cindent.c, src/cmdexpand.c,
+ src/cmdhist.c, src/dosinst.c, src/eval.c, src/evalfunc.c,
+ src/ex_docmd.c, src/fileio.c, src/gui_athena.c, src/gui_gtk_x11.c,
+ src/gui_haiku.cc, src/gui_photon.c, src/gui_w32.c,
+ src/gui_xmebw.c, src/hardcopy.c, src/help.c, src/highlight.c,
+ src/if_mzsch.c, src/macros.h, src/main.c, src/map.c, src/mbyte.c,
+ src/memline.c, src/menu.c, src/misc2.c, src/normal.c, src/ops.c,
+ src/option.c, src/optiondefs.h, src/os_win32.c, src/popupwin.c,
+ src/quickfix.c, src/regexp.c, src/screen.c, src/search.c,
+ src/syntax.c, src/term.c, src/terminal.c, src/time.c,
+ src/usercmd.c, src/version.c
+
+Patch 8.2.2923
+Problem: EBCDIC build is broken.
+Solution: Move sortFunctions() to evalfunc.c. (Ken Takata, closes #8306)
+Files: src/eval.c, src/evalfunc.c, src/proto/evalfunc.pro
+
+Patch 8.2.2924
+Problem: Superfluous extern declaration.
+Solution: Delete the declaration. (Ken Takata, closes #8307)
+Files: src/main.c
+
+Patch 8.2.2925
+Problem: Vim9: line continuation comment uses legacy syntax.
+Solution: Check for #\ instead of "\. (closes #8295)
+Files: src/scriptfile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2926
+Problem: Vim9: no good error for using :legacy in a :def function.
+Solution: Give an explicit error where :legacy is not working.
+ (closes #8309)
+Files: src/vim9compile.c, src/errors.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2927
+Problem: Test commented out because it fails with ASAN.
+Solution: Only skip the test when running with ASAN.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.2928
+Problem: The evalfunc.c file is too big.
+Solution: Move float related functionality to a separate file. (Yegappan
+ Lakshmanan, closes #8287)
+Files: Filelist, src/Make_ami.mak, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/eval.c, src/evalfunc.c, src/float.c, src/proto.h,
+ src/proto/eval.pro, src/proto/float.pro
+
+Patch 8.2.2929
+Problem: Accidentally enable tcl by default.
+Solution: Revert change to Makefile
+Files: src/Makefile
+
+Patch 8.2.2930
+Problem: When a popup is visible a mouse move my restart Visual mode.
+Solution: Reset held_button when ending Visual mode. (closes #8318)
+Files: src/mouse.c, src/proto/mouse.pro, src/normal.c
+
+Patch 8.2.2931
+Problem: Vim9: line continuation comment still uses legacy syntax in one
+ place.
+Solution: Check for #\ instead of "\ earlier. (closes #8316)
+Files: src/scriptfile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.2932 (after 8.2.2930)
+Problem: Select mode test fails.
+Solution: Do not always reset the held mouse button.
+Files: src/mouse.c, src/normal.c, src/proto/normal.pro
+
+Patch 8.2.2933
+Problem: When 'clipboard' is "unnamed" zp and zP do not work correctly.
+Solution: Pass -1 to str_to_reg() and fix computing the character width
+ instead of using the byte length. (Christian Brabandt,
+ closes #8301, closes #8317)
+Files: src/clipboard.c, src/mbyte.c, src/register.c
+
+Patch 8.2.2934 (after 8.2.2933)
+Problem: ASAN error when using text from the clipboard.
+Solution: Get width of each character.
+Files: src/register.c
+
+Patch 8.2.2935 (after 8.2.2934)
+Problem: Calculating register width is not always needed. (Christian
+ Brabandt)
+Solution: Only calculate the width when the type is MBLOCK.
+Files: src/register.c
+
+Patch 8.2.2936
+Problem: Vim9: converting number to bool uses wrong stack offset. (Salman
+ Halim)
+Solution: Include the offset in the 2BOOL command.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c,
+ src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2937
+Problem: Popup test fails if rightleft feature not enabled.
+Solution: Check that the rightleft feature is available. (Dominique Pellé,
+ closes #8321)
+Files: src/testdir/test_popup.vim
+
+Patch 8.2.2938
+Problem: After using motion force from feedkeys() it may not be reset.
+Solution: Clear motion_force in clearop(). (closes #8323)
+Files: src/normal.c, src/testdir/test_visual.vim
+
+Patch 8.2.2939
+Problem: GTK: righthand scrollbar does not show with split window.
+Solution: Adjust padding when two scrollbars are used. (Matt Wozniski,
+ closes #8324)
+Files: src/gui_gtk.c
+
+Patch 8.2.2940
+Problem: MS-Windows: cannot see the size of the text area when resizing the
+ gvim window.
+Solution: Show a tooltip with the text size. (Ken Takata, closes #8326)
+Files: src/gui_w32.c
+
+Patch 8.2.2941
+Problem: Vim9: using `=expr` does not handle a list of strings.
+Solution: Convert a list to a string and escape each item. (closes #8310)
+Files: src/vim9execute.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2942
+Problem: Vim9: internal error when calling function with too few arguments
+Solution: Check for argument count to be too few. (closes #8325)
+Files: src/errors.h, src/vim9execute.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2943
+Problem: Vim9: check for argument count ignores default values.
+Solution: Take default argument values into account.
+Files: src/vim9execute.c
+
+Patch 8.2.2944
+Problem: Vim9: no error when using job or channel as a string.
+Solution: Be more strict about conversion to string. (closes #8312)
+Files: src/typval.c, src/job.c, src/proto/job.pro, src/channel.c,
+ src/proto/channel.pro, src/eval.c, src/vim9execute.c,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.2945
+Problem: Some buffer related code is not tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8320)
+Files: src/termlib.c, src/testdir/test_excmd.vim,
+ src/testdir/test_recover.vim, src/testdir/test_swap.vim,
+ src/testdir/test_visual.vim
+
+Patch 8.2.2946
+Problem: Vim9: substitute expression cannot be a List in a :def function.
+Solution: Use typval2string(). (closes #8330)
+Files: src/vim9execute.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2947
+Problem: Build failure without the channel feature.
+Solution: Add back #ifdef. (John Marriott)
+Files: src/eval.c
+
+Patch 8.2.2948
+Problem: Substitute() accepts a number but not a float expression.
+Solution: Also accept a float. (closes #8331)
+Files: src/typval.c, src/testdir/test_substitute.vim
+
+Patch 8.2.2949 (after 8.2.2948)
+Problem: Tests failing because there is no error for float to string
+ conversion.
+Solution: Change the check for failure to check for correct result. Make
+ some conversions strict in Vim9 script.
+Files: src/evalfunc.c, src/float.c, src/findfile.c, src/json.c,
+ src/filepath.c, src/testdir/test_eval_stuff.vim,
+ src/testdir/test_execute_func.vim,
+ src/testdir/test_float_func.vim, src/testdir/test_functions.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_glob2regpat.vim
+
+Patch 8.2.2950
+Problem: Sound code not fully tested.
+Solution: Add more sound tests. (Dominique Pellé, closes #8332)
+Files: src/testdir/test_sound.vim
+
+Patch 8.2.2951
+Problem: Vim9: cannot use heredoc in :def function for :python, :lua, etc.
+Solution: Concatenate the heredoc lines and pass them in the ISN_EXEC_SPLIT
+ instruction.
+Files: src/userfunc.c, src/vim9compile.c, src/vim9.h, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2952
+Problem: Recover test fails on big endian systems.
+Solution: Disable the failing test on big endian systems. (Yegappan
+ Lakshmanan, closes #8335)
+Files: src/testdir/test_recover.vim, src/testdir/test_swap.vim
+
+Patch 8.2.2953 (after 8.2.2951)
+Problem: Vim9: leaking memory when using heredoc script.
+Solution: Free the first line.
+Files: src/vim9execute.c
+
+Patch 8.2.2954
+Problem: Short file name extension for Scala not recognized.
+Solution: Recognize *.sc. (closes #8337)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2955
+Problem: Vim9: using filter in compiled command does not work.
+Solution: Generate EXEC including the command modifier.
+Files: src/vim9compile.c, src/ex_docmd.c, src/ex_cmds.c,
+ src/proto/ex_cmds.pro, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.2956
+Problem: Vim9: need to plan for future additions.
+Solution: Reserve commands for future use: :type, :class, :enum.
+Files: src/ex_cmds.h, src/ex_cmdidxs.h
+
+Patch 8.2.2957
+Problem: Using getchar() in Vim9 script is problematic.
+Solution: Add getcharstr(). (closes #8343)
+Files: runtime/doc/eval.txt, src/evalfunc.c, src/getchar.c,
+ src/proto/getchar.pro, src/testdir/test_functions.vim
+
+Patch 8.2.2958 (after 8.2.2957)
+Problem: Function list test fails.
+Solution: Add newly added function to the list. Fix typo.
+Files: runtime/doc/usr_41.txt, src/testdir/test_function_lists.vim
+
+Patch 8.2.2959
+Problem: sound_playfile() is not tested on MS-Windows.
+Solution: Make it work and enable the test. (Dominique Pellé, closes #8338)
+Files: src/sound.c, src/testdir/test_sound.vim
+
+Patch 8.2.2960
+Problem: Swap file recovery not sufficiently tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8339)
+Files: src/testdir/test_recover.vim
+
+Patch 8.2.2961
+Problem: Keys typed during a :normal command are discarded.
+Solution: Concatenate saved typeahead and typed keys. (closes #8340)
+Files: src/getchar.c, src/proto/getchar.pro, src/ex_docmd.c,
+ src/evalfunc.c, src/debugger.c, src/ui.c, src/proto/ui.pro
+
+Patch 8.2.2962
+Problem: MS-Windows command line arguments have wrong encoding.
+Solution: Always use utf-8 in get_cmd_argsW(). (Ken Takata, closes #8347)
+Files: src/os_win32.c
+
+Patch 8.2.2963
+Problem: GUI: mouse move may start Visual mode with a popup visible.
+Solution: Add special code for mouse move. (closes #8318)
+Files: src/vim.h, src/gui.c, src/keymap.h, src/term.c
+
+Patch 8.2.2964
+Problem: Vim9: hang when using space after ->. (Naohiro Ono)
+Solution: Skip over white space to find the function name. (closes #8341)
+Files: src/eval.c, src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.2965
+Problem: Vim9: crash when calling function that failed to compile.
+Solution: Fail when trying to call the function. (closes #8344)
+Files: src/errors.h, src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2966
+Problem: ml_get errors after recovering a file. (Yegappan Lakshmanan)
+Solution: Fix the cursor position after deleting lines.
+Files: src/memline.c
+
+Patch 8.2.2967
+Problem: Vim9: crash when using two levels of partials.
+Solution: Add outer_ref_T and use it in the execution context.
+Files: src/structs.h, src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.2968 (after 8.2.2967)
+Problem: Vim9: memory leak
+Solution: Unreference pt_outer of partial.
+Files: src/eval.c
+
+Patch 8.2.2969
+Problem: Subtracting from number option fails when result is zero. (Ingo
+ Karkat)
+Solution: Reset the string value when using the numeric value.
+ (closes #8351)
+Files: src/evalvars.c, src/testdir/test_vimscript.vim
+
+Patch 8.2.2970
+Problem: Python configure check uses deprecated command.
+Solution: Use sysconfig instead of distutils if possible. (Zdenek Dohnal,
+ closes #8354)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.2971
+Problem: Cannot yank a block without trailing spaces.
+Solution: Add the "zy" command. (Christian Brabandt, closes #8292)
+Files: runtime/doc/change.txt, runtime/doc/index.txt, src/normal.c,
+ src/ops.c, src/register.c, src/structs.h,
+ src/testdir/test_visual.vim
+
+Patch 8.2.2972
+Problem: "%bd" tries to delete popup window buffers, which fails. (Ralf
+ Schandl)
+Solution: Do not try to delete a popup window buffer. (closes #8349)
+Files: src/buffer.c, src/vim.h, src/testdir/test_popupwin.vim
+
+Patch 8.2.2973
+Problem: Fix for recovery and diff mode not tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8352)
+Files: src/testdir/test_diffmode.vim, src/testdir/test_prompt_buffer.vim,
+ src/testdir/test_recover.vim
+
+Patch 8.2.2974
+Problem: Greek spell checking uses wrong case folding.
+Solution: Fold capital sigma depending on whether it is at the end of a
+ word or not. (closes #299)
+Files: src/spell.c, src/proto/spell.pro, src/spellfile.c,
+ src/spellsuggest.c
+
+Patch 8.2.2975
+Problem: Vim9: can only use an autoload function name as a string.
+Solution: Load the autoload script when encountered. (closes #8124)
+Files: src/vim9compile.c, src/evalvars.c, src/scriptfile.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2976 (after 8.2.2975)
+Problem: Build failure without the +eval feature.
+Solution: Add #ifdefs.
+Files: src/scriptfile.c
+
+Patch 8.2.2977
+Problem: Crash when using a null function reference. (Naohiro Ono)
+Solution: Check for an invalid function name. (closes #8367)
+Files: src/eval.c, src/errors.h, src/testdir/test_functions.vim
+
+Patch 8.2.2978 (after 8.2.2977)
+Problem: Warning for uninitialized variable.
+Solution: Set return value to FAIL.
+Files: src/eval.c
+
+Patch 8.2.2979
+Problem: Not all options code is covered by tests.
+Solution: Add more tests for options. (Yegappan Lakshmanan, closes #8369)
+Files: src/testdir/test_edit.vim, src/testdir/test_excmd.vim,
+ src/testdir/test_help.vim, src/testdir/test_mksession.vim,
+ src/testdir/test_options.vim, src/testdir/test_vartabs.vim,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.2.2980
+Problem: Popup window test is a bit flaky.
+Solution: Add a redraw command.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.2981
+Problem: Recovery test is not run on big-endian systems.
+Solution: Make it work on big-endian systems. (James McCoy, closes #8368)
+Files: src/testdir/test_recover.vim
+
+Patch 8.2.2982
+Problem: Vim9: future commands are not reserved yet.
+Solution: Add commands to be implemented later. Make "this" a reserved
+ name.
+Files: runtime/doc/vim9.txt, src/ex_cmds.h, src/ex_cmdidxs.h,
+ src/vim9script.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.2983
+Problem: Vim9: an inline function requires specifying the return type.
+Solution: Make the return type optional.
+Files: src/eval.c, src/vim9compile.c, src/userfunc.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.2984 (after 8.2.2983)
+Problem: Vim9: Test fails because of missing return statement.
+Solution: When type is unknown set type to void.
+Files: src/vim9compile.c
+
+Patch 8.2.2985
+Problem: Vim9: a compiled function cannot be debugged.
+Solution: Add initial debugging support.
+Files: src/vim9.h, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/vim.h, src/eval.c, src/vim9execute.c, src/userfunc.c,
+ src/vim9type.c, src/testdir/test_debugger.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2986
+Problem: Build failure without the profile feature.
+Solution: Add #ifdef.
+Files: src/vim9compile.c
+
+Patch 8.2.2987
+Problem: Build failure with normal features.
+Solution: Remove #define.
+Files: src/vim9execute.c
+
+Patch 8.2.2988
+Problem: Vim9: debugger test fails.
+Solution: Get the debugger instructions when needed.
+Files: src/vim.h, src/vim9.h
+
+Patch 8.2.2989
+Problem: Vim9: memory leak when debugging a :def function.
+Solution: Free the debug instructions.
+Files: src/vim9compile.c
+
+Patch 8.2.2990
+Problem: Jupyter Notebook files are not recognized.
+Solution: Recognize *.ipynb. (closes #8375)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.2991
+Problem: Vim9: no completion for :vim9 and :legacy.
+Solution: Expand argument as a command. (closes #8377)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.2992
+Problem: Vim9: completion for :disassemble is incomplete.
+Solution: Recognize the "debug" and "profile" arguments.
+Files: src/cmdexpand.c, src/vim9execute.c, src/proto/vim9execute.pro,
+ src/vim.h, src/testdir/test_cmdline.vim
+
+Patch 8.2.2993
+Problem: 'fileencodings' default value should depend on 'encoding'. (Gary
+ Johnson)
+Solution: When 'encoding' is "utf-8" use a different default value for
+ 'fileencodings'.
+Files: src/mbyte.c, src/option.c, src/proto/option.pro,
+ src/testdir/test_options.vim
+
+Patch 8.2.2994
+Problem: Various code is not fully tested.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8378)
+Files: src/testdir/test_excmd.vim, src/testdir/test_mapping.vim,
+ src/testdir/test_modeline.vim, src/testdir/test_options.vim,
+ src/testdir/test_paste.vim, src/vim9compile.c
+
+Patch 8.2.2995
+Problem: Linker errors with dynamic Python 3.10.
+Solution: Add a couple of library entries. (Zdenek Dohnal, closes #8381,
+ closes #8356)
+Files: src/if_python3.c
+
+Patch 8.2.2996
+Problem: Vim9: when debugging cannot inspect local variables.
+Solution: Make local variables available when debugging.
+Files: src/vim9execute.c, src/proto/vim9execute.pro, src/vim9compile.c,
+ src/vim9.h, src/debugger.c, src/testdir/test_debugger.vim
+
+Patch 8.2.2997 (after 8.2 2996)
+Problem: Vim9: disassemble test fails.
+Solution: Adjust expected output.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.2998 (after 8.2 2996)
+Problem: Vim9: disassemble test fails.
+Solution: Add missing call to lookup_debug_var().
+Files: src/evalvars.c
+
+Patch 8.2.2999
+Problem: Balloon sometimes does not hide with GTK 3.
+Solution: Also listen to GDK_LEAVE_NOTIFY. (Johannes Stezenbach)
+Files: src/gui_beval.c
+
+Patch 8.2.3000
+Problem: Vim9: warning for uninitialized variable.
+Solution: Add initialization. (John Marriott)
+Files: src/vim9compile.c
+
+Patch 8.2.3001
+Problem: Vim9: memory leak when compilation fails.
+Solution: Free the list of variable names.
+Files: src/vim9compile.c
+
+Patch 8.2.3002
+Problem: Vim doesn't abort on a fatal Tcl error.
+Solution: Change emsg() to iemsg(). (Dominique Pellé, closes #8383)
+Files: src/if_tcl.c
+
+Patch 8.2.3003
+Problem: Vim9: closure compiled with wrong compile type.
+Solution: Use COMPILE_TYPE() when calling a function. (closes #8384)
+Files: src/vim9execute.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3004
+Problem: Vim9: error for missing colon given while skipping.
+Solution: Do not give the error when skipping. (closes #8385)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3005
+Problem: Vim9: using a void value does not give a proper error message.
+Solution: Give a clear error message. (closes #8387)
+Files: src/typval.c, src/vim9compile.c, src/vim9.h, src/vim9execute.c,
+ src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3006
+Problem: Crash when echoing a value very early. (Naruhiko Nishino)
+Solution: Do not use a NUL to truncate the message, make a copy.
+ (closes #8388)
+Files: src/message.c, src/testdir/test_startup.vim
+
+Patch 8.2.3007 (after 8.2.3005)
+Problem: Vim9: test for void value fails.
+Solution: Adjust expected error. Do not make a copy of void.
+Files: src/typval.c, src/testdir/test_functions.vim
+
+Patch 8.2.3008 (after 8.2.3006)
+Problem: Startup test may hang.
+Solution: Add quit command in the script.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.3009 (after 8.2.3006)
+Problem: Startup test may hang.
+Solution: Do not run the test in the GUI.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.3010
+Problem: Not enough testing for viminfo code.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #8390)
+Files: src/register.c, src/testdir/test_fileformat.vim,
+ src/testdir/test_smartindent.vim, src/testdir/test_viminfo.vim
+
+Patch 8.2.3011
+Problem: Vim9: cannot get argument values during debugging.
+Solution: Lookup names in the list of arguments. Put debug instruction
+ halfway for command.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_debugger.vim
+
+Patch 8.2.3012
+Problem: When 'rightleft' is set the line number is sometimes drawn
+ reversed.
+Solution: Adjust how space is handled. (Christian Brabandt, closes #8389,
+ closes #8391)
+Files: src/drawline.c, src/testdir/test_number.vim
+
+Patch 8.2.3013
+Problem: Vim: when debugging only the first line of a command using line
+ continuation is displayed.
+Solution: Find the next command and concatenate lines until that one.
+ (closes #8392)
+Files: src/vim9execute.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3014
+Problem: Coverity warns for freeing static string.
+Solution: Do not assign static string to pointer. (Dominique Pellé,
+ closes #8397)
+Files: src/vim9execute.c
+
+Patch 8.2.3015
+Problem: Vim9: Assigning to @# requires a string. (Naohiro Ono)
+Solution: Accent a number or a string. (closes #8396)
+Files: src/vim9compile.c, src/vim9execute.c, src/globals.h,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3016
+Problem: Confusing error when expression is followed by comma.
+Solution: Give a different error for trailing text. (closes #8395)
+Files: src/eval.c, src/testdir/test_let.vim,
+ src/testdir/test_eval_stuff.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_viminfo.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.3017
+Problem: Vim9: debugger shows too many lines.
+Solution: Truncate at a comment, "enddef", etc. (closes #8392)
+Files: src/vim9execute.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3018
+Problem: Formatting using quickfixtextfunc is lost when updating location
+ lists for different buffers. (Yorick Peterse)
+Solution: Use the right window for the location list. (Yegappan Lakshmanan,
+ closes #8400, closes #8403)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.3019
+Problem: Location list only has the start position.
+Solution: Make it possible to add an end position. (thinca, closes #8393)
+Files: runtime/doc/eval.txt, src/quickfix.c,
+ src/testdir/dumps/Test_quickfix_cwindow_1.dump,
+ src/testdir/dumps/Test_quickfix_cwindow_2.dump,
+ src/testdir/test_quickfix.vim, src/testdir/test_tagjump.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3020
+Problem: Unreachable code.
+Solution: Remove the code. (closes #8406)
+Files: src/ex_docmd.c
+
+Patch 8.2.3021
+Problem: Spaces allowed between option name and "!", "?", etc.
+Solution: Disallow spaces in Vim9 script, it was not documented.
+ (closes #8408)
+Files: src/option.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3022
+Problem: Available encryption methods are not strong enough.
+Solution: Add initial support for xchacha20. (Christian Brabandt,
+ closes #8394)
+Files: .github/workflows/ci.yml, runtime/doc/eval.txt,
+ runtime/doc/options.txt, runtime/doc/various.txt,
+ src/INSTALLpc.txt, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/auto/configure, src/blowfish.c, src/bufwrite.c,
+ src/config.h.in, src/configure.ac, src/crypt.c, src/crypt_zip.c,
+ src/errors.h, src/evalfunc.c, src/feature.h, src/fileio.c,
+ src/memline.c, src/option.c, src/optionstr.c,
+ src/proto/blowfish.pro, src/proto/crypt.pro,
+ src/proto/crypt_zip.pro, src/structs.h,
+ src/testdir/samples/crypt_sodium_invalid.txt,
+ src/testdir/test_crypt.vim, src/undo.c, src/version.c
+
+Patch 8.2.3023
+Problem: Vim9: arguments for execute() not checked at compile time.
+Solution: Add a function to check the argument types.
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3024 (after 8.2.3023)
+Problem: execute() function test fails.
+Solution: Adjust test for different error.
+Files: src/testdir/test_execute_func.vim
+
+Patch 8.2.3025
+Problem: Not enough tests for quickfix end_col and end_lnum.
+Solution: Add a few more test cases. (Shane-XB-Qian, closes #8409)
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.2.3026
+Problem: Vim9: cannot set breakpoint in compiled function.
+Solution: Check for breakpoint when calling a function.
+Files: src/vim9execute.c, src/structs.h, src/vim.h, src/vim9.h,
+ src/debugger.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3027
+Problem: Vim9: breakpoint in compiled function not always checked.
+Solution: Check for breakpoint when calling compiled function from compiled
+ function.
+Files: src/vim9execute.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3028
+Problem: GUI mouse events not tested.
+Solution: Add test_gui_mouse_event(). Add mouse tests. Also add a few
+ viminfo tests. (Yegappan Lakshmanan, closes #8407)
+Files: runtime/doc/eval.txt, runtime/doc/testing.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/proto/testing.pro,
+ src/testdir/test_gui.vim, src/testdir/test_viminfo.vim,
+ src/testing.c
+
+Patch 8.2.3029
+Problem: Vim9: crash when using operator and list unpack assignment.
+ (Naohiro Ono)
+Solution: Get variable value before operation. (closes #8416)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c, src/ex_docmd.c,
+ src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3030
+Problem: Coverity reports a memory leak.
+Solution: Fix the leak and a few typos. (Dominique Pellé, closes #8418)
+Files: src/crypt.c, src/errors.h
+
+Patch 8.2.3031
+Problem: No error if a function name starts with an underscore. (Naohiro
+ Ono)
+Solution: In Vim9 script disallow a function name starting with an
+ underscore, as is mentioned in the help. (closes #8414)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3032
+Problem: Build problems with MSVC, other crypt issues with libsodium.
+Solution: Adjust MSVC makefile. Disable swap file only when 'key' is set.
+ Adjust error message used when key is wrong. Fix Coverity issues.
+ (Christian Brabandt, closes #8420, closes #8411)
+Files: src/Make_mvc.mak, src/crypt.c, src/errors.h, src/fileio.c,
+ src/memline.c, src/proto/crypt.pro
+
+Patch 8.2.3033
+Problem: No error when using alpha delimiter with :global.
+Solution: Check the delimiter like with :substitute. (closes #8415)
+Files: src/ex_cmds.c, src/testdir/test_global.vim
+
+Patch 8.2.3034
+Problem: Installing packages on github CI sometimes fails.
+Solution: Update package information first. (Christian Brabandt,
+ closes #8432)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.3035
+Problem: Vim9: crash when calling :def function with partial and return
+ type is not set.
+Solution: When the return type is not set handle like the return type is
+ unknown. (closes #8422)
+Files: src/vim9type.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3036
+Problem: Vim9: builtin function arguments not checked at compile time.
+Solution: Add more argument type specs. Check arguments to test_setmouse()
+ and test_gui_mouse_event(). (Yegappan Lakshmanan, closes #8425)
+Files: src/evalfunc.c, src/testdir/test_assert.vim,
+ src/testdir/test_gui.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_vim9_builtin.vim, src/testing.c
+
+Patch 8.2.3037
+Problem: Configure reports libcanberra when checking for libsodium.
+Solution: Adjust the message. (Ozaki Kiichi, closes #8435)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.3038
+Problem: Amiga built-in version string doesn't include build date.
+Solution: Add the build date if available. (Ola Söder, closes #8437)
+Files: src/os_amiga.c
+
+Patch 8.2.3039
+Problem: Vim9: breakpoint at a comment line does not work.
+Solution: Add the comment line number to the debug instruction.
+ (closes #8429)
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_debugger.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3040
+Problem: GUI: dropping files not tested.
+Solution: Add test_gui_drop_files() and tests. (Yegappan Lakshmanan,
+ closes #8434)
+Files: runtime/doc/eval.txt, runtime/doc/testing.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/gui.c,
+ src/proto/testing.pro, src/testdir/test_gui.vim, src/testing.c
+
+Patch 8.2.3041
+Problem: Detecting if the process of a swap file is running fails if the
+ process is owned by another user.
+Solution: Check for the ESRCH error. (closes #8436)
+Files: src/os_unix.c
+
+Patch 8.2.3042 (after 8.2.3041)
+Problem: Swap file test fails.
+Solution: Check for a very high process ID instead of one, which should be
+ running.
+Files: src/testdir/test_swap.vim
+
+Patch 8.2.3043
+Problem: Amiga: cannot get the shell size on MorphOS and AROS.
+Solution: Use control sequences. (Ola Söder, closes #8438)
+Files: src/os_amiga.c
+
+Patch 8.2.3044
+Problem: Amiga MorphOS and AROS: process ID is not valid.
+Solution: Use FindTask to return something which is unique to all processes.
+ (Ola Söder, closes #8444)
+Files: src/os_amiga.c
+
+Patch 8.2.3045
+Problem: Minor typos.
+Solution: Fix the typos. (Christian Brabandt, closes #8441)
+Files: src/VisVim/README_VisVim.txt, src/evalfunc.c, src/testdir/vim9.vim
+
+Patch 8.2.3046
+Problem: Amiga MorphOS: Term mode is set using DOS packets.
+Solution: Use the same way of setting term mode on all next gen Amiga-like
+ systems. (Ola Söder, closes #8445)
+Files: src/os_amiga.c
+
+Patch 8.2.3047
+Problem: Increment and decrement don't allow for next command.
+Solution: Allow for comment and next command. (closes #8442)
+Files: src/ex_cmds.h, src/vim9script.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3048
+Problem: Strange error for white space after ++ command.
+Solution: Check for white space explicitly. (closes #8440)
+Files: src/vim9script.c, src/errors.h, src/vim9compile.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3049
+Problem: JSON patch file not recognized.
+Solution: Recognize json-patch as json. (Kevin Locke, closes #8450)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3050
+Problem: Cannot recognize elixir files.
+Solution: Recognize Elixir-specific files. Check if an .ex file is Euphoria
+ or Elixir. (Austin Gatlin, closes #8401, closes #8446)
+Files: runtime/autoload/dist/ft.vim, runtime/filetype.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.3051
+Problem: Vim9: for loop with one list variable does not work.
+Solution: Use a separate flag for unpacking a list. (closes #8452)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3052
+Problem: Vim9: "legacy call" does not work.
+Solution: Do not skip "call" after "legacy". (closes #8454)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3053
+Problem: Vim9: cannot assign to @@ in :def function
+Solution: Handle '@' like '"'. (closes #8456)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3054
+Problem: Vim9: unpack assignment using "_" after semicolon fails.
+Solution: Drop the expression result. (closes #8453)
+Files: src/vim9compile.c, src/errors.h, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3055
+Problem: Strange error for assigning to "x.key" on non-dictionary.
+Solution: Add a specific error message. (closes #8451)
+Files: src/eval.c, src/errors.h, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_let.vim
+
+Patch 8.2.3056
+Problem: Vim9: using default value in lambda gives confusing error.
+Solution: Pass "default_args" on the first pass to get the arguments.
+ (closes #8455)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3057
+Problem: Vim9: debugger test fails with normal features and +terminal.
+ (Dominique Pellé)
+Solution: Adjust the INSTRUCTIONS macro. (closes #8460)
+Files: src/vim9.h
+
+Patch 8.2.3058 (after 8.2.3056)
+Problem: Vim9: cannot use ternary operator in parentheses.
+Solution: Do not use "==" for a default argument value. (closes #8462)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3059 (after 8.2.3056)
+Problem: Vim9: memory leak when using lambda.
+Solution: Do not store the default value strings when skipping.
+Files: src/userfunc.c
+
+Patch 8.2.3060 (after 8.2.3056)
+Problem: Vim9: cannot use ternary operator in parentheses.
+Solution: Do not use "=~" for a default argument value. (closes #8462)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3061
+Problem: Testing the shell option is incomplete and spread out.
+Solution: Move shell tests to one file and increase coverage. (Yegappan
+ Lakshmanan, closes #8464)
+Files: src/testdir/Make_all.mak, src/testdir/test_functions.vim,
+ src/testdir/test_options.vim, src/testdir/test_shell.vim,
+ src/testdir/test_system.vim
+
+Patch 8.2.3062
+Problem: Internal error when adding several text properties.
+Solution: Do not handle text properties when deleting a line for splitting a
+ data block. (closes #8466)
+Files: src/structs.h, src/memline.c, src/testdir/test_textprop.vim
+
+Patch 8.2.3063
+Problem: Crash when switching 'cryptmethod' to xchaha20 with an existing
+ undo file. (Martin Tournoij)
+Solution: Disable reading undo file when decoding can't be done inplace.
+ (issue #8467)
+Files: src/fileio.c, src/bufwrite.c
+
+Patch 8.2.3064
+Problem: Vim9: in script cannot set item in uninitialized list.
+Solution: When a list is NULL allocate an empty one. (closes #8461)
+Files: src/eval.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3065
+Problem: Vim9: error when sourcing script twice and reusing a function
+ name.
+Solution: Check if the function is dead. (closes #8463)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3066
+Problem: Vim9: debugging lambda does not work.
+Solution: Use the compile type of the function when compiling a lambda.
+ (closes #8412)
+Files: src/vim9compile.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3067
+Problem: Building fails with Athena. (Elimar Riesebieter)
+Solution: Adjust #ifdefs and add the 'drop_file' feature.
+Files: src/evalfunc.c, src/testing.c, src/testdir/test_gui.vim
+
+Patch 8.2.3068
+Problem: Unicode tables are slightly outdated.
+Solution: Update the tables for Unicode release 13. (Christian Brabandt
+ closes #8430)
+Files: runtime/tools/unicode.vim, src/mbyte.c
+
+Patch 8.2.3069
+Problem: Error messages are spread out.
+Solution: Move some error messages to errors.h. Use clearer names.
+Files: src/errors.h, src/globals.h, src/arglist.c, src/buffer.c,
+ src/channel.c, src/eval.c, src/evalfunc.c, src/evalvars.c,
+ src/evalwindow.c, src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c,
+ src/filepath.c, src/fold.c, src/getchar.c, src/indent.c,
+ src/list.c, src/map.c, src/mark.c, src/normal.c, src/ops.c,
+ src/optionstr.c, src/popupwin.c, src/quickfix.c, src/spellfile.c,
+ src/textprop.c, src/typval.c, src/undo.c, src/userfunc.c,
+ src/vim9compile.c, src/window.c
+
+Patch 8.2.3070
+Problem: Not enough testing for shell use.
+Solution: Add a bit more testing. (Yegappan Lakshmanan, closes #8469)
+Files: src/testdir/test_shell.vim, src/testdir/test_startup.vim
+
+Patch 8.2.3071
+Problem: Shell options are not set properly for PowerShell.
+Solution: Use better option defaults. (Mike Williams, closes #8459)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/os_dos.txt, src/fileio.c, src/misc2.c, src/option.c,
+ src/os_win32.c, src/testdir/test_shell.vim
+
+Patch 8.2.3072
+Problem: The "zy" command does not work well when 'virtualedit' is set to
+ "block". (Johann Höchtl)
+Solution: Make endspaces zero. (Christian Brabandt, closes #8468,
+ closes #8448)
+Files: src/register.c, src/testdir/test_visual.vim
+
+Patch 8.2.3073
+Problem: When cursor is moved for block append wrong text is inserted.
+Solution: Calculate an offset. (Christian Brabandt, closes #8433,
+ closes #8288)
+Files: src/ops.c, src/testdir/test_blockedit.vim,
+ src/testdir/test_visual.vim
+
+Patch 8.2.3074
+Problem: popup_atcursor() uses wrong position with concealing.
+Solution: Keep w_wcol in conceal_check_cursor_line(). (closes #8476)
+Files: src/screen.c, src/proto/screen.pro, src/normal.c, src/edit.c,
+ src/ui.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_atcursor_pos.dump
+
+Patch 8.2.3075
+Problem: Xxd always reports an old version string. (Åsmund Ervik)
+Solution: Update the version string with the last known change date.
+ (Jürgen Weigert, closes #8475)
+Files: src/xxd/xxd.c, src/testdir/test_xxd.vim
+
+Patch 8.2.3076
+Problem: Vim9: using try in catch block causes a hang.
+Solution: Save and restore the ec_in_catch flag. (closes #8478)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3077
+Problem: Vim9: an error in a catch block is not reported.
+Solution: Put the "in catch" flag in the try stack. (closes #8478)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3078
+Problem: Vim9: profile test fails.
+Solution: Make throw in :catch jump to :finally.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3079
+Problem: Powershell core not supported by default.
+Solution: Set option defaults for "pwsh". (Mike Williams, closes #8481)
+Files: runtime/doc/eval.txt, runtime/doc/options.txt,
+ runtime/doc/os_dos.txt, runtime/doc/os_win32.txt, src/fileio.c,
+ src/misc2.c, src/option.c, src/os_win32.c,
+ src/testdir/test_shell.vim
+
+Patch 8.2.3080
+Problem: Recover test fails on 32bit systems. (Ondřej Súkup)
+Solution: Detect 32/64 bit systems. (Yegappan Lakshmanan, closes #8485,
+ closes #8479)
+Files: src/testdir/test_recover.vim
+
+Patch 8.2.3081
+Problem: Cannot catch errors in a channel command.
+Solution: Instead of skipping the error make it silent. (closes #8477)
+Files: src/channel.c
+
+Patch 8.2.3082
+Problem: A channel command "echoerr" does not show anything.
+Solution: Do not use silent errors when using an "echoerr" command.
+ (closes #8494)
+Files: src/channel.c, src/testdir/test_channel.py,
+ src/testdir/test_channel.vim
+
+Patch 8.2.3083
+Problem: Crash when passing null string to charclass().
+Solution: Bail out when string pointer is NULL. (Christian Brabandt,
+ closes #8498, closes #8260)
+Files: src/mbyte.c, src/testdir/test_functions.vim
+
+Patch 8.2.3084
+Problem: Vim9: builtin function argument types are not checked at compile
+ time.
+Solution: Add argument types. (Yegappan Lakshmanan, closes #8503)
+Files: src/evalfunc.c, src/testdir/test_functions.vim,
+ src/testdir/test_glob2regpat.vim,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3085
+Problem: JSONC files are not recognized.
+Solution: Recognize .jsonc files. (Izhak Jakov, closes #8500)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3086
+Problem: Vim9: breakpoint on "for" does not work.
+Solution: Use the right line number in ISN_DEBUG. (closes #8486)
+Files: src/vim9compile.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3087
+Problem: Gemtext files are not recognized.
+Solution: Recognize .gmi and .gemini files. (closes #8427)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3088
+Problem: With 'virtualedit' set to "block" Visual highlight is wrong after
+ using "$". (Marco Trosi)
+Solution: Do not set w_old_cursor_lcol to MAXCOL. (closes #8495)
+Files: src/drawscreen.c, src/testdir/test_visual.vim,
+ src/testdir/dumps/Test_visual_block_with_virtualedit.dump
+
+Patch 8.2.3089
+Problem: Garbage collection has useless code.
+Solution: Bail out when aborting. (closes #8504)
+Files: src/userfunc.c
+
+Patch 8.2.3090
+Problem: With concealing enabled and indirectly closing a fold the cursor
+ may be somewhere in a folded line.
+Solution: Recompute the cursor position when the cursor line can be
+ concealed. (closes #8480)
+Files: src/drawscreen.c
+
+Patch 8.2.3091
+Problem: Vim9: default argument expression cannot use previous argument
+Solution: Correct argument index. (closes #8496)
+Files: src/vim9compile.c, src/structs.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3092
+Problem: Vim9: builtin function test fails without the +channel feature.
+Solution: Check the +channel feature is supported. (Dominique Pellé,
+ closes #8507)
+Files: runtime/doc/eval.txt, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3093
+Problem: tablabel_tooltip test fails with Athena. (Dominique Pellé)
+Solution: Skip the test when using Athena. (closes #8508)
+Files: src/testdir/test_gui.vim, src/testdir/check.vim
+
+Patch 8.2.3094
+Problem: Test_popup_atcursor_pos() fails without the conceal feature.
+Solution: Add a check for the conceal feature. (Dominique Pellé,
+ closes #8505)
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.3095 (after 8.2.3088)
+Problem: With 'virtualedit' set to "block" block selection is wrong after
+ using "$". (Marco Trosi)
+Solution: Compute the longest selected line. (closes #8495)
+Files: src/drawscreen.c, src/testdir/test_visual.vim,
+ src/testdir/dumps/Test_visual_block_with_virtualedit2.dump
+
+Patch 8.2.3096
+Problem: Temp files remain after running tests.
+Solution: Delete the right files. (Dominique Pellé, closes #8509)
+Files: src/testdir/test_debugger.vim, src/testdir/test_lambda.vim,
+ src/testdir/test_visual.vim
+
+
+Patch 8.2.3097
+Problem: Crash when using "quit" at recovery prompt and autocommands are
+ triggered.
+Solution: Block autocommands when creating an empty buffer to use as the
+ current buffer. (closes #8506)
+Files: src/buffer.c, src/testdir/test_swap.vim
+
+Patch 8.2.3098
+Problem: Popup window test is flaky on MS-Windows with GUI.
+Solution: Skip the check in this situation.
+Files: src/testdir/test_popupwin.vim
+
+Patch 8.2.3099
+Problem: Vim9: missing catch/finally not reported at script level.
+Solution: Give an error. (closes #8487)
+Files: src/structs.h, src/ex_eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3100
+Problem: Vim9: no error when using type with unknown number of arguments.
+Solution: Do not ignore argument count of -1. (closes #8492)
+Files: src/vim9type.c, src/evalfunc.c, src/proto/evalfunc.pro,
+ src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.3101
+Problem: Missing function prototype for vim_round().
+Solution: Add the prototype.
+Files: src/proto/float.pro
+
+Patch 8.2.3102 (after 8.2.3097)
+Problem: Test for crash fix does not fail without the fix.
+Solution: Adjust the test sequence. (closes #8506)
+Files: src/testdir/test_swap.vim
+
+Patch 8.2.3103 (after 8.2.3102)
+Problem: Swap test may fail on some systems when jobs take longer to exit.
+Solution: Use different file names.
+Files: src/testdir/test_swap.vim
+
+Patch 8.2.3104
+Problem: Vim9: unspecified function type causes type error.
+Solution: Don't check type when min_argcount is negative. (issue #8492)
+Files: src/globals.h, src/vim9type.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3105
+Problem: Vim9: type of partial is wrong when it has arguments.
+Solution: Subtract arguments from the count. (issue #8492)
+Files: src/vim9type.c, src/userfunc.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3106
+Problem: Vim9: confusing line number reported for error.
+Solution: Use the start line number for the store instruction.
+ (closes #8488)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3107
+Problem: Vim9: error for arguments while type didn't specify arguments.
+Solution: Do not update that type to check when no argument count is
+ specified. (closes #8492)
+Files: src/userfunc.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3108
+Problem: Test for remote_foreground() fails. (Elimar Riesebieter)
+Solution: Check that $DISPLAY is set. (Christian Brabandt)
+Files: src/testdir/check.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3109
+Problem: Check for $DISPLAY never fails.
+Solution: Use eval().
+Files: src/testdir/check.vim
+
+Patch 8.2.3110
+Problem: A pattern that matches the cursor position is a bit complicated.
+Solution: Use a dot to indicate the cursor line and column. (Christian
+ Brabandt, closes #8497, closes #8179)
+Files: runtime/doc/pattern.txt, src/errors.h, src/regexp_bt.c,
+ src/regexp_nfa.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.2.3111
+Problem: Vim9: confusing error with extra whitespace before colon.
+Solution: Check for colon after white space. (closes #8513)
+Files: src/eval.c, src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3112 (after 8.2.3090)
+Problem: With concealing enabled and indirectly closing a fold the cursor
+ may be somewhere in a folded line when it is not on the first line
+ of the fold.
+Solution: Check if the cursor is somewhere in the folded text.
+Files: src/drawscreen.c
+
+Patch 8.2.3113
+Problem: No error when for loop variable shadows script variable.
+Solution: Check for the error. (closes #8512)
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3114
+Problem: Amiga-like systems: build error checking for running process
+Solution: Only build swapfile_process_running() on systems where it is
+ actually used. (Ola Söder, closes #8519)
+Files: src/memline.c
+
+Patch 8.2.3115
+Problem: Coverity complains about free_wininfo() use.
+Solution: Add a condition that "wip2" is not equal to "wip". (Neovim #14996)
+Files: src/window.c
+
+Patch 8.2.3116
+Problem: Vim9: crash when debugging a function with line continuation.
+Solution: Check for a NULL pointer. (closes #8521)
+Files: src/vim9execute.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3117
+Problem: Vim9: type not properly checked in for loop.
+Solution: Have items() return a list of lists. Add runtime type checks.
+ (closes #8515)
+Files: src/evalfunc.c, src/globals.h, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3118
+Problem: Vim9: "any" type not handled correctly in for loop.
+Solution: Change compile time check into runtime check. (closes #8516)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3119
+Problem: Compiler warning for unused argument.
+Solution: Add UNUSED.
+Files: src/evalfunc.c
+
+Patch 8.2.3120
+Problem: Crypt with sodium test fails on MS-Windows.
+Solution: Make the tests pass. (closes #8428)
+Files: src/testdir/test_crypt.vim
+
+Patch 8.2.3121
+Problem: 'listchars' "exceeds" character appears in foldcolumn. Window
+ separator is missing. (Leonid V. Fedorenchik)
+Solution: Only draw the "exceeds" character in the text area. Break the
+ loop when not drawing the text. (closes #8524)
+Files: src/drawline.c, src/testdir/test_listchars.vim,
+ src/testdir/dumps/Test_listchars_01.dump,
+ src/testdir/dumps/Test_listchars_02.dump,
+ src/testdir/dumps/Test_listchars_03.dump,
+ src/testdir/dumps/Test_listchars_04.dump,
+ src/testdir/dumps/Test_listchars_05.dump
+
+Patch 8.2.3122
+Problem: With 'nowrap' cursor position is unexpected in narrow window.
+ (Leonid V. Fedorenchik)
+Solution: Put cursor on the last non-empty line. (closes #8525)
+Files: src/move.c, src/testdir/test_listchars.vim,
+ src/testdir/dumps/Test_listchars_06.dump,
+ src/testdir/dumps/Test_listchars_07.dump
+
+Patch 8.2.3123
+Problem: Vim9: confusing error when using white space after option, before
+ one of "!&<".
+Solution: Give a specific error. (issue #8408)
+Files: src/errors.h, src/option.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3124
+Problem: Vim9: no error for white space between option and "=9".
+Solution: Check for extraneous white space. (issue #8408)
+Files: src/option.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3125
+Problem: Variables are set but not used.
+Solution: Move the declarations to the block where they are used.
+ (closes #8527)
+Files: src/regexp_nfa.c
+
+Patch 8.2.3126
+Problem: Vim9: for loop error reports wrong line number.
+Solution: Save and restore the line number when evaluating the expression.
+ (closes #8514)
+Files: src/ex_eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3127
+Problem: Vim9: no error when adding number to list of string.
+Solution: Check the value type. (closes #8529)
+Files: src/list.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3128
+Problem: Vim9: uninitialized list does not get type checked.
+Solution: Set the type when initializing the variable. (closes #8529)
+Files: src/eval.c, src/evalvars.c, src/vim9script.c,
+ src/userfunc.c, src/proto/vim9script.pro,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3129
+Problem: Vim9: imported uninitialized list does not get type checked.
+Solution: Get type from imported variable.
+Files: src/eval.c, src/evalvars.c, src/vim9script.c,
+ src/proto/vim9script.pro, src/userfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3130
+Problem: Vim9: import test fails.
+Solution: Rename directory back to "import", use "p" to avoid an error when
+ the directory already exists.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.3131
+Problem: MS-Windows: ipv6 channel test is very flaky in the GUI.
+Solution: Skip the test.
+Files: src/testdir/test_channel.vim
+
+Patch 8.2.3132
+Problem: Compiler warns for size_t to colnr_T conversion. (Randall W.
+ Morris)
+Solution: Add a type cast.
+Files: src/drawscreen.c
+
+Patch 8.2.3133
+Problem: Vim9: memory leak when add() fails.
+Solution: Allocate listitem_T after type check.
+Files: src/list.c
+
+Patch 8.2.3134
+Problem: Crash when using typename() on a function reference. (Naohiro Ono)
+Solution: Initialize pointer to NULL. (closes #8531)
+Files: src/vim9type.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3135
+Problem: Vim9: builtin function arguments not checked at compile time.
+Solution: Add more type checks. (Yegappan Lakshmanan, closes #8539)
+Files: src/channel.c, src/errors.h, src/evalfunc.c, src/proto/typval.pro,
+ src/terminal.c, src/testdir/test_search.vim,
+ src/testdir/test_textprop.vim, src/testdir/test_vim9_builtin.vim,
+ src/testing.c, src/textprop.c, src/typval.c
+
+Patch 8.2.3136
+Problem: No test for E187 and "No swap file".
+Solution: Add a test. (Dominique Pellé, closes #8540)
+Files: src/testdir/test_cd.vim, src/testdir/test_swap.vim
+
+Patch 8.2.3137
+Problem: Vim9: no error when a line only has a variable name.
+Solution: Give an error when an expression is evaluated without an effect.
+ (closes #8538)
+Files: src/ex_eval.c, src/errors.h, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.3138 (after 8.2.3137)
+Problem: Debugger test fails.
+Solution: Adjust eval command.
+Files: src/testdir/test_debugger.vim
+
+Patch 8.2.3139
+Problem: Functions for string manipulation are spread out.
+Solution: Move string related functions to a new source file. (Yegappan
+ Lakshmanan, closes #8470)
+Files: Filelist, src/Make_ami.mak, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/eval.c, src/evalfunc.c, src/mbyte.c, src/misc1.c, src/misc2.c,
+ src/proto.h, src/proto/eval.pro, src/proto/evalfunc.pro,
+ src/proto/mbyte.pro, src/proto/misc1.pro, src/proto/misc2.pro,
+ src/proto/strings.pro, src/strings.c
+
+Patch 8.2.3140 (after 8.2.3131)
+Problem: MS-Windows: ipv6 channel test is very flaky also without the GUI.
+Solution: Skip the test also without the GUI.
+Files: src/testdir/test_channel.vim
+
+Patch 8.2.3141
+Problem: No error when using :complete for :command without -nargs.
+Solution: Give an error. (Martin Tournoij, closes #8544, closes #8541)
+Files: src/usercmd.c, src/errors.h, src/testdir/test_usercommands.vim
+
+Patch 8.2.3142
+Problem: Vim9: type check for has_key() argument is too strict.
+Solution: Also allow for a number key argument. (closes #8542)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3143
+Problem: Vim9: A lambda may be compiled with the wrong context if it is
+ called from a profiled function.
+Solution: Compile the lambda with and without profiling. (closes #8543)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3144
+Problem: Vim9: no error when using an invalid value for a line number.
+Solution: Give an error if the string value is not recognized.
+ (closes #8536)
+Files: src/errors.h, src/eval.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3145
+Problem: Vim9: profile test fails without profile feature.
+Solution: Check the profile feature is present.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.3146
+Problem: Vim9: line number wrong for :execute argument.
+Solution: Use the line number of the :execute command itself. (closes #8537)
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3147
+Problem: Vim9: profiling does not work with a nested function.
+Solution: Also compile a nested function without profiling. (closes #8543)
+ Handle that compiling may cause the table of compiled functions to
+ change.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3148
+Problem: Vim9: function arg type check does not handle base offset.
+Solution: Take the base offset into account when checking builtin function
+ argument types.
+Files: src/evalfunc.c, src/vim9compile.c,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3149 (after 8.2.3141)
+Problem: Some plugins have a problem with the error check for using
+ :command with -complete but without -nargs.
+Solution: In legacy script only give a warning message.
+Files: src/usercmd.c, src/message.c, src/proto/message.pro,
+ src/testdir/test_usercommands.vim
+
+Patch 8.2.3150
+Problem: Vim9: argument types are not checked at compile time.
+Solution: Add more type checks. (Yegappan Lakshmanan, closes #8545)
+Files: src/evalfunc.c, src/testing.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3151
+Problem: Vim9: profiling fails if nested function is also profiled.
+Solution: Use the compile type from the outer function. (closes #8543)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3152
+Problem: Vim9: accessing "s:" results in an error.
+Solution: Do not try to lookup a script variable for "s:". (closes #8549)
+Files: src/evalvars.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3153
+Problem: URLs with a dash in the scheme are not recognized.
+Solution: Allow for a scheme with a dash, but not at the start or end.
+ (Tsuyoshi CHO, closes #8299)
+Files: src/misc1.c, src/testdir/test_buffer.vim
+
+Patch 8.2.3154
+Problem: Vim9: some type checks for builtin functions fail.
+Solution: Correct the type checks. (Yegappan Lakshmanan, closes #8551,
+ closes #8550)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3155
+Problem: Some option related code not covered by tests.
+Solution: Add a few test cases. (Dominique Pellé, closes #8552)
+Files: src/testdir/test_options.vim, src/testdir/test_set.vim
+
+Patch 8.2.3156
+Problem: Vim9: term_getansicolors() test fails without +termguicolors.
+Solution: Add a check for the feature. (Dominique Pellé, closes #8555)
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3157
+Problem: Crypt test may fail on MS-Windows.
+Solution: Ignore "[unix]" in the file message. (Christian Brabandt,
+ closes #8561)
+Files: src/testdir/test_crypt.vim
+
+Patch 8.2.3158
+Problem: Strange error message when using islocked() with a number.
+ (Yegappan Lakshmanan)
+Solution: Check that the name is empty.
+Files: src/evalfunc.c, src/testdir/test_functions.vim
+
+Patch 8.2.3159
+Problem: Cursor displayed in wrong position after deleting line.
+Solution: When deleting lines do not approximate botline. (fixes #8559)
+Files: src/change.c
+
+Patch 8.2.3160
+Problem: 'breakindent' does not work well for bulleted and numbered lists.
+Solution: Add the "list" entry to 'breakindentopt'. (Christian Brabandt,
+ closes #8564, closes #1661)
+Files: runtime/doc/options.txt, src/indent.c, src/structs.h,
+ src/testdir/test_breakindent.vim
+
+Patch 8.2.3161
+Problem: Vim9: no error when reltime() has invalid arguments.
+Solution: Add an error. (closes #8562)
+Files: src/time.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3162
+Problem: Vim9: argument types are not checked at compile time.
+Solution: Add more type checks. (Yegappan Lakshmanan, closes #8560)
+Files: runtime/doc/channel.txt, src/clientserver.c, src/cmdhist.c,
+ src/errors.h, src/evalfunc.c, src/evalwindow.c, src/filepath.c,
+ src/globals.h, src/popupwin.c, src/proto/typval.pro, src/sign.c,
+ src/strings.c, src/terminal.c, src/testdir/test_normal.vim,
+ src/testdir/test_reltime.vim, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_expr.vim, src/testing.c, src/textprop.c,
+ src/time.c, src/typval.c
+
+Patch 8.2.3163
+Problem: Location list window may open a wrong file.
+Solution: Also update the qf_ptr field. (Wei-Chung Wen, closes #8565,
+ closes #8566)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.3164
+Problem: MS-Windows: reported version lacks patchlevel, causing some update
+ tools to update too often. (Klaus Frank)
+Solution: Add the patchlevel to the version. (Christian Brabandt)
+Files: src/dosinst.c
+
+Patch 8.2.3165
+Problem: Vim9: in a || expression the error line number may be wrong.
+Solution: Save and restore the line number when checking the type.
+ (closes #8569)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3166
+Problem: Vim9: nested autoload call error overruled by "Unknown error".
+Solution: Check need_rethrow before giving an "Unknown error".
+ (closes #8568)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3167
+Problem: Get E12 in a job callback when searching for tags. (Andy Stewart)
+Solution: Use the sandbox only for executing a command, not for searching.
+ (closes #8511)
+Files: src/tag.c
+
+Patch 8.2.3168
+Problem: Vim9: type error for constant of type any.
+Solution: Do add a runtime type check if a constant has type any.
+ (closes #8570)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3169
+Problem: Vim9: cannot handle nested inline function.
+Solution: Check for nested inline function. (closes #8575)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3170
+Problem: Illegal memory access in test.
+Solution: Check pointer is not before the start of the line.
+Files: src/userfunc.c
+
+Patch 8.2.3171
+Problem: Another illegal memory access in test.
+Solution: Check pointer is after the start of the line.
+Files: src/userfunc.c
+
+Patch 8.2.3172
+Problem: MzScheme test fails. (Christian Brabandt)
+Solution: Correct function name.
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3173
+Problem: Vim9: argument types are not checked at compile time.
+Solution: Add more type checks. (Yegappan Lakshmanan, closes #8581)
+Files: src/diff.c, src/errors.h, src/evalfunc.c, src/globals.h,
+ src/job.c, src/proto/typval.pro, src/strings.c, src/terminal.c,
+ src/testdir/test_vim9_builtin.vim, src/typval.c
+
+Patch 8.2.3174
+Problem: Vim9: "legacy undo" finds "undo" variable.
+Solution: Do not pass lookup function to find_ex_command(). (closes #8563)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3175
+Problem: Vim9: using illegal pointer with inline function inside a lambda.
+Solution: Clear eval_tofree_cmdline when advancing to the next line.
+ (closes #8578)
+Files: src/eval.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3176
+Problem: Vim9: no type error for comparing number with string.
+Solution: Add a runtime type check. (closes #8571)
+Files: src/typval.c, src/errors.h, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3177
+Problem: Vim9: can not use "for _ in expr" at script level.
+Solution: Skip assignment if the loop variable is "_".
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3178
+Problem: Vim9: the file name of an :import cannot be an expression.
+Solution: Accept an expression that results in a string. Do not support
+ :import in a function.
+Files: runtime/doc/vim9.txt, src/vim9script.c, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3179
+Problem: Vim9: cannot assign to an imported variable at script level.
+Solution: Lookup imported items when assigning.
+Files: src/evalvars.c, src/errors.h, src/eval.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3180
+Problem: Vim9: memory leak when concatenating to an imported string.
+Solution: Clear the destination.
+Files: src/evalvars.c
+
+Patch 8.2.3181
+Problem: Vim9: builtin function test fails without channel feature.
+Solution: Add feature checks. (Dominique Pellé, closes #8586) Make feature
+ checks more consistent.
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3182
+Problem: Vim9: crash when using removing items from a constant list.
+ (Yegappan Lakshmanan)
+Solution: When a list was allocated with items copy them.
+Files: src/list.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3183
+Problem: Duplicate error numbers.
+Solution: Adjust the error numbers.
+Files: src/errors.h, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3184
+Problem: Cannot add a digraph with a leading space. It is not easy to list
+ existing digraphs.
+Solution: Add setdigraph(), setdigraphlist(), getdigraph() and
+ getdigraphlist(). (closes #8580)
+Files: runtime/doc/digraph.txt, runtime/doc/eval.txt,
+ runtime/doc/usr_41.txt, src/digraph.c, src/evalfunc.c,
+ src/ex_docmd.c, src/globals.h, src/errors.h,
+ src/proto/digraph.pro, src/testdir/test_digraph.vim
+
+Patch 8.2.3185
+Problem: Vim9: start of inline function found in comment line.
+Solution: Do not check for inline function in comment line. (closes #8589)
+Files: src/userfunc.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3186
+Problem: Vim9: not all failures for import tested
+Solution: Test more import failures
+Files: src/errors.h, src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3187
+Problem: Vim9: popup timer callback is not compiled.
+Solution: Compile the callback when creating the timer.
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/popupwin.c
+
+Patch 8.2.3188
+Problem: Vim9: argument types are not checked at compile time.
+Solution: Add several more type checks, also at runtime. (Yegappan
+ Lakshmanan, closes #8587)
+Files: src/blob.c, src/channel.c, src/clientserver.c, src/cmdexpand.c,
+ src/cmdhist.c, src/dict.c, src/diff.c, src/errors.h, src/eval.c,
+ src/evalbuffer.c, src/evalfunc.c, src/evalvars.c,
+ src/evalwindow.c, src/filepath.c, src/globals.h, src/insexpand.c,
+ src/job.c, src/list.c, src/map.c, src/match.c,
+ src/proto/typval.pro, src/quickfix.c, src/search.c, src/sign.c,
+ src/strings.c, src/terminal.c, src/testdir/test_blob.vim,
+ src/testdir/test_gui.vim, src/testdir/test_vim9_builtin.vim,
+ src/testing.c, src/textprop.c, src/time.c, src/typval.c
+
+Patch 8.2.3189
+Problem: Vim9: error when using "try|".
+Solution: Allow for "|" right after a command.
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3190
+Problem: Error messages are spread out.
+Solution: Move error messages to errors.h and give them a clear name.
+Files: src/globals.h, src/errors.h, src/buffer.c, src/debugger.c,
+ src/digraph.c, src/edit.c, src/ex_cmds.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_eval.c, src/gui.c, src/list.c, src/main.c,
+ src/map.c, src/match.c, src/quickfix.c, src/regexp.c,
+ src/regexp_bt.c, src/regexp_nfa.c, src/register.c, src/search.c,
+ src/session.c, src/spell.c, src/syntax.c, src/time.c,
+ src/userfunc.c, src/vim9execute.c, src/window.c
+
+Patch 8.2.3191
+Problem: Vim9: not enough code is tested.
+Solution: Use CheckLegacyAndVim9Success() in more places. Fix uncovered
+ problems.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_listdict.vim
+
+Patch 8.2.3192 (after 8.2.3190)
+Problem: Build failure with small version (Tony Mechelynck).
+Solution: Remove stray #ifdef.
+Files: src/errors.h
+
+Patch 8.2.3193
+Problem: screenpos() is wrong when the last line is partially visible and
+ 'display' is "lastline".
+Solution: Also compute the position for a partially visible line.
+ (closes #8599)
+Files: src/move.c, src/testdir/test_cursor_func.vim
+
+Patch 8.2.3194
+Problem: Vim9: argument types are not checked at compile time.
+Solution: Add several more type checks, simplify some. (Yegappan
+ Lakshmanan, closes #8598)
+Files: src/diff.c, src/evalbuffer.c, src/evalfunc.c, src/job.c,
+ src/proto/typval.pro, src/sign.c, src/terminal.c,
+ src/testdir/test_vim9_builtin.vim, src/typval.c
+
+Patch 8.2.3195
+Problem: Vim9: unclear error when passing too many arguments to lambda.
+Solution: Pass the expression itself instead of "[expression]".
+ (closes #8604)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3196
+Problem: Vim9: bool expression with numbers only fails at runtime.
+Solution: Check constant to be bool at compile time. (closes #8603)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3197
+Problem: Error messages are spread out.
+Solution: Move a few more error messages to errors.h.
+Files: src/globals.h, src/errors.h, src/edit.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/evalvars.c, src/option.c, src/quickfix.c,
+ src/regexp_bt.c, src/regexp_nfa.c, src/regexp.c, src/undo.c,
+ src/vim9compile.c, src/vim9script.c
+
+Patch 8.2.3198
+Problem: Cannot use 'formatlistpat' for breakindent.
+Solution: Use a negative list indent. (Maxim Kim, closes #8594)
+Files: runtime/doc/options.txt, src/indent.c,
+ src/testdir/test_breakindent.vim
+
+Patch 8.2.3199
+Problem: Vim9: execution speed can be improved.
+Solution: Make the break counter static.
+Files: src/vim9execute.c
+
+Patch 8.2.3200
+Problem: Vim9: hard to guess where a type error is given.
+Solution: Add the function name where possible. (closes #8608)
+Files: src/dict.c, src/proto/dict.pro, src/eval.c, src/list.c,
+ src/vim9compile.c, src/vim9execute.c, src/structs.h,
+ src/vim9type.c, src/proto/vim9type.pro, src/if_py_both.h,
+ src/errors.h, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3201 (after 8.2.3200)
+Problem: Crash in test.
+Solution: Initialize "where".
+Files: src/eval.c, src/evalvars.c
+
+Patch 8.2.3202
+Problem: Vim9: tests are only executed for legacy script.
+Solution: Run more tests also for Vim9 script. Fix uncovered problems.
+Files: src/vim9execute.c, src/ex_docmd.c, src/testdir/test_listdict.vim
+
+Patch 8.2.3203
+Problem: Vim9: compiled string expression causes type error. (Yegappan
+ Lakshmanan)
+Solution: Remove the string type from the stack.
+Files: src/vim9compile.c, src/evalfunc.c
+
+Patch 8.2.3204
+Problem: Display garbled when 'cursorline' is set and lines wrap. (Gabriel
+ Dupras)
+Solution: Avoid inserting lines twice. (closes #7255)
+Files: src/drawscreen.c, src/testdir/test_cursorline.vim,
+ src/testdir/dumps/Test_cursorline_redraw_1.dump,
+ src/testdir/dumps/Test_cursorline_redraw_2.dump
+
+Patch 8.2.3205
+Problem: Coverity reports a null pointer dereference.
+Solution: Change the logic to avoid Coverity gets confused.
+Files: src/vim9compile.c
+
+Patch 8.2.3206
+Problem: Vim9: argument types are not checked at compile time.
+Solution: Add several more type checks. (Yegappan Lakshmanan, closes #8611)
+Files: runtime/doc/eval.txt, src/blob.c, src/cmdhist.c, src/dict.c,
+ src/errors.h, src/evalfunc.c, src/filepath.c, src/globals.h,
+ src/job.c, src/list.c, src/match.c, src/misc1.c, src/popupwin.c,
+ src/proto/typval.pro, src/sign.c, src/terminal.c,
+ src/testdir/test_blob.vim, src/testdir/test_vim9_builtin.vim,
+ src/typval.c
+
+Patch 8.2.3207
+Problem: Vim9: crash when compiling string fails. (Yegappan Lakshmanan)
+Solution: Adjust the type stack length.
+Files: src/vim9compile.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3208
+Problem: Dynamic library load error does not mention why it failed.
+Solution: Add the error message. (Martin Tournoij, closes #8621)
+Files: src/globals.h, src/if_cscope.c, src/if_lua.c, src/if_mzsch.c,
+ src/if_perl.xs, src/if_python.c, src/if_python3.c, src/if_ruby.c,
+ src/if_tcl.c, src/mbyte.c, src/os_win32.c, src/proto/os_win32.pro,
+ src/terminal.c
+
+Patch 8.2.3209
+Problem: Vim9: lambda doesn't find block-local variable.
+Solution: Adjust how a script-local variable is found. (closes #8614)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3210
+Problem: Vim9: searchpair() sixth argument is compiled. (Yegappan
+ Lakshmanan)
+Solution: Only compile the fifth argument.
+Files: src/vim9compile.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3211
+Problem: Vim9: argument types are not checked at compile time.
+Solution: Add several more type checks. Fix type check for matchaddpos().
+ (Yegappan Lakshmanan, closes #8619)
+Files: src/channel.c, src/evalfunc.c, src/evalvars.c, src/if_cscope.c,
+ src/job.c, src/proto/typval.pro,
+ src/testdir/test_vim9_builtin.vim, src/time.c, src/typval.c
+
+Patch 8.2.3212
+Problem: Vim9: execution speed can be improved.
+Solution: Use __builtin_expect() to have the compiler produce better code.
+ (Dominique Pellé, closes #8613)
+Files: src/vim9execute.c
+
+Patch 8.2.3213
+Problem: NOCOMPOUNDSUGS entry in spell file not tested.
+Solution: Add a test. (Dominique Pellé, closes #8624)
+Files: src/testdir/test_spellfile.vim
+
+Patch 8.2.3214
+Problem: MS-Windows: passing /D does not set the install location.
+Solution: Adjust how the installer uses $VIM. Update the documentation.
+ (Christian Brabandt, Ken Takata, closes #8605)
+Files: nsis/gvim.nsi, runtime/doc/os_win32.txt
+
+Patch 8.2.3215
+Problem: Vim9: argument types are not checked at compile time.
+Solution: Add several more type checks. Sort the argument lists.
+ (Yegappan Lakshmanan, closes #8626)
+Files: src/change.c, src/evalfunc.c, src/filepath.c, src/sound.c,
+ src/testdir/test_gui.vim, src/testdir/test_vim9_builtin.vim,
+ src/testing.c
+
+Patch 8.2.3216
+Problem: Vim9: crash when using variable in a loop at script level.
+Solution: Do not clear the variable if a function was defined.
+ Do not create a new entry in sn_var_vals every time.
+ (closes #8628)
+Files: src/eval.c, src/ex_eval.c, src/vim9script.c, src/userfunc.c,
+ src/evalvars.c, src/structs.h
+
+Patch 8.2.3217 (after 8.2.3216)
+Problem: Build failure.
+Solution: Add missing changes.
+Files: src/globals.h
+
+Patch 8.2.3218
+Problem: When using xchaha20 crypt undo file is not removed.
+Solution: Reset 'undofile' and delete the file. (Christian Brabandt,
+ closes #8630, closes #8467)
+Files: src/bufwrite.c, src/crypt.c, src/proto/undo.pro,
+ src/testdir/test_crypt.vim, src/undo.c
+
+Patch 8.2.3219
+Problem: :find searches non-existing directories.
+Solution: Check the path is not "..". Update help. (Christian Brabandt,
+ closes #8612, closes #8533)
+Files: runtime/doc/editing.txt, src/findfile.c,
+ src/testdir/test_findfile.vim
+
+Patch 8.2.3220
+Problem: Test_term_setansicolors() fails in some configurations.
+Solution: Check available features. (Dominique Pellé, closes #8636)
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3221
+Problem: Vim9: argument types are not checked at compile time.
+Solution: Add several more type checks. (Yegappan Lakshmanan, closes #8632)
+Files: src/evalfunc.c, src/popupwin.c, src/proto/typval.pro,
+ src/testdir/test_assert.vim, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_script.vim, src/testing.c, src/typval.c
+
+Patch 8.2.3222
+Problem: Vim9: cannot use loop variable later as lambda argument.
+Solution: When not in function context check the current block ID.
+ (closes #8637)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3223
+Problem: Vim: using {} block in autoloaded omnifunc fails.
+Solution: Allow using {} block when text is locked. (closes #8631)
+Files: src/ex_cmds.h, src/testdir/test_ins_complete.vim
+
+Patch 8.2.3224
+Problem: Cannot call script-local function after :vim9cmd. (Christian J.
+ Robinson)
+Solution: Skip over "<SNR>123".
+Files: src/vim9compile.c, src/eval.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3225
+Problem: Incsearch highlighting is attempted halfway a mapping.
+Solution: Only do incsearch highlighting if keys were typed or there is no
+ more typeahead.
+Files: src/ex_getln.c
+
+Patch 8.2.3226
+Problem: New digraph functions use old naming scheme.
+Solution: Use the digraph_ prefix. (Hirohito Higashi, closes #8642)
+Files: runtime/doc/digraph.txt, runtime/doc/eval.txt,
+ runtime/doc/usr_41.txt, src/digraph.c, src/edit.c, src/errors.h,
+ src/evalfunc.c, src/proto/digraph.pro,
+ src/testdir/test_digraph.vim
+
+Patch 8.2.3227
+Problem: 'virtualedit' can only be set globally.
+Solution: Make 'virtualedit' global-local. (Gary Johnson, closes #8638)
+Files: runtime/doc/options.txt, src/buffer.c, src/change.c,
+ src/drawscreen.c, src/edit.c, src/misc2.c, src/normal.c,
+ src/ops.c, src/option.c, src/option.h, src/optiondefs.h,
+ src/optionstr.c, src/proto/option.pro, src/register.c,
+ src/structs.h, src/testdir/test_virtualedit.vim
+
+Patch 8.2.3228
+Problem: Cannot use a simple block for the :command argument. (Maarten
+ Tournoij)
+Solution: Recognize a simple {} block. (issue #8623)
+Files: runtime/doc/map.txt, src/misc2.c, src/proto/misc2.pro,
+ src/usercmd.c, src/testdir/test_usercommands.vim
+
+Patch 8.2.3229
+Problem: Vim9: runtime and compile time type checks are not the same.
+Solution: Add more runtime type checks for builtin functions. (Yegappan
+ Lakshmanan, closes #8646)
+Files: src/arglist.c, src/change.c, src/channel.c, src/cindent.c,
+ src/clientserver.c, src/cmdhist.c, src/dict.c, src/diff.c,
+ src/digraph.c, src/errors.h, src/eval.c, src/evalbuffer.c,
+ src/evalfunc.c, src/evalwindow.c, src/ex_docmd.c, src/ex_getln.c,
+ src/filepath.c, src/findfile.c, src/float.c, src/fold.c,
+ src/getchar.c, src/indent.c, src/insexpand.c, src/job.c,
+ src/json.c, src/list.c, src/mark.c, src/match.c, src/mbyte.c,
+ src/menu.c, src/misc1.c, src/move.c, src/popupwin.c,
+ src/proto/typval.pro, src/quickfix.c, src/search.c, src/sign.c,
+ src/sound.c, src/strings.c, src/terminal.c,
+ src/testdir/test_assert.vim, src/testdir/test_blob.vim,
+ src/testdir/test_execute_func.vim,
+ src/testdir/test_float_func.vim, src/testdir/test_functions.vim,
+ src/testdir/test_glob2regpat.vim, src/testdir/test_listdict.vim,
+ src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_script.vim, src/testing.c, src/textprop.c,
+ src/time.c, src/typval.c, src/undo.c
+
+Patch 8.2.3230
+Problem: Vim9: type error when function return type is not known yet.
+Solution: When return type is unknown, use "any". (closes #8644)
+Files: src/vim9compile.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3231
+Problem: Build failure with small features.
+Solution: Adjust #ifdef.
+Files: src/errors.h
+
+Patch 8.2.3232 (after 8.2.3229)
+Problem: system() does not work without a second argument.
+Solution: Do not require a second argument. (Yegappan Lakshmanan,
+ closes #8651, closes #8650)
+Files: src/misc1.c, src/proto/typval.pro,
+ src/testdir/test_vim9_builtin.vim, src/typval.c
+
+Patch 8.2.3233
+Problem: prop_list() and prop_find() do not indicate the buffer for the
+ used type.
+Solution: Add "type_bufnr" to the results. (closes #8647)
+Files: runtime/doc/textprop.txt, src/testdir/test_textprop.vim,
+ src/textprop.c
+
+Patch 8.2.3234
+Problem: Crash when printing long string with Lua.
+Solution: Remove lua_pop(). (Martin Tournoij, closes #8648)
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.3235
+Problem: Cannot use lambda in {} block in user command. (Martin Tournoij)
+Solution: Do not go over the end of the lambda.
+Files: src/userfunc.c, src/testdir/test_usercommands.vim
+
+Patch 8.2.3236
+Problem: mode() does not indicate using CTRL-O in Select mode.
+Solution: Use "vs" and similar. (closes #8640)
+Files: runtime/doc/eval.txt, src/globals.h, src/misc1.c, src/normal.c,
+ src/testdir/test_functions.vim
+
+Patch 8.2.3237
+Problem: When a builtin function gives an error processing continues.
+Solution: In Vim9 script return FAIL in get_func_tv().
+Files: src/userfunc.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3238
+Problem: Vim9: error message does not indicate the location.
+Solution: Add the relevant text. (issue #8634)
+Files: src/errors.h, src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3239
+Problem: Vim9: no error using heredoc for a number variable.
+Solution: Add a type check. (closes #8627)
+Files: src/vim9compile.c, src/evalvars.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3240
+Problem: Lua print() does not work properly.
+Solution: Put back lua_pop().
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.3241
+Problem: Vim9: memory leak when function reports an error.
+Solution: Clear the return value.
+Files: src/userfunc.c
+
+Patch 8.2.3242
+Problem: Vim9: valgrind reports leaks in builtin function test.
+Solution: Do not start a job.
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3243
+Problem: MS-Windows: the "edit with multiple Vim" choice is not that
+ useful.
+Solution: Change it to "Edit with multiple tabs". (Michael Soyka,
+ closes #8645)
+Files: src/GvimExt/gvimext.cpp, src/GvimExt/gvimext.h
+
+Patch 8.2.3244
+Problem: Lua 5.3 print() with a long string crashes.
+Solution: Use a growarray instead of a Lua buffer. (Yegappan Lakshmanan,
+ closes #8655)
+Files: src/if_lua.c, src/misc2.c, src/proto/misc2.pro
+
+Patch 8.2.3245
+Problem: The crypt key may appear in a swap partition.
+Solution: When using xchacha20 use sodium_mlock(). (Christian Brabandt,
+ closes #8657)
+Files: src/buffer.c, src/crypt.c, src/errors.h, src/fileio.c,
+ src/memline.c, src/vim.h
+
+Patch 8.2.3246
+Problem: Memory use after free.
+Solution: When clearing a string option set the pointer to "empty_option".
+Files: src/option.c
+
+Patch 8.2.3247
+Problem: Using uninitialized memory when checking for crypt method.
+Solution: Check the header length before using the salt and seed.
+Files: src/fileio.c
+
+Patch 8.2.3248
+Problem: Vim9: error message for wrong input uses wrong line number.
+Solution: Use the line number of the start of the command. (issue #8653)
+Files: src/vim9script.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3249
+Problem: Vim9: error for re-imported function with default argument.
+Solution: Do not check argument type if it is still unknown. (closes #8653)
+Files: src/vim9type.c, src/proto/vim9type.pro, src/vim9script.c,
+ src/vim.h, src/eval.c, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3250
+Problem: MS-Windows: cannot build with libsodium.
+Solution: Change FEAT_SODIUM into HAVE_SODIUM. (Christian Brabandt,
+ closes #8668, closes #8663)
+Files: src/Make_mvc.mak
+
+Patch 8.2.3251
+Problem: Listing builtin_gui as an available terminal is confusing.
+Solution: Do not list builtin_gui. (Christian Brabandt, closes #8669,
+ closes #8661)
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.3252
+Problem: Duplicated code for adding buffer lines.
+Solution: Move code to a common function. Also move map functions to map.c.
+ (Yegappan Lakshmanan, closes #8665)
+Files: src/evalbuffer.c, src/evalfunc.c, src/map.c, src/proto/map.pro
+
+Patch 8.2.3253
+Problem: Channel test fails randomly.
+Solution: Add a sleep after sending the "echoerr" command. (Michael Soyka)
+Files: src/testdir/test_channel.vim, src/testdir/test_channel.py
+
+Patch 8.2.3254
+Problem: win_gettype() does not recognize a quickfix window.
+Solution: Add "quickfix" and "loclist". (Yegappan Lakshmanan, closes #8676)
+Files: runtime/doc/eval.txt, src/evalwindow.c, src/misc2.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.3255
+Problem: ci" finds following string but ci< and others don't.
+Solution: When not inside an object find the start. (Connor Lane Smit,
+ closes #8670)
+Files: src/search.c, src/testdir/test_textobjects.vim, src/textobject.c
+
+Patch 8.2.3256
+Problem: Executable test may fail on new Ubuntu system.
+Solution: Consider /usr/bin/cat and /bin/cat the same.
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.3257
+Problem: Calling prop_find() with -1 for ID gives erroneous error. (Naohiro
+ Ono)
+Solution: When passing -1 use -2. (closes #8674)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.3258
+Problem: Error messages have the wrong text.
+Solution: Adjust the error message.
+Files: src/errors.h, src/typval.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3259
+Problem: When 'indentexpr' causes an error the did_throw flag may remain
+ set.
+Solution: Reset did_throw and show the error. (closes #8677)
+Files: src/indent.c, src/ex_docmd.c, src/proto/ex_docmd.pro
+
+Patch 8.2.3260
+Problem: Build failure with small features.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.2.3261
+Problem: Vim9: when compiling repeat(123, N) return type is number.
+Solution: Make return type a string. (closes #8664)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3262
+Problem: Build failure when ABORT_ON_INTERNAL_ERROR is defined.
+Solution: Adjust how estack_len_before is used.
+Files: src/ex_docmd.c
+
+Patch 8.2.3263
+Problem: Vim9: "..=" does not accept same types as the ".." operator.
+Solution: Convert value to string like ".." does. (issue #8664)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3264 (after 8.2.3263)
+Problem: Vim9: assign test fails.
+Solution: Add missing change.
+Files: src/eval.c
+
+Patch 8.2.3265
+Problem: Smartcase does not work correctly in very magic pattern.
+Solution: Take the magicness into account when skipping over regexp items.
+ (Christian Brabandt, closes #8682, closes #7845)
+Files: src/search.c, src/testdir/test_search.vim
+
+Patch 8.2.3266
+Problem: Vim9: assignment with two indexes may check next line.
+Solution: Limit the number of lines to avoid checking the next line when
+ assigning to a LHS subscript. (closes #8660)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3267
+Problem: Vim9: crash when disassembling a function that uses a deleted
+ script variable.
+Solution: Check the variable still exists. (closes #8683)
+Files: src/vim9execute.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3268
+Problem: Cannot use a block with :autocmd like with :command.
+Solution: Add support for a {} block after :autocmd. (closes #8620)
+Files: runtime/doc/autocmd.txt, runtime/doc/map.txt, src/autocmd.c,
+ src/proto/autocmd.pro, src/usercmd.c, src/proto/usercmd.pro,
+ src/ex_docmd.c, src/vim.h, src/testdir/test_autocmd.vim
+
+Patch 8.2.3269
+Problem: Vim9: wrong argument check for partial. (Naohiro Ono)
+Solution: Handle getting return type without arguments. Correct the minimal
+ number of arguments for what is included in the partial.
+ (closes #8667)
+Files: src/evalfunc.c, src/vim9type.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3270
+Problem: prop_find() finds property with ID -2.
+Solution: Use a separate flag to indicate an ID was specified. (issue #8674)
+Files: src/textprop.c
+
+Patch 8.2.3271
+Problem: Vim9: cannot use :command or :au with a block in a :def function.
+Solution: Recognize the start of the block.
+Files: src/userfunc.c, src/usercmd.c, src/ex_docmd.c,
+ src/proto/ex_docmd.pro, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3272
+Problem: Cannot use id zero with prop_find(). (Naohiro Ono)
+Solution: Also accept id zero.
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.3273
+Problem: Autocmd test fails.
+Solution: Require white space before the "{" that starts a block.
+Files: src/userfunc.c
+
+Patch 8.2.3274
+Problem: Macro for printf format check can be simplified.
+Solution: Add ATTRIBUTE_FORMAT_PRINTF(). (Dominique Pellé, issue #8635)
+Files: src/channel.c, src/gui_xim.c, src/if_mzsch.c, src/nbdebug.c,
+ src/nbdebug.h, src/netbeans.c, src/proto.h, src/term.c, src/vim.h,
+ src/vim9execute.c
+
+Patch 8.2.3275
+Problem: Optimizer can use hints about ga_grow() normally succeeding.
+Solution: Use GA_GROW_FAILS() and GA_GROW_OK() in several places. (Dominique
+ Pellé, issue #8635)
+Files: src/arglist.c, src/macros.h, src/vim9execute.c, src/vim9compile.c
+
+Patch 8.2.3276
+Problem: Vim9: exists() can only be evaluated at runtime.
+Solution: Evaluate at compile time for option name literals. (closes #8437)
+Files: src/vim9compile.c, src/evalfunc.c, src/proto/evalfunc.pro,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3277 (after 8.2.3276)
+Problem: Vim9: compiled has() does not work properly.
+Solution: Fix check for has() vs exists().
+Files: src/vim9compile.c
+
+Patch 8.2.3278
+Problem: Vim9: error when adding 1 to float.
+Solution: Accept t_number_bool. (closes #8687)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3279
+Problem: Vim9: cannot use block in cmdline window.
+Solution: Add EX_CMDWIN to the CMD_block flags. (closes #8689)
+Files: src/ex_cmds.h, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3280
+Problem: 'virtualedit' local to buffer is not the best solution.
+Solution: Make it window-local. (Gary Johnson, closes #8685)
+Files: runtime/doc/options.txt, src/buffer.c, src/drawscreen.c,
+ src/ops.c, src/option.c, src/option.h, src/optionstr.c,
+ src/structs.h, src/testdir/test_virtualedit.vim
+
+Patch 8.2.3281
+Problem: Vim9: TODO items in tests can be taken care of.
+Solution: Update test for now working functionality. (closes #8694)
+Files: src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3282
+Problem: Vim9: error about using -complete without -nargs is confusing.
+Solution: Change the wording.
+Files: src/usercmd.c, src/errors.h
+
+Patch 8.2.3283
+Problem: Julia filetype is not recognized
+Solution: Add filetype detection. (Christian Clason, closes #8700)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3284
+Problem: No error for insert() or remove() changing a locked blob.
+Solution: Check a blob is not locked before changing it. (Sean Dewar,
+ closes #8696)
+Files: src/blob.c, src/errors.h, src/eval.c, src/list.c,
+ src/proto/blob.pro, src/testdir/test_blob.vim,
+ src/testdir/test_eval_stuff.vim
+
+Patch 8.2.3285
+Problem: Scdoc filetype is not recognized.
+Solution: Add filetype detection. (Gregory Anders, closes #8701)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3286
+Problem: win_enter_ext() has too many boolean arguments.
+Solution: use one flags argument with defined values.
+Files: src/window.c
+
+Patch 8.2.3287
+Problem: Channel events not handled in BufEnter autocommand.
+Solution: Decrement dont_parse_messages earlier. (Tim Pope, closes #8697)
+Files: src/window.c, src/testdir/test_channel.vim
+
+Patch 8.2.3288
+Problem: Cannot easily access namespace dictionaries from Lua.
+Solution: Add vim.g, vim.b, etc. (Yegappan Lakshmanan, closes #8693,
+ from NeoVim)
+Files: runtime/doc/if_lua.txt, src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.3289 (after 8.2.3287)
+Problem: Compiler warning for unused variable with small features.
+Solution: Rearrange #ifdefs.
+Files: src/window.c
+
+Patch 8.2.3290
+Problem: Vim9: compiling dict may use pointer after free and leak memory on
+ failure.
+Solution: Pass a pointer to generate_PUSHS(). (Zdenek Dohnal, closes #8699)
+Files: src/vim9compile.c
+
+Patch 8.2.3291
+Problem: Coverity warns for not checking return value.
+Solution: If dict_add() fails give an error message.
+Files: src/if_lua.c, src/testdir/test_lua.vim
+
+Patch 8.2.3292
+Problem: Underscore in very magic pattern causes a hang. Pattern with \V
+ are case sensitive. (Yutao Yuan)
+Solution: Adjust condition for magicness and advance pointer. (Christian
+ Brabandt, closes #8707, closes #8704, closes #8705)
+Files: src/search.c, src/testdir/test_search.vim
+
+Patch 8.2.3293
+Problem: Finding completions may cause an endless loop.
+Solution: Use a better way to check coming back where the search started.
+ (Andy Gozas, closes #8672, closes #8671)
+Files: src/insexpand.c, src/testdir/Make_all.mak,
+ src/testdir/test_ins_complete_no_halt.vim
+
+Patch 8.2.3294
+Problem: Lua: memory leak when adding dict item fails.
+Solution: Free the typval and the dict item.
+Files: src/if_lua.c
+
+Patch 8.2.3295
+Problem: 'cursorline' should not apply to 'breakindent'.
+Solution: Make 'cursorline' apply to 'breakindent' and 'showbreak'
+ consistently. (closes #8684)
+Files: src/drawline.c, src/testdir/dumps/Test_Xcursorline_19.dump,
+ src/testdir/dumps/Test_Xcursorline_20.dump,
+ src/testdir/dumps/Test_Xcursorline_21.dump,
+ src/testdir/dumps/Test_Xcursorline_22.dump,
+ src/testdir/dumps/Test_Xcursorline_23.dump,
+ src/testdir/dumps/Test_Xcursorline_24.dump,
+ src/testdir/dumps/Test_diff_with_cul_bri_01.dump,
+ src/testdir/dumps/Test_diff_with_cul_bri_02.dump,
+ src/testdir/dumps/Test_diff_with_cul_bri_03.dump,
+ src/testdir/dumps/Test_diff_with_cul_bri_04.dump,
+ src/testdir/test_cursorline.vim, src/testdir/test_diffmode.vim
+
+Patch 8.2.3296
+Problem: Vim9: cannot add a number to a float.
+Solution: Accept a number if the destination is a float. (closes #8703)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3297
+Problem: Cannot use all commands inside a {} block after :command and
+ :autocmd.
+Solution: Do consider \n to separate commands. (closes #8620)
+Files: runtime/doc/map.txt, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/ex_eval.c, src/proto/ex_eval.pro, src/eval.c, src/evalvars.c,
+ src/ex_cmds.c, src/syntax.c, src/userfunc.c, src/vim9compile.c,
+ src/vim9script.c, src/errors.h, src/testdir/test_autocmd.vim,
+ src/testdir/test_usercommands.vim
+
+Patch 8.2.3298
+Problem: Build failure with small features.
+Solution: Add #ifdef.
+Files: src/ex_docmd.c
+
+Patch 8.2.3299
+Problem: Vim9: exists() does not handle much at compile time.
+Solution: Handle variable names. (closes #8688)
+Files: src/vim9compile.c, src/evalfunc.c,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3300
+Problem: Lua: can only execute one Vim command at a time. Not easy to get
+ the Vim version.
+Solution: Make vim.command() accept multiple lines. Add vim.version().
+ (Yegappan Lakshmanan, closes #8716)
+Files: runtime/doc/if_lua.txt, src/evalfunc.c, src/if_lua.c,
+ src/proto/evalfunc.pro, src/testdir/test_lua.vim,
+ src/testdir/test_shell.vim
+
+Patch 8.2.3301
+Problem: Memory allocation functions don't have their own place.
+Solution: Move memory allocation functions to alloc.c. (Yegappan
+ Lakshmanan, closes #8717)
+Files: Filelist, src/Make_ami.mak, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak, src/Make_vms.mms, src/Makefile, src/README.md,
+ src/alloc.c, src/misc2.c, src/proto.h, src/proto/alloc.pro,
+ src/proto/misc2.pro
+
+Patch 8.2.3302
+Problem: Coverity is not run from github.
+Solution: Add a coverity script. (James McCoy, closes #8714)
+Files: .github/workflows/coverity.yml, Filelist
+
+Patch 8.2.3303
+Problem: Some structures could be smaller.
+Solution: Rearrange members to reduce size. (Dominique Pellé, closes #8725)
+Files: src/structs.h, src/vim9.h, src/vim9execute.c
+
+Patch 8.2.3304
+Problem: Popup window title with wide characters is truncated.
+Solution: Use vim_strsize() instead of MB_CHARLEN(). (Naruhiko Nishino,
+ closes #8721)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_multibytetitle.dump
+
+Patch 8.2.3305
+Problem: Vim9: :finally in skipped block not handled correctly.
+Solution: Check whether :finally is in a skipped block. (Naruhiko Nishino,
+ closes #8724)
+Files: src/ex_eval.c, src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3306
+Problem: Unexpected "No matching autocommands".
+Solution: Do not give the message when aborting. Mention the arguments in
+ the message. (closes #8690)
+Files: src/autocmd.c,
+
+Patch 8.2.3307
+Problem: Vim9: :echoconsole cannot access local variables.
+Solution: Handle like other :echo commands. (closes #8708)
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3308
+Problem: Vim9: no runtime check for argument type if a function only has
+ varargs.
+Solution: Also check argument types if uf_va_type is set. (closes #8715)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3309
+Problem: Vim9: divide by zero causes a crash.
+Solution: Give an error message. (closes #8727)
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3310
+Problem: Vim9: unpack assignment does not mention source of type error.
+Solution: Mention the argument number. (closes #8719)
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3311
+Problem: Vim9: check for DO_NOT_FREE_CNT is very slow.
+Solution: Move to a separate function so it can be skipped by setting
+ $TEST_SKIP_PAT.
+Files: src/testdir/test_vim9_expr.vim, src/testdir/runtest.vim
+
+Patch 8.2.3312
+Problem: Vim9: after "if false" line breaks in expression not skipped.
+Solution: Do parse the expression. (closes #8723)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3313
+Problem: Unused code in win_exchange() and frame_remove().
+Solution: Remove the code. (closes #8728)
+Files: src/window.c
+
+Patch 8.2.3314
+Problem: Behavior of exists() in a :def function is unpredictable.
+Solution: Add exists_compiled().
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/errors.h, src/vim9compile.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3315
+Problem: Cannot use single quote in a float number for readability.
+Solution: Support single quotes like in numbers. (closes #8713)
+Files: src/typval.c, src/float.c, src/proto/float.pro, src/json.c,
+ src/viminfo.c, src/testdir/test_float_func.vim
+
+Patch 8.2.3316 (after 8.2.3315)
+Problem: Float test fails.
+Solution: Add missing change.
+Files: src/evalfunc.c
+
+Patch 8.2.3317
+Problem: Vim9: No error for missing white space before return type.
+Solution: Check for white space. (closes #8733)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3318
+Problem: Vim9: cannot ignore quotes in number at the command line.
+Solution: Use in_vim9script() so that after ":vim9" quotes are ignored.
+Files: src/typval.c, src/testdir/test_float_func.vim
+
+Patch 8.2.3319
+Problem: Coverity action on github does not work.
+Solution: Remove undefined $SRCDIR. (James McCoy, closes #8739)
+Files: .github/workflows/coverity.yml
+
+Patch 8.2.3320
+Problem: Some local functions are not static.
+Solution: Add "static". Move snprintf() related code to strings.c.
+ (Yegappan Lakshmanan, closes #8734)
+Files: src/alloc.c, src/channel.c, src/dict.c, src/digraph.c, src/edit.c,
+ src/ex_docmd.c, src/getchar.c, src/job.c, src/list.c,
+ src/message.c, src/profiler.c, src/proto/channel.pro,
+ src/proto/dict.pro, src/proto/digraph.pro, src/proto/edit.pro,
+ src/proto/ex_docmd.pro, src/proto/getchar.pro, src/proto/job.pro,
+ src/proto/list.pro, src/proto/profiler.pro, src/proto/spell.pro,
+ src/proto/vim9compile.pro, src/proto/vim9script.pro,
+ src/proto/vim9type.pro, src/spell.c, src/strings.c,
+ src/vim9compile.c, src/vim9script.c, src/vim9type.c, src/window.c
+
+Patch 8.2.3321
+Problem: Some code is not tested.
+Solution: Add some more tests. (Dominique Pellé, closes #8735)
+Files: src/testdir/test_excmd.vim, src/testdir/test_writefile.vim
+
+Patch 8.2.3322
+Problem: Vim9: checking type of dict does not check member type.
+Solution: When getting the type of a typval use dv_type and lv_type.
+ (closes #8732)
+Files: src/vim9type.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3323
+Problem: Help tag for exists_compiled() is wrong. (Maxim Kim)
+Solution: Adjust the help tag.
+Files: runtime/doc/eval.txt
+
+Patch 8.2.3324
+Problem: Vim9: Cannot use :silent with :endwhile.
+Solution: Allow for using the :silent modifier. (closes #8737)
+Files: src/ex_eval.c, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3325
+Problem: Digraph test fails when LC_ALL is set to "C".
+Solution: When restoring 'encoding' set it to "utf-8". (closes #8742)
+Files: src/testdir/test_digraph.vim
+
+Patch 8.2.3326
+Problem: Vim9: no error passing an empty list of the wrong type.
+Solution: Use ISN_SETTYPE also for "list<any>". (closes #8732)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3327
+Problem: No check for sysconf() failing.
+Solution: If sysconf() fails use SIGSTKSZ for the signal stack size.
+ (Zdenek Dohnal, closes #8743)
+Files: src/os_unix.c
+
+Patch 8.2.3328
+Problem: Coverity error for not checking return value.
+Solution: Check value is not negative.
+Files: src/spellfile.c
+
+Patch 8.2.3329
+Problem: v_lock not set when getting value of environment variable.
+Solution: Set v_lock to zero.
+Files: src/typval.c
+
+Patch 8.2.3330
+Problem: Coverity reports using uninitialized field.
+Solution: Initialize the field early.
+Files: src/tag.c
+
+Patch 8.2.3331
+Problem: Coverity warns for using value without boundary check.
+Solution: Add a boundary check.
+Files: src/viminfo.c
+
+Patch 8.2.3332
+Problem: Vim9: cannot assign to range in list.
+Solution: Implement overwriting a list range.
+Files: src/vim9compile.c, src/vim9execute.c, src/list.c,
+ src/proto/list.pro, src/eval.c, src/proto/eval.pro,
+ src/testdir/test_listdict.vim, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3333
+Problem: Vim9: not enough tests run with Vim9.
+Solution: Run a few more tests in Vim9 script and :def function.
+Files: src/testdir/test_listdict.vim, src/testdir/vim9.vim
+
+Patch 8.2.3334
+Problem: Vim9: not enough tests run with Vim9.
+Solution: Run a few more tests in Vim9 script and :def function. Fix
+ islocked(). Fix error for locking local variable.
+Files: src/evalfunc.c, src/vim9compile.c, src/testdir/test_listdict.vim
+
+Patch 8.2.3335
+Problem: Vim9: not enough tests run with Vim9.
+Solution: Run a few more tests in Vim9 script and :def function. Fix that
+ items(), keys() and values() return zero for a NULL dict.
+ Make join() return an empty string for a NULL list. Make sort()
+ return an empty list for a NULL list.
+Files: src/dict.c, src/list.c, src/testdir/test_listdict.vim,
+ src/testdir/vim9.vim
+
+Patch 8.2.3336
+Problem: Behavior of negative index in list change changed. (Naruhiko
+ Nishino)
+Solution: Only change it for Vim9 script. (closes #8749)
+Files: src/list.c, src/testdir/test_listdict.vim
+
+Patch 8.2.3337
+Problem: Completing "call g:" returns entries with just "g:". (Naohiro Ono)
+Solution: Skip empty strings returned by get_user_func_name(). (closes #8753)
+Files: src/evalfunc.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3338
+Problem: Vim9: no type check when assigning a list range. (Naohiro Ono)
+Solution: Check the member type. (closes #8750)
+Files: src/list.c, src/testdir/test_listdict.vim
+
+Patch 8.2.3339
+Problem: Vim9: cannot lock a member in a local dict.
+Solution: Get the local dict from the stack and pass it to get_lval().
+Files: src/eval.c, src/vim9execute.c, src/vim9compile.c, src/vim9.h,
+ src/globals.h, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3340 (after 8.2.3339)
+Problem: Accessing uninitialized pointer.
+Solution: Set pointer to NULL.
+Files: src/eval.c
+
+Patch 8.2.3341
+Problem: Vim9: function call aborted despite try/catch. (Naohiro Ono)
+Solution: Ignore error caught by try/catch. (closes #8755)
+Files: src/evalvars.c, src/vim9execute.c, src/message.c, src/time.c,
+ src/globals.h, src/testdir/vim9.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3342 (after 8.2.3341)
+Problem: Test for :let errors fails.
+Solution: Adjust the test and how to avoid a second error message.
+Files: src/evalvars.c, src/testdir/test_let.vim
+
+Patch 8.2.3343 (after 8.2.3342)
+Problem: Vim9: autoload test fails.
+Solution: Adjust the way the second message is avoided
+Files: src/evalvars.c
+
+Patch 8.2.3344 (after 8.2.3343)
+Problem: Vimscript test fails.
+Solution: Have test verify first error instead of second
+Files: src/testdir/test_vimscript.vim
+
+Patch 8.2.3345
+Problem: Some code not covered by tests.
+Solution: Add a few more tests. (Dominique Pellé, closes #8757)
+Files: src/testdir/test_arglist.vim, src/testdir/test_cmdline.vim,
+ src/testdir/test_spellfile.vim, src/testdir/test_substitute.vim
+
+Patch 8.2.3346
+Problem: Vim9: no error for using "." for concatenation after ":vim9cmd".
+ (Naohiro Ono)
+Solution: Check for Vim9 script syntax. (closes #8756)
+Files: src/eval.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3347
+Problem: Check for legacy script is incomplete. (Naohiro Ono)
+Solution: Also check the :legacy modifier. Use for string concatenation
+ with "." and others (issue #8756)
+Files: src/vim9script.c, src/proto/vim9script.pro, src/eval.c,
+ src/typval.c, src/evalvars.c, src/errors.h, src/ex_docmd.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3348
+Problem: line2byte() returns wrong value after adding textprop. (Yuto
+ Kimura)
+Solution: Reduce the length by the size of the text property. (closes #8759)
+Files: src/memline.c, src/testdir/test_textprop.vim
+
+Patch 8.2.3349 (after 8.2.3347)
+Problem: Eval test for scriptversion fails.
+Solution: Fix off-by-one error.
+Files: src/vim9script.c
+
+Patch 8.2.3350 (after 8.2.3348)
+Problem: Text properties test fails on MS-Windows.
+Solution: Set fileformat to unix.
+Files: src/testdir/test_textprop.vim
+
+Patch 8.2.3351
+Problem: Vim9: using a function by name may delete it. (Naohiro Ono)
+Solution: Increment the reference count when using a function by name.
+ (closes #8760)
+Files: src/evalvars.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3352
+Problem: Vim9: error for nested :enddef has wrong line number.
+Solution: Compute the line number.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3353
+Problem: Vim9: type of argument for negate not checked at compile time.
+Solution: Add a compile time check.
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3354
+Problem: Build failure with +byte_offset but without +textprop. (John
+ Marriott)
+Solution: Adjust the #ifdef.
+Files: src/memline.c
+
+Patch 8.2.3355
+Problem: MS-Windows: compiler warning for 64-32 bit conversion.
+Solution: Add type casts.
+Files: src/memline.c
+
+Patch 8.2.3356
+Problem: Adding many text properties requires a lot of function calls.
+Solution: Add the prop_add_list() function. (Yegappan Lakshmanan,
+ closes #8751)
+Files: runtime/doc/eval.txt, runtime/doc/textprop.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/proto/textprop.pro,
+ src/testdir/test_textprop.vim, src/testdir/test_vim9_builtin.vim,
+ src/textprop.c
+
+Patch 8.2.3357
+Problem: Crash when 'virtualedit' is set and window is narrow.
+Solution: Check that width is not zero. (closes #8767)
+Files: src/misc2.c, src/testdir/test_number.vim
+
+Patch 8.2.3358
+Problem: Structurizr files are not recognized.
+Solution: Recognize the file by contents. (Bastian Venthur, closes #8764)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3359
+Problem: Vim9: error for type when variable is not set.
+Solution: Give a specific error for a NULL function. (closes #8773)
+Files: src/vim9type.c, src/errors.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3360
+Problem: User function completion fails with dict function.
+Solution: Do not stop sequencing through the list if user functions when
+ encountering an empty name. (Naohiro Ono, closes #8765,
+ closes #8774)
+Files: src/evalfunc.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3361
+Problem: Vim9: crash with nested :while.
+Solution: Handle skipping better. (Naruhiko Nishino, closes #8778)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3362
+Problem: Buffer overflow when completing long tag name.
+Solution: Allocate the buffer dynamically. (Gregory Anders, closes #8769)
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.2.3363
+Problem: When :edit reuses the current buffer the alternate file is set to
+ the same buffer.
+Solution: Only set the alternate file when not reusing the buffer.
+ (closes #8783)
+Files: src/ex_cmds.c, src/testdir/test_undo.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3364
+Problem: Vim9: crash when :for is skipped.
+Solution: Skip more code generation. (Naruhiko Nishino, closes #8777)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3365
+Problem: Vim9: cannot use option for all operations.
+Solution: Recognize more operations. (closes #8779)
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/ex_docmd.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3366
+Problem: Vim9: debugging elseif does not stop before condition.
+Solution: Move debug statement to after the jump. (closes #8781)
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3367
+Problem: Vim9: :@r executing a register is inconsistent.
+Solution: Use "@r" as the start of an expression. (issue #8779)
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3368
+Problem: Not all Racket files are recognized.
+Solution: Also recognize .rktl and .rktd files. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3369
+Problem: Auto formatting after "cw" leaves cursor in wrong spot.
+Solution: Do not auto-format after the delete. (closes #8789)
+Files: src/ops.c, src/testdir/test_textformat.vim
+
+Patch 8.2.3370
+Problem: Vim9: no check for white space before type in declaration.
+ (Naohiro Ono)
+Solution: Check for white space like in a compiled function. (closes #8785)
+Files: src/eval.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3371
+Problem: Vim9: :$ENV cannot be followed by ->func() in next line.
+Solution: Use "$ENV" as the start of an expression. (closes #8790)
+Files: src/ex_docmd.c, src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3372
+Problem: line2byte() value wrong when adding a text property. (Yuto Kimura)
+Solution: Adjust length for text property. (closes #8772) Also fix it for
+ deleting a line.
+Files: src/memline.c, src/testdir/test_textprop.vim
+
+Patch 8.2.3373 (after 8.2.3372)
+Problem: text property test fails on MS-Windows.
+Solution: Set fileformat to "unix"
+Files: src/testdir/test_textprop.vim
+
+Patch 8.2.3374
+Problem: Pyret files are not recognized.
+Solution: Recognize .arr files as Pyret. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3375
+Problem: Using uninitialized memory.
+Solution: Initialize textprop_save_len.
+Files: src/memline.c
+
+Patch 8.2.3376
+Problem: Vim9: no warning that "@r" does not do anything.
+Solution: Give a "no effect" error. (closes #8779)
+Files: src/ex_eval.c, src/proto/ex_eval.pro, src/vim9compile.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3377
+Problem: Vim9: :disass completion does not understand "s:".
+Solution: Expand "s:" to a pattern. (closes #8780)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3378
+Problem: MS-Windows: completing environment variables with % is wrong.
+Solution: Only complete environment variables with $. (Albert Liu,
+ closes #8791)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3379
+Problem: Crash when using NULL job.
+Solution: Copy static string into buffer. (issue #8260)
+Files: src/job.c, src/testdir/test_channel.vim
+
+Patch 8.2.3380
+Problem: Crash when using NULL string for funcref().
+Solution: Check for NULL argument. (issue #8260)
+Files: src/evalfunc.c, src/testdir/test_expr.vim
+
+Patch 8.2.3381
+Problem: Crash when using NULL list with sign functions.
+Solution: Handle a NULL list like an empty list. (issue #8260)
+Files: src/globals.h, src/testdir/test_signs.vim
+
+Patch 8.2.3382
+Problem: Crash when getting the type of a NULL partial.
+Solution: Check for NULL. (closes #8260)
+Files: src/vim9type.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3383
+Problem: Vim9: completion for :disassemble adds parenthesis.
+Solution: Don't add parenthesis. (Naohiro Ono, closes #8802)
+Files: src/userfunc.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3384
+Problem: Cannot disable modeline for an individual file.
+Solution: Recognize "nomodeline" in a modeline. (Hu Jialun, closes #8798)
+Files: runtime/doc/options.txt, src/buffer.c,
+ src/testdir/test_modeline.vim
+
+Patch 8.2.3385
+Problem: Escaping for fish shell does not work properly.
+Solution: Insert a backslash before a backslash. (Jason Cox, closes #8810)
+Files: runtime/doc/eval.txt, src/strings.c, src/testdir/test_shell.vim
+
+Patch 8.2.3386
+Problem: Using uninitialized memory.
+Solution: Initialize the rm_ic field. (Dominique Pellé, closes #8800)
+Files: src/indent.c
+
+Patch 8.2.3387
+Problem: Compiler warning for non-static function.
+Solution: Make the function static. (Dominique Pellé, closes #8816)
+Files: src/strings.c
+
+Patch 8.2.3388
+Problem: fnamemodify('path/..', ':p') differs from using 'path/../'. (David
+ Briscoe)
+Solution: Include the "/.." in the directory name. (closes #8808)
+Files: src/os_unix.c, src/testdir/test_fnamemodify.vim
+
+Patch 8.2.3389
+Problem: Cannot stop insert mode completion without side effects.
+Solution: Add CTRL-X CTRL-Z. (closes #8821)
+Files: runtime/doc/index.txt, runtime/doc/insert.txt, src/insexpand.c,
+ src/testdir/test_ins_complete.vim
+
+Patch 8.2.3390
+Problem: Included xdiff code is outdated.
+Solution: Sync with xdiff in git 2.33. (Christian Brabandt, closes #8431)
+Files: src/diff.c, src/xdiff/README.txt, src/xdiff/xdiff.h,
+ src/xdiff/xdiffi.c, src/xdiff/xdiffi.h, src/xdiff/xemit.c,
+ src/xdiff/xemit.h, src/xdiff/xhistogram.c, src/xdiff/xinclude.h,
+ src/xdiff/xmacros.h, src/xdiff/xpatience.c, src/xdiff/xprepare.h,
+ src/xdiff/xtypes.h, src/xdiff/xutils.c, src/xdiff/xutils.h
+
+Patch 8.2.3391
+Problem: Crash with combination of 'linebreak' and other options.
+Solution: Avoid n_extra to become negative. (Christian Brabandt,
+ closes #8817)
+Files: src/drawline.c
+
+Patch 8.2.3392
+Problem: augroup completion escapes regexp pattern characters.
+Solution: Do not escape the augroup name. (closes #8826)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3393
+Problem: Escaping for fish shell is skipping some characters.
+Solution: Escape character after backslash if needed. (Jason Cox,
+ closes #8827)
+Files: src/strings.c, src/testdir/test_shell.vim
+
+Patch 8.2.3394
+Problem: Filler lines are wrong when changing text in diff mode.
+Solution: Don't change the filler lines on every change. Check
+ scrollbinding when updating the filler lines. (closes #8809)
+Files: src/move.c, src/diff.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_scroll_change_01.dump,
+ src/testdir/dumps/Test_diff_scroll_change_02.dump
+
+Patch 8.2.3395
+Problem: Vim9: expression breakpoint not checked in :def function.
+Solution: Always compile a function for debugging if there is an expression
+ breakpoint. (closes #8803)
+Files: src/vim9execute.c, src/proto/vim9execute.pro, src/debugger.c,
+ src/proto/debugger.pro, src/vim.h, src/vim9.h,
+ src/testdir/test_debugger.vim
+
+Patch 8.2.3396
+Problem: When libcall() fails invalid pointer may be used.
+Solution: Initialize the string to NULL. (Yasuhiro Matsumoto, closes #8829)
+Files: src/evalfunc.c
+
+Patch 8.2.3397
+Problem: No test for what 8.2.3391 fixes.
+Solution: Add a test. (Yegappan Lakshmanan, closes #8828)
+Files: src/testdir/test_breakindent.vim
+
+Patch 8.2.3398
+Problem: Html text objects are not fully tested.
+Solution: Add tests for dbcs encoding and different number of backslashes.
+ (Dominique Pellé, closes #8831)
+Files: src/testdir/test_textobjects.vim
+
+Patch 8.2.3399
+Problem: Octave files are not recognized.
+Solution: Detect Octave files. (Doug Kearns)
+Files: runtime/autoload/dist/ft.vim, runtime/doc/filetype.txt,
+ runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3400
+Problem: ":z!" is not supported.
+Solution: Make ":z!" work and add tests. (Dominique Pellé, closes #8836)
+ Use display height instead of current window height.
+Files: runtime/doc/various.txt, src/ex_cmds.h, src/ex_cmds.c,
+ src/testdir/test_ex_z.vim
+
+Patch 8.2.3401
+Problem: Vim9: cannot use a negative count with finddir() and findfile().
+Solution: Adjust the return type. (closes #8776)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3402
+Problem: Invalid memory access when using :retab with large value.
+Solution: Check the number is positive.
+Files: src/indent.c, src/option.c, src/optionstr.c,
+ src/testdir/test_retab.vim
+
+Patch 8.2.3403 (after 8.2.3402)
+Problem: Memory leak for :retab with invalid argument.
+Solution: Free the memory. Make error messages consistent.
+Files: src/indent.c
+
+Patch 8.2.3404
+Problem: Vim9: no error for white space before "(".
+Solution: Give an error, like in a compiled function.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3405
+Problem: Cannot have a comment line in a {} block of a user command.
+Solution: Continue after the line break. (closes #8837)
+Files: src/ex_docmd.c, src/testdir/test_usercommands.vim
+
+Patch 8.2.3406
+Problem: On some systems tests fail without _REENTRANT. (Elimar
+ Riesebieter)
+Solution: Add -D_REENTRANT in configure. (closes #7402)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.3407
+Problem: Using uninitialized memory with "let g:['bar'] = 2".
+Solution: Initialize v_type of a new dict item.
+Files: src/dict.c
+
+Patch 8.2.3408
+Problem: Can delete a numbered function. (Naohiro Ono)
+Solution: Disallow deleting a numbered function. (closes #8760)
+Files: src/userfunc.c, src/testdir/test_user_func.vim
+
+Patch 8.2.3409
+Problem: Reading beyond end of line with invalid utf-8 character.
+Solution: Check for NUL when advancing.
+Files: src/regexp_nfa.c, src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.3410
+Problem: Crash with linebreak, listchars and large tabstop.
+Solution: Account for different size listchars for a tab. (closes #8841)
+Files: src/drawline.c, src/testdir/test_listlbr_utf8.vim
+
+Patch 8.2.3411
+Problem: Vim9: crash when using base name of import. (Naohiro Ono)
+Solution: Check the import flags. (closes #8843)
+Files: src/evalvars.c, src/errors.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3412 (after 8.2.3411)
+Problem: Vim9: importing the wrong file.
+Solution: Correct the file name. Delete the file afterwards.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.3413
+Problem: Vim9: too many characters are allowed in import name.
+Solution: Disallow ':' and '#', check for white space. (closes #8845)
+Files: src/vim9script.c, src/errors.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3414
+Problem: fullcommand() gives the wrong name if there is a buffer-local user
+ command. (Naohiro Ono)
+Solution: Use a separate function to get the user command name.
+ (closes #8840)
+Files: src/usercmd.c, src/proto/usercmd.pro, src/ex_docmd.c,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.3415
+Problem: Vim9: Not all function argument types are properly checked.
+Solution: Add and improve argument type checks. (Yegappan Lakshmanan,
+ closes #8839)
+Files: src/channel.c, src/digraph.c, src/evalfunc.c, src/terminal.c,
+ src/testdir/test_digraph.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3416
+Problem: Second error is reported while exception is being thrown.
+Solution: Do not check for trailing characters when already aborting.
+ (closes #8842)
+Files: src/userfunc.c, src/testdir/test_trycatch.vim
+
+Patch 8.2.3417
+Problem: Vim9: a failing debug expression aborts script sourcing.
+Solution: Do not let expression failure abort script sourcing. (closes #8848)
+Files: src/debugger.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3418
+Problem: Garbage collection while evaluating may cause trouble.
+Solution: Disable garbage collection while evaluating an expression.
+ (Christian Brabandt, issue #8848)
+Files: src/eval.c
+
+Patch 8.2.3419
+Problem: A failing debug expression may make Vim unusable.
+Solution: Suppress error messages. (closes #8848)
+Files: src/debugger.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3420
+Problem: _REENTRANT defined more than once.
+Solution: Fix configure script. (Christian Brabandt, closes #8852)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.3421
+Problem: A bit of code is not covered by tests.
+Solution: Add a few more test cases. (Dominique Pellé, closes #8857)
+Files: src/testdir/test_functions.vim, src/testdir/test_history.vim,
+ src/testdir/test_startup.vim
+
+Patch 8.2.3422
+Problem: Vim9: no failure if return type differs from returned variable.
+Solution: Copy type when copying a list. (closes #8847)
+Files: src/list.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3423
+Problem: Vim9: list += list creates a new list in :def function.
+Solution: Append to the existing list.
+Files: src/structs.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3424
+Problem: A sequence of spaces is hard to see in list mode.
+Solution: Add the "multispace" option to 'listchars'. (closes #8834)
+Files: runtime/doc/options.txt, src/drawline.c, src/message.c,
+ src/screen.c, src/structs.h, src/testdir/test_listchars.vim
+
+Patch 8.2.3425
+Problem: Warning for using uninitialized variable.
+Solution: Initialize it. (John Marriott)
+Files: src/screen.c
+
+Patch 8.2.3426
+Problem: Crash when deleting a listener in a listener callback. (Naohiro
+ Ono)
+Solution: Mark the listener and delete it later. (closes #8863)
+Files: src/change.c, src/testdir/test_listener.vim
+
+Patch 8.2.3427
+Problem: Double free when list is copied.
+Solution: Allocate the type when making a copy. (closes #8862)
+ Clear the type for flattennew(). Avoid a memory leak when
+ flattennew() fails.
+Files: src/list.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3428
+Problem: Using freed memory when replacing. (Dhiraj Mishra)
+Solution: Get the line pointer after calling ins_copychar().
+Files: src/normal.c, src/testdir/test_edit.vim
+
+Patch 8.2.3429
+Problem: Leaking memory when assigning to list or dict.
+Solution: Free the list or dict type before overwriting it.
+Files: src/vim9type.c, src/evalvars.c
+
+Patch 8.2.3430
+Problem: No generic way to trigger an autocommand on mode change.
+Solution: Add the ModeChanged autocommand event. (Magnus Gross, closes #8856)
+Files: runtime/doc/autocmd.txt, src/autocmd.c, src/edit.c,
+ src/ex_docmd.c, src/ex_getln.c, src/globals.h, src/misc1.c,
+ src/normal.c, src/proto/autocmd.pro, src/proto/misc1.pro,
+ src/testdir/test_edit.vim, src/vim.h
+
+Patch 8.2.3431
+Problem: Completion for :disas sorts local functions first.
+Solution: Sort local functions last, like with :delfunc. (Naohiro Ono,
+ closes #8860)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3432
+Problem: Octave/Matlab filetype detection does not work properly.
+Solution: Update the patterns used for matching. (Doug Kearns)
+Files: runtime/autoload/dist/ft.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3433
+Problem: :delcommand does not take a -buffer option.
+Solution: Add the -buffer option.
+Files: runtime/doc/map.txt, src/usercmd.c, src/errors.h,
+ src/testdir/test_usercommands.vim
+
+Patch 8.2.3434 (after 8.2.3430)
+Problem: Function prototype for trigger_modechanged() is incomplete.
+Solution: Add "void".
+Files: src/proto/misc1.pro
+
+Patch 8.2.3435
+Problem: Vim9: dict is not passed to dict function.
+Solution: Keep the dict used until a function call.
+Files: src/vim9compile.c, src/vim9execute.c, src/vim9.h,
+ src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3436
+Problem: Check for optional bool type has confusing return type.
+Solution: Explicitly return OK.
+Files: src/typval.c
+
+Patch 8.2.3437
+Problem: Compiler warnings for 32/64 bit usage.
+Solution: Add type casts. (Mike Williams, closes #8870)
+Files: src/screen.c, src/xdiff/xemit.c, src/xdiff/xutils.c
+
+Patch 8.2.3438
+Problem: Cannot manipulate blobs.
+Solution: Add blob2list() and list2blob(). (Yegappan Lakshmanan,
+ closes #8868)
+Files: runtime/doc/eval.txt, runtime/doc/usr_41.txt, src/blob.c,
+ src/errors.h, src/evalfunc.c, src/proto/blob.pro,
+ src/proto/typval.pro, src/testdir/test_blob.vim,
+ src/testdir/test_vim9_builtin.vim, src/typval.c
+
+Patch 8.2.3439
+Problem: Deleted lines go to wrong yank register.
+Solution: Reset y_append when not calling get_yank_register(). (Christian
+ Brabandt, closes #8872)
+Files: src/ops.c, src/proto/register.pro, src/register.c,
+ src/testdir/test_registers.vim
+
+Patch 8.2.3440
+Problem: Recover test fails if there is an old swap file.
+Solution: Delete old swap files.
+Files: src/testdir/test_recover.vim
+
+Patch 8.2.3441
+Problem: MS-Windows: vimtutor can't handle path with spaces.
+Solution: Add double quotes. (Christian Brabandt, closes #8871)
+Files: vimtutor.bat
+
+Patch 8.2.3442
+Problem: Vim9: || and && are not handled at compile time when possible.
+Solution: When using constants generate fewer instructions.
+Files: src/vim9.h, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3443
+Problem: Vim9: memory leak when and/or fails.
+Solution: Also clear the growarray when the length is zero.
+Files: src/vim9compile.c
+
+Patch 8.2.3444
+Problem: concealed text not revealed when leaving insert mode. (Michael
+ Soyka)
+Solution: Check if concealing changed when leaving insert mode.
+ (closes #8880)
+Files: src/edit.c, src/testdir/test_conceal.vim,
+ src/testdir/dumps/Test_conceal_two_windows_07in.dump
+
+Patch 8.2.3445
+Problem: On Solaris longVersion may be declared twice. (Vladimir Marek)
+Solution: Always declare longVersion in version.c
+Files: src/globals.h, src/version.c
+
+Patch 8.2.3446
+Problem: Not enough tests for empty string arguments.
+Solution: Add tests, fix type check. (Yegappan Lakshmanan, closes #8881)
+Files: runtime/doc/sign.txt, runtime/doc/textprop.txt, src/sign.c,
+ src/testdir/test_blob.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3447
+Problem: A couple of declarations are not ANSI C.
+Solution: Put argument type inside (). (Yegappan Lakshmanan, closes #8890)
+Files: src/os_unix.h
+
+Patch 8.2.3448
+Problem: :endtry after function call that throws not found.
+Solution: Do check for following :endtry if an exception is being thrown.
+ (closes #8889)
+Files: src/userfunc.c, src/testdir/test_trycatch.vim
+
+Patch 8.2.3449
+Problem: Sort fails if the sort compare function returns 999.
+Solution: Adjust value to -1 / 0 / 1. (Yasuhiro Matsumoto, closes #8884)
+Files: src/list.c, src/testdir/test_sort.vim
+
+Patch 8.2.3450
+Problem: Coveralls action fails.
+Solution: Disable it for now.
+Files: .github/workflows/ci.yml
+
+Patch 8.2.3451
+Problem: Not all apache files are recognized.
+Solution: Adjust the filetype pattern. (Zdenek Dohnal, closes #8882)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3452
+Problem: MPD files are not recognized.
+Solution: Recognize MPD files as XML. (Steven Penny, closes #8893)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3453
+Problem: Autocmd not executed when editing a directory ending in a path
+ separator inside try block.
+Solution: Return NOTDONE instead of FAIL. (closes #8885)
+Files: src/fileio.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.3454
+Problem: Using a count with "gp" leaves cursor in wrong position. (Naohiro
+ Ono)
+Solution: Count the inserted lines. (closes #8899)
+Files: src/register.c, src/testdir/test_put.vim
+
+Patch 8.2.3455 (after 8.2.3454)
+Problem: Using a count with "gp" leaves '] in wrong position. (Naohiro Ono)
+Solution: Correct the mark position. (closes #8899)
+Files: src/register.c, src/testdir/test_put.vim
+
+Patch 8.2.3456
+Problem: Vim9: Not all functions are tested with an empty string argument.
+Solution: Add tests with empty strings. (Yegappan Lakshmanan, closes #8915)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3457
+Problem: MS-Windows Vim9: test executed and fails.
+Solution: Add extra check for not being on MS-Windows.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.3458
+Problem: Not all dictdconf files are recognized.
+Solution: Adjust the pattern. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3459
+Problem: Vim9: need more tests for empty string arguments.
+Solution: Add more tests. Also use empty argument with menu_info() to get
+ the top-level menu names. (Yegappan Lakshmanan, closes #8925)
+Files: runtime/doc/eval.txt, src/menu.c, src/testdir/test_menu.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3460
+Problem: Some type casts are not needed.
+Solution: Remove unnecessary type casts. (closes #8934)
+Files: src/autocmd.c, src/buffer.c, src/debugger.c, src/getchar.c,
+ src/hardcopy.c, src/if_cscope.c, src/move.c, src/tag.c,
+ src/version.c
+
+Patch 8.2.3461
+Problem: Cannot distinguish Normal and Terminal-Normal mode.
+Solution: Make mode() return "nt" for Terminal-Normal mode. (issue #8856)
+Files: runtime/doc/eval.txt, src/misc1.c, src/testdir/test_functions.vim
+
+Patch 8.2.3462
+Problem: The ModeChanged event only uses one character for the new_mode and
+ old_mode values.
+Solution: Pass one as first argument to mode(). (issue #8856)
+Files: src/misc1.c, src/testdir/test_edit.vim
+
+Patch 8.2.3463
+Problem: Pattern matching with ModeChanged not tested.
+Solution: Add a few more test lines. (issue #8856)
+Files: src/testdir/test_edit.vim
+
+Patch 8.2.3464
+Problem: nginx files are not recognized.
+Solution: Add several file patterns. (Chris Aumann, closes #8922)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3465
+Problem: Cannot detect insert scroll mode.
+Solution: Add "scroll" to complete_info(). (closes #8943)
+Files: runtime/doc/eval.txt, src/insexpand.c, src/testdir/test_popup.vim
+
+Patch 8.2.3466
+Problem: Completion submode not indicated for virtual replace.
+Solution: Add submode to "Rv". (closes #8945)
+Files: runtime/doc/eval.txt, src/misc1.c, src/testdir/test_functions.vim
+
+Patch 8.2.3467
+Problem: CursorHoldI event interferes with "CTRL-G U". (Naohiro Ono)
+Solution: Restore the flag for "CTRL-G U" after triggering CursorHoldI.
+ (closes #8937)
+Files: src/edit.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.3468
+Problem: Problem with :cd when editing file in non-existent directory. (Yee
+ Cheng Chin)
+Solution: Prepend the current directory to get the full path. (closes #8903)
+Files: src/os_unix.c, src/testdir/test_cd.vim
+
+Patch 8.2.3469
+Problem: Some files with json syntax are not recognized.
+Solution: Add a few file patterns. (Emiliano Ruiz Carletti, closes #8947)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3470
+Problem: Crash with error in :catch and also in :finally.
+Solution: Only discard an exception if there is one. (closes #8954)
+Files: src/ex_eval.c, src/testdir/test_trycatch.vim
+
+Patch 8.2.3471
+Problem: Crash when using CTRL-T after an empty search pattern.
+Solution: Bail out when there is no previous search pattern. (closes #8953)
+Files: src/ex_getln.c, src/testdir/test_search.vim
+
+Patch 8.2.3472
+Problem: Other crashes with empty search pattern not tested.
+Solution: Add a few more test lines. (Dominique Pellé)
+Files: src/testdir/test_search.vim
+
+Patch 8.2.3473
+Problem: Some files with tcl syntax are not recognized.
+Solution: Add a few file patterns. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3474
+Problem: Some places use "Vimscript" instead of "Vim script".
+Solution: Consistently use "Vim script". (Hirohito Higashi, closes #8910)
+Files: runtime/doc/if_lua.txt, src/getchar.c, src/if_lua.c
+
+Patch 8.2.3475
+Problem: Expression register set by not executed put command.
+Solution: Do not set the register if the command is skipped. (closes #8909)
+Files: src/ex_docmd.c, src/testdir/test_excmd.vim
+
+Patch 8.2.3476
+Problem: Renaming a buffer on startup may cause using freed memory.
+Solution: Check if the buffer is used in a window. (closes #8955)
+Files: src/buffer.c, src/testdir/test_startup.vim
+
+Patch 8.2.3477 (after 8.2.3476)
+Problem: Startup test fails on MS-Windows.
+Solution: Skip the test if not on Unix.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.3478 (after 8.2.3470)
+Problem: Still crash with error in :catch and also in :finally.
+Solution: Only call finish_exception() once. (closes #8954)
+Files: src/ex_eval.c, src/structs.h
+
+Patch 8.2.3479
+Problem: Crash when calling job_start with an invalid argument. (Virginia
+ Senioria)
+Solution: Clear the first item in argv. (closes #8957)
+Files: src/misc2.c, src/testdir/test_channel.vim
+
+Patch 8.2.3480 (after 8.2.3478)
+Problem: Test does not fail without the fix for a crash.
+Solution: Write the bad code in a file and source it. (Dominique Pellé,
+ closes #8961)
+Files: src/testdir/test_trycatch.vim
+
+Patch 8.2.3481
+Problem: Failures when char is unsigned.
+Solution: Use int8_T. Make a CI run with unsigned char. (James McCoy,
+ closes #8936)
+Files: src/structs.h, .github/workflows/ci.yml
+
+Patch 8.2.3482
+Problem: Reading beyond end of line ending in quote and backslash.
+Solution: Check for non-NUL after backslash. (closes #8964)
+Files: src/cindent.c, src/testdir/test_cindent.vim
+
+Patch 8.2.3483
+Problem: #ifdef for using sysinfo() is incomplete.
+Solution: Also check for HAVE_SYSINFO. Make autoconf check use TRY_LINK.
+ (closes #8952)
+Files: src/memline.c, src/configure.ac, src/auto/configure
+
+Patch 8.2.3484
+Problem: Crash when going through spell suggestions.
+Solution: Limit the text length for finding suggestions to the original
+ length. Do not update buffers when exiting. (closes #8965)
+Files: src/spellsuggest.c, src/clipboard.c,
+ src/testdir/test_spell_utf8.vim
+
+Patch 8.2.3485
+Problem: Python 3 test fails with Python 3.10.
+Solution: Adjust expected error message. (zdohnal Dohnal, closes #8969)
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.3486
+Problem: Illegal memory access with invalid sequence of commands.
+Solution: Do not call leave_block() when not in a try block. (closes #8966)
+ Reset did_emsg so that exception is shown as an error.
+Files: src/ex_eval.c, src/testdir/test_trycatch.vim
+
+Patch 8.2.3487
+Problem: Illegal memory access if buffer name is very long.
+Solution: Make sure not to go over the end of the buffer.
+Files: src/drawscreen.c, src/testdir/test_statusline.vim
+
+Patch 8.2.3488
+Problem: Issue template is not easy to use.
+Solution: Use a yaml template. (closes #8928)
+Files: .github/ISSUE_TEMPLATE/bug_report.md,
+ .github/ISSUE_TEMPLATE/bug_report.yml
+
+Patch 8.2.3489
+Problem: ml_get error after search with range.
+Solution: Limit the line number to the buffer line count.
+Files: src/ex_docmd.c, src/testdir/test_search.vim
+
+Patch 8.2.3490
+Problem: Superfluous return statements.
+Solution: Remove superfluous return statements from void functions.
+ (closes #8977)
+Files: src/buffer.c, src/getchar.c, src/memline.c, src/move.c,
+ src/option.c
+
+Patch 8.2.3491
+Problem: xpm2 filetype detection is not so good.
+Solution: Adjust the check for xpm2. (closes #8914)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3492
+Problem: Crash when pasting too many times.
+Solution: Limit the size to what fits in an int. (closes #8962)
+Files: src/register.c, src/errors.h, src/testdir/test_put.vim
+
+Patch 8.2.3493 (after 8.2.3492)
+Problem: Large count test fails on MS-Windows.
+Solution: Skip the test on MS-Windows.
+Files: src/testdir/test_put.vim
+
+Patch 8.2.3494
+Problem: Illegal memory access in utf_head_off.
+Solution: Check cursor position when reselecting the Visual area.
+ (closes #8963)
+Files: src/normal.c, src/testdir/test_visual.vim
+
+Patch 8.2.3495
+Problem: GUI geometry startup test fails on some systems. (Drew Vogel)
+Solution: Add tolerance to the size check. (closes #8815)
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.3496
+Problem: Crypt test fails on MS-Windows if xxd was not installed yet.
+Solution: Use the just built xxd executable if it exists. (James McCoy,
+ closes #8929)
+Files: src/testdir/test_crypt.vim
+
+Patch 8.2.3497
+Problem: Put test fails when run by itself.
+Solution: Source check.vim. (Dominique Pellé, closes #8990)
+Files: src/testdir/test_put.vim
+
+Patch 8.2.3498
+Problem: Recover test may fail on some systems.
+Solution: Adjust the little endian and 64 bit detection. (James McCoy,
+ closes #8941)
+Files: src/testdir/test_recover.vim
+
+Patch 8.2.3499
+Problem: GUI geometry startup test fails.
+Solution: Check string values instead of numbers
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.3500
+Problem: Github CI fails to install clang.
+Solution: Install llvm-11 explicitly. (Christian Brabandt, closes #8993)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.3501
+Problem: tmux filetype detection is incomplete
+Solution: Also use tmux for files having text after .conf. (Eric Pruitt,
+ closes #8971)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3502 (after 8.2.2919)
+Problem: Cannot enter password in shell command.
+Solution: Revert patch 8.2.2919.
+Files: src/os_unix.c
+
+Patch 8.2.3503
+Problem: Vim9: using g:pat:cmd is confusing.
+Solution: Do not recognize g: as the :global command. Also for s:pat:repl.
+ (closes #8982)
+Files: runtime/doc/vim9.txt, src/ex_docmd.c, src/ex_cmds.c, src/errors.h,
+ src/vim9compile.c, src/proto/vim9compile.pro,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3504 (after 8.2.3503)
+Problem: Vim9: warning for signed vs unsigned.
+Solution: Add type cast.
+Files: src/vim9compile.c
+
+Patch 8.2.3505 (after 8.2.3503)
+Problem: Vim9: build failure without the +eval feature.
+Solution: Add #ifdef.
+Files: src/ex_cmds.c
+
+Patch 8.2.3506 (after 8.2.3503)
+Problem: Vim9: special cases for "g" and "s" insufficiently tested.
+Solution: Add a few more test cases.
+Files: src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3507
+Problem: Generating proto files may fail.
+Solution: Define __attribute().
+Files: src/Makefile
+
+Patch 8.2.3508 (after 8.2.3503)
+Problem: Vim9: bad separators for "g" and "s" insufficiently tested.
+Solution: Add a few more test cases.
+Files: src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3509
+Problem: Undo file is not synced. (Sami Farin)
+Solution: Sync the undo file if 'fsync' is set. (Christian Brabandt,
+ closes #8879, closes #8920)
+Files: runtime/doc/options.txt, src/undo.c
+
+Patch 8.2.3510
+Problem: Changes are only detected with one second accuracy.
+Solution: Use the nanosecond time if possible. (Leah Neukirchen,
+ closes #8873, closes #8875)
+Files: runtime/doc/eval.txt, src/auto/configure, src/bufwrite.c,
+ src/config.h.in, src/configure.ac, src/fileio.c,
+ src/proto/fileio.pro, src/memline.c, src/netbeans.c,
+ src/structs.h, src/evalfunc.c, src/testdir/test_stat.vim
+
+Patch 8.2.3511
+Problem: Vim9: entry for loop variable is created every round.
+Solution: Only create the entry once. (closes #8996)
+Files: src/evalvars.c, src/vim9script.c
+
+Patch 8.2.3512
+Problem: Timestamp test fails on some systems.
+Solution: Sleep for a short while.
+Files: src/testdir/test_stat.vim
+
+Patch 8.2.3513
+Problem: Using freed memory when using a timer and searching. (Dominique
+ Pellé)
+Solution: Allocated mr_pattern.
+Files: src/search.c
+
+Patch 8.2.3514
+Problem: Autoread test with nanosecond time sometimes fails.
+Solution: Mark the test as being flaky.
+Files: src/testdir/test_stat.vim
+
+Patch 8.2.3515
+Problem: Nano time test fails on Mac and FreeBSD.
+Solution: Also check nano time when not on Linux. (Ozaki Kiichi,
+ closes #9000)
+Files: src/fileio.c
+
+Patch 8.2.3516
+Problem: Terminal window does not have transparent background when
+ 'termguicolors' is used.
+Solution: Fix the background color. (closes #2361, closes #9002)
+Files: runtime/doc/terminal.txt, src/highlight.c, src/proto/terminal.pro,
+ src/terminal.c
+
+Patch 8.2.3517
+Problem: TextChanged does not trigger after TextChangedI.
+Solution: Store the tick separately for TextChangedI. (Christian Brabandt,
+ closes #8968, closes #8932)
+Files: src/buffer.c, src/bufwrite.c, src/edit.c, src/structs.h,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.3518
+Problem: Test_xrestore sometimes fails.
+Solution: Mark the test as flaky. Move marking test as flaky to the test
+ instead of listing them in runtest.
+Files: src/testdir/test_paste.vim, src/testdir/runtest.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_channel.vim,
+ src/testdir/test_clientserver.vim, src/testdir/test_diffmode.vim,
+ src/testdir/test_functions.vim, src/testdir/test_gui.vim,
+ src/testdir/test_mapping.vim, src/testdir/test_popup.vim,
+ src/testdir/test_quotestar.vim, src/testdir/test_reltime.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_terminal2.vim,
+ src/testdir/test_timers.vim
+
+Patch 8.2.3519
+Problem: TOML files are not recognized.
+Solution: Add filetype patterns for TOML. (Aman Verma, closes #8984)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3520
+Problem: Cannot define a function for thesaurus completion.
+Solution: Add 'thesaurusfunc'. (Yegappan Lakshmanan, closes #8987,
+ closes 8950)
+Files: runtime/doc/insert.txt, runtime/doc/options.txt,
+ runtime/doc/quickref.txt, src/buffer.c, src/insexpand.c,
+ src/option.c, src/option.h, src/optiondefs.h, src/optionstr.c,
+ src/structs.h, src/testdir/test_edit.vim
+
+Patch 8.2.3521 (after 8.2.3520)
+Problem: Options completion test fails.
+Solution: Add 'thesaurusfunc' to the results.
+Files: src/testdir/test_options.vim
+
+Patch 8.2.3522
+Problem: Cannot use \x and \u when setting 'listchars'.
+Solution: Support hex and unicode in hex form. (closes #9006)
+Files: runtime/doc/options.txt, src/screen.c, src/charset.c,
+ src/testdir/test_listchars.vim
+
+Patch 8.2.3523
+Problem: Duplicated code in xxd.
+Solution: Remove duplicated lines. (closes #8972)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3524
+Problem: GUI: ligatures are not used.
+Solution: Add the 'guiligatures' option. (Dusan Popovic, closes #8933)
+Files: runtime/doc/options.txt, src/gui.c, src/gui.h, src/gui_gtk_x11.c,
+ src/option.h, src/optiondefs.h, src/optionstr.c, src/errors.h,
+ src/proto/gui.pro, src/proto/gui_gtk_x11.pro,
+ src/testdir/test_gui.vim
+
+Patch 8.2.3525
+Problem: Option variable name does not match option name. (Christ van
+ Willegen)
+Solution: Rename the variable.
+Files: src/buffer.c, src/insexpand.c, src/option.c, src/optionstr.c,
+ src/structs.h
+
+Patch 8.2.3526
+Problem: Tests have clumsy check for X11 based GUI.
+Solution: Add CheckX11BasedGui.
+Files: src/testdir/check.vim, src/testdir/test_gui.vim,
+ src/testdir/test_gui_init.vim, src/testdir/setup_gui.vim
+
+Patch 8.2.3527
+Problem: Gcc complains about uninitialized variable. (Tony Mechelynck)
+Solution: Initialize it.
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.3528
+Problem: 'thesaurus' and 'thesaurusfunc' do not have the same scope.
+Solution: Make 'thesaurusfunc' global-local.
+Files: runtime/doc/options.txt, runtime/doc/insert.txt,
+ src/optiondefs.h, src/option.h, src/option.c, src/structs.h,
+ src/insexpand.c, src/testdir/test_edit.vim
+
+Patch 8.2.3529
+Problem: Xxd usage output is incomplete.
+Solution: Add "bytes" to "-g" flag. (Atsushi Sugawara, closes #8944)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3530
+Problem: ":buf \{a}" fails while ":edit \{a}" works.
+Solution: Unescape "\{". (closes #8917)
+Files: src/vim.h, src/cmdexpand.c, src/evalfunc.c, src/ex_getln.c,
+ src/proto/ex_getln.pro, src/normal.c, src/session.c,
+ src/terminal.c, src/vim9execute.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3531 (after 8.2.3530)
+Problem: Command line completion test fails on MS-Windows.
+Solution: Do not test with "\{" on MS-Windows.
+Files: src/testdir/test_cmdline.vim
+
+Patch 8.2.3532
+Problem: The previous '' mark is restored after moving the cursor to the
+ original jump position. (Tony Chen)
+Solution: Forget the previous position after checking. (closes #8985)
+Files: src/mark.c, src/testdir/test_marks.vim
+
+Patch 8.2.3533
+Problem: Inefficient code in xxd.
+Solution: Don't use "p" when "hextype" is non-zero. (closes #9013)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3534
+Problem: Autoread test is a bit flaky.
+Solution: Wait a brief moment before overwriting the file.
+Files: src/testdir/test_stat.vim
+
+Patch 8.2.3535
+Problem: If-else indenting is confusing.
+Solution: Add curly brackets and indent. (Dominique Pellé, closes #9010)
+Files: src/drawscreen.c
+
+Patch 8.2.3536
+Problem: The do_highlight() function is way too long.
+Solution: Split it into several functions. (Yegappan Lakshmanan,
+ closes #9011)
+Files: src/highlight.c
+
+Patch 8.2.3537
+Problem: mode() does not return the right value in 'operatorfunc'.
+Solution: Reset finish_op while calling 'operatorfunc'.
+Files: src/ops.c, src/testdir/test_functions.vim
+
+Patch 8.2.3538
+Problem: Else-if indenting is confusing.
+Solution: Add curly brackets. (Yegappan Lakshmanan, closes #9017)
+Files: src/highlight.c
+
+Patch 8.2.3539
+Problem: GTK3: with 'rightleft' set scrollbar may move unintentionally.
+Solution: Ignore events while moving the scrollbar thumb. (closes #8958)
+Files: src/gui_gtk.c
+
+Patch 8.2.3540
+Problem: The mark '] is wrong after put with a count. (Naohiro Ono)
+Solution: Use the right line number. (closes #8956)
+Files: src/register.c, src/testdir/test_put.vim
+
+Patch 8.2.3541
+Problem: Compiler warning for unused variable in tiny version.
+Solution: Add #ifdef. (John Marriott)
+Files: src/highlight.c
+
+Patch 8.2.3542
+Problem: Too many comments are old style.
+Solution: Change comments to // style. (closes #9021)
+Files: src/buffer.c
+
+Patch 8.2.3543
+Problem: Swapname has double slash when 'directory' ends in double slash.
+ (Shane Smith)
+Solution: Remove the superfluous slash. (closes #8876)
+Files: src/memline.c, src/testdir/test_swap.vim
+
+Patch 8.2.3544
+Problem: Unix: may leak file descriptor when using a non-existing
+ directory.
+Solution: Always close the file. (closes #9023)
+Files: src/os_unix.c
+
+Patch 8.2.3545
+Problem: setcellwidths() may make 'listchars' or 'fillchars' invalid.
+Solution: Check the value and give an error. (closes #9024)
+Files: runtime/doc/eval.txt, src/optionstr.c, src/errors.h, src/mbyte.c,
+ src/testdir/test_utf8.vim
+
+Patch 8.2.3546 (after 8.2.3545)
+Problem: Build failure without the +eval feature.
+Solution: Add #ifdef. (closes #9025)
+Files: src/errors.h
+
+Patch 8.2.3547
+Problem: Opening the quickfix window triggers BufWinEnter twice. (Yorick
+ Peterse)
+Solution: Only trigger BufWinEnter with "quickfix". (closes #9022)
+Files: src/ex_cmds.c, src/vim.h, src/quickfix.c, src/buffer.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.3548
+Problem: GTK GUI crashes when reading from stdin.
+Solution: Do not overwrite the NUL after the string. (closes #9028)
+Files: src/gui_gtk_x11.c, src/testdir/test_gui.vim
+
+Patch 8.2.3549
+Problem: Mistakes in test comments.
+Solution: Fix the comments. (closes #9029)
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.3550
+Problem: completion() does not work properly.
+Solution: Set xp_line and add WILD_HOME_REPLACE. (Shougo Matsushita,
+ closes #9016)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3551
+Problem: Checking first character of url twice.
+Solution: Only check once. (closes #9026)
+Files: src/misc1.c
+
+Patch 8.2.3552
+Problem: Xxd revert does not handle end of line correctly.
+Solution: Check for newline first. (closes #9034)
+Files: src/xxd/xxd.c, src/testdir/test_xxd.vim
+
+Patch 8.2.3553 (after 8.2.3552)
+Problem: Xxd test fails on MS-Windows.
+Solution: Split shell command in two.
+Files: src/testdir/test_xxd.vim
+
+Patch 8.2.3554
+Problem: Xxd has various way to exit.
+Solution: Add function to print error and exit. (closes #9035)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3555
+Problem: ModeChanged is not triggered on every mode change.
+Solution: Also trigger on minor mode changes. (Maguns Gross, closes #8999)
+Files: runtime/doc/autocmd.txt, src/autocmd.c, src/insexpand.c,
+ src/misc1.c, src/normal.c, src/terminal.c,
+ src/testdir/test_edit.vim
+
+Patch 8.2.3556
+Problem: Filler lines are incorrect for other window in diff mode after
+ making a change.
+Solution: Copy filler lines from the current window. (closes #8809)
+Files: src/diff.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_scroll_change_03.dump
+
+Patch 8.2.3557
+Problem: Vim9: cannot call imported funcref at script level.
+Solution: Check for an imported function. (closes #9007)
+Files: src/userfunc.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3558 (after 8.2.3557)
+Problem: Vim9: asserting the wrong variable.
+Solution: Don't use Foo, use Goo.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.3559
+Problem: Loop variable recreated every time.
+Solution: Keep the loop variable when looping.
+Files: src/ex_eval.c
+
+Patch 8.2.3560
+Problem: Using freed memory with lambda.
+Solution: Do not free lines early, keep them until the expression is
+ finished. (closes #9020)
+Files: src/eval.c, src/proto/eval.pro, src/userfunc.c, src/vim9compile.c,
+ src/structs.h, src/globals.h, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3561
+Problem: Cscope has a complicated way of giving an error message.
+Solution: Use semsg(). (James McCoy, closes #9038)
+Files: src/if_cscope.c
+
+Patch 8.2.3562
+Problem: Cannot add color names.
+Solution: Add the v:colornames dictionary. (Drew Vogel, closes #8761)
+Files: Filelist, READMEdir/README_extra.txt, nsis/gvim.nsi,
+ runtime/colors/README.txt, runtime/colors/lists/csscolors.vim,
+ runtime/colors/lists/default.vim, runtime/doc/eval.txt,
+ runtime/doc/gui_w32.txt, runtime/doc/message.txt,
+ runtime/doc/os_haiku.txt, runtime/doc/syntax.txt,
+ runtime/doc/usr_06.txt, src/Makefile, src/evalvars.c,
+ src/gui_haiku.cc, src/highlight.c, src/gui.c, src/job.c,
+ src/proto/highlight.pro, src/proto/term.pro, src/term.c,
+ src/vim.h, src/globals.h, src/errors.h,
+ src/testdir/test_highlight.vim
+
+Patch 8.2.3563 (after 8.2.3562)
+Problem: Build failure with +eval but without GUI or +termguicolors
+Solution: Adjust #ifdef. (John Marriott)
+Files: src/highlight.c
+
+Patch 8.2.3564
+Problem: Invalid memory access when scrolling without a valid screen.
+Solution: Do not set VALID_BOTLINE in w_valid.
+Files: src/move.c, src/testdir/test_normal.vim
+
+Patch 8.2.3565
+Problem: Makefile dependencies are outdated. (Gary Johnson)
+Solution: Run "make depend" and add missing dependencies.
+Files: src/Makefile
+
+Patch 8.2.3566
+Problem: Build failure on old systems when using nano timestamp.
+Solution: Define _BSD_SOURCE, _SVID_SOURCE and _DEFAULT_SOURCE. (Gary
+ Johnson, closes #9054)
+Files: src/vim.h
+
+Patch 8.2.3567
+Problem: CTRL-I in Insert mode is not tested
+Solution: Add a test case. (Dominique Pellé, closes #8866)
+Files: src/testdir/test_edit.vim
+
+Patch 8.2.3568
+Problem: Ctrl-hat test fails with Athena and Motif. (Elimar Riesebieter)
+Solution: Run the test only with GTK. (Dominique Pellé, closes #9069)
+Files: src/testdir/test_edit.vim
+
+Patch 8.2.3569
+Problem: Error for :let when vimrc is Vim 9 script.
+Solution: Prepend :legacy in the code for converting arguments. (Christian
+ Brabandt, closes #9068, closes #9077)
+Files: src/os_win32.c
+
+Patch 8.2.3570
+Problem: Test_very_large_count fails on 32bit systems.
+Solution: Bail out when using 32 bit numbers. (closes #9072)
+Files: src/testdir/test_put.vim
+
+Patch 8.2.3571
+Problem: Some unicode control characters are considered printable.
+Solution: Make 0x2060 - 0x2069 not printable.
+Files: src/mbyte.c
+
+Patch 8.2.3572
+Problem: Memory leak when closing window and using "multispace" in
+ 'listchars'.
+Solution: Free the memory. (closes #9071)
+Files: src/window.c, src/testdir/test_listchars.vim
+
+Patch 8.2.3573
+Problem: Cannot decide whether to skip test that fails with 64 bit ints.
+ (closes #9072)
+Solution: Add v:sizeofint, v:sizeoflong and v:sizeofpointer. Improve the
+ check for multiply overflow.
+Files: runtime/doc/eval.txt, src/vim.h, src/evalvars.c, src/register.c,
+ src/testdir/test_put.vim
+
+Patch 8.2.3574 (after 8.2.3573)
+Problem: Divide by zero.
+Solution: Don't check for overflow if multiplicand is zero.
+Files: src/register.c
+
+Patch 8.2.3575 (after 8.2.3574)
+Problem: Overflow check still fails when sizeof(int) == sizeof(long).
+Solution: Use a float to check the result.
+Files: src/register.c
+
+Patch 8.2.3576
+Problem: Some functions are not documented for use with a method.
+Solution: Add examples. Fix that sign_unplacelist() only takes one
+ argument. (Sean Dewar, closes #9081)
+Files: src/evalfunc.c, runtime/doc/eval.txt
+
+Patch 8.2.3577 (after 8.2.3574)
+Problem: Overflow check fails with 32 bit ints.
+Solution: Only test with 64 bit ints.
+Files: src/testdir/test_put.vim
+
+Patch 8.2.3578
+Problem: Manipulating highlighting is complicated.
+Solution: Add the hlget() and hlset() functions. (Yegappan Lakshmanan,
+ closes #9039)
+Files: runtime/doc/eval.txt, runtime/doc/syntax.txt,
+ runtime/doc/usr_41.txt, runtime/doc/windows.txt, src/evalfunc.c,
+ src/highlight.c, src/proto/highlight.pro,
+ src/testdir/test_highlight.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3579
+Problem: CI sometimes fails for MinGW.
+Solution: Use backslashes in HandleSwapExists(). (Christian Brabandt,
+ closes #9078)
+Files: src/testdir/runtest.vim
+
+Patch 8.2.3580
+Problem: gj does not move properly with a wide character.
+Solution: Move one to the right. (Christian Brabandt, closes #8702)
+Files: src/normal.c, src/testdir/test_normal.vim
+
+Patch 8.2.3581
+Problem: Reading character past end of line.
+Solution: Correct the cursor column.
+Files: src/ex_docmd.c, src/testdir/test_put.vim
+
+Patch 8.2.3582
+Problem: Reading uninitialized memory when giving spell suggestions.
+Solution: Check that preword is not empty.
+Files: src/spellsuggest.c, src/testdir/test_spell.vim
+
+Patch 8.2.3583
+Problem: The "gd" and "gD" commands do not update search stats. (Gary
+ Johnson)
+Solution: Clear search stats.
+Files: src/normal.c, src/testdir/test_search_stat.vim,
+ src/testdir/dumps/Test_searchstatgd_1.dump,
+ src/testdir/dumps/Test_searchstatgd_2.dump
+
+Patch 8.2.3584
+Problem: "verbose set efm" reports the location of the :compiler command.
+ (Gary Johnson)
+Solution: Add the "-keepscript" argument to :command and use it when
+ defining CompilerSet.
+Files: runtime/doc/map.txt, src/ex_cmds2.c, src/usercmd.c, src/ex_cmds.h,
+ src/testdir/test_compiler.vim
+
+Patch 8.2.3585
+Problem: Crash when passing float to "term_rows" in the options argument of
+ term_start(). (Virginia Senioria)
+Solution: Bail out if the argument is not a number. (closes #9116)
+Files: src/job.c, src/terminal.c, src/testdir/test_terminal.vim
+
+Patch 8.2.3586 (after 8.2.3584)
+Problem: Command completion test fails.
+Solution: Add new argument to expected output
+Files: src/testdir/test_usercommands.vim
+
+Patch 8.2.3587 (after 8.2.3584)
+Problem: Compiler test fails with backslash file separator.
+Solution: Accept slash and backslash.
+Files: src/testdir/test_compiler.vim
+
+Patch 8.2.3588
+Problem: Break statement is never reached.
+Solution: Rely on return value of set_chars_option() not changing.
+ (closes #9103)
+Files: src/optionstr.c
+
+Patch 8.2.3589
+Problem: Failure when the "term_rows" argument of term_start() is an
+ unusual value.
+Solution: Limit to range of zero to 1000. (closes #9116)
+Files: runtime/doc/terminal.txt, src/job.c, src/testdir/test_terminal.vim
+
+Patch 8.2.3590
+Problem: Test for v:colornames sometimes fails. (Dominique Pellé)
+Solution: Check features. Clear v:colornames between tests. (Drew Vogel,
+ closes #9105, closes #9073)
+Files: runtime/doc/eval.txt, src/highlight.c, src/proto/highlight.pro,
+ src/testdir/test_highlight.vim
+
+Patch 8.2.3591
+Problem: No event is triggered when closing a window.
+Solution: Add the WinClosed event. (Naohiro Ono, closes #9110)
+Files: runtime/doc/autocmd.txt, src/autocmd.c,
+ src/testdir/test_autocmd.vim, src/vim.h, src/window.c
+
+Patch 8.2.3592
+Problem: Test_hlset fails when terminal has many columns.
+Solution: Set the number of columns to 80. (Dominique Pellé, closes #9101,
+ closes #9100)
+Files: src/testdir/test_highlight.vim
+
+Patch 8.2.3593
+Problem: Directory is wrong after executing "lcd" with win_execute().
+Solution: Correct the directory when going back to the original window.
+ (closes #9132)
+Files: src/evalwindow.c, src/window.c, src/proto/window.pro,
+ src/testdir/test_execute_func.vim
+
+Patch 8.2.3594
+Problem: Xxd code is a bit difficult to understand.
+Solution: Move some lines to a separate function. (closes #9037)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3595
+Problem: Check for signed overflow might not work everywhere.
+Solution: Limit to 32 bit int. (closes #9043, closes #9067)
+Files: src/getchar.c
+
+Patch 8.2.3596
+Problem: Crash when using :pedit in Vim9 script.
+Solution: Move check for arguments to after checking there are arguments.
+ (Yegappan Lakshmanan, closes #9134, closes #9135)
+Files: src/popupwin.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3597
+Problem: Vim seems to hang when writing a very long text to a terminal
+ window.
+Solution: Limit the amount of text based on 'termwinscroll'. (issue #9080)
+Files: runtime/doc/options.txt, src/terminal.c
+
+Patch 8.2.3598
+Problem: RouterOS filetype is not recognized.
+Solution: Add file and script patterns. (closes #9097)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3599
+Problem: Not all gdbinit files are recognized.
+Solution: Add "gdbinit". (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3600 (after 8.2.3598)
+Problem: Filetype test fails.
+Solution: Add missing change.
+Files: runtime/scripts.vim
+
+Patch 8.2.3601
+Problem: Check for overflow in put count does not work well.
+Solution: Improve the overflow check. (Ozaki Kiichi, closes #9102)
+Files: src/register.c, src/testdir/test_put.vim
+
+Patch 8.2.3602
+Problem: Python3 test fails with Python 3.10 on MS-Windows.
+Solution: Adjust the expected error. (Ken Takata, closes #9118)
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.3603
+Problem: Fish filetype not recognized.
+Solution: Add a file pattern and match script line. (Doug Kearns)
+Files: runtime/filetype.vim, runtime/scripts.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.3604
+Problem: Not all sudoers files are recognized.
+Solution: Add a file pattern. (Doug Kearns, closes #1192)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3605
+Problem: Cannot clear and unlink a highlight group with hlset() in a
+ single call.
+Solution: Add the "force" option. (Yegappan Lakshmanan, closes #9117)
+Files: runtime/doc/eval.txt, src/highlight.c,
+ src/testdir/test_highlight.vim, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3606
+Problem: File missing from list of distributed files.
+Solution: Add the file.
+Files: Filelist
+
+Patch 8.2.3607
+Problem: GTK3 screen updating is slow.
+Solution: Remove some of the GTK3-specific code. (closes #9052)
+Files: src/gui.h, src/gui_gtk_x11.c
+
+Patch 8.2.3608
+Problem: Users who type "q:" instead of ":q" are confused.
+Solution: Add an autocmd to give a message that explains this is the
+ command-line window. (Egor Zvorykin, closes #9146)
+Files: runtime/defaults.vim, src/testdir/test_autocmd.vim,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.3609
+Problem: Internal error when ModeChanged is triggered when v:event is
+ already in use.
+Solution: Save and restore v:event if needed.
+Files: src/misc1.c, src/proto/misc1.pro, src/testdir/test_edit.vim,
+ src/insexpand.c, src/structs.h, src/register.c
+
+Patch 8.2.3610
+Problem: Crash when ModeChanged triggered too early.
+Solution: Trigger ModeChanged after setting VIsual.
+Files: src/normal.c, src/testdir/test_edit.vim
+
+Patch 8.2.3611
+Problem: Crash when using CTRL-W f without finding a file name.
+Solution: Bail out when the file name length is zero.
+Files: src/findfile.c, src/normal.c, src/testdir/test_visual.vim
+
+Patch 8.2.3612
+Problem: Using freed memory with regexp using a mark.
+Solution: Get the line again after getting the mark position.
+Files: src/regexp.c, src/regexp_nfa.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.2.3613
+Problem: :find test fails.
+Solution: Put length check inside if block.
+Files: src/findfile.c
+
+Patch 8.2.3614
+Problem: zindex of popup windows not used when redrawing popup menu.
+Solution: Check the zindex when redrawing the popup menu. (closes #9129,
+ closes #9089)
+Files: src/popupmenu.c, src/popupwin.c, src/proto/popupmenu.pro,
+ src/screen.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_popupmenu_masking_1.dump,
+ src/testdir/dumps/Test_popupwin_popupmenu_masking_2.dump
+
+Patch 8.2.3615
+Problem: When re-formatting with an indent expression the first line of a
+ paragraph may get the wrong indent. (Martin F. Krafft)
+Solution: Apply the correct indenting function for the first line.
+ (Christian Brabandt, closes #9150, closes #9056)
+Files: src/textformat.c, src/testdir/test_indent.vim
+
+Patch 8.2.3616
+Problem: Arglist test does not clear the argument list consistently.
+Solution: Call Reset_arglist(). (Shougo Matsushita, closes #9154)
+Files: src/testdir/test_arglist.vim
+
+Patch 8.2.3617
+Problem: ":verbose pwd" does not mention 'autochdir' was applied.
+Solution: Remember the last chdir was done by 'autochdir'. (issue #9142)
+Files: src/globals.h, src/buffer.c, src/ex_docmd.c, src/window.c,
+ src/main.c, src/netbeans.c, src/os_win32.c,
+ src/testdir/test_autochdir.vim
+
+Patch 8.2.3618
+Problem: getcwd() is unclear about how 'autochdir' is used.
+Solution: Update the help for getcwd(). Without any arguments always return
+ the actual current directory. (closes #9142)
+Files: runtime/doc/eval.txt, src/filepath.c, src/testdir/test_cd.vim
+
+Patch 8.2.3619
+Problem: Cannot use a lambda for 'operatorfunc'.
+Solution: Support using a lambda or partial. (Yegappan Lakshmanan,
+ closes #8775)
+Files: runtime/doc/map.txt, runtime/doc/options.txt, src/ops.c,
+ src/option.c, src/optionstr.c, src/proto/ops.pro,
+ src/proto/option.pro, src/quickfix.c, src/testdir/test_normal.vim
+
+Patch 8.2.3620
+Problem: Memory leak reported in libtlib.
+Solution: Call del_curterm() when cleaning up memory. Rename term.h to
+ termdefs.h to avoid a name clash.
+Files: src/term.c, src/proto/term.pro, src/alloc.c, src/configure.ac,
+ src/auto/configure, src/config.h.in, src/Makefile,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Make_vms.mms,
+ src/term.h, src/termdefs.h
+
+Patch 8.2.3621 (after 8.2.3620)
+Problem: Build failure.
+Solution: Add missing change.
+Files: src/vim.h
+
+Patch 8.2.3622
+Problem: "verbose pwd" shows confusing info when :lcd does not change
+ directory.
+Solution: Clear last_chdir_reason also when the directory does not change.
+ (closes #9160)
+Files: src/ex_docmd.c, src/testdir/test_autochdir.vim
+
+Patch 8.2.3623
+Problem: "$*" is expanded to "nonomatch".
+Solution: Only add "set nonomatch" when using a csh-like shell. (Christian
+ Brabandt, closes #9159, closes #9153)
+Files: src/os_unix.c, src/testdir/test_expand.vim
+
+Patch 8.2.3624
+Problem: When renaming a terminal buffer the status text is not updated.
+Solution: Clear the cached status text when renaming a terminal buffer.
+ (closes #9162)
+Files: src/buffer.c, src/terminal.c, src/proto/terminal.pro,
+ src/testdir/test_terminal.vim
+
+Patch 8.2.3625
+Problem: Illegal memory access when C-indenting.
+Solution: Also set the cursor column.
+Files: src/cindent.c, src/testdir/test_cindent.vim
+
+Patch 8.2.3626
+Problem: "au!" and "au! event" cannot be followed by another command as
+ documented.
+Solution: When a bar is found set nextcmd.
+Files: src/autocmd.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.3627
+Problem: difficult to know where the text starts in a window. (Sergey
+ Vlasov)
+Solution: Add the "textoff" entry in the result of getwininfo().
+ (closes #9163)
+Files: runtime/doc/eval.txt, src/evalwindow.c,
+ src/testdir/test_bufwintabinfo.vim
+
+Patch 8.2.3628
+Problem: Looking up terminal colors is a bit slow.
+Solution: Cache the terminal colors. (closes #9130, closes #9058)
+Files: src/highlight.c, src/libvterm/include/vterm.h, src/option.c,
+ src/optionstr.c, src/popupwin.c, src/proto/terminal.pro,
+ src/structs.h, src/terminal.c, src/window.c,
+ src/testdir/test_terminal3.vim,
+ src/testdir/dumps/Test_terminal_color_MyTermCol.dump,
+ src/testdir/dumps/Test_terminal_color_MyTermCol_over_Terminal.dump,
+ src/testdir/dumps/Test_terminal_color_MyWinCol.dump,
+ src/testdir/dumps/Test_terminal_color_MyWinCol_over_group.dump,
+ src/testdir/dumps/Test_terminal_color_Terminal.dump,
+ src/testdir/dumps/Test_terminal_color_gui_MyTermCol.dump,
+ src/testdir/dumps/Test_terminal_color_gui_MyWinCol.dump,
+ src/testdir/dumps/Test_terminal_color_gui_Terminal.dump,
+ src/testdir/dumps/Test_terminal_color_gui_transp_MyTermCol.dump,
+ src/testdir/dumps/Test_terminal_color_gui_transp_MyWinCol.dump,
+ src/testdir/dumps/Test_terminal_color_gui_transp_Terminal.dump,
+ src/testdir/dumps/Test_terminal_color_transp_MyTermCol.dump,
+ src/testdir/dumps/Test_terminal_color_transp_MyWinCol.dump,
+ src/testdir/dumps/Test_terminal_color_transp_Terminal.dump,
+ src/testdir/dumps/Test_terminal_popup_MyPopupHlCol.dump,
+ src/testdir/dumps/Test_terminal_popup_MyTermCol_over_Terminal.dump,
+ src/testdir/dumps/Test_terminal_popup_MyWinCol.dump,
+ src/testdir/dumps/Test_terminal_popup_MyWinCol_over_group.dump,
+ src/testdir/dumps/Test_terminal_popup_gui_MyPopupHlCol.dump,
+ src/testdir/dumps/Test_terminal_popup_gui_MyTermCol.dump,
+ src/testdir/dumps/Test_terminal_popup_gui_MyWinCol.dump,
+ src/testdir/dumps/Test_terminal_popup_gui_Terminal.dump,
+ src/testdir/dumps/Test_terminal_popup_gui_transp_MyPopupHlCol.dump,
+ src/testdir/dumps/Test_terminal_popup_gui_transp_MyTermCol.dump,
+ src/testdir/dumps/Test_terminal_popup_gui_transp_MyWinCol.dump,
+ src/testdir/dumps/Test_terminal_popup_gui_transp_Terminal.dump,
+ src/testdir/dumps/Test_terminal_popup_transp_MyPopupHlCol.dump,
+ src/testdir/dumps/Test_terminal_popup_transp_MyTermCol.dump,
+ src/testdir/dumps/Test_terminal_popup_transp_MyWinCol.dump,
+ src/testdir/dumps/Test_terminal_popup_transp_Terminal.dump,
+ src/testdir/dumps/Test_terminal_wincolor_split_MyWinCol.dump,
+ src/testdir/dumps/Test_terminal_wincolor_split_MyWinCol2.dump
+
+Patch 8.2.3629
+Problem: Command completion in cmdline window uses global user commands,
+ not local commands for the window where it was opened from.
+Solution: Use local commands. (closes #9168)
+Files: src/ex_getln.c, src/proto/ex_getln.pro, src/evalvars.c,
+ src/usercmd.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.3630
+Problem: Printf() with %S does not handle multi-byte correctly.
+Solution: Count cells instead of bytes. (closes #9169, closes #7486)
+Files: src/strings.c, src/testdir/test_expr.vim
+
+Patch 8.2.3631
+Problem: "syntax enable" does not work properly in Vim9 context.
+Solution: Also handle Vim9 context. (closes #9161)
+Files: src/syntax.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3632
+Problem: GTK3: undercurl does not get removed properly.
+Solution: Set the cairo cursor first. (closes #9170)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.3633
+Problem: Vim9: line number of lambda is off by one.
+Solution: Add one to the line number. (closes #9083)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3634
+Problem: Error for already defined function uses wrong line number.
+Solution: Set SOURCING_LNUM before giving the error message. (closes #9085)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3635
+Problem: GTK: composing underline does not show.
+Solution: Include composing character in pango call. A few more
+ optimizations for ligatures. (Dusan Popovic, closes #9171,
+ closes #9147)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.3636
+Problem: Coverity warns for unreachable code.
+Solution: Remove unreachable else block.
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.3637
+Problem: Typos in test files.
+Solution: Correct the typos. (Dominique Pellé, closes #9175)
+Files: src/testdir/runtest.vim, src/testdir/test_debugger.vim,
+ src/testdir/test_diffmode.vim, src/testdir/test_edit.vim,
+ src/testdir/test_excmd.vim, src/testdir/test_flatten.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_normal.vim,
+ src/testdir/test_options.vim, src/testdir/test_python2.vim,
+ src/testdir/test_python3.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_recover.vim, src/testdir/test_spellfile.vim,
+ src/testdir/test_syntax.vim, src/testdir/test_termcodes.vim,
+ src/testdir/test_textobjects.vim, src/testdir/test_trycatch.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_viminfo.vim
+
+Patch 8.2.3638
+Problem: getcompletion() always passes zero as position to custom
+ completion function.
+Solution: Pass the pattern length. (closes #9173)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.3639 (after 8.2.2922)
+Problem: Line commented out accidentally.
+Solution: Uncomment. (Volodymyr Kot, closes #9172)
+Files: src/main.c
+
+Patch 8.2.3640
+Problem: Freeze when calling term_wait() in a close callback.
+Solution: Set a "closing" flag to tell term_wait() to return. (closes #9152)
+Files: src/channel.c, src/terminal.c, src/proto/terminal.pro,
+ src/testdir/test_terminal.vim
+
+Patch 8.2.3641
+Problem: Xxd code has duplicate expressions.
+Solution: Refactor to avoid duplication. (closes #9185)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3642
+Problem: List of distributed files is outdated.
+Solution: Rename term.h to termdefs.h.
+Files: Filelist
+
+Patch 8.2.3643
+Problem: Header for source file is outdated.
+Solution: Make the header more accurate. (closes #9186)
+Files: src/map.c, src/getchar.c
+
+Patch 8.2.3644
+Problem: Count for 'operatorfunc' in Visual mode is not redone.
+Solution: Add the count to the redo buffer. (closes #9174)
+Files: src/normal.c, src/proto/normal.pro, src/ops.c,
+ src/testdir/test_normal.vim
+
+Patch 8.2.3645
+Problem: Vim9: The "no effect" error is not given for all registers.
+Solution: Include any character following '@'. (closes #8779)
+Files: src/ex_eval.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3646
+Problem: Using <sfile> in a function gives an unexpected result.
+Solution: Give an error in a Vim9 function. (issue #9189)
+Files: src/scriptfile.c, src/errors.h, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3647
+Problem: GTK: when using ligatures the cursor is drawn wrong.
+Solution: Clear more characters when ligatures are used. (Dusan Popovic,
+ closes #9190)
+Files: src/gui.c
+
+Patch 8.2.3648
+Problem: "verbose pwd" is incorrect after dropping files on Vim.
+Solution: Set the chdir reason to "drop".
+Files: src/gui.c
+
+Patch 8.2.3649
+Problem: Vim9: error for variable declared in while loop.
+Solution: Do not keep the first variable. (closes #9191)
+Files: src/ex_eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3650
+Problem: Vim9: for loop variable can be a list member.
+Solution: Check for valid variable name. (closes #9179)
+Files: src/vim9compile.c, src/dict.c, src/eval.c, src/evalvars.c,
+ src/proto/evalvars.pro, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3651
+Problem: Vim9: no error for :lock or :unlock with unknown variable.
+Solution: Give an error. (closes #9188)
+Files: src/evalvars.c, src/errors.h, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3652
+Problem: Can only get text properties one line at a time.
+Solution: Add options to prop_list() to use a range of lines and filter by
+ types. (Yegappan Lakshmanan, closes #9138)
+Files: runtime/doc/textprop.txt, src/textprop.c,
+ src/testdir/test_textprop.vim
+
+Patch 8.2.3653
+Problem: Terminal ANSI colors may be wrong.
+Solution: Initialize the color type. (closes #9198, closes #9197)
+Files: src/terminal.c
+
+Patch 8.2.3654
+Problem: GTK: a touch-drag does not update the selection.
+Solution: Add GDK_BUTTON1_MASK to the state. (Chris Dalton, close #9196,
+ closes #9194)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.3655
+Problem: Compiler warning for using size_t for int.
+Solution: Add a type cast. (Mike Williams, closes #9199)
+Files: src/vim9compile.c
+
+Patch 8.2.3656
+Problem: Vim9: no error for an environment variable by itself.
+Solution: Give a "without effect" error. (closes #9166)
+Files: src/ex_eval.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3657
+Problem: Vim9: debug text misses one line of return statement.
+Solution: Add a line when not at a debug instruction. (closes #9137)
+Files: src/vim9execute.c, src/testdir/test_debugger.vim
+
+Patch 8.2.3658
+Problem: Duplicate code in xxd.
+Solution: Merge duplicated code. Add more tests. (closes #9192)
+Files: src/xxd/xxd.c, src/testdir/test_xxd.vim
+
+Patch 8.2.3659
+Problem: Integer overflow with large line number.
+Solution: Check for overflow. (closes #9202)
+Files: src/errors.h, src/ex_docmd.c, src/testdir/test_excmd.vim
+ src/normal.c, src/testdir/test_normal.vim
+
+Patch 8.2.3660 (after 8.2.3659)
+Problem: Overflow check uses wrong number.
+Solution: Divide by ten.
+Files: src/normal.c
+
+Patch 8.2.3661 (after 8.2.3659)
+Problem: Test for put with large count fails.
+Solution: Adjust the counts in the test.
+Files: src/testdir/test_put.vim
+
+Patch 8.2.3662
+Problem: Illegal memory access if malloc() fails.
+Solution: Check 'foldmethod' is not empty. (closes #9207)
+Files: src/fold.c
+
+Patch 8.2.3663
+Problem: Using %S in printf() does not work correctly.
+Solution: Fix the problem and add more tests. (closes #9208)
+Files: src/strings.c, src/testdir/test_expr.vim
+
+Patch 8.2.3664
+Problem: Cannot adjust sign highlighting for 'cursorline'.
+Solution: Add CursorLineSign and CursorLineFold highlight groups.
+ (Gregory Anders, closes #9201)
+Files: runtime/doc/sign.txt, runtime/doc/syntax.txt, src/drawline.c,
+ src/highlight.c, src/optiondefs.h, src/popupwin.c,
+ src/proto/sign.pro, src/sign.c, src/structs.h, src/vim.h,
+ src/testdir/test_signs.vim
+
+Patch 8.2.3665
+Problem: Cannot use a lambda for 'tagfunc'.
+Solution: Use 'tagfunc' like 'opfunc'. (Yegappan Lakshmanan, closes #9204)
+Files: runtime/doc/options.txt, src/buffer.c, src/option.c,
+ src/optionstr.c, src/proto/tag.pro, src/structs.h, src/tag.c,
+ src/testdir/test_tagfunc.vim
+
+Patch 8.2.3666
+Problem: Libvterm is outdated.
+Solution: Include patches from revision 769 to revision 789.
+Files: Filelist, src/libvterm/Makefile, src/libvterm/doc/seqs.txt,
+ src/libvterm/include/vterm.h, src/libvterm/src/mouse.c,
+ src/libvterm/src/parser.c, src/libvterm/src/state.c,
+ src/libvterm/src/vterm.c, src/libvterm/src/vterm_internal.h,
+ src/libvterm/t/02parser.test, src/libvterm/t/17state_mouse.test,
+ src/libvterm/t/29state_fallback.test,
+ src/libvterm/t/40state_selection.test, src/libvterm/t/harness.c,
+ src/libvterm/t/run-test.pl, src/libvterm/vterm.pc.in,
+ src/terminal.c
+
+Patch 8.2.3667
+Problem: Building libvterm fails with MSVC.
+Solution: Don't use C99 construct.
+Files: src/libvterm/src/state.c
+
+Patch 8.2.3668
+Problem: Messages may be corrupted.
+Solution: Use another buffer instead of IObuff. (Yegappan Lakshmanan,
+ closes #9195)
+Files: src/highlight.c, src/testdir/test_highlight.vim
+
+Patch 8.2.3669
+Problem: Buffer overflow with long help argument.
+Solution: Use snprintf().
+Files: src/help.c, src/testdir/test_help.vim
+
+Patch 8.2.3670
+Problem: Error checks repeated several times.
+Solution: Move the checks to functions. (closes #9213)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3671
+Problem: Restarting Insert mode in prompt buffer too often when a callback
+ switches windows and comes back. (Sean Dewar)
+Solution: Do not set "restart_edit" when already in Insert mode.
+ (closes #9212)
+Files: src/window.c, src/testdir/test_prompt_buffer.vim
+
+Patch 8.2.3672 (after 8.2.3670)
+Problem: Build failure with unsigned char.
+Solution: Use int instead of char.
+Files: src/xxd/xxd.c
+
+Patch 8.2.3673
+Problem: Crash when allocating signal stack fails.
+Solution: Only using sourcing info when available. (closes #9215)
+Files: src/globals.h, src/message.c
+
+Patch 8.2.3674
+Problem: When ml_get_buf() fails it messes up IObuff.
+Solution: Return a local pointer. (closes #9214)
+Files: src/memline.c
+
+Patch 8.2.3675
+Problem: Using freed memory when vim_strsave() fails.
+Solution: Clear "last_sourcing_name". Check for msg_source() called
+ recursively. (closes #8217)
+Files: src/message.c
+
+Patch 8.2.3676
+Problem: Unused runtime file.
+Solution: Remove rgb.txt.
+Files: runtime/rgb.txt
+
+Patch 8.2.3677
+Problem: After a put the '] mark is on the last byte of a multi-byte
+ character.
+Solution: Move it to the first byte. (closes #9047)
+Files: src/register.c, src/testdir/test_put.vim
+
+Patch 8.2.3678 (after 8.2.3677)
+Problem: Illegal memory access.
+Solution: Ignore changed indent when computing byte offset.
+Files: src/register.c
+
+Patch 8.2.3679
+Problem: objc file detected as Octave. (Antony Lee)
+Solution: Detect objc by preprocessor lines. (Doug Kearns, closes #9223,
+ closes #9220)
+Files: runtime/autoload/dist/ft.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3680
+Problem: Repeated code in xxd.
+Solution: Change exit_on_ferror() to getc_or_die(). (closes #9226)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3681
+Problem: Cannot drag popup window after click on a status line. (Sergey
+ Vlasov)
+Solution: Reset on_status_line. (closes #9221)
+Files: src/mouse.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_drag_04.dump
+
+Patch 8.2.3682
+Problem: Vim9: assigning to a script variable drops the required type.
+Solution: Lookup the type of the variable and use it. (closes #9219)
+Files: src/evalvars.c, src/vim9script.c, src/proto/vim9script.pro,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3683
+Problem: Vim9: cannot use `=expr` in :...do commands.
+Solution: Add EX_EXPAND to the commands. (closes #9232)
+Files: src/ex_cmds.h, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3684
+Problem: Blockwise insert does not handle autoindent properly.
+Solution: Adjust text column for indent. (closes #9229)
+Files: src/ops.c, src/testdir/test_blockedit.vim
+
+Patch 8.2.3685
+Problem: Visual Studio project files are not recognized.
+Solution: Use the xml file type. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3686
+Problem: Filetype detection often mixes up Forth and F#.
+Solution: Add a function to inspect the file contents. (Doug Kearns)
+Files: runtime/autoload/dist/ft.vim, runtime/doc/filetype.txt,
+ runtime/doc/syntax.txt, runtime/filetype.vim, runtime/scripts.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.3687
+Problem: Blockwise insert does not handle autoindent properly when tab is
+ inserted.
+Solution: Adjust text column for indent before computing column.
+ (closes #9229)
+Files: src/ops.c, src/testdir/test_blockedit.vim
+
+Patch 8.2.3688
+Problem: The window title is not updated when dragging the scrollbar.
+Solution: Call maketitle(). (Christian Brabandt, closes #9238, closes #5383)
+Files: src/gui.c
+
+Patch 8.2.3689
+Problem: ex_let_one() is too long.
+Solution: Split into multiple functions.
+Files: src/evalvars.c
+
+Patch 8.2.3690
+Problem: Vim9: "filter #pat# cmd" does not work.
+Solution: Do not see #pat# as a comment.
+Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3691
+Problem: Build failure with small features.
+Solution: Add #ifdef. (Dominique Pellé)
+Files: src/gui.c
+
+Patch 8.2.3692
+Problem: Vim9: cannot use :func inside a :def function.
+Solution: Make it work.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c, src/errors.h,
+ src/structs.h, src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3693
+Problem: Coverity warns for possibly using a NULL pointer.
+Solution: Check for NULL and give an error.
+Files: src/vim9execute.c, src/errors.h
+
+Patch 8.2.3694
+Problem: Cannot use quotes in the count of an Ex command.
+Solution: Add getdigits_quoted(). Give an error when misplacing a quote in
+ a range. (closes #9240)
+Files: src/ex_docmd.c, src/charset.c, src/proto/charset.pro,
+ src/testdir/test_usercommands.vim
+
+Patch 8.2.3695
+Problem: Confusing error for missing key.
+Solution: Use the actual key for the error. (closes #9241)
+Files: src/eval.c, src/testdir/test_listdict.vim
+
+Patch 8.2.3696
+Problem: Vim9: error for invalid assignment when skipping.
+Solution: Do not check white space when skipping. (closes #9243)
+Files: src/evalvars.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3697
+Problem: Cannot drag a popup without a border.
+Solution: Add the "dragall" option. (closes #9218)
+Files: runtime/doc/popup.txt, src/mouse.c, src/popupwin.c, src/vim.h,
+ src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_drag_05.dump,
+ src/testdir/dumps/Test_popupwin_drag_06.dump
+
+Patch 8.2.3698
+Problem: Match highlighting continues over breakindent.
+Solution: Stop before the end column. (closes #9242)
+Files: src/match.c, src/proto/match.pro, src/drawline.c,
+ src/testdir/test_match.vim,
+ src/testdir/dumps/Test_match_linebreak.dump
+
+Patch 8.2.3699
+Problem: The +title feature adds a lot of #ifdef but little code.
+Solution: Graduate the +title feature.
+Files: src/feature.h, src/alloc.c, src/arglist.c, src/autocmd.c,
+ src/buffer.c, src/bufwrite.c, src/change.c, src/drawscreen.c,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_docmd.c, src/gui.c,
+ src/gui_gtk_x11.c, src/if_xcmdsrv.c, src/locale.c, src/main.c,
+ src/misc2.c, src/netbeans.c, src/option.c, src/optionstr.c,
+ src/os_amiga.c, src/os_mswin.c, src/os_unix.c, src/os_win32.c,
+ src/regexp.c, src/term.c, src/ui.c, src/version.c, src/window.c,
+ src/globals.h, src/option.h, src/optiondefs.h,
+ runtime/doc/options.txt, runtime/doc/various.txt
+
+Patch 8.2.3700
+Problem: Text property highlighting continues over breakindent.
+Solution: Stop before the end column. (closes #9242)
+Files: src/drawline.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_prop_linebreak.dump
+
+Patch 8.2.3701
+Problem: Vim9: invalid LHS is not possible.
+Solution: Remove unreachable error message.
+Files: src/vim9compile.c
+
+Patch 8.2.3702
+Problem: First key in dict is seen as curly expression and fails.
+Solution: Ignore failure of curly expression. (closes #9247)
+Files: src/typval.c, src/dict.c, src/testdir/test_listdict.vim
+
+Patch 8.2.3703 (after 8.2.3686)
+Problem: Most people call F# "fsharp" and not "fs".
+Solution: Rename filetype "fs" to "fsharp".
+Files: runtime/autoload/dist/ft.vim, runtime/filetype.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.3704
+Problem: Vim9: cannot use a list declaration in a :def function.
+Solution: Make it work.
+Files: runtime/doc/vim9.txt, src/vim9compile.c, src/errors.h,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3705
+Problem: Cannot pass a lambda name to function() or funcref(). (Yegappan
+ Lakshmanan)
+Solution: Handle a lambda name differently.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/evalfunc.c,
+ src/testdir/test_expr.vim
+
+Patch 8.2.3706 (after 8.2.3700)
+Problem: Text property highlighting is used on Tab.
+Solution: Only set in_linebreak when not on a Tab. (closes #9242)
+Files: src/drawline.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_prop_after_tab.dump
+
+Patch 8.2.3707
+Problem: Vim9: constant expression of elseif not recognized.
+Solution: Set instruction count before generating the expression.
+Files: src/vim9compile.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3708 (after 8.2.3707)
+Problem: Vim9: test fails with different error.
+Solution: Correct the error number.
+Files: src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3709
+Problem: Vim9: backtick expression expanded when not desired.
+Solution: Only expand a backtick expression for commands that expand their
+ argument. Remove a few outdated TODO comments.
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3710
+Problem: Vim9: backtick expression expanded for :global.
+Solution: Check the following command.
+Files: runtime/doc/vim9.txt, src/vim9compile.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3711
+Problem: Vim9: memory leak when compiling :elseif fails.
+Solution: Cleanup ppconst.
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3712
+Problem: Cannot use Vim9 lambda for 'tagfunc'.
+Solution: Make it work, add more tests. (Yegappan Lakshmanan, closes #9250)
+Files: runtime/doc/options.txt, src/insexpand.c, src/option.c,
+ src/testdir/test_tagfunc.vim
+
+Patch 8.2.3713
+Problem: MS-Windows: No error message if vimgrep pattern is not matching.
+Solution: Give an error message. (Christian Brabandt, closes #9245,
+ closes #8762)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.3714
+Problem: Some unused assignments and ugly code in xxd.
+Solution: Leave out assignments. Use marcro for fprintf(). (closes #9246)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3715
+Problem: Vim9: valgrind reports spurious problems for a test.
+Solution: Move the test to the set that is known to fail.
+Files: src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_fails.vim
+
+Patch 8.2.3716
+Problem: Vim9: range without a command is not compiled.
+Solution: Add the ISN_EXECRANGE byte code.
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/vim9compile.c,
+ src/vim9execute.c, src/vim9.h,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3717
+Problem: Vim9: error for constant list size is only given at runtime.
+Solution: Give the error at compile time if possible.
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3718
+Problem: Compiler warns for unused variable without the +textprop feature.
+ (John Marriott)
+Solution: Adjust #ifdefs.
+Files: src/drawline.c
+
+Patch 8.2.3719
+Problem: MS-Windows: test sometimes runs into existing swap file.
+Solution: Use a different file name.
+Files: src/testdir/test_buffer.vim
+
+Patch 8.2.3720
+Problem: Vim9: Internal error when invoking closure in legacy context.
+Solution: Give a more appropriate error message. (closes #9251)
+Files: src/errors.h, src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3721
+Problem: Using memory freed by losing the clipboard selection. (Dominique
+ Pellé)
+Solution: Check y_array is still valid after calling changed_lines().
+ (closes #9253)
+Files: src/errors.h, src/register.c
+
+Patch 8.2.3722
+Problem: Amiga: superfluous messages for freeing lots of yanked text.
+Solution: Assume that the machine isn't that slow these days.
+Files: src/register.c
+
+Patch 8.2.3723
+Problem: When using 'linebreak' a text property starts too early.
+Solution: Decrement "bcol" when looking for property start. (closes #9242)
+Files: src/drawline.c, src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_prop_after_linebreak.dump
+
+Patch 8.2.3724
+Problem: Build error for missing error message in small build.
+Solution: Correct #ifdef.
+Files: src/errors.h
+
+Patch 8.2.3725
+Problem: Cannot use a lambda for 'completefunc' and 'omnifunc'.
+Solution: Implement lambda support. (Yegappan Lakshmanan, closes #9257)
+Files: runtime/doc/options.txt, src/buffer.c, src/insexpand.c,
+ src/option.c, src/optionstr.c, src/proto/insexpand.pro,
+ src/proto/tag.pro, src/proto/userfunc.pro, src/structs.h,
+ src/tag.c, src/userfunc.c, src/testdir/test_ins_complete.vim,
+ src/testdir/test_tagfunc.vim
+
+Patch 8.2.3726
+Problem: README file in a config directory gets wrong filetype.
+Solution: Match README before patterns that match everything in a directory.
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3727
+Problem: In a gnome terminal keys are recognized as mouse events.
+Solution: Only recognize DEC mouse events when four numbers are following.
+ (closes #9256)
+Files: src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.3728
+Problem: Internal error when passing range() to list2blob().
+Solution: Materialize the list first. (closes #9262)
+Files: src/blob.c, src/testdir/test_blob.vim
+
+Patch 8.2.3729
+Problem: No support for squirrels.
+Solution: Recognize nuts. (closes #9259)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3730
+Problem: "/etc/Muttrc.d/README" gets filetype muttrc.
+Solution: Move the Muttrc.d pattern down, add exception for *.rc files.
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3731
+Problem: "set! termcap" shows codes in one column, but not keys.
+Solution: Also use one column for keys. (closes #9258)
+Files: src/option.c, src/term.c, src/proto/term.pro,
+ src/testdir/test_set.vim
+
+Patch 8.2.3732 (after 8.2.3731)
+Problem: "set! termcap" test fails.
+Solution: Account for keys without a t_xx entry.
+Files: src/testdir/test_set.vim
+
+Patch 8.2.3733
+Problem: Vim9: using "legacy" before range does not work.
+Solution: Skip over range before parsing command. (closes #9270)
+Files: src/vim9compile.c, src/usercmd.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3734
+Problem: Vim9: crash when no pattern match found.
+Solution: Check for error.
+Files: src/vim9execute.c
+
+Patch 8.2.3735
+Problem: Cannot use a lambda for 'imactivatefunc'.
+Solution: Add lambda support for 'imactivatefunc' and 'imstatusfunc'.
+ (Yegappan Lakshmanan, closes #9275)
+Files: runtime/doc/options.txt, src/alloc.c, src/gui_xim.c,
+ src/optionstr.c, src/proto/gui_xim.pro,
+ src/testdir/test_iminsert.vim, src/testdir/test_ins_complete.vim
+
+Patch 8.2.3736
+Problem: Test fails without the channel feature. (Dominique Pellé)
+Solution: Source the check.vim script. (closes #9277)
+Files: src/testdir/test_vim9_fails.vim
+
+Patch 8.2.3737
+Problem: Test fails without the 'autochdir' option.
+Solution: Check that the option is available. (Dominique Pellé, closes #9272)
+Files: src/testdir/test_cd.vim
+
+Patch 8.2.3738
+Problem: Screen is cleared when a FocusLost autocommand triggers.
+Solution: Do not redraw when at the hit-enter or more prompt. (closes #9274)
+Files: src/misc1.c
+
+Patch 8.2.3739
+Problem: In wrong directory when using win_execute() with 'acd' set.
+Solution: Restore the directory when returning to the window. (closes #9276)
+Files: src/window.c, src/testdir/test_autochdir.vim
+
+Patch 8.2.3740
+Problem: Memory left allocated on exit when using Tcl.
+Solution: Call Tcl_Finalize().
+Files: src/if_tcl.c, src/proto/if_tcl.pro, src/alloc.c
+
+Patch 8.2.3741
+Problem: Using freed memory in open command.
+Solution: Make a copy of the current line.
+Files: src/ex_docmd.c, src/testdir/test_ex_mode.vim
+
+Patch 8.2.3742
+Problem: Dec mouse test fails without gnome terminfo entry.
+Solution: Check if there is a gnome entry. Also fix 'acd' test on
+ MS-Windows. (Ozaki Kiichi, closes #9282)
+Files: src/testdir/test_termcodes.vim, src/testdir/test_autochdir.vim
+
+Patch 8.2.3743
+Problem: ":sign" can add a highlight group without a name.
+Solution: Give an error if the group name is missing. (closes #9280)
+Files: src/sign.c, src/errors.h, src/testdir/test_signs.vim
+
+Patch 8.2.3744
+Problem: E854 is not tested; some spelling suggestions are not tested.
+Solution: Add a couple of tests. (Dominique Pellé, closes #9279)
+Files: src/testdir/test_options.vim, src/testdir/test_spell.vim
+
+Patch 8.2.3745
+Problem: Autochdir test fails without the +channel feature.
+Solution: Remove the ch_logfile() call. (Dominique Pellé, closes #9281)
+Files: src/testdir/test_autochdir.vim
+
+Patch 8.2.3746
+Problem: Cannot disassemble function starting with "debug" or "profile".
+Solution: Check for white space following. (closes #9273)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3747 (after 8.2.3743)
+Problem: Cannot remove highlight from an existing sign. (James McCoy)
+Solution: Only reject empty argument for a new sign.
+Files: src/sign.c, src/testdir/test_signs.vim
+
+Patch 8.2.3748 (after 8.2.3747)
+Problem: Giving an error for an empty sign argument breaks a plugin.
+Solution: Do not give an error.
+Files: src/sign.c, src/errors.h, src/testdir/test_signs.vim
+
+Patch 8.2.3749
+Problem: Error messages are everywhere.
+Solution: Move more error messages to errors.h and adjust the names.
+Files: src/errors.h, src/regexp_bt.c, src/regexp.c, src/regexp_nfa.c,
+ src/globals.h, src/memfile.c, src/tag.c, src/getchar.c,
+ src/bufwrite.c, src/cmdexpand.c
+
+Patch 8.2.3750
+Problem: Error messages are everywhere.
+Solution: Move more error messages to errors.h and adjust the names.
+Files: src/globals.h, src/errors.h, src/blob.c, src/buffer.c,
+ src/channel.c, src/ex_docmd.c, src/job.c, src/list.c, src/mark.c,
+ src/misc1.c, src/os_unix.c, src/popupwin.c, src/register.c,
+ src/session.c, src/spellfile.c, src/term.c, src/userfunc.c
+
+Patch 8.2.3751
+Problem: Cannot assign a lambda to an option that takes a function.
+Solution: Automatically convert the lambda to a string. (Yegappan
+ Lakshmanan, closes #9286)
+Files: runtime/doc/options.txt, src/eval.c, src/proto/eval.pro,
+ src/evalvars.c, src/if_mzsch.c, src/if_ruby.c, src/if_tcl.c,
+ src/option.c, src/option.h, src/optiondefs.h,
+ src/proto/option.pro, src/spell.c, src/typval.c,
+ src/vim9compile.c, src/testdir/test_iminsert.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_tagfunc.vim
+
+Patch 8.2.3752
+Problem: Build error when using Photon GUI.
+Solution: Adjust #ifdef. (closes #9288)
+Files: src/beval.c
+
+Patch 8.2.3753
+Problem: Vim9: function unreferenced while called is never deleted.
+Solution: Delete a function when no longer referenced.
+Files: src/vim9execute.c, src/userfunc.c, src/proto/userfunc.pro
+
+Patch 8.2.3754 (after 8.2.3615)
+Problem: Undesired changing of the indent of the first formatted line.
+Solution: Do not indent the first formatted line.
+Files: src/textformat.c, src/testdir/test_indent.vim
+
+Patch 8.2.3755
+Problem: Coverity warns for using a buffer in another scope.
+Solution: Declare the buffer in a common scope.
+Files: src/evalvars.c
+
+Patch 8.2.3756
+Problem: might crash when callback is not valid.
+Solution: Check for valid callback. (Yegappan Lakshmanan, closes #9293)
+Files: src/insexpand.c, src/option.c, src/tag.c, src/job.c,
+ src/userfunc.c, src/testdir/test_iminsert.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_tagfunc.vim
+
+Patch 8.2.3757
+Problem: An overlong highlight group name is silently truncated.
+Solution: Give an error if the name is too long. (closes #9289)
+Files: src/errors.h, src/highlight.c, src/testdir/test_highlight.vim
+
+Patch 8.2.3758
+Problem: Options that take a function insufficiently tested.
+Solution: Add additional tests and enhance existing tests. (Yegappan
+ Lakshmanan, closes #9298)
+Files: src/testdir/test_ins_complete.vim, src/testdir/test_normal.vim,
+ src/testdir/test_tagfunc.vim
+
+Patch 8.2.3759
+Problem: Quickfix buffer becomes hidden while still in a window.
+Solution: Check if the closed window is the last window showing the quickfix
+ buffer. (Yegappan Lakshmanan, closes #9303, closes #9300)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim, src/window.c
+
+Patch 8.2.3760
+Problem: Not automatically handling gnome terminal mouse like xterm.
+Solution: Default 'ttymouse' to "xterm" and recognize Focus events.
+ (issue #9296)
+Files: src/os_unix.c
+
+Patch 8.2.3761
+Problem: Focus change is not passed on to a terminal window.
+Solution: If the current window is a terminal and focus events are enabled
+ send a focus event escape sequence to the terminal.
+Files: src/ui.c, src/terminal.c, src/proto/terminal.pro,
+ src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_focus_1.dump,
+ src/testdir/dumps/Test_terminal_focus_2.dump
+
+Patch 8.2.3762
+Problem: If the quickfix buffer is wiped out getqflist() still returns its
+ number.
+Solution: Use zero if the buffer is no longer present. (Yegappan Lakshmanan,
+ closes #9306)
+Files: src/quickfix.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.3763
+Problem: When editing the command line a FocusLost callback may cause the
+ screen to scroll up.
+Solution: Do not redraw at the last line but at the same place where the
+ command line was before. (closes #9295)
+Files: src/ex_getln.c, src/ui.c, src/beval.c, src/channel.c,
+ src/drawscreen.c, src/proto/drawscreen.pro, src/job.c,
+ src/popupwin.c, src/sound.c, src/terminal.c, src/time.c,
+ src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_terminal_focus_1.dump,
+ src/testdir/dumps/Test_terminal_focus_2.dump,
+ src/testdir/dumps/Test_terminal_focus_3.dump
+
+Patch 8.2.3764
+Problem: Cannot see any text when window was made zero lines or zero
+ columns.
+Solution: Ensure there is at least one line and column. (fixes #9307)
+Files: src/window.c, src/proto/window.pro, src/normal.c, src/edit.c,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.2.3765
+Problem: Vim9: cannot use a lambda for 'opfunc' and others.
+Solution: Convert the lambda to a string.
+Files: src/vim9compile.c, src/vim9.h, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3766
+Problem: Converting a funcref to a string leaves out "g:", causing the
+ meaning of the name depending on the context.
+Solution: Prepend "g:" for a global function.
+Files: src/eval.c, src/testdir/test_functions.vim
+
+Patch 8.2.3767 (after 8.2.3766)
+Problem: Crash when using NULL partial.
+Solution: Check for NULL.
+Files: src/eval.c
+
+Patch 8.2.3768
+Problem: timer_info() has the wrong repeat value in a timer callback.
+ (Sergey Vlasov)
+Solution: Do not add one to the repeat value when in the callback.
+ (closes #9294)
+Files: src/time.c, src/testdir/test_timers.vim
+
+Patch 8.2.3769
+Problem: Zig files are not recognized.
+Solution: Add *.zig. (Gregory Anders, closes #9313)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3770
+Problem: New compiler warnings from clang-12 and clang-13.
+Solution: Adjust CI and suppress some warnings. (Ozaki Kiichi, closes #9314)
+Files: .github/workflows/ci.yml, ci/config.mk.clang-12.sed,
+ src/os_unix.c, src/spellfile.c
+
+Patch 8.2.3771
+Problem: Vim9: accessing freed memory when checking type.
+Solution: Make a copy of a function type.
+Files: src/structs.h, src/evalvars.c, src/vim9script.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.3772
+Problem: Timer info test fails on slow machine.
+Solution: Use WaitForAssert().
+Files: src/testdir/test_timers.vim
+
+Patch 8.2.3773
+Problem: Wrong window size when a modeline changes 'columns' and there is
+ more than one tabpage. (Michael Soyka)
+Solution: Adjust the frames of all tabpages. (closes #9315)
+Files: src/window.c
+
+Patch 8.2.3774 (after 8.2.3773)
+Problem: Test for command line height fails.
+Solution: Use another way to handle window size change.
+Files: src/structs.h, src/window.c
+
+Patch 8.2.3775
+Problem: Vim9: lambda compiled without outer context when debugging.
+Solution: When compiling a lambda for debugging also compile it without.
+ (closes #9302)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3776
+Problem: When a tags file line is long a tag may not be found.
+Solution: When increasing the buffer size read the same line again.
+Files: src/tag.c, src/testdir/test_taglist.vim
+
+Patch 8.2.3777
+Problem: Spell file write error not checked.
+Solution: Check writing the prefix conditions. (Bjorn Linse, closes #9323)
+Files: src/spellfile.c
+
+Patch 8.2.3778
+Problem: Lambda debug test fails in some configurations.
+Solution: Check feature in a legacy function.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.3779
+Problem: Using freed memory when defining a user command from a user
+ command.
+Solution: Do not use the command pointer after executing the command.
+ (closes #9318)
+Files: src/usercmd.c, src/testdir/test_usercommands.vim
+
+Patch 8.2.3780
+Problem: ":cd" works differently on MS-Windows.
+Solution: Add the 'cdhome' option. (closes #9324)
+Files: runtime/doc/editing.txt, runtime/doc/options.txt,
+ runtime/doc/quickref.txt, runtime/optwin.vim, src/ex_docmd.c,
+ src/option.h, src/optiondefs.h, src/testdir/runtest.vim,
+ src/testdir/test_options.vim
+
+Patch 8.2.3781
+Problem: The option window script is outdated.
+Solution: Add several changes.
+Files: runtime/optwin.vim
+
+Patch 8.2.3782
+Problem: Vim9: no error if a function shadows a script variable.
+Solution: Check the function doesn't shadow a variable. (closes #9310)
+Files: src/userfunc.c, src/evalvars.c, src/vim.h,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3783
+Problem: Confusing error for using a variable as a function.
+Solution: If a function is not found but there is a variable, give a more
+ useful error. (issue #9310)
+Files: src/eval.c, src/userfunc.c, src/proto/userfunc.pro,
+ src/structs.h, src/vim9execute.c, src/testdir/test_functions.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3784
+Problem: The help for options is outdated.
+Solution: Include all the recent changes.
+Files: runtime/doc/options.txt
+
+Patch 8.2.3785
+Problem: Running CI on macOS with gcc is not useful.
+Solution: Only use clang. (Ozaki Kiichi, closes #9326) Also build with
+ normal features.
+Files: .github/workflows/ci.yml
+
+Patch 8.2.3786
+Problem: Test fails because of using Vim9 syntax in legacy function.
+Solution: Add "call".
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.3787
+Problem: No proper formatting of a C line comment after a statement.
+Solution: Find the start of the line comment, insert the comment leader and
+ indent the comment properly.
+Files: src/change.c, src/proto/change.pro, src/search.c,
+ src/proto/search.pro, src/cindent.c, src/edit.c, src/normal.c,
+ src/textformat.c, src/testdir/test_textformat.vim,
+ src/testdir/test_cindent.vim
+
+Patch 8.2.3788
+Problem: Lambda for option that is a function may be garbage collected.
+Solution: Set a reference in the funcref. (Yegappan Lakshmanan,
+ closes #9330)
+Files: src/eval.c, src/evalbuffer.c, src/evalvars.c, src/gui_xim.c,
+ src/insexpand.c, src/ops.c, src/proto/eval.pro,
+ src/proto/gui_xim.pro, src/proto/insexpand.pro, src/proto/ops.pro,
+ src/proto/tag.pro, src/quickfix.c, src/tag.c,
+ src/testdir/test_iminsert.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_normal.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_tagfunc.vim
+
+Patch 8.2.3789
+Problem: Test_window_minimal_size can fail on a slow machine.
+Solution: Do not rely on timers firing at the expected time. (Ozaki Kiichi,
+ closes #9335)
+Files: src/testdir/test_window_cmd.vim
+
+Patch 8.2.3790
+Problem: Test for term_gettitle() fails in some environments.
+Solution: Make the digits after "VIM" optional. (Kenta Sato, closes #9334)
+Files: src/testdir/test_terminal2.vim
+
+Patch 8.2.3791
+Problem: Build error with +cindent but without +smartindent.
+Solution: Move declaration of "do_cindent". (John Marriott)
+Files: src/change.c
+
+Patch 8.2.3792
+Problem: Setting *func options insufficiently tested.
+Solution: Improve tests. (Yegappan Lakshmanan, closes #9337)
+Files: src/testdir/test_iminsert.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_normal.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_tagfunc.vim
+
+Patch 8.2.3793
+Problem: Using "g:Func" as a funcref does not work in script context
+ because "g:" is dropped.
+Solution: Keep "g:" in the name. Also add parenthesis to avoid confusing
+ operator precedence. (closes #9336)
+Files: src/evalvars.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3794
+Problem: Vim9: cannot find script-local func using "s:". (Yegappan
+ Lakshmanan)
+Solution: Skip the "s:".
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3795
+Problem: Too many #ifdefs.
+Solution: Graduate the jumplist feature.
+Files: runtime/doc/various.txt, runtime/doc/motion.txt, src/feature.h,
+ src/buffer.c, src/change.c, src/evalfunc.c, src/ex_docmd.c,
+ src/mark.c, src/normal.c, src/undo.c, src/version.c,
+ src/viminfo.c, src/window.c, src/structs.h,
+ src/testdir/test_changelist.vim, src/testdir/test_jumplist.vim,
+ src/testdir/test_normal.vim
+
+Patch 8.2.3796
+Problem: The funcexe_T struct members are not named consistently.
+Solution: Prefix "fe_" to all the members.
+Files: src/structs.h, src/eval.c, src/list.c, src/regexp.c,
+ src/terminal.c, src/userfunc.c, src/vim9execute.c
+
+Patch 8.2.3797
+Problem: No good reason to limit the message history in the tiny version.
+Solution: Always use 200.
+Files: runtime/doc/message.txt, src/feature.h
+
+Patch 8.2.3798
+Problem: A :def callback function postpones an error message.
+Solution: Display the error after calling the function. (closes #9340)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim,
+ src/testdir/dumps/Test_opfunc_error.dump
+
+Patch 8.2.3799 (after 8.2.3798)
+Problem: Edit test hangs or fails.
+Solution: Do not rethrow an exception when inside try/catch.
+Files: src/userfunc.c
+
+Patch 8.2.3800
+Problem: When cross compiling the output of "uname" cannot be set. (Ben
+ Reeves)
+Solution: Use cache variables. (closes #9338)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.3801
+Problem: If a terminal shows in two windows, only one is redrawn.
+Solution: Reset the dirty row range only after redrawing all windows.
+ (closes #9341)
+Files: src/terminal.c, src/proto/terminal.pro, src/drawscreen.c,
+ src/testdir/test_terminal.vim
+
+Patch 8.2.3802
+Problem: Terminal in two windows test fails on some systems.
+Solution: Wait a bit between commands.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.3803
+Problem: Crash when 'writedelay' is set and using a terminal window to
+ execute a shell command.
+Solution: Check that "tl_vterm" isn't NULL. (closes #9346)
+Files: src/terminal.c
+
+Patch 8.2.3804
+Problem: Script context not set when copying 'swf' and 'ts'.
+Solution: Use COPY_OPT_SCTX with the right argument. (closes #9347)
+Files: src/option.c
+
+Patch 8.2.3805
+Problem: i3config files are not recognized.
+Solution: Add patterns to match i3config files. (Quentin Hibon,
+ closes #7969)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3806
+Problem: Terminal focus test fails sometimes.
+Solution: Run the test function before others.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.3807
+Problem: Vim9: can call import with star directly.
+Solution: Check that the import used star.
+Files: src/userfunc.c, src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3808
+Problem: Vim9: obsolete TODO items
+Solution: Remove the comments.
+Files: src/vim9execute.c
+
+Patch 8.2.3809
+Problem: Vim9: crash when garbage collecting a nested partial. (Virginia
+ Senioria)
+Solution: Set references in all the funcstacks. (closes #9348)
+Files: src/vim9execute.c, src/proto/vim9execute.pro, src/structs.h,
+ src/eval.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3810
+Problem: Vim9: expr4 test fails on MS-Windows.
+Solution: Do not give an error for a missing function name when skipping.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3811
+Problem: The opfunc error test fails on a slow machine.
+Solution: Use WaitForAssert().
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.3812
+Problem: Vim9: leaking memory in numbered function test.
+Solution: Skip "g:" when checking for numbered function. Clean up after
+ errors properly.
+Files: src/userfunc.c
+
+Patch 8.2.3813
+Problem: confusing error when using :cc without error list. (Gary Johnson)
+Solution: Give the "no errors" error.
+Files: src/ex_docmd.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.3814
+Problem: .csx files and .sln files are not recognized.
+Solution: Add filetype patterns. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3815
+Problem: Vim9: cannot have a multi-line dict inside a block.
+Solution: Do not split the command at a line break, handle NL characters
+ as white space.
+Files: src/ex_docmd.c, src/charset.c, src/proto/charset.pro,
+ src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3816
+Problem: Compiler warning for possible loss of data on MS-Windows.
+Solution: Add type cast. (Mike Williams, closes #9349)
+Files: src/userfunc.c
+
+Patch 8.2.3817 (after 8.2.3815)
+Problem: Vim9: Not using NL as command end does not work for :autocmd.
+Solution: Only ignore NL for commands with an expression argument.
+Files: src/ex_cmds.h, src/ex_docmd.c, src/testdir/test_usercommands.vim
+
+Patch 8.2.3818
+Problem: Cannot filter or map characters in a string.
+Solution: Make filter() and map() work on a string. (Naruhiko Nishino,
+ closes #9327)
+Files: runtime/doc/eval.txt, src/errors.h, src/list.c,
+ src/testdir/test_filter_map.vim
+
+Patch 8.2.3819 (after 8.2.3818)
+Problem: Test fails because error message changed.
+Solution: Update screendumps.
+Files: src/testdir/dumps/Test_popupwin_three_errors_1.dump,
+ src/testdir/dumps/Test_popupwin_three_errors_2.dump
+
+Patch 8.2.3820
+Problem: "vrc" does not replace composing characters, while "rc" does.
+Solution: Check the byte length including composing characters.
+ (closes #9351)
+Files: src/ops.c, src/testdir/test_visual.vim
+
+Patch 8.2.3821
+Problem: ASAN test run fails.
+Solution: Use asan_symbolize-13 instead of asan_symbolize-11.
+Files: .github/workflows/ci.yml
+
+Patch 8.2.3822
+Problem: Leaking memory in map() and filter(), cannot use a string argument
+ in Vim9 script.
+Solution: Fix the leak, adjust the argument check, also run the tests as
+ Vim9 script. (Yegappan Lakshmanan, closes #9354)
+Files: src/errors.h, src/evalfunc.c, src/list.c, src/proto/typval.pro,
+ src/testdir/test_filter_map.vim,
+ src/testdir/test_vim9_builtin.vim, src/typval.c
+
+Patch 8.2.3823
+Problem: Test for visual replace is in wrong function.
+Solution: Move it to another function.
+Files: src/testdir/test_visual.vim
+
+Patch 8.2.3824
+Problem: No ASAN support for MSVC.
+Solution: Add ASAN support and fix a couple of uncovered problems. (Yegappan
+ Lakshmanan, closes #9357)
+Files: src/Make_mvc.mak, src/findfile.c, src/os_mswin.c,
+ src/testdir/test_fnamemodify.vim
+
+Patch 8.2.3825
+Problem: Various comments could be improved.
+Solution: Improve the comments.
+Files: src/getchar.c, src/mbyte.c, src/regexp_nfa.c,
+ src/testdir/test_edit.vim, src/gui_motif.c
+
+Patch 8.2.3826
+Problem: Vim9: using "g:Func" as a funcref does not work in a :def
+ function.
+Solution: Include "g:" in the function name. (closes #9336)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3827
+Problem: Huntr badge does not really fit in the list.
+Solution: Move the link to Huntr to the issue template.
+Files: Filelist, .github/ISSUE_TEMPLATE/bug_report.yml, README.md
+
+Patch 8.2.3828
+Problem: when opening a terminal from a timer the first typed character
+ is lost. (Virginia Senioria)
+Solution: When opening a terminal while waiting for a character put K_IGNORE
+ in the input buffer.
+Files: src/terminal.c, src/edit.c, src/testdir/test_terminal.vim
+
+Patch 8.2.3829
+Problem: No error when setting a func option to a script-local function.
+Solution: Give an error if the name starts with "s:". (closes #9358)
+Files: src/option.c, src/testdir/test_tagfunc.vim,
+ src/testdir/dumps/Test_set_tagfunc_on_cmdline.dump
+
+Patch 8.2.3830
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/globals.h, src/errors.h, src/buffer.c, src/dict.c, src/diff.c,
+ src/digraph.c, src/eval.c, src/evalfunc.c, src/evalvars.c,
+ src/misc2.c, src/quickfix.c, src/typval.c, src/ui.c,
+ src/userfunc.c, src/vim9compile.c, src/vim9execute.c,
+ src/vim9type.c, src/window.c
+
+Patch 8.2.3831
+Problem: Opfunc test fails when missing feature changes function name.
+ (Dominique Pellé)
+Solution: Check the relevant screen line instead of using a screendump.
+ (closes #9360)
+Files: src/testdir/test_vim9_func.vim,
+ src/testdir/dumps/Test_opfunc_error.dump
+
+Patch 8.2.3832 (after 8.2.3830)
+Problem: Test fails because of changed error message.
+Solution: Adjust the expected error message.
+Files: src/testdir/test_vimscript.vim
+
+Patch 8.2.3833
+Problem: Error from term_start() not caught by try/catch.
+Solution: save and restore did_emsg when applying autocommands. (Ozaki
+ Kiichi, closes #9361)
+Files: src/autocmd.c, src/testdir/test_terminal3.vim
+
+Patch 8.2.3834
+Problem: Test_out_cb often fails on Mac.
+Solution: Increase the timeout with every retry.
+Files: src/testdir/test_channel.vim
+
+Patch 8.2.3835
+Problem: The inline-function example does not work.
+Solution: Drop ":let". Add EX_EXPR_ARG to CMD_var. (issue #9352)
+Files: runtime/doc/vim9.txt, src/ex_cmds.h,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3836
+Problem: Vim9: comment after expression not skipped to find NL.
+Solution: After evaluating an expression look for a newline after a #
+ comment.
+Files: src/eval.c
+
+Patch 8.2.3837
+Problem: QNX: crash when compiled with GUI but using terminal.
+Solution: Check gui.in_use is set. (Hirohito Higashi, closes #9363)
+Files: src/autocmd.c
+
+Patch 8.2.3838
+Problem: Cannot use script-local function for setting *func options.
+Solution: Use the script context. (Yegappan Lakshmanan, closes #9362)
+Files: src/option.c, src/testdir/dumps/Test_set_tagfunc_on_cmdline.dump,
+ src/testdir/test_ins_complete.vim, src/testdir/test_normal.vim,
+ src/testdir/test_quickfix.vim, src/testdir/test_tagfunc.vim
+
+Patch 8.2.3839
+Problem: Using \z() with \z1 not tested for syntax highlighting.
+Solution: Add a test. (Dominique Pellé, closes #9365)
+Files: src/testdir/test_syntax.vim
+
+Patch 8.2.3840
+Problem: Useless test for negative index in check functions.
+Solution: Remove the test for negative index. (Naruhiko Nishino,
+ closes #9364)
+Files: src/typval.c
+
+Patch 8.2.3841
+Problem: Vim9: outdated TODO items, disabled tests that work.
+Solution: Remove TODO items, run tests that work now. Check that a dict
+ item isn't locked.
+Files: src/vim9execute.c, src/evalvars.c, src/errors.h, src/globals.h,
+ src/testdir/test_listdict.vim, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3842
+Problem: Vim9: can change locked list and list items.
+Solution: Check that a list and list item isn't locked.
+Files: src/vim9execute.c, src/testdir/test_listdict.vim
+
+Patch 8.2.3843
+Problem: Dep3patch files are not recognized.
+Solution: Recognize dep3patch files by their location and content. (James
+ McCoy, closes #9367)
+Files: runtime/autoload/dist/ft.vim, runtime/filetype.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.3844
+Problem: Vim9: no type error if assigning a value with type func(number) to
+ a variable of type func(string).
+Solution: Use check_type_maybe(): return MAYBE if a runtime type check is
+ useful. (issue #8492)
+Files: src/vim9type.c, src/proto/vim9type.pro, src/vim9compile.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3845
+Problem: Vim9: test fails when the channel feature is missing.
+Solution: Check for the channel feature. (Dominique Pellé, closes #9368)
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3846
+Problem: No error when using control character for 'lcs' or 'fcs'.
+Solution: Use char2cells() to check the width. (closes #9369)
+Files: src/screen.c, src/testdir/test_display.vim,
+ src/testdir/test_listchars.vim
+
+Patch 8.2.3847
+Problem: Illegal memory access when using a lambda with an error.
+Solution: Avoid skipping over the NUL after a string.
+Files: src/eval.c, src/testdir/test_lambda.vim
+
+Patch 8.2.3848
+Problem: Cannot use reduce() for a string.
+Solution: Make reduce() work with a string. (Naruhiko Nishino, closes #9366)
+Files: runtime/doc/eval.txt, src/errors.h, src/evalfunc.c, src/list.c,
+ src/typval.c, src/proto/typval.pro, src/testdir/test_listdict.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3849
+Problem: Functions implementing reduce and map are too long.
+Solution: Use a function for each type of value. Add a few more test cases
+ and add to the help. (Yegappan Lakshmanan, closes #9370)
+Files: runtime/doc/eval.txt, src/list.c, src/testdir/test_listdict.vim
+
+Patch 8.2.3850
+Problem: Illegal memory access when displaying a partial.
+Solution: Terminate the string with a NUL. (closes #9371)
+Files: src/eval.c, src/testdir/test_messages.vim
+
+Patch 8.2.3851
+Problem: Vim9: overhead when comparing string, dict or function.
+Solution: Call the intended compare function directly. Refactor to avoid
+ duplicated code.
+Files: src/vim9execute.c, src/typval.c, src/proto/typval.pro
+
+Patch 8.2.3852
+Problem: Vim9: not enough tests.
+Solution: Also run existing tests for Vim9 script. Make errors more
+ consistent.
+Files: src/testdir/test_listdict.vim, src/eval.c, src/vim9compile.c,
+ src/errors.h
+
+Patch 8.2.3853
+Problem: Vim9: not enough tests.
+Solution: Run more existing tests for Vim9 script.
+Files: src/testdir/test_listdict.vim
+
+Patch 8.2.3854
+Problem: Vim9: inconsistent arguments for test functions.
+Solution: When :def function and script have different arguments use a list
+ with two items instead of a separate function.
+Files: src/testdir/vim9.vim, src/testdir/test_execute_func.vim,
+ src/testdir/test_float_func.vim, src/testdir/test_functions.vim,
+ src/testdir/test_glob2regpat.vim, src/testdir/test_listdict.vim,
+ src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3855
+Problem: Illegal memory access when displaying a blob.
+Solution: Append a NUL at the end. (Yegappan Lakshmanan, closes #9372)
+Files: src/blob.c, src/regexp_nfa.c, src/testdir/test_blob.vim,
+ src/testdir/test_messages.vim
+
+Patch 8.2.3856
+Problem: Vim9: not enough tests.
+Solution: Run more expression tests also with Vim9. Fix an uncovered
+ problem.
+Files: src/vim9compile.c, src/testdir/test_expr.vim, src/testdir/vim9.vim
+
+Patch 8.2.3857
+Problem: Vim9: inconsistent error for using function().
+Solution: Use a runtime type check for the result of function().
+ (closes #8492)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3858
+Problem: Vim9: not enough tests.
+Solution: Add tests for :try/:catch and :redir. Add missing type check.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.3859
+Problem: Vim9: some code lines not tested.
+Solution: Add a few specific tests.
+Files: src/vim9compile.c, src/testdir/test_vim9_cmd.vim, src/errors.h,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3860
+Problem: Vim9: codecov struggles with the file size.
+Solution: Split vim9compile.c into four files.
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/vim9instr.c,
+ src/proto/vim9instr.pro, src/vim9expr.c, src/proto/vim9expr.pro,
+ src/vim9cmds.c, src/proto/vim9cmds.pro, src/vim9.h,
+ src/vim9execute.c, src/vim9script.c, src/proto.h,
+ src/Makefile, src/Make_ami.mak, src/Make_cyg_ming.mak,
+ src/Make_mvc.mak, src/Make_vms.mms
+
+Patch 8.2.3861
+Problem: List of distributed files is outdated.
+Solution: Add new files.
+Files: Filelist
+
+Patch 8.2.3862
+Problem: Crash on exit with EXITFREE and using win_execute().
+Solution: Also save and restore tp_topframe. (issue #9374)
+Files: src/evalwindow.c, src/testdir/test_execute_func.vim
+
+Patch 8.2.3863 (after 8.2.3860)
+Problem: Various build flags accidentally enabled.
+Solution: Revert several lines in Makefile.
+Files: src/Makefile
+
+Patch 8.2.3864
+Problem: Cannot disable requesting key codes from xterm.
+Solution: Add the 'xtermcodes' option, default on.
+Files: runtime/doc/options.txt, runtime/doc/term.txt, src/option.h,
+ src/optiondefs.h, src/term.c, runtime/optwin.vim
+
+Patch 8.2.3865
+Problem: Vim9: compiler complains about using "try" as a struct member.
+Solution: Rename "try" to "tryref".
+Files: src/vim9.h, src/vim9cmds.c, src/vim9execute.c, src/vim9instr.c
+
+Patch 8.2.3866
+Problem: Vim9: type checking global variables is inconsistent.
+Solution: Use the "unknown" type in more places.
+Files: src/globals.h, src/vim9expr.c, src/vim9instr.c, src/vim9cmds.c,
+ src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3867
+Problem: Implementation of some list functions too complicated.
+Solution: Refactor do_sort_uniq(), f_count() and extend() (Yegappan
+ Lakshmanan, closes #9378)
+Files: src/list.c
+
+Patch 8.2.3868 (after 8.2.3866)
+Problem: Vim9: function test fails.
+Solution: Add missing changes. Add test for earlier patch.
+Files: src/vim9type.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3869
+Problem: Vim9: type checking for "any" is inconsistent.
+Solution: Always use a runtime type check for using "any" for a more
+ specific type.
+Files: src/vim9type.c, src/vim9compile.c, src/vim9expr.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.3870
+Problem: MS-Windows: wrong working directory when opening two files with
+ right-click context menu. (Gabriel Dupras)
+Solution: Use the working directory and pass it on to the process creation.
+ (Nir Lichtman, closes #9382, closes #8874)
+Files: src/GvimExt/gvimext.cpp, src/GvimExt/gvimext.h
+
+Patch 8.2.3871
+Problem: List.c contains code for dict and blob.
+Solution: Refactor to put code where it belongs. (Yegappan Lakshmanan,
+ closes #9386)
+Files: src/blob.c, src/dict.c, src/list.c, src/proto/blob.pro,
+ src/proto/dict.pro, src/proto/list.pro, src/proto/strings.pro,
+ src/strings.c, src/structs.h, src/testdir/test_filter_map.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_sort.vim
+
+Patch 8.2.3872
+Problem: Vim9: finddir() and uniq() return types can be more specific.
+Solution: Adjust the return type.
+Files: src/evalfunc.c, src/testdir/vim9.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3873
+Problem: go.mod files are not recognized.
+Solution: Check for the file name. (closes #9380)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3874
+Problem: Cannot highlight the number column for a sign.
+Solution: Add the "numhl" argument. (James McCoy, closes #9381)
+Files: runtime/doc/options.txt, runtime/doc/sign.txt, src/drawline.c,
+ src/popupwin.c, src/proto/sign.pro, src/sign.c, src/structs.h,
+ src/testdir/test_signs.vim
+
+Patch 8.2.3875
+Problem: gcc complains about buffer overrun.
+Solution: Use mch_memmove() instead of STRCPY(). (John Marriott)
+Files: src/dict.c
+
+Patch 8.2.3876
+Problem: 'cindent' does not recognize inline namespace.
+Solution: Skip over "inline" to find "namespace". (closes #9383)
+Files: src/cindent.c, src/testdir/test_cindent.vim
+
+Patch 8.2.3877
+Problem: Function does not abort after a type error in compare
+Solution: Check getting number fails. (closes #9384)
+Files: src/typval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3878
+Problem: Vim9: debugger tries to read more lines than there are.
+Solution: Check the number of lines. (closes #9394)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3879
+Problem: getreg() and getregtype() contain dead code.
+Solution: Remove the needless check. (closes #9392) Also refactor to put
+ common code in a shared function.
+Files: src/evalfunc.c
+
+Patch 8.2.3880
+Problem: Solution filter files are not recognized.
+Solution: Add pattern *.slnf and use json. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3881
+Problem: QNX: crash when compiled with GUI but using terminal.
+Solution: Check the gui.in_use flag. (Hirohito Higashi, closes #9391)
+Files: src/main.c
+
+Patch 8.2.3882 (after 8.2.3879)
+Problem: More duplicated code in f_getreginfo().
+Solution: Also use getreg_get_regname(). (closes #9398)
+Files: src/evalfunc.c
+
+Patch 8.2.3883
+Problem: Crash when switching to other regexp engine fails.
+Solution: Check for regprog being NULL.
+Files: src/ex_cmds.c
+
+Patch 8.2.3884
+Problem: Crash when clearing the argument list while using it.
+Solution: Lock the argument list for ":all".
+Files: src/arglist.c, src/testdir/test_arglist.vim
+
+Patch 8.2.3885
+Problem: Arglist test fails.
+Solution: Adjust for locking the arglist for ":all".
+Files: src/testdir/test_arglist.vim
+
+Patch 8.2.3886
+Problem: Can define autocmd for every event by using "au!".
+Solution: Check if a command is present also for "au!".
+Files: src/autocmd.c, src/testdir/test_autocmd.vim,
+ src/testdir/test_arglist.vim
+
+Patch 8.2.3887
+Problem: E1135 is used for two different errors.
+Solution: Renumber one error.
+Files: src/errors.h, src/testdir/test_mapping.vim
+
+Patch 8.2.3888
+Problem: The argument list may contain duplicates.
+Solution: Add the :argdedeupe command. (Nir Lichtman, closes #6235)
+Files: runtime/doc/editing.txt, runtime/doc/index.txt, src/arglist.c,
+ src/ex_cmdidxs.h, src/ex_cmds.h, src/proto/arglist.pro,
+ src/testdir/test_arglist.vim
+
+Patch 8.2.3889
+Problem: Duplicate code for translating script-local function name.
+Solution: Move the code to get_scriptlocal_funcname(). (Yegappan Lakshmanan,
+ closes #9393)
+Files: src/evalfunc.c, src/evalvars.c, src/option.c, src/userfunc.c,
+ src/proto/userfunc.pro, src/testdir/test_expr.vim,
+ src/testdir/test_normal.vim
+
+Patch 8.2.3890
+Problem: Vim9: type check for using v: variables is basic.
+Solution: Specify a more precise type.
+Files: src/evalvars.c, src/proto/evalvars.pro, src/vim9instr.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.3891
+Problem: Github CI: workflows may overlap.
+Solution: Cancel previous workflows when starting a new one. (Yegappan
+ Lakshmanan, closes #9400)
+Files: .github/workflows/ci.yml, .github/workflows/codeql-analysis.yml
+
+Patch 8.2.3892
+Problem: When modifyOtherKeys is used CTRL-C is not recognized.
+Solution: Check for uppercase C as well, fix minimum length.
+Files: src/ui.c
+
+Patch 8.2.3893
+Problem: Vim9: many local variables are initialized with an instruction.
+Solution: Initialize local variables to zero to avoid the instructions.
+Files: src/vim9execute.c, src/vim9compile.c, src/vim9instr.c,
+ src/proto/vim9instr.pro, src/vim9cmds.c,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3894
+Problem: Vim9: no proper type check for first argument of call().
+Solution: Add specific type check.
+Files: src/evalfunc.c, src/typval.c, src/proto/typval.pro,
+ src/errors.h, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3895
+Problem: Vim9: confusing error when using function() with a number.
+Solution: Check for a function or string argument.
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3896
+Problem: Vim9: no test for nested function not available later.
+Solution: Add a test.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.3897
+Problem: Vim9: the second argument of map() and filter() is not checked at
+ compile time.
+Solution: Add more specific type check for the second argument.
+Files: src/evalfunc.c, src/globals.h, src/list.c,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3898
+Problem: Vim9: not sufficient testing for variable initialization.
+Solution: Add another test case.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3899 (after 8.2.3897)
+Problem: Vim9: test for map() on string fails.
+Solution: Expect string return type.
+Files: src/evalfunc.c
+
+Patch 8.2.3900
+Problem: It is not easy to use a script-local function for an option.
+Solution: recognize s: and <SID> at the start of the expression. (Yegappan
+ Lakshmanan, closes #9401)
+Files: runtime/doc/diff.txt, runtime/doc/fold.txt,
+ runtime/doc/options.txt, runtime/doc/print.txt, src/optionstr.c,
+ src/testdir/test_diffmode.vim, src/testdir/test_edit.vim,
+ src/testdir/test_fold.vim, src/testdir/test_gf.vim,
+ src/testdir/test_gui.vim, src/testdir/test_hardcopy.vim,
+ src/testdir/test_normal.vim
+
+Patch 8.2.3901
+Problem: Vim9: Cannot set 'cpo' in main .vimrc if using Vim9 script.
+Solution: Do not restore 'cpo' at the end of the main .vimrc.
+Files: runtime/doc/vim9.txt, runtime/doc/options.txt, src/scriptfile.c,
+ src/structs.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.3902
+Problem: Vim9: double free with nested :def function.
+Solution: Pass "line_to_free" from compile_def_function() and make sure
+ cmdlinep is valid.
+Files: src/vim9compile.c, src/userfunc.c, src/proto/userfunc.pro,
+ src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3903
+Problem: "gM" does not count tabs as expected.
+Solution: Use linetabsize() instead of mb_string2cells(). (closes #9409)
+Files: src/normal.c, src/testdir/test_normal.vim
+
+Patch 8.2.3904
+Problem: Vim9: skip expression type is not checked at compile time.
+Solution: Add argument type checks.
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3905
+Problem: Dockerfile using prefix name not recognized.
+Solution: Recognize Dockerfile.*. (closes #9410)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3906
+Problem: Vim9 help still contains "under development" warnings.
+Solution: Remove the explicit warning.
+Files: runtime/doc/vim9.txt
+
+Patch 8.2.3907
+Problem: Error messages are spread out.
+Solution: Move error messages to errors.h. Avoid duplicates.
+Files: src/userfunc.c, src/ex_cmds.c, src/viminfo.c, src/errors.h,
+ src/testdir/test_user_func.vim
+
+Patch 8.2.3908
+Problem: Cannot use a script-local function for 'foldtext'.
+Solution: Expand "s:" and "<SID>". (Yegappan Lakshmanan, closes #9411)
+Files: runtime/doc/fold.txt, src/optionstr.c, src/strings.c,
+ src/testdir/test_blob.vim, src/testdir/test_expr.vim,
+ src/testdir/test_filter_map.vim, src/testdir/test_fold.vim,
+ src/testdir/test_listdict.vim
+
+Patch 8.2.3909
+Problem: Containerfile using prefix name not recognized.
+Solution: Recognize Containerfile.*.
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3910
+Problem: When the compare function of sort() produces and error then sort()
+ does not abort.
+Solution: Check if did_emsg was incremented.
+Files: src/list.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3911
+Problem: Vim9: type check for filter() does not accept unknown.
+Solution: Also accept unknown for the return type. (closes #9413)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3912
+Problem: The ins_complete() function is much too long.
+Solution: Split it up into multiple functions. (Yegappan Lakshmanan,
+ closes #9414)
+Files: src/insexpand.c
+
+Patch 8.2.3913
+Problem: Help for expressions does not mention Vim9 syntax.
+Solution: Add the rules for Vim9 to the expression help. Rename functions
+ to match the help.
+Files: runtime/doc/vim9.txt, runtime/doc/eval.txt, src/vim9expr.c
+
+Patch 8.2.3914
+Problem: Various spelling mistakes in comments.
+Solution: Fix the mistakes. (Dominique Pellé, closes #9416)
+Files: src/alloc.c, src/blowfish.c, src/buffer.c, src/cindent.c,
+ src/clipboard.c, src/diff.c, src/drawline.c, src/edit.c,
+ src/ex_cmds.c, src/ex_docmd.c, src/findfile.c, src/fold.c,
+ src/getchar.c, src/gui.c, src/gui_athena.c, src/gui_gtk.c,
+ src/gui_motif.c, src/gui_photon.c, src/gui_w32.c, src/gui_xmebw.c,
+ src/if_python.c, src/if_python3.c, src/if_xcmdsrv.c, src/main.c,
+ src/memline.c, src/menu.c, src/message.c, src/misc1.c, src/move.c,
+ src/option.c, src/os_amiga.c, src/os_mac.h, src/os_mac_conv.c,
+ src/os_mswin.c, src/os_unix.c, src/os_win32.c, src/os_win32.h,
+ src/quickfix.c, src/regexp_nfa.c, src/screen.c, src/scriptfile.c,
+ src/spell.c, src/spellfile.c, src/spellsuggest.c, src/strings.c,
+ src/term.c, src/terminal.c, src/testdir/test_debugger.vim,
+ src/testdir/test_source.vim, src/textformat.c, src/userfunc.c,
+ src/vim.h, src/vim9.h, src/vim9cmds.c, src/vim9execute.c,
+ src/winclip.c, src/window.c
+
+Patch 8.2.3915
+Problem: illegal memory access when completing with invalid bytes.
+Solution: Avoid going over the end of the completion text.
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.3916
+Problem: No error for passing an invalid line number to append().
+Solution: In Vim9 script check for a non-negative number. (closes #9417)
+Files: src/evalbuffer.c, src/textprop.c, src/errors.h, src/indent.c,
+ src/eval.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3917
+Problem: The eval.txt help file is way too big.
+Solution: Move the builtin function details to a separate file.
+Files: runtime/doc/eval.txt, runtime/doc/builtin.txt,
+ runtime/doc/Makefile, runtime/doc/help.txt, runtime/doc/remote.txt
+
+Patch 8.2.3918 (after 8.2.3916)
+Problem: Function list test fails.
+Solution: Adjust the test for the new location of the function list.
+Files: src/testdir/test_function_lists.vim
+
+Patch 8.2.3919
+Problem: Vim9: wrong argument for append() results in two errors.
+Solution: Check did_emsg. Also for setline(). Adjust the help for
+ appendbufline().
+Files: runtime/doc/builtin.txt, src/evalbuffer.c, src/typval.c,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3920
+Problem: Restoring directory after using another window is inefficient.
+Solution: Only restore the directory for win_execute(). Apply 'autochdir'
+ only when needed.
+Files: src/evalwindow.c, src/testdir/test_autochdir.vim
+
+Patch 8.2.3921
+Problem: The way xdiff is used is inefficient.
+Solution: Use hunk_func instead of the out_line callback. (Lewis Russell,
+ closes #9344)
+Files: src/diff.c
+
+Patch 8.2.3922
+Problem: Cannot build with dynamic Ruby 3.1.
+Solution: Add "_EXTRA" variables for CI. Add missing functions. (Ozaki
+ Kiichi, closes #9420)
+Files: ci/config.mk.clang-12.sed, ci/config.mk.clang.sed,
+ ci/config.mk.sed, src/Makefile, src/auto/configure,
+ src/config.mk.in, src/configure.ac, src/if_ruby.c, src/vim.h
+
+Patch 8.2.3923
+Problem: Vim9: double free if a nested function has a line break in the
+ argument list.
+Solution: Set cmdlinep when freeing the previous line.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3924
+Problem: Vim9: no error if something follows :enddef in a nested function.
+Solution: Give an error. Move common code to a function.
+Files: src/userfunc.c, src/vim9compile.c, src/errors.h,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.3925
+Problem: Diff mode confused by NUL bytes.
+Solution: Handle NUL bytes differently. (Christian Brabandt, closes #9421,
+ closes #9418)
+Files: src/diff.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_bin_01.dump,
+ src/testdir/dumps/Test_diff_bin_02.dump,
+ src/testdir/dumps/Test_diff_bin_03.dump,
+ src/testdir/dumps/Test_diff_bin_04.dump
+
+Patch 8.2.3926 (after 8.2.3920)
+Problem: Build failure without the 'autochdir' option. (John Marriott)
+Solution: Add #ifdefs.
+Files: src/evalwindow.c
+
+Patch 8.2.3927
+Problem: Vim9: double free when using lambda.
+Solution: Don't free both cmdline and line_to_free.
+Files: src/userfunc.c
+
+Patch 8.2.3928
+Problem: Heredoc test fails.
+Solution: Correct order of function arguments.
+Files: src/userfunc.c
+
+Patch 8.2.3929
+Problem: Using uninitialized variable.
+Solution: Set the option flags to zero for a terminal option.
+Files: src/option.c
+
+Patch 8.2.3930
+Problem: getcmdline() argument has a misleading type.
+Solution: Use the correct type, even though the value is not used.
+Files: src/ex_getln.c, src/proto/ex_getln.pro, src/ex_docmd.c,
+ src/normal.c, src/register.c, src/userfunc.c
+
+Patch 8.2.3931
+Problem: Coverity reports a memory leak.
+Solution: Free memory in case of failure.
+Files: src/diff.c
+
+Patch 8.2.3932
+Problem: C line comment not formatted properly.
+Solution: If a line comment follows after "#if" the next line is not the end
+ of a paragraph.
+Files: src/textformat.c, src/testdir/test_textformat.vim
+
+Patch 8.2.3933
+Problem: After ":cd" fails ":cd -" is incorrect.
+Solution: Set the previous directory only after successfully changing
+ directory. (Richard Doty, closes #9419, closes #8983)
+Files: src/ex_docmd.c, src/testdir/test_cd.vim
+
+Patch 8.2.3934
+Problem: Repeating line comment is undesired for "O" command.
+Solution: Do not copy line comment leader for "O". (closes #9426)
+Files: src/change.c, src/testdir/test_textformat.vim
+
+Patch 8.2.3935
+Problem: CTRL-U in Insert mode does not fix the indent.
+Solution: Fix the indent when 'cindent' is set.
+Files: src/edit.c, src/testdir/test_textformat.vim
+
+Patch 8.2.3936
+Problem: No proper test for maintaining change mark in diff mode.
+Solution: Run the test with internal and external diff. (Sean Dewar,
+ closes #9424)
+Files: src/testdir/test_diffmode.vim
+
+Patch 8.2.3937
+Problem: Insert mode completion function is too long.
+Solution: Refactor into multiple functions. (Yegappan Lakshmanan,
+ closes #9423)
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.3938
+Problem: Line comment start is also found in a string.
+Solution: Skip line comments in a string.
+Files: src/cindent.c, src/proto/cindent.pro, src/search.c,
+ src/testdir/test_textformat.vim
+
+Patch 8.2.3939
+Problem: MS-Windows: fnamemodify('', ':p') does not work.
+Solution: Do not consider an empty string a full path. (Yegappan Lakshmanan,
+ closes #9428, closes #9427)
+Files: src/os_mswin.c, src/testdir/test_fnamemodify.vim
+
+Patch 8.2.3940
+Problem: Match highlight disappears when doing incsearch for ":s/pat".
+Solution: Only use line limit for incsearch highlighting. (closes #9425)
+Files: src/match.c, src/testdir/test_match.vim,
+ src/testdir/dumps/Test_match_with_incsearch_1.dump,
+ src/testdir/dumps/Test_match_with_incsearch_2.dump
+
+Patch 8.2.3941
+Problem: SIGTSTP is not handled.
+Solution: Handle SIGTSTP like pressing CTRL-Z. (closes #9422)
+Files: runtime/doc/autocmd.txt, src/ex_docmd.c, src/os_unix.c,
+ src/proto/ex_docmd.pro, src/testdir/test_signals.vim
+
+Patch 8.2.3942
+Problem: Coverity reports a possible memory leak.
+Solution: Free the array if allocation fails.
+Files: src/insexpand.c
+
+Patch 8.2.3943
+Problem: Compiler warning from gcc for uninitialized variable.
+Solution: Initialize variable. (closes #9429)
+Files: src/diff.c
+
+Patch 8.2.3944
+Problem: Insert mode completion functions are too long.
+Solution: Split up into multiple functions. (Yegappan Lakshmanan,
+ closes #9431)
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.3945
+Problem: Vim9: partial variable argument types are wrong, leading to a
+ crash.
+Solution: When adjusting the argument count also adjust the argument types.
+ (closes #9433)
+Files: src/vim9type.c, src/userfunc.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3946
+Problem: When an internal error makes Vim exit the error is not seen.
+Solution: Add the error to the test output.
+Files: src/message.c, src/testdir/runtest.vim
+
+Patch 8.2.3947
+Problem: Unnecessary check for NULL pointer.
+Solution: Remove the check. (closes #9434)
+Files: src/ex_docmd.c
+
+Patch 8.2.3948
+Problem: Vim9: failure with partial with unknown argument count.
+Solution: Do not copy argument types if there aren't any.
+Files: src/vim9type.c
+
+Patch 8.2.3949
+Problem: Using freed memory with /\%V.
+Solution: Get the line again after getvvcol().
+Files: src/regexp.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.2.3950
+Problem: Going beyond the end of the line with /\%V.
+Solution: Check for valid column in getvcol().
+Files: src/charset.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.2.3951
+Problem: Vim9: memory leak when text after a nested function.
+Solution: Free the function if text is found after "enddef".
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3952
+Problem: First line not redrawn when adding lines to an empty buffer.
+Solution: Adjust the argument to appended_lines(). (closes #9439,
+ closes #9438)
+Files: src/ex_cmds.c, src/testdir/test_excmd.vim
+
+Patch 8.2.3953
+Problem: Insert completion code is too complicated.
+Solution: More refactoring. Move function arguments into a struct.
+ (Yegappan Lakshmanan, closes #9437)
+Files: src/insexpand.c
+
+Patch 8.2.3954
+Problem: Vim9: no error for shadowing if script var is declared later.
+Solution: Check argument names when compiling a function.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.3955
+Problem: Error messages are spread out.
+Solution: Move more errors to errors.h.
+Files: src/errors.h, src/globals.h, src/debugger.c, src/ex_cmds.c,
+ src/help.c, src/sign.c, src/spellfile.c
+
+Patch 8.2.3956
+Problem: Duplicate assignment.
+Solution: Remove the second assignment. (closes #9442)
+Files: src/evalfunc.c
+
+Patch 8.2.3957
+Problem: Error messages are spread out.
+Solution: Move more errors to errors.h.
+Files: src/errors.h, src/globals.h, src/arglist.c, src/bufwrite.c,
+ src/evalvars.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c,
+ src/help.c, src/scriptfile.c, src/usercmd.c, src/userfunc.c,
+ src/vim9cmds.c, src/vim9compile.c
+
+Patch 8.2.3958
+Problem: Build failure compiling xxd with "-std=c2x".
+Solution: define _XOPEN_SOURCE. (Yegappan Lakshmanan, closes #9444)
+Files: src/xxd/xxd.c
+
+Patch 8.2.3959
+Problem: Error messages are spread out.
+Solution: Move more errors to errors.h.
+Files: src/errors.h, src/autocmd.c, src/bufwrite.c, src/evalvars.c,
+ src/ex_docmd.c, src/ex_eval.c, src/ex_getln.c, src/fileio.c,
+ src/getchar.c, src/gui.c, src/locale.c, src/map.c
+
+Patch 8.2.3960
+Problem: Error messages are spread out.
+Solution: Move more errors to errors.h.
+Files: src/errors.h, src/alloc.c, src/arglist.c, src/autocmd.c,
+ src/blob.c, src/blowfish.c, src/buffer.c, src/bufwrite.c
+
+Patch 8.2.3961
+Problem: Error messages are spread out.
+Solution: Move more errors to errors.h.
+Files: src/errors.h, src/globals.h, src/arglist.c, src/autocmd.c,
+ src/blob.c, src/bufwrite.c, src/channel.c, src/clipboard.c,
+ src/cmdexpand.c, src/debugger.c, src/dict.c, src/eval.c,
+ src/evalfunc.c, src/evalvars.c, src/evalwindow.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/ex_eval.c, src/ex_getln.c, src/fileio.c,
+ src/filepath.c, src/gui_gtk_x11.c, src/gui_haiku.cc,
+ src/gui_photon.c, src/gui_w32.c, src/gui_x11.c, src/highlight.c,
+ src/indent.c, src/insexpand.c, src/job.c, src/json.c, src/list.c,
+ src/map.c, src/mark.c, src/match.c, src/mbyte.c, src/menu.c,
+ src/message.c, src/misc2.c, src/ops.c, src/option.c,
+ src/optionstr.c, src/popupwin.c, src/quickfix.c, src/screen.c,
+ src/scriptfile.c, src/search.c, src/sign.c, src/spell.c,
+ src/spellfile.c, src/strings.c, src/syntax.c, src/terminal.c,
+ src/testing.c, src/textprop.c, src/time.c, src/userfunc.c,
+ src/vim9cmds.c, src/vim9execute.c, src/vim9script.c, src/window.c
+
+Patch 8.2.3962 (after 8.2.3961)
+Problem: Build fails for missing error message.
+Solution: Add changes in missed file.
+Files: src/regexp_bt.c
+
+Patch 8.2.3963
+Problem: Build failure with tiny and small features. (Tony Mechelynck)
+Solution: Adjust #ifdefs.
+Files: src/errors.h, src/message.c
+
+Patch 8.2.3964
+Problem: Some common lisp and scheme files not recognized.
+Solution: Recognize *.asd as lisp and *.sld as scheme. (Alex Vear,
+ closes #9447)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3965
+Problem: Vim9: no easy way to check if Vim9 script is supported.
+Solution: Add has('vim9script').
+Files: runtime/doc/vim9.txt, src/evalfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.3966
+Problem: When using feedkeys() abbreviations may be blocked.
+Solution: Reset tb_no_abbr_cnt when running out of characters.
+ (closes #9448)
+Files: src/getchar.c, src/testdir/test_feedkeys.vim
+
+Patch 8.2.3967
+Problem: Error messages are spread out.
+Solution: Move more errors to errors.h.
+Files: src/errors.h, src/globals.h, src/feature.h, src/arglist.c,
+ src/autocmd.c, src/blob.c, src/bufwrite.c, src/channel.c,
+ src/cmdexpand.c, src/dict.c, src/diff.c, src/eval.c,
+ src/evalfunc.c, src/evalvars.c, src/ex_cmds.c, src/ex_docmd.c,
+ src/fileio.c, src/filepath.c, src/getchar.c, src/gui_gtk_x11.c,
+ src/gui_x11.c, src/hardcopy.c, src/help.c, src/highlight.c,
+ src/if_cscope.c, src/if_lua.c, src/if_mzsch.c, src/if_perl.xs,
+ src/if_python.c, src/if_python3.c, src/if_ruby.c, src/if_tcl.c,
+ src/if_xcmdsrv.c, src/indent.c, src/insexpand.c, src/job.c,
+ src/list.c, src/main.c, src/map.c, src/match.c, src/mbyte.c,
+ src/message.c, src/misc1.c, src/option.c, src/optionstr.c,
+ src/os_mswin.c, src/os_unix.c, src/os_win32.c, src/popupwin.c,
+ src/profiler.c, src/quickfix.c, src/scriptfile.c, src/search.c,
+ src/session.c, src/sign.c, src/spell.c, src/spellfile.c,
+ src/spellsuggest.c, src/syntax.c, src/tag.c, src/terminal.c,
+ src/testing.c, src/textprop.c, src/typval.c, src/userfunc.c,
+ src/vim9execute.c, src/vim9expr.c, src/vim9instr.c,
+ src/vim9script.c
+
+Patch 8.2.3968
+Problem: Build failure.
+Solution: Add missing changes.
+Files: src/strings.c, src/vim9compile.c
+
+Patch 8.2.3969
+Problem: Value of MAXCOL not available in Vim script.
+Solution: Add v:maxcol. (Naohiro Ono, closes #9451)
+Files: runtime/doc/builtin.txt, runtime/doc/eval.txt, src/evalvars.c,
+ src/testdir/test_cursor_func.vim, src/testdir/test_normal.vim,
+ src/testdir/test_put.vim, src/vim.h
+
+Patch 8.2.3970
+Problem: Error messages are spread out.
+Solution: Move more errors to errors.h.
+Files: src/errors.h, src/globals.h, src/buffer.c, src/bufwrite.c,
+ src/clientserver.c, src/cmdhist.c, src/dict.c, src/edit.c,
+ src/eval.c, src/evalfunc.c, src/evalvars.c, src/ex_cmds.c,
+ src/ex_docmd.c, src/ex_eval.c, src/ex_getln.c, src/gui_w32.c,
+ src/gui_x11.c, src/if_xcmdsrv.c, src/insexpand.c, src/json.c,
+ src/match.c, src/menu.c, src/option.c, src/optionstr.c,
+ src/os_mswin.c, src/quickfix.c, src/regexp_bt.c, src/regexp_nfa.c,
+ src/scriptfile.c, src/sign.c, src/spellfile.c, src/undo.c,
+ src/userfunc.c, src/vim9cmds.c, src/vim9compile.c,
+ src/vim9execute.c, src/vim9expr.c, src/window.c
+
+Patch 8.2.3971
+Problem: Build fails.
+Solution: Use the right error message name.
+Files: src/typval.c
+
+Patch 8.2.3972
+Problem: Error messages are spread out.
+Solution: Move the last errors from globals.h to errors.h.
+Files: src/errors.h, src/globals.h, src/eval.c, src/evalfunc.c,
+ src/evalvars.c, src/evalwindow.c, src/ex_eval.c, src/list.c,
+ src/match.c, src/menu.c, src/popupmenu.c, src/search.c,
+ src/vim9cmds.c, src/vim9expr.c
+
+Patch 8.2.3973
+Problem: Tiny build fails.
+Solution: Adjust #ifdefs
+Files: src/errors.h
+
+Patch 8.2.3974
+Problem: Vim9: LISTAPPEND instruction does not check for a locked list.
+Solution: Check whether the list is locked. (closes #9452)
+Files: src/vim9execute.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3975
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/clientserver.c, src/fileio.c, src/gui.c,
+ src/gui_beval.c, src/gui_w32.c, src/gui_x11.c, src/if_cscope.c,
+ src/if_xcmdsrv.c, src/os_mswin.c, src/sign.c, src/viminfo.c,
+ src/window.c
+
+Patch 8.2.3976
+Problem: FEARG_LAST is never used. (Dominique Pellé)
+Solution: Remove FEARG_LAST and the related code.
+Files: src/evalfunc.c
+
+Patch 8.2.3977
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/change.c, src/clientserver.c, src/eval.c,
+ src/gui_xim.c, src/if_cscope.c, src/if_py_both.h, src/if_python.c,
+ src/if_python3.c, src/if_ruby.c, src/if_tcl.c, src/main.c,
+ src/mark.c, src/match.c, src/memfile.c, src/memline.c,
+ src/terminal.c, src/textprop.c, src/userfunc.c
+
+Patch 8.2.3978
+Problem: Build error when using dynamically loaded Python 3.
+Solution: Adjust #ifdef.
+Files: src/errors.h
+
+Patch 8.2.3979
+Problem: Vim9: the feature is not mentioned in the right places.
+Solution: Add +vim9script to the help and :version output.
+Files: runtime/doc/builtin.txt, runtime/doc/various.txt, src/version.c
+
+Patch 8.2.3980
+Problem: If 'operatorfunc' invokes an operator the remembered Visual mode
+ may be changed. (Naohiro Ono)
+Solution: Save and restore the information for redoing the Visual area.
+ (closes #9455)
+Files: src/ops.c, src/testdir/test_normal.vim
+
+Patch 8.2.3981
+Problem: Vim9: debugging a for loop doesn't stop before it starts.
+Solution: Keep the DEBUG instruction before the expression is evaluated.
+ (closes #9456)
+Files: src/vim9cmds.c, src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3982
+Problem: Some lines of code not covered by tests.
+Solution: Add a few more test cases. (Dominique Pellé, closes #9453)
+Files: src/testdir/test_filter_map.vim, src/testdir/test_highlight.vim,
+ src/testdir/test_regexp_latin.vim, src/testdir/test_search.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3983
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/ex_docmd.c, src/fileio.c, src/filepath.c,
+ src/findfile.c, src/hardcopy.c, src/memfile.c, src/memline.c,
+ src/menu.c, src/normal.c, src/regexp_bt.c
+
+Patch 8.2.3984 (after 8.2.3981)
+Problem: Debugger test fails.
+Solution: Adjust the test for modified debugging of a for loop.
+Files: src/testdir/test_debugger.vim
+
+Patch 8.2.3985
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/findfile.c, src/fold.c, src/hardcopy.c,
+ src/highlight.c, src/map.c, src/message.c, src/normal.c,
+ src/option.c, src/os_amiga.c, src/os_unix.c, src/os_win32.c,
+ src/quickfix.c, src/regexp.c, src/register.c, src/search.c,
+ src/syntax.c, src/tag.c, src/term.c, src/typval.c, src/undo.c,
+ src/window.c
+
+Patch 8.2.3986
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/evalvars.c, src/ex_cmds.c, src/ex_docmd.c,
+ src/fileio.c, src/fold.c, src/gui_x11.c, src/hardcopy.c,
+ src/help.c, src/highlight.c, src/if_cscope.c, src/json.c,
+ src/map.c, src/netbeans.c, src/popupwin.c, src/usercmd.c,
+ src/userfunc.c
+
+Patch 8.2.3987
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/digraph.c, src/ex_eval.c, src/gui.c,
+ src/hardcopy.c, src/if_cscope.c, src/if_tcl.c, src/if_xcmdsrv.c,
+ src/mbyte.c, src/misc2.c, src/netbeans.c, src/option.c,
+ src/optionstr.c, src/quickfix.c, src/regexp.c, src/tag.c,
+ src/term.c, src/viminfo.c
+
+Patch 8.2.3988 (after 8.2.3987)
+Problem: Tiny build fails.
+Solution: Fix misplaced #ifdef.
+Files: src/errors.h
+
+Patch 8.2.3989
+Problem: Some insert completion code is not tested.
+Solution: Add a few tests. Refactor thesaurus completion. (Yegappan
+ Lakshmanan, closes #9460)
+Files: src/insexpand.c, src/testdir/test_edit.vim,
+ src/testdir/test_ins_complete.vim
+
+Patch 8.2.3990
+Problem: Testing wrong operator.
+Solution: Test "g@" instead of "r_". (Naohiro Ono, closes #9463)
+Files: src/testdir/test_normal.vim
+
+Patch 8.2.3991
+Problem: Vim9: error when extending dict<any> with another type that it was
+ initialized with.
+Solution: Also set the type for dict<any> if the initializer has a more
+ specific type. (closes #9461)
+Files: src/vim9compile.c, src/vim9type.c, src/vim9.h, src/eval.c,
+ src/list.c, src/vim9script.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.3992
+Problem: Wrong local-additions in the help with language mix.
+Solution: Adjust how the local additions list is generated. (Hirohito
+ Higashi, closes #9464)
+Files: src/help.c, src/testdir/test_help.vim
+
+Patch 8.2.3993
+Problem: When recording a change in Select mode the first typed character
+ appears twice.
+Solution: When putting the character back into typeahead remove it from
+ recorded characters. (closes #9462)
+Files: src/getchar.c, src/proto/getchar.pro, src/normal.c,
+ src/testdir/test_registers.vim
+
+Patch 8.2.3994
+Problem: Vim9: extend() complains about the type even when it was not
+ declared.
+Solution: Only check the list or dict type when it was declared.
+Files: src/list.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3995
+Problem: Not all sshconfig files are detected as such.
+Solution: Adjust the patterns used for sshconfig detection. (David Auer,
+ closes #9322)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.3996
+Problem: Vim9: type checking for list and dict lacks information about
+ declared type.
+Solution: Add dv_decl_type and lv_decl_type. Refactor the type stack to
+ store two types in each entry.
+Files: src/structs.h, src/dict.c, src/list.c, src/vim9type.c,
+ src/proto/vim9type.pro, src/vim9instr.c, src/proto/vim9instr.pro,
+ src/vim9compile.c, src/evalfunc.c, src/proto/evalfunc.pro,
+ src/evalbuffer.c, src/proto/evalbuffer.pro, src/vim9expr.c,
+ src/vim9cmds.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.3997
+Problem: Vim9: not enough testing for extend() and map().
+Solution: Add more test cases. Fix uncovered problems. Remove unused type
+ fields.
+Files: src/structs.h, src/dict.c, src/list.c, src/vim9compile.c,
+ src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.3998
+Problem: Asan error for adding zero to NULL.
+Solution: Do not compute pointer if there are no entries.
+Files: src/vim9type.c
+
+Patch 8.2.3999
+Problem: Redundant check for NUL byte.
+Solution: Remove the check for a NUL byte. (closes #9471)
+Files: src/ex_docmd.c
+
+Patch 8.2.4000
+Problem: Coverity warns for checking for NULL pointer after using it.
+Solution: Remove check for NULL.
+Files: src/help.c
+
+Patch 8.2.4001
+Problem: Insert complete code uses global variables.
+Solution: Make variables local to the file and use accessor functions.
+ (Yegappan Lakshmanan, closes #9470)
+Files: src/edit.c, src/getchar.c, src/globals.h, src/insexpand.c,
+ src/proto/insexpand.pro, src/search.c
+
+Patch 8.2.4002
+Problem: First char typed in Select mode can be wrong.
+Solution: Escape special bytes in the input buffer. (closes #9469)
+Files: src/getchar.c, src/testdir/test_utf8.vim
+
+Patch 8.2.4003
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/channel.c, src/ex_docmd.c, src/ex_eval.c,
+ src/gui_at_fs.c, src/hardcopy.c, src/if_cscope.c, src/menu.c,
+ src/netbeans.c, src/optionstr.c, src/os_mswin.c, src/sign.c,
+ src/typval.c
+
+Patch 8.2.4004
+Problem: Old compiler complains about struct init with variable.
+Solution: Set the struct member later. (John Marriott)
+Files: src/evalfunc.c
+
+Patch 8.2.4005
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/dict.c, src/eval.c, src/evalfunc.c,
+ src/evalvars.c, src/ex_cmds2.c, src/ex_docmd.c, src/ex_eval.c,
+ src/filepath.c, src/gui.c, src/gui_w32.c, src/hardcopy.c,
+ src/help.c, src/highlight.c, src/if_python.c, src/list.c,
+ src/misc1.c, src/normal.c, src/quickfix.c, src/regexp.c,
+ src/regexp_bt.c, src/regexp_nfa.c, src/typval.c, src/userfunc.c
+
+Patch 8.2.4006
+Problem: Vim9: crash when declaring variable on the command line.
+Solution: Use a temporary type list. (closes #9474)
+Files: src/eval.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4007
+Problem: Session does not restore help buffer properly when "options' is
+ missing from 'sessionoptions'.
+Solution: Use a ":help" command to create the help window. (closes #9475,
+ closes #9458, closes #9472)
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.4008
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/diff.c, src/digraph.c, src/evalfunc.c,
+ src/evalvars.c, src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c,
+ src/insexpand.c, src/match.c, src/memline.c, src/menu.c,
+ src/ops.c, src/profiler.c, src/quickfix.c, src/regexp.c,
+ src/regexp_bt.c, src/regexp_nfa.c, src/register.c, src/spell.c,
+ src/spell.h, src/spellfile.c, src/strings.c, src/syntax.c,
+ src/typval.c, src/undo.c, src/userfunc.c
+
+Patch 8.2.4009
+Problem: Reading one byte beyond the end of the line.
+Solution: Check for NUL byte first.
+Files: src/vim9compile.c, src/ex_docmd.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4010
+Problem: Error messages are spread out.
+Solution: Move more error messages to errors.h.
+Files: src/errors.h, src/crypt.c, src/diff.c, src/ex_docmd.c,
+ src/ex_getln.c, src/fileio.c, src/findfile.c, src/float.c,
+ src/gui.c, src/highlight.c, src/if_mzsch.c, src/if_py_both.h,
+ src/if_python.c, src/if_python3.c, src/insexpand.c, src/match.c,
+ src/memline.c, src/option.c, src/popupwin.c, src/regexp.c,
+ src/regexp_nfa.c, src/spellfile.c, src/strings.c, src/syntax.c,
+ src/textprop.c, src/typval.c, src/undo.c, src/usercmd.c,
+ src/userfunc.c, src/window.c
+
+Patch 8.2.4011
+Problem: Test fails because of changed error number.
+Solution: Restore old duplicate error message.
+Files: src/errors.h, src/match.c
+
+Patch 8.2.4012
+Problem: Error messages are spread out.
+Solution: Move the last error messages to errors.h.
+Files: src/errors.h, src/channel.c, src/clientserver.c, src/diff.c,
+ src/evalfunc.c, src/evalvars.c, src/ex_cmds2.c, src/ex_docmd.c,
+ src/gui_w32.c, src/help.c, src/if_mzsch.c, src/if_py_both.h,
+ src/if_python.c, src/job.c, src/json.c, src/list.c, src/option.c,
+ src/optionstr.c, src/quickfix.c, src/regexp.c, src/regexp_nfa.c,
+ src/register.c, src/scriptfile.c, src/sign.c, src/syntax.c,
+ src/tag.c, src/terminal.c, src/textprop.c, src/typval.c,
+ src/undo.c, src/userfunc.c, src/vim9compile.c, src/viminfo.c
+
+Patch 8.2.4013
+Problem: Build failure without the spell feature.
+Solution: Adjust #ifdefs.
+Files: src/errors.h
+
+Patch 8.2.4014
+Problem: Git and gitcommit file types not properly recognized.
+Solution: Adjust filetype detection. (Tim Pope, closes #9477)
+Files: runtime/filetype.vim, runtime/scripts.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.4015
+Problem: Build failure with tiny features. (Tony Mechelynck)
+Solution: Adjust #ifdefs.
+Files: src/errors.h
+
+Patch 8.2.4016
+Problem: Vim9: incorrect error for argument that is shadowing var.
+Solution: Ignore variable that is not in block where the function was
+ defined.
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4017
+Problem: Gcc warns for misleading indent in Athena menu code.
+Solution: Add curlies around the two statements. (Dominique Pellé,
+ closes #9480)
+Files: src/gui_athena.c
+
+Patch 8.2.4018
+Problem: ml_get error when win_execute redraws with Visual selection.
+Solution: Disable Visual area temporarily. (closes #9479)
+Files: src/evalwindow.c, src/proto/evalwindow.pro, src/structs.h,
+ src/evalbuffer.c, src/proto/evalbuffer.pro, src/evalvars.c,
+ src/if_py_both.h, src/evalfunc.c,
+ src/testdir/test_execute_func.vim
+
+Patch 8.2.4019
+Problem: Vim9: import mechanism is too complicated.
+Solution: Do not use the Javascript mechanism but a much simpler one.
+Files: runtime/doc/vim9.txt, src/vim9script.c, src/proto/vim9script.pro,
+ src/errors.h, src/structs.h, src/eval.c, src/proto/eval.pro,
+ src/evalvars.c, src/proto/evalvars.pro, src/userfunc.c,
+ src/vim9expr.c, src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4020 (after 8.2.4019)
+Problem: Debugger test fails.
+Solution: Fix import statement.
+Files: src/testdir/test_debugger.vim
+
+Patch 8.2.4021 (after 8.2.4019)
+Problem: Missing part of the :import changes.
+Solution: Add changes in vim9cmds.c.
+Files: src/vim9cmds.c
+
+Patch 8.2.4022
+Problem: Two error messages in the wrong file.
+Solution: Use the error message from errors.h.
+Files: src/popupwin.c, src/usercmd.c
+
+Patch 8.2.4023
+Problem: Using uninitialized variable.
+Solution: Initialize "ufunc" also when an item is not exported.
+Files: src/vim9script.c
+
+Patch 8.2.4024
+Problem: Confusing error message if imported name is used directly.
+Solution: Give a better error message.
+Files: src/eval.c, src/proto/eval.pro, src/evalvars.c, src/userfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.4025
+Problem: Error for import not ending in .vim does not work for .vimrc.
+Solution: Check that .vim is the end. (closes #9484)
+Files: src/vim9script.c, src/errors.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4026
+Problem: ml_get error with specific win_execute() command. (Sean Dewar)
+Solution: Check cursor and Visual area are OK.
+Files: src/evalwindow.c, src/testdir/test_execute_func.vim
+
+Patch 8.2.4027
+Problem: Import test fails on MS-Windows.
+Solution: Use a different directory name.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.4028
+Problem: ml_get error with :doautoall and Visual area. (Sean Dewar)
+Solution: Disable Visual mode while executing autocommands.
+Files: src/structs.h, src/autocmd.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.4029
+Problem: Debugging NFA regexp my crash, cached indent may be wrong.
+Solution: Fix some debug warnings in the NFA regexp code. Make sure log_fd
+ is set when used. Fix breakindent and indent caching. (Christian
+ Brabandt, closes #9482)
+Files: src/indent.c, src/optionstr.c, src/regexp_nfa.c
+
+Patch 8.2.4030
+Problem: A script local funcref is not found from a mapping.
+Solution: When looking for a function, also find a script-local funcref.
+ (closes #9485)
+Files: src/evalvars.c, src/proto/evalvars.pro, src/userfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.4031
+Problem: Crash in xterm with only two lines. (Dominique Pellé)
+Solution: Only perform xterm compatibility test if possible. (closes #9488)
+Files: src/term.c, src/testdir/test_startup.vim
+
+Patch 8.2.4032
+Problem: ATTRIBUTE_NORETURN is not needed.
+Solution: Use NORETURN(). (Ozaki Kiichi, closes #9487)
+Files: src/if_ruby.c, src/vim.h
+
+Patch 8.2.4033
+Problem: Running filetype tests leaves directory behind.
+Solution: Delete the top directory. (closes #9483)
+Files: src/testdir/test_filetype.vim
+
+Patch 8.2.4034
+Problem: Coverity warns for possibly using a NULL pointer.
+Solution: Check v_partial is not NULL.
+Files: src/vim9type.c
+
+Patch 8.2.4035
+Problem: Timer triggered at the debug prompt may cause trouble.
+Solution: Do not trigger any timer at the debug prompt. (closes #9481)
+Files: src/time.c
+
+Patch 8.2.4036
+Problem: Vim9: script test file is getting too long.
+Solution: Split the import/export functionality to a separate file.
+Files: src/testdir/test_vim9_script.vim, src/testdir/test_vim9_import.vim,
+ src/testdir/Make_all.mak
+
+Patch 8.2.4037
+Problem: Insert mode completion is insufficiently tested.
+Solution: Add more tests. Fix uncovered memory leak. (Yegappan Lakshmanan,
+ closes #9489)
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.4038
+Problem: Various code not used when features are disabled.
+Solution: Add #ifdefs. (Dominique Pellé, closes #9491)
+Files: src/alloc.c, src/buffer.c, src/charset.c, src/clipboard.c,
+ src/cmdhist.c, src/crypt.c, src/edit.c, src/eval.c,
+ src/evalbuffer.c, src/evalfunc.c, src/ex_docmd.c, src/globals.h,
+ src/gui_xim.c, src/hashtab.c, src/highlight.c, src/insexpand.c,
+ src/main.c, src/mark.c, src/message.c, src/misc1.c, src/misc2.c,
+ src/ops.c, src/option.c, src/option.h, src/optionstr.c,
+ src/register.c, src/scriptfile.c, src/tag.c, src/term.c,
+ src/typval.c, src/usercmd.c, src/userfunc.c, src/vim9script.c,
+ src/vim9type.c
+
+Patch 8.2.4039
+Problem: The xdiff library is linked in even when not used.
+Solution: Use configure to decide whether xdiff object files are included.
+Files: src/Makefile, src/config.mk.in, src/configure.ac,
+ src/auto/configure, src/feature.h
+
+Patch 8.2.4040
+Problem: Keeping track of allocated lines in user functions is too
+ complicated.
+Solution: Instead of freeing individual lines keep them all until the end.
+Files: src/alloc.c, src/proto/alloc.pro, src/vim9compile.c,
+ src/userfunc.c, src/proto/userfunc.pro, src/message.c,
+ src/usercmd.c, src/viminfo.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4041
+Problem: Using uninitialized pointer.
+Solution: Store "ht" when variable is in another script.
+Files: src/evalvars.c
+
+Patch 8.2.4042
+Problem: Vim9: build error.
+Solution: Use grow array instead of character pointer.
+Files: src/vim9execute.c
+
+Patch 8.2.4043
+Problem: Using int for second argument of ga_init2().
+Solution: Remove unnecessary type cast (int) when using sizeof().
+Files: src/arglist.c, src/channel.c, src/cmdexpand.c, src/dict.c,
+ src/digraph.c, src/eval.c, src/evalfunc.c, src/evalvars.c,
+ src/evalwindow.c, src/ex_docmd.c, src/fileio.c, src/filepath.c,
+ src/findfile.c, src/fold.c, src/hardcopy.c, src/help.c,
+ src/job.c, src/list.c, src/menu.c, src/os_win32.c, src/register.c,
+ src/scriptfile.c, src/spellfile.c, src/spellsuggest.c,
+ src/strings.c, src/syntax.c, src/tag.c, src/terminal.c,
+ src/undo.c, src/usercmd.c, src/userfunc.c, src/vim9execute.c,
+ src/viminfo.c, src/window.c, src/if_py_both.h
+
+Patch 8.2.4044
+Problem: Vim9: no error when importing the same script twice.
+Solution: Give an error, unless it is a reload.
+Files: src/vim9script.c, src/errors.h, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4045
+Problem: Some global functions are only used in one file.
+Solution: Make the functions static. (Yegappan Lakshmanan, closes #9492)
+Files: src/ex_getln.c, src/highlight.c, src/proto/ex_getln.pro,
+ src/proto/highlight.pro, src/proto/vim9compile.pro,
+ src/proto/vim9instr.pro, src/proto/window.pro, src/vim9compile.c,
+ src/vim9instr.c, src/window.c
+
+Patch 8.2.4046
+Problem: Some error messages not in the right place.
+Solution: Adjust the errors file. Fix typo.
+Files: src/errors.h, src/regexp_bt.c, src/typval.c,
+
+Patch 8.2.4047
+Problem: Depending on the build features error messages are unused.
+Solution: Add #ifdefs. (Dominique Pellé, closes #9493)
+Files: src/errors.h
+
+Patch 8.2.4048
+Problem: gcc complains about use of "%p" in printf.
+Solution: Add (void *) typecast. (Dominique Pellé, closes #9494)
+Files: src/if_py_both.h
+
+Patch 8.2.4049
+Problem: Vim9: reading before the start of the line with "$" by itself.
+Solution: Do not subtract one when reporting the error.
+Files: src/vim9expr.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4050
+Problem: Vim9: need to prefix every item in an autoload script.
+Solution: First step in supporting "vim9script autoload" and "import
+ autoload".
+Files: runtime/doc/repeat.txt, runtime/doc/vim9.txt, src/structs.h,
+ src/errors.h, src/vim9script.c, src/scriptfile.c,
+ src/proto/scriptfile.pro, src/userfunc.c, src/eval.c,
+ src/evalvars.c, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/vim9expr.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4051
+Problem: Compiler complains about possibly uninitialized variable.
+Solution: Add code to avoid a compiler warning. (John Marriott)
+Files: src/scriptfile.c
+
+Patch 8.2.4052
+Problem: Not easy to resize a window from a plugin.
+Solution: Add win_move_separator() and win_move_statusline() functions.
+ (Daniel Steinberg, closes #9486)
+Files: runtime/doc/builtin.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/evalwindow.c, src/proto/evalwindow.pro,
+ src/testdir/test_window_cmd.vim
+
+Patch 8.2.4053
+Problem: Vim9: autoload mechanism doesn't fully work yet.
+Solution: Define functions and variables with their autoload name, add the
+ prefix when calling a function, find the variable in the table of
+ script variables.
+Files: src/structs.h, src/scriptfile.c, src/proto/scriptfile.pro,
+ src/vim9script.c, src/proto/vim9script.pro, src/userfunc.c,
+ src/evalvars.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4054 (after 8.2.4053)
+Problem: Vim9 script test fails.
+Solution: Add missing change.
+Files: src/vim9compile.c
+
+Patch 8.2.4055
+Problem: Vim9: line break in expression causes v:errmsg to be filled.
+ (Yegappan Lakshmanan)
+Solution: Do not give an error when skipping over an expression.
+Files: src/userfunc.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4056
+Problem: Vim9: memory leak when exporting function in autoload script.
+Solution: Free the name if replacing it.
+Files: src/scriptfile.c
+
+Patch 8.2.4057
+Problem: Vim9: not fully implementing the autoload mechanism.
+Solution: Allow for exporting a legacy function. Improve test coverage.
+Files: src/vim9script.c, src/testdir/test_vim9_import.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.4058
+Problem: Vim9: import test failure in wrong line.
+Solution: Adjust line number.
+Files: src/testdir/test_vim9_import.vim
+
+Patch 8.2.4059
+Problem: Vim9: an expression of a map cannot access script-local items.
+ (Maxim Kim)
+Solution: Use the script ID of where the map was defined.
+Files: src/getchar.c, src/map.c, src/proto/map.pro,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4060
+Problem: win_execute() is slow on systems where getcwd() or chdir() is
+ slow. (Rick Howe)
+Solution: Avoid using getcwd() and chdir() if no local directory is used and
+ 'acd' is not set. (closes #9504)
+Files: src/evalwindow.c
+
+Patch 8.2.4061
+Problem: Codecov bash script is deprecated.
+Solution: Use the codecov action. (Ozaki Kiichi, closes #9505)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4062
+Problem: Match highlighting of tab too short.
+Solution: Do not stop match highlighting if on a Tab. (Christian Brabandt,
+ closes #9507, closes #9500)
+Files: src/drawline.c, src/testdir/test_match.vim,
+ src/testdir/dumps/Test_match_tab_linebreak.dump
+
+Patch 8.2.4063
+Problem: Vim9: exported function in autoload script not found. (Yegappan
+ Lakshmanan)
+Solution: Use the autoload prefix to search for the function.
+Files: src/userfunc.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4064
+Problem: Foam files are not detected.
+Solution: Detect the foam filetype by the path and file contents. (Mohammed
+ Elwardi Fadeli, closes #9501)
+Files: runtime/filetype.vim, runtime/autoload/dist/ft.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.4065
+Problem: Computation overflow with large count for :yank.
+Solution: Avoid an overflow.
+Files: src/ex_docmd.c, src/testdir/test_excmd.vim
+
+Patch 8.2.4066
+Problem: Vim9: imported autoload script loaded again.
+Solution: Do not create a new imported_T every time.
+Files: src/vim9script.c, src/vim9compile.c,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4067
+Problem: Vim9: cannot call imported function with :call. (Drew Vogel)
+Solution: Translate the function name. (closes #9510)
+Files: src/userfunc.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4068 (after 8.2.4066)
+Problem: Vim9: import test fails.
+Solution: Add missing change.
+Files: src/scriptfile.c
+
+Patch 8.2.4069
+Problem: Vim9: import test fails on MS-Windows.
+Solution: Ignore case. Adjust test to avoid name that only differs in case.
+Files: src/eval.c, src/scriptfile.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4070
+Problem: Using uninitialized memory when reading empty file.
+Solution: Check for empty file before checking for NL. (Dominique Pellé,
+ closes #9511)
+Files: src/filepath.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.2.4071
+Problem: Vim9: no detection of return in try/endtry. (Dominique Pellé)
+Solution: Check if any of the blocks inside try/endtry did not end in
+ return.
+Files: src/vim9.h, src/vim9compile.c, src/vim9cmds.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.4072
+Problem: Vim9: compiling function fails when autoload script is not loaded
+ yet.
+Solution: Depend on runtime loading.
+Files: src/vim9expr.c, src/vim9script.c, src/vim9instr.c,
+ src/vim9execute.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4073
+Problem: Coverity warns for using NULL pointer.
+Solution: Bail out when running out of memory. Check for running over end of
+ a string.
+Files: src/userfunc.c,
+
+Patch 8.2.4074
+Problem: Going over the end of NameBuff.
+Solution: Check length when appending a space.
+Files: src/drawscreen.c, src/testdir/test_edit.vim
+
+Patch 8.2.4075 (after 8.2.4073)
+Problem: Test failures.
+Solution: Change check for NULL pointer.
+Files: src/userfunc.c
+
+Patch 8.2.4076
+Problem: Memory leak in autoload import.
+Solution: Do not overwrite the autoload prefix.
+Files: src/vim9script.c
+
+Patch 8.2.4077
+Problem: Not all Libsensors files are recognized.
+Solution: Add "sensors.d/*" pattern. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4078
+Problem: Terminal test for current directory not used on FreeBSD.
+Solution: Make it work on FreeBSD. (Ozaki Kiichi, closes #9516) Add
+ TermWait() inside Run_shell_in_terminal() as a generic solution.
+Files: src/testdir/test_terminal3.vim, src/testdir/term_util.vim,
+ src/testdir/test_terminal.vim, src/testdir/test_terminal2.vim,
+ src/testdir/test_mapping.vim
+
+Patch 8.2.4079
+Problem: MS-Windows: "gvim --version" didn't work when build with VIMDLL.
+Solution: Adjust #ifdef. (Ken Takata, closes #9517)
+Files: src/main.c
+
+Patch 8.2.4080
+Problem: Not sufficient test coverage for xxd.
+Solution: Add a few more test cases. (Erki Auerswald, closes #9515)
+Files: src/testdir/test_xxd.vim
+
+Patch 8.2.4081
+Problem: CodeQL reports problem in if_cscope causing it to fail.
+Solution: Use execvp() instead of execl(). Merge the header file into the
+ source file. (Ozaki Kiichi, closes #9519)
+Files: Filelist, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/Make_vms.mms, src/Makefile, src/if_cscope.c, src/if_cscope.h,
+ src/testdir/test_cscope.vim
+
+Patch 8.2.4082
+Problem: Check for autoload file name and prefix fails. (Christian J.
+ Robinson)
+Solution: Only lower case the prefix on systems where the file name is not
+ case sensitive.
+Files: src/scriptfile.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4083
+Problem: Vim9: no test for "vim9script autoload" and using script variable
+ in the same script.
+Solution: Add a simple test. Fix uncovered problem.
+Files: src/evalvars.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4084
+Problem: Memory leak when looking for autoload prefixed variable.
+Solution: Free the concatenated string.
+Files: src/evalvars.c
+
+Patch 8.2.4085
+Problem: Vim9: no test for using import in legacy script.
+Solution: Add a test.
+Files: src/testdir/test_vim9_import.vim
+
+Patch 8.2.4086
+Problem: "cctx" argument of find_func_even_dead() is unused.
+Solution: Remove the argument.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/vim9compile.c,
+ src/vim9instr.c, src/evalfunc.c, src/evalvars.c, src/testing.c,
+ src/vim9execute.c, src/vim9expr.c, src/vim9script.c,
+ src/vim9type.c
+
+Patch 8.2.4087
+Problem: Cannot test items from an autoload script easily.
+Solution: Add the "autoload" value for test_override().
+Files: runtime/doc/testing.txt, src/testing.c, src/globals.h,
+ src/vim9script.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4088
+Problem: Xxd cannot output everything in one line.
+Solution: Make zero columns mean infinite columns. (Erik Auerswald,
+ closes #9524)
+Files: runtime/doc/xxd.1, runtime/doc/xxd.man, src/testdir/test_xxd.vim,
+ src/xxd/xxd.c
+
+Patch 8.2.4089 (after 8.2.4078)
+Problem: Terminal test for current directory fails on FreeBSD.
+Solution: Skip the test.
+Files: src/testdir/test_terminal3.vim
+
+Patch 8.2.4090
+Problem: After restoring a session buffer order can be quite different.
+Solution: Create buffers first. (Evgeni Chasnovski, closes #9520)
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.4091
+Problem: Virtcol is recomputed for statusline unnecessarily.
+Solution: Just use "w_virtcol". (closes #9523)
+Files: src/buffer.c, src/testdir/test_statusline.vim
+
+Patch 8.2.4092
+Problem: macOS CI: unnecessarily doing "Install packages".
+Solution: Only do "Install packages" for huge build. (Ozaki Kiichi,
+ closes #9521)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4093
+Problem: Cached breakindent values not initialized properly.
+Solution: Initialize and cache formatlistpat. (Christian Brabandt,
+ closes #9526, closes #9512)
+Files: runtime/doc/options.txt, src/indent.c, src/option.c,
+ src/proto/option.pro, src/testdir/test_breakindent.vim
+
+Patch 8.2.4094
+Problem: 'virtualedit' is window-local but using buffer-local enum.
+Solution: Use window-local enum. (closes #9529)
+Files: src/option.h, src/optiondefs.h
+
+Patch 8.2.4095
+Problem: Sed script not recognized by the first line.
+Solution: Recognize a sed script starting with "#n". (Doug Kearns)
+Files: runtime/scripts.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4096
+Problem: Linux CI: unnecessarily installing packages
+Solution: Only install packages for huge build. (Ozaki Kiichi,
+ closes #9530)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4097
+Problem: Wrong number in error message on 32 bit system. (John Paul Adrian
+ Glaubitz)
+Solution: Add type cast. (closes #9527)
+Files: src/vim9compile.c
+
+Patch 8.2.4098
+Problem: Typing "interrupt" at debug prompt may keep exception around,
+ causing function calls to fail.
+Solution: Discard any exception at the toplevel. (closes #9532)
+Files: src/main.c
+
+Patch 8.2.4099
+Problem: Vim9: cannot use Vim9 syntax in mapping.
+Solution: Add <ScriptCmd> to use the script context for a command.
+Files: runtime/doc/map.txt, src/normal.c, src/getchar.c,
+ src/proto/getchar.pro, src/ex_getln.c, src/edit.c, src/terminal.c,
+ src/keymap.h, src/insexpand.c, src/misc2.c, src/ops.c,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4100
+Problem: Early return when getting the 'formatlistpat' value.
+Solution: Remove the first line. (Christian Brabandt)
+Files: src/option.c, src/testdir/test_breakindent.vim
+
+Patch 8.2.4101
+Problem: Warning for unused argument in tiny version.
+Solution: Add "UNUSED".
+Files: src/getchar.c
+
+Patch 8.2.4102
+Problem: Vim9: import cannot be used after method.
+Solution: Recognize an imported function name. (closes #9496)
+Files: src/eval.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4103
+Problem: Vim9: variable declared in for loop not initialized.
+Solution: Always initialize the variable. (closes #9535)
+Files: src/vim9instr.c, src/proto/vim9instr.pro, src/vim9compile.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4104
+Problem: Vim9: lower casing the autoload prefix causes problems.
+Solution: Always store the prefix with case preserved.
+Files: src/scriptfile.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4105
+Problem: Translation related comment in the wrong place.
+Solution: Move it back with the text. (Ken Takata, closes #9537)
+Files: src/errors.h, src/ex_docmd.c
+
+Patch 8.2.4106
+Problem: Going over the end of the w_lines array.
+Solution: Break out of the loop when "idx" is too big. (issue #9540)
+Files: src/drawscreen.c
+
+Patch 8.2.4107
+Problem: Script context not restored after using <ScriptCmd>.
+Solution: Also restore context when not in a script. (closes #9536)
+ Add the 'c' flag to feedkeys() to be able to test this.
+Files: runtime/doc/builtin.txt, src/getchar.c, src/evalfunc.c,
+ src/testdir/test_mapping.vim
+
+Patch 8.2.4108
+Problem: Going over the end of the w_lines array.
+Solution: Check not going over the end and limit to Rows. (issue #9540)
+Files: src/drawscreen.c
+
+Patch 8.2.4109
+Problem: MS-Windows: high dpi support is outdated.
+Solution: Improve High DPI support by using PerMonitorV2. (Ken Takata
+ closes #9525, closes #3102)
+Files: src/gui.c, src/gui.h, src/gui_w32.c, src/vim.manifest
+
+Patch 8.2.4110
+Problem: Coverity warns for using NULL pointer.
+Solution: Check "evalarg" is not NULL. Skip errors when "verbose" is false.
+Files: src/eval.c
+
+Patch 8.2.4111
+Problem: Potential problem when map is deleted while executing.
+Solution: Reset last used map pointer when deleting a mapping.
+Files: src/map.c
+
+Patch 8.2.4112
+Problem: Function not deleted at end of test.
+Solution: Delete the function.
+Files: src/testdir/test_diffmode.vim
+
+Patch 8.2.4113
+Problem: Typo on DOCMD_RANGEOK results in not recognizing command.
+Solution: Correct the typo. (closes #9539)
+Files: src/vim.h, src/testdir/test_mapping.vim
+
+Patch 8.2.4114
+Problem: Vim9: type checking for a funcref does not work for when it is
+ used in a method.
+Solution: Pass the base to where the type is checked.
+Files: src/vim9type.c, src/proto/vim9type.pro, src/userfunc.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4115
+Problem: Cannot use a method with a complex expression.
+Solution: Evaluate the expression after "->" and use the result.
+Files: src/eval.c, src/errors.h, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4116
+Problem: Vim9: cannot use a method with a complex expression in a :def
+ function.
+Solution: Implement compiling the expression.
+Files: src/vim9expr.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4117
+Problem: Vim9: wrong white space error after using imported item.
+Solution: Don't skip over white space. (closes #9544)
+Files: src/eval.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4118
+Problem: Using UNUSED for argument that is used.
+Solution: Remove UNUSED.
+Files: src/usercmd.c
+
+Patch 8.2.4119
+Problem: Build failure when disabling the channel feature.
+Solution: Adjust #ifdef. (Dominique Pellé, closes #9545)
+Files: src/misc2.c
+
+Patch 8.2.4120
+Problem: Block insert goes over the end of the line.
+Solution: Handle invalid byte better. Fix inserting the wrong text.
+Files: src/ops.c, src/testdir/test_visual.vim
+
+Patch 8.2.4121
+Problem: Visual test fails on MS-Windows.
+Solution: Set 'isprint' so that the character used is not printable.
+Files: src/testdir/test_visual.vim
+
+Patch 8.2.4122
+Problem: ":command Cmd" does not show custom completion argument.
+Solution: Show the completion argument when using ":verbose".
+Files: src/usercmd.c, src/testdir/test_usercommands.vim
+
+Patch 8.2.4123
+Problem: Complete function cannot be import.Name.
+Solution: Dereference the function name if needed. Also: do not see
+ "import.Name" as a builtin function. (closes #9541)
+Files: src/userfunc.c, src/eval.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4124
+Problem: Vim9: method in compiled function may not see script item.
+Solution: Make sure not to skip to the next line. (closes #9496)
+Files: src/vim9expr.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4125
+Problem: Completion tests fail.
+Solution: Disable error messages while dereferencing the function name.
+Files: src/eval.c
+
+Patch 8.2.4126
+Problem: Crash on exit when built with dynamic Tcl and EXITFREE is defined.
+ (Dominique Pellé)
+Solution: Only call Tcl_Finalize() when initialized. (closes #9546)
+Files: src/if_tcl.c
+
+Patch 8.2.4127
+Problem: Build failure without the +eval feature.
+Solution: Add #ifdef.
+Files: src/usercmd.c
+
+Patch 8.2.4128
+Problem: Crash when method cannot be found. (Christian J. Robinson)
+Solution: Don't mix up pointer names.
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4129
+Problem: Building with +sound but without +eval fails. (Dominique Pellé)
+Solution: Disable canberra in tiny and small build. (closes #9548)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.4130
+Problem: MS-Windows: MSVC build may have libraries duplicated.
+Solution: Improve the MSVC Makefile. (Ken Takata, closes #9547)
+Files: src/Make_mvc.mak
+
+Patch 8.2.4131
+Problem: Vim9: calling function in autoload import does not work in a :def
+ function.
+Solution: When a variable is not found and a PCALL follows use a funcref.
+ (closes #9550)
+Files: src/vim9execute.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4132
+Problem: Vim9: wrong error message when autoload script can't be found.
+Solution: Correct check for using autoload with wrong name.
+Files: src/vim9script.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4133
+Problem: output of ":scriptnames" goes into the message history, while this
+ does not happen for other commands, such as ":ls".
+Solution: Use msg_outtrans() instead of smsg(). (closes #9551)
+Files: src/scriptfile.c, src/testdir/test_scriptnames.vim
+
+Patch 8.2.4134
+Problem: MS-Windows: test for import with absolute path fails.
+Solution: Handle path starting with slash as an absolute path.
+Files: src/vim9script.c
+
+Patch 8.2.4135
+Problem: Vim9: ":scriptnames" shows unloaded imported autoload script.
+Solution: Mark the unloaded script with "A". (closes #9552)
+Files: runtime/doc/repeat.txt, src/scriptfile.c,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4136
+Problem: Vim9: the "autoload" argument of ":vim9script" is not useful.
+Solution: Remove the argument. (closes #9555)
+Files: runtime/doc/vim9.txt, runtime/doc/repeat.txt, src/vim9script.c,
+ src/errors.h, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4137
+Problem: Vim9: calling import with and without method is inconsistent.
+Solution: Set a flag that a parenthesis follows to compile_load_scriptvar().
+ Add some more tests. Improve error message.
+Files: src/vim9expr.c, src/vim9execute.c, src/vim9script.c,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4138
+Problem: Vim9: no error for return with argument when the function does not
+ return anything.
+Solution: Give an error for the invalid argument. (issue #9497)
+Files: src/vim9cmds.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4139
+Problem: Using freed memory if an expression abbreviation deletes the
+ abbreviation.
+Solution: Do not access the pointer after evaluating the expression.
+Files: src/map.c, src/testdir/test_mapping.vim
+
+Patch 8.2.4140
+Problem: maparg() does not indicate the type of script where it was defined.
+Solution: Add "scriptversion".
+Files: runtime/doc/builtin.txt, src/map.c, src/testdir/test_maparg.vim
+
+Patch 8.2.4141 (after 8.2.4140)
+Problem: Vim9 builtin functions test fails.
+Solution: Add "scriptversion" item to maparg() result.
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4142
+Problem: Build failure with normal features without persistent undo.
+Solution: Adjust #ifdef. (closes #9557)
+Files: src/fileio.c
+
+Patch 8.2.4143
+Problem: MS-Windows: IME support for Win9x is obsolete.
+Solution: Remove the Win9x code. (Ken Takata, closes #9559)
+Files: src/gui_w32.c
+
+Patch 8.2.4144
+Problem: Cannot load libsodium dynamically.
+Solution: Support dynamic loading on MS-Windows. (Ken Takata, closes #9554)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak, src/buffer.c,
+ src/crypt.c, src/memline.c, src/proto/crypt.pro
+
+Patch 8.2.4145
+Problem: Confusing error when using name of import for a function.
+Solution: Pass a flag to trans_function_name().
+Files: src/vim.h, src/userfunc.c, src/proto/userfunc.pro, src/eval.c,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4146
+Problem: Vim9: shadowed function can be used in compiled function but not
+ at script level.
+Solution: Also give an error in a compiled function. (closes #9563)
+Files: src/vim9expr.c
+
+Patch 8.2.4147
+Problem: E464 does not always include the offending command.
+Solution: Add another error message with "%s". (closes #9564)
+Files: src/errors.h, src/vim9compile.c, src/ex_docmd.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.4148
+Problem: Deleting any mapping may cause <ScriptCmd> to not set the script
+ context.
+Solution: Only reset last_used_map if it is the deleted mapping.
+ (closes #9568)
+Files: src/map.c, src/getchar.c, src/proto/getchar.pro,
+ src/testdir/test_mapping.vim
+
+Patch 8.2.4149
+Problem: Test override not restored, autocommand left behind.
+Solution: Correct restoring test override. Delete autocommand afterwards.
+Files: src/testdir/test_autocmd.vim, src/testdir/test_mapping.vim
+
+Patch 8.2.4150
+Problem: Coverity warns for using pointer after free.
+Solution: Swap statements, even though using the pointer is no problem.
+Files: src/map.c
+
+Patch 8.2.4151
+Problem: Reading beyond the end of a line.
+Solution: For block insert only use the offset for correcting the length.
+Files: src/ops.c, src/testdir/test_visual.vim
+
+Patch 8.2.4152
+Problem: Block insert with double wide character fails.
+Solution: Adjust the expected output.
+Files: src/testdir/test_utf8.vim
+
+Patch 8.2.4153
+Problem: MS-Windows: Global IME is no longer supported.
+Solution: Remove the Global IME implementation. (Ken Takata, closes #9562)
+Files: Filelist, runtime/doc/mbyte.txt, src/Make_mvc.mak, src/dimm.idl,
+ src/glbl_ime.cpp, src/glbl_ime.h, src/gui_w32.c, src/vim.h
+
+Patch 8.2.4154
+Problem: ml_get error when exchanging windows in Visual mode.
+Solution: Correct end of Visual area when entering another buffer.
+Files: src/window.c, src/testdir/test_visual.vim
+
+Patch 8.2.4155
+Problem: Translating strftime() argument results in check error.
+Solution: Add gettext comment.
+Files: src/time.c
+
+Patch 8.2.4156
+Problem: Fileinfo message overwrites echo'ed message.
+Solution: Reset need_fileinfo when displaying a message. (Rob Pilling,
+ closes #9569)
+Files: src/message.c, src/testdir/test_messages.vim,
+ src/testdir/dumps/Test_fileinfo_after_echo.dump
+
+Patch 8.2.4157
+Problem: Terminal test fails because Windows sets the title.
+Solution: Add the "vterm_title" testing override and use it in the test.
+ (Ozaki Kiichi, closes #9556)
+Files: runtime/doc/testing.txt, src/globals.h, src/terminal.c,
+ src/testing.c, src/testdir/test_terminal.vim
+
+Patch 8.2.4158
+Problem: MS-Windows: memory leak in :browse.
+Solution: Free stuff before returning. (Ken Takata, closes #9574)
+Files: src/gui_w32.c
+
+Patch 8.2.4159
+Problem: MS-Windows: _WndProc() is very long.
+Solution: Move code to separate functions. (Ken Takata, closes #9573)
+Files: src/gui_w32.c
+
+Patch 8.2.4160
+Problem: Cannot change the register used for Select mode delete.
+Solution: Make CTRL-R set the register to be used when deleting text for
+ Select mode. (Shougo Matsushita, closes #9531)
+Files: runtime/doc/visual.txt, src/globals.h, src/normal.c, src/ops.c,
+ src/testdir/test_selectmode.vim
+
+Patch 8.2.4161
+Problem: Vim9: warning for missing white space after imported variable.
+Solution: Do not skip white space. (closes #9567)
+Files: src/vim9expr.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4162
+Problem: Vim9: no error for redefining function with export.
+Solution: Check for existing function with/without prefix. (closes #9577)
+Files: src/userfunc.c, src/scriptfile.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4163
+Problem: No error for omitting function name after autoload prefix.
+Solution: Check for missing function name. (issue #9577)
+Files: src/userfunc.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4164 (after 8.2.4162)
+Problem: Error in legacy code for function shadowing variable.
+Solution: Only give the error in Vim9 script.
+Files: src/userfunc.c
+
+Patch 8.2.4165
+Problem: The nv_g_cmd() function is too long.
+Solution: Move code to separate functions. (Yegappan Lakshmanan,
+ closes #9576)
+Files: src/normal.c
+
+Patch 8.2.4166
+Problem: Undo synced when switching buffer in another window.
+Solution: Do not sync undo when not needed. (closes #9575)
+Files: src/buffer.c, src/testdir/test_timers.vim
+
+Patch 8.2.4167
+Problem: Vim9: error message for old style import.
+Solution: Use another error message. Add a test.
+Files: src/evalvars.c, src/errors.h, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4168 (after 8.2.4163)
+Problem: Disallowing empty function name breaks existing plugins.
+Solution: Allow empty function name in legacy script.
+Files: src/userfunc.c, src/testdir/test_autoload.vim,
+ src/testdir/sautest/autoload/foo.vim
+
+Patch 8.2.4169
+Problem: MS-Windows: unnecessary casts and other minor things.
+Solution: Clean up the MS-Windows code. (Ken Takata, closes #9583)
+Files: src/gui_w32.c
+
+Patch 8.2.4170
+Problem: MS-Windows: still using old message API calls.
+Solution: Call the "W" functions directly. (Ken Takata, closes #9582)
+Files: src/gui_w32.c, src/os_mswin.c, src/os_win32.c, src/os_win32.h
+
+Patch 8.2.4171
+Problem: Cannot invoke option function using autoload import.
+Solution: Expand the import to an autoload function name. (closes #9578)
+Files: src/userfunc.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/option.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4172
+Problem: Filetype detection for BASIC is not optimal.
+Solution: Improve BASIC filetype detection. (Doug Kearns)
+Files: runtime/autoload/dist/ft.vim, runtime/filetype.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.4173
+Problem: Cannot use an import in 'foldexpr'.
+Solution: Set the script context to where 'foldexpr' was set. (closes #9584)
+ Fix that the script context was not set for all buffers.
+Files: src/eval.c, src/proto/eval.pro, src/fold.c, src/structs.h,
+ src/option.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4174
+Problem: Vim9: can use an autoload name in normal script.
+Solution: Disallow using an autoload name.
+Files: src/userfunc.c, src/errors.h, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4175
+Problem: MS-Windows: runtime check for multi-line balloon is obsolete.
+Solution: Remove the obsolete code. (Ken Takata, closes #9592)
+Files: src/evalfunc.c, src/gui_w32.c, src/proto/gui_w32.pro
+
+Patch 8.2.4176
+Problem: Vim9: cannot use imported function with call().
+Solution: Translate the function name. (closes #9590)
+Files: src/evalfunc.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4177
+Problem: Vim9: autoload script not loaded after "vim9script noclear".
+Solution: Check IMP_FLAGS_AUTOLOAD properly. (closes #9593)
+Files: src/vim9compile.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4178
+Problem: Vim9: invalid error for return type of lambda when debugging.
+Solution: Do not check the return type of a lambda. (closes #9589)
+Files: src/vim9cmds.c
+
+Patch 8.2.4179
+Problem: 'foldtext' is evaluated in the current script context.
+Solution: Use the script context where the option was set.
+Files: src/fold.c, src/buffer.c, src/eval.c, src/proto/eval.pro,
+ src/findfile.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4180
+Problem: 'balloonexpr' is evaluated in the current script context.
+Solution: Use the script context where the option was set.
+Files: src/beval.c, src/option.c, src/proto/option.pro,
+ src/testdir/test_balloon.vim,
+ src/testdir/dumps/Test_balloon_eval_term_01.dump,
+ src/testdir/dumps/Test_balloon_eval_term_01a.dump,
+ src/testdir/dumps/Test_balloon_eval_term_02.dump
+
+Patch 8.2.4181
+Problem: Vim9: cannot use an import in 'diffexpr'.
+Solution: Set the script context when evaluating 'diffexpr'. Do not require
+ 'diffexpr' to return a bool, it was ignored anyway.
+Files: src/evalvars.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4182 (after 8.2.4182)
+Problem: Memory leak when evaluating 'diffexpr'.
+Solution: Use free_tv() instead of clear_tv().
+Files: src/evalvars.c
+
+Patch 8.2.4183
+Problem: Cannot use an import in 'formatexpr'.
+Solution: Set the script context when evaluating 'formatexpr'.
+Files: src/textformat.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4184
+Problem: Cannot use an import in 'includeexpr'.
+Solution: Set the script context when evaluating 'includeexpr'
+Files: src/findfile.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4185
+Problem: Cannot use an import in 'indentexpr'.
+Solution: Set the script context when evaluating 'indentexpr'
+Files: src/indent.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4186
+Problem: Cannot use an import in 'patchexpr'.
+Solution: Set the script context when evaluating 'patchexpr'. Do not
+ require 'patchexpr' to return a bool, it was ignored anyway.
+Files: src/evalvars.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4187
+Problem: Gnuplot file not recognized.
+Solution: Recognize ".gnuplot". (closes #9588)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4188
+Problem: Not all gitconfig files are recognized.
+Solution: Add a few more patterns. (Tim Pope, closes #9597)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4189
+Problem: MS-Windows: code for "old look" is obsolete.
+Solution: Delete obsolete code. Use "MS Shell Dlg" font. (Ken Takata,
+ closes #9596)
+Files: src/gui_w32.c
+
+Patch 8.2.4190
+Problem: All conceal tests are skipped without the screendumps feature.
+Solution: Only skip the tests that use screendumps. (closes #9599)
+Files: src/testdir/test_conceal.vim
+
+Patch 8.2.4191
+Problem: json5 files are not recognized.
+Solution: Add a pattern for json5 files. (closes #9601)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4192
+Problem: Cannot use an import in 'printexpr'.
+Solution: Set the script context when evaluating 'printexpr'.
+Files: src/evalvars.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4193
+Problem: Cannot use an import in 'charconvert'.
+Solution: Set the script context when evaluating 'charconvert'. Also expand
+ script-local functions in 'charconvert'.
+Files: src/evalvars.c, src/optionstr.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4194
+Problem: MS-Windows: code for calculating font size is duplicated.
+Solution: Move the code to a function. (Ken Takata, closes #9603)
+Files: src/gui_w32.c
+
+Patch 8.2.4195
+Problem: Resizing terminal may cause to behave like CTRL-Z.
+Solution: Set "got_tstp" only when in_mch_suspend is set. (Dorian Bivolaru,
+ closes #9602, closes #9586)
+Files: src/os_unix.c
+
+Patch 8.2.4196
+Problem: Various file types not recognized.
+Solution: Add patterns to recognize more file types (closes #9607)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4197
+Problem: Cannot use an import in the "expr" part of 'spellsuggest'.
+Solution: Set the script context when evaluating "expr" of 'spellsuggest'.
+Files: src/evalvars.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4198
+Problem: Vim9: the switch for executing instructions is too long.
+Solution: Move some code to separate functions.
+Files: src/vim9execute.c
+
+Patch 8.2.4199
+Problem: MS-Windows: Support for MSVC before 2003 is not useful.
+Solution: Remove the exceptions for MSVC 6.0. (Ken Takata, closes #9616)
+Files: src/GvimExt/gvimext.h, src/ex_docmd.c, src/feature.h,
+ src/gui_w32.c, src/if_cscope.c, src/if_ole.cpp, src/if_ruby.c,
+ src/macros.h, src/os_mswin.c, src/os_win32.c, src/os_win32.h,
+ src/proto/os_win32.pro, src/time.c, src/vim.h
+
+Patch 8.2.4200
+Problem: Some tests do not clean up properly.
+Solution: Delete created files. (Yegappan Lakshmanan, closes #9611)
+Files: src/testdir/test_filetype.vim, src/testdir/test_messages.vim,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4201
+Problem: When using the GUI CTRL-Z does not stop gvim.
+Solution: When using the GUI set SIGTSTP to SIG_DFL. (Andrew Maltsev,
+ closes #9570)
+Files: src/os_unix.c
+
+Patch 8.2.4202
+Problem: Vim9: cannot export function that exists globally.
+Solution: When checking if a function already exists only check for
+ script-local functions. (closes #9615)
+Files: src/userfunc.c, src/proto/userfunc.pro, src/vim.h,
+ src/vim9compile.c, src/vim9instr.c,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4203
+Problem: Entering a character with CTRL-V may include modifiers.
+Solution: Reset "mod_mask" when entering a character with digits after
+ CTRL-V. (closes #9610)
+Files: src/edit.c, src/testdir/test_edit.vim
+
+Patch 8.2.4204
+Problem: screenpos() has non-zero row for invisible text.
+Solution: Only add the window row when the text is visible. (closes #9618)
+Files: src/move.c, src/testdir/test_cursor_func.vim
+
+Patch 8.2.4205
+Problem: The normal_cmd() function is too long.
+Solution: Move parts to separate functions. (Yegappan Lakshmanan,
+ closes #9608)
+Files: src/normal.c
+
+Patch 8.2.4206
+Problem: Condition with many "(" causes a crash.
+Solution: Limit recursion to 1000.
+Files: src/errors.h, src/eval.c, src/testdir/test_eval_stuff.vim
+
+Patch 8.2.4207 (after 8.2.4206)
+Problem: Recursion test fails with MSVC.
+Solution: Use a smaller limit for MSVC.
+Files: src/eval.c
+
+Patch 8.2.4208
+Problem: Using setbufvar() may change the window title.
+Solution: Do not redraw when creating the autocommand window. (closes #9613)
+Files: src/autocmd.c, src/testdir/test_functions.vim
+
+Patch 8.2.4209
+Problem: partial in 'opfunc' cannot use an imported function.
+Solution: Also expand the function name in a partial. (closes #9614)
+Files: src/evalvars.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4210 (after 8.2.4208)
+Problem: Window title test fails in some configurations.
+Solution: Only run the test if the title can be obtained.
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.4211 (after 8.2.4208)
+Problem: Window title test still fails in some configurations.
+Solution: Use WaitForAssert().
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.4212 (after 8.2.4208)
+Problem: Window title test still fails in some configurations.
+Solution: Explicitly set the 'title' option.
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.4213
+Problem: Too much code for supporting old MSVC versions.
+Solution: Remove MSVC 2003 support. (Ken Takata, closes #9623)
+Files: Filelist, src/INSTALLpc.txt, src/Make_mvc.mak, src/gui_w32.c,
+ src/msvcsetup.bat, src/os_win32.c
+
+Patch 8.2.4214
+Problem: Illegal memory access with large 'tabstop' in Ex mode.
+Solution: Allocate enough memory.
+Files: src/ex_getln.c, src/testdir/test_ex_mode.vim
+
+Patch 8.2.4215
+Problem: Illegal memory access when copying lines in Visual mode.
+Solution: Adjust the Visual position after copying lines.
+Files: src/ex_cmds.c, src/testdir/test_visual.vim
+
+Patch 8.2.4216
+Problem: Vim9: cannot use a function from an autoload import directly.
+Solution: Add the AUTOLOAD instruction to figure out at runtime.
+ (closes #9620)
+Files: src/vim9expr.c, src/vim9.h, src/vim9execute.c, src/vim9instr.c,
+ src/proto/vim9instr.pro, src/testdir/test_vim9_import.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4217
+Problem: Illegal memory access when undo makes Visual area invalid.
+Solution: Correct the Visual area after undo.
+Files: src/undo.c, src/testdir/test_visual.vim
+
+Patch 8.2.4218
+Problem: Illegal memory access with bracketed paste in Ex mode.
+Solution: Reserve space for the trailing NUL.
+Files: src/edit.c, src/testdir/test_paste.vim
+
+Patch 8.2.4219
+Problem: Reading before the start of the line.
+Solution: Check boundary before trying to read the character.
+Files: src/register.c, src/testdir/test_visual.vim
+
+Patch 8.2.4220
+Problem: MS-Windows: some old compiler support remains.
+Solution: Remove obsolete compiler support. (Ken Takata, closes #9627)
+Files: src/Make_mvc.mak, src/vim.h
+
+Patch 8.2.4221
+Problem: Some functions in normal.c are very long.
+Solution: Move code to separate functions. (Yegappan Lakshmanan,
+ closes #9628)
+Files: src/normal.c
+
+Patch 8.2.4222
+Problem: MS-Windows: clumsy way to suppress progress on CI.
+Solution: Check for "$CI" in the Makefile itself. (Ken Takata, closes #9631)
+Files: .github/workflows/ci.yml, ci/appveyor.bat, src/Make_mvc.mak
+
+Patch 8.2.4223
+Problem: Long/int compiler warnings; function arguments swapped.
+Solution: Add type casts. Swap arguments. (Ken Takata, closes #9632)
+Files: src/alloc.c, src/eval.c, src/vim9script.c
+
+Patch 8.2.4224
+Problem: Vim9: no error when using a number for map() second argument
+Solution: Disallow number to string conversion. (closes #9630)
+Files: src/eval.c, src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4225
+Problem: Vim9: depth argument of :lockvar not parsed in :def function.
+Solution: Parse the optional depth argument. (closes #9629)
+ Fix that locking doesn't work for a non-materialize list.
+Files: src/vim9cmds.c, src/evalvars.c, src/structs.h, src/evalfunc.c,
+ src/errors.h, src/vim9execute.c, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4226 (after 8.2.4224)
+Problem: Filter-map test fails.
+Solution: Only reject number argument in Vim9 script.
+Files: src/eval.c
+
+Patch 8.2.4227
+Problem: Vim9: using "lockvar!" in :def function does not work.
+Solution: Add "!" instead of "-1". (closes #9634)
+Files: src/vim9cmds.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4228
+Problem: No tests for clicking in the GUI tabline.
+Solution: Add test functions to generate the events. Add tests using the
+ functions. (Yegappan Lakshmanan, closes #9638)
+Files: runtime/doc/builtin.txt, runtime/doc/testing.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/normal.c,
+ src/proto/testing.pro, src/testdir/test_diffmode.vim,
+ src/testdir/test_gui.vim, src/testdir/test_normal.vim,
+ src/testing.c
+
+Patch 8.2.4229
+Problem: Possible crash when invoking timer callback fails.
+Solution: Initialize the typval. Give an error for an empty callback.
+ (closes #9636)
+Files: src/time.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4230
+Problem: MS-Windows: set_guifontwide() is included but won't work.
+Solution: Include set_guifontwide() only for X11. (Ken Takata, closes #9640)
+Files: src/gui.c
+
+Patch 8.2.4231
+Problem: Vim9: map() gives type error when type was not declared.
+Solution: Only check the type when it was declared, like extend() does.
+ (closes #9635)
+Files: src/list.c, src/evalfunc.c, src/vim9instr.c,
+ src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4232 (after 8.2.4231)
+Problem: Some compilers don't like a goto label without statement.
+Solution: Return instead of using a goto.
+Files: src/list.c
+
+Patch 8.2.4233
+Problem: Crash when recording and using Select mode.
+Solution: When deleting the last recorded character check there is something
+ to delete.
+Files: src/getchar.c, src/testdir/test_registers.vim
+
+Patch 8.2.4234
+Problem: test_garbagecollect_now() does not check v:testing as documented.
+Solution: Give an error if v:testing is not set.
+Files: src/testing.c, src/errors.h, src/testdir/test_functions.vim
+
+Patch 8.2.4235
+Problem: Invalid check for NULL pointer.
+Solution: Remove the check.
+Files: src/getchar.c
+
+Patch 8.2.4236
+Problem: Accessing freed memory.
+Solution: Set the bh_curr pointer to NULL.
+Files: src/getchar.c
+
+Patch 8.2.4237
+Problem: Record buffer wrong if character in Select mode was not typed.
+Solution: Only delete the tail from the record buffer if the character was
+ typed. (closes #9650)
+Files: src/normal.c, src/testdir/test_registers.vim
+
+Patch 8.2.4238
+Problem: *.tf file could be filetype "tf" or "terraform".
+Solution: Detect the type from the file contents. (closes #9642)
+Files: runtime/filetype.vim, runtime/autoload/dist/ft.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.4239
+Problem: Build fails with unusual configuration.
+Solution: Adjust #ifdef. (closes #9651)
+Files: src/testing.c
+
+Patch 8.2.4240
+Problem: Error for using flatten() in Vim9 script is unclear.
+Solution: Add a remark to use flattennew().
+Files: src/errors.h
+
+Patch 8.2.4241
+Problem: Some type casts are redundant.
+Solution: Remove the type casts. (closes #9643)
+Files: src/blob.c, src/buffer.c, src/channel.c, src/clientserver.c,
+ src/clipboard.c, src/drawline.c, src/drawscreen.c, src/edit.c,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_docmd.c, src/ex_eval.c,
+ src/fold.c, src/if_cscope.c, src/json.c, src/match.c,
+ src/memline.c, src/message.c, src/misc1.c, src/normal.c,
+ src/ops.c, src/option.c, src/optionstr.c, src/os_unix.c,
+ src/register.c, src/sign.c, src/spellfile.c, src/tag.c, src/ui.c,
+ src/undo.c, src/window.c
+
+Patch 8.2.4242
+Problem: Put in Visual mode cannot be repeated.
+Solution: Use "P" to put without yanking the deleted text into the unnamed
+ register. (Shougo Matsushita, closes #9591)
+Files: runtime/doc/visual.txt, src/normal.c, src/register.c,
+ src/testdir/test_visual.vim
+
+Patch 8.2.4243
+Problem: Lua tests fail with Lua 5.4.4.
+Solution: Check messages like before Lua 5.4.3. (Jakub Kulík, closes #9652)
+Files: src/testdir/test_lua.vim
+
+Patch 8.2.4244
+Problem: MS-Windows: warning from MSVC on debug build.
+Solution: Adjust "/opt" options. Remove unused variables. Make variables
+ uppercase for consistency. (Ken Takata, closes #9647)
+Files: src/Make_mvc.mak
+
+Patch 8.2.4245
+Problem: ":retab 0" may cause illegal memory access.
+Solution: Limit the value of 'tabstop' to 10000.
+Files: src/option.c, src/vim.h, src/indent.c,
+ src/testdir/test_options.vim
+
+Patch 8.2.4246
+Problem: One error message not in errors.h. (Antonio Colombo)
+Solution: Move the message and rename.
+Files: src/errors.h, src/if_perl.xs
+
+Patch 8.2.4247
+Problem: Stack corruption when looking for spell suggestions.
+Solution: Prevent the depth increased too much. Add a five second time
+ limit to finding suggestions.
+Files: src/spellsuggest.c, src/testdir/test_spell.vim
+
+Patch 8.2.4248
+Problem: No proper test for moving the window separator.
+Solution: Add a test. Add comment in code. (closes #9656)
+Files: src/window.c, src/testdir/test_window_cmd.vim
+
+Patch 8.2.4249
+Problem: The timeout limit for spell suggestions is always 5000 milli
+ seconds.
+Solution: Add the "timeout" entry to 'spellsuggest'.
+Files: runtime/doc/options.txt, src/spellsuggest.c,
+ src/testdir/test_spell.vim
+
+Patch 8.2.4250
+Problem: Channel out callback test is flaky on Mac.
+Solution: Assign high priority to the test process. (Ozaki Kiichi,
+ closes #9653)
+Files: src/testdir/test_channel_pipe.py, src/testdir/thread_util.py
+
+Patch 8.2.4251
+Problem: Vala files are not recognized.
+Solution: Add the *.vala pattern. (closes #9654)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4252
+Problem: Generating the normal command table at runtime is inefficient.
+Solution: Generate the table with a Vim script and put it in a header file.
+ (Yegappan Lakshmanan, closes #9648)
+Files: Filelist, runtime/doc/builtin.txt, runtime/doc/usr_41.txt,
+ src/Make_cyg_ming.mak, src/Make_mvc.mak, src/Make_vms.mms,
+ src/Makefile, src/create_nvcmdidxs.vim, src/evalfunc.c,
+ src/main.c, src/normal.c, src/nv_cmdidxs.h, src/proto/normal.pro
+
+Patch 8.2.4253
+Problem: Using freed memory when substitute uses a recursive function call.
+Solution: Make a copy of the substitute text.
+Files: src/ex_cmds.c, src/testdir/test_substitute.vim
+
+Patch 8.2.4254
+Problem: Using short instead of int.
+Solution: Use int. (closes #9658)
+Files: src/if_cscope.c
+
+Patch 8.2.4255
+Problem: Theoretical computation overflow.
+Solution: Perform multiplication in a wider type. (closes #9657)
+Files: src/alloc.c, src/drawline.c, src/eval.c, src/evalfunc.c,
+ src/ex_docmd.c, src/hardcopy.c, src/list.c, src/memfile.c,
+ src/memline.c, src/popupwin.c
+
+Patch 8.2.4256
+Problem: MS-Windows: compiler warnings when compiled with /W4.
+Solution: Small adjustments to the code. (Ken Takata, closes #9659)
+Files: src/gui_w32.c, src/os_win32.c
+
+Patch 8.2.4257
+Problem: Vim9: finding global function without g: prefix but not finding
+ global variable is inconsistent.
+Solution: Require using g: for a global function. Change the vim9.vim
+ script into a Vim9 script with exports. Fix that import in legacy
+ script does not work.
+Files: src/vim9expr.c, src/evalfunc.c, src/eval.c, src/userfunc.c,
+ src/testdir/vim9.vim, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_import.vim,
+ src/testdir/test_vim9_script.vim, src/testdir/test_blob.vim,
+ src/testdir/test_execute_func.vim, src/testdir/test_debugger.vim,
+ src/testdir/test_expr.vim, src/testdir/test_filter_map.vim,
+ src/testdir/test_float_func.vim, src/testdir/test_functions.vim,
+ src/testdir/test_glob2regpat.vim, src/testdir/test_highlight.vim,
+ src/testdir/test_iminsert.vim, src/testdir/test_ins_complete.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_mapping.vim,
+ src/testdir/test_normal.vim, src/testdir/test_popupwin.vim,
+ src/testdir/test_profile.vim, src/testdir/test_quickfix.vim,
+ src/testdir/test_tagfunc.vim, src/testdir/test_textprop.vim,
+ src/testdir/test_usercommands.vim
+
+Patch 8.2.4258
+Problem: Coverity warns for array overrun.
+Solution: Restrict depth to MAXWLEN - 1.
+Files: src/spellsuggest.c
+
+Patch 8.2.4259
+Problem: Number of test functions for GUI events is growing.
+Solution: Use one function with a dictionary. (Yegappan Lakshmanan,
+ closes #9660)
+Files: runtime/doc/builtin.txt, runtime/doc/testing.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/proto/testing.pro,
+ src/testdir/test_gui.vim, src/testdir/test_vim9_builtin.vim,
+ src/testing.c
+
+Patch 8.2.4260
+Problem: Vim9: can still use a global function without g: at the script
+ level.
+Solution: Also check for g: at the script level. (issue #9637)
+Files: src/userfunc.c, src/proto/userfunc.pro, src/evalvars.c,
+ src/vim9expr.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_import.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_scroll_11.dump,
+ src/testdir/dumps/Test_popupwin_scroll_12.dump
+
+Patch 8.2.4261
+Problem: Accessing invalid memory when a regular expression checks the
+ Visual area while matching in a string.
+Solution: Do not try matching the Visual area in a string.
+Files: src/regexp.c, src/testdir/test_help.vim
+
+Patch 8.2.4262 (after 8.2.4261)
+Problem: Some search tests fail.
+Solution: Use a better way to reject searching for the Visual area.
+Files: src/regexp.c
+
+Patch 8.2.4263
+Problem: No test for the GUI find/replace dialog.
+Solution: Add a test function and a test. (Yegappan Lakshmanan,
+ closes #9662)
+Files: runtime/doc/testing.txt, src/testdir/test_gui.vim, src/testing.c
+
+Patch 8.2.4264
+Problem: Vim9: can use old style autoload function name.
+Solution: Give an error for old style autoload function name.
+Files: src/errors.h, src/userfunc.c, src/testdir/test_vim9_import.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4265 (after 8.2.4264)
+Problem: Autoload tests fails.
+Solution: Use export instead of name with #.
+Files: src/testdir/sautest/autoload/auto9.vim,
+ src/testdir/test_autoload.vim, src/testdir/test_ins_complete.vim
+
+Patch 8.2.4266
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize saved_did_emsg.
+Files: src/userfunc.c
+
+Patch 8.2.4267
+Problem: Unused entry in keymap enum.
+Solution: Remove the entry.
+Files: src/keymap.h
+
+Patch 8.2.4268
+Problem: CI log output is long.
+Solution: Group output in sections. (Ozaki Kiichi, closes #9670)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4269
+Problem: Coverity warns for using a NULL pointer.
+Solution: Check for "name" to not be NULL.
+Files: src/userfunc.c
+
+Patch 8.2.4270
+Problem: Generating nv_cmdidxs.h requires building Vim twice.
+Solution: Move the table into a separate file and use a separate executable
+ to extract the command characters. (Ozaki Kiichi, closes #9669)
+Files: src/normal.c, src/nv_cmds.h, Filelist, runtime/doc/builtin.txt,
+ runtime/doc/usr_41.txt, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/Make_vms.mms, src/Makefile, src/create_nvcmdidxs.c,
+ src/create_nvcmdidxs.vim, src/evalfunc.c, src/proto/normal.pro
+
+Patch 8.2.4271
+Problem: MS-Windows: cannot build with Ruby 3.1.0.
+Solution: Adjust the DLL name and include directory. (Ken Takata,
+ closes #9666)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.2.4272
+Problem: Vim9 expr test fails without the channel feature. (Dominique
+ Pellé)
+Solution: Remove "g:" before "CheckFeature". (closes #9671)
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4273
+Problem: The EBCDIC support is outdated.
+Solution: Remove the EBCDIC support.
+Files: src/ascii.h, src/charset.c, src/cindent.c, src/digraph.c,
+ src/edit.c, src/eval.c, src/evalfunc.c, src/ex_cmds.c,
+ src/feature.h, src/filepath.c, src/findfile.c, src/getchar.c,
+ src/gui.c, src/gui_motif.c, src/hardcopy.c, src/help.c,
+ src/macros.h, src/map.c, src/mark.c, src/misc2.c, src/normal.c,
+ src/ops.c, src/option.c, src/option.h, src/optiondefs.h,
+ src/os_unix.c, src/proto/evalfunc.pro, src/regexp.c,
+ src/regexp_bt.c, src/regexp_nfa.c, src/register.c, src/screen.c,
+ src/spell.c, src/strings.c, src/structs.h, src/term.c,
+ src/version.c, src/viminfo.c, src/testdir/test_edit.vim,
+ src/testdir/test_exec_while_if.vim, src/testdir/test_expr.vim,
+ src/testdir/test_gf.vim, src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.4274
+Problem: Basic and form filetype detection is incomplete.
+Solution: Add a separate function for .frm files. (Doug Kearns, closes #9675)
+Files: runtime/autoload/dist/ft.vim, runtime/filetype.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.4275
+Problem: Cannot use an autoload function from a package under start.
+Solution: Also look in the "start" package directory. (Bjorn Linse,
+ closes #7193)
+Files: src/scriptfile.c, src/testdir/test_packadd.vim
+
+Patch 8.2.4276
+Problem: Separate test function for the GUI scrollbar.
+Solution: Use test_gui_event(). (Yegappan Lakshmanan, closes #9674)
+Files: runtime/doc/builtin.txt, runtime/doc/testing.txt,
+ runtime/doc/usr_41.txt, src/evalfunc.c, src/testing.c,
+ src/proto/testing.pro, src/testdir/test_gui.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4277
+Problem: Vim9: an import does not shadow a command modifier.
+Solution: Do not accept a command modifier followed by a dot.
+Files: src/ex_docmd.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4278
+Problem: Build with Athena GUI fails. (Elimar Riesebieter)
+Solution: Add #ifdef.
+Files: src/testing.c
+
+Patch 8.2.4279
+Problem: Vim9: cannot change item type with map() after range().
+Solution: Split the return type in current type and declared type.
+ (closes #9665)
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/vim9instr.c,
+ src/vim9type.c, src/proto/vim9type.pro,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4280 (after 8.2.4279)
+Problem: list-dict test crashes.
+Solution: Check declared type for add().
+Files: src/vim9expr.vim
+
+Patch 8.2.4281
+Problem: Using freed memory with :lopen and :bwipe.
+Solution: Do not use a wiped out buffer.
+Files: src/buffer.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.4282
+Problem: Restricted mode requires the -Z command line option.
+Solution: Use restricted mode when $SHELL ends in "nologin" or "false".
+ (closes #9681)
+Files: runtime/doc/starting.txt, src/option.c,
+ src/testdir/test_restricted.vim
+
+Patch 8.2.4283
+Problem: Using a variable for the return value is not needed.
+Solution: Return the value directly. (closes #9687)
+Files: src/ex_docmd.c, src/misc2.c
+
+Patch 8.2.4284
+Problem: Old mac resources files are no longer used.
+Solution: Delete the unused files. (Ozaki Kiichi, closes #9688)
+Files: Filelist, src/Makefile, src/dehqx.py, src/infplist.xml,
+ src/os_mac.rsr.hqx, src/os_mac_rsrc/app.icns,
+ src/os_mac_rsrc/doc-txt.icns, src/os_mac_rsrc/doc.icns
+
+Patch 8.2.4285
+Problem: Vim9: type of item in for loop not checked properly.
+Solution: Adjust the type checking. (closes #9683)
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/vim9cmds.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.4286
+Problem: Vim9: strict type checking after copy() and deepcopy().
+Solution: Allow type to change after making a copy. (closes #9644)
+Files: src/eval.c, src/proto/eval.pro, src/dict.c, src/proto/dict.pro,
+ src/list.c, src/proto/list.pro, src/evalfunc.c, src/vim9execute.c,
+ src/vim9type.c, src/proto/vim9type.pro, src/evalvars.c,
+ src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4287
+Problem: Cannot assign empty list with any list type to variable with
+ specific list type.
+Solution: Use unknown list type for empty list if the specified type is any.
+Files: src/vim9type.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.4288
+Problem: Preprocessor indents are inconsistent.
+Solution: Fix preprocessor indents. (Ken Takata, closes #9691)
+Files: src/arglist.c, src/change.c, src/ex_cmds.c, src/gui.c,
+ src/hashtab.c, src/indent.c, src/ops.c, src/os_win32.c
+
+Patch 8.2.4289
+Problem: Warnings reported by MSVC.
+Solution: Rename variables and other fixes. (Ken Takata, closes #9689)
+Files: src/cmdexpand.c, src/drawscreen.c, src/filepath.c, src/getchar.c,
+ src/menu.c, src/os_win32.c, src/version.c
+
+Patch 8.2.4290
+Problem: MS-Windows: using type casts for timer IDs.
+Solution: Remove type casts and use the right type. (Ken Takata,
+ closes #9690) Remove old debug comments. Rename variables and
+ functions.
+Files: src/gui_w32.c
+
+Patch 8.2.4291
+Problem: Error number used twice.
+Solution: Renumber the errors.
+Files: src/errors.h
+
+Patch 8.2.4292 (after 8.2.4291)
+Problem: Test fails.
+Solution: Adjust the expected error number.
+Files: src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4293
+Problem: Vim9: when copying a list it gets type list<any> even when the
+ original list did not have a type.
+Solution: Only set the type when the original list has a type. (closes #9692)
+Files: src/list.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4294
+Problem: MS-Windows: #ifdefs for Cygwin are too complicated.
+Solution: Simplify the conditions. (Ken Takata, closes #9693)
+Files: src/evalfunc.c, src/main.c, src/os_unix.c, src/os_win32.c,
+ src/os_win32.h
+
+Patch 8.2.4295
+Problem: Vim9: concatenating two lists may result in wrong type.
+Solution: Remove the type instead of using list<any>. (closes #9692)
+Files: src/list.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4296
+Problem: Vim9: not all code covered by tests.
+Solution: Add a few more tests for corner cases. Fix hang when single quote
+ is missing.
+Files: src/vim9expr.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_cmd.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4297
+Problem: Vim9: not all code covered by tests.
+Solution: Add a couple more tests.
+Files: src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4298
+Problem: Divide by zero with huge tabstop value.
+Solution: Reject tabstop value that overflows to zero.
+Files: src/indent.c, src/testdir/test_vartabs.vim
+
+Patch 8.2.4299
+Problem: SafeState autocommand interferes with debugging.
+Solution: Do not trigger SafeState while debugging. (closes #9697)
+Files: src/main.c
+
+Patch 8.2.4300 (after 8.2.4299)
+Problem: Cannot build tiny version. (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/main.c
+
+Patch 8.2.4301
+Problem: Vim9: type error for copy of dict.
+Solution: Do not use dict<any> but no type. (closes #9696)
+Files: src/dict.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4302
+Problem: Vim9: return type of getline() is too strict.
+Solution: Make the declared type list<any>. Also do this for other
+ functions returning a list of a specific type.
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4303
+Problem: A few messages should not be translated.
+Solution: Remove _(). (Dominique Pellé, closes #9702)
+Files: src/syntax.c
+
+Patch 8.2.4304
+Problem: Vim9: slice() makes a copy but doesn't change the type.
+Solution: Change the declared type like copy(). (closes #9696)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4305
+Problem: Tex filetype detection fails.
+Solution: Check value to be positive. (closes #9704)
+Files: runtime/autoload/dist/ft.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4306
+Problem: No test for fixed perl filetype check.
+Solution: Add a test. Sort test functions.
+Files: src/testdir/test_filetype.vim
+
+Patch 8.2.4307
+Problem: A few more messages should not be translated.
+Solution: Remove _().
+Files: src/syntax.c
+
+Patch 8.2.4308
+Problem: Vim9: cannot list autoload function.
+Solution: Don't give an error for using # when listing a function.
+ (closes #9703)
+Files: src/userfunc.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4309
+Problem: Vim9: crash when using a partial in the wrong context.
+Solution: Don't use an NULL outer pointer. (closes #9706)
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4310
+Problem: Vim9: constant list and dict get a declaration type other than
+ "any".
+Solution: A constant list and dict have a declared member type "any".
+ (closes #9701)
+Files: src/vim9instr.c, src/vim9type.c, src/proto/vim9type.pro,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4311
+Problem: Vim9: changing script variable type not caught at compile time.
+Solution: Set the declared type.
+Files: src/vim9instr.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4312
+Problem: No error for using :vim9script in a :def function.
+Solution: Give an error when compiling.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4313
+Problem: Vim9: cannot change type of list after making a slice.
+Solution: Adjust the declared member type. (closes #9696)
+Files: src/vim9expr.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4314 (after 8.2.4312)
+Problem: Test fails where lines are skipped.
+Solution: Only give an error when not skipping commands.
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4315
+Problem: Put in Visual mode not fully tested.
+Solution: Add a few more test cases. (closes #9708)
+Files: src/testdir/test_visual.vim
+
+Patch 8.2.4316
+Problem: __CYGWIN32__ is not defined on 64 bit systems.
+Solution: Update #ifdefs. (Ken Takata, closes #9709)
+Files: src/main.c, src/os_unix.c, src/pty.c, src/vim.h
+
+Patch 8.2.4317
+Problem: MS-Windows: Vim exits when Python 3 initialisation fails.
+Solution: Hook into the exit() function to recover from the failure.
+ (Ken Takata, closes #9710)
+Files: runtime/doc/if_pyth.txt, src/if_python3.c, src/os_win32.c,
+ src/errors.h, src/proto/os_win32.pro
+
+Patch 8.2.4318
+Problem: Various comment and indent mistakes, returning wrong zero.
+Solution: Fix the mistakes. Return NULL instead of FAIL.
+Files: src/clientserver.c, src/eval.c, src/evalvars.c, src/vim9cmds.c,
+ src/window.c
+
+Patch 8.2.4319
+Problem: :put does not work properly in compiled function. (John Beckett)
+Solution: Adjust the direction when using line zero.
+Files: src/vim9execute.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4320
+Problem: Athena and Motif: when maximized scrollbar position is wrong.
+Solution: Implement the scrollbar padding functions. (closes #9712)
+Files: src/gui_athena.c, src/gui_motif.c
+
+Patch 8.2.4321
+Problem: Vim9: crash when using a funcref to a closure.
+Solution: Copy pt_outer to the new partial. (closes #9714)
+Files: src/evalfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4322
+Problem: Vim9: crash when using funcref with closure.
+Solution: Keep a reference to the funcref that has the outer context.
+ (closes #9716)
+Files: src/evalfunc.c, src/structs.h, src/eval.c, src/vim9execute.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.4323
+Problem: Vim9: nested function name can start with "_".
+Solution: Use same rule for function name for nested functions.
+ (closes #9713)
+Files: src/vim9compile.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4324
+Problem: Vim9: script-local function name can start with "_".
+Solution: Check for leading capital after "s:". Correct error message.
+Files: src/userfunc.c, src/errors.h, src/vim9compile.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.4325
+Problem: 'wildmenu' only shows few matches.
+Solution: Add the "pum" option: use a popup menu to show the matches.
+ (Yegappan Lakshmanan et al., closes #9707)
+Files: runtime/doc/options.txt, src/vim.h, src/cmdexpand.c,
+ src/drawscreen.c, src/evalfunc.c, src/ex_getln.c, src/option.h,
+ src/optionstr.c, src/popupmenu.c, src/proto/cmdexpand.pro,
+ src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_pum_01.dump,
+ src/testdir/dumps/Test_wildmenu_pum_02.dump,
+ src/testdir/dumps/Test_wildmenu_pum_03.dump,
+ src/testdir/dumps/Test_wildmenu_pum_04.dump,
+ src/testdir/dumps/Test_wildmenu_pum_05.dump,
+ src/testdir/dumps/Test_wildmenu_pum_06.dump,
+ src/testdir/dumps/Test_wildmenu_pum_07.dump,
+ src/testdir/dumps/Test_wildmenu_pum_08.dump,
+ src/testdir/dumps/Test_wildmenu_pum_09.dump,
+ src/testdir/dumps/Test_wildmenu_pum_10.dump,
+ src/testdir/dumps/Test_wildmenu_pum_11.dump,
+ src/testdir/dumps/Test_wildmenu_pum_12.dump,
+ src/testdir/dumps/Test_wildmenu_pum_13.dump,
+ src/testdir/dumps/Test_wildmenu_pum_14.dump,
+ src/testdir/dumps/Test_wildmenu_pum_15.dump,
+ src/testdir/dumps/Test_wildmenu_pum_16.dump,
+ src/testdir/dumps/Test_wildmenu_pum_17.dump,
+ src/testdir/dumps/Test_wildmenu_pum_18.dump,
+ src/testdir/dumps/Test_wildmenu_pum_19.dump,
+ src/testdir/dumps/Test_wildmenu_pum_20.dump,
+ src/testdir/dumps/Test_wildmenu_pum_21.dump,
+ src/testdir/dumps/Test_wildmenu_pum_22.dump,
+ src/testdir/dumps/Test_wildmenu_pum_23.dump,
+ src/testdir/dumps/Test_wildmenu_pum_24.dump,
+ src/testdir/dumps/Test_wildmenu_pum_25.dump,
+ src/testdir/dumps/Test_wildmenu_pum_26.dump,
+ src/testdir/dumps/Test_wildmenu_pum_27.dump,
+ src/testdir/dumps/Test_wildmenu_pum_28.dump,
+ src/testdir/dumps/Test_wildmenu_pum_29.dump
+
+Patch 8.2.4326
+Problem: "o" and "O" copying comment not sufficiently tested.
+Solution: Add a test case. (closes #9718)
+Files: src/testdir/test_textformat.vim
+
+Patch 8.2.4327
+Problem: May end up with no current buffer.
+Solution: When deleting the current buffer to not pick a quickfix buffer as
+ the new current buffer.
+Files: src/buffer.c, src/testdir/test_quickfix.vim
+
+Patch 8.2.4328
+Problem: Command line complete matches cleared when typing character.
+ (Dominique Pellé)
+Solution: Only remove a popup menu if there is one.
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_pum_30.dump,
+ src/testdir/dumps/Test_wildmenu_pum_31.dump
+
+Patch 8.2.4329
+Problem: No support for end line number and column in 'errorformat'.
+Solution: Add %e and %k. (closes #9624)
+Files: runtime/doc/quickfix.txt, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.4330
+Problem: Vim9: no error if script imports itself.
+Solution: Give an error when a script imports itself.
+Files: src/vim9script.c, src/errors.h, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4331
+Problem: Vim9: no test for existing script variable in block.
+Solution: Add a test.
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.4332
+Problem: Vim9: incomplete test for existing script variable in block.
+Solution: Add a couple more tests. Fix uncovered problem.
+Files: src/userfunc.c, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/vim9script.c, src/vim9expr.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4333
+Problem: cstack not always passed to where it is needed.
+Solution: Pass cstack through functions.
+Files: src/eval.c, src/vim9expr.c, src/vim9script.c,
+ src/proto/vim9script.pro, src/vim9compile.c,
+ src/proto/vim9compile.pro
+
+Patch 8.2.4334
+Problem: Command line popup menu not positioned correctly.
+Solution: Also use vim_strsize() on the existing text. (Naruhiko Nishino,
+ closes #9727)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_pum_32.dump
+
+Patch 8.2.4335
+Problem: No autocommand event triggered before changing directory. (Ronnie
+ Magatti)
+Solution: Add DirChangedPre. (closes #9721)
+Files: runtime/doc/autocmd.txt, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/vim.h, src/autocmd.c, src/misc2.c,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.4336
+Problem: Using :filter for :scriptnames does not work. (Ben Jackson)
+Solution: Call message_filtered(). (closes #9720)
+Files: src/scriptfile.c, src/testdir/test_filter_cmd.vim
+
+Patch 8.2.4337
+Problem: Part of condition is always true.
+Solution: Remove that part of the condition. (closes #9729)
+Files: src/filepath.c
+
+Patch 8.2.4338
+Problem: An error from an expression mapping messes up the display.
+Solution: When the expression results in an empty string return K_IGNORE.
+ In cmdline mode redraw the command line. (closes #9726)
+Files: src/getchar.c, src/testdir/test_mapping.vim,
+ src/testdir/dumps/Test_map_expr_2.dump,
+ src/testdir/dumps/Test_map_expr_3.dump,
+ src/testdir/dumps/Test_map_expr_4.dump
+
+Patch 8.2.4339
+Problem: CTRL-A does not work properly with the cmdline popup menu.
+Solution: Fix issues with CTRL-A. Add more tests for the cmdline popup
+ menu. Remove TermWait() before VeriryScreenDump(). Refactor the
+ cmdline popup code. (Yegappan Lakshmanan, closes #9735)
+Files: src/cmdexpand.c, src/ex_getln.c, src/popupmenu.c,
+ src/testdir/screendump.vim, src/testdir/test_bufline.vim,
+ src/testdir/test_cmdline.vim, src/testdir/test_conceal.vim,
+ src/testdir/test_cursorline.vim, src/testdir/test_diffmode.vim,
+ src/testdir/test_display.vim, src/testdir/test_highlight.vim,
+ src/testdir/test_match.vim, src/testdir/test_popup.vim,
+ src/testdir/test_search_stat.vim, src/testdir/test_terminal.vim,
+ src/testdir/test_textprop.vim,
+ src/testdir/dumps/Test_wildmenu_pum_33.dump,
+ src/testdir/dumps/Test_wildmenu_pum_34.dump,
+ src/testdir/dumps/Test_wildmenu_pum_35.dump,
+ src/testdir/dumps/Test_wildmenu_pum_36.dump,
+ src/testdir/dumps/Test_wildmenu_pum_37.dump
+
+Patch 8.2.4340
+Problem: Amiga: mch_can_exe() is not implemented.
+Solution: Implement mch_can_exe() for Amiga OS 4. (Ola Söder, closes #9731)
+Files: src/os_amiga.c
+
+Patch 8.2.4341
+Problem: Command line not redrawn when finishing popup menu and the screen
+ has scrolled up.
+Solution: Redraw the command line after updating the screen. (closes #9722)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_pum_38.dump
+
+Patch 8.2.4342
+Problem: CI will soon switch to other windows version.
+Solution: Use "windows-2019" instead of "windows-latest". (Ozaki Kiichi,
+ closes #9740)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4343
+Problem: When reloading not all properties are detected.
+Solution: Add the "edit" value to v:fcs_choice. (Rob Pilling, closes #9579)
+Files: runtime/doc/editing.txt, runtime/doc/eval.txt, src/fileio.c,
+ src/proto/fileio.pro, src/message.c, src/spellfile.c,
+ src/testdir/test_filechanged.vim
+
+Patch 8.2.4344
+Problem: Amiga: header file included twice.
+Solution: Remove #include. (Ola Söder, closes #9733)
+Files: src/memfile.c
+
+Patch 8.2.4345
+Problem: <amatch> is expanded like a file name for DirChangedPre.
+Solution: Do not expand <amatch>. (closes #9742) Also for the User event.
+Files: src/autocmd.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.4346
+Problem: A custom statusline may cause Esc to work like Enter on the
+ command line when the popup menu is displayed.
+Solution: Save and restore KeyTyped. (closes #9749)
+Files: src/drawscreen.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_pum_39.dump
+
+Patch 8.2.4347
+Problem: In some build setups UNUSED is not defined.
+Solution: Change the logic of how UNUSED is defined. (Ola Söder,
+ closes #9734)
+Files: src/vim.h
+
+Patch 8.2.4348
+Problem: "legacy exe cmd" does not do what one would expect.
+Solution: Apply the "legacy" and "vim9script" command modifiers to the
+ argument of ":execute".
+Files: runtime/doc/vim9.txt, src/globals.h, src/eval.c, src/ex_docmd.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4349
+Problem: FileChangedShell test fails on MS-Windows.
+Solution: Skip the test on MS-Windows.
+Files: src/testdir/test_filechanged.vim
+
+Patch 8.2.4350
+Problem: FEAT_GUI_ENABLED defined but never used.
+Solution: Remove the #define. (Ola Söder, closes #9732)
+Files: src/vim.h
+
+Patch 8.2.4351
+Problem: No coverage is measured on MS-Windows CI.
+Solution: Enable coverage on MS-Windows. (Ozaki Kiichi, closes #9750)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4352
+Problem: ReScript files are not recognized.
+Solution: Add the *.res and *.resi patterns. (Ananda Umamil, closes #9752)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4353
+Problem: CI does not use the latest Lua and Python.
+Solution: Use Lua 5.4.2 and Python 3.10. (closes #9744)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4354
+Problem: Dynamic loading of libsodium not handled properly.
+Solution: Fix has() and :version. Show an error message when loading fails.
+ Fix memory leaks. (Ken Takata, closes #9754)
+Files: src/crypt.c, src/evalfunc.c, src/gui_dwrite.cpp, src/if_cscope.c,
+ src/os_win32.c, src/proto/crypt.pro, src/proto/os_win32.pro,
+ src/version.c
+
+Patch 8.2.4355
+Problem: Unnecessary call to check_colorcolumn().
+Solution: Remove the call. (Sean Dewar, closes #9748)
+Files: src/option.c, src/window.c
+
+Patch 8.2.4356
+Problem: Command line completion functions are very long.
+Solution: Refactor into multiple functions. (Yegappan Lakshmanan,
+ closes #9753)
+Files: src/cmdexpand.c
+
+Patch 8.2.4357 (after 8.2.4348)
+Problem: sticky command modifiers are too sticky.
+Solution: Do not apply command modifiers to a sourced script. (closes #9751)
+Files: src/scriptfile.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4358
+Problem: Vim9: line number of exception is not set.
+Solution: Set the line number before throwing an exception. (closes #9755)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4359
+Problem: crash when repeatedly using :retab.
+Solution: Bail out when the line is getting too long.
+Files: src/indent.c, src/testdir/test_retab.vim
+
+Patch 8.2.4360
+Problem: Vim9: allowing use of "s:" leads to inconsistencies.
+Solution: Disallow using "s:" in Vim9 script at the script level.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/errors.h,
+ src/vim9compile.c, src/eval.c, src/testdir/vim9.vim,
+ src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_import.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4361 (after 8.2.4360)
+Problem: Vim9: some tests fail.
+Solution: Fix the tests, mostly by removing "s:".
+Files: src/testdir/test_expr.vim, src/testdir/test_functions.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_normal.vim,
+ src/testdir/test_tagfunc.vim
+
+Patch 8.2.4362
+Problem: :retab may allocate too much memory.
+Solution: Bail out when allocating more than MAXCOL bytes.
+Files: src/indent.c
+
+Patch 8.2.4363
+Problem: MS-Windows: running out of memory for a very long line.
+Solution: Use a 32 bit value for MAXCOL also when ints are 64 bits.
+Files: src/vim.h
+
+Patch 8.2.4364
+Problem: MS-Windows: still running out of memory for a very long line.
+Solution: Check for negative length.
+Files: src/indent.c
+
+Patch 8.2.4365 (after 8.2.4348)
+Problem: sticky command modifiers are too sticky.
+Solution: Do not apply command modifiers to a called function. (closes #9751)
+Files: src/userfunc.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4366
+Problem: Not enough tests for command line completion.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #9760)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim,
+ src/testdir/test_usercommands.vim
+
+Patch 8.2.4367
+Problem: Calling in_vim9script() multiple times.
+Solution: Call it once and keep the result.
+Files: src/userfunc.c, src/eval.c
+
+Patch 8.2.4368
+Problem: Amiga: a few compiler warnings.
+Solution: Adjust #ifdefs. Add "UNUSED". (Ola Söder, closes #9756,
+ closes #9757)
+Files: src/term.c, src/os_amiga.c
+
+Patch 8.2.4369
+Problem: Redundant #ifdef argument.
+Solution: Remove unused MSWIN. (Ola Söder, closes #9758)
+Files: src/feature.h
+
+Patch 8.2.4370
+Problem: MS-Windows: libsodium.dll not included with the installer.
+Solution: Add the file to the installer if it exists. (Christian Brabandt,
+ closes #9762)
+Files: nsis/gvim.nsi
+
+Patch 8.2.4371
+Problem: Vim9: can create a script variable from a legacy function.
+Solution: Disallow creating a script variable from a function.
+Files: src/evalvars.c, src/errors.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4372
+Problem: Filetype detection from file contents is in legacy script.
+Solution: Use a compiled function for filetype detection.
+Files: runtime/scripts.vim, runtime/autoload/dist/script.vim
+
+Patch 8.2.4373
+Problem: Expression test fails.
+Solution: Make the test work with latest Vim9 syntax.
+Files: src/testdir/test_expr.vim
+
+Patch 8.2.4374
+Problem: Unreachable code.
+Solution: Remove outdated code lines.
+Files: src/vim9compile.c
+
+Patch 8.2.4375
+Problem: ctx_imports is not used.
+Solution: Delete ctx_imports. Add missing dependency.
+Files: src/vim9.h, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/eval.c, src/evalfunc.c, src/evalvars.c, src/userfunc.c,
+ src/vim9expr.c, src/vim9script.c, src/Makefile
+
+Patch 8.2.4376
+Problem: Not enough tests for command line completion.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #9771)
+Files: src/testdir/test_cmdline.vim, src/testdir/test_usercommands.vim
+
+Patch 8.2.4377
+Problem: CI steps for Windows are a bit unorganized.
+Solution: Organize CI test steps on Windows. (Ozaki Kiichi, closes #9764)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4378
+Problem: Incsearch highlight broken when calling searchcount() in 'tabLine'
+ function. (Mirko Palmer)
+Solution: Save and restore the incsearch state. (Christian Brabandt,
+ closes #9763, closes #9633)
+Files: src/search.c, src/testdir/test_search_stat.vim,
+ src/testdir/dumps/Test_searchstat_inc_1.dump,
+ src/testdir/dumps/Test_searchstat_inc_2.dump,
+ src/testdir/dumps/Test_searchstat_inc_3.dump
+
+Patch 8.2.4379
+Problem: An empty change is reported to a listener.
+Solution: Do not report an empty change. (closes #9768) Remove unused
+ return value.
+Files: src/undo.c, src/change.c, src/testdir/test_listener.vim
+
+Patch 8.2.4380
+Problem: Small differences between Chinese translation files.
+Solution: Add rule for converting UTF-8 to gb2312. (closes #9773)
+Files: src/po/Makefile, src/po/Make_all.mak
+
+Patch 8.2.4381 (after 8.2.4380)
+Problem: Translation file listed twice.
+Solution: Remove one entry.
+Files: src/po/Make_all.mak
+
+Patch 8.2.4382 (after 8.2.4346)
+Problem: A custom 'tabline' may cause Esc to work like Enter on the
+ command line when the popup menu is displayed.
+Solution: Save and restore KeyTyped. (closes #9776)
+Files: src/drawscreen.c, src/screen.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_pum_40.dump
+
+Patch 8.2.4383
+Problem: Vim9: unused code lines.
+Solution: Rely on either "cctx" or "cstack" to not be NULL.
+Files: src/vim9compile.c
+
+Patch 8.2.4384
+Problem: Vim9: error message not tested, some code not tested.
+Solution: Add a couple of test cases. Give an error for a command modifier
+ without a command.
+Files: src/errors.h, src/vim9compile.c, src/ex_docmd.c,
+ src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4385 (after 8.2.4384)
+Problem: Cannot build tiny version.
+Solution: Adjust #ifdefs.
+Files: src/errors.h
+
+Patch 8.2.4386 (after 8.2.4384)
+Problem: Still cannot build tiny version.
+Solution: Adjust #ifdefs.
+Files: src/ex_docmd.c
+
+Patch 8.2.4387
+Problem: Command line completion doesn't always work properly.
+Solution: Adjust triggering after a "|". Add more tests. (Yegappan
+ Lakshmanan, closes #9779)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4388
+Problem: Dead code in op_insert().
+Solution: Remove condition and else block. (closes #9782)
+Files: src/ops.c
+
+Patch 8.2.4389
+Problem: screenpos() does not handle a position in a closed fold.
+Solution: Check if the position is inside a closed fold. (closes #9778)
+Files: src/move.c, src/testdir/test_cursor_func.vim
+
+Patch 8.2.4390
+Problem: Vim9: list from declaration with inferred type does not set the
+ type on the value.
+Solution: When inferring the type in a variable declaration also set the
+ type of the list or dictionary. (closes #9705) Do not set the
+ type when the member is "any".
+Files: src/vim9compile.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4391
+Problem: Command line executed when typing Esc in the GUI.
+Solution: Move saving/restoring KeyTyped to build_stl_str_hl().
+ (closes #9783)
+Files: src/buffer.c, src/screen.c
+
+Patch 8.2.4392 (after 8.2.4002)
+Problem: MS-Windows with VIMDLL: Escaping CSI is wrong.
+Solution: Put back #ifdef. (Ken Takata, closes #9769)
+Files: src/getchar.c
+
+Patch 8.2.4393
+Problem: Possible number overflow with nested folds.
+Solution: Avoid a negative line number.
+Files: src/fold.c
+
+Patch 8.2.4394 (after 8.2.4392)
+Problem: UTF8 select mode test fails on MS-Windows.
+Solution: Revert the #ifdef change.
+Files: src/getchar.c
+
+Patch 8.2.4395
+Problem: Some code lines not covered by tests.
+Solution: Add a few more test cases. Fix getting more than one error for
+ invalid assignment.
+Files: src/evalvars.c, src/errors.h, src/vim9compile.c,
+ src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.4396 (after 8.2.4395)
+Problem: Python3 test fails.
+Solution: Remove "let".
+Files: src/testdir/test_vim9_func.vim
+
+Patch 8.2.4397
+Problem: Crash when using many composing characters in error message.
+Solution: Use mb_cptr2char_adv() instead of mb_ptr2char_adv().
+Files: src/testing.c, src/testdir/test_assert.vim
+
+Patch 8.2.4398
+Problem: Some command completion functions are too long.
+Solution: Refactor code into separate functions. Add a few more tests.
+ (Yegappan Lakshmanan, closes #9785)
+Files: src/cmdexpand.c, src/ex_getln.c, src/usercmd.c,
+ src/proto/usercmd.pro, src/testdir/test_cmdline.vim
+
+Patch 8.2.4399
+Problem: Crash after ml_get error.
+Solution: When returning "???" flush the line and set ml_line_lnum.
+Files: src/memline.c
+
+Patch 8.2.4400 (after 8.2.4394)
+Problem: MS-Windows: cannot use the mouse in the console with VIMDLL.
+Solution: use add_char2buf() instead of fix_input_buffer(). (closes #9784,
+ closes #9769)
+Files: src/getchar.c
+
+Patch 8.2.4401
+Problem: Map listing does not clear the rest of the command line.
+Solution: Call msg_clear_eos(). (closes #5623, closes #5962)
+Files: src/map.c, src/testdir/test_mapping.vim,
+ src/testdir/dumps/Test_map_list_1.dump
+
+Patch 8.2.4402
+Problem: Missing parenthesis may cause unexpected problems.
+Solution: Add more parenthesis is macros. (closes #9788)
+Files: src/autocmd.c, src/charset.c, src/drawline.c, src/drawscreen.c,
+ src/evalfunc.c, src/fileio.c, src/fold.c, src/getchar.c,
+ src/highlight.c, src/memline.c, src/normal.c, src/quickfix.c,
+ src/regexp.c, src/search.c, src/sha256.c, src/spell.c,
+ src/spellfile.c, src/spellsuggest.c, src/syntax.c, src/window.c
+
+Patch 8.2.4403
+Problem: ml_get error with nested folds and deleting lines.
+Solution: Correct the last line number before calling hasFoldingWin().
+Files: src/change.c
+
+Patch 8.2.4404
+Problem: Vim9: some code not covered by tests.
+Solution: Add a few specific test cases.
+Files: src/vim9execute.c, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4405
+Problem: Compiler warning for unused variable without the +folding feature.
+ (Tony Mechelynck)
+Solution: Add #ifdef.
+Files: src/change.c
+
+Patch 8.2.4406
+Problem: Expand functions use confusing argument names.
+Solution: Rename "file" to "match". Refactor some completion code. Add a
+ few more tests. (Yegappan Lakshmanan, closes #9790)
+Files: src/cmdexpand.c, src/testdir/test_usercommands.vim
+
+Patch 8.2.4407
+Problem: Vim9: some code not covered by tests.
+Solution: Add more tests. Avoid giving two errors. Remove dead code.
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_cmd.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4408
+Problem: Vim9: some code not covered by tests.
+Solution: Add a few more tests. Correct error message. Allow unlet on dict
+ with a number key.
+Files: src/vim9execute.c, src/errors.h, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4409
+Problem: Vim9: some code not covered by tests.
+Solution: Add a few more tests. Fix reported line number.
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4410
+Problem: Vim9: some code not covered by tests.
+Solution: Add a few more tests. Remove dead code.
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_cmd.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.4411
+Problem: Bicep files are not recognized.
+Solution: Match *.bicep files. (Dundar Goc, closes #9791)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4412
+Problem: Translation cleanup script does not remove empty lines at end.
+Solution: Remove empty lines at the end. (Ken Takata, closes #9794)
+Files: src/po/cleanup.vim
+
+Patch 8.2.4413
+Problem: Vim9: Coverity warns for using NULL pointer.
+Solution: Give an internal error when funcref function can't be found.
+Files: src/vim9execute.c
+
+Patch 8.2.4414
+Problem: Solidity files are not recognized.
+Solution: Add the *.sol pattern. (Dundar Goc, closes #9792)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4415
+Problem: Function argument name conflicts with C++ keyword.
+Solution: Rename the argument.
+Files: src/usercmd.c, src/proto/usercmd.pro
+
+Patch 8.2.4416
+Problem: Vim9: using a script-local function requires using "s:" when
+ setting 'completefunc'.
+Solution: Do not require "s:" in Vim9 script. (closes #9796)
+Files: runtime/doc/options.txt, src/userfunc.c,
+ src/testdir/test_ins_complete.vim
+
+Patch 8.2.4417 (after 8.2.4416)
+Problem: Using NULL pointer.
+Solution: Set offset after checking for NULL pointer.
+Files: src/userfunc.c
+
+Patch 8.2.4418
+Problem: Crash when using special multi-byte character.
+Solution: Don't use isalpha() for an arbitrary character.
+Files: src/charset.c, src/proto/charset.pro, src/filepath.c,
+ src/testdir/test_autochdir.vim
+
+Patch 8.2.4419
+Problem: Illegal memory access when using exactly 20 highlights.
+Solution: Add one more item in the array. (Brandon Richardson,
+ closes #9800)
+Files: src/buffer.c, src/testdir/test_tabline.vim
+
+Patch 8.2.4420
+Problem: Menu translations are inconsistent.
+Solution: Add a Makefile to convert between encodings. (Ada (Haowen) Yu,
+ closes #9801)
+Files: runtime/lang/Makefile, runtime/lang/menu_af_af.latin1.vim,
+ runtime/lang/menu_ca_es.latin1.vim,
+ runtime/lang/menu_chinese_gb.936.vim,
+ runtime/lang/menu_chinese_taiwan.950.vim,
+ runtime/lang/menu_cs_cz.iso_8859-2.vim,
+ runtime/lang/menu_cs_cz.utf-8.vim,
+ runtime/lang/menu_czech_czech_republic.1250.vim,
+ runtime/lang/menu_czech_czech_republic.ascii.vim,
+ runtime/lang/menu_da.utf-8.vim,
+ runtime/lang/menu_de_de.latin1.vim,
+ runtime/lang/menu_eo.utf-8.vim,
+ runtime/lang/menu_es_es.latin1.vim,
+ runtime/lang/menu_fi_fi.latin1.vim,
+ runtime/lang/menu_fr_fr.latin1.vim,
+ runtime/lang/menu_hu_hu.iso_8859-2.vim,
+ runtime/lang/menu_hu_hu.utf-8.vim,
+ runtime/lang/menu_is_is.latin1.vim,
+ runtime/lang/menu_it_it.latin1.vim,
+ runtime/lang/menu_ja_jp.euc-jp.vim,
+ runtime/lang/menu_ja_jp.utf-8.vim,
+ runtime/lang/menu_japanese_japan.932.vim,
+ runtime/lang/menu_ko_kr.euckr.vim,
+ runtime/lang/menu_ko_kr.utf-8.vim,
+ runtime/lang/menu_nl_nl.latin1.vim,
+ runtime/lang/menu_no_no.latin1.vim,
+ runtime/lang/menu_pl_pl.iso_8859-2.vim,
+ runtime/lang/menu_pl_pl.utf-8.vim,
+ runtime/lang/menu_polish_poland.1250.vim,
+ runtime/lang/menu_pt_br.vim, runtime/lang/menu_pt_pt.vim,
+ runtime/lang/menu_ru.utf-8.vim,
+ runtime/lang/menu_ru_ru.koi8-r.vim,
+ runtime/lang/menu_ru_ru.utf-8.vim, runtime/lang/menu_ru_ru.vim,
+ runtime/lang/menu_sk_sk.iso_8859-2.vim,
+ runtime/lang/menu_sl_si.cp1250.vim,
+ runtime/lang/menu_sl_si.latin2.vim,
+ runtime/lang/menu_sl_si.utf-8.vim,
+ runtime/lang/menu_slovak_slovak_republic.1250.vim,
+ runtime/lang/menu_sr_rs.ascii.vim,
+ runtime/lang/menu_sr_rs.iso_8859-2.vim,
+ runtime/lang/menu_sr_rs.iso_8859-5.vim,
+ runtime/lang/menu_sr_rs.utf-8.vim,
+ runtime/lang/menu_sv_se.latin1.vim,
+ runtime/lang/menu_tr_tr.cp1254.vim,
+ runtime/lang/menu_tr_tr.iso_8859-9.vim,
+ runtime/lang/menu_tr_tr.utf-8.vim,
+ runtime/lang/menu_uk_ua.cp1251.vim,
+ runtime/lang/menu_uk_ua.koi8-u.vim,
+ runtime/lang/menu_uk_ua.utf-8.vim, runtime/lang/menu_vi_vn.vim,
+ runtime/lang/menu_zh_cn.utf-8.vim,
+ runtime/lang/menu_zh_tw.utf-8.vim
+
+Patch 8.2.4421
+Problem: Some installed files and directories have wrong permissions.
+Solution: Adjust the Makefile and shell to set permissions. (closes #9793)
+Files: src/Makefile, src/installman.sh
+
+Patch 8.2.4422
+Problem: Autochdir test fails on MS-Windows.
+Solution: Expect another error on MS-Windows.
+Files: src/testdir/test_autochdir.vim
+
+Patch 8.2.4423
+Problem: "make nvcmdidxs" fails.
+Solution: Use "-S" instead of "-u" to source the script.
+Files: src/Makefile
+
+Patch 8.2.4424
+Problem: ".gts" and ".gjs" files are not recognized.
+Solution: Recognize Glimmer flavored typescript and javascript.
+ (closes #9799)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4425
+Problem: map() function does not check function arguments at compile time.
+Solution: Give an error if the arguments of a map() function are wrong.
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.4426
+Problem: map() function on string and blob does not check argument types at
+ compile time.
+Solution: Check string and blob argument types. Support "0z1234->func()".
+Files: src/vim9compile.c, src/evalfunc.c, src/ex_docmd.c,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4427
+Problem: getchar() may return modifiers if no character is available.
+Solution: Do not process modifiers when there is no character. (closes #9806)
+Files: src/getchar.c, src/testdir/test_functions.vim
+
+Patch 8.2.4428
+Problem: Crash when switching tabpage while in the cmdline window.
+Solution: Disallow switching tabpage when in the cmdline window.
+Files: src/window.c, src/proto/window.pro, src/evalvars.c,
+ src/evalvars.c, src/usercmd.c
+
+Patch 8.2.4429
+Problem: Using script-local function from the wrong script when using a
+ partial. (Yegappan Lakshmanan)
+Solution: Include the script ID in the partial name.
+Files: src/userfunc.c, src/proto/userfunc.pro, src/evalfunc.c,
+ src/vim9type.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4430
+Problem: GTK: crash when using 'guiligatures' and reading from stdin.
+Solution: Make a copy of the message. (Amon Sha, closes #9719, closes #9814)
+Files: src/fileio.c
+
+Patch 8.2.4431
+Problem: Unnecessary condition when assigning to a variable.
+Solution: Remove the condition.
+Files: src/evalvars.c
+
+Patch 8.2.4432 (after 8.2.4428)
+Problem: Cannot use settabvar() while the cmdline window is open.
+Solution: Only give an error when actually switching tabpage.
+ (closes #9813)
+Files: src/window.c
+
+Patch 8.2.4433
+Problem: CI: cannot see interface versions for MS-Windows.
+Solution: List the interface versions. (Ken Takata, closes #9811)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4434
+Problem: Duplicate check for cmdline window.
+Solution: Remove the second check. (Sean Dewar, closes #9816)
+Files: src/window.c
+
+Patch 8.2.4435
+Problem: Dead code in checking map() arguments. (Dominique Pellé)
+Solution: Remove the first return statement. (closes #9815)
+Files: src/evalfunc.c
+
+Patch 8.2.4436
+Problem: Crash with weird 'vartabstop' value.
+Solution: Check for running into the end of the line.
+Files: src/indent.c, src/testdir/test_vartabs.vim
+
+Patch 8.2.4437
+Problem: Vartabs test fails on MS-Windows.
+Solution: Use iso8859-1 'encoding'. (Ken Takata, closes #9818)
+Files: src/testdir/test_vartabs.vim
+
+Patch 8.2.4438
+Problem: Crash on exit when using cmdline window.
+Solution: Reset "cmdwin_type" before exiting. (closes #9817)
+Files: src/ui.c, src/testdir/test_exit.vim
+
+Patch 8.2.4439
+Problem: Accepting "iso8859" 'encoding' as "iso-8859-".
+Solution: use "iso8859" as "iso-8859-1".
+Files: src/mbyte.c, src/testdir/test_options.vim
+
+Patch 8.2.4440
+Problem: Crash with specific regexp pattern and string.
+Solution: Stop at the start of the string.
+Files: src/regexp_bt.c, src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.4441
+Problem: Vim9: function argument of filter() not checked like map().
+Solution: Also check the function argument of filter().
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4442 (after 8.2.4438)
+Problem: Test for error reading input fails on MS-Windows.
+Solution: Don't run the test on MS-Windows.
+Files: src/testdir/test_exit.vim
+
+Patch 8.2.4443 (after 8.2.4440)
+Problem: Regexp pattern test fails on Mac.
+Solution: Do not use a swapfile for the buffer.
+Files: src/testdir/test_regexp_utf8.vim
+
+Patch 8.2.4444
+Problem: Beep caused by test. ASAN reports leaks.
+Solution: Do not put a NL at the end of the script. Make the text work on
+ MS-Windows. Do not run the test with ASAN.
+Files: src/testdir/test_exit.vim
+
+Patch 8.2.4445
+Problem: Exit test fails on MS-Windows anyway.
+Solution: Skip the test on MS-Windows.
+Files: src/testdir/test_exit.vim
+
+Patch 8.2.4446
+Problem: Vim9: cannot refer to a global function like a local one.
+Solution: When g:name is not a variable but a function, use a function
+ reference. (closes #9826)
+Files: src/vim9execute.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4447
+Problem: Vim9: can still use s:var in a compiled function.
+Solution: Disallow using s:var for Vim9 script. (closes #9824)
+Files: runtime/doc/vim9.txt, src/vim9expr.c, src/vim9compile.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4448 (after 8.2.4447)
+Problem: Filetype detection is failing.
+Solution: Do not use "s:" where it is no longer allowed.
+Files: runtime/autoload/dist/ft.vim,
+
+Patch 8.2.4449
+Problem: vim9: function argument of sort() not checked at compile time.
+Solution: Add a compile time check.
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4450 (after 8.2.4449)
+Problem: List sort test fails.
+Solution: Pass a valid "how" argument.
+Files: src/testdir/test_listdict.vim
+
+Patch 8.2.4451 (after 8.2.4450)
+Problem: sort() fails when ignoring case.
+Solution: Accept a number one argument in sort().
+Files: src/evalfunc.c, src/testdir/test_listdict.vim
+
+Patch 8.2.4452
+Problem: Test for what 8.2.4436 fixes does not check for regression.
+Solution: Set several options. (Ken Takata, closes #9830)
+Files: src/testdir/test_vartabs.vim
+
+Patch 8.2.4453
+Problem: :helpgrep may free an option that was not allocated. (Yegappan
+ Lakshmanan)
+Solution: Check if the value was allocated.
+Files: src/option.c, src/proto/option.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.4454
+Problem: Resetting cmdwin_type only for one situation.
+Solution: Reset cmdwin_type before closing windows. (closes #9822)
+Files: src/ui.c, src/window.c, src/testdir/test_exit.vim
+
+Patch 8.2.4455
+Problem: Accepting one and zero for the second sort() argument is strange.
+Solution: Disallow using one and zero in Vim9 script.
+Files: runtime/doc/builtin.txt, src/evalfunc.c, src/list.c,
+ src/testdir/test_listdict.vim
+
+Patch 8.2.4456
+Problem: Terminal test may fail on some machines.
+Solution: Increase wait time. (Zdenek Dohnal, closes #9834)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.4457
+Problem: The GPM library can only be linked statically.
+Solution: Make it possible to load the GPM library dynamically. (Damien)
+Files: runtime/doc/various.txt, src/config.h.in, src/configure.ac,
+ src/Makefile, src/evalfunc.c, src/feature.h, src/os_unix.c,
+ src/proto/os_unix.pro, src/version.c
+
+Patch 8.2.4458
+Problem: Vim9: compiling filter() call fails with funcref that has unknown
+ arguments.
+Solution: Do not check the arguments if they are unknown at compile time.
+ (closes #9835)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4459
+Problem: Vim9: compiling sort() call fails with a funcref that has unknown
+ arguments.
+Solution: Do not check the arguments if they are unknown at compile time.
+ (closes #9835)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4460
+Problem: Vim9: wrong error for defining dict function.
+Solution: Explicitly check for trying to define a dict function.
+ (closes #9827)
+Files: src/errors.h, src/userfunc.c, src/vim9compile.c,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.4461
+Problem: MS-Windows: garbage characters on stdout with VIMDLL.
+Solution: Don't call gui_focus_change() when about to quit. (Ken Takata,
+ closes #9840)
+Files: src/gui_w32.c
+
+Patch 8.2.4462
+Problem: Not enough testing for quickfix code.
+Solution: Add more tests. Fix uncovered problem. (Yegappan Lakshmanan,
+ closes #9839)
+Files: src/quickfix.c, src/window.c, src/testdir/test_makeencoding.vim,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.4463
+Problem: Completion only uses strict matching.
+Solution: Add the "fuzzy" item for 'wildoptions'. (Yegappan Lakshmanan,
+ closes #9803)
+Files: runtime/doc/options.txt, src/buffer.c, src/cmdexpand.c,
+ src/option.c, src/option.h, src/optionstr.c,
+ src/proto/cmdexpand.pro, src/proto/option.pro,
+ src/proto/search.pro, src/search.c, src/structs.h,
+ src/testdir/gen_opt_test.vim, src/testdir/test_cmdline.vim
+
+Patch 8.2.4464
+Problem: Dtrace files are recognized as filetype D.
+Solution: Add a pattern for Dtrace files. (Teubel György, closes #9841)
+ Add some more testing.
+Files: runtime/autoload/dist/ft.vim, runtime/filetype.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.4465
+Problem: Fuzzy completion does not order matches properly.
+Solution: Do not use regular expression match. (Yegappan Lakshmanan,
+ closes #9843)
+Files: src/cmdexpand.c, src/search.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4466
+Problem: MS-Windows: illegal memory access in installer when using
+ "create-directories" as the final argument.
+Solution: Check the argument count. (Cam Sinclair, closes #9844)
+Files: src/dosinst.c
+
+Patch 8.2.4467
+Problem: Running filetype test leaves file behind.
+Solution: Delete the file.
+Files: src/testdir/test_filetype.vim
+
+Patch 8.2.4468
+Problem: Coverity warns for uninitialized struct member.
+Solution: Set color.index to zero.
+Files: src/terminal.c
+
+Patch 8.2.4469
+Problem: Coverity warns for uninitialized variable.
+Solution: Set the value to zero.
+Files: src/ex_getln.c
+
+Patch 8.2.4470
+Problem: Coverity warns for uninitialized variable.
+Solution: Set can_spell to zero.
+Files: src/drawline.c
+
+Patch 8.2.4471
+Problem: Coverity warns for uninitialized variable.
+Solution: Set flags to zero.
+Files: src/vim9cmds.c
+
+Patch 8.2.4472
+Problem: Coverity warns for use of a freed function name.
+Solution: Only check an autoload name when is prefixed.
+Files: src/userfunc.c
+
+Patch 8.2.4473
+Problem: Coverity warns for not checking return value of ftell().
+Solution: Bail out if ftell() returns a negative value.
+Files: src/spellfile.c
+
+Patch 8.2.4474
+Problem: Memory allocation failures not tested in quickfix code.
+Solution: Add alloc IDs and tests. (Yegappan Lakshmanan, closes #9848)
+Files: src/alloc.h, src/quickfix.c, src/vim.h,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.4475
+Problem: Fuzzy cmdline completion does not work for lower case.
+Solution: Also use fuzzy completion for lower case input. (Yegappan
+ Lakshmanan, closes #9849)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4476
+Problem: Operator name spelled wrong.
+Solution: Change trinary to ternary. (Goc Dundar, closes #9850)
+Files: src/testdir/test_expr.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.4477
+Problem: Crash when using fuzzy completion.
+Solution: Temporary fix: put back regexp. (closes #9851)
+Files: src/cmdexpand.c
+
+Patch 8.2.4478
+Problem: Crash when using fuzzy completion.
+Solution: Temporary fix: put back regexp. (closes #9852, closes #9851)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4479
+Problem: No fuzzy completion for maps and abbreviations.
+Solution: Fuzzy complete maps and abbreviations. (Yegappan Lakshmanan,
+ closes #9856)
+Files: src/cmdexpand.c, src/map.c, src/proto/map.pro, src/search.c,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.4480
+Problem: Suspending with CTRL-Z does not work on Android.
+Solution: Do not handle SIGTSTP. (closes #9854)
+Files: src/os_unix.c
+
+Patch 8.2.4481
+Problem: Cmdline popup menu not removed when 'lazyredraw' is set.
+Solution: Temporarily reset 'lazyredraw' when removing the popup menu.
+ (closes #9857)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_pum_41.dump
+
+Patch 8.2.4482
+Problem: No fuzzy cmdline completion for user defined completion.
+Solution: Add fuzzy completion for user defined completion. (Yegappan
+ Lakshmanan, closes #9858)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4483
+Problem: Command completion makes two rounds to collect matches.
+Solution: Use a growarray to collect matches. (Yegappan Lakshmanan,
+ closes #9860)
+Files: src/buffer.c, src/cmdexpand.c, src/map.c,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.4484
+Problem: Vim9: some error messages are not tested.
+Solution: Add a few more test cases. Delete dead code.
+Files: src/vim9execute.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4485
+Problem: Compiler warning for uninitialized variable.
+Solution: Initialize the variable. (John Marriott)
+Files: src/cmdexpand.c
+
+Patch 8.2.4486
+Problem: MS-Windows GUI: slow scrolling with maximized window.
+Solution: Use a better way to check the window is on screen. (Ken Takata,
+ closes #9865)
+Files: src/gui_w32.c
+
+Patch 8.2.4487
+Problem: Vim9: cannot compare with v:null.
+Solution: Allow comparing anything with v:null. (closes #9866)
+Files: src/vim9instr.c, src/typval.c, src/proto/typval.pro,
+ src/vim9.h, src/vim9execute.c, src/evalvars.c,
+ src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4488 (after 8.2.4487)
+Problem: Build error with +eval but without +channel or +job.
+Solution: Add #ifdef. (John Marriott)
+Files: src/typval.c
+
+Patch 8.2.4489 (after 8.2.4487)
+Problem: Failing test for comparing v:null with number.
+Solution: Allow comparing v:null with number in legacy script.
+ (Ken Takata, closes #9873) Also do this for float.
+Files: src/typval.c, src/testdir/test_vimscript.vim
+
+Patch 8.2.4490
+Problem: Terminal focus reporting only works for xterm-like terminals.
+ (Jonathan Rascher)
+Solution: Remove the "focus_mode" flag. (closes #9859)
+Files: src/term.c
+
+Patch 8.2.4491
+Problem: MS-Windows makefile dependencies are outdated.
+Solution: Update dependencies. (Ken Takata, closes #9876)
+Files: src/Make_cyg_ming.mak, src/Make_mvc.mak
+
+Patch 8.2.4492
+Problem: No error if an option is given an invalid value with
+ ":let &opt = val".
+Solution: Give the error. (closes #9864)
+Files: src/evalvars.c, src/testdir/test_options.vim
+
+Patch 8.2.4493 (after 8.2.4492)
+Problem: Options test fails in the GUI.
+Solution: Do not save and restore 'term'.
+Files: src/testdir/gen_opt_test.vim
+
+Patch 8.2.4494
+Problem: The find_tags() function is much too long.
+Solution: Refactor the function. (Yegappan Lakshmanan, closes #9869)
+Files: src/quickfix.c, src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.2.4495
+Problem: Help test fails in 24 line terminal.
+Solution: Use up to 23 lines for text.
+Files: src/testdir/test_help.vim
+
+Patch 8.2.4496 (after 8.2.4494)
+Problem: Coverity gives warnings after tags code refactoring.
+Solution: Avoid the warnings. (Yegappan Lakshmanan, closes #9882)
+Files: src/tag.c
+
+Patch 8.2.4497
+Problem: Wrong color for half of wide character next to pum scrollbar.
+Solution: Redraw the screen cell with the right color. (closes #9874)
+Files: src/screen.c, src/testdir/test_ins_complete.vim,
+ src/testdir/dumps/Test_scrollbar_on_wide_char.dump
+
+Patch 8.2.4498
+Problem: Using <Plug> with "noremap" does not work.
+Solution: Always remap <Plug>. (closes #9879, closes #9789)
+Files: runtime/doc/map.txt, src/getchar.c, src/testdir/test_mapping.vim
+
+Patch 8.2.4499
+Problem: Vim9: at the script level declarations leak from try block to
+ catch and finally block.
+Solution: End the block and start a new one. (closes #9883)
+Files: src/ex_eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4500
+Problem: Vim9: can declare a global variable on the command line.
+Solution: Disallow declaring a variable on the command line. (closes #9881)
+Files: src/errors.h, src/evalvars.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/dumps/Test_vim9_reject_declaration.dump
+
+Patch 8.2.4501
+Problem: With 'showbreak' set and after the end of the line the cursor
+ may be displayed in the wrong position.
+Solution: Do not apply 'showbreak' after the end of the line. (closes #9884)
+Files: src/charset.c, src/testdir/test_breakindent.vim,
+ src/testdir/dumps/Test_cursor_position_with_showbreak.dump
+
+Patch 8.2.4502
+Problem: In the GUI a modifier is not recognized for the key typed after
+ CTRL-X, which may result in a mapping to be used. (Daniel
+ Steinberg)
+Solution: Recognize a modifier starting with CSI. (closes #9889)
+Files: src/getchar.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.4503
+Problem: Vim9: there is no point in supporting :Print and :mode.
+Solution: Do not recognize :Print and :mode as commands. (closes #9870)
+Files: src/ex_docmd.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4504
+Problem: When there is a partially matching map and modifyOtherKeys is
+ active a full map may not work.
+Solution: Only simplify modifiers when there is no matching mapping.
+ (closes #8792)
+Files: src/getchar.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.4505
+Problem: Vim9: outdated "autocmd nested" still works.
+Solution: Do not accept the :autocmd argument "nested" without "++" in Vim9
+ script.
+Files: src/autocmd.c, src/errors.h, src/testdir/test_autocmd.vim
+
+Patch 8.2.4506
+Problem: "pattern not found" for :global is not an error message.
+Solution: In Vim9 script make this an actual error, so that try/catch can be
+ used as expected.
+Files: src/ex_cmds.c, src/errors.h, src/testdir/test_global.vim
+
+Patch 8.2.4507 (after 8.2.4506)
+Problem: Test fails because of new error message.
+Solution: Avoid the test fails.
+Files: src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4508
+Problem: Vim9: cannot assign to a global variable on the command line.
+Solution: Allow using :vim9cmd for assignment on the command line.
+Files: src/evalvars.c, src/testdir/test_vim9_script.vim,
+ src/testdir/dumps/Test_vim9_reject_declaration.dump,
+ src/testdir/dumps/Test_vim9_reject_declaration_1.dump,
+ src/testdir/dumps/Test_vim9_reject_declaration_2.dump
+
+Patch 8.2.4509
+Problem: Vim9: can declare a variable with ":va".
+Solution: Disallow using ":va", require using ":var".
+Files: src/evalvars.c, src/errors.h, src/vim9compile.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4510
+Problem: Vim9: shortening commands leads to confusing script.
+Solution: In Vim9 script require at least ":cont" for ":continue", "const"
+ instead of "cons", "break" instead of "brea", "catch" instead of
+ "cat", "else" instead of "el" "elseif" instead of "elsei" "endfor"
+ instead of "endfo" "endif" instead of "en" "endtry" instead of
+ "endt", "finally" instead of "fina", "throw" instead of "th",
+ "while" instead of "wh".
+Files: src/ex_cmds.h, src/ex_docmd.c, src/errors.h, src/evalvars.c,
+ src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4511
+Problem: Filetype test fails.
+Solution: Change "endw" to "endwhile".
+Files: runtime/autoload/dist/ft.vim
+
+Patch 8.2.4512
+Problem: The find_tags_in_file() function is much too long.
+Solution: Refactor into multiple smaller functions. (Yegappan Lakshmanan,
+ closes #9892)
+Files: Filelist, src/Makefile, src/quickfix.c, src/tag.c,
+ src/testdir/test83-tags2, src/testdir/test83-tags3,
+ src/testdir/test_tagjump.vim
+
+Patch 8.2.4513
+Problem: Window-local directory is not applied if 'acd' fails.
+Solution: Don't call do_autochdir(). (closes #9891)
+Files: src/window.c, src/testdir/test_autochdir.vim
+
+Patch 8.2.4514
+Problem: Vim9: some flow commands can be shortened.
+Solution: Also require using the full name for ":return", ":enddef",
+ ":continue", ":export" and ":import".
+Files: src/ex_cmds.h, src/ex_docmd.c, src/errors.h, src/userfunc.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.4515
+Problem: Old substitute syntax is still supported.
+Solution: Disallow using backslash after ":s" in Vim9 script.
+Files: src/ex_cmds.c, src/errors.h, src/testdir/test_substitute.vim
+
+Patch 8.2.4516 (after 8.2.4515)
+Problem: Build failure without the +eval feature.
+Solution: Move error message outside of #ifdef.
+Files: src/errors.h
+
+Patch 8.2.4517
+Problem: MS-Windows: cannot specify location of sodium library.
+Solution: Allow for using a path for SODIUM. (Ken Takata, closes #9896)
+Files: src/Make_cyg_ming.mak
+
+Patch 8.2.4518
+Problem: The binary tag search feature is always enabled.
+Solution: Remove the #ifdefs. Add a few more tests. (Yegappan Lakshmanan,
+ closes #9893)
+Files: src/evalfunc.c, src/feature.h, src/tag.c, src/version.c,
+ src/testdir/test_tagjump.vim, src/testdir/test_taglist.vim
+
+Patch 8.2.4519
+Problem: Vim9: Can still use ":fini" and ":finis" for ":finish".
+Solution: Require using ":finish".
+Files: src/ex_cmds.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4520
+Problem: Using wrong highlight for cursor line number.
+Solution: Take filler lines into account when using CursorLineNr.
+ (closes #9897)
+Files: src/drawline.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_with_cursorline_number_01.dump,
+ src/testdir/dumps/Test_diff_with_cursorline_number_02.dump
+
+Patch 8.2.4521 (after 8.2.4520)
+Problem: Build failure without the +diff feature. (John Marriott)
+Solution: Define filler+lines if not declaring it.
+Files: src/drawline.c
+
+Patch 8.2.4522 (after 8.2.4492)
+Problem: GUI test fails with Motif. (Dominique Pellé)
+Solution: Remove using an invalid value for 'guifontset'.
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.4523
+Problem: When gvim is started maximized the 'window' option isn't set
+ properly. (Christian J. Robinson)
+Solution: Check if 'windows' was already set or not. (Ken Takata,
+ closes #9904)
+Files: src/term.c
+
+Patch 8.2.4524
+Problem: MS-Windows: cannot build with some sodium libraries.
+Solution: Make the DLL name configurable. Add build instructions.
+ (Ken Takata, closes #9905)
+Files: src/INSTALLpc.txt, src/Make_cyg_ming.mak, src/Make_mvc.mak,
+ src/crypt.c
+
+Patch 8.2.4525
+Problem: Some GUI tests don't work on Athena.
+Solution: Skip tests that won't work. (Yegappan Lakshmanan, closes #9902)
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.4526
+Problem: Vim9: cannot set variables to a null value.
+Solution: Add null_list, null_job, etc.
+Files: runtime/doc/vim9.txt, src/eval.c, src/proto/eval.pro,
+ src/vim9expr.c, src/vim9script.c, src/vim9instr.c,
+ src/vim9compile.c, src/vim9execute.c, src/vim9.h, src/vim9type.c,
+ src/evalvars.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_expr.vim
+
+Patch 8.2.4527
+Problem: The Athena GUI is old and does not work well.
+Solution: Remove the Athena GUI from configure to find out who still wants
+ support for this GUI.
+Files: src/configure.ac, src/auto/configure, src/Makefile
+
+Patch 8.2.4528
+Problem: Crash when using null_function for a partial.
+Solution: Don't call fname_trans_sid() with NULL. (closes #9908)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4529
+Problem: Vim9: comparing partial with function fails.
+Solution: Support this comparison. Avoid a crash. (closes #9909)
+ Add more test cases.
+Files: src/vim9instr.c, src/userfunc.c, src/vim9type.c,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vimscript.vim
+
+Patch 8.2.4530
+Problem: Making comparison with null work changes legacy behavior.
+Solution: Only use the better comparison in Vim9 script. (closes #9910)
+Files: src/typval.c, src/testdir/test_expr.vim
+
+Patch 8.2.4531
+Problem: LGTM warnings for condition always true and buffer size too small.
+Solution: Remove the useless condition. Make the buffer larger. (Goc
+ Dundar, closes #9914)
+Files: src/charset.c, src/term.c
+
+Patch 8.2.4532
+Problem: Suspending with CTRL-Z does not work on OpenBSD.
+Solution: Adjust #ifdef for SIGTSTP. (Stuart Henderson, closes #9912)
+Files: src/os_unix.c
+
+Patch 8.2.4533
+Problem: Vim9: no test that after assigning null the type is still checked.
+Solution: Add a test.
+Files: src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4534
+Problem: Vim9: "is" operator with empty string and null returns true.
+Solution: Consider empty string and null to be different for "is".
+Files: src/typval.c, src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4535
+Problem: Filename modifier ":8" removes the filename.
+Solution: Use strncpy() instead of vim_strncpy(). (Christian Brabandt,
+ closes #9918, closes #8600)
+Files: src/filepath.c, src/testdir/test_shortpathname.vim
+
+Patch 8.2.4536 (after 8.2.4534)
+Problem: Debugger test fails when breaking on expression.
+Solution: Compare strings with "==" instead of "is".
+Files: src/debugger.c
+
+Patch 8.2.4537
+Problem: Output from linter and language server shows up in git.
+Solution: Add patterns to .gitignore. (Goc Dundar, closes #9925)
+Files: .gitignore
+
+Patch 8.2.4538
+Problem: The find_tags_in_file() function is too long.
+Solution: Refactor into smaller functions. (Yegappan Lakshmanan,
+ closes #9920)
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.2.4539
+Problem: When comparing special v:none and v:null are handled the same when
+ compiling.
+Solution: Pass more information so that v:none can be handled differently at
+ compile time. (issue #9923)
+Files: src/vim9instr.c, src/vim9compile.c, src/globals.h,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4540
+Problem: Line number for error is off by one.
+Solution: Remember the line number of the comparison. (closes #9923)
+Files: src/eval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4541
+Problem: Crash in debugger when a variable is not available in the current
+ block.
+Solution: Check for a NULL name. (closes #9926)
+Files: src/vim9execute.c, src/testdir/test_debugger.vim
+
+Patch 8.2.4542
+Problem: Vim9: "break" inside try/catch not handled correctly.
+Solution: First jump to :endtry. (closes #9927)
+Files: src/vim9cmds.c, src/vim9.h, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4543
+Problem: Coverity warning for refactored tag search code.
+Solution: Avoid the warnings. Update comments. Add one more test case.
+ (Yegappan Lakshmanan, closes #9928)
+Files: src/tag.c, src/testdir/test_tagjump.vim
+
+Patch 8.2.4544
+Problem: Coverity warnings for not using returned value.
+Solution: Assign to vim_ignored.
+Files: src/tag.c
+
+Patch 8.2.4545
+Problem: MS-Windows: the installed icon is low resolution.
+Solution: Use a better icon. Install vim.ico. (Christian Brabandt,
+ closes #9931, closes #9930)
+Files: Filelist, nsis/gvim.nsi, src/vim.ico, runtime/bitmaps/vim.ico
+
+Patch 8.2.4546
+Problem: Duplicate #undef.
+Solution: Remove one #undef. (closes #9932)
+Files: src/regexp_nfa.c
+
+Patch 8.2.4547
+Problem: The neXTaw GUI is old and does not work well.
+Solution: Remove the neXTaw GUI from configure to find out who still wants
+ support for this GUI.
+Files: src/configure.ac, src/auto/configure, src/Makefile
+
+Patch 8.2.4548
+Problem: Script-local function is deleted when used in a funcref.
+Solution: Do not consider a function starting with "<SNR>" reference
+ counted. (closes #9916, closes #9820)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4549
+Problem: Cannot build with Motif and editres. (Tony Mechelynck)
+Solution: Fix configure mistake.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.4550
+Problem: Motif: cannot set the color of the scrollbar thumb.
+Solution: Remove #ifdef.
+Files: src/gui_motif.c
+
+Patch 8.2.4551
+Problem: When mapping <Esc> terminal codes are not recognized.
+Solution: Specifically recognize a mapping with just <Esc> and check for
+ terminal codes even though there is no partial mapping.
+ (closes #9903)
+Files: src/getchar.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.4552
+Problem: In a :def function "put = expr" does not work.
+Solution: Skip over white space. (closes #9936)
+Files: src/vim9cmds.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4553
+Problem: Linear tag search is a bit slow.
+Solution: Remove a vim_ftell() call. (Yegappan Lakshmanan, closes #9937)
+Files: src/tag.c, src/testdir/test_taglist.vim
+
+Patch 8.2.4554
+Problem: Vim9: using null values not sufficiently tested.
+Solution: Add more tests. Fix uncovered problem.
+Files: src/vim9type.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.4555
+Problem: getmousepos() returns the wrong column. (Ernie Rael)
+Solution: Limit to the text size, not the number of bytes.
+Files: src/mouse.c, src/testdir/test_functions.vim
+
+Patch 8.2.4556
+Problem: Test fails without the +job or +channel feature. (Dominique Pellé)
+Solution: Adjust #ifdefs. Pass on skip flag. (closes #9942)
+Files: src/eval.c, src/vim9compile.c
+
+Patch 8.2.4557
+Problem: Confusing comment about 'cursorlineopt'.
+Solution: Adjust comment. (closes #9939) Add parenthesis around logical
+ OR.
+Files: src/drawline.c
+
+Patch 8.2.4558
+Problem: Motif: using default colors does not work as expected.
+Solution: Do not try to store the default colors, use the resources.
+ (closes #9933)
+Files: src/gui_motif.c, src/gui.h
+
+Patch 8.2.4559 (after 8.24555)
+Problem: getmousepos() returns the screen column. (Ernie Rael)
+Solution: Return the text column, as documented.
+Files: src/mouse.c, src/testdir/test_functions.vim
+
+Patch 8.2.4560
+Problem: Suspending with CTRL-Z does not work on DragonFlyBSD.
+Solution: Adjust #ifdef. (Ozaki Kiichi, closes #9943)
+Files: src/os_unix.c
+
+Patch 8.2.4561
+Problem: Build failure with some combination of features. (John Marriott)
+Solution: Adjust #ifdef.
+Files: src/mouse.c
+
+Patch 8.2.4562
+Problem: Linear tag search is not optimal.
+Solution: Improve linear tag search performance. (Yegappan Lakshmanan,
+ closes #9944)
+Files: src/tag.c
+
+Patch 8.2.4563
+Problem: "z=" in Visual mode may go beyond the end of the line.
+Solution: Adjust "badlen".
+Files: src/spellsuggest.c, src/testdir/test_spell.vim
+
+Patch 8.2.4564
+Problem: Running test leaves file behind. (Dominique Pellé)
+Solution: Run the profiling in a separate Vim instance. (closes #9952)
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.4565
+Problem: No command line completion for :breakadd and :breakdel.
+Solution: Add completion for :breakadd and :breakdel. (Yegappan Lakshmanan,
+ closes #9950)
+Files: runtime/doc/builtin.txt, src/cmdexpand.c, src/spellsuggest.c,
+ src/usercmd.c, src/vim.h, src/testdir/test_cmdline.vim,
+ src/testdir/test_writefile.vim
+
+Patch 8.2.4566
+Problem: Check for existing buffer in session file does not work for files
+ in the home directory.
+Solution: Use fnamemodify(). (James Cherti, closes #9945) Add a test.
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.4567
+Problem: Bracketed paste doesn't work well in Visual linewise mode.
+Solution: Handle linewise Visual mode differently. (closes #9947)
+Files: src/normal.c, src/testdir/test_paste.vim
+
+Patch 8.2.4568
+Problem: getmousepos() does not compute the column below the last line.
+Solution: Also compute the column when the mouse is below the last line.
+ (Sean Dewar, closes #9946)
+Files: src/mouse.c, src/testdir/test_functions.vim
+
+Patch 8.2.4569
+Problem: Coverity warning for not using a return value.
+Solution: Add "(void)".
+Files: src/popupwin.c
+
+Patch 8.2.4570
+Problem: No command line completion for :profile and :profdel.
+Solution: Implement completion. (Yegappan Lakshmanan, closes #9955)
+Files: src/cmdexpand.c, src/profiler.c, src/testdir/test_cmdline.vim,
+ src/testdir/test_profile.vim
+
+Patch 8.2.4571
+Problem: Not all gdb files are recognized.
+Solution: Add a few more patterns for gdb. (Jade Lovelace, closes #9956)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4572
+Problem: Vim9: return type "any" is sometimes changed to first returned
+ type. (Virginia Senioria)
+Solution: Do not change the return type if declared as "any". (closes #9949)
+Files: src/vim9cmds.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4573
+Problem: A nested function (closure) is compiled for debugging without
+ context.
+Solution: Check if a nested function is marked for debugging before
+ compiling it. Give an error when trying to compile a closure
+ without its context. (closes #9951)
+Files: src/vim9compile.c, src/vim9execute.c, src/proto/vim9execute.pro,
+ src/vim9expr.c, src/errors.h
+
+Patch 8.2.4574
+Problem: Vim9: test for profiling fails.
+Solution: Mark function for profiling earlier to avoid E1271.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.4575
+Problem: Vim9: test for profiling still fails.
+Solution: Update flags for profiling and breakpoints when obtaining the
+ compile type. Do not set the FC_CLOSURE flag for a toplevel
+ function.
+Files: src/vim.h, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/eval.c, src/vim9execute.c, src/vim9expr.c, src/vim9instr.c,
+ src/vim9.h
+
+Patch 8.2.4576
+Problem: Vim9: error for comparing with null can be annoying.
+Solution: Allow comparing anything with null. (closes #9948)
+Files: src/vim9instr.c, src/typval.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4577
+Problem: Message test is flaky. (Elimar Riesebieter)
+Solution: Trigger the autocommand event only after startup is finished.
+Files: src/testdir/test_messages.vim
+
+Patch 8.2.4578
+Problem: No warning when an autoload script for completion function has an
+ error.
+Solution: Do not ignore errors when a function name is given with a dot or
+ '#' character. (closes #9958)
+Files: src/eval.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4579
+Problem: Cannot use page-up and page-down in the command line completion
+ popup menu.
+Solution: Check for to page-up and page-down keys. (Yegappan Lakshmanan,
+ closes #9960)
+Files: src/cmdexpand.c, src/ex_getln.c, src/spellsuggest.c, src/vim.h,
+ src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_pum_42.dump,
+ src/testdir/dumps/Test_wildmenu_pum_43.dump,
+ src/testdir/dumps/Test_wildmenu_pum_44.dump,
+ src/testdir/dumps/Test_wildmenu_pum_45.dump,
+ src/testdir/dumps/Test_wildmenu_pum_46.dump,
+ src/testdir/dumps/Test_wildmenu_pum_47.dump,
+ src/testdir/dumps/Test_wildmenu_pum_48.dump,
+ src/testdir/dumps/Test_wildmenu_pum_49.dump,
+ src/testdir/dumps/Test_wildmenu_pum_50.dump
+
+Patch 8.2.4580
+Problem: Vim9: incorrect error for shadowing variable.
+Solution: Do not pass the context when compiling a referenced function.
+Files: src/vim9expr.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4581
+Problem: Null types not fully tested.
+Solution: Add some more tests using null types.
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4582
+Problem: Useless code handling a type declaration.
+Solution: Remove the code and give an error.
+Files: src/eval.c, src/errors.h, src/testdir/test_vim9_script.vim,
+ src/testdir/dumps/Test_misplaced_type.dump
+
+Patch 8.2.4583 (after 8.2.4582)
+Problem: Screendump test fails.
+Solution: Check that making a screendump is possible.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.4584 (after 8.2.4578)
+Problem: Error for using autoload function in custom completion.
+Solution: Do not check for errors when using an autoload function.
+ (closes #9962)
+Files: src/eval.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4585
+Problem: Cannot use keypad page-up/down for completion menu.
+Solution: Recognize the keypad keys. (Yegappan Lakshmanan, closes #9963)
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4586
+Problem: Vim9: no error for using lower case name for "func" argument.
+ (Ernie Rael)
+Solution: Check the name as soon as the type is known.
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4587
+Problem: Vim9: double free after unpacking a list.
+Solution: Make a copy of the value instead of moving it. (closes #9968)
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4588
+Problem: Mapping with key code after other matching mapping does not work.
+Solution: Change ">" to ">=". (closes #9903)
+Files: src/getchar.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.4589
+Problem: Cannot index the g: dictionary.
+Solution: Recognize using "g:[key]". (closes #9969)
+Files: src/ex_docmd.c, src/eval.c, src/vim9compile.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4590
+Problem: Vim9: range type check has wrong offset.
+Solution: Adjust offset for CHECKTYPE. Remove other type check.
+Files: src/vim9compile.c, src/vim9execute.c,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4591
+Problem: Cursor line not updated when a callback moves the cursor.
+Solution: Check if the cursor moved. (closes #9970)
+Files: src/main.c, src/drawscreen.c, src/proto/drawscreen.pro,
+ src/testdir/test_cursorline.vim,
+ src/testdir/dumps/Test_cursorline_callback_1.dump
+
+Patch 8.2.4592
+Problem: Search continues after giving E1204.
+Solution: Return failure after giving E1204. (closes #9972)
+Files: src/regexp_nfa.c
+
+Patch 8.2.4593
+Problem: Unnecessary call to redraw_later().
+Solution: Remove the call to redraw_later() in op_yank(). (closes #9971)
+Files: src/register.c
+
+Patch 8.2.4594
+Problem: Need to write script to a file to be able to source them.
+Solution: Make ":source" use lines from the current buffer. (Yegappan
+ Lakshmanan et al., closes #9967)
+Files: runtime/doc/repeat.txt, runtime/doc/todo.txt, src/alloc.c,
+ src/digraph.c, src/eval.c, src/ex_cmds.h, src/scriptfile.c,
+ src/proto/scriptfile.pro, src/vim9script.c,
+ src/testdir/test_source.vim
+
+Patch 8.2.4595
+Problem: X11: using --remote-wait may keep the CPU busy.
+Solution: Set the timeout for select() on every call. (Jacopo Secchiero,
+ closes #9973)
+Files: src/if_xcmdsrv.c
+
+Patch 8.2.4596
+Problem: Installing tutor binary may fail.
+Solution: Fix the dependency. (Sergei Trofimovich, closes #9978)
+Files: src/Makefile
+
+Patch 8.2.4597
+Problem: LuaV_debug() not covered by tests.
+Solution: Add a test. (Dominique Pellé, closes #9980)
+Files: src/testdir/test_lua.vim
+
+Patch 8.2.4598
+Problem: Profile completion test sometimes fails.
+Solution: Delete the .res file before running tests.
+Files: src/testdir/runtest.vim
+
+Patch 8.2.4599
+Problem: GTK: get assertion errors when scrolling a split window.
+Solution: Use GDK_IS_DRAWABLE() on the scrollbar window. (closes #9982)
+Files: src/gui_gtk.c
+
+Patch 8.2.4600
+Problem: Vim9: not enough test coverage for executing :def function.
+Solution: Add a few more tests. Fix inconsistencies.
+Files: src/vim9execute.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/testdir/test_listdict.vim, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4601
+Problem: Vim9: not enough test coverage for executing :def function.
+Solution: Add a few more tests.
+Files: src/testdir/test_vim9_script.vim, src/testdir/test_vim9_func.vim,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4602
+Problem: Vim9: not enough test coverage for executing :def function.
+Solution: Add a few more tests. Fix uncovered problem. Remove dead code.
+Files: src/vim9execute.c, src/vim9.h, src/vim9instr.c,
+ src/proto/vim9instr.pro, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4603
+Problem: Sourcing buffer lines is too complicated.
+Solution: Simplify the code. Make it possible to source Vim9 script lines.
+ (Yegappan Lakshmanan, closes #9974)
+Files: runtime/doc/repeat.txt, src/ex_docmd.c, src/proto/scriptfile.pro,
+ src/scriptfile.c, src/structs.h, src/testdir/test_source.vim
+
+Patch 8.2.4604
+Problem: Error for redefining a script item may be confusing.
+Solution: Put quotes around the name.
+Files: src/errors.h
+
+Patch 8.2.4605
+Problem: Error for arguments of remote_expr() even when the +clientserver
+ feature is not included.
+Solution: Move #ifdef.
+Files: src/clientserver.c
+
+Patch 8.2.4606 (after 8.2.4605)
+Problem: Test fails because of changed error message.
+Solution: Update the expected error message
+Files: src/testdir/test_vim9_import.vim
+
+Patch 8.2.4607
+Problem: Sourcing buffer lines may lead to errors for conflicts.
+Solution: Add the ++clear argument. (Yegappan Lakshmanan, closes #9991)
+Files: runtime/doc/repeat.txt, src/scriptfile.c, src/vim9script.c,
+ src/proto/vim9script.pro, src/testdir/test_source.vim
+
+Patch 8.2.4608
+Problem: getcompletion() does not work properly when 'wildoptions'
+ contains "fuzzy".
+Solution: Do not use addstar(). (Yegappan Lakshmanan, closes #9992,
+ closes #9986)
+Files: runtime/doc/builtin.txt, src/cmdexpand.c,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.4609
+Problem: :unhide does not check for failing to close a window.
+Solution: When closing a window fails continue with the next one. Do not
+ try closing the autocmd window. (closes #9984)
+Files: src/buffer.c, src/window.c, src/proto/window.pro,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.4610
+Problem: Some conditions are always true.
+Solution: Remove the useless conditions. (closes #9993)
+Files: src/clientserver.c, src/drawline.c, src/drawscreen.c,
+ src/ex_cmds.c, src/fileio.c, src/message.c, src/misc2.c,
+ src/ops.c, src/sign.c, src/spell.c, src/vim9cmds.c, src/window.c
+
+Patch 8.2.4611
+Problem: Typos in tests; one lua line not covered by test.
+Solution: Fix typos. Add test case. (Dominique Pellé, closes #9994)
+Files: src/testdir/test_breakindent.vim, src/testdir/test_crypt.vim,
+ src/testdir/test_cursorline.vim, src/testdir/test_digraph.vim,
+ src/testdir/test_gui.vim, src/testdir/test_lua.vim,
+ src/testdir/test_regexp_latin.vim, src/testdir/test_signals.vim,
+ src/testdir/test_spell.vim, src/testdir/test_statusline.vim,
+ src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim, src/testdir/test_vimscript.vim
+
+Patch 8.2.4612
+Problem: Vim9: cannot use a recursive call in a nested function. (Sergey
+ Vlasov)
+Solution: Define the funcref before compiling the function. (closes #9989)
+Files: src/vim9compile.c, src/vim9instr.c, src/proto/vim9instr.pro,
+ src/vim9expr.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4613
+Problem: Return type of swapfile_unchanged() is wrong.
+Solution: Use "int". (closes #10000 Yeah!)
+Files: src/memline.c
+
+Patch 8.2.4614
+Problem: Redrawing too much when 'cursorline' is set and jumping around.
+Solution: Rely on win_update() to redraw the current and previous cursor
+ line, do not mark lines as modified. (closes #9996)
+Files: src/drawline.c, src/drawscreen.c, src/move.c, src/proto/move.pro,
+ src/option.c
+
+Patch 8.2.4615
+Problem: Mapping with escaped bar does not work in :def function. (Sergey
+ Vlasov)
+Solution: Do not remove the backslash. (closes #10002)
+Files: src/ex_docmd.c, src/proto/ex_docmd.pro, src/syntax.c,
+ src/vim9cmds.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4616
+Problem: Vim9: Declarations in a {} block of a user command do not use Vim9
+ rules if defined in a legacy script. (Yegappan Lakshmanan)
+Solution: Pretend the script is Vim9 script.
+Files: src/usercmd.c, src/testdir/test_usercommands.vim
+
+Patch 8.2.4617
+Problem: No completion for :scriptnames.
+Solution: Implement :scriptnames completion. (Yegappan Lakshmanan,
+ closes #10005)
+Files: runtime/doc/builtin.txt, src/cmdexpand.c, src/ex_cmds.h,
+ src/scriptfile.c, src/usercmd.c, src/vim.h,
+ src/testdir/test_cmdline.vim, src/testdir/test_quickfix.vim
+
+Patch 8.2.4618
+Problem: Command line completion does not recognize single letter commands.
+Solution: Use the condition from find_ex_command().
+Files: src/ex_docmd.c
+
+Patch 8.2.4619
+Problem: Mapping is cancelled when mouse moves and popup is visible.
+Solution: Only generate mouse moved events when a popup may use them.
+ (closes #10004)
+Files: src/gui.c, src/globals.h, src/popupwin.c
+
+Patch 8.2.4620 (after 8.2.4618)
+Problem: Two letter substitute commands don't work. (Yegappan Lakshmanan)
+Solution: Invert condition.
+Files: src/ex_docmd.c
+
+Patch 8.2.4621
+Problem: Crash when using the tabline right-click menu.
+Solution: Use XtPointer for XmNuserData. (closes #10009)
+Files: src/gui_motif.c
+
+Patch 8.2.4622
+Problem: Vim9: Crash with :execute and :finish. (Sergey Vlasov)
+Solution: Check for NULL. (closes #10011)
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4623
+Problem: Coverity warns for using uninitialized field.
+Solution: Initialize the field to zero.
+Files: src/ex_docmd.c
+
+Patch 8.2.4624
+Problem: Old Coverity warning for resource leak.
+Solution: Close the file if memory allocation fails.
+Files: src/diff.c
+
+Patch 8.2.4625
+Problem: Old Coverity warning for resource leak.
+Solution: Call FreeWild() if expanding matches did not fail.
+Files: src/help.c
+
+Patch 8.2.4626
+Problem: Visual area not fully updated when removing sign in Visual mode
+ while scrolling.
+Solution: Adjust check for topline. (closes #10017)
+Files: src/drawscreen.c, src/testdir/test_display.vim,
+ src/testdir/dumps/Test_display_scroll_update_visual.dump
+
+Patch 8.2.4627
+Problem: flatten() does not use maxdepth correctly.
+Solution: Use a recursive implementation. (closes #10020)
+Files: src/list.c, src/testdir/test_flatten.vim
+
+Patch 8.2.4628
+Problem: Not enough testing for 2/3 letter substitute commands.
+Solution: Add more tests. (Yegappan Lakshmanan, closes #10019)
+Files: src/testdir/test_cmdline.vim, src/testdir/test_substitute.vim
+
+Patch 8.2.4629
+Problem: flattennew() makes a deep copy unnecessarily.
+Solution: Use a shallow copy. (issue #10012)
+Files: src/list.c
+
+Patch 8.2.4630
+Problem: 'cursorline' not always updated with 'cursorlineopt' is
+ "screenline".
+Solution: Call check_redraw_cursorline() more often. (closes #10013)
+Files: src/normal.c, src/edit.c, src/testdir/test_cursorline.vim,
+ src/testdir/dumps/Test_cursorline_screenline_1.dump,
+ src/testdir/dumps/Test_cursorline_screenline_2.dump
+
+Patch 8.2.4631
+Problem: Crash when switching window in BufWipeout autocommand.
+Solution: Put any buffer in the window to avoid it being NULL.
+ (closes #10024)
+Files: src/window.c, src/buffer.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.4632
+Problem: Using freed memory in flatten().
+Solution: Clear typval after recursing into list.
+Files: src/list.c
+
+Patch 8.2.4633
+Problem: Visual range does not work before command modifiers.
+Solution: Move Visual range to after command modifiers.
+Files: src/ex_docmd.c, src/testdir/test_source.vim
+
+Patch 8.2.4634
+Problem: Vim9: cannot initialize a variable to null_list.
+Solution: Give negative count to NEWLIST. (closes #10027)
+ Also fix inconsistencies in comparing with null values.
+Files: src/vim9instr.c, src/proto/vim9instr.pro, src/vim9.h,
+ src/vim9compile.c, src/vim9expr.c, src/vim9execute.c,
+ src/evalvars.c, src/typval.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4635 (after 8.2.4634)
+Problem: Tests using null list or dict fail.
+Solution: Only use the new rules for Vim9 script.
+Files: src/evalvars.c
+
+Patch 8.2.4636 (after 8.2.4633)
+Problem: Not using Visual range.
+Solution: Put the command pointer back to the range.
+Files: src/ex_docmd.c
+
+Patch 8.2.4637
+Problem: Warning for using uninitialized variable. (Tony Mechelynck)
+Solution: Initialize it.
+Files: src/ex_docmd.c
+
+Patch 8.2.4638
+Problem: Superfluous check if a redraw is needed for 'cursorline'.
+Solution: Remove check_redraw_cursorline(). (closes #10030, closes #10029)
+Files: src/drawscreen.c, src/proto/drawscreen.pro, src/edit.c,
+ src/main.c, src/normal.c, src/move.c,
+ src/testdir/dumps/Test_cursorcolumn_callback_1.dump,
+ src/testdir/dumps/Test_relativenumber_callback_1.dump,
+ src/testdir/test_highlight.vim, src/testdir/test_number.vim
+
+Patch 8.2.4639
+Problem: Not sufficient parenthesis in preprocessor macros.
+Solution: Add more parenthesis. (closes #10031)
+Files: src/globals.h, src/gui.h, src/if_py_both.h, src/macros.h,
+ src/option.h, src/regexp.h, src/spell.h, src/structs.h, src/vim.h,
+ src/vim9.h
+
+Patch 8.2.4640
+Problem: Some boolean options use "long" instead of "int".
+Solution: Adjust the type. (James McCoy, closes #10033)
+Files: src/option.h
+
+Patch 8.2.4641
+Problem: May mark the wrong window for redrawing.
+Solution: Use redraw_win_later(). (closes #10032)
+Files: src/move.c
+
+Patch 8.2.4642
+Problem: Vim9: in :def function script var cannot be null.
+Solution: Only initialize a script variable when not set to a null value.
+ (closes #10034)
+Files: src/vim9execute.c, src/vim9type.c, src/globals.h, src/evalvars.c,
+ src/vim.h, src/vim9script.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4643
+Problem: Vim9: variable may be locked unintentionally.
+Solution: Clear "v_lock". (closes #10036)
+Files: src/vim9execute.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4644
+Problem: Redrawing too often when 'relativenumber' is set.
+Solution: Only redraw when the cursor line changed. (Lewis Russell,
+ closes #10040)
+Files: src/change.c, src/drawscreen.c, src/structs.h
+
+Patch 8.2.4645
+Problem: 'shortmess' changed when session does not store options.
+Solution: Save and restore 'shortmess' if needed. (James Cherti,
+ closes #10037)
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.4646
+Problem: Using buffer line after it has been freed in old regexp engine.
+Solution: After getting mark get the line again.
+Files: src/regexp_bt.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.2.4647
+Problem: "source" can read past end of copied line.
+Solution: Add a terminating NUL.
+Files: src/scriptfile.c, src/testdir/test_source.vim
+
+Patch 8.2.4648
+Problem: Handling LSP messages is a bit slow.
+Solution: Included support for LSP messages. (Yegappan Lakshmanan,
+ closes #10025)
+Files: runtime/doc/channel.txt, src/channel.c, src/job.c, src/json.c,
+ src/proto/json.pro, src/structs.h, src/testdir/test_channel.vim,
+ src/testdir/test_channel_lsp.py
+
+Patch 8.2.4649
+Problem: Various formatting problems.
+Solution: Improve the code formatting.
+Files: src/mark.c, src/quickfix.c, src/regexp_nfa.c, src/register.c,
+ src/testdir/test_filechanged.vim, src/gui_athena.c,
+ src/gui_motif.c, src/os_unix.c
+
+Patch 8.2.4650
+Problem: "import autoload" only works with using 'runtimepath'.
+Solution: Also support a relative and absolute file name.
+Files: runtime/doc/vim9.txt, src/structs.h, src/scriptfile.c,
+ src/proto/scriptfile.pro, src/vim9script.c, src/vim9expr.c,
+ src/vim9.h, src/vim9execute.c, src/vim9instr.c,
+ src/proto/vim9instr.pro, src/vim.h, src/userfunc.c,
+ src/proto/userfunc.pro, src/testdir/test_vim9_import.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4651 (after 8.2.4650)
+Problem: Test fails because path differs.
+Solution: Only compare the tail of the path.
+Files: src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4652 (after 8.2.4650)
+Problem: Leaking memory if assignment fails.
+Solution: Clear assigned value on failure.
+Files: src/vim9execute.c
+
+Patch 8.2.4653
+Problem: "import autoload" does not check the file name.
+Solution: Give an error if the file is not readable. (closes #10049)
+Files: src/filepath.c, src/proto/filepath.pro, src/errors.h,
+ src/ex_cmds.c, src/ex_docmd.c, src/spellfile.c,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4654 (after 8.2.4653)
+Problem: Missing changes for import check.
+Solution: Add missing changes.
+Files: src/vim9script.c
+
+Patch 8.2.4655
+Problem: Command line completion popup menu positioned wrong when using a
+ terminal window.
+Solution: Position the popup menu differently when editing the command line.
+ (Yegappan Lakshmanan, closes #10050, closes #10035)
+Files: src/popupmenu.c, src/testdir/test_cmdline.vim,
+ src/testdir/test_terminal.vim,
+ src/testdir/dumps/Test_wildmenu_pum_term_01.dump
+
+Patch 8.2.4656
+Problem: Vim9: can't use items from "import autoload" with autoload
+ directory name.
+Solution: Let sn_autoload_prefix overrule sn_import_autoload.
+ (closes #10054)
+Files: src/structs.h, src/vim9instr.c, src/vim9expr.c, src/vim9script.c,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4657
+Problem: Errors for functions are sometimes hard to read.
+Solution: Use printable_func_name() in more places.
+Files: src/vim9execute.c, src/userfunc.c, src/proto/userfunc.pro,
+ src/vim9expr.c, src/eval.c, src/vim9instr.c, src/vim9type.c,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4658
+Problem: Org-mode files are not recognized.
+Solution: Add patterns to recognize "org" files. (closes #10046)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4659
+Problem: Invalid memory access when using printable function name.
+Solution: Adjust copied name length.
+Files: src/userfunc.c
+
+Patch 8.2.4660
+Problem: Cursorcolumn is sometimes not correct.
+Solution: Recompute the cursor column when entering Insert mode and the
+ cursor is on a character wider than a screen cell. (closes #10057)
+Files: src/edit.c, src/testdir/test_highlight.vim,
+ src/testdir/dumps/Test_cursorcolumn_insert_on_tab_1.dump,
+ src/testdir/dumps/Test_cursorcolumn_insert_on_tab_2.dump
+
+Patch 8.2.4661
+Problem: Coverity warning for using uninitialized variable.
+Solution: Initialize variable to NULL.
+Files: src/vim9expr.c
+
+Patch 8.2.4662
+Problem: No error for using out of range list index.
+Solution: Check list index at script level like in compiled function.
+ (closes #10051)
+Files: src/vim.h, src/evalvars.c, src/list.c, src/proto/list.pro,
+ src/eval.c, src/vim9execute.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4663
+Problem: Occasional crash when running the GUI tests.
+Solution: Check that the line index is not too high. (closes #8681)
+Files: src/screen.c
+
+Patch 8.2.4664
+Problem: Elvish files are not recognized.
+Solution: Recognize .elv files. (Bruno Roque, closes #10058)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4665
+Problem: Popup with "minwidth" and scrollbar not updated properly.
+Solution: Adjust the computation if the window width. (closes #10061)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_previewpopup_4.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_5.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_7.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_8.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_9.dump,
+ src/testdir/dumps/Test_popupwin_previewpopup_10.dump,
+ src/testdir/dumps/Test_popupwin_drag_minwidth_1.dump,
+ src/testdir/dumps/Test_popupwin_drag_minwidth_2.dump,
+ src/testdir/dumps/Test_popupwin_drag_minwidth_3.dump
+
+Patch 8.2.4666
+Problem: Vim9: assignment not recognized in skipped block.
+Solution: When skipping assume identifier exists. (closes #10059)
+Files: src/vim9compile.c, src/proto/vim9compile.pro, src/vim9cmds.c,
+ src/testdir/test_vim9_cmd.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4667
+Problem: expandcmd() fails on an error.
+Solution: On failure return the command unmodified. (Yegappan Lakshmanan,
+ closes #10063)
+Files: runtime/doc/builtin.txt, src/evalfunc.c,
+ src/testdir/test_expand.vim
+
+Patch 8.2.4668
+Problem: Buffer allocation failures insufficiently tested.
+Solution: Add tests for memory allocation failures. (Yegappan Lakshmanan,
+ closes #10064)
+Files: src/alloc.h, src/buffer.c, src/popupwin.c, src/window.c,
+ src/testdir/test_buffer.vim, src/testdir/test_swap.vim
+
+Patch 8.2.4669
+Problem: In compiled code len('string') is not inlined.
+Solution: Compute the length at compile time if possible. (closes #10065)
+Files: src/evalfunc.c, src/proto/evalfunc.pro, src/vim9expr.c,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4670
+Problem: Memory allocation failures for new tab page not tested.
+Solution: Add tests with failing memory allocation. (Yegappan Lakshmanan,
+ closes #10067)
+Files: src/alloc.h, src/blob.c, src/buffer.c, src/window.c,
+ src/testdir/test_blob.vim, src/testdir/test_buffer.vim,
+ src/testdir/test_tabpage.vim, src/testdir/test_window_cmd.vim
+
+Patch 8.2.4671
+Problem: 'wildignorecase' is sometimes not used for glob().
+Solution: Also use 'wildignorecase' when there are no wildcards.
+ (closes #10066, closes #8350)
+Files: src/filepath.c, src/testdir/test_functions.vim
+
+Patch 8.2.4672
+Problem: Using :normal with Ex mode may make :substitute hang.
+Solution: When getting an empty line behave like 'q' was typed.
+ (closes #10070)
+Files: src/ex_cmds.c, src/testdir/test_normal.vim
+
+Patch 8.2.4673
+Problem: Redrawing a vertically split window is slow when using CTRL-F and
+ CTRL-B.
+Solution: When deciding on USE_REDRAW bail out if scrolling more than three
+ lines. (issue #8002)
+Files: src/screen.c
+
+Patch 8.2.4674
+Problem: Cannot force getting MouseMove events.
+Solution: Add the 'mousemoveevent' option with implementation for the GUI.
+ (Ernie Rael, closes #10044)
+Files: runtime/doc/gui.txt, runtime/doc/options.txt,
+ runtime/doc/testing.txt, src/gui.c, src/option.h,
+ src/optiondefs.h, src/testing.c, src/testdir/test_gui.vim
+
+Patch 8.2.4675
+Problem: No error for missing expression after :elseif. (Ernie Rael)
+Solution: Check for missing expression. (closes #10068)
+Files: src/ex_eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4676 (after 8.2.4675)
+Problem: Test fails with different error.
+Solution: Add argument to :elseif.
+Files: src/testdir/test_vimscript.vim
+
+Patch 8.2.4677
+Problem: The Athena GUI support is outdated.
+Solution: Remove the Athena GUI code.
+Files: Filelist, src/Makefile, src/proto.h, src/clipboard.c,
+ src/gui_athena.c, src/proto/gui_athena.pro, src/gui_at_sb.c,
+ src/gui_at_sb.h, src/gui_at_fs.c, src/gui_motif.c, src/evalfunc.c,
+ src/gui.c, src/gui_beval.c, src/gui_x11.c, src/if_mzsch.c,
+ src/main.c, src/menu.c, src/mouse.c, src/version.c, src/feature.h,
+ src/gui.h, src/structs.h, src/vim.h, src/testdir/gui_init.vim,
+ src/testdir/setup_gui.vim, src/testdir/test_clientserver.vim,
+ src/testdir/test_edit.vim, src/testdir/test_gui.vim,
+ src/testdir/test_highlight.vim, src/testdir/test_quotestar.vim,
+ src/testdir/test_startup.vim, runtime/doc/gui.txt,
+ runtime/doc/gui_x11.txt
+
+Patch 8.2.4678
+Problem: Vim9: not all code is tested.
+Solution: Add a few more tests.
+Files: src/vim9execute.c, src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_import.vim, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4679
+Problem: Cannot have expandcmd() give an error message for mistakes.
+Solution: Add an optional argument to give errors. Fix memory leak when
+ expanding files fails. (Yegappan Lakshmanan, closes #10071)
+Files: runtime/doc/builtin.txt, src/evalfunc.c, src/filepath.c,
+ src/testdir/test_expand.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4680
+Problem: Build failure without +postscript.
+Solution: Use another error message.
+Files: src/vim9execute.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4681
+Problem: Build fails with a combination of features.
+Solution: Remove #ifdef for alloc_clear_id(). (John Marriott)
+Files: src/alloc.c
+
+Patch 8.2.4682
+Problem: Vim9: can use :unlockvar for const variable. (Ernie Rael)
+Solution: Check whether the variable is a const.
+Files: src/ex_docmd.c, src/evalvars.c, src/vim9script.c,
+ src/proto/vim9script.pro, src/eval.c, src/userfunc.c,
+ src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4683
+Problem: Verbose check with dict_find() to see if a key is present.
+Solution: Add dict_has_key(). (Yegappan Lakshmanan, closes #10074)
+Files: src/channel.c, src/dict.c, src/evalwindow.c, src/filepath.c,
+ src/highlight.c, src/json.c, src/match.c, src/popupwin.c,
+ src/proto/dict.pro, src/quickfix.c, src/search.c, src/sign.c,
+ src/tag.c, src/terminal.c, src/testing.c, src/textprop.c,
+ src/time.c
+
+Patch 8.2.4684
+Problem: Cannot open a channel on a Unix domain socket.
+Solution: Add Unix domain socket support. (closes #10062)
+Files: runtime/doc/channel.txt, src/channel.c, src/testdir/check.vim,
+ src/testdir/shared.vim, src/testdir/test_channel.py,
+ src/testdir/test_channel.vim, src/testdir/test_channel_unix.py,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.4685
+Problem: When a swap file is found for a popup there is no dialog and the
+ buffer is loaded anyway.
+Solution: Silently load the buffer read-only. (closes #10073)
+Files: runtime/doc/popup.txt, src/memline.c, src/popupwin.c, src/vim.h,
+ src/buffer.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.4686
+Problem: Configure doesn't find the Motif library with Cygwin.
+Solution: Check for libXm.dll.a. (Kelvin Lee, closes #10077)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.4687
+Problem: "vimgrep /\%v/ *" may cause a crash.
+Solution: When compiling the pattern with the old engine fails, restore the
+ regprog of the new engine instead of leaving it NULL.
+ (closes #10079)
+Files: src/regexp.c
+
+Patch 8.2.4688
+Problem: New regexp engine does not give an error for "\%v".
+Solution: Check for a value argument. (issue #10079)
+Files: src/regexp_nfa.c, src/errors.h, src/regexp_bt.c,
+ src/testdir/test_regexp_latin.vim
+
+Patch 8.2.4689
+Problem: Using <Cmd> in a mapping does not work for mouse keys in Insert
+ mode. (Sergey Vlasov)
+Solution: When reading the <Cmd> argument do not use the stuff buffer.
+ (closes #10080)
+Files: src/getchar.c
+
+Patch 8.2.4690
+Problem: Channel tests fail on MS-Windows.
+Solution: Check if the AF_UNIX attribute exists. (closes #10083)
+Files: src/testdir/test_channel.py, src/testdir/test_channel_unix.py
+
+Patch 8.2.4691 (after 8.2.4689)
+Problem: Solution for <Cmd> in a mapping causes trouble.
+Solution: Use another solution: put back CTRL-O after reading the <Cmd>
+ sequence.
+Files: src/getchar.c
+
+Patch 8.2.4692
+Problem: No test for what 8.2.4691 fixes.
+Solution: Add a test. Use a more generic solution. (closes #10090)
+Files: src/getchar.c, src/mouse.c, src/testdir/test_mapping.vim
+
+Patch 8.2.4693 (after 8.2.4688)
+Problem: new regexp does not accept pattern "\%>0v".
+Solution: Do accept digit zero.
+Files: src/regexp_bt.c, src/regexp_nfa.c,
+ src/testdir/test_regexp_latin.vim
+
+Patch 8.2.4694
+Problem: Avoidance of #elif causes more preproc nesting.
+Solution: Use #elif where it is useful. (Ozaki Kiichi, closes #10081)
+Files: src/option.c, src/optiondefs.h, src/optionstr.c, src/version.c
+
+Patch 8.2.4695
+Problem: JSON encoding could be faster.
+Solution: Optimize encoding JSON strings. (closes #10086)
+Files: src/json.c, src/testdir/test_json.vim
+
+Patch 8.2.4696
+Problem: delete() with "rf" argument does not report a failure.
+Solution: Return -1 if the directory could not be removed. (closes #10078)
+Files: src/fileio.c, src/testdir/test_functions.vim
+
+Patch 8.2.4697
+Problem: Vim9: crash when adding a duplicate key to a dictionary.
+Solution: Clear the stack item when it has been moved into the dictionary.
+ (closes #10087)
+Files: src/vim9execute.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4698
+Problem: Vim9: script variable has no flag that it was set.
+Solution: Add a flag that it was set, to avoid giving it a value when used.
+ (closes #10088)
+Files: src/structs.h, src/vim9script.c, src/vim9execute.c,
+ src/evalvars.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4699
+Problem: Hard to reproduce hang when reading from a channel.
+Solution: Check for readahead before starting to wait. (closes #10093,
+ closes #7781, closes #6364)
+Files: src/channel.c
+
+Patch 8.2.4700
+Problem: Buffer remains active if a WinClosed event throws an exception.
+Solution: Ignore aborting() when closing the buffer. (closes #10097)
+Files: src/window.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.4701
+Problem: Kuka Robot Language files not recognized.
+Solution: Recognize *.src and *.dat files. (Patrick Meiser-Knosowski,
+ closes #10096)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim,
+ runtime/autoload/dist/ft.vim
+
+Patch 8.2.4702
+Problem: C++ scope labels are hard-coded.
+Solution: Add 'cinscopedecls' to define the labels. (Rom Praschan,
+ closes #10109)
+Files: runtime/doc/indent.txt, runtime/doc/options.txt,
+ runtime/doc/quickref.txt, runtime/optwin.vim, src/buffer.c,
+ src/cindent.c, src/option.c, src/option.h, src/optiondefs.h,
+ src/optionstr.c, src/structs.h, src/testdir/test_cindent.vim
+
+Patch 8.2.4703 (after 8.2.4702)
+Problem: Memory leak in handling 'cinscopedecls'.
+Solution: Free the memory before returning.
+Files: src/cindent.c
+
+Patch 8.2.4704
+Problem: Using "else" after return or break increases indent.
+Solution: Remove "else" and reduce indent. (Goc Dundar, closes #10099)
+Files: src/fileio.c, src/memline.c, src/option.c, src/syntax.c
+
+Patch 8.2.4705
+Problem: reg_executing may not be cleared.
+Solution: Reset reg_executing later. (closes #10111, closes #10110)
+Files: src/ex_docmd.c, src/getchar.c, src/globals.h, src/structs.h,
+ src/testdir/test_registers.vim
+
+Patch 8.2.4706
+Problem: Buffer remains active if a WinClosed event throws an exception
+ when there are multiple tabpages.
+Solution: Ignore aborting() when closing the buffer. (closes #10101)
+Files: src/window.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.4707
+Problem: Redrawing could be a bit more efficient.
+Solution: Optimize redrawing. (closes #10105)
+Files: src/change.c, src/edit.c, src/testdir/test_highlight.vim,
+ src/testdir/dumps/Test_cursorcolumn_insert_on_tab_3.dump
+
+Patch 8.2.4708
+Problem: PHP test files are not recognized.
+Solution: Add the *.phpt pattern. (Julien Voisin, closes #10112)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4709
+Problem: After :redraw the statusline highlight might be used.
+Solution: Clear the screen attribute after redrawing the screen.
+ (closes #10108)
+Files: src/ex_docmd.c
+
+Patch 8.2.4710
+Problem: Smart indenting does not work after completion.
+Solution: Set "can_si". (Christian Brabandt, closes #10113, closes #558)
+Files: src/edit.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.4711
+Problem: When 'insermode' is set :edit from <Cmd> mapping misbehaves.
+Solution: Don't set "need_start_insertmode" when already in Insert mode.
+ (closes #10116)
+Files: src/ex_cmds.c, src/testdir/test_edit.vim
+
+Patch 8.2.4712
+Problem: Only get profiling information after exiting.
+Solution: Add "profile dump" and "profile stop". (Marco Hinz, Yegappan
+ Lakshmanan, closes #10107)
+Files: runtime/doc/repeat.txt, src/profiler.c,
+ src/testdir/test_profile.vim
+
+Patch 8.2.4713
+Problem: Plugins cannot track text scrolling.
+Solution: Add the WinScrolled event. (closes #10102)
+Files: runtime/doc/autocmd.txt, src/autocmd.c, src/proto/autocmd.pro,
+ src/edit.c, src/gui.c, src/main.c, src/structs.h, src/vim.h,
+ src/window.c, src/proto/window.pro, src/testdir/test_autocmd.vim
+
+Patch 8.2.4714
+Problem: Using g:filetype_dat and g:filetype_src not tested.
+Solution: Add a test. (Patrick Meiser-Knosowski, closes #10117)
+Files: src/testdir/test_filetype.vim
+
+Patch 8.2.4715
+Problem: Vagrantfile not recognized.
+Solution: Recognize Vagrantfile as ruby. (Julien Voisin, closes #10119)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4716
+Problem: Memory allocation failure not tested when defining a function.
+Solution: Add a test. (Yegappan Lakshmanan, closes #10127)
+Files: src/alloc.c, src/alloc.h, src/proto/alloc.pro, src/userfunc.c,
+ src/testdir/test_user_func.vim, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4717
+Problem: For TextYankPost v:event does not contain information about the
+ operation being inclusive or not.
+Solution: Add "inclusive" to v:event. (Justin M. Keyes, Yegappan Lakshmanan,
+ closes #10125)
+Files: runtime/doc/autocmd.txt, src/register.c,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.4718
+Problem: @@@ in the last line sometimes drawn in the wrong place.
+Solution: Make sure the column is valid. (closes #10130)
+Files: src/drawscreen.c, src/screen.c, src/testdir/test_display.vim
+ src/testdir/dumps/Test_display_lastline_1.dump,
+ src/testdir/dumps/Test_display_lastline_2.dump,
+ src/testdir/dumps/Test_display_lastline_3.dump,
+ src/testdir/dumps/Test_display_lastline_4.dump
+
+Patch 8.2.4719
+Problem: ">" marker sometimes not displayed in the jumplist.
+Solution: If the buffer no longer exists show "-invalid-". (Christian
+ Brabandt, closes #10131, closes #10100)
+Files: runtime/doc/motion.txt, src/mark.c, src/testdir/Make_all.mak,
+ src/testdir/test_alot.vim, src/testdir/test_jumplist.vim,
+ src/testdir/test_jumps.vim
+
+Patch 8.2.4720
+Problem: ABB Rapid files are not recognized properly.
+Solution: Add checks for ABB Rapid files. (Patrick Meiser-Knosowski,
+ closes #10104)
+Files: runtime/autoload/dist/ft.vim, runtime/doc/filetype.txt,
+ runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4721
+Problem: Cooklang files are not recognized.
+Solution: recognize *.cook files. (Goc Dundar, closes #10120)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4722
+Problem: When a recording is ended with a mapped key that key is also
+ recorded.
+Solution: Remember the previous last_recorded_len. (closes #10122)
+Files: src/getchar.c, src/testdir/test_registers.vim
+
+Patch 8.2.4723
+Problem: The ModeChanged autocmd event is inefficient.
+Solution: Avoid allocating memory. (closes #10134) Rename
+ trigger_modechanged() to may_trigger_modechanged().
+Files: src/misc1.c, src/proto/misc1.pro, src/edit.c, src/ex_docmd.c,
+ src/ex_getln.c, src/insexpand.c, src/normal.c, src/terminal.c,
+ src/autocmd.c
+
+Patch 8.2.4724
+Problem: Current instance of last search pattern not easily spotted.
+Solution: Add CurSearch highlighting. (closes #10133)
+Files: runtime/doc/options.txt, runtime/doc/syntax.txt, src/highlight.c,
+ src/match.c, src/normal.c, src/optiondefs.h, src/structs.h,
+ src/vim.h, src/normal.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_hlsearch_cursearch_multiple_line.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_single_line_1.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_single_line_2.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_single_line_3.dump
+
+Patch 8.2.4725 (after 8.2.4724)
+Problem: Unused variable in tiny build.
+Solution: Add #ifdef.
+Files: src/normal.c
+
+Patch 8.2.4726
+Problem: Cannot use expand() to get the script name.
+Solution: Support expand('<script>'). (closes #10121)
+Files: runtime/doc/cmdline.txt, src/errors.h, src/ex_docmd.c,
+ src/scriptfile.c, src/vim.h, src/testdir/test_expand.vim
+
+Patch 8.2.4727
+Problem: Unused code.
+Solution: Remove code and add #ifdefs. (Dominique Pellé, closes #10136)
+Files: runtime/doc/editing.txt, runtime/doc/eval.txt,
+ runtime/doc/vim9.txt, src/errors.h, src/option.c, src/search.c,
+ src/proto/search.pro
+
+Patch 8.2.4728
+Problem: No test that v:event cannot be modified.
+Solution: Add a test. (closes #10139)
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.4729
+Problem: HEEx and Surface templates do not need a separate filetype.
+Solution: Use Eelixir for the similar filetypes. (Aaron Tinio, closes #10124)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4730
+Problem: MS-Windows GUI: cannot use CTRL-/.
+Solution: Handle the WM_KEYUP event. (Yasuhiro Matsumoto, closes #10141)
+Files: src/gui_w32.c
+
+Patch 8.2.4731
+Problem: The changelist index is not remembered per buffer.
+Solution: Keep the changelist index per window and buffer. (closes #10135,
+ closes #2173)
+Files: src/buffer.c, src/evalfunc.c, src/structs.h,
+ src/testdir/test_changelist.vim
+
+Patch 8.2.4732
+Problem: Duplicate code to free fuzzy matches.
+Solution: Bring back fuzmatch_str_free().
+Files: src/search.c, src/proto/search.pro, src/cmdexpand.c
+
+Patch 8.2.4733 (after 8.2.4729)
+Problem: HEEx and Surface do need a separate filetype.
+Solution: Revert 8.2.4729. (closes #10147)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4734
+Problem: getcharpos() may change a mark position.
+Solution: Copy the mark position. (closes #10148)
+Files: src/eval.c, src/testdir/test_cursor_func.vim
+
+Patch 8.2.4735
+Problem: Quickfix tests can be a bit hard to read.
+Solution: Use heredoc instead of strings and line continuation. (Yegappan
+ Lakshmanan, closes #10145)
+Files: src/testdir/test_quickfix.vim
+
+Patch 8.2.4736
+Problem: Build problem for Cygwin with Motif.
+Solution: Undefine ControlMask. (Kelvin Lee, closes #10152)
+Files: src/mbyte.c
+
+Patch 8.2.4737
+Problem: // in JavaScript string recognized as comment.
+Solution: Only check for linecomment if 'cindent' is set. (closes #10151)
+Files: src/change.c, src/testdir/test_textformat.vim
+
+Patch 8.2.4738
+Problem: Esc on commandline executes command instead of abandoning it.
+Solution: Save and restore KeyTyped when removing the popup menu.
+ (closes #10154)
+Files: src/cmdexpand.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_wildmenu_with_pum_foldexpr_1.dump,
+ src/testdir/dumps/Test_wildmenu_with_pum_foldexpr_2.dump
+
+Patch 8.2.4739
+Problem: Accessing freed memory after WinScrolled autocmd event.
+Solution: Check the window pointer is still valid. (closes #10156)
+ Remove the argument from may_trigger_winscrolled().
+Files: src/window.c, src/proto/window.pro, src/edit.c, src/gui.c,
+ src/main.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.4740
+Problem: When expand() fails there is no error message.
+Solution: When 'verbose' is set give an error message.
+Files: runtime/doc/builtin.txt, src/evalfunc.c,
+ src/testdir/test_expand.vim
+
+Patch 8.2.4741 (after 8.2.4740)
+Problem: Startup test fails.
+Solution: Avoid an error for verbose expansion. Fix that the "0verbose"
+ command modifier doesn't work.
+Files: runtime/syntax/syntax.vim, runtime/syntax/synload.vim,
+ src/structs.h, src/ex_docmd.c, src/testdir/test_excmd.vim
+
+Patch 8.2.4742
+Problem: There is no way to start logging very early in startup.
+Solution: Add the --log argument. Include the date in the start message in
+ the log file. Avoid a duplicate message when forking. Log an
+ executed shell command.
+Files: runtime/doc/starting.txt, runtime/doc/channel.txt,
+ src/main.c, src/channel.c, src/os_unix.c, src/os_win32.c,
+ src/testdir/test_startup.vim
+
+Patch 8.2.4743
+Problem: Clang 14 is available on CI.
+Solution: Switch from clang 13 to 14. (closes #10157)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4744
+Problem: A terminal window can't use the bell.
+Solution: Add bell support for the terminal window. (closes #10178)
+Files: runtime/doc/options.txt, src/gui_w32.c, src/option.h,
+ src/optionstr.c, src/terminal.c
+
+Patch 8.2.4745 (after 8.2.4744)
+Problem: Using wrong flag for using bell in the terminal.
+Solution: Change to use BO_TERM.
+Files: src/terminal.c, src/misc1.c
+
+Patch 8.2.4746
+Problem: Supercollider filetype not recognized.
+Solution: Match file extensions and check file contents to detect
+ supercollider. (closes #10142)
+Files: runtime/filetype.vim, runtime/autoload/dist/ft.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.4747
+Problem: No filetype override for .sys files.
+Solution: Add g:filetype_sys. (Patrick Meiser-Knosowski, closes #10181)
+Files: runtime/doc/filetype.txt, runtime/autoload/dist/ft.vim,
+ src/testdir/test_filetype.vim
+
+Patch 8.2.4748
+Problem: Cannot use an imported function in a mapping.
+Solution: Recognize <SID>name.Func.
+Files: runtime/doc/vim9.txt, src/term.c, src/vim9execute.c,
+ src/proto/vim9execute.pro, src/scriptfile.c,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.4749
+Problem: <script> is not expanded in autocmd context.
+Solution: Add the context to the pattern struct. (closes #10144)
+ Rename AutoPatCmd to AutoPatCmd_T.
+Files: src/autocmd.c, src/proto/autocmd.pro, src/scriptfile.c,
+ src/structs.h, src/testdir/test_expand.vim
+
+Patch 8.2.4750
+Problem: Small pieces of dead code.
+Solution: Remove the dead code. (Goc Dundar, closes #10190) Rename the
+ qftf_cb struct member to avoid confusion.
+Files: src/ex_cmds.c, src/misc1.c, src/optionstr.c, src/quickfix.c
+
+Patch 8.2.4751 (after 8.2.4748)
+Problem: Mapping <SID>name.Func does not work for script in autoload
+ directory.
+Solution: Use the # form for a script in the autoload directory.
+ (closes #10186)
+Files: src/term.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4752
+Problem: Wrong 'statusline' value can cause illegal memory access.
+Solution: Properly check the value. (closes #10192)
+Files: src/optionstr.c, src/testdir/test_options.vim
+
+Patch 8.2.4753
+Problem: Error from setting an option is silently ignored.
+Solution: Handle option value errors better. Fix uses of N_().
+Files: src/option.c, src/proto/option.pro, src/optionstr.c,
+ src/channel.c, src/crypt.c, src/diff.c, src/edit.c,
+ src/eval.c, src/evalfunc.c, src/evalvars.c, src/ex_cmds2.c,
+ src/ex_docmd.c, src/ex_getln.c, src/getchar.c, src/gui.c,
+ src/gui_gtk_x11.c, src/help.c, src/highlight.c, src/if_tcl.c,
+ src/main.c, src/memline.c, src/message_test.c,
+ src/popupmenu.c, src/quickfix.c, src/scriptfile.c, src/spell.c,
+ src/spellfile.c, src/term.c, src/undo.c, src/vim9script.c
+
+Patch 8.2.4754
+Problem: Still using cached values after unsetting some known environment
+ variables.
+Solution: Take care of the side effects. (closes #10194)
+Files: src/evalfunc.c, src/evalvars.c, src/misc1.c, src/proto/misc1.pro,
+ src/vim9execute.c, src/optionstr.c, src/testdir/test_environ.vim
+
+Patch 8.2.4755
+Problem: Cannot use <SID>FuncRef in completion spec.
+Solution: Dereference a function name in another way. (closes #10197)
+Files: src/eval.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4756 (after 8.2.4754)
+Problem: Build error without the +eval feature.
+Solution: Adjust #ifdefs.
+Files: src/misc1.c
+
+Patch 8.2.4757
+Problem: List of libraries to suppress lsan errors is outdated.
+Solution: Add another library. (closes #10201)
+Files: src/testdir/lsan-suppress.txt
+
+Patch 8.2.4758
+Problem: When using an LSP channel want to get the message ID.
+Solution: Have ch_sendexpr() return the ID. (Yegappan Lakshmanan,
+ closes #10202)
+Files: runtime/doc/channel.txt, src/channel.c, src/evalfunc.c,
+ src/testdir/test_channel.vim
+
+Patch 8.2.4759
+Problem: CurSearch highlight does not work for multi-line match.
+Solution: Check cursor position before adjusting columns. (closes #10133)
+Files: src/structs.h, src/match.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_hlsearch_cursearch_multiple_line.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_1.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_2.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_3.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_4.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_multiple_line_5.dump
+
+Patch 8.2.4760
+Problem: Using matchfuzzy() on a long list can take a while.
+Solution: Add a limit to the number of matches. (Yasuhiro Matsumoto,
+ closes #10189)
+Files: runtime/doc/builtin.txt, src/search.c,
+ src/testdir/test_matchfuzzy.vim
+
+Patch 8.2.4761
+Problem: Documentation for using LSP messages is incomplete.
+Solution: Update the documentation. (Yegappan Lakshmanan, closes #10206)
+Files: runtime/doc/channel.txt
+
+Patch 8.2.4762
+Problem: Using freed memory when using synstack() and synID() in WinEnter.
+Solution: Check using the syntax window. (closes #10204)
+Files: src/syntax.c, src/testdir/test_syntax.vim
+
+Patch 8.2.4763
+Problem: Using invalid pointer with "V:" in Ex mode.
+Solution: Correctly handle the command being changed to "+".
+Files: src/ex_docmd.c, src/testdir/test_ex_mode.vim
+
+Patch 8.2.4764
+Problem: CI uses an older gcc version.
+Solution: Use GCC 11. (closes #10185)
+Files: .github/workflows/ci.yml, src/testdir/lsan-suppress.txt
+
+Patch 8.2.4765
+Problem: Function matchfuzzy() sorts too many items.
+Solution: Only put matches in the array. (Yegappan Lakshmanan,
+ closes #10208)
+Files: src/search.c
+
+Patch 8.2.4766
+Problem: KRL files using "deffct" not recognized.
+Solution: Adjust the pattern used for matching. (Patrick Meiser-Knosowski,
+ closes #10200)
+Files: runtime/autoload/dist/ft.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4767
+Problem: Openscad files are not recognized.
+Solution: Add a filetype pattern. (Niklas Adam, closes #10199)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4768
+Problem: CI: codecov upload sometimes does not work.
+Solution: Use action v3 instead of v2. (closes #10209)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4769
+Problem: Build warning with UCRT.
+Solution: Adjust #ifdef for _wenviron. (John Marriott)
+Files: src/evalfunc.c
+
+Patch 8.2.4770
+Problem: Cannot easily mix expression and heredoc.
+Solution: Support `=expr` in heredoc. (Yegappan Lakshmanan, closes #10138)
+Files: runtime/doc/eval.txt, src/evalvars.c, src/userfunc.c,
+ src/testdir/test_let.vim, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4771
+Problem: Coverity warns for not checking return value.
+Solution: Check return value of rettv_dict_alloc().
+Files: src/channel.c
+
+Patch 8.2.4772
+Problem: Old Coverity warning for not checking ftell() return value.
+Solution: Check return value of fseek() and ftell().
+Files: src/misc1.c
+
+Patch 8.2.4773
+Problem: Build failure without the +eval feature.
+Solution: Use other error message. Avoid warnings.
+Files: src/misc1.c, src/cindent.c, src/term.c
+
+Patch 8.2.4774
+Problem: Crash when using a number for lambda name.
+Solution: Check the type of the lambda reference.
+Files: src/eval.c, src/errors.h, src/testdir/test_lambda.vim
+
+Patch 8.2.4775
+Problem: SpellBad highlighting does not work in Konsole.
+Solution: Do not keep t_8u defined for Konsole. Redraw when t_8u is reset.
+ (closes #10177)
+Files: src/term.c
+
+Patch 8.2.4776
+Problem: GTK: 'lines' and 'columns' may change during startup.
+Solution: Ignore stale GTK resize events. (Ernie Rael, closes #10179)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.4777 (after 8.2.4775)
+Problem: Screendump tests fail because of a redraw.
+Solution: Do not output t_8u before receiving termresponse. Redraw only
+ when t_8u is not reset and termresponse is received.
+Files: src/term.c
+
+Patch 8.2.4778
+Problem: Pacman files use dosini filetype.
+Solution: Use conf instead. (Chaoren Lin, closes #10213)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4779
+Problem: lsan suppression is too version specific.
+Solution: Leave out the version number. (Christian Brabandt, closes #10214)
+Files: src/testdir/lsan-suppress.txt
+
+Patch 8.2.4780
+Problem: Parsing an LSP message fails when it is split.
+Solution: Collapse the received data before parsing. (Yegappan Lakshmanan,
+ closes #10215)
+Files: runtime/doc/channel.txt, src/channel.c,
+ src/testdir/test_channel.vim, src/testdir/test_channel_lsp.py
+
+Patch 8.2.4781
+Problem: Maxima files are not recognized.
+Solution: Add patterns to detect Maxima files. (Doron Behar, closes #10211)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4782
+Problem: Accessing freed memory.
+Solution: Clear evalarg after checking for trailing characters.
+ (issue #10218)
+Files: src/userfunc.c, src/testdir/test_lambda.vim
+
+Patch 8.2.4783
+Problem: Coverity warns for leaking memory.
+Solution: Use another strategy freeing "theline".
+Files: src/evalvars.c
+
+Patch 8.2.4784
+Problem: Lamba test with timer is flaky.
+Solution: Adjust sleep time on retry.
+Files: src/testdir/test_lambda.vim
+
+Patch 8.2.4785
+Problem: Visual mode not stopped early enough if win_gotoid() goes to
+ another buffer. (Sergey Vlasov)
+Solution: Stop Visual mode before jumping to another buffer. (closes #10217)
+Files: src/evalwindow.c, src/testdir/test_vim9_builtin.vim,
+ src/testdir/dumps/Test_win_gotoid_1.dump,
+ src/testdir/dumps/Test_win_gotoid_2.dump,
+ src/testdir/dumps/Test_win_gotoid_3.dump
+
+Patch 8.2.4786 (after 8.2.4785)
+Problem: Test for win_gotoid() in Visual mode fails on Mac.
+Solution: Skip the test on MacOS.
+Files: src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4787
+Problem: prop_find() does not find the right property.
+Solution: Fix the scan order. (closes #10220)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.4788
+Problem: Large payload for LSP message not tested.
+Solution: Add a test with a large LSP payload. (Yegappan Lakshmanan,
+ closes #10223)
+Files: src/channel.c, src/testdir/test_channel.vim,
+ src/testdir/test_channel_lsp.py
+
+Patch 8.2.4789
+Problem: The cursor may be in the in wrong place when using :redraw while
+ editing the cmdline.
+Solution: When editing the command line let :redraw update the command line
+ too. (closes #10210)
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim,
+ src/testdir/dumps/Test_redraw_in_autocmd_1.dump,
+ src/testdir/dumps/Test_redraw_in_autocmd_2.dump
+
+Patch 8.2.4790
+Problem: Lilypond filetype not recognized.
+Solution: Add patterns for lilypond. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4791
+Problem: Autocmd events triggered in different order when reusing an empty
+ buffer.
+Solution: Call buff_freeall() earlier. (Charlie Groves, closes #10198)
+Files: src/buffer.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.4792
+Problem: Indent operator creates an undo entry for every line.
+Solution: Create one undo entry for all lines. (closes #10227)
+Files: src/indent.c, src/testdir/test_indent.vim
+
+Patch 8.2.4793
+Problem: Recognizing Maxima filetype even though it might be another.
+Solution: Remove *.mc and *.dem patterns from Maxima files
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4794
+Problem: Compiler warning for not initialized variable.
+Solution: Initialize the variable. (John Marriott)
+Files: src/indent.c
+
+Patch 8.2.4795
+Problem: 'cursorbind' scrolling depends on whether 'cursorline' is set.
+Solution: Always call validate_cursor(). (Christian Brabandt, closes #10230,
+ closes #10014)
+Files: src/move.c, src/testdir/README.txt,
+ src/testdir/test_cursorline.vim,
+ src/testdir/dumps/Test_hor_scroll_1.dump,
+ src/testdir/dumps/Test_hor_scroll_2.dump,
+ src/testdir/dumps/Test_hor_scroll_3.dump,
+ src/testdir/dumps/Test_hor_scroll_4.dump
+
+Patch 8.2.4796 (after 8.2.4795)
+Problem: File left behind after running cursorline tests.
+Solution: Uncomment the line that deletes the file.
+Files: src/testdir/test_cursorline.vim
+
+Patch 8.2.4797
+Problem: getwininfo() may get outdated values.
+Solution: Make sure w_botline is up-to-date. (closes #10226)
+Files: src/evalwindow.c, src/testdir/test_bufwintabinfo.vim
+
+Patch 8.2.4798
+Problem: t_8u option was reset even when set by the user.
+Solution: Only reset t_8u when using the default value. (closes #10239)
+Files: src/term.c
+
+Patch 8.2.4799
+Problem: Popup does not use correct topline.
+Solution: Also add one when firstline is negative. (closes #10229)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.4800 (after 8.2.4798)
+Problem: Missing test update for adjusted t_8u behavior.
+Solution: Update and extend the test.
+Files: src/testdir/test_termcodes.vim
+
+Patch 8.2.4801 (after 8.2.4795)
+Problem: Fix for cursorbind fix not fully tested.
+Solution: Add another test case. (Christian Brabandt, closes #10240)
+Files: src/testdir/test_cursorline.vim,
+ src/testdir/dumps/Test_hor_scroll_5.dump
+
+Patch 8.2.4802
+Problem: Test is not cleaned up.
+Solution: Make test clean up after itself. Avoid NUL. (closes #10233)
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.4803
+Problem: WinScrolled not always triggered when scrolling with the mouse.
+Solution: Add calls to may_trigger_winscrolled(). (closes #10246)
+Files: src/mouse.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.4804
+Problem: Expression in heredoc doesn't work for compiled function.
+Solution: Implement compiling the heredoc expressions. (Yegappan Lakshmanan,
+ closes #10232)
+Files: runtime/doc/eval.txt, src/evalvars.c, src/proto/evalvars.pro,
+ src/ex_getln.c, src/vim9compile.c, src/proto/vim9compile.pro,
+ src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4805
+Problem: CurSearch used for all matches in current line.
+Solution: Don't use the non-zero line count. (closes #10247)
+Files: src/match.c, src/testdir/test_search.vim,
+ src/testdir/dumps/Test_hlsearch_cursearch_single_line_1.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_single_line_2.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_single_line_2a.dump,
+ src/testdir/dumps/Test_hlsearch_cursearch_single_line_2b.dump
+
+Patch 8.2.4806
+Problem: A mapping using <LeftDrag> does not start Select mode.
+Solution: When checking for starting select mode with the mouse also do this
+ when there is typeahead. (closes #10249)
+Files: src/normal.c
+
+Patch 8.2.4807
+Problem: Processing key events in Win32 GUI is not ideal.
+Solution: Improve processing of key events. (closes #10155)
+Files: src/gui_w32.c
+
+Patch 8.2.4808
+Problem: Unused item in engine struct.
+Solution: Remove "expr". Add comment with tags.
+Files: src/regexp.h
+
+Patch 8.2.4809
+Problem: Various things not properly tested.
+Solution: Add various test cases. (Yegappan Lakshmanan, closes #10259)
+Files: src/testdir/test_blob.vim, src/testdir/test_debugger.vim,
+ src/testdir/test_listdict.vim, src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_import.vim, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4810 (after 8.2.4808)
+Problem: Missing changes in one file.
+Solution: Also change the struct initializers.
+Files: src/regexp.c
+
+Patch 8.2.4811 (after 8.2.4807)
+Problem: Win32 GUI: caps lock doesn't work.
+Solution: Handle VK_CAPITAL. (closes #10260, closes #10258)
+Files: src/gui_w32.c
+
+Patch 8.2.4812
+Problem: Unused struct item.
+Solution: Remove "lines" match_T. Simplify the code. (closes #10256)
+Files: src/match.c, src/structs.h
+
+Patch 8.2.4813
+Problem: Pasting text while indent folding may mess up folds.
+Solution: Adjust the way folds are split. (Brandon Simmons, closes #10254)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.2.4814
+Problem: Possible to leave a popup window with win_gotoid().
+Solution: Give an error when trying to leave a popup window with
+ win_gotoid(). (closes #10253)
+Files: src/evalwindow.c, src/testdir/test_terminal3.vim
+
+Patch 8.2.4815 (after 8.2.4776)
+Problem: Cannot build with older GTK version.
+Solution: Use gtk_window_get_size() instead of gdk_window_get_width() and
+ gdk_window_get_height(). (Ernie Rael, closes #10257)
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.4816
+Problem: Still using older codecov app in some places of CI.
+Solution: Use v3.1.0. (closes #10209)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4817
+Problem: Win32 GUI: modifiers are not always used.
+Solution: Handle more modifiers. (closes #10269)
+Files: src/gui_w32.c
+
+Patch 8.2.4818 (after 8.2 4806)
+Problem: No test for what 8.2.4806 fixes.
+Solution: Add a test. (closes #10272)
+Files: src/testdir/test_mapping.vim
+
+Patch 8.2.4819
+Problem: Unmapping simplified keys also deletes other mapping.
+Solution: Only unmap a mapping with m_simplified set. (closes #10270)
+Files: src/map.c, src/testdir/test_mapping.vim
+
+Patch 8.2.4820
+Problem: No simple programmatic way to find a specific mapping.
+Solution: Add getmappings(). (Ernie Rael, closes #10273)
+Files: runtime/doc/builtin.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/map.c, src/proto/map.pro, src/testdir/test_maparg.vim
+
+Patch 8.2.4821
+Problem: Crash when imported autoload script was deleted.
+Solution: Initialize local variable. (closes #10274) Give a more meaningful
+ error message.
+Files: src/eval.c, src/vim9script.c, src/testdir/test_vim9_import.vim
+
+Patch 8.2.4822
+Problem: Setting ufunc to NULL twice.
+Solution: Set ufunc to NULL in find_exported(). (closes #19275)
+Files: src/eval.c, src/vim9script.c
+
+Patch 8.2.4823
+Problem: Concatenating more than 2 strings in a :def function is
+ inefficient.
+Solution: Add a count to the CONCAT instruction. (closes #10276)
+Files: src/vim9.h, src/vim9cmds.c, src/vim9compile.c, src/vim9execute.c,
+ src/vim9expr.c, src/vim9instr.c, src/proto/vim9instr.pro,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4824
+Problem: Expression is evaluated multiple times.
+Solution: Evaluate expression once and store the result. (closes #10278)
+Files: src/map.c
+
+Patch 8.2.4825
+Problem: Can only get a list of mappings.
+Solution: Add the optional {abbr} argument. (Ernie Rael, closes #10277)
+ Rename to maplist(). Rename test file.
+Files: runtime/doc/builtin.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/map.c, src/proto/map.pro, src/testdir/test_maparg.vim,
+ src/testdir/test_map_functions.vim, src/testdir/Make_all.mak
+
+Patch 8.2.4826
+Problem: .cshtml files are not recognized.
+Solution: Use html filetype for .cshtml files. (Julien Voisin, closes #10212)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4827
+Problem: Typo in variable name. (Gabriel Dupras)
+Solution: Rename the variable.
+Files: src/map.c
+
+Patch 8.2.4828
+Problem: Fix for unmapping simplified key not fully tested.
+Solution: Add a test case. (closes #10292)
+Files: src/map.c, src/testdir/test_mapping.vim
+
+Patch 8.2.4829
+Problem: A key may be simplified to NUL.
+Solution: Use K_ZERO instead. Use macros instead of hard coded values.
+ (closes #10290)
+Files: src/getchar.c, src/misc2.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.4830
+Problem: Possible endless loop if there is unused typahead.
+Solution: Only loop when the typeahead changed.
+Files: src/channel.c
+
+Patch 8.2.4831
+Problem: Crash when using maparg() and unmapping simplified keys.
+Solution: Do not keep a mapblock pointer. (closes #10294)
+Files: src/map.c, src/testdir/test_map_functions.vim
+
+Patch 8.2.4832
+Problem: Passing zero instead of NULL to a pointer argument.
+Solution: Use NULL. (closes #10296)
+Files: src/getchar.c, src/term.c
+
+Patch 8.2.4833
+Problem: Failure of mapping not checked for.
+Solution: Check return value of ins_typebuf(). (closes #10299)
+Files: src/getchar.c, src/term.c, src/testdir/test_termcodes.vim
+
+Patch 8.2.4834
+Problem: Vim9: some lines not covered by tests.
+Solution: Add a few more tests. Remove dead code.
+Files: src/vim9execute.c, src/vim9instr.c, src/vim9.h,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4835
+Problem: Vim9: some lines not covered by tests.
+Solution: Add a few more tests. Fix disassemble output.
+Files: src/vim9execute.c, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4836
+Problem: Vim9: some lines not covered by tests.
+Solution: Remove dead code. Add disassemble tests.
+Files: src/vim9execute.c, src/vim9.h,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4837 (after patch 8.2.0919)
+Problem: Modifiers not simplified when timed out or using feedkeys() with
+ 'n" flag.
+Solution: Adjust how mapped flag and timeout are used. (closes #10305)
+Files: src/getchar.c, src/testdir/test_paste.vim,
+ src/testdir/test_termcodes.vim
+
+Patch 8.2.4838
+Problem: Checking for absolute path is not trivial.
+Solution: Add isabsolutepath(). (closes #10303)
+Files: runtime/doc/builtin.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/filepath.c, src/proto/filepath.pro,
+ src/testdir/test_functions.vim
+
+Patch 8.2.4839
+Problem: Compiler warning for unused argument.
+Solution: Add "UNUSED".
+Files: src/gui_gtk_x11.c
+
+Patch 8.2.4840
+Problem: Heredoc expression evaluated even when skipping.
+Solution: Don't evaluate when "skip" is set. (closes #10306)
+Files: src/evalvars.c, src/testdir/test_let.vim
+
+Patch 8.2.4841
+Problem: Empty string considered an error for expand() when 'verbose' is
+ set. (Christian Brabandt)
+Solution: Do not give an error for an empty result. (closes #10307)
+Files: src/evalfunc.c, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/filepath.c, src/testdir/test_expand_func.vim
+
+Patch 8.2.4842 (after 8.2.4841)
+Problem: expand("%:p") is not empty when there is no buffer name.
+Solution: When ignoring errors still return NULL. (closes #10311)
+Files: src/ex_docmd.c, src/testdir/test_expand_func.vim
+
+Patch 8.2.4843 (after 8.2.4807)
+Problem: Win32 GUI: Treating CTRL + ALT as AltGr is not backwards
+ compatible. (Axel Bender)
+Solution: Make a difference between left and right menu keys.
+ (closes #10308)
+Files: src/gui_w32.c
+
+Patch 8.2.4844
+Problem: <C-S-I> is simplified to <S-Tab>.
+Solution: Do not simplify CTRL if there is also SHIFT. (closes #10313)
+Files: src/getchar.c, src/testdir/test_gui.vim
+
+Patch 8.2.4845
+Problem: Duplicate code.
+Solution: Move code below if/else. (closes #10314)
+Files: src/misc1.c
+
+Patch 8.2.4846 (after 8.2.4844)
+Problem: Termcodes test fails.
+Solution: use CTRL-SHIFT-V to insert an unsimplified key. (closes #10316)
+Files: runtime/doc/cmdline.txt, src/edit.c, src/getchar.c,
+ src/testdir/test_gui.vim
+
+Patch 8.2.4847
+Problem: Crash when using uninitialized function pointer.
+Solution: Check for NULL pointer. (closes #10319, closes #10319)
+Files: src/eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4848
+Problem: Local completion with mappings and simplification not working.
+Solution: Fix local completion <C-N>/<C-P> mappings not ignored if keys are
+ not simplified. (closes #10323)
+Files: src/getchar.c, src/testdir/test_popup.vim
+
+Patch 8.2.4849
+Problem: Gleam filetype not detected.
+Solution: Add a pattern for Gleam files. (Mathias Jean Johansen,
+ closes #10326)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4850
+Problem: Mksession mixes up "tabpages" and "curdir" arguments.
+Solution: Correct logic for storing tabpage in session. (closes #10312)
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.4851
+Problem: Compiler warning for uninitialized variable.
+Solution: Use another variable to decide to restore option values.
+Files: src/session.c
+
+Patch 8.2.4852
+Problem: ANSI color index to RGB value not correct.
+Solution: Convert the cterm index to ANSI index. (closes #10321,
+ closes #9836)
+Files: src/term.c
+
+Patch 8.2.4853
+Problem: CI with FreeBSD is a bit outdated.
+Solution: Use 12.3 instead of 12.1. (closes #10333)
+Files: .cirrus.yml
+
+Patch 8.2.4854
+Problem: Array size does not match usage.
+Solution: Make array size 3 instead of 4. (Christian Brabandt, closes #10336)
+Files: src/term.c
+
+Patch 8.2.4855
+Problem: Robot files are not recognized.
+Solution: Add patterns for robot files. (Zoe Roux, closes #10339)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4856
+Problem: MinGW compiler complains about unknown escape sequence.
+Solution: Avoid using a backslash in path. (Christian Brabandt,
+ closes #10337)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.4857
+Problem: Yaml indent for multiline is wrong.
+Solution: Adjust patterns. (closes #10328, closes #8740)
+Files: runtime/indent/yaml.vim, runtime/indent/testdir/yaml.in,
+ runtime/indent/testdir/yaml.ok
+
+Patch 8.2.4858
+Problem: K_SPECIAL may be escaped twice.
+Solution: Avoid double escaping. (closes #10340)
+Files: src/highlight.c, src/misc2.c, src/proto/misc2.pro, src/term.c,
+ src/typval.c, src/testdir/test_eval_stuff.vim,
+ src/testdir/test_feedkeys.vim, src/testdir/test_functions.vim,
+ src/testdir/test_mapping.vim
+
+Patch 8.2.4859
+Problem: wget2 files are not recognized.
+Solution: Add patterns to recognize wget2. (Doug Kearns)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.4860
+Problem: MS-Windows: always uses current directory for executables.
+Solution: Check the NoDefaultCurrentDirectoryInExePath environment variable.
+ (Yasuhiro Matsumoto, closes #10341)
+Files: runtime/doc/builtin.txt, src/os_win32.c,
+ src/testdir/test_functions.vim
+
+Patch 8.2.4861
+Problem: It is not easy to restore saved mappings.
+Solution: Make mapset() accept a dict argument. (Ernie Rael, closes #10295)
+Files: runtime/doc/builtin.txt, src/errors.h, src/evalfunc.c, src/map.c,
+ src/typval.c, src/proto/typval.pro,
+ src/testdir/test_map_functions.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4862
+Problem: Vim9: test may fail when run with valgrind.
+Solution: Wait longer for callback if needed.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.4863
+Problem: Accessing freed memory in test without the +channel feature.
+ (Dominique Pellé)
+Solution: Do not generted PUSHCHANNEL or PUSHJOB if they are not
+ implemented. (closes #10350)
+Files: src/vim9instr.c, src/errors.h, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim
+
+Patch 8.2.4864 (after 8.2.4863)
+Problem: Vim9: script test fails.
+Solution: Remove "if" around declaration.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.4865
+Problem: :startinsert right after :stopinsert does not work when popup menu
+ is still visible.
+Solution: Use ins_compl_active() instead of pum_visible(). (closes #10352)
+Files: src/edit.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.4866
+Problem: Duplicate code in "get" functions.
+Solution: Use get_var_from() for getwinvar(), gettabvar(), gettabwinvar()
+ and getbufvar(). (closes #10335)
+Files: src/evalvars.c
+
+Patch 8.2.4867
+Problem: Listing of mapping with K_SPECIAL is wrong.
+Solution: Adjust escaping of special characters. (closes #10351)
+Files: src/map.c, src/message.c, src/testdir/test_mapping.vim
+
+Patch 8.2.4868
+Problem: When closing help window autocmds triggered for the wrong window.
+Solution: Figure out the new current window earlier. (closes #10348)
+Files: src/window.c, src/testdir/test_help.vim
+
+Patch 8.2.4869
+Problem: Expression in command block does not look after NL.
+Solution: Skip over NL to check what follows. (closes #10358)
+Files: src/eval.c, src/proto/eval.pro, src/vim9script.c,
+ src/testdir/test_usercommands.vim
+
+Patch 8.2.4870
+Problem: Vim9: expression in :substitute is not compiled.
+Solution: Use an INSTR instruction if possible. (closes #10334)
+Files: src/evalfunc.c, src/regexp.c, src/vim9execute.c, src/vim9expr.c,
+ src/testdir/test_vim9_builtin.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4871
+Problem: Vim9: in :def function no error for using a range with a command
+ that does not accept one.
+Solution: Check for the command to accept a range. (closes #10330)
+Files: src/vim9compile.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4872
+Problem: Vim9: no error for using an expression only at the script level
+ when followed by an empty line.
+Solution: Do not check the line number but whether something follows.
+ (closes #10357)
+Files: src/ex_eval.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4873
+Problem: Vim9: using "else" differs from using "endif/if !cond".
+Solution: Leave the block and enter another one. (closes #10320)
+Files: src/ex_eval.c, src/testdir/test_vim9_script.vim
+
+Patch 8.2.4874
+Problem: Win32 GUI: horizontal scroll wheel not handled properly.
+Solution: Also handle WM_MOUSEHWHEEL. (closes #10309)
+Files: src/gui_w32.c
+
+Patch 8.2.4875
+Problem: MS-Windows: some .exe files are not recognized.
+Solution: Parse APPEXECLINK junctions. (closes #10302)
+Files: src/os_mswin.c, src/proto/os_mswin.pro, src/os_win32.c,
+ src/os_win32.h, src/testdir/test_functions.vim
+
+Patch 8.2.4876
+Problem: MS-Windows: Shift-BS results in strange character in powershell.
+Solution: Add K_S_BS. (Christian Brabandt, closes #10283, closes #10279)
+Files: src/edit.c, src/keymap.h, src/term.c, src/testdir/shared.vim,
+ src/testdir/test_edit.vim
+
+Patch 8.2.4877
+Problem: MS-Windows: Using Normal colors for termguicolors causes problems.
+Solution: Do not use Normal colors to set sg_gui_fg and sg_gui_bg.
+ (Christian Brabandt, closes #10317, closes #10241)
+Files: src/highlight.c
+
+Patch 8.2.4878
+Problem: Valgrind warning for using uninitialized variable.
+Solution: Initialize the type of newtv.
+Files: src/strings.c
+
+Patch 8.2.4879
+Problem: Screendump test may fail when using valgrind.
+Solution: Wait longer for the first screendump.
+Files: src/testdir/test_vim9_builtin.vim, src/testdir/screendump.vim
+
+Patch 8.2.4880
+Problem: Vim9: misplaced elseif causes invalid memory access.
+Solution: Check cs_idx not to be negative.
+Files: src/ex_eval.c
+
+Patch 8.2.4881
+Problem: "P" in Visual mode still changes some registers.
+Solution: Make "P" in Visual mode not change any register. (Shougo
+ Matsushita, closes #10349)
+Files: runtime/doc/change.txt, runtime/doc/index.txt,
+ runtime/doc/visual.txt, src/normal.c, src/testdir/test_visual.vim
+
+Patch 8.2.4882
+Problem: Cannot make 'breakindent' use a specific column.
+Solution: Add the "column" entry in 'breakindentopt'. (Christian Brabandt,
+ closes #10362, closes #10325)
+Files: runtime/doc/options.txt, src/indent.c, src/structs.h,
+ src/testdir/test_breakindent.vim
+
+Patch 8.2.4883
+Problem: String interpolation only works in heredoc.
+Solution: Support interpolated strings. Use syntax for heredoc consistent
+ with strings, similar to C#. (closes #10327)
+Files: runtime/doc/eval.txt, src/errors.h, src/eval.c, src/evalvars.c,
+ src/proto/evalvars.pro, src/typval.c, src/proto/typval.pro,
+ src/vim9compile.c, src/proto/vim9compile.pro, src/vim9expr.c,
+ src/testdir/test_debugger.vim, src/testdir/test_expr.vim,
+ src/testdir/test_let.vim, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4884
+Problem: Test fails without the job/channel feature. (Dominique Pellé)
+Solution: Add condition.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.4885 (after 8.2.4884)
+Problem: Test fails with the job/channel feature.
+Solution: Move check for job/channel separately.
+Files: src/testdir/test_vim9_script.vim
+
+Patch 8.2.4886
+Problem: Vim9: redir in skipped block seen as assignment.
+Solution: Check for valid assignment.
+Files: src/ex_docmd.c, src/testdir/test_vim9_assign.vim
+
+Patch 8.2.4887
+Problem: Channel log does not show invoking a timer callback.
+Solution: Add a ch_log() call.
+Files: src/time.c
+
+Patch 8.2.4888
+Problem: Line number of lambda ignores line continuation.
+Solution: Use the line number of where the arguments are. Avoid outputting
+ "..." twice. (closes #10364)
+Files: src/userfunc.c
+
+Patch 8.2.4889
+Problem: CI only tests with FreeBSD 12.
+Solution: Also test with FreeBSD 13. (closes #10366)
+Files: .cirrus.yml
+
+Patch 8.2.4890
+Problem: Inconsistent capitalization in error messages.
+Solution: Make capitalization consistent. (Doug Kearns)
+Files: src/errors.h
+
+Patch 8.2.4891
+Problem: Vim help presentation could be better.
+Solution: Add an imported file for extra Vim help support. Show highlight
+ names in the color they have.
+Files: Filelist, runtime/import/dist/vimhelp.vim
+
+Patch 8.2.4892
+Problem: Test failures because of changed error messages.
+Solution: Adjust the expected error messages.
+Files: src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_func.vim, src/testdir/test_vim9_script.vim,
+ src/testdir/test_expand.vim, src/testdir/test_tcl.vim,
+ src/testdir/test_vimscript.vim
+
+Patch 8.2.4893 (after 8.2.4891)
+Problem: Distributed import files are not installed.
+Solution: Add rules to Makefile and NSIS.
+Files: src/Makefile, nsis/gvim.nsi
+
+Patch 8.2.4894
+Problem: MS-Windows: not using italics.
+Solution: Use italics. Simplify the code. (closes #10359)
+Files: src/term.c
+
+Patch 8.2.4895
+Problem: Buffer overflow with invalid command with composing chars.
+Solution: Check that the whole character fits in the buffer.
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4896 (after 8.2.4869)
+Problem: Expression in command block does not look after NL when command is
+ typed.
+Solution: Skip over NL also when not in a script. (closes #10358)
+Files: src/eval.c, src/testdir/test_usercommands.vim
+
+Patch 8.2.4897
+Problem: Comment inside an expression in lambda ignores the rest of the
+ expression.
+Solution: Truncate the line at the comment. (closes #10367)
+Files: src/eval.c, src/testdir/test_lambda.vim
+
+Patch 8.2.4898
+Problem: Coverity complains about pointer usage.
+Solution: Move code for increment/decrement.
+Files: src/vim9compile.c
+
+Patch 8.2.4899
+Problem: With latin1 encoding CTRL-W might go before the start of the
+ command line.
+Solution: Check already being at the start of the command line.
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4900
+Problem: Vim9 expression test fails without the job feature.
+Solution: Add a check for the job feature. (Dominique Pellé, closes #10373)
+Files: src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4901
+Problem: NULL pointer access when using invalid pattern.
+Solution: Check for failed regexp program.
+Files: src/buffer.c, src/testdir/test_buffer.vim
+
+Patch 8.2.4902
+Problem: Mouse wheel scrolling is inconsistent.
+Solution: Use the MS-Windows system setting. (closes #10368)
+Files: runtime/doc/scroll.txt, src/gui_w32.c, src/mouse.c,
+ src/proto/mouse.pro, src/testing.c, src/testdir/test_gui.vim
+
+Patch 8.2.4903
+Problem: Cannot get the current cmdline completion type and position.
+Solution: Add getcmdcompltype() and getcmdscreenpos(). (Shougo Matsushita,
+ closes #10344)
+Files: runtime/doc/builtin.txt, runtime/doc/usr_41.txt, src/cmdexpand.c,
+ src/proto/cmdexpand.pro, src/evalfunc.c, src/ex_getln.c,
+ src/proto/ex_getln.pro, src/usercmd.c, src/proto/usercmd.pro,
+ src/testdir/test_cmdline.vim
+
+Patch 8.2.4904
+Problem: codecov includes MS-Windows install files.
+Solution: Ignore dosinst.c and uninstall.c.
+Files: .codecov.yml
+
+Patch 8.2.4905
+Problem: codecov includes MS-Windows install header file.
+Solution: Ignore dosinst.h.
+Files: .codecov.yml
+
+Patch 8.2.4906
+Problem: MS-Windows: cannot use transparent background.
+Solution: Make transparent background work with 'termguicolors' and NONE
+ background color. (Yasuhiro Matsumoto, closes #10310, closes #7162)
+Files: runtime/doc/options.txt, src/os_win32.c, src/term.c
+
+Patch 8.2.4907
+Problem: Some users do not want a line comment always inserted.
+Solution: Add the '/' flag to 'formatoptions' to not repeat the comment
+ leader after a statement when using "o".
+Files: runtime/doc/change.txt, src/option.h, src/change.c,
+ src/testdir/test_textformat.vim
+
+Patch 8.2.4908
+Problem: No text formatting for // comment after a statement.
+Solution: format a comment when the 'c' flag is in 'formatoptions'.
+Files: src/textformat.c, src/testdir/test_textformat.vim
+
+Patch 8.2.4909
+Problem: MODE_ enum entries names are too generic.
+Solution: use CH_MODE_.
+Files: src/structs.h, src/channel.c, src/job.c, src/terminal.c
+
+Patch 8.2.4910
+Problem: Imperfect coding.
+Solution: Make code nicer.
+Files: src/ex_getln.c
+
+Patch 8.2.4911
+Problem: The mode #defines are not clearly named.
+Solution: Prepend MODE_. Renumber them to put the mapped modes first.
+Files: src/vim.h, src/autocmd.c, src/buffer.c, src/change.c,
+ src/charset.c, src/cindent.c, src/clipboard.c, src/debugger.c,
+ src/digraph.c, src/drawline.c, src/drawscreen.c, src/edit.c,
+ src/evalfunc.c, src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c,
+ src/fileio.c, src/fold.c, src/getchar.c, src/globals.h, src/gui.c,
+ src/gui_gtk.c, src/gui_w32.c, src/gui_xim.c, src/indent.c,
+ src/insexpand.c, src/macros.h, src/main.c, src/map.c, src/menu.c,
+ src/message.c, src/misc1.c, src/misc2.c, src/mouse.c,
+ src/netbeans.c, src/normal.c, src/ops.c, src/option.c,
+ src/os_unix.c, src/os_win32.c, src/popupmenu.c, src/search.c,
+ src/tag.c, src/screen.c, src/term.c, src/terminal.c,
+ src/textformat.c, src/window.c
+
+Patch 8.2.4912
+Problem: Using execute() to define a lambda doesn't work. (Ernie Rael)
+Solution: Put the getline function in evalarg. (closes #10375)
+Files: src/eval.c, src/evalfunc.c, src/proto/evalfunc.pro,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.4913
+Problem: Popup_hide() does not always have effect.
+Solution: Add the POPF_HIDDEN_FORCE flag. (closes #10376)
+Files: src/popupwin.c, src/vim.h, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popup_prop_not_visible_01a.dump,
+ src/testdir/dumps/Test_popup_prop_not_visible_01b.dump
+
+Patch 8.2.4914
+Problem: String interpolation in :def function may fail.
+Solution: Do not terminate the expression. (closes #10377)
+Files: src/vim9compile.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4915
+Problem: Sometimes the cursor is in the wrong position.
+Solution: When the cursor moved to another line, recompute w_botline.
+ (closes #9736)
+Files: src/move.c
+
+Patch 8.2.4916 (after 8.2.4915)
+Problem: Mouse in Insert mode test fails.
+Solution: Fix the test and check relevant positions.
+Files: src/testdir/test_edit.vim
+
+Patch 8.2.4917
+Problem: Fuzzy expansion of option names is not right.
+Solution: Pass the fuzzy flag down the call chain. (Christian Brabandt,
+ closes #10380, closes #10318)
+Files: src/cmdexpand.c, src/option.c, src/proto/option.pro,
+ src/testdir/test_options.vim
+
+Patch 8.2.4918
+Problem: Conceal character from matchadd() displayed too many times.
+Solution: Check the syntax flag. (closes #10381, closes #7268)
+Files: src/drawline.c, src/testdir/test_matchadd_conceal.vim
+
+Patch 8.2.4919
+Problem: Can add invalid bytes with :spellgood.
+Solution: Check for a valid word string.
+Files: src/mbyte.c, src/spellfile.c, src/errors.h,
+ src/testdir/test_spell_utf8.vim
+
+Patch 8.2.4920 (after 8.2.4902)
+Problem: MS-Windows GUI: unused variables.
+Solution: Delete the variables. (John Marriott)
+Files: src/gui_w32.c
+
+Patch 8.2.4921
+Problem: Spell test fails because of new illegal byte check.
+Solution: Remove the test.
+Files: src/testdir/test_spell.vim
+
+Patch 8.2.4922 (after 8.2.4916)
+Problem: Mouse test fails on MS-Windows.
+Solution: Set 'mousemodel' to "extend".
+Files: src/testdir/test_edit.vim
+
+Patch 8.2.4923
+Problem: Test checks for terminal feature unnecessarily.
+Solution: Remove CheckRunVimInTerminal. (closes #10383)
+Files: src/testdir/test_matchadd_conceal.vim
+
+Patch 8.2.4924
+Problem: maparg() may return a string that cannot be reused.
+Solution: use msg_outtrans_special() instead of str2special().
+ (closes #10384)
+Files: src/message.c, src/option.c, src/testdir/test_map_functions.vim,
+ src/testdir/test_mapping.vim, src/testdir/test_options.vim
+
+Patch 8.2.4925
+Problem: Trailing backslash may cause reading past end of line.
+Solution: Check for NUL after backslash.
+Files: src/textobject.c, src/testdir/test_textobjects.vim
+
+Patch 8.2.4926
+Problem: #ifdef for crypt feature around too many lines.
+Solution: Move code outside of #ifdef. (closes #10388)
+Files: src/option.c
+
+Patch 8.2.4927
+Problem: Return type of remove() incorrect when using three arguments.
+Solution: Use first argument type when there are three arguments.
+ (closes #10387)
+Files: src/evalfunc.c, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4928
+Problem: Various white space and cosmetic mistakes.
+Solution: Change spaces to tabs, improve comments.
+Files: src/bufwrite.c, src/channel.c, src/cindent.c, src/crypt.c,
+ src/debugger.c, src/digraph.c, src/edit.c, src/evalwindow.c,
+ src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c, src/fileio.c,
+ src/filepath.c, src/gui.c, src/highlight.c, src/indent.c,
+ src/insexpand.c, src/job.c, src/keymap.h, src/macros.h,
+ src/menu.c, src/misc1.c, src/misc2.c, src/mouse.c, src/move.c,
+ src/normal.c, src/ops.c, src/option.c, src/option.h, src/search.c,
+ src/session.c, src/spellsuggest.c, src/structs.h, src/tag.c,
+ src/term.c, src/terminal.c, src/textformat.c, src/typval.c,
+ src/ui.c, src/userfunc.c, src/vim.h, src/vim9.h,
+ src/vim9compile.c, src/vim9execute.c, src/window.c,
+ src/testdir/test_cursorline.vim, src/os_unix.c, src/if_lua.c,
+ src/if_py_both.h, src/os_amiga.c, src/os_win32.c, src/os_mswin.c,
+ src/os_vms.c, src/os_vms_conf.h
+
+Patch 8.2.4929
+Problem: Off-by-one error in statusline item.
+Solution: Subtrace one less. (closes #10394, closes #5599)
+Files: src/buffer.c, src/testdir/test_statusline.vim,
+ src/testdir/dumps/Test_statusline_hl.dump
+
+Patch 8.2.4930
+Problem: Interpolated string expression requires escaping.
+Solution: Do not require escaping in the expression.
+Files: runtime/doc/eval.txt, src/typval.c, src/proto/typval.pro,
+ src/dict.c, src/eval.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/vim9compile.c, src/proto/vim9compile.pro, src/vim9expr.c,
+ src/vim9instr.c, src/alloc.c, src/proto/alloc.pro,
+ src/testdir/test_expr.vim, src/testdir/test_let.vim
+
+Patch 8.2.4931
+Problem: Crash with sequence of Perl commands.
+Solution: Move PUTBACK to another line. (closes #10386)
+Files: src/if_perl.xs
+
+Patch 8.2.4932
+Problem: Not easy to filter the output of maplist().
+Solution: Add mode_bits to the dictionary. (Ernie Rael, closes #10356)
+Files: runtime/doc/builtin.txt, src/map.c,
+ src/testdir/test_map_functions.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4933
+Problem: A few more capitalization mistakes in error messages.
+Solution: Adjust capitalization. (Doug Kearns)
+Files: src/errors.h
+
+Patch 8.2.4934
+Problem: String interpolation fails when not evaluating.
+Solution: Skip the expression when not evaluating. (closes #10398)
+Files: src/typval.c, src/evalvars.c, src/proto/evalvars.pro,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4935
+Problem: With 'foldmethod' "indent" some lines are not included in the
+ fold. (Oleg Koshovetc)
+Solution: Fix it. (Brandon Simmons, closes #10399, closes #3214)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.2.4936
+Problem: MS-Windows: mouse coordinates for scroll event are wrong.
+Solution: Convert coordinates to the text area coordinates. (closes #10400)
+Files: src/gui_w32.c
+
+Patch 8.2.4937 (after 8.2.4931)
+Problem: No test for what 8.2.4931 fixes.
+Solution: Add a test that triggers a valgrind error.
+Files: src/testdir/test_perl.vim
+
+Patch 8.2.4938
+Problem: Crash when matching buffer with invalid pattern.
+Solution: Check for NULL regprog.
+Files: src/buffer.c, src/testdir/test_buffer.vim
+
+Patch 8.2.4939
+Problem: matchfuzzypos() with "matchseq" does not have all positions.
+Solution: Also add a position for white space. (closes #10404)
+Files: runtime/doc/builtin.txt, src/search.c,
+ src/testdir/test_matchfuzzy.vim
+
+Patch 8.2.4940
+Problem: Some code is never used.
+Solution: Remove dead code. Add a few more test cases.
+Files: src/vim9expr.c, src/proto/vim9expr.pro, src/vim9compile.c,
+ src/testdir/test_vim9_builtin.vim, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4941
+Problem: '[ and '] marks may be wrong after undo.
+Solution: Adjust the '[ and '] marks if needed. (closes #10407, closes #1281)
+Files: src/undo.c, src/testdir/test_undo.vim
+
+Patch 8.2.4942
+Problem: Error when setting 'filetype' in help file again.
+Solution: Deal with text property type already existing. (closes #10409)
+Files: runtime/import/dist/vimhelp.vim
+
+Patch 8.2.4943
+Problem: Changing 'switchbuf' may have no effect.
+Solution: Handle 'switchbuf' in didset_string_options(). (Sean Dewar,
+ closes #10406)
+Files: src/optionstr.c, src/testdir/test_options.vim
+
+Patch 8.2.4944
+Problem: Text properties are wrong after "cc". (Axel Forsman)
+Solution: Pass the deleted byte count to inserted_bytes(). (closes #10412,
+ closes #7737, closes #5763)
+Files: src/change.c, src/testdir/test_textprop.vim
+
+Patch 8.2.4945
+Problem: Inconsistent use of white space.
+Solution: Use Tabs and Spaces consistently.
+Files: src/os_amiga.c, src/if_py_both.h, src/os_win32.c, src/os_mswin.c,
+ src/os_vms.c, src/os_vms_conf.h
+
+Patch 8.2.4946
+Problem: Vim9: some code not covered by tests.
+Solution: Add a few more test cases. Remove dead code.
+Files: src/vim9expr.c, src/testdir/test_vim9_expr.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4947
+Problem: Text properties not adjusted when accepting spell suggestion.
+Solution: Adjust text properties when text changes. (closes #10414)
+Files: src/spell.c, src/spellsuggest.c, src/testdir/test_textprop.vim
+
+Patch 8.2.4948
+Problem: Cannot use Perl heredoc in nested :def function. (Virginia
+ Senioria)
+Solution: Only concatenate heredoc lines when not in a nested function.
+ (closes #10415)
+Files: src/userfunc.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4949
+Problem: Vim9: some code not covered by tests.
+Solution: Add a few more test cases. Fix double error message.
+Files: src/vim9expr.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4950
+Problem: Text properties position wrong after shifting text.
+Solution: Adjust the text properties when shifting a block of text.
+ (closes #10418)
+Files: src/ops.c, src/testdir/test_textprop.vim
+
+Patch 8.2.4951
+Problem: Smart indenting done when not enabled.
+Solution: Check option values before setting can_si. (closes #10420)
+Files: src/indent.c, src/proto/indent.pro, src/change.c, src/edit.c,
+ src/ops.c, src/testdir/test_smartindent.vim
+
+Patch 8.2.4952
+Problem: GUI test will fail if color scheme changes.
+Solution: Reduce the test for now.
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.4953
+Problem: With 'smartindent' inserting '}' after completion goes wrong.
+Solution: Check the cursor is in indent. (closes #10420)
+Files: src/indent.c, src/testdir/test_smartindent.vim
+
+Patch 8.2.4954
+Problem: Inserting line breaks text property spanning more than one line.
+Solution: Check TP_FLAG_CONT_PREV and TP_FLAG_CONT_NEXT. (closes #10423)
+Files: src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.4955
+Problem: Text property in wrong position after auto-indent.
+Solution: Adjust text property columns. (closes #10422, closes #7719)
+Files: src/change.c, src/testdir/test_textprop.vim
+
+Patch 8.2.4956
+Problem: Reading past end of line with "gf" in Visual block mode.
+Solution: Do not include the NUL in the length.
+Files: src/normal.c, src/testdir/test_gf.vim
+
+Patch 8.2.4957
+Problem: Text properties in a wrong position after a block change.
+Solution: Adjust the properties columns. (closes #10427)
+Files: src/ops.c, src/testdir/test_textprop.vim
+
+Patch 8.2.4958
+Problem: A couple conditions are always true.
+Solution: Remove the conditions. (Goc Dundar, closes #10428)
+Files: src/evalfunc.c, src/quickfix.c
+
+Patch 8.2.4959
+Problem: Using NULL regexp program.
+Solution: Check for regexp program becoming NULL in more places.
+Files: src/buffer.c, src/testdir/test_buffer.vim
+
+Patch 8.2.4960
+Problem: Text properties that cross line boundary are not correctly updated
+ for a deleted line.
+Solution: Correct computing location of text property entry. (Paul Ollis,
+ closes #10431, closes #10430)
+Files: src/memline.c, src/testdir/test_textprop.vim
+
+Patch 8.2.4961
+Problem: Build error with a certain combination of features.
+Solution: Adjust #if. (John Marriott)
+Files: src/memline.c
+
+Patch 8.2.4962
+Problem: Files show up in git status.
+Solution: Adjust the list of ignored files. Clean up more test files.
+ (Shane xb Qian, closes #9929)
+Files: .gitignore, src/testdir/Makefile
+
+Patch 8.2.4963
+Problem: Expanding path with "/**" may overrun end of buffer.
+Solution: Use vim_snprintf().
+Files: src/filepath.c
+
+Patch 8.2.4964
+Problem: MS-Windows GUI: mouse event test is flaky.
+Solution: Add a short delay after generating a mouse event.
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.4965
+Problem: GUI: testing mouse move event depends on screen cell size.
+Solution: Multiply the row and column with the screen cell size.
+Files: runtime/doc/testing.txt, src/testing.c, src/testdir/test_gui.vim
+
+Patch 8.2.4966
+Problem: MS-Windows GUI: mouse event test gets extra event.
+Solution: Ignore one move event.
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.4967 (after 8.2.4966)
+Problem: MS-Windows GUI: mouse event test sometimes fails.
+Solution: Ignore one move event only if there is an extra event.
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.4968
+Problem: Reading past end of the line when C-indenting.
+Solution: Check for NUL.
+Files: src/cindent.c, src/testdir/test_cindent.vim
+
+Patch 8.2.4969
+Problem: Changing text in Visual mode may cause invalid memory access.
+Solution: Check the Visual position after making a change.
+Files: src/change.c, src/edit.c, src/misc2.c, src/proto/misc2.pro,
+ src/testdir/test_visual.vim
+
+Patch 8.2.4970
+Problem: "eval 123" gives an error, "eval 'abc'" does not.
+Solution: Also give an error when evaluating only a string. (closes #10434)
+Files: src/ex_eval.c, src/testdir/test_vim9_cmd.vim
+
+Patch 8.2.4971
+Problem: Vim9: interpolated string seen as range.
+Solution: Recognize an interpolated string at the start of a command line.
+ (closes #10434)
+Files: src/ex_docmd.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4972
+Problem: Vim9: compilation fails when using dict member when skipping.
+Solution: Do not generate ISN_USEDICT when skipping. (closes #10433)
+Files: src/vim9expr.c, src/testdir/test_vim9_expr.vim
+
+Patch 8.2.4973
+Problem: Vim9: type error for list unpack mentions argument.
+Solution: Mention variable. (close #10435)
+Files: src/vim9.h, src/vim9execute.c, src/vim9instr.c,
+ src/proto/vim9instr.pro, src/vim9compile.c,
+ src/testdir/test_vim9_script.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4974
+Problem: ":so" command may read after end of buffer.
+Solution: Compute length of text properly.
+Files: src/scriptfile.c, src/testdir/test_source.vim
+
+Patch 8.2.4975
+Problem: Recursive command line loop may cause a crash.
+Solution: Limit recursion of getcmdline().
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.4976
+Problem: Coverity complains about not restoring a saved value.
+Solution: Restore value before handling error.
+Files: src/vim9execute.c
+
+Patch 8.2.4977
+Problem: Memory access error when substitute expression changes window.
+Solution: Disallow changing window in substitute expression.
+Files: src/ex_cmds.c, src/testdir/test_substitute.vim
+
+Patch 8.2.4978
+Problem: No error if engine selection atom is not at the start.
+Solution: Give an error. (Christian Brabandt, closes #10439)
+Files: runtime/doc/pattern.txt, src/errors.h, src/regexp_bt.c,
+ src/regexp_nfa.c, src/testdir/test_regexp_latin.vim
+
+Patch 8.2.4979
+Problem: Accessing freed memory when line is flushed.
+Solution: Make a copy of the pattern to search for.
+Files: src/window.c, src/testdir/test_tagjump.vim
+
+Patch 8.2.4980
+Problem: When 'shortmess' contains 'A' loading a session may still warn for
+ an existing swap file. (Melker Österberg)
+Solution: Keep the 'A' flag to 'shortmess' in the session file.
+ (closes #10443)
+Files: src/session.c, src/testdir/test_mksession.vim
+
+Patch 8.2.4981
+Problem: It is not possible to manipulate autocommands.
+Solution: Add functions to add, get and set autocommands. (Yegappan
+ Lakshmanan, closes #10291)
+Files: runtime/doc/autocmd.txt, runtime/doc/builtin.txt,
+ runtime/doc/usr_41.txt, src/autocmd.c, src/evalfunc.c,
+ src/proto/autocmd.pro, src/testdir/test_autocmd.vim,
+ src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.4982
+Problem: Colors in terminal window are not 100% correct.
+Solution: Use g:terminal_ansi_colors as documented. (closes #10429,
+ closes #7227 closes #10347)
+Files: src/job.c, src/option.c, src/proto/term.pro,
+ src/terminal.c, src/proto/terminal.pro, src/term.c,
+ src/testdir/test_functions.vim, src/testdir/test_terminal.vim
+
+Patch 8.2.4983 (after 8.2.4982)
+Problem: Colors test fails in the GUI.
+Solution: Reset g:terminal_ansi_colors.
+Files: src/testdir/test_functions.vim
+
+Patch 8.2.4984
+Problem: Dragging statusline fails for window with winbar.
+Solution: Fix off-by-one error. (closes #10448)
+Files: src/mouse.c, src/testdir/test_winbar.vim
+
+Patch 8.2.4985
+Problem: PVS warns for possible array underrun.
+Solution: Add a check for a positive value. (Goc Dundar, closes #10451)
+Files: src/spell.c
+
+Patch 8.2.4986
+Problem: Some github actions are outdated.
+Solution: Update CodeQl to v2, update checkout to v3. (closes #10450)
+Files: .github/workflows/ci.yml, .github/workflows/codeql-analysis.yml,
+ .github/workflows/coverity.yml
+
+Patch 8.2.4987
+Problem: After deletion a small fold may be closable.
+Solution: Check for a reverse range. (Brandon Simmons, closes #10457)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.2.4988
+Problem: Textprop in wrong position when replacing multi-byte chars.
+Solution: Adjust textprop position. (closes #10461)
+Files: src/change.c, src/testdir/test_textprop.vim
+
+Patch 8.2.4989
+Problem: Cannot specify a function name for :defcompile.
+Solution: Implement a function name argument for :defcompile.
+Files: runtime/doc/vim9.txt, src/userfunc.c, src/proto/userfunc.pro,
+ src/vim9execute.c, src/ex_cmds.h, src/testdir/test_vim9_cmd.vim,
+ src/testdir/test_vim9_disassemble.vim
+
+Patch 8.2.4990 (after 8.2.4989)
+Problem: Memory leak when :defcompile fails.
+Solution: Free fname when returning early.
+Files: src/userfunc.c
+
+Patch 8.2.4991
+Problem: No test for what patch 8.1.0535 fixes.
+Solution: Add a test. (closes #10462)
+Files: src/testdir/test_fold.vim
+
+Patch 8.2.4992 (after 8.2.4989)
+Problem: Compiler warning for possibly uninitialized variable. (Tony
+ Mechelynck)
+Solution: Initialize variable in the caller instead of in the function.
+Files: src/userfunc.c, src/vim9execute.c
+
+Patch 8.2.4993
+Problem: smart/C/lisp indenting is optional, which makes the code more
+ complex, while it only reduces the executable size a bit.
+Solution: Graduate FEAT_CINDENT, FEAT_SMARTINDENT and FEAT_LISP.
+Files: runtime/doc/builtin.txt, runtime/doc/indent.txt,
+ runtime/doc/options.txt, runtime/doc/various.txt, src/feature.h,
+ src/buffer.c, src/change.c, src/cindent.c, src/charset.c,
+ src/edit.c, src/evalfunc.c, src/indent.c, src/insexpand.c,
+ src/main.c, src/mouse.c, src/ops.c, src/option.c, src/optionstr.c,
+ src/register.c, src/search.c, src/textformat.c, src/version.c,
+ src/option.h, src/optiondefs.h, src/structs.h, src/globals.h,
+ src/testdir/test_edit.vim
+
+Patch 8.2.4994
+Problem: Tests are using legacy functions.
+Solution: Convert a few tests to use :def functions.
+Files: src/testdir/test_cindent.vim
+
+Patch 8.2.4995 (after 8.2.4992)
+Problem: Still a compiler warning for possibly uninitialized variable.
+ (Tony Mechelynck)
+Solution: Initialize variables.
+Files: src/vim9execute.c
+
+Patch 8.2.4996 (after 8.2.4969)
+Problem: setbufline() may change Visual selection. (Qiming Zhao)
+Solution: Disable Visual mode when using another buffer. (closes #10466)
+Files: src/evalbuffer.c, src/testdir/test_bufline.vim
+
+Patch 8.2.4997
+Problem: Python: changing hidden buffer can cause the display to be messed
+ up.
+Solution: Do not mark changed lines when using another buffer. (Paul Ollis,
+ closes #10437, closes #7972)
+Files: src/if_py_both.h, src/testdir/test_python3.vim
+
+Patch 8.2.4998
+Problem: Vim9: crash when using multiple funcref().
+Solution: Check if varargs type is NULL. (closes #10467)
+Files: src/vim9type.c, src/testdir/test_vim9_func.vim
+
+Patch 8.2.4999
+Problem: Filetype test table is not properly sorted.
+Solution: Sort by filetype. (Doug Kearns)
+Files: src/testdir/test_filetype.vim
+
+Patch 8.2.5000
+Problem: No patch for documentation updates.
+Solution: Update documentation files.
+Files: runtime/doc/arabic.txt, runtime/doc/autocmd.txt,
+ runtime/doc/builtin.txt, runtime/doc/change.txt,
+ runtime/doc/channel.txt, runtime/doc/cmdline.txt,
+ runtime/doc/diff.txt, runtime/doc/digraph.txt,
+ runtime/doc/editing.txt, runtime/doc/eval.txt,
+ runtime/doc/filetype.txt, runtime/doc/fold.txt,
+ runtime/doc/ft_ada.txt, runtime/doc/ft_ps1.txt,
+ runtime/doc/ft_raku.txt, runtime/doc/ft_rust.txt,
+ runtime/doc/ft_sql.txt, runtime/doc/gui.txt,
+ runtime/doc/gui_w32.txt, runtime/doc/helphelp.txt,
+ runtime/doc/help.txt, runtime/doc/if_cscop.txt,
+ runtime/doc/if_lua.txt, runtime/doc/if_perl.txt,
+ runtime/doc/if_pyth.txt, runtime/doc/if_tcl.txt,
+ runtime/doc/indent.txt, runtime/doc/index.txt,
+ runtime/doc/insert.txt, runtime/doc/intro.txt,
+ runtime/doc/map.txt, runtime/doc/mbyte.txt,
+ runtime/doc/message.txt, runtime/doc/motion.txt,
+ runtime/doc/netbeans.txt, runtime/doc/options.txt,
+ runtime/doc/os_dos.txt, runtime/doc/os_vms.txt,
+ runtime/doc/os_win32.txt, runtime/doc/pattern.txt,
+ runtime/doc/pi_netrw.txt, runtime/doc/pi_zip.txt,
+ runtime/doc/popup.txt, runtime/doc/print.txt,
+ runtime/doc/quickfix.txt, runtime/doc/quickref.txt,
+ runtime/doc/remote.txt, runtime/doc/repeat.txt,
+ runtime/doc/rileft.txt, runtime/doc/scroll.txt,
+ runtime/doc/sign.txt, runtime/doc/spell.txt,
+ runtime/doc/sponsor.txt, runtime/doc/starting.txt,
+ runtime/doc/syntax.txt, runtime/doc/tabpage.txt,
+ runtime/doc/tagsrch.txt, runtime/doc/terminal.txt,
+ runtime/doc/term.txt, runtime/doc/testing.txt,
+ runtime/doc/textprop.txt, runtime/doc/tips.txt,
+ runtime/doc/todo.txt, runtime/doc/uganda.txt,
+ runtime/doc/undo.txt, runtime/doc/usr_02.txt,
+ runtime/doc/usr_04.txt, runtime/doc/usr_05.txt,
+ runtime/doc/usr_06.txt, runtime/doc/usr_08.txt,
+ runtime/doc/usr_09.txt, runtime/doc/usr_12.txt,
+ runtime/doc/usr_20.txt, runtime/doc/usr_29.txt,
+ runtime/doc/usr_40.txt, runtime/doc/usr_41.txt,
+ runtime/doc/usr_45.txt, runtime/doc/usr_46.txt,
+ runtime/doc/usr_50.txt, runtime/doc/usr_51.txt,
+ runtime/doc/usr_52.txt, runtime/doc/usr_90.txt,
+ runtime/doc/usr_toc.txt, runtime/doc/various.txt,
+ runtime/doc/version5.txt, runtime/doc/version6.txt,
+ runtime/doc/version7.txt, runtime/doc/version8.txt,
+ runtime/doc/version9.txt, runtime/doc/vi_diff.txt,
+ runtime/doc/vim9.txt, runtime/doc/visual.txt,
+ runtime/doc/windows.txt, runtime/doc/tags, runtime/doc/Makefile
+
+Patch 8.2.5001
+Problem: Checking translations affects the search pattern history.
+Solution: Use "keeppatterns". (Doug Kearns)
+Files: src/po/check.vim
+
+Patch 8.2.5002
+Problem: deletebufline() may change Visual selection.
+Solution: Disable Visual mode when using another buffer. (closes #10469)
+Files: src/evalbuffer.c, src/testdir/test_bufline.vim
+
+Patch 8.2.5003
+Problem: Cannot do bitwise shifts.
+Solution: Add the >> and << operators. (Yegappan Lakshmanan, closes #8457)
+Files: runtime/doc/eval.txt, src/errors.h, src/eval.c, src/structs.h,
+ src/vim.h, src/vim9execute.c, src/vim9expr.c,
+ src/testdir/test_expr.vim, src/testdir/test_vim9_disassemble.vim,
+ src/testdir/test_vim9_expr.vim
+
+Patch 8.2.5004
+Problem: Right shift on negative number does not work as documented.
+Solution: Use a uvarnumber_T type cast.
+Files: runtime/doc/eval.txt, src/eval.c, src/vim9expr.c,
+ src/vim9execute.c, src/charset.c, src/testdir/test_expr.vim
+
+Patch 8.2.5005 (after 8.2.5003)
+Problem: Compiler warning for uninitialized variable. (John Marriott)
+Solution: Initialize the pointer to NULL.
+Files: src/vim9expr.vim
+
+Patch 8.2.5006 (after 8.2.5003)
+Problem: Asan warns for undefined behavior.
+Solution: Cast the shifted value to unsigned.
+Files: src/eval.c, src/vim9expr.c, src/vim9execute.c
+
+Patch 8.2.5007
+Problem: Spell suggestion may use uninitialized memory. (Zdenek Dohnal)
+Solution: Avoid going over the end of the word.
+Files: src/spellsuggest.c, src/testdir/test_spell_utf8.vim
+
+Patch 8.2.5008
+Problem: When 'formatoptions' contains "/" wrongly wrapping a long trailing
+ comment.
+Solution: Pass the OPENLINE_FORMAT flag.
+Files: src/change.c, src/vim.h, src/textformat.c,
+ src/testdir/test_textformat.vim
+
+Patch 8.2.5009
+Problem: Fold may not be closable after appending.
+Solution: Set the fd_small flag to MAYBE. (Brandon Simmons, closes #10471)
+Files: src/fold.c, src/testdir/test_fold.vim
+
+Patch 8.2.5010
+Problem: The terminal debugger uses various global variables.
+Solution: Add a dictionary to hold the terminal debugger preferences.
+Files: runtime/doc/terminal.txt,
+ runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
+
+Patch 8.2.5011
+Problem: Replacing an autocommand requires several lines.
+Solution: Add the "replace" flag to autocmd_add(). (Yegappan Lakshmanan,
+ closes #10473)
+Files: runtime/doc/autocmd.txt, runtime/doc/builtin.txt, src/autocmd.c,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.5012
+Problem: Cannot select one character inside ().
+Solution: Do not try to extend the area if it is empty. (closes #10472,
+ closes #6616)
+Files: src/textobject.c, src/testdir/test_textobjects.vim
+
+Patch 8.2.5013
+Problem: After text formatting the cursor may be in an invalid position.
+Solution: Correct the cursor position after formatting.
+Files: src/textformat.c, src/testdir/test_textformat.vim
+
+Patch 8.2.5014
+Problem: Byte offsets are wrong when using text properties.
+Solution: Make sure text properties do not affect the byte counts.
+ (Paul Ollis, closes #10474)
+Files: src/memline.c, src/textprop.c, src/testdir/test_textprop.vim
+
+Patch 8.2.5015
+Problem: Hoon and Moonscript files are not recognized.
+Solution: Add filetype patterns. (Goc Dundar, closes #10478)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.5016
+Problem: Access before start of text with a put command.
+Solution: Check the length is more than zero.
+Files: src/register.c, src/testdir/test_put.vim
+
+Patch 8.2.5017
+Problem: Gcc 12.1 warns for uninitialized variable.
+Solution: Initialize the variable. (closes #10476)
+Files: src/evalvars.c
+
+Patch 8.2.5018
+Problem: Vim9: some code is not covered by tests.
+Solution: Delete dead code.
+Files: src/vim9instr.c, src/proto/vim9instr.pro, src/vim9compile.c,
+ src/vim9expr.c,
+
+Patch 8.2.5019
+Problem: Cannot get the first screen column of a character.
+Solution: Let virtcol() optionally return a list. (closes #10482,
+ closes #7964)
+Files: runtime/doc/builtin.txt, src/evalfunc.c,
+ src/testdir/test_functions.vim, src/testdir/test_vim9_builtin.vim
+
+Patch 8.2.5020
+Problem: Using 'imstatusfunc' and 'imactivatefunc' breaks 'foldopen'.
+Solution: Save and restore the KeyTyped flag. (closes #10479)
+Files: src/gui_xim.c, src/testdir/test_iminsert.vim
+
+
+Patch 8.2.5021
+Problem: Build fails with normal features and +terminal. (Dominique Pellé)
+Solution: Add #ifdefs. (closes #10484)
+Files: src/terminal.c
+
+Patch 8.2.5022
+Problem: 'completefunc'/'omnifunc' error does not end completion.
+Solution: Check if there was an error or exception. (closes #10486,
+ closes #4218)
+Files: src/insexpand.c, src/testdir/test_ins_complete.vim
+
+Patch 8.2.5023
+Problem: Substitute overwrites allocated buffer.
+Solution: Disallow undo when in a substitute command.
+Files: src/normal.c, src/undo.c, src/testdir/test_substitute.vim
+
+Patch 8.2.5024
+Problem: Using freed memory with "]d".
+Solution: Copy the pattern before searching.
+Files: src/normal.c, src/testdir/test_tagjump.vim
+
+Patch 8.2.5025
+Problem: Vim9: a few lines not covered by tests.
+Solution: Add a few tests.
+Files: src/vim9script.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_import.vim
+
+Patch 8.2.5026
+Problem: Vim9: a few lines not covered by tests.
+Solution: Delete dead code. Add a few test cases. make "12->func()" work.
+Files: src/vim9type.c, src/ex_docmd.c, src/proto/ex_docmd.pro,
+ src/vim9compile.c, src/testdir/test_vim9_assign.vim,
+ src/testdir/test_vim9_func.vim
+
+Patch 8.2.5027
+Problem: Error for missing :endif when an exception was thrown. (Dani
+ Dickstein)
+Solution: Do not give an error when aborting. (closes #10490)
+Files: src/ex_docmd.c, src/testdir/test_trycatch.vim
+
+Patch 8.2.5028
+Problem: Syntax regexp matching can be slow.
+Solution: Adjust the counters for checking the timeout to check about once
+ per msec. (closes #10487, closes #2712)
+Files: src/regexp_bt.c, src/regexp_nfa.c
+
+Patch 8.2.5029
+Problem: "textlock" is always zero.
+Solution: Remove "textlock" and rename "textwinlock" to "textlock".
+ (closes #10489)
+Files: runtime/doc/insert.txt, runtime/doc/tags, src/beval.c,
+ src/change.c, src/edit.c, src/errors.h, src/eval.c, src/ex_cmds.c,
+ src/ex_getln.c, src/proto/ex_getln.pro, src/globals.h,
+ src/indent.c, src/insexpand.c, src/map.c, src/register.c,
+ src/undo.c, src/window.c, src/testdir/test_edit.vim,
+ src/testdir/test_ins_complete.vim, src/testdir/test_popup.vim,
+ src/testdir/test_quickfix.vim
+
+Patch 8.2.5030
+Problem: autocmd_add() can only handle one event and pattern.
+Solution: Support a list of events and patterns. (Yegappan Lakshmanan,
+ closes #10483)
+Files: runtime/doc/builtin.txt, src/autocmd.c, src/errors.h,
+ src/testdir/test_autocmd.vim
+
+Patch 8.2.5031
+Problem: Cannot easily run the benchmarks.
+Solution: Have "make benchmark" in the src directory work.
+Files: src/Makefile, src/testdir/Makefile
+
+Patch 8.2.5032
+Problem: Python 3 test fails without the GUI.
+Solution: Check the balloon_eval feature is available.
+Files: src/testdir/test_python3.vim
+
+Patch 8.2.5033 (after 8.2.5030)
+Problem: Build error with +eval but without +quickfix. Warning for
+ uninitialized variable.
+Solution: Adjust #ifdefs. (John Marriott)
+Files: src/errors.h, src/autocmd.c
+
+Patch 8.2.5034
+Problem: There is no way to get the byte index from a virtual column.
+Solution: Add virtcol2col(). (Yegappan Lakshmanan, closes #10477,
+ closes #10098)
+Files: runtime/doc/builtin.txt, runtime/doc/usr_41.txt, src/evalfunc.c,
+ src/move.c, src/proto/move.pro, src/testdir/test_cursor_func.vim
+
+Patch 8.2.5035
+Problem: When splitting a window the changelist position moves.
+Solution: Set the changelist index a bit later. (closes #10493)
+Files: src/window.c, src/testdir/test_changelist.vim,
+ src/testdir/test_normal.vim
+
+Patch 8.2.5036 (after 8.2.5028)
+Problem: Using two counters for timeout check in NFA engine.
+Solution: Use only one counter. Tune the counts based on guessing.
+Files: src/regexp_nfa.c
+
+Patch 8.2.5037
+Problem: Cursor position may be invalid after "0;" range.
+Solution: Check the cursor position when it was set by ";" in the range.
+Files: src/ex_docmd.c, src/testdir/test_excmd.vim
+
+Patch 8.2.5038
+Problem: A finished terminal in a popup window does not show a scrollbar.
+Solution: Show the scrollbar if the terminal job is finished. (closes
+ #10497)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_poptermscroll_1.dump,
+ src/testdir/dumps/Test_popupwin_poptermscroll_2.dump,
+ src/testdir/dumps/Test_popupwin_poptermscroll_3.dump
+
+Patch 8.2.5039
+Problem: Confusing error if first argument of popup_create() is wrong.
+Solution: Give a more informative error.
+Files: src/popupwin.c, src/testdir/test_popupwin.vim, src/errors.h,
+ src/testdir/dumps/Test_popup_settext_07.dump
+
+Patch 8.2.5040
+Problem: Scrollbar thumb in scrolled popup not visible.
+Solution: Show at least one thumb character. (fixes 10492)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_scroll_13.dump
+
+Patch 8.2.5041
+Problem: Cannot close a terminal popup with "NONE" job.
+Solution: Adjust the conditions for whether a job is running.
+ (closes #10498)
+Files: src/buffer.c, src/terminal.c, src/proto/terminal.pro,
+ src/undo.c, src/testdir/test_popupwin.vim
+
+Patch 8.2.5042
+Problem: Scrollbar thumb in tall scrolled popup not visible.
+Solution: Show at least one thumb character. (fixes 10492)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_scroll_13.dump
+
+Patch 8.2.5043
+Problem: Can open a cmdline window from a substitute expression.
+Solution: Disallow opening a command line window when text or buffer is
+ locked.
+Files: src/buffer.c, src/ex_getln.c, src/proto/ex_getln.pro,
+ src/window.c, src/testdir/test_substitute.vim
+
+Patch 8.2.5044 (after 8.2.5043)
+Problem: Command line test fails.
+Solution: Also beep when cmdline win can't be opened because of locks.
+ Make the test not beep. Make the test pass on MS-Windows.
+Files: src/ex_getln.c, src/testdir/test_substitute.vim
+
+Patch 8.2.5045
+Problem: Can escape a terminal popup window when the job is finished.
+Solution: Only check for a finished job where it is relevant.
+ (closes #10253)
+Files: src/popupwin.c, src/testdir/test_popupwin.vim,
+ src/testdir/dumps/Test_popupwin_poptermscroll_1.dump,
+ src/testdir/dumps/Test_popupwin_poptermscroll_2.dump,
+ src/testdir/dumps/Test_popupwin_poptermscroll_3.dump,
+ src/testdir/dumps/Test_popupwin_poptermscroll_4.dump
+
+Patch 8.2.5046
+Problem: vim_regsub() can overwrite the destination.
+Solution: Pass the destination length, give an error when it doesn't fit.
+Files: src/regexp.h, src/regexp.c, src/proto/regexp.pro, src/eval.c,
+ src/ex_cmds.c
+
+Patch 8.2.5047
+Problem: CurSearch highlight is often wrong.
+Solution: Remember the last highlighted position and redraw when needed.
+Files: src/globals.h, src/match.c, src/drawscreen.c, src/change.c,
+ src/testdir/test_search.vim,
+ src/testdir/dumps/Test_hlsearch_cursearch_changed_1.dump
+
+Patch 8.2.5048
+Problem: When using XIM the gui test may fail.
+Solution: Only use --not-a-term when not using XIM.
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.5049
+Problem: Insufficient tests for autocommands.
+Solution: Add a few more tests. (Yegappan Lakshmanan, closes #10507)
+Files: src/autocmd.c, src/testdir/gen_opt_test.vim,
+ src/testdir/test_autocmd.vim, src/testdir/test_cmdline.vim
+
+Patch 8.2.5050
+Problem: Using freed memory when searching for pattern in path.
+Solution: Make a copy of the line.
+Files: src/search.c, src/testdir/test_tagjump.vim
+
+Patch 8.2.5051
+Problem: Check for autocmd_add() event argument is confusing.
+Solution: Make the code more straightforward.
+Files: src/autocmd.c
+
+Patch 8.2.5052
+Problem: CI checkout step title is a bit cryptic.
+Solution: Add a better title. (closes #10509)
+Files: .github/workflows/ci.yml, .github/workflows/coverity.yml,
+ .github/workflows/codeql-analysis.yml
+
+Patch 8.2.5053
+Problem: Cannot have a comment halfway an expression in an autocmd command
+ block.
+Solution: When skipping over the NL also skip over comments. (closes #10519)
+Files: src/eval.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.5054
+Problem: No good filetype for conf files similar to dosini.
+Solution: Add the confini filetype. (closes #10518)
+Files: runtime/filetype.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.5055
+Problem: Statusline is not updated when terminal title changes.
+Solution: Redraw the status line when the title changes. (issue #10425)
+Files: src/terminal.c
+
+Patch 8.2.5056
+Problem: The channel log only contains some of the raw terminal output.
+Solution: Add the "o" flag to log all terminal output. Use it for "--log".
+Files: runtime/doc/channel.txt, runtime/doc/starting.txt, src/main.c,
+ src/channel.c, src/vim.h, src/term.c, src/edit.c, src/normal.c,
+ src/optionstr.c
+
+Patch 8.2.5057
+Problem: Using gettimeofday() for timeout is very inefficient.
+Solution: Set a platform dependent timer. (Paul Ollis, closes #10505)
+Files: src/auto/configure, src/config.h.in, src/configure.ac,
+ src/drawscreen.c, src/errors.h, src/evalfunc.c, src/ex_cmds.c,
+ src/ex_getln.c, src/match.c, src/os_mac.h, src/os_macosx.m,
+ src/os_unix.c, src/os_win32.c, src/proto/os_unix.pro,
+ src/proto/os_win32.pro, src/proto/regexp.pro, src/quickfix.c,
+ src/regexp.c, src/regexp.h, src/regexp_bt.c, src/regexp_nfa.c,
+ src/screen.c, src/search.c, src/structs.h, src/syntax.c,
+ src/testdir/test_hlsearch.vim, src/testdir/test_search.vim,
+ src/testdir/test_syntax.vim
+
+Patch 8.2.5058
+Problem: input() does not handle composing characters properly.
+Solution: Use mb_cptr2char_adv() instead of mb_ptr2char_adv().
+ (closes #10527)
+Files: src/getchar.c, src/testdir/test_functions.vim
+
+Patch 8.2.5059
+Problem: Autoconf 2.71 produces many obsolete warnings.
+Solution: Replace obsolete macros with non-obsolete ones, where the
+ functionality does not change. (issue #10528)
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.5060 (after 8.2.5059)
+Problem: Running configure fails.
+Solution: Remove line break.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.5061
+Problem: C89 requires signal handlers to return void.
+Solution: Drop RETSIGTYPE and hard-code a void return value.
+Files: src/configure.ac, src/auto/configure, src/if_cscope.c,
+ src/os_unix.c, src/pty.c, src/os_mac.h, src/os_vms_conf.h,
+ src/config.h.in, src/osdef1.h.in
+
+Patch 8.2.5062
+Problem: Coverity warns for dead code.
+Solution: Remove the dead code.
+Files: src/os_unix.c, src/match.c
+
+Patch 8.2.5063
+Problem: Error for a command may go over the end of IObuff.
+Solution: Truncate the message.
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.5064
+Problem: No test for what 8.1.0052 fixes.
+Solution: Add a test. (closes #10531)
+Files: src/getchar.c, src/testdir/test_mapping.vim
+
+Patch 8.2.5065
+Problem: Wrong return type for main() in tee.c.
+Solution: Use "int" instead of "void". Remove unused variable.
+Files: src/tee/tee.c
+
+Patch 8.2.5066
+Problem: Can specify multispace listchars only for whole line.
+Solution: Add "leadmultispace". (Christian Brabandt, closes #10496)
+Files: runtime/doc/options.txt, src/drawline.c, src/message.c,
+ src/screen.c, src/structs.h, src/window.c,
+ src/testdir/test_listchars.vim
+
+Patch 8.2.5067
+Problem: Timer_create is not available on every Mac system. (Hisashi T
+ Fujinaka)
+Solution: Adjust #ifdef.
+Files: src/os_unix.c
+
+Patch 8.2.5068
+Problem: Gcc 12.1 warning when building tee.
+Solution: Change type to size_t. (John Marriott)
+Files: src/tee/tee.c
+
+Patch 8.2.5069
+Problem: Various warnings from clang on MS-Windows.
+Solution: Fix the code to avoid the warnings. (Yegappan Lakshmanan,
+ closes #10538)
+Files: src/dosinst.c, src/fileio.c, src/gui_w32.c, src/os_mswin.c,
+ src/os_win32.c
+
+Patch 8.2.5070
+Problem: Unnecessary code.
+Solution: Remove code that isn't needed. (closes #10534)
+Files: src/message.c, src/screen.c
+
+Patch 8.2.5071
+Problem: With some Mac OS version clockid_t is redefined.
+Solution: Adjust #ifdefs. (Ozaki Kiichi, closes #10549)
+Files: src/os_mac.h
+
+Patch 8.2.5072
+Problem: Using uninitialized value and freed memory in spell command.
+Solution: Initialize "attr". Check for empty line early.
+Files: src/spell.c, src/testdir/test_spell_utf8.vim
+
+Patch 8.2.5073
+Problem: Clang on MS-Windows produces warnings.
+Solution: Avoid the warnings. (Yegappan Lakshmanan, closes #10546)
+Files: src/dosinst.c, src/dosinst.h, src/gui_dwrite.cpp, src/gui_w32.c,
+ src/iscygpty.c, src/libvterm/src/vterm_internal.h, src/mbyte.c,
+ src/os_win32.c, src/os_win32.h, src/term.c, src/xdiff/xinclude.h
+
+Patch 8.2.5074
+Problem: Spell test fails on MS-Windows.
+Solution: Do not change 'encoding'
+Files: src/testdir/test_spell_utf8.vim
+
+Patch 8.2.5075
+Problem: Clang gives an out of bounds warning.
+Solution: adjust conditional expression (John Marriott)
+Files: src/ui.c
+
+Patch 8.2.5076
+Problem: Unnecessary code.
+Solution: Remove code and replace with function call. (closes #10552)
+Files: src/drawline.c, src/getchar.c
+
+Patch 8.2.5077
+Problem: Various warnings from clang on MS-Windows.
+Solution: Avoid the warnings. (Yegappan Lakshmanan, closes #10553)
+Files: src/dosinst.c, src/dosinst.h, src/filepath.c, src/gui_w32.c,
+ src/misc1.c, src/os_win32.c
+
+Patch 8.2.5078
+Problem: Substitute test has a one second delay.
+Solution: Use ":silent!". Add another test case. (closes #10558)
+Files: src/testdir/test_substitute.vim
+
+Patch 8.2.5079
+Problem: DirChanged autocommand may use freed memory. (Shane-XB Qian)
+Solution: Free the memory later. (closes #10555)
+Files: src/ex_docmd.c, src/testdir/test_autocmd.vim
+
+Patch 8.2.5080
+Problem: When indenting gets out of hand it is hard to stop.
+Solution: When line gets too long set got_int.
+Files: src/indent.c
+
+Patch 8.2.5081
+Problem: Autocmd test fails on MS-Windows.
+Solution: Set shellslash to get forward slashes.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.5082 (after 8.2.5080)
+Problem: Retab test fails.
+Solution: Disable the test for now.
+Files: src/testdir/test_retab.vim
+
+Patch 8.2.5083
+Problem: Autocmd test still fails on MS-Windows.
+Solution: Change backward to forward slashes.
+Files: src/testdir/test_autocmd.vim
+
+Patch 8.2.5084
+Problem: When the GUI shows a dialog tests get stuck.
+Solution: Add the --gui-dialog-file argument.
+Files: runtime/doc/starting.txt, src/Make_mvc.mak, src/gui.c, src/main.c,
+ src/message.c, src/os_mswin.c, src/proto/gui.pro,
+ src/proto/main.pro, src/structs.h, src/testdir/Make_dos.mak,
+ src/testdir/Make_ming.mak, src/testdir/Makefile,
+ src/testdir/runtest.vim, src/testdir/shared.vim
+
+Patch 8.2.5085
+Problem: Gcc gives warning for signed/unsigned difference.
+Solution: Use a different pointer type. (John Marriott)
+Files: src/os_mswin.c
+
+Patch 8.2.5086
+Problem: CI runs on Windows 2019.
+Solution: Switch to Windows 2022. (closes #10566)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.5087
+Problem: Cannot build with clang on MS-Windows.
+Solution: Add support for building with clang. (Yegappan Lakshmanan,
+ closes #10557)
+Files: src/GvimExt/Make_ming.mak, src/INSTALLpc.txt,
+ src/Make_cyg_ming.mak
+
+Patch 8.2.5088
+Problem: Value of cmod_verbose is a bit complicated to use.
+Solution: Use zero for not set, value + 1 when set. (closes #10564)
+Files: src/ex_docmd.c, src/ex_getln.c, src/globals.h, src/structs.h
+
+Patch 8.2.5089
+Problem: Some functions return a different value on failure.
+Solution: Initialize the return value earlier. (Yegappan Lakshmanan,
+ closes #10568)
+Files: src/autocmd.c, src/dict.c, src/evalfunc.c, src/list.c
+
+Patch 8.2.5090
+Problem: MS-Windows: vim.def is no longer used.
+Solution: Delete vim.def. (Ken Takata, closes #10569)
+Files: Filelist, Makefile, src/vim.def
+
+Patch 8.2.5091
+Problem: Terminal test fails with some shell commands.
+Solution: Disable setting the window title. (closes #10530)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.5092
+Problem: Using "'<,'>" in Ex mode may compare unrelated pointers.
+Solution: Set eap->cmd to "+" only later.
+Files: src/ex_docmd.c
+
+Patch 8.2.5093
+Problem: Error message for unknown command may mention the command twice.
+ (Malcolm Rowe)
+Solution: Add the did_append_cmd flag. (closes #10570)
+Files: src/ex_docmd.c
+
+Patch 8.2.5094
+Problem: MS-Windows GUI: empty command may cause a dialog.
+Solution: Delete the dialog file. Improve the message.
+Files: src/testdir/runtest.vim, src/testdir/test_ex_mode.vim
+
+Patch 8.2.5095
+Problem: Terminal test still fails with some shell commands.
+Solution: Disable setting the window title in the Vim instance running in a
+ terminal window. (closes #10530)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.5096 (after 8.2.5095)
+Problem: Terminal test still fails with some shell commands.
+Solution: Add missing "call". (closes #10530)
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.5097
+Problem: Using uninitialized memory when using 'listchars'.
+Solution: Use the length returned by mb_char2bytes(). (closes #10576)
+Files: src/message.c
+
+Patch 8.2.5098
+Problem: Spelldump test sometimes hangs.
+Solution: Catch the problem of the spell file not being found to avoid
+ hanging in the download dialog.
+Files: src/testdir/test_spell.vim
+
+Patch 8.2.5099
+Problem: Some terminal tests are not retried.
+Solution: Mark terminal tests as flaky.
+Files: src/testdir/test_terminal.vim
+
+Patch 8.2.5100
+Problem: Memory usage tests are not retried.
+Solution: Mark memory usage tests as flaky.
+Files: src/testdir/test_memory_usage.vim
+
+Patch 8.2.5101
+Problem: MS-Windows with MinGW: $CC may be "cc" instead of "gcc".
+Solution: Set $CC if it is not matching "clang". (Yegappan Lakshmanan,
+ closes #10578)
+Files: src/INSTALLpc.txt, src/Make_cyg_ming.mak
+
+Patch 8.2.5102
+Problem: Interrupt not caught in test.
+Solution: Consider an exception thrown in the current try/catch when got_int
+ is set. Also catch early exit when not using try/catch.
+Files: src/indent.c, src/testing.c, src/testdir/test_retab.vim,
+ src/testdir/runtest.vim
+
+Patch 8.2.5103
+Problem: Build fails with small features.
+Solution: Add #ifdef. Skip test on MS-Windows.
+Files: src/indent.c, src/testdir/test_retab.vim
+
+Patch 8.2.5104 (after 8.2.5103)
+Problem: Test hangs on MS-Windows.
+Solution: Skip another test on MS-Windows.
+Files: src/testdir/test_retab.vim
+
+Patch 8.2.5105 (after 8.2.5104)
+Problem: Test still hangs on MS-Windows.
+Solution: Skip "nocatch" test the right way.
+Files: src/testdir/test_retab.vim
+
+Patch 8.2.5106
+Problem: Default cmdwin mappings are re-mappable.
+Solution: Make the default mappings not re-mappable. (closes #10580) Use
+ symbols for the first do_map() argument.
+Files: src/vim.h, src/ex_getln.c, src/map.c, src/proto/map.pro,
+ src/digraph.c, src/netbeans.c
+
+Patch 8.2.5107
+Problem: Some callers of rettv_list_alloc() check for not OK. (Christ van
+ Willegen)
+Solution: Use "==" instead of "!=" when checking the return value.
+Files: src/evalbuffer.c, src/channel.c, src/cmdexpand.c, src/evalfunc.c,
+ src/evalwindow.c, src/insexpand.c, src/job.c, src/list.c,
+ src/map.c, src/menu.c, src/mouse.c, src/move.c, src/sign.c,
+ src/textprop.c, src/term.c, src/time.c
+
+Patch 8.2.5108
+Problem: Retab test disabled because it hangs on MS-Windows.
+Solution: Also set got_int at the other place an overlong text is detected.
+Files: src/indent.c, src/testdir/test_retab.vim
+
+Patch 8.2.5109
+Problem: Mode not updated after CTRL-O CTRL-C in Insert mode.
+Solution: Set redraw_mode and use it. (closes #10581)
+Files: src/main.c, src/normal.c, src/testdir/test_normal.vim,
+ src/testdir/dumps/Test_mode_updated_1.dump
+
+Patch 8.2.5110
+Problem: Icon filetype not recognized from the first line.
+Solution: Add a check for the first line. (Doug Kearns)
+Files: runtime/autoload/dist/script.vim, src/testdir/test_filetype.vim
+
+Patch 8.2.5111
+Problem: No test for --gui-dialog-file.
+Solution: Add a test.
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.5112 (after 8.2.5111)
+Problem: Gui test hangs on MS-Windows.
+Solution: Use "!start" to start Vim.
+Files: src/testdir/test_gui.vim
+
+Patch 8.2.5113
+Problem: Timer becomes invalid after fork/exec, :gui gives errors. (Gabriel
+ Dupras)
+Solution: Delete the timer befor forking. (closes #10584)
+Files: src/os_unix.c, src/proto/os_unix.pro, src/gui.c
+
+Patch 8.2.5114
+Problem: Time limit on searchpair() does not work properly.
+Solution: Set the time limit once instead of for each regexp. (closes #10562)
+Files: src/search.c, src/evalfunc.c, src/testdir/test_search.vim
+
+Patch 8.2.5115
+Problem: Search timeout is overrun with some patterns.
+Solution: Check for timeout in more places. Make the flag volatile and
+ atomic. Use assert_inrange() to see what happened.
+Files: src/regexp_nfa.c, src/regexp_bt.c, src/regexp.c, src/os_unix.c,
+ src/proto/os_unix.pro, src/testdir/test_search.vim
+
+Patch 8.2.5116
+Problem: "limit" option of matchfuzzy() not always respected.
+Solution: Remove "else". (Kazuyuki Miyagi, closes #10586)
+Files: runtime/doc/builtin.txt, src/search.c,
+ src/testdir/test_matchfuzzy.vim
+
+Patch 8.2.5117
+Problem: Crash when calling a Lua callback from a :def function. (Bohdan
+ Makohin)
+Solution: Handle FC_CFUNC in call_user_func_check(). (closes #10587)
+Files: src/userfunc.c, src/testdir/test_lua.vim
+
+Patch 8.2.5118
+Problem: MS-Windows: sending a message to another Vim may hang if that Vim
+ is halted.
+Solution: Add a timeout to serverSendToVim(). (Ken Takata, closes #10585)
+Files: runtime/pack/dist/opt/editexisting/plugin/editexisting.vim,
+ src/os_mswin.c
+
+Patch 8.2.5119
+Problem: CI uses cache v2.
+Solution: Use cache v3. (closes #10588)
+Files: .github/workflows/ci.yml
+
+Patch 8.2.5120
+Problem: Searching for quotes may go over the end of the line.
+Solution: Check for running into the NUL.
+Files: src/textobject.c
+
+Patch 8.2.5121
+Problem: Interrupt test sometimes fails.
+Solution: Use a different file name.
+Files: src/testdir/test_interrupt.vim
+
+Patch 8.2.5122
+Problem: Lisp indenting my run over the end of the line.
+Solution: Check for NUL earlier.
+Files: src/indent.c, src/testdir/test_indent.vim
+
+Patch 8.2.5123
+Problem: Using invalid index when looking for spell suggestions.
+Solution: Do not decrement the index when it is zero.
+Files: src/spellsuggest.c, src/testdir/test_spell.vim
+
+Patch 8.2.5124
+Problem: When syntax timeout test fails it does not show the time.
+Solution: Use assert_inrange().
+Files: src/testdir/test_syntax.vim
+
+Patch 8.2.5125
+Problem: MS-Windows: warnings from MinGW compiler.
+Solution: Use "volatile". (Yasuhiro Matsumoto, closes #10589) Initialize
+ variable.
+Files: src/os_win32.c, src/proto/os_win32.pro, src/map.c
+
+Patch 8.2.5126
+Problem: Substitute may overrun destination buffer.
+Solution: Disallow switching buffers in a substitute expression.
+Files: src/ex_docmd.c, src/testdir/test_substitute.vim
+
+Patch 8.2.5127
+Problem: Using assert_true() does not show value on failure.
+Solution: Use assert_inrange(). (closes #10593)
+Files: src/testdir/test_channel.vim, src/testdir/test_hlsearch.vim
+
+Patch 8.2.5128
+Problem: Syntax highlighting disabled when using synID() in searchpair()
+ skip expression and it times out. (Jaehwang Jung)
+Solution: Add the redrawtime_limit_set flag. (closes #10562)
+Files: src/globals.h, src/drawscreen.c, src/syntax.c
+
+Patch 8.2.5129
+Problem: Timeout handling is not optimal.
+Solution: Avoid setting timeout_flag twice. Adjust the pointer when
+ stopping the regexp timeout. Adjust variable name.
+Files: src/os_unix.c, src/os_win32.c, src/regexp.c
+
+Patch 8.2.5130
+Problem: Edit test for mode message fails when using valgrind.
+Solution: Use WaitForAssert(). Run beep test later.
+Files: src/testdir/test_edit.vim
+
+Patch 8.2.5131
+Problem: Timeout implementation is not optimal.
+Solution: Further improvements for timeouts. Add a test for searchpair()
+ timeout. (partly by Paul Ollis)
+Files: src/configure.ac, src/auto/configure,
+ src/testdir/test_hlsearch.vim, src/testdir/test_search.vim
+
+Patch 8.2.5132
+Problem: :mkview test doesn't test much.
+Solution: Save the view with the folds closed. (James McCoy, closes #10596)
+Files: src/testdir/test_mksession.vim
+
+Patch 8.2.5133
+Problem: MacOS: build fails.
+Solution: Remove "#if 0" from timer_delete().
+Files: src/os_macosx.m
+
+Patch 8.2.5134
+Problem: Function has confusing name.
+Solution: Rename tgetent_error() to invoke_tgetent().
+Files: src/term.c
+
+Patch 8.2.5135
+Problem: Running configure gives warnings for main() return type.
+Solution: Specify "int" return type. Avoid a few more warnings.
+Files: src/configure.ac, src/auto/configure
+
+Patch 8.2.5136
+Problem: Debugger test fails when run with valgrind.
+Solution: Wait longer when using valgrind.
+Files: src/testdir/shared.vim, src/testdir/test_debugger.vim,
+ src/testdir/test_search.vim
+
+Patch 8.2.5137
+Problem: Cannot build without the +channel feature. (Dominique Pellé)
+Solution: Add #ifdef around ch_log() calls. (closes #10598)
+Files: src/os_unix.c, src/regexp_nfa.c, src/regexp_bt.c
+
+Patch 8.2.5138
+Problem: Various small issues.
+Solution: Various small improvements.
+Files: src/filepath.c, src/job.c, src/mark.c, src/move.c,
+ src/popupwin.c, src/testdir/test_filetype.vim
+
+Patch 8.2.5139
+Problem: TIME_WITH_SYS_TIME is no longer supported by autoconf.
+Solution: Always include time.h.
+Files: src/os_unix.h
+
+Patch 8.2.5140
+Problem: Seachpair timeout test is flaky.
+Solution: Mark the test as flaky so it is retried.
+Files: src/testdir/test_search.vim
+
+Patch 8.2.5141
+Problem: Using "volatile int" in a signal handler might be wrong.
+Solution: Use "volatile sig_atomic_t".
+Files: src/os_unix.c, src/proto/os_unix.pro, src/os_win32.c,
+ src/proto/os_win32.pro, src/regexp.c,
+
+Patch 8.2.5142
+Problem: Startup test fails if there is a status bar at the top of the
+ screen. (Ernie Rael)
+Solution: Use a larger vertical offset in the test.
+Files: src/testdir/test_startup.vim
+
+Patch 8.2.5143
+Problem: Some tests fail when using valgrind. Spurious leak reports.
+Solution: Use WaitForAssert(). Avoid failing fork/exec. Skip tests where a
+ job is killed when running valgrind.
+Files: src/testdir/test_iminsert.vim, src/testdir/test_popup.vim,
+ src/testdir/test_cscope.vim, src/testdir/test_channel.vim
+
+Patch 8.2.5144
+Problem: With 'lazyredraw' set completion menu may be displayed wrong.
+Solution: When the popup menu is visible do not insert a screen line.
+ (closes #10601)
+Files: src/screen.c
+
+Patch 8.2.5145
+Problem: Exit test causes spurious valgrind reports.
+Solution: Skip test. Add CheckNotValgrind.
+Files: src/testdir/test_exit.vim, src/testdir/check.vim,
+ src/testdir/test_channel.vim
+
+Patch 8.2.5146
+Problem: Memory leak when substitute expression nests.
+Solution: Use an array of expression results.
+Files: src/alloc.c, src/regexp.c, src/proto/regexp.pro,
+ src/errors.h, src/ex_cmds.c, src/testdir/test_substitute.vim
+
+Patch 8.2.5147
+Problem: Flaky test always fails on retry.
+Solution: Delete the created function.
+Files: src/testdir/test_search.vim
+
+Patch 8.2.5148
+Problem: Invalid memory access when using an expression on the command line.
+Solution: Make sure the position does not go negative.
+Files: src/ex_getln.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.5149 (after 8.2.5148)
+Problem: Cannot build without the +eval feature. (Tony Mechelynck)
+Solution: Add #ifdefs.
+Files: src/ex_getln.c
+
+Patch 8.2.5150
+Problem: Read past the end of the first line with ":0;'{".
+Solution: When on line zero check the column is valid for line one.
+Files: src/ex_docmd.c, src/testdir/test_cmdline.vim
+
+Patch 8.2.5151
+Problem: Reading beyond the end of the line with lisp indenting.
+Solution: Avoid going over the NUL at the end of the line.
+Files: src/indent.c, src/testdir/test_lispwords.vim
+
+Patch 8.2.5152
+Problem: search() gets stuck with "c" and skip evaluates to true.
+Solution: Reset the SEARCH_START option. (closes #10608)
+Files: src/evalfunc.c, src/testdir/test_syntax.vim
+
+Patch 8.2.5153
+Problem: "make uninstall" does not remove colors/lists.
+Solution: Add a line to the Makefile. (closes #10609)
+Files: src/Makefile
+
+Patch 8.2.5154
+Problem: Still mentioning version8, some cosmetic issues.
+Solution: Prefer mentioning version9, cosmetic improvements.
+Files: src/version.c, src/if_tcl.c, src/regexp.c,
+ src/testdir/test_gui.vim, src/os_unix.c, Filelist, src/Makefile
+
+Patch 8.2.5155
+Problem: In diff mode windows may get out of sync. (Gary Johnson)
+Solution: Avoid that the other window scrolls for 'cursorbind'.
+Files: src/move.c, src/testdir/test_diffmode.vim,
+ src/testdir/dumps/Test_diff_scroll_1.dump,
+ src/testdir/dumps/Test_diff_scroll_2.dump
+
+Patch 8.2.5156
+Problem: Search timeout test often fails with FreeBSD.
+Solution: Double the maximum time.
+Files: src/testdir/test_search.vim
+
+Patch 8.2.5157
+Problem: MS-Windows GUI: CTRL-key combinations do not always work.
+Solution: Handle special key combinations better. (closes #10613,
+ closes #10602, closes #10579)
+Files: src/gui_w32.c
+
+Patch 8.2.5158
+Problem: TSTP and INT signal tests are not run with valgrind.
+Solution: Sleep a bit longer. (closes #10614)
+Files: src/testdir/test_signals.vim
+
+Patch 8.2.5159 (after 8.2.5157)
+Problem: Fix for CTRL-key combinations causes more problems than it solves.
+Solution: Roll back the change.
+Files: src/gui_w32.c
+
+Patch 8.2.5160
+Problem: Accessing invalid memory after changing terminal size.
+Solution: Adjust cmdline_row and msg_row to the value of Rows.
+Files: src/term.c
+
+Patch 8.2.5161
+Problem: Might still access invalid memory.
+Solution: Add extra check for negative value.
+Files: src/message.c
+
+Patch 8.2.5162
+Problem: Reading before the start of the line with BS in Replace mode.
+Solution: Check the cursor column is more than zero.
+Files: src/edit.c
+
+Patch 8.2.5163
+Problem: Crash when deleting buffers in diff mode.
+Solution: Recompute diffs later. Skip window without a valid buffer.
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.2.5164
+Problem: Invalid memory access after diff buffer manipulations.
+Solution: Use zero offset when change removes all lines in a diff block.
+Files: src/diff.c, src/testdir/test_diffmode.vim
+
+Patch 8.2.5165
+Problem: Import test fails because 'diffexpr' isn't reset.
+Solution: Reset 'diffexpr'.
+Files: src/testdir/test_vim9_import.vim
+
+Patch 8.2.5166
+Problem: Test for DiffUpdated fails.
+Solution: Also accept a count of two.
+Files: src/testdir/test_diffmode.vim
+
+Patch 8.2.5167
+Problem: get(Fn, 'name') on funcref returns special byte code.
+Solution: Use the printable name.
+Files: src/evalfunc.c, src/testdir/test_getvar.vim
+
+Patch 8.2.5168
+Problem: Cannot build with Python 3.11.
+Solution: Adjust define for _PyObject_TypeCheck. (Zdenek Dohnal,
+ closes #10627)
+Files: src/if_python3.c
+
+Patch 8.2.5169
+Problem: Nested :source may use NULL pointer.
+Solution: Do not use the NULL pointer.
+Files: src/eval.c, src/testdir/test_vimscript.vim
+
+Patch 8.2.5170
+Problem: Tiny issues.
+Solution: Tiny improvements.
+Files: src/misc1.c, src/screen.c, src/vim.h
+
+Patch 8.2.5171
+Problem: Dependencies and proto files are outdated.
+Solution: Update dependencies and proto files. Avoid errors.
+Files: src/Makefile, src/gui_w32.c, src/os_mswin.c, src/proto/buffer.pro,
+ src/proto/cmdexpand.pro, src/proto/getchar.pro,
+ src/proto/help.pro, src/proto/mbyte.pro, src/proto/option.pro,
+ src/proto/screen.pro, src/proto/syntax.pro,
+ src/proto/textformat.pro, src/proto/textobject.pro,
+ src/proto/time.pro, src/proto/gui_x11.pro, src/proto/if_tcl.pro,
+ src/proto/os_mswin.pro
+
+Patch 8.2.5172
+Problem: "make menu" still uses legacy script.
+Solution: make menu generation script use Vim9 script, fix errors.
+Files: runtime/makemenu.vim
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/vi_diff.txt b/runtime/doc/vi_diff.txt
new file mode 100644
index 0000000..4332706
--- /dev/null
+++ b/runtime/doc/vi_diff.txt
@@ -0,0 +1,1365 @@
+*vi_diff.txt* For Vim version 9.0. Last change: 2022 Apr 03
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Differences between Vim and Vi *vi-differences*
+
+This file lists the differences between Vim and Vi/Ex and gives an overview of
+what is in Vim that is not in Vi.
+
+Vim is mostly POSIX 1003.2-1 compliant. The only command known to be missing
+is ":open". There are probably a lot of small differences (either because Vim
+is missing something or because Posix is beside the mark).
+
+1. Simulated command |simulated-command|
+2. Missing options |missing-options|
+3. Limits |limits|
+4. The most interesting additions |vim-additions|
+5. Other vim features |other-features|
+6. Supported Vi features |vi-features|
+7. Command-line arguments |cmdline-arguments|
+8. POSIX compliance |posix-compliance|
+
+==============================================================================
+1. Simulated command *simulated-command*
+
+This command is in Vi, but Vim only simulates it:
+
+ *:o* *:op* *:open*
+:[range]o[pen] Works like |:visual|: end Ex mode.
+ {Vi: start editing in open mode}
+
+:[range]o[pen] /pattern/ As above, additionally move the cursor to the
+ column where "pattern" matches in the cursor
+ line.
+
+Vim does not support open mode, since it's not really useful. For those
+situations where ":open" would start open mode Vim will leave Ex mode, which
+allows executing the same commands, but updates the whole screen instead of
+only one line.
+
+==============================================================================
+2. Missing options *missing-options*
+
+These options are in the Unix Vi, but not in Vim. If you try to set one of
+them you won't get an error message, but the value is not used and cannot be
+printed.
+
+autoprint (ap) boolean (default on) *'autoprint'* *'ap'*
+beautify (bf) boolean (default off) *'beautify'* *'bf'*
+flash (fl) boolean (default ??) *'flash'* *'fl'*
+graphic (gr) boolean (default off) *'graphic'* *'gr'*
+hardtabs (ht) number (default 8) *'hardtabs'* *'ht'*
+ number of spaces that a <Tab> moves on the display
+mesg boolean (default on) *'mesg'*
+novice boolean (default off) *'novice'*
+open boolean (default on) *'open'*
+optimize (op) boolean (default off) *'optimize'* *'op'*
+redraw boolean (default off) *'redraw'*
+slowopen (slow) boolean (default off) *'slowopen'* *'slow'*
+sourceany boolean (default off) *'sourceany'*
+w300 number (default 23) *'w300'*
+w1200 number (default 23) *'w1200'*
+w9600 number (default 23) *'w9600'*
+
+Vi did not allow for changing the termcap entries, you would have to exit Vi,
+edit the termcap entry and try again. Vim has the |terminal-options|.
+
+==============================================================================
+3. Limits *limits*
+
+Vim has only a few limits for the files that can be edited {Vi: can not handle
+<Nul> characters and characters above 128, has limited line length, many other
+limits}.
+
+Maximum line length 2147483647 characters. Longer lines are split.
+Maximum number of lines 2147483647 lines.
+Maximum file size 2147483647 bytes (2 Gbyte) when a long integer is
+ 32 bits. Much more for 64 bit longs. Also limited
+ by available disk space for the |swap-file|.
+ *E75*
+Length of a file path Unix and Win32: 1024 characters, otherwise 256
+ characters (or as much as the system supports).
+Length of an expanded string option
+ Unix and Win32: 1024 characters, otherwise 256
+ characters
+Maximum display width Unix and Win32: 1024 characters, otherwise 255
+ characters
+Maximum lhs of a mapping 50 characters.
+Number of different highlighting types: over 30000
+Range of a Number variable: -2147483648 to 2147483647 (might be more on 64
+ bit systems)
+Maximum length of a line in a tags file: 512 bytes.
+
+Information for undo and text in registers is kept in memory, thus when making
+(big) changes the amount of (virtual) memory available limits the number of
+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. For the
+Amiga, 'maxmemtot' is set depending on the amount of memory available.
+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.
+
+==============================================================================
+4. The most interesting additions *vim-additions*
+
+Vi compatibility. |'compatible'|
+ Although Vim is 99% Vi compatible, some things in Vi can be
+ considered to be a bug, or at least need improvement. But still, Vim
+ starts in a mode which behaves like the "real" Vi as much as possible.
+ To make Vim behave a little bit better, try resetting the 'compatible'
+ option:
+ :set nocompatible
+ Or start Vim with the "-N" argument:
+ vim -N
+ Vim starts with 'nocompatible' automatically if you have a .vimrc
+ file. See |startup|.
+ The 'cpoptions' option can be used to set Vi compatibility on/off for
+ a number of specific items.
+
+Support for different systems.
+ Vim can be used on:
+ - All Unix systems (it works on all systems it was tested on, although
+ the GUI and Perl interface may not work everywhere).
+ - Amiga (500, 1000, 1200, 2000, 3000, 4000, ...).
+ - MS-Windows
+ - VMS
+ - Macintosh
+ - IBM OS/390
+ Note that on some systems features need to be disabled to reduce
+ resource usage. For some outdated systems you need to use an older
+ Vim version.
+
+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
+ -1 for no undo at all.
+ When all changes in a buffer have been undone, the buffer is not
+ considered changed anymore. You can exit it with :q, without <!>.
+ When undoing a few changes and then making a new change Vim will
+ 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
+ define your own menus. Better support for CTRL/SHIFT/ALT keys in
+ combination with special keys and mouse. Supported for various
+ platforms, such as X11 with Motif, GTK, Win32 (Windows XP and later),
+ Amiga and Macintosh.
+
+Multiple windows and buffers. |windows.txt|
+ Vim can split the screen into several windows, each editing a
+ different buffer or the same buffer at a different location. Buffers
+ can still be loaded (and changed) but not displayed in a window. This
+ is called a hidden buffer. Many commands and options have been added
+ for this facility.
+ Vim can also use multiple tab pages, each with one or more windows. A
+ line with tab labels can be used to quickly switch between these pages.
+ |tab-page|
+
+Terminal window. |:terminal|
+ Vim can create a window in which a terminal emulator runs. This can
+ be used to execute an arbitrary command, a shell or a debugger.
+
+Syntax highlighting. |:syntax|
+ Vim can highlight keywords, patterns and other things. This is
+ defined by a number of |:syntax| commands, and can be made to
+ highlight most languages and file types. A number of files are
+ included for highlighting the most common languages, like C, C++,
+ Java, Pascal, Makefiles, shell scripts, etc. The colors used for
+ highlighting can be defined for ordinary terminals, color terminals
+ and the GUI with the |:highlight| command. A convenient way to do
+ this is using a |:colorscheme| command.
+ The highlighted text can be exported as HTML. |convert-to-HTML|
+ Other items that can be highlighted are matches with the search string
+ |'hlsearch'|, matching parens |matchparen| and the cursor line and
+ column |'cursorline'| |'cursorcolumn'|.
+
+Text properties |textprop.txt|
+ Vim supports highlighting text by a plugin. Property types can be
+ specified with |prop_type_add()| and properties can be placed with
+ |prop_add()|.
+
+Spell checking. |spell|
+ When the 'spell' option is set Vim will highlight spelling mistakes.
+ About 50 languages are currently supported, selected with the
+ 'spelllang' option. In source code only comments and strings are
+ checked for spelling.
+
+Folding. |folding|
+ A range of lines can be shown as one "folded" line. This allows
+ overviewing a file and moving blocks of text around quickly.
+ Folds can be created manually, from the syntax of the file, by indent,
+ etc.
+
+Diff mode. |diff|
+ Vim can show two versions of a file with the differences highlighted.
+ Parts of the text that are equal are folded away. Commands can be
+ used to move text from one version to the other.
+
+Plugins. |add-plugin|
+ The functionality can be extended by dropping a plugin file in the
+ 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. |channel| |job| |timer|
+ Vim can exchange messages with other processes in the background.
+ This makes it possible to have servers do work and send back the
+ results to Vim. |channel|
+ Vim can start a job, communicate with it and stop it. |job|
+ 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}.
+ A subsequent "q" stops recording. The register can then be executed
+ with the "@{c}" command. This is very useful to repeat a complex
+ action.
+
+Flexible insert mode. |ins-special-special|
+ The arrow keys can be used in insert mode to move around in the file.
+ This breaks the insert in two parts as far as undo and redo is
+ concerned.
+
+ CTRL-O can be used to execute a single Normal mode command. This is
+ almost the same as hitting <Esc>, typing the command and doing |a|.
+
+Visual mode. |Visual-mode|
+ Visual mode can be used to first highlight a piece of text and then
+ give a command to do something with it. This is an (easy to use)
+ alternative to first giving the operator and then moving to the end of
+ the text to be operated upon.
+ |v| and |V| are used to start Visual mode. |v| works on characters
+ and |V| on lines. Move the cursor to extend the Visual area. It is
+ shown highlighted on the screen. By typing "o" the other end of the
+ Visual area can be moved. The Visual area can be affected by an
+ operator:
+ d delete
+ c change
+ y yank
+ > or < insert or delete indent
+ ! filter through external program
+ = filter through indent
+ : start |:| command for the Visual lines.
+ gq format text to 'textwidth' columns
+ J join lines
+ ~ swap case
+ u make lowercase
+ U make uppercase
+ {Vi has no Visual mode, the name "visual" is used for Normal mode, to
+ distinguish it from Ex mode}
+
+Block operators. |visual-block|
+ With Visual mode a rectangular block of text can be selected. Start
+ Visual mode with CTRL-V. The block can be deleted ("d"), yanked ("y")
+ or its case can be changed ("~", "u" and "U"). A deleted or yanked
+ block can be put into the text with the "p" and "P" commands.
+
+Help system. |:help|
+ Help is displayed in a window. The usual commands can be used to
+ move around, search for a string, etc. Tags can be used to jump
+ around in the help files, just like hypertext links. The |:help|
+ command takes an argument to quickly jump to the info on a subject.
+ <F1> is the quick access to the help system. The name of the help
+ index file can be set with the 'helpfile' option.
+
+Command-line editing and history. |cmdline-editing|
+ You can insert or delete at any place in the command-line using the
+ cursor keys. The right/left cursor keys can be used to move
+ forward/backward one character. The shifted right/left cursor keys
+ can be used to move forward/backward one word. CTRL-B/CTRL-E can be
+ used to go to the begin/end of the command-line.
+ {Vi: can only alter the last character in the line}
+ {Vi: when hitting <Esc> the command-line is executed. This is
+ unexpected for most people; therefore it was changed in Vim. But when
+ the <Esc> is part of a mapping, the command-line is executed. If you
+ want the Vi behaviour also when typing <Esc>, use ":cmap ^V<Esc>
+ ^V^M"}
+ |cmdline-history|
+ The command-lines are remembered. The up/down cursor keys can be used
+ to recall previous command-lines. The 'history' option can be set to
+ the number of lines that will be remembered. There is a separate
+ history for commands and for search patterns.
+
+Command-line completion. |cmdline-completion|
+ While entering a command-line (on the bottom line of the screen)
+ <Tab> can be typed to complete
+ what example ~
+ - command :e<Tab>
+ - tag :ta scr<Tab>
+ - option :set sc<Tab>
+ - option value :set hf=<Tab>
+ - file name :e ve<Tab>
+ - etc.
+
+ If there are multiple matches, CTRL-N (next) and CTRL-P (previous)
+ will walk through the matches. <Tab> works like CTRL-N, but wraps
+ around to the first match.
+
+ The 'wildchar' option can be set to the character for command-line
+ completion, <Tab> is the default. CTRL-D can be typed after an
+ (incomplete) wildcard; all matches will be listed. CTRL-A will insert
+ all matches. CTRL-L will insert the longest common part of the
+ matches.
+
+Insert-mode completion. |ins-completion|
+ In Insert mode the CTRL-N and CTRL-P keys can be used to complete a
+ word that appears elsewhere. |i_CTRL-N|
+ With CTRL-X another mode is entered, through which completion can be
+ done for:
+ |i_CTRL-X_CTRL-F| file names
+ |i_CTRL-X_CTRL-K| words from 'dictionary' files
+ |i_CTRL-X_CTRL-T| words from 'thesaurus' files
+ |i_CTRL-X_CTRL-I| words from included files
+ |i_CTRL-X_CTRL-L| whole lines
+ |i_CTRL-X_CTRL-]| words from the tags file
+ |i_CTRL-X_CTRL-D| definitions or macros
+ |i_CTRL-X_CTRL-O| Omni completion: clever completion
+ specifically for a file type
+ etc.
+
+Long line support. |'wrap'| |'linebreak'|
+ If the 'wrap' option is off, long lines will not wrap and only part
+ of them will be shown. When the cursor is moved to a part that is not
+ shown, the screen will scroll horizontally. The minimum number of
+ columns to scroll can be set with the 'sidescroll' option. The |zh|
+ and |zl| commands can be used to scroll sideways.
+ Alternatively, long lines are broken in between words when the
+ 'linebreak' option is set. This allows editing a single-line
+ paragraph conveniently (e.g. when the text is later read into a DTP
+ program). Move the cursor up/down with the |gk| and |gj| commands.
+
+Text formatting. |formatting|
+ The 'textwidth' option can be used to automatically limit the line
+ length. This supplements the 'wrapmargin' option of Vi, which was not
+ very useful. The |gq| operator can be used to format a piece of text
+ (for example, |gqap| formats the current paragraph). Commands for
+ text alignment: |:center|, |:left| and |:right|.
+
+Extended search patterns. |pattern|
+ There are many extra items to match various text items. Examples:
+ A "\n" can be used in a search pattern to match a line break.
+ "x\{2,4}" matches "x" 2 to 4 times.
+ "\s" matches a white space character.
+
+Directory, remote and archive browsing. |netrw|
+ Vim can browse the file system. Simply edit a directory. Move around
+ in the list with the usual commands and press <Enter> to go to the
+ directory or file under the cursor.
+ This also works for remote files over ftp, http, ssh, etc.
+ Zip and tar archives can also be browsed. |tar| |zip|
+
+Edit-compile-edit speedup. |quickfix|
+ The |:make| command can be used to run the compilation and jump to the
+ first error. A file with compiler error messages is interpreted. Vim
+ jumps to the first error.
+
+ Each line in the error file is scanned for the name of a file, line
+ number and error message. The 'errorformat' option can be set to a
+ list of scanf-like strings to handle output from many compilers.
+
+ The |:cn| command can be used to jump to the next error.
+ |:cl| lists all the error messages. Other commands are available.
+ The 'makeef' option has the name of the file with error messages.
+ The 'makeprg' option contains the name of the program to be executed
+ with the |:make| command.
+ The 'shellpipe' option contains the string to be used to put the
+ output of the compiler into the errorfile.
+
+Finding matches in files. |:vimgrep|
+ Vim can search for a pattern in multiple files. This uses the
+ advanced Vim regexp pattern, works on all systems and also works to
+ search in compressed files.
+
+Improved indenting for programs. |'cindent'|
+ When the 'cindent' option is on the indent of each line is
+ automatically adjusted. C syntax is mostly recognized. The indent
+ for various styles can be set with 'cinoptions'. The keys to trigger
+ indenting can be set with 'cinkeys'.
+
+ Comments can be automatically formatted. The 'comments' option can be
+ set to the characters that start and end a comment. This works best
+ for C code, but also works for e-mail (">" at start of the line) and
+ other types of text. The |=| operator can be used to re-indent
+ lines.
+
+ For many other languages an indent plugin is present to support
+ automatic indenting. |30.3|
+
+Searching for words in included files. |include-search|
+ The |[i| command can be used to search for a match of the word under
+ the cursor in the current and included files. The 'include' option
+ can be set to a pattern that describes a command to include a file
+ (the default is for C programs).
+ The |[I| command lists all matches, the |[_CTRL-I| command jumps to
+ a match.
+ The |[d|, |[D| and |[_CTRL-D| commands do the same, but only for
+ lines where the pattern given with the 'define' option matches.
+
+Automatic commands. |autocommand|
+ Commands can be automatically executed when reading a file, writing a
+ file, jumping to another buffer, etc., depending on the file name.
+ This is useful to set options and mappings for C programs,
+ documentation, plain text, e-mail, etc. This also makes it possible
+ to edit compressed files.
+
+Scripts and Expressions. |expression|
+ Commands have been added to form up a powerful script language.
+ |:if| Conditional execution, which can be used for example
+ to set options depending on the value of $TERM.
+ |:while| Repeat a number of commands.
+ |:for| Loop over a list.
+ |:echo| Print the result of an expression.
+ |:let| Assign a value to an internal variable, option, etc.
+ Variable types are Number, String, List and Dictionary.
+ |:execute| Execute a command formed by an expression.
+ |:try| Catch exceptions.
+ etc., etc. See |eval|.
+ Debugging and profiling are supported. |debug-scripts| |profile|
+ If this is not enough, an interface is provided to |Python|, |Ruby|,
+ |Tcl|, |Lua|, |Perl| and |MzScheme|.
+
+Viminfo. |viminfo-file|
+ 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
+ possible to jump right back to where the last edit stopped with |'0|.
+ The 'viminfo' option can be set to select which items to store in the
+ .viminfo file. This is off by default.
+
+Printing. |printing|
+ The |:hardcopy| command sends text to the printer. This can include
+ syntax highlighting.
+
+Mouse support. |mouse-using|
+ The mouse is supported in the GUI version, in an xterm for Unix, for
+ BSDs with sysmouse, for Linux with gpm, and Win32. It can be used to
+ position the cursor, select the visual area, paste a register, etc.
+
+Usage of key names. |<>| |key-notation|
+ Special keys now all have a name like <Up>, <End>, etc.
+ This name can be used in mappings, to make it easy to edit them.
+
+Editing binary files. |edit-binary|
+ Vim can edit binary files. You can change a few characters in an
+ executable file, without corrupting it. Vim doesn't remove NUL
+ characters (they are represented as <NL> internally).
+ |-b| command-line argument to start editing a binary file
+ |'binary'| Option set by |-b|. Prevents adding an <EOL> for the
+ last line in the file.
+
+Multi-language support. |multi-lang|
+ Files in double-byte or multibyte encodings can be edited. There is
+ UTF-8 support to be able to edit various languages at the same time,
+ without switching fonts. |UTF-8|
+ Messages and menus are available in different languages.
+
+Move cursor beyond lines.
+ When the 'virtualedit' option is set the cursor can move all over the
+ screen, also where there is no text. This is useful to edit tables
+ and figures easily.
+
+==============================================================================
+5. Other vim features *other-features*
+
+A random collection of nice extra features.
+
+
+When Vim is started with "-s scriptfile", the characters read from
+"scriptfile" are treated as if you typed them. If end of file is reached
+before the editor exits, further characters are read from the console.
+
+The "-w" option can be used to record all typed characters in a script file.
+This file can then be used to redo the editing, possibly on another file or
+after changing some commands in the script file.
+
+The "-o" option opens a window for each argument. "-o4" opens four windows.
+
+Vi requires several termcap entries to be able to work full-screen. Vim only
+requires the "cm" entry (cursor motion).
+
+
+In command mode:
+
+When the 'showcmd' option is set, the command characters are shown in the last
+line of the screen. They are removed when the command is finished.
+
+If the 'ruler' option is set, the current cursor position is shown in the
+last line of the screen.
+
+"U" still works after having moved off the last changed line and after "u".
+
+Characters with the 8th bit set are displayed. The characters between '~' and
+0xa0 are displayed as "~?", "~@", "~A", etc., unless they are included in the
+'isprint' option.
+
+"][" goes to the next ending of a C function ('}' in column 1).
+"[]" goes to the previous ending of a C function ('}' in column 1).
+
+"]f", "[f" and "gf" start editing the file whose name is under the cursor.
+CTRL-W f splits the window and starts editing the file whose name is under
+the cursor.
+
+"*" searches forward for the identifier under the cursor, "#" backward.
+"K" runs the program defined by the 'keywordprg' option, with the identifier
+under the cursor as argument.
+
+"%" can be preceded with a count. The cursor jumps to the line that
+percentage down in the file. The normal "%" function to jump to the matching
+brace skips braces inside quotes.
+
+With the CTRL-] command, the cursor may be in the middle of the identifier.
+
+The used tags are remembered. Commands that can be used with the tag stack
+are CTRL-T, ":pop" and ":tag". ":tags" lists the tag stack.
+
+Vi uses 'wrapscan' when searching for a tag. When jumping to a tag Vi starts
+searching in line 2 of another file. It does not find a tag in line 1 of
+another file when 'wrapscan' is not set.
+
+The 'tags' option can be set to a list of tag file names. Thus multiple
+tag files can be used. For file names that start with "./", the "./" is
+replaced with the path of the current file. This makes it possible to use a
+tags file in the same directory as the file being edited.
+{Vi: always uses binary search in some versions}
+{Vi does not have the security prevention for commands in tag files}
+
+Previously used file names are remembered in the alternate file name list.
+CTRL-^ accepts a count, which is an index in this list.
+":files" command shows the list of alternate file names.
+"#<N>" is replaced with the <N>th alternate file name in the list.
+"#<" is replaced with the current file name without extension.
+
+Search patterns have more features. The <NL> character is seen as part of the
+search pattern and the substitute string of ":s". Vi sees it as the end of
+the command.
+
+Searches can put the cursor on the end of a match and may include a character
+offset.
+
+Count added to "~", ":next", ":Next", "n" and "N".
+
+The command ":next!" with 'autowrite' set does not write the file. In vi the
+file was written, but this is considered to be a bug, because one does not
+expect it and the file is not written with ":rewind!".
+
+In Vi when entering a <CR> in replace mode deletes a character only when 'ai'
+is set (but does not show it until you hit <Esc>). Vim always deletes a
+character (and shows it immediately).
+
+Added :wnext command. Same as ":write" followed by ":next".
+
+The ":w!" command always writes, also when the file is write protected. In Vi
+you would have to do ":!chmod +w %:S" and ":set noro".
+
+When 'tildeop' has been set, "~" is an operator (must be followed by a
+movement command).
+
+With the "J" (join) command you can reset the 'joinspaces' option to have only
+one space after a period (Vi inserts two spaces).
+
+"cw" can be used to change white space formed by several characters (Vi is
+confusing: "cw" only changes one space, while "dw" deletes all white space).
+{Vi: "cw" when on a blank followed by other blanks changes only the first
+blank; this is probably a bug, because "dw" deletes all the blanks}
+
+"o" and "O" accept a count for repeating the insert (Vi clears a part of
+display).
+
+Flags after Ex commands not supported (no plans to include it).
+
+On non-UNIX systems ":cd" command shows current directory instead of going to
+the home directory (there isn't one). ":pwd" prints the current directory on
+all systems.
+
+After a ":cd" command the file names (in the argument list, opened files)
+still point to the same files. In Vi ":cd" is not allowed in a changed file;
+otherwise the meaning of file names change.
+
+":source!" command reads Vi commands from a file.
+
+":mkexrc" command writes current modified options and mappings to a ".exrc"
+file. ":mkvimrc" writes to a ".vimrc" file.
+
+No check for "tail recursion" with mappings. This allows things like
+":map! foo ^]foo".
+
+When a mapping starts with number, vi loses the count typed before it (e.g.
+when using the mapping ":map g 4G" the command "7g" goes to line 4). This is
+considered a vi bug. Vim concatenates the counts (in the example it becomes
+"74G"), as most people would expect.
+
+The :put! command inserts the contents of a register above the current line.
+
+The "p" and "P" commands of vi cannot be repeated with "." when the putted
+text is less than a line. In Vim they can always be repeated.
+
+":noremap" command can be used to enter a mapping that will not be remapped.
+This is useful to exchange the meaning of two keys. ":cmap", ":cunmap" and
+":cnoremap" can be used for mapping in command-line editing only. ":imap",
+":iunmap" and ":inoremap" can be used for mapping in insert mode only.
+Similar commands exist for abbreviations: ":noreabbrev", ":iabbrev"
+":cabbrev", ":iunabbrev", ":cunabbrev", ":inoreabbrev", ":cnoreabbrev".
+
+In Vi the command ":map foo bar" would remove a previous mapping
+":map bug foo". This is considered a bug, so it is not included in Vim.
+":unmap! foo" does remove ":map! bug foo", because unmapping would be very
+difficult otherwise (this is vi compatible).
+
+The ':' register contains the last command-line.
+The '%' register contains the current file name.
+The '.' register contains the last inserted text.
+
+":dis" command shows the contents of the yank registers.
+
+CTRL-O/CTRL-I can be used to jump to older/newer positions. These are the
+same positions as used with the '' command, but may be in another file. The
+":jumps" command lists the older positions.
+
+If the 'shiftround' option is set, an indent is rounded to a multiple of
+'shiftwidth' with ">" and "<" commands.
+
+The 'scrolljump' option can be set to the minimum number of lines to scroll
+when the cursor gets off the screen. Use this when scrolling is slow.
+
+The 'scrolloff' option can be set to the minimum number of lines to keep
+above and below the cursor. This gives some context to where you are
+editing. When set to a large number the cursor line is always in the middle
+of the window.
+
+Uppercase marks can be used to jump between files. The ":marks" command lists
+all currently set marks. The commands "']" and "`]" jump to the end of the
+previous operator or end of the text inserted with the put command. "'[" and
+"`[" do jump to the start. {Vi: no uppercase marks}
+
+The 'shelltype' option can be set to reflect the type of shell used on the
+Amiga.
+
+The 'highlight' option can be set for the highlight mode to be used for
+several commands.
+
+The CTRL-A (add) and CTRL-X (subtract) commands are new. The count to the
+command (default 1) is added to/subtracted from the number at or after the
+cursor. That number may be decimal, octal (starts with a '0') or hexadecimal
+(starts with '0x'). Very useful in macros.
+
+With the :set command the prefix "inv" can be used to invert boolean options.
+
+In both Vi and Vim you can create a line break with the ":substitute" command
+by using a CTRL-M. For Vi this means you cannot insert a real CTRL-M in the
+text. With Vim you can put a real CTRL-M in the text by preceding it with a
+CTRL-V.
+
+
+In Insert mode:
+
+If the 'revins' option is set, insert happens backwards. This is for typing
+Hebrew. When inserting normal characters the cursor will not be shifted and
+the text moves rightwards. Backspace, CTRL-W and CTRL-U will also work in
+the opposite direction. CTRL-B toggles the 'revins' option. In replace mode
+'revins' has no effect. Only when enabled at compile time.
+
+The backspace key can be used just like CTRL-D to remove auto-indents.
+
+You can backspace, CTRL-U and CTRL-W over line breaks if the 'backspace' (bs)
+option includes "eol". You can backspace over the start of insert if the
+'backspace' option includes "start".
+
+When the 'paste' option is set, a few options are reset and mapping in insert
+mode and abbreviation are disabled. This allows for pasting text in windowing
+systems without unexpected results. When the 'paste' option is reset, the old
+option values are restored.
+
+CTRL-T/CTRL-D always insert/delete an indent in the current line, no matter
+what column the cursor is in.
+
+CTRL-@ (insert previously inserted text) works always (Vi: only when typed as
+first character).
+
+CTRL-A works like CTRL-@ but does not leave insert mode.
+
+CTRL-R {register} can be used to insert the contents of a register.
+
+When the 'smartindent' option is set, C programs will be better auto-indented.
+With 'cindent' even more.
+
+CTRL-Y and CTRL-E can be used to copy a character from above/below the
+current cursor position.
+
+After CTRL-V you can enter a three digit decimal number. This byte value is
+inserted in the text as a single character. Useful for international
+characters that are not on your keyboard.
+
+When the 'expandtab' (et) option is set, a <Tab> is expanded to the
+appropriate number of spaces.
+
+The window always reflects the contents of the buffer (Vi does not do this
+when changing text and in some other cases).
+
+If Vim is compiled with DIGRAPHS defined, digraphs are supported. A set of
+normal digraphs is included. They are shown with the ":digraph" command.
+More can be added with ":digraph {char1}{char2} {number}". A digraph is
+entered with "CTRL-K {char1} {char2}" or "{char1} BS {char2}" (only when
+'digraph' option is set).
+
+When repeating an insert, e.g. "10atest <Esc>" vi would only handle wrapmargin
+for the first insert. Vim does it for all.
+
+A count to the "i" or "a" command is used for all the text. Vi uses the count
+only for one line. "3iabc<NL>def<Esc>" would insert "abcabcabc<NL>def" in Vi
+but "abc<NL>defabc<NL>defabc<NL>def" in Vim.
+
+
+In Command-line mode:
+
+<Esc> terminates the command-line without executing it. In vi the command
+line would be executed, which is not what most people expect (hitting <Esc>
+should always get you back to command mode). To avoid problems with some
+obscure macros, an <Esc> in a macro will execute the command. If you want a
+typed <Esc> to execute the command like vi does you can fix this with
+ ":cmap ^V<Esc> ^V<CR>"
+
+General:
+
+The 'ttimeout' option is like 'timeout', but only works for cursor and
+function keys, not for ordinary mapped characters. The 'timeoutlen' option
+gives the number of milliseconds that is waited for. If the 'esckeys' option
+is not set, cursor and function keys that start with <Esc> are not recognized
+in insert mode.
+
+There is an option for each terminal string. Can be used when termcap is not
+supported or to change individual strings.
+
+The 'fileformat' option can be set to select the <EOL>: "dos" <CR><NL>, "unix"
+<NL> or "mac" <CR>.
+When the 'fileformats' option is not empty, Vim tries to detect the type of
+<EOL> automatically. The 'fileformat' option is set accordingly.
+
+On systems that have no job control (older Unix systems and non-Unix systems)
+the CTRL-Z, ":stop" or ":suspend" command starts a new shell.
+
+If Vim is started on the Amiga without an interactive window for output, a
+window is opened (and :sh still works). You can give a device to use for
+editing with the |-d| argument, e.g. "-d con:20/20/600/150".
+
+The 'columns' and 'lines' options are used to set or get the width and height
+of the display.
+
+Option settings are read from the first and last few lines of the file.
+Option 'modelines' determines how many lines are tried (default is 5). Note
+that this is different from the Vi versions that can execute any Ex command
+in a modeline (a major security problem). |trojan-horse|
+
+If the 'insertmode' option is set (e.g. in .exrc), Vim starts in insert mode.
+And it comes back there, when pressing <Esc>.
+
+Undo information is kept in memory. Available memory limits the number and
+size of change that can be undone. This is hardly a problem on the Amiga and
+almost never with Unix and Win32.
+
+If the 'backup' or 'writebackup' option is set: Before a file is overwritten,
+a backup file (.bak) is made. If the "backup" option is set it is left
+behind.
+
+Vim creates a file ending in ".swp" to store parts of the file that have been
+changed or that do not fit in memory. This file can be used to recover from
+an aborted editing session with "vim -r file". Using the swap file can be
+switched off by setting the 'updatecount' option to 0 or starting Vim with
+the "-n" option. Use the 'directory' option for placing the .swp file
+somewhere else.
+
+Vim is able to work correctly on filesystems with 8.3 file names, also when
+using messydos or crossdos filesystems on the Amiga, or any 8.3 mounted
+filesystem under Unix. See |'shortname'|.
+
+Error messages are shown at least one second (Vi overwrites error messages).
+
+If Vim gives the |hit-enter| prompt, you can hit any key. Characters other
+than <CR>, <NL> and <Space> are interpreted as the (start of) a command.
+{Vi: only ":" commands are interpreted}
+
+The contents of the numbered and unnamed registers is remembered when
+changing files.
+
+The "No lines in buffer" message is a normal message instead of an error
+message, since that may cause a mapping to be aborted.
+{Vi: error messages may be overwritten with other messages before you have a
+chance to read them}
+
+The AUX: device of the Amiga is supported.
+
+==============================================================================
+6. Supported Vi features *vi-features*
+
+Vim supports nearly all Vi commands and mostly in the same way. That is when
+the 'compatible' option is set and 'cpoptions' contains all flags. What the
+effect is of resetting 'compatible' and removing flags from 'cpoptions' can be
+found at the help for the specific command.
+
+The help files used to mark features that are in Vim but not in Vi with {not
+in Vi}. However, since these remarks cluttered the help files we now do it
+the other way around: Below is listed what Vi already supported. Anything
+else has been added by Vim.
+
+
+The following Ex commands are supported by Vi: ~
+
+`:abbreviate` enter abbreviation
+`:append` append text
+`:args` print the argument list
+`:cd` change directory; Vi: no "cd -"
+`:change` replace a line or series of lines
+`:chdir` change directory
+`:copy` copy lines
+`:delete` delete lines
+`:edit` edit a file
+`:exit` same as `:xit`
+`:file` show or set the current file name; Vi: without the column number
+`:global` execute commands for matching lines
+`:insert` insert text
+`:join` join lines; Vi: not :join!
+`:k` set a mark
+`:list` print lines
+`:map` show or enter a mapping
+`:mark` set a mark
+`:move` move lines
+`:Next` go to previous file in the argument list {Vi: no count}
+`:next` go to next file in the argument list {Vi: no count}
+`:number` print lines with line number
+`:open` start open mode (not implemented in Vim)
+`:pop` jump to older entry in tag stack (only in some versions)
+`:preserve` write all text to swap file {Vi: might also exit}
+`:previous` same as `:Next` {Vi: only in some versions}
+`:print` print lines
+`:put` insert contents of register in the text
+`:quit` quit Vi
+`:read` read file into the text
+`:recover` recover a file from a swap file {Vi: recovers in another way
+ and sends mail if there is something to recover}
+`:rewind` go to the first file in the argument list; no ++opt
+`:set` set option; but not `:set inv{option}`, `:set option&`,
+ `:set all&`, `:set option+=value`, `:set option^=value`
+ `:set option-=value` `:set option<`
+`:shell` escape to a shell
+`:source` read Vi or Ex commands from a file
+`:stop` suspend the editor or escape to a shell
+`:substitute` find and replace text; Vi: no '&', 'i', 's', 'r' or 'I' flag,
+ confirm prompt only supports 'y' and 'n', no highlighting
+`:suspend` same as ":stop"
+`:t` same as ":copy"
+`:tag` jump to tag
+`:unabbreviate` remove abbreviation
+`:undo` undo last change {Vi: only one level}
+`:unmap` remove mapping
+`:vglobal` execute commands for not matching lines
+`:version` print version number and other info
+`:visual` same as ":edit", but turns off "Ex" mode
+`:wq` write to a file and quit Vi
+`:write` write to a file
+`:xit` write if buffer changed and quit Vi
+`:yank` yank lines into a register
+`:z` print some lines {not in all versions of Vi}
+`:!` filter lines or execute an external command
+`:"` comment
+`:#` same as ":number"
+`:*` execute contents of a register
+`:&` repeat last ":substitute"
+`:<` shift lines one 'shiftwidth' left
+`:=` print the cursor line number
+`:>` shift lines one 'shiftwidth' right
+`:@` execute contents of a register; but not `:@`; `:@@` only in
+ some versions
+
+Common for these commands is that Vi doesn't support the ++opt argument on
+`:edit` and other commands that open a file.
+
+
+The following Normal mode commands are supported by Vi: ~
+
+note: See the beginning of |normal-index| for the meaning of WORD, N, Nmove
+and etc in the description text.
+
+|CTRL-B| scroll N screens Backwards
+|CTRL-C| interrupt current (search) command
+|CTRL-D| scroll Down N lines (default: half a screen); Vim scrolls
+ 'scroll' screen lines, Vi scrolls file lines; makes a
+ difference when lines wrap
+|CTRL-E| scroll N lines upwards (N lines Extra)
+|CTRL-F| scroll N screens Forward
+|CTRL-G| display current file name and position
+|<BS>| same as "h"
+|CTRL-H| same as "h"
+|<NL>| same as "j"
+|CTRL-J| same as "j"
+|CTRL-L| redraw screen
+|<CR>| cursor to the first CHAR N lines lower
+|CTRL-M| same as <CR>
+|CTRL-N| same as "j"
+|CTRL-P| same as "k"
+|CTRL-R| in some Vi versions: same as CTRL-L
+|CTRL-T| jump to N older Tag in tag list
+|CTRL-U| N lines Upwards (default: half a screen) {Vi used file lines
+ while Vim scrolls 'scroll' screen lines; makes a difference
+ when lines wrap}
+|CTRL-Y| scroll N lines downwards
+|CTRL-Z| suspend program (or start new shell)
+|CTRL-]| :ta to ident under cursor {Vi: identifier after the cursor}
+|CTRL-^| edit alternate file {Vi: no count}
+|<Space>| same as "l"
+|!| filter Nmove text through the {filter} command
+|!!| filter N lines through the {filter} command
+" use register {a-zA-Z0-9.%#:-"} for next delete, yank or put
+ (uppercase to append) ({.%#:} only work with put)
+|$| cursor to the end of Nth next line
+|%| find the next (curly/square) bracket on this line and go to
+ its match, or go to matching comment bracket, or go to
+ matching preprocessor directive (Vi: no count supported)
+|&| repeat last :s
+|'| jump to mark (Vi: only lowercase marks)
+|(| cursor N sentences backward
+|)| cursor N sentences forward
+|+| same as <CR>
+|,| repeat latest f, t, F or T in opposite direction N times
+|-| cursor to the first CHAR N lines higher
+|.| repeat last change with count replaced with N
+|/| search forward for the Nth occurrence of {pattern}
+|0| cursor to the first char of the line
+|:| start entering an Ex command
+|;| repeat latest f, t, F or T N times
+|<| shift Nmove lines one 'shiftwidth' leftwards
+|<<| shift N lines one 'shiftwidth' leftwards
+|=| filter Nmove lines through "indent"
+|==| filter N lines through "indent"
+|>| shift Nmove lines one 'shiftwidth' rightwards
+|>>| shift N lines one 'shiftwidth' rightwards
+|?| search backward for the Nth previous occurrence of {pattern}
+|@| execute the contents of register {a-z} N times
+ {Vi: only named registers}
+|@@| repeat the previous @{a-z} N times
+|A| append text after the end of the line N times
+|B| cursor N WORDS backward
+|C| change from the cursor position to the end of the line
+|D| delete the characters under the cursor until the end of the
+ line and N-1 more lines [into register x]; synonym for "d$"
+|E| cursor forward to the end of WORD N
+|F| cursor to the Nth occurrence of {char} to the left
+|G| cursor to line N, default last line
+|H| cursor to line N from top of screen
+|I| insert text before the first CHAR on the line N times
+|J| Join N lines; default is 2
+|L| cursor to line N from bottom of screen
+|M| cursor to middle line of screen
+|N| repeat the latest '/' or '?' N times in opposite direction
+|O| begin a new line above the cursor and insert text, repeat N
+ times {Vi: blank [count] screen lines}
+|P| put the text [from register x] before the cursor N times
+ {Vi: no count}
+|Q| switch to "Ex" mode
+|R| enter replace mode: overtype existing characters, repeat the
+ entered text N-1 times
+|S| delete N lines [into register x] and start insert; synonym for
+ "cc".
+|T| cursor till after Nth occurrence of {char} to the left
+|U| undo all latest changes on one line
+ {Vi: while not moved off of the last modified line}
+|W| cursor N WORDS forward
+|X| delete N characters before the cursor [into register x]
+|Y| yank N lines [into register x]; synonym for "yy"
+|ZZ| store current file if modified, and exit
+|[[| cursor N sections backward
+|]]| cursor N sections forward
+|^| cursor to the first CHAR of the line
+|_| cursor to the first CHAR N - 1 lines lower
+|`| cursor to the mark {a-zA-Z0-9}
+|a| append text after the cursor N times
+|b| cursor N words backward
+|c| delete Nmove text [into register x] and start insert
+|cc| delete N lines [into register x] and start insert
+|d| delete Nmove text [into register x]
+|dd| delete N lines [into register x]
+|e| cursor forward to the end of word N
+|f| cursor to Nth occurrence of {char} to the right
+|h| cursor N chars to the left
+|i| insert text before the cursor N times
+|j| cursor N lines downward
+|k| cursor N lines upward
+|l| cursor N chars to the right
+|m| set mark {A-Za-z} at cursor position
+|n| repeat the latest '/' or '?' N times
+|o| begin a new line below the cursor and insert text
+ {Vi: blank [count] screen lines}
+|p| put the text [from register x] after the cursor N times
+ {Vi: no count}
+|r| replace N chars with {char} {Vi: CTRL-V <CR> still replaces
+ with a line break, cannot replace something with a <CR>}
+|s| (substitute) delete N characters [into register x] and start
+ insert
+|t| cursor till before Nth occurrence of {char} to the right
+|u| undo changes {Vi: only one level}
+|w| cursor N words forward
+|x| delete N characters under and after the cursor [into register
+ x]
+|y| yank Nmove text [into register x]
+|yy| yank N lines [into register x]
+|z<CR>| current line to the top
+|z-| current line to the bottom
+|z+| cursor on line N
+|z^| cursor on line N
+|{| cursor N paragraphs backward
+| cursor to column N
+|}| cursor N paragraphs forward
+|~| switch case of N characters under the cursor; Vim: depends on
+ 'tildeop' {Vi: no count, no 'tildeop'}
+|<Del>| same as "x"
+
+
+The following commands are supported in Insert mode by Vi: ~
+
+CTRL-@ insert previously inserted text and stop insert
+ {Vi: only when typed as first char, only up to 128 chars}
+CTRL-C quit insert mode, without checking for abbreviation, unless
+ 'insertmode' set.
+CTRL-D delete one shiftwidth of indent in the current line
+ {Vi: CTRL-D works only when used after autoindent}
+<BS> delete character before the cursor {Vi: does not delete
+ autoindents, does not cross lines, does not delete past start
+ position of insert}
+CTRL-H same as <BS>
+<Tab> insert a <Tab> character
+CTRL-I same as <Tab>
+<NL> same as <CR>
+CTRL-J same as <CR>
+<CR> begin new line
+CTRL-M same as <CR>
+CTRL-T insert one shiftwidth of indent in current line {Vi: only when
+ in indent}
+CTRL-V {char} insert next non-digit literally {Vi: no decimal byte entry}
+CTRL-W delete word before the cursor
+CTRL-Z when 'insertmode' set: suspend Vi
+<Esc> end insert mode (unless 'insertmode' set)
+CTRL-[ same as <Esc>
+0 CTRL-D delete all indent in the current line
+^ CTRL-D delete all indent in the current line, restore it in the next
+ line
+<Del> delete character under the cursor
+
+
+The following options are supported by Vi: ~
+
+'autoindent' 'ai' take indent for new line from previous line
+ {Vi does this slightly differently: After the
+ indent is deleted when typing <Esc> or <CR>, the
+ cursor position when moving up or down is after
+ the deleted indent; Vi puts the cursor somewhere
+ in the deleted indent}.
+'autowrite' 'aw' automatically write file if changed
+'directory' 'dir' list of directory names for the swap file
+ {Vi: directory to put temp file in, defaults to
+ "/tmp"}
+'edcompatible' 'ed' toggle flags of ":substitute" command
+'errorbells' 'eb' ring the bell for error messages
+'ignorecase' 'ic' ignore case in search patterns
+'lines' number of lines in the display
+'lisp' automatic indenting for Lisp {Vi: Does it a little
+ bit differently}
+'list' show <Tab> and <EOL>
+'magic' changes special characters in search patterns
+'modeline' 'ml' recognize 'modelines' at start or end of file
+ {called modelines in some Vi versions}
+'number' 'nu' print the line number in front of each line
+'paragraphs' 'para' nroff macros that separate paragraphs
+'prompt' 'prompt' enable prompt in Ex mode
+'readonly' 'ro' disallow writing the buffer {Vim sets 'readonly'
+ when editing a file with `:view`}
+'remap' allow mappings to work recursively
+'report' threshold for reporting nr. of lines changed
+'scroll' 'scr' lines to scroll with CTRL-U and CTRL-D
+'sections' 'sect' nroff macros that separate sections
+'shell' 'sh' name of shell to use for external commands
+'shiftwidth' 'sw' number of spaces to use for (auto)indent step
+'showmatch' 'sm' briefly jump to matching bracket if insert one
+'showmode' 'smd' message on status line to show current mode
+'tabstop' 'ts' number of spaces that <Tab> in file uses
+'taglength' 'tl' number of significant characters for a tag
+'tags' 'tag' list of file names used by the tag command
+ {Vi: default is "tags /usr/lib/tags"}
+'tagstack' 'tgst' push tags onto the tag stack {not in all versions
+ of Vi}
+'term' name of the terminal
+'terse' shorten some messages
+'timeout' 'to' time out on mappings and key codes
+'timeoutlen' 'tm' time for 'timeout' {only in some Vi versions}
+'ttytype' 'tty' alias for 'term'
+'verbose' 'vbs' give informative messages {only in some Vi
+ versions as a boolean option}
+'warn' warn for shell command when buffer was changed
+'window' 'wi' nr of lines to scroll for CTRL-F and CTRL-B
+ {Vi also uses the option to specify the number of
+ displayed lines}
+'wrapmargin' 'wm' chars from the right where wrapping starts
+ {Vi: works differently and less usefully}
+'wrapscan' 'ws' searches wrap around the end of the file
+'writeany' 'wa' write to file with no need for "!" override
+
+Also see |missing-options|.
+
+==============================================================================
+7. Command-line arguments *cmdline-arguments*
+
+Different versions of Vi have different command-line arguments. This can be
+confusing. To help you, this section gives an overview of the differences.
+
+Five variants of Vi will be considered here:
+ Elvis Elvis version 2.1b
+ Nvi Nvi version 1.79
+ Posix Posix 1003.2
+ Vi Vi version 3.7 (for Sun 4.1.x)
+ Vile Vile version 7.4 (incomplete)
+ Vim Vim version 5.2
+
+Only Vim is able to accept options in between and after the file names.
+
++{command} Elvis, Nvi, Posix, Vi, Vim: Same as "-c {command}".
+
+- Nvi, Posix, Vi: Run Ex in batch mode.
+ Vim: Read file from stdin (use -s for batch mode).
+
+-- Vim: End of options, only file names are following.
+
+--cmd {command} Vim: execute {command} before sourcing vimrc files.
+
+--echo-wid Vim: GTK+ echoes the Window ID on stdout
+
+--help Vim: show help message and exit.
+
+--literal Vim: take file names literally, don't expand wildcards.
+
+--nofork Vim: same as |-f|
+
+--noplugin[s] Vim: Skip loading plugins.
+
+--remote Vim: edit the files in another Vim server
+
+--remote-expr {expr} Vim: evaluate {expr} in another Vim server
+
+--remote-send {keys} Vim: send {keys} to a Vim server and exit
+
+--remote-silent {file} Vim: edit the files in another Vim server if possible
+
+--remote-wait Vim: edit the files in another Vim server and wait for it
+
+--remote-wait-silent Vim: like --remote-wait, no complaints if not possible
+
+--role {role} Vim: GTK+ 2: set role of main window
+
+--serverlist Vim: Output a list of Vim servers and exit
+
+--servername {name} Vim: Specify Vim server name
+
+--socketid {id} Vim: GTK window socket to run Vim in
+
+--windowid {id} Vim: Win32 window ID to run Vim in
+
+--version Vim: show version message and exit.
+
+-? Vile: print usage summary and exit.
+
+-a Elvis: Load all specified file names into a window (use -o for
+ Vim).
+
+-A Vim: Start in Arabic mode (when compiled with Arabic).
+
+-b {blksize} Elvis: Use {blksize} blocksize for the session file.
+-b Vim: set 'binary' mode.
+
+-C Vim: Compatible mode.
+
+-c {command} Elvis, Nvi, Posix, Vim: run {command} as an Ex command after
+ loading the edit buffer.
+ Vim: allow up to 10 "-c" arguments
+
+-d {device} Vim: Use {device} for I/O (Amiga only). {only when compiled
+ without the |+diff| feature}
+-d Vim: start with 'diff' set. |vimdiff|
+
+-dev {device} Vim: Use {device} for I/O (Amiga only).
+
+-D Vim: debug mode.
+
+-e Elvis, Nvi, Vim: Start in Ex mode, as if the executable is
+ called "ex".
+
+-E Vim: Start in improved Ex mode |gQ|, like "exim".
+
+-f Vim: Run GUI in foreground (Amiga: don't open new window).
+-f {session} Elvis: Use {session} as the session file.
+
+-F Vim: Start in Farsi mode (when compiled with Farsi).
+ Nvi: Fast start, don't read the entire file when editing
+ starts.
+
+-G {gui} Elvis: Use the {gui} as user interface.
+
+-g Vim: Start GUI.
+-g N Vile: start editing at line N
+
+-h Vim: Give help message.
+ Vile: edit the help file
+
+-H Vim: start Hebrew mode (when compiled with it).
+
+-i Elvis: Start each window in Insert mode.
+-i {viminfo} Vim: Use {viminfo} for viminfo file.
+
+-L Vim: Same as "-r" {only in some versions of Vi: "List
+ recoverable edit sessions"}.
+
+-l Nvi, Vi, Vim: Set 'lisp' and 'showmatch' options.
+
+-m Vim: Modifications not allowed to be written, resets 'write'
+ option.
+
+-M Vim: Modifications not allowed, resets 'modifiable' and the
+ 'write' option.
+
+-N Vim: No-compatible mode.
+
+-n Vim: No swap file used.
+
+-nb[args] Vim: open a NetBeans interface connection
+
+-O[N] Vim: Like -o, but use vertically split windows.
+
+-o[N] Vim: Open [N] windows, or one for each file.
+
+-p[N] Vim: Open [N] tab pages, or one for each file.
+
+-P {parent-title} Win32 Vim: open Vim inside a parent application window
+
+-q {name} Vim: Use {name} for quickfix error file.
+-q{name} Vim: Idem.
+
+-R Elvis, Nvi, Posix, Vile, Vim: Set the 'readonly' option.
+
+-r Elvis, Nvi, Posix, Vi, Vim: Recovery mode.
+
+-S Nvi: Set 'secure' option.
+-S {script} Vim: source script after starting up.
+
+-s Nvi, Posix, Vim: Same as "-" (silent mode), when in Ex mode.
+ Elvis: Sets the 'safer' option.
+-s {scriptin} Vim: Read from script file {scriptin}; only when not in Ex
+ mode.
+-s {pattern} Vile: search for {pattern}
+
+-t {tag} Elvis, Nvi, Posix, Vi, Vim: Edit the file containing {tag}.
+-t{tag} Vim: Idem.
+
+-T {term} Vim: Set terminal name to {term}.
+
+-u {vimrc} Vim: Read initializations from {vimrc} file.
+
+-U {gvimrc} Vim: Read GUI initializations from {gvimrc} file.
+
+-v Nvi, Posix, Vi, Vim: Begin in Normal mode (visual mode, in Vi
+ terms).
+ Vile: View mode, no changes possible.
+
+-V Elvis, Vim: Verbose mode.
+-V{nr} Vim: Verbose mode with specified level.
+
+-w {size} Elvis, Posix, Nvi, Vi, Vim: Set value of 'window' to {size}.
+-w{size} Nvi, Vi: Same as "-w {size}".
+-w {name} Vim: Write to script file {name} (must start with non-digit).
+
+-W {name} Vim: Append to script file {name}.
+
+-x Vi, Vim: Ask for encryption key. See |encryption|.
+
+-X Vim: Don't connect to the X server.
+
+-y Vim: Start in easy mode, like |evim|.
+
+-Z Vim: restricted mode
+
+@{cmdfile} Vile: use {cmdfile} as startup file.
+
+==============================================================================
+8. POSIX compliance *posix* *posix-compliance*
+
+In 2005 the POSIX test suite was run to check the compatibility of Vim. Most
+of the test was executed properly. There are the few things where Vim
+is not POSIX compliant, even when run in Vi compatibility mode.
+ *$VIM_POSIX*
+Set the $VIM_POSIX environment variable to have 'cpoptions' include the POSIX
+flags when Vim starts up. This makes Vim run as POSIX as it can. That's
+a bit different from being Vi compatible.
+
+You can find the Posix specification for Vi here:
+https://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html
+And the related Ex specification:
+https://pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
+
+This is where Vim does not behave as POSIX specifies and why:
+
+ *posix-screen-size*
+ The $COLUMNS and $LINES environment variables are ignored by Vim if
+ the size can be obtained from the terminal in a more reliable way.
+ Add the '|' flag to 'cpoptions' to have $COLUMNS and $LINES overrule
+ sizes obtained in another way.
+
+ The "{" and "}" commands don't stop at a "{" in the original Vi, but
+ POSIX specifies it does. Add the '{' flag to 'cpoptions' if you want
+ it the POSIX way.
+
+ The "D", "o" and "O" commands accept a count. Also when repeated.
+ Add the '#' flag to 'cpoptions' if you want to ignore the count.
+
+ The ":cd" command fails if the current buffer is modified when the '.'
+ flag is present in 'cpoptions'.
+
+ There is no ATTENTION message, the "A" flag is added to 'shortmess'.
+
+These are remarks about running the POSIX test suite:
+- vi test 33 sometimes fails for unknown reasons
+- vi test 250 fails; behavior will be changed in a new revision
+ http://www.opengroup.org/austin/mailarchives/ag-review/msg01710.html
+ (link no longer works, perhaps it's now:
+ https://www.opengroup.org/sophocles/show_mail.tpl?CALLER=show_archive.tpl&source=L&listname=austin-review-l&id=1711)
+- vi test 310 fails; exit code non-zero when any error occurred?
+- ex test 24 fails because test is wrong. Changed between SUSv2 and SUSv3.
+- ex tests 47, 48, 49, 72, 73 fail because .exrc file isn't read in silent
+ mode and $EXINIT isn't used.
+- ex tests 76, 78 fail because echo is used instead of printf. (fixed)
+ Also: problem with \s not changed to space.
+- ex test 355 fails because 'window' isn't used for "30z".
+- ex test 368 fails because shell command isn't echoed in silent mode.
+- ex test 394 fails because "=" command output isn't visible in silent mode.
+- ex test 411 fails because test file is wrong, contains stray ':'.
+- ex test 475 and 476 fail because reprint output isn't visible in silent mode.
+- ex test 480 and 481 fail because the tags file has spaces instead of a tab.
+- ex test 502 fails because .exrc isn't read in silent mode.
+- ex test 509 fails because .exrc isn't read in silent mode. and exit code is
+ 1 instead of 2.
+- ex test 534 fails because .exrc isn't read in silent mode.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/vim-da.1 b/runtime/doc/vim-da.1
new file mode 100644
index 0000000..6699741
--- /dev/null
+++ b/runtime/doc/vim-da.1
@@ -0,0 +1,555 @@
+.TH VIM 1 "11. april 2006"
+.SH NAVN
+vim \- Vi IMproved, en programmrs teksteditor
+.SH SYNOPSIS
+.br
+.B vim
+[tilvalg] [fil ..]
+.br
+.B vim
+[tilvalg] \-
+.br
+.B vim
+[tilvalg] \-t tag
+.br
+.B vim
+[tilvalg] \-q [fejlfil]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH BESKRIVELSE
+.B Vim
+er en teksteditor som er opad kompatibel med Vi.
+Den kan bruges til at redigere alle slags ren tekst.
+Den er srlig nyttig til at redigere programmer.
+.PP
+Der er mange forbedringer over Vi: multiniveau fortryd,
+multivinduer og -buffere, syntaksfremhvning, redigering af kommandolinje,
+fuldfrelse af filnavn, onlinehjlp, visuel markering, osv.
+Se ":help vi_diff.txt" for et overblik over forskellene mellem
+.B Vim
+og Vi.
+.PP
+Mens
+.B Vim
+krer, kan der indhentes massere af hjlp fra online-hjlpesystemet, med
+":help"-kommandoen.
+Se ONLINEHJLP-sektionen nedenfor.
+.PP
+Oftest startes
+.B Vim
+for at redigere en enkelt fil med kommandoen
+.PP
+ vim fil
+.PP
+Mere generelt startes
+.B Vim
+med:
+.PP
+ vim [tilvalg] [filliste]
+.PP
+Hvis fillisten mangler, s startes editoren med en tom buffer.
+Ellers kan n af flgende fire mder bruges til at vlge en eller
+flere filer som skal redigeres.
+.TP 12
+fil ..
+En liste over filnavne.
+Den frste bliver den nuvrende fil og lses ind i bufferen.
+Markren placeres p den frste linje i bufferen.
+Du kan g til de andre filer med ":next"-kommandoen. Skriv "\-\-" foran
+fillisten, for at redigere en fil som begynder med en bindestreg.
+.TP
+\-
+Filen som skal redigeres lses fra stdin. Kommandoer lses fra stderr, hvilket
+skal vre en tty.
+.TP
+\-t {tag}
+Filen som skal redigeres og den indledende markrplacering afhnger af
+et "tag", en slags g til-etiket.
+{tag} opsls i tags-filen, den tilknyttede fil bliver den nuvrende
+fil og den tilknyttede kommando udfres.
+Det bruges mest til C-programmer, hvor {tag} kunne vre et
+funktionsnavn.
+Virkningen er at filen som indeholder funktionen bliver den nuvrende fil
+og markren placeres i begyndelsen af funktionen.
+Se ":help tag\-commands".
+.TP
+\-q [fejlfil]
+Start i quickFix-tilstand.
+Filen [fejlfil] lses og den frste fejl vises.
+Hvis [fejlfil] udelades, s indhentes filnavnet fra 'errorfile'-valgmuligheden
+(standard er "AztecC.Err" p Amiga, "errors.err" p andre
+systemer).
+Der kan hoppes til yderligere fejl med ":cn"-kommandoen.
+Se ":help quickfix".
+.PP
+.B Vim
+opfrer sig anderledes, afhngig af navnet p kommandoen (eksekverbaren kan
+stadig vre den samme fil).
+.TP 10
+vim
+Den "normale" mde, alt er standard.
+.TP
+ex
+Start i Ex-tilstand.
+G til normal tilstand med ":vi"-kommandoen.
+Det kan ogs gres med "\-e"-argumentet.
+.TP
+view
+Start i skrivebeskyttet tilstand. Du vil vre beskyttet mod at skrive filerne.
+Det kan ogs gres med "\-R"-argumentet.
+.TP
+gvim gview
+GUI-versionen.
+Starter et nyt vindue.
+Det kan ogs gres med "\-g"-argumentet.
+.TP
+evim eview
+GUI-versionen i easy-tilstand.
+Starter et nyt vindue.
+Det kan ogs gres med "\-y"-argumentet.
+.TP
+rvim rview rgvim rgview
+Som dem ovenfor, men med restriktioner. Det vil ikke vre muligt at starte
+skalkommandoer, eller at suspendere
+.B Vim\c
+\&.
+Det kan ogs gres med "\-Z"-argumentet.
+.SH TILVALG
+Tilvalgene kan gives i vilkrlig rkkeflge, fr eller efter filnavnene.
+Tilvalg uden et argument kan kombineres efter en enkelt bindestreg.
+.TP 12
++[nummer]
+Ved den frste fil, placeres markren p linje "nummer".
+Hvis "nummer" mangler, s placeres markren p den sidste linje.
+.TP
++/{sti}
+Ved den frste fil, placeres markren p linjen med den
+frste forekomst af {sti}.
+Se ":help search\-pattern" for tilgngelige sgemnstre.
+.TP
++{kommando}
+.TP
+\-c {kommando}
+{kommando} udfres efter den frste fil er blevet lst.
+{kommando} fortolkes som en Ex-kommando.
+Hvis {kommando} indeholder mellemrum, s skal den omsluttes af
+dobbelte citationstegn (det afhnger af den skal der bruges).
+Eksempel: vim "+set si" main.c
+.br
+Bemrk: Du kan bruge op til 10 "+"- eller "\-c"-kommandoer.
+.TP
+\-S {fil}
+{fil} bliver sourced efter den frste fil er blevet lst.
+Det svarer til \-c "source {fil}".
+{fil} m ikke begynde med '\-'.
+Hvis {fil} udelades, s bruges "Session.vim" (virker kun nr \-S er det sidste
+argument).
+.TP
+\-\-cmd {kommando}
+Ligesom at bruge "\-c", men kommandoen udfres lige inden
+behandlingen af vimrc-filer.
+Du kan bruge op til 10 af disse kommandoer, uafhngigt af "\-c"-kommandoer.
+.TP
+\-A
+Hvis
+.B Vim
+blev kompileret med understttelse af ARABIC til redigering af filer som er
+orienteret hjre mod venstre og arabisk tastaturlayout, s starter tilvalget
+.B Vim
+i arabisk tilstand, dvs. 'arabic' sttes.
+Ellers gives en fejlmeddelelse og
+.B Vim
+afbrydes.
+.TP
+\-b
+Binr tilstand.
+Der sttes nogle f valgmuligheder som gr det muligt at redigere en
+binr eller eksekverbar fil.
+.TP
+\-C
+Kompatibel. St 'compatible'-valgmuligheden.
+Det fr
+.B Vim
+til at opfre sig mest som Vi, selvom der findes en .vimrc-fil.
+.TP
+\-d
+Start i diff-tilstand.
+Der skal vre to, tre eller fire filnavneargumenter.
+.B Vim
+bner alle filerne og viser forskellene mellem dem.
+Virker ligesom vimdiff(1).
+.TP
+\-d {enhed}
+bn {enhed} til brug som en terminal.
+Kun p Amiga.
+Eksempel:
+"\-d con:20/30/600/150".
+.TP
+\-D
+Fejlretning. G til fejlretningstilstand nr den frste kommando udfres fra
+et script.
+.TP
+\-e
+Start
+.B Vim
+i Ex-tilstand, ligesom hvis "ex"-eksekverbaren blev kaldt.
+.TP
+\-E
+Start
+.B Vim
+i forbedret Ex-tilstand, ligesom hvis "exim"-eksekverbaren blev kaldt.
+.TP
+\-f
+Forgrund. I GUI-versionen, vil
+.B Vim
+ikke fork'e og frigre fra skallen som den blev startet i.
+P Amiga, genstartes
+.B Vim
+ikke for at bne et nyt vindue.
+Tilvalget br bruges nr
+.B Vim
+udfres af et program der venter p at redigeringssession
+bliver frdig (f.eks. mail).
+P Amiga virker ":sh"- og ":!"-kommandoerne ikke.
+.TP
+\-\-nofork
+Forgrund. I GUI-versionen, vil
+.B Vim
+ikke fork'e og frigre fra skallen som den blev startet i.
+.TP
+\-F
+Hvis
+.B Vim
+blev kompileret med understttelse af FKMAP til redigering af filer som er
+orienteret hjre mod venstre og persisk tastaturlayout, s starter tilvalget
+.B Vim
+i persisk tilstand, dvs. 'fkmap' og 'rightleft' sttes.
+Ellers gives en fejlmeddelelse og
+.B Vim
+afbrydes.
+.TP
+\-g
+Hvis
+.B Vim
+blev kompileret med understttelse af GUI, s aktiveres GUI'en af
+denne valgmulighed. Hvis understttelse af GUI ikke blev kompileret ind,
+s gives en fejlmeddelelse og
+.B Vim
+afbrydes.
+.TP
+\-h
+Giv lidt hjlp om kommandolinjeargumenterne og tilvalgene.
+Herefter afsluttes
+.B Vim\c
+\&.
+.TP
+\-H
+Hvis
+.B Vim
+blev kompileret med understttelse af RIGHTLEFT til redigering af filer som er
+orienteret hjre mod venstre og hebraisk tastaturlayout, s starter tilvalget
+.B Vim
+i hebraisk tilstand, dvs. 'hkmap' og 'rightleft' sttes.
+Ellers gives en fejlmeddelelse og
+.B Vim
+afbrydes.
+.TP
+\-i {viminfo}
+Nr brug af viminfo-filen er aktiveret, s stter tilvalget det
+filnavn som skal bruges, i stedet for standarden "~/.viminfo".
+Det kan ogs bruges til at springe brugen af .viminfo-filen over,
+ved at give navnet "NONE".
+.TP
+\-L
+Samme som \-r.
+.TP
+\-l
+Lisp-tilstand.
+Stter 'lisp'- og 'showmatch'-valgmulighederne til.
+.TP
+\-m
+ndring af filer er deaktiveret.
+Nulstiller 'write'-valgmuligheden.
+Du kan stadig ndre bufferen, men det er ikke muligt at skrive en fil.
+.TP
+\-M
+ndringer tillades ikke. 'modifiable'- og 'write'-valgmulighederne fjernes,
+s ndringer ikke er tilladt og filer ikke kan skrives. Bemrk at
+valgmulighederne kan sttes for at gre det muligt at foretage ndringer.
+.TP
+\-N
+No-compatible-tilstand. Nulstil 'compatible'-valgmuligheden.
+Det fr
+.B Vim
+til at opfre sig en smule bedre, men mindre Vi-kompatibel, selvom der ikke
+findes en .vimrc-fil.
+.TP
+\-n
+Der bruges ingen swap-fil.
+Det er umuligt at gendanne efter programmet er holdt op med at virke.
+God hvis du vil redigere en fil p et meget langsomt medie (f.eks. floppy).
+Kan ogs gres med ":set uc=0".
+Kan fortrydes med ":set uc=200".
+.TP
+\-nb
+Bliv en editor-server til NetBeans. Se dokumentationen for detaljer.
+.TP
+\-o[N]
+bn N vinduer stablet.
+Nr N udelades, s bnes t vindue pr. fil.
+.TP
+\-O[N]
+bn N vinduer side om side.
+Nr N udelades, s bnes t vindue pr. fil.
+.TP
+\-p[N]
+bn N fanebladssider.
+Nr N udelades, s bnes n fanebladsside pr. fil.
+.TP
+\-R
+Skrivebeskyttet tilstand.
+\&'readonly'-valgmuligheden sttes.
+Du kan stadig redigere bufferen, men vil vre forhindret i
+fejlagtigt at overskrive en fil.
+Hvis du vil overskrive en fil, s tilfj et
+udrbstegn til Ex-kommandoen, som i ":w!".
+\-R-tilvalget indebrer ogs \-n-tilvalget (se ovenfor).
+\&'readonly'-valgmuligheden kan sls fra med ":set noro".
+Se ":help 'readonly'".
+.TP
+\-r
+Oplist swap-filer, med information om at bruge dem til gendannelse.
+.TP
+\-r {fil}
+Gendannelsestilstand.
+Swap-filen bruges til at gendanne en redigeringssession som holdt
+op med at virke. Swap-filen er en fil med det samme filnavn som tekstfilen,
+med ".swp" tilfjet i slutningen.
+Se ":help recovery".
+.TP
+\-s
+Stille tilstand. Kun nr der startes som "Ex" eller
+nr "\-e"-tilvalget blev givet inden "\-s"-tilvalget.
+.TP
+\-s {scriptind}
+Script-filen {scriptind} lses.
+Tegnene i filen fortolkes som havde du skrevet dem.
+Det samme kan gres med kommandoen ":source! {scriptind}".
+Hvis slutningen af filen ns inden editoren afslutter,
+s lses yderligere tegn fra tastaturet.
+.TP
+\-T {terminal}
+Fortller
+.B Vim
+navnet p terminalen som du bruger.
+Krves kun nr den automatisk mde ikke virker.
+Skal vre en terminal som kendes af
+.B Vim
+(indbygget) eller defineret i termcap- eller terminfo-filen.
+.TP
+\-u {vimrc}
+Brug kommandoerne i {vimrc}-filen til initialiseringer.
+Alle de andre initialiseringer springes over.
+Brug den til at redigere en srlig slags filer.
+Den kan ogs bruges til at springe alle initialiseringer over,
+ved at give navnet "NONE". Se ":help initialization" i vim for flere detaljer.
+.TP
+\-U {gvimrc}
+Brug kommandoerne i {gvimrc}-filen til GUI-initialiseringer.
+Alle de andre GUI-initialiseringer springes over.
+Den kan ogs bruges til at springe alle GUI-initialiseringer over,
+ved at give navnet "NONE". Se ":help gui\-init" i vim for flere detaljer.
+.TP
+\-V[N]
+Uddybende. Giv meddelelser om hvilke filer som er sourced og til lsning og
+skrivning af en viminfo-fil. Det valgfrie nummer N er vrdien af 'verbose'.
+Standard er 10.
+.TP
+\-v
+Start
+.B Vim
+i Vi-tilstand, ligesom eksekverbaren kaldet "vi". Det har kun virkning nr
+eksekverbaren kaldes "ex".
+.TP
+\-w {scriptud}
+Alle tegnene som du skrev optages i filen {scriptud}, indtil du afslutter
+.B Vim\c
+\&.
+Det er nyttigt hvis du vil oprette en script-fil som skal bruges med
+"vim \-s" eller ":source!".
+Hvis {scriptud}-filen findes, s tilfjes tegnene til slutningen.
+.TP
+\-W {scriptud}
+Ligesom \-w, men en eksisterende fil overskrives.
+.TP
+\-x
+Brug kryptering nr der skrives filer. Sprger efter en krypteringsngle.
+.TP
+\-X
+Opret ikke forbindelse til X-serveren. Afkorter opstartstiden i en terminal,
+men vinduets titel og udklipsholder bruges ikke.
+.TP
+\-y
+Start
+.B Vim
+i easy-tilstand, ligesom hvis "evim"- eller "eview"-eksekverbarene blev kaldt.
+Fr
+.B Vim
+til at opfre sig som en klik og skriv-editor.
+.TP
+\-Z
+Restriktiv tilstand. Virker ligesom eksekverbaren som begynder med "r".
+.TP
+\-\-
+Betegner slutningen af tilvalgene.
+Argumenter efter dette hndteres som et filnavn.
+Det kan bruges til at redigere et filnavn som begynder med et '\-'.
+.TP
+\-\-echo\-wid
+Kun GTK GUI: Ekko vinduets id p stdout.
+.TP
+\-\-help
+Giv en hjlpemeddelelse og afslut, ligesom "\-h".
+.TP
+\-\-literal
+Tag filnavnets argumenter bogstaveligt, udvid ikke jokertegn.
+Det har ingen virkning i Unix hvor skallen udvidder jokertegn.
+.TP
+\-\-noplugin
+Spring indlsning af plugins over. Indebres af \-u NONE.
+.TP
+\-\-remote
+Opret forbindelse til en Vim-server og f den til at redigere filerne
+som gives i resten af argumenterne. Hvis der ikke findes nogen server,
+s gives der en advarsel og filerne redigeres i den nuvrende Vim.
+.TP
+\-\-remote\-expr {udtryk}
+Opret forbindelse til en Vim-server, evaluer
+{udtryk} i den og udskriv resultatet p stdout.
+.TP
+\-\-remote\-send {ngler}
+Opret forbindelse til en Vim-server and send {ngler} til den.
+.TP
+\-\-remote\-silent
+Som \-\-remote, men uden advarslen nr der ikke findes nogen server.
+.TP
+\-\-remote\-wait
+Som \-\-remote, men Vim afslutter ikke fr filerne er blevet redigeret.
+.TP
+\-\-remote\-wait\-silent
+Som \-\-remote\-wait, men uden advarslen nr der ikke findes nogen server.
+.TP
+\-\-serverlist
+Oplist navnene p alle Vim-servere som der kan findes.
+.TP
+\-\-servername {navn}
+Brug servernavnet {navn}. Bruges til den nuvrende Vim,
+medmindre det bruges med et \-\-remote-argument,
+s er det navnet p serveren som der skal oprettes forbindelse til.
+.TP
+\-\-socketid {id}
+Kun GTK GUI: Brug GtkPlug-mekanismen til at kre gvim i et andet vindue.
+.TP
+\-\-version
+Udskriv versionsinformation og afslut.
+.SH ONLINEHJLP
+Skriv ":help" i
+.B Vim
+for at begynde.
+Skriv ":help emne" for at f hjlp til et bestemt emne.
+F.eks.: ":help ZZ" for at f hjlpe til "ZZ"-kommandoen.
+Brug <Tab> og CTRL-D for at fuldfre emner (":help cmdline\-completion").
+Tags findes til at hoppe fra et sted til et andet (en slags hypertekst-links,
+se ":help").
+Alle dokumentationsfiler kan vises p denne mde, f.eks.
+":help syntax.txt".
+.SH FILER
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+.B Vim\c
+-dokumentationsfilerne.
+Brug ":help doc\-file\-list" for at f den fulde liste.
+.TP
+/usr/local/lib/vim/doc/tags
+Tags-filen som bruges til at finde information i dokumentationsfilerne.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Systembrede syntaksinitialiseringer.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Syntaksfiler til diverse sprog.
+.TP
+/usr/local/lib/vim/vimrc
+Systembrede
+.B Vim\c
+-initialiseringer.
+.TP
+~/.vimrc
+Dine personlige
+.B Vim\c
+-initialiseringer.
+.TP
+/usr/local/lib/vim/gvimrc
+Systembrede gvim-initialiseringer.
+.TP
+~/.gvimrc
+Dine personlige gvim-initialiseringer.
+.TP
+/usr/local/lib/vim/optwin.vim
+Script som bruges til ":options"-kommandoen,
+en god mde til at vise og stte valgmuligheder.
+.TP
+/usr/local/lib/vim/menu.vim
+Systembrede menu-initialiseringer til gvim.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Script til at generere en fejlrapport. Se ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Script til at registrere filtypen ud fra navnet. Se ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Script til at registrere filtypen ud fra indholdet. Se ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+Filer som bruges til PostScript-udskrivning.
+.PP
+Ls VIM-hjemmesiden for seneste info:
+.br
+<URL:http://www.vim.org/>
+.SH SE OGS
+vimtutor(1)
+.SH FORFATTER
+Det meste af
+.B Vim
+blev lavet af Bram Moolenaar, med en masse hjlp fra andre.
+Se ":help credits" i
+.B Vim\c
+\&.
+.br
+.B Vim
+er baseret p Stevie, arbejdet p af: Tim Thompson,
+Tony Andrews og G.R. (Fred) Walter.
+Selvom der nsten ikke er noget af den originale kode tilbage.
+.SH FEJL
+Formodentligt.
+Se ":help todo" for en liste over kendte problemer.
+.PP
+Bemrk at flere ting som af nogle kan anses som vrende fejl,
+faktisk er pga. en for nr reproduktion af Vi's opfrsel.
+Og hvis du tnker at andre ting er fejl "fordi Vi gr det anderledes",
+s kig nrmere p vi_diff.txt-filen (eller skriv :help vi_diff.txt i Vim).
+Se ogs 'compatible'- og 'cpoptions'-valgmulighederne.
diff --git a/runtime/doc/vim-da.UTF-8.1 b/runtime/doc/vim-da.UTF-8.1
new file mode 100644
index 0000000..97e06a0
--- /dev/null
+++ b/runtime/doc/vim-da.UTF-8.1
@@ -0,0 +1,555 @@
+.TH VIM 1 "11. april 2006"
+.SH NAVN
+vim \- Vi IMproved, en programmørs teksteditor
+.SH SYNOPSIS
+.br
+.B vim
+[tilvalg] [fil ..]
+.br
+.B vim
+[tilvalg] \-
+.br
+.B vim
+[tilvalg] \-t tag
+.br
+.B vim
+[tilvalg] \-q [fejlfil]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH BESKRIVELSE
+.B Vim
+er en teksteditor som er opad kompatibel med Vi.
+Den kan bruges til at redigere alle slags ren tekst.
+Den er særlig nyttig til at redigere programmer.
+.PP
+Der er mange forbedringer over Vi: multiniveau fortryd,
+multivinduer og -buffere, syntaksfremhævning, redigering af kommandolinje,
+fuldførelse af filnavn, onlinehjælp, visuel markering, osv.
+Se ":help vi_diff.txt" for et overblik over forskellene mellem
+.B Vim
+og Vi.
+.PP
+Mens
+.B Vim
+kører, kan der indhentes massere af hjælp fra online-hjælpesystemet, med
+":help"-kommandoen.
+Se ONLINEHJÆLP-sektionen nedenfor.
+.PP
+Oftest startes
+.B Vim
+for at redigere en enkelt fil med kommandoen
+.PP
+ vim fil
+.PP
+Mere generelt startes
+.B Vim
+med:
+.PP
+ vim [tilvalg] [filliste]
+.PP
+Hvis fillisten mangler, så startes editoren med en tom buffer.
+Ellers kan én af følgende fire måder bruges til at vælge en eller
+flere filer som skal redigeres.
+.TP 12
+fil ..
+En liste over filnavne.
+Den første bliver den nuværende fil og læses ind i bufferen.
+Markøren placeres på den første linje i bufferen.
+Du kan gå til de andre filer med ":next"-kommandoen. Skriv "\-\-" foran
+fillisten, for at redigere en fil som begynder med en bindestreg.
+.TP
+\-
+Filen som skal redigeres læses fra stdin. Kommandoer læses fra stderr, hvilket
+skal være en tty.
+.TP
+\-t {tag}
+Filen som skal redigeres og den indledende markørplacering afhænger af
+et "tag", en slags gå til-etiket.
+{tag} opslås i tags-filen, den tilknyttede fil bliver den nuværende
+fil og den tilknyttede kommando udføres.
+Det bruges mest til C-programmer, hvor {tag} kunne være et
+funktionsnavn.
+Virkningen er at filen som indeholder funktionen bliver den nuværende fil
+og markøren placeres i begyndelsen af funktionen.
+Se ":help tag\-commands".
+.TP
+\-q [fejlfil]
+Start i quickFix-tilstand.
+Filen [fejlfil] læses og den første fejl vises.
+Hvis [fejlfil] udelades, så indhentes filnavnet fra 'errorfile'-valgmuligheden
+(standard er "AztecC.Err" på Amiga, "errors.err" på andre
+systemer).
+Der kan hoppes til yderligere fejl med ":cn"-kommandoen.
+Se ":help quickfix".
+.PP
+.B Vim
+opfører sig anderledes, afhængig af navnet på kommandoen (eksekverbaren kan
+stadig være den samme fil).
+.TP 10
+vim
+Den "normale" måde, alt er standard.
+.TP
+ex
+Start i Ex-tilstand.
+Gå til normal tilstand med ":vi"-kommandoen.
+Det kan også gøres med "\-e"-argumentet.
+.TP
+view
+Start i skrivebeskyttet tilstand. Du vil være beskyttet mod at skrive filerne.
+Det kan også gøres med "\-R"-argumentet.
+.TP
+gvim gview
+GUI-versionen.
+Starter et nyt vindue.
+Det kan også gøres med "\-g"-argumentet.
+.TP
+evim eview
+GUI-versionen i easy-tilstand.
+Starter et nyt vindue.
+Det kan også gøres med "\-y"-argumentet.
+.TP
+rvim rview rgvim rgview
+Som dem ovenfor, men med restriktioner. Det vil ikke være muligt at starte
+skalkommandoer, eller at suspendere
+.B Vim\c
+\&.
+Det kan også gøres med "\-Z"-argumentet.
+.SH TILVALG
+Tilvalgene kan gives i vilkårlig rækkefølge, før eller efter filnavnene.
+Tilvalg uden et argument kan kombineres efter en enkelt bindestreg.
+.TP 12
++[nummer]
+Ved den første fil, placeres markøren på linje "nummer".
+Hvis "nummer" mangler, så placeres markøren på den sidste linje.
+.TP
++/{sti}
+Ved den første fil, placeres markøren på linjen med den
+første forekomst af {sti}.
+Se ":help search\-pattern" for tilgængelige søgemønstre.
+.TP
++{kommando}
+.TP
+\-c {kommando}
+{kommando} udføres efter den første fil er blevet læst.
+{kommando} fortolkes som en Ex-kommando.
+Hvis {kommando} indeholder mellemrum, så skal den omsluttes af
+dobbelte citationstegn (det afhænger af den skal der bruges).
+Eksempel: vim "+set si" main.c
+.br
+Bemærk: Du kan bruge op til 10 "+"- eller "\-c"-kommandoer.
+.TP
+\-S {fil}
+{fil} bliver sourced efter den første fil er blevet læst.
+Det svarer til \-c "source {fil}".
+{fil} må ikke begynde med '\-'.
+Hvis {fil} udelades, så bruges "Session.vim" (virker kun når \-S er det sidste
+argument).
+.TP
+\-\-cmd {kommando}
+Ligesom at bruge "\-c", men kommandoen udføres lige inden
+behandlingen af vimrc-filer.
+Du kan bruge op til 10 af disse kommandoer, uafhængigt af "\-c"-kommandoer.
+.TP
+\-A
+Hvis
+.B Vim
+blev kompileret med understøttelse af ARABIC til redigering af filer som er
+orienteret højre mod venstre og arabisk tastaturlayout, så starter tilvalget
+.B Vim
+i arabisk tilstand, dvs. 'arabic' sættes.
+Ellers gives en fejlmeddelelse og
+.B Vim
+afbrydes.
+.TP
+\-b
+Binær tilstand.
+Der sættes nogle få valgmuligheder som gør det muligt at redigere en
+binær eller eksekverbar fil.
+.TP
+\-C
+Kompatibel. Sæt 'compatible'-valgmuligheden.
+Det får
+.B Vim
+til at opføre sig mest som Vi, selvom der findes en .vimrc-fil.
+.TP
+\-d
+Start i diff-tilstand.
+Der skal være to, tre eller fire filnavneargumenter.
+.B Vim
+åbner alle filerne og viser forskellene mellem dem.
+Virker ligesom vimdiff(1).
+.TP
+\-d {enhed}
+Åbn {enhed} til brug som en terminal.
+Kun på Amiga.
+Eksempel:
+"\-d con:20/30/600/150".
+.TP
+\-D
+Fejlretning. Gå til fejlretningstilstand når den første kommando udføres fra
+et script.
+.TP
+\-e
+Start
+.B Vim
+i Ex-tilstand, ligesom hvis "ex"-eksekverbaren blev kaldt.
+.TP
+\-E
+Start
+.B Vim
+i forbedret Ex-tilstand, ligesom hvis "exim"-eksekverbaren blev kaldt.
+.TP
+\-f
+Forgrund. I GUI-versionen, vil
+.B Vim
+ikke fork'e og frigøre fra skallen som den blev startet i.
+På Amiga, genstartes
+.B Vim
+ikke for at åbne et nyt vindue.
+Tilvalget bør bruges når
+.B Vim
+udføres af et program der venter på at redigeringssession
+bliver færdig (f.eks. mail).
+På Amiga virker ":sh"- og ":!"-kommandoerne ikke.
+.TP
+\-\-nofork
+Forgrund. I GUI-versionen, vil
+.B Vim
+ikke fork'e og frigøre fra skallen som den blev startet i.
+.TP
+\-F
+Hvis
+.B Vim
+blev kompileret med understøttelse af FKMAP til redigering af filer som er
+orienteret højre mod venstre og persisk tastaturlayout, så starter tilvalget
+.B Vim
+i persisk tilstand, dvs. 'fkmap' og 'rightleft' sættes.
+Ellers gives en fejlmeddelelse og
+.B Vim
+afbrydes.
+.TP
+\-g
+Hvis
+.B Vim
+blev kompileret med understøttelse af GUI, så aktiveres GUI'en af
+denne valgmulighed. Hvis understøttelse af GUI ikke blev kompileret ind,
+så gives en fejlmeddelelse og
+.B Vim
+afbrydes.
+.TP
+\-h
+Giv lidt hjælp om kommandolinjeargumenterne og tilvalgene.
+Herefter afsluttes
+.B Vim\c
+\&.
+.TP
+\-H
+Hvis
+.B Vim
+blev kompileret med understøttelse af RIGHTLEFT til redigering af filer som er
+orienteret højre mod venstre og hebraisk tastaturlayout, så starter tilvalget
+.B Vim
+i hebraisk tilstand, dvs. 'hkmap' og 'rightleft' sættes.
+Ellers gives en fejlmeddelelse og
+.B Vim
+afbrydes.
+.TP
+\-i {viminfo}
+Når brug af viminfo-filen er aktiveret, så sætter tilvalget det
+filnavn som skal bruges, i stedet for standarden "~/.viminfo".
+Det kan også bruges til at springe brugen af .viminfo-filen over,
+ved at give navnet "NONE".
+.TP
+\-L
+Samme som \-r.
+.TP
+\-l
+Lisp-tilstand.
+Sætter 'lisp'- og 'showmatch'-valgmulighederne til.
+.TP
+\-m
+Ændring af filer er deaktiveret.
+Nulstiller 'write'-valgmuligheden.
+Du kan stadig ændre bufferen, men det er ikke muligt at skrive en fil.
+.TP
+\-M
+Ændringer tillades ikke. 'modifiable'- og 'write'-valgmulighederne fjernes,
+så ændringer ikke er tilladt og filer ikke kan skrives. Bemærk at
+valgmulighederne kan sættes for at gøre det muligt at foretage ændringer.
+.TP
+\-N
+No-compatible-tilstand. Nulstil 'compatible'-valgmuligheden.
+Det får
+.B Vim
+til at opføre sig en smule bedre, men mindre Vi-kompatibel, selvom der ikke
+findes en .vimrc-fil.
+.TP
+\-n
+Der bruges ingen swap-fil.
+Det er umuligt at gendanne efter programmet er holdt op med at virke.
+God hvis du vil redigere en fil på et meget langsomt medie (f.eks. floppy).
+Kan også gøres med ":set uc=0".
+Kan fortrydes med ":set uc=200".
+.TP
+\-nb
+Bliv en editor-server til NetBeans. Se dokumentationen for detaljer.
+.TP
+\-o[N]
+Åbn N vinduer stablet.
+Når N udelades, så åbnes ét vindue pr. fil.
+.TP
+\-O[N]
+Åbn N vinduer side om side.
+Når N udelades, så åbnes ét vindue pr. fil.
+.TP
+\-p[N]
+Åbn N fanebladssider.
+Når N udelades, så åbnes én fanebladsside pr. fil.
+.TP
+\-R
+Skrivebeskyttet tilstand.
+\&'readonly'-valgmuligheden sættes.
+Du kan stadig redigere bufferen, men vil være forhindret i
+fejlagtigt at overskrive en fil.
+Hvis du vil overskrive en fil, så tilføj et
+udråbstegn til Ex-kommandoen, som i ":w!".
+\-R-tilvalget indebærer også \-n-tilvalget (se ovenfor).
+\&'readonly'-valgmuligheden kan slås fra med ":set noro".
+Se ":help 'readonly'".
+.TP
+\-r
+Oplist swap-filer, med information om at bruge dem til gendannelse.
+.TP
+\-r {fil}
+Gendannelsestilstand.
+Swap-filen bruges til at gendanne en redigeringssession som holdt
+op med at virke. Swap-filen er en fil med det samme filnavn som tekstfilen,
+med ".swp" tilføjet i slutningen.
+Se ":help recovery".
+.TP
+\-s
+Stille tilstand. Kun når der startes som "Ex" eller
+når "\-e"-tilvalget blev givet inden "\-s"-tilvalget.
+.TP
+\-s {scriptind}
+Script-filen {scriptind} læses.
+Tegnene i filen fortolkes som havde du skrevet dem.
+Det samme kan gøres med kommandoen ":source! {scriptind}".
+Hvis slutningen af filen nås inden editoren afslutter,
+så læses yderligere tegn fra tastaturet.
+.TP
+\-T {terminal}
+Fortæller
+.B Vim
+navnet på terminalen som du bruger.
+Kræves kun når den automatisk måde ikke virker.
+Skal være en terminal som kendes af
+.B Vim
+(indbygget) eller defineret i termcap- eller terminfo-filen.
+.TP
+\-u {vimrc}
+Brug kommandoerne i {vimrc}-filen til initialiseringer.
+Alle de andre initialiseringer springes over.
+Brug den til at redigere en særlig slags filer.
+Den kan også bruges til at springe alle initialiseringer over,
+ved at give navnet "NONE". Se ":help initialization" i vim for flere detaljer.
+.TP
+\-U {gvimrc}
+Brug kommandoerne i {gvimrc}-filen til GUI-initialiseringer.
+Alle de andre GUI-initialiseringer springes over.
+Den kan også bruges til at springe alle GUI-initialiseringer over,
+ved at give navnet "NONE". Se ":help gui\-init" i vim for flere detaljer.
+.TP
+\-V[N]
+Uddybende. Giv meddelelser om hvilke filer som er sourced og til læsning og
+skrivning af en viminfo-fil. Det valgfrie nummer N er værdien af 'verbose'.
+Standard er 10.
+.TP
+\-v
+Start
+.B Vim
+i Vi-tilstand, ligesom eksekverbaren kaldet "vi". Det har kun virkning når
+eksekverbaren kaldes "ex".
+.TP
+\-w {scriptud}
+Alle tegnene som du skrev optages i filen {scriptud}, indtil du afslutter
+.B Vim\c
+\&.
+Det er nyttigt hvis du vil oprette en script-fil som skal bruges med
+"vim \-s" eller ":source!".
+Hvis {scriptud}-filen findes, så tilføjes tegnene til slutningen.
+.TP
+\-W {scriptud}
+Ligesom \-w, men en eksisterende fil overskrives.
+.TP
+\-x
+Brug kryptering når der skrives filer. Spørger efter en krypteringsnøgle.
+.TP
+\-X
+Opret ikke forbindelse til X-serveren. Afkorter opstartstiden i en terminal,
+men vinduets titel og udklipsholder bruges ikke.
+.TP
+\-y
+Start
+.B Vim
+i easy-tilstand, ligesom hvis "evim"- eller "eview"-eksekverbarene blev kaldt.
+Får
+.B Vim
+til at opføre sig som en klik og skriv-editor.
+.TP
+\-Z
+Restriktiv tilstand. Virker ligesom eksekverbaren som begynder med "r".
+.TP
+\-\-
+Betegner slutningen af tilvalgene.
+Argumenter efter dette håndteres som et filnavn.
+Det kan bruges til at redigere et filnavn som begynder med et '\-'.
+.TP
+\-\-echo\-wid
+Kun GTK GUI: Ekko vinduets id på stdout.
+.TP
+\-\-help
+Giv en hjælpemeddelelse og afslut, ligesom "\-h".
+.TP
+\-\-literal
+Tag filnavnets argumenter bogstaveligt, udvid ikke jokertegn.
+Det har ingen virkning i Unix hvor skallen udvidder jokertegn.
+.TP
+\-\-noplugin
+Spring indlæsning af plugins over. Indebæres af \-u NONE.
+.TP
+\-\-remote
+Opret forbindelse til en Vim-server og få den til at redigere filerne
+som gives i resten af argumenterne. Hvis der ikke findes nogen server,
+så gives der en advarsel og filerne redigeres i den nuværende Vim.
+.TP
+\-\-remote\-expr {udtryk}
+Opret forbindelse til en Vim-server, evaluer
+{udtryk} i den og udskriv resultatet på stdout.
+.TP
+\-\-remote\-send {nøgler}
+Opret forbindelse til en Vim-server and send {nøgler} til den.
+.TP
+\-\-remote\-silent
+Som \-\-remote, men uden advarslen når der ikke findes nogen server.
+.TP
+\-\-remote\-wait
+Som \-\-remote, men Vim afslutter ikke før filerne er blevet redigeret.
+.TP
+\-\-remote\-wait\-silent
+Som \-\-remote\-wait, men uden advarslen når der ikke findes nogen server.
+.TP
+\-\-serverlist
+Oplist navnene på alle Vim-servere som der kan findes.
+.TP
+\-\-servername {navn}
+Brug servernavnet {navn}. Bruges til den nuværende Vim,
+medmindre det bruges med et \-\-remote-argument,
+så er det navnet på serveren som der skal oprettes forbindelse til.
+.TP
+\-\-socketid {id}
+Kun GTK GUI: Brug GtkPlug-mekanismen til at køre gvim i et andet vindue.
+.TP
+\-\-version
+Udskriv versionsinformation og afslut.
+.SH ONLINEHJÆLP
+Skriv ":help" i
+.B Vim
+for at begynde.
+Skriv ":help emne" for at få hjælp til et bestemt emne.
+F.eks.: ":help ZZ" for at få hjælpe til "ZZ"-kommandoen.
+Brug <Tab> og CTRL-D for at fuldføre emner (":help cmdline\-completion").
+Tags findes til at hoppe fra et sted til et andet (en slags hypertekst-links,
+se ":help").
+Alle dokumentationsfiler kan vises på denne måde, f.eks.
+":help syntax.txt".
+.SH FILER
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+.B Vim\c
+-dokumentationsfilerne.
+Brug ":help doc\-file\-list" for at få den fulde liste.
+.TP
+/usr/local/lib/vim/doc/tags
+Tags-filen som bruges til at finde information i dokumentationsfilerne.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Systembrede syntaksinitialiseringer.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Syntaksfiler til diverse sprog.
+.TP
+/usr/local/lib/vim/vimrc
+Systembrede
+.B Vim\c
+-initialiseringer.
+.TP
+~/.vimrc
+Dine personlige
+.B Vim\c
+-initialiseringer.
+.TP
+/usr/local/lib/vim/gvimrc
+Systembrede gvim-initialiseringer.
+.TP
+~/.gvimrc
+Dine personlige gvim-initialiseringer.
+.TP
+/usr/local/lib/vim/optwin.vim
+Script som bruges til ":options"-kommandoen,
+en god måde til at vise og sætte valgmuligheder.
+.TP
+/usr/local/lib/vim/menu.vim
+Systembrede menu-initialiseringer til gvim.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Script til at generere en fejlrapport. Se ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Script til at registrere filtypen ud fra navnet. Se ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Script til at registrere filtypen ud fra indholdet. Se ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+Filer som bruges til PostScript-udskrivning.
+.PP
+Læs VIM-hjemmesiden for seneste info:
+.br
+<URL:http://www.vim.org/>
+.SH SE OGSÅ
+vimtutor(1)
+.SH FORFATTER
+Det meste af
+.B Vim
+blev lavet af Bram Moolenaar, med en masse hjælp fra andre.
+Se ":help credits" i
+.B Vim\c
+\&.
+.br
+.B Vim
+er baseret på Stevie, arbejdet på af: Tim Thompson,
+Tony Andrews og G.R. (Fred) Walter.
+Selvom der næsten ikke er noget af den originale kode tilbage.
+.SH FEJL
+Formodentligt.
+Se ":help todo" for en liste over kendte problemer.
+.PP
+Bemærk at flere ting som af nogle kan anses som værende fejl,
+faktisk er pga. en for nær reproduktion af Vi's opførsel.
+Og hvis du tænker at andre ting er fejl "fordi Vi gør det anderledes",
+så kig nærmere på vi_diff.txt-filen (eller skriv :help vi_diff.txt i Vim).
+Se også 'compatible'- og 'cpoptions'-valgmulighederne.
diff --git a/runtime/doc/vim-de.1 b/runtime/doc/vim-de.1
new file mode 100644
index 0000000..0ba4938
--- /dev/null
+++ b/runtime/doc/vim-de.1
@@ -0,0 +1,478 @@
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.\" Translated by bw1 (2008) and Florian Rehnisch <fm-r@gmx.de> (2012)
+.\" Kudos to the folks on vim-dev and debian-l10n-german
+.TH VIM 1 "2006 Apr 11"
+.SH BEZEICHNUNG
+vim \- Vi IMproved, ein Text\-Editor fr Programmierer
+.SH BERSICHT
+.br
+\fBvim\fP [Optionen] [Datei ...]
+.br
+\fBvim\fP [Optionen] \-
+.br
+\fBvim\fP [Optionen] \-t Tag
+.br
+\fBvim\fP [Optionen] \-q [Fehlerdatei]
+.PP
+.br
+\fBex\fP
+.br
+\fBview\fP
+.br
+\fBgvim\fP \fBgview\fP \fBevim\fP \fBeview\fP
+.br
+\fBrvim\fP \fBrview\fP \fBrgvim\fP \fBrgview\fP
+.SH BESCHREIBUNG
+\fBVim\fP ist ein Text\-Editor, der aufwrtskompatibel zu Vi ist. Er kann
+verwendet werden, um alle Arten von Klartext zu bearbeiten. Er ist besonders
+ntzlich, um Programme zu bearbeiten.
+.PP
+Vim hat einige Erweiterungen gegenber Vi, z.B.: Rckgngigmachen in
+mehreren Schritten, mehrere Fenster und Puffer, Syntax\-Hervorhebung,
+Bearbeiten der Befehlszeile, Dateinamenergnzung, eingebaute Hilfe, visuelle
+Auswahl, usw. ... Siehe :help vi_diff.txt fr eine bersicht der
+Unterschiede zwischen \fBVim\fP und Vi.
+.PP
+Im laufenden \fBVim\fP kann mit dem Befehl :help viel Hilfe durch das
+eingebaute Hilfesystem erlangt werden. Siehe den Abschnitt EINGEBAUTE HILFE
+weiter unten.
+.PP
+Meistens wird \fBVim\fP zum Editieren einer einzigen Datei mit dem folgende
+Befehl gestartet:
+.PP
+ vim Datei
+.PP
+Allgemeiner betrachtet, wird \fBVim\fP folgendermaen gestartet:
+.PP
+ vim [Optionen] [Dateiliste]
+.PP
+Bei einer fehlenden Dateiliste startet der Editor mit einem leeren
+Puffer. Andernfalls werden nach den folgenden vier Mglichkeiten eine oder
+mehrere Dateien bearbeitet:
+.TP 12
+Datei ...
+Eine Liste von Dateinamen. Die erste Datei wird in den Puffer geladen und
+zur aktuellen. Der Cursor wird auf der ersten Zeile des Puffers
+platziert. Zu den anderen Dateien kann mit dem Befehl :next gelangt
+werden. Falls einer der Dateinamen mit einem Bindestrich beginnt, stellen
+Sie der Dateiliste \-\- voran.
+.TP
+\-
+Die zu bearbeitende Datei wird von der Standardeingabe gelesen. Befehle
+werden von der Standardfehlerausgabe gelesen, die ein Text\-Terminal sein
+sollte.
+.TP
+\-t {Tag}
+Die zu editierende Datei und die anfngliche Cursor\-Position hngen von
+einem Tag ab, einer Art Sprungmarke. {Tag} wird in der Tag\-Datei
+nachgeschlagen, die zugehrige Datei wird zur aktuellen und der zugehrige
+Befehl wird ausgefhrt. Dies wird meistens fr Programme in der Sprache C
+benutzt, wobei {Tag} ein Funktionsname sein knnte. Die Wirkung dieses
+Befehls ist, dass die Datei, die die Funktion enthlt, als aktuelle im
+Editor geffnet und angezeigt wird und der Cursor auf dem Beginn der
+Funktion positioniert wird. Siehe :help tag\-commands.
+.TP
+\-q [Fehlerdatei]
+Startet im QuickFix\-Modus. Die Datei [Fehlerdatei] wird gelesen und der
+erste Fehler wird angezeigt. Falls [Fehlerdatei] ausgelassen wird, wird der
+Dateiname aus der Option 'errorfile' verwendet (bei AmigaOS ist dies
+vorgabemig AztecC.Err, sowie "errors.err bei anderen). Weitere Fehler
+knnen mit dem :cn\-Befehl angesprungen werden. Siehe ":help quickfix.
+.PP
+\fBVim\fP reagiert unterschiedlich auf den Namen, der verwendet wird, um Vim zu
+starten (die ausfhrbare Datei kann dieselbe sein).
+.TP 10
+vim
+der normale Weg, alles ist standardmig
+.TP
+ex
+Startet im Ex\-Modus. Mit dem Befehl :vi gelangt man in den normalen
+Modus. Funktioniert auch mit dem Argument \-e.
+.TP
+view
+Startet im Nur\-Lesen\-Modus. Die Datei wird vor dem berschreiben
+geschtzt. Dasselbe wird mit dem Parameter \-R erreicht.
+.TP
+gvim gview
+Die grafische Version: ffnet ein neues Fenster. Dasselbe wird mit dem
+Parameter \-g erreicht.
+.TP
+evim eview
+Die grafische Version im einfachen Modus: ffnet ein neues Fenster. Dasselbe
+wird mit dem Parameter \-y erreicht.
+.TP
+rvim rview rgvim rgview
+Wie die obigen, aber mit Beschrnkungen: Es ist nicht mglich, Shell\-Befehle
+aufzurufen oder mit Unterbrechung in eine Shell zurckzuspringen. Dasselbe
+wird mit dem Parameter \-Z erreicht.
+.SH OPTIONEN
+Die Optionen knnen in beliebiger Reihenfolge vor oder nach den Dateinamen
+angegeben werden. Optionen ohne Parameter knnen hinter einem einzigen
+Bindestrich gruppiert werden.
+.TP 12
++[Nummer]
+In der ersten Datei wird der Cursor auf die Zeile [Nummer] gesetzt. Falls
+[Nummer] nicht angegeben wird, wird der Cursor in die letzte Zeile der Datei
+gesetzt.
+.TP
++/{Suchmuster}
+In der ersten Datei wird der Cursor auf das erste Auftreten von {Suchmuster}
+gesetzt. Siehe :help search\-pattern.
+.TP
++{Befehl}
+.TP
+\-c {Befehl}
+{Befehl} wird nach dem Lesen der ersten Datei ausgefhrt. Als {Befehl} wird
+ein Ex\-Befehl erwartet. Sind in {Befehl} Leerzeichen vorhanden, muss alles
+in Anfhrungszeichen gesetzt werden (hngt von der verwendeten Shell
+ab). Beispiel: vim "+set si" main.c
+.br
+Anmerkung: Sie knnen bis zu 10 +\- oder "\-c\-Befehle verwenden.
+.TP
+\-S {Datei}
+{Datei} wird nach dem Lesen der ersten Datei ausgefhrt. Dies entspricht \-c
+"source {Datei}". {Datei} darf nicht mit einem Bindestrich (\-)
+anfangen. Wenn kein Dateiname angegeben wird, wird Session.vim verwendet
+(Funktioniert nur, wenn \-S als letzter Parameter steht).
+.TP
+\-\-cmd {Befehl}
+Wie \-c, aber dieser Befehl wird vor allen VimRC\-Dateien ausgefhrt. Sie
+knnen unabhngig von den \-c\-Befehlen bis zu 10 dieser Befehle verwenden.
+.TP
+\-A
+Falls \fBVim\fP mit Untersttzung fr das Schreiben von rechts nach links und
+arabischer Tastaturbelegung compiliert wurde (ARABIC), startet dieser
+Parameter den Modus frs Arabische (:set arabic). Anderenfalls beendet sich
+\fBVim\fP mit einer Fehlermeldung.
+.TP
+b
+Binrer Modus: Es werden einige Variablen gesetzt, sodass es mglich ist,
+eine binre oder ausfhrbare Datei zu bearbeiten.
+.TP
+\-C
+Kompatibel: Setzt die Option 'compatible'. Das macht \fBVim\fP im Verhalten
+sehr hnlich zu Vi, selbst wenn eine VimRC\-Datei existiert.
+.TP
+\-d
+Startet im diff\-Modus. Es sollten zwei, drei oder vier Dateinamen als
+Parameter bergeben werden. \fBVim\fP ffnet sie alle und zeigt die
+Unterschiede an. Arbeitet wie vimdiff(1).
+.TP
+\-d {Gert}
+ffnet das {Gert}, um es als Terminal zu nutzen. Nur fr AmigaOS. Beispiel:
+"\-d con:20/30/600/150".
+.TP
+D
+Debug\-Modus: \fBVim\fP geht in den Debug\-Modus, wenn der erste Befehl in einem
+Skript ausgefhrt wird.
+.TP
+\-e
+Startet \fBVim\fP im Ex\-Modus, als wrde als ausfhrbare Datei ex aufgerufen.
+.TP
+\-E
+Startet \fBVim\fP im erweiterten Ex\-Modus, als wrde die ausfhrbare Datei als
+exim aufgerufen.
+.TP
+\-f
+Vordergrund: Bei der GUI\-Version erzeugt \fBVim\fP keinen neuen Prozess und
+lst sich nicht von der Shell, in der er aufgerufen wurde. Bei AmigaOS wird
+kein neues Fenster geffnet. Dieser Parameter wird benutzt, damit das
+aufrufende Programm auf das Beenden des Bearbeitungssitzung wartet (z.B.:
+mail). Bei AmigaOS funktionieren die Befehle :sh und ":! nicht.
+.TP
+\-\-nofork
+Vordergrund: Bei der GUI\-Version erzeugt \fBVim\fP keinen neuen Prozess und
+lst sich nicht von der Shell, in der er aufgerufen wurde.
+.TP
+\-F
+Wenn \fBVim\fP mit FKMAP\-Untersttzung fr das Schreiben von rechts nach links
+und Farsi\-Tastatur\-Belegung kompiliert wurde, startet Vim im Farsi\-Modus,
+d.h. die Optionen 'fkmap' und 'rightleft' werden gesetzt. Andernfalls bricht
+\fBVim\fP mit einer Fehlermeldung ab.
+.TP
+\-g
+Falls \fBVim\fP mit GUI\-Untersttzung kompiliert wurde, wird die GUI
+aktiviert. Falls keine GUI\-Untersttzung einkompiliert wurde, wird mit einer
+Fehlermeldung abgebrochen.
+.TP
+\-h
+Gibt eine kleine Hilfe fr die Befehlszeilenparameter aus. Danach beendet
+sich \fBVim.\fP
+.TP
+\-H
+Hebrisch\-Modus, falls \fBVim\fP mit RIGHTLEFT\-Untersttzung fr das Schreiben
+von rechts nach links und hebrischer Tastaturbelegung kompiliert wurde,
+werden die Optionen 'hkmap' und 'rightleft' gesetzt. Andernfalls beendet
+sich \fBVim\fP mit einer Fehlermeldung.
+.TP
+\-i {VimInfo}
+Wenn eine VimInfo\-Datei verwendet wird: Verwendet statt ~/.viminfo die
+angegebene Datei. Es ist auch mglich die Verwendung einer VimInfo\-Datei
+durch Angabe des Dateinamen NONE zu verhindern,
+.TP
+\-L
+dasselbe wie \-r
+.TP
+\-l
+Lisp\-Modus. Aktiviert die Optionen 'lisp' und 'showmatch'.
+.TP
+\-m
+Deaktiviert das Verndern von Dateien, indem die Option 'write' gelscht
+wird. Der Puffer kann verndert werden, nur das Schreiben einer Datei ist
+nicht mglich.
+.TP
+\-M
+Keine Vernderungen erlaubt: Die Optionen 'modifiable' und 'write' werden
+gelscht, so dass nderungen nicht erlaubt sind und Dateien nicht
+geschrieben werden knnen. Man beachte, dass diese Optionen ('modifiable',
+\&'write') dennnoch nachtrglich zum Erlauben von nderungen gesetzt werden
+knnen.
+.TP
+\-N
+Nicht\-kompatibler Modus: Lscht die Option 'compatible'. Dies veranlasst
+\fBVim\fP, sich ein wenig besser, aber weniger Vi\-kompatibel zu verhalten,
+selbst wenn es keine VimRC\-Datei gibt.
+.TP
+\-n
+Verwendet keine Auslagerungsdatei: Eine Wiederherstellung nach einem Absturz
+ist nicht mglich. Auf einem langsamen Medium (Diskette) kann diese
+Einstellung ntzlich sein. Kann auch mit set uc=0 erreicht werden; kann
+mit set uc=200 aufgehoben werden.
+.TP
+\-nb
+\fBVim\fP fungiert als Server fr NetBeans. Details siehe Dokumentation.
+.TP
+\-o[N]
+ffnet [N] Fenster bereinander. Wenn keine Zahl angegeben wird, ffne ein
+Fenster pro Datei.
+.TP
+\-O[N]
+ffnet [N] Fenster nebeneinander. Wenn keine Zahl angegeben wird, ffne ein
+Fenster pro Datei.
+.TP
+\-p[N]
+ffnet [N] Reiterseiten. Wenn keine Zahl angegeben wird, ffne eine
+Reiterseite pro Datei.
+.TP
+\-R
+Nur\-Lesen\-Modus: Die Option 'readonly' wird gesetzt. Der Puffer kann noch
+bearbeitet werden, aber es wird verhindert, eine Datei aus Versehen zu
+berschreiben. Wenn Sie wirklich eine Datei berschreiben wollen, fgen Sie
+dem Ex\-Befehl ein Ausrufezeichen hinzu (wie in :w!). Die Option "\-R
+bedingt die Option \-n (siehe oben). Die Option 'readonly' kann durch ":set
+noro gelscht werden. Siehe :help 'readonly'.
+.TP
+\-r
+Listet die Auslagerungsdateien und gibt Informationen zu ihrer
+Verwendbarkeit zur Wiederherstellung.
+.TP
+\-r {Datei}
+Wiederherstellungsmodus: Die Auslagerungsdatei wird zur Wiederherstellung
+verwendet und hat denselben Dateinamen wie die Text\-Datei + .swp. Siehe
+":help recovery.
+.TP
+\-s
+Der stille Modus: Nur wenn die ausfhrbare Datei als ex aufgerufen wird
+oder vor \-s die Option "\-e gegeben wird.
+.TP
+\-s {Eingabeskript}
+Die Datei {Eingabeskript} wird gelesen und ausgefhrt, als wrden Sie die
+Zeichen in ihr tippen. Dasselbe kann mit dem Befehl :source!
+{Eingabeskript} erreicht werden. Wird das Ende der Datei vor dem Beenden
+des Editors erreicht, werden weitere Zeichen von der Tastatur gelesen.
+.TP
+\-T {Terminal}
+Setzt den Namen des benutzten Terminals. Nur erforderlich, wenn die
+Automatik nicht funktioniert. Sollte ein \fBVim\fP bekanntes Terminal sein:
+(builtin) oder in einer termcap\- oder terminfo\-Datei definiert.
+.TP
+\-u {VimRC}
+Verwendet zur Initialisierung die Befehle in der Datei {VimRC}. Alle anderen
+Initialisierungen werden bersprungen. Benutzen Sie dies, um eine besondere
+Art von Dateien zu bearbeiten. Dies kann auch benutzt werden, um alle
+Initialisierungen zu berspringen, indem der Name NONE angegeben wird. Fr
+weitere Einzelheiten siehe :help initialisation innerhalb von Vim.
+.TP
+\-U {GvimRC}
+Benutzt die Befehle in der Datei {GvimRC} fr die Initialisierung der
+grafischen Oberflche. Alle anderen Initialisierungen werden
+bersprungen. Dies kann ebenfalls benutzt werden, um alle
+GUI\-Initialisierungen zu berspringen, indem der Name NONE angegeben
+wird. Siehe :help gui\-init innerhalb von Vim fr weitere Einzelheiten.
+.TP
+\-V[N]
+Ausfhrlich (verbose): Gibt Meldungen darber, welche Befehlsdateien
+eingelesen werden, und ber das Lesen und Schreiben einer VimInfo\-Datei. Die
+optionale Zahl N ist der Wert fr 'verbose'. Vorgabe ist 10.
+.TP
+\-v
+Startet \fBVim\fP im Vi\-Modus, so als wrde die ausfhrbare Datei mit vi
+aufgerufen. Dies wirkt sich nur aus, wenn die ausfhrbare Datei als ex
+aufgerufen wird.
+.TP
+\-w {Ausgabeskript}
+Alle Zeichen, die eingetippt werden, werden in der Datei {Ausgabeskript}
+aufgezeichnet, solange bis Sie \fBVim\fP beenden. Dies ist ntzlich, falls Sie
+eine Skript\-Datei zum Benutzen mit vim \-s oder ":source! erzeugen
+wollen. Falls die Datei {Ausgabeskript} vorhanden ist, werden die Zeichen
+angehngt.
+.TP
+\-W {Ausgabeskript}
+Wie \-w, aber eine bereits vorhandene Datei wird berschrieben.
+.TP
+\-x
+Benutzt beim Schreiben von Dateien eine Verschlsselung. Fragt nach dem
+Schlssel.
+.TP
+\-X
+Fhrt keine Verbindung zum X\-Server durch. Dadurch verkrzt sich die
+Startzeit, aber der Fenstertitel und die Zwischenablage werden nicht
+verwendet.
+.TP
+\-y
+Startet \fBVim\fP im einfachen Modus, als wrde die ausfhrbare Datei mit
+evim oder eview aufgerufen. \fBVim\fP verhlt sich dann wie ein Editor zum
+Klicken und Tippen.
+.TP
+\-Z
+Eingeschrnkter Modus: Funktioniert, als wrde der Name der ausfhrbaren
+Datei mit r beginnen.
+.TP
+\-\-
+Markiert das Ende der Optionen. Argumente, die folgen, werden als Dateinamen
+behandelt. Dies kann benutzt werden, um einen Dateinamen mit \- am Anfang
+zu verwenden.
+.TP
+\-\-echo\-wid
+Nur GTK\-GUI: Schreibe die Fenster\-ID auf die Standardausgabe.
+.TP
+\-\-help
+Gibt eine Hilfe\-Nachricht aus und beendet, wie \-h.
+.TP
+\-\-literal
+Nimmt die Dateinamen so wie sie sind und vervollstndigt sie nicht nach
+Metazeichen (*,?). Dies wirkt sich nicht unter Unix aus, wo die Shell die
+Metazeichen expandiert.
+.TP
+\-\-noplugin
+Lade keine Plugins. Impliziert durch \-u NONE.
+.TP
+\-\-remote
+Verbindet mit einem Vim\-Server und lsst ihn die in den restlichen
+Argumenten angegeben Dateien editieren. Wenn kein Server gefunden wird,
+fhrt dies zu einer Warnmeldung und die Dateien werden im gegenwrtigen Vim
+zum Bearbeiten geffnet.
+.TP
+\-\-remote\-expr {Ausdruck}
+Verbindet mit einem Vim\-Server, fhrt {Ausdruck} aus und zeigt das Ergebnis
+auf der Standardausgabe an.
+.TP
+\-\-remote\-send {Zeichen}
+Verbindet mit einem Vim\-Server und sendet ihm {Zeichen}.
+.TP
+\-\-remote\-silent
+Wie \-\-remote, aber ohne Warnung, wenn kein Server gefunden wird.
+.TP
+\-\-remote\-wait
+Wie \-\-remote, aber Vim beendet sich nicht, bis die Dateien bearbeitet
+wurden.
+.TP
+\-\-remote\-wait\-silent
+Wie \-\-remote\-wait, aber ohne Warnung, wenn kein Server gefunden wird.
+.TP
+\-\-serverlist
+Listet die Namen aller gefundenen Vim\-Server auf.
+.TP
+\-\-servername {Name}
+Benutzt {Name} als Server\-Namen. Wird fr den gegenwrtigen Vim benutzt,
+auer es wird mit dem Argument \-\-remote benutzt, dann ist es der Name des
+zu kontaktierenden Servers.
+.TP
+\-\-socketid {id}
+Nur GTK\-GUI: Benutzt den GtkPlug\-Mechanismus, um GVim in einem anderen
+Fenster laufen zu lassen.
+.TP
+\-\-version
+Versionsinformation anzeigen und beenden
+.SH "EINGEBAUTE HILFE"
+Tippen Sie in \fBVim\fP :help, um zu beginnen. Geben Sie ":help begriff ein,
+um Hilfe ber ein bestimmtes Thema zu bekommen. Zum Beispiel :help ZZ fr
+Hilfe ber den Befehl ZZ. Benutzen Sie <Tab> und CTRL\-D, um
+Begriffe zu vervollstndigen (:help cmdline\-completion). Tags sind
+vorhanden, um von einem Ort zum anderen zu springen (eine Art
+Hypertext\-Verknpfungen, siehe :help). Auf diese Weise knnen alle
+Dokumentations\-Dateien aufgerufen werden, zum Beispiel :help syntax.txt.
+.SH DATEIEN
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+Dokumentations\-Dateien fr \fBVim\fP. Verwenden Sie :help doc\-file\-list, um
+die gesamte Liste zu bekommen.
+.TP
+/usr/local/lib/vim/doc/tags
+Die Tag\-Datei, die verwendet wird, um Informationen in der Dokumentation
+zu finden.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Die systemweite Einrichtung der Syntaxhervorhebung.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Syntaxdateien fr die verschiedenen Sprachen.
+.TP
+/usr/local/lib/vim/vimrc
+Systemweite Einstellungsdatei fr \fBVim\fP
+.TP
+~/.vimrc
+Persnliche Einstellungsdatei fr \fBVim\fP
+.TP
+/usr/local/lib/vim/gvimrc
+Systemweite Einstellungsdatei fr GVim
+.TP
+~/.gvimrc
+Persnliche Einstellungsdatei fr GVim
+.TP
+/usr/local/lib/vim/optwin.vim
+Das Script, das von dem Befehl :options verwendet wird, eine schne
+Mglichkeit, um Optionen zu betrachten und zu setzen.
+.TP
+/usr/local/lib/vim/menu.vim
+Systemweite Einstellungsdatei fr das Men von GVim
+.TP
+/usr/local/lib/vim/bugreport.vim
+Das Script zum Generieren eines Fehlerberichts. Siehe :help bugs.
+.TP
+/usr/local/lib/vim/filetype.vim
+Mit diesem Script erkennt Vim den Typ einer Datei anhand ihres
+Dateinamens. Siehe :help 'filetype'.
+.TP
+/usr/local/lib/vim/scripts.vim
+Mit diesem Script erkennt Vim den Typ einer Datei anhand ihres
+Inhaltes. Siehe :help 'filetype'.
+.TP
+/usr/local/lib/vim/print/*.ps
+Diese Dateien werden zum Drucken von PostScript verwendet.
+.PP
+Fr die neuesten Informationen lesen Sie die Vim\-Homepage:
+.br
+<URL:http://www.vim.org/>
+.SH "SIEHE AUCH"
+vimtutor(1)
+.SH AUTOR
+\fBVim\fP wurde grtenteils von Bram Moolenaar erstellt, mit viel Hilfe von
+anderen Leuten. Siehe :help credits in \fBVim.\fP
+.br
+\fBVim\fP basiert auf Stevie, der von Tim Thompson, Tony Andrews und
+G.R. (Fred) Walter geschrieben wurde. Es ist jedoch kaum etwas vom
+ursprnglichen Code brig geblieben.
+.SH FEHLER
+Die sind mglich. Siehe :help todo fr eine Liste bekannter Probleme.
+.PP
+Beachten Sie, dass gewisse Dinge, die manche Leute als Fehler betrachten
+mgen, in Wirklichkeit durch zu getreue Nachbildung des Vi\-Verhaltens
+verursacht werden. Und falls Sie denken, dass andere Dinge Fehler sind,
+weil Vi es anders tut, sollten Sie einen genaueren Blick auf die Datei
+vi_diff.txt werfen (oder in Vim :help vi_diff.txt tippen). Sehen Sie sich
+auch die Optionen 'compatible' und 'cpoptions' an.
diff --git a/runtime/doc/vim-de.UTF-8.1 b/runtime/doc/vim-de.UTF-8.1
new file mode 100644
index 0000000..f79e622
--- /dev/null
+++ b/runtime/doc/vim-de.UTF-8.1
@@ -0,0 +1,478 @@
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.\" Translated by bw1 (2008) and Florian Rehnisch <fm-r@gmx.de> (2012)
+.\" Kudos to the folks on vim-dev and debian-l10n-german
+.TH VIM 1 "2006 Apr 11"
+.SH BEZEICHNUNG
+vim \- Vi IMproved, ein Text\-Editor für Programmierer
+.SH ÜBERSICHT
+.br
+\fBvim\fP [Optionen] [Datei …]
+.br
+\fBvim\fP [Optionen] \-
+.br
+\fBvim\fP [Optionen] \-t Tag
+.br
+\fBvim\fP [Optionen] \-q [Fehlerdatei]
+.PP
+.br
+\fBex\fP
+.br
+\fBview\fP
+.br
+\fBgvim\fP \fBgview\fP \fBevim\fP \fBeview\fP
+.br
+\fBrvim\fP \fBrview\fP \fBrgvim\fP \fBrgview\fP
+.SH BESCHREIBUNG
+\fBVim\fP ist ein Text\-Editor, der aufwärtskompatibel zu Vi ist. Er kann
+verwendet werden, um alle Arten von Klartext zu bearbeiten. Er ist besonders
+nützlich, um Programme zu bearbeiten.
+.PP
+Vim hat einige Erweiterungen gegenüber Vi, z.B.: Rückgängigmachen in
+mehreren Schritten, mehrere Fenster und Puffer, Syntax\-Hervorhebung,
+Bearbeiten der Befehlszeile, Dateinamenergänzung, eingebaute Hilfe, visuelle
+Auswahl, usw. … Siehe »:help vi_diff.txt« für eine Übersicht der
+Unterschiede zwischen \fBVim\fP und Vi.
+.PP
+Im laufenden \fBVim\fP kann mit dem Befehl »:help« viel Hilfe durch das
+eingebaute Hilfesystem erlangt werden. Siehe den Abschnitt EINGEBAUTE HILFE
+weiter unten.
+.PP
+Meistens wird \fBVim\fP zum Editieren einer einzigen Datei mit dem folgende
+Befehl gestartet:
+.PP
+ vim Datei
+.PP
+Allgemeiner betrachtet, wird \fBVim\fP folgendermaßen gestartet:
+.PP
+ vim [Optionen] [Dateiliste]
+.PP
+Bei einer fehlenden Dateiliste startet der Editor mit einem leeren
+Puffer. Andernfalls werden nach den folgenden vier Möglichkeiten eine oder
+mehrere Dateien bearbeitet:
+.TP 12
+Datei …
+Eine Liste von Dateinamen. Die erste Datei wird in den Puffer geladen und
+zur aktuellen. Der Cursor wird auf der ersten Zeile des Puffers
+platziert. Zu den anderen Dateien kann mit dem Befehl »:next« gelangt
+werden. Falls einer der Dateinamen mit einem Bindestrich beginnt, stellen
+Sie der Dateiliste »\-\-« voran.
+.TP
+\-
+Die zu bearbeitende Datei wird von der Standardeingabe gelesen. Befehle
+werden von der Standardfehlerausgabe gelesen, die ein Text\-Terminal sein
+sollte.
+.TP
+\-t {Tag}
+Die zu editierende Datei und die anfängliche Cursor\-Position hängen von
+einem »Tag« ab, einer Art Sprungmarke. {Tag} wird in der Tag\-Datei
+nachgeschlagen, die zugehörige Datei wird zur aktuellen und der zugehörige
+Befehl wird ausgeführt. Dies wird meistens für Programme in der Sprache »C«
+benutzt, wobei {Tag} ein Funktionsname sein könnte. Die Wirkung dieses
+Befehls ist, dass die Datei, die die Funktion enthält, als aktuelle im
+Editor geöffnet und angezeigt wird und der Cursor auf dem Beginn der
+Funktion positioniert wird. Siehe »:help tag\-commands«.
+.TP
+\-q [Fehlerdatei]
+Startet im QuickFix\-Modus. Die Datei [Fehlerdatei] wird gelesen und der
+erste Fehler wird angezeigt. Falls [Fehlerdatei] ausgelassen wird, wird der
+Dateiname aus der Option 'errorfile' verwendet (bei AmigaOS ist dies
+vorgabemäßig »AztecC.Err«, sowie „errors.err« bei anderen). Weitere Fehler
+können mit dem »:cn«\-Befehl angesprungen werden. Siehe „:help quickfix«.
+.PP
+\fBVim\fP reagiert unterschiedlich auf den Namen, der verwendet wird, um Vim zu
+starten (die ausführbare Datei kann dieselbe sein).
+.TP 10
+vim
+der »normale« Weg, alles ist standardmäßig
+.TP
+ex
+Startet im Ex\-Modus. Mit dem Befehl »:vi« gelangt man in den normalen
+Modus. Funktioniert auch mit dem Argument »\-e«.
+.TP
+view
+Startet im Nur\-Lesen\-Modus. Die Datei wird vor dem Überschreiben
+geschützt. Dasselbe wird mit dem Parameter »\-R« erreicht.
+.TP
+gvim gview
+Die grafische Version: Öffnet ein neues Fenster. Dasselbe wird mit dem
+Parameter »\-g« erreicht.
+.TP
+evim eview
+Die grafische Version im einfachen Modus: Öffnet ein neues Fenster. Dasselbe
+wird mit dem Parameter »\-y« erreicht.
+.TP
+rvim rview rgvim rgview
+Wie die obigen, aber mit Beschränkungen: Es ist nicht möglich, Shell\-Befehle
+aufzurufen oder mit Unterbrechung in eine Shell zurückzuspringen. Dasselbe
+wird mit dem Parameter »\-Z« erreicht.
+.SH OPTIONEN
+Die Optionen können in beliebiger Reihenfolge vor oder nach den Dateinamen
+angegeben werden. Optionen ohne Parameter können hinter einem einzigen
+Bindestrich gruppiert werden.
+.TP 12
++[Nummer]
+In der ersten Datei wird der Cursor auf die Zeile [Nummer] gesetzt. Falls
+[Nummer] nicht angegeben wird, wird der Cursor in die letzte Zeile der Datei
+gesetzt.
+.TP
++/{Suchmuster}
+In der ersten Datei wird der Cursor auf das erste Auftreten von {Suchmuster}
+gesetzt. Siehe »:help search\-pattern«.
+.TP
++{Befehl}
+.TP
+\-c {Befehl}
+{Befehl} wird nach dem Lesen der ersten Datei ausgeführt. Als {Befehl} wird
+ein Ex\-Befehl erwartet. Sind in {Befehl} Leerzeichen vorhanden, muss alles
+in Anführungszeichen gesetzt werden (hängt von der verwendeten Shell
+ab). Beispiel: vim "+set si" main.c
+.br
+Anmerkung: Sie können bis zu 10 »+«\- oder „\-c«\-Befehle verwenden.
+.TP
+\-S {Datei}
+{Datei} wird nach dem Lesen der ersten Datei ausgeführt. Dies entspricht »\-c
+"source {Datei}"«. {Datei} darf nicht mit einem Bindestrich (\-)
+anfangen. Wenn kein Dateiname angegeben wird, wird »Session.vim« verwendet
+(Funktioniert nur, wenn »\-S« als letzter Parameter steht).
+.TP
+\-\-cmd {Befehl}
+Wie »\-c«, aber dieser Befehl wird vor allen VimRC\-Dateien ausgeführt. Sie
+können unabhängig von den »\-c«\-Befehlen bis zu 10 dieser Befehle verwenden.
+.TP
+\-A
+Falls \fBVim\fP mit Unterstützung für das Schreiben von rechts nach links und
+arabischer Tastaturbelegung compiliert wurde (ARABIC), startet dieser
+Parameter den Modus fürs Arabische (:set arabic). Anderenfalls beendet sich
+\fBVim\fP mit einer Fehlermeldung.
+.TP
+b
+Binärer Modus: Es werden einige Variablen gesetzt, sodass es möglich ist,
+eine binäre oder ausführbare Datei zu bearbeiten.
+.TP
+\-C
+Kompatibel: Setzt die Option 'compatible'. Das macht \fBVim\fP im Verhalten
+sehr ähnlich zu Vi, selbst wenn eine VimRC\-Datei existiert.
+.TP
+\-d
+Startet im diff\-Modus. Es sollten zwei, drei oder vier Dateinamen als
+Parameter übergeben werden. \fBVim\fP öffnet sie alle und zeigt die
+Unterschiede an. Arbeitet wie vimdiff(1).
+.TP
+\-d {Gerät}
+Öffnet das {Gerät}, um es als Terminal zu nutzen. Nur für AmigaOS. Beispiel:
+"\-d con:20/30/600/150".
+.TP
+D
+Debug\-Modus: \fBVim\fP geht in den Debug\-Modus, wenn der erste Befehl in einem
+Skript ausgeführt wird.
+.TP
+\-e
+Startet \fBVim\fP im Ex\-Modus, als würde als ausführbare Datei »ex« aufgerufen.
+.TP
+\-E
+Startet \fBVim\fP im erweiterten Ex\-Modus, als würde die ausführbare Datei als
+»exim« aufgerufen.
+.TP
+\-f
+Vordergrund: Bei der GUI\-Version erzeugt \fBVim\fP keinen neuen Prozess und
+löst sich nicht von der Shell, in der er aufgerufen wurde. Bei AmigaOS wird
+kein neues Fenster geöffnet. Dieser Parameter wird benutzt, damit das
+aufrufende Programm auf das Beenden des Bearbeitungssitzung wartet (z.B.:
+mail). Bei AmigaOS funktionieren die Befehle »:sh« und „:!« nicht.
+.TP
+\-\-nofork
+Vordergrund: Bei der GUI\-Version erzeugt \fBVim\fP keinen neuen Prozess und
+löst sich nicht von der Shell, in der er aufgerufen wurde.
+.TP
+\-F
+Wenn \fBVim\fP mit FKMAP\-Unterstützung für das Schreiben von rechts nach links
+und Farsi\-Tastatur\-Belegung kompiliert wurde, startet Vim im Farsi\-Modus,
+d.h. die Optionen 'fkmap' und 'rightleft' werden gesetzt. Andernfalls bricht
+\fBVim\fP mit einer Fehlermeldung ab.
+.TP
+\-g
+Falls \fBVim\fP mit GUI\-Unterstützung kompiliert wurde, wird die GUI
+aktiviert. Falls keine GUI\-Unterstützung einkompiliert wurde, wird mit einer
+Fehlermeldung abgebrochen.
+.TP
+\-h
+Gibt eine kleine Hilfe für die Befehlszeilenparameter aus. Danach beendet
+sich \fBVim.\fP
+.TP
+\-H
+Hebräisch\-Modus, falls \fBVim\fP mit RIGHTLEFT\-Unterstützung für das Schreiben
+von rechts nach links und hebräischer Tastaturbelegung kompiliert wurde,
+werden die Optionen 'hkmap' und 'rightleft' gesetzt. Andernfalls beendet
+sich \fBVim\fP mit einer Fehlermeldung.
+.TP
+\-i {VimInfo}
+Wenn eine VimInfo\-Datei verwendet wird: Verwendet statt »~/.viminfo« die
+angegebene Datei. Es ist auch möglich die Verwendung einer VimInfo\-Datei
+durch Angabe des Dateinamen »NONE« zu verhindern,
+.TP
+\-L
+dasselbe wie »\-r«
+.TP
+\-l
+Lisp\-Modus. Aktiviert die Optionen 'lisp' und 'showmatch'.
+.TP
+\-m
+Deaktiviert das Verändern von Dateien, indem die Option 'write' gelöscht
+wird. Der Puffer kann verändert werden, nur das Schreiben einer Datei ist
+nicht möglich.
+.TP
+\-M
+Keine Veränderungen erlaubt: Die Optionen 'modifiable' und 'write' werden
+gelöscht, so dass Änderungen nicht erlaubt sind und Dateien nicht
+geschrieben werden können. Man beachte, dass diese Optionen ('modifiable',
+\&'write') dennnoch nachträglich zum Erlauben von Änderungen gesetzt werden
+können.
+.TP
+\-N
+Nicht\-kompatibler Modus: Löscht die Option 'compatible'. Dies veranlasst
+\fBVim\fP, sich ein wenig besser, aber weniger Vi\-kompatibel zu verhalten,
+selbst wenn es keine VimRC\-Datei gibt.
+.TP
+\-n
+Verwendet keine Auslagerungsdatei: Eine Wiederherstellung nach einem Absturz
+ist nicht möglich. Auf einem langsamen Medium (Diskette) kann diese
+Einstellung nützlich sein. Kann auch mit »set uc=0« erreicht werden; kann
+mit »set uc=200« aufgehoben werden.
+.TP
+\-nb
+\fBVim\fP fungiert als Server für NetBeans. Details siehe Dokumentation.
+.TP
+\-o[N]
+Öffnet [N] Fenster übereinander. Wenn keine Zahl angegeben wird, öffne ein
+Fenster pro Datei.
+.TP
+\-O[N]
+Öffnet [N] Fenster nebeneinander. Wenn keine Zahl angegeben wird, öffne ein
+Fenster pro Datei.
+.TP
+\-p[N]
+Öffnet [N] Reiterseiten. Wenn keine Zahl angegeben wird, öffne eine
+Reiterseite pro Datei.
+.TP
+\-R
+Nur\-Lesen\-Modus: Die Option 'readonly' wird gesetzt. Der Puffer kann noch
+bearbeitet werden, aber es wird verhindert, eine Datei aus Versehen zu
+überschreiben. Wenn Sie wirklich eine Datei überschreiben wollen, fügen Sie
+dem Ex\-Befehl ein Ausrufezeichen hinzu (wie in »:w!«). Die Option „\-R«
+bedingt die Option »\-n« (siehe oben). Die Option 'readonly' kann durch „:set
+noro« gelöscht werden. Siehe »:help 'readonly'«.
+.TP
+\-r
+Listet die Auslagerungsdateien und gibt Informationen zu ihrer
+Verwendbarkeit zur Wiederherstellung.
+.TP
+\-r {Datei}
+Wiederherstellungsmodus: Die Auslagerungsdatei wird zur Wiederherstellung
+verwendet und hat denselben Dateinamen wie die Text\-Datei + ».swp«. Siehe
+„:help recovery«.
+.TP
+\-s
+Der stille Modus: Nur wenn die ausführbare Datei als »ex« aufgerufen wird
+oder vor »\-s« die Option „\-e« gegeben wird.
+.TP
+\-s {Eingabeskript}
+Die Datei {Eingabeskript} wird gelesen und ausgeführt, als würden Sie die
+Zeichen in ihr tippen. Dasselbe kann mit dem Befehl »:source!
+{Eingabeskript}« erreicht werden. Wird das Ende der Datei vor dem Beenden
+des Editors erreicht, werden weitere Zeichen von der Tastatur gelesen.
+.TP
+\-T {Terminal}
+Setzt den Namen des benutzten Terminals. Nur erforderlich, wenn die
+Automatik nicht funktioniert. Sollte ein \fBVim\fP bekanntes Terminal sein:
+(builtin) oder in einer termcap\- oder terminfo\-Datei definiert.
+.TP
+\-u {VimRC}
+Verwendet zur Initialisierung die Befehle in der Datei {VimRC}. Alle anderen
+Initialisierungen werden übersprungen. Benutzen Sie dies, um eine besondere
+Art von Dateien zu bearbeiten. Dies kann auch benutzt werden, um alle
+Initialisierungen zu überspringen, indem der Name »NONE« angegeben wird. Für
+weitere Einzelheiten siehe »:help initialisation« innerhalb von Vim.
+.TP
+\-U {GvimRC}
+Benutzt die Befehle in der Datei {GvimRC} für die Initialisierung der
+grafischen Oberfläche. Alle anderen Initialisierungen werden
+übersprungen. Dies kann ebenfalls benutzt werden, um alle
+GUI\-Initialisierungen zu überspringen, indem der Name »NONE« angegeben
+wird. Siehe »:help gui\-init« innerhalb von Vim für weitere Einzelheiten.
+.TP
+\-V[N]
+Ausführlich (verbose): Gibt Meldungen darüber, welche Befehlsdateien
+eingelesen werden, und über das Lesen und Schreiben einer VimInfo\-Datei. Die
+optionale Zahl N ist der Wert für 'verbose'. Vorgabe ist 10.
+.TP
+\-v
+Startet \fBVim\fP im Vi\-Modus, so als würde die ausführbare Datei mit »vi«
+aufgerufen. Dies wirkt sich nur aus, wenn die ausführbare Datei als »ex«
+aufgerufen wird.
+.TP
+\-w {Ausgabeskript}
+Alle Zeichen, die eingetippt werden, werden in der Datei {Ausgabeskript}
+aufgezeichnet, solange bis Sie \fBVim\fP beenden. Dies ist nützlich, falls Sie
+eine Skript\-Datei zum Benutzen mit »vim \-s« oder „:source!« erzeugen
+wollen. Falls die Datei {Ausgabeskript} vorhanden ist, werden die Zeichen
+angehängt.
+.TP
+\-W {Ausgabeskript}
+Wie \-w, aber eine bereits vorhandene Datei wird überschrieben.
+.TP
+\-x
+Benutzt beim Schreiben von Dateien eine Verschlüsselung. Fragt nach dem
+Schlüssel.
+.TP
+\-X
+Führt keine Verbindung zum X\-Server durch. Dadurch verkürzt sich die
+Startzeit, aber der Fenstertitel und die Zwischenablage werden nicht
+verwendet.
+.TP
+\-y
+Startet \fBVim\fP im einfachen Modus, als würde die ausführbare Datei mit
+»evim« oder »eview« aufgerufen. \fBVim\fP verhält sich dann wie ein Editor zum
+Klicken und Tippen.
+.TP
+\-Z
+Eingeschränkter Modus: Funktioniert, als würde der Name der ausführbaren
+Datei mit »r« beginnen.
+.TP
+\-\-
+Markiert das Ende der Optionen. Argumente, die folgen, werden als Dateinamen
+behandelt. Dies kann benutzt werden, um einen Dateinamen mit »\-« am Anfang
+zu verwenden.
+.TP
+\-\-echo\-wid
+Nur GTK\-GUI: Schreibe die Fenster\-ID auf die Standardausgabe.
+.TP
+\-\-help
+Gibt eine Hilfe\-Nachricht aus und beendet, wie »\-h«.
+.TP
+\-\-literal
+Nimmt die Dateinamen so wie sie sind und vervollständigt sie nicht nach
+Metazeichen (*,?). Dies wirkt sich nicht unter Unix aus, wo die Shell die
+Metazeichen expandiert.
+.TP
+\-\-noplugin
+Lade keine Plugins. Impliziert durch »\-u NONE«.
+.TP
+\-\-remote
+Verbindet mit einem Vim\-Server und lässt ihn die in den restlichen
+Argumenten angegeben Dateien editieren. Wenn kein Server gefunden wird,
+führt dies zu einer Warnmeldung und die Dateien werden im gegenwärtigen Vim
+zum Bearbeiten geöffnet.
+.TP
+\-\-remote\-expr {Ausdruck}
+Verbindet mit einem Vim\-Server, führt {Ausdruck} aus und zeigt das Ergebnis
+auf der Standardausgabe an.
+.TP
+\-\-remote\-send {Zeichen}
+Verbindet mit einem Vim\-Server und sendet ihm {Zeichen}.
+.TP
+\-\-remote\-silent
+Wie »\-\-remote«, aber ohne Warnung, wenn kein Server gefunden wird.
+.TP
+\-\-remote\-wait
+Wie »\-\-remote«, aber Vim beendet sich nicht, bis die Dateien bearbeitet
+wurden.
+.TP
+\-\-remote\-wait\-silent
+Wie »\-\-remote\-wait«, aber ohne Warnung, wenn kein Server gefunden wird.
+.TP
+\-\-serverlist
+Listet die Namen aller gefundenen Vim\-Server auf.
+.TP
+\-\-servername {Name}
+Benutzt {Name} als Server\-Namen. Wird für den gegenwärtigen Vim benutzt,
+außer es wird mit dem Argument »\-\-remote« benutzt, dann ist es der Name des
+zu kontaktierenden Servers.
+.TP
+\-\-socketid {id}
+Nur GTK\-GUI: Benutzt den GtkPlug\-Mechanismus, um GVim in einem anderen
+Fenster laufen zu lassen.
+.TP
+\-\-version
+Versionsinformation anzeigen und beenden
+.SH "EINGEBAUTE HILFE"
+Tippen Sie in \fBVim\fP »:help«, um zu beginnen. Geben Sie „:help begriff« ein,
+um Hilfe über ein bestimmtes Thema zu bekommen. Zum Beispiel »:help ZZ« für
+Hilfe über den Befehl »ZZ«. Benutzen Sie <Tab> und CTRL\-D, um
+Begriffe zu vervollständigen (»:help cmdline\-completion«). Tags sind
+vorhanden, um von einem Ort zum anderen zu springen (eine Art
+Hypertext\-Verknüpfungen, siehe »:help«). Auf diese Weise können alle
+Dokumentations\-Dateien aufgerufen werden, zum Beispiel »:help syntax.txt«.
+.SH DATEIEN
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+Dokumentations\-Dateien für \fBVim\fP. Verwenden Sie »:help doc\-file\-list«, um
+die gesamte Liste zu bekommen.
+.TP
+/usr/local/lib/vim/doc/tags
+Die »Tag«\-Datei, die verwendet wird, um Informationen in der Dokumentation
+zu finden.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Die systemweite Einrichtung der Syntaxhervorhebung.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Syntaxdateien für die verschiedenen Sprachen.
+.TP
+/usr/local/lib/vim/vimrc
+Systemweite Einstellungsdatei für \fBVim\fP
+.TP
+~/.vimrc
+Persönliche Einstellungsdatei für \fBVim\fP
+.TP
+/usr/local/lib/vim/gvimrc
+Systemweite Einstellungsdatei für GVim
+.TP
+~/.gvimrc
+Persönliche Einstellungsdatei für GVim
+.TP
+/usr/local/lib/vim/optwin.vim
+Das Script, das von dem Befehl »:options« verwendet wird, eine schöne
+Möglichkeit, um Optionen zu betrachten und zu setzen.
+.TP
+/usr/local/lib/vim/menu.vim
+Systemweite Einstellungsdatei für das Menü von GVim
+.TP
+/usr/local/lib/vim/bugreport.vim
+Das Script zum Generieren eines Fehlerberichts. Siehe »:help bugs«.
+.TP
+/usr/local/lib/vim/filetype.vim
+Mit diesem Script erkennt Vim den Typ einer Datei anhand ihres
+Dateinamens. Siehe »:help 'filetype'«.
+.TP
+/usr/local/lib/vim/scripts.vim
+Mit diesem Script erkennt Vim den Typ einer Datei anhand ihres
+Inhaltes. Siehe »:help 'filetype'«.
+.TP
+/usr/local/lib/vim/print/*.ps
+Diese Dateien werden zum Drucken von PostScript verwendet.
+.PP
+Für die neuesten Informationen lesen Sie die Vim\-Homepage:
+.br
+<URL:http://www.vim.org/>
+.SH "SIEHE AUCH"
+vimtutor(1)
+.SH AUTOR
+\fBVim\fP wurde größtenteils von Bram Moolenaar erstellt, mit viel Hilfe von
+anderen Leuten. Siehe »:help credits« in \fBVim.\fP
+.br
+\fBVim\fP basiert auf Stevie, der von Tim Thompson, Tony Andrews und
+G.R. (Fred) Walter geschrieben wurde. Es ist jedoch kaum etwas vom
+ursprünglichen Code übrig geblieben.
+.SH FEHLER
+Die sind möglich. Siehe »:help todo« für eine Liste bekannter Probleme.
+.PP
+Beachten Sie, dass gewisse Dinge, die manche Leute als Fehler betrachten
+mögen, in Wirklichkeit durch zu getreue Nachbildung des Vi\-Verhaltens
+verursacht werden. Und falls Sie denken, dass andere Dinge Fehler sind,
+»weil Vi es anders tut«, sollten Sie einen genaueren Blick auf die Datei
+vi_diff.txt werfen (oder in Vim »:help vi_diff.txt« tippen). Sehen Sie sich
+auch die Optionen 'compatible' und 'cpoptions' an.
diff --git a/runtime/doc/vim-fr.1 b/runtime/doc/vim-fr.1
new file mode 100644
index 0000000..ede25ff
--- /dev/null
+++ b/runtime/doc/vim-fr.1
@@ -0,0 +1,589 @@
+.\" Traduction lundi 7 aot 2000 par Richard Hitier
+.\" (richard.hitier@dial.oleane.com)
+.\" Mise jour de la traduction par David Blanchet
+.\" (david.blanchet@free.fr) 2006-06-10
+.\" Mise jour de la traduction par Dominique Pell
+.\" (dominique.pelle@gmail.com) 2013-05-10
+.\"
+.TH VIM 1 "22 fvrier 2002"
+.SH NOM
+vim \- Vi IMproved, diteur de texte pour programmeurs
+.SH SYNOPSIS
+.br
+.B vim
+[options] [fichier ...]
+.br
+.B vim
+[options] \-
+.br
+.B vim
+[options] \-t marqueur
+.br
+.B vim
+[options] \-q [fichiererreurs]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH DESCRIPTION
+.B Vim
+est un diteur de texte proposant une compatibilit ascendante
+avec Vi. Il permet d'diter n'importe quel type de texte brut.
+Il est particulirement adapt pour l'dition des programmes.
+.PP
+Il comporte de nombreuses amliorations par rapport Vi : annulation sur
+plusieurs niveaux, fentres et tampons multiples, coloration syntaxique,
+dition en ligne de commande, compltement des noms de fichiers, aide en
+ligne, slection visuelle, etc.
+Voir ":help vi_diff.txt" pour un rsum des diffrences entre
+.B Vim
+et Vi.
+.PP
+Pendant l'excution de
+.B Vim
+\, une aide abondante est accessible au travers du systme d'aide
+en ligne, grce la commande ":help".
+Voir la section AIDE EN LIGNE plus bas.
+.PP
+Le plus souvent
+.B Vim
+est dmarr pour diter un unique fichier avec la commande
+.PP
+ vim fichier
+.PP
+Plus gnralement,
+.B Vim
+est lanc avec :
+.PP
+ vim [options] [listefichiers]
+.PP
+Si la listefichiers est omise, l'diteur dmarre avec un tampon vide.
+Autrement, l'une des quatre mthodes suivantes vous permettra de choisir
+un ou plusieurs fichiers diter.
+.TP 12
+fichier ...
+Une liste de noms de fichiers.
+Le premier sera le fichier courant et sera lu dans le tampon.
+Le curseur sera plac sur la premire ligne du tampon.
+Vous pouvez passer aux autres fichiers avec la commande ":next".
+Pour diter un fichier dbutant par un tiret, faites prcder la
+liste de fichiers par "\-\-".
+.TP
+\-
+Le fichier diter est lu sur l'entre standard (stdin). Les commandes sont
+lues depuis stderr, qui devrait tre un terminal.
+.TP
+\-t {marqueur}
+Le fichier diter et la position initiale du curseur dpendent
+d'un "marqueur", qui est une sorte d'tiquette.
+{marqueur} est recherch dans le fichier des marqueurs, le fichier correspondant
+devient le fichier courant et la commande associe est excute.
+Principalement utile pour les programmes en C ; dans ce cas, {marqueur}
+peut tre le nom d'une fonction.
+Au final, le fichier contenant cette fonction devient le fichier
+courant et le curseur est plac au dbut de la fonction.
+Voir ":help tag\-commands".
+.TP
+\-q [fichiererreurs]
+Dmarre en mode Mise-au-point (QuickFix).
+Le fichier [fichiererreurs] est lu et la premire erreur est affiche.
+Si [fichiererreurs] est omis, le nom du fichier est lu dans
+l'option 'errorfile' ("AztecC.Err" par dfaut sur Amiga, "errors.err" sur les
+autres systmes).
+La commande ":cn" permet de sauter aux erreurs suivantes.
+Voir ":help quickfix".
+.PP
+.B Vim
+se comporte diffremment selon le nom de la commande (l'excutable peut
+cependant tre le mme fichier).
+.TP 10
+vim
+La faon "normale", le comportement par dfaut.
+.TP
+ex
+Dmarre en mode Ex.
+La commande ":vi" permet de passer en mode Normal.
+Ce mode est galement accessible avec l'argument "\-e".
+.TP
+view
+Dmarre en mode Lecture-Seule. Vous tes protg de l'criture accidentelle
+des fichiers. Ce mode est galement accessible avec l'argument "\-R".
+.TP
+gvim gview
+La version graphique.
+Ouvre une nouvelle fentre.
+galement accessible avec l'argument "\-g".
+.TP
+evim eview
+La version graphique en mode Dbutant (easy).
+Ouvre une nouvelle fentre.
+galement accessible avec l'argument "\-y".
+.TP
+rvim rview rgvim rgview
+Comme ci-dessus, mais avec des restrictions. Il vous sera impossible de
+lancer des commandes du shell, ou de suspendre
+.B Vim.
+galement accessible avec l'argument "\-Z".
+.SH OPTIONS
+Les options peuvent tre spcifies dans n'importe quel ordre,
+avant ou aprs les noms de fichiers. Les options sans arguments
+peuvent tre combines aprs un unique tiret.
+.TP 12
++[num]
+Place le curseur sur la ligne "num" dans le premier fichier.
+Si "num" est omis, le curseur sera plac sur la dernire ligne.
+.TP
++/{motif}
+Place le curseur sur la premire occurrence de {motif} dans le premier fichier.
+Voir ":help search\-pattern" pour connatre les motifs de recherches
+disponibles.
+.TP
++{commande}
+.TP
+\-c {commande}
+Excute {commande} aprs la lecture du premier fichier.
+{commande} est interprte comme une commande Ex.
+Si la {commande} contient des espaces, elle doit tre entoure
+de doubles-apostrophes (cela dpend du shell utilis).
+Exemple : vim "+set si" main.c
+.br
+Note : vous pouvez utiliser jusqu' 10 commandes "+" ou "\-c".
+.TP
+\-S {fichier}
+Source {fichier} aprs la lecture du premier fichier.
+C'est quivalent \-c "source {fichier}".
+{fichier} ne peut pas dbuter par un '\-'.
+Si {fichier} est omis, "Session.vim" est utilis (cela ne fonctionne que si
+\-S est le dernier argument).
+.TP
+\-\-cmd {commande}
+Comme "\-c", mais la commande est excute juste avant de traiter les fichiers
+vimrc.
+Vous pouvez utiliser jusqu' 10 de ces commandes, indpendamment des
+commandes "\-c".
+.TP
+\-A
+Si
+.B Vim
+a t compil avec le support de la fonctionnalit ARABIC pour l'dition de
+fichiers de droite gauche et les claviers arabes, cette option lance
+.B Vim
+en mode Arabe, c.--d. que l'option 'arabic' est active.
+Sinon, un message d'erreur est mis et
+.B Vim
+quitte.
+.TP
+\-b
+Mode Binaire.
+Active plusieurs options pour permettre l'dition
+d'un fichier binaire ou excutable.
+.TP
+\-C
+Compatible. Active l'option 'compatible'.
+.B Vim
+se comportera alors quasiment comme Vi, mme s'il existe un fichier .vimrc.
+.TP
+\-d
+Dmarre en mode Diff.
+Deux, trois ou quatre noms de fichiers doivent tre spcifis.
+.B Vim
+ouvrira alors tous les fichiers et affichera leurs diffrences.
+Fonctionne comme vimdiff(1).
+.TP
+\-d {priph}
+Ouvre {priph} pour l'utiliser comme terminal.
+Uniquement sur Amiga.
+Exemple :
+"\-d con:20/30/600/150".
+.TP
+\-D
+Debogage. Passe en mode Dbogage lors de l'excution de la premire commande
+d'un script.
+.TP
+\-e
+Dmarre
+.B Vim
+en mode Ex, comme si l'excutable s'appelait "ex".
+.TP
+\-E
+Dmarre
+.B Vim
+en mode Ex amlior, comme si l'excutable "exim" avait t invoqu.
+.TP
+\-f
+Premier-plan (Foreground). Pour la version graphique,
+.B Vim
+ne forke pas et ne se dtache pas du shell dans lequel il a t invoqu.
+Sur Amiga,
+.B Vim
+n'est pas relanc pour ouvrir une nouvelle fentre.
+Cette option est utile quand
+.B Vim
+est excut par un programme qui attend la fin de la session d'dition
+(par exemple mail).
+Sur Amiga, les commandes ":sh" et ":!" ne fonctionneront pas.
+.TP
+\-\-nofork
+Premier-plan (Foreground). Pour la version graphique,
+.B Vim
+ne forkera pas et ne se dtachera pas du shell dans lequel il a t lanc.
+.TP
+\-F
+Si
+.B Vim
+a t compil avec le support de la fonctionnalit FKMAP pour l'dition de
+fichiers de droite gauche et les claviers farsi, cette option lance
+.B Vim
+en mode Farsi, c.--d. avec les options 'fkmap' et 'rightleft' actives.
+Sinon, un message d'erreur est mis et
+.B Vim
+quitte.
+.TP
+\-g
+Si
+.B Vim
+a t compil avec le support de l'IHM graphique, cette option active
+l'IHM graphique. Si le support n'a pas t compil, un message d'erreur
+est mis et
+.B Vim
+quitte.
+.TP
+\-h
+Donne une aide succincte sur les arguments et les options de la ligne de
+commande. Aprs cela,
+.B Vim
+quitte.
+.TP
+\-H
+Si
+.B Vim
+a t compil avec le support de la fonctionnalit RIGHTLEFT pour l'dition de
+fichiers de droite gauche et les claviers hbreux, cette option lance
+.B Vim
+en mode Hbreu, c.--d. avec les options 'hkmap' et 'rightleft' actives.
+Sinon, un message d'erreur est mis et
+.B Vim
+quitte.
+.TP
+\-i {viminfo}
+Lorsque l'utilisation d'un fichier viminfo est active, cette option indique
+le nom de fichier utiliser la place de "~/.viminfo" par dfaut.
+Il est possible d'empcher l'utilisation d'un fichier ".viminfo", en
+spcifiant le nom de fichier "NONE".
+.TP
+\-L
+Comme \-r.
+.TP
+\-l
+Mode Lisp.
+Active les options 'lisp' et 'showmatch'.
+.TP
+\-m
+Empche la modification des fichiers.
+Dsactive l'option 'write'.
+Vous pouvez toujours modifier le tampon, mais il vous sera impossible
+d'crire le fichier.
+.TP
+\-M
+N'autorise aucune modification. les options 'modifiable' et 'write' sont
+dsactives, de sorte que les changements ne sont pas autoriss et que les
+fichiers ne peuvent pas tre crits. Note : ces options peuvent tre actives
+pour autoriser les modifications.
+.TP
+\-N
+Mode Non-compatible. Dsactive l'option 'compatible'.
+Cela amliorera le comportement de
+.B Vim
+\, mais il sera moins conforme celui de Vi, mme s'il n'existe aucun
+fichier ".vimrc".
+.TP
+\-n
+N'utilise pas de fichier d'change (swapfile).
+Le recouvrement aprs un plantage sera impossible.
+Utile pour diter un fichier sur un support trs lent (disquette par ex.).
+galement activable avec ":set uc=0".
+Il est possible de l'annuler avec ":set uc=200".
+.TP
+\-nb
+Devient un serveur d'dition pour NetBeans. Consulter la documentation ce
+sujet pour davantage de dtails.
+.TP
+\-o[N]
+Ouvre N fentres les unes au-dessus des autres.
+Quand N est omis, ouvre une fentre pour chaque fichier.
+.TP
+\-O[N]
+Ouvre N fentres cte cte.
+Quand N est omis, ouvre une fentre pour chaque fichier fichier.
+.TP
+\-p[N]
+Ouvre N onglets.
+Quand N est omis, ouvre un onglet pour chaque fichier fichier.
+.TP
+\-R
+Mode Lecture-Seule.
+Active l'option 'readonly'.
+Vous pouvez toujours diter le tampon, mais il vous sera impossible de
+d'craser accidentellement un fichier.
+Si vous voulez craser un fichier, ajoutez un point d'exclamation la commande
+Ex, comme dans ":w!".
+L'option \-R impose l'option \-n (voir ci-dessus).
+L'option 'readonly' peut tre dsactive avec ":set noro".
+Voir ":help 'readonly'".
+.TP
+\-r
+Donne la liste des fichiers d'change, avec des informations pour les utiliser
+ des fins de recouvrement.
+.TP
+\-r {file}
+Mode Recouvrement.
+Utilise le fichier d'change pour rcouvrer d'une session d'dition plante.
+Le fichier d'change est un fichier avec le mme nom que le fichier texte,
+suivi du suffixe ".swp".
+Voir ":help recovery".
+.TP
+\-s
+Mode Silencieux. Disponible uniquement quand
+.B Vim
+est lanc en tant que "ex" ou quand l'option "\-e" a t spcifie avant
+l'option "\-s".
+.TP
+\-s {scriptEntre}
+Lit le fichier de script {scriptEntre}.
+Les caractres du fichier sont interprts comme si vous les tapiez.
+La commande ":source! {scriptEntre}" donne le mme rsultat.
+Si la fin du fichier est atteinte avant que l'diteur quitte, les caractres
+suivants sont lus depuis le clavier.
+.TP
+\-T {terminal}
+Indique
+.B Vim
+le nom du terminal utilis.
+Cela n'est requis que lorsque la dtection automatique choue.
+Le {terminal} devrait tre connu de
+.B Vim
+(intgr) ou dfini dans le fichier termcap ou terminfo.
+.TP
+\-u {vimrc}
+Utilise les commandes du fichier {vimrc} pour les initialisations.
+Toutes les autres initialisations sont omises.
+ utiliser pour diter un type de fichiers particulier.
+Cela permet aussi d'omettre toute initialisation en spcifiant le nom de
+fichier "NONE".
+Voir ":help initialization" dans Vim pour davantage de dtails.
+.TP
+\-U {gvimrc}
+Utilise les commandes du fichier {gvimrc} pour l'initialisation de l'IHM
+graphique.
+Toutes les autres initialisations graphiques sont omises.
+Cela permet aussi d'omettre toute initialisation graphique en spcifiant le nom
+de fichier "NONE".
+Voir ":help gui\-init" dans Vim pour davantage de dtails.
+.TP
+\-V[N]
+Mode Verbeux.
+Donne des messages propos des fichiers sourcs, ainsi que sur la lecture
+et les critures dans le fichier viminfo. le nombre optionnel N prcise la
+valeur de l'option 'verbose' (10 par dfaut).
+.TP
+\-v
+Dmarre
+.B Vim
+en mode Vi, comme si l'excutable s'appelait "vi". Cela n'a d'effet que si
+l'excutable invoqu est "ex".
+.TP
+\-w {scriptSortie}
+Tous les caractres que vous tapez sont enregistrs dans le fichier
+{scriptSortie}, jusqu' ce que vous quittiez
+.B Vim.
+C'est utile quand vous voulez crer un fichier de script utiliser avec
+"vim \-s" ou ":source!".
+Si le fichier {scriptSortie} existe, les caractres sont ajouts la fin.
+.TP
+\-W {scriptSortie}
+Comme \-w, mais un fichier existant sera cras.
+.TP
+\-x
+Chiffre les fichiers lors de l'criture. Une cl de chiffrement sera demande.
+.TP
+\-X
+Ne se connecte pas au serveur X. Acclre le temps de dmarrage dans un
+terminal, mais le titre de la fentre et le presse-papier seront inaccessibles.
+.TP
+\-y
+Dmarre
+.B Vim
+en mode Dbutant (easy), comme si l'excutable s'appelait "evim" ou "eview".
+Donne
+.B Vim
+un comportement plus proche des diteurs cliquez-tapez .
+.TP
+\-Z
+Mode restreint. Fonctionne comme si l'excutable commenait par la lettre 'r'.
+.TP
+\-\-
+Dlimite la fin des options.
+Les arguments qui suivent seront considrs comme des noms de fichiers.
+Cela permet d'diter des fichiers dbutant par un '\-'.
+.TP
+\-\-echo\-wid
+IHM graphique GTK uniquement : retourne la Window ID sur stdout.
+.TP
+\-\-help
+Donne un message d'aide et quitte, comme "\-h".
+.TP
+\-\-literal
+Prend les arguments de noms de fichiers littralement, sans tendre les
+jokers. N'a aucun effet sur Unix, o le shell tend les jokers.
+.TP
+\-\-noplugin
+Ne charge pas les greffons. Implicite avec \-u NONE.
+.TP
+\-\-remote
+Se connecte un serveur Vim et lui fait diter les fichiers spcifis dans
+le reste des arguments. Si aucun serveur n'est trouv, un avertissement est
+mis et les fichiers sont dits dans le Vim courant.
+.TP
+\-\-remote\-expr {expr}
+Se connecte un serveur Vim, y value {expr} et affiche le rsultat sur la
+sortie standard (stdout).
+.TP
+\-\-remote\-send {touches}
+Se connecte un serveur Vim et y envoie {touches}.
+.TP
+\-\-remote\-silent
+Comme \-\-remote, mais sans mettre d'avertissement si aucun serveur n'est
+trouv.
+.TP
+\-\-remote\-wait
+Comme \-\-remote, mais Vim ne quitte pas tant que le fichier est en cours
+d'dition.
+.TP
+\-\-remote\-wait\-silent
+Comme \-\-remote\-wait, mais sans mettre d'avertissement si aucun serveur n'est
+trouv.
+.TP
+\-\-serverlist
+Donne la liste des noms de tous les serveurs Vim disponibles.
+.TP
+\-\-servername {nom}
+Utilise {nom} pour le nom de serveur. Ce nom est donn au Vim courant, moins
+qu'il ne soit utilis avec un argument \-\-remote. Dans ce cas, il s'agit du nom
+du serveur auquel se connecter.
+.TP
+\-\-socketid {id}
+IHM graphique GTK+ uniquement : utilise le mcanisme GtkPlug pour faire
+fonctionner gvim dans une autre fentre.
+.TP
+\-\-version
+Affiche les informations sur la version puis quitte.
+.SH AIDE EN LIGNE
+Taper ":help" dans
+.B Vim
+pour commencer.
+Taper ":help sujet" pour obtenir de l'aide sur un sujet prcis.
+Par exemple : ":help ZZ" pour consulter l'aide sur la commande "ZZ".
+Utiliser <Tab> et CTRL\-D pour complter les sujets (":help
+cmdline\-completion").
+Des marqueurs sont inclus dans l'aide et vous permettent de sauter d'un endroit
+ un autre (comme des liens hypertextes, voir ":help").
+L'ensemble des fichiers de la documentation peut tre consult de cette
+faon, par exemple ":help syntax.txt".
+.SH FICHIERS
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+Les fichiers de la documentation de
+.B Vim.
+Utiliser ":help doc\-file\-list" pour obtenir la liste complte.
+.TP
+/usr/local/lib/vim/doc/tags
+Le fichier des marqueurs utilis pour trouver les informations dans les
+fichiers de la documentation.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Initialisation de la syntaxe pour l'ensemble du systme.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Fichiers de syntaxe pour diffrents langages.
+.TP
+/usr/local/lib/vim/vimrc
+Initialisation de
+.B Vim
+pour l'ensemble du systme.
+.TP
+~/.vimrc
+Initialisation de
+.B Vim
+de votre compte utilisateur.
+.TP
+/usr/local/lib/vim/gvimrc
+Initialisation de gvim pour l'ensemble du systme.
+.TP
+~/.gvimrc
+Initialisation de gvim pour votre compte utilisateur.
+.TP
+/usr/local/lib/vim/optwin.vim
+Script utilis pour la commande ":options", une manire pratique de consulter
+et de modifier les options.
+.TP
+/usr/local/lib/vim/menu.vim
+Initialisation des menus de gvim pour l'ensemble du systme.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Script pour gnrer un rapport de bogue. Voir ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Script pour dtecter le type d'un fichier d'aprs son nom.
+Voir ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Script pour dtecter le type d'un fichier d'aprs son contenu.
+Voir ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+Fichiers utiliss pour l'impression PostScript.
+.PP
+Pour disposer d'informations rcentes, consulter le site Internet de VIM :
+.br
+<URL:http://www.vim.org/>
+.SH VOIR AUSSI
+vimtutor(1)
+.SH AUTEUR
+La majeure partie de
+.B Vim
+a t crite par Bram Moolenaar, avec l'aide de nombreux autres contributeurs.
+Voir ":help credits" dans
+.B Vim.
+.br
+.B Vim
+est bas sur Stevie, ralis par Tim Thompson,
+Tony Andrews et G.R. (Fred) Walter.
+Toutefois, pratiquement rien du code original ne subsiste.
+.SH BOGUES
+Probablement.
+Voir ":help todo" pour consulter la liste des problmes connus.
+.PP
+NOTE : Remarquez que bon nombre de points, qui pourraient tre considrs comme
+des bugs par certains, sont en fait dus une reproduction trop fidle
+du comportement de Vi. Et si vous pensez que d'autres points sont des
+bugs "parce que Vi le fait diffremment", vous devriez jeter un oeil
+attentif au fichier vi_diff.txt (ou taper ":help vi_diff.txt" dans Vim).
+Regardez aussi les options 'compatible' et 'coptions'.
+.SH TRADUCTION
+Cette page de manuel a t traduite par Richard Hitier.
+<richard.hitier@dial.oleane.com> 2000-08-07.
+.br
+Cette page de manuel a t mise jour par David Blanchet.
+<david.blanchet@free.fr> 2006-04-10.
+Mise jour 2013-05-10, Dominique Pell <dominique.pelle@gmail.com>
diff --git a/runtime/doc/vim-fr.UTF-8.1 b/runtime/doc/vim-fr.UTF-8.1
new file mode 100644
index 0000000..4537722
--- /dev/null
+++ b/runtime/doc/vim-fr.UTF-8.1
@@ -0,0 +1,589 @@
+.\" Traduction lundi 7 août 2000 par Richard Hitier
+.\" (richard.hitier@dial.oleane.com)
+.\" Mise à jour de la traduction par David Blanchet
+.\" (david.blanchet@free.fr) 2006-06-10
+.\" Mise à jour de la traduction par Dominique Pellé
+.\" (dominique.pelle@gmail.com) 2013-05-10
+.\"
+.TH VIM 1 "22 février 2002"
+.SH NOM
+vim \- Vi IMproved, éditeur de texte pour programmeurs
+.SH SYNOPSIS
+.br
+.B vim
+[options] [fichier ...]
+.br
+.B vim
+[options] \-
+.br
+.B vim
+[options] \-t marqueur
+.br
+.B vim
+[options] \-q [fichiererreurs]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH DESCRIPTION
+.B Vim
+est un éditeur de texte proposant une compatibilité ascendante
+avec Vi. Il permet d'éditer n'importe quel type de texte brut.
+Il est particulièrement adapté pour l'édition des programmes.
+.PP
+Il comporte de nombreuses améliorations par rapport à Vi : annulation sur
+plusieurs niveaux, fenêtres et tampons multiples, coloration syntaxique,
+édition en ligne de commande, complètement des noms de fichiers, aide en
+ligne, sélection visuelle, etc.
+Voir ":help vi_diff.txt" pour un résumé des différences entre
+.B Vim
+et Vi.
+.PP
+Pendant l'exécution de
+.B Vim
+\, une aide abondante est accessible au travers du système d'aide
+en ligne, grâce à la commande ":help".
+Voir la section AIDE EN LIGNE plus bas.
+.PP
+Le plus souvent
+.B Vim
+est démarré pour éditer un unique fichier avec la commande
+.PP
+ vim fichier
+.PP
+Plus généralement,
+.B Vim
+est lancé avec :
+.PP
+ vim [options] [listefichiers]
+.PP
+Si la listefichiers est omise, l'éditeur démarre avec un tampon vide.
+Autrement, l'une des quatre méthodes suivantes vous permettra de choisir
+un ou plusieurs fichiers à éditer.
+.TP 12
+fichier ...
+Une liste de noms de fichiers.
+Le premier sera le fichier courant et sera lu dans le tampon.
+Le curseur sera placé sur la première ligne du tampon.
+Vous pouvez passer aux autres fichiers avec la commande ":next".
+Pour éditer un fichier débutant par un tiret, faites précéder la
+liste de fichiers par "\-\-".
+.TP
+\-
+Le fichier à éditer est lu sur l'entrée standard (stdin). Les commandes sont
+lues depuis stderr, qui devrait être un terminal.
+.TP
+\-t {marqueur}
+Le fichier à éditer et la position initiale du curseur dépendent
+d'un "marqueur", qui est une sorte d'étiquette.
+{marqueur} est recherché dans le fichier des marqueurs, le fichier correspondant
+devient le fichier courant et la commande associée est exécutée.
+Principalement utile pour les programmes en C ; dans ce cas, {marqueur}
+peut être le nom d'une fonction.
+Au final, le fichier contenant cette fonction devient le fichier
+courant et le curseur est placé au début de la fonction.
+Voir ":help tag\-commands".
+.TP
+\-q [fichiererreurs]
+Démarre en mode Mise-au-point (QuickFix).
+Le fichier [fichiererreurs] est lu et la première erreur est affichée.
+Si [fichiererreurs] est omis, le nom du fichier est lu dans
+l'option 'errorfile' ("AztecC.Err" par défaut sur Amiga, "errors.err" sur les
+autres systèmes).
+La commande ":cn" permet de sauter aux erreurs suivantes.
+Voir ":help quickfix".
+.PP
+.B Vim
+se comporte différemment selon le nom de la commande (l'exécutable peut
+cependant être le même fichier).
+.TP 10
+vim
+La façon "normale", le comportement par défaut.
+.TP
+ex
+Démarre en mode Ex.
+La commande ":vi" permet de passer en mode Normal.
+Ce mode est également accessible avec l'argument "\-e".
+.TP
+view
+Démarre en mode Lecture-Seule. Vous êtes protégé de l'écriture accidentelle
+des fichiers. Ce mode est également accessible avec l'argument "\-R".
+.TP
+gvim gview
+La version graphique.
+Ouvre une nouvelle fenêtre.
+Également accessible avec l'argument "\-g".
+.TP
+evim eview
+La version graphique en mode Débutant (easy).
+Ouvre une nouvelle fenêtre.
+Également accessible avec l'argument "\-y".
+.TP
+rvim rview rgvim rgview
+Comme ci-dessus, mais avec des restrictions. Il vous sera impossible de
+lancer des commandes du shell, ou de suspendre
+.B Vim.
+Également accessible avec l'argument "\-Z".
+.SH OPTIONS
+Les options peuvent être spécifiées dans n'importe quel ordre,
+avant ou après les noms de fichiers. Les options sans arguments
+peuvent être combinées après un unique tiret.
+.TP 12
++[num]
+Place le curseur sur la ligne "num" dans le premier fichier.
+Si "num" est omis, le curseur sera placé sur la dernière ligne.
+.TP
++/{motif}
+Place le curseur sur la première occurrence de {motif} dans le premier fichier.
+Voir ":help search\-pattern" pour connaître les motifs de recherches
+disponibles.
+.TP
++{commande}
+.TP
+\-c {commande}
+Exécute {commande} après la lecture du premier fichier.
+{commande} est interprétée comme une commande Ex.
+Si la {commande} contient des espaces, elle doit être entourée
+de doubles-apostrophes (cela dépend du shell utilisé).
+Exemple : vim "+set si" main.c
+.br
+Note : vous pouvez utiliser jusqu'à 10 commandes "+" ou "\-c".
+.TP
+\-S {fichier}
+Source {fichier} après la lecture du premier fichier.
+C'est équivalent à \-c "source {fichier}".
+{fichier} ne peut pas débuter par un '\-'.
+Si {fichier} est omis, "Session.vim" est utilisé (cela ne fonctionne que si
+\-S est le dernier argument).
+.TP
+\-\-cmd {commande}
+Comme "\-c", mais la commande est exécutée juste avant de traiter les fichiers
+vimrc.
+Vous pouvez utiliser jusqu'à 10 de ces commandes, indépendamment des
+commandes "\-c".
+.TP
+\-A
+Si
+.B Vim
+a été compilé avec le support de la fonctionnalité ARABIC pour l'édition de
+fichiers de droite à gauche et les claviers arabes, cette option lance
+.B Vim
+en mode Arabe, c.-à-d. que l'option 'arabic' est activée.
+Sinon, un message d'erreur est émis et
+.B Vim
+quitte.
+.TP
+\-b
+Mode Binaire.
+Active plusieurs options pour permettre l'édition
+d'un fichier binaire ou exécutable.
+.TP
+\-C
+Compatible. Active l'option 'compatible'.
+.B Vim
+se comportera alors quasiment comme Vi, même s'il existe un fichier .vimrc.
+.TP
+\-d
+Démarre en mode Diff.
+Deux, trois ou quatre noms de fichiers doivent être spécifiés.
+.B Vim
+ouvrira alors tous les fichiers et affichera leurs différences.
+Fonctionne comme vimdiff(1).
+.TP
+\-d {périph}
+Ouvre {périph} pour l'utiliser comme terminal.
+Uniquement sur Amiga.
+Exemple :
+"\-d con:20/30/600/150".
+.TP
+\-D
+Debogage. Passe en mode Débogage lors de l'exécution de la première commande
+d'un script.
+.TP
+\-e
+Démarre
+.B Vim
+en mode Ex, comme si l'exécutable s'appelait "ex".
+.TP
+\-E
+Démarre
+.B Vim
+en mode Ex amélioré, comme si l'exécutable "exim" avait été invoqué.
+.TP
+\-f
+Premier-plan (Foreground). Pour la version graphique,
+.B Vim
+ne forke pas et ne se détache pas du shell dans lequel il a été invoqué.
+Sur Amiga,
+.B Vim
+n'est pas relancé pour ouvrir une nouvelle fenêtre.
+Cette option est utile quand
+.B Vim
+est exécuté par un programme qui attend la fin de la session d'édition
+(par exemple mail).
+Sur Amiga, les commandes ":sh" et ":!" ne fonctionneront pas.
+.TP
+\-\-nofork
+Premier-plan (Foreground). Pour la version graphique,
+.B Vim
+ne forkera pas et ne se détachera pas du shell dans lequel il a été lancé.
+.TP
+\-F
+Si
+.B Vim
+a été compilé avec le support de la fonctionnalité FKMAP pour l'édition de
+fichiers de droite à gauche et les claviers farsi, cette option lance
+.B Vim
+en mode Farsi, c.-à-d. avec les options 'fkmap' et 'rightleft' activées.
+Sinon, un message d'erreur est émis et
+.B Vim
+quitte.
+.TP
+\-g
+Si
+.B Vim
+a été compilé avec le support de l'IHM graphique, cette option active
+l'IHM graphique. Si le support n'a pas été compilé, un message d'erreur
+est émis et
+.B Vim
+quitte.
+.TP
+\-h
+Donne une aide succincte sur les arguments et les options de la ligne de
+commande. Après cela,
+.B Vim
+quitte.
+.TP
+\-H
+Si
+.B Vim
+a été compilé avec le support de la fonctionnalité RIGHTLEFT pour l'édition de
+fichiers de droite à gauche et les claviers hébreux, cette option lance
+.B Vim
+en mode Hébreu, c.-à-d. avec les options 'hkmap' et 'rightleft' activées.
+Sinon, un message d'erreur est émis et
+.B Vim
+quitte.
+.TP
+\-i {viminfo}
+Lorsque l'utilisation d'un fichier viminfo est activée, cette option indique
+le nom de fichier à utiliser à la place de "~/.viminfo" par défaut.
+Il est possible d'empêcher l'utilisation d'un fichier ".viminfo", en
+spécifiant le nom de fichier "NONE".
+.TP
+\-L
+Comme \-r.
+.TP
+\-l
+Mode Lisp.
+Active les options 'lisp' et 'showmatch'.
+.TP
+\-m
+Empêche la modification des fichiers.
+Désactive l'option 'write'.
+Vous pouvez toujours modifier le tampon, mais il vous sera impossible
+d'écrire le fichier.
+.TP
+\-M
+N'autorise aucune modification. les options 'modifiable' et 'write' sont
+désactivées, de sorte que les changements ne sont pas autorisés et que les
+fichiers ne peuvent pas être écrits. Note : ces options peuvent être activées
+pour autoriser les modifications.
+.TP
+\-N
+Mode Non-compatible. Désactive l'option 'compatible'.
+Cela améliorera le comportement de
+.B Vim
+\, mais il sera moins conforme à celui de Vi, même s'il n'existe aucun
+fichier ".vimrc".
+.TP
+\-n
+N'utilise pas de fichier d'échange (swapfile).
+Le recouvrement après un plantage sera impossible.
+Utile pour éditer un fichier sur un support très lent (disquette par ex.).
+Également activable avec ":set uc=0".
+Il est possible de l'annuler avec ":set uc=200".
+.TP
+\-nb
+Devient un serveur d'édition pour NetBeans. Consulter la documentation à ce
+sujet pour davantage de détails.
+.TP
+\-o[N]
+Ouvre N fenêtres les unes au-dessus des autres.
+Quand N est omis, ouvre une fenêtre pour chaque fichier.
+.TP
+\-O[N]
+Ouvre N fenêtres côte à côte.
+Quand N est omis, ouvre une fenêtre pour chaque fichier fichier.
+.TP
+\-p[N]
+Ouvre N onglets.
+Quand N est omis, ouvre un onglet pour chaque fichier fichier.
+.TP
+\-R
+Mode Lecture-Seule.
+Active l'option 'readonly'.
+Vous pouvez toujours éditer le tampon, mais il vous sera impossible de
+d'écraser accidentellement un fichier.
+Si vous voulez écraser un fichier, ajoutez un point d'exclamation à la commande
+Ex, comme dans ":w!".
+L'option \-R impose l'option \-n (voir ci-dessus).
+L'option 'readonly' peut être désactivée avec ":set noro".
+Voir ":help 'readonly'".
+.TP
+\-r
+Donne la liste des fichiers d'échange, avec des informations pour les utiliser
+à des fins de recouvrement.
+.TP
+\-r {file}
+Mode Recouvrement.
+Utilise le fichier d'échange pour récouvrer d'une session d'édition plantée.
+Le fichier d'échange est un fichier avec le même nom que le fichier texte,
+suivi du suffixe ".swp".
+Voir ":help recovery".
+.TP
+\-s
+Mode Silencieux. Disponible uniquement quand
+.B Vim
+est lancé en tant que "ex" ou quand l'option "\-e" a été spécifiée avant
+l'option "\-s".
+.TP
+\-s {scriptEntrée}
+Lit le fichier de script {scriptEntrée}.
+Les caractères du fichier sont interprétés comme si vous les tapiez.
+La commande ":source! {scriptEntrée}" donne le même résultat.
+Si la fin du fichier est atteinte avant que l'éditeur quitte, les caractères
+suivants sont lus depuis le clavier.
+.TP
+\-T {terminal}
+Indique à
+.B Vim
+le nom du terminal utilisé.
+Cela n'est requis que lorsque la détection automatique échoue.
+Le {terminal} devrait être connu de
+.B Vim
+(intégré) ou défini dans le fichier termcap ou terminfo.
+.TP
+\-u {vimrc}
+Utilise les commandes du fichier {vimrc} pour les initialisations.
+Toutes les autres initialisations sont omises.
+À utiliser pour éditer un type de fichiers particulier.
+Cela permet aussi d'omettre toute initialisation en spécifiant le nom de
+fichier "NONE".
+Voir ":help initialization" dans Vim pour davantage de détails.
+.TP
+\-U {gvimrc}
+Utilise les commandes du fichier {gvimrc} pour l'initialisation de l'IHM
+graphique.
+Toutes les autres initialisations graphiques sont omises.
+Cela permet aussi d'omettre toute initialisation graphique en spécifiant le nom
+de fichier "NONE".
+Voir ":help gui\-init" dans Vim pour davantage de détails.
+.TP
+\-V[N]
+Mode Verbeux.
+Donne des messages à propos des fichiers sourcés, ainsi que sur la lecture
+et les écritures dans le fichier viminfo. le nombre optionnel N précise la
+valeur de l'option 'verbose' (10 par défaut).
+.TP
+\-v
+Démarre
+.B Vim
+en mode Vi, comme si l'exécutable s'appelait "vi". Cela n'a d'effet que si
+l'exécutable invoqué est "ex".
+.TP
+\-w {scriptSortie}
+Tous les caractères que vous tapez sont enregistrés dans le fichier
+{scriptSortie}, jusqu'à ce que vous quittiez
+.B Vim.
+C'est utile quand vous voulez créer un fichier de script à utiliser avec
+"vim \-s" ou ":source!".
+Si le fichier {scriptSortie} existe, les caractères sont ajoutés à la fin.
+.TP
+\-W {scriptSortie}
+Comme \-w, mais un fichier existant sera écrasé.
+.TP
+\-x
+Chiffre les fichiers lors de l'écriture. Une clé de chiffrement sera demandée.
+.TP
+\-X
+Ne se connecte pas au serveur X. Accélère le temps de démarrage dans un
+terminal, mais le titre de la fenêtre et le presse-papier seront inaccessibles.
+.TP
+\-y
+Démarre
+.B Vim
+en mode Débutant (easy), comme si l'exécutable s'appelait "evim" ou "eview".
+Donne à
+.B Vim
+un comportement plus proche des éditeurs « cliquez-tapez ».
+.TP
+\-Z
+Mode restreint. Fonctionne comme si l'exécutable commençait par la lettre 'r'.
+.TP
+\-\-
+Délimite la fin des options.
+Les arguments qui suivent seront considérés comme des noms de fichiers.
+Cela permet d'éditer des fichiers débutant par un '\-'.
+.TP
+\-\-echo\-wid
+IHM graphique GTK uniquement : retourne la Window ID sur stdout.
+.TP
+\-\-help
+Donne un message d'aide et quitte, comme "\-h".
+.TP
+\-\-literal
+Prend les arguments de noms de fichiers littéralement, sans étendre les
+jokers. N'a aucun effet sur Unix, où le shell étend les jokers.
+.TP
+\-\-noplugin
+Ne charge pas les greffons. Implicite avec \-u NONE.
+.TP
+\-\-remote
+Se connecte à un serveur Vim et lui fait éditer les fichiers spécifiés dans
+le reste des arguments. Si aucun serveur n'est trouvé, un avertissement est
+émis et les fichiers sont édités dans le Vim courant.
+.TP
+\-\-remote\-expr {expr}
+Se connecte à un serveur Vim, y évalue {expr} et affiche le résultat sur la
+sortie standard (stdout).
+.TP
+\-\-remote\-send {touches}
+Se connecte à un serveur Vim et y envoie {touches}.
+.TP
+\-\-remote\-silent
+Comme \-\-remote, mais sans émettre d'avertissement si aucun serveur n'est
+trouvé.
+.TP
+\-\-remote\-wait
+Comme \-\-remote, mais Vim ne quitte pas tant que le fichier est en cours
+d'édition.
+.TP
+\-\-remote\-wait\-silent
+Comme \-\-remote\-wait, mais sans émettre d'avertissement si aucun serveur n'est
+trouvé.
+.TP
+\-\-serverlist
+Donne la liste des noms de tous les serveurs Vim disponibles.
+.TP
+\-\-servername {nom}
+Utilise {nom} pour le nom de serveur. Ce nom est donné au Vim courant, à moins
+qu'il ne soit utilisé avec un argument \-\-remote. Dans ce cas, il s'agit du nom
+du serveur auquel se connecter.
+.TP
+\-\-socketid {id}
+IHM graphique GTK+ uniquement : utilise le mécanisme GtkPlug pour faire
+fonctionner gvim dans une autre fenêtre.
+.TP
+\-\-version
+Affiche les informations sur la version puis quitte.
+.SH AIDE EN LIGNE
+Taper ":help" dans
+.B Vim
+pour commencer.
+Taper ":help sujet" pour obtenir de l'aide sur un sujet précis.
+Par exemple : ":help ZZ" pour consulter l'aide sur la commande "ZZ".
+Utiliser <Tab> et CTRL\-D pour compléter les sujets (":help
+cmdline\-completion").
+Des marqueurs sont inclus dans l'aide et vous permettent de sauter d'un endroit
+à un autre (comme des liens hypertextes, voir ":help").
+L'ensemble des fichiers de la documentation peut être consulté de cette
+façon, par exemple ":help syntax.txt".
+.SH FICHIERS
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+Les fichiers de la documentation de
+.B Vim.
+Utiliser ":help doc\-file\-list" pour obtenir la liste complète.
+.TP
+/usr/local/lib/vim/doc/tags
+Le fichier des marqueurs utilisé pour trouver les informations dans les
+fichiers de la documentation.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Initialisation de la syntaxe pour l'ensemble du système.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Fichiers de syntaxe pour différents langages.
+.TP
+/usr/local/lib/vim/vimrc
+Initialisation de
+.B Vim
+pour l'ensemble du système.
+.TP
+~/.vimrc
+Initialisation de
+.B Vim
+de votre compte utilisateur.
+.TP
+/usr/local/lib/vim/gvimrc
+Initialisation de gvim pour l'ensemble du système.
+.TP
+~/.gvimrc
+Initialisation de gvim pour votre compte utilisateur.
+.TP
+/usr/local/lib/vim/optwin.vim
+Script utilisé pour la commande ":options", une manière pratique de consulter
+et de modifier les options.
+.TP
+/usr/local/lib/vim/menu.vim
+Initialisation des menus de gvim pour l'ensemble du système.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Script pour générer un rapport de bogue. Voir ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Script pour détecter le type d'un fichier d'après son nom.
+Voir ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Script pour détecter le type d'un fichier d'après son contenu.
+Voir ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+Fichiers utilisés pour l'impression PostScript.
+.PP
+Pour disposer d'informations récentes, consulter le site Internet de VIM :
+.br
+<URL:http://www.vim.org/>
+.SH VOIR AUSSI
+vimtutor(1)
+.SH AUTEUR
+La majeure partie de
+.B Vim
+a été écrite par Bram Moolenaar, avec l'aide de nombreux autres contributeurs.
+Voir ":help credits" dans
+.B Vim.
+.br
+.B Vim
+est basé sur Stevie, réalisé par Tim Thompson,
+Tony Andrews et G.R. (Fred) Walter.
+Toutefois, pratiquement rien du code original ne subsiste.
+.SH BOGUES
+Probablement.
+Voir ":help todo" pour consulter la liste des problèmes connus.
+.PP
+NOTE : Remarquez que bon nombre de points, qui pourraient être considérés comme
+des bugs par certains, sont en fait dus à une reproduction trop fidèle
+du comportement de Vi. Et si vous pensez que d'autres points sont des
+bugs "parce que Vi le fait différemment", vous devriez jeter un oeil
+attentif au fichier vi_diff.txt (ou taper ":help vi_diff.txt" dans Vim).
+Regardez aussi les options 'compatible' et 'coptions'.
+.SH TRADUCTION
+Cette page de manuel a été traduite par Richard Hitier.
+<richard.hitier@dial.oleane.com> 2000-08-07.
+.br
+Cette page de manuel a été mise à jour par David Blanchet.
+<david.blanchet@free.fr> 2006-04-10.
+Mise à jour 2013-05-10, Dominique Pellé <dominique.pelle@gmail.com>
diff --git a/runtime/doc/vim-it.1 b/runtime/doc/vim-it.1
new file mode 100644
index 0000000..75d0ea9
--- /dev/null
+++ b/runtime/doc/vim-it.1
@@ -0,0 +1,566 @@
+.TH VIM 1 "22 febbraio 2002"
+.SH NOME
+vim \- VI Migliorato, un editor di testi per programmatori
+.SH SINTASSI
+.br
+.B vim
+[opzioni] [file ..]
+.br
+.B vim
+[opzioni] \-
+.br
+.B vim
+[opzioni] \-t tag
+.br
+.B vim
+[opzioni] \-q [file_errori]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH DESCRIZIONE
+.B Vim
+Un editore di testi, compatibile con, e migliore di, Vi.
+Pu essere usato per editare qualsiasi file di testo.
+Particolarmente utile per editare programmi.
+.PP
+Ci sono parecchi miglioramenti rispetto a Vi: undo multipli,
+finestre e buffer multipli, evidenziazione sintattica, possibilit
+di modificare la linea di comando, completamento nomi file, help
+in linea, selezione testi in Modo Visual, etc..
+Vedere ":help vi_diff.txt" per un sommario delle differenze fra
+.B Vim
+e Vi.
+.PP
+Mentre usate
+.B Vim
+potete ricevere molto aiuto dal sistema di help online, col comando ":help".
+Vedere qui sotto la sezione AIUTO ONLINE.
+.PP
+Quasi sempre
+.B Vim
+viene invocato, per modificare un file, col comando
+.PP
+ vim nome_file
+.PP
+Pi in generale
+.B Vim
+viene invocato con:
+.PP
+ vim [opzioni] [lista_file]
+.PP
+Se lista_file non presente, l'editor inizia aprendo un buffer vuoto.
+Altrimenti, una e una sola delle quattro maniere indicate qui sotto pu
+essere usata per scegliere uno o pi file da modificare.
+.TP 12
+nome_file ..
+Una lista di nomi di file.
+Il primo di questi sar il file corrente, e verr letto nel buffer.
+Il cursore sar posizionato sulla prima linea del buffer.
+Potete arrivare agli altri file col comando ":next".
+Per editare un file il cui nome inizia per "\-" premettete "\-\-" alla
+lista_file.
+.TP
+\-
+Il file da editare letto dallo "stdin" [di solito, ma non
+necessariamente, il terminale \- NdT]. I comandi sono letti da "stderr",
+che dovrebbe essere un terminale [tty].
+.TP
+\-t {tag}
+Il file da editare e la posizione iniziale del cursore dipendono da "tag",
+una specie di "etichetta" a cui saltare.
+{tag} viene cercata nel file "tags", ed il file ad essa associato diventa
+quello corrente, ed il comando ad essa associato viene eseguito.
+Di solito si usa per programmi C, nel qual caso {tag} potrebbe essere un
+nome di funzione.
+L'effetto che il file contenente quella funzione diventa il file corrente
+e il cursore posizionato all'inizio della funzione.
+Vedere ":help tag\-commands".
+.TP
+\-q [file_errori]
+Inizia in Modo QuickFix [correzione veloce].
+Il file [file_errori] letto e il primo errore visualizzato.
+Se [file_errori] non indicato, il suo nome ottenuto dal valore
+dell'opzione 'errorfile' (che, se non specificata, vale "AztecC.Err"
+per l'Amiga, "errors.err" su altri sistemi).
+Si pu saltare all'errore successivo col comando ":cn".
+Vedere ":help quickfix".
+.PP
+.B Vim
+si comporta in modo diverso se invocato con nomi differenti (il programma
+eseguibile "sottostante" pu essere sempre lo stesso).
+.TP 10
+vim
+Modo Normal, comportamento normale.
+.TP
+ex
+Inizia in Modo "Ex".
+Si pu passare in Modo Normal col comando ":vi".
+Si pu invocare il Modo "Ex" anche con l'argomento "\-e".
+.TP
+view
+Inizia in Modo Read-only (Sola Lettura). Non potete modificare i file.
+Si pu invocare il Modo Read-only anche con l'argomento "\-R".
+.TP
+gvim gview
+La versione GUI [Graphical User Interface].
+Apre una nuova finestra.
+Si pu invocare il Modo GUI anche con l'argomento "\-g".
+.TP
+evim eview
+La versione GUI in Modo Easy (semplificata).
+Apre una nuova finestra.
+Si pu invocare il Modo Easy anche con l'argomento "\-y".
+.TP
+rvim rview rgvim rgview
+Come sopra, ma con restrizioni ai comandi. Non si potranno eseguire comandi
+della shell o sospendere
+.B Vim.
+Si pu chiedere la stessa cosa anche con l'argomento "\-Z".
+.SH OPZIONI
+Le opzioni possono essere in un ordine qualsiasi, prima o dopo i nomi di
+file. Opzioni che non necessitano un argomento possono essere specificate
+dietro a un solo "\-".
+.TP 12
++[numero]
+Per il primo file il cursore sar posizionato sulla linea "numero".
+Se "numero" manca, il cursore sar posizionato sull'ultima linea del file.
+.TP
++/{espressione}
+Per il primo file il cursore sar posizionato alla
+prima occorrenza di {espressione}.
+Vedere ":help search\-pattern" per come specificare l'espressione.
+.TP
++{comando}
+.TP
+\-c {comando}
+{comando} sar eseguito dopo che il
+primo file stato letto.
+{comando} interpretato come un comando Ex.
+Se il {comando} contiene spazi deve essere incluso fra doppi apici
+(o altro delimitatore, a seconda della shell che si sta usando).
+Esempio: vim "+set si" main.c
+.br
+Note: Si possono avere fino a 10 comandi "+" o "\-c".
+.TP
+\-S {file}
+I comandi contenuti in {file} sono eseguiti dopo la lettura del primo file.
+Equivalente a \-c "source {file}".
+{file} non pu avere un nome che inizia per '\-'.
+Se {file} omesso si usa "Session.vim" (funziona solo se \-S l'ultimo
+argomento specificato).
+.TP
+\-\-cmd {comando}
+Come "\-c", ma il comando eseguito PRIMA
+di eseguire qualsiasi file vimrc.
+Si possono usare fino a 10 di questi comandi, indipendentemente dai comandi
+"\-c".
+.TP
+\-A
+Se
+.B Vim
+ stato compilato con supporto Arabic per editare file con orientamento
+destra-sinistra e tastiera con mappatura Araba, questa opzione inizia
+.B Vim
+in Modo Arabic, cio impostando 'arabic'.
+Altrimenti viene dato un messaggio di errore e
+.B Vim
+termina in modo anormale.
+.TP
+\-b
+Modo Binary (binario).
+Vengono impostate alcune opzioni che permettono di modificare un file
+binario o un programma eseguibile.
+.TP
+\-C
+Compatibile. Imposta l'opzione 'compatible'.
+In questo modo
+.B Vim
+ha quasi lo stesso comportamento di Vi, anche in presenza di un file
+di configurazione .vimrc [proprio di Vim, vi usa .exrc \- Ndt].
+.TP
+\-d
+Inizia in Modo Diff [differenze].
+Dovrebbero esserci come argomenti due o tre o quattro nomi di file.
+.B Vim
+aprir tutti i file evidenziando le differenze fra gli stessi.
+Funziona come vimdiff(1).
+.TP
+\-d {dispositivo}
+Apre {dispositivo} per usarlo come terminale.
+Solo per l'Amiga.
+Esempio:
+"\-d con:20/30/600/150".
+.TP
+\-D
+Debugging. Vim si mette in Modo "debugging" a partire
+dall'esecuzione del primo comando da uno script.
+.TP
+\-e
+Eseguire
+.B Vim
+in Modo Ex, come se il programma eseguito sia "ex".
+.TP
+\-E
+Eseguire
+.B Vim
+in Modo Ex migliorato, come se il programma eseguito sia "exim".
+.TP
+\-f
+Direttamente [Foreground]. Per la versione GUI,
+.B Vim
+non crea [fork] una nuova finestra, indipendente dalla shell di invocazione.
+Per l'Amiga,
+.B Vim
+non fatto ripartire per aprire una nuova finestra.
+Opzione da usare quando
+.B Vim
+ eseguito da un programma che attende la fine della
+sessione di edit (ad es. mail).
+Sull'Amiga i comandi ":sh" e ":!" non sono disponibili.
+.TP
+\-\-nofork
+Direttamente [Foreground]. Per la versione GUI,
+.B Vim
+non crea [fork] una nuova finestra, indipendente dalla shell di invocazione.
+.TP
+\-F
+Se
+.B Vim
+ stato compilato con supporto FKMAP per editare file con orientamento
+destra-sinistra e tastiera con mappatura Farsi, questa opzione inizia
+.B Vim
+in Modo Farsi, cio impostando 'fkmap' e 'rightleft'.
+Altrimenti viene dato un messaggio di errore e
+.B Vim
+termina in modo anormale.
+.TP
+\-g
+Se
+.B Vim
+ stato compilato con supporto GUI, questa opzione chiede di usarla.
+Se Vim stato compilato senza supporto GUI viene dato un messaggio di errore e
+.B Vim
+termina in modo anormale.
+.TP
+\-h
+Un po' di aiuto su opzioni e argomenti che si possono dare invocando Vim.
+Subito dopo
+.B Vim
+esce.
+.TP
+\-H
+Se
+.B Vim
+ stato compilato col supporto RIGHTLEFT per editare file con orientamento
+destra-sinistra e tastiera con mappatura Ebraica, questa opzione inizia
+.B Vim
+in Modo Ebraico, cio impostando 'hkmap' e 'rightleft'.
+Altrimenti viene dato un messaggio di errore e
+.B Vim
+termina in modo anormale.
+.TP
+\-i {viminfo}
+Se abilitato l'uso di un file viminfo, questa opzione indica il nome
+del file da usare invece di quello predefinito "~/.viminfo".
+Si pu anche evitare l'uso di un file .viminfo, dando come nome "NONE".
+.TP
+\-L
+Equivalente a \-r.
+.TP
+\-l
+Modo Lisp.
+Imposta le opzioni 'lisp' e 'showmatch'.
+.TP
+\-m
+Inibisce modifica file.
+Annulla l'opzione 'write'.
+ ancora possibile modificare un buffer [in memoria \- Ndt], ma non scriverlo.
+.TP
+\-M
+Modifiche non permesse. Le opzioni 'modifiable' e 'write' sono annullate,
+in modo da impedire sia modifiche che riscritture. Da notare che queste
+opzioni possono essere abilitate in seguito, permettendo cos modifiche.
+.TP
+\-N
+Modo "Non-compatibile". Annulla l'opzione 'compatible'.
+Cos
+.B Vim
+va un po' meglio, ma meno compatibile con Vi, anche in assenza di un
+file .vimrc.
+.TP
+\-n
+Inibisce l'uso di un file di swap.
+Il recupero dopo una caduta di macchina diventa impossibile.
+Utile per editare un file su un supporto molto lento (ad es. floppy).
+Il comando ":set uc=0" ha lo stesso effetto.
+Per abilitare il recupero usare ":set uc=200".
+.TP
+\-nb
+Diviene un Editor server per NetBeans. Vedere la documentazione per dettagli.
+.TP
+\-o[N]
+Apri N finestre in orizzontale.
+Se N manca, apri una finestra per ciascun file.
+.TP
+\-O[N]
+Apri N finestre, in verticale.
+Se N manca, apri una finestra per ciascun file.
+.TP
+\-R
+Modo Read-only (Sola Lettura).
+Imposta l'opzione 'readonly'.
+Si pu ancora modificare il buffer, ma siete protetti da una riscrittura
+involontaria.
+Se volete davvero riscrivere il file, aggiungete un punto esclamativo
+al comando Ex, come in ":w!".
+L'opzione \-R implica anche l'opzione \-n (vedere sotto).
+L'opzione 'readonly' pu essere annullata con ":set noro".
+Vedere ":help 'readonly'".
+.TP
+\-r
+Lista file di swap, assieme a dati utili per un recupero.
+.TP
+\-r {file}
+Modo Recovery (ripristino).
+Il file di swap usato per recuperare una sessione di edit finita male.
+Il file di swap un file con lo stesso nome file del file di testo
+editato, col suffisso ".swp".
+Vedere ":help recovery".
+.TP
+\-s
+Modo silenzioso. Solo quando invocato come "Ex" o quando l'opzione
+"\-e" stata data prima dell'opzione "\-s".
+.TP
+\-s {scriptin}
+Lo script file {scriptin} letto.
+I caratteri nel file sono interpretati come se immessi da voi.
+Lo stesso si pu ottenere col comando ":source! {scriptin}".
+Se la fine del file di input viene raggiunta prima che Vim termini,
+l'ulteriore input viene preso dalla tastiera.
+.TP
+\-T {terminale}
+Dice a
+.B Vim
+quale tipo di terminale state usando.
+Utile solo se il terminale non viene riconosciuto correttamente da Vim.
+Dovrebbe essere un terminale noto a
+.B Vim
+(internamente) o definito nel file termcap o terminfo.
+.TP
+\-u {vimrc}
+Usa i comandi nel file {vimrc} per inizializzazioni.
+Tutte le altre inizializzazioni non sono eseguite.
+Usate questa opzione per editare qualche file di tipo speciale.
+Pu anche essere usato per non fare alcuna inizializzazione dando
+come nome "NONE".
+Vedere ":help initialization" da vim per ulteriori dettagli.
+.TP
+\-U {gvimrc}
+Usa i comandi nel file {gvimrc} per inizializzazioni GUI.
+Tutte le altre inizializzazioni GUI non sono eseguite.
+Pu anche essere usata per non fare alcuna inizializzazione GUI dando
+come nome "NONE".
+Vedere ":help gui-init" da vim per ulteriori dettagli.
+.TP
+\-V[N]
+Verboso. Vim manda messaggi relativi agli script file che esegue
+e quando legge o scrive un file viminfo. Il numero opzionale N il valore
+dell'opzione 'verbose'.
+Il valore predefinito 10.
+.TP
+\-v
+Inizia
+.B Vim
+in Modo Vi, come se il programma eseguibile fosse "vi". Questo ha
+effetto solo quando Vim viene invocato con il nome "ex".
+.TP
+\-w {scriptout}
+Ogni carattere immesso viene registrato nel file {scriptout},
+finch non uscite da
+.B Vim.
+Utile se si vuole creare uno script file da usare con "vim \-s" o
+":source!".
+Se il file {scriptout} esiste, quel che immettete viene aggiunto in fondo.
+.TP
+\-W {scriptout}
+Come \-w, ma uno script file esistente viene sovrascritto.
+.TP
+\-x
+Uso di cifratura nella scrittura dei file. E' necessario immettere
+una chiave di cifratura.
+.TP
+\-X
+Non connetterti al server X. Vim parte pi rapidamente,
+ma il titolo della finestra e la clipboard non sono disponibili.
+.TP
+\-y
+Eseguire
+.B Vim
+in Modo Easy (semplificata), come se l'eseguibile invocato
+sia "evim" o "eview".
+Fa s che
+.B Vim
+si comporti come un editor che usa solo il mouse e i caratteri.
+.TP
+\-Z
+Modo ristretto. Vim si comporta come se invocato con un nome
+che inizia per "r".
+.TP
+\-\-
+Specifica la fine delle opzioni.
+Argomenti specificati dopo questo sono considerati nomi file.
+Si pu usare per editare un file il cui nome inizi per '-'.
+.TP
+\-\-echo\-wid
+Solo con GUI GTK: Visualizza Window ID su "stdout".
+.TP
+\-\-help
+Vim d un messaggio ed esce, come con l'argomento "\-h".
+.TP
+\-\-literal
+Considera i nomi passati come argomenti letterali, senza espandere
+metacaratteri. Non necessario in Unix, la shell espande i metacaratteri.
+.TP
+\-\-noplugin
+Non caricare plugin. Implicito se si specifica \-u NONE.
+.TP
+\-\-remote
+Connettersi a un server Vim e chiedere di editare i file elencati come altri
+argomenti. Se non si trova un server viene dato un messaggio e i file sono
+editati nel Vim corrente.
+.TP
+\-\-remote\-expr {expr}
+Connettersi a un server Vim, valutare ivi {expr} e stampare il risultato
+su "stdout".
+.TP
+\-\-remote\-send {chiavi}
+Connettersi a un server Vim e spedirgli {chiavi}.
+.TP
+\-\-remote\-silent
+Come \-\-remote, ma senza avvisare se non si trova un server.
+.TP
+\-\-remote-wait
+Come \-\-remote, ma Vim non termina finch i file non sono stati editati.
+.TP
+\-\-remote\-wait\-silent
+Come \-\-remote\-wait, ma senza avvisare se non si trova un server.
+.TP
+\-\-serverlist
+Lista i nomi di tutti i server Vim disponibili.
+.TP
+\-\-servername {nome}
+Usa {nome} come nome server. Usato per il Vim corrente, a meno che sia
+usato con l'argomento \-\-remote, nel qual caso indica il server a cui
+connettersi.
+.TP
+\-\-socketid {id}
+Solo con GUI GTK: Usa il meccanismo GtkPlug per eseguire gvim in un'altra
+finestra.
+.TP
+\-\-version
+Stampa la versione di Vim ed esci.
+.SH AIUTO ONLINE
+Battere ":help" in
+.B Vim
+per iniziare.
+Battere ":help argomento" per ricevere aiuto su uno specifico argomento.
+Per esempio: ":help ZZ" per ricevere aiuto sul comando "ZZ".
+Usare <Tab> e CTRL\-D per completare gli argomenti
+(":help cmdline\-completion").
+Ci sono "tag" nei file di help per saltare da un argomento a un altro
+(simili a legami ipertestuali, vedere ":help").
+Tutti i file di documentazione possono essere navigati cos. Ad es.:
+":help syntax.txt".
+.SH FILE
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+I file di documentazione di
+.B Vim
+.
+Usate ":help doc\-file\-list" per avere la lista completa.
+.TP
+/usr/local/lib/vim/doc/tags
+Il file di tags usato per trovare informazioni nei file di documentazione.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Inizializzazioni sintattiche a livello di sistema.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+File di colorazione sintattica per vari linguaggi.
+.TP
+/usr/local/lib/vim/vimrc
+Inizializzazioni
+.B Vim
+a livello di sistema.
+.TP
+~/.vimrc
+Le vostre personali inizializzazioni di
+.B Vim
+.
+.TP
+/usr/local/lib/vim/gvimrc
+Inizializzazioni gvim a livello di sistema.
+.TP
+~/.gvimrc
+Le vostre personali inizializzazioni di gvim.
+.TP
+/usr/local/lib/vim/optwin.vim
+Script Vim usato dal comando ":options", un modo semplice
+per visualizzare e impostare opzioni.
+.TP
+/usr/local/lib/vim/menu.vim
+Inizializzazioni del men gvim a livello di sistema.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Script Vim per generare una segnalazione di errore. Vedere ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Script Vim per determinare il tipo di un file a partire dal suo nome.
+Vedere ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Script Vim per determinare il tipo di un file a partire dal suo contenuto.
+Vedere ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+File usati per stampa PostScript.
+.PP
+Per informazioni aggiornate [in inglese \- NdT] vedere la home page di Vim:
+.br
+<URL:http://www.vim.org/>
+.SH VEDERE ANCHE
+vimtutor(1)
+.SH AUTORE
+Buona parte di
+.B Vim
+ stato scritto da Bram Moolenaar, con molto aiuto da altri.
+Vedere ":help credits" in
+.B Vim.
+.br
+.B Vim
+ basato su Stevie, scritto da: Tim Thompson,
+Tony Andrews e G.R. (Fred) Walter.
+In verit, poco o nulla rimasto del loro codice originale.
+.SH BACHI
+Probabili.
+Vedere ":help todo" per una lista di problemi noti.
+.PP
+Si noti che un certo numero di comportamenti che possono essere considerati
+errori da qualcuno, sono in effetti causati da una riproduzione fin troppo
+fedele del comportamento di Vi.
+Se ritenete che altre cose siano errori "perch Vi si comporta diversamente",
+date prima un'occhiata al file vi_diff.txt
+(o battere :help vi_diff.txt da Vim).
+Date anche un'occhiata alle opzioni 'compatible' e 'cpoptions.
diff --git a/runtime/doc/vim-it.UTF-8.1 b/runtime/doc/vim-it.UTF-8.1
new file mode 100644
index 0000000..80c1826
--- /dev/null
+++ b/runtime/doc/vim-it.UTF-8.1
@@ -0,0 +1,566 @@
+.TH VIM 1 "22 febbraio 2002"
+.SH NOME
+vim \- VI Migliorato, un editor di testi per programmatori
+.SH SINTASSI
+.br
+.B vim
+[opzioni] [file ..]
+.br
+.B vim
+[opzioni] \-
+.br
+.B vim
+[opzioni] \-t tag
+.br
+.B vim
+[opzioni] \-q [file_errori]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH DESCRIZIONE
+.B Vim
+Un editore di testi, compatibile con, e migliore di, Vi.
+Può essere usato per editare qualsiasi file di testo.
+Particolarmente utile per editare programmi.
+.PP
+Ci sono parecchi miglioramenti rispetto a Vi: undo multipli,
+finestre e buffer multipli, evidenziazione sintattica, possibilità
+di modificare la linea di comando, completamento nomi file, help
+in linea, selezione testi in Modo Visual, etc..
+Vedere ":help vi_diff.txt" per un sommario delle differenze fra
+.B Vim
+e Vi.
+.PP
+Mentre usate
+.B Vim
+potete ricevere molto aiuto dal sistema di help online, col comando ":help".
+Vedere qui sotto la sezione AIUTO ONLINE.
+.PP
+Quasi sempre
+.B Vim
+viene invocato, per modificare un file, col comando
+.PP
+ vim nome_file
+.PP
+Più in generale
+.B Vim
+viene invocato con:
+.PP
+ vim [opzioni] [lista_file]
+.PP
+Se lista_file non è presente, l'editor inizia aprendo un buffer vuoto.
+Altrimenti, una e una sola delle quattro maniere indicate qui sotto può
+essere usata per scegliere uno o più file da modificare.
+.TP 12
+nome_file ..
+Una lista di nomi di file.
+Il primo di questi sarà il file corrente, e verrà letto nel buffer.
+Il cursore sarà posizionato sulla prima linea del buffer.
+Potete arrivare agli altri file col comando ":next".
+Per editare un file il cui nome inizia per "\-" premettete "\-\-" alla
+lista_file.
+.TP
+\-
+Il file da editare è letto dallo "stdin" [di solito, ma non
+necessariamente, il terminale \- NdT]. I comandi sono letti da "stderr",
+che dovrebbe essere un terminale [tty].
+.TP
+\-t {tag}
+Il file da editare e la posizione iniziale del cursore dipendono da "tag",
+una specie di "etichetta" a cui saltare.
+{tag} viene cercata nel file "tags", ed il file ad essa associato diventa
+quello corrente, ed il comando ad essa associato viene eseguito.
+Di solito si usa per programmi C, nel qual caso {tag} potrebbe essere un
+nome di funzione.
+L'effetto è che il file contenente quella funzione diventa il file corrente
+e il cursore è posizionato all'inizio della funzione.
+Vedere ":help tag\-commands".
+.TP
+\-q [file_errori]
+Inizia in Modo QuickFix [correzione veloce].
+Il file [file_errori] è letto e il primo errore è visualizzato.
+Se [file_errori] non è indicato, il suo nome è ottenuto dal valore
+dell'opzione 'errorfile' (che, se non specificata, vale "AztecC.Err"
+per l'Amiga, "errors.err" su altri sistemi).
+Si può saltare all'errore successivo col comando ":cn".
+Vedere ":help quickfix".
+.PP
+.B Vim
+si comporta in modo diverso se invocato con nomi differenti (il programma
+eseguibile "sottostante" può essere sempre lo stesso).
+.TP 10
+vim
+Modo Normal, comportamento normale.
+.TP
+ex
+Inizia in Modo "Ex".
+Si può passare in Modo Normal col comando ":vi".
+Si può invocare il Modo "Ex" anche con l'argomento "\-e".
+.TP
+view
+Inizia in Modo Read-only (Sola Lettura). Non potete modificare i file.
+Si può invocare il Modo Read-only anche con l'argomento "\-R".
+.TP
+gvim gview
+La versione GUI [Graphical User Interface].
+Apre una nuova finestra.
+Si può invocare il Modo GUI anche con l'argomento "\-g".
+.TP
+evim eview
+La versione GUI in Modo Easy (semplificata).
+Apre una nuova finestra.
+Si può invocare il Modo Easy anche con l'argomento "\-y".
+.TP
+rvim rview rgvim rgview
+Come sopra, ma con restrizioni ai comandi. Non si potranno eseguire comandi
+della shell o sospendere
+.B Vim.
+Si può chiedere la stessa cosa anche con l'argomento "\-Z".
+.SH OPZIONI
+Le opzioni possono essere in un ordine qualsiasi, prima o dopo i nomi di
+file. Opzioni che non necessitano un argomento possono essere specificate
+dietro a un solo "\-".
+.TP 12
++[numero]
+Per il primo file il cursore sarà posizionato sulla linea "numero".
+Se "numero" manca, il cursore sarà posizionato sull'ultima linea del file.
+.TP
++/{espressione}
+Per il primo file il cursore sarà posizionato alla
+prima occorrenza di {espressione}.
+Vedere ":help search\-pattern" per come specificare l'espressione.
+.TP
++{comando}
+.TP
+\-c {comando}
+{comando} sarà eseguito dopo che il
+primo file è stato letto.
+{comando} è interpretato come un comando Ex.
+Se il {comando} contiene spazi deve essere incluso fra doppi apici
+(o altro delimitatore, a seconda della shell che si sta usando).
+Esempio: vim "+set si" main.c
+.br
+Note: Si possono avere fino a 10 comandi "+" o "\-c".
+.TP
+\-S {file}
+I comandi contenuti in {file} sono eseguiti dopo la lettura del primo file.
+Equivalente a \-c "source {file}".
+{file} non può avere un nome che inizia per '\-'.
+Se {file} è omesso si usa "Session.vim" (funziona solo se \-S è l'ultimo
+argomento specificato).
+.TP
+\-\-cmd {comando}
+Come "\-c", ma il comando è eseguito PRIMA
+di eseguire qualsiasi file vimrc.
+Si possono usare fino a 10 di questi comandi, indipendentemente dai comandi
+"\-c".
+.TP
+\-A
+Se
+.B Vim
+è stato compilato con supporto Arabic per editare file con orientamento
+destra-sinistra e tastiera con mappatura Araba, questa opzione inizia
+.B Vim
+in Modo Arabic, cioè impostando 'arabic'.
+Altrimenti viene dato un messaggio di errore e
+.B Vim
+termina in modo anormale.
+.TP
+\-b
+Modo Binary (binario).
+Vengono impostate alcune opzioni che permettono di modificare un file
+binario o un programma eseguibile.
+.TP
+\-C
+Compatibile. Imposta l'opzione 'compatible'.
+In questo modo
+.B Vim
+ha quasi lo stesso comportamento di Vi, anche in presenza di un file
+di configurazione .vimrc [proprio di Vim, vi usa .exrc \- Ndt].
+.TP
+\-d
+Inizia in Modo Diff [differenze].
+Dovrebbero esserci come argomenti due o tre o quattro nomi di file.
+.B Vim
+aprirà tutti i file evidenziando le differenze fra gli stessi.
+Funziona come vimdiff(1).
+.TP
+\-d {dispositivo}
+Apre {dispositivo} per usarlo come terminale.
+Solo per l'Amiga.
+Esempio:
+"\-d con:20/30/600/150".
+.TP
+\-D
+Debugging. Vim si mette in Modo "debugging" a partire
+dall'esecuzione del primo comando da uno script.
+.TP
+\-e
+Eseguire
+.B Vim
+in Modo Ex, come se il programma eseguito sia "ex".
+.TP
+\-E
+Eseguire
+.B Vim
+in Modo Ex migliorato, come se il programma eseguito sia "exim".
+.TP
+\-f
+Direttamente [Foreground]. Per la versione GUI,
+.B Vim
+non crea [fork] una nuova finestra, indipendente dalla shell di invocazione.
+Per l'Amiga,
+.B Vim
+non è fatto ripartire per aprire una nuova finestra.
+Opzione da usare quando
+.B Vim
+è eseguito da un programma che attende la fine della
+sessione di edit (ad es. mail).
+Sull'Amiga i comandi ":sh" e ":!" non sono disponibili.
+.TP
+\-\-nofork
+Direttamente [Foreground]. Per la versione GUI,
+.B Vim
+non crea [fork] una nuova finestra, indipendente dalla shell di invocazione.
+.TP
+\-F
+Se
+.B Vim
+è stato compilato con supporto FKMAP per editare file con orientamento
+destra-sinistra e tastiera con mappatura Farsi, questa opzione inizia
+.B Vim
+in Modo Farsi, cioè impostando 'fkmap' e 'rightleft'.
+Altrimenti viene dato un messaggio di errore e
+.B Vim
+termina in modo anormale.
+.TP
+\-g
+Se
+.B Vim
+è stato compilato con supporto GUI, questa opzione chiede di usarla.
+Se Vim è stato compilato senza supporto GUI viene dato un messaggio di errore e
+.B Vim
+termina in modo anormale.
+.TP
+\-h
+Un po' di aiuto su opzioni e argomenti che si possono dare invocando Vim.
+Subito dopo
+.B Vim
+esce.
+.TP
+\-H
+Se
+.B Vim
+è stato compilato col supporto RIGHTLEFT per editare file con orientamento
+destra-sinistra e tastiera con mappatura Ebraica, questa opzione inizia
+.B Vim
+in Modo Ebraico, cioè impostando 'hkmap' e 'rightleft'.
+Altrimenti viene dato un messaggio di errore e
+.B Vim
+termina in modo anormale.
+.TP
+\-i {viminfo}
+Se è abilitato l'uso di un file viminfo, questa opzione indica il nome
+del file da usare invece di quello predefinito "~/.viminfo".
+Si può anche evitare l'uso di un file .viminfo, dando come nome "NONE".
+.TP
+\-L
+Equivalente a \-r.
+.TP
+\-l
+Modo Lisp.
+Imposta le opzioni 'lisp' e 'showmatch'.
+.TP
+\-m
+Inibisce modifica file.
+Annulla l'opzione 'write'.
+È ancora possibile modificare un buffer [in memoria \- Ndt], ma non scriverlo.
+.TP
+\-M
+Modifiche non permesse. Le opzioni 'modifiable' e 'write' sono annullate,
+in modo da impedire sia modifiche che riscritture. Da notare che queste
+opzioni possono essere abilitate in seguito, permettendo così modifiche.
+.TP
+\-N
+Modo "Non-compatibile". Annulla l'opzione 'compatible'.
+Così
+.B Vim
+va un po' meglio, ma è meno compatibile con Vi, anche in assenza di un
+file .vimrc.
+.TP
+\-n
+Inibisce l'uso di un file di swap.
+Il recupero dopo una caduta di macchina diventa impossibile.
+Utile per editare un file su un supporto molto lento (ad es. floppy).
+Il comando ":set uc=0" ha lo stesso effetto.
+Per abilitare il recupero usare ":set uc=200".
+.TP
+\-nb
+Diviene un Editor server per NetBeans. Vedere la documentazione per dettagli.
+.TP
+\-o[N]
+Apri N finestre in orizzontale.
+Se N manca, apri una finestra per ciascun file.
+.TP
+\-O[N]
+Apri N finestre, in verticale.
+Se N manca, apri una finestra per ciascun file.
+.TP
+\-R
+Modo Read-only (Sola Lettura).
+Imposta l'opzione 'readonly'.
+Si può ancora modificare il buffer, ma siete protetti da una riscrittura
+involontaria.
+Se volete davvero riscrivere il file, aggiungete un punto esclamativo
+al comando Ex, come in ":w!".
+L'opzione \-R implica anche l'opzione \-n (vedere sotto).
+L'opzione 'readonly' può essere annullata con ":set noro".
+Vedere ":help 'readonly'".
+.TP
+\-r
+Lista file di swap, assieme a dati utili per un recupero.
+.TP
+\-r {file}
+Modo Recovery (ripristino).
+Il file di swap è usato per recuperare una sessione di edit finita male.
+Il file di swap è un file con lo stesso nome file del file di testo
+editato, col suffisso ".swp".
+Vedere ":help recovery".
+.TP
+\-s
+Modo silenzioso. Solo quando invocato come "Ex" o quando l'opzione
+"\-e" è stata data prima dell'opzione "\-s".
+.TP
+\-s {scriptin}
+Lo script file {scriptin} è letto.
+I caratteri nel file sono interpretati come se immessi da voi.
+Lo stesso si può ottenere col comando ":source! {scriptin}".
+Se la fine del file di input viene raggiunta prima che Vim termini,
+l'ulteriore input viene preso dalla tastiera.
+.TP
+\-T {terminale}
+Dice a
+.B Vim
+quale tipo di terminale state usando.
+Utile solo se il terminale non viene riconosciuto correttamente da Vim.
+Dovrebbe essere un terminale noto a
+.B Vim
+(internamente) o definito nel file termcap o terminfo.
+.TP
+\-u {vimrc}
+Usa i comandi nel file {vimrc} per inizializzazioni.
+Tutte le altre inizializzazioni non sono eseguite.
+Usate questa opzione per editare qualche file di tipo speciale.
+Può anche essere usato per non fare alcuna inizializzazione dando
+come nome "NONE".
+Vedere ":help initialization" da vim per ulteriori dettagli.
+.TP
+\-U {gvimrc}
+Usa i comandi nel file {gvimrc} per inizializzazioni GUI.
+Tutte le altre inizializzazioni GUI non sono eseguite.
+Può anche essere usata per non fare alcuna inizializzazione GUI dando
+come nome "NONE".
+Vedere ":help gui-init" da vim per ulteriori dettagli.
+.TP
+\-V[N]
+Verboso. Vim manda messaggi relativi agli script file che esegue
+e quando legge o scrive un file viminfo. Il numero opzionale N è il valore
+dell'opzione 'verbose'.
+Il valore predefinito è 10.
+.TP
+\-v
+Inizia
+.B Vim
+in Modo Vi, come se il programma eseguibile fosse "vi". Questo ha
+effetto solo quando Vim viene invocato con il nome "ex".
+.TP
+\-w {scriptout}
+Ogni carattere immesso viene registrato nel file {scriptout},
+finché non uscite da
+.B Vim.
+Utile se si vuole creare uno script file da usare con "vim \-s" o
+":source!".
+Se il file {scriptout} esiste, quel che immettete viene aggiunto in fondo.
+.TP
+\-W {scriptout}
+Come \-w, ma uno script file esistente viene sovrascritto.
+.TP
+\-x
+Uso di cifratura nella scrittura dei file. E' necessario immettere
+una chiave di cifratura.
+.TP
+\-X
+Non connetterti al server X. Vim parte più rapidamente,
+ma il titolo della finestra e la clipboard non sono disponibili.
+.TP
+\-y
+Eseguire
+.B Vim
+in Modo Easy (semplificata), come se l'eseguibile invocato
+sia "evim" o "eview".
+Fa sì che
+.B Vim
+si comporti come un editor che usa solo il mouse e i caratteri.
+.TP
+\-Z
+Modo ristretto. Vim si comporta come se invocato con un nome
+che inizia per "r".
+.TP
+\-\-
+Specifica la fine delle opzioni.
+Argomenti specificati dopo questo sono considerati nomi file.
+Si può usare per editare un file il cui nome inizi per '-'.
+.TP
+\-\-echo\-wid
+Solo con GUI GTK: Visualizza Window ID su "stdout".
+.TP
+\-\-help
+Vim dà un messaggio ed esce, come con l'argomento "\-h".
+.TP
+\-\-literal
+Considera i nomi passati come argomenti letterali, senza espandere
+metacaratteri. Non necessario in Unix, la shell espande i metacaratteri.
+.TP
+\-\-noplugin
+Non caricare plugin. Implicito se si specifica \-u NONE.
+.TP
+\-\-remote
+Connettersi a un server Vim e chiedere di editare i file elencati come altri
+argomenti. Se non si trova un server viene dato un messaggio e i file sono
+editati nel Vim corrente.
+.TP
+\-\-remote\-expr {expr}
+Connettersi a un server Vim, valutare ivi {expr} e stampare il risultato
+su "stdout".
+.TP
+\-\-remote\-send {chiavi}
+Connettersi a un server Vim e spedirgli {chiavi}.
+.TP
+\-\-remote\-silent
+Come \-\-remote, ma senza avvisare se non si trova un server.
+.TP
+\-\-remote-wait
+Come \-\-remote, ma Vim non termina finché i file non sono stati editati.
+.TP
+\-\-remote\-wait\-silent
+Come \-\-remote\-wait, ma senza avvisare se non si trova un server.
+.TP
+\-\-serverlist
+Lista i nomi di tutti i server Vim disponibili.
+.TP
+\-\-servername {nome}
+Usa {nome} come nome server. Usato per il Vim corrente, a meno che sia
+usato con l'argomento \-\-remote, nel qual caso indica il server a cui
+connettersi.
+.TP
+\-\-socketid {id}
+Solo con GUI GTK: Usa il meccanismo GtkPlug per eseguire gvim in un'altra
+finestra.
+.TP
+\-\-version
+Stampa la versione di Vim ed esci.
+.SH AIUTO ONLINE
+Battere ":help" in
+.B Vim
+per iniziare.
+Battere ":help argomento" per ricevere aiuto su uno specifico argomento.
+Per esempio: ":help ZZ" per ricevere aiuto sul comando "ZZ".
+Usare <Tab> e CTRL\-D per completare gli argomenti
+(":help cmdline\-completion").
+Ci sono "tag" nei file di help per saltare da un argomento a un altro
+(simili a legami ipertestuali, vedere ":help").
+Tutti i file di documentazione possono essere navigati così. Ad es.:
+":help syntax.txt".
+.SH FILE
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+I file di documentazione di
+.B Vim
+.
+Usate ":help doc\-file\-list" per avere la lista completa.
+.TP
+/usr/local/lib/vim/doc/tags
+Il file di tags usato per trovare informazioni nei file di documentazione.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Inizializzazioni sintattiche a livello di sistema.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+File di colorazione sintattica per vari linguaggi.
+.TP
+/usr/local/lib/vim/vimrc
+Inizializzazioni
+.B Vim
+a livello di sistema.
+.TP
+~/.vimrc
+Le vostre personali inizializzazioni di
+.B Vim
+.
+.TP
+/usr/local/lib/vim/gvimrc
+Inizializzazioni gvim a livello di sistema.
+.TP
+~/.gvimrc
+Le vostre personali inizializzazioni di gvim.
+.TP
+/usr/local/lib/vim/optwin.vim
+Script Vim usato dal comando ":options", un modo semplice
+per visualizzare e impostare opzioni.
+.TP
+/usr/local/lib/vim/menu.vim
+Inizializzazioni del menù gvim a livello di sistema.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Script Vim per generare una segnalazione di errore. Vedere ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Script Vim per determinare il tipo di un file a partire dal suo nome.
+Vedere ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Script Vim per determinare il tipo di un file a partire dal suo contenuto.
+Vedere ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+File usati per stampa PostScript.
+.PP
+Per informazioni aggiornate [in inglese \- NdT] vedere la home page di Vim:
+.br
+<URL:http://www.vim.org/>
+.SH VEDERE ANCHE
+vimtutor(1)
+.SH AUTORE
+Buona parte di
+.B Vim
+è stato scritto da Bram Moolenaar, con molto aiuto da altri.
+Vedere ":help credits" in
+.B Vim.
+.br
+.B Vim
+è basato su Stevie, scritto da: Tim Thompson,
+Tony Andrews e G.R. (Fred) Walter.
+In verità, poco o nulla è rimasto del loro codice originale.
+.SH BACHI
+Probabili.
+Vedere ":help todo" per una lista di problemi noti.
+.PP
+Si noti che un certo numero di comportamenti che possono essere considerati
+errori da qualcuno, sono in effetti causati da una riproduzione fin troppo
+fedele del comportamento di Vi.
+Se ritenete che altre cose siano errori "perché Vi si comporta diversamente",
+date prima un'occhiata al file vi_diff.txt
+(o battere :help vi_diff.txt da Vim).
+Date anche un'occhiata alle opzioni 'compatible' e 'cpoptions.
diff --git a/runtime/doc/vim-ja.UTF-8.1 b/runtime/doc/vim-ja.UTF-8.1
new file mode 100644
index 0000000..e18211e
--- /dev/null
+++ b/runtime/doc/vim-ja.UTF-8.1
@@ -0,0 +1,492 @@
+.TH VIM 1 "2021 Jun 13"
+.SH 名前
+vim \- Vi IMproved, プログラマのテキストエディタ
+.SH 書式
+.br
+.B vim
+[options] [file ..]
+.br
+.B vim
+[options] \-
+.br
+.B vim
+[options] \-t tag
+.br
+.B vim
+[options] \-q [errorfile]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH 説明
+.B Vim
+は Vi 互換のテキストエディタです。
+どのような種類のプレインテキストでも編集できます。
+特に、プログラムの編集に力を発揮します。
+.PP
+Vi に多くの改良が加えられています:
+多段アンドゥ、マルチウィンドウ、マルチバッファ、構文強調表示、コマンドライン編集、ファイル名補完、ヘルプ、ビジュアル選択、などなど。
+.B Vim
+と Vi の違いについての要約は ":help vi_diff.txt" を参照してください。
+.PP
+.B Vim
+の実行中は ":help" コマンドでヘルプを引くことができます。
+下記、オンラインヘルプの項を参照してください。
+.PP
+.B Vim
+は次のようなコマンドで起動できます。
+.PP
+ vim file
+.PP
+正確な書式は次の通りです:
+.PP
+ vim [options] [filelist]
+.PP
+filelist を省略した場合は、空のバッファが開かれます。
+指定した場合は、以下の四つのうちどれか一つの方法でファイルが開かれます。
+.TP 12
+file ..
+ファイルのリスト。
+一番目のファイルがカレントファイルになり、バッファに読み込まれます。
+カーソルは、バッファの一行目に置かれます。
+他のファイルを表示するには ":next" コマンドを使ってください。
+ファイル名がダッシュで始まるファイルを開く場合は、
+filelist の前に "\-\-" を指定してください。
+.TP
+\-
+ファイルは標準入力から読み込まれます。コマンドは標準エラー
+(ttyからの入力になっているはず) から読み込まれます。
+.TP
+\-t {tag}
+開くファイルとカーソルの初期位置は "tag" に依存します。goto label の一種です。
+tags ファイルから {tag} が検索され、関連したファイルがカレントファイルになります。
+そして、関連したコマンドが実行されます。
+これは主に C 言語のファイルを開くときに使われます。
+その場合 {tag} に関数などを指定して使います。
+関数を含んでいるファイルが開かれ、その関数の先頭にカーソルが移動する、という動作になります。
+詳しくは ":help tag\-commands" を参照してください。
+.TP
+\-q [errorfile]
+クイックフィックスモードで起動します。
+[errorfile] に指定したファイルが読み込まれ、最初のエラーが表示されます。
+[errorfile] を省略した場合は、オプション 'errorfile' が使われます
+(初期設定は、Amiga では "AztecC.Err"、その他のシステムでは "errors.err" です)。
+":cn" コマンドで次のエラーにジャンプできます。
+詳しくは ":help quickfix" を参照してください。
+.PP
+.B Vim
+は、起動されたときの実行ファイルの名前によって動作を変えます
+(実行ファイルの実体が同じであっても)。
+.TP 10
+vim
+"普通" に起動します。標準の状態です。
+.TP
+ex
+Ex モードで起動します。
+ノーマルモードに切り替えるには ":vi" コマンドを使ってください。
+引数に "\-e" を指定した場合と同じです。
+.TP
+view
+読み込み専用モードで起動します。ファイルの保存が制限されます。
+引数に "\-R" を指定した場合と同じです。
+.TP
+gvim gview
+GUI バージョン。
+新しいウィンドウを開いて起動します。
+引数に "\-g" を指定した場合と同じです。
+.TP
+evim eview
+簡易モードの GUI バージョン。
+新しいウィンドウを開いて起動します。
+引数に "\-y" を指定した場合と同じです。
+.TP
+rvim rview rgvim rgview
+上記と同じですが、制限モードで起動します。シェルコマンドを実行したり、
+.B Vim
+をサスペンドしたりできなくなります。
+引数に "\-Z" を指定した場合と同じです。
+.SH オプション
+ファイル名の前でも後ろでも、好きな順番でオプションを指定できます。
+パラメータを必要としない引数は、一つのダッシュにまとめて指定できます。
+.TP 12
++[num]
+一番目のファイルの "num" 行目にカーソルを移動します。
+"num" を省略した場合は、一行目にカーソルが移動します。
+.TP
++/{pat}
+一番目のファイルの、最初に {pat} が見つかった行にカーソルが移動します。
+検索パターンについては ":help search\-pattern" を参照してください。
+.TP
++{command}
+.TP
+\-c {command}
+一番目のファイルが読み込まれた後に {command} が実行されます。
+{command} は Ex コマンドとして解釈されます。
+{command} に空白を含める場合は、ダブルクォートで囲んでください (シェルに依存)。
+例: vim "+set si" main.c
+.br
+Note: "+" と "\-c" は合わせて 10 個まで指定できます。
+.TP
+\-S {file}
+一番目のファイルが読み込まれた後に {file} が実行されます。
+これは \-c "source {file}" と同じ動作です。
+{file} の先頭が '\-' の場合は使えません。
+{file} が省略された場合は、"Session.vim" が使われます
+(ただし \-S が最後の引数だった場合のみ)。
+.TP
+\-\-cmd {command}
+"\-c" と同じですが、vimrc を処理する前にコマンドが実行されます。
+これらのコマンドは "\-c" コマンドとは別に、10 個まで指定できます。
+.TP
+\-A
+アラビア語がサポートされていて、アラビア語キーマップがある場合は、アラビア語モードで起動します ('arabic' がオンになります)。
+右横書きのファイルを編集できます。
+サポートされていない場合はエラーメッセージを表示して終了します。
+.TP
+\-b
+バイナリモード。
+バイナリファイルを編集するためのオプションがいくつか設定されます。
+.TP
+\-C
+互換モード。'compatible' オプションがオンになります。
+ .vimrc ファイルの有無に関わらず、
+.B Vim
+の動作が Vi 互換になります。
+.TP
+\-d
+差分モードで起動します。
+2 個から 8 個のファイルを引数に指定してください。
+指定されたファイルが開かれ、それらのファイルの差分が表示されます。
+vimdiff(1) と同様の動作です。
+.TP
+\-d {device}
+{device} を端末として開きます。
+Amiga でのみ使います。
+例:
+"\-d con:20/30/600/150".
+.TP
+\-D
+デバッグ。
+スクリプトの最初のコマンドが実行されるところからデバッグモードを開始します。
+.TP
+\-e
+Ex モードで起動します。
+実行ファイルの名前が "ex" の場合と同じです。
+.TP
+\-E
+改良版 Ex モードで起動します。
+実行ファイルの名前が "exim" の場合と同じです。
+.TP
+\-f
+フォアグラウンド。GUI バージョンで、プロセスをフォークしなくなります。
+Amiga の場合は、新しいウィンドウで再起動しなくなります。
+メールソフトなどから
+.B Vim
+を起動して、編集が終わるまで待機したいような場合に使ってください。
+Amiga では、":sh" と "!" コマンドは機能しなくなります。
+.TP
+\-\-nofork
+フォアグラウンド。GUI バージョンで、プロセスをフォークしなくなります。
+.TP
+\-F
+ペルシア語がサポートされていて、ペルシア語キーマップがある場合は、ペルシア語モードで起動します ('fkmap' と 'rightleft' がオンになります)。
+右横書きのファイルを編集できます。
+サポートされていない場合はエラーメッセージを表示して終了します。
+.TP
+\-g
+GUI がサポートされている場合は、GUI で起動します。
+サポートされていない場合はエラーメッセージを表示して終了します。
+.TP
+\-h
+コマンドライン引数やオプションのヘルプを表示して終了します。
+.TP
+\-H
+ヘブライ語がサポートされていて、ヘブライ語キーマップがある場合は、ヘブライ語モードで起動します ('hkmap' と 'rightleft' がオンになります)。
+右横書きのファイルを編集できます。
+サポートされていない場合はエラーメッセージを表示して終了します。
+.TP
+\-i {viminfo}
+初期設定の "~/.viminfo" の代わりに、viminfo ファイルを読み書きする際に使うファイル名を指定します。
+"NONE" を指定すると、.viminfo ファイルを使わないように設定できます。
+.TP
+\-L
+\-r と同じです。
+.TP
+\-l
+lisp モード。
+オプションの 'lisp' と 'showmatch' がオンになります。
+.TP
+\-m
+ファイルの変更を不可能にします。
+オプション 'write' がオフになります。
+バッファを変更することはできますが、ファイルを保存することはできません。
+.TP
+\-M
+変更を不可能にします。
+オプションの 'modifiable' と 'write' がオフになり、ファイルの変更と保存ができなくなります。
+Note: それらのオプションを設定すれば変更できるようになります。
+.TP
+\-N
+非互換モード。'compatible' オプションがオフになります。
+ .vimrc ファイルの有無に関わらず、
+.B Vim
+の改良された機能が有効になります。Vi との互換性が少し失われます。
+.TP
+\-n
+スワップファイルを使用しません。
+クラッシュしてもリカバリできなくなります。
+フロッピーディスクのような非常に低速なメディアのファイルを読み書きするときに便利です。
+":set uc=0" と設定しても同じです。
+戻すには ":set uc=200" と設定してください。
+.TP
+\-nb
+NetBeans と接続し、エディタサーバーになります。
+詳しくはヘルプを参照してください。
+.TP
+\-o[N]
+N 個のウィンドウを水平分割で開きます。
+N を省略した場合は、引数のファイルを個別のウィンドウで開きます。
+.TP
+\-O[N]
+N 個のウィンドウを垂直分割で開きます。
+N を省略した場合は、引数のファイルを個別のウィンドウで開きます。
+.TP
+\-p[N]
+N 個のタブページを開きます。
+N を省略した場合は、引数のファイルを個別のタブページで開きます。
+.TP
+\-R
+読み込み専用モード。
+オプション 'readonly' がオンになります。
+バッファを変更することはできますが、間違ってファイルを上書きしてしまうのを防ぐことができます。
+ファイルを保存したい場合は、":w!" のように、Ex コマンドに感嘆符を付けてください。
+\-R オプションは \-n オプションの効果も含んでいます (上記参照)。
+オプション 'readonly' は ":set noro" でオフにできます。
+詳しくは ":help 'readonly'" を参照してください。
+.TP
+\-r
+スワップファイルの一覧を表示します。リカバリに関する情報も表示されます。
+.TP
+\-r {file}
+リカバリモード。
+スワップファイルを使って、クラッシュした編集セッションを復活させます。
+スワップファイルは、ファイル名に ".swp" を加えた名前のファイルです。
+詳しくは ":help recovery" を参照してください。
+.TP
+\-s
+サイレントモード。"ex" という名前で起動するか、"\-e" オプションの後で
+"\-s" オプションが指定された場合のみ。
+.TP
+\-s {scriptin}
+{scriptin} をスクリプトファイルとして読み込まれます。
+ファイル中の文字列は、手で入力したときと同じように処理されます。
+これは ":source! {scriptin}" と同じ動作です。
+エディタが終了する前にファイルの終わりまで読み込んだ場合、それ以降はキーボードから入力を読み込みます。
+.TP
+\-T {terminal}
+端末の名前を指定します。
+端末が自動的に認識されない場合に使ってください。
+.B Vim
+が組み込みでサポートしている名前か、
+termcap または terminfo ファイルで定義されている名前を指定してください。
+.TP
+\-u {vimrc}
+{vimrc} ファイルを使って初期化します。
+他の初期化処理はスキップされます。
+特殊なファイルを編集する場合などに使ってください。
+すべての初期化をスキップするには "NONE" を指定してください。
+詳しくは ":help initialization" を参照してください。
+.TP
+\-U {gvimrc}
+{gvimrc} ファイルを使って GUI を初期化します。
+他の GUI の初期化はスキップされます。
+すべての GUI の初期化をスキップするには "NONE" を指定してください。
+詳しくは ":help gui\-init" を参照してください。
+.TP
+\-V[N]
+冗長モード。
+スクリプトファイルを実行したり viminfo ファイルを読み書きするたびにメッセージを表示します。
+N に指定した数値が 'verbose' に設定されます。
+省略した場合は 10 になります。
+.TP
+\-v
+Vi モードで起動します。
+実行ファイルの名前が "vi" の場合と同じです。
+実行ファイルの名前が "ex" の場合だけ効果があります。
+.TP
+\-w {scriptout}
+入力した文字を {scriptout} に記録します。
+"vim \-s" や "source!" で実行するためのスクリプトファイルを作成するのに便利です。
+{scriptout} ファイルがすでに存在した場合は追加保存されます。
+.TP
+\-W {scriptout}
+\-w と同じですが、ファイルがすでに存在した場合は上書きされます。
+.TP
+\-x
+ファイルを暗号化して書き込みます。暗号化キーの入力プロンプトが表示されます。
+.TP
+\-X
+X サーバーと通信しません。端末での起動時間を短くできます。
+しかし、ウィンドウタイトルの変更やクリップボードは使えなくなります。
+.TP
+\-y
+簡易モードで起動します。
+実行ファイルの名前が "evim" や "eview" の場合と同じです。
+.B Vim
+の動作がモードレスエディタ (click-and-type editor) のようになります。
+.TP
+\-Z
+制限モード。
+実行ファイルの名前が "r" で始まっている場合と同じです。
+.TP
+\-\-
+オプション指定の末尾を示す記号です。
+これ以降の引数はすべてファイル名として扱われます。
+ファイル名が '\-' で始まっているファイルを開くときに使ってください。
+.TP
+\-\-clean
+一切の個人設定 (vimrc、プラグイン、その他) を使用しません。
+ある問題がクリーンな Vim セットアップで再現するかを確認するのに有用です。
+.TP
+\-\-echo\-wid
+GTK GUI のみ: Window ID を標準出力に出力します。
+.TP
+\-\-help
+ヘルプを表示して終了します。"\-h" と同じです。
+.TP
+\-\-literal
+引数のファイル名をリテラル文字列として扱います。ワイルドカードを展開しません。
+Unix のように、シェルがワイルドカードを展開する場合は機能しません。
+.TP
+\-\-noplugin
+プラグインをロードしません。\-u NONE はこの動作を含んでいます。
+.TP
+\-\-remote
+Vim サーバーと通信し、引数に指定されたファイルを Vim サーバーで開きます。
+サーバーが存在しない場合は、エラーメッセージを表示され、起動中の Vim でファイルが開かれます。
+.TP
+\-\-remote\-expr {expr}
+Vim サーバーと通信し、{expr} に与えられた式を Vim サーバーで実行し、結果を標準出力に出力します。
+.TP
+\-\-remote\-send {keys}
+Vim サーバーと通信し、{keys} に与えられたキーを Vim サーバーに送信します。
+.TP
+\-\-remote\-silent
+\-\-remote と同じですが、サーバーが存在しなくてもエラーメッセージを表示しません。
+.TP
+\-\-remote\-wait
+\-\-remote と同じですが、ファイルが開かれるのを確認できるまで待機します。
+.TP
+\-\-remote\-wait\-silent
+\-\-remote\-wait と同じですが、サーバーが存在しなくてもエラーメッセージを表示しません。
+.TP
+\-\-serverlist
+Vim サーバーの一覧を表示します。
+.TP
+\-\-servername {name}
+サーバーの名前を {name} に設定します。
+\-\-remote 引数を指定しなかった場合は、起動中の Vim の名前として使われるので、後からその名前を使ってサーバー通信できます。
+.TP
+\-\-socketid {id}
+GTK GUI のみ: GtkPlug メカニズムを使って gvim を別のウィンドウの中で実行します。
+.TP
+\-\-startuptime {file}
+起動処理の間、経過時間のメッセージをファイル {fname} に書き出します。
+.TP
+\-\-version
+バージョン情報を表示して終了します。
+.SH オンラインヘルプ
+ヘルプを開くには、
+.B Vim
+の中で ":help" と入力してください。
+":help 調べたい項目" と入力すれば、指定した項目のヘルプが表示されます。
+例: "ZZ" コマンドのヘルプを表示するには ":help ZZ" と入力します。
+<Tab> や CTRL\-D を使って補完することもできます
+(":help cmdline\-completion" 参照)。
+ヘルプには、項目から項目へジャンプできるようにタグが埋め込まれています
+(ハイパーリンクのようなものです。":help" 参照)。
+すべてのヘルプファイルはこの方法で開くことができます。
+例: ":help syntax.txt"。
+.SH ファイル
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+.B Vim
+のヘルプファイル。
+ファイルの一覧は ":help doc\-file\-list" に記載されています。
+.TP
+/usr/local/lib/vim/doc/tags
+ヘルプを検索するための tags ファイル。
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+システムの構文定義初期化ファイル。
+.TP
+/usr/local/lib/vim/syntax/*.vim
+いろいろな言語用の構文定義ファイル。
+.TP
+/usr/local/lib/vim/vimrc
+システムの
+.B Vim
+初期化ファイル。
+.TP
+~/.vimrc
+ユーザーの
+.B Vim
+初期化ファイル。
+.TP
+/usr/local/lib/vim/gvimrc
+システムの gvim 初期化ファイル。
+.TP
+~/.gvimrc
+ユーザーの gvim 初期化ファイル。
+.TP
+/usr/local/lib/vim/optwin.vim
+":options" コマンドで使われるファイル。
+オプションを表示したり設定したりできます。
+.TP
+/usr/local/lib/vim/menu.vim
+システムのメニュー初期化ファイル。gvim で使います。
+.TP
+/usr/local/lib/vim/bugreport.vim
+バグレポートを生成するスクリプト。":help bugs" 参照。
+.TP
+/usr/local/lib/vim/filetype.vim
+ファイル名からファイルタイプを判定するスクリプト。":help 'filetype'" 参照。
+.TP
+/usr/local/lib/vim/scripts.vim
+ファイルの内容からファイルタイプを判定するスクリプト。":help 'filetype'" 参照。
+.TP
+/usr/local/lib/vim/print/*.ps
+PostScript 印刷に使われるファイル。
+.PP
+最新の情報は VIM のホームページを参照してください:
+.br
+<URL:http://www.vim.org/>
+.SH 関連項目
+vimtutor(1)
+.SH 著者
+.B Vim
+のほとんどの機能は Bram Moolenaar が開発し、多くの人が協力しました。
+":help credits" を参照してください。
+.br
+.B Vim
+は Stevie を基にしています。Stevie は Tim Thompson、Tony Andrews、
+G.R. (Fred) Walter によって開発されました。
+ただし、オリジナルのコードはもうほとんど残っていません。
+.SH バグ
+既知のバグは ":help todo" に記載されています。
+.PP
+Vi の動作を忠実に再現した結果、多くの人がバグだと思うような機能もいくつかあります。
+"この動作は Vi と違う" からバグだと思った場合は、 vi_diff.txt を確認してみてください
+(ファイルを開くか、 Vim から ":help vi_diff.txt" と入力)。
+オプションの 'compatible' と 'cpoptions' も確認してください。
diff --git a/runtime/doc/vim-pl.1 b/runtime/doc/vim-pl.1
new file mode 100644
index 0000000..c1ec05f
--- /dev/null
+++ b/runtime/doc/vim-pl.1
@@ -0,0 +1,558 @@
+.TH VIM 1 "2006 kwi 11"
+.SH NAME
+vim \- Vi rozbudowany, edytor tekstu dla programisty
+.SH SYNOPSIS
+.br
+.B vim
+[opcje] [plik ..]
+.br
+.B vim
+[opcje] \-
+.br
+.B vim
+[opcje] \-t znacznik
+.br
+.B vim
+[opcje] \-q [plik_bdu]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH OPIS
+.B Vim
+jest edytorem tekstu kompatybilnym z Vi. Moe by
+uywany do edycji wszelkiego rodzaju plikw tekstowych.
+Uyteczny zwaszcza przy edycji programw.
+.PP
+Posiada wiele usprawnie w porwnaniu z Vi: wielopoziomowe cofanie zmian,
+wiele okien i buforw, podwietlanie skadni, edycja linii polece,
+uzupenianie nazw plikw, pomoc on-line, wizualna selekcja, itd.
+Zobacz ":help vi_diff.txt" dla podsumowania rnic pomidzy
+.B Vimem
+i Vi.
+.PP
+W czasie korzystania z
+.B Vima
+mona uzyska obszern pomoc z systemu pomocy on-line dziki poleceniu ":help".
+Zobacz rozdzia POMOC ON-LINE poniej.
+.PP
+Najczciej
+.B Vim
+jest uruchamiany do edycji pojedynczego pliku poleceniem
+.PP
+ vim plik
+.PP
+Bardziej oglnie
+.B Vim
+jest uruchamiany poprzez:
+.PP
+ vim [opcje] [lista plikw]
+.PP
+Jeli brak listy plikw edytor rozpocznie z pustym buforem. W innym
+wypadku istnieje dokadnie jedna z czterech moliwoci by wybra jeden
+lub wicej plikw do edycji.
+.TP 12
+plik ..
+Lista nazw plikw.
+Pierwsza nazwa bdzie nazw biecego pliku, ktry zostanie wczytany
+do bufora. Kursor zostanie umieszczony w pierwszym wierszu. Do
+kolejnych plikw mona przej dziki poleceniu ":next". By otworzy
+plik, ktrego nazwa zaczyna si od mylnika naley list plikw
+poprzedzi "\-\-".
+.TP
+\-
+Plik do edycji jest wczytany ze standardowego wejcia. Polecenia s
+odczytywane ze standardowego wyjcia bdw, ktrym powinien by
+terminal (tty).
+.TP
+\-t {znacznik}
+Plik do edycji i pocztkowa pozycja kursora zaley od "znacznika",
+rodzaju etykiety goto.
+{znacznika} szuka si w pliku tags, zwizany z nim plik staje si
+plikiem biecym i wykonuje si powizane polecenie.
+Zazwyczaj uywa si tego sposobu dla programw w C, w ktrych wypadku
+{znacznik} moe by nazw funkcji.
+W efekcie plik zawierajcy okrelon funkcj staje si plikiem
+biecym a kursor jest umieszczony na pocztku funkcji.
+Zobacz ":help tag-commands".
+.TP
+\-q [plik_bdw]
+Zacznij w trybie quickFix.
+Plik [plik_bdw] zostaje zinterpretowany i pokae si pierwszy bd.
+Jeli brak opcji [plik_bdw] nazwa pliku zostanie pobrana z opcji
+\&'errorfile' (domylnie "AztecC.Err" dla Amigi, "errros.err" dla innych
+systemw.
+Do kolejnych bdw mona przeskoczy dziki poleceniu ":cn".
+Zobacz ":help quickfix".
+.PP
+W zalenoci od wywoania
+.B Vim
+zachowuje si inaczej (program moe by cay czas tym samym
+plikiem).
+.TP 10
+vim
+"Normalny" sposb, wszystko jest domylne.
+.TP
+ex
+Zacznij w trybie Ex.
+Przejd do trybu Normalnego poleceniem ":vi".
+Mona take uruchomi poprzez argument "\-e".
+.TP
+view
+Zacznij w trybie tylko do odczytu. W ten sposb bdziesz chroniony
+przed zapisywaniem pliku. Mona take uruchomi poprzez argument
+"\-R".
+.TP
+gvim gview
+Wersja GUI.
+Uruchamia nowe okno.
+Mona take uruchomi poprzez argument "\-g".
+.TP
+evim eview
+Wersja GUI w atwym trybie.
+Uruchamia nowe okno.
+Mona take uruchomi poprzez argument "\-y".
+.TP
+rvim rview rgvim rgview
+Podobnie jak powyej, ale z ograniczeniami. Nie bdzie mona uruchomi
+polece powoki lub zawiesi
+.B Vima.
+Mona take uruchomi poprzez argument "\-Z".
+.SH OPCJE
+Opcje mona poda w dowolnej kolejnoci, przed lub po nazwach plikw.
+Opcje bez argumentw mona czy po pojedynczym mylniku.
+.TP 12
++[num]
+W pierwszym pliku kursor zostanie umieszczony w wierszu "num".
+Jeli brak "num" kursor zostanie umieszczony w ostatnim wierszu.
+.TP
++/{wzr}
+W pierwszym pliku kursor zostanie umieszczony na pierwszym wystpieniu
+{wzr}.
+Zobacz ":help search-pattern" by dowiedzie si jakie s moliwe
+wzorce wyszukiwania.
+.TP
++{polecenie}
+.TP
+\-c {polecenie}
+{polecenie} zostanie wykonane po tym jak wczyta si pierwszy plik.
+{polecenie} jest interpretowane jako polecenie Ex.
+Jeli {poleceni} zawiera biae znaki musi by umieszczone w podwjnych
+cudzysowach (zaley to od uywanej powoki).
+Przykad: vim "+set si" main.c
+.br
+Uwaga: Mona uy do 10 polece "+" lub "\-c".
+.TP
+\-S {plik}
+{plik} zostanie zinterpretowany po wczytaniu pierwszego pliku.
+Jest rwnowane \-c "source {plik}".
+{plik} nie moe zaczyna si '\-'.
+Jeli nie podano {plik} zostanie uyty "Session.vim" (dziaa tylko
+wtedy jeli \-S jest ostatnim argumentem).
+.TP
+\-\-cmd {polecenie}
+Podobne do "\-c", ale polecenie jest wykonywane tu przed
+interpretacj jakiegokolwiek pliku vimrc.
+Mona uy do 10 takich polece, niezalenie od polece od "\-c"
+.TP
+\-A
+Jeli
+.B Vim
+zosta skompilowany ze wsparciem dla jzykw arabskich (edycja od
+prawej do lewej i arabska mapa klawiatury) ta opcja uruchamia
+.B Vima
+w trybie arabskim, np. ustawia si opcja 'arabic'. W innym wypadku
+pojawi si komunikat bdu i
+.B Vim
+zakoczy dziaanie.
+.TP
+\-b
+Tryb binarny.
+Ustawi si kilka opcji, ktre umoliwi edycj plikw binarnych lub
+wykonywalnych.
+.TP
+\-C
+Kompatybilny. Ustawia opcj 'compatible'.
+W ten sposb
+.B Vim
+bdzie zachowywa si jak Vi, nawet jeli istnieje plik .vimrc.
+.TP
+\-d
+Uruchom w trybie diff.
+Powinno si uy dwch, trzech lub czterech nazwy plikw jako argumentw.
+.B Vim
+otworzy wszystkie te pliki i pokae rnice midzy nimi.
+Dziaa jak vimdiff(1).
+.TP
+\-d {urzdzenie}
+Otwrz {urzdzenie} by uywa jako terminal.
+Tylko na Amidze.
+Przykad:
+"\-d con:20/30/600/150".
+.TP
+\-D
+Debugowanie. Przejd do trybu debugowanie wykonujc pierwsze polecenie
+ze skryptu.
+.TP
+\-e
+Uruchom
+.B Vima
+w trybie Ex, dziaa tak samo jakby wywoano program jako "ex".
+.TP
+\-E
+Uruchom
+.B Vima
+w ulepszonym trybie Ex, dziaa tak samo jakby wywoano program jako
+"exim".
+.TP
+\-f
+Pierszy plan. Dla wersji GUI.
+.B Vim
+nie nie oddzieli si od powoki w jakiej zosta uruchomiony. Na Amidze
+.B Vim
+nie jest uruchomiony ponownie by otworzy nowe okno.
+Opcja powinna by uyta kiedy
+.B Vim
+jest wywoywany przez program, ktry ma zaczeka na koniec sesji (np.
+mail).
+Na Amidze polecenia ":sh" i ":!" nie bd dziaa.
+.TP
+\-\-nofork
+Pierwszy plan. Dla wersji GUI.
+.B Vim
+nie oddzieli si od powoki w jakiej zosta uruchomiony.
+.TP
+\-F
+Jeli Vim zosta skompilowany ze wsparciem FKMAP dla edycji tekstw od
+prawej do lewej i mapowania klawiatury Farsi, ta opcja uruchomi
+.B Vima
+w trybie Farsi, np. zostawi ustawione opcje 'fkmap' i 'rightleft'.
+W innym wypadku pojawi si komunikat bdu i
+.B Vim
+zakoczy dziaanie.
+.TP
+\-g
+Jeli
+.B Vim
+zosta skompilowany ze wsparciem dla GUI ta opcja uruchomi GUI.
+W innym wypadku pojawi si komunikat bdu i
+.B Vim
+zakoczy dziaanie.
+.TP
+\-h
+Wywietli krtk pomoc o argumentach linii polece i opcjach. Potem
+.B Vim
+zakoczy dziaanie.
+.TP
+\-H
+Jeli
+.B Vim
+zosta skompilowany ze wsparciem RIGHTLEFT dla edycji od prawej do
+lewej oraz ma mapowanie klawiatury dla hebrajskiego, ta opcja uruchomi
+.B Vima
+w trybie hebrajskim, np. ustawi opcje 'hkmap' i 'rightleft'.
+W innym wypadku pojawi si komunikat bdu i
+.B Vim
+zakoczy dziaanie.
+.TP
+\-i {viminfo}
+Kiedy
+.B Vim
+uywa pliku viminfo ta opcja wskae jakiego pliku uy zamiast
+domylnego "~/.viminfo".
+Mona te omin uycie pliku .viminfo przez podanie nazwy "NONE".
+.TP
+\-L
+To samo co \-r.
+.TP
+\-l
+Tryb Lisp.
+Ustawia opcje 'lisp' i 'showmatch'.
+.TP
+\-m
+Zmiana pliku jest niemoliwa.
+Przestawia opcj 'write'.
+Mona zmienia zawarto bufora, ale zapisanie pliku nie jest
+moliwe.
+.TP
+\-M
+Opcje 'modifiable' i 'write' zostan wyczone, tak wic zmiany
+w pliku oraz ich zapisanie nie s moliwe. Warto tych opcji mona
+zmieni.
+.TP
+\-N
+Tryb niekompatybilny. Przestawia opcj 'compatible'. Dziki temu
+.B Vim
+bdzie zachowywa si odrobin lepiej, ale mniej zgodnie z Vi nawet
+jeli nie istnieje plik .vimrc.
+.TP
+\-n
+Nie powstanie plik wymiany. Odzyskanie pliku po wypadku nie bdzie
+moliwe.
+Wygodne jeli instnieje potrzeba edycji na bardzo wolnym medium (np.
+dyskietce). Ten cel mona osign take przez ":set uc=0". Mona
+odwrci przez ":set uc=200".
+.TP
+\-nb
+Uruchom jako serwer edytora dla NetBeans. Zobacz dokumentacj by
+dowiedzie si wicej.
+.TP
+\-o[N]
+Otwrz N okien w stosie.
+Kiedy brak N, otwrz jedno okno dla kadego pliku.
+.TP
+\-O[N]
+Otwrz N okien obok siebie.
+Kiedy brak N, otwrz jedno okno dla kadego pliku.
+.TP
+\-p[N]
+Otwrz N kart.
+Kiedy brak N, otwrz jedn kart dla kadego pliku.
+.TP
+\-R
+Tryb tylko do odczytu.
+Zostanie ustawiona opcja 'readonly'.
+Cay czas mona zmienia bufor, ale bdzie istniaa blokada by chroni
+przed przypadkowym zapisaniem pliku.
+Jeli chcesz zapisa plik dodaj wykrzyknik do polecenia Ex, np. ":w!".
+Opcja \-R implikuje opcj \-n (zobacz poniej).
+Opcja 'readonly' moe zosta przestawiona poprzez ":set noro".
+Zobacz ":help 'readonly'".
+.TP
+\-r
+Wypisz list plikw wymiany razem z informacjami o nich.
+.TP
+\-r {plik}
+Tryb odzyskiwania danych.
+Plik wymiany zostanie wykorzystany do odzyskania gwatownie przerwanej sesji.
+Plik wymiany to plik z tak sam nazw co plik oryginalny z dodanym ".swp".
+Zobacz ":help recovery".
+.TP
+\-s
+Tryb cichy. Rozpoczty tylko kiedy uruchomiony jako "Ex" lub opcja
+"\-e" zostaa podana przed opcj "\-s".
+.TP
+\-s {skrypt}
+Zostanie wczytany plik {skrypt}.
+Znaki w pliku zostan zinterpretowane jakby byy wpisywane.
+To samo mona osign poprzez polecenie ":source! {skrypt}".
+Jeli osignito koniec pliku zanim edytor zakoczy dziaanie, dalsze
+znaki odczytywane s z klawiatury.
+.TP
+\-T {terminal}
+Przekazuje
+.B Vimowi
+nazw terminalu jakiego uywasz.
+Wymagane tylko wtedy jeli nie dziaa automatycznie.
+Powinien by to terminal znany
+.B Vimowi
+(builtin) lub zdefiniowany w plikach termcap lub terminfo.
+.TP
+\-u {vimrc}
+Uyj polece z pliku {vimrc} w czasie uruchamiania.
+Wszystkie inne moliwe pliki uruchamiania zostan pominite.
+Uywaj do edytowania plikw specjalnych.
+Mona pomin take wszystkie moliwe pliki uruchamiania poprzez
+podanie nazwy "NONE".
+Zobacz ":help initialization" by pozna wicej szczegw.
+.TP
+\-U {gvimrc}
+Uyj polece z pliku {gvimrc} w czasie uruchamiania GUI.
+Wszystkie inne moliwe pliki uruchamiania GUI zostan pominite.
+Mona pomin take wszystkie moliwe pliki uruchamiania GUI poprzez
+podanie nazwy "NONE".
+Zobacz ":help gui-init" by pozna wicej szczegw.
+.TP
+\-V[N]
+Tryb gadatliwy. Wypisz wiadomoci o tym jaki pliki s wczytywane
+i o informacjach pobieranych i dodawanych do pliku viminfo. Opcjonalny
+argument N jest wartoci 'verbose'. Domylnie 10.
+.TP
+\-v
+Uruchom
+.B Vima
+w trybie Vi, tak jakby program by nazwany "vi". Ma znaczenie
+tylko wtedy jeli program nazwany jest "ex".
+.TP
+\-w {plik}
+Wszystkie wcinicia klawiszy, a do zakoczenia dziaania programu,
+s zapisywane w {plik} .
+Uyteczne jeli chce si stworzy skrypt do uycia z "vim \-s" lub
+":source!".
+Jeli {plik} istnieje, znaki s dopisywane.
+.TP
+\-W {plik}
+Podobnie do \-w, ale istniejcy plik jest nadpisywany.
+.TP
+\-x
+Uyj szyfrowania podczas zapisywania plikw. Zostaniesz poproszony
+o podanie klucza.
+.TP
+\-X
+Nie cz z serwerem X. Skraca czas uruchamiania w terminalu, ale tytu
+okna i schowek nie bd wykorzystywane.
+.TP
+\-y
+Uruchom
+.B Vima
+w atwym trybie, tak jakby program zosta wywoany "evim" lub "eview".
+.B Vim
+bdzie zachowywa si bardziej jak edytor kliknij-i-wpisz.
+.TP
+\-Z
+Tryb ograniczony. Zachowuje si jakby nazwa programu zaczynaa si od
+"r".
+.TP
+\-\-
+Oznacza koniec opcji.
+Argumenty po tej opcji bd traktowane jak nazwy plikw. Uywa si do
+otwierania plikw, ktrych nazwy zaczynaj si od '\-'.
+.TP
+\-\-echo\-wid
+Wycznie GTK GUI: wypisz ID okna na standardowe wyjcie.
+.TP
+\-\-help
+Wywietl informacj o pomocy i zakoczy, to samo co"\-h".
+.TP
+\-\-literal
+Potraktuj nazwy plikw dosownie i nie rozwizuj kwantyfikatorw. Nie
+ma znaczenia na Uniksach gdzie powoka rozwizuje kwantyfikatory.
+.TP
+\-\-noplugin
+Pomi adowanie wtyczek. Implikowane przy \-u NONE.
+.TP
+\-\-remote
+Pocz si z serwerem Vima i edytuj w nim reszt plikw podanych jako
+argumenty. Jeli nie znaleziono serwera zostanie zgoszony bd a pliki zostan
+otwarte w biecym Vimie.
+.TP
+\-\-remote\-expr {wyraenie}
+Pocz z serwerem Vima, rozwi w nim {wyraenie} i wypisz rozwizanie
+na standardowe wyjcie.
+.TP
+\-\-remote\-send {klawisze}
+Pocz z serwerem Vima i wylij do niego {klawisze}.
+.TP
+\-\-remote\-silent
+Tak samo jak \-remote, ale bez ostrzeenia kiedy nie znaleziono
+serwera.
+.TP
+\-\-remote\-wait
+Tak samo jak \-remote, ale Vim nie zakoczy dopki pliki pozostan
+otwarte.
+.TP
+\-\-remote\-wait\-silent
+Tak samo jak \-\-remote\-wait, ale bez ostrzeenie kiedy nie
+znaleziono serwera.
+.TP
+\-\-serverlist
+Wypisz nazwy wszystkich serwerw Vima jakie mona znale.
+.TP
+\-\-servername {nazwa}
+Uyj {nazwa} jako nazwy serwera. Wykorzystane dla biecego Vima o ile
+nie poczone z argumentem \-\-remote, wtedy jest to nazwa serwera do
+poczenia.
+.TP
+\-\-socketid {id}
+Wycznie GTK GUI: Uyj mechanizmu GtkPlug by uruchomi gvima w innym
+oknie.
+.TP
+\-\-version
+Wypisz informacj o wersji i zakocz.
+.SH POMOC ON-LINE
+By rozpocz wpisz ":help" w
+.B Vimie
+Wpisz ":help temat" by uzyska pomoc na okrelony temat.
+Przykad: ":help ZZ" by uzyska pomoc na temat polecenia "ZZ".
+Uyj <Tab> i CTRL\-D aby uzupeni tematy (":help
+cmdline\-completion"). W plikach pomocy istniej znaczniki by uatwi
+skakanie z jednego miejsca do innego (rodzaj linkw hipertekstowych,
+zobacz ":help").
+Mona w ten sposb zobaczy ca dokumentacj, np. ":help syntax.txt".
+.SH PLIKI
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+Dokumentacja
+.B Vima
+Uyj ":help doc\-file\-list" aby uzyska pen list.
+.TP
+/usr/local/lib/vim/doc/tags
+Plik znacznikw suy do znajdowania informacji w plikach dokumentacji.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Globalne uruchamianie podwietlania skadni.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Pliki skadni dla rnych jzykw.
+.TP
+/usr/local/lib/vim/vimrc
+Globalny plik uruchamiania
+.B Vima
+.TP
+~/.vimrc
+Osobiste parametry uruchamiania
+.B Vima
+.TP
+/usr/local/lib/vim/gvimrc
+Globalne uruchamianie gvima.
+.TP
+~/.gvimrc
+Osobiste parametry uruchamiania gvima.
+.TP
+/usr/local/lib/vim/optwin.vim
+Skrypt uywany w poleceniu ":options", dobry sposb do przegldania
+i ustawiania opcji.
+.TP
+/usr/local/lib/vim/menu.vim
+Globalne uruchamianie menu gvima.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Skrypt sucy do tworzenia raportw o bdach. Zobacz ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Skrypt do wykrywania typu pliku wedug jego nazwy. Zobacz ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Skrypt do wykrywania typu pliku wedug jego zawartoci. Zobacz ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+Pliku uywane do drukowania PostScriptu.
+.PP
+Najwiesze wiadomoci na stronie
+.B Vima:
+.br
+<URL:http://www.vim.org/>
+.SH ZOBACZ TAKE
+vimtutor(1)
+.SH AUTOR
+.B Vim
+zosta napisany przez Brama Moolenaara z du pomoc innych osb.
+Zobacz ":help credits" w
+.B Vimie.
+.br
+.B Vim
+bazuje na Steviem, nad ktrym pracowali: Tim Thompson, Tony Andrews
+i G.R. (Fred) Walter.
+Mao ju zostao z oryginalnego kodu.
+.SH BDY
+Prawdopodobne.
+Zobacz ":help todo" by pozna list znanych problemw.
+.PP
+Pamitaj e pewna ilo problemw, ktre mog by uznawane przez
+niektrych ludzi za bdy s w rzeczywistoci spowodowane wiernoci
+w odtwarzaniu zachowania Vi.
+Jeli sdzisz, e inne rzeczy s bdami "poniewa Vi robi to
+inaczej", powiniene przyjrze si bliej plikowi vi_diff.txt (lub
+wpisa ":help vi_diff.txt" w Vimie).
+Sprawd take opis opcji 'compatible' i 'cpoptions'.
diff --git a/runtime/doc/vim-pl.UTF-8.1 b/runtime/doc/vim-pl.UTF-8.1
new file mode 100644
index 0000000..26c1b11
--- /dev/null
+++ b/runtime/doc/vim-pl.UTF-8.1
@@ -0,0 +1,558 @@
+.TH VIM 1 "2006 kwi 11"
+.SH NAME
+vim \- Vi rozbudowany, edytor tekstu dla programisty
+.SH SYNOPSIS
+.br
+.B vim
+[opcje] [plik ..]
+.br
+.B vim
+[opcje] \-
+.br
+.B vim
+[opcje] \-t znacznik
+.br
+.B vim
+[opcje] \-q [plik_błędu]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH OPIS
+.B Vim
+jest edytorem tekstu kompatybilnym z Vi. Może być
+używany do edycji wszelkiego rodzaju plików tekstowych.
+Użyteczny zwłaszcza przy edycji programów.
+.PP
+Posiada wiele usprawnień w porównaniu z Vi: wielopoziomowe cofanie zmian,
+wiele okien i buforów, podświetlanie składni, edycja linii poleceń,
+uzupełnianie nazw plików, pomoc on-line, wizualna selekcja, itd.
+Zobacz ":help vi_diff.txt" dla podsumowania różnic pomiędzy
+.B Vimem
+i Vi.
+.PP
+W czasie korzystania z
+.B Vima
+można uzyskać obszerną pomoc z systemu pomocy on-line dzięki poleceniu ":help".
+Zobacz rozdział POMOC ON-LINE poniżej.
+.PP
+Najczęściej
+.B Vim
+jest uruchamiany do edycji pojedynczego pliku poleceniem
+.PP
+ vim plik
+.PP
+Bardziej ogólnie
+.B Vim
+jest uruchamiany poprzez:
+.PP
+ vim [opcje] [lista plików]
+.PP
+Jeśli brak listy plików edytor rozpocznie z pustym buforem. W innym
+wypadku istnieje dokładnie jedna z czterech możliwości by wybrać jeden
+lub więcej plików do edycji.
+.TP 12
+plik ..
+Lista nazw plików.
+Pierwsza nazwa będzie nazwą bieżącego pliku, który zostanie wczytany
+do bufora. Kursor zostanie umieszczony w pierwszym wierszu. Do
+kolejnych plików można przejść dzięki poleceniu ":next". By otworzyć
+plik, którego nazwa zaczyna się od myślnika należy listę plików
+poprzedzić "\-\-".
+.TP
+\-
+Plik do edycji jest wczytany ze standardowego wejścia. Polecenia są
+odczytywane ze standardowego wyjścia błędów, którym powinien być
+terminal (tty).
+.TP
+\-t {znacznik}
+Plik do edycji i początkowa pozycja kursora zależy od "znacznika",
+rodzaju etykiety goto.
+{znacznika} szuka się w pliku tags, związany z nim plik staje się
+plikiem bieżącym i wykonuje się powiązane polecenie.
+Zazwyczaj używa się tego sposobu dla programów w C, w których wypadku
+{znacznik} może być nazwą funkcji.
+W efekcie plik zawierający określoną funkcję staje się plikiem
+bieżącym a kursor jest umieszczony na początku funkcji.
+Zobacz ":help tag-commands".
+.TP
+\-q [plik_błędów]
+Zacznij w trybie quickFix.
+Plik [plik_błędów] zostaje zinterpretowany i pokaże się pierwszy błąd.
+Jeśli brak opcji [plik_błędów] nazwa pliku zostanie pobrana z opcji
+\&'errorfile' (domyślnie "AztecC.Err" dla Amigi, "errros.err" dla innych
+systemów.
+Do kolejnych błędów można przeskoczyć dzięki poleceniu ":cn".
+Zobacz ":help quickfix".
+.PP
+W zależności od wywołania
+.B Vim
+zachowuje się inaczej (program może być cały czas tym samym
+plikiem).
+.TP 10
+vim
+"Normalny" sposób, wszystko jest domyślne.
+.TP
+ex
+Zacznij w trybie Ex.
+Przejdź do trybu Normalnego poleceniem ":vi".
+Można także uruchomić poprzez argument "\-e".
+.TP
+view
+Zacznij w trybie tylko do odczytu. W ten sposób będziesz chroniony
+przed zapisywaniem pliku. Można także uruchomić poprzez argument
+"\-R".
+.TP
+gvim gview
+Wersja GUI.
+Uruchamia nowe okno.
+Można także uruchomić poprzez argument "\-g".
+.TP
+evim eview
+Wersja GUI w łatwym trybie.
+Uruchamia nowe okno.
+Można także uruchomić poprzez argument "\-y".
+.TP
+rvim rview rgvim rgview
+Podobnie jak powyżej, ale z ograniczeniami. Nie będzie można uruchomić
+poleceń powłoki lub zawiesić
+.B Vima.
+Można także uruchomić poprzez argument "\-Z".
+.SH OPCJE
+Opcje można podać w dowolnej kolejności, przed lub po nazwach plików.
+Opcje bez argumentów można łączyć po pojedynczym myślniku.
+.TP 12
++[num]
+W pierwszym pliku kursor zostanie umieszczony w wierszu "num".
+Jeśli brak "num" kursor zostanie umieszczony w ostatnim wierszu.
+.TP
++/{wzór}
+W pierwszym pliku kursor zostanie umieszczony na pierwszym wystąpieniu
+{wzór}.
+Zobacz ":help search-pattern" by dowiedzieć się jakie są możliwe
+wzorce wyszukiwania.
+.TP
++{polecenie}
+.TP
+\-c {polecenie}
+{polecenie} zostanie wykonane po tym jak wczyta się pierwszy plik.
+{polecenie} jest interpretowane jako polecenie Ex.
+Jeśli {poleceni} zawiera białe znaki musi być umieszczone w podwójnych
+cudzysłowach (zależy to od używanej powłoki).
+Przykład: vim "+set si" main.c
+.br
+Uwaga: Można użyć do 10 poleceń "+" lub "\-c".
+.TP
+\-S {plik}
+{plik} zostanie zinterpretowany po wczytaniu pierwszego pliku.
+Jest równoważne \-c "source {plik}".
+{plik} nie może zaczynać się '\-'.
+Jeśli nie podano {plik} zostanie użyty "Session.vim" (działa tylko
+wtedy jeśli \-S jest ostatnim argumentem).
+.TP
+\-\-cmd {polecenie}
+Podobne do "\-c", ale polecenie jest wykonywane tuż przed
+interpretacją jakiegokolwiek pliku vimrc.
+Można użyć do 10 takich poleceń, niezależnie od poleceń od "\-c"
+.TP
+\-A
+Jeśli
+.B Vim
+został skompilowany ze wsparciem dla języków arabskich (edycja od
+prawej do lewej i arabska mapa klawiatury) ta opcja uruchamia
+.B Vima
+w trybie arabskim, np. ustawia się opcja 'arabic'. W innym wypadku
+pojawi się komunikat błędu i
+.B Vim
+zakończy działanie.
+.TP
+\-b
+Tryb binarny.
+Ustawi się kilka opcji, które umożliwią edycję plików binarnych lub
+wykonywalnych.
+.TP
+\-C
+Kompatybilny. Ustawia opcję 'compatible'.
+W ten sposób
+.B Vim
+będzie zachowywał się jak Vi, nawet jeśli istnieje plik .vimrc.
+.TP
+\-d
+Uruchom w trybie diff.
+Powinno się użyć dwóch, trzech lub czterech nazwy plików jako argumentów.
+.B Vim
+otworzy wszystkie te pliki i pokaże różnice między nimi.
+Działa jak vimdiff(1).
+.TP
+\-d {urządzenie}
+Otwórz {urządzenie} by używać jako terminal.
+Tylko na Amidze.
+Przykład:
+"\-d con:20/30/600/150".
+.TP
+\-D
+Debugowanie. Przejdź do trybu debugowanie wykonując pierwsze polecenie
+ze skryptu.
+.TP
+\-e
+Uruchom
+.B Vima
+w trybie Ex, działa tak samo jakby wywołano program jako "ex".
+.TP
+\-E
+Uruchom
+.B Vima
+w ulepszonym trybie Ex, działa tak samo jakby wywołano program jako
+"exim".
+.TP
+\-f
+Pierszy plan. Dla wersji GUI.
+.B Vim
+nie nie oddzieli się od powłoki w jakiej został uruchomiony. Na Amidze
+.B Vim
+nie jest uruchomiony ponownie by otworzyć nowe okno.
+Opcja powinna być użyta kiedy
+.B Vim
+jest wywoływany przez program, który ma zaczekać na koniec sesji (np.
+mail).
+Na Amidze polecenia ":sh" i ":!" nie będą działać.
+.TP
+\-\-nofork
+Pierwszy plan. Dla wersji GUI.
+.B Vim
+nie oddzieli się od powłoki w jakiej został uruchomiony.
+.TP
+\-F
+Jeśli Vim został skompilowany ze wsparciem FKMAP dla edycji tekstów od
+prawej do lewej i mapowania klawiatury Farsi, ta opcja uruchomi
+.B Vima
+w trybie Farsi, np. zostawią ustawione opcje 'fkmap' i 'rightleft'.
+W innym wypadku pojawi się komunikat błędu i
+.B Vim
+zakończy działanie.
+.TP
+\-g
+Jeśli
+.B Vim
+został skompilowany ze wsparciem dla GUI ta opcja uruchomi GUI.
+W innym wypadku pojawi się komunikat błędu i
+.B Vim
+zakończy działanie.
+.TP
+\-h
+Wyświetli krótką pomoc o argumentach linii poleceń i opcjach. Potem
+.B Vim
+zakończy działanie.
+.TP
+\-H
+Jeśli
+.B Vim
+został skompilowany ze wsparciem RIGHTLEFT dla edycji od prawej do
+lewej oraz ma mapowanie klawiatury dla hebrajskiego, ta opcja uruchomi
+.B Vima
+w trybie hebrajskim, np. ustawi opcje 'hkmap' i 'rightleft'.
+W innym wypadku pojawi się komunikat błędu i
+.B Vim
+zakończy działanie.
+.TP
+\-i {viminfo}
+Kiedy
+.B Vim
+używa pliku viminfo ta opcja wskaże jakiego pliku użyć zamiast
+domyślnego "~/.viminfo".
+Można też ominąć użycie pliku .viminfo przez podanie nazwy "NONE".
+.TP
+\-L
+To samo co \-r.
+.TP
+\-l
+Tryb Lisp.
+Ustawia opcje 'lisp' i 'showmatch'.
+.TP
+\-m
+Zmiana pliku jest niemożliwa.
+Przestawia opcję 'write'.
+Można zmieniać zawartość bufora, ale zapisanie pliku nie jest
+możliwe.
+.TP
+\-M
+Opcje 'modifiable' i 'write' zostaną wyłączone, tak więc zmiany
+w pliku oraz ich zapisanie nie są możliwe. Wartość tych opcji można
+zmienić.
+.TP
+\-N
+Tryb niekompatybilny. Przestawia opcję 'compatible'. Dzięki temu
+.B Vim
+będzie zachowywał się odrobinę lepiej, ale mniej zgodnie z Vi nawet
+jeśli nie istnieje plik .vimrc.
+.TP
+\-n
+Nie powstanie plik wymiany. Odzyskanie pliku po wypadku nie będzie
+możliwe.
+Wygodne jeśli instnieje potrzeba edycji na bardzo wolnym medium (np.
+dyskietce). Ten cel można osiągnąć także przez ":set uc=0". Można
+odwrócić przez ":set uc=200".
+.TP
+\-nb
+Uruchom jako serwer edytora dla NetBeans. Zobacz dokumentację by
+dowiedzieć się więcej.
+.TP
+\-o[N]
+Otwórz N okien w stosie.
+Kiedy brak N, otwórz jedno okno dla każdego pliku.
+.TP
+\-O[N]
+Otwórz N okien obok siebie.
+Kiedy brak N, otwórz jedno okno dla każdego pliku.
+.TP
+\-p[N]
+Otwórz N kart.
+Kiedy brak N, otwórz jedną kartę dla każdego pliku.
+.TP
+\-R
+Tryb tylko do odczytu.
+Zostanie ustawiona opcja 'readonly'.
+Cały czas można zmieniać bufor, ale będzie istniała blokada by chronić
+przed przypadkowym zapisaniem pliku.
+Jeśli chcesz zapisać plik dodaj wykrzyknik do polecenia Ex, np. ":w!".
+Opcja \-R implikuje opcję \-n (zobacz poniżej).
+Opcja 'readonly' może zostać przestawiona poprzez ":set noro".
+Zobacz ":help 'readonly'".
+.TP
+\-r
+Wypisz listę plików wymiany razem z informacjami o nich.
+.TP
+\-r {plik}
+Tryb odzyskiwania danych.
+Plik wymiany zostanie wykorzystany do odzyskania gwałtownie przerwanej sesji.
+Plik wymiany to plik z taką samą nazwą co plik oryginalny z dodanym ".swp".
+Zobacz ":help recovery".
+.TP
+\-s
+Tryb cichy. Rozpoczęty tylko kiedy uruchomiony jako "Ex" lub opcja
+"\-e" została podana przed opcją "\-s".
+.TP
+\-s {skrypt}
+Zostanie wczytany plik {skrypt}.
+Znaki w pliku zostaną zinterpretowane jakby były wpisywane.
+To samo można osiągnąć poprzez polecenie ":source! {skrypt}".
+Jeśli osiągnięto koniec pliku zanim edytor zakończył działanie, dalsze
+znaki odczytywane są z klawiatury.
+.TP
+\-T {terminal}
+Przekazuje
+.B Vimowi
+nazwę terminalu jakiego używasz.
+Wymagane tylko wtedy jeśli nie działa automatycznie.
+Powinien być to terminal znany
+.B Vimowi
+(builtin) lub zdefiniowany w plikach termcap lub terminfo.
+.TP
+\-u {vimrc}
+Użyj poleceń z pliku {vimrc} w czasie uruchamiania.
+Wszystkie inne możliwe pliki uruchamiania zostaną pominięte.
+Używaj do edytowania plików specjalnych.
+Można pominąć także wszystkie możliwe pliki uruchamiania poprzez
+podanie nazwy "NONE".
+Zobacz ":help initialization" by poznać więcej szczegółów.
+.TP
+\-U {gvimrc}
+Użyj poleceń z pliku {gvimrc} w czasie uruchamiania GUI.
+Wszystkie inne możliwe pliki uruchamiania GUI zostaną pominięte.
+Można pominąć także wszystkie możliwe pliki uruchamiania GUI poprzez
+podanie nazwy "NONE".
+Zobacz ":help gui-init" by poznać więcej szczegółów.
+.TP
+\-V[N]
+Tryb gadatliwy. Wypisz wiadomości o tym jaki pliki są wczytywane
+i o informacjach pobieranych i dodawanych do pliku viminfo. Opcjonalny
+argument N jest wartością 'verbose'. Domyślnie 10.
+.TP
+\-v
+Uruchom
+.B Vima
+w trybie Vi, tak jakby program był nazwany "vi". Ma znaczenie
+tylko wtedy jeśli program nazwany jest "ex".
+.TP
+\-w {plik}
+Wszystkie wciśnięcia klawiszy, aż do zakończenia działania programu,
+są zapisywane w {plik} .
+Użyteczne jeśli chce się stworzyć skrypt do użycia z "vim \-s" lub
+":source!".
+Jeśli {plik} istnieje, znaki są dopisywane.
+.TP
+\-W {plik}
+Podobnie do \-w, ale istniejący plik jest nadpisywany.
+.TP
+\-x
+Użyj szyfrowania podczas zapisywania plików. Zostaniesz poproszony
+o podanie klucza.
+.TP
+\-X
+Nie łącz z serwerem X. Skraca czas uruchamiania w terminalu, ale tytuł
+okna i schowek nie będą wykorzystywane.
+.TP
+\-y
+Uruchom
+.B Vima
+w łatwym trybie, tak jakby program został wywołany "evim" lub "eview".
+.B Vim
+będzie zachowywał się bardziej jak edytor kliknij-i-wpisz.
+.TP
+\-Z
+Tryb ograniczony. Zachowuje się jakby nazwa programu zaczynała się od
+"r".
+.TP
+\-\-
+Oznacza koniec opcji.
+Argumenty po tej opcji będą traktowane jak nazwy plików. Używa się do
+otwierania plików, których nazwy zaczynają się od '\-'.
+.TP
+\-\-echo\-wid
+Wyłącznie GTK GUI: wypisz ID okna na standardowe wyjście.
+.TP
+\-\-help
+Wyświetl informację o pomocy i zakończy, to samo co"\-h".
+.TP
+\-\-literal
+Potraktuj nazwy plików dosłownie i nie rozwiązuj kwantyfikatorów. Nie
+ma znaczenia na Uniksach gdzie powłoka rozwiązuje kwantyfikatory.
+.TP
+\-\-noplugin
+Pomiń ładowanie wtyczek. Implikowane przy \-u NONE.
+.TP
+\-\-remote
+Połącz się z serwerem Vima i edytuj w nim resztę plików podanych jako
+argumenty. Jeśli nie znaleziono serwera zostanie zgłoszony błąd a pliki zostaną
+otwarte w bieżącym Vimie.
+.TP
+\-\-remote\-expr {wyrażenie}
+Połącz z serwerem Vima, rozwiąż w nim {wyrażenie} i wypisz rozwiązanie
+na standardowe wyjście.
+.TP
+\-\-remote\-send {klawisze}
+Połącz z serwerem Vima i wyślij do niego {klawisze}.
+.TP
+\-\-remote\-silent
+Tak samo jak \-remote, ale bez ostrzeżenia kiedy nie znaleziono
+serwera.
+.TP
+\-\-remote\-wait
+Tak samo jak \-remote, ale Vim nie zakończy dopóki pliki pozostaną
+otwarte.
+.TP
+\-\-remote\-wait\-silent
+Tak samo jak \-\-remote\-wait, ale bez ostrzeżenie kiedy nie
+znaleziono serwera.
+.TP
+\-\-serverlist
+Wypisz nazwy wszystkich serwerów Vima jakie można znaleźć.
+.TP
+\-\-servername {nazwa}
+Użyj {nazwa} jako nazwy serwera. Wykorzystane dla bieżącego Vima o ile
+nie połączone z argumentem \-\-remote, wtedy jest to nazwa serwera do
+połączenia.
+.TP
+\-\-socketid {id}
+Wyłącznie GTK GUI: Użyj mechanizmu GtkPlug by uruchomić gvima w innym
+oknie.
+.TP
+\-\-version
+Wypisz informację o wersji i zakończ.
+.SH POMOC ON-LINE
+By rozpocząć wpisz ":help" w
+.B Vimie
+Wpisz ":help temat" by uzyskać pomoc na określony temat.
+Przykład: ":help ZZ" by uzyskać pomoc na temat polecenia "ZZ".
+Użyj <Tab> i CTRL\-D aby uzupełnić tematy (":help
+cmdline\-completion"). W plikach pomocy istnieją znaczniki by ułatwić
+skakanie z jednego miejsca do innego (rodzaj linków hipertekstowych,
+zobacz ":help").
+Można w ten sposób zobaczyć całą dokumentację, np. ":help syntax.txt".
+.SH PLIKI
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+Dokumentacja
+.B Vima
+Użyj ":help doc\-file\-list" aby uzyskać pełną listę.
+.TP
+/usr/local/lib/vim/doc/tags
+Plik znaczników służy do znajdowania informacji w plikach dokumentacji.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Globalne uruchamianie podświetlania składni.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Pliki składni dla różnych języków.
+.TP
+/usr/local/lib/vim/vimrc
+Globalny plik uruchamiania
+.B Vima
+.TP
+~/.vimrc
+Osobiste parametry uruchamiania
+.B Vima
+.TP
+/usr/local/lib/vim/gvimrc
+Globalne uruchamianie gvima.
+.TP
+~/.gvimrc
+Osobiste parametry uruchamiania gvima.
+.TP
+/usr/local/lib/vim/optwin.vim
+Skrypt używany w poleceniu ":options", dobry sposób do przeglądania
+i ustawiania opcji.
+.TP
+/usr/local/lib/vim/menu.vim
+Globalne uruchamianie menu gvima.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Skrypt służący do tworzenia raportów o błędach. Zobacz ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Skrypt do wykrywania typu pliku według jego nazwy. Zobacz ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Skrypt do wykrywania typu pliku według jego zawartości. Zobacz ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+Pliku używane do drukowania PostScriptu.
+.PP
+Najświeższe wiadomości na stronie
+.B Vima:
+.br
+<URL:http://www.vim.org/>
+.SH ZOBACZ TAKŻE
+vimtutor(1)
+.SH AUTOR
+.B Vim
+został napisany przez Brama Moolenaara z dużą pomocą innych osób.
+Zobacz ":help credits" w
+.B Vimie.
+.br
+.B Vim
+bazuje na Steviem, nad którym pracowali: Tim Thompson, Tony Andrews
+i G.R. (Fred) Walter.
+Mało już zostało z oryginalnego kodu.
+.SH BŁĘDY
+Prawdopodobne.
+Zobacz ":help todo" by poznać listę znanych problemów.
+.PP
+Pamiętaj że pewna ilość problemów, które mogą być uznawane przez
+niektórych ludzi za błędy są w rzeczywistości spowodowane wiernością
+w odtwarzaniu zachowania Vi.
+Jeśli sądzisz, że inne rzeczy są błędami "ponieważ Vi robi to
+inaczej", powinieneś przyjrzeć się bliżej plikowi vi_diff.txt (lub
+wpisać ":help vi_diff.txt" w Vimie).
+Sprawdź także opis opcji 'compatible' i 'cpoptions'.
diff --git a/runtime/doc/vim-ru.1 b/runtime/doc/vim-ru.1
new file mode 100644
index 0000000..dfcb3ec
--- /dev/null
+++ b/runtime/doc/vim-ru.1
@@ -0,0 +1,489 @@
+.TH VIM 1 "2002 Feb 22"
+.SH
+vim \- Vi IMproved ( Vi),
+.SH
+.br
+.B vim
+[] [ ..]
+.br
+.B vim
+[] \-
+.br
+.B vim
+[] \-t
+.br
+.B vim
+[] \-q [ ]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH
+.B Vim
+-- , - Vi.
+ .
+ .
+.PP
+ Vi,
+.B Vim
+ : ,
+ , , ,
+ ͣ , , ..
+. ":help vi_diff.txt"
+.B Vim
+ Vi.
+.PP
+
+.B Vim
+ ( ":help").
+. " " .
+.PP
+
+.B Vim
+
+.PP
+ vim
+.PP
+
+.B Vim
+ :
+.PP
+ vim [] [ ]
+.PP
+ , Σ .
+ ң :
+.TP 12
+ ..
+ ͣ .
+ . ݣ
+ . ̣
+ ":next". ,
+"" (-), "--".
+.TP
+\-
+ .
+ (stderr),
+.
+.TP
+\-t {}
+ "", goto.
+{} , ,
+ .
+ , {}
+.
+, , , .
+. ":help tag-commands".
+.TP
+\-q [ ]
+ .
+ [ ] .
+ [ ] , ң 'errorfile'
+( : "AztecC.Err" Amiga, "errors.err" ).
+ ":cn".
+. ":help quickfix".
+.PP
+.B Vim
+ģ - (
+ ).
+.TP 10
+vim
+"" , ӣ .
+.TP
+ex
+ Ex.
+ ":vi". Ex
+ "\-e".
+.TP
+view
+ " ".
+. "\-R".
+.TP
+gvim gview
+ . .
+ "\-g".
+.TP
+rvim rview rgvim rgview
+ , .
+
+.B Vim.
+ "r" "\-Z".
+.SH
+ , ͣ
+.
+.
+.TP 12
++[]
+ ݣ .
+ "" , ݣ .
+.TP
++/{}
+ ݣ
+ . . ":help search-pattern"
+ .
+.TP
++{}
+.TP
+\-c {}
+{} Ex.
+ {} ,
+ ( ).
+: vim "+set si" main.c
+.br
+: "+" "\-c".
+.TP
+\-\-cmd {}
+ "\-c",
+ (vimrc).
+ ,
+ "\-c".
+.TP
+\-A
+
+.B Vim
+ ,
+ , ,
+
+.B Vim
+ , 'arabic'.
+
+.B Vim
+ .
+.TP
+\-b
+ .
+ ,
+ .
+.TP
+\-C
+ . 'compatible'.
+.B Vim
+ Vi, .vimrc.
+.TP
+\-d
+ .
+ .
+.B Vim
+
+( vimdiff(1)).
+.TP
+\-d {}
+ {} ( Amiga).
+:
+"\-d con:20/30/600/150".
+.TP
+\-e
+
+.B Vim
+ Ex, "ex".
+.TP
+\-f
+ .
+.B Vim
+
+ ţ . Amiga
+.B Vim
+ . ,
+
+.B Vim
+ ,
+ (, ).
+ Amiga ":sh" ":!" .
+.TP
+\-\-nofork
+ .
+.B Vim
+
+ ţ .
+.TP
+\-F
+
+.B Vim
+ FKMAP
+ ,
+.B Vim
+ , , ޣ
+\&'fkmap' 'rightleft'.
+
+.B Vim
+ .
+.TP
+\-g
+
+.B Vim
+ ,
+ .
+.B Vim
+ .
+.TP
+\-h
+ .
+
+.B Vim
+ .
+.TP
+\-H
+
+.B Vim
+
+ ,
+.B Vim
+ , , ޣ 'hkmap' 'rightleft'.
+
+.B Vim
+ .
+.TP
+\-i {viminfo}
+ viminfo, (
+"~/.viminfo" ). viminfo
+ԣ "NONE".
+.TP
+\-L
+ , \-r.
+.TP
+\-l
+ Lisp. 'lisp' 'showmatch'.
+.TP
+\-m
+ . 'write',
+ .
+.TP
+\-N
+ . 'compatible'.
+.B Vim
+ , Vi,
+ (.vimrc).
+.TP
+\-n
+ -. .
+ (, ).
+ ":set uc=0". -- ":set uc=200".
+.TP
+\-o[N]
+ N , ̣ . N ,
+ .
+.TP
+\-O[N]
+ N , ̣ . N ,
+ .
+.TP
+\-R
+ " ". 'readonly'.
+ ,
+ .
+ Ex (, ":w!").
+ "\-R" , "\-n" (. ).
+ 'readonly' ":set noro".
+. ":help 'readonly'".
+.TP
+\-r
+ - .
+.TP
+\-r {}
+ .
+ -.
+- , , ".swp".
+. ":help recovery".
+.TP
+\-s
+ . "Ex" "\-s" "\-e".
+.TP
+\-s {scriptin}
+ {scriptin}. ,
+ , .
+ ":source! {scriptin}".
+ ,
+ .
+.TP
+\-T {terminal}
+
+.B Vim
+ . ,
+ .
+
+.B Vim
+( ) termcap terminfo.
+.TP
+\-u {vimrc}
+ {vimrc} .
+ .
+ .
+ ,
+ "NONE". . ":help initialization".
+.TP
+\-U {gvimrc}
+ {gvimrc}
+.
+ .
+ ,
+ "NONE". . ":help gui-init".
+.TP
+\-V
+"" . , ,
+- viminfo.
+.TP
+\-v
+
+.B Vim
+ Vi, "vi".
+ "ex".
+.TP
+\-w {scriptout}
+ , ģ ,
+ {scriptout}.
+ ,
+ "vim \-s" ":source!". {scriptout} ,
+ .
+.TP
+\-W {scriptout}
+ "\-w", .
+.TP
+\-x
+ . .
+.TP
+\-X
+ X-. ,
+ .
+.TP
+\-Z
+ . , , "r".
+.TP
+\-\-
+ . .
+ , .
+.TP
+\-\-help
+ . , "\-h".
+.TP
+\-\-version
+ .
+.TP
+\-\-remote
+ Vim ,
+ . , ,
+ Vim.
+.TP
+\-\-remote\-expr {}
+ Vim Σ {}.
+ (stdout).
+.TP
+\-\-remote\-send {}
+ Vim {}.
+.TP
+\-\-remote\-silent
+ "\-\-remote", , .
+.TP
+\-\-remote\-wait
+ "\-\-remote", Vim ,
+ .
+.TP
+\-\-remote\-wait\-silent
+ "\-\-remote\-wait", , .
+.TP
+\-\-serverlist
+ Vim.
+.TP
+\-\-servername {}
+ {} .
+"\-\-remote" , {} Vim,
+ ,
+.
+.TP
+\-\-socketid {id}
+ GTK: GtkPlug
+ gvim .
+.TP
+\-\-echo\-wid
+ GTK: (Window ID)
+ (stdout).
+.SH
+ , ":help".
+ ":help ", .
+, ":help ZZ" "ZZ".
+ <Tab> CTRL-D
+ (":help cmdline-completion").
+ (-
+ , . ":help").
+ , ":help syntax.txt".
+.SH
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+
+.B Vim.
+. ":help doc-file-list" .
+.TP
+/usr/local/lib/vim/doc/tags
+ , .
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+ .
+.TP
+/usr/local/lib/vim/syntax/*.vim
+ .
+.TP
+/usr/local/lib/vim/vimrc
+
+.B Vim.
+.TP
+/usr/local/lib/vim/gvimrc
+ .
+.TP
+/usr/local/lib/vim/optwin.vim
+, ":options".
+ .
+.TP
+/usr/local/lib/vim/menu.vim
+ gvim.
+.TP
+/usr/local/lib/vim/bugreport.vim
+ ޣ . . ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+ . . ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+ . . ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+ PostScript.
+.PP
+ -- VIM:
+.br
+<URL:http://www.vim.org/>
+.SH
+vimtutor(1)
+.SH
+
+.B Vim
+ (Bram Moolenaar),
+ . . ":help credits"
+.B Vim.
+.br
+.B Vim
+ Stevie, (Tim Thompson),
+ (Tony Andrews) . . () (G.R. (Fred) Walter).
+, Vim
+ .
+.br
+
+.B Vim
+ "",
+. <URL:http://sourceforge.net/projects/ruvim/>.
+.SH
+ .
+. ":help todo" -- .
+.PP
+, , ,
+ Vi.
+ , - ,
+"Vi -", vi_diff.txt
+( ":help vi_diff.txt" Vim) 'compatible'
+ 'cpoptions'.
diff --git a/runtime/doc/vim-ru.UTF-8.1 b/runtime/doc/vim-ru.UTF-8.1
new file mode 100644
index 0000000..ef52721
--- /dev/null
+++ b/runtime/doc/vim-ru.UTF-8.1
@@ -0,0 +1,489 @@
+.TH VIM 1 "2002 Feb 22"
+.SH ИМЯ
+vim \- Vi IMproved (Улучшенный Vi), текстовый редактор для программистов
+.SH КОМАНДНАЯ СТРОКА
+.br
+.B vim
+[ключи] [файл ..]
+.br
+.B vim
+[ключи] \-
+.br
+.B vim
+[ключи] \-t метка
+.br
+.B vim
+[ключи] \-q [файл ошибок]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH ОПИСАНИЕ
+.B Vim
+-- текстовый редактор, обратно-совместимый с Vi.
+Он может быть использован для правки всех видов простого текста.
+Особенно он хорош для правки исходных текстов программ.
+.PP
+По сравнению с Vi,
+.B Vim
+имеет много усовершенствований: многократная отмена операций,
+множественность окон и буферов, подсветка синтаксиса, правка командной строки,
+автодополнение имён файлов, встроенная справка, визуальное выделение и т.п.
+См. ":help vi_diff.txt" для получения полного списка различий между
+.B Vim
+и Vi.
+.PP
+Во время работы в
+.B Vim
+можно получить справку с помощью системы встроенной справки (команда ":help").
+См. раздел "ВСТРОЕННАЯ СПРАВКА" ниже по тексту.
+.PP
+Чаще всего
+.B Vim
+запускают для правки одного файла при помощи команды
+.PP
+ vim файл
+.PP
+В общем виде команда запуска
+.B Vim
+выглядит так:
+.PP
+ vim [ключи] [список файлов]
+.PP
+Если список файлов отсутствует, редактор начнёт работу с пустым буфером.
+В противном случае имя файла должно быть указано одним из следующих четырёх способов:
+.TP 12
+файл ..
+Список имён файлов.
+Первый файл будет объявлен активным и загружен в буфер. Курсор будет помещён
+в первой строке буфера. Доступ к другим файлам может быть осуществлён при
+помощи команды ":next". Чтобы править файл, имя которого начинается с символа
+"дефис" (-), перед списком файлов необходимо поставить "--".
+.TP
+\-
+Файл будет прочитан из потока стандартного ввода. Команды будут считываться
+из стандартного потока диагностики (stderr), который должен быть
+терминалом.
+.TP
+\-t {метка}
+Имя файла и начальная позиция курсора зависят от "метки", похожей на метку goto.
+{метка} ищется в файле меток, соответствующий файл становится активным, а
+соответствующая команда исполняется.
+Чаще всего используется в программах на языке Си, где {метка} может быть именем
+функции.
+Файл, содержащий функцию, становится активным, а курсор помещается в начало функции.
+См. ":help tag-commands".
+.TP
+\-q [файл ошибок]
+Начать работу в режиме быстрого исправления.
+При этом считывается [файл ошибок] и первая ошибка выводится на экран.
+Если [файл ошибок] не указан, имя файла берётся из значения опции 'errorfile'
+(по умолчанию: "AztecC.Err" для Amiga, "errors.err" для других систем).
+К следующим ошибкам можно перейти по команде ":cn".
+См. ":help quickfix".
+.PP
+.B Vim
+ведёт себя по-разному в зависимости от имени команды (исполняемый файл может
+быть одним и тем же).
+.TP 10
+vim
+"Нормальный" запуск, всё по умолчанию.
+.TP
+ex
+Запуск в режиме Ex. Для перехода в нормальный режим
+необходимо выполнить команду ":vi". Режим Ex включает
+также ключ "\-e".
+.TP
+view
+Запуск в режиме "только для чтения". Вы будете защищены от случайной записи
+файла. То же самое можно сделать ключом "\-R".
+.TP
+gvim gview
+Версия с графическим интерфейсом. Запускается в новом окне.
+То же самое можно сделать при запуске с ключом "\-g".
+.TP
+rvim rview rgvim rgview
+Как и предыдущие команды, но с ограничениями. Нельзя запускать команды оболочки
+или приостанавливать работу
+.B Vim.
+Вместо приставки "r" можно использовать ключ "\-Z".
+.SH КЛЮЧИ
+Ключи могут быть указаны в любом порядке, до или после имён
+файлов. Ключи без аргументов могут быть объединены под одним
+дефисом.
+.TP 12
++[номер]
+В первом файле курсор будет помещён на строку с указанным номером.
+Если "номер" не указан, курсор будет помещён на последнюю строку.
+.TP
++/{шаблон}
+В первом файле курсор будет помещён на место первого совпадения
+с указанным шаблоном. См. ":help search-pattern" для получения
+списка допустимых шаблонов.
+.TP
++{команда}
+.TP
+\-c {команда}
+{команда} исполняется после загрузки первого файла как команда Ex.
+Если {команда} содержит пробелы, то она должна быть заключена в
+двойные кавычки (в зависимости от используемой оболочки).
+Пример: vim "+set si" main.c
+.br
+Примечание: Можно указывать до десяти команд "+" или "\-c".
+.TP
+\-\-cmd {команда}
+Как "\-c", но команда исполняется перед обработкой любого файла
+настроек (vimrc).
+Можно указывать до десяти таких команд, независимо от количества
+команд "\-c".
+.TP
+\-A
+Если
+.B Vim
+был собран с поддержкой арабского языка для правки файлов,
+набранных справа налево, и с поддержкой арабской клавиатуры,
+этот ключ запускает
+.B Vim
+в арабском режиме, с включенной опцией 'arabic'. В противном
+случае
+.B Vim
+завершает работу с ошибкой.
+.TP
+\-b
+Двоичный режим.
+Производится настройка некоторых опций, делающих возможной правку
+двоичного или исполняемого файла.
+.TP
+\-C
+Режим совместимости. Включает опцию 'compatible'.
+.B Vim
+будет работать почти как Vi, даже если существует файл .vimrc.
+.TP
+\-d
+Режим поиска различий.
+Должно быть указано два или три имени файла.
+.B Vim
+откроет все файлы и покажет различия между ними
+(как vimdiff(1)).
+.TP
+\-d {устройство}
+Открыть {устройство} для использования в качестве терминала (только на Amiga).
+Пример:
+"\-d con:20/30/600/150".
+.TP
+\-e
+Запустить
+.B Vim
+в режиме Ex, как будто исполняемый файл имеет имя "ex".
+.TP
+\-f
+Режим активного приложения. Версия
+.B Vim
+с графическим интерфейсом не будет ветвиться и отключаться
+от запустившей её оболочки. На платформе Amiga
+.B Vim
+не будет создавать новое окно. Этот ключ нужно использовать,
+когда
+.B Vim
+запускается программой, которая должна ждать завершения
+сеанса правки (например, программа для работы с электронной почтой).
+На платформе Amiga команды ":sh" и ":!" не будут работать.
+.TP
+\-\-nofork
+Режим активного приложения. Версия
+.B Vim
+с графическим интерфейсом не будет ветвиться и отключаться
+от запустившей её оболочки.
+.TP
+\-F
+Если
+.B Vim
+был собран с поддержкой FKMAP для правки текста справа налево
+и настроек клавиатуры для языка фарси, этот ключ запускает
+.B Vim
+в режиме фарси, иначе говоря, с включёнными опциями
+\&'fkmap' и 'rightleft'.
+В противном случае
+.B Vim
+завершает работу с сообщением об ошибке.
+.TP
+\-g
+Если
+.B Vim
+был собран с поддержкой графического интерфейса, этот ключ
+включает графический интерфейс. В противном случае
+.B Vim
+завершает работу с сообщением об ошибке.
+.TP
+\-h
+Выводит краткую информацию об аргументах и ключах командной строки.
+После этого
+.B Vim
+завершает работу.
+.TP
+\-H
+Если
+.B Vim
+был собран с поддержкой правки текста справа налево
+и настроек клавиатуры для иврита, этот ключ запускает
+.B Vim
+в режиме иврита, иначе говоря, с включёнными опциями 'hkmap' и 'rightleft'.
+В противном случае
+.B Vim
+завершает работу с сообщением об ошибке.
+.TP
+\-i {viminfo}
+Если используется файл viminfo, то этот ключ задаёт имя такого файла (вместо
+"~/.viminfo" по умолчанию). Можно также избежать использования файла viminfo
+путём указания имени "NONE".
+.TP
+\-L
+То же, что и \-r.
+.TP
+\-l
+Режим Lisp. Включаются опции 'lisp' и 'showmatch'.
+.TP
+\-m
+Изменение файлов запрещено. При этом отключается опция 'write', поэтому
+запись файлов становится невозможной.
+.TP
+\-N
+Режим неполной совместимости. Отключается 'compatible'.
+.B Vim
+будет работать лучше, но не будет полностью совместим с Vi, даже если
+отсутствует файл сценария настроек (.vimrc).
+.TP
+\-n
+Не использовать своп-файл. Восстановление при сбое в работе будет невозможно.
+Удобно для правки файла на очень медленном носителе (например, гибком диске).
+То же самое можно сделать командой ":set uc=0". Отмена -- ":set uc=200".
+.TP
+\-o[N]
+Открыть N окон, разделённых по горизонтали. Если N не указано, то открывается
+по одному окну на каждый файл.
+.TP
+\-O[N]
+Открыть N окон, разделённых по вертикали. Если N не указано, то открывается
+по одному окну на каждый файл.
+.TP
+\-R
+Режим "только для чтения". Включается опция 'readonly'.
+Файл в буфере доступен для редактирования, но его копию на диске нельзя
+случайно перезаписать. Для сохранения файла необходимо добавить восклицательный
+знак к соответствующей команде Ex (например, ":w!").
+Ключ "\-R" подразумевает также, что используется и ключ "\-n" (см. выше).
+Опция 'readonly' может быть выключена по команде ":set noro".
+См. ":help 'readonly'".
+.TP
+\-r
+Вывести список своп-файлов и информацию об их использовании для восстановления после сбоя.
+.TP
+\-r {файл}
+Режим восстановления.
+Для восстановления после сбоя будет использован своп-файл.
+Своп-файл имеет то же имя, что и текстовый файл, но с добавлением расширения ".swp".
+См. ":help recovery".
+.TP
+\-s
+Тихий режим. Только при запуске как "Ex" или если перед "\-s" указан ключ "\-e".
+.TP
+\-s {scriptin}
+Считывается файл сценария {scriptin}. При этом, содержимое файла воспринимается
+в виде команд, как если бы они были набраны на консоли.
+То же самое достигается командой ":source! {scriptin}".
+Если конец файла считывается до завершения работы редактора, то в дальнейшем
+ввод осуществляется с клавиатуры.
+.TP
+\-T {terminal}
+Сообщает
+.B Vim
+тип используемого терминала. Необходимо только в тех ситуациях, когда
+автоматическое определение терминала не работает. Имя терминала должно быть
+известно
+.B Vim
+(встроено в него) или определено в файлах termcap или terminfo.
+.TP
+\-u {vimrc}
+Использовать команды из файла сценария {vimrc} для настройки.
+Все остальные файлы настроек пропускаются.
+Удобно для редактирования специальных типов файлов.
+Чтобы избежать использования сценариев настроек вообще, можно использовать
+имя "NONE". См. ":help initialization".
+.TP
+\-U {gvimrc}
+Использовать команды из файла сценария {gvimrc} для настройки графического
+интерфейса.
+Все остальные файлы настроек для графического интерфейса пропускаются.
+Чтобы избежать использования сценариев настроек графического интерфейса вообще,
+можно использовать имя "NONE". См. ":help gui-init".
+.TP
+\-V
+"Болтливый" режим. Выводить сообщения о том, какие файлы читаются, и о
+чтении-записи файла viminfo.
+.TP
+\-v
+Запустить
+.B Vim
+в режиме Vi, как будто исполняемый файл имеет имя "vi". Имеет смысл только если
+исполняемый файл имеет имя "ex".
+.TP
+\-w {scriptout}
+Все символы, введённые с клавиатуры вплоть до момента завершения работы,
+записываются в файл {scriptout}.
+Удобно в том случае, когда вы хотите создать файл сценария для последующего
+использования с "vim \-s" или ":source!". Если файл {scriptout} уже существует,
+то новые символы будут добавляются в конец файла.
+.TP
+\-W {scriptout}
+Как "\-w", но уже существующий файл будет перезаписан.
+.TP
+\-x
+Шифровать записываемые файлы. Будет выдано приглашение ввести пароль.
+.TP
+\-X
+Не подключаться к X-серверу. Ускоряет загрузку на консоли, но делает невозможным
+использование заголовка окна и буфера обмена.
+.TP
+\-Z
+Ограниченный режим. Работает так же, как и программы, начинающиеся с "r".
+.TP
+\-\-
+Конец ключей. Все остальные аргументы рассматриваются как имена файлов.
+Может быть использовано для правки файлов, имена которых начинаются с дефиса.
+.TP
+\-\-help
+Вывести краткую справку и завершить работу. То же, что и "\-h".
+.TP
+\-\-version
+Вывести информацию о версии программы и завершить работу.
+.TP
+\-\-remote
+Подключиться к серверу Vim и заставить его править файлы, указанные в
+последующих аргументах. Если сервер не найден, выводится предупреждение,
+а файлы правятся в местной копии Vim.
+.TP
+\-\-remote\-expr {выражение}
+Подключиться к серверу Vim и вычислить на нём указанное {выражение}.
+Результат вычисления будет выведен в поток стандартного вывода (stdout).
+.TP
+\-\-remote\-send {ключи}
+Подключиться к серверу Vim и передать ему указанные {ключи}.
+.TP
+\-\-remote\-silent
+Как "\-\-remote", но без вывода предупреждения, если сервер не найден.
+.TP
+\-\-remote\-wait
+Как "\-\-remote", но Vim не будет завершать работу до тех пор, пока не будет
+выполнена правка всех файлов.
+.TP
+\-\-remote\-wait\-silent
+Как "\-\-remote\-wait", но без вывода предупреждения, если сервер не найден.
+.TP
+\-\-serverlist
+Вывести список всех доступных серверов Vim.
+.TP
+\-\-servername {имя}
+Использовать указанное {имя} в качестве имени сервера. Если ключ
+"\-\-remote" не указан, то {имя} присваивается данной копии Vim,
+в противном случае указывает на имя сервера, к которому следует
+подключиться.
+.TP
+\-\-socketid {id}
+Только для графического интерфейса GTK: использовать механизм GtkPlug для
+запуска gvim в отдельном окне.
+.TP
+\-\-echo\-wid
+Только для графического интерфейса GTK: вывести идентификатор окна (Window ID)
+в поток стандартного вывода (stdout).
+.SH ВСТРОЕННАЯ СПРАВКА
+Для начала, наберите команду ":help".
+Введите ":help тема", чтобы получить справку по конкретной теме.
+Например, команда ":help ZZ" выведет информацию о команде "ZZ".
+Используйте <Tab> и CTRL-D для автоматического дополнения
+названий тем (":help cmdline-completion").
+Для быстрого перемещения по справочнику используются метки (что-то
+вроде гипертекстовых ссылок, см. ":help"). Таким образом можно
+просматривать все файлы справки, например ":help syntax.txt".
+.SH ФАЙЛЫ
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+Файлы справочника
+.B Vim.
+См. ":help doc-file-list" для получения полного списка.
+.TP
+/usr/local/lib/vim/doc/tags
+Файл меток, используемый для поиска информации в файлах справки.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Системные настройки синтаксиса.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Файлы синтаксиса для разных языков.
+.TP
+/usr/local/lib/vim/vimrc
+Системные настройки
+.B Vim.
+.TP
+/usr/local/lib/vim/gvimrc
+Системный настройки графического интерфейса.
+.TP
+/usr/local/lib/vim/optwin.vim
+Сценарий, используемый при выполнении команды ":options".
+Хороший способ просматривать и изменять настройки.
+.TP
+/usr/local/lib/vim/menu.vim
+Системные настройки меню для gvim.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Сценарий для создания отчёта об обнаруженных глюках. См. ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Сценарий для определения типа файла по имени. См. ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Сценарий для определения типа файла по содержимому. См. ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+Файлы для печати PostScript.
+.PP
+Более свежая информация -- на сайте VIM:
+.br
+<URL:http://www.vim.org/>
+.SH СМОТРИ ТАКЖЕ
+vimtutor(1)
+.SH АВТОРЫ
+Большая часть
+.B Vim
+создана Брамом Мооленааром (Bram Moolenaar), которому помогает огромное
+количество людей. См. ":help credits" в
+.B Vim.
+.br
+.B Vim
+базируется на коде редактора Stevie, написанного Тимом Томпсоном (Tim Thompson),
+Тони Эндрюсом (Tony Andrews) и Г. Р. (Фредом) Уолтером (G.R. (Fred) Walter).
+Однако, в настоящее время в Vim почти не осталось ничего от исторического кода
+его предшественника.
+.br
+Русская локализация
+.B Vim
+выполняется в рамках проекта "РуВим",
+см. <URL:http://sourceforge.net/projects/ruvim/>.
+.SH ГЛЮКИ
+Скорее всего есть.
+См. ":help todo" -- список известных проблем.
+.PP
+Заметим, что многие вещи, которые считаются глюками, на самом деле
+являются результатом слишком полного воспроизведения поведения Vi.
+Если вы думаете, что что-то является ошибкой только потому, что
+"Vi делает это по-другому", внимательно прочитайте файл vi_diff.txt
+(или наберите ":help vi_diff.txt" в Vim) и используйте опции 'compatible'
+и 'cpoptions'.
diff --git a/runtime/doc/vim-tr.1 b/runtime/doc/vim-tr.1
new file mode 100644
index 0000000..8e7bb4f
--- /dev/null
+++ b/runtime/doc/vim-tr.1
@@ -0,0 +1,544 @@
+.TH VIM 1 "11 Nisan 2006"
+.SH AD
+vim \- Vi IMproved, bir programcnn metin dzenleyicisi
+.SH ZET
+.br
+.B vim
+[seenekler] [dosya ..]
+.br
+.B vim
+[seenekler] \-
+.br
+.B vim
+[seenekler] \-t etiket
+.br
+.B vim
+[seenekler] \-q [hatadosyas]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH TANIM
+.B Vim,
+Vi ile yukarya doru uyumlu olan bir metin dzenleyicisidir.
+Her tr dz metni dzenlemede kullanlabilir.
+zellikle programlar dzenlemede yararldr.
+.PP
+Vi zerine yaplm birok gelitirme ve iyiletirmeyi ierir:
+ok dzeyli geri alma, oklu pencereler ve arabellekler, szdizim vurgulama,
+komut satr dzenleme, dosya ad tamamlama, evrimii yardm, grsel seim vb.
+.B Vim
+ve Vi arasndaki deiikliklerin bir zeti iin ":help vi_diff.txt"
+dosyasna bir gz atn.
+.PP
+.B Vim'i
+altrrken gerekli olan yardmn ou evrimii yardm sisteminden elde
+edilebilir. Bunun iin ":help" komutunu kullanabilirsiniz.
+Aada EVRM YARDIM blmne bakn.
+.PP
+Genelde
+.B Vim
+tek bir dosyay dzenlemek iin u komutla altrlr:
+.PP
+ vim dosya
+.PP
+Biraz daha aacak olursak:
+.PP
+ vim [seenekler] [dosyalistesi]
+.PP
+Eer dosya listesi salanmamsa, dzenleyici bo bir arabellek aar.
+Bunun dnda aadaki drt seenekten bir tanesi de bir veya birden ok
+dosyay dzenlemek iin kullanlabilir.
+.TP 12
+dosya ..
+Dosya adlarnn bir listesi.
+Bunlardan ilki ekrana getirilip arabellee yklenir.
+mle arabellein ilk satrnda konumlandrlr.
+Dier dosyalara ":next" komutu ile geebilirsiniz.
+Ad tire ile balayan bir dosyay dzenlemek iin dosya listesinin bana
+"\-\-" koyun.
+.TP
+\-
+Dzenlenecek dosya stdin'den okunur. Komutlar bir tty olmas gereken
+stderr'den okunur.
+.TP
+\-t {etiket}
+Dzenlenecek dosya ve bu dosyann balang imle konumu bir "etiket"e
+dayanr, bir tr braktnz konumu belirten bir ayra gibi.
+Etiket dosyasnda {etiket} aranr, ilikin dosya u anki dosya olur ve
+ilikin komut altrlr.
+Bu genelde C programlar iin kullanlr, {etiket} bu durumda bir ilev
+olabilir.
+Bunun sonucunda bu ilevi ieren dosya o anki dosya olur ve imle bu
+ilevin balangcna konumlandrlr.
+Ek bilgi iin: ":help tag\-commands".
+.TP
+\-q [hatadosyas]
+Hzl dzelt kipinde balat
+[hatadosyas] okunur ve ilk hata grntlenir.
+Eer [hatadosyas] salanmazsa, dosya ad 'errorfile' seeneinden alnr
+(ntanml olarak Amiga iin "AztecC.Err", dier sistemlerde "errors.err").
+Sonraki hatalara ":cn" komutu ile geilebilir.
+Ek bilgi iin: ":help quickfix".
+.PP
+.B Vim
+girilen komutun adna gre deiik biimde davranr (altrlabilir hl
+ayn dosya olarak kalabilir).
+.TP 10
+vim
+"Normal" kip, standart alma biimi.
+.TP
+ex
+Ex kipinde balat.
+"\-e" deikeni ile de balatlabilir.
+Normal kipe ":vi" komutu ile geilebilir.
+.TP
+view
+Saltokunur kipte balat. Bu kipte dosya yazmna izin verilmez.
+"\-R" deikeni ile de balatlabilir.
+.TP
+gvim gview
+Grafik arabirim srm.
+Yeni bir pencere aar.
+"\-g" deikeni ile de balatlabilir.
+.TP
+evim eview
+Kolay kipte balatlan grafik arabirim srm.
+Yeni bir pencere aar.
+"\-y" deikeni ile de balatlabilir.
+.TP
+rvim rview rgvim rgview
+Yukardaki ile ayn, ancak snrlamalar ierir. Kabuk komutlar
+altrlamaz veya
+.B Vim
+askya alnamaz.
+"\-Z" deikeni ile de balatlabilir.
+.SH SEENEKLER
+Seenekler bir sra gzetmeksizin dosya adlarndan nce veya sonra
+kullanlabilir.
+Herhangi bir deiken iermeyen seenekler bir tirenin ardnda sralanabilir.
+.TP 12
++[num]
+lk dosya iin imle "num" satrnda konumlandrlacaktr.
+Eer "num" eksikse imle en son satrda balar.
+.TP
++/{dizge}
+lk dosya iin imle {dizgi}'nin ilk elemesinin olduu satrda
+konumlandrlacaktr.
+Kullanlabilir arama dizgileri iin ":help search\-pattern" yazn.
+.TP
++{komut}
+.TP
+\-c {komut}
+lk dosya okunduktan sonra {komut} altrlr.
+{komut} bir Ex komutu olarak iletilir.
+Eer {komut} boluk ieriyorsa ift trnak ierisine alnmaldr (bu
+kullanlan kabua baldr).
+rnek: vim "+set si" main.c
+.br
+Not: 10 taneye kadar "+" veya "\-c" komutu kullanabilirsiniz.
+.TP
+\-S {dosya}
+lk dosya okunduktan sonra {dosya} kaynak alnr.
+\-c "source {dosya}" bu komutun edeeridir.
+{dosya}, '\-' ile balayamaz.
+Eer {dosya} salanmazsa "Session.vim" kullanlr (yalnzca \-S son
+deiken olarak kullanldnda ie yarar).
+.TP
+\-\-cmd {komut}
+"\-c" komutu gibi, ancak komut herhangi bir vimrc dosyasn iletmeden
+nce altrlr.
+"\-c" komutundan bamsz olarak bu komutlardan 10 taneye kadar
+altrabilirsiniz.
+.TP
+\-A
+Eer
+.B Vim
+sadan sola yazlan dosyalar ve Arapa klavye dizilimini kullanabilmesi iin
+ARAPA destei ile derlenmie bu seenek
+.B Vim'i
+Arapa kipinde balatr ('arabic' seenei alr). Aksi durumda
+.B Vim
+hata verip kar.
+.TP
+\-b
+kili kip.
+Bir altrlabiliri veya ikili dosyay dzenlemeye olanacak salayacak
+birka seenek ayarlanr.
+.TP
+\-C
+Uyumlu kip. 'compatible' seeneini ayarlar.
+Bu kipte
+.B Vim
+bir .vimrc dosyas var olsa bile genelde Vi gibi davranr.
+.TP
+\-d
+Karlatrma kipinde balat.
+Bir, iki, veya drt adet dosya ad deikeni olmaldr.
+.B Vim
+btn dosyalar yan yana aar ve aralarndaki deiiklikleri gsterir.
+vimdiff(1) gibi alr.
+.TP
+\-d {aygt}
+{aygt}' bir ubirim olarak kullanmak iin aar.
+Yalnzca Amiga'da alr.
+rnek:
+"\-d con:20/30/600/150".
+.TP
+\-D
+Hata ayklama kipi. Bir betiin ilk komutunu altrrken hata ayklama
+kipine geer.
+.TP
+\-e
+.B Vim'i
+Ex kipinde balatr, "ex" altrlabiliri ile ayn ilevi grr.
+.TP
+\-E
+.B Vim'i
+gelitirilmi Ex kipinde balatr, "exim" altrlabiliri ile ayn
+ilevi grr.
+.TP
+\-f
+nplan. Grafik arabirim srm iin
+.B Vim
+balad kabuktan ayrlmayacak ve kendisini atallamayacaktr.
+Amiga'da,
+.B Vim
+yeni bir pencere amak iin yeniden balatlmaz.
+Bu seenek
+.B Vim
+dzenleme oturumunun bitmesini bekleyecek bir program tarafndan
+balatldnda kullanlmaldr (rn. mail).
+Amiga'da ":sh" ve ":!" komutlar almayacaktr.
+.TP
+\-\-nofork
+nplan. Grafik arabirim srm iin
+.B Vim
+balad kabuktan ayrlmayacak ve kendisini atallamayacaktr.
+.TP
+\-F
+Eer
+.B Vim
+sadan sola yazlan dosyalar ve Farsa klavye dizilimini kullanabilmesi iin
+FKMAP destei ile derlenmise, bu seenek
+.B Vim'i
+Farsa kipinde balatr ('fkmap' ve 'rightleft' seenekleri alr).
+Aksi durumda
+.B Vim
+hata verip kar.
+.TP
+\-g
+Eer
+.B Vim
+grafik arabirim destei ile derlenmise bu seenek grafik arabirimi altrr.
+Eer grafik arabirim destei eklenmemise
+.B Vim
+hata verir ve kar.
+.TP
+\-h
+Komut satr deikenleri ve seenekleri zerine biraz yardm salar.
+Bu komuttan sonra
+.B Vim
+kar.
+.TP
+\-H
+Eer
+.B Vim
+sadan sola yazlan dosyalar ve branca klavye dizilimini kullanabilmesi iin
+RIGHTLEFT destei ile derlenmise, bu seenek
+.B Vim'i
+branca kipinde balatr ('hkmap' ve 'rightleft' seenekleri alr).
+Aksi durumda
+.B Vim
+hata verir ve kar.
+.TP
+\-i {viminfo}
+ntanml "~/.viminfo" dosyas yerine kullanlacak olan viminfo dosyasn
+belirtmek iin kullanlr.
+Bu komut ayn zamanda viminfo kullanmn atlamak iin de kullanlabilir.
+Bunun iin dosya ad yerine "NONE" vermeniz yeterlidir.
+.TP
+\-L
+\-r ile ayn.
+.TP
+\-l
+Lisp kipi.
+Bu deiken 'lisp' ve 'showmatch' seeneklerini aar.
+.TP
+\-m
+Dosya yazma seenei kapaldr.
+\'write' seeneini sfrlar.
+Arabellei hl deitirebilirsiniz, ancak dosyay yazmak olanakl deildir.
+.TP
+\-M
+Deiikliklere izin verilmez. 'modifiable' ve 'write' seenekleri kapatlr,
+bylece deiiklik yaplamaz ve dosyalar yazlamaz.
+Bu seenekleri yeniden ap deiiklik yapmay etkinletirebilirsiniz.
+.TP
+\-N
+Uyumsuz kip. 'no-compatible' seeneini sfrlar.
+Bu seenekle birlikte
+.B Vim
+biraz daha dzgnce alr, ancak bir .vimrc dosyas olmamasna ramen
+Vi ile daha az uyumludur.
+.TP
+\-n
+Bir takas dosyas kullanlmaz.
+kme sonras kurtarma olanakl olmayacaktr.
+Eer ok yava bir ortamda dosya alyorsanz (rn. disket) yararl olabilir.
+":set uc=0" ile de yaplabilir.
+Geri almak iin ":set uc=200" yapn.
+.TP
+\-nb
+NetBeans iin bir dzenleyici sunucusu olur. Ayrntlar iin belgelere bakn.
+.TP
+\-o[N]
+N sayda pencereyi st ste aar.
+N verilmezse, her dosya iin bir pencere aar.
+.TP
+\-O[N]
+N sayda pencereyi yan yana aar.
+N verilmezse, her dosya iin bir pencere aar.
+.TP
+\-p[N]
+N sayda sekme aar.
+N verilmezse, her dosya iin bir sekme aar.
+.TP
+\-R
+Saltokunur kip.
+\'readonly' seenei alr.
+Arabellei hl deitirebilirsiniz, ancak yanllkla dosyann zerine
+yazmaktan sizi korur.
+Dosyann zerine yazmak istemiyorsanz, Ex komutuna bir nlem imi ekleyin,
+rn. ":w!".
+\-R seenei ayn zamanda \-n seeneini de uygular (yukarda bakn).
+\'readonly' seenei ":set noro" ile sfrlanabilir.
+Ek bilgi iin: ":help 'readonly'".
+.TP
+\-r
+Takas dosyalarn ierdikleri kurtarma bilgilerini gsterecek biimde listeler.
+.TP
+\-r {dosya}
+Kurtarma kipi.
+km bir dzenleme oturumunu takas dosyasn kullanarak kurtarr.
+Takas dosyas dosya ile ayn ada iye olup sonuna ".swp" eklenmitir.
+Ek bilgi iin: ":help recovery".
+.TP
+\-s
+Sessiz kip. Yalnzca "Ex" olarak balatldnda veya "\-e" seenei
+"\-s" seeneinden nce verildiinde alr.
+.TP
+\-s {betikgir}
+{betikgir} betik dosyas okunur.
+Dosyadaki karakterler onlar siz girmisiniz gibi kabul edilir.
+Ayns ":source! {betikgir}" komutu ile de gerekletirilebilir.
+Eer dosyann sonuna dzenleyici kmadan nce gelinirse, sonraki karakterler
+klavyeden okunur.
+.TP
+\-T {ubirim}
+.B Vim'e
+kullandnz ubirimin adn syler.
+Yalnzca kendiliinden okunamazsa gereklidir.
+.B Vim'in
+tand bir ubirim olmaldr veya termcap veya terminfo dosyasnda
+tanml olmaldr.
+.TP
+\-u {vimrc}
+lklendirme iin {vimrc} dosyasndaki komutlar kullan.
+Dier tm ilklendirmeler atlanr.
+Bunu zel trde dosyalar dzenlemek iin kullann.
+Dosya ad olarak "NONE" verilirse tm zelletirmeler atlanr.
+Ek bilgi iin vim iinde ":help initialization" blmne bakn.
+.TP
+\-U {gvimrc}
+Grafik arabirim ilklendirmesi iin {gvimrc} dosyasndaki komutlara bakn.
+Dier tm grafik arabirim ilklendirmeleri atlanr.
+Dosya ad olarak "NONE" verilirse tm zelletirmeler atlanr.
+Ek bilgi iin vim iinde ":help gui\-init" blmne bakn.
+.TP
+\-V[N]
+Szl anlatm. Hangi dosyalarn kaynak alndn ve viminfo dosyasndan
+nelerin okunduunu yazdrr. 'verbose' iin istee bal N seenei
+kullanlabilir. ntanml say 10'dur.
+.TP
+\-v
+.B Vim'i
+"vi" yazarak balatrm gibi Vi kipinde balatr. Bu yalnzca
+altrlabilir "ex" olduunda bir ie yarar.
+.TP
+\-w {betikk}
+Girdiiniz tm karakterler siz
+.B Vim'den
+kana dein {betikk} dosyasnda saklanr.
+Bu "vim \-s" veya ":source" komutu ile kullanlacak bir betik yaratmaya yarar.
+Eer {betikk} dosyas varsa karakterler dosyaya eklenir.
+.TP
+\-W {betikk}
+\-w gibi, ancak var olan bir dosyann zerine yazar.
+.TP
+\-x
+Dosya yazarken ifreleme kullanr. Bir ifre girmeniz istenecektir.
+.TP
+\-X
+X sunucusuna balanmaz. Vim'in ubirimde balama sresini azaltr ancak pencere bal
+ve pano kullanlamaz.
+.TP
+\-y
+.B Vim'i
+"evim" veya "eview" yazarak balatrm gibi kolay kipte balatr.
+.B Vim'i
+dier tkla ve yaz dzenleyicileri gibi altrr.
+.TP
+\-Z
+Kstl kip. Program "r" yazarak balatlm gibi davranr.
+.TP
+\-\-
+Seeneklerin bittiini belirtir.
+Bundan sonraki deikenler artk bir dosya ad olarak iletilir.
+Ayn zamanda '\-' ile balayan bir dosyay tantmak iin de kullanlabilir.
+.TP
+\-\-echo\-wid
+Yalnzca GTK grafik arabirimi: Pencere numarasn stdout'a yankla.
+.TP
+\-\-help
+Yardm iletisini yazdrr ve kar, "\-h" gibi.
+.TP
+\-\-literal
+Dosya ad deikenlerini gerek anlamda ilet, joker karakterlerini
+geniletme. Bunun kabuun karakterleri kendiliinden genilettii Unix'te
+bir etkisi bulunmamaktadr.
+.TP
+\-\-noplugin
+Eklentileri ykleme. "\-u NONE" da ayn ilevi grr.
+.TP
+\-\-remote
+Bir Vim sunucusuna balan ve geri kalan deikenlerde belirtilen dosyalar
+dzenle. Eer bir sunucu bulunamazsa bir uyar verilir ve dosyalar u anki
+Vim'de dzenlenir.
+.TP
+\-\-remote\-expr {ifade}
+Bir Vim sunucusuna balan ve {ifade}'yi deerlendirip sonucu stdout'a yazdr.
+.TP
+\-\-remote\-send {anahtarlar}
+Bir Vim sunucusuna balan ve ona {anahtarlar} gnder.
+.TP
+\-\-remote\-silent
+\-\-remote gibi, ancak bir sunucu bulunamazsa uyar vermez.
+.TP
+\-\-remote\-wait
+\-\-remote gibi, ancak Vim dosyalar dzenlenene kadar kmaz.
+.TP
+\-\-remote\-wait\-silent
+\-\-remote\-wait gibi, ancak bir sunucu bulunamazsa uyar vermez.
+.TP
+\-\-serverlist
+Bulunabilecek btn Vim sunucularn listeler.
+.TP
+\-\-servername {ad}
+{ad}' bir sunucu ad olarak kullanr. Bir \-\-remote deikeni ve
+balanaca sunucunun ad ile kullanlmad srece u anki Vim iin
+kullanlr.
+.TP
+\-\-socketid {id}
+Yalnzca GTK grafik arabirimi: GtkPlug mekanizmasn kullanarak gvim'i baka
+bir pencerede altr.
+.TP
+\-\-version
+Srm bilgisini yazdrr ve kar.
+.SH EVRM YARDIM
+.B Vim
+iinde ":help" yazarak balayn.
+Belirli bir konu zerine yardm almak iin ":help subject" yazn.
+rnein: "ZZ" komutu zerine bilgi almak iin ":help ZZ" yazn.
+<Tab> ve CTRL-D kullanarak konular tamamlayn (":help cmdline\-completion").
+Bir konumdan dierini atlamak iin etiketler mevcuttur (bir tr kpr gibi),
+ek bilgi iin ":help").
+Tm belgelendirmeyi bu biimde okuyabilirsiniz, rnein: ":help syntax.txt".
+":help syntax.txt".
+.SH DOSYALAR
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+.B Vim
+belgelendirme dosyalar.
+Tm listeyi grmek iin ":help doc\-file\-list" yazn.
+.TP
+/usr/local/lib/vim/doc/tags
+Belgelendirme iinde veri bulmak iin kullanlan etiketler dosyas.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Sistem geneli szdizim ilklendirmeleri.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Programlama dilleri iin szdizim dosyalar.
+.TP
+/usr/local/lib/vim/vimrc
+Sistem geneli
+.B Vim
+ilklendirmeleri.
+.TP
+~/.vimrc
+Sizin kiisel
+.B Vim
+ilklendirmeleriniz.
+.TP
+/usr/local/lib/vim/gvimrc
+Sistem geneli gvim ilklendirmeleri.
+.TP
+~/.gvimrc
+Sizin kiisel gvim ilklendirmeleriniz.
+.TP
+/usr/local/lib/vim/optwin.vim
+":options" komutu iin kullanlan betik, grsel seenek ayarlar.
+.TP
+/usr/local/lib/vim/menu.vim
+gvim iin sistem geneli men ilklendirmeleri.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Hata raporu oluturmak iin kullanlan betik. Ek bilgi iin: ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Dosya trn adndan tanyan betik. Ek bilgi iin: ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Dosya trn ieriinden tanyan betik. Ek bilgi iin: ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+PostScript yazdrmas iin kullanlan dosyalar.
+.PP
+En gncel bilgiler iin VM ana sayfasn ziyaret edin:
+.br
+<URL:http://www.vim.org/>
+.SH AYRICA BAKINIZ
+vimtutor(1)
+.SH YAZAR
+.B Vim'in
+byk ounluu Bram Moolenaar tarafndan bakalarnn kayda deer
+yardmlaryla yazlmtr.
+Ek bilgi iin
+.B Vim
+iinde ":help credits" yazn.
+.br
+.B Vim
+Stevie tabanldr, yazarlar: Tim Thompson,
+Tony Andrews ve G.R. (Fred) Walter.
+Orijinal koddan geriye pek bir ey kalmadn sylemek yanl olmaz.
+.SH HATALAR
+Bilinen hatalarn bir listesi iin ":help todo" yazn.
+.PP
+Unutmayn ki, bakalar tarafndan hata olarak deerlendirilebilecek konularn
+bir ou Vi'nin davranlarna sadk kalnmas nedeniyle vardr. Yine de
+baz eylerin "Vi bunu deiik biimde yapyor" diye hata olabileceini
+dnyorsanz, "vi_diff.txt" dosyasn dikkatle okuyun (veya Vim iinde
+:help vi_diff.txt yazn.
+Ek olarak 'compatible' ve 'cpoptions' seeneklerine de bakabilirsiniz.
diff --git a/runtime/doc/vim-tr.UTF-8.1 b/runtime/doc/vim-tr.UTF-8.1
new file mode 100644
index 0000000..c419805
--- /dev/null
+++ b/runtime/doc/vim-tr.UTF-8.1
@@ -0,0 +1,544 @@
+.TH VIM 1 "11 Nisan 2006"
+.SH AD
+vim \- Vi IMproved, bir programcının metin düzenleyicisi
+.SH ÖZET
+.br
+.B vim
+[seçenekler] [dosya ..]
+.br
+.B vim
+[seçenekler] \-
+.br
+.B vim
+[seçenekler] \-t etiket
+.br
+.B vim
+[seçenekler] \-q [hatadosyası]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH TANIM
+.B Vim,
+Vi ile yukarıya doğru uyumlu olan bir metin düzenleyicisidir.
+Her tür düz metni düzenlemede kullanılabilir.
+Özellikle programları düzenlemede yararlıdır.
+.PP
+Vi üzerine yapılmış birçok geliştirme ve iyileştirmeyi içerir:
+Çok düzeyli geri alma, çoklu pencereler ve arabellekler, sözdizim vurgulama,
+komut satırı düzenleme, dosya adı tamamlama, çevrimiçi yardım, görsel seçim vb.
+.B Vim
+ve Vi arasındaki değişikliklerin bir özeti için ":help vi_diff.txt"
+dosyasına bir göz atın.
+.PP
+.B Vim'i
+çalıştırırken gerekli olan yardımın çoğu çevrimiçi yardım sisteminden elde
+edilebilir. Bunun için ":help" komutunu kullanabilirsiniz.
+Aşağıda ÇEVRİMİÇİ YARDIM bölümüne bakın.
+.PP
+Genelde
+.B Vim
+tek bir dosyayı düzenlemek için şu komutla çalıştırılır:
+.PP
+ vim dosya
+.PP
+Biraz daha açacak olursak:
+.PP
+ vim [seçenekler] [dosyalistesi]
+.PP
+Eğer dosya listesi sağlanmamışsa, düzenleyici boş bir arabellek açar.
+Bunun dışında aşağıdaki dört seçenekten bir tanesi de bir veya birden çok
+dosyayı düzenlemek için kullanılabilir.
+.TP 12
+dosya ..
+Dosya adlarının bir listesi.
+Bunlardan ilki ekrana getirilip arabelleğe yüklenir.
+İmleç arabelleğin ilk satırında konumlandırılır.
+Diğer dosyalara ":next" komutu ile geçebilirsiniz.
+Adı tire ile başlayan bir dosyayı düzenlemek için dosya listesinin başına
+"\-\-" koyun.
+.TP
+\-
+Düzenlenecek dosya stdin'den okunur. Komutlar bir tty olması gereken
+stderr'den okunur.
+.TP
+\-t {etiket}
+Düzenlenecek dosya ve bu dosyanın başlangıç imleç konumu bir "etiket"e
+dayanır, bir tür bıraktığınız konumu belirten bir ayraç gibi.
+Etiket dosyasında {etiket} aranır, ilişkin dosya şu anki dosya olur ve
+ilişkin komut çalıştırılır.
+Bu genelde C programları için kullanılır, {etiket} bu durumda bir işlev
+olabilir.
+Bunun sonucunda bu işlevi içeren dosya o anki dosya olur ve imleç bu
+işlevin başlangıcına konumlandırılır.
+Ek bilgi için: ":help tag\-commands".
+.TP
+\-q [hatadosyası]
+Hızlı düzelt kipinde başlat
+[hatadosyası] okunur ve ilk hata görüntülenir.
+Eğer [hatadosyası] sağlanmazsa, dosya adı 'errorfile' seçeneğinden alınır
+(öntanımlı olarak Amiga için "AztecC.Err", diğer sistemlerde "errors.err").
+Sonraki hatalara ":cn" komutu ile geçilebilir.
+Ek bilgi için: ":help quickfix".
+.PP
+.B Vim
+girilen komutun adına göre değişik biçimde davranır (çalıştırılabilir hâlâ
+aynı dosya olarak kalabilir).
+.TP 10
+vim
+"Normal" kip, standart çalışma biçimi.
+.TP
+ex
+Ex kipinde başlat.
+"\-e" değişkeni ile de başlatılabilir.
+Normal kipe ":vi" komutu ile geçilebilir.
+.TP
+view
+Saltokunur kipte başlat. Bu kipte dosya yazımına izin verilmez.
+"\-R" değişkeni ile de başlatılabilir.
+.TP
+gvim gview
+Grafik arabirim sürümü.
+Yeni bir pencere açar.
+"\-g" değişkeni ile de başlatılabilir.
+.TP
+evim eview
+Kolay kipte başlatılan grafik arabirim sürümü.
+Yeni bir pencere açar.
+"\-y" değişkeni ile de başlatılabilir.
+.TP
+rvim rview rgvim rgview
+Yukarıdaki ile aynı, ancak sınırlamalar içerir. Kabuk komutları
+çalıştırılamaz veya
+.B Vim
+askıya alınamaz.
+"\-Z" değişkeni ile de başlatılabilir.
+.SH SEÇENEKLER
+Seçenekler bir sıra gözetmeksizin dosya adlarından önce veya sonra
+kullanılabilir.
+Herhangi bir değişken içermeyen seçenekler bir tirenin ardında sıralanabilir.
+.TP 12
++[num]
+İlk dosya için imleç "num" satırında konumlandırılacaktır.
+Eğer "num" eksikse imleç en son satırda başlar.
+.TP
++/{dizge}
+İlk dosya için imleç {dizgi}'nin ilk eşleşmesinin olduğu satırda
+konumlandırılacaktır.
+Kullanılabilir arama dizgileri için ":help search\-pattern" yazın.
+.TP
++{komut}
+.TP
+\-c {komut}
+İlk dosya okunduktan sonra {komut} çalıştırılır.
+{komut} bir Ex komutu olarak işletilir.
+Eğer {komut} boşluk içeriyorsa çift tırnak içerisine alınmalıdır (bu
+kullanılan kabuğa bağlıdır).
+Örnek: vim "+set si" main.c
+.br
+Not: 10 taneye kadar "+" veya "\-c" komutu kullanabilirsiniz.
+.TP
+\-S {dosya}
+İlk dosya okunduktan sonra {dosya} kaynak alınır.
+\-c "source {dosya}" bu komutun eşdeğeridir.
+{dosya}, '\-' ile başlayamaz.
+Eğer {dosya} sağlanmazsa "Session.vim" kullanılır (yalnızca \-S son
+değişken olarak kullanıldığında işe yarar).
+.TP
+\-\-cmd {komut}
+"\-c" komutu gibi, ancak komut herhangi bir vimrc dosyasını işletmeden
+önce çalıştırılır.
+"\-c" komutundan bağımsız olarak bu komutlardan 10 taneye kadar
+çalıştırabilirsiniz.
+.TP
+\-A
+Eğer
+.B Vim
+sağdan sola yazılan dosyaları ve Arapça klavye dizilimini kullanabilmesi için
+ARAPÇA desteği ile derlenmişe bu seçenek
+.B Vim'i
+Arapça kipinde başlatır ('arabic' seçeneği açılır). Aksi durumda
+.B Vim
+hata verip çıkar.
+.TP
+\-b
+İkili kip.
+Bir çalıştırılabiliri veya ikili dosyayı düzenlemeye olanacak sağlayacak
+birkaç seçenek ayarlanır.
+.TP
+\-C
+Uyumlu kip. 'compatible' seçeneğini ayarlar.
+Bu kipte
+.B Vim
+bir .vimrc dosyası var olsa bile genelde Vi gibi davranır.
+.TP
+\-d
+Karşılaştırma kipinde başlat.
+Bir, iki, üç veya dört adet dosya adı değişkeni olmalıdır.
+.B Vim
+bütün dosyaları yan yana açar ve aralarındaki değişiklikleri gösterir.
+vimdiff(1) gibi çalışır.
+.TP
+\-d {aygıt}
+{aygıt}'ı bir uçbirim olarak kullanmak için açar.
+Yalnızca Amiga'da çalışır.
+Örnek:
+"\-d con:20/30/600/150".
+.TP
+\-D
+Hata ayıklama kipi. Bir betiğin ilk komutunu çalıştırırken hata ayıklama
+kipine geçer.
+.TP
+\-e
+.B Vim'i
+Ex kipinde başlatır, "ex" çalıştırılabiliri ile aynı işlevi görür.
+.TP
+\-E
+.B Vim'i
+geliştirilmiş Ex kipinde başlatır, "exim" çalıştırılabiliri ile aynı
+işlevi görür.
+.TP
+\-f
+Önplan. Grafik arabirim sürümü için
+.B Vim
+başladığı kabuktan ayrılmayacak ve kendisini çatallamayacaktır.
+Amiga'da,
+.B Vim
+yeni bir pencere açmak için yeniden başlatılmaz.
+Bu seçenek
+.B Vim
+düzenleme oturumunun bitmesini bekleyecek bir program tarafından
+başlatıldığında kullanılmalıdır (örn. mail).
+Amiga'da ":sh" ve ":!" komutları çalışmayacaktır.
+.TP
+\-\-nofork
+Önplan. Grafik arabirim sürümü için
+.B Vim
+başladığı kabuktan ayrılmayacak ve kendisini çatallamayacaktır.
+.TP
+\-F
+Eğer
+.B Vim
+sağdan sola yazılan dosyaları ve Farsça klavye dizilimini kullanabilmesi için
+FKMAP desteği ile derlenmişse, bu seçenek
+.B Vim'i
+Farsça kipinde başlatır ('fkmap' ve 'rightleft' seçenekleri açılır).
+Aksi durumda
+.B Vim
+hata verip çıkar.
+.TP
+\-g
+Eğer
+.B Vim
+grafik arabirim desteği ile derlenmişse bu seçenek grafik arabirimi çalıştırır.
+Eğer grafik arabirim desteği eklenmemişse
+.B Vim
+hata verir ve çıkar.
+.TP
+\-h
+Komut satırı değişkenleri ve seçenekleri üzerine biraz yardım sağlar.
+Bu komuttan sonra
+.B Vim
+çıkar.
+.TP
+\-H
+Eğer
+.B Vim
+sağdan sola yazılan dosyaları ve İbranca klavye dizilimini kullanabilmesi için
+RIGHTLEFT desteği ile derlenmişse, bu seçenek
+.B Vim'i
+İbranca kipinde başlatır ('hkmap' ve 'rightleft' seçenekleri açılır).
+Aksi durumda
+.B Vim
+hata verir ve çıkar.
+.TP
+\-i {viminfo}
+Öntanımlı "~/.viminfo" dosyası yerine kullanılacak olan viminfo dosyasını
+belirtmek için kullanılır.
+Bu komut aynı zamanda viminfo kullanımını atlamak için de kullanılabilir.
+Bunun için dosya adı yerine "NONE" vermeniz yeterlidir.
+.TP
+\-L
+\-r ile aynı.
+.TP
+\-l
+Lisp kipi.
+Bu değişken 'lisp' ve 'showmatch' seçeneklerini açar.
+.TP
+\-m
+Dosya yazma seçeneği kapalıdır.
+\'write' seçeneğini sıfırlar.
+Arabelleği hâlâ değiştirebilirsiniz, ancak dosyayı yazmak olanaklı değildir.
+.TP
+\-M
+Değişikliklere izin verilmez. 'modifiable' ve 'write' seçenekleri kapatılır,
+böylece değişiklik yapılamaz ve dosyalar yazılamaz.
+Bu seçenekleri yeniden açıp değişiklik yapmayı etkinleştirebilirsiniz.
+.TP
+\-N
+Uyumsuz kip. 'no-compatible' seçeneğini sıfırlar.
+Bu seçenekle birlikte
+.B Vim
+biraz daha düzgünce çalışır, ancak bir .vimrc dosyası olmamasına rağmen
+Vi ile daha az uyumludur.
+.TP
+\-n
+Bir takas dosyası kullanılmaz.
+Çökme sonrası kurtarma olanaklı olmayacaktır.
+Eğer çok yavaş bir ortamda dosya çalışıyorsanız (örn. disket) yararlı olabilir.
+":set uc=0" ile de yapılabilir.
+Geri almak için ":set uc=200" yapın.
+.TP
+\-nb
+NetBeans için bir düzenleyici sunucusu olur. Ayrıntılar için belgelere bakın.
+.TP
+\-o[N]
+N sayıda pencereyi üst üste açar.
+N verilmezse, her dosya için bir pencere açar.
+.TP
+\-O[N]
+N sayıda pencereyi yan yana açar.
+N verilmezse, her dosya için bir pencere açar.
+.TP
+\-p[N]
+N sayıda sekme açar.
+N verilmezse, her dosya için bir sekme açar.
+.TP
+\-R
+Saltokunur kip.
+\'readonly' seçeneği açılır.
+Arabelleği hâlâ değiştirebilirsiniz, ancak yanlışlıkla dosyanın üzerine
+yazmaktan sizi korur.
+Dosyanın üzerine yazmak istemiyorsanız, Ex komutuna bir ünlem imi ekleyin,
+örn. ":w!".
+\-R seçeneği aynı zamanda \-n seçeneğini de uygular (yukarıda bakın).
+\'readonly' seçeneği ":set noro" ile sıfırlanabilir.
+Ek bilgi için: ":help 'readonly'".
+.TP
+\-r
+Takas dosyalarını içerdikleri kurtarma bilgilerini gösterecek biçimde listeler.
+.TP
+\-r {dosya}
+Kurtarma kipi.
+Çökmüş bir düzenleme oturumunu takas dosyasını kullanarak kurtarır.
+Takas dosyası dosya ile aynı ada iye olup sonuna ".swp" eklenmiştir.
+Ek bilgi için: ":help recovery".
+.TP
+\-s
+Sessiz kip. Yalnızca "Ex" olarak başlatıldığında veya "\-e" seçeneği
+"\-s" seçeneğinden önce verildiğinde çalışır.
+.TP
+\-s {betikgir}
+{betikgir} betik dosyası okunur.
+Dosyadaki karakterler onları siz girmişsiniz gibi kabul edilir.
+Aynısı ":source! {betikgir}" komutu ile de gerçekleştirilebilir.
+Eğer dosyanın sonuna düzenleyici çıkmadan önce gelinirse, sonraki karakterler
+klavyeden okunur.
+.TP
+\-T {uçbirim}
+.B Vim'e
+kullandığınız uçbirimin adını söyler.
+Yalnızca kendiliğinden okunamazsa gereklidir.
+.B Vim'in
+tanıdığı bir uçbirim olmalıdır veya termcap veya terminfo dosyasında
+tanımlı olmalıdır.
+.TP
+\-u {vimrc}
+İlklendirme için {vimrc} dosyasındaki komutları kullan.
+Diğer tüm ilklendirmeler atlanır.
+Bunu özel türde dosyaları düzenlemek için kullanın.
+Dosya adı olarak "NONE" verilirse tüm özelleştirmeler atlanır.
+Ek bilgi için vim içinde ":help initialization" bölümüne bakın.
+.TP
+\-U {gvimrc}
+Grafik arabirim ilklendirmesi için {gvimrc} dosyasındaki komutlara bakın.
+Diğer tüm grafik arabirim ilklendirmeleri atlanır.
+Dosya adı olarak "NONE" verilirse tüm özelleştirmeler atlanır.
+Ek bilgi için vim içinde ":help gui\-init" bölümüne bakın.
+.TP
+\-V[N]
+Sözlü anlatım. Hangi dosyaların kaynak alındığını ve viminfo dosyasından
+nelerin okunduğunu yazdırır. 'verbose' için isteğe bağlı N seçeneği
+kullanılabilir. Öntanımlı sayı 10'dur.
+.TP
+\-v
+.B Vim'i
+"vi" yazarak başlatırmış gibi Vi kipinde başlatır. Bu yalnızca
+çalıştırılabilir "ex" olduğunda bir işe yarar.
+.TP
+\-w {betikçık}
+Girdiğiniz tüm karakterler siz
+.B Vim'den
+çıkana değin {betikçık} dosyasında saklanır.
+Bu "vim \-s" veya ":source" komutu ile kullanılacak bir betik yaratmaya yarar.
+Eğer {betikçık} dosyası varsa karakterler dosyaya eklenir.
+.TP
+\-W {betikçık}
+\-w gibi, ancak var olan bir dosyanın üzerine yazar.
+.TP
+\-x
+Dosya yazarken şifreleme kullanır. Bir şifre girmeniz istenecektir.
+.TP
+\-X
+X sunucusuna bağlanmaz. Vim'in uçbirimde başlama süresini azaltır ancak pencere başlığı
+ve pano kullanılamaz.
+.TP
+\-y
+.B Vim'i
+"evim" veya "eview" yazarak başlatırmış gibi kolay kipte başlatır.
+.B Vim'i
+diğer tıkla ve yaz düzenleyicileri gibi çalıştırır.
+.TP
+\-Z
+Kısıtlı kip. Program "r" yazarak başlatılmış gibi davranır.
+.TP
+\-\-
+Seçeneklerin bittiğini belirtir.
+Bundan sonraki değişkenler artık bir dosya adı olarak işletilir.
+Aynı zamanda '\-' ile başlayan bir dosyayı tanıtmak için de kullanılabilir.
+.TP
+\-\-echo\-wid
+Yalnızca GTK grafik arabirimi: Pencere numarasını stdout'a yankıla.
+.TP
+\-\-help
+Yardım iletisini yazdırır ve çıkar, "\-h" gibi.
+.TP
+\-\-literal
+Dosya adı değişkenlerini gerçek anlamda işlet, joker karakterlerini
+genişletme. Bunun kabuğun karakterleri kendiliğinden genişlettiği Unix'te
+bir etkisi bulunmamaktadır.
+.TP
+\-\-noplugin
+Eklentileri yükleme. "\-u NONE" da aynı işlevi görür.
+.TP
+\-\-remote
+Bir Vim sunucusuna bağlan ve geri kalan değişkenlerde belirtilen dosyaları
+düzenle. Eğer bir sunucu bulunamazsa bir uyarı verilir ve dosyalar şu anki
+Vim'de düzenlenir.
+.TP
+\-\-remote\-expr {ifade}
+Bir Vim sunucusuna bağlan ve {ifade}'yi değerlendirip sonucu stdout'a yazdır.
+.TP
+\-\-remote\-send {anahtarlar}
+Bir Vim sunucusuna bağlan ve ona {anahtarlar} gönder.
+.TP
+\-\-remote\-silent
+\-\-remote gibi, ancak bir sunucu bulunamazsa uyarı vermez.
+.TP
+\-\-remote\-wait
+\-\-remote gibi, ancak Vim dosyalar düzenlenene kadar çıkmaz.
+.TP
+\-\-remote\-wait\-silent
+\-\-remote\-wait gibi, ancak bir sunucu bulunamazsa uyarı vermez.
+.TP
+\-\-serverlist
+Bulunabilecek bütün Vim sunucularını listeler.
+.TP
+\-\-servername {ad}
+{ad}'ı bir sunucu adı olarak kullanır. Bir \-\-remote değişkeni ve
+bağlanacağı sunucunun adı ile kullanılmadığı sürece şu anki Vim için
+kullanılır.
+.TP
+\-\-socketid {id}
+Yalnızca GTK grafik arabirimi: GtkPlug mekanizmasını kullanarak gvim'i başka
+bir pencerede çalıştır.
+.TP
+\-\-version
+Sürüm bilgisini yazdırır ve çıkar.
+.SH ÇEVRİMİÇİ YARDIM
+.B Vim
+içinde ":help" yazarak başlayın.
+Belirli bir konu üzerine yardım almak için ":help subject" yazın.
+Örneğin: "ZZ" komutu üzerine bilgi almak için ":help ZZ" yazın.
+<Tab> ve CTRL-D kullanarak konuları tamamlayın (":help cmdline\-completion").
+Bir konumdan diğerini atlamak için etiketler mevcuttur (bir tür köprü gibi),
+ek bilgi için ":help").
+Tüm belgelendirmeyi bu biçimde okuyabilirsiniz, örneğin: ":help syntax.txt".
+":help syntax.txt".
+.SH DOSYALAR
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+.B Vim
+belgelendirme dosyaları.
+Tüm listeyi görmek için ":help doc\-file\-list" yazın.
+.TP
+/usr/local/lib/vim/doc/tags
+Belgelendirme içinde veri bulmak için kullanılan etiketler dosyası.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+Sistem geneli sözdizim ilklendirmeleri.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Programlama dilleri için sözdizim dosyaları.
+.TP
+/usr/local/lib/vim/vimrc
+Sistem geneli
+.B Vim
+ilklendirmeleri.
+.TP
+~/.vimrc
+Sizin kişisel
+.B Vim
+ilklendirmeleriniz.
+.TP
+/usr/local/lib/vim/gvimrc
+Sistem geneli gvim ilklendirmeleri.
+.TP
+~/.gvimrc
+Sizin kişisel gvim ilklendirmeleriniz.
+.TP
+/usr/local/lib/vim/optwin.vim
+":options" komutu için kullanılan betik, görsel seçenek ayarları.
+.TP
+/usr/local/lib/vim/menu.vim
+gvim için sistem geneli menü ilklendirmeleri.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Hata raporu oluşturmak için kullanılan betik. Ek bilgi için: ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Dosya türünü adından tanıyan betik. Ek bilgi için: ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Dosya türünü içeriğinden tanıyan betik. Ek bilgi için: ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+PostScript yazdırması için kullanılan dosyalar.
+.PP
+En güncel bilgiler için VİM ana sayfasını ziyaret edin:
+.br
+<URL:http://www.vim.org/>
+.SH AYRICA BAKINIZ
+vimtutor(1)
+.SH YAZAR
+.B Vim'in
+büyük çoğunluğu Bram Moolenaar tarafından başkalarının kayda değer
+yardımlarıyla yazılmıştır.
+Ek bilgi için
+.B Vim
+içinde ":help credits" yazın.
+.br
+.B Vim
+Stevie tabanlıdır, yazarları: Tim Thompson,
+Tony Andrews ve G.R. (Fred) Walter.
+Orijinal koddan geriye pek bir şey kalmadığını söylemek yanlış olmaz.
+.SH HATALAR
+Bilinen hataların bir listesi için ":help todo" yazın.
+.PP
+Unutmayın ki, başkaları tarafından hata olarak değerlendirilebilecek konuların
+bir çoğu Vi'nin davranışlarına sadık kalınması nedeniyle vardır. Yine de
+bazı şeylerin "Vi bunu değişik biçimde yapıyor" diye hata olabileceğini
+düşünüyorsanız, "vi_diff.txt" dosyasını dikkatle okuyun (veya Vim içinde
+:help vi_diff.txt yazın.
+Ek olarak 'compatible' ve 'cpoptions' seçeneklerine de bakabilirsiniz.
diff --git a/runtime/doc/vim.1 b/runtime/doc/vim.1
new file mode 100644
index 0000000..5613dd4
--- /dev/null
+++ b/runtime/doc/vim.1
@@ -0,0 +1,558 @@
+.TH VIM 1 "2021 Jun 13"
+.SH NAME
+vim \- Vi IMproved, a programmer's text editor
+.SH SYNOPSIS
+.br
+.B vim
+[options] [file ..]
+.br
+.B vim
+[options] \-
+.br
+.B vim
+[options] \-t tag
+.br
+.B vim
+[options] \-q [errorfile]
+.PP
+.br
+.B ex
+.br
+.B view
+.br
+.B gvim
+.B gview
+.B evim
+.B eview
+.br
+.B rvim
+.B rview
+.B rgvim
+.B rgview
+.SH DESCRIPTION
+.B Vim
+is a text editor that is upwards compatible to Vi.
+It can be used to edit all kinds of plain text.
+It is especially useful for editing programs.
+.PP
+There are a lot of enhancements above Vi: multi level undo,
+multi windows and buffers, syntax highlighting, command line
+editing, filename completion, on-line help, visual selection, etc..
+See ":help vi_diff.txt" for a summary of the differences between
+.B Vim
+and Vi.
+.PP
+While running
+.B Vim
+a lot of help can be obtained from the on-line help system, with the ":help"
+command.
+See the ON-LINE HELP section below.
+.PP
+Most often
+.B Vim
+is started to edit a single file with the command
+.PP
+ vim file
+.PP
+More generally
+.B Vim
+is started with:
+.PP
+ vim [options] [filelist]
+.PP
+If the filelist is missing, the editor will start with an empty buffer.
+Otherwise exactly one out of the following four may be used to choose one or
+more files to be edited.
+.TP 12
+file ..
+A list of filenames.
+The first one will be the current file and read into the buffer.
+The cursor will be positioned on the first line of the buffer.
+You can get to the other files with the ":next" command.
+To edit a file that starts with a dash, precede the filelist with "\-\-".
+.TP
+\-
+The file to edit is read from stdin. Commands are read from stderr, which
+should be a tty.
+.TP
+\-t {tag}
+The file to edit and the initial cursor position depends on a "tag", a sort
+of goto label.
+{tag} is looked up in the tags file, the associated file becomes the current
+file and the associated command is executed.
+Mostly this is used for C programs, in which case {tag} could be a function
+name.
+The effect is that the file containing that function becomes the current file
+and the cursor is positioned on the start of the function.
+See ":help tag\-commands".
+.TP
+\-q [errorfile]
+Start in quickFix mode.
+The file [errorfile] is read and the first error is displayed.
+If [errorfile] is omitted, the filename is obtained from the 'errorfile'
+option (defaults to "AztecC.Err" for the Amiga, "errors.err" on other
+systems).
+Further errors can be jumped to with the ":cn" command.
+See ":help quickfix".
+.PP
+.B Vim
+behaves differently, depending on the name of the command (the executable may
+still be the same file).
+.TP 10
+vim
+The "normal" way, everything is default.
+.TP
+ex
+Start in Ex mode.
+Go to Normal mode with the ":vi" command.
+Can also be done with the "\-e" argument.
+.TP
+view
+Start in read-only mode. You will be protected from writing the files.
+Can also be done with the "\-R" argument.
+.TP
+gvim gview
+The GUI version.
+Starts a new window.
+Can also be done with the "\-g" argument.
+.TP
+evim eview
+The GUI version in easy mode.
+Starts a new window.
+Can also be done with the "\-y" argument.
+.TP
+rvim rview rgvim rgview
+Like the above, but with restrictions. It will not be possible to start shell
+commands, or suspend
+.B Vim.
+Can also be done with the "\-Z" argument.
+.SH OPTIONS
+The options may be given in any order, before or after filenames.
+Options without an argument can be combined after a single dash.
+.TP 12
++[num]
+For the first file the cursor will be positioned on line "num".
+If "num" is missing, the cursor will be positioned on the last line.
+.TP
++/{pat}
+For the first file the cursor will be positioned in the line with the
+first occurrence of {pat}.
+See ":help search\-pattern" for the available search patterns.
+.TP
++{command}
+.TP
+\-c {command}
+{command} will be executed after the first file has been read.
+{command} is interpreted as an Ex command.
+If the {command} contains spaces it must be enclosed in double quotes (this
+depends on the shell that is used).
+Example: vim "+set si" main.c
+.br
+Note: You can use up to 10 "+" or "\-c" commands.
+.TP
+\-S {file}
+{file} will be sourced after the first file has been read.
+This is equivalent to \-c "source {file}".
+{file} cannot start with '\-'.
+If {file} is omitted "Session.vim" is used (only works when \-S is the last
+argument).
+.TP
+\-\-cmd {command}
+Like using "\-c", but the command is executed just before
+processing any vimrc file.
+You can use up to 10 of these commands, independently from "\-c" commands.
+.TP
+\-A
+If
+.B Vim
+has been compiled with ARABIC support for editing right-to-left
+oriented files and Arabic keyboard mapping, this option starts
+.B Vim
+in Arabic mode, i.e. 'arabic' is set. Otherwise an error
+message is given and
+.B Vim
+aborts.
+.TP
+\-b
+Binary mode.
+A few options will be set that makes it possible to edit a binary or
+executable file.
+.TP
+\-C
+Compatible. Set the 'compatible' option.
+This will make
+.B Vim
+behave mostly like Vi, even though a .vimrc file exists.
+.TP
+\-d
+Start in diff mode.
+There should between two to eight file name arguments.
+.B Vim
+will open all the files and show differences between them.
+Works like vimdiff(1).
+.TP
+\-d {device}
+Open {device} for use as a terminal.
+Only on the Amiga.
+Example:
+"\-d con:20/30/600/150".
+.TP
+\-D
+Debugging. Go to debugging mode when executing the first command from a
+script.
+.TP
+\-e
+Start
+.B Vim
+in Ex mode, just like the executable was called "ex".
+.TP
+\-E
+Start
+.B Vim
+in improved Ex mode, just like the executable was called "exim".
+.TP
+\-f
+Foreground. For the GUI version,
+.B Vim
+will not fork and detach from the shell it was started in.
+On the Amiga,
+.B Vim
+is not restarted to open a new window.
+This option should be used when
+.B Vim
+is executed by a program that will wait for the edit
+session to finish (e.g. mail).
+On the Amiga the ":sh" and ":!" commands will not work.
+.TP
+\-\-nofork
+Foreground. For the GUI version,
+.B Vim
+will not fork and detach from the shell it was started in.
+.TP
+\-F
+If
+.B Vim
+has been compiled with FKMAP support for editing right-to-left
+oriented files and Farsi keyboard mapping, this option starts
+.B Vim
+in Farsi mode, i.e. 'fkmap' and 'rightleft' are set.
+Otherwise an error message is given and
+.B Vim
+aborts.
+.TP
+\-g
+If
+.B Vim
+has been compiled with GUI support, this option enables the GUI.
+If no GUI support was compiled in, an error message is given and
+.B Vim
+aborts.
+.TP
+\-h
+Give a bit of help about the command line arguments and options.
+After this
+.B Vim
+exits.
+.TP
+\-H
+If
+.B Vim
+has been compiled with RIGHTLEFT support for editing right-to-left
+oriented files and Hebrew keyboard mapping, this option starts
+.B Vim
+in Hebrew mode, i.e. 'hkmap' and 'rightleft' are set.
+Otherwise an error message is given and
+.B Vim
+aborts.
+.TP
+\-i {viminfo}
+Specifies the filename to use when reading or writing the viminfo file,
+instead of the default "~/.viminfo".
+This can also be used to skip the use of the .viminfo file, by giving the name
+"NONE".
+.TP
+\-L
+Same as \-r.
+.TP
+\-l
+Lisp mode.
+Sets the 'lisp' and 'showmatch' options on.
+.TP
+\-m
+Modifying files is disabled.
+Resets the 'write' option.
+You can still modify the buffer, but writing a file is not possible.
+.TP
+\-M
+Modifications not allowed. The 'modifiable' and 'write' options will be unset,
+so that changes are not allowed and files can not be written. Note that these
+options can be set to enable making modifications.
+.TP
+\-N
+No-compatible mode. Resets the 'compatible' option.
+This will make
+.B Vim
+behave a bit better, but less Vi compatible, even though a .vimrc file does
+not exist.
+.TP
+\-n
+No swap file will be used.
+Recovery after a crash will be impossible.
+Handy if you want to edit a file on a very slow medium (e.g. floppy).
+Can also be done with ":set uc=0".
+Can be undone with ":set uc=200".
+.TP
+\-nb
+Become an editor server for NetBeans. See the docs for details.
+.TP
+\-o[N]
+Open N windows stacked.
+When N is omitted, open one window for each file.
+.TP
+\-O[N]
+Open N windows side by side.
+When N is omitted, open one window for each file.
+.TP
+\-p[N]
+Open N tab pages.
+When N is omitted, open one tab page for each file.
+.TP
+\-R
+Read-only mode.
+The 'readonly' option will be set.
+You can still edit the buffer, but will be prevented from accidentally
+overwriting a file.
+If you do want to overwrite a file, add an exclamation mark to the Ex command,
+as in ":w!".
+The \-R option also implies the \-n option (see above).
+The 'readonly' option can be reset with ":set noro".
+See ":help 'readonly'".
+.TP
+\-r
+List swap files, with information about using them for recovery.
+.TP
+\-r {file}
+Recovery mode.
+The swap file is used to recover a crashed editing session.
+The swap file is a file with the same filename as the text file with ".swp"
+appended.
+See ":help recovery".
+.TP
+\-s
+Silent mode. Only when started as "Ex" or when the "\-e" option was given
+before the "\-s" option.
+.TP
+\-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.
+.TP
+\-T {terminal}
+Tells
+.B Vim
+the name of the terminal you are using.
+Only required when the automatic way doesn't work.
+Should be a terminal known to
+.B Vim
+(builtin) or defined in the termcap or terminfo file.
+.TP
+\-u {vimrc}
+Use the commands in the file {vimrc} for initializations.
+All the other initializations are skipped.
+Use this to edit a special kind of files.
+It can also be used to skip all initializations by giving the name "NONE".
+See ":help initialization" within vim for more details.
+.TP
+\-U {gvimrc}
+Use the commands in the file {gvimrc} for GUI initializations.
+All the other GUI initializations are skipped.
+It can also be used to skip all GUI initializations by giving the name "NONE".
+See ":help gui\-init" within vim for more details.
+.TP
+\-V[N]
+Verbose. Give messages about which files are sourced and for reading and
+writing a viminfo file. The optional number N is the value for 'verbose'.
+Default is 10.
+.TP
+\-v
+Start
+.B Vim
+in Vi mode, just like the executable was called "vi". This only has effect
+when the executable is called "ex".
+.TP
+\-w {scriptout}
+All the characters that you type are recorded in the file
+{scriptout}, until you exit
+.B Vim.
+This is useful if you want to create a script file to be used with "vim \-s" or
+":source!".
+If the {scriptout} file exists, characters are appended.
+.TP
+\-W {scriptout}
+Like \-w, but an existing file is overwritten.
+.TP
+\-x
+Use encryption when writing files. Will prompt for a crypt key.
+.TP
+\-X
+Don't connect to the X server. Shortens startup time in a terminal, but the
+window title and clipboard will not be used.
+.TP
+\-y
+Start
+.B Vim
+in easy mode, just like the executable was called "evim" or "eview".
+Makes
+.B Vim
+behave like a click-and-type editor.
+.TP
+\-Z
+Restricted mode. Works like the executable starts with "r".
+.TP
+\-\-
+Denotes the end of the options.
+Arguments after this will be handled as a file name.
+This can be used to edit a filename that starts with a '\-'.
+.TP
+\-\-clean
+Do not use any personal configuration (vimrc, plugins, etc.). Useful to see if
+a problem reproduces with a clean Vim setup.
+.TP
+\-\-echo\-wid
+GTK GUI only: Echo the Window ID on stdout.
+.TP
+\-\-help
+Give a help message and exit, just like "\-h".
+.TP
+\-\-literal
+Take file name arguments literally, do not expand wildcards. This has no
+effect on Unix where the shell expands wildcards.
+.TP
+\-\-noplugin
+Skip loading plugins. Implied by \-u NONE.
+.TP
+\-\-remote
+Connect to a Vim server and make it edit the files given in the rest of the
+arguments. If no server is found a warning is given and the files are edited
+in the current Vim.
+.TP
+\-\-remote\-expr {expr}
+Connect to a Vim server, evaluate {expr} in it and print the result on stdout.
+.TP
+\-\-remote\-send {keys}
+Connect to a Vim server and send {keys} to it.
+.TP
+\-\-remote\-silent
+As \-\-remote, but without the warning when no server is found.
+.TP
+\-\-remote\-wait
+As \-\-remote, but Vim does not exit until the files have been edited.
+.TP
+\-\-remote\-wait\-silent
+As \-\-remote\-wait, but without the warning when no server is found.
+.TP
+\-\-serverlist
+List the names of all Vim servers that can be found.
+.TP
+\-\-servername {name}
+Use {name} as the server name. Used for the current Vim, unless used with a
+\-\-remote argument, then it's the name of the server to connect to.
+.TP
+\-\-socketid {id}
+GTK GUI only: Use the GtkPlug mechanism to run gvim in another window.
+.TP
+\-\-startuptime {file}
+During startup write timing messages to the file {fname}.
+.TP
+\-\-version
+Print version information and exit.
+.SH ON-LINE HELP
+Type ":help" in
+.B Vim
+to get started.
+Type ":help subject" to get help on a specific subject.
+For example: ":help ZZ" to get help for the "ZZ" command.
+Use <Tab> and CTRL-D to complete subjects (":help cmdline\-completion").
+Tags are present to jump from one place to another (sort of hypertext links,
+see ":help").
+All documentation files can be viewed in this way, for example
+":help syntax.txt".
+.SH FILES
+.TP 15
+/usr/local/lib/vim/doc/*.txt
+The
+.B Vim
+documentation files.
+Use ":help doc\-file\-list" to get the complete list.
+.TP
+/usr/local/lib/vim/doc/tags
+The tags file used for finding information in the documentation files.
+.TP
+/usr/local/lib/vim/syntax/syntax.vim
+System wide syntax initializations.
+.TP
+/usr/local/lib/vim/syntax/*.vim
+Syntax files for various languages.
+.TP
+/usr/local/lib/vim/vimrc
+System wide
+.B Vim
+initializations.
+.TP
+~/.vimrc
+Your personal
+.B Vim
+initializations.
+.TP
+/usr/local/lib/vim/gvimrc
+System wide gvim initializations.
+.TP
+~/.gvimrc
+Your personal gvim initializations.
+.TP
+/usr/local/lib/vim/optwin.vim
+Script used for the ":options" command, a nice way to view and set options.
+.TP
+/usr/local/lib/vim/menu.vim
+System wide menu initializations for gvim.
+.TP
+/usr/local/lib/vim/bugreport.vim
+Script to generate a bug report. See ":help bugs".
+.TP
+/usr/local/lib/vim/filetype.vim
+Script to detect the type of a file by its name. See ":help 'filetype'".
+.TP
+/usr/local/lib/vim/scripts.vim
+Script to detect the type of a file by its contents. See ":help 'filetype'".
+.TP
+/usr/local/lib/vim/print/*.ps
+Files used for PostScript printing.
+.PP
+For recent info read the VIM home page:
+.br
+<URL:http://www.vim.org/>
+.SH SEE ALSO
+vimtutor(1)
+.SH AUTHOR
+Most of
+.B Vim
+was made by Bram Moolenaar, with a lot of help from others.
+See ":help credits" in
+.B Vim.
+.br
+.B Vim
+is based on Stevie, worked on by: Tim Thompson,
+Tony Andrews and G.R. (Fred) Walter.
+Although hardly any of the original code remains.
+.SH BUGS
+Probably.
+See ":help todo" for a list of known problems.
+.PP
+Note that a number of things that may be regarded as bugs by some, are in fact
+caused by a too-faithful reproduction of Vi's behaviour.
+And if you think other things are bugs "because Vi does it differently",
+you should take a closer look at the vi_diff.txt file (or type :help
+vi_diff.txt when in Vim).
+Also have a look at the 'compatible' and 'cpoptions' options.
diff --git a/runtime/doc/vim.man b/runtime/doc/vim.man
new file mode 100644
index 0000000..cc6a9bc
--- /dev/null
+++ b/runtime/doc/vim.man
@@ -0,0 +1,435 @@
+VIM(1) General Commands Manual VIM(1)
+
+
+
+NAME
+ vim - Vi IMproved, a programmer's text editor
+
+SYNOPSIS
+ vim [options] [file ..]
+ vim [options] -
+ vim [options] -t tag
+ vim [options] -q [errorfile]
+
+ ex
+ view
+ gvim gview evim eview
+ rvim rview rgvim rgview
+
+DESCRIPTION
+ Vim is a text editor that is upwards compatible to Vi. It can be used
+ to edit all kinds of plain text. It is especially useful for editing
+ programs.
+
+ There are a lot of enhancements above Vi: multi level undo, multi win‐
+ dows and buffers, syntax highlighting, command line editing, filename
+ completion, on-line help, visual selection, etc.. See ":help
+ vi_diff.txt" for a summary of the differences between Vim and Vi.
+
+ While running Vim a lot of help can be obtained from the on-line help
+ system, with the ":help" command. See the ON-LINE HELP section below.
+
+ Most often Vim is started to edit a single file with the command
+
+ vim file
+
+ More generally Vim is started with:
+
+ vim [options] [filelist]
+
+ If the filelist is missing, the editor will start with an empty buffer.
+ Otherwise exactly one out of the following four may be used to choose
+ one or more files to be edited.
+
+ file .. A list of filenames. The first one will be the current
+ file and read into the buffer. The cursor will be posi‐
+ tioned on the first line of the buffer. You can get to the
+ other files with the ":next" command. To edit a file that
+ starts with a dash, precede the filelist with "--".
+
+ - The file to edit is read from stdin. Commands are read
+ from stderr, which should be a tty.
+
+ -t {tag} The file to edit and the initial cursor position depends on
+ a "tag", a sort of goto label. {tag} is looked up in the
+ tags file, the associated file becomes the current file and
+ the associated command is executed. Mostly this is used
+ for C programs, in which case {tag} could be a function
+ name. The effect is that the file containing that function
+ becomes the current file and the cursor is positioned on
+ the start of the function. See ":help tag-commands".
+
+ -q [errorfile]
+ Start in quickFix mode. The file [errorfile] is read and
+ the first error is displayed. If [errorfile] is omitted,
+ the filename is obtained from the 'errorfile' option (de‐
+ faults to "AztecC.Err" for the Amiga, "errors.err" on other
+ systems). Further errors can be jumped to with the ":cn"
+ command. See ":help quickfix".
+
+ Vim behaves differently, depending on the name of the command (the exe‐
+ cutable may still be the same file).
+
+ vim The "normal" way, everything is default.
+
+ ex Start in Ex mode. Go to Normal mode with the ":vi" command.
+ Can also be done with the "-e" argument.
+
+ view Start in read-only mode. You will be protected from writing
+ the files. Can also be done with the "-R" argument.
+
+ gvim gview
+ The GUI version. Starts a new window. Can also be done with
+ the "-g" argument.
+
+ evim eview
+ The GUI version in easy mode. Starts a new window. Can also
+ be done with the "-y" argument.
+
+ rvim rview rgvim rgview
+ Like the above, but with restrictions. It will not be possi‐
+ ble to start shell commands, or suspend Vim. Can also be
+ done with the "-Z" argument.
+
+OPTIONS
+ The options may be given in any order, before or after filenames. Op‐
+ tions without an argument can be combined after a single dash.
+
+ +[num] For the first file the cursor will be positioned on line
+ "num". If "num" is missing, the cursor will be positioned
+ on the last line.
+
+ +/{pat} For the first file the cursor will be positioned in the
+ line with the first occurrence of {pat}. See ":help
+ search-pattern" for the available search patterns.
+
+ +{command}
+
+ -c {command}
+ {command} will be executed after the first file has been
+ read. {command} is interpreted as an Ex command. If the
+ {command} contains spaces it must be enclosed in double
+ quotes (this depends on the shell that is used). Example:
+ vim "+set si" main.c
+ Note: You can use up to 10 "+" or "-c" commands.
+
+ -S {file} {file} will be sourced after the first file has been read.
+ This is equivalent to -c "source {file}". {file} cannot
+ start with '-'. If {file} is omitted "Session.vim" is used
+ (only works when -S is the last argument).
+
+ --cmd {command}
+ Like using "-c", but the command is executed just before
+ processing any vimrc file. You can use up to 10 of these
+ commands, independently from "-c" commands.
+
+ -A If Vim has been compiled with ARABIC support for editing
+ right-to-left oriented files and Arabic keyboard mapping,
+ this option starts Vim in Arabic mode, i.e. 'arabic' is
+ set. Otherwise an error message is given and Vim aborts.
+
+ -b Binary mode. A few options will be set that makes it pos‐
+ sible to edit a binary or executable file.
+
+ -C Compatible. Set the 'compatible' option. This will make
+ Vim behave mostly like Vi, even though a .vimrc file ex‐
+ ists.
+
+ -d Start in diff mode. There should between two to eight file
+ name arguments. Vim will open all the files and show dif‐
+ ferences between them. Works like vimdiff(1).
+
+ -d {device} Open {device} for use as a terminal. Only on the Amiga.
+ Example: "-d con:20/30/600/150".
+
+ -D Debugging. Go to debugging mode when executing the first
+ command from a script.
+
+ -e Start Vim in Ex mode, just like the executable was called
+ "ex".
+
+ -E Start Vim in improved Ex mode, just like the executable was
+ called "exim".
+
+ -f Foreground. For the GUI version, Vim will not fork and de‐
+ tach from the shell it was started in. On the Amiga, Vim
+ is not restarted to open a new window. This option should
+ be used when Vim is executed by a program that will wait
+ for the edit session to finish (e.g. mail). On the Amiga
+ the ":sh" and ":!" commands will not work.
+
+ --nofork Foreground. For the GUI version, Vim will not fork and de‐
+ tach from the shell it was started in.
+
+ -F If Vim has been compiled with FKMAP support for editing
+ right-to-left oriented files and Farsi keyboard mapping,
+ this option starts Vim in Farsi mode, i.e. 'fkmap' and
+ 'rightleft' are set. Otherwise an error message is given
+ and Vim aborts.
+
+ -g If Vim has been compiled with GUI support, this option en‐
+ ables the GUI. If no GUI support was compiled in, an error
+ message is given and Vim aborts.
+
+ -h Give a bit of help about the command line arguments and op‐
+ tions. After this Vim exits.
+
+ -H If Vim has been compiled with RIGHTLEFT support for editing
+ right-to-left oriented files and Hebrew keyboard mapping,
+ this option starts Vim in Hebrew mode, i.e. 'hkmap' and
+ 'rightleft' are set. Otherwise an error message is given
+ and Vim aborts.
+
+ -i {viminfo}
+ Specifies the filename to use when reading or writing the
+ viminfo file, instead of the default "~/.viminfo". This
+ can also be used to skip the use of the .viminfo file, by
+ giving the name "NONE".
+
+ -L Same as -r.
+
+ -l Lisp mode. Sets the 'lisp' and 'showmatch' options on.
+
+ -m Modifying files is disabled. Resets the 'write' option.
+ You can still modify the buffer, but writing a file is not
+ possible.
+
+ -M Modifications not allowed. The 'modifiable' and 'write'
+ options will be unset, so that changes are not allowed and
+ files can not be written. Note that these options can be
+ set to enable making modifications.
+
+ -N No-compatible mode. Resets the 'compatible' option. This
+ will make Vim behave a bit better, but less Vi compatible,
+ even though a .vimrc file does not exist.
+
+ -n No swap file will be used. Recovery after a crash will be
+ impossible. Handy if you want to edit a file on a very
+ slow medium (e.g. floppy). Can also be done with ":set
+ uc=0". Can be undone with ":set uc=200".
+
+ -nb Become an editor server for NetBeans. See the docs for de‐
+ tails.
+
+ -o[N] Open N windows stacked. When N is omitted, open one window
+ for each file.
+
+ -O[N] Open N windows side by side. When N is omitted, open one
+ window for each file.
+
+ -p[N] Open N tab pages. When N is omitted, open one tab page for
+ each file.
+
+ -R Read-only mode. The 'readonly' option will be set. You
+ can still edit the buffer, but will be prevented from acci‐
+ dentally overwriting a file. If you do want to overwrite a
+ file, add an exclamation mark to the Ex command, as in
+ ":w!". The -R option also implies the -n option (see
+ above). The 'readonly' option can be reset with ":set
+ noro". See ":help 'readonly'".
+
+ -r List swap files, with information about using them for re‐
+ covery.
+
+ -r {file} Recovery mode. The swap file is used to recover a crashed
+ editing session. The swap file is a file with the same
+ filename as the text file with ".swp" appended. See ":help
+ recovery".
+
+ -s Silent mode. Only when started as "Ex" or when the "-e"
+ option was given before the "-s" option.
+
+ -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.
+
+ -T {terminal}
+ Tells Vim the name of the terminal you are using. Only re‐
+ quired when the automatic way doesn't work. Should be a
+ terminal known to Vim (builtin) or defined in the termcap
+ or terminfo file.
+
+ -u {vimrc} Use the commands in the file {vimrc} for initializations.
+ All the other initializations are skipped. Use this to
+ edit a special kind of files. It can also be used to skip
+ all initializations by giving the name "NONE". See ":help
+ initialization" within vim for more details.
+
+ -U {gvimrc} Use the commands in the file {gvimrc} for GUI initializa‐
+ tions. All the other GUI initializations are skipped. It
+ can also be used to skip all GUI initializations by giving
+ the name "NONE". See ":help gui-init" within vim for more
+ details.
+
+ -V[N] Verbose. Give messages about which files are sourced and
+ for reading and writing a viminfo file. The optional num‐
+ ber N is the value for 'verbose'. Default is 10.
+
+ -v Start Vim in Vi mode, just like the executable was called
+ "vi". This only has effect when the executable is called
+ "ex".
+
+ -w {scriptout}
+ All the characters that you type are recorded in the file
+ {scriptout}, until you exit Vim. This is useful if you
+ want to create a script file to be used with "vim -s" or
+ ":source!". If the {scriptout} file exists, characters are
+ appended.
+
+ -W {scriptout}
+ Like -w, but an existing file is overwritten.
+
+ -x Use encryption when writing files. Will prompt for a crypt
+ key.
+
+ -X Don't connect to the X server. Shortens startup time in a
+ terminal, but the window title and clipboard will not be
+ used.
+
+ -y Start Vim in easy mode, just like the executable was called
+ "evim" or "eview". Makes Vim behave like a click-and-type
+ editor.
+
+ -Z Restricted mode. Works like the executable starts with
+ "r".
+
+ -- Denotes the end of the options. Arguments after this will
+ be handled as a file name. This can be used to edit a
+ filename that starts with a '-'.
+
+ --clean Do not use any personal configuration (vimrc, plugins,
+ etc.). Useful to see if a problem reproduces with a clean
+ Vim setup.
+
+ --echo-wid GTK GUI only: Echo the Window ID on stdout.
+
+ --help Give a help message and exit, just like "-h".
+
+ --literal Take file name arguments literally, do not expand wild‐
+ cards. This has no effect on Unix where the shell expands
+ wildcards.
+
+ --noplugin Skip loading plugins. Implied by -u NONE.
+
+ --remote Connect to a Vim server and make it edit the files given in
+ the rest of the arguments. If no server is found a warning
+ is given and the files are edited in the current Vim.
+
+ --remote-expr {expr}
+ Connect to a Vim server, evaluate {expr} in it and print
+ the result on stdout.
+
+ --remote-send {keys}
+ Connect to a Vim server and send {keys} to it.
+
+ --remote-silent
+ As --remote, but without the warning when no server is
+ found.
+
+ --remote-wait
+ As --remote, but Vim does not exit until the files have
+ been edited.
+
+ --remote-wait-silent
+ As --remote-wait, but without the warning when no server is
+ found.
+
+ --serverlist
+ List the names of all Vim servers that can be found.
+
+ --servername {name}
+ Use {name} as the server name. Used for the current Vim,
+ unless used with a --remote argument, then it's the name of
+ the server to connect to.
+
+ --socketid {id}
+ GTK GUI only: Use the GtkPlug mechanism to run gvim in an‐
+ other window.
+
+ --startuptime {file}
+ During startup write timing messages to the file {fname}.
+
+ --version Print version information and exit.
+
+ON-LINE HELP
+ Type ":help" in Vim to get started. Type ":help subject" to get help
+ on a specific subject. For example: ":help ZZ" to get help for the
+ "ZZ" command. Use <Tab> and CTRL-D to complete subjects (":help cmd‐
+ line-completion"). Tags are present to jump from one place to another
+ (sort of hypertext links, see ":help"). All documentation files can be
+ viewed in this way, for example ":help syntax.txt".
+
+FILES
+ /usr/local/lib/vim/doc/*.txt
+ The Vim documentation files. Use ":help doc-file-list"
+ to get the complete list.
+
+ /usr/local/lib/vim/doc/tags
+ The tags file used for finding information in the docu‐
+ mentation files.
+
+ /usr/local/lib/vim/syntax/syntax.vim
+ System wide syntax initializations.
+
+ /usr/local/lib/vim/syntax/*.vim
+ Syntax files for various languages.
+
+ /usr/local/lib/vim/vimrc
+ System wide Vim initializations.
+
+ ~/.vimrc Your personal Vim initializations.
+
+ /usr/local/lib/vim/gvimrc
+ System wide gvim initializations.
+
+ ~/.gvimrc Your personal gvim initializations.
+
+ /usr/local/lib/vim/optwin.vim
+ Script used for the ":options" command, a nice way to
+ view and set options.
+
+ /usr/local/lib/vim/menu.vim
+ System wide menu initializations for gvim.
+
+ /usr/local/lib/vim/bugreport.vim
+ Script to generate a bug report. See ":help bugs".
+
+ /usr/local/lib/vim/filetype.vim
+ Script to detect the type of a file by its name. See
+ ":help 'filetype'".
+
+ /usr/local/lib/vim/scripts.vim
+ Script to detect the type of a file by its contents.
+ See ":help 'filetype'".
+
+ /usr/local/lib/vim/print/*.ps
+ Files used for PostScript printing.
+
+ For recent info read the VIM home page:
+ <URL:http://www.vim.org/>
+
+SEE ALSO
+ vimtutor(1)
+
+AUTHOR
+ Most of Vim was made by Bram Moolenaar, with a lot of help from others.
+ See ":help credits" in Vim.
+ Vim is based on Stevie, worked on by: Tim Thompson, Tony Andrews and
+ G.R. (Fred) Walter. Although hardly any of the original code remains.
+
+BUGS
+ Probably. See ":help todo" for a list of known problems.
+
+ Note that a number of things that may be regarded as bugs by some, are
+ in fact caused by a too-faithful reproduction of Vi's behaviour. And
+ if you think other things are bugs "because Vi does it differently",
+ you should take a closer look at the vi_diff.txt file (or type :help
+ vi_diff.txt when in Vim). Also have a look at the 'compatible' and
+ 'cpoptions' options.
+
+
+
+ 2021 Jun 13 VIM(1)
diff --git a/runtime/doc/vim.man.info b/runtime/doc/vim.man.info
new file mode 100755
index 0000000..133f9a0
--- /dev/null
+++ b/runtime/doc/vim.man.info
Binary files differ
diff --git a/runtime/doc/vim2html.pl b/runtime/doc/vim2html.pl
new file mode 100644
index 0000000..9066b03
--- /dev/null
+++ b/runtime/doc/vim2html.pl
@@ -0,0 +1,228 @@
+#!/usr/bin/env perl
+
+# converts vim documentation to simple html
+# Sirtaj Singh Kang (taj@kde.org)
+
+# Sun Feb 24 14:49:17 CET 2002
+
+use strict;
+use vars qw/%url $date/;
+
+%url = ();
+$date = `date`;
+chop $date;
+
+sub maplink
+{
+ my $tag = shift;
+ if( exists $url{ $tag } ){
+ return $url{ $tag };
+ } else {
+ #warn "Unknown hyperlink target: $tag\n";
+ $tag =~ s/\.txt//;
+ $tag =~ s/</&lt;/g;
+ $tag =~ s/>/&gt;/g;
+ return "<code class=\"badlink\">$tag</code>";
+ }
+}
+
+sub readTagFile
+{
+ my($tagfile) = @_;
+ my( $tag, $file, $name );
+
+ open(TAGS,"$tagfile") || die "can't read tags\n";
+
+ while( <TAGS> ) {
+ next unless /^(\S+)\s+(\S+)\s+/;
+
+ $tag = $1;
+ my $label = $tag;
+ ($file= $2) =~ s/.txt$/.html/g;
+ $label =~ s/\.txt//;
+
+ $url{ $tag } = "<a href=\"$file#".escurl($tag)."\">".esctext($label)."</a>";
+ }
+ close( TAGS );
+}
+
+sub esctext
+{
+ my $text = shift;
+ $text =~ s/&/&amp;/g;
+ $text =~ s/</&lt;/g;
+ $text =~ s/>/&gt;/g;
+ return $text;
+}
+
+sub escurl
+{
+ my $url = shift;
+ $url =~ s/"/%22/g;
+ $url =~ s/~/%7E/g;
+ $url =~ s/</%3C/g;
+ $url =~ s/>/%3E/g;
+ $url =~ s/=/%20/g;
+ $url =~ s/#/%23/g;
+ $url =~ s/\//%2F/g;
+
+ return $url;
+}
+
+sub vim2html
+{
+ my( $infile ) = @_;
+ my( $outfile );
+
+ open(IN, "$infile" ) || die "Couldn't read from $infile: $!.\n";
+
+ ($outfile = $infile) =~ s:.*/::g;
+ $outfile =~ s/\.txt$//g;
+
+ open( OUT, ">$outfile.html" )
+ || die "Couldn't write to $outfile.html: $!.\n";
+ my $head = uc( $outfile );
+
+ print OUT<<EOF;
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>VIM: $outfile</title>
+<link rel="stylesheet" href="vim-stylesheet.css" type="text/css">
+</head>
+<body>
+<h2>$head</h2>
+<pre>
+EOF
+
+ my $inexample = 0;
+ while( <IN> ) {
+ chop;
+ if ( /^\s*[-=]+\s*$/ ) {
+ print OUT "</pre><hr><pre>";
+ next;
+ }
+
+ # examples
+ elsif( /^>$/ || /\s>$/ ) {
+ $inexample = 1;
+ chop;
+ }
+ elsif ( $inexample && /^([<\S])/ ) {
+ $inexample = 0;
+ $_ = $' if $1 eq "<";
+ }
+
+ s/\s+$//g;
+
+ # Various vim highlights. note that < and > have already been escaped
+ # so that HTML doesn't get screwed up.
+
+ my @out = ();
+ # print "Text: $_\n";
+ LOOP:
+ foreach my $token ( split /((?:\|[^\|]+\|)|(?:\*[^\*]+\*))/ ) {
+ if ( $token =~ /^\|([^\|]+)\|/ ) {
+ # link
+ push( @out, "|".maplink( $1 )."|" );
+ next LOOP;
+ }
+ elsif ( $token =~ /^\*([^\*]+)\*/ ) {
+ # target
+ push( @out,
+ "<b class=\"vimtag\">\*<a name=\"".escurl($1)."\">".esctext($1)."<\/a>\*<\/b>");
+ next LOOP;
+ }
+
+ $_ = esctext($token);
+ s/CTRL-(\w+)/<code class="keystroke">CTRL-$1<\/code>/g;
+ # parameter <...>
+ s/&lt;(.*?)&gt;/<code class="special">&lt;$1&gt;<\/code>/g;
+
+ # parameter {...}
+ s/\{([^}]*)\}/<code class="special">{$1}<\/code>/g;
+
+ # parameter [...]
+ s/\[(range|line|count|offset|cmd|[-+]?num)\]/<code class="special">\[$1\]<\/code>/g;
+ # note
+ s/(Note:?)/<code class="note">$1<\/code>/gi;
+
+ # local heading
+ s/^(.*)\~$/<code class="section">$1<\/code>/g;
+ push( @out, $_ );
+ }
+
+ $_ = join( "", @out );
+
+ if( $inexample == 2 ) {
+ print OUT "<code class=\"example\">$_</code>\n";
+ } else {
+ print OUT $_,"\n";
+ }
+
+ $inexample = 2 if $inexample == 1;
+ }
+ print OUT<<EOF;
+</pre>
+<p><i>Generated by vim2html on $date</i></p>
+</body>
+</html>
+EOF
+
+}
+
+sub usage
+{
+die<<EOF;
+vim2html.pl: converts vim documentation to HTML.
+usage:
+
+ vim2html.pl <tag file> <text files>
+EOF
+}
+
+
+sub writeCSS
+{
+ open( CSS, ">vim-stylesheet.css" ) || die "Couldn't write stylesheet: $!\n";
+ print CSS<<EOF;
+body { background-color: white; color: black;}
+:link { color: rgb(0,137,139); }
+:visited { color: rgb(0,100,100);
+ background-color: white; /* should be inherit */ }
+:active { color: rgb(0,200,200);
+ background-color: white; /* should be inherit */ }
+
+B.vimtag { color : rgb(250,0,250); }
+
+h1, h2 { color: rgb(82,80,82); text-align: center; }
+h3, h4, h5, h6 { color: rgb(82,80,82); }
+.headline { color: rgb(0,137,139); }
+.header { color: rgb(164, 32, 246); }
+.section { color: rgb(164, 32, 246); }
+.keystroke { color: rgb(106, 89, 205); }
+.vim { }
+.example { color: rgb(0, 0, 255); }
+.option { }
+.notvi { }
+.special { color: rgb(106, 89, 205); }
+.note { color: blue; background-color: yellow; }
+.sub {}
+.badlink { color: rgb(0,37,39); }
+EOF
+
+}
+
+# main
+usage() if $#ARGV < 1;
+
+print "Processing tags...\n";
+readTagFile( $ARGV[ 0 ] );
+
+foreach my $file ( 1..$#ARGV ) {
+ print "Processing ".$ARGV[ $file ]."...\n";
+ vim2html( $ARGV[ $file ] );
+}
+print "Writing stylesheet...\n";
+writeCSS();
+print "done.\n"
diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt
new file mode 100644
index 0000000..bb4a096
--- /dev/null
+++ b/runtime/doc/vim9.txt
@@ -0,0 +1,2246 @@
+*vim9.txt* For Vim version 9.0. Last change: 2023 Feb 21
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Vim9 script commands and expressions. *Vim9* *vim9*
+
+Most expression help is in |eval.txt|. This file is about the new syntax and
+features in Vim9 script.
+
+
+
+1. What is Vim9 script? |Vim9-script|
+2. Differences |vim9-differences|
+3. New style functions |fast-functions|
+4. Types |vim9-types|
+5. Namespace, Import and Export |vim9script|
+6. Classes and interfaces |vim9-classes|
+
+9. Rationale |vim9-rationale|
+
+==============================================================================
+
+1. What is Vim9 script? *Vim9-script*
+
+Vim script has been growing over time, while preserving backwards
+compatibility. That means bad choices from the past often can't be changed
+and compatibility with Vi restricts possible solutions. Execution is quite
+slow, each line is parsed every time it is executed.
+
+The main goal of Vim9 script is to drastically improve performance. This is
+accomplished by compiling commands into instructions that can be efficiently
+executed. An increase in execution speed of 10 to 100 times can be expected.
+
+A secondary goal is to avoid Vim-specific constructs and get closer to
+commonly used programming languages, such as JavaScript, TypeScript and Java.
+
+The performance improvements can only be achieved by not being 100% backwards
+compatible. For example, making function arguments available in the "a:"
+dictionary adds quite a lot of overhead. In a Vim9 function this dictionary
+is not available. Other differences are more subtle, such as how errors are
+handled.
+
+The Vim9 script syntax and semantics are used in:
+- a function defined with the `:def` command
+- a script file where the first command is `vim9script`
+- an autocommand defined in the context of the above
+- a command prefixed with the `vim9cmd` command modifier
+
+When using `:function` in a Vim9 script file the legacy syntax is used, with
+the highest |scriptversion|. However, this can be confusing and is therefore
+discouraged.
+
+Vim9 script and legacy Vim script can be mixed. There is no requirement to
+rewrite old scripts, they keep working as before. You may want to use a few
+`:def` functions for code that needs to be fast.
+
+:vim9[cmd] {cmd} *:vim9* *:vim9cmd* *E1164*
+ Evaluate and execute {cmd} using Vim9 script syntax and
+ semantics. Useful when typing a command and in a legacy
+ script or function.
+
+:leg[acy] {cmd} *:leg* *:legacy* *E1189* *E1234*
+ Evaluate and execute {cmd} using legacy script syntax and
+ semantics. Only useful in a Vim9 script or a :def function.
+ Note that {cmd} cannot use local variables, since it is parsed
+ with legacy expression syntax.
+
+==============================================================================
+
+2. Differences from legacy Vim script *vim9-differences*
+
+Overview ~
+ *E1146*
+Brief summary of the differences you will most often encounter when using Vim9
+script and `:def` functions; details are below:
+- Comments start with #, not ": >
+ echo "hello" # comment
+- Using a backslash for line continuation is hardly ever needed: >
+ echo "hello "
+ .. yourName
+ .. ", how are you?"
+- White space is required in many places to improve readability.
+- Assign values without `:let` *E1126* , declare variables with `:var`: >
+ var count = 0
+ count += 3
+- Constants can be declared with `:final` and `:const`: >
+ final matches = [] # add to the list later
+ const names = ['Betty', 'Peter'] # cannot be changed
+- `:final` cannot be used as an abbreviation of `:finally`.
+- Variables and functions are script-local by default.
+- Functions are declared with argument types and return type: >
+ def CallMe(count: number, message: string): bool
+- Call functions without `:call`: >
+ writefile(['done'], 'file.txt')
+- You cannot use old Ex commands:
+ `:Print`
+ `:append`
+ `:change`
+ `:d` directly followed by 'd' or 'p'.
+ `:insert`
+ `:k`
+ `:mode`
+ `:open`
+ `:s` with only flags
+ `:t`
+ `:xit`
+- Some commands, especially those used for flow control, cannot be shortened.
+ E.g., `:throw` cannot be written as `:th`. *vim9-no-shorten*
+- You cannot use curly-braces names.
+- A range before a command must be prefixed with a colon: >
+ :%s/this/that
+- Executing a register with "@r" does not work, you can prepend a colon or use
+ `:exe`: >
+ :exe @a
+- Unless mentioned specifically, the highest |scriptversion| is used.
+- When defining an expression mapping, the expression will be evaluated in the
+ context of the script where it was defined.
+
+
+Comments starting with # ~
+
+In legacy Vim script comments start with double quote. In Vim9 script
+comments start with #. >
+ # declarations
+ var count = 0 # number of occurrences
+
+The reason is that a double quote can also be the start of a string. In many
+places, especially halfway through an expression with a line break, it's hard
+to tell what the meaning is, since both a string and a comment can be followed
+by arbitrary text. To avoid confusion only # comments are recognized. This
+is the same as in shell scripts and Python programs.
+
+In Vi # is a command to list text with numbers. In Vim9 script you can use
+`:number` for that. >
+ :101 number
+
+To improve readability there must be a space between a command and the #
+that starts a comment: >
+ var name = value # comment
+ var name = value# error!
+< *E1170*
+Do not start a comment with #{, it looks like the legacy dictionary literal
+and produces an error where this might be confusing. #{{ or #{{{ are OK,
+these can be used to start a fold.
+
+When starting to read a script file Vim doesn't know it is |Vim9| script until
+the `vim9script` command is found. Until that point you would need to use
+legacy comments: >
+ " legacy comment
+ vim9script
+ # Vim9 comment
+
+That looks ugly, better put `vim9script` in the very first line: >
+ vim9script
+ # Vim9 comment
+
+In legacy Vim script # is also used for the alternate file name. In Vim9
+script you need to use %% instead. Instead of ## use %%% (stands for all
+arguments).
+
+
+Vim9 functions ~
+ *E1099*
+A function defined with `:def` is compiled. Execution is many times faster,
+often 10 to 100 times.
+
+Many errors are already found when compiling, before the function is executed.
+The syntax is strict, to enforce code that is easy to read and understand.
+
+Compilation is done when any of these is encountered:
+- the first time the function is called
+- when the `:defcompile` command is encountered in the script after the
+ function was defined
+- `:disassemble` is used for the function.
+- a function that is compiled calls the function or uses it as a function
+ reference (so that the argument and return types can be checked)
+ *E1091* *E1191*
+If compilation fails it is not tried again on the next call, instead this
+error is given: "E1091: Function is not compiled: {name}".
+Compilation will fail when encountering a user command that has not been
+created yet. In this case you can call `execute()` to invoke it at runtime. >
+ def MyFunc()
+ execute('DefinedLater')
+ enddef
+
+`:def` has no options like `:function` does: "range", "abort", "dict" or
+"closure". A `:def` function always aborts on an error (unless `:silent!` was
+used for the command or the error was caught a `:try` block), does not get a
+range passed, cannot be a "dict" function, and can always be a closure.
+ *vim9-no-dict-function*
+Later classes will be added, which replaces the "dict function" mechanism.
+For now you will need to pass the dictionary explicitly: >
+ def DictFunc(self: dict<any>, arg: string)
+ echo self[arg]
+ enddef
+ var ad = {item: 'value', func: DictFunc}
+ ad.func(ad, 'item')
+
+You can call a legacy dict function though: >
+ func Legacy() dict
+ echo self.value
+ endfunc
+ def CallLegacy()
+ var d = {func: Legacy, value: 'text'}
+ d.func()
+ enddef
+< *E1096* *E1174* *E1175*
+The argument types and return type need to be specified. The "any" type can
+be used, type checking will then be done at runtime, like with legacy
+functions.
+ *E1106*
+Arguments are accessed by name, without "a:", just like any other language.
+There is no "a:" dictionary or "a:000" list.
+ *vim9-variable-arguments* *E1055* *E1160* *E1180*
+Variable arguments are defined as the last argument, with a name and have a
+list type, similar to TypeScript. For example, a list of numbers: >
+ def MyFunc(...itemlist: list<number>)
+ for item in itemlist
+ ...
+
+When a function argument is optional (it has a default value) passing `v:none`
+as the argument results in using the default value. This is useful when you
+want to specify a value for an argument that comes after an argument that
+should use its default value. Example: >
+ def MyFunc(one = 'one', last = 'last')
+ ...
+ enddef
+ MyFunc(v:none, 'LAST') # first argument uses default value 'one'
+<
+ *vim9-ignored-argument* *E1181*
+The argument "_" (an underscore) can be used to ignore the argument. This is
+most useful in callbacks where you don't need it, but do need to give an
+argument to match the call. E.g. when using map() two arguments are passed,
+the key and the value, to ignore the key: >
+ map(numberList, (_, v) => v * 2)
+There is no error for using the "_" argument multiple times. No type needs to
+be given.
+
+
+Functions and variables are script-local by default ~
+ *vim9-scopes*
+When using `:function` or `:def` to specify a new function at the script level
+in a Vim9 script, the function is local to the script. Like prefixing "s:" in
+legacy script. To define a global function or variable the "g:" prefix must
+be used. For functions in a script that is to be imported and in an autoload
+script "export" needs to be used for those to be used elsewhere. >
+ def ThisFunction() # script-local
+ def g:ThatFunction() # global
+ export def Function() # for import and import autoload
+< *E1058* *E1075*
+When using `:function` or `:def` to specify a nested function inside a `:def`
+function and no namespace was given, this nested function is local to the code
+block it is defined in. It cannot be used in `function()` with a string
+argument, pass the function reference itself: >
+ def Outer()
+ def Inner()
+ echo 'inner'
+ enddef
+ var Fok = function(Inner) # OK
+ var Fbad = function('Inner') # does not work
+
+Detail: this is because "Inner" will actually become a function reference to a
+function with a generated name.
+
+It is not possible to define a script-local function in a function. You can
+define a local function and assign it to a script-local Funcref (it must have
+been declared at the script level). It is possible to define a global
+function by using the "g:" prefix.
+
+When referring to a function and no "s:" or "g:" prefix is used, Vim will
+search for the function:
+- in the function scope, in block scopes
+- in the script scope
+
+Imported functions are found with the prefix from the `:import` command.
+
+Since a script-local function reference can be used without "s:" the name must
+start with an upper case letter even when using the "s:" prefix. In legacy
+script "s:funcref" could be used, because it could not be referred to with
+"funcref". In Vim9 script it can, therefore "s:Funcref" must be used to avoid
+that the name interferes with builtin functions.
+ *vim9-s-namespace* *E1268*
+The use of the "s:" prefix is not supported at the Vim9 script level. All
+functions and variables without a prefix are script-local.
+
+In :def functions the use of "s:" depends on the script: Script-local
+variables and functions in a legacy script do use "s:", while in a Vim9 script
+they do not use "s:". This matches what you see in the rest of the file.
+
+In legacy functions the use of "s:" for script items is required, as before.
+No matter if the script is Vim9 or legacy.
+
+In all cases the function must be defined before used. That is when it is
+called, when `:defcompile` causes it to be compiled, or when code that calls
+it is being compiled (to figure out the return type).
+
+The result is that functions and variables without a namespace can usually be
+found in the script, either defined there or imported. Global functions and
+variables could be defined anywhere (good luck finding out where! You can
+often see where it was last set using |:verbose|).
+ *E1102*
+Global functions can still be defined and deleted at nearly any time. In
+Vim9 script script-local functions are defined once when the script is sourced
+and cannot be deleted or replaced by itself (it can be by reloading the
+script).
+
+When compiling a function and a function call is encountered for a function
+that is not (yet) defined, the |FuncUndefined| autocommand is not triggered.
+You can use an autoload function if needed, or call a legacy function and have
+|FuncUndefined| triggered there.
+
+
+Reloading a Vim9 script clears functions and variables by default ~
+ *vim9-reload* *E1149* *E1150*
+When loading a legacy Vim script a second time nothing is removed, the
+commands will replace existing variables and functions, create new ones, and
+leave removed things hanging around.
+
+When loading a Vim9 script a second time all existing script-local functions
+and variables are deleted, thus you start with a clean slate. This is useful
+if you are developing a plugin and want to try a new version. If you renamed
+something you don't have to worry about the old name still hanging around.
+
+If you do want to keep items, use: >
+ vim9script noclear
+
+You want to use this in scripts that use a `finish` command to bail out at
+some point when loaded again. E.g. when a buffer local option is set to a
+function, the function does not need to be defined more than once: >
+ vim9script noclear
+ setlocal completefunc=SomeFunc
+ if exists('*SomeFunc')
+ finish
+ endif
+ def SomeFunc()
+ ....
+
+
+Variable declarations with :var, :final and :const ~
+ *vim9-declaration* *:var* *E1079*
+ *E1017* *E1020* *E1054* *E1087* *E1108* *E1124*
+Local variables need to be declared with `:var`. Local constants need to be
+declared with `:final` or `:const`. We refer to both as "variables" in this
+section.
+
+Variables can be local to a script, function or code block: >
+ vim9script
+ var script_var = 123
+ def SomeFunc()
+ var func_var = script_var
+ if cond
+ var block_var = func_var
+ ...
+
+The variables are only visible in the block where they are defined and nested
+blocks. Once the block ends the variable is no longer accessible: >
+ if cond
+ var inner = 5
+ else
+ var inner = 0
+ endif
+ echo inner # Error!
+
+The declaration must be done earlier: >
+ var inner: number
+ if cond
+ inner = 5
+ else
+ inner = 0
+ endif
+ echo inner
+
+Although this is shorter and faster for simple values: >
+ var inner = 0
+ if cond
+ inner = 5
+ endif
+ echo inner
+< *E1025* *E1128*
+To intentionally hide a variable from code that follows, a block can be
+used: >
+ {
+ var temp = 'temp'
+ ...
+ }
+ echo temp # Error!
+
+This is especially useful in a user command: >
+ command -range Rename {
+ var save = @a
+ @a = 'some expression'
+ echo 'do something with ' .. @a
+ @a = save
+ }
+
+And with autocommands: >
+ au BufWritePre *.go {
+ var save = winsaveview()
+ silent! exe ':%! some formatting command'
+ winrestview(save)
+ }
+
+Although using a :def function probably works better.
+
+ *E1022* *E1103* *E1130* *E1131* *E1133*
+ *E1134*
+Declaring a variable with a type but without an initializer will initialize to
+false (for bool), empty (for string, list, dict, etc.) or zero (for number,
+any, etc.). This matters especially when using the "any" type, the value will
+default to the number zero. For example, when declaring a list, items can be
+added: >
+ var myList: list<number>
+ myList->add(7)
+
+Initializing a variable to a null value, e.g. `null_list`, differs from not
+initializing the variable. This throws an error: >
+ var myList = null_list
+ myList->add(7) # E1130: Cannot add to null list
+
+< *E1016* *E1052* *E1066*
+In Vim9 script `:let` cannot be used. An existing variable is assigned to
+without any command. The same for global, window, tab, buffer and Vim
+variables, because they are not really declared. Those can also be deleted
+with `:unlet`.
+ *E1065*
+You cannot use `:va` to declare a variable, it must be written with the full
+name `:var`. Just to make sure it is easy to read.
+ *E1178*
+`:lockvar` does not work on local variables. Use `:const` and `:final`
+instead.
+
+The `exists()` and `exists_compiled()` functions do not work on local variables
+or arguments.
+ *E1006* *E1041* *E1167* *E1168* *E1213*
+Variables, functions and function arguments cannot shadow previously defined
+or imported variables and functions in the same script file.
+Variables may shadow Ex commands, rename the variable if needed.
+
+Global variables must be prefixed with "g:", also at the script level. >
+ vim9script
+ var script_local = 'text'
+ g:global = 'value'
+ var Funcref = g:ThatFunction
+
+Global functions must be prefixed with "g:": >
+ vim9script
+ def g:GlobalFunc(): string
+ return 'text'
+ enddef
+ echo g:GlobalFunc()
+The "g:" prefix is not needed for auto-load functions.
+
+ *vim9-function-defined-later*
+Although global functions can be called without the "g:" prefix, they must
+exist when compiled. By adding the "g:" prefix the function can be defined
+later. Example: >
+ def CallPluginFunc()
+ if exists('g:loaded_plugin')
+ g:PluginFunc()
+ endif
+ enddef
+
+If you do it like this, you get an error at compile time that "PluginFunc"
+does not exist, even when "g:loaded_plugin" does not exist: >
+ def CallPluginFunc()
+ if exists('g:loaded_plugin')
+ PluginFunc() # Error - function not found
+ endif
+ enddef
+
+You can use exists_compiled() to avoid the error, but then the function would
+not be called, even when "g:loaded_plugin" is defined later: >
+ def CallPluginFunc()
+ if exists_compiled('g:loaded_plugin')
+ PluginFunc() # Function may never be called
+ endif
+ enddef
+
+Since `&opt = value` is now assigning a value to option "opt", ":&" cannot be
+used to repeat a `:substitute` command.
+ *vim9-unpack-ignore*
+For an unpack assignment the underscore can be used to ignore a list item,
+similar to how a function argument can be ignored: >
+ [a, _, c] = theList
+To ignore any remaining items: >
+ [a, b; _] = longList
+< *E1163* *E1080*
+Declaring more than one variable at a time, using the unpack notation, is
+possible. Each variable can have a type or infer it from the value: >
+ var [v1: number, v2] = GetValues()
+Use this only when there is a list with values, declaring one variable per
+line is much easier to read and change later.
+
+
+Constants ~
+ *vim9-const* *vim9-final*
+How constants work varies between languages. Some consider a variable that
+can't be assigned another value a constant. JavaScript is an example. Others
+also make the value immutable, thus when a constant uses a list, the list
+cannot be changed. In Vim9 we can use both.
+ *E1021* *E1307*
+`:const` is used for making both the variable and the value a constant. Use
+this for composite structures that you want to make sure will not be modified.
+Example: >
+ const myList = [1, 2]
+ myList = [3, 4] # Error!
+ myList[0] = 9 # Error!
+ myList->add(3) # Error!
+< *:final* *E1125*
+`:final` is used for making only the variable a constant, the value can be
+changed. This is well known from Java. Example: >
+ final myList = [1, 2]
+ myList = [3, 4] # Error!
+ myList[0] = 9 # OK
+ myList->add(3) # OK
+
+It is common to write constants as ALL_CAPS, but you don't have to.
+
+The constant only applies to the value itself, not what it refers to. >
+ final females = ["Mary"]
+ const NAMES = [["John", "Peter"], females]
+ NAMES[0] = ["Jack"] # Error!
+ NAMES[0][0] = "Jack" # Error!
+ NAMES[1] = ["Emma"] # Error!
+ NAMES[1][0] = "Emma" # OK, now females[0] == "Emma"
+
+
+Omitting :call and :eval ~
+ *E1190*
+Functions can be called without `:call`: >
+ writefile(lines, 'file')
+Using `:call` is still possible, but this is discouraged.
+
+A method call without `eval` is possible, so long as the start is an
+identifier or can't be an Ex command. For a function either "(" or "->" must
+be following, without a line break. Examples: >
+ myList->add(123)
+ g:myList->add(123)
+ [1, 2, 3]->Process()
+ {a: 1, b: 2}->Process()
+ "foobar"->Process()
+ ("foobar")->Process()
+ 'foobar'->Process()
+ ('foobar')->Process()
+
+In the rare case there is ambiguity between a function name and an Ex command,
+prepend ":" to make clear you want to use the Ex command. For example, there
+is both the `:substitute` command and the `substitute()` function. When the
+line starts with `substitute(` this will use the function. Prepend a colon to
+use the command instead: >
+ :substitute(pattern (replacement (
+
+If the expression starts with "!" this is interpreted as a shell command, not
+negation of a condition. Thus this is a shell command: >
+ !shellCommand->something
+Put the expression in parentheses to use the "!" for negation: >
+ (!expression)->Method()
+
+Note that while variables need to be defined before they can be used,
+functions can be called before being defined. This is required to allow
+for cyclic dependencies between functions. It is slightly less efficient,
+since the function has to be looked up by name. And a typo in the function
+name will only be found when the function is called.
+
+
+Omitting function() ~
+
+A user defined function can be used as a function reference in an expression
+without `function()`. The argument types and return type will then be checked.
+The function must already have been defined. >
+
+ var Funcref = MyFunction
+
+When using `function()` the resulting type is "func", a function with any
+number of arguments and any return type (including void). The function can be
+defined later if the argument is in quotes.
+
+
+Lambda using => instead of -> ~
+ *vim9-lambda*
+In legacy script there can be confusion between using "->" for a method call
+and for a lambda. Also, when a "{" is found the parser needs to figure out if
+it is the start of a lambda or a dictionary, which is now more complicated
+because of the use of argument types.
+
+To avoid these problems Vim9 script uses a different syntax for a lambda,
+which is similar to JavaScript: >
+ var Lambda = (arg) => expression
+ var Lambda = (arg): type => expression
+< *E1157*
+No line break is allowed in the arguments of a lambda up to and including the
+"=>" (so that Vim can tell the difference between an expression in parentheses
+and lambda arguments). This is OK: >
+ filter(list, (k, v) =>
+ v > 0)
+This does not work: >
+ filter(list, (k, v)
+ => v > 0)
+This also does not work: >
+ filter(list, (k,
+ v) => v > 0)
+But you can use a backslash to concatenate the lines before parsing: >
+ filter(list, (k,
+ \ v)
+ \ => v > 0)
+< *vim9-lambda-arguments* *E1172*
+In legacy script a lambda could be called with any number of extra arguments,
+there was no way to warn for not using them. In Vim9 script the number of
+arguments must match. If you do want to accept any arguments, or any further
+arguments, use "..._", which makes the function accept
+|vim9-variable-arguments|. Example: >
+ var Callback = (..._) => 'anything'
+ echo Callback(1, 2, 3) # displays "anything"
+
+< *inline-function* *E1171*
+Additionally, a lambda can contain statements in {}: >
+ var Lambda = (arg) => {
+ g:was_called = 'yes'
+ return expression
+ }
+This can be useful for a timer, for example: >
+ var count = 0
+ var timer = timer_start(500, (_) => {
+ count += 1
+ echom 'Handler called ' .. count
+ }, {repeat: 3})
+
+The ending "}" must be at the start of a line. It can be followed by other
+characters, e.g.: >
+ var d = mapnew(dict, (k, v): string => {
+ return 'value'
+ })
+No command can follow the "{", only a comment can be used there.
+
+ *command-block* *E1026*
+The block can also be used for defining a user command. Inside the block Vim9
+syntax will be used.
+
+If the statements include a dictionary, its closing bracket must not be
+written at the start of a line. Otherwise, it would be parsed as the end of
+the block. This does not work: >
+ command NewCommand {
+ g:mydict = {
+ 'key': 'value',
+ } # ERROR: will be recognized as the end of the block
+ }
+Put the '}' after the last item to avoid this: >
+ command NewCommand {
+ g:mydict = {
+ 'key': 'value' }
+ }
+
+Rationale: The "}" cannot be after a command because it would require parsing
+the commands to find it. For consistency with that no command can follow the
+"{". Unfortunately this means using "() => { command }" does not work, line
+breaks are always required.
+
+ *vim9-curly*
+To avoid the "{" of a dictionary literal to be recognized as a statement block
+wrap it in parentheses: >
+ var Lambda = (arg) => ({key: 42})
+
+Also when confused with the start of a command block: >
+ ({
+ key: value
+ })->method()
+
+
+Automatic line continuation ~
+ *vim9-line-continuation* *E1097*
+In many cases it is obvious that an expression continues on the next line. In
+those cases there is no need to prefix the line with a backslash (see
+|line-continuation|). For example, when a list spans multiple lines: >
+ var mylist = [
+ 'one',
+ 'two',
+ ]
+And when a dict spans multiple lines: >
+ var mydict = {
+ one: 1,
+ two: 2,
+ }
+With a function call: >
+ var result = Func(
+ arg1,
+ arg2
+ )
+
+For binary operators in expressions not in [], {} or () a line break is
+possible just before or after the operator. For example: >
+ var text = lead
+ .. middle
+ .. end
+ var total = start +
+ end -
+ correction
+ var result = positive
+ ? PosFunc(arg)
+ : NegFunc(arg)
+
+For a method call using "->" and a member using a dot, a line break is allowed
+before it: >
+ var result = GetBuilder()
+ ->BuilderSetWidth(333)
+ ->BuilderSetHeight(777)
+ ->BuilderBuild()
+ var result = MyDict
+ .member
+
+For commands that have an argument that is a list of commands, the | character
+at the start of the line indicates line continuation: >
+ autocmd BufNewFile *.match if condition
+ | echo 'match'
+ | endif
+
+Note that this means that in heredoc the first line cannot start with a bar: >
+ var lines =<< trim END
+ | this doesn't work
+ END
+Either use an empty line at the start or do not use heredoc. Or temporarily
+add the "C" flag to 'cpoptions': >
+ set cpo+=C
+ var lines =<< trim END
+ | this works
+ END
+ set cpo-=C
+If the heredoc is inside a function 'cpoptions' must be set before :def and
+restored after the :enddef.
+
+In places where line continuation with a backslash is still needed, such as
+splitting up a long Ex command, comments can start with '#\ ': >
+ syn region Text
+ \ start='foo'
+ #\ comment
+ \ end='bar'
+Like with legacy script '"\ ' is used. This is also needed when line
+continuation is used without a backslash and a line starts with a bar: >
+ au CursorHold * echom 'BEFORE bar'
+ #\ some comment
+ | echom 'AFTER bar'
+<
+ *E1050*
+To make it possible for the operator at the start of the line to be
+recognized, it is required to put a colon before a range. This example will
+add "start" and "print": >
+ var result = start
+ + print
+Like this: >
+ var result = start + print
+
+This will assign "start" and print a line: >
+ var result = start
+ :+ print
+
+After the range an Ex command must follow. Without the colon you can call a
+function without `:call`, but after a range you do need it: >
+ MyFunc()
+ :% call MyFunc()
+
+Note that the colon is not required for the |+cmd| argument: >
+ edit +6 fname
+
+It is also possible to split a function header over multiple lines, in between
+arguments: >
+ def MyFunc(
+ text: string,
+ separator = '-'
+ ): string
+
+Since a continuation line cannot be easily recognized the parsing of commands
+has been made stricter. E.g., because of the error in the first line, the
+second line is seen as a separate command: >
+ popup_create(some invalid expression, {
+ exit_cb: Func})
+Now "exit_cb: Func})" is actually a valid command: save any changes to the
+file "_cb: Func})" and exit. To avoid this kind of mistake in Vim9 script
+there must be white space between most command names and the argument.
+*E1144*
+
+However, the argument of a command that is a command won't be recognized. For
+example, after "windo echo expr" a line break inside "expr" will not be seen.
+
+
+Notes:
+- "enddef" cannot be used at the start of a continuation line, it ends the
+ current function.
+- No line break is allowed in the LHS of an assignment. Specifically when
+ unpacking a list |:let-unpack|. This is OK: >
+ [var1, var2] =
+ Func()
+< This does not work: >
+ [var1,
+ var2] =
+ Func()
+- No line break is allowed in between arguments of an `:echo`, `:execute` and
+ similar commands. This is OK: >
+ echo [1,
+ 2] [3,
+ 4]
+< This does not work: >
+ echo [1, 2]
+ [3, 4]
+- In some cases it is difficult for Vim to parse a command, especially when
+ commands are used as an argument to another command, such as `:windo`. In
+ those cases the line continuation with a backslash has to be used.
+
+
+White space ~
+ *E1004* *E1068* *E1069* *E1074* *E1127* *E1202*
+Vim9 script enforces proper use of white space. This is no longer allowed: >
+ var name=234 # Error!
+ var name= 234 # Error!
+ var name =234 # Error!
+There must be white space before and after the "=": >
+ var name = 234 # OK
+White space must also be put before the # that starts a comment after a
+command: >
+ var name = 234# Error!
+ var name = 234 # OK
+
+White space is required around most operators.
+
+White space is required in a sublist (list slice) around the ":", except at
+the start and end: >
+ otherlist = mylist[v : count] # v:count has a different meaning
+ otherlist = mylist[:] # make a copy of the List
+ otherlist = mylist[v :]
+ otherlist = mylist[: v]
+
+White space is not allowed:
+- Between a function name and the "(": >
+ Func (arg) # Error!
+ Func
+ \ (arg) # Error!
+ Func
+ (arg) # Error!
+ Func(arg) # OK
+ Func(
+ arg) # OK
+ Func(
+ arg # OK
+ )
+< *E1205*
+White space is not allowed in a `:set` command between the option name and a
+following "&", "!", "<", "=", "+=", "-=" or "^=".
+
+
+No curly braces expansion ~
+
+|curly-braces-names| cannot be used.
+
+
+Command modifiers are not ignored ~
+ *E1176*
+Using a command modifier for a command that does not use it gives an error.
+ *E1082*
+Also, using a command modifier without a following command is now an error.
+
+
+Dictionary literals ~
+ *vim9-literal-dict* *E1014*
+Traditionally Vim has supported dictionary literals with a {} syntax: >
+ let dict = {'key': value}
+
+Later it became clear that using a simple text key is very common, thus
+literal dictionaries were introduced in a backwards compatible way: >
+ let dict = #{key: value}
+
+However, this #{} syntax is unlike any existing language. As it turns out
+that using a literal key is much more common than using an expression, and
+considering that JavaScript uses this syntax, using the {} form for dictionary
+literals is considered a much more useful syntax. In Vim9 script the {} form
+uses literal keys: >
+ var dict = {key: value}
+
+This works for alphanumeric characters, underscore and dash. If you want to
+use another character, use a single or double quoted string: >
+ var dict = {'key with space': value}
+ var dict = {"key\twith\ttabs": value}
+ var dict = {'': value} # empty key
+< *E1139*
+In case the key needs to be an expression, square brackets can be used, just
+like in JavaScript: >
+ var dict = {["key" .. nr]: value}
+
+The key type can be string, number, bool or float. Other types result in an
+error. Without using [] the value is used as a string, keeping leading zeros.
+An expression given with [] is evaluated and then converted to a string.
+Leading zeros will then be dropped: >
+ var dict = {000123: 'without', [000456]: 'with'}
+ echo dict
+ {'456': 'with', '000123': 'without'}
+A float only works inside [] because the dot is not accepted otherwise: >
+ var dict = {[00.013]: 'float'}
+ echo dict
+ {'0.013': 'float'}
+
+
+No :xit, :t, :k, :append, :change or :insert ~
+ *E1100*
+These commands are too easily confused with local variable names.
+Instead of `:x` or `:xit` you can use `:exit`.
+Instead of `:t` you can use `:copy`.
+Instead of `:k` you can use `:mark`.
+
+
+Comparators ~
+
+The 'ignorecase' option is not used for comparators that use strings.
+Thus "=~" works like "=~#".
+
+"is" and "isnot" (|expr-is| and |expr-isnot|) when used on strings now return
+false. In legacy script they just compare the strings, in |Vim9| script they
+check identity, and strings are copied when used, thus two strings are never
+the same (this might change some day if strings are not copied but reference
+counted).
+
+
+Abort after error ~
+
+In legacy script, when an error is encountered, Vim continues to execute
+following lines. This can lead to a long sequence of errors and need to type
+CTRL-C to stop it. In Vim9 script execution of commands stops at the first
+error. Example: >
+ vim9script
+ var x = does-not-exist
+ echo 'not executed'
+
+
+For loop ~
+ *E1254*
+The loop variable must not be declared yet: >
+ var i = 1
+ for i in [1, 2, 3] # Error!
+
+It is possible to use a global variable though: >
+ g:i = 1
+ for g:i in [1, 2, 3]
+ echo g:i
+ endfor
+
+Legacy Vim script has some tricks to make a for loop over a list handle
+deleting items at the current or previous item. In Vim9 script it just uses
+the index, if items are deleted then items in the list will be skipped.
+Example legacy script: >
+ let l = [1, 2, 3, 4]
+ for i in l
+ echo i
+ call remove(l, index(l, i))
+ endfor
+Would echo:
+ 1
+ 2
+ 3
+ 4
+In compiled Vim9 script you get:
+ 1
+ 3
+Generally, you should not change the list that is iterated over. Make a copy
+first if needed.
+When looping over a list of lists, the nested lists can be changed. The loop
+variable is "final", it cannot be changed but what its value can be changed.
+ *E1306*
+The depth of loops, :for and :while loops added together, cannot exceed 10.
+
+
+Conditions and expressions ~
+ *vim9-boolean*
+Conditions and expressions are mostly working like they do in other languages.
+Some values are different from legacy Vim script:
+ value legacy Vim script Vim9 script ~
+ 0 falsy falsy
+ 1 truthy truthy
+ 99 truthy Error!
+ "0" falsy Error!
+ "99" truthy Error!
+ "text" falsy Error!
+
+For the "??" operator and when using "!" then there is no error, every value
+is either falsy or truthy. This is mostly like JavaScript, except that an
+empty list and dict is falsy:
+
+ type truthy when ~
+ bool true, v:true or 1
+ number non-zero
+ float non-zero
+ string non-empty
+ blob non-empty
+ list non-empty (different from JavaScript)
+ dictionary non-empty (different from JavaScript)
+ func when there is a function name
+ special true or v:true
+ job when not NULL
+ channel when not NULL
+ class when not NULL
+ object when not NULL (TODO: when isTrue() returns true)
+
+The boolean operators "||" and "&&" expect the values to be boolean, zero or
+one: >
+ 1 || false == true
+ 0 || 1 == true
+ 0 || false == false
+ 1 && true == true
+ 0 && 1 == false
+ 8 || 0 Error!
+ 'yes' && 0 Error!
+ [] || 99 Error!
+
+When using "!" for inverting, there is no error for using any type and the
+result is a boolean. "!!" can be used to turn any value into boolean: >
+ !'yes' == false
+ !![] == false
+ !![1, 2, 3] == true
+
+When using "`.."` for string concatenation arguments of simple types are
+always converted to string: >
+ 'hello ' .. 123 == 'hello 123'
+ 'hello ' .. v:true == 'hello true'
+
+Simple types are Number, Float, Special and Bool. For other types |string()|
+should be used.
+ *false* *true* *null* *null_blob* *null_channel*
+ *null_dict* *null_function* *null_job* *null_list*
+ *null_partial* *null_string* *E1034*
+In Vim9 script one can use the following predefined values: >
+ true
+ false
+ null
+ null_blob
+ null_channel
+ null_dict
+ null_function
+ null_job
+ null_list
+ null_partial
+ null_string
+`true` is the same as `v:true`, `false` the same as `v:false`, `null` the same
+as `v:null`.
+
+While `null` has the type "special", the other "null_" values have the type
+indicated by their name. Quite often a null value is handled the same as an
+empty value, but not always. The values can be useful to clear a script-local
+variable, since they cannot be deleted with `:unlet`. E.g.: >
+ var theJob = job_start(...)
+ # let the job do its work
+ theJob = null_job
+
+The values can also be useful as the default value for an argument: >
+ def MyFunc(b: blob = null_blob)
+ if b == null_blob
+ # b argument was not given
+
+It is possible to compare `null` with any value, this will not give a type
+error. However, comparing `null` with a number, float or bool will always
+result in `false`. This is different from legacy script, where comparing
+`null` with zero or `false` would return `true`.
+
+When converting a boolean to a string `false` and `true` are used, not
+`v:false` and `v:true` like in legacy script. `v:none` has no `none`
+replacement, it has no equivalent in other languages.
+
+Indexing a string with [idx] or taking a slice with [idx : idx] uses character
+indexes instead of byte indexes. Composing characters are included.
+Example: >
+ echo 'bár'[1]
+In legacy script this results in the character 0xc3 (an illegal byte), in Vim9
+script this results in the string 'á'.
+A negative index is counting from the end, "[-1]" is the last character.
+To exclude the last character use |slice()|.
+To count composing characters separately use |strcharpart()|.
+If the index is out of range then an empty string results.
+
+In legacy script "++var" and "--var" would be silently accepted and have no
+effect. This is an error in Vim9 script.
+
+Numbers starting with zero are not considered to be octal, only numbers
+starting with "0o" are octal: "0o744". |scriptversion-4|
+
+
+What to watch out for ~
+ *vim9-gotchas*
+Vim9 was designed to be closer to often used programming languages, but at the
+same time tries to support the legacy Vim commands. Some compromises had to
+be made. Here is a summary of what might be unexpected.
+
+Ex command ranges need to be prefixed with a colon. >
+ -> legacy Vim: shifts the previous line to the right
+ ->func() Vim9: method call in a continuation line
+ :-> Vim9: shifts the previous line to the right
+
+ %s/a/b legacy Vim: substitute on all lines
+ x = alongname
+ % another Vim9: modulo operator in a continuation line
+ :%s/a/b Vim9: substitute on all lines
+ 't legacy Vim: jump to mark t
+ 'text'->func() Vim9: method call
+ :'t Vim9: jump to mark t
+
+Some Ex commands can be confused with assignments in Vim9 script: >
+ g:name = value # assignment
+ :g:pattern:cmd # :global command
+
+To avoid confusion between a `:global` or `:substitute` command and an
+expression or assignment, a few separators cannot be used when these commands
+are abbreviated to a single character: ':', '-' and '.'. >
+ g:pattern:cmd # invalid command - ERROR
+ s:pattern:repl # invalid command - ERROR
+ g-pattern-cmd # invalid command - ERROR
+ s-pattern-repl # invalid command - ERROR
+ g.pattern.cmd # invalid command - ERROR
+ s.pattern.repl # invalid command - ERROR
+
+Also, there cannot be a space between the command and the separator: >
+ g /pattern/cmd # invalid command - ERROR
+ s /pattern/repl # invalid command - ERROR
+
+Functions defined with `:def` compile the whole function. Legacy functions
+can bail out, and the following lines are not parsed: >
+ func Maybe()
+ if !has('feature')
+ return
+ endif
+ use-feature
+ endfunc
+Vim9 functions are compiled as a whole: >
+ def Maybe()
+ if !has('feature')
+ return
+ endif
+ use-feature # May give a compilation error
+ enddef
+For a workaround, split it in two functions: >
+ func Maybe()
+ if has('feature')
+ call MaybeInner()
+ endif
+ endfunc
+ if has('feature')
+ def MaybeInner()
+ use-feature
+ enddef
+ endif
+Or put the unsupported code inside an `if` with a constant expression that
+evaluates to false: >
+ def Maybe()
+ if has('feature')
+ use-feature
+ endif
+ enddef
+The `exists_compiled()` function can also be used for this.
+ *vim9-user-command*
+Another side effect of compiling a function is that the presence of a user
+command is checked at compile time. If the user command is defined later an
+error will result. This works: >
+ command -nargs=1 MyCommand echom <q-args>
+ def Works()
+ MyCommand 123
+ enddef
+This will give an error for "MyCommand" not being defined: >
+ def Works()
+ command -nargs=1 MyCommand echom <q-args>
+ MyCommand 123
+ enddef
+A workaround is to invoke the command indirectly with `:execute`: >
+ def Works()
+ command -nargs=1 MyCommand echom <q-args>
+ execute 'MyCommand 123'
+ enddef
+
+Note that for unrecognized commands there is no check for "|" and a following
+command. This will give an error for missing `endif`: >
+ def Maybe()
+ if has('feature') | use-feature | endif
+ enddef
+
+Other differences ~
+
+Patterns are used like 'magic' is set, unless explicitly overruled.
+The 'edcompatible' option value is not used.
+The 'gdefault' option value is not used.
+
+You may also find this wiki useful. It was written by an early adopter of
+Vim9 script: https://github.com/lacygoill/wiki/blob/master/vim/vim9.md
+
+ *:++* *:--*
+The ++ and -- commands have been added. They are very similar to adding or
+subtracting one: >
+ ++var
+ var += 1
+ --var
+ var -= 1
+
+Using ++var or --var in an expression is not supported yet.
+
+==============================================================================
+
+3. New style functions *fast-functions*
+
+ *:def* *E1028*
+:def[!] {name}([arguments])[: {return-type}]
+ Define a new function by the name {name}. The body of
+ the function follows in the next lines, until the
+ matching `:enddef`. *E1073*
+ *E1011*
+ The {name} must be less than 100 bytes long.
+ *E1003* *E1027* *E1056* *E1059*
+ The type of value used with `:return` must match
+ {return-type}. When {return-type} is omitted or is
+ "void" the function is not expected to return
+ anything.
+ *E1077* *E1123*
+ {arguments} is a sequence of zero or more argument
+ declarations. There are three forms:
+ {name}: {type}
+ {name} = {value}
+ {name}: {type} = {value}
+ The first form is a mandatory argument, the caller
+ must always provide them.
+ The second and third form are optional arguments.
+ When the caller omits an argument the {value} is used.
+
+ The function will be compiled into instructions when
+ called, or when `:disassemble` or `:defcompile` is
+ used. Syntax and type errors will be produced at that
+ time.
+
+ It is possible to nest `:def` inside another `:def` or
+ `:function` up to about 50 levels deep.
+ *E1117*
+ [!] is used as with `:function`. Note that
+ script-local functions cannot be deleted or redefined
+ later in Vim9 script. They can only be removed by
+ reloading the same script.
+
+ *:enddef* *E1057* *E1152* *E1173*
+:enddef End of a function defined with `:def`. It should be on
+ a line by its own.
+
+You may also find this wiki useful. It was written by an early adopter of
+Vim9 script: https://github.com/lacygoill/wiki/blob/master/vim/vim9.md
+
+If the script the function is defined in is Vim9 script, then script-local
+variables can be accessed without the "s:" prefix. They must be defined
+before the function is compiled. If the script the function is defined in is
+legacy script, then script-local variables must be accessed with the "s:"
+prefix if they do not exist at the time of compiling.
+ *E1269*
+Script-local variables in a |Vim9| script must be declared at the script
+level. They cannot be created in a function, also not in a legacy function.
+
+ *:defc* *:defcompile*
+:defc[ompile] Compile functions defined in the current script that
+ were not compiled yet.
+ This will report any errors found during compilation.
+ This excludes functions defined inside a class.
+
+:defc[ompile] {func}
+:defc[ompile] debug {func}
+:defc[ompile] profile {func}
+ Compile function {func}, if needed. Use "debug" and
+ "profile" to specify the compilation mode.
+ This will report any errors found during compilation.
+ {func} call also be "ClassName.functionName" to
+ compile a function or method in a class.
+ {func} call also be "ClassName" to compile all
+ functions and methods in a class.
+
+ *:disa* *:disassemble*
+:disa[ssemble] {func} Show the instructions generated for {func}.
+ This is for debugging and testing. *E1061*
+ Note that for command line completion of {func} you
+ can prepend "s:" to find script-local functions.
+
+:disa[ssemble] profile {func}
+ Like `:disassemble` but with the instructions used for
+ profiling.
+
+:disa[ssemble] debug {func}
+ Like `:disassemble` but with the instructions used for
+ debugging.
+
+Limitations ~
+
+Local variables will not be visible to string evaluation. For example: >
+ def MapList(): list<string>
+ var list = ['aa', 'bb', 'cc', 'dd']
+ return range(1, 2)->map('list[v:val]')
+ enddef
+
+The map argument is a string expression, which is evaluated without the
+function scope. Instead, use a lambda: >
+ def MapList(): list<string>
+ var list = ['aa', 'bb', 'cc', 'dd']
+ return range(1, 2)->map((_, v) => list[v])
+ enddef
+
+For commands that are not compiled, such as `:edit`, backtick expansion can be
+used and it can use the local scope. Example: >
+ def Replace()
+ var fname = 'blah.txt'
+ edit `=fname`
+ enddef
+
+Closures defined in a loop will share the same context. For example: >
+ var flist: list<func>
+ for i in range(5)
+ var inloop = i
+ flist[i] = () => inloop
+ endfor
+ echo range(5)->map((i, _) => flist[i]())
+ # Result: [4, 4, 4, 4, 4]
+< *E1271*
+A closure must be compiled in the context that it is defined in, so that
+variables in that context can be found. This mostly happens correctly, except
+when a function is marked for debugging with `:breakadd` after it was compiled.
+Make sure to define the breakpoint before compiling the outer function.
+
+The "inloop" variable will exist only once, all closures put in the list refer
+to the same instance, which in the end will have the value 4. This is
+efficient, also when looping many times. If you do want a separate context
+for each closure, call a function to define it: >
+ def GetClosure(i: number): func
+ var infunc = i
+ return () => infunc
+ enddef
+
+ var flist: list<func>
+ for i in range(5)
+ flist[i] = GetClosure(i)
+ endfor
+ echo range(5)->map((i, _) => flist[i]())
+ # Result: [0, 1, 2, 3, 4]
+
+In some situations, especially when calling a Vim9 closure from legacy
+context, the evaluation will fail. *E1248*
+
+Note that at the script level the loop variable will be invalid after the
+loop, also when used in a closure that is called later, e.g. with a timer.
+This will generate error |E1302|: >
+ for n in range(4)
+ timer_start(500 * n, (_) => {
+ echowin n
+ })
+ endfor
+
+You need to use a block and define a variable there, and use that one in the
+closure: >
+ for n in range(4)
+ {
+ var nr = n
+ timer_start(500 * n, (_) => {
+ echowin nr
+ })
+ }
+ endfor
+
+Using `:echowindow` is useful in a timer, the messages go into a popup and will
+not interfere with what the user is doing when it triggers.
+
+
+Converting a function from legacy to Vim9 ~
+ *convert_legacy_function_to_vim9*
+These are the most changes that need to be made to convert a legacy function
+to a Vim9 function:
+
+- Change `func` or `function` to `def`.
+- Change `endfunc` or `endfunction` to `enddef`.
+- Add types to the function arguments.
+- If the function returns something, add the return type.
+- Change comments to start with # instead of ".
+
+ For example, a legacy function: >
+ func MyFunc(text)
+ " function body
+ endfunc
+< Becomes: >
+ def MyFunc(text: string): number
+ # function body
+ enddef
+
+- Remove "a:" used for arguments. E.g.: >
+ return len(a:text)
+< Becomes: >
+ return len(text)
+
+- Change `let` used to declare a variable to `var`.
+- Remove `let` used to assign a value to a variable. This is for local
+ variables already declared and b: w: g: and t: variables.
+
+ For example, legacy function: >
+ let lnum = 1
+ let lnum += 3
+ let b:result = 42
+< Becomes: >
+ var lnum = 1
+ lnum += 3
+ b:result = 42
+
+- Insert white space in expressions where needed.
+- Change "." used for concatenation to "..".
+
+ For example, legacy function: >
+ echo line(1).line(2)
+< Becomes: >
+ echo line(1) .. line(2)
+
+- line continuation does not always require a backslash: >
+ echo ['one',
+ \ 'two',
+ \ 'three'
+ \ ]
+< Becomes: >
+ echo ['one',
+ 'two',
+ 'three'
+ ]
+
+
+Calling a function in an expr option ~
+ *expr-option-function*
+The value of a few options, such as 'foldexpr', is an expression that is
+evaluated to get a value. The evaluation can have quite a bit of overhead.
+One way to minimize the overhead, and also to keep the option value very
+simple, is to define a compiled function and set the option to call it
+without arguments. Example: >
+ vim9script
+ def MyFoldFunc(): any
+ ... compute fold level for line v:lnum
+ return level
+ enddef
+ set foldexpr=s:MyFoldFunc()
+
+==============================================================================
+
+4. Types *vim9-types*
+ *E1008* *E1009* *E1010* *E1012*
+ *E1013* *E1029* *E1030*
+The following builtin types are supported:
+ bool
+ number
+ float
+ string
+ blob
+ list<{type}>
+ dict<{type}>
+ job
+ channel
+ func
+ func: {type}
+ func({type}, ...)
+ func({type}, ...): {type}
+ void
+
+Not supported yet:
+ tuple<a: {type}, b: {type}, ...>
+
+These types can be used in declarations, but no simple value will actually
+have the "void" type. Trying to use a void (e.g. a function without a
+return value) results in error *E1031* *E1186* .
+
+There is no array type, use list<{type}> instead. For a list constant an
+efficient implementation is used that avoids allocating lot of small pieces of
+memory.
+ *E1005* *E1007*
+A partial and function can be declared in more or less specific ways:
+func any kind of function reference, no type
+ checking for arguments or return value
+func: void any number and type of arguments, no return
+ value
+func: {type} any number and type of arguments with specific
+ return type
+
+func() function with no argument, does not return a
+ value
+func(): void same
+func(): {type} function with no argument and return type
+
+func({type}) function with argument type, does not return
+ a value
+func({type}): {type} function with argument type and return type
+func(?{type}) function with type of optional argument, does
+ not return a value
+func(...{type}) function with type of variable number of
+ arguments, does not return a value
+func({type}, ?{type}, ...{type}): {type}
+ function with:
+ - type of mandatory argument
+ - type of optional argument
+ - type of variable number of arguments
+ - return type
+
+If the return type is "void" the function does not return a value.
+
+The reference can also be a |Partial|, in which case it stores extra arguments
+and/or a dictionary, which are not visible to the caller. Since they are
+called in the same way the declaration is the same.
+
+Custom types can be defined with `:type`: >
+ :type MyList list<string>
+Custom types must start with a capital letter, to avoid name clashes with
+builtin types added later, similarly to user functions.
+{not implemented yet}
+
+And classes and interfaces can be used as types: >
+ :class MyClass
+ :var mine: MyClass
+
+ :interface MyInterface
+ :var mine: MyInterface
+
+ :class MyTemplate<Targ>
+ :var mine: MyTemplate<number>
+ :var mine: MyTemplate<string>
+
+ :class MyInterface<Targ>
+ :var mine: MyInterface<number>
+ :var mine: MyInterface<string>
+{not implemented yet}
+
+
+Variable types and type casting ~
+ *variable-types*
+Variables declared in Vim9 script or in a `:def` function have a type, either
+specified explicitly or inferred from the initialization.
+
+Global, buffer, window and tab page variables do not have a specific type, the
+value can be changed at any time, possibly changing the type. Therefore, in
+compiled code the "any" type is assumed.
+
+This can be a problem when the "any" type is undesired and the actual type is
+expected to always be the same. For example, when declaring a list: >
+ var l: list<number> = [1, g:two]
+At compile time Vim doesn't know the type of "g:two" and the expression type
+becomes list<any>. An instruction is generated to check the list type before
+doing the assignment, which is a bit inefficient.
+ *type-casting* *E1104*
+To avoid this, use a type cast: >
+ var l: list<number> = [1, <number>g:two]
+The compiled code will then only check that "g:two" is a number and give an
+error if it isn't. This is called type casting.
+
+The syntax of a type cast is: "<" {type} ">". There cannot be white space
+after the "<" or before the ">" (to avoid them being confused with
+smaller-than and bigger-than operators).
+
+The semantics is that, if needed, a runtime type check is performed. The
+value is not actually changed. If you need to change the type, e.g. to change
+it to a string, use the |string()| function. Or use |str2nr()| to convert a
+string to a number.
+
+If a type is given where it is not expected you can get *E1272* .
+
+
+Type inference ~
+ *type-inference*
+In general: Whenever the type is clear it can be omitted. For example, when
+declaring a variable and giving it a value: >
+ var name = 0 # infers number type
+ var name = 'hello' # infers string type
+
+The type of a list and dictionary comes from the common type of the values.
+If the values all have the same type, that type is used for the list or
+dictionary. If there is a mix of types, the "any" type is used. >
+ [1, 2, 3] list<number>
+ ['a', 'b', 'c'] list<string>
+ [1, 'x', 3] list<any>
+
+The common type of function references, if they do not all have the same
+number of arguments, uses "(...)" to indicate the number of arguments is not
+specified. For example: >
+ def Foo(x: bool)
+ enddef
+ def Bar(x: bool, y: bool)
+ enddef
+ var funclist = [Foo, Bar]
+ echo funclist->typename()
+Results in:
+ list<func(...)>
+
+For script-local variables in Vim9 script the type is checked, also when the
+variable was declared in a legacy function.
+
+When a type has been declared this is attached to a List or Dictionary. When
+later some expression attempts to change the type an error will be given: >
+ var ll: list<number> = [1, 2, 3]
+ ll->extend(['x']) # Error, 'x' is not a number
+
+If the type is not declared then it is allowed to change: >
+ [1, 2, 3]->extend(['x']) # result: [1, 2, 3, 'x']
+
+For a variable declaration an inferred type matters: >
+ var ll = [1, 2, 3]
+ ll->extend(['x']) # Error, 'x' is not a number
+That is because the declaration looks like a list of numbers, thus is
+equivalent to: >
+ var ll: list<number> = [1, 2, 3]
+If you do want a more permissive list you need to declare the type: >
+ var ll: list<any> = [1, 2, 3]
+ ll->extend(['x']) # OK
+
+
+Stricter type checking ~
+ *type-checking*
+In legacy Vim script, where a number was expected, a string would be
+automatically converted to a number. This was convenient for an actual number
+such as "123", but leads to unexpected problems (and no error message) if the
+string doesn't start with a number. Quite often this leads to hard-to-find
+bugs. e.g.: >
+ echo 123 == '123'
+< 1 ~
+With an accidental space: >
+ echo 123 == ' 123'
+< 0 ~
+ *E1206* *E1210* *E1212*
+In Vim9 script this has been made stricter. In most places it works just as
+before if the value used matches the expected type. There will sometimes be
+an error, thus breaking backwards compatibility. For example:
+- Using a number other than 0 or 1 where a boolean is expected. *E1023*
+- Using a string value when setting a number option.
+- Using a number where a string is expected. *E1024* *E1105*
+
+One consequence is that the item type of a list or dict given to |map()| must
+not change, if the type was declared. This will give an error in Vim9
+script: >
+ var mylist: list<number> = [1, 2, 3]
+ echo map(mylist, (i, v) => 'item ' .. i)
+< E1012: Type mismatch; expected number but got string in map() ~
+
+Instead use |mapnew()|, it creates a new list: >
+ var mylist: list<number> = [1, 2, 3]
+ echo mapnew(mylist, (i, v) => 'item ' .. i)
+< ['item 0', 'item 1', 'item 2'] ~
+
+If the item type was not declared or determined to be "any" it can change to a
+more specific type. E.g. when a list of mixed types gets changed to a list of
+strings: >
+ var mylist = [1, 2.0, '3']
+ # typename(mylist) == "list<any>"
+ map(mylist, (i, v) => 'item ' .. i)
+ # typename(mylist) == "list<string>", no error
+
+There is a subtle difference between using a list constant directly and
+through a variable declaration. Because of type inference, when using a list
+constant to initialize a variable, this also sets the declared type: >
+ var mylist = [1, 2, 3]
+ # typename(mylist) == "list<number>"
+ echo map(mylist, (i, v) => 'item ' .. i) # Error!
+
+When using the list constant directly, the type is not declared and is allowed
+to change: >
+ echo map([1, 2, 3], (i, v) => 'item ' .. i) # OK
+
+The reasoning behind this is that when a type is declared and the list is
+passed around and changed, the declaration must always hold. So that you can
+rely on the type to match the declared type. For a constant this is not
+needed.
+
+ *E1158*
+Same for |extend()|, use |extendnew()| instead, and for |flatten()|, use
+|flattennew()| instead. Since |flatten()| is intended to always change the
+type, it can not be used in Vim9 script.
+
+ *E1211* *E1217* *E1218* *E1219* *E1220* *E1221*
+ *E1222* *E1223* *E1224* *E1225* *E1226* *E1227*
+ *E1228* *E1238* *E1250* *E1251* *E1252* *E1253*
+ *E1256* *E1297* *E1298* *E1301*
+Types are checked for most builtin functions to make it easier to spot
+mistakes.
+
+==============================================================================
+
+5. Namespace, Import and Export
+ *vim9script* *vim9-export* *vim9-import*
+
+A Vim9 script can be written to be imported. This means that some items are
+intentionally exported, made available to other scripts. When the exporting
+script is imported in another script, these exported items can then be used in
+that script. All the other items remain script-local in the exporting script
+and cannot be accessed by the importing script.
+
+This mechanism exists for writing a script that can be sourced (imported) by
+other scripts, while making sure these other scripts only have access to what
+you want them to. This also avoids using the global namespace, which has a
+risk of name collisions. For example when you have two plugins with similar
+functionality.
+
+You can cheat by using the global namespace explicitly. That should be done
+only for things that really are global.
+
+
+Namespace ~
+ *vim9-namespace*
+To recognize a file that can be imported the `vim9script` statement must
+appear as the first statement in the file (see |vim9-mix| for an exception).
+It tells Vim to interpret the script in its own namespace, instead of the
+global namespace. If a file starts with: >
+ vim9script
+ var myvar = 'yes'
+Then "myvar" will only exist in this file. While without `vim9script` it would
+be available as `g:myvar` from any other script and function.
+ *E1101*
+The variables at the file level are very much like the script-local "s:"
+variables in legacy Vim script, but the "s:" is omitted. And they cannot be
+deleted.
+
+In Vim9 script the global "g:" namespace can still be used as before. And the
+"w:", "b:" and "t:" namespaces. These have in common that variables are not
+declared, have no specific type and they can be deleted. *E1304*
+
+A side effect of `:vim9script` is that the 'cpoptions' option is set to the
+Vim default value, like with: >
+ :set cpo&vim
+One of the effects is that |line-continuation| is always enabled.
+The original value of 'cpoptions' is restored at the end of the script, while
+flags added or removed in the script are also added to or removed from the
+original value to get the same effect. The order of flags may change.
+In the |vimrc| file sourced on startup this does not happen.
+
+ *vim9-mix*
+There is one way to use both legacy and Vim9 syntax in one script file: >
+ " comments may go here
+ if !has('vim9script')
+ " legacy script commands go here
+ finish
+ endif
+ vim9script
+ # Vim9 script commands go here
+This allows for writing a script that takes advantage of the Vim9 script
+syntax if possible, but will also work on a Vim version without it.
+
+This can only work in two ways:
+1. The "if" statement evaluates to false, the commands up to `endif` are
+ skipped and `vim9script` is then the first command actually executed.
+2. The "if" statement evaluates to true, the commands up to `endif` are
+ executed and `finish` bails out before reaching `vim9script`.
+
+
+Export ~
+ *:export* *:exp*
+Exporting an item can be written as: >
+ export const EXPORTED_CONST = 1234
+ export var someValue = ...
+ export final someValue = ...
+ export const someValue = ...
+ export def MyFunc() ...
+ export class MyClass ...
+ export interface MyClass ...
+< *E1043* *E1044*
+As this suggests, only constants, variables, `:def` functions and classes can
+be exported. {not implemented yet: class, interface}
+
+ *E1042*
+`:export` can only be used in Vim9 script, at the script level.
+
+
+Import ~
+ *:import* *:imp* *E1094* *E1047* *E1262*
+ *E1048* *E1049* *E1053* *E1071* *E1088* *E1236*
+The exported items can be imported in another script. The import syntax has
+two forms. The simple form: >
+ import {filename}
+<
+Where {filename} is an expression that must evaluate to a string. In this
+form the filename should end in ".vim" and the portion before ".vim" will
+become the script local name of the namespace. For example: >
+ import "myscript.vim"
+<
+This makes each exported item in "myscript.vim" available as "myscript.item".
+ *:import-as* *E1257* *E1261*
+In case the name is long or ambiguous, this form can be used to specify
+another name: >
+ import {longfilename} as {name}
+<
+In this form {name} becomes a specific script local name for the imported
+namespace. Therefore {name} must consist of letters, digits and '_', like
+|internal-variables|. The {longfilename} expression must evaluate to any
+filename. For example: >
+ import "thatscript.vim.v2" as that
+< *E1060* *E1258* *E1259* *E1260*
+Then you can use "that.item", etc. You are free to choose the name "that".
+Use something that will be recognized as referring to the imported script.
+Avoid command names, command modifiers and builtin function names, because the
+name will shadow them. Better not start the name starts with a capital
+letter, since it can then also shadow global user commands and functions.
+Also, you cannot use the name for something else in the script, such as a
+function or variable name.
+
+In case the dot in the name is undesired, a local reference can be made for a
+function: >
+ var LongFunc = that.LongFuncName
+
+This also works for constants: >
+ const MAXLEN = that.MAX_LEN_OF_NAME
+
+This does not work for variables, since the value would be copied once and
+when changing the variable the copy will change, not the original variable.
+You will need to use the full name, with the dot.
+
+`:import` can not be used in a function. Imported items are intended to exist
+at the script level and only imported once.
+
+The script name after `import` can be:
+- A relative path, starting "." or "..". This finds a file relative to the
+ location of the script file itself. This is useful to split up a large
+ plugin into several files.
+- An absolute path, starting with "/" on Unix or "D:/" on MS-Windows. This
+ will rarely be used.
+- A path not being relative or absolute. This will be found in the
+ "import" subdirectories of 'runtimepath' entries. The name will usually be
+ longer and unique, to avoid loading the wrong file.
+ Note that "after/import" is not used.
+
+If the name does not end in ".vim" then the use of "as name" is required.
+
+Once a vim9 script file has been imported, the result is cached and used the
+next time the same script is imported. It will not be read again.
+
+It is not allowed to import the same script twice, also when using two
+different "as" names.
+
+When using the imported name the dot and the item name must be in the same
+line, there can be no line break: >
+ echo that.
+ name # Error!
+ echo that
+ .name # Error!
+< *import-map*
+When you've imported a function from one script into a vim9 script you can
+refer to the imported function in a mapping by prefixing it with |<SID>|: >
+ noremap <silent> ,a :call <SID>name.Function()<CR>
+
+When the mapping is defined "<SID>name." will be replaced with <SNR> and the
+script ID of the imported script.
+An even simpler solution is using |<ScriptCmd>|: >
+ noremap ,a <ScriptCmd>name.Function()<CR>
+
+Note that this does not work for variables, only for functions.
+
+ *import-legacy* *legacy-import*
+`:import` can also be used in legacy Vim script. The imported namespace still
+becomes script-local, even when the "s:" prefix is not given. For example: >
+ import "myfile.vim"
+ call s:myfile.MyFunc()
+
+And using the "as name" form: >
+ import "otherfile.vim9script" as that
+ call s:that.OtherFunc()
+
+However, the namespace cannot be resolved on its own: >
+ import "that.vim"
+ echo s:that
+ " ERROR: E1060: Expected dot after name: s:that
+<
+This also affects the use of |<SID>| in the legacy mapping context. Since
+|<SID>| is only a valid prefix for a function and NOT for a namespace, you
+cannot use it
+to scope a function in a script local namespace. Instead of prefixing the
+function with |<SID>| you should use|<ScriptCmd>|. For example: >
+ noremap ,a <ScriptCmd>:call s:that.OtherFunc()<CR>
+<
+ *:import-cycle*
+The `import` commands are executed when encountered. If script A imports
+script B, and B (directly or indirectly) imports A, this will be skipped over.
+At this point items in A after "import B" will not have been processed and
+defined yet. Therefore cyclic imports can exist and not result in an error
+directly, but may result in an error for items in A after "import B" not being
+defined. This does not apply to autoload imports, see the next section.
+
+
+Importing an autoload script ~
+ *vim9-autoload* *import-autoload*
+For optimal startup speed, loading scripts should be postponed until they are
+actually needed. Using the autoload mechanism is recommended:
+ *E1264*
+1. In the plugin define user commands, functions and/or mappings that refer to
+ items imported from an autoload script. >
+ import autoload 'for/search.vim'
+ command -nargs=1 SearchForStuff search.Stuff(<f-args>)
+
+< This goes in .../plugin/anyname.vim. "anyname.vim" can be freely chosen.
+ The "SearchForStuff" command is now available to the user.
+
+ The "autoload" argument to `:import` means that the script is not loaded
+ until one of the items is actually used. The script will be found under
+ the "autoload" directory in 'runtimepath' instead of the "import"
+ directory. Alternatively a relative or absolute name can be used, see
+ below.
+
+2. In the autoload script put the bulk of the code. >
+ vim9script
+ export def Stuff(arg: string)
+ ...
+
+< This goes in .../autoload/for/search.vim.
+
+ Putting the "search.vim" script under the "/autoload/for/" directory has
+ the effect that "for#search#" will be prefixed to every exported item. The
+ prefix is obtained from the file name, as you would to manually in a
+ legacy autoload script. Thus the exported function can be found with
+ "for#search#Stuff", but you would normally use `import autoload` and not
+ use the prefix (which has the side effect of loading the autoload script
+ when compiling a function that encounters this name).
+
+ You can split up the functionality and import other scripts from the
+ autoload script as you like. This way you can share code between plugins.
+
+Searching for the autoload script in all entries in 'runtimepath' can be a bit
+slow. If the plugin knows where the script is located, quite often a relative
+path can be used. This avoids the search and should be quite a bit faster.
+Another advantage is that the script name does not need to be unique. An
+absolute path is also possible. Examples: >
+ import autoload '../lib/implement.vim'
+ import autoload MyScriptsDir .. '/lib/implement.vim'
+
+For defining a mapping that uses the imported autoload script the special key
+|<ScriptCmd>| is useful. It allows for a command in a mapping to use the
+script context of where the mapping was defined.
+
+When compiling a `:def` function and a function in an autoload script is
+encountered, the script is not loaded until the `:def` function is called.
+This also means you get any errors only at runtime, since the argument and
+return types are not known yet. If you would use the name with '#' characters
+then the autoload script IS loaded.
+
+Be careful to not refer to an item in an autoload script that does trigger
+loading it unintentionally. For example, when setting an option that takes a
+function name, make sure to use a string, not a function reference: >
+ import autoload 'qftf.vim'
+ &quickfixtextfunc = 'qftf.Func' # autoload script NOT loaded
+ &quickfixtextfunc = qftf.Func # autoload script IS loaded
+On the other hand, it can be useful to load the script early, at a time when
+any errors should be given.
+
+For testing the |test_override()| function can be used to have the
+`import autoload` load the script right away, so that the items and types can
+be checked without waiting for them to be actually used: >
+ test_override('autoload', 1)
+Reset it later with: >
+ test_override('autoload', 0)
+Or: >
+ test_override('ALL', 0)
+
+
+==============================================================================
+
+6. Classes and interfaces *vim9-classes*
+
+In legacy script a Dictionary could be used as a kind-of object, by adding
+members that are functions. However, this is quite inefficient and requires
+the writer to do the work of making sure all the objects have the right
+members. See |Dictionary-function|.
+
+In |Vim9| script you can have classes, objects and interfaces like in most
+popular object-oriented programming languages. Since this is a lot of
+functionality it is located in a separate help file: |vim9class.txt|.
+
+
+==============================================================================
+
+9. Rationale *vim9-rationale*
+
+The :def command ~
+
+Plugin writers have asked for much faster Vim script. Investigations have
+shown that keeping the existing semantics of function calls make this close to
+impossible, because of the overhead involved with calling a function, setting
+up the local function scope and executing lines. There are many details that
+need to be handled, such as error messages and exceptions. The need to create
+a dictionary for a: and l: scopes, the a:000 list and several others add too
+much overhead that cannot be avoided.
+
+Therefore the `:def` method to define a new-style function had to be added,
+which allows for a function with different semantics. Most things still work
+as before, but some parts do not. A new way to define a function was
+considered the best way to separate the legacy style code from Vim9 style code.
+
+Using "def" to define a function comes from Python. Other languages use
+"function" which clashes with legacy Vim script.
+
+
+Type checking ~
+
+When compiling lines of Vim commands into instructions as much as possible
+should be done at compile time. Postponing it to runtime makes the execution
+slower and means mistakes are found only later. For example, when
+encountering the "+" character and compiling this into a generic add
+instruction, at runtime the instruction would have to inspect the type of the
+arguments and decide what kind of addition to do. And when the type is
+dictionary throw an error. If the types are known to be numbers then an "add
+number" instruction can be used, which is faster. The error can be given at
+compile time, no error handling is needed at runtime, since adding two numbers
+cannot fail.
+
+The syntax for types, using <type> for compound types, is similar to Java. It
+is easy to understand and widely used. The type names are what were used in
+Vim before, with some additions such as "void" and "bool".
+
+
+Removing clutter and weirdness ~
+
+Once decided that `:def` functions have different syntax than legacy functions,
+we are free to add improvements to make the code more familiar for users who
+know popular programming languages. In other words: remove weird things that
+only Vim does.
+
+We can also remove clutter, mainly things that were done to make Vim script
+backwards compatible with the good old Vi commands.
+
+Examples:
+- Drop `:call` for calling a function and `:eval` for evaluating an
+ expression.
+- Drop using a leading backslash for line continuation, automatically figure
+ out where an expression ends.
+
+However, this does require that some things need to change:
+- Comments start with # instead of ", to avoid confusing them with strings.
+ This is good anyway, it is also used by several popular languages.
+- Ex command ranges need to be prefixed with a colon, to avoid confusion with
+ expressions (single quote can be a string or a mark, "/" can be divide or a
+ search command, etc.).
+
+Goal is to limit the differences. A good criteria is that when the old syntax
+is accidentally used you are very likely to get an error message.
+
+
+Syntax and semantics from popular languages ~
+
+Script writers have complained that the Vim script syntax is unexpectedly
+different from what they are used to. To reduce this complaint popular
+languages are used as an example. At the same time, we do not want to abandon
+the well-known parts of legacy Vim script.
+
+For many things TypeScript is followed. It's a recent language that is
+gaining popularity and has similarities with Vim script. It also has a
+mix of static typing (a variable always has a known value type) and dynamic
+typing (a variable can have different types, this changes at runtime). Since
+legacy Vim script is dynamically typed and a lot of existing functionality
+(esp. builtin functions) depends on that, while static typing allows for much
+faster execution, we need to have this mix in Vim9 script.
+
+There is no intention to completely match TypeScript syntax and semantics. We
+just want to take those parts that we can use for Vim and we expect Vim users
+will be happy with. TypeScript is a complex language with its own history,
+advantages and disadvantages. To get an idea of the disadvantages read the
+book: "JavaScript: The Good Parts". Or find the article "TypeScript: the good
+parts" and read the "Things to avoid" section.
+
+People familiar with other languages (Java, Python, etc.) will also find
+things in TypeScript that they do not like or do not understand. We'll try to
+avoid those things.
+
+Specific items from TypeScript we avoid:
+- Overloading "+", using it both for addition and string concatenation. This
+ goes against legacy Vim script and often leads to mistakes. For that reason
+ we will keep using ".." for string concatenation. Lua also uses ".." this
+ way. And it allows for conversion to string for more values.
+- TypeScript can use an expression like "99 || 'yes'" in a condition, but
+ cannot assign the value to a boolean. That is inconsistent and can be
+ annoying. Vim recognizes an expression with && or || and allows using the
+ result as a bool. The |falsy-operator| was added for the mechanism to use a
+ default value.
+- TypeScript considers an empty string as Falsy, but an empty list or dict as
+ Truthy. That is inconsistent. In Vim an empty list and dict are also
+ Falsy.
+- TypeScript has various "Readonly" types, which have limited usefulness,
+ since a type cast can remove the immutable nature. Vim locks the value,
+ which is more flexible, but is only checked at runtime.
+- TypeScript has a complicated "import" statement that does not match how the
+ Vim import mechanism works. A much simpler mechanism is used instead, which
+ matches that the imported script is only sourced once.
+
+
+Declarations ~
+
+Legacy Vim script uses `:let` for every assignment, while in Vim9 declarations
+are used. That is different, thus it's good to use a different command:
+`:var`. This is used in many languages. The semantics might be slightly
+different, but it's easily recognized as a declaration.
+
+Using `:const` for constants is common, but the semantics varies. Some
+languages only make the variable immutable, others also make the value
+immutable. Since "final" is well known from Java for only making the variable
+immutable we decided to use that. And then `:const` can be used for making
+both immutable. This was also used in legacy Vim script and the meaning is
+almost the same.
+
+What we end up with is very similar to Dart: >
+ :var name # mutable variable and value
+ :final name # immutable variable, mutable value
+ :const name # immutable variable and value
+
+Since legacy and Vim9 script will be mixed and global variables will be
+shared, optional type checking is desirable. Also, type inference will avoid
+the need for specifying the type in many cases. The TypeScript syntax fits
+best for adding types to declarations: >
+ var name: string # string type is specified
+ ...
+ name = 'John'
+ const greeting = 'hello' # string type is inferred
+
+This is how we put types in a declaration: >
+ var mylist: list<string>
+ final mylist: list<string> = ['foo']
+ def Func(arg1: number, arg2: string): bool
+
+Two alternatives were considered:
+1. Put the type before the name, like Dart: >
+ var list<string> mylist
+ final list<string> mylist = ['foo']
+ def Func(number arg1, string arg2) bool
+2. Put the type after the variable name, but do not use a colon, like Go: >
+ var mylist list<string>
+ final mylist list<string> = ['foo']
+ def Func(arg1 number, arg2 string) bool
+
+The first is more familiar for anyone used to C or Java. The second one
+doesn't really have an advantage over the first, so let's discard the second.
+
+Since we use type inference the type can be left out when it can be inferred
+from the value. This means that after `var` we don't know if a type or a name
+follows. That makes parsing harder, not only for Vim but also for humans.
+Also, it will not be allowed to use a variable name that could be a type name,
+using `var string string` is too confusing.
+
+The chosen syntax, using a colon to separate the name from the type, adds
+punctuation, but it actually makes it easier to recognize the parts of a
+declaration.
+
+
+Expressions ~
+
+Expression evaluation was already close to what other languages are doing.
+Some details are unexpected and can be improved. For example a boolean
+condition would accept a string, convert it to a number and check if the
+number is non-zero. This is unexpected and often leads to mistakes, since
+text not starting with a number would be converted to zero, which is
+considered false. Thus using a string for a condition would often not give an
+error and be considered false. That is confusing.
+
+In Vim9 type checking is stricter to avoid mistakes. Where a condition is
+used, e.g. with the `:if` command and the `||` operator, only boolean-like
+values are accepted:
+ true: `true`, `v:true`, `1`, `0 < 9`
+ false: `false`, `v:false`, `0`, `0 > 9`
+Note that the number zero is false and the number one is true. This is more
+permissive than most other languages. It was done because many builtin
+functions return these values, and changing that causes more problems than it
+solves. After using this for a while it turned out to work well.
+
+If you have any type of value and want to use it as a boolean, use the `!!`
+operator:
+ true: `!!'text'` `!![99]` `!!{'x': 1}` `!!99`
+ false: `!!''` `!![]` `!!{}`
+
+From a language like JavaScript we have this handy construct: >
+ GetName() || 'unknown'
+However, this conflicts with only allowing a boolean for a condition.
+Therefore the "??" operator was added: >
+ GetName() ?? 'unknown'
+Here you can explicitly express your intention to use the value as-is and not
+result in a boolean. This is called the |falsy-operator|.
+
+
+Import and Export ~
+
+A problem of legacy Vim script is that by default all functions and variables
+are global. It is possible to make them script-local, but then they are not
+available in other scripts. This defies the concept of a package that only
+exports selected items and keeps the rest local.
+
+In Vim9 script a mechanism very similar to the JavaScript import and export
+mechanism is supported. It is a variant to the existing `:source` command
+that works like one would expect:
+- Instead of making everything global by default, everything is script-local,
+ some of these are exported.
+- When importing a script the symbols that are imported are explicitly listed,
+ avoiding name conflicts and failures if functionality is added later.
+- The mechanism allows for writing a big, long script with a very clear API:
+ the exported functions, variables and classes.
+- By using relative paths loading can be much faster for an import inside of a
+ package, no need to search many directories.
+- Once an import has been used, its items are cached and loading it again is
+ not needed.
+- The Vim-specific use of "s:" to make things script-local can be dropped.
+
+When sourcing a Vim9 script (from a Vim9 or legacy script), only the items
+defined globally can be used, not the exported items. Alternatives
+considered:
+- All the exported items become available as script-local items. This makes
+ it uncontrollable what items get defined and likely soon leads to trouble.
+- Use the exported items and make them global. Disadvantage is that it's then
+ not possible to avoid name clashes in the global namespace.
+- Completely disallow sourcing a Vim9 script, require using `:import`. That
+ makes it difficult to use scripts for testing, or sourcing them from the
+ command line to try them out.
+Note that you CAN also use `:import` in legacy Vim script, see above.
+
+
+Compiling functions early ~
+
+Functions are compiled when called or when `:defcompile` is used. Why not
+compile them early, so that syntax and type errors are reported early?
+
+The functions can't be compiled right away when encountered, because there may
+be forward references to functions defined later. Consider defining functions
+A, B and C, where A calls B, B calls C, and C calls A again. It's impossible
+to reorder the functions to avoid forward references.
+
+An alternative would be to first scan through the file to locate items and
+figure out their type, so that forward references are found, and only then
+execute the script and compile the functions. This means the script has to be
+parsed twice, which is slower, and some conditions at the script level, such
+as checking if a feature is supported, are hard to use. An attempt was made
+to see if it works, but it turned out to be impossible to make work well.
+
+It would be possible to compile all the functions at the end of the script.
+The drawback is that if a function never gets called, the overhead of
+compiling it counts anyway. Since startup speed is very important, in most
+cases it's better to do it later and accept that syntax and type errors are
+only reported then. In case these errors should be found early, e.g. when
+testing, a `:defcompile` command at the end of the script will help out.
+
+
+Why not use an existing embedded language? ~
+
+Vim supports interfaces to Perl, Python, Lua, Tcl and a few others. But
+these interfaces have never become widely used, for various reasons. When
+Vim9 was designed a decision was made to make these interfaces lower priority
+and concentrate on Vim script.
+
+Still, plugin writers may find other languages more familiar, want to use
+existing libraries or see a performance benefit. We encourage plugin authors
+to write code in any language and run it as an external process, using jobs
+and channels. We can try to make this easier somehow.
+
+Using an external tool also has disadvantages. An alternative is to convert
+the tool into Vim script. For that to be possible without too much
+translation, and keeping the code fast at the same time, the constructs of the
+tool need to be supported. Since most languages support classes the lack of
+support for classes in Vim is then a problem.
+
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/vim9class.txt b/runtime/doc/vim9class.txt
new file mode 100644
index 0000000..3c7722c
--- /dev/null
+++ b/runtime/doc/vim9class.txt
@@ -0,0 +1,900 @@
+*vim9class.txt* For Vim version 9.0. Last change: 2023 Feb 26
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+NOTE - This is not finished yet, anything can still change! - NOTE
+
+
+Vim9 classes, objects, interfaces, types and enums.
+
+1. Overview |Vim9-class-overview|
+2. A simple class |Vim9-simple-class|
+3. Class members and functions |Vim9-class-member|
+4. Using an abstract class |Vim9-abstract-class|
+5. Using an interface |Vim9-using-interface|
+6. More class details |Vim9-class|
+7. Type definition |Vim9-type|
+8. Enum |Vim9-enum|
+
+9. Rationale
+10. To be done later
+
+==============================================================================
+
+1. Overview *Vim9-class-overview*
+
+The fancy term is "object-oriented programming". You can find lots of study
+material on this subject. Here we document what |Vim9| script provides,
+assuming you know the basics already. Added are helpful hints about how to
+use this functionality effectively.
+
+The basic item is an object:
+- An object stores state. It contains one or more variables that can each
+ have a value.
+- An object provides functions that use and manipulate its state. These
+ functions are invoked "on the object", which is what sets it apart from the
+ traditional separation of data and code that manipulates the data.
+- An object has a well defined interface, with typed member variables and
+ member functions.
+- Objects are created from a class and all objects have the same interface.
+ This does not change at runtime, it is not dynamic.
+
+An object can only be created by a class. A class provides:
+- A new() method, the constructor, which returns an object for the class.
+ This method is invoked on the class name: MyClass.new().
+- State shared by all objects of the class: class variables (class members).
+- A hierarchy of classes, with super-classes and sub-classes, inheritance.
+
+An interface is used to specify properties of an object:
+- An object can declare several interfaces that it implements.
+- Different objects implementing the same interface can be used the same way.
+
+The class hierarchy allows for single inheritance. Otherwise interfaces are
+to be used where needed.
+
+
+Class modeling ~
+
+You can model classes any way you like. Keep in mind what you are building,
+don't try to model the real world. This can be confusing, especially because
+teachers use real-world objects to explain class relations and you might think
+your model should therefore reflect the real world. It doesn't! The model
+should match your purpose.
+
+Keep in mind that composition (an object contains other objects) is often
+better than inheritance (an object extends another object). Don't waste time
+trying to find the optimal class model. Or waste time discussing whether a
+square is a rectangle or that a rectangle is a square. It doesn't matter.
+
+
+==============================================================================
+
+2. A simple class *Vim9-simple-class*
+
+Let's start with a simple example: a class that stores a text position (see
+below for how to do this more efficiently): >
+
+ class TextPosition
+ this.lnum: number
+ this.col: number
+
+ def new(lnum: number, col: number)
+ this.lnum = lnum
+ this.col = col
+ enddef
+
+ def SetLnum(lnum: number)
+ this.lnum = lnum
+ enddef
+
+ def SetCol(col: number)
+ this.col = col
+ enddef
+
+ def SetPosition(lnum: number, col: number)
+ this.lnum = lnum
+ this.col = col
+ enddef
+ endclass
+< *object* *Object*
+You can create an object from this class with the new() method: >
+
+ var pos = TextPosition.new(1, 1)
+
+The object members "lnum" and "col" can be accessed directly: >
+
+ echo $'The text position is ({pos.lnum}, {pos.col})'
+< *E1317* *E1327*
+If you have been using other object-oriented languages you will notice that
+in Vim the object members are consistently referred to with the "this."
+prefix. This is different from languages like Java and TypeScript. The
+naming convention makes the object members easy to spot. Also, when a
+variable does not have the "this." prefix you know it is not an object member.
+
+
+Member write access ~
+
+Now try to change an object member directly: >
+
+ pos.lnum = 9
+< *E1335*
+This will give you an error! That is because by default object members can be
+read but not set. That's why the TextPosition class provides a method for it: >
+
+ pos.SetLnum(9)
+
+Allowing to read but not set an object member is the most common and safest
+way. Most often there is no problem using a value, while setting a value may
+have side effects that need to be taken care of. In this case, the SetLnum()
+method could check if the line number is valid and either give an error or use
+the closest valid value.
+ *:public* *E1331*
+If you don't care about side effects and want to allow the object member to be
+changed at any time, you can make it public: >
+
+ public this.lnum: number
+ public this.col: number
+
+Now you don't need the SetLnum(), SetCol() and SetPosition() methods, setting
+"pos.lnum" directly above will no longer give an error.
+ *E1334*
+If you try to set an object member that doesn't exist you get an error: >
+ pos.other = 9
+< E1334: Object member not found: other ~
+
+
+Private members ~
+ *E1332* *E1333*
+On the other hand, if you do not want the object members to be read directly,
+you can make them private. This is done by prefixing an underscore to the
+name: >
+
+ this._lnum: number
+ this._col number
+
+Now you need to provide methods to get the value of the private members.
+These are commonly called getters. We recommend using a name that starts with
+"Get": >
+
+ def GetLnum(): number
+ return this._lnum
+ enddef
+
+ def GetCol() number
+ return this._col
+ enddef
+
+This example isn't very useful, the members might as well have been public.
+It does become useful if you check the value. For example, restrict the line
+number to the total number of lines: >
+
+ def GetLnum(): number
+ if this._lnum > this._lineCount
+ return this._lineCount
+ endif
+ return this._lnum
+ enddef
+
+
+Simplifying the new() method ~
+
+Many constructors take values for the object members. Thus you very often see
+this pattern: >
+
+ class SomeClass
+ this.lnum: number
+ this.col: number
+
+ def new(lnum: number, col: number)
+ this.lnum = lnum
+ this.col = col
+ enddef
+ endclass
+
+Not only is this text you need to write, it also has the type of each member
+twice. Since this is so common a shorter way to write new() is provided: >
+
+ def new(this.lnum, this.col)
+ enddef
+
+The semantics are easy to understand: Providing the object member name,
+including "this.", as the argument to new() means the value provided in the
+new() call is assigned to that object member. This mechanism comes from the
+Dart language.
+
+Putting together this way of using new() and making the members public results
+in a much shorter class definition as what we started with: >
+
+ class TextPosition
+ public this.lnum: number
+ public this.col: number
+
+ def new(this.lnum, this.col)
+ enddef
+
+ def SetPosition(lnum: number, col: number)
+ this.lnum = lnum
+ this.col = col
+ enddef
+ endclass
+
+The sequence of constructing a new object is:
+1. Memory is allocated and cleared. All values are zero/false/empty.
+2. For each declared member that has an initializer, the expression is
+ evaluated and assigned to the member. This happens in the sequence the
+ members are declared in the class.
+3. Arguments in the new() method in the "this.name" form are assigned.
+4. The body of the new() method is executed.
+
+If the class extends a parent class, the same thing happens. In the second
+step the members of the parent class are done first. There is no need to call
+"super()" or "new()" on the parent.
+
+==============================================================================
+
+3. class members and functions *Vim9-class-member*
+
+ *:static* *E1337* *E1338*
+Class members are declared with "static". They are used by the name without a
+prefix: >
+
+ class OtherThing
+ this.size: number
+ static totalSize: number
+
+ def new(this.size)
+ totalSize += this.size
+ enddef
+ endclass
+< *E1340* *E1341*
+Since the name is used as-is, shadowing the name by a function argument name
+or local variable name is not allowed.
+
+Just like object members the access can be made private by using an underscore
+as the first character in the name, and it can be made public by prefixing
+"public": >
+
+ class OtherThing
+ static total: number # anybody can read, only class can write
+ static _sum: number # only class can read and write
+ public static result: number # anybody can read and write
+ endclass
+<
+ *class-function*
+Class functions are also declared with "static". They have no access to
+object members, they cannot use the "this" keyword. >
+
+ class OtherThing
+ this.size: number
+ static totalSize: number
+
+ # Clear the total size and return the value it had before.
+ static def ClearTotalSize(): number
+ var prev = totalSize
+ totalSize = 0
+ return prev
+ enddef
+ endclass
+
+Inside the class the function can be called by name directly, outside the
+class the class name must be prefixed: `OtherThing.ClearTotalSize()`.
+
+==============================================================================
+
+4. Using an abstract class *Vim9-abstract-class*
+
+An abstract class forms the base for at least one sub-class. In the class
+model one often finds that a few classes have the same properties that can be
+shared, but a class with these properties does not have enough state to create
+an object from. A sub-class must extend the abstract class and add the
+missing state and/or methods before it can be used to create objects for.
+
+For example, a Shape class could store a color and thickness. You cannot
+create a Shape object, it is missing the information about what kind of shape
+it is. The Shape class functions as the base for a Square and a Triangle
+class, for which objects can be created. Example: >
+
+ abstract class Shape
+ this.color = Color.Black
+ this.thickness = 10
+ endclass
+
+ class Square extends Shape
+ this.size: number
+
+ def new(this.size)
+ enddef
+ endclass
+
+ class Triangle extends Shape
+ this.base: number
+ this.height: number
+
+ def new(this.base, this.height)
+ enddef
+ endclass
+<
+An abstract class is defined the same way as a normal class, except that it
+does not have any new() method. *E1359*
+
+
+==============================================================================
+
+5. Using an interface *Vim9-using-interface*
+
+The example above with Shape, Square and Triangle can be made more useful if
+we add a method to compute the surface of the object. For that we create the
+interface called HasSurface, which specifies one method Surface() that returns
+a number. This example extends the one above: >
+
+ abstract class Shape
+ this.color = Color.Black
+ this.thickness = 10
+ endclass
+
+ interface HasSurface
+ def Surface(): number
+ endinterface
+
+ class Square extends Shape implements HasSurface
+ this.size: number
+
+ def new(this.size)
+ enddef
+
+ def Surface(): number
+ return this.size * this.size
+ enddef
+ endclass
+
+ class Triangle extends Shape implements HasSurface
+ this.base: number
+ this.height: number
+
+ def new(this.base, this.height)
+ enddef
+
+ def Surface(): number
+ return this.base * this.height / 2
+ enddef
+ endclass
+
+If a class declares to implement an interface, all the items specified in the
+interface must appear in the class, with the same types. *E1348* *E1349*
+
+The interface name can be used as a type: >
+
+ var shapes: list<HasSurface> = [
+ Square.new(12),
+ Triangle.new(8, 15),
+ ]
+ for shape in shapes
+ echo $'the surface is {shape.Surface()}'
+ endfor
+
+
+==============================================================================
+
+6. More class details *Vim9-class* *Class* *class*
+
+Defining a class ~
+ *:class* *:endclass* *:abstract*
+A class is defined between `:class` and `:endclass`. The whole class is
+defined in one script file. It is not possible to add to a class later.
+
+A class can only be defined in a |Vim9| script file. *E1316*
+A class cannot be defined inside a function.
+
+It is possible to define more than one class in a script file. Although it
+usually is better to export only one main class. It can be useful to define
+types, enums and helper classes though.
+
+The `:abstract` keyword may be prefixed and `:export` may be used. That gives
+these variants: >
+
+ class ClassName
+ endclass
+
+ export class ClassName
+ endclass
+
+ abstract class ClassName
+ endclass
+
+ export abstract class ClassName
+ endclass
+<
+ *E1314*
+The class name should be CamelCased. It must start with an uppercase letter.
+That avoids clashing with builtin types.
+ *E1315*
+After the class name these optional items can be used. Each can appear only
+once. They can appear in any order, although this order is recommended: >
+ extends ClassName
+ implements InterfaceName, OtherInterface
+ specifies SomeInterface
+< *E1355*
+Each member and function name can be used only once. It is not possible to
+define a function with the same name and different type of arguments.
+
+
+Extending a class ~
+ *extends*
+A class can extend one other class. *E1352* *E1353* *E1354*
+The basic idea is to build on top of an existing class, add properties to it.
+
+The extended class is called the "base class" or "super class". The new class
+is called the "child class".
+
+Object members from the base class are all taken over by the child class. It
+is not possible to override them (unlike some other languages).
+
+ *E1356* *E1357* *E1358*
+Object methods of the base class can be overruled. The signature (arguments,
+argument types and return type) must be exactly the same. The method of the
+base class can be called by prefixing "super.".
+
+Other object methods of the base class are taken over by the child class.
+
+Class functions, including functions starting with "new", can be overruled,
+like with object methods. The function on the base class can be called by
+prefixing the name of the class (for class functions) or "super.".
+
+Unlike other languages, the constructor of the base class does not need to be
+invoked. In fact, it cannot be invoked. If some initialization from the base
+class also needs to be done in a child class, put it in an object method and
+call that method from every constructor().
+
+If the base class did not specify a new() function then one was automatically
+created. This function will not be taken over by the child class. The child
+class can define its own new() function, or, if there isn't one, a new()
+function will be added automatically.
+
+
+A class implementing an interface ~
+ *implements* *E1346* *E1347*
+A class can implement one or more interfaces. The "implements" keyword can
+only appear once *E1350* . Multiple interfaces can be specified, separated by
+commas. Each interface name can appear only once. *E1351*
+
+
+A class defining an interface ~
+ *specifies*
+A class can declare its interface, the object members and methods, with a
+named interface. This avoids the need for separately specifying the
+interface, which is often done in many languages, especially Java.
+
+
+Items in a class ~
+ *E1318* *E1325* *E1326*
+Inside a class, in between `:class` and `:endclass`, these items can appear:
+- An object member declaration: >
+ this._memberName: memberType
+ this.memberName: memberType
+ public this.memberName: memberType
+- A constructor method: >
+ def new(arguments)
+ def newName(arguments)
+- An object method: >
+ def SomeMethod(arguments)
+< *E1329*
+For the object member the type must be specified. The best way is to do this
+explicitly with ": {type}". For simple types you can also use an initializer,
+such as "= 123", and Vim will see that the type is a number. Avoid doing this
+for more complex types and when the type will be incomplete. For example: >
+ this.nameList = []
+This specifies a list, but the item type is unknown. Better use: >
+ this.nameList: list<string>
+The initialization isn't needed, the list is empty by default.
+ *E1330*
+Some types cannot be used, such as "void", "null" and "v:none".
+
+
+Defining an interface ~
+ *:interface* *:endinterface*
+An interface is defined between `:interface` and `:endinterface`. It may be
+prefixed with `:export`: >
+
+ interface InterfaceName
+ endinterface
+
+ export interface InterfaceName
+ endinterface
+< *E1344*
+An interface can declare object members, just like in a class but without any
+initializer.
+ *E1345*
+An interface can declare methods with `:def`, including the arguments and
+return type, but without the body and without `:enddef`. Example: >
+
+ interface HasSurface
+ this.size: number
+ def Surface(): number
+ endinterface
+
+An interface name must start with an uppercase letter. *E1343*
+The "Has" prefix can be used to make it easier to guess this is an interface
+name, with a hint about what it provides.
+An interface can only be defined in a |Vim9| script file. *E1342*
+
+
+null object ~
+
+When a variable is declared to have the type of an object, but it is not
+initialized, the value is null. When trying to use this null object Vim often
+does not know what class was supposed to be used. Vim then cannot check if
+a member name is correct and you will get an "Using a null object" error,
+even when the member name is invalid. *E1360* *E1362*
+
+
+Default constructor ~
+
+In case you define a class without a new() method, one will be automatically
+defined. This default constructor will have arguments for all the object
+members, in the order they were specified. Thus if your class looks like: >
+
+ class AutoNew
+ this.name: string
+ this.age: number
+ this.gender: Gender
+ endclass
+
+Then The default constructor will be: >
+
+ def new(this.name = v:none, this.age = v:none, this.gender = v:none)
+ enddef
+
+The "= v:none" default values make the arguments optional. Thus you can also
+call `new()` without any arguments. No assignment will happen and the default
+value for the object members will be used. This is a more useful example,
+with default values: >
+
+ class TextPosition
+ this.lnum: number = 1
+ this.col: number = 1
+ endclass
+
+If you want the constructor to have mandatory arguments, you need to write it
+yourself. For example, if for the AutoNew class above you insist on getting
+the name, you can define the constructor like this: >
+
+ def new(this.name, this.age = v:none, this.gender = v:none)
+ enddef
+< *E1328*
+Note that you cannot use another default value than "v:none" here. If you
+want to initialize the object members, do it where they are declared. This
+way you only need to look in one place for the default values.
+
+All object members will be used in the default constructor, also private
+access ones.
+
+If the class extends another one, the object members of that class will come
+first.
+
+
+Multiple constructors ~
+
+Normally a class has just one new() constructor. In case you find that the
+constructor is often called with the same arguments you may want to simplify
+your code by putting those arguments into a second constructor method. For
+example, if you tend to use the color black a lot: >
+
+ def new(this.garment, this.color, this.size)
+ enddef
+ ...
+ var pants = new(Garment.pants, Color.black, "XL")
+ var shirt = new(Garment.shirt, Color.black, "XL")
+ var shoes = new(Garment.shoes, Color.black, "45")
+
+Instead of repeating the color every time you can add a constructor that
+includes it: >
+
+ def newBlack(this.garment, this.size)
+ this.color = Color.black
+ enddef
+ ...
+ var pants = newBlack(Garment.pants, "XL")
+ var shirt = newBlack(Garment.shirt, "XL")
+ var shoes = newBlack(Garment.shoes, "9.5")
+
+Note that the method name must start with "new". If there is no method called
+"new()" then the default constructor is added, even though there are other
+constructor methods.
+
+
+==============================================================================
+
+7. Type definition *Vim9-type* *:type*
+
+A type definition is giving a name to a type specification. For Example: >
+
+ :type ListOfStrings list<string>
+
+TODO: more explanation
+
+
+==============================================================================
+
+8. Enum *Vim9-enum* *:enum* *:endenum*
+
+An enum is a type that can have one of a list of values. Example: >
+
+ :enum Color
+ White
+ Red
+ Green
+ Blue
+ Black
+ :endenum
+
+TODO: more explanation
+
+
+==============================================================================
+
+9. Rationale
+
+Most of the choices for |Vim9| classes come from popular and recently
+developed languages, such as Java, TypeScript and Dart. The syntax has been
+made to fit with the way Vim script works, such as using `endclass` instead of
+using curly braces around the whole class.
+
+Some common constructs of object-oriented languages were chosen very long ago
+when this kind of programming was still new, and later found to be
+sub-optimal. By this time those constructs were widely used and changing them
+was not an option. In Vim we do have the freedom to make different choices,
+since classes are completely new. We can make the syntax simpler and more
+consistent than what "old" languages use. Without diverting too much, it
+should still mostly look like what you know from existing languages.
+
+Some recently developed languages add all kinds of fancy features that we
+don't need for Vim. But some have nice ideas that we do want to use.
+Thus we end up with a base of what is common in popular languages, dropping
+what looks like a bad idea, and adding some nice features that are easy to
+understand.
+
+The main rules we use to make decisions:
+- Keep it simple.
+- No surprises, mostly do what other languages are doing.
+- Avoid mistakes from the past.
+- Avoid the need for the script writer to consult the help to understand how
+ things work, most things should be obvious.
+- Keep it consistent.
+- Aim at an average size plugin, not at a huge project.
+
+
+Using new() for the constructor ~
+
+Many languages use the class name for the constructor method. A disadvantage
+is that quite often this is a long name. And when changing the class name all
+constructor methods need to be renamed. Not a big deal, but still a
+disadvantage.
+
+Other languages, such as TypeScript, use a specific name, such as
+"constructor()". That seems better. However, using "new" or "new()" to
+create a new object has no obvious relation with "constructor()".
+
+For |Vim9| script using the same method name for all constructors seemed like
+the right choice, and by calling it new() the relation between the caller and
+the method being called is obvious.
+
+
+No overloading of the constructor ~
+
+In Vim script, both legacy and |Vim9| script, there is no overloading of
+functions. That means it is not possible to use the same function name with
+different types of arguments. Therefore there also is only one new()
+constructor.
+
+With |Vim9| script it would be possible to support overloading, since
+arguments are typed. However, this gets complicated very quickly. Looking at
+a new() call one has to inspect the types of the arguments to know which of
+several new() methods is actually being called. And that can require
+inspecting quite a bit of code. For example, if one of the arguments is the
+return value of a method, you need to find that method to see what type it is
+returning.
+
+Instead, every constructor has to have a different name, starting with "new".
+That way multiple constructors with different arguments are possible, while it
+is very easy to see which constructor is being used. And the type of
+arguments can be properly checked.
+
+
+No overloading of methods ~
+
+Same reasoning as for the constructor: It is often not obvious what type
+arguments have, which would make it difficult to figure out what method is
+actually being called. Better just give the methods a different name, then
+type checking will make sure it works as you intended. This rules out
+polymorphism, which we don't really need anyway.
+
+
+Single inheritance and interfaces ~
+
+Some languages support multiple inheritance. Although that can be useful in
+some cases, it makes the rules of how a class works quite complicated.
+Instead, using interfaces to declare what is supported is much simpler. The
+very popular Java language does it this way, and it should be good enough for
+Vim. The "keep it simple" rule applies here.
+
+Explicitly declaring that a class supports an interface makes it easy to see
+what a class is intended for. It also makes it possible to do proper type
+checking. When an interface is changed any class that declares to implement
+it will be checked if that change was also changed. The mechanism to assume a
+class implements an interface just because the methods happen to match is
+brittle and leads to obscure problems, let's not do that.
+
+
+Using "this.member" everywhere ~
+
+The object members in various programming languages can often be accessed in
+different ways, depending on the location. Sometimes "this." has to be
+prepended to avoid ambiguity. They are usually declared without "this.".
+That is quite inconsistent and sometimes confusing.
+
+A very common issue is that in the constructor the arguments use the same name
+as the object member. Then for these members "this." needs to be prefixed in
+the body, while for other members this is not needed and often omitted. This
+leads to a mix of members with and without "this.", which is inconsistent.
+
+For |Vim9| classes the "this." prefix is always used. Also for declaring the
+members. Simple and consistent. When looking at the code inside a class it's
+also directly clear which variable references are object members and which
+aren't.
+
+
+Using class members ~
+
+Using "static member" to declare a class member is very common, nothing new
+here. In |Vim9| script these can be accessed directly by their name. Very
+much like how a script-local variable can be used in a function. Since object
+members are always accessed with "this." prepended, it's also quickly clear
+what kind of member it is.
+
+TypeScript prepends the class name before the class member, also inside the
+class. This has two problems: The class name can be rather long, taking up
+quite a bit of space, and when the class is renamed all these places need to
+be changed too.
+
+
+Declaring object and class members ~
+
+The main choice is whether to use "var" as with variable declarations.
+TypeScript does not use it: >
+ class Point {
+ x: number;
+ y = 0;
+ }
+
+Following that Vim object members could be declared like this: >
+ class Point
+ this.x: number
+ this.y = 0
+ endclass
+
+Some users pointed out that this looks more like an assignment than a
+declaration. Adding "var" changes that: >
+ class Point
+ var this.x: number
+ var this.y = 0
+ endclass
+
+We also need to be able to declare class members using the "static" keyword.
+There we can also choose to leave out "var": >
+ class Point
+ var this.x: number
+ static count = 0
+ endclass
+
+Or do use it, before "static": >
+ class Point
+ var this.x: number
+ var static count = 0
+ endclass
+
+Or after "static": >
+ class Point
+ var this.x: number
+ static var count = 0
+ endclass
+
+This is more in line with "static def Func()".
+
+There is no clear preference whether to use "var" or not. The two main
+reasons to leave it out are:
+1. TypeScript, Java and other popular languages do not use it.
+2. Less clutter.
+
+
+Using "ClassName.new()" to construct an object ~
+
+Many languages use the "new" operator to create an object, which is actually
+kind of strange, since the constructor is defined as a method with arguments,
+not a command. TypeScript also has the "new" keyword, but the method is
+called "constructor()", it is hard to see the relation between the two.
+
+In |Vim9| script the constructor method is called new(), and it is invoked as
+new(), simple and straightforward. Other languages use "new ClassName()",
+while there is no ClassName() method, it's a method by another name in the
+class called ClassName. Quite confusing.
+
+
+Default read access to object members ~
+
+Some users will remark that the access rules for object members are
+asymmetric. Well, that is intentional. Changing a value is a very different
+action than reading a value. The read operation has no side effects, it can
+be done any number of times without affecting the object. Changing the value
+can have many side effects, and even have a ripple effect, affecting other
+objects.
+
+When adding object members one usually doesn't think much about this, just get
+the type right. And normally the values are set in the new() method.
+Therefore defaulting to read access only "just works" in most cases. And when
+directly writing you get an error, which makes you wonder if you actually want
+to allow that. This helps writing code with fewer mistakes.
+
+
+Making object members private with an underscore ~
+
+When an object member is private, it can only be read and changed inside the
+class (and in sub-classes), then it cannot be used outside of the class.
+Prepending an underscore is a simple way to make that visible. Various
+programming languages have this as a recommendation.
+
+In case you change your mind and want to make the object member accessible
+outside of the class, you will have to remove the underscore everywhere.
+Since the name only appears in the class (and sub-classes) they will be easy
+to find and change.
+
+The other way around is much harder: you can easily prepend an underscore to
+the object member inside the class to make it private, but any usage elsewhere
+you will have to track down and change. You may have to make it a "set"
+method call. This reflects the real world problem that taking away access
+requires work to be done for all places where that access exists.
+
+An alternative would have been using the "private" keyword, just like "public"
+changes the access in the other direction. Well, that's just to reduce the
+number of keywords.
+
+
+No protected object members ~
+
+Some languages provide several ways to control access to object members. The
+most known is "protected", and the meaning varies from language to language.
+Others are "shared", "private" and even "friend".
+
+These rules make life more difficult. That can be justified in projects where
+many people work on the same, complex code where it is easy to make mistakes.
+Especially when refactoring or other changes to the class model.
+
+The Vim scripts are expected to be used in a plugin, with just one person or a
+small team working on it. Complex rules then only make it more complicated,
+the extra safety provide by the rules isn't really needed. Let's just keep it
+simple and not specify access details.
+
+
+==============================================================================
+
+10. To be done later
+
+Can a newSomething() constructor invoke another constructor? If yes, what are
+the restrictions?
+
+Thoughts:
+- Generics for a class: `class <Tkey, Tentry>`
+- Generics for a function: `def <Tkey> GetLast(key: Tkey)`
+- Mixins: not sure if that is useful, leave out for simplicity.
+
+Some things that look like good additions:
+- For testing: Mock mechanism
+
+An important class to be provided is "Promise". Since Vim is single
+threaded, connecting asynchronous operations is a natural way of allowing
+plugins to do their work without blocking the user. It's a uniform way to
+invoke callbacks and handle timeouts and errors.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/vimdiff-da.1 b/runtime/doc/vimdiff-da.1
new file mode 100644
index 0000000..194bce2
--- /dev/null
+++ b/runtime/doc/vimdiff-da.1
@@ -0,0 +1,50 @@
+.TH VIMDIFF 1 "30. marts 2001"
+.SH NAVN
+vimdiff \- rediger to, tre eller fire version af en fil med Vim,
+og vis forskellene
+.SH SYNOPSIS
+.br
+.B vimdiff
+[tilvalg] fil1 fil2 [fil3 [fil4]]
+.PP
+.B gvimdiff
+.SH BESKRIVELSE
+.B Vimdiff
+starter
+.B Vim
+p to (eller tre eller fire) filer.
+Hver fil fr sit eget vindue.
+Forskellene mellem filerne fremhves.
+Det er en fin mde til at inspicere ndringer og til at flytte ndringer fra
+en version til en anden version af den samme fil.
+.PP
+Se vim(1) for detaljer om selve Vim.
+.PP
+Nr den startes som
+.B gvimdiff
+, s starter den GUI'en, hvis den er tilgngelig.
+.PP
+I hvert vindue sttes 'diff'-valgmuligheden, som fr forskellene
+til at blive fremhvet.
+.br
+\'wrap'- og 'scrollbind'-valgmulighederne sttes for at f teksten til
+at se godt ud.
+.br
+\'foldmethod'-valgmuligheden sttes til "diff", hvilket lgger omrder af
+linjer uden ndringer i en sammenfoldning. 'foldcolumn' sttes til to,
+for at gre det lettere at se sammenfoldningerne og bne eller lukke dem.
+.SH TILVALG
+Lodrette opdelinger bruges til at opstille linjerne, som hvis "\-O"-argumentet
+blev brugt.
+Brug "\-o"-argumentet, for i stedet at bruge vandrette opdelinger.
+.PP
+Se vim(1) for alle andre argumenter.
+.SH SE OGS
+vim(1)
+.SH FORFATTER
+Det meste af
+.B Vim
+blev lavet af Bram Moolenaar, med en masse hjlp fra andre.
+Se ":help credits" i
+.B Vim\c
+\&. \ No newline at end of file
diff --git a/runtime/doc/vimdiff-da.UTF-8.1 b/runtime/doc/vimdiff-da.UTF-8.1
new file mode 100644
index 0000000..e8373a8
--- /dev/null
+++ b/runtime/doc/vimdiff-da.UTF-8.1
@@ -0,0 +1,50 @@
+.TH VIMDIFF 1 "30. marts 2001"
+.SH NAVN
+vimdiff \- rediger to, tre eller fire version af en fil med Vim,
+og vis forskellene
+.SH SYNOPSIS
+.br
+.B vimdiff
+[tilvalg] fil1 fil2 [fil3 [fil4]]
+.PP
+.B gvimdiff
+.SH BESKRIVELSE
+.B Vimdiff
+starter
+.B Vim
+på to (eller tre eller fire) filer.
+Hver fil får sit eget vindue.
+Forskellene mellem filerne fremhæves.
+Det er en fin måde til at inspicere ændringer og til at flytte ændringer fra
+en version til en anden version af den samme fil.
+.PP
+Se vim(1) for detaljer om selve Vim.
+.PP
+Når den startes som
+.B gvimdiff
+, så starter den GUI'en, hvis den er tilgængelig.
+.PP
+I hvert vindue sættes 'diff'-valgmuligheden, som får forskellene
+til at blive fremhævet.
+.br
+\'wrap'- og 'scrollbind'-valgmulighederne sættes for at få teksten til
+at se godt ud.
+.br
+\'foldmethod'-valgmuligheden sættes til "diff", hvilket lægger områder af
+linjer uden ændringer i en sammenfoldning. 'foldcolumn' sættes til to,
+for at gøre det lettere at se sammenfoldningerne og åbne eller lukke dem.
+.SH TILVALG
+Lodrette opdelinger bruges til at opstille linjerne, som hvis "\-O"-argumentet
+blev brugt.
+Brug "\-o"-argumentet, for i stedet at bruge vandrette opdelinger.
+.PP
+Se vim(1) for alle andre argumenter.
+.SH SE OGSÅ
+vim(1)
+.SH FORFATTER
+Det meste af
+.B Vim
+blev lavet af Bram Moolenaar, med en masse hjælp fra andre.
+Se ":help credits" i
+.B Vim\c
+\&.
diff --git a/runtime/doc/vimdiff-fr.1 b/runtime/doc/vimdiff-fr.1
new file mode 100644
index 0000000..67a64e3
--- /dev/null
+++ b/runtime/doc/vimdiff-fr.1
@@ -0,0 +1,54 @@
+.TH VIMDIFF 1 "30 mars 2001"
+.SH NOM
+vimdiff \- ouvre deux, trois ou quatre versions d'un fichier dans Vim et
+affiche leurs diffrences
+.SH SYNOPSIS
+.br
+.B vimdiff
+[options] fichier1 fichier2 [fichier3 [fichier4]]
+.PP
+.B gvimdiff
+.SH DESCRIPTION
+.B Vimdiff
+dmarre
+.B Vim
+avec deux (ou trois ou quatre) fichiers.
+Chaque fichier est ouvert dans sa propre fentre.
+Les diffrences entre ces fichiers sont mises en surbrillance.
+C'est un outil trs pratique pour visualiser et reporter les
+changements entre deux versions d'un mme fichier.
+.PP
+Consulter vim(1) pour des informations sur l'diteur Vim lui-mme.
+.PP
+Si
+.B gvimdiff
+est invoqu, l'IHM graphique est dmarre quand elle est disponible.
+.PP
+L'option 'diff' est active dans chacune des fentres, ce qui provoque la mise
+en surbrillance des diffrences.
+.br
+Les options 'wrap' et 'scrollbind' sont actives pour donner un aspect
+agrable au texte.
+.br
+L'option 'foldmethod' est fixe "diff", ce qui replie les lignes conscutives
+identiques. 'foldcolumn' est fix 2 pour trouver les replis rapidement et
+les ouvrir ou les fermer facilement.
+.SH ARGUMENTS
+La fentre de Vim est partage verticalement afin d'afficher les lignes
+correspondantes les unes en face des autres, comme si l'argument "\-O" tait
+spcifi. Utilisez l'argument "\-o" pour obtenir un partage horizontal la
+place.
+.PP
+Pour connatre les autres arguments disponibles, consultez vim(1).
+.SH VOIR AUSSI
+vim(1)
+.SH AUTEUR
+La majeure partie de
+.B Vim
+a t crite par Bram Moolenaar, avec l'aide de nombreux autres contributeurs.
+Voir ":help credits" dans
+.B Vim.
+.SH TRADUCTION
+Cette page de manuel a t traduite par David Blanchet
+<david.blanchet@free.fr> 2005-03-12.
+Mise jour 2012-05-06, Dominique Pell <dominique.pelle@gmail.com>
diff --git a/runtime/doc/vimdiff-fr.UTF-8.1 b/runtime/doc/vimdiff-fr.UTF-8.1
new file mode 100644
index 0000000..3b44a3d
--- /dev/null
+++ b/runtime/doc/vimdiff-fr.UTF-8.1
@@ -0,0 +1,54 @@
+.TH VIMDIFF 1 "30 mars 2001"
+.SH NOM
+vimdiff \- ouvre deux, trois ou quatre versions d'un fichier dans Vim et
+affiche leurs différences
+.SH SYNOPSIS
+.br
+.B vimdiff
+[options] fichier1 fichier2 [fichier3 [fichier4]]
+.PP
+.B gvimdiff
+.SH DESCRIPTION
+.B Vimdiff
+démarre
+.B Vim
+avec deux (ou trois ou quatre) fichiers.
+Chaque fichier est ouvert dans sa propre fenêtre.
+Les différences entre ces fichiers sont mises en surbrillance.
+C'est un outil très pratique pour visualiser et reporter les
+changements entre deux versions d'un même fichier.
+.PP
+Consulter vim(1) pour des informations sur l'éditeur Vim lui-même.
+.PP
+Si
+.B gvimdiff
+est invoqué, l'IHM graphique est démarrée quand elle est disponible.
+.PP
+L'option 'diff' est activée dans chacune des fenêtres, ce qui provoque la mise
+en surbrillance des différences.
+.br
+Les options 'wrap' et 'scrollbind' sont activées pour donner un aspect
+agréable au texte.
+.br
+L'option 'foldmethod' est fixée à "diff", ce qui replie les lignes consécutives
+identiques. 'foldcolumn' est fixé à 2 pour trouver les replis rapidement et
+les ouvrir ou les fermer facilement.
+.SH ARGUMENTS
+La fenêtre de Vim est partagée verticalement afin d'afficher les lignes
+correspondantes les unes en face des autres, comme si l'argument "\-O" était
+spécifié. Utilisez l'argument "\-o" pour obtenir un partage horizontal à la
+place.
+.PP
+Pour connaître les autres arguments disponibles, consultez vim(1).
+.SH VOIR AUSSI
+vim(1)
+.SH AUTEUR
+La majeure partie de
+.B Vim
+a été écrite par Bram Moolenaar, avec l'aide de nombreux autres contributeurs.
+Voir ":help credits" dans
+.B Vim.
+.SH TRADUCTION
+Cette page de manuel a été traduite par David Blanchet
+<david.blanchet@free.fr> 2005-03-12.
+Mise à jour 2012-05-06, Dominique Pellé <dominique.pelle@gmail.com>
diff --git a/runtime/doc/vimdiff-it.1 b/runtime/doc/vimdiff-it.1
new file mode 100644
index 0000000..2203877
--- /dev/null
+++ b/runtime/doc/vimdiff-it.1
@@ -0,0 +1,48 @@
+.TH VIMDIFF 1 "30 marzo 2001"
+.SH NOME
+vimdiff \- modifica due, tre o quattro versioni di un file con Vim,
+visualizzando le differenze
+.SH SINTASSI
+.br
+.B vimdiff
+[opzioni] file1 file2 [file3 [file4]]
+.PP
+.B gvimdiff
+.SH DESCRIZIONE
+.B Vimdiff
+inizia
+.B Vim
+per due (o tre o quattro) file.
+Ogni file ha una sua finestra.
+Le differenze fra file sono evidenziate.
+ una maniera elegante per controllare modifiche e portare modifiche
+verso un'altra versione dello stesso file.
+.PP
+Vedere vim(1) per dettagli su Vim in generale.
+.PP
+Se iniziato con
+.B gvimdiff
+la GUI sar utilizzata, se disponibile.
+.PP
+In ogni finestra l'opzione 'diff' impostata, evidenziando cos le
+differenze.
+.br
+Le opzioni 'wrap' e 'scrollbind' sono impostate per migliorare la
+visibilit del testo.
+.br
+L'opzione 'foldmethod' impostata al valore "diff", che mette gruppi di
+linee uguali fra i diversi file in una piegatura. 'foldcolumn' impostato
+a due per poter facilmente visualizzare le piegature, aprirle e chiuderle.
+.SH OPZIONI
+Lo schermo diviso verticalmente, come se aveste usato l'opzione "\-O".
+Per dividerlo orizzontalmente, usare l'opzione "\-o".
+.PP
+Per tutte le altre opzioni, vedere vim(1).
+.SH VEDERE ANCHE
+vim(1)
+.SH AUTORE
+Buona parte di
+.B Vim
+ stato scritto da Bram Moolenaar, con molto aiuto da altri.
+Vedere ":help credits" in
+.B Vim.
diff --git a/runtime/doc/vimdiff-it.UTF-8.1 b/runtime/doc/vimdiff-it.UTF-8.1
new file mode 100644
index 0000000..090892f
--- /dev/null
+++ b/runtime/doc/vimdiff-it.UTF-8.1
@@ -0,0 +1,48 @@
+.TH VIMDIFF 1 "30 marzo 2001"
+.SH NOME
+vimdiff \- modifica due, tre o quattro versioni di un file con Vim,
+visualizzando le differenze
+.SH SINTASSI
+.br
+.B vimdiff
+[opzioni] file1 file2 [file3 [file4]]
+.PP
+.B gvimdiff
+.SH DESCRIZIONE
+.B Vimdiff
+inizia
+.B Vim
+per due (o tre o quattro) file.
+Ogni file ha una sua finestra.
+Le differenze fra file sono evidenziate.
+È una maniera elegante per controllare modifiche e portare modifiche
+verso un'altra versione dello stesso file.
+.PP
+Vedere vim(1) per dettagli su Vim in generale.
+.PP
+Se iniziato con
+.B gvimdiff
+la GUI sarà utilizzata, se disponibile.
+.PP
+In ogni finestra l'opzione 'diff' è impostata, evidenziando così le
+differenze.
+.br
+Le opzioni 'wrap' e 'scrollbind' sono impostate per migliorare la
+visibilità del testo.
+.br
+L'opzione 'foldmethod' è impostata al valore "diff", che mette gruppi di
+linee uguali fra i diversi file in una piegatura. 'foldcolumn' è impostato
+a due per poter facilmente visualizzare le piegature, aprirle e chiuderle.
+.SH OPZIONI
+Lo schermo è diviso verticalmente, come se aveste usato l'opzione "\-O".
+Per dividerlo orizzontalmente, usare l'opzione "\-o".
+.PP
+Per tutte le altre opzioni, vedere vim(1).
+.SH VEDERE ANCHE
+vim(1)
+.SH AUTORE
+Buona parte di
+.B Vim
+è stato scritto da Bram Moolenaar, con molto aiuto da altri.
+Vedere ":help credits" in
+.B Vim.
diff --git a/runtime/doc/vimdiff-ja.UTF-8.1 b/runtime/doc/vimdiff-ja.UTF-8.1
new file mode 100644
index 0000000..b9324ee
--- /dev/null
+++ b/runtime/doc/vimdiff-ja.UTF-8.1
@@ -0,0 +1,39 @@
+.TH VIMDIFF 1 "2001 March 30"
+.SH 名前
+vimdiff \- 2 個から 8 個のファイルを Vim で開いて、その差分を表示する
+.SH 書式
+.br
+.B vimdiff
+[options] file1 file2 [file3 [file4 [file5 [file6 [file7 [file8]]]]]]
+.PP
+.B gvimdiff
+.SH 説明
+.B Vimdiff
+は、2 個から 8 個のファイルを
+.B Vim
+で開きます。
+ファイルは個別のウィンドウで開かれ、差分が強調表示されます。
+同じファイルの別のバージョン間で、変更を確認したり、変更を移動したりするのが簡単になります。
+.PP
+Vim についての詳細は vim(1) を参照してください。
+.PP
+.B gvimdiff
+という名前で起動された場合は GUI で起動します。
+.PP
+差分を強調表示するために、それぞれのウィンドウの 'diff' オプションがオンに設定されます。
+.br
+テキストを見やすくするために、オプションの 'wrap' と 'scrollbind' もオンに設定されます。
+.br
+ 'foldmethod' オプションは "diff" に設定され、変更されていない行は折り畳まれます。
+折り畳みの確認と開閉が簡単にできるように、'foldcolumn' は 2 に設定されます。
+.SH オプション
+行を並べて表示するために、"\-O" 引数を使ったときのように、ウィンドウは垂直分割されます。
+ウィンドウを水平分割したい場合は "\-o" 引数を使ってください。
+.PP
+その他の引数については vim(1) を参照してください。
+.SH 関連項目
+vim(1)
+.SH 著者
+.B Vim
+のほとんどの機能は Bram Moolenaar が開発し、多くの人が協力しました。
+":help credits" を参照してください。
diff --git a/runtime/doc/vimdiff-pl.1 b/runtime/doc/vimdiff-pl.1
new file mode 100644
index 0000000..5332f78
--- /dev/null
+++ b/runtime/doc/vimdiff-pl.1
@@ -0,0 +1,46 @@
+.TH VIMDIFF 1 "2001 Mar 30"
+.SH NAZWA
+vimdiff \- edytuj dwie, trzy lub cztery wersje pliku w Vimie i zobacz rnice
+.SH SYNOPSIS
+.br
+.B vimdiff
+[opcje] plik1 plik2 [plik3 [plik4]]
+.PP
+.B gvimdiff
+.SH OPIS
+.B Vimdiff
+uruchomi
+.B Vima
+z dwoma (trzema lub czterema plikami), kady z nich we wasnym oknie.
+Rnice midzy plikami zostan podwietlone.
+Jest to dobry sposb by przeanalizowa rnice i przenie zmiany z jednej
+wersji pliku do innej.
+.PP
+Zobacz vim(1) by pozna wicej szczegw o samym Vimie.
+.PP
+Kiedy uruchomiony jako
+.B gvimdiff
+zostanie uruchomione GUI (jeli dostpne).
+.PP
+W kadym oknie zostanie ustawiona opcja 'diff', ktra spowoduje
+podwietlenie rnic.
+.br
+Opcje 'wrap' i 'scrollbind' zostan ustawione by tekst si
+wygodnie przegldao.
+.br
+Opcja 'foldmethod' zostanie ustawiona na "diff", dziki czemu
+niezmienione linie zostan zwinite. 'foldcolumn' bdzie rwne 2 aby
+atwo wyszukiwa, otwiera i zamyka zwinicia.
+.SH OPCJE
+Pionowy podzia zostanie uyty do wyrwnania linii, tak jakby uyto
+opcji "\-O". Aby uzyska poziomy podzia uyj opcji "\-o".
+.PP
+Aby pozna inne opcje zobacz vim(1).
+.SH ZOBACZ TAKE
+vim(1)
+.SH AUTOR
+Wikszo
+.B Vima
+zostaa napisana przez Brama Moolenaara przy pomocy wielu innych osb.
+Zobacz ":help credits w
+.B Vimie.
diff --git a/runtime/doc/vimdiff-pl.UTF-8.1 b/runtime/doc/vimdiff-pl.UTF-8.1
new file mode 100644
index 0000000..d66fdc9
--- /dev/null
+++ b/runtime/doc/vimdiff-pl.UTF-8.1
@@ -0,0 +1,46 @@
+.TH VIMDIFF 1 "2001 Mar 30"
+.SH NAZWA
+vimdiff \- edytuj dwie, trzy lub cztery wersje pliku w Vimie i zobacz różnice
+.SH SYNOPSIS
+.br
+.B vimdiff
+[opcje] plik1 plik2 [plik3 [plik4]]
+.PP
+.B gvimdiff
+.SH OPIS
+.B Vimdiff
+uruchomi
+.B Vima
+z dwoma (trzema lub czterema plikami), każdy z nich we własnym oknie.
+Różnice między plikami zostaną podświetlone.
+Jest to dobry sposób by przeanalizować różnice i przenieść zmiany z jednej
+wersji pliku do innej.
+.PP
+Zobacz vim(1) by poznać więcej szczegółów o samym Vimie.
+.PP
+Kiedy uruchomiony jako
+.B gvimdiff
+zostanie uruchomione GUI (jeśli dostępne).
+.PP
+W każdym oknie zostanie ustawiona opcja 'diff', która spowoduje
+podświetlenie różnic.
+.br
+Opcje 'wrap' i 'scrollbind' zostaną ustawione by tekst się
+wygodnie przeglądało.
+.br
+Opcja 'foldmethod' zostanie ustawiona na "diff", dzięki czemu
+niezmienione linie zostaną zwinięte. 'foldcolumn' będzie równe 2 aby
+łatwo wyszukiwać, otwierać i zamykać zwinięcia.
+.SH OPCJE
+Pionowy podział zostanie użyty do wyrównania linii, tak jakby użyto
+opcji "\-O". Aby uzyskać poziomy podział użyj opcji "\-o".
+.PP
+Aby poznać inne opcje zobacz vim(1).
+.SH ZOBACZ TAKŻE
+vim(1)
+.SH AUTOR
+Większość
+.B Vima
+została napisana przez Brama Moolenaara przy pomocy wielu innych osób.
+Zobacz ":help credits w
+.B Vimie.
diff --git a/runtime/doc/vimdiff-ru.1 b/runtime/doc/vimdiff-ru.1
new file mode 100644
index 0000000..3855367
--- /dev/null
+++ b/runtime/doc/vimdiff-ru.1
@@ -0,0 +1,50 @@
+.TH VIMDIFF 1 "2001 March 30"
+.SH
+vimdiff \- Vim
+ .
+.SH
+.br
+.B vimdiff
+[] 1 2 [3]
+.PP
+.B gvimdiff
+.SH
+
+.B vimdiff
+
+.B Vim
+ ( ) . .
+ .
+ ӣ
+ .
+.PP
+ Vim . vim(1).
+.PP
+
+.B gvimdiff
+ , .
+.PP
+ 'diff',
+ .
+.br
+
+ 'wrap' 'scrollbind'.
+.br
+ 'foldmethod' "diff",
+ , .
+ 'foldcolumn' 2,
+, .
+.SH
+ ,
+ "\-O". ,
+ , "\-o".
+.PP
+ vim(1).
+.SH
+vim(1)
+.SH
+
+.B Vim
+ (Bram Moolenaar),
+ . . ":help credits"
+.B Vim.
diff --git a/runtime/doc/vimdiff-ru.UTF-8.1 b/runtime/doc/vimdiff-ru.UTF-8.1
new file mode 100644
index 0000000..2f17e9c
--- /dev/null
+++ b/runtime/doc/vimdiff-ru.UTF-8.1
@@ -0,0 +1,50 @@
+.TH VIMDIFF 1 "2001 March 30"
+.SH ИМЯ
+vimdiff \- позволяет редактировать две или три версии файла с помощью Vim
+с отображением различий.
+.SH КОМАНДНАЯ СТРОКА
+.br
+.B vimdiff
+[ключи] файл1 файл2 [файл3]
+.PP
+.B gvimdiff
+.SH ОПИСАНИЕ
+Команда
+.B vimdiff
+загружает в
+.B Vim
+два (или три) файла. Каждый файл открывается в собственном окне.
+Различия между файлами отображаются с помощью подсветки синтаксиса.
+Эта команда позволяет наглядно отображать внесённые изменения и переносить
+различающиеся фрагменты из одной версии файла в другую.
+.PP
+Подробнее о Vim см. на странице справочника vim(1).
+.PP
+При запуске с помощью команды
+.B gvimdiff
+редактор запускается в режиме графического интерфейса, если это возможно.
+.PP
+В каждом окне включается опция 'diff', что позволяет использовать подсветку
+синтаксиса для отображения различий между файлами.
+.br
+Для улучшения работы с файлами в режиме отображения отличий также включаются
+опции 'wrap' и 'scrollbind'.
+.br
+Значение опции 'foldmethod' устанавливается равным "diff", что позволяет
+прятать в складку области текста, которые не отличаются в различных версиях файла.
+Значение опции 'foldcolumn' устанавливается равным 2, чтобы было проще
+находить, открывать и закрывать такие складки.
+.SH КЛЮЧИ ЗАПУСКА
+Для выравнивания строк между окнами используется вертикальное разделение окон,
+как если бы использовался ключ "\-O". Для того, чтобы использовать разделение
+окон по горизонтали, следует указать в командной строке ключ "\-o".
+.PP
+Остальные ключи командной строки рассматриваются на странице справочника vim(1).
+.SH СМОТРИ ТАКЖЕ
+vim(1)
+.SH АВТОРЫ
+Большая часть
+.B Vim
+создана Брамом Мооленааром (Bram Moolenaar), которому помогает огромное
+количество людей. См. ":help credits" в
+.B Vim.
diff --git a/runtime/doc/vimdiff-tr.1 b/runtime/doc/vimdiff-tr.1
new file mode 100644
index 0000000..aee79a7
--- /dev/null
+++ b/runtime/doc/vimdiff-tr.1
@@ -0,0 +1,45 @@
+.TH VIMDIFF 1 "30 Mart 2001"
+.SH AD
+vimdiff \- bir dosyann drt adede kadar srmlerini Vim ile dzenle
+ve ayrmlarn gster
+.SH ZET
+.br
+.B vimdiff
+[seenekler] dosya1 dosya2 [dosya3 [dosya4]]
+.PP
+.B gvimdiff
+.SH TANIM
+.B Vimdiff,
+.B Vim
+iinde iki ( veya drt) dosyay aar.
+Her dosya ayr pencerelerde alr.
+Dosyalar arasndaki ayrmlar vurgulanr.
+Bylece deiiklikler kolayca denetlenebilir ve ayn dosyann baka bir
+srmne kolaylkla aktarlabilir.
+.PP
+Vim hakknda ek bilgi iin: vim(1)
+.PP
+.B gvimdiff
+olarak balatlrsa varsa grafik arabirim alr.
+.PP
+Her pencerede 'diff' seenei alr, bylece deiiklikler vurgulanr.
+.br
+\'wrap' ve 'scrollbind' seenekleri metnin dzgn grnmesi iin alr.
+.br
+\'foldmethod' seenei "diff"e, ayarlanr, bylece satr aralklar
+kvrlr. 'foldcolumn' seenei kvrmalar kolay ayrmlama ve ap kapama
+iin iki olarak ayarlanr.
+.SH SEENEKLER
+Satrlar hizalama iin "\-O" seenei kullanlmasna dikey blntler
+iinde grntlenir.
+Yatay blntler kullanmak iin "\-o" kullann.
+Dier tm deikenler iin: vim(1).
+.SH AYRICA BAKINIZ
+vim(1)
+.SH YAZAR
+.B Vim'in
+byk ounluu Bram Moolenaar tarafndan bakalarnn kayda deer
+yardmlaryla yazlmtr.
+Ek bilgi iin
+.B Vim
+iinde ":help credits" yazn.
diff --git a/runtime/doc/vimdiff-tr.UTF-8.1 b/runtime/doc/vimdiff-tr.UTF-8.1
new file mode 100644
index 0000000..45f4c58
--- /dev/null
+++ b/runtime/doc/vimdiff-tr.UTF-8.1
@@ -0,0 +1,45 @@
+.TH VIMDIFF 1 "30 Mart 2001"
+.SH AD
+vimdiff \- bir dosyanın dört adede kadar sürümlerini Vim ile düzenle
+ve ayrımlarını göster
+.SH ÖZET
+.br
+.B vimdiff
+[seçenekler] dosya1 dosya2 [dosya3 [dosya4]]
+.PP
+.B gvimdiff
+.SH TANIM
+.B Vimdiff,
+.B Vim
+içinde iki (üç veya dört) dosyayı açar.
+Her dosya ayrı pencerelerde açılır.
+Dosyalar arasındaki ayrımlar vurgulanır.
+Böylece değişiklikler kolayca denetlenebilir ve aynı dosyanın başka bir
+sürümüne kolaylıkla aktarılabilir.
+.PP
+Vim hakkında ek bilgi için: vim(1)
+.PP
+.B gvimdiff
+olarak başlatılırsa varsa grafik arabirim açılır.
+.PP
+Her pencerede 'diff' seçeneği açılır, böylece değişiklikler vurgulanır.
+.br
+\'wrap' ve 'scrollbind' seçenekleri metnin düzgün görünmesi için açılır.
+.br
+\'foldmethod' seçeneği "diff"e, ayarlanır, böylece satır aralıkları
+kıvrılır. 'foldcolumn' seçeneği kıvırmaları kolay ayrımlama ve açıp kapama
+için iki olarak ayarlanır.
+.SH SEÇENEKLER
+Satırlar hizalama için "\-O" seçeneği kullanılmışçasına dikey bölüntüler
+içinde görüntülenir.
+Yatay bölüntüler kullanmak için "\-o" kullanın.
+Diğer tüm değişkenler için: vim(1).
+.SH AYRICA BAKINIZ
+vim(1)
+.SH YAZAR
+.B Vim'in
+büyük çoğunluğu Bram Moolenaar tarafından başkalarının kayda değer
+yardımlarıyla yazılmıştır.
+Ek bilgi için
+.B Vim
+içinde ":help credits" yazın.
diff --git a/runtime/doc/vimdiff.1 b/runtime/doc/vimdiff.1
new file mode 100644
index 0000000..ddcb30f
--- /dev/null
+++ b/runtime/doc/vimdiff.1
@@ -0,0 +1,46 @@
+.TH VIMDIFF 1 "2001 March 30"
+.SH NAME
+vimdiff \- edit between two and eight versions of a file with Vim and show differences
+.SH SYNOPSIS
+.br
+.B vimdiff
+[options] file1 file2 [file3 [file4 [file5 [file6 [file7 [file8]]]]]]
+.PP
+.B gvimdiff
+.SH DESCRIPTION
+.B Vimdiff
+starts
+.B Vim
+on two up to eight files.
+Each file gets its own window.
+The differences between the files are highlighted.
+This is a nice way to inspect changes and to move changes from one version
+to another version of the same file.
+.PP
+See vim(1) for details about Vim itself.
+.PP
+When started as
+.B gvimdiff
+the GUI will be started, if available.
+.PP
+In each window the 'diff' option will be set, which causes the differences
+to be highlighted.
+.br
+The 'wrap' and 'scrollbind' options are set to make the text look good.
+.br
+The 'foldmethod' option is set to "diff", which puts ranges of lines without
+changes in a fold. 'foldcolumn' is set to two to make it easy to spot the
+folds and open or close them.
+.SH OPTIONS
+Vertical splits are used to align the lines, as if the "\-O" argument was used.
+To use horizontal splits instead, use the "\-o" argument.
+.PP
+For all other arguments see vim(1).
+.SH SEE ALSO
+vim(1)
+.SH AUTHOR
+Most of
+.B Vim
+was made by Bram Moolenaar, with a lot of help from others.
+See ":help credits" in
+.B Vim.
diff --git a/runtime/doc/vimdiff.man b/runtime/doc/vimdiff.man
new file mode 100644
index 0000000..a053e6a
--- /dev/null
+++ b/runtime/doc/vimdiff.man
@@ -0,0 +1,47 @@
+VIMDIFF(1) General Commands Manual VIMDIFF(1)
+
+
+
+NAME
+ vimdiff - edit between two and eight versions of a file with Vim and
+ show differences
+
+SYNOPSIS
+ vimdiff [options] file1 file2 [file3 [file4 [file5 [file6 [file7
+ [file8]]]]]]
+
+ gvimdiff
+
+DESCRIPTION
+ Vimdiff starts Vim on two up to eight files. Each file gets its own
+ window. The differences between the files are highlighted. This is a
+ nice way to inspect changes and to move changes from one version to an‐
+ other version of the same file.
+
+ See vim(1) for details about Vim itself.
+
+ When started as gvimdiff the GUI will be started, if available.
+
+ In each window the 'diff' option will be set, which causes the differ‐
+ ences to be highlighted.
+ The 'wrap' and 'scrollbind' options are set to make the text look good.
+ The 'foldmethod' option is set to "diff", which puts ranges of lines
+ without changes in a fold. 'foldcolumn' is set to two to make it easy
+ to spot the folds and open or close them.
+
+OPTIONS
+ Vertical splits are used to align the lines, as if the "-O" argument
+ was used. To use horizontal splits instead, use the "-o" argument.
+
+ For all other arguments see vim(1).
+
+SEE ALSO
+ vim(1)
+
+AUTHOR
+ Most of Vim was made by Bram Moolenaar, with a lot of help from others.
+ See ":help credits" in Vim.
+
+
+
+ 2001 March 30 VIMDIFF(1)
diff --git a/runtime/doc/vimtutor-da.1 b/runtime/doc/vimtutor-da.1
new file mode 100644
index 0000000..ec8cde0
--- /dev/null
+++ b/runtime/doc/vimtutor-da.1
@@ -0,0 +1,53 @@
+.TH VIMTUTOR 1 "2. april 2001"
+.SH NAVN
+vimtutor \- Vim-vejledningen
+.SH SYNOPSIS
+.br
+.B vimtutor [\-g] [sprog]
+.SH BESKRIVELSE
+.B Vimtutor
+starter
+.B Vim\c
+-vejledningen.
+Det kopierer frst vejledningsfilen, s den kan ndres uden at ndre
+den originale fil.
+.PP
+.B Vimtutor
+er nyttig til personer der vil lre deres frste
+.B Vim\c
+-kommandoer.
+.PP
+Det valgfrie argument \-g starter vimtutor med gvim fremfor vim, hvis
+GUI-versionen af vim er tilgngelig, ellers bruges Vim hvis ikke gvim findes.
+.PP
+Det valgfrie [sprog]-argument er navnet p et sprog, p 2 bogstaver, ssom
+"da" eller "fi".
+Hvis [sprog]-argumentet mangler, bruges sproget fra den nuvrende lokalitet.
+Hvis der findes er en vejledning p dette sprog, s bruges den.
+Ellers bruges den engelske version.
+.PP
+.B Vim
+startes altid i Vi-kompatibel tilstand.
+.SH FILER
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.sprog]
+.B Vimtutor\c
+-tekstfilerne.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+Vim-scriptet som bruges til at kopiere
+.B Vimtutor\c
+-tekstfilen.
+.SH FORFATTER
+.B Vimtutor
+blev oprindeligt skrevet til Vi af Michael C. Pierce og Robert K. Ware,
+Colorado School of Mines med ideer af Charles Smith,
+Colorado State University.
+E-mail: bware@mines.colorado.edu.
+.br
+Den blev ndret til
+.B Vim
+af Bram Moolenaar.
+Overstternes navne kan ses i tutor-filerne.
+.SH SE OGS
+vim(1)
diff --git a/runtime/doc/vimtutor-da.UTF-8.1 b/runtime/doc/vimtutor-da.UTF-8.1
new file mode 100644
index 0000000..feb7ea3
--- /dev/null
+++ b/runtime/doc/vimtutor-da.UTF-8.1
@@ -0,0 +1,53 @@
+.TH VIMTUTOR 1 "2. april 2001"
+.SH NAVN
+vimtutor \- Vim-vejledningen
+.SH SYNOPSIS
+.br
+.B vimtutor [\-g] [sprog]
+.SH BESKRIVELSE
+.B Vimtutor
+starter
+.B Vim\c
+-vejledningen.
+Det kopierer først vejledningsfilen, så den kan ændres uden at ændre
+den originale fil.
+.PP
+.B Vimtutor
+er nyttig til personer der vil lære deres første
+.B Vim\c
+-kommandoer.
+.PP
+Det valgfrie argument \-g starter vimtutor med gvim fremfor vim, hvis
+GUI-versionen af vim er tilgængelig, ellers bruges Vim hvis ikke gvim findes.
+.PP
+Det valgfrie [sprog]-argument er navnet på et sprog, på 2 bogstaver, såsom
+"da" eller "fi".
+Hvis [sprog]-argumentet mangler, bruges sproget fra den nuværende lokalitet.
+Hvis der findes er en vejledning på dette sprog, så bruges den.
+Ellers bruges den engelske version.
+.PP
+.B Vim
+startes altid i Vi-kompatibel tilstand.
+.SH FILER
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.sprog]
+.B Vimtutor\c
+-tekstfilerne.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+Vim-scriptet som bruges til at kopiere
+.B Vimtutor\c
+-tekstfilen.
+.SH FORFATTER
+.B Vimtutor
+blev oprindeligt skrevet til Vi af Michael C. Pierce og Robert K. Ware,
+Colorado School of Mines med ideer af Charles Smith,
+Colorado State University.
+E-mail: bware@mines.colorado.edu.
+.br
+Den blev ændret til
+.B Vim
+af Bram Moolenaar.
+Oversætternes navne kan ses i tutor-filerne.
+.SH SE OGSÅ
+vim(1)
diff --git a/runtime/doc/vimtutor-fr.1 b/runtime/doc/vimtutor-fr.1
new file mode 100644
index 0000000..06e03fb
--- /dev/null
+++ b/runtime/doc/vimtutor-fr.1
@@ -0,0 +1,60 @@
+.TH VIMTUTOR 1 "2 avril 2001"
+.SH NAME
+vimtutor \- tutoriel Vim
+.SH SYNOPSIS
+.br
+.B vimtutor [\-g] [langue]
+.SH DESCRIPTION
+.B Vimtutor
+lance le tutoriel
+.B Vim
+\.
+Il copie d'abord le fichier du tutoriel, afin que vous puissiez le modifier
+sans altrer le fichier original.
+.PP
+.B Vimtutor
+est utile pour les personnes souhaitant apprendre leurs premires commandes
+.B Vim
+\.
+.PP
+L'argument optionnel \-g lance vimtutor avec gvim plutt qu'avec vim, si l'IHM
+graphique de vim est disponible, ou le lance avec vim si gvim n'est pas
+disponible.
+.PP
+L'argument optionnel [langue] est le nom d'une langue, spcifie par son
+symbole deux lettres, tels que "it" ou "es". Si l'argument [langue] est omis,
+la langue de la rgion linguistique actuelle sera retenue. Si le tutoriel est
+disponible dans cette langue, il est propos. Sinon, c'est la version anglaise
+qui est propose.
+.PP
+.B Vim
+est toujours lanc en mode Compatible Vi.
+.SH FICHIERS
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.langue]
+Les fichiers textes de
+.B Vimtutor
+\.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+Le script Vim utilis pour copier les fichiers texte de
+.B Vimtutor
+\.
+.SH AUTEUR
+.B Vimtutor
+a t crit l'origine pour Vi par Michael C. Pierce et Robert K. Ware, de la
+Colorado School of Mines, en reprenant des ides mises par Charles Smith, de
+la Colorado State University.
+E-mail : bware@mines.colorado.edu.
+.br
+Il a t modifi pour
+.B Vim
+par Bram Moolenaar.
+Pour connatre le nom des traducteurs, consultez les fichiers textes du
+tutoriel.
+.SH VOIR AUSSI
+vim(1)
+.SH TRADUCTION
+Cette page de manuel a t traduite par David Blanchet
+<david.blanchet@free.fr> 2004-12-27.
+Mise jour 2012-05-06, Dominique Pell <dominique.pelle@gmail.com>
diff --git a/runtime/doc/vimtutor-fr.UTF-8.1 b/runtime/doc/vimtutor-fr.UTF-8.1
new file mode 100644
index 0000000..f47f840
--- /dev/null
+++ b/runtime/doc/vimtutor-fr.UTF-8.1
@@ -0,0 +1,60 @@
+.TH VIMTUTOR 1 "2 avril 2001"
+.SH NAME
+vimtutor \- tutoriel Vim
+.SH SYNOPSIS
+.br
+.B vimtutor [\-g] [langue]
+.SH DESCRIPTION
+.B Vimtutor
+lance le tutoriel
+.B Vim
+\.
+Il copie d'abord le fichier du tutoriel, afin que vous puissiez le modifier
+sans altérer le fichier original.
+.PP
+.B Vimtutor
+est utile pour les personnes souhaitant apprendre leurs premières commandes
+.B Vim
+\.
+.PP
+L'argument optionnel \-g lance vimtutor avec gvim plutôt qu'avec vim, si l'IHM
+graphique de vim est disponible, ou le lance avec vim si gvim n'est pas
+disponible.
+.PP
+L'argument optionnel [langue] est le nom d'une langue, spécifiée par son
+symbole à deux lettres, tels que "it" ou "es". Si l'argument [langue] est omis,
+la langue de la région linguistique actuelle sera retenue. Si le tutoriel est
+disponible dans cette langue, il est proposé. Sinon, c'est la version anglaise
+qui est proposée.
+.PP
+.B Vim
+est toujours lancé en mode Compatible Vi.
+.SH FICHIERS
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.langue]
+Les fichiers textes de
+.B Vimtutor
+\.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+Le script Vim utilisé pour copier les fichiers texte de
+.B Vimtutor
+\.
+.SH AUTEUR
+.B Vimtutor
+a été écrit à l'origine pour Vi par Michael C. Pierce et Robert K. Ware, de la
+Colorado School of Mines, en reprenant des idées émises par Charles Smith, de
+la Colorado State University.
+E-mail : bware@mines.colorado.edu.
+.br
+Il a été modifié pour
+.B Vim
+par Bram Moolenaar.
+Pour connaître le nom des traducteurs, consultez les fichiers textes du
+tutoriel.
+.SH VOIR AUSSI
+vim(1)
+.SH TRADUCTION
+Cette page de manuel a été traduite par David Blanchet
+<david.blanchet@free.fr> 2004-12-27.
+Mise à jour 2012-05-06, Dominique Pellé <dominique.pelle@gmail.com>
diff --git a/runtime/doc/vimtutor-it.1 b/runtime/doc/vimtutor-it.1
new file mode 100644
index 0000000..b5c1e61
--- /dev/null
+++ b/runtime/doc/vimtutor-it.1
@@ -0,0 +1,58 @@
+.TH VIMTUTOR 1 "2 aprile 2001"
+.SH NOME
+vimtutor \- Un breve corso per imparare Vim
+.SH SINTASSI
+.br
+.B vimtutor [\-g] [lingua]
+.SH DESCRIZIONE
+.B Vimtutor
+inizia il
+.B Vim
+tutor (una breve corso per imparare Vim).
+Per prima cosa viene creata una copia del file di lavoro, che pu cos essere
+modificato senza alterare il file usato come modello.
+.PP
+Il comando
+.B Vimtutor
+ utile a chi voglia imparare i primi comandi
+.B Vim
+.
+.PP
+L'argomento opzionale \-g inizia vimtutor usando gvim invece che vim, se la
+versione GUI di vim disponibile. oppure utilizza vim, se gvim non
+disponibile.
+.PP
+L'arogmento opzionale [lingua] l'abbreviazione di due lettere del nome
+di una lingua, per esempio "it" oppure "es".
+se L'argomento [lingua] non viene specificato, si utilizza la lingua "locale"
+del computer.
+Se la versione in quella lingua del "tutor" disponibile, sar usata.
+Altrimenti sar usata la versione inglese.
+.PP
+.B Vim
+ sempre iniziato in Modo compatibile con vi.
+.SH FILE
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.language]
+Il/I file di testo per
+.B Vimtutor
+
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+Lo script di Vim usato per copiare il file di testo
+.B Vimtutor
+.
+.SH AUTORE
+The
+.B Vimtutor
+ stato scritto in origine per Vi da Michael C. Pierce e Robert K. Ware,
+Colorado School of Mines, usando idee fornite da Charles Smith,
+Colorado State University.
+E\-mail: bware@mines.colorado.edu.
+.br
+ stato modificato per
+.B Vim
+da Bram Moolenaar.
+Per i nomi dei traduttori, vedere i file usati nelle rispettive lingue.
+.SH VEDERE ANCHE
+vim(1)
diff --git a/runtime/doc/vimtutor-it.UTF-8.1 b/runtime/doc/vimtutor-it.UTF-8.1
new file mode 100644
index 0000000..a33dcb0
--- /dev/null
+++ b/runtime/doc/vimtutor-it.UTF-8.1
@@ -0,0 +1,58 @@
+.TH VIMTUTOR 1 "2 aprile 2001"
+.SH NOME
+vimtutor \- Un breve corso per imparare Vim
+.SH SINTASSI
+.br
+.B vimtutor [\-g] [lingua]
+.SH DESCRIZIONE
+.B Vimtutor
+inizia il
+.B Vim
+tutor (una breve corso per imparare Vim).
+Per prima cosa viene creata una copia del file di lavoro, che può così essere
+modificato senza alterare il file usato come modello.
+.PP
+Il comando
+.B Vimtutor
+è utile a chi voglia imparare i primi comandi
+.B Vim
+.
+.PP
+L'argomento opzionale \-g inizia vimtutor usando gvim invece che vim, se la
+versione GUI di vim è disponibile. oppure utilizza vim, se gvim non è
+disponibile.
+.PP
+L'arogmento opzionale [lingua] è l'abbreviazione di due lettere del nome
+di una lingua, per esempio "it" oppure "es".
+se L'argomento [lingua] non viene specificato, si utilizza la lingua "locale"
+del computer.
+Se la versione in quella lingua del "tutor" è disponibile, sarà usata.
+Altrimenti sarà usata la versione inglese.
+.PP
+.B Vim
+è sempre iniziato in Modo compatibile con vi.
+.SH FILE
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.language]
+Il/I file di testo per
+.B Vimtutor
+
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+Lo script di Vim usato per copiare il file di testo
+.B Vimtutor
+.
+.SH AUTORE
+The
+.B Vimtutor
+è stato scritto in origine per Vi da Michael C. Pierce e Robert K. Ware,
+Colorado School of Mines, usando idee fornite da Charles Smith,
+Colorado State University.
+E\-mail: bware@mines.colorado.edu.
+.br
+È stato modificato per
+.B Vim
+da Bram Moolenaar.
+Per i nomi dei traduttori, vedere i file usati nelle rispettive lingue.
+.SH VEDERE ANCHE
+vim(1)
diff --git a/runtime/doc/vimtutor-ja.UTF-8.1 b/runtime/doc/vimtutor-ja.UTF-8.1
new file mode 100644
index 0000000..2ba8f43
--- /dev/null
+++ b/runtime/doc/vimtutor-ja.UTF-8.1
@@ -0,0 +1,44 @@
+.TH VIMTUTOR 1 "2001 April 2"
+.SH 名前
+vimtutor \- Vim チュートリアル
+.SH 書式
+.br
+.B vimtutor [\-g] [language]
+.SH 説明
+.B Vim
+のチュートリアルを起動します。
+演習ファイルのコピーを使って実施するので、オリジナルの演習ファイルを壊してしまう心配はありません。
+.PP
+.B Vim
+を初めて学ぶ人向けのチュートリアルです。
+.PP
+引数に \-g を指定すると GUI 版の vim が利用可能であれば vim ではなく gvim
+を使って vimtutor が開始します。gvim が見つからないときは Vim が使用されます。
+.PP
+[language] 引数は "ja" や "es" などの二文字の言語名です。
+[language] 引数を省略した場合はロケールの言語が使われます。
+翻訳された演習ファイルがある場合は、そのファイルが使われます。
+ない場合は英語のファイルが使われます。
+.PP
+.B Vim
+は Vi 互換モードで起動されます。
+.SH ファイル
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.language]
+.B Vimtutor
+の演習ファイル。
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+演習ファイルをコピーするための Vim スクリプト。
+.SH 著者
+.B Vimtutor
+は、Colorado State University の Charles Smith のアイデアを基に、
+Colorado School of Mines の Michael C. Pierce と Robert K. Ware
+の両名によって Vi 向けに作成されたものを基にしています。
+E-mail: bware@mines.colorado.edu.
+.br
+.B Vim
+に合わせて Bram Moolenaar が変更を加えました。
+翻訳者の名前は演習ファイルを参照してください。
+.SH 関連項目
+vim(1)
diff --git a/runtime/doc/vimtutor-pl.1 b/runtime/doc/vimtutor-pl.1
new file mode 100644
index 0000000..e603ca5
--- /dev/null
+++ b/runtime/doc/vimtutor-pl.1
@@ -0,0 +1,51 @@
+.TH VIMTUTOR 1 "2001 Kwi 2"
+.SH NAZWA
+vimtutor \- nauczyciel Vima
+.SH SYNOPSIS
+.br
+.B vimtutor -g [jzyk]
+.SH OPIS
+.B Vimtutor
+uruchamia nauczyciela
+.B Vima.
+Najpierw kopiuje waciwy plik, dziki temu mona go zmienia bez obaw
+utraty treci.
+.PP
+.B Vimtutor
+przyda si ludziom, ktrzy chc si nauczy pierwszych polece
+.B Vima
+.PP
+Opcjonalny argument \-g uruchamia vimtutor w gvimie a nie w Vimie jeli
+graficzna wersja Vima jest dostpna, jeli nie zostanie uruchomiony Vim.
+.PP
+Opcjonalny argument [jzyk] jest dwu literowym kodem jzyka, tak jak
+"it" lub "es".
+Jeli brak argumentu [jzyk] zostanie uyty jzyk biecej
+lokalizacji.
+Jeli nauczyciel w tym jzyku jest dostpny, zostanie uyty \- w innym
+wypadku zostanie wykorzystana wersja angielska.
+.PP
+.B Vim
+jest uruchamiany zawsze w trybie kompatybilnoci z Vi
+.SH PLIKI
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.jzyk]
+Tekstowe pliki
+.B Vimtutora.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+Skrypt Vima uywany do kopiowania pliku
+.B Vimtutora.
+.SH AUTOR
+.B Vimtutor
+zosta pocztkowo napisany dla Vi przez Michaela C. Pierce'a
+i Roberta K. Ware'a z Colorado School of Mines zainspirowani przez
+Charlesa Smitha z Colorado State University.
+E-mail: bware@mines.colorado.edu
+.br
+Zmodyfikowany na potrzeby
+.B Vima
+przez Brama Moolenaara.
+Nazwiska tumaczy w plikach.
+.SH ZOBACZ TAKE
+vim(1)
diff --git a/runtime/doc/vimtutor-pl.UTF-8.1 b/runtime/doc/vimtutor-pl.UTF-8.1
new file mode 100644
index 0000000..199fcd0
--- /dev/null
+++ b/runtime/doc/vimtutor-pl.UTF-8.1
@@ -0,0 +1,51 @@
+.TH VIMTUTOR 1 "2001 Kwi 2"
+.SH NAZWA
+vimtutor \- nauczyciel Vima
+.SH SYNOPSIS
+.br
+.B vimtutor -g [język]
+.SH OPIS
+.B Vimtutor
+uruchamia nauczyciela
+.B Vima.
+Najpierw kopiuje właściwy plik, dzięki temu można go zmieniać bez obaw
+utraty treści.
+.PP
+.B Vimtutor
+przyda się ludziom, którzy chcą się nauczyć pierwszych poleceń
+.B Vima
+.PP
+Opcjonalny argument \-g uruchamia vimtutor w gvimie a nie w Vimie jeśli
+graficzna wersja Vima jest dostępna, jeśli nie zostanie uruchomiony Vim.
+.PP
+Opcjonalny argument [język] jest dwu literowym kodem języka, tak jak
+"it" lub "es".
+Jeśli brak argumentu [język] zostanie użyty język bieżącej
+lokalizacji.
+Jeśli nauczyciel w tym języku jest dostępny, zostanie użyty \- w innym
+wypadku zostanie wykorzystana wersja angielska.
+.PP
+.B Vim
+jest uruchamiany zawsze w trybie kompatybilności z Vi
+.SH PLIKI
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.język]
+Tekstowe pliki
+.B Vimtutora.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+Skrypt Vima używany do kopiowania pliku
+.B Vimtutora.
+.SH AUTOR
+.B Vimtutor
+został początkowo napisany dla Vi przez Michaela C. Pierce'a
+i Roberta K. Ware'a z Colorado School of Mines zainspirowani przez
+Charlesa Smitha z Colorado State University.
+E-mail: bware@mines.colorado.edu
+.br
+Zmodyfikowany na potrzeby
+.B Vima
+przez Brama Moolenaara.
+Nazwiska tłumaczy w plikach.
+.SH ZOBACZ TAKŻE
+vim(1)
diff --git a/runtime/doc/vimtutor-ru.1 b/runtime/doc/vimtutor-ru.1
new file mode 100644
index 0000000..fa3c5d9
--- /dev/null
+++ b/runtime/doc/vimtutor-ru.1
@@ -0,0 +1,51 @@
+.TH VIMTUTOR 1 "2001 April 2"
+.SH
+vimtutor \- Vim
+.SH
+.br
+.B vimtutor []
+.SH
+
+.B vimtutor
+
+.B Vim.
+ ,
+ .
+.PP
+
+.B vimtutor
+ ,
+.B Vim.
+.PP
+ [] ,
+ "ru" "it".
+ [] ,
+ . ,
+ .
+.PP
+
+.B Vim
+ Vi.
+.SH
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.]
+
+.B vimtutor.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+ Vim,
+
+.B vimtutor.
+.SH
+.B Vimtutor
+ Vi . (Michael C. Pierce)
+ . (Robert K. Ware) Colorado School of Mines
+ (Charles Smith) Colorado State University.
+E-mail: bware@mines.colorado.edu.
+.br
+
+.B Vim
+ (Bram Moolenaar).
+ .
+.SH
+vim(1)
diff --git a/runtime/doc/vimtutor-ru.UTF-8.1 b/runtime/doc/vimtutor-ru.UTF-8.1
new file mode 100644
index 0000000..6b1ba90
--- /dev/null
+++ b/runtime/doc/vimtutor-ru.UTF-8.1
@@ -0,0 +1,51 @@
+.TH VIMTUTOR 1 "2001 April 2"
+.SH ИМЯ
+vimtutor \- учебник по Vim
+.SH КОМАНДНАЯ СТРОКА
+.br
+.B vimtutor [язык]
+.SH ОПИСАНИЕ
+Команда
+.B vimtutor
+запускает учебник по
+.B Vim.
+При этом сначала происходит создание копии файла учебника,
+чтобы его можно было редактировать без опасения потерять исходный файл.
+.PP
+Программа
+.B vimtutor
+полезна для новичков, желающих научиться самым основным командам
+.B Vim.
+.PP
+Необязательный параметр [язык] представляет собой двухсимвольный код языка,
+например "ru" или "it".
+Если параметр [язык] не указан, то используется язык активной в настоящий
+момент локали. Если учебник на этом языке не существует, то по умолчанию
+используется учебник на английском языке.
+.PP
+При работе с учебником
+.B Vim
+всегда запускается в режиме совместимости с Vi.
+.SH ФАЙЛЫ
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.язык]
+Текст учебника
+.B vimtutor.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+Сценарий Vim, который используется для создания рабочей
+копии текста учебника
+.B vimtutor.
+.SH АВТОРЫ
+.B Vimtutor
+был впервые написан для Vi Майклом К. Пирсом (Michael C. Pierce) и
+Робертом К. Уэа (Robert K. Ware) из Colorado School of Mines по
+идее Чарльза Смита (Charles Smith) из Colorado State University.
+E-mail: bware@mines.colorado.edu.
+.br
+Впоследствии учебник был доработан для использования в
+.B Vim
+Брамом Мооленааром (Bram Moolenaar).
+Имена переводчиков учебника упоминаются в соответствующих файлах.
+.SH СМОТРИ ТАКЖЕ
+vim(1)
diff --git a/runtime/doc/vimtutor-tr.1 b/runtime/doc/vimtutor-tr.1
new file mode 100644
index 0000000..42f01d8
--- /dev/null
+++ b/runtime/doc/vimtutor-tr.1
@@ -0,0 +1,50 @@
+.TH VIMTUTOR 1 "2 Nisan 2001"
+.SH AD
+vimtutor \- Vim eitmeni
+.SH ZET
+.br
+.B vimtutor [\-g] [dil]
+.SH TANIM
+.B Vimtutor,
+.B Vim
+eitmenini balatr.
+nce orijinal eitmen dosyasnn bir kopyasn alr, bylece bir deiiklie
+uramadan deitirilebilir.
+.PP
+.B Vimtutor
+ilk
+.B Vim
+komutlarn renmek isteyen kiiler iin yararldr.
+.PP
+stee bal \-g deikeni vimtutor'u vim yerine eer ykl ise gvim ile
+balatr. Ykl deilse amak iin Vim kullanlr.
+.PP
+stee bal [dil] deikeni iki harfli dil kodunu belirtir, rnein "tr"
+veya "es". Eer [dil] deikeni verilmemise mevcut yerelletirme
+kullanlr.
+Eer bu dilde bir eitmen varsa kullanlr.
+Yoksa ngilizce srm kullanlacaktr.
+.PP
+.B Vim
+her zaman Vi uyumlu kipte balatlr.
+.SH DOSYALAR
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.dil]
+.B Vimtutor
+metin dosyalar.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+.B Vimtutor
+metin dosyasn kopyalamak iin kullanlan betik.
+.SH YAZAR
+.B Vimtutor
+ilk olarak Vi iin Michael C. Pierce ve Robert K. Ware,
+Colorado School of Mines tarafndan, Colorado State University'den Charles
+Smith'in verdii fikirler kullanlarak yazld.
+E-posta: bware@mines.colorado.edu.
+.br
+.B Vim
+uyarlamas Bram Moolenaar tarafndan yapld.
+evirmenlerin adlar iin eitmen dosyalarna bakn.
+.SH AYRICA BAKINIz
+vim(1)
diff --git a/runtime/doc/vimtutor-tr.UTF-8.1 b/runtime/doc/vimtutor-tr.UTF-8.1
new file mode 100644
index 0000000..de906f2
--- /dev/null
+++ b/runtime/doc/vimtutor-tr.UTF-8.1
@@ -0,0 +1,50 @@
+.TH VIMTUTOR 1 "2 Nisan 2001"
+.SH AD
+vimtutor \- Vim eğitmeni
+.SH ÖZET
+.br
+.B vimtutor [\-g] [dil]
+.SH TANIM
+.B Vimtutor,
+.B Vim
+eğitmenini başlatır.
+Önce orijinal eğitmen dosyasının bir kopyasını alır, böylece bir değişikliğe
+uğramadan değiştirilebilir.
+.PP
+.B Vimtutor
+ilk
+.B Vim
+komutlarını öğrenmek isteyen kişiler için yararlıdır.
+.PP
+İsteğe bağlı \-g değişkeni vimtutor'u vim yerine eğer yüklü ise gvim ile
+başlatır. Yüklü değilse açmak için Vim kullanılır.
+.PP
+İsteğe bağlı [dil] değişkeni iki harfli dil kodunu belirtir, örneğin "tr"
+veya "es". Eğer [dil] değişkeni verilmemişse mevcut yerelleştirme
+kullanılır.
+Eğer bu dilde bir eğitmen varsa kullanılır.
+Yoksa İngilizce sürüm kullanılacaktır.
+.PP
+.B Vim
+her zaman Vi uyumlu kipte başlatılır.
+.SH DOSYALAR
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.dil]
+.B Vimtutor
+metin dosyaları.
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+.B Vimtutor
+metin dosyasını kopyalamak için kullanılan betik.
+.SH YAZAR
+.B Vimtutor
+ilk olarak Vi için Michael C. Pierce ve Robert K. Ware,
+Colorado School of Mines tarafından, Colorado State University'den Charles
+Smith'in verdiği fikirler kullanılarak yazıldı.
+E-posta: bware@mines.colorado.edu.
+.br
+.B Vim
+uyarlaması Bram Moolenaar tarafından yapıldı.
+Çevirmenlerin adları için eğitmen dosyalarına bakın.
+.SH AYRICA BAKINIz
+vim(1)
diff --git a/runtime/doc/vimtutor.1 b/runtime/doc/vimtutor.1
new file mode 100644
index 0000000..0aa7e8d
--- /dev/null
+++ b/runtime/doc/vimtutor.1
@@ -0,0 +1,57 @@
+.TH VIMTUTOR 1 "2001 April 2"
+.SH NAME
+vimtutor \- the Vim tutor
+.SH SYNOPSIS
+.br
+.B vimtutor [\-g] [language]
+.SH DESCRIPTION
+.B Vimtutor
+starts the
+.B Vim
+tutor.
+It copies the tutor file first, so that it can be modified without changing
+the original file.
+.PP
+The
+.B Vimtutor
+is useful for people that want to learn their first
+.B Vim
+commands.
+.PP
+The optional argument \-g starts vimtutor with gvim rather than vim, if the
+GUI version of vim is available, or falls back to Vim if gvim is not found.
+.PP
+The optional [language] argument is the two-letter name of a language, like
+"it" or "es".
+If the [language] argument is missing, the language of the current locale will
+be used.
+If a tutor in this language is available, it will be used.
+Otherwise the English version will be used.
+.PP
+.B Vim
+is always started in Vi compatible mode.
+.SH FILES
+.TP 15
+/usr/local/lib/vim/tutor/tutor[.language]
+The
+.B Vimtutor
+text file(s).
+.TP 15
+/usr/local/lib/vim/tutor/tutor.vim
+The Vim script used to copy the
+.B Vimtutor
+text file.
+.SH AUTHOR
+The
+.B Vimtutor
+was originally written for Vi 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.
+.br
+It was modified for
+.B Vim
+by Bram Moolenaar.
+For the names of the translators see the tutor files.
+.SH SEE ALSO
+vim(1)
diff --git a/runtime/doc/vimtutor.man b/runtime/doc/vimtutor.man
new file mode 100644
index 0000000..9f2350a
--- /dev/null
+++ b/runtime/doc/vimtutor.man
@@ -0,0 +1,50 @@
+VIMTUTOR(1) VIMTUTOR(1)
+
+
+
+NAME
+ vimtutor - the Vim tutor
+
+SYNOPSIS
+ vimtutor [-g] [language]
+
+DESCRIPTION
+ Vimtutor starts the Vim tutor. It copies the tutor file first, so that
+ it can be modified without changing the original file.
+
+ The Vimtutor is useful for people that want to learn their first Vim
+ commands.
+
+ The optional argument -g starts vimtutor with gvim rather than vim, if
+ the GUI version of vim is available, or falls back to Vim if gvim is
+ not found.
+
+ The optional [language] argument is the two-letter name of a language,
+ like "it" or "es". If the [language] argument is missing, the language
+ of the current locale will be used. If a tutor in this language is
+ available, it will be used. Otherwise the English version will be
+ used.
+
+ Vim is always started in Vi compatible mode.
+
+FILES
+ /usr/local/lib/vim/tutor/tutor[.language]
+ The Vimtutor text file(s).
+
+ /usr/local/lib/vim/tutor/tutor.vim
+ The Vim script used to copy the Vimtutor text file.
+
+AUTHOR
+ The Vimtutor was originally written for Vi 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.col‐
+ orado.edu.
+ It was modified for Vim by Bram Moolenaar. For the names of the trans‐
+ lators see the tutor files.
+
+SEE ALSO
+ vim(1)
+
+
+
+ 2001 April 2 VIMTUTOR(1)
diff --git a/runtime/doc/visual.txt b/runtime/doc/visual.txt
new file mode 100644
index 0000000..540d5c5
--- /dev/null
+++ b/runtime/doc/visual.txt
@@ -0,0 +1,559 @@
+*visual.txt* For Vim version 9.0. Last change: 2022 Dec 04
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Visual mode *Visual* *Visual-mode* *visual-mode*
+
+Visual mode is a flexible and easy way to select a piece of text for an
+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|
+
+{Since Vim 7.4.200 the |+visual| feature is always included}
+
+==============================================================================
+1. Using Visual mode *visual-use*
+
+Using Visual mode consists of three parts:
+1. Mark the start of the text with "v", "V" or CTRL-V.
+ The character under the cursor will be used as the start.
+2. Move to the end of the text.
+ The text from the start of the Visual mode up to and including the
+ character under the cursor is highlighted.
+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 'virtualedit' option can be used to allow positioning the cursor to
+positions where there is no actual character.
+
+The highlighted text normally includes the character under the cursor.
+However, when the 'selection' option is set to "exclusive" and the cursor is
+after the Visual area, the character under the cursor is not included.
+
+With "v" the text before the start position and after the end position will
+not be highlighted. However, all uppercase and non-alpha operators, except
+"~" and "U", will work on whole lines anyway. See the list of operators
+below.
+
+ *visual-block*
+With CTRL-V (blockwise Visual mode) the highlighted text will be a rectangle
+between start position and the cursor. However, some operators work on whole
+lines anyway (see the list below). The change and substitute operators will
+delete the highlighted text and then start insertion at the top left
+position.
+
+==============================================================================
+2. Starting and stopping Visual mode *visual-start*
+
+ *v* *characterwise-visual*
+[count]v Start Visual mode per character.
+ With [count] select the same number of characters or
+ lines as used for the last Visual operation, but at
+ the current cursor position, multiplied by [count].
+ When the previous Visual operation was on a block both
+ the width and height of the block are multiplied by
+ [count].
+ When there was no previous Visual operation [count]
+ characters are selected. This is like moving the
+ cursor right N * [count] characters. One less when
+ 'selection' is not "exclusive".
+
+ *V* *linewise-visual*
+[count]V Start Visual mode linewise.
+ With [count] select the same number of lines as used
+ for the last Visual operation, but at the current
+ cursor position, multiplied by [count]. When there
+ was no previous Visual operation [count] lines are
+ 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.
+
+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
+and no text is affected. Also when you hit "v" in characterwise Visual mode,
+"CTRL-V" in blockwise Visual mode or "V" in linewise Visual mode. If you hit
+CTRL-Z the highlighting stops and the editor is suspended or a new shell is
+started |CTRL-Z|.
+
+ new mode after typing: *v_v* *v_CTRL-V* *v_V*
+old mode "v" "CTRL-V" "V" ~
+
+Normal Visual blockwise Visual linewise Visual
+Visual Normal blockwise Visual linewise Visual
+blockwise Visual Visual Normal linewise Visual
+linewise Visual Visual blockwise Visual Normal
+
+ *gv* *v_gv* *reselect-Visual*
+gv Start Visual mode with the same area as the previous
+ area and the same mode.
+ In Visual mode the current and the previous Visual
+ area are exchanged.
+ After using "p" or "P" in Visual mode the text that
+ was put will be selected.
+
+ *gn* *v_gn*
+gn Search forward for the last used search pattern, like
+ with `n`, and start Visual mode to select the match.
+ If the cursor is on the match, visually selects it.
+ If an operator is pending, operates on the match.
+ E.g., "dgn" deletes the text of the next match.
+ If Visual mode is active, extends the selection
+ until the end of the next match.
+ 'wrapscan' applies.
+ Note: Unlike `n` the search direction does not depend
+ on the previous search command.
+
+ *gN* *v_gN*
+gN Like |gn| but searches backward, like with `N`.
+
+ *<LeftMouse>*
+<LeftMouse> Set the current cursor position. If Visual mode is
+ active it is stopped. Only when 'mouse' option
+ contains 'n' or 'a'. If the position is within 'so'
+ lines from the last line on the screen the text is
+ scrolled up. If the position is within 'so' lines from
+ the first line on the screen the text is scrolled
+ down.
+
+ *<RightMouse>*
+<RightMouse> Start Visual mode if it is not active. The text from
+ the cursor position to the position of the click is
+ highlighted. If Visual mode was already active move
+ the start or end of the highlighted text, whichever
+ is closest, to the position of the click. Only when
+ 'mouse' option contains 'n' or 'a'.
+
+ Note: when 'mousemodel' is set to "popup",
+ <S-LeftMouse> has to be used instead of <RightMouse>.
+
+ *<LeftRelease>*
+<LeftRelease> This works like a <LeftMouse>, if it is not at
+ the same position as <LeftMouse>. In an older version
+ of xterm you won't see the selected area until the
+ button is released, unless there is access to the
+ display where the xterm is running (via the DISPLAY
+ environment variable or the -display argument). Only
+ when 'mouse' option contains 'n' or 'a'.
+
+<LeftMouseNM> Internal mouse code, used for clicking on the status
+<LeftReleaseNM> line to focus a window. NM stands for non-mappable.
+ You cannot use these, but they might show up in some
+ places.
+
+If Visual mode is not active and the "v", "V" or CTRL-V is preceded with a
+count, the size of the previously highlighted area is used for a start. You
+can then move the end of the highlighted area and give an operator. The type
+of the old area is used (character, line or blockwise).
+- Linewise Visual mode: The number of lines is multiplied with the count.
+- Blockwise Visual mode: The number of lines and columns is multiplied with
+ the count.
+- Normal Visual mode within one line: The number of characters is multiplied
+ with the count.
+- Normal Visual mode with several lines: The number of lines is multiplied
+ with the count, in the last line the same number of characters is used as
+ in the last line in the previously highlighted area.
+The start of the text is the Cursor position. If the "$" command was used as
+one of the last commands to extend the highlighted text, the area will be
+extended to the rightmost column of the longest line.
+
+If you want to highlight exactly the same area as the last time, you can use
+"gv" |gv| |v_gv|.
+
+ *v_<Esc>*
+<Esc> In Visual mode: Stop Visual mode.
+
+ *v_CTRL-C*
+CTRL-C In Visual mode: Stop Visual mode. When insert mode is
+ pending (the mode message shows
+ "-- (insert) VISUAL --"), it is also stopped.
+
+==============================================================================
+3. Changing the Visual area *visual-change*
+
+ *v_o*
+o Go to Other end of highlighted text: The current
+ cursor position becomes the start of the highlighted
+ text and the cursor is moved to the other end of the
+ highlighted text. The highlighted area remains the
+ same.
+
+ *v_O*
+O Go to Other end of highlighted text. This is like
+ "o", but in Visual block mode the cursor moves to the
+ other corner in the same line. When the corner is at
+ a character that occupies more than one position on
+ the screen (e.g., a <Tab>), the highlighted text may
+ change.
+
+ *v_$*
+When the "$" command is used with blockwise Visual mode, the right end of the
+highlighted text will be determined by the longest highlighted line. This
+stops when a motion command is used that does not move straight up or down.
+
+For moving the end of the block many commands can be used, but you cannot
+use Ex commands, commands that make changes or abandon the file. Commands
+(starting with) ".", "&", CTRL-^, "Z", CTRL-], CTRL-T, CTRL-R, CTRL-I
+and CTRL-O cause a beep and Visual mode continues.
+
+When switching to another window on the same buffer, the cursor position in
+that window is adjusted, so that the same Visual area is still selected. This
+is especially useful to view the start of the Visual area in one window, and
+the end in another. You can then use <RightMouse> (or <S-LeftMouse> when
+'mousemodel' is "popup") to drag either end of the Visual area.
+
+==============================================================================
+4. Operating on the Visual area *visual-operators*
+
+The operators that can be used are:
+ ~ switch case |v_~|
+ d delete |v_d|
+ c change (4) |v_c|
+ y yank |v_y|
+ > shift right (4) |v_>|
+ < shift left (4) |v_<|
+ ! filter through external command (1) |v_!|
+ = filter through 'equalprg' option command (1) |v_=|
+ gq format lines to 'textwidth' length (1) |v_gq|
+
+The objects that can be used are:
+ aw a word (with white space) |v_aw|
+ iw inner word |v_iw|
+ aW a WORD (with white space) |v_aW|
+ iW inner WORD |v_iW|
+ as a sentence (with white space) |v_as|
+ is inner sentence |v_is|
+ ap a paragraph (with white space) |v_ap|
+ ip inner paragraph |v_ip|
+ ab a () block (with parentheses) |v_ab|
+ ib inner () block |v_ib|
+ aB a {} block (with braces) |v_aB|
+ iB inner {} block |v_iB|
+ at a <tag> </tag> block (with tags) |v_at|
+ it inner <tag> </tag> block |v_it|
+ a< a <> block (with <>) |v_a<|
+ i< inner <> block |v_i<|
+ a[ a [] block (with []) |v_a[|
+ i[ inner [] block |v_i[|
+ a" a double quoted string (with quotes) |v_aquote|
+ i" inner double quoted string |v_iquote|
+ a' a single quoted string (with quotes) |v_a'|
+ i' inner simple quoted string |v_i'|
+ a` a string in backticks (with backticks) |v_a`|
+ i` inner string in backticks |v_i`|
+
+Additionally the following commands can be used:
+ : start Ex command for highlighted lines (1) |v_:|
+ r change (4) |v_r|
+ s change |v_s|
+ C change (2)(4) |v_C|
+ S change (2) |v_S|
+ R change (2) |v_R|
+ x delete |v_x|
+ D delete (3) |v_D|
+ X delete (2) |v_X|
+ Y yank (2) |v_Y|
+ p put |v_p|
+ P put without overwriting registers |v_P|
+ J join (1) |v_J|
+ U make uppercase |v_U|
+ u make lowercase |v_u|
+ ^] find tag |v_CTRL-]|
+ I block insert |v_b_I|
+ A block append |v_b_A|
+
+(1): Always whole lines, see |:visual_example|.
+(2): Whole lines when not using CTRL-V.
+(3): Whole lines when not using CTRL-V, delete until the end of the line when
+ using CTRL-V.
+(4): When using CTRL-V operates on the block only.
+
+Note that the ":vmap" command can be used to specifically map keys in Visual
+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'.)
+
+If you want to give a register name using the """ command, do this just before
+typing the operator character: "v{move-around}"xd".
+
+If you want to give a count to the command, do this just before typing the
+operator character: "v{move-around}3>" (move lines 3 indents to the right).
+
+ *{move-around}*
+The {move-around} is any sequence of movement commands. Note the difference
+with {motion}, which is only ONE movement command.
+
+Another way to operate on the Visual area is using the |/\%V| item in a
+pattern. For example, to replace all '(' in the Visual area with '#': >
+
+ :'<,'>s/\%V(/#/g
+
+Note that the "'<,'>" will appear automatically when you press ":" in Visual
+mode.
+
+==============================================================================
+5. Blockwise operators *blockwise-operators*
+
+Reminder: Use 'virtualedit' to be able to select blocks that start or end
+after the end of a line or halfway a tab.
+
+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. 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
+block on every line of the block. There is some differing behavior where the
+block RHS is not straight, due to different line lengths:
+
+1. Block was created with <C-v>$
+ In this case the string is appended to the end of each line.
+2. Block was created with <C-v>{move-around}
+ In this case the string is appended to the end of the block on each line,
+ and whitespace is inserted to pad to the end-of-block column.
+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
+using "c" the selected text is deleted and Insert mode started. You can then
+enter text (without a line break). When you hit <Esc>, the same string is
+inserted in all previously selected lines.
+
+Visual-block Change *v_b_C*
+Like using "c", but the selection is extended until the end of the line for
+all lines.
+
+ *v_b_<*
+Visual-block Shift *v_b_>*
+The block is shifted by 'shiftwidth'. The RHS of the block is irrelevant. The
+LHS of the block determines the point from which to apply a right shift, and
+padding includes TABs optimally according to 'ts' and 'et'. The LHS of the
+block determines the point up to which to shift left.
+See |v_b_>_example|.
+See |v_b_<_example|.
+
+Visual-block Replace *v_b_r*
+Every screen char in the highlighted region is replaced with the same char, ie
+TABs are split and the virtual whitespace is replaced, maintaining screen
+layout.
+See |v_b_r_example|.
+
+
+==============================================================================
+6. Repeating *visual-repeat*
+
+When repeating a Visual mode operator, the operator will be applied to the
+same amount of text as the last time:
+- Linewise Visual mode: The same number of lines.
+- Blockwise Visual mode: The same number of lines and columns.
+- Normal Visual mode within one line: The same number of characters.
+- Normal Visual mode with several lines: The same number of lines, in the
+ last line the same number of characters as in the last line the last time.
+The start of the text is the Cursor position. If the "$" command was used as
+one of the last commands to extend the highlighted text, the repeating will
+be applied up to the rightmost column of the longest line. Any count passed
+to the `.` command is not used.
+
+
+==============================================================================
+7. Examples *visual-examples*
+
+ *:visual_example*
+Currently the ":" command works on whole lines only. When you select part of
+a line, doing something like ":!date" will replace the whole line. If you
+want only part of the line to be replaced you will have to make a mapping for
+it. In a future release ":" may work on partial lines.
+
+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')
+
+What this does is:
+<Esc> stop Visual mode
+`> go to the end of the Visual area
+a<CR><Esc> break the line after the Visual area
+`< jump to the start of the Visual area
+i<CR><Esc> break the line before the Visual area
+!!date<CR> filter the Visual text through date
+kJJ Join the lines back together
+
+ *visual-search*
+Here is an idea for a mapping that makes it possible to do a search for the
+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')
+
+Note that special characters (like '.' and '*') will cause problems.
+
+Visual-block Examples *blockwise-examples*
+With the following text, I will indicate the commands to produce the block and
+the results below. In all cases, the cursor begins on the 'a' in the first
+line of the test text.
+The following modeline settings are assumed ":ts=8:sw=4:".
+
+It will be helpful to
+:set hls
+/<TAB>
+where <TAB> is a real TAB. This helps visualise the operations.
+
+The test text is:
+
+abcdefghijklmnopqrstuvwxyz
+abc defghijklmnopqrstuvwxyz
+abcdef ghi jklmnopqrstuvwxyz
+abcdefghijklmnopqrstuvwxyz
+
+1. fo<C-v>3jISTRING<ESC> *v_b_I_example*
+
+abcdefghijklmnSTRINGopqrstuvwxyz
+abc STRING defghijklmnopqrstuvwxyz
+abcdef ghi STRING jklmnopqrstuvwxyz
+abcdefghijklmnSTRINGopqrstuvwxyz
+
+2. fo<C-v>3j$ASTRING<ESC> *v_b_A_example*
+
+abcdefghijklmnopqrstuvwxyzSTRING
+abc defghijklmnopqrstuvwxyzSTRING
+abcdef ghi jklmnopqrstuvwxyzSTRING
+abcdefghijklmnopqrstuvwxyzSTRING
+
+3. fo<C-v>3j3l<.. *v_b_<_example*
+
+abcdefghijklmnopqrstuvwxyz
+abc defghijklmnopqrstuvwxyz
+abcdef ghi jklmnopqrstuvwxyz
+abcdefghijklmnopqrstuvwxyz
+
+4. fo<C-v>3j>.. *v_b_>_example*
+
+abcdefghijklmn opqrstuvwxyz
+abc defghijklmnopqrstuvwxyz
+abcdef ghi jklmnopqrstuvwxyz
+abcdefghijklmn opqrstuvwxyz
+
+5. fo<C-v>5l3jrX *v_b_r_example*
+
+abcdefghijklmnXXXXXXuvwxyz
+abc XXXXXXhijklmnopqrstuvwxyz
+abcdef ghi XXXXXX jklmnopqrstuvwxyz
+abcdefghijklmnXXXXXXuvwxyz
+
+==============================================================================
+8. Select mode *Select* *Select-mode*
+
+Select mode looks like Visual mode, but the commands accepted are quite
+different. This resembles the selection mode in Microsoft Windows.
+When the 'showmode' option is set, "-- SELECT --" is shown in the last line.
+
+Entering Select mode:
+- Using the mouse to select an area, and 'selectmode' contains "mouse".
+ 'mouse' must also contain a flag for the current mode.
+- Using a non-printable movement command, with the Shift key pressed, and
+ 'selectmode' contains "key". For example: <S-Left> and <S-End>. 'keymodel'
+ must also contain "startsel".
+- Using "v", "V" or CTRL-V command, and 'selectmode' contains "cmd".
+- Using "gh", "gH" or "g_CTRL-H" command in Normal mode.
+- From Visual mode, press CTRL-G. *v_CTRL-G*
+
+Commands in Select mode:
+- Printable characters, <NL> and <CR> cause the selection to be deleted, and
+ Vim enters Insert mode. The typed character is inserted.
+- Non-printable movement commands, with the Shift key pressed, extend the
+ selection. 'keymodel' must include "startsel".
+- Non-printable movement commands, with the Shift key NOT pressed, stop Select
+ mode. 'keymodel' must include "stopsel".
+- ESC stops Select mode.
+- CTRL-O switches to Visual mode for the duration of one command. *v_CTRL-O*
+- CTRL-G switches to Visual mode.
+- CTRL-R {register} selects the register to be used for the text that is
+ deleted when typing text. *v_CTRL-R*
+ Unless you specify the "_" (black hole) register, the unnamed register is
+ also overwritten.
+
+
+Otherwise, typed characters are handled as in Visual mode.
+
+When using an operator in Select mode, and the selection is linewise, the
+selected lines are operated upon, but like in characterwise selection. For
+example, when a whole line is deleted, it can later be pasted halfway a line.
+
+
+Mappings and menus in Select mode. *Select-mode-mapping*
+
+When mappings and menus are defined with the |:vmap| or |:vmenu| command they
+work both in Visual mode and in Select mode. When these are used in Select
+mode Vim automatically switches to Visual mode, so that the same behavior as
+in Visual mode is effective. If you don't want this use |:xmap| or |:smap|.
+
+One particular edge case: >
+ :vnoremap <C-K> <Esc>
+This ends Visual mode when in Visual mode, but in Select mode it does not
+work, because Select mode is restored after executing the mapped keys. You
+need to use: >
+ :snoremap <C-K> <Esc>
+<
+Users will expect printable characters to replace the selected area.
+Therefore avoid mapping printable characters in Select mode. Or use
+|:sunmap| after |:map| and |:vmap| to remove it for Select mode.
+
+After the mapping or menu finishes, the selection is enabled again and Select
+mode entered, unless the selected area was deleted, another buffer became
+the current one or the window layout was changed.
+
+When a character was typed that causes the selection to be deleted and Insert
+mode started, Insert mode mappings are applied to this character. This may
+cause some confusion, because it means Insert mode mappings apply to a
+character typed in Select mode. Language mappings apply as well.
+
+ *gV* *v_gV*
+gV Avoid the automatic reselection of the Visual area
+ after a Select mode mapping or menu has finished.
+ Put this just before the end of the mapping or menu.
+ At least it should be after any operations on the
+ selection.
+
+ *gh*
+gh Start Select mode, characterwise. This is like "v",
+ but starts Select mode instead of Visual mode.
+ Mnemonic: "get highlighted".
+
+ *gH*
+gH Start Select mode, linewise. This is like "V",
+ but starts Select mode instead of Visual mode.
+ Mnemonic: "get Highlighted".
+
+ *g_CTRL-H*
+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:noet:ft=help:norl:
diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt
new file mode 100644
index 0000000..924a932
--- /dev/null
+++ b/runtime/doc/windows.txt
@@ -0,0 +1,1440 @@
+*windows.txt* For Vim version 9.0. Last change: 2022 Nov 27
+
+
+ VIM REFERENCE MANUAL by Bram Moolenaar
+
+
+Editing with multiple windows and buffers. *windows* *buffers*
+
+The commands which have been added to use multiple windows and buffers are
+explained here. Additionally, there are explanations for commands that work
+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|
+
+{not able to use multiple windows when the |+windows| feature was disabled at
+compile time}
+
+==============================================================================
+1. Introduction *windows-intro* *window*
+
+Summary:
+ A buffer is the in-memory text of a file.
+ A window is a viewport on a buffer.
+ A tab page is a collection of windows.
+
+A window is a viewport onto a buffer. You can use multiple windows on one
+buffer, or several windows on different buffers.
+
+A buffer is a file loaded into memory for editing. The original file remains
+unchanged until you write the buffer to the file.
+
+A buffer can be in one of three states:
+
+ *active-buffer*
+active: The buffer is displayed in a window. If there is a file for this
+ buffer, it has been read into the buffer. The buffer may have been
+ modified since then and thus be different from the file.
+ *hidden-buffer*
+hidden: The buffer is not displayed. If there is a file for this buffer, it
+ has been read into the buffer. Otherwise it's the same as an active
+ buffer, you just can't see it.
+ *inactive-buffer*
+inactive: The buffer is not displayed and does not contain anything. Options
+ for the buffer are remembered if the file was once loaded. It can
+ contain marks from the |viminfo| file. But the buffer doesn't
+ contain text.
+
+In a table:
+
+state displayed loaded ":buffers" ~
+ in window shows ~
+active yes yes 'a'
+hidden no yes 'h'
+inactive no no ' '
+
+Note: All CTRL-W commands can also be executed with |:wincmd|, for those
+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()|.
+The window number is only valid in one specific tab. The window ID is valid
+across tabs. For most functions that take a window ID or a window number, the
+window number only applies to the current tab, while the window ID can refer
+to a window in any tab.
+
+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*
+
+By default, Vim starts with one window, just like Vi.
+
+The "-o" and "-O" arguments to Vim can be used to open a window for each file
+in the argument list. The "-o" argument will split the windows horizontally;
+the "-O" argument will split the windows vertically. If both "-o" and "-O"
+are given, the last one encountered will be used to determine the split
+orientation. For example, this will open three windows, split horizontally: >
+ vim -o file1 file2 file3
+
+"-oN", where N is a decimal number, opens N windows split horizontally. If
+there are more file names than windows, only N windows are opened and some
+files do not get a window. If there are more windows than file names, the
+last few windows will be editing empty buffers. Similarly, "-ON" opens N
+windows split vertically, with the same restrictions.
+
+If there are many file names, the windows will become very small. You might
+want to set the 'winheight' and/or 'winwidth' options to create a workable
+situation.
+
+Buf/Win Enter/Leave |autocommand|s are not executed when opening the new
+windows and reading the files, that's only done when they are really entered.
+
+ *status-line*
+A status line will be used to separate windows. The 'laststatus' option tells
+when the last window also has a status line:
+ 'laststatus' = 0 never a status line
+ 'laststatus' = 1 status line if there is more than one window
+ 'laststatus' = 2 always a status line
+
+You can change the contents of the status line with the 'statusline' option.
+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.
+
+ *filler-lines*
+The lines after the last buffer line in a window are called filler lines. By
+default, these lines start with a tilde (~) character. The 'eob' item in the
+'fillchars' option can be used to change this character. By default, these
+characters are highlighted as NonText (|hl-NonText|). The EndOfBuffer
+highlight group (|hl-EndOfBuffer|) can be used to change the highlighting of
+the filler characters.
+
+==============================================================================
+3. Opening and closing a window *opening-window*
+
+CTRL-W s *CTRL-W_s*
+CTRL-W S *CTRL-W_S*
+CTRL-W CTRL-S *CTRL-W_CTRL-S*
+:[N]sp[lit] [++opt] [+cmd] [file] *:sp* *:split*
+ Split current window in two. The result is two viewports on
+ the same file.
+
+ Make the new window N high (default is to use half the height
+ of the current window). Reduces the current window height to
+ create room (and others, if the 'equalalways' option is set,
+ 'eadirection' isn't "hor", and one of them is higher than the
+ current or the new window).
+
+ If [file] is given it will be edited in the new window. If it
+ is not loaded in any buffer, it will be read. Else the new
+ window will use the already loaded buffer.
+
+ Note: CTRL-S does not work on all terminals and might block
+ further input, use CTRL-Q to get going again.
+ Also see |++opt| and |+cmd|.
+ *E242* *E1159*
+ Be careful when splitting a window in an autocommand, it may
+ mess up the window layout if this happens while making other
+ window layout changes.
+
+CTRL-W CTRL-V *CTRL-W_CTRL-V*
+CTRL-W v *CTRL-W_v*
+:[N]vs[plit] [++opt] [+cmd] [file] *:vs* *:vsplit*
+ Like |:split|, but split vertically. The windows will be
+ spread out horizontally if
+ 1. a width was not specified,
+ 2. 'equalalways' is set,
+ 3. 'eadirection' isn't "ver", and
+ 4. one of the other windows is wider than the current or new
+ window.
+ If N was given make the new window N columns wide, if
+ possible.
+ Note: In other places CTRL-Q does the same as CTRL-V, but here
+ it doesn't!
+
+CTRL-W n *CTRL-W_n*
+CTRL-W CTRL_N *CTRL-W_CTRL-N*
+:[N]new [++opt] [+cmd] *:new*
+ Create a new window and start editing an empty file in it.
+ Make new window N high (default is to use half the existing
+ height). Reduces the current window height to create room (and
+ others, if the 'equalalways' option is set and 'eadirection'
+ isn't "hor").
+ Also see |++opt| and |+cmd|.
+ If 'fileformats' is not empty, the first format given will be
+ used for the new buffer. If 'fileformats' is empty, the
+ 'fileformat' of the current buffer is used. This can be
+ overridden with the |++opt| argument.
+ Autocommands are executed in this order:
+ 1. WinLeave for the current window
+ 2. WinEnter for the new window
+ 3. BufLeave for the current buffer
+ 4. BufEnter for the new buffer
+ This behaves like a ":split" first, and then an ":enew"
+ command.
+
+:[N]new [++opt] [+cmd] {file}
+:[N]sp[lit] [++opt] [+cmd] {file} *:split_f*
+ Create a new window and start editing file {file} in it. This
+ behaves almost like a ":split" first, and then an ":edit"
+ command, but the alternate file name in the original window is
+ set to {file}.
+ If [+cmd] is given, execute the command when the file has been
+ loaded |+cmd|.
+ Also see |++opt|.
+ Make new window N high (default is to use half the existing
+ height). Reduces the current window height to create room
+ (and others, if the 'equalalways' option is set).
+
+:[N]vne[w] [++opt] [+cmd] [file] *:vne* *:vnew*
+ Like |:new|, but split vertically. If 'equalalways' is set
+ and 'eadirection' isn't "ver" the windows will be spread out
+ horizontally, unless a width was specified.
+
+:[N]sv[iew] [++opt] [+cmd] [file] *:sv* *:sview* *splitview*
+ Same as ":split", but set 'readonly' option for this buffer.
+
+:[N]sf[ind] [++opt] [+cmd] {file} *:sf* *:sfi* *:sfind* *splitfind*
+ Same as ":split", but search for {file} in 'path' like in
+ |:find|. Doesn't split if {file} is not found.
+
+CTRL-W CTRL-^ *CTRL-W_CTRL-^* *CTRL-W_^*
+CTRL-W ^ Split the current window in two and edit the alternate file.
+ When a count N is given, split the current window and edit
+ buffer N. Similar to ":sp #" and ":sp #N", but it allows the
+ other buffer to be unnamed. This command matches the behavior
+ of |CTRL-^|, except that it splits a window first.
+
+ *CTRL-W_:*
+CTRL-W : Does the same as typing |:| - enter a command line. Useful in a
+ terminal window, where all Vim commands must be preceded with
+ CTRL-W or 'termwinkey'.
+
+Note that the 'splitbelow' and 'splitright' options influence where a new
+window will appear.
+ *E36*
+Creating a window will fail if there is not enough room. Every window needs
+at least one screen line and column, sometimes more. Options 'winminheight'
+and 'winminwidth' are relevant.
+
+ *:vert* *:vertical*
+:vert[ical] {cmd}
+ Execute {cmd}. If it contains a command that splits a window,
+ it will be split vertically. For `vertical wincmd =` windows
+ will be equalized only vertically.
+ Doesn't work for |:execute| and |:normal|.
+
+ *:hor* *:horizontal*
+:hor[izontal] {cmd}
+ Execute {cmd}. Currently only makes a difference for
+ `horizontal wincmd =`, which will equalize windows only
+ horizontally.
+
+:lefta[bove] {cmd} *:lefta* *:leftabove*
+:abo[veleft] {cmd} *:abo* *:aboveleft*
+ Execute {cmd}. If it contains a command that splits a window,
+ it will be opened left (vertical split) or above (horizontal
+ split) the current window. Overrules 'splitbelow' and
+ 'splitright'.
+ Doesn't work for |:execute| and |:normal|.
+
+:rightb[elow] {cmd} *:rightb* *:rightbelow*
+:bel[owright] {cmd} *:bel* *:belowright*
+ Execute {cmd}. If it contains a command that splits a window,
+ it will be opened right (vertical split) or below (horizontal
+ split) the current window. Overrules 'splitbelow' and
+ 'splitright'.
+ Doesn't work for |:execute| and |:normal|.
+
+ *:topleft* *E442*
+:to[pleft] {cmd}
+ Execute {cmd}. If it contains a command that splits a window,
+ it will appear at the top and occupy the full width of the Vim
+ window. When the split is vertical the window appears at the
+ far left and occupies the full height of the Vim window.
+ Doesn't work for |:execute| and |:normal|.
+
+ *: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
+ Vim window. When the split is vertical the window appears at
+ the far right and occupies the full height of the Vim window.
+ Doesn't work for |:execute| and |:normal|.
+
+These command modifiers can be combined to make a vertically split window
+occupy the full height. Example: >
+ :vertical topleft split tags
+Opens a vertically split, full-height window on the "tags" file at the far
+left of the Vim window.
+
+
+Closing a window
+----------------
+
+:q[uit]
+:{count}q[uit] *:count_quit*
+CTRL-W q *CTRL-W_q*
+CTRL-W CTRL-Q *CTRL-W_CTRL-Q*
+ Without {count}: Quit the current window. If {count} is
+ given quit the {count} window.
+ *edit-window*
+ When quitting the last edit window (not counting help or
+ preview windows), exit Vim.
+
+ When 'hidden' is set, and there is only one window for the
+ current buffer, it becomes hidden. When 'hidden' is not set,
+ and there is only one window for the current buffer, and the
+ buffer was changed, the command fails.
+
+ (Note: CTRL-Q does not work on all terminals).
+
+ If [count] is greater than the last window number the last
+ window will be closed: >
+ :1quit " quit the first window
+ :$quit " quit the last window
+ :9quit " quit the last window
+ " if there are fewer than 9 windows opened
+ :-quit " quit the previous window
+ :+quit " quit the next window
+ :+2quit " quit the second next window
+<
+ When closing a help window, and this is not the only window,
+ Vim will try to restore the previous window layout, see
+ |:helpclose|.
+
+:q[uit]!
+:{count}q[uit]!
+ Without {count}: Quit the current window. If {count} is
+ given quit the {count} window.
+
+ If this was the last window for a buffer, any changes to that
+ buffer are lost. When quitting the last window (not counting
+ help windows), exit Vim. The contents of the buffer are lost,
+ even when 'hidden' is set.
+
+:clo[se][!]
+:{count}clo[se][!]
+CTRL-W c *CTRL-W_c* *:clo* *:close*
+ Without {count}: Close the current window. If {count} is
+ given close the {count} window.
+
+ When the 'hidden' option is set, or when the buffer was
+ changed and the [!] is used, the buffer becomes hidden (unless
+ there is another window editing it).
+
+ When there is only one |edit-window| in the current tab page
+ and there is another tab page, this closes the current tab
+ page. |tab-page|.
+
+ This command fails when: *E444*
+ - There is only one window on the screen.
+ - When 'hidden' is not set, [!] is not used, the buffer has
+ changes, and there is no other window on this buffer.
+ Changes to the buffer are not written and won't get lost, so
+ this is a "safe" command.
+
+CTRL-W CTRL-C *CTRL-W_CTRL-C*
+ You might have expected that CTRL-W CTRL-C closes the current
+ window, but that does not work, because the CTRL-C cancels the
+ command.
+
+ *:hide*
+:hid[e]
+:{count}hid[e]
+ 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").
+ If the window is the last one in the current tab page the tab
+ page is closed. |tab-page|
+
+ The value of 'hidden' is irrelevant for this command. Changes
+ to the buffer are not written and won't get lost, so this is a
+ "safe" command.
+
+:hid[e] {cmd} Execute {cmd} with 'hidden' is set. The previous value of
+ 'hidden' is restored after {cmd} has been executed.
+ Example: >
+ :hide edit Makefile
+< This will edit "Makefile", and hide the current buffer if it
+ has any changes.
+
+:on[ly][!]
+:{count}on[ly][!]
+CTRL-W o *CTRL-W_o* *E445*
+CTRL-W CTRL-O *CTRL-W_CTRL-O* *:on* *:only*
+ Make the current window the only one on the screen. All other
+ windows are closed. For {count} see the `:quit` command
+ above |:count_quit|.
+
+ When the 'hidden' option is set, all buffers in closed windows
+ become hidden.
+
+ When 'hidden' is not set, and the 'autowrite' option is set,
+ modified buffers are written. Otherwise, windows that have
+ buffers that are modified are not removed, unless the [!] is
+ given, then they become hidden. But modified buffers are
+ never abandoned, so changes cannot get lost.
+
+==============================================================================
+4. Moving cursor to other windows *window-move-cursor*
+
+CTRL-W <Down> *CTRL-W_<Down>*
+CTRL-W CTRL-J *CTRL-W_CTRL-J* *CTRL-W_j*
+CTRL-W j Move cursor to Nth window below current one. Uses the cursor
+ position to select between alternatives.
+
+CTRL-W <Up> *CTRL-W_<Up>*
+CTRL-W CTRL-K *CTRL-W_CTRL-K* *CTRL-W_k*
+CTRL-W k Move cursor to Nth window above current one. Uses the cursor
+ position to select between alternatives.
+
+CTRL-W <Left> *CTRL-W_<Left>*
+CTRL-W CTRL-H *CTRL-W_CTRL-H*
+CTRL-W <BS> *CTRL-W_<BS>* *CTRL-W_h*
+CTRL-W h Move cursor to Nth window left of current one. Uses the
+ cursor position to select between alternatives.
+
+CTRL-W <Right> *CTRL-W_<Right>*
+CTRL-W CTRL-L *CTRL-W_CTRL-L* *CTRL-W_l*
+CTRL-W l Move cursor to Nth window right of current one. Uses the
+ cursor position to select between alternatives.
+
+CTRL-W w *CTRL-W_w* *CTRL-W_CTRL-W*
+CTRL-W CTRL-W Without count: move cursor to window below/right of the
+ current one. If there is no window below or right, go to
+ top-left window.
+ With count: go to Nth window (windows are numbered from
+ top-left to bottom-right). To obtain the window number see
+ |bufwinnr()| and |winnr()|. When N is larger than the number
+ of windows go to the last window.
+
+ *CTRL-W_W*
+CTRL-W W Without count: move cursor to window above/left of current
+ one. If there is no window above or left, go to bottom-right
+ window. With count: go to Nth window, like with CTRL-W w.
+
+CTRL-W t *CTRL-W_t* *CTRL-W_CTRL-T*
+CTRL-W CTRL-T Move cursor to top-left window.
+
+CTRL-W b *CTRL-W_b* *CTRL-W_CTRL-B*
+CTRL-W CTRL-B Move cursor to bottom-right window.
+
+CTRL-W p *CTRL-W_p* *CTRL-W_CTRL-P*
+CTRL-W CTRL-P Go to previous (last accessed) window.
+
+ *CTRL-W_P* *E441*
+CTRL-W P Go to preview window. When there is no preview window this is
+ an error.
+ {not available when compiled without the |+quickfix| feature}
+
+If Visual mode is active and the new window is not for the same buffer, the
+Visual mode is ended. If the window is on the same buffer, the cursor
+position is set to keep the same Visual area selected.
+
+ *:winc* *:wincmd*
+These commands can also be executed with ":wincmd":
+
+:[count]winc[md] {arg}
+ Like executing CTRL-W [count] {arg}. Example: >
+ :wincmd j
+< Moves to the window below the current one.
+ This command is useful when a Normal mode cannot be used (for
+ the |CursorHold| autocommand event). Or when a Normal mode
+ command is inconvenient.
+ The count can also be a window number. Example: >
+ :exe nr .. "wincmd w"
+< This goes to window "nr".
+
+==============================================================================
+5. Moving windows around *window-moving*
+
+CTRL-W r *CTRL-W_r* *CTRL-W_CTRL-R* *E443*
+CTRL-W CTRL-R Rotate windows downwards/rightwards. The first window becomes
+ the second one, the second one becomes the third one, etc.
+ The last window becomes the first window. The cursor remains
+ in the same window.
+ This only works within the row or column of windows that the
+ current window is in.
+
+ *CTRL-W_R*
+CTRL-W R Rotate windows upwards/leftwards. The second window becomes
+ the first one, the third one becomes the second one, etc. The
+ first window becomes the last window. The cursor remains in
+ the same window.
+ This only works within the row or column of windows that the
+ current window is in.
+
+CTRL-W x *CTRL-W_x* *CTRL-W_CTRL-X*
+CTRL-W CTRL-X Without count: Exchange current window with next one. If there
+ is no next window, exchange with previous window.
+ With count: Exchange current window with Nth window (first
+ window is 1). The cursor is put in the other window.
+ When vertical and horizontal window splits are mixed, the
+ exchange is only done in the row or column of windows that the
+ current window is in.
+
+The following commands can be used to change the window layout. For example,
+when there are two vertically split windows, CTRL-W K will change that in
+horizontally split windows. CTRL-W H does it the other way around.
+
+ *CTRL-W_K*
+CTRL-W K Move the current window to be at the very top, using the full
+ width of the screen. This works like closing the current
+ window and then creating another one with ":topleft split",
+ except that the current window contents is used for the new
+ window.
+
+ *CTRL-W_J*
+CTRL-W J Move the current window to be at the very bottom, using the
+ full width of the screen. This works like closing the current
+ window and then creating another one with ":botright split",
+ except that the current window contents is used for the new
+ window.
+
+ *CTRL-W_H*
+CTRL-W H Move the current window to be at the far left, using the
+ full height of the screen. This works like closing the
+ current window and then creating another one with
+ `:vert topleft split`, except that the current window contents
+ is used for the new window.
+
+ *CTRL-W_L*
+CTRL-W L Move the current window to be at the far right, using the full
+ height of the screen. This works like closing the
+ current window and then creating another one with
+ `:vert botright split`, except that the current window
+ contents is used for the new window.
+
+ *CTRL-W_T*
+CTRL-W T Move the current window to a new tab page. This fails if
+ there is only one window in the current tab page.
+ When a count is specified the new tab page will be opened
+ before the tab page with this index. Otherwise it comes after
+ the current tab page.
+
+==============================================================================
+6. Window resizing *window-resize*
+
+ *CTRL-W_=*
+CTRL-W = Make all windows (almost) equally high and wide, but use
+ 'winheight' and 'winwidth' for the current window.
+ Windows with 'winfixheight' set keep their height and windows
+ with 'winfixwidth' set keep their width.
+ To equalize only vertically (make window equally high) use
+ `vertical wincmd =`.
+ To equalize only horizontally (make window equally wide) use
+ `horizontal wincmd =`.
+
+:res[ize] -N *:res* *:resize* *CTRL-W_-*
+CTRL-W - Decrease current window height by N (default 1).
+ If used after |:vertical|: decrease width by N.
+
+:res[ize] +N *CTRL-W_+*
+CTRL-W + Increase current window height by N (default 1).
+ If used after |:vertical|: increase width by N.
+
+:res[ize] [N]
+CTRL-W CTRL-_ *CTRL-W_CTRL-_* *CTRL-W__*
+CTRL-W _ Set current window height to N (default: highest possible).
+
+:{winnr}res[ize] [+-]N
+ Like `:resize` above, but apply the size to window {winnr}
+ instead of the current window.
+
+z{nr}<CR> Set current window height to {nr}.
+
+ *CTRL-W_<*
+CTRL-W < Decrease current window width by N (default 1).
+
+ *CTRL-W_>*
+CTRL-W > Increase current window width by N (default 1).
+
+:vert[ical] res[ize] [N] *:vertical-resize* *CTRL-W_bar*
+CTRL-W | Set current window width to N (default: widest possible).
+
+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
+'mouse' option has been set to enable it.
+
+The option 'winheight' ('wh') is used to set the minimal window height of the
+current window. This option is used each time another window becomes the
+current window. If the option is '0', it is disabled. Set 'winheight' to a
+very large value, e.g., '9999', to make the current window always fill all
+available space. Set it to a reasonable value, e.g., '10', to make editing in
+the current window comfortable.
+
+The equivalent 'winwidth' ('wiw') option is used to set the minimal width of
+the current window.
+
+When the option 'equalalways' ('ea') is set, all the windows are automatically
+made the same size after splitting or closing a window. If you don't set this
+option, splitting a window will reduce the size of the current window and
+leave the other windows the same. When closing a window, the extra lines are
+given to the window above it.
+
+The 'eadirection' option limits the direction in which the 'equalalways'
+option is applied. The default "both" resizes in both directions. When the
+value is "ver" only the heights of windows are equalized. Use this when you
+have manually resized a vertically split window and want to keep this width.
+Likewise, "hor" causes only the widths of windows to be equalized.
+
+The option 'cmdheight' ('ch') is used to set the height of the command-line.
+If you are annoyed by the |hit-enter| prompt for long messages, set this
+option to 2 or 3.
+
+If there is only one window, resizing that window will also change the command
+line height. If there are several windows, resizing the current window will
+also change the height of the window below it (and sometimes the window above
+it).
+
+The minimal height and width of a window is set with 'winminheight' and
+'winminwidth'. These are hard values, a window will never become smaller.
+
+
+WinScrolled and WinResized autocommands ~
+ *win-scrolled-resized*
+If you want to get notified of changes in window sizes, the |WinResized|
+autocommand event can be used.
+If you want to get notified of text in windows scrolling vertically or
+horizontally, the |WinScrolled| autocommand event can be used. This will also
+trigger in window size changes.
+Exception: the events will not be triggered when the text scrolls for
+'incsearch'.
+ *WinResized-event*
+The |WinResized| event is triggered after updating the display, several
+windows may have changed size then. A list of the IDs of windows that changed
+since last time is provided in the v:event.windows variable, for example:
+ [1003, 1006]
+ *WinScrolled-event*
+The |WinScrolled| event is triggered after |WinResized|, and also if a window
+was scrolled. That can be vertically (the text at the top of the window
+changed) or horizontally (when 'wrap' is off or when the first displayed part
+of the first line changes). Note that |WinScrolled| will trigger many more
+times than |WinResized|, it may slow down editing a bit.
+
+The information provided by |WinScrolled| is a dictionary for each window that
+has changes, using the window ID as the key, and a total count of the changes
+with the key "all". Example value for |v:event| (|Vim9| syntax):
+ {
+ all: {width: 0, height: 2, leftcol: 0, skipcol: 0, topline: 1, topfill: 0},
+ 1003: {width: 0, height: -1, leftcol: 0, skipcol: 0, topline: 0, topfill: 0},
+ 1006: {width: 0, height: 1, leftcol: 0, skipcol: 0, topline: 1, topfill: 0},
+ }
+
+Note that the "all" entry has the absolute values of the individual windows
+accumulated.
+
+If you need more information about what changed, or you want to "debounce" the
+events (not handle every event to avoid doing too much work), you may want to
+use the `winlayout()` and `getwininfo()` functions.
+
+|WinScrolled| and |WinResized| do not trigger when the first autocommand is
+added, only after the first scroll or resize. They may trigger when switching
+to another tab page.
+
+The commands executed are expected to not cause window size or scroll changes.
+If this happens anyway, the event will trigger again very soon. In other
+words: Just before triggering the event, the current sizes and scroll
+positions are stored and used to decide whether there was a change.
+ *E1312*
+It is not allowed to change the window layout here (split, close or move
+windows).
+
+==============================================================================
+7. Argument and buffer list commands *buffer-list*
+
+ args list buffer list meaning ~
+1. :[N]argument [N] 11. :[N]buffer [N] to arg/buf N
+2. :[N]next [file ..] 12. :[N]bnext [N] to Nth next arg/buf
+3. :[N]Next [N] 13. :[N]bNext [N] to Nth previous arg/buf
+4. :[N]previous [N] 14. :[N]bprevious [N] to Nth previous arg/buf
+5. :rewind / :first 15. :brewind / :bfirst to first arg/buf
+6. :last 16. :blast to last arg/buf
+7. :all 17. :ball edit all args/buffers
+ 18. :unhide edit all loaded buffers
+ 19. :[N]bmod [N] to Nth modified buf
+
+ split & args list split & buffer list meaning ~
+21. :[N]sargument [N] 31. :[N]sbuffer [N] split + to arg/buf N
+22. :[N]snext [file ..] 32. :[N]sbnext [N] split + to Nth next arg/buf
+23. :[N]sNext [N] 33. :[N]sbNext [N] split + to Nth previous arg/buf
+24. :[N]sprevious [N] 34. :[N]sbprevious [N] split + to Nth previous arg/buf
+25. :srewind / :sfirst 35. :sbrewind / :sbfirst split + to first arg/buf
+26. :slast 36. :sblast split + to last arg/buf
+27. :sall 37. :sball edit all args/buffers
+ 38. :sunhide edit all loaded buffers
+ 39. :[N]sbmod [N] split + to Nth modified buf
+
+40. :args list of arguments
+41. :buffers list of buffers
+
+The meaning of [N] depends on the command:
+ [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
+
+Note: ":next" is an exception, because it must accept a list of file names
+for compatibility with Vi.
+
+
+The argument list and multiple windows
+--------------------------------------
+
+The current position in the argument list can be different for each window.
+Remember that when doing ":e file", the position in the argument list stays
+the same, but you are not editing the file at that position. To indicate
+this, the file message (and the title, if you have one) shows
+"(file (N) of M)", where "(N)" is the current position in the file list, and
+"M" the number of files in the file list.
+
+All the entries in the argument list are added to the buffer list. Thus, you
+can also get to them with the buffer list commands, like ":bnext".
+
+:[N]al[l][!] [N] *:al* *:all* *:sal* *:sall*
+:[N]sal[l][!] [N]
+ Rearrange the screen to open one window for each argument.
+ All other windows are closed. When a count is given, this is
+ the maximum number of windows to open.
+ With the |:tab| modifier open a tab page for each argument.
+ When there are more arguments than 'tabpagemax' further ones
+ become split windows in the last tab page.
+ When the 'hidden' option is set, all buffers in closed windows
+ become hidden.
+ When 'hidden' is not set, and the 'autowrite' option is set,
+ modified buffers are written. Otherwise, windows that have
+ buffers that are modified are not removed, unless the [!] is
+ given, then they become hidden. But modified buffers are
+ never abandoned, so changes cannot get lost.
+ [N] is the maximum number of windows to open. 'winheight'
+ also limits the number of windows opened ('winwidth' if
+ |:vertical| was prepended).
+ Buf/Win Enter/Leave autocommands are not executed for the new
+ windows here, that's only done when they are really entered.
+ If autocommands change the window layout while this command is
+ busy an error will be given. *E249*
+
+:[N]sa[rgument][!] [++opt] [+cmd] [N] *:sa* *:sargument*
+ Short for ":split | argument [N]": split window and go to Nth
+ argument. But when there is no such argument, the window is
+ not split. Also see |++opt| and |+cmd|.
+
+:[N]sn[ext][!] [++opt] [+cmd] [file ..] *:sn* *:snext*
+ Short for ":split | [N]next": split window and go to Nth next
+ argument. But when there is no next file, the window is not
+ split. Also see |++opt| and |+cmd|.
+
+:[N]spr[evious][!] [++opt] [+cmd] [N] *:spr* *:sprevious*
+:[N]sN[ext][!] [++opt] [+cmd] [N] *:sN* *:sNext*
+ Short for ":split | [N]Next": split window and go to Nth
+ previous argument. But when there is no previous file, the
+ window is not split. Also see |++opt| and |+cmd|.
+
+ *:sre* *:srewind*
+:sre[wind][!] [++opt] [+cmd]
+ Short for ":split | rewind": split window and go to first
+ argument. But when there is no argument list, the window is
+ not split. Also see |++opt| and |+cmd|.
+
+ *:sfir* *:sfirst*
+:sfir[st] [++opt] [+cmd]
+ Same as ":srewind".
+
+ *:sla* *:slast*
+:sla[st][!] [++opt] [+cmd]
+ Short for ":split | last": split window and go to last
+ argument. But when there is no argument list, the window is
+ not split. Also see |++opt| and |+cmd|.
+
+ *:dr* *:drop*
+:dr[op] [++opt] [+cmd] {file} ..
+ Edit the first {file} in a window.
+ - If the file is already open in a window change to that
+ window.
+ - 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.
+ When using the |:tab| modifier each argument is opened in a
+ tab page. The last window is used if it's empty.
+ Also see |++opt| and |+cmd|.
+
+==============================================================================
+8. Do a command in all buffers or windows *list-repeat*
+
+ *:windo*
+:[range]windo {cmd} Execute {cmd} in each window or if [range] is given
+ only in windows for which the window number lies in
+ the [range]. It works like doing this: >
+ CTRL-W t
+ :{cmd}
+ CTRL-W w
+ :{cmd}
+ etc.
+< This only operates in the current tab page.
+ When an error is detected on one window, further
+ windows will not be visited.
+ The last window (or where an error occurred) becomes
+ the current window.
+ {cmd} can contain '|' to concatenate several commands.
+ {cmd} must not open or close windows or reorder them.
+
+ Also see |:tabdo|, |:argdo|, |:bufdo|, |:cdo|, |:ldo|,
+ |:cfdo| and |:lfdo|
+
+ *:bufdo*
+:[range]bufdo[!] {cmd} Execute {cmd} in each buffer in the buffer list or if
+ [range] is given only for buffers for which their
+ buffer number is in the [range]. It works like doing
+ this: >
+ :bfirst
+ :{cmd}
+ :bnext
+ :{cmd}
+ etc.
+< When the current file can't be |abandon|ed and the [!]
+ is not present, the command fails.
+ When an error is detected on one buffer, further
+ buffers will not be visited.
+ Unlisted buffers are skipped.
+ The last buffer (or where an error occurred) becomes
+ the current buffer.
+ {cmd} can contain '|' to concatenate several commands.
+ {cmd} must not delete buffers or add buffers to the
+ buffer list.
+ Note: While this command is executing, the Syntax
+ autocommand event is disabled by adding it to
+ 'eventignore'. This considerably speeds up editing
+ each buffer.
+
+ Also see |:tabdo|, |:argdo|, |:windo|, |:cdo|, |:ldo|,
+ |:cfdo| and |:lfdo|
+
+Examples: >
+
+ :windo set nolist foldcolumn=0 | normal! zn
+
+This resets the 'list' option and disables folding in all windows. >
+
+ :bufdo set fileencoding= | update
+
+This resets the 'fileencoding' in each buffer and writes it if this changed
+the buffer. The result is that all buffers will use the 'encoding' encoding
+(if conversion succeeds).
+
+==============================================================================
+9. Tag or file name under the cursor *window-tag*
+
+ *:sta* *:stag*
+:sta[g][!] [tagname]
+ Does ":tag[!] [tagname]" and splits the window for the found
+ tag. See also |:tag|.
+
+CTRL-W ] *CTRL-W_]* *CTRL-W_CTRL-]*
+CTRL-W CTRL-] Split current window in two. Use identifier under cursor as a
+ tag and jump to it in the new upper window.
+ In Visual mode uses the Visually selected text as a tag.
+ Make new window N high.
+
+ *CTRL-W_g]*
+CTRL-W g ] Split current window in two. Use identifier under cursor as a
+ tag and perform ":tselect" on it in the new upper window.
+ In Visual mode uses the Visually selected text as a tag.
+ Make new window N high.
+
+ *CTRL-W_g_CTRL-]*
+CTRL-W g CTRL-] Split current window in two. Use identifier under cursor as a
+ tag and perform ":tjump" on it in the new upper window.
+ In Visual mode uses the Visually selected text as a tag.
+ Make new window N high.
+
+CTRL-W f *CTRL-W_f* *CTRL-W_CTRL-F*
+CTRL-W CTRL-F Split current window in two. Edit file name under cursor.
+ Like ":split gf", but window isn't split if the file does not
+ exist.
+ Uses the 'path' variable as a list of directory names where to
+ look for the file. Also the path for current file is
+ used to search for the file name.
+ If the name is a hypertext link that looks like
+ "type://machine/path", only "/path" is used.
+ If a count is given, the count'th matching file is edited.
+
+CTRL-W F *CTRL-W_F*
+ Split current window in two. Edit file name under cursor and
+ jump to the line number following the file name. See |gF| for
+ details on how the line number is obtained.
+
+CTRL-W gf *CTRL-W_gf*
+ Open a new tab page and edit the file name under the cursor.
+ Like "tab split" and "gf", but the new tab page isn't created
+ if the file does not exist.
+
+CTRL-W gF *CTRL-W_gF*
+ Open a new tab page and edit the file name under the cursor
+ and jump to the line number following the file name. Like
+ "tab split" and "gF", but the new tab page isn't created if
+ the file does not exist.
+
+CTRL-W gt *CTRL-W_gt*
+ Go to next tab page, same as `gt`.
+
+CTRL-W gT *CTRL-W_gT*
+ Go to previous tab page, same as `gT`.
+
+Also see |CTRL-W_CTRL-I|: open window for an included file that includes
+the keyword under the cursor.
+
+==============================================================================
+10. The preview window *preview-window*
+
+The preview window is a special window to show (preview) another file. It is
+normally a small window used to show an include file or definition of a
+function.
+{not available when compiled without the |+quickfix| feature}
+
+There can be only one preview window (per tab page). It is created with one
+of the commands below. The 'previewheight' option can be set to specify the
+height of the preview window when it's opened. The 'previewwindow' option is
+set in the preview window to be able to recognize it. The 'winfixheight'
+option is set to have it keep the same height when opening/closing other
+windows.
+ *preview-popup*
+Alternatively, a popup window can be used by setting the 'previewpopup'
+option. When set, it overrules the 'previewwindow' and 'previewheight'
+settings. The option is a comma-separated list of values:
+ height maximum height of the popup
+ width maximum width of the popup
+ highlight highlight group of the popup (default is Pmenu)
+Example: >
+ :set previewpopup=height:10,width:60
+
+A few peculiarities:
+- If the file is in a buffer already, it will be re-used. This will allow for
+ editing the file while it's visible in the popup window.
+- No ATTENTION dialog will be used, since you can't edit the file in the popup
+ window. However, if you later open the same buffer in a normal window, you
+ may not notice it's edited elsewhere. And when then using ":edit" to
+ trigger the ATTENTION and responding "A" for Abort, the preview window will
+ become empty.
+
+ *:pta* *:ptag*
+:pta[g][!] [tagname]
+ Does ":tag[!] [tagname]" and shows the found tag in a
+ "Preview" window without changing the current buffer or cursor
+ position. If a "Preview" window already exists, it is re-used
+ (like a help window is). If a new one is opened,
+ 'previewheight' is used for the height of the window. See
+ also |:tag|.
+ See below for an example. |CursorHold-example|
+ Small difference from |:tag|: When [tagname] is equal to the
+ already displayed tag, the position in the matching tag list
+ is not reset. This makes the CursorHold example work after a
+ |:ptnext|.
+
+CTRL-W z *CTRL-W_z*
+CTRL-W CTRL-Z *CTRL-W_CTRL-Z* *:pc* *:pclose*
+:pc[lose][!] Close any "Preview" window currently open. When the 'hidden'
+ option is set, or when the buffer was changed and the [!] is
+ used, the buffer becomes hidden (unless there is another
+ window editing it). The command fails if any "Preview" buffer
+ cannot be closed. See also |:close|.
+
+ *:pp* *:ppop*
+:[count]pp[op][!]
+ Does ":[count]pop[!]" in the preview window. See |:pop| and
+ |:ptag|.
+
+CTRL-W } *CTRL-W_}*
+ Use identifier under cursor as a tag and perform a :ptag on
+ it. Make the new Preview window (if required) N high. If N is
+ not given, 'previewheight' is used.
+
+CTRL-W g } *CTRL-W_g}*
+ Use identifier under cursor as a tag and perform a :ptjump on
+ it. Make the new Preview window (if required) N high. If N is
+ not given, 'previewheight' is used.
+
+ *:ped* *:pedit*
+:ped[it][!] [++opt] [+cmd] {file}
+ Edit {file} in the preview window. The preview window is
+ opened like with |:ptag|. The current window and cursor
+ position isn't changed. Useful example: >
+ :pedit +/fputc /usr/include/stdio.h
+<
+ *:ps* *:psearch*
+:[range]ps[earch][!] [count] [/]pattern[/]
+ Works like |:ijump| but shows the found match in the preview
+ window. The preview window is opened like with |:ptag|. The
+ current window and cursor position isn't changed. Useful
+ example: >
+ :psearch popen
+< Like with the |:ptag| command, you can use this to
+ automatically show information about the word under the
+ cursor. This is less clever than using |:ptag|, but you don't
+ need a tags file and it will also find matches in system
+ include files. Example: >
+ :au! CursorHold *.[ch] ++nested exe "silent! psearch " .. expand("<cword>")
+< Warning: This can be slow.
+
+Example *CursorHold-example* >
+
+ :au! CursorHold *.[ch] ++nested exe "silent! ptag " .. expand("<cword>")
+
+This will cause a ":ptag" to be executed for the keyword under the cursor,
+when the cursor hasn't moved for the time set with 'updatetime'. The "nested"
+makes other autocommands be executed, so that syntax highlighting works in the
+preview window. The "silent!" avoids an error message when the tag could not
+be found. Also see |CursorHold|. To disable this again: >
+
+ :au! CursorHold
+
+A nice addition is to highlight the found tag, avoid the ":ptag" when there
+is no word under the cursor, and a few other things: >
+
+ :au! CursorHold *.[ch] ++nested call PreviewWord()
+ :func PreviewWord()
+ : if &previewwindow " don't do this in the preview window
+ : return
+ : endif
+ : let w = expand("<cword>") " get the word under cursor
+ : if w =~ '\a' " if the word contains a letter
+ :
+ : " Delete any existing highlight before showing another tag
+ : silent! wincmd P " jump to preview window
+ : if &previewwindow " if we really get there...
+ : match none " delete existing highlight
+ : wincmd p " back to old window
+ : endif
+ :
+ : " Try displaying a matching tag for the word under the cursor
+ : try
+ : exe "ptag " .. w
+ : catch
+ : return
+ : endtry
+ :
+ : silent! wincmd P " jump to preview window
+ : if &previewwindow " if we really get there...
+ : if has("folding")
+ : silent! .foldopen " don't want a closed fold
+ : endif
+ : call search("$", "b") " to end of previous line
+ : let w = substitute(w, '\\', '\\\\', "")
+ : call search('\<\V' .. w .. '\>') " position cursor on match
+ : " Add a match highlight to the word at this position
+ : hi previewWord term=bold ctermbg=green guibg=green
+ : exe 'match previewWord "\%' .. line(".") .. 'l\%' .. col(".") .. 'c\k*"'
+ : wincmd p " back to old window
+ : endif
+ : endif
+ :endfun
+
+==============================================================================
+11. Using hidden buffers *buffer-hidden*
+
+A hidden buffer is not displayed in a window, but is still loaded into memory.
+This makes it possible to jump from file to file, without the need to read or
+write the file every time you get another buffer in a window.
+
+ *:buffer-!*
+If the option 'hidden' ('hid') is set, abandoned buffers are kept for all
+commands that start editing another file: ":edit", ":next", ":tag", etc. The
+commands that move through the buffer list sometimes make the current buffer
+hidden although the 'hidden' option is not set. This happens when a buffer is
+modified, but is forced (with '!') to be removed from a window, and
+'autowrite' is off or the buffer can't be written.
+
+You can make a hidden buffer not hidden by starting to edit it with any
+command, or by deleting it with the ":bdelete" command.
+
+The 'hidden' is global, it is used for all buffers. The 'bufhidden' option
+can be used to make an exception for a specific buffer. It can take these
+values:
+ <empty> Use the value of 'hidden'.
+ hide Hide this buffer, also when 'hidden' is not set.
+ unload Don't hide but unload this buffer, also when 'hidden'
+ is set.
+ delete Delete the buffer.
+
+ *hidden-quit*
+When you try to quit Vim while there is a hidden, modified buffer, you will
+get an error message and Vim will make that buffer the current buffer. You
+can then decide to write this buffer (":wq") or quit without writing (":q!").
+Be careful: there may be more hidden, modified buffers!
+
+A buffer can also be unlisted. This means it exists, but it is not in the
+list of buffers. |unlisted-buffer|
+
+
+:files[!] [flags] *:files*
+:buffers[!] [flags] *:buffers* *:ls*
+:ls[!] [flags]
+ Show all buffers. Example:
+
+ 1 #h "/test/text" line 1 ~
+ 2u "asdf" line 0 ~
+ 3 %a + "version.c" line 1 ~
+
+ When the [!] is included the list will show unlisted buffers
+ (the term "unlisted" is a bit confusing then...).
+
+ Each buffer has a unique number. That number will not change,
+ thus you can always go to a specific buffer with ":buffer N"
+ or "N CTRL-^", where N is the buffer number.
+
+ For the file name these special values are used:
+ [Prompt] |prompt-buffer|
+ [Popup] buffer of a |popup-window|
+ [Scratch] 'buftype' is "nofile"
+ [No Name] no file name specified
+ For a |terminal-window| buffer the status is used.
+
+ Indicators (chars in the same column are mutually exclusive):
+ u an unlisted buffer (only displayed when [!] is used)
+ |unlisted-buffer|
+ % the buffer in the current window
+ # the alternate buffer for ":e #" and CTRL-^
+ a an active buffer: it is loaded and visible
+ h a hidden buffer: It is loaded, but currently not
+ 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
+
+ [flags] can be a combination of the following characters,
+ which restrict the buffers to be listed:
+ + modified buffers
+ - buffers with 'modifiable' off
+ = readonly buffers
+ a active buffers
+ u unlisted buffers (overrides the "!")
+ h hidden buffers
+ x buffers with a read error
+ % current buffer
+ # alternate buffer
+ R terminal buffers with a running job
+ F terminal buffers with a finished job
+ ? terminal buffers without a job: `:terminal NONE`
+ t show time last used and sort buffers
+ Combining flags means they are "and"ed together, e.g.:
+ 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,
+ if it wasn't listed yet. If the buffer was previously
+ deleted, not wiped, it will be made listed again.
+ If "lnum" is specified, the cursor will be positioned at that
+ line when the buffer is first entered. Note that other
+ commands after the + will be ignored.
+
+ *:balt*
+:balt [+lnum] {fname}
+ Like `:badd` and also set the alternate file for the current
+ window to {fname}.
+
+:[N]bd[elete][!] *:bd* *:bdel* *:bdelete* *E516*
+:bd[elete][!] [N]
+ Unload buffer [N] (default: current buffer) and delete it from
+ the buffer list. If the buffer was changed, this fails,
+ unless when [!] is specified, in which case changes are lost.
+ The file remains unaffected. Any windows for this buffer are
+ closed. If buffer [N] is the current buffer, another buffer
+ will be displayed instead. This is the most recent entry in
+ the jump list that points into a loaded buffer.
+ Actually, the buffer isn't completely deleted, it is removed
+ from the buffer list |unlisted-buffer| and option values,
+ variables and mappings/abbreviations for the buffer are
+ cleared. Examples: >
+ :.,$-bdelete " delete buffers from the current one to
+ " last but one
+ :%bdelete " delete all buffers
+<
+
+:bdelete[!] {bufname} *E93* *E94*
+ Like ":bdelete[!] [N]", but buffer given by name, see
+ |{bufname}|.
+
+:bdelete[!] N1 N2 ...
+ Do ":bdelete[!]" for buffer N1, N2, etc. The arguments can be
+ buffer numbers or buffer names (but not buffer names that are
+ a number). Insert a backslash before a space in a buffer
+ name.
+
+:N,Mbdelete[!] Do ":bdelete[!]" for all buffers in the range N to M
+ |inclusive|.
+
+:[N]bw[ipeout][!] *:bw* *:bwipe* *:bwipeout* *E517*
+:bw[ipeout][!] {bufname}
+:N,Mbw[ipeout][!]
+:bw[ipeout][!] N1 N2 ...
+ Like |:bdelete|, but really delete the buffer. Everything
+ related to the buffer is lost. All marks in this buffer
+ become invalid, option settings are lost, etc. Don't use this
+ unless you know what you are doing. Examples: >
+ :.+,$bwipeout " wipe out all buffers after the current
+ " one
+ :%bwipeout " wipe out all buffers
+<
+
+:[N]bun[load][!] *:bun* *:bunload* *E515*
+:bun[load][!] [N]
+ Unload buffer [N] (default: current buffer). The memory
+ allocated for this buffer will be freed. The buffer remains
+ in the buffer list.
+ If the buffer was changed, this fails, unless when [!] is
+ specified, in which case the changes are lost.
+ Any windows for this buffer are closed. If buffer [N] is the
+ current buffer, another buffer will be displayed instead.
+ This is the most recent entry in the jump list that points
+ into a loaded buffer.
+
+:bunload[!] {bufname}
+ 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|.
+
+:bunload[!] N1 N2 ...
+ Do ":bunload[!]" for buffer N1, N2, etc. The arguments can be
+ buffer numbers or buffer names (but not buffer names that are
+ a number). Insert a backslash before a space in a buffer
+ name.
+
+:[N]b[uffer][!] [+cmd] [N] *:b* *:bu* *:buf* *:buffer* *E86*
+ Edit buffer [N] from the buffer list. If [N] is not given,
+ the current buffer remains being edited. See |:buffer-!| for
+ [!]. This will also edit a buffer that is not in the buffer
+ list, without setting the 'buflisted' flag.
+ The notation with single quotes does not work here,
+ `:buf 12'345'` uses 12'345 as a buffer name.
+ Also see |+cmd|.
+
+:[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*
+ Split window and edit buffer [N] from the buffer list. If [N]
+ is not given, the current buffer is edited. Respects the
+ "useopen" setting of 'switchbuf' when splitting. 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] {bufname}
+ 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
+ under another name, you can do it this way: >
+ :w foobar | sp #
+< Also see |+cmd|.
+
+:[N]bn[ext][!] [+cmd] [N] *:bn* *:bnext* *E87*
+ Go to [N]th next buffer in buffer list. [N] defaults to one.
+ Wraps around the end of the buffer list.
+ See |:buffer-!| for [!].
+ Also see |+cmd|.
+ If you are in a help buffer, this takes you to the next help
+ buffer (if there is one). Similarly, if you are in a normal
+ (non-help) buffer, this takes you to the next normal buffer.
+ This is so that if you have invoked help, it doesn't get in
+ the way when you're browsing code/text buffers. The next three
+ commands also work like this.
+
+ *:sbn* *:sbnext*
+:[N]sbn[ext] [+cmd] [N]
+ Split window and go to [N]th next buffer in buffer list.
+ Wraps around the end of the buffer list. Uses 'switchbuf'
+ Also see |+cmd|.
+
+:[N]bN[ext][!] [+cmd] [N] *:bN* *:bNext* *:bp* *:bprevious* *E88*
+:[N]bp[revious][!] [+cmd] [N]
+ Go to [N]th previous buffer in buffer list. [N] defaults to
+ one. Wraps around the start of the buffer list.
+ See |:buffer-!| for [!] and 'switchbuf'.
+ Also see |+cmd|.
+
+:[N]sbN[ext] [+cmd] [N] *:sbN* *:sbNext* *:sbp* *:sbprevious*
+:[N]sbp[revious] [+cmd] [N]
+ Split window and go to [N]th previous buffer in buffer list.
+ Wraps around the start of the buffer list.
+ Uses 'switchbuf'.
+ Also see |+cmd|.
+
+:br[ewind][!] [+cmd] *:br* *:bre* *:brewind*
+ Go to first buffer in buffer list. If the buffer list is
+ empty, go to the first unlisted buffer.
+ See |:buffer-!| for [!].
+
+:bf[irst] [+cmd] *:bf* *:bfirst*
+ Same as |:brewind|.
+ Also see |+cmd|.
+
+:sbr[ewind] [+cmd] *:sbr* *:sbrewind*
+ Split window and go to first buffer in buffer list. If the
+ buffer list is empty, go to the first unlisted buffer.
+ Respects the 'switchbuf' option.
+ Also see |+cmd|.
+
+:sbf[irst] [+cmd] *:sbf* *:sbfirst*
+ Same as ":sbrewind".
+
+:bl[ast][!] [+cmd] *:bl* *:blast*
+ Go to last buffer in buffer list. If the buffer list is
+ empty, go to the last unlisted buffer.
+ See |:buffer-!| for [!].
+
+:sbl[ast] [+cmd] *:sbl* *:sblast*
+ Split window and go to last buffer in buffer list. If the
+ buffer list is empty, go to the last unlisted buffer.
+ Respects 'switchbuf' option.
+
+:[N]bm[odified][!] [+cmd] [N] *:bm* *:bmodified* *E84*
+ Go to [N]th next modified buffer. Note: this command also
+ finds unlisted buffers. If there is no modified buffer the
+ command fails.
+
+:[N]sbm[odified] [+cmd] [N] *:sbm* *:sbmodified*
+ Split window and go to [N]th next modified buffer.
+ Respects 'switchbuf' option.
+ Note: this command also finds buffers not in the buffer list.
+
+:[N]unh[ide] [N] *:unh* *:unhide* *:sun* *:sunhide*
+:[N]sun[hide] [N]
+ Rearrange the screen to open one window for each loaded buffer
+ in the buffer list. When a count is given, this is the
+ maximum number of windows to open.
+
+:[N]ba[ll] [N] *:ba* *:ball* *:sba* *:sball*
+:[N]sba[ll] [N] Rearrange the screen to open one window for each buffer in
+ the buffer list. When a count is given, this is the maximum
+ number of windows to open. 'winheight' also limits the number
+ of windows opened ('winwidth' if |:vertical| was prepended).
+ Buf/Win Enter/Leave autocommands are not executed for the new
+ windows here, that's only done when they are really entered.
+ When the |:tab| modifier is used new windows are opened in a
+ new tab, up to 'tabpagemax'.
+
+Note: All the commands above that start editing another buffer, keep the
+'readonly' flag as it was. This differs from the ":edit" command, which sets
+the 'readonly' flag each time the file is read.
+
+==============================================================================
+12. Special kinds of buffers *special-buffers*
+
+Instead of containing the text of a file, buffers can also be used for other
+purposes. A few options can be set to change the behavior of a buffer:
+ 'bufhidden' what happens when the buffer is no longer displayed
+ in a window.
+ 'buftype' what kind of a buffer this is
+ 'swapfile' whether the buffer will have a swap file
+ 'buflisted' buffer shows up in the buffer list
+
+A few useful kinds of a buffer:
+
+quickfix Used to contain the error list or the location list. See
+ |:cwindow| and |:lwindow|. This command sets the 'buftype'
+ option to "quickfix". You are not supposed to change this!
+ 'swapfile' is off.
+
+help Contains a help file. Will only be created with the |:help|
+ command. The flag that indicates a help buffer is internal
+ 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
+ :setlocal bufhidden=delete
+ :setlocal noswapfile
+< The buffer name is the name of the directory and is adjusted
+ when using the |:cd| command.
+
+ *scratch-buffer*
+scratch Contains text that can be discarded at any time. It is kept
+ when closing the window, it must be deleted explicitly.
+ Settings: >
+ :setlocal buftype=nofile
+ :setlocal bufhidden=hide
+ :setlocal noswapfile
+< The buffer name can be used to identify the buffer, if you
+ give it a meaningful name.
+
+ *unlisted-buffer*
+unlisted The buffer is not in the buffer list. It is not used for
+ normal editing, but to show a help file, remember a file name
+ or marks. The ":bdelete" command will also set this option,
+ thus it doesn't completely delete the buffer. Settings: >
+ :setlocal nobuflisted
+<
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/workshop.txt b/runtime/doc/workshop.txt
new file mode 100644
index 0000000..f71866d
--- /dev/null
+++ b/runtime/doc/workshop.txt
@@ -0,0 +1,14 @@
+*workshop.txt* For Vim version 9.0. Last change: 2019 Jan 17
+
+
+ VIM REFERENCE MANUAL by Gordon Prieur
+
+
+Sun Visual WorkShop Features *workshop* *workshop-support*
+
+The support for WorkShop was removed in patch 8.1.0763 in January 2019.
+The product has not been available for a long time and has been replaced by
+|NetBeans|.
+
+
+ vim:tw=78:ts=8:noet:ft=help:norl:
diff --git a/runtime/doc/xxd-fr.1 b/runtime/doc/xxd-fr.1
new file mode 100644
index 0000000..e170df5
--- /dev/null
+++ b/runtime/doc/xxd-fr.1
@@ -0,0 +1,396 @@
+.TH XXD 1 "aot 1996" "Page de manuel pour xxd"
+.\"
+.\" 21st May 1996
+.\" Man page author:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Changes by Bram Moolenaar <Bram@vim.org>
+.\" French translation by David Blanchet <david.blanchet@free.fr> 2005-03
+.SH NOM
+.I xxd
+\- convertit en reprsentation hexadcimale et inversement.
+.SH SYNOPSIS
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[options] [fichier_entree [fichier_sortie]]
+.br
+.B xxd
+\-r[evert] [options] [fichier_entree [fichier_sortie]]
+.SH DESCRIPTION
+.I xxd
+cre un fichier contenant la reprsentation hexadcimale d'un fichier
+binaire ou de l'entre standard.
+Il peut galement convertir un fichier de codes hexadcimaux en un fichier
+binaire.
+Comme
+.BR uuencode (1)
+et
+.BR uudecode (1)
+il permet la transmission de donnes binaires dans une reprsentation ASCII
+compatible avec le courrier lectronique, mais a l'avantage de dcoder la
+sortie standard.
+De plus, il peut tre utilis pour appliquer des rustines des fichiers
+binaires.
+.SH OPTIONS
+Si aucun
+.I fichier_entree
+n'est spcifi, l'entre standard est utilise.
+Si
+.I fichier_entree
+correspond au caractre
+.RB '\-'
+\, l'entre standard est employe comme source des donnes en entre.
+Si aucun
+.I fichier_sortie
+n'est spcifi (ou qu'un caractre
+.RB '\-'
+est donn sa place), le rsultat est envoy sur la sortie standard.
+.PP
+NOTE : un analyseur paresseux est utilis. Il ne vrifie pas au-del de la
+premire lettre de l'option, moins que cette dernire ne requiert un
+paramtre.
+L'espace entre l'option et son paramtre est optionnel.
+Les paramtres des options peuvent tre spcifis en notation dcimale,
+hexadcimale ou octale.
+Ainsi
+.BR \-c8 ,
+.BR "\-c 8" ,
+.B \-c 010
+et
+.B \-cols 8
+sont tous quivalents.
+.TP
+.IR \-a " | " \-autoskip
+active la fonctionnalit "autoskip" : le caractre '*' remplace les lignes
+d'octets nuls. Dsactive par dfaut.
+.TP
+.IR \-b " | " \-bits
+Convertit en binaires plutt qu'en hexadcimal.
+Cette option crit les octets comme une squence de "1" et de "0" au lieu
+d'une conversion en hexadcimal traditionnel. Chaque ligne est prcde par un
+numro de ligne en hexadcimal et suivie de la reprsentation ASCII (ou
+EBCDIC) correspondante. Les options \-r, \-p, \-i ne fonctionnent pas dans ce
+mode.
+.TP
+.IR "\-c cols " | " \-cols cols"
+place
+.RI < cols >
+octets par ligne. 16 par dfaut (\-i : 12, \-ps : 30, \-b : 6). Maximum 256.
+.TP
+.IR \-E " | " \-EBCDIC
+Passe le codage des caractres de la colonne de droite de ASCII EBCDIC.
+Cela ne change pas la reprsentation hexadcimale. Cette option est sans effet
+quand elle est utilise avec \-r, \-p or \-i.
+.TP
+.IR "\-g octets " | " \-groupsize octets"
+Regroupe les octets (deux chiffres hexadcimaux ou huit chiffres binaires)
+par groupe de
+.RI < octets >
+\, spars par des espaces blancs. Spcifiez
+.I \-g 0
+pour supprimer le regroupement.
+.RI < octets >
+vaut 2 par dfaut dans le mode normal et \fI1\fP en
+reprsentation binaire. Le regroupement ne s'applique pas aux styles
+Postscript et Include.
+.TP
+.IR \-h " | " \-help
+Affiche un rsum des commandes disponibles et quitte. Aucune conversion n'est
+effectue.
+.TP
+.IR \-i " | " \-include
+produit une sortie dans le style #include (fichier C inclure). La dfinition
+complte d'un tableau statique est crite et est nomme d'aprs le fichier
+d'origine, moins que xxd lise depuis l'entre standard.
+.TP
+.IR "\-l long " | " \-len long"
+Arrte aprs l'criture de
+.RI < long >
+octets.
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+Produit une conversion continue dans le style Postscript (postscript continuous
+hexdump style).
+galement connu sous le nom de conversion brute (plain hexdump style).
+.TP
+.IR \-r " | " \-revert
+Opration inverse : convertit un fichier hexadcimal en un fichier binaire (ou
+applique une rustine un fichier binaire).
+Si l'criture n'a pas lieu sur la sortie standard, xxd crit dans le fichier
+qu'il produit sans le tronquer. Utilisez la combinaison
+.I \-r \-p
+pour lire de l'hexadcimal brut sans information sur le numro des lignes et
+sans format de colonnes particulier. Des espaces blancs et coupures de lignes
+supplmentaires sont autoriss n'importe quel endroit.
+.TP
+.I \-seek dcalage
+Utilis aprs l'option
+.IR \-r :
+inverse la conversion en ajoutant
+.RI < dcalage >
+aux positions dans le fichier donnes dans le code hexadcimal.
+.TP
+.I \-s [+][\-]dcalage
+Dbute au
+.RI < dcalage >
+absolu ou relatif dans fichier_entree.
+\fI+ \fRindique que le dcalage est relatif la position courante dans
+l'entre standard (sans effet si la lecture n'a pas lieu sur l'entre
+standard). \fI\- \fRindique un dcalage en caractres depuis la fin de
+l'entre (utilis avec \fI+\fR, dsigne la position avant la position
+actuelle de l'entre standard).
+Sans l'option \-s, xxd dmarre la position courante du fichier.
+.TP
+.I \-u
+Utilise des chiffres hexadcimaux majuscules. La casse par dfaut est
+minuscule.
+.TP
+.IR \-v " | " \-version
+Affiche la version de xxd.
+.SH MISE EN GARDE
+.I xxd \-r
+effectue des oprations internes un peu obscures lors de l'valuation
+des informations sur les numros de lignes. Si le fichier de sortie est
+adressable, alors les numros de lignes au dbut de chaque ligne d'hexadcimal
+peuvent tre dsordonnes, des lignes peuvent manquer ou se chevaucher. Dans
+ces cas, xxd utilisera lseek(2) pour dterminer la prochaine position. Si le
+fichier n'est pas adressable, seuls les vides sont autoriss, et ils seront
+combls par des octets nuls.
+.PP
+.I xxd \-r
+ne gnre aucune erreur lors de l'analyse. Les problmes sont passs
+silencieusement.
+.PP
+Lors de l'dition de la reprsentation hexadcimale, veuillez noter que
+.I xxd \-r
+ignore tout ce qui se trouve sur la ligne aprs avoir lu suffisamment de
+donnes hexadcimales (voir l'option \-c). Cela signifie galement que les
+modifications dans la colonne ASCII (ou EBCDIC) sont toujours ignores. La
+conversion inverse de donnes hexadcimales brutes (postscript) avec xxd \-r
+\-p ne dpend pas d'un nombre correct de colonnes. Dans ce cas, tout ce qui
+ressemble une paire de chiffres hexadcimaux est interprt.
+.PP
+Remarquez la diffrence entre
+.br
+\fI% xxd \-i fichier\fR
+.br
+et
+.br
+\fI% xxd \-i < fichier\fR
+.PP
+.I xxd \-s \+seek
+peut diffrer de
+.IR "xxd \-s seek" ,
+car lseek(2) est utilis pour revenir en arrire . Le '+' fait une
+diffrence quand la source des donnes est l'entre standard et si la position
+dans le fichier de l'entre standard n'est pas au dbut du fichier lorsque xxd
+est dmarr et qu'il reoit ses donnes.
+L'exemple suivant peut vous aider comprendre (ou bien vous perdre davantage
+encore !)...
+.PP
+Remettre l'entre standard au dpart avant de lire ; ncessaire car 'cat' a
+dj lu jusqu' la fin de l'entre standard.
+.br
+\fI% sh \-c 'cat > donnees_binaires; xxd \-s 0 > donnees_hexa' < fichier\fR
+.PP
+Convertir partir de la position 0x480 (= 1024 + 128) du fichier.
+Le symbole '+' signifie "relativement la position actuelle', ainsi 128 est
+ajout aux 1024 octets comptabiliss pour dd.
+.br
+\fI% sh \-c 'dd of=donnees_binaires bs=1k count=1; xxd \-s +128 >
+donnees_hexa' < fichier\fR
+.PP
+Convertir de fichier depuis la position 0x100 (= 1024 \- 768) du fichier.
+.br
+\fI% sh \-c 'dd of=donnees_binaires bs=1k count=1; xxd \-s +\-768 >
+donnees_hexa' < fichier\fR
+.PP
+Toutefois, cette situation est peu frquente et l'utilisation de '+' est
+rarement requise. L'auteur prfre surveiller les effets de xxd avec strace(1)
+ou truss(1) quand \-s est employ.
+.SH EXEMPLES
+Afficher la totalit du
+.B fichier
+sauf les trois premires lignes (0x30 octets en hexadcimal).
+.br
+\fI% xxd \-s 0x30 fichier\fR
+.PP
+afficher les trois dernires lignes (0x30 octets en hexadcimal) du
+.B fichier
+\.
+.br
+\fI% xxd \-s \-0x30 fichier\fR
+.PP
+.br
+Afficher 120 octets convertis en continu, avec 20 octets par ligne.
+.br
+\fI% xxd \-l 120 \-ps \-c 20 xxd\-fr.1\fR
+.br
+2e54482058584420312022616ffb742031393936
+.br
+22202250616765206465206d616e75656c20706f
+.br
+757220787864220a2e5c220a2e5c222032317374
+.br
+204d617920313939360a2e5c22204d616e207061
+.br
+676520617574686f723a0a2e5c2220202020546f
+.br
+6e79204e7567656e74203c746f6e79407363746e
+.br
+204e7567656e74203c746f6e79407363746e7567
+.br
+2e54482058584420312022417567757374203139
+.PP
+Convertir les 120 premiers octets de cette page de manuel avec 12 octets par
+ligne.
+.br
+\fI% xxd \-l 120 \-c 12 xxd\-fr.1\fR
+.br
+0000000: 2e54 4820 5858 4420 3120 2261 .TH XXD 1 "a
+.br
+000000c: 6ffb 7420 3139 3936 2220 2250 o.t 1996" "P
+.br
+0000018: 6167 6520 6465 206d 616e 7565 age de manue
+.br
+0000024: 6c20 706f 7572 2078 7864 220a l pour xxd".
+.br
+0000030: 2e5c 220a 2e5c 2220 3231 7374 .\"..\" 21st
+.br
+000003c: 204d 6179 2031 3939 360a 2e5c May 1996..\\
+.br
+0000048: 2220 4d61 6e20 7061 6765 2061 " Man page a
+.br
+0000054: 7574 686f 723a 0a2e 5c22 2020 uthor:..\"
+.br
+0000060: 2020 546f 6e79 204e 7567 656e Tony Nugen
+.br
+000006c: 7420 3c74 6f6e 7940 7363 746e t <tony@sctn
+.PP
+Afficher la date crite au dbut du fichier xxd\-fr.1.
+.br
+\fI% xxd \-s 0x38 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
+.PP
+Copier
+.B fichier_entree
+vers
+.B fichier_sortie
+en ajoutant 100 octets de valeur 0x00 avant.
+.br
+\fI% xxd fichier_entree | xxd \-r \-s 100 \> fichier_sortie\fR
+.PP
+Patcher la date dans le fichier xxd.1
+.br
+\fI% echo '0000037: 3574 68' | xxd \-r \- xxd\-fr.1\fR
+.br
+\fI% xxd \-s 0x38 \-l 13 \-c 13 xxd\-fr.1\fR
+.br
+0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
+.PP
+Crer un fichier de 65537 octets tous nuls (0x00),
+sauf le dernier qui vaut 'A' (0x41 en hexadcimal).
+.br
+\fI% echo '010000: 41' | xxd \-r \> fichier\fR
+.PP
+.br
+Convertir le fichier de l'exemple prcdent avec la fonctionnalit "autoskip".
+.br
+\fI% xxd \-a \-c 12 fichier\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+Crer un fichier d'un octet, contenant seulement le caractre 'A'.
+Le nombre aprs '\-r \-s' s'ajoute aux numros de lignes trouves dans le
+fichier ; les octets initiaux sont supprims.
+.br
+\fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> fichier\fR
+.PP
+Utiliser xxd comme filtre dans un diteur tel que
+.B vim(1)
+pour convertir une zone comprise entre les marques 'a' et 'z'.
+.br
+\fI:'a,'z!xxd\fR
+.PP
+Utiliser xxd comme filtre dans un diteur tel que
+.B vim(1)
+pour rcuprer une conversion binaire comprise entre les marques 'a' et 'z'.
+.br
+\fI:'a,'z!xxd \-r\fR
+.PP
+Utiliser xxd comme filtre dans un diteur tel que
+.B vim(1)
+pour rcuprer une ligne convertie. Placez le curseur sur la ligne et tapez :
+.br
+\fI!!xxd \-r\fR
+.PP
+Lire des caractres depuis une connexion srie :
+.br
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.SH VALEURS DE RETOUR
+Les erreurs suivantes sont rapportes :
+.TP
+0
+aucune erreur ne s'est produit.
+.TP
+\-1
+opration non supporte (
+.I xxd \-r \-i
+reste impossible).
+.TP
+1
+erreur lors de l'analyse des options.
+.TP
+2
+problme avec le fichier d'entre.
+.TP
+3
+problme avec le fichier de sortie.
+.TP
+4, 5
+la position spcifie n'est pas atteignable.
+.SH VOIR AUSSI
+uuencode(1), uudecode(1), patch(1)
+.SH AVERTISSEMENTS
+L'tranget de cet outil reflte celle du cerveau de ses crateurs.
+Utilisez cet outil vos risques et prils. Dupliquez vos fichiers.
+Surveillez l'outil. Devenez un gourou.
+.SH VERSION
+Cette page de manuel documente la version 1.7 de xxd.
+.SH AUTEUR
+(c) 1990-1997 par Juergen Weigert
+.br
+<jnweiger@informatik.uni-erlangen.de>
+.LP
+"Distribute freely and credit me,
+.br
+make money and share with me,
+.br
+lose money and don't ask me."
+.PP
+Distribution libre en citant l'auteur,
+.br
+gagnez de l'argent, pensez moi,
+.br
+perdez de l'argent, oubliez-moi.
+.PP
+Page de manuel dbute par Tony Nugent
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+Modifications mineures par Bram Moolenaar.
+dit par Juergen Weigert.
+.SH TRADUCTION
+Cette page de manuel a t traduite par David Blanchet
+<david.blanchet@free.fr> 2004-12-24.
+Mise jour 2013-05-10, Dominique Pell <dominique.pelle@gmail.com>
diff --git a/runtime/doc/xxd-fr.UTF-8.1 b/runtime/doc/xxd-fr.UTF-8.1
new file mode 100644
index 0000000..47773a1
--- /dev/null
+++ b/runtime/doc/xxd-fr.UTF-8.1
@@ -0,0 +1,396 @@
+.TH XXD 1 "août 1996" "Page de manuel pour xxd"
+.\"
+.\" 21st May 1996
+.\" Man page author:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Changes by Bram Moolenaar <Bram@vim.org>
+.\" French translation by David Blanchet <david.blanchet@free.fr> 2005-03
+.SH NOM
+.I xxd
+\- convertit en représentation hexadécimale et inversement.
+.SH SYNOPSIS
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[options] [fichier_entree [fichier_sortie]]
+.br
+.B xxd
+\-r[evert] [options] [fichier_entree [fichier_sortie]]
+.SH DESCRIPTION
+.I xxd
+crée un fichier contenant la représentation hexadécimale d'un fichier
+binaire ou de l'entrée standard.
+Il peut également convertir un fichier de codes hexadécimaux en un fichier
+binaire.
+Comme
+.BR uuencode (1)
+et
+.BR uudecode (1)
+il permet la transmission de données binaires dans une représentation ASCII
+compatible avec le courrier électronique, mais a l'avantage de décoder la
+sortie standard.
+De plus, il peut être utilisé pour appliquer des rustines à des fichiers
+binaires.
+.SH OPTIONS
+Si aucun
+.I fichier_entree
+n'est spécifié, l'entrée standard est utilisée.
+Si
+.I fichier_entree
+correspond au caractère
+.RB '\-'
+\, l'entrée standard est employée comme source des données en entrée.
+Si aucun
+.I fichier_sortie
+n'est spécifié (ou qu'un caractère
+.RB '\-'
+est donné à sa place), le résultat est envoyé sur la sortie standard.
+.PP
+NOTE : un analyseur paresseux est utilisé. Il ne vérifie pas au-delà de la
+première lettre de l'option, à moins que cette dernière ne requiert un
+paramètre.
+L'espace entre l'option et son paramètre est optionnel.
+Les paramètres des options peuvent être spécifiés en notation décimale,
+hexadécimale ou octale.
+Ainsi
+.BR \-c8 ,
+.BR "\-c 8" ,
+.B \-c 010
+et
+.B \-cols 8
+sont tous équivalents.
+.TP
+.IR \-a " | " \-autoskip
+active la fonctionnalité "autoskip" : le caractère '*' remplace les lignes
+d'octets nuls. Désactivée par défaut.
+.TP
+.IR \-b " | " \-bits
+Convertit en binaires plutôt qu'en hexadécimal.
+Cette option écrit les octets comme une séquence de "1" et de "0" au lieu
+d'une conversion en hexadécimal traditionnel. Chaque ligne est précédée par un
+numéro de ligne en hexadécimal et suivie de la représentation ASCII (ou
+EBCDIC) correspondante. Les options \-r, \-p, \-i ne fonctionnent pas dans ce
+mode.
+.TP
+.IR "\-c cols " | " \-cols cols"
+place
+.RI < cols >
+octets par ligne. 16 par défaut (\-i : 12, \-ps : 30, \-b : 6). Maximum 256.
+.TP
+.IR \-E " | " \-EBCDIC
+Passe le codage des caractères de la colonne de droite de ASCII à EBCDIC.
+Cela ne change pas la représentation hexadécimale. Cette option est sans effet
+quand elle est utilisée avec \-r, \-p or \-i.
+.TP
+.IR "\-g octets " | " \-groupsize octets"
+Regroupe les octets (deux chiffres hexadécimaux ou huit chiffres binaires)
+par groupe de
+.RI < octets >
+\, séparés par des espaces blancs. Spécifiez
+.I \-g 0
+pour supprimer le regroupement.
+.RI < octets >
+vaut 2 par défaut dans le mode normal et \fI1\fP en
+représentation binaire. Le regroupement ne s'applique pas aux styles
+Postscript et Include.
+.TP
+.IR \-h " | " \-help
+Affiche un résumé des commandes disponibles et quitte. Aucune conversion n'est
+effectuée.
+.TP
+.IR \-i " | " \-include
+produit une sortie dans le style #include (fichier C à inclure). La définition
+complète d'un tableau statique est écrite et est nommée d'après le fichier
+d'origine, à moins que xxd lise depuis l'entrée standard.
+.TP
+.IR "\-l long " | " \-len long"
+Arrête après l'écriture de
+.RI < long >
+octets.
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+Produit une conversion continue dans le style Postscript (postscript continuous
+hexdump style).
+Également connu sous le nom de « conversion brute » (plain hexdump style).
+.TP
+.IR \-r " | " \-revert
+Opération inverse : convertit un fichier hexadécimal en un fichier binaire (ou
+applique une rustine à un fichier binaire).
+Si l'écriture n'a pas lieu sur la sortie standard, xxd écrit dans le fichier
+qu'il produit sans le tronquer. Utilisez la combinaison
+.I \-r \-p
+pour lire de l'hexadécimal brut sans information sur le numéro des lignes et
+sans format de colonnes particulier. Des espaces blancs et coupures de lignes
+supplémentaires sont autorisés à n'importe quel endroit.
+.TP
+.I \-seek décalage
+Utilisé après l'option
+.IR \-r :
+inverse la conversion en ajoutant
+.RI < décalage >
+aux positions dans le fichier données dans le code hexadécimal.
+.TP
+.I \-s [+][\-]décalage
+Débute au
+.RI < décalage >
+absolu ou relatif dans fichier_entree.
+\fI+ \fRindique que le décalage est relatif à la position courante dans
+l'entrée standard (sans effet si la lecture n'a pas lieu sur l'entrée
+standard). \fI\- \fRindique un décalage en caractères depuis la fin de
+l'entrée (utilisé avec \fI+\fR, désigne la position avant la position
+actuelle de l'entrée standard).
+Sans l'option \-s, xxd démarre à la position courante du fichier.
+.TP
+.I \-u
+Utilise des chiffres hexadécimaux majuscules. La casse par défaut est
+minuscule.
+.TP
+.IR \-v " | " \-version
+Affiche la version de xxd.
+.SH MISE EN GARDE
+.I xxd \-r
+effectue des opérations internes un peu obscures lors de l'évaluation
+des informations sur les numéros de lignes. Si le fichier de sortie est
+adressable, alors les numéros de lignes au début de chaque ligne d'hexadécimal
+peuvent être désordonnées, des lignes peuvent manquer ou se chevaucher. Dans
+ces cas, xxd utilisera lseek(2) pour déterminer la prochaine position. Si le
+fichier n'est pas adressable, seuls les vides sont autorisés, et ils seront
+comblés par des octets nuls.
+.PP
+.I xxd \-r
+ne génère aucune erreur lors de l'analyse. Les problèmes sont passés
+silencieusement.
+.PP
+Lors de l'édition de la représentation hexadécimale, veuillez noter que
+.I xxd \-r
+ignore tout ce qui se trouve sur la ligne après avoir lu suffisamment de
+données hexadécimales (voir l'option \-c). Cela signifie également que les
+modifications dans la colonne ASCII (ou EBCDIC) sont toujours ignorées. La
+conversion inverse de données hexadécimales brutes (postscript) avec xxd \-r
+\-p ne dépend pas d'un nombre correct de colonnes. Dans ce cas, tout ce qui
+ressemble à une paire de chiffres hexadécimaux est interprété.
+.PP
+Remarquez la différence entre
+.br
+\fI% xxd \-i fichier\fR
+.br
+et
+.br
+\fI% xxd \-i < fichier\fR
+.PP
+.I xxd \-s \+seek
+peut différer de
+.IR "xxd \-s seek" ,
+car lseek(2) est utilisé pour « revenir en arrière ». Le '+' fait une
+différence quand la source des données est l'entrée standard et si la position
+dans le fichier de l'entrée standard n'est pas au début du fichier lorsque xxd
+est démarré et qu'il reçoit ses données.
+L'exemple suivant peut vous aider à comprendre (ou bien vous perdre davantage
+encore !)...
+.PP
+Remettre l'entrée standard au départ avant de lire ; nécessaire car 'cat' a
+déjà lu jusqu'à la fin de l'entrée standard.
+.br
+\fI% sh \-c 'cat > donnees_binaires; xxd \-s 0 > donnees_hexa' < fichier\fR
+.PP
+Convertir à partir de la position 0x480 (= 1024 + 128) du fichier.
+Le symbole '+' signifie "relativement à la position actuelle', ainsi 128 est
+ajouté aux 1024 octets comptabilisés pour dd.
+.br
+\fI% sh \-c 'dd of=donnees_binaires bs=1k count=1; xxd \-s +128 >
+donnees_hexa' < fichier\fR
+.PP
+Convertir de fichier depuis la position 0x100 (= 1024 \- 768) du fichier.
+.br
+\fI% sh \-c 'dd of=donnees_binaires bs=1k count=1; xxd \-s +\-768 >
+donnees_hexa' < fichier\fR
+.PP
+Toutefois, cette situation est peu fréquente et l'utilisation de '+' est
+rarement requise. L'auteur préfère surveiller les effets de xxd avec strace(1)
+ou truss(1) quand \-s est employé.
+.SH EXEMPLES
+Afficher la totalité du
+.B fichier
+sauf les trois premières lignes (0x30 octets en hexadécimal).
+.br
+\fI% xxd \-s 0x30 fichier\fR
+.PP
+afficher les trois dernières lignes (0x30 octets en hexadécimal) du
+.B fichier
+\.
+.br
+\fI% xxd \-s \-0x30 fichier\fR
+.PP
+.br
+Afficher 120 octets convertis en continu, avec 20 octets par ligne.
+.br
+\fI% xxd \-l 120 \-ps \-c 20 xxd\-fr.1\fR
+.br
+2e54482058584420312022616ffb742031393936
+.br
+22202250616765206465206d616e75656c20706f
+.br
+757220787864220a2e5c220a2e5c222032317374
+.br
+204d617920313939360a2e5c22204d616e207061
+.br
+676520617574686f723a0a2e5c2220202020546f
+.br
+6e79204e7567656e74203c746f6e79407363746e
+.br
+204e7567656e74203c746f6e79407363746e7567
+.br
+2e54482058584420312022417567757374203139
+.PP
+Convertir les 120 premiers octets de cette page de manuel avec 12 octets par
+ligne.
+.br
+\fI% xxd \-l 120 \-c 12 xxd\-fr.1\fR
+.br
+0000000: 2e54 4820 5858 4420 3120 2261 .TH XXD 1 "a
+.br
+000000c: 6ffb 7420 3139 3936 2220 2250 o.t 1996" "P
+.br
+0000018: 6167 6520 6465 206d 616e 7565 age de manue
+.br
+0000024: 6c20 706f 7572 2078 7864 220a l pour xxd".
+.br
+0000030: 2e5c 220a 2e5c 2220 3231 7374 .\"..\" 21st
+.br
+000003c: 204d 6179 2031 3939 360a 2e5c May 1996..\\
+.br
+0000048: 2220 4d61 6e20 7061 6765 2061 " Man page a
+.br
+0000054: 7574 686f 723a 0a2e 5c22 2020 uthor:..\"
+.br
+0000060: 2020 546f 6e79 204e 7567 656e Tony Nugen
+.br
+000006c: 7420 3c74 6f6e 7940 7363 746e t <tony@sctn
+.PP
+Afficher la date écrite au début du fichier xxd\-fr.1.
+.br
+\fI% xxd \-s 0x38 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
+.PP
+Copier
+.B fichier_entree
+vers
+.B fichier_sortie
+en ajoutant 100 octets de valeur 0x00 avant.
+.br
+\fI% xxd fichier_entree | xxd \-r \-s 100 \> fichier_sortie\fR
+.PP
+Patcher la date dans le fichier xxd.1
+.br
+\fI% echo '0000037: 3574 68' | xxd \-r \- xxd\-fr.1\fR
+.br
+\fI% xxd \-s 0x38 \-l 13 \-c 13 xxd\-fr.1\fR
+.br
+0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
+.PP
+Créer un fichier de 65537 octets tous nuls (0x00),
+sauf le dernier qui vaut 'A' (0x41 en hexadécimal).
+.br
+\fI% echo '010000: 41' | xxd \-r \> fichier\fR
+.PP
+.br
+Convertir le fichier de l'exemple précédent avec la fonctionnalité "autoskip".
+.br
+\fI% xxd \-a \-c 12 fichier\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+Créer un fichier d'un octet, contenant seulement le caractère 'A'.
+Le nombre après '\-r \-s' s'ajoute aux numéros de lignes trouvées dans le
+fichier ; les octets initiaux sont supprimés.
+.br
+\fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> fichier\fR
+.PP
+Utiliser xxd comme filtre dans un éditeur tel que
+.B vim(1)
+pour convertir une zone comprise entre les marques 'a' et 'z'.
+.br
+\fI:'a,'z!xxd\fR
+.PP
+Utiliser xxd comme filtre dans un éditeur tel que
+.B vim(1)
+pour récupérer une conversion binaire comprise entre les marques 'a' et 'z'.
+.br
+\fI:'a,'z!xxd \-r\fR
+.PP
+Utiliser xxd comme filtre dans un éditeur tel que
+.B vim(1)
+pour récupérer une ligne convertie. Placez le curseur sur la ligne et tapez :
+.br
+\fI!!xxd \-r\fR
+.PP
+Lire des caractères depuis une connexion série :
+.br
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.SH VALEURS DE RETOUR
+Les erreurs suivantes sont rapportées :
+.TP
+0
+aucune erreur ne s'est produit.
+.TP
+\-1
+opération non supportée (
+.I xxd \-r \-i
+reste impossible).
+.TP
+1
+erreur lors de l'analyse des options.
+.TP
+2
+problème avec le fichier d'entrée.
+.TP
+3
+problème avec le fichier de sortie.
+.TP
+4, 5
+la position spécifiée n'est pas atteignable.
+.SH VOIR AUSSI
+uuencode(1), uudecode(1), patch(1)
+.SH AVERTISSEMENTS
+L'étrangeté de cet outil reflète celle du cerveau de ses créateurs.
+Utilisez cet outil à vos risques et périls. Dupliquez vos fichiers.
+Surveillez l'outil. Devenez un gourou.
+.SH VERSION
+Cette page de manuel documente la version 1.7 de xxd.
+.SH AUTEUR
+(c) 1990-1997 par Juergen Weigert
+.br
+<jnweiger@informatik.uni-erlangen.de>
+.LP
+"Distribute freely and credit me,
+.br
+make money and share with me,
+.br
+lose money and don't ask me."
+.PP
+Distribution libre en citant l'auteur,
+.br
+gagnez de l'argent, pensez à moi,
+.br
+perdez de l'argent, oubliez-moi.
+.PP
+Page de manuel débutée par Tony Nugent
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+Modifications mineures par Bram Moolenaar.
+Édité par Juergen Weigert.
+.SH TRADUCTION
+Cette page de manuel a été traduite par David Blanchet
+<david.blanchet@free.fr> 2004-12-24.
+Mise à jour 2013-05-10, Dominique Pellé <dominique.pelle@gmail.com>
diff --git a/runtime/doc/xxd-it.1 b/runtime/doc/xxd-it.1
new file mode 100644
index 0000000..1fb4ae5
--- /dev/null
+++ b/runtime/doc/xxd-it.1
@@ -0,0 +1,402 @@
+.TH XXD 1 "Agosto 1996" "Pagina di manuale per xxd"
+.\"
+.\" 21 Maggio 1996
+.\" Autore della pagina di manuale:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Modificato da Bram Moolenaar <Bram@vim.org>
+.SH NOME
+.I xxd
+\- Produce esadecimale da un file binario o viceversa.
+.SH SINTASSI
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[opzioni] [input_file [output_file]]
+.br
+.B xxd
+\-r[evert] [opzioni] [input_file [output_file]]
+.SH DESCRIZIONE
+.I xxd
+crea un'immagine esadecimale di un dato file o dello "standard input".
+Pu anche ottenere da un'immagine esadecimale il file binario originale.
+Come
+.BR uuencode (1)
+e
+.BR uudecode (1)
+permette di trasmettere dati binari in una rappresentazione ASCII "a prova
+di email", ma ha anche il vantaggio di poter decodificare sullo "standard
+output". Inoltre, pu essere usato per effettuare delle modifiche (patch)
+a file binari.
+.SH OPZIONI
+Se non si specifica un
+.I input_file
+il programma legge dallo "standard input".
+Se
+.I input_file
+ specificato come il carattere
+.RB \` \- '
+, l'input letto dallo "standard input".
+Se non si specifica un
+.I output_file
+(o si mette al suo posto il carattere
+.RB \` \- '
+), i risultati sono inviati allo "standard output".
+.PP
+Si noti che la scansione dei caratteri "pigra", e non controlla oltre
+la prima lettera dell'opzione, a meno che l'opzione sia seguita da un
+parametro.
+Gli spazi fra una singola lettera di opzione e il corrispondente parametro
+dopo di essa sono facoltativi.
+I parametri delle opzioni possono essere specificati usando la notazione
+decimale, esadecimale oppure ottale.
+Pertanto
+.BR \-c8 ,
+.BR "\-c 8" ,
+.B \-c 010
+e
+.B \-cols 8
+sono notazioni equivalenti fra loro.
+.PP
+.TP
+.IR \-a " | " \-autoskip
+Richiesta di autoskip: Un singolo '*' rimpiazza linee di zeri binari.
+Valore di default: off.
+.TP
+.IR \-b " | " \-bits
+Richiesta di una immagine binaria (cifre binarie), invece che esadecimale.
+Questa opzione scrive un byte come otto cifre "1" e "0" invece di usare i
+numeri esadecimali. Ogni linea preceduta da un indirizzo in esadecimale e
+seguita da una decodifica ascii (o ebcdic). Le opzioni specificabili dalla
+linea comando \-r, \-p, \-i non funzionano in questo modo.
+.TP
+.IR "\-c colonne " | " \-cols colonne"
+.IR "\-c colonne " | " \-cols colonne"
+In ogni linea sono formattate
+.RI < colonne >
+colonne. Valore di default 16 (\-i: 12, \-ps: 30, \-b: 6).
+Valore massimo 256.
+.TP
+.IR \-E " | " \-EBCDIC
+Cambia la codifica della colonna di destra da ASCII a EBCDIC.
+Questo non modifica la rappresentazione esadecimale. Non ha senso
+specificare questa opzione in combinazione con \-r, \-p o \-i.
+.TP
+.IR "\-g numero_byte " | " \-groupsize numero_byte"
+Inserisci ogni
+.RI < numero_byte >
+byte di output (di due caratteri esadecimali o otto numeri binari ognuno)
+uno spazio bianco.
+Specificando
+.I \-g 0
+i byte di output non sono separati da alcuno spazio.
+.RI < numero_byte > ha come valore di default " 2
+in modalit normale [esadecimale] e \fI1\fP in modalit binaria.
+Il raggruppamento non si applica agli stili "PostScript" e "include".
+.TP
+.IR \-h " | " \-help
+stampa un sommario dei comandi disponibili ed esce. Non viene fatto
+null'altro.
+.TP
+.IR \-i " | " \-include
+L'output nello stile dei file "include" in C. Viene preparata la
+definizione completa di un "array" [vettore], dandogli il nome del
+file di input), tranne che nel caso in cui xxd legga dallo "standard input".
+.TP
+.IR "\-l numero " | " \-len numero"
+Il programma esce dopo aver scritto
+.RI < numero >
+byte.
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+L'output nello stile di un dump continuo sotto postscript.
+Noto anche come stile esadecimale semplice [plain].
+.TP
+.IR \-r " | " \-revert
+ricostruzione: converte (o mette una patch) a partire dall'immagine
+esadecimale, creando [o modificando] il file binario.
+Se non diretto allo "standard output", xxd scrive nel suo file di output
+in maniera continua, senza interruzioni. Usare la combinazione
+.I \-r \-p
+per leggere dump in stile esadecimale semplice [plain], senza l'informazione
+di numero di linea e senza un particolare tracciato di colonna. Degli spazi
+o delle linee vuote possono essere inserite a piacere [e vengono ignorate].
+.TP
+.I \-seek distanza
+Usato con l'opzione
+.IR \-r :
+(ricostruzione),
+.RI < distanza >
+viene aggiunta alla posizione nel file trovata nella immagine
+esadecimale.
+.TP
+.I \-s [+][\-]seek
+Inizia a
+.RI < seek >
+byte assoluti (o relativi) di distanza all'interno di input_file.
+\fI+ \fRindica che il "seek" relativo alla posizione corrente nel file
+"standard input" (non significativa quando non si legge da "standard input").
+\fI\- \fRindica che il "seek" dovrebbe posizionarsi ad quel numero di
+caratteri dalla fine dell'input (o se in combinazione con
+\fI+ \fR: prime della posizione corrente nel file "standard input").
+Se non si specifica una opzione \-s, xxd inizia alla posizione
+corrente all'interno del file.
+.TP
+.I \-u
+usa lettere esadecimali maiuscole. Il valore di default di usare
+lettere minuscole.
+.TP
+.IR \-v " | " \-version
+visualizza la stringa contenente la versione del programma.
+.SH ATTENZIONE
+.PP
+.I xxd \-r
+ capace di operare "magie" nell'utilizzare l'informazione "numero di linea".
+Se sul file di output ci si pu posizionare usando la "seek", il numero di
+linea all'inizio di ogni riga esadecimale pu essere non ordinato, delle
+linee possono mancare delle linee, oppure esserci delle sovrapposizioni.
+In simili casi xxd user lseek(2) per raggiungere la posizione d'inizio.
+Se il file di output non consente di usare "seek", sono permessi solo dei
+"buchi", che saranno riempiti con zeri binari.
+.PP
+.I xxd \-r
+non genera mai errori di specifica parametri. I parametri non riconosciuti
+sono silenziosamente ignorati.
+.PP
+Nel modificare immagini esadecimali, tenete conto che
+.I xxd \-r
+salta il resto della linea, dopo aver letto abbastanza caratteri contenenti
+dati esadecimali (vedere opzione \-c). Ci implica pure che le modifiche alle
+colonne di caratteri stampabili ascii (o ebcdic) sono sempre ignorate.
+La ricostruzione da un file immagine esadecimale in stile semplice
+(postscript) con xxd \-r \-p non dipende dal numero corretto di colonne.
+IN questo caso, qualsiasi cosa assomigli a una coppia di cifre esadecimali
+ interpretata [e utilizzata].
+.PP
+Notare la differenza fra
+.br
+\fI% xxd \-i file\fR
+.br
+e
+.br
+\fI% xxd \-i \< file\fR
+.PP
+.I xxd \-s \+seek
+pu comportarsi in modo diverso da
+.IR "xxd \-s seek"
+, perch lseek(2) usata per tornare indietro nel file di input. Il '+'
+fa differenza se il file di input lo "standard input", e se la posizione nel
+file di "standard input" non all'inizio del file quando xxd eseguito,
+con questo input.
+I seguenti esempi possono contribuire a chiarire il concetto
+(o ad oscurarlo!)...
+.PP
+Riavvolge lo "standard input" prima di leggere; necessario perch `cat'
+ha gi letto lo stesso file ["file"] fino alla fine dello "standard input".
+.br
+\fI% sh \-c 'cat > copia_normale; xxd \-s 0 > copia_esadecimale' < file
+.PP
+Stampa immagine esadecimale dalla posizione file 0x480 (=1024+128) in poi.
+Il segno `+' vuol dire "rispetto alla posizione corrente", quindi il `128'
+si aggiunge a 1k (1024) dove `dd' si era fermato.
+.br
+\fI% sh \-c 'dd of=normale bs=1k count=1; xxd \-s +128 > esadecimale' < file
+.PP
+Immagine esadecimale dalla posizione 0x100 ( = 1024\-768 ) del file in avanti.
+.br
+\fI% sh \-c 'dd of=normale bs=1k count=1; xxd \-s +\-768 > esadecimale' < file
+.PP
+Comunque, questo capita raramente, e l'uso del `+' non serve quasi mai.
+L'autore preferisce monitorare il comportamento di xxd con strace(1) o
+truss(1), quando si usa l'opzione \-s.
+.SH ESEMPI
+.PP
+.br
+Stampa tutto tranne le prime tre linee (0x30 byte esadecimali) di
+.B file
+\.
+.br
+\fI% xxd \-s 0x30 file
+.PP
+.br
+Stampa 3 linee (0x30 byte esadecimali) alla fine di
+.B file
+\.
+.br
+\fI% xxd \-s \-0x30 file
+.PP
+.br
+Stampa 120 byte come immagine esadecimale continua con 20 byte per linea.
+.br
+\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR
+
+.br
+2e54482058584420312022417567757374203139
+.br
+39362220224d616e75616c207061676520666f72
+.br
+20787864220a2e5c220a2e5c222032317374204d
+.br
+617920313939360a2e5c22204d616e2070616765
+.br
+20617574686f723a0a2e5c2220202020546f6e79
+.br
+204e7567656e74203c746f6e79407363746e7567
+.br
+
+.br
+Stampa i primi 120 byte della pagina di manuale vim.1 a 12 byte per linea.
+.br
+\fI% xxd \-l 120 \-c 12 xxd.1\fR
+
+
+.br
+0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
+.br
+000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
+.br
+0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
+.br
+0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\\
+.br
+0000030: 220a 2e5c 2220 3231 7374 204d "..\\" 21st M
+.br
+000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\\"
+.br
+0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
+.br
+0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\\"
+.br
+0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
+.br
+000006c: 3c74 6f6e 7940 7363 746e 7567 <tony@sctnug
+.PP
+.br
+Visualizza la data dal file xxd.1
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
+.PP
+.br
+Copiare
+.B input_file
+su
+.B output_file
+premettendogli 100 byte a 0x00.
+.br
+\fI% xxd input_file | xxd \-r \-s 100 \> output_file\fR
+.br
+
+.br
+Modificare (patch) la data nel file xxd.1
+.br
+\fI% echo '0000037: 3574 68' | xxd \-r \- xxd.1\fR
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
+.PP
+.br
+Creare un file di 65537 byte tutto a 0x00,
+tranne che l'ultimo carattere che una 'A' (esadecimale 0x41).
+.br
+\fI% echo '010000: 41' | xxd \-r \> file\fR
+.PP
+.br
+Stampa una immagine esadecimale del file di cui sopra con opzione autoskip.
+.br
+\fI% xxd \-a \-c 12 file\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+Crea un file di 1 byte che contiene il solo carattere 'A'.
+Il numero dopo '\-r \-s' viene aggiunto a quello trovato nel file;
+in pratica, i byte precedenti non sono stampati.
+.br
+\fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> file\fR
+.PP
+Usa xxd come filtro all'interno di un editor come
+.B vim(1)
+per ottenere una immagine esadecimale di una parte di file
+delimitata dai marcatori `a' e `z'.
+.br
+\fI:'a,'z!xxd\fR
+.PP
+Usare xxd come filtro all'interno di un editor come
+.B vim(1)
+per ricostruire un pezzo di file binario da una immagine esadecimale
+delimitata dai marcatori `a' e `z'.
+.br
+\fI:'a,'z!xxd \-r\fR
+.PP
+Usare xxd come filtro all'interno di un editor come
+.B vim(1)
+per ricostruire una sola linea di file binario da una immagine esadecimale,
+Portare il cursore sopra la linea e battere:
+.br
+\fI!!xxd \-r\fR
+.PP
+Per leggere singoli caratteri da una linea seriale
+.br
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.PP
+.SH CODICI DI RITORNO
+Il programma pu restituire questi codici di errore:
+.TP
+0
+nessun errore rilevato.
+.TP
+\-1
+operazione non supportata (
+.I xxd \-r \-i
+non ancora possible).
+.TP
+1
+errore durante la scansione parametri.
+.TP
+2
+problemi con il file di input.
+.TP
+3
+problemi con il file di output.
+.TP
+4,5
+posizione "seek" specificata non raggiungibile all'interno del file.
+.SH VEDERE ANCHE
+uuencode(1), uudecode(1), patch(1)
+.br
+.SH AVVERTIMENTI
+La stranezza dello strumento rispecchia la mente del suo creatore.
+Usate a vostro rischio e pericolo. Copiate i file. Tracciate l'esecuzione.
+Diventate un mago.
+.br
+.SH VERSIONE
+Questa pagina di manuale documenta la versione 1.7 di xxd.
+.SH AUTORE
+.br
+(c) 1990-1997 Juergen Weigert
+.br
+<jnweiger@informatik.uni\-erlangen.de>
+.LP
+Distribuite liberamente ed attribuitemi il credito,
+.br
+fate soldi e condivideteli con me
+.br
+perdete soldi e non venite a chiederli a me.
+.PP
+Pagina di manuale messa in piedi da Tony Nugent
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+Piccole modifiche di Bram Moolenaar.
+Modificato da Juergen Weigert.
+.PP
diff --git a/runtime/doc/xxd-it.UTF-8.1 b/runtime/doc/xxd-it.UTF-8.1
new file mode 100644
index 0000000..8b0d53e
--- /dev/null
+++ b/runtime/doc/xxd-it.UTF-8.1
@@ -0,0 +1,402 @@
+.TH XXD 1 "Agosto 1996" "Pagina di manuale per xxd"
+.\"
+.\" 21 Maggio 1996
+.\" Autore della pagina di manuale:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Modificato da Bram Moolenaar <Bram@vim.org>
+.SH NOME
+.I xxd
+\- Produce esadecimale da un file binario o viceversa.
+.SH SINTASSI
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[opzioni] [input_file [output_file]]
+.br
+.B xxd
+\-r[evert] [opzioni] [input_file [output_file]]
+.SH DESCRIZIONE
+.I xxd
+crea un'immagine esadecimale di un dato file o dello "standard input".
+Può anche ottenere da un'immagine esadecimale il file binario originale.
+Come
+.BR uuencode (1)
+e
+.BR uudecode (1)
+permette di trasmettere dati binari in una rappresentazione ASCII "a prova
+di email", ma ha anche il vantaggio di poter decodificare sullo "standard
+output". Inoltre, può essere usato per effettuare delle modifiche (patch)
+a file binari.
+.SH OPZIONI
+Se non si specifica un
+.I input_file
+il programma legge dallo "standard input".
+Se
+.I input_file
+è specificato come il carattere
+.RB \` \- '
+, l'input è letto dallo "standard input".
+Se non si specifica un
+.I output_file
+(o si mette al suo posto il carattere
+.RB \` \- '
+), i risultati sono inviati allo "standard output".
+.PP
+Si noti che la scansione dei caratteri è "pigra", e non controlla oltre
+la prima lettera dell'opzione, a meno che l'opzione sia seguita da un
+parametro.
+Gli spazi fra una singola lettera di opzione e il corrispondente parametro
+dopo di essa sono facoltativi.
+I parametri delle opzioni possono essere specificati usando la notazione
+decimale, esadecimale oppure ottale.
+Pertanto
+.BR \-c8 ,
+.BR "\-c 8" ,
+.B \-c 010
+e
+.B \-cols 8
+sono notazioni equivalenti fra loro.
+.PP
+.TP
+.IR \-a " | " \-autoskip
+Richiesta di autoskip: Un singolo '*' rimpiazza linee di zeri binari.
+Valore di default: off.
+.TP
+.IR \-b " | " \-bits
+Richiesta di una immagine binaria (cifre binarie), invece che esadecimale.
+Questa opzione scrive un byte come otto cifre "1" e "0" invece di usare i
+numeri esadecimali. Ogni linea è preceduta da un indirizzo in esadecimale e
+seguita da una decodifica ascii (o ebcdic). Le opzioni specificabili dalla
+linea comando \-r, \-p, \-i non funzionano in questo modo.
+.TP
+.IR "\-c colonne " | " \-cols colonne"
+.IR "\-c colonne " | " \-cols colonne"
+In ogni linea sono formattate
+.RI < colonne >
+colonne. Valore di default 16 (\-i: 12, \-ps: 30, \-b: 6).
+Valore massimo 256.
+.TP
+.IR \-E " | " \-EBCDIC
+Cambia la codifica della colonna di destra da ASCII a EBCDIC.
+Questo non modifica la rappresentazione esadecimale. Non ha senso
+specificare questa opzione in combinazione con \-r, \-p o \-i.
+.TP
+.IR "\-g numero_byte " | " \-groupsize numero_byte"
+Inserisci ogni
+.RI < numero_byte >
+byte di output (di due caratteri esadecimali o otto numeri binari ognuno)
+uno spazio bianco.
+Specificando
+.I \-g 0
+i byte di output non sono separati da alcuno spazio.
+.RI < numero_byte > ha come valore di default " 2
+in modalità normale [esadecimale] e \fI1\fP in modalità binaria.
+Il raggruppamento non si applica agli stili "PostScript" e "include".
+.TP
+.IR \-h " | " \-help
+stampa un sommario dei comandi disponibili ed esce. Non viene fatto
+null'altro.
+.TP
+.IR \-i " | " \-include
+L'output è nello stile dei file "include" in C. Viene preparata la
+definizione completa di un "array" [vettore], dandogli il nome del
+file di input), tranne che nel caso in cui xxd legga dallo "standard input".
+.TP
+.IR "\-l numero " | " \-len numero"
+Il programma esce dopo aver scritto
+.RI < numero >
+byte.
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+L'output è nello stile di un dump continuo sotto postscript.
+Noto anche come stile esadecimale semplice [plain].
+.TP
+.IR \-r " | " \-revert
+ricostruzione: converte (o mette una patch) a partire dall'immagine
+esadecimale, creando [o modificando] il file binario.
+Se non diretto allo "standard output", xxd scrive nel suo file di output
+in maniera continua, senza interruzioni. Usare la combinazione
+.I \-r \-p
+per leggere dump in stile esadecimale semplice [plain], senza l'informazione
+di numero di linea e senza un particolare tracciato di colonna. Degli spazi
+o delle linee vuote possono essere inserite a piacere [e vengono ignorate].
+.TP
+.I \-seek distanza
+Usato con l'opzione
+.IR \-r :
+(ricostruzione),
+.RI < distanza >
+viene aggiunta alla posizione nel file trovata nella immagine
+esadecimale.
+.TP
+.I \-s [+][\-]seek
+Inizia a
+.RI < seek >
+byte assoluti (o relativi) di distanza all'interno di input_file.
+\fI+ \fRindica che il "seek" è relativo alla posizione corrente nel file
+"standard input" (non significativa quando non si legge da "standard input").
+\fI\- \fRindica che il "seek" dovrebbe posizionarsi ad quel numero di
+caratteri dalla fine dell'input (o se in combinazione con
+\fI+ \fR: prime della posizione corrente nel file "standard input").
+Se non si specifica una opzione \-s, xxd inizia alla posizione
+corrente all'interno del file.
+.TP
+.I \-u
+usa lettere esadecimali maiuscole. Il valore di default è di usare
+lettere minuscole.
+.TP
+.IR \-v " | " \-version
+visualizza la stringa contenente la versione del programma.
+.SH ATTENZIONE
+.PP
+.I xxd \-r
+è capace di operare "magie" nell'utilizzare l'informazione "numero di linea".
+Se sul file di output ci si può posizionare usando la "seek", il numero di
+linea all'inizio di ogni riga esadecimale può essere non ordinato, delle
+linee possono mancare delle linee, oppure esserci delle sovrapposizioni.
+In simili casi xxd userà lseek(2) per raggiungere la posizione d'inizio.
+Se il file di output non consente di usare "seek", sono permessi solo dei
+"buchi", che saranno riempiti con zeri binari.
+.PP
+.I xxd \-r
+non genera mai errori di specifica parametri. I parametri non riconosciuti
+sono silenziosamente ignorati.
+.PP
+Nel modificare immagini esadecimali, tenete conto che
+.I xxd \-r
+salta il resto della linea, dopo aver letto abbastanza caratteri contenenti
+dati esadecimali (vedere opzione \-c). Ciò implica pure che le modifiche alle
+colonne di caratteri stampabili ascii (o ebcdic) sono sempre ignorate.
+La ricostruzione da un file immagine esadecimale in stile semplice
+(postscript) con xxd \-r \-p non dipende dal numero corretto di colonne.
+IN questo caso, qualsiasi cosa assomigli a una coppia di cifre esadecimali
+è interpretata [e utilizzata].
+.PP
+Notare la differenza fra
+.br
+\fI% xxd \-i file\fR
+.br
+e
+.br
+\fI% xxd \-i \< file\fR
+.PP
+.I xxd \-s \+seek
+può comportarsi in modo diverso da
+.IR "xxd \-s seek"
+, perché lseek(2) è usata per tornare indietro nel file di input. Il '+'
+fa differenza se il file di input è lo "standard input", e se la posizione nel
+file di "standard input" non è all'inizio del file quando xxd è eseguito,
+con questo input.
+I seguenti esempi possono contribuire a chiarire il concetto
+(o ad oscurarlo!)...
+.PP
+Riavvolge lo "standard input" prima di leggere; necessario perché `cat'
+ha già letto lo stesso file ["file"] fino alla fine dello "standard input".
+.br
+\fI% sh \-c 'cat > copia_normale; xxd \-s 0 > copia_esadecimale' < file
+.PP
+Stampa immagine esadecimale dalla posizione file 0x480 (=1024+128) in poi.
+Il segno `+' vuol dire "rispetto alla posizione corrente", quindi il `128'
+si aggiunge a 1k (1024) dove `dd' si era fermato.
+.br
+\fI% sh \-c 'dd of=normale bs=1k count=1; xxd \-s +128 > esadecimale' < file
+.PP
+Immagine esadecimale dalla posizione 0x100 ( = 1024\-768 ) del file in avanti.
+.br
+\fI% sh \-c 'dd of=normale bs=1k count=1; xxd \-s +\-768 > esadecimale' < file
+.PP
+Comunque, questo capita raramente, e l'uso del `+' non serve quasi mai.
+L'autore preferisce monitorare il comportamento di xxd con strace(1) o
+truss(1), quando si usa l'opzione \-s.
+.SH ESEMPI
+.PP
+.br
+Stampa tutto tranne le prime tre linee (0x30 byte esadecimali) di
+.B file
+\.
+.br
+\fI% xxd \-s 0x30 file
+.PP
+.br
+Stampa 3 linee (0x30 byte esadecimali) alla fine di
+.B file
+\.
+.br
+\fI% xxd \-s \-0x30 file
+.PP
+.br
+Stampa 120 byte come immagine esadecimale continua con 20 byte per linea.
+.br
+\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR
+
+.br
+2e54482058584420312022417567757374203139
+.br
+39362220224d616e75616c207061676520666f72
+.br
+20787864220a2e5c220a2e5c222032317374204d
+.br
+617920313939360a2e5c22204d616e2070616765
+.br
+20617574686f723a0a2e5c2220202020546f6e79
+.br
+204e7567656e74203c746f6e79407363746e7567
+.br
+
+.br
+Stampa i primi 120 byte della pagina di manuale vim.1 a 12 byte per linea.
+.br
+\fI% xxd \-l 120 \-c 12 xxd.1\fR
+
+
+.br
+0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
+.br
+000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
+.br
+0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
+.br
+0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\\
+.br
+0000030: 220a 2e5c 2220 3231 7374 204d "..\\" 21st M
+.br
+000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\\"
+.br
+0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
+.br
+0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\\"
+.br
+0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
+.br
+000006c: 3c74 6f6e 7940 7363 746e 7567 <tony@sctnug
+.PP
+.br
+Visualizza la data dal file xxd.1
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
+.PP
+.br
+Copiare
+.B input_file
+su
+.B output_file
+premettendogli 100 byte a 0x00.
+.br
+\fI% xxd input_file | xxd \-r \-s 100 \> output_file\fR
+.br
+
+.br
+Modificare (patch) la data nel file xxd.1
+.br
+\fI% echo '0000037: 3574 68' | xxd \-r \- xxd.1\fR
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
+.PP
+.br
+Creare un file di 65537 byte tutto a 0x00,
+tranne che l'ultimo carattere che è una 'A' (esadecimale 0x41).
+.br
+\fI% echo '010000: 41' | xxd \-r \> file\fR
+.PP
+.br
+Stampa una immagine esadecimale del file di cui sopra con opzione autoskip.
+.br
+\fI% xxd \-a \-c 12 file\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+Crea un file di 1 byte che contiene il solo carattere 'A'.
+Il numero dopo '\-r \-s' viene aggiunto a quello trovato nel file;
+in pratica, i byte precedenti non sono stampati.
+.br
+\fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> file\fR
+.PP
+Usa xxd come filtro all'interno di un editor come
+.B vim(1)
+per ottenere una immagine esadecimale di una parte di file
+delimitata dai marcatori `a' e `z'.
+.br
+\fI:'a,'z!xxd\fR
+.PP
+Usare xxd come filtro all'interno di un editor come
+.B vim(1)
+per ricostruire un pezzo di file binario da una immagine esadecimale
+delimitata dai marcatori `a' e `z'.
+.br
+\fI:'a,'z!xxd \-r\fR
+.PP
+Usare xxd come filtro all'interno di un editor come
+.B vim(1)
+per ricostruire una sola linea di file binario da una immagine esadecimale,
+Portare il cursore sopra la linea e battere:
+.br
+\fI!!xxd \-r\fR
+.PP
+Per leggere singoli caratteri da una linea seriale
+.br
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.PP
+.SH CODICI DI RITORNO
+Il programma può restituire questi codici di errore:
+.TP
+0
+nessun errore rilevato.
+.TP
+\-1
+operazione non supportata (
+.I xxd \-r \-i
+non ancora possible).
+.TP
+1
+errore durante la scansione parametri.
+.TP
+2
+problemi con il file di input.
+.TP
+3
+problemi con il file di output.
+.TP
+4,5
+posizione "seek" specificata non raggiungibile all'interno del file.
+.SH VEDERE ANCHE
+uuencode(1), uudecode(1), patch(1)
+.br
+.SH AVVERTIMENTI
+La stranezza dello strumento rispecchia la mente del suo creatore.
+Usate a vostro rischio e pericolo. Copiate i file. Tracciate l'esecuzione.
+Diventate un mago.
+.br
+.SH VERSIONE
+Questa pagina di manuale documenta la versione 1.7 di xxd.
+.SH AUTORE
+.br
+(c) 1990-1997 Juergen Weigert
+.br
+<jnweiger@informatik.uni\-erlangen.de>
+.LP
+Distribuite liberamente ed attribuitemi il credito,
+.br
+fate soldi e condivideteli con me
+.br
+perdete soldi e non venite a chiederli a me.
+.PP
+Pagina di manuale messa in piedi da Tony Nugent
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+Piccole modifiche di Bram Moolenaar.
+Modificato da Juergen Weigert.
+.PP
diff --git a/runtime/doc/xxd-ja.UTF-8.1 b/runtime/doc/xxd-ja.UTF-8.1
new file mode 100644
index 0000000..a03671c
--- /dev/null
+++ b/runtime/doc/xxd-ja.UTF-8.1
@@ -0,0 +1,377 @@
+.TH XXD 1 "August 1996" "Manual page for xxd"
+.\"
+.\" 21st May 1996
+.\" Man page author:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Changes by Bram Moolenaar <Bram@vim.org>
+.SH 名前
+.I xxd
+\- 16 進ダンプを作成したり、元に戻したり。
+.SH 書式
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[options] [infile [outfile]]
+.br
+.B xxd
+\-r[evert] [options] [infile [outfile]]
+.SH 説明
+ファイルや標準入力から 16 進ダンプを作成します。
+16 進ダンプから元のバイナリに戻すこともできます。
+.BR uuencode (1)
+や
+.BR uudecode (1)
+のように、バイナリデータを、メールに貼り付け可能な ASCII 形式に変換できたり、標準出力に出力することもできます。
+さらに、バイナリファイルにパッチを当てるという使い方もできます。
+.SH オプション
+.I infile
+を指定しなかった場合は、標準入力が読み込まれます。
+.I infile
+に
+.RB \` \- '
+を指定した場合も、標準入力から読み込まれます。
+.I outfile
+を指定しなかった (または
+.RB \` \- '
+を指定した) 場合は、標準出力に出力されます。
+.PP
+引数の解釈処理は適当なので注意してください。
+パラメータを取らない引数は最初の一文字だけチェックされます。
+引数の文字とパラメータの間のスペースは省略可能です。
+パラメータは 10 進数、16 進数、8 進数で指定できます。
+.BR \-c8
+、
+.BR "\-c 8"
+、
+.B \-c 010
+、
+.B \-cols 8
+はすべて同じ意味です。
+.PP
+.TP
+.IR \-a " | " \-autoskip
+オートスキップ: 連続した nul 行を一つの '*' で置き換える。
+.TP
+.IR \-b " | " \-bits
+ビット (2進数) ダンプ。
+1 オクテットが "1" と "0" の 8 文字で出力されます。
+各行の行頭には 16 進数の行番号が表示されます。
+行末には ascii (または ebcdic) で表した場合の文字が表示されます。
+このモードでは \-r、\-p、\-i は機能しません。
+.TP
+.IR \-e
+リトルエンディアンの 16 進ダンプに切り替える。
+このオプションは、バイトのグループをリトルエンディアンのバイト順のワードとして扱います。
+標準のグルーピングは 4 バイトですが、
+.RI "" \-g
+を使うことで変更可能です。
+このオプションは 16 進ダンプのみに適用され、ASCII (あるいは EBCDIC)
+表示は変更されません。
+このモードでは \-r、\-p、\-i は機能しません。
+.TP
+.IR "\-c cols " | " \-cols cols"
+一行
+.RI < cols >
+オクテットで出力する。標準設定は 16 (\-i: 12, \-ps: 30, \-b: 6)。最大 256。
+\-ps には最大値がありません。 \-ps 付きの場合、0 を指定すると単一の長い行で出力されます。
+.TP
+.IR \-C " | " \-capitalize
+\-i を使用した際に、C インクルードファイル形式の変数名を大文字にする。
+.TP
+.IR \-E " | " \-EBCDIC
+右端に出力される文字のエンコーディングを ASCII から EBCDIC に変更する。
+16 進ダンプの出力形式は変更されません。
+\-r、\-p、\-i が同時に指定された場合は何の効果もありません。
+.TP
+.IR "\-g bytes " | " \-groupsize bytes"
+出力を
+.RI < bytes >
+バイト (2 文字の 16 進数、または 8 文字の 2 進数) ごとにスペースで区切ります。
+区切らずに出力するには
+.I \-g 0
+を指定してください。
+.RI < Bytes >
+の標準設定は \fI2\fP で、リトルエンディアンモードの場合は \fI4\fP 、
+2 進ダンプの場合は \fI1\fP です。
+ポストスクリプト形式やインクルード形式で出力するときは、このオプションは使われません。
+.TP
+.IR \-h " | " \-help
+コマンドの説明を出力して終了する。変換は実行されません。
+.TP
+.IR \-i " | " \-include
+C インクルードファイル形式で出力します。
+入力ファイルの名前が付けられた静的配列の定義が出力されます。
+標準入力の場合は定義の中身だけ出力されます。
+.TP
+.IR "\-l len " | " \-len len"
+.RI < len >
+オクテットだけ出力する。
+.TP
+.I \-o offset
+表示されるファイル位置に
+.RI < offset >
+を加算する。
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+ポストスクリプト形式の 16 進ダンプを出力する。別名 プレーン 16 進ダンプ。
+.TP
+.IR \-r " | " \-revert
+元に戻す: 16 進ダンプからバイナリ形式に変換 (またはパッチ) します。
+ファイルへ出力する場合、出力先のファイルは切り詰めされません。
+行番号や特定の書式がないプレーン 16 進ダンプを読み込む場合は、
+.I \-r \-p
+を指定してください。空白と改行は無視されます。
+.TP
+.I \-seek offset
+.IR \-r
+の後で使われた場合: 16 進ダンプを出力するファイルの位置に
+.RI < offset >
+を加える。
+.TP
+.I \-s [+][\-]seek
+infile の
+.RI < seek >
+バイト目 (絶対位置、または相対位置) から開始する。
+\fI+ \fRは、現在の標準入力の位置から相対的な位置を示します
+(標準入力から読み込むときのみ意味があります)。
+\fI\- \fRは、入力の終わりからの文字数を示します
+(\fI+\fR と同時に指定した場合は、現在の標準入力の位置から手前の位置を示します)。
+\-s 引数を指定しなかった場合は、現在のファイル位置から開始されます。
+.TP
+.I \-u
+16 進数の表記に大文字を使います。指定がない場合は小文字で出力されます。
+.TP
+.IR \-v " | " \-version
+バージョンを表示します。
+.SH 警告
+.PP
+.I xxd \-r
+では行番号の評価に関しての暗黙のルールがいくつかあります。
+出力ファイルがシーク可能なら、各行の行番号が順番通りに並んでなくても構いません。
+位置が飛んでいても重なっていても大丈夫です。
+その場合、次の位置に移動するために lseek(2) が使われます。
+出力ファイルがシーク不可なら、「隙間」だけが処理可能です。
+隙間は null バイトで埋められます。
+.PP
+.I xxd \-r
+は不正な入力をエラーにしません。ゴミは静かに読み飛ばされます。
+.PP
+16 進ダンプを編集するときは注意が必要です。
+.I xxd \-r
+は必要な桁 (\-c 引数参照) だけ 16 進データを読み込んで、行の残りを無視します。
+つまり、ascii (または ebcdic) を示している列への変更は無視されます。
+xxd \-r \-p でプレーン形式 (ポストスクリプト形式) の 16 進ダンプを元に戻す場合は、列の数は影響しません。
+2 桁の 16 進数と認識できるものはすべて変換されます。
+.PP
+\fI% xxd \-i file\fR
+.br
+と
+.br
+\fI% xxd \-i < file\fR
+.br
+の結果は違います。注意してください。
+.PP
+.I xxd \-s +seek
+と
+.IR "xxd \-s seek" ,
+の違いは、lseek(2) を使って入力を "巻き戻す" かどうかです。'+' が意味を持つのは、入力が標準入力で、xxd
+が起動されたときに標準入力のファイル位置がファイルの先頭ではなかった場合です。
+以下の例が分かりやすいかもしれません (もっと混乱するかも!)...
+.PP
+`cat' が既に標準入力を終わりまで読んでいるので、読む前に標準入力を巻き戻す必要がある。
+.br
+\fI% sh \-c "cat > plain_copy; xxd \-s 0 > hex_copy" < file\fR
+.PP
+ファイル位置 0x480 (=1024+128) 前方から 16 進ダンプする。
+`+' は 「現在地からの相対位置」を意味するので、dd が 1k 処理した後から、さらに `128' 進めます。
+.br
+\fI% sh \-c "dd of=plain_snippet bs=1k count=1; xxd \-s +128 > hex_snippet" < file\fR
+.PP
+ファイル位置 0x100 ( = 1024\-768) から 16 進ダンプする。
+.br
+\fI% sh \-c "dd of=plain_snippet bs=1k count=1; xxd \-s +\-768 > hex_snippet" < file\fR
+.PP
+このような使い方はあまりしませんし、`+' を使うこともほとんどないでしょう。
+\-s を使うときはいつでも、strace(1) や truss(1) を使って、xxd の働きをチェックすることをお勧めします。
+.SH 例
+.PP
+.br
+.BR ファイル
+の最初の三行 (16 進数で 0x30 バイト) 以降を出力する。
+.br
+\fI% xxd \-s 0x30 file\fR
+.PP
+.br
+.BR ファイル
+の最後から三行 (16 進数で 0x30 バイト) を出力する。
+.br
+\fI% xxd \-s \-0x30 file\fR
+.PP
+.br
+120 バイトを、平文 16 進ダンプ形式で一行に 20 オクテットずつ出力する。
+.br
+\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR
+.br
+2e54482058584420312022417567757374203139
+.br
+39362220224d616e75616c207061676520666f72
+.br
+20787864220a2e5c220a2e5c222032317374204d
+.br
+617920313939360a2e5c22204d616e2070616765
+.br
+20617574686f723a0a2e5c2220202020546f6e79
+.br
+204e7567656e74203c746f6e79407363746e7567
+.br
+
+.br
+この man ページの先頭から 120 バイトを一行に 12 オクテットずつ 16 進ダンプする。
+.br
+\fI% xxd \-l 120 \-c 12 xxd.1\fR
+.br
+0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
+.br
+000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
+.br
+0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
+.br
+0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\\
+.br
+0000030: 220a 2e5c 2220 3231 7374 204d "..\\" 21st M
+.br
+000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\\"
+.br
+0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
+.br
+0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\\"
+.br
+0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
+.br
+000006c: 3c74 6f6e 7940 7363 746e 7567 <tony@sctnug
+.PP
+.br
+xxd.1 の日付部分だけを出力する。
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
+.PP
+.br
+.B input_file
+を
+.B output_file
+にコピーし、先頭に 0x00 を 100 バイト分付け加える。
+.br
+\fI% xxd input_file | xxd \-r \-s 100 > output_file\fR
+.br
+
+.br
+xxd.1 の日付を修正する。
+.br
+\fI% echo "0000037: 3574 68" | xxd \-r \- xxd.1\fR
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
+.PP
+.br
+中身がすべて 0x00 の 65537 バイトのファイルを作成する。
+ただし、最後のバイトだけは 'A' (hex 0x41)。
+.br
+\fI% echo "010000: 41" | xxd \-r > file\fR
+.PP
+.br
+作成したファイルをオートスキップを使って 16 進ダンプする。
+.br
+\fI% xxd \-a \-c 12 file\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+一文字の 'A' からなる 1 バイトのファイルを作成する。
+ '\-r \-s' の後に指定した数値がファイル中の行番号に加算され、結果、余計なバイトが飛ばされる。
+.br
+\fI% echo "010000: 41" | xxd \-r \-s \-0x10000 > file\fR
+.PP
+.B vim(1)
+の中から xxd をフィルタとして実行し、
+マークされた `a' から `z' までの領域を 16 進ダンプする。
+.br
+\fI:'a,'z!xxd\fR
+.PP
+.B vim(1)
+の中から xxd をフィルタとして実行し、
+マークされた `a' から `z' までの領域をバイナリに戻す。
+.br
+\fI:'a,'z!xxd \-r\fR
+.PP
+.B vim(1)
+の中から xxd をフィルタとして実行し、16 進ダンプされた行を元に戻す。
+戻したい行にカーソルを移動して:
+.br
+\fI!!xxd \-r\fR
+.PP
+シリアル行から一文字読み込む
+.br
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.PP
+.SH 返り値
+以下のエラー値が返ります:
+.TP
+0
+エラーなし。
+.TP
+\-1
+操作がサポートされていない (
+.I xxd \-r \-i
+はまだ不可です)。
+.TP
+1
+引数の解釈に関するエラー。
+.TP
+2
+入力ファイルに関する問題。
+.TP
+3
+出力ファイルに関する問題。
+.TP
+4,5
+指定された位置へシークできなかった。
+.SH 関連項目
+uuencode(1), uudecode(1), patch(1)
+.br
+.SH 警告
+この奇妙なツールは作者が使いやすいように作られています。
+自己責任で使ってください。ファイルをコピーし、それを調べ、ウィザードたれ。
+.br
+.SH バージョン
+このマニュアルは xxd バージョン 1.7 について説明しています。
+.SH 著者
+.br
+(c) 1990-1997 by Juergen Weigert
+.br
+<jnweiger@informatik.uni\-erlangen.de>
+.LP
+私の功績として自由に配布してください。
+.br
+儲かったら教えてください。
+.br
+損しても知りません。
+.PP
+マニュアルは Tony Nugent
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+によって書かれ、
+Bram Moolenaar が少し変更を加え、
+Juergen Weigert が編集しました。
+.PP
diff --git a/runtime/doc/xxd-pl.1 b/runtime/doc/xxd-pl.1
new file mode 100644
index 0000000..d9fa9be
--- /dev/null
+++ b/runtime/doc/xxd-pl.1
@@ -0,0 +1,389 @@
+.TH XXD 1 "Sierpie 1996" "Strona podrcznika dla xxd"
+.\"
+.\" 21st May 1996
+.\" Man page author:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Changes by Bram Moolenaar <Bram@vim.org>
+.SH NAZWA
+.I xxd
+\- zrzut pliku do hex lub odwrotnie
+.SH SYNOPSIS
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[opcje] [plik_we [plik_wy]]
+.br
+.B xxd
+\-r[evert] [opcje] [plik_we [plik_wy]]
+.SH OPIS
+.I xxd
+tworzy zrzut heksowy podanego pliku lub standardowego wejcia.
+Moe take przetworzy zrzut heksowy z powrotem do oryginalnej,
+binarnej formy.
+Podobnie jak
+.BR uuencode (1)
+i
+.BR uudecode (1)
+pozwala na przekazanie danych binarnych w bezpiecznej w poczcie formie
+ASCII, ale ma zalety dekodowania na standardowe wyjcie.
+Ponadto mona go uy do binarnego atania plikw.
+.SH OPCJE
+Jeli nie podano
+.I plik_we
+xxd czyta ze standardowego wejcia.
+Jeli okrelono
+.I plik_we
+jako znak
+.RB \` \- '
+wtedy dane wejciowe czytane s ze standardowego wejcia.
+Jeli nie podano
+.I plik_wy
+(lub podano jako
+.RB \` \- '
+), wyniki s wysyane na standardowe wyjcie.
+.PP
+Pamitaj, e uyty zosta "leniwy" parser, ktry nie sprawdza wicej
+ni pierwszej litery opcji (o ile ta nie zostaa obdarzona
+parametrem). Spacje midzy jedno literowymi opcjami i ich parametrami
+s opcjonalne. Parametry opcji mog by okrelone w notacji dziesitnej,
+heksadecymalej lub oktalnej.
+Std
+.BR \-c8 ,
+.BR "\-c 8" ,
+.B \-c 010
+i
+.B \-cols 8
+s sobie rwnowane.
+.PP
+.TP
+.IR \-a " | " \-autoskip
+przecza autoskip: pojedyncza '*' zastpuje linie nul. Domylnie
+wyczone.
+.TP
+.IR \-b " | " \-bits
+Przecza do zrzutu bitowego (cyfr binarnych) zamiast heksowego.
+Opcja ta zapisuje oktety jako osiem cyfr 1 lub 0 zamiast normalnego
+zrzutu heksowego. Kada linia jest poprzedzona przez
+heksadecymalny numer linii a po nim jego reprezentacj w ascii (lub
+ebcdic). Opcje linii polece \-r, \-p, \-i nie dziaaj w tym
+trybie.
+.TP
+.IR "\-c cols " | " \-cols cols"
+formatuje liczb
+.RI < cols >
+oktetw na wiersz. Domylnie 16 (\-i: 12, \-ps: 30, \-b: 6). Maks.
+256.
+.TP
+.IR \-E " | "\-EBCDIC
+zmienia kodowanie znakw w prawej kolumnie z ASCII na EBCDIC.
+Nie zmienia prezentacji heksadecymalej. Opcja nie dziaa w poczeniu
+z \-r, \-p lub \-i.
+.TP
+.IR "\-g bajtw " | " \-groupsize bajtw"
+oddziela wyjcie kadych
+.RI < bajtw >
+bajtw (dwa heksowe znaki lub osiem cyfr binarnych kade) przez biay
+znak.
+Okrel
+.I \-g 0
+by wyczy grupowanie.
+.RI < Bajtw "> domylnie jest " 2
+w trybie normalnym i \fI1\fP w trybie bitw.
+Grupowanie nie dziaa w trybie postscriptu lub wczania.
+.TP
+.IR \-h " | " \-help
+wypisuje podsumowanie dostpnych polece i koczy dziaanie. Nie
+zostaje przeprowadzony aden zrzut.
+.TP
+.IR \-i " | " \-include
+wyjcie w stylu wczania pliku w C. Zostaje zapisana kompletna
+statyczna tablica definicji (nazwana wedug pliku wejcia), o ile xxd
+nie czyta ze standardowego wejcia.
+.TP
+.IR "\-l len " | "\-len len"
+zakocz po wypisaniu
+.RI < len >
+oktetw.
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+wyjcie w postcriptowym cigym stylu zrzutu heksowego. Znany take
+jako zwyky zrzut heksowy.
+.TP
+.IR \-r " | " \-revert
+odwr operacj: przekonwertuj (lub zaataj) zrzut heksowy w binark.
+Jeli nie zapisuje na standardowe wyjcie, xxd zapisze plik wyjciowy
+bez obcinania go. Uyj kombinacji
+.I \-r \-p
+by odczyta zwyky zrzut heksadecymalny bez numerw linii
+i okrelonego ukadu kolumn. Dodatkowe biae znaki i amanie wierszy
+s wszdzie dozwolone.
+.TP
+.I \-seek offset
+Kiedy uyty po
+.IR \-r :
+odwraca z
+.RI < offset >
+dodanym do pozycji w pliku odnalezionym w zrzucie heksowym.
+.TP
+.I \-s [+][\-]seek
+zaczyna na
+.RI < seek >
+bajtw bezwgldnego (lub wzgldnego) offsetu pliku wejciowego.
+\fI+ \fRwskazuje, e seek jest wzgldne do biecej pozycji pliku (bez
+znaczenia jeli nie wczytuje ze standardowego wejcia). \fI\- \fRwskazuje
+e seek powinno by o tyle znakw od koca wejcia (lub jeli
+poczone z \fI+\fR: przed biec pozycj pliku na standardowym
+wejciu).
+Bez opcji \-s xxd zaczyna od biecej pozycji w pliku.
+.TP
+.I \-u
+uyj wielkich liter w znakach heksowych. Domylnie s mae znaki.
+.TP
+.IR \-v " | " \-version
+pokazuje wersj programu.
+.SH OSTRZEENIA
+.PP
+.I xxd \-r
+potrafi okreli numery linii. Jeli plik wyjcia jest moliwy do
+przeszukania wtedy numery linii na pocztku wiersza zrzutu heksowego
+mog by nie po kolei, moe brakowa wierszy lub nakada si na
+siebie. W takich wypadkach xxd uyje lseek(2) by znale nastpn
+pozycj. Jeli plik wyjciowy nie jest moliwy do przeszukania moliwe
+s tylko przerwy, ktre zostan wypenione bajtami null.
+.PP
+.I xxd \-r
+nigdy nie podaje bdw analizy. mieci s po cichu ignorowane.
+.PP
+W czasie edycji zrzutw heksowych, prosz zauway e
+.I xxd \-r
+pomija wszystko w linii wejcia po odczytaniu wystarczajcej iloci
+kolumn danych heksadecymalnych (zobacz opcj \-c). Oznacza to take,
+e zmiany w drukowanych kolumnach ascii (lub ebcdic) s zawsze
+ignorowane. Odwrcenie zwykego (lub postscriptowego) stylu zrzutu
+poprzez xxd \-r \-p nie zaley od kolejnoci kolumn. Tutaj cokolwiek
+co wyglda jak para znakw heks jest interpretowane.
+.PP
+Zauwa rnic midzy
+.br
+\fI% xxd \-i plik\fR
+.br
+i
+.br
+\fI% xxd \-i < plik\fR
+.PP
+.I xxd \-s \+seek
+moe by rne od
+.IR "xxd \-s seek" ,
+poniewa lseek(2) jest uyty do "przewinicie" wejcia. '+' stanowi
+rnic jeli rdem wejcia jest standardowe wejcie i jeli pozycja
+w pliku ze standardowego wejcia nie jest pocztkiem pliku w chwili
+uruchomienia xxd. Nastpujce przykady mog wyjani (lub bardziej
+zmyli!)...
+.PP
+Przewi standardowe wejcie przed przeczytaniem; potrzebne poniewa
+`cat' ju odczyta do koca standardowego wejcia.
+.br
+\fI% sh \-c 'cat > zwyka_kopia; xxd \-s 0 > hex_kopia' < plik\fR
+.PP
+Zrzut heksowy od pozycji pliku 0x480 (=1024+128) w przd.
+Znak `+' oznacza "wzgldny wobec biecej pozycji", std `128' dodaje
+do 1k gdzie zakoczy dd.
+.br
+\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +128 > hex_snippet' < file\fR
+.PP
+Zrzut heksowy od pozycji pliku 0x100 ( = 1024\-768) dalej.
+.br
+\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +-768 > hex_snippet' < file\fR
+.PP
+Jakkolwiek, jest to rzadka sytuacja i uycie `+' jest rzadko
+potrzebne.
+Autor woli monitorowa dziaanie xxd przy pomocy strace(1) lub truss(1) kiedy \-s jest uyte.
+.SH PRZYKADY
+.PP
+.br
+Wypisz wszystko z wyjtkiem pierwszych trzech linii (heksowe 0x30 bajtw)
+.B pliku
+\.
+.br
+\fI% xxd \-s 0x30 plik\fR
+.PP
+.br
+Wypisz trzy linie (heksowe 0x30 bajtw) z koca
+.B pliku
+\.
+.br
+\fI% xxd \-s \-0x30 plik\fR
+.PP
+.br
+Wypisz 120 bajtw jako cigy zrzut heksowy z 20 oktetami na lini.
+.br
+\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR
+.br
+2e54482058584420312022417567757374203139
+.br
+39362220224d616e75616c207061676520666f72
+.br
+20787864220a2e5c220a2e5c222032317374204d
+.br
+617920313939360a2e5c22204d616e2070616765
+.br
+20617574686f723a0a2e5c2220202020546f6e79
+.br
+204e7567656e74203c746f6e79407363746e7567
+.br
+
+.br
+Zrzut heksowy z pierwszymi 120 bajtami tej strony podrcznika z 12
+oktetami na lini.
+.br
+\fI% xxd \-l 120 \-c 12 xxd.1\fR
+.br
+0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
+.br
+000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
+.br
+0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
+.br
+0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\\
+.br
+0000030: 220a 2e5c 2220 3231 7374 204d "..\\" 21st M
+.br
+000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\\"
+.br
+0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
+.br
+0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\\"
+.br
+0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
+.br
+000006c: 3c74 6f6e 7940 7363 746e 7567 <tony@sctnug
+.PP
+.br
+Poka tylko dat z pliku xxd.1
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
+.PP
+.br
+Kopiuj
+.B plik_we
+do
+.B plik_wy
+i poprzed 100 bajtami o wartoci 0x00.
+.br
+\fI% xxd plik_we | xxd \-r \-s 100 \> plik_wy\fR
+.br
+
+.br
+Podmie dat w pliku xxd.1
+.br
+\fI% echo '0000037: 3574 68' | xxd \-r \- xxd.1\fR
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
+.PP
+.br
+Utwrz plik o 65537 bajtach, wszystkich rwnych 0x00,
+z wyjtkiem ostatniego, ktry ma by 'A' (hex 0x41).
+.br
+\fI% echo '010000: 41' | xxd \-r \> plik\fR
+.PP
+.br
+Zrzut heksowy tego pliku z autoskipem.
+.br
+\fI% xxd \-a \-c 12 plik\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+Utwrz jedno bajtowy plik zawierajcy pojedncz liter 'A'.
+Liczba po '\-r \-s' dodaje numery linii znalezione w pliku;
+w efekcie poprzedzajce bajty s ukryte.
+.br
+\fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> plik\fR
+.PP
+Uyj xxd jako filtra wewntrz edytora takiego jak
+.B vim(1)
+aby uzyska zrzut heksowy zakresu midzy markerami `a' i `z'.
+.br
+\fI:'a,'z!xxd\fR
+.PP
+Uyj xxd jako filtra wewntrz edytora takiego jak
+.B vim(1)
+by odzyska binarny zrzut heksowy zakresu pomidzy markerami `a'
+i `z'.
+.br
+\fI:'a,'z!xxd \-r\fR
+.PP
+Uyj xxd jako filtra wewntrz edytora takiego jak
+.B vim(1)
+by odzyska jedn lini zrzutu heksowego. Przejd z kursorem na lini
+i wpisz:
+.br
+\fI!!xxd \-r\fR
+.PP
+Odczytaj pojednycze znaki z portu szeregowego
+.br
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.PP
+.SH "ZWRACANE WARTOCI"
+Zwracane s nastpujce wartoci bdw:
+.TP
+0
+nie znaleziono bdw.
+.TP
+\-1
+operacja nie jest wspierana (
+.I xxd \-r \-i
+cay czas niemoliwa).
+.TP
+1
+bd w czasie analizowania opcji.
+.TP
+2
+problemy z plikiem wejciowym.
+.TP
+3
+problemy z plikiem wyjciowym.
+.TP
+4,5
+dana pozycja jest nieosigalna.
+.SH "ZOBACZ TAKE"
+uuencode(1), uudecode(1), patch(1)
+.br
+.SH OSTRZEENIA
+Dziwaczno narzdzi dorwnuje dziwacznoci mzgu twrcy.
+Uywaj wycznie na wasn odpowiedzialno. Kopiuj pliki. Analizuj
+je. Sta si czarodziejem.
+.br
+.SH WERSJA
+Strona podrcznika opisuje xxd w wersji 1.7
+.SH AUTOR
+.br
+(c) 1990-1997 by Juergen Weigert
+.br
+<jnweiger@informatik.uni-erlangen.de>
+.LP
+Kopiuj do woli i podaj moje dane,
+.br
+zarabiaj pienidze i dziel si ze mn,
+.br
+tra pienidze i nie miej do mnie pretensji.
+.PP
+Strona podrcznika zapocztkowana przez Tony'ego Nugenta
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+Mae zmiany: Bram Moolenaar.
+Redakcja: Juergen Weigert.
+.PP
diff --git a/runtime/doc/xxd-pl.UTF-8.1 b/runtime/doc/xxd-pl.UTF-8.1
new file mode 100644
index 0000000..e63ce64
--- /dev/null
+++ b/runtime/doc/xxd-pl.UTF-8.1
@@ -0,0 +1,389 @@
+.TH XXD 1 "Sierpień 1996" "Strona podręcznika dla xxd"
+.\"
+.\" 21st May 1996
+.\" Man page author:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Changes by Bram Moolenaar <Bram@vim.org>
+.SH NAZWA
+.I xxd
+\- zrzut pliku do hex lub odwrotnie
+.SH SYNOPSIS
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[opcje] [plik_we [plik_wy]]
+.br
+.B xxd
+\-r[evert] [opcje] [plik_we [plik_wy]]
+.SH OPIS
+.I xxd
+tworzy zrzut heksowy podanego pliku lub standardowego wejścia.
+Może także przetworzyć zrzut heksowy z powrotem do oryginalnej,
+binarnej formy.
+Podobnie jak
+.BR uuencode (1)
+i
+.BR uudecode (1)
+pozwala na przekazanie danych binarnych w bezpiecznej w poczcie formie
+ASCII, ale ma zalety dekodowania na standardowe wyjście.
+Ponadto można go użyć do binarnego łatania plików.
+.SH OPCJE
+Jeśli nie podano
+.I plik_we
+xxd czyta ze standardowego wejścia.
+Jeśli określono
+.I plik_we
+jako znak
+.RB \` \- '
+wtedy dane wejściowe czytane są ze standardowego wejścia.
+Jeśli nie podano
+.I plik_wy
+(lub podano jako
+.RB \` \- '
+), wyniki są wysyłane na standardowe wyjście.
+.PP
+Pamiętaj, że użyty został "leniwy" parser, który nie sprawdza więcej
+niż pierwszej litery opcji (o ile ta nie została obdarzona
+parametrem). Spacje między jedno literowymi opcjami i ich parametrami
+są opcjonalne. Parametry opcji mogą być określone w notacji dziesiętnej,
+heksadecymalej lub oktalnej.
+Stąd
+.BR \-c8 ,
+.BR "\-c 8" ,
+.B \-c 010
+i
+.B \-cols 8
+są sobie równoważne.
+.PP
+.TP
+.IR \-a " | " \-autoskip
+przełącza autoskip: pojedyncza '*' zastępuje linie nul. Domyślnie
+wyłączone.
+.TP
+.IR \-b " | " \-bits
+Przełącza do zrzutu bitowego (cyfr binarnych) zamiast heksowego.
+Opcja ta zapisuje oktety jako osiem cyfr 1 lub 0 zamiast normalnego
+zrzutu heksowego. Każda linia jest poprzedzona przez
+heksadecymalny numer linii a po nim jego reprezentacją w ascii (lub
+ebcdic). Opcje linii poleceń \-r, \-p, \-i nie działają w tym
+trybie.
+.TP
+.IR "\-c cols " | " \-cols cols"
+formatuje liczbę
+.RI < cols >
+oktetów na wiersz. Domyślnie 16 (\-i: 12, \-ps: 30, \-b: 6). Maks.
+256.
+.TP
+.IR \-E " | "\-EBCDIC
+zmienia kodowanie znaków w prawej kolumnie z ASCII na EBCDIC.
+Nie zmienia prezentacji heksadecymalej. Opcja nie działa w połączeniu
+z \-r, \-p lub \-i.
+.TP
+.IR "\-g bajtów " | " \-groupsize bajtów"
+oddziela wyjście każdych
+.RI < bajtów >
+bajtów (dwa heksowe znaki lub osiem cyfr binarnych każde) przez biały
+znak.
+Określ
+.I \-g 0
+by wyłączyć grupowanie.
+.RI < Bajtów "> domyślnie jest " 2
+w trybie normalnym i \fI1\fP w trybie bitów.
+Grupowanie nie działa w trybie postscriptu lub włączania.
+.TP
+.IR \-h " | " \-help
+wypisuje podsumowanie dostępnych poleceń i kończy działanie. Nie
+zostaje przeprowadzony żaden zrzut.
+.TP
+.IR \-i " | " \-include
+wyjście w stylu włączania pliku w C. Zostaje zapisana kompletna
+statyczna tablica definicji (nazwana według pliku wejścia), o ile xxd
+nie czyta ze standardowego wejścia.
+.TP
+.IR "\-l len " | "\-len len"
+zakończ po wypisaniu
+.RI < len >
+oktetów.
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+wyjście w postcriptowym ciągłym stylu zrzutu heksowego. Znany także
+jako zwykły zrzut heksowy.
+.TP
+.IR \-r " | " \-revert
+odwróć operację: przekonwertuj (lub załataj) zrzut heksowy w binarkę.
+Jeśli nie zapisuje na standardowe wyjście, xxd zapisze plik wyjściowy
+bez obcinania go. Użyj kombinacji
+.I \-r \-p
+by odczytać zwykły zrzut heksadecymalny bez numerów linii
+i określonego układu kolumn. Dodatkowe białe znaki i łamanie wierszy
+są wszędzie dozwolone.
+.TP
+.I \-seek offset
+Kiedy użyty po
+.IR \-r :
+odwraca z
+.RI < offset >
+dodanym do pozycji w pliku odnalezionym w zrzucie heksowym.
+.TP
+.I \-s [+][\-]seek
+zaczyna na
+.RI < seek >
+bajtów bezwględnego (lub względnego) offsetu pliku wejściowego.
+\fI+ \fRwskazuje, że seek jest względne do bieżącej pozycji pliku (bez
+znaczenia jeśli nie wczytuje ze standardowego wejścia). \fI\- \fRwskazuje
+że seek powinno być o tyle znaków od końca wejścia (lub jeśli
+połączone z \fI+\fR: przed bieżącą pozycją pliku na standardowym
+wejściu).
+Bez opcji \-s xxd zaczyna od bieżącej pozycji w pliku.
+.TP
+.I \-u
+użyj wielkich liter w znakach heksowych. Domyślnie są małe znaki.
+.TP
+.IR \-v " | " \-version
+pokazuje wersję programu.
+.SH OSTRZEŻENIA
+.PP
+.I xxd \-r
+potrafi określić numery linii. Jeśli plik wyjścia jest możliwy do
+przeszukania wtedy numery linii na początku wiersza zrzutu heksowego
+mogą być nie po kolei, może brakować wierszy lub nakładać się na
+siebie. W takich wypadkach xxd użyje lseek(2) by znaleźć następną
+pozycję. Jeśli plik wyjściowy nie jest możliwy do przeszukania możliwe
+są tylko przerwy, które zostaną wypełnione bajtami null.
+.PP
+.I xxd \-r
+nigdy nie podaje błędów analizy. Śmieci są po cichu ignorowane.
+.PP
+W czasie edycji zrzutów heksowych, proszę zauważyć że
+.I xxd \-r
+pomija wszystko w linii wejścia po odczytaniu wystarczającej ilości
+kolumn danych heksadecymalnych (zobacz opcję \-c). Oznacza to także,
+że zmiany w drukowanych kolumnach ascii (lub ebcdic) są zawsze
+ignorowane. Odwrócenie zwykłego (lub postscriptowego) stylu zrzutu
+poprzez xxd \-r \-p nie zależy od kolejności kolumn. Tutaj cokolwiek
+co wygląda jak para znaków heks jest interpretowane.
+.PP
+Zauważ różnicę między
+.br
+\fI% xxd \-i plik\fR
+.br
+i
+.br
+\fI% xxd \-i < plik\fR
+.PP
+.I xxd \-s \+seek
+może być różne od
+.IR "xxd \-s seek" ,
+ponieważ lseek(2) jest użyty do "przewinięcie" wejścia. '+' stanowi
+różnicę jeśli źródłem wejścia jest standardowe wejście i jeśli pozycja
+w pliku ze standardowego wejścia nie jest początkiem pliku w chwili
+uruchomienia xxd. Następujące przykłady mogą wyjaśnić (lub bardziej
+zmylić!)...
+.PP
+Przewiń standardowe wejście przed przeczytaniem; potrzebne ponieważ
+`cat' już odczytał do końca standardowego wejścia.
+.br
+\fI% sh \-c 'cat > zwykła_kopia; xxd \-s 0 > hex_kopia' < plik\fR
+.PP
+Zrzut heksowy od pozycji pliku 0x480 (=1024+128) w przód.
+Znak `+' oznacza "względny wobec bieżącej pozycji", stąd `128' dodaje
+do 1k gdzie zakończył dd.
+.br
+\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +128 > hex_snippet' < file\fR
+.PP
+Zrzut heksowy od pozycji pliku 0x100 ( = 1024\-768) dalej.
+.br
+\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +-768 > hex_snippet' < file\fR
+.PP
+Jakkolwiek, jest to rzadka sytuacja i użycie `+' jest rzadko
+potrzebne.
+Autor woli monitorować działanie xxd przy pomocy strace(1) lub truss(1) kiedy \-s jest użyte.
+.SH PRZYKŁADY
+.PP
+.br
+Wypisz wszystko z wyjątkiem pierwszych trzech linii (heksowe 0x30 bajtów)
+.B pliku
+\.
+.br
+\fI% xxd \-s 0x30 plik\fR
+.PP
+.br
+Wypisz trzy linie (heksowe 0x30 bajtów) z końca
+.B pliku
+\.
+.br
+\fI% xxd \-s \-0x30 plik\fR
+.PP
+.br
+Wypisz 120 bajtów jako ciągły zrzut heksowy z 20 oktetami na linię.
+.br
+\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR
+.br
+2e54482058584420312022417567757374203139
+.br
+39362220224d616e75616c207061676520666f72
+.br
+20787864220a2e5c220a2e5c222032317374204d
+.br
+617920313939360a2e5c22204d616e2070616765
+.br
+20617574686f723a0a2e5c2220202020546f6e79
+.br
+204e7567656e74203c746f6e79407363746e7567
+.br
+
+.br
+Zrzut heksowy z pierwszymi 120 bajtami tej strony podręcznika z 12
+oktetami na linię.
+.br
+\fI% xxd \-l 120 \-c 12 xxd.1\fR
+.br
+0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
+.br
+000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
+.br
+0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
+.br
+0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\\
+.br
+0000030: 220a 2e5c 2220 3231 7374 204d "..\\" 21st M
+.br
+000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\\"
+.br
+0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
+.br
+0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\\"
+.br
+0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
+.br
+000006c: 3c74 6f6e 7940 7363 746e 7567 <tony@sctnug
+.PP
+.br
+Pokaż tylko datę z pliku xxd.1
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
+.PP
+.br
+Kopiuj
+.B plik_we
+do
+.B plik_wy
+i poprzedź 100 bajtami o wartości 0x00.
+.br
+\fI% xxd plik_we | xxd \-r \-s 100 \> plik_wy\fR
+.br
+
+.br
+Podmień datę w pliku xxd.1
+.br
+\fI% echo '0000037: 3574 68' | xxd \-r \- xxd.1\fR
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
+.PP
+.br
+Utwórz plik o 65537 bajtach, wszystkich równych 0x00,
+z wyjątkiem ostatniego, który ma być 'A' (hex 0x41).
+.br
+\fI% echo '010000: 41' | xxd \-r \> plik\fR
+.PP
+.br
+Zrzut heksowy tego pliku z autoskipem.
+.br
+\fI% xxd \-a \-c 12 plik\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+Utwórz jedno bajtowy plik zawierający pojednczą literę 'A'.
+Liczba po '\-r \-s' dodaje numery linii znalezione w pliku;
+w efekcie poprzedzające bajty są ukryte.
+.br
+\fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> plik\fR
+.PP
+Użyj xxd jako filtra wewnątrz edytora takiego jak
+.B vim(1)
+aby uzyskać zrzut heksowy zakresu między markerami `a' i `z'.
+.br
+\fI:'a,'z!xxd\fR
+.PP
+Użyj xxd jako filtra wewnątrz edytora takiego jak
+.B vim(1)
+by odzyskać binarny zrzut heksowy zakresu pomiędzy markerami `a'
+i `z'.
+.br
+\fI:'a,'z!xxd \-r\fR
+.PP
+Użyj xxd jako filtra wewnątrz edytora takiego jak
+.B vim(1)
+by odzyskać jedną linię zrzutu heksowego. Przejdź z kursorem na linię
+i wpisz:
+.br
+\fI!!xxd \-r\fR
+.PP
+Odczytaj pojednycze znaki z portu szeregowego
+.br
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.PP
+.SH "ZWRACANE WARTOŚCI"
+Zwracane są następujące wartości błędów:
+.TP
+0
+nie znaleziono błędów.
+.TP
+\-1
+operacja nie jest wspierana (
+.I xxd \-r \-i
+cały czas niemożliwa).
+.TP
+1
+błąd w czasie analizowania opcji.
+.TP
+2
+problemy z plikiem wejściowym.
+.TP
+3
+problemy z plikiem wyjściowym.
+.TP
+4,5
+żądana pozycja jest nieosiągalna.
+.SH "ZOBACZ TAKŻE"
+uuencode(1), uudecode(1), patch(1)
+.br
+.SH OSTRZEŻENIA
+Dziwaczność narzędzi dorównuje dziwaczności mózgu twórcy.
+Używaj wyłącznie na własną odpowiedzialność. Kopiuj pliki. Analizuj
+je. Stań się czarodziejem.
+.br
+.SH WERSJA
+Strona podręcznika opisuje xxd w wersji 1.7
+.SH AUTOR
+.br
+(c) 1990-1997 by Juergen Weigert
+.br
+<jnweiger@informatik.uni-erlangen.de>
+.LP
+Kopiuj do woli i podaj moje dane,
+.br
+zarabiaj pieniądze i dziel się ze mną,
+.br
+trać pieniądze i nie miej do mnie pretensji.
+.PP
+Strona podręcznika zapoczątkowana przez Tony'ego Nugenta
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+Małe zmiany: Bram Moolenaar.
+Redakcja: Juergen Weigert.
+.PP
diff --git a/runtime/doc/xxd-ru.1 b/runtime/doc/xxd-ru.1
new file mode 100644
index 0000000..111946a
--- /dev/null
+++ b/runtime/doc/xxd-ru.1
@@ -0,0 +1,408 @@
+.TH XXD 1 "August 1996" " man xxd"
+.\"
+.\" 21st May 1996
+.\" Man page author:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Changes by Bram Moolenaar <Bram@vim.org>
+.SH
+.I xxd
+\-
+ .
+.SH
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[] [_ [_]]
+.br
+.B xxd
+\-r[evert] [] [_ [_]]
+.SH
+.I xxd
+ ,
+ , .
+
+ .
+
+.BR uuencode(1)
+
+.BR uudecode(1),
+ ASCII-,
+ , , ,
+xxd ,
+ .
+.SH
+
+.I _
+ , .
+ ,
+.I _
+
+.RB \` \- ',
+ .
+ ,
+.I _
+(
+.RB \` \- '
+), .
+.PP
+ , "" ,
+ , .
+
+. ,
+ .
+ ,
+.BR \-c8 ,
+.BR "\-c 8" ,
+.B \-c 010
+
+.B \-cols 8
+ .
+.PP
+.TP
+.IR \-a " | " \-autoskip
+ :
+ '*'.
+ .
+.TP
+.IR \-b " | " \-bits
+ ( ).
+
+ "1" "0".
+ ,
+ ( ascii ebcdic). \-r, \-p, \-i
+ .
+.TP
+.IR "\-c " | " \-cols "
+
+.RI < >,
+ . 16
+(\-i: 12, \-ps: 30, \-b: 6).
+ : 256.
+.TP
+.IR \-E " | " \-EBCDIC
+ ASCII EBCDIC.
+ . ,
+ \-r, \-p \-i.
+.TP
+.IR "\-g " | " \-groupsize "
+
+.RI < >
+( ), .
+
+.I \-g 0
+ .
+
+.RI < "> " 2
+ \fI1\fP .
+ postscript include.
+.TP
+.IR \-h " | " \-help
+ .
+ .
+.TP
+.IR \-i " | " \-include
+ C.
+ ,
+ , xxd
+.
+.TP
+.IR "\-l " | " \-len "
+
+.RI < >
+ .
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+ ,
+ "" "postscript".
+.TP
+.IR \-r " | " \-revert
+ :
+ ( ).
+ , xxd
+ .
+.I \-r \-p
+ ""
+ - .
+ .
+.TP
+.I \-seek
+
+.I \-r
+:
+.RI < >
+ , .
+.TP
+.I \-s [\+][\-]seek
+ ( )
+.RI < >
+ _.
+\fI\+ \fR,
+ (,
+ ). \fI\- \fR,
+ (, \fI \+ \fR:
+ ).
+ \-s , xxd .
+.TP
+.I \-u
+ .
+ .
+.TP
+.IR \-v " | " \-version
+ .
+.SH
+.PP
+.I xxd \-r
+ .
+ ,
+ ,
+ . xxd
+lseek(2) .
+, ,
+.
+.PP
+.I xxd \-r
+ . .
+.PP
+
+,
+.I xxd \-r
+
+ (. \-c). , ,
+ ascii ( ebcdic), .
+
+postscript xxd \-r \-p .
+ , .
+.PP
+
+.PP
+\fI% xxd \-i \fR
+.PP
+
+.PP
+\fI% xxd \-i \< \fR
+.PP
+
+.I xxd \-s \+seek
+
+.I xxd \-s seek,
+ , "" , lseek(2).
+ `+' ,
+ ,
+ , xxd .
+ ( ݣ !) ...
+.PP
+ ; , 'cat'
+ :
+.PP
+\fI% sh \-c 'cat > plain_copy; xxd \-s 0 > hex_copy' < file
+.PP
+ 0x480
+(= 1024+128).
+ `+' " ", `128'
+ , dd:
+.PP
+\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +128 > hex_snippet' < file
+.PP
+ 0x100
+(= 1024-768):
+.PP
+\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +-768 > hex_snippet' < file
+.PP
+ , , ,
+ `+' .
+xxd strace(1) truss(1) ,
+\-s.
+.SH
+.PP
+.br
+ ӣ, ң (0x30 )
+.B file
+:
+.PP
+\fI% xxd \-s 0x30 file
+.PP
+.br
+ (0x30 )
+.B file
+:
+.PP
+\fI% xxd \-s \-0x30 file
+.PP
+.br
+ 120
+ 20 :
+.PP
+\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR
+.br
+2e544820585844203120224d616e75616c207061
+.br
+676520666f7220787864220a2e5c220a2e5c2220
+.br
+32317374204d617920313939360a2e5c22204d61
+.br
+6e207061676520617574686f723a0a2e5c222020
+.br
+2020546f6e79204e7567656e74203c746f6e7940
+.br
+7363746e7567656e2e7070702e67752e6564752e
+.br
+.PP
+.br
+ 120 12 :
+.PP
+\fI% xxd \-l 120 \-c 12 xxd.1\fR
+.br
+0000000: 2e54 4820 5858 4420 3120 224d .TH XXD 1 "M
+.br
+000000c: 616e 7561 6c20 7061 6765 2066 anual page f
+.br
+0000018: 6f72 2078 7864 220a 2e5c 220a or xxd"..\\".
+.br
+0000024: 2e5c 2220 3231 7374 204d 6179 .\\" 21st May
+.br
+0000030: 2031 3939 360a 2e5c 2220 4d61 1996..\\" Ma
+.br
+000003c: 6e20 7061 6765 2061 7574 686f n page autho
+.br
+0000048: 723a 0a2e 5c22 2020 2020 546f r:..\\" To
+.br
+0000054: 6e79 204e 7567 656e 7420 3c74 ny Nugent <t
+.br
+0000060: 6f6e 7940 7363 746e 7567 656e ony@sctnugen
+.br
+000006c: 2e70 7070 2e67 752e 6564 752e .ppp.gu.edu.
+.PP
+.br
+ xxd.1:
+.PP
+\fI% xxd \-s 0x28 \-l 12 \-c 12 xxd.1\fR
+.br
+0000028: 3231 7374 204d 6179 2031 3939 21st May 199
+.PP
+.br
+
+.B _
+
+.B _
+ 100 0x00 :
+.PP
+\fI% xxd _ | xxd \-r \-s 100 \> _\fR
+.br
+.PP
+.br
+ xxd.1:
+.PP
+\fI% echo '0000029: 3574 68' | xxd \-r \- xxd.1\fR
+.br
+\fI% xxd \-s 0x28 \-l 12 \-c 12 xxd.1\fR
+.br
+0000028: 3235 7468 204d 6179 2031 3939 25th May 199
+.PP
+.br
+ 65537- ,
+0x00, , 'A'
+(0x41):
+.PP
+\fI% echo '010000: 41' | xxd \-r \> file\fR
+.PP
+.br
+
+ :
+.PP
+\fI% xxd \-a \-c 12 file\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+ 1- , 'A'.
+ '\-r \-s' , ;
+ , :
+.PP
+\fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> file\fR
+.PP
+xxd ,
+.B vim(1),
+
+ `a' `z':
+.PP
+\fI:'a,'z!xxd\fR
+.PP
+ xxd ,
+.B vim(1),
+
+ `a' `z':
+.PP
+\fI:'a,'z!xxd \-r\fR
+.PP
+ xxd ,
+.B vim(1),
+
+ .
+
+.PP
+\fI!!xxd \-r\fR
+.PP
+ :
+.PP
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.PP
+.SH
+ xxd :
+.TP
+0
+ .
+.TP
+\-1
+ (
+.I xxd \-r \-i
+ ).
+.TP
+1
+ .
+.TP
+2
+ .
+.TP
+3
+ .
+.TP
+4,5
+ .
+.SH
+uuencode(1), uudecode(1), patch(1)
+.br
+.SH
+ ţ .
+ ţ . ,
+, .
+.br
+.SH
+ xxd 1.7.
+.SH
+.br
+(c) 1990-1997 (Juergen Weigert)
+.br
+<jnweiger@informatik.uni-erlangen.de>
+.LP
+ .
+.br
+ - ,
+ .
+.br
+ , ޣ.
+.PP
+ (Tony Nugent)
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+ (Bram Moolenaar).
+ (Juergen Weigert).
+.PP
diff --git a/runtime/doc/xxd-ru.UTF-8.1 b/runtime/doc/xxd-ru.UTF-8.1
new file mode 100644
index 0000000..647845b
--- /dev/null
+++ b/runtime/doc/xxd-ru.UTF-8.1
@@ -0,0 +1,408 @@
+.TH XXD 1 "August 1996" "Страница man для xxd"
+.\"
+.\" 21st May 1996
+.\" Man page author:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Changes by Bram Moolenaar <Bram@vim.org>
+.SH ИМЯ
+.I xxd
+\- создаёт представление файла в виде шестнадцатеричных кодов или выполняет
+обратное преобразование.
+.SH КОМАНДНАЯ СТРОКА
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[ключи] [входной_файл [выходной_файл]]
+.br
+.B xxd
+\-r[evert] [ключи] [входной_файл [выходной_файл]]
+.SH ОПИСАНИЕ
+.I xxd
+создаёт представление указанного файла или данных, прочитанных из потока
+стандартного ввода, в виде шестнадцатеричных кодов. Эта команда также может
+выполнить обратное преобразование заданных шестнадцатеричными кодами данных
+в исходный бинарный формат.
+Подобно командам
+.BR uuencode(1)
+.BR uudecode(1),
+она позволяет выполнять преобразование бинарных данных в ASCII-код,
+который можно передавать по электронной почте, однако, помимо этого, программа
+xxd позволяет выполнять декодирование в поток стандартного вывода,
+а также может применяться для создания заплаток для бинарных файлов.
+.SH КЛЮЧИ ЗАПУСКА
+Если
+.I входной_файл
+не задан, то соответствующие данные читаются из потока стандартного ввода.
+В случае, если в качестве
+.I входного_файла
+используется символ
+.RB \` \- ',
+источником данных также выступает поток стандартного ввода.
+В том случае, если не указан
+.I выходной_файл
+(или вместо него используется символ
+.RB \` \- '
+), результат преобразования направляется в поток стандартного вывода.
+.PP
+Обратите внимание, что используется "ленивый" алгоритм разбора ключей, который не
+проверяет более одной буквы ключа, если в этом ключе не используется параметр.
+Пробелы между единственным символом ключа и соответствующим параметром не являются
+обязательными. Параметры ключей могут быть заданы с использованием десятичного,
+шестнадцатеричного или восьмеричного формата.
+Таким образом, ключи
+.BR \-c8 ,
+.BR "\-c 8" ,
+.B \-c 010
+.B \-cols 8
+являются равнозначными.
+.PP
+.TP
+.IR \-a " | " \-autoskip
+Включает автоматический пропуск: вместо последовательности
+нулевых строк используется одиночный символ '*'. По умолчанию
+не применяется.
+.TP
+.IR \-b " | " \-bits
+Вместо шестнадцатеричного кода используются биты (двоичные цифры).
+При использовании этого ключа вместо обычного шестнадцатеричного представления
+октетов используются наборы из восьми символов "1" и "0". Каждая строка
+предваряется номером строки в шестнадцатеричном виде, а завершается символьным
+представлением (в виде ascii или ebcdic). Ключи \-r, \-p, \-i в этом режиме
+не работают.
+.TP
+.IR "\-c кол " | " \-cols кол"
+Задаёт количество октетов
+.RI < кол >,
+которое выводится на каждой строке. По умолчанию используется значение 16
+(\-i: 12, \-ps: 30, \-b: 6).
+Максимально допустимое значение: 256.
+.TP
+.IR \-E " | " \-EBCDIC
+Изменяет способ кодирования символов в правой колонке с ASCII на EBCDIC. Этот ключ
+не изменяет шестнадцатеричное представление. Данный ключ не имеет смысла,
+если используются ключи \-r, \-p или \-i.
+.TP
+.IR "\-g байт " | " \-groupsize байт"
+Позволяет выполнять группировку указанного количества
+.RI < байтов >
+(две шестнадцатеричные цифры или восемь битов), отделяя группы друг от друга пробелами.
+Значение
+.I \-g 0
+применяется для отказа от использования группировки.
+По умолчанию используется значение
+.RI < байт "> равное " 2
+в обычном режиме и \fI1\fP в битовом режиме. Группировка не применяется
+в режимах postscript и include.
+.TP
+.IR \-h " | " \-help
+Выводит справку по доступным ключам командной строки и завершает работу программы.
+Создание шестнадцатеричного представления не выполняется.
+.TP
+.IR \-i " | " \-include
+Позволяет создавать вывод в стиле подключаемых заголовочных файлов языка C.
+Вывод содержит полноценное определение статического массива данных, имя которого
+соответствует имени входного файла, если xxd не считывает данные из потока стандартного
+ввода.
+.TP
+.IR "\-l длина " | " \-len длина"
+Завершает работу после записи заданного в параметре
+.RI < длина >
+количества октетов.
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+Использует непрерывный формат вывода шестнадцатеричного кода,
+известный как "простой" стиль или стиль "postscript".
+.TP
+.IR \-r " | " \-revert
+Изменяет смысл операции на противоположный: позволяет выполнять преобразование
+шестнадцатеричного представления в бинарный код (или применять результат в качестве заплаты).
+Если вывод происходит не в поток стандартного вывода, то xxd выполняет добавление кода
+к соответствующему файлу. При использовании комбинации ключей
+.I \-r \-p
+происходит чтение "простого" шестнадцатеричного представления без использования
+информации о номерах строк и какого-либо специального раскроя колонок. Пробелы
+и символы новой строки могут встречаться в любом месте исходных данных.
+.TP
+.I \-seek смещение
+При использовании после ключа
+.I \-r
+: добавлять указанное
+.RI < смещение >
+к файловым позициям, обнаруженным в исходных данных.
+.TP
+.I \-s [\+][\-]seek
+Начинает работу с указанного абсолютного (или относительного)
+.RI < смещения >
+в байтах во входном_файле.
+\fI\+ \fRуказывает, что смещение является относительным по отношению
+к текущей файловой позиции в потоке стандартного ввода (бессмысленно, если чтение
+происходит не из потока стандартного ввода). \fI\- \fRуказывает, что должно быть прочитано
+указанное количество символов от конца ввода (либо, если сочетается с \fI \+ \fR:
+перед текущей позиции файла в потоке стандартного ввода).
+Если ключ \-s не используется, то xxd начинает работу от текущей позиции в файле.
+.TP
+.I \-u
+Использует шестнадцатеричные цифры в верхнем регистре. По умолчанию используются цифры в
+нижнем регистре символов.
+.TP
+.IR \-v " | " \-version
+Отображает информацию о версии программы.
+.SH ПОДВОДНЫЕ КАМНИ
+.PP
+.I xxd \-r
+обладает встроенным интеллектом для распознавания информации о номерах строк.
+Если возможен поиск по входному файлу, то номера строк в начале каждой строки
+шестнадцатеричного представления могут быть неупорядоченными, некоторые строки могут
+быть пропущены или пересекаться друг с другом. В этих случаях xxd использует
+lseek(2) для перехода к следующей позиции. Если поиск по входному файлу
+невозможен, то допустимы только пропуски строк, которые заполняются нулевыми
+байтами.
+.PP
+.I xxd \-r
+никогда не выводит сообщений об ошибках. Мусор пропускается молча.
+.PP
+При редактировании шестнадцатеричных представлений бинарных файлов обращайте
+внимание, что
+.I xxd \-r
+пропускает в строке ввода любые данные после прочтения достаточного количества
+колонок шестнадцатеричных данных (см. ключ \-c). Это означает, что изменения,
+внесенные в колонки с печатными символами ascii (или ebcdic), всегда игнорируются.
+При обратном преобразовании шестнадцатеричного представления в стиле
+postscript с помощью команды xxd \-r \-p количество колонок не учитывается.
+В этом случае распознаются все символы, которые похожи на пары шестнадцатеричных цифр.
+.PP
+Обратите внимание на различие между командами
+.PP
+\fI% xxd \-i файл\fR
+.PP
+.PP
+\fI% xxd \-i \< файл\fR
+.PP
+Команда
+.I xxd \-s \+seek
+может отличаться от
+.I xxd \-s seek,
+поскольку для того, чтобы "отмотать" данные на входе назад, используется вызов lseek(2).
+При использовании `+' поведение будет отличаться, если входные данные
+поступают с потока стандартного ввода, а позиция в файле стандартного ввода не находится
+в начале файла к тому моменту, когда программа xxd запущена и приступает к чтению ввода.
+Нижеследующие примеры помогут прояснить (или ещё больше запутать!) ситуацию...
+.PP
+Отмотка назад потока стандартного ввода; необходимо, поскольку 'cat' уже выполнила
+чтение до конца потока стандартного ввода:
+.PP
+\fI% sh \-c 'cat > plain_copy; xxd \-s 0 > hex_copy' < file
+.PP
+Вывод шестнадцатеричного представления от позиции в файле 0x480
+(= 1024+128).
+Символ `+' означает "относительно текущей позиции", таким образом `128' добавляется
+к первому килобайту, где завершает работу dd:
+.PP
+\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +128 > hex_snippet' < file
+.PP
+Вывод шестнадцатеричного представления от позиции в файле 0x100
+(= 1024-768):
+.PP
+\fI% sh \-c 'dd of=plain_snippet bs=1k count=1; xxd \-s +-768 > hex_snippet' < file
+.PP
+В то же время, следует заметить, что подобные ситуации встречаются довольно редко,
+так что символ `+' обычно не используется. Автор предпочитает наблюдать за работой
+xxd с помощью strace(1) или truss(1) в тех случаях, когда применяется ключ
+\-s.
+.SH ПРИМЕРЫ
+.PP
+.br
+Вывести всё, кроме первых трёх строк (0x30 байтов) файла
+.B file
+:
+.PP
+\fI% xxd \-s 0x30 file
+.PP
+.br
+Вывести три строки (0x30 байтов) от конца файла
+.B file
+:
+.PP
+\fI% xxd \-s \-0x30 file
+.PP
+.br
+Вывести 120 байтов в виде непрерывного шестнадцатеричного представления
+по 20 октетов в строке:
+.PP
+\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR
+.br
+2e544820585844203120224d616e75616c207061
+.br
+676520666f7220787864220a2e5c220a2e5c2220
+.br
+32317374204d617920313939360a2e5c22204d61
+.br
+6e207061676520617574686f723a0a2e5c222020
+.br
+2020546f6e79204e7567656e74203c746f6e7940
+.br
+7363746e7567656e2e7070702e67752e6564752e
+.br
+.PP
+.br
+Вывести первые 120 байтов этой страницы справочника по 12 октетов в строке:
+.PP
+\fI% xxd \-l 120 \-c 12 xxd.1\fR
+.br
+0000000: 2e54 4820 5858 4420 3120 224d .TH XXD 1 "M
+.br
+000000c: 616e 7561 6c20 7061 6765 2066 anual page f
+.br
+0000018: 6f72 2078 7864 220a 2e5c 220a or xxd"..\\".
+.br
+0000024: 2e5c 2220 3231 7374 204d 6179 .\\" 21st May
+.br
+0000030: 2031 3939 360a 2e5c 2220 4d61 1996..\\" Ma
+.br
+000003c: 6e20 7061 6765 2061 7574 686f n page autho
+.br
+0000048: 723a 0a2e 5c22 2020 2020 546f r:..\\" To
+.br
+0000054: 6e79 204e 7567 656e 7420 3c74 ny Nugent <t
+.br
+0000060: 6f6e 7940 7363 746e 7567 656e ony@sctnugen
+.br
+000006c: 2e70 7070 2e67 752e 6564 752e .ppp.gu.edu.
+.PP
+.br
+Показать дату из файла xxd.1:
+.PP
+\fI% xxd \-s 0x28 \-l 12 \-c 12 xxd.1\fR
+.br
+0000028: 3231 7374 204d 6179 2031 3939 21st May 199
+.PP
+.br
+Скопировать
+.B входной_файл
+.B выходной_файл
+с добавлением 100 байтов со значением 0x00 в начало файла:
+.PP
+\fI% xxd входной_файл | xxd \-r \-s 100 \> выходной_файл\fR
+.br
+.PP
+.br
+Заменить дату в файле xxd.1:
+.PP
+\fI% echo '0000029: 3574 68' | xxd \-r \- xxd.1\fR
+.br
+\fI% xxd \-s 0x28 \-l 12 \-c 12 xxd.1\fR
+.br
+0000028: 3235 7468 204d 6179 2031 3939 25th May 199
+.PP
+.br
+Создать 65537-байтный файл, все байты которого имеют значение
+0x00, кроме последнего байта, который должен иметь значение 'A'
+(0x41):
+.PP
+\fI% echo '010000: 41' | xxd \-r \> file\fR
+.PP
+.br
+Создать шестнадцатеричное представление этого файла с
+использованием автоматического пропуска:
+.PP
+\fI% xxd \-a \-c 12 file\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+Создать 1-байтный файл, содержащий символ 'A'.
+Число после '\-r \-s' добавляется к номерам строк, найденным в файле;
+иначе говоря, предшествующие байты пропускаются:
+.PP
+\fI% echo '010000: 41' | xxd \-r \-s \-0x10000 \> file\fR
+.PP
+xxd можно использовать в качестве фильтра в редакторе, например в
+.B vim(1),
+чтобы создать шестнадцатеричное представление области между
+отметками `a' и `z':
+.PP
+\fI:'a,'z!xxd\fR
+.PP
+Вы можете использовать xxd в качестве фильтра в редакторе, например в
+.B vim(1),
+для восстановления данных из шестнадцатеричного представления
+между отметками `a' и `z':
+.PP
+\fI:'a,'z!xxd \-r\fR
+.PP
+Вы можете использовать xxd в качестве фильтра в редакторе, например в
+.B vim(1),
+для восстановления данных из единственной строки
+шестнадцатеричного представления. Поместите курсор в соответствующую строку
+и наберите
+.PP
+\fI!!xxd \-r\fR
+.PP
+Чтобы прочитать единственный символ из канала связи:
+.PP
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.PP
+.SH ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
+Программа xxd завершает работу со следующими значениями:
+.TP
+0
+Ошибки не обнаружены.
+.TP
+\-1
+Операция не поддерживается (выполнение
+.I xxd \-r \-i
+пока невозможно).
+.TP
+1
+Ошибка при разборе ключей командной строки.
+.TP
+2
+Проблемы во входном файле.
+.TP
+3
+Проблемы в выходном файле.
+.TP
+4,5
+Желательная позиция поиска недостижима.
+.SH СМОТРИ ТАКЖЕ
+uuencode(1), uudecode(1), patch(1)
+.br
+.SH ПРЕДУПРЕЖДЕНИЕ
+Странность этой программы соответствует особенностям мозга её создателя.
+Используйте её на свой страх и риск. Копируйте файлы, отслеживайте
+вызовы, становитесь волшебником.
+.br
+.SH ВЕРСИЯ
+Эта страница справочника документирует xxd версии 1.7.
+.SH АВТОР
+.br
+(c) 1990-1997 Юрген Вайгерт (Juergen Weigert)
+.br
+<jnweiger@informatik.uni-erlangen.de>
+.LP
+Вы можете свободно распространять программу со ссылкой на меня.
+.br
+Если использование этой программы принесло вам какой-то доход,
+поделитесь со мной.
+.br
+Если вы потеряли деньги, то я тут не причём.
+.PP
+Первый вариант страницы справочника написан Тони Наджентом (Tony Nugent)
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+Небольшие изменения внесены Брамом Мооленааром (Bram Moolenaar).
+Страница отредактирована Юргеном Вайгертом (Juergen Weigert).
+.PP
diff --git a/runtime/doc/xxd.1 b/runtime/doc/xxd.1
new file mode 100644
index 0000000..b0cb183
--- /dev/null
+++ b/runtime/doc/xxd.1
@@ -0,0 +1,393 @@
+.TH XXD 1 "August 1996" "Manual page for xxd"
+.\"
+.\" 21st May 1996
+.\" Man page author:
+.\" Tony Nugent <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.\" Changes by Bram Moolenaar <Bram@vim.org>
+.SH NAME
+.I xxd
+\- make a hexdump or do the reverse.
+.SH SYNOPSIS
+.B xxd
+\-h[elp]
+.br
+.B xxd
+[options] [infile [outfile]]
+.br
+.B xxd
+\-r[evert] [options] [infile [outfile]]
+.SH DESCRIPTION
+.I xxd
+creates a hex dump of a given file or standard input.
+It can also convert a hex dump back to its original binary form.
+Like
+.BR uuencode (1)
+and
+.BR uudecode (1)
+it allows the transmission of binary data in a `mail-safe' ASCII representation,
+but has the advantage of decoding to standard output.
+Moreover, it can be used to perform binary file patching.
+.SH OPTIONS
+If no
+.I infile
+is given, standard input is read.
+If
+.I infile
+is specified as a
+.RB \` \- '
+character, then input is taken from standard input.
+If no
+.I outfile
+is given (or a
+.RB \` \- '
+character is in its place), results are sent to standard output.
+.PP
+Note that a "lazy" parser is used which does not check for more than the first
+option letter, unless the option is followed by a parameter.
+Spaces between a single option letter and its parameter are optional.
+Parameters to options can be specified in decimal, hexadecimal or octal
+notation.
+Thus
+.BR \-c8 ,
+.BR "\-c 8" ,
+.B \-c 010
+and
+.B \-cols 8
+are all equivalent.
+.PP
+.TP
+.IR \-a " | " \-autoskip
+Toggle autoskip: A single '*' replaces nul-lines. Default off.
+.TP
+.IR \-b " | " \-bits
+Switch to bits (binary digits) dump, rather than hexdump.
+This option writes octets as eight digits "1"s and "0"s instead of a normal
+hexadecimal dump. Each line is preceded by a line number in hexadecimal and
+followed by an ascii (or ebcdic) representation. The command line switches
+\-r, \-p, \-i do not work with this mode.
+.TP
+.IR "\-c cols " | " \-cols cols"
+Format
+.RI < cols >
+octets per line. Default 16 (\-i: 12, \-ps: 30, \-b: 6). Max 256.
+No maxmimum for \-ps. With \-ps, 0 results in one long line of output.
+.TP
+.IR \-C " | " \-capitalize
+Capitalize variable names in C include file style, when using \-i.
+.TP
+.IR \-E " | " \-EBCDIC
+Change the character encoding in the righthand column from ASCII to EBCDIC.
+This does not change the hexadecimal representation. The option is
+meaningless in combinations with \-r, \-p or \-i.
+.TP
+.IR \-e
+Switch to little-endian hexdump.
+This option treats byte groups as words in little-endian byte order.
+The default grouping of 4 bytes may be changed using
+.RI "" \-g .
+This option only applies to hexdump, leaving the ASCII (or EBCDIC)
+representation unchanged.
+The command line switches
+\-r, \-p, \-i do not work with this mode.
+.TP
+.IR "\-g bytes " | " \-groupsize bytes"
+Separate the output of every
+.RI < bytes >
+bytes (two hex characters or eight bit-digits each) by a whitespace.
+Specify
+.I \-g 0
+to suppress grouping.
+.RI < Bytes "> defaults to " 2
+in normal mode, \fI4\fP in little-endian mode and \fI1\fP in bits mode.
+Grouping does not apply to postscript or include style.
+.TP
+.IR \-h " | " \-help
+Print a summary of available commands and exit. No hex dumping is performed.
+.TP
+.IR \-i " | " \-include
+Output in C include file style. A complete static array definition is written
+(named after the input file), unless xxd reads from stdin.
+.TP
+.IR "\-l len " | " \-len len"
+Stop after writing
+.RI < len >
+octets.
+.TP
+.I "\-n name " | " \-name name"
+Override the variable name output when \-i is used. The array is named
+\fIname\fP and the length is named \fIname\fP_len.
+.TP
+.I \-o offset
+Add
+.RI < offset >
+to the displayed file position.
+.TP
+.IR \-p " | " \-ps " | " \-postscript " | " \-plain
+Output in postscript continuous hexdump style. Also known as plain hexdump
+style.
+.TP
+.IR \-r " | " \-revert
+Reverse operation: convert (or patch) hexdump into binary.
+If not writing to stdout, xxd writes into its output file without truncating
+it. Use the combination
+.I \-r \-p
+to read plain hexadecimal dumps without line number information and without a
+particular column layout. Additional Whitespace and line-breaks are allowed
+anywhere.
+.TP
+.I \-seek offset
+When used after
+.IR \-r :
+revert with
+.RI < offset >
+added to file positions found in hexdump.
+.TP
+.I \-s [+][\-]seek
+Start at
+.RI < seek >
+bytes abs. (or rel.) infile offset.
+\fI+ \fRindicates that the seek is relative to the current stdin file position
+(meaningless when not reading from stdin). \fI\- \fRindicates that the seek
+should be that many characters from the end of the input (or if combined with
+\fI+\fR: before the current stdin file position).
+Without \-s option, xxd starts at the current file position.
+.TP
+.I \-u
+Use upper case hex letters. Default is lower case.
+.TP
+.IR \-v " | " \-version
+Show version string.
+.SH CAVEATS
+.PP
+.I xxd \-r
+has some builtin magic while evaluating line number information.
+If the output file is seekable, then the linenumbers at the start of each
+hexdump line may be out of order, lines may be missing, or overlapping. In
+these cases xxd will lseek(2) to the next position. If the output file is not
+seekable, only gaps are allowed, which will be filled by null-bytes.
+.PP
+.I xxd \-r
+never generates parse errors. Garbage is silently skipped.
+.PP
+When editing hexdumps, please note that
+.I xxd \-r
+skips everything on the input line after reading enough columns of hexadecimal
+data (see option \-c). This also means, that changes to the printable ascii (or
+ebcdic) columns are always ignored. Reverting a plain (or postscript) style
+hexdump with xxd \-r \-p does not depend on the correct number of columns. Here anything that looks like a pair of hex-digits is interpreted.
+.PP
+Note the difference between
+.br
+\fI% xxd \-i file\fR
+.br
+and
+.br
+\fI% xxd \-i < file\fR
+.PP
+.I xxd \-s +seek
+may be different from
+.IR "xxd \-s seek" ,
+as lseek(2) is used to "rewind" input. A '+'
+makes a difference if the input source is stdin, and if stdin's file position
+is not at the start of the file by the time xxd is started and given its input.
+The following examples may help to clarify (or further confuse!)...
+.PP
+Rewind stdin before reading; needed because the `cat' has already read to the
+end of stdin.
+.br
+\fI% sh \-c "cat > plain_copy; xxd \-s 0 > hex_copy" < file\fR
+.PP
+Hexdump from file position 0x480 (=1024+128) onwards.
+The `+' sign means "relative to the current position", thus the `128' adds to
+the 1k where dd left off.
+.br
+\fI% sh \-c "dd of=plain_snippet bs=1k count=1; xxd \-s +128 > hex_snippet" < file\fR
+.PP
+Hexdump from file position 0x100 ( = 1024\-768) on.
+.br
+\fI% sh \-c "dd of=plain_snippet bs=1k count=1; xxd \-s +\-768 > hex_snippet" < file\fR
+.PP
+However, this is a rare situation and the use of `+' is rarely needed.
+The author prefers to monitor the effect of xxd with strace(1) or truss(1), whenever \-s is used.
+.SH EXAMPLES
+.PP
+.br
+Print everything but the first three lines (hex 0x30 bytes) of
+.BR file .
+.br
+\fI% xxd \-s 0x30 file\fR
+.PP
+.br
+Print 3 lines (hex 0x30 bytes) from the end of
+.BR file .
+.br
+\fI% xxd \-s \-0x30 file\fR
+.PP
+.br
+Print 120 bytes as continuous hexdump with 20 octets per line.
+.br
+\fI% xxd \-l 120 \-ps \-c 20 xxd.1\fR
+.br
+2e54482058584420312022417567757374203139
+.br
+39362220224d616e75616c207061676520666f72
+.br
+20787864220a2e5c220a2e5c222032317374204d
+.br
+617920313939360a2e5c22204d616e2070616765
+.br
+20617574686f723a0a2e5c2220202020546f6e79
+.br
+204e7567656e74203c746f6e79407363746e7567
+.br
+
+.br
+Hexdump the first 120 bytes of this man page with 12 octets per line.
+.br
+\fI% xxd \-l 120 \-c 12 xxd.1\fR
+.br
+0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
+.br
+000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
+.br
+0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
+.br
+0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\\
+.br
+0000030: 220a 2e5c 2220 3231 7374 204d "..\\" 21st M
+.br
+000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\\"
+.br
+0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
+.br
+0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\\"
+.br
+0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
+.br
+000006c: 3c74 6f6e 7940 7363 746e 7567 <tony@sctnug
+.PP
+.br
+Display just the date from the file xxd.1
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
+.PP
+.br
+Copy
+.B input_file
+to
+.B output_file
+and prepend 100 bytes of value 0x00.
+.br
+\fI% xxd input_file | xxd \-r \-s 100 > output_file\fR
+.br
+
+.br
+Patch the date in the file xxd.1
+.br
+\fI% echo "0000037: 3574 68" | xxd \-r \- xxd.1\fR
+.br
+\fI% xxd \-s 0x36 \-l 13 \-c 13 xxd.1\fR
+.br
+0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
+.PP
+.br
+Create a 65537 byte file with all bytes 0x00,
+except for the last one which is 'A' (hex 0x41).
+.br
+\fI% echo "010000: 41" | xxd \-r > file\fR
+.PP
+.br
+Hexdump this file with autoskip.
+.br
+\fI% xxd \-a \-c 12 file\fR
+.br
+0000000: 0000 0000 0000 0000 0000 0000 ............
+.br
+*
+.br
+000fffc: 0000 0000 40 ....A
+.PP
+Create a 1 byte file containing a single 'A' character.
+The number after '\-r \-s' adds to the linenumbers found in the file;
+in effect, the leading bytes are suppressed.
+.br
+\fI% echo "010000: 41" | xxd \-r \-s \-0x10000 > file\fR
+.PP
+Use xxd as a filter within an editor such as
+.B vim(1)
+to hexdump a region marked between `a' and `z'.
+.br
+\fI:'a,'z!xxd\fR
+.PP
+Use xxd as a filter within an editor such as
+.B vim(1)
+to recover a binary hexdump marked between `a' and `z'.
+.br
+\fI:'a,'z!xxd \-r\fR
+.PP
+Use xxd as a filter within an editor such as
+.B vim(1)
+to recover one line of a hexdump. Move the cursor over the line and type:
+.br
+\fI!!xxd \-r\fR
+.PP
+Read single characters from a serial line
+.br
+\fI% xxd \-c1 < /dev/term/b &\fR
+.br
+\fI% stty < /dev/term/b \-echo \-opost \-isig \-icanon min 1\fR
+.br
+\fI% echo \-n foo > /dev/term/b\fR
+.PP
+.SH "RETURN VALUES"
+The following error values are returned:
+.TP
+0
+no errors encountered.
+.TP
+\-1
+operation not supported (
+.I xxd \-r \-i
+still impossible).
+.TP
+1
+error while parsing options.
+.TP
+2
+problems with input file.
+.TP
+3
+problems with output file.
+.TP
+4,5
+desired seek position is unreachable.
+.SH "SEE ALSO"
+uuencode(1), uudecode(1), patch(1)
+.br
+.SH WARNINGS
+The tools weirdness matches its creators brain.
+Use entirely at your own risk. Copy files. Trace it. Become a wizard.
+.br
+.SH VERSION
+This manual page documents xxd version 1.7
+.SH AUTHOR
+.br
+(c) 1990-1997 by Juergen Weigert
+.br
+<jnweiger@informatik.uni\-erlangen.de>
+.LP
+Distribute freely and credit me,
+.br
+make money and share with me,
+.br
+lose money and don't ask me.
+.PP
+Manual page started by Tony Nugent
+.br
+<tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+.br
+Small changes by Bram Moolenaar.
+Edited by Juergen Weigert.
+.PP
diff --git a/runtime/doc/xxd.man b/runtime/doc/xxd.man
new file mode 100644
index 0000000..3eae32a
--- /dev/null
+++ b/runtime/doc/xxd.man
@@ -0,0 +1,275 @@
+XXD(1) General Commands Manual XXD(1)
+
+
+
+NAME
+ xxd - make a hexdump or do the reverse.
+
+SYNOPSIS
+ xxd -h[elp]
+ xxd [options] [infile [outfile]]
+ xxd -r[evert] [options] [infile [outfile]]
+
+DESCRIPTION
+ xxd creates a hex dump of a given file or standard input. It can also
+ convert a hex dump back to its original binary form. Like uuencode(1)
+ and uudecode(1) it allows the transmission of binary data in a `mail-
+ safe' ASCII representation, but has the advantage of decoding to stan‐
+ dard output. Moreover, it can be used to perform binary file patching.
+
+OPTIONS
+ If no infile is given, standard input is read. If infile is specified
+ as a `-' character, then input is taken from standard input. If no
+ outfile is given (or a `-' character is in its place), results are sent
+ to standard output.
+
+ Note that a "lazy" parser is used which does not check for more than
+ the first option letter, unless the option is followed by a parameter.
+ Spaces between a single option letter and its parameter are optional.
+ Parameters to options can be specified in decimal, hexadecimal or octal
+ notation. Thus -c8, -c 8, -c 010 and -cols 8 are all equivalent.
+
+ -a | -autoskip
+ Toggle autoskip: A single '*' replaces nul-lines. Default off.
+
+ -b | -bits
+ Switch to bits (binary digits) dump, rather than hexdump. This
+ option writes octets as eight digits "1"s and "0"s instead of a
+ normal hexadecimal dump. Each line is preceded by a line number
+ in hexadecimal and followed by an ascii (or ebcdic) representa‐
+ tion. The command line switches -r, -p, -i do not work with this
+ mode.
+
+ -c cols | -cols cols
+ Format <cols> octets per line. Default 16 (-i: 12, -ps: 30, -b:
+ 6). Max 256. No maxmimum for -ps. With -ps, 0 results in one
+ long line of output.
+
+ -C | -capitalize
+ Capitalize variable names in C include file style, when using
+ -i.
+
+ -E | -EBCDIC
+ Change the character encoding in the righthand column from ASCII
+ to EBCDIC. This does not change the hexadecimal representation.
+ The option is meaningless in combinations with -r, -p or -i.
+
+ -e Switch to little-endian hexdump. This option treats byte groups
+ as words in little-endian byte order. The default grouping of 4
+ bytes may be changed using -g. This option only applies to hex‐
+ dump, leaving the ASCII (or EBCDIC) representation unchanged.
+ The command line switches -r, -p, -i do not work with this mode.
+
+ -g bytes | -groupsize bytes
+ Separate the output of every <bytes> bytes (two hex characters
+ or eight bit-digits each) by a whitespace. Specify -g 0 to sup‐
+ press grouping. <Bytes> defaults to 2 in normal mode, 4 in lit‐
+ tle-endian mode and 1 in bits mode. Grouping does not apply to
+ postscript or include style.
+
+ -h | -help
+ Print a summary of available commands and exit. No hex dumping
+ is performed.
+
+ -i | -include
+ Output in C include file style. A complete static array defini‐
+ tion is written (named after the input file), unless xxd reads
+ from stdin.
+
+ -l len | -len len
+ Stop after writing <len> octets.
+
+ -n name | -name name
+ Override the variable name output when -i is used. The array is
+ named name and the length is named name_len.
+
+ -o offset
+ Add <offset> to the displayed file position.
+
+ -p | -ps | -postscript | -plain
+ Output in postscript continuous hexdump style. Also known as
+ plain hexdump style.
+
+ -r | -revert
+ Reverse operation: convert (or patch) hexdump into binary. If
+ not writing to stdout, xxd writes into its output file without
+ truncating it. Use the combination -r -p to read plain hexadeci‐
+ mal dumps without line number information and without a particu‐
+ lar column layout. Additional Whitespace and line-breaks are al‐
+ lowed anywhere.
+
+ -seek offset
+ When used after -r: revert with <offset> added to file positions
+ found in hexdump.
+
+ -s [+][-]seek
+ Start at <seek> bytes abs. (or rel.) infile offset. + indicates
+ that the seek is relative to the current stdin file position
+ (meaningless when not reading from stdin). - indicates that the
+ seek should be that many characters from the end of the input
+ (or if combined with +: before the current stdin file position).
+ Without -s option, xxd starts at the current file position.
+
+ -u Use upper case hex letters. Default is lower case.
+
+ -v | -version
+ Show version string.
+
+CAVEATS
+ xxd -r has some builtin magic while evaluating line number information.
+ If the output file is seekable, then the linenumbers at the start of
+ each hexdump line may be out of order, lines may be missing, or over‐
+ lapping. In these cases xxd will lseek(2) to the next position. If the
+ output file is not seekable, only gaps are allowed, which will be
+ filled by null-bytes.
+
+ xxd -r never generates parse errors. Garbage is silently skipped.
+
+ When editing hexdumps, please note that xxd -r skips everything on the
+ input line after reading enough columns of hexadecimal data (see option
+ -c). This also means, that changes to the printable ascii (or ebcdic)
+ columns are always ignored. Reverting a plain (or postscript) style
+ hexdump with xxd -r -p does not depend on the correct number of col‐
+ umns. Here anything that looks like a pair of hex-digits is inter‐
+ preted.
+
+ Note the difference between
+ % xxd -i file
+ and
+ % xxd -i < file
+
+ xxd -s +seek may be different from xxd -s seek, as lseek(2) is used to
+ "rewind" input. A '+' makes a difference if the input source is stdin,
+ and if stdin's file position is not at the start of the file by the
+ time xxd is started and given its input. The following examples may
+ help to clarify (or further confuse!)...
+
+ Rewind stdin before reading; needed because the `cat' has already read
+ to the end of stdin.
+ % sh -c "cat > plain_copy; xxd -s 0 > hex_copy" < file
+
+ Hexdump from file position 0x480 (=1024+128) onwards. The `+' sign
+ means "relative to the current position", thus the `128' adds to the 1k
+ where dd left off.
+ % sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +128 > hex_snippet"
+ < file
+
+ Hexdump from file position 0x100 ( = 1024-768) on.
+ % sh -c "dd of=plain_snippet bs=1k count=1; xxd -s +-768 > hex_snippet"
+ < file
+
+ However, this is a rare situation and the use of `+' is rarely needed.
+ The author prefers to monitor the effect of xxd with strace(1) or
+ truss(1), whenever -s is used.
+
+EXAMPLES
+ Print everything but the first three lines (hex 0x30 bytes) of file.
+ % xxd -s 0x30 file
+
+ Print 3 lines (hex 0x30 bytes) from the end of file.
+ % xxd -s -0x30 file
+
+ Print 120 bytes as continuous hexdump with 20 octets per line.
+ % xxd -l 120 -ps -c 20 xxd.1
+ 2e54482058584420312022417567757374203139
+ 39362220224d616e75616c207061676520666f72
+ 20787864220a2e5c220a2e5c222032317374204d
+ 617920313939360a2e5c22204d616e2070616765
+ 20617574686f723a0a2e5c2220202020546f6e79
+ 204e7567656e74203c746f6e79407363746e7567
+
+ Hexdump the first 120 bytes of this man page with 12 octets per line.
+ % xxd -l 120 -c 12 xxd.1
+ 0000000: 2e54 4820 5858 4420 3120 2241 .TH XXD 1 "A
+ 000000c: 7567 7573 7420 3139 3936 2220 ugust 1996"
+ 0000018: 224d 616e 7561 6c20 7061 6765 "Manual page
+ 0000024: 2066 6f72 2078 7864 220a 2e5c for xxd"..\
+ 0000030: 220a 2e5c 2220 3231 7374 204d "..\" 21st M
+ 000003c: 6179 2031 3939 360a 2e5c 2220 ay 1996..\"
+ 0000048: 4d61 6e20 7061 6765 2061 7574 Man page aut
+ 0000054: 686f 723a 0a2e 5c22 2020 2020 hor:..\"
+ 0000060: 546f 6e79 204e 7567 656e 7420 Tony Nugent
+ 000006c: 3c74 6f6e 7940 7363 746e 7567 <tony@sctnug
+
+ Display just the date from the file xxd.1
+ % xxd -s 0x36 -l 13 -c 13 xxd.1
+ 0000036: 3231 7374 204d 6179 2031 3939 36 21st May 1996
+
+ Copy input_file to output_file and prepend 100 bytes of value 0x00.
+ % xxd input_file | xxd -r -s 100 > output_file
+
+ Patch the date in the file xxd.1
+ % echo "0000037: 3574 68" | xxd -r - xxd.1
+ % xxd -s 0x36 -l 13 -c 13 xxd.1
+ 0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
+
+ Create a 65537 byte file with all bytes 0x00, except for the last one
+ which is 'A' (hex 0x41).
+ % echo "010000: 41" | xxd -r > file
+
+ Hexdump this file with autoskip.
+ % xxd -a -c 12 file
+ 0000000: 0000 0000 0000 0000 0000 0000 ............
+ *
+ 000fffc: 0000 0000 40 ....A
+
+ Create a 1 byte file containing a single 'A' character. The number af‐
+ ter '-r -s' adds to the linenumbers found in the file; in effect, the
+ leading bytes are suppressed.
+ % echo "010000: 41" | xxd -r -s -0x10000 > file
+
+ Use xxd as a filter within an editor such as vim(1) to hexdump a region
+ marked between `a' and `z'.
+ :'a,'z!xxd
+
+ Use xxd as a filter within an editor such as vim(1) to recover a binary
+ hexdump marked between `a' and `z'.
+ :'a,'z!xxd -r
+
+ Use xxd as a filter within an editor such as vim(1) to recover one line
+ of a hexdump. Move the cursor over the line and type:
+ !!xxd -r
+
+ Read single characters from a serial line
+ % xxd -c1 < /dev/term/b &
+ % stty < /dev/term/b -echo -opost -isig -icanon min 1
+ % echo -n foo > /dev/term/b
+
+RETURN VALUES
+ The following error values are returned:
+
+ 0 no errors encountered.
+
+ -1 operation not supported ( xxd -r -i still impossible).
+
+ 1 error while parsing options.
+
+ 2 problems with input file.
+
+ 3 problems with output file.
+
+ 4,5 desired seek position is unreachable.
+
+SEE ALSO
+ uuencode(1), uudecode(1), patch(1)
+
+WARNINGS
+ The tools weirdness matches its creators brain. Use entirely at your
+ own risk. Copy files. Trace it. Become a wizard.
+
+VERSION
+ This manual page documents xxd version 1.7
+
+AUTHOR
+ (c) 1990-1997 by Juergen Weigert
+ <jnweiger@informatik.uni-erlangen.de>
+
+ Distribute freely and credit me,
+ make money and share with me,
+ lose money and don't ask me.
+
+ Manual page started by Tony Nugent
+ <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
+ Small changes by Bram Moolenaar. Edited by Juergen Weigert.
+
+Manual page for xxd August 1996 XXD(1)
diff --git a/runtime/evim.vim b/runtime/evim.vim
new file mode 100644
index 0000000..d3f349e
--- /dev/null
+++ b/runtime/evim.vim
@@ -0,0 +1,74 @@
+" Vim script for Evim key bindings
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 May 10
+
+" Don't use Vi-compatible mode.
+set nocompatible
+
+" Use the mswin.vim script for most mappings
+source <sfile>:p:h/mswin.vim
+
+" Allow for using CTRL-Q in Insert mode to quit Vim.
+inoremap <C-Q> <C-O>:confirm qall<CR>
+
+" Vim is in Insert mode by default
+set insertmode
+
+" Make a buffer hidden when editing another one
+set hidden
+
+" Make cursor keys ignore wrapping
+inoremap <silent> <Down> <C-R>=pumvisible() ? "\<lt>Down>" : "\<lt>C-O>gj"<CR>
+inoremap <silent> <Up> <C-R>=pumvisible() ? "\<lt>Up>" : "\<lt>C-O>gk"<CR>
+
+" CTRL-F does Find dialog instead of page forward
+noremap <silent> <C-F> :promptfind<CR>
+vnoremap <silent> <C-F> y:promptfind <C-R>"<CR>
+onoremap <silent> <C-F> <C-C>:promptfind<CR>
+inoremap <silent> <C-F> <C-O>:promptfind<CR>
+cnoremap <silent> <C-F> <C-C>:promptfind<CR>
+
+
+set backspace=2 " allow backspacing over everything in insert mode
+set autoindent " always set autoindenting on
+if has("vms")
+ set nobackup " do not keep a backup file, use versions instead
+else
+ set backup " keep a backup file
+endif
+set history=50 " keep 50 lines of command line history
+set ruler " show the cursor position all the time
+set incsearch " do incremental searching
+set mouse=a " always use the mouse
+
+" Don't use Ex mode, use Q for formatting
+map Q gq
+
+" Switch syntax highlighting on, when the terminal has colors
+" Highlight the last used search pattern on the next search command.
+if &t_Co > 2 || has("gui_running")
+ syntax on
+ set hlsearch
+ nohlsearch
+endif
+
+" Enable file type detection.
+" Use the default filetype settings, so that mail gets 'tw' set to 72,
+" 'cindent' is on in C files, etc.
+" Also load indent files, to automatically do language-dependent indenting.
+filetype plugin indent on
+
+" For all text files set 'textwidth' to 78 characters.
+au FileType text setlocal tw=78
+
+" Add optional packages.
+"
+" The matchit plugin makes the % command work better, but it is not backwards
+" compatible.
+" The ! means the package won't be loaded right away but when plugins are
+" loaded during initialization.
+if has('syntax') && has('eval')
+ packadd! matchit
+endif
+
+" vim: set sw=2 :
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
new file mode 100644
index 0000000..8895642
--- /dev/null
+++ b/runtime/filetype.vim
@@ -0,0 +1,2776 @@
+" Vim support file to detect file types
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2023 Feb 25
+
+" Listen very carefully, I will say this only once
+if exists("did_load_filetypes")
+ finish
+endif
+let did_load_filetypes = 1
+
+" Line continuation is used here, remove 'C' from 'cpoptions'
+let s:cpo_save = &cpo
+set cpo&vim
+
+augroup filetypedetect
+
+" Ignored extensions
+if exists("*fnameescape")
+au BufNewFile,BufRead ?\+.orig,?\+.bak,?\+.old,?\+.new,?\+.dpkg-dist,?\+.dpkg-old,?\+.dpkg-new,?\+.dpkg-bak,?\+.rpmsave,?\+.rpmnew,?\+.pacsave,?\+.pacnew
+ \ exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r"))
+au BufNewFile,BufRead *~
+ \ let s:name = expand("<afile>") |
+ \ let s:short = substitute(s:name, '\~$', '', '') |
+ \ if s:name != s:short && s:short != "" |
+ \ exe "doau filetypedetect BufRead " . fnameescape(s:short) |
+ \ endif |
+ \ unlet! s:name s:short
+au BufNewFile,BufRead ?\+.in
+ \ if expand("<afile>:t") != "configure.in" |
+ \ exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r")) |
+ \ endif
+elseif &verbose > 0
+ echomsg "Warning: some filetypes will not be recognized because this version of Vim does not have fnameescape()"
+endif
+
+" Pattern used to match file names which should not be inspected.
+" Currently finds compressed files.
+if !exists("g:ft_ignore_pat")
+ let g:ft_ignore_pat = '\.\(Z\|gz\|bz2\|zip\|tgz\)$'
+endif
+
+" Function used for patterns that end in a star: don't set the filetype if the
+" file name matches ft_ignore_pat.
+" When using this, the entry should probably be further down below with the
+" other StarSetf() calls.
+func s:StarSetf(ft)
+ if expand("<amatch>") !~ g:ft_ignore_pat
+ exe 'setf ' . a:ft
+ endif
+endfunc
+
+" Vim help file
+au BufNewFile,BufRead $VIMRUNTIME/doc/*.txt setf help
+
+" Abaqus or Trasys
+au BufNewFile,BufRead *.inp call dist#ft#Check_inp()
+
+" 8th (Firth-derivative)
+au BufNewFile,BufRead *.8th setf 8th
+
+" A-A-P recipe
+au BufNewFile,BufRead *.aap setf aap
+
+" A2ps printing utility
+au BufNewFile,BufRead */etc/a2ps.cfg,*/etc/a2ps/*.cfg,a2psrc,.a2psrc setf a2ps
+
+" ABAB/4
+au BufNewFile,BufRead *.abap setf abap
+
+" ABC music notation
+au BufNewFile,BufRead *.abc setf abc
+
+" ABEL
+au BufNewFile,BufRead *.abl setf abel
+
+" AceDB
+au BufNewFile,BufRead *.wrm setf acedb
+
+" Ada (83, 9X, 95)
+au BufNewFile,BufRead *.adb,*.ads,*.ada setf ada
+if has("vms")
+ au BufNewFile,BufRead *.gpr,*.ada_m,*.adc setf ada
+else
+ au BufNewFile,BufRead *.gpr setf ada
+endif
+
+" AHDL
+au BufNewFile,BufRead *.tdf setf ahdl
+
+" AIDL
+au BufNewFile,BufRead *.aidl setf aidl
+
+" AMPL
+au BufNewFile,BufRead *.run setf ampl
+
+" Ant
+au BufNewFile,BufRead build.xml setf ant
+
+" Arduino
+au BufNewFile,BufRead *.ino,*.pde setf arduino
+
+" Apache config file
+au BufNewFile,BufRead .htaccess,*/etc/httpd/*.conf setf apache
+au BufNewFile,BufRead */etc/apache2/sites-*/*.com setf apache
+
+" XA65 MOS6510 cross assembler
+au BufNewFile,BufRead *.a65 setf a65
+
+" Applescript
+au BufNewFile,BufRead *.scpt setf applescript
+
+" Automake (must be before the *.am pattern)
+au BufNewFile,BufRead [mM]akefile.am,GNUmakefile.am setf automake
+
+" Applix ELF
+au BufNewFile,BufRead *.am setf elf
+
+" ALSA configuration
+au BufNewFile,BufRead .asoundrc,*/usr/share/alsa/alsa.conf,*/etc/asound.conf setf alsaconf
+
+" Arc Macro Language
+au BufNewFile,BufRead *.aml setf aml
+
+" APT config file
+au BufNewFile,BufRead apt.conf setf aptconf
+au BufNewFile,BufRead */.aptitude/config setf aptconf
+" more generic pattern far down
+
+" Arch Inventory file
+au BufNewFile,BufRead .arch-inventory,=tagging-method setf arch
+
+" ART*Enterprise (formerly ART-IM)
+au BufNewFile,BufRead *.art setf art
+
+" AsciiDoc
+au BufNewFile,BufRead *.asciidoc,*.adoc setf asciidoc
+
+" ASN.1
+au BufNewFile,BufRead *.asn,*.asn1 setf asn
+
+" Active Server Pages (with Visual Basic Script)
+au BufNewFile,BufRead *.asa
+ \ if exists("g:filetype_asa") |
+ \ exe "setf " . g:filetype_asa |
+ \ else |
+ \ setf aspvbs |
+ \ endif
+
+" Active Server Pages (with Perl or Visual Basic Script)
+au BufNewFile,BufRead *.asp
+ \ if exists("g:filetype_asp") |
+ \ exe "setf " . g:filetype_asp |
+ \ elseif getline(1) . getline(2) . getline(3) =~? "perlscript" |
+ \ setf aspperl |
+ \ else |
+ \ setf aspvbs |
+ \ endif
+
+" Grub (must be before pattern *.lst)
+au BufNewFile,BufRead */boot/grub/menu.lst,*/boot/grub/grub.conf,*/etc/grub.conf setf grub
+
+" Maxima, see:
+" https://maxima.sourceforge.io/docs/manual/maxima_71.html#file_005ftype_005fmaxima
+" Must be before the pattern *.mac.
+" *.dem omitted - also used by gnuplot demos
+" *.mc omitted - used by dist#ft#McSetf()
+au BufNewFile,BufRead *.demo,*.dm{1,2,3,t},*.wxm,maxima-init.mac setf maxima
+
+" 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 dist#ft#FTasm()
+
+" Assembly - Macro (VAX)
+au BufNewFile,BufRead *.mar setf vmasm
+
+" Astro
+au BufNewFile,BufRead *.astro setf astro
+
+" Atlas
+au BufNewFile,BufRead *.atl,*.as setf atlas
+
+" Atom is based on XML
+au BufNewFile,BufRead *.atom setf xml
+
+" Autoit v3
+au BufNewFile,BufRead *.au3 setf autoit
+
+" Autohotkey
+au BufNewFile,BufRead *.ahk setf autohotkey
+
+" Autotest .at files are actually m4
+au BufNewFile,BufRead *.at setf m4
+
+" Avenue
+au BufNewFile,BufRead *.ave setf ave
+
+" Awk
+au BufNewFile,BufRead *.awk,*.gawk setf awk
+
+" B
+au BufNewFile,BufRead *.mch,*.ref,*.imp setf b
+
+" BASIC or Visual Basic
+au BufNewFile,BufRead *.bas call dist#ft#FTbas()
+au BufNewFile,BufRead *.bi,*.bm call dist#ft#FTbas()
+
+" Bass
+au BufNewFile,BufRead *.bass setf bass
+
+" Visual Basic Script (close to Visual Basic) or Visual Basic .NET
+au BufNewFile,BufRead *.vb,*.vbs,*.dsm,*.ctl setf vb
+
+" IBasic file (similar to QBasic)
+au BufNewFile,BufRead *.iba,*.ibi setf ibasic
+
+" FreeBasic file (similar to QBasic)
+au BufNewFile,BufRead *.fb setf freebasic
+
+" Batch file for MSDOS. See dist#ft#FTsys for *.sys
+au BufNewFile,BufRead *.bat setf dosbatch
+" *.cmd is close to a Batch file, but on OS/2 Rexx files also use *.cmd.
+au BufNewFile,BufRead *.cmd
+ \ if getline(1) =~ '^/\*' | setf rexx | else | setf dosbatch | endif
+" ABB RAPID or Batch file for MSDOS.
+au BufNewFile,BufRead *.sys\c call dist#ft#FTsys()
+
+" Batch file for 4DOS
+au BufNewFile,BufRead *.btm call dist#ft#FTbtm()
+
+" BC calculator
+au BufNewFile,BufRead *.bc setf bc
+
+" BDF font
+au BufNewFile,BufRead *.bdf setf bdf
+
+" Beancount
+au BufNewFile,BufRead *.beancount setf beancount
+
+" BibTeX bibliography database file
+au BufNewFile,BufRead *.bib setf bib
+
+" BibTeX Bibliography Style
+au BufNewFile,BufRead *.bst setf bst
+
+" Bicep
+au BufNewFile,BufRead *.bicep setf bicep
+
+" BIND configuration
+" 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 dist#ft#BindzoneCheck('')
+
+" Blank
+au BufNewFile,BufRead *.bl setf blank
+
+" Bitbake
+au BufNewFile,BufRead *.bb,*.bbappend,*.bbclass,*/build/conf/*.conf,*/meta{-*,}/conf/*.conf setf bitbake
+
+" Blkid cache file
+au BufNewFile,BufRead */etc/blkid.tab,*/etc/blkid.tab.old setf xml
+
+" BSDL
+au BufNewFile,BufRead *.bsd,*.bsdl setf bsdl
+
+" Bazel (http://bazel.io)
+autocmd BufRead,BufNewFile *.bzl,*.bazel,WORKSPACE,WORKSPACE.bzlmod setf bzl
+if has("fname_case")
+ " There is another check for BUILD further below.
+ autocmd BufRead,BufNewFile *.BUILD,BUILD setf bzl
+endif
+
+" C or lpc
+au BufNewFile,BufRead *.c call dist#ft#FTlpc()
+au BufNewFile,BufRead *.lpc,*.ulpc setf lpc
+
+" Calendar
+au BufNewFile,BufRead calendar setf calendar
+
+" Cap'n Proto
+au BufNewFile,BufRead *.capnp setf capnp
+
+" C#
+au BufNewFile,BufRead *.cs,*.csx setf cs
+
+" CSDL
+au BufNewFile,BufRead *.csdl setf csdl
+
+" Cabal
+au BufNewFile,BufRead *.cabal setf cabal
+
+" Cdrdao TOC
+au BufNewFile,BufRead *.toc setf cdrtoc
+
+" Cdrdao config
+au BufNewFile,BufRead */etc/cdrdao.conf,*/etc/defaults/cdrdao,*/etc/default/cdrdao,.cdrdao setf cdrdaoconf
+
+" Cfengine
+au BufNewFile,BufRead cfengine.conf setf cfengine
+
+" ChaiScript
+au BufRead,BufNewFile *.chai setf chaiscript
+
+" Chatito
+au BufNewFile,BufRead *.chatito setf chatito
+
+" Comshare Dimension Definition Language
+au BufNewFile,BufRead *.cdl setf cdl
+
+" Conary Recipe
+au BufNewFile,BufRead *.recipe setf conaryrecipe
+
+" ChainPack Object Notation (CPON)
+au BufNewFile,BufRead *.cpon setf cpon
+
+" Controllable Regex Mutilator
+au BufNewFile,BufRead *.crm setf crm
+
+" Cyn++
+au BufNewFile,BufRead *.cyn setf cynpp
+
+" Cynlib
+" .cc and .cpp files can be C++ or Cynlib.
+au BufNewFile,BufRead *.cc
+ \ if exists("cynlib_syntax_for_cc")|setf cynlib|else|setf cpp|endif
+au BufNewFile,BufRead *.cpp
+ \ if exists("cynlib_syntax_for_cpp")|setf cynlib|else|setf cpp|endif
+
+" C++
+au BufNewFile,BufRead *.cxx,*.c++,*.hh,*.hxx,*.hpp,*.ipp,*.moc,*.tcc,*.inl setf cpp
+if has("fname_case")
+ au BufNewFile,BufRead *.C,*.H setf cpp
+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 dist#ft#FTheader()
+
+" Ch (CHscript)
+au BufNewFile,BufRead *.chf setf ch
+
+" TLH files are C++ headers generated by Visual C++'s #import from typelibs
+au BufNewFile,BufRead *.tlh setf cpp
+
+" Cascading Style Sheets
+au BufNewFile,BufRead *.css setf css
+
+" Century Term Command Scripts (*.cmd too)
+au BufNewFile,BufRead *.con setf cterm
+
+" Changelog
+au BufNewFile,BufRead changelog.Debian,changelog.dch,NEWS.Debian,NEWS.dch,*/debian/changelog
+ \ setf debchangelog
+
+au BufNewFile,BufRead [cC]hange[lL]og
+ \ if getline(1) =~ '; urgency='
+ \| setf debchangelog
+ \| else
+ \| setf changelog
+ \| endif
+
+au BufNewFile,BufRead NEWS
+ \ if getline(1) =~ '; urgency='
+ \| setf debchangelog
+ \| endif
+
+" CHILL
+au BufNewFile,BufRead *..ch setf chill
+
+" Changes for WEB and CWEB or CHILL
+au BufNewFile,BufRead *.ch call dist#ft#FTchange()
+
+" ChordPro
+au BufNewFile,BufRead *.chopro,*.crd,*.cho,*.crdpro,*.chordpro setf chordpro
+
+" Clangd
+au BufNewFile,BufRead .clangd setf yaml
+
+" Clang-format
+au BufNewFile,BufRead .clang-format setf yaml
+
+" Clang-tidy
+au BufNewFile,BufRead .clang-tidy setf yaml
+
+" Clean
+au BufNewFile,BufRead *.dcl,*.icl setf clean
+
+" Clever
+au BufNewFile,BufRead *.eni setf cl
+
+" Clever or dtd
+au BufNewFile,BufRead *.ent call dist#ft#FTent()
+
+" Clipper, FoxPro, ABB RAPID or eviews
+au BufNewFile,BufRead *.prg\c call dist#ft#FTprg()
+
+" Clojure
+au BufNewFile,BufRead *.clj,*.cljs,*.cljx,*.cljc setf clojure
+
+" Cmake
+au BufNewFile,BufRead CMakeLists.txt,*.cmake,*.cmake.in setf cmake
+
+" Cmusrc
+au BufNewFile,BufRead */.cmus/{autosave,rc,command-history,*.theme} setf cmusrc
+au BufNewFile,BufRead */cmus/{rc,*.theme} setf cmusrc
+
+" Cobol
+au BufNewFile,BufRead *.cbl,*.cob,*.lib setf cobol
+" cobol or zope form controller python script? (heuristic)
+au BufNewFile,BufRead *.cpy
+ \ if getline(1) =~ '^##' |
+ \ setf python |
+ \ else |
+ \ setf cobol |
+ \ endif
+
+" Coco/R
+au BufNewFile,BufRead *.atg setf coco
+
+" Cold Fusion
+au BufNewFile,BufRead *.cfm,*.cfi,*.cfc setf cf
+
+" Configure scripts
+au BufNewFile,BufRead configure.in,configure.ac setf config
+
+" Cooklang
+au BufNewFile,BufRead *.cook setf cook
+
+" Clinical Quality Language (CQL)
+" .cql is also mentioned as the 'XDCC Catcher queue list' file extension.
+" If support for XDCC Catcher is needed in the future, the contents of the file
+" needs to be inspected.
+au BufNewFile,BufRead *.cql setf cqlang
+
+" CSV Files
+au BufNewFile,BufRead *.csv setf csv
+
+" CUDA Compute Unified Device Architecture
+au BufNewFile,BufRead *.cu,*.cuh setf cuda
+
+" Cue
+au BufNewFile,BufRead *.cue setf cue
+
+" Dockerfile; Podman uses the same syntax with name Containerfile
+" Also see Dockerfile.* below.
+au BufNewFile,BufRead Containerfile,Dockerfile,dockerfile,*.[dD]ockerfile setf dockerfile
+
+" WildPackets EtherPeek Decoder
+au BufNewFile,BufRead *.dcd setf dcd
+
+" Enlightenment configuration files
+au BufNewFile,BufRead *enlightenment/*.cfg setf c
+
+" Eterm
+au BufNewFile,BufRead *Eterm/*.cfg setf eterm
+
+" Elixir or Euphoria
+au BufNewFile,BufRead *.ex call dist#ft#ExCheck()
+
+" Elixir
+au BufRead,BufNewFile mix.lock,*.exs setf elixir
+au BufRead,BufNewFile *.eex,*.leex setf eelixir
+
+" Elvish
+au BufRead,BufNewFile *.elv setf elvish
+
+" Euphoria 3 or 4
+au BufNewFile,BufRead *.eu,*.ew,*.exu,*.exw call dist#ft#EuphoriaCheck()
+if has("fname_case")
+ au BufNewFile,BufRead *.EU,*.EW,*.EX,*.EXU,*.EXW call dist#ft#EuphoriaCheck()
+endif
+
+" Lynx config files
+au BufNewFile,BufRead lynx.cfg setf lynx
+
+" LyRiCs
+au BufNewFile,BufRead *.lrc setf lyrics
+
+" Modula-3 configuration language (must be before *.cfg and *makefile)
+au BufNewFile,BufRead *.quake,cm3.cfg setf m3quake
+au BufNewFile,BufRead m3makefile,m3overrides setf m3build
+
+" Quake
+au BufNewFile,BufRead *baseq[2-3]/*.cfg,*id1/*.cfg setf quake
+au BufNewFile,BufRead *quake[1-3]/*.cfg setf quake
+
+" Quake C
+au BufNewFile,BufRead *.qc setf c
+
+" Configure files
+au BufNewFile,BufRead *.cfg\c call dist#ft#FTcfg()
+
+" Cucumber
+au BufNewFile,BufRead *.feature setf cucumber
+
+" Communicating Sequential Processes
+au BufNewFile,BufRead *.csp,*.fdr setf csp
+
+" CUPL logic description and simulation
+au BufNewFile,BufRead *.pld setf cupl
+au BufNewFile,BufRead *.si setf cuplsim
+
+" Dart
+au BufRead,BufNewfile *.dart,*.drt setf dart
+
+" Debian Control
+au BufNewFile,BufRead */debian/control setf debcontrol
+au BufNewFile,BufRead control
+ \ if getline(1) =~ '^Source:'
+ \| 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
+
+" Deny hosts
+au BufNewFile,BufRead denyhosts.conf setf denyhosts
+
+" Dhall
+au BufNewFile,BufRead *.dhall setf dhall
+
+" dnsmasq(8) configuration files
+au BufNewFile,BufRead */etc/dnsmasq.conf setf dnsmasq
+
+" ROCKLinux package description
+au BufNewFile,BufRead *.desc setf desc
+
+" the D language or dtrace
+au BufNewFile,BufRead */dtrace/*.d setf dtrace
+au BufNewFile,BufRead *.d call dist#ft#DtraceCheck()
+
+" Desktop files
+au BufNewFile,BufRead *.desktop,*.directory setf desktop
+
+" Dict config
+au BufNewFile,BufRead dict.conf,.dictrc setf dictconf
+
+" Dictd config
+au BufNewFile,BufRead dictd*.conf setf dictdconf
+
+" DEP3 formatted patch files
+au BufNewFile,BufRead */debian/patches/* call dist#ft#Dep3patch()
+
+" Diff files
+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
+
+" Diva (with Skill) or InstallShield
+au BufNewFile,BufRead *.rul
+ \ if getline(1).getline(2).getline(3).getline(4).getline(5).getline(6) =~? 'InstallShield' |
+ \ setf ishd |
+ \ else |
+ \ setf diva |
+ \ endif
+
+" DCL (Digital Command Language - vms) or DNS zone file
+au BufNewFile,BufRead *.com call dist#ft#BindzoneCheck('dcl')
+
+" DOT
+au BufNewFile,BufRead *.dot,*.gv setf dot
+
+" Dune
+au BufNewFile,BufRead jbuild,dune,dune-project,dune-workspace setf dune
+
+" Dylan - lid files
+au BufNewFile,BufRead *.lid setf dylanlid
+
+" Dylan - intr files (melange)
+au BufNewFile,BufRead *.intr setf dylanintr
+
+" Dylan
+au BufNewFile,BufRead *.dylan setf dylan
+
+" Microsoft Module Definition
+au BufNewFile,BufRead *.def setf def
+
+" Dracula
+au BufNewFile,BufRead *.drac,*.drc,*lvs,*lpe setf dracula
+
+" Datascript
+au BufNewFile,BufRead *.ds setf datascript
+
+" dsl: DSSSL or Structurizr
+au BufNewFile,BufRead *.dsl
+ \ if getline(1) =~ '^\s*<\!' |
+ \ setf dsl |
+ \ else |
+ \ setf structurizr |
+ \ endif
+
+" DTD (Document Type Definition for XML)
+au BufNewFile,BufRead *.dtd setf dtd
+
+" DTS/DSTI (device tree files)
+au BufNewFile,BufRead *.dts,*.dtsi setf dts
+
+" 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
+au BufNewFile,BufRead .editorconfig setf editorconfig
+
+" Embedix Component Description
+au BufNewFile,BufRead *.ecd setf ecd
+
+" Eiffel or Specman or Euphoria
+au BufNewFile,BufRead *.e,*.E call dist#ft#FTe()
+
+" Elinks configuration
+au BufNewFile,BufRead elinks.conf setf elinks
+
+" ERicsson LANGuage; Yaws is erlang too
+au BufNewFile,BufRead *.erl,*.hrl,*.yaws setf erlang
+
+" Elm
+au BufNewFile,BufRead *.elm setf elm
+
+" Elm Filter Rules file
+au BufNewFile,BufRead filter-rules setf elmfilt
+
+" Elsa - https://github.com/ucsd-progsys/elsa
+au BufNewFile,BufRead *.lc setf elsa
+
+" ESMTP rc file
+au BufNewFile,BufRead *esmtprc setf esmtprc
+
+" ESQL-C
+au BufNewFile,BufRead *.ec,*.EC setf esqlc
+
+" Esterel
+au BufNewFile,BufRead *.strl setf esterel
+
+" Essbase script
+au BufNewFile,BufRead *.csc setf csc
+
+" Exim
+au BufNewFile,BufRead exim.conf setf exim
+
+" Expect
+au BufNewFile,BufRead *.exp setf expect
+
+" Exports
+au BufNewFile,BufRead exports setf exports
+
+" Falcon
+au BufNewFile,BufRead *.fal setf falcon
+
+" Fantom
+au BufNewFile,BufRead *.fan,*.fwt setf fan
+
+" Factor
+au BufNewFile,BufRead *.factor setf factor
+
+" Fennel
+autocmd BufRead,BufNewFile *.fnl setf fennel
+
+" Fetchmail RC file
+au BufNewFile,BufRead .fetchmailrc setf fetchmail
+
+" FIRRTL - Flexible Internal Representation for RTL
+au BufNewFile,BufRead *.fir setf firrtl
+
+" Fish shell
+au BufNewFile,BufRead *.fish setf fish
+
+" FlexWiki - disabled, because it has side effects when a .wiki file
+" is not actually FlexWiki
+"au BufNewFile,BufRead *.wiki setf flexwiki
+
+" Focus Executable
+au BufNewFile,BufRead *.fex,*.focexec setf focexec
+
+" Focus Master file (but not for auto.master)
+au BufNewFile,BufRead auto.master setf conf
+au BufNewFile,BufRead *.mas,*.master setf master
+
+" Forth
+au BufNewFile,BufRead *.ft,*.fth setf forth
+
+" Reva Forth
+au BufNewFile,BufRead *.frt setf reva
+
+" Fortran
+if has("fname_case")
+ au BufNewFile,BufRead *.F,*.FOR,*.FPP,*.FTN,*.F77,*.F90,*.F95,*.F03,*.F08 setf fortran
+endif
+au BufNewFile,BufRead *.f,*.for,*.fortran,*.fpp,*.ftn,*.f77,*.f90,*.f95,*.f03,*.f08 setf fortran
+
+" Framescript
+au BufNewFile,BufRead *.fsl setf framescript
+
+" FStab
+au BufNewFile,BufRead fstab,mtab setf fstab
+
+" Func
+au BufNewFile,BufRead *.fc setf func
+
+" Fusion
+au BufRead,BufNewFile *.fusion setf fusion
+
+" F# or Forth
+au BufNewFile,BufRead *.fs call dist#ft#FTfs()
+
+" FHIR Shorthand (FSH)
+au BufNewFile,BufRead *.fsh setf fsh
+
+" F#
+au BufNewFile,BufRead *.fsi,*.fsx setf fsharp
+
+" GDB command files
+au BufNewFile,BufRead .gdbinit,gdbinit,.gdbearlyinit,gdbearlyinit,*.gdb setf gdb
+
+" GDMO
+au BufNewFile,BufRead *.mo,*.gdmo setf gdmo
+
+" GDscript
+au BufNewFile,BufRead *.gd setf gdscript
+
+" Godot resource
+au BufRead,BufNewFile *.tscn,*.tres setf gdresource
+
+" Godot shader
+au BufRead,BufNewFile *.gdshader,*.shader setf gdshader
+
+" Gedcom
+au BufNewFile,BufRead *.ged,lltxxxxx.txt setf gedcom
+
+" Gemtext
+au BufNewFile,BufRead *.gmi,*.gemini setf gemtext
+
+" Gift (Moodle)
+autocmd BufRead,BufNewFile *.gift setf gift
+
+" Git
+au BufNewFile,BufRead COMMIT_EDITMSG,MERGE_MSG,TAG_EDITMSG setf gitcommit
+au BufNewFile,BufRead NOTES_EDITMSG,EDIT_DESCRIPTION setf gitcommit
+au BufNewFile,BufRead *.git/config,.gitconfig,*/etc/gitconfig setf gitconfig
+au BufNewFile,BufRead */.config/git/config setf gitconfig
+au BufNewFile,BufRead *.git/config.worktree setf gitconfig
+au BufNewFile,BufRead *.git/worktrees/*/config.worktree 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/attributes setf gitattributes
+ au BufNewFile,BufRead $XDG_CONFIG_HOME/git/ignore setf gitignore
+endif
+au BufNewFile,BufRead .gitattributes,*.git/info/attributes setf gitattributes
+au BufNewFile,BufRead */.config/git/attributes setf gitattributes
+au BufNewFile,BufRead */etc/gitattributes setf gitattributes
+au BufNewFile,BufRead .gitignore,*.git/info/exclude setf gitignore
+au BufNewFile,BufRead */.config/git/ignore setf gitignore
+au BufNewFile,BufRead git-rebase-todo setf gitrebase
+au BufRead,BufNewFile .gitsendemail.msg.?????? setf gitsendemail
+au BufNewFile,BufRead *.git/*
+ \ if getline(1) =~# '^\x\{40,\}\>\|^ref: ' |
+ \ setf git |
+ \ endif
+
+" Gkrellmrc
+au BufNewFile,BufRead gkrellmrc,gkrellmrc_? setf gkrellmrc
+
+" Gleam
+au BufNewFile,BufRead *.gleam setf gleam
+
+" GLSL
+au BufNewFile,BufRead *.glsl setf glsl
+
+" GP scripts (2.0 and onward)
+au BufNewFile,BufRead *.gp,.gprc setf gp
+
+" GPG
+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
+
+" Gitolite
+au BufNewFile,BufRead gitolite.conf setf gitolite
+au BufNewFile,BufRead {,.}gitolite.rc,example.gitolite.rc setf perl
+
+" Glimmer-flavored TypeScript and JavaScript
+au BufNewFile,BufRead *.gts setf typescript.glimmer
+au BufNewFile,BufRead *.gjs setf javascript.glimmer
+
+" Gnuplot scripts
+au BufNewFile,BufRead *.gpi,.gnuplot setf gnuplot
+
+" Go (Google)
+au BufNewFile,BufRead *.go setf go
+au BufNewFile,BufRead Gopkg.lock setf toml
+au BufRead,BufNewFile go.work setf gowork
+
+" GrADS scripts
+au BufNewFile,BufRead *.gs setf grads
+
+" GraphQL
+au BufNewFile,BufRead *.graphql,*.graphqls,*.gql setf graphql
+
+" Gretl
+au BufNewFile,BufRead *.gretl setf gretl
+
+" Groovy
+au BufNewFile,BufRead *.gradle,*.groovy setf groovy
+
+" GNU Server Pages
+au BufNewFile,BufRead *.gsp setf gsp
+
+" Group file
+au BufNewFile,BufRead */etc/group,*/etc/group-,*/etc/group.edit,*/etc/gshadow,*/etc/gshadow-,*/etc/gshadow.edit,*/var/backups/group.bak,*/var/backups/gshadow.bak setf group
+
+" GTK RC
+au BufNewFile,BufRead .gtkrc,gtkrc setf gtkrc
+
+" GYP
+au BufNewFile,BufRead *.gyp,*.gypi setf gyp
+
+" Hack
+au BufRead,BufNewFile *.hack,*.hackpartial setf hack
+
+" Haml
+au BufNewFile,BufRead *.haml setf haml
+
+" Hamster Classic | Playground files
+au BufNewFile,BufRead *.hsm setf hamster
+
+" Handlebars
+au BufNewFile,BufRead *.hbs setf handlebars
+
+" Hare
+au BufNewFile,BufRead *.ha setf hare
+
+" Haskell
+au BufNewFile,BufRead *.hs,*.hsc,*.hs-boot,*.hsig setf haskell
+au BufNewFile,BufRead *.lhs setf lhaskell
+au BufNewFile,BufRead *.chs setf chaskell
+au BufNewFile,BufRead cabal.project setf cabalproject
+au BufNewFile,BufRead $HOME/.cabal/config setf cabalconfig
+au BufNewFile,BufRead cabal.config setf cabalconfig
+
+" Haste
+au BufNewFile,BufRead *.ht setf haste
+au BufNewFile,BufRead *.htpp setf hastepreproc
+
+" HCL
+au BufRead,BufNewFile *.hcl setf hcl
+
+" Go checksum file (must be before *.sum Hercules)
+au BufNewFile,BufRead go.sum,go.work.sum setf gosum
+
+" Hercules
+au BufNewFile,BufRead *.vc,*.ev,*.sum,*.errsum setf hercules
+
+" HEEx
+au BufRead,BufNewFile *.heex setf heex
+
+" HEX (Intel)
+au BufNewFile,BufRead *.hex,*.h32 setf hex
+
+" Hjson
+au BufNewFile,BufRead *.hjson setf hjson
+
+" HLS Playlist (or another form of playlist)
+au BufNewFile,BufRead *.m3u,*.m3u8 setf hlsplaylist
+
+" Hollywood
+au BufRead,BufNewFile *.hws setf hollywood
+
+" Hoon
+au BufRead,BufNewFile *.hoon setf hoon
+
+" Tilde (must be before HTML)
+au BufNewFile,BufRead *.t.html setf tilde
+
+" HTML (.shtml and .stm for server side)
+au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm call dist#ft#FThtml()
+au BufNewFile,BufRead *.cshtml setf html
+
+" HTML with Ruby - eRuby
+au BufNewFile,BufRead *.erb,*.rhtml setf eruby
+
+" HTML with M4
+au BufNewFile,BufRead *.html.m4 setf htmlm4
+
+" Some template. Used to be HTML Cheetah.
+au BufNewFile,BufRead *.tmpl setf template
+
+" Host config
+au BufNewFile,BufRead */etc/host.conf setf hostconf
+
+" Hosts access
+au BufNewFile,BufRead */etc/hosts.allow,*/etc/hosts.deny setf hostsaccess
+
+" Hyper Builder
+au BufNewFile,BufRead *.hb setf hb
+
+" Httest
+au BufNewFile,BufRead *.htt,*.htb setf httest
+
+" i3
+au BufNewFile,BufRead */i3/config setf i3config
+au BufNewFile,BufRead */.i3/config setf i3config
+
+" sway
+au BufNewFile,BufRead */sway/config setf swayconfig
+au BufNewFile,BufRead */.sway/config setf swayconfig
+
+" Icon
+au BufNewFile,BufRead *.icn setf icon
+
+" IDL (Interface Description Language)
+au BufNewFile,BufRead *.idl call dist#ft#FTidl()
+
+" Microsoft IDL (Interface Description Language) Also *.idl
+" MOF = WMI (Windows Management Instrumentation) Managed Object Format
+au BufNewFile,BufRead *.odl,*.mof setf msidl
+
+" Icewm menu
+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 dist#ft#ProtoCheck('indent')
+
+" IDL (Interactive Data Language)
+au BufNewFile,BufRead *.pro call dist#ft#ProtoCheck('idlang')
+
+" Indent RC
+au BufNewFile,BufRead indentrc setf indent
+
+" Inform
+au BufNewFile,BufRead *.inf,*.INF setf inform
+
+" Initng
+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 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
+
+" Ipfilter
+au BufNewFile,BufRead ipf.conf,ipf6.conf,ipf.rules setf ipfilter
+
+" Informix 4GL (source - canonical, include file, I4GL+M4 preproc.)
+au BufNewFile,BufRead *.4gl,*.4gh,*.m4gl setf fgl
+
+" .INI file for MSDOS
+au BufNewFile,BufRead *.ini setf dosini
+
+" SysV Inittab
+au BufNewFile,BufRead inittab setf inittab
+
+" Inno Setup
+au BufNewFile,BufRead *.iss setf iss
+
+" J
+au BufNewFile,BufRead *.ijs setf j
+
+" JAL
+au BufNewFile,BufRead *.jal,*.JAL setf jal
+
+" Jam
+au BufNewFile,BufRead *.jpl,*.jpr setf jam
+
+" Java
+au BufNewFile,BufRead *.java,*.jav setf java
+
+" JavaCC
+au BufNewFile,BufRead *.jj,*.jjt setf javacc
+
+" JavaScript, ECMAScript, ES module script, CommonJS script
+au BufNewFile,BufRead *.js,*.jsm,*.javascript,*.es,*.mjs,*.cjs setf javascript
+
+" JavaScript with React
+au BufNewFile,BufRead *.jsx setf javascriptreact
+
+" Java Server Pages
+au BufNewFile,BufRead *.jsp setf jsp
+
+" Java Properties resource file (note: doesn't catch font.properties.pl)
+au BufNewFile,BufRead *.properties,*.properties_??,*.properties_??_?? setf jproperties
+" Eclipse preference files use Java Properties syntax
+au BufNewFile,BufRead org.eclipse.*.prefs setf jproperties
+
+" Jess
+au BufNewFile,BufRead *.clp setf jess
+
+" Jgraph
+au BufNewFile,BufRead *.jgr setf jgraph
+
+" Jovial
+au BufNewFile,BufRead *.jov,*.j73,*.jovial setf jovial
+
+" Jq
+au BufNewFile,BufRead *.jq setf jq
+
+" JSON5
+au BufNewFile,BufRead *.json5 setf json5
+
+" JSON Patch (RFC 6902)
+au BufNewFile,BufRead *.json-patch setf json
+
+" Jupyter Notebook is also json
+au BufNewFile,BufRead *.ipynb setf json
+
+" Other files that look like json
+au BufNewFile,BufRead .prettierrc,.firebaserc,.stylelintrc setf json
+
+" JSONC (JSON with comments)
+au BufNewFile,BufRead *.jsonc,.babelrc,.eslintrc,.jsfmtrc setf jsonc
+au BufNewFile,BufRead .jshintrc,.hintrc,.swrc,[jt]sconfig*.json setf jsonc
+
+" JSON
+au BufNewFile,BufRead *.json,*.jsonp,*.webmanifest setf json
+
+" Jsonnet
+au BufNewFile,BufRead *.jsonnet,*.libsonnet setf jsonnet
+
+" Julia
+au BufNewFile,BufRead *.jl setf julia
+
+" KDL
+au BufNewFile,BufRead *.kdl setf kdl
+
+" Kixtart
+au BufNewFile,BufRead *.kix setf kix
+
+" Kuka Robot Language
+au BufNewFile,BufRead *.src\c call dist#ft#FTsrc()
+au BufNewFile,BufRead *.dat\c call dist#ft#FTdat()
+au BufNewFile,BufRead *.sub\c setf krl
+
+" Kimwitu[++]
+au BufNewFile,BufRead *.k setf kwt
+
+" Kivy
+au BufNewFile,BufRead *.kv setf kivy
+
+" Kotlin
+au BufNewFile,BufRead *.kt,*.ktm,*.kts setf kotlin
+
+" KDE script
+au BufNewFile,BufRead *.ks setf kscript
+
+" Kconfig
+au BufNewFile,BufRead Kconfig,Kconfig.debug setf kconfig
+
+" Lace (ISE)
+au BufNewFile,BufRead *.ace,*.ACE setf lace
+
+" Larch Shared Language
+au BufNewFile,BufRead .lsl call dist#ft#FTlsl()
+
+" Latexmkrc
+au BufNewFile,BufRead .latexmkrc,latexmkrc setf perl
+
+" Latte
+au BufNewFile,BufRead *.latte,*.lte setf latte
+
+" Limits
+au BufNewFile,BufRead */etc/limits,*/etc/*limits.conf,*/etc/*limits.d/*.conf setf limits
+
+" LambdaProlog or SML (see dist#ft#FTmod for *.mod)
+au BufNewFile,BufRead *.sig call dist#ft#FTsig()
+
+" LDAP LDIF
+au BufNewFile,BufRead *.ldif setf ldif
+
+" Ld loader
+au BufNewFile,BufRead *.ld setf ld
+
+" Ledger
+au BufRead,BufNewFile *.ldg,*.ledger,*.journal setf ledger
+
+" Less
+au BufNewFile,BufRead *.less setf less
+
+" Lex
+au BufNewFile,BufRead *.lex,*.l,*.lxx,*.l++ setf lex
+
+" Libao
+au BufNewFile,BufRead */etc/libao.conf,*/.libao setf libao
+
+" Libsensors
+au BufNewFile,BufRead */etc/sensors.conf,*/etc/sensors3.conf setf sensors
+
+" LFTP
+au BufNewFile,BufRead lftp.conf,.lftprc,*lftp/rc setf lftp
+
+" Lifelines (or Lex for C++!)
+au BufNewFile,BufRead *.ll setf lifelines
+
+" Lilo: Linux loader
+au BufNewFile,BufRead lilo.conf setf lilo
+
+" Lilypond
+au BufNewFile,BufRead *.ly,*.ily setf lilypond
+
+" Lisp (*.el = ELisp, *.cl = Common Lisp)
+" *.jl was removed, it's also used for Julia, better skip than guess wrong.
+if has("fname_case")
+ au BufNewFile,BufRead *.lsp,*.lisp,*.asd,*.el,*.cl,*.L,.emacs,.sawfishrc setf lisp
+else
+ au BufNewFile,BufRead *.lsp,*.lisp,*.asd,*.el,*.cl,.emacs,.sawfishrc setf lisp
+endif
+
+" SBCL implementation of Common Lisp
+au BufNewFile,BufRead sbclrc,.sbclrc setf lisp
+
+" Liquid
+au BufNewFile,BufRead *.liquid setf liquid
+
+" Lite
+au BufNewFile,BufRead *.lite,*.lt setf lite
+
+" LiteStep RC files
+au BufNewFile,BufRead */LiteStep/*/*.rc setf litestep
+
+" Login access
+au BufNewFile,BufRead */etc/login.access setf loginaccess
+
+" Login defs
+au BufNewFile,BufRead */etc/login.defs setf logindefs
+
+" Logtalk
+au BufNewFile,BufRead *.lgt setf logtalk
+
+" LOTOS
+au BufNewFile,BufRead *.lot,*.lotos setf lotos
+
+" Lout (also: *.lt)
+au BufNewFile,BufRead *.lou,*.lout setf lout
+
+" Lua
+au BufNewFile,BufRead *.lua setf lua
+
+" Luacheck
+au BufNewFile,BufRead .luacheckrc setf lua
+
+" Luarocks
+au BufNewFile,BufRead *.rockspec setf lua
+
+" Linden Scripting Language (Second Life)
+au BufNewFile,BufRead *.lsl call dist#ft#FTlsl()
+
+" Lynx style file (or LotusScript!)
+au BufNewFile,BufRead *.lss setf lss
+
+" M4
+au BufNewFile,BufRead *.m4
+ \ if expand("<afile>") !~? 'html.m4$\|fvwm2rc' | setf m4 | endif
+
+" MaGic Point
+au BufNewFile,BufRead *.mgp setf mgp
+
+" 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
+
+" Mailcap configuration file
+au BufNewFile,BufRead .mailcap,mailcap setf mailcap
+
+" Makefile
+au BufNewFile,BufRead *[mM]akefile,*.mk,*.mak,*.dsp setf make
+
+" MakeIndex
+au BufNewFile,BufRead *.ist,*.mst setf ist
+
+" Mallard
+au BufNewFile,BufRead *.page setf mallard
+
+" Manpage
+au BufNewFile,BufRead *.man setf man
+
+" Man config
+au BufNewFile,BufRead */etc/man.conf,man.config setf manconf
+
+" Maple V
+au BufNewFile,BufRead *.mv,*.mpl,*.mws setf maple
+
+" Map (UMN mapserver config file)
+au BufNewFile,BufRead *.map setf map
+
+" Markdown
+au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,*.md setf markdown
+
+" Mason
+au BufNewFile,BufRead *.mason,*.mhtml,*.comp setf mason
+
+" Mathematica, Matlab, Murphi, Objective C or Octave
+au BufNewFile,BufRead *.m call dist#ft#FTm()
+
+" Mathematica notebook
+au BufNewFile,BufRead *.nb setf mma
+
+" Maya Extension Language
+au BufNewFile,BufRead *.mel setf mel
+
+" Mercurial (hg) commit file
+au BufNewFile,BufRead hg-editor-*.txt setf hgcommit
+
+" Mercurial config (looks like generic config file)
+au BufNewFile,BufRead *.hgrc,*hgrc setf cfg
+
+" Mermaid
+au BufNewFile,BufRead *.mmd,*.mmdc,*.mermaid setf mermaid
+
+" Meson Build system config
+au BufNewFile,BufRead meson.build,meson_options.txt setf meson
+au BufNewFile,BufRead *.wrap setf dosini
+
+" Messages (logs mostly)
+au BufNewFile,BufRead */log/{auth,cron,daemon,debug,kern,lpr,mail,messages,news/news,syslog,user}{,.log,.err,.info,.warn,.crit,.notice}{,.[0-9]*,-[0-9]*} setf messages
+
+" Metafont
+au BufNewFile,BufRead *.mf setf mf
+
+" MetaPost
+au BufNewFile,BufRead *.mp setf mp
+au BufNewFile,BufRead *.mpxl,*.mpiv,*.mpvi let b:mp_metafun = 1 | setf mp
+
+" MGL
+au BufNewFile,BufRead *.mgl setf mgl
+
+" MIX - Knuth assembly
+au BufNewFile,BufRead *.mix,*.mixal setf mix
+
+" MMIX or VMS makefile
+au BufNewFile,BufRead *.mms call dist#ft#FTmms()
+
+" Symbian meta-makefile definition (MMP)
+au BufNewFile,BufRead *.mmp setf mmp
+
+" ABB Rapid, Modula-2, Modsim III or LambdaProlog
+au BufNewFile,BufRead *.mod\c call dist#ft#FTmod()
+
+" Modula-2 (.md removed in favor of Markdown, see dist#ft#FTmod for *.MOD)
+au BufNewFile,BufRead *.m2,*.DEF,*.mi setf modula2
+
+" Modula-3 (.m3, .i3, .mg, .ig)
+au BufNewFile,BufRead *.[mi][3g] setf modula3
+
+" Larch/Modula-3
+au BufNewFile,BufRead *.lm3 setf modula3
+
+" Modconf
+au BufNewFile,BufRead */etc/modules.conf,*/etc/modules,*/etc/conf.modules setf modconf
+
+" Monk
+au BufNewFile,BufRead *.isc,*.monk,*.ssc,*.tsc setf monk
+
+" MOO
+au BufNewFile,BufRead *.moo setf moo
+
+" Moonscript
+au BufNewFile,BufRead *.moon setf moonscript
+
+" Move language
+au BufNewFile,BufRead *.move setf move
+
+" MPD is based on XML
+au BufNewFile,BufRead *.mpd setf xml
+
+" Mplayer config
+au BufNewFile,BufRead mplayer.conf,*/.mplayer/config setf mplayerconf
+
+" Motorola S record
+au BufNewFile,BufRead *.s19,*.s28,*.s37,*.mot,*.srec setf srec
+
+" Mrxvtrc
+au BufNewFile,BufRead mrxvtrc,.mrxvtrc setf mrxvtrc
+
+" Msql
+au BufNewFile,BufRead *.msql setf msql
+
+" Mysql
+au BufNewFile,BufRead *.mysql setf mysql
+
+" Tcl Shell RC file
+au BufNewFile,BufRead tclsh.rc setf tcl
+
+" M$ Resource files
+" /etc/Muttrc.d/file.rc is muttrc
+au BufNewFile,BufRead *.rc,*.rch
+ \ if expand("<afile>") !~ "/etc/Muttrc.d/" |
+ \ setf rc |
+ \ endif
+
+" MuPAD source
+au BufRead,BufNewFile *.mu setf mupad
+
+" Mush
+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
+
+" Nastran input/DMAP
+"au BufNewFile,BufRead *.dat setf nastran
+
+" Natural
+au BufNewFile,BufRead *.NS[ACGLMNPS] setf natural
+
+" Noemutt setup file
+au BufNewFile,BufRead Neomuttrc setf neomuttrc
+
+" Netrc
+au BufNewFile,BufRead .netrc setf netrc
+
+" Nginx
+au BufNewFile,BufRead *.nginx,nginx*.conf,*nginx.conf,*/etc/nginx/*,*/usr/local/nginx/conf/*,*/nginx/*.conf setf nginx
+
+" Nim file
+au BufNewFile,BufRead *.nim,*.nims,*.nimble setf nim
+
+" Ninja file
+au BufNewFile,BufRead *.ninja setf ninja
+
+" Nix
+au BufRead,BufNewFile *.nix setf nix
+
+" NPM RC file
+au BufNewFile,BufRead npmrc,.npmrc setf dosini
+
+" Novell netware batch files
+au BufNewFile,BufRead *.ncf setf ncf
+
+" Nroff/Troff (*.ms and *.t are checked below)
+au BufNewFile,BufRead *.me
+ \ if expand("<afile>") != "read.me" && expand("<afile>") != "click.me" |
+ \ setf nroff |
+ \ endif
+au BufNewFile,BufRead *.tr,*.nr,*.roff,*.tmac,*.mom setf nroff
+au BufNewFile,BufRead *.[1-9] call dist#ft#FTnroff()
+
+" Nroff or Objective C++
+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
+
+" Oblivion Language and Oblivion Script Extender
+au BufNewFile,BufRead *.obl,*.obse,*.oblivion,*.obscript setf obse
+
+" OCaml
+au BufNewFile,BufRead *.ml,*.mli,*.mll,*.mly,.ocamlinit,*.mlt,*.mlp,*.mlip,*.mli.cppo,*.ml.cppo setf ocaml
+
+" Occam
+au BufNewFile,BufRead *.occ setf occam
+
+" Octave
+au BufNewFile,BufRead octave.conf,.octaverc,octaverc setf octave
+
+" Omnimark
+au BufNewFile,BufRead *.xom,*.xin setf omnimark
+
+" OPAM
+au BufNewFile,BufRead opam,*.opam,*.opam.template setf opam
+
+" OpenFOAM
+au BufNewFile,BufRead [a-zA-Z0-9]*Dict\(.*\)\=,[a-zA-Z]*Properties\(.*\)\=,*Transport\(.*\),fvSchemes,fvSolution,fvConstrains,fvModels,*/constant/g,*/0\(\.orig\)\=/* call dist#ft#FTfoam()
+
+" OpenROAD
+au BufNewFile,BufRead *.or setf openroad
+
+" OPL
+au BufNewFile,BufRead *.[Oo][Pp][Ll] setf opl
+
+" OpenSCAD
+au BufNewFile,BufRead *.scad setf openscad
+
+" Oracle config file
+au BufNewFile,BufRead *.ora setf ora
+
+" Org
+au BufNewFile,BufRead *.org,*.org_archive setf org
+
+" Packet filter conf
+au BufNewFile,BufRead pf.conf setf pf
+
+" ini style config files, using # comments
+au BufNewFile,BufRead */etc/pacman.conf,mpv.conf setf confini
+au BufNewFile,BufRead */.aws/config,*/.aws/credentials setf confini
+au BufNewFile,BufRead *.nmconnection setf confini
+
+" Pacman hooks
+au BufNewFile,BufRead *.hook
+ \ if getline(1) == '[Trigger]' |
+ \ setf conf |
+ \ endif
+
+" Pam conf
+au BufNewFile,BufRead */etc/pam.conf setf pamconf
+
+" Pam environment
+au BufNewFile,BufRead pam_env.conf,.pam_environment setf pamenv
+
+" PApp
+au BufNewFile,BufRead *.papp,*.pxml,*.pxsl setf papp
+
+" Password file
+au BufNewFile,BufRead */etc/passwd,*/etc/passwd-,*/etc/passwd.edit,*/etc/shadow,*/etc/shadow-,*/etc/shadow.edit,*/var/backups/passwd.bak,*/var/backups/shadow.bak setf passwd
+
+" Pascal (also *.p, *.pp, *.inc)
+au BufNewFile,BufRead *.pas setf pascal
+
+" Pascal or Puppet manifest
+au BufNewFile,BufRead *.pp call dist#ft#FTpp()
+
+" Delphi or Lazarus program file
+au BufNewFile,BufRead *.dpr,*.lpr setf pascal
+
+" Free Pascal makefile definition file
+au BufNewFile,BufRead *.fpc setf fpcmake
+
+" Path of Exile item filter
+au BufNewFile,BufRead *.filter setf poefilter
+
+" 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 dist#ft#FTpl()
+else
+ au BufNewFile,BufRead *.pl call dist#ft#FTpl()
+endif
+au BufNewFile,BufRead *.plx,*.al,*.psgi setf perl
+
+" Perl, XPM or XPM2
+au BufNewFile,BufRead *.pm
+ \ if getline(1) =~ "XPM2" |
+ \ setf xpm2 |
+ \ elseif getline(1) =~ "XPM" |
+ \ setf xpm |
+ \ else |
+ \ setf perl |
+ \ endif
+
+" Perl POD
+au BufNewFile,BufRead *.pod setf pod
+
+" Php, php3, php4, etc.
+" Also Phtml (was used for PHP 2 in the past).
+" Also .ctp for Cake template file.
+" Also .phpt for php tests.
+" Also .theme for Drupal theme files.
+au BufNewFile,BufRead *.php,*.php\d,*.phtml,*.ctp,*.phpt,*.theme setf php
+
+" PHP config
+au BufNewFile,BufRead php.ini-* setf dosini
+
+" 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
+
+" Palm Resource compiler
+au BufNewFile,BufRead *.rcp setf pilrc
+
+" Pine config
+au BufNewFile,BufRead .pinerc,pinerc,.pinercex,pinercex setf pine
+
+" Pipenv Pipfiles
+au BufNewFile,BufRead Pipfile setf toml
+au BufNewFile,BufRead Pipfile.lock setf json
+
+" PL/1, PL/I
+au BufNewFile,BufRead *.pli,*.pl1 setf pli
+
+" PL/M (also: *.inp)
+au BufNewFile,BufRead *.plm,*.p36,*.pac setf plm
+
+" PL/SQL
+au BufNewFile,BufRead *.pls,*.plsql setf plsql
+
+" PLP
+au BufNewFile,BufRead *.plp setf plp
+
+" PO and PO template (GNU gettext)
+au BufNewFile,BufRead *.po,*.pot setf po
+
+" Postfix main config
+au BufNewFile,BufRead main.cf,main.cf.proto setf pfmain
+
+" PostScript (+ font files, encapsulated PostScript, Adobe Illustrator)
+au BufNewFile,BufRead *.ps,*.pfa,*.afm,*.eps,*.epsf,*.epsi,*.ai setf postscr
+
+" PostScript Printer Description
+au BufNewFile,BufRead *.ppd setf ppd
+
+" Povray
+au BufNewFile,BufRead *.pov setf pov
+
+" Povray configuration
+au BufNewFile,BufRead .povrayrc setf povini
+
+" Povray, Pascal, PHP or assembly
+au BufNewFile,BufRead *.inc call dist#ft#FTinc()
+
+" PowerShell
+au BufNewFile,BufRead *.ps1,*.psd1,*.psm1,*.pssc setf ps1
+au BufNewFile,BufRead *.ps1xml setf ps1xml
+au BufNewFile,BufRead *.cdxml,*.psc1 setf xml
+
+" Printcap and Termcap
+au BufNewFile,BufRead *printcap
+ \ let b:ptcap_type = "print" | setf ptcap
+au BufNewFile,BufRead *termcap
+ \ let b:ptcap_type = "term" | setf ptcap
+
+" Prisma
+au BufRead,BufNewFile *.prisma setf prisma
+
+" PCCTS / ANTLR
+"au BufNewFile,BufRead *.g setf antlr
+au BufNewFile,BufRead *.g setf pccts
+
+" PPWizard
+au BufNewFile,BufRead *.it,*.ih setf ppwiz
+
+" Pug
+au BufRead,BufNewFile *.pug setf pug
+
+" Puppet
+au BufNewFile,BufRead Puppetfile setf ruby
+
+" Embedded Puppet
+au BufNewFile,BufRead *.epp setf epuppet
+
+" Obj 3D file format
+" TODO: is there a way to avoid MS-Windows Object files?
+au BufNewFile,BufRead *.obj setf obj
+
+" Oracle Pro*C/C++
+au BufNewFile,BufRead *.pc setf proc
+
+" Privoxy actions file
+au BufNewFile,BufRead *.action setf privoxy
+
+" Procmail
+au BufNewFile,BufRead .procmail,.procmailrc setf procmail
+
+" Progress or CWEB
+au BufNewFile,BufRead *.w call dist#ft#FTprogress_cweb()
+
+" Progress or assembly
+au BufNewFile,BufRead *.i call dist#ft#FTprogress_asm()
+
+" Progress or Pascal
+au BufNewFile,BufRead *.p call dist#ft#FTprogress_pascal()
+
+" Software Distributor Product Specification File (POSIX 1387.2-1995)
+au BufNewFile,BufRead *.psf setf psf
+au BufNewFile,BufRead INDEX,INFO
+ \ if getline(1) =~ '^\s*\(distribution\|installed_software\|root\|bundle\|product\)\s*$' |
+ \ setf psf |
+ \ endif
+
+" Prolog
+au BufNewFile,BufRead *.pdb setf prolog
+
+" Promela
+au BufNewFile,BufRead *.pml setf promela
+
+" Property Specification Language (PSL)
+au BufNewFile,BufRead *.psl setf psl
+
+" Google protocol buffers
+au BufNewFile,BufRead *.proto setf proto
+au BufNewFile,BufRead *.pbtxt setf pbtxt
+
+" Poke
+au BufNewFile,BufRead *.pk setf poke
+
+" Protocols
+au BufNewFile,BufRead */etc/protocols setf protocols
+
+" Pyret
+au BufNewFile,BufRead *.arr setf pyret
+
+" Pyrex
+au BufNewFile,BufRead *.pyx,*.pxd setf pyrex
+
+" Python, Python Shell Startup and Python Stub Files
+" Quixote (Python-based web framework)
+au BufNewFile,BufRead *.py,*.pyw,.pythonstartup,.pythonrc setf python
+au BufNewFile,BufRead *.ptl,*.pyi,SConstruct setf python
+
+" QL
+au BufRead,BufNewFile *.ql,*.qll setf ql
+
+" Quarto
+au BufRead,BufNewFile *.qmd setf quarto
+
+" Radiance
+au BufNewFile,BufRead *.rad,*.mat setf radiance
+
+" Raku (formerly Perl6)
+au BufNewFile,BufRead *.pm6,*.p6,*.t6,*.pod6,*.raku,*.rakumod,*.rakudoc,*.rakutest setf raku
+
+" Ratpoison config/command files
+au BufNewFile,BufRead .ratpoisonrc,ratpoisonrc setf ratpoison
+
+" RCS file
+au BufNewFile,BufRead *\,v setf rcs
+
+" Readline
+au BufNewFile,BufRead .inputrc,inputrc setf readline
+
+" Registry for MS-Windows
+au BufNewFile,BufRead *.reg
+ \ if getline(1) =~? '^REGEDIT[0-9]*\s*$\|^Windows Registry Editor Version \d*\.\d*\s*$' | setf registry | endif
+
+" Renderman Interface Bytestream
+au BufNewFile,BufRead *.rib setf rib
+
+" Rego Policy Language
+au BufNewFile,BufRead *.rego setf rego
+
+" Rexx
+au BufNewFile,BufRead *.rex,*.orx,*.rxo,*.rxj,*.jrexx,*.rexxj,*.rexx,*.testGroup,*.testUnit setf rexx
+
+" R Help file
+if has("fname_case")
+ au BufNewFile,BufRead *.rd,*.Rd setf rhelp
+else
+ au BufNewFile,BufRead *.rd setf rhelp
+endif
+
+" R noweb file
+if has("fname_case")
+ au BufNewFile,BufRead *.Rnw,*.rnw,*.Snw,*.snw setf rnoweb
+else
+ au BufNewFile,BufRead *.rnw,*.snw setf rnoweb
+endif
+
+" R Markdown file
+if has("fname_case")
+ au BufNewFile,BufRead *.Rmd,*.rmd,*.Smd,*.smd setf rmd
+else
+ au BufNewFile,BufRead *.rmd,*.smd setf rmd
+endif
+
+" R profile file
+au BufNewFile,BufRead .Rprofile,Rprofile,Rprofile.site setf r
+
+" RSS looks like XML
+au BufNewFile,BufRead *.rss setf xml
+
+" R reStructuredText file
+if has("fname_case")
+ au BufNewFile,BufRead *.Rrst,*.rrst,*.Srst,*.srst setf rrst
+else
+ au BufNewFile,BufRead *.rrst,*.srst setf rrst
+endif
+
+" Rexx, Rebol or R
+au BufNewFile,BufRead *.r,*.R call dist#ft#FTr()
+
+" Remind
+au BufNewFile,BufRead .reminders,*.remind,*.rem setf remind
+
+" ReScript
+au BufNewFile,BufRead *.res,*.resi setf rescript
+
+" Resolv.conf
+au BufNewFile,BufRead resolv.conf setf resolv
+
+" Relax NG Compact
+au BufNewFile,BufRead *.rnc setf rnc
+
+" Relax NG XML
+au BufNewFile,BufRead *.rng setf rng
+
+" RPL/2
+au BufNewFile,BufRead *.rpl setf rpl
+
+" Robot Framework
+au BufNewFile,BufRead *.robot,*.resource setf robot
+
+" Robots.txt
+au BufNewFile,BufRead robots.txt setf robots
+
+" RON (Rusty Object Notation)
+au BufNewFile,BufRead *.ron setf ron
+
+" MikroTik RouterOS script
+au BufRead,BufNewFile *.rsc setf routeros
+
+" Rpcgen
+au BufNewFile,BufRead *.x setf rpcgen
+
+" reStructuredText Documentation Format
+au BufNewFile,BufRead *.rst setf rst
+
+" RTF
+au BufNewFile,BufRead *.rtf setf rtf
+
+" Interactive Ruby shell
+au BufNewFile,BufRead .irbrc,irbrc setf ruby
+
+" Ruby
+au BufNewFile,BufRead *.rb,*.rbw setf ruby
+
+" RubyGems
+au BufNewFile,BufRead *.gemspec setf ruby
+
+" RBS (Ruby Signature)
+au BufNewFile,BufRead *.rbs setf rbs
+
+" Rackup
+au BufNewFile,BufRead *.ru setf ruby
+
+" Bundler
+au BufNewFile,BufRead Gemfile setf ruby
+
+" Ruby on Rails
+au BufNewFile,BufRead *.builder,*.rxml,*.rjs setf ruby
+
+" Rantfile and Rakefile is like Ruby
+au BufNewFile,BufRead [rR]antfile,*.rant,[rR]akefile,*.rake setf ruby
+
+" Rust
+au BufNewFile,BufRead *.rs setf rust
+au BufNewFile,BufRead Cargo.lock,*/.cargo/config,*/.cargo/credentials setf toml
+
+" S-lang (or shader language, or SmallLisp)
+au BufNewFile,BufRead *.sl setf slang
+
+" Samba config
+au BufNewFile,BufRead smb.conf setf samba
+
+" SAS script
+au BufNewFile,BufRead *.sas setf sas
+
+" Sass
+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
+
+" SuperCollider
+au BufNewFile,BufRead *.sc call dist#ft#FTsc()
+
+au BufNewFile,BufRead *.quark setf supercollider
+
+" scdoc
+au BufNewFile,BufRead *.scd call dist#ft#FTscd()
+
+" Scilab
+au BufNewFile,BufRead *.sci,*.sce setf scilab
+
+
+" SCSS
+au BufNewFile,BufRead *.scss setf scss
+
+" SD: Streaming Descriptors
+au BufNewFile,BufRead *.sd setf sd
+
+" SDL
+au BufNewFile,BufRead *.sdl,*.pr setf sdl
+
+" sed
+au BufNewFile,BufRead *.sed setf sed
+
+" SubRip
+au BufNewFile,BufRead *.srt setf srt
+
+" SubStation Alpha
+au BufNewFile,BufRead *.ass,*.ssa setf ssa
+
+" svelte
+au BufNewFile,BufRead *.svelte setf svelte
+
+" 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 or
+" Maxima.
+au BufNewFile,BufRead *.mc call dist#ft#McSetf()
+
+" Services
+au BufNewFile,BufRead */etc/services setf services
+
+" Service Location config
+au BufNewFile,BufRead */etc/slp.conf setf slpconf
+
+" Service Location registration
+au BufNewFile,BufRead */etc/slp.reg setf slpreg
+
+" Service Location SPI
+au BufNewFile,BufRead */etc/slp.spi setf slpspi
+
+" Setserial config
+au BufNewFile,BufRead */etc/serial.conf setf setserial
+
+" SGML
+au BufNewFile,BufRead *.sgm,*.sgml
+ \ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'linuxdoc' |
+ \ setf sgmllnx |
+ \ elseif getline(1) =~ '<!DOCTYPE.*DocBook' || getline(2) =~ '<!DOCTYPE.*DocBook' |
+ \ let b:docbk_type = "sgml" |
+ \ let b:docbk_ver = 4 |
+ \ setf docbk |
+ \ else |
+ \ setf sgml |
+ \ endif
+
+" SGMLDECL
+au BufNewFile,BufRead *.decl,*.dcl,*.dec
+ \ if getline(1).getline(2).getline(3) =~? '^<!SGML' |
+ \ setf sgmldecl |
+ \ endif
+
+" SGML catalog file
+au BufNewFile,BufRead catalog setf catalog
+
+" Shell scripts (sh, ksh, bash, bash2, csh); Allow .profile_foo etc.
+" Gentoo ebuilds, Arch Linux PKGBUILDs and Alpine Linux APKBUILDs are actually
+" bash scripts.
+" NOTE: Patterns ending in a star are further down, these have lower priority.
+au BufNewFile,BufRead .bashrc,bashrc,bash.bashrc,.bash[_-]profile,.bash[_-]logout,.bash[_-]aliases,bash-fc[-.],*.ebuild,*.bash,*.eclass,PKGBUILD,APKBUILD 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 dist#ft#SetFileTypeSH("bash") |
+ \ endif
+
+" tcsh scripts (patterns ending in a star further below)
+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)
+" (patterns ending in a start further below)
+au BufNewFile,BufRead .login,.cshrc,csh.cshrc,csh.login,csh.logout,*.csh,.alias call dist#ft#CSH()
+
+" Zig and Zir (Zig Intermediate Representation)
+au BufNewFile,BufRead *.zig setf zig
+au BufNewFile,BufRead *.zir setf zir
+
+" Z-Shell script (patterns ending in a star further below)
+au BufNewFile,BufRead .zprofile,*/etc/zprofile,.zfbfmarks setf zsh
+au BufNewFile,BufRead .zshrc,.zshenv,.zlogin,.zlogout,.zcompdump setf zsh
+au BufNewFile,BufRead *.zsh setf zsh
+
+" Scheme
+au BufNewFile,BufRead *.scm,*.ss,*.sld,*.rkt,*.rktd,*.rktl setf scheme
+
+" Screen RC
+au BufNewFile,BufRead .screenrc,screenrc setf screen
+
+" Sexplib
+au BufNewFile,BufRead *.sexp setf sexplib
+
+" Simula
+au BufNewFile,BufRead *.sim setf simula
+
+" SINDA
+au BufNewFile,BufRead *.sin,*.s85 setf sinda
+
+" SiSU
+au BufNewFile,BufRead *.sst,*.ssm,*.ssi,*.-sst,*._sst setf sisu
+au BufNewFile,BufRead *.sst.meta,*.-sst.meta,*._sst.meta setf sisu
+
+" SKILL
+au BufNewFile,BufRead *.il,*.ils,*.cdf setf skill
+
+" Cadence
+au BufNewFile,BufRead *.cdc setf cdc
+
+" SLRN
+au BufNewFile,BufRead .slrnrc setf slrnrc
+au BufNewFile,BufRead *.score setf slrnsc
+
+" Smali
+au BufNewFile,BufRead *.smali setf smali
+
+" Smalltalk
+au BufNewFile,BufRead *.st setf st
+
+" Smalltalk (and Rexx, TeX, and Visual Basic)
+au BufNewFile,BufRead *.cls call dist#ft#FTcls()
+
+" Smarty templates
+au BufNewFile,BufRead *.tpl setf smarty
+
+" SMIL or XML
+au BufNewFile,BufRead *.smil
+ \ if getline(1) =~ '<?\s*xml.*?>' |
+ \ setf xml |
+ \ else |
+ \ setf smil |
+ \ endif
+
+" SMIL or SNMP MIB file
+au BufNewFile,BufRead *.smi
+ \ if getline(1) =~ '\<smil\>' |
+ \ setf smil |
+ \ else |
+ \ setf mib |
+ \ endif
+
+" SMITH
+au BufNewFile,BufRead *.smt,*.smith setf smith
+
+" Smithy
+au BufNewFile,BufRead *.smithy setf smithy
+
+" Snobol4 and spitbol
+au BufNewFile,BufRead *.sno,*.spt setf snobol4
+
+" SNMP MIB files
+au BufNewFile,BufRead *.mib,*.my setf mib
+
+" Snort Configuration
+au BufNewFile,BufRead *.hog,snort.conf,vision.conf setf hog
+au BufNewFile,BufRead *.rules call dist#ft#FTRules()
+
+" Solidity
+au BufRead,BufNewFile *.sol setf solidity
+
+" SPARQL queries
+au BufNewFile,BufRead *.rq,*.sparql setf sparql
+
+" Spec (Linux RPM)
+au BufNewFile,BufRead *.spec setf spec
+
+" Speedup (AspenTech plant simulator)
+au BufNewFile,BufRead *.speedup,*.spdata,*.spd setf spup
+
+" Slice
+au BufNewFile,BufRead *.ice setf slice
+
+" Microsoft Visual Studio Solution
+au BufNewFile,BufRead *.sln setf solution
+au BufNewFile,BufRead *.slnf setf json
+
+" Spice
+au BufNewFile,BufRead *.sp,*.spice setf spice
+
+" Spyce
+au BufNewFile,BufRead *.spy,*.spi setf spyce
+
+" Squid
+au BufNewFile,BufRead squid.conf setf squid
+
+" SQL for Oracle Designer
+au BufNewFile,BufRead *.tyb,*.typ,*.tyc,*.pkb,*.pks setf sql
+
+" SQL
+au BufNewFile,BufRead *.sql call dist#ft#SQL()
+
+" SQLJ
+au BufNewFile,BufRead *.sqlj setf sqlj
+
+" PRQL
+au BufNewFile,BufRead *.prql setf prql
+
+" SQR
+au BufNewFile,BufRead *.sqr,*.sqi setf sqr
+
+" Squirrel
+au BufNewFile,BufRead *.nut setf squirrel
+
+" OpenSSH configuration
+au BufNewFile,BufRead ssh_config,*/.ssh/config,*/.ssh/*.conf setf sshconfig
+au BufNewFile,BufRead */etc/ssh/ssh_config.d/*.conf setf sshconfig
+
+" OpenSSH server configuration
+au BufNewFile,BufRead sshd_config setf sshdconfig
+au BufNewFile,BufRead */etc/ssh/sshd_config.d/*.conf setf sshdconfig
+
+" Starlark
+au BufNewFile,BufRead *.ipd,*.star,*.starlark setf starlark
+
+" OpenVPN configuration
+au BufNewFile,BufRead *.ovpn setf openvpn
+au BufNewFile,BufRead */openvpn/*/*.conf setf openvpn
+
+" 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
+
+" Stored Procedures
+au BufNewFile,BufRead *.stp setf stp
+
+" Standard ML
+au BufNewFile,BufRead *.sml setf sml
+
+" Sratus VOS command macro
+au BufNewFile,BufRead *.cm setf voscm
+
+" Swift
+au BufNewFile,BufRead *.swift setf swift
+au BufNewFile,BufRead *.swift.gyb setf swiftgyb
+
+" Swift Intermediate Language or SILE
+au BufNewFile,BufRead *.sil call dist#ft#FTsil()
+
+" Sysctl
+au BufNewFile,BufRead */etc/sysctl.conf,*/etc/sysctl.d/*.conf setf sysctl
+
+" Systemd unit files
+au BufNewFile,BufRead */systemd/*.{automount,dnssd,link,mount,netdev,network,nspawn,path,service,slice,socket,swap,target,timer} setf systemd
+" Systemd overrides
+au BufNewFile,BufRead */etc/systemd/*.conf.d/*.conf setf systemd
+au BufNewFile,BufRead */etc/systemd/system/*.d/*.conf setf systemd
+au BufNewFile,BufRead */.config/systemd/user/*.d/*.conf setf systemd
+" Systemd temp files
+au BufNewFile,BufRead */etc/systemd/system/*.d/.#* setf systemd
+au BufNewFile,BufRead */etc/systemd/system/.#* setf systemd
+au BufNewFile,BufRead */.config/systemd/user/*.d/.#* setf systemd
+au BufNewFile,BufRead */.config/systemd/user/.#* setf systemd
+
+" Synopsys Design Constraints
+au BufNewFile,BufRead *.sdc setf sdc
+
+" Sudoers
+au BufNewFile,BufRead */etc/sudoers,sudoers.tmp setf sudoers
+
+" SVG (Scalable Vector Graphics)
+au BufNewFile,BufRead *.svg setf svg
+
+" Surface
+au BufRead,BufNewFile *.sface setf surface
+
+" Tads (or Nroff or Perl test file)
+au BufNewFile,BufRead *.t
+ \ if !dist#ft#FTnroff() && !dist#ft#FTperl() | setf tads | endif
+
+" Tags
+au BufNewFile,BufRead tags setf tags
+
+" TAK
+au BufNewFile,BufRead *.tak setf tak
+
+" Task
+au BufRead,BufNewFile {pending,completed,undo}.data setf taskdata
+au BufRead,BufNewFile *.task setf taskedit
+
+" Tcl (JACL too)
+au BufNewFile,BufRead *.tcl,*.tm,*.tk,*.itcl,*.itk,*.jacl,.tclshrc,.wishrc setf tcl
+
+" Teal
+au BufRead,BufNewFile *.tl setf teal
+
+" TealInfo
+au BufNewFile,BufRead *.tli setf tli
+
+" Telix Salt
+au BufNewFile,BufRead *.slt setf tsalt
+
+" Tera Term Language or Turtle
+au BufRead,BufNewFile *.ttl
+ \ if getline(1) =~ '^@\?\(prefix\|base\)' |
+ \ setf turtle |
+ \ else |
+ \ setf teraterm |
+ \ endif
+
+" Terminfo
+au BufNewFile,BufRead *.ti setf terminfo
+
+" Terraform variables
+au BufRead,BufNewFile *.tfvars setf terraform-vars
+
+" TeX
+au BufNewFile,BufRead *.latex,*.sty,*.dtx,*.ltx,*.bbl setf tex
+au BufNewFile,BufRead *.tex call dist#ft#FTtex()
+
+" ConTeXt
+au BufNewFile,BufRead *.mkii,*.mkiv,*.mkvi,*.mkxl,*.mklx setf context
+
+" Texinfo
+au BufNewFile,BufRead *.texinfo,*.texi,*.txi setf texinfo
+
+" TeX configuration
+au BufNewFile,BufRead texmf.cnf setf texmf
+
+" Thrift (Apache)
+au BufNewFile,BufRead *.thrift setf thrift
+
+" Tidy config
+au BufNewFile,BufRead .tidyrc,tidyrc,tidy.conf setf tidy
+
+" TF mud client
+au BufNewFile,BufRead .tfrc,tfrc setf tf
+
+" TF mud client or terraform
+au BufNewFile,BufRead *.tf call dist#ft#FTtf()
+
+" TLA+
+au BufNewFile,BufRead *.tla setf tla
+
+" tmux configuration
+au BufNewFile,BufRead {.,}tmux*.conf setf tmux
+
+" TOML
+au BufNewFile,BufRead *.toml setf toml
+
+" TPP - Text Presentation Program
+au BufNewFile,BufRead *.tpp setf tpp
+
+" Treetop
+au BufRead,BufNewFile *.treetop setf treetop
+
+" Trustees
+au BufNewFile,BufRead trustees.conf setf trustees
+
+" TSS - Geometry
+au BufNewFile,BufReadPost *.tssgm setf tssgm
+
+" TSS - Optics
+au BufNewFile,BufReadPost *.tssop setf tssop
+
+" TSS - Command Line (temporary)
+au BufNewFile,BufReadPost *.tsscl setf tsscl
+
+" TSV Files
+au BufNewFile,BufRead *.tsv setf tsv
+
+" TWIG files
+au BufNewFile,BufReadPost *.twig setf twig
+
+" TypeScript or Qt translation file (which is XML)
+au BufNewFile,BufReadPost *.ts
+ \ if getline(1) =~ '<?xml' |
+ \ setf xml |
+ \ else |
+ \ setf typescript |
+ \ endif
+
+" TypeScript module and common
+au BufNewFile,BufRead *.mts,*.cts setf typescript
+
+" TypeScript with React
+au BufNewFile,BufRead *.tsx setf typescriptreact
+
+" Motif UIT/UIL files
+au BufNewFile,BufRead *.uit,*.uil setf uil
+
+" Udev conf
+au BufNewFile,BufRead */etc/udev/udev.conf setf udevconf
+
+" Udev permissions
+au BufNewFile,BufRead */etc/udev/permissions.d/*.permissions setf udevperm
+"
+" Udev symlinks config
+au BufNewFile,BufRead */etc/udev/cdsymlinks.conf setf sh
+
+" Ungrammar, AKA Un-grammar
+au BufNewFile,BufRead *.ungram setf ungrammar
+
+" UnrealScript
+au BufNewFile,BufRead *.uc setf uc
+
+" Updatedb
+au BufNewFile,BufRead */etc/updatedb.conf setf updatedb
+
+" Upstart (init(8)) config files
+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 */.config/upstart/*.conf setf upstart
+au BufNewFile,BufRead */.config/upstart/*.override setf upstart
+
+" Vala
+au BufNewFile,BufRead *.vala setf vala
+
+" VDF
+au BufNewFile,BufRead *.vdf setf vdf
+
+" VDM
+au BufRead,BufNewFile *.vdmpp,*.vpp setf vdmpp
+au BufRead,BufNewFile *.vdmrt setf vdmrt
+au BufRead,BufNewFile *.vdmsl,*.vdm setf vdmsl
+
+" Vera
+au BufNewFile,BufRead *.vr,*.vri,*.vrh setf vera
+
+" Vagrant (uses Ruby syntax)
+au BufNewFile,BufRead Vagrantfile setf ruby
+
+" Verilog HDL
+au BufNewFile,BufRead *.v setf verilog
+
+" Verilog-AMS HDL
+au BufNewFile,BufRead *.va,*.vams setf verilogams
+
+" SystemVerilog
+au BufNewFile,BufRead *.sv,*.svh setf systemverilog
+
+" VHS tape
+" .tape is also used by TapeCalc, which we do not support ATM. If TapeCalc
+" support is needed the contents of the file needs to be inspected.
+au BufNewFile,BufRead *.tape setf vhs
+
+" VHDL
+au BufNewFile,BufRead *.hdl,*.vhd,*.vhdl,*.vbe,*.vst,*.vho setf vhdl
+
+" Vim script
+au BufNewFile,BufRead *.vim,*.vba,.exrc,_exrc setf vim
+
+" Viminfo file
+au BufNewFile,BufRead .viminfo,_viminfo setf viminfo
+
+" Virata Config Script File or Drupal module
+au BufRead,BufNewFile *.hw,*.module,*.pkg
+ \ if getline(1) =~ '<?php' |
+ \ setf php |
+ \ else |
+ \ setf virata |
+ \ endif
+
+" Visual Basic (also uses *.bas) or FORM
+au BufNewFile,BufRead *.frm call dist#ft#FTfrm()
+
+" SaxBasic is close to Visual Basic
+au BufNewFile,BufRead *.sba setf vb
+
+" Vgrindefs file
+au BufNewFile,BufRead vgrindefs setf vgrindefs
+
+" VRML V1.0c
+au BufNewFile,BufRead *.wrl setf vrml
+
+" Vroom (vim testing and executable documentation)
+au BufNewFile,BufRead *.vroom setf vroom
+
+" Vue.js Single File Component
+au BufNewFile,BufRead *.vue setf vue
+
+" WebAssembly
+au BufNewFile,BufRead *.wast,*.wat setf wast
+
+" Webmacro
+au BufNewFile,BufRead *.wm setf webmacro
+
+" Wget config
+au BufNewFile,BufRead .wgetrc,wgetrc setf wget
+
+" Wget2 config
+au BufNewFile,BufRead .wget2rc,wget2rc setf wget2
+
+" Website MetaLanguage
+au BufNewFile,BufRead *.wml setf wml
+
+" Winbatch
+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
+
+" CVS RC file
+au BufNewFile,BufRead .cvsrc setf cvsrc
+
+" CVS commit file
+au BufNewFile,BufRead cvs\d\+ setf cvs
+
+" WEB (*.web is also used for Winbatch: Guess, based on expecting "%" comment
+" lines in a WEB file).
+au BufNewFile,BufRead *.web
+ \ if getline(1)[0].getline(2)[0].getline(3)[0].getline(4)[0].getline(5)[0] =~ "%" |
+ \ setf web |
+ \ else |
+ \ setf winbatch |
+ \ endif
+
+" Windows Scripting Host and Windows Script Component
+au BufNewFile,BufRead *.ws[fc] setf wsh
+
+" XHTML
+au BufNewFile,BufRead *.xhtml,*.xht setf xhtml
+
+" X Pixmap (dynamically sets colors, this used to trigger on BufEnter to make
+" it work better, but that breaks setting 'filetype' manually)
+au BufNewFile,BufRead *.xpm
+ \ if getline(1) =~ "XPM2" |
+ \ setf xpm2 |
+ \ else |
+ \ setf xpm |
+ \ endif
+au BufNewFile,BufRead *.xpm2 setf xpm2
+
+" XFree86 config
+au BufNewFile,BufRead XF86Config
+ \ if getline(1) =~ '\<XConfigurator\>' |
+ \ let b:xf86conf_xfree86_version = 3 |
+ \ endif |
+ \ setf xf86conf
+au BufNewFile,BufRead */xorg.conf.d/*.conf
+ \ let b:xf86conf_xfree86_version = 4 |
+ \ setf xf86conf
+
+" Xorg config
+au BufNewFile,BufRead xorg.conf,xorg.conf-4 let b:xf86conf_xfree86_version = 4 | setf xf86conf
+
+" Xinetd conf
+au BufNewFile,BufRead */etc/xinetd.conf setf xinetd
+
+" XS Perl extension interface language
+au BufNewFile,BufRead *.xs setf xs
+
+" X resources file
+au BufNewFile,BufRead .Xdefaults,.Xpdefaults,.Xresources,xdm-config,*.ad setf xdefaults
+
+" Xmath
+au BufNewFile,BufRead *.msc,*.msf setf xmath
+au BufNewFile,BufRead *.ms
+ \ if !dist#ft#FTnroff() | setf xmath | endif
+
+" XML specific variants: docbk and xbl
+au BufNewFile,BufRead *.xml call dist#ft#FTxml()
+
+" XMI (holding UML models) is also XML
+au BufNewFile,BufRead *.xmi setf xml
+
+" CSPROJ files are Visual Studio.NET's XML-based C# project config files
+au BufNewFile,BufRead *.csproj,*.csproj.user setf xml
+
+" FSPROJ files are Visual Studio.NET's XML-based F# project config files
+au BufNewFile,BufRead *.fsproj,*.fsproj.user setf xml
+
+" VBPROJ files are Visual Studio.NET's XML-based Visual Basic project config files
+au BufNewFile,BufRead *.vbproj,*.vbproj.user setf xml
+
+" Qt Linguist translation source and Qt User Interface Files are XML
+" However, for .ts TypeScript is more common.
+au BufNewFile,BufRead *.ui setf xml
+
+" TPM's are RDF-based descriptions of TeX packages (Nikolai Weibull)
+au BufNewFile,BufRead *.tpm setf xml
+
+" Xdg menus
+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
+
+" Workflow Description Language (WDL)
+au BufNewFile,BufRead *.wdl setf wdl
+
+" XLIFF (XML Localisation Interchange File Format) is also XML
+au BufNewFile,BufRead *.xlf setf xml
+au BufNewFile,BufRead *.xliff setf xml
+
+" XML User Interface Language
+au BufNewFile,BufRead *.xul setf xml
+
+" X11 xmodmap (also see below)
+au BufNewFile,BufRead *Xmodmap setf xmodmap
+
+" Xquery
+au BufNewFile,BufRead *.xq,*.xql,*.xqm,*.xquery,*.xqy setf xquery
+
+" XSD
+au BufNewFile,BufRead *.xsd setf xsd
+
+" Xslt
+au BufNewFile,BufRead *.xsl,*.xslt setf xslt
+
+" Yacc
+au BufNewFile,BufRead *.yy,*.yxx,*.y++ setf yacc
+
+" Yacc or racc
+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
+
+" YANG
+au BufRead,BufNewFile *.yang setf yang
+
+" Yuck
+au BufNewFile,BufRead *.yuck setf yuck
+
+" Zimbu
+au BufNewFile,BufRead *.zu setf zimbu
+" Zimbu Templates
+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 dist#ft#FThtml()
+" zsql (zope sql method)
+au BufNewFile,BufRead *.zsql call dist#ft#SQL()
+
+" Z80 assembler asz80
+au BufNewFile,BufRead *.z8a setf z8a
+
+augroup END
+
+
+" Source the user-specified filetype file, for backwards compatibility with
+" Vim 5.x.
+if exists("myfiletypefile") && filereadable(expand(myfiletypefile))
+ execute "source " . myfiletypefile
+endif
+
+
+" Check for "*" after loading myfiletypefile, so that scripts.vim is only used
+" when there are no matching file name extensions.
+" Don't do this for compressed files.
+augroup filetypedetect
+au BufNewFile,BufRead *
+ \ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
+ \ | runtime! scripts.vim | endif
+au StdinReadPost * if !did_filetype() | runtime! scripts.vim | endif
+
+
+" 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 '#'.
+" But before patterns matching everything in a directory.
+au BufNewFile,BufRead *.text,README,LICENSE,COPYING,AUTHORS setf text
+
+
+" Extra checks for when no filetype has been detected now. Mostly used for
+" patterns that end in "*". E.g., "zsh*" matches "zsh.vim", but that's a Vim
+" script file.
+" 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')
+au BufNewFile,BufRead 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.*/*,*/etc/httpd/mods-*/*,*/etc/httpd/sites-*/*,*/etc/httpd/conf.d/*.conf* call s:StarSetf('apache')
+
+" APT config file
+au BufNewFile,BufRead */etc/apt/apt.conf.d/{[-_[:alnum:]]\+,[-_.[:alnum:]]\+.conf} call s:StarSetf('aptconf')
+
+" Asterisk config file
+au BufNewFile,BufRead *asterisk/*.conf* call s:StarSetf('asterisk')
+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,BUILD setf bzl
+endif
+
+" BIND zone
+au BufNewFile,BufRead */named/db.*,*/bind/db.* call s:StarSetf('bindzone')
+
+au BufNewFile,BufRead cabal.project.* call s:StarSetf('cabalproject')
+
+" Calendar
+au BufNewFile,BufRead */.calendar/*,
+ \*/share/calendar/*/calendar.*,*/share/calendar/calendar.*
+ \ call s:StarSetf('calendar')
+
+" Changelog
+au BufNewFile,BufRead [cC]hange[lL]og*
+ \ if getline(1) =~ '; urgency='
+ \| call s:StarSetf('debchangelog')
+ \|else
+ \| call s:StarSetf('changelog')
+ \|endif
+
+" Crontab
+au BufNewFile,BufRead crontab,crontab.*,*/etc/cron.d/* call s:StarSetf('crontab')
+
+" dnsmasq(8) configuration
+au BufNewFile,BufRead */etc/dnsmasq.d/* call s:StarSetf('dnsmasq')
+
+" Dockerfile
+au BufNewFile,BufRead Dockerfile.*,Containerfile.* call s:StarSetf('dockerfile')
+
+" Dracula
+au BufNewFile,BufRead drac.* call s:StarSetf('dracula')
+
+" Fvwm
+au BufNewFile,BufRead */.fvwm/* call s:StarSetf('fvwm')
+au BufNewFile,BufRead *fvwmrc*,*fvwm95*.hook
+ \ let b:fvwm_version = 1 | call s:StarSetf('fvwm')
+au BufNewFile,BufRead *fvwm2rc*
+ \ if expand("<afile>:e") == "m4"
+ \| call s:StarSetf('fvwm2m4')
+ \|else
+ \| let b:fvwm_version = 2 | call s:StarSetf('fvwm')
+ \|endif
+
+" Gedcom
+au BufNewFile,BufRead */tmp/lltmp* call s:StarSetf('gedcom')
+
+" Git
+au BufNewFile,BufRead */.gitconfig.d/*,*/etc/gitconfig.d/* call s:StarSetf('gitconfig')
+
+" Gitolite
+au BufNewFile,BufRead */gitolite-admin/conf/* call s:StarSetf('gitolite')
+
+" GTK RC
+au BufNewFile,BufRead .gtkrc*,gtkrc* call s:StarSetf('gtkrc')
+
+" Jam
+au BufNewFile,BufRead Prl*.*,JAM*.* call s:StarSetf('jam')
+
+" Jargon
+au! BufNewFile,BufRead *jarg*
+ \ if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'THIS IS THE JARGON FILE'
+ \| call s:StarSetf('jargon')
+ \|endif
+
+" Java Properties resource file (note: doesn't catch font.properties.pl)
+au BufNewFile,BufRead *.properties_??_??_* call s:StarSetf('jproperties')
+
+" Kconfig
+au BufNewFile,BufRead Kconfig.* call s:StarSetf('kconfig')
+
+" Lilo: Linux loader
+au BufNewFile,BufRead lilo.conf* call s:StarSetf('lilo')
+
+" Libsensors
+au BufNewFile,BufRead */etc/sensors.d/[^.]* call s:StarSetf('sensors')
+
+" Logcheck
+au BufNewFile,BufRead */etc/logcheck/*.d*/* call s:StarSetf('logcheck')
+
+" Makefile
+au BufNewFile,BufRead [mM]akefile* call s:StarSetf('make')
+
+" Ruby Makefile
+au BufNewFile,BufRead [rR]akefile* call s:StarSetf('ruby')
+
+" Mail (also matches muttrc.vim, so this is below the other checks)
+au BufNewFile,BufRead {neo,}mutt[[:alnum:]._-]\\\{6\} setf mail
+
+au BufNewFile,BufRead reportbug-* call s:StarSetf('mail')
+
+" Modconf
+au BufNewFile,BufRead */etc/modutils/*
+ \ if executable(expand("<afile>")) != 1
+ \| call s:StarSetf('modconf')
+ \|endif
+au BufNewFile,BufRead */etc/modprobe.* call s:StarSetf('modconf')
+
+" Mutt setup files (must be before catch *.rc)
+au BufNewFile,BufRead */etc/Muttrc.d/* call s:StarSetf('muttrc')
+
+" Mutt setup file
+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')
+
+" Printcap and Termcap
+au BufNewFile,BufRead *printcap*
+ \ if !did_filetype()
+ \| let b:ptcap_type = "print" | call s:StarSetf('ptcap')
+ \|endif
+au BufNewFile,BufRead *termcap*
+ \ if !did_filetype()
+ \| let b:ptcap_type = "term" | call s:StarSetf('ptcap')
+ \|endif
+
+" ReDIF
+" Only used when the .rdf file was not detected to be XML.
+au BufRead,BufNewFile *.rdf call dist#ft#Redif()
+
+" Remind
+au BufNewFile,BufRead .reminders* call s:StarSetf('remind')
+
+" SGML catalog file
+au BufNewFile,BufRead sgml.catalog* call s:StarSetf('catalog')
+
+" avoid doc files being recognized a shell files
+au BufNewFile,BufRead */doc/{,.}bash[_-]completion{,.d,.sh}{,/*} setf text
+
+" Shell scripts ending in a star
+au BufNewFile,BufRead .bashrc*,.bash[_-]profile*,.bash[_-]logout*,.bash[_-]aliases*,bash-fc[-.]*,PKGBUILD*,APKBUILD*,*/{,.}bash[_-]completion{,.d,.sh}{,/*} call dist#ft#SetFileTypeSH("bash")
+au BufNewFile,BufRead .kshrc* call dist#ft#SetFileTypeSH("ksh")
+au BufNewFile,BufRead .profile* call dist#ft#SetFileTypeSH(getline(1))
+
+" Sudoers
+au BufNewFile,BufRead */etc/sudoers.d/* call s:StarSetf('sudoers')
+
+" tcsh scripts ending in a star
+au BufNewFile,BufRead .tcshrc* call dist#ft#SetFileTypeShell("tcsh")
+
+" csh scripts ending in a star
+au BufNewFile,BufRead .login*,.cshrc* call dist#ft#CSH()
+
+" tmux configuration with arbitrary extension
+au BufNewFile,BufRead {.,}tmux*.conf* setf tmux
+
+" VHDL
+au BufNewFile,BufRead *.vhdl_[0-9]* call s:StarSetf('vhdl')
+
+" Vim script
+au BufNewFile,BufRead *vimrc* call s:StarSetf('vim')
+
+" Subversion commit file
+au BufNewFile,BufRead svn-commit*.tmp setf svn
+
+" X resources file
+au BufNewFile,BufRead Xresources*,*/app-defaults/*,*/Xresources/* call s:StarSetf('xdefaults')
+
+" XFree86 config
+au BufNewFile,BufRead XF86Config-4*
+ \ let b:xf86conf_xfree86_version = 4 | call s:StarSetf('xf86conf')
+au BufNewFile,BufRead XF86Config*
+ \ if getline(1) =~ '\<XConfigurator\>'
+ \| let b:xf86conf_xfree86_version = 3
+ \|endif
+ \|call s:StarSetf('xf86conf')
+
+" X11 xmodmap
+au BufNewFile,BufRead *xmodmap* call s:StarSetf('xmodmap')
+
+" Xinetd conf
+au BufNewFile,BufRead */etc/xinetd.d/* call s:StarSetf('xinetd')
+
+" yum conf (close enough to dosini)
+au BufNewFile,BufRead */etc/yum.repos.d/* call s:StarSetf('dosini')
+
+" Z-Shell script ending in a star
+au BufNewFile,BufRead .zsh*,.zlog*,.zcompdump* call s:StarSetf('zsh')
+au BufNewFile,BufRead zsh*,zlog* call s:StarSetf('zsh')
+
+
+" 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
+
+" Blueprint markup files
+au BufNewFile,BufRead *.blp setf blueprint
+
+" Use the filetype detect plugins. They may overrule any of the previously
+" detected filetypes.
+runtime! ftdetect/*.vim
+
+" NOTE: The above command could have ended the filetypedetect autocmd group
+" and started another one. Let's make sure it has ended to get to a consistent
+" state.
+augroup END
+
+" 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 FALLBACK conf |
+ \ endif
+
+
+" If the GUI is already running, may still need to install the Syntax menu.
+" Don't do it when the 'M' flag is included in 'guioptions'.
+if has("menu") && has("gui_running")
+ \ && !exists("did_install_syntax_menu") && &guioptions !~# "M"
+ source <sfile>:p:h/menu.vim
+endif
+
+" Function called for testing all functions defined here. These are
+" script-local, thus need to be executed here.
+" Returns a string with error messages (hopefully empty).
+func TestFiletypeFuncs(testlist)
+ let output = ''
+ for f in a:testlist
+ try
+ exe f
+ catch
+ let output = output . "\n" . f . ": " . v:exception
+ endtry
+ endfor
+ return output
+endfunc
+
+" Restore 'cpoptions'
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftoff.vim b/runtime/ftoff.vim
new file mode 100644
index 0000000..377c6ef
--- /dev/null
+++ b/runtime/ftoff.vim
@@ -0,0 +1,11 @@
+" Vim support file to switch off detection of file types
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last change: 2001 Jun 11
+
+if exists("did_load_filetypes")
+ unlet did_load_filetypes
+endif
+
+" Remove all autocommands in the filetypedetect group
+silent! au! filetypedetect *
diff --git a/runtime/ftplugin.vim b/runtime/ftplugin.vim
new file mode 100644
index 0000000..2500a7f
--- /dev/null
+++ b/runtime/ftplugin.vim
@@ -0,0 +1,43 @@
+vim9script noclear
+
+# Vim support file to switch on loading plugins for file types
+#
+# Maintainer: Bram Moolenaar <Bram@vim.org>
+# Last change: 2022 Feb 11
+
+if exists("g:did_load_ftplugin")
+ finish
+endif
+g:did_load_ftplugin = 1
+
+augroup filetypeplugin
+ au FileType * call LoadFTPlugin()
+augroup END
+
+if exists('*LoadFTPlugin')
+ # No need to define the function again.
+ finish
+endif
+
+def LoadFTPlugin()
+ if exists("b:undo_ftplugin")
+ # We assume b:undo_ftplugin is using legacy script syntax
+ legacy exe b:undo_ftplugin
+ unlet! b:undo_ftplugin b:did_ftplugin
+ endif
+
+ var s = expand("<amatch>")
+ if s != ""
+ if &cpo =~# "S" && exists("b:did_ftplugin")
+ # In compatible mode options are reset to the global values, need to
+ # set the local values also when a plugin was already used.
+ unlet b:did_ftplugin
+ endif
+
+ # When there is a dot it is used to separate filetype names. Thus for
+ # "aaa.bbb" load "aaa" and then "bbb".
+ for name in split(s, '\.')
+ exe 'runtime! ftplugin/' .. name .. '.vim ftplugin/' .. name .. '_*.vim ftplugin/' .. name .. '/*.vim'
+ endfor
+ endif
+enddef
diff --git a/runtime/ftplugin/8th.vim b/runtime/ftplugin/8th.vim
new file mode 100644
index 0000000..ad04f9a
--- /dev/null
+++ b/runtime/ftplugin/8th.vim
@@ -0,0 +1,27 @@
+" Vim ftplugin file
+" Language: 8th
+" Version: any
+" Last Change: 2021 Sep 20
+" Last Change: 2021/09/20
+" Maintainer: Ron Aaron <ron@aaron-tech.com>
+" URL: https://8th-dev.com/
+" Filetypes: *.8th
+" NOTE: 8th allows any non-whitespace in a name, so you need to do:
+" setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+" This goes with the syntax/8th.vim file.
+
+" Only do this when not done yet for this buffer
+if exists("b:did_8thplugin")
+ finish
+endif
+
+" Don't load another 8th plugin for this buffer
+let b:did_8thplugin = 1
+
+setlocal ts=2 sts=2 sw=2 et
+setlocal com=s1:/*,mb:*,ex:*/,b:--,be:\\
+setlocal fo=tcrqol
+setlocal matchpairs+=\::;
+setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+setlocal suffixesadd=.8th
+let b:undo_ftplugin = "setlocal ts< sts< sw< et< com< fo< mps< isk< sua<"
diff --git a/runtime/ftplugin/README.txt b/runtime/ftplugin/README.txt
new file mode 100644
index 0000000..19ad58b
--- /dev/null
+++ b/runtime/ftplugin/README.txt
@@ -0,0 +1,24 @@
+The ftplugin directory is for Vim plugin scripts that are only used for a
+specific filetype.
+
+All files ending in .vim in this directory and subdirectories will be sourced
+by Vim when it detects the filetype that matches the name of the file or
+subdirectory.
+For example, these are all loaded for the "c" filetype:
+
+ c.vim
+ c_extra.vim
+ c/settings.vim
+
+Note that the "_" in "c_extra.vim" is required to separate the filetype name
+from the following arbitrary name.
+
+The filetype plugins are only loaded when the ":filetype plugin" command has
+been used.
+
+The default filetype plugin files contain settings that 95% of the users will
+want to use. They do not contain personal preferences, like the value of
+'shiftwidth'.
+
+If you want to do additional settings, or overrule the default filetype
+plugin, you can create your own plugin file. See ":help ftplugin" in Vim.
diff --git a/runtime/ftplugin/a2ps.vim b/runtime/ftplugin/a2ps.vim
new file mode 100644
index 0000000..0e24e30
--- /dev/null
+++ b/runtime/ftplugin/a2ps.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: a2ps(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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 include=^\\s*Include:
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/aap.vim b/runtime/ftplugin/aap.vim
new file mode 100644
index 0000000..b5065e5
--- /dev/null
+++ b/runtime/ftplugin/aap.vim
@@ -0,0 +1,32 @@
+" Vim filetype plugin file
+" Language: Aap recipe
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2021 Nov 14
+
+" 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
+
+" Reset 'formatoptions', 'comments', 'commentstring' and 'expandtab' to undo
+" this plugin.
+let b:undo_ftplugin = "setl fo< com< cms< et<"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=s:#\ -,m:#\ \ ,e:#,n:#,fb:-
+setlocal commentstring=#\ %s
+
+" Expand tabs to spaces to avoid trouble.
+setlocal expandtab
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Aap Recipe Files (*.aap)\t*.aap\nAll Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
diff --git a/runtime/ftplugin/abap.vim b/runtime/ftplugin/abap.vim
new file mode 100644
index 0000000..956b002
--- /dev/null
+++ b/runtime/ftplugin/abap.vim
@@ -0,0 +1,29 @@
+" Vim filetype plugin file
+" Language: ABAP
+" Author: Steven Oliver <oliver.steven@gmail.com>
+" Copyright: Copyright (c) 2013 Steven Oliver
+" License: You may redistribute this under the same terms as Vim itself
+" --------------------------------------------------------------------------
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal softtabstop=2 shiftwidth=2
+setlocal suffixesadd=.abap
+
+" Windows allows you to filter the open file dialog
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "ABAP Source Files (*.abap)\t*.abap\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: set sw=4 sts=4 et tw=80 :
diff --git a/runtime/ftplugin/abaqus.vim b/runtime/ftplugin/abaqus.vim
new file mode 100644
index 0000000..5931cd9
--- /dev/null
+++ b/runtime/ftplugin/abaqus.vim
@@ -0,0 +1,118 @@
+" Vim filetype plugin file
+" Language: Abaqus finite element input file (www.abaqus.com)
+" Maintainer: Carl Osterwisch <costerwi@gmail.com>
+" Last Change: 2022 Oct 08
+
+" 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
+
+" Save the compatibility options and temporarily switch to vim defaults
+let s:cpo_save = &cpoptions
+set cpoptions&vim
+
+" Set the format of the include file specification for Abaqus
+" Used in :check gf ^wf [i and other commands
+setlocal include=\\<\\cINPUT\\s*=
+
+" Remove characters up to the first = when evaluating filenames
+setlocal includeexpr=substitute(v:fname,'.\\{-}=','','')
+
+" Remove comma from valid filename characters since it is used to
+" separate keyword parameters
+setlocal isfname-=,
+
+" Define format of comment lines (see 'formatoptions' for uses)
+setlocal comments=:**
+setlocal commentstring=**%s
+
+" Definitions start with a * and assign a NAME, NSET, or ELSET
+" Used in [d ^wd and other commands
+setlocal define=^\\*\\a.*\\c\\(NAME\\\|NSET\\\|ELSET\\)\\s*=
+
+" Abaqus keywords and identifiers may include a - character
+setlocal iskeyword+=-
+
+let b:undo_ftplugin = "setlocal include< includeexpr< isfname<"
+ \ . " comments< commentstring< define< iskeyword<"
+
+if has("folding")
+ " Fold all lines that do not begin with *
+ setlocal foldexpr=getline(v:lnum)[0]!=\"\*\"
+ setlocal foldmethod=expr
+ let b:undo_ftplugin .= " foldexpr< foldmethod<"
+endif
+
+" Set the file browse filter (currently only supported under Win32 gui)
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Abaqus Input Files (*.inp *.inc)\t*.inp;*.inc\n" .
+ \ "Abaqus Results (*.dat)\t*.dat\n" .
+ \ "Abaqus Messages (*.pre *.msg *.sta)\t*.pre;*.msg;*.sta\n" .
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin .= "|unlet! b:browsefilter"
+endif
+
+" Define patterns for the matchit plugin
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ '\*part:\*end\s*part,' .
+ \ '\*assembly:\*end\s*assembly,' .
+ \ '\*instance:\*end\s*instance,' .
+ \ '\*step:\*end\s*step'
+ let b:undo_ftplugin .= "|unlet! b:match_ignorecase b:match_words"
+endif
+
+if !exists("no_plugin_maps") && !exists("no_abaqus_maps")
+ " Map [[ and ]] keys to move [count] keywords backward or forward
+ nnoremap <silent><buffer> ]] :call <SID>Abaqus_NextKeyword(1)<CR>
+ nnoremap <silent><buffer> [[ :call <SID>Abaqus_NextKeyword(-1)<CR>
+ function! <SID>Abaqus_NextKeyword(direction)
+ .mark '
+ if a:direction < 0
+ let flags = 'b'
+ else
+ let flags = ''
+ endif
+ let l:count = abs(a:direction) * v:count1
+ while l:count > 0 && search("^\\*\\a", flags)
+ let l:count -= 1
+ endwhile
+ endfunction
+
+ " Map \\ to toggle commenting of the current line or range
+ noremap <silent><buffer> <LocalLeader><LocalLeader>
+ \ :call <SID>Abaqus_ToggleComment()<CR>j
+ function! <SID>Abaqus_ToggleComment() range
+ if strpart(getline(a:firstline), 0, 2) == "**"
+ " Un-comment all lines in range
+ silent execute a:firstline . ',' . a:lastline . 's/^\*\*//'
+ else
+ " Comment all lines in range
+ silent execute a:firstline . ',' . a:lastline . 's/^/**/'
+ endif
+ endfunction
+
+ " Map \s to swap first two comma separated fields
+ noremap <silent><buffer> <LocalLeader>s :call <SID>Abaqus_Swap()<CR>
+ function! <SID>Abaqus_Swap() range
+ silent execute a:firstline . ',' . a:lastline . 's/\([^*,]*\),\([^,]*\)/\2,\1/'
+ endfunction
+
+ let b:undo_ftplugin .= "|unmap <buffer> [[|unmap <buffer> ]]"
+ \ . "|unmap <buffer> <LocalLeader><LocalLeader>"
+ \ . "|unmap <buffer> <LocalLeader>s"
+endif
+
+" Undo must be done in nocompatible mode for <LocalLeader>.
+let b:undo_ftplugin = "let b:cpo_save = &cpoptions|"
+ \ . "set cpoptions&vim|"
+ \ . b:undo_ftplugin
+ \ . "|let &cpoptions = b:cpo_save"
+ \ . "|unlet b:cpo_save"
+
+" Restore saved compatibility options
+let &cpoptions = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/ada.vim b/runtime/ftplugin/ada.vim
new file mode 100644
index 0000000..a0621e1
--- /dev/null
+++ b/runtime/ftplugin/ada.vim
@@ -0,0 +1,211 @@
+"------------------------------------------------------------------------------
+" 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>
+" Taylor Venable <taylor@metasyntax.net>
+" Neil Bird <neil@fnxweb.com>
+" $Author: krischik $
+" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" Version: 4.6 with patch from David Bürgin
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/ftplugin/ada.vim $
+" History: 24.05.2006 MK Unified Headers
+" 26.05.2006 MK ' should not be in iskeyword.
+" 16.07.2006 MK Ada-Mode as vim-ball
+" 02.10.2006 MK Better folding.
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 05.11.2006 MK Bram suggested not to use include protection for
+" autoload
+" 05.11.2006 MK Bram suggested to save on spaces
+" 08.07.2007 TV fix default compiler problems.
+" Help Page: ft-ada-plugin
+"------------------------------------------------------------------------------
+" Provides mapping overrides for tag jumping that figure out the current
+" Ada object and tag jump to that, not the 'simple' vim word.
+" Similarly allows <Ctrl-N> matching of full-length ada entities from tags.
+"------------------------------------------------------------------------------
+
+" Only do this when not done yet for this buffer
+if exists ("b:did_ftplugin") || version < 700
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 45
+
+"
+" Temporarily set cpoptions to ensure the script loads OK
+"
+let s:cpoptions = &cpoptions
+set cpoptions-=C
+
+" Section: Comments {{{1
+"
+setlocal comments=O:--,:--\ \
+setlocal commentstring=--\ \ %s
+setlocal complete=.,w,b,u,t,i
+
+" Section: case {{{1
+"
+setlocal nosmartcase
+setlocal ignorecase
+
+" Section: formatoptions {{{1
+"
+setlocal formatoptions+=ron
+
+" Section: Tagging {{{1
+"
+if exists ("g:ada_extended_tagging")
+ " Make local tag mappings for this buffer (if not already set)
+ if g:ada_extended_tagging == 'jump'
+ if mapcheck('<C-]>','n') == ''
+ nnoremap <unique> <buffer> <C-]> :call ada#Jump_Tag ('', 'tjump')<cr>
+ endif
+ if mapcheck('g<C-]>','n') == ''
+ nnoremap <unique> <buffer> g<C-]> :call ada#Jump_Tag ('','stjump')<cr>
+ endif
+ elseif g:ada_extended_tagging == 'list'
+ if mapcheck('<C-]>','n') == ''
+ nnoremap <unique> <buffer> <C-]> :call ada#List_Tag ()<cr>
+ endif
+ if mapcheck('g<C-]>','n') == ''
+ nnoremap <unique> <buffer> g<C-]> :call ada#List_Tag ()<cr>
+ endif
+ endif
+endif
+
+" Section: Completion {{{1
+"
+setlocal completefunc=ada#User_Complete
+setlocal omnifunc=adacomplete#Complete
+
+if exists ("g:ada_extended_completion")
+ if mapcheck ('<C-N>','i') == ''
+ inoremap <unique> <buffer> <C-N> <C-R>=ada#Completion("\<lt>C-N>")<cr>
+ endif
+ if mapcheck ('<C-P>','i') == ''
+ inoremap <unique> <buffer> <C-P> <C-R>=ada#Completion("\<lt>C-P>")<cr>
+ endif
+ if mapcheck ('<C-X><C-]>','i') == ''
+ inoremap <unique> <buffer> <C-X><C-]> <C-R>=<SID>ada#Completion("\<lt>C-X>\<lt>C-]>")<cr>
+ endif
+ if mapcheck ('<bs>','i') == ''
+ inoremap <silent> <unique> <buffer> <bs> <C-R>=ada#Insert_Backspace ()<cr>
+ endif
+endif
+
+" Section: Matchit {{{1
+"
+" Only do this when not done yet for this buffer & matchit is used
+"
+if !exists ("b:match_words") &&
+ \ exists ("loaded_matchit")
+ "
+ " The following lines enable the macros/matchit.vim plugin for
+ " Ada-specific extended matching with the % key.
+ "
+ let s:notend = '\%(\<end\s\+\)\@<!'
+ let b:match_words =
+ \ s:notend . '\<if\>:\<elsif\>:\<else\>:\<end\>\s\+\<if\>,' .
+ \ s:notend . '\<case\>:\<when\>:\<end\>\s\+\<case\>,' .
+ \ '\%(\<while\>.*\|\<for\>.*\|'.s:notend.'\)\<loop\>:\<end\>\s\+\<loop\>,' .
+ \ '\%(\<do\>\|\<begin\>\):\<exception\>:\<end\>\s*\%($\|[;A-Z]\),' .
+ \ s:notend . '\<record\>:\<end\>\s\+\<record\>'
+endif
+
+
+" Section: Compiler {{{1
+"
+if ! exists("g:ada_default_compiler")
+ if has("vms")
+ let g:ada_default_compiler = 'decada'
+ else
+ let g:ada_default_compiler = 'gnat'
+ endif
+endif
+
+if ! exists("current_compiler") ||
+ \ current_compiler != g:ada_default_compiler
+ execute "compiler " . g:ada_default_compiler
+endif
+
+" Section: Folding {{{1
+"
+if exists("g:ada_folding")
+ if g:ada_folding[0] == 'i'
+ setlocal foldmethod=indent
+ setlocal foldignore=--
+ setlocal foldnestmax=5
+ elseif g:ada_folding[0] == 'g'
+ setlocal foldmethod=expr
+ setlocal foldexpr=ada#Pretty_Print_Folding(v:lnum)
+ elseif g:ada_folding[0] == 's'
+ setlocal foldmethod=syntax
+ endif
+ setlocal tabstop=8
+ setlocal softtabstop=3
+ setlocal shiftwidth=3
+endif
+
+" Section: Abbrev {{{1
+"
+if exists("g:ada_abbrev")
+ iabbrev ret return
+ iabbrev proc procedure
+ iabbrev pack package
+ iabbrev func function
+endif
+
+" Section: Commands, Mapping, Menus {{{1
+if !exists(':AdaTagFile')
+ call ada#Map_Popup (
+ \ 'Tag.List',
+ \ 'l',
+ \ 'call ada#List_Tag ()')
+ call ada#Map_Popup (
+ \'Tag.Jump',
+ \'j',
+ \'call ada#Jump_Tag ()')
+ call ada#Map_Menu (
+ \'Tag.Create File',
+ \':AdaTagFile',
+ \'call ada#Create_Tags (''file'')')
+ call ada#Map_Menu (
+ \'Tag.Create Dir',
+ \':AdaTagDir',
+ \'call ada#Create_Tags (''dir'')')
+
+ call ada#Map_Menu (
+ \'Highlight.Toggle Space Errors',
+ \ ':AdaSpaces',
+ \'call ada#Switch_Syntax_Option (''space_errors'')')
+ call ada#Map_Menu (
+ \'Highlight.Toggle Lines Errors',
+ \ ':AdaLines',
+ \'call ada#Switch_Syntax_Option (''line_errors'')')
+ call ada#Map_Menu (
+ \'Highlight.Toggle Rainbow Color',
+ \ ':AdaRainbow',
+ \'call ada#Switch_Syntax_Option (''rainbow_color'')')
+ call ada#Map_Menu (
+ \'Highlight.Toggle Standard Types',
+ \ ':AdaTypes',
+ \'call ada#Switch_Syntax_Option (''standard_types'')')
+endif
+
+" 1}}}
+" Reset cpoptions
+let &cpoptions = s:cpoptions
+unlet s:cpoptions
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" vim: foldmethod=marker
diff --git a/runtime/ftplugin/alsaconf.vim b/runtime/ftplugin/alsaconf.vim
new file mode 100644
index 0000000..6d9d80a
--- /dev/null
+++ b/runtime/ftplugin/alsaconf.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: alsaconf(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/ant.vim b/runtime/ftplugin/ant.vim
new file mode 100644
index 0000000..aee07ca
--- /dev/null
+++ b/runtime/ftplugin/ant.vim
@@ -0,0 +1,46 @@
+" Vim filetype plugin file
+" Language: ant
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "XML Files (*.xml)\t*.xml\n" .
+ \ "All Files (*.*)\t*.*\n"
+
+runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show Ant-related files.
+if has("gui_win32")
+ let b:browsefilter = "Build Files (build.xml)\tbuild.xml\n" .
+ \ "Java Files (*.java)\t*.java\n" .
+ \ "Properties Files (*.prop*)\t*.prop*\n" .
+ \ "Manifest Files (*.mf)\t*.mf\n" .
+ \ s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/apache.vim b/runtime/ftplugin/apache.vim
new file mode 100644
index 0000000..9f612f5
--- /dev/null
+++ b/runtime/ftplugin/apache.vim
@@ -0,0 +1,16 @@
+" Vim filetype plugin
+" Language: apache configuration file
+" Maintainer: Per Juchtmans <dubgeiser+vimNOSPAM@gmail.com>
+" Last Change: 2022 Oct 22
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/arch.vim b/runtime/ftplugin/arch.vim
new file mode 100644
index 0000000..1c697b8
--- /dev/null
+++ b/runtime/ftplugin/arch.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: GNU Arch inventory file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/art.vim b/runtime/ftplugin/art.vim
new file mode 100644
index 0000000..c501a99
--- /dev/null
+++ b/runtime/ftplugin/art.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin
+" Language: ART-IM and ART*Enterprise
+" Maintainer: Dorai Sitaram <ds26@gte.com>
+" URL: http://www.ccs.neu.edu/~dorai/vimplugins/vimplugins.html
+" Last Change: Apr 2, 2003
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+run ftplugin/lisp.vim
+
+setl lw-=if
+setl lw+=def-art-fun,deffacts,defglobal,defrule,defschema,for,schema,while
diff --git a/runtime/ftplugin/asm.vim b/runtime/ftplugin/asm.vim
new file mode 100644
index 0000000..0914bf6
--- /dev/null
+++ b/runtime/ftplugin/asm.vim
@@ -0,0 +1,11 @@
+" Vim filetype plugin file
+" Language: asm
+" Maintainer: Colin Caine <cmcaine at the common googlemail domain>
+" Last Changed: 23 May 2020
+
+if exists("b:did_ftplugin") | finish | endif
+
+setl comments=:;,s1:/*,mb:*,ex:*/,://
+setl commentstring=;%s
+
+let b:did_ftplugin = 1
diff --git a/runtime/ftplugin/aspvbs.vim b/runtime/ftplugin/aspvbs.vim
new file mode 100644
index 0000000..70a130d
--- /dev/null
+++ b/runtime/ftplugin/aspvbs.vim
@@ -0,0 +1,62 @@
+" Vim filetype plugin file
+" Language: aspvbs
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "HTML Files (*.html, *.htm)\t*.htm*\n" .
+ \ "All Files (*.*)\t*.*\n"
+let s:match_words = ""
+
+runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+endif
+
+" ASP: Active Server Pages (with Visual Basic Script)
+" thanks to Gontran BAERTS
+if exists("loaded_matchit")
+ let s:notend = '\%(\<end\s\+\)\@<!'
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ s:notend . '\<if\>\%(.\{-}then\s\+\w\)\@!:\<elseif\>:^\s*\<else\>:\<end\s\+\<if\>,' .
+ \ s:notend . '\<select\s\+case\>:\<case\>:\<case\s\+else\>:\<end\s\+select\>,' .
+ \ '^\s*\<sub\>:\<end\s\+sub\>,' .
+ \ '^\s*\<function\>:\<end\s\+function\>,' .
+ \ '\<class\>:\<end\s\+class\>,' .
+ \ '^\s*\<do\>:\<loop\>,' .
+ \ '^\s*\<for\>:\<next\>,' .
+ \ '\<while\>:\<wend\>,' .
+ \ s:match_words
+endif
+
+" Change the :browse e filter to primarily show ASP-related files.
+if has("gui_win32")
+ let b:browsefilter="ASP Files (*.asp)\t*.asp\n" . s:browsefilter
+endif
+
+let b:undo_ftplugin = "unlet! b:match_words b:match_ignorecase b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/automake.vim b/runtime/ftplugin/automake.vim
new file mode 100644
index 0000000..9f981a7
--- /dev/null
+++ b/runtime/ftplugin/automake.vim
@@ -0,0 +1,16 @@
+" Vim filetype plugin file
+" Language: Automake
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+runtime! ftplugin/make.vim ftplugin/make_*.vim ftplugin/make/*.vim
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/awk.vim b/runtime/ftplugin/awk.vim
new file mode 100644
index 0000000..1bca3ad
--- /dev/null
+++ b/runtime/ftplugin/awk.vim
@@ -0,0 +1,56 @@
+" Vim filetype plugin
+" Language: awk, nawk, gawk, mawk
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Antonio Colombo <azc100@gmail.com>
+" Last Change: 2020 Sep 28
+
+" This plugin was prepared by Mark Sikora
+" This plugin was updated as proposed by Doug Kearns
+
+" 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 s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal define=function
+setlocal suffixesadd+=.awk
+
+let b:undo_ftplugin = "setl fo< com< cms< def< sua<" .
+ \ " | unlet! b:browsefilter"
+
+" TODO: set this in scripts.vim?
+if exists("g:awk_is_gawk")
+ setlocal include=@include
+ setlocal suffixesadd+=.gawk
+ if has("unix") || has("win32unix")
+ setlocal formatprg=gawk\ -f-\ -o/dev/stdout
+ let b:undo_ftplugin .= " | setl fp<"
+ endif
+
+ let path = system("gawk 'BEGIN { printf ENVIRON[\"AWKPATH\"] }'")
+ let path = substitute(path, '^\.\=:\|:\.\=$\|:\.\=:', ',,', 'g') " POSIX cwd
+ let path = substitute(path, ':', ',', 'g')
+
+ let &l:path = path
+ let b:undo_ftplugin .= " | setl inc< path<"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Awk Source Files (*.awk,*.gawk)\t*.awk;*.gawk\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8
diff --git a/runtime/ftplugin/bash.vim b/runtime/ftplugin/bash.vim
new file mode 100644
index 0000000..7bd9787
--- /dev/null
+++ b/runtime/ftplugin/bash.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: bash
+" Maintainer: Bram Moolenaar
+" Last Changed: 2019 Jan 12
+"
+" This is not a real filetype plugin. It allows for someone to set 'filetype'
+" to "bash" in the modeline, and gets the effect of filetype "sh" with
+" b:is_bash set. Idea from Mahmode Al-Qudsi.
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+unlet! b:is_sh
+unlet! b:is_kornshell
+let b:is_bash = 1
+
+runtime! ftplugin/sh.vim ftplugin/sh_*.vim ftplugin/sh/*.vim
+
+" vim: ts=8
diff --git a/runtime/ftplugin/basic.vim b/runtime/ftplugin/basic.vim
new file mode 100644
index 0000000..4399fbf
--- /dev/null
+++ b/runtime/ftplugin/basic.vim
@@ -0,0 +1,57 @@
+" Vim filetype plugin file
+" Language: BASIC (QuickBASIC 4.5)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jun 22
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:REM\ ,:Rem\ ,:rem\ ,:'
+setlocal commentstring='\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+" TODO: support exit ... as middle matches?
+if exists("loaded_matchit") && !exists("b:match_words")
+ let s:line_start = '\%(^\s*\)\@<='
+ let s:not_end = '\%(end\s\+\)\@<!'
+ let s:not_end_or_exit = '\%(\%(end\|exit\)\s\+\)\@<!'
+
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ s:not_end_or_exit .. '\<def\s\+fn:\<end\s\+def\>,' ..
+ \ s:not_end_or_exit .. '\<function\>:\<end\s\+function\>,' ..
+ \ s:not_end_or_exit .. '\<sub\>:\<end\s\+sub\>,' ..
+ \ s:not_end .. '\<type\>:\<end\s\+type\>,' ..
+ \ s:not_end .. '\<select\>:\%(select\s\+\)\@<!\<case\%(\s\+\%(else\|is\)\)\=\>:\<end\s\+select\>,' ..
+ \ '\<do\>:\<loop\>,' ..
+ \ '\<for\>\%(\s\+\%(input\|output\|random\|append\|binary\)\)\@!:\<next\>,' ..
+ \ '\<while\>:\<wend\>,' ..
+ \ s:line_start .. 'if\%(.*\<then\s*\%($\|''\)\)\@=:\<\%(' .. s:line_start .. 'else\|elseif\)\>:\<end\s\+if\>,' ..
+ \ '\<lock\>:\<unlock\>'
+ let b:match_skip = 'synIDattr(synID(line("."),col("."),1),"name") =~? "comment\\|string" || ' ..
+ \ 'strpart(getline("."), 0, col(".") ) =~? "\\<exit\\s\\+"'
+
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_skip b:match_words"
+
+ unlet s:line_start s:not_end s:not_end_or_exit
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "BASIC Source Files (*.bas)\t*.bas\n" ..
+ \ "BASIC Include Files (*.bi, *.bm)\t*.bi;*.bm\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:basic_set_browsefilter = 1
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter b:basic_set_browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/ftplugin/bdf.vim b/runtime/ftplugin/bdf.vim
new file mode 100644
index 0000000..85b7b40
--- /dev/null
+++ b/runtime/ftplugin/bdf.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: BDF font definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=b:COMMENT commentstring=COMMENT\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/bitbake.vim b/runtime/ftplugin/bitbake.vim
new file mode 100644
index 0000000..99fe334
--- /dev/null
+++ b/runtime/ftplugin/bitbake.vim
@@ -0,0 +1,16 @@
+" Vim filetype plugin file
+" Language: Bitbake
+" Maintainer: Gregory Anders <greg@gpanders.com>
+" Repository: https://github.com/openembedded/bitbake
+" Latest Revision: 2022-07-23
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#%s
+setlocal comments=:#
+setlocal suffixesadd=.bb,.bbclass
+
+let b:undo_ftplugin = "setl cms< com< sua<"
diff --git a/runtime/ftplugin/bst.vim b/runtime/ftplugin/bst.vim
new file mode 100644
index 0000000..5e65aac
--- /dev/null
+++ b/runtime/ftplugin/bst.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin file
+" Language: bst
+" Author: Tim Pope <vimNOSPAM@tpope.info>
+" $Id: bst.vim,v 1.1 2007/05/05 17:37:57 vimboss Exp $
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=%\ %s
+setlocal comments=:%
+setlocal fo-=t fo+=croql
+
+let b:undo_ftplugin = "setlocal com< cms< fo<"
diff --git a/runtime/ftplugin/btm.vim b/runtime/ftplugin/btm.vim
new file mode 100644
index 0000000..d3dc5b7
--- /dev/null
+++ b/runtime/ftplugin/btm.vim
@@ -0,0 +1,12 @@
+" Vim filetype plugin file
+" Language: BTM
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2004 Jul 06
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves just like dosbatch
+runtime! ftplugin/dosbatch.vim ftplugin/dosbatch_*.vim ftplugin/dosbatch/*.vim
diff --git a/runtime/ftplugin/bzl.vim b/runtime/ftplugin/bzl.vim
new file mode 100644
index 0000000..8ab876e
--- /dev/null
+++ b/runtime/ftplugin/bzl.vim
@@ -0,0 +1,96 @@
+" Vim filetype plugin file
+" Language: Bazel (http://bazel.io)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-bzl)
+" Last Change: 2021 Jan 19
+
+""
+" @section Introduction, intro
+" Core settings for the bzl filetype, used for BUILD and *.bzl files for the
+" Bazel build system (http://bazel.io/).
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+
+" Vim 7.4.051 has opinionated settings in ftplugin/python.vim that try to force
+" PEP8 conventions on every python file, but these conflict with Google's
+" indentation guidelines. As a workaround, we explicitly source the system
+" ftplugin, but save indentation settings beforehand and restore them after.
+let s:save_expandtab = &l:expandtab
+let s:save_shiftwidth = &l:shiftwidth
+let s:save_softtabstop = &l:softtabstop
+let s:save_tabstop = &l:tabstop
+
+" NOTE: Vim versions before 7.3.511 had a ftplugin/python.vim that was broken
+" for compatible mode.
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Load base python ftplugin (also defines b:did_ftplugin).
+source $VIMRUNTIME/ftplugin/python.vim
+
+" NOTE: Vim versions before 7.4.104 and later set this in ftplugin/python.vim.
+setlocal comments=b:#,fb:-
+
+" Restore pre-existing indentation settings.
+let &l:expandtab = s:save_expandtab
+let &l:shiftwidth = s:save_shiftwidth
+let &l:softtabstop = s:save_softtabstop
+let &l:tabstop = s:save_tabstop
+
+setlocal formatoptions-=t
+
+" Make gf work with imports in BUILD files.
+setlocal includeexpr=substitute(v:fname,'//','','')
+
+" Enable syntax-based folding, if specified.
+if get(g:, 'ft_bzl_fold', 0)
+ setlocal foldmethod=syntax
+ setlocal foldtext=BzlFoldText()
+endif
+
+if exists('*BzlFoldText')
+ let &cpo = s:save_cpo
+ unlet s:save_cpo
+ finish
+endif
+
+function BzlFoldText() abort
+ let l:start_num = nextnonblank(v:foldstart)
+ let l:end_num = prevnonblank(v:foldend)
+
+ if l:end_num <= l:start_num + 1
+ " If the fold is empty, don't print anything for the contents.
+ let l:content = ''
+ else
+ " Otherwise look for something matching the content regex.
+ " And if nothing matches, print an ellipsis.
+ let l:content = '...'
+ for l:line in getline(l:start_num + 1, l:end_num - 1)
+ let l:content_match = matchstr(l:line, '\m\C^\s*name = \zs.*\ze,$')
+ if !empty(l:content_match)
+ let l:content = l:content_match
+ break
+ endif
+ endfor
+ endif
+
+ " Enclose content with start and end
+ let l:start_text = getline(l:start_num)
+ let l:end_text = substitute(getline(l:end_num), '^\s*', '', '')
+ let l:text = l:start_text . ' ' . l:content . ' ' . l:end_text
+
+ " Compute the available width for the displayed text.
+ let l:width = winwidth(0) - &foldcolumn - (&number ? &numberwidth : 0)
+ let l:lines_folded = ' ' . string(1 + v:foldend - v:foldstart) . ' lines'
+
+ " Expand tabs, truncate, pad, and concatenate
+ let l:text = substitute(l:text, '\t', repeat(' ', &tabstop), 'g')
+ let l:text = strpart(l:text, 0, l:width - len(l:lines_folded))
+ let l:padding = repeat(' ', l:width - len(l:lines_folded) - len(l:text))
+ return l:text . l:padding . l:lines_folded
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/c.vim b/runtime/ftplugin/c.vim
new file mode 100644
index 0000000..3627089
--- /dev/null
+++ b/runtime/ftplugin/c.vim
@@ -0,0 +1,73 @@
+" Vim filetype plugin file
+" Language: C
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Apr 08
+
+" 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
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< ofu< cms< def< inc< | if has('vms') | setl isk< | endif"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" These options have the right value as default, but the user may have
+" overruled that.
+setlocal commentstring& define& include&
+
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+if exists('&ofu')
+ setlocal ofu=ccomplete#Complete
+endif
+
+" Set 'comments' to format dashed lists in comments.
+" Also include ///, used for Doxygen.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+
+" In VMS C keywords contain '$' characters.
+if has("vms")
+ setlocal iskeyword+=$
+endif
+
+" When the matchit plugin is loaded, this makes the % command skip parens and
+" braces in comments properly.
+if !exists("b:match_words")
+ 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'
+ let b:undo_ftplugin ..= " | unlet! b:match_skip b:match_words"
+endif
+
+" Win32 can filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ if &ft == "cpp"
+ let b:browsefilter = "C++ Source Files (*.cpp *.c++)\t*.cpp;*.c++\n" .
+ \ "C Header Files (*.h)\t*.h\n" .
+ \ "C Source Files (*.c)\t*.c\n" .
+ \ "All Files (*.*)\t*.*\n"
+ elseif &ft == "ch"
+ let b:browsefilter = "Ch Source Files (*.ch *.chf)\t*.ch;*.chf\n" .
+ \ "C Header Files (*.h)\t*.h\n" .
+ \ "C Source Files (*.c)\t*.c\n" .
+ \ "All Files (*.*)\t*.*\n"
+ else
+ let b:browsefilter = "C Source Files (*.c)\t*.c\n" .
+ \ "C Header Files (*.h)\t*.h\n" .
+ \ "Ch Source Files (*.ch *.chf)\t*.ch;*.chf\n" .
+ \ "C++ Source Files (*.cpp *.c++)\t*.cpp;*.c++\n" .
+ \ "All Files (*.*)\t*.*\n"
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/calendar.vim b/runtime/ftplugin/calendar.vim
new file mode 100644
index 0000000..f454ba1
--- /dev/null
+++ b/runtime/ftplugin/calendar.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: calendar(1) input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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=s1:/*,mb:*,ex:*/ commentstring& include&
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/cdrdaoconf.vim b/runtime/ftplugin/cdrdaoconf.vim
new file mode 100644
index 0000000..563bb8f
--- /dev/null
+++ b/runtime/ftplugin/cdrdaoconf.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-12-04
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/cfg.vim b/runtime/ftplugin/cfg.vim
new file mode 100644
index 0000000..b5835ba
--- /dev/null
+++ b/runtime/ftplugin/cfg.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: Configuration File
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Latest Revision: 2018-12-24
+
+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 cms< fo<"
+
+setlocal commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/ch.vim b/runtime/ftplugin/ch.vim
new file mode 100644
index 0000000..ed09003
--- /dev/null
+++ b/runtime/ftplugin/ch.vim
@@ -0,0 +1,17 @@
+" Vim filetype plugin file
+" Language: Ch
+" Maintainer: SoftIntegration, Inc. <info@softintegration.com>
+" URL: http://www.softintegration.com/download/vim/ftplugin/ch.vim
+" Last change: 2004 May 16
+" Created based on cpp.vim
+"
+" Ch is a C/C++ interpreter with many high level extensions
+"
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves just like C
+runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim
diff --git a/runtime/ftplugin/changelog.vim b/runtime/ftplugin/changelog.vim
new file mode 100644
index 0000000..e9df63f
--- /dev/null
+++ b/runtime/ftplugin/changelog.vim
@@ -0,0 +1,307 @@
+" Vim filetype plugin file
+" Language: generic Changelog file
+" Maintainer: Martin Florian <marfl@posteo.de>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2021-10-17
+" Variables:
+" g:changelog_timeformat (deprecated: use g:changelog_dateformat instead) -
+" description: the timeformat used in ChangeLog entries.
+" default: "%Y-%m-%d".
+" g:changelog_dateformat -
+" description: the format sent to strftime() to generate a date string.
+" default: "%Y-%m-%d".
+" g:changelog_username -
+" description: the username to use in ChangeLog entries
+" default: try to deduce it from environment variables and system files.
+" Local Mappings:
+" <Leader>o -
+" adds a new changelog entry for the current user for the current date.
+" Global Mappings:
+" <Leader>o -
+" switches to the ChangeLog buffer opened for the current directory, or
+" opens it in a new buffer if it exists in the current directory. Then
+" it does the same as the local <Leader>o described above.
+" Notes:
+" run 'runtime ftplugin/changelog.vim' to enable the global mapping for
+" changelog files.
+" TODO:
+" should we perhaps open the ChangeLog file even if it doesn't exist already?
+" Problem is that you might end up with ChangeLog files all over the place.
+
+" If 'filetype' isn't "changelog", we must have been to add ChangeLog opener
+if &filetype == 'changelog'
+ if exists('b:did_ftplugin')
+ finish
+ endif
+ let b:did_ftplugin = 1
+
+ let s:cpo_save = &cpo
+ set cpo&vim
+
+ " Set up the format used for dates.
+ if !exists('g:changelog_dateformat')
+ if exists('g:changelog_timeformat')
+ let g:changelog_dateformat = g:changelog_timeformat
+ else
+ let g:changelog_dateformat = "%Y-%m-%d"
+ endif
+ endif
+
+ function! s:username()
+ if exists('g:changelog_username')
+ return g:changelog_username
+ elseif $EMAIL != ""
+ return $EMAIL
+ elseif $EMAIL_ADDRESS != ""
+ return $EMAIL_ADDRESS
+ endif
+
+ let login = s:login()
+ return printf('%s <%s@%s>', s:name(login), login, s:hostname())
+ endfunction
+
+ function! s:login()
+ return s:trimmed_system_with_default('whoami', 'unknown')
+ endfunction
+
+ function! s:trimmed_system_with_default(command, default)
+ return s:first_line(s:system_with_default(a:command, a:default))
+ endfunction
+
+ function! s:system_with_default(command, default)
+ let output = system(a:command)
+ if v:shell_error
+ return default
+ endif
+ return output
+ endfunction
+
+ function! s:first_line(string)
+ return substitute(a:string, '\n.*$', "", "")
+ endfunction
+
+ function! s:name(login)
+ for name in [s:gecos_name(a:login), $NAME, s:capitalize(a:login)]
+ if name != ""
+ return name
+ endif
+ endfor
+ endfunction
+
+ function! s:gecos_name(login)
+ for line in s:try_reading_file('/etc/passwd')
+ if line =~ '^' . a:login . ':'
+ return substitute(s:passwd_field(line, 5), '&', s:capitalize(a:login), "")
+ endif
+ endfor
+ return ""
+ endfunction
+
+ function! s:try_reading_file(path)
+ try
+ return readfile(a:path)
+ catch
+ return []
+ endtry
+ endfunction
+
+ function! s:passwd_field(line, field)
+ let fields = split(a:line, ':', 1)
+ if len(fields) < a:field
+ return ""
+ endif
+ return fields[a:field - 1]
+ endfunction
+
+ function! s:capitalize(word)
+ return toupper(a:word[0]) . strpart(a:word, 1)
+ endfunction
+
+ function! s:hostname()
+ return s:trimmed_system_with_default('hostname', 'localhost')
+ endfunction
+
+ " Format used for new date entries.
+ if !exists('g:changelog_new_date_format')
+ let g:changelog_new_date_format = "%d %u\n\n\t* %p%c\n\n"
+ endif
+
+ " Format used for new entries to current date entry.
+ if !exists('g:changelog_new_entry_format')
+ let g:changelog_new_entry_format = "\t* %p%c"
+ endif
+
+ " Regular expression used to find a given date entry.
+ if !exists('g:changelog_date_entry_search')
+ let g:changelog_date_entry_search = '^\s*%d\_s*%u'
+ endif
+
+ " Regular expression used to find the end of a date entry
+ if !exists('g:changelog_date_end_entry_search')
+ let g:changelog_date_end_entry_search = '^\s*$'
+ endif
+
+
+ " Substitutes specific items in new date-entry formats and search strings.
+ " Can be done with substitute of course, but unclean, and need \@! then.
+ function! s:substitute_items(str, date, user, prefix)
+ let str = a:str
+ let middles = {'%': '%', 'd': a:date, 'u': a:user, 'p': a:prefix, 'c': '{cursor}'}
+ let i = stridx(str, '%')
+ while i != -1
+ let inc = 0
+ if has_key(middles, str[i + 1])
+ let mid = middles[str[i + 1]]
+ let str = strpart(str, 0, i) . mid . strpart(str, i + 2)
+ let inc = strlen(mid) - 1
+ endif
+ let i = stridx(str, '%', i + 1 + inc)
+ endwhile
+ return str
+ endfunction
+
+ " Position the cursor once we've done all the funky substitution.
+ function! s:position_cursor()
+ if search('{cursor}') > 0
+ let lnum = line('.')
+ let line = getline(lnum)
+ let cursor = stridx(line, '{cursor}')
+ call setline(lnum, substitute(line, '{cursor}', '', ''))
+ endif
+ startinsert
+ endfunction
+
+ " Internal function to create a new entry in the ChangeLog.
+ function! s:new_changelog_entry(prefix)
+ " Deal with 'paste' option.
+ let save_paste = &paste
+ let &paste = 1
+ call cursor(1, 1)
+ " Look for an entry for today by our user.
+ let date = strftime(g:changelog_dateformat)
+ let search = s:substitute_items(g:changelog_date_entry_search, date,
+ \ s:username(), a:prefix)
+ if search(search) > 0
+ " Ok, now we look for the end of the date entry, and add an entry.
+ call cursor(nextnonblank(line('.') + 1), 1)
+ if search(g:changelog_date_end_entry_search, 'W') > 0
+ let p = (line('.') == line('$')) ? line('.') : line('.') - 1
+ else
+ let p = line('.')
+ endif
+ let ls = split(s:substitute_items(g:changelog_new_entry_format, '', '', a:prefix),
+ \ '\n')
+ call append(p, ls)
+ call cursor(p + 1, 1)
+ else
+ " Flag for removing empty lines at end of new ChangeLogs.
+ let remove_empty = line('$') == 1
+
+ " No entry today, so create a date-user header and insert an entry.
+ let todays_entry = s:substitute_items(g:changelog_new_date_format,
+ \ date, s:username(), a:prefix)
+ " Make sure we have a cursor positioning.
+ if stridx(todays_entry, '{cursor}') == -1
+ let todays_entry = todays_entry . '{cursor}'
+ endif
+
+ " Now do the work.
+ call append(0, split(todays_entry, '\n'))
+
+ " Remove empty lines at end of file.
+ if remove_empty
+ $-/^\s*$/-1,$delete
+ endif
+
+ " Reposition cursor once we're done.
+ call cursor(1, 1)
+ endif
+
+ call s:position_cursor()
+
+ " And reset 'paste' option
+ let &paste = save_paste
+ endfunction
+
+ let b:undo_ftplugin = "setl com< fo< et< ai<"
+
+ setlocal comments=
+ setlocal formatoptions+=t
+ setlocal noexpandtab
+ setlocal autoindent
+
+ if &textwidth == 0
+ setlocal textwidth=78
+ let b:undo_ftplugin .= " tw<"
+ endif
+
+ if !exists("no_plugin_maps") && !exists("no_changelog_maps") && exists(":NewChangelogEntry") != 2
+ nnoremap <buffer> <silent> <Leader>o :<C-u>call <SID>new_changelog_entry('')<CR>
+ xnoremap <buffer> <silent> <Leader>o :<C-u>call <SID>new_changelog_entry('')<CR>
+ command! -buffer -nargs=0 NewChangelogEntry call s:new_changelog_entry('')
+ let b:undo_ftplugin .= " | sil! exe 'nunmap <buffer> <Leader>o'" .
+ \ " | sil! exe 'vunmap <buffer> <Leader>o'" .
+ \ " | sil! delc NewChangelogEntry"
+ endif
+
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
+else
+ let s:cpo_save = &cpo
+ set cpo&vim
+
+ if !exists("no_plugin_maps") && !exists("no_changelog_maps")
+ " Add the Changelog opening mapping
+ nnoremap <silent> <Leader>o :call <SID>open_changelog()<CR>
+ let b:undo_ftplugin .= " | silent! exe 'nunmap <buffer> <Leader>o"
+ endif
+
+ function! s:open_changelog()
+ let path = expand('%:p:h')
+ if exists('b:changelog_path')
+ let changelog = b:changelog_path
+ else
+ if exists('b:changelog_name')
+ let name = b:changelog_name
+ else
+ let name = 'ChangeLog'
+ endif
+ while isdirectory(path)
+ let changelog = path . '/' . name
+ if filereadable(changelog)
+ break
+ endif
+ let parent = substitute(path, '/\+[^/]*$', "", "")
+ if path == parent
+ break
+ endif
+ let path = parent
+ endwhile
+ endif
+ if !filereadable(changelog)
+ return
+ endif
+
+ if exists('b:changelog_entry_prefix')
+ let prefix = call(b:changelog_entry_prefix, [])
+ else
+ let prefix = substitute(strpart(expand('%:p'), strlen(path)), '^/\+', "", "")
+ endif
+
+ let buf = bufnr(changelog)
+ if buf != -1
+ if bufwinnr(buf) != -1
+ execute bufwinnr(buf) . 'wincmd w'
+ else
+ execute 'sbuffer' buf
+ endif
+ else
+ execute 'split' fnameescape(changelog)
+ endif
+
+ call s:new_changelog_entry(prefix)
+ endfunction
+
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
+endif
diff --git a/runtime/ftplugin/chatito.vim b/runtime/ftplugin/chatito.vim
new file mode 100644
index 0000000..af212e9
--- /dev/null
+++ b/runtime/ftplugin/chatito.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin
+" Language: Chatito
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 19
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:#,:// commentstring=#\ %s
+" indent of 4 spaces is mandated by the spec
+setlocal expandtab softtabstop=4 shiftwidth=4
+
+let b:undo_ftplugin = 'setl com< cms< et< sts< sw<'
diff --git a/runtime/ftplugin/chicken.vim b/runtime/ftplugin/chicken.vim
new file mode 100644
index 0000000..84d45ba
--- /dev/null
+++ b/runtime/ftplugin/chicken.vim
@@ -0,0 +1,55 @@
+" CHICKEN-specific Vim customizations
+" Last Change: 2018-03-05
+" Author: Evan Hanson <evhan@foldling.org>
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" Repository: https://git.foldling.org/vim-scheme.git
+" 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
new file mode 100644
index 0000000..c922d75
--- /dev/null
+++ b/runtime/ftplugin/clojure.vim
@@ -0,0 +1,80 @@
+" Vim filetype plugin file
+" Language: Clojure
+" Maintainer: Alex Vear <alex@vear.uk>
+" Former Maintainers: Sung Pae <self@sungpae.com>
+" Meikel Brandmeyer <mb@kotka.de>
+" URL: https://github.com/clojure-vim/clojure.vim
+" License: Vim (see :h license)
+" Last Change: 2022-03-24
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = 'setlocal iskeyword< define< formatoptions< comments< commentstring< lispwords<'
+
+setlocal iskeyword+=?,-,*,!,+,/,=,<,>,.,:,$,%,&,\|
+
+" There will be false positives, but this is better than missing the whole set
+" of user-defined def* definitions.
+setlocal define=\\v[(/]def(ault)@!\\S*
+
+" Remove 't' from 'formatoptions' to avoid auto-wrapping code.
+setlocal formatoptions-=t
+
+" Lisp comments are routinely nested (e.g. ;;; SECTION HEADING)
+setlocal comments=n:;
+setlocal commentstring=;\ %s
+
+" Specially indented symbols from clojure.core and clojure.test.
+"
+" Clojure symbols are indented in the defn style when they:
+"
+" * Define vars and anonymous functions
+" * Create new lexical scopes or scopes with altered environments
+" * Create conditional branches from a predicate function or value
+"
+" The arglists for these functions are generally in the form of [x & body];
+" Functions that accept a flat list of forms do not treat the first argument
+" specially and hence are not indented specially.
+"
+" -*- LISPWORDS -*-
+" Generated from https://github.com/clojure-vim/clojure.vim/blob/fd280e33e84c88e97860930557dba3ff80b1a82d/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
+" 'omnifunc' is set by popular Clojure REPL client plugins, we also set
+" 'completefunc' so that the user has some form of completion available when
+" 'omnifunc' is set and no REPL connection exists.
+for s:setting in ['omnifunc', 'completefunc']
+ if exists('&' . s:setting) && empty(eval('&' . s:setting))
+ execute 'setlocal ' . s:setting . '=clojurecomplete#Complete'
+ let b:undo_ftplugin .= ' | setlocal ' . s:setting . '<'
+ endif
+endfor
+
+" Skip brackets in ignored syntax regions when using the % command
+if exists('loaded_matchit')
+ let b:match_words = &matchpairs
+ let b:match_skip = 's:comment\|string\|regex\|character'
+ let b:undo_ftplugin .= ' | unlet! b:match_words b:match_skip'
+endif
+
+" Filter files in the browse dialog
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "All Files\t*\n" .
+ \ "Clojure Files\t*.clj;*.cljc;*.cljs;*.cljx\n" .
+ \ "EDN Files\t*.edn\n" .
+ \ "Java Files\t*.java\n"
+ let b:undo_ftplugin .= ' | unlet! b:browsefilter'
+endif
+
+let &cpo = s:cpo_save
+
+unlet! s:cpo_save s:setting s:dir
+
+" vim:sts=8:sw=8:ts=8:noet
diff --git a/runtime/ftplugin/cmake.vim b/runtime/ftplugin/cmake.vim
new file mode 100644
index 0000000..94c0076
--- /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/cobol.vim b/runtime/ftplugin/cobol.vim
new file mode 100644
index 0000000..ec1e954
--- /dev/null
+++ b/runtime/ftplugin/cobol.vim
@@ -0,0 +1,269 @@
+" Vim filetype plugin file
+" Language: cobol
+" Maintainer: Ankit Jain <ajatkj@yahoo.co.in>
+" (formerly Tim Pope <vimNOSPAM@tpope.info>)
+" Last Update: By Ankit Jain (add gtk support) on 15.08.2020
+
+" Insert mode mappings: <C-T> <C-D> <Tab>
+" Normal mode mappings: < > << >> [[ ]] [] ][
+" Visual mode mappings: < >
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal commentstring=\ \ \ \ \ \ *%s
+setlocal comments=:*
+setlocal fo+=croqlt
+setlocal expandtab
+setlocal textwidth=72
+
+" matchit support
+if exists("loaded_matchit")
+ let s:ordot = '\|\ze\.\%( \@=\|$\)'
+ let b:match_ignorecase=1
+ "let b:match_skip = 'getline(".") =~ "^.\\{6\\}[*/C]"'
+ let b:match_words=
+ \ '\$if\>:$else\>:\$endif\>,' .
+ \ '[$-]\@<!\<if\>:\<\%(then\|else\)\>:\<end-if\>'.s:ordot.',' .
+ \ '-\@<!\<perform\s\+\%(\d\+\s\+times\|until\|varying\|with\s\+test\)\>:\<end-perform\>'.s:ordot . ',' .
+ \ '-\@<!\<\%(search\|evaluate\)\>:\<\%(when\)\>:\<end-\%(search\|evaluate\)\>' .s:ordot . ',' .
+ \ '-\@<!\<\%(add\|compute\|divide\|multiply\|subtract\)\>\%(.*\(\%$\|\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*\%(not\s\+\)\=on\s\+size\s\+error\>\)\)\@=:\%(\<not\s\+\)\@<!\<\%(not\s\+\)\=on\s\+size\s\+error\>:\<end-\%(add\|compute\|divide\|multiply\|subtract\)\>' .s:ordot . ',' .
+ \ '-\@<!\<\%(string\|unstring\|accept\|display\|call\)\>\%(.*\(\%$\|\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*\%(not\s\+\)\=on\s\+\%(overflow\|exception\)\>\)\)\@=:\%(\<not\s\+\)\@<!\<\%(not\s\+\)\=on\s\+\%(overflow\|exception\)\>:\<end-\%(string\|unstring\|accept\|display\|call\)\>' .s:ordot . ',' .
+ \ '-\@<!\<\%(delete\|rewrite\|start\|write\|read\)\>\%(.*\(\%$\|\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*\%(invalid\s\+key\|at\s\+end\|no\s\+data\|at\s\+end-of-page\)\>\)\)\@=:\%(\<not\s\+\)\@<!\<\%(not\s\+\)\=\%(invalid\s\+key\|at\s\+end\|no\s\+data\|at\s\+end-of-page\)\>:\<end-\%(delete\|rewrite\|start\|write\|read\)\>' .s:ordot
+endif
+
+" add gtk support
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "COBOL Source Files (*.cbl, *.cob)\t*.cbl;*.cob;*.lib\n".
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setlocal com< cms< fo< et< tw<" .
+ \ " | unlet! b:browsefilter b:match_words b:match_ignorecase b:match_skip"
+if !exists("g:no_plugin_maps") && !exists("g:no_cobol_maps")
+ let b:undo_ftplugin = b:undo_ftplugin .
+ \ " | sil! exe 'nunmap <buffer> <'" .
+ \ " | sil! exe 'nunmap <buffer> >'" .
+ \ " | sil! exe 'nunmap <buffer> <<'" .
+ \ " | sil! exe 'nunmap <buffer> >>'" .
+ \ " | sil! exe 'vunmap <buffer> <'" .
+ \ " | sil! exe 'vunmap <buffer> >'" .
+ \ " | sil! exe 'iunmap <buffer> <C-D>'" .
+ \ " | sil! exe 'iunmap <buffer> <C-T>'" .
+ \ " | sil! exe 'iunmap <buffer> <Tab>'" .
+ \ " | sil! exe 'nunmap <buffer> <Plug>Traditional'" .
+ \ " | sil! exe 'nunmap <buffer> <Plug>Comment'" .
+ \ " | sil! exe 'nunmap <buffer> <Plug>DeComment'" .
+ \ " | sil! exe 'vunmap <buffer> <Plug>VisualTraditional'" .
+ \ " | sil! exe 'vunmap <buffer> <Plug>VisualComment'" .
+ \ " | sil! exe 'iunmap <buffer> <Plug>VisualDeComment'" .
+ \ " | sil! exe 'unmap <buffer> [['" .
+ \ " | sil! exe 'unmap <buffer> ]]'" .
+ \ " | sil! exe 'unmap <buffer> []'" .
+ \ " | sil! exe 'unmap <buffer> ]['"
+endif
+
+if !exists("g:no_plugin_maps") && !exists("g:no_cobol_maps")
+ if version >= 700
+ nnoremap <silent> <buffer> > :set opfunc=<SID>IncreaseFunc<CR>g@
+ nnoremap <silent> <buffer> < :set opfunc=<SID>DecreaseFunc<CR>g@
+ endif
+ nnoremap <silent> <buffer> >> :call CobolIndentBlock(1)<CR>
+ nnoremap <silent> <buffer> << :call CobolIndentBlock(-1)<CR>
+ vnoremap <silent> <buffer> > :call CobolIndentBlock(v:count1)<CR>
+ vnoremap <silent> <buffer> < :call CobolIndentBlock(-v:count1)<CR>
+ inoremap <silent> <buffer> <C-T> <C-R>=<SID>IncreaseIndent()<CR><C-R>=<SID>RestoreShiftwidth()<CR>
+ inoremap <silent> <buffer> <C-D> <C-R>=<SID>DecreaseIndent()<CR><C-R>=<SID>RestoreShiftwidth()<CR>
+ if !maparg("<Tab>","i")
+ inoremap <silent> <buffer> <Tab> <C-R>=<SID>Tab()<CR><C-R>=<SID>RestoreShiftwidth()<CR>
+ endif
+ noremap <silent> <buffer> [[ m':call search('\c^\%(\s*\<Bar>.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\<Bar>section\)\s*\.','bW')<CR>
+ noremap <silent> <buffer> ]] m':call search('\c^\%(\s*\<Bar>.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\<Bar>section\)\.','W')<CR>
+ noremap <silent> <buffer> [] m':call <SID>toend('b')<CR>
+ noremap <silent> <buffer> ][ m':call <SID>toend('')<CR>
+ " For EnhancedCommentify
+ noremap <silent> <buffer> <Plug>Traditional :call <SID>Comment('t')<CR>
+ noremap <silent> <buffer> <Plug>Comment :call <SID>Comment('c')<CR>
+ noremap <silent> <buffer> <Plug>DeComment :call <SID>Comment('u')<CR>
+ noremap <silent> <buffer> <Plug>VisualTraditional :'<,'>call <SID>Comment('t')<CR>
+ noremap <silent> <buffer> <Plug>VisualComment :'<,'>call <SID>Comment('c')<CR>
+ noremap <silent> <buffer> <Plug>VisualDeComment :'<,'>call <SID>Comment('u')<CR>
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+if exists("g:did_cobol_ftplugin_functions")
+ finish
+endif
+let g:did_cobol_ftplugin_functions = 1
+
+function! s:repeat(str,count)
+ let i = 0
+ let ret = ""
+ while i < a:count
+ let ret = ret . a:str
+ let i = i + 1
+ endwhile
+ return ret
+endfunction
+
+function! s:increase(...)
+ let lnum = '.'
+ let sw = shiftwidth()
+ let i = a:0 ? a:1 : indent(lnum)
+ if i >= 11
+ return sw - (i - 11) % sw
+ elseif i >= 7
+ return 11-i
+ elseif i == 6
+ return 1
+ else
+ return 6-i
+ endif
+endfunction
+
+function! s:decrease(...)
+ let lnum = '.'
+ let sw = shiftwidth()
+ let i = indent(a:0 ? a:1 : lnum)
+ if i >= 11 + sw
+ return 1 + (i + 12) % sw
+ elseif i > 11
+ return i-11
+ elseif i > 7
+ return i-7
+ elseif i == 7
+ return 1
+ else
+ return i
+ endif
+endfunction
+
+function! CobolIndentBlock(shift)
+ let head = strpart(getline('.'),0,7)
+ let tail = strpart(getline('.'),7)
+ let indent = match(tail,'[^ ]')
+ let sw = shiftwidth()
+ let shift = a:shift
+ if shift > 0
+ if indent < 4
+ let tail = s:repeat(" ",4-indent).tail
+ let shift = shift - 1
+ endif
+ let tail = s:repeat(" ",shift*sw).tail
+ let shift = 0
+ elseif shift < 0
+ if (indent-4) > -shift * sw
+ let tail = strpart(tail,-shift * sw)
+ elseif (indent-4) > (-shift-1) * sw
+ let tail = strpart(tail,indent - 4)
+ else
+ let tail = strpart(tail,indent)
+ endif
+ endif
+ call setline('.',head.tail)
+endfunction
+
+function! s:IncreaseFunc(type)
+ '[,']call CobolIndentBlock(1)
+endfunction
+
+function! s:DecreaseFunc(type)
+ '[,']call CobolIndentBlock(-1)
+endfunction
+
+function! s:IncreaseIndent()
+ let c = "\<C-T>"
+ if exists("*InsertCtrlTWrapper")
+ let key = InsertCtrlTWrapper()
+ if key != c
+ return key
+ endif
+ endif
+ let interval = s:increase()
+ let b:cobol_shiftwidth = &shiftwidth
+ let &shiftwidth = 1
+ let lastchar = strpart(getline('.'),col('.')-2,1)
+ if lastchar == '0' || lastchar == '^'
+ return "\<BS>".lastchar.c
+ else
+ return s:repeat(c,interval)
+ endif
+endfunction
+
+function! s:DecreaseIndent()
+ let c = "\<C-D>"
+ if exists("*InsertCtrlDWrapper")
+ " I hack Ctrl-D to delete when not at the end of the line.
+ let key = InsertCtrlDWrapper()
+ if key != c
+ return key
+ endif
+ endif
+ let interval = s:decrease()
+ let b:cobol_shiftwidth = &shiftwidth
+ let &shiftwidth = 1
+ return s:repeat(c,interval)
+endfunction
+
+function! s:RestoreShiftwidth()
+ if exists("b:cobol_shiftwidth")
+ let &shiftwidth=b:cobol_shiftwidth
+ unlet b:cobol_shiftwidth
+ endif
+ return ""
+endfunction
+
+function! s:Tab()
+ if (strpart(getline('.'),0,col('.')-1) =~ '^\s*$' && &sta)
+ return s:IncreaseIndent()
+ " &softtabstop < 0: &softtabstop follows &shiftwidth
+ elseif (&sts < 0 || &sts == shiftwidth()) && &sts != 8 && &et
+ return s:repeat(" ",s:increase(col('.')-1))
+ else
+ return "\<Tab>"
+ endif
+endfunction
+
+function! s:Comment(arg)
+ " For EnhancedCommentify
+ let line = getline('.')
+ if (line =~ '^.\{6\}[*/C]' || a:arg == 'c') && a:arg != 'u'
+ let line = substitute(line,'^.\{6\}\zs.',' ','')
+ else
+ let line = substitute(line,'^.\{6\}\zs.','*','')
+ endif
+ call setline('.',line)
+endfunction
+
+function! s:toend(direction)
+ let ignore = '^\(\s*\|.\{6\}\)\%([*/]\|\s*$\)'
+ let keep = line('.')
+ keepjumps +
+ while line('.') < line('$') && getline('.') =~ ignore
+ keepjumps +
+ endwhile
+ let res = search('\c^\%(\s*\|.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\|section\)\s*\.',a:direction.'W')
+ if a:direction != 'b' && !res
+ let res = line('$')
+ keepjumps $
+ elseif res
+ keepjumps -
+ endif
+ if res
+ while line('.') > 1 && getline('.') =~ ignore
+ keepjumps -
+ endwhile
+ if line('.') == 1 && getline('.') =~ ignore
+ exe "keepjumps ".keep
+ endif
+ else
+ exe "keepjumps ".keep
+ endif
+endfunction
diff --git a/runtime/ftplugin/conf.vim b/runtime/ftplugin/conf.vim
new file mode 100644
index 0000000..ff2add1
--- /dev/null
+++ b/runtime/ftplugin/conf.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: generic configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/config.vim b/runtime/ftplugin/config.vim
new file mode 100644
index 0000000..73136cb
--- /dev/null
+++ b/runtime/ftplugin/config.vim
@@ -0,0 +1,44 @@
+" Vim filetype plugin file
+" Language: config
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "Bourne Shell Files (*.sh)\t*.sh\n" .
+ \ "All Files (*.*)\t*.*\n"
+let s:match_words = ""
+
+runtime! ftplugin/sh.vim ftplugin/sh_*.vim ftplugin/sh/*.vim
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show configure-related files.
+if has("gui_win32")
+ let b:browsefilter="Configure Scripts (configure.*, config.*)\tconfigure*;config.*\n" .
+ \ s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter | " . b:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/confini.vim b/runtime/ftplugin/confini.vim
new file mode 100644
index 0000000..310e046
--- /dev/null
+++ b/runtime/ftplugin/confini.vim
@@ -0,0 +1,10 @@
+" Vim filetype plugin file
+" Language: confini
+
+" Quit if a ftplugin file was already loaded
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Use the cfg plugin, it's similar enough.
+runtime! ftplugin/cfg.vim
diff --git a/runtime/ftplugin/context.vim b/runtime/ftplugin/context.vim
new file mode 100644
index 0000000..75d26cf
--- /dev/null
+++ b/runtime/ftplugin/context.vim
@@ -0,0 +1,115 @@
+vim9script
+
+# Vim filetype plugin file
+# Language: ConTeXt typesetting engine
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2022 Aug 12
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+import autoload '../autoload/context.vim'
+
+b:did_ftplugin = 1
+
+if !exists('current_compiler')
+ compiler context
+endif
+
+b:undo_ftplugin = "setl com< cms< def< inc< sua< fo< ofu<"
+
+setlocal comments=b:%D,b:%C,b:%M,:%
+setlocal commentstring=%\ %s
+setlocal formatoptions+=tjcroql2
+setlocal omnifunc=context.Complete
+setlocal suffixesadd=.tex,.mkxl,.mkvi,.mkiv,.mkii
+
+&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\)'
+
+&l:include = '^\s*\\\%(input\|component\|product\|project\|environment\)'
+
+if exists("g:loaded_matchit") && !exists("b:match_words")
+ b:match_ignorecase = 0
+ b:match_skip = 'r:\\\@<!\%(\\\\\)*%'
+ b:match_words = '(:),\[:],{:},\\(:\\),\\\[:\\],\\start\(\a\+\):\\stop\1'
+ b:undo_ftplugin ..= "| unlet! b:match_ignorecase b:match_words b:match_skip"
+endif
+
+if !get(g:, 'no_context_maps', 0) && !get(g:, 'no_plugin_maps', 0)
+ const 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\)',
+ }
+
+ def UndoMap(mapping: string, modes: string)
+ for mode in modes
+ b:undo_ftplugin ..= printf(" | silent! execute '%sunmap <buffer> %s'", mode, mapping)
+ endfor
+ enddef
+
+ def MoveAround(count: number, what: string, flags: string)
+ search(context_regex[what], flags .. 's') # 's' sets previous context mark
+ var i = 2
+ while i <= count
+ search(context_regex[what], flags)
+ i += 1
+ endwhile
+ enddef
+
+ # Macros to move around
+ nnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ vnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ nnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ vnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ nnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ vnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ nnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ vnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ nnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ vnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ nnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+ vnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+
+ for mapping in ['[[', ']]', '[]', '][', '[{', ']}']
+ UndoMap(mapping, 'nv')
+ endfor
+
+ # Other useful mappings
+ const tp_regex = '?^$\|^\s*\\\(item\|start\|stop\|blank\|\%(sub\)*section\|chapter\|\%(sub\)*subject\|title\|part\)'
+
+ def TeXPar()
+ cursor(search(tp_regex, 'bcW') + 1, 1)
+ normal! V
+ cursor(search(tp_regex, 'W') - 1, 1)
+ enddef
+
+ # Reflow paragraphs with mappings like gqtp ("gq TeX paragraph")
+ onoremap <silent><buffer> tp <scriptcmd>TeXPar()<cr>
+ # Select TeX paragraph
+ vnoremap <silent><buffer> tp <scriptcmd>TeXPar()<cr>
+
+ # $...$ text object
+ onoremap <silent><buffer> i$ <scriptcmd>normal! T$vt$<cr>
+ onoremap <silent><buffer> a$ <scriptcmd>normal! F$vf$<cr>
+ vnoremap <buffer> i$ T$ot$
+ vnoremap <buffer> a$ F$of$
+
+ for mapping in ['tp', 'i$', 'a$']
+ UndoMap(mapping, 'ov')
+ endfor
+endif
+
+# Commands for asynchronous typesetting
+command! -buffer -nargs=? -complete=buffer ConTeXt context.Typeset(<q-args>)
+command! -buffer -nargs=0 ConTeXtLog context.Log('%')
+command! -nargs=0 ConTeXtJobStatus context.JobStatus()
+command! -nargs=0 ConTeXtStopJobs context.StopJobs()
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/ftplugin/cpp.vim b/runtime/ftplugin/cpp.vim
new file mode 100644
index 0000000..f9d31cb
--- /dev/null
+++ b/runtime/ftplugin/cpp.vim
@@ -0,0 +1,17 @@
+" Vim filetype plugin file
+" Language: C++
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2020 Jul 26
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves mostly just like C
+runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim
+
+" C++ uses templates with <things>
+" Disabled, because it gives an error for typing an unmatched ">".
+" set matchpairs+=<:>
+" let b:undo_ftplugin ..= ' | setl matchpairs<'
diff --git a/runtime/ftplugin/crm.vim b/runtime/ftplugin/crm.vim
new file mode 100644
index 0000000..06baee8
--- /dev/null
+++ b/runtime/ftplugin/crm.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: CRM114
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/crontab.vim b/runtime/ftplugin/crontab.vim
new file mode 100644
index 0000000..8dac007
--- /dev/null
+++ b/runtime/ftplugin/crontab.vim
@@ -0,0 +1,16 @@
+" Vim filetype plugin
+" Language: crontab
+" Maintainer: Keith Smiley <keithbsmiley@gmail.com>
+" Last Change: 2022 Sep 11
+
+" 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/cs.vim b/runtime/ftplugin/cs.vim
new file mode 100644
index 0000000..0734d11
--- /dev/null
+++ b/runtime/ftplugin/cs.vim
@@ -0,0 +1,44 @@
+" Vim filetype plugin file
+" Language: C#
+" Maintainer: Nick Jensen <nickspoon@gmail.com>
+" Former Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: 2022-11-16
+" License: Vim (see :h license)
+" Repository: https://github.com/nickspoons/vim-cs
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpoptions
+set cpoptions&vim
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:///,://
+
+let b:undo_ftplugin = 'setl com< fo<'
+
+if exists('loaded_matchit') && !exists('b:match_words')
+ " #if/#endif support included by default
+ let b:match_ignorecase = 0
+ let b:match_words = '\%(^\s*\)\@<=#\s*region\>:\%(^\s*\)\@<=#\s*endregion\>,'
+ let b:undo_ftplugin .= ' | unlet! b:match_ignorecase b:match_words'
+endif
+
+if (has('gui_win32') || has('gui_gtk')) && !exists('b:browsefilter')
+ let b:browsefilter = "C# Source Files (*.cs *.csx)\t*.cs;*.csx\n" .
+ \ "C# Project Files (*.csproj)\t*.csproj\n" .
+ \ "Visual Studio Solution Files (*.sln)\t*.sln\n" .
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin .= ' | unlet! b:browsefilter'
+endif
+
+let &cpoptions = s:save_cpo
+unlet s:save_cpo
+
+" vim:et:sw=2:sts=2
diff --git a/runtime/ftplugin/csc.vim b/runtime/ftplugin/csc.vim
new file mode 100644
index 0000000..7b4126a
--- /dev/null
+++ b/runtime/ftplugin/csc.vim
@@ -0,0 +1,29 @@
+" Vim filetype plugin file
+" Language: csc
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+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
+
+if exists("loaded_matchit")
+ let b:match_words=
+ \ '\<fix\>:\<endfix\>,' .
+ \ '\<if\>:\<else\%(if\)\=\>:\<endif\>,' .
+ \ '\<!loopondimensions\>\|\<!looponselected\>:\<!endloop\>'
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:match_words"
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/csh.vim b/runtime/ftplugin/csh.vim
new file mode 100644
index 0000000..ca5da5a
--- /dev/null
+++ b/runtime/ftplugin/csh.vim
@@ -0,0 +1,51 @@
+" Vim filetype plugin file
+" Language: csh
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Contributor: Johannes Zellner <johannes@zellner.org>
+" Last Change: 2021 Oct 15
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal comments=:#
+setlocal commentstring=#%s
+setlocal formatoptions-=t
+setlocal formatoptions+=crql
+
+let b:undo_ftplugin = "setlocal com< cms< fo<"
+
+" Csh: thanks to Johannes Zellner
+" - Both foreach and end must appear alone on separate lines.
+" - The words else and endif must appear at the beginning of input lines;
+" the if must appear alone on its input line or after an else.
+" - Each case label and the default label must appear at the start of a
+" line.
+" - while and end must appear alone on their input lines.
+if exists("loaded_matchit") && !exists("b:match_words")
+ let s:line_start = '\%(^\s*\)\@<='
+ let b:match_words =
+ \ s:line_start .. 'if\s*(.*)\s*then\>:' ..
+ \ s:line_start .. 'else\s\+if\s*(.*)\s*then\>:' .. s:line_start .. 'else\>:' ..
+ \ s:line_start .. 'endif\>,' ..
+ \ s:line_start .. '\%(\<foreach\s\+\h\w*\|while\)\s*(:' ..
+ \ '\<break\>:\<continue\>:' ..
+ \ s:line_start .. 'end\>,' ..
+ \ s:line_start .. 'switch\s*(:' ..
+ \ s:line_start .. 'case\s\+:' .. s:line_start .. 'default\>:\<breaksw\>:' ..
+ \ s:line_start .. 'endsw\>'
+ unlet s:line_start
+ let b:undo_ftplugin ..= " | unlet b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="csh Scripts (*.csh)\t*.csh\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet b:browsefilter"
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/css.vim b/runtime/ftplugin/css.vim
new file mode 100644
index 0000000..ece2def
--- /dev/null
+++ b/runtime/ftplugin/css.vim
@@ -0,0 +1,25 @@
+" Vim filetype plugin file
+" Language: CSS
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2020 Dec 21
+
+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< ofu< isk<"
+
+setlocal comments=s1:/*,mb:*,ex:*/ commentstring&
+setlocal formatoptions-=t formatoptions+=croql
+setlocal omnifunc=csscomplete#CompleteCSS
+setlocal iskeyword+=-
+
+let &l:include = '^\s*@import\s\+\%(url(\)\='
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/cucumber.vim b/runtime/ftplugin/cucumber.vim
new file mode 100644
index 0000000..f4848d1
--- /dev/null
+++ b/runtime/ftplugin/cucumber.vim
@@ -0,0 +1,150 @@
+" Vim filetype plugin
+" Language: Cucumber
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2016 Aug 29
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+setlocal formatoptions-=t formatoptions+=croql
+setlocal comments=:# commentstring=#\ %s
+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")
+ 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-D>" .
+ \ "|sil! nunmap <buffer> ]<C-D>" .
+ \ "|sil! nunmap <buffer> <C-W>d" .
+ \ "|sil! nunmap <buffer> <C-W><C-D>" .
+ \ "|sil! nunmap <buffer> [d" .
+ \ "|sil! nunmap <buffer> ]d"
+endif
+
+function! s:jump(command,count)
+ let steps = s:steps('.')
+ if len(steps) == 0 || len(steps) < a:count
+ return 'echoerr "No matching step found"'
+ elseif len(steps) > 1 && !a:count
+ return 'echoerr "Multiple matching steps found"'
+ else
+ let c = a:count ? a:count-1 : 0
+ return a:command.' +'.steps[c][1].' '.escape(steps[c][0],' %#')
+ endif
+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_steps_glob),"\n")
+ let lines = readfile(file)
+ let num = 0
+ for line in lines
+ let num += 1
+ if line =~ step_pattern
+ let type = matchstr(line,'\w\+')
+ let steps += [[file,num,type,matchstr(line,step_pattern)]]
+ endif
+ endfor
+ endfor
+ return steps
+endfunction
+
+function! s:steps(lnum)
+ let c = match(getline(a:lnum), '\S') + 1
+ while synIDattr(synID(a:lnum,c,1),'name') !~# '^$\|Region$'
+ let c = c + 1
+ endwhile
+ let step = matchstr(getline(a:lnum)[c-1 : -1],'^\s*\zs.\{-\}\ze\s*$')
+ return filter(s:allsteps(),'s:stepmatch(v:val[3],step)')
+endfunction
+
+function! s:stepmatch(receiver,target)
+ if a:receiver =~ '^[''"].*[''"]$'
+ let pattern = '^'.escape(substitute(a:receiver[1:-2],'$\w\+','(.*)','g'),'/').'$'
+ elseif a:receiver =~ '^/.*/$'
+ let pattern = a:receiver[1:-2]
+ elseif a:receiver =~ '^%r..*.$'
+ let pattern = escape(a:receiver[3:-2],'/')
+ else
+ return 0
+ endif
+ try
+ let vimpattern = substitute(substitute(pattern,'\\\@<!(?:','%(','g'),'\\\@<!\*?','{-}','g')
+ if a:target =~# '\v'.vimpattern
+ return 1
+ endif
+ catch
+ endtry
+ if has("ruby") && pattern !~ '\\\@<!#{'
+ ruby VIM.command("return #{if (begin; Kernel.eval('/'+VIM.evaluate('pattern')+'/'); rescue SyntaxError; end) === VIM.evaluate('a:target') then 1 else 0 end}")
+ else
+ return 0
+ endif
+endfunction
+
+function! s:bsub(target,pattern,replacement)
+ return substitute(a:target,'\C\\\@<!'.a:pattern,a:replacement,'g')
+endfunction
+
+function! CucumberComplete(findstart,base) abort
+ let indent = indent('.')
+ let group = synIDattr(synID(line('.'),indent+1,1),'name')
+ let type = matchstr(group,'\Ccucumber\zs\%(Given\|When\|Then\)')
+ let e = matchend(getline('.'),'^\s*\S\+\s')
+ if type == '' || col('.') < col('$') || e < 0
+ return -1
+ endif
+ if a:findstart
+ return e
+ endif
+ let steps = []
+ for step in s:allsteps()
+ if step[2] ==# type
+ if step[3] =~ '^[''"]'
+ let steps += [step[3][1:-2]]
+ elseif step[3] =~ '^/\^.*\$/$'
+ let pattern = step[3][2:-3]
+ let pattern = substitute(pattern,'\C^(?:|I )','I ','')
+ let pattern = s:bsub(pattern,'\\[Sw]','w')
+ let pattern = s:bsub(pattern,'\\d','1')
+ let pattern = s:bsub(pattern,'\\[sWD]',' ')
+ let pattern = s:bsub(pattern,'\[\^\\\="\]','_')
+ let pattern = s:bsub(pattern,'[[:alnum:]. _-][?*]?\=','')
+ let pattern = s:bsub(pattern,'\[\([^^]\).\{-\}\]','\1')
+ let pattern = s:bsub(pattern,'+?\=','')
+ let pattern = s:bsub(pattern,'(\([[:alnum:]. -]\{-\}\))','\1')
+ let pattern = s:bsub(pattern,'\\\([[:punct:]]\)','\1')
+ if pattern !~ '[\\()*?]'
+ let steps += [pattern]
+ endif
+ endif
+ endif
+ endfor
+ call filter(steps,'strpart(v:val,0,strlen(a:base)) ==# a:base')
+ return sort(steps)
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:set sts=2 sw=2:
diff --git a/runtime/ftplugin/cvsrc.vim b/runtime/ftplugin/cvsrc.vim
new file mode 100644
index 0000000..34b1484
--- /dev/null
+++ b/runtime/ftplugin/cvsrc.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: cvs(1) RC file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments= commentstring= formatoptions-=tcroql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/debchangelog.vim b/runtime/ftplugin/debchangelog.vim
new file mode 100644
index 0000000..062fc05
--- /dev/null
+++ b/runtime/ftplugin/debchangelog.vim
@@ -0,0 +1,394 @@
+" Vim filetype plugin file (GUI menu, folding and completion)
+" Language: Debian Changelog
+" Maintainer: Debian Vim Maintainers <team+vim@tracker.debian.org>
+" Former Maintainers: Michael Piefel <piefel@informatik.hu-berlin.de>
+" Stefano Zacchiroli <zack@debian.org>
+" Last Change: 2023 Jan 16
+" License: Vim License
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/ftplugin/debchangelog.vim
+
+" Bug completion requires apt-listbugs installed for Debian packages or
+" python-launchpadlib installed for Ubuntu packages
+
+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')
+ setlocal foldmethod=expr
+ setlocal foldexpr=DebGetChangelogFold(v:lnum)
+ setlocal foldtext=DebChangelogFoldText()
+endif
+
+" Debian changelogs are not supposed to have any other text width,
+" so the user cannot override this setting
+setlocal tw=78
+setlocal comments=f:*
+
+" Clean unloading
+let b:undo_ftplugin = 'setlocal tw< comments< foldmethod< foldexpr< foldtext<'
+" }}}1
+
+if exists('g:did_changelog_ftplugin')
+ finish
+endif
+
+" Don't load another plugin (this is global)
+let g:did_changelog_ftplugin = 1
+
+" Make sure the '<' and 'C' flags are not included in 'cpoptions', otherwise
+" <CR> would not be recognized. See ":help 'cpoptions'".
+let s:cpo_save = &cpo
+set cpo&vim
+
+" {{{1 GUI menu
+
+" Helper functions returning various data.
+" 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')
+ return $DEBFULLNAME
+ elseif exists('g:debianfullname')
+ return g:debianfullname
+ else
+ return 'Your Name'
+ endif
+endfunction
+
+" Returns email address, from $DEBEMAIL, $EMAIL or debianemail.
+function <SID>Email()
+ if exists('$DEBEMAIL')
+ return $DEBEMAIL
+ elseif exists('$EMAIL')
+ return $EMAIL
+ elseif exists('g:debianemail')
+ return g:debianemail
+ else
+ 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
+ return dateandtime
+endfunction
+
+function <SID>WarnIfNotUnfinalised()
+ if match(getline('.'), ' -- [[:alpha:]][[:alnum:].]')!=-1
+ echohl WarningMsg
+ echo 'The entry has not been unfinalised before editing.'
+ echohl None
+ return 1
+ endif
+ return 0
+endfunction
+
+function <SID>Finalised()
+ let savelinenum = line('.')
+ 1
+ call search('^ -- ')
+ if match(getline('.'), ' -- [[:alpha:]][[:alnum:].]')!=-1
+ let returnvalue = 1
+ else
+ let returnvalue = 0
+ endif
+ execute savelinenum
+ return returnvalue
+endfunction
+
+" These functions implement the menus
+function NewVersion()
+ " The new entry is unfinalised and shall be changed
+ amenu disable &Changelog.&New\ Version
+ amenu enable &Changelog.&Add\ Entry
+ amenu enable &Changelog.&Close\ Bug
+ amenu enable &Changelog.Set\ &Distribution
+ amenu enable &Changelog.Set\ &Urgency
+ amenu disable &Changelog.U&nfinalise
+ 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' doens't support key annotation (<c-a>) directly.
+ " Vim's manual recommends using ':exe' to use key annotation indirectly (backslash-escaping needed though).
+ exe "normal! \<c-a>"
+ call setline(1, substitute(getline(1), '-\$\$', '-', ''))
+ if exists('g:debchangelog_fold_enable')
+ foldopen
+ endif
+ call AddEntry()
+endfunction
+
+function AddEntry()
+ 1
+ call search('^ -- ')
+ .-2
+ call append('.', ' * ')
+ .+3
+ let warn=<SID>WarnIfNotUnfinalised()
+ .-2
+ if warn
+ echohl MoreMsg
+ call input('Hit ENTER')
+ echohl None
+ endif
+ startinsert!
+endfunction
+
+function CloseBug()
+ 1
+ call search('^ -- ')
+ let warn=<SID>WarnIfNotUnfinalised()
+ .-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 . ';', ''))
+endfunction
+
+function Urgency(urg)
+ call setline(1, substitute(getline(1), 'urgency=.*$', 'urgency=' . a:urg, ''))
+endfunction
+
+function <SID>UnfinaliseMenu()
+ " This means the entry shall be changed
+ amenu disable &Changelog.&New\ Version
+ amenu enable &Changelog.&Add\ Entry
+ amenu enable &Changelog.&Close\ Bug
+ amenu enable &Changelog.Set\ &Distribution
+ amenu enable &Changelog.Set\ &Urgency
+ amenu disable &Changelog.U&nfinalise
+ amenu enable &Changelog.&Finalise
+endfunction
+
+function Unfinalise()
+ call <SID>UnfinaliseMenu()
+ 1
+ call search('^ -- ')
+ call setline('.', ' -- ')
+endfunction
+
+function <SID>FinaliseMenu()
+ " This means the entry should not be changed anymore
+ amenu enable &Changelog.&New\ Version
+ amenu disable &Changelog.&Add\ Entry
+ amenu disable &Changelog.&Close\ Bug
+ amenu disable &Changelog.Set\ &Distribution
+ amenu disable &Changelog.Set\ &Urgency
+ amenu enable &Changelog.U&nfinalise
+ amenu disable &Changelog.&Finalise
+endfunction
+
+function Finalise()
+ call <SID>FinaliseMenu()
+ 1
+ call search('^ -- ')
+ call setline('.', ' -- ' . <SID>FullName() . ' <' . <SID>Email() . '> ' . <SID>Date())
+endfunction
+
+
+function <SID>MakeMenu()
+ amenu &Changelog.&New\ Version :call NewVersion()<CR>
+ amenu &Changelog.&Add\ Entry :call AddEntry()<CR>
+ amenu &Changelog.&Close\ Bug :call CloseBug()<CR>
+ menu &Changelog.-sep- <nul>
+
+ amenu &Changelog.Set\ &Distribution.&unstable :call Distribution("unstable")<CR>
+ amenu &Changelog.Set\ &Distribution.&frozen :call Distribution("frozen")<CR>
+ amenu &Changelog.Set\ &Distribution.&stable :call Distribution("stable")<CR>
+ menu &Changelog.Set\ &Distribution.-sep- <nul>
+ amenu &Changelog.Set\ &Distribution.frozen\ unstable :call Distribution("frozen unstable")<CR>
+ amenu &Changelog.Set\ &Distribution.stable\ unstable :call Distribution("stable unstable")<CR>
+ amenu &Changelog.Set\ &Distribution.stable\ frozen :call Distribution("stable frozen")<CR>
+ amenu &Changelog.Set\ &Distribution.stable\ frozen\ unstable :call Distribution("stable frozen unstable")<CR>
+
+ amenu &Changelog.Set\ &Urgency.&low :call Urgency("low")<CR>
+ amenu &Changelog.Set\ &Urgency.&medium :call Urgency("medium")<CR>
+ amenu &Changelog.Set\ &Urgency.&high :call Urgency("high")<CR>
+
+ menu &Changelog.-sep- <nul>
+ amenu &Changelog.U&nfinalise :call Unfinalise()<CR>
+ amenu &Changelog.&Finalise :call Finalise()<CR>
+
+ if <SID>Finalised()
+ call <SID>FinaliseMenu()
+ else
+ call <SID>UnfinaliseMenu()
+ endif
+endfunction
+
+augroup changelogMenu
+au BufEnter * if &filetype == "debchangelog" | call <SID>MakeMenu() | endif
+au BufLeave * if &filetype == "debchangelog" | silent! aunmenu &Changelog | endif
+augroup END
+
+" }}}
+" {{{1 folding
+
+" look for an author name in the [zonestart zoneend] lines searching backward
+function! s:getAuthor(zonestart, zoneend)
+ let linepos = a:zoneend
+ while linepos >= a:zonestart
+ let line = getline(linepos)
+ if line =~# '^ --'
+ return substitute(line, '^ --\s*\([^<]\+\)\s*.*', '\1', '')
+ endif
+ let linepos -= 1
+ endwhile
+ return '[unknown]'
+endfunction
+
+" Look for a package source name searching backward from the givenline and
+" returns it. Return the empty string if the package name can't be found
+function! DebGetPkgSrcName(lineno)
+ let lineidx = a:lineno
+ let pkgname = ''
+ while lineidx > 0
+ let curline = getline(lineidx)
+ if curline =~# '^\S'
+ let pkgname = matchlist(curline, '^\(\S\+\).*$')[1]
+ break
+ endif
+ let lineidx = lineidx - 1
+ endwhile
+ return pkgname
+endfunction
+
+function! DebChangelogFoldText()
+ if v:folddashes ==# '-' " changelog entry fold
+ return foldtext() . ' -- ' . s:getAuthor(v:foldstart, v:foldend) . ' '
+ endif
+ return foldtext()
+endfunction
+
+function! DebGetChangelogFold(lnum)
+ let line = getline(a:lnum)
+ if line =~# '^\w\+'
+ return '>1' " beginning of a changelog entry
+ endif
+ if line =~# '^\s\+\[.*\]'
+ return '>2' " beginning of an author-specific chunk
+ endif
+ if line =~# '^ --'
+ return '1'
+ endif
+ return '='
+endfunction
+
+if exists('g:debchangelog_fold_enable')
+ silent! foldopen! " unfold the entry the cursor is on (usually the first one)
+endif
+
+" }}}
+
+" {{{1 omnicompletion for Closes: #
+
+if !exists('g:debchangelog_listbugs_severities')
+ let g:debchangelog_listbugs_severities = 'critical,grave,serious,important,normal,minor,wishlist'
+endif
+
+fun! DebCompleteBugs(findstart, base)
+ if a:findstart
+ let line = getline('.')
+
+ " try to detect whether this is closes: or lp:
+ let g:debchangelog_complete_mode = 'debbugs'
+ let try_colidx = col('.') - 1
+ let colidx = -1 " default to no-completion-possible
+
+ while try_colidx > 0 && line[try_colidx - 1] =~# '\s\|\d\|#\|,\|:'
+ let try_colidx = try_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:'
+ let g:debchangelog_complete_mode = 'lp'
+ endif
+ break
+ endif
+ endwhile
+ return colidx
+ else " return matches:
+ let bug_lines = []
+ if g:debchangelog_complete_mode ==? 'lp'
+ if ! has('python')
+ echoerr 'vim must be built with Python support to use LP bug completion'
+ return
+ endif
+ let pkgsrc = DebGetPkgSrcName(line('.'))
+ python << EOF
+import vim
+try:
+ from launchpadlib.launchpad import Launchpad
+ from lazr.restfulclient.errors import HTTPError
+ # login anonymously
+ lp = Launchpad.login_anonymously('debchangelog.vim', 'production')
+ ubuntu = lp.distributions['ubuntu']
+ try:
+ sp = ubuntu.getSourcePackage(name=vim.eval('pkgsrc'))
+ status = ('New', 'Incomplete', 'Confirmed', 'Triaged',
+ 'In Progress', 'Fix Committed')
+ tasklist = sp.searchTasks(status=status, order_by='id')
+ liststr = '['
+ for task in tasklist:
+ bug = task.bug
+ liststr += "'#%d - %s'," % (bug.id, bug.title.replace('\'', '\'\''))
+ liststr += ']'
+ vim.command('silent let bug_lines = %s' % liststr.encode('utf-8'))
+ except HTTPError:
+ pass
+except ImportError:
+ vim.command('echoerr \'python-launchpadlib >= 1.5.4 needs to be installed to use Launchpad bug completion\'')
+EOF
+ else
+ if ! filereadable('/usr/sbin/apt-listbugs')
+ echoerr 'apt-listbugs not found, you should install it to use Closes bug completion'
+ return
+ endif
+ let pkgsrc = DebGetPkgSrcName(line('.'))
+ let listbugs_output = system('/usr/sbin/apt-listbugs -s ' . g:debchangelog_listbugs_severities . ' list ' . pkgsrc . ' | grep "^ #" 2> /dev/null')
+ let bug_lines = split(listbugs_output, '\n')
+ endif
+ let completions = []
+ 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
+ continue
+ endif
+ let completion = {}
+ let completion['word'] = parts[1]
+ let completion['menu'] = parts[2]
+ let completion['info'] = parts[0]
+ let completions += [completion]
+ endfor
+ return completions
+ endif
+endfun
+
+setlocal omnifunc=DebCompleteBugs
+
+" }}}
+
+" Restore the previous value of 'cpoptions'.
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: set foldmethod=marker:
diff --git a/runtime/ftplugin/debcontrol.vim b/runtime/ftplugin/debcontrol.vim
new file mode 100644
index 0000000..bb710e5
--- /dev/null
+++ b/runtime/ftplugin/debcontrol.vim
@@ -0,0 +1,70 @@
+" Vim filetype plugin file (GUI menu and folding)
+" Language: Debian control files
+" Maintainer: Debian Vim Maintainers
+" Former Maintainer: Pierre Habouzit <madcoder@debian.org>
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/ftplugin/debcontrol.vim
+
+" Do these settings once per buffer
+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')
+ setlocal foldmethod=expr
+ setlocal foldexpr=DebControlFold(v:lnum)
+ setlocal foldtext=DebControlFoldText()
+endif
+setlocal textwidth=0
+
+" Clean unloading
+let b:undo_ftplugin = 'setlocal tw< foldmethod< foldexpr< foldtext<'
+
+" }}}1
+
+" {{{1 folding
+
+function! s:getField(f, lnum)
+ let line = getline(a:lnum)
+ let fwdsteps = 0
+ while line !~ '^'.a:f.':'
+ let fwdsteps += 1
+ let line = getline(a:lnum + fwdsteps)
+ if line ==# ''
+ return 'unknown'
+ endif
+ endwhile
+ return substitute(line, '^'.a:f.': *', '', '')
+endfunction
+
+function! DebControlFoldText()
+ if v:folddashes ==# '-' " debcontrol entry fold
+ let type = substitute(getline(v:foldstart), ':.*', '', '')
+ if type ==# 'Source'
+ let ftext = substitute(foldtext(), ' *Source: *', ' ', '')
+ return ftext . ' -- ' . s:getField('Maintainer', v:foldstart) . ' '
+ endif
+ let arch = s:getField('Architecture', v:foldstart)
+ let ftext = substitute(foldtext(), ' *Package: *', ' [' . arch . '] ', '')
+ return ftext . ': ' . s:getField('Description', v:foldstart) . ' '
+ endif
+ return foldtext()
+endfunction
+
+function! DebControlFold(l)
+
+ " This is for not merging blank lines around folds to them
+ if getline(a:l) =~# '^Source:'
+ return '>1'
+ endif
+
+ if getline(a:l) =~# '^Package:'
+ return '>1'
+ endif
+
+ return '='
+endfunction
+
+" }}}1
diff --git a/runtime/ftplugin/denyhosts.vim b/runtime/ftplugin/denyhosts.vim
new file mode 100644
index 0000000..563bb8f
--- /dev/null
+++ b/runtime/ftplugin/denyhosts.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-12-04
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/desktop.vim b/runtime/ftplugin/desktop.vim
new file mode 100644
index 0000000..bd6fd70
--- /dev/null
+++ b/runtime/ftplugin/desktop.vim
@@ -0,0 +1,13 @@
+" Vim filetype plugin file
+" Language: XDG desktop entry
+" Maintainer: Eisuke Kawashima ( e.kawaschima+vim AT gmail.com )
+" Last Change: 2022-07-26
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = v:true
+
+setl comments=:#
+setl commentstring=#%s
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/runtime/ftplugin/dictconf.vim b/runtime/ftplugin/dictconf.vim
new file mode 100644
index 0000000..71a2b67
--- /dev/null
+++ b/runtime/ftplugin/dictconf.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: dict(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/dictdconf.vim b/runtime/ftplugin/dictdconf.vim
new file mode 100644
index 0000000..0ee4c9d
--- /dev/null
+++ b/runtime/ftplugin/dictdconf.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: dictd(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/diff.vim b/runtime/ftplugin/diff.vim
new file mode 100644
index 0000000..bf37d46
--- /dev/null
+++ b/runtime/ftplugin/diff.vim
@@ -0,0 +1,23 @@
+" Vim filetype plugin file
+" Language: Diff
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2021 Nov 14
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl modeline< commentstring<"
+
+" Don't use modelines in a diff, they apply to the diffed file
+setlocal nomodeline
+
+" If there are comments they start with #
+let &l:commentstring = "# %s"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Diff Files (*.diff)\t*.diff\nPatch Files (*.patch)\t*.h\nAll Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
diff --git a/runtime/ftplugin/dircolors.vim b/runtime/ftplugin/dircolors.vim
new file mode 100644
index 0000000..d07d1e3
--- /dev/null
+++ b/runtime/ftplugin/dircolors.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: dircolors(1) input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/docbk.vim b/runtime/ftplugin/docbk.vim
new file mode 100644
index 0000000..cbceb6b
--- /dev/null
+++ b/runtime/ftplugin/docbk.vim
@@ -0,0 +1,24 @@
+" Vim filetype plugin file
+" Language: DocBook
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2012-04-25
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+if !exists('b:docbk_type')
+ if expand('%:e') == 'sgml'
+ let b:docbk_type = 'sgml'
+ else
+ let b:docbk_type = 'xml'
+ endif
+endif
+
+if b:docbk_type == 'sgml'
+ runtime! ftplugin/sgml.vim ftplugin/sgml_*.vim ftplugin/sgml/*.vim
+else
+ runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+endif
+
+let b:undo_ftplugin = "unlet! b:docbk_type"
diff --git a/runtime/ftplugin/dockerfile.vim b/runtime/ftplugin/dockerfile.vim
new file mode 100644
index 0000000..2e3c447
--- /dev/null
+++ b/runtime/ftplugin/dockerfile.vim
@@ -0,0 +1,16 @@
+" Vim filetype plugin
+" Language: Dockerfile
+" Maintainer: Honza Pokorny <http://honza.ca>
+" Last Change: 2014 Aug 29
+
+" 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/dosbatch.vim b/runtime/ftplugin/dosbatch.vim
new file mode 100644
index 0000000..f02f26b
--- /dev/null
+++ b/runtime/ftplugin/dosbatch.vim
@@ -0,0 +1,48 @@
+" Vim filetype plugin file
+" Language: MS-DOS/Windows .bat files
+" Maintainer: Mike Williams <mrmrdubya@gmail.com>
+" Last Change: 12th February 2023
+"
+" Options Flags:
+" dosbatch_colons_comment - any value to treat :: as comment line
+
+" 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 s:cpo_save = &cpo
+set cpo&vim
+
+" BAT comment formatting
+setlocal comments=b:rem,b:@rem,b:REM,b:@REM
+if exists("dosbatch_colons_comment")
+ setlocal comments+=:::
+ setlocal commentstring=::\ %s
+else
+ setlocal commentstring=REM\ %s
+endif
+setlocal formatoptions-=t formatoptions+=rol
+
+" Lookup DOS keywords using Windows command help.
+if executable('help.exe')
+ if has('terminal')
+ setlocal keywordprg=:term\ help.exe
+ else
+ setlocal keywordprg=help.exe
+ endif
+endif
+
+" Define patterns for the browse file filter
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "DOS Batch Files (*.bat, *.cmd)\t*.bat;*.cmd\nAll Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setlocal comments< formatoptions< keywordprg<"
+ \ . "| unlet! b:browsefiler"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/dosini.vim b/runtime/ftplugin/dosini.vim
new file mode 100644
index 0000000..6a53dfd
--- /dev/null
+++ b/runtime/ftplugin/dosini.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: Configuration File (ini file) for MS-DOS/MS Windows
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:; commentstring=;\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/dtd.vim b/runtime/ftplugin/dtd.vim
new file mode 100644
index 0000000..a046118
--- /dev/null
+++ b/runtime/ftplugin/dtd.vim
@@ -0,0 +1,42 @@
+" Vim filetype plugin file
+" Language: dtd
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+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
+
+setlocal commentstring=<!--%s-->
+setlocal comments=s:<!--,m:\ \ \ \ \ ,e:-->
+
+setlocal formatoptions-=t
+if !exists("g:ft_dtd_autocomment") || (g:ft_dtd_autocomment == 1)
+ setlocal formatoptions+=croql
+endif
+
+if exists("loaded_matchit")
+ let b:match_words = '<!--:-->,<!:>'
+endif
+
+" Change the :browse e filter to primarily show Java-related files.
+if has("gui_win32")
+ let b:browsefilter="DTD Files (*.dtd)\t*.dtd\n" .
+ \ "XML Files (*.xml)\t*.xml\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal commentstring< comments< formatoptions<" .
+ \ " | unlet! b:matchwords b:browsefilter"
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/dtrace.vim b/runtime/ftplugin/dtrace.vim
new file mode 100644
index 0000000..9288097
--- /dev/null
+++ b/runtime/ftplugin/dtrace.vim
@@ -0,0 +1,40 @@
+" Language: D script as described in "Solaris Dynamic Tracing Guide",
+" http://docs.sun.com/app/docs/doc/817-6223
+" Last Change: 2008/03/20
+" Version: 1.2
+" Maintainer: Nicolas Weber <nicolasweber@gmx.de>
+
+" 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
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< cms< isk<"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/
+
+" dtrace uses /* */ comments. Set this explicitly, just in case the user
+" changed this (/*%s*/ is the default)
+setlocal commentstring=/*%s*/
+
+setlocal iskeyword+=@,$
+
+" When the matchit plugin is loaded, this makes the % command skip parens and
+" braces in comments.
+let b:match_words = &matchpairs
+let b:match_skip = 's:comment\|string\|character'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/dune.vim b/runtime/ftplugin/dune.vim
new file mode 100644
index 0000000..86c99c0
--- /dev/null
+++ b/runtime/ftplugin/dune.vim
@@ -0,0 +1,20 @@
+" Language: Dune buildsystem
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" Anton Kochkov <anton.kochkov@gmail.com>
+" URL: https://github.com/ocaml/vim-ocaml
+" Last Change:
+" 2018 Nov 3 - Added commentstring (Markus Mottl)
+" 2017 Sep 6 - Initial version (Etienne Millon)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin=1
+
+set lisp
+
+" Comment string
+setl commentstring=;\ %s
+setl comments=:;
+
+setl iskeyword+=#,?,.,/
diff --git a/runtime/ftplugin/eiffel.vim b/runtime/ftplugin/eiffel.vim
new file mode 100644
index 0000000..216fdde
--- /dev/null
+++ b/runtime/ftplugin/eiffel.vim
@@ -0,0 +1,96 @@
+" Vim filetype plugin
+" Language: Eiffel
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2010 Aug 29
+
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:--
+setlocal commentstring=--\ %s
+
+setlocal formatoptions-=t formatoptions+=croql
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Eiffel Source Files (*.e)\t*.e\n" .
+ \ "Eiffel Control Files (*.ecf, *.ace, *.xace)\t*.ecf;*.ace;*.xace\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ " Silly \%^ trick to match note at head of pair and in middle prevents
+ " 'g%' wrapping from 'note' to 'end'
+ let b:match_words = '\%^:' .
+ \ '\<\%(^note\|indexing\|class\|^obsolete\|inherit\|insert\|^create\|convert\|feature\|^invariant\)\>:' .
+ \ '^end\>,' .
+ \ '\<\%(do\|deferred\|external\|once\%(\s\+"\)\@!\|check\|debug\|if\|inspect\|from\|across\)\>:' .
+ \ '\%(\%(^\s\+\)\@<=\%(then\|until\|loop\)\|\%(then\|until\|loop\)\s\+[^ -]\|' .
+ \ '\<\%(ensure\%(\s\+then\)\=\|rescue\|_then\|elseif\|else\|when\|\s\@<=invariant\|_until\|_loop\|variant\|_as\|alias\)\>\):' .
+ \ '\s\@<=end\>'
+ let b:match_skip = 's:\<eiffel\%(Comment\|String\|Operator\)\>'
+ noremap [% <Nop>
+ noremap ]% <Nop>
+ vnoremap a% <Nop>
+endif
+
+let b:undo_ftplugin = "setl fo< com< cms<" .
+ \ "| unlet! b:browsefilter b:match_ignorecase b:match_words b:match_skip"
+
+if !exists("g:no_plugin_maps") && !exists("g:no_eiffel_maps")
+ function! s:DoMotion(pattern, count, flags) abort
+ normal! m'
+ for i in range(a:count)
+ call search(a:pattern, a:flags)
+ endfor
+ endfunction
+
+ let sections = '^\%(note\|indexing\|' .
+ \ '\%(\%(deferred\|expanded\|external\|frozen\)\s\+\)*class\|' .
+ \ 'obsolete\|inherit\|insert\|create\|convert\|feature\|' .
+ \ 'invariant\|end\)\>'
+
+ nnoremap <silent> <buffer> ]] :<C-U>call <SID>DoMotion(sections, v:count1, 'W')<CR>
+ xnoremap <silent> <buffer> ]] :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(sections, v:count1, 'W')<CR>
+ nnoremap <silent> <buffer> [[ :<C-U>call <SID>DoMotion(sections, v:count1, 'Wb')<CR>
+ xnoremap <silent> <buffer> [[ :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(sections, v:count1, 'Wb')<CR>
+
+ function! s:DoFeatureMotion(count, flags)
+ let view = winsaveview()
+ call cursor(1, 1)
+ let [features_start, _] = searchpos('^feature\>')
+ call search('^\s\+\a') " find the first feature
+ let spaces = indent(line('.'))
+ let [features_end, _] = searchpos('^\%(invariant\|note\|end\)\>')
+ call winrestview(view)
+ call s:DoMotion('\%>' . features_start . 'l\%<' . features_end . 'l^\s*\%' . (spaces + 1) . 'v\zs\a', a:count, a:flags)
+ endfunction
+
+ nnoremap <silent> <buffer> ]m :<C-U>call <SID>DoFeatureMotion(v:count1, 'W')<CR>
+ xnoremap <silent> <buffer> ]m :<C-U>exe "normal! gv"<Bar>call <SID>DoFeatureMotion(v:count1, 'W')<CR>
+ nnoremap <silent> <buffer> [m :<C-U>call <SID>DoFeatureMotion(v:count1, 'Wb')<CR>
+ xnoremap <silent> <buffer> [m :<C-U>exe "normal! gv"<Bar>call <SID>DoFeatureMotion(v:count1, 'Wb')<CR>
+
+ let comment_block_start = '^\%(\s\+--.*\n\)\@<!\s\+--'
+ let comment_block_end = '^\s\+--.*\n\%(\s\+--\)\@!'
+
+ nnoremap <silent> <buffer> ]- :<C-U>call <SID>DoMotion(comment_block_start, 1, 'W')<CR>
+ xnoremap <silent> <buffer> ]- :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(comment_block_start, 1, 'W')<CR>
+ nnoremap <silent> <buffer> [- :<C-U>call <SID>DoMotion(comment_block_end, 1, 'Wb')<CR>
+ xnoremap <silent> <buffer> [- :<C-U>exe "normal! gv"<Bar>call <SID>DoMotion(comment_block_end, 1, 'Wb')<CR>
+
+ let b:undo_ftplugin = b:undo_ftplugin .
+ \ "| silent! execute 'unmap <buffer> [[' | silent! execute 'unmap <buffer> ]]'" .
+ \ "| silent! execute 'unmap <buffer> [m' | silent! execute 'unmap <buffer> ]m'" .
+ \ "| silent! execute 'unmap <buffer> [-' | silent! execute 'unmap <buffer> ]-'"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8
diff --git a/runtime/ftplugin/elinks.vim b/runtime/ftplugin/elinks.vim
new file mode 100644
index 0000000..921f9c2
--- /dev/null
+++ b/runtime/ftplugin/elinks.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: elinks(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/elixir.vim b/runtime/ftplugin/elixir.vim
new file mode 100644
index 0000000..50f6367
--- /dev/null
+++ b/runtime/ftplugin/elixir.vim
@@ -0,0 +1,33 @@
+" Elixir filetype plugin
+" Language: Elixir
+" Maintainer: Mitchell Hanberg <vimNOSPAM@mitchellhanberg.com>
+" Last Change: 2022 Sep 20
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Matchit support
+if exists('loaded_matchit') && !exists('b:match_words')
+ let b:match_ignorecase = 0
+
+ let b:match_words = '\:\@<!\<\%(do\|fn\)\:\@!\>' .
+ \ ':' .
+ \ '\<\%(else\|catch\|after\|rescue\)\:\@!\>' .
+ \ ':' .
+ \ '\:\@<!\<end\>' .
+ \ ',{:},\[:\],(:)'
+endif
+
+setlocal shiftwidth=2 softtabstop=2 expandtab iskeyword+=!,?
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = 'setlocal sw< sts< et< isk< com< cms<'
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/elm.vim b/runtime/ftplugin/elm.vim
new file mode 100644
index 0000000..8c2de19
--- /dev/null
+++ b/runtime/ftplugin/elm.vim
@@ -0,0 +1,20 @@
+" Elm filetype plugin file
+" Language: Elm
+" Maintainer: Andreas Scharf <as@99n.de>
+" Latest Revision: 2022-04-25
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=s1fl:{-,mb:\ ,ex:-},:--
+setlocal commentstring=--\ %s
+
+let b:undo_ftplugin = "setl com< cms<"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/erlang.vim b/runtime/ftplugin/erlang.vim
new file mode 100644
index 0000000..31fa0c3
--- /dev/null
+++ b/runtime/ftplugin/erlang.vim
@@ -0,0 +1,105 @@
+" Vim ftplugin file
+" Language: Erlang (http://www.erlang.org)
+" Maintainer: Csaba Hoch <csaba.hoch@gmail.com>
+" Author: Oscar Hellström <oscar@oscarh.net>
+" Contributors: Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
+" Eduardo Lopez (http://github.com/tapichu)
+" Arvid Bjurklint (http://github.com/slarwise)
+" Last Update: 2021-Nov-22
+" License: Vim license
+" URL: https://github.com/vim-erlang/vim-erlang-runtime
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let &l:keywordprg = get(g:, 'erlang_keywordprg', 'erl -man')
+
+if get(g:, 'erlang_folding', 0)
+ setlocal foldmethod=expr
+ setlocal foldexpr=GetErlangFold(v:lnum)
+ setlocal foldtext=ErlangFoldText()
+endif
+
+setlocal comments=:%%%,:%%,:%
+setlocal commentstring=%%s
+
+setlocal formatoptions+=ro
+
+if get(g:, 'erlang_extend_path', 1)
+ " typical erlang.mk paths
+ let &l:path = join([
+ \ 'deps/*/include',
+ \ 'deps/*/src',
+ \ 'deps/*/test',
+ \ 'deps/*/apps/*/include',
+ \ 'deps/*/apps/*/src',
+ \ &g:path], ',')
+ " typical rebar3 paths
+ let &l:path = join([
+ \ 'apps/*/include',
+ \ 'apps/*/src',
+ \ '_build/default/lib/*/src',
+ \ '_build/default/*/include',
+ \ &l:path], ',')
+ " typical erlang paths
+ let &l:path = join(['include', 'src', 'test', &l:path], ',')
+
+ set wildignore+=*/.erlang.mk/*,*.beam
+endif
+
+setlocal suffixesadd=.erl,.hrl
+
+let &l:include = '^\s*-\%(include\|include_lib\)\s*("\zs\f*\ze")'
+let &l:define = '^\s*-\%(define\|record\|type\|opaque\)'
+
+let s:erlang_fun_begin = '^\a\w*(.*$'
+let s:erlang_fun_end = '^[^%]*\.\s*\(%.*\)\?$'
+
+if !exists('*GetErlangFold')
+ function GetErlangFold(lnum)
+ let lnum = a:lnum
+ let line = getline(lnum)
+
+ if line =~ s:erlang_fun_end
+ return '<1'
+ endif
+
+ if line =~ s:erlang_fun_begin && foldlevel(lnum - 1) == 1
+ return '1'
+ endif
+
+ if line =~ s:erlang_fun_begin
+ return '>1'
+ endif
+
+ return '='
+ endfunction
+endif
+
+if !exists('*ErlangFoldText')
+ function ErlangFoldText()
+ let line = getline(v:foldstart)
+ let foldlen = v:foldend - v:foldstart + 1
+ let lines = ' ' . foldlen . ' lines: ' . substitute(line, "[\ \t]*", '', '')
+ if foldlen < 10
+ let lines = ' ' . lines
+ endif
+ let retval = '+' . v:folddashes . lines
+
+ return retval
+ endfunction
+endif
+
+let b:undo_ftplugin = "setlocal keywordprg< foldmethod< foldexpr< foldtext<"
+ \ . " comments< commentstring< formatoptions< suffixesadd< include<"
+ \ . " define<"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: sw=2 et
diff --git a/runtime/ftplugin/eruby.vim b/runtime/ftplugin/eruby.vim
new file mode 100644
index 0000000..e67b00b
--- /dev/null
+++ b/runtime/ftplugin/eruby.vim
@@ -0,0 +1,132 @@
+" Vim filetype plugin
+" Language: eRuby
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Jun 28
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "All Files (*.*)\t*.*\n"
+let s:match_words = ""
+
+if !exists("g:eruby_default_subtype")
+ let g:eruby_default_subtype = "html"
+endif
+
+if &filetype =~ '^eruby\.'
+ let b:eruby_subtype = matchstr(&filetype,'^eruby\.\zs\w\+')
+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\|\.example\)\+$','',''),'\.\zs\w\+\%(\ze+\w\+\)\=$')
+ endif
+ if b:eruby_subtype == 'rhtml'
+ let b:eruby_subtype = 'html'
+ elseif b:eruby_subtype == 'rb'
+ let b:eruby_subtype = 'ruby'
+ elseif b:eruby_subtype == 'yml'
+ let b:eruby_subtype = 'yaml'
+ elseif b:eruby_subtype == 'js'
+ let b:eruby_subtype = 'javascript'
+ elseif b:eruby_subtype == 'txt'
+ " Conventional; not a real file type
+ let b:eruby_subtype = 'text'
+ elseif b:eruby_subtype == ''
+ let b:eruby_subtype = g:eruby_default_subtype
+ endif
+endif
+
+if exists("b:eruby_subtype") && b:eruby_subtype != '' && b:eruby_subtype !=? 'eruby'
+ exe "runtime! ftplugin/".b:eruby_subtype.".vim ftplugin/".b:eruby_subtype."_*.vim ftplugin/".b:eruby_subtype."/*.vim"
+else
+ runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+endif
+unlet! b:did_ftplugin
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+ unlet b:match_words
+endif
+
+let s:cfilemap = v:version >= 704 ? maparg('<Plug><cfile>', 'c', 0, 1) : {}
+if !get(s:cfilemap, 'buffer') || !s:cfilemap.expr || s:cfilemap.rhs =~# 'ErubyAtCursor()'
+ let s:cfilemap = {}
+endif
+if !has_key(s:cfilemap, 'rhs')
+ let s:cfilemap.rhs = "substitute(&l:inex =~# '\\<v:fname\\>' && len(expand('<cfile>')) ? eval(substitute(&l:inex, '\\<v:fname\\>', '\\=string(expand(\"<cfile>\"))', 'g')) : '', '^$', \"\\022\\006\",'')"
+endif
+let s:ctagmap = v:version >= 704 ? maparg('<Plug><ctag>', 'c', 0, 1) : {}
+if !get(s:ctagmap, 'buffer') || !s:ctagmap.expr || s:ctagmap.rhs =~# 'ErubyAtCursor()'
+ let s:ctagmap = {}
+endif
+let s:include = &l:include
+let s:path = &l:path
+let s:suffixesadd = &l:suffixesadd
+
+runtime! ftplugin/ruby.vim ftplugin/ruby_*.vim ftplugin/ruby/*.vim
+let b:did_ftplugin = 1
+
+" Combine the new set of values with those previously included.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin . " | " . s:undo_ftplugin
+endif
+if exists ("b:browsefilter")
+ let s:browsefilter = substitute(b:browsefilter,'\cAll Files (\*\.\*)\t\*\.\*\n','','') . s:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words . ',' . s:match_words
+endif
+
+if len(s:include)
+ let &l:include = s:include
+endif
+let &l:path = s:path . (s:path =~# ',$\|^$' ? '' : ',') . &l:path
+let &l:suffixesadd = s:suffixesadd . (s:suffixesadd =~# ',$\|^$' ? '' : ',') . &l:suffixesadd
+exe 'cmap <buffer><script><expr> <Plug><cfile> ErubyAtCursor() ? ' . maparg('<Plug><cfile>', 'c') . ' : ' . s:cfilemap.rhs
+exe 'cmap <buffer><script><expr> <Plug><ctag> ErubyAtCursor() ? ' . maparg('<Plug><ctag>', 'c') . ' : ' . get(s:ctagmap, 'rhs', '"\022\027"')
+unlet s:cfilemap s:ctagmap s:include s:path s:suffixesadd
+
+" Change the browse dialog on Win32 to show mainly eRuby-related files
+if has("gui_win32")
+ let b:browsefilter="eRuby Files (*.erb, *.rhtml)\t*.erb;*.rhtml\n" . s:browsefilter
+endif
+
+" Load the combined list of match_words for matchit.vim
+if exists("loaded_matchit")
+ let b:match_words = s:match_words
+endif
+
+" TODO: comments=
+setlocal commentstring=<%#%s%>
+
+let b:undo_ftplugin = "setl cms< " .
+ \ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+function! ErubyAtCursor() abort
+ let groups = map(['erubyBlock', 'erubyComment', 'erubyExpression', 'erubyOneLiner'], 'hlID(v:val)')
+ return !empty(filter(synstack(line('.'), col('.')), 'index(groups, v:val) >= 0'))
+endfunction
+
+" vim: nowrap sw=2 sts=2 ts=8:
diff --git a/runtime/ftplugin/eterm.vim b/runtime/ftplugin/eterm.vim
new file mode 100644
index 0000000..e2f88ef
--- /dev/null
+++ b/runtime/ftplugin/eterm.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: eterm(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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 include=^\\s*include
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/expect.vim b/runtime/ftplugin/expect.vim
new file mode 100644
index 0000000..a4c6af9
--- /dev/null
+++ b/runtime/ftplugin/expect.vim
@@ -0,0 +1,24 @@
+" Vim filetype plugin file
+" Language: Expect
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jul 16
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Syntax is similar to Tcl
+runtime! ftplugin/tcl.vim
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Expect Command Files (*.exp)\t*.exp\n" ..
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8
diff --git a/runtime/ftplugin/falcon.vim b/runtime/ftplugin/falcon.vim
new file mode 100644
index 0000000..affca38
--- /dev/null
+++ b/runtime/ftplugin/falcon.vim
@@ -0,0 +1,49 @@
+" Vim filetype plugin file
+" Language: Falcon
+" Author: Steven Oliver <oliver.steven@gmail.com>
+" Copyright: Copyright (c) 2009-2013 Steven Oliver
+" License: You may redistribute this under the same terms as Vim itself
+" Last Update: 2020 Oct 10
+" --------------------------------------------------------------------------
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal softtabstop=4 shiftwidth=4
+setlocal suffixesadd=.fal,.ftd
+
+" Matchit support
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+
+ let b:match_words =
+ \ '\<\%(if\|case\|while\|until\|for\|do\|class\)\>=\@!' .
+ \ ':' .
+ \ '\<\%(else\|elsif\|when\)\>' .
+ \ ':' .
+ \ '\<end\>' .
+ \ ',{:},\[:\],(:)'
+endif
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+" Windows allows you to filter the open file dialog
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "Falcon Source Files (*.fal *.ftd)\t*.fal;*.ftd\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setlocal tabstop< shiftwidth< expandtab< fileencoding<"
+ \ . " suffixesadd< comments<"
+ \ . "| unlet! b:browsefiler"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: set sw=4 sts=4 et tw=80 :
diff --git a/runtime/ftplugin/fennel.vim b/runtime/ftplugin/fennel.vim
new file mode 100644
index 0000000..2e50269
--- /dev/null
+++ b/runtime/ftplugin/fennel.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin file
+" Language: Fennel
+" Maintainer: Gregory Anders <greg[NOSPAM]@gpanders.com>
+" Last Update: 2022 Apr 20
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=;%s
+setlocal comments=:;;,:;
+setlocal formatoptions-=t
+setlocal suffixesadd=.fnl
+setlocal lisp
+setlocal lispwords=accumulate,collect,do,doto,each,eval-compiler,fn,for,icollect,lambda,let,macro,macros,match,match-try,when,while,with-open
+
+let b:undo_ftplugin = 'setlocal commentstring< comments< formatoptions< suffixesadd< lisp< lispwords<'
diff --git a/runtime/ftplugin/fetchmail.vim b/runtime/ftplugin/fetchmail.vim
new file mode 100644
index 0000000..032f661
--- /dev/null
+++ b/runtime/ftplugin/fetchmail.vim
@@ -0,0 +1,16 @@
+" Vim filetype plugin file
+" Language: fetchmail(1) RC File
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2022 Jun 30
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
diff --git a/runtime/ftplugin/fish.vim b/runtime/ftplugin/fish.vim
new file mode 100644
index 0000000..7acbf44
--- /dev/null
+++ b/runtime/ftplugin/fish.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin file
+" Language: fish
+" Maintainer: Nicholas Boyle (github.com/nickeb96)
+" Repository: https://github.com/nickeb96/fish.vim
+" Last Change: February 1, 2023
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal iskeyword=@,48-57,_,192-255,-,.
+setlocal comments=:#
+setlocal commentstring=#%s
+setlocal formatoptions+=crjq
diff --git a/runtime/ftplugin/flexwiki.vim b/runtime/ftplugin/flexwiki.vim
new file mode 100644
index 0000000..7513e66
--- /dev/null
+++ b/runtime/ftplugin/flexwiki.vim
@@ -0,0 +1,59 @@
+" Vim filetype plugin file
+" Language: FlexWiki, http://www.flexwiki.com/
+" Maintainer: George V. Reilly <george@reilly.org>
+" Home: http://www.georgevreilly.com/vim/flexwiki/
+" Other Home: http://www.vim.org/scripts/script.php?script_id=1529
+" Author: George V. Reilly
+" Filenames: *.wiki
+" Last Change: Wed Apr 26 11:00 PM 2006 P
+" Version: 0.3
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1 " Don't load another plugin for this buffer
+
+" Reset the following options to undo this plugin.
+let b:undo_ftplugin = "setl tw< wrap< lbr< et< ts< fenc< bomb< ff<"
+
+" Allow lines of unlimited length. Do NOT want automatic linebreaks,
+" as a newline starts a new paragraph in FlexWiki.
+setlocal textwidth=0
+" Wrap long lines, rather than using horizontal scrolling.
+setlocal wrap
+" Wrap at a character in 'breakat' rather than at last char on screen
+setlocal linebreak
+" Don't transform <TAB> characters into spaces, as they are significant
+" at the beginning of the line for numbered and bulleted lists.
+setlocal noexpandtab
+" 4-char tabstops, per flexwiki.el
+setlocal tabstop=4
+" Save *.wiki files in UTF-8
+setlocal fileencoding=utf-8
+" Add the UTF-8 Byte Order Mark to the beginning of the file
+setlocal bomb
+" Save <EOL>s as \n, not \r\n
+setlocal fileformat=unix
+
+if exists("g:flexwiki_maps")
+ " Move up and down by display lines, to account for screen wrapping
+ " of very long lines
+ nmap <buffer> <Up> gk
+ nmap <buffer> k gk
+ vmap <buffer> <Up> gk
+ vmap <buffer> k gk
+
+ nmap <buffer> <Down> gj
+ nmap <buffer> j gj
+ vmap <buffer> <Down> gj
+ vmap <buffer> j gj
+
+ " for earlier versions - for when 'wrap' is set
+ imap <buffer> <S-Down> <C-o>gj
+ imap <buffer> <S-Up> <C-o>gk
+ if v:version >= 700
+ imap <buffer> <Down> <C-o>gj
+ imap <buffer> <Up> <C-o>gk
+ endif
+endif
diff --git a/runtime/ftplugin/fortran.vim b/runtime/ftplugin/fortran.vim
new file mode 100644
index 0000000..8f5b243
--- /dev/null
+++ b/runtime/ftplugin/fortran.vim
@@ -0,0 +1,142 @@
+" Vim settings file
+" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, 77, 66)
+" Version: (v53) 2021 April 06 (updated 2022 May 22)
+" Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www2.unb.ca/~ajit/>
+" Usage: For instructions, do :help fortran-plugin from Vim
+" Credits:
+" Version 0.1 was created in September 2000 by Ajit Thakkar.
+" Since then, useful suggestions and contributions have been made, in order, by:
+" Stefano Zacchiroli, Hendrik Merx, Ben Fritz, David Barnett, Eisuke Kawashima,
+" Doug Kearns, and Fritz Reese.
+
+" Only do these settings when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cposet=&cpoptions
+set cpoptions&vim
+
+" Don't do other file type settings for this buffer
+let b:did_ftplugin = 1
+
+" Determine whether this is a fixed or free format source file
+" if this hasn't been done yet using the priority:
+" buffer-local value
+" > global value
+" > file extension as in Intel ifort, gcc (gfortran), NAG, Pathscale, and Cray compilers
+if !exists("b:fortran_fixed_source")
+ if exists("fortran_free_source")
+ " User guarantees free source form
+ let b:fortran_fixed_source = 0
+ elseif exists("fortran_fixed_source")
+ " User guarantees fixed source form
+ let b:fortran_fixed_source = 1
+ elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$'
+ " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers
+ let b:fortran_fixed_source = 0
+ elseif expand("%:e") =~? '^\%(f\|f77\|for\)$'
+ " Fixed-form file extension defaults
+ let b:fortran_fixed_source = 1
+ else
+ " Modern fortran still allows both fixed and free source form
+ " Assume fixed source form unless signs of free source form
+ " are detected in the first five columns of the first s:lmax lines.
+ " Detection becomes more accurate and time-consuming if more lines
+ " are checked. Increase the limit below if you keep lots of comments at
+ " the very top of each file and you have a fast computer.
+ let s:lmax = 500
+ if ( s:lmax > line("$") )
+ let s:lmax = line("$")
+ endif
+ let b:fortran_fixed_source = 1
+ let s:ln=1
+ while s:ln <= s:lmax
+ let s:test = strpart(getline(s:ln),0,5)
+ if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
+ let b:fortran_fixed_source = 0
+ break
+ endif
+ let s:ln = s:ln + 1
+ endwhile
+ unlet! s:lmax s:ln s:test
+ endif
+endif
+
+" Set comments and textwidth according to source type
+if (b:fortran_fixed_source == 1)
+ setlocal comments=:!,:*,:C
+ " Fixed format requires a textwidth of 72 for code,
+ " but some vendor extensions allow longer lines
+ if exists("fortran_extended_line_length")
+ setlocal tw=132
+ elseif exists("fortran_cardimage_line_length")
+ setlocal tw=80
+ else
+ setlocal tw=72
+ " If you need to add "&" on continued lines so that the code is
+ " compatible with both free and fixed format, then you should do so
+ " in column 73 and uncomment the next line
+ " setlocal tw=73
+ endif
+else
+ setlocal comments=:!
+ " Free format allows a textwidth of 132
+ setlocal tw=132
+endif
+
+" Set commentstring for foldmethod=marker
+setlocal cms=!%s
+
+" Tabs are not a good idea in Fortran so the default is to expand tabs
+if !exists("fortran_have_tabs")
+ setlocal expandtab
+endif
+
+" Set 'formatoptions' to break text lines
+setlocal fo+=t
+
+setlocal include=^\\c#\\=\\s*include\\s\\+
+setlocal suffixesadd+=.f08,.f03,.f95,.f90,.for,.f,.F,.f77,.ftn,.fpp
+
+" Define patterns for the matchit plugin
+if !exists("b:match_words")
+ let s:notend = '\%(\<end\s\+\)\@<!'
+ let s:notselect = '\%(\<select\s\+\)\@<!'
+ let s:notelse = '\%(\<end\s\+\|\<else\s\+\)\@<!'
+ let s:notprocedure = '\%(\s\+procedure\>\)\@!'
+ let s:nothash = '\%(^\s*#\s*\)\@<!'
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ '(:),' .
+ \ '\<select\s*case\>:' . s:notselect. '\<case\>:\<end\s*select\>,' .
+ \ s:notelse . '\<if\s*(.\+)\s*then\>:' .
+ \ s:nothash . '\<else\s*\%(if\s*(.\+)\s*then\)\=\>:' . s:nothash . '\<end\s*if\>,'.
+ \ 'do\s\+\(\d\+\):\%(^\s*\)\@<=\1\s,'.
+ \ s:notend . '\<do\>:\<end\s*do\>,'.
+ \ s:notelse . '\<where\>:\<elsewhere\>:\<end\s*where\>,'.
+ \ s:notend . '\<type\s*[^(]:\<end\s*type\>,'.
+ \ s:notend . '\<forall\>:\<end\s*forall\>,'.
+ \ s:notend . '\<associate\>:\<end\s*associate\>,'.
+ \ s:notend . '\<enum\>:\<end\s*enum\>,'.
+ \ s:notend . '\<interface\>:\<end\s*interface\>,'.
+ \ s:notend . '\<subroutine\>:\<end\s*subroutine\>,'.
+ \ s:notend . '\<function\>:\<end\s*function\>,'.
+ \ s:notend . '\<module\>' . s:notprocedure . ':\<end\s*module\>,'.
+ \ s:notend . '\<program\>:\<end\s*program\>,'.
+ \ '\%(^\s*\)\@<=#\s*if\%(def\|ndef\)\=\>:\%(^\s*\)\@<=#\s*\%(elif\|else\)\>:\%(^\s*\)\@<=#\s*endif\>'
+endif
+
+" File filters for :browse e
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Fortran Files (*.f;*.for;*.f77;*.f90;*.f95;*.f03;*.f08;*.fpp;*.ftn)\t*.f;*.for;*.f77;*.f90;*.f95;*.f03;*.f08;*.fpp;*.ftn\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl fo< com< tw< cms< et< inc< sua<"
+ \ . "| unlet! b:match_ignorecase b:match_words b:browsefilter"
+
+let &cpoptions=s:cposet
+unlet s:cposet
+
+" vim:sw=2
diff --git a/runtime/ftplugin/fpcmake.vim b/runtime/ftplugin/fpcmake.vim
new file mode 100644
index 0000000..8d95083
--- /dev/null
+++ b/runtime/ftplugin/fpcmake.vim
@@ -0,0 +1,25 @@
+" Vim filetype plugin file
+" Language: Free Pascal Makefile Generator
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Apr 23
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+runtime! ftplugin/make.vim
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Free Pascal Makefile Definition Files (*.fpc)\t*.fpc\n" ..
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = b:undo_ftplugin .. " | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/framescript.vim b/runtime/ftplugin/framescript.vim
new file mode 100644
index 0000000..66802ca
--- /dev/null
+++ b/runtime/ftplugin/framescript.vim
@@ -0,0 +1,30 @@
+" Vim ftplugin file
+" Language: FrameScript
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-19
+
+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< fo< inc< | unlet! b:matchwords"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:// commentstring=/*\ %s\ */
+setlocal formatoptions-=t formatoptions+=croql
+setlocal include=^\\s*<#Include
+
+if exists("loaded_matchit")
+ let s:not_end = '\c\%(\<End\)\@<!'
+ let b:match_words =
+ \ s:not_end . '\<If\>:\c\<ElseIf\>:\c\<Else\>:\c\<EndIf\>,' .
+ \ s:not_end . '\<Loop\>:\c\<EndLoop\>' .
+ \ s:not_end . '\<Sub\>:\c\<EndSub\>'
+ unlet s:not_end
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/freebasic.vim b/runtime/ftplugin/freebasic.vim
new file mode 100644
index 0000000..1680e84
--- /dev/null
+++ b/runtime/ftplugin/freebasic.vim
@@ -0,0 +1,81 @@
+" Vim filetype plugin file
+" Language: FreeBASIC
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jun 24
+
+" Setup {{{1
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+runtime! ftplugin/basic.vim
+
+let s:dialect = freebasic#GetDialect()
+
+" Comments {{{1
+" add ''comments before 'comments
+let &l:comments = "sO:*\ -,mO:*\ \ ,exO:*/,s1:/',mb:',ex:'/,:''," .. &l:comments
+
+" Match words {{{1
+if exists("loaded_matchit")
+ let s:line_start = '\%(^\s*\)\@<='
+ let s:not_end = '\%(end\s\+\)\@<!'
+
+ let b:match_words ..= ','
+
+ if s:dialect == 'fb'
+ let b:match_words ..= s:not_end .. '\<constructor\>:\<end\s\+constructor\>,' ..
+ \ s:not_end .. '\<destructor\>:\<end\s\+destructor\>,' ..
+ \ s:not_end .. '\<property\>:\<end\s\+property\>,' ..
+ \ s:not_end .. '\<operator\>:\<end\s\+operator\>,' ..
+ \ s:not_end .. '\<extern\%(\s\+"\)\@=:\<end\s\+extern\>,'
+ endif
+
+ if s:dialect == 'fb' || s:dialect == 'deprecated'
+ let b:match_words ..= s:not_end .. '\<scope\>:\<end\s\+scope\>,'
+ endif
+
+ if s:dialect == 'qb'
+ let b:match_words ..= s:not_end .. '\<__asm\>:\<end\s\+__asm\>,' ..
+ \ s:not_end .. '\<__union\>:\<end\s\+__union\>,' ..
+ \ s:not_end .. '\<__with\>:\<end\s\+__with\>,'
+ else
+ let b:match_words ..= s:not_end .. '\<asm\>:\<end\s\+asm\>,' ..
+ \ s:not_end .. '\<namespace\>:\<end\s\+namespace\>,' ..
+ \ s:not_end .. '\<union\>:\<end\s\+union\>,' ..
+ \ s:not_end .. '\<with\>:\<end\s\+with\>,'
+ endif
+
+ let b:match_words ..= s:not_end .. '\<enum\>:\<end\s\+enum\>,' ..
+ \ s:line_start .. '#\s*\%(if\|ifdef\|ifndef\)\>:' ..
+ \ s:line_start .. '#\s*\%(else\|elseif\)\>:' ..
+ \ s:line_start .. '#\s*endif\>,' ..
+ \ s:line_start .. '#\s*macro\>:' .. s:line_start .. '#\s*endmacro\>,' ..
+ \ "/':'/"
+
+ " skip "function = <retval>" and "continue { do | for | while }"
+ if s:dialect == "qb"
+ let s:continue = "__continue"
+ else
+ let s:continue = "continue"
+ endif
+ let b:match_skip ..= ' || strpart(getline("."), col(".") - 1) =~? "^\\<function\\s\\+="' ..
+ \ ' || strpart(getline("."), 0, col(".") ) =~? "\\<' .. s:continue .. '\\s\\+"'
+
+ unlet s:not_end s:line_start
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && exists("b:basic_set_browsefilter")
+ let b:browsefilter = "FreeBASIC Source Files (*.bas)\t*.bas\n" ..
+ \ "FreeBASIC Header Files (*.bi)\t*.bi\n" ..
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+" Cleanup {{{1
+let &cpo = s:cpo_save
+unlet s:cpo_save s:dialect
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/ftplugin/fstab.vim b/runtime/ftplugin/fstab.vim
new file mode 100644
index 0000000..9980532
--- /dev/null
+++ b/runtime/ftplugin/fstab.vim
@@ -0,0 +1,19 @@
+" Vim ftplugin file
+" Language: fstab file
+" Maintainer: Radu Dineiu <radu.dineiu@gmail.com>
+" URL: https://raw.github.com/rid9/vim-fstab/master/ftplugin/fstab.vim
+" Last Change: 2021 Jan 02
+" Version: 1.0
+"
+" Credits:
+" Subhaditya Nath <sn03.general@gmail.com>
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=#%s
+let b:undo_ftplugin = "setlocal commentstring<"
+
+" vim: ts=8 ft=vim
diff --git a/runtime/ftplugin/fvwm.vim b/runtime/ftplugin/fvwm.vim
new file mode 100644
index 0000000..89e1a83
--- /dev/null
+++ b/runtime/ftplugin/fvwm.vim
@@ -0,0 +1,14 @@
+" Created : Tue 09 May 2006 02:07:31 PM CDT
+" Modified : Tue 09 May 2006 02:07:31 PM CDT
+" Author : Gautam Iyer <gi1242@users.sourceforge.net>
+" Description : ftplugin for fvwm config files
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
diff --git a/runtime/ftplugin/gdb.vim b/runtime/ftplugin/gdb.vim
new file mode 100644
index 0000000..2473b13
--- /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/gdscript.vim b/runtime/ftplugin/gdscript.vim
new file mode 100644
index 0000000..93519d8
--- /dev/null
+++ b/runtime/ftplugin/gdscript.vim
@@ -0,0 +1,59 @@
+vim9script
+
+# Vim filetype plugin file
+# Language: gdscript (Godot game engine scripting language)
+# Maintainer: Maxim Kim <habamax@gmail.com>
+# Website: https://github.com/habamax/vim-gdscript
+
+if exists("b:did_ftplugin") | finish | endif
+
+b:did_ftplugin = 1
+b:undo_ftplugin = 'setlocal cinkeys<'
+ \ .. '| setlocal indentkeys<'
+ \ .. '| setlocal commentstring<'
+ \ .. '| setlocal suffixesadd<'
+ \ .. '| setlocal foldexpr<'
+ \ .. '| setlocal foldignore<'
+
+setlocal cinkeys-=0#
+setlocal indentkeys-=0#
+setlocal suffixesadd=.gd
+setlocal commentstring=#\ %s
+setlocal foldignore=
+setlocal foldexpr=GDScriptFoldLevel()
+
+
+def GDScriptFoldLevel(): string
+ var line = getline(v:lnum)
+ if line =~? '^\s*$'
+ return "-1"
+ endif
+
+ var sw = shiftwidth()
+ var indent = indent(v:lnum) / sw
+ var indent_next = indent(nextnonblank(v:lnum + 1)) / sw
+
+ if indent_next > indent && line =~ ':\s*$'
+ return $">{indent_next}"
+ else
+ return $"{indent}"
+ endif
+enddef
+
+
+if !exists("g:no_plugin_maps")
+ # Next/Previous section
+ def NextSection(back: bool, cnt: number)
+ for n in range(cnt)
+ search('^\s*func\s', back ? 'bW' : 'W')
+ endfor
+ enddef
+
+ nnoremap <silent><buffer> ]] <scriptcmd>NextSection(false, v:count1)<CR>
+ nnoremap <silent><buffer> [[ <scriptcmd>NextSection(true, v:count1)<CR>
+ xmap <buffer><expr> ]] $'<C-\><C-N>{v:count1}]]m>gv'
+ xmap <buffer><expr> [[ $'<C-\><C-N>{v:count1}[[m>gv'
+ b:undo_ftplugin ..=
+ \ " | silent exe 'unmap <buffer> [['"
+ \ .. " | silent exe 'unmap <buffer> ]]'"
+endif
diff --git a/runtime/ftplugin/gdshader.vim b/runtime/ftplugin/gdshader.vim
new file mode 100644
index 0000000..809a005
--- /dev/null
+++ b/runtime/ftplugin/gdshader.vim
@@ -0,0 +1,13 @@
+vim9script
+
+# Vim filetype plugin file
+# Language: Godot shading language
+# Maintainer: Maxim Kim <habamax@gmail.com>
+# Website: https://github.com/habamax/vim-gdscript
+
+if exists("b:did_ftplugin") | finish | endif
+b:did_ftplugin = 1
+
+b:undo_ftplugin = 'setlocal suffixesadd<'
+
+setlocal suffixesadd=.gdshader
diff --git a/runtime/ftplugin/gitattributes.vim b/runtime/ftplugin/gitattributes.vim
new file mode 100644
index 0000000..2025d00
--- /dev/null
+++ b/runtime/ftplugin/gitattributes.vim
@@ -0,0 +1,13 @@
+" Vim filetype plugin
+" Language: git attributes
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 08
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/runtime/ftplugin/gitcommit.vim b/runtime/ftplugin/gitcommit.vim
new file mode 100644
index 0000000..9342799
--- /dev/null
+++ b/runtime/ftplugin/gitcommit.vim
@@ -0,0 +1,57 @@
+" Vim filetype plugin
+" Language: git commit file
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2022 Jan 05
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+setlocal nomodeline tabstop=8 formatoptions+=tl textwidth=72
+setlocal formatoptions-=c formatoptions-=r formatoptions-=o formatoptions-=q formatoptions+=n
+setlocal formatlistpat+=\\\|^\\s*[-*+]\\s\\+
+setlocal include=^+++
+setlocal includeexpr=substitute(v:fname,'^[bi]/','','')
+
+let b:undo_ftplugin = 'setl modeline< tabstop< formatoptions< tw< com< cms< formatlistpat< inc< inex<'
+
+let s:l = search('\C\m^[#;@!$%^&|:] -\{24,\} >8 -\{24,\}$', 'cnW', '', 100)
+let &l:comments = ':' . (matchstr(getline(s:l ? s:l : '$'), '^[#;@!$%^&|:]\S\@!') . '#')[0]
+let &l:commentstring = &l:comments[1] . ' %s'
+unlet s:l
+
+if exists("g:no_gitcommit_commands")
+ finish
+endif
+
+command! -bang -bar -buffer -complete=custom,s:diffcomplete -nargs=* DiffGitCached :call s:gitdiffcached(<bang>0, <f-args>)
+
+let b:undo_ftplugin = b:undo_ftplugin . "|delc DiffGitCached"
+
+function! s:diffcomplete(A, L, P) abort
+ let args = ""
+ if a:P <= match(a:L." -- "," -- ")+3
+ let args = args . "-p\n--stat\n--shortstat\n--summary\n--patch-with-stat\n--no-renames\n-B\n-M\n-C\n"
+ end
+ if a:A !~ '^-' && !empty(getftype('.git'))
+ let args = args."\n".system("git diff --cached --name-only")
+ endif
+ return args
+endfunction
+
+function! s:gitdiffcached(bang, ...) abort
+ let name = tempname()
+ if a:0
+ let extra = join(map(copy(a:000), 'shellescape(v:val)'))
+ else
+ let extra = "-p --stat=".&columns
+ endif
+ call system("git diff --cached --no-color --no-ext-diff ".extra." > ".shellescape(name))
+ exe "pedit " . fnameescape(name)
+ wincmd P
+ command! -bang -bar -buffer -complete=custom,s:diffcomplete -nargs=* DiffGitCached :call s:gitdiffcached(<bang>0, <f-args>)
+ setlocal buftype=nowrite nobuflisted noswapfile nomodifiable filetype=git
+endfunction
diff --git a/runtime/ftplugin/gitconfig.vim b/runtime/ftplugin/gitconfig.vim
new file mode 100644
index 0000000..833b8b1
--- /dev/null
+++ b/runtime/ftplugin/gitconfig.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin
+" Language: git config file
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2009 Dec 24
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t formatoptions+=croql
+setlocal comments=:#,:; commentstring=;\ %s
+
+let b:undo_ftplugin = "setl fo< com< cms<"
diff --git a/runtime/ftplugin/gitignore.vim b/runtime/ftplugin/gitignore.vim
new file mode 100644
index 0000000..3502dd2
--- /dev/null
+++ b/runtime/ftplugin/gitignore.vim
@@ -0,0 +1,13 @@
+" Vim filetype plugin
+" Language: git ignore
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 10
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/runtime/ftplugin/gitrebase.vim b/runtime/ftplugin/gitrebase.vim
new file mode 100644
index 0000000..143f86a
--- /dev/null
+++ b/runtime/ftplugin/gitrebase.vim
@@ -0,0 +1,45 @@
+" Vim filetype plugin
+" Language: git rebase --interactive
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2022 Jan 05
+
+" Only do this when not done yet for this buffer
+if (exists("b:did_ftplugin"))
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+let &l:comments = ':' . (matchstr(getline('$'), '^[#;@!$%^&|:]\S\@!') . '#')[0]
+let &l:commentstring = &l:comments[1] . ' %s'
+setlocal formatoptions-=t
+setlocal nomodeline
+let b:undo_ftplugin = "setl com< cms< fo< ml<"
+
+function! s:choose(word) abort
+ s/^\(\w\+\>\)\=\(\s*\)\ze\x\{4,40\}\>/\=(strlen(submatch(1)) == 1 ? a:word[0] : a:word) . substitute(submatch(2),'^$',' ','')/e
+endfunction
+
+function! s:cycle(count) abort
+ let words = ['pick', 'edit', 'fixup', 'squash', 'reword', 'drop']
+ let index = index(map(copy(words), 'v:val[0]'), getline('.')[0])
+ let index = ((index < 0 ? 0 : index) + 10000 * len(words) + a:count) % len(words)
+ call s:choose(words[index])
+endfunction
+
+command! -buffer -bar -range Pick :<line1>,<line2>call s:choose('pick')
+command! -buffer -bar -range Squash :<line1>,<line2>call s:choose('squash')
+command! -buffer -bar -range Edit :<line1>,<line2>call s:choose('edit')
+command! -buffer -bar -range Reword :<line1>,<line2>call s:choose('reword')
+command! -buffer -bar -range Fixup :<line1>,<line2>call s:choose('fixup')
+command! -buffer -bar -range Drop :<line1>,<line2>call s:choose('drop')
+command! -buffer -count=1 -bar -bang Cycle call s:cycle(<bang>0 ? -<count> : <count>)
+
+if exists("g:no_plugin_maps") || exists("g:no_gitrebase_maps")
+ finish
+endif
+
+nnoremap <buffer> <silent> <C-A> :<C-U><C-R>=v:count1<CR>Cycle<CR>
+nnoremap <buffer> <silent> <C-X> :<C-U><C-R>=v:count1<CR>Cycle!<CR>
+
+let b:undo_ftplugin = b:undo_ftplugin . "|exe 'nunmap <buffer> <C-A>'|exe 'nunmap <buffer> <C-X>'"
diff --git a/runtime/ftplugin/gitsendemail.vim b/runtime/ftplugin/gitsendemail.vim
new file mode 100644
index 0000000..8fb436e
--- /dev/null
+++ b/runtime/ftplugin/gitsendemail.vim
@@ -0,0 +1,6 @@
+" Vim filetype plugin
+" Language: git send-email message
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2009 Dec 24
+
+runtime! ftplugin/mail.vim
diff --git a/runtime/ftplugin/go.vim b/runtime/ftplugin/go.vim
new file mode 100644
index 0000000..61dc1a1
--- /dev/null
+++ b/runtime/ftplugin/go.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin file
+" Language: Go
+" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
+" Last Change: 2014 Aug 16
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t
+
+setlocal comments=s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = 'setl fo< com< cms<'
+
+" vim: sw=2 sts=2 et
diff --git a/runtime/ftplugin/gpg.vim b/runtime/ftplugin/gpg.vim
new file mode 100644
index 0000000..3f890e5
--- /dev/null
+++ b/runtime/ftplugin/gpg.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: gpg(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/gprof.vim b/runtime/ftplugin/gprof.vim
new file mode 100644
index 0000000..d8974bc
--- /dev/null
+++ b/runtime/ftplugin/gprof.vim
@@ -0,0 +1,36 @@
+" Language: gprof
+" Maintainer: Dominique Pelle <dominique.pelle@gmail.com>
+" Contributors: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Sep 19
+
+" When cursor is on one line of the gprof call graph,
+" calling this function jumps to this function in the call graph.
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin=1
+
+func! <SID>GprofJumpToFunctionIndex()
+ let l:line = getline('.')
+ if l:line =~ '[\d\+\]$'
+ " We're in a line in the call graph.
+ norm! $y%
+ call search('^' . escape(@", '[]'), 'sw')
+ norm! zz
+ elseif l:line =~ '^\(\s*[0-9\.]\+\)\{3}\s\+'
+ " We're in line in the flat profile.
+ norm! 55|eby$
+ call search('^\[\d\+\].*\d\s\+' . escape(@", '[]*.') . '\>', 'sW')
+ norm! zz
+ endif
+endfunc
+
+if !exists("no_plugin_maps") && !exists("no_gprof_maps")
+ " Pressing <C-]> on a line in the gprof flat profile or in
+ " the call graph, jumps to the corresponding function inside
+ " the flat profile.
+ map <buffer> <silent> <C-]> :call <SID>GprofJumpToFunctionIndex()<CR>
+ let b:undo_ftplugin = "silent! unmap <buffer> <C-]>"
+endif
+
+" vim:sw=2 fdm=indent
diff --git a/runtime/ftplugin/groovy.vim b/runtime/ftplugin/groovy.vim
new file mode 100644
index 0000000..cc7d6e3
--- /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
new file mode 100644
index 0000000..e6b76ba
--- /dev/null
+++ b/runtime/ftplugin/group.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: group(5) user group file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments= commentstring= formatoptions-=tcroq formatoptions+=l
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/grub.vim b/runtime/ftplugin/grub.vim
new file mode 100644
index 0000000..cd6e113
--- /dev/null
+++ b/runtime/ftplugin/grub.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: grub(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/gyp.vim b/runtime/ftplugin/gyp.vim
new file mode 100644
index 0000000..becfcad
--- /dev/null
+++ b/runtime/ftplugin/gyp.vim
@@ -0,0 +1,14 @@
+" Vim filetype plugin
+" Language: GYP
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 27
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t
+setlocal commentstring=#\ %s comments=b:#,fb:-
+
+let b:undo_ftplugin = 'setlocal fo< cms< com<'
diff --git a/runtime/ftplugin/haml.vim b/runtime/ftplugin/haml.vim
new file mode 100644
index 0000000..6f30169
--- /dev/null
+++ b/runtime/ftplugin/haml.vim
@@ -0,0 +1,71 @@
+" Vim filetype plugin
+" Language: Haml
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2019 Dec 05
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "All Files (*.*)\t*.*\n"
+let s:match_words = ""
+
+runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+unlet! b:did_ftplugin
+set matchpairs-=<:>
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+ unlet b:match_words
+endif
+
+runtime! ftplugin/ruby.vim ftplugin/ruby_*.vim ftplugin/ruby/*.vim
+let b:did_ftplugin = 1
+
+let &l:define .= empty(&l:define ? '' : '\|') . '^\s*\%(%\w*\)\=\%(\.[[:alnum:]_-]\+\)*#'
+
+" Combine the new set of values with those previously included.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin . " | " . s:undo_ftplugin
+endif
+if exists ("b:browsefilter")
+ let s:browsefilter = substitute(b:browsefilter,'\cAll Files (\*\.\*)\t\*\.\*\n','','') . s:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words . ',' . s:match_words
+endif
+
+" Change the browse dialog on Win32 to show mainly Haml-related files
+if has("gui_win32")
+ let b:browsefilter="Haml Files (*.haml)\t*.haml\nSass Files (*.sass)\t*.sass\n" . s:browsefilter
+endif
+
+" Load the combined list of match_words for matchit.vim
+if exists("loaded_matchit")
+ let b:match_words = s:match_words
+endif
+
+setlocal comments= commentstring=-#\ %s
+
+let b:undo_ftplugin = "setl def< cms< com< "
+ \ " | unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim:set sw=2:
diff --git a/runtime/ftplugin/hamster.vim b/runtime/ftplugin/hamster.vim
new file mode 100644
index 0000000..5446e72
--- /dev/null
+++ b/runtime/ftplugin/hamster.vim
@@ -0,0 +1,65 @@
+" Vim filetype plugin
+" Language: Hamster Script
+" Version: 2.0.6.0
+" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
+" Last Change: 2021 Jan 19
+
+" 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 s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl fo< com< tw< commentstring<"
+ \ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Use the # sign for comments
+setlocal comments=:#
+
+" Format comments to be up to 78 characters long
+if &tw == 0
+ setlocal tw=78
+endif
+
+" Comments start with a double quote
+setlocal commentstring=#%s
+
+" Move around functions.
+noremap <silent><buffer> [[ :call search('^\s*sub\>', "bW")<CR>
+noremap <silent><buffer> ]] :call search('^\s*sub\>', "W")<CR>
+noremap <silent><buffer> [] :call search('^\s*endsub\>', "bW")<CR>
+noremap <silent><buffer> ][ :call search('^\s*endsub\>', "W")<CR>
+
+" Move around comments
+noremap <silent><buffer> ]# :call search('^\s*#\@!', "W")<CR>
+noremap <silent><buffer> [# :call search('^\s*#\@!', "bW")<CR>
+
+" Let the matchit plugin know what items can be matched.
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words =
+ \ '\<sub\>:\<return\>:\<endsub\>,' .
+ \ '\<do\|while\|repeat\|for\>:\<break\>:\<continue\>:\<loop\|endwhile\|until\|endfor\>,' .
+ \ '\<if\>:\<else\%[if]\>:\<endif\>'
+
+ " Ignore ":syntax region" commands, the 'end' argument clobbers if-endif
+ " let b:match_skip = 'getline(".") =~ "^\\s*sy\\%[ntax]\\s\\+region" ||
+ " \ synIDattr(synID(line("."),col("."),1),"name") =~? "comment\\|string"'
+endif
+
+setlocal ignorecase
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" Disabled, 'cpo' is a global option.
+" setlocal cpo+=M " makes \%( match \)
diff --git a/runtime/ftplugin/hare.vim b/runtime/ftplugin/hare.vim
new file mode 100644
index 0000000..bb10daf
--- /dev/null
+++ b/runtime/ftplugin/hare.vim
@@ -0,0 +1,27 @@
+" Vim filetype plugin
+" Language: Hare
+" Maintainer: Amelia Clarke <me@rsaihe.dev>
+" Previous Maintainer: Drew DeVault <sir@cmpwn.com>
+" Last Updated: 2022-09-21
+
+" 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
+
+setlocal noexpandtab
+setlocal tabstop=8
+setlocal shiftwidth=0
+setlocal softtabstop=0
+setlocal textwidth=80
+setlocal commentstring=//\ %s
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+compiler hare
+" vim: tabstop=2 shiftwidth=2 expandtab
diff --git a/runtime/ftplugin/haskell.vim b/runtime/ftplugin/haskell.vim
new file mode 100644
index 0000000..84f4d05
--- /dev/null
+++ b/runtime/ftplugin/haskell.vim
@@ -0,0 +1,22 @@
+" Vim filetype plugin file
+" 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
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+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/heex.vim b/runtime/ftplugin/heex.vim
new file mode 100644
index 0000000..5274d59
--- /dev/null
+++ b/runtime/ftplugin/heex.vim
@@ -0,0 +1,16 @@
+" Elixir filetype plugin
+" Language: HEEx
+" Maintainer: Mitchell Hanberg <vimNOSPAM@mitchellhanberg.com>
+" Last Change: 2022 Sep 21
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal shiftwidth=2 softtabstop=2 expandtab
+
+setlocal comments=:<%!--
+setlocal commentstring=<%!--\ %s\ --%>
+
+let b:undo_ftplugin = 'set sw< sts< et< com< cms<'
diff --git a/runtime/ftplugin/help.vim b/runtime/ftplugin/help.vim
new file mode 100644
index 0000000..b619a75
--- /dev/null
+++ b/runtime/ftplugin/help.vim
@@ -0,0 +1,22 @@
+" Vim filetype plugin file
+" Language: Vim help file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2018-12-29
+
+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 fo< tw< cole< cocu< keywordprg<"
+
+setlocal formatoptions+=tcroql textwidth=78 keywordprg=:help
+if has("conceal")
+ setlocal cole=2 cocu=nc
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/hgcommit.vim b/runtime/ftplugin/hgcommit.vim
new file mode 100644
index 0000000..d5a6c0a
--- /dev/null
+++ b/runtime/ftplugin/hgcommit.vim
@@ -0,0 +1,16 @@
+" Vim filetype plugin file
+" Language: hg (Mercurial) commit file
+" Maintainer: Ken Takata <kentkt at csc dot jp>
+" Last Change: 2016 Jan 6
+" Filenames: hg-editor-*.txt
+" License: VIM License
+" URL: https://github.com/k-takata/hg-vim
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal nomodeline
+
+let b:undo_ftplugin = 'setl modeline<'
diff --git a/runtime/ftplugin/hog.vim b/runtime/ftplugin/hog.vim
new file mode 100644
index 0000000..4ee0a9f
--- /dev/null
+++ b/runtime/ftplugin/hog.vim
@@ -0,0 +1,39 @@
+" Vim filetype plugin
+" Language: hog (snort.conf)
+" Maintainer: . Victor Roemer, <vroemer@badsec.org>.
+" Last Change: Mar 1, 2013
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:undo_ftplugin = "setl fo< com< cms< def< inc<"
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal formatoptions=croq
+setlocal comments=:#
+setlocal commentstring=\c#\ %s
+setlocal define=\c^\s\{-}var
+setlocal include=\c^\s\{-}include
+
+" Move around configurations
+let s:hog_keyword_match = '\c^\s*\<\(preprocessor\\|config\\|output\\|include\\|ipvar\\|portvar\\|var\\|dynamicpreprocessor\\|' .
+ \ 'dynamicengine\\|dynamicdetection\\|activate\\|alert\\|drop\\|block\\|dynamic\\|log\\|pass\\|reject\\|sdrop\\|sblock\)\>'
+
+exec "nnoremap <buffer><silent> ]] :call search('" . s:hog_keyword_match . "', 'W' )<CR>"
+exec "nnoremap <buffer><silent> [[ :call search('" . s:hog_keyword_match . "', 'bW' )<CR>"
+
+if exists("loaded_matchit")
+ let b:match_words =
+ \ '^\s*\<\%(preprocessor\|config\|output\|include\|ipvar\|portvar' .
+ \ '\|var\|dynamicpreprocessor\|dynamicengine\|dynamicdetection' .
+ \ '\|activate\|alert\|drop\|block\|dynamic\|log\|pass\|reject' .
+ \ '\|sdrop\|sblock\>\):$,\::\,:;'
+ let b:match_skip = 'r:\\.\{-}$\|^\s*#.\{-}$\|^\s*$'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/hostconf.vim b/runtime/ftplugin/hostconf.vim
new file mode 100644
index 0000000..563bb8f
--- /dev/null
+++ b/runtime/ftplugin/hostconf.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-12-04
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/hostsaccess.vim b/runtime/ftplugin/hostsaccess.vim
new file mode 100644
index 0000000..d32485f
--- /dev/null
+++ b/runtime/ftplugin/hostsaccess.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: hosts_access(5) control file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/html.vim b/runtime/ftplugin/html.vim
new file mode 100644
index 0000000..94cb626
--- /dev/null
+++ b/runtime/ftplugin/html.vim
@@ -0,0 +1,55 @@
+" Vim filetype plugin file
+" Language: HTML
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Changed: 2022 Jul 20
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal matchpairs+=<:>
+setlocal commentstring=<!--%s-->
+setlocal comments=s:<!--,m:\ \ \ \ ,e:-->
+
+let b:undo_ftplugin = "setlocal comments< commentstring< matchpairs<"
+
+if get(g:, "ft_html_autocomment", 0)
+ setlocal formatoptions-=t formatoptions+=croql
+ let b:undo_ftplugin ..= " | setlocal formatoptions<"
+endif
+
+if exists('&omnifunc')
+ setlocal omnifunc=htmlcomplete#CompleteTags
+ call htmlcomplete#DetectOmniFlavor()
+ let b:undo_ftplugin ..= " | setlocal omnifunc<"
+endif
+
+" HTML: thanks to Johannes Zellner and Benji Fisher.
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 1
+ let b:match_words = '<!--:-->,' ..
+ \ '<:>,' ..
+ \ '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,' ..
+ \ '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,' ..
+ \ '<\@<=\([^/!][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
+ let b:html_set_match_words = 1
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words b:html_set_match_words"
+endif
+
+" Change the :browse e filter to primarily show HTML-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "HTML Files (*.html *.htm)\t*.htm;*.html\n" ..
+ \ "JavaScript Files (*.js)\t*.js\n" ..
+ \ "Cascading StyleSheets (*.css)\t*.css\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:html_set_browsefilter = 1
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter b:html_set_browsefilter"
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/htmldjango.vim b/runtime/ftplugin/htmldjango.vim
new file mode 100644
index 0000000..40e9429
--- /dev/null
+++ b/runtime/ftplugin/htmldjango.vim
@@ -0,0 +1,13 @@
+" Vim filetype plugin file
+" Language: Django HTML template
+" Maintainer: Dave Hodder <dmh@dmh.org.uk>
+" Last Change: 2007 Jan 25
+
+" Only use this filetype plugin when no other was loaded.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Use HTML and Django template ftplugins.
+runtime! ftplugin/html.vim
+runtime! ftplugin/django.vim
diff --git a/runtime/ftplugin/i3config.vim b/runtime/ftplugin/i3config.vim
new file mode 100644
index 0000000..4204510
--- /dev/null
+++ b/runtime/ftplugin/i3config.vim
@@ -0,0 +1,13 @@
+" Vim filetype plugin file
+" Language: i3 config file
+" Original Author: Mohamed Boughaba <mohamed dot bgb at gmail dot com>
+" Maintainer: Quentin Hibon
+" Version: 0.4
+" Last Change: 2021 Dec 14
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setlocal cms<"
+
+setlocal commentstring=#\ %s
diff --git a/runtime/ftplugin/icon.vim b/runtime/ftplugin/icon.vim
new file mode 100644
index 0000000..33a86df
--- /dev/null
+++ b/runtime/ftplugin/icon.vim
@@ -0,0 +1,36 @@
+" Vim filetype plugin file
+" Language: Icon
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jun 16
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if exists("loaded_matchit")
+ " let b:match_ignorecase = 0
+ let b:match_words = '^\s*$\s*if\(def\|ndef\)\=\>:^\s*$\s*elif\>:^\s*$\s*else\>:^\s*$\s*endif\>,' .
+ \ '\<procedure\>:\<\%(initial\|return\|suspend\|fail\)\>:\<end\>'
+ let b:undo_ftplugin ..= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Icon Source Files (*.icn)\t*.icn\n" .
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8
diff --git a/runtime/ftplugin/indent.vim b/runtime/ftplugin/indent.vim
new file mode 100644
index 0000000..64a650a
--- /dev/null
+++ b/runtime/ftplugin/indent.vim
@@ -0,0 +1,21 @@
+" Vim filetype plugin file
+" Language: indent(1) configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/ commentstring&
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/initex.vim b/runtime/ftplugin/initex.vim
new file mode 100644
index 0000000..0ee3e8d
--- /dev/null
+++ b/runtime/ftplugin/initex.vim
@@ -0,0 +1,39 @@
+" filetype plugin for TeX and variants
+" Language: TeX (ft=initex)
+" Maintainer: Benji Fisher, Ph.D. <benji@member.AMS.org>
+" Version: 1.0
+" Last Change: Wed 19 Apr 2006
+
+" 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
+
+" Avoid problems if running in 'compatible' mode.
+let s:save_cpo = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< define< include< sua<"
+
+" Set 'comments' to format dashed lists in comments
+setlocal com=sO:%\ -,mO:%\ \ ,eO:%%,:%
+
+" Set 'commentstring' to recognize the % comment character:
+" (Thanks to Ajit Thakkar.)
+setlocal cms=%%s
+
+" Allow "[d" to be used to find a macro definition:
+let &l:define='\\\([egx]\|char\|mathchar\|count\|dimen\|muskip\|skip\|toks\)\='
+ \ . 'def\|\\font\|\\\(future\)\=let'
+
+" Tell Vim to recognize \input bar :
+let &l:include = '\\input'
+setlocal suffixesadd=.tex
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim:sts=2:sw=2:
diff --git a/runtime/ftplugin/ishd.vim b/runtime/ftplugin/ishd.vim
new file mode 100644
index 0000000..33ef151
--- /dev/null
+++ b/runtime/ftplugin/ishd.vim
@@ -0,0 +1,33 @@
+" Vim filetype plugin file
+" Language: InstallShield (ft=ishd)
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Sat, 24 May 2003 11:55:36 CEST
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+setlocal foldmethod=syntax
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+" matchit support
+if exists("loaded_matchit")
+ let b:match_ignorecase=0
+ let b:match_words=
+ \ '\%(^\s*\)\@<=\<function\>\s\+[^()]\+\s*(:\%(^\s*\)\@<=\<begin\>\s*$:\%(^\s*\)\@<=\<return\>:\%(^\s*\)\@<=\<end\>\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<repeat\>\s*$:\%(^\s*\)\@<=\<until\>\s\+.\{-}\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<switch\>\s*(.\{-}):\%(^\s*\)\@<=\<\%(case\|default\)\>:\%(^\s*\)\@<=\<endswitch\>\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<while\>\s*(.\{-}):\%(^\s*\)\@<=\<endwhile\>\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<for\>.\{-}\<\%(to\|downto\)\>:\%(^\s*\)\@<=\<endfor\>\s*;\s*$,' .
+ \ '\%(^\s*\)\@<=\<if\>\s*(.\{-})\s*then:\%(^\s*\)\@<=\<else\s*if\>\s*([^)]*)\s*then:\%(^\s*\)\@<=\<else\>:\%(^\s*\)\@<=\<endif\>\s*;\s*$'
+endif
+
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "InstallShield Files (*.rul)\t*.rul\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/j.vim b/runtime/ftplugin/j.vim
new file mode 100644
index 0000000..ae235ab
--- /dev/null
+++ b/runtime/ftplugin/j.vim
@@ -0,0 +1,83 @@
+" Vim filetype plugin
+" Language: J
+" Maintainer: David Bürgin <dbuergin@gluet.ch>
+" URL: https://gitlab.com/glts/vim-j
+" Last Change: 2022-08-06
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+setlocal iskeyword=48-57,A-Z,a-z,_
+setlocal comments=:NB.
+setlocal commentstring=NB.\ %s
+setlocal formatoptions-=t
+setlocal matchpairs=(:)
+setlocal path-=/usr/include
+
+" Includes. To make the shorthand form "require 'web/cgi'" work, double the
+" last path component. Also strip off leading folder names like "~addons/".
+setlocal include=\\v^\\s*(load\|require)\\s*'\\zs\\f+\\ze'
+setlocal includeexpr=substitute(substitute(tr(v:fname,'\\','/'),'\\v^[^~][^/.]*(/[^/.]+)$','&\\1',''),'\\v^\\~[^/]+/','','')
+setlocal suffixesadd=.ijs
+
+let b:undo_ftplugin = 'setlocal suffixesadd< includeexpr< include< path< matchpairs< formatoptions< commentstring< comments< iskeyword<'
+
+" Section movement with ]] ][ [[ []. The start/end patterns below are amended
+" inside the function in order to avoid matching on the current cursor line.
+if !exists('no_plugin_maps') && !exists('no_j_maps')
+ let s:sectionstart = '\%(\s*Note\|.\{-}\<\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\)\>.*'
+ let s:sectionend = '\s*)\s*'
+
+ function! s:SearchSection(end, backwards, visualmode) abort
+ if a:visualmode !=# ''
+ normal! gv
+ endif
+ let l:flags = a:backwards ? 'bsW' : 'sW'
+ if a:end
+ call search('^' . s:sectionend . (a:backwards ? '\n\_.\{-}\%#' : '$'), l:flags)
+ else
+ call search('^' . s:sectionstart . (a:backwards ? '\n\_.\{-}\%#' : '$'), l:flags)
+ endif
+ endfunction
+
+ noremap <buffer> <silent> ]] :<C-U>call <SID>SearchSection(0, 0, '')<CR>
+ xnoremap <buffer> <silent> ]] :<C-U>call <SID>SearchSection(0, 0, visualmode())<CR>
+ sunmap <buffer> ]]
+ noremap <buffer> <silent> ][ :<C-U>call <SID>SearchSection(1, 0, '')<CR>
+ xnoremap <buffer> <silent> ][ :<C-U>call <SID>SearchSection(1, 0, visualmode())<CR>
+ sunmap <buffer> ][
+ noremap <buffer> <silent> [[ :<C-U>call <SID>SearchSection(0, 1, '')<CR>
+ xnoremap <buffer> <silent> [[ :<C-U>call <SID>SearchSection(0, 1, visualmode())<CR>
+ sunmap <buffer> [[
+ noremap <buffer> <silent> [] :<C-U>call <SID>SearchSection(1, 1, '')<CR>
+ xnoremap <buffer> <silent> [] :<C-U>call <SID>SearchSection(1, 1, visualmode())<CR>
+ sunmap <buffer> []
+
+ let b:undo_ftplugin .= ' | silent! execute "unmap <buffer> ]]"'
+ \ . ' | silent! execute "unmap <buffer> ]["'
+ \ . ' | silent! execute "unmap <buffer> [["'
+ \ . ' | silent! execute "unmap <buffer> []"'
+endif
+
+" Browse dialog filter on Windows and GTK (see ":help browsefilter")
+if (has('gui_win32') || has('gui_gtk')) && !exists('b:browsefilter')
+ let b:browsefilter = "J Script Files (*.ijs)\t*.ijs\n"
+ \ . "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin .= ' | unlet! b:browsefilter'
+endif
+
+" Enhanced "%" matching (see ":help matchit")
+if exists('loaded_matchit') && !exists('b:match_words')
+ let b:match_ignorecase = 0
+ let b:match_words = '^\%(\s*Note\|.\{-}\<\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(\:\s*0\|def\s\+0\|define\)\)\>:^\s*\:\s*$:^\s*)\s*$'
+ \ . ',\<\%(for\%(_\a\k*\)\=\|if\|select\|try\|whil\%(e\|st\)\)\.:\<\%(case\|catch[dt]\=\|else\%(if\)\=\|fcase\)\.:\<end\.'
+ let b:undo_ftplugin .= ' | unlet! b:match_ignorecase b:match_words'
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/java.vim b/runtime/ftplugin/java.vim
new file mode 100644
index 0000000..74c8e8d
--- /dev/null
+++ b/runtime/ftplugin/java.vim
@@ -0,0 +1,53 @@
+" Vim filetype plugin file
+" Language: Java
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Change: 2012 Mar 11
+
+if exists("b:did_ftplugin") | finish | endif
+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
+
+" For filename completion, prefer the .java extension over the .class
+" extension.
+set suffixes+=.class
+
+" Enable gf on import statements. Convert . in the package
+" name to / and append .java to the name, then search the path.
+setlocal includeexpr=substitute(v:fname,'\\.','/','g')
+setlocal suffixesadd=.java
+if exists("g:ftplugin_java_source_path")
+ let &l:path=g:ftplugin_java_source_path . ',' . &l:path
+endif
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set 'comments' to format dashed lists in comments. Behaves just like C.
+setlocal comments& comments^=sO:*\ -,mO:*\ \ ,exO:*/
+
+setlocal commentstring=//%s
+
+" Change the :browse e filter to primarily show Java-related files.
+if has("gui_win32")
+ let b:browsefilter="Java Files (*.java)\t*.java\n" .
+ \ "Properties Files (*.prop*)\t*.prop*\n" .
+ \ "Manifest Files (*.mf)\t*.mf\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal suffixes< suffixesadd<" .
+ \ " formatoptions< comments< commentstring< path< includeexpr<" .
+ \ " | unlet! b:browsefilter"
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/javascript.vim b/runtime/ftplugin/javascript.vim
new file mode 100644
index 0000000..9a0b29e
--- /dev/null
+++ b/runtime/ftplugin/javascript.vim
@@ -0,0 +1,75 @@
+" Vim filetype plugin file
+" Language: Javascript
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Jun 23
+" Contributor: Romain Lafourcade <romainlafourcade@gmail.com>
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+if exists('&ofu')
+ setlocal omnifunc=javascriptcomplete#CompleteJS
+endif
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+setlocal commentstring=//%s
+
+" Change the :browse e filter to primarily show JavaScript-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter =
+ \ "JavaScript Files (*.js)\t*.js\n"
+ \ .. "JSX Files (*.jsx)\t*.jsx\n"
+ \ .. "JavaScript Modules (*.es, *.es6, *.cjs, *.mjs, *.jsm)\t*.es;*.es6;*.cjs;*.mjs;*.jsm\n"
+ \ .. "Vue Templates (*.vue)\t*.vue\n"
+ \ .. "JSON Files (*.json)\t*.json\n"
+ \ .. "All Files (*.*)\t*.*\n"
+endif
+
+" The following suffixes should be implied when resolving filenames
+setlocal suffixesadd+=.js,.jsx,.es,.es6,.cjs,.mjs,.jsm,.vue,.json
+
+" The following suffixes should have low priority
+" .snap jest snapshot
+setlocal suffixes+=.snap
+
+" Remove irrelevant part of 'path'.
+" User is expected to augment it with contextually-relevant paths
+setlocal path-=/usr/include
+
+" Matchit configuration
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words =
+ \ '\<do\>:\<while\>,'
+ \ .. '<\@<=\([^ \t>/]\+\)\%(\s\+[^>]*\%([^/]>\|$\)\|>\|$\):<\@<=/\1>,'
+ \ .. '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
+endif
+
+" Set 'define' to a comprehensive value
+let &l:define =
+ \ '\(^\s*(*async\s\+function\|(*function\)'
+ \ .. '\|^\s*\(\*\|static\|async\|get\|set\|\i\+\.\)'
+ \ .. '\|^\s*\(\ze\i\+\)\(([^)]*).*{$\|\s*[:=,]\)'
+ \ .. '\|^\s*\(export\s\+\|export\s\+default\s\+\)*\(var\|let\|const\|function\|class\)'
+ \ .. '\|\<as\>'
+
+let b:undo_ftplugin =
+ \ "setl fo< ofu< com< cms< sua< su< def< pa<"
+ \ .. "| unlet! b:browsefilter b:match_ignorecase b:match_words"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: textwidth=78 tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/ftplugin/javascriptreact.vim b/runtime/ftplugin/javascriptreact.vim
new file mode 100644
index 0000000..b9c39d5
--- /dev/null
+++ b/runtime/ftplugin/javascriptreact.vim
@@ -0,0 +1,7 @@
+" Vim filetype plugin file
+" Language: JavaScript React
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Aug 19
+
+" Placeholder for backwards compatilibity: .jsx used to stand for JavaScript.
+runtime! ftplugin/javascript.vim
diff --git a/runtime/ftplugin/jproperties.vim b/runtime/ftplugin/jproperties.vim
new file mode 100644
index 0000000..c0e7800
--- /dev/null
+++ b/runtime/ftplugin/jproperties.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin
+" Language: Java properties file
+" Maintainer: None
+" Last Change: 2019 Dec 01
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal formatoptions-=t
+setlocal comments=:#,:!
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setl cms< com< fo<"
diff --git a/runtime/ftplugin/json.vim b/runtime/ftplugin/json.vim
new file mode 100644
index 0000000..c79b13f
--- /dev/null
+++ b/runtime/ftplugin/json.vim
@@ -0,0 +1,17 @@
+" Vim filetype plugin
+" Language: JSON
+" Maintainer: David Barnett <daviebdawg+vim@gmail.com>
+" Last Change: 2014 Jul 16
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = 'setlocal formatoptions< comments< commentstring<'
+
+setlocal formatoptions-=t
+
+" JSON has no comments.
+setlocal comments=
+setlocal commentstring=
diff --git a/runtime/ftplugin/jsonc.vim b/runtime/ftplugin/jsonc.vim
new file mode 100644
index 0000000..e47a75f
--- /dev/null
+++ b/runtime/ftplugin/jsonc.vim
@@ -0,0 +1,21 @@
+" Vim filetype plugin
+" Language: JSONC (JSON with Comments)
+" Original Author: Izhak Jakov <izhak724@gmail.com>
+" Acknowledgement: Based off of vim-jsonc maintained by Kevin Locke <kevin@kevinlocke.name>
+" https://github.com/kevinoid/vim-jsonc
+" License: MIT
+" Last Change: 2021 Nov 22
+
+runtime! ftplugin/json.vim
+
+if exists('b:did_ftplugin_jsonc')
+ finish
+else
+ let b:did_ftplugin_jsonc = 1
+endif
+
+" Set comment (formatting) related options. {{{1
+setlocal commentstring=//%s comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+" Let Vim know how to disable the plug-in.
+let b:undo_ftplugin = 'setlocal commentstring< comments<'
diff --git a/runtime/ftplugin/jsonnet.vim b/runtime/ftplugin/jsonnet.vim
new file mode 100644
index 0000000..1e621e1
--- /dev/null
+++ b/runtime/ftplugin/jsonnet.vim
@@ -0,0 +1,17 @@
+" Vim filetype plugin
+" Language: Jsonnet
+" Maintainer: Cezary Drożak <cezary@drozak.net>
+" URL: https://github.com/google/vim-jsonnet
+" Last Change: 2022-09-08
+
+" 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
+
+setlocal commentstring=//\ %s
+
+let b:undo_ftplugin = "setlocal commentstring<"
diff --git a/runtime/ftplugin/jsp.vim b/runtime/ftplugin/jsp.vim
new file mode 100644
index 0000000..18136cc
--- /dev/null
+++ b/runtime/ftplugin/jsp.vim
@@ -0,0 +1,69 @@
+" Vim filetype plugin file
+" Language: jsp
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "Java Files (*.java)\t*.java\n" .
+ \ "HTML Files (*.html, *.htm)\t*.html;*.htm\n" .
+ \ "All Files (*.*)\t*.*\n"
+let s:match_words = ""
+
+runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+unlet b:did_ftplugin
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+ unlet b:match_words
+endif
+
+runtime! ftplugin/java.vim ftplugin/java_*.vim ftplugin/java/*.vim
+let b:did_ftplugin = 1
+
+" Combine the new set of values with those previously included.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin . " | " . s:undo_ftplugin
+endif
+if exists ("b:browsefilter")
+ let s:browsefilter = b:browsefilter . s:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words . ',' . s:match_words
+endif
+
+" Load the combined list of match_words for matchit.vim
+if exists("loaded_matchit")
+ let b:match_words = s:match_words
+endif
+
+" Change the :browse e filter to primarily show JSP-related files.
+if has("gui_win32")
+ let b:browsefilter="JSP Files (*.jsp)\t*.jsp\n" . s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/julia.vim b/runtime/ftplugin/julia.vim
new file mode 100644
index 0000000..b65cf99
--- /dev/null
+++ b/runtime/ftplugin/julia.vim
@@ -0,0 +1,92 @@
+" Vim filetype plugin file
+" Language: Julia
+" Maintainer: Carlo Baldassi <carlobaldassi@gmail.com>
+" Homepage: https://github.com/JuliaEditorSupport/julia-vim
+" Last Change: 2021 Aug 04
+" adapted from upstream 2021 Aug 4
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal include=^\\s*\\%(reload\\\|include\\)\\>
+setlocal suffixesadd=.jl
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal cinoptions+=#1
+setlocal define=^\\s*macro\\>
+setlocal fo-=t fo+=croql
+
+let b:julia_vim_loaded = 1
+
+let b:undo_ftplugin = "setlocal include< suffixesadd< comments< commentstring<"
+ \ . " define< fo< shiftwidth< expandtab< indentexpr< indentkeys< cinoptions< completefunc<"
+ \ . " | unlet! b:julia_vim_loaded"
+
+" MatchIt plugin support
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+
+ " note: begin_keywords must contain all blocks, in order
+ " for nested-structures-skipping to work properly
+ " note: 'mutable struct' and 'struct' are defined separately because
+ " using \? puts the cursor on 'struct' instead of 'mutable' for some reason
+ let b:julia_begin_keywords = '\%(\.\s*\|@\)\@<!\<\%(function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|let\|do\|\%(bare\)\?module\|quote\|if\|for\|while\|try\)\>'
+ " note: the following regex not only recognizes macros, but also local/global keywords.
+ " the purpose is recognizing things like `@inline myfunction()`
+ " or `global myfunction(...)` etc, for matchit and block movement functionality
+ let s:macro_regex = '\%(@\%([#(]\@!\S\)\+\|\<\%(local\|global\)\)\s\+'
+ let s:nomacro = '\%(' . s:macro_regex . '\)\@<!'
+ let s:yesmacro = s:nomacro . '\%('. s:macro_regex . '\)\+'
+ let b:julia_begin_keywordsm = '\%(' . s:yesmacro . b:julia_begin_keywords . '\)\|'
+ \ . '\%(' . s:nomacro . b:julia_begin_keywords . '\)'
+ let b:julia_end_keywords = '\<end\>'
+
+ " note: this function relies heavily on the syntax file
+ function! JuliaGetMatchWords()
+ let [l,c] = [line('.'),col('.')]
+ let attr = synIDattr(synID(l, c, 1),"name")
+ let c1 = c
+ while attr == 'juliaMacro' || expand('<cword>') =~# '\<\%(global\|local\)\>'
+ normal! W
+ if line('.') > l || col('.') == c1
+ call cursor(l, c)
+ return ''
+ endif
+ let attr = synIDattr(synID(l, col('.'), 1),"name")
+ let c1 = col('.')
+ endwhile
+ call cursor(l, c)
+ if attr == 'juliaConditional'
+ return b:julia_begin_keywordsm . ':\<\%(elseif\|else\)\>:' . b:julia_end_keywords
+ elseif attr =~# '\<\%(juliaRepeat\|juliaRepKeyword\)\>'
+ return b:julia_begin_keywordsm . ':\<\%(break\|continue\)\>:' . b:julia_end_keywords
+ elseif attr == 'juliaBlKeyword'
+ return b:julia_begin_keywordsm . ':' . b:julia_end_keywords
+ elseif attr == 'juliaException'
+ return b:julia_begin_keywordsm . ':\<\%(catch\|finally\)\>:' . b:julia_end_keywords
+ endif
+ return '\<\>:\<\>'
+ endfunction
+
+ let b:match_words = 'JuliaGetMatchWords()'
+
+ " we need to skip everything within comments, strings and
+ " the 'begin' and 'end' keywords when they are used as a range rather than as
+ " the delimiter of a block
+ let b:match_skip = 'synIDattr(synID(line("."),col("."),0),"name") =~# '
+ \ . '"\\<julia\\%(Comprehension\\%(For\\|If\\)\\|RangeKeyword\\|Comment\\%([LM]\\|Delim\\)\\|\\%([bs]\\|Shell\\|Printf\\|Doc\\)\\?String\\|StringPrefixed\\|DocStringM\\(Raw\\)\\?\\|RegEx\\|SymbolS\\?\\|Dotted\\)\\>"'
+
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . " | unlet! b:match_words b:match_skip b:match_ignorecase"
+ \ . " | unlet! b:julia_begin_keywords b:julia_end_keywords"
+ \ . " | delfunction JuliaGetMatchWords"
+
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/kconfig.vim b/runtime/ftplugin/kconfig.vim
new file mode 100644
index 0000000..940ba74
--- /dev/null
+++ b/runtime/ftplugin/kconfig.vim
@@ -0,0 +1,27 @@
+" Vim filetype plugin file
+" Vim syntax file
+" 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-kconfig
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+" For matchit.vim
+if exists("loaded_matchit")
+ let b:match_words = '^\<menu\>:\<endmenu\>,^\<if\>:\<endif\>,^\<choice\>:\<endchoice\>'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/kwt.vim b/runtime/ftplugin/kwt.vim
new file mode 100644
index 0000000..05b40d4
--- /dev/null
+++ b/runtime/ftplugin/kwt.vim
@@ -0,0 +1,32 @@
+" Vim filetype plugin file
+" Language: Kimwitu++
+" Maintainer: Michael Piefel <entwurf@piefel.de>
+" Last Change: 10 March 2012
+
+" Behaves almost like C++
+runtime! ftplugin/cpp.vim ftplugin/cpp_*.vim ftplugin/cpp/*.vim
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Limit the browser to related files
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "Kimwitu/Kimwitu++ Files (*.k)\t*.k\n" .
+ \ "Lex/Flex Files (*.l)\t*.l\n" .
+ \ "Yacc/Bison Files (*.y)\t*.y\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+" Set the errorformat for the Kimwitu++ compiler
+set efm+=kc%.%#:\ error\ at\ %f:%l:\ %m
+
+if exists("b:undo_ftplugin")
+ let b:undo_ftplugin = b:undo_ftplugin . " | setlocal efm<"
+ \ . "| unlet! b:browsefiler"
+else
+ let b:undo_ftplugin = "setlocal efm<"
+ \ . "| unlet! b:browsefiler"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/ld.vim b/runtime/ftplugin/ld.vim
new file mode 100644
index 0000000..1ab80d5
--- /dev/null
+++ b/runtime/ftplugin/ld.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: ld(1) script
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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=s1:/*,mb:*,ex:*/ commentstring=/*%s*/ include=^\\s*INCLUDE
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/less.vim b/runtime/ftplugin/less.vim
new file mode 100644
index 0000000..637e9d2
--- /dev/null
+++ b/runtime/ftplugin/less.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin
+" Language: less
+" Maintainer: Alessandro Vioni <jenoma@gmail.com>
+" URL: https://github.com/genoma/vim-less
+" Last Change: 2014 November 24
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl cms< def< inc< inex< ofu< sua<"
+
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal comments=:// commentstring=//\ %s
+
+setlocal omnifunc=csscomplete#CompleteCSS
+setlocal suffixesadd=.less
diff --git a/runtime/ftplugin/lftp.vim b/runtime/ftplugin/lftp.vim
new file mode 100644
index 0000000..5bc496c
--- /dev/null
+++ b/runtime/ftplugin/lftp.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: lftp(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/libao.vim b/runtime/ftplugin/libao.vim
new file mode 100644
index 0000000..0ce5831
--- /dev/null
+++ b/runtime/ftplugin/libao.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: libao.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/limits.vim b/runtime/ftplugin/limits.vim
new file mode 100644
index 0000000..90a10a6
--- /dev/null
+++ b/runtime/ftplugin/limits.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: limits(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/liquid.vim b/runtime/ftplugin/liquid.vim
new file mode 100644
index 0000000..f24ec4c
--- /dev/null
+++ b/runtime/ftplugin/liquid.vim
@@ -0,0 +1,61 @@
+" Vim filetype plugin
+" Language: Liquid
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2022 Mar 15
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+if !exists('g:liquid_default_subtype')
+ let g:liquid_default_subtype = 'html'
+endif
+
+if !exists('b:liquid_subtype')
+ let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$")
+ let b:liquid_subtype = matchstr(s:lines,'liquid_subtype=\zs\w\+')
+ if b:liquid_subtype == ''
+ let b:liquid_subtype = matchstr(&filetype,'^liquid\.\zs\w\+')
+ endif
+ if b:liquid_subtype == ''
+ let b:liquid_subtype = matchstr(substitute(expand('%:t'),'\c\%(\.liquid\)\+$','',''),'\.\zs\w\+$')
+ endif
+ if b:liquid_subtype == ''
+ let b:liquid_subtype = g:liquid_default_subtype
+ endif
+endif
+
+if exists('b:liquid_subtype') && b:liquid_subtype != ''
+ exe 'runtime! ftplugin/'.b:liquid_subtype.'.vim ftplugin/'.b:liquid_subtype.'_*.vim ftplugin/'.b:liquid_subtype.'/*.vim'
+else
+ runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+endif
+let b:did_ftplugin = 1
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= '|'
+else
+ let b:undo_ftplugin = ''
+endif
+if exists('b:browsefilter')
+ let b:browsefilter = "\n".b:browsefilter
+else
+ let b:browsefilter = ''
+endif
+if exists('b:match_words')
+ let b:match_words .= ','
+elseif exists('loaded_matchit')
+ let b:match_words = ''
+endif
+
+if has('gui_win32')
+ let b:browsefilter="Liquid Files (*.liquid)\t*.liquid" . b:browsefilter
+endif
+
+if exists('loaded_matchit')
+ let b:match_words .= '\<\%(if\w*\|unless\|case\)\>:\<\%(elsif\|else\|when\)\>:\<end\%(if\w*\|unless\|case\)\>,\<\%(for\|tablerow\)\>:\%({%\s*\)\@<=empty\>:\<end\%(for\|tablerow\)\>,\<\(capture\|comment\|highlight\)\>:\<end\1\>'
+endif
+
+setlocal commentstring={%\ comment\ %}%s{%\ endcomment\ %}
+
+let b:undo_ftplugin .= 'setl cms< | unlet! b:browsefilter b:match_words'
diff --git a/runtime/ftplugin/lisp.vim b/runtime/ftplugin/lisp.vim
new file mode 100644
index 0000000..db3ac96
--- /dev/null
+++ b/runtime/ftplugin/lisp.vim
@@ -0,0 +1,24 @@
+" Vim filetype plugin
+" Language: Lisp
+" 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: Mar 10, 2021
+
+" 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
+
+setl comments=:;;;;,:;;;,:;;,:;,sr:#\|,mb:\|,ex:\|#
+setl define=^\\s*(def\\k*
+setl formatoptions-=t
+setl iskeyword+=+,-,*,/,%,<,=,>,:,$,?,!,@-@,94
+setl lisp
+setl commentstring=;%s
+
+let b:undo_ftplugin = "setlocal comments< define< formatoptions< iskeyword< lisp< commentstring<"
diff --git a/runtime/ftplugin/logcheck.vim b/runtime/ftplugin/logcheck.vim
new file mode 100644
index 0000000..9c1be11
--- /dev/null
+++ b/runtime/ftplugin/logcheck.vim
@@ -0,0 +1,17 @@
+" Vim filetype plugin file
+" Language: Logcheck
+" Maintainer: Debian Vim Maintainers
+" Last Change: 2023 Jan 16
+" License: Vim License
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/ftplugin/logcheck.vim
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = 'setl fo<'
+
+" Do not hard-wrap non-comment lines since each line is a self-contained
+" regular expression
+setlocal formatoptions-=t
diff --git a/runtime/ftplugin/loginaccess.vim b/runtime/ftplugin/loginaccess.vim
new file mode 100644
index 0000000..d27114a
--- /dev/null
+++ b/runtime/ftplugin/loginaccess.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: login.access(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/logindefs.vim b/runtime/ftplugin/logindefs.vim
new file mode 100644
index 0000000..7873396
--- /dev/null
+++ b/runtime/ftplugin/logindefs.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: login.defs(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/logtalk.dict b/runtime/ftplugin/logtalk.dict
new file mode 100644
index 0000000..3fcdfc6
--- /dev/null
+++ b/runtime/ftplugin/logtalk.dict
@@ -0,0 +1,262 @@
+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
+engines
+ensure_loaded
+evaluation_error
+events
+existence_error
+exp
+expand_goal
+expand_term
+export
+extends
+extends_category
+extends_object
+extends_protocol
+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
+instantiation_error
+integer
+keysort
+lambda_variables
+log
+logtalk_compile
+logtalk_library_path
+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
+numbervars
+number_chars
+number_chars
+number_codes
+number_codes
+object
+object_property
+once
+op
+open
+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
+read
+read_term
+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
new file mode 100644
index 0000000..667907c
--- /dev/null
+++ b/runtime/ftplugin/logtalk.vim
@@ -0,0 +1,19 @@
+" Logtalk filetype plugin file
+" Language: Logtalk
+" Maintainer: Paulo Moura <pmoura@logtalk.org>
+" Latest Revision: 2018-08-03
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl ts< sw< fdm< fdc< ai< dict<"
+
+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/lprolog.vim b/runtime/ftplugin/lprolog.vim
new file mode 100644
index 0000000..a8a3c61
--- /dev/null
+++ b/runtime/ftplugin/lprolog.vim
@@ -0,0 +1,37 @@
+" Vim settings file
+" Language: LambdaProlog (Teyjus)
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" URL: http://www.ocaml.info/vim/ftplugin/lprolog.vim
+" Last Change: 2006 Feb 05
+" 2001 Sep 16 - fixed 'no_mail_maps'-bug (MM)
+" 2001 Sep 02 - initial release (MM)
+
+" Only do these settings when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't do other file type settings for this buffer
+let b:did_ftplugin = 1
+
+" Error format
+setlocal efm=%+A./%f:%l.%c:\ %m formatprg=fmt\ -w75\ -p\\%
+
+" Formatting of comments
+setlocal formatprg=fmt\ -w75\ -p\\%
+
+" Add mappings, unless the user didn't want this.
+if !exists("no_plugin_maps") && !exists("no_lprolog_maps")
+ " Uncommenting
+ if !hasmapto('<Plug>Comment')
+ nmap <buffer> <LocalLeader>c <Plug>LUncomOn
+ vmap <buffer> <LocalLeader>c <Plug>BUncomOn
+ nmap <buffer> <LocalLeader>C <Plug>LUncomOff
+ vmap <buffer> <LocalLeader>C <Plug>BUncomOff
+ endif
+
+ nnoremap <buffer> <Plug>LUncomOn mz0i/* <ESC>$A */<ESC>`z
+ nnoremap <buffer> <Plug>LUncomOff <ESC>:s/^\/\* \(.*\) \*\//\1/<CR>
+ vnoremap <buffer> <Plug>BUncomOn <ESC>:'<,'><CR>`<O<ESC>0i/*<ESC>`>o<ESC>0i*/<ESC>`<
+ vnoremap <buffer> <Plug>BUncomOff <ESC>:'<,'><CR>`<dd`>dd`<
+endif
diff --git a/runtime/ftplugin/lua.vim b/runtime/ftplugin/lua.vim
new file mode 100644
index 0000000..88b1fc9
--- /dev/null
+++ b/runtime/ftplugin/lua.vim
@@ -0,0 +1,49 @@
+" Vim filetype plugin file.
+" Language: Lua
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Max Ischenko <mfi@ukr.net>
+" Contributor: Dorai Sitaram <ds26@gte.com>
+" C.D. MacEachern <craig.daniel.maceachern@gmail.com>
+" Last Change: 2022 Nov 19
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:--
+setlocal commentstring=--\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &l:define = '\<function\|\<local\%(\s\+function\)\='
+
+" TODO: handle init.lua
+setlocal includeexpr=tr(v:fname,'.','/')
+setlocal suffixesadd=.lua
+
+let b:undo_ftplugin = "setlocal cms< com< def< fo< inex< sua<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let b:match_words =
+ \ '\<\%(do\|function\|if\)\>:' ..
+ \ '\<\%(return\|else\|elseif\)\>:' ..
+ \ '\<end\>,' ..
+ \ '\<repeat\>:\<until\>,' ..
+ \ '\%(--\)\=\[\(=*\)\[:]\1]'
+ let b:undo_ftplugin ..= " | unlet! b:match_words b:match_ignorecase"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Lua Source Files (*.lua)\t*.lua\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/lynx.vim b/runtime/ftplugin/lynx.vim
new file mode 100644
index 0000000..b76c69f
--- /dev/null
+++ b/runtime/ftplugin/lynx.vim
@@ -0,0 +1,29 @@
+" Vim filetype plugin file
+" Language: Lynx Web Browser Configuration
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Sep 09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl cms< com< fo<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Lynx Configuration Files (lynx.cfg .lynxrc)\tlynx.cfg;.lynxrc\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/m3build.vim b/runtime/ftplugin/m3build.vim
new file mode 100644
index 0000000..c910eae
--- /dev/null
+++ b/runtime/ftplugin/m3build.vim
@@ -0,0 +1,23 @@
+" Vim filetype plugin file
+" Language: Modula-3 Makefile
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 June 12
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+runtime! ftplugin/m3quake.vim
+
+if (has("gui_win32") || has("gui_gtk")) && exists("b:m3quake_set_browsefilter")
+ let b:browsefilter = "Modula-3 Makefile (m3makefile m3overrides)\tm3makefile;m3overrides\n" ..
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/m3quake.vim b/runtime/ftplugin/m3quake.vim
new file mode 100644
index 0000000..7762875
--- /dev/null
+++ b/runtime/ftplugin/m3quake.vim
@@ -0,0 +1,35 @@
+" Vim filetype plugin file
+" Language: Modula-3 Quake
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 June 12
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=s1:/*,mb:*,ex:*/,:%
+setlocal commentstring=%\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\<\%(proc\|if\|foreach\)\>:\<else\>:\<end\>'
+ let b:undo_ftplugin ..= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Modula-3 Quake Source Files (*.quake)\t*.quake\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:m3quake_set_browsefilter = 1
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter b:m3quake_set_browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/m4.vim b/runtime/ftplugin/m4.vim
new file mode 100644
index 0000000..3745507
--- /dev/null
+++ b/runtime/ftplugin/m4.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: m4
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:#,:dnl commentstring=dnl\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/mail.vim b/runtime/ftplugin/mail.vim
new file mode 100644
index 0000000..f120223
--- /dev/null
+++ b/runtime/ftplugin/mail.vim
@@ -0,0 +1,46 @@
+" Vim filetype plugin file
+" Language: Mail
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2021 Oct 23
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl modeline< tw< fo< comments<"
+
+" Don't use modelines in e-mail messages, avoid trojan horses and nasty
+" "jokes" (e.g., setting 'textwidth' to 5).
+setlocal nomodeline
+
+" many people recommend keeping e-mail messages 72 chars wide
+if &tw == 0
+ setlocal tw=72
+endif
+
+" Set 'formatoptions' to break text lines and keep the comment leader ">".
+setlocal fo+=tcql
+
+" Add n:> to 'comments, in case it was removed elsewhere
+setlocal comments+=n:>
+
+" .eml files are universally formatted with DOS line-endings, per RFC5322.
+" If the file was not DOS the it will be marked as changed, which is probably
+" a good thing.
+if expand('%:e') ==? 'eml'
+ let b:undo_ftplugin ..= " fileformat=" .. &fileformat
+ setlocal fileformat=dos
+endif
+
+" Add mappings, unless the user doesn't want this.
+if !exists("no_plugin_maps") && !exists("no_mail_maps")
+ " Quote text by inserting "> "
+ if !hasmapto('<Plug>MailQuote')
+ vmap <buffer> <LocalLeader>q <Plug>MailQuote
+ nmap <buffer> <LocalLeader>q <Plug>MailQuote
+ endif
+ vnoremap <buffer> <Plug>MailQuote :s/^/> /<CR>:noh<CR>``
+ nnoremap <buffer> <Plug>MailQuote :.,$s/^/> /<CR>:noh<CR>``
+endif
diff --git a/runtime/ftplugin/mailaliases.vim b/runtime/ftplugin/mailaliases.vim
new file mode 100644
index 0000000..0ae4b45
--- /dev/null
+++ b/runtime/ftplugin/mailaliases.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/mailcap.vim b/runtime/ftplugin/mailcap.vim
new file mode 100644
index 0000000..ba8573c
--- /dev/null
+++ b/runtime/ftplugin/mailcap.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: Mailcap configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/make.vim b/runtime/ftplugin/make.vim
new file mode 100644
index 0000000..168bc38
--- /dev/null
+++ b/runtime/ftplugin/make.vim
@@ -0,0 +1,33 @@
+" Vim filetype plugin file
+" Language: Make
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2020 Oct 16
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl et< sts< sw< fo< com< cms< inc<"
+
+" Make sure a hard tab is used, required for most make programs
+setlocal noexpandtab softtabstop=0 shiftwidth=0
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set 'comments' to format dashed lists in comments
+setlocal com=sO:#\ -,mO:#\ \ ,b:#
+
+" Set 'commentstring' to put the marker after a #.
+setlocal commentstring=#\ %s
+
+" Including files.
+let &l:include = '^\s*include'
+
+" For matchit.vim, suggested by Albert Netymk and Ken Takata.
+if exists("loaded_matchit")
+ let b:match_words = '^ *ifn\=\(eq\|def\)\>:^ *else\(\s\+ifn\=\(eq\|def\)\)\=\>:^ *endif\>,\<define\>:\<endef\>,^!\s*if\(n\=def\)\=\>:^!\s*else\(if\(n\=def\)\=\)\=\>:^!\s*endif\>'
+endif
diff --git a/runtime/ftplugin/man.vim b/runtime/ftplugin/man.vim
new file mode 100644
index 0000000..7d59eab
--- /dev/null
+++ b/runtime/ftplugin/man.vim
@@ -0,0 +1,69 @@
+" Vim filetype plugin file
+" Language: man
+" Maintainer: Jason Franklin <vim@justemail.net>
+" Maintainer: SungHyun Nam <goweol@gmail.com>
+" Autoload Split: Bram Moolenaar
+" Last Change: 2022 Sep 30
+
+" To make the ":Man" command available before editing a manual page, source
+" this script from your startup vimrc file.
+
+" If 'filetype' isn't "man", we must have been called to define ":Man" and not
+" to do the filetype plugin stuff.
+if &filetype == "man"
+
+ " Only do this when not done yet for this buffer
+ if exists("b:did_ftplugin")
+ finish
+ endif
+ let b:did_ftplugin = 1
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+if &filetype == "man"
+ " Allow hyphen, plus, colon, dot, and commercial at in manual page name.
+ " Allow parentheses for references.
+ setlocal iskeyword=48-57,_,a-z,A-Z,-,+,:,.,@-@,(,)
+ let b:undo_ftplugin = "setlocal iskeyword<"
+
+ " Add mappings, unless the user didn't want this.
+ if !exists("no_plugin_maps") && !exists("no_man_maps")
+ if !hasmapto('<Plug>ManBS')
+ nmap <buffer> <LocalLeader>h <Plug>ManBS
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . '|silent! nunmap <buffer> <LocalLeader>h'
+ endif
+ nnoremap <buffer> <Plug>ManBS :%s/.\b//g<CR>:setl nomod<CR>''
+
+ nnoremap <buffer> <silent> <c-]> :call dist#man#PreGetPage(v:count)<CR>
+ nnoremap <buffer> <silent> <c-t> :call dist#man#PopPage()<CR>
+ nnoremap <buffer> <silent> q :q<CR>
+
+ " Add undo commands for the maps
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . '|silent! nunmap <buffer> <Plug>ManBS'
+ \ . '|silent! nunmap <buffer> <c-]>'
+ \ . '|silent! nunmap <buffer> <c-t>'
+ \ . '|silent! nunmap <buffer> q'
+ endif
+
+ if exists('g:ft_man_folding_enable') && (g:ft_man_folding_enable == 1)
+ setlocal foldmethod=indent foldnestmax=1 foldenable
+ let b:undo_ftplugin = b:undo_ftplugin
+ \ . '|silent! setl fdm< fdn< fen<'
+ endif
+
+endif
+
+if exists(":Man") != 2
+ com -nargs=+ -complete=shellcmd Man call dist#man#GetPage(<q-mods>, <f-args>)
+ nmap <Leader>K :call dist#man#PreGetPage(0)<CR>
+ nmap <Plug>ManPreGetPage :call dist#man#PreGetPage(0)<CR>
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: set sw=2 ts=8 noet:
diff --git a/runtime/ftplugin/manconf.vim b/runtime/ftplugin/manconf.vim
new file mode 100644
index 0000000..aa85408
--- /dev/null
+++ b/runtime/ftplugin/manconf.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" 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
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/markdown.vim b/runtime/ftplugin/markdown.vim
new file mode 100644
index 0000000..2b963f1
--- /dev/null
+++ b/runtime/ftplugin/markdown.vim
@@ -0,0 +1,92 @@
+" Vim filetype plugin
+" Language: Markdown
+" Maintainer: Tim Pope <https://github.com/tpope/vim-markdown>
+" Last Change: 2022 Oct 13
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+setlocal comments=fb:*,fb:-,fb:+,n:> commentstring=<!--%s-->
+setlocal formatoptions+=tcqln formatoptions-=r formatoptions-=o
+setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+\\\|^\\[^\\ze[^\\]]\\+\\]:\\&^.\\{4\\}
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= "|setl cms< com< fo< flp< et< ts< sts< sw<"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp< et< ts< sts< sw<"
+endif
+
+if get(g:, 'markdown_recommended_style', 1)
+ setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4
+endif
+
+if !exists("g:no_plugin_maps") && !exists("g:no_markdown_maps")
+ nnoremap <silent><buffer> [[ :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR>
+ nnoremap <silent><buffer> ]] :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR>
+ xnoremap <silent><buffer> [[ :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR>
+ xnoremap <silent><buffer> ]] :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR>
+ let b:undo_ftplugin .= '|sil! nunmap <buffer> [[|sil! nunmap <buffer> ]]|sil! xunmap <buffer> [[|sil! xunmap <buffer> ]]'
+endif
+
+function! s:NotCodeBlock(lnum) abort
+ return synIDattr(synID(a:lnum, 1, 1), 'name') !=# 'markdownCode'
+endfunction
+
+function! MarkdownFold() abort
+ let line = getline(v:lnum)
+
+ if line =~# '^#\+ ' && s:NotCodeBlock(v:lnum)
+ return ">" . match(line, ' ')
+ endif
+
+ let nextline = getline(v:lnum + 1)
+ if (line =~ '^.\+$') && (nextline =~ '^=\+$') && s:NotCodeBlock(v:lnum + 1)
+ return ">1"
+ endif
+
+ if (line =~ '^.\+$') && (nextline =~ '^-\+$') && s:NotCodeBlock(v:lnum + 1)
+ return ">2"
+ endif
+
+ return "="
+endfunction
+
+function! s:HashIndent(lnum) abort
+ let hash_header = matchstr(getline(a:lnum), '^#\{1,6}')
+ if len(hash_header)
+ return hash_header
+ else
+ let nextline = getline(a:lnum + 1)
+ if nextline =~# '^=\+\s*$'
+ return '#'
+ elseif nextline =~# '^-\+\s*$'
+ return '##'
+ endif
+ endif
+endfunction
+
+function! MarkdownFoldText() abort
+ let hash_indent = s:HashIndent(v:foldstart)
+ let title = substitute(getline(v:foldstart), '^#\+\s*', '', '')
+ let foldsize = (v:foldend - v:foldstart + 1)
+ let linecount = '['.foldsize.' lines]'
+ return hash_indent.' '.title.' '.linecount
+endfunction
+
+if has("folding") && get(g:, "markdown_folding", 0)
+ setlocal foldexpr=MarkdownFold()
+ setlocal foldmethod=expr
+ setlocal foldtext=MarkdownFoldText()
+ let b:undo_ftplugin .= "|setl foldexpr< foldmethod< foldtext<"
+endif
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:set sw=2:
diff --git a/runtime/ftplugin/masm.vim b/runtime/ftplugin/masm.vim
new file mode 100644
index 0000000..ab196eb
--- /dev/null
+++ b/runtime/ftplugin/masm.vim
@@ -0,0 +1,32 @@
+" Vim filetype plugin file
+" Language: Microsoft Macro Assembler (80x86)
+" Maintainer: Wu Yongwei <wuyongwei@gmail.com>
+" Last Change: 2022-04-24 21:24:52 +0800
+
+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 iskeyword<"
+
+setlocal iskeyword=@,48-57,_,36,60,62,63,@-@
+
+" Matchit support
+if !exists('b:match_words')
+ let b:match_words = '^\s*\.IF\>:^\s*\.ELSEIF\>:^\s*\.ELSE\>:^\s*\.ENDIF\>,'
+ \ .. '^\s*\.REPEAT\>:^\s*\.UNTIL\(CXZ\)\?\>,'
+ \ .. '^\s*\.WHILE\>:^\s*\.ENDW\>,'
+ \ .. '^\s*IF\(1\|2\|E\|DEF\|NDEF\|B\|NB\|IDNI\?\|DIFI\?\)\?\>:^\s*ELSEIF\(1\|2\|E\|DEF\|NDEF\|B\|NB\|IDNI\?\|DIFI\?\)\?\>:^\s*ELSE\>:^\s*ENDIF\>,'
+ \ .. '\(\<MACRO\>\|^\s*%\?\s*FORC\?\>\|^\s*REPEAT\>\|^\s*WHILE\):^\s*ENDM\>,'
+ \ .. '\<PROC\>:\<ENDP\>,'
+ \ .. '\<SEGMENT\>:\<ENDS\>'
+ let b:match_ignorecase = 1
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/matlab.vim b/runtime/ftplugin/matlab.vim
new file mode 100644
index 0000000..d3c74b4
--- /dev/null
+++ b/runtime/ftplugin/matlab.vim
@@ -0,0 +1,34 @@
+" Vim filetype plugin file
+" Language: matlab
+" Maintainer: Jake Wasserman <jwasserman at gmail dot com>
+" Update By: Gabriel Dupras
+" Last Change: 2021 Aug 30
+
+" Contributors:
+" Charles Campbell
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+if exists("loaded_matchit")
+ let s:conditionalEnd = '\%(\%(^\|;\)\s*\)\@<=end\>'
+ let b:match_words=
+ \ '\<\%(if\|switch\|for\|while\|try\)\>:\<\%(elseif\|case\|break\|continue\|else\|otherwise\|catch\)\>:' . s:conditionalEnd . ',' .
+ \ '\<function\>:\<return\>:\<endfunction\>'
+ unlet s:conditionalEnd
+endif
+
+setlocal suffixesadd=.m
+setlocal suffixes+=.asv
+setlocal commentstring=%\ %s
+
+let b:undo_ftplugin = "setlocal suffixesadd< suffixes< commentstring< "
+ \ . "| unlet! b:match_words"
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/mermaid.vim b/runtime/ftplugin/mermaid.vim
new file mode 100644
index 0000000..fe84ab3
--- /dev/null
+++ b/runtime/ftplugin/mermaid.vim
@@ -0,0 +1,49 @@
+" Vim filetype plugin
+" Language: Mermaid
+" Maintainer: Craig MacEachern <https://github.com/craigmac/vim-mermaid>
+" Last Change: 2022 Oct 13
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Use mermaid live editor's style
+setlocal expandtab
+setlocal shiftwidth=2
+setlocal softtabstop=-1
+setlocal tabstop=4
+
+" TODO: comments, formatlist stuff, based on what?
+setlocal comments=b:#,fb:-
+setlocal commentstring=#\ %s
+setlocal formatoptions+=tcqln formatoptions-=r formatoptions-=o
+setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+\\\|^\\[^\\ze[^\\]]\\+\\]:\\&^.\\{4\\}
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= "|setl cms< com< fo< flp< et< ts< sts< sw<"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp< et< ts< sts< sw<"
+endif
+
+if !exists("g:no_plugin_maps") && !exists("g:no_markdown_maps")
+ nnoremap <silent><buffer> [[ :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR>
+ nnoremap <silent><buffer> ]] :<C-U>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR>
+ xnoremap <silent><buffer> [[ :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "bsW")<CR>
+ xnoremap <silent><buffer> ]] :<C-U>exe "normal! gv"<Bar>call search('\%(^#\{1,5\}\s\+\S\\|^\S.*\n^[=-]\+$\)', "sW")<CR>
+ let b:undo_ftplugin .= '|sil! nunmap <buffer> [[|sil! nunmap <buffer> ]]|sil! xunmap <buffer> [[|sil! xunmap <buffer> ]]'
+endif
+
+" if has("folding") && get(g:, "markdown_folding", 0)
+" setlocal foldexpr=MarkdownFold()
+" setlocal foldmethod=expr
+" setlocal foldtext=MarkdownFoldText()
+" let b:undo_ftplugin .= "|setl foldexpr< foldmethod< foldtext<"
+" endif
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:set sw=2:
diff --git a/runtime/ftplugin/meson.vim b/runtime/ftplugin/meson.vim
new file mode 100644
index 0000000..1ce9a03
--- /dev/null
+++ b/runtime/ftplugin/meson.vim
@@ -0,0 +1,39 @@
+" Vim filetype plugin file
+" Language: meson
+" License: VIM License
+" Maintainer: Liam Beguin <liambeguin@gmail.com>
+" Original Author: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+" Last Change: 2018 Nov 27
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+setlocal commentstring=#\ %s
+setlocal comments=:#
+setlocal formatoptions+=croql formatoptions-=t
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+if get(g:, "meson_recommended_style", 1)
+ setlocal expandtab
+ setlocal shiftwidth=2
+ setlocal softtabstop=2
+ let b:undo_ftplugin .= " | setl et< sts< sw<"
+endif
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\<if\>:\<elif\>:\<else\>:\<endif\>,' .
+ \ '\<foreach\>:\<break\>:\<continue\>:\<endforeach\>'
+ let b:undo_ftplugin .= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Meson Build Files (meson.build)\tmeson.build\n" .
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/ftplugin/mf.vim b/runtime/ftplugin/mf.vim
new file mode 100644
index 0000000..5c8c571
--- /dev/null
+++ b/runtime/ftplugin/mf.vim
@@ -0,0 +1,82 @@
+vim9script
+
+# Vim filetype plugin file
+# Language: METAFONT
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2022 Aug 12
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+b:did_ftplugin = 1
+b:undo_ftplugin = "setl com< cms< fo< sua< inc< def< ofu<"
+
+setlocal comments=:%
+setlocal commentstring=%\ %s
+setlocal formatoptions+=cjroql2
+setlocal formatoptions-=t
+setlocal omnifunc=syntaxcomplete#Complete
+setlocal suffixesadd=.mf
+
+&l:include = '\<input\>'
+&l:define = '\<\%(let\|newinternal\|interim\|def\|vardef\)\>\|\<\%(primary\|secondary\|tertiary\)def\>\s*[^ .]\+'
+
+g:omni_syntax_group_include_mf = 'mf\w\+'
+g:omni_syntax_group_exclude_mf = 'mfTodoComment'
+
+if exists("g:loaded_matchit") && !exists("b:match_words")
+ b:match_ignorecase = 0
+ b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name") =~# "mf\\(Comment\\|String\\)$"'
+ 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\>'
+ b:undo_ftplugin ..= "| unlet! b:match_ignorecase b:match_words b:match_skip"
+endif
+
+if !get(g:, 'no_mf_maps', 0) && !get(g:, 'no_plugin_maps', 0)
+ const mf_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\)\>'}
+
+ def MoveAround(count: number, what: string, flags: string)
+ search(mf_regex[what], flags .. 's') # 's' sets previous context mark
+ var i = 2
+ while i <= count
+ search(mf_regex[what], flags)
+ i += 1
+ endwhile
+ enddef
+
+ # Macros to move around
+ nnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ vnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ nnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ vnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ nnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ vnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ nnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ vnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ nnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ vnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ nnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+ vnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+
+ for mapping in ["[[", "]]", "[]", "][", "[{", "]}"]
+ b:undo_ftplugin ..= printf(" | silent! execute 'nunmap <buffer> %s'", mapping)
+ b:undo_ftplugin ..= printf(" | silent! execute 'vunmap <buffer> %s'", mapping)
+ endfor
+endif
+
+if (has('gui_win32') || has('gui_gtk')) && !exists('b:browsefilter')
+ b:browsefilter = "METAFONT Source Files (*.mf)\t*.mf\n"
+ .. "All Files (*.*)\t*.*\n"
+ b:undo_ftplugin ..= ' | unlet! b:browsefilter'
+endif
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/ftplugin/mma.vim b/runtime/ftplugin/mma.vim
new file mode 100644
index 0000000..ce4cee1
--- /dev/null
+++ b/runtime/ftplugin/mma.vim
@@ -0,0 +1,16 @@
+" Vim filetype plugin file
+" Language: Mathematica
+" Maintainer: Ian Ford <ianf@wolfram.com>
+" Last Change: 22 January 2019
+
+" 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 = "setlocal commentstring<"
+
+setlocal commentstring=\(*%s*\)
diff --git a/runtime/ftplugin/modconf.vim b/runtime/ftplugin/modconf.vim
new file mode 100644
index 0000000..c8e76b5
--- /dev/null
+++ b/runtime/ftplugin/modconf.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: modules.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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 include=^\\s*include
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/modula2.vim b/runtime/ftplugin/modula2.vim
new file mode 100644
index 0000000..1d0e81e
--- /dev/null
+++ b/runtime/ftplugin/modula2.vim
@@ -0,0 +1,39 @@
+" Vim filetype plugin file
+" Language: Modula-2
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Apr 08
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=s0:(*,mb:\ ,ex:*)
+setlocal commentstring=(*%s*)
+setlocal formatoptions-=t formatoptions+=croql
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ " The second branch of the middle pattern is intended to match CASE labels
+ let b:match_words = '\<REPEAT\>:\<UNTIL\>,' ..
+ \ '\<\%(BEGIN\|CASE\|FOR\|IF\|LOOP\|WHILE\|WITH\)\>' ..
+ \ ':' ..
+ \ '\<\%(ELSIF\|ELSE\)\>\|\%(^\s*\)\@<=\w\+\%(\s*\,\s*\w\+\)\=\s*\:=\@!' ..
+ \ ':' ..
+ \ '\<END\>'
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Modula-2 Source Files (*.def *.mod)\t*.def;*.mod\n" ..
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl com< cms< fo< " ..
+ \ "| unlet! b:browsefilter b:match_words"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/modula3.vim b/runtime/ftplugin/modula3.vim
new file mode 100644
index 0000000..1f8ab35
--- /dev/null
+++ b/runtime/ftplugin/modula3.vim
@@ -0,0 +1,42 @@
+" Vim filetype plugin file
+" Language: Modula-3
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 June 12
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=s0:(*,mb:\ ,ex:*)
+setlocal commentstring=(*%s*)
+setlocal formatoptions-=t formatoptions+=croql
+setlocal suffixesadd+=.m3
+setlocal formatprg=m3pp
+
+let b:undo_ftplugin = "setlocal com< cms< fo< fp< sua<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\<REPEAT\>:\<UNTIL\>,' ..
+ \ '\<\%(BEGIN\|CASE\|FOR\|IF\|LOCK\|LOOP\|TRY\|TYPECASE\|WHILE\|WITH\|RECORD\|OBJECT\)\>' ..
+ \ ':' ..
+ \ '\<\%(ELSIF\|ELSE\|EXCEPT\|FINALLY\|METHODS\|OVERRIDES\)\>\|\%(^\s*\)\@<=\S.*=>' ..
+ \ ':' ..
+ \ '\<END\>,' ..
+ \ '(\*:\*),<\*:\*>'
+ let b:undo_ftplugin ..= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Modula-3 Source Files (*.m3)\t*.m3\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/mp.vim b/runtime/ftplugin/mp.vim
new file mode 100644
index 0000000..bc5116e
--- /dev/null
+++ b/runtime/ftplugin/mp.vim
@@ -0,0 +1,91 @@
+vim9script
+
+# Vim filetype plugin file
+# Language: MetaPost
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2022 Aug 12
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+b:did_ftplugin = 1
+b:undo_ftplugin = "setl com< cms< fo< sua< inc< def< ofu<"
+
+setlocal comments=:%
+setlocal commentstring=%\ %s
+setlocal formatoptions+=cjroql2
+setlocal formatoptions-=t
+setlocal omnifunc=syntaxcomplete#Complete
+setlocal suffixesadd=.mp,.mpiv,.mpvi,.mpxl
+
+&l:include = '\<\%(input\|loadmodule\)\>' # loadmodule is from MetaFun
+&l:define = '\<\%(let\|newinternal\|interim\|def\|vardef\)\>\|\<\%(primary\|secondary\|tertiary\)def\>\s*[^ .]\+'
+
+g:omni_syntax_group_include_mp = 'mf\w\+,mp\w\+,metafun\w\+'
+g:omni_syntax_group_exclude_mp = 'mfTodoComment'
+
+var fignum: number
+
+def FixBeginfigs()
+ fignum = 1
+ g/^\s*beginfig(\d*)\s*;\(\s*%.*\)\=$/s/^.\{-};/\='beginfig(' .. fignum .. ');'/ | ++fignum
+enddef
+
+command! -buffer -nargs=0 -bar FixBeginfigs FixBeginfigs()
+
+if exists("g:loaded_matchit") && !exists("b:match_words")
+ b:match_ignorecase = 0
+ b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name") =~# "^mf\\%(Comment\\|String\\|\\)$\\|^mpTeXinsert$"'
+ b:match_words = '\<if\>:\<else\%[if]\>:\<fi\>,'
+ .. '\<for\%(\|suffixes\|ever\)\>:\<exit\%(if\|unless\)\>:\<endfor\>,'
+ .. '\<\%(\|var\|primary\|secondary\|tertiary\)def\>:\<enddef\>,'
+ .. '\<begin\(\a\+\)\>:end\1,'
+ .. '\<beginlogochar\>:\<endchar\>'
+ b:undo_ftplugin ..= "| unlet! b:match_ignorecase b:match_words b:match_skip"
+endif
+
+if !get(g:, 'no_mp_maps', 0) && !get(g:, 'no_plugin_maps', 0)
+ const 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\)\>'}
+
+ def MoveAround(count: number, what: string, flags: string)
+ search(mp_regex[what], flags .. 's') # 's' sets previous context mark
+ var i = 2
+ while i <= count
+ search(mp_regex[what], flags)
+ i += 1
+ endwhile
+ enddef
+
+ # Macros to move around
+ nnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ vnoremap <silent><buffer> [[ <scriptcmd>MoveAround(v:count1, "beginsection", "bW")<cr>
+ nnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ vnoremap <silent><buffer> ]] <scriptcmd>MoveAround(v:count1, "beginsection", "W") <cr>
+ nnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ vnoremap <silent><buffer> [] <scriptcmd>MoveAround(v:count1, "endsection", "bW")<cr>
+ nnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ vnoremap <silent><buffer> ][ <scriptcmd>MoveAround(v:count1, "endsection", "W") <cr>
+ nnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ vnoremap <silent><buffer> [{ <scriptcmd>MoveAround(v:count1, "beginblock", "bW")<cr>
+ nnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+ vnoremap <silent><buffer> ]} <scriptcmd>MoveAround(v:count1, "endblock", "W") <cr>
+
+ for mapping in ["[[", "]]", "[]", "][", "[{", "]}"]
+ b:undo_ftplugin ..= printf(" | silent! execute 'nunmap <buffer> %s'", mapping)
+ b:undo_ftplugin ..= printf(" | silent! execute 'vunmap <buffer> %s'", mapping)
+ endfor
+endif
+
+if (has('gui_win32') || has('gui_gtk')) && !exists('b:browsefilter')
+ b:browsefilter = "MetaPost Source Files (*.mp)\t*.mp\n"
+ .. "All Files (*.*)\t*.*\n"
+ b:undo_ftplugin ..= ' | unlet! b:browsefilter'
+endif
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/ftplugin/mplayerconf.vim b/runtime/ftplugin/mplayerconf.vim
new file mode 100644
index 0000000..8654760
--- /dev/null
+++ b/runtime/ftplugin/mplayerconf.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: mplayer(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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 include=^\\s*include
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/mrxvtrc.vim b/runtime/ftplugin/mrxvtrc.vim
new file mode 100644
index 0000000..15cc0db
--- /dev/null
+++ b/runtime/ftplugin/mrxvtrc.vim
@@ -0,0 +1,22 @@
+" Created : Wed 26 Apr 2006 01:20:53 AM CDT
+" Modified : Fri 28 Apr 2006 03:24:01 AM CDT
+" Author : Gautam Iyer <gi1242@users.sourceforge.net>
+" Description : ftplugin for mrxvtrc
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+" Really any line that does not match an option is a comment. But use '!' for
+" compatibility with x-defaults files, and "#" (preferred) for compatibility
+" with all other config files.
+"
+" Comments beginning with "#" are preferred because Vim will not flag the
+" first word as a spelling error if it is not capitalised. The '!' used as
+" comment leaders makes Vim think that every comment line is a new sentence.
+
+setlocal comments=:!,:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
diff --git a/runtime/ftplugin/msmessages.vim b/runtime/ftplugin/msmessages.vim
new file mode 100644
index 0000000..791eafe
--- /dev/null
+++ b/runtime/ftplugin/msmessages.vim
@@ -0,0 +1,40 @@
+" Vim filetype plugin file
+" Language: MS Message files (*.mc)
+" Maintainer: Kevin Locke <kwl7@cornell.edu>
+" Last Change: 2008 April 09
+" Location: http://kevinlocke.name/programs/vim/syntax/msmessages.vim
+
+" Based on c.vim
+
+" 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
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< cms< | unlet! b:browsefilter"
+
+" Set 'formatoptions' to format all lines, including comments
+setlocal fo-=ct fo+=roql
+
+" Comments includes both ";" which describes a "comment" which will be
+" converted to C code and variants on "; //" which will remain comments
+" in the generated C code
+setlocal comments=:;,:;//,:;\ //,s:;\ /*\ ,m:;\ \ *\ ,e:;\ \ */
+setlocal commentstring=;\ //\ %s
+
+" Win32 can filter files in the browse dialog
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "MS Message Files (*.mc)\t*.mc\n" .
+ \ "Resource Files (*.rc)\t*.rc\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/muttrc.vim b/runtime/ftplugin/muttrc.vim
new file mode 100644
index 0000000..c8ad0f2
--- /dev/null
+++ b/runtime/ftplugin/muttrc.vim
@@ -0,0 +1,22 @@
+" Vim filetype plugin file
+" Language: mutt RC File
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+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/nanorc.vim b/runtime/ftplugin/nanorc.vim
new file mode 100644
index 0000000..e45ebac
--- /dev/null
+++ b/runtime/ftplugin/nanorc.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" 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
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/neomuttrc.vim b/runtime/ftplugin/neomuttrc.vim
new file mode 100644
index 0000000..86f1cde
--- /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
new file mode 100644
index 0000000..02ee327
--- /dev/null
+++ b/runtime/ftplugin/netrc.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: netrc(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments= commentstring= formatoptions-=tcroq formatoptions+=l
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/nginx.vim b/runtime/ftplugin/nginx.vim
new file mode 100644
index 0000000..e808db1
--- /dev/null
+++ b/runtime/ftplugin/nginx.vim
@@ -0,0 +1,6 @@
+" Vim filetype plugin
+" Language: nginx.conf
+" Maintainer: Chris Aumann <me@chr4.org>
+" Last Change: Apr 15, 2017
+
+setlocal commentstring=#\ %s
diff --git a/runtime/ftplugin/nroff.vim b/runtime/ftplugin/nroff.vim
new file mode 100644
index 0000000..cf62d02
--- /dev/null
+++ b/runtime/ftplugin/nroff.vim
@@ -0,0 +1,17 @@
+" Vim filetype plugin
+" Language: roff(7)
+" Maintainer: Aman Verma
+" Homepage: https://github.com/a-vrma/vim-nroff-ftplugin
+" Previous Maintainer: Chris Spiegel <cspiegel@gmail.com>
+" Last Change: 2020 Nov 21
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=.\\\"%s
+setlocal comments=:.\\\"
+setlocal sections+=Sh
+
+let b:undo_ftplugin = 'setlocal commentstring< comments< sections<'
diff --git a/runtime/ftplugin/nsis.vim b/runtime/ftplugin/nsis.vim
new file mode 100644
index 0000000..3dc0d63
--- /dev/null
+++ b/runtime/ftplugin/nsis.vim
@@ -0,0 +1,43 @@
+" Vim ftplugin file
+" Language: NSIS script
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/vim-nsis
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2021-10-18
+
+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<"
+
+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\>'
+ let b:undo_ftplugin .= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/objc.vim b/runtime/ftplugin/objc.vim
new file mode 100644
index 0000000..e41beb5
--- /dev/null
+++ b/runtime/ftplugin/objc.vim
@@ -0,0 +1,12 @@
+" Vim filetype plugin file
+" Language: Objective C
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2003 Jan 15
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves just like C
+runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim
diff --git a/runtime/ftplugin/obse.vim b/runtime/ftplugin/obse.vim
new file mode 100644
index 0000000..6d865f0
--- /dev/null
+++ b/runtime/ftplugin/obse.vim
@@ -0,0 +1,70 @@
+" Vim filetype plugin file
+" Language: Oblivion Language (obl)
+" Original Creator: Kat <katisntgood@gmail.com>
+" Maintainer: Kat <katisntgood@gmail.com>
+" Created: August 08, 2021
+" Last Change: 13 November 2022
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms<"
+
+noremap <script> <buffer> <silent> [[ <nop>
+noremap <script> <buffer> <silent> ]] <nop>
+
+noremap <script> <buffer> <silent> [] <nop>
+noremap <script> <buffer> <silent> ][ <nop>
+
+setlocal commentstring=;%s
+setlocal comments=:;
+
+function s:NextSection(type, backwards, visual)
+ if a:visual
+ normal! gv
+ endif
+
+ if a:type == 1
+ let pattern = '\v(\n\n^\S|%^)'
+ let flags = 'e'
+ elseif a:type == 2
+ let pattern = '\v^\S.*'
+ let flags = ''
+ endif
+
+ if a:backwards
+ let dir = '?'
+ else
+ let dir = '/'
+ endif
+
+ execute 'silent normal! ' . dir . pattern . dir . flags . "\r"
+endfunction
+
+noremap <script> <buffer> <silent> ]]
+ \ :call <SID>NextSection(1, 0, 0)<cr>
+
+noremap <script> <buffer> <silent> [[
+ \ :call <SID>NextSection(1, 1, 0)<cr>
+
+noremap <script> <buffer> <silent> ][
+ \ :call <SID>NextSection(2, 0, 0)<cr>
+
+noremap <script> <buffer> <silent> []
+ \ :call <SID>NextSection(2, 1, 0)<cr>
+
+vnoremap <script> <buffer> <silent> ]]
+ \ :<c-u>call <SID>NextSection(1, 0, 1)<cr>
+vnoremap <script> <buffer> <silent> [[
+ \ :<c-u>call <SID>NextSection(1, 1, 1)<cr>
+vnoremap <script> <buffer> <silent> ][
+ \ :<c-u>call <SID>NextSection(2, 0, 1)<cr>
+vnoremap <script> <buffer> <silent> []
+ \ :<c-u>call <SID>NextSection(2, 1, 1)<cr>
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/ocaml.vim b/runtime/ftplugin/ocaml.vim
new file mode 100644
index 0000000..20172c9
--- /dev/null
+++ b/runtime/ftplugin/ocaml.vim
@@ -0,0 +1,643 @@
+" Language: OCaml
+" Maintainer: David Baelde <firstname.name@ens-lyon.org>
+" Mike Leary <leary@nwlink.com>
+" Markus Mottl <markus.mottl@gmail.com>
+" Pierre Vittet <pierre-vittet@pvittet.com>
+" Stefano Zacchiroli <zack@bononia.it>
+" Vincent Aravantinos <firstname.name@imag.fr>
+" URL: https://github.com/ocaml/vim-ocaml
+" Last Change:
+" 2013 Oct 27 - Added commentstring (MM)
+" 2013 Jul 26 - load default compiler settings (MM)
+" 2013 Jul 24 - removed superfluous efm-setting (MM)
+" 2013 Jul 22 - applied fixes supplied by Hirotaka Hamada (MM)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin=1
+
+" Use standard compiler settings unless user wants otherwise
+if !exists("current_compiler")
+ :compiler ocaml
+endif
+
+" some macro
+if exists('*fnameescape')
+ function! s:Fnameescape(s)
+ return fnameescape(a:s)
+ endfun
+else
+ function! s:Fnameescape(s)
+ return escape(a:s," \t\n*?[{`$\\%#'\"|!<")
+ endfun
+endif
+
+" Error handling -- helps moving where the compiler wants you to go
+let s:cposet=&cpoptions
+set cpo&vim
+
+" Comment string
+setlocal comments=sr:(*\ ,mb:\ ,ex:*)
+setlocal comments^=sr:(**,mb:\ \ ,ex:*)
+setlocal commentstring=(*%s*)
+
+" Add mappings, unless the user didn't want this.
+if !exists("no_plugin_maps") && !exists("no_ocaml_maps")
+ " (un)commenting
+ if !hasmapto('<Plug>Comment')
+ nmap <buffer> <LocalLeader>c <Plug>LUncomOn
+ xmap <buffer> <LocalLeader>c <Plug>BUncomOn
+ nmap <buffer> <LocalLeader>C <Plug>LUncomOff
+ xmap <buffer> <LocalLeader>C <Plug>BUncomOff
+ endif
+
+ nnoremap <buffer> <Plug>LUncomOn gI(* <End> *)<ESC>
+ nnoremap <buffer> <Plug>LUncomOff :s/^(\* \(.*\) \*)/\1/<CR>:noh<CR>
+ xnoremap <buffer> <Plug>BUncomOn <ESC>:'<,'><CR>`<O<ESC>0i(*<ESC>`>o<ESC>0i*)<ESC>`<
+ xnoremap <buffer> <Plug>BUncomOff <ESC>:'<,'><CR>`<dd`>dd`<
+
+ nmap <buffer> <LocalLeader>s <Plug>OCamlSwitchEdit
+ nmap <buffer> <LocalLeader>S <Plug>OCamlSwitchNewWin
+
+ nmap <buffer> <LocalLeader>t <Plug>OCamlPrintType
+ xmap <buffer> <LocalLeader>t <Plug>OCamlPrintType
+endif
+
+" Let % jump between structure elements (due to Issac Trotts)
+let b:mw = '\<let\>:\<and\>:\(\<in\>\|;;\)'
+let b:mw = b:mw . ',\<if\>:\<then\>:\<else\>'
+let b:mw = b:mw . ',\<\(for\|while\)\>:\<do\>:\<done\>'
+let b:mw = b:mw . ',\<\(object\|sig\|struct\|begin\)\>:\<end\>'
+let b:mw = b:mw . ',\<\(match\|try\)\>:\<with\>'
+let b:match_words = b:mw
+
+let b:match_ignorecase=0
+
+function! s:OcpGrep(bang,args) abort
+ let grepprg = &l:grepprg
+ let grepformat = &l:grepformat
+ let shellpipe = &shellpipe
+ try
+ let &l:grepprg = "ocp-grep -c never"
+ setlocal grepformat=%f:%l:%m
+ if &shellpipe ==# '2>&1| tee' || &shellpipe ==# '|& tee'
+ let &shellpipe = "| tee"
+ endif
+ execute 'grep! '.a:args
+ if empty(a:bang) && !empty(getqflist())
+ return 'cfirst'
+ else
+ return ''
+ endif
+ finally
+ let &l:grepprg = grepprg
+ let &l:grepformat = grepformat
+ let &shellpipe = shellpipe
+ endtry
+endfunction
+command! -bar -bang -complete=file -nargs=+ Ocpgrep exe s:OcpGrep(<q-bang>, <q-args>)
+
+" switching between interfaces (.mli) and implementations (.ml)
+if !exists("g:did_ocaml_switch")
+ let g:did_ocaml_switch = 1
+ nnoremap <Plug>OCamlSwitchEdit :<C-u>call OCaml_switch(0)<CR>
+ nnoremap <Plug>OCamlSwitchNewWin :<C-u>call OCaml_switch(1)<CR>
+ fun OCaml_switch(newwin)
+ if (match(bufname(""), "\\.mli$") >= 0)
+ let fname = s:Fnameescape(substitute(bufname(""), "\\.mli$", ".ml", ""))
+ if (a:newwin == 1)
+ exec "new " . fname
+ else
+ exec "arge " . fname
+ endif
+ elseif (match(bufname(""), "\\.ml$") >= 0)
+ let fname = s:Fnameescape(bufname("")) . "i"
+ if (a:newwin == 1)
+ exec "new " . fname
+ else
+ exec "arge " . fname
+ endif
+ endif
+ endfun
+endif
+
+" Folding support
+
+" Get the modeline because folding depends on indentation
+let lnum = search('^\s*(\*:o\?caml:', 'n')
+let s:modeline = lnum? getline(lnum): ""
+
+" Get the indentation params
+let s:m = matchstr(s:modeline,'default\s*=\s*\d\+')
+if s:m != ""
+ let s:idef = matchstr(s:m,'\d\+')
+elseif exists("g:omlet_indent")
+ let s:idef = g:omlet_indent
+else
+ let s:idef = 2
+endif
+let s:m = matchstr(s:modeline,'struct\s*=\s*\d\+')
+if s:m != ""
+ let s:i = matchstr(s:m,'\d\+')
+elseif exists("g:omlet_indent_struct")
+ let s:i = g:omlet_indent_struct
+else
+ let s:i = s:idef
+endif
+
+" Set the folding method
+if exists("g:ocaml_folding")
+ setlocal foldmethod=expr
+ setlocal foldexpr=OMLetFoldLevel(v:lnum)
+endif
+
+let b:undo_ftplugin = "setlocal efm< foldmethod< foldexpr<"
+ \ . "| unlet! b:mw b:match_words b:match_ignorecase"
+
+
+" - Only definitions below, executed once -------------------------------------
+
+if exists("*OMLetFoldLevel")
+ let &cpoptions = s:cposet
+ unlet s:cposet
+ finish
+endif
+
+function s:topindent(lnum)
+ let l = a:lnum
+ while l > 0
+ if getline(l) =~ '\s*\%(\<struct\>\|\<sig\>\|\<object\>\)'
+ return indent(l)
+ endif
+ let l = l-1
+ endwhile
+ return -s:i
+endfunction
+
+function OMLetFoldLevel(l)
+
+ " This is for not merging blank lines around folds to them
+ if getline(a:l) !~ '\S'
+ return -1
+ endif
+
+ " We start folds for modules, classes, and every toplevel definition
+ if getline(a:l) =~ '^\s*\%(\<val\>\|\<module\>\|\<class\>\|\<type\>\|\<method\>\|\<initializer\>\|\<inherit\>\|\<exception\>\|\<external\>\)'
+ exe 'return ">' (indent(a:l)/s:i)+1 '"'
+ endif
+
+ " Toplevel let are detected thanks to the indentation
+ if getline(a:l) =~ '^\s*let\>' && indent(a:l) == s:i+s:topindent(a:l)
+ exe 'return ">' (indent(a:l)/s:i)+1 '"'
+ endif
+
+ " We close fold on end which are associated to struct, sig or object.
+ " We use syntax information to do that.
+ if getline(a:l) =~ '^\s*end\>' && synIDattr(synID(a:l, indent(a:l)+1, 0), "name") != "ocamlKeyword"
+ return (indent(a:l)/s:i)+1
+ endif
+
+ " Folds end on ;;
+ if getline(a:l) =~ '^\s*;;'
+ exe 'return "<' (indent(a:l)/s:i)+1 '"'
+ endif
+
+ " Comments around folds aren't merged to them.
+ if synIDattr(synID(a:l, indent(a:l)+1, 0), "name") == "ocamlComment"
+ return -1
+ endif
+
+ return '='
+endfunction
+
+" Vim support for OCaml .annot files
+"
+" Last Change: 2007 Jul 17
+" Maintainer: Vincent Aravantinos <vincent.aravantinos@gmail.com>
+" License: public domain
+"
+" Originally inspired by 'ocaml-dtypes.vim' by Stefano Zacchiroli.
+" The source code is quite radically different for we not use python anymore.
+" However this plugin should have the exact same behaviour, that's why the
+" following lines are the quite exact copy of Stefano's original plugin :
+"
+" <<
+" Executing Ocaml_print_type(<mode>) function will display in the Vim bottom
+" line(s) the type of an ocaml value getting it from the corresponding .annot
+" file (if any). If Vim is in visual mode, <mode> should be "visual" and the
+" selected ocaml value correspond to the highlighted text, otherwise (<mode>
+" can be anything else) it corresponds to the literal found at the current
+" cursor position.
+"
+" Typing '<LocalLeader>t' (LocalLeader defaults to '\', see :h LocalLeader)
+" will cause " Ocaml_print_type function to be invoked with the right
+" argument depending on the current mode (visual or not).
+" >>
+"
+" If you find something not matching this behaviour, please signal it.
+"
+" Differences are:
+" - no need for python support
+" + plus : more portable
+" + minus: no more lazy parsing, it looks very fast however
+"
+" - ocamlbuild support, ie.
+" + the plugin finds the _build directory and looks for the
+" corresponding file inside;
+" + if the user decides to change the name of the _build directory thanks
+" to the '-build-dir' option of ocamlbuild, the plugin will manage in
+" most cases to find it out (most cases = if the source file has a unique
+" name among your whole project);
+" + if ocamlbuild is not used, the usual behaviour holds; ie. the .annot
+" file should be in the same directory as the source file;
+" + for vim plugin programmers:
+" the variable 'b:_build_dir' contains the inferred path to the build
+" directory, even if this one is not named '_build'.
+"
+" Bonus :
+" - latin1 accents are handled
+" - lists are handled, even on multiple lines, you don't need the visual mode
+" (the cursor must be on the first bracket)
+" - parenthesized expressions, arrays, and structures (ie. '(...)', '[|...|]',
+" and '{...}') are handled the same way
+
+ " Copied from Stefano's original plugin :
+ " <<
+ " .annot ocaml file representation
+ "
+ " File format (copied verbatim from caml-types.el)
+ "
+ " file ::= block *
+ " block ::= position <SP> position <LF> annotation *
+ " position ::= filename <SP> num <SP> num <SP> num
+ " annotation ::= keyword open-paren <LF> <SP> <SP> data <LF> close-paren
+ "
+ " <SP> is a space character (ASCII 0x20)
+ " <LF> is a line-feed character (ASCII 0x0A)
+ " num is a sequence of decimal digits
+ " filename is a string with the lexical conventions of O'Caml
+ " open-paren is an open parenthesis (ASCII 0x28)
+ " close-paren is a closed parenthesis (ASCII 0x29)
+ " data is any sequence of characters where <LF> is always followed by
+ " at least two space characters.
+ "
+ " - in each block, the two positions are respectively the start and the
+ " end of the range described by the block.
+ " - in a position, the filename is the name of the file, the first num
+ " is the line number, the second num is the offset of the beginning
+ " of the line, the third num is the offset of the position itself.
+ " - the char number within the line is the difference between the third
+ " and second nums.
+ "
+ " For the moment, the only possible keyword is \"type\"."
+ " >>
+
+
+" 1. Finding the annotation file even if we use ocamlbuild
+
+ " In: two strings representing paths
+ " Out: one string representing the common prefix between the two paths
+ function! s:Find_common_path (p1,p2)
+ let temp = a:p2
+ while matchstr(a:p1,temp) == ''
+ let temp = substitute(temp,'/[^/]*$','','')
+ endwhile
+ return temp
+ endfun
+
+ " After call:
+ "
+ " Following information have been put in s:annot_file_list, using
+ " annot_file_name name as key:
+ " - annot_file_path :
+ " path to the .annot file corresponding to the
+ " source file (dealing with ocamlbuild stuff)
+ " - _build_path:
+ " path to the build directory even if this one is
+ " not named '_build'
+ " - date_of_last annot:
+ " Set to 0 until we load the file. It contains the
+ " date at which the file has been loaded.
+ function! s:Locate_annotation()
+ let annot_file_name = s:Fnameescape(expand('%:t:r')).'.annot'
+ if !exists ("s:annot_file_list[annot_file_name]")
+ silent exe 'cd' s:Fnameescape(expand('%:p:h'))
+ " 1st case : the annot file is in the same directory as the buffer (no ocamlbuild)
+ let annot_file_path = findfile(annot_file_name,'.')
+ if annot_file_path != ''
+ let annot_file_path = getcwd().'/'.annot_file_path
+ let _build_path = ''
+ else
+ " 2nd case : the buffer and the _build directory are in the same directory
+ " ..
+ " / \
+ " / \
+ " _build .ml
+ "
+ let _build_path = finddir('_build','.')
+ if _build_path != ''
+ let _build_path = getcwd().'/'._build_path
+ let annot_file_path = findfile(annot_file_name,'_build')
+ if annot_file_path != ''
+ let annot_file_path = getcwd().'/'.annot_file_path
+ endif
+ else
+ " 3rd case : the _build directory is in a directory higher in the file hierarchy
+ " (it can't be deeper by ocamlbuild requirements)
+ " ..
+ " / \
+ " / \
+ " _build ...
+ " \
+ " \
+ " .ml
+ "
+ let _build_path = finddir('_build',';')
+ if _build_path != ''
+ let project_path = substitute(_build_path,'/_build$','','')
+ let path_relative_to_project = s:Fnameescape(substitute(expand('%:p:h'),project_path.'/','',''))
+ let annot_file_path = findfile(annot_file_name,project_path.'/_build/'.path_relative_to_project)
+ else
+ let annot_file_path = findfile(annot_file_name,'**')
+ "4th case : what if the user decided to change the name of the _build directory ?
+ " -> we relax the constraints, it should work in most cases
+ if annot_file_path != ''
+ " 4a. we suppose the renamed _build directory is in the current directory
+ let _build_path = matchstr(annot_file_path,'^[^/]*')
+ if annot_file_path != ''
+ let annot_file_path = getcwd().'/'.annot_file_path
+ let _build_path = getcwd().'/'._build_path
+ endif
+ else
+ let annot_file_name = ''
+ "(Pierre Vittet: I have commented 4b because this was crashing
+ "my vim (it produced infinite loop))
+ "
+ " 4b. anarchy : the renamed _build directory may be higher in the hierarchy
+ " this will work if the file for which we are looking annotations has a unique name in the whole project
+ " if this is not the case, it may still work, but no warranty here
+ "let annot_file_path = findfile(annot_file_name,'**;')
+ "let project_path = s:Find_common_path(annot_file_path,expand('%:p:h'))
+ "let _build_path = matchstr(annot_file_path,project_path.'/[^/]*')
+ endif
+ endif
+ endif
+ endif
+
+ if annot_file_path == ''
+ throw 'E484: no annotation file found'
+ endif
+
+ silent exe 'cd' '-'
+ let s:annot_file_list[annot_file_name]= [annot_file_path, _build_path, 0]
+ endif
+ endfun
+
+ " This variable contains a dictionary of lists. Each element of the dictionary
+ " represents an annotation system. An annotation system is a list with:
+ " - annotation file name as its key
+ " - annotation file path as first element of the contained list
+ " - build path as second element of the contained list
+ " - annot_file_last_mod (contain the date of .annot file) as third element
+ let s:annot_file_list = {}
+
+" 2. Finding the type information in the annotation file
+
+ " a. The annotation file is opened in vim as a buffer that
+ " should be (almost) invisible to the user.
+
+ " After call:
+ " The current buffer is now the one containing the .annot file.
+ " We manage to keep all this hidden to the user's eye.
+ function! s:Enter_annotation_buffer(annot_file_path)
+ let s:current_pos = getpos('.')
+ let s:current_hidden = &l:hidden
+ set hidden
+ let s:current_buf = bufname('%')
+ if bufloaded(a:annot_file_path)
+ silent exe 'keepj keepalt' 'buffer' s:Fnameescape(a:annot_file_path)
+ else
+ silent exe 'keepj keepalt' 'view' s:Fnameescape(a:annot_file_path)
+ endif
+ call setpos(".", [0, 0 , 0 , 0])
+ endfun
+
+ " After call:
+ " The original buffer has been restored in the exact same state as before.
+ function! s:Exit_annotation_buffer()
+ silent exe 'keepj keepalt' 'buffer' s:Fnameescape(s:current_buf)
+ let &l:hidden = s:current_hidden
+ call setpos('.',s:current_pos)
+ endfun
+
+ " After call:
+ " The annot file is loaded and assigned to a buffer.
+ " This also handles the modification date of the .annot file, eg. after a
+ " compilation (return an updated annot_file_list).
+ function! s:Load_annotation(annot_file_name)
+ let annot = s:annot_file_list[a:annot_file_name]
+ let annot_file_path = annot[0]
+ let annot_file_last_mod = 0
+ if exists("annot[2]")
+ let annot_file_last_mod = annot[2]
+ endif
+ if bufloaded(annot_file_path) && annot_file_last_mod < getftime(annot_file_path)
+ " if there is a more recent file
+ let nr = bufnr(annot_file_path)
+ silent exe 'keepj keepalt' 'bunload' nr
+ endif
+ if !bufloaded(annot_file_path)
+ call s:Enter_annotation_buffer(annot_file_path)
+ setlocal nobuflisted
+ setlocal bufhidden=hide
+ setlocal noswapfile
+ setlocal buftype=nowrite
+ call s:Exit_annotation_buffer()
+ let annot[2] = getftime(annot_file_path)
+ " List updated with the new date
+ let s:annot_file_list[a:annot_file_name] = annot
+ endif
+ endfun
+
+ "b. 'search' and 'match' work to find the type information
+
+ "In: - lin1,col1: position of expression first char
+ " - lin2,col2: position of expression last char
+ "Out: - the pattern to be looked for to find the block
+ " Must be called in the source buffer (use of line2byte)
+ function! s:Block_pattern(lin1,lin2,col1,col2)
+ let start_num1 = a:lin1
+ let start_num2 = line2byte(a:lin1) - 1
+ let start_num3 = start_num2 + a:col1
+ let path = '"\(\\"\|[^"]\)\+"'
+ let start_pos = path.' '.start_num1.' '.start_num2.' '.start_num3
+ let end_num1 = a:lin2
+ let end_num2 = line2byte(a:lin2) - 1
+ let end_num3 = end_num2 + a:col2
+ let end_pos = path.' '.end_num1.' '.end_num2.' '.end_num3
+ return '^'.start_pos.' '.end_pos."$"
+ " rq: the '^' here is not totally correct regarding the annot file "grammar"
+ " but currently the annotation file respects this, and it's a little bit faster with the '^';
+ " can be removed safely.
+ endfun
+
+ "In: (the cursor position should be at the start of an annotation)
+ "Out: the type information
+ " Must be called in the annotation buffer (use of search)
+ function! s:Match_data()
+ " rq: idem as previously, in the following, the '^' at start of patterns is not necessary
+ keepj while search('^type($','ce',line(".")) == 0
+ keepj if search('^.\{-}($','e') == 0
+ throw "no_annotation"
+ endif
+ keepj if searchpair('(','',')') == 0
+ throw "malformed_annot_file"
+ endif
+ endwhile
+ let begin = line(".") + 1
+ keepj if searchpair('(','',')') == 0
+ throw "malformed_annot_file"
+ endif
+ let end = line(".") - 1
+ return join(getline(begin,end),"\n")
+ endfun
+
+ "In: the pattern to look for in order to match the block
+ "Out: the type information (calls s:Match_data)
+ " Should be called in the annotation buffer
+ function! s:Extract_type_data(block_pattern, annot_file_name)
+ let annot_file_path = s:annot_file_list[a:annot_file_name][0]
+ call s:Enter_annotation_buffer(annot_file_path)
+ try
+ if search(a:block_pattern,'e') == 0
+ throw "no_annotation"
+ endif
+ call cursor(line(".") + 1,1)
+ let annotation = s:Match_data()
+ finally
+ call s:Exit_annotation_buffer()
+ endtry
+ return annotation
+ endfun
+
+ "c. link this stuff with what the user wants
+ " ie. get the expression selected/under the cursor
+
+ let s:ocaml_word_char = '\w|[\xc0-\xff]|'''
+
+ "In: the current mode (eg. "visual", "normal", etc.)
+ "Out: the borders of the expression we are looking for the type
+ function! s:Match_borders(mode)
+ if a:mode == "visual"
+ let cur = getpos(".")
+ normal `<
+ let col1 = col(".")
+ let lin1 = line(".")
+ normal `>
+ let col2 = col(".")
+ let lin2 = line(".")
+ call cursor(cur[1],cur[2])
+ return [lin1,lin2,col1-1,col2]
+ else
+ let cursor_line = line(".")
+ let cursor_col = col(".")
+ let line = getline('.')
+ if line[cursor_col-1:cursor_col] == '[|'
+ let [lin2,col2] = searchpairpos('\[|','','|\]','n')
+ return [cursor_line,lin2,cursor_col-1,col2+1]
+ elseif line[cursor_col-1] == '['
+ let [lin2,col2] = searchpairpos('\[','','\]','n')
+ return [cursor_line,lin2,cursor_col-1,col2]
+ elseif line[cursor_col-1] == '('
+ let [lin2,col2] = searchpairpos('(','',')','n')
+ return [cursor_line,lin2,cursor_col-1,col2]
+ elseif line[cursor_col-1] == '{'
+ let [lin2,col2] = searchpairpos('{','','}','n')
+ return [cursor_line,lin2,cursor_col-1,col2]
+ else
+ let [lin1,col1] = searchpos('\v%('.s:ocaml_word_char.'|\.)*','ncb')
+ let [lin2,col2] = searchpos('\v%('.s:ocaml_word_char.'|\.)*','nce')
+ if col1 == 0 || col2 == 0
+ throw "no_expression"
+ endif
+ return [cursor_line,cursor_line,col1-1,col2]
+ endif
+ endif
+ endfun
+
+ "In: the current mode (eg. "visual", "normal", etc.)
+ "Out: the type information (calls s:Extract_type_data)
+ function! s:Get_type(mode, annot_file_name)
+ let [lin1,lin2,col1,col2] = s:Match_borders(a:mode)
+ return s:Extract_type_data(s:Block_pattern(lin1,lin2,col1,col2), a:annot_file_name)
+ endfun
+
+ "In: A string destined to be printed in the 'echo buffer'. It has line
+ "break and 2 space at each line beginning.
+ "Out: A string destined to be yanked, without space and double space.
+ function s:unformat_ocaml_type(res)
+ "Remove end of line.
+ let res = substitute (a:res, "\n", "", "g" )
+ "remove double space
+ let res =substitute(res , " ", " ", "g")
+ "remove space at beginning of string.
+ let res = substitute(res, "^ *", "", "g")
+ return res
+ endfunction
+
+ "d. main
+ "In: the current mode (eg. "visual", "normal", etc.)
+ "After call: the type information is displayed
+ if !exists("*Ocaml_get_type")
+ function Ocaml_get_type(mode)
+ let annot_file_name = s:Fnameescape(expand('%:t:r')).'.annot'
+ call s:Locate_annotation()
+ call s:Load_annotation(annot_file_name)
+ let res = s:Get_type(a:mode, annot_file_name)
+ " Copy result in the unnamed buffer
+ let @" = s:unformat_ocaml_type(res)
+ return res
+ endfun
+ endif
+
+ if !exists("*Ocaml_get_type_or_not")
+ function Ocaml_get_type_or_not(mode)
+ let t=reltime()
+ try
+ let res = Ocaml_get_type(a:mode)
+ return res
+ catch
+ return ""
+ endtry
+ endfun
+ endif
+
+ if !exists("*Ocaml_print_type")
+ function Ocaml_print_type(mode)
+ if expand("%:e") == "mli"
+ echohl ErrorMsg | echo "No annotations for interface (.mli) files" | echohl None
+ return
+ endif
+ try
+ echo Ocaml_get_type(a:mode)
+ catch /E484:/
+ echohl ErrorMsg | echo "No type annotations (.annot) file found" | echohl None
+ catch /no_expression/
+ echohl ErrorMsg | echo "No expression found under the cursor" | echohl None
+ catch /no_annotation/
+ echohl ErrorMsg | echo "No type annotation found for the given text" | echohl None
+ catch /malformed_annot_file/
+ echohl ErrorMsg | echo "Malformed .annot file" | echohl None
+ endtry
+ endfun
+ endif
+
+" Maps
+ nnoremap <silent> <Plug>OCamlPrintType :<C-U>call Ocaml_print_type("normal")<CR>
+ xnoremap <silent> <Plug>OCamlPrintType :<C-U>call Ocaml_print_type("visual")<CR>`<
+
+let &cpoptions = s:cposet
+unlet s:cposet
+
+" vim:sw=2 fdm=indent
diff --git a/runtime/ftplugin/occam.vim b/runtime/ftplugin/occam.vim
new file mode 100644
index 0000000..e9b7c01
--- /dev/null
+++ b/runtime/ftplugin/occam.vim
@@ -0,0 +1,49 @@
+" Vim filetype plugin file
+" Language: occam
+" Copyright: Christian Jacobsen <clj3@kent.ac.uk>, Mario Schweigler <ms44@kent.ac.uk>
+" Maintainer: Mario Schweigler <ms44@kent.ac.uk>
+" Last Change: 23 April 2003
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+"{{{ Indent settings
+" Set shift width for indent
+setlocal shiftwidth=2
+" Set the tab key size to two spaces
+setlocal softtabstop=2
+" Let tab keys always be expanded to spaces
+setlocal expandtab
+"}}}
+
+"{{{ Formatting
+" Break comment lines and insert comment leader in this case
+setlocal formatoptions-=t formatoptions+=cql
+setlocal comments+=:--
+" Maximum length of comments is 78
+setlocal textwidth=78
+"}}}
+
+"{{{ File browsing filters
+" Win32 can filter files in the browse dialog
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "All Occam Files (*.occ *.inc)\t*.occ;*.inc\n" .
+ \ "Occam Include Files (*.inc)\t*.inc\n" .
+ \ "Occam Source Files (*.occ)\t*.occ\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+"}}}
+
+"{{{ Undo settings
+let b:undo_ftplugin = "setlocal shiftwidth< softtabstop< expandtab<"
+ \ . " formatoptions< comments< textwidth<"
+ \ . "| unlet! b:browsefiler"
+"}}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/ftplugin/octave.vim b/runtime/ftplugin/octave.vim
new file mode 100644
index 0000000..7cab7c2
--- /dev/null
+++ b/runtime/ftplugin/octave.vim
@@ -0,0 +1,63 @@
+" Vim filetype plugin file
+" Language: GNU Octave
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Sep 02
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" TODO: update Matlab ftplugin and source it as the base file?
+
+setlocal comments=s:%{,m:\ ,e:%},s:#{,m:\ ,e:#},:%,:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal keywordprg=info\ octave\ --vi-keys\ --index-search
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\<unwind_protect\>:\<unwind_protect_cleanup\>:\<end_unwind_protect\>'
+ if exists("octave_use_matlab_end")
+ let b:match_words ..= ',' ..
+ \ '\<\%(classdef\|enumeration\|events\|for\|function\|if\|methods\|parfor\|properties\|switch\|while\|try\)\>' ..
+ \ ':' ..
+ \ '\<\%(elseif\|else\|case\|otherwise\|break\|continue\|catch\)\>' ..
+ \ ':' ..
+ \ '\<end\>'
+ else
+ let b:match_words ..= ',' ..
+ \ '\<classdef\>:\<endclassdef\>,' ..
+ \ '\<enumeration\>:\<endenumeration\>,' ..
+ \ '\<events\>:\<endevents\>,' ..
+ \ '\<do\>:\<\%(break\|continue\)\>:\<until\>' ..
+ \ '\<for\>:\<\%(break\|continue\)\>:\<endfor\>,' ..
+ \ '\<function\>:\<return\>:\<endfunction\>,' ..
+ \ '\<if\>:\<\%(elseif\|else\)\>:\<endif\>,' ..
+ \ '\<methods\>:\<endmethods\>,' ..
+ \ '\<parfor\>:\<endparfor\>,' ..
+ \ '\<properties\>:\<endproperties\>,' ..
+ \ '\<switch\>:\<\%(case\|otherwise\)\>:\<endswitch\>,' ..
+ \ '\<while\>:\<\%(break\|continue\)\>:\<endwhile\>,' ..
+ \ '\<try\>:\<catch\>:\<end_try_catch\>'
+ endif
+ " only match in statement position
+ let s:statement_start = escape('\%(\%(^\|;\)\s*\)\@<=', '\')
+ let b:match_words = substitute(b:match_words, '\\<', s:statement_start, 'g')
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "GNU Octave Source Files (*.m)\t*.m\n" ..
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl com< cms< fo< kp< " ..
+ \ "| unlet! b:browsefilter b:match_words"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/openvpn.vim b/runtime/ftplugin/openvpn.vim
new file mode 100644
index 0000000..56c0f25
--- /dev/null
+++ b/runtime/ftplugin/openvpn.vim
@@ -0,0 +1,14 @@
+" Vim filetype plugin
+" Language: OpenVPN
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Oct 16
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal iskeyword+=-,.,/
+setlocal comments=:#,:; commentstring=#%s
+
+let b:undo_ftplugin = 'setl isk< com< cms<'
diff --git a/runtime/ftplugin/pamconf.vim b/runtime/ftplugin/pamconf.vim
new file mode 100644
index 0000000..f0a693e
--- /dev/null
+++ b/runtime/ftplugin/pamconf.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: pam(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/pascal.vim b/runtime/ftplugin/pascal.vim
new file mode 100644
index 0000000..aba1e54
--- /dev/null
+++ b/runtime/ftplugin/pascal.vim
@@ -0,0 +1,50 @@
+" Vim filetype plugin file
+" Language: Pascal
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Change: 2021 Apr 23
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+set comments=s:(*,m:\ ,e:*),s:{,m:\ ,e:}
+set commentstring={%s}
+
+if exists("pascal_delphi")
+ set comments+=:///
+endif
+
+if !exists("pascal_traditional")
+ set commentstring=//\ %s
+ set comments+=://
+endif
+
+setlocal formatoptions-=t formatoptions+=croql
+
+if exists("loaded_matchit")
+ let b:match_ignorecase = 1 " (Pascal is case-insensitive)
+
+ let b:match_words = '\<\%(asm\|begin\|case\|\%(\%(=\|packed\)\s*\)\@<=\%(class\|object\)\|\%(=\s*\)\@<=interface\|record\|try\)\>'
+ let b:match_words .= ':\%(^\s*\)\@<=\%(except\|finally\|else\|otherwise\)\>'
+ let b:match_words .= ':\<end\>\.\@!'
+
+ let b:match_words .= ',\<repeat\>:\<until\>'
+ " let b:match_words .= ',\<if\>:\<else\>' " FIXME - else clashing with middle else. It seems like a debatable use anyway.
+ let b:match_words .= ',\<unit\>:\<\%(\%(^\s*\)\@<=interface\|implementation\|initialization\|finalization\)\>:\<end\.'
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Pascal Source Files (*.pas *.pp *.inc)\t*.pas;*.pp;*.inc\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl fo< cms< com< " ..
+ \ "| unlet! b:browsefilter b:match_words b:match_ignorecase"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/passwd.vim b/runtime/ftplugin/passwd.vim
new file mode 100644
index 0000000..f6e0f50
--- /dev/null
+++ b/runtime/ftplugin/passwd.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: passwd(5) password file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments= commentstring= formatoptions-=tcroq formatoptions+=l
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/pbtxt.vim b/runtime/ftplugin/pbtxt.vim
new file mode 100644
index 0000000..e3c1bf7
--- /dev/null
+++ b/runtime/ftplugin/pbtxt.vim
@@ -0,0 +1,21 @@
+" Vim filetype plugin file
+" Language: Protobuf Text Format
+" Maintainer: Lakshay Garg <lakshayg@outlook.in>
+" Last Change: 2020 Nov 17
+" Homepage: https://github.com/lakshayg/vim-pbtxt
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal commentstring=#\ %s
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet
diff --git a/runtime/ftplugin/pdf.vim b/runtime/ftplugin/pdf.vim
new file mode 100644
index 0000000..1ed9911
--- /dev/null
+++ b/runtime/ftplugin/pdf.vim
@@ -0,0 +1,89 @@
+" Vim filetype plugin file
+" Language: PDF
+" Maintainer: Tim Pope <vimNOSPAM@tpope.info>
+" Last Change: 2007 Dec 16
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal commentstring=%%s
+setlocal comments=:%
+let b:undo_ftplugin = "setlocal cms< com< | unlet! b:match_words"
+
+if exists("g:loaded_matchit")
+ let b:match_words = '\<\%(\d\+\s\+\d\+\s\+\)obj\>:\<endobj\>,\<stream$:\<endstream\>,\<xref\>:\<trailer\>,<<:>>'
+endif
+
+if exists("g:no_plugin_maps") || exists("g:no_pdf_maps") || v:version < 700
+ finish
+endif
+
+if !exists("b:pdf_tagstack")
+ let b:pdf_tagstack = []
+endif
+
+let b:undo_ftplugin .= " | silent! nunmap <buffer> <C-]> | silent! nunmap <buffer> <C-T>"
+nnoremap <silent><buffer> <C-]> :call <SID>Tag()<CR>
+" Inline, so the error from an empty tag stack will be simple.
+nnoremap <silent><buffer> <C-T> :if len(b:pdf_tagstack) > 0 <Bar> call setpos('.',remove(b:pdf_tagstack, -1)) <Bar> else <Bar> exe "norm! \<Lt>C-T>" <Bar> endif<CR>
+
+function! s:Tag()
+ call add(b:pdf_tagstack,getpos('.'))
+ if getline('.') =~ '^\d\+$' && getline(line('.')-1) == 'startxref'
+ return s:dodigits(getline('.'))
+ elseif getline('.') =~ '/Prev\s\+\d\+\>\%(\s\+\d\)\@!' && expand("<cword>") =~ '^\d\+$'
+ return s:dodigits(expand("<cword>"))
+ elseif getline('.') =~ '^\d\{10\} \d\{5\} '
+ return s:dodigits(matchstr(getline('.'),'^\d\+'))
+ else
+ let line = getline(".")
+ let lastend = 0
+ let pat = '\<\d\+\s\+\d\+\s\+R\>'
+ while lastend >= 0
+ let beg = match(line,'\C'.pat,lastend)
+ let end = matchend(line,'\C'.pat,lastend)
+ if beg < col(".") && end >= col(".")
+ return s:doobject(matchstr(line,'\C'.pat,lastend))
+ endif
+ let lastend = end
+ endwhile
+ return s:notag()
+ endif
+endfunction
+
+function! s:doobject(string)
+ let first = matchstr(a:string,'^\s*\zs\d\+')
+ let second = matchstr(a:string,'^\s*\d\+\s\+\zs\d\+')
+ norm! m'
+ if first != '' && second != ''
+ let oldline = line('.')
+ let oldcol = col('.')
+ 1
+ if !search('^\s*'.first.'\s\+'.second.'\s\+obj\>')
+ exe oldline
+ exe 'norm! '.oldcol.'|'
+ return s:notag()
+ endif
+ endif
+endfunction
+
+function! s:dodigits(digits)
+ let digits = 0 + substitute(a:digits,'^0*','','')
+ norm! m'
+ if digits <= 0
+ norm! 1go
+ else
+ " Go one character before the destination and advance. This method
+ " lands us after a newline rather than before, if that is our target.
+ exe "goto ".(digits)."|norm! 1 "
+ endif
+endfunction
+
+function! s:notag()
+ silent! call remove(b:pdf_tagstack,-1)
+ echohl ErrorMsg
+ echo "E426: tag not found"
+ echohl NONE
+endfunction
diff --git a/runtime/ftplugin/perl.vim b/runtime/ftplugin/perl.vim
new file mode 100644
index 0000000..d0bdbc0
--- /dev/null
+++ b/runtime/ftplugin/perl.vim
@@ -0,0 +1,109 @@
+" Vim filetype plugin file
+" Language: Perl
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2021 Nov 10
+
+if exists("b:did_ftplugin") | finish | endif
+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
+
+setlocal formatoptions-=t
+setlocal formatoptions+=crqol
+setlocal keywordprg=perldoc\ -f
+
+setlocal comments=:#
+setlocal commentstring=#%s
+
+" Provided by Ned Konz <ned at bike-nomad dot com>
+"---------------------------------------------
+setlocal include=\\<\\(use\\\|require\\)\\>
+" '+' is removed to support plugins in Catalyst or DBIx::Class
+" where the leading plus indicates a fully-qualified module name.
+setlocal includeexpr=substitute(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. Thanks to Andrew Pimlott for pointing
+" out the problem.
+let s:old_isfname = &isfname
+set isfname+=:
+let s:new_isfname = &isfname
+
+augroup perl_global_options
+ au!
+ exe "au BufEnter * if &filetype == 'perl' | let &isfname = '" . s:new_isfname . "' | endif"
+ exe "au BufLeave * if &filetype == 'perl' | let &isfname = '" . s:old_isfname . "' | endif"
+augroup END
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal fo< kp< com< cms< inc< inex< def< isk<" .
+ \ " | let &isfname = '" . s:old_isfname . "'"
+
+if get(g:, 'perl_fold', 0)
+ setlocal foldmethod=syntax
+ let b:undo_ftplugin .= " | setlocal fdm<"
+endif
+
+" Set this once, globally.
+if !exists("perlpath")
+ if executable("perl")
+ try
+ if &shellxquote != '"'
+ let perlpath = system('perl -e "print join(q/,/,@INC)"')
+ else
+ let perlpath = system("perl -e 'print join(q/,/,@INC)'")
+ endif
+ let perlpath = substitute(perlpath,',.$',',,','')
+ catch /E145:/
+ let perlpath = ".,,"
+ endtry
+ else
+ " If we can't call perl to get its path, just default to using the
+ " current directory and the directory of the current file.
+ let perlpath = ".,,"
+ endif
+endif
+
+" Append perlpath to the existing path value, if it is set. Since we don't
+" use += to do it because of the commas in perlpath, we have to handle the
+" global / local settings, too.
+if &l:path == ""
+ if &g:path == ""
+ let &l:path=perlpath
+ else
+ let &l:path=&g:path.",".perlpath
+ endif
+else
+ let &l:path=&l:path.",".perlpath
+endif
+
+let b:undo_ftplugin .= " | setlocal pa<"
+"---------------------------------------------
+
+" Change the browse dialog to show mainly Perl-related files
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Perl Source Files (*.pl)\t*.pl\n" .
+ \ "Perl Modules (*.pm)\t*.pm\n" .
+ \ "Perl Documentation Files (*.pod)\t*.pod\n" .
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+" Proper matching for matchit plugin
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_skip = 's:comment\|string\|perlQQ\|perlShellCommand\|perlHereDoc\|perlSubstitution\|perlTranslation\|perlMatch\|perlFormatField'
+ let b:match_words = '\<if\>:\<elsif\>:\<else\>'
+ let b:undo_ftplugin .= " | unlet! b:match_words b:match_skip"
+endif
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo s:old_isfname s:new_isfname
diff --git a/runtime/ftplugin/php.vim b/runtime/ftplugin/php.vim
new file mode 100644
index 0000000..540653e
--- /dev/null
+++ b/runtime/ftplugin/php.vim
@@ -0,0 +1,153 @@
+" Vim filetype plugin file
+" Language: PHP
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Changed: 2022 Jul 20
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "HTML Files (*.html, *.htm)\t*.html;*.htm\n" ..
+ \ "All Files (*.*)\t*.*\n"
+let s:match_words = ""
+
+runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+" let b:undo_ftplugin = "setlocal comments< commentstring< formatoptions< omnifunc<"
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+" let b:undo_ftplugin ..= " | unlet! b:browsefilter b:html_set_browsefilter"
+ let s:browsefilter = b:browsefilter
+endif
+if exists("b:match_words")
+" let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words b:html_set_match_words"
+ let s:match_words = b:match_words
+endif
+if exists("b:match_skip")
+ unlet b:match_skip
+endif
+
+setlocal comments=s1:/*,mb:*,ex:*/,://,:#
+setlocal commentstring=/*%s*/
+setlocal formatoptions+=l formatoptions-=t
+
+if get(g:, "php_autocomment", 1)
+ setlocal formatoptions+=croq
+ " NOTE: set g:PHP_autoformatcomment = 0 to prevent the indent plugin from
+ " overriding this 'comments' value
+ setlocal comments-=:#
+ " space after # comments to exclude attributes
+ setlocal comments+=b:#
+endif
+
+if exists('&omnifunc')
+ setlocal omnifunc=phpcomplete#CompletePHP
+endif
+
+setlocal suffixesadd=.php
+
+" ###
+" Provided by Mikolaj Machowski <mikmach at wp dot pl>
+setlocal include=\\\(require\\\|include\\\)\\\(_once\\\)\\\?
+" Disabled changing 'iskeyword', it breaks a command such as "*"
+" setlocal iskeyword+=$
+
+let b:undo_ftplugin = "setlocal include< suffixesadd<"
+
+if exists("loaded_matchit") && exists("b:html_set_match_words")
+ let b:match_ignorecase = 1
+ let b:match_words = 'PhpMatchWords()'
+
+ if !exists("*PhpMatchWords")
+ function! PhpMatchWords()
+ " The PHP syntax file uses the Delimiter syntax group for the phpRegion
+ " matchgroups, without a "php" prefix, so use the stack to test for the
+ " outer phpRegion group. This also means the closing ?> tag which is
+ " outside of the matched region just uses the Delimiter group for the
+ " end match.
+ let stack = synstack(line('.'), col('.'))
+ let php_region = !empty(stack) && synIDattr(stack[0], "name") =~# '\<php'
+ if php_region || getline(".") =~ '.\=\%.c\&?>'
+ let b:match_skip = "PhpMatchSkip('html')"
+ return '<?php\|<?=\=:?>,' ..
+ \ '\<if\>:\<elseif\>:\<else\>:\<endif\>,' ..
+ \ '\<switch\>:\<case\>:\<break\>:\<continue\>:\<endswitch\>,' ..
+ \ '\<while\>.\{-})\s*\::\<break\>:\<continue\>:\<endwhile\>,' ..
+ \ '\<do\>:\<break\>:\<continue\>:\<while\>,' ..
+ \ '\<for\>:\<break\>:\<continue\>:\<endfor\>,' ..
+ \ '\<foreach\>:\<break\>:\<continue\>:\<endforeach\>,' ..
+ \ '\%(<<<\s*\)\@<=''\=\(\h\w*\)''\=:^\s*\1\>'
+
+ " TODO: these probably aren't worth adding and really need syntax support
+ " '<\_s*script\_s*language\_s*=\_s*[''"]\=\_s*php\_s*[''"]\=\_s*>:<\_s*\_s*/\_s*script\_s*>,' ..
+ " '<%:%>,' ..
+ else
+ let b:match_skip = "PhpMatchSkip('php')"
+ return s:match_words
+ endif
+ endfunction
+ endif
+ if !exists("*PhpMatchSkip")
+ function! PhpMatchSkip(skip)
+ let name = synIDattr(synID(line('.'), col('.'), 1), 'name')
+ if a:skip == "html"
+ " ?> in line comments will also be correctly matched as Delimiter
+ return name =~? 'comment\|string' || name !~? 'php\|delimiter'
+ else " php
+ return name =~? 'comment\|string\|php'
+ endif
+ endfunction
+ endif
+ let b:undo_ftplugin ..= " | unlet! b:match_skip"
+endif
+" ###
+
+" Change the :browse e filter to primarily show PHP-related files.
+if (has("gui_win32") || has("gui_gtk")) && exists("b:html_set_browsefilter")
+ let b:browsefilter = "PHP Files (*.php)\t*.php\n" ..
+ \ "PHP Test Files (*.phpt)\t*.phpt\n" ..
+ \ s:browsefilter
+endif
+
+if !exists("no_plugin_maps") && !exists("no_php_maps")
+ " Section jumping: [[ and ]] provided by Antony Scriven <adscriven at gmail dot com>
+ let s:function = '\%(abstract\s\+\|final\s\+\|private\s\+\|protected\s\+\|public\s\+\|static\s\+\)*function'
+ let s:class = '\%(abstract\s\+\|final\s\+\)*class'
+ let s:section = escape('^\s*\zs\%(' .. s:function .. '\|' .. s:class .. '\|interface\|trait\|enum\)\>', "|")
+
+ function! s:Jump(pattern, count, flags)
+ normal! m'
+ for i in range(a:count)
+ if !search(a:pattern, a:flags)
+ break
+ endif
+ endfor
+ endfunction
+
+ for mode in ["n", "o", "x"]
+ exe mode .. "noremap <buffer> <silent> ]] <Cmd>call <SID>Jump('" .. s:section .. "', v:count1, 'W')<CR>"
+ exe mode .. "noremap <buffer> <silent> [[ <Cmd>call <SID>Jump('" .. s:section .. "', v:count1, 'bW')<CR>"
+ let b:undo_ftplugin ..= " | sil! exe '" .. mode .. "unmap <buffer> ]]'" ..
+ \ " | sil! exe '" .. mode .. "unmap <buffer> [['"
+ endfor
+endif
+
+let b:undo_ftplugin ..= " | " .. s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/pinfo.vim b/runtime/ftplugin/pinfo.vim
new file mode 100644
index 0000000..50473a8
--- /dev/null
+++ b/runtime/ftplugin/pinfo.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: pinfo(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/plaintex.vim b/runtime/ftplugin/plaintex.vim
new file mode 100644
index 0000000..9e0e402
--- /dev/null
+++ b/runtime/ftplugin/plaintex.vim
@@ -0,0 +1,37 @@
+" plain TeX filetype plugin
+" Language: plain TeX (ft=plaintex)
+" Maintainer: Benji Fisher, Ph.D. <benji@member.AMS.org>
+" Version: 1.1
+" Last Change: Wed 19 Apr 2006
+
+" Only do this when not done yet for this buffer.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Start with initex. This will also define b:did_ftplugin and b:undo_ftplugin .
+source $VIMRUNTIME/ftplugin/initex.vim
+
+" Avoid problems if running in 'compatible' mode.
+let s:save_cpo = &cpo
+set cpo&vim
+
+let b:undo_ftplugin .= "| unlet! b:match_ignorecase b:match_skip b:match_words"
+
+" Allow "[d" to be used to find a macro definition:
+let &l:define .= '\|\\new\(count\|dimen\|skip\|muskip\|box\|toks\|read\|write'
+ \ . '\|fam\|insert\)'
+
+" The following lines enable the macros/matchit.vim plugin for
+" extended matching with the % key.
+" There is no default meaning for \(...\) etc., but many users define one.
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ \ | let b:match_skip = 'r:\\\@<!\%(\\\\\)*%'
+ \ | let b:match_words = '(:),\[:],{:},\\(:\\),\\\[:\\],\\{:\\}'
+endif " exists("loaded_matchit")
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim:sts=2:sw=2:
diff --git a/runtime/ftplugin/pod.vim b/runtime/ftplugin/pod.vim
new file mode 100644
index 0000000..2a905ab
--- /dev/null
+++ b/runtime/ftplugin/pod.vim
@@ -0,0 +1,71 @@
+" Vim filetype plugin file
+" Language: Perl POD format
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Author: Doug Kearns <dougkearns@gmail.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2021 Oct 19
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal comments=fb:=for\ comment
+setlocal commentstring==for\ comment\ %s
+
+let b:undo_ftplugin = "setl com< cms<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words =
+ \ '^=pod\>:^=cut\>,' .
+ \ '^=begin\s\+\(\S\+\):^=end\s\+\1,' .
+ \ '^=over\>:^=item\>:^=back\>,' .
+ \ '[IBCLEFSXZ]<<\%(\s\+\|$\)\@=:\%(\s\+\|^\)\@<=>>,' .
+ \ '[IBCLEFSXZ]<:>'
+ let b:undo_ftplugin .= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "POD Source Files (*.pod)\t*.pod\n" .
+ \ "Perl Source Files (*.pl)\t*.pl\n" .
+ \ "Perl Modules (*.pm)\t*.pm\n" .
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+function! s:jumpToSection(backwards)
+ let flags = a:backwards ? 'bsWz' : 'sWz'
+ if has('syntax_items')
+ let skip = "synIDattr(synID(line('.'), col('.'), 1), 'name') !~# '\\<podCommand\\>'"
+ else
+ let skip = ''
+ endif
+ for i in range(v:count1)
+ call search('^=\a', flags, 0, 0, skip)
+ endfor
+endfunction
+
+if !exists("no_plugin_maps") && !exists("no_pod_maps")
+ nnoremap <silent> <buffer> ]] <Cmd>call <SID>jumpToSection()<CR>
+ vnoremap <silent> <buffer> ]] <Cmd>call <SID>jumpToSection()<CR>
+ nnoremap <silent> <buffer> ][ <Cmd>call <SID>jumpToSection()<CR>
+ vnoremap <silent> <buffer> ][ <Cmd>call <SID>jumpToSection()<CR>
+ nnoremap <silent> <buffer> [[ <Cmd>call <SID>jumpToSection(1)<CR>
+ vnoremap <silent> <buffer> [[ <Cmd>call <SID>jumpToSection(1)<CR>
+ nnoremap <silent> <buffer> [] <Cmd>call <SID>jumpToSection(1)<CR>
+ vnoremap <silent> <buffer> [] <Cmd>call <SID>jumpToSection(1)<CR>
+ let b:undo_ftplugin .=
+ \ " | silent! exe 'nunmap <buffer> ]]' | silent! exe 'vunmap <buffer> ]]'" .
+ \ " | silent! exe 'nunmap <buffer> ][' | silent! exe 'vunmap <buffer> ]['" .
+ \ " | silent! exe 'nunmap <buffer> ]]' | silent! exe 'vunmap <buffer> ]]'" .
+ \ " | silent! exe 'nunmap <buffer> []' | silent! exe 'vunmap <buffer> []'"
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set expandtab:
diff --git a/runtime/ftplugin/poefilter.vim b/runtime/ftplugin/poefilter.vim
new file mode 100644
index 0000000..92c2def
--- /dev/null
+++ b/runtime/ftplugin/poefilter.vim
@@ -0,0 +1,13 @@
+" Vim filetype plugin
+" Language: PoE item filter
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Oct 07
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:# commentstring=#\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/runtime/ftplugin/poke.vim b/runtime/ftplugin/poke.vim
new file mode 100644
index 0000000..2be8669
--- /dev/null
+++ b/runtime/ftplugin/poke.vim
@@ -0,0 +1,32 @@
+" Vim filetype plugin file
+" Language: GNU Poke
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 March 11
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+setlocal commentstring=//\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal include=load
+setlocal suffixesadd=.pk
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Poke Files (*.pk)\t*.pk\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl fo< com< cms< inc< sua<" .
+ \ " | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8
diff --git a/runtime/ftplugin/postscr.vim b/runtime/ftplugin/postscr.vim
new file mode 100644
index 0000000..3bdd2e6
--- /dev/null
+++ b/runtime/ftplugin/postscr.vim
@@ -0,0 +1,38 @@
+" Vim filetype plugin file
+" Language: PostScript
+" Maintainer: Mike Williams <mrw@eandem.co.uk>
+" Last Change: 24th April 2012
+
+" 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 s:cpo_save = &cpo
+set cpo&vim
+
+" PS comment formatting
+setlocal comments=b:%
+setlocal formatoptions-=t formatoptions+=rol
+
+" Define patterns for the matchit macro
+if !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let b:match_words = '<<:>>,\<begin\>:\<end\>,\<save\>:\<restore\>,\<gsave\>:\<grestore\>'
+endif
+
+" Define patterns for the browse file filter
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "PostScript Files (*.ps)\t*.ps\n" .
+ \ "EPS Files (*.eps)\t*.eps\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setlocal comments< formatoptions<"
+ \ . "| unlet! b:browsefiler b:match_ignorecase b:match_words"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/procmail.vim b/runtime/ftplugin/procmail.vim
new file mode 100644
index 0000000..d64f192
--- /dev/null
+++ b/runtime/ftplugin/procmail.vim
@@ -0,0 +1,21 @@
+" Vim filetype plugin file
+" Language: procmail(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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 formatoptions-=t formatoptions+=croql
+
+let &l:include = '^\s*INCLUDERC\>'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/prolog.vim b/runtime/ftplugin/prolog.vim
new file mode 100644
index 0000000..f4e7d13
--- /dev/null
+++ b/runtime/ftplugin/prolog.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: Prolog
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:% commentstring=%\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/protocols.vim b/runtime/ftplugin/protocols.vim
new file mode 100644
index 0000000..83856ce
--- /dev/null
+++ b/runtime/ftplugin/protocols.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" 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
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/ps1.vim b/runtime/ftplugin/ps1.vim
new file mode 100644
index 0000000..aac3bc9
--- /dev/null
+++ b/runtime/ftplugin/ps1.vim
@@ -0,0 +1,59 @@
+" Vim filetype plugin file
+" Language: Windows PowerShell
+" URL: https://github.com/PProvost/vim-ps1
+" Last Change: 2021 Apr 02
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin") | finish | endif
+
+" Don't load another plug-in for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal tw=0
+setlocal commentstring=#%s
+setlocal formatoptions=tcqro
+" Enable autocompletion of hyphenated PowerShell commands,
+" e.g. Get-Content or Get-ADUser
+setlocal iskeyword+=-
+
+" Change the browse dialog on Win32 to show mainly PowerShell-related files
+if has("gui_win32")
+ let b:browsefilter =
+ \ "All PowerShell Files (*.ps1, *.psd1, *.psm1, *.ps1xml)\t*.ps1;*.psd1;*.psm1;*.ps1xml\n" .
+ \ "PowerShell Script Files (*.ps1)\t*.ps1\n" .
+ \ "PowerShell Module Files (*.psd1, *.psm1)\t*.psd1;*.psm1\n" .
+ \ "PowerShell XML Files (*.ps1xml)\t*.ps1xml\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+" Look up keywords by Get-Help:
+" check for PowerShell Core in Windows, Linux or MacOS
+if executable('pwsh') | let s:pwsh_cmd = 'pwsh'
+ " on Windows Subsystem for Linux, check for PowerShell Core in Windows
+elseif exists('$WSLENV') && executable('pwsh.exe') | let s:pwsh_cmd = 'pwsh.exe'
+ " check for PowerShell <= 5.1 in Windows
+elseif executable('powershell.exe') | let s:pwsh_cmd = 'powershell.exe'
+endif
+
+if exists('s:pwsh_cmd')
+ if !has('gui_running') && executable('less') &&
+ \ !(exists('$ConEmuBuild') && &term =~? '^xterm')
+ " For exclusion of ConEmu, see https://github.com/Maximus5/ConEmu/issues/2048
+ command! -buffer -nargs=1 GetHelp silent exe '!' . s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full "<args>" | ' . (has('unix') ? 'LESS= less' : 'less') | redraw!
+ elseif has('terminal')
+ command! -buffer -nargs=1 GetHelp silent exe 'term ' . s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full "<args>"' . (executable('less') ? ' | less' : '')
+ else
+ command! -buffer -nargs=1 GetHelp echo system(s:pwsh_cmd . ' -NoLogo -NoProfile -NonInteractive -ExecutionPolicy RemoteSigned -Command Get-Help -Full <args>')
+ endif
+endif
+setlocal keywordprg=:GetHelp
+
+" Undo the stuff we changed
+let b:undo_ftplugin = "setlocal tw< cms< fo< iskeyword< keywordprg<" .
+ \ " | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/ps1xml.vim b/runtime/ftplugin/ps1xml.vim
new file mode 100644
index 0000000..837a330
--- /dev/null
+++ b/runtime/ftplugin/ps1xml.vim
@@ -0,0 +1,34 @@
+" Vim filetype plugin file
+" Language: Windows PowerShell
+" URL: https://github.com/PProvost/vim-ps1
+" Last Change: 2021 Apr 02
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin") | finish | endif
+
+" Don't load another plug-in for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal tw=0
+setlocal commentstring=#%s
+setlocal formatoptions=tcqro
+
+" Change the browse dialog on Win32 to show mainly PowerShell-related files
+if has("gui_win32")
+ let b:browsefilter =
+ \ "All PowerShell Files (*.ps1, *.psd1, *.psm1, *.ps1xml)\t*.ps1;*.psd1;*.psm1;*.ps1xml\n" .
+ \ "PowerShell Script Files (*.ps1)\t*.ps1\n" .
+ \ "PowerShell Module Files (*.psd1, *.psm1)\t*.psd1;*.psm1\n" .
+ \ "PowerShell XML Files (*.ps1xml)\t*.ps1xml\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+" Undo the stuff we changed
+let b:undo_ftplugin = "setlocal tw< cms< fo<" .
+ \ " | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/pyrex.vim b/runtime/ftplugin/pyrex.vim
new file mode 100644
index 0000000..251da39
--- /dev/null
+++ b/runtime/ftplugin/pyrex.vim
@@ -0,0 +1,27 @@
+" Vim filetype plugin file
+" Language: Pyrex
+" Maintainer: Marco Barisione <marco.bari@people.it>
+" URL: http://marcobari.altervista.org/pyrex_vim.html
+" Last Change: 2012 May 18
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Behaves just like Python
+runtime! ftplugin/python.vim ftplugin/python_*.vim ftplugin/python/*.vim
+
+if has("gui_win32") && exists("b:browsefilter")
+ let b:browsefilter = "Pyrex files (*.pyx,*.pxd)\t*.pyx;*.pxd\n" .
+ \ "Python Files (*.py)\t*.py\n" .
+ \ "C Source Files (*.c)\t*.c\n" .
+ \ "C Header Files (*.h)\t*.h\n" .
+ \ "C++ Source Files (*.cpp *.c++)\t*.cpp;*.c++\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/ftplugin/python.vim b/runtime/ftplugin/python.vim
new file mode 100644
index 0000000..000ddf5
--- /dev/null
+++ b/runtime/ftplugin/python.vim
@@ -0,0 +1,189 @@
+" Vim filetype plugin file
+" Language: python
+" Maintainer: Tom Picton <tom@tompicton.co.uk>
+" Previous Maintainer: James Sully <sullyj3@gmail.com>
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Mon, 5 October 2020
+" https://github.com/tpict/vim-ftplugin-python
+
+if exists("b:did_ftplugin") | finish | endif
+let b:did_ftplugin = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+setlocal cinkeys-=0#
+setlocal indentkeys-=0#
+setlocal include=^\\s*\\(from\\\|import\\)
+setlocal define=^\\s*\\(def\\\|class\\)
+
+" 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
+
+if has('python3')
+ setlocal omnifunc=python3complete#Complete
+elseif has('python')
+ setlocal omnifunc=pythoncomplete#Complete
+endif
+
+set wildignore+=*.pyc
+
+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)'
+
+if !exists('g:no_plugin_maps') && !exists('g:no_python_maps')
+ 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', v:count1, 0)<cr>"
+ execute "nnoremap <silent> <buffer> [] :call <SID>Python_jump('n', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<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', v:count1, 0)<cr>"
+ execute "nnoremap <silent> <buffer> [M :call <SID>Python_jump('n', '". b:prev_end."', 'Wb', v:count1, 0)<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', v:count1, 0)<cr>"
+ execute "onoremap <silent> <buffer> [] :call <SID>Python_jump('o', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<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', v:count1, 0)<cr>"
+ execute "onoremap <silent> <buffer> [M :call <SID>Python_jump('o', '". b:prev_end."', 'Wb', v:count1, 0)<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', v:count1, 0)<cr>"
+ execute "xnoremap <silent> <buffer> [] :call <SID>Python_jump('x', '". b:prev_endtoplevel."', 'Wb', v:count1, 0)<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', v:count1, 0)<cr>"
+ execute "xnoremap <silent> <buffer> [M :call <SID>Python_jump('x', '". b:prev_end."', 'Wb', v:count1, 0)<cr>"
+endif
+
+if !exists('*<SID>Python_jump')
+ 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
+ call search(a:motion, a:flags)
+ let cnt = cnt - 1
+ endwhile
+
+ 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"
+endif
+
+if !exists("g:python_recommended_style") || g:python_recommended_style != 0
+ " As suggested by PEP8.
+ setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4
+endif
+
+" Use pydoc for keywordprg.
+" Unix users preferentially get pydoc3, then pydoc2.
+" Windows doesn't have a standalone pydoc executable in $PATH by default, nor
+" does it have separate python2/3 executables, so Windows users just get
+" whichever version corresponds to their installed Python version.
+if executable('python3')
+ setlocal keywordprg=python3\ -m\ pydoc
+elseif executable('python')
+ setlocal keywordprg=python\ -m\ pydoc
+endif
+
+" Script for filetype switching to undo the local stuff we may have changed
+let b:undo_ftplugin = 'setlocal cinkeys<'
+ \ . '|setlocal comments<'
+ \ . '|setlocal commentstring<'
+ \ . '|setlocal expandtab<'
+ \ . '|setlocal include<'
+ \ . '|setlocal includeexpr<'
+ \ . '|setlocal indentkeys<'
+ \ . '|setlocal keywordprg<'
+ \ . '|setlocal omnifunc<'
+ \ . '|setlocal shiftwidth<'
+ \ . '|setlocal softtabstop<'
+ \ . '|setlocal suffixesadd<'
+ \ . '|setlocal tabstop<'
+ \ . '|silent! nunmap <buffer> [M'
+ \ . '|silent! nunmap <buffer> [['
+ \ . '|silent! nunmap <buffer> []'
+ \ . '|silent! nunmap <buffer> [m'
+ \ . '|silent! nunmap <buffer> ]M'
+ \ . '|silent! nunmap <buffer> ]['
+ \ . '|silent! nunmap <buffer> ]]'
+ \ . '|silent! nunmap <buffer> ]m'
+ \ . '|silent! ounmap <buffer> [M'
+ \ . '|silent! ounmap <buffer> [['
+ \ . '|silent! ounmap <buffer> []'
+ \ . '|silent! ounmap <buffer> [m'
+ \ . '|silent! ounmap <buffer> ]M'
+ \ . '|silent! ounmap <buffer> ]['
+ \ . '|silent! ounmap <buffer> ]]'
+ \ . '|silent! ounmap <buffer> ]m'
+ \ . '|silent! xunmap <buffer> [M'
+ \ . '|silent! xunmap <buffer> [['
+ \ . '|silent! xunmap <buffer> []'
+ \ . '|silent! xunmap <buffer> [m'
+ \ . '|silent! xunmap <buffer> ]M'
+ \ . '|silent! xunmap <buffer> ]['
+ \ . '|silent! xunmap <buffer> ]]'
+ \ . '|silent! xunmap <buffer> ]m'
+ \ . '|unlet! b:browsefilter'
+ \ . '|unlet! b:child_match'
+ \ . '|unlet! b:child_sub'
+ \ . '|unlet! b:grandparent_match'
+ \ . '|unlet! b:grandparent_sub'
+ \ . '|unlet! b:next'
+ \ . '|unlet! b:next_end'
+ \ . '|unlet! b:next_endtoplevel'
+ \ . '|unlet! b:next_toplevel'
+ \ . '|unlet! b:parent_match'
+ \ . '|unlet! b:parent_sub'
+ \ . '|unlet! b:prev'
+ \ . '|unlet! b:prev_end'
+ \ . '|unlet! b:prev_endtoplevel'
+ \ . '|unlet! b:prev_toplevel'
+ \ . '|unlet! b:undo_ftplugin'
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/ftplugin/qb64.vim b/runtime/ftplugin/qb64.vim
new file mode 100644
index 0000000..0fa36fc
--- /dev/null
+++ b/runtime/ftplugin/qb64.vim
@@ -0,0 +1,26 @@
+" Vim filetype plugin file
+" Language: QB64
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+runtime! ftplugin/basic.vim
+
+let s:not_end = '\%(end\s\+\)\@<!'
+
+let b:match_words ..= ',' ..
+ \ s:not_end .. '\<declare\>:\<end\s\+declare\>,' ..
+ \ '\<select\s\+everycase\>:\%(select\s\+\)\@<!\<case\%(\s\+\%(else\|is\)\)\=\>:\<end\s\+select\>,' ..
+ \ '$IF\>:$\%(ELSEIF\|ELSE\)\>:$END\s*IF\>'
+
+unlet s:not_end
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/ftplugin/qf.vim b/runtime/ftplugin/qf.vim
new file mode 100644
index 0000000..85fb9f6
--- /dev/null
+++ b/runtime/ftplugin/qf.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin file
+" Language: Vim's quickfix window
+" Maintainer: Lech Lorens <Lech.Lorens@gmail.com>
+" Last Change: 2019 Jul 15
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+if !get(g:, 'qf_disable_statusline')
+ 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
+endif
diff --git a/runtime/ftplugin/quake.vim b/runtime/ftplugin/quake.vim
new file mode 100644
index 0000000..c3a2e52
--- /dev/null
+++ b/runtime/ftplugin/quake.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: Quake[1-3] configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:// commentstring=//\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/quarto.vim b/runtime/ftplugin/quarto.vim
new file mode 100644
index 0000000..a76bcc2
--- /dev/null
+++ b/runtime/ftplugin/quarto.vim
@@ -0,0 +1 @@
+runtime ftplugin/rmd.vim
diff --git a/runtime/ftplugin/r.vim b/runtime/ftplugin/r.vim
new file mode 100644
index 0000000..2896636
--- /dev/null
+++ b/runtime/ftplugin/r.vim
@@ -0,0 +1,32 @@
+" Vim filetype plugin file
+" Language: R
+" Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Sun Apr 24, 2022 09:14AM
+
+" Only do this when not yet done for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword=@,48-57,_,.
+setlocal formatoptions-=t
+setlocal commentstring=#\ %s
+setlocal comments=:#',:###,:##,:#
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R)\t*.R\n" .
+ \ "Files that include R (*.Rnw *.Rd *.Rmd *.Rrst *.qmd)\t*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl cms< com< fo< isk< | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/racc.vim b/runtime/ftplugin/racc.vim
new file mode 100644
index 0000000..0cd852c
--- /dev/null
+++ b/runtime/ftplugin/racc.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: Racc input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/racket.vim b/runtime/ftplugin/racket.vim
new file mode 100644
index 0000000..3aa4133
--- /dev/null
+++ b/runtime/ftplugin/racket.vim
@@ -0,0 +1,82 @@
+" Vim filetype plugin
+" Language: Racket
+" Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com>
+" Previous Maintainer: Will Langstroth <will@langstroth.com>
+" URL: https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 29
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" quick hack to allow adding values
+setlocal iskeyword=@,!,#-',*-:,<-Z,a-z,~,_,94
+
+" Enable auto begin new comment line when continuing from an old comment line
+setlocal comments=:;;;;,:;;;,:;;,:;
+setlocal formatoptions+=r
+
+"setlocal commentstring=;;%s
+setlocal commentstring=#\|\ %s\ \|#
+
+setlocal formatprg=raco\ fmt
+
+" Undo our settings when the filetype changes away from Racket
+" (this should be amended if settings/mappings are added above!)
+let b:undo_ftplugin =
+ \ "setlocal iskeyword< lispwords< lisp< comments< formatoptions< formatprg<"
+ \. " | setlocal commentstring<"
+
+if !exists("no_plugin_maps") && !exists("no_racket_maps")
+ " Simply setting keywordprg like this works:
+ " setlocal keywordprg=raco\ docs
+ " but then vim says:
+ " "press ENTER or type a command to continue"
+ " We avoid the annoyance of having to hit enter by remapping K directly.
+ function s:RacketDoc(word) abort
+ execute 'silent !raco docs --' shellescape(a:word)
+ redraw!
+ endfunction
+ nnoremap <buffer> <Plug>RacketDoc :call <SID>RacketDoc(expand('<cword>'))<CR>
+ nmap <buffer> K <Plug>RacketDoc
+
+ " For the visual mode K mapping, it's slightly more convoluted to get the
+ " selected text:
+ function! s:Racket_visual_doc()
+ try
+ let l:old_a = @a
+ normal! gv"ay
+ call system("raco docs '". @a . "'")
+ redraw!
+ return @a
+ finally
+ let @a = l:old_a
+ endtry
+ endfunction
+
+ xnoremap <buffer> <Plug>RacketDoc :call <SID>Racket_visual_doc()<cr>
+ xmap <buffer> K <Plug>RacketDoc
+
+ let b:undo_ftplugin .=
+ \ " | silent! execute 'nunmap <buffer> K'"
+ \. " | silent! execute 'xunmap <buffer> K'"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter =
+ \ "Racket Source Files (*.rkt *.rktl)\t*.rkt;*.rktl\n"
+ \. "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '#|:|#'
+ let b:undo_ftplugin .= " | unlet! b:match_words"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/raku.vim b/runtime/ftplugin/raku.vim
new file mode 100644
index 0000000..941222b
--- /dev/null
+++ b/runtime/ftplugin/raku.vim
@@ -0,0 +1,127 @@
+" Vim filetype plugin file
+" Language: Raku
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/Raku/vim-raku
+" Bugs/requests: https://github.com/Raku/vim-raku/issues
+" Last Change: 2021-04-16
+" Contributors: Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
+"
+" Based on ftplugin/perl.vim by Dan Sharp <dwsharp at hotmail dot com>
+
+if exists("b:did_ftplugin") | finish | endif
+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
+
+setlocal formatoptions-=t
+setlocal formatoptions+=crqol
+setlocal keywordprg=p6doc
+
+setlocal comments=:#\|,:#=,:#
+setlocal commentstring=#%s
+
+" Provided by Ned Konz <ned at bike-nomad dot com>
+"---------------------------------------------
+setlocal include=\\<\\(use\\\|require\\)\\>
+setlocal includeexpr=substitute(v:fname,'::','/','g')
+setlocal suffixesadd=.rakumod,.rakudoc,.pm6,.pm
+setlocal define=[^A-Za-z_]
+
+" The following line changes a global variable but is necessary to make
+" 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/raku.vim file that contains
+" set isfname-=:
+set isfname+=:
+setlocal iskeyword=@,48-57,_,192-255,-
+
+" Raku exposes its CompUnits through $*REPO, but mapping module names to
+" compunit paths is nontrivial. Probably it's more convenient to rely on
+" people using zef, which has a handy store of sources for modules it has
+" installed.
+func s:compareReverseFtime(a, b)
+ let atime = getftime(a:a)
+ let btime = getftime(a:b)
+ return atime > btime ? -1 : atime == btime ? 0 : 1
+endfunc
+
+let &l:path = "lib,."
+if exists('$RAKULIB')
+ let &l:path = &l:path . "," . $RAKULIB
+endif
+let &l:path = &l:path . "," . join(
+ \ sort(glob("~/.zef/store/*/*/lib", 0, 1), "s:compareReverseFtime"),
+ \ ',')
+
+" Convert ascii-based ops into their single-character unicode equivalent
+if get(g:, 'raku_unicode_abbrevs', 0)
+ iabbrev <buffer> !(<) ⊄
+ iabbrev <buffer> !(<=) ⊈
+ iabbrev <buffer> !(>) ⊅
+ iabbrev <buffer> !(>=) ⊉
+ iabbrev <buffer> !(cont) ∌
+ iabbrev <buffer> !(elem) ∉
+ iabbrev <buffer> != ≠
+ iabbrev <buffer> (&) ∩
+ iabbrev <buffer> (+) ⊎
+ iabbrev <buffer> (-) ∖
+ iabbrev <buffer> (.) ⊍
+ iabbrev <buffer> (<) ⊂
+ iabbrev <buffer> (<+) ≼
+ iabbrev <buffer> (<=) ⊆
+ iabbrev <buffer> (>) ⊃
+ iabbrev <buffer> (>+) ≽
+ iabbrev <buffer> (>=) ⊇
+ iabbrev <buffer> (\|) ∪
+ iabbrev <buffer> (^) ⊖
+ iabbrev <buffer> (atomic) ⚛
+ iabbrev <buffer> (cont) ∋
+ iabbrev <buffer> (elem) ∈
+ iabbrev <buffer> * ×
+ iabbrev <buffer> **0 ⁰
+ iabbrev <buffer> **1 ¹
+ iabbrev <buffer> **2 ²
+ iabbrev <buffer> **3 ³
+ iabbrev <buffer> **4 ⁴
+ iabbrev <buffer> **5 ⁵
+ iabbrev <buffer> **6 ⁶
+ iabbrev <buffer> **7 ⁷
+ iabbrev <buffer> **8 ⁸
+ iabbrev <buffer> **9 ⁹
+ iabbrev <buffer> ... …
+ iabbrev <buffer> / ÷
+ iabbrev <buffer> << «
+ iabbrev <buffer> <<[=]<< «=«
+ iabbrev <buffer> <<[=]>> «=»
+ iabbrev <buffer> <= ≤
+ iabbrev <buffer> =~= ≅
+ iabbrev <buffer> >= ≥
+ iabbrev <buffer> >> »
+ iabbrev <buffer> >>[=]<< »=«
+ iabbrev <buffer> >>[=]>> »=»
+ iabbrev <buffer> Inf ∞
+ iabbrev <buffer> atomic-add-fetch ⚛+=
+ iabbrev <buffer> atomic-assign ⚛=
+ iabbrev <buffer> atomic-fetch ⚛
+ iabbrev <buffer> atomic-dec-fetch --⚛
+ iabbrev <buffer> atomic-fetch-dec ⚛--
+ iabbrev <buffer> atomic-fetch-inc ⚛++
+ iabbrev <buffer> atomic-inc-fetch ++⚛
+ iabbrev <buffer> atomic-sub-fetch ⚛−=
+ iabbrev <buffer> e 𝑒
+ iabbrev <buffer> o ∘
+ iabbrev <buffer> pi π
+ iabbrev <buffer> set() ∅
+ iabbrev <buffer> tau τ
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal fo< com< cms< inc< inex< def< isf< isk< kp< path<" .
+ \ " | unlet! b:browsefilter"
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/readline.vim b/runtime/ftplugin/readline.vim
new file mode 100644
index 0000000..eba7122
--- /dev/null
+++ b/runtime/ftplugin/readline.vim
@@ -0,0 +1,36 @@
+" Vim filetype plugin file
+" Language: readline(3) configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2022 Dec 09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let b:match_words = '$if:$else:$endif'
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Readline Intialization Files (inputrc .inputrc)\tinputrc;*.inputrc\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/registry.vim b/runtime/ftplugin/registry.vim
new file mode 100644
index 0000000..385785a
--- /dev/null
+++ b/runtime/ftplugin/registry.vim
@@ -0,0 +1,36 @@
+" Vim filetype plugin file
+" Language: Windows Registry export with regedit (*.reg)
+" Maintainer: Cade Forester <ahx2323@gmail.com>
+" Latest Revision: 2014-01-09
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin =
+ \ 'let b:browsefilter = "" | ' .
+ \ 'setlocal ' .
+ \ 'comments< '.
+ \ 'commentstring< ' .
+ \ 'formatoptions< '
+
+
+if has( 'gui_win32' )
+\ && !exists( 'b:browsefilter' )
+ let b:browsefilter =
+ \ 'registry files (*.reg)\t*.reg\n' .
+ \ 'All files (*.*)\t*.*\n'
+endif
+
+setlocal comments=:;
+setlocal commentstring=;\ %s
+
+setlocal formatoptions-=t
+setlocal formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/reva.vim b/runtime/ftplugin/reva.vim
new file mode 100644
index 0000000..29ecab0
--- /dev/null
+++ b/runtime/ftplugin/reva.vim
@@ -0,0 +1,27 @@
+" Vim ftplugin file
+" Language: Reva Forth
+" Version: 7.1
+" Last Change: 2022 Apr 27
+" Maintainer: Ron Aaron <ron@ronware.org>
+" URL: http://ronware.org/reva/
+" Filetypes: *.rf *.frt
+" NOTE: Forth allows any non-whitespace in a name, so you need to do:
+" setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+"
+" This goes with the syntax/reva.vim file.
+
+" 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
+
+setlocal sts=4 sw=4
+setlocal com=s1:/*,mb:*,ex:*/,:\|,:\\
+setlocal fo=tcrqol
+setlocal matchpairs+=\::;
+setlocal iskeyword=!,@,33-35,%,$,38-64,A-Z,91-96,a-z,123-126,128-255
+
+let b:undo_ftplugin = "setlocal sts< sw< com< fo< mps< isk<"
diff --git a/runtime/ftplugin/rhelp.vim b/runtime/ftplugin/rhelp.vim
new file mode 100644
index 0000000..2fde487
--- /dev/null
+++ b/runtime/ftplugin/rhelp.vim
@@ -0,0 +1,30 @@
+" Vim filetype plugin file
+" Language: R help file
+" Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Sun Apr 24, 2022 09:12AM
+
+" Only do this when not yet done for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword=@,48-57,_,.
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R *.Rnw *.Rd *.Rmd *.Rrst *.qmd)\t*.R;*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl isk< | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: sw=2
diff --git a/runtime/ftplugin/rmd.vim b/runtime/ftplugin/rmd.vim
new file mode 100644
index 0000000..355b88f
--- /dev/null
+++ b/runtime/ftplugin/rmd.vim
@@ -0,0 +1,74 @@
+" Vim filetype plugin file
+" Language: R Markdown file
+" Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Sun Apr 24, 2022 09:12AM
+" 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
+
+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:>
+setlocal commentstring=#\ %s
+setlocal formatoptions+=tcqln
+setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^\\s*[-*+]\\s\\+
+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
+
+function! SetRmdCommentStr()
+ if (search("^[ \t]*```[ ]*{r", "bncW") > search("^[ \t]*```$", "bncW")) || ((search('^---$', 'Wn') || search('^\.\.\.$', 'Wn')) && search('^---$', 'bnW'))
+ set commentstring=#\ %s
+ else
+ set commentstring=<!--\ %s\ -->
+ endif
+endfunction
+
+" If you do not want both 'comments' and 'commentstring' 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()
+ augroup RmdCStr
+ autocmd!
+ autocmd CursorMoved <buffer> call SetRmdCommentStr()
+ augroup END
+endif
+
+" Enables pandoc if it is installed
+unlet! b:did_ftplugin
+runtime ftplugin/pandoc.vim
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R *.Rnw *.Rd *.Rmd *.Rrst *.qmd)\t*.R;*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= " | setl cms< com< fo< flp< isk< | unlet! b:browsefilter"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp< isk< | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: sw=2
diff --git a/runtime/ftplugin/rnc.vim b/runtime/ftplugin/rnc.vim
new file mode 100644
index 0000000..90aa111
--- /dev/null
+++ b/runtime/ftplugin/rnc.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: Relax NG compact syntax
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/rnoweb.vim b/runtime/ftplugin/rnoweb.vim
new file mode 100644
index 0000000..cf1c092
--- /dev/null
+++ b/runtime/ftplugin/rnoweb.vim
@@ -0,0 +1,58 @@
+" Vim filetype plugin file
+" Language: Rnoweb
+" Maintainer: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Sun Apr 24, 2022 09:13AM
+
+" Only do this when not yet done for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+runtime! ftplugin/tex.vim
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Enables Vim-Latex-Suite, LaTeX-Box if installed
+runtime ftplugin/tex_*.vim
+
+setlocal iskeyword=@,48-57,_,.
+setlocal suffixesadd=.bib,.tex
+setlocal comments=b:%,b:#,b:##,b:###,b:#'
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R *.Rnw *.Rd *.Rmd *.Rrst *.qmd)\t*.R;*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+function! SetRnwCommentStr()
+ if (search("^\s*<<.*>>=", "bncW") > search("^@", "bncW"))
+ set commentstring=#\ %s
+ else
+ set commentstring=%\ %s
+ endif
+endfunction
+
+" If you do not want both 'comments' and 'commentstring' dynamically defined,
+" put in your vimrc: let g:rnw_dynamic_comments = 0
+if !exists("g:rnw_dynamic_comments") || (exists("g:rnw_dynamic_comments") && g:rnw_dynamic_comments == 1)
+ augroup RnwCStr
+ autocmd!
+ autocmd CursorMoved <buffer> call SetRnwCommentStr()
+ augroup END
+endif
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= " | setl isk< sua< com< | unlet! b:browsefilter"
+else
+ let b:undo_ftplugin = "setl isk< sua< com< | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: sw=2
diff --git a/runtime/ftplugin/routeros.vim b/runtime/ftplugin/routeros.vim
new file mode 100644
index 0000000..c6e4799
--- /dev/null
+++ b/runtime/ftplugin/routeros.vim
@@ -0,0 +1,29 @@
+" Vim filetype plugin file
+" Language: MikroTik RouterOS Script
+" Maintainer: zainin <z@wintr.dev>
+" Last Change: 2021 Nov 14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setlocal com< cms< fo<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "RouterOS Script Files (*.rsc)\t*.rsc\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:save_cpo
+unlet! s:save_cpo
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/rpl.vim b/runtime/ftplugin/rpl.vim
new file mode 100644
index 0000000..8b4d5b0
--- /dev/null
+++ b/runtime/ftplugin/rpl.vim
@@ -0,0 +1,22 @@
+" Vim filetype plugin file
+" Language: RPL/2
+" Maintainer: Joël BERTRAND <rpl2@free.fr>
+" Last Change: 2012 Mar 07
+" Version: 0.1
+
+" 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
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+let b:undo_ftplugin = "setlocal fo< comments<"
diff --git a/runtime/ftplugin/rrst.vim b/runtime/ftplugin/rrst.vim
new file mode 100644
index 0000000..19c67c4
--- /dev/null
+++ b/runtime/ftplugin/rrst.vim
@@ -0,0 +1,54 @@
+" Vim filetype plugin file
+" 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: Sun Apr 24, 2022 09:13AM
+" Original work by Alex Zvoleff
+
+" Only do this when not yet done for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+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") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "R Source Files (*.R *.Rnw *.Rd *.Rmd *.Rrst *.qmd)\t*.R;*.Rnw;*.Rd;*.Rmd;*.Rrst;*.qmd\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+if exists('b:undo_ftplugin')
+ let b:undo_ftplugin .= " | setl cms< com< fo< flp< isk< | unlet! b:browsefilter"
+else
+ let b:undo_ftplugin = "setl cms< com< fo< flp< isk< | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: sw=2
diff --git a/runtime/ftplugin/rst.vim b/runtime/ftplugin/rst.vim
new file mode 100644
index 0000000..ff7a402
--- /dev/null
+++ b/runtime/ftplugin/rst.vim
@@ -0,0 +1,47 @@
+" 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: 2020-03-31
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+"Disable folding
+if !exists('g:rst_fold_enabled')
+ let g:rst_fold_enabled = 0
+endif
+
+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 g:rst_fold_enabled != 0 && 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
new file mode 100644
index 0000000..8c1f477
--- /dev/null
+++ b/runtime/ftplugin/ruby.vim
@@ -0,0 +1,445 @@
+" Vim filetype plugin
+" Language: Ruby
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Mar 21
+
+if (exists("b:did_ftplugin"))
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if has("gui_running") && !has("gui_win32")
+ setlocal keywordprg=ri\ -T\ -f\ bs
+else
+ setlocal keywordprg=ri
+endif
+
+" Matchit support
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+
+ let b:match_words =
+ \ '{\|\<\%(if\|unless\|case\|while\|until\|for\|do\|class\|module\|def\|=\@<!begin\)\>=\@!' .
+ \ ':' .
+ \ '\<\%(else\|elsif\|ensure\|when\|rescue\|break\|redo\|next\|retry\)\>' .
+ \ ':' .
+ \ '}\|\%(^\|[^.\:@$=]\)\@<=\<end\:\@!\>' .
+ \ ',^=begin\>:^=end\>,' .
+ \ ',\[:\],(:)'
+
+ let b:match_skip =
+ \ "synIDattr(synID(line('.'),col('.'),0),'name') =~ '" .
+ \ "\\<ruby\\%(String\\|.\+Delimiter\\|Character\\|.\+Escape\\|" .
+ \ "Regexp\\|Interpolation\\|Comment\\|Documentation\\|" .
+ \ "ConditionalModifier\\|RepeatModifier\\|RescueModifier\\|OptionalDo\\|" .
+ \ "MethodName\\|BlockArgument\\|KeywordAsMethod\\|ClassVariable\\|" .
+ \ "InstanceVariable\\|GlobalVariable\\|Symbol\\)\\>'"
+endif
+
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal include=^\\s*\\<\\(load\\>\\\|require\\>\\\|autoload\\s*:\\=[\"']\\=\\h\\w*[\"']\\=,\\)
+setlocal suffixesadd=.rb
+
+if exists("&ofu") && has("ruby")
+ setlocal omnifunc=rubycomplete#Complete
+endif
+
+" TODO:
+"setlocal define=^\\s*def
+
+setlocal comments=b:#
+setlocal commentstring=#\ %s
+
+if !exists('g:ruby_version_paths')
+ let g:ruby_version_paths = {}
+endif
+
+function! s:query_path(root) abort
+ let code = "print $:.join %q{,}"
+ if &shell =~# 'sh' && empty(&shellxquote)
+ let prefix = 'env PATH='.shellescape($PATH).' '
+ else
+ let prefix = ''
+ endif
+ if &shellxquote == "'"
+ let path_check = prefix.'ruby --disable-gems -e "' . code . '"'
+ else
+ let path_check = prefix."ruby --disable-gems -e '" . code . "'"
+ endif
+
+ let cd = haslocaldir() ? 'lcd' : 'cd'
+ let cwd = fnameescape(getcwd())
+ try
+ exe cd fnameescape(a:root)
+ let path = split(system(path_check),',')
+ exe cd cwd
+ return path
+ finally
+ exe cd cwd
+ endtry
+endfunction
+
+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 = path . ',.,,'
+ elseif &g:path =~# ',\.,,$'
+ let path = &g:path[0:-4] . path . ',.,,'
+ elseif &g:path =~# ',,$'
+ let path = &g:path[0:-2] . path . ',,'
+ else
+ let path = substitute(&g:path, '[^,]\zs$', ',', '') . path
+ endif
+ return path
+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) && 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'))
+ endif
+ endif
+endif
+
+if exists("g:ruby_path")
+ let s:ruby_path = type(g:ruby_path) == type([]) ? join(g:ruby_path, ',') : g:ruby_path
+elseif has_key(g:ruby_version_paths, get(b:, 'ruby_version', ''))
+ let s:ruby_paths = g:ruby_version_paths[b:ruby_version]
+ let s:ruby_path = s:build_path(s:ruby_paths)
+else
+ if !exists('g:ruby_default_path')
+ if has("ruby") && has("win32")
+ ruby ::VIM::command( 'let g:ruby_default_path = split("%s",",")' % $:.join(%q{,}) )
+ elseif executable('ruby') && !empty($HOME)
+ let g:ruby_default_path = s:query_path($HOME)
+ else
+ let g:ruby_default_path = map(split($RUBYLIB,':'), 'v:val ==# "." ? "" : v:val')
+ endif
+ endif
+ let s:ruby_paths = g:ruby_default_path
+ let s:ruby_path = s:build_path(s:ruby_paths)
+endif
+
+if stridx(&l:path, s:ruby_path) == -1
+ let &l:path = s:ruby_path
+endif
+if exists('s:ruby_paths') && stridx(&l:tags, join(map(copy(s:ruby_paths),'v:val."/tags"'),',')) == -1
+ let &l:tags = &tags . ',' . join(map(copy(s:ruby_paths),'v:val."/tags"'),',')
+endif
+
+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
+
+let b:undo_ftplugin = "setl inc= sua= path= tags= fo< com< cms< kp="
+ \."| unlet! b:browsefilter b:match_ignorecase b:match_words b:match_skip"
+ \."| if exists('&ofu') && has('ruby') | setl ofu< | endif"
+
+if get(g:, 'ruby_recommended_style', 1)
+ setlocal shiftwidth=2 softtabstop=2 expandtab
+ let b:undo_ftplugin .= ' | setl sw< sts< et<'
+endif
+
+" To activate, :set ballooneval
+if exists('+balloonexpr') && get(g:, 'ruby_balloonexpr')
+ setlocal balloonexpr=RubyBalloonexpr()
+ let b:undo_ftplugin .= "| 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:flags a:map
+ let b:undo_ftplugin .= '|sil! '.a:mode.'unmap <buffer> '.from
+ endif
+endfunction
+
+cmap <buffer><script><expr> <Plug><ctag> substitute(RubyCursorTag(),'^$',"\022\027",'')
+cmap <buffer><script><expr> <Plug><cfile> substitute(RubyCursorFile(),'^$',"\022\006",'')
+let b:undo_ftplugin .= "| sil! cunmap <buffer> <Plug><ctag>| 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>
+ cmap <buffer> <SID><cfile> <Plug><cfile>
+ cmap <buffer> <SID><ctag> <Plug><ctag>
+
+ 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>
+ nnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'','n')<CR>
+ xnoremap <silent> <buffer> [m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'b','v')<CR>
+ xnoremap <silent> <buffer> ]m :<C-U>call <SID>searchsyn('\<def\>',['rubyDefine'],'','v')<CR>
+ xnoremap <silent> <buffer> [M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'b','v')<CR>
+ xnoremap <silent> <buffer> ]M :<C-U>call <SID>searchsyn('\<end\>',['rubyDefine'],'','v')<CR>
+
+ nnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'b','n')<CR>
+ nnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'','n')<CR>
+ nnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'b','n')<CR>
+ nnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'','n')<CR>
+ xnoremap <silent> <buffer> [[ :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'b','v')<CR>
+ xnoremap <silent> <buffer> ]] :<C-U>call <SID>searchsyn('\<\%(class\<Bar>module\)\>',['rubyModule','rubyClass'],'','v')<CR>
+ xnoremap <silent> <buffer> [] :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'b','v')<CR>
+ xnoremap <silent> <buffer> ][ :<C-U>call <SID>searchsyn('\<end\>',['rubyModule','rubyClass'],'','v')<CR>
+
+ let b:undo_ftplugin = b:undo_ftplugin
+ \."| 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','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>
+ xnoremap <silent> <buffer> am :<C-U>call <SID>wrap_a('[m',']M')<CR>
+ let b:undo_ftplugin = b:undo_ftplugin
+ \."| sil! exe 'ounmap <buffer> im' | sil! exe 'ounmap <buffer> am'"
+ \."| sil! exe 'xunmap <buffer> im' | sil! exe 'xunmap <buffer> am'"
+ endif
+
+ 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>
+ xnoremap <silent> <buffer> aM :<C-U>call <SID>wrap_a('[[','][')<CR>
+ let b:undo_ftplugin = b:undo_ftplugin
+ \."| sil! exe 'ounmap <buffer> iM' | sil! exe 'ounmap <buffer> aM'"
+ \."| sil! exe 'xunmap <buffer> iM' | sil! exe 'xunmap <buffer> aM'"
+ endif
+
+ 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', '<script><silent>', '<C-]> <SID>:exe v:count1."tag <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', 'g<C-]> <SID>:exe "tjump <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', 'g] <SID>:exe "tselect <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W>] <SID>:exe v:count1."stag <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W><C-]> <SID>:exe v:count1."stag <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W>g<C-]> <SID>:exe "stjump <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W>g] <SID>:exe "stselect <SID><ctag>"<SID>tagzv<CR>')
+ call s:map('n', '<script><silent>', '<C-W>} <SID>:exe v:count1."ptag <SID><ctag>"<CR>')
+ call s:map('n', '<script><silent>', '<C-W>g} <SID>:exe "ptjump <SID><ctag>"<CR>')
+
+ call s:map('n', '<script><silent>', 'gf <SID>c:find <SID><cfile><CR>')
+ call s:map('n', '<script><silent>', '<C-W>f <SID>c:sfind <SID><cfile><CR>')
+ call s:map('n', '<script><silent>', '<C-W><C-F> <SID>c:sfind <SID><cfile><CR>')
+ call s:map('n', '<script><silent>', '<C-W>gf <SID>c:tabfind <SID><cfile><CR>')
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+if exists("g:did_ruby_ftplugin_functions")
+ finish
+endif
+let g:did_ruby_ftplugin_functions = 1
+
+function! RubyBalloonexpr() abort
+ if !exists('s:ri_found')
+ let s:ri_found = executable('ri')
+ endif
+ if s:ri_found
+ let line = getline(v:beval_lnum)
+ let b = matchstr(strpart(line,0,v:beval_col),'\%(\w\|[:.]\)*$')
+ let a = substitute(matchstr(strpart(line,v:beval_col),'^\w*\%([?!]\|\s*=\)\?'),'\s\+','','g')
+ let str = b.a
+ let before = strpart(line,0,v:beval_col-strlen(b))
+ let after = strpart(line,v:beval_col+strlen(a))
+ if str =~ '^\.'
+ let str = substitute(str,'^\.','#','g')
+ if before =~ '\]\s*$'
+ let str = 'Array'.str
+ elseif before =~ '}\s*$'
+ " False positives from blocks here
+ let str = 'Hash'.str
+ elseif before =~ "[\"'`]\\s*$" || before =~ '\$\d\+\s*$'
+ let str = 'String'.str
+ elseif before =~ '\$\d\+\.\d\+\s*$'
+ let str = 'Float'.str
+ elseif before =~ '\$\d\+\s*$'
+ let str = 'Integer'.str
+ elseif before =~ '/\s*$'
+ let str = 'Regexp'.str
+ else
+ let str = substitute(str,'^#','.','')
+ endif
+ endif
+ let str = substitute(str,'.*\.\s*to_f\s*\.\s*','Float#','')
+ let str = substitute(str,'.*\.\s*to_i\%(nt\)\=\s*\.\s*','Integer#','')
+ let str = substitute(str,'.*\.\s*to_s\%(tr\)\=\s*\.\s*','String#','')
+ let str = substitute(str,'.*\.\s*to_sym\s*\.\s*','Symbol#','')
+ let str = substitute(str,'.*\.\s*to_a\%(ry\)\=\s*\.\s*','Array#','')
+ let str = substitute(str,'.*\.\s*to_proc\s*\.\s*','Proc#','')
+ if str !~ '^\w'
+ return ''
+ endif
+ silent! let res = substitute(system("ri -f rdoc -T \"".str.'"'),'\n$','','')
+ if res =~ '^Nothing known about' || res =~ '^Bad argument:' || res =~ '^More than one method'
+ return ''
+ endif
+ return res
+ else
+ return ""
+ endif
+endfunction
+
+function! s:searchsyn(pattern, syn, flags, mode) abort
+ let cnt = v:count1
+ norm! m'
+ if a:mode ==# 'v'
+ norm! gv
+ endif
+ let i = 0
+ call map(a:syn, 'hlID(v:val)')
+ while i < cnt
+ let i = i + 1
+ let line = line('.')
+ let col = col('.')
+ let pos = search(a:pattern,'W'.a:flags)
+ while pos != 0 && index(a:syn, s:synid()) < 0
+ let pos = search(a:pattern,'W'.a:flags)
+ endwhile
+ if pos == 0
+ call cursor(line,col)
+ return
+ endif
+ endwhile
+endfunction
+
+function! s:synid() abort
+ return synID(line('.'),col('.'),0)
+endfunction
+
+function! s:wrap_i(back,forward) abort
+ execute 'norm! k'
+ execute 'norm '.a:forward
+ let line = line('.')
+ execute 'norm '.a:back
+ if line('.') == line - 1
+ return s:wrap_a(a:back,a:forward)
+ endif
+ execute 'norm! jV'
+ execute 'norm '.a:forward
+ execute 'norm! k'
+endfunction
+
+function! s:wrap_a(back,forward) abort
+ execute 'norm '.a:forward
+ if line('.') < line('$') && getline(line('.')+1) ==# ''
+ let after = 1
+ endif
+ execute 'norm '.a:back
+ while getline(line('.')-1) =~# '^\s*#' && line('.')
+ -
+ endwhile
+ if exists('after')
+ execute 'norm! V'
+ execute 'norm '.a:forward
+ execute 'norm! j'
+ elseif line('.') > 1 && getline(line('.')-1) =~# '^\s*$'
+ execute 'norm! kV'
+ execute 'norm '.a:forward
+ else
+ execute 'norm! V'
+ execute 'norm '.a:forward
+ endif
+endfunction
+
+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*=>\@!\|\<[_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*[:.]\=','','')
+ return stripped == '' ? expand("<cword>") : stripped
+endfunction
+
+function! RubyCursorTag() abort
+ return substitute(RubyCursorIdentifier(), '^[$@]*', '', '')
+endfunction
+
+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\@!.*')
+ if s:synid() ==# hlID('rubyConstant')
+ let cfile = substitute(cfile,'\.\w\+[?!=]\=$','','')
+ let cfile = substitute(cfile,'^::','','')
+ 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')
+ let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
+ 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
+ let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
+ elseif getline('.') =~# '^\s*\%(require \|load \|autoload :\w\+,\)\s*\(["'']\).*\1\s*$'
+ let cfile = matchstr(getline('.'),'\(["'']\)\zs.\{-\}\ze\1')
+ let cfile .= cfile !~# '\.rb$' ? '.rb' : ''
+ elseif pre.post =~# '\<File.expand_path[( ].*[''"]\{2\}, *__FILE__\>' && cfile =~# '^\.\.'
+ let cfile = expand('%:p:h') . strpart(cfile, 2)
+ else
+ return substitute(cfile, '\C\v^(.*):(\d+)%(:in)=$', '+\2 \1', '')
+ endif
+ let cwdpat = '^\M' . substitute(getcwd(), '[\/]', '\\[\\/]', 'g').'\ze\[\/]'
+ let cfile = substitute(cfile, cwdpat, '.', '')
+ if fnameescape(cfile) !=# cfile
+ return '+ '.fnameescape(cfile)
+ else
+ return cfile
+ endif
+endfunction
+
+"
+" Instructions for enabling "matchit" support:
+"
+" 1. Look for the latest "matchit" plugin at
+"
+" http://www.vim.org/scripts/script.php?script_id=39
+"
+" It is also packaged with Vim, in the $VIMRUNTIME/macros directory.
+"
+" 2. Copy "matchit.txt" into a "doc" directory (e.g. $HOME/.vim/doc).
+"
+" 3. Copy "matchit.vim" into a "plugin" directory (e.g. $HOME/.vim/plugin).
+"
+" 4. Ensure this file (ftplugin/ruby.vim) is installed.
+"
+" 5. Ensure you have this line in your $HOME/.vimrc:
+" filetype plugin on
+"
+" 6. Restart Vim and create the matchit documentation:
+"
+" :helptags ~/.vim/doc
+"
+" Now you can do ":help matchit", and you should be able to use "%" on Ruby
+" keywords. Try ":echo b:match_words" to be sure.
+"
+" Thanks to Mark J. Reed for the instructions. See ":help vimrc" for the
+" locations of plugin directories, etc., as there are several options, and it
+" differs on Windows. Email gsinclair@soyabean.com.au if you need help.
+"
+
+" vim: nowrap sw=2 sts=2 ts=8:
diff --git a/runtime/ftplugin/rust.vim b/runtime/ftplugin/rust.vim
new file mode 100644
index 0000000..7efca59
--- /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
new file mode 100644
index 0000000..9ce4461
--- /dev/null
+++ b/runtime/ftplugin/sass.vim
@@ -0,0 +1,37 @@
+" Vim filetype plugin
+" Language: Sass
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2019 Dec 05
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl com< cms< def< inc< inex< ofu< sua<"
+
+setlocal comments=://
+setlocal commentstring=//\ %s
+setlocal includeexpr=SassIncludeExpr(v:fname)
+setlocal omnifunc=csscomplete#CompleteCSS
+setlocal suffixesadd=.sass,.scss,.css
+if &filetype =~# '\<s[ac]ss]\>'
+ setlocal iskeyword+=-
+ setlocal iskeyword+=$
+ setlocal iskeyword+=%
+ let b:undo_ftplugin .= ' isk<'
+endif
+
+let &l:define = '^\C\v\s*%(\@function|\@mixin|\=)|^\s*%(\$[[:alnum:]-]+:|[%.][:alnum:]-]+\s*%(\{|$))@='
+let &l:include = '^\s*@import\s\+\%(url(\)\=["'']\='
+
+function! SassIncludeExpr(file) abort
+ let partial = substitute(a:file, '\%(.*/\|^\)\zs', '_', '')
+ if !empty(findfile(partial))
+ return partial
+ endif
+ return a:file
+endfunction
+
+" vim:set sw=2:
diff --git a/runtime/ftplugin/sbt.vim b/runtime/ftplugin/sbt.vim
new file mode 100644
index 0000000..309d30e
--- /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 0000000..b484df9
--- /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: 11 August 2021
+" ----------------------------------------------------------------------------
+
+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/scdoc.vim b/runtime/ftplugin/scdoc.vim
new file mode 100644
index 0000000..552c865
--- /dev/null
+++ b/runtime/ftplugin/scdoc.vim
@@ -0,0 +1,22 @@
+" scdoc filetype plugin
+" Maintainer: Gregory Anders <contact@gpanders.com>
+" Last Updated: 2022-05-09
+" Upstream: https://github.com/gpanders/vim-scdoc
+
+" 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
+
+setlocal comments=b:;
+setlocal commentstring=;%s
+setlocal formatoptions+=t
+setlocal noexpandtab
+setlocal shiftwidth=0
+setlocal softtabstop=0
+setlocal textwidth=80
+
+let b:undo_ftplugin = 'setl com< cms< fo< et< sw< sts< tw<'
diff --git a/runtime/ftplugin/scheme.vim b/runtime/ftplugin/scheme.vim
new file mode 100644
index 0000000..04655bc
--- /dev/null
+++ b/runtime/ftplugin/scheme.vim
@@ -0,0 +1,58 @@
+" Vim filetype plugin file
+" Language: Scheme (R7RS)
+" Last Change: 2019-11-19
+" Author: Evan Hanson <evhan@foldling.org>
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" Previous Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
+" Repository: https://git.foldling.org/vim-scheme.git
+" URL: https://foldling.org/vim/ftplugin/scheme.vim
+
+if exists('b:did_ftplugin')
+ finish
+endif
+
+let s:cpo = &cpo
+set cpo&vim
+
+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
+
+let b:undo_ftplugin = 'setl lisp< comments< commentstring< define< iskeyword<'
+
+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<'
+
+let b:did_scheme_ftplugin = 1
+
+if exists('b:is_chicken') || exists('g:is_chicken')
+ runtime! ftplugin/chicken.vim
+endif
+
+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
new file mode 100644
index 0000000..c22089b
--- /dev/null
+++ b/runtime/ftplugin/screen.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: screen(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/scss.vim b/runtime/ftplugin/scss.vim
new file mode 100644
index 0000000..287d298
--- /dev/null
+++ b/runtime/ftplugin/scss.vim
@@ -0,0 +1,13 @@
+" Vim filetype plugin
+" Language: SCSS
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" 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
new file mode 100644
index 0000000..c02a729
--- /dev/null
+++ b/runtime/ftplugin/sensors.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" 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
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/services.vim b/runtime/ftplugin/services.vim
new file mode 100644
index 0000000..dda08ac
--- /dev/null
+++ b/runtime/ftplugin/services.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" 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
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/setserial.vim b/runtime/ftplugin/setserial.vim
new file mode 100644
index 0000000..e5823f4
--- /dev/null
+++ b/runtime/ftplugin/setserial.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: setserial(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/sexplib.vim b/runtime/ftplugin/sexplib.vim
new file mode 100644
index 0000000..27e1b28
--- /dev/null
+++ b/runtime/ftplugin/sexplib.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin file
+" Language: Sexplib
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" URL: https://github.com/ocaml/vim-ocaml
+" Last Change:
+" 2017 Apr 12 - First version (MM)
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin=1
+
+" Comment string
+setl commentstring=;\ %s
+setl comments=:;
diff --git a/runtime/ftplugin/sgml.vim b/runtime/ftplugin/sgml.vim
new file mode 100644
index 0000000..ef52125
--- /dev/null
+++ b/runtime/ftplugin/sgml.vim
@@ -0,0 +1,42 @@
+" Vim filetype plugin file
+" Language: sgml
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "XML Files (*.xml)\t*.xml\n" .
+ \ "All Files (*.*)\t*.*\n"
+
+runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show xml-related files.
+if has("gui_win32")
+ let b:browsefilter="SGML Files (*.sgml,*.sgm)\t*.sgm*\n" . s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/sh.vim b/runtime/ftplugin/sh.vim
new file mode 100644
index 0000000..b6fdb8f
--- /dev/null
+++ b/runtime/ftplugin/sh.vim
@@ -0,0 +1,48 @@
+" Vim filetype plugin file
+" Language: sh
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Change: 2022 Sep 07
+
+if exists("b:did_ftplugin")
+ finish
+endif
+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
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+" Shell: thanks to Johannes Zellner
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 0
+ let s:sol = '\%(;\s*\|^\s*\)\@<=' " start of line
+ let b:match_words =
+ \ s:sol .. 'if\>:' .. s:sol.'elif\>:' .. s:sol.'else\>:' .. s:sol .. 'fi\>,' ..
+ \ s:sol .. '\%(for\|while\)\>:' .. s:sol .. 'done\>,' ..
+ \ s:sol .. 'case\>:' .. s:sol .. 'esac\>'
+ unlet s:sol
+ let b:undo_ftplugin ..= " | unlet! b:match_ignorecase b:match_words"
+endif
+
+" Change the :browse e filter to primarily show shell-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Bourne Shell Scripts (*.sh)\t*.sh\n" ..
+ \ "Korn Shell Scripts (*.ksh)\t*.ksh\n" ..
+ \ "Bash Shell Scripts (*.bash)\t*.bash\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/sieve.vim b/runtime/ftplugin/sieve.vim
new file mode 100644
index 0000000..3092b5d
--- /dev/null
+++ b/runtime/ftplugin/sieve.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: Sieve filtering language input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/slpconf.vim b/runtime/ftplugin/slpconf.vim
new file mode 100644
index 0000000..a975a49
--- /dev/null
+++ b/runtime/ftplugin/slpconf.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" 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
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:#,:; commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/slpreg.vim b/runtime/ftplugin/slpreg.vim
new file mode 100644
index 0000000..74c7285
--- /dev/null
+++ b/runtime/ftplugin/slpreg.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" 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
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:#,:; commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/slpspi.vim b/runtime/ftplugin/slpspi.vim
new file mode 100644
index 0000000..633555e
--- /dev/null
+++ b/runtime/ftplugin/slpspi.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" 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
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:#,:; commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/solution.vim b/runtime/ftplugin/solution.vim
new file mode 100644
index 0000000..bd30c7b
--- /dev/null
+++ b/runtime/ftplugin/solution.vim
@@ -0,0 +1,37 @@
+" Vim filetype plugin file
+" Language: Microsoft Visual Studio Solution
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Dec 15
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
+
+let b:undo_ftplugin = "setl com< cms<"
+
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words =
+ \ '\<Project\>:\<EndProject\>,' ..
+ \ '\<ProjectSection\>:\<EndProjectSection\>,' ..
+ \ '\<Global\>:\<EndGlobal\>,' ..
+ \ '\<GlobalSection\>:\<EndGlobalSection\>'
+ let b:undo_ftplugin ..= " | unlet! b:match_words"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Microsoft Visual Studio Solution Files\t*.sln\n" ..
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/ftplugin/spec.vim b/runtime/ftplugin/spec.vim
new file mode 100644
index 0000000..9040e19
--- /dev/null
+++ b/runtime/ftplugin/spec.vim
@@ -0,0 +1,209 @@
+" Plugin to update the %changelog section of RPM spec files
+" Filename: spec.vim
+" Maintainer: Igor Gnatenko i.gnatenko.brain@gmail.com
+" Former Maintainer: Gustavo Niemeyer <niemeyer@conectiva.com> (until March 2014)
+" Last Change: Mon Jun 01 21:15 MSK 2015 Igor Gnatenko
+" Update by Zdenek Dohnal, 2022 May 17
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if !exists("no_plugin_maps") && !exists("no_spec_maps")
+ if !hasmapto("<Plug>SpecChangelog")
+ map <buffer> <LocalLeader>c <Plug>SpecChangelog
+ endif
+endif
+
+if !hasmapto("call <SID>SpecChangelog(\"\")<CR>")
+ noremap <buffer> <unique> <script> <Plug>SpecChangelog :call <SID>SpecChangelog("")<CR>
+endif
+
+if !exists("*s:GetRelVer")
+ function! s:GetRelVer()
+ if has('python')
+python << PYEND
+import sys, datetime, shutil, tempfile
+import vim
+
+try:
+ import rpm
+except ImportError:
+ pass
+else:
+ specfile = vim.current.buffer.name
+ if specfile:
+ rpm.delMacro("dist")
+ spec = rpm.spec(specfile)
+ headers = spec.sourceHeader
+ version = headers["Version"]
+ release = headers["Release"]
+ vim.command("let ver = '" + version + "'")
+ vim.command("let rel = '" + release + "'")
+PYEND
+ endif
+ endfunction
+endif
+
+if !exists("*s:SpecChangelog")
+ function s:SpecChangelog(format)
+ if strlen(a:format) == 0
+ if !exists("g:spec_chglog_format")
+ let email = input("Name <email address>: ")
+ let g:spec_chglog_format = "%a %b %d %Y " . l:email
+ echo "\r"
+ endif
+ let format = g:spec_chglog_format
+ else
+ if !exists("g:spec_chglog_format")
+ let g:spec_chglog_format = a:format
+ endif
+ let format = a:format
+ endif
+ let line = 0
+ let name = ""
+ let ver = ""
+ let rel = ""
+ let nameline = -1
+ let verline = -1
+ let relline = -1
+ let chgline = -1
+ while (line <= line("$"))
+ let linestr = getline(line)
+ if name == "" && linestr =~? '^Name:'
+ let nameline = line
+ let name = substitute(strpart(linestr,5), '^[ ]*\([^ ]\+\)[ ]*$','\1','')
+ elseif ver == "" && linestr =~? '^Version:'
+ let verline = line
+ let ver = substitute(strpart(linestr,8), '^[ ]*\([^ ]\+\)[ ]*$','\1','')
+ elseif rel == "" && linestr =~? '^Release:'
+ let relline = line
+ let rel = substitute(strpart(linestr,8), '^[ ]*\([^ ]\+\)[ ]*$','\1','')
+ elseif linestr =~? '^%changelog'
+ let chgline = line
+ execute line
+ break
+ endif
+ let line = line+1
+ endwhile
+ if nameline != -1 && verline != -1 && relline != -1
+ let include_release_info = exists("g:spec_chglog_release_info")
+ let name = s:ParseRpmVars(name, nameline)
+ let ver = s:ParseRpmVars(ver, verline)
+ let rel = s:ParseRpmVars(rel, relline)
+ else
+ let include_release_info = 0
+ endif
+
+ call s:GetRelVer()
+
+ if chgline == -1
+ let option = confirm("Can't find %changelog. Create one? ","&End of file\n&Here\n&Cancel",3)
+ if option == 1
+ call append(line("$"),"")
+ call append(line("$"),"%changelog")
+ execute line("$")
+ let chgline = line(".")
+ elseif option == 2
+ call append(line("."),"%changelog")
+ normal j
+ let chgline = line(".")
+ 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
+ let insert_line = 0
+ if getline(chgline+1) != parsed_format
+ let wrong_format = 1
+ endif
+ if include_release_info && getline(chgline+2) != release_info
+ let wrong_release = 1
+ endif
+ if wrong_format || wrong_release
+ if include_release_info && !wrong_release && !exists("g:spec_chglog_never_increase_release")
+ let option = confirm("Increase release? ","&Yes\n&No",1)
+ if option == 1
+ execute relline
+ normal 
+ let rel = substitute(strpart(getline(relline),8), '^[ ]*\([^ ]\+\)[ ]*$','\1','')
+ let release_info = "+ ".name."-".ver."-".rel
+ endif
+ endif
+ let n = 0
+ call append(chgline+n, parsed_format)
+ if include_release_info
+ let n = n + 1
+ call append(chgline+n, release_info)
+ endif
+ let n = n + 1
+ call append(chgline+n,"- ")
+ let n = n + 1
+ call append(chgline+n,"")
+ let insert_line = chgline+n
+ else
+ let line = chgline
+ if !exists("g:spec_chglog_prepend")
+ while !(getline(line+2) =~ '^\( *\|\*.*\)$')
+ let line = line+1
+ endwhile
+ endif
+ call append(line+1,"- ")
+ let insert_line = line+2
+ endif
+ execute insert_line
+ startinsert!
+ endif
+ endfunction
+endif
+
+if !exists("*s:ParseRpmVars")
+ function s:ParseRpmVars(str, strline)
+ let end = -1
+ let ret = ""
+ while (1)
+ let start = match(a:str, "\%{", end+1)
+ if start == -1
+ let ret = ret . strpart(a:str, end+1)
+ break
+ endif
+ let ret = ret . strpart(a:str, end+1, start-(end+1))
+ let end = match(a:str, "}", start)
+ if end == -1
+ let ret = ret . strpart(a:str, start)
+ break
+ endif
+ let varname = strpart(a:str, start+2, end-(start+2))
+ execute a:strline
+ let definestr = "^[ \t]*%\\(define\\|global\\)[ \t]\\+".varname."[ \t]\\+\\(.*\\)$"
+ let linenum = search(definestr, "bW")
+ if linenum != 0
+ let ret = ret . substitute(getline(linenum), definestr, "\\2", "")
+ endif
+ endwhile
+ return ret
+ endfunction
+endif
+
+" The following lines, along with the macros/matchit.vim plugin,
+" make it easy to navigate the different sections of a spec file
+" with the % key (thanks to Max Ischenko).
+
+let b:match_ignorecase = 0
+let b:match_words =
+ \ '^Name:^%description:^%clean:^%(?:auto)?setup:^%build:^%install:^%files:' .
+ \ '^%package:^%preun:^%postun:^%changelog'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+let b:undo_ftplugin = "unlet! b:match_ignorecase b:match_words"
diff --git a/runtime/ftplugin/sql.vim b/runtime/ftplugin/sql.vim
new file mode 100644
index 0000000..1c02a98
--- /dev/null
+++ b/runtime/ftplugin/sql.vim
@@ -0,0 +1,548 @@
+" SQL filetype plugin file
+" Language: SQL (Common for Oracle, Microsoft SQL Server, Sybase)
+" Version: 12.0
+" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
+" Last Change: 2017 Mar 07
+" Download: http://vim.sourceforge.net/script.php?script_id=454
+
+" For more details please use:
+" :h sql.txt
+"
+" This file should only contain values that are common to all SQL languages
+" Oracle, Microsoft SQL Server, Sybase ASA/ASE, MySQL, and so on
+" If additional features are required create:
+" vimfiles/after/ftplugin/sql.vim (Windows)
+" .vim/after/ftplugin/sql.vim (Unix)
+" to override and add any of your own settings.
+
+
+" This file also creates a command, SQLSetType, which allows you to change
+" SQL dialects on the fly. For example, if I open an Oracle SQL file, it
+" is color highlighted appropriately. If I open an Informix SQL file, it
+" will still be highlighted according to Oracles settings. By running:
+" :SQLSetType sqlinformix
+"
+" All files called sqlinformix.vim will be loaded from the indent and syntax
+" directories. This allows you to easily flip SQL dialects on a per file
+" basis. NOTE: you can also use completion:
+" :SQLSetType <tab>
+"
+" To change the default dialect, add the following to your vimrc:
+" let g:sql_type_default = 'sqlanywhere'
+"
+" This file also creates a command, SQLGetType, which allows you to
+" determine what the current dialect is in use.
+" :SQLGetType
+"
+" 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.
+"
+" Version 10.0 (Dec 2012)
+"
+" NF: Changed all maps to use noremap instead of must map
+" NF: Changed all visual maps to use xnoremap instead of vnoremap as they
+" should only be used in visual mode and not select mode.
+" BF: Most of the maps were using doubled up backslashes before they were
+" changed to using the search() function, which meant they no longer
+" worked.
+"
+" Version 9.0
+"
+" NF: Completes 'b:undo_ftplugin'
+" BF: Correctly set cpoptions when creating script
+"
+" Version 8.0
+"
+" NF: Improved the matchit plugin regex (Talek)
+"
+" Version 7.0
+"
+" NF: Calls the sqlcomplete#ResetCacheSyntax() function when calling
+" SQLSetType.
+"
+" Version 6.0
+"
+" NF: Adds the command SQLGetType
+"
+" Version 5.0
+"
+" NF: Adds the ability to choose the keys to control SQL completion, just add
+" the following to your .vimrc:
+" let g:ftplugin_sql_omni_key = '<C-C>'
+" let g:ftplugin_sql_omni_key_right = '<Right>'
+" let g:ftplugin_sql_omni_key_left = '<Left>'
+"
+" BF: format-options - Auto-wrap comments using textwidth was turned off
+" by mistake.
+
+
+" Only do this when not done yet for this buffer
+" 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
+" c Auto-wrap comments using textwidth, inserting the current comment
+" leader automatically.
+setlocal formatoptions-=t
+setlocal formatoptions+=c
+
+" Functions/Commands to allow the user to change SQL syntax dialects
+" through the use of :SQLSetType <tab> for completion.
+" This works with both Vim 6 and 7.
+
+if !exists("*SQL_SetType")
+ " NOTE: You cannot use function! since this file can be
+ " sourced from within this function. That will result in
+ " an error reported by Vim.
+ function SQL_GetList(ArgLead, CmdLine, CursorPos)
+
+ if !exists('s:sql_list')
+ " Grab a list of files that contain "sql" in their names
+ let list_indent = globpath(&runtimepath, 'indent/*sql*')
+ let list_syntax = globpath(&runtimepath, 'syntax/*sql*')
+ let list_ftplugin = globpath(&runtimepath, 'ftplugin/*sql*')
+
+ let sqls = "\n".list_indent."\n".list_syntax."\n".list_ftplugin."\n"
+
+ " Strip out everything (path info) but the filename
+ " Regex
+ " From between two newline characters
+ " Non-greedily grab all characters
+ " Followed by a valid filename \w\+\.\w\+ (sql.vim)
+ " Followed by a newline, but do not include the newline
+ "
+ " Replace it with just the filename (get rid of PATH)
+ "
+ " Recursively, since there are many filenames that contain
+ " the word SQL in the indent, syntax and ftplugin directory
+ let sqls = substitute( sqls,
+ \ '[\n]\%(.\{-}\)\(\w\+\.\w\+\)\n\@=',
+ \ '\1\n',
+ \ 'g'
+ \ )
+
+ " Remove duplicates, since sqlanywhere.vim can exist in the
+ " sytax, indent and ftplugin directory, yet we only want
+ " to display the option once
+ let index = match(sqls, '.\{-}\ze\n')
+ while index > -1
+ " Get the first filename
+ let file = matchstr(sqls, '.\{-}\ze\n', index)
+ " Recursively replace any *other* occurrence of that
+ " filename with nothing (ie remove it)
+ let sqls = substitute(sqls, '\%>'.(index+strlen(file)).'c\<'.file.'\>\n', '', 'g')
+ " Move on to the next filename
+ let index = match(sqls, '.\{-}\ze\n', (index+strlen(file)+1))
+ endwhile
+
+ " Sort the list if using version 7
+ if v:version >= 700
+ let mylist = split(sqls, "\n")
+ let mylist = sort(mylist)
+ let sqls = join(mylist, "\n")
+ endif
+
+ let s:sql_list = sqls
+ endif
+
+ return s:sql_list
+
+ endfunction
+
+ function SQL_SetType(name)
+
+ " User has decided to override default SQL scripts and
+ " specify a vendor specific version
+ " (ie Oracle, Informix, SQL Anywhere, ...)
+ " So check for an remove any settings that prevent the
+ " scripts from being executed, and then source the
+ " appropriate Vim scripts.
+ if exists("b:did_ftplugin")
+ unlet b:did_ftplugin
+ endif
+ 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'
+ unlet b:did_indent
+ " Set these values to their defaults
+ setlocal indentkeys&
+ setlocal indentexpr&
+ endif
+
+ " Ensure the name is in the correct format
+ let new_sql_type = substitute(a:name,
+ \ '\s*\([^\.]\+\)\(\.\w\+\)\?', '\L\1', '')
+
+ " Do not specify a buffer local variable if it is
+ " the default value
+ if new_sql_type == 'sql'
+ let new_sql_type = 'sqloracle'
+ endif
+ let b:sql_type_override = new_sql_type
+
+ " Remove any cached SQL since a new sytax will have different
+ " items and groups
+ if !exists('g:loaded_sql_completion') || g:loaded_sql_completion >= 100
+ call sqlcomplete#ResetCacheSyntax()
+ endif
+
+ " Vim will automatically source the correct files if we
+ " change the filetype. You cannot do this with setfiletype
+ " since that command will only execute if a filetype has
+ " not already been set. In this case we want to override
+ " the existing filetype.
+ let &filetype = 'sql'
+
+ if b:sql_compl_savefunc != ""
+ " We are changing the filetype to SQL from some other filetype
+ " which had OMNI completion defined. We need to activate the
+ " SQL completion plugin in order to cache some of the syntax items
+ " while the syntax rules for SQL are active.
+ call sqlcomplete#PreCacheSyntax()
+ endif
+ endfunction
+ command! -nargs=* -complete=custom,SQL_GetList SQLSetType :call SQL_SetType(<q-args>)
+
+endif
+
+" Functions/Commands to allow the user determine current SQL syntax dialect
+" This works with both Vim 6 and 7.
+
+if !exists("*SQL_GetType")
+ function SQL_GetType()
+ if exists('b:sql_type_override')
+ echomsg "Current SQL dialect in use:".b:sql_type_override
+ else
+ echomsg "Current SQL dialect in use:".g:sql_type_default
+ endif
+ endfunction
+ command! -nargs=0 SQLGetType :call SQL_GetType()
+endif
+
+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'
+ 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'
+ endif
+endif
+
+" If the above runtime command succeeded, do not load the default settings
+" 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"
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+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"
+endif
+
+" Some standard expressions for use with the matchit strings
+let s:notend = '\%(\<end\s\+\)\@<!'
+let s:when_no_matched_or_others = '\%(\<when\>\%(\s\+\%(\%(\<not\>\s\+\)\?<matched\>\)\|\<others\>\)\@!\)'
+let s:or_replace = '\%(or\s\+replace\s\+\)\?'
+
+" Define patterns for the matchit macro
+if !exists("b:match_words")
+ " SQL is generally case insensitive
+ let b:match_ignorecase = 1
+
+ " Handle the following:
+ " if
+ " elseif | elsif
+ " else [if]
+ " end if
+ "
+ " [while condition] loop
+ " leave
+ " break
+ " continue
+ " exit
+ " end loop
+ "
+ " for
+ " leave
+ " break
+ " continue
+ " exit
+ " end loop
+ "
+ " do
+ " statements
+ " doend
+ "
+ " case
+ " when
+ " when
+ " default
+ " end case
+ "
+ " merge
+ " when not matched
+ " when matched
+ "
+ " EXCEPTION
+ " 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\)\>.*:'.
+
+ " For ColdFusion support
+ setlocal matchpairs+=<:>
+ let b:match_words = &matchpairs .
+ \ ',\%(\<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\>,'.
+ \
+ \ '\(^\s*\)\@<=\(\<\%(do\|for\|while\|loop\)\>.*\):'.
+ \ '\%(\<exit\>\|\<leave\>\|\<break\>\|\<continue\>\):'.
+ \ '\%(\<doend\>\|\%(\<end\s\+\%(for\|while\|loop\>\)\)\),'.
+ \
+ \ '\%('. s:notend . '\<case\>\):'.
+ \ '\%('.s:when_no_matched_or_others.'\):'.
+ \ '\%(\<when\s\+others\>\|\<end\s\+case\>\),' .
+ \
+ \ '\<merge\>:' .
+ \ '\<when\s\+not\s\+matched\>:' .
+ \ '\<when\s\+matched\>,' .
+ \
+ \ '\%(\<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\>\),' .
+endif
+
+" Define how to find the macro definition of a variable using the various
+" [d, [D, [_CTRL_D and so on features
+" Match these values ignoring case
+" ie DECLARE varname INTEGER
+let &l:define = '\c\<\(VARIABLE\|DECLARE\|IN\|OUT\|INOUT\)\>'
+
+
+" Mappings to move to the next BEGIN ... END block
+" \W - no characters or digits
+nnoremap <buffer> <silent> ]] :call search('\c^\s*begin\>', 'W' )<CR>
+nnoremap <buffer> <silent> [[ :call search('\c^\s*begin\>', 'bW' )<CR>
+nnoremap <buffer> <silent> ][ :call search('\c^\s*end\W*$', 'W' )<CR>
+nnoremap <buffer> <silent> [] :call search('\c^\s*end\W*$', 'bW' )<CR>
+xnoremap <buffer> <silent> ]] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'W' )<CR>
+xnoremap <buffer> <silent> [[ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*begin\>', 'bW' )<CR>
+xnoremap <buffer> <silent> ][ :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'W' )<CR>
+xnoremap <buffer> <silent> [] :<C-U>exec "normal! gv"<Bar>call search('\c^\s*end\W*$', 'bW' )<CR>
+
+
+" By default only look for CREATE statements, but allow
+" the user to override
+if !exists('g:ftplugin_sql_statements')
+ let g:ftplugin_sql_statements = 'create'
+endif
+
+" Predefined SQL objects what are used by the below mappings using
+" the ]} style maps.
+" This global variable allows the users to override its value
+" from within their vimrc.
+" Note, you cannot use \?, since these patterns can be used to search
+" backwards, you must use \{,1}
+if !exists('g:ftplugin_sql_objects')
+ let g:ftplugin_sql_objects = 'function,procedure,event,' .
+ \ '\(existing\\|global\s\+temporary\s\+\)\{,1}' .
+ \ 'table,trigger' .
+ \ ',schema,service,publication,database,datatype,domain' .
+ \ ',index,subscription,synchronization,view,variable'
+endif
+
+" Key to trigger SQL completion
+if !exists('g:ftplugin_sql_omni_key')
+ let g:ftplugin_sql_omni_key = '<C-C>'
+endif
+" Key to trigger drill into column list
+if !exists('g:ftplugin_sql_omni_key_right')
+ let g:ftplugin_sql_omni_key_right = '<Right>'
+endif
+" Key to trigger drill out of column list
+if !exists('g:ftplugin_sql_omni_key_left')
+ let g:ftplugin_sql_omni_key_left = '<Left>'
+endif
+
+" Replace all ,'s with bars, except ones with numbers after them.
+" This will most likely be a \{,1} string.
+let s:ftplugin_sql_objects =
+ \ '\c^\s*' .
+ \ '\(\(' .
+ \ substitute(g:ftplugin_sql_statements, ',\d\@!', '\\\\|', 'g') .
+ \ '\)\s\+\(or\s\+replace\s\+\)\{,1}\)\{,1}' .
+ \ '\<\(' .
+ \ substitute(g:ftplugin_sql_objects, ',\d\@!', '\\\\|', 'g') .
+ \ '\)\>'
+
+" Mappings to move to the next CREATE ... block
+exec "nnoremap <buffer> <silent> ]} :call search('".s:ftplugin_sql_objects."', 'W')<CR>"
+exec "nnoremap <buffer> <silent> [{ :call search('".s:ftplugin_sql_objects."', 'bW')<CR>"
+" Could not figure out how to use a :call search() string in visual mode
+" without it ending visual mode
+" Unfortunately, this will add a entry to the search history
+exec 'xnoremap <buffer> <silent> ]} /'.s:ftplugin_sql_objects.'<CR>'
+exec 'xnoremap <buffer> <silent> [{ ?'.s:ftplugin_sql_objects.'<CR>'
+
+" Mappings to move to the next COMMENT
+"
+" Had to double the \ for the \| separator since this has a special
+" meaning on maps
+let b:comment_leader = '\(--\\|\/\/\\|\*\\|\/\*\\|\*\/\)'
+" Find the start of the next comment
+let b:comment_start = '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
+ \ '\(\s*'.b:comment_leader.'\)'
+" Find the end of the previous comment
+let b:comment_end = '\(^\s*'.b:comment_leader.'.*\n\)'.
+ \ '\(^\s*'.b:comment_leader.'\)\@!'
+" Skip over the comment
+let b:comment_jump_over = "call search('".
+ \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
+ \ "', 'W')"
+let b:comment_skip_back = "call search('".
+ \ '^\(\s*'.b:comment_leader.'.*\n\)\@<!'.
+ \ "', 'bW')"
+" Move to the start and end of comments
+exec 'nnoremap <silent><buffer> ]" :call search('."'".b:comment_start."'".', "W" )<CR>'
+exec 'nnoremap <silent><buffer> [" :call search('."'".b:comment_end."'".', "W" )<CR>'
+exec 'xnoremap <silent><buffer> ]" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_start."'".', "W" )<CR>'
+exec 'xnoremap <silent><buffer> [" :<C-U>exec "normal! gv"<Bar>call search('."'".b:comment_end."'".', "W" )<CR>'
+
+" Comments can be of the form:
+" /*
+" *
+" */
+" or
+" --
+" or
+" //
+setlocal comments=s1:/*,mb:*,ex:*/,:--,://
+
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+if exists('&omnifunc')
+ " Since the SQL completion plugin can be used in conjunction
+ " with other completion filetypes it must record the previous
+ " OMNI function prior to setting up the SQL OMNI function
+ let b:sql_compl_savefunc = &omnifunc
+
+ " Source it to determine its version
+ runtime autoload/sqlcomplete.vim
+ " This is used by the sqlcomplete.vim plugin
+ " Source it for its global functions
+ runtime autoload/syntaxcomplete.vim
+
+ setlocal omnifunc=sqlcomplete#Complete
+ " Prevent the intellisense plugin from loading
+ let b:sql_vis = 1
+ if !exists('g:omni_sql_no_default_maps')
+ let regex_extra = ''
+ if exists('g:loaded_syntax_completion') && exists('g:loaded_sql_completion')
+ if g:loaded_syntax_completion > 120 && g:loaded_sql_completion > 140
+ let regex_extra = '\\w*'
+ endif
+ endif
+ " Static maps which use populate the completion list
+ " using Vim's syntax highlighting rules
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'a <C-\><C-O>:call sqlcomplete#Map("syntax")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'k <C-\><C-O>:call sqlcomplete#Map("sqlKeyword'.regex_extra.'")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'f <C-\><C-O>:call sqlcomplete#Map("sqlFunction'.regex_extra.'")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'o <C-\><C-O>:call sqlcomplete#Map("sqlOption'.regex_extra.'")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'T <C-\><C-O>:call sqlcomplete#Map("sqlType'.regex_extra.'")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'s <C-\><C-O>:call sqlcomplete#Map("sqlStatement'.regex_extra.'")<CR><C-X><C-O>'
+ " Dynamic maps which use populate the completion list
+ " using the dbext.vim plugin
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'t <C-\><C-O>:call sqlcomplete#Map("table")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'p <C-\><C-O>:call sqlcomplete#Map("procedure")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'v <C-\><C-O>:call sqlcomplete#Map("view")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'c <C-\><C-O>:call sqlcomplete#Map("column")<CR><C-X><C-O>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'l <C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>'
+ " The next 3 maps are only to be used while the completion window is
+ " active due to the <CR> at the beginning of the map
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'L <C-Y><C-\><C-O>:call sqlcomplete#Map("column_csv")<CR><C-X><C-O>'
+ " <C-Right> is not recognized on most Unix systems, so only create
+ " these additional maps on the Windows platform.
+ " If you would like to use these maps, choose a different key and make
+ " the same map in your vimrc.
+ " if has('win32')
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_right.' <C-R>=sqlcomplete#DrillIntoTable()<CR>'
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key_left.' <C-R>=sqlcomplete#DrillOutOfColumns()<CR>'
+ " endif
+ " Remove any cached items useful for schema changes
+ exec 'inoremap <buffer> '.g:ftplugin_sql_omni_key.'R <C-\><C-O>:call sqlcomplete#Map("resetCache")<CR><C-X><C-O>'
+ endif
+
+ if b:sql_compl_savefunc != ""
+ " We are changing the filetype to SQL from some other filetype
+ " which had OMNI completion defined. We need to activate the
+ " SQL completion plugin in order to cache some of the syntax items
+ " while the syntax rules for SQL are active.
+ call sqlcomplete#ResetCacheSyntax()
+ call sqlcomplete#PreCacheSyntax()
+ endif
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim:sw=4:
diff --git a/runtime/ftplugin/ssa.vim b/runtime/ftplugin/ssa.vim
new file mode 100644
index 0000000..04cc7a9
--- /dev/null
+++ b/runtime/ftplugin/ssa.vim
@@ -0,0 +1,13 @@
+" Vim filetype plugin
+" Language: SubStation Alpha
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Oct 10
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal comments=:;,:!: commentstring=;\ %s
+
+let b:undo_ftplugin = 'setl com< cms<'
diff --git a/runtime/ftplugin/sshconfig.vim b/runtime/ftplugin/sshconfig.vim
new file mode 100644
index 0000000..d933ce0
--- /dev/null
+++ b/runtime/ftplugin/sshconfig.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: OpenSSH client configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/sudoers.vim b/runtime/ftplugin/sudoers.vim
new file mode 100644
index 0000000..38dbf55
--- /dev/null
+++ b/runtime/ftplugin/sudoers.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: sudoers(5) configuration files
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/svg.vim b/runtime/ftplugin/svg.vim
new file mode 100644
index 0000000..6f16b1a
--- /dev/null
+++ b/runtime/ftplugin/svg.vim
@@ -0,0 +1,42 @@
+" Vim filetype plugin file
+" Language: svg
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "XML Files (*.xml)\t*.xml\n" .
+ \ "All Files (*.*)\t*.*\n"
+
+runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show xml-related files.
+if has("gui_win32")
+ let b:browsefilter="SVG Files (*.svg)\t*.svg\n" . s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/swayconfig.vim b/runtime/ftplugin/swayconfig.vim
new file mode 100644
index 0000000..45d6bdb
--- /dev/null
+++ b/runtime/ftplugin/swayconfig.vim
@@ -0,0 +1,16 @@
+" Vim filetype plugin file
+" Language: sway config file
+" Original Author: James Eapen <james.eapen@vai.org>
+" Maintainer: James Eapen <james.eapen@vai.org>
+" Version: 0.1
+" Last Change: 2022 June 07
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setlocal cms<"
+
+setlocal commentstring=#\ %s
diff --git a/runtime/ftplugin/swift.vim b/runtime/ftplugin/swift.vim
new file mode 100644
index 0000000..a86b782
--- /dev/null
+++ b/runtime/ftplugin/swift.vim
@@ -0,0 +1,23 @@
+" This source file is part of the Swift.org open source project
+"
+" Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
+" Licensed under Apache License v2.0 with Runtime Library Exception
+"
+" See https://swift.org/LICENSE.txt for license information
+" See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
+"
+" Vim maintainer: Emir SARI <bitigchi@me.com>
+" Last Change: 2021 Jan 08
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+let b:undo_ftplugin = "setlocal comments< expandtab< tabstop< shiftwidth< smartindent<"
+
+setlocal comments=s1:/*,mb:*,ex:*/,:///,://
+setlocal expandtab
+setlocal sw=4 sts=4
+setlocal smartindent
diff --git a/runtime/ftplugin/swiftgyb.vim b/runtime/ftplugin/swiftgyb.vim
new file mode 100644
index 0000000..8e8fc2b
--- /dev/null
+++ b/runtime/ftplugin/swiftgyb.vim
@@ -0,0 +1,11 @@
+" This source file is part of the Swift.org open source project
+"
+" Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
+" Licensed under Apache License v2.0 with Runtime Library Exception
+"
+" See https://swift.org/LICENSE.txt for license information
+" See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
+"
+" Vim maintainer: Emir SARI <bitigchi@me.com>
+
+runtime! ftplugin/swift.vim
diff --git a/runtime/ftplugin/sysctl.vim b/runtime/ftplugin/sysctl.vim
new file mode 100644
index 0000000..8d331ce
--- /dev/null
+++ b/runtime/ftplugin/sysctl.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: sysctl.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:;,:# commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/systemd.vim b/runtime/ftplugin/systemd.vim
new file mode 100644
index 0000000..4c5c9a1
--- /dev/null
+++ b/runtime/ftplugin/systemd.vim
@@ -0,0 +1,41 @@
+" Vim filetype plugin file
+" Language: systemd.unit(5)
+" Keyword Lookup Support: Enno Nagel <enno.nagel+vim@gmail.com>
+
+if !exists('b:did_ftplugin')
+ " Looks a lot like dosini files.
+ runtime! ftplugin/dosini.vim
+endif
+
+if !has('unix')
+ finish
+endif
+
+if !has('gui_running')
+ command! -buffer -nargs=1 Sman silent exe '!' . KeywordLookup_systemd(<q-args>) | redraw!
+elseif has('terminal')
+ command! -buffer -nargs=1 Sman silent exe 'term ' . KeywordLookup_systemd(<q-args>)
+else
+ finish
+endif
+
+if !exists('*KeywordLookup_systemd')
+ function KeywordLookup_systemd(keyword) abort
+ let matches = matchlist(getline(search('\v^\s*\[\s*.+\s*\]\s*$', 'nbWz')), '\v^\s*\[\s*(\k+).*\]\s*$')
+ if len(matches) > 1
+ let section = matches[1]
+ return 'LESS= MANPAGER="less --pattern=''(^|,)\s+' . a:keyword . '=$'' --hilite-search" man ' . 'systemd.' . section
+ else
+ return 'LESS= MANPAGER="less --pattern=''(^|,)\s+' . a:keyword . '=$'' --hilite-search" man ' . 'systemd'
+ endif
+ endfunction
+endif
+
+setlocal iskeyword+=-
+setlocal keywordprg=:Sman
+
+if !exists('b:undo_ftplugin') || empty(b:undo_ftplugin)
+ let b:undo_ftplugin = 'setlocal keywordprg< iskeyword<'
+else
+ let b:undo_ftplugin .= '| setlocal keywordprg< iskeyword<'
+endif
diff --git a/runtime/ftplugin/systemverilog.vim b/runtime/ftplugin/systemverilog.vim
new file mode 100644
index 0000000..38ed1ad
--- /dev/null
+++ b/runtime/ftplugin/systemverilog.vim
@@ -0,0 +1,44 @@
+" Vim filetype plugin file
+" Language: SystemVerilog
+" Maintainer: kocha <kocha.lsifrontend@gmail.com>
+" Last Change: 07-May-2021
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Behaves just like Verilog
+runtime! ftplugin/verilog.vim
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Add SystemVerilog keywords for matchit plugin.
+if exists("loaded_matchit")
+ let b:match_words =
+ \ '\<begin\>:\<end\>,' .
+ \ '\<case\>\|\<casex\>\|\<casez\>:\<endcase\>,' .
+ \ '\<module\>:\<endmodule\>,' .
+ \ '\<if\>:`\@<!\<else\>,' .
+ \ '\<function\>:\<endfunction\>,' .
+ \ '`ifn\?def\>:`elsif\>:`else\>:`endif\>,' .
+ \ '\<task\>:\<endtask\>,' .
+ \ '\<specify\>:\<endspecify\>,' .
+ \ '\<config\>:\<endconfig\>,' .
+ \ '\<generate\>:\<endgenerate\>,' .
+ \ '\<fork\>:\<join\>\|\<join_any\>\|\<join_none\>,' .
+ \ '\<primitive\>:\<endprimitive\>,' .
+ \ '\<table\>:\<endtable\>,' .
+ \ '\<checker\>:\<endchecker\>,' .
+ \ '\<class\>:\<endclass\>,' .
+ \ '\<clocking\>:\<endclocking\>,' .
+ \ '\<group\>:\<endgroup\>,' .
+ \ '\<interface\>:\<endinterface\>,' .
+ \ '\<package\>:\<endpackage\>,' .
+ \ '\<program\>:\<endprogram\>,' .
+ \ '\<property\>:\<endproperty\>,' .
+ \ '\<sequence\>:\<endsequence\>'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/tap.vim b/runtime/ftplugin/tap.vim
new file mode 100644
index 0000000..c165c0c
--- /dev/null
+++ b/runtime/ftplugin/tap.vim
@@ -0,0 +1,27 @@
+" Vim filetype plugin file
+" Language: Verbose TAP Output
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2021 Oct 22
+
+" Only do this when not done yet for this buffer
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setlocal foldtext=TAPTestLine_foldtext()
+function! TAPTestLine_foldtext()
+ let line = getline(v:foldstart)
+ let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
+ return sub
+endfunction
+
+setlocal foldminlines=5
+setlocal foldcolumn=2
+setlocal foldenable
+setlocal foldmethod=syntax
+
+let b:undo_ftplugin = 'setlocal foldtext< foldminlines< foldcolumn< foldenable< foldmethod<'
diff --git a/runtime/ftplugin/tcl.vim b/runtime/ftplugin/tcl.vim
new file mode 100644
index 0000000..1cc24d3
--- /dev/null
+++ b/runtime/ftplugin/tcl.vim
@@ -0,0 +1,37 @@
+" Vim filetype plugin file
+" Language: Tcl
+" Maintainer: Robert L Hicks <sigzero@gmail.com>
+" Latest Revision: 2009-05-01
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:cpo_save = &cpo
+set cpo-=C
+
+setlocal comments=:#
+setlocal commentstring=#%s
+setlocal formatoptions+=croql
+
+" Change the browse dialog on Windows to show mainly Tcl-related files
+if has("gui_win32")
+ let b:browsefilter = "Tcl Source Files (.tcl)\t*.tcl\n" .
+ \ "Tcl Test Files (.test)\t*.test\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+"-----------------------------------------------------------------------------
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "setlocal fo< com< cms< inc< inex< def< isf< kp<" .
+ \ " | unlet! b:browsefilter"
+
+" Restore the saved compatibility options.
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: set et ts=4 sw=4 tw=78:
diff --git a/runtime/ftplugin/tcsh.vim b/runtime/ftplugin/tcsh.vim
new file mode 100644
index 0000000..85d3873
--- /dev/null
+++ b/runtime/ftplugin/tcsh.vim
@@ -0,0 +1,35 @@
+" Vim filetype plugin file
+" Language: tcsh
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Change: 2021 Oct 15
+
+if exists("b:did_ftplugin") | finish | endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "csh Files (*.csh)\t*.csh\n" ..
+ \ "All Files (*.*)\t*.*\n"
+
+runtime! ftplugin/csh.vim ftplugin/csh_*.vim ftplugin/csh/*.vim
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+if (has("gui_win32") || has("gui_gtk"))
+ let b:browsefilter="tcsh Scripts (*.tcsh)\t*.tcsh\n" .. s:browsefilter
+endif
+
+let b:undo_ftplugin = "unlet! b:browsefilter | " .. s:undo_ftplugin
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/terminfo.vim b/runtime/ftplugin/terminfo.vim
new file mode 100644
index 0000000..0ffcc58
--- /dev/null
+++ b/runtime/ftplugin/terminfo.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: terminfo(5) definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/tex.vim b/runtime/ftplugin/tex.vim
new file mode 100644
index 0000000..0d68b51
--- /dev/null
+++ b/runtime/ftplugin/tex.vim
@@ -0,0 +1,46 @@
+" LaTeX filetype plugin
+" Language: LaTeX (ft=tex)
+" Maintainer: Benji Fisher, Ph.D. <benji@member.AMS.org>
+" Version: 1.4
+" Last Change: Wed 19 Apr 2006
+" URL: http://www.vim.org/script.php?script_id=411
+
+" Only do this when not done yet for this buffer.
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Start with plain TeX. This will also define b:did_ftplugin .
+source $VIMRUNTIME/ftplugin/plaintex.vim
+
+" Avoid problems if running in 'compatible' mode.
+let s:save_cpo = &cpo
+set cpo&vim
+
+let b:undo_ftplugin .= "| setl inex<"
+
+" Allow "[d" to be used to find a macro definition:
+" Recognize plain TeX \def as well as LaTeX \newcommand and \renewcommand .
+" I may as well add the AMS-LaTeX DeclareMathOperator as well.
+let &l:define .= '\|\\\(re\)\=new\(boolean\|command\|counter\|environment\|font'
+ \ . '\|if\|length\|savebox\|theorem\(style\)\=\)\s*\*\=\s*{\='
+ \ . '\|DeclareMathOperator\s*{\=\s*'
+
+" Tell Vim how to recognize LaTeX \include{foo} and plain \input bar :
+let &l:include .= '\|\\include{'
+" On some file systems, "{" and "}" are included in 'isfname'. In case the
+" TeX file has \include{fname} (LaTeX only), strip everything except "fname".
+let &l:includeexpr = "substitute(v:fname, '^.\\{-}{\\|}.*', '', 'g')"
+
+" The following lines enable the macros/matchit.vim plugin for
+" extended matching with the % key.
+" ftplugin/plaintex.vim already defines b:match_skip and b:match_ignorecase
+" and matches \(, \), \[, \], \{, and \} .
+if exists("loaded_matchit")
+ let b:match_words .= ',\\begin\s*\({\a\+\*\=}\):\\end\s*\1'
+endif " exists("loaded_matchit")
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim:sts=2:sw=2:
diff --git a/runtime/ftplugin/text.vim b/runtime/ftplugin/text.vim
new file mode 100644
index 0000000..c4cbcb5
--- /dev/null
+++ b/runtime/ftplugin/text.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin
+" Language: Text
+" Maintainer: David Barnett <daviebdawg+vim@gmail.com>
+" Last Change: 2019 Jan 10
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = 'setlocal comments< commentstring<'
+
+" We intentionally don't set formatoptions-=t since text should wrap as text.
+
+" Pseudo comment leaders to indent bulleted lists with '-' and '*'. And allow
+" for Mail quoted text with '>'.
+setlocal comments=fb:-,fb:*,n:>
+setlocal commentstring=
diff --git a/runtime/ftplugin/tidy.vim b/runtime/ftplugin/tidy.vim
new file mode 100644
index 0000000..470548d
--- /dev/null
+++ b/runtime/ftplugin/tidy.vim
@@ -0,0 +1,32 @@
+" Vim filetype plugin file
+" Language: HMTL Tidy Configuration
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Sep 4
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:#,://
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "HTML Tidy Files (tidyrc, .tidyrc, tidy.conf)\ttidyrc;.tidyrc;tidy.conf\n" .
+ \ "HTML Files (*.html, *.htm)\t*.html;*.htm\n" .
+ \ "XHTML Files (*.xhtml, *.xhtm)\t*.xhtml;*.xhtm\n" .
+ \ "XML Files (*.xml)\t*.xml\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl fo< com< cms<" .
+ \ " | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8
diff --git a/runtime/ftplugin/tmux.vim b/runtime/ftplugin/tmux.vim
new file mode 100644
index 0000000..5c3461f
--- /dev/null
+++ b/runtime/ftplugin/tmux.vim
@@ -0,0 +1,15 @@
+" 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
+
+let b:undo_ftplugin = "setlocal comments< commentstring<"
+
+setlocal comments=:#
+setlocal commentstring=#\ %s
diff --git a/runtime/ftplugin/toml.vim b/runtime/ftplugin/toml.vim
new file mode 100644
index 0000000..1ef09a1
--- /dev/null
+++ b/runtime/ftplugin/toml.vim
@@ -0,0 +1,23 @@
+" Vim filetype plugin
+" Language: TOML
+" Homepage: https://github.com/cespare/vim-toml
+" Maintainer: Aman Verma
+" Author: Kevin Ballard <kevin@sb.org>
+" Last Change: Sep 21, 2021
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+let b:undo_ftplugin = 'setlocal commentstring< comments<'
+
+setlocal commentstring=#\ %s
+setlocal comments=:#
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: et sw=2 sts=2
diff --git a/runtime/ftplugin/treetop.vim b/runtime/ftplugin/treetop.vim
new file mode 100644
index 0000000..f978d15
--- /dev/null
+++ b/runtime/ftplugin/treetop.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: Treetop
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-03-14
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=b:# commentstring=#\ %s formatoptions-=tcroq formatoptions+=l
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/tt2html.vim b/runtime/ftplugin/tt2html.vim
new file mode 100644
index 0000000..0407dbb
--- /dev/null
+++ b/runtime/ftplugin/tt2html.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin file
+" Language: TT2 embedded with HTML
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2018 Mar 28
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Just use the HTML plugin for now.
+runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
diff --git a/runtime/ftplugin/typescript.vim b/runtime/ftplugin/typescript.vim
new file mode 100644
index 0000000..f701ae9
--- /dev/null
+++ b/runtime/ftplugin/typescript.vim
@@ -0,0 +1,39 @@
+" Vim filetype plugin file
+" Language: TypeScript
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Aug 30
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal formatoptions-=t formatoptions+=croql
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+setlocal commentstring=//%s
+
+setlocal suffixesadd+=.ts,.d.ts,.tsx,.js,.jsx,.cjs,.mjs
+
+" Change the :browse e filter to primarily show TypeScript-related files.
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="TypeScript Files (*.ts)\t*.ts\n" .
+ \ "TypeScript Declaration Files (*.d.ts)\t*.d.ts\n" .
+ \ "TSX Files (*.tsx)\t*.tsx\n" .
+ \ "JavaScript Files (*.js)\t*.js\n" .
+ \ "JavaScript Modules (*.es, *.cjs, *.mjs)\t*.es;*.cjs;*.mjs\n" .
+ \ "JSON Files (*.json)\t*.json\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+let b:undo_ftplugin = "setl fo< com< cms< sua< | unlet! b:browsefilter"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/typescriptreact.vim b/runtime/ftplugin/typescriptreact.vim
new file mode 100644
index 0000000..3bd6001
--- /dev/null
+++ b/runtime/ftplugin/typescriptreact.vim
@@ -0,0 +1,33 @@
+" Vim filetype plugin file
+" Language: TypeScript React
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Aug 09
+
+let s:match_words = ""
+let s:undo_ftplugin = ""
+
+runtime! ftplugin/typescript.vim
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+if exists("b:match_words")
+ let s:match_words = b:match_words
+endif
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+
+" Matchit configuration
+if exists("loaded_matchit")
+ let b:match_ignorecase = 0
+ let b:match_words = s:match_words .
+ \ '<:>,' .
+ \ '<\@<=\([^ \t>/]\+\)\%(\s\+[^>]*\%([^/]>\|$\)\|>\|$\):<\@<=/\1>,' .
+ \ '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
+endif
+
+let b:undo_ftplugin = "unlet! b:match_words b:match_ignorecase | " . s:undo_ftplugin
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/udevconf.vim b/runtime/ftplugin/udevconf.vim
new file mode 100644
index 0000000..0bbd86a
--- /dev/null
+++ b/runtime/ftplugin/udevconf.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: udev(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/udevperm.vim b/runtime/ftplugin/udevperm.vim
new file mode 100644
index 0000000..f8fb4d4
--- /dev/null
+++ b/runtime/ftplugin/udevperm.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: udev(8) permissions file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/udevrules.vim b/runtime/ftplugin/udevrules.vim
new file mode 100644
index 0000000..6404f6c
--- /dev/null
+++ b/runtime/ftplugin/udevrules.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: udev(8) rules file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/updatedb.vim b/runtime/ftplugin/updatedb.vim
new file mode 100644
index 0000000..3015918
--- /dev/null
+++ b/runtime/ftplugin/updatedb.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: updatedb.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/vb.vim b/runtime/ftplugin/vb.vim
new file mode 100644
index 0000000..5a95481
--- /dev/null
+++ b/runtime/ftplugin/vb.vim
@@ -0,0 +1,71 @@
+" Vim filetype plugin file
+" Language: Visual Basic (ft=vb)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: 2021 Nov 17
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=sr:'\ -,mb:'\ \ ,el:'\ \ ,:'
+setlocal commentstring='\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setlocal com< cms< fo<"
+
+" we need this wrapper, as call doesn't allow a count
+function! s:VbSearch(pattern, flags)
+ let cnt = v:count1
+ while cnt > 0
+ call search(a:pattern, a:flags)
+ let cnt = cnt - 1
+ endwhile
+endfunction
+
+if !exists("no_plugin_maps") && !exists("no_vb_maps")
+ nnoremap <buffer> <silent> [[ <Cmd>call <SID>VbSearch('^\s*\%(\%(private\<Bar>public\)\s\+\)\=\%(function\<Bar>sub\)', 'sbW')<CR>
+ vnoremap <buffer> <silent> [[ <Cmd>call <SID>VbSearch('^\s*\%(\%(private\<Bar>public\)\s\+\)\=\%(function\<Bar>sub\)', 'sbW')<CR>
+ nnoremap <buffer> <silent> ]] <Cmd>call <SID>VbSearch('^\s*\%(\%(private\<Bar>public\)\s\+\)\=\%(function\<Bar>sub\)', 'sW')<CR>
+ vnoremap <buffer> <silent> ]] <Cmd>call <SID>VbSearch('^\s*\%(\%(private\<Bar>public\)\s\+\)\=\%(function\<Bar>sub\)', 'sW')<CR>
+ nnoremap <buffer> <silent> [] <Cmd>call <SID>VbSearch('^\s*end\s\+\%(function\<Bar>sub\)', 'sbW')<CR>
+ vnoremap <buffer> <silent> [] <Cmd>call <SID>VbSearch('^\s*end\s\+\%(function\<Bar>sub\)', 'sbW')<CR>
+ nnoremap <buffer> <silent> ][ <Cmd>call <SID>VbSearch('^\s*end\s\+\%(function\<Bar>sub\)', 'sW')<CR>
+ vnoremap <buffer> <silent> ][ <Cmd>call <SID>VbSearch('^\s*end\s\+\%(function\<Bar>sub\)', 'sW')<CR>
+ let b:undo_ftplugin .= " | sil! exe 'nunmap <buffer> [[' | sil! exe 'vunmap <buffer> [['" .
+ \ " | sil! exe 'nunmap <buffer> ]]' | sil! exe 'vunmap <buffer> ]]'" .
+ \ " | sil! exe 'nunmap <buffer> []' | sil! exe 'vunmap <buffer> []'" .
+ \ " | sil! exe 'nunmap <buffer> ][' | sil! exe 'vunmap <buffer> ]['"
+endif
+
+" TODO: line start anchors are almost certainly overly restrictive - allow
+" after statement separators. Even in QuickBasic only block IF statements
+" were required to be at the start of a line.
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_ignorecase = 1
+ let b:match_words =
+ \ '\%(^\s*\)\@<=\<if\>.*\<then\>\s*\%($\|''\):\%(^\s*\)\@<=\<else\>:\%(^\s*\)\@<=\<elseif\>:\%(^\s*\)\@<=\<end\>\s\+\<if\>,' .
+ \ '\%(^\s*\)\@<=\<for\>:\%(^\s*\)\@<=\<next\>,' .
+ \ '\%(^\s*\)\@<=\<while\>:\%(^\s*\)\@<=\<wend\>,' .
+ \ '\%(^\s*\)\@<=\<do\>:\%(^\s*\)\@<=\<loop\>\s\+\<while\>,' .
+ \ '\%(^\s*\)\@<=\<select\>\s\+\<case\>:\%(^\s*\)\@<=\<case\>:\%(^\s*\)\@<=\<end\>\s\+\<select\>,' .
+ \ '\%(^\s*\)\@<=\<enum\>:\%(^\s*\)\@<=\<end\>\s\<enum\>,' .
+ \ '\%(^\s*\)\@<=\<with\>:\%(^\s*\)\@<=\<end\>\s\<with\>,' .
+ \ '\%(^\s*\)\@<=\%(\<\%(private\|public\)\>\s\+\)\=\<function\>\s\+\([^ \t(]\+\):\%(^\s*\)\@<=\<\1\>\s*=:\%(^\s*\)\@<=\<end\>\s\+\<function\>,' .
+ \ '\%(^\s*\)\@<=\%(\<\%(private\|public\)\>\s\+\)\=\<sub\>\s\+:\%(^\s*\)\@<=\<end\>\s\+\<sub\>'
+ let b:undo_ftplugin .= " | unlet! b:match_words b:match_ignorecase"
+endif
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Visual Basic Source Files (*.bas)\t*.bas\n" .
+ \ "Visual Basic Form Files (*.frm)\t*.frm\n" .
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin .= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/vdf.vim b/runtime/ftplugin/vdf.vim
new file mode 100644
index 0000000..973d7c0
--- /dev/null
+++ b/runtime/ftplugin/vdf.vim
@@ -0,0 +1,14 @@
+" Vim filetype plugin
+" Language: Valve Data Format
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 15
+
+if exists('b:did_ftplugin')
+ finish
+endif
+let b:did_ftplugin = 1
+
+setl comments=:// commentstring=//\ %s
+setl foldmethod=syntax
+
+let b:undo_ftplugin = 'setl com< cms< fdm<'
diff --git a/runtime/ftplugin/verilog.vim b/runtime/ftplugin/verilog.vim
new file mode 100644
index 0000000..cbf30a3
--- /dev/null
+++ b/runtime/ftplugin/verilog.vim
@@ -0,0 +1,66 @@
+" Vim filetype plugin file
+" Language: Verilog HDL
+" 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")
+ finish
+endif
+
+" Don't load another plugin for this buffer
+let b:did_ftplugin = 1
+
+" Set 'cpoptions' to allow line continuations
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Undo the plugin effect
+let b:undo_ftplugin = "setlocal fo< com< tw<"
+ \ . "| unlet! b:browsefilter b:match_ignorecase b:match_words"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croqlm1
+
+" Set 'comments' to format dashed lists in comments.
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+" Format comments to be up to 78 characters long
+if &textwidth == 0
+ setlocal tw=78
+endif
+
+" Win32 can filter files in the browse dialog
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "Verilog Source Files (*.v)\t*.v\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+" Let the matchit plugin know what items can be matched.
+if exists("loaded_matchit")
+ let b:match_ignorecase=0
+ let b:match_words=
+ \ '\<begin\>:\<end\>,' .
+ \ '\<case\>\|\<casex\>\|\<casez\>:\<endcase\>,' .
+ \ '\<module\>:\<endmodule\>,' .
+ \ '\<if\>:`\@<!\<else\>,' .
+ \ '\<function\>:\<endfunction\>,' .
+ \ '`ifn\?def\>:`elsif\>:`else\>:`endif\>,' .
+ \ '\<task\>:\<endtask\>,' .
+ \ '\<specify\>:\<endspecify\>,' .
+ \ '\<config\>:\<endconfig\>,' .
+ \ '\<generate\>:\<endgenerate\>,' .
+ \ '\<fork\>:\<join\>,' .
+ \ '\<primitive\>:\<endprimitive\>,' .
+ \ '\<table\>:\<endtable\>'
+endif
+
+" Reset 'cpoptions' back to the user's setting
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/vhdl.vim b/runtime/ftplugin/vhdl.vim
new file mode 100644
index 0000000..0249b54
--- /dev/null
+++ b/runtime/ftplugin/vhdl.vim
@@ -0,0 +1,88 @@
+" VHDL filetype plugin
+" Language: VHDL
+" Maintainer: R.Shankar <shankar.pec?gmail.com>
+" Modified By: Gerald Lai <laigera+vim?gmail.com>
+" Last Change: 2011 Dec 11
+
+" 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 s:cpo_save = &cpo
+set cpo&vim
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+"setlocal fo-=t fo+=croqlm1
+
+" Set 'comments' to format dashed lists in comments.
+"setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+" Format comments to be up to 78 characters long
+"setlocal tw=75
+
+" Win32 can filter files in the browse dialog
+"if has("gui_win32") && !exists("b:browsefilter")
+" let b:browsefilter = "Verilog Source Files (*.v)\t*.v\n" .
+" \ "All Files (*.*)\t*.*\n"
+"endif
+
+" Let the matchit plugin know what items can be matched.
+if ! exists("b:match_words") && exists("loaded_matchit")
+ let b:match_ignorecase=1
+ let s:notend = '\%(\<end\s\+\)\@<!'
+ let b:match_words =
+ \ s:notend.'\<if\>:\<elsif\>:\<else\>:\<end\s\+if\>,'.
+ \ s:notend.'\<case\>:\<when\>:\<end\s\+case\>,'.
+ \ s:notend.'\<loop\>:\<end\s\+loop\>,'.
+ \ s:notend.'\<for\>:\<end\s\+for\>,'.
+ \ s:notend.'\<generate\>:\<end\s\+generate\>,'.
+ \ s:notend.'\<record\>:\<end\s\+record\>,'.
+ \ s:notend.'\<units\>:\<end\s\+units\>,'.
+ \ s:notend.'\<process\>:\<end\s\+process\>,'.
+ \ s:notend.'\<block\>:\<end\s\+block\>,'.
+ \ s:notend.'\<function\>:\<end\s\+function\>,'.
+ \ s:notend.'\<entity\>:\<end\s\+entity\>,'.
+ \ s:notend.'\<component\>:\<end\s\+component\>,'.
+ \ s:notend.'\<architecture\>:\<end\s\+architecture\>,'.
+ \ s:notend.'\<package\>:\<end\s\+package\>,'.
+ \ s:notend.'\<procedure\>:\<end\s\+procedure\>,'.
+ \ s:notend.'\<configuration\>:\<end\s\+configuration\>'
+endif
+
+" count repeat
+function! <SID>CountWrapper(cmd)
+ let i = v:count1
+ if a:cmd[0] == ":"
+ while i > 0
+ execute a:cmd
+ let i = i - 1
+ endwhile
+ else
+ execute "normal! gv\<Esc>"
+ execute "normal ".i.a:cmd
+ let curcol = col(".")
+ let curline = line(".")
+ normal! gv
+ call cursor(curline, curcol)
+ endif
+endfunction
+
+" explore motion
+" keywords: "architecture", "block", "configuration", "component", "entity", "function", "package", "procedure", "process", "record", "units"
+let b:vhdl_explore = '\%(architecture\|block\|configuration\|component\|entity\|function\|package\|procedure\|process\|record\|units\)'
+noremap <buffer><silent>[[ :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\%(\\<end\\s\\+\\)\\@<!\\<".b:vhdl_explore."\\>\\c\\<Bar>\\%^","bW")')<CR>
+noremap <buffer><silent>]] :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\%(\\<end\\s\\+\\)\\@<!\\<".b:vhdl_explore."\\>\\c\\<Bar>\\%$","W")')<CR>
+noremap <buffer><silent>[] :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\<end\\s\\+".b:vhdl_explore."\\>\\c\\<Bar>\\%^","bW")')<CR>
+noremap <buffer><silent>][ :<C-u>cal <SID>CountWrapper(':cal search("\\%(--.*\\)\\@<!\\<end\\s\\+".b:vhdl_explore."\\>\\c\\<Bar>\\%$","W")')<CR>
+vnoremap <buffer><silent>[[ :<C-u>cal <SID>CountWrapper('[[')<CR>
+vnoremap <buffer><silent>]] :<C-u>cal <SID>CountWrapper(']]')<CR>
+vnoremap <buffer><silent>[] :<C-u>cal <SID>CountWrapper('[]')<CR>
+vnoremap <buffer><silent>][ :<C-u>cal <SID>CountWrapper('][')<CR>
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/vim.vim b/runtime/ftplugin/vim.vim
new file mode 100644
index 0000000..1ae1d23
--- /dev/null
+++ b/runtime/ftplugin/vim.vim
@@ -0,0 +1,125 @@
+" Vim filetype plugin
+" Language: Vim
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2023 Feb 07
+
+" 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 s:cpo_save = &cpo
+set cpo&vim
+
+if !exists('*VimFtpluginUndo')
+ func VimFtpluginUndo()
+ setl fo< isk< com< tw< commentstring< include< define<
+ 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".
+setlocal fo-=t fo+=croql
+
+" To allow tag lookup via CTRL-] for autoload functions, '#' must be a
+" keyword character. E.g., for netrw#Nread().
+setlocal isk+=#
+
+" Use :help to lookup the keyword under the cursor with K.
+setlocal keywordprg=:help
+
+" Comments starts with # in Vim9 script. We have to guess which one to use.
+if "\n" .. getline(1, 10)->join("\n") =~# '\n\s*vim9\%[script]\>'
+ setlocal commentstring=#%s
+else
+ setlocal commentstring=\"%s
+endif
+
+" Set 'comments' to format dashed lists in comments, both in Vim9 and legacy
+" script.
+setlocal com=sO:#\ -,mO:#\ \ ,eO:##,:#,sO:\"\ -,mO:\"\ \ ,eO:\"\",:\"
+
+" set 'include' to recognize import commands
+setlocal include=\\v^\\s*import\\s*(autoload)?
+
+" set 'define' to recognize export commands
+setlocal define=\\v^\\s*export\\s*(def\|const\|var\|final)
+
+" Format comments to be up to 78 characters long
+if &tw == 0
+ setlocal tw=78
+endif
+
+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]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
+ vnoremap <silent><buffer> [[ m':<C-U>exe "normal! gv"<Bar>call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
+ nnoremap <silent><buffer> ]] m':call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
+ vnoremap <silent><buffer> ]] m':<C-U>exe "normal! gv"<Bar>call search('^\s*\(fu\%[nction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
+ nnoremap <silent><buffer> [] m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
+ vnoremap <silent><buffer> [] m':<C-U>exe "normal! gv"<Bar>call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "bW")<CR>
+ nnoremap <silent><buffer> ][ m':call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "W")<CR>
+ vnoremap <silent><buffer> ][ m':<C-U>exe "normal! gv"<Bar>call search('^\s*end\(f\%[unction]\\|\(export\s\+\)\?def\)\>', "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")
+ let b:match_ignorecase = 0
+ " "func" can also be used as a type:
+ " var Ref: func
+ " or to list functions:
+ " func name
+ " require a parenthesis following, then there can be an "endfunc".
+ let b:match_words =
+ \ '\<\%(fu\%[nction]\|def\)!\=\s\+\S\+\s*(:\%(\%(^\||\)\s*\)\@<=\<retu\%[rn]\>:\%(\%(^\||\)\s*\)\@<=\<\%(endf\%[unction]\|enddef\)\>,' ..
+ \ '\<\%(wh\%[ile]\|for\)\>:\%(\%(^\||\)\s*\)\@<=\<brea\%[k]\>:\%(\%(^\||\)\s*\)\@<=\<con\%[tinue]\>:\%(\%(^\||\)\s*\)\@<=\<end\%(w\%[hile]\|fo\%[r]\)\>,' ..
+ \ '\<if\>:\%(\%(^\||\)\s*\)\@<=\<el\%[seif]\>:\%(\%(^\||\)\s*\)\@<=\<en\%[dif]\>,' ..
+ \ '{:},' ..
+ \ '\<try\>:\%(\%(^\||\)\s*\)\@<=\<cat\%[ch]\>:\%(\%(^\||\)\s*\)\@<=\<fina\%[lly]\>:\%(\%(^\||\)\s*\)\@<=\<endt\%[ry]\>,' ..
+ \ '\<aug\%[roup]\s\+\%(END\>\)\@!\S:\<aug\%[roup]\s\+END\>,' ..
+ \ '\<class\>:\<endclass\>,' ..
+ \ '\<inte\%[rface]\>:\<endinterface\>,' ..
+ \ '\<enu\%[m]\>:\<endenum\>,'
+
+ " Ignore syntax region commands and settings, any 'en*' would clobber
+ " if-endif.
+ " - set spl=de,en
+ " - au! FileType javascript syntax region foldBraces start=/{/ end=/}/ …
+ " Also ignore here-doc and dictionary keys (vimVar).
+ let b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name")
+ \ =~? "comment\\|string\\|vimSynReg\\|vimSet\\|vimLetHereDoc\\|vimVar"'
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" removed this, because 'cpoptions' is a global option.
+" setlocal cpo+=M " makes \%( match \)
diff --git a/runtime/ftplugin/vroom.vim b/runtime/ftplugin/vroom.vim
new file mode 100644
index 0000000..3d9e783
--- /dev/null
+++ b/runtime/ftplugin/vroom.vim
@@ -0,0 +1,35 @@
+" Vim filetype plugin file
+" Language: Vroom (vim testing and executable documentation)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-vroom)
+" Last Change: 2014 Jul 23
+
+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 formatoptions< shiftwidth< softtabstop<' .
+ \ ' expandtab< iskeyword< comments< commentstring<'
+
+setlocal formatoptions-=t
+
+" The vroom interpreter doesn't accept anything but 2-space indent.
+setlocal shiftwidth=2
+setlocal softtabstop=2
+setlocal expandtab
+
+" To allow tag lookup and autocomplete for whole autoload functions, '#' must be
+" a keyword character. This also conforms to the behavior of ftplugin/vim.vim.
+setlocal iskeyword+=#
+
+" Vroom files have no comments (text is inert documentation unless indented).
+setlocal comments=
+setlocal commentstring=
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/vue.vim b/runtime/ftplugin/vue.vim
new file mode 100644
index 0000000..e883374
--- /dev/null
+++ b/runtime/ftplugin/vue.vim
@@ -0,0 +1,24 @@
+" Vim filetype plugin file
+" Language: vue
+
+if exists("b:did_ftplugin") | finish | endif
+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
+
+" Copied from ftplugin/html.vim
+" Original thanks to Johannes Zellner and Benji Fisher.
+if exists("loaded_matchit")
+ let b:match_ignorecase = 1
+ let b:match_words = '<:>,'
+ \ .. '<\@<=[ou]l\>[^>]*\%(>\|$\):<\@<=li\>:<\@<=/[ou]l>,'
+ \ .. '<\@<=dl\>[^>]*\%(>\|$\):<\@<=d[td]\>:<\@<=/dl>,'
+ \ .. '<\@<=\([^/][^ \t>]*\)[^>]*\%(>\|$\):<\@<=/\1>'
+endif
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/wast.vim b/runtime/ftplugin/wast.vim
new file mode 100644
index 0000000..0d9e98d
--- /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/wget.vim b/runtime/ftplugin/wget.vim
new file mode 100644
index 0000000..7a10221
--- /dev/null
+++ b/runtime/ftplugin/wget.vim
@@ -0,0 +1,29 @@
+" Vim filetype plugin file
+" Language: Wget configuration file (/etc/wgetrc ~/.wgetrc)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Apr 28
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:#,://
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Wget Configuration File (wgetrc, .wgetrc)\twgetrc;.wgetrc\n" .
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8
diff --git a/runtime/ftplugin/wget2.vim b/runtime/ftplugin/wget2.vim
new file mode 100644
index 0000000..a6845f6
--- /dev/null
+++ b/runtime/ftplugin/wget2.vim
@@ -0,0 +1,29 @@
+" Vim filetype plugin file
+" Language: Wget2 configuration file (/etc/wget2rc ~/.wget2rc)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Apr 28
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:#,://
+setlocal commentstring=#\ %s
+setlocal formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl fo< com< cms<"
+
+if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter = "Wget2 Configuration File (wget2rc, .wget2rc)\twget2rc;.wget2rc\n" .
+ \ "All Files (*.*)\t*.*\n"
+ let b:undo_ftplugin ..= " | unlet! b:browsefilter"
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8
diff --git a/runtime/ftplugin/xdefaults.vim b/runtime/ftplugin/xdefaults.vim
new file mode 100644
index 0000000..c1aff70
--- /dev/null
+++ b/runtime/ftplugin/xdefaults.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" 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
+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=s1:/*,mb:*,ex:*/,:! commentstring& inc&
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/xf86conf.vim b/runtime/ftplugin/xf86conf.vim
new file mode 100644
index 0000000..5a21539
--- /dev/null
+++ b/runtime/ftplugin/xf86conf.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: XFree86 Configuration File
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/xhtml.vim b/runtime/ftplugin/xhtml.vim
new file mode 100644
index 0000000..d2a1c0b
--- /dev/null
+++ b/runtime/ftplugin/xhtml.vim
@@ -0,0 +1,69 @@
+" Vim filetype plugin file
+" Language: xhtml
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "HTML Files (*.html, *.htm)\t*.html;*.htm\n" .
+ \ "XML Files (*.xml)\t*.xml\n" .
+ \ "All Files (*.*)\t*.*\n"
+let s:match_words = ""
+
+runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+unlet b:did_ftplugin
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+ unlet b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+ unlet b:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words
+ unlet b:match_words
+endif
+
+runtime! ftplugin/html.vim ftplugin/html_*.vim ftplugin/html/*.vim
+let b:did_ftplugin = 1
+
+" Combine the new set of values with those previously included.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin . " | " . s:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter . s:browsefilter
+endif
+if exists("b:match_words")
+ let s:match_words = b:match_words . "," . s:match_words
+endif
+
+" Load the combined list of match_words for matchit.vim
+if exists("loaded_matchit")
+ let b:match_words = s:match_words
+endif
+
+" Change the :browse e filter to primarily show tcsh-related files.
+if has("gui_win32")
+ let b:browsefilter="XHTML files (*.xhtml, *.xhtm)\t*.xhtml;*.xhtm\n" . s:browsefilter
+endif
+
+" Undo the stuff we changed.
+let b:undo_ftplugin = "unlet! b:browsefilter b:match_words | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/xinetd.vim b/runtime/ftplugin/xinetd.vim
new file mode 100644
index 0000000..2b7b64e
--- /dev/null
+++ b/runtime/ftplugin/xinetd.vim
@@ -0,0 +1,20 @@
+" Vim filetype plugin file
+" Language: xinetd.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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 include=^\\s*include
+setlocal formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/xml.vim b/runtime/ftplugin/xml.vim
new file mode 100644
index 0000000..9aa188c
--- /dev/null
+++ b/runtime/ftplugin/xml.vim
@@ -0,0 +1,65 @@
+" Vim filetype plugin file
+" Language: xml
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Last Changed: Dec 07th, 2018
+" Repository: https://github.com/chrisbra/vim-xml-ftplugin
+" Previous Maintainer: Dan Sharp
+" URL: http://dwsharp.users.sourceforge.net/vim/ftplugin
+
+if exists("b:did_ftplugin") | finish | endif
+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&vim
+
+setlocal commentstring=<!--%s-->
+" 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
+setlocal formatoptions+=croql
+setlocal formatexpr=xmlformat#Format()
+
+" XML: thanks to Johannes Zellner and Akbar Ibrahim
+" - case sensitive
+" - don't match empty tags <fred/>
+" - match <!--, --> style comments (but not --, --)
+" - match <!, > inlined dtd's. This is not perfect, as it
+" gets confused for example by
+" <!ENTITY gt ">">
+if exists("loaded_matchit")
+ let b:match_ignorecase=0
+ let b:match_words =
+ \ '<:>,' .
+ \ '<\@<=!\[CDATA\[:]]>,'.
+ \ '<\@<=!--:-->,'.
+ \ '<\@<=?\k\+:?>,'.
+ \ '<\@<=\([^ \t>/]\+\)\%(\s\+[^>]*\%([^/]>\|$\)\|>\|$\):<\@<=/\1>,'.
+ \ '<\@<=\%([^ \t>/]\+\)\%(\s\+[^/>]*\|$\):/>'
+endif
+
+" For Omni completion, by Mikolaj Machowski.
+if exists('&ofu')
+ setlocal ofu=xmlcomplete#CompleteTags
+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") || has("gui_gtk")) && !exists("b:browsefilter")
+ let b:browsefilter="XML Files (*.xml)\t*.xml\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< formatexpr< " .
+ \ " | unlet! b:match_ignorecase b:match_words b:browsefilter"
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/xmodmap.vim b/runtime/ftplugin/xmodmap.vim
new file mode 100644
index 0000000..77fccd5
--- /dev/null
+++ b/runtime/ftplugin/xmodmap.vim
@@ -0,0 +1,19 @@
+" Vim filetype plugin file
+" Language: xmodmap(1) definition file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-09
+
+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< fo<"
+
+setlocal comments=:! commentstring=!\ %s formatoptions-=t formatoptions+=croql
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/xs.vim b/runtime/ftplugin/xs.vim
new file mode 100644
index 0000000..206fbc2
--- /dev/null
+++ b/runtime/ftplugin/xs.vim
@@ -0,0 +1,15 @@
+" Vim filetype plugin file
+" Language: XS (Perl extension interface language)
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2018 Mar 28
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+" Just use the C plugin for now.
+runtime! ftplugin/c.vim ftplugin/c_*.vim ftplugin/c/*.vim
diff --git a/runtime/ftplugin/xsd.vim b/runtime/ftplugin/xsd.vim
new file mode 100644
index 0000000..7d3efbb
--- /dev/null
+++ b/runtime/ftplugin/xsd.vim
@@ -0,0 +1,41 @@
+" Vim filetype plugin file
+" Language: xsd
+"
+" This runtime file is looking for a new maintainer.
+"
+" Former maintainer: Dan Sharp
+" Last Changed: 20 Jan 2009
+
+if exists("b:did_ftplugin") | finish | endif
+
+" Make sure the continuation lines below do not cause problems in
+" compatibility mode.
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Define some defaults in case the included ftplugins don't set them.
+let s:undo_ftplugin = ""
+let s:browsefilter = "XML Files (*.xml)\t*.xml\n" .
+ \ "All Files (*.*)\t*.*\n"
+
+runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+let b:did_ftplugin = 1
+
+" Override our defaults if these were set by an included ftplugin.
+if exists("b:undo_ftplugin")
+ let s:undo_ftplugin = b:undo_ftplugin
+endif
+if exists("b:browsefilter")
+ let s:browsefilter = b:browsefilter
+endif
+
+" Change the :browse e filter to primarily show xsd-related files.
+if has("gui_win32")
+ let b:browsefilter="XSD Files (*.xsd)\t*.xsd\n" . s:browsefilter
+endif
+
+let b:undo_ftplugin = "unlet! b:browsefilter | " . s:undo_ftplugin
+
+" Restore the saved compatibility options.
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/ftplugin/xslt.vim b/runtime/ftplugin/xslt.vim
new file mode 100644
index 0000000..47e78eb
--- /dev/null
+++ b/runtime/ftplugin/xslt.vim
@@ -0,0 +1,18 @@
+" Vim filetype plugin file
+" Language: XSLT
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Dan Sharp
+" Last Change: 2022 Apr 25
+
+if exists("b:did_ftplugin")
+ finish
+endif
+
+runtime! ftplugin/xml.vim ftplugin/xml_*.vim ftplugin/xml/*.vim
+
+let b:did_ftplugin = 1
+
+" Change the :browse e filter to primarily show xsd-related files.
+if (has("gui_win32") || has("gui_gtk")) && exists("b:browsefilter")
+ let b:browsefilter = "XSLT Files (*.xsl,*.xslt)\t*.xsl;*.xslt\n" . b:browsefilter
+endif
diff --git a/runtime/ftplugin/yaml.vim b/runtime/ftplugin/yaml.vim
new file mode 100644
index 0000000..db7cbd7
--- /dev/null
+++ b/runtime/ftplugin/yaml.vim
@@ -0,0 +1,25 @@
+" Vim filetype plugin file
+" Language: YAML (YAML Ain't Markup Language)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se> (inactive)
+" Last Change: 2020 Mar 02
+
+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< et< fo<"
+
+setlocal comments=:# commentstring=#\ %s expandtab
+setlocal formatoptions-=t formatoptions+=croql
+
+if !exists("g:yaml_recommended_style") || g:yaml_recommended_style != 0
+ let b:undo_ftplugin ..= " sw< sts<"
+ setlocal shiftwidth=2 softtabstop=2
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/zig.vim b/runtime/ftplugin/zig.vim
new file mode 100644
index 0000000..e740a52
--- /dev/null
+++ b/runtime/ftplugin/zig.vim
@@ -0,0 +1,66 @@
+" Vim filetype plugin file
+" Language: Zig
+" Upstream: https://github.com/ziglang/zig.vim
+
+" Only do this when not done yet for this buffer
+if exists("b:did_ftplugin")
+ finish
+endif
+
+let b:did_ftplugin = 1
+
+let s:cpo_orig = &cpo
+set cpo&vim
+
+compiler zig_build
+
+" Match Zig builtin fns
+setlocal iskeyword+=@-@
+
+" Recomended code style, no tabs and 4-space indentation
+setlocal expandtab
+setlocal tabstop=8
+setlocal softtabstop=4
+setlocal shiftwidth=4
+
+setlocal formatoptions-=t formatoptions+=croql
+
+setlocal suffixesadd=.zig,.zir
+
+if has('comments')
+ setlocal comments=:///,://!,://,:\\\\
+ setlocal commentstring=//\ %s
+endif
+
+if has('find_in_path')
+ let &l:includeexpr='substitute(v:fname, "^([^.])$", "\1.zig", "")'
+ let &l:include='\v(\@import>|\@cInclude>|^\s*\#\s*include)'
+endif
+
+let &l:define='\v(<fn>|<const>|<var>|^\s*\#\s*define)'
+
+if !exists('g:zig_std_dir') && exists('*json_decode') && executable('zig')
+ silent let s:env = system('zig env')
+ if v:shell_error == 0
+ let g:zig_std_dir = json_decode(s:env)['std_dir']
+ endif
+ unlet! s:env
+endif
+
+if exists('g:zig_std_dir')
+ let &l:path = &l:path . ',' . g:zig_std_dir
+endif
+
+let b:undo_ftplugin =
+ \ 'setl isk< et< ts< sts< sw< fo< sua< mp< com< cms< inex< inc< pa<'
+
+augroup vim-zig
+ autocmd! * <buffer>
+ autocmd BufWritePre <buffer> if get(g:, 'zig_fmt_autosave', 1) | call zig#fmt#Format() | endif
+augroup END
+
+let b:undo_ftplugin .= '|au! vim-zig * <buffer>'
+
+let &cpo = s:cpo_orig
+unlet s:cpo_orig
+" vim: tabstop=8 shiftwidth=4 softtabstop=4 expandtab
diff --git a/runtime/ftplugin/zimbu.vim b/runtime/ftplugin/zimbu.vim
new file mode 100644
index 0000000..9d9fa6f
--- /dev/null
+++ b/runtime/ftplugin/zimbu.vim
@@ -0,0 +1,206 @@
+" Vim filetype plugin file
+" Language: Zimbu
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Sep 07
+
+" 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
+
+" Using line continuation here.
+let s:cpo_save = &cpo
+set cpo-=C
+
+let b:undo_ftplugin = "setl fo< com< ofu< efm< tw< et< sts< sw< | if has('vms') | setl isk< | endif"
+
+" Set 'formatoptions' to break comment lines but not other lines,
+" and insert the comment leader when hitting <CR> or using "o".
+setlocal fo-=t fo+=croql
+
+" Set completion with CTRL-X CTRL-O to autoloaded function.
+if exists('&ofu')
+ setlocal ofu=ccomplete#Complete
+endif
+
+" Set 'comments' to format dashed lists in comments.
+" And to keep Zudocu comment characters.
+setlocal comments=sO:#\ -,mO:#\ \ ,exO:#/,s:/*,m:\ ,ex:*/,:#=,:#-,:#%,:#
+
+setlocal errorformat^=%f\ line\ %l\ col\ %c:\ %m,ERROR:\ %m
+
+" When the matchit plugin is loaded, this makes the % command skip parens and
+" braces in comments.
+if exists("loaded_matchit") && !exists("b:match_words")
+ let b:match_words = '\(^\s*\)\@<=\(MODULE\|CLASS\|INTERFACE\|BITS\|ENUM\|SHARED\|FUNC\|REPLACE\|DEFINE\|PROC\|EQUAL\|MAIN\|IF\|GENERATE_IF\|WHILE\|REPEAT\|WITH\|DO\|FOR\|SWITCH\|TRY\)\>\|{\s*$:\(^\s*\)\@<=\(ELSE\|ELSEIF\|GENERATE_ELSE\|GENERATE_ELSEIF\|CATCH\|FINALLY\)\>:\(^\s*\)\@<=\(}\|\<UNTIL\>\)'
+ let b:match_skip = 's:comment\|string\|zimbuchar'
+ let b:undo_ftplugin ..= " | unlet! b:match_words b:match_skip"
+endif
+
+setlocal tw=78
+setlocal et sts=2 sw=2
+
+" Does replace when a dot, space or closing brace is typed.
+func! GCUpperDot(what)
+ if v:char != ' ' && v:char != "\r" && v:char != "\x1b" && v:char != '.' && v:char != ')' && v:char != '}' && v:char != ','
+ " no space or dot after the typed text
+ let g:got_char = v:char
+ return a:what
+ endif
+ return GCUpperCommon(a:what)
+endfunc
+
+" Does not replace when a dot is typed.
+func! GCUpper(what)
+ if v:char != ' ' && v:char != "\r" && v:char != "\x1b" && v:char != ')' && v:char != ','
+ " no space or other "terminating" character after the typed text
+ let g:got_char = v:char
+ return a:what
+ endif
+ return GCUpperCommon(a:what)
+endfunc
+
+" Only replaces when a space is typed.
+func! GCUpperSpace(what)
+ if v:char != ' '
+ " no space after the typed text
+ let g:got_char = v:char
+ return a:what
+ endif
+ return GCUpperCommon(a:what)
+endfunc
+
+func! GCUpperCommon(what)
+ let col = col(".") - strlen(a:what)
+ if col > 1 && getline('.')[col - 2] != ' '
+ " no space before the typed text
+ let g:got_char = 999
+ return a:what
+ endif
+ let synName = synIDattr(synID(line("."), col(".") - 2, 1), "name")
+ if synName =~ 'Comment\|String\|zimbuCregion\|\<c'
+ " inside a comment or C code
+ let g:got_char = 777
+ return a:what
+ endif
+ let g:got_char = 1111
+ return toupper(a:what)
+endfunc
+
+iabbr <buffer> <expr> alias GCUpperSpace("alias")
+iabbr <buffer> <expr> arg GCUpperDot("arg")
+iabbr <buffer> <expr> break GCUpper("break")
+iabbr <buffer> <expr> case GCUpperSpace("case")
+iabbr <buffer> <expr> catch GCUpperSpace("catch")
+iabbr <buffer> <expr> check GCUpperDot("check")
+iabbr <buffer> <expr> class GCUpperSpace("class")
+iabbr <buffer> <expr> interface GCUpperSpace("interface")
+iabbr <buffer> <expr> implements GCUpperSpace("implements")
+iabbr <buffer> <expr> shared GCUpperSpace("shared")
+iabbr <buffer> <expr> continue GCUpper("continue")
+iabbr <buffer> <expr> default GCUpper("default")
+iabbr <buffer> <expr> extends GCUpper("extends")
+iabbr <buffer> <expr> do GCUpper("do")
+iabbr <buffer> <expr> else GCUpper("else")
+iabbr <buffer> <expr> elseif GCUpperSpace("elseif")
+iabbr <buffer> <expr> enum GCUpperSpace("enum")
+iabbr <buffer> <expr> exit GCUpper("exit")
+iabbr <buffer> <expr> false GCUpper("false")
+iabbr <buffer> <expr> fail GCUpper("fail")
+iabbr <buffer> <expr> finally GCUpper("finally")
+iabbr <buffer> <expr> for GCUpperSpace("for")
+iabbr <buffer> <expr> func GCUpperSpace("func")
+iabbr <buffer> <expr> if GCUpperSpace("if")
+iabbr <buffer> <expr> import GCUpperSpace("import")
+iabbr <buffer> <expr> in GCUpperSpace("in")
+iabbr <buffer> <expr> io GCUpperDot("io")
+iabbr <buffer> <expr> main GCUpper("main")
+iabbr <buffer> <expr> module GCUpperSpace("module")
+iabbr <buffer> <expr> new GCUpper("new")
+iabbr <buffer> <expr> nil GCUpper("nil")
+iabbr <buffer> <expr> ok GCUpper("ok")
+iabbr <buffer> <expr> proc GCUpperSpace("proc")
+iabbr <buffer> <expr> proceed GCUpper("proceed")
+iabbr <buffer> <expr> return GCUpper("return")
+iabbr <buffer> <expr> step GCUpperSpace("step")
+iabbr <buffer> <expr> switch GCUpperSpace("switch")
+iabbr <buffer> <expr> sys GCUpperDot("sys")
+iabbr <buffer> <expr> this GCUpperDot("this")
+iabbr <buffer> <expr> throw GCUpperSpace("throw")
+iabbr <buffer> <expr> try GCUpper("try")
+iabbr <buffer> <expr> to GCUpperSpace("to")
+iabbr <buffer> <expr> true GCUpper("true")
+iabbr <buffer> <expr> until GCUpperSpace("until")
+iabbr <buffer> <expr> while GCUpperSpace("while")
+iabbr <buffer> <expr> repeat GCUpper("repeat")
+
+let b:undo_ftplugin ..=
+ \ " | iunabbr <buffer> alias" ..
+ \ " | iunabbr <buffer> arg" ..
+ \ " | iunabbr <buffer> break" ..
+ \ " | iunabbr <buffer> case" ..
+ \ " | iunabbr <buffer> catch" ..
+ \ " | iunabbr <buffer> check" ..
+ \ " | iunabbr <buffer> class" ..
+ \ " | iunabbr <buffer> interface" ..
+ \ " | iunabbr <buffer> implements" ..
+ \ " | iunabbr <buffer> shared" ..
+ \ " | iunabbr <buffer> continue" ..
+ \ " | iunabbr <buffer> default" ..
+ \ " | iunabbr <buffer> extends" ..
+ \ " | iunabbr <buffer> do" ..
+ \ " | iunabbr <buffer> else" ..
+ \ " | iunabbr <buffer> elseif" ..
+ \ " | iunabbr <buffer> enum" ..
+ \ " | iunabbr <buffer> exit" ..
+ \ " | iunabbr <buffer> false" ..
+ \ " | iunabbr <buffer> fail" ..
+ \ " | iunabbr <buffer> finally" ..
+ \ " | iunabbr <buffer> for" ..
+ \ " | iunabbr <buffer> func" ..
+ \ " | iunabbr <buffer> if" ..
+ \ " | iunabbr <buffer> import" ..
+ \ " | iunabbr <buffer> in" ..
+ \ " | iunabbr <buffer> io" ..
+ \ " | iunabbr <buffer> main" ..
+ \ " | iunabbr <buffer> module" ..
+ \ " | iunabbr <buffer> new" ..
+ \ " | iunabbr <buffer> nil" ..
+ \ " | iunabbr <buffer> ok" ..
+ \ " | iunabbr <buffer> proc" ..
+ \ " | iunabbr <buffer> proceed" ..
+ \ " | iunabbr <buffer> return" ..
+ \ " | iunabbr <buffer> step" ..
+ \ " | iunabbr <buffer> switch" ..
+ \ " | iunabbr <buffer> sys" ..
+ \ " | iunabbr <buffer> this" ..
+ \ " | iunabbr <buffer> throw" ..
+ \ " | iunabbr <buffer> try" ..
+ \ " | iunabbr <buffer> to" ..
+ \ " | iunabbr <buffer> true" ..
+ \ " | iunabbr <buffer> until" ..
+ \ " | iunabbr <buffer> while" ..
+ \ " | iunabbr <buffer> repeat"
+
+if !exists("no_plugin_maps") && !exists("no_zimbu_maps")
+ nnoremap <silent> <buffer> [[ m`:call ZimbuGoStartBlock()<CR>
+ nnoremap <silent> <buffer> ]] m`:call ZimbuGoEndBlock()<CR>
+ let b:undo_ftplugin ..=
+ \ " | silent! exe 'nunmap <buffer> [['" ..
+ \ " | silent! exe 'nunmap <buffer> ]]'"
+endif
+
+" Using a function makes sure the search pattern is restored
+func! ZimbuGoStartBlock()
+ ?^\s*\(FUNC\|PROC\|MAIN\|ENUM\|CLASS\|INTERFACE\)\>
+endfunc
+func! ZimbuGoEndBlock()
+ /^\s*\(FUNC\|PROC\|MAIN\|ENUM\|CLASS\|INTERFACE\)\>
+endfunc
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugin/zsh.vim b/runtime/ftplugin/zsh.vim
new file mode 100644
index 0000000..0ca8077
--- /dev/null
+++ b/runtime/ftplugin/zsh.vim
@@ -0,0 +1,42 @@
+" Vim filetype plugin file
+" Language: Zsh shell script
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2021-04-03
+" License: Vim (see :h license)
+" Repository: https://github.com/chrisbra/vim-zsh
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+let b:undo_ftplugin = "setl com< cms< fo< "
+
+if executable('zsh') && &shell !~# '/\%(nologin\|false\)$'
+ if !has('gui_running') && executable('less')
+ command! -buffer -nargs=1 RunHelp silent exe '!MANPAGER= zsh -c "autoload -Uz run-help; run-help <args> 2>/dev/null | LESS= less"' | redraw!
+ elseif has('terminal')
+ command! -buffer -nargs=1 RunHelp silent exe ':term zsh -c "autoload -Uz run-help; run-help <args>"'
+ else
+ command! -buffer -nargs=1 RunHelp echo system('zsh -c "autoload -Uz run-help; run-help <args> 2>/dev/null"')
+ endif
+ if !exists('current_compiler')
+ compiler zsh
+ endif
+ setlocal keywordprg=:RunHelp
+ let b:undo_ftplugin .= 'keywordprg<'
+endif
+
+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'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/ftplugof.vim b/runtime/ftplugof.vim
new file mode 100644
index 0000000..e0505ce
--- /dev/null
+++ b/runtime/ftplugof.vim
@@ -0,0 +1,15 @@
+vim9script
+
+# Vim support file to switch off loading plugins for file types
+#
+# Maintainer: Bram Moolenaar <Bram@vim.org>
+# Last Change: 2022 Feb 09
+
+if exists("g:did_load_ftplugin")
+ unlet g:did_load_ftplugin
+endif
+
+# Remove all autocommands in the filetypeplugin group, if any exist.
+if exists("#filetypeplugin")
+ silent! au! filetypeplugin *
+endif
diff --git a/runtime/gvim.desktop b/runtime/gvim.desktop
new file mode 100644
index 0000000..a970578
--- /dev/null
+++ b/runtime/gvim.desktop
@@ -0,0 +1,135 @@
+# The gvim.desktop file is generated by src/po/Makefile, do NOT edit.
+# Edit the src/po/gvim.desktop.in file instead.
+[Desktop Entry]
+# Translators: This is the Application Name used in the GVim desktop file
+Name[ca]=GVim
+Name[de]=GVim
+Name[eo]=GVim
+Name[es]=GVim
+Name[fi]=GVim
+Name[fr]=GVim
+Name[ga]=GVim
+Name[it]=GVim
+Name[ru]=GVim
+Name[sr]=GVim
+Name[tr]=GVim
+Name[uk]=GVim
+Name[zh_CN]=GVim
+Name=GVim
+# Translators: This is the Generic Application Name used in the Vim desktop file
+GenericName[ca]=Editor de text
+GenericName[de]=Texteditor
+GenericName[eo]=Tekstoredaktilo
+GenericName[es]=Editor de texto
+GenericName[fi]=Tekstinmuokkain
+GenericName[fr]=Éditeur de texte
+GenericName[ga]=Eagarthóir Téacs
+GenericName[it]=Editor di testi
+GenericName[ja]=テキストエディタ
+GenericName[ru]=Текстовый редактор
+GenericName[sr]=Едитор текст
+GenericName[tr]=Metin Düzenleyici
+GenericName[uk]=Редактор Тексту
+GenericName[zh_CN]=文本编辑器
+GenericName=Text Editor
+# Translators: This is the comment used in the Vim desktop file
+Comment[ca]=Edita fitxers de text
+Comment[de]=Textdateien bearbeiten
+Comment[eo]=Redakti tekstajn dosierojn
+Comment[es]=Editar archivos de texto
+Comment[fi]=Muokkaa tekstitiedostoja
+Comment[fr]=Éditer des fichiers texte
+Comment[ga]=Cuir comhaid téacs in eagar
+Comment[it]=Edita file di testo
+Comment[ja]=テキストファイルを編集します
+Comment[ru]=Редактирование текстовых файлов
+Comment[sr]=Уређујте текст фајлове
+Comment[tr]=Metin dosyaları düzenleyin
+Comment[uk]=Редагувати текстові файли
+Comment[zh_CN]=编辑文本文件
+Comment=Edit text files
+# The translations should come from the po file. Leave them here for now, they will
+# be overwritten by the po file when generating the desktop.file!
+GenericName[da]=Teksteditor
+GenericName[pl]=Edytor tekstu
+GenericName[is]=Ritvinnsluforrit
+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[cs]=Úprava textových souborů
+Comment[cy]=Golygu ffeiliau testun
+Comment[da]=Rediger tekstfiler
+Comment[el]=Επεξεργασία αρχείων κειμένου
+Comment[en_CA]=Edit text files
+Comment[en_GB]=Edit text files
+Comment[et]=Redigeeri tekstifaile
+Comment[eu]=Editatu testu-fitxategiak
+Comment[fa]=ویرایش پرونده‌های متنی
+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[is]=Vinna með textaskrár
+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]=Edytuj pliki tekstowe
+Comment[pt]=Editar ficheiros de texto
+Comment[pt_BR]=Edite arquivos de texto
+Comment[ro]=Editare fişiere text
+Comment[sk]=Úprava textových súborov
+Comment[sl]=Urejanje datotek z besedili
+Comment[sq]=Përpuno files teksti
+Comment[sr@Latn]=Izmeni tekstualne datoteke
+Comment[sv]=Redigera textfiler
+Comment[ta]=உரை கோப்புகளை தொகுக்கவும்
+Comment[th]=แก้ไขแฟ้มข้อความ
+Comment[tk]=Metin faýllary editle
+Comment[vi]=Soạn thảo tập tin văn bản
+Comment[wa]=Asspougnî des fitcs tecses
+Comment[zh_TW]=編輯文字檔
+TryExec=gvim
+Exec=gvim -f %F
+Terminal=false
+Type=Application
+# Translators: Search terms to find this application. Do NOT change the semicolons! The list MUST also end with a semicolon!
+Keywords[ca]=Text;editor;
+Keywords[de]=Text;Editor;
+Keywords[eo]=Teksto;redaktilo;
+Keywords[es]=Texto;editor;
+Keywords[fi]=Teksti;muokkain;editori;
+Keywords[fr]=Texte;éditeur;
+Keywords[ga]=Téacs;eagarthóir;
+Keywords[it]=Testo;editor;
+Keywords[ja]=テキスト;エディタ;
+Keywords[ru]=текст;текстовый редактор;
+Keywords[sr]=Текст;едитор;
+Keywords[tr]=Metin;düzenleyici;
+Keywords[uk]=текст;редактор;
+Keywords[zh_CN]=Text;editor;文本;编辑器;
+Keywords=Text;editor;
+# Translators: This is the Icon file name. Do NOT translate
+Icon=gvim
+Categories=Utility;TextEditor;
+StartupNotify=true
+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/gvimrc_example.vim b/runtime/gvimrc_example.vim
new file mode 100644
index 0000000..083dace
--- /dev/null
+++ b/runtime/gvimrc_example.vim
@@ -0,0 +1,55 @@
+" An example for a gvimrc file.
+" The commands in this are executed when the GUI is started, after the vimrc
+" has been executed.
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last change: 2016 Apr 05
+"
+" To use it, copy it to
+" for Unix: ~/.gvimrc
+" for Amiga: s:.gvimrc
+" for MS-Windows: $VIM\_gvimrc
+" for Haiku: ~/config/settings/vim/gvimrc
+" for OpenVMS: sys$login:.gvimrc
+
+" Make external commands work through a pipe instead of a pseudo-tty
+"set noguipty
+
+" set the X11 font to use
+" set guifont=-misc-fixed-medium-r-normal--14-130-75-75-c-70-iso8859-1
+
+set ch=2 " Make command line two lines high
+
+set mousehide " Hide the mouse when typing text
+
+" Make shift-insert work like in Xterm
+map <S-Insert> <MiddleMouse>
+map! <S-Insert> <MiddleMouse>
+
+" Only do this for Vim version 5.0 and later.
+if version >= 500
+
+ " Switch on syntax highlighting if it wasn't on yet.
+ if !exists("syntax_on")
+ syntax on
+ endif
+
+ " For Win32 version, have "K" lookup the keyword in a help file
+ "if has("win32")
+ " let winhelpfile='windows.hlp'
+ " map K :execute "!start winhlp32 -k <cword> " . winhelpfile <CR>
+ "endif
+
+ " Set nice colors
+ " background for normal text is light grey
+ " Text below the last line is darker grey
+ " Cursor is green, Cyan when ":lmap" mappings are active
+ " Constants are not underlined but have a slightly lighter background
+ highlight Normal guibg=grey90
+ highlight Cursor guibg=Green guifg=NONE
+ highlight lCursor guibg=Cyan guifg=NONE
+ highlight NonText guibg=grey80
+ highlight Constant gui=NONE guibg=grey95
+ highlight Special gui=NONE guibg=grey95
+
+endif
diff --git a/runtime/hi16-action-make.png b/runtime/hi16-action-make.png
new file mode 100644
index 0000000..824c758
--- /dev/null
+++ b/runtime/hi16-action-make.png
Binary files differ
diff --git a/runtime/hi22-action-make.png b/runtime/hi22-action-make.png
new file mode 100644
index 0000000..f9abb77
--- /dev/null
+++ b/runtime/hi22-action-make.png
Binary files differ
diff --git a/runtime/icons.info b/runtime/icons.info
new file mode 100644
index 0000000..566bc56
--- /dev/null
+++ b/runtime/icons.info
Binary files differ
diff --git a/runtime/icons/README.txt b/runtime/icons/README.txt
new file mode 100644
index 0000000..7395cc2
--- /dev/null
+++ b/runtime/icons/README.txt
@@ -0,0 +1,35 @@
+Choose your preferred icon and replace the standard Vim icon with it.
+[This is for the Amiga]
+
+When started from Workbench, Vim opens a window of standard terminal size
+(80 x 25). Trying to change this by adding a tool type results in a window
+that disappears before Vim comes up in its own window.
+If you want Vim to start with another size, it can be done using
+IconX.
+
+Follow these steps:
+
+1. Create a script file called e.g. Vim.WB, with a single line in which the
+ Vim executable is started:
+ Echo "Vim" > Vim.WB
+ Protect Vim.WB +s
+
+2. Rename the Vim icon to Vim.WB.
+
+3. By default, the Vim icon is a program icon.
+ Change the icon type from "program" to "project" using IconEdit from the
+ "Tools" directory.
+
+4. Change the icon settings using "information" from the WorkBench's "icon"
+ menu:
+ - The default program, of course, is "IconX".
+ - A stack size of 4096 should be sufficient.
+ - Create a WINDOW tooltype of the desired size.
+ The appropriate values depend on your WB font.
+
+ Example:
+ On a standard non-interlaced WB screen with full overscan resolution
+ (724 x 283 ), the WINDOW tooltype "CON:30/10/664/273" results in a
+ horizontally centered window with 80 columns and 32 lines.
+
+Now Vim comes up with the new window size.
diff --git a/runtime/icons/README.txt.info b/runtime/icons/README.txt.info
new file mode 100644
index 0000000..489ef14
--- /dev/null
+++ b/runtime/icons/README.txt.info
Binary files differ
diff --git a/runtime/icons/Vim_32Colors.info b/runtime/icons/Vim_32Colors.info
new file mode 100644
index 0000000..bb7ea67
--- /dev/null
+++ b/runtime/icons/Vim_32Colors.info
Binary files differ
diff --git a/runtime/icons/Vim_4ColorsLace.info b/runtime/icons/Vim_4ColorsLace.info
new file mode 100644
index 0000000..49eb7d6
--- /dev/null
+++ b/runtime/icons/Vim_4ColorsLace.info
Binary files differ
diff --git a/runtime/icons/Vim_8Colors.info b/runtime/icons/Vim_8Colors.info
new file mode 100644
index 0000000..4a0d451
--- /dev/null
+++ b/runtime/icons/Vim_8Colors.info
Binary files differ
diff --git a/runtime/icons/Vim_8ColorsLace.info b/runtime/icons/Vim_8ColorsLace.info
new file mode 100644
index 0000000..d333f41
--- /dev/null
+++ b/runtime/icons/Vim_8ColorsLace.info
Binary files differ
diff --git a/runtime/import/dist/vimhelp.vim b/runtime/import/dist/vimhelp.vim
new file mode 100644
index 0000000..d053f63
--- /dev/null
+++ b/runtime/import/dist/vimhelp.vim
@@ -0,0 +1,31 @@
+vim9script
+
+# Extra functionality for displaying Vim help .
+
+# Called when editing the doc/syntax.txt file
+export def HighlightGroups()
+ var save_cursor = getcurpos()
+ var buf: number = bufnr('%')
+
+ var start: number = search('\*highlight-groups\*', 'c')
+ var end: number = search('^======')
+ for lnum in range(start, end)
+ var word: string = getline(lnum)->matchstr('^\w\+\ze\t')
+ if word->hlexists()
+ var type = 'help-hl-' .. word
+ if prop_type_list({bufnr: buf})->index(type) != -1
+ # was called before, delete existing properties
+ prop_remove({type: type, bufnr: buf})
+ prop_type_delete(type, {bufnr: buf})
+ endif
+ prop_type_add(type, {
+ bufnr: buf,
+ highlight: word,
+ combine: false,
+ })
+ prop_add(lnum, 1, {length: word->strlen(), type: type})
+ endif
+ endfor
+
+ setpos('.', save_cursor)
+enddef
diff --git a/runtime/indent.vim b/runtime/indent.vim
new file mode 100644
index 0000000..a324995
--- /dev/null
+++ b/runtime/indent.vim
@@ -0,0 +1,32 @@
+" Vim support file to switch on loading indent files for file types
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Feb 11
+
+if exists("did_indent_on")
+ finish
+endif
+let did_indent_on = 1
+
+augroup filetypeindent
+ au FileType * call s:LoadIndent()
+augroup END
+
+def s:LoadIndent()
+ if exists("b:undo_indent")
+ legacy exe b:undo_indent
+ unlet! b:undo_indent b:did_indent
+ endif
+ var s = expand("<amatch>")
+ if s != ""
+ if exists("b:did_indent")
+ unlet b:did_indent
+ endif
+
+ # When there is a dot it is used to separate filetype names. Thus for
+ # "aaa.bbb" load "indent/aaa.vim" and then "indent/bbb.vim".
+ for name in split(s, '\.')
+ exe 'runtime! indent/' .. name .. '.vim'
+ endfor
+ endif
+enddef
diff --git a/runtime/indent/Makefile b/runtime/indent/Makefile
new file mode 100644
index 0000000..f6c4473
--- /dev/null
+++ b/runtime/indent/Makefile
@@ -0,0 +1,14 @@
+# Portable Makefile for running indent tests.
+
+VIM = vim
+VIMRUNTIME = ..
+
+# Run the tests that didn't run yet or failed previously.
+# If a test succeeds a testdir/*.out file will be written.
+# If a test fails a testdir/*.fail file will be written.
+test:
+ VIMRUNTIME=$(VIMRUNTIME) $(VIM) --clean --not-a-term -u testdir/runtest.vim
+
+
+clean testclean:
+ rm -f testdir/*.fail testdir/*.out
diff --git a/runtime/indent/README.txt b/runtime/indent/README.txt
new file mode 100644
index 0000000..6498706
--- /dev/null
+++ b/runtime/indent/README.txt
@@ -0,0 +1,47 @@
+This directory contains files to automatically compute the indent for a
+type of file.
+
+If you want to add your own indent file for your personal use, read the docs
+at ":help indent-expression". Looking at the existing files should give you
+inspiration.
+
+If you make a new indent file which would be useful for others, please send it
+to Bram@vim.org. Include instructions for detecting the file type for this
+language, by file name extension or by checking a few lines in the file.
+And please stick to the rules below.
+
+If you have remarks about an existing file, send them to the maintainer of
+that file. Only when you get no response send a message to Bram@vim.org.
+
+If you are the maintainer of an indent file and make improvements, e-mail the
+new version to Bram@vim.org.
+
+
+Rules for making an indent file:
+
+You should use this check for "b:did_indent":
+
+ " Only load this indent file when no other was loaded yet.
+ if exists("b:did_indent")
+ finish
+ endif
+ let b:did_indent = 1
+
+Always use ":setlocal" to set 'indentexpr'. This avoids it being carried over
+to other buffers.
+
+To trigger the indenting after typing a word like "endif", add the word to the
+'indentkeys' option with "+=".
+
+You normally set 'indentexpr' to evaluate a function and then define that
+function. That function only needs to be defined once for as long as Vim is
+running. Add a test if the function exists and use ":finish", like this:
+ if exists("*GetMyIndent")
+ finish
+ endif
+
+The user may have several options set unlike you, try to write the file such
+that it works with any option settings. Also be aware of certain features not
+being compiled in.
+
+To test the indent file, see testdir/README.txt.
diff --git a/runtime/indent/aap.vim b/runtime/indent/aap.vim
new file mode 100644
index 0000000..35828b4
--- /dev/null
+++ b/runtime/indent/aap.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: Aap recipe
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2005 Jun 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Works mostly like Python.
+runtime! indent/python.vim
diff --git a/runtime/indent/ada.vim b/runtime/indent/ada.vim
new file mode 100644
index 0000000..582d033
--- /dev/null
+++ b/runtime/indent/ada.vim
@@ -0,0 +1,311 @@
+"------------------------------------------------------------------------------
+" Description: Vim Ada indent file
+" Language: Ada (2005)
+" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $
+" Copyright: Copyright (C) 2006 Martin Krischik
+" Maintainer: Martin Krischik <krischik@users.sourceforge.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) $
+" Version: 4.6
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $
+" History: 24.05.2006 MK Unified Headers
+" 16.07.2006 MK Ada-Mode as vim-ball
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 05.11.2006 MK Bram suggested to save on spaces
+" 19.09.2007 NO g: missing before ada#Comment
+" 2022 April: b:undo_indent added by Doug Kearns
+" Help Page: ft-vim-indent
+"------------------------------------------------------------------------------
+" ToDo:
+" Verify handling of multi-line exprs. and recovery upon the final ';'.
+" Correctly find comments given '"' and "" ==> " syntax.
+" Combine the two large block-indent functions into one?
+"------------------------------------------------------------------------------
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent") || version < 700
+ finish
+endif
+
+let b:did_indent = 45
+
+setlocal indentexpr=GetAdaIndent()
+setlocal indentkeys-=0{,0}
+setlocal indentkeys+=0=~then,0=~end,0=~elsif,0=~when,0=~exception,0=~begin,0=~is,0=~record
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the functions once.
+if exists("*GetAdaIndent")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+if exists("g:ada_with_gnat_project_files")
+ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\<is\>[^;]*$\|\(type\>.*\)\=\<record\>\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|project\>\|then\>\|when\>\|is\>\)'
+else
+ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\<is\>[^;]*$\|\(type\>.*\)\=\<record\>\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|then\>\|when\>\|is\>\)'
+endif
+
+" Section: s:MainBlockIndent {{{1
+"
+" Try to find indent of the block we're in
+" prev_indent = the previous line's indent
+" prev_lnum = previous line (to start looking on)
+" blockstart = expr. that indicates a possible start of this block
+" stop_at = if non-null, if a matching line is found, gives up!
+" No recursive previous block analysis: simply look for a valid line
+" with a lesser or equal indent than we currently (on prev_lnum) have.
+" This shouldn't work as well as it appears to with lines that are currently
+" nowhere near the correct indent (e.g., start of line)!
+" Seems to work OK as it 'starts' with the indent of the /previous/ line.
+function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at)
+ let lnum = a:prev_lnum
+ let line = substitute( getline(lnum), g:ada#Comment, '', '' )
+ while lnum > 1
+ if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent
+ return a:prev_indent
+ elseif line =~ '^\s*' . a:blockstart
+ let ind = indent(lnum)
+ if ind < a:prev_indent
+ return ind
+ endif
+ endif
+
+ let lnum = prevnonblank(lnum - 1)
+ " Get previous non-blank/non-comment-only line
+ while 1
+ let line = substitute( getline(lnum), g:ada#Comment, '', '' )
+ if line !~ '^\s*$' && line !~ '^\s*#'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ if lnum <= 0
+ return a:prev_indent
+ endif
+ endwhile
+ endwhile
+ " Fallback - just move back one
+ return a:prev_indent - shiftwidth()
+endfunction MainBlockIndent
+
+" Section: s:EndBlockIndent {{{1
+"
+" Try to find indent of the block we're in (and about to complete),
+" including handling of nested blocks. Works on the 'end' of a block.
+" prev_indent = the previous line's indent
+" prev_lnum = previous line (to start looking on)
+" blockstart = expr. that indicates a possible start of this block
+" blockend = expr. that indicates a possible end of this block
+function s:EndBlockIndent( prev_indent, prev_lnum, blockstart, blockend )
+ let lnum = a:prev_lnum
+ let line = getline(lnum)
+ let ends = 0
+ while lnum > 1
+ if getline(lnum) =~ '^\s*' . a:blockstart
+ let ind = indent(lnum)
+ if ends <= 0
+ if ind < a:prev_indent
+ return ind
+ endif
+ else
+ let ends = ends - 1
+ endif
+ elseif getline(lnum) =~ '^\s*' . a:blockend
+ let ends = ends + 1
+ endif
+
+ let lnum = prevnonblank(lnum - 1)
+ " Get previous non-blank/non-comment-only line
+ while 1
+ let line = getline(lnum)
+ let line = substitute( line, g:ada#Comment, '', '' )
+ if line !~ '^\s*$'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ if lnum <= 0
+ return a:prev_indent
+ endif
+ endwhile
+ endwhile
+ " Fallback - just move back one
+ return a:prev_indent - shiftwidth()
+endfunction EndBlockIndent
+
+" Section: s:StatementIndent {{{1
+"
+" Return indent of previous statement-start
+" (after we've indented due to multi-line statements).
+" This time, we start searching on the line *before* the one given (which is
+" the end of a statement - we want the previous beginning).
+function s:StatementIndent( current_indent, prev_lnum )
+ let lnum = a:prev_lnum
+ while lnum > 0
+ let prev_lnum = lnum
+ let lnum = prevnonblank(lnum - 1)
+ " Get previous non-blank/non-comment-only line
+ while 1
+ let line = substitute( getline(lnum), g:ada#Comment, '', '' )
+
+ if line !~ '^\s*$' && line !~ '^\s*#'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ if lnum <= 0
+ return a:current_indent
+ endif
+ endwhile
+ " Leave indent alone if our ';' line is part of a ';'-delineated
+ " aggregate (e.g., procedure args.) or first line after a block start.
+ if line =~ s:AdaBlockStart || line =~ '(\s*$'
+ return a:current_indent
+ endif
+ if line !~ '[.=(]\s*$'
+ let ind = indent(prev_lnum)
+ if ind < a:current_indent
+ return ind
+ endif
+ endif
+ endwhile
+ " Fallback - just use current one
+ return a:current_indent
+endfunction StatementIndent
+
+
+" Section: GetAdaIndent {{{1
+"
+" Find correct indent of a new line based upon what went before
+"
+function GetAdaIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+ let ind = indent(lnum)
+ let package_line = 0
+
+ " Get previous non-blank/non-comment-only/non-cpp line
+ while 1
+ let line = substitute( getline(lnum), g:ada#Comment, '', '' )
+ if line !~ '^\s*$' && line !~ '^\s*#'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ if lnum <= 0
+ return ind
+ endif
+ endwhile
+
+ " Get default indent (from prev. line)
+ let ind = indent(lnum)
+ let initind = ind
+
+ " Now check what's on the previous line
+ if line =~ s:AdaBlockStart || line =~ '(\s*$'
+ " Check for false matches to AdaBlockStart
+ let false_match = 0
+ if line =~ '^\s*\(procedure\|function\|package\)\>.*\<is\s*new\>'
+ " Generic instantiation
+ let false_match = 1
+ elseif line =~ ')\s*;\s*$' || line =~ '^\([^(]*([^)]*)\)*[^(]*;\s*$'
+ " forward declaration
+ let false_match = 1
+ endif
+ " Move indent in
+ if ! false_match
+ let ind = ind + shiftwidth()
+ endif
+ elseif line =~ '^\s*\(case\|exception\)\>'
+ " Move indent in twice (next 'when' will move back)
+ let ind = ind + 2 * shiftwidth()
+ elseif line =~ '^\s*end\s*record\>'
+ " Move indent back to tallying 'type' preceding the 'record'.
+ " Allow indent to be equal to 'end record's.
+ 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
+ exe 'normal! $F)%'
+ if getline('.') =~ '^\s*('
+ " Dire layout - use previous indent (could check for g:ada#Comment here)
+ let ind = indent( prevnonblank( line('.')-1 ) )
+ else
+ let ind = indent('.')
+ endif
+ exe v:lnum
+ elseif line =~ '[.=(]\s*$'
+ " A statement continuation - move in one
+ let ind = ind + shiftwidth()
+ elseif line =~ '^\s*new\>'
+ " Multiple line generic instantiation ('package blah is\nnew thingy')
+ 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 )
+ endif
+
+ " Check for potential argument list on next line
+ let continuation = (line =~ '[A-Za-z0-9_]\s*$')
+
+
+ " Check current line; search for simplistic matching start-of-block
+ let line = getline(v:lnum)
+ if line =~ '^\s*#'
+ " Start of line for ada-pp
+ let ind = 0
+ elseif continuation && line =~ '^\s*('
+ " Don't do this if we've already indented due to the previous line
+ if ind == initind
+ 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\>', '' ) + 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\)\>', '' ) + shiftwidth()
+ elseif line =~ '^\s*end\>\s*\<if\>'
+ " End of if statements
+ let ind = s:EndBlockIndent( ind, lnum, 'if\>', 'end\>\s*\<if\>' )
+ elseif line =~ '^\s*end\>\s*\<loop\>'
+ " End of loops
+ let ind = s:EndBlockIndent( ind, lnum, '\(\(while\|for\)\>.*\)\?\<loop\>', 'end\>\s*\<loop\>' )
+ elseif line =~ '^\s*end\>\s*\<record\>'
+ " End of records
+ let ind = s:EndBlockIndent( ind, lnum, '\(type\>.*\)\=\<record\>', 'end\>\s*\<record\>' )
+ elseif line =~ '^\s*end\>\s*\<procedure\>'
+ " End of procedures
+ let ind = s:EndBlockIndent( ind, lnum, 'procedure\>.*\<is\>', 'end\>\s*\<procedure\>' )
+ elseif line =~ '^\s*end\>\s*\<case\>'
+ " End of case statement
+ let ind = s:EndBlockIndent( ind, lnum, 'case\>.*\<is\>', 'end\>\s*\<case\>' )
+ elseif line =~ '^\s*end\>'
+ " General case for end
+ let ind = s:MainBlockIndent( ind, lnum, '\(if\|while\|for\|loop\|accept\|begin\|record\|case\|exception\|package\)\>', '' )
+ elseif line =~ '^\s*exception\>'
+ let ind = s:MainBlockIndent( ind, lnum, 'begin\>', '' )
+ elseif line =~ '^\s*then\>'
+ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' )
+ endif
+
+ return ind
+endfunction GetAdaIndent
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" vim: foldmethod=marker
diff --git a/runtime/indent/ant.vim b/runtime/indent/ant.vim
new file mode 100644
index 0000000..067f272
--- /dev/null
+++ b/runtime/indent/ant.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: ANT files
+" Maintainer: David Fishburn <fishburn@ianywhere.com>
+" Last Change: Thu May 15 2003 10:02:54 PM
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use XML formatting rules
+runtime! indent/xml.vim
diff --git a/runtime/indent/automake.vim b/runtime/indent/automake.vim
new file mode 100644
index 0000000..7e38f92
--- /dev/null
+++ b/runtime/indent/automake.vim
@@ -0,0 +1,11 @@
+" Vim indent file
+" Language: automake
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:did_indent")
+ finish
+endif
+
+" same as makefile indenting for now.
+runtime! indent/make.vim
diff --git a/runtime/indent/awk.vim b/runtime/indent/awk.vim
new file mode 100644
index 0000000..cf81322
--- /dev/null
+++ b/runtime/indent/awk.vim
@@ -0,0 +1,235 @@
+" vim: set sw=3 sts=3:
+
+" Awk indent script. It can handle multi-line statements and expressions.
+" It works up to the point where the distinction between correct/incorrect
+" and personal taste gets fuzzy. Drop me an e-mail for bug reports and
+" reasonable style suggestions.
+"
+" Bugs:
+" =====
+" - Some syntax errors may cause erratic indentation.
+" - Same for very unusual but syntacticly correct use of { }
+" - In some cases it's confused by the use of ( and { in strings constants
+" - This version likes the closing brace of a multiline pattern-action be on
+" character position 1 before the following pattern-action combination is
+" formatted
+
+" Author:
+" =======
+" Erik Janssen, ejanssen@itmatters.nl
+"
+" History:
+" ========
+" 26-04-2002 Got initial version working reasonably well
+" 29-04-2002 Fixed problems in function headers and max line width
+" Added support for two-line if's without curly braces
+" Fixed hang: 2011 Aug 31
+" 2022 April: b:undo_indent added by Doug Kearns
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetAwkIndent()
+" Mmm, copied from the tcl indent program. Is this okay?
+setlocal indentkeys-=:,0#
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+if exists("*GetAwkIndent")
+ finish
+endif
+
+" This function contains a lot of exit points. It checks for simple cases
+" first to get out of the function as soon as possible, thereby reducing the
+" number of possibilities later on in the difficult parts
+
+function! GetAwkIndent()
+
+ " Find previous line and get its indentation
+ let prev_lineno = s:Get_prev_line( v:lnum )
+ if prev_lineno == 0
+ return 0
+ endif
+ let prev_data = getline( prev_lineno )
+ let ind = indent( prev_lineno )
+
+ " Increase indent if the previous line contains an opening brace. Search
+ " for this brace the hard way to prevent errors if the previous line is a
+ " 'pattern { action }' (simple check match on /{/ increases the indent then)
+
+ if s:Get_brace_balance( prev_data, '{', '}' ) > 0
+ return ind + shiftwidth()
+ endif
+
+ let brace_balance = s:Get_brace_balance( prev_data, '(', ')' )
+
+ " If prev line has positive brace_balance and starts with a word (keyword
+ " or function name), align the current line on the first '(' of the prev
+ " line
+
+ if brace_balance > 0 && s:Starts_with_word( prev_data )
+ return s:Safe_indent( ind, s:First_word_len(prev_data), getline(v:lnum))
+ endif
+
+ " If this line starts with an open brace bail out now before the line
+ " continuation checks.
+
+ if getline( v:lnum ) =~ '^\s*{'
+ return ind
+ endif
+
+ " If prev line seems to be part of multiline statement:
+ " 1. Prev line is first line of a multiline statement
+ " -> attempt to indent on first ' ' or '(' of prev line, just like we
+ " indented the positive brace balance case above
+ " 2. Prev line is not first line of a multiline statement
+ " -> copy indent of prev line
+
+ let continue_mode = s:Seems_continuing( prev_data )
+ if continue_mode > 0
+ if s:Seems_continuing( getline(s:Get_prev_line( prev_lineno )) )
+ " Case 2
+ return ind
+ else
+ " Case 1
+ if continue_mode == 1
+ " Need continuation due to comma, backslash, etc
+ return s:Safe_indent( ind, s:First_word_len(prev_data), getline(v:lnum))
+ else
+ " if/for/while without '{'
+ return ind + shiftwidth()
+ endif
+ endif
+ endif
+
+ " If the previous line doesn't need continuation on the current line we are
+ " on the start of a new statement. We have to make sure we align with the
+ " previous statement instead of just the previous line. This is a bit
+ " complicated because the previous statement might be multi-line.
+ "
+ " The start of a multiline statement can be found by:
+ "
+ " 1 If the previous line contains closing braces and has negative brace
+ " balance, search backwards until cumulative brace balance becomes zero,
+ " take indent of that line
+ " 2 If the line before the previous needs continuation search backward
+ " until that's not the case anymore. Take indent of one line down.
+
+ " Case 1
+ if prev_data =~ ')' && brace_balance < 0
+ while brace_balance != 0 && prev_lineno > 0
+ let prev_lineno = s:Get_prev_line( prev_lineno )
+ let prev_data = getline( prev_lineno )
+ let brace_balance=brace_balance+s:Get_brace_balance(prev_data,'(',')' )
+ endwhile
+ let ind = indent( prev_lineno )
+ else
+ " Case 2
+ if s:Seems_continuing( getline( prev_lineno - 1 ) )
+ let prev_lineno = prev_lineno - 2
+ let prev_data = getline( prev_lineno )
+ while prev_lineno > 0 && (s:Seems_continuing( prev_data ) > 0)
+ let prev_lineno = s:Get_prev_line( prev_lineno )
+ let prev_data = getline( prev_lineno )
+ endwhile
+ let ind = indent( prev_lineno + 1 )
+ endif
+ endif
+
+ " Decrease indent if this line contains a '}'.
+ if getline(v:lnum) =~ '^\s*}'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfunction
+
+" Find the open and close braces in this line and return how many more open-
+" than close braces there are. It's also used to determine cumulative balance
+" across multiple lines.
+
+function! s:Get_brace_balance( line, b_open, b_close )
+ let line2 = substitute( a:line, a:b_open, "", "g" )
+ let openb = strlen( a:line ) - strlen( line2 )
+ let line3 = substitute( line2, a:b_close, "", "g" )
+ let closeb = strlen( line2 ) - strlen( line3 )
+ return openb - closeb
+endfunction
+
+" Find out whether the line starts with a word (i.e. keyword or function
+" call). Might need enhancements here.
+
+function! s:Starts_with_word( line )
+ if a:line =~ '^\s*[a-zA-Z_0-9]\+\s*('
+ return 1
+ endif
+ return 0
+endfunction
+
+" Find the length of the first word in a line. This is used to be able to
+" align a line relative to the 'print ' or 'if (' on the previous line in case
+" such a statement spans multiple lines.
+" Precondition: only to be used on lines where 'Starts_with_word' returns 1.
+
+function! s:First_word_len( line )
+ let white_end = matchend( a:line, '^\s*' )
+ if match( a:line, '^\s*func' ) != -1
+ let word_end = matchend( a:line, '[a-z]\+\s\+[a-zA-Z_0-9]\+[ (]*' )
+ else
+ let word_end = matchend( a:line, '[a-zA-Z_0-9]\+[ (]*' )
+ endif
+ return word_end - white_end
+endfunction
+
+" Determine if 'line' completes a statement or is continued on the next line.
+" This one is far from complete and accepts illegal code. Not important for
+" indenting, however.
+
+function! s:Seems_continuing( line )
+ " Unfinished lines
+ if a:line =~ '\(--\|++\)\s*$'
+ return 0
+ endif
+ if a:line =~ '[\\,\|\&\+\-\*\%\^]\s*$'
+ return 1
+ endif
+ " if/for/while (cond) eol
+ if a:line =~ '^\s*\(if\|while\|for\)\s*(.*)\s*$' || a:line =~ '^\s*else\s*'
+ return 2
+ endif
+ return 0
+endfunction
+
+" Get previous relevant line. Search back until a line is that is no
+" comment or blank and return the line number
+
+function! s:Get_prev_line( lineno )
+ let lnum = a:lineno - 1
+ let data = getline( lnum )
+ while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$')
+ let lnum = lnum - 1
+ let data = getline( lnum )
+ endwhile
+ return lnum
+endfunction
+
+" This function checks whether an indented line exceeds a maximum linewidth
+" (hardcoded 80). If so and it is possible to stay within 80 positions (or
+" limit num of characters beyond linewidth) by decreasing the indent (keeping
+" it > base_indent), do so.
+
+function! s:Safe_indent( base, wordlen, this_line )
+ let line_base = matchend( a:this_line, '^\s*' )
+ let line_len = strlen( a:this_line ) - line_base
+ let indent = a:base
+ if (indent + a:wordlen + line_len) > 80
+ " Simple implementation good enough for the time being
+ let indent = indent + 3
+ endif
+ return indent + a:wordlen
+endfunction
diff --git a/runtime/indent/bash.vim b/runtime/indent/bash.vim
new file mode 100644
index 0000000..b916406
--- /dev/null
+++ b/runtime/indent/bash.vim
@@ -0,0 +1,18 @@
+" Vim indent file
+" Language: bash
+" Maintainer: Bram
+" Last Change: 2019 Sep 27
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" The actual indenting is in sh.vim and controlled by buffer-local variables.
+unlet! b:is_sh
+unlet! b:is_kornshell
+let b:is_bash = 1
+
+runtime! indent/sh.vim
+
+" vim: ts=8
diff --git a/runtime/indent/basic.vim b/runtime/indent/basic.vim
new file mode 100644
index 0000000..7228772
--- /dev/null
+++ b/runtime/indent/basic.vim
@@ -0,0 +1,11 @@
+" Vim indent file
+" Language: BASIC (QuickBASIC 4.5)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jan 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/vb.vim
diff --git a/runtime/indent/bib.vim b/runtime/indent/bib.vim
new file mode 100644
index 0000000..d1a0636
--- /dev/null
+++ b/runtime/indent/bib.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: BibTeX
+" Maintainer: Dorai Sitaram <ds26@gte.com>
+" URL: http://www.ccs.neu.edu/~dorai/vimplugins/vimplugins.html
+" Last Change: 2005 Mar 28
+
+" Only do this when not done yet for this buffer
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/runtime/indent/bitbake.vim b/runtime/indent/bitbake.vim
new file mode 100644
index 0000000..f45ba74
--- /dev/null
+++ b/runtime/indent/bitbake.vim
@@ -0,0 +1,22 @@
+" Vim indent file
+" Language: BitBake
+" Copyright: Copyright (C) 2019 Agilent Technologies, Inc.
+" Maintainer: Chris Laplante <chris.laplante@agilent.com>
+" License: You may redistribute this under the same terms as Vim itself
+
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/sh.vim
+
+setlocal indentexpr=bitbake#Indent(v:lnum)
+setlocal autoindent
+setlocal nolisp
+setlocal shiftwidth=4
+setlocal expandtab
+setlocal indentkeys+=<:>,=elif,=except,0=\"
+
+let b:undo_indent .= ' inde< ai< lisp< sw< et< indk<'
+
+let b:did_indent = 1
diff --git a/runtime/indent/bst.vim b/runtime/indent/bst.vim
new file mode 100644
index 0000000..3dd8d71
--- /dev/null
+++ b/runtime/indent/bst.vim
@@ -0,0 +1,73 @@
+" Vim indent file
+" Language: bst
+" Author: Tim Pope <vimNOSPAM@tpope.info>
+" Last Change: 2022 Mar 15
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetBstIndent(v:lnum)
+setlocal cinkeys&
+setlocal cinkeys-=0#
+setlocal indentkeys&
+let b:undo_indent = 'setlocal indentexpr< cinkeys< indentkeys<'
+
+" Only define the function once.
+if exists("*GetBstIndent")
+ finish
+endif
+
+function! s:prevgood(lnum)
+ " Find a non-blank line above the current line.
+ " Skip over comments.
+ let lnum = a:lnum
+ while lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ if getline(lnum) !~ '^\s*%.*$'
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function! s:strip(lnum)
+ let line = getline(a:lnum)
+ let line = substitute(line,'"[^"]*"','""','g')
+ let line = substitute(line,'%.*','','')
+ let line = substitute(line,'^\s\+','','')
+ return line
+endfunction
+
+function! s:count(string,char)
+ let str = substitute(a:string,'[^'.a:char.']','','g')
+ return strlen(str)
+endfunction
+
+function! GetBstIndent(lnum) abort
+ if a:lnum == 1
+ return 0
+ endif
+ let lnum = s:prevgood(a:lnum)
+ if lnum <= 0
+ return indent(a:lnum - 1)
+ endif
+ let line = s:strip(lnum)
+ let cline = s:strip(a:lnum)
+ if cline =~ '^}' && exists("b:current_syntax")
+ call cursor(a:lnum,indent(a:lnum))
+ if searchpair('{','','}','bW',"synIDattr(synID(line('.'),col('.'),1),'name') =~? 'comment\\|string'")
+ if col('.')+1 == col('$')
+ return indent('.')
+ else
+ return virtcol('.')-1
+ endif
+ endif
+ endif
+ let fakeline = substitute(line,'^}','','').matchstr(cline,'^}')
+ let ind = indent(lnum)
+ 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
new file mode 100644
index 0000000..cf4cfb5
--- /dev/null
+++ b/runtime/indent/bzl.vim
@@ -0,0 +1,105 @@
+" Vim indent file
+" Language: Bazel (http://bazel.io)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-bzl)
+" Last Change: 2021 Jul 08
+
+if exists('b:did_indent')
+ finish
+endif
+
+" Load base python indent.
+if !exists('*GetPythonIndent')
+ runtime! indent/python.vim
+endif
+
+let b:did_indent = 1
+
+" Only enable bzl google indent if python google indent is enabled.
+if !get(g:, 'no_google_python_indent')
+ setlocal indentexpr=GetBzlIndent(v:lnum)
+endif
+
+if exists('*GetBzlIndent')
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" Maximum number of lines to look backwards.
+let s:maxoff = 50
+
+""
+" Determine the correct indent level given an {lnum} in the current buffer.
+function GetBzlIndent(lnum) abort
+ let l:use_recursive_indent = !get(g:, 'no_google_python_recursive_indent')
+ if l:use_recursive_indent
+ " Backup and override indent setting variables.
+ if exists('g:pyindent_nested_paren')
+ let l:pyindent_nested_paren = g:pyindent_nested_paren
+ endif
+ if exists('g:pyindent_open_paren')
+ let l:pyindent_open_paren = g:pyindent_open_paren
+ endif
+ let g:pyindent_nested_paren = 'shiftwidth()'
+ let g:pyindent_open_paren = 'shiftwidth()'
+ endif
+
+ let l:indent = -1
+
+ call cursor(a:lnum, 1)
+ let [l:par_line, l:par_col] = searchpairpos('(\|{\|\[', '', ')\|}\|\]', 'bW',
+ \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" .
+ \ " synIDattr(synID(line('.'), col('.'), 1), 'name')" .
+ \ " =~ '\\(Comment\\|String\\)$'")
+ if l:par_line > 0
+ " Indent inside parens.
+ if searchpair('(\|{\|\[', '', ')\|}\|\]', 'W',
+ \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" .
+ \ " synIDattr(synID(line('.'), col('.'), 1), 'name')" .
+ \ " =~ '\\(Comment\\|String\\)$'") && line('.') == a:lnum
+ " If cursor is at close parens, match indent with open parens.
+ " E.g.
+ " foo(
+ " )
+ let l:indent = indent(l:par_line)
+ else
+ " Align with the open paren unless it is at the end of the line.
+ " E.g.
+ " open_paren_not_at_EOL(100,
+ " (200,
+ " 300),
+ " 400)
+ " open_paren_at_EOL(
+ " 100, 200, 300, 400)
+ call cursor(l:par_line, 1)
+ if l:par_col != col('$') - 1
+ let l:indent = l:par_col
+ endif
+ endif
+ endif
+
+ " Delegate the rest to the original function.
+ if l:indent == -1
+ let l:indent = GetPythonIndent(a:lnum)
+ endif
+
+ if l:use_recursive_indent
+ " Restore global variables.
+ if exists('l:pyindent_nested_paren')
+ let g:pyindent_nested_paren = l:pyindent_nested_paren
+ else
+ unlet g:pyindent_nested_paren
+ endif
+ if exists('l:pyindent_open_paren')
+ let g:pyindent_open_paren = l:pyindent_open_paren
+ else
+ unlet g:pyindent_open_paren
+ endif
+ endif
+
+ return l:indent
+endfunction
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/indent/c.vim b/runtime/indent/c.vim
new file mode 100644
index 0000000..e224382
--- /dev/null
+++ b/runtime/indent/c.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: C
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2005 Mar 27
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" C indenting is built-in, thus this is very simple
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/runtime/indent/cdl.vim b/runtime/indent/cdl.vim
new file mode 100644
index 0000000..2c0fc79
--- /dev/null
+++ b/runtime/indent/cdl.vim
@@ -0,0 +1,136 @@
+" Description: Comshare Dimension Definition Language (CDL)
+" Maintainer: Raul Segura Acevedo <raulseguraaceved@netscape.net> (Invalid email address)
+" Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Apr 06
+
+if exists("b:did_indent")
+ "finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=CdlGetIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+==~else,=~endif,=~then,;,),=
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+if exists("*CdlGetIndent")
+ "finish
+endif
+
+" find out if an "...=..." expression is an assignment (or a conditional)
+" it scans 'line' first, and then the previous lines
+fun! CdlAsignment(lnum, line)
+ let f = -1
+ let lnum = a:lnum
+ let line = a:line
+ while lnum > 0 && f == -1
+ " line without members [a] of [b]:[c]...
+ let inicio = 0
+ while 1
+ " keywords that help to decide
+ let inicio = matchend(line, '\c\<\(expr\|\a*if\|and\|or\|not\|else\|then\|memberis\|\k\+of\)\>\|[<>;]', inicio)
+ if inicio < 0
+ break
+ endif
+ " it's formula if there's a ';', 'elsE', 'theN', 'enDif' or 'expr'
+ " conditional if there's a '<', '>', 'elseif', 'if', 'and', 'or', 'not',
+ " 'memberis', 'childrenof' and other \k\+of functions
+ let f = line[inicio-1] =~? '[en;]' || strpart(line, inicio-4, 4) =~? 'ndif\|expr'
+ endw
+ let lnum = prevnonblank(lnum-1)
+ let line = substitute(getline(lnum), '\c\(\[[^]]*]\(\s*of\s*\|:\)*\)\+', ' ', 'g')
+ endw
+ " if we hit the start of the file then f = -1, return 1 (formula)
+ return f != 0
+endf
+
+fun! CdlGetIndent(lnum)
+ let thisline = getline(a:lnum)
+ if match(thisline, '^\s*\(\k\+\|\[[^]]*]\)\s*\(,\|;\s*$\)') >= 0
+ " it's an attributes line
+ return shiftwidth()
+ elseif match(thisline, '^\c\s*\([{}]\|\/[*/]\|dimension\|schedule\|group\|hierarchy\|class\)') >= 0
+ " it's a header or '{' or '}' or a comment
+ return 0
+ end
+
+ let lnum = prevnonblank(a:lnum-1)
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " PREVIOUS LINE
+ let ind = indent(lnum)
+ let line = getline(lnum)
+
+ " Whether a '=' is a conditional or an assignment. -1 means we don't know
+ " yet.
+ " One 'closing' element at the beginning of the line has already reduced the
+ " indent, but 'else', 'elseif' & 'then' increment it for the next line.
+ " '=' at the beginning already has the right indent (increased for
+ " asignments).
+ let f = -1
+ let inicio = matchend(line, '^\c\s*\(else\a*\|then\|endif\|/[*/]\|[);={]\)')
+ if inicio > 0
+ let c = line[inicio-1]
+ " ')' and '=' don't change indent and are useless to set 'f'
+ if c == '{'
+ 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 + shiftwidth()
+ elseif strpart(line, inicio-6, 6) ==? 'elseif' " elseif, set f to conditional
+ let ind = ind + shiftwidth()
+ let f = 0
+ end
+ end
+ end
+
+ " remove members [a] of [b]:[c]... (inicio remainds valid)
+ let line = substitute(line, '\c\(\[[^]]*]\(\s*of\s*\|:\)*\)\+', ' ', 'g')
+ while 1
+ " search for the next interesting element
+ let inicio=matchend(line, '\c\<if\|endif\|[()=;]', inicio)
+ if inicio < 0
+ break
+ end
+
+ let c = line[inicio-1]
+ " 'expr(...)' containing the formula
+ if strpart(line, inicio-5, 5) ==? 'expr('
+ let ind = 0
+ let f = 1
+ elseif c == ')' || c== ';' || strpart(line, inicio-5, 5) ==? 'endif'
+ let ind = ind - shiftwidth()
+ elseif c == '(' || c ==? 'f' " '(' or 'if'
+ let ind = ind + shiftwidth()
+ else " c == '='
+ " if it is an assignment 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 + shiftwidth()
+ end
+ end
+ endw
+
+ " CURRENT LINE, if it starts with a closing element, decrease indent
+ " or if it starts with '=' (assignment), increase indent
+ if match(thisline, '^\c\s*\(else\|then\|endif\|[);]\)') >= 0
+ let ind = ind - shiftwidth()
+ elseif match(thisline, '^\s*=') >= 0
+ if f == -1 " we don't know yet if is an assignment, find out
+ let f = CdlAsignment(lnum, "")
+ end
+ if f == 1 " formula increase it
+ let ind = ind + shiftwidth()
+ end
+ end
+
+ return ind
+endfun
diff --git a/runtime/indent/ch.vim b/runtime/indent/ch.vim
new file mode 100644
index 0000000..e1bd8a3
--- /dev/null
+++ b/runtime/indent/ch.vim
@@ -0,0 +1,18 @@
+" Vim indent file
+" Language: Ch
+" Maintainer: SoftIntegration, Inc. <info@softintegration.com>
+" URL: http://www.softintegration.com/download/vim/indent/ch.vim
+" Last change: 2006 Apr 30
+" Created based on cpp.vim
+"
+" Ch is a C/C++ interpreter with many high level extensions
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Ch indenting is built-in, thus this is very simple
+setlocal cindent
diff --git a/runtime/indent/chaiscript.vim b/runtime/indent/chaiscript.vim
new file mode 100644
index 0000000..b7a3fe5
--- /dev/null
+++ b/runtime/indent/chaiscript.vim
@@ -0,0 +1,53 @@
+" Vim indent file
+" Language: ChaiScript
+" Maintainer: Jason Turner <lefticus 'at' gmail com>
+" Last Change: 2022 Apr 06
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetChaiScriptIndent()
+setlocal autoindent
+
+let b:undo_indent = "setl ai< inde<"
+
+" Only define the function once.
+if exists("*GetChaiScriptIndent")
+ finish
+endif
+
+function! GetChaiScriptIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Add a 'shiftwidth' after lines that start a block:
+ " lines containing a {
+ let ind = indent(lnum)
+ let flag = 0
+ let prevline = getline(lnum)
+ if prevline =~ '^.*{.*'
+ 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()
+ endif
+
+ " Subtract a 'shiftwidth' on lines ending with }
+ if getline(v:lnum) =~ '^\s*\%(}\)'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/changelog.vim b/runtime/indent/changelog.vim
new file mode 100644
index 0000000..522c64d
--- /dev/null
+++ b/runtime/indent/changelog.vim
@@ -0,0 +1,14 @@
+" Vim indent file
+" Language: generic Changelog file
+" Maintainer: noone
+" Last Change: 2005 Mar 29
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal ai
+
+let b:undo_indent = "setl ai<"
diff --git a/runtime/indent/chatito.vim b/runtime/indent/chatito.vim
new file mode 100644
index 0000000..1ff5e9e
--- /dev/null
+++ b/runtime/indent/chatito.vim
@@ -0,0 +1,32 @@
+" Vim indent file
+" Language: Chatito
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 20
+
+if exists('b:did_indent')
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetChatitoIndent()
+setlocal indentkeys=o,O,*<Return>,0#,!^F
+
+let b:undo_indent = 'setl inde< indk<'
+
+if exists('*GetChatitoIndent')
+ finish
+endif
+
+function GetChatitoIndent()
+ let l:prev = v:lnum - 1
+ if getline(prevnonblank(l:prev)) =~# '^[~%@]\['
+ " shift indent after definitions
+ return shiftwidth()
+ elseif getline(l:prev) !~# '^\s*$'
+ " maintain indent in sentences
+ return indent(l:prev)
+ else
+ " reset indent after a blank line
+ return 0
+ end
+endfunction
diff --git a/runtime/indent/clojure.vim b/runtime/indent/clojure.vim
new file mode 100644
index 0000000..5bfbfbb
--- /dev/null
+++ b/runtime/indent/clojure.vim
@@ -0,0 +1,427 @@
+" Vim indent file
+" Language: Clojure
+" Maintainer: Alex Vear <alex@vear.uk>
+" Former Maintainers: Sung Pae <self@sungpae.com>
+" Meikel Brandmeyer <mb@kotka.de>
+" URL: https://github.com/clojure-vim/clojure.vim
+" License: Vim (see :h license)
+" Last Change: 2022-03-24
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+let b:undo_indent = 'setlocal autoindent< smartindent< expandtab< softtabstop< shiftwidth< indentexpr< indentkeys<'
+
+setlocal noautoindent nosmartindent
+setlocal softtabstop=2 shiftwidth=2 expandtab
+setlocal indentkeys=!,o,O
+
+if exists("*searchpairpos")
+
+ if !exists('g:clojure_maxlines')
+ let g:clojure_maxlines = 300
+ endif
+
+ if !exists('g:clojure_fuzzy_indent')
+ let g:clojure_fuzzy_indent = 1
+ endif
+
+ if !exists('g:clojure_fuzzy_indent_patterns')
+ let g:clojure_fuzzy_indent_patterns = ['^with', '^def', '^let']
+ endif
+
+ if !exists('g:clojure_fuzzy_indent_blacklist')
+ let g:clojure_fuzzy_indent_blacklist = ['-fn$', '\v^with-%(meta|out-str|loading-context)$']
+ endif
+
+ if !exists('g:clojure_special_indent_words')
+ let g:clojure_special_indent_words = 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn'
+ endif
+
+ if !exists('g:clojure_align_multiline_strings')
+ let g:clojure_align_multiline_strings = 0
+ endif
+
+ if !exists('g:clojure_align_subforms')
+ let g:clojure_align_subforms = 0
+ endif
+
+ function! s:syn_id_name()
+ return synIDattr(synID(line("."), col("."), 0), "name")
+ endfunction
+
+ 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:current_word()
+ return getline('.')[col('.')-1 : searchpos('\v>', 'n', line('.'))[1]-2]
+ endfunction
+
+ function! s:is_paren()
+ return s:current_char() =~# '\v[\(\)\[\]\{\}]' && !s:ignored_region()
+ endfunction
+
+ " Returns 1 if string matches a pattern in 'patterns', which should be
+ " a list of patterns.
+ function! s:match_one(patterns, string)
+ for pat in a:patterns
+ if a:string =~# pat | return 1 | endif
+ endfor
+ endfunction
+
+ 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 && g:clojure_maxlines > 0
+ let stopat = max([line(".") - g:clojure_maxlines, 0])
+ else
+ let stopat = a:stopat
+ endif
+
+ let pos = searchpairpos(a:open, '', a:close, 'bWn', "!s:is_paren()", stopat)
+ return [pos[0], col(pos)]
+ endfunction
+
+ 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
+ " closing one. In case the we are still in the string, we search for the
+ " opening ". If this is not found we take the indent of the line.
+ let nb = prevnonblank(v:lnum - 1)
+
+ if nb == 0
+ return -1
+ endif
+
+ call cursor(nb, 0)
+ call cursor(0, col("$") - 1)
+ if s:syn_id_name() !~? "string"
+ return -1
+ endif
+
+ " This will not work for a " in the first column...
+ if s:current_char() == '"'
+ call cursor(0, col("$") - 2)
+ if s:syn_id_name() !~? "string"
+ return -1
+ endif
+ if s:current_char() != '\'
+ return -1
+ endif
+ call cursor(0, col("$") - 1)
+ endif
+
+ let p = searchpos('\(^\|[^\\]\)\zs"', 'bW')
+
+ if p != [0, 0]
+ return p[1] - 1
+ endif
+
+ return indent(".")
+ endfunction
+
+ function! s:check_for_string()
+ let pos = getpos('.')
+ try
+ let val = s:clojure_check_for_string_worker()
+ finally
+ call setpos('.', pos)
+ endtry
+ return val
+ endfunction
+
+ function! s:strip_namespace_and_macro_chars(word)
+ return substitute(a:word, "\\v%(.*/|[#'`~@^,]*)(.*)", '\1', '')
+ endfunction
+
+ 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:current_char() == '('
+ return 0
+ endif
+ call cursor(a:position)
+
+ let next_paren = s:match_pairs('(', ')', 0)
+
+ " Special case: we are now at toplevel.
+ if next_paren == [0, 0]
+ return 0
+ endif
+ call cursor(next_paren)
+
+ call search('\S', 'W')
+ let w = s:strip_namespace_and_macro_chars(s:current_word())
+
+ if g:clojure_special_indent_words =~# '\V\<' . w . '\>'
+
+ " `letfn` is a special-special-case.
+ if w ==# 'letfn'
+ " Earlier code left the cursor at:
+ " (letfn [...] ...)
+ " ^
+
+ " Search and get coordinates of first `[`
+ " (letfn [...] ...)
+ " ^
+ call search('\[', 'W')
+ let pos = getcurpos()
+ let letfn_bracket = [pos[1], pos[2]]
+
+ " Move cursor to start of the form this function was
+ " initially called on. Grab the coordinates of the
+ " closest outer `[`.
+ call cursor(a:position)
+ let outer_bracket = s:match_pairs('\[', '\]', 0)
+
+ " If the located square brackets are not the same,
+ " don't use special-case formatting.
+ if outer_bracket != letfn_bracket
+ return 0
+ endif
+ endif
+
+ return 1
+ endif
+
+ return 0
+ endfunction
+
+ function! s:is_method_special_case(position)
+ let pos = getpos('.')
+ try
+ let val = s:clojure_is_method_special_case_worker(a:position)
+ finally
+ call setpos('.', pos)
+ endtry
+ return val
+ endfunction
+
+ " Check if form is a reader conditional, that is, it is prefixed by #?
+ " or #?@
+ function! s:is_reader_conditional_special_case(position)
+ return getline(a:position[0])[a:position[1] - 3 : a:position[1] - 2] == "#?"
+ \|| getline(a:position[0])[a:position[1] - 4 : a:position[1] - 2] == "#?@"
+ 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, 0]
+ endif
+
+ " We have to apply some heuristics here to figure out, whether to use
+ " normal lisp indenting or not.
+ let i = s:check_for_string()
+ if i > -1
+ return [0, i + !!g:clojure_align_multiline_strings]
+ endif
+
+ call cursor(0, 1)
+
+ " 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: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
+ 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
+ endif
+
+ " There are neither { nor [ nor (, ie. we are at the toplevel.
+ if paren == [0, 0]
+ return paren
+ endif
+
+ " Now we have to reimplement lispindent. This is surprisingly easy, as
+ " soon as one has access to syntax items.
+ "
+ " - Check whether we are in a special position after a word in
+ " g:clojure_special_indent_words. These are special cases.
+ " - Get the next keyword after the (.
+ " - If its first character is also a (, we have another sexp and align
+ " one column to the right of the unmatched (.
+ " - In case it is in lispwords, we indent the next line to the column of
+ " the ( + sw.
+ " - If not, we check whether it is last word in the line. In that case
+ " we again use ( + sw for indent.
+ " - In any other case we use the column of the end of the word + 2.
+ call cursor(paren)
+
+ 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
+ endif
+
+ " In case after the paren is a whitespace, we search for the next word.
+ call cursor(0, col('.') + 1)
+ 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
+ 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:current_word()
+ if s:bracket_type(w[0]) == 1
+ return paren
+ endif
+
+ " If the keyword begins with #, check if it is an anonymous
+ " function or set, in which case we indent by the shiftwidth
+ " (minus one if g:clojure_align_subforms = 1), or if it is
+ " ignored, in which case we use the ( position for indent.
+ if w[0] == "#"
+ " TODO: Handle #=() and other rare reader invocations?
+ if w[1] == '(' || w[1] == '{'
+ return [paren[0], paren[1] + (g:clojure_align_subforms ? 0 : &shiftwidth - 1)]
+ elseif w[1] == '_'
+ return paren
+ endif
+ 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:strip_namespace_and_macro_chars(w)
+
+ if &lispwords =~# '\V\<' . ww . '\>'
+ return [paren[0], paren[1] + &shiftwidth - 1]
+ endif
+
+ if g:clojure_fuzzy_indent
+ \ && !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[0], paren[1] + (g:clojure_align_subforms ? 0 : &shiftwidth - 1)]
+ endif
+
+ call search('\v\S', 'bW')
+ 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()
+
+else
+
+ " In case we have searchpairpos not available we fall back to
+ " normal lisp indenting.
+ setlocal indentexpr=
+ setlocal lisp
+ let b:undo_indent .= '| setlocal lisp<'
+
+endif
+
+let &cpo = s:save_cpo
+unlet! s:save_cpo
+
+" vim:sts=8:sw=8:ts=8:noet
diff --git a/runtime/indent/cmake.vim b/runtime/indent/cmake.vim
new file mode 100644
index 0000000..af27c0d
--- /dev/null
+++ b/runtime/indent/cmake.vim
@@ -0,0 +1,90 @@
+" Vim indent file
+" Language: CMake (ft=cmake)
+" Author: Andy Cedilnik <andy.cedilnik@kitware.com>
+" Maintainer: Dimitri Merejkowsky <d.merej@gmail.com>
+" Former Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com>
+" Last Change: 2022 Apr 06
+"
+" Licence: The CMake license applies to this file. See
+" https://cmake.org/licensing
+" This implies that distribution with Vim is allowed
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=CMakeGetIndent(v:lnum)
+setlocal indentkeys+==ENDIF(,ENDFOREACH(,ENDMACRO(,ELSE(,ELSEIF(,ENDWHILE(
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+if exists("*CMakeGetIndent")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+fun! CMakeGetIndent(lnum)
+ let this_line = getline(a:lnum)
+
+ " Find a non-blank line above the current line.
+ let lnum = a:lnum
+ let lnum = prevnonblank(lnum - 1)
+ let previous_line = getline(lnum)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ let or = '\|'
+ " Regular expressions used by line indentation function.
+ let cmake_regex_comment = '#.*'
+ let cmake_regex_identifier = '[A-Za-z][A-Za-z0-9_]*'
+ let cmake_regex_quoted = '"\([^"\\]\|\\.\)*"'
+ let cmake_regex_arguments = '\(' . cmake_regex_quoted .
+ \ or . '\$(' . cmake_regex_identifier . ')' .
+ \ or . '[^()\\#"]' . or . '\\.' . '\)*'
+
+ let cmake_indent_comment_line = '^\s*' . cmake_regex_comment
+ let cmake_indent_blank_regex = '^\s*$'
+ let cmake_indent_open_regex = '^\s*' . cmake_regex_identifier .
+ \ '\s*(' . cmake_regex_arguments .
+ \ '\(' . cmake_regex_comment . '\)\?$'
+
+ let cmake_indent_close_regex = '^' . cmake_regex_arguments .
+ \ ')\s*' .
+ \ '\(' . cmake_regex_comment . '\)\?$'
+
+ let cmake_indent_begin_regex = '^\s*\(IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\|FUNCTION\)\s*('
+ let cmake_indent_end_regex = '^\s*\(ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\|ENDFUNCTION\)\s*('
+
+ " Add
+ if previous_line =~? cmake_indent_comment_line " Handle comments
+ let ind = ind
+ else
+ if previous_line =~? cmake_indent_begin_regex
+ let ind = ind + shiftwidth()
+ endif
+ if previous_line =~? cmake_indent_open_regex
+ let ind = ind + shiftwidth()
+ endif
+ endif
+
+ " Subtract
+ if this_line =~? cmake_indent_end_regex
+ let ind = ind - shiftwidth()
+ endif
+ if previous_line =~? cmake_indent_close_regex
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfun
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/indent/cobol.vim b/runtime/indent/cobol.vim
new file mode 100644
index 0000000..01f7212
--- /dev/null
+++ b/runtime/indent/cobol.vim
@@ -0,0 +1,226 @@
+" Vim indent file
+" Language: cobol
+" Maintainer: Ankit Jain <ajatkj@yahoo.co.in>
+" (formerly Tim Pope <vimNOSPAM@tpope.info>)
+" $Id: cobol.vim,v 1.1 2007/05/05 18:08:19 vimboss Exp $
+" Last Update: By Ankit Jain on 22.03.2019
+" Ankit Jain 22.03.2019 Changes & fixes:
+" Allow chars in 1st 6 columns
+" #C22032019
+" Ankit Jain 24.09.2021 add b:undo_indent (request by tpope)
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal expandtab
+setlocal indentexpr=GetCobolIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+=0<*>,0/,0$,0=01,=~division,=~section,0=~end,0=~then,0=~else,0=~when,*<Return>,.
+
+let b:undo_indent = "setlocal expandtab< indentexpr< indentkeys<"
+
+" Only define the function once.
+if exists("*GetCobolIndent")
+ finish
+endif
+
+let s:skip = 'getline(".") =~ "^.\\{6\\}[*/$-]\\|\"[^\"]*\""'
+
+function! s:prevgood(lnum)
+ " Find a non-blank line above the current line.
+ " Skip over comments.
+ let lnum = a:lnum
+ while lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ let line = getline(lnum)
+ if line !~? '^\s*[*/$-]' && line !~? '^.\{6\}[*/$CD-]'
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function! s:stripped(lnum)
+ return substitute(strpart(getline(a:lnum),0,72),'^\s*','','')
+endfunction
+
+function! s:optionalblock(lnum,ind,blocks,clauses)
+ let ind = a:ind
+ let clauses = '\c\<\%(\<NOT\s\+\)\@<!\%(NOT\s\+\)\=\%('.a:clauses.'\)'
+ let begin = '\c-\@<!\<\%('.a:blocks.'\)\>'
+ let beginfull = begin.'\ze.*\%(\n\%(\s*\%([*/$-].*\)\=\n\)*\)\=\s*\%('.clauses.'\)'
+ let end = '\c\<end-\%('.a:blocks.'\)\>\|\%(\.\%( \|$\)\)\@='
+ let cline = s:stripped(a:lnum)
+ let line = s:stripped(s:prevgood(a:lnum))
+ if cline =~? clauses "&& line !~? '^search\>'
+ call cursor(a:lnum,1)
+ let lastclause = searchpair(beginfull,clauses,end,'bWr',s:skip)
+ if getline(lastclause) =~? clauses && s:stripped(lastclause) !~? '^'.begin
+ let ind = indent(lastclause)
+ elseif lastclause > 0
+ let ind = indent(lastclause) + shiftwidth()
+ "let ind = ind + shiftwidth()
+ endif
+ elseif line =~? clauses && cline !~? end
+ let ind = ind + shiftwidth()
+ endif
+ return ind
+endfunction
+
+function! GetCobolIndent(lnum) abort
+ let minshft = 6
+ let ashft = minshft + 1
+ let bshft = ashft + 4
+ " (Obsolete) numbered lines
+ " #C22032019: Columns 1-6 could have alphabets as well as numbers
+ "if getline(a:lnum) =~? '^\s*\d\{6\}\%($\|[ */$CD-]\)'
+ if getline(a:lnum) =~? '^\s*[a-zA-Z0-9]\{6\}\%($\|[ */$CD-]\)'
+ return 0
+ endif
+ let cline = s:stripped(a:lnum)
+ " Comments, etc. must start in the 7th column
+ if cline =~? '^[*/$-]'
+ return minshft
+ elseif cline =~# '^[CD]' && indent(a:lnum) == minshft
+ return minshft
+ endif
+ " Divisions, sections, and file descriptions start in area A
+ if cline =~? '\<\(DIVISION\|SECTION\)\%($\|\.\)' || cline =~? '^[FS]D\>'
+ return ashft
+ endif
+ " Fields
+ if cline =~? '^0*\(1\|77\)\>'
+ return ashft
+ endif
+ if cline =~? '^\d\+\>'
+ let cnum = matchstr(cline,'^\d\+\>')
+ let default = 0
+ let step = -1
+ while step < 2
+ let lnum = a:lnum
+ while lnum > 0 && lnum < line('$') && lnum > a:lnum - 500 && lnum < a:lnum + 500
+ let lnum = step > 0 ? nextnonblank(lnum + step) : prevnonblank(lnum + step)
+ let line = getline(lnum)
+ let lindent = indent(lnum)
+ if line =~? '^\s*\d\+\>'
+ let num = matchstr(line,'^\s*\zs\d\+\>')
+ if 0+cnum == num
+ return lindent
+ elseif 0+cnum > num && default < lindent + shiftwidth()
+ let default = lindent + shiftwidth()
+ endif
+ elseif lindent < bshft && lindent >= ashft
+ break
+ endif
+ endwhile
+ let step = step + 2
+ endwhile
+ return default ? default : bshft
+ endif
+ let lnum = s:prevgood(a:lnum)
+ " Hit the start of the file, use "zero" indent.
+ if lnum == 0
+ return ashft
+ endif
+ " Initial spaces are ignored
+ let line = s:stripped(lnum)
+ let ind = indent(lnum)
+ " Paragraphs. There may be some false positives.
+ if cline =~? '^\(\a[A-Z0-9-]*[A-Z0-9]\|\d[A-Z0-9-]*\a\)\.' "\s*$'
+ if cline !~? '^EXIT\s*\.' && line =~? '\.\s*$'
+ return ashft
+ endif
+ endif
+ " Paragraphs in the identification division.
+ "if cline =~? '^\(PROGRAM-ID\|AUTHOR\|INSTALLATION\|' .
+ "\ 'DATE-WRITTEN\|DATE-COMPILED\|SECURITY\)\>'
+ "return ashft
+ "endif
+ if line =~? '\.$'
+ " XXX
+ return bshft
+ endif
+ if line =~? '^PERFORM\>'
+ let perfline = substitute(line, '\c^PERFORM\s*', "", "")
+ if perfline =~? '^\%(\k\+\s\+TIMES\)\=\s*$'
+ let ind = ind + shiftwidth()
+ elseif perfline =~? '^\%(WITH\s\+TEST\|VARYING\|UNTIL\)\>.*[^.]$'
+ let ind = ind + shiftwidth()
+ endif
+ endif
+ if line =~? '^\%(IF\|THEN\|ELSE\|READ\|EVALUATE\|SEARCH\|SELECT\)\>'
+ 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')
+ if cline !~? '^AT\s\+END\>' || line !~? '^SEARCH\>'
+ let ind = s:optionalblock(a:lnum,ind,'DELETE\|REWRITE\|START\|WRITE\|READ','INVALID\s\+KEY\|AT\s\+END\|NO\s\+DATA\|AT\s\+END-OF-PAGE')
+ endif
+ if cline =~? '^WHEN\>'
+ call cursor(a:lnum,1)
+ " We also search for READ so that contained AT ENDs are skipped
+ let lastclause = searchpair('\c-\@<!\<\%(SEARCH\|EVALUATE\|READ\)\>','\c\<\%(WHEN\|AT\s\+END\)\>','\c\<END-\%(SEARCH\|EVALUATE\|READ\)\>','bW',s:skip)
+ let g:foo = s:stripped(lastclause)
+ if s:stripped(lastclause) =~? '\c\<\%(WHEN\|AT\s\+END\)\>'
+ "&& s:stripped(lastclause) !~? '^\%(SEARCH\|EVALUATE\|READ\)\>'
+ let ind = indent(lastclause)
+ elseif lastclause > 0
+ let ind = indent(lastclause) + shiftwidth()
+ endif
+ elseif line =~? '^WHEN\>'
+ let ind = ind + shiftwidth()
+ endif
+ "I'm not sure why I had this
+ "if line =~? '^ELSE\>-\@!' && line !~? '\.$'
+ "let ind = indent(s:prevgood(lnum))
+ "endif
+ if cline =~? '^\(END\)\>-\@!'
+ " On lines with just END, 'guess' a simple shift left
+ 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)
+ if match > 0
+ let ind = indent(match)
+ endif
+ elseif cline =~? '^END-[A-Z]'
+ let beginword = matchstr(cline,'\c\<END-\zs[A-Z0-9-]\+')
+ let endword = 'END-'.beginword
+ let first = 0
+ let suffix = '.*\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*'
+ if beginword =~? '^\%(ADD\|COMPUTE\|DIVIDE\|MULTIPLY\|SUBTRACT\)$'
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+SIZE\s\+ERROR'
+ let g:beginword = beginword
+ let first = 1
+ elseif beginword =~? '^\%(STRING\|UNSTRING\)$'
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+OVERFLOW'
+ let first = 1
+ elseif beginword =~? '^\%(ACCEPT\|DISPLAY\)$'
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+EXCEPTION'
+ let first = 1
+ elseif beginword ==? 'CALL'
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+\%(EXCEPTION\|OVERFLOW\)'
+ let first = 1
+ elseif beginword =~? '^\%(DELETE\|REWRITE\|START\|READ\|WRITE\)$'
+ let first = 1
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=\(INVALID\s\+KEY'
+ if beginword =~? '^READ'
+ let first = 0
+ let beginword = beginword . '\|AT\s\+END\|NO\s\+DATA'
+ elseif beginword =~? '^WRITE'
+ let beginword = beginword . '\|AT\s\+END-OF-PAGE'
+ endif
+ let beginword = beginword . '\)'
+ endif
+ call cursor(a:lnum,indent(a:lnum))
+ let match = searchpair('\c-\@<!\<'.beginword.'\>','','\c\<'.endword.'\>\zs','bnW'.(first? 'r' : ''),s:skip)
+ if match > 0
+ let ind = indent(match)
+ elseif cline =~? '^\(END-\(READ\|EVALUATE\|SEARCH\|PERFORM\)\)\>'
+ let ind = ind - shiftwidth()
+ endif
+ endif
+ return ind < bshft ? bshft : ind
+endfunction
diff --git a/runtime/indent/config.vim b/runtime/indent/config.vim
new file mode 100644
index 0000000..b840b1e
--- /dev/null
+++ b/runtime/indent/config.vim
@@ -0,0 +1,85 @@
+" Vim indent file
+" Language: Autoconf configure.{ac,in} file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 24 Sep 2021
+
+" TODO: how about nested [()]'s in one line what's wrong with '\\\@!'?
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/sh.vim " will set b:did_indent
+
+setlocal indentexpr=GetConfigIndent()
+setlocal indentkeys=!^F,o,O,=then,=do,=else,=elif,=esac,=fi,=fin,=fil,=done
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+" Only define the function once.
+if exists("*GetConfigIndent")
+ finish
+endif
+
+" get the offset (indent) of the end of the match of 'regexp' in 'line'
+function s:GetOffsetOf(line, regexp)
+ let end = matchend(a:line, a:regexp)
+ let width = 0
+ let i = 0
+ while i < end
+ if a:line[i] != "\t"
+ let width = width + 1
+ else
+ let width = width + &ts - (width % &ts)
+ endif
+ let i = i + 1
+ endwhile
+ return width
+endfunction
+
+function GetConfigIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " where to put this
+ let ind = GetShIndent()
+ let line = getline(lnum)
+
+ " if previous line has unmatched, unescaped opening parentheses,
+ " indent to its position. TODO: not failsafe if multiple ('s
+ if line =~ '\\\@<!([^)]*$'
+ let ind = s:GetOffsetOf(line, '\\\@!(')
+ endif
+
+ " if previous line has unmatched opening bracket,
+ " indent to its position. TODO: same as above
+ if line =~ '\[[^]]*$'
+ let ind = s:GetOffsetOf(line, '\[')
+ endif
+
+ " if previous line had an unmatched closing parentheses,
+ " indent to the matching opening parentheses
+ if line =~ '[^(]\+\\\@<!)$'
+ call search(')', 'bW')
+ let lnum = searchpair('\\\@<!(', '', ')', 'bWn')
+ let ind = indent(lnum)
+ endif
+
+ " if previous line had an unmatched closing bracket,
+ " indent to the matching opening bracket
+ if line =~ '[^[]\+]$'
+ call search(']', 'bW')
+ let lnum = searchpair('\[', '', ']', 'bWn')
+ let ind = indent(lnum)
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/context.vim b/runtime/indent/context.vim
new file mode 100644
index 0000000..762c5c1
--- /dev/null
+++ b/runtime/indent/context.vim
@@ -0,0 +1,65 @@
+vim9script
+
+# Language: ConTeXt typesetting engine
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2022 Aug 12
+
+if exists("b:did_indent")
+ finish
+endif
+
+# Load MetaPost indentation script (this will also set b:did_indent)
+runtime! indent/mp.vim
+
+setlocal indentexpr=ConTeXtIndent()
+
+b:undo_indent = "setl indentexpr<"
+
+def PrevNotComment(l: number): number
+ var prevlnum = prevnonblank(l)
+
+ while prevlnum > 0 && getline(prevlnum) =~# '^\s*%'
+ prevlnum = prevnonblank(prevlnum - 1)
+ endwhile
+
+ return prevlnum
+enddef
+
+def FindPair(pstart: string, pmid: string, pend: string): number
+ cursor(v:lnum, 1)
+ return indent(searchpair(pstart, pmid, pend, 'bWn',
+ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+enddef
+
+def ConTeXtIndent(): number
+ # Use MetaPost rules inside MetaPost graphic environments
+ if len(synstack(v:lnum, 1)) > 0 &&
+ synIDattr(synstack(v:lnum, 1)[0], "name") ==# 'contextMPGraphic'
+ return g:MetaPostIndent()
+ endif
+
+ const prevlnum = PrevNotComment(v:lnum - 1)
+ const prevind = indent(prevlnum)
+ const prevline = getline(prevlnum)
+ const currline = getline(v:lnum)
+
+ # If the current line starts with ], match indentation.
+ if currline =~# '^\s*\]'
+ return FindPair('\[', '', '\]')
+ endif
+
+ # If the current line starts with }, match indentation.
+ if currline =~# '^\s*}'
+ return FindPair('{', '', '}')
+ endif
+
+ # If the previous line ends with [ or { (possibly followed by a comment) then indent.
+ if prevline =~# '[{[]\s*\%(%.*\)\=$'
+ return prevind + shiftwidth()
+ endif
+
+ return -1
+enddef
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/indent/cpp.vim b/runtime/indent/cpp.vim
new file mode 100644
index 0000000..ffa37d7
--- /dev/null
+++ b/runtime/indent/cpp.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: C++
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2008 Nov 29
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" C++ indenting is built-in, thus this is very simple
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/runtime/indent/cs.vim b/runtime/indent/cs.vim
new file mode 100644
index 0000000..acc3ba7
--- /dev/null
+++ b/runtime/indent/cs.vim
@@ -0,0 +1,75 @@
+" Vim indent file
+" Language: C#
+" Maintainer: Nick Jensen <nickspoon@gmail.com>
+" Former Maintainers: Aquila Deus
+" Johannes Zellner <johannes@zellner.org>
+" Last Change: 2020-03-26
+" License: Vim (see :h license)
+" Repository: https://github.com/nickspoons/vim-cs
+
+if exists('b:did_indent')
+ finish
+endif
+let b:did_indent = 1
+
+let s:save_cpo = &cpoptions
+set cpoptions&vim
+
+
+setlocal indentexpr=GetCSIndent(v:lnum)
+
+function! s:IsCompilerDirective(line)
+ " Exclude #region and #endregion - these should be indented normally
+ return a:line =~# '^\s*#' && !s:IsRegionDirective(a:line)
+endf
+
+function! s:IsRegionDirective(line)
+ return a:line =~# '^\s*#\s*region' || a:line =~# '^\s*#\s*endregion'
+endf
+
+function! s:IsAttributeLine(line)
+ return a:line =~# '^\s*\[[A-Za-z]' && a:line =~# '\]$'
+endf
+
+function! s:FindPreviousNonCompilerDirectiveLine(start_lnum)
+ for delta in range(0, a:start_lnum)
+ let lnum = a:start_lnum - delta
+ let line = getline(lnum)
+ if !s:IsCompilerDirective(line) && !s:IsRegionDirective(line)
+ return lnum
+ endif
+ endfor
+ return 0
+endf
+
+function! GetCSIndent(lnum) abort
+ " Hit the start of the file, use zero indent.
+ if a:lnum == 0
+ return 0
+ endif
+
+ let this_line = getline(a:lnum)
+
+ " Compiler directives use zero indent if so configured.
+ let is_first_col_macro = s:IsCompilerDirective(this_line) && stridx(&l:cinkeys, '0#') >= 0
+ if is_first_col_macro
+ return cindent(a:lnum)
+ endif
+
+ let lnum = s:FindPreviousNonCompilerDirectiveLine(a:lnum - 1)
+ let previous_code_line = getline(lnum)
+ if s:IsAttributeLine(previous_code_line)
+ return indent(lnum)
+ elseif s:IsRegionDirective(this_line)
+ return cindent(lnum)
+ else
+ return cindent(a:lnum)
+ endif
+endfunction
+
+let b:undo_indent = 'setlocal indentexpr<'
+
+let &cpoptions = s:save_cpo
+unlet s:save_cpo
+
+" vim:et:sw=2:sts=2
diff --git a/runtime/indent/css.vim b/runtime/indent/css.vim
new file mode 100644
index 0000000..793f058
--- /dev/null
+++ b/runtime/indent/css.vim
@@ -0,0 +1,86 @@
+" Vim indent file
+" Language: CSS
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 24 Sep 2021
+
+" Use of shiftwidth() added by Oleg Zubchenko.
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetCSSIndent()
+setlocal indentkeys=0{,0},!^F,o,O
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetCSSIndent")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+function s:prevnonblanknoncomment(lnum)
+ let lnum = a:lnum
+ while lnum > 1
+ let lnum = prevnonblank(lnum)
+ let line = getline(lnum)
+ if line =~ '\*/'
+ while lnum > 1 && line !~ '/\*'
+ let lnum -= 1
+ endwhile
+ if line =~ '^\s*/\*'
+ let lnum -= 1
+ else
+ break
+ endif
+ else
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function s:count_braces(lnum, count_open)
+ let n_open = 0
+ let n_close = 0
+ let line = getline(a:lnum)
+ let pattern = '[{}]'
+ let i = match(line, pattern)
+ while i != -1
+ if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
+ if line[i] == '{'
+ let n_open += 1
+ elseif line[i] == '}'
+ if n_open > 0
+ let n_open -= 1
+ else
+ let n_close += 1
+ endif
+ endif
+ endif
+ let i = match(line, pattern, i + 1)
+ endwhile
+ return a:count_open ? n_open : n_close
+endfunction
+
+function GetCSSIndent()
+ let line = getline(v:lnum)
+ if line =~ '^\s*\*'
+ return cindent(v:lnum)
+ endif
+
+ let pnum = s:prevnonblanknoncomment(v:lnum - 1)
+ if pnum == 0
+ return 0
+ endif
+
+ return indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
+ \ - s:count_braces(v:lnum, 0) * shiftwidth()
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/indent/cucumber.vim b/runtime/indent/cucumber.vim
new file mode 100644
index 0000000..ad28a67
--- /dev/null
+++ b/runtime/indent/cucumber.vim
@@ -0,0 +1,75 @@
+" Vim indent file
+" Language: Cucumber
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2017 Jun 13
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetCucumberIndent()
+setlocal indentkeys=o,O,*<Return>,<:>,0<Bar>,0#,=,!^F
+
+let b:undo_indent = 'setl ai< inde< indk<'
+
+" Only define the function once.
+if exists("*GetCucumberIndent")
+ finish
+endif
+
+function! s:syn(lnum)
+ return synIDattr(synID(a:lnum,1+indent(a:lnum),1),'name')
+endfunction
+
+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))
+ if csyn ==# 'cucumberFeature' || cline =~# '^\s*Feature:'
+ " feature heading
+ return 0
+ elseif csyn ==# 'cucumberExamples' || cline =~# '^\s*\%(Examples\|Scenarios\):'
+ " examples heading
+ return 2 * sw
+ elseif csyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || cline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):'
+ " background, scenario or outline heading
+ return sw
+ elseif syn ==# 'cucumberFeature' || line =~# '^\s*Feature:'
+ " line after feature heading
+ return sw
+ elseif syn ==# 'cucumberExamples' || line =~# '^\s*\%(Examples\|Scenarios\):'
+ " line after examples heading
+ 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
+ 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
+ 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
+ elseif cline =~# '^\s*[^|]' && line =~# '^\s*|'
+ " line after a table, relative unindent
+ 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
+ endif
+ return indent(prevnonblank(v:lnum-1))
+endfunction
+
+" vim:set sts=2 sw=2:
diff --git a/runtime/indent/cuda.vim b/runtime/indent/cuda.vim
new file mode 100644
index 0000000..68ee9ce
--- /dev/null
+++ b/runtime/indent/cuda.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: CUDA
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2008 Nov 29
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" It's just like C indenting
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/runtime/indent/d.vim b/runtime/indent/d.vim
new file mode 100644
index 0000000..80c9a2f
--- /dev/null
+++ b/runtime/indent/d.vim
@@ -0,0 +1,24 @@
+" Vim indent file for the D programming language (version 0.137).
+" Language: D
+" Maintainer: Jason Mills <jmills@cs.mun.ca> (Invalid email address)
+" Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Apr 06
+" Version: 0.1
+"
+" Please email me with bugs, comments, and suggestion. Put vim in the subject
+" to ensure the email will not be marked has spam.
+"
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+" D indenting is a lot like the built-in C indenting.
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
+
+" vim: ts=8 noet
diff --git a/runtime/indent/dictconf.vim b/runtime/indent/dictconf.vim
new file mode 100644
index 0000000..fa40585
--- /dev/null
+++ b/runtime/indent/dictconf.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: dict(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2022 Apr 06
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys=0{,0},!^F,o,O cinwords= autoindent smartindent
+setlocal nosmartindent
+inoremap <buffer> # X#
+
+let b:undo_indent = "setl ai< cinw< indk< si< | silent! iunmap <buffer> #"
diff --git a/runtime/indent/dictdconf.vim b/runtime/indent/dictdconf.vim
new file mode 100644
index 0000000..5c0e7c5
--- /dev/null
+++ b/runtime/indent/dictdconf.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: dictd(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys=0{,0},!^F,o,O cinwords= autoindent smartindent
+setlocal nosmartindent
+inoremap <buffer> # X#
+
+let b:undo_indent = "setl ai< cinw< indk< si< | silent! iunmap <buffer> #"
diff --git a/runtime/indent/docbk.vim b/runtime/indent/docbk.vim
new file mode 100644
index 0000000..d8661ff
--- /dev/null
+++ b/runtime/indent/docbk.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: DocBook Documentation Format
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:did_indent")
+ finish
+endif
+
+" Same as XML indenting for now.
+runtime! indent/xml.vim
+
+if exists('*XmlIndentGet')
+ setlocal indentexpr=XmlIndentGet(v:lnum,0)
+endif
diff --git a/runtime/indent/dosbatch.vim b/runtime/indent/dosbatch.vim
new file mode 100644
index 0000000..d24b139
--- /dev/null
+++ b/runtime/indent/dosbatch.vim
@@ -0,0 +1,61 @@
+" 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: 2021-10-18
+" 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=)
+
+let b:undo_indent = "setl ai< inde< indk< si<"
+
+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
new file mode 100644
index 0000000..9fca296
--- /dev/null
+++ b/runtime/indent/dtd.vim
@@ -0,0 +1,334 @@
+" Vim indent file
+" Language: DTD (Document Type Definition for XML)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 24 Sep 2021
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetDTDIndent()
+setlocal indentkeys=!^F,o,O,>
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+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:]]\+'
+
+function s:lex1(input, start, ...)
+ let pattern = a:0 > 0 ? a:1 : s:token_pattern
+ let start = matchend(a:input, '^\_s*', a:start)
+ if start == -1
+ return ["", a:start]
+ endif
+ let end = matchend(a:input, pattern, start)
+ if end == -1
+ return ["", a:start]
+ endif
+ let token = strpart(a:input, start, end - start)
+ return [token, end]
+endfunction
+
+function s:lex(input, start, ...)
+ let pattern = a:0 > 0 ? a:1 : s:token_pattern
+ let info = s:lex1(a:input, a:start, pattern)
+ while info[0] == '--'
+ let info = s:lex1(a:input, info[1], pattern)
+ while info[0] != "" && info[0] != '--'
+ let info = s:lex1(a:input, info[1], pattern)
+ endwhile
+ if info[0] == ""
+ return info
+ endif
+ let info = s:lex1(a:input, info[1], pattern)
+ endwhile
+ return info
+endfunction
+
+function s:indent_to_innermost_parentheses(line, end)
+ let token = '('
+ let end = a:end
+ let parentheses = [end - 1]
+ while token != ""
+ let [token, end] = s:lex(a:line, end, '^\%([(),|]\|[A-Za-z0-9_-]\+\|#P\=CDATA\|%[A-Za-z0-9_-]\+;\)[?*+]\=')
+ if token[0] == '('
+ call add(parentheses, end - 1)
+ elseif token[0] == ')'
+ if len(parentheses) == 1
+ return [-1, end]
+ endif
+ call remove(parentheses, -1)
+ endif
+ endwhile
+ return [parentheses[-1] - strridx(a:line, "\n", parentheses[-1]), end]
+endfunction
+
+" TODO: Line and end could be script global (think OO members).
+function GetDTDIndent()
+ if v:lnum == 1
+ return 0
+ endif
+
+ " Begin by searching back for a <! that isn’t inside a comment.
+ " From here, depending on what follows immediately after, parse to
+ " where we’re at to determine what to do.
+ if search('<!', 'bceW') == 0
+ return indent(v:lnum - 1)
+ endif
+ let lnum = line('.')
+ let col = col('.')
+ let indent = indent('.')
+ let line = lnum == v:lnum ? getline(lnum) : join(getline(lnum, v:lnum - 1), "\n")
+
+ let [declaration, end] = s:lex1(line, col)
+ if declaration == ""
+ 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
+ " 'comments' and 'autoindent'. Otherwise, indent to the first lines level.
+ while declaration != ""
+ let [declaration, end] = s:lex(line, end)
+ if declaration == "-->"
+ return indent
+ endif
+ endwhile
+ return -1
+ elseif declaration == 'ELEMENT'
+ " Check for element name. If none exists, indent one level.
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ return indent + shiftwidth()
+ endif
+
+ " Check for token following element name. This can be a specification of
+ " whether the start or end tag may be omitted. If nothing is found, indent
+ " one level.
+ let [token, end] = s:lex(line, end, '^\%([-O(]\|ANY\|EMPTY\)')
+ let n = 0
+ while token =~ '[-O]' && n < 2
+ let [token, end] = s:lex(line, end, '^\%([-O(]\|ANY\|EMPTY\)')
+ let n += 1
+ endwhile
+ if token == ""
+ return indent + shiftwidth()
+ endif
+
+ " Next comes the content model. If the token we’ve found isn’t a
+ " parenthesis it must be either ANY, EMPTY or some random junk. Either
+ " way, we’re done indenting this element, so set it to that of the first
+ " line so that the terminating “>” winds up having the same indentation.
+ if token != '('
+ return indent
+ endif
+
+ " Now go through the content model. We need to keep track of the nesting
+ " of parentheses. As soon as we hit 0 we’re done. If that happens we must
+ " have a complete content model. Thus set indentation to be the same as that
+ " of the first line so that the terminating “>” winds up having the same
+ " indentation. Otherwise, we’ll indent to the innermost parentheses not yet
+ " matched.
+ let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end)
+ if indent_of_innermost != -1
+ return indent_of_innermost
+ endif
+
+ " Finally, look for any additions and/or exceptions to the content model.
+ " This is defined by a “+” or “-” followed by another content model
+ " declaration.
+ " TODO: Can the “-” be separated by whitespace from the “(”?
+ let seen = { '+(': 0, '-(': 0 }
+ while 1
+ let [additions_exceptions, end] = s:lex(line, end, '^[+-](')
+ if additions_exceptions != '+(' && additions_exceptions != '-('
+ let [token, end] = s:lex(line, end)
+ if token == '>'
+ 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 + shiftwidth())
+ endif
+
+ " If we’ve seen an addition or exception already and this is of the same
+ " kind, the user is writing a broken DTD. Time to bail.
+ if seen[additions_exceptions]
+ return indent
+ endif
+ let seen[additions_exceptions] = 1
+
+ let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end)
+ if indent_of_innermost != -1
+ return indent_of_innermost
+ endif
+ endwhile
+ elseif declaration == 'ATTLIST'
+ " Check for element name. If none exists, indent one level.
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ return indent + shiftwidth()
+ endif
+
+ " Check for any number of attributes.
+ while 1
+ " Check for attribute name. If none exists, indent one level, unless the
+ " current line is a lone “>”, in which case we indent to the same level
+ " as the first line. Otherwise, if the attribute name is “>”, we have
+ " actually hit the end of the attribute list, in which case we indent to
+ " the same level as the first line.
+ 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 + shiftwidth())
+ elseif name == ">"
+ return indent
+ endif
+
+ " Check for attribute value declaration. If none exists, indent two
+ " levels. Otherwise, if it’s an enumerated value, check for nested
+ " parentheses and indent to the innermost one if we don’t reach the end
+ " of the listc. Otherwise, just continue with looking for the default
+ " attribute value.
+ " TODO: Do validation of keywords
+ " (CDATA|NMTOKEN|NMTOKENS|ID|IDREF|IDREFS|ENTITY|ENTITIES)?
+ let [value, end] = s:lex(line, end, '^\%((\|[^[:space:]]\+\)')
+ if value == ""
+ 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 + shiftwidth() * 3
+ endif
+ endif
+
+ if value == '('
+ let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end)
+ if indent_of_innermost != -1
+ return indent_of_innermost
+ endif
+ endif
+
+ " Finally look for the attribute’s default value. If non exists, indent
+ " two levels.
+ let [default, end] = s:lex(line, end, '^\%("\_[^"]*"\|#\(REQUIRED\|IMPLIED\|FIXED\)\)')
+ if default == ""
+ 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 + shiftwidth() * 3
+ endif
+ endif
+ endwhile
+ elseif declaration == 'ENTITY'
+ " Check for entity name. If none exists, indent one level. Otherwise, if
+ " the name actually turns out to be a percent sign, “%”, this is a
+ " parameter entity. Read another token to determine the entity name and,
+ " again, if none exists, indent one level.
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ return indent + shiftwidth()
+ elseif name == '%'
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ return indent + shiftwidth()
+ endif
+ endif
+
+ " Now check for the entity value. If none exists, indent one level. If it
+ " does exist, indent to same level as first line, as we’re now done with
+ " this entity.
+ "
+ " The entity value can be a string in single or double quotes (no escapes
+ " to worry about, as entities are used instead). However, it can also be
+ " that this is an external unparsed entity. In that case we have to look
+ " further for (possibly) a public ID and an URI followed by the NDATA
+ " keyword and the actual notation name. For the public ID and URI, indent
+ " two levels, if they don’t exist. If the NDATA keyword doesn’t exist,
+ " indent one level. Otherwise, if the actual notation name doesn’t exist,
+ " indent two level. If it does, indent to same level as first line, as
+ " we’re now done with this entity.
+ let [value, end] = s:lex(line, end)
+ if value == ""
+ return indent + shiftwidth()
+ elseif value == 'SYSTEM' || value == 'PUBLIC'
+ let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
+ if quoted_string == ""
+ return indent + shiftwidth() * 2
+ endif
+
+ if value == 'PUBLIC'
+ let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
+ if quoted_string == ""
+ return indent + shiftwidth() * 2
+ endif
+ endif
+
+ let [ndata, end] = s:lex(line, end)
+ if ndata == ""
+ return indent + shiftwidth()
+ endif
+
+ let [name, end] = s:lex(line, end)
+ return name == "" ? (indent + shiftwidth() * 2) : indent
+ else
+ return indent
+ endif
+ elseif declaration == 'NOTATION'
+ " Check for notation name. If none exists, indent one level.
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ 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 + shiftwidth()
+ elseif id == 'SYSTEM' || id == 'PUBLIC'
+ let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
+ if quoted_string == ""
+ 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 + shiftwidth() * 2)
+ elseif quoted_string == '>'
+ return indent
+ endif
+ endif
+ endif
+
+ return indent
+ endif
+
+ " TODO: Processing directives could be indented I suppose. But perhaps it’s
+ " just as well to let the user decide how to indent them (perhaps extending
+ " this function to include proper support for whatever processing directive
+ " language they want to use).
+
+ " Conditional sections are simply passed along to let Vim decide what to do
+ " (and hence the user).
+ return -1
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/dtrace.vim b/runtime/indent/dtrace.vim
new file mode 100644
index 0000000..e41d398
--- /dev/null
+++ b/runtime/indent/dtrace.vim
@@ -0,0 +1,17 @@
+" Vim indent file
+" Language: D script as described in "Solaris Dynamic Tracing Guide",
+" http://docs.sun.com/app/docs/doc/817-6223
+" Last Change: 2008/03/20
+" Version: 1.2
+" Maintainer: Nicolas Weber <nicolasweber@gmx.de>
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Built-in C indenting works nicely for dtrace.
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/runtime/indent/dune.vim b/runtime/indent/dune.vim
new file mode 100644
index 0000000..0590d66
--- /dev/null
+++ b/runtime/indent/dune.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: dune
+" Maintainers: Markus Mottl <markus.mottl@gmail.com>
+" URL: https://github.com/ocaml/vim-ocaml
+" Last Change: 2021 Jan 01
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" dune format-dune-file uses 1 space to indent
+setlocal softtabstop=1 shiftwidth=1 expandtab
diff --git a/runtime/indent/dylan.vim b/runtime/indent/dylan.vim
new file mode 100644
index 0000000..e2a6d10
--- /dev/null
+++ b/runtime/indent/dylan.vim
@@ -0,0 +1,94 @@
+" Vim indent file
+" Language: Dylan
+" Maintainer: Brent A. Fulgham <bfulgham@debian.org> (Invalid email address)
+" Doug Kearns <dougkearns@gmail.com>
+" Version: 0.01
+" Last Change: 2022 Apr 06
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys+==~begin,=~block,=~case,=~cleanup,=~define,=~end,=~else,=~elseif,=~exception,=~for,=~finally,=~if,=~otherwise,=~select,=~unless,=~while
+
+" Define the appropriate indent function but only once
+setlocal indentexpr=DylanGetIndent()
+
+let b:undo_indent = "setl inde< indk<"
+
+if exists("*DylanGetIndent")
+ finish
+endif
+
+function DylanGetIndent()
+ " Get the line to be indented
+ let cline = getline(v:lnum)
+
+ " Don't reindent comments on first column
+ if cline =~ '^/\[/\*]'
+ return 0
+ endif
+
+ "Find the previous non-blank line
+ let lnum = prevnonblank(v:lnum - 1)
+ "Use zero indent at the top of the file
+ if lnum == 0
+ return 0
+ endif
+
+ let prevline=getline(lnum)
+ let ind = indent(lnum)
+ let chg = 0
+
+ " If previous line was a comment, use its indent
+ if prevline =~ '^\s*//'
+ return ind
+ endif
+
+ " 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 = shiftwidth()
+ " local methods indent the shift-width, plus 6 for the 'local'
+ elseif prevline =~? '^\s*local'
+ let chg = shiftwidth() + 6
+ " If previous line was a let with no closing semicolon, indent
+ elseif prevline =~? '^\s*let.*[^;]\s*$'
+ let chg = shiftwidth()
+ " If previous line opened a parenthesis, and did not close it, indent
+ elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+ return = match( prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
+ "elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+ elseif prevline =~ '^[^(]*)\s*$'
+ " This line closes a parenthesis. Find opening
+ let curr_line = prevnonblank(lnum - 1)
+ while curr_line >= 0
+ let str = getline(curr_line)
+ if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+ let curr_line = prevnonblank(curr_line - 1)
+ else
+ break
+ endif
+ endwhile
+ if curr_line < 0
+ return -1
+ endif
+ let ind = indent(curr_line)
+ " Although we found the closing parenthesis, make sure this
+ " 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 = 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 - shiftwidth()
+ endif
+
+ return ind + chg
+endfunction
+
+" vim:sw=2 tw=130
diff --git a/runtime/indent/eiffel.vim b/runtime/indent/eiffel.vim
new file mode 100644
index 0000000..d7667a8
--- /dev/null
+++ b/runtime/indent/eiffel.vim
@@ -0,0 +1,115 @@
+" Vim indent file
+" Language: Eiffel
+" Maintainer: Jocelyn Fiat <jfiat@eiffel.com>
+" Previous-Maintainer: David Clarke <gadicath@dishevelled.net>
+" Contributions from: Takuya Fujiwara
+" Contributions from: Thilo Six
+" $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.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetEiffelIndent()
+setlocal nolisp
+setlocal nosmartindent
+setlocal nocindent
+setlocal autoindent
+setlocal comments=:--
+setlocal indentkeys+==end,=else,=ensure,=require,=check,=loop,=until
+setlocal indentkeys+==creation,=feature,=inherit,=class,=is,=redefine,=rename,=variant
+setlocal indentkeys+==invariant,=do,=local,=export
+
+let b:undo_indent = "setl smartindent< indentkeys< indentexpr< autoindent< comments< "
+
+" 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\|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*\(--\).*\)\=$'
+let s:inheritance_dent = '\s*\(redefine\|rename\|export\)\>'
+
+
+" Only define the function once.
+if exists("*GetEiffelIndent")
+ finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+function GetEiffelIndent()
+
+ " Eiffel Class indenting
+ "
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " trust the user's indenting
+ if getline(lnum) =~ s:trust_user_indent
+ return -1
+ endif
+
+ " Add a 'shiftwidth' after lines that start with an indent word
+ let ind = indent(lnum)
+ if getline(lnum) =~ s:relative_indent
+ 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 = shiftwidth()
+ endif
+
+ " Indent to double indent
+ if getline(v:lnum) =~ s:inheritance_dent
+ let ind = 2 * shiftwidth()
+ endif
+
+ " Indent line after the first line of the function definition
+ if getline(lnum) =~ s:single_dent
+ let ind = ind + shiftwidth()
+ endif
+
+ " The following should always be at the start of a line, no indenting
+ if getline(v:lnum) =~ s:no_indent
+ let ind = 0
+ endif
+
+ " Subtract a 'shiftwidth', if this isn't the first thing after the 'is'
+ " 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 - shiftwidth()
+ endif
+
+ " Subtract a shiftwidth for end statements
+ if getline(v:lnum) =~ '^\s*end\>'
+ 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 == shiftwidth()
+ let ind = 0
+ endif
+
+ return ind
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:sw=2
diff --git a/runtime/indent/elm.vim b/runtime/indent/elm.vim
new file mode 100644
index 0000000..7b08de7
--- /dev/null
+++ b/runtime/indent/elm.vim
@@ -0,0 +1,116 @@
+" Elm indent plugin file
+" Language: Elm
+" Maintainer: Andreas Scharf <as@99n.de>
+" Original Author: Joseph Hager <ajhager@gmail.com>
+" Copyright: Joseph Hager <ajhager@gmail.com>
+" License: BSD3
+" Latest Revision: 2021-09-29
+
+" Only load this indent file when no other was loaded.
+if exists('b:did_indent')
+ finish
+endif
+let b:did_indent = 1
+
+" Local defaults
+setlocal expandtab
+setlocal indentexpr=GetElmIndent()
+setlocal indentkeys+=0=else,0=if,0=of,0=import,0=then,0=type,0\|,0},0\],0),=-},0=in
+setlocal nolisp
+setlocal nosmartindent
+
+let b:undo_indent = "setl et< inde< indk< lisp< si<"
+
+" Only define the function once.
+if exists('*GetElmIndent')
+ finish
+endif
+
+" Indent pairs
+function! s:FindPair(pstart, pmid, pend)
+ "call search(a:pend, 'bW')
+ return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+endfunction
+
+function! GetElmIndent()
+ let l:lnum = v:lnum - 1
+
+ " Ident 0 if the first line of the file:
+ if l:lnum == 0
+ return 0
+ endif
+
+ let l:ind = indent(l:lnum)
+ let l:lline = getline(l:lnum)
+ let l:line = getline(v:lnum)
+
+ " Indent if current line begins with '}':
+ if l:line =~? '^\s*}'
+ return s:FindPair('{', '', '}')
+
+ " Indent if current line begins with 'else':
+ elseif l:line =~# '^\s*else\>'
+ if l:lline !~# '^\s*\(if\|then\)\>'
+ return s:FindPair('\<if\>', '', '\<else\>')
+ endif
+
+ " Indent if current line begins with 'then':
+ elseif l:line =~# '^\s*then\>'
+ if l:lline !~# '^\s*\(if\|else\)\>'
+ return s:FindPair('\<if\>', '', '\<then\>')
+ endif
+
+ " HACK: Indent lines in case with nearest case clause:
+ elseif l:line =~# '->' && l:line !~# ':' && l:line !~# '\\'
+ return indent(search('^\s*case', 'bWn')) + &shiftwidth
+
+ " HACK: Don't change the indentation if the last line is a comment.
+ elseif l:lline =~# '^\s*--'
+ return l:ind
+
+ " Align the end of block comments with the start
+ elseif l:line =~# '^\s*-}'
+ return indent(search('{-', 'bWn'))
+
+ " Indent double shift after let with an empty rhs
+ elseif l:lline =~# '\<let\>.*\s=$'
+ return l:ind + 4 + &shiftwidth
+
+ " Align 'in' with the parent let.
+ elseif l:line =~# '^\s*in\>'
+ return indent(search('^\s*let', 'bWn'))
+
+ " Align bindings with the parent let.
+ elseif l:lline =~# '\<let\>'
+ return l:ind + 4
+
+ " Align bindings with the parent in.
+ elseif l:lline =~# '^\s*in\>'
+ return l:ind
+
+ endif
+
+ " Add a 'shiftwidth' after lines ending with:
+ if l:lline =~# '\(|\|=\|->\|<-\|(\|\[\|{\|\<\(of\|else\|if\|then\)\)\s*$'
+ let l:ind = l:ind + &shiftwidth
+
+ " Add a 'shiftwidth' after lines starting with type ending with '=':
+ elseif l:lline =~# '^\s*type' && l:line =~# '^\s*='
+ let l:ind = l:ind + &shiftwidth
+
+ " Back to normal indent after comments:
+ elseif l:lline =~# '-}\s*$'
+ call search('-}', 'bW')
+ let l:ind = indent(searchpair('{-', '', '-}', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"'))
+
+ " Ident some operators if there aren't any starting the last line.
+ elseif l:line =~# '^\s*\(!\|&\|(\|`\|+\||\|{\|[\|,\)=' && l:lline !~# '^\s*\(!\|&\|(\|`\|+\||\|{\|[\|,\)=' && l:lline !~# '^\s*$'
+ let l:ind = l:ind + &shiftwidth
+
+ elseif l:lline ==# '' && getline(l:lnum - 1) !=# ''
+ let l:ind = indent(search('^\s*\S+', 'bWn'))
+
+ endif
+
+ return l:ind
+endfunc
diff --git a/runtime/indent/erlang.vim b/runtime/indent/erlang.vim
new file mode 100644
index 0000000..7aa3858
--- /dev/null
+++ b/runtime/indent/erlang.vim
@@ -0,0 +1,1536 @@
+" Vim indent file
+" Language: Erlang (http://www.erlang.org)
+" Author: Csaba Hoch <csaba.hoch@gmail.com>
+" Contributors: Edwin Fine <efine145_nospam01 at usa dot net>
+" Pawel 'kTT' Salata <rockplayer.pl@gmail.com>
+" Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
+" Last Update: 2022-Sep-06
+" License: Vim license
+" URL: https://github.com/vim-erlang/vim-erlang-runtime
+
+" Note About Usage:
+" This indentation script works best with the Erlang syntax file created by
+" Kreąimir Marľić (Kresimir Marzic) and maintained by Csaba Hoch.
+
+" Notes About Implementation:
+"
+" - LTI = Line to indent.
+" - The index of the first line is 1, but the index of the first column is 0.
+
+
+" Initialization {{{1
+" ==============
+
+" Only load this indent file when no other was loaded
+" Vim 7 or later is needed
+if exists("b:did_indent") || version < 700
+ finish
+else
+ let b:did_indent = 1
+endif
+
+setlocal indentexpr=ErlangIndent()
+setlocal indentkeys+=0=end,0=of,0=catch,0=after,0=else,0=when,0=),0=],0=},0=>>
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the functions once
+if exists("*ErlangIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Logging library {{{1
+" ===============
+
+" Purpose:
+" Logs the given string using the ErlangIndentLog function if it exists.
+" Parameters:
+" s: string
+function! s:Log(s)
+ if exists("*ErlangIndentLog")
+ call ErlangIndentLog(a:s)
+ endif
+endfunction
+
+" Line tokenizer library {{{1
+" ======================
+
+" Indtokens are "indentation tokens". See their exact format in the
+" documentation of the s:GetTokensFromLine function.
+
+" Purpose:
+" Calculate the new virtual column after the given segment of a line.
+" Parameters:
+" line: string
+" first_index: integer -- the index of the first character of the segment
+" last_index: integer -- the index of the last character of the segment
+" vcol: integer -- the virtual column of the first character of the token
+" tabstop: integer -- the value of the 'tabstop' option to be used
+" Returns:
+" vcol: integer
+" Example:
+" " index: 0 12 34567
+" " vcol: 0 45 89
+" s:CalcVCol("\t'\tx', b", 1, 4, 4) -> 10
+function! s:CalcVCol(line, first_index, last_index, vcol, tabstop)
+
+ " We copy the relevant segment of the line, otherwise if the line were
+ " e.g. `"\t", term` then the else branch below would consume the `", term`
+ " part at once.
+ let line = a:line[a:first_index : a:last_index]
+
+ let i = 0
+ let last_index = a:last_index - a:first_index
+ let vcol = a:vcol
+
+ while 0 <= i && i <= last_index
+
+ if line[i] ==# "\t"
+ " Example (when tabstop == 4):
+ "
+ " vcol + tab -> next_vcol
+ " 0 + tab -> 4
+ " 1 + tab -> 4
+ " 2 + tab -> 4
+ " 3 + tab -> 4
+ " 4 + tab -> 8
+ "
+ " next_i - i == the number of tabs
+ let next_i = matchend(line, '\t*', i + 1)
+ let vcol = (vcol / a:tabstop + (next_i - i)) * a:tabstop
+ call s:Log('new vcol after tab: '. vcol)
+ else
+ let next_i = matchend(line, '[^\t]*', i + 1)
+ let vcol += next_i - i
+ call s:Log('new vcol after other: '. vcol)
+ endif
+ let i = next_i
+ endwhile
+
+ return vcol
+endfunction
+
+" Purpose:
+" Go through the whole line and return the tokens in the line.
+" Parameters:
+" line: string -- the line to be examined
+" string_continuation: bool
+" atom_continuation: bool
+" Returns:
+" indtokens = [indtoken]
+" indtoken = [token, vcol, col]
+" token = string (examples: 'begin', '<quoted_atom>', '}')
+" vcol = integer (the virtual column of the first character of the token;
+" counting starts from 0)
+" col = integer (counting starts from 0)
+function! s:GetTokensFromLine(line, string_continuation, atom_continuation,
+ \tabstop)
+
+ let linelen = strlen(a:line) " The length of the line
+ let i = 0 " The index of the current character in the line
+ let vcol = 0 " The virtual column of the current character
+ let indtokens = []
+
+ if a:string_continuation
+ let i = matchend(a:line, '^\%([^"\\]\|\\.\)*"', 0)
+ if i ==# -1
+ call s:Log(' Whole line is string continuation -> ignore')
+ return []
+ else
+ let vcol = s:CalcVCol(a:line, 0, i - 1, 0, a:tabstop)
+ call add(indtokens, ['<string_end>', vcol, i])
+ endif
+ elseif a:atom_continuation
+ let i = matchend(a:line, "^\\%([^'\\\\]\\|\\\\.\\)*'", 0)
+ if i ==# -1
+ call s:Log(' Whole line is quoted atom continuation -> ignore')
+ return []
+ else
+ let vcol = s:CalcVCol(a:line, 0, i - 1, 0, a:tabstop)
+ call add(indtokens, ['<quoted_atom_end>', vcol, i])
+ endif
+ endif
+
+ while 0 <= i && i < linelen
+
+ let next_vcol = ''
+
+ " Spaces
+ if a:line[i] ==# ' '
+ let next_i = matchend(a:line, ' *', i + 1)
+
+ " Tabs
+ elseif a:line[i] ==# "\t"
+ let next_i = matchend(a:line, '\t*', i + 1)
+
+ " See example in s:CalcVCol
+ let next_vcol = (vcol / a:tabstop + (next_i - i)) * a:tabstop
+
+ " Comment
+ elseif a:line[i] ==# '%'
+ let next_i = linelen
+
+ " String token: "..."
+ elseif a:line[i] ==# '"'
+ let next_i = matchend(a:line, '\%([^"\\]\|\\.\)*"', i + 1)
+ if next_i ==# -1
+ call add(indtokens, ['<string_start>', vcol, i])
+ else
+ let next_vcol = s:CalcVCol(a:line, i, next_i - 1, vcol, a:tabstop)
+ call add(indtokens, ['<string>', vcol, i])
+ endif
+
+ " Quoted atom token: '...'
+ elseif a:line[i] ==# "'"
+ let next_i = matchend(a:line, "\\%([^'\\\\]\\|\\\\.\\)*'", i + 1)
+ if next_i ==# -1
+ call add(indtokens, ['<quoted_atom_start>', vcol, i])
+ else
+ let next_vcol = s:CalcVCol(a:line, i, next_i - 1, vcol, a:tabstop)
+ call add(indtokens, ['<quoted_atom>', vcol, i])
+ endif
+
+ " Keyword or atom or variable token or number
+ elseif a:line[i] =~# '[a-zA-Z_@0-9]'
+ let next_i = matchend(a:line,
+ \'[[:alnum:]_@:]*\%(\s*#\s*[[:alnum:]_@:]*\)\=',
+ \i + 1)
+ call add(indtokens, [a:line[(i):(next_i - 1)], vcol, i])
+
+ " Character token: $<char> (as in: $a)
+ elseif a:line[i] ==# '$'
+ call add(indtokens, ['$.', vcol, i])
+ let next_i = i + 2
+
+ " Dot token: .
+ elseif a:line[i] ==# '.'
+
+ let next_i = i + 1
+
+ if i + 1 ==# linelen || a:line[i + 1] =~# '[[:blank:]%]'
+ " End of clause token: . (as in: f() -> ok.)
+ call add(indtokens, ['<end_of_clause>', vcol, i])
+
+ else
+ " Possibilities:
+ " - Dot token in float: . (as in: 3.14)
+ " - Dot token in record: . (as in: #myrec.myfield)
+ call add(indtokens, ['.', vcol, i])
+ endif
+
+ " Equal sign
+ elseif a:line[i] ==# '='
+ " This is handled separately so that "=<<" will be parsed as
+ " ['=', '<<'] instead of ['=<', '<']. Although Erlang parses it
+ " currently in the latter way, that may be fixed some day.
+ call add(indtokens, [a:line[i], vcol, i])
+ let next_i = i + 1
+
+ " Three-character tokens
+ elseif i + 1 < linelen &&
+ \ index(['=:=', '=/='], a:line[i : i + 1]) != -1
+ call add(indtokens, [a:line[i : i + 1], vcol, i])
+ let next_i = i + 2
+
+ " Two-character tokens
+ elseif i + 1 < linelen &&
+ \ index(['->', '<<', '>>', '||', '==', '/=', '=<', '>=', '?=', '++',
+ \ '--', '::'],
+ \ a:line[i : i + 1]) != -1
+ call add(indtokens, [a:line[i : i + 1], vcol, i])
+ let next_i = i + 2
+
+ " Other character: , ; < > ( ) [ ] { } # + - * / : ? = ! |
+ else
+ call add(indtokens, [a:line[i], vcol, i])
+ let next_i = i + 1
+
+ endif
+
+ if next_vcol ==# ''
+ let vcol += next_i - i
+ else
+ let vcol = next_vcol
+ endif
+
+ let i = next_i
+
+ endwhile
+
+ return indtokens
+
+endfunction
+
+" TODO: doc, handle "not found" case
+function! s:GetIndtokenAtCol(indtokens, col)
+ let i = 0
+ while i < len(a:indtokens)
+ if a:indtokens[i][2] ==# a:col
+ return [1, i]
+ elseif a:indtokens[i][2] > a:col
+ return [0, s:IndentError('No token at col ' . a:col . ', ' .
+ \'indtokens = ' . string(a:indtokens),
+ \'', '')]
+ endif
+ let i += 1
+ endwhile
+ return [0, s:IndentError('No token at col ' . a:col . ', ' .
+ \'indtokens = ' . string(a:indtokens),
+ \'', '')]
+endfunction
+
+" Stack library {{{1
+" =============
+
+" Purpose:
+" Push a token onto the parser's stack.
+" Parameters:
+" stack: [token]
+" token: string
+function! s:Push(stack, token)
+ call s:Log(' Stack Push: "' . a:token . '" into ' . string(a:stack))
+ call insert(a:stack, a:token)
+endfunction
+
+" Purpose:
+" Pop a token from the parser's stack.
+" Parameters:
+" stack: [token]
+" token: string
+" Returns:
+" token: string -- the removed element
+function! s:Pop(stack)
+ let head = remove(a:stack, 0)
+ call s:Log(' Stack Pop: "' . head . '" from ' . string(a:stack))
+ return head
+endfunction
+
+" Library for accessing and storing tokenized lines {{{1
+" =================================================
+
+" The Erlang token cache: an `lnum -> indtokens` dictionary that stores the
+" tokenized lines.
+let s:all_tokens = {}
+let s:file_name = ''
+let s:last_changedtick = -1
+
+" Purpose:
+" Clear the Erlang token cache if we have a different file or the file has
+" been changed since the last indentation.
+function! s:ClearTokenCacheIfNeeded()
+ let file_name = expand('%:p')
+ if file_name != s:file_name ||
+ \ b:changedtick != s:last_changedtick
+ let s:file_name = file_name
+ let s:last_changedtick = b:changedtick
+ let s:all_tokens = {}
+ endif
+endfunction
+
+" Purpose:
+" Return the tokens of line `lnum`, if that line is not empty. If it is
+" empty, find the first non-empty line in the given `direction` and return
+" the tokens of that line.
+" Parameters:
+" lnum: integer
+" direction: 'up' | 'down'
+" Returns:
+" result: [] -- the result is an empty list if we hit the beginning or end
+" of the file
+" | [lnum, indtokens]
+" lnum: integer -- the index of the non-empty line that was found and
+" tokenized
+" indtokens: [indtoken] -- the tokens of line `lnum`
+function! s:TokenizeLine(lnum, direction)
+
+ call s:Log('Tokenizing starts from line ' . a:lnum)
+ if a:direction ==# 'up'
+ let lnum = prevnonblank(a:lnum)
+ else " a:direction ==# 'down'
+ let lnum = nextnonblank(a:lnum)
+ endif
+
+ " We hit the beginning or end of the file
+ if lnum ==# 0
+ let indtokens = []
+ call s:Log(' We hit the beginning or end of the file.')
+
+ " The line has already been parsed
+ elseif has_key(s:all_tokens, lnum)
+ let indtokens = s:all_tokens[lnum]
+ call s:Log('Cached line ' . lnum . ': ' . getline(lnum))
+ call s:Log(" Tokens in the line:\n - " . join(indtokens, "\n - "))
+
+ " The line should be parsed now
+ else
+
+ " Parse the line
+ let line = getline(lnum)
+ let string_continuation = s:IsLineStringContinuation(lnum)
+ let atom_continuation = s:IsLineAtomContinuation(lnum)
+ let indtokens = s:GetTokensFromLine(line, string_continuation,
+ \atom_continuation, &tabstop)
+ let s:all_tokens[lnum] = indtokens
+ call s:Log('Tokenizing line ' . lnum . ': ' . line)
+ call s:Log(" Tokens in the line:\n - " . join(indtokens, "\n - "))
+
+ endif
+
+ return [lnum, indtokens]
+endfunction
+
+" Purpose:
+" As a helper function for PrevIndToken and NextIndToken, the FindIndToken
+" function finds the first line with at least one token in the given
+" direction.
+" Parameters:
+" lnum: integer
+" direction: 'up' | 'down'
+" Returns:
+" result: [[], 0, 0]
+" -- the result is an empty list if we hit the beginning or end of
+" the file
+" | [indtoken, lnum, i]
+" -- the content, lnum and token index of the next (or previous)
+" indtoken
+function! s:FindIndToken(lnum, dir)
+ let lnum = a:lnum
+ while 1
+ let lnum += (a:dir ==# 'up' ? -1 : 1)
+ let [lnum, indtokens] = s:TokenizeLine(lnum, a:dir)
+ if lnum ==# 0
+ " We hit the beginning or end of the file
+ return [[], 0, 0]
+ elseif !empty(indtokens)
+ " We found a non-empty line. If we were moving up, we return the last
+ " token of this line. Otherwise we return the first token if this line.
+ let i = (a:dir ==# 'up' ? len(indtokens) - 1 : 0)
+ return [indtokens[i], lnum, i]
+ endif
+ endwhile
+endfunction
+
+" Purpose:
+" Find the token that directly precedes the given token.
+" Parameters:
+" lnum: integer -- the line of the given token
+" i: the index of the given token within line `lnum`
+" Returns:
+" result = [] -- the result is an empty list if the given token is the first
+" token of the file
+" | indtoken
+function! s:PrevIndToken(lnum, i)
+ call s:Log(' PrevIndToken called: lnum=' . a:lnum . ', i =' . a:i)
+
+ " If the current line has a previous token, return that
+ if a:i > 0
+ return [s:all_tokens[a:lnum][a:i - 1], a:lnum, a:i - 1]
+ else
+ return s:FindIndToken(a:lnum, 'up')
+ endif
+endfunction
+
+" Purpose:
+" Find the token that directly succeeds the given token.
+" Parameters:
+" lnum: integer -- the line of the given token
+" i: the index of the given token within line `lnum`
+" Returns:
+" result = [] -- the result is an empty list if the given token is the last
+" token of the file
+" | indtoken
+function! s:NextIndToken(lnum, i)
+ call s:Log(' NextIndToken called: lnum=' . a:lnum . ', i =' . a:i)
+
+ " If the current line has a next token, return that
+ if len(s:all_tokens[a:lnum]) > a:i + 1
+ return [s:all_tokens[a:lnum][a:i + 1], a:lnum, a:i + 1]
+ else
+ return s:FindIndToken(a:lnum, 'down')
+ endif
+endfunction
+
+" ErlangCalcIndent helper functions {{{1
+" =================================
+
+" Purpose:
+" This function is called when the parser encounters a syntax error.
+"
+" If we encounter a syntax error, we return
+" g:erlang_unexpected_token_indent, which is -1 by default. This means that
+" the indentation of the LTI will not be changed.
+" Parameter:
+" msg: string
+" token: string
+" stack: [token]
+" Returns:
+" indent: integer
+function! s:IndentError(msg, token, stack)
+ call s:Log('Indent error: ' . a:msg . ' -> return')
+ call s:Log(' Token = ' . a:token . ', ' .
+ \' stack = ' . string(a:stack))
+ return g:erlang_unexpected_token_indent
+endfunction
+
+" Purpose:
+" This function is called when the parser encounters an unexpected token,
+" and the parser will return the number given back by UnexpectedToken.
+"
+" If we encounter an unexpected token, we return
+" g:erlang_unexpected_token_indent, which is -1 by default. This means that
+" the indentation of the LTI will not be changed.
+" Parameter:
+" token: string
+" stack: [token]
+" Returns:
+" indent: integer
+function! s:UnexpectedToken(token, stack)
+ call s:Log(' Unexpected token ' . a:token . ', stack = ' .
+ \string(a:stack) . ' -> return')
+ return g:erlang_unexpected_token_indent
+endfunction
+
+if !exists('g:erlang_unexpected_token_indent')
+ let g:erlang_unexpected_token_indent = -1
+endif
+
+" Purpose:
+" Return whether the given line starts with a string continuation.
+" Parameter:
+" lnum: integer
+" Returns:
+" result: bool
+" Example:
+" f() -> % IsLineStringContinuation = false
+" "This is a % IsLineStringContinuation = false
+" multiline % IsLineStringContinuation = true
+" string". % IsLineStringContinuation = true
+function! s:IsLineStringContinuation(lnum)
+ if has('syntax_items')
+ return synIDattr(synID(a:lnum, 1, 0), 'name') =~# '^erlangString'
+ else
+ return 0
+ endif
+endfunction
+
+" Purpose:
+" Return whether the given line starts with an atom continuation.
+" Parameter:
+" lnum: integer
+" Returns:
+" result: bool
+" Example:
+" 'function with % IsLineAtomContinuation = true, but should be false
+" weird name'() -> % IsLineAtomContinuation = true
+" ok. % IsLineAtomContinuation = false
+function! s:IsLineAtomContinuation(lnum)
+ if has('syntax_items')
+ let syn_name = synIDattr(synID(a:lnum, 1, 0), 'name')
+ return syn_name =~# '^erlangQuotedAtom' ||
+ \ syn_name =~# '^erlangQuotedRecord'
+ else
+ return 0
+ endif
+endfunction
+
+" Purpose:
+" Return whether the 'catch' token (which should be the `i`th token in line
+" `lnum`) is standalone or part of a try-catch block, based on the preceding
+" token.
+" Parameters:
+" lnum: integer
+" i: integer
+" Return:
+" is_standalone: bool
+function! s:IsCatchStandalone(lnum, i)
+ call s:Log(' IsCatchStandalone called: lnum=' . a:lnum . ', i=' . a:i)
+ let [prev_indtoken, _, _] = s:PrevIndToken(a:lnum, a:i)
+
+ " If we hit the beginning of the file, it is not a catch in a try block
+ if prev_indtoken == []
+ return 1
+ endif
+
+ let prev_token = prev_indtoken[0]
+
+ if prev_token =~# '^[A-Z_@0-9]'
+ let is_standalone = 0
+ elseif prev_token =~# '[a-z]'
+ if index(['after', 'and', 'andalso', 'band', 'begin', 'bnot', 'bor', 'bsl',
+ \ 'bsr', 'bxor', 'case', 'catch', 'div', 'maybe', 'not', 'or',
+ \ 'orelse', 'rem', 'try', 'xor'], prev_token) != -1
+ " If catch is after these keywords, it is standalone
+ let is_standalone = 1
+ else
+ " If catch is after another keyword (e.g. 'end') or an atom, it is
+ " part of try-catch.
+ "
+ " Keywords:
+ " - may precede 'catch': end
+ " - may not precede 'catch': else fun if of receive when
+ " - unused: cond let query
+ let is_standalone = 0
+ endif
+ elseif index([')', ']', '}', '<string>', '<string_end>', '<quoted_atom>',
+ \ '<quoted_atom_end>', '$.'], prev_token) != -1
+ let is_standalone = 0
+ else
+ " This 'else' branch includes the following tokens:
+ " -> == /= =< < >= > ?= =:= =/= + - * / ++ -- :: < > ; ( [ { ? = ! . |
+ let is_standalone = 1
+ endif
+
+ call s:Log(' "catch" preceded by "' . prev_token . '" -> catch ' .
+ \(is_standalone ? 'is standalone' : 'belongs to try-catch'))
+ return is_standalone
+
+endfunction
+
+" Purpose:
+" This function is called when a begin-type element ('begin', 'case',
+" '[', '<<', etc.) is found. It asks the caller to return if the stack
+" if already empty.
+" Parameters:
+" stack: [token]
+" token: string
+" curr_vcol: integer
+" stored_vcol: integer
+" sw: integer -- number of spaces to be used after the begin element as
+" indentation
+" Returns:
+" result: [should_return, indent]
+" should_return: bool -- if true, the caller should return `indent` to Vim
+" indent -- integer
+function! s:BeginElementFoundIfEmpty(stack, token, curr_vcol, stored_vcol, sw)
+ if empty(a:stack)
+ if a:stored_vcol ==# -1
+ call s:Log(' "' . a:token . '" directly precedes LTI -> return')
+ return [1, a:curr_vcol + a:sw]
+ else
+ call s:Log(' "' . a:token .
+ \'" token (whose expression includes LTI) found -> return')
+ return [1, a:stored_vcol]
+ endif
+ else
+ return [0, 0]
+ endif
+endfunction
+
+" Purpose:
+" This function is called when a begin-type element ('begin', 'case', '[',
+" '<<', etc.) is found, and in some cases when 'after' and 'when' is found.
+" It asks the caller to return if the stack is already empty.
+" Parameters:
+" stack: [token]
+" token: string
+" curr_vcol: integer
+" stored_vcol: integer
+" end_token: end token that belongs to the begin element found (e.g. if the
+" begin element is 'begin', the end token is 'end')
+" sw: integer -- number of spaces to be used after the begin element as
+" indentation
+" Returns:
+" result: [should_return, indent]
+" should_return: bool -- if true, the caller should return `indent` to Vim
+" indent -- integer
+function! s:BeginElementFound(stack, token, curr_vcol, stored_vcol, end_token, sw)
+
+ " Return 'return' if the stack is empty
+ let [ret, res] = s:BeginElementFoundIfEmpty(a:stack, a:token, a:curr_vcol,
+ \a:stored_vcol, a:sw)
+ if ret | return [ret, res] | endif
+
+ if a:stack[0] ==# a:end_token
+ call s:Log(' "' . a:token . '" pops "' . a:end_token . '"')
+ call s:Pop(a:stack)
+ if !empty(a:stack) && a:stack[0] ==# 'align_to_begin_element'
+ call s:Pop(a:stack)
+ if empty(a:stack)
+ return [1, a:curr_vcol]
+ else
+ return [1, s:UnexpectedToken(a:token, a:stack)]
+ endif
+ else
+ return [0, 0]
+ endif
+ else
+ return [1, s:UnexpectedToken(a:token, a:stack)]
+ endif
+endfunction
+
+" Purpose:
+" This function is called when we hit the beginning of a file or an
+" end-of-clause token -- i.e. when we found the beginning of the current
+" clause.
+"
+" If the stack contains an '->' or 'when', this means that we can return
+" now, since we were looking for the beginning of the clause.
+" Parameters:
+" stack: [token]
+" token: string
+" stored_vcol: integer
+" lnum: the line number of the "end of clause" mark (or 0 if we hit the
+" beginning of the file)
+" i: the index of the "end of clause" token within its own line
+" Returns:
+" result: [should_return, indent]
+" should_return: bool -- if true, the caller should return `indent` to Vim
+" indent -- integer
+function! s:BeginningOfClauseFound(stack, token, stored_vcol, lnum, i)
+ if !empty(a:stack) && a:stack[0] ==# 'when'
+ call s:Log(' BeginningOfClauseFound: "when" found in stack')
+ 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 + shiftwidth() + 2]
+ else
+ return [1, s:UnexpectedToken(a:token, a:stack)]
+ endif
+ elseif !empty(a:stack) && a:stack[0] ==# '->'
+ call s:Log(' BeginningOfClauseFound: "->" found in stack')
+ 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 + shiftwidth()]
+ elseif a:stack[0] ==# ';'
+ call s:Pop(a:stack)
+
+ if !empty(a:stack)
+ return [1, s:UnexpectedToken(a:token, a:stack)]
+ endif
+
+ if a:lnum ==# 0
+ " Set lnum and i to be NextIndToken-friendly
+ let lnum = 1
+ let i = -1
+ else
+ let lnum = a:lnum
+ let i = a:i
+ endif
+
+ " Are we after a "-spec func() ...;" clause?
+ let [next1_indtoken, next1_lnum, next1_i] = s:NextIndToken(lnum, i)
+ if !empty(next1_indtoken) && next1_indtoken[0] =~# '-'
+ let [next2_indtoken, next2_lnum, next2_i] =
+ \s:NextIndToken(next1_lnum, next1_i)
+ if !empty(next2_indtoken) && next2_indtoken[0] =~# 'spec'
+ let [next3_indtoken, next3_lnum, next3_i] =
+ \s:NextIndToken(next2_lnum, next2_i)
+ if !empty(next3_indtoken)
+ let [next4_indtoken, next4_lnum, next4_i] =
+ \s:NextIndToken(next3_lnum, next3_i)
+ if !empty(next4_indtoken)
+ " Yes, we are.
+ call s:Log(' Stack is ["->", ";"], so LTI is in a "-spec" ' .
+ \'attribute -> return')
+ return [1, next4_indtoken[1]]
+ endif
+ endif
+ endif
+ endif
+
+ call s:Log(' Stack is ["->", ";"], so LTI is in a function head ' .
+ \'-> return')
+ return [1, a:stored_vcol]
+
+ else
+ return [1, s:UnexpectedToken(a:token, a:stack)]
+ endif
+ else
+ return [0, 0]
+ endif
+endfunction
+
+let g:erlang_indent_searchpair_timeout = 2000
+
+" TODO
+function! s:SearchPair(lnum, curr_col, start, middle, end)
+ call cursor(a:lnum, a:curr_col + 1)
+ let [lnum_new, col1_new] =
+ \searchpairpos(a:start, a:middle, a:end, 'bW',
+ \'synIDattr(synID(line("."), col("."), 0), "name") ' .
+ \'=~? "string\\|quotedatom\\|todo\\|comment\\|' .
+ \'erlangmodifier"',
+ \0, g:erlang_indent_searchpair_timeout)
+ return [lnum_new, col1_new - 1]
+endfunction
+
+function! s:SearchEndPair(lnum, curr_col)
+ return s:SearchPair(
+ \ a:lnum, a:curr_col,
+ \ '\C\<\%(case\|try\|begin\|receive\|if\|maybe\)\>\|' .
+ \ '\<fun\>\%(\s\|\n\|%.*$\|[A-Z_@][a-zA-Z_@]*\)*(',
+ \ '',
+ \ '\<end\>')
+endfunction
+
+" ErlangCalcIndent {{{1
+" ================
+
+" Purpose:
+" Calculate the indentation of the given line.
+" Parameters:
+" lnum: integer -- index of the line for which the indentation should be
+" calculated
+" stack: [token] -- initial stack
+" Return:
+" indent: integer -- if -1, that means "don't change the indentation";
+" otherwise it means "indent the line with `indent`
+" number of spaces or equivalent tabs"
+function! s:ErlangCalcIndent(lnum, stack)
+ let res = s:ErlangCalcIndent2(a:lnum, a:stack)
+ call s:Log("ErlangCalcIndent returned: " . res)
+ return res
+endfunction
+
+function! s:ErlangCalcIndent2(lnum, stack)
+
+ let lnum = a:lnum
+ let stored_vcol = -1 " Virtual column of the first character of the token that
+ " we currently think we might align to.
+ let mode = 'normal'
+ let stack = a:stack
+ let semicolon_abscol = ''
+
+ " Walk through the lines of the buffer backwards (starting from the
+ " previous line) until we can decide how to indent the current line.
+ while 1
+
+ let [lnum, indtokens] = s:TokenizeLine(lnum, 'up')
+
+ " Hit the start of the file
+ if lnum ==# 0
+ let [ret, res] = s:BeginningOfClauseFound(stack, 'beginning_of_file',
+ \stored_vcol, 0, 0)
+ if ret | return res | endif
+
+ return 0
+ endif
+
+ let i = len(indtokens) - 1
+ let last_token_of_line = 1
+
+ while i >= 0
+
+ let [token, curr_vcol, curr_col] = indtokens[i]
+ call s:Log(' Analyzing the following token: ' . string(indtokens[i]))
+
+ if len(stack) > 256 " TODO: magic number
+ return s:IndentError('Stack too long', token, stack)
+ endif
+
+ if token ==# '<end_of_clause>'
+ let [ret, res] = s:BeginningOfClauseFound(stack, token, stored_vcol,
+ \lnum, i)
+ if ret | return res | endif
+
+ if stored_vcol ==# -1
+ call s:Log(' End of clause directly precedes LTI -> return')
+ return 0
+ else
+ call s:Log(' End of clause (but not end of line) -> return')
+ return stored_vcol
+ endif
+
+ elseif stack == ['prev_term_plus']
+ if token =~# '[a-zA-Z_@#]' ||
+ \ token ==# '<string>' || token ==# '<string_start>' ||
+ \ token ==# '<quoted_atom>' || token ==# '<quoted_atom_start>'
+ call s:Log(' previous token found: curr_vcol + plus = ' .
+ \curr_vcol . " + " . plus)
+ return curr_vcol + plus
+ endif
+
+ elseif token ==# 'begin'
+ let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
+ \stored_vcol, 'end', shiftwidth())
+ if ret | return res | endif
+
+ " case EXPR of BRANCHES end
+ " if BRANCHES end
+ " try EXPR catch BRANCHES end
+ " try EXPR after BODY end
+ " try EXPR catch BRANCHES after BODY end
+ " try EXPR of BRANCHES catch BRANCHES end
+ " try EXPR of BRANCHES after BODY end
+ " try EXPR of BRANCHES catch BRANCHES after BODY end
+ " receive BRANCHES end
+ " receive BRANCHES after BRANCHES end
+ " maybe EXPR end
+ " maybe EXPR else BRANCHES end
+
+ " This branch is not Emacs-compatible
+ elseif (index(['of', 'receive', 'after', 'if', 'else'], token) != -1 ||
+ \ (token ==# 'catch' && !s:IsCatchStandalone(lnum, i))) &&
+ \ !last_token_of_line &&
+ \ (empty(stack) || stack ==# ['when'] || stack ==# ['->'] ||
+ \ stack ==# ['->', ';'])
+
+ " If we are after of/receive/etc, but these are not the last
+ " tokens of the line, we want to indent like this:
+ "
+ " % stack == []
+ " receive stored_vcol,
+ " LTI
+ "
+ " % stack == ['->', ';']
+ " receive stored_vcol ->
+ " B;
+ " LTI
+ "
+ " % stack == ['->']
+ " receive stored_vcol ->
+ " LTI
+ "
+ " % stack == ['when']
+ " receive stored_vcol when
+ " LTI
+
+ " stack = [] => LTI is a condition
+ " stack = ['->'] => LTI is a branch
+ " stack = ['->', ';'] => LTI is a condition
+ " stack = ['when'] => LTI is a guard
+ if empty(stack) || stack == ['->', ';']
+ call s:Log(' LTI is in a condition after ' .
+ \'"of/receive/after/if/else/catch" -> return')
+ return stored_vcol
+ elseif stack == ['->']
+ call s:Log(' LTI is in a branch after ' .
+ \'"of/receive/after/if/else/catch" -> return')
+ return stored_vcol + shiftwidth()
+ elseif stack == ['when']
+ call s:Log(' LTI is in a guard after ' .
+ \'"of/receive/after/if/else/catch" -> return')
+ return stored_vcol + shiftwidth()
+ else
+ return s:UnexpectedToken(token, stack)
+ endif
+
+ elseif index(['case', 'if', 'try', 'receive', 'maybe'], token) != -1
+
+ " stack = [] => LTI is a condition
+ " stack = ['->'] => LTI is a branch
+ " stack = ['->', ';'] => LTI is a condition
+ " stack = ['when'] => LTI is in a guard
+ if empty(stack)
+ " pass
+ elseif (token ==# 'case' && stack[0] ==# 'of') ||
+ \ (token ==# 'if') ||
+ \ (token ==# 'maybe' && stack[0] ==# 'else') ||
+ \ (token ==# 'try' && (stack[0] ==# 'of' ||
+ \ stack[0] ==# 'catch' ||
+ \ stack[0] ==# 'after')) ||
+ \ (token ==# 'receive')
+
+ " From the indentation point of view, the keyword
+ " (of/catch/after/else/end) before the LTI is what counts, so
+ " when we reached these tokens, and the stack already had
+ " a catch/after/else/end, we didn't modify it.
+ "
+ " This way when we reach case/try/receive/maybe (i.e. now),
+ " there is at most one of/catch/after/else/end token in the
+ " stack.
+ if token ==# 'case' || token ==# 'try' ||
+ \ (token ==# 'receive' && stack[0] ==# 'after') ||
+ \ (token ==# 'maybe' && stack[0] ==# 'else')
+ call s:Pop(stack)
+ endif
+
+ if empty(stack)
+ call s:Log(' LTI is in a condition; matching ' .
+ \'"case/if/try/receive/maybe" found')
+ let stored_vcol = curr_vcol + shiftwidth()
+ elseif stack[0] ==# 'align_to_begin_element'
+ call s:Pop(stack)
+ let stored_vcol = curr_vcol
+ elseif len(stack) > 1 && stack[0] ==# '->' && stack[1] ==# ';'
+ call s:Log(' LTI is in a condition; matching ' .
+ \'"case/if/try/receive/maybe" found')
+ call s:Pop(stack)
+ call s:Pop(stack)
+ let stored_vcol = curr_vcol + shiftwidth()
+ elseif stack[0] ==# '->'
+ call s:Log(' LTI is in a branch; matching ' .
+ \'"case/if/try/receive/maybe" found')
+ call s:Pop(stack)
+ let stored_vcol = curr_vcol + 2 * shiftwidth()
+ elseif stack[0] ==# 'when'
+ call s:Log(' LTI is in a guard; matching ' .
+ \'"case/if/try/receive/maybe" found')
+ call s:Pop(stack)
+ let stored_vcol = curr_vcol + 2 * shiftwidth() + 2
+ endif
+
+ endif
+
+ let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
+ \stored_vcol, 'end', shiftwidth())
+ if ret | return res | endif
+
+ elseif token ==# 'fun'
+ let [next_indtoken, next_lnum, next_i] = s:NextIndToken(lnum, i)
+ call s:Log(' Next indtoken = ' . string(next_indtoken))
+
+ if !empty(next_indtoken) && next_indtoken[0] =~# '^[A-Z_@]'
+ " The "fun" is followed by a variable, so we might have a named fun:
+ " "fun Fun() -> ok end". Thus we take the next token to decide
+ " whether this is a function definition ("fun()") or just a function
+ " reference ("fun Mod:Fun").
+ let [next_indtoken, _, _] = s:NextIndToken(next_lnum, next_i)
+ call s:Log(' Next indtoken = ' . string(next_indtoken))
+ endif
+
+ if !empty(next_indtoken) && next_indtoken[0] ==# '('
+ " We have an anonymous function definition
+ " (e.g. "fun () -> ok end")
+
+ " stack = [] => LTI is a condition
+ " stack = ['->'] => LTI is a branch
+ " stack = ['->', ';'] => LTI is a condition
+ " 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 + shiftwidth()
+ elseif len(stack) > 1 && stack[0] ==# '->' && stack[1] ==# ';'
+ call s:Log(' LTI is in a condition; matching "fun" found')
+ call s:Pop(stack)
+ call s:Pop(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 * 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 * shiftwidth() + 2
+ endif
+
+ let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
+ \stored_vcol, 'end', shiftwidth())
+ if ret | return res | endif
+ else
+ " Pass: we have a function reference (e.g. "fun f/0")
+ endif
+
+ elseif token ==# '['
+ " Emacs compatibility
+ let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
+ \stored_vcol, ']', 1)
+ if ret | return res | endif
+
+ elseif token ==# '<<'
+ " Emacs compatibility
+ let [ret, res] = s:BeginElementFound(stack, token, curr_vcol,
+ \stored_vcol, '>>', 2)
+ if ret | return res | endif
+
+ elseif token ==# '(' || token ==# '{'
+
+ let end_token = (token ==# '(' ? ')' :
+ \token ==# '{' ? '}' : 'error')
+
+ if empty(stack)
+ " We found the opening paren whose block contains the LTI.
+ let mode = 'inside'
+ elseif stack[0] ==# end_token
+ call s:Log(' "' . token . '" pops "' . end_token . '"')
+ call s:Pop(stack)
+
+ if !empty(stack) && stack[0] ==# 'align_to_begin_element'
+ " We found the opening paren whose closing paren
+ " starts LTI
+ let mode = 'align_to_begin_element'
+ else
+ " We found the opening pair for a closing paren that
+ " was already in the stack.
+ let mode = 'outside'
+ endif
+ else
+ return s:UnexpectedToken(token, stack)
+ endif
+
+ if mode ==# 'inside' || mode ==# 'align_to_begin_element'
+
+ if last_token_of_line && i != 0
+ " Examples: {{{
+ "
+ " mode == 'inside':
+ "
+ " my_func(
+ " LTI
+ "
+ " [Variable, {
+ " LTI
+ "
+ " mode == 'align_to_begin_element':
+ "
+ " my_func(
+ " Params
+ " ) % LTI
+ "
+ " [Variable, {
+ " Terms
+ " } % LTI
+ " }}}
+ let stack = ['prev_term_plus']
+ let plus = (mode ==# 'inside' ? 2 : 1)
+ call s:Log(' "' . token .
+ \'" token found at end of line -> find previous token')
+ elseif mode ==# 'align_to_begin_element'
+ " Examples: {{{
+ "
+ " mode == 'align_to_begin_element' && !last_token_of_line
+ "
+ " my_func(stored_vcol
+ " ) % LTI
+ "
+ " [Variable, {stored_vcol
+ " } % LTI
+ "
+ " mode == 'align_to_begin_element' && i == 0
+ "
+ " (
+ " stored_vcol
+ " ) % LTI
+ "
+ " {
+ " stored_vcol
+ " } % LTI
+ " }}}
+ call s:Log(' "' . token . '" token (whose closing token ' .
+ \'starts LTI) found -> return')
+ return curr_vcol
+ elseif stored_vcol ==# -1
+ " Examples: {{{
+ "
+ " mode == 'inside' && stored_vcol == -1 && !last_token_of_line
+ "
+ " my_func(
+ " LTI
+ " [Variable, {
+ " LTI
+ "
+ " mode == 'inside' && stored_vcol == -1 && i == 0
+ "
+ " (
+ " LTI
+ "
+ " {
+ " LTI
+ " }}}
+ call s:Log(' "' . token .
+ \'" token (which directly precedes LTI) found -> return')
+ return curr_vcol + 1
+ else
+ " Examples: {{{
+ "
+ " mode == 'inside' && stored_vcol != -1 && !last_token_of_line
+ "
+ " my_func(stored_vcol,
+ " LTI
+ "
+ " [Variable, {stored_vcol,
+ " LTI
+ "
+ " mode == 'inside' && stored_vcol != -1 && i == 0
+ "
+ " (stored_vcol,
+ " LTI
+ "
+ " {stored_vcol,
+ " LTI
+ " }}}
+ call s:Log(' "' . token .
+ \'" token (whose block contains LTI) found -> return')
+ return stored_vcol
+ endif
+ endif
+
+ elseif index(['end', ')', ']', '}', '>>'], token) != -1
+
+ " If we can be sure that there is synchronization in the Erlang
+ " syntax, we use searchpair to make the script quicker. Otherwise we
+ " just push the token onto the stack and keep parsing.
+
+ " No synchronization -> no searchpair optimization
+ if !exists('b:erlang_syntax_synced')
+ call s:Push(stack, token)
+
+ " We don't have searchpair optimization for '>>'
+ elseif token ==# '>>'
+ call s:Push(stack, token)
+
+ elseif token ==# 'end'
+ let [lnum_new, col_new] = s:SearchEndPair(lnum, curr_col)
+
+ if lnum_new ==# 0
+ return s:IndentError('Matching token for "end" not found',
+ \token, stack)
+ else
+ if lnum_new != lnum
+ call s:Log(' Tokenize for "end" <<<<')
+ let [lnum, indtokens] = s:TokenizeLine(lnum_new, 'up')
+ call s:Log(' >>>> Tokenize for "end"')
+ endif
+
+ let [success, i] = s:GetIndtokenAtCol(indtokens, col_new)
+ if !success | return i | endif
+ let [token, curr_vcol, curr_col] = indtokens[i]
+ call s:Log(' Match for "end" in line ' . lnum_new . ': ' .
+ \string(indtokens[i]))
+ endif
+
+ else " token is one of the following: ')', ']', '}'
+
+ call s:Push(stack, token)
+
+ " We have to escape '[', because this string will be interpreted as a
+ " regexp
+ let open_paren = (token ==# ')' ? '(' :
+ \token ==# ']' ? '\[' :
+ \ '{')
+
+ let [lnum_new, col_new] = s:SearchPair(lnum, curr_col,
+ \open_paren, '', token)
+
+ if lnum_new ==# 0
+ return s:IndentError('Matching token not found',
+ \token, stack)
+ else
+ if lnum_new != lnum
+ call s:Log(' Tokenize the opening paren <<<<')
+ let [lnum, indtokens] = s:TokenizeLine(lnum_new, 'up')
+ call s:Log(' >>>>')
+ endif
+
+ let [success, i] = s:GetIndtokenAtCol(indtokens, col_new)
+ if !success | return i | endif
+ let [token, curr_vcol, curr_col] = indtokens[i]
+ call s:Log(' Match in line ' . lnum_new . ': ' .
+ \string(indtokens[i]))
+
+ " Go back to the beginning of the loop and handle the opening paren
+ continue
+ endif
+ endif
+
+ elseif token ==# ';'
+
+ if empty(stack)
+ call s:Push(stack, ';')
+ elseif index([';', '->', 'when', 'end', 'after', 'catch', 'else'],
+ \stack[0]) != -1
+ " Pass:
+ "
+ " - If the stack top is another ';', then one ';' is
+ " enough.
+ " - If the stack top is an '->' or a 'when', then we
+ " should keep that, because they signify the type of the
+ " LTI (branch, condition or guard).
+ " - From the indentation point of view, the keyword
+ " (of/catch/after/else/end) before the LTI is what counts, so
+ " if the stack already has a catch/after/else/end, we don't
+ " modify it. This way when we reach case/try/receive/maybe,
+ " there will be at most one of/catch/after/else/end token in
+ " the stack.
+ else
+ return s:UnexpectedToken(token, stack)
+ endif
+
+ elseif token ==# '->'
+
+ if empty(stack) && !last_token_of_line
+ call s:Log(' LTI is in expression after arrow -> return')
+ return stored_vcol
+ elseif empty(stack) || stack[0] ==# ';' || stack[0] ==# 'end'
+ " stack = [';'] -> LTI is either a branch or in a guard
+ " stack = ['->'] -> LTI is a condition
+ " stack = ['->', ';'] -> LTI is a branch
+ call s:Push(stack, '->')
+ elseif index(['->', 'when', 'end', 'after', 'catch', 'else'],
+ \stack[0]) != -1
+ " Pass:
+ "
+ " - If the stack top is another '->', then one '->' is
+ " enough.
+ " - If the stack top is a 'when', then we should keep
+ " that, because this signifies that LTI is a in a guard.
+ " - From the indentation point of view, the keyword
+ " (of/catch/after/else/end) before the LTI is what counts, so
+ " if the stack already has a catch/after/else/end, we don't
+ " modify it. This way when we reach case/try/receive/maybe,
+ " there will be at most one of/catch/after/else/end token in
+ " the stack.
+ else
+ return s:UnexpectedToken(token, stack)
+ endif
+
+ elseif token ==# 'when'
+
+ " Pop all ';' from the top of the stack
+ while !empty(stack) && stack[0] ==# ';'
+ call s:Pop(stack)
+ endwhile
+
+ if empty(stack)
+ if semicolon_abscol != ''
+ let stored_vcol = semicolon_abscol
+ endif
+ if !last_token_of_line
+ " Example:
+ " when A,
+ " LTI
+ let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol,
+ \stored_vcol, shiftwidth())
+ if ret | return res | endif
+ else
+ " Example:
+ " when
+ " LTI
+ call s:Push(stack, token)
+ endif
+ elseif index(['->', 'when', 'end', 'after', 'catch', 'else'],
+ \stack[0]) != -1
+ " Pass:
+ " - If the stack top is another 'when', then one 'when' is
+ " enough.
+ " - If the stack top is an '->' or a 'when', then we
+ " should keep that, because they signify the type of the
+ " LTI (branch, condition or guard).
+ " - From the indentation point of view, the keyword
+ " (of/catch/after/else/end) before the LTI is what counts, so
+ " if the stack already has a catch/after/else/end, we don't
+ " modify it. This way when we reach case/try/receive/maybe,
+ " there will be at most one of/catch/after/else/end token in
+ " the stack.
+ else
+ return s:UnexpectedToken(token, stack)
+ endif
+
+ elseif token ==# 'of' || token ==# 'after' || token ==# 'else' ||
+ \ (token ==# 'catch' && !s:IsCatchStandalone(lnum, i))
+
+ if token ==# 'after' || token ==# 'else'
+ " If LTI is between an after/else and the corresponding 'end', then
+ " let's return because calculating the indentation based on
+ " after/else is enough.
+ "
+ " Example:
+ " receive A after
+ " LTI
+ " maybe A else
+ " LTI
+ "
+ " Note about Emacs compabitility {{{
+ "
+ " It would be fine to indent the examples above the following way:
+ "
+ " receive A after
+ " LTI
+ " maybe A else
+ " LTI
+ "
+ " We intend it the way above because that is how Emacs does it.
+ " Also, this is a bit faster.
+ "
+ " We are still not 100% Emacs compatible because of placing the
+ " 'end' after the indented blocks.
+ "
+ " Emacs example:
+ "
+ " receive A after
+ " LTI
+ " end,
+ " maybe A else
+ " LTI
+ " end % Yes, it's here (in OTP 25.0, might change
+ " % later)
+ "
+ " vim-erlang example:
+ "
+ " receive A after
+ " LTI
+ " end,
+ " maybe A else
+ " LTI
+ " end
+ " }}}
+ let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol,
+ \stored_vcol, shiftwidth())
+ if ret | return res | endif
+ endif
+
+ if empty(stack) || stack[0] ==# '->' || stack[0] ==# 'when'
+ call s:Push(stack, token)
+ elseif stack[0] ==# 'catch' || stack[0] ==# 'after' ||
+ \stack[0] ==# 'else' || stack[0] ==# 'end'
+ " Pass: From the indentation point of view, the keyword
+ " (of/catch/after/end) before the LTI is what counts, so
+ " if the stack already has a catch/after/end, we don't
+ " modify it. This way when we reach case/try/receive,
+ " there will be at most one of/catch/after/end token in
+ " the stack.
+ else
+ return s:UnexpectedToken(token, stack)
+ endif
+
+ elseif token ==# '||' && empty(stack) && !last_token_of_line
+
+ call s:Log(' LTI is in expression after "||" -> return')
+ return stored_vcol
+
+ else
+ call s:Log(' Misc token, stack unchanged = ' . string(stack))
+
+ endif
+
+ if empty(stack) || stack[0] ==# '->' || stack[0] ==# 'when'
+ let stored_vcol = curr_vcol
+ let semicolon_abscol = ''
+ call s:Log(' Misc token when the stack is empty or has "->" ' .
+ \'-> setting stored_vcol to ' . stored_vcol)
+ elseif stack[0] ==# ';'
+ let semicolon_abscol = curr_vcol
+ call s:Log(' Setting semicolon-stored_vcol to ' . stored_vcol)
+ endif
+
+ let i -= 1
+ call s:Log(' Token processed. stored_vcol=' . stored_vcol)
+
+ let last_token_of_line = 0
+
+ endwhile " iteration on tokens in a line
+
+ call s:Log(' Line analyzed. stored_vcol=' . stored_vcol)
+
+ if empty(stack) && stored_vcol != -1 &&
+ \ (!empty(indtokens) && indtokens[0][0] != '<string_end>' &&
+ \ indtokens[0][0] != '<quoted_atom_end>')
+ call s:Log(' Empty stack at the beginning of the line -> return')
+ return stored_vcol
+ endif
+
+ let lnum -= 1
+
+ endwhile " iteration on lines
+
+endfunction
+
+" ErlangIndent function {{{1
+" =====================
+
+function! ErlangIndent()
+
+ call s:ClearTokenCacheIfNeeded()
+
+ let currline = getline(v:lnum)
+ call s:Log('Indenting line ' . v:lnum . ': ' . currline)
+
+ if s:IsLineStringContinuation(v:lnum) || s:IsLineAtomContinuation(v:lnum)
+ call s:Log('String or atom continuation found -> ' .
+ \'leaving indentation unchanged')
+ return -1
+ endif
+
+ " If the line starts with the comment, and so is the previous non-blank line
+ if currline =~# '^\s*%'
+ let lnum = prevnonblank(v:lnum - 1)
+ if lnum ==# 0
+ call s:Log('First non-empty line of the file -> return 0.')
+ return 0
+ else
+ let ml = matchlist(getline(lnum), '^\(\s*\)%')
+ " If the previous line also starts with a comment, then return the same
+ " indentation that line has. Otherwise exit from this special "if" and
+ " don't care that the current line is a comment.
+ if !empty(ml)
+ let new_col = s:CalcVCol(ml[1], 0, len(ml[1]) - 1, 0, &tabstop)
+ call s:Log('Comment line after another comment line -> ' .
+ \'use same indent: ' . new_col)
+ return new_col
+ endif
+ endif
+ endif
+
+ let ml = matchlist(currline,
+ \'^\(\s*\)\(\%(end\|of\|catch\|after\|else\)\>\|[)\]}]\|>>\)')
+
+ " If the line has a special beginning, but not a standalone catch
+ if !empty(ml) && !(ml[2] ==# 'catch' && s:IsCatchStandalone(v:lnum, 0))
+
+ let curr_col = len(ml[1])
+
+ " If we can be sure that there is synchronization in the Erlang
+ " syntax, we use searchpair to make the script quicker.
+ if ml[2] ==# 'end' && exists('b:erlang_syntax_synced')
+
+ let [lnum, col] = s:SearchEndPair(v:lnum, curr_col)
+
+ if lnum ==# 0
+ return s:IndentError('Matching token for "end" not found',
+ \'end', [])
+ else
+ call s:Log(' Tokenize for "end" <<<<')
+ let [lnum, indtokens] = s:TokenizeLine(lnum, 'up')
+ call s:Log(' >>>> Tokenize for "end"')
+
+ let [success, i] = s:GetIndtokenAtCol(indtokens, col)
+ if !success | return i | endif
+ let [token, curr_vcol, curr_col] = indtokens[i]
+ call s:Log(' Match for "end" in line ' . lnum . ': ' .
+ \string(indtokens[i]))
+ return curr_vcol
+ endif
+
+ else
+
+ call s:Log(" Line type = 'end'")
+ let new_col = s:ErlangCalcIndent(v:lnum - 1,
+ \[ml[2], 'align_to_begin_element'])
+ endif
+ else
+ call s:Log(" Line type = 'normal'")
+
+ let new_col = s:ErlangCalcIndent(v:lnum - 1, [])
+ if currline =~# '^\s*when\>'
+ let new_col += 2
+ endif
+ endif
+
+ if new_col < -1
+ call s:Log('WARNING: returning new_col == ' . new_col)
+ return g:erlang_unexpected_token_indent
+ endif
+
+ return new_col
+
+endfunction
+
+" ErlangShowTokensInLine functions {{{1
+" ================================
+
+" These functions are useful during development.
+
+function! ErlangShowTokensInLine(line)
+ echo "Line: " . a:line
+ let indtokens = s:GetTokensFromLine(a:line, 0, 0, &tabstop)
+ echo "Tokens:"
+ for it in indtokens
+ echo it
+ endfor
+endfunction
+
+function! ErlangShowTokensInCurrentLine()
+ return ErlangShowTokensInLine(getline('.'))
+endfunction
+
+" Cleanup {{{1
+" =======
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: sw=2 et fdm=marker
diff --git a/runtime/indent/eruby.vim b/runtime/indent/eruby.vim
new file mode 100644
index 0000000..6ff15ab
--- /dev/null
+++ b/runtime/indent/eruby.vim
@@ -0,0 +1,111 @@
+" Vim indent file
+" Language: eRuby
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2019 Jan 06
+
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/ruby.vim
+unlet! b:did_indent
+setlocal indentexpr=
+
+if exists("b:eruby_subtype") && b:eruby_subtype != '' && b:eruby_subtype !=# 'eruby'
+ exe "runtime! indent/".b:eruby_subtype.".vim"
+else
+ runtime! indent/html.vim
+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)'
+ else
+ let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))'
+ endif
+endif
+let b:eruby_subtype_indentexpr = &l:indentexpr
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetErubyIndent()
+setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=else,=elsif,=rescue,=ensure,=when
+
+" Only define the function once.
+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
+ if exists('*shiftwidth')
+ let sw = shiftwidth()
+ else
+ let sw = &sw
+ endif
+
+ if a:0 && a:1 == '.'
+ let v:lnum = line('.')
+ elseif a:0 && a:1 =~ '^\d'
+ let v:lnum = a:1
+ endif
+ let vcol = col('.')
+ call cursor(v:lnum,1)
+ let inruby = searchpair('<%','','%>','W')
+ call cursor(v:lnum,vcol)
+ if inruby && getline(v:lnum) !~ '^<%\|^\s*[-=]\=%>'
+ 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
+ endif
+ if line =~# '\S\s*<%[-=]\=\s*\%(}\|end\).\{-\}\s*\%([-=]\=%>\|$\)'
+ let ind = ind - sw
+ endif
+ if line =~# '\%({\|\<do\)\%(\s*|[^|]*|\)\=\s*[-=]\=%>'
+ 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
+ endif
+ if line =~# '^\s*<%[=#-]\=\s*$' && cline !~# '^\s*end\>'
+ let ind = ind + sw
+ endif
+ if line !~# '^\s*<%' && line =~# '%>\s*$' && line !~# '^\s*end\>'
+ \ && synID(v:lnum, match(cline, '\S') + 1, 1) != hlID('htmlEndTag')
+ let ind = ind - sw
+ endif
+ if cline =~# '^\s*[-=]\=%>\s*$'
+ 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
new file mode 100644
index 0000000..3accf9b
--- /dev/null
+++ b/runtime/indent/eterm.vim
@@ -0,0 +1,39 @@
+" Vim indent file
+" Language: Eterm configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 24 Sep 2021
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetEtermIndent()
+setlocal indentkeys=!^F,o,O,=end
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetEtermIndent")
+ finish
+endif
+
+function GetEtermIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ if getline(lnum) =~ '^\s*begin\>'
+ let ind = ind + shiftwidth()
+ endif
+
+ if getline(v:lnum) =~ '^\s*end\>'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/expect.vim b/runtime/indent/expect.vim
new file mode 100644
index 0000000..f2a1f05
--- /dev/null
+++ b/runtime/indent/expect.vim
@@ -0,0 +1,11 @@
+" Vim indent file
+" Language: Expect
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jul 16
+
+if exists("b:did_indent")
+ finish
+endif
+
+" Syntax is similar to Tcl
+runtime! indent/tcl.vim
diff --git a/runtime/indent/falcon.vim b/runtime/indent/falcon.vim
new file mode 100644
index 0000000..a58ccad
--- /dev/null
+++ b/runtime/indent/falcon.vim
@@ -0,0 +1,454 @@
+" Vim indent file
+" Language: Falcon
+" Maintainer: Steven Oliver <oliver.steven@gmail.com>
+" Website: https://steveno@github.com/steveno/falconpl-vim.git
+" Credits: This is, to a great extent, a copy n' paste of ruby.vim.
+" 2022 April: b:undo_indent added by Doug Kearns
+
+" 1. Setup {{{1
+" ============
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+
+" Setup indent function and when to use it
+setlocal indentexpr=FalconGetIndent(v:lnum)
+setlocal indentkeys=0{,0},0),0],!^F,o,O,e
+setlocal indentkeys+==~case,=~catch,=~default,=~elif,=~else,=~end,=~\"
+
+let b:undo_indent = "setl inde< indk< si<"
+
+" Define the appropriate indent function but only once
+if exists("*FalconGetIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" 2. Variables {{{1
+" ============
+
+" Regex of syntax group names that are strings AND comments
+let s:syng_strcom = '\<falcon\%(String\|StringEscape\|Comment\)\>'
+
+" Regex of syntax group names that are strings
+let s:syng_string = '\<falcon\%(String\|StringEscape\)\>'
+
+" Regex that defines blocks.
+"
+" Note that there's a slight problem with this regex and s:continuation_regex.
+" Code like this will be matched by both:
+"
+" method_call do |(a, b)|
+"
+" 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*\%(#.*\)\=$'
+
+let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex
+
+" Regex that defines continuation lines.
+" TODO: this needs to deal with if ...: and so on
+let s:continuation_regex =
+ \ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
+
+" Regex that defines bracket continuations
+let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$'
+
+" Regex that defines continuation lines, not including (, {, or [.
+let s:non_bracket_continuation_regex = '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
+
+" Keywords to indent on
+let s:falcon_indent_keywords = '^\s*\(case\|catch\|class\|enum\|default\|elif\|else' .
+ \ '\|for\|function\|if.*"[^"]*:.*"\|if \(\(:\)\@!.\)*$\|loop\|object\|select' .
+ \ '\|switch\|try\|while\|\w*\s*=\s*\w*([$\)'
+
+" Keywords to deindent on
+let s:falcon_deindent_keywords = '^\s*\(case\|catch\|default\|elif\|else\|end\)'
+
+" 3. Functions {{{1
+" ============
+
+" Check if the character at lnum:col is inside a string, comment, or is ascii.
+function s:IsInStringOrComment(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
+endfunction
+
+" Check if the character at lnum:col is inside a string.
+function s:IsInString(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string
+endfunction
+
+" Check if the character at lnum:col is inside a string delimiter
+function s:IsInStringDelimiter(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') == 'falconStringDelimiter'
+endfunction
+
+" Find line above 'lnum' that isn't empty, in a comment, or in a string.
+function s:PrevNonBlankNonString(lnum)
+ let in_block = 0
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ " Go in and out of blocks comments as necessary.
+ " If the line isn't empty (with opt. comment) or in a string, end search.
+ let line = getline(lnum)
+ if line =~ '^=begin'
+ if in_block
+ let in_block = 0
+ else
+ break
+ endif
+ elseif !in_block && line =~ '^=end'
+ let in_block = 1
+ elseif !in_block && line !~ '^\s*#.*$' && !(s:IsInStringOrComment(lnum, 1)
+ \ && s:IsInStringOrComment(lnum, strlen(line)))
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+" Find line above 'lnum' that started the continuation 'lnum' may be part of.
+function s:GetMSL(lnum)
+ " Start on the line we're at and use its indent.
+ let msl = a:lnum
+ let msl_body = getline(msl)
+ let lnum = s:PrevNonBlankNonString(a:lnum - 1)
+ while lnum > 0
+ " If we have a continuation line, or we're in a string, use line as MSL.
+ " Otherwise, terminate search as we have found our MSL already.
+ let line = getline(lnum)
+
+ if s:Match(line, 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.
+ "
+ " Example:
+ " method_call one,
+ " two,
+ " 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
+ " the previous is a non-bracket one, respect the previous' indentation,
+ " and stop here.
+ "
+ " Example:
+ " method_call one,
+ " two {
+ " three
+ "
+ return lnum
+ elseif s:Match(lnum, s:bracket_continuation_regex) &&
+ \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
+ " If both lines are bracket continuations (the current may also be a
+ " block-starter), use the current one's and stop here
+ "
+ " Example:
+ " method_call(
+ " other_method_call(
+ " foo
+ return msl
+ elseif s:Match(lnum, s:block_regex) &&
+ \ !s:Match(msl, s:continuation_regex) &&
+ \ !s:Match(msl, s:block_continuation_regex)
+ " If the previous line is a block-starter and the current one is
+ " mostly ordinary, use the current one as the MSL.
+ "
+ " Example:
+ " method_call do
+ " something
+ " something_else
+ return msl
+ else
+ let col = match(line, s:continuation_regex) + 1
+ if (col > 0 && !s:IsInStringOrComment(lnum, col))
+ \ || s:IsInString(lnum, strlen(line))
+ let msl = lnum
+ else
+ break
+ endif
+ endif
+
+ let msl_body = getline(msl)
+ let lnum = s:PrevNonBlankNonString(lnum - 1)
+ endwhile
+ return msl
+endfunction
+
+" Check if line 'lnum' has more opening brackets than closing ones.
+function s:ExtraBrackets(lnum)
+ let opening = {'parentheses': [], 'braces': [], 'brackets': []}
+ let closing = {'parentheses': [], 'braces': [], 'brackets': []}
+
+ let line = getline(a:lnum)
+ let pos = match(line, '[][(){}]', 0)
+
+ " Save any encountered opening brackets, and remove them once a matching
+ " closing one has been found. If a closing bracket shows up that doesn't
+ " close anything, save it for later.
+ while pos != -1
+ if !s:IsInStringOrComment(a:lnum, pos + 1)
+ if line[pos] == '('
+ call add(opening.parentheses, {'type': '(', 'pos': pos})
+ elseif line[pos] == ')'
+ if empty(opening.parentheses)
+ call add(closing.parentheses, {'type': ')', 'pos': pos})
+ else
+ let opening.parentheses = opening.parentheses[0:-2]
+ endif
+ elseif line[pos] == '{'
+ call add(opening.braces, {'type': '{', 'pos': pos})
+ elseif line[pos] == '}'
+ if empty(opening.braces)
+ call add(closing.braces, {'type': '}', 'pos': pos})
+ else
+ let opening.braces = opening.braces[0:-2]
+ endif
+ elseif line[pos] == '['
+ call add(opening.brackets, {'type': '[', 'pos': pos})
+ elseif line[pos] == ']'
+ if empty(opening.brackets)
+ call add(closing.brackets, {'type': ']', 'pos': pos})
+ else
+ let opening.brackets = opening.brackets[0:-2]
+ endif
+ endif
+ endif
+
+ let pos = match(line, '[][(){}]', pos + 1)
+ endwhile
+
+ " Find the rightmost brackets, since they're the ones that are important in
+ " both opening and closing cases
+ let rightmost_opening = {'type': '(', 'pos': -1}
+ let rightmost_closing = {'type': ')', 'pos': -1}
+
+ for opening in opening.parentheses + opening.braces + opening.brackets
+ if opening.pos > rightmost_opening.pos
+ let rightmost_opening = opening
+ endif
+ endfor
+
+ for closing in closing.parentheses + closing.braces + closing.brackets
+ if closing.pos > rightmost_closing.pos
+ let rightmost_closing = closing
+ endif
+ endfor
+
+ return [rightmost_opening, rightmost_closing]
+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
+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)
+ endwhile
+ return col + 1
+endfunction
+
+" 4. FalconGetIndent Routine {{{1
+" ============
+
+function FalconGetIndent(...)
+ " For the current line, use the first argument if given, else v:lnum
+ let clnum = a:0 ? a:1 : v:lnum
+
+ " Use zero indent at the top of the file
+ if clnum == 0
+ return 0
+ endif
+
+ let line = getline(clnum)
+ let ind = -1
+
+ " 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.
+ let col = matchend(line, '^\s*[]})]')
+ if col > 0 && !s:IsInStringOrComment(clnum, col)
+ call cursor(clnum, col)
+ let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2)
+ if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0
+ if line[col-1]==')' && col('.') != col('$') - 1
+ let ind = virtcol('.') - 1
+ else
+ let ind = indent(s:GetMSL(line('.')))
+ endif
+ endif
+ return ind
+ endif
+
+ " If we have a deindenting keyword, find its match and indent to its level.
+ " TODO: this is messy
+ if s:Match(clnum, s:falcon_deindent_keywords)
+ call cursor(clnum, 1)
+ if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
+ \ s:end_skip_expr) > 0
+ let msl = s:GetMSL(line('.'))
+ let line = getline(line('.'))
+
+ if strpart(line, 0, col('.') - 1) =~ '=\s*$' &&
+ \ strpart(line, col('.') - 1, 2) !~ 'do'
+ let ind = virtcol('.') - 1
+ elseif getline(msl) =~ '=\s*\(#.*\)\=$'
+ let ind = indent(line('.'))
+ else
+ let ind = indent(msl)
+ endif
+ endif
+ return ind
+ endif
+
+ " If we are in a multi-line string or line-comment, don't do anything to it.
+ if s:IsInString(clnum, matchend(line, '^\s*') + 1)
+ return indent('.')
+ endif
+
+ " Find a non-blank, non-multi-line string line above the current line.
+ let lnum = s:PrevNonBlankNonString(clnum - 1)
+
+ " If the line is empty and inside a string, use the previous line.
+ if line =~ '^\s*$' && lnum != prevnonblank(clnum - 1)
+ return indent(prevnonblank(clnum))
+ endif
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Set up variables for the previous line.
+ let line = getline(lnum)
+ let ind = indent(lnum)
+
+ " 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)) + shiftwidth()
+ endif
+
+ " If it contained hanging closing brackets, find the rightmost one, find its
+ " match and indent according to that.
+ if line =~ '[[({]' || line =~ '[])}]\s*\%(#.*\)\=$'
+ let [opening, closing] = s:ExtraBrackets(lnum)
+
+ if opening.pos != -1
+ if opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
+ if col('.') + 1 == col('$')
+ return ind + shiftwidth()
+ else
+ return virtcol('.')
+ endif
+ else
+ let nonspace = matchend(line, '\S', opening.pos + 1) - 1
+ 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('.') + shiftwidth()
+ else
+ return indent('.')
+ endif
+ else
+ call cursor(clnum, 0) " FIXME: column was vcol
+ end
+ endif
+
+ " If the previous line ended with an "end", match that "end"s beginning's
+ " indent.
+ let col = s:Match(lnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$')
+ if col > 0
+ call cursor(lnum, col)
+ if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW',
+ \ s:end_skip_expr) > 0
+ let n = line('.')
+ let ind = indent('.')
+ let msl = s:GetMSL(n)
+ if msl != n
+ let ind = indent(msl)
+ end
+ return ind
+ endif
+ end
+
+ let col = s:Match(lnum, s:falcon_indent_keywords)
+ if col > 0
+ call cursor(lnum, col)
+ 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
+ if s:Match(lnum, s:end_end_regex)
+ let ind = indent('.')
+ endif
+ return ind
+ endif
+
+ " Set up variables to use and search for MSL to the previous line.
+ 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 p_lnum != lnum
+ if s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line))
+ return ind
+ endif
+ endif
+
+ " Set up more variables, now that we know we wasn't continuation bound.
+ let line = getline(lnum)
+ let msl_ind = indent(lnum)
+
+ " If the MSL line had an indenting keyword in it, add a level of indent.
+ " 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 + shiftwidth()
+ if s:Match(lnum, s:end_end_regex)
+ let ind = ind - shiftwidth()
+ endif
+ return ind
+ endif
+
+ " If the previous line ended with [*+/.,-=], but wasn't a block ending or a
+ " 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 + shiftwidth()
+ else
+ let ind = msl_ind
+ endif
+ return ind
+ endif
+
+ return ind
+endfunction
+
+" }}}1
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: set sw=4 sts=4 et tw=80 :
diff --git a/runtime/indent/fennel.vim b/runtime/indent/fennel.vim
new file mode 100644
index 0000000..e12aa18
--- /dev/null
+++ b/runtime/indent/fennel.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: Fennel
+" Maintainer: Gregory Anders <greg[NOSPAM]@gpanders.com>
+" Last Change: 2022 Apr 20
+
+" 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/fish.vim b/runtime/indent/fish.vim
new file mode 100644
index 0000000..7455287
--- /dev/null
+++ b/runtime/indent/fish.vim
@@ -0,0 +1,82 @@
+" Vim indent file
+" Language: fish
+" Maintainer: Nicholas Boyle (github.com/nickeb96)
+" Repository: https://github.com/nickeb96/fish.vim
+" Last Change: February 4, 2023
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetFishIndent(v:lnum)
+setlocal indentkeys+==end,=else,=case
+
+function s:PrevCmdStart(linenum)
+ let l:linenum = a:linenum
+ " look for the first line that isn't a line continuation
+ while l:linenum > 1 && getline(l:linenum - 1) =~# '\\$'
+ let l:linenum = l:linenum - 1
+ endwhile
+ return l:linenum
+endfunction
+
+function GetFishIndent(lnum)
+ let l:shiftwidth = shiftwidth()
+
+ let l:prevlnum = prevnonblank(a:lnum - 1)
+ if l:prevlnum ==# 0
+ return 0
+ endif
+
+ " if the previous line ended with a line continuation
+ if getline(a:lnum - 1) =~# '\\$'
+ if a:lnum ==# 0 || getline(a:lnum - 2) !~# '\\$'
+ " this is the first line continuation in a chain, so indent it
+ return indent(a:lnum - 1) + l:shiftwidth
+ else
+ " use the same indentation as the previous continued line
+ return indent(a:lnum - 1)
+ endif
+ endif
+
+ let l:prevlnum = s:PrevCmdStart(l:prevlnum)
+
+ let l:prevline = getline(l:prevlnum)
+ if l:prevline =~# '^\s*\(begin\|if\|else\|while\|for\|function\|case\|switch\)\>'
+ let l:indent = l:shiftwidth
+ else
+ let l:indent = 0
+ endif
+
+ let l:line = getline(a:lnum)
+ if l:line =~# '^\s*end\>'
+ " find end's matching start
+ let l:depth = 1
+ let l:currentlnum = a:lnum
+ while l:depth > 0 && l:currentlnum > 0
+ let l:currentlnum = s:PrevCmdStart(prevnonblank(l:currentlnum - 1))
+ let l:currentline = getline(l:currentlnum)
+ if l:currentline =~# '^\s*end\>'
+ let l:depth = l:depth + 1
+ elseif l:currentline =~# '^\s*\(begin\|if\|while\|for\|function\|switch\)\>'
+ let l:depth = l:depth - 1
+ endif
+ endwhile
+ if l:currentline =~# '^\s*switch\>'
+ return indent(l:currentlnum)
+ else
+ return indent(l:prevlnum) + l:indent - l:shiftwidth
+ endif
+ elseif l:line =~# '^\s*else\>'
+ return indent(l:prevlnum) + l:indent - l:shiftwidth
+ elseif l:line =~# '^\s*case\>'
+ if getline(l:prevlnum) =~# '^\s*switch\>'
+ return indent(l:prevlnum) + l:indent
+ else
+ return indent(l:prevlnum) + l:indent - l:shiftwidth
+ endif
+ else
+ return indent(l:prevlnum) + l:indent
+ endif
+endfunction
diff --git a/runtime/indent/fortran.vim b/runtime/indent/fortran.vim
new file mode 100644
index 0000000..9623014
--- /dev/null
+++ b/runtime/indent/fortran.vim
@@ -0,0 +1,224 @@
+" Vim indent file
+" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
+" Version: (v49) 2022 May 14
+" Maintainer: Ajit J. Thakkar <thakkar.ajit@gmail.com>; <http://www2.unb.ca/~ajit/>
+" Usage: For instructions, do :help fortran-indent from Vim
+" Credits:
+" Version 0.1 was created in September 2000 by Ajit Thakkar.
+" Since then, useful suggestions and contributions have been made, in order, by:
+" Albert Oliver Serra, Takuya Fujiwara, Philipp Edelmann, Eisuke Kawashima,
+" Louis Cochen, and Doug Kearns.
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+let s:cposet=&cpoptions
+set cpoptions&vim
+let b:undo_indent = "setl inde< indk<"
+
+setlocal indentkeys+==~end,=~case,=~if,=~else,=~do,=~where,=~elsewhere,=~select
+setlocal indentkeys+==~endif,=~enddo,=~endwhere,=~endselect,=~elseif
+setlocal indentkeys+==~type,=~interface,=~forall,=~associate,=~block,=~enum
+setlocal indentkeys+==~endforall,=~endassociate,=~endblock,=~endenum
+if exists("b:fortran_indent_more") || exists("g:fortran_indent_more")
+ setlocal indentkeys+==~function,=~subroutine,=~module,=~contains,=~program
+ setlocal indentkeys+==~endfunction,=~endsubroutine,=~endmodule
+ setlocal indentkeys+==~endprogram
+endif
+
+" Determine whether this is a fixed or free format source file
+" if this hasn't been done yet using the priority:
+" buffer-local value
+" > global value
+" > file extension as in Intel ifort, gcc (gfortran), NAG, Pathscale, and Cray compilers
+if !exists("b:fortran_fixed_source")
+ if exists("fortran_free_source")
+ " User guarantees free source form
+ let b:fortran_fixed_source = 0
+ elseif exists("fortran_fixed_source")
+ " User guarantees fixed source form
+ let b:fortran_fixed_source = 1
+ elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$'
+ " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers
+ let b:fortran_fixed_source = 0
+ elseif expand("%:e") =~? '^\%(f\|f77\|for\)$'
+ " Fixed-form file extension defaults
+ let b:fortran_fixed_source = 1
+ else
+ " Modern fortran still allows both fixed and free source form
+ " Assume fixed source form unless signs of free source form
+ " are detected in the first five columns of the first s:lmax lines.
+ " Detection becomes more accurate and time-consuming if more lines
+ " are checked. Increase the limit below if you keep lots of comments at
+ " the very top of each file and you have a fast computer.
+ let s:lmax = 500
+ if ( s:lmax > line("$") )
+ let s:lmax = line("$")
+ endif
+ let b:fortran_fixed_source = 1
+ let s:ln=1
+ while s:ln <= s:lmax
+ let s:test = strpart(getline(s:ln),0,5)
+ if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
+ let b:fortran_fixed_source = 0
+ break
+ endif
+ let s:ln = s:ln + 1
+ endwhile
+ endif
+endif
+
+" Define the appropriate indent function but only once
+if (b:fortran_fixed_source == 1)
+ setlocal indentexpr=FortranGetFixedIndent()
+ if exists("*FortranGetFixedIndent")
+ let &cpoptions = s:cposet
+ unlet s:cposet
+ finish
+ endif
+else
+ setlocal indentexpr=FortranGetFreeIndent()
+ if exists("*FortranGetFreeIndent")
+ let &cpoptions = s:cposet
+ unlet s:cposet
+ finish
+ endif
+endif
+
+function FortranGetIndent(lnum)
+ let ind = indent(a:lnum)
+ let prevline=getline(a:lnum)
+ " Strip tail comment
+ let prevstat=substitute(prevline, '!.*$', '', '')
+ let prev2line=getline(a:lnum-1)
+ let prev2stat=substitute(prev2line, '!.*$', '', '')
+
+ "Indent do loops only if they are all guaranteed to be of do/end do type
+ if exists("b:fortran_do_enddo") || exists("g:fortran_do_enddo")
+ if prevstat =~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*do\>'
+ let ind = ind + shiftwidth()
+ endif
+ if getline(v:lnum) =~? '^\s*\(\d\+\s\)\=\s*end\s*do\>'
+ let ind = ind - shiftwidth()
+ endif
+ endif
+
+ "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\|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\>'
+ let ind = ind + shiftwidth()
+ " Remove unwanted indent after logical and arithmetic ifs
+ if prevstat =~? '\<if\>' && prevstat !~? '\<then\>'
+ let ind = ind - shiftwidth()
+ endif
+ " Remove unwanted indent after type( statements
+ if prevstat =~? '^\s*type\s*('
+ let ind = ind - shiftwidth()
+ endif
+ endif
+
+ "Indent program units unless instructed otherwise
+ if !exists("b:fortran_indent_less") && !exists("g:fortran_indent_less")
+ 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*\(contains\|submodule\|program\)\>'
+ \ ||prevstat =~? '^\s*'.'module\>\(\s*\procedure\)\@!'
+ \ ||prevstat =~? '^\s*'.prefix.'subroutine\>'
+ \ ||prevstat =~? '^\s*'.prefix.type.'function\>'
+ \ ||prevstat =~? '^\s*'.type.prefix.'function\>'
+ let ind = ind + shiftwidth()
+ endif
+ if getline(v:lnum) =~? '^\s*contains\>'
+ \ ||getline(v:lnum)=~? '^\s*end\s*'
+ \ .'\(function\|subroutine\|module\|submodule\|program\)\>'
+ let ind = ind - shiftwidth()
+ endif
+ endif
+
+ "Subtract a shiftwidth from else, else if, elsewhere, case, class, end if,
+ " end where, end select, end forall, end interface, end associate,
+ " 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\|class\|'
+ \. 'end\s*\(if\|where\|select\|interface\|'
+ \. 'type\|forall\|associate\|enum\|block\)\)\>'
+ let ind = ind - shiftwidth()
+ " Fix indent for case statement immediately after select
+ if prevstat =~? '\<select\s*\(case\|type\)\>'
+ let ind = ind + shiftwidth()
+ endif
+ endif
+
+ "First continuation line
+ if prevstat =~ '&\s*$' && prev2stat !~ '&\s*$'
+ let ind = ind + shiftwidth()
+ endif
+ "Line after last continuation line
+ if prevstat !~ '&\s*$' && prev2stat =~ '&\s*$' && prevstat !~? '\<then\>'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfunction
+
+function FortranGetFreeIndent()
+ "Find the previous non-blank line
+ let lnum = prevnonblank(v:lnum - 1)
+
+ "Use zero indent at the top of the file
+ if lnum == 0
+ return 0
+ endif
+
+ let ind=FortranGetIndent(lnum)
+ return ind
+endfunction
+
+function FortranGetFixedIndent()
+ let currline=getline(v:lnum)
+ "Don't indent comments, continuation lines and labelled lines
+ if strpart(currline,0,6) =~ '[^ \t]'
+ let ind = indent(v:lnum)
+ return ind
+ endif
+
+ "Find the previous line which is not blank, not a comment,
+ "not a continuation line, and does not have a label
+ let lnum = v:lnum - 1
+ while lnum > 0
+ let prevline=getline(lnum)
+ if (prevline =~ "^[C*!]") || (prevline =~ "^\s*$")
+ \ || (strpart(prevline,5,1) !~ "[ 0]")
+ " Skip comments, blank lines and continuation lines
+ let lnum = lnum - 1
+ else
+ let test=strpart(prevline,0,5)
+ if test =~ "[0-9]"
+ " Skip lines with statement numbers
+ let lnum = lnum - 1
+ else
+ break
+ endif
+ endif
+ endwhile
+
+ "First line must begin at column 7
+ if lnum == 0
+ return 6
+ endif
+
+ let ind=FortranGetIndent(lnum)
+ return ind
+endfunction
+
+let &cpoptions = s:cposet
+unlet s:cposet
+
+" vim:sw=2 tw=130
diff --git a/runtime/indent/framescript.vim b/runtime/indent/framescript.vim
new file mode 100644
index 0000000..4611d34
--- /dev/null
+++ b/runtime/indent/framescript.vim
@@ -0,0 +1,44 @@
+" Vim indent file
+" Language: FrameScript
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 24 Sep 2021
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetFrameScriptIndent()
+setlocal indentkeys=!^F,o,O,0=~Else,0=~EndIf,0=~EndLoop,0=~EndSub
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetFrameScriptIndent")
+ finish
+endif
+
+function GetFrameScriptIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+
+ if lnum == 0
+ return 0
+ endif
+
+ if getline(v:lnum) =~ '^\s*\*'
+ return cindent(v:lnum)
+ endif
+
+ let ind = indent(lnum)
+
+ if getline(lnum) =~? '^\s*\%(If\|Loop\|Sub\)'
+ let ind = ind + shiftwidth()
+ endif
+
+ if getline(v:lnum) =~? '^\s*\%(Else\|End\%(If\|Loop\|Sub\)\)'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/freebasic.vim b/runtime/indent/freebasic.vim
new file mode 100644
index 0000000..248b928
--- /dev/null
+++ b/runtime/indent/freebasic.vim
@@ -0,0 +1,11 @@
+" Vim indent file
+" Language: FreeBASIC
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jan 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/vb.vim
diff --git a/runtime/indent/gdscript.vim b/runtime/indent/gdscript.vim
new file mode 100644
index 0000000..39f68c6
--- /dev/null
+++ b/runtime/indent/gdscript.vim
@@ -0,0 +1,148 @@
+vim9script
+
+# Vim indent file
+# Language: gdscript (Godot game engine)
+# Maintainer: Maxim Kim <habamax@gmail.com>
+# Based on python indent file.
+
+if exists("b:did_indent")
+ finish
+endif
+b:did_indent = 1
+
+var undo_opts = "setl indentexpr< indentkeys< lisp< autoindent<"
+
+if exists('b:undo_indent')
+ b:undo_indent ..= "|" .. undo_opts
+else
+ b:undo_indent = undo_opts
+endif
+
+setlocal nolisp
+setlocal autoindent
+setlocal indentexpr=GDScriptIndent()
+setlocal indentkeys+=<:>,=elif,=except
+
+
+def GDScriptIndent(): number
+ # 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(v:lnum - 1) =~ '\\$'
+ if v:lnum > 1 && getline(v:lnum - 2) =~ '\\$'
+ return indent(v:lnum - 1)
+ endif
+ return indent(v:lnum - 1) + (shiftwidth() * 2)
+ endif
+
+ # If the start of the line is in a string don't change the indent.
+ if has('syntax_items') && synIDattr(synID(v:lnum, 1, 1), "name") =~ "String$"
+ return -1
+ endif
+
+ # Search backwards for the previous non-empty line.
+ var plnum = prevnonblank(v:lnum - 1)
+
+ if plnum == 0
+ # This is the first non-empty line, use zero indent.
+ return 0
+ endif
+
+ var plindent = indent(plnum)
+ var plnumstart = plnum
+
+ # Get the line and remove a trailing comment.
+ # Use syntax highlighting attributes when possible.
+ var pline = getline(plnum)
+ var pline_len = strlen(pline)
+ 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(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$"
+ var min = 1
+ var max = pline_len
+ while min < max
+ var col = (min + max) / 2
+ if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$"
+ max = col
+ else
+ min = col + 1
+ endif
+ endwhile
+ pline = strpart(pline, 0, min - 1)
+ endif
+ else
+ var col = 0
+ while col < pline_len
+ if pline[col] == '#'
+ pline = strpart(pline, 0, col)
+ break
+ endif
+ col = col + 1
+ endwhile
+ endif
+
+
+ # When "inside" parenthesis: If at the first line below the parenthesis add
+ # one 'shiftwidth' ("inside" is simplified and not really checked)
+ # my_var = (
+ # a
+ # + b
+ # + c
+ # )
+ if pline =~ '[({\[]\s*$'
+ return indent(plnum) + shiftwidth()
+ endif
+
+
+ # If the previous line ended with a colon, indent this line
+ if pline =~ ':\s*$'
+ return plindent + shiftwidth()
+ endif
+
+ # If the previous line was a stop-execution statement...
+ if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>'
+ # See if the user has already dedented
+ if indent(v:lnum) > indent(plnum) - shiftwidth()
+ # If not, recommend one dedent
+ return indent(plnum) - shiftwidth()
+ endif
+ # Otherwise, trust the user
+ return -1
+ endif
+
+ # If the current line begins with a keyword that lines up with "try"
+ if getline(v:lnum) =~ '^\s*\(except\|finally\)\>'
+ var lnum = v:lnum - 1
+ while lnum >= 1
+ if getline(lnum) =~ '^\s*\(try\|except\)\>'
+ var ind = indent(lnum)
+ if ind >= indent(v:lnum)
+ return -1 # indent is already less than this
+ endif
+ return ind # line up with previous try or except
+ endif
+ lnum = lnum - 1
+ endwhile
+ return -1 # no matching "try"!
+ endif
+
+
+ # If the current line begins with a header keyword, dedent
+ if getline(v:lnum) =~ '^\s*\(elif\|else\)\>'
+
+ # Unless the previous line was a one-liner
+ if getline(plnumstart) =~ '^\s*\(for\|if\|try\)\>'
+ return plindent
+ endif
+
+ # Or the user has already dedented
+ if indent(v:lnum) <= plindent - shiftwidth()
+ return -1
+ endif
+
+ return plindent - shiftwidth()
+ endif
+
+ return -1
+enddef
diff --git a/runtime/indent/gitconfig.vim b/runtime/indent/gitconfig.vim
new file mode 100644
index 0000000..6a670ee
--- /dev/null
+++ b/runtime/indent/gitconfig.vim
@@ -0,0 +1,38 @@
+" Vim indent file
+" Language: git config file
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2017 Jun 13
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetGitconfigIndent()
+setlocal indentkeys=o,O,*<Return>,0[,],0;,0#,=,!^F
+
+let b:undo_indent = 'setl ai< inde< indk<'
+
+" Only define the function once.
+if exists("*GetGitconfigIndent")
+ finish
+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
+ elseif cline =~ '^\s*\['
+ return 0
+ elseif cline =~ '^\s*\a'
+ return sw
+ elseif cline == '' && line =~ '^\['
+ return sw
+ else
+ return -1
+ endif
+endfunction
diff --git a/runtime/indent/gitolite.vim b/runtime/indent/gitolite.vim
new file mode 100644
index 0000000..22be687
--- /dev/null
+++ b/runtime/indent/gitolite.vim
@@ -0,0 +1,51 @@
+" Vim indent file
+" Language: gitolite configuration
+" 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: 2022 Apr 06
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetGitoliteIndent()
+setlocal indentkeys=o,O,*<Return>,!^F,=repo,\",=
+
+let b:undo_indent = "setl ai< inde< indk<"
+
+" Only define the function once.
+if exists("*GetGitoliteIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+function! GetGitoliteIndent()
+ let prevln = prevnonblank(v:lnum-1)
+ let pline = getline(prevln)
+ let cline = getline(v:lnum)
+
+ if cline =~ '^\s*\(C\|R\|RW\|RW+\|RWC\|RW+C\|RWD\|RW+D\|RWCD\|RW+CD\|-\)[ \t=]'
+ return shiftwidth()
+ elseif cline =~ '^\s*config\s'
+ return shiftwidth()
+ elseif cline =~ '^\s*option\s'
+ return shiftwidth()
+ elseif pline =~ '^\s*repo\s' && cline =~ '^\s*\(#.*\)\?$'
+ return shiftwidth()
+ elseif cline =~ '^\s*#'
+ return indent(prevln)
+ elseif cline =~ '^\s*$'
+ return -1
+ else
+ return 0
+ endif
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/go.vim b/runtime/indent/go.vim
new file mode 100644
index 0000000..bf9ff75
--- /dev/null
+++ b/runtime/indent/go.vim
@@ -0,0 +1,66 @@
+" Vim indent file
+" Language: Go
+" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
+" Last Change: 2017 Jun 13
+"
+" TODO:
+" - function invocations split across lines
+" - general line splits (line ends in an operator)
+
+if exists('b:did_indent')
+ finish
+endif
+let b:did_indent = 1
+
+" C indentation is too far off useful, mainly due to Go's := operator.
+" Let's just define our own.
+setlocal nolisp
+setlocal autoindent
+setlocal indentexpr=GoIndent(v:lnum)
+setlocal indentkeys+=<:>,0=},0=)
+
+if exists('*GoIndent')
+ finish
+endif
+
+function! GoIndent(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), '//.*$', '', '')
+ let l:thisl = substitute(getline(a:lnum), '//.*$', '', '')
+ let l:previ = indent(l:prevlnum)
+
+ let l:ind = l:previ
+
+ if l:prevl =~ '[({]\s*$'
+ " previous line opened a block
+ let l:ind += shiftwidth()
+ endif
+ if l:prevl =~# '^\s*\(case .*\|default\):$'
+ " previous line is part of a switch statement
+ 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 -= shiftwidth()
+ endif
+
+ " Colons are tricky.
+ " We want to outdent if it's part of a switch ("case foo:" or "default:").
+ " 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 -= shiftwidth()
+ endif
+
+ return l:ind
+endfunction
+
+" vim: sw=2 sts=2 et
diff --git a/runtime/indent/gyp.vim b/runtime/indent/gyp.vim
new file mode 100644
index 0000000..c3980ac
--- /dev/null
+++ b/runtime/indent/gyp.vim
@@ -0,0 +1,7 @@
+" Vim indent file
+" Language: GYP
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Last Change: 2022 Sep 27
+
+" JSON indent works well
+runtime! indent/json.vim
diff --git a/runtime/indent/haml.vim b/runtime/indent/haml.vim
new file mode 100644
index 0000000..acd99d9
--- /dev/null
+++ b/runtime/indent/haml.vim
@@ -0,0 +1,76 @@
+" Vim indent file
+" Language: Haml
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2022 Mar 15
+
+if exists("b:did_indent")
+ finish
+endif
+runtime! indent/ruby.vim
+unlet! b:did_indent
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetHamlIndent()
+setlocal indentkeys=o,O,*<Return>,},],0),!^F,=end,=else,=elsif,=rescue,=ensure,=when
+
+let b:undo_indent = "setl ai< inde< indk<"
+
+" Only define the function once.
+if exists("*GetHamlIndent")
+ finish
+endif
+
+let s:attributes = '\%({.\{-\}}\|\[.\{-\}\]\)'
+let s:tag = '\%([%.#][[:alnum:]_-]\+\|'.s:attributes.'\)*[<>]*'
+
+if !exists('g:haml_self_closing_tags')
+ let g:haml_self_closing_tags = 'base|link|meta|br|hr|img|input'
+endif
+
+function! GetHamlIndent()
+ let lnum = prevnonblank(v:lnum-1)
+ if lnum == 0
+ return 0
+ endif
+ let line = substitute(getline(lnum),'\s\+$','','')
+ let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','')
+ let lastcol = strlen(line)
+ 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
+ endif
+ let increase = indent + sw
+ if indent == indent(lnum)
+ let indent = cindent <= indent ? -1 : increase
+ endif
+
+ let group = synIDattr(synID(lnum,lastcol,1),'name')
+
+ if line =~ '^!!!'
+ return indent
+ elseif line =~ '^/\%(\[[^]]*\]\)\=$'
+ return increase
+ elseif group == 'hamlFilter'
+ return increase
+ elseif line =~ '^'.s:tag.'[&!]\=[=~-]\s*\%(\%(if\|else\|elsif\|unless\|case\|when\|while\|until\|for\|begin\|module\|class\|def\)\>\%(.*\<end\>\)\@!\|.*do\%(\s*|[^|]*|\)\=\s*$\)'
+ return increase
+ elseif line =~ '^'.s:tag.'[&!]\=[=~-].*,\s*$'
+ return increase
+ elseif line == '-#'
+ return increase
+ elseif group =~? '\v^(hamlSelfCloser)$' || line =~? '^%\v%('.g:haml_self_closing_tags.')>'
+ return indent
+ elseif group =~? '\v^%(hamlTag|hamlAttributesDelimiter|hamlObjectDelimiter|hamlClass|hamlId|htmlTagName|htmlSpecialTagName)$'
+ return increase
+ elseif synIDattr(synID(v:lnum,1,1),'name') ==? 'hamlRubyFilter'
+ return GetRubyIndent()
+ else
+ return indent
+ endif
+endfunction
+
+" vim:set sw=2:
diff --git a/runtime/indent/hamster.vim b/runtime/indent/hamster.vim
new file mode 100644
index 0000000..ae5c3fd
--- /dev/null
+++ b/runtime/indent/hamster.vim
@@ -0,0 +1,70 @@
+" Vim indent file
+" Language: Hamster Script
+" Version: 2.0.6.1
+" Last Change: 2021 Oct 11
+" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
+" Download: https://www.vim.org/scripts/script.php?script_id=1099
+"
+" 2.0.6.1 (Oct 2021)
+" Added b:undo_indent
+" Added cpo check
+"
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys+==~if,=~else,=~endif,=~endfor,=~endwhile
+setlocal indentkeys+==~do,=~until,=~while,=~repeat,=~for,=~loop
+setlocal indentkeys+==~sub,=~endsub
+
+let b:undo_indent = "setl indentkeys<"
+
+" Define the appropriate indent function but only once
+setlocal indentexpr=HamGetFreeIndent()
+if exists("*HamGetFreeIndent")
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+function HamGetIndent(lnum)
+ let ind = indent(a:lnum)
+ let prevline=getline(a: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 + 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 - shiftwidth()
+ endif
+
+ return ind
+endfunction
+
+function HamGetFreeIndent()
+ " Find the previous non-blank line
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Use zero indent at the top of the file
+ if lnum == 0
+ return 0
+ endif
+
+ let ind=HamGetIndent(lnum)
+ return ind
+endfunction
+
+" Restore:
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:sw=2 tw=80
diff --git a/runtime/indent/hare.vim b/runtime/indent/hare.vim
new file mode 100644
index 0000000..bc4fea4
--- /dev/null
+++ b/runtime/indent/hare.vim
@@ -0,0 +1,138 @@
+" Vim indent file
+" Language: Hare
+" Maintainer: Amelia Clarke <me@rsaihe.dev>
+" Last Change: 2022 Sep 22
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+if !has("cindent") || !has("eval")
+ finish
+endif
+
+setlocal cindent
+
+" L0 -> don't deindent labels
+" (s -> use one indent after a trailing (
+" m1 -> if ) starts a line, indent it the same as its matching (
+" ks -> add an extra indent to extra lines in an if expression or for expression
+" j1 -> indent code inside {} one level when in parentheses
+" J1 -> see j1
+" *0 -> don't search for unclosed block comments
+" #1 -> don't deindent lines that begin with #
+setlocal cinoptions=L0,(s,m1,ks,j1,J1,*0,#1
+
+" Controls which keys reindent the current line.
+" 0{ -> { at beginning of line
+" 0} -> } at beginning of line
+" 0) -> ) at beginning of line
+" 0] -> ] at beginning of line
+" !^F -> <C-f> (not inserted)
+" o -> <CR> or `o` command
+" O -> `O` command
+" e -> else
+" 0=case -> case
+setlocal indentkeys=0{,0},0),0],!^F,o,O,e,0=case
+
+setlocal cinwords=if,else,for,switch,match
+
+setlocal indentexpr=GetHareIndent()
+
+function! FloorCindent(lnum)
+ return cindent(a:lnum) / shiftwidth() * shiftwidth()
+endfunction
+
+function! GetHareIndent()
+ let line = getline(v:lnum)
+ let prevlnum = prevnonblank(v:lnum - 1)
+ let prevline = getline(prevlnum)
+ let prevprevline = getline(prevnonblank(prevlnum - 1))
+
+ " This is all very hacky and imperfect, but it's tough to do much better when
+ " working with regex-based indenting rules.
+
+ " If the previous line ended with =, indent by one shiftwidth.
+ if prevline =~# '\v\=\s*(//.*)?$'
+ return indent(prevlnum) + shiftwidth()
+ endif
+
+ " If the previous line ended in a semicolon and the line before that ended
+ " with =, deindent by one shiftwidth.
+ if prevline =~# '\v;\s*(//.*)?$' && prevprevline =~# '\v\=\s*(//.*)?$'
+ return indent(prevlnum) - shiftwidth()
+ endif
+
+ " TODO: The following edge-case is still indented incorrectly:
+ " case =>
+ " if (foo) {
+ " bar;
+ " };
+ " | // cursor is incorrectly deindented by one shiftwidth.
+ "
+ " This only happens if the {} block is the first statement in the case body.
+ " If `case` is typed, the case will also be incorrectly deindented by one
+ " shiftwidth. Are you having fun yet?
+
+ " Deindent cases.
+ if line =~# '\v^\s*case'
+ " If the previous line was also a case, don't do any special indenting.
+ if prevline =~# '\v^\s*case'
+ return indent(prevlnum)
+ end
+
+ " If the previous line was a multiline case, deindent by one shiftwidth.
+ if prevline =~# '\v\=\>\s*(//.*)?$'
+ return indent(prevlnum) - shiftwidth()
+ endif
+
+ " If the previous line started a block, deindent by one shiftwidth.
+ " This handles the first case in a switch/match block.
+ if prevline =~# '\v\{\s*(//.*)?$'
+ return FloorCindent(v:lnum) - shiftwidth()
+ end
+
+ " If the previous line ended in a semicolon and the line before that wasn't
+ " a case, deindent by one shiftwidth.
+ if prevline =~# '\v;\s*(//.*)?$' && prevprevline !~# '\v\=\>\s*(//.*)?$'
+ return FloorCindent(v:lnum) - shiftwidth()
+ end
+
+ let l:indent = FloorCindent(v:lnum)
+
+ " If a normal cindent would indent the same amount as the previous line,
+ " deindent by one shiftwidth. This fixes some issues with `case let` blocks.
+ if l:indent == indent(prevlnum)
+ return l:indent - shiftwidth()
+ endif
+
+ " Otherwise, do a normal cindent.
+ return l:indent
+ endif
+
+ " Don't indent an extra shiftwidth for cases which span multiple lines.
+ if prevline =~# '\v\=\>\s*(//.*)?$' && prevline !~# '\v^\s*case\W'
+ return indent(prevlnum)
+ endif
+
+ " Indent the body of a case.
+ " If the previous line ended in a semicolon and the line before that was a
+ " case, don't do any special indenting.
+ if prevline =~# '\v;\s*(//.*)?$' && prevprevline =~# '\v\=\>\s*(//.*)?$' && line !~# '\v^\s*}'
+ return indent(prevlnum)
+ endif
+
+ let l:indent = FloorCindent(v:lnum)
+
+ " If the previous line was a case and a normal cindent wouldn't indent, indent
+ " an extra shiftwidth.
+ if prevline =~# '\v\=\>\s*(//.*)?$' && l:indent == indent(prevlnum)
+ return l:indent + shiftwidth()
+ endif
+
+ " If everything above is false, do a normal cindent.
+ return l:indent
+endfunction
+
+" vim: tabstop=2 shiftwidth=2 expandtab
diff --git a/runtime/indent/hog.vim b/runtime/indent/hog.vim
new file mode 100644
index 0000000..ece587d
--- /dev/null
+++ b/runtime/indent/hog.vim
@@ -0,0 +1,77 @@
+" Vim indent file
+" Language: hog (Snort.conf)
+" Maintainer: Victor Roemer, <vroemer@badsec.org>
+" Last Change: Mar 7, 2013
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+let b:undo_indent = 'setlocal smartindent< indentexpr< indentkeys<'
+
+setlocal nosmartindent
+setlocal indentexpr=GetHogIndent()
+setlocal indentkeys+=!^F,o,O,0#
+
+" Only define the function once.
+if exists("*GetHogIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let s:syn_blocks = '\<SnortRuleTypeBody\>'
+
+function s:IsInBlock(lnum)
+ return synIDattr(synID(a:lnum, 1, 1), 'name') =~ s:syn_blocks
+endfunction
+
+function GetHogIndent()
+ let prevlnum = prevnonblank(v:lnum-1)
+
+ " Comment blocks have identical indent
+ if getline(v:lnum) =~ '^\s*#' && getline(prevlnum) =~ '^\s*#'
+ return indent(prevlnum)
+ endif
+
+ " Ignore comment lines when calculating indent
+ while getline(prevlnum) =~ '^\s*#'
+ let prevlnum = prevnonblank(prevlnum-1)
+ if !prevlnum
+ return previndent
+ endif
+ endwhile
+
+ " Continuation of a line that wasn't indented
+ let prevline = getline(prevlnum)
+ if prevline =~ '^\k\+.*\\\s*$'
+ return shiftwidth()
+ endif
+
+ " Continuation of a line that was indented
+ if prevline =~ '\k\+.*\\\s*$'
+ return indent(prevlnum)
+ endif
+
+ " Indent the next line if previous line contained a start of a block
+ " definition ('{' or '(').
+ if prevline =~ '^\k\+[^#]*{}\@!\s*$' " TODO || prevline =~ '^\k\+[^#]*()\@!\s*$'
+ return shiftwidth()
+ endif
+
+ " Match inside of a block
+ if s:IsInBlock(v:lnum)
+ if prevline =~ "^\k\+.*$"
+ return shiftwidth()
+ else
+ return indent(prevlnum)
+ endif
+ endif
+
+ return 0
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/html.vim b/runtime/indent/html.vim
new file mode 100644
index 0000000..65e0ffc
--- /dev/null
+++ b/runtime/indent/html.vim
@@ -0,0 +1,1094 @@
+" Vim indent script for HTML
+" Maintainer: Bram Moolenaar
+" Original Author: Andy Wokula <anwoku@yahoo.de>
+" Last Change: 2022 Jan 31
+" Version: 1.0 "{{{
+" Description: HTML indent script with cached state for faster indenting on a
+" range of lines.
+" Supports template systems through hooks.
+" Supports Closure stylesheets.
+"
+" Credits:
+" indent/html.vim (2006 Jun 05) from J. Zellner
+" indent/css.vim (2006 Dec 20) from N. Weibull
+"
+" History:
+" 2014 June (v1.0) overhaul (Bram)
+" 2012 Oct 21 (v0.9) added support for shiftwidth()
+" 2011 Sep 09 (v0.8) added HTML5 tags (thx to J. Zuckerman)
+" 2008 Apr 28 (v0.6) revised customization
+" 2008 Mar 09 (v0.5) fixed 'indk' issue (thx to C.J. Robinson)
+"}}}
+
+" Init Folklore, check user settings (2nd time ++)
+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
+
+" Needed for % to work when finding start/end of a tag.
+setlocal matchpairs+=<:>
+
+let b:undo_indent = "setlocal inde< indk<"
+
+" b:hi_indent keeps state to speed up indenting consecutive lines.
+let b:hi_indent = {"lnum": -1}
+
+"""""" Code below this is loaded only once. """""
+if exists("*HtmlIndent") && !exists('g:force_reload_html')
+ call HtmlIndent_CheckUserSettings()
+ finish
+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
+" files.
+func HtmlIndent_CheckUserSettings()
+ "{{{
+ let inctags = ''
+ if exists("b:html_indent_inctags")
+ let inctags = b:html_indent_inctags
+ elseif exists("g:html_indent_inctags")
+ let inctags = g:html_indent_inctags
+ endif
+ let b:hi_tags = {}
+ if len(inctags) > 0
+ call s:AddITags(b:hi_tags, split(inctags, ","))
+ endif
+
+ let autotags = ''
+ if exists("b:html_indent_autotags")
+ let autotags = b:html_indent_autotags
+ elseif exists("g:html_indent_autotags")
+ let autotags = g:html_indent_autotags
+ endif
+ let b:hi_removed_tags = {}
+ if len(autotags) > 0
+ call s:RemoveITags(b:hi_removed_tags, split(autotags, ","))
+ endif
+
+ " Syntax names indicating being inside a string of an attribute value.
+ let string_names = []
+ if exists("b:html_indent_string_names")
+ let string_names = b:html_indent_string_names
+ elseif exists("g:html_indent_string_names")
+ let string_names = g:html_indent_string_names
+ endif
+ let b:hi_insideStringNames = ['htmlString']
+ if len(string_names) > 0
+ for s in string_names
+ call add(b:hi_insideStringNames, s)
+ endfor
+ endif
+
+ " Syntax names indicating being inside a tag.
+ let tag_names = []
+ if exists("b:html_indent_tag_names")
+ let tag_names = b:html_indent_tag_names
+ elseif exists("g:html_indent_tag_names")
+ let tag_names = g:html_indent_tag_names
+ endif
+ let b:hi_insideTagNames = ['htmlTag', 'htmlScriptTag']
+ if len(tag_names) > 0
+ for s in tag_names
+ call add(b:hi_insideTagNames, s)
+ endfor
+ endif
+
+ let indone = {"zero": 0
+ \,"auto": "indent(prevnonblank(v:lnum-1))"
+ \,"inc": "b:hi_indent.blocktagind + shiftwidth()"}
+
+ let script1 = ''
+ if exists("b:html_indent_script1")
+ let script1 = b:html_indent_script1
+ elseif exists("g:html_indent_script1")
+ let script1 = g:html_indent_script1
+ endif
+ if len(script1) > 0
+ let b:hi_js1indent = get(indone, script1, indone.zero)
+ else
+ let b:hi_js1indent = 0
+ endif
+
+ let style1 = ''
+ if exists("b:html_indent_style1")
+ let style1 = b:html_indent_style1
+ elseif exists("g:html_indent_style1")
+ let style1 = g:html_indent_style1
+ endif
+ if len(style1) > 0
+ let b:hi_css1indent = get(indone, style1, indone.zero)
+ else
+ let b:hi_css1indent = 0
+ endif
+
+ if !exists('b:html_indent_line_limit')
+ if exists('g:html_indent_line_limit')
+ let b:html_indent_line_limit = g:html_indent_line_limit
+ else
+ let b:html_indent_line_limit = 200
+ endif
+ endif
+
+ if exists('b:html_indent_attribute')
+ let b:hi_attr_indent = b:html_indent_attribute
+ elseif exists('g:html_indent_attribute')
+ let b:hi_attr_indent = g:html_indent_attribute
+ else
+ let b:hi_attr_indent = 2
+ endif
+
+endfunc "}}}
+
+" Init Script Vars
+"{{{
+let b:hi_lasttick = 0
+let b:hi_newstate = {}
+let s:countonly = 0
+ "}}}
+
+" Fill the s:indent_tags dict with known tags.
+" The key is "tagname" or "/tagname". {{{
+" The value is:
+" 1 opening tag
+" 2 "pre"
+" 3 "script"
+" 4 "style"
+" 5 comment start
+" 6 conditional comment start
+" -1 closing tag
+" -2 "/pre"
+" -3 "/script"
+" -4 "/style"
+" -5 comment end
+" -6 conditional comment end
+let s:indent_tags = {}
+let s:endtags = [0,0,0,0,0,0,0] " long enough for the highest index
+"}}}
+
+" Add a list of tag names for a pair of <tag> </tag> to "tags".
+func s:AddITags(tags, taglist)
+ "{{{
+ for itag in a:taglist
+ let a:tags[itag] = 1
+ let a:tags['/' . itag] = -1
+ endfor
+endfunc "}}}
+
+" Take a list of tag name pairs that are not to be used as tag pairs.
+func s:RemoveITags(tags, taglist)
+ "{{{
+ for itag in a:taglist
+ let a:tags[itag] = 1
+ let a:tags['/' . itag] = 1
+ endfor
+endfunc "}}}
+
+" Add a block tag, that is a tag with a different kind of indenting.
+func s:AddBlockTag(tag, id, ...)
+ "{{{
+ if !(a:id >= 2 && a:id < len(s:endtags))
+ echoerr 'AddBlockTag ' . a:id
+ return
+ endif
+ let s:indent_tags[a:tag] = a:id
+ if a:0 == 0
+ let s:indent_tags['/' . a:tag] = -a:id
+ let s:endtags[a:id] = "</" . a:tag . ">"
+ else
+ let s:indent_tags[a:1] = -a:id
+ let s:endtags[a:id] = a:1
+ endif
+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).
+" Known self-closing tags: " 'p', 'img', 'source', 'area', 'keygen', 'track',
+" 'wbr'.
+" Old HTML tags:
+call s:AddITags(s:indent_tags, [
+ \ 'a', 'abbr', 'acronym', 'address', 'b', 'bdo', 'big',
+ \ 'blockquote', 'body', 'button', 'caption', 'center', 'cite', 'code',
+ \ 'colgroup', 'dd', 'del', 'dfn', 'dir', 'div', 'dl', 'dt', 'em', 'fieldset', 'font',
+ \ 'form', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'html',
+ \ 'i', 'iframe', 'ins', 'kbd', 'label', 'legend', 'li',
+ \ 'map', 'menu', 'noframes', 'noscript', 'object', 'ol',
+ \ 'optgroup', 'q', 's', 'samp', 'select', 'small', 'span', 'strong', 'sub',
+ \ 'sup', 'table', 'textarea', 'title', 'tt', 'u', 'ul', 'var', 'th', 'td',
+ \ 'tr', 'tbody', 'tfoot', 'thead'])
+
+" New HTML5 elements:
+call s:AddITags(s:indent_tags, [
+ \ 'article', 'aside', 'audio', 'bdi', 'canvas', 'command', 'data',
+ \ 'datalist', 'details', 'dialog', 'embed', 'figcaption', 'figure',
+ \ 'footer', 'header', 'hgroup', 'main', 'mark', 'meter', 'nav', 'output',
+ \ 'picture', 'progress', 'rp', 'rt', 'ruby', 'section', 'summary',
+ \ 'svg', 'time', 'video'])
+
+" Tags added for web components:
+call s:AddITags(s:indent_tags, [
+ \ 'content', 'shadow', 'template'])
+"}}}
+
+" Add Block Tags: these contain alien content
+"{{{
+call s:AddBlockTag('pre', 2)
+call s:AddBlockTag('script', 3)
+call s:AddBlockTag('style', 4)
+call s:AddBlockTag('<!--', 5, '-->')
+call s:AddBlockTag('<!--[', 6, '![endif]-->')
+"}}}
+
+" Return non-zero when "tagname" is an opening tag, not being a block tag, for
+" which there should be a closing tag. Can be used by scripts that include
+" HTML indenting.
+func HtmlIndent_IsOpenTag(tagname)
+ "{{{
+ if get(s:indent_tags, a:tagname) == 1
+ return 1
+ endif
+ return get(b:hi_tags, a:tagname) == 1
+endfunc "}}}
+
+" Get the value for "tagname", taking care of buffer-local tags.
+func s:get_tag(tagname)
+ "{{{
+ let i = get(s:indent_tags, a:tagname)
+ if (i == 1 || i == -1) && get(b:hi_removed_tags, a:tagname) != 0
+ return 0
+ endif
+ if i == 0
+ let i = get(b:hi_tags, a:tagname)
+ endif
+ return i
+endfunc "}}}
+
+" Count the number of start and end tags in "text".
+func s:CountITags(text)
+ "{{{
+ " Store the result in s:curind and s:nextrel.
+ let s:curind = 0 " relative indent steps for current line [unit &sw]:
+ 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/\=' . s:tagname . '\>\|<!--\[\|\[endif\]-->\|<!--\|-->', '\=s:CheckTag(submatch(0))', 'g')
+ let s:countonly = 0
+endfunc "}}}
+
+" Count the number of start and end tags in text.
+func s:CountTagsAndState(text)
+ "{{{
+ " Store the result in s:curind and s:nextrel. Update b:hi_newstate.block.
+ let s:curind = 0 " relative indent steps for current line [unit &sw]:
+ 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/\=' . 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
+ let b:hi_newstate.block = s:block
+endfunc "}}}
+
+" Used by s:CountITags() and s:CountTagsAndState().
+func s:CheckTag(itag)
+ "{{{
+ " Returns an empty string or "SCRIPT".
+ " a:itag can be "tag" or "/tag" or "<!--" or "-->"
+ if (s:CheckCustomTag(a:itag))
+ return ""
+ endif
+ let ind = s:get_tag(a:itag)
+ if ind == -1
+ " closing tag
+ if s:block != 0
+ " ignore itag within a block
+ return ""
+ endif
+ if s:nextrel == 0
+ let s:curind -= 1
+ else
+ let s:nextrel -= 1
+ endif
+ elseif ind == 1
+ " opening tag
+ if s:block != 0
+ return ""
+ endif
+ let s:nextrel += 1
+ elseif ind != 0
+ " block-tag (opening or closing)
+ return s:CheckBlockTag(a:itag, ind)
+ " else ind==0 (other tag found): keep indent
+ endif
+ return ""
+endfunc "}}}
+
+" Used by s:CheckTag(). Returns an empty string or "SCRIPT".
+func s:CheckBlockTag(blocktag, ind)
+ "{{{
+ if a:ind > 0
+ " a block starts here
+ if s:block != 0
+ " already in a block (nesting) - ignore
+ " especially ignore comments after other blocktags
+ return ""
+ endif
+ let s:block = a:ind " block type
+ if s:countonly
+ return ""
+ 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) * shiftwidth()
+ if a:ind == 3
+ return "SCRIPT" " all except this must be lowercase
+ " line is to be checked again for the type attribute
+ endif
+ else
+ let s:block = 0
+ " we get here if starting and closing a block-tag on the same line
+ endif
+ return ""
+endfunc "}}}
+
+" Used by s:CheckTag().
+func s:CheckCustomTag(ctag)
+ "{{{
+ " Returns 1 if ctag is the tag for a custom element, 0 otherwise.
+ " a:ctag can be "tag" or "/tag" or "<!--" or "-->"
+ let pattern = '\%\(\w\+-\)\+\w\+'
+ if match(a:ctag, pattern) == -1
+ return 0
+ endif
+ if matchstr(a:ctag, '\/\ze.\+') == "/"
+ " closing tag
+ if s:block != 0
+ " ignore ctag within a block
+ return 1
+ endif
+ if s:nextrel == 0
+ let s:curind -= 1
+ else
+ let s:nextrel -= 1
+ endif
+ else
+ " opening tag
+ if s:block != 0
+ return 1
+ endif
+ let s:nextrel += 1
+ endif
+ return 1
+endfunc "}}}
+
+" Return the <script> type: either "javascript" or ""
+func s:GetScriptType(str)
+ "{{{
+ if a:str == "" || a:str =~ "java"
+ return "javascript"
+ else
+ return ""
+ endif
+endfunc "}}}
+
+" Look back in the file, starting at a:lnum - 1, to compute a state for the
+" start of line a:lnum. Return the new state.
+func s:FreshState(lnum)
+ "{{{
+ " A state is to know ALL relevant details about the
+ " lines 1..a:lnum-1, initial calculating (here!) can be slow, but updating is
+ " fast (incremental).
+ " TODO: this should be split up in detecting the block type and computing the
+ " indent for the block type, so that when we do not know the indent we do
+ " not need to clear the whole state and re-detect the block type again.
+ " State:
+ " lnum last indented line == prevnonblank(a:lnum - 1)
+ " block = 0 a:lnum located within special tag: 0:none, 2:<pre>,
+ " 3:<script>, 4:<style>, 5:<!--, 6:<!--[
+ " baseindent use this indent for line a:lnum as a start - kind of
+ " autoindent (if block==0)
+ " scripttype = '' type attribute of a script tag (if block==3)
+ " blocktagind indent for current opening (get) and closing (set)
+ " blocktag (if block!=0)
+ " blocklnr lnum of starting blocktag (if block!=0)
+ " inattr line {lnum} starts with attributes of a tag
+ let state = {}
+ let state.lnum = prevnonblank(a:lnum - 1)
+ let state.scripttype = ""
+ let state.blocktagind = -1
+ let state.block = 0
+ let state.baseindent = 0
+ let state.blocklnr = 0
+ let state.inattr = 0
+
+ if state.lnum == 0
+ return state
+ endif
+
+ " Heuristic:
+ " remember startline state.lnum
+ " look back for <pre, </pre, <script, </script, <style, </style tags
+ " remember stopline
+ " if opening tag found,
+ " assume a:lnum within block
+ " else
+ " look back in result range (stopline, startline) for comment
+ " \ delimiters (<!--, -->)
+ " if comment opener found,
+ " assume a:lnum within comment
+ " else
+ " assume usual html for a:lnum
+ " if a:lnum-1 has a closing comment
+ " look back to get indent of comment opener
+ " FI
+
+ " look back for a blocktag
+ let stopline2 = v:lnum + 1
+ if has_key(b:hi_indent, 'block') && b:hi_indent.block > 5
+ let [stopline2, stopcol2] = searchpos('<!--', 'bnW')
+ endif
+ let [stopline, stopcol] = searchpos('\c<\zs\/\=\%(pre\>\|script\>\|style\>\)', "bnW")
+ if stopline > 0 && stopline < stopline2
+ " ugly ... why isn't there searchstr()
+ let tagline = tolower(getline(stopline))
+ let blocktag = matchstr(tagline, '\/\=\%(pre\>\|script\>\|style\>\)', stopcol - 1)
+ if blocktag[0] != "/"
+ " opening tag found, assume a:lnum within block
+ let state.block = s:indent_tags[blocktag]
+ if state.block == 3
+ let state.scripttype = s:GetScriptType(matchstr(tagline, '\>[^>]*', stopcol))
+ endif
+ 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) * shiftwidth()
+ return state
+ elseif stopline == state.lnum
+ " handle special case: previous line (= state.lnum) contains a
+ " closing blocktag which is preceded by line-noise;
+ " blocktag == "/..."
+ let swendtag = match(tagline, '^\s*</') >= 0
+ 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) * shiftwidth()
+ return state
+ endif
+ endif
+ endif
+ if stopline > stopline2
+ let stopline = stopline2
+ let stopcol = stopcol2
+ endif
+
+ " else look back for comment
+ let [comlnum, comcol, found] = searchpos('\(<!--\[\)\|\(<!--\)\|-->', 'bpnW', stopline)
+ if found == 2 || found == 3
+ " comment opener found, assume a:lnum within comment
+ let state.block = (found == 3 ? 5 : 6)
+ let state.blocklnr = comlnum
+ " check preceding tags in the line:
+ call s:CountITags(tolower(getline(comlnum)[: comcol-2]))
+ if found == 2
+ let state.baseindent = b:hi_indent.baseindent
+ endif
+ let state.blocktagind = indent(comlnum) + (s:curind + s:nextrel) * shiftwidth()
+ return state
+ endif
+
+ " else within usual HTML
+ let text = tolower(getline(state.lnum))
+
+ " Check a:lnum-1 for closing comment (we need indent from the opening line).
+ " Not when other tags follow (might be --> inside a string).
+ let comcol = stridx(text, '-->')
+ if comcol >= 0 && match(text, '[<>]', comcol) <= 0
+ call cursor(state.lnum, comcol + 1)
+ let [comlnum, comcol] = searchpos('<!--', 'bW')
+ if comlnum == state.lnum
+ let text = text[: comcol-2]
+ else
+ let text = tolower(getline(comlnum)[: comcol-2])
+ endif
+ call s:CountITags(text)
+ let state.baseindent = indent(comlnum) + (s:curind + s:nextrel) * shiftwidth()
+ " TODO check tags that follow "-->"
+ return state
+ endif
+
+ " Check if the previous line starts with end tag.
+ let swendtag = match(text, '^\s*</') >= 0
+
+ " If previous line ended in a closing tag, line up with the opening tag.
+ if !swendtag && text =~ '</' . s:tagname . '\s*>\s*$'
+ call cursor(state.lnum, 99999)
+ normal! F<
+ let start_lnum = HtmlIndent_FindStartTag()
+ if start_lnum > 0
+ let state.baseindent = indent(start_lnum)
+ if col('.') > 2
+ " check for tags before the matching opening tag.
+ let text = getline(start_lnum)
+ let swendtag = match(text, '^\s*</') >= 0
+ call s:CountITags(text[: col('.') - 2])
+ let state.baseindent += s:nextrel * shiftwidth()
+ if !swendtag
+ let state.baseindent += s:curind * shiftwidth()
+ endif
+ endif
+ return state
+ endif
+ endif
+
+ " Else: no comments. Skip backwards to find the tag we're inside.
+ let [state.lnum, found] = HtmlIndent_FindTagStart(state.lnum)
+ " Check if that line starts with end tag.
+ let text = getline(state.lnum)
+ let swendtag = match(text, '^\s*</') >= 0
+ call s:CountITags(tolower(text))
+ let state.baseindent = indent(state.lnum) + s:nextrel * shiftwidth()
+ if !swendtag
+ let state.baseindent += s:curind * shiftwidth()
+ endif
+ return state
+endfunc "}}}
+
+" Indent inside a <pre> block: Keep indent as-is.
+func s:Alien2()
+ "{{{
+ return -1
+endfunc "}}}
+
+" Return the indent inside a <script> block for javascript.
+func s:Alien3()
+ "{{{
+ let lnum = prevnonblank(v:lnum - 1)
+ while lnum > 1 && getline(lnum) =~ '^\s*/[/*]'
+ " Skip over comments to avoid that cindent() aligns with the <script> tag
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ if lnum < b:hi_indent.blocklnr
+ " indent for <script> itself
+ return b:hi_indent.blocktagind
+ endif
+ if lnum == b:hi_indent.blocklnr
+ " indent for the first line after <script>
+ return eval(b:hi_js1indent)
+ endif
+ if b:hi_indent.scripttype == "javascript"
+ " indent for further lines
+ return GetJavascriptIndent()
+ else
+ return -1
+ endif
+endfunc "}}}
+
+" Return the indent inside a <style> block.
+func s:Alien4()
+ "{{{
+ if prevnonblank(v:lnum-1) == b:hi_indent.blocklnr
+ " indent for first content line
+ return eval(b:hi_css1indent)
+ endif
+ return s:CSSIndent()
+endfunc "}}}
+
+" Indending inside a <style> block. Returns the indent.
+func s:CSSIndent()
+ "{{{
+ " This handles standard CSS and also Closure stylesheets where special lines
+ " start with @.
+ " When the line starts with '*' or the previous line starts with "/*"
+ " and does not end in "*/", use C indenting to format the comment.
+ " Adopted $VIMRUNTIME/indent/css.vim
+ let curtext = getline(v:lnum)
+ if curtext =~ '^\s*[*]'
+ \ || (v:lnum > 1 && getline(v:lnum - 1) =~ '\s*/\*'
+ \ && getline(v:lnum - 1) !~ '\*/\s*$')
+ return cindent(v:lnum)
+ endif
+
+ let min_lnum = b:hi_indent.blocklnr
+ let prev_lnum = s:CssPrevNonComment(v:lnum - 1, min_lnum)
+ let [prev_lnum, found] = HtmlIndent_FindTagStart(prev_lnum)
+ if prev_lnum <= min_lnum
+ " Just below the <style> tag, indent for first content line after comments.
+ return eval(b:hi_css1indent)
+ endif
+
+ " If the current line starts with "}" align with its match.
+ if curtext =~ '^\s*}'
+ call cursor(v:lnum, 1)
+ try
+ normal! %
+ " Found the matching "{", align with it after skipping unfinished lines.
+ let align_lnum = s:CssFirstUnfinished(line('.'), min_lnum)
+ return indent(align_lnum)
+ catch
+ " can't find it, try something else, but it's most likely going to be
+ " wrong
+ endtry
+ endif
+
+ " add indent after {
+ let brace_counts = HtmlIndent_CountBraces(prev_lnum)
+ let extra = brace_counts.c_open * shiftwidth()
+
+ let prev_text = getline(prev_lnum)
+ let below_end_brace = prev_text =~ '}\s*$'
+
+ " Search back to align with the first line that's unfinished.
+ let align_lnum = s:CssFirstUnfinished(prev_lnum, min_lnum)
+
+ " Handle continuation lines if aligning with previous line and not after a
+ " "}".
+ if extra == 0 && align_lnum == prev_lnum && !below_end_brace
+ let prev_hasfield = prev_text =~ '^\s*[a-zA-Z0-9-]\+:'
+ let prev_special = prev_text =~ '^\s*\(/\*\|@\)'
+ if curtext =~ '^\s*\(/\*\|@\)'
+ " 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 = -shiftwidth()
+ endif
+ else
+ let cur_hasfield = curtext =~ '^\s*[a-zA-Z0-9-]\+:'
+ let prev_unfinished = s:CssUnfinished(prev_text)
+ if prev_unfinished
+ " Continuation line has extra indent if the previous line was not a
+ " continuation line.
+ 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 = -shiftwidth()
+ endif
+ endif
+ endif
+
+ if below_end_brace
+ " find matching {, if that line starts with @ it's not the start of a rule
+ " but something else from a template system
+ call cursor(prev_lnum, 1)
+ call search('}\s*$')
+ try
+ normal! %
+ " Found the matching "{", align with it.
+ let align_lnum = s:CssFirstUnfinished(line('.'), min_lnum)
+ let special = getline(align_lnum) =~ '^\s*@'
+ catch
+ let special = 0
+ endtry
+ if special
+ " do not reduce indent below @{ ... }
+ if extra < 0
+ let extra += shiftwidth()
+ endif
+ else
+ let extra -= (brace_counts.c_close - (prev_text =~ '^\s*}')) * shiftwidth()
+ endif
+ endif
+
+ " if no extra indent yet...
+ if extra == 0
+ if brace_counts.p_open > brace_counts.p_close
+ " previous line has more ( than ): add a shiftwidth
+ let extra = shiftwidth()
+ elseif brace_counts.p_open < brace_counts.p_close
+ " previous line has more ) than (: subtract a shiftwidth
+ let extra = -shiftwidth()
+ endif
+ endif
+
+ return indent(align_lnum) + extra
+endfunc "}}}
+
+" Inside <style>: Whether a line is unfinished.
+" tag:
+" tag: blah
+" tag: blah &&
+" tag: blah ||
+func s:CssUnfinished(text)
+ "{{{
+ return a:text =~ '\(||\|&&\|:\|\k\)\s*$'
+endfunc "}}}
+
+" Search back for the first unfinished line above "lnum".
+func s:CssFirstUnfinished(lnum, min_lnum)
+ "{{{
+ let align_lnum = a:lnum
+ while align_lnum > a:min_lnum && s:CssUnfinished(getline(align_lnum - 1))
+ let align_lnum -= 1
+ endwhile
+ return align_lnum
+endfunc "}}}
+
+" Find the non-empty line at or before "lnum" that is not a comment.
+func s:CssPrevNonComment(lnum, stopline)
+ "{{{
+ " caller starts from a line a:lnum + 1 that is not a comment
+ let lnum = prevnonblank(a:lnum)
+ while 1
+ let ccol = match(getline(lnum), '\*/')
+ if ccol < 0
+ " No comment end thus it's something else.
+ return lnum
+ endif
+ call cursor(lnum, ccol + 1)
+ " Search back for the /* that starts the comment
+ let lnum = search('/\*', 'bW', a:stopline)
+ if indent(".") == virtcol(".") - 1
+ " The found /* is at the start of the line. Now go back to the line
+ " above it and again check if it is a comment.
+ let lnum = prevnonblank(lnum - 1)
+ else
+ " /* is after something else, thus it's not a comment line.
+ return lnum
+ endif
+ endwhile
+endfunc "}}}
+
+" Check the number of {} and () in line "lnum". Return a dict with the counts.
+func HtmlIndent_CountBraces(lnum)
+ "{{{
+ let brs = substitute(getline(a:lnum), '[''"].\{-}[''"]\|/\*.\{-}\*/\|/\*.*$\|[^{}()]', '', 'g')
+ let c_open = 0
+ let c_close = 0
+ let p_open = 0
+ let p_close = 0
+ for brace in split(brs, '\zs')
+ if brace == "{"
+ let c_open += 1
+ elseif brace == "}"
+ if c_open > 0
+ let c_open -= 1
+ else
+ let c_close += 1
+ endif
+ elseif brace == '('
+ let p_open += 1
+ elseif brace == ')'
+ if p_open > 0
+ let p_open -= 1
+ else
+ let p_close += 1
+ endif
+ endif
+ endfor
+ return {'c_open': c_open,
+ \ 'c_close': c_close,
+ \ 'p_open': p_open,
+ \ 'p_close': p_close}
+endfunc "}}}
+
+" Return the indent for a comment: <!-- -->
+func s:Alien5()
+ "{{{
+ let curtext = getline(v:lnum)
+ if curtext =~ '^\s*\zs-->'
+ " current line starts with end of comment, line up with comment start.
+ call cursor(v:lnum, 0)
+ let lnum = search('<!--', 'b')
+ if lnum > 0
+ " TODO: what if <!-- is not at the start of the line?
+ return indent(lnum)
+ endif
+
+ " Strange, can't find it.
+ return -1
+ endif
+
+ let prevlnum = prevnonblank(v:lnum - 1)
+ let prevtext = getline(prevlnum)
+ let idx = match(prevtext, '^\s*\zs<!--')
+ if idx >= 0
+ " just below comment start, add a shiftwidth
+ return indent(prevlnum) + shiftwidth()
+ endif
+
+ " Some files add 4 spaces just below a TODO line. It's difficult to detect
+ " the end of the TODO, so let's not do that.
+
+ " Align with the previous non-blank line.
+ return indent(prevlnum)
+endfunc "}}}
+
+" Return the indent for conditional comment: <!--[ ![endif]-->
+func s:Alien6()
+ "{{{
+ let curtext = getline(v:lnum)
+ if curtext =~ '\s*\zs<!\[endif\]-->'
+ " current line starts with end of comment, line up with comment start.
+ let lnum = search('<!--', 'bn')
+ if lnum > 0
+ return indent(lnum)
+ endif
+ endif
+ return b:hi_indent.baseindent + shiftwidth()
+endfunc "}}}
+
+" When the "lnum" line ends in ">" find the line containing the matching "<".
+func HtmlIndent_FindTagStart(lnum)
+ "{{{
+ " Avoids using the indent of a continuation line.
+ " Moves the cursor.
+ " Return two values:
+ " - the matching line number or "lnum".
+ " - a flag indicating whether we found the end of a tag.
+ " This method is global so that HTML-like indenters can use it.
+ " To avoid matching " > " or " < " inside a string require that the opening
+ " "<" is followed by a word character and the closing ">" comes after a
+ " non-white character.
+ let idx = match(getline(a:lnum), '\S>\s*$')
+ if idx > 0
+ call cursor(a:lnum, idx)
+ let lnum = searchpair('<\w', '' , '\S>', 'bW', '', max([a:lnum - b:html_indent_line_limit, 0]))
+ if lnum > 0
+ return [lnum, 1]
+ endif
+ endif
+ return [a:lnum, 0]
+endfunc "}}}
+
+" Find the unclosed start tag from the current cursor position.
+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' . s:tagname . '\ze')
+ let start_lnum = searchpair('<' . tagname . '\>', '', '</' . tagname . '\>', 'bW')
+ if start_lnum > 0
+ return start_lnum
+ endif
+ return 0
+endfunc "}}}
+
+" Moves the cursor from a "<" to the matching ">".
+func HtmlIndent_FindTagEnd()
+ "{{{
+ " Call this with the cursor on the "<" of a start tag.
+ " This will move the cursor to the ">" of the matching end tag or, when it's
+ " 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, s:tagname . '\|!--', col('.'))
+ if tagname == '!--'
+ call search('--\zs>')
+ elseif s:get_tag('/' . tagname) != 0
+ " tag with a closing tag, find matching "</tag>"
+ call searchpair('<' . tagname, '', '</' . tagname . '\zs>', 'W', '', line('.') + b:html_indent_line_limit)
+ else
+ " self-closing tag, find the ">"
+ call search('\S\zs>')
+ endif
+endfunc "}}}
+
+" Indenting inside a start tag. Return the correct indent or -1 if unknown.
+func s:InsideTag(foundHtmlString)
+ "{{{
+ if a:foundHtmlString
+ " Inside an attribute string.
+ " Align with the opening quote or use an external function.
+ let lnum = v:lnum - 1
+ if lnum > 1
+ if exists('b:html_indent_tag_string_func')
+ return b:html_indent_tag_string_func(lnum)
+ endif
+ " If there is a double quote in the previous line, indent with the
+ " character after it.
+ if getline(lnum) =~ '"'
+ call cursor(lnum, 0)
+ normal f"
+ return virtcol('.')
+ endif
+ return indent(lnum)
+ endif
+ endif
+
+ " Should be another attribute: " attr="val". Align with the previous
+ " attribute start.
+ let lnum = v:lnum
+ while lnum > 1
+ let lnum -= 1
+ let text = getline(lnum)
+ " Find a match with one of these, align with "attr":
+ " attr=
+ " <tag attr=
+ " text<tag attr=
+ " <tag>text</tag>text<tag attr=
+ " For long lines search for the first match, finding the last match
+ " gets very slow.
+ if len(text) < 300
+ let idx = match(text, '.*\s\zs[_a-zA-Z0-9-]\+="')
+ 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 two levels more by default
+ let idx = match(text, '<' . s:tagname . '$')
+ if idx >= 0
+ call cursor(lnum, idx + 1)
+ return virtcol('.') - 1 + shiftwidth() * b:hi_attr_indent
+ endif
+ endif
+ if idx > 0
+ " Found the attribute to align with.
+ call cursor(lnum, idx)
+ return virtcol('.')
+ endif
+ endwhile
+ return -1
+endfunc "}}}
+
+" THE MAIN INDENT FUNCTION. Return the amount of indent for v:lnum.
+func HtmlIndent()
+ "{{{
+ if prevnonblank(v:lnum - 1) < 1
+ " First non-blank line has no indent.
+ return 0
+ endif
+
+ let curtext = tolower(getline(v:lnum))
+ let indentunit = shiftwidth()
+
+ let b:hi_newstate = {}
+ let b:hi_newstate.lnum = v:lnum
+
+ " When syntax HL is enabled, detect we are inside a tag. Indenting inside
+ " a tag works very differently. Do not do this when the line starts with
+ " "<", it gets the "htmlTag" ID but we are not inside a tag then.
+ if curtext !~ '^\s*<'
+ normal! ^
+ let stack = synstack(v:lnum, col('.')) " assumes there are no tabs
+ let foundHtmlString = 0
+ for synid in reverse(stack)
+ let name = synIDattr(synid, "name")
+ if index(b:hi_insideStringNames, name) >= 0
+ let foundHtmlString = 1
+ elseif index(b:hi_insideTagNames, name) >= 0
+ " Yes, we are inside a tag.
+ let indent = s:InsideTag(foundHtmlString)
+ if indent >= 0
+ " Do not keep the state. TODO: could keep the block type.
+ let b:hi_indent.lnum = 0
+ return indent
+ endif
+ endif
+ endfor
+ endif
+
+ " does the line start with a closing tag?
+ let swendtag = match(curtext, '^\s*</') >= 0
+
+ if prevnonblank(v:lnum - 1) == b:hi_indent.lnum && b:hi_lasttick == b:changedtick - 1
+ " use state (continue from previous line)
+ else
+ " start over (know nothing)
+ let b:hi_indent = s:FreshState(v:lnum)
+ endif
+
+ if b:hi_indent.block >= 2
+ " within block
+ let endtag = s:endtags[b:hi_indent.block]
+ let blockend = stridx(curtext, endtag)
+ if blockend >= 0
+ " block ends here
+ let b:hi_newstate.block = 0
+ " calc indent for REST OF LINE (may start more blocks):
+ call s:CountTagsAndState(strpart(curtext, blockend + strlen(endtag)))
+ if swendtag && b:hi_indent.block != 5
+ let indent = b:hi_indent.blocktagind + s:curind * indentunit
+ let b:hi_newstate.baseindent = indent + s:nextrel * indentunit
+ else
+ let indent = s:Alien{b:hi_indent.block}()
+ let b:hi_newstate.baseindent = b:hi_indent.blocktagind + s:nextrel * indentunit
+ endif
+ else
+ " block continues
+ " indent this line with alien method
+ let indent = s:Alien{b:hi_indent.block}()
+ endif
+ else
+ " not within a block - within usual html
+ let b:hi_newstate.block = b:hi_indent.block
+ if swendtag
+ " The current line starts with an end tag, align with its start tag.
+ call cursor(v:lnum, 1)
+ let start_lnum = HtmlIndent_FindStartTag()
+ if start_lnum > 0
+ " check for the line starting with something inside a tag:
+ " <sometag <- align here
+ " attr=val><open> not here
+ let text = getline(start_lnum)
+ let angle = matchstr(text, '[<>]')
+ if angle == '>'
+ call cursor(start_lnum, 1)
+ normal! f>%
+ let start_lnum = line('.')
+ let text = getline(start_lnum)
+ endif
+
+ let indent = indent(start_lnum)
+ if col('.') > 2
+ let swendtag = match(text, '^\s*</') >= 0
+ call s:CountITags(text[: col('.') - 2])
+ let indent += s:nextrel * shiftwidth()
+ if !swendtag
+ let indent += s:curind * shiftwidth()
+ endif
+ endif
+ else
+ " not sure what to do
+ let indent = b:hi_indent.baseindent
+ endif
+ let b:hi_newstate.baseindent = indent
+ else
+ call s:CountTagsAndState(curtext)
+ let indent = b:hi_indent.baseindent
+ let b:hi_newstate.baseindent = indent + (s:curind + s:nextrel) * indentunit
+ endif
+ endif
+
+ let b:hi_lasttick = b:changedtick
+ call extend(b:hi_indent, b:hi_newstate, "force")
+ return indent
+endfunc "}}}
+
+" Check user settings when loading this script the first time.
+call HtmlIndent_CheckUserSettings()
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: fdm=marker ts=8 sw=2 tw=78
diff --git a/runtime/indent/htmldjango.vim b/runtime/indent/htmldjango.vim
new file mode 100644
index 0000000..8da9fe3
--- /dev/null
+++ b/runtime/indent/htmldjango.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: Django HTML template
+" Maintainer: Dave Hodder <dmh@dmh.org.uk>
+" Last Change: 2007 Jan 25
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use HTML formatting rules.
+runtime! indent/html.vim
diff --git a/runtime/indent/idlang.vim b/runtime/indent/idlang.vim
new file mode 100644
index 0000000..1519865
--- /dev/null
+++ b/runtime/indent/idlang.vim
@@ -0,0 +1,65 @@
+" IDL (Interactive Data Language) indent file.
+" Language: IDL (ft=idlang)
+" Maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com> (Invalid email address)
+" Doug Kearns <dougkearns@gmail.com>
+" Last change: 2022 Apr 06
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys=o,O,0=endif,0=ENDIF,0=endelse,0=ENDELSE,0=endwhile,0=ENDWHILE,0=endfor,0=ENDFOR,0=endrep,0=ENDREP
+
+setlocal indentexpr=GetIdlangIndent(v:lnum)
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+if exists("*GetIdlangIndent")
+ finish
+endif
+
+function GetIdlangIndent(lnum)
+ " First non-empty line above the current line.
+ let pnum = prevnonblank(v:lnum-1)
+ " v:lnum is the first non-empty line -- zero indent.
+ if pnum == 0
+ return 0
+ endif
+ " Second non-empty line above the current line.
+ let pnum2 = prevnonblank(pnum-1)
+
+ " Current indent.
+ let curind = indent(pnum)
+
+ " Indenting of continued lines.
+ if getline(pnum) =~ '\$\s*\(;.*\)\=$'
+ if getline(pnum2) !~ '\$\s*\(;.*\)\=$'
+ let curind = curind+shiftwidth()
+ endif
+ else
+ if getline(pnum2) =~ '\$\s*\(;.*\)\=$'
+ 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-shiftwidth()
+ let curind = curind-shiftwidth()
+ else
+ return -1
+ endif
+ elseif getline(pnum) =~? 'begin\>'
+ if indent(v:lnum) < curind+shiftwidth()
+ let curind = curind+shiftwidth()
+ else
+ return -1
+ endif
+ endif
+ return curind
+endfunction
+
diff --git a/runtime/indent/ishd.vim b/runtime/indent/ishd.vim
new file mode 100644
index 0000000..531244b
--- /dev/null
+++ b/runtime/indent/ishd.vim
@@ -0,0 +1,68 @@
+" Description: InstallShield indenter
+" Author: Johannes Zellner <johannes@zellner.org>
+" Last Change: Tue, 27 Apr 2004 14:54:59 CEST
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetIshdIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+==else,=elseif,=endif,=end,=begin,<:>
+" setlocal indentkeys-=0#
+
+let b:undo_indent = "setl ai< indentexpr< indentkeys<"
+
+" Only define the function once.
+if exists("*GetIshdIndent")
+ finish
+endif
+
+fun! GetIshdIndent(lnum)
+ " labels and preprocessor get zero indent immediately
+ let this_line = getline(a:lnum)
+ let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)'
+ let LABELS_OR_PREPROC_EXCEPT = '^\s*\<default\+\>:'
+ if this_line =~ LABELS_OR_PREPROC && this_line !~ LABELS_OR_PREPROC_EXCEPT
+ return 0
+ endif
+
+ " Find a non-blank line above the current line.
+ " Skip over labels and preprocessor directives.
+ let lnum = a:lnum
+ while lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ let previous_line = getline(lnum)
+ if previous_line !~ LABELS_OR_PREPROC || previous_line =~ LABELS_OR_PREPROC_EXCEPT
+ break
+ endif
+ endwhile
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ " Add
+ if previous_line =~ '^\s*\<\(function\|begin\|switch\|case\|default\|if.\{-}then\|else\|elseif\|while\|repeat\)\>'
+ let ind = ind + shiftwidth()
+ endif
+
+ " Subtract
+ if this_line =~ '^\s*\<endswitch\>'
+ let ind = ind - 2 * shiftwidth()
+ elseif this_line =~ '^\s*\<\(begin\|end\|endif\|endwhile\|else\|elseif\|until\)\>'
+ let ind = ind - shiftwidth()
+ elseif this_line =~ '^\s*\<\(case\|default\)\>'
+ if previous_line !~ '^\s*\<switch\>'
+ let ind = ind - shiftwidth()
+ endif
+ endif
+
+ return ind
+endfun
diff --git a/runtime/indent/j.vim b/runtime/indent/j.vim
new file mode 100644
index 0000000..c308512
--- /dev/null
+++ b/runtime/indent/j.vim
@@ -0,0 +1,50 @@
+" Vim indent file
+" Language: J
+" Maintainer: David Bürgin <dbuergin@gluet.ch>
+" URL: https://gitlab.com/glts/vim-j
+" Last Change: 2015-01-11
+
+if exists('b:did_indent')
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetJIndent()
+setlocal indentkeys-=0{,0},:,0#
+setlocal indentkeys+=0),0<:>,=case.,=catch.,=catchd.,=catcht.,=do.,=else.,=elseif.,=end.,=fcase.
+
+let b:undo_indent = 'setlocal indentkeys< indentexpr<'
+
+if exists('*GetJIndent')
+ finish
+endif
+
+" If g:j_indent_definitions is true, the bodies of explicit definitions of
+" adverbs, conjunctions, and verbs will be indented. Default is false (0).
+if !exists('g:j_indent_definitions')
+ let g:j_indent_definitions = 0
+endif
+
+function GetJIndent() abort
+ let l:prevlnum = prevnonblank(v:lnum - 1)
+ if l:prevlnum == 0
+ return 0
+ endif
+ let l:indent = indent(l:prevlnum)
+ let l:prevline = getline(l:prevlnum)
+ if l:prevline =~# '^\s*\%(case\|catch[dt]\=\|do\|else\%(if\)\=\|fcase\|for\%(_\a\k*\)\=\|if\|select\|try\|whil\%(e\|st\)\)\.\%(\%(\<end\.\)\@!.\)*$'
+ " Increase indentation after an initial control word that starts or
+ " continues a block and is not terminated by "end."
+ let l:indent += shiftwidth()
+ elseif g:j_indent_definitions && (l:prevline =~# '\<\%([1-4]\|13\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>' || l:prevline =~# '^\s*:\s*$')
+ " Increase indentation in explicit definitions of adverbs, conjunctions,
+ " and verbs
+ let l:indent += shiftwidth()
+ endif
+ " Decrease indentation in lines that start with either control words that
+ " continue or end a block, or the special items ")" and ":"
+ if getline(v:lnum) =~# '^\s*\%()\|:\|\%(case\|catch[dt]\=\|do\|else\%(if\)\=\|end\|fcase\)\.\)'
+ let l:indent -= shiftwidth()
+ endif
+ return l:indent
+endfunction
diff --git a/runtime/indent/java.vim b/runtime/indent/java.vim
new file mode 100644
index 0000000..49f8010
--- /dev/null
+++ b/runtime/indent/java.vim
@@ -0,0 +1,150 @@
+" Vim indent file
+" Language: Java
+" Previous Maintainer: Toby Allsopp <toby.allsopp@peace.com>
+" 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-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")
+ finish
+endif
+let b:did_indent = 1
+
+" Indent Java anonymous classes correctly.
+setlocal cindent cinoptions& cinoptions+=j1
+
+" The "extends" and "implements" lines start off with the wrong indent.
+setlocal indentkeys& indentkeys+=0=extends indentkeys+=0=implements
+
+" Set the function to do the work.
+setlocal indentexpr=GetJavaIndent()
+
+let b:undo_indent = "set cin< cino< indentkeys< indentexpr<"
+
+" Only define the function once.
+if exists("*GetJavaIndent")
+ finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+function! SkipJavaBlanksAndComments(startline)
+ let lnum = a:startline
+ while lnum > 1
+ let lnum = prevnonblank(lnum)
+ if getline(lnum) =~ '\*/\s*$'
+ while getline(lnum) !~ '/\*' && lnum > 1
+ let lnum = lnum - 1
+ endwhile
+ if getline(lnum) =~ '^\s*/\*'
+ let lnum = lnum - 1
+ else
+ break
+ endif
+ elseif getline(lnum) =~ '^\s*//'
+ let lnum = lnum - 1
+ else
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function GetJavaIndent()
+
+ " Java is just like C; use the built-in C indenting and then correct a few
+ " specific cases.
+ let theIndent = cindent(v:lnum)
+
+ " If we're in the middle of a comment then just trust cindent
+ if getline(v:lnum) =~ '^\s*\*'
+ return theIndent
+ endif
+
+ " find start of previous line, in case it was a continuation line
+ let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
+
+ " If the previous line starts with '@', we should have the same indent as
+ " the previous one
+ if getline(lnum) =~ '^\s*@.*$'
+ return indent(lnum)
+ endif
+
+ let prev = lnum
+ while prev > 1
+ let next_prev = SkipJavaBlanksAndComments(prev - 1)
+ if getline(next_prev) !~ ',\s*$'
+ break
+ endif
+ let prev = next_prev
+ endwhile
+
+ " Try to align "throws" lines for methods and "extends" and "implements" for
+ " classes.
+ 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"
+ let cont_kw = matchstr(getline(prev),
+ \ '^\s*\zs\(throws\|implements\|extends\)\>\ze.*,\s*$')
+ if strlen(cont_kw) > 0
+ let amount = strlen(cont_kw) + 1
+ if getline(lnum) !~ ',\s*$'
+ 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 + shiftwidth()
+ endif
+ endif
+ elseif getline(prev) =~ '^\s*\(throws\|implements\|extends\)\>'
+ \ && (getline(prev) =~ '{\s*$'
+ \ || getline(v:lnum) =~ '^\s*{\s*$')
+ 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! %
+ let lnum = line('.')
+ if lnum < v:lnum
+ while lnum > 1
+ let next_lnum = SkipJavaBlanksAndComments(lnum - 1)
+ if getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>'
+ \ && getline(next_lnum) !~ ',\s*$'
+ break
+ endif
+ let lnum = prevnonblank(next_lnum)
+ endwhile
+ return indent(lnum)
+ endif
+ endif
+
+ " Below a line starting with "}" never indent more. Needed for a method
+ " below a method with an indented "throws" clause.
+ let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
+ if getline(lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' && indent(lnum) < theIndent
+ let theIndent = indent(lnum)
+ endif
+
+ return theIndent
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vi: sw=2 et
diff --git a/runtime/indent/javascript.vim b/runtime/indent/javascript.vim
new file mode 100644
index 0000000..8077442
--- /dev/null
+++ b/runtime/indent/javascript.vim
@@ -0,0 +1,486 @@
+" Vim indent file
+" 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
+endif
+let b:did_indent = 1
+
+" 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 = '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
+
+ let nest = get(get(b:, 'hi_indent', {}), 'blocklnr')
+ if nest
+ return indent(nextnonblank(nest + 1)) + 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/javascriptreact.vim b/runtime/indent/javascriptreact.vim
new file mode 100644
index 0000000..a348209
--- /dev/null
+++ b/runtime/indent/javascriptreact.vim
@@ -0,0 +1,2 @@
+" Placeholder for backwards compatilibity: .jsx used to stand for JavaScript.
+runtime! indent/javascript.vim
diff --git a/runtime/indent/json.vim b/runtime/indent/json.vim
new file mode 100644
index 0000000..510f7e8
--- /dev/null
+++ b/runtime/indent/json.vim
@@ -0,0 +1,173 @@
+" Vim indent file
+" Language: JSON
+" Maintainer: Eli Parra <eli@elzr.com> https://github.com/elzr/vim-json
+" Last Change: 2020 Aug 30
+" https://github.com/jakar/vim-json/commit/20b650e22aa750c4ab6a66aa646bdd95d7cd548a#diff-e81fc111b2052e306d126bd9989f7b7c
+" 2022 Sep 07: b:undo_indent added by Doug Kearns
+" 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
+" http://www.vim.org/scripts/script.php?script_id=2765
+
+" 0. Initialization {{{1
+" =================
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+
+" Now, set up our indentation expression and keys that trigger it.
+setlocal indentexpr=GetJSONIndent(v:lnum)
+setlocal indentkeys=0{,0},0),0[,0],!^F,o,O,e
+
+let b:undo_indent = "setl inde< indk< si<"
+
+" Only define the function once.
+if exists("*GetJSONIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" 1. Variables {{{1
+" ============
+
+let s:line_term = '\s*\%(\%(\/\/\).*\)\=$'
+" Regex that defines blocks.
+let s:block_regex = '\%({\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term
+
+" 2. Auxiliary Functions {{{1
+" ======================
+
+" Check if the character at lnum:col is inside a string.
+function s:IsInString(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') == 'jsonString'
+endfunction
+
+" Find line above 'lnum' that isn't empty, or in a string.
+function s:PrevNonBlankNonString(lnum)
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ " If the line isn't empty or in a string, end search.
+ let line = getline(lnum)
+ if !(s:IsInString(lnum, 1) && s:IsInString(lnum, strlen(line)))
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+" Check if line 'lnum' has more opening brackets than closing ones.
+function s:LineHasOpeningBrackets(lnum)
+ let open_0 = 0
+ let open_2 = 0
+ let open_4 = 0
+ let line = getline(a:lnum)
+ let pos = match(line, '[][(){}]', 0)
+ while pos != -1
+ let idx = stridx('(){}[]', line[pos])
+ if idx % 2 == 0
+ let open_{idx} = open_{idx} + 1
+ else
+ let open_{idx - 1} = open_{idx - 1} - 1
+ endif
+ let pos = match(line, '[][(){}]', pos + 1)
+ endwhile
+ return (open_0 > 0) . (open_2 > 0) . (open_4 > 0)
+endfunction
+
+function s:Match(lnum, regex)
+ let col = match(getline(a:lnum), a:regex) + 1
+ return col > 0 && !s:IsInString(a:lnum, col) ? col : 0
+endfunction
+
+" 3. GetJSONIndent Function {{{1
+" =========================
+
+function GetJSONIndent(...)
+ " 3.1. Setup {{{2
+ " ----------
+ " For the current line, use the first argument if given, else v:lnum
+ let clnum = a:0 ? a:1 : v:lnum
+
+ " Set up variables for restoring position in file. Could use clnum here.
+ let vcol = col('.')
+
+ " 3.2. Work on the current line {{{2
+ " -----------------------------
+
+ " Get the current line.
+ let line = getline(clnum)
+ let ind = -1
+
+ " If we got a closing bracket on an empty line, find its match and indent
+ " according to it.
+ let col = matchend(line, '^\s*[]}]')
+
+ if col > 0 && !s:IsInString(clnum, col)
+ call cursor(clnum, col)
+ let bs = strpart('{}[]', stridx('}]', line[col - 1]) * 2, 2)
+
+ let pairstart = escape(bs[0], '[')
+ let pairend = escape(bs[1], ']')
+ let pairline = searchpair(pairstart, '', pairend, 'bW')
+
+ if pairline > 0
+ let ind = indent(pairline)
+ else
+ let ind = virtcol('.') - 1
+ endif
+
+ return ind
+ endif
+
+ " If we are in a multi-line string, don't do anything to it.
+ if s:IsInString(clnum, matchend(line, '^\s*') + 1)
+ return indent('.')
+ endif
+
+ " 3.3. Work on the previous line. {{{2
+ " -------------------------------
+
+ let lnum = prevnonblank(clnum - 1)
+
+ if lnum == 0
+ return 0
+ endif
+
+ " Set up variables for current line.
+ let line = getline(lnum)
+ let ind = indent(lnum)
+
+ " If the previous line ended with a block opening, add a level of indent.
+ " if s:Match(lnum, s:block_regex)
+ " return indent(lnum) + shiftwidth()
+ " endif
+
+ " If the previous line contained an opening bracket, and we are still in it,
+ " add indent depending on the bracket type.
+ if line =~ '[[({]'
+ let counts = s:LineHasOpeningBrackets(lnum)
+ if counts[0] == '1' || counts[1] == '1' || counts[2] == '1'
+ return ind + shiftwidth()
+ else
+ call cursor(clnum, vcol)
+ end
+ endif
+
+ " }}}2
+
+ return ind
+endfunction
+
+" }}}1
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2 ts=8 noet:
diff --git a/runtime/indent/jsonc.vim b/runtime/indent/jsonc.vim
new file mode 100644
index 0000000..bf8e501
--- /dev/null
+++ b/runtime/indent/jsonc.vim
@@ -0,0 +1,189 @@
+" Vim indent file
+" Language: JSONC (JSON with Comments)
+" Original Author: Izhak Jakov <izhak724@gmail.com>
+" Acknowledgement: Based off of vim-json maintained by Eli Parra <eli@elzr.com>
+" https://github.com/elzr/vim-json
+" Last Change: 2021-07-01
+
+" 0. Initialization {{{1
+" =================
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+
+" Now, set up our indentation expression and keys that trigger it.
+setlocal indentexpr=GetJSONCIndent()
+setlocal indentkeys=0{,0},0),0[,0],!^F,o,O,e
+
+" Only define the function once.
+if exists("*GetJSONCIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" 1. Variables {{{1
+" ============
+
+let s:line_term = '\s*\%(\%(\/\/\).*\)\=$'
+" Regex that defines blocks.
+let s:block_regex = '\%({\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term
+
+" 2. Auxiliary Functions {{{1
+" ======================
+
+" Check if the character at lnum:col is inside a string.
+function s:IsInString(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') == 'jsonString'
+endfunction
+
+" Find line above 'lnum' that isn't empty, or in a string.
+function s:PrevNonBlankNonString(lnum)
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ " If the line isn't empty or in a string, end search.
+ let line = getline(lnum)
+ if !(s:IsInString(lnum, 1) && s:IsInString(lnum, strlen(line)))
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+" Check if line 'lnum' has more opening brackets than closing ones.
+function s:LineHasOpeningBrackets(lnum)
+ let open_0 = 0
+ let open_2 = 0
+ let open_4 = 0
+ let line = getline(a:lnum)
+ let pos = match(line, '[][(){}]', 0)
+ while pos != -1
+ let idx = stridx('(){}[]', line[pos])
+ if idx % 2 == 0
+ let open_{idx} = open_{idx} + 1
+ else
+ let open_{idx - 1} = open_{idx - 1} - 1
+ endif
+ let pos = match(line, '[][(){}]', pos + 1)
+ endwhile
+ return (open_0 > 0) . (open_2 > 0) . (open_4 > 0)
+endfunction
+
+function s:Match(lnum, regex)
+ let col = match(getline(a:lnum), a:regex) + 1
+ return col > 0 && !s:IsInString(a:lnum, col) ? col : 0
+endfunction
+
+" 3. GetJSONCIndent Function {{{1
+" =========================
+
+function GetJSONCIndent()
+ if !exists("s:inside_comment")
+ let s:inside_comment = 0
+ endif
+
+ " 3.1. Setup {{{2
+ " ----------
+
+ " Set up variables for restoring position in file. Could use v:lnum here.
+ let vcol = col('.')
+
+ " 3.2. Work on the current line {{{2
+ " -----------------------------
+
+
+ " Get the current line.
+ let line = getline(v:lnum)
+ let ind = -1
+ if s:inside_comment == 0
+ " TODO iterate through all the matches in a line
+ let col = matchend(line, '\/\*')
+ if col > 0 && !s:IsInString(v:lnum, col)
+ let s:inside_comment = 1
+ endif
+ endif
+ " If we're in the middle of a comment
+ if s:inside_comment == 1
+ let col = matchend(line, '\*\/')
+ if col > 0 && !s:IsInString(v:lnum, col)
+ let s:inside_comment = 0
+ endif
+ return ind
+ endif
+ if line =~ '^\s*//'
+ return ind
+ endif
+
+ " If we got a closing bracket on an empty line, find its match and indent
+ " according to it.
+ let col = matchend(line, '^\s*[]}]')
+
+ if col > 0 && !s:IsInString(v:lnum, col)
+ call cursor(v:lnum, col)
+ let bs = strpart('{}[]', stridx('}]', line[col - 1]) * 2, 2)
+
+ let pairstart = escape(bs[0], '[')
+ let pairend = escape(bs[1], ']')
+ let pairline = searchpair(pairstart, '', pairend, 'bW')
+
+ if pairline > 0
+ let ind = indent(pairline)
+ else
+ let ind = virtcol('.') - 1
+ endif
+
+ return ind
+ endif
+
+ " If we are in a multi-line string, don't do anything to it.
+ if s:IsInString(v:lnum, matchend(line, '^\s*') + 1)
+ return indent('.')
+ endif
+
+ " 3.3. Work on the previous line. {{{2
+ " -------------------------------
+
+ let lnum = prevnonblank(v:lnum - 1)
+
+ if lnum == 0
+ return 0
+ endif
+
+ " Set up variables for current line.
+ let line = getline(lnum)
+ let ind = indent(lnum)
+
+ " If the previous line ended with a block opening, add a level of indent.
+ " if s:Match(lnum, s:block_regex)
+ " return indent(lnum) + shiftwidth()
+ " endif
+
+ " If the previous line contained an opening bracket, and we are still in it,
+ " add indent depending on the bracket type.
+ if line =~ '[[({]'
+ let counts = s:LineHasOpeningBrackets(lnum)
+ if counts[0] == '1' || counts[1] == '1' || counts[2] == '1'
+ return ind + shiftwidth()
+ else
+ call cursor(v:lnum, vcol)
+ end
+ endif
+
+ " }}}2
+
+ return ind
+endfunction
+
+" }}}1
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2 ts=8 noet:
diff --git a/runtime/indent/jsp.vim b/runtime/indent/jsp.vim
new file mode 100644
index 0000000..6f7069e
--- /dev/null
+++ b/runtime/indent/jsp.vim
@@ -0,0 +1,17 @@
+" Vim filetype indent file
+" Language: JSP files
+" Maintainer: David Fishburn <fishburn@ianywhere.com>
+" Version: 1.0
+" Last Change: Wed Nov 08 2006 11:08:05 AM
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" If there has been no specific JSP indent script created,
+" use the default html indent script which will handle
+" html, javascript and most of the JSP constructs.
+runtime! indent/html.vim
+
+
diff --git a/runtime/indent/julia.vim b/runtime/indent/julia.vim
new file mode 100644
index 0000000..8e4c603
--- /dev/null
+++ b/runtime/indent/julia.vim
@@ -0,0 +1,497 @@
+" Vim indent file
+" Language: Julia
+" Maintainer: Carlo Baldassi <carlobaldassi@gmail.com>
+" Homepage: https://github.com/JuliaEditorSupport/julia-vim
+" Last Change: 2022 Jun 14
+" Notes: originally based on Bram Molenaar's indent file for vim
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+
+setlocal indentexpr=GetJuliaIndent()
+setlocal indentkeys+==end,=else,=catch,=finally,),],}
+setlocal indentkeys-=0#
+setlocal indentkeys-=:
+setlocal indentkeys-=0{
+setlocal indentkeys-=0}
+setlocal nosmartindent
+
+" Only define the function once.
+if exists("*GetJuliaIndent")
+ finish
+endif
+
+let s:skipPatternsBasic = '\<julia\%(Comment\%([LM]\|Delim\)\)\>'
+let s:skipPatterns = '\<julia\%(Comprehension\%(For\|If\)\|RangeKeyword\|Comment\%([LM]\|Delim\)\|\%([bs]\|Shell\|Printf\|Doc\)\?String\|StringPrefixed\|DocStringM\(Raw\)\?\|RegEx\|SymbolS\?\|Macro\|Dotted\)\>'
+
+function JuliaMatch(lnum, str, regex, st, ...)
+ let s = a:st
+ let e = a:0 > 0 ? a:1 : -1
+ let basic_skip = a:0 > 1 ? a:2 : 'all'
+ let skip = basic_skip ==# 'basic' ? s:skipPatternsBasic : s:skipPatterns
+ while 1
+ let f = match(a:str, '\C' . a:regex, s)
+ if e >= 0 && f >= e
+ return -1
+ endif
+ if f >= 0
+ let attr = synIDattr(synID(a:lnum,f+1,1),"name")
+ let attrT = synIDattr(synID(a:lnum,f+1,0),"name")
+ if attr =~# skip || attrT =~# skip
+ let s = f+1
+ continue
+ endif
+ endif
+ break
+ endwhile
+ return f
+endfunction
+
+function GetJuliaNestingStruct(lnum, ...)
+ " Auxiliary function to inspect the block structure of a line
+ let line = getline(a:lnum)
+ let s = a:0 > 0 ? a:1 : 0
+ let e = a:0 > 1 ? a:2 : -1
+ let blocks_stack = []
+ let num_closed_blocks = 0
+ while 1
+ let fb = JuliaMatch(a:lnum, line, '\<\%(if\|else\%(if\)\?\|while\|for\|try\|catch\|finally\|\%(staged\)\?function\|macro\|begin\|mutable\s\+struct\|\%(mutable\s\+\)\@<!struct\|\%(abstract\|primitive\)\s\+type\|let\|\%(bare\)\?module\|quote\|do\)\>', s, e)
+ let fe = JuliaMatch(a:lnum, line, '\<end\>', s, e)
+
+ if fb < 0 && fe < 0
+ " No blocks found
+ break
+ end
+
+ if fb >= 0 && (fb < fe || fe < 0)
+ " The first occurrence is an opening block keyword
+ " Note: some keywords (elseif,else,catch,finally) are both
+ " closing blocks and opening new ones
+
+ let i = JuliaMatch(a:lnum, line, '\<if\>', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ call add(blocks_stack, 'if')
+ continue
+ endif
+ let i = JuliaMatch(a:lnum, line, '\<elseif\>', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ if len(blocks_stack) > 0 && blocks_stack[-1] == 'if'
+ let blocks_stack[-1] = 'elseif'
+ elseif (len(blocks_stack) > 0 && blocks_stack[-1] != 'elseif') || len(blocks_stack) == 0
+ call add(blocks_stack, 'elseif')
+ let num_closed_blocks += 1
+ endif
+ continue
+ endif
+ let i = JuliaMatch(a:lnum, line, '\<else\>', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ if len(blocks_stack) > 0 && blocks_stack[-1] =~# '\<\%(else\)\=if\>'
+ let blocks_stack[-1] = 'else'
+ else
+ call add(blocks_stack, 'else')
+ let num_closed_blocks += 1
+ endif
+ continue
+ endif
+
+ let i = JuliaMatch(a:lnum, line, '\<try\>', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ call add(blocks_stack, 'try')
+ continue
+ endif
+ let i = JuliaMatch(a:lnum, line, '\<catch\>', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ if len(blocks_stack) > 0 && blocks_stack[-1] == 'try'
+ let blocks_stack[-1] = 'catch'
+ else
+ call add(blocks_stack, 'catch')
+ let num_closed_blocks += 1
+ endif
+ continue
+ endif
+ let i = JuliaMatch(a:lnum, line, '\<finally\>', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ if len(blocks_stack) > 0 && (blocks_stack[-1] == 'try' || blocks_stack[-1] == 'catch')
+ let blocks_stack[-1] = 'finally'
+ else
+ call add(blocks_stack, 'finally')
+ let num_closed_blocks += 1
+ endif
+ continue
+ endif
+
+ let i = JuliaMatch(a:lnum, line, '\<\%(bare\)\?module\>', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ if i == 0
+ call add(blocks_stack, 'col1module')
+ else
+ call add(blocks_stack, 'other')
+ endif
+ continue
+ endif
+
+ let i = JuliaMatch(a:lnum, line, '\<\%(while\|for\|function\|macro\|begin\|\%(mutable\s\+\)\?struct\|\%(abstract\|primitive\)\s\+type\|let\|quote\|do\)\>', s)
+ if i >= 0 && i == fb
+ if match(line, '\C\<\%(mutable\|abstract\|primitive\)', i) != -1
+ let s = i+11
+ else
+ let s = i+1
+ endif
+ call add(blocks_stack, 'other')
+ continue
+ endif
+
+ " Note: it should be impossible to get here
+ break
+
+ else
+ " The first occurrence is an 'end'
+
+ let s = fe+1
+ if len(blocks_stack) == 0
+ let num_closed_blocks += 1
+ else
+ call remove(blocks_stack, -1)
+ endif
+ continue
+
+ endif
+
+ " Note: it should be impossible to get here
+ break
+ endwhile
+ let num_open_blocks = len(blocks_stack) - count(blocks_stack, 'col1module')
+ return [num_open_blocks, num_closed_blocks]
+endfunction
+
+function GetJuliaNestingBrackets(lnum, c)
+ " Auxiliary function to inspect the brackets structure of a line
+ let line = getline(a:lnum)[0 : (a:c - 1)]
+ let s = 0
+ let brackets_stack = []
+ let last_closed_bracket = -1
+ while 1
+ let fb = JuliaMatch(a:lnum, line, '[([{]', s)
+ let fe = JuliaMatch(a:lnum, line, '[])}]', s)
+
+ if fb < 0 && fe < 0
+ " No brackets found
+ break
+ end
+
+ if fb >= 0 && (fb < fe || fe < 0)
+ " The first occurrence is an opening bracket
+
+ let i = JuliaMatch(a:lnum, line, '(', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ call add(brackets_stack, ['par',i])
+ continue
+ endif
+
+ let i = JuliaMatch(a:lnum, line, '\[', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ call add(brackets_stack, ['sqbra',i])
+ continue
+ endif
+
+ let i = JuliaMatch(a:lnum, line, '{', s)
+ if i >= 0 && i == fb
+ let s = i+1
+ call add(brackets_stack, ['curbra',i])
+ continue
+ endif
+
+ " Note: it should be impossible to get here
+ break
+
+ else
+ " The first occurrence is a closing bracket
+
+ let i = JuliaMatch(a:lnum, line, ')', s)
+ if i >= 0 && i == fe
+ let s = i+1
+ if len(brackets_stack) > 0 && brackets_stack[-1][0] == 'par'
+ call remove(brackets_stack, -1)
+ else
+ let last_closed_bracket = i + 1
+ endif
+ continue
+ endif
+
+ let i = JuliaMatch(a:lnum, line, ']', s)
+ if i >= 0 && i == fe
+ let s = i+1
+ if len(brackets_stack) > 0 && brackets_stack[-1][0] == 'sqbra'
+ call remove(brackets_stack, -1)
+ else
+ let last_closed_bracket = i + 1
+ endif
+ continue
+ endif
+
+ let i = JuliaMatch(a:lnum, line, '}', s)
+ if i >= 0 && i == fe
+ let s = i+1
+ if len(brackets_stack) > 0 && brackets_stack[-1][0] == 'curbra'
+ call remove(brackets_stack, -1)
+ else
+ let last_closed_bracket = i + 1
+ endif
+ continue
+ endif
+
+ " Note: it should be impossible to get here
+ break
+
+ endif
+
+ " Note: it should be impossible to get here
+ break
+ endwhile
+ let first_open_bracket = -1
+ let last_open_bracket = -1
+ let infuncargs = 0
+ if len(brackets_stack) > 0
+ let first_open_bracket = brackets_stack[0][1]
+ let last_open_bracket = brackets_stack[-1][1]
+ if brackets_stack[-1][0] == 'par' && IsFunctionArgPar(a:lnum, last_open_bracket+1)
+ let infuncargs = 1
+ endif
+ endif
+ return [first_open_bracket, last_open_bracket, last_closed_bracket, infuncargs]
+endfunction
+
+let s:bracketBlocks = '\<julia\%(\%(\%(Printf\)\?Par\|SqBra\%(Idx\)\?\|CurBra\)Block\|ParBlockInRange\|StringVars\%(Par\|SqBra\|CurBra\)\|Dollar\%(Par\|SqBra\)\|QuotedParBlockS\?\)\>'
+
+function IsInBrackets(lnum, c)
+ let stack = map(synstack(a:lnum, a:c), 'synIDattr(v:val, "name")')
+ call filter(stack, 'v:val =~# s:bracketBlocks')
+ return len(stack) > 0
+endfunction
+
+function IsInDocString(lnum)
+ let stack = map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")')
+ call filter(stack, 'v:val =~# "\\<juliaDocString\\(Delim\\|M\\\(Raw\\)\\?\\)\\?\\>"')
+ return len(stack) > 0
+endfunction
+
+function IsInContinuationImportLine(lnum)
+ let stack = map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")')
+ call filter(stack, 'v:val =~# "\\<juliaImportLine\\>"')
+ if len(stack) == 0
+ return 0
+ endif
+ return JuliaMatch(a:lnum, getline(a:lnum), '\<\%(import\|using\|export\)\>', indent(a:lnum)) == -1
+endfunction
+
+function IsFunctionArgPar(lnum, c)
+ if a:c == 0
+ return 0
+ endif
+ let stack = map(synstack(a:lnum, a:c-1), 'synIDattr(v:val, "name")')
+ return len(stack) >= 2 && stack[-2] ==# 'juliaFunctionDef'
+endfunction
+
+function JumpToMatch(lnum, last_closed_bracket)
+ " we use the % command to skip back (tries to ues matchit if possible,
+ " otherwise resorts to vim's default, which is buggy but better than
+ " nothing)
+ call cursor(a:lnum, a:last_closed_bracket)
+ let percmap = maparg("%", "n")
+ if exists("g:loaded_matchit") && percmap =~# 'Match\%(it\|_wrapper\)'
+ normal %
+ else
+ normal! %
+ end
+endfunction
+
+" Auxiliary function to find a line which does not start in the middle of a
+" multiline bracketed expression, to be used as reference for block
+" indentation.
+function LastBlockIndent(lnum)
+ let lnum = a:lnum
+ let ind = 0
+ while lnum > 0
+ let ind = indent(lnum)
+ if ind == 0
+ return [lnum, 0]
+ endif
+ if !IsInBrackets(lnum, 1)
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return [max([lnum,1]), ind]
+endfunction
+
+function GetJuliaIndent()
+ " Do not alter doctrings indentation
+ if IsInDocString(v:lnum)
+ return -1
+ endif
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = -1
+ let st = -1
+ let lim = -1
+
+ " Multiline bracketed expressions take precedence
+ let align_brackets = get(g:, "julia_indent_align_brackets", 1)
+ let align_funcargs = get(g:, "julia_indent_align_funcargs", 0)
+ let c = len(getline(lnum)) + 1
+ while IsInBrackets(lnum, c)
+ let [first_open_bracket, last_open_bracket, last_closed_bracket, infuncargs] = GetJuliaNestingBrackets(lnum, c)
+
+ " First scenario: the previous line has a hanging open bracket:
+ " set the indentation to match the opening bracket (plus an extra space)
+ " unless we're in a function arguments list or alignment is disabled, in
+ " which case we just add an extra indent
+ if last_open_bracket != -1
+ if (!infuncargs && align_brackets) || (infuncargs && align_funcargs)
+ let st = last_open_bracket
+ let ind = virtcol([lnum, st + 1])
+ else
+ let ind = indent(lnum) + shiftwidth()
+ endif
+
+ " Second scenario: some multiline bracketed expression was closed in the
+ " previous line. But since we know we are still in a bracketed expression,
+ " we need to find the line where the bracket was opened
+ elseif last_closed_bracket != -1
+ call JumpToMatch(lnum, last_closed_bracket)
+ if line(".") == lnum
+ " something wrong here, give up
+ let ind = indent(lnum)
+ else
+ let lnum = line(".")
+ let c = col(".") - 1
+ if c == 0
+ " uhm, give up
+ let ind = 0
+ else
+ " we skipped a bracket set, keep searching for an opening bracket
+ let lim = c
+ continue
+ endif
+ endif
+
+ " Third scenario: nothing special: keep the indentation
+ else
+ let ind = indent(lnum)
+ endif
+
+ " Does the current line start with a closing bracket? Then depending on
+ " the situation we align it with the opening one, or we let the rest of
+ " the code figure it out (the case in which we're closing a function
+ " argument list is special-cased)
+ if JuliaMatch(v:lnum, getline(v:lnum), '[])}]', indent(v:lnum)) == indent(v:lnum) && ind > 0
+ if !align_brackets && !align_funcargs
+ call JumpToMatch(v:lnum, indent(v:lnum))
+ return indent(line("."))
+ elseif (align_brackets && getline(v:lnum)[indent(v:lnum)] != ')') || align_funcargs
+ return ind - 1
+ else " must be a ')' and align_brackets==1 and align_funcargs==0
+ call JumpToMatch(v:lnum, indent(v:lnum))
+ if IsFunctionArgPar(line("."), col("."))
+ let ind = -1
+ else
+ return ind - 1
+ endif
+ endif
+ endif
+
+ break
+ endwhile
+
+ if ind == -1
+ " We are not in a multiline bracketed expression. Thus we look for a
+ " previous line to use as a reference
+ let [lnum,ind] = LastBlockIndent(lnum)
+ let c = len(getline(lnum)) + 1
+ if IsInBrackets(lnum, c)
+ let [first_open_bracket, last_open_bracket, last_closed_bracket, infuncargs] = GetJuliaNestingBrackets(lnum, c)
+ let lim = first_open_bracket
+ endif
+ end
+
+ " Analyse the reference line
+ let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(lnum, st, lim)
+ " Increase indentation for each newly opened block in the reference line
+ let ind += shiftwidth() * num_open_blocks
+
+ " Analyse the current line
+ let [num_open_blocks, num_closed_blocks] = GetJuliaNestingStruct(v:lnum)
+ " Decrease indentation for each closed block in the current line
+ let ind -= shiftwidth() * num_closed_blocks
+
+ " Additional special case: multiline import/using/export statements
+
+ let prevline = getline(lnum)
+ " Are we in a multiline import/using/export statement, right below the
+ " opening line?
+ if IsInContinuationImportLine(v:lnum) && !IsInContinuationImportLine(lnum)
+ if get(g:, 'julia_indent_align_import', 1)
+ " if the opening line has a colon followed by non-comments, use it as
+ " reference point
+ let cind = JuliaMatch(lnum, prevline, ':', indent(lnum), lim)
+ if cind >= 0
+ let nonwhiteind = JuliaMatch(lnum, prevline, '\S', cind+1, -1, 'basic')
+ if nonwhiteind >= 0
+ " return match(prevline, '\S', cind+1) " a bit overkill...
+ return cind + 2
+ endif
+ else
+ " if the opening line is not a naked import/using/export statement, use
+ " it as reference
+ let iind = JuliaMatch(lnum, prevline, '\<import\|using\|export\>', indent(lnum), lim)
+ if iind >= 0
+ " assuming whitespace after using... so no `using(XYZ)` please!
+ let nonwhiteind = JuliaMatch(lnum, prevline, '\S', iind+6, -1, 'basic')
+ if nonwhiteind >= 0
+ return match(prevline, '\S', iind+6)
+ endif
+ endif
+ endif
+ endif
+ let ind += shiftwidth()
+
+ " Or did we just close a multiline import/using/export statement?
+ elseif !IsInContinuationImportLine(v:lnum) && IsInContinuationImportLine(lnum)
+ " find the starting line of the statement
+ let ilnum = 0
+ for iln in range(lnum-1, 1, -1)
+ if !IsInContinuationImportLine(iln)
+ let ilnum = iln
+ break
+ endif
+ endfor
+ if ilnum == 0
+ " something went horribly wrong, give up
+ let ind = indent(lnum)
+ endif
+ let ind = indent(ilnum)
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/krl.vim b/runtime/indent/krl.vim
new file mode 100644
index 0000000..cc3cbd1
--- /dev/null
+++ b/runtime/indent/krl.vim
@@ -0,0 +1,130 @@
+" Vim indent file
+" Language: Kuka Robot Language
+" Maintainer: Patrick Meiser-Knosowski <knosowski@graeffrobotics.de>
+" Version: 3.0.0
+" Last Change: 15. Apr 2022
+" Credits: Based on indent/vim.vim
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nolisp
+setlocal nocindent
+setlocal nosmartindent
+setlocal autoindent
+setlocal indentexpr=GetKrlIndent()
+setlocal indentkeys=!^F,o,O,=~end,0=~else,0=~case,0=~default,0=~until,0=~continue,=~part
+let b:undo_indent = "setlocal lisp< cindent< smartindent< autoindent< indentexpr< indentkeys<"
+
+if get(g:,'krlSpaceIndent',1)
+ " Use spaces, not tabs, for indention, 2 is enough.
+ " More or even tabs would waste valuable space on the teach pendant.
+ setlocal softtabstop=2
+ setlocal shiftwidth=2
+ setlocal expandtab
+ setlocal shiftround
+ let b:undo_indent = b:undo_indent." softtabstop< shiftwidth< expandtab< shiftround<"
+endif
+
+" Only define the function once.
+if exists("*GetKrlIndent")
+ finish
+endif
+let s:keepcpo = &cpo
+set cpo&vim
+
+function GetKrlIndent() abort
+
+ let currentLine = getline(v:lnum)
+ if currentLine =~? '\v^;(\s*(end)?fold>)@!' && !get(g:, 'krlCommentIndent', 0)
+ " If current line has a ; in column 1 and is no fold, keep zero indent.
+ " This may be usefull if code is commented out at the first column.
+ return 0
+ endif
+
+ " Find a non-blank line above the current line.
+ let preNoneBlankLineNum = s:KrlPreNoneBlank(v:lnum - 1)
+ if preNoneBlankLineNum == 0
+ " At the start of the file use zero indent.
+ return 0
+ endif
+
+ let preNoneBlankLine = getline(preNoneBlankLineNum)
+ let ind = indent(preNoneBlankLineNum)
+
+ " Define add 'shiftwidth' pattern
+ let addShiftwidthPattern = '\v^\s*('
+ if get(g:, 'krlIndentBetweenDef', 1)
+ let addShiftwidthPattern ..= '(global\s+)?def(fct|dat)?\s+\$?\w'
+ let addShiftwidthPattern ..= '|'
+ endif
+ let addShiftwidthPattern ..= 'if>|while>|for>|loop>'
+ let addShiftwidthPattern ..= '|else>'
+ let addShiftwidthPattern ..= '|case>|default>'
+ let addShiftwidthPattern ..= '|repeat>'
+ let addShiftwidthPattern ..= '|skip>|(ptp_)?spline>'
+ let addShiftwidthPattern ..= '|time_block\s+(start|part)>'
+ let addShiftwidthPattern ..= '|const_vel\s+start>'
+ let addShiftwidthPattern ..= ')'
+
+ " Define Subtract 'shiftwidth' pattern
+ let subtractShiftwidthPattern = '\v^\s*('
+ if get(g:, 'krlIndentBetweenDef', 1)
+ let subtractShiftwidthPattern ..= 'end(fct|dat)?>'
+ let subtractShiftwidthPattern ..= '|'
+ endif
+ let subtractShiftwidthPattern ..= 'end(if|while|for|loop)>'
+ let subtractShiftwidthPattern ..= '|else>'
+ let subtractShiftwidthPattern ..= '|case>|default>|endswitch>'
+ let subtractShiftwidthPattern ..= '|until>'
+ let subtractShiftwidthPattern ..= '|end(skip|spline)>'
+ let subtractShiftwidthPattern ..= '|time_block\s+(part|end)>'
+ let subtractShiftwidthPattern ..= '|const_vel\s+end>'
+ let subtractShiftwidthPattern ..= ')'
+
+ " Add shiftwidth
+ if preNoneBlankLine =~? addShiftwidthPattern
+ let ind += &sw
+ endif
+
+ " Subtract shiftwidth
+ if currentLine =~? subtractShiftwidthPattern
+ let ind = ind - &sw
+ endif
+
+ " First case after a switch gets the indent of the switch.
+ if currentLine =~? '\v^\s*case>'
+ \&& preNoneBlankLine =~? '\v^\s*switch>'
+ let ind = ind + &sw
+ endif
+
+ " align continue with the following instruction
+ if currentLine =~? '\v^\s*continue>'
+ \&& getline(v:lnum + 1) =~? subtractShiftwidthPattern
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
+
+" This function works almost like prevnonblank() but handles &-headers,
+" comments and continue instructions like blank lines
+function s:KrlPreNoneBlank(lnum) abort
+
+ let nPreNoneBlank = prevnonblank(a:lnum)
+
+ while nPreNoneBlank > 0 && getline(nPreNoneBlank) =~? '\v^\s*(\&\w\+|;|continue>)'
+ " Previouse none blank line irrelevant. Look further aback.
+ let nPreNoneBlank = prevnonblank(nPreNoneBlank - 1)
+ endwhile
+
+ return nPreNoneBlank
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:sw=2 sts=2 et
diff --git a/runtime/indent/ld.vim b/runtime/indent/ld.vim
new file mode 100644
index 0000000..ddf003e
--- /dev/null
+++ b/runtime/indent/ld.vim
@@ -0,0 +1,87 @@
+" Vim indent file
+" Language: ld(1) script
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 24 Sep 2021
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetLDIndent()
+setlocal indentkeys=0{,0},!^F,o,O
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetLDIndent")
+ finish
+endif
+
+function s:prevnonblanknoncomment(lnum)
+ let lnum = a:lnum
+ while lnum > 1
+ let lnum = prevnonblank(lnum)
+ let line = getline(lnum)
+ if line =~ '\*/'
+ while lnum > 1 && line !~ '/\*'
+ let lnum -= 1
+ endwhile
+ if line =~ '^\s*/\*'
+ let lnum -= 1
+ else
+ break
+ endif
+ else
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function s:count_braces(lnum, count_open)
+ let n_open = 0
+ let n_close = 0
+ let line = getline(a:lnum)
+ let pattern = '[{}]'
+ let i = match(line, pattern)
+ while i != -1
+ if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'ld\%(Comment\|String\)'
+ if line[i] == '{'
+ let n_open += 1
+ elseif line[i] == '}'
+ if n_open > 0
+ let n_open -= 1
+ else
+ let n_close += 1
+ endif
+ endif
+ endif
+ let i = match(line, pattern, i + 1)
+ endwhile
+ return a:count_open ? n_open : n_close
+endfunction
+
+function GetLDIndent()
+ let line = getline(v:lnum)
+ if line =~ '^\s*\*'
+ return cindent(v:lnum)
+ elseif line =~ '^\s*}'
+ return indent(v:lnum) - shiftwidth()
+ endif
+
+ let pnum = s:prevnonblanknoncomment(v:lnum - 1)
+ if pnum == 0
+ return 0
+ endif
+
+ 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)) * shiftwidth()
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/less.vim b/runtime/indent/less.vim
new file mode 100644
index 0000000..82bf2d8
--- /dev/null
+++ b/runtime/indent/less.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: less
+" Maintainer: Alessandro Vioni <jenoma@gmail.com>
+" URL: https://github.com/genoma/vim-less
+" Last Change: 2014 November 24
+
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/css.vim
+
+" vim:set sw=2:
diff --git a/runtime/indent/lifelines.vim b/runtime/indent/lifelines.vim
new file mode 100644
index 0000000..e6d6161
--- /dev/null
+++ b/runtime/indent/lifelines.vim
@@ -0,0 +1,24 @@
+" Vim indent file
+" Language: LifeLines
+" Maintainer: Patrick Texier <p.texier@orsennes.com>
+" Location: <http://patrick.texier.free.fr/vim/indent/lifelines.vim>
+" Last Change: 2010 May 7
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" LifeLines uses cindent without ; line terminator, C functions
+" declarations, C keywords, C++ formatting
+setlocal cindent
+setlocal cinwords=""
+setlocal cinoptions+=+0
+setlocal cinoptions+=p0
+setlocal cinoptions+=i0
+setlocal cinoptions+=t0
+setlocal cinoptions+=*500
+
+let b:undo_indent = "setl cin< cino< cinw<"
+" vim: ts=8 sw=4
diff --git a/runtime/indent/liquid.vim b/runtime/indent/liquid.vim
new file mode 100644
index 0000000..6fc9337
--- /dev/null
+++ b/runtime/indent/liquid.vim
@@ -0,0 +1,66 @@
+" Vim indent file
+" Language: Liquid
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2022 Mar 15
+
+if exists('b:did_indent')
+ finish
+endif
+
+set indentexpr=
+if exists('b:liquid_subtype')
+ exe 'runtime! indent/'.b:liquid_subtype.'.vim'
+else
+ runtime! indent/html.vim
+endif
+unlet! b:did_indent
+
+if &l:indentexpr == ''
+ if &l:cindent
+ let &l:indentexpr = 'cindent(v:lnum)'
+ else
+ let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))'
+ endif
+endif
+let b:liquid_subtype_indentexpr = &l:indentexpr
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetLiquidIndent()
+setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=endif,=endunless,=endifchanged,=endcase,=endfor,=endtablerow,=endcapture,=else,=elsif,=when,=empty
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+if exists('*GetLiquidIndent')
+ finish
+endif
+
+function! s:count(string, pattern) abort
+ let string = substitute(a:string,'\C'.a:pattern,"\n",'g')
+ return strlen(substitute(string,"[^\n]",'','g'))
+endfunction
+
+function! GetLiquidIndent(...) abort
+ if a:0 && a:1 == '.'
+ let v:lnum = line('.')
+ elseif a:0 && a:1 =~ '^\d'
+ let v:lnum = a:1
+ endif
+ let vcol = col('.')
+ call cursor(v:lnum,1)
+ exe "let ind = ".b:liquid_subtype_indentexpr
+ let lnum = prevnonblank(v:lnum-1)
+ let line = getline(lnum)
+ let cline = getline(v:lnum)
+ let line = substitute(line,'\C^\%(\s*{%-\=\s*end\w*\s*-\=%}\)\+','','')
+ let line = substitute(line,'\C\%(\s*{%-\=\s*if.\+-\=%}.\+{%-\=\s*endif\s*-\=%}\)\+','','g')
+ let line .= matchstr(cline,'\C^\%(\s*{%-\=\s*end\w*\s*-\=%}\)\+')
+ let cline = substitute(cline,'\C^\%(\s*{%-\=\s*end\w*\s*-\=%}\)\+','','')
+ 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/lisp.vim b/runtime/indent/lisp.vim
new file mode 100644
index 0000000..1bce395
--- /dev/null
+++ b/runtime/indent/lisp.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: Lisp
+" Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
+" URL: http://sites.google.com/site/khorser/opensource/vim
+" Last Change: 2012 Jan 10
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal ai nosi
+
+let b:undo_indent = "setl ai< si<"
diff --git a/runtime/indent/logtalk.vim b/runtime/indent/logtalk.vim
new file mode 100644
index 0000000..8e36f86
--- /dev/null
+++ b/runtime/indent/logtalk.vim
@@ -0,0 +1,64 @@
+" Maintainer: Paulo Moura <pmoura@logtalk.org>
+" Revised on: 2018.08.04
+" Language: Logtalk
+
+" This Logtalk indent file is a modified version of the Prolog
+" indent file written by Gergely Kontra
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetLogtalkIndent()
+setlocal indentkeys-=:,0#
+setlocal indentkeys+=0%,-,0;,>,0)
+
+" Only define the function once.
+if exists("*GetLogtalkIndent")
+ finish
+endif
+
+function! GetLogtalkIndent()
+ " Find a non-blank line above the current line.
+ let pnum = prevnonblank(v:lnum - 1)
+ " Hit the start of the file, use zero indent.
+ if pnum == 0
+ return 0
+ endif
+ let line = getline(v:lnum)
+ let pline = getline(pnum)
+
+ let ind = indent(pnum)
+ " Previous line was comment -> use previous line's indent
+ if pline =~ '^\s*%'
+ retu ind
+ endif
+ " Check for entity opening directive on previous line
+ if pline =~ '^\s*:-\s\(object\|protocol\|category\)\ze(.*,$'
+ let ind = ind + shiftwidth()
+ " Check for clause head on previous line
+ elseif pline =~ ':-\s*\(%.*\)\?$'
+ 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 - shiftwidth()
+ " Check for end of clause on previous line
+ elseif pline =~ '\.\s*\(%.*\)\?$'
+ let ind = ind - shiftwidth()
+ endif
+ " Check for opening conditional on previous line
+ if pline =~ '^\s*\([(;]\|->\)' && pline !~ '\.\s*\(%.*\)\?$' && pline !~ '^.*\([)][,]\s*\(%.*\)\?$\)'
+ let ind = ind + shiftwidth()
+ endif
+ " Check for closing an unclosed paren, or middle ; or ->
+ if line =~ '^\s*\([);]\|->\)'
+ let ind = ind - shiftwidth()
+ endif
+ return ind
+endfunction
diff --git a/runtime/indent/lua.vim b/runtime/indent/lua.vim
new file mode 100644
index 0000000..0d1f934
--- /dev/null
+++ b/runtime/indent/lua.vim
@@ -0,0 +1,66 @@
+" Vim indent file
+" Language: Lua script
+" Maintainer: Marcus Aurelius Farias <marcus.cf 'at' bol.com.br>
+" First Author: Max Ischenko <mfi 'at' ukr.net>
+" Last Change: 2017 Jun 13
+" 2022 Sep 07: b:undo_indent added by Doug Kearns
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetLuaIndent()
+
+" To make Vim call GetLuaIndent() when it finds '\s*end' or '\s*until'
+" on the current line ('else' is default and includes 'elseif').
+setlocal indentkeys+=0=end,0=until
+
+setlocal autoindent
+
+let b:undo_indent = "setlocal autoindent< indentexpr< indentkeys<"
+
+" Only define the function once.
+if exists("*GetLuaIndent")
+ finish
+endif
+
+function! GetLuaIndent()
+ " 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
+
+ " Add a 'shiftwidth' after lines that start a block:
+ " 'function', 'if', 'for', 'while', 'repeat', 'else', 'elseif', '{'
+ let ind = indent(prevlnum)
+ let prevline = getline(prevlnum)
+ let midx = match(prevline, '^\s*\%(if\>\|for\>\|while\>\|repeat\>\|else\>\|elseif\>\|do\>\|then\>\)')
+ if midx == -1
+ let midx = match(prevline, '{\s*$')
+ if midx == -1
+ let midx = match(prevline, '\<function\>\s*\%(\k\|[.:]\)\{-}\s*(')
+ endif
+ endif
+
+ if midx != -1
+ " 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()
+ endif
+ endif
+
+ " Subtract a 'shiftwidth' on end, else, elseif, until and '}'
+ " 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()
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/mail.vim b/runtime/indent/mail.vim
new file mode 100644
index 0000000..22bb0f7
--- /dev/null
+++ b/runtime/indent/mail.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: Mail
+" Maintainer: Bram Moolenaar
+" Last Change: 2021 Sep 26
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" What works best is auto-indenting, disable other indenting.
+" For formatting see the ftplugin.
+setlocal autoindent nosmartindent nocindent indentexpr=
+
+let b:undo_indent = "setl ai< cin< inde< si<"
diff --git a/runtime/indent/make.vim b/runtime/indent/make.vim
new file mode 100644
index 0000000..4d1838b
--- /dev/null
+++ b/runtime/indent/make.vim
@@ -0,0 +1,119 @@
+" Vim indent file
+" Language: Makefile
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2022 Apr 06
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetMakeIndent()
+setlocal indentkeys=!^F,o,O,<:>,=else,=endif
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetMakeIndent")
+ finish
+endif
+
+let s:comment_rx = '^\s*#'
+let s:rule_rx = '^[^ \t#:][^#:]*:\{1,2}\%([^=:]\|$\)'
+let s:continued_rule_rx = '^[^#:]*:\{1,2}\%([^=:]\|$\)'
+let s:continuation_rx = '\\$'
+let s:assignment_rx = '^\s*\h\w*\s*[+:?]\==\s*\zs.*\\$'
+let s:folded_assignment_rx = '^\s*\h\w*\s*[+:?]\=='
+" TODO: This needs to be a lot more restrictive in what it matches.
+let s:just_inserted_rule_rx = '^\s*[^#:]\+:\{1,2}$'
+let s:conditional_directive_rx = '^ *\%(ifn\=\%(eq\|def\)\|else\)\>'
+let s:end_conditional_directive_rx = '^\s*\%(else\|endif\)\>'
+
+function s:remove_continuation(line)
+ return substitute(a:line, s:continuation_rx, "", "")
+endfunction
+
+function GetMakeIndent()
+ " TODO: Should this perhaps be v:lnum -1?
+" let prev_lnum = prevnonblank(v:lnum - 1)
+ let prev_lnum = v:lnum - 1
+ if prev_lnum == 0
+ return 0
+ endif
+ let prev_line = getline(prev_lnum)
+
+ let prev_prev_lnum = prev_lnum - 1
+ let prev_prev_line = prev_prev_lnum != 0 ? getline(prev_prev_lnum) : ""
+
+ " TODO: Deal with comments. In comments, continuations aren't interesting.
+ if prev_line =~ s:continuation_rx
+ if prev_prev_line =~ s:continuation_rx
+ return indent(prev_lnum)
+ elseif prev_line =~ s:rule_rx
+ 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 shiftwidth()
+ endif
+ else
+ " TODO: OK, this might be a continued shell command, so perhaps indent
+ " properly here? Leave this out for now, but in the next release this
+ " should be using indent/sh.vim somehow.
+ "if prev_line =~ '^\t' " s:rule_command_rx
+ " if prev_line =~ '^\s\+[@-]\%(if\)\>'
+ " return indent(prev_lnum) + 2
+ " endif
+ "endif
+ 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)
+ let lnum = prev_prev_lnum - 1
+ let line = getline(lnum)
+ while line =~ s:continuation_rx
+ let folded_line = s:remove_continuation(line) . ' ' . folded_line
+ let lnum -= 1
+ let line = getline(lnum)
+ endwhile
+ let folded_lnum = lnum + 1
+ if folded_line =~ s:rule_rx
+ if getline(v:lnum) =~ s:rule_rx
+ return 0
+ else
+ return &ts
+ endif
+ else
+" elseif folded_line =~ s:folded_assignment_rx
+ if getline(v:lnum) =~ s:rule_rx
+ return 0
+ else
+ return indent(folded_lnum)
+ endif
+" else
+" " TODO: ?
+" return indent(prev_lnum)
+ endif
+ elseif prev_line =~ s:rule_rx
+ if getline(v:lnum) =~ s:rule_rx
+ return 0
+ else
+ return &ts
+ endif
+ elseif prev_line =~ s:conditional_directive_rx
+ 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) - shiftwidth()
+ else
+ return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1)
+ endif
+ endif
+endfunction
diff --git a/runtime/indent/matlab.vim b/runtime/indent/matlab.vim
new file mode 100644
index 0000000..10d8460
--- /dev/null
+++ b/runtime/indent/matlab.vim
@@ -0,0 +1,123 @@
+" Vim indent file
+" Language: MATLAB
+" Maintainer: Axel Forsman <axelsfor@gmail.com>
+" Previous maintainer: Christophe Poucet <christophe.poucet@pandora.be>
+" Last Update: 2021-10-01
+
+" Only load if no other indent file is loaded
+if exists('b:did_indent') | finish | endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetMatlabIndent()
+setlocal indentkeys=!,o,O,e,0=end,0=elseif,0=case,0=otherwise,0=catch,0=function,0=elsei
+let b:undo_indent = "setlocal indentexpr< indentkeys<"
+
+" The value of the Function indenting format in
+" MATLAB Editor/Debugger Language Preferences.
+" The possible values are 0 for Classic, 1 for Indent nested functions
+" and 2 for Indent all functions (default).
+let b:MATLAB_function_indent = get(g:, 'MATLAB_function_indent', 2)
+" The previous value of b:changedtick
+let b:MATLAB_lasttick = -1
+" The previously indented line
+let b:MATLAB_lastline = -1
+" Whether the line above was a line continuation
+let b:MATLAB_waslc = 0
+let b:MATLAB_bracketlevel = 0
+
+" Only define the function once
+if exists("*GetMatlabIndent") | finish | endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+let s:end = '\<end\>\%([^({]*[)}]\)\@!' " Array indexing heuristic
+let s:open_pat = 'for\|if\|parfor\|spmd\|switch\|try\|while\|classdef\|properties\|methods\|events\|enumeration'
+let s:dedent_pat = '\C^\s*\zs\<\%(end\|else\|elseif\|catch\|\(case\|otherwise\|function\)\)\>'
+let s:start_pat = '\C\<\%(function\|' . s:open_pat . '\)\>'
+let s:bracket_pair_pat = '\(\[\|{\)\|\(\]\|}\)'
+let s:zflag = has('patch-7.4.984') ? 'z' : ''
+
+" Returns whether a comment or string envelops the specified column.
+function! s:IsCommentOrString(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), "name") =~# 'matlabComment\|matlabMultilineComment\|matlabCellComment\|matlabString'
+endfunction
+
+" Returns whether the specified line continues on the next line.
+function! s:IsLineContinuation(lnum)
+ let l = getline(a:lnum) | let c = -3
+ while 1
+ let c = match(l, '\.\{3}', c + 3)
+ if c == -1 | return 0
+ elseif !s:IsCommentOrString(a:lnum, c) | return 1 | endif
+ endwhile
+endfunction
+
+function! s:SubmatchCount(lnum, pattern, ...)
+ let endcol = a:0 >= 1 ? a:1 : 1 / 0 | let x = [0, 0, 0, 0]
+ call cursor(a:lnum, 1)
+ while 1
+ let [lnum, c, submatch] = searchpos(a:pattern, 'cpe' . s:zflag, a:lnum)
+ if !submatch || c >= endcol | break | endif
+ if !s:IsCommentOrString(lnum, c) | let x[submatch - 2] += 1 | endif
+ if cursor(0, c + 1) == -1 || col('.') == c | break | endif
+ endwhile
+ return x
+endfunction
+
+function! s:GetOpenCloseCount(lnum, pattern, ...)
+ let counts = call('s:SubmatchCount', [a:lnum, a:pattern] + a:000)
+ return counts[0] - counts[1]
+endfunction
+
+function! GetMatlabIndent()
+ let prevlnum = prevnonblank(v:lnum - 1)
+
+ if b:MATLAB_lasttick != b:changedtick || b:MATLAB_lastline != prevlnum
+ " Recalculate bracket count (only have to check same block and line above)
+ let b:MATLAB_bracketlevel = 0
+ let previndent = indent(prevlnum) | let l = prevlnum
+ while 1
+ let l = prevnonblank(l - 1) | let indent = indent(l)
+ if l <= 0 || previndent < indent | break | endif
+ let b:MATLAB_bracketlevel += s:GetOpenCloseCount(l, s:bracket_pair_pat)
+ if previndent != indent | break | endif
+ endwhile
+
+ let b:MATLAB_waslc = s:IsLineContinuation(prevlnum - 1)
+ endif
+ " If line above was blank it can impossibly have been a LC
+ let above_lc = b:MATLAB_lasttick == b:changedtick && prevlnum != v:lnum - 1 && b:MATLAB_lastline == prevlnum ? 0 : s:IsLineContinuation(v:lnum - 1)
+
+ let pair_pat = '\C\<\(' . s:open_pat . '\|'
+ \ . (b:MATLAB_function_indent == 1 ? '^\@<!' : '')
+ \ . (b:MATLAB_function_indent >= 1 ? 'function\|' : '')
+ \ . '\|\%(^\s*\)\@<=\%(else\|elseif\|case\|otherwise\|catch\)\)\>'
+ \ . '\|\S\s*\zs\(' . s:end . '\)'
+ let [open, close, b_open, b_close] = prevlnum ? s:SubmatchCount(prevlnum,
+ \ pair_pat . '\|' . s:bracket_pair_pat) : [0, 0, 0, 0]
+ let curbracketlevel = b:MATLAB_bracketlevel + b_open - b_close
+
+ call cursor(v:lnum, 1)
+ let submatch = search(s:dedent_pat, 'cp' . s:zflag, v:lnum)
+ if submatch && !s:IsCommentOrString(v:lnum, col('.'))
+ " Align end, et cetera with start of block
+ let [lnum, col] = searchpairpos(s:start_pat, '', '\C' . s:end, 'bW', 's:IsCommentOrString(line("."), col("."))')
+ let result = lnum ? indent(lnum) + shiftwidth() * (s:GetOpenCloseCount(lnum, pair_pat, col) + submatch == 2) : 0
+ else
+ " Count how many blocks the previous line opens/closes
+ " Line continuations/brackets indent once per statement
+ let result = (prevlnum > 0) * indent(prevlnum) + shiftwidth() * (open - close
+ \ + (b:MATLAB_bracketlevel ? -!curbracketlevel : !!curbracketlevel)
+ \ + (curbracketlevel <= 0) * (above_lc - b:MATLAB_waslc))
+ endif
+
+ let b:MATLAB_waslc = above_lc
+ let b:MATLAB_bracketlevel = curbracketlevel
+ let b:MATLAB_lasttick = b:changedtick
+ let b:MATLAB_lastline = v:lnum
+ return result
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/indent/meson.vim b/runtime/indent/meson.vim
new file mode 100644
index 0000000..09131f5
--- /dev/null
+++ b/runtime/indent/meson.vim
@@ -0,0 +1,183 @@
+" Vim indent file
+" Language: Meson
+" License: VIM License
+" Maintainer: Nirbheek Chauhan <nirbheek.chauhan@gmail.com>
+" Liam Beguin <liambeguin@gmail.com>
+" Original Authors: David Bustos <bustos@caltech.edu>
+" Bram Moolenaar <Bram@vim.org>
+" Last Change: 2019 Oct 18
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Some preliminary settings
+setlocal nolisp " Make sure lisp indenting doesn't supersede us
+setlocal autoindent " indentexpr isn't much help otherwise
+
+setlocal indentexpr=GetMesonIndent(v:lnum)
+setlocal indentkeys+==elif,=else,=endforeach,=endif,0)
+
+let b:undo_indent = "setl ai< inde< indk< lisp<"
+
+" Only define the function once.
+if exists("*GetMesonIndent")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Come here when loading the script the first time.
+
+let s:maxoff = 50 " maximum number of lines to look backwards for ()
+
+function GetMesonIndent(lnum)
+ echom getline(line("."))
+
+ " 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) + (exists("g:mesonindent_continue") ? eval(g:mesonindent_continue) : (shiftwidth() * 2))
+ endif
+
+ " If the start of the line is in a string don't change the indent.
+ if has('syntax_items')
+ \ && synIDattr(synID(a:lnum, 1, 1), "name") =~ "String$"
+ return -1
+ endif
+
+ " Search backwards for the previous non-empty line.
+ let plnum = prevnonblank(v:lnum - 1)
+
+ if plnum == 0
+ " This is the first non-empty line, use zero indent.
+ return 0
+ endif
+
+ " 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
+ " going too far back.
+ call cursor(plnum, 1)
+ let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW',
+ \ "line('.') < " . (plnum - s:maxoff) . " ? dummy :"
+ \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+ \ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
+ if parlnum > 0
+ let plindent = indent(parlnum)
+ let plnumstart = parlnum
+ else
+ let plindent = indent(plnum)
+ let plnumstart = plnum
+ endif
+
+
+ " When inside parenthesis: If at the first line below the parenthesis add
+ " a 'shiftwidth', otherwise same as previous line.
+ " i = (a
+ " + b
+ " + c)
+ call cursor(a:lnum, 1)
+ let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
+ \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
+ \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+ \ . " =~ '\\(Comment\\|Todo\\|String\\)$'")
+ 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\\)$'")
+ if pp > 0
+ return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth())
+ endif
+ return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : shiftwidth())
+ endif
+ if plnumstart == p
+ return indent(plnum)
+ endif
+ return plindent
+ endif
+
+
+ " Get the line and remove a trailing comment.
+ " Use syntax highlighting attributes when possible.
+ let pline = getline(plnum)
+ let pline_len = strlen(pline)
+ 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(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$"
+ let min = 1
+ let max = pline_len
+ while min < max
+ let col = (min + max) / 2
+ if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$"
+ let max = col
+ else
+ let min = col + 1
+ endif
+ endwhile
+ let pline = strpart(pline, 0, min - 1)
+ endif
+ else
+ let col = 0
+ while col < pline_len
+ if pline[col] == '#'
+ let pline = strpart(pline, 0, col)
+ break
+ endif
+ let col = col + 1
+ endwhile
+ endif
+
+ " If the previous line ended the conditional/loop
+ if getline(plnum) =~ '^\s*\(endif\|endforeach\)\>\s*'
+ " Maintain indent
+ return -1
+ endif
+
+ " If the previous line ended with a builtin, indent this line
+ if pline =~ '^\s*\(foreach\|if\|else\|elif\)\>\s*'
+ return plindent + shiftwidth()
+ endif
+
+ " If the current line begins with a header keyword, deindent
+ if getline(a:lnum) =~ '^\s*\(else\|elif\|endif\|endforeach\)'
+
+ " Unless the previous line was a one-liner
+ if getline(plnumstart) =~ '^\s*\(foreach\|if\)\>\s*'
+ return plindent
+ endif
+
+ " Or the user has already dedented
+ if indent(a:lnum) <= plindent - shiftwidth()
+ return -1
+ endif
+
+ return plindent - shiftwidth()
+ endif
+
+ " When after a () construct we probably want to go back to the start line.
+ " a = (b
+ " + c)
+ " here
+ if parlnum > 0
+ return plindent
+ endif
+
+ return -1
+
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:sw=2
diff --git a/runtime/indent/mf.vim b/runtime/indent/mf.vim
new file mode 100644
index 0000000..893323d
--- /dev/null
+++ b/runtime/indent/mf.vim
@@ -0,0 +1,6 @@
+" METAFONT indent file
+" Language: METAFONT
+" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Latest Revision: 2022 Aug 12
+
+runtime! indent/mp.vim
diff --git a/runtime/indent/mma.vim b/runtime/indent/mma.vim
new file mode 100644
index 0000000..9dbfd74
--- /dev/null
+++ b/runtime/indent/mma.vim
@@ -0,0 +1,79 @@
+" Vim indent file
+" Language: Mathematica
+" Maintainer: Steve Layland <layland@wolfram.com> (Invalid email address)
+" Doug Kearns <dougkearns@gmail.com>
+" Last Change: Sat May 10 18:56:22 CDT 2005
+" 2022 April: b:undo_indent added by Doug Kearns
+" Source: http://vim.sourceforge.net/scripts/script.php?script_id=1274
+" http://members.wolfram.com/layland/vim/indent/mma.vim
+"
+" NOTE:
+" Empty .m files will automatically be presumed to be Matlab files
+" unless you have the following in your .vimrc:
+"
+" let filetype_m="mma"
+"
+" Credits:
+" o steve hacked this out of a random indent file in the Vim 6.1
+" distribution that he no longer remembers...sh.vim? Thanks!
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetMmaIndent()
+setlocal indentkeys+=0[,0],0(,0)
+setlocal nosi "turn off smart indent so we don't over analyze } blocks
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetMmaIndent")
+ finish
+endif
+
+function GetMmaIndent()
+
+ " Hit the start of the file, use zero indent.
+ if v:lnum == 0
+ return 0
+ endif
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " use indenting as a base
+ let ind = indent(v:lnum)
+ let lnum = v:lnum
+
+ " if previous line has an unmatched bracket, or ( indent.
+ " doesn't do multiple parens/blocks/etc...
+
+ " 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+shiftwidth()
+ endif
+
+ " if this line had unmatched closing block,
+ " indent to the matching opening block
+ if getline(v:lnum) =~ '[^[]*]\s*$'
+ " move to the closing bracket
+ call search(']','bW')
+ " and find its partner's indent
+ let ind = indent(searchpair('\[','',']','bWn'))
+ " same for ( blocks
+ elseif getline(v:lnum) =~ '[^(]*)$'
+ call search(')','bW')
+ let ind = indent(searchpair('(','',')','bWn'))
+
+ " and finally, close { blocks if si ain't already set
+ elseif getline(v:lnum) =~ '[^{]*}'
+ call search('}','bW')
+ let ind = indent(searchpair('{','','}','bWn'))
+ endif
+
+ return ind
+endfunction
+
diff --git a/runtime/indent/mp.vim b/runtime/indent/mp.vim
new file mode 100644
index 0000000..07873e1
--- /dev/null
+++ b/runtime/indent/mp.vim
@@ -0,0 +1,320 @@
+vim9script
+
+# MetaPost indent file
+# Language: MetaPost
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Eugene Minkovskii <emin@mccme.ru>
+# Latest Revision: 2022 Aug 12
+
+if exists("b:did_indent")
+ finish
+endif
+
+b:did_indent = 1
+
+setlocal indentexpr=g:MetaPostIndent()
+setlocal indentkeys+==end,=else,=fi,=fill,0),0]
+setlocal nolisp
+setlocal nosmartindent
+
+b:undo_indent = "setl indentexpr< indentkeys< lisp< smartindent<"
+
+# Regexps {{{
+# Expressions starting indented blocks
+const MP_OPEN_TAG = [
+ '\<if\>',
+ '\<else\%[if]\>',
+ '\<for\%(\|ever\|suffixes\)\>',
+ '\<begingroup\>',
+ '\<\%(\|var\|primary\|secondary\|tertiary\)def\>',
+ '^\s*\<begin\%(fig\|graph\|glyph\|char\|logochar\)\>',
+ '[([{]',
+ ]->extend(get(g:, "mp_open_tag", []))->join('\|')
+
+# Expressions ending indented blocks
+const MP_CLOSE_TAG = [
+ '\<fi\>',
+ '\<else\%[if]\>',
+ '\<end\%(\|for\|group\|def\|fig\|char\|glyph\|graph\)\>',
+ '[)\]}]'
+ ]->extend(get(g:, "mp_close_tag", []))->join('\|')
+
+# 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.
+const MP_STATEMENT = [
+ '\<\%(\|un\|cut\)draw\%(dot\)\=\>',
+ '\<\%(\|un\)fill\%[draw]\>',
+ '\<draw\%(dbl\)\=arrow\>',
+ '\<clip\>',
+ '\<addto\>',
+ '\<save\>',
+ '\<setbounds\>',
+ '\<message\>',
+ '\<errmessage\>',
+ '\<errhelp\>',
+ '\<fontmapline\>',
+ '\<pickup\>',
+ '\<show\>',
+ '\<special\>',
+ '\<write\>',
+ '\%(^\|;\)\%([^;=]*\%(' .. MP_OPEN_TAG .. '\)\)\@!.\{-}:\==',
+ ]->join('\|')
+
+# A line ends with zero or more spaces, possibly followed by a comment.
+const EOL = '\s*\%($\|%\)'
+# }}}
+
+# Auxiliary functions {{{
+# Returns true if (0-based) position immediately preceding `pos` in `line` is
+# inside a string or a comment; returns false 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.
+def IsCommentOrString(line: string, pos: number): bool
+ var in_string = 0
+ var q = stridx(line, '"')
+ var c = stridx(line, '%')
+
+ while q >= 0 && q < pos
+ if c >= 0 && c < q
+ if in_string # Find next percent symbol
+ c = stridx(line, '%', q + 1)
+ else # Inside comment
+ return true
+ endif
+ endif
+ in_string = 1 - in_string
+ q = stridx(line, '"', q + 1) # Find next quote
+ endwhile
+
+ return in_string || (c >= 0 && c <= pos)
+enddef
+
+# Find the first non-comment non-blank line before the given line.
+def PrevNonBlankNonComment(lnum: number): number
+ var nr = prevnonblank(lnum - 1)
+ while getline(nr) =~# '^\s*%'
+ nr = prevnonblank(nr - 1)
+ endwhile
+ return nr
+enddef
+
+# Returns true if the last tag appearing in the line is an open tag; returns
+# false otherwise.
+def LastTagIsOpen(line: string): bool
+ var o = LastValidMatchEnd(line, MP_OPEN_TAG, 0)
+ if o == - 1
+ return false
+ endif
+ return LastValidMatchEnd(line, MP_CLOSE_TAG, o) < 0
+enddef
+
+# 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 MetaPostIndent()).
+#
+# 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
+def Weight(line: string): number
+ var o = 0
+ var i = ValidMatchEnd(line, MP_OPEN_TAG, 0)
+ while i > 0
+ o += 1
+ i = ValidMatchEnd(line, MP_OPEN_TAG, i)
+ endwhile
+ var c = 0
+ i = matchend(line, '^\s*\<else\%[if]\>') # Skip a leading else[if]
+ i = ValidMatchEnd(line, MP_CLOSE_TAG, i)
+ while i > 0
+ c += 1
+ i = ValidMatchEnd(line, MP_CLOSE_TAG, i)
+ endwhile
+ return o - c
+enddef
+
+# Similar to matchend(), but skips strings and comments.
+# line: a String
+def ValidMatchEnd(line: string, pat: string, start: number): number
+ var i = matchend(line, pat, start)
+ while i > 0 && IsCommentOrString(line, i)
+ i = matchend(line, pat, i)
+ endwhile
+ return i
+enddef
+
+# Like s:ValidMatchEnd(), but returns the end position of the last (i.e.,
+# rightmost) match.
+def LastValidMatchEnd(line: string, pat: string, start: number): number
+ var last_found = -1
+ var i = matchend(line, pat, start)
+ while i > 0
+ if !IsCommentOrString(line, i)
+ last_found = i
+ endif
+ i = matchend(line, pat, i)
+ endwhile
+ return last_found
+enddef
+
+def DecreaseIndentOnClosingTag(curr_indent: number): number
+ var cur_text = getline(v:lnum)
+ if cur_text =~# '^\s*\%(' .. MP_CLOSE_TAG .. '\)'
+ return max([curr_indent - shiftwidth(), 0])
+ endif
+ return curr_indent
+enddef
+# }}}
+
+# Main function {{{
+def g:MetaPostIndent(): number
+ # Do not touch indentation inside verbatimtex/btex.. etex blocks.
+ if synIDattr(synID(v:lnum, 1, 1), "name") =~# '^mpTeXinsert$\|^tex\|^Delimiter'
+ return -1
+ endif
+
+ # At the start of a MetaPost block inside ConTeXt, do not touch indentation
+ if synIDattr(synID(prevnonblank(v:lnum - 1), 1, 1), "name") == "contextBlockDelim"
+ return -1
+ endif
+
+ var lnum = PrevNonBlankNonComment(v:lnum)
+
+ # At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ var prev_text = getline(lnum)
+
+ # 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).
+ #
+ # User-defined overrides take precedence over anything else.
+ var j = match(prev_text, '%[<>=!]')
+ if j > 0
+ var i = strlen(matchstr(prev_text, '%>\+', j)) - 1
+ if i > 0
+ return indent(lnum) + i * shiftwidth()
+ endif
+
+ i = strlen(matchstr(prev_text, '%<\+', j)) - 1
+ if i > 0
+ return max([indent(lnum) - i * shiftwidth(), 0])
+ endif
+
+ if match(prev_text, '%=', j) > -1
+ return indent(lnum)
+ endif
+
+ if match(prev_text, '%!', j) > -1
+ return -1
+ endif
+ endif
+
+ # 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 LastTagIsOpen(prev_text)
+ return DecreaseIndentOnClosingTag(indent(lnum) + shiftwidth())
+ endif
+
+ # 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 Weight(prev_text) > 0
+ return 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 `:=`.
+ #
+ var i = LastValidMatchEnd(prev_text, MP_STATEMENT, 0)
+ if i >= 0 # Does the line contain a statement?
+ if ValidMatchEnd(prev_text, ';', i) < 0 # Is the statement unterminated?
+ return indent(lnum) + shiftwidth()
+ else
+ return DecreaseIndentOnClosingTag(indent(lnum))
+ endif
+ endif
+
+ # 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 ValidMatchEnd(prev_text, ';' .. EOL, 0) >= 0 # L ends with a semicolon
+ var stm_lnum = PrevNonBlankNonComment(lnum)
+ while stm_lnum > 0
+ prev_text = getline(stm_lnum)
+ var sc_pos = LastValidMatchEnd(prev_text, ';', 0)
+ var stm_pos = ValidMatchEnd(prev_text, MP_STATEMENT, sc_pos)
+ if stm_pos > sc_pos
+ lnum = stm_lnum
+ break
+ elseif sc_pos > stm_pos
+ break
+ endif
+ stm_lnum = PrevNonBlankNonComment(stm_lnum)
+ endwhile
+ endif
+
+ return DecreaseIndentOnClosingTag(indent(lnum))
+enddef
+# }}}
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/indent/nginx.vim b/runtime/indent/nginx.vim
new file mode 100644
index 0000000..6550609
--- /dev/null
+++ b/runtime/indent/nginx.vim
@@ -0,0 +1,78 @@
+" Vim indent file
+" Language: nginx.conf
+" Maintainer: Chris Aumann <me@chr4.org>
+" Last Change: 2022 Dec 01
+
+" Only load this indent file when no other was loaded.
+if exists('b:did_indent')
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetNginxIndent()
+
+setlocal indentkeys=0{,0},0#,!^F,o,O
+
+let b:undo_indent = 'setl inde< indk<'
+
+" Only define the function once.
+if exists('*GetNginxIndent')
+ finish
+endif
+
+function GetNginxIndent() abort
+ let plnum = s:PrevNotAsBlank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if plnum == 0
+ return 0
+ endif
+
+ let ind = indent(plnum)
+
+ " Add a 'shiftwidth' after '{'
+ if s:AsEndWith(getline(plnum), '{')
+ let ind = ind + shiftwidth()
+ end
+
+ " Subtract a 'shiftwidth' on '}'
+ " This is the part that requires 'indentkeys'.
+ if getline(v:lnum) =~ '^\s*}'
+ let ind = ind - shiftwidth()
+ endif
+
+ let pplnum = s:PrevNotAsBlank(plnum - 1)
+
+ if s:IsLineContinuation(plnum)
+ if !s:IsLineContinuation(pplnum)
+ let ind = ind + shiftwidth()
+ end
+ else
+ if s:IsLineContinuation(pplnum)
+ let ind = ind - shiftwidth()
+ end
+ endif
+
+ return ind
+endfunction
+
+" Find the first line at or above {lnum} that is non-blank and not a comment.
+function s:PrevNotAsBlank(lnum) abort
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ if getline(lnum) !~ '^\s*#'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+" Check whether {line} ends with {pat}, ignoring trailing comments.
+function s:AsEndWith(line, pat) abort
+ return a:line =~ a:pat . '\m\s*\%(#.*\)\?$'
+endfunction
+
+function s:IsLineContinuation(lnum) abort
+ return a:lnum > 0 && !s:AsEndWith(getline(a:lnum), '[;{}]')
+endfunction
diff --git a/runtime/indent/nsis.vim b/runtime/indent/nsis.vim
new file mode 100644
index 0000000..5d3decc
--- /dev/null
+++ b/runtime/indent/nsis.vim
@@ -0,0 +1,93 @@
+" Vim indent file
+" Language: NSIS script
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/vim-nsis
+" Last Change: 2021-10-18
+" 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
+
+let b:undo_indent = "setl ai< inde< indk< si<"
+
+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/objc.vim b/runtime/indent/objc.vim
new file mode 100644
index 0000000..1d10705
--- /dev/null
+++ b/runtime/indent/objc.vim
@@ -0,0 +1,79 @@
+" Vim indent file
+" Language: Objective-C
+" Maintainer: Kazunobu Kuriyama <kazunobu.kuriyama@nifty.com>
+" Last Change: 2022 Apr 06
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+setlocal cindent
+
+" Set the function to do the work.
+setlocal indentexpr=GetObjCIndent()
+
+" To make a colon (:) suggest an indentation other than a goto/switch label,
+setlocal indentkeys-=:
+setlocal indentkeys+=<:>
+
+let b:undo_indent = "setl cin< inde< indk<"
+
+" Only define the function once.
+if exists("*GetObjCIndent")
+ finish
+endif
+
+function s:GetWidth(line, regexp)
+ let end = matchend(a:line, a:regexp)
+ let width = 0
+ let i = 0
+ while i < end
+ if a:line[i] != "\t"
+ let width = width + 1
+ else
+ let width = width + &ts - (width % &ts)
+ endif
+ let i = i + 1
+ endwhile
+ return width
+endfunction
+
+function s:LeadingWhiteSpace(line)
+ let end = strlen(a:line)
+ let width = 0
+ let i = 0
+ while i < end
+ let char = a:line[i]
+ if char != " " && char != "\t"
+ break
+ endif
+ if char != "\t"
+ let width = width + 1
+ else
+ let width = width + &ts - (width % &ts)
+ endif
+ let i = i + 1
+ endwhile
+ return width
+endfunction
+
+
+function GetObjCIndent()
+ let theIndent = cindent(v:lnum)
+
+ let prev_line = getline(v:lnum - 1)
+ let cur_line = getline(v:lnum)
+
+ if prev_line !~# ":" || cur_line !~# ":"
+ return theIndent
+ endif
+
+ if prev_line !~# ";"
+ let prev_colon_pos = s:GetWidth(prev_line, ":")
+ let delta = s:GetWidth(cur_line, ":") - s:LeadingWhiteSpace(cur_line)
+ let theIndent = prev_colon_pos - delta
+ endif
+
+ return theIndent
+endfunction
diff --git a/runtime/indent/obse.vim b/runtime/indent/obse.vim
new file mode 100644
index 0000000..6603723
--- /dev/null
+++ b/runtime/indent/obse.vim
@@ -0,0 +1,55 @@
+" Vim indent file
+" Language: Oblivion Language (obl)
+" Original Creator: Kat <katisntgood@gmail.com>
+" Maintainer: Kat <katisntgood@gmail.com>
+" Created: 01 November 2021
+" Last Change: 13 November 2022
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+let b:undo_indent = 'setlocal indentkeys< indentexpr<'
+
+setlocal indentexpr=GetOblIndent()
+setlocal indentkeys+==~endif,=~else,=~loop,=~end
+
+if exists("*GetOblIndent")
+ finish
+endif
+let s:keepcpo = &cpo
+set cpo&vim
+
+let s:SKIP_LINES = '^\s*\(;.*\)'
+function! GetOblIndent()
+
+ let lnum = prevnonblank(v:lnum - 1)
+ let cur_text = getline(v:lnum)
+ if lnum == 0
+ return 0
+ endif
+ let prev_text = getline(lnum)
+ let found_cont = 0
+ let ind = indent(lnum)
+
+ " indent next line on start terms
+ let i = match(prev_text, '\c^\s*\(\s\+\)\?\(\(if\|while\|foreach\|begin\|else\%[if]\)\>\)')
+ if i >= 0
+ let ind += shiftwidth()
+ if strpart(prev_text, i, 1) == '|' && has('syntax_items')
+ \ && synIDattr(synID(lnum, i, 1), "name") =~ '\(Comment\|String\)$'
+ let ind -= shiftwidth()
+ endif
+ endif
+ " indent current line on end/else terms
+ if cur_text =~ '\c^\s*\(\s\+\)\?\(\(loop\|endif\|else\%[if]\)\>\)'
+ let ind = ind - shiftwidth()
+ " if we are at a begin block just go to column 0
+ elseif cur_text =~ '\c^\s*\(\s\+\)\?\(\(begin\|end\)\>\)'
+ let ind = 0
+ endif
+ return ind
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/indent/ocaml.vim b/runtime/indent/ocaml.vim
new file mode 100644
index 0000000..19c81f4
--- /dev/null
+++ b/runtime/indent/ocaml.vim
@@ -0,0 +1,274 @@
+" Vim indent file
+" Language: OCaml
+" Maintainers: Jean-Francois Yuen <jfyuen@happycoders.org>
+" Mike Leary <leary@nwlink.com>
+" Markus Mottl <markus.mottl@gmail.com>
+" URL: https://github.com/ocaml/vim-ocaml
+" 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)
+"
+" Marc Weber's comment: This file may contain a lot of (very custom) stuff
+" which eventually should be moved somewhere else ..
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal expandtab
+setlocal indentexpr=GetOCamlIndent()
+setlocal indentkeys+=0=and,0=class,0=constraint,0=done,0=else,0=end,0=exception,0=external,0=if,0=in,0=include,0=inherit,0=initializer,0=let,0=method,0=open,0=then,0=type,0=val,0=with,0;;,0>\],0\|\],0>},0\|,0},0\],0)
+setlocal nolisp
+setlocal nosmartindent
+
+" At least Marc Weber and Markus Mottl do not like this:
+" setlocal textwidth=80
+
+" Comment formatting
+if !exists("no_ocaml_comments")
+ if (has("comments"))
+ setlocal comments=sr:(*\ ,mb:\ ,ex:*)
+ setlocal comments^=sr:(**,mb:\ \ ,ex:*)
+ setlocal fo=cqort
+ endif
+endif
+
+" Only define the function once.
+if exists("*GetOCamlIndent")
+ finish
+endif
+
+" Define some patterns:
+let s:beflet = '^\s*\(initializer\|method\|try\)\|\(\<\(begin\|do\|else\|in\|then\|try\)\|->\|<-\|=\|;\|(\)\s*$'
+let s:letpat = '^\s*\(let\|type\|module\|class\|open\|exception\|val\|include\|external\)\>'
+let s:letlim = '\(\<\(sig\|struct\)\|;;\)\s*$'
+let s:lim = '^\s*\(exception\|external\|include\|let\|module\|open\|type\|val\)\>'
+let s:module = '\<\%(begin\|sig\|struct\|object\)\>'
+let s:obj = '^\s*\(constraint\|inherit\|initializer\|method\|val\)\>\|\<\(object\|object\s*(.*)\)\s*$'
+let s:type = '^\s*\%(class\|let\|type\)\>.*='
+
+" Skipping pattern, for comments
+function! s:GetLineWithoutFullComment(lnum)
+ let lnum = prevnonblank(a:lnum - 1)
+ let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '')
+ while lline =~ '^\s*$' && lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '')
+ endwhile
+ return lnum
+endfunction
+
+" Indent for ';;' to match multiple 'let'
+function! s:GetInd(lnum, pat, lim)
+ let llet = search(a:pat, 'bW')
+ let old = indent(a:lnum)
+ while llet > 0
+ let old = indent(llet)
+ let nb = s:GetLineWithoutFullComment(llet)
+ if getline(nb) =~ a:lim
+ return old
+ endif
+ let llet = search(a:pat, 'bW')
+ endwhile
+ return old
+endfunction
+
+" Indent pairs
+function! s:FindPair(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+ return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+endfunction
+
+" Indent 'let'
+function! s:FindLet(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+ return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "^\\s*let\\>.*=.*\\<in\\s*$" || getline(prevnonblank(".") - 1) =~ s:beflet'))
+endfunction
+
+function! GetOCamlIndent()
+ " Find a non-commented line above the current line.
+ let lnum = s:GetLineWithoutFullComment(v:lnum)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '')
+
+ " Return double 'shiftwidth' after lines matching:
+ if lline =~ '^\s*|.*->\s*$'
+ return ind + 2 * shiftwidth()
+ endif
+
+ let line = getline(v:lnum)
+
+ " Indent if current line begins with 'end':
+ if line =~ '^\s*end\>'
+ return s:FindPair(s:module, '','\<end\>')
+
+ " Indent if current line begins with 'done' for 'do':
+ elseif line =~ '^\s*done\>'
+ return s:FindPair('\<do\>', '','\<done\>')
+
+ " Indent if current line begins with '}' or '>}':
+ elseif line =~ '^\s*\(\|>\)}'
+ return s:FindPair('{', '','}')
+
+ " Indent if current line begins with ']', '|]' or '>]':
+ elseif line =~ '^\s*\(\||\|>\)\]'
+ return s:FindPair('\[', '','\]')
+
+ " Indent if current line begins with ')':
+ elseif line =~ '^\s*)'
+ return s:FindPair('(', '',')')
+
+ " Indent if current line begins with 'let':
+ elseif line =~ '^\s*let\>'
+ if lline !~ s:lim . '\|' . s:letlim . '\|' . s:beflet
+ return s:FindLet(s:type, '','\<let\s*$')
+ endif
+
+ " Indent if current line begins with 'class' or 'type':
+ elseif line =~ '^\s*\(class\|type\)\>'
+ if lline !~ s:lim . '\|\<and\s*$\|' . s:letlim
+ return s:FindLet(s:type, '','\<\(class\|type\)\s*$')
+ endif
+
+ " Indent for pattern matching:
+ elseif line =~ '^\s*|'
+ if lline !~ '^\s*\(|[^\]]\|\(match\|type\|with\)\>\)\|\<\(function\|parser\|private\|with\)\s*$'
+ call search('|', 'bW')
+ return indent(searchpair('^\s*\(match\|type\)\>\|\<\(function\|parser\|private\|with\)\s*$', '', '^\s*|', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") !~ "^\\s*|.*->"'))
+ endif
+
+ " Indent if current line begins with ';;':
+ elseif line =~ '^\s*;;'
+ if lline !~ ';;\s*$'
+ return s:GetInd(v:lnum, s:letpat, s:letlim)
+ endif
+
+ " Indent if current line begins with 'in':
+ elseif line =~ '^\s*in\>'
+ if lline !~ '^\s*\(let\|and\)\>'
+ return s:FindPair('\<let\>', '', '\<in\>')
+ endif
+
+ " Indent if current line begins with 'else':
+ elseif line =~ '^\s*else\>'
+ if lline !~ '^\s*\(if\|then\)\>'
+ return s:FindPair('\<if\>', '', '\<else\>')
+ endif
+
+ " Indent if current line begins with 'then':
+ elseif line =~ '^\s*then\>'
+ if lline !~ '^\s*\(if\|else\)\>'
+ return s:FindPair('\<if\>', '', '\<then\>')
+ endif
+
+ " Indent if current line begins with 'and':
+ elseif line =~ '^\s*and\>'
+ if lline !~ '^\s*\(and\|let\|type\)\>\|\<end\s*$'
+ return ind - shiftwidth()
+ endif
+
+ " Indent if current line begins with 'with':
+ elseif line =~ '^\s*with\>'
+ if lline !~ '^\s*\(match\|try\)\>'
+ return s:FindPair('\<\%(match\|try\)\>', '','\<with\>')
+ endif
+
+ " Indent if current line begins with 'exception', 'external', 'include' or
+ " 'open':
+ elseif line =~ '^\s*\(exception\|external\|include\|open\)\>'
+ if lline !~ s:lim . '\|' . s:letlim
+ call search(line)
+ return indent(search('^\s*\(\(exception\|external\|include\|open\|type\)\>\|val\>.*:\)', 'bW'))
+ endif
+
+ " Indent if current line begins with 'val':
+ elseif line =~ '^\s*val\>'
+ if lline !~ '^\s*\(exception\|external\|include\|open\)\>\|' . s:obj . '\|' . s:letlim
+ return indent(search('^\s*\(\(exception\|include\|initializer\|method\|open\|type\|val\)\>\|external\>.*:\)', 'bW'))
+ endif
+
+ " Indent if current line begins with 'constraint', 'inherit', 'initializer'
+ " or 'method':
+ elseif line =~ '^\s*\(constraint\|inherit\|initializer\|method\)\>'
+ if lline !~ s:obj
+ 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 + shiftwidth()
+
+ " Back to normal indent after lines ending with ';;':
+ elseif lline =~ ';;\s*$' && lline !~ '^\s*;;'
+ let ind = s:GetInd(v:lnum, s:letpat, s:letlim)
+
+ " Back to normal indent after lines ending with 'end':
+ elseif lline =~ '\<end\s*$'
+ let ind = s:FindPair(s:module, '','\<end\>')
+
+ " Back to normal indent after lines ending with 'in':
+ elseif lline =~ '\<in\s*$' && lline !~ '^\s*in\>'
+ let ind = s:FindPair('\<let\>', '', '\<in\>')
+
+ " Back to normal indent after lines ending with 'done':
+ elseif lline =~ '\<done\s*$'
+ let ind = s:FindPair('\<do\>', '','\<done\>')
+
+ " Back to normal indent after lines ending with '}' or '>}':
+ elseif lline =~ '\(\|>\)}\s*$'
+ let ind = s:FindPair('{', '','}')
+
+ " Back to normal indent after lines ending with ']', '|]' or '>]':
+ elseif lline =~ '\(\||\|>\)\]\s*$'
+ let ind = s:FindPair('\[', '','\]')
+
+ " Back to normal indent after comments:
+ elseif lline =~ '\*)\s*$'
+ call search('\*)', 'bW')
+ let ind = indent(searchpair('(\*', '', '\*)', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"'))
+
+ " Back to normal indent after lines ending with ')':
+ elseif lline =~ ')\s*$'
+ let ind = s:FindPair('(', '',')')
+
+ " If this is a multiline comment then align '*':
+ elseif lline =~ '^\s*(\*' && line =~ '^\s*\*'
+ let ind = ind + 1
+
+ else
+ " Don't change indentation of this line
+ " for new lines (indent==0) use indentation of previous line
+
+ " This is for preventing removing indentation of these args:
+ " let f x =
+ " let y = x + 1 in
+ " Printf.printf
+ " "o" << here
+ " "oeuth" << don't touch indentation
+
+ let i = indent(v:lnum)
+ return i == 0 ? ind : i
+
+ endif
+
+ " Subtract a 'shiftwidth' after lines matching 'match ... with parser':
+ if lline =~ '\<match\>.*\<with\>\s*\<parser\s*$'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+
+endfunction
+
+" vim:sw=2
diff --git a/runtime/indent/occam.vim b/runtime/indent/occam.vim
new file mode 100644
index 0000000..673940a
--- /dev/null
+++ b/runtime/indent/occam.vim
@@ -0,0 +1,190 @@
+" Vim indent file
+" Language: occam
+" Maintainer: Mario Schweigler <ms44@kent.ac.uk> (Invalid email address)
+" Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Apr 06
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+"{{{ Settings
+" Set the occam indent function
+setlocal indentexpr=GetOccamIndent()
+" Indent after new line and after initial colon
+setlocal indentkeys=o,O,0=:
+"}}}
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once
+if exists("*GetOccamIndent")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+"{{{ Indent definitions
+" Define carriage return indent
+let s:FirstLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\|PAR\|SEQ\|PRI\s\+PAR\|WHILE\|VALOF\|CLAIM\|FORKING\)\>\|\(--.*\)\@<!\(\<PROC\>\|??\|\<CASE\>\s*\(--.*\)\=\_$\)'
+let s:FirstLevelNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>'
+let s:SecondLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\)\>\|\(--.*\)\@<!?\s*\<CASE\>\s*\(--.*\)\=\_$'
+let s:SecondLevelNonColonEndIndent = '\(--.*\)\@<!\<\(CHAN\|DATA\)\s\+TYPE\>'
+
+" Define colon indent
+let s:ColonIndent = '\(--.*\)\@<!\<PROC\>'
+let s:ColonNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>'
+
+let s:ColonEnd = '\(--.*\)\@<!:\s*\(--.*\)\=$'
+let s:ColonStart = '^\s*:\s*\(--.*\)\=$'
+
+" Define comment
+let s:CommentLine = '^\s*--'
+"}}}
+
+"{{{ function GetOccamIndent()
+" Auxiliary function to get the correct indent for a line of occam code
+function GetOccamIndent()
+
+ " Ensure magic is on
+ let save_magic = &magic
+ setlocal magic
+
+ " Get reference line number
+ let linenum = prevnonblank(v:lnum - 1)
+ while linenum > 0 && getline(linenum) =~ s:CommentLine
+ let linenum = prevnonblank(linenum - 1)
+ endwhile
+
+ " Get current indent
+ let curindent = indent(linenum)
+
+ " Get current line
+ let line = getline(linenum)
+
+ " Get previous line number
+ let prevlinenum = prevnonblank(linenum - 1)
+ while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine
+ let prevlinenum = prevnonblank(prevlinenum - 1)
+ endwhile
+
+ " Get previous line
+ let prevline = getline(prevlinenum)
+
+ " Colon indent
+ if getline(v:lnum) =~ s:ColonStart
+
+ let found = 0
+
+ while found < 1
+
+ if line =~ s:ColonStart
+ let found = found - 1
+ elseif line =~ s:ColonIndent || (line =~ s:ColonNonColonEndIndent && line !~ s:ColonEnd)
+ let found = found + 1
+ endif
+
+ if found < 1
+ let linenum = prevnonblank(linenum - 1)
+ if linenum > 0
+ let line = getline(linenum)
+ else
+ let found = 1
+ endif
+ endif
+
+ endwhile
+
+ if linenum > 0
+ let curindent = indent(linenum)
+ else
+ let colonline = getline(v:lnum)
+ let tabstr = ''
+ while strlen(tabstr) < &tabstop
+ let tabstr = ' ' . tabstr
+ endwhile
+ let colonline = substitute(colonline, '\t', tabstr, 'g')
+ let curindent = match(colonline, ':')
+ endif
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return curindent
+ endif
+
+ if getline(v:lnum) =~ '^\s*:'
+ let colonline = getline(v:lnum)
+ let tabstr = ''
+ while strlen(tabstr) < &tabstop
+ let tabstr = ' ' . tabstr
+ endwhile
+ let colonline = substitute(colonline, '\t', tabstr, 'g')
+ let curindent = match(colonline, ':')
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return curindent
+ endif
+
+ " Carriage return indenat
+ 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()
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return curindent
+ endif
+
+ " Commented line
+ if getline(prevnonblank(v:lnum - 1)) =~ s:CommentLine
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return indent(prevnonblank(v:lnum - 1))
+ endif
+
+ " Look for previous second level IF / ALT / PRI ALT
+ let found = 0
+
+ while !found
+
+ if indent(prevlinenum) == curindent - shiftwidth()
+ let found = 1
+ endif
+
+ if !found
+ let prevlinenum = prevnonblank(prevlinenum - 1)
+ while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine
+ let prevlinenum = prevnonblank(prevlinenum - 1)
+ endwhile
+ if prevlinenum == 0
+ let found = 1
+ endif
+ endif
+
+ endwhile
+
+ if prevlinenum > 0
+ if getline(prevlinenum) =~ s:SecondLevelIndent
+ let curindent = curindent + shiftwidth()
+ endif
+ endif
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return curindent
+
+endfunction
+"}}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/indent/pascal.vim b/runtime/indent/pascal.vim
new file mode 100644
index 0000000..b21b725
--- /dev/null
+++ b/runtime/indent/pascal.vim
@@ -0,0 +1,229 @@
+" Vim indent file
+" Language: Pascal
+" Maintainer: Neil Carter <n.carter@swansea.ac.uk>
+" Created: 2004 Jul 13
+" Last Change: 2021 Sep 22
+"
+" For further documentation, see https://psy.swansea.ac.uk/staff/carter/vim/
+
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetPascalIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+==end;,==const,==type,==var,==begin,==repeat,==until,==for
+setlocal indentkeys+==program,==function,==procedure,==object,==private
+setlocal indentkeys+==record,==if,==else,==case
+
+let b:undo_indent = 'setlocal indentexpr< indentkeys<'
+
+if exists("*GetPascalIndent")
+ finish
+endif
+
+
+" ________________________________________________________________
+function! s:GetPrevNonCommentLineNum( line_num )
+
+ " Skip lines starting with a comment
+ let SKIP_LINES = '^\s*\(\((\*\)\|\(\*\ \)\|\(\*)\)\|{\|}\)'
+
+ let nline = a:line_num
+ while nline > 0
+ let nline = prevnonblank(nline-1)
+ if getline(nline) !~? SKIP_LINES
+ break
+ endif
+ endwhile
+
+ return nline
+endfunction
+
+
+" ________________________________________________________________
+function! s:PurifyCode( line_num )
+ " Strip any trailing comments and whitespace
+ let pureline = 'TODO'
+ return pureline
+endfunction
+
+
+" ________________________________________________________________
+function! GetPascalIndent( line_num )
+
+ " Line 0 always goes at column 0
+ if a:line_num == 0
+ return 0
+ endif
+
+ let this_codeline = getline( a:line_num )
+
+
+ " SAME INDENT
+
+ " Middle of a three-part comment
+ if this_codeline =~ '^\s*\*'
+ return indent( a:line_num - 1)
+ endif
+
+
+ " COLUMN 1 ALWAYS
+
+ " Last line of the program
+ if this_codeline =~ '^\s*end\.'
+ return 0
+ endif
+
+ " Compiler directives, allowing "(*" and "{"
+ "if this_codeline =~ '^\s*\({\|(\*\)$\(IFDEF\|IFNDEF\|ELSE\|ENDIF\)'
+ if this_codeline =~ '^\s*\({\|(\*\)\$'
+ return 0
+ endif
+
+ " section headers
+ if this_codeline =~ '^\s*\(program\|procedure\|function\|type\)\>'
+ return 0
+ endif
+
+ " Subroutine separators, lines ending with "const" or "var"
+ if this_codeline =~ '^\s*\((\*\ _\+\ \*)\|\(const\|var\)\)$'
+ return 0
+ endif
+
+
+ " OTHERWISE, WE NEED TO LOOK FURTHER BACK...
+
+ let prev_codeline_num = s:GetPrevNonCommentLineNum( a:line_num )
+ let prev_codeline = getline( prev_codeline_num )
+ let indnt = indent( prev_codeline_num )
+
+
+ " INCREASE INDENT
+
+ " If the PREVIOUS LINE ended in these items, always indent
+ if prev_codeline =~ '\<\(type\|const\|var\)$'
+ return indnt + shiftwidth()
+ endif
+
+ if prev_codeline =~ '\<repeat$'
+ if this_codeline !~ '^\s*until\>'
+ return indnt + shiftwidth()
+ else
+ return indnt
+ endif
+ endif
+
+ if prev_codeline =~ '\<\(begin\|record\)$'
+ if this_codeline !~ '^\s*end\>'
+ return indnt + shiftwidth()
+ else
+ return indnt
+ endif
+ endif
+
+ " If the PREVIOUS LINE ended with these items, indent if not
+ " followed by "begin"
+ if prev_codeline =~ '\<\(\|else\|then\|do\)$' || prev_codeline =~ ':$'
+ if this_codeline !~ '^\s*begin\>'
+ return indnt + shiftwidth()
+ else
+ " If it does start with "begin" then keep the same indent
+ "return indnt + shiftwidth()
+ return indnt
+ endif
+ endif
+
+ " Inside a parameter list (i.e. a "(" without a ")"). ???? Considers
+ " only the line before the current one. TODO: Get it working for
+ " parameter lists longer than two lines.
+ if prev_codeline =~ '([^)]\+$'
+ return indnt + shiftwidth()
+ endif
+
+
+ " DECREASE INDENT
+
+ " Lines starting with "else", but not following line ending with
+ " "end".
+ if this_codeline =~ '^\s*else\>' && prev_codeline !~ '\<end$'
+ return indnt - shiftwidth()
+ endif
+
+ " Lines after a single-statement branch/loop.
+ " Two lines before ended in "then", "else", or "do"
+ " Previous line didn't end in "begin"
+ let prev2_codeline_num = s:GetPrevNonCommentLineNum( prev_codeline_num )
+ let prev2_codeline = getline( prev2_codeline_num )
+ if prev2_codeline =~ '\<\(then\|else\|do\)$' && prev_codeline !~ '\<begin$'
+ " If the next code line after a single statement branch/loop
+ " starts with "end", "except" or "finally", we need an
+ " additional unindentation.
+ if this_codeline =~ '^\s*\(end;\|except\|finally\|\)$'
+ " Note that we don't return from here.
+ return indnt - 2 * shiftwidth()
+ endif
+ 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()
+ endif
+
+
+ " MISCELLANEOUS THINGS TO CATCH
+
+ " Most "begin"s will have been handled by now. Any remaining
+ " "begin"s on their own line should go in column 1.
+ if this_codeline =~ '^\s*begin$'
+ return 0
+ endif
+
+
+" ________________________________________________________________
+" Object/Borland Pascal/Delphi Extensions
+"
+" Note that extended-pascal is handled here, unless it is simpler to
+" handle them in the standard-pascal section above.
+
+
+ " COLUMN 1 ALWAYS
+
+ " section headers at start of line.
+ if this_codeline =~ '^\s*\(interface\|implementation\|uses\|unit\)\>'
+ return 0
+ endif
+
+
+ " INDENT ONCE
+
+ " 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()
+ endif
+
+ " ???? Indent "procedure" and "functions" if they appear within an
+ " class/object definition. But that means overriding standard-pascal
+ " rule where these words always go in column 1.
+
+
+ " UNINDENT ONCE
+
+ if this_codeline =~ '^\s*\(except\|finally\)$'
+ return indnt - shiftwidth()
+ endif
+
+ if this_codeline =~ '^\s*\(private\|protected\|public\|published\)$'
+ return indnt - shiftwidth()
+ endif
+
+
+ " If nothing changed, return same indent.
+ return indnt
+endfunction
+
diff --git a/runtime/indent/perl.vim b/runtime/indent/perl.vim
new file mode 100644
index 0000000..4c91fa1
--- /dev/null
+++ b/runtime/indent/perl.vim
@@ -0,0 +1,183 @@
+" Vim indent file
+" Language: Perl
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2021 Sep 24
+
+" Suggestions and improvements by :
+" Aaron J. Sherman (use syntax for hints)
+" Artem Chuprina (play nice with folding)
+
+" TODO things that are not or not properly indented (yet) :
+" - Continued statements
+" print "foo",
+" "bar";
+" print "foo"
+" if bar();
+" - Multiline regular expressions (m//x)
+" (The following probably needs modifying the perl syntax file)
+" - qw() lists
+" - Heredocs with terminators that don't match \I\i*
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Is syntax highlighting active ?
+let b:indent_use_syntax = has("syntax")
+
+setlocal indentexpr=GetPerlIndent()
+setlocal indentkeys+=0=,0),0],0=or,0=and
+if !b:indent_use_syntax
+ setlocal indentkeys+=0=EO
+endif
+
+let b:undo_indent = "setl inde< indk<"
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+function! GetPerlIndent()
+
+ " Get the line to be indented
+ let cline = getline(v:lnum)
+
+ " Indent POD markers to column 0
+ if cline =~ '^\s*=\L\@!'
+ return 0
+ endif
+
+ " Get current syntax item at the line's first char
+ let csynid = ''
+ if b:indent_use_syntax
+ let csynid = synIDattr(synID(v:lnum,1,0),"name")
+ endif
+
+ " Don't reindent POD and heredocs
+ if csynid == "perlPOD" || csynid == "perlHereDoc" || csynid =~ "^pod"
+ return indent(v:lnum)
+ endif
+
+ " Indent end-of-heredocs markers to column 0
+ if b:indent_use_syntax
+ " Assumes that an end-of-heredoc marker matches \I\i* to avoid
+ " confusion with other types of strings
+ if csynid == "perlStringStartEnd" && cline =~ '^\I\i*$'
+ return 0
+ endif
+ else
+ " Without syntax hints, assume that end-of-heredocs markers begin with EO
+ if cline =~ '^\s*EO'
+ return 0
+ endif
+ endif
+
+ " Now get the indent of the previous perl line.
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ " Skip heredocs, POD, and comments on 1st column
+ if b:indent_use_syntax
+ let skippin = 2
+ while skippin
+ let synid = synIDattr(synID(lnum,1,0),"name")
+ if (synid == "perlStringStartEnd" && line =~ '^\I\i*$')
+ \ || (skippin != 2 && synid == "perlPOD")
+ \ || (skippin != 2 && synid == "perlHereDoc")
+ \ || synid == "perlComment"
+ \ || synid =~ "^pod"
+ let lnum = prevnonblank(lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ let skippin = 1
+ else
+ let skippin = 0
+ endif
+ endwhile
+ else
+ if line =~ "^EO"
+ let lnum = search("<<[\"']\\=EO", "bW")
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ endif
+ endif
+
+ " Indent blocks enclosed by {}, (), or []
+ if b:indent_use_syntax
+ " Find a real opening brace
+ " NOTE: Unlike Perl character classes, we do NOT need to escape the
+ " closing brackets with a backslash. Doing so just puts a backslash
+ " in the character class and causes sorrow. Instead, put the closing
+ " bracket as the first character in the class.
+ let braceclass = '[][(){}]'
+ let bracepos = match(line, braceclass, matchend(line, '^\s*[])}]'))
+ while bracepos != -1
+ let synid = synIDattr(synID(lnum, bracepos + 1, 0), "name")
+ " If the brace is highlighted in one of those groups, indent it.
+ " 'perlHereDoc' is here only to handle the case '&foo(<<EOF)'.
+ if synid == ""
+ \ || 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 + shiftwidth()
+ else
+ let ind = ind - shiftwidth()
+ endif
+ endif
+ let bracepos = match(line, braceclass, bracepos + 1)
+ endwhile
+ let bracepos = matchend(cline, '^\s*[])}]')
+ if bracepos != -1
+ let synid = synIDattr(synID(v:lnum, bracepos, 0), "name")
+ if synid == ""
+ \ || synid == "perlMatchStartEnd"
+ \ || synid == "perlBraces"
+ \ || synid == "perlStatementIndirObj"
+ \ || synid =~ '^perl\(Sub\|Block\|Package\)Fold'
+ let ind = ind - shiftwidth()
+ endif
+ endif
+ else
+ if line =~ '[{[(]\s*\(#[^])}]*\)\=$'
+ let ind = ind + shiftwidth()
+ endif
+ if cline =~ '^\s*[])}]'
+ 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 + shiftwidth()
+ endif
+ elseif line =~ '^\s*\(or\|and\)\>'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:ts=8:sts=4:sw=4:expandtab:ft=vim
diff --git a/runtime/indent/php.vim b/runtime/indent/php.vim
new file mode 100644
index 0000000..0e62368
--- /dev/null
+++ b/runtime/indent/php.vim
@@ -0,0 +1,957 @@
+" Vim indent file
+" Language: PHP
+" Author: John Wellesz <John.wellesz (AT) gmail (DOT) com>
+" URL: https://www.2072productions.com/vim/indent/php.vim
+" Home: https://github.com/2072/PHP-Indenting-for-VIm
+" Last Change: 2020 Mar 05
+" Version: 1.70
+"
+"
+" Type :help php-indent for available options
+"
+" A fully commented version of this file is available on github
+"
+"
+" If you find a bug, please open a ticket on github.com
+" ( https://github.com/2072/PHP-Indenting-for-VIm/issues ) with an example of
+" code that breaks the algorithm.
+"
+
+" NOTE: This script must be used with PHP syntax ON and with the php syntax
+" script by Lutz Eymers (http://www.isp.de/data/php.vim ) or with the
+" script by Peter Hodge (https://www.vim.org/scripts/script.php?script_id=1571 )
+" the later is bunbdled by default with Vim 7.
+"
+"
+" In the case you have syntax errors in your script such as HereDoc end
+" identifiers not at col 1 you'll have to indent your file 2 times (This
+" script will automatically put HereDoc end identifiers at col 1 if
+" they are followed by a ';').
+"
+
+" NOTE: If you are editing files in Unix file format and that (by accident)
+" there are '\r' before new lines, this script won't be able to proceed
+" correctly and will make many mistakes because it won't be able to match
+" '\s*$' correctly.
+" So you have to remove those useless characters first with a command like:
+"
+" :%s /\r$//g
+"
+" or simply 'let' the option PHP_removeCRwhenUnix to 1 and the script will
+" silently remove them when VIM load this script (at each bufread).
+
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+
+let g:php_sync_method = 0
+
+
+if exists("PHP_default_indenting")
+ 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 * shiftwidth()
+else
+ let b:PHP_outdentSLComments = 0
+endif
+
+if exists("PHP_BracesAtCodeLevel")
+ let b:PHP_BracesAtCodeLevel = PHP_BracesAtCodeLevel
+else
+ let b:PHP_BracesAtCodeLevel = 0
+endif
+
+
+if exists("PHP_autoformatcomment")
+ let b:PHP_autoformatcomment = PHP_autoformatcomment
+else
+ let b:PHP_autoformatcomment = 1
+endif
+
+if exists("PHP_outdentphpescape")
+ let b:PHP_outdentphpescape = PHP_outdentphpescape
+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
+else
+ let b:PHP_vintage_case_default_indent = 0
+endif
+
+if exists("PHP_IndentFunctionCallParameters")
+ let b:PHP_IndentFunctionCallParameters = PHP_IndentFunctionCallParameters
+else
+ let b:PHP_IndentFunctionCallParameters = 0
+endif
+
+if exists("PHP_IndentFunctionDeclarationParameters")
+ let b:PHP_IndentFunctionDeclarationParameters = PHP_IndentFunctionDeclarationParameters
+else
+ let b:PHP_IndentFunctionDeclarationParameters = 0
+endif
+
+let b:PHP_lastindented = 0
+let b:PHP_indentbeforelast = 0
+let b:PHP_indentinghuge = 0
+let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+let b:PHP_LastIndentedWasComment = 0
+let b:PHP_InsideMultilineComment = 0
+let b:InPHPcode = 0
+let b:InPHPcode_checked = 0
+let b:InPHPcode_and_script = 0
+let b:InPHPcode_tofind = ""
+let b:PHP_oldchangetick = b:changedtick
+let b:UserIsTypingComment = 0
+let b:optionsset = 0
+
+setlocal nosmartindent
+setlocal noautoindent
+setlocal nocindent
+setlocal nolisp
+
+setlocal indentexpr=GetPhpIndent()
+setlocal indentkeys=0{,0},0),0],:,!^F,o,O,e,*<Return>,=?>,=<?,=*/
+
+
+
+let s:searchpairflags = 'bWr'
+
+if &fileformat == "unix" && exists("PHP_removeCRwhenUnix") && PHP_removeCRwhenUnix
+ silent! %s/\r$//g
+endif
+
+if exists("*GetPhpIndent")
+ call ResetPhpOptions()
+ finish " XXX -- comment this line for easy dev
+endif
+
+
+let s:endline = '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
+let s:PHP_validVariable = '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'
+let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|die\|else\|end\%(if\|while\|for\|foreach\|switch\)\)'
+let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|\%(}\s*\)\?else\>\|do\>\|while\>\|switch\>\|case\>\|default\>\|for\%(each\)\=\>\|declare\>\|class\>\|trait\>\|\%()\s*\)\=use\>\|interface\>\|abstract\>\|final\>\|try\>\|\%(}\s*\)\=catch\>\|\%(}\s*\)\=finally\>\)'
+let s:functionDeclPrefix = '\<function\>\%(\s\+&\='.s:PHP_validVariable.'\)\=\s*('
+let s:functionDecl = s:functionDeclPrefix.'.*'
+let s:multilineFunctionDecl = s:functionDeclPrefix.s:endline
+let s:arrayDecl = '\<array\>\s*(.*'
+let s:multilineFunctionCall = s:PHP_validVariable.'\s*('.s:endline
+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:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!'
+let s:structureHead = '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline . '\|\<new\s\+class\>'
+
+
+let s:escapeDebugStops = 0
+function! DebugPrintReturn(scriptLine)
+
+ if ! s:escapeDebugStops
+ echo "debug:" . a:scriptLine
+ let c = getchar()
+ if c == "\<Del>"
+ let s:escapeDebugStops = 1
+ end
+ endif
+
+endfunction
+
+function! GetLastRealCodeLNum(startline) " {{{
+
+ let lnum = a:startline
+
+ if b:GetLastRealCodeLNum_ADD && b:GetLastRealCodeLNum_ADD == lnum + 1
+ let lnum = b:GetLastRealCodeLNum_ADD
+ endif
+
+ while lnum > 1
+ let lnum = prevnonblank(lnum)
+ let lastline = getline(lnum)
+
+ if b:InPHPcode_and_script && lastline =~ '?>\s*$'
+ let lnum = lnum - 1
+ elseif lastline =~ '^\s*?>.*<?\%(php\)\=\s*$'
+ let lnum = lnum - 1
+ elseif lastline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
+ let lnum = lnum - 1
+ elseif lastline =~ '\*/\s*$'
+ call cursor(lnum, 1)
+ if lastline !~ '^\*/'
+ call search('\*/', 'W')
+ endif
+ let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
+
+ let lastline = getline(lnum)
+ if lastline =~ '^\s*/\*'
+ let lnum = lnum - 1
+ else
+ break
+ endif
+
+
+ elseif lastline =~? '\%(//\s*\|?>.*\)\@<!<?\%(php\)\=\s*$\|^\s*<script\>'
+
+ while lastline !~ '\(<?.*\)\@<!?>' && lnum > 1
+ let lnum = lnum - 1
+ let lastline = getline(lnum)
+ endwhile
+ if lastline =~ '^\s*?>'
+ let lnum = lnum - 1
+ else
+ break
+ endif
+
+
+ elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc
+ let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<\\s*[''"]\\=\1[''"]\\=$', '')
+ while getline(lnum) !~? tofind && lnum > 1
+ let lnum = lnum - 1
+ endwhile
+ elseif lastline =~ '^\s*[''"`][;,]' || (lastline =~ '^[^''"`]*[''"`][;,]'.s:endline && IslinePHP(lnum, "") == "SpecStringEntrails")
+
+ 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
+ endwhile
+
+ if lnum==1 && getline(lnum) !~ '<?'
+ let lnum=0
+ endif
+
+ if b:InPHPcode_and_script && 1 > b:InPHPcode
+ let b:InPHPcode_and_script = 0
+ endif
+
+ return lnum
+endfunction " }}}
+
+function! Skippmatch2()
+
+ let line = getline(".")
+
+ if line =~ "\\([\"']\\).*/\\*.*\\1" || line =~ '\%(//\|#\).*/\*'
+ return 1
+ else
+ return 0
+ endif
+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
+ return 0
+ else
+ return 1
+ endif
+endfun " }}}
+
+function! FindOpenBracket(lnum, blockStarter) " {{{
+ call cursor(a:lnum, 1)
+ let line = searchpair('{', '', '}', 'bW', 'Skippmatch()')
+
+ if a:blockStarter == 1
+ while line > 1
+ let linec = getline(line)
+
+ if linec =~ s:terminated || linec =~ s:structureHead
+ break
+ endif
+
+ let line = GetLastRealCodeLNum(line - 1)
+ endwhile
+ endif
+
+ return line
+endfun " }}}
+
+let s:blockChars = {'{':1, '[': 1, '(': 1, ')':-1, ']':-1, '}':-1}
+let s:blockCharsLUT = {'{':'{', '}':'{', '[':'[', ']':'[', '(':'(', ')':'('}
+function! BalanceDirection (str)
+
+ let balance = {'{':0, '[': 0, '(': 0, 'none':0}
+ let director = 'none'
+
+ for c in split(a:str, '\zs')
+ if has_key(s:blockChars, c)
+ let balance[s:blockCharsLUT[c]] += s:blockChars[c]
+
+ if balance[s:blockCharsLUT[c]]
+ let director = s:blockCharsLUT[c]
+ endif
+ endif
+ endfor
+
+ return balance[director]
+endfun
+
+function! StripEndlineComments (line)
+ return substitute(a:line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
+endfun
+
+function! FindArrowIndent (lnum) " {{{
+
+ let parrentArrowPos = -1
+ let cursorPos = -1
+ let lnum = a:lnum
+ while lnum > 1
+ let last_line = getline(lnum)
+ if last_line =~ '^\s*->'
+ let parrentArrowPos = indent(a:lnum)
+ break
+ else
+
+ if b:PHP_noArrowMatching
+ break
+ endif
+
+ let cleanedLnum = StripEndlineComments(last_line)
+
+ if cleanedLnum =~ ')'.s:endline
+ if BalanceDirection(cleanedLnum) <= 0
+ call cursor(lnum, 1)
+ call searchpos(')'.s:endline, 'cW', lnum)
+ let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
+ let cursorPos = col(".")
+ if openedparent != lnum
+ let lnum = openedparent
+ continue
+ else
+ endif
+ else
+ let parrentArrowPos = -1
+ break
+ end
+ endif
+
+ if cleanedLnum =~ '->'
+ call cursor(lnum, cursorPos == -1 ? strwidth(cleanedLnum) : cursorPos)
+ let parrentArrowPos = searchpos('->', 'cWb', lnum)[1] - 1
+
+ break
+ else
+ let parrentArrowPos = -1
+ break
+ endif
+ endif
+ endwhile
+
+ if parrentArrowPos == -1
+ let parrentArrowPos = indent(lnum) + shiftwidth()
+ end
+
+ return parrentArrowPos
+endfun "}}}
+
+function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{
+
+ if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>'
+ let beforeelse = a:lnum
+ else
+ let beforeelse = GetLastRealCodeLNum(a:lnum - 1)
+ endif
+
+ if !s:level
+ let s:iftoskip = 0
+ endif
+
+ if getline(beforeelse) =~# '^\s*\%(}\s*\)\=else\%(\s*if\)\@!\>'
+ let s:iftoskip = s:iftoskip + 1
+ endif
+
+ if getline(beforeelse) =~ '^\s*}'
+ let beforeelse = FindOpenBracket(beforeelse, 0)
+
+ if getline(beforeelse) =~ '^\s*{'
+ let beforeelse = GetLastRealCodeLNum(beforeelse - 1)
+ endif
+ endif
+
+
+ if !s:iftoskip && a:StopAfterFirstPrevElse && getline(beforeelse) =~# '^\s*\%([}]\s*\)\=else\%(if\)\=\>'
+ return beforeelse
+ endif
+
+ if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1
+
+ if s:iftoskip && getline(beforeelse) =~# '^\s*if\>'
+ let s:iftoskip = s:iftoskip - 1
+ endif
+
+ let s:level = s:level + 1
+ let beforeelse = FindTheIfOfAnElse(beforeelse, a:StopAfterFirstPrevElse)
+ endif
+
+ return beforeelse
+
+endfunction " }}}
+
+let s:defaultORcase = '^\s*\%(default\|case\).*:'
+
+function! FindTheSwitchIndent (lnum) " {{{
+
+ let test = GetLastRealCodeLNum(a:lnum - 1)
+
+ if test <= 1
+ return indent(1) - shiftwidth() * b:PHP_vintage_case_default_indent
+ end
+
+ while getline(test) =~ '^\s*}' && test > 1
+ let test = GetLastRealCodeLNum(FindOpenBracket(test, 0) - 1)
+
+ if getline(test) =~ '^\s*switch\>'
+ let test = GetLastRealCodeLNum(test - 1)
+ endif
+ endwhile
+
+ if getline(test) =~# '^\s*switch\>'
+ return indent(test)
+ elseif getline(test) =~# s:defaultORcase
+ 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, 'structure':1, 'exception':1}
+function! IslinePHP (lnum, tofind) " {{{
+ let cline = getline(a:lnum)
+
+ if a:tofind==""
+ let tofind = "^\\s*[\"'`]*\\s*\\zs\\S"
+ else
+ let tofind = a:tofind
+ endif
+
+ let tofind = tofind . '\c'
+
+ let coltotest = match (cline, tofind) + 1
+
+ let synname = synIDattr(synID(a:lnum, coltotest, 0), "name")
+
+ if synname ==? 'phpStringSingle' || synname ==? 'phpStringDouble' || synname ==? 'phpBacktick'
+ if cline !~ '^\s*[''"`]' " ??? XXX
+ return "SpecStringEntrails"
+ else
+ return synname
+ end
+ end
+
+ if get(s:SynPHPMatchGroups, tolower(synname)) || synname =~ '^php' || synname =~? '^javaScript'
+ return synname
+ else
+ return ""
+ endif
+endfunction " }}}
+
+let s:autoresetoptions = 0
+if ! s:autoresetoptions
+ let s:autoresetoptions = 1
+endif
+
+function! ResetPhpOptions()
+ if ! b:optionsset && &filetype =~ "php"
+ if b:PHP_autoformatcomment
+
+ setlocal comments=s1:/*,mb:*,ex:*/,://,:#
+
+ setlocal formatoptions-=t
+ setlocal formatoptions+=q
+ setlocal formatoptions+=r
+ setlocal formatoptions+=o
+ setlocal formatoptions+=c
+ setlocal formatoptions+=b
+ endif
+ let b:optionsset = 1
+ endif
+endfunc
+
+call ResetPhpOptions()
+
+function! GetPhpIndentVersion()
+ return "1.70-bundle"
+endfun
+
+function! GetPhpIndent()
+
+ let b:GetLastRealCodeLNum_ADD = 0
+
+ let UserIsEditing=0
+ if b:PHP_oldchangetick != b:changedtick
+ let b:PHP_oldchangetick = b:changedtick
+ let UserIsEditing=1
+ endif
+
+ if b:PHP_default_indenting
+ let b:PHP_default_indenting = g:PHP_default_indenting * shiftwidth()
+ endif
+
+ let cline = getline(v:lnum)
+
+ if !b:PHP_indentinghuge && b:PHP_lastindented > b:PHP_indentbeforelast
+ if b:PHP_indentbeforelast
+ let b:PHP_indentinghuge = 1
+ endif
+ let b:PHP_indentbeforelast = b:PHP_lastindented
+ endif
+
+ if b:InPHPcode_checked && prevnonblank(v:lnum - 1) != b:PHP_lastindented
+ if b:PHP_indentinghuge
+ let b:PHP_indentinghuge = 0
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+ endif
+ let real_PHP_lastindented = v:lnum
+ let b:PHP_LastIndentedWasComment=0
+ let b:PHP_InsideMultilineComment=0
+ let b:PHP_indentbeforelast = 0
+
+ let b:InPHPcode = 0
+ let b:InPHPcode_checked = 0
+ let b:InPHPcode_and_script = 0
+ let b:InPHPcode_tofind = ""
+
+ elseif v:lnum > b:PHP_lastindented
+ let real_PHP_lastindented = b:PHP_lastindented
+ else
+ let real_PHP_lastindented = v:lnum
+ endif
+
+ let b:PHP_lastindented = v:lnum
+
+
+ if !b:InPHPcode_checked " {{{ One time check
+ let b:InPHPcode_checked = 1
+ let b:UserIsTypingComment = 0
+
+ let synname = ""
+ if cline !~ '<?.*?>'
+ let synname = IslinePHP (prevnonblank(v:lnum), "")
+ endif
+
+ if synname!=""
+ if synname ==? "SpecStringEntrails"
+ let b:InPHPcode = -1 " thumb down
+ let b:InPHPcode_tofind = ""
+ elseif synname !=? "phpHereDoc" && synname !=? "phpHereDocDelimiter"
+ let b:InPHPcode = 1
+ let b:InPHPcode_tofind = ""
+
+ if synname =~? '^php\%(Doc\)\?Comment'
+ let b:UserIsTypingComment = 1
+ let b:InPHPcode_checked = 0
+ endif
+
+ if synname =~? '^javaScript'
+ let b:InPHPcode_and_script = 1
+ endif
+
+ else
+ let b:InPHPcode = 0
+
+ let lnum = v:lnum - 1
+ while getline(lnum) !~? '<<<\s*[''"]\=\a\w*[''"]\=$' && lnum > 1
+ let lnum = lnum - 1
+ endwhile
+
+ let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<\s*[''"]\=\(\a\w*\)[''"]\=$', '^\\s*\1;\\=$', '')
+ endif
+ else
+ let b:InPHPcode = 0
+ let b:InPHPcode_tofind = s:PHP_startindenttag
+ endif
+ endif "!b:InPHPcode_checked }}}
+
+
+ " Test if we are indenting PHP code {{{
+ let lnum = prevnonblank(v:lnum - 1)
+ let last_line = getline(lnum)
+ let endline= s:endline
+
+ if b:InPHPcode_tofind!=""
+ if cline =~? b:InPHPcode_tofind
+ let b:InPHPcode_tofind = ""
+ let b:UserIsTypingComment = 0
+
+ if b:InPHPcode == -1
+ let b:InPHPcode = 1
+ return -1
+ end
+
+ let b:InPHPcode = 1
+
+ if cline =~ '\*/'
+ call cursor(v:lnum, 1)
+ if cline !~ '^\*/'
+ call search('\*/', 'W')
+ endif
+ let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
+
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+
+ let b:PHP_LastIndentedWasComment = 0
+
+ if cline =~ '^\s*\*/'
+ return indent(lnum) + 1
+ else
+ return indent(lnum)
+ endif
+
+ elseif cline =~? '<script\>'
+ let b:InPHPcode_and_script = 1
+ let b:GetLastRealCodeLNum_ADD = v:lnum
+ endif
+ endif
+ endif
+
+ if 1 == b:InPHPcode
+
+ 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
+ elseif cline =~? '<script\>'
+ let b:InPHPcode_and_script = 1
+ endif
+
+ elseif last_line =~ '^[^''"`]\+[''"`]$' && last_line !~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)' " 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*[''"]\=$'
+ let b:InPHPcode = 0
+ let b:InPHPcode_tofind = substitute( last_line, '^.*<<<\s*[''"]\=\(\a\w*\)[''"]\=$', '^\\s*\1;\\=$', '')
+
+ elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*'
+ let b:InPHPcode = 0
+ let b:InPHPcode_tofind = '\*/'
+
+ elseif cline =~? '^\s*</script>'
+ let b:InPHPcode = 0
+ let b:InPHPcode_tofind = s:PHP_startindenttag
+ endif
+ endif " }}}
+
+
+ if 1 > b:InPHPcode && !b:InPHPcode_and_script
+ return -1
+ endif
+
+ " Indent successive // or # comment the same way the first is {{{
+ let addSpecial = 0
+ if cline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
+ let addSpecial = b:PHP_outdentSLComments
+ if b:PHP_LastIndentedWasComment == 1
+ return indent(real_PHP_lastindented)
+ endif
+ let b:PHP_LastIndentedWasComment = 1
+ else
+ let b:PHP_LastIndentedWasComment = 0
+ endif " }}}
+
+ " Indent multiline /* comments correctly {{{
+
+ if b:PHP_InsideMultilineComment || b:UserIsTypingComment
+ if cline =~ '^\s*\*\%(\/\)\@!'
+ if last_line =~ '^\s*/\*'
+ return indent(lnum) + 1
+ else
+ return indent(lnum)
+ endif
+ else
+ let b:PHP_InsideMultilineComment = 0
+ endif
+ endif
+
+ if !b:PHP_InsideMultilineComment && cline =~ '^\s*/\*\%(.*\*/\)\@!'
+ if getline(v:lnum + 1) !~ '^\s*\*'
+ return -1
+ endif
+ let b:PHP_InsideMultilineComment = 1
+ endif " }}}
+
+
+ " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{
+ if cline =~# '^\s*<?' && cline !~ '?>' && b:PHP_outdentphpescape
+ return 0
+ endif
+
+ if cline =~ '^\s*?>' && cline !~# '<?' && b:PHP_outdentphpescape
+ return 0
+ endif
+
+ if cline =~? '^\s*\a\w*;$\|^\a\w*$\|^\s*[''"`][;,]' && cline !~? s:notPhpHereDoc
+ return 0
+ endif " }}}
+
+ let s:level = 0
+
+ let lnum = GetLastRealCodeLNum(v:lnum - 1)
+
+ let last_line = getline(lnum)
+ let ind = indent(lnum)
+
+ if ind==0 && b:PHP_default_indenting
+ let ind = b:PHP_default_indenting
+ endif
+
+ if lnum == 0
+ return b:PHP_default_indenting + addSpecial
+ endif
+
+
+ if cline =~ '^\s*}\%(}}\)\@!'
+ let ind = indent(FindOpenBracket(v:lnum, 1))
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+ return ind
+ endif
+
+ if cline =~ '^\s*\*/'
+ call cursor(v:lnum, 1)
+ if cline !~ '^\*/'
+ call search('\*/', 'W')
+ endif
+ let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
+
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+
+ if cline =~ '^\s*\*/'
+ return indent(lnum) + 1
+ else
+ return indent(lnum)
+ endif
+ endif
+
+
+ if last_line =~ '[;}]'.endline && last_line !~ '^[)\]]' && last_line !~# s:defaultORcase && last_line !~ '^\s*[''"`][;,]'
+ if ind==b:PHP_default_indenting
+ return b:PHP_default_indenting + addSpecial
+ elseif b:PHP_indentinghuge && ind==b:PHP_CurrentIndentLevel && cline !~# '^\s*\%(else\|\%(case\|default\).*:\|[})];\=\)' && last_line !~# '^\s*\%(\%(}\s*\)\=else\)' && getline(GetLastRealCodeLNum(lnum - 1))=~';'.endline
+ return b:PHP_CurrentIndentLevel + addSpecial
+ endif
+ endif
+
+ let LastLineClosed = 0
+
+ let terminated = s:terminated
+
+ 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) + 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:structureHead
+
+ let ind = indent(last_line_num)
+
+ if b:PHP_BracesAtCodeLevel
+ let ind = ind + shiftwidth()
+ endif
+
+ return ind
+ endif
+
+ 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 + 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
+ let previous_line = last_line
+ let last_line_num = lnum
+ let LastLineClosed = 1
+
+ let isSingleLineBlock = 0
+ while 1
+ if ! isSingleLineBlock && previous_line =~ '^\s*}\|;\s*}'.endline
+
+ call cursor(last_line_num, 1)
+ if previous_line !~ '^}'
+ call search('}\|;\s*}'.endline, 'W')
+ end
+ let oldLastLine = last_line_num
+ let last_line_num = searchpair('{', '', '}', 'bW', 'Skippmatch()')
+
+ if getline(last_line_num) =~ '^\s*{'
+ let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
+ elseif oldLastLine == last_line_num
+ let isSingleLineBlock = 1
+ continue
+ endif
+
+ let previous_line = getline(last_line_num)
+
+ continue
+ else
+ let isSingleLineBlock = 0
+
+ if getline(last_line_num) =~# '^\s*else\%(if\)\=\>'
+ let last_line_num = FindTheIfOfAnElse(last_line_num, 0)
+ continue
+ endif
+
+
+ let last_match = last_line_num
+
+ let one_ahead_indent = indent(last_line_num)
+ let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
+ let two_ahead_indent = indent(last_line_num)
+ let after_previous_line = previous_line
+ let previous_line = getline(last_line_num)
+
+
+ if previous_line =~# s:defaultORcase.'\|{'.endline
+ break
+ endif
+
+ if after_previous_line=~# '^\s*'.s:blockstart.'.*)'.endline && previous_line =~# '[;}]'.endline
+ break
+ endif
+
+ if one_ahead_indent == two_ahead_indent || last_line_num < 1
+ if previous_line =~# '\%(;\|^\s*}\)'.endline || last_line_num < 1
+ break
+ endif
+ endif
+ endif
+ endwhile
+
+ if indent(last_match) != ind
+ let ind = indent(last_match)
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+
+ return ind + addSpecial
+ endif
+ endif
+
+ if (last_line !~ '^\s*}\%(}}\)\@!')
+ let plinnum = GetLastRealCodeLNum(lnum - 1)
+ else
+ let plinnum = GetLastRealCodeLNum(FindOpenBracket(lnum, 1) - 1)
+ endif
+
+ let AntepenultimateLine = getline(plinnum)
+
+ let last_line = StripEndlineComments(last_line)
+
+ if ind == b:PHP_default_indenting
+ if last_line =~ terminated && last_line !~# s:defaultORcase
+ let LastLineClosed = 1
+ endif
+ endif
+
+ if !LastLineClosed
+
+ let openedparent = -1
+
+
+ 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*:\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 + shiftwidth()
+ endif
+
+ if b:PHP_IndentFunctionCallParameters && last_line =~ s:multilineFunctionCall && last_line !~ s:structureHead && last_line !~ s:arrayDecl
+ let ind = ind + b:PHP_IndentFunctionCallParameters * shiftwidth()
+ endif
+
+ if b:PHP_IndentFunctionDeclarationParameters && last_line =~ s:multilineFunctionDecl
+ let ind = ind + b:PHP_IndentFunctionDeclarationParameters * shiftwidth()
+ endif
+
+ if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1
+ let b:PHP_CurrentIndentLevel = ind
+
+ endif
+
+ elseif last_line =~ '),'.endline && BalanceDirection(last_line) < 0
+ call cursor(lnum, 1)
+ call searchpos('),'.endline, 'cW')
+ let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
+ if openedparent != lnum
+ let ind = indent(openedparent)
+ endif
+
+ 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
+
+
+ if openedparent >= 0
+ let last_line = StripEndlineComments(getline(openedparent))
+ endif
+ endif
+
+ if cline =~ '^\s*[)\]];\='
+ call cursor(v:lnum, 1)
+ call searchpos('[)\]]', 'cW')
+ let matchedBlockChar = cline[col('.')-1]
+ let openedparent = searchpair('\M'.s:blockCharsLUT[matchedBlockChar], '', '\M'.matchedBlockChar, 'bW', 'Skippmatch()')
+ if openedparent != v:lnum
+ let ind = indent(openedparent)
+ endif
+
+ elseif last_line =~ '^\s*->' && last_line !~? s:structureHead && BalanceDirection(last_line) <= 0
+ let ind = ind - shiftwidth()
+ endif
+
+ let b:PHP_CurrentIndentLevel = ind
+ return ind + addSpecial
+endfunction
diff --git a/runtime/indent/postscr.vim b/runtime/indent/postscr.vim
new file mode 100644
index 0000000..8430ccf
--- /dev/null
+++ b/runtime/indent/postscr.vim
@@ -0,0 +1,69 @@
+" PostScript indent file
+" Language: PostScript
+" Maintainer: Mike Williams <mrw@eandem.co.uk>
+" Last Change: 2022 Apr 06
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=PostscrIndentGet(v:lnum)
+setlocal indentkeys+=0],0=>>,0=%%,0=end,0=restore,0=grestore indentkeys-=:,0#,e
+
+let b:undo_indent = "setl inde< indk<"
+
+" Catch multiple instantiations
+if exists("*PostscrIndentGet")
+ finish
+endif
+
+function! PostscrIndentGet(lnum)
+ " Find a non-empty non-comment line above the current line.
+ " Note: ignores DSC comments as well!
+ let lnum = a:lnum - 1
+ while lnum != 0
+ let lnum = prevnonblank(lnum)
+ if getline(lnum) !~ '^\s*%.*$'
+ break
+ endif
+ let lnum = lnum - 1
+ endwhile
+
+ " Hit the start of the file, use user indent.
+ if lnum == 0
+ return -1
+ endif
+
+ " Start with the indent of the previous line
+ let ind = indent(lnum)
+ let pline = getline(lnum)
+
+ " Indent for dicts, arrays, and saves with possible trailing comment
+ if pline =~ '\(begin\|<<\|g\=save\|{\|[\)\s*\(%.*\)\=$'
+ let ind = ind + shiftwidth()
+ endif
+
+ " Remove indent for popped dicts, and restores.
+ if pline =~ '\(end\|g\=restore\)\s*$'
+ let ind = ind - shiftwidth()
+
+ " Else handle immediate dedents of dicts, restores, and arrays.
+ elseif getline(a:lnum) =~ '\(end\|>>\|g\=restore\|}\|]\)'
+ let ind = ind - shiftwidth()
+
+ " Else handle DSC comments - always start of line.
+ elseif getline(a:lnum) =~ '^\s*%%'
+ let ind = 0
+ endif
+
+ " For now catch excessive left indents if they occur.
+ if ind < 0
+ let ind = -1
+ endif
+
+ return ind
+endfunction
+
+" vim:sw=2
diff --git a/runtime/indent/pov.vim b/runtime/indent/pov.vim
new file mode 100644
index 0000000..60077ff
--- /dev/null
+++ b/runtime/indent/pov.vim
@@ -0,0 +1,87 @@
+" Vim indent file
+" Language: PoV-Ray Scene Description Language
+" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2017 Jun 13
+" 2022 April: b:undo_indent added by Doug Kearns
+" URI: http://trific.ath.cx/Ftp/vim/indent/pov.vim
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Some preliminary settings.
+setlocal nolisp " Make sure lisp indenting doesn't supersede us.
+
+setlocal indentexpr=GetPoVRayIndent()
+setlocal indentkeys+==else,=end,0]
+
+let b:undo_indent = "setl inde< indk< lisp<"
+
+" Only define the function once.
+if exists("*GetPoVRayIndent")
+ finish
+endif
+
+" Counts matches of a regexp <rexp> in line number <line>.
+" Doesn't count matches inside strings and comments (as defined by current
+" syntax).
+function! s:MatchCount(line, rexp)
+ let str = getline(a:line)
+ let i = 0
+ let n = 0
+ while i >= 0
+ let i = matchend(str, a:rexp, i)
+ if i >= 0 && synIDattr(synID(a:line, i, 0), "name") !~? "string\|comment"
+ let n = n + 1
+ endif
+ endwhile
+ return n
+endfunction
+
+" The main function. Returns indent amount.
+function GetPoVRayIndent()
+ " If we are inside a comment (may be nested in obscure ways), give up
+ if synIDattr(synID(v:lnum, indent(v:lnum)+1, 0), "name") =~? "string\|comment"
+ return -1
+ endif
+
+ " Search backwards for the first non-empty, non-comment line.
+ let plnum = prevnonblank(v:lnum - 1)
+ let plind = indent(plnum)
+ while plnum > 0 && synIDattr(synID(plnum, plind+1, 0), "name") =~? "comment"
+ let plnum = prevnonblank(plnum - 1)
+ let plind = indent(plnum)
+ endwhile
+
+ " Start indenting from zero
+ if plnum == 0
+ return 0
+ endif
+
+ " Analyse previous nonempty line.
+ let chg = 0
+ let chg = chg + s:MatchCount(plnum, '[[{(]')
+ let chg = chg + s:MatchCount(plnum, '#\s*\%(if\|ifdef\|ifndef\|switch\|while\|macro\|else\)\>')
+ let chg = chg - s:MatchCount(plnum, '#\s*end\>')
+ let chg = chg - s:MatchCount(plnum, '[]})]')
+ " Dirty hack for people writing #if and #else on the same line.
+ let chg = chg - s:MatchCount(plnum, '#\s*\%(if\|ifdef\|ifndef\|switch\)\>.*#\s*else\>')
+ " When chg > 0, then we opened groups and we should indent more, but when
+ " chg < 0, we closed groups and this already affected the previous line,
+ " so we should not dedent. And when everything else fails, scream.
+ let chg = chg > 0 ? chg : 0
+
+ " Analyse current line
+ " FIXME: If we have to dedent, we should try to find the indentation of the
+ " opening line.
+ let cur = s:MatchCount(v:lnum, '^\s*\%(#\s*\%(end\|else\)\>\|[]})]\)')
+ if cur > 0
+ let final = plind + (chg - cur) * shiftwidth()
+ else
+ let final = plind + chg * shiftwidth()
+ endif
+
+ return final < 0 ? 0 : final
+endfunction
diff --git a/runtime/indent/prolog.vim b/runtime/indent/prolog.vim
new file mode 100644
index 0000000..0c4fd54
--- /dev/null
+++ b/runtime/indent/prolog.vim
@@ -0,0 +1,71 @@
+" vim: set sw=4 sts=4:
+" Language: Prolog
+" Maintainer: Gergely Kontra <kgergely@mcl.hu> (Invalid email address)
+" Doug Kearns <dougkearns@gmail.com>
+" Revised on: 2002.02.18. 23:34:05
+" Last change by: Takuya Fujiwara, 2018 Sep 23
+" 2022 April: b:undo_indent added by Doug Kearns
+
+" TODO:
+" checking with respect to syntax highlighting
+" ignoring multiline comments
+" detecting multiline strings
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetPrologIndent()
+setlocal indentkeys-=:,0#
+setlocal indentkeys+=0%,-,0;,>,0)
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+"if exists("*GetPrologIndent")
+" finish
+"endif
+
+function! GetPrologIndent()
+ " Find a non-blank line above the current line.
+ let pnum = prevnonblank(v:lnum - 1)
+ " Hit the start of the file, use zero indent.
+ if pnum == 0
+ return 0
+ endif
+ let line = getline(v:lnum)
+ let pline = getline(pnum)
+
+ let ind = indent(pnum)
+ " Previous line was comment -> use previous line's indent
+ if pline =~ '^\s*%'
+ 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 + shiftwidth()
+ " Check for end of clause on previous line
+ elseif pline =~ '\.\s*\(%.*\)\?$'
+ let ind = ind - shiftwidth()
+ endif
+ " Check for opening conditional on previous line
+ if pline =~ '^\s*\([(;]\|->\)'
+ let ind = ind + shiftwidth()
+ endif
+ " Check for closing an unclosed paren, or middle ; or ->
+ if line =~ '^\s*\([);]\|->\)'
+ let ind = ind - shiftwidth()
+ endif
+ return ind
+endfunction
diff --git a/runtime/indent/ps1.vim b/runtime/indent/ps1.vim
new file mode 100644
index 0000000..0f794db
--- /dev/null
+++ b/runtime/indent/ps1.vim
@@ -0,0 +1,17 @@
+" Vim indent file
+" Language: Windows PowerShell
+" URL: https://github.com/PProvost/vim-ps1
+" Last Change: 2017 Oct 19
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" smartindent is good enough for powershell
+setlocal smartindent
+" disable the indent removal for # marks
+inoremap <buffer> # X#
+
+let b:undo_indent = "setl si<"
diff --git a/runtime/indent/pyrex.vim b/runtime/indent/pyrex.vim
new file mode 100644
index 0000000..a1a1746
--- /dev/null
+++ b/runtime/indent/pyrex.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: Pyrex
+" Maintainer: Marco Barisione <marco.bari@people.it>
+" URL: http://marcobari.altervista.org/pyrex_vim.html
+" Last Change: 2005 Jun 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use Python formatting rules
+runtime! indent/python.vim
diff --git a/runtime/indent/python.vim b/runtime/indent/python.vim
new file mode 100644
index 0000000..8c3d0b0
--- /dev/null
+++ b/runtime/indent/python.vim
@@ -0,0 +1,33 @@
+" Vim indent file
+" Language: Python
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Original Author: David Bustos <bustos@caltech.edu>
+" Last Change: 2021 Sep 26
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Some preliminary settings
+setlocal nolisp " Make sure lisp indenting doesn't supersede us
+setlocal autoindent " indentexpr isn't much help otherwise
+
+setlocal indentexpr=python#GetIndent(v:lnum)
+setlocal indentkeys+=<:>,=elif,=except
+
+let b:undo_indent = "setl ai< inde< indk< lisp<"
+
+" Only define the function once.
+if exists("*GetPythonIndent")
+ finish
+endif
+
+" Keep this for backward compatibility, new scripts should use
+" python#GetIndent()
+function GetPythonIndent(lnum)
+ return python#GetIndent(a:lnum)
+endfunction
+
+" vim:sw=2
diff --git a/runtime/indent/qb64.vim b/runtime/indent/qb64.vim
new file mode 100644
index 0000000..09f815c
--- /dev/null
+++ b/runtime/indent/qb64.vim
@@ -0,0 +1,11 @@
+" Vim indent file
+" Language: QB64
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jan 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/vb.vim
diff --git a/runtime/indent/quarto.vim b/runtime/indent/quarto.vim
new file mode 100644
index 0000000..586d232
--- /dev/null
+++ b/runtime/indent/quarto.vim
@@ -0,0 +1 @@
+runtime indent/rmd.vim
diff --git a/runtime/indent/r.vim b/runtime/indent/r.vim
new file mode 100644
index 0000000..293dd98
--- /dev/null
+++ b/runtime/indent/r.vim
@@ -0,0 +1,526 @@
+" Vim indent file
+" Language: R
+" Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Wed Oct 26, 2022 12:04PM
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys=0{,0},:,!^F,o,O,e
+setlocal indentexpr=GetRIndent()
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+if exists("*GetRIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Options to make the indentation more similar to Emacs/ESS:
+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
+ let j = 0
+ let line1 = ""
+ let llen = strlen(a:line)
+ while i < llen
+ if a:line[i] == '"'
+ let i += 1
+ let line1 = line1 . 's'
+ while !(a:line[i] == '"' && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen
+ let i += 1
+ endwhile
+ if a:line[i] == '"'
+ let i += 1
+ endif
+ else
+ if a:line[i] == "'"
+ let i += 1
+ let line1 = line1 . 's'
+ while !(a:line[i] == "'" && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen
+ let i += 1
+ endwhile
+ if a:line[i] == "'"
+ let i += 1
+ endif
+ else
+ if a:line[i] == "`"
+ let i += 1
+ let line1 = line1 . 's'
+ while a:line[i] != "`" && i < llen
+ let i += 1
+ endwhile
+ if a:line[i] == "`"
+ let i += 1
+ endif
+ endif
+ endif
+ endif
+ if i == llen
+ break
+ endif
+ let line1 = line1 . a:line[i]
+ let j += 1
+ let i += 1
+ endwhile
+ return line1
+endfunction
+
+" Convert foo(bar()) int foo()
+function s:RDelete_parens(line)
+ if s:Get_paren_balance(a:line, "(", ")") != 0
+ return a:line
+ endif
+ let i = 0
+ let j = 0
+ let line1 = ""
+ let llen = strlen(a:line)
+ while i < llen
+ let line1 = line1 . a:line[i]
+ if a:line[i] == '('
+ let nop = 1
+ while nop > 0 && i < llen
+ let i += 1
+ if a:line[i] == ')'
+ let nop -= 1
+ else
+ if a:line[i] == '('
+ let nop += 1
+ endif
+ endif
+ endwhile
+ let line1 = line1 . a:line[i]
+ endif
+ let i += 1
+ endwhile
+ return line1
+endfunction
+
+function! s:Get_paren_balance(line, o, c)
+ let line2 = substitute(a:line, a:o, "", "g")
+ let openp = strlen(a:line) - strlen(line2)
+ let line3 = substitute(line2, a:c, "", "g")
+ let closep = strlen(line2) - strlen(line3)
+ return openp - closep
+endfunction
+
+function! s:Get_matching_brace(linenr, o, c, delbrace)
+ let line = SanitizeRLine(getline(a:linenr))
+ if a:delbrace == 1
+ let line = substitute(line, '{$', "", "")
+ endif
+ let pb = s:Get_paren_balance(line, a:o, a:c)
+ let i = a:linenr
+ while pb != 0 && i > 1
+ let i -= 1
+ let pb += s:Get_paren_balance(SanitizeRLine(getline(i)), a:o, a:c)
+ endwhile
+ return i
+endfunction
+
+" This function is buggy because there 'if's without 'else'
+" It must be rewritten relying more on indentation
+function! s:Get_matching_if(linenr, delif)
+ let line = SanitizeRLine(getline(a:linenr))
+ if a:delif
+ let line = substitute(line, "if", "", "g")
+ endif
+ let elsenr = 0
+ let i = a:linenr
+ let ifhere = 0
+ while i > 0
+ let line2 = substitute(line, '\<else\>', "xxx", "g")
+ let elsenr += strlen(line) - strlen(line2)
+ if line =~ '.*\s*if\s*()' || line =~ '.*\s*if\s*()'
+ let elsenr -= 1
+ if elsenr == 0
+ let ifhere = i
+ break
+ endif
+ endif
+ let i -= 1
+ let line = SanitizeRLine(getline(i))
+ endwhile
+ if ifhere
+ return ifhere
+ else
+ return a:linenr
+ endif
+endfunction
+
+function! s:Get_last_paren_idx(line, o, c, pb)
+ let blc = a:pb
+ let line = substitute(a:line, '\t', s:curtabstop, "g")
+ let theidx = -1
+ let llen = strlen(line)
+ let idx = 0
+ while idx < llen
+ if line[idx] == a:o
+ let blc -= 1
+ if blc == 0
+ let theidx = idx
+ endif
+ else
+ if line[idx] == a:c
+ let blc += 1
+ endif
+ endif
+ let idx += 1
+ endwhile
+ return theidx + 1
+endfunction
+
+" Get previous relevant line. Search back until getting a line that isn't
+" comment or blank
+function s:Get_prev_line(lineno)
+ let lnum = a:lineno - 1
+ let data = getline( lnum )
+ while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$')
+ let lnum = lnum - 1
+ let data = getline( lnum )
+ endwhile
+ return lnum
+endfunction
+
+" This function is also used by r-plugin/common_global.vim
+" Delete from '#' to the end of the line, unless the '#' is inside a string.
+function SanitizeRLine(line)
+ let newline = s:RDelete_quotes(a:line)
+ let newline = s:RDelete_parens(newline)
+ let newline = substitute(newline, '#.*', "", "")
+ let newline = substitute(newline, '\s*$', "", "")
+ if &filetype == "rhelp" && newline =~ '^\\method{.*}{.*}(.*'
+ let newline = substitute(newline, '^\\method{\(.*\)}{.*}', '\1', "")
+ endif
+ return newline
+endfunction
+
+function GetRIndent()
+
+ let clnum = line(".") " current line
+
+ let cline = getline(clnum)
+ if cline =~ '^\s*#'
+ if g:r_indent_ess_comments == 1
+ if cline =~ '^\s*###'
+ return 0
+ endif
+ if cline !~ '^\s*##'
+ return g:r_indent_comment_column
+ endif
+ endif
+ endif
+
+ let cline = SanitizeRLine(cline)
+
+ if cline =~ '^\s*}'
+ let indline = s:Get_matching_brace(clnum, '{', '}', 1)
+ if indline > 0 && indline != clnum
+ let iline = SanitizeRLine(getline(indline))
+ if s:Get_paren_balance(iline, "(", ")") == 0 || iline =~ '(\s*{$'
+ return indent(indline)
+ else
+ let indline = s:Get_matching_brace(indline, '(', ')', 1)
+ return indent(indline)
+ endif
+ 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.
+ if lnum == 0
+ return 0
+ endif
+
+ let line = SanitizeRLine(getline(lnum))
+
+ if &filetype == "rhelp"
+ if cline =~ '^\\dontshow{' || cline =~ '^\\dontrun{' || cline =~ '^\\donttest{' || cline =~ '^\\testonly{'
+ return 0
+ endif
+ if line =~ '^\\examples{' || line =~ '^\\usage{' || line =~ '^\\dontshow{' || line =~ '^\\dontrun{' || line =~ '^\\donttest{' || line =~ '^\\testonly{'
+ return 0
+ endif
+ endif
+
+ if &filetype == "rnoweb" && line =~ "^<<.*>>="
+ return 0
+ endif
+
+ if cline =~ '^\s*{' && s:Get_paren_balance(cline, '{', '}') > 0
+ if g:r_indent_ess_compatible && line =~ ')$'
+ let nlnum = lnum
+ let nline = line
+ while s:Get_paren_balance(nline, '(', ')') < 0
+ let nlnum = s:Get_prev_line(nlnum)
+ let nline = SanitizeRLine(getline(nlnum)) . nline
+ endwhile
+ if nline =~ '^\s*function\s*(' && indent(nlnum) == shiftwidth()
+ return 0
+ endif
+ endif
+ if s:Get_paren_balance(line, "(", ")") == 0
+ return indent(lnum)
+ endif
+ endif
+
+ " line is an incomplete command:
+ if line =~ '\<\(if\|while\|for\|function\)\s*()$' || line =~ '\<else$' || line =~ '<-$' || line =~ '->$'
+ return indent(lnum) + shiftwidth()
+ endif
+
+ " Deal with () and []
+
+ let pb = s:Get_paren_balance(line, '(', ')')
+
+ if line =~ '^\s*{$' || line =~ '(\s*{' || (pb == 0 && (line =~ '{$' || line =~ '(\s*{$'))
+ 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) + shiftwidth()
+ endif
+
+ let bb = s:Get_paren_balance(line, '[', ']')
+
+ if pb > 0
+ if &filetype == "rhelp"
+ let ind = s:Get_last_paren_idx(line, '(', ')', pb)
+ else
+ let ind = s:Get_last_paren_idx(getline(lnum), '(', ')', pb)
+ endif
+ return ind
+ endif
+
+ if pb < 0 && line =~ '.*[,&|\-\*+<>]$'
+ let lnum = s:Get_prev_line(lnum)
+ while pb < 1 && lnum > 0
+ let line = SanitizeRLine(getline(lnum))
+ let line = substitute(line, '\t', s:curtabstop, "g")
+ let ind = strlen(line)
+ while ind > 0
+ if line[ind] == ')'
+ let pb -= 1
+ else
+ if line[ind] == '('
+ let pb += 1
+ endif
+ endif
+ if pb == 1
+ return ind + 1
+ endif
+ let ind -= 1
+ endwhile
+ let lnum -= 1
+ endwhile
+ return 0
+ endif
+
+ if bb > 0
+ let ind = s:Get_last_paren_idx(getline(lnum), '[', ']', bb)
+ return ind
+ endif
+ endif
+
+ let post_block = 0
+ if line =~ '}$' && s:Get_paren_balance(line, '{', '}') < 0
+ let lnum = s:Get_matching_brace(lnum, '{', '}', 0)
+ let line = SanitizeRLine(getline(lnum))
+ if lnum > 0 && line =~ '^\s*{'
+ let lnum = s:Get_prev_line(lnum)
+ let line = SanitizeRLine(getline(lnum))
+ endif
+ let pb = s:Get_paren_balance(line, '(', ')')
+ let post_block = 1
+ endif
+
+ " Indent after operator pattern
+ let olnum = s:Get_prev_line(lnum)
+ let oline = getline(olnum)
+ if olnum > 0
+ if substitute(line, '#.*', '', '') =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0
+ if substitute(oline, '#.*', '', '') =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0
+ return indent(lnum)
+ else
+ return indent(lnum) + shiftwidth()
+ endif
+ else
+ if substitute(oline, '#.*', '', '') =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0
+ return indent(lnum) - shiftwidth()
+ endif
+ endif
+ elseif substitute(line, '#.*', '', '') =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0
+ return indent(lnum) + shiftwidth()
+ endif
+
+ let post_fun = 0
+ if pb < 0 && line !~ ')\s*[,&|\-\*+<>]$'
+ let post_fun = 1
+ while pb < 0 && lnum > 0
+ let lnum -= 1
+ let linepiece = SanitizeRLine(getline(lnum))
+ let pb += s:Get_paren_balance(linepiece, "(", ")")
+ let line = linepiece . line
+ endwhile
+ if line =~ '{$' && post_block == 0
+ return indent(lnum) + shiftwidth()
+ endif
+
+ " Now we can do some tests again
+ if cline =~ '^\s*{'
+ return indent(lnum)
+ endif
+ if post_block == 0
+ let newl = SanitizeRLine(line)
+ if newl =~ '\<\(if\|while\|for\|function\)\s*()$' || newl =~ '\<else$' || newl =~ '<-$'
+ return indent(lnum) + shiftwidth()
+ endif
+ endif
+ endif
+
+ if cline =~ '^\s*else'
+ if line =~ '<-\s*if\s*()'
+ return indent(lnum) + shiftwidth()
+ else
+ if line =~ '\<if\s*()'
+ return indent(lnum)
+ else
+ return indent(lnum) - shiftwidth()
+ endif
+ endif
+ endif
+
+ let bb = s:Get_paren_balance(line, '[', ']')
+ if bb < 0 && line =~ '.*]'
+ while bb < 0 && lnum > 0
+ let lnum -= 1
+ let linepiece = SanitizeRLine(getline(lnum))
+ let bb += s:Get_paren_balance(linepiece, "[", "]")
+ let line = linepiece . line
+ endwhile
+ let line = s:RDelete_parens(line)
+ endif
+
+ let plnum = s:Get_prev_line(lnum)
+ let ppost_else = 0
+ if plnum > 0
+ let pline = SanitizeRLine(getline(plnum))
+ let ppost_block = 0
+ if pline =~ '}$'
+ let ppost_block = 1
+ let plnum = s:Get_matching_brace(plnum, '{', '}', 0)
+ let pline = SanitizeRLine(getline(plnum))
+ if pline =~ '^\s*{$' && plnum > 0
+ let plnum = s:Get_prev_line(plnum)
+ let pline = SanitizeRLine(getline(plnum))
+ endif
+ endif
+
+ if pline =~ 'else$'
+ let ppost_else = 1
+ let plnum = s:Get_matching_if(plnum, 0)
+ let pline = SanitizeRLine(getline(plnum))
+ endif
+
+ if pline =~ '^\s*else\s*if\s*('
+ let pplnum = s:Get_prev_line(plnum)
+ let ppline = SanitizeRLine(getline(pplnum))
+ while ppline =~ '^\s*else\s*if\s*(' || ppline =~ '^\s*if\s*()\s*\S$'
+ let plnum = pplnum
+ let pline = ppline
+ let pplnum = s:Get_prev_line(plnum)
+ let ppline = SanitizeRLine(getline(pplnum))
+ endwhile
+ while ppline =~ '\<\(if\|while\|for\|function\)\s*()$' || ppline =~ '\<else$' || ppline =~ '<-$'
+ let plnum = pplnum
+ let pline = ppline
+ let pplnum = s:Get_prev_line(plnum)
+ let ppline = SanitizeRLine(getline(pplnum))
+ endwhile
+ endif
+
+ let ppb = s:Get_paren_balance(pline, '(', ')')
+ if ppb < 0 && (pline =~ ')\s*{$' || pline =~ ')$')
+ while ppb < 0 && plnum > 0
+ let plnum -= 1
+ let linepiece = SanitizeRLine(getline(plnum))
+ let ppb += s:Get_paren_balance(linepiece, "(", ")")
+ let pline = linepiece . pline
+ endwhile
+ let pline = s:RDelete_parens(pline)
+ endif
+ endif
+
+ let ind = indent(lnum)
+
+ if g:r_indent_align_args == 0 && pb != 0
+ let ind += pb * shiftwidth()
+ return ind
+ endif
+
+ if g:r_indent_align_args == 0 && bb != 0
+ let ind += bb * shiftwidth()
+ return ind
+ endif
+
+ if plnum > 0
+ let pind = indent(plnum)
+ else
+ let pind = 0
+ endif
+
+ if ind == pind || (ind == (pind + shiftwidth()) && pline =~ '{$' && ppost_else == 0)
+ return ind
+ endif
+
+ let pline = getline(plnum)
+ let pbb = s:Get_paren_balance(pline, '[', ']')
+
+ while pind < ind && plnum > 0 && ppb == 0 && pbb == 0
+ let ind = pind
+ let plnum = s:Get_prev_line(plnum)
+ let pline = getline(plnum)
+ let ppb = s:Get_paren_balance(pline, '(', ')')
+ let pbb = s:Get_paren_balance(pline, '[', ']')
+ while pline =~ '^\s*else'
+ let plnum = s:Get_matching_if(plnum, 1)
+ let pline = getline(plnum)
+ let ppb = s:Get_paren_balance(pline, '(', ')')
+ let pbb = s:Get_paren_balance(pline, '[', ']')
+ endwhile
+ let pind = indent(plnum)
+ 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/racket.vim b/runtime/indent/racket.vim
new file mode 100644
index 0000000..93bd38f
--- /dev/null
+++ b/runtime/indent/racket.vim
@@ -0,0 +1,60 @@
+" Vim indent file
+" Language: Racket
+" Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com>
+" Previous Maintainer: Will Langstroth <will@langstroth.com>
+" URL: https://github.com/benknoble/vim-racket
+" Last Change: 2022 Aug 12
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal lisp autoindent nosmartindent
+
+setlocal lispwords+=module,module*,module+,parameterize,let-values,let*-values,letrec-values,local
+setlocal lispwords+=define/contract
+setlocal lispwords+=λ
+setlocal lispwords+=with-handlers
+setlocal lispwords+=define-values,opt-lambda,case-lambda,syntax-rules,with-syntax,syntax-case,syntax-parse
+setlocal lispwords+=define-for-syntax,define-syntax-parser,define-syntax-parse-rule,define-syntax-class,define-splicing-syntax-class
+setlocal lispwords+=define-signature,unit,unit/sig,compund-unit/sig,define-values/invoke-unit/sig
+setlocal lispwords+=define-opt/c,define-syntax-rule
+setlocal lispwords+=define-test-suite
+setlocal lispwords+=struct
+setlocal lispwords+=with-input-from-file,with-output-to-file
+
+" Racket OOP
+" TODO missing a lot of define-like forms here (e.g., define/augment, etc.)
+setlocal lispwords+=class,class*,mixin,interface,class/derived
+setlocal lispwords+=define/public,define/pubment,define/public-final
+setlocal lispwords+=define/override,define/overment,define/override-final
+setlocal lispwords+=define/augment,define/augride,define/augment-final
+setlocal lispwords+=define/private
+
+" kanren
+setlocal lispwords+=fresh,run,run*,project,conde,condu
+
+" loops
+setlocal lispwords+=for,for/list,for/fold,for*,for*/list,for*/fold,for/or,for/and,for*/or,for*/and
+setlocal lispwords+=for/hash,for/hasheq,for/hasheqv,for/sum,for/flvector,for*/flvector,for/vector,for*/vector,for*/sum,for*/hash,for*/hasheq,for*/hasheqv
+setlocal lispwords+=for/async
+setlocal lispwords+=for/set,for*/set
+setlocal lispwords+=for/first,for*/first
+
+setlocal lispwords+=match,match*,match/values,define/match,match-lambda,match-lambda*,match-lambda**
+setlocal lispwords+=match-let,match-let*,match-let-values,match-let*-values
+setlocal lispwords+=match-letrec,match-define,match-define-values
+
+setlocal lispwords+=let/cc,let/ec
+
+" qi
+setlocal lispwords+=define-flow,define-switch,flow-lambda,switch-lambda,on,switch,π,λ01
+setlocal lispwords+=define-qi-syntax,define-qi-syntax-parser,define-qi-syntax-rule
+
+" gui-easy
+setlocal lispwords+=if-view,case-view,cond-view,list-view,dyn-view
+setlocal lispwords+=case/dep
+setlocal lispwords+=define/obs
+
+let b:undo_indent = "setlocal lisp< ai< si< lw<"
diff --git a/runtime/indent/raku.vim b/runtime/indent/raku.vim
new file mode 100644
index 0000000..3f9b49e
--- /dev/null
+++ b/runtime/indent/raku.vim
@@ -0,0 +1,127 @@
+" Vim indent file
+" Language: Perl 6
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" Last Change: 2020 Apr 15
+" Contributors: Andy Lester <andy@petdance.com>
+" Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
+"
+" Adapted from indent/perl.vim by Rafael Garcia-Suarez <rgarciasuarez@free.fr>
+
+" Suggestions and improvements by :
+" Aaron J. Sherman (use syntax for hints)
+" Artem Chuprina (play nice with folding)
+" TODO:
+" This file still relies on stuff from the Perl 5 syntax file, which Perl 6
+" does not use.
+"
+" Things that are not or not properly indented (yet) :
+" - Continued statements
+" print "foo",
+" "bar";
+" print "foo"
+" if bar();
+" - Multiline regular expressions (m//x)
+" (The following probably needs modifying the perl syntax file)
+" - qw() lists
+" - Heredocs with terminators that don't match \I\i*
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Is syntax highlighting active ?
+let b:indent_use_syntax = has("syntax")
+
+setlocal indentexpr=GetRakuIndent()
+
+" we reset it first because the Perl 5 indent file might have been loaded due
+" to a .pl/pm file extension, and indent files don't clean up afterwards
+setlocal indentkeys&
+
+setlocal indentkeys+=0=,0),0],0>,0»,0=or,0=and
+if !b:indent_use_syntax
+ setlocal indentkeys+=0=EO
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+function! GetRakuIndent()
+
+ " Get the line to be indented
+ let cline = getline(v:lnum)
+
+ " Indent POD markers to column 0
+ if cline =~ '^\s*=\L\@!'
+ return 0
+ endif
+
+ " Get current syntax item at the line's first char
+ let csynid = ''
+ if b:indent_use_syntax
+ let csynid = synIDattr(synID(v:lnum,1,0),"name")
+ endif
+
+ " Don't reindent POD and heredocs
+ if csynid =~ "^rakuPod"
+ return indent(v:lnum)
+ endif
+
+
+ " Now get the indent of the previous perl line.
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ " Skip heredocs, POD, and comments on 1st column
+ if b:indent_use_syntax
+ let skippin = 2
+ while skippin
+ let synid = synIDattr(synID(lnum,1,0),"name")
+ if (synid =~ "^rakuPod" || synid =~ "rakuComment")
+ let lnum = prevnonblank(lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ let skippin = 1
+ else
+ let skippin = 0
+ endif
+ endwhile
+ endif
+
+ if line =~ '[<«\[{(]\s*\(#[^)}\]»>]*\)\=$'
+ let ind = ind + &sw
+ endif
+ if cline =~ '^\s*[)}\]»>]'
+ let ind = ind - &sw
+ endif
+
+ " Indent lines that begin with 'or' or 'and'
+ if cline =~ '^\s*\(or\|and\)\>'
+ if line !~ '^\s*\(or\|and\)\>'
+ let ind = ind + &sw
+ endif
+ elseif line =~ '^\s*\(or\|and\)\>'
+ let ind = ind - &sw
+ endif
+
+ return ind
+
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:ts=8:sts=4:sw=4:expandtab:ft=vim
diff --git a/runtime/indent/raml.vim b/runtime/indent/raml.vim
new file mode 100644
index 0000000..73756ae
--- /dev/null
+++ b/runtime/indent/raml.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: RAML (RESTful API Modeling Language)
+" Maintainer: mucheng <leisurelicht@gmail.com>
+" License: VIM LICENSE
+" Latest Revision: 2018-11-03
+
+if exists("b:did_indent")
+ finish
+endif
+
+" Same as yaml indenting.
+runtime! indent/yaml.vim
diff --git a/runtime/indent/readline.vim b/runtime/indent/readline.vim
new file mode 100644
index 0000000..0ab0f82
--- /dev/null
+++ b/runtime/indent/readline.vim
@@ -0,0 +1,39 @@
+" Vim indent file
+" Language: readline configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 24 Sep 2021
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetReadlineIndent()
+setlocal indentkeys=!^F,o,O,=$else,=$endif
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetReadlineIndent")
+ finish
+endif
+
+function GetReadlineIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ if getline(lnum) =~ '^\s*$\(if\|else\)\>'
+ let ind = ind + shiftwidth()
+ endif
+
+ if getline(v:lnum) =~ '^\s*$\(else\|endif\)\>'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/rhelp.vim b/runtime/indent/rhelp.vim
new file mode 100644
index 0000000..f68c090
--- /dev/null
+++ b/runtime/indent/rhelp.vim
@@ -0,0 +1,110 @@
+" Vim indent file
+" Language: R Documentation (Help), *.Rd
+" Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Feb 25, 2023
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+runtime indent/r.vim
+let s:RIndent = function(substitute(&indentexpr, "()", "", ""))
+let b:did_indent = 1
+
+setlocal noautoindent
+setlocal nocindent
+setlocal nosmartindent
+setlocal nolisp
+setlocal indentkeys=0{,0},:,!^F,o,O,e
+setlocal indentexpr=GetCorrectRHelpIndent()
+
+let b:undo_indent = "setl ai< cin< inde< indk< <lisp <si"
+
+" Only define the functions once.
+if exists("*GetRHelpIndent")
+ finish
+endif
+
+function s:SanitizeRHelpLine(line)
+ let newline = substitute(a:line, '\\\\', "x", "g")
+ let newline = substitute(newline, '\\{', "x", "g")
+ let newline = substitute(newline, '\\}', "x", "g")
+ let newline = substitute(newline, '\\%', "x", "g")
+ let newline = substitute(newline, '%.*', "", "")
+ let newline = substitute(newline, '\s*$', "", "")
+ return newline
+endfunction
+
+function GetRHelpIndent()
+
+ let clnum = line(".") " current line
+ if clnum == 1
+ return 0
+ endif
+ let cline = getline(clnum)
+
+ if cline =~ '^\s*}\s*$'
+ let i = clnum
+ let bb = -1
+ while bb != 0 && i > 1
+ let i -= 1
+ let line = s:SanitizeRHelpLine(getline(i))
+ let line2 = substitute(line, "{", "", "g")
+ let openb = strlen(line) - strlen(line2)
+ let line3 = substitute(line2, "}", "", "g")
+ let closeb = strlen(line2) - strlen(line3)
+ let bb += openb - closeb
+ endwhile
+ return indent(i)
+ endif
+
+ if cline =~ '^\s*#ifdef\>' || cline =~ '^\s*#endif\>'
+ return 0
+ endif
+
+ let lnum = clnum - 1
+ let line = getline(lnum)
+ if line =~ '^\s*#ifdef\>' || line =~ '^\s*#endif\>'
+ let lnum -= 1
+ let line = getline(lnum)
+ endif
+ while lnum > 1 && (line =~ '^\s*$' || line =~ '^#ifdef' || line =~ '^#endif')
+ let lnum -= 1
+ let line = getline(lnum)
+ endwhile
+ if lnum == 1
+ return 0
+ endif
+ let line = s:SanitizeRHelpLine(line)
+ let line2 = substitute(line, "{", "", "g")
+ let openb = strlen(line) - strlen(line2)
+ let line3 = substitute(line2, "}", "", "g")
+ let closeb = strlen(line2) - strlen(line3)
+ let bb = openb - closeb
+
+ let ind = indent(lnum) + (bb * shiftwidth())
+
+ if line =~ '^\s*}\s*$'
+ let ind = indent(lnum)
+ endif
+
+ if ind < 0
+ return 0
+ endif
+
+ return ind
+endfunction
+
+function GetCorrectRHelpIndent()
+ let lastsection = search('^\\[a-z]*{', "bncW")
+ let secname = getline(lastsection)
+ if secname =~ '^\\usage{' || secname =~ '^\\examples{' || secname =~ '^\\dontshow{' || secname =~ '^\\dontrun{' || secname =~ '^\\donttest{' || secname =~ '^\\testonly{' || secname =~ '^\\method{.*}{.*}('
+ return s:RIndent()
+ else
+ return GetRHelpIndent()
+ endif
+endfunction
+
+" vim: sw=2
diff --git a/runtime/indent/rmd.vim b/runtime/indent/rmd.vim
new file mode 100644
index 0000000..a043b0c
--- /dev/null
+++ b/runtime/indent/rmd.vim
@@ -0,0 +1,88 @@
+" Vim indent file
+" Language: Rmd
+" Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Wed Nov 09, 2022 09:44PM
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+runtime indent/r.vim
+let s:RIndent = function(substitute(&indentexpr, "()", "", ""))
+let b:did_indent = 1
+
+setlocal indentkeys=0{,0},<:>,!^F,o,O,e
+setlocal indentexpr=GetRmdIndent()
+
+let b:undo_indent = "setl inde< indk<"
+
+if exists("*GetRmdIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Simple Python indentation algorithm
+function s:GetPyIndent()
+ let plnum = prevnonblank(v:lnum - 1)
+ let pline = getline(plnum)
+ let cline = getline(v:lnum)
+ if pline =~ '^s```\s*{\s*python '
+ return 0
+ elseif pline =~ ':$'
+ return indent(plnum) + &shiftwidth
+ elseif cline =~ 'else:$'
+ return indent(plnum) - &shiftwidth
+ endif
+ return indent(plnum)
+endfunction
+
+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\+'
+ return indent(v:lnum)
+ elseif pline =~ '^\s*[-\+\*]\s'
+ return indent(v:lnum - 1) + 2
+ elseif pline =~ '^\s*\d\+\.\s\+'
+ return indent(v:lnum - 1) + 3
+ elseif pline =~ '^\[\^\S\+\]: '
+ return indent(v:lnum - 1) + shiftwidth()
+ endif
+ return indent(prevnonblank(v:lnum - 1))
+endfunction
+
+function s:GetYamlIndent()
+ let plnum = prevnonblank(v:lnum - 1)
+ let pline = getline(plnum)
+ if pline =~ ':\s*$'
+ return indent(plnum) + shiftwidth()
+ elseif pline =~ '^\s*- '
+ return indent(v:lnum) + 2
+ endif
+ return indent(plnum)
+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()
+ elseif search('^[ \t]*```{python', "bncW") > search('^[ \t]*```$', "bncW")
+ return s:GetPyIndent()
+ else
+ 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
new file mode 100644
index 0000000..33bc103
--- /dev/null
+++ b/runtime/indent/rnoweb.vim
@@ -0,0 +1,49 @@
+" Vim indent file
+" Language: Rnoweb
+" Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Feb 25, 2023
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+runtime indent/tex.vim
+
+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
+
+setlocal indentkeys=0{,0},!^F,o,O,e,},=\bibitem,=\item
+setlocal indentexpr=GetRnowebIndent()
+
+let b:undo_indent = "setl inde< indk<"
+
+if exists("*GetRnowebIndent")
+ finish
+endif
+
+function GetRnowebIndent()
+ let curline = getline(".")
+ if curline =~ '^<<.*>>=$' || curline =~ '^\s*@$'
+ return 0
+ endif
+ if search("^<<", "bncW") > search("^@", "bncW")
+ return s:RIndent()
+ endif
+ return s:TeXIndent()
+endfunction
+
+" vim: sw=2
diff --git a/runtime/indent/rpl.vim b/runtime/indent/rpl.vim
new file mode 100644
index 0000000..8577c4d
--- /dev/null
+++ b/runtime/indent/rpl.vim
@@ -0,0 +1,63 @@
+" Vim indent file
+" Language: RPL/2
+" Version: 0.2
+" Last Change: 2017 Jun 13
+" Maintainer: BERTRAND Joël <rpl2@free.fr>
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentkeys+==~end,=~case,=~if,=~then,=~else,=~do,=~until,=~while,=~repeat,=~select,=~default,=~for,=~start,=~next,=~step,<<>,<>>
+
+" Define the appropriate indent function but only once
+setlocal indentexpr=RplGetFreeIndent()
+if exists("*RplGetFreeIndent")
+ finish
+endif
+
+let b:undo_indent = "set ai< indentkeys< indentexpr<"
+
+function RplGetIndent(lnum)
+ let ind = indent(a:lnum)
+ let prevline=getline(a:lnum)
+ " Strip tail comment
+ let prevstat=substitute(prevline, '!.*$', '', '')
+
+ " Add a shiftwidth to statements following if, iferr, then, else, elseif,
+ " case, select, default, do, until, while, repeat, for, start
+ 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 + 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 - shiftwidth()
+ elseif line =~? '^\s*>>\($\|\s\+\)'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfunction
+
+function RplGetFreeIndent()
+ " Find the previous non-blank line
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Use zero indent at the top of the file
+ if lnum == 0
+ return 0
+ endif
+
+ let ind=RplGetIndent(lnum)
+ return ind
+endfunction
+
+" vim:sw=2 tw=130
diff --git a/runtime/indent/rrst.vim b/runtime/indent/rrst.vim
new file mode 100644
index 0000000..585c5e6
--- /dev/null
+++ b/runtime/indent/rrst.vim
@@ -0,0 +1,49 @@
+" Vim indent file
+" Language: Rrst
+" Author: Jakson Alves de Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Feb 25, 2023
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+runtime indent/r.vim
+let s:RIndent = function(substitute(&indentexpr, "()", "", ""))
+let b:did_indent = 1
+
+setlocal indentkeys=0{,0},:,!^F,o,O,e
+setlocal indentexpr=GetRrstIndent()
+
+let b:undo_indent = "setl inde< indk<"
+
+if exists("*GetRrstIndent")
+ finish
+endif
+
+function GetRstIndent()
+ 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\+'
+ return indent(v:lnum)
+ elseif pline =~ '^\s*[-\+\*]\s'
+ return indent(v:lnum - 1) + 2
+ elseif pline =~ '^\s*\d\+\.\s\+'
+ return indent(v:lnum - 1) + 3
+ endif
+ return indent(prevnonblank(v:lnum - 1))
+endfunction
+
+function GetRrstIndent()
+ if getline(".") =~ '^\.\. {r .*}$' || getline(".") =~ '^\.\. \.\.$'
+ return 0
+ endif
+ if search('^\.\. {r', "bncW") > search('^\.\. \.\.$', "bncW")
+ return s:RIndent()
+ else
+ return GetRstIndent()
+ endif
+endfunction
+
+" vim: sw=2
diff --git a/runtime/indent/rst.vim b/runtime/indent/rst.vim
new file mode 100644
index 0000000..a31ad8e
--- /dev/null
+++ b/runtime/indent/rst.vim
@@ -0,0 +1,74 @@
+" Vim indent file
+" Vim reST indent file
+" Language: reStructuredText Documentation Format
+" Maintainer: Marshall Ward <marshall.ward@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2020-03-31
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetRSTIndent()
+setlocal indentkeys=!^F,o,O
+setlocal nosmartindent
+
+if exists("*GetRSTIndent")
+ finish
+endif
+
+let s:itemization_pattern = '^\s*[-*+]\s'
+let s:enumeration_pattern = '^\s*\%(\d\+\|#\)\.\s\+'
+let s:note_pattern = '^\.\. '
+
+function! s:get_paragraph_start()
+ let paragraph_mark_start = getpos("'{")[1]
+ return getline(paragraph_mark_start) =~ '\S' ? paragraph_mark_start : paragraph_mark_start + 1
+endfunction
+
+function GetRSTIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let line = getline(lnum)
+
+ let psnum = s:get_paragraph_start()
+ if psnum != 0
+ if getline(psnum) =~ s:note_pattern
+ let ind = 3
+ endif
+ endif
+
+ if line =~ s:itemization_pattern
+ let ind += 2
+ elseif line =~ s:enumeration_pattern
+ let ind += matchend(line, s:enumeration_pattern)
+ endif
+
+ let line = getline(v:lnum - 1)
+
+ " Indent :FIELD: lines. Don’t match if there is no text after the field or
+ " if the text ends with a sent-ender.
+ if line =~ '^:.\+:\s\{-1,\}\S.\+[^.!?:]$'
+ return matchend(line, '^:.\{-1,}:\s\+')
+ endif
+
+ if line =~ '^\s*$'
+ execute lnum
+ call search('^\s*\%([-*+]\s\|\%(\d\+\|#\)\.\s\|\.\.\|$\)', 'bW')
+ let line = getline('.')
+ if line =~ s:itemization_pattern
+ let ind -= 2
+ elseif line =~ s:enumeration_pattern
+ let ind -= matchend(line, s:enumeration_pattern)
+ elseif line =~ '^\s*\.\.'
+ let ind -= 3
+ endif
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/ruby.vim b/runtime/indent/ruby.vim
new file mode 100644
index 0000000..6ce8529
--- /dev/null
+++ b/runtime/indent/ruby.vim
@@ -0,0 +1,990 @@
+" Vim indent file
+" Language: Ruby
+" Maintainer: Andrew Radev <andrey.radev@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now at bitwi.se>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Mar 22
+
+" 0. Initialization {{{1
+" =================
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+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_assignment_style')
+ " Possible values: "variable", "hanging"
+ let g:ruby_indent_assignment_style = 'hanging'
+endif
+
+if !exists('g:ruby_indent_block_style')
+ " Possible values: "expression", "do"
+ let g:ruby_indent_block_style = 'do'
+endif
+
+if !exists('g:ruby_indent_hanging_elements')
+ " Non-zero means hanging indents are enabled, zero means disabled
+ let g:ruby_indent_hanging_elements = 1
+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+==end,=else,=elsif,=when,=in\ ,=ensure,=rescue,==begin,==end
+setlocal indentkeys+==private,=protected,=public
+
+let b:undo_indent = "setlocal indentexpr< indentkeys< smartindent<"
+
+" Only define the function once.
+if exists("*GetRubyIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" 1. Variables {{{1
+" ============
+
+" Syntax group names that are strings.
+let s:syng_string =
+ \ ['String', 'Interpolation', 'InterpolationDelimiter', 'StringEscape']
+
+" Syntax group names that are strings or documentation.
+let s:syng_stringdoc = s:syng_string + ['Documentation']
+
+" Syntax group names that are or delimit strings/symbols/regexes or are comments.
+let s:syng_strcom = s:syng_stringdoc + [
+ \ 'Character',
+ \ 'Comment',
+ \ 'HeredocDelimiter',
+ \ 'PercentRegexpDelimiter',
+ \ 'PercentStringDelimiter',
+ \ 'PercentSymbolDelimiter',
+ \ 'Regexp',
+ \ 'RegexpCharClass',
+ \ 'RegexpDelimiter',
+ \ 'RegexpEscape',
+ \ 'StringDelimiter',
+ \ 'Symbol',
+ \ 'SymbolDelimiter',
+ \ ]
+
+" Expression used to check whether we should skip a match with searchpair().
+let s:skip_expr =
+ \ 'index(map('.string(s:syng_strcom).',"hlID(''ruby''.v:val)"), synID(line("."),col("."),1)) >= 0'
+
+" 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\|if\|for' .
+ \ '\|while\|until\|else\|elsif\|case\|when\|in\|unless\|begin\|ensure\|rescue' .
+ \ '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
+ \ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' .
+ \ '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>'
+
+" Def without an end clause: def method_call(...) = <expression>
+let s:ruby_endless_def = '\<def\s\+\k\+[!?]\=\%((.*)\|\s\)\s*='
+
+" Regex used for words that, at the start of a line, remove a level of indent.
+let s:ruby_deindent_keywords =
+ \ '^\s*\zs\<\%(ensure\|else\|rescue\|elsif\|when\|in\|end\):\@!\>'
+
+" Regex that defines the start-match for the 'end' keyword.
+"let s:end_start_regex = '\%(^\|[^.]\)\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\|begin\|do\)\>'
+" 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\|if\|for\|while\|until\|case\|unless\|begin' .
+ \ '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
+ \ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'
+
+" Regex that defines the middle-match for the 'end' keyword.
+let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue:\@!\>\|when\|\%(\%(^\|;\)\s*\)\@<=\<in\|elsif\):\@!\>'
+
+" Regex that defines the end-match for the 'end' keyword.
+let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end:\@!\>'
+
+" Expression used for searchpair() call for finding a match for an 'end' keyword.
+function! s:EndSkipExpr()
+ if eval(s:skip_expr)
+ return 1
+ elseif expand('<cword>') == 'do'
+ \ && getline(".") =~ '^\s*\<\(while\|until\|for\):\@!\>'
+ return 1
+ elseif getline('.') =~ s:ruby_endless_def
+ return 1
+ elseif getline('.') =~ '\<def\s\+\k\+[!?]\=([^)]*$'
+ " Then it's a `def method(` with a possible `) =` later
+ call search('\<def\s\+\k\+\zs(', 'W', line('.'))
+ normal! %
+ return getline('.') =~ ')\s*='
+ else
+ return 0
+ endif
+endfunction
+
+let s:end_skip_expr = function('s:EndSkipExpr')
+
+" Regex that defines continuation lines, not including (, {, or [.
+let s:non_bracket_continuation_regex =
+ \ '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|:\@<![^[:alnum:]:][|&?]\|||\|&&\)\s*\%(#.*\)\=$'
+
+" Regex that defines continuation lines.
+let s:continuation_regex =
+ \ '\%(%\@<![({[\\.,:*/%+]\|\<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.
+" Code like this will be matched by both:
+"
+" method_call do |(a, b)|
+"
+" The reason is that the pipe matches a hanging "|" operator.
+"
+let s:block_regex =
+ \ '\%(\<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. GetRubyIndent Function {{{1
+" =========================
+
+function! GetRubyIndent(...) abort
+ " 2.1. Setup {{{2
+ " ----------
+
+ let indent_info = {}
+
+ " The value of a single shift-width
+ if exists('*shiftwidth')
+ let indent_info.sw = shiftwidth()
+ else
+ let indent_info.sw = &sw
+ endif
+
+ " For the current line, use the first argument if given, else v:lnum
+ let indent_info.clnum = a:0 ? a:1 : v:lnum
+ let indent_info.cline = getline(indent_info.clnum)
+
+ " Set up variables for restoring position in file. Could use clnum here.
+ let indent_info.col = col('.')
+
+ " 2.2. Work on the current line {{{2
+ " -----------------------------
+ let indent_callback_names = [
+ \ 's:AccessModifier',
+ \ 's:ClosingBracketOnEmptyLine',
+ \ 's:BlockComment',
+ \ 's:DeindentingKeyword',
+ \ 's:MultilineStringOrLineComment',
+ \ 's:ClosingHeredocDelimiter',
+ \ 's:LeadingOperator',
+ \ ]
+
+ for callback_name in indent_callback_names
+" Decho "Running: ".callback_name
+ let indent = call(function(callback_name), [indent_info])
+
+ if indent >= 0
+" Decho "Match: ".callback_name." indent=".indent." info=".string(indent_info)
+ return indent
+ endif
+ endfor
+
+ " 2.3. Work on the previous line. {{{2
+ " -------------------------------
+
+ " Special case: we don't need the real s:PrevNonBlankNonString for an empty
+ " line inside a string. And that call can be quite expensive in that
+ " particular situation.
+ let indent_callback_names = [
+ \ 's:EmptyInsideString',
+ \ ]
+
+ for callback_name in indent_callback_names
+" Decho "Running: ".callback_name
+ let indent = call(function(callback_name), [indent_info])
+
+ if indent >= 0
+" Decho "Match: ".callback_name." indent=".indent." info=".string(indent_info)
+ return indent
+ endif
+ endfor
+
+ " Previous line number
+ let indent_info.plnum = s:PrevNonBlankNonString(indent_info.clnum - 1)
+ let indent_info.pline = getline(indent_info.plnum)
+
+ let indent_callback_names = [
+ \ 's:StartOfFile',
+ \ 's:AfterAccessModifier',
+ \ 's:ContinuedLine',
+ \ 's:AfterBlockOpening',
+ \ 's:AfterHangingSplat',
+ \ 's:AfterUnbalancedBracket',
+ \ 's:AfterLeadingOperator',
+ \ 's:AfterEndKeyword',
+ \ 's:AfterIndentKeyword',
+ \ ]
+
+ for callback_name in indent_callback_names
+" Decho "Running: ".callback_name
+ let indent = call(function(callback_name), [indent_info])
+
+ if indent >= 0
+" Decho "Match: ".callback_name." indent=".indent." info=".string(indent_info)
+ return indent
+ endif
+ endfor
+
+ " 2.4. Work on the MSL line. {{{2
+ " --------------------------
+ let indent_callback_names = [
+ \ 's:PreviousNotMSL',
+ \ 's:IndentingKeywordInMSL',
+ \ 's:ContinuedHangingOperator',
+ \ ]
+
+ " Most Significant line based on the previous one -- in case it's a
+ " continuation of something above
+ let indent_info.plnum_msl = s:GetMSL(indent_info.plnum)
+
+ for callback_name in indent_callback_names
+" Decho "Running: ".callback_name
+ let indent = call(function(callback_name), [indent_info])
+
+ if indent >= 0
+" Decho "Match: ".callback_name." indent=".indent." info=".string(indent_info)
+ return indent
+ endif
+ endfor
+
+ " }}}2
+
+ " By default, just return the previous line's indent
+" Decho "Default case matched"
+ return indent(indent_info.plnum)
+endfunction
+
+" 3. Indenting Logic Callbacks {{{1
+" ============================
+
+function! s:AccessModifier(cline_info) abort
+ let info = a:cline_info
+
+ " 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(info.clnum, s:access_modifier_regex)
+ let class_lnum = s:FindContainingClass()
+ if class_lnum > 0
+ return indent(class_lnum) + info.sw
+ endif
+ endif
+ elseif g:ruby_indent_access_modifier_style == 'outdent'
+ if s:Match(info.clnum, s:access_modifier_regex)
+ let class_lnum = s:FindContainingClass()
+ if class_lnum > 0
+ return indent(class_lnum)
+ endif
+ endif
+ endif
+
+ return -1
+endfunction
+
+function! s:ClosingBracketOnEmptyLine(cline_info) abort
+ let info = a:cline_info
+
+ " 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.
+ let col = matchend(info.cline, '^\s*[]})]')
+
+ if col > 0 && !s:IsInStringOrComment(info.clnum, col)
+ call cursor(info.clnum, col)
+ let closing_bracket = info.cline[col - 1]
+ let bracket_pair = strpart('(){}[]', stridx(')}]', closing_bracket) * 2, 2)
+
+ if searchpair(escape(bracket_pair[0], '\['), '', bracket_pair[1], 'bW', s:skip_expr) > 0
+ if closing_bracket == ')' && col('.') != col('$') - 1
+ if g:ruby_indent_hanging_elements
+ let ind = virtcol('.') - 1
+ else
+ let ind = indent(line('.'))
+ end
+ 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
+
+ return ind
+ endif
+
+ return -1
+endfunction
+
+function! s:BlockComment(cline_info) abort
+ " If we have a =begin or =end set indent to first column.
+ if match(a:cline_info.cline, '^\s*\%(=begin\|=end\)$') != -1
+ return 0
+ endif
+ return -1
+endfunction
+
+function! s:DeindentingKeyword(cline_info) abort
+ let info = a:cline_info
+
+ " If we have a deindenting keyword, find its match and indent to its level.
+ " TODO: this is messy
+ if s:Match(info.clnum, s:ruby_deindent_keywords)
+ call cursor(info.clnum, 1)
+
+ if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
+ \ s:end_skip_expr) > 0
+ let msl = s:GetMSL(line('.'))
+ let line = getline(line('.'))
+
+ if s:IsAssignment(line, col('.')) &&
+ \ strpart(line, col('.') - 1, 2) !~ 'do'
+ " assignment to case/begin/etc, on the same line
+ if g:ruby_indent_assignment_style == 'hanging'
+ " hanging indent
+ let ind = virtcol('.') - 1
+ else
+ " align with variable
+ let ind = indent(line('.'))
+ endif
+ 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
+ return ind
+ endif
+
+ return -1
+endfunction
+
+function! s:MultilineStringOrLineComment(cline_info) abort
+ let info = a:cline_info
+
+ " If we are in a multi-line string or line-comment, don't do anything to it.
+ if s:IsInStringOrDocumentation(info.clnum, matchend(info.cline, '^\s*') + 1)
+ return indent(info.clnum)
+ endif
+ return -1
+endfunction
+
+function! s:ClosingHeredocDelimiter(cline_info) abort
+ let info = a:cline_info
+
+ " If we are at the closing delimiter of a "<<" heredoc-style string, set the
+ " indent to 0.
+ if info.cline =~ '^\k\+\s*$'
+ \ && s:IsInStringDelimiter(info.clnum, 1)
+ \ && search('\V<<'.info.cline, 'nbW') > 0
+ return 0
+ endif
+
+ return -1
+endfunction
+
+function! s:LeadingOperator(cline_info) abort
+ " If the current line starts with a leading operator, add a level of indent.
+ if s:Match(a:cline_info.clnum, s:leading_operator_regex)
+ return indent(s:GetMSL(a:cline_info.clnum)) + a:cline_info.sw
+ endif
+ return -1
+endfunction
+
+function! s:EmptyInsideString(pline_info) abort
+ " If the line is empty and inside a string (the previous line is a string,
+ " too), use the previous line's indent
+ let info = a:pline_info
+
+ let plnum = prevnonblank(info.clnum - 1)
+ let pline = getline(plnum)
+
+ if info.cline =~ '^\s*$'
+ \ && s:IsInStringOrComment(plnum, 1)
+ \ && s:IsInStringOrComment(plnum, strlen(pline))
+ return indent(plnum)
+ endif
+ return -1
+endfunction
+
+function! s:StartOfFile(pline_info) abort
+ " At the start of the file use zero indent.
+ if a:pline_info.plnum == 0
+ return 0
+ endif
+ return -1
+endfunction
+
+function! s:AfterAccessModifier(pline_info) abort
+ let info = a:pline_info
+
+ 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(info.plnum, s:indent_access_modifier_regex)
+ return indent(info.plnum) + info.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(info.plnum, s:access_modifier_regex)
+ return indent(info.plnum) + info.sw
+ endif
+ endif
+ return -1
+endfunction
+
+" Example:
+"
+" if foo || bar ||
+" baz || bing
+" puts "foo"
+" end
+"
+function! s:ContinuedLine(pline_info) abort
+ let info = a:pline_info
+
+ let col = s:Match(info.plnum, s:ruby_indent_keywords)
+ if s:Match(info.plnum, s:continuable_regex) &&
+ \ s:Match(info.plnum, s:continuation_regex)
+ if col > 0 && s:IsAssignment(info.pline, col)
+ if g:ruby_indent_assignment_style == 'hanging'
+ " hanging indent
+ let ind = col - 1
+ else
+ " align with variable
+ let ind = indent(info.plnum)
+ endif
+ else
+ let ind = indent(s:GetMSL(info.plnum))
+ endif
+ return ind + info.sw + info.sw
+ endif
+ return -1
+endfunction
+
+function! s:AfterBlockOpening(pline_info) abort
+ let info = a:pline_info
+
+ " If the previous line ended with a block opening, add a level of indent.
+ if s:Match(info.plnum, s:block_regex)
+ if g:ruby_indent_block_style == 'do'
+ " don't align to the msl, align to the "do"
+ let ind = indent(info.plnum) + info.sw
+ else
+ let plnum_msl = s:GetMSL(info.plnum)
+
+ if getline(plnum_msl) =~ '=\s*\(#.*\)\=$'
+ " in the case of assignment to the msl, align to the starting line,
+ " not to the msl
+ let ind = indent(info.plnum) + info.sw
+ else
+ let ind = indent(plnum_msl) + info.sw
+ endif
+ endif
+
+ return ind
+ endif
+
+ return -1
+endfunction
+
+function! s:AfterLeadingOperator(pline_info) abort
+ " If the previous line started with a leading operator, use its MSL's level
+ " of indent
+ if s:Match(a:pline_info.plnum, s:leading_operator_regex)
+ return indent(s:GetMSL(a:pline_info.plnum))
+ endif
+ return -1
+endfunction
+
+function! s:AfterHangingSplat(pline_info) abort
+ let info = a:pline_info
+
+ " If the previous line ended with the "*" of a splat, add a level of indent
+ if info.pline =~ s:splat_regex
+ return indent(info.plnum) + info.sw
+ endif
+ return -1
+endfunction
+
+function! s:AfterUnbalancedBracket(pline_info) abort
+ let info = a:pline_info
+
+ " If the previous line contained unclosed opening brackets and we are still
+ " in them, find the rightmost one and add indent depending on the bracket
+ " type.
+ "
+ " If it contained hanging closing brackets, find the rightmost one, find its
+ " match and indent according to that.
+ if info.pline =~ '[[({]' || info.pline =~ '[])}]\s*\%(#.*\)\=$'
+ let [opening, closing] = s:ExtraBrackets(info.plnum)
+
+ if opening.pos != -1
+ if !g:ruby_indent_hanging_elements
+ return indent(info.plnum) + info.sw
+ elseif opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
+ if col('.') + 1 == col('$')
+ return indent(info.plnum) + info.sw
+ else
+ return virtcol('.')
+ endif
+ else
+ let nonspace = matchend(info.pline, '\S', opening.pos + 1) - 1
+ return nonspace > 0 ? nonspace : indent(info.plnum) + info.sw
+ endif
+ elseif closing.pos != -1
+ call cursor(info.plnum, closing.pos + 1)
+ normal! %
+
+ if strpart(info.pline, closing.pos) =~ '^)\s*='
+ " special case: the closing `) =` of an endless def
+ return indent(s:GetMSL(line('.')))
+ endif
+
+ if s:Match(line('.'), s:ruby_indent_keywords)
+ return indent('.') + info.sw
+ else
+ return indent(s:GetMSL(line('.')))
+ endif
+ else
+ call cursor(info.clnum, info.col)
+ end
+ endif
+
+ return -1
+endfunction
+
+function! s:AfterEndKeyword(pline_info) abort
+ let info = a:pline_info
+ " If the previous line ended with an "end", match that "end"s beginning's
+ " indent.
+ let col = s:Match(info.plnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$')
+ if col > 0
+ call cursor(info.plnum, col)
+ if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW',
+ \ s:end_skip_expr) > 0
+ let n = line('.')
+ let ind = indent('.')
+ let msl = s:GetMSL(n)
+ if msl != n
+ let ind = indent(msl)
+ end
+ return ind
+ endif
+ end
+ return -1
+endfunction
+
+function! s:AfterIndentKeyword(pline_info) abort
+ let info = a:pline_info
+ let col = s:Match(info.plnum, s:ruby_indent_keywords)
+
+ if col > 0 && s:Match(info.plnum, s:ruby_endless_def) <= 0
+ call cursor(info.plnum, col)
+ let ind = virtcol('.') - 1 + info.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
+ if s:Match(info.plnum, s:end_end_regex)
+ let ind = indent('.')
+ elseif s:IsAssignment(info.pline, col)
+ if g:ruby_indent_assignment_style == 'hanging'
+ " hanging indent
+ let ind = col + info.sw - 1
+ else
+ " align with variable
+ let ind = indent(info.plnum) + info.sw
+ endif
+ endif
+ return ind
+ endif
+
+ return -1
+endfunction
+
+function! s:PreviousNotMSL(msl_info) abort
+ let info = a:msl_info
+
+ " If the previous line wasn't a MSL
+ if info.plnum != info.plnum_msl
+ " If previous line ends bracket and begins non-bracket continuation decrease indent by 1.
+ if s:Match(info.plnum, s:bracket_switch_continuation_regex)
+ " TODO (2016-10-07) Wrong/unused? How could it be "1"?
+ return indent(info.plnum) - 1
+ " If previous line is a continuation return its indent.
+ elseif s:Match(info.plnum, s:non_bracket_continuation_regex)
+ return indent(info.plnum)
+ endif
+ endif
+
+ return -1
+endfunction
+
+function! s:IndentingKeywordInMSL(msl_info) abort
+ let info = a:msl_info
+ " If the MSL line had an indenting keyword in it, add a level of indent.
+ " TODO: this does not take into account contrived things such as
+ " module Foo; class Bar; end
+ let col = s:Match(info.plnum_msl, s:ruby_indent_keywords)
+ if col > 0 && s:Match(info.plnum_msl, s:ruby_endless_def) <= 0
+ let ind = indent(info.plnum_msl) + info.sw
+ if s:Match(info.plnum_msl, s:end_end_regex)
+ let ind = ind - info.sw
+ elseif s:IsAssignment(getline(info.plnum_msl), col)
+ if g:ruby_indent_assignment_style == 'hanging'
+ " hanging indent
+ let ind = col + info.sw - 1
+ else
+ " align with variable
+ let ind = indent(info.plnum_msl) + info.sw
+ endif
+ endif
+ return ind
+ endif
+ return -1
+endfunction
+
+function! s:ContinuedHangingOperator(msl_info) abort
+ let info = a:msl_info
+
+ " If the previous line ended with [*+/.,-=], but wasn't a block ending or a
+ " closing bracket, indent one extra level.
+ if s:Match(info.plnum_msl, s:non_bracket_continuation_regex) && !s:Match(info.plnum_msl, '^\s*\([\])}]\|end\)')
+ if info.plnum_msl == info.plnum
+ let ind = indent(info.plnum_msl) + info.sw
+ else
+ let ind = indent(info.plnum_msl)
+ endif
+ return ind
+ endif
+
+ return -1
+endfunction
+
+" 4. Auxiliary Functions {{{1
+" ======================
+
+function! s:IsInRubyGroup(groups, lnum, col) abort
+ let ids = map(copy(a:groups), 'hlID("ruby".v:val)')
+ return index(ids, synID(a:lnum, a:col, 1)) >= 0
+endfunction
+
+" Check if the character at lnum:col is inside a string, comment, or is ascii.
+function! s:IsInStringOrComment(lnum, col) abort
+ return s:IsInRubyGroup(s:syng_strcom, a:lnum, a:col)
+endfunction
+
+" Check if the character at lnum:col is inside a string.
+function! s:IsInString(lnum, col) abort
+ return s:IsInRubyGroup(s:syng_string, a:lnum, a:col)
+endfunction
+
+" Check if the character at lnum:col is inside a string or documentation.
+function! s:IsInStringOrDocumentation(lnum, col) abort
+ return s:IsInRubyGroup(s:syng_stringdoc, a:lnum, a:col)
+endfunction
+
+" Check if the character at lnum:col is inside a string delimiter
+function! s:IsInStringDelimiter(lnum, col) abort
+ return s:IsInRubyGroup(
+ \ ['HeredocDelimiter', 'PercentStringDelimiter', 'StringDelimiter'],
+ \ a:lnum, a:col
+ \ )
+endfunction
+
+function! s:IsAssignment(str, pos) abort
+ return strpart(a:str, 0, a:pos - 1) =~ '=\s*$'
+endfunction
+
+" Find line above 'lnum' that isn't empty, in a comment, or in a string.
+function! s:PrevNonBlankNonString(lnum) abort
+ let in_block = 0
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ " Go in and out of blocks comments as necessary.
+ " If the line isn't empty (with opt. comment) or in a string, end search.
+ let line = getline(lnum)
+ if line =~ '^=begin'
+ if in_block
+ let in_block = 0
+ else
+ break
+ endif
+ elseif !in_block && line =~ '^=end'
+ let in_block = 1
+ elseif !in_block && line !~ '^\s*#.*$' && !(s:IsInStringOrComment(lnum, 1)
+ \ && s:IsInStringOrComment(lnum, strlen(line)))
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+" Find line above 'lnum' that started the continuation 'lnum' may be part of.
+function! s:GetMSL(lnum) abort
+ " Start on the line we're at and use its indent.
+ let msl = a:lnum
+ let lnum = s:PrevNonBlankNonString(a:lnum - 1)
+ while lnum > 0
+ " If we have a continuation line, or we're in a string, use line as MSL.
+ " Otherwise, terminate search as we have found our MSL already.
+ let line = getline(lnum)
+
+ 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.
+ "
+ " Example:
+ " Hash[*
+ " method_call do
+ " something
+ "
+ return msl
+ 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.
+ "
+ " Example:
+ " method_call one,
+ " two,
+ " 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
+ " the previous is a non-bracket one, respect the previous' indentation,
+ " and stop here.
+ "
+ " Example:
+ " method_call one,
+ " two {
+ " three
+ "
+ return lnum
+ elseif s:Match(lnum, s:bracket_continuation_regex) &&
+ \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex))
+ " If both lines are bracket continuations (the current may also be a
+ " block-starter), use the current one's and stop here
+ "
+ " Example:
+ " method_call(
+ " other_method_call(
+ " foo
+ return msl
+ elseif s:Match(lnum, s:block_regex) &&
+ \ !s:Match(msl, s:continuation_regex) &&
+ \ !s:Match(msl, s:block_continuation_regex)
+ " If the previous line is a block-starter and the current one is
+ " mostly ordinary, use the current one as the MSL.
+ "
+ " Example:
+ " method_call do
+ " something
+ " something_else
+ return msl
+ else
+ let col = match(line, s:continuation_regex) + 1
+ if (col > 0 && !s:IsInStringOrComment(lnum, col))
+ \ || s:IsInString(lnum, strlen(line))
+ let msl = lnum
+ else
+ break
+ endif
+ endif
+
+ let lnum = s:PrevNonBlankNonString(lnum - 1)
+ endwhile
+ return msl
+endfunction
+
+" Check if line 'lnum' has more opening brackets than closing ones.
+function! s:ExtraBrackets(lnum) abort
+ let opening = {'parentheses': [], 'braces': [], 'brackets': []}
+ let closing = {'parentheses': [], 'braces': [], 'brackets': []}
+
+ let line = getline(a:lnum)
+ let pos = match(line, '[][(){}]', 0)
+
+ " Save any encountered opening brackets, and remove them once a matching
+ " closing one has been found. If a closing bracket shows up that doesn't
+ " close anything, save it for later.
+ while pos != -1
+ if !s:IsInStringOrComment(a:lnum, pos + 1)
+ if line[pos] == '('
+ call add(opening.parentheses, {'type': '(', 'pos': pos})
+ elseif line[pos] == ')'
+ if empty(opening.parentheses)
+ call add(closing.parentheses, {'type': ')', 'pos': pos})
+ else
+ let opening.parentheses = opening.parentheses[0:-2]
+ endif
+ elseif line[pos] == '{'
+ call add(opening.braces, {'type': '{', 'pos': pos})
+ elseif line[pos] == '}'
+ if empty(opening.braces)
+ call add(closing.braces, {'type': '}', 'pos': pos})
+ else
+ let opening.braces = opening.braces[0:-2]
+ endif
+ elseif line[pos] == '['
+ call add(opening.brackets, {'type': '[', 'pos': pos})
+ elseif line[pos] == ']'
+ if empty(opening.brackets)
+ call add(closing.brackets, {'type': ']', 'pos': pos})
+ else
+ let opening.brackets = opening.brackets[0:-2]
+ endif
+ endif
+ endif
+
+ let pos = match(line, '[][(){}]', pos + 1)
+ endwhile
+
+ " Find the rightmost brackets, since they're the ones that are important in
+ " both opening and closing cases
+ let rightmost_opening = {'type': '(', 'pos': -1}
+ let rightmost_closing = {'type': ')', 'pos': -1}
+
+ for opening in opening.parentheses + opening.braces + opening.brackets
+ if opening.pos > rightmost_opening.pos
+ let rightmost_opening = opening
+ endif
+ endfor
+
+ for closing in closing.parentheses + closing.braces + closing.brackets
+ if closing.pos > rightmost_closing.pos
+ let rightmost_closing = closing
+ endif
+ endfor
+
+ return [rightmost_opening, rightmost_closing]
+endfunction
+
+function! s:Match(lnum, regex) abort
+ 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
+
+" Locates the containing class/module's definition line, ignoring nested classes
+" along the way.
+"
+function! s:FindContainingClass() abort
+ 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
+
+ call setpos('.', saved_position)
+ return 0
+endfunction
+
+" }}}1
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2 ts=8 et:
diff --git a/runtime/indent/rust.vim b/runtime/indent/rust.vim
new file mode 100644
index 0000000..d30629b
--- /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 0000000..bbbbbf0
--- /dev/null
+++ b/runtime/indent/sas.vim
@@ -0,0 +1,140 @@
+" Vim indent file
+" Language: SAS
+" Maintainer: Zhen-Huan Hu <wildkeny@gmail.com>
+" Version: 3.0.3
+" Last Change: 2022 Apr 06
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetSASIndent()
+setlocal indentkeys+=;,=~data,=~proc,=~macro
+
+let b:undo_indent = "setl inde< indk<"
+
+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
new file mode 100644
index 0000000..8c0ecd0
--- /dev/null
+++ b/runtime/indent/sass.vim
@@ -0,0 +1,40 @@
+" Vim indent file
+" Language: Sass
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2022 Mar 15
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent sw=2 et
+setlocal indentexpr=GetSassIndent()
+setlocal indentkeys=o,O,*<Return>,<:>,!^F
+
+let b:undo_indent = "setl ai< inde< indk<"
+
+" Only define the function once.
+if exists("*GetSassIndent")
+ finish
+endif
+
+let s:property = '^\s*:\|^\s*[[:alnum:]#{}-]\+\%(:\|\s*=\)'
+let s:extend = '^\s*\%(@extend\|@include\|+\)'
+
+function! GetSassIndent()
+ let lnum = prevnonblank(v:lnum-1)
+ let line = substitute(getline(lnum),'\s\+$','','')
+ let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','')
+ let lastcol = strlen(line)
+ let line = substitute(line,'^\s\+','','')
+ let indent = indent(lnum)
+ let cindent = indent(v:lnum)
+ if line !~ s:property && line !~ s:extend && cline =~ s:property
+ return indent + shiftwidth()
+ else
+ return -1
+ endif
+endfunction
+
+" vim:set sw=2:
diff --git a/runtime/indent/scala.vim b/runtime/indent/scala.vim
new file mode 100644
index 0000000..b5eba29
--- /dev/null
+++ b/runtime/indent/scala.vim
@@ -0,0 +1,612 @@
+" 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:annotationMatcher = '@[A-Za-z._]\+\s\+'
+let s:modifierMatcher = s:annotationMatcher . '\|\%(private\|protected\)\%(\[[^\]]*\]\)\?\s\+\|abstract\s\+\|override\s\+\|final\s\+'
+let s:defMatcher = '\%(' . s:modifierMatcher . '\)*\<def\>'
+let s:valMatcher = '\%(' . s:modifierMatcher . '\|lazy\s\+\)*\<va[lr]\>'
+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 . '\|' . s:valMatcher . '\).*[=({]\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*' . s:valMatcher . '.*[=]\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
new file mode 100644
index 0000000..496da32
--- /dev/null
+++ b/runtime/indent/scheme.vim
@@ -0,0 +1,14 @@
+" Vim indent file
+" 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/scss.vim b/runtime/indent/scss.vim
new file mode 100644
index 0000000..82bba49
--- /dev/null
+++ b/runtime/indent/scss.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: SCSS
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2010 Jul 26
+
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/css.vim
+
+" vim:set sw=2:
diff --git a/runtime/indent/sdl.vim b/runtime/indent/sdl.vim
new file mode 100644
index 0000000..40fe63f
--- /dev/null
+++ b/runtime/indent/sdl.vim
@@ -0,0 +1,95 @@
+" Vim indent file
+" Language: SDL
+" Maintainer: Michael Piefel <entwurf@piefel.de>
+" Last Change: 2021 Oct 03
+
+" Shamelessly stolen from the Vim-Script indent file
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetSDLIndent()
+setlocal indentkeys+==~end,=~state,*<Return>
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+if exists("*GetSDLIndent")
+" finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+function! GetSDLIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let virtuality = '^\s*\(\(virtual\|redefined\|finalized\)\s\+\)\=\s*'
+
+ " Add a single space to comments which use asterisks
+ if getline(lnum) =~ '^\s*\*'
+ let ind = ind - 1
+ endif
+ if getline(v:lnum) =~ '^\s*\*'
+ let ind = ind + 1
+ endif
+
+ " Add a 'shiftwidth' after states, different blocks, decision (and alternatives), inputs
+ 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 + shiftwidth()
+ endif
+
+ " Subtract a 'shiftwidth' after states
+ if getline(lnum) =~? '^\s*\(stop\|return\>\|nextstate\)'
+ let ind = ind - shiftwidth()
+ endif
+
+ " Subtract a 'shiftwidth' on on end (uncompleted line)
+ if getline(v:lnum) =~? '^\s*end\>'
+ let ind = ind - shiftwidth()
+ endif
+
+ " Put each alternatives where the corresponding decision was
+ if getline(v:lnum) =~? '^\s*\((.*)\|else\):'
+ normal k
+ let ind = indent(searchpair('^\s*decision', '', '^\s*enddecision', 'bW',
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "sdlString"'))
+ endif
+
+ " Put each state where the preceding state was
+ if getline(v:lnum) =~? '^\s*state\>'
+ let ind = indent(search('^\s*start', 'bW'))
+ endif
+
+ " Systems and packages are always in column 0
+ if getline(v:lnum) =~? '^\s*\(\(end\)\=system\|\(end\)\=package\)'
+ return 0
+ endif
+
+ " Put each end* where the corresponding begin was
+ if getline(v:lnum) =~? '^\s*end[[:alpha:]]'
+ normal k
+ let partner=matchstr(getline(v:lnum), '\(' . virtuality . 'end\)\@<=[[:alpha:]]\+')
+ let ind = indent(searchpair(virtuality . partner, '', '^\s*end' . partner, 'bW',
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "sdlString"'))
+ endif
+
+ return ind
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:sw=2
diff --git a/runtime/indent/sh.vim b/runtime/indent/sh.vim
new file mode 100644
index 0000000..aa47c6d
--- /dev/null
+++ b/runtime/indent/sh.vim
@@ -0,0 +1,303 @@
+" Vim indent file
+" Language: Shell Script
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Original Author: Nikolai Weibull <now@bitwi.se>
+" Previous Maintainer: Peter Aronoff <telemachus@arpinum.org>
+" Latest Revision: 2019-10-24
+" License: Vim (see :h license)
+" Repository: https://github.com/chrisbra/vim-sh-indent
+" Changelog:
+" 20190726 - Correctly skip if keywords in syntax comments
+" (issue #17)
+" 20190603 - Do not indent in zsh filetypes with an `if` in comments
+" 20190428 - De-indent fi correctly when typing with
+" https://github.com/chrisbra/vim-sh-indent/issues/15
+" 20190325 - Indent fi; correctly
+" https://github.com/chrisbra/vim-sh-indent/issues/14
+" 20190319 - Indent arrays (only zsh and bash)
+" https://github.com/chrisbra/vim-sh-indent/issues/13
+" 20190316 - Make use of searchpairpos for nested if sections
+" fixes https://github.com/chrisbra/vim-sh-indent/issues/11
+" 20190201 - Better check for closing if sections
+" 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
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetShIndent()
+setlocal indentkeys+=0=then,0=do,0=else,0=elif,0=fi,0=esac,0=done,0=end,),0=;;,0=;&
+setlocal indentkeys+=0=fin,0=fil,0=fip,0=fir,0=fix
+setlocal indentkeys-=:,0#
+setlocal nosmartindent
+
+let b:undo_indent = 'setlocal indentexpr< indentkeys< smartindent<'
+
+if exists("*GetShIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let s:sh_indent_defaults = {
+ \ 'default': function('shiftwidth'),
+ \ 'continuation-line': function('shiftwidth'),
+ \ 'case-labels': function('shiftwidth'),
+ \ 'case-statements': function('shiftwidth'),
+ \ 'case-breaks': 0 }
+
+function! s:indent_value(option)
+ let Value = exists('b:sh_indent_options')
+ \ && has_key(b:sh_indent_options, a:option) ?
+ \ b:sh_indent_options[a:option] :
+ \ s:sh_indent_defaults[a:option]
+ if type(Value) == type(function('type'))
+ return Value()
+ endif
+ return Value
+endfunction
+
+function! GetShIndent()
+ let curline = getline(v:lnum)
+ let lnum = prevnonblank(v:lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+ let line = getline(lnum)
+
+ let pnum = prevnonblank(lnum - 1)
+ let pline = getline(pnum)
+ let ind = indent(lnum)
+
+ " Check contents of previous lines
+ " should not apply to e.g. commented lines
+ if line =~ '^\s*\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>' ||
+ \ (&ft is# 'zsh' && line =~ '^\s*\<\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>')
+ if !s:is_end_expression(line)
+ let ind += s:indent_value('default')
+ endif
+ elseif s:is_case_label(line, pnum)
+ if !s:is_case_ended(line)
+ let ind += s:indent_value('case-statements')
+ endif
+ " function definition
+ elseif s:is_function_definition(line)
+ if line !~ '}\s*\%(#.*\)\=$'
+ let ind += s:indent_value('default')
+ endif
+ " array (only works for zsh or bash)
+ elseif s:is_array(line) && line !~ ')\s*$' && (&ft is# 'zsh' || s:is_bash())
+ let ind += s:indent_value('continuation-line')
+ " end of array
+ elseif curline =~ '^\s*)$'
+ let ind -= s:indent_value('continuation-line')
+ elseif s:is_continuation_line(line)
+ if pnum == 0 || !s:is_continuation_line(pline)
+ let ind += s:indent_value('continuation-line')
+ endif
+ elseif s:end_block(line) && !s:start_block(line)
+ let ind = indent(lnum)
+ elseif pnum != 0 &&
+ \ s:is_continuation_line(pline) &&
+ \ !s:end_block(curline) &&
+ \ !s:is_end_expression(curline)
+ " 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 = curline
+ " Current line is a endif line, so get indent from start of "if condition" line
+ " TODO: should we do the same for other "end" lines?
+ if curline =~ '^\s*\%(fi\);\?\s*\%(#.*\)\=$'
+ let ind = indent(v:lnum)
+ let previous_line = searchpair('\<if\>', '', '\<fi\>\zs', 'bnW', 'synIDattr(synID(line("."),col("."), 1),"name") =~? "comment\\|quote"')
+ if previous_line > 0
+ let ind = indent(previous_line)
+ endif
+ elseif line =~ '^\s*\%(then\|do\|else\|elif\|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')
+ elseif line =~ '^\s*esac\>'
+ let ind -= (s:is_case_label(pine, lnum) && s:is_case_ended(pine) ?
+ \ 0 : s:indent_value('case-statements')) +
+ \ s:indent_value('case-labels')
+ if s:is_case_break(pine)
+ let ind += s:indent_value('case-breaks')
+ endif
+ elseif s:is_case_label(line, lnum)
+ if s:is_case(pine)
+ let ind = indent(lnum) + s:indent_value('case-labels')
+ else
+ let ind -= (s:is_case_label(pine, lnum) && s:is_case_ended(pine) ?
+ \ 0 : s:indent_value('case-statements')) -
+ \ s:indent_value('case-breaks')
+ 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 > 0 ? ind : 0
+endfunction
+
+function! s:is_continuation_line(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)
+ let i = a:lnum
+ while i > 1 && s:is_continuation_line(getline(i - 1))
+ let i -= 1
+ endwhile
+ return i
+endfunction
+
+function! s:is_function_definition(line)
+ return a:line =~ '^\s*\<\k\+\>\s*()\s*{' ||
+ \ a:line =~ '^\s*{' ||
+ \ a:line =~ '^\s*function\s*\k\+\s*\%(()\)\?\s*{'
+endfunction
+
+function! s:is_array(line)
+ return a:line =~ '^\s*\<\k\+\>=('
+endfunction
+
+function! s:is_case_label(line, pnum)
+ if a:line !~ '^\s*(\=.*)'
+ return 0
+ endif
+
+ if a:pnum > 0
+ let pine = getline(a:pnum)
+ if !(s:is_case(pine) || s:is_case_ended(pine))
+ return 0
+ endif
+ endif
+
+ let suffix = substitute(a:line, '^\s*(\=', "", "")
+ let nesting = 0
+ let i = 0
+ let n = strlen(suffix)
+ while i < n
+ let c = suffix[i]
+ let i += 1
+ if c == '\\'
+ let i += 1
+ elseif c == '('
+ let nesting += 1
+ elseif c == ')'
+ if nesting == 0
+ return 1
+ endif
+ let nesting -= 1
+ endif
+ endwhile
+ return 0
+endfunction
+
+function! s:is_case(line)
+ return a:line =~ '^\s*case\>'
+endfunction
+
+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
+
+function! s:is_case_empty(line)
+ if a:line =~ '^\s*$' || a:line =~ '^\s*#'
+ return s:is_case_empty(getline(v:lnum - 1))
+ else
+ return a:line =~ '^\s*case\>'
+ 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
+
+function! s:is_end_expression(line)
+ return a:line =~ '\<\%(fi\|esac\|done\|end\)\>\s*\%(#.*\)\=$'
+endfunction
+
+function! s:is_bash()
+ return get(g:, 'is_bash', 0) || get(b:, 'is_bash', 0)
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/sml.vim b/runtime/indent/sml.vim
new file mode 100644
index 0000000..a0b0c3e
--- /dev/null
+++ b/runtime/indent/sml.vim
@@ -0,0 +1,220 @@
+" Vim indent file
+" Language: SML
+" Maintainer: Saikat Guha <sg266@cornell.edu>
+" Hubert Chao <hc85@cornell.edu>
+" Original OCaml Version:
+" Jean-Francois Yuen <jfyuen@ifrance.com>
+" Mike Leary <leary@nwlink.com>
+" Markus Mottl <markus@oefai.at>
+" OCaml URL: http://www.oefai.at/~markus/vim/indent/ocaml.vim
+" Last Change: 2022 Apr 06
+" 2002 Nov 06 - Some fixes (JY)
+" 2002 Oct 28 - Fixed bug with indentation of ']' (MM)
+" 2002 Oct 22 - Major rewrite (JY)
+" 2022 April: b:undo_indent added by Doug Kearns
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal expandtab
+setlocal indentexpr=GetSMLIndent()
+setlocal indentkeys+=0=and,0=else,0=end,0=handle,0=if,0=in,0=let,0=then,0=val,0=fun,0=\|,0=*),0)
+setlocal nolisp
+setlocal nosmartindent
+setlocal textwidth=80
+setlocal shiftwidth=2
+
+let b:undo_indent = "setl et< inde< indk< lisp< si< sw< tw<"
+
+" Comment formatting
+if (has("comments"))
+ set comments=sr:(*,mb:*,ex:*)
+ set fo=cqort
+endif
+
+" Only define the function once.
+"if exists("*GetSMLIndent")
+"finish
+"endif
+
+" Define some patterns:
+let s:beflet = '^\s*\(initializer\|method\|try\)\|\(\<\(begin\|do\|else\|in\|then\|try\)\|->\|;\)\s*$'
+let s:letpat = '^\s*\(let\|type\|module\|class\|open\|exception\|val\|include\|external\)\>'
+let s:letlim = '\(\<\(sig\|struct\)\|;;\)\s*$'
+let s:lim = '^\s*\(exception\|external\|include\|let\|module\|open\|type\|val\)\>'
+let s:module = '\<\%(let\|sig\|struct\)\>'
+let s:obj = '^\s*\(constraint\|inherit\|initializer\|method\|val\)\>\|\<\(object\|object\s*(.*)\)\s*$'
+let s:type = '^\s*\%(let\|type\)\>.*='
+let s:val = '^\s*\(val\|external\)\>.*:'
+
+" Skipping pattern, for comments
+function! s:SkipPattern(lnum, pat)
+ let def = prevnonblank(a:lnum - 1)
+ while def > 0 && getline(def) =~ a:pat
+ let def = prevnonblank(def - 1)
+ endwhile
+ return def
+endfunction
+
+" Indent for ';;' to match multiple 'let'
+function! s:GetInd(lnum, pat, lim)
+ let llet = search(a:pat, 'bW')
+ let old = indent(a:lnum)
+ while llet > 0
+ let old = indent(llet)
+ let nb = s:SkipPattern(llet, '^\s*(\*.*\*)\s*$')
+ if getline(nb) =~ a:lim
+ return old
+ endif
+ let llet = search(a:pat, 'bW')
+ endwhile
+ return old
+endfunction
+
+" Indent pairs
+function! s:FindPair(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+" return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+ let lno = searchpair(a:pstart, a:pmid, a:pend, 'bW', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')
+ if lno == -1
+ return indent(lno)
+ else
+ return col(".") - 1
+ endif
+endfunction
+
+function! s:FindLet(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+" return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+ let lno = searchpair(a:pstart, a:pmid, a:pend, 'bW', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')
+ let moduleLine = getline(lno)
+ if lno == -1 || moduleLine =~ '^\s*\(fun\|structure\|signature\)\>'
+ return indent(lno)
+ else
+ return col(".") - 1
+ endif
+endfunction
+
+" Indent 'let'
+"function! s:FindLet(pstart, pmid, pend)
+" call search(a:pend, 'bW')
+" return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "^\\s*let\\>.*=.*\\<in\\s*$" || getline(prevnonblank(".") - 1) =~ "^\\s*let\\>.*=\\s*$\\|" . s:beflet'))
+"endfunction
+
+function! GetSMLIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let lline = getline(lnum)
+
+ " Return double 'shiftwidth' after lines matching:
+ if lline =~ '^\s*|.*=>\s*$'
+ return ind + 2 *shiftwidth()
+ elseif lline =~ '^\s*val\>.*=\s*$'
+ return ind + shiftwidth()
+ endif
+
+ let line = getline(v:lnum)
+
+ " Indent lines starting with 'end' to matching module
+ if line =~ '^\s*end\>'
+ return s:FindLet(s:module, '', '\<end\>')
+
+ " Match 'else' with 'if'
+ elseif line =~ '^\s*else\>'
+ if lline !~ '^\s*\(if\|else\|then\)\>'
+ return s:FindPair('\<if\>', '', '\<then\>')
+ else
+ return ind
+ endif
+
+ " Match 'then' with 'if'
+ elseif line =~ '^\s*then\>'
+ if lline !~ '^\s*\(if\|else\|then\)\>'
+ return s:FindPair('\<if\>', '', '\<then\>')
+ else
+ return ind
+ endif
+
+ " Indent if current line begins with ']'
+ elseif line =~ '^\s*\]'
+ return s:FindPair('\[','','\]')
+
+ " Indent current line starting with 'in' to last matching 'let'
+ elseif line =~ '^\s*in\>'
+ let ind = s:FindLet('\<let\>','','\<in\>')
+
+ " Indent from last matching module if line matches:
+ elseif line =~ '^\s*\(fun\|val\|open\|structure\|and\|datatype\|type\|exception\)\>'
+ cursor(lnum,1)
+ let lastModule = indent(searchpair(s:module, '', '\<end\>', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+ if lastModule == -1
+ return 0
+ else
+ return lastModule + shiftwidth()
+ endif
+
+ " Indent lines starting with '|' from matching 'case', 'handle'
+ elseif line =~ '^\s*|'
+ " cursor(lnum,1)
+ let lastSwitch = search('\<\(case\|handle\|fun\|datatype\)\>','bW')
+ let switchLine = getline(lastSwitch)
+ let switchLineIndent = indent(lastSwitch)
+ if lline =~ '^\s*|'
+ return ind
+ endif
+ if switchLine =~ '\<case\>'
+ return col(".") + 2
+ elseif switchLine =~ '\<handle\>'
+ return switchLineIndent + shiftwidth()
+ elseif switchLine =~ '\<datatype\>'
+ call search('=')
+ return col(".") - 1
+ else
+ return switchLineIndent + 2
+ endif
+
+
+ " Indent if last line ends with 'sig', 'struct', 'let', 'then', 'else',
+ " 'in'
+ elseif lline =~ '\<\(sig\|struct\|let\|in\|then\|else\)\s*$'
+ let ind = ind + shiftwidth()
+
+ " Indent if last line ends with 'of', align from 'case'
+ elseif lline =~ '\<\(of\)\s*$'
+ call search('\<case\>',"bW")
+ let ind = col(".")+4
+
+ " Indent if current line starts with 'of'
+ elseif line =~ '^\s*of\>'
+ call search('\<case\>',"bW")
+ let ind = col(".")+1
+
+
+ " Indent if last line starts with 'fun', 'case', 'fn'
+ elseif lline =~ '^\s*\(fun\|fn\|case\)\>'
+ 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 - shiftwidth()
+ endif
+ endif
+
+ return ind
+
+endfunction
+
+" vim:sw=2
diff --git a/runtime/indent/solidity.vim b/runtime/indent/solidity.vim
new file mode 100644
index 0000000..caed726
--- /dev/null
+++ b/runtime/indent/solidity.vim
@@ -0,0 +1,442 @@
+" Vim indent file
+" Language: Solidity
+" Acknowledgement: Based off of vim-javascript
+" Maintainer: Cothi (jiungdev@gmail.com)
+" Original Author: tomlion (https://github.com/tomlion/vim-solidity)
+" Last Changed: 2022 Sep 27
+"
+" 0. Initialization {{{1
+" =================
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+
+" Now, set up our indentation expression and keys that trigger it.
+setlocal indentexpr=GetSolidityIndent()
+setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e
+
+" Only define the function once.
+if exists("*GetSolidityIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" 1. Variables {{{1
+" ============
+
+let s:js_keywords = '^\s*\(break\|case\|catch\|continue\|debugger\|default\|delete\|do\|else\|finally\|for\|function\|if\|in\|instanceof\|new\|return\|switch\|this\|throw\|try\|typeof\|var\|void\|while\|with\)'
+
+" Regex of syntax group names that are or delimit string or are comments.
+let s:syng_strcom = 'string\|regex\|comment\c'
+
+" Regex of syntax group names that are strings.
+let s:syng_string = 'regex\c'
+
+" Regex of syntax group names that are strings or documentation.
+let s:syng_multiline = 'comment\c'
+
+" Regex of syntax group names that are line comment.
+let s:syng_linecom = 'linecomment\c'
+
+" Expression used to check whether we should skip a match with searchpair().
+let s:skip_expr = "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'"
+
+let s:line_term = '\s*\%(\%(\/\/\).*\)\=$'
+
+" Regex that defines continuation lines, not including (, {, or [.
+let s:continuation_regex = '\%([\\*+/.:]\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)' . s:line_term
+
+" Regex that defines continuation lines.
+" TODO: this needs to deal with if ...: and so on
+let s:msl_regex = '\%([\\*+/.:([]\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)' . s:line_term
+
+let s:one_line_scope_regex = '\<\%(if\|else\|for\|while\)\>[^{;]*' . s:line_term
+
+" Regex that defines blocks.
+let s:block_regex = '\%([{[]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term
+
+let s:var_stmt = '^\s*var'
+
+let s:comma_first = '^\s*,'
+let s:comma_last = ',\s*$'
+
+let s:ternary = '^\s\+[?|:]'
+let s:ternary_q = '^\s\+?'
+
+" 2. Auxiliary Functions {{{1
+" ======================
+
+" Check if the character at lnum:col is inside a string, comment, or is ascii.
+function s:IsInStringOrComment(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
+endfunction
+
+" Check if the character at lnum:col is inside a string.
+function s:IsInString(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string
+endfunction
+
+" Check if the character at lnum:col is inside a multi-line comment.
+function s:IsInMultilineComment(lnum, col)
+ return !s:IsLineComment(a:lnum, a:col) && synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_multiline
+endfunction
+
+" Check if the character at lnum:col is a line comment.
+function s:IsLineComment(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_linecom
+endfunction
+
+" Find line above 'lnum' that isn't empty, in a comment, or in a string.
+function s:PrevNonBlankNonString(lnum)
+ let in_block = 0
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ " Go in and out of blocks comments as necessary.
+ " If the line isn't empty (with opt. comment) or in a string, end search.
+ let line = getline(lnum)
+ if line =~ '/\*'
+ if in_block
+ let in_block = 0
+ else
+ break
+ endif
+ elseif !in_block && line =~ '\*/'
+ let in_block = 1
+ elseif !in_block && line !~ '^\s*\%(//\).*$' && !(s:IsInStringOrComment(lnum, 1) && s:IsInStringOrComment(lnum, strlen(line)))
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+" Find line above 'lnum' that started the continuation 'lnum' may be part of.
+function s:GetMSL(lnum, in_one_line_scope)
+ " Start on the line we're at and use its indent.
+ let msl = a:lnum
+ let lnum = s:PrevNonBlankNonString(a:lnum - 1)
+ while lnum > 0
+ " If we have a continuation line, or we're in a string, use line as MSL.
+ " Otherwise, terminate search as we have found our MSL already.
+ let line = getline(lnum)
+ let col = match(line, s:msl_regex) + 1
+ if (col > 0 && !s:IsInStringOrComment(lnum, col)) || s:IsInString(lnum, strlen(line))
+ let msl = lnum
+ else
+ " Don't use lines that are part of a one line scope as msl unless the
+ " flag in_one_line_scope is set to 1
+ "
+ if a:in_one_line_scope
+ break
+ end
+ let msl_one_line = s:Match(lnum, s:one_line_scope_regex)
+ if msl_one_line == 0
+ break
+ endif
+ endif
+ let lnum = s:PrevNonBlankNonString(lnum - 1)
+ endwhile
+ return msl
+endfunction
+
+function s:RemoveTrailingComments(content)
+ let single = '\/\/\(.*\)\s*$'
+ let multi = '\/\*\(.*\)\*\/\s*$'
+ return substitute(substitute(a:content, single, '', ''), multi, '', '')
+endfunction
+
+" Find if the string is inside var statement (but not the first string)
+function s:InMultiVarStatement(lnum)
+ let lnum = s:PrevNonBlankNonString(a:lnum - 1)
+
+" let type = synIDattr(synID(lnum, indent(lnum) + 1, 0), 'name')
+
+ " loop through previous expressions to find a var statement
+ while lnum > 0
+ let line = getline(lnum)
+
+ " if the line is a js keyword
+ if (line =~ s:js_keywords)
+ " check if the line is a var stmt
+ " if the line has a comma first or comma last then we can assume that we
+ " are in a multiple var statement
+ if (line =~ s:var_stmt)
+ return lnum
+ endif
+
+ " other js keywords, not a var
+ return 0
+ endif
+
+ let lnum = s:PrevNonBlankNonString(lnum - 1)
+ endwhile
+
+ " beginning of program, not a var
+ return 0
+endfunction
+
+" Find line above with beginning of the var statement or returns 0 if it's not
+" this statement
+function s:GetVarIndent(lnum)
+ let lvar = s:InMultiVarStatement(a:lnum)
+ let prev_lnum = s:PrevNonBlankNonString(a:lnum - 1)
+
+ if lvar
+ let line = s:RemoveTrailingComments(getline(prev_lnum))
+
+ " if the previous line doesn't end in a comma, return to regular indent
+ if (line !~ s:comma_last)
+ return indent(prev_lnum) - &sw
+ else
+ return indent(lvar) + &sw
+ endif
+ endif
+
+ return -1
+endfunction
+
+
+" Check if line 'lnum' has more opening brackets than closing ones.
+function s:LineHasOpeningBrackets(lnum)
+ let open_0 = 0
+ let open_2 = 0
+ let open_4 = 0
+ let line = getline(a:lnum)
+ let pos = match(line, '[][(){}]', 0)
+ while pos != -1
+ if !s:IsInStringOrComment(a:lnum, pos + 1)
+ let idx = stridx('(){}[]', line[pos])
+ if idx % 2 == 0
+ let open_{idx} = open_{idx} + 1
+ else
+ let open_{idx - 1} = open_{idx - 1} - 1
+ endif
+ endif
+ let pos = match(line, '[][(){}]', pos + 1)
+ endwhile
+ return (open_0 > 0) . (open_2 > 0) . (open_4 > 0)
+endfunction
+
+function s:Match(lnum, regex)
+ let col = match(getline(a:lnum), a:regex) + 1
+ return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0
+endfunction
+
+function s:IndentWithContinuation(lnum, ind, width)
+ " Set up variables to use and search for MSL to the previous line.
+ let p_lnum = a:lnum
+ let lnum = s:GetMSL(a:lnum, 1)
+ let line = getline(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 p_lnum != lnum
+ if s:Match(p_lnum,s:continuation_regex)||s:IsInString(p_lnum,strlen(line))
+ return a:ind
+ endif
+ endif
+
+ " Set up more variables now that we know we aren't continuation bound.
+ let msl_ind = indent(lnum)
+
+ " If the previous line ended with [*+/.-=], start a continuation that
+ " indents an extra level.
+ if s:Match(lnum, s:continuation_regex)
+ if lnum == p_lnum
+ return msl_ind + a:width
+ else
+ return msl_ind
+ endif
+ endif
+
+ return a:ind
+endfunction
+
+function s:InOneLineScope(lnum)
+ let msl = s:GetMSL(a:lnum, 1)
+ if msl > 0 && s:Match(msl, s:one_line_scope_regex)
+ return msl
+ endif
+ return 0
+endfunction
+
+function s:ExitingOneLineScope(lnum)
+ let msl = s:GetMSL(a:lnum, 1)
+ if msl > 0
+ " if the current line is in a one line scope ..
+ if s:Match(msl, s:one_line_scope_regex)
+ return 0
+ else
+ let prev_msl = s:GetMSL(msl - 1, 1)
+ if s:Match(prev_msl, s:one_line_scope_regex)
+ return prev_msl
+ endif
+ endif
+ endif
+ return 0
+endfunction
+
+" 3. GetSolidityIndent Function {{{1
+" =========================
+
+function GetSolidityIndent()
+ " 3.1. Setup {{{2
+ " ----------
+
+ " Set up variables for restoring position in file. Could use v:lnum here.
+ let vcol = col('.')
+
+ " 3.2. Work on the current line {{{2
+ " -----------------------------
+
+ let ind = -1
+ " Get the current line.
+ let line = getline(v:lnum)
+ " previous nonblank line number
+ let prevline = prevnonblank(v:lnum - 1)
+
+ " 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.
+ let col = matchend(line, '^\s*[],})]')
+ if col > 0 && !s:IsInStringOrComment(v:lnum, col)
+ call cursor(v:lnum, col)
+
+ let lvar = s:InMultiVarStatement(v:lnum)
+ if lvar
+ let prevline_contents = s:RemoveTrailingComments(getline(prevline))
+
+ " check for comma first
+ if (line[col - 1] =~ ',')
+ " if the previous line ends in comma or semicolon don't indent
+ if (prevline_contents =~ '[;,]\s*$')
+ return indent(s:GetMSL(line('.'), 0))
+ " get previous line indent, if it's comma first return prevline indent
+ elseif (prevline_contents =~ s:comma_first)
+ return indent(prevline)
+ " otherwise we indent 1 level
+ else
+ return indent(lvar) + &sw
+ endif
+ endif
+ endif
+
+
+ let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2)
+ if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0
+ if line[col-1]==')' && col('.') != col('$') - 1
+ let ind = virtcol('.')-1
+ else
+ let ind = indent(s:GetMSL(line('.'), 0))
+ endif
+ endif
+ return ind
+ endif
+
+ " If the line is comma first, dedent 1 level
+ if (getline(prevline) =~ s:comma_first)
+ return indent(prevline) - &sw
+ endif
+
+ if (line =~ s:ternary)
+ if (getline(prevline) =~ s:ternary_q)
+ return indent(prevline)
+ else
+ return indent(prevline) + &sw
+ endif
+ endif
+
+ " If we are in a multi-line comment, cindent does the right thing.
+ if s:IsInMultilineComment(v:lnum, 1) && !s:IsLineComment(v:lnum, 1)
+ return cindent(v:lnum)
+ endif
+
+ " Check for multiple var assignments
+" let var_indent = s:GetVarIndent(v:lnum)
+" if var_indent >= 0
+" return var_indent
+" endif
+
+ " 3.3. Work on the previous line. {{{2
+ " -------------------------------
+
+ " If the line is empty and the previous nonblank line was a multi-line
+ " comment, use that comment's indent. Deduct one char to account for the
+ " space in ' */'.
+ if line =~ '^\s*$' && s:IsInMultilineComment(prevline, 1)
+ return indent(prevline) - 1
+ endif
+
+ " Find a non-blank, non-multi-line string line above the current line.
+ let lnum = s:PrevNonBlankNonString(v:lnum - 1)
+
+ " If the line is empty and inside a string, use the previous line.
+ if line =~ '^\s*$' && lnum != prevline
+ return indent(prevnonblank(v:lnum))
+ endif
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Set up variables for current line.
+ let line = getline(lnum)
+ let ind = indent(lnum)
+
+ " 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, 0)) + &sw
+ endif
+
+ " If the previous line contained an opening bracket, and we are still in it,
+ " add indent depending on the bracket type.
+ if line =~ '[[({]'
+ let counts = s:LineHasOpeningBrackets(lnum)
+ if counts[0] == '1' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
+ if col('.') + 1 == col('$')
+ return ind + &sw
+ else
+ return virtcol('.')
+ endif
+ elseif counts[1] == '1' || counts[2] == '1'
+ return ind + &sw
+ else
+ call cursor(v:lnum, vcol)
+ end
+ endif
+
+ " 3.4. Work on the MSL line. {{{2
+ " --------------------------
+
+ let ind_con = ind
+ let ind = s:IndentWithContinuation(lnum, ind_con, &sw)
+
+ " }}}2
+ "
+ "
+ let ols = s:InOneLineScope(lnum)
+ if ols > 0
+ let ind = ind + &sw
+ else
+ let ols = s:ExitingOneLineScope(lnum)
+ while ols > 0 && ind > 0
+ let ind = ind - &sw
+ let ols = s:InOneLineScope(ols - 1)
+ endwhile
+ endif
+
+ return ind
+endfunction
+
+" }}}1
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/sql.vim b/runtime/indent/sql.vim
new file mode 100644
index 0000000..4f82b96
--- /dev/null
+++ b/runtime/indent/sql.vim
@@ -0,0 +1,39 @@
+" Vim indent file loader
+" Language: SQL
+" Maintainer: David Fishburn <fishburn at ianywhere dot com>
+" Last Change: Thu Sep 15 2005 10:27:51 AM
+" Version: 1.0
+" Download: http://vim.sourceforge.net/script.php?script_id=495
+
+" Description: Checks for a:
+" buffer local variable,
+" global variable,
+" If the above exist, it will source the type specified.
+" If none exist, it will source the default sqlanywhere.vim file.
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Default to the standard Vim distribution file
+let filename = 'sqlanywhere'
+
+" Check for overrides. Buffer variables have the highest priority.
+if exists("b:sql_type_override")
+ " Check the runtimepath to see if the file exists
+ if globpath(&runtimepath, 'indent/'.b:sql_type_override.'.vim') != ''
+ let filename = b:sql_type_override
+ endif
+elseif exists("g:sql_type_default")
+ if globpath(&runtimepath, 'indent/'.g:sql_type_default.'.vim') != ''
+ let filename = g:sql_type_default
+ endif
+endif
+
+" Source the appropriate file
+exec 'runtime indent/'.filename.'.vim'
+
+
+" vim:sw=4:
diff --git a/runtime/indent/sqlanywhere.vim b/runtime/indent/sqlanywhere.vim
new file mode 100644
index 0000000..4772b59
--- /dev/null
+++ b/runtime/indent/sqlanywhere.vim
@@ -0,0 +1,399 @@
+" Vim indent file
+" Language: SQL
+" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
+" Last Change: 2021 Oct 11
+" Version: 4.0
+" Download: http://vim.sourceforge.net/script.php?script_id=495
+
+" Notes:
+" Indenting keywords are based on Oracle and Sybase Adaptive Server
+" Anywhere (ASA). Test indenting was done with ASA stored procedures and
+" functions and Oracle packages which contain stored procedures and
+" functions.
+" This has not been tested against Microsoft SQL Server or
+" Sybase Adaptive Server Enterprise (ASE) which use the Transact-SQL
+" syntax. That syntax does not have end tags for IF's, which makes
+" indenting more difficult.
+"
+" Known Issues:
+" The Oracle MERGE statement does not have an end tag associated with
+" it, this can leave the indent hanging to the right one too many.
+"
+" History:
+" 4.0 (Oct 2021)
+" Added b:undo_indent
+"
+" 3.0 (Dec 2012)
+" Added cpo check
+"
+" 2.0
+" Added the FOR keyword to SQLBlockStart to handle (Alec Tica):
+" for i in 1..100 loop
+" |<-- I expect to have indentation here
+" end loop;
+"
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+let b:current_indent = "sqlanywhere"
+
+setlocal indentkeys-=0{
+setlocal indentkeys-=0}
+setlocal indentkeys-=:
+setlocal indentkeys-=0#
+setlocal indentkeys-=e
+
+" This indicates formatting should take place when one of these
+" expressions is used. These expressions would normally be something
+" you would type at the BEGINNING of a line
+" SQL is generally case insensitive, so this files assumes that
+" These keywords are something that would trigger an indent LEFT, not
+" an indent right, since the SQLBlockStart is used for those keywords
+setlocal indentkeys+==~end,=~else,=~elseif,=~elsif,0=~when,0=)
+
+" GetSQLIndent is executed whenever one of the expressions
+" in the indentkeys is typed
+setlocal indentexpr=GetSQLIndent()
+
+let b:undo_indent = "setl indentexpr< indentkeys<"
+
+" Only define the functions once.
+if exists("*GetSQLIndent")
+ finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+" List of all the statements that start a new block.
+" These are typically words that start a line.
+" IS is excluded, since it is difficult to determine when the
+" ending block is (especially for procedures/functions).
+let s:SQLBlockStart = '^\s*\%('.
+ \ 'if\|else\|elseif\|elsif\|'.
+ \ 'while\|loop\|do\|for\|'.
+ \ 'begin\|'.
+ \ 'case\|when\|merge\|exception'.
+ \ '\)\>'
+let s:SQLBlockEnd = '^\s*\(end\)\>'
+
+" The indent level is also based on unmatched parentheses
+" If a line has an extra "(" increase the indent
+" If a line has an extra ")" decrease the indent
+function! s:CountUnbalancedParen( line, paren_to_check )
+ let l = a:line
+ let lp = substitute(l, '[^(]', '', 'g')
+ let l = a:line
+ let rp = substitute(l, '[^)]', '', 'g')
+
+ if a:paren_to_check =~ ')'
+ " echom 'CountUnbalancedParen ) returning: ' .
+ " \ (strlen(rp) - strlen(lp))
+ return (strlen(rp) - strlen(lp))
+ elseif a:paren_to_check =~ '('
+ " echom 'CountUnbalancedParen ( returning: ' .
+ " \ (strlen(lp) - strlen(rp))
+ return (strlen(lp) - strlen(rp))
+ else
+ " echom 'CountUnbalancedParen unknown paren to check: ' .
+ " \ a:paren_to_check
+ return 0
+ endif
+endfunction
+
+" Unindent commands based on previous indent level
+function! s:CheckToIgnoreRightParen( prev_lnum, num_levels )
+ let lnum = a:prev_lnum
+ let line = getline(lnum)
+ let ends = 0
+ let num_right_paren = a:num_levels
+ let ignore_paren = 0
+ let vircol = 1
+
+ while num_right_paren > 0
+ silent! exec 'norm! '.lnum."G\<bar>".vircol."\<bar>"
+ let right_paren = search( ')', 'W' )
+ if right_paren != lnum
+ " This should not happen since there should be at least
+ " num_right_paren matches for this line
+ break
+ endif
+ let vircol = virtcol(".")
+
+ " if getline(".") =~ '^)'
+ let matching_paren = searchpair('(', '', ')', 'bW',
+ \ 's:IsColComment(line("."), col("."))')
+
+ if matching_paren < 1
+ " No match found
+ " echom 'CTIRP - no match found, ignoring'
+ break
+ endif
+
+ if matching_paren == lnum
+ " This was not an unmatched parentheses, start the search again
+ " again after this column
+ " echom 'CTIRP - same line match, ignoring'
+ continue
+ endif
+
+ " echom 'CTIRP - match: ' . line(".") . ' ' . getline(".")
+
+ if getline(matching_paren) =~? '\(if\|while\)\>'
+ " echom 'CTIRP - if/while ignored: ' . line(".") . ' ' . getline(".")
+ let ignore_paren = ignore_paren + 1
+ endif
+
+ " One match found, decrease and check for further matches
+ let num_right_paren = num_right_paren - 1
+
+ endwhile
+
+ " Fallback - just move back one
+ " return a:prev_indent - shiftwidth()
+ return ignore_paren
+endfunction
+
+" Based on the keyword provided, loop through previous non empty
+" non comment lines to find the statement that initiated the keyword.
+" Return its indent level
+" CASE ..
+" WHEN ...
+" Should return indent level of CASE
+" EXCEPTION ..
+" WHEN ...
+" something;
+" WHEN ...
+" Should return indent level of exception.
+function! s:GetStmtStarterIndent( keyword, curr_lnum )
+ let lnum = a:curr_lnum
+
+ " Default - reduce indent by 1
+ let ind = indent(a:curr_lnum) - shiftwidth()
+
+ if a:keyword =~? 'end'
+ exec 'normal! ^'
+ let stmts = '^\s*\%('.
+ \ '\<begin\>\|' .
+ \ '\%(\%(\<end\s\+\)\@<!\<loop\>\)\|' .
+ \ '\%(\%(\<end\s\+\)\@<!\<case\>\)\|' .
+ \ '\%(\%(\<end\s\+\)\@<!\<for\>\)\|' .
+ \ '\%(\%(\<end\s\+\)\@<!\<if\>\)'.
+ \ '\)'
+ let matching_lnum = searchpair(stmts, '', '\<end\>\zs', 'bW',
+ \ 's:IsColComment(line("."), col(".")) == 1')
+ exec 'normal! $'
+ if matching_lnum > 0 && matching_lnum < a:curr_lnum
+ let ind = indent(matching_lnum)
+ endif
+ elseif a:keyword =~? 'when'
+ exec 'normal! ^'
+ let matching_lnum = searchpair(
+ \ '\%(\<end\s\+\)\@<!\<case\>\|\<exception\>\|\<merge\>',
+ \ '',
+ \ '\%(\%(\<when\s\+others\>\)\|\%(\<end\s\+case\>\)\)',
+ \ 'bW',
+ \ 's:IsColComment(line("."), col(".")) == 1')
+ exec 'normal! $'
+ if matching_lnum > 0 && matching_lnum < a:curr_lnum
+ let ind = indent(matching_lnum)
+ else
+ let ind = indent(a:curr_lnum)
+ endif
+ endif
+
+ return ind
+endfunction
+
+
+" Check if the line is a comment
+function! s:IsLineComment(lnum)
+ let rc = synIDattr(
+ \ synID(a:lnum,
+ \ match(getline(a:lnum), '\S')+1, 0)
+ \ , "name")
+ \ =~? "comment"
+
+ return rc
+endfunction
+
+
+" Check if the column is a comment
+function! s:IsColComment(lnum, cnum)
+ let rc = synIDattr(synID(a:lnum, a:cnum, 0), "name")
+ \ =~? "comment"
+
+ return rc
+endfunction
+
+
+" Instead of returning a column position, return
+" an appropriate value as a factor of shiftwidth.
+function! s:ModuloIndent(ind)
+ let ind = a:ind
+
+ if ind > 0
+ let modulo = ind % shiftwidth()
+
+ if modulo > 0
+ let ind = ind - modulo
+ endif
+ endif
+
+ return ind
+endfunction
+
+
+" Find correct indent of a new line based upon the previous line
+function! GetSQLIndent()
+ let lnum = v:lnum
+ let ind = indent(lnum)
+
+ " If the current line is a comment, leave the indent as is
+ " Comment out this additional check since it affects the
+ " indenting of =, and will not reindent comments as it should
+ " if s:IsLineComment(lnum) == 1
+ " return ind
+ " endif
+
+ " Get previous non-blank line
+ let prevlnum = prevnonblank(lnum - 1)
+ if prevlnum <= 0
+ return ind
+ endif
+
+ if s:IsLineComment(prevlnum) == 1
+ if getline(v:lnum) =~ '^\s*\*'
+ let ind = s:ModuloIndent(indent(prevlnum))
+ return ind + 1
+ endif
+ " If the previous line is a comment, then return -1
+ " to tell Vim to use the formatoptions setting to determine
+ " the indent to use
+ " But only if the next line is blank. This would be true if
+ " the user is typing, but it would not be true if the user
+ " is reindenting the file
+ if getline(v:lnum) =~ '^\s*$'
+ return -1
+ endif
+ endif
+
+ " echom 'PREVIOUS INDENT: ' . indent(prevlnum) . ' LINE: ' . getline(prevlnum)
+
+ " This is the line you just hit return on, it is not the current line
+ " which is new and empty
+ " Based on this line, we can determine how much to indent the new
+ " line
+
+ " Get default indent (from prev. line)
+ let ind = indent(prevlnum)
+ let prevline = getline(prevlnum)
+
+ " Now check what's on the previous line to determine if the indent
+ " should be changed, for example IF, BEGIN, should increase the indent
+ " where END IF, END, should decrease the indent.
+ if prevline =~? s:SQLBlockStart
+ " Move indent in
+ let ind = ind + shiftwidth()
+ " echom 'prevl - SQLBlockStart - indent ' . ind . ' line: ' . prevline
+ elseif prevline =~ '[()]'
+ if prevline =~ '('
+ let num_unmatched_left = s:CountUnbalancedParen( prevline, '(' )
+ else
+ let num_unmatched_left = 0
+ endif
+ if prevline =~ ')'
+ let num_unmatched_right = s:CountUnbalancedParen( prevline, ')' )
+ else
+ let num_unmatched_right = 0
+ " let num_unmatched_right = s:CountUnbalancedParen( prevline, ')' )
+ endif
+ if num_unmatched_left > 0
+ " There is a open left parenthesis
+ " increase indent
+ let ind = ind + ( shiftwidth() * num_unmatched_left )
+ elseif num_unmatched_right > 0
+ " if it is an unbalanced parenthesis only unindent if
+ " it was part of a command (ie create table(..) )
+ " instead of part of an if (ie if (....) then) which should
+ " maintain the indent level
+ let ignore = s:CheckToIgnoreRightParen( prevlnum, num_unmatched_right )
+ " echom 'prevl - ) unbalanced - CTIRP - ignore: ' . ignore
+
+ if prevline =~ '^\s*)'
+ let ignore = ignore + 1
+ " echom 'prevl - begins ) unbalanced ignore: ' . ignore
+ endif
+
+ if (num_unmatched_right - ignore) > 0
+ let ind = ind - ( shiftwidth() * (num_unmatched_right - ignore) )
+ endif
+
+ endif
+ endif
+
+
+ " echom 'CURRENT INDENT: ' . ind . ' LINE: ' . getline(v:lnum)
+
+ " This is a new blank line since we just typed a carriage return
+ " Check current line; search for simplistic matching start-of-block
+ let line = getline(v:lnum)
+
+ if line =~? '^\s*els'
+ " Any line when you type else will automatically back up one
+ " ident level (ie else, elseif, elsif)
+ 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 - shiftwidth()
+ " echom 'curr - end - indent ' . ind
+ elseif line =~? '^\s*when\>'
+ let ind = s:GetStmtStarterIndent('when', v:lnum)
+ " If the WHEN clause is used with a MERGE or EXCEPTION
+ " clause, do not change the indent level, since these
+ " statements do not have a corresponding END statement.
+ " if stmt_starter =~? 'case'
+ " let ind = ind - shiftwidth()
+ " endif
+ " elseif line =~ '^\s*)\s*;\?\s*$'
+ " elseif line =~ '^\s*)'
+ elseif line =~ '^\s*)'
+ let num_unmatched_right = s:CountUnbalancedParen( line, ')' )
+ let ignore = s:CheckToIgnoreRightParen( v:lnum, num_unmatched_right )
+ " If the line ends in a ), then reduce the indent
+ " This catches items like:
+ " CREATE TABLE T1(
+ " c1 int,
+ " c2 int
+ " );
+ " But we do not want to unindent a line like:
+ " IF ( c1 = 1
+ " AND c2 = 3 ) THEN
+ " let num_unmatched_right = s:CountUnbalancedParen( line, ')' )
+ " if num_unmatched_right > 0
+ " elseif strpart( line, strlen(line)-1, 1 ) =~ ')'
+ " 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 - ( shiftwidth() * (num_unmatched_right - ignore) )
+ endif
+ " endif
+ endif
+
+ " echom 'final - indent ' . ind
+ return s:ModuloIndent(ind)
+endfunction
+
+" Restore:
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim: ts=4 fdm=marker sw=4
diff --git a/runtime/indent/sshconfig.vim b/runtime/indent/sshconfig.vim
new file mode 100644
index 0000000..b456a9e
--- /dev/null
+++ b/runtime/indent/sshconfig.vim
@@ -0,0 +1,34 @@
+" Vim indent file
+" Language: ssh config file
+" Maintainer: JasonKim <git@jasonk.me>
+" Last Change: 2020 May 16
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetSshconfigIndent(v:lnum)
+setlocal indentkeys=o,O,*<Return>,0=~host\ ,0=~match\ ,0#,!^F
+
+let b:undo_indent = "setlocal autoindent< indentexpr< indentkeys<"
+
+if exists("*GetSshconfigIndent")
+ finish
+endif
+
+function GetSshconfigIndent(lnum)
+ let sw = shiftwidth()
+ let prev_lnum = prevnonblank(a:lnum - 1)
+ let curr_lnum = a:lnum
+ let prev_line = getline(prev_lnum)
+ let curr_line = getline(curr_lnum)
+ if curr_line =~? '^\s*\(host\|match\)\s'
+ return 0
+ elseif prev_line =~? '^\s*\(host\|match\)\s'
+ return sw
+ else
+ return indent(prev_lnum)
+ endif
+endfunction
diff --git a/runtime/indent/systemverilog.vim b/runtime/indent/systemverilog.vim
new file mode 100644
index 0000000..a5f4d5b
--- /dev/null
+++ b/runtime/indent/systemverilog.vim
@@ -0,0 +1,279 @@
+" Vim indent file
+" Language: SystemVerilog
+" Maintainer: kocha <kocha.lsifrontend@gmail.com>
+" Last Change: 05-Feb-2017 by Bilal Wasim
+" 03-Aug-2022 Improved indent
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=SystemVerilogIndent()
+setlocal indentkeys=!^F,o,O,0),0},=begin,=end,=join,=endcase,=join_any,=join_none
+setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify
+setlocal indentkeys+==endclass,=endpackage,=endsequence,=endclocking
+setlocal indentkeys+==endinterface,=endgroup,=endprogram,=endproperty,=endchecker
+setlocal indentkeys+==`else,=`elsif,=`endif
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+if exists("*SystemVerilogIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let s:multiple_comment = 0
+let s:open_statement = 0
+
+function SystemVerilogIndent()
+
+ if exists('b:systemverilog_indent_width')
+ let offset = b:systemverilog_indent_width
+ else
+ let offset = shiftwidth()
+ endif
+ if exists('b:systemverilog_indent_modules')
+ let indent_modules = offset
+ else
+ let indent_modules = 0
+ endif
+
+ if exists('b:systemverilog_indent_ifdef_off')
+ let indent_ifdef = 0
+ else
+ let indent_ifdef = 1
+ endif
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let lnum2 = prevnonblank(lnum - 1)
+ let curr_line = getline(v:lnum)
+ let last_line = getline(lnum)
+ let last_line2 = getline(lnum2)
+ let ind = indent(lnum)
+ let ind2 = indent(lnum - 1)
+ " Define the condition of an open statement
+ " Exclude the match of //, /* or */
+ let sv_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)'
+ " Define the condition when the statement ends with a one-line comment
+ let sv_comment = '\(//.*\|/\*.*\*/\s*\)'
+ if exists('b:systemverilog_indent_verbose')
+ let vverb_str = 'INDENT VERBOSE: '. v:lnum .":"
+ let vverb = 1
+ else
+ let vverb = 0
+ endif
+
+ " Multiple-line comment count
+ if curr_line =~ '^\s*/\*' && curr_line !~ '/\*.\{-}\*/'
+ let s:multiple_comment += 1
+ if vverb | echom vverb_str "Start of multiple-line commnt" | endif
+ elseif curr_line =~ '\*/\s*$' && curr_line !~ '/\*.\{-}\*/'
+ let s:multiple_comment -= 1
+ if vverb | echom vverb_str "End of multiple-line commnt" | endif
+ return ind
+ endif
+ " Maintain indentation during commenting.
+ if s:multiple_comment > 0
+ return ind
+ endif
+
+ " Indent after if/else/for/case/always/initial/specify/fork blocks
+ if last_line =~ '^\s*\(end\)\=\s*`\@<!\<\(if\|else\)\>' ||
+ \ last_line =~ '^\s*\<\(for\|while\|repeat\|case\%[[zx]]\|do\|foreach\|forever\|randcase\)\>' ||
+ \ last_line =~ '^\s*\<\(always\|always_comb\|always_ff\|always_latch\)\>' ||
+ \ last_line =~ '^\s*\<\(initial\|specify\|fork\|final\)\>'
+ if last_line !~ '\(;\|\<end\>\|\*/\)\s*' . sv_comment . '*$' ||
+ \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . sv_comment . '*$'
+ let ind = ind + offset
+ if vverb | echom vverb_str "Indent after a block statement." | endif
+ endif
+ " Indent after function/task/class/package/sequence/clocking/
+ " interface/covergroup/property/checkerprogram blocks
+ elseif last_line =~ '^\s*\<\(function\|task\|class\|package\)\>' ||
+ \ last_line =~ '^\s*\<\(sequence\|clocking\|interface\)\>' ||
+ \ last_line =~ '^\s*\(\w\+\s*:\)\=\s*\<covergroup\>' ||
+ \ last_line =~ '^\s*\<\(property\|checker\|program\)\>' ||
+ \ ( last_line =~ '^\s*\<virtual\>' && last_line =~ '\<\(function\|task\|class\|interface\)\>' ) ||
+ \ ( last_line =~ '^\s*\<pure\>' && last_line =~ '\<virtual\>' && last_line =~ '\<\(function\|task\)\>' )
+ if last_line !~ '\<end\>\s*' . sv_comment . '*$' ||
+ \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . sv_comment . '*$'
+ let ind = ind + offset
+ if vverb
+ echom vverb_str "Indent after function/task/class block statement."
+ endif
+ endif
+
+ " Indent after module/function/task/specify/fork blocks
+ elseif last_line =~ '^\s*\(\<extern\>\s*\)\=\<module\>'
+ let ind = ind + indent_modules
+ if vverb && indent_modules
+ echom vverb_str "Indent after module statement."
+ endif
+ if last_line =~ '[(,]\s*' . sv_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*[(,]\s*' . sv_comment . '*$'
+ let ind = ind + offset
+ if vverb
+ echom vverb_str "Indent after a multiple-line module statement."
+ endif
+ endif
+
+ " Indent after a 'begin' statement
+ elseif last_line =~ '\(\<begin\>\)\(\s*:\s*\w\+\)*' . sv_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*\(\<begin\>\)' &&
+ \ ( last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' ||
+ \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . sv_comment . '*$' )
+ let ind = ind + offset
+ if vverb | echom vverb_str "Indent after begin statement." | endif
+
+ " Indent after a '{' or a '('
+ elseif last_line =~ '[{(]' . sv_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*[{(]' &&
+ \ ( last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' ||
+ \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . sv_comment . '*$' )
+ let ind = ind + offset
+ if vverb | echom vverb_str "Indent after begin statement." | endif
+
+ " Ignore de-indent for the end of one-line block
+ elseif ( last_line !~ '\<begin\>' ||
+ \ last_line =~ '\(//\|/\*\).*\<begin\>' ) &&
+ \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>.*' .
+ \ sv_comment . '*$' &&
+ \ last_line2 !~ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>' &&
+ \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' &&
+ \ ( last_line2 !~ '\<begin\>' ||
+ \ last_line2 =~ '\(//\|/\*\).*\<begin\>' ) &&
+ \ last_line2 =~ ')*\s*;\s*' . sv_comment . '*$'
+ if vverb
+ echom vverb_str "Ignore de-indent after the end of one-line statement."
+ endif
+
+ " De-indent for the end of one-line block
+ elseif ( last_line !~ '\<begin\>' ||
+ \ last_line =~ '\(//\|/\*\).*\<begin\>' ) &&
+ \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>.*' .
+ \ sv_comment . '*$' &&
+ \ last_line2 !~ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>' &&
+ \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' &&
+ \ last_line2 !~ '\(;\|\<end\>\|\*/\)\s*' . sv_comment . '*$' &&
+ \ ( last_line2 !~ '\<begin\>' ||
+ \ last_line2 =~ '\(//\|/\*\).*\<begin\>' )
+ let ind = ind - offset
+ if vverb
+ echom vverb_str "De-indent after the end of one-line statement."
+ endif
+
+ " Multiple-line statement (including case statement)
+ " Open statement
+ " Ident the first open line
+ elseif last_line =~ sv_openstat . '\s*' . sv_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*' . sv_openstat . '\s*$' &&
+ \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$'
+ let ind = ind + offset
+ let s:open_statement = 1
+ if vverb | echom vverb_str "Indent after an open statement." | endif
+
+ " `ifdef or `ifndef or `elsif or `else
+ elseif last_line =~ '^\s*`\<\(ifn\?def\|elsif\|else\)\>' && indent_ifdef
+ let ind = ind + offset
+ if vverb
+ echom vverb_str "Indent after a `ifdef or `ifndef or `elsif or `else statement."
+ endif
+
+ endif
+
+ " Re-indent current line
+
+ " De-indent on the end of the block
+ " join/end/endcase/endfunction/endtask/endspecify
+ if curr_line =~ '^\s*\<\(join\|join_any\|join_none\|\|end\|endcase\)\>' ||
+ \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\|endclass\)\>' ||
+ \ curr_line =~ '^\s*\<\(endpackage\|endsequence\|endclocking\|endinterface\)\>' ||
+ \ curr_line =~ '^\s*\<\(endgroup\|endproperty\|endchecker\|endprogram\)\>'
+ let ind = ind - offset
+ if vverb | echom vverb_str "De-indent the end of a block." | endif
+ if s:open_statement == 1
+ let ind = ind - offset
+ let s:open_statement = 0
+ if vverb | echom vverb_str "De-indent the close statement." | endif
+ endif
+ elseif curr_line =~ '^\s*\<endmodule\>'
+ let ind = ind - indent_modules
+ if vverb && indent_modules
+ echom vverb_str "De-indent the end of a module."
+ endif
+
+ " De-indent on a stand-alone 'begin'
+ elseif curr_line =~ '^\s*\<begin\>'
+ if last_line !~ '^\s*\<\(function\|task\|specify\|module\|class\|package\)\>' ||
+ \ last_line !~ '^\s*\<\(sequence\|clocking\|interface\|covergroup\)\>' ||
+ \ last_line !~ '^\s*\<\(property\|checker\|program\)\>' &&
+ \ last_line !~ '^\s*\()*\s*;\|)\+\)\s*' . sv_comment . '*$' &&
+ \ ( last_line =~
+ \ '\<\(`\@<!if\|`\@<!else\|for\|case\%[[zx]]\|always\|initial\|do\|foreach\|forever\|randcase\|final\)\>' ||
+ \ last_line =~ ')\s*' . sv_comment . '*$' ||
+ \ last_line =~ sv_openstat . '\s*' . sv_comment . '*$' )
+ let ind = ind - offset
+ if vverb
+ echom vverb_str "De-indent a stand alone begin statement."
+ endif
+ if s:open_statement == 1
+ let ind = ind - offset
+ let s:open_statement = 0
+ if vverb | echom vverb_str "De-indent the close statement." | endif
+ endif
+ endif
+
+ " " Close statement
+ " " De-indent for an optional close parenthesis and a semicolon, and only
+ " " if there exists precedent non-whitespace char
+ " elseif last_line =~ ')*\s*;\s*' . sv_comment . '*$' &&
+ " \ last_line !~ '^\s*)*\s*;\s*' . sv_comment . '*$' &&
+ " \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . sv_comment . '*$' &&
+ " \ ( last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' &&
+ " \ last_line2 !~ ';\s*//.*$') &&
+ " \ last_line2 !~ '^\s*' . sv_comment . '$'
+ " let ind = ind - offset
+ " if vverb | echom vverb_str "De-indent after a close statement." | endif
+
+ " " De-indent after the end of multiple-line statement
+ " elseif curr_line =~ '^\s*)' &&
+ " \ ( last_line =~ sv_openstat . '\s*' . sv_comment . '*$' ||
+ " \ last_line !~ sv_openstat . '\s*' . sv_comment . '*$' &&
+ " \ last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' )
+ " let ind = ind - offset
+ " if vverb
+ " echom vverb_str "De-indent the end of a multiple statement."
+ " endif
+
+ " De-indent `elsif or `else or `endif
+ elseif curr_line =~ '^\s*`\<\(elsif\|else\|endif\)\>' && indent_ifdef
+ let ind = ind - offset
+ if vverb | echom vverb_str "De-indent `elsif or `else or `endif statement." | endif
+ if b:systemverilog_open_statement == 1
+ let ind = ind - offset
+ let b:systemverilog_open_statement = 0
+ if vverb | echom vverb_str "De-indent the open statement." | endif
+ endif
+ endif
+
+ " Return the indentation
+ return ind
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:sw=2
+
diff --git a/runtime/indent/tcl.vim b/runtime/indent/tcl.vim
new file mode 100644
index 0000000..c35150d
--- /dev/null
+++ b/runtime/indent/tcl.vim
@@ -0,0 +1,103 @@
+" Vim indent file
+" Language: Tcl
+" Maintainer: Chris Heithoff <chrisheithoff@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 24 Sep 2021
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetTclIndent()
+setlocal indentkeys=0{,0},!^F,o,O,0]
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetTclIndent")
+ finish
+endif
+
+function s:prevnonblanknoncomment(lnum)
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ let line = getline(lnum)
+ if line !~ '^\s*\(#\|$\)'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+function s:ends_with_backslash(lnum)
+ let line = getline(a:lnum)
+ if line =~ '\\\s*$'
+ return 1
+ else
+ return 0
+ endif
+endfunction
+
+function s:count_braces(lnum, count_open)
+ let n_open = 0
+ let n_close = 0
+ let line = getline(a:lnum)
+ let pattern = '[{}]'
+ let i = match(line, pattern)
+ while i != -1
+ if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'tcl\%(Comment\|String\)'
+ if line[i] == '{'
+ let n_open += 1
+ elseif line[i] == '}'
+ if n_open > 0
+ let n_open -= 1
+ else
+ let n_close += 1
+ endif
+ endif
+ endif
+ let i = match(line, pattern, i + 1)
+ endwhile
+ return a:count_open ? n_open : n_close
+endfunction
+
+function GetTclIndent()
+ let line = getline(v:lnum)
+
+ " Get the line number of the previous non-blank or non-comment line.
+ let pnum = s:prevnonblanknoncomment(v:lnum - 1)
+ if pnum == 0
+ return 0
+ endif
+
+ " ..and the previous line before the previous line.
+ let pnum2 = s:prevnonblanknoncomment(pnum-1)
+
+ " Default indentation is to preserve the previous indentation.
+ let ind = indent(pnum)
+
+ " ...but if previous line introduces an open brace, then increase current line's indentation
+ if s:count_braces(pnum, 1) > 0
+ let ind += shiftwidth()
+ else
+ " Look for backslash line continuation on the previous two lines.
+ let slash1 = s:ends_with_backslash(pnum)
+ let slash2 = s:ends_with_backslash(pnum2)
+ if slash1 && !slash2
+ " If the previous line begins a line continuation.
+ let ind += shiftwidth()
+ elseif !slash1 && slash2
+ " If two lines ago was the end of a line continuation group of lines.
+ let ind -= shiftwidth()
+ endif
+ endif
+
+ " If the current line begins with a closed brace, then decrease the indentation by one.
+ if line =~ '^\s*}'
+ let ind -= shiftwidth()
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/tcsh.vim b/runtime/indent/tcsh.vim
new file mode 100644
index 0000000..93d96e7
--- /dev/null
+++ b/runtime/indent/tcsh.vim
@@ -0,0 +1,53 @@
+" Vim indent file
+" Language: C-shell (tcsh)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Gautam Iyer <gi1242+vim@NoSpam.com> where NoSpam=gmail (Original Author)
+" Last Change: 2021 Oct 15
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=TcshGetIndent()
+setlocal indentkeys+=e,0=end
+setlocal indentkeys-=0{,0},0),:,0#
+
+let b:undo_indent = "setl inde< indk<"
+
+" Only define the function once.
+if exists("*TcshGetIndent")
+ finish
+endif
+
+function TcshGetIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Add indent if previous line begins with while or foreach
+ " OR line ends with case <str>:, default:, else, then or \
+ let ind = indent(lnum)
+ let line = getline(lnum)
+ if line =~ '\v^\s*%(while|foreach)>|^\s*%(case\s.*:|default:|else)\s*$|%(<then|\\)$'
+ let ind = ind + shiftwidth()
+ endif
+
+ if line =~ '\v^\s*breaksw>'
+ let ind = ind - shiftwidth()
+ endif
+
+ " Subtract indent if current line has on end, endif, endsw, case commands
+ let line = getline(v:lnum)
+ if line =~ '\v^\s*%(else|end|endif|endsw)\s*$'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/teraterm.vim b/runtime/indent/teraterm.vim
new file mode 100644
index 0000000..181c9a3
--- /dev/null
+++ b/runtime/indent/teraterm.vim
@@ -0,0 +1,57 @@
+" Vim indent file
+" Language: Tera Term Language (TTL)
+" Based on Tera Term Version 4.100
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/vim-teraterm
+" Last Change: 2021-10-18
+" Filenames: *.ttl
+" License: VIM License
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+setlocal noautoindent
+setlocal indentexpr=GetTeraTermIndent(v:lnum)
+setlocal indentkeys=!^F,o,O,e
+setlocal indentkeys+==elseif,=endif,=loop,=next,=enduntil,=endwhile
+
+let b:undo_indent = "setl ai< inde< indk< si<"
+
+if exists("*GetTeraTermIndent")
+ finish
+endif
+
+function! GetTeraTermIndent(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), ';.*$', '', '')
+ let l:thisl = substitute(getline(a:lnum), ';.*$', '', '')
+ let l:previ = indent(l:prevlnum)
+
+ let l:ind = l:previ
+
+ if l:prevl =~ '^\s*if\>.*\<then\>'
+ " previous line opened a block
+ let l:ind += shiftwidth()
+ endif
+ if l:prevl =~ '^\s*\%(elseif\|else\|do\|until\|while\|for\)\>'
+ " previous line opened a block
+ let l:ind += shiftwidth()
+ endif
+ if l:thisl =~ '^\s*\%(elseif\|else\|endif\|enduntil\|endwhile\|loop\|next\)\>'
+ " this line closed a block
+ let l:ind -= shiftwidth()
+ endif
+
+ return l:ind
+endfunction
+
+" vim: ts=8 sw=2 sts=2
diff --git a/runtime/indent/testdir/README.txt b/runtime/indent/testdir/README.txt
new file mode 100644
index 0000000..6597560
--- /dev/null
+++ b/runtime/indent/testdir/README.txt
@@ -0,0 +1,97 @@
+TESTING INDENT SCRIPTS
+
+We'll use FILETYPE for the filetype name here.
+
+
+FORMAT OF THE FILETYPE.IN FILE
+
+First of all, create a FILETYPE.in file. It should contain:
+
+- A modeline setting the 'filetype' and any other option values.
+ This must work like a comment for FILETYPE. E.g. for vim:
+ " vim: set ft=vim sw=4 :
+
+- At least one block of lines to indent, prefixed with START_INDENT and
+ followed by END_INDENT. These lines must also look like a comment for your
+ FILETYPE. You would normally leave out all indent, so that the effect of
+ the indent command results in adding indent. Example:
+
+ " START_INDENT
+ func Some()
+ let x = 1
+ endfunc
+ " END_INDENT
+
+ If you just want to test normal indenting with default options, you can make
+ this a large number of lines. Just add all kinds of language constructs,
+ nested statements, etc. with valid syntax.
+
+- Optionally, add lines with INDENT_EXE after START_INDENT, followed by a Vim
+ command. This will be executed before indenting the lines. Example:
+
+ " START_INDENT
+ " INDENT_EXE let g:vim_indent_cont = 6
+ let cmd =
+ \ 'some '
+ \ 'string'
+ " END_INDENT
+
+ Note that the command is not undone, you may need to reverse the effect for
+ the next block of lines.
+
+- Alternatively to indenting all the lines between START_INDENT and
+ END_INDENT, use an INDENT_AT line, which specifies a pattern to find the
+ line to indent. Example:
+
+ " START_INDENT
+ " INDENT_AT this-line
+ func Some()
+ let f = x " this-line
+ endfunc
+ " END_INDENT
+
+ Alternatively you can use INDENT_NEXT to indent the line below the matching
+ pattern. Keep in mind that quite often it will indent relative to the
+ matching line:
+
+ " START_INDENT
+ " INDENT_NEXT next-line
+ func Some()
+ " next-line
+ let f = x
+ endfunc
+ " END_INDENT
+
+ Or use INDENT_PREV to indent the line above the matching pattern:
+
+ " START_INDENT
+ " INDENT_PREV prev-line
+ func Some()
+ let f = x
+ " prev-line
+ endfunc
+ " END_INDENT
+
+It's best to keep the whole file valid for FILETYPE, so that syntax
+highlighting works normally, and any indenting that depends on the syntax
+highlighting also works.
+
+
+RUNNING THE TEST
+
+Before running the test, create a FILETYPE.ok file. You can leave it empty at
+first.
+
+Now run "make test" from the parent directory. After Vim has done the
+indenting you will see a FILETYPE.fail file. This contains the actual result
+of indenting, and it's different from the FILETYPE.ok file.
+
+Check the contents of the FILETYPE.fail file. If it is perfectly OK, then
+rename it to overwrite the FILETYPE.ok file. If you now run "make test" again,
+the test will pass and create a FILETYPE.out file, which is identical to the
+FILETYPE.ok file. The FILETYPE.fail file will be deleted.
+
+If you try to run "make test" again you will notice that nothing happens,
+because the FILETYPE.out file already exists. Delete it, or do "make clean",
+so that the text runs again. If you edit the FILETYPE.in file, so that it's
+newer than the FILETYPE.out file, the test will also run.
diff --git a/runtime/indent/testdir/bitbake.in b/runtime/indent/testdir/bitbake.in
new file mode 100644
index 0000000..afd19be
--- /dev/null
+++ b/runtime/indent/testdir/bitbake.in
@@ -0,0 +1,19 @@
+# vim: set filetype=bitbake :
+
+# START_INDENT
+FOO = " \
+ bar \
+ baz \
+ qux \
+ "
+
+do_configure() {
+oe_conf
+}
+
+python do_task() {
+def foo(x):
+if y:
+print(x)
+}
+# END_INDENT
diff --git a/runtime/indent/testdir/bitbake.ok b/runtime/indent/testdir/bitbake.ok
new file mode 100644
index 0000000..1bc5a18
--- /dev/null
+++ b/runtime/indent/testdir/bitbake.ok
@@ -0,0 +1,19 @@
+# vim: set filetype=bitbake :
+
+# START_INDENT
+FOO = " \
+ bar \
+ baz \
+ qux \
+"
+
+do_configure() {
+ oe_conf
+}
+
+python do_task() {
+ def foo(x):
+ if y:
+ print(x)
+}
+# END_INDENT
diff --git a/runtime/indent/testdir/html.in b/runtime/indent/testdir/html.in
new file mode 100644
index 0000000..4783a09
--- /dev/null
+++ b/runtime/indent/testdir/html.in
@@ -0,0 +1,77 @@
+% vim: set ft=html sw=4 ts=8 :
+
+
+% START_INDENT
+<html>
+ <body>
+<style>
+div#d1 { color: red; }
+div#d2 { color: green; }
+</style>
+ <script>
+ var v1 = "v1";
+var v2 = "v2";
+ </script>
+<div>
+<div>
+text
+</div>
+</div>
+
+<div
+class="foo bar">
+text
+</div>
+
+<div class="foo bar"
+data="something">
+text
+</div>
+
+<div class="foo
+bar">
+text
+</div>
+
+<dl>
+<dd>
+dd text
+</dd>
+<dt>
+dt text
+</dt>
+</dl>
+<div
+class="test"
+style="color: yellow">
+text
+</div>
+
+ </body>
+</html>
+
+% END_INDENT
+
+% START_INDENT
+% INDENT_EXE let g:html_indent_style1 = "inc"
+% INDENT_EXE let g:html_indent_script1 = "zero"
+% INDENT_EXE let g:html_indent_attribute = 1
+% INDENT_EXE call HtmlIndent_CheckUserSettings()
+<html>
+ <body>
+<style>
+div#d1 { color: red; }
+div#d2 { color: green; }
+</style>
+ <script>
+ var v1 = "v1";
+var v2 = "v2";
+ </script>
+<div
+class="test"
+style="color: yellow">
+text
+</div>
+</body>
+</html>
+% END_INDENT
diff --git a/runtime/indent/testdir/html.ok b/runtime/indent/testdir/html.ok
new file mode 100644
index 0000000..4963634
--- /dev/null
+++ b/runtime/indent/testdir/html.ok
@@ -0,0 +1,77 @@
+% vim: set ft=html sw=4 ts=8 :
+
+
+% START_INDENT
+<html>
+ <body>
+ <style>
+div#d1 { color: red; }
+div#d2 { color: green; }
+ </style>
+ <script>
+ var v1 = "v1";
+ var v2 = "v2";
+ </script>
+ <div>
+ <div>
+ text
+ </div>
+ </div>
+
+ <div
+ class="foo bar">
+ text
+ </div>
+
+ <div class="foo bar"
+ data="something">
+ text
+ </div>
+
+ <div class="foo
+ bar">
+ text
+ </div>
+
+ <dl>
+ <dd>
+ dd text
+ </dd>
+ <dt>
+ dt text
+ </dt>
+ </dl>
+ <div
+ class="test"
+ style="color: yellow">
+ text
+ </div>
+
+ </body>
+</html>
+
+% END_INDENT
+
+% START_INDENT
+% INDENT_EXE let g:html_indent_style1 = "inc"
+% INDENT_EXE let g:html_indent_script1 = "zero"
+% INDENT_EXE let g:html_indent_attribute = 1
+% INDENT_EXE call HtmlIndent_CheckUserSettings()
+<html>
+ <body>
+ <style>
+ div#d1 { color: red; }
+ div#d2 { color: green; }
+ </style>
+ <script>
+var v1 = "v1";
+var v2 = "v2";
+ </script>
+ <div
+ class="test"
+ style="color: yellow">
+ text
+ </div>
+ </body>
+</html>
+% END_INDENT
diff --git a/runtime/indent/testdir/krl.in b/runtime/indent/testdir/krl.in
new file mode 100644
index 0000000..ec90feb
--- /dev/null
+++ b/runtime/indent/testdir/krl.in
@@ -0,0 +1,148 @@
+; vim: set ft=krl :
+
+; START_INDENT
+
+def One()
+int i
+If i==1 then
+While i>=1
+For i=1 to 5 step 2
+Loop
+i = i+1
+EndLoop
+EndFor
+EndWhile
+Else
+Repeat
+Switch i
+Case 1
+Skip 123
+i = i+1
+EndSkip 123
+Spline with $acc=100, $vel.cp=3
+slin {x 100}
+scirc {x 110, y 110}, {x 120, y 90}
+slin {x 200} c_dis
+Time_Block Start
+slin {x 300} c_dis
+Time_Block Part = 22.2
+slin {y 400} c_dis
+Time_Block Part = 33.3
+Time_Block End = 10
+slin {y 200} c_dis
+Const_Vel Start +100 OnStart
+slin {y 300} c_dis
+slin {x 100}
+Const_Vel End -5.5
+slin {y 200} c_dis
+EndSpline
+Case 2,3
+PTP_Spline with $acc=100, $vel.ptp=100
+sptp {a1 0} c_ptp
+sptp {a1 90}
+EndSpline c_spl
+Default
+i = i+1
+EndSwitch
+Continue
+Until False
+EndIf
+end
+
+DEF Two()
+int i
+END
+
+global def Three()
+int i
+end
+
+GLOBAL DEF Four()
+int i
+END
+
+Global Def Five()
+int i
+End
+
+deffct bool fOne()
+int i
+endfct
+
+DEFFCT bool fTwo()
+int i
+ENDFCT
+
+global deffct bool fThree()
+int i
+endfct
+
+GLOBAL DEFFCT bool fFour()
+int i
+ENDFCT
+
+Global DefFct bool fFive()
+int i
+EndFct
+
+DefDat datfile()
+global int i=1
+; don't indent column 1 comments unless g:krlCommentIndent is set
+; global int o=2
+EndDat
+
+; END_INDENT
+
+; START_INDENT
+; INDENT_EXE let g:krlSpaceIndent = 0
+; INDENT_EXE set shiftwidth=4
+
+def bla()
+int i
+end
+
+; END_INDENT
+
+; START_INDENT
+; INDENT_EXE let g:krlCommentIndent = 1
+def bla()
+; indent this first column comment because of g:krlCommentIndent=1
+end
+; END_INDENT
+
+; START_INDENT
+; INDENT_EXE let g:krlIndentBetweenDef = 0
+def bla()
+int i ; don't indent this line because of g:krlIndentBetweenDef=0
+end
+; END_INDENT
+
+; START_INDENT
+; INDENT_AT this-line
+def Some()
+int f
+if true then
+f = 1 ; this-line
+endif
+end
+; END_INDENT
+
+; START_INDENT
+; INDENT_NEXT next-line
+def Some()
+ int i
+ ; next-line
+i = 1 ; should get indent of line 'int i' above
+end
+; END_INDENT
+
+; START_INDENT
+; INDENT_PREV prev-line
+def Some()
+int f
+if true then
+f = 1
+; prev-line
+endif
+end
+; END_INDENT
diff --git a/runtime/indent/testdir/krl.ok b/runtime/indent/testdir/krl.ok
new file mode 100644
index 0000000..34dc0f5
--- /dev/null
+++ b/runtime/indent/testdir/krl.ok
@@ -0,0 +1,148 @@
+; vim: set ft=krl :
+
+; START_INDENT
+
+def One()
+ int i
+ If i==1 then
+ While i>=1
+ For i=1 to 5 step 2
+ Loop
+ i = i+1
+ EndLoop
+ EndFor
+ EndWhile
+ Else
+ Repeat
+ Switch i
+ Case 1
+ Skip 123
+ i = i+1
+ EndSkip 123
+ Spline with $acc=100, $vel.cp=3
+ slin {x 100}
+ scirc {x 110, y 110}, {x 120, y 90}
+ slin {x 200} c_dis
+ Time_Block Start
+ slin {x 300} c_dis
+ Time_Block Part = 22.2
+ slin {y 400} c_dis
+ Time_Block Part = 33.3
+ Time_Block End = 10
+ slin {y 200} c_dis
+ Const_Vel Start +100 OnStart
+ slin {y 300} c_dis
+ slin {x 100}
+ Const_Vel End -5.5
+ slin {y 200} c_dis
+ EndSpline
+ Case 2,3
+ PTP_Spline with $acc=100, $vel.ptp=100
+ sptp {a1 0} c_ptp
+ sptp {a1 90}
+ EndSpline c_spl
+ Default
+ i = i+1
+ EndSwitch
+ Continue
+ Until False
+ EndIf
+end
+
+DEF Two()
+ int i
+END
+
+global def Three()
+ int i
+end
+
+GLOBAL DEF Four()
+ int i
+END
+
+Global Def Five()
+ int i
+End
+
+deffct bool fOne()
+ int i
+endfct
+
+DEFFCT bool fTwo()
+ int i
+ENDFCT
+
+global deffct bool fThree()
+ int i
+endfct
+
+GLOBAL DEFFCT bool fFour()
+ int i
+ENDFCT
+
+Global DefFct bool fFive()
+ int i
+EndFct
+
+DefDat datfile()
+ global int i=1
+; don't indent column 1 comments unless g:krlCommentIndent is set
+; global int o=2
+EndDat
+
+; END_INDENT
+
+; START_INDENT
+; INDENT_EXE let g:krlSpaceIndent = 0
+; INDENT_EXE set shiftwidth=4
+
+def bla()
+ int i
+end
+
+; END_INDENT
+
+; START_INDENT
+; INDENT_EXE let g:krlCommentIndent = 1
+def bla()
+ ; indent this first column comment because of g:krlCommentIndent=1
+end
+; END_INDENT
+
+; START_INDENT
+; INDENT_EXE let g:krlIndentBetweenDef = 0
+def bla()
+int i ; don't indent this line because of g:krlIndentBetweenDef=0
+end
+; END_INDENT
+
+; START_INDENT
+; INDENT_AT this-line
+def Some()
+int f
+if true then
+ f = 1 ; this-line
+endif
+end
+; END_INDENT
+
+; START_INDENT
+; INDENT_NEXT next-line
+def Some()
+ int i
+ ; next-line
+ i = 1 ; should get indent of line 'int i' above
+end
+; END_INDENT
+
+; START_INDENT
+; INDENT_PREV prev-line
+def Some()
+int f
+if true then
+ f = 1
+; prev-line
+endif
+end
+; END_INDENT
diff --git a/runtime/indent/testdir/matlab.in b/runtime/indent/testdir/matlab.in
new file mode 100644
index 0000000..b997ec8
--- /dev/null
+++ b/runtime/indent/testdir/matlab.in
@@ -0,0 +1,89 @@
+% vim: set ft=matlab sw=4 :
+
+% START_INDENT
+if true
+disp foo
+elseif false
+disp bar
+end
+% END_INDENT
+
+% START_INDENT
+try
+statements
+catch exception
+statements
+end
+% END_INDENT
+
+% START_INDENT
+if true, ...
+if true
+disp hello
+end
+end
+% END_INDENT
+
+% START_INDENT
+switch a
+case expr
+if true, foo; end
+disp hello
+otherwise
+disp bar
+end
+% END_INDENT
+
+% START_INDENT
+if true
+A(1:end - 1)
+C{1:end - 1}
+disp foo
+end
+% END_INDENT
+
+% START_INDENT
+A = [{
+}
+] ...
+disp foo
+disp bar
+% END_INDENT
+
+% START_INDENT
+if true
+% end
+%% end
+disp foo
+end
+% END_INDENT
+
+% START_INDENT
+% INDENT_EXE let b:MATLAB_function_indent = 0
+function foo
+disp foo
+function nested
+disp bar
+end
+end
+% END_INDENT
+
+% START_INDENT
+% INDENT_EXE let b:MATLAB_function_indent = 1
+function foo
+disp foo
+function nested
+disp bar
+end
+end
+% END_INDENT
+
+% START_INDENT
+% INDENT_EXE let b:MATLAB_function_indent = 2
+function foo
+disp foo
+function nested
+disp bar
+end
+end
+% END_INDENT
diff --git a/runtime/indent/testdir/matlab.ok b/runtime/indent/testdir/matlab.ok
new file mode 100644
index 0000000..df4e7b2
--- /dev/null
+++ b/runtime/indent/testdir/matlab.ok
@@ -0,0 +1,89 @@
+% vim: set ft=matlab sw=4 :
+
+% START_INDENT
+if true
+ disp foo
+elseif false
+ disp bar
+end
+% END_INDENT
+
+% START_INDENT
+try
+ statements
+catch exception
+ statements
+end
+% END_INDENT
+
+% START_INDENT
+if true, ...
+ if true
+ disp hello
+ end
+end
+% END_INDENT
+
+% START_INDENT
+switch a
+ case expr
+ if true, foo; end
+ disp hello
+ otherwise
+ disp bar
+end
+% END_INDENT
+
+% START_INDENT
+if true
+ A(1:end - 1)
+ C{1:end - 1}
+ disp foo
+end
+% END_INDENT
+
+% START_INDENT
+A = [{
+ }
+ ] ...
+ disp foo
+disp bar
+% END_INDENT
+
+% START_INDENT
+if true
+ % end
+ %% end
+ disp foo
+end
+% END_INDENT
+
+% START_INDENT
+% INDENT_EXE let b:MATLAB_function_indent = 0
+function foo
+disp foo
+ function nested
+ disp bar
+ end
+end
+% END_INDENT
+
+% START_INDENT
+% INDENT_EXE let b:MATLAB_function_indent = 1
+function foo
+disp foo
+ function nested
+ disp bar
+ end
+end
+% END_INDENT
+
+% START_INDENT
+% INDENT_EXE let b:MATLAB_function_indent = 2
+function foo
+ disp foo
+ function nested
+ disp bar
+ end
+end
+% END_INDENT
diff --git a/runtime/indent/testdir/python.in b/runtime/indent/testdir/python.in
new file mode 100644
index 0000000..57719ee
--- /dev/null
+++ b/runtime/indent/testdir/python.in
@@ -0,0 +1,94 @@
+# vim: set ft=python sw=4 et:
+
+# START_INDENT
+dict = {
+'a': 1,
+'b': 2,
+'c': 3,
+}
+# END_INDENT
+
+# START_INDENT
+# INDENT_EXE let [g:python_indent.open_paren, g:python_indent.closed_paren_align_last_line] = ['shiftwidth()', v:false]
+dict = {
+'a': 1,
+'b': 2,
+'c': 3,
+}
+# END_INDENT
+
+# START_INDENT
+# INDENT_EXE let g:python_indent.open_paren = 'shiftwidth() * 2'
+# INDENT_EXE syntax match pythonFoldMarkers /{{{\d*/ contained containedin=pythonComment
+# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx {{{1
+
+if True:
+pass
+# END_INDENT
+
+# START_INDENT
+open_paren_not_at_EOL(100,
+(200,
+300),
+400)
+
+open_paren_at_EOL(
+100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+(200,
+300),
+400)
+
+open_paren_at_EOL(
+100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+(200,
+300),
+400)
+
+open_paren_at_EOL(
+100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+(200,
+300),
+400)
+
+open_paren_at_EOL(
+100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+(200,
+300),
+400)
+
+open_paren_at_EOL(
+100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+(200,
+300),
+400)
+
+open_paren_at_EOL(
+100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+(200,
+300),
+400)
+
+open_paren_at_EOL(
+100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+(200,
+300),
+400)
+
+open_paren_at_EOL(
+100, 200, 300, 400)
+
+# END_INDENT
diff --git a/runtime/indent/testdir/python.ok b/runtime/indent/testdir/python.ok
new file mode 100644
index 0000000..f5ebbc2
--- /dev/null
+++ b/runtime/indent/testdir/python.ok
@@ -0,0 +1,94 @@
+# vim: set ft=python sw=4 et:
+
+# START_INDENT
+dict = {
+ 'a': 1,
+ 'b': 2,
+ 'c': 3,
+ }
+# END_INDENT
+
+# START_INDENT
+# INDENT_EXE let [g:python_indent.open_paren, g:python_indent.closed_paren_align_last_line] = ['shiftwidth()', v:false]
+dict = {
+ 'a': 1,
+ 'b': 2,
+ 'c': 3,
+}
+# END_INDENT
+
+# START_INDENT
+# INDENT_EXE let g:python_indent.open_paren = 'shiftwidth() * 2'
+# INDENT_EXE syntax match pythonFoldMarkers /{{{\d*/ contained containedin=pythonComment
+# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx {{{1
+
+if True:
+ pass
+# END_INDENT
+
+# START_INDENT
+open_paren_not_at_EOL(100,
+ (200,
+ 300),
+ 400)
+
+open_paren_at_EOL(
+ 100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+ (200,
+ 300),
+ 400)
+
+open_paren_at_EOL(
+ 100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+ (200,
+ 300),
+ 400)
+
+open_paren_at_EOL(
+ 100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+ (200,
+ 300),
+ 400)
+
+open_paren_at_EOL(
+ 100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+ (200,
+ 300),
+ 400)
+
+open_paren_at_EOL(
+ 100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+ (200,
+ 300),
+ 400)
+
+open_paren_at_EOL(
+ 100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+ (200,
+ 300),
+ 400)
+
+open_paren_at_EOL(
+ 100, 200, 300, 400)
+
+open_paren_not_at_EOL(100,
+ (200,
+ 300),
+ 400)
+
+open_paren_at_EOL(
+ 100, 200, 300, 400)
+
+# END_INDENT
diff --git a/runtime/indent/testdir/runtest.vim b/runtime/indent/testdir/runtest.vim
new file mode 100644
index 0000000..fa4e16e
--- /dev/null
+++ b/runtime/indent/testdir/runtest.vim
@@ -0,0 +1,145 @@
+" Runs all the indent tests for which there is no .out file.
+"
+" Current directory must be runtime/indent.
+
+" Only do this with the +eval feature
+if 1
+
+set nocp
+filetype indent on
+syn on
+set nowrapscan
+set report=9999
+set modeline
+set debug=throw
+
+au! SwapExists * call HandleSwapExists()
+func HandleSwapExists()
+ " Ignore finding a swap file for the test input and output, the user might be
+ " editing them and that's OK.
+ if expand('<afile>') =~ '.*\.\(in\|out\|fail\|ok\)'
+ let v:swapchoice = 'e'
+ endif
+endfunc
+
+let failed_count = 0
+for fname in glob('testdir/*.in', 1, 1)
+ let root = substitute(fname, '\.in', '', '')
+
+ " Execute the test if the .out file does not exist of when the .in file is
+ " newer.
+ let in_time = getftime(fname)
+ let out_time = getftime(root . '.out')
+ if out_time < 0 || in_time > out_time
+ call delete(root . '.fail')
+ call delete(root . '.out')
+
+ set sw& ts& filetype=
+ exe 'split ' . fname
+
+ let did_some = 0
+ let failed = 0
+ let end = 1
+ while 1
+ " Indent all the lines between "START_INDENT" and "END_INDENT"
+ exe end
+ let start = search('\<START_INDENT\>')
+ let end = search('\<END_INDENT\>')
+ if start <= 0 || end <= 0 || end <= start
+ if did_some == 0
+ call append(0, 'ERROR: START_INDENT and/or END_INDENT not found')
+ let failed = 1
+ endif
+ break
+ else
+ let did_some = 1
+
+ " Execute all commands marked with INDENT_EXE and find any pattern.
+ let lnum = start
+ let pattern = ''
+ let at = ''
+ while 1
+ exe lnum + 1
+ let lnum_exe = search('\<INDENT_EXE\>')
+ exe lnum + 1
+ let indent_at = search('\<INDENT_\(AT\|NEXT\|PREV\)\>')
+ if lnum_exe > 0 && lnum_exe < end && (indent_at <= 0 || lnum_exe < indent_at)
+ exe substitute(getline(lnum_exe), '.*INDENT_EXE', '', '')
+ let lnum = lnum_exe
+ let start = lnum
+ elseif indent_at > 0 && indent_at < end
+ if pattern != ''
+ call append(indent_at, 'ERROR: duplicate pattern')
+ let failed = 1
+ break
+ endif
+ let text = getline(indent_at)
+ let pattern = substitute(text, '.*INDENT_\S*\s*', '', '')
+ let at = substitute(text, '.*INDENT_\(\S*\).*', '\1', '')
+ let lnum = indent_at
+ let start = lnum
+ else
+ break
+ endif
+ endwhile
+
+ exe start + 1
+ if pattern == ''
+ try
+ exe 'normal =' . (end - 1) . 'G'
+ catch
+ call append(indent_at, 'ERROR: ' . v:exception)
+ let failed = 1
+ endtry
+ else
+ let lnum = search(pattern)
+ if lnum <= 0
+ call append(indent_at, 'ERROR: pattern not found: ' . pattern)
+ let failed = 1
+ break
+ endif
+ if at == 'AT'
+ exe lnum
+ elseif at == 'NEXT'
+ exe lnum + 1
+ else
+ exe lnum - 1
+ endif
+ try
+ normal ==
+ catch
+ call append(indent_at, 'ERROR: ' . v:exception)
+ let failed = 1
+ endtry
+ endif
+ endif
+ endwhile
+
+ if !failed
+ " Check the resulting text equals the .ok file.
+ if getline(1, '$') != readfile(root . '.ok')
+ let failed = 1
+ endif
+ endif
+
+ if failed
+ let failed_count += 1
+ exe 'write ' . root . '.fail'
+ echoerr 'Test ' . fname . ' FAILED!'
+ else
+ exe 'write ' . root . '.out'
+ echo "Test " . fname . " OK\n"
+ endif
+
+ quit! " close the indented file
+ endif
+endfor
+
+" Matching "if 1" at the start.
+endif
+
+if failed_count > 0
+ " have make report an error
+ cquit
+endif
+qall!
diff --git a/runtime/indent/testdir/sshconfig.in b/runtime/indent/testdir/sshconfig.in
new file mode 100644
index 0000000..87b998e
--- /dev/null
+++ b/runtime/indent/testdir/sshconfig.in
@@ -0,0 +1,53 @@
+# vim: set filetype=sshconfig shiftwidth=4 expandtab :
+
+# START_INDENT
+Host myhost
+User myuser
+PasswordAuthentication no
+# END_INDENT
+
+# START_INDENT
+Host aaa
+User bbb
+Host ccc
+Host ddd
+# END_INDENT
+
+# START_INDENT
+host aaa
+HOST bbb
+hoSt ccc
+match ddd
+MATCH eee
+MatCH fff
+# END_INDENT
+
+# START_INDENT
+Host aaa
+User host
+PasswordAuthentication no
+Host *
+User user
+PasswordAuthentication no
+Host match
+User bbb
+# END_INDENT
+
+# START_INDENT
+Host tab
+User myuser
+# END_INDENT
+
+# START_INDENT
+Host mix
+User myuser
+# END_INDENT
+
+# START_INDENT
+Host aaa
+User bbb
+Match ccc
+User ddd
+HostKeyAlgorithms ssh-ed25519
+Match eee
+# END_INDENT
diff --git a/runtime/indent/testdir/sshconfig.ok b/runtime/indent/testdir/sshconfig.ok
new file mode 100644
index 0000000..b24b7cf
--- /dev/null
+++ b/runtime/indent/testdir/sshconfig.ok
@@ -0,0 +1,53 @@
+# vim: set filetype=sshconfig shiftwidth=4 expandtab :
+
+# START_INDENT
+Host myhost
+ User myuser
+ PasswordAuthentication no
+# END_INDENT
+
+# START_INDENT
+Host aaa
+ User bbb
+Host ccc
+Host ddd
+# END_INDENT
+
+# START_INDENT
+host aaa
+HOST bbb
+hoSt ccc
+match ddd
+MATCH eee
+MatCH fff
+# END_INDENT
+
+# START_INDENT
+Host aaa
+ User host
+ PasswordAuthentication no
+Host *
+ User user
+ PasswordAuthentication no
+Host match
+ User bbb
+# END_INDENT
+
+# START_INDENT
+Host tab
+ User myuser
+# END_INDENT
+
+# START_INDENT
+Host mix
+ User myuser
+# END_INDENT
+
+# START_INDENT
+Host aaa
+ User bbb
+Match ccc
+ User ddd
+ HostKeyAlgorithms ssh-ed25519
+Match eee
+# END_INDENT
diff --git a/runtime/indent/testdir/tcl.in b/runtime/indent/testdir/tcl.in
new file mode 100644
index 0000000..c769d5b
--- /dev/null
+++ b/runtime/indent/testdir/tcl.in
@@ -0,0 +1,19 @@
+# vim: set filetype=tcl shiftwidth=4 tabstop=8 expandtab :
+
+# START_INDENT
+proc abc {} {
+set a 5
+if {[some_cmd]==1} {
+foreach i [list {1 2 3}] {
+# Does this comment affect anything?
+puts $i
+}
+}
+}
+
+command_with_a_long_time -arg1 "First" \
+-arg2 "Second" \
+-arg3 "Third"
+
+puts "Move indent back after line continuation is complete"
+# END_INDENT \ No newline at end of file
diff --git a/runtime/indent/testdir/tcl.ok b/runtime/indent/testdir/tcl.ok
new file mode 100644
index 0000000..77f24e9
--- /dev/null
+++ b/runtime/indent/testdir/tcl.ok
@@ -0,0 +1,19 @@
+# vim: set filetype=tcl shiftwidth=4 tabstop=8 expandtab :
+
+# START_INDENT
+proc abc {} {
+ set a 5
+ if {[some_cmd]==1} {
+ foreach i [list {1 2 3}] {
+ # Does this comment affect anything?
+ puts $i
+ }
+ }
+}
+
+command_with_a_long_time -arg1 "First" \
+ -arg2 "Second" \
+ -arg3 "Third"
+
+puts "Move indent back after line continuation is complete"
+# END_INDENT
diff --git a/runtime/indent/testdir/vb.in b/runtime/indent/testdir/vb.in
new file mode 100644
index 0000000..1653ae6
--- /dev/null
+++ b/runtime/indent/testdir/vb.in
@@ -0,0 +1,134 @@
+' vim: filetype=vb shiftwidth=4 expandtab
+'
+' START_INDENT
+Public Type GEmployeeRecord ' Create user-defined type.
+ID As Integer ' Define elements of data type.
+Name As String * 20
+Address As String * 30
+Phone As Long
+HireDate As Date
+End Type
+
+Public Enum InterfaceColors
+icMistyRose = &HE1E4FF&
+icSlateGray = &H908070&
+icDodgerBlue = &HFF901E&
+icDeepSkyBlue = &HFFBF00&
+icSpringGreen = &H7FFF00&
+icForestGreen = &H228B22&
+icGoldenrod = &H20A5DA&
+icFirebrick = &H2222B2&
+End Enum
+
+Enum SecurityLevel
+IllegalEntry = -1
+SecurityLevel1 = 0
+SecurityLevel2 = 1
+End Enum
+
+Public Function TestConditional (number As Integer, ext As String) As Boolean
+Dim inRange As Boolean
+
+Select Case number
+Case <= 0
+inRange = False
+Case > 10
+inRange = False
+Case Else
+inRange = True
+End Select
+
+' This is a special case identified in the indent script.
+Select Case number
+End Select
+
+If ext = ".xlm" Then
+If inRange Then
+TestConditional = True
+Else
+TestConditional = False
+End If
+ElseIf ext = ".xlsx" Then
+If inRange Then
+TestConditional = False
+Else
+TestConditional = True
+End If
+Else
+TestConditional = False
+End If
+End Function
+
+Private Sub TestIterators (lLimit As Integer, uLimit As Integer)
+Dim a() As Variant
+Dim elmt As Variant
+Dim found As Boolean
+Dim indx As Integer
+Const specialValue As Integer = 5
+
+If uLimit < lLimit Then
+Exit Sub
+End If
+
+ReDim a(lLimit To uLimit)
+For indx=lLimit To Ulimit
+a(indx) = 2 * indx
+Next indx
+
+found = False
+For Each elmt in a
+If elmt = specialValue Then
+found = True
+End If
+Next elmt
+
+If found then
+indx = uLimit
+Do While indx >= lLimit
+indx = indx - 1
+Loop
+End If
+
+End Sub
+
+Public Sub TestMultiline (cellAddr As String, rowNbr As Long)
+Dim rng As Range
+
+Set rng = Range(cellAddr)
+With rng
+.Cells(1,1).Value = _
+"Line 1 of multiline string; " & _
+"Line 2 of multiline string; " & _
+"Line 3 of multiline string"
+End With
+
+' The following lines have whitespace after the underscore character
+' and therefore do not form a valid multiline statement. The indent
+' script correctly treats them as four single line statements contrary
+' to the author's obvious indent.
+rng..Cells(1,1).Value = _
+"Line 1 of multiline string; " & _
+"Line 2 of multiline string; " & _
+"Line 3 of multiline string"
+
+End Sub
+
+Private Sub TestStmtLabel()
+GoTo stmtLabel
+
+' Statement labels are never indented
+stmtLabel:
+
+End Sub
+
+Sub TestTypeKeyword()
+Type EmployeeRecord ' Create user-defined type.
+ID As Integer ' Define elements of data type.
+Name As String * 20
+Address As String * 30
+Phone As Long
+HireDate As Date
+End Type
+Dim varType As EmployeeRecord
+End Sub
+' END_INDENT
diff --git a/runtime/indent/testdir/vb.ok b/runtime/indent/testdir/vb.ok
new file mode 100644
index 0000000..143c688
--- /dev/null
+++ b/runtime/indent/testdir/vb.ok
@@ -0,0 +1,134 @@
+' vim: filetype=vb shiftwidth=4 expandtab
+'
+' START_INDENT
+Public Type GEmployeeRecord ' Create user-defined type.
+ ID As Integer ' Define elements of data type.
+ Name As String * 20
+ Address As String * 30
+ Phone As Long
+ HireDate As Date
+End Type
+
+Public Enum InterfaceColors
+ icMistyRose = &HE1E4FF&
+ icSlateGray = &H908070&
+ icDodgerBlue = &HFF901E&
+ icDeepSkyBlue = &HFFBF00&
+ icSpringGreen = &H7FFF00&
+ icForestGreen = &H228B22&
+ icGoldenrod = &H20A5DA&
+ icFirebrick = &H2222B2&
+End Enum
+
+Enum SecurityLevel
+ IllegalEntry = -1
+ SecurityLevel1 = 0
+ SecurityLevel2 = 1
+End Enum
+
+Public Function TestConditional (number As Integer, ext As String) As Boolean
+ Dim inRange As Boolean
+
+ Select Case number
+ Case <= 0
+ inRange = False
+ Case > 10
+ inRange = False
+ Case Else
+ inRange = True
+ End Select
+
+ ' This is a special case identified in the indent script.
+ Select Case number
+ End Select
+
+ If ext = ".xlm" Then
+ If inRange Then
+ TestConditional = True
+ Else
+ TestConditional = False
+ End If
+ ElseIf ext = ".xlsx" Then
+ If inRange Then
+ TestConditional = False
+ Else
+ TestConditional = True
+ End If
+ Else
+ TestConditional = False
+ End If
+End Function
+
+Private Sub TestIterators (lLimit As Integer, uLimit As Integer)
+ Dim a() As Variant
+ Dim elmt As Variant
+ Dim found As Boolean
+ Dim indx As Integer
+ Const specialValue As Integer = 5
+
+ If uLimit < lLimit Then
+ Exit Sub
+ End If
+
+ ReDim a(lLimit To uLimit)
+ For indx=lLimit To Ulimit
+ a(indx) = 2 * indx
+ Next indx
+
+ found = False
+ For Each elmt in a
+ If elmt = specialValue Then
+ found = True
+ End If
+ Next elmt
+
+ If found then
+ indx = uLimit
+ Do While indx >= lLimit
+ indx = indx - 1
+ Loop
+ End If
+
+End Sub
+
+Public Sub TestMultiline (cellAddr As String, rowNbr As Long)
+ Dim rng As Range
+
+ Set rng = Range(cellAddr)
+ With rng
+ .Cells(1,1).Value = _
+ "Line 1 of multiline string; " & _
+ "Line 2 of multiline string; " & _
+ "Line 3 of multiline string"
+ End With
+
+ ' The following lines have whitespace after the underscore character
+ ' and therefore do not form a valid multiline statement. The indent
+ ' script correctly treats them as four single line statements contrary
+ ' to the author's obvious indent.
+ rng..Cells(1,1).Value = _
+ "Line 1 of multiline string; " & _
+ "Line 2 of multiline string; " & _
+ "Line 3 of multiline string"
+
+End Sub
+
+Private Sub TestStmtLabel()
+ GoTo stmtLabel
+
+ ' Statement labels are never indented
+stmtLabel:
+
+End Sub
+
+Sub TestTypeKeyword()
+ Type EmployeeRecord ' Create user-defined type.
+ ID As Integer ' Define elements of data type.
+ Name As String * 20
+ Address As String * 30
+ Phone As Long
+ HireDate As Date
+ End Type
+ Dim varType As EmployeeRecord
+End Sub
+' END_INDENT
diff --git a/runtime/indent/testdir/vim.in b/runtime/indent/testdir/vim.in
new file mode 100644
index 0000000..c60d2d1
--- /dev/null
+++ b/runtime/indent/testdir/vim.in
@@ -0,0 +1,941 @@
+" vim: set ft=vim sw=4 :
+
+" START_INDENT
+func Some()
+let x = 1
+endfunc
+
+let cmd =
+\ 'some '
+\ 'string'
+
+if 1
+let x = [
+\ ]
+endif
+
+for x in [
+{key: 'value'},
+]
+eval 0
+endfor
+
+let t = [
+\ {
+\ 'k': 'val',
+\ },
+\ ]
+
+def Func()
+var d = dd
+->extend({
+})
+eval 0
+enddef
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE let g:vim_indent_cont = 6
+
+let cmd =
+\ 'some '
+\ 'string'
+
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE let g:vim_indent_cont = 5
+
+let list = [
+\ 'one',
+\ 'two']
+
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE unlet g:vim_indent_cont
+
+let list = [
+'one',
+'two',
+]
+echo
+
+" END_INDENT
+
+" START_INDENT
+" INDENT_AT this-line
+func Some()
+let f = x " this-line
+endfunc
+" END_INDENT
+
+" START_INDENT
+" INDENT_NEXT next-line
+func Some()
+ " next-line
+let f = x
+endfunc
+" END_INDENT
+
+" START_INDENT
+" INDENT_PREV prev-line
+func Some()
+let f = x
+" prev-line
+endfunc
+" END_INDENT
+
+" START_INDENT
+let a =<< END
+nothing
+END
+" END_INDENT
+
+" START_INDENT
+let a =<< trim END
+nothing
+END
+" END_INDENT
+
+" START_INDENT
+" INDENT_AT this-line
+let a=<< trim END
+ blah
+ blah
+ blah this-line
+END
+" END_INDENT
+
+" START_INDENT
+if v:true
+echo 0
+end
+" END_INDENT
+
+" START_INDENT
+var result = Func(
+arg1,
+arg2
+)
+" END_INDENT
+
+" START_INDENT
+var result = Func(arg1,
+arg2)
+" END_INDENT
+
+" START_INDENT
+filter(list, (k, v) =>
+v > 0)
+" END_INDENT
+
+" START_INDENT
+filter(list, (k, v) => {
+const x = get(list, k, 0)
+return x > 0
+})
+" END_INDENT
+
+" START_INDENT
+if x > 0
+filter(list, (k, v) => {
+const x = get(list, k, 1)
+return x > 0
+})
+endif
+" END_INDENT
+
+" START_INDENT
+{
+var temp = 'temp'
+}
+" END_INDENT
+
+" START_INDENT
+var text = lead
+.. middle
+.. end
+" END_INDENT
+
+" START_INDENT
+var text = lead ..
+middle ..
+end
+" END_INDENT
+
+" START_INDENT
+var total = start +
+end -
+correction
+" END_INDENT
+
+" START_INDENT
+var result = start
+:+ print
+" END_INDENT
+
+" START_INDENT
+var result = positive
+? PosFunc(arg)
+: NegFunc(arg)
+" END_INDENT
+
+" START_INDENT
+var result = GetBuilder()
+->BuilderSetWidth(333)
+->BuilderSetHeight(777)
+->BuilderBuild()
+" END_INDENT
+
+" START_INDENT
+var result = MyDict
+.member
+" END_INDENT
+
+" START_INDENT
+autocmd BufNewFile *.match if condition
+| echo 'match'
+| endif
+" END_INDENT
+
+" START_INDENT
+set cpo+=C
+var lines =<< trim END
+| this works
+END
+set cpo-=C
+" END_INDENT
+
+" START_INDENT
+syn region Text
+\ start='foo'
+#\ comment
+\ end='bar'
+" END_INDENT
+
+" START_INDENT
+au CursorHold * echom 'BEFORE bar'
+#\ some comment
+| echom 'AFTER bar'
+" END_INDENT
+
+" START_INDENT
+def MyFunc(text: string,
+separator = '-'
+): string
+enddef
+" END_INDENT
+
+" START_INDENT
+def MyFunc(
+text: string,
+separator = '-'
+): string
+enddef
+" END_INDENT
+
+" START_INDENT
+[var1, var2] =
+Func()
+" END_INDENT
+
+" START_INDENT
+const list = ['one',
+'two']
+" END_INDENT
+
+" START_INDENT
+const list = [
+'one',
+'two',
+]
+" END_INDENT
+
+" START_INDENT
+const dict = {one: 1,
+two: 2
+}
+" END_INDENT
+
+" START_INDENT
+const dict = {
+one: 1,
+two: 2
+}
+" END_INDENT
+
+" START_INDENT
+if true
+const dict =
+{
+one: 1,
+two: 2
+}
+endif
+" END_INDENT
+
+" START_INDENT
+def Func()
+return {
+one: 1
+}
+enddef
+" END_INDENT
+
+" START_INDENT
+echo {
+a: 0,
+# b
+# c
+}
+" END_INDENT
+
+" START_INDENT
+echo search(
+# comment
+'1'
+.. '2'
+)
+" END_INDENT
+
+" START_INDENT
+if true
+var v = ( # trailing "(" starts line continuation
+3 + 4 # nothing special
+) # end of expression indicates continued line
+var x: number # needs to align with previous "var"
+endif
+" END_INDENT
+
+" START_INDENT
+def Func() # {{{
+# comment
+if true
+return
+endif
+enddef
+" END_INDENT
+
+" START_INDENT
+echo {
+key:
+'value',
+}
+" END_INDENT
+
+" START_INDENT
+var id = time
+->timer_start((_) => {
+n = 0
+})
+" END_INDENT
+
+" START_INDENT
+augroup Name
+autocmd!
+augroup END
+" END_INDENT
+
+" START_INDENT
+var n =
+# comment
+1
++ 2
+
+var s = ''
+" END_INDENT
+
+" START_INDENT
+var keys = {
+J: 'j',
+"\<Home>": '1G',
+"\<End>": 'G',
+z: 'zz'
+}
+" END_INDENT
+
+" START_INDENT
+export def Func(
+n: number,
+s: string,
+...l: list<bool>
+)
+enddef
+" END_INDENT
+
+" START_INDENT
+var heredoc =<< trim ENDD
+var nested_heredoc =<< trim END
+END
+ENDD
+" END_INDENT
+
+" START_INDENT
+if true
+else " comment
+endif
+" END_INDENT
+
+" START_INDENT
+if true | echo 'one' | endif
+if true | echo 'two' | endif
+if true | echo 'three' | endif
+" END_INDENT
+
+" START_INDENT
+if true
+:'<-1 mark <
+else
+echo ''
+endif
+" END_INDENT
+
+" START_INDENT
+substitute/pat /rep /
+echo
+" END_INDENT
+
+" START_INDENT
+try
+echo 1
+catch /pat / # comment
+echo 2
+endtry
+" END_INDENT
+
+" START_INDENT
+def Func()
+Cmd %
+enddef
+" END_INDENT
+
+" START_INDENT
+if end == 'xxx' || end == 'yyy'
+echo
+endif
+" END_INDENT
+
+" START_INDENT
+if true
+popup_move(id, {col: 1,
+line: 2})
+endif
+setwinvar(id, 'name', 3)
+" END_INDENT
+
+" START_INDENT
+var d = [
+{a: 'x',
+b: 'y'},
+FuncA(),
+FuncB(),
+]
+" END_INDENT
+
+" START_INDENT
+var ll = [[
+1,
+2,
+3], [
+4,
+5,
+6], [
+7,
+8,
+9]]
+" END_INDENT
+
+" START_INDENT
+var ld = [{
+a: 'xxx',
+b: 'yyy'}, {
+c: 'xxx',
+d: 'yyy'}, {
+e: 'xxx',
+f: 'yyy'}, {
+}]
+" END_INDENT
+
+" START_INDENT
+var d = {
+a: {
+b: {
+c: [{
+d: 'e',
+f: 'g',
+h: 'i'
+}],
+j: 'k',
+},
+},
+}
+" END_INDENT
+
+" START_INDENT
+if true
+var end: any
+if true
+end = 0
+elseif true
+echo
+endif
+endif
+" END_INDENT
+
+" START_INDENT
+nunmap <buffer> (
+nunmap <buffer> )
+inoremap [ {
+inoremap ] }
+silent! xunmap i{
+silent! xunmap a{
+" END_INDENT
+
+" START_INDENT
+def Func(
+s: string,
+n = 1,
+m = 2
+)
+enddef
+" END_INDENT
+
+" START_INDENT
+var h =<< END
+text
+END
+
+def Func()
+echo
+enddef
+" END_INDENT
+
+" START_INDENT
+def Func()
+var h =<< END
+text
+END
+echo 'test'
+enddef
+" END_INDENT
+
+" START_INDENT
+def Foo()
+lcd -
+enddef
+def Bar()
+echo
+enddef
+" END_INDENT
+
+" START_INDENT
+if true
+n = Func(1, 2,
+3)
+endif
+" END_INDENT
+
+" START_INDENT
+def Func(s: string,
+n: number): bool
+if true
+return false
+endif
+enddef
+" END_INDENT
+
+" START_INDENT
+def Func(
+n: number)
+#
+echo
+enddef
+" END_INDENT
+
+" START_INDENT
+" INDENT_AT this-line
+def Func(
+ n: number)
+ #
+echo # this-line
+enddef
+" END_INDENT
+
+" START_INDENT
+if true
+if true
+normal! ==
+endif
+endif
+" END_INDENT
+
+" START_INDENT
+var d = {
+a: () => true,
+b: () => true
+&& true
+&& Foo(),
+c: () => Bar(),
+e: () => Baz(),
+}
+" END_INDENT
+
+" START_INDENT
+def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
+return (Emit: func(any)) => {
+Cont((t: any) => {
+if Pred(t)
+Emit(t)
+endif
+})
+}
+enddef
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE let g:vim_indent = {'more_in_bracket_block': v:true}
+def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
+return (Emit: func(any)) => {
+Cont((t: any) => {
+if Pred(t)
+Emit(t)
+endif
+})
+}
+enddef
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE unlet! g:vim_indent
+" END_INDENT
+
+" START_INDENT
+g:lightline = {
+'active': {
+'left': [ [ 'mode', 'paste' ], [ 'readonly', 'relativepath', 'modified' ] ],
+},
+'inactive': {
+'left': [ [ 'readonly', 'relativepath', 'modified' ] ],
+}
+}
+" END_INDENT
+
+" START_INDENT
+if getline(1, 10)
+->map((_, v: string): number => strcharlen(v))
+->max() > 1'000
+&l:breakindent = false
+&l:linebreak = false
+else
+&l:breakindent = true
+&l:linebreak = true
+endif
+" END_INDENT
+
+" START_INDENT
+var ext2cmd: dict<string> = {
+doc: $'antiword {fname}',
+docx: $'pandoc --from=docx --to=markdown {fname}',
+epub: $'pandoc --from=epub --to=markdown {fname}',
+odp: $'odt2txt {fname}',
+odt: $'odt2txt {fname}',
+pdf: $'pdftotext -nopgbrk -layout -q -eol unix {fname} -',
+rtf: 'unrtf --text',
+}
+" END_INDENT
+
+" START_INDENT
+const ptybuf: number = term_start(&shell, {
+hidden: true,
+exit_cb: (_, _) => {
+if true
+close
+else
+help
+endif
+}
+})
+" END_INDENT
+
+" START_INDENT
+var d = {
+a: 0,
+# a ' quote {{{
+#}}}
+b: 0,
+}
+" END_INDENT
+
+" START_INDENT
+echo printf('%s () %s',
+1,
+2
+)
+" END_INDENT
+
+" START_INDENT
+prop_add(1, col('.'), {
+length: 2,
+type: 'test'
+})
+" END_INDENT
+
+" START_INDENT
+echo (() => " string starting with space")()
+echo
+" END_INDENT
+
+" START_INDENT
+var variables = deepcopy(g:)
+->filter((k: string, _): bool =>
+k =~ '\c\V' .. keyword->escape('\')
+&& k !~ '\%(loaded\|did_plugin_\)')
+->items()
+->map((_, v): string => v[0] .. ' = ' .. string(v[1]))
+new
+" END_INDENT
+
+" START_INDENT
+var d = freq
+->map((_, v) =>
+v * (
+1
++ 2
+))
+for item in d
+->items()
+->sort((a, b) => b[1] - a[1])
+echo
+endfor
+" END_INDENT
+
+" START_INDENT
+make_job = job_start([&shell, &shellcmdflag, make_cmd], {
+callback: function(MakeProcessOutput, [qfid]),
+close_cb: function(MakeCloseCb, [qfid]),
+exit_cb: MakeCompleted,
+in_io: 'null'
+})
+" END_INDENT
+
+" START_INDENT
+var matching_abbrev: list<dict<string>> = copy(ABBREV)
+->filter((_, v: dict<string>): bool =>
+stridx(v.lhs, word_to_complete) == 0)
+->map((_, v: dict<string>) => ({
+word: v.lhs,
+menu: AbbrevRhs(v.rhs)->stridx('expand_') >= 0
+? AbbrevRhs(v.rhs)->matchstr('.*,\s*''\zs.*\ze'')')
+: AbbrevRhs(v.rhs)
+}))
+" END_INDENT
+
+" START_INDENT
+def Func()
+if true
+vimgrep /^\C\s*\%(fu\%[nction]\|def\)\s\+/ file
+endif
+enddef
+" END_INDENT
+
+" START_INDENT
+setlocal iskeyword+=[
+cword = expand('<cword>')
+" END_INDENT
+
+" START_INDENT
+silent if true
+echo
+endif
+" END_INDENT
+
+" START_INDENT
+def Func()
+sort :^.*[\/]:
+enddef
+" END_INDENT
+
+" START_INDENT
+def Func()
+d = {
+}
+hd =<< trim END
+['
+]'
+END
+enddef
+" END_INDENT
+
+" START_INDENT
+def Func()
+if true
+var hd =<< trim END
+if get(b:, 'current_syntax', '')
+endif
+END
+elseif true
+echo
+endif
+enddef
+" END_INDENT
+
+" START_INDENT
+# test for control-flow keyword followed by commented fold marker {{{
+if true
+echo
+endif #}}}
+" END_INDENT
+
+" START_INDENT
+if winsz == 0|let winsz= ""|endif
+exe "noswapfile ".winsz."wincmd s"
+" END_INDENT
+
+" START_INDENT
+if true
+if true
+windo if true | echo | endif
+augroup Name
+autocmd WinLeave * if true | eval 1 + 2 | endif
+augroup END
+endif
+endif
+" END_INDENT
+
+" START_INDENT
+if true
+echo ' =<< trim END'
+->len()
+endif
+" END_INDENT
+
+" START_INDENT
+function Func()
+if true
+if true
+if true | echo com | endif
+if true | echo com | endif
+endif
+else
+endif
+endfunction
+" END_INDENT
+
+" START_INDENT
+function Func()
+if v:true
++
+echo
+-
+endif
+endfunction
+" END_INDENT
+
+" START_INDENT
+var matchpairs: string = &matchpairs
+var pairs: dict<list<string>>
+for [opening: string, closing: string]
+in matchpairs
+->split(',')
+->map((_, v: string): list<string> => split(v, ':'))
+pairs[opening] = [escape(opening, '[]'), escape(closing, '[]'), 'nW', 'w$']
+pairs[closing] = [escape(opening, '[]'), escape(closing, '[]'), 'bnW', 'w0']
+endfor
+" END_INDENT
+
+" START_INDENT
+{
+echo []
++ []
++ [{a: 1,
+b: 2}]
+}
+" END_INDENT
+
+" START_INDENT
+silent! argdel *
+edit file
+" END_INDENT
+
+" START_INDENT
+def Foo()
+Bar(1,
+[]->filter((_, v) => {
+return true
+}),
+() => {
+echo
+})
+enddef
+" END_INDENT
+
+" START_INDENT
+echo {
+k: () => {
+if true
+echo
+popup_setoptions(id,
+{title: 'title'})
+endif
+}
+}
+" END_INDENT
+
+" START_INDENT
+if true
+elseif
+endif
+" END_INDENT
+
+" START_INDENT
+if (
+true)
+&& true
+echo
+endif
+" END_INDENT
+
+" START_INDENT
+abstract class Shape
+this.color = Color.Black
+this.thickness = 10
+endclass
+" END_INDENT
+
+" START_INDENT
+class OtherThing
+this.size: number
+static totalSize: number
+
+static def ClearTotalSize(): number
+var prev = totalSize
+totalSize = 0
+return prev
+enddef
+endclass
+" END_INDENT
+
+" START_INDENT
+interface HasSurface
+this.size: number
+def Surface(): number
+endinterface
+" END_INDENT
+
+" START_INDENT
+interface EnterExit
+def Enter(): void
+def Exit(): void
+endinterface
+" END_INDENT
+
+" START_INDENT
+enum Color
+White
+Red
+Green
+Blue
+Black
+endenum
+" END_INDENT
diff --git a/runtime/indent/testdir/vim.ok b/runtime/indent/testdir/vim.ok
new file mode 100644
index 0000000..57f0dbf
--- /dev/null
+++ b/runtime/indent/testdir/vim.ok
@@ -0,0 +1,941 @@
+" vim: set ft=vim sw=4 :
+
+" START_INDENT
+func Some()
+ let x = 1
+endfunc
+
+let cmd =
+ \ 'some '
+ \ 'string'
+
+if 1
+ let x = [
+ \ ]
+endif
+
+for x in [
+ {key: 'value'},
+ ]
+ eval 0
+endfor
+
+let t = [
+ \ {
+ \ 'k': 'val',
+ \ },
+ \ ]
+
+def Func()
+ var d = dd
+ ->extend({
+ })
+ eval 0
+enddef
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE let g:vim_indent_cont = 6
+
+let cmd =
+ \ 'some '
+ \ 'string'
+
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE let g:vim_indent_cont = 5
+
+let list = [
+ \ 'one',
+ \ 'two']
+
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE unlet g:vim_indent_cont
+
+let list = [
+ 'one',
+ 'two',
+]
+echo
+
+" END_INDENT
+
+" START_INDENT
+" INDENT_AT this-line
+func Some()
+ let f = x " this-line
+endfunc
+" END_INDENT
+
+" START_INDENT
+" INDENT_NEXT next-line
+func Some()
+ " next-line
+ let f = x
+endfunc
+" END_INDENT
+
+" START_INDENT
+" INDENT_PREV prev-line
+func Some()
+ let f = x
+" prev-line
+endfunc
+" END_INDENT
+
+" START_INDENT
+let a =<< END
+nothing
+END
+" END_INDENT
+
+" START_INDENT
+let a =<< trim END
+ nothing
+END
+" END_INDENT
+
+" START_INDENT
+" INDENT_AT this-line
+let a=<< trim END
+ blah
+ blah
+ blah this-line
+END
+" END_INDENT
+
+" START_INDENT
+if v:true
+ echo 0
+end
+" END_INDENT
+
+" START_INDENT
+var result = Func(
+ arg1,
+ arg2
+)
+" END_INDENT
+
+" START_INDENT
+var result = Func(arg1,
+ arg2)
+" END_INDENT
+
+" START_INDENT
+filter(list, (k, v) =>
+ v > 0)
+" END_INDENT
+
+" START_INDENT
+filter(list, (k, v) => {
+ const x = get(list, k, 0)
+ return x > 0
+})
+" END_INDENT
+
+" START_INDENT
+if x > 0
+ filter(list, (k, v) => {
+ const x = get(list, k, 1)
+ return x > 0
+ })
+endif
+" END_INDENT
+
+" START_INDENT
+{
+ var temp = 'temp'
+}
+" END_INDENT
+
+" START_INDENT
+var text = lead
+ .. middle
+ .. end
+" END_INDENT
+
+" START_INDENT
+var text = lead ..
+ middle ..
+ end
+" END_INDENT
+
+" START_INDENT
+var total = start +
+ end -
+ correction
+" END_INDENT
+
+" START_INDENT
+var result = start
+:+ print
+" END_INDENT
+
+" START_INDENT
+var result = positive
+ ? PosFunc(arg)
+ : NegFunc(arg)
+" END_INDENT
+
+" START_INDENT
+var result = GetBuilder()
+ ->BuilderSetWidth(333)
+ ->BuilderSetHeight(777)
+ ->BuilderBuild()
+" END_INDENT
+
+" START_INDENT
+var result = MyDict
+ .member
+" END_INDENT
+
+" START_INDENT
+autocmd BufNewFile *.match if condition
+ | echo 'match'
+ | endif
+" END_INDENT
+
+" START_INDENT
+set cpo+=C
+var lines =<< trim END
+ | this works
+END
+set cpo-=C
+" END_INDENT
+
+" START_INDENT
+syn region Text
+ \ start='foo'
+ #\ comment
+ \ end='bar'
+" END_INDENT
+
+" START_INDENT
+au CursorHold * echom 'BEFORE bar'
+ #\ some comment
+ | echom 'AFTER bar'
+" END_INDENT
+
+" START_INDENT
+def MyFunc(text: string,
+ separator = '-'
+ ): string
+enddef
+" END_INDENT
+
+" START_INDENT
+def MyFunc(
+ text: string,
+ separator = '-'
+ ): string
+enddef
+" END_INDENT
+
+" START_INDENT
+[var1, var2] =
+ Func()
+" END_INDENT
+
+" START_INDENT
+const list = ['one',
+ 'two']
+" END_INDENT
+
+" START_INDENT
+const list = [
+ 'one',
+ 'two',
+]
+" END_INDENT
+
+" START_INDENT
+const dict = {one: 1,
+ two: 2
+}
+" END_INDENT
+
+" START_INDENT
+const dict = {
+ one: 1,
+ two: 2
+}
+" END_INDENT
+
+" START_INDENT
+if true
+ const dict =
+ {
+ one: 1,
+ two: 2
+ }
+endif
+" END_INDENT
+
+" START_INDENT
+def Func()
+ return {
+ one: 1
+ }
+enddef
+" END_INDENT
+
+" START_INDENT
+echo {
+ a: 0,
+ # b
+ # c
+}
+" END_INDENT
+
+" START_INDENT
+echo search(
+ # comment
+ '1'
+ .. '2'
+)
+" END_INDENT
+
+" START_INDENT
+if true
+ var v = ( # trailing "(" starts line continuation
+ 3 + 4 # nothing special
+ ) # end of expression indicates continued line
+ var x: number # needs to align with previous "var"
+endif
+" END_INDENT
+
+" START_INDENT
+def Func() # {{{
+ # comment
+ if true
+ return
+ endif
+enddef
+" END_INDENT
+
+" START_INDENT
+echo {
+ key:
+ 'value',
+}
+" END_INDENT
+
+" START_INDENT
+var id = time
+ ->timer_start((_) => {
+ n = 0
+ })
+" END_INDENT
+
+" START_INDENT
+augroup Name
+ autocmd!
+augroup END
+" END_INDENT
+
+" START_INDENT
+var n =
+ # comment
+ 1
+ + 2
+
+var s = ''
+" END_INDENT
+
+" START_INDENT
+var keys = {
+ J: 'j',
+ "\<Home>": '1G',
+ "\<End>": 'G',
+ z: 'zz'
+}
+" END_INDENT
+
+" START_INDENT
+export def Func(
+ n: number,
+ s: string,
+ ...l: list<bool>
+ )
+enddef
+" END_INDENT
+
+" START_INDENT
+var heredoc =<< trim ENDD
+ var nested_heredoc =<< trim END
+ END
+ENDD
+" END_INDENT
+
+" START_INDENT
+if true
+else " comment
+endif
+" END_INDENT
+
+" START_INDENT
+if true | echo 'one' | endif
+if true | echo 'two' | endif
+if true | echo 'three' | endif
+" END_INDENT
+
+" START_INDENT
+if true
+ :'<-1 mark <
+else
+ echo ''
+endif
+" END_INDENT
+
+" START_INDENT
+substitute/pat /rep /
+echo
+" END_INDENT
+
+" START_INDENT
+try
+ echo 1
+catch /pat / # comment
+ echo 2
+endtry
+" END_INDENT
+
+" START_INDENT
+def Func()
+ Cmd %
+enddef
+" END_INDENT
+
+" START_INDENT
+if end == 'xxx' || end == 'yyy'
+ echo
+endif
+" END_INDENT
+
+" START_INDENT
+if true
+ popup_move(id, {col: 1,
+ line: 2})
+endif
+setwinvar(id, 'name', 3)
+" END_INDENT
+
+" START_INDENT
+var d = [
+ {a: 'x',
+ b: 'y'},
+ FuncA(),
+ FuncB(),
+]
+" END_INDENT
+
+" START_INDENT
+var ll = [[
+ 1,
+ 2,
+ 3], [
+ 4,
+ 5,
+ 6], [
+ 7,
+ 8,
+ 9]]
+" END_INDENT
+
+" START_INDENT
+var ld = [{
+ a: 'xxx',
+ b: 'yyy'}, {
+ c: 'xxx',
+ d: 'yyy'}, {
+ e: 'xxx',
+ f: 'yyy'}, {
+ }]
+" END_INDENT
+
+" START_INDENT
+var d = {
+ a: {
+ b: {
+ c: [{
+ d: 'e',
+ f: 'g',
+ h: 'i'
+ }],
+ j: 'k',
+ },
+ },
+}
+" END_INDENT
+
+" START_INDENT
+if true
+ var end: any
+ if true
+ end = 0
+ elseif true
+ echo
+ endif
+endif
+" END_INDENT
+
+" START_INDENT
+nunmap <buffer> (
+nunmap <buffer> )
+inoremap [ {
+inoremap ] }
+silent! xunmap i{
+silent! xunmap a{
+" END_INDENT
+
+" START_INDENT
+def Func(
+ s: string,
+ n = 1,
+ m = 2
+ )
+enddef
+" END_INDENT
+
+" START_INDENT
+var h =<< END
+text
+END
+
+def Func()
+ echo
+enddef
+" END_INDENT
+
+" START_INDENT
+def Func()
+ var h =<< END
+text
+END
+ echo 'test'
+enddef
+" END_INDENT
+
+" START_INDENT
+def Foo()
+ lcd -
+enddef
+def Bar()
+ echo
+enddef
+" END_INDENT
+
+" START_INDENT
+if true
+ n = Func(1, 2,
+ 3)
+endif
+" END_INDENT
+
+" START_INDENT
+def Func(s: string,
+ n: number): bool
+ if true
+ return false
+ endif
+enddef
+" END_INDENT
+
+" START_INDENT
+def Func(
+ n: number)
+ #
+ echo
+enddef
+" END_INDENT
+
+" START_INDENT
+" INDENT_AT this-line
+def Func(
+ n: number)
+ #
+ echo # this-line
+enddef
+" END_INDENT
+
+" START_INDENT
+if true
+ if true
+ normal! ==
+ endif
+endif
+" END_INDENT
+
+" START_INDENT
+var d = {
+ a: () => true,
+ b: () => true
+ && true
+ && Foo(),
+ c: () => Bar(),
+ e: () => Baz(),
+}
+" END_INDENT
+
+" START_INDENT
+def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
+ return (Emit: func(any)) => {
+ Cont((t: any) => {
+ if Pred(t)
+ Emit(t)
+ endif
+ })
+ }
+enddef
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE let g:vim_indent = {'more_in_bracket_block': v:true}
+def Select(Cont: func(func(any)), Pred: func(any): bool): func(func(any))
+ return (Emit: func(any)) => {
+ Cont((t: any) => {
+ if Pred(t)
+ Emit(t)
+ endif
+ })
+ }
+enddef
+" END_INDENT
+
+" START_INDENT
+" INDENT_EXE unlet! g:vim_indent
+" END_INDENT
+
+" START_INDENT
+g:lightline = {
+ 'active': {
+ 'left': [ [ 'mode', 'paste' ], [ 'readonly', 'relativepath', 'modified' ] ],
+ },
+ 'inactive': {
+ 'left': [ [ 'readonly', 'relativepath', 'modified' ] ],
+ }
+}
+" END_INDENT
+
+" START_INDENT
+if getline(1, 10)
+ ->map((_, v: string): number => strcharlen(v))
+ ->max() > 1'000
+ &l:breakindent = false
+ &l:linebreak = false
+else
+ &l:breakindent = true
+ &l:linebreak = true
+endif
+" END_INDENT
+
+" START_INDENT
+var ext2cmd: dict<string> = {
+ doc: $'antiword {fname}',
+ docx: $'pandoc --from=docx --to=markdown {fname}',
+ epub: $'pandoc --from=epub --to=markdown {fname}',
+ odp: $'odt2txt {fname}',
+ odt: $'odt2txt {fname}',
+ pdf: $'pdftotext -nopgbrk -layout -q -eol unix {fname} -',
+ rtf: 'unrtf --text',
+}
+" END_INDENT
+
+" START_INDENT
+const ptybuf: number = term_start(&shell, {
+ hidden: true,
+ exit_cb: (_, _) => {
+ if true
+ close
+ else
+ help
+ endif
+ }
+})
+" END_INDENT
+
+" START_INDENT
+var d = {
+ a: 0,
+ # a ' quote {{{
+ #}}}
+ b: 0,
+}
+" END_INDENT
+
+" START_INDENT
+echo printf('%s () %s',
+ 1,
+ 2
+)
+" END_INDENT
+
+" START_INDENT
+prop_add(1, col('.'), {
+ length: 2,
+ type: 'test'
+})
+" END_INDENT
+
+" START_INDENT
+echo (() => " string starting with space")()
+echo
+" END_INDENT
+
+" START_INDENT
+var variables = deepcopy(g:)
+ ->filter((k: string, _): bool =>
+ k =~ '\c\V' .. keyword->escape('\')
+ && k !~ '\%(loaded\|did_plugin_\)')
+ ->items()
+ ->map((_, v): string => v[0] .. ' = ' .. string(v[1]))
+new
+" END_INDENT
+
+" START_INDENT
+var d = freq
+ ->map((_, v) =>
+ v * (
+ 1
+ + 2
+ ))
+for item in d
+ ->items()
+ ->sort((a, b) => b[1] - a[1])
+ echo
+endfor
+" END_INDENT
+
+" START_INDENT
+make_job = job_start([&shell, &shellcmdflag, make_cmd], {
+ callback: function(MakeProcessOutput, [qfid]),
+ close_cb: function(MakeCloseCb, [qfid]),
+ exit_cb: MakeCompleted,
+ in_io: 'null'
+})
+" END_INDENT
+
+" START_INDENT
+var matching_abbrev: list<dict<string>> = copy(ABBREV)
+ ->filter((_, v: dict<string>): bool =>
+ stridx(v.lhs, word_to_complete) == 0)
+ ->map((_, v: dict<string>) => ({
+ word: v.lhs,
+ menu: AbbrevRhs(v.rhs)->stridx('expand_') >= 0
+ ? AbbrevRhs(v.rhs)->matchstr('.*,\s*''\zs.*\ze'')')
+ : AbbrevRhs(v.rhs)
+ }))
+" END_INDENT
+
+" START_INDENT
+def Func()
+ if true
+ vimgrep /^\C\s*\%(fu\%[nction]\|def\)\s\+/ file
+ endif
+enddef
+" END_INDENT
+
+" START_INDENT
+setlocal iskeyword+=[
+cword = expand('<cword>')
+" END_INDENT
+
+" START_INDENT
+silent if true
+ echo
+endif
+" END_INDENT
+
+" START_INDENT
+def Func()
+ sort :^.*[\/]:
+enddef
+" END_INDENT
+
+" START_INDENT
+def Func()
+ d = {
+ }
+ hd =<< trim END
+ ['
+ ]'
+ END
+enddef
+" END_INDENT
+
+" START_INDENT
+def Func()
+ if true
+ var hd =<< trim END
+ if get(b:, 'current_syntax', '')
+ endif
+ END
+ elseif true
+ echo
+ endif
+enddef
+" END_INDENT
+
+" START_INDENT
+# test for control-flow keyword followed by commented fold marker {{{
+if true
+ echo
+endif #}}}
+" END_INDENT
+
+" START_INDENT
+if winsz == 0|let winsz= ""|endif
+exe "noswapfile ".winsz."wincmd s"
+" END_INDENT
+
+" START_INDENT
+if true
+ if true
+ windo if true | echo | endif
+ augroup Name
+ autocmd WinLeave * if true | eval 1 + 2 | endif
+ augroup END
+ endif
+endif
+" END_INDENT
+
+" START_INDENT
+if true
+ echo ' =<< trim END'
+ ->len()
+endif
+" END_INDENT
+
+" START_INDENT
+function Func()
+ if true
+ if true
+ if true | echo com | endif
+ if true | echo com | endif
+ endif
+ else
+ endif
+endfunction
+" END_INDENT
+
+" START_INDENT
+function Func()
+ if v:true
+ +
+ echo
+ -
+ endif
+endfunction
+" END_INDENT
+
+" START_INDENT
+var matchpairs: string = &matchpairs
+var pairs: dict<list<string>>
+for [opening: string, closing: string]
+ in matchpairs
+ ->split(',')
+ ->map((_, v: string): list<string> => split(v, ':'))
+ pairs[opening] = [escape(opening, '[]'), escape(closing, '[]'), 'nW', 'w$']
+ pairs[closing] = [escape(opening, '[]'), escape(closing, '[]'), 'bnW', 'w0']
+endfor
+" END_INDENT
+
+" START_INDENT
+{
+ echo []
+ + []
+ + [{a: 1,
+ b: 2}]
+}
+" END_INDENT
+
+" START_INDENT
+silent! argdel *
+edit file
+" END_INDENT
+
+" START_INDENT
+def Foo()
+ Bar(1,
+ []->filter((_, v) => {
+ return true
+ }),
+ () => {
+ echo
+ })
+enddef
+" END_INDENT
+
+" START_INDENT
+echo {
+ k: () => {
+ if true
+ echo
+ popup_setoptions(id,
+ {title: 'title'})
+ endif
+ }
+}
+" END_INDENT
+
+" START_INDENT
+if true
+elseif
+endif
+" END_INDENT
+
+" START_INDENT
+if (
+ true)
+ && true
+ echo
+endif
+" END_INDENT
+
+" START_INDENT
+abstract class Shape
+ this.color = Color.Black
+ this.thickness = 10
+endclass
+" END_INDENT
+
+" START_INDENT
+class OtherThing
+ this.size: number
+ static totalSize: number
+
+ static def ClearTotalSize(): number
+ var prev = totalSize
+ totalSize = 0
+ return prev
+ enddef
+endclass
+" END_INDENT
+
+" START_INDENT
+interface HasSurface
+ this.size: number
+ def Surface(): number
+endinterface
+" END_INDENT
+
+" START_INDENT
+interface EnterExit
+ def Enter(): void
+ def Exit(): void
+endinterface
+" END_INDENT
+
+" START_INDENT
+enum Color
+ White
+ Red
+ Green
+ Blue
+ Black
+endenum
+" END_INDENT
diff --git a/runtime/indent/testdir/xml.in b/runtime/indent/testdir/xml.in
new file mode 100644
index 0000000..88ad51e
--- /dev/null
+++ b/runtime/indent/testdir/xml.in
@@ -0,0 +1,32 @@
+<!-- vim: set ft=xml ts=8 sw=0 sts=-1 et : -->
+<!-- START_INDENT -->
+<?xml version="1.0" encoding="utf-8"?>
+<tag0>
+ <tag1>
+<!-- comment -->
+<tag2>
+ <tag3/>
+</tag2>
+<!-- text comment -->
+
+<!--
+text comment
+-->
+</tag1>
+<!--
+text comment
+end comment -->
+</tag0>
+<!-- END_INDENT -->
+
+<!-- START_INDENT -->
+<?xml version="1.0" encoding="utf-8"?>
+<tag0>
+ <tag1>
+<!-- comment -->
+<tag2>
+ <tag3/>
+</tag2>
+</tag1>
+</tag0>
+<!-- END_INDENT -->
diff --git a/runtime/indent/testdir/xml.ok b/runtime/indent/testdir/xml.ok
new file mode 100644
index 0000000..d5e2289
--- /dev/null
+++ b/runtime/indent/testdir/xml.ok
@@ -0,0 +1,32 @@
+<!-- vim: set ft=xml ts=8 sw=0 sts=-1 et : -->
+<!-- START_INDENT -->
+<?xml version="1.0" encoding="utf-8"?>
+<tag0>
+ <tag1>
+ <!-- comment -->
+ <tag2>
+ <tag3/>
+ </tag2>
+ <!-- text comment -->
+
+ <!--
+ text comment
+ -->
+ </tag1>
+ <!--
+ text comment
+ end comment -->
+</tag0>
+<!-- END_INDENT -->
+
+<!-- START_INDENT -->
+<?xml version="1.0" encoding="utf-8"?>
+<tag0>
+ <tag1>
+ <!-- comment -->
+ <tag2>
+ <tag3/>
+ </tag2>
+ </tag1>
+</tag0>
+<!-- END_INDENT -->
diff --git a/runtime/indent/testdir/yaml.in b/runtime/indent/testdir/yaml.in
new file mode 100644
index 0000000..bf99668
--- /dev/null
+++ b/runtime/indent/testdir/yaml.in
@@ -0,0 +1,20 @@
+# vim: set ft=yaml sw=2 et :
+
+# START_INDENT
+map1:
+sub1:
+- list item
+map2:
+- another list
+# END_INDENT
+
+# START_INDENT
+map: &anchor
+map: val
+# END_INDENT
+
+# START_INDENT
+map: |
+line1
+line2
+# END_INDENT
diff --git a/runtime/indent/testdir/yaml.ok b/runtime/indent/testdir/yaml.ok
new file mode 100644
index 0000000..8b38633
--- /dev/null
+++ b/runtime/indent/testdir/yaml.ok
@@ -0,0 +1,20 @@
+# vim: set ft=yaml sw=2 et :
+
+# START_INDENT
+map1:
+ sub1:
+ - list item
+map2:
+ - another list
+# END_INDENT
+
+# START_INDENT
+map: &anchor
+map: val
+# END_INDENT
+
+# START_INDENT
+map: |
+ line1
+ line2
+# END_INDENT
diff --git a/runtime/indent/tex.vim b/runtime/indent/tex.vim
new file mode 100644
index 0000000..d356ba9
--- /dev/null
+++ b/runtime/indent/tex.vim
@@ -0,0 +1,423 @@
+" Vim indent file
+" Language: LaTeX
+" Maintainer: Yichao Zhou <broken.zhou AT gmail.com>
+" Created: Sat, 16 Feb 2002 16:50:19 +0100
+" Version: 1.0.0
+" Please email me if you found something I can do. Comments, bug report and
+" feature request are welcome.
+
+" Last Update: {{{
+" 25th Sep 2002, by LH :
+" (*) better support for the option
+" (*) use some regex instead of several '||'.
+" Oct 9th, 2003, by JT:
+" (*) don't change indentation of lines starting with '%'
+" 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 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 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 Yichao Zhou <broken.zhou AT gmail.com>
+" (*) Bug fix: improve the smartindent-like indent for "{}" and
+" "[]".
+" 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 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 Yichao Zhou <broken.zhou AT gmail.com>
+" (*) Modify "&" so that only indent when current line start with
+" "&".
+" 2012/03/12 by Yichao Zhou <broken.zhou AT gmail.com>
+" (*) Modify indentkeys.
+" 2012/03/18 by Yichao Zhou <broken.zhou AT gmail.com>
+" (*) Add &cpo
+" 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 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 Yichao Zhou <broken.zhou AT gmail.com>
+" (*) Indent current line if last line has larger indentation
+" 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
+" 2020/04/26 by Yichao Zhou <broken.zhou AT gmail.com>
+" (*) Fix a bug related to \[ & \]. Thanks Manuel Boni for
+" reporting.
+"
+" }}}
+
+" Document: {{{
+"
+" For proper latex experience, please put
+" let g:tex_flavor = "latex"
+" into your vimrc.
+"
+" * g:tex_indent_brace
+"
+" If this variable is unset or non-zero, it will use smartindent-like style
+" for "{}" and "[]". Now this only works if the open brace is the last
+" character of that line.
+"
+" % Example 1
+" \usetikzlibrary{
+" external
+" }
+"
+" % 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.
+"
+" 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
+" 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
+" 'itemize\|description\|enumerate\|thebibliography'.
+"
+" * g:tex_noindent_env
+"
+" 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")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Define global variable {{{
+
+let b:did_indent = 1
+
+if !exists("g:tex_indent_items")
+ let g:tex_indent_items = 1
+endif
+if !exists("g:tex_indent_brace")
+ let g:tex_indent_brace = 1
+endif
+if !exists("g:tex_max_scan_line")
+ let g:tex_max_scan_line = 60
+endif
+if g:tex_indent_items
+ if !exists("g:tex_itemize_env")
+ let g:tex_itemize_env = 'itemize\|description\|enumerate\|thebibliography'
+ endif
+ if !exists('g:tex_items')
+ let g:tex_items = '\\bibitem\|\\item'
+ endif
+else
+ let g:tex_items = ''
+endif
+
+if !exists("g:tex_noindent_env")
+ let g:tex_noindent_env = 'document\|verbatim\|lstlisting'
+endif "}}}
+
+" VIM Setting " {{{
+setlocal autoindent
+setlocal nosmartindent
+setlocal indentexpr=GetTeXIndent()
+setlocal indentkeys&
+exec 'setlocal indentkeys+=[,(,{,),},],\&' . substitute(g:tex_items, '^\|\(\\|\)', ',=', 'g')
+let g:tex_items = '^\s*' . substitute(g:tex_items, '^\(\^\\s\*\)*', '', '')
+" }}}
+
+function! GetTeXIndent() " {{{
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+ let cnum = v:lnum
+
+ " Comment line is not what we need.
+ while lnum != 0 && getline(lnum) =~ '^\s*%'
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let line = substitute(getline(lnum), '\s*%.*', '','g') " last line
+ let cline = substitute(getline(v:lnum), '\s*%.*', '', 'g') " current line
+
+ let ccol = 1
+ while cline[ccol] =~ '\s'
+ let ccol += 1
+ endwhile
+
+ " We are in verbatim, so do what our user what.
+ if synIDattr(synID(v:lnum, ccol, 1), "name") == "texZone"
+ if empty(cline)
+ return indent(lnum)
+ else
+ return indent(v:lnum)
+ endif
+ endif
+
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let stay = 1
+
+ " New code for comment: retain the indent of current line
+ if cline =~ '^\s*%'
+ return indent(v:lnum)
+ endif
+
+ " Add a 'shiftwidth' after beginning of environments.
+ " Don't add it for \begin{document} and \begin{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{.*}'
+ 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 + shiftwidth()
+ let stay = 0
+ endif
+ endif
+ endif
+
+ if cline =~ '\\end{.*}'
+ let retn = s:GetEndIndentation(v:lnum)
+ if retn != -1
+ return retn
+ endif
+ end
+ " Subtract a 'shiftwidth' when an environment ends
+ if cline =~ '\\end{.*}'
+ \ && cline !~ g:tex_noindent_env
+ \ && cline !~ '\\begin{.*}.*\\end{.*}'
+ if g:tex_indent_items
+ " Remove another sw for item-environments
+ if cline =~ g:tex_itemize_env
+ let ind = ind - shiftwidth()
+ let stay = 0
+ endif
+ endif
+
+ let ind = ind - shiftwidth()
+ let stay = 0
+ endif
+
+ if g:tex_indent_brace
+ if line =~ '[[{]$'
+ let ind += shiftwidth()
+ let stay = 0
+ endif
+
+ if cline =~ '^\s*\\\?[\]}]' && s:CheckPairedIsLastCharacter(v:lnum, ccol)
+ let ind -= shiftwidth()
+ let stay = 0
+ endif
+
+ if line !~ '^\s*\\\?[\]}]'
+ for i in range(1, strlen(line)-1)
+ let char = line[i]
+ if char == ']' || char == '}'
+ if s:CheckPairedIsLastCharacter(lnum, i)
+ let ind -= shiftwidth()
+ let stay = 0
+ endif
+ endif
+ endfor
+ endif
+ endif
+
+ " Special treatment for 'item'
+ " ----------------------------
+
+ if g:tex_indent_items
+ " '\item' or '\bibitem' itself:
+ if cline =~ g:tex_items
+ let ind = ind - shiftwidth()
+ let stay = 0
+ endif
+ " lines following to '\item' are indented once again:
+ if line =~ g:tex_items
+ let ind = ind + shiftwidth()
+ let stay = 0
+ endif
+ endif
+
+ 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
+ return max([indent(v:lnum), s:GetLastBeginIndentation(v:lnum)])
+ endif
+ else
+ return ind
+ endif
+endfunction "}}}
+
+function! s:GetLastBeginIndentation(lnum) " {{{
+ let matchend = 1
+ for lnum in range(a:lnum-1, max([a:lnum - g:tex_max_scan_line, 1]), -1)
+ let line = getline(lnum)
+ if line =~ '\\end{.*}'
+ let matchend += 1
+ endif
+ if line =~ '\\begin{.*}'
+ let matchend -= 1
+ endif
+ if matchend == 0
+ if line =~ g:tex_noindent_env
+ return indent(lnum)
+ endif
+ if line =~ g:tex_itemize_env
+ return indent(lnum) + 2 * shiftwidth()
+ endif
+ return indent(lnum) + shiftwidth()
+ endif
+ endfor
+ return -1
+endfunction
+
+function! s:GetEndIndentation(lnum) " {{{
+ if getline(a:lnum) =~ '\\begin{.*}.*\\end{.*}'
+ return -1
+ endif
+
+ let min_indent = 100
+ let matchend = 1
+ for lnum in range(a:lnum-1, max([a:lnum-g:tex_max_scan_line, 1]), -1)
+ let line = getline(lnum)
+ if line =~ '\\end{.*}'
+ let matchend += 1
+ endif
+ if line =~ '\\begin{.*}'
+ let matchend -= 1
+ endif
+ if matchend == 0
+ return indent(lnum)
+ endif
+ if !empty(line)
+ let min_indent = min([min_indent, indent(lnum)])
+ endif
+ endfor
+ return min_indent - shiftwidth()
+endfunction
+
+" Most of the code is from matchparen.vim
+function! s:CheckPairedIsLastCharacter(lnum, col) "{{{
+ 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 plist = split(&matchpairs, '.\zs[:,]')
+ let i = index(plist, c)
+ if i < 0
+ return 0
+ endif
+
+ " Figure out the arguments for searchpairpos().
+ if i % 2 == 0
+ let s_flags = 'nW'
+ let c2 = plist[i + 1]
+ else
+ let s_flags = 'nbW'
+ let c2 = c
+ let c = plist[i - 1]
+ endif
+ if c == '['
+ let c = '\['
+ let c2 = '\]'
+ endif
+
+ " Find the match. When it was just before the cursor move it there for a
+ " moment.
+ let save_cursor = winsaveview()
+ call cursor(c_lnum, c_col)
+
+ " When not in a string or comment ignore matches inside them.
+ " We match "escape" for special items, such as lispEscapeSpecial.
+ let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' .
+ \ '=~? "string\\|character\\|singlequote\\|escape\\|comment"'
+ execute 'if' s_skip '| let s_skip = 0 | endif'
+
+ let stopline = max([0, c_lnum - g:tex_max_scan_line])
+
+ " Limit the search time to 300 msec to avoid a hang on very long lines.
+ " This fails when a timeout is not supported.
+ try
+ let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 100)
+ catch /E118/
+ endtry
+
+ call winrestview(save_cursor)
+
+ if m_lnum > 0
+ let line = getline(m_lnum)
+ return strlen(line) == m_col
+ endif
+
+ return 0
+endfunction "}}}
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: set sw=4 textwidth=80:
diff --git a/runtime/indent/tf.vim b/runtime/indent/tf.vim
new file mode 100644
index 0000000..bb40bf6
--- /dev/null
+++ b/runtime/indent/tf.vim
@@ -0,0 +1,74 @@
+" Vim indent file
+" Language: tf (TinyFugue)
+" Maintainer: Christian J. Robinson <heptite@gmail.com>
+" URL: http://www.vim.org/scripts/script.php?script_id=174
+" Last Change: 2022 Apr 25
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetTFIndent()
+setlocal indentkeys-=0{,0} indentkeys-=0# indentkeys-=:
+setlocal indentkeys+==/endif,=/then,=/else,=/done,0;
+
+let b:undo_indent = "setlocal indentexpr< indentkeys<"
+
+" Only define the function once:
+if exists("*GetTFIndent")
+ finish
+endif
+
+function GetTFIndent()
+ " Find a non-blank line above the current line:
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " No indent for the start of the file:
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let line = getline(lnum)
+
+ " No indentation if the previous line didn't end with "\":
+ " (Could be annoying, but it lets you know if you made a mistake.)
+ if line !~ '\\$'
+ return 0
+ endif
+
+ if line =~ '\(/def.*\\\|/for.*\(%;\s*\)\@\<!\\\)$'
+ let ind = ind + shiftwidth()
+ elseif line =~ '\(/if\|/else\|/then\)'
+ if line !~ '/endif'
+ let ind = ind + shiftwidth()
+ endif
+ elseif line =~ '/while'
+ if line !~ '/done'
+ let ind = ind + shiftwidth()
+ endif
+ endif
+
+ let line = getline(v:lnum)
+
+ if line =~ '\(/else\|/endif\|/then\)'
+ if line !~ '/if'
+ let ind = ind - shiftwidth()
+ endif
+ elseif line =~ '/done'
+ if line !~ '/while'
+ let ind = ind - shiftwidth()
+ endif
+ endif
+
+ " Comments at the beginning of a line:
+ if line =~ '^\s*;'
+ let ind = 0
+ endif
+
+
+ return ind
+
+endfunction
diff --git a/runtime/indent/tilde.vim b/runtime/indent/tilde.vim
new file mode 100644
index 0000000..8658035
--- /dev/null
+++ b/runtime/indent/tilde.vim
@@ -0,0 +1,39 @@
+"Description: Indent scheme for the tilde weblanguage
+"Author: Tobias Rundström <tobi@tobi.nu> (Invalid email address)
+"URL: http://tilde.tildesoftware.net
+"Last Change: May 8 09:15:09 CEST 2002
+" 2022 April: b:undo_indent added by Doug Kearns
+
+if exists ("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetTildeIndent(v:lnum)
+setlocal indentkeys=o,O,)
+
+let b:undo_indent = "setl ai< inde< indk<"
+
+if exists("*GetTildeIndent")
+ finish
+endif
+
+function GetTildeIndent(lnum)
+ let plnum = prevnonblank(v:lnum-1)
+
+ if plnum == 0
+ return 0
+ endif
+
+ if getline(v:lnum) =~ '^\s*\~\(endif\|else\|elseif\|end\)\>'
+ 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) + shiftwidth()
+ else
+ return -1
+ endif
+endfunction
diff --git a/runtime/indent/treetop.vim b/runtime/indent/treetop.vim
new file mode 100644
index 0000000..6c39c69
--- /dev/null
+++ b/runtime/indent/treetop.vim
@@ -0,0 +1,41 @@
+" Vim indent file
+" Language: Treetop
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2022 April 25
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetTreetopIndent()
+setlocal indentkeys=0{,0},!^F,o,O,=end
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetTreetopIndent")
+ finish
+endif
+
+function GetTreetopIndent()
+ let pnum = prevnonblank(v:lnum - 1)
+ if pnum == 0
+ return 0
+ endif
+
+ let ind = indent(pnum)
+ let line = getline(pnum)
+
+ if line =~ '^\s*\%(grammar\|module\|rule\)\>'
+ let ind += shiftwidth()
+ endif
+
+ let line = getline(v:lnum)
+ if line =~ '^\s*end\>'
+ let ind -= shiftwidth()
+ end
+
+ return ind
+endfunction
diff --git a/runtime/indent/typescript.vim b/runtime/indent/typescript.vim
new file mode 100644
index 0000000..e899f83
--- /dev/null
+++ b/runtime/indent/typescript.vim
@@ -0,0 +1,503 @@
+" Vim indent file
+" Language: TypeScript
+" Maintainer: See https://github.com/HerringtonDarkholme/yats.vim
+" Last Change: 2019 Oct 18
+" Acknowledgement: Based off of vim-ruby maintained by Nikolai Weibull http://vim-ruby.rubyforge.org
+
+" 0. Initialization {{{1
+" =================
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+
+" Now, set up our indentation expression and keys that trigger it.
+setlocal indentexpr=GetTypescriptIndent()
+setlocal formatexpr=Fixedgq(v:lnum,v:count)
+setlocal indentkeys=0{,0},0),0],0\,,!^F,o,O,e
+
+" Only define the function once.
+if exists("*GetTypescriptIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" 1. Variables {{{1
+" ============
+
+let s:js_keywords = '^\s*\(break\|case\|catch\|continue\|debugger\|default\|delete\|do\|else\|finally\|for\|function\|if\|in\|instanceof\|new\|return\|switch\|this\|throw\|try\|typeof\|var\|void\|while\|with\)'
+
+" Regex of syntax group names that are or delimit string or are comments.
+let s:syng_strcom = 'string\|regex\|comment\c'
+
+" Regex of syntax group names that are strings.
+let s:syng_string = 'regex\c'
+
+" Regex of syntax group names that are strings or documentation.
+let s:syng_multiline = 'comment\c'
+
+" Regex of syntax group names that are line comment.
+let s:syng_linecom = 'linecomment\c'
+
+" Expression used to check whether we should skip a match with searchpair().
+let s:skip_expr = "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'"
+
+let s:line_term = '\s*\%(\%(\/\/\).*\)\=$'
+
+" Regex that defines continuation lines, not including (, {, or [.
+let s:continuation_regex = '\%([\\*+/.:]\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\|[^=]=[^=].*,\)' . s:line_term
+
+" Regex that defines continuation lines.
+" TODO: this needs to deal with if ...: and so on
+let s:msl_regex = s:continuation_regex
+
+let s:one_line_scope_regex = '\<\%(if\|else\|for\|while\)\>[^{;]*' . s:line_term
+
+" Regex that defines blocks.
+let s:block_regex = '\%([{[]\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term
+
+let s:var_stmt = '^\s*var'
+
+let s:comma_first = '^\s*,'
+let s:comma_last = ',\s*$'
+
+let s:ternary = '^\s\+[?|:]'
+let s:ternary_q = '^\s\+?'
+
+" 2. Auxiliary Functions {{{1
+" ======================
+
+" Check if the character at lnum:col is inside a string, comment, or is ascii.
+function s:IsInStringOrComment(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
+endfunction
+
+" Check if the character at lnum:col is inside a string.
+function s:IsInString(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string
+endfunction
+
+" Check if the character at lnum:col is inside a multi-line comment.
+function s:IsInMultilineComment(lnum, col)
+ return !s:IsLineComment(a:lnum, a:col) && synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_multiline
+endfunction
+
+" Check if the character at lnum:col is a line comment.
+function s:IsLineComment(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_linecom
+endfunction
+
+" Find line above 'lnum' that isn't empty, in a comment, or in a string.
+function s:PrevNonBlankNonString(lnum)
+ let in_block = 0
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ " Go in and out of blocks comments as necessary.
+ " If the line isn't empty (with opt. comment) or in a string, end search.
+ let line = getline(lnum)
+ if line =~ '/\*'
+ if in_block
+ let in_block = 0
+ else
+ break
+ endif
+ elseif !in_block && line =~ '\*/'
+ let in_block = 1
+ elseif !in_block && line !~ '^\s*\%(//\).*$' && !(s:IsInStringOrComment(lnum, 1) && s:IsInStringOrComment(lnum, strlen(line)))
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+" Find line above 'lnum' that started the continuation 'lnum' may be part of.
+function s:GetMSL(lnum, in_one_line_scope)
+ " Start on the line we're at and use its indent.
+ let msl = a:lnum
+ let lnum = s:PrevNonBlankNonString(a:lnum - 1)
+ while lnum > 0
+ " If we have a continuation line, or we're in a string, use line as MSL.
+ " Otherwise, terminate search as we have found our MSL already.
+ let line = getline(lnum)
+ let col = match(line, s:msl_regex) + 1
+ if (col > 0 && !s:IsInStringOrComment(lnum, col)) || s:IsInString(lnum, strlen(line))
+ let msl = lnum
+ else
+ " Don't use lines that are part of a one line scope as msl unless the
+ " flag in_one_line_scope is set to 1
+ "
+ if a:in_one_line_scope
+ break
+ end
+ let msl_one_line = s:Match(lnum, s:one_line_scope_regex)
+ if msl_one_line == 0
+ break
+ endif
+ endif
+ let lnum = s:PrevNonBlankNonString(lnum - 1)
+ endwhile
+ return msl
+endfunction
+
+function s:RemoveTrailingComments(content)
+ let single = '\/\/\(.*\)\s*$'
+ let multi = '\/\*\(.*\)\*\/\s*$'
+ return substitute(substitute(a:content, single, '', ''), multi, '', '')
+endfunction
+
+" Find if the string is inside var statement (but not the first string)
+function s:InMultiVarStatement(lnum)
+ let lnum = s:PrevNonBlankNonString(a:lnum - 1)
+
+" let type = synIDattr(synID(lnum, indent(lnum) + 1, 0), 'name')
+
+ " loop through previous expressions to find a var statement
+ while lnum > 0
+ let line = getline(lnum)
+
+ " if the line is a js keyword
+ if (line =~ s:js_keywords)
+ " check if the line is a var stmt
+ " if the line has a comma first or comma last then we can assume that we
+ " are in a multiple var statement
+ if (line =~ s:var_stmt)
+ return lnum
+ endif
+
+ " other js keywords, not a var
+ return 0
+ endif
+
+ let lnum = s:PrevNonBlankNonString(lnum - 1)
+ endwhile
+
+ " beginning of program, not a var
+ return 0
+endfunction
+
+" Find line above with beginning of the var statement or returns 0 if it's not
+" this statement
+function s:GetVarIndent(lnum)
+ let lvar = s:InMultiVarStatement(a:lnum)
+ let prev_lnum = s:PrevNonBlankNonString(a:lnum - 1)
+
+ if lvar
+ let line = s:RemoveTrailingComments(getline(prev_lnum))
+
+ " if the previous line doesn't end in a comma, return to regular indent
+ if (line !~ s:comma_last)
+ return indent(prev_lnum) - shiftwidth()
+ else
+ return indent(lvar) + shiftwidth()
+ endif
+ endif
+
+ return -1
+endfunction
+
+
+" Check if line 'lnum' has more opening brackets than closing ones.
+function s:LineHasOpeningBrackets(lnum)
+ let open_0 = 0
+ let open_2 = 0
+ let open_4 = 0
+ let line = getline(a:lnum)
+ let pos = match(line, '[][(){}]', 0)
+ while pos != -1
+ if !s:IsInStringOrComment(a:lnum, pos + 1)
+ let idx = stridx('(){}[]', line[pos])
+ if idx % 2 == 0
+ let open_{idx} = open_{idx} + 1
+ else
+ let open_{idx - 1} = open_{idx - 1} - 1
+ endif
+ endif
+ let pos = match(line, '[][(){}]', pos + 1)
+ endwhile
+ return (open_0 > 0) . (open_2 > 0) . (open_4 > 0)
+endfunction
+
+function s:Match(lnum, regex)
+ let col = match(getline(a:lnum), a:regex) + 1
+ return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0
+endfunction
+
+function s:IndentWithContinuation(lnum, ind, width)
+ " Set up variables to use and search for MSL to the previous line.
+ let p_lnum = a:lnum
+ let lnum = s:GetMSL(a:lnum, 1)
+ let line = getline(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 p_lnum != lnum
+ if s:Match(p_lnum,s:continuation_regex)||s:IsInString(p_lnum,strlen(line))
+ return a:ind
+ endif
+ endif
+
+ " Set up more variables now that we know we aren't continuation bound.
+ let msl_ind = indent(lnum)
+
+ " If the previous line ended with [*+/.-=], start a continuation that
+ " indents an extra level.
+ if s:Match(lnum, s:continuation_regex)
+ if lnum == p_lnum
+ return msl_ind + a:width
+ else
+ return msl_ind
+ endif
+ endif
+
+ return a:ind
+endfunction
+
+function s:InOneLineScope(lnum)
+ let msl = s:GetMSL(a:lnum, 1)
+ if msl > 0 && s:Match(msl, s:one_line_scope_regex)
+ return msl
+ endif
+ return 0
+endfunction
+
+function s:ExitingOneLineScope(lnum)
+ let msl = s:GetMSL(a:lnum, 1)
+ if msl > 0
+ " if the current line is in a one line scope ..
+ if s:Match(msl, s:one_line_scope_regex)
+ return 0
+ else
+ let prev_msl = s:GetMSL(msl - 1, 1)
+ if s:Match(prev_msl, s:one_line_scope_regex)
+ return prev_msl
+ endif
+ endif
+ endif
+ return 0
+endfunction
+
+" 3. GetTypescriptIndent Function {{{1
+" =========================
+
+function GetTypescriptIndent()
+ " 3.1. Setup {{{2
+ " ----------
+
+ " Set up variables for restoring position in file. Could use v:lnum here.
+ let vcol = col('.')
+
+ " 3.2. Work on the current line {{{2
+ " -----------------------------
+
+ let ind = -1
+ " Get the current line.
+ let line = getline(v:lnum)
+ " previous nonblank line number
+ let prevline = prevnonblank(v:lnum - 1)
+
+ " 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.
+ let col = matchend(line, '^\s*[],})]')
+ if col > 0 && !s:IsInStringOrComment(v:lnum, col)
+ call cursor(v:lnum, col)
+
+ let lvar = s:InMultiVarStatement(v:lnum)
+ if lvar
+ let prevline_contents = s:RemoveTrailingComments(getline(prevline))
+
+ " check for comma first
+ if (line[col - 1] =~ ',')
+ " if the previous line ends in comma or semicolon don't indent
+ if (prevline_contents =~ '[;,]\s*$')
+ return indent(s:GetMSL(line('.'), 0))
+ " get previous line indent, if it's comma first return prevline indent
+ elseif (prevline_contents =~ s:comma_first)
+ return indent(prevline)
+ " otherwise we indent 1 level
+ else
+ return indent(lvar) + shiftwidth()
+ endif
+ endif
+ endif
+
+
+ let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2)
+ if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0
+ if line[col-1]==')' && col('.') != col('$') - 1
+ let ind = virtcol('.')-1
+ else
+ let ind = indent(s:GetMSL(line('.'), 0))
+ endif
+ endif
+ return ind
+ endif
+
+ " If the line is comma first, dedent 1 level
+ if (getline(prevline) =~ s:comma_first)
+ return indent(prevline) - shiftwidth()
+ endif
+
+ if (line =~ s:ternary)
+ if (getline(prevline) =~ s:ternary_q)
+ return indent(prevline)
+ else
+ return indent(prevline) + shiftwidth()
+ endif
+ endif
+
+ " If we are in a multi-line comment, cindent does the right thing.
+ if s:IsInMultilineComment(v:lnum, 1) && !s:IsLineComment(v:lnum, 1)
+ return cindent(v:lnum)
+ endif
+
+ " Check for multiple var assignments
+" let var_indent = s:GetVarIndent(v:lnum)
+" if var_indent >= 0
+" return var_indent
+" endif
+
+ " 3.3. Work on the previous line. {{{2
+ " -------------------------------
+
+ " If the line is empty and the previous nonblank line was a multi-line
+ " comment, use that comment's indent. Deduct one char to account for the
+ " space in ' */'.
+ if line =~ '^\s*$' && s:IsInMultilineComment(prevline, 1)
+ return indent(prevline) - 1
+ endif
+
+ " Find a non-blank, non-multi-line string line above the current line.
+ let lnum = s:PrevNonBlankNonString(v:lnum - 1)
+
+ " If the line is empty and inside a string, use the previous line.
+ if line =~ '^\s*$' && lnum != prevline
+ return indent(prevnonblank(v:lnum))
+ endif
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Set up variables for current line.
+ let line = getline(lnum)
+ let ind = indent(lnum)
+
+ " 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, 0)) + shiftwidth()
+ endif
+
+ " If the previous line contained an opening bracket, and we are still in it,
+ " add indent depending on the bracket type.
+ if line =~ '[[({]'
+ let counts = s:LineHasOpeningBrackets(lnum)
+ if counts[0] == '1' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
+ if col('.') + 1 == col('$')
+ return ind + shiftwidth()
+ else
+ return virtcol('.')
+ endif
+ elseif counts[1] == '1' || counts[2] == '1'
+ return ind + shiftwidth()
+ else
+ call cursor(v:lnum, vcol)
+ end
+ endif
+
+ " 3.4. Work on the MSL line. {{{2
+ " --------------------------
+
+ let ind_con = ind
+ let ind = s:IndentWithContinuation(lnum, ind_con, shiftwidth())
+
+ " }}}2
+ "
+ "
+ let ols = s:InOneLineScope(lnum)
+ if ols > 0
+ let ind = ind + shiftwidth()
+ else
+ let ols = s:ExitingOneLineScope(lnum)
+ while ols > 0 && ind > 0
+ let ind = ind - shiftwidth()
+ let ols = s:InOneLineScope(ols - 1)
+ endwhile
+ endif
+
+ return ind
+endfunction
+
+" }}}1
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+function! Fixedgq(lnum, count)
+ let l:tw = &tw ? &tw : 80
+
+ let l:count = a:count
+ let l:first_char = indent(a:lnum) + 1
+
+ if mode() == 'i' " gq was not pressed, but tw was set
+ return 1
+ endif
+
+ " This gq is only meant to do code with strings, not comments
+ if s:IsLineComment(a:lnum, l:first_char) || s:IsInMultilineComment(a:lnum, l:first_char)
+ return 1
+ endif
+
+ if len(getline(a:lnum)) < l:tw && l:count == 1 " No need for gq
+ return 1
+ endif
+
+ " Put all the lines on one line and do normal splitting after that
+ if l:count > 1
+ while l:count > 1
+ let l:count -= 1
+ normal J
+ endwhile
+ endif
+
+ let l:winview = winsaveview()
+
+ call cursor(a:lnum, l:tw + 1)
+ let orig_breakpoint = searchpairpos(' ', '', '\.', 'bcW', '', a:lnum)
+ call cursor(a:lnum, l:tw + 1)
+ let breakpoint = searchpairpos(' ', '', '\.', 'bcW', s:skip_expr, a:lnum)
+
+ " No need for special treatment, normal gq handles edgecases better
+ if breakpoint[1] == orig_breakpoint[1]
+ call winrestview(l:winview)
+ return 1
+ endif
+
+ " Try breaking after string
+ if breakpoint[1] <= indent(a:lnum)
+ call cursor(a:lnum, l:tw + 1)
+ let breakpoint = searchpairpos('\.', '', ' ', 'cW', s:skip_expr, a:lnum)
+ endif
+
+
+ if breakpoint[1] != 0
+ call feedkeys("r\<CR>")
+ else
+ let l:count = l:count - 1
+ endif
+
+ " run gq on new lines
+ if l:count == 1
+ call feedkeys("gqq")
+ endif
+
+ return 0
+endfunction
diff --git a/runtime/indent/vb.vim b/runtime/indent/vb.vim
new file mode 100644
index 0000000..bc7142f
--- /dev/null
+++ b/runtime/indent/vb.vim
@@ -0,0 +1,155 @@
+" Vim indent file
+" Language: VisualBasic (ft=vb) / Basic (ft=basic) / SaxBasic (ft=vb)
+" Author: Johannes Zellner <johannes@zellner.org>
+" Maintainer: Michael Soyka (mssr953@gmail.com)
+" Last Change: Fri, 18 Jun 2004 07:22:42 CEST
+" Small update 2010 Jul 28 by Maxim Kim
+" 2022/12/15: add support for multiline statements.
+" 2022/12/21: move VbGetIndent from global to script-local scope
+" 2022/12/26: recognize "Type" keyword
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=s:VbGetIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+==~else,=~elseif,=~end,=~wend,=~case,=~next,=~select,=~loop
+
+let b:undo_indent = "set ai< indentexpr< indentkeys<"
+
+" Only define the function once.
+if exists("*s:VbGetIndent")
+ finish
+endif
+
+function s:VbGetIndent(lnum)
+ let this_lnum = a:lnum
+ let this_line = getline(this_lnum)
+
+ " labels and preprocessor get zero indent immediately
+ let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)'
+ if this_line =~? LABELS_OR_PREPROC
+ return 0
+ endif
+
+ " Get the current value of "shiftwidth"
+ let bShiftwidth = shiftwidth()
+
+ " Find a non-blank line above the current line.
+ " Skip over labels and preprocessor directives.
+ let lnum = this_lnum
+ while lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ let previous_line = getline(lnum)
+ if previous_line !~? LABELS_OR_PREPROC
+ break
+ endif
+ endwhile
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Variable "previous_line" now contains the text in buffer line "lnum".
+
+ " Multi-line statements have the underscore character at end-of-line:
+ "
+ " object.method(arguments, _
+ " arguments, _
+ " arguments)
+ "
+ " and require extra logic to determine the correct indentation.
+ "
+ " Case 1: Line "lnum" is the first line of a multiline statement.
+ " Line "lnum" will have a trailing underscore character
+ " but the preceding non-blank line does not.
+ " Line "this_lnum" will be indented relative to "lnum".
+ "
+ " Case 2: Line "lnum" is the last line of a multiline statement.
+ " Line "lnum" will not have a trailing underscore character
+ " but the preceding non-blank line will.
+ " Line "this_lnum" will have the same indentation as the starting
+ " line of the multiline statement.
+ "
+ " Case 3: Line "lnum" is neither the first nor last line.
+ " Lines "lnum" and "lnum-1" will have a trailing underscore
+ " character.
+ " Line "this_lnum" will have the same indentation as the preceding
+ " line.
+ "
+ " No matter which case it is, the starting line of the statement must be
+ " found. It will be assumed that multiline statements cannot have
+ " intermingled comments, statement labels, preprocessor directives or
+ " blank lines.
+ "
+ let lnum_is_continued = (previous_line =~ '_$')
+ if lnum > 1
+ let before_lnum = prevnonblank(lnum-1)
+ let before_previous_line = getline(before_lnum)
+ else
+ let before_lnum = 0
+ let before_previous_line = ""
+ endif
+
+ if before_previous_line !~ '_$'
+ " Variable "previous_line" contains the start of a statement.
+ "
+ let ind = indent(lnum)
+ if lnum_is_continued
+ let ind += bShiftwidth
+ endif
+ elseif ! lnum_is_continued
+ " Line "lnum" contains the last line of a multiline statement.
+ " Need to find where this multiline statement begins
+ "
+ while before_lnum > 0
+ let before_lnum -= 1
+ if getline(before_lnum) !~ '_$'
+ let before_lnum += 1
+ break
+ endif
+ endwhile
+ if before_lnum == 0
+ let before_lnum = 1
+ endif
+ let previous_line = getline(before_lnum)
+ let ind = indent(before_lnum)
+ else
+ " Line "lnum" is not the first or last line of a multiline statement.
+ "
+ let ind = indent(lnum)
+ endif
+
+ " Add
+ if previous_line =~? '^\s*\<\(begin\|\%(\%(private\|public\|friend\)\s\+\)\=\%(function\|sub\|property\|enum\|type\)\|select\|case\|default\|if\|else\|elseif\|do\|for\|while\|with\)\>'
+ let ind = ind + bShiftwidth
+ endif
+
+ " Subtract
+ if this_line =~? '^\s*\<end\>\s\+\<select\>'
+ if previous_line !~? '^\s*\<select\>'
+ let ind = ind - 2 * bShiftwidth
+ else
+ " this case is for an empty 'select' -- 'end select'
+ " (w/o any case statements) like:
+ "
+ " select case readwrite
+ " end select
+ let ind = ind - bShiftwidth
+ endif
+ elseif this_line =~? '^\s*\<\(end\|else\|elseif\|until\|loop\|next\|wend\)\>'
+ let ind = ind - bShiftwidth
+ elseif this_line =~? '^\s*\<\(case\|default\)\>'
+ if previous_line !~? '^\s*\<select\>'
+ let ind = ind - bShiftwidth
+ endif
+ endif
+
+ return ind
+endfunction
+
+" vim:sw=4
diff --git a/runtime/indent/verilog.vim b/runtime/indent/verilog.vim
new file mode 100644
index 0000000..e81197c
--- /dev/null
+++ b/runtime/indent/verilog.vim
@@ -0,0 +1,229 @@
+" Language: Verilog HDL
+" 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:
+" b:verilog_indent_modules : indenting after the declaration
+" of module blocks
+" b:verilog_indent_width : indenting width
+" b:verilog_indent_verbose : verbose to each indenting
+"
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+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+==endconfig,=endgenerate,=endprimitive,=endtable
+setlocal indentkeys+==`else,=`elsif,=`endif
+
+" Only define the function once.
+if exists("*GetVerilogIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+function GetVerilogIndent()
+
+ if exists('b:verilog_indent_width')
+ let offset = b:verilog_indent_width
+ else
+ let offset = shiftwidth()
+ endif
+ if exists('b:verilog_indent_modules')
+ let indent_modules = offset
+ else
+ let indent_modules = 0
+ endif
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let lnum2 = prevnonblank(lnum - 1)
+ let curr_line = getline(v:lnum)
+ let last_line = getline(lnum)
+ let last_line2 = getline(lnum2)
+ let ind = indent(lnum)
+ let ind2 = indent(lnum - 1)
+ let offset_comment1 = 1
+ " Define the condition of an open statement
+ " Exclude the match of //, /* or */
+ let vlog_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)'
+ " Define the condition when the statement ends with a one-line comment
+ let vlog_comment = '\(//.*\|/\*.*\*/\s*\)'
+ if exists('b:verilog_indent_verbose')
+ let vverb_str = 'INDENT VERBOSE:'
+ let vverb = 1
+ else
+ let vverb = 0
+ endif
+
+ " Indent according to last line
+ " End of multiple-line comment
+ if last_line =~ '\*/\s*$' && last_line !~ '/\*.\{-}\*/'
+ let ind = ind - offset_comment1
+ if vverb
+ echo vverb_str "De-indent after a multiple-line comment."
+ endif
+
+ " Indent after if/else/for/case/always/initial/specify/fork blocks
+ " 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\)\>'
+ if last_line !~ '\(;\|\<end\>\)\s*' . vlog_comment . '*$' ||
+ \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$'
+ let ind = ind + offset
+ if vverb | echo vverb_str "Indent after a block statement." | endif
+ endif
+ " 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
+ if vverb
+ echo vverb_str "Indent after function/task block statement."
+ endif
+ endif
+
+ " Indent after module/function/task/specify/fork blocks
+ elseif last_line =~ '^\s*\<module\>'
+ let ind = ind + indent_modules
+ if vverb && indent_modules
+ echo vverb_str "Indent after module statement."
+ endif
+ if last_line =~ '[(,]\s*' . vlog_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*[(,]\s*' . vlog_comment . '*$'
+ let ind = ind + offset
+ if vverb
+ echo vverb_str "Indent after a multiple-line module statement."
+ endif
+ endif
+
+ " Indent after a 'begin' statement
+ elseif last_line =~ '\(\<begin\>\)\(\s*:\s*\w\+\)*' . vlog_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*\(\<begin\>\)' &&
+ \ ( last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' ||
+ \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . vlog_comment . '*$' )
+ let ind = ind + offset
+ if vverb | echo vverb_str "Indent after begin statement." | endif
+
+ " De-indent for the end of one-line block
+ elseif ( last_line !~ '\<begin\>' ||
+ \ last_line =~ '\(//\|/\*\).*\<begin\>' ) &&
+ \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>.*' .
+ \ vlog_comment . '*$' &&
+ \ last_line2 !~
+ \ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>' &&
+ \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
+ \ ( last_line2 !~ '\<begin\>' ||
+ \ last_line2 =~ '\(//\|/\*\).*\<begin\>' )
+ let ind = ind - offset
+ if vverb
+ echo vverb_str "De-indent after the end of one-line statement."
+ endif
+
+ " Multiple-line statement (including case statement)
+ " Open statement
+ " Ident the first open line
+ elseif last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*' . vlog_openstat . '\s*$' &&
+ \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$'
+ let ind = ind + offset
+ if vverb | echo vverb_str "Indent after an open statement." | endif
+
+ " Close statement
+ " De-indent for an optional close parenthesis and a semicolon, and only
+ " if there exists precedent non-whitespace char
+ elseif last_line =~ ')*\s*;\s*' . vlog_comment . '*$' &&
+ \ last_line !~ '^\s*)*\s*;\s*' . vlog_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . vlog_comment . '*$' &&
+ \ ( last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
+ \ last_line2 !~ ';\s*//.*$') &&
+ \ last_line2 !~ '^\s*' . vlog_comment . '$'
+ let ind = ind - offset
+ if vverb | echo vverb_str "De-indent after a close statement." | endif
+
+ " `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 `ifndef or `elsif or `else statement."
+ endif
+
+ endif
+
+ " Re-indent current line
+
+ " 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*\<\(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\>'
+ let ind = ind - indent_modules
+ if vverb && indent_modules
+ echo vverb_str "De-indent the end of a module."
+ endif
+
+ " De-indent on a stand-alone 'begin'
+ elseif curr_line =~ '^\s*\<begin\>'
+ 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\)\>' ||
+ \ last_line =~ ')\s*' . vlog_comment . '*$' ||
+ \ last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' )
+ let ind = ind - offset
+ if vverb
+ echo vverb_str "De-indent a stand alone begin statement."
+ endif
+ endif
+
+ " De-indent after the end of multiple-line statement
+ elseif curr_line =~ '^\s*)' &&
+ \ ( last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' ||
+ \ last_line !~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
+ \ last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' )
+ let ind = ind - offset
+ if vverb
+ echo vverb_str "De-indent the end of a multiple statement."
+ 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 `elsif or `else or `endif statement." | endif
+
+ endif
+
+ " Return the indentation
+ return ind
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:sw=2
diff --git a/runtime/indent/vhdl.vim b/runtime/indent/vhdl.vim
new file mode 100644
index 0000000..ad31806
--- /dev/null
+++ b/runtime/indent/vhdl.vim
@@ -0,0 +1,435 @@
+" VHDL indent ('93 syntax)
+" Language: VHDL
+" Maintainer: Gerald Lai <laigera+vim?gmail.com>
+" 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
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" setup indent options for local VHDL buffer
+setlocal indentexpr=GetVHDLindent()
+setlocal indentkeys=!^F,o,O,0(,0)
+setlocal indentkeys+==~begin,=~end\ ,=~end\ ,=~is,=~select,=~when
+setlocal indentkeys+==~if,=~then,=~elsif,=~else
+setlocal indentkeys+==~case,=~loop,=~for,=~generate,=~record,=~units,=~process,=~block,=~function,=~component,=~procedure
+setlocal indentkeys+==~architecture,=~configuration,=~entity,=~package
+
+" constants
+" not a comment
+let s:NC = '\%(--.*\)\@<!'
+" end of string
+let s:ES = '\s*\%(--.*\)\=$'
+" no "end" keyword in front
+let s:NE = '\%(\<end\s\+\)\@<!'
+
+" option to disable alignment of generic/port mappings
+if !exists("g:vhdl_indent_genportmap")
+ let g:vhdl_indent_genportmap = 1
+endif
+
+" option to disable alignment of right-hand side assignment "<=" statements
+if !exists("g:vhdl_indent_rhsassign")
+ let g:vhdl_indent_rhsassign = 1
+endif
+
+" only define indent function once
+if exists("*GetVHDLindent")
+ finish
+endif
+
+function GetVHDLindent()
+ " store current line & string
+ let curn = v:lnum
+ let curs = getline(curn)
+
+ " find previous line that is not a comment
+ let prevn = prevnonblank(curn - 1)
+ let prevs = getline(prevn)
+ while prevn > 0 && prevs =~ '^\s*--'
+ let prevn = prevnonblank(prevn - 1)
+ let prevs = getline(prevn)
+ endwhile
+ let prevs_noi = substitute(prevs, '^\s*', '', '')
+
+ " default indent starts as previous non-comment line's indent
+ let ind = prevn > 0 ? indent(prevn) : 0
+ " backup default
+ let ind2 = ind
+
+ " indent: special; kill string so it would not affect other filters
+ " keywords: "report" + string
+ " where: anywhere in current or previous line
+ let s0 = s:NC.'\<report\>\s*".*"'
+ if curs =~? s0
+ let curs = ""
+ endif
+ if prevs =~? s0
+ let prevs = ""
+ endif
+
+ " indent: previous line's comment position, otherwise follow next non-comment line if possible
+ " keyword: "--"
+ " where: start of current line
+ if curs =~ '^\s*--'
+ let pn = curn - 1
+ let ps = getline(pn)
+ if curs =~ '^\s*--\s' && ps =~ '--'
+ return indent(pn) + stridx(substitute(ps, '^\s*', '', ''), '--')
+ else
+ " find nextnonblank line that is not a comment
+ let nn = nextnonblank(curn + 1)
+ let ns = getline(nn)
+ while nn > 0 && ns =~ '^\s*--'
+ let nn = nextnonblank(nn + 1)
+ let ns = getline(nn)
+ endwhile
+ let n = indent(nn)
+ return n != -1 ? n : ind
+ endif
+ endif
+
+ " ****************************************************************************************
+ " indent: align generic variables & port names
+ " keywords: "procedure" + name, "generic", "map", "port" + "(", provided current line is part of mapping
+ " where: anywhere in previous 2 lines
+ " find following previous non-comment line
+ let pn = prevnonblank(prevn - 1)
+ let ps = getline(pn)
+ while pn > 0 && ps =~ '^\s*--'
+ 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\+\|:[^=]\@=\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, '(')
+ endif
+ let m = matchend(prevs_noi, '(\s*\ze\w')
+ if m != -1
+ return ind2 + m
+ else
+ if g:vhdl_indent_genportmap
+ return ind2 + stridx(prevs_noi, '(') + shiftwidth()
+ else
+ return ind2 + shiftwidth()
+ endif
+ endif
+ endif
+
+ " indent: align conditional/select statement
+ " keywords: variable + "<=" without ";" ending
+ " where: start of previous line
+ if prevs =~? '^\s*\S\+\s*<=[^;]*'.s:ES
+ if g:vhdl_indent_rhsassign
+ return ind2 + matchend(prevs_noi, '<=\s*\ze.')
+ else
+ return ind2 + shiftwidth()
+ endif
+ endif
+
+ " indent: backtrace previous non-comment lines for next smaller or equal size indent
+ " keywords: "end" + "record", "units"
+ " where: start of previous line
+ " keyword: ")"
+ " where: start of previous line
+ " keyword: without "<=" + ";" ending
+ " where: anywhere in previous line
+ " keyword: "=>" + ")" ending, provided current line does not begin with ")"
+ " where: anywhere in previous line
+ " _note_: indent allowed to leave this filter
+ let m = 0
+ if prevs =~? '^\s*end\s\+\%(record\|units\)\>'
+ let m = 3
+ elseif prevs =~ '^\s*)'
+ let m = 1
+ elseif prevs =~ s:NC.'\%(<=.*\)\@<!;'.s:ES || (curs !~ '^\s*)' && prevs =~ s:NC.'=>.*'.s:NC.')'.s:ES)
+ let m = 2
+ endif
+
+ if m > 0
+ let pn = prevnonblank(prevn - 1)
+ let ps = getline(pn)
+ while pn > 0
+ let t = indent(pn)
+ if ps !~ '^\s*--' && (t < ind || (t == ind && m == 3))
+ " make sure one of these is true
+ " keywords: variable + "<=" without ";" ending
+ " where: start of previous non-comment line
+ " keywords: "procedure", "generic", "map", "port"
+ " where: anywhere in previous non-comment line
+ " keyword: "("
+ " where: start of previous non-comment line
+ if m < 3 && ps !~? '^\s*\S\+\s*<=[^;]*'.s:ES
+ if ps =~? s:NC.'\<\%(procedure\|generic\|map\|port\)\>' || ps =~ '^\s*('
+ let ind = t
+ endif
+ break
+ endif
+ let ind = t
+ if m > 1
+ " find following previous non-comment line
+ let ppn = prevnonblank(pn - 1)
+ let pps = getline(ppn)
+ while ppn > 0 && pps =~ '^\s*--'
+ let ppn = prevnonblank(ppn - 1)
+ let pps = getline(ppn)
+ endwhile
+ " indent: follow
+ " keyword: "select"
+ " where: end of following previous non-comment line
+ " keyword: "type"
+ " where: start of following previous non-comment line
+ if m == 2
+ let s1 = s:NC.'\<select'.s:ES
+ if ps !~? s1 && pps =~? s1
+ let ind = indent(ppn)
+ endif
+ elseif m == 3
+ let s1 = '^\s*type\>'
+ if ps !~? s1 && pps =~? s1
+ let ind = indent(ppn)
+ endif
+ endif
+ endif
+ break
+ endif
+ let pn = prevnonblank(pn - 1)
+ let ps = getline(pn)
+ endwhile
+ endif
+
+ " indent: follow indent of previous opening statement, otherwise -sw
+ " keyword: "begin"
+ " where: anywhere in current line
+ if curs =~? s:NC.'\<begin\>'
+ " find previous opening statement of
+ " keywords: "architecture", "block", "entity", "function", "generate", "procedure", "process"
+ let s2 = s:NC.s:NE.'\<\%(architecture\|block\|entity\|function\|generate\|procedure\|process\)\>'
+
+ let pn = prevnonblank(curn - 1)
+ let ps = getline(pn)
+ while pn > 0 && (ps =~ '^\s*--' || ps !~? s2)
+ let pn = prevnonblank(pn - 1)
+ let ps = getline(pn)
+
+ if (ps =~? s:NC.'\<begin\>')
+ return indent(pn) - shiftwidth()
+ endif
+ endwhile
+
+ if (pn == 0)
+ return ind - shiftwidth()
+ else
+ return indent(pn)
+ endif
+ endif
+
+ " indent: +sw if previous line is previous opening statement
+ " keywords: "record", "units"
+ " where: anywhere in current line
+ if curs =~? s:NC.s:NE.'\<\%(record\|units\)\>'
+ " find previous opening statement of
+ " keyword: "type"
+ let s3 = s:NC.s:NE.'\<type\>'
+ if curs !~? s3.'.*'.s:NC.'\<\%(record\|units\)\>.*'.s:ES && prevs =~? s3
+ let ind = ind + shiftwidth()
+ endif
+ return ind
+ endif
+
+ " ****************************************************************************************
+ " indent: 0
+ " keywords: "architecture", "configuration", "entity", "library", "package"
+ " where: start of current line
+ if curs =~? '^\s*\%(architecture\|configuration\|entity\|library\|package\)\>'
+ return 0
+ endif
+
+ " indent: maintain indent of previous opening statement
+ " keyword: "is"
+ " where: start of current line
+ " find previous opening statement of
+ " keywords: "architecture", "block", "configuration", "entity", "function", "package", "procedure", "process", "type"
+ if curs =~? '^\s*\<is\>' && prevs =~? s:NC.s:NE.'\<\%(architecture\|block\|configuration\|entity\|function\|package\|procedure\|process\|type\)\>'
+ return ind2
+ endif
+
+ " indent: maintain indent of previous opening statement
+ " keyword: "then"
+ " where: start of current line
+ " find previous opening statement of
+ " keywords: "elsif", "if"
+ if curs =~? '^\s*\<then\>' && prevs =~? s:NC.'\%(\<elsif\>\|'.s:NE.'\<if\>\)'
+ return ind2
+ endif
+
+ " indent: maintain indent of previous opening statement
+ " keyword: "generate"
+ " where: start of current line
+ " find previous opening statement of
+ " keywords: "for", "if"
+ if curs =~? '^\s*\<generate\>' && prevs =~? s:NC.s:NE.'\%(\%(\<wait\s\+\)\@<!\<for\|\<if\)\>'
+ return ind2
+ endif
+
+ " indent: +sw
+ " keywords: "block", "process"
+ " removed: "begin", "case", "elsif", "if", "loop", "record", "units", "while"
+ " where: anywhere in previous line
+ if prevs =~? s:NC.s:NE.'\<\%(block\|process\)\>'
+ return ind + shiftwidth()
+ endif
+
+ " indent: +sw
+ " keywords: "architecture", "configuration", "entity", "package"
+ " removed: "component", "for", "when", "with"
+ " where: start of previous line
+ if prevs =~? '^\s*\%(architecture\|configuration\|entity\|package\)\>'
+ return ind + shiftwidth()
+ endif
+
+ " indent: +sw
+ " keyword: "select"
+ " removed: "generate", "is", "=>"
+ " where: end of previous line
+ if prevs =~? s:NC.'\<select'.s:ES
+ return ind + shiftwidth()
+ endif
+
+ " indent: +sw
+ " keyword: "begin", "loop", "record", "units"
+ " where: anywhere in previous line
+ " keyword: "component", "else", "for"
+ " where: start of previous line
+ " keyword: "generate", "is", "then", "=>"
+ " 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 + shiftwidth()
+ endif
+
+ " ****************************************************************************************
+ " indent: -sw
+ " keywords: "when", provided previous line does not begin with "when", does not end with "is"
+ " where: start of current line
+ let s4 = '^\s*when\>'
+ if curs =~? s4
+ if prevs =~? s:NC.'\<is'.s:ES
+ return ind
+ elseif prevs !~? s4
+ return ind - shiftwidth()
+ else
+ return ind2
+ endif
+ endif
+
+ " indent: -sw
+ " keywords: "else", "elsif", "end" + "block", "for", "function", "generate", "if", "loop", "procedure", "process", "record", "units"
+ " where: start of current line
+ let s5 = 'block\|for\|function\|generate\|if\|loop\|procedure\|process\|record\|units'
+ if curs =~? '^\s*\%(else\|elsif\|end\s\+\%('.s5.'\)\)\>'
+ if prevs =~? '^\s*\%(elsif\|'.s5.'\)'
+ return ind
+ else
+ return ind - shiftwidth()
+ endif
+ endif
+
+ " indent: backtrace previous non-comment lines
+ " keyword: "end" + "case", "component"
+ " where: start of current line
+ let m = 0
+ if curs =~? '^\s*end\s\+case\>'
+ let m = 1
+ elseif curs =~? '^\s*end\s\+component\>'
+ let m = 2
+ endif
+
+ if m > 0
+ " find following previous non-comment line
+ let pn = prevn
+ let ps = getline(pn)
+ while pn > 0
+ if ps !~ '^\s*--'
+ "indent: -2sw
+ "keywords: "end" + "case"
+ "where: start of previous non-comment line
+ "indent: -sw
+ "keywords: "when"
+ "where: start of previous non-comment line
+ "indent: follow
+ "keywords: "case"
+ "where: start of previous non-comment line
+ if m == 1
+ if ps =~? '^\s*end\s\+case\>'
+ return indent(pn) - 2 * shiftwidth()
+ elseif ps =~? '^\s*when\>'
+ return indent(pn) - shiftwidth()
+ elseif ps =~? '^\s*case\>'
+ return indent(pn)
+ endif
+ "indent: follow
+ "keyword: "component"
+ "where: start of previous non-comment line
+ elseif m == 2
+ if ps =~? '^\s*component\>'
+ return indent(pn)
+ endif
+ endif
+ endif
+ let pn = prevnonblank(pn - 1)
+ let ps = getline(pn)
+ endwhile
+ return ind - shiftwidth()
+ endif
+
+ " indent: -sw
+ " keyword: ")"
+ " where: start of current line
+ if curs =~ '^\s*)'
+ return ind - shiftwidth()
+ endif
+
+ " indent: 0
+ " keywords: "end" + "architecture", "configuration", "entity", "package"
+ " where: start of current line
+ if curs =~? '^\s*end\s\+\%(architecture\|configuration\|entity\|package\)\>'
+ return 0
+ endif
+
+ " indent: -sw
+ " keywords: "end" + identifier, ";"
+ " where: start of current line
+ "if curs =~? '^\s*end\s\+\w\+\>'
+ if curs =~? '^\s*end\%(\s\|;'.s:ES.'\)'
+ return ind - shiftwidth()
+ endif
+
+ " ****************************************************************************************
+ " indent: maintain indent of previous opening statement
+ " keywords: without "procedure", "generic", "map", "port" + ":" but not ":=" + "in", "out", "inout", "buffer", "linkage", variable & ":="
+ " where: start of current line
+ if curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\w\+\s\+:=\)'
+ 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
new file mode 100644
index 0000000..7b45d41
--- /dev/null
+++ b/runtime/indent/vim.vim
@@ -0,0 +1,22 @@
+vim9script
+
+# Vim indent file
+# Language: Vim script
+# Maintainer: Bram Moolenaar <Bram@vim.org>
+# Last Change: 2023 Feb 02
+
+# Only load this indent file when no other was loaded.
+if exists('b:did_indent')
+ finish
+endif
+
+b:did_indent = true
+b:undo_indent = 'setlocal indentkeys< indentexpr<'
+
+import autoload '../autoload/dist/vimindent.vim'
+
+setlocal indentexpr=vimindent.Expr()
+setlocal indentkeys+==endif,=enddef,=endfu,=endfor,=endwh,=endtry,=endclass,=endinterface,=endenum,=},=else,=cat,=finall,=END,0\\
+execute('setlocal indentkeys+=0=\"\\\ ,0=#\\\ ')
+setlocal indentkeys-=0#
+setlocal indentkeys-=:
diff --git a/runtime/indent/vroom.vim b/runtime/indent/vroom.vim
new file mode 100644
index 0000000..d333e2c
--- /dev/null
+++ b/runtime/indent/vroom.vim
@@ -0,0 +1,21 @@
+" Vim indent file
+" Language: Vroom (vim testing and executable documentation)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-vroom)
+" Last Change: 2014 Jul 23
+
+if exists('b:did_indent')
+ finish
+endif
+let b:did_indent = 1
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+
+let b:undo_indent = 'setlocal autoindent<'
+
+setlocal autoindent
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/vue.vim b/runtime/indent/vue.vim
new file mode 100644
index 0000000..f6fe350
--- /dev/null
+++ b/runtime/indent/vue.vim
@@ -0,0 +1,14 @@
+" Vim indent file placeholder
+" Language: Vue
+" Maintainer: None, please volunteer if you have a real Vue indent script
+" Last Change: 2022 Dec 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+" don't set b:did_indent, otherwise html indenting won't be activated
+" let b:did_indent = 1
+
+" Html comes closest
+runtime! indent/html.vim
diff --git a/runtime/indent/wast.vim b/runtime/indent/wast.vim
new file mode 100644
index 0000000..1be234b
--- /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
new file mode 100644
index 0000000..834eb00
--- /dev/null
+++ b/runtime/indent/xf86conf.vim
@@ -0,0 +1,40 @@
+" Vim indent file
+" Language: XFree86 Configuration File
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2022 April 25
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetXF86ConfIndent()
+setlocal indentkeys=!^F,o,O,=End
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetXF86ConfIndent")
+ finish
+endif
+
+function GetXF86ConfIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ if getline(lnum) =~? '^\s*\(Sub\)\=Section\>'
+ let ind = ind + shiftwidth()
+ endif
+
+ if getline(v:lnum) =~? '^\s*End\(Sub\)\=Section\>'
+ let ind = ind - shiftwidth()
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/xhtml.vim b/runtime/indent/xhtml.vim
new file mode 100644
index 0000000..2197b79
--- /dev/null
+++ b/runtime/indent/xhtml.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: XHTML
+" Maintainer: Bram Moolenaar <Bram@vim.org> (for now)
+" Last Change: 2005 Jun 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Handled like HTML for now.
+runtime! indent/html.vim
diff --git a/runtime/indent/xinetd.vim b/runtime/indent/xinetd.vim
new file mode 100644
index 0000000..21000b7
--- /dev/null
+++ b/runtime/indent/xinetd.vim
@@ -0,0 +1,58 @@
+" Vim indent file
+" Language: xinetd.conf(5) configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2022 April 25
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetXinetdIndent()
+setlocal indentkeys=0{,0},!^F,o,O
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+if exists("*GetXinetdIndent")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+function s:count_braces(lnum, count_open)
+ let n_open = 0
+ let n_close = 0
+ let line = getline(a:lnum)
+ let pattern = '[{}]'
+ let i = match(line, pattern)
+ while i != -1
+ if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'ld\%(Comment\|String\)'
+ if line[i] == '{'
+ let n_open += 1
+ elseif line[i] == '}'
+ if n_open > 0
+ let n_open -= 1
+ else
+ let n_close += 1
+ endif
+ endif
+ endif
+ let i = match(line, pattern, i + 1)
+ endwhile
+ return a:count_open ? n_open : n_close
+endfunction
+
+function GetXinetdIndent()
+ let pnum = prevnonblank(v:lnum - 1)
+ if pnum == 0
+ return 0
+ endif
+
+ return indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
+ \ - s:count_braces(v:lnum, 0) * shiftwidth()
+endfunction
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/indent/xml.vim b/runtime/indent/xml.vim
new file mode 100644
index 0000000..5bf53ad
--- /dev/null
+++ b/runtime/indent/xml.vim
@@ -0,0 +1,218 @@
+" Language: XML
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Repository: https://github.com/chrisbra/vim-xml-ftplugin
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Changed: 2020 Nov 4th
+" Last Change:
+" 20200529 - Handle empty closing tags correctly
+" 20191202 - Handle docbk filetype
+" 20190726 - Correctly handle non-tagged data
+" 20190204 - correctly handle wrap tags
+" https://github.com/chrisbra/vim-xml-ftplugin/issues/5
+" 20190128 - Make sure to find previous tag
+" https://github.com/chrisbra/vim-xml-ftplugin/issues/4
+" 20181116 - Fix indentation when tags start with a colon or an underscore
+" https://github.com/vim/vim/pull/926
+" 20181022 - Do not overwrite indentkeys setting
+" https://github.com/chrisbra/vim-xml-ftplugin/issues/1
+" 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.
+" 2009-05-26 patch by Nikolai Weibull
+" TODO: implement pre-like tags, see xml_indent_open / xml_indent_close
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" [-- local settings (must come before aborting the script) --]
+" Attention: Parameter use_syntax_check is used by the docbk.vim indent script
+setlocal indentexpr=XmlIndentGet(v:lnum,1)
+setlocal indentkeys=o,O,*<Return>,<>>,<<>,/,{,},!^F
+" autoindent: used when the indentexpr returns -1
+setlocal autoindent
+
+let b:undo_indent = "setl ai< inde< indk<"
+
+if !exists('b:xml_indent_open')
+ let b:xml_indent_open = '.\{-}<[:A-Z_a-z]'
+ " pre tag, e.g. <address>
+ " let b:xml_indent_open = '.\{-}<[/]\@!\(address\)\@!'
+endif
+
+if !exists('b:xml_indent_close')
+ let b:xml_indent_close = '.\{-}</\|/>.\{-}'
+ " end pre tag, e.g. </address>
+ " let b:xml_indent_close = '.\{-}</\(address\)\@!'
+endif
+
+if !exists('b:xml_indent_continuation_filetype')
+ let b:xml_indent_continuation_filetype = 'xml'
+endif
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" [-- finish, if the function already exists --]
+if exists('*XmlIndentGet')
+ finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+fun! <SID>XmlIndentWithPattern(line, pat)
+ let s = substitute('x'.a:line, a:pat, "\1", 'g')
+ return strlen(substitute(s, "[^\1].*$", '', ''))
+endfun
+
+" [-- check if it's xml --]
+fun! <SID>XmlIndentSynCheck(lnum)
+ if &syntax != ''
+ let syn1 = synIDattr(synID(a:lnum, 1, 1), 'name')
+ let syn2 = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name')
+ if syn1 != '' && syn1 !~ 'xml' && syn2 != '' && syn2 !~ 'xml'
+ " don't indent pure non-xml code
+ return 0
+ endif
+ endif
+ return 1
+endfun
+
+" [-- return the sum of indents of a:lnum --]
+fun! <SID>XmlIndentSum(line, style, add)
+ if <SID>IsXMLContinuation(a:line) && a:style == 0 && !<SID>IsXMLEmptyClosingTag(a:line)
+ " no complete tag, add one additional indent level
+ " but only for the current line
+ return a:add + shiftwidth()
+ elseif <SID>HasNoTagEnd(a:line)
+ " no complete tag, return initial indent
+ return a:add
+ endif
+ if a:style == match(a:line, '^\s*</')
+ return (shiftwidth() *
+ \ (<SID>XmlIndentWithPattern(a:line, b:xml_indent_open)
+ \ - <SID>XmlIndentWithPattern(a:line, b:xml_indent_close)
+ \ - <SID>XmlIndentWithPattern(a:line, '.\{-}/>'))) + a:add
+ else
+ return a:add
+ endif
+endfun
+
+" Main indent function
+fun! XmlIndentGet(lnum, use_syntax_check)
+ " Find a non-empty line above the current line.
+ if prevnonblank(a:lnum - 1) == 0
+ " Hit the start of the file, use zero indent.
+ return 0
+ endif
+ " Find previous line with a tag (regardless whether open or closed,
+ " but always restrict the match to a line before the current one
+ " Note: xml declaration: <?xml version="1.0"?>
+ " won't be found, as it is not a legal tag name
+ let ptag_pattern = '\%(.\{-}<[/:A-Z_a-z]\)'. '\%(\&\%<'. a:lnum .'l\)'
+ let ptag = search(ptag_pattern, 'bnW')
+ " no previous tag
+ if ptag == 0
+ return 0
+ endif
+
+ let pline = getline(ptag)
+ let pind = indent(ptag)
+
+ let syn_name_start = '' " Syntax element at start of line (excluding whitespace)
+ let syn_name_end = '' " Syntax element at end of line
+ let curline = getline(a:lnum)
+ if a:use_syntax_check
+ let check_lnum = <SID>XmlIndentSynCheck(ptag)
+ let check_alnum = <SID>XmlIndentSynCheck(a:lnum)
+ if check_lnum == 0 || check_alnum == 0
+ return indent(a:lnum)
+ endif
+ let syn_name_end = synIDattr(synID(a:lnum, strlen(curline) - 1, 1), 'name')
+ let syn_name_start = synIDattr(synID(a:lnum, match(curline, '\S') + 1, 1), 'name')
+ let prev_syn_name_end = synIDattr(synID(ptag, strlen(pline) - 1, 1), 'name')
+ " not needed (yet?)
+ " let prev_syn_name_start = synIDattr(synID(ptag, match(pline, '\S') + 1, 1), 'name')
+ endif
+
+ if syn_name_end =~ 'Comment' && syn_name_start =~ 'Comment'
+ return <SID>XmlIndentComment(a:lnum)
+ elseif empty(syn_name_start) && empty(syn_name_end) && a:use_syntax_check
+ " non-xml tag content: use indent from 'autoindent'
+ if pline =~ b:xml_indent_close
+ return pind
+ elseif !empty(prev_syn_name_end)
+ " only indent by an extra shiftwidth, if the previous line ends
+ " with an XML like tag
+ return pind + shiftwidth()
+ else
+ " no extra indent, looks like a text continuation line
+ return pind
+ endif
+ endif
+
+ " Get indent from previous tag line
+ let ind = <SID>XmlIndentSum(pline, -1, pind)
+ " Determine indent from current line
+ let ind = <SID>XmlIndentSum(curline, 0, ind)
+ return ind
+endfun
+
+func! <SID>IsXMLContinuation(line)
+ " Checks, whether or not the line matches a start-of-tag
+ return a:line !~ '^\s*<' && &ft =~# b:xml_indent_continuation_filetype
+endfunc
+
+func! <SID>HasNoTagEnd(line)
+ " Checks whether or not the line matches '>' (so finishes a tag)
+ return a:line !~ '>\s*$'
+endfunc
+
+func! <SID>IsXMLEmptyClosingTag(line)
+ " Checks whether the line ends with an empty closing tag such as <lb/>
+ return a:line =~? '<[^>]*/>\s*$'
+endfunc
+
+" return indent for a commented line,
+" the middle part might be indented one additional level
+func! <SID>XmlIndentComment(lnum)
+ let ptagopen = search('.\{-}<[:A-Z_a-z]\_[^/]\{-}>.\{-}', 'bnW')
+ let ptagclose = search(b:xml_indent_close, 'bnW')
+ if getline(a:lnum) =~ '<!--'
+ " if previous tag was a closing tag, do not add
+ " one additional level of indent
+ if ptagclose > ptagopen && a:lnum > ptagclose
+ " If the previous tag was closed on the same line as it was
+ " declared, we should indent with its indent level.
+ if !<SID>IsXMLContinuation(getline(ptagclose))
+ return indent(ptagclose)
+ else
+ return indent(ptagclose) - shiftwidth()
+ endif
+ elseif ptagclose == ptagopen
+ return indent(ptagclose)
+ else
+ " start of comment, add one indentation level
+ return indent(ptagopen) + shiftwidth()
+ endif
+ elseif getline(a:lnum) =~ '-->'
+ " end of comment, same as start of comment
+ return indent(search('<!--', 'bnW'))
+ else
+ " middle part of comment, add one additional level
+ return indent(search('<!--', 'bnW')) + shiftwidth()
+ endif
+endfunc
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:ts=4 et sts=-1 sw=0
diff --git a/runtime/indent/xsd.vim b/runtime/indent/xsd.vim
new file mode 100644
index 0000000..59e0b60
--- /dev/null
+++ b/runtime/indent/xsd.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: .xsd files (XML Schema)
+" Maintainer: Nobody
+" Last Change: 2005 Jun 09
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use XML formatting rules
+runtime! indent/xml.vim
+
diff --git a/runtime/indent/xslt.vim b/runtime/indent/xslt.vim
new file mode 100644
index 0000000..ff93d69
--- /dev/null
+++ b/runtime/indent/xslt.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: XSLT .xslt files
+" Maintainer: David Fishburn <fishburn@ianywhere.com>
+" Last Change: Wed May 14 2003 8:48:41 PM
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use XML formatting rules
+runtime! indent/xml.vim
+
diff --git a/runtime/indent/yacc.vim b/runtime/indent/yacc.vim
new file mode 100644
index 0000000..253ccc5
--- /dev/null
+++ b/runtime/indent/yacc.vim
@@ -0,0 +1,44 @@
+" Vim indent file
+" Language: YACC input file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2022 April 25
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetYaccIndent()
+setlocal indentkeys=!^F,o,O
+setlocal nosmartindent
+
+let b:undo_indent = "setl inde< indk< si<"
+
+" Only define the function once.
+if exists("*GetYaccIndent")
+ finish
+endif
+
+function GetYaccIndent()
+ if v:lnum == 1
+ return 0
+ endif
+
+ let ind = indent(v:lnum - 1)
+ let line = getline(v:lnum - 1)
+
+ if line == ''
+ let ind = 0
+ elseif line =~ '^\w\+\s*:'
+ let ind = ind + matchend(line, '^\w\+\s*')
+ elseif line =~ '^\s*;'
+ let ind = 0
+ else
+ let ind = indent(v:lnum)
+ endif
+
+ return ind
+endfunction
diff --git a/runtime/indent/yaml.vim b/runtime/indent/yaml.vim
new file mode 100644
index 0000000..93fd8ea
--- /dev/null
+++ b/runtime/indent/yaml.vim
@@ -0,0 +1,156 @@
+" Vim indent file
+" Language: YAML
+" Maintainer: Nikolai Pavlov <zyx.vim@gmail.com>
+" Last Updates: Lukas Reineke, "lacygoill"
+" Last Change: 2022 Jun 17
+
+" Only load this indent file when no other was loaded.
+if exists('b:did_indent')
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetYAMLIndent(v:lnum)
+setlocal indentkeys=!^F,o,O,0#,0},0],<:>,0-
+setlocal nosmartindent
+
+let b:undo_indent = 'setlocal indentexpr< indentkeys< smartindent<'
+
+" Only define the function once.
+if exists('*GetYAMLIndent')
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+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*#'
+ let prevlnum = prevnonblank(prevlnum-1)
+ endwhile
+ return prevlnum
+endfunction
+
+function s:FindPrevLEIndentedLineMatchingRegex(lnum, regex)
+ let plilnum = s:FindPrevLessIndentedLine(a:lnum, indent(a:lnum)+1)
+ while plilnum && getline(plilnum) !~# a:regex
+ let plilnum = s:FindPrevLessIndentedLine(plilnum)
+ endwhile
+ return plilnum
+endfunction
+
+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
+ endif
+
+ let prevlnum = prevnonblank(a:lnum-1)
+ let previndent = indent(prevlnum)
+
+ let line = getline(a:lnum)
+ if line =~# '^\s*#' && getline(a:lnum-1) =~# '^\s*#'
+ " Comment blocks should have identical indent
+ return previndent
+ elseif line =~# '^\s*[\]}]'
+ " Lines containing only closing braces should have previous indent
+ return indent(s:FindPrevLessIndentedLine(a:lnum))
+ endif
+
+ " Ignore comment lines when calculating indent
+ while getline(prevlnum) =~# '^\s*#'
+ let prevlnum = prevnonblank(prevlnum-1)
+ if !prevlnum
+ return previndent
+ endif
+ endwhile
+
+ let prevline = getline(prevlnum)
+ let previndent = indent(prevlnum)
+
+ " Any examples below assume that shiftwidth=2
+ if prevline =~# '\v[{[:]$|[:-]\ [|>][+\-]?%(\s+\#.*|\s*)$'
+ " Mapping key:
+ " nested mapping: ...
+ "
+ " - {
+ " key: [
+ " list value
+ " ]
+ " }
+ "
+ " - |-
+ " Block scalar without indentation indicator
+ return previndent+shiftwidth()
+ elseif prevline =~# '\v[:-]\ [|>]%(\d+[+\-]?|[+\-]?\d+)%(\#.*|\s*)$'
+ " - |+2
+ " block scalar with indentation indicator
+ "#^^ indent+2, not indent+shiftwidth
+ return previndent + str2nr(matchstr(prevline,
+ \'\v([:-]\ [|>])@<=[+\-]?\d+%([+\-]?%(\s+\#.*|\s*)$)@='))
+ elseif prevline =~# '\v\"%([^"\\]|\\.)*\\$'
+ " "Multiline string \
+ " with escaped end"
+ let qidx = match(prevline, '\v\"%([^"\\]|\\.)*\\')
+ return virtcol([prevlnum, qidx+1])
+ elseif line =~# s:liststartregex
+ " List line should have indent equal to previous list line unless it was
+ " caught by one of the previous rules
+ return indent(s:FindPrevLEIndentedLineMatchingRegex(a:lnum,
+ \ s:liststartregex))
+ elseif line =~# s:mapkeyregex
+ " Same for line containing mapping key
+ let prevmapline = s:FindPrevLEIndentedLineMatchingRegex(a:lnum,
+ \ s:mapkeyregex)
+ if getline(prevmapline) =~# '^\s*- '
+ return indent(prevmapline) + 2
+ else
+ return indent(prevmapline)
+ endif
+ elseif prevline =~# '^\s*- '
+ " - List with
+ " multiline scalar
+ return previndent+2
+ 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+shiftwidth()
+ endif
+ return previndent
+endfunction
+
+let &cpo = s:save_cpo
diff --git a/runtime/indent/zig.vim b/runtime/indent/zig.vim
new file mode 100644
index 0000000..e3ce8aa
--- /dev/null
+++ b/runtime/indent/zig.vim
@@ -0,0 +1,80 @@
+" Vim filetype indent file
+" Language: Zig
+" Upstream: https://github.com/ziglang/zig.vim
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+if (!has("cindent") || !has("eval"))
+ finish
+endif
+
+setlocal cindent
+
+" L0 -> 0 indent for jump labels (i.e. case statement in c).
+" j1 -> indenting for "javascript object declarations"
+" J1 -> see j1
+" w1 -> starting a new line with `(` at the same indent as `(`
+" m1 -> if `)` starts a line, match its indent with the first char of its
+" matching `(` line
+" (s -> use one indent, when starting a new line after a trailing `(`
+setlocal cinoptions=L0,m1,(s,j1,J1,l1
+
+" cinkeys: controls what keys trigger indent formatting
+" 0{ -> {
+" 0} -> }
+" 0) -> )
+" 0] -> ]
+" !^F -> make CTRL-F (^F) reindent the current line when typed
+" o -> when <CR> or `o` is used
+" O -> when the `O` command is used
+setlocal cinkeys=0{,0},0),0],!^F,o,O
+
+setlocal indentexpr=GetZigIndent(v:lnum)
+
+let b:undo_indent = "setlocal cindent< cinkeys< cinoptions< indentexpr<"
+
+function! GetZigIndent(lnum)
+ let curretLineNum = a:lnum
+ let currentLine = getline(a:lnum)
+
+ " cindent doesn't handle multi-line strings properly, so force no indent
+ if currentLine =~ '^\s*\\\\.*'
+ return -1
+ endif
+
+ let prevLineNum = prevnonblank(a:lnum-1)
+ let prevLine = getline(prevLineNum)
+
+ " for lines that look like
+ " },
+ " };
+ " try treating them the same as a }
+ if prevLine =~ '\v^\s*},$'
+ if currentLine =~ '\v^\s*};$' || currentLine =~ '\v^\s*}$'
+ return indent(prevLineNum) - 4
+ endif
+ return indent(prevLineNum-1) - 4
+ endif
+ if currentLine =~ '\v^\s*},$'
+ return indent(prevLineNum) - 4
+ endif
+ if currentLine =~ '\v^\s*};$'
+ return indent(prevLineNum) - 4
+ endif
+
+
+ " cindent doesn't handle this case correctly:
+ " switch (1): {
+ " 1 => true,
+ " ~
+ " ^---- indents to here
+ if prevLine =~ '.*=>.*,$' && currentLine !~ '.*}$'
+ return indent(prevLineNum)
+ endif
+
+ return cindent(a:lnum)
+endfunction
diff --git a/runtime/indent/zimbu.vim b/runtime/indent/zimbu.vim
new file mode 100644
index 0000000..0e6e2ab
--- /dev/null
+++ b/runtime/indent/zimbu.vim
@@ -0,0 +1,128 @@
+" Vim indent file
+" Language: Zimbu
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2021 Sep 26
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal ai nolisp nocin
+setlocal indentexpr=GetZimbuIndent(v:lnum)
+setlocal indentkeys=0{,0},!^F,o,O,0=ELSE,0=ELSEIF,0=CASE,0=DEFAULT,0=FINALLY
+
+" We impose recommended defaults: no Tabs, 'shiftwidth' = 2
+setlocal sw=2 et
+
+let b:undo_indent = "setl ai< cin< et< indentkeys< indentexpr< lisp< sw<"
+
+" Only define the function once.
+if exists("*GetZimbuIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Come here when loading the script the first time.
+
+let s:maxoff = 50 " maximum number of lines to look backwards for ()
+
+func GetZimbuIndent(lnum)
+ let prevLnum = prevnonblank(a:lnum - 1)
+ if prevLnum == 0
+ " This is the first non-empty line, use zero indent.
+ return 0
+ endif
+
+ " Taken from Python indenting:
+ " 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
+ " going too far back.
+ call cursor(prevLnum, 1)
+ let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW',
+ \ "line('.') < " . (prevLnum - s:maxoff) . " ? dummy :"
+ \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+ \ . " =~ '\\(Comment\\|String\\|Char\\)$'")
+ if parlnum > 0
+ let plindent = indent(parlnum)
+ let plnumstart = parlnum
+ else
+ let plindent = indent(prevLnum)
+ let plnumstart = prevLnum
+ endif
+
+
+ " When inside parenthesis: If at the first line below the parenthesis add
+ " two 'shiftwidth', otherwise same as previous line.
+ " i = (a
+ " + b
+ " + c)
+ call cursor(a:lnum, 1)
+ let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
+ \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
+ \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+ \ . " =~ '\\(Comment\\|String\\|Char\\)$'")
+ if p > 0
+ if p == prevLnum
+ " 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\\|String\\|Char\\)$'")
+ if pp > 0
+ return indent(prevLnum) + shiftwidth()
+ endif
+ return indent(prevLnum) + shiftwidth() * 2
+ endif
+ if plnumstart == p
+ return indent(prevLnum)
+ endif
+ return plindent
+ endif
+
+ let prevline = getline(prevLnum)
+ let thisline = getline(a:lnum)
+
+ " If this line is not a comment and the previous one is then move the
+ " previous line further back.
+ if thisline !~ '^\s*#'
+ while prevline =~ '^\s*#'
+ let prevLnum = prevnonblank(prevLnum - 1)
+ if prevLnum == 0
+ " Only comment lines before this, no indent
+ return 0
+ endif
+ let prevline = getline(prevLnum)
+ let plindent = indent(prevLnum)
+ endwhile
+ endif
+
+ if prevline =~ '^\s*\(IF\|\|ELSEIF\|ELSE\|GENERATE_IF\|\|GENERATE_ELSEIF\|GENERATE_ELSE\|WHILE\|REPEAT\|TRY\|CATCH\|FINALLY\|FOR\|DO\|SWITCH\|CASE\|DEFAULT\|FUNC\|VIRTUAL\|ABSTRACT\|DEFINE\|REPLACE\|FINAL\|PROC\|MAIN\|NEW\|ENUM\|CLASS\|INTERFACE\|BITS\|MODULE\|SHARED\)\>'
+ let plindent += shiftwidth()
+ endif
+ if thisline =~ '^\s*\(}\|ELSEIF\>\|ELSE\>\|CATCH\|FINALLY\|GENERATE_ELSEIF\>\|GENERATE_ELSE\>\|UNTIL\>\)'
+ let plindent -= shiftwidth()
+ endif
+ if thisline =~ '^\s*\(CASE\>\|DEFAULT\>\)' && prevline !~ '^\s*SWITCH\>'
+ let plindent -= shiftwidth()
+ endif
+
+ " line up continued comment that started after some code
+ " String something # comment comment
+ " # comment
+ if a:lnum == prevLnum + 1 && thisline =~ '^\s*#' && prevline !~ '^\s*#'
+ let n = match(prevline, '#')
+ if n > 1
+ let plindent = n
+ endif
+ endif
+
+ return plindent
+endfunc
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/indent/zsh.vim b/runtime/indent/zsh.vim
new file mode 100644
index 0000000..8e30c65
--- /dev/null
+++ b/runtime/indent/zsh.vim
@@ -0,0 +1,14 @@
+" Vim indent 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
+
+if exists("b:did_indent")
+ finish
+endif
+
+" Same as sh indenting for now.
+runtime! indent/sh.vim
diff --git a/runtime/indoff.vim b/runtime/indoff.vim
new file mode 100644
index 0000000..0d93035
--- /dev/null
+++ b/runtime/indoff.vim
@@ -0,0 +1,11 @@
+" Vim support file to switch off loading indent files for file types
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2001 Jun 11
+
+if exists("did_indent_on")
+ unlet did_indent_on
+endif
+
+" Remove all autocommands in the filetypeindent group
+silent! au! filetypeindent *
diff --git a/runtime/keymap/README.txt b/runtime/keymap/README.txt
new file mode 100644
index 0000000..d42e026
--- /dev/null
+++ b/runtime/keymap/README.txt
@@ -0,0 +1,26 @@
+keymap files for Vim
+
+One of these files is loaded when the 'keymap' option is set.
+
+The name of the file consists of these parts:
+
+ {language}[-{layout}][_{encoding}].vim
+
+{language} Name of the language (e.g., "hebrew", "greek")
+
+{layout} Optional: name of the keyboard layout (e.g., "spanish",
+ "russian3"). When omitted the layout of the standard
+ US-english keyboard is assumed.
+
+{encoding} Optional: character encoding for which this keymap works.
+ When omitted the "normal" encoding for the language is
+ assumed.
+ Use the value the 'encoding' option: lower case only, use '-'
+ instead of '_'.
+
+Each file starts with a header, naming the maintainer and the date when it was
+last changed. If you find a problem in a keymap file, check if you have the
+most recent version. If necessary, report a problem to the maintainer.
+
+The format of the keymap lines below "loadkeymap" is explained in the Vim help
+files, see ":help keymap-file-format".
diff --git a/runtime/keymap/accents.vim b/runtime/keymap/accents.vim
new file mode 100644
index 0000000..fed94c5
--- /dev/null
+++ b/runtime/keymap/accents.vim
@@ -0,0 +1,78 @@
+" Vim Keymap file for latin1 accents through dead characters
+" Maintainer: Bram Moolenaar
+" Last Change: 2006 Mar 29
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding latin1
+
+" Use this short name in the status line.
+let b:keymap_name = "acc"
+
+loadkeymap
+`A
+'A
+A
+^A
+~A
+:A
+'C
+C
+`E
+'E
+E
+^E
+`I
+'I
+I
+^I
+~N
+`O
+'O
+O
+^O
+~O
+:O
+`U
+'U
+U
+^U
+:U
+'Y
+Y
+`a
+'a
+a
+^a
+~a
+:a
+'c
+c
+`e
+'e
+e
+^e
+`i
+'i
+i
+^i
+~n
+`o
+'o
+o
+^o
+~o
+:o
+`u
+'u
+u
+^u
+:u
+'y
+y
+'' '
+
+`` `
+^^ ^
+~~ ~
+:: :
diff --git a/runtime/keymap/arabic.vim b/runtime/keymap/arabic.vim
new file mode 100644
index 0000000..7eb9a17
--- /dev/null
+++ b/runtime/keymap/arabic.vim
@@ -0,0 +1,2 @@
+" Assume 'encoding' is set to "latin1" while actually iso-8859-6 is used
+source <sfile>:p:h/arabic_utf-8.vim
diff --git a/runtime/keymap/arabic_utf-8.vim b/runtime/keymap/arabic_utf-8.vim
new file mode 100644
index 0000000..aeb4a4f
--- /dev/null
+++ b/runtime/keymap/arabic_utf-8.vim
@@ -0,0 +1,86 @@
+" Vim Keymap file for Arabic
+" Maintainer : Arabic Support group <support-at-arabeyes.org>
+" Created by : Nadim Shaikli <nadim-at-arabeyes.org>
+" Last Updated : 2003 Apr 26
+" This is for a standard Microsoft Arabic keyboard layout.
+
+" Use this short name in the status line.
+let b:keymap_name = "arab"
+
+loadkeymap
+q <char-0x0636> " (1590) - DAD
+w <char-0x0635> " (1589) - SAD
+e <char-0x062b> " (1579) - THEH
+r <char-0x0642> " (1602) - QAF
+t <char-0x0641> " (1601) - FEH
+y <char-0x063a> " (1594) - GHAIN
+u <char-0x0639> " (1593) - AIN
+i <char-0x0647> " (1607) - HEH
+o <char-0x062e> " (1582) - KHAH
+p <char-0x062d> " (1581) - HAH
+[ <char-0x062c> " (1580) - JEEM
+] <char-0x062f> " (1583) - DAL
+a <char-0x0634> " (1588) - SHEEN
+s <char-0x0633> " (1587) - SEEN
+d <char-0x064a> " (1610) - YEH
+f <char-0x0628> " (1576) - BEH
+g <char-0x0644> " (1604) - LAM
+h <char-0x0627> " (1575) - ALEF
+j <char-0x062a> " (1578) - TEH
+k <char-0x0646> " (1606) - NOON
+l <char-0x0645> " (1605) - MEEM
+; <char-0x0643> " (1603) - KAF
+' <char-0x0637> " (1591) - TAH
+z <char-0x0626> " (1574) - YEH with HAMZA ABOVE
+x <char-0x0621> " (1569) - HAMZA
+c <char-0x0624> " (1572) - WAW with HAMZA ABOVE
+v <char-0x0631> " (1585) - REH
+b <char-0x0644><char-0x0627> " (1604/1575) - LAA (lam alef)
+n <char-0x0649> " (1609) - ALEF MAKSURA
+m <char-0x0629> " (1577) - TEH MARBUTA
+, <char-0x0648> " (1608) - WAW
+. <char-0x0632> " (1586) - ZAIN
+/ <char-0x0638> " (1592) - ZAH
+0 <char-0x0660> " (1632) - Arabic 0
+1 <char-0x0661> " (1633) - Arabic 1
+2 <char-0x0662> " (1634) - Arabic 2
+3 <char-0x0663> " (1635) - Arabic 3
+4 <char-0x0664> " (1636) - Arabic 4
+5 <char-0x0665> " (1637) - Arabic 5
+6 <char-0x0666> " (1638) - Arabic 6
+7 <char-0x0667> " (1639) - Arabic 7
+8 <char-0x0668> " (1640) - Arabic 8
+9 <char-0x0669> " (1641) - Arabic 9
+` <char-0x0630> " (1584) - THAL
+~ <char-0x0651> " (1617) - Tanween -- SHADDA
+Q <char-0x064e> " (1614) - Tanween -- FATHA
+W <char-0x064b> " (1611) - Tanween -- FATHATAN
+E <char-0x064f> " (1615) - Tanween -- DAMMA
+R <char-0x064c> " (1612) - Tanween -- DAMMATAN
+T <char-0x0644><char-0x0625> " (1604/1573) - LAA with HAMZA BELOW
+Y <char-0x0625> " (1573) - ALEF with HAMZA BELOW
+U <char-0x0060> " (96) - ASCII -- `
+I <char-0x00f7> " (247) - ASCII suppl -- div
+O <char-0x00d7> " (215) - ASCII suppl -- mul
+P <char-0x061b> " (1563) - Arabic Semicolon
+{ <char-0x003c> " (60) - ASCII -- <
+} <char-0x003e> " (62) - ASCII -- >
+A <char-0x0650> " (1616) - Tanween -- KASRA
+S <char-0x064d> " (1613) - Tanween -- KASRATAN
+D <char-0x005b> " (91) - ASCII -- [
+F <char-0x005d> " (93) - ASCII -- ]
+G <char-0x0644><char-0x0623> " (1604/1571) - LAA with HAMZA ABOVE
+H <char-0x0623> " (1571) - ALEF with HAMZA ABOVE
+J <char-0x0640> " (1600) - TATWEEL
+K <char-0x060c> " (1548) - Arabic Comma
+L <char-0x002f> " (47) - ASCII -- /
+Z <char-0x007e> " (126) - ASCII -- ~
+X <char-0x0652> " (1618) - Tanween -- SUKUN
+C <char-0x007b> " (123) - ASCII -- {
+V <char-0x007d> " (125) - ASCII -- }
+B <char-0x0644><char-0x0622> " (1604/1570) - LAA with MADDA ABOVE
+N <char-0x0622> " (1570) - ALEF with MADDA ABOVE
+M <char-0x0027> " (39) - ASCII -- '
+< <char-0x002c> " (44) - ASCII -- ,
+> <char-0x002e> " (46) - ASCII -- .
+? <char-0x061f> " (1567) - Arabic Question Mark
diff --git a/runtime/keymap/armenian-eastern_utf-8.vim b/runtime/keymap/armenian-eastern_utf-8.vim
new file mode 100644
index 0000000..eaa60a7
--- /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 0000000..cf3efdc
--- /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/belarusian-jcuken.vim b/runtime/keymap/belarusian-jcuken.vim
new file mode 100644
index 0000000..73c84aa
--- /dev/null
+++ b/runtime/keymap/belarusian-jcuken.vim
@@ -0,0 +1,87 @@
+" Vim Keymap file for Belarusian characters, layout 'jcuken', classical variant
+" Useful mainly with UTF-8, but may work with other encodings.
+
+" Derived From: russian-jcuken.vim
+" Maintainer: Aliaksei Nestserau <aliaksei@screencustoms.com>
+" Last Changed: 2012 Jul 23
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding utf-8
+
+let b:keymap_name = "by"
+
+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 ASYLLABIC U
+} ' APOSTROPHE
+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 ASYLLABIC U
+] ' APOSTROPHE
+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/bulgarian-bds.vim b/runtime/keymap/bulgarian-bds.vim
new file mode 100644
index 0000000..3377edb
--- /dev/null
+++ b/runtime/keymap/bulgarian-bds.vim
@@ -0,0 +1,155 @@
+" Vim keymap file for Bulgarian and Russian characters, "bds" layout.
+" Most of it can be used with both utf-8 and cp1251 file encodings, except
+" the accented characters which can only be stored in utf-8.
+" This file itself is in utf-8.
+
+" Maintainer: Boyko Bantchev <boykobb@gmail.com>
+" URI: http://www.math.bas.bg/bantchev/vim/bulgarian-bds.vim
+" Last Changed: 2010 May 4
+
+" This keymap corresponds to what is called Bulgarian standard typewriter
+" keyboard layout, or "БДС".
+"
+" Note that, in addition to the Bulgarian alphabet, the BDS layout prescribes
+" the presence of the following characters:
+" — The Russian letters ы (small), and Э and э (capital and small).
+" — The latin capital letters I and V – used to type Roman numerals
+" without having to leave Cyrillic mode.
+"
+" Some punctuation characters present in ascii are mapped in BDS to keys
+" different from the ones they occupy in the QWERTY layout, because the latter
+" keys are used to type other characters.
+"
+" In this keymap, also defined (besides BDS) are:
+" — The Russian letters Ё and ё (capital and small), as well as the
+" Russian capital letter Ы (see above for the small counterpart).
+" This way, using the bulgarian-bds keymap, one can access both
+" the Bulgarian and the Russian alphabets.
+" — The quotation marks „ “ ” ‘ ’ (used in the Bulgarian and English
+" quotation styles), as well as « » (Russian quotation style).
+" — The characters §, №, – (en-dash), — (em-dash), …, •, ·, ±, °, ¬,
+" ¤, €, ‰, †, ‡, and ¶.
+"
+" The keymap also defines key combinations for grave and acute accents.
+" (Grave accent is used in Bulgarian, acute in Russian, but both accents
+" apply to other languages as well.)
+"
+" For details of what key or key combination maps to what character, please
+" see below the map itself.
+"
+" See also http://www.math.bas.bg/bantchev/vim/kbdbul.html (in Bulgarian).
+
+scriptencoding utf-8
+
+let b:keymap_name = "bds"
+
+loadkeymap
+D А CYRILLIC CAPITAL LETTER A
+? Б CYRILLIC CAPITAL LETTER BE
+L В CYRILLIC CAPITAL LETTER VE
+H Г CYRILLIC CAPITAL LETTER GHE
+O Д CYRILLIC CAPITAL LETTER DE
+E Е CYRILLIC CAPITAL LETTER IE
+E:: Ё CYRILLIC CAPITAL LETTER IO
+G Ж CYRILLIC CAPITAL LETTER ZHE
+P З CYRILLIC CAPITAL LETTER ZE
+R И CYRILLIC CAPITAL LETTER I
+X Й CYRILLIC CAPITAL LETTER SHORT I
+U К CYRILLIC CAPITAL LETTER KA
+> Л CYRILLIC CAPITAL LETTER EL
+: М CYRILLIC CAPITAL LETTER EM
+K Н CYRILLIC CAPITAL LETTER EN
+F О CYRILLIC CAPITAL LETTER O
+M П CYRILLIC CAPITAL LETTER PE
+< Р CYRILLIC CAPITAL LETTER ER
+I С CYRILLIC CAPITAL LETTER ES
+J Т CYRILLIC CAPITAL LETTER TE
+W У CYRILLIC CAPITAL LETTER U
+B Ф CYRILLIC CAPITAL LETTER EF
+N Х CYRILLIC CAPITAL LETTER HA
+{ Ц CYRILLIC CAPITAL LETTER TSE
+\" Ч CYRILLIC CAPITAL LETTER CHE
+T Ш CYRILLIC CAPITAL LETTER SHA
+Y Щ CYRILLIC CAPITAL LETTER SHCHA
+C Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+CX Ы CYRILLIC CAPITAL LETTER YERU
+A Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+V Э CYRILLIC CAPITAL LETTER REVERSED E
+Z Ю CYRILLIC CAPITAL LETTER YU
+S Я CYRILLIC CAPITAL LETTER YA
+d а CYRILLIC SMALL LETTER A
+\/ б CYRILLIC SMALL LETTER BE
+l в CYRILLIC SMALL LETTER VE
+h г CYRILLIC SMALL LETTER GHE
+o д CYRILLIC SMALL LETTER DE
+e е CYRILLIC SMALL LETTER IE
+e:: ё CYRILLIC SMALL LETTER IO
+g ж CYRILLIC SMALL LETTER ZHE
+p з CYRILLIC SMALL LETTER ZE
+r и CYRILLIC SMALL LETTER I
+x й CYRILLIC SMALL LETTER SHORT I
+u к CYRILLIC SMALL LETTER KA
+\. л CYRILLIC SMALL LETTER EL
+; м CYRILLIC SMALL LETTER EM
+k н CYRILLIC SMALL LETTER EN
+f о CYRILLIC SMALL LETTER O
+m п CYRILLIC SMALL LETTER PE
+, р CYRILLIC SMALL LETTER ER
+i с CYRILLIC SMALL LETTER ES
+j т CYRILLIC SMALL LETTER TE
+w у CYRILLIC SMALL LETTER U
+b ф CYRILLIC SMALL LETTER EF
+n х CYRILLIC SMALL LETTER HA
+[ ц CYRILLIC SMALL LETTER TSE
+' ч CYRILLIC SMALL LETTER CHE
+t ш CYRILLIC SMALL LETTER SHA
+y щ CYRILLIC SMALL LETTER SHCHA
+c ъ CYRILLIC SMALL LETTER HARD SIGN
+Q ы CYRILLIC SMALL LETTER YERU
+a ь CYRILLIC SMALL LETTER SOFT SIGN
+v э CYRILLIC SMALL LETTER REVERSED E
+z ю CYRILLIC SMALL LETTER YU
+s я CYRILLIC SMALL LETTER YA
+_ I LATIN CAPITAL LETTER I
++ V LATIN CAPITAL LETTER V
+$ " QUOTATION MARK
+\\ ( LEFT PARENTHESIS
+| ) RIGHT PARENTHESIS
+# + PLUS SIGN
+q , COMMA
+( - HYPHEN-MINUS
+= . FULL STOP (PERIOD)
+* / SOLIDUS (SLASH)
+& : COLON
+] ; SEMICOLON
+^ = EQUALS SIGN
+@ ? QUESTION MARK
+} § SECTION SIGN (PARAGRAPH SIGN)
+) № NUMERO SIGN
+-- – EN DASH
+--- — EM DASH
+.. … HORIZONTAL ELLIPSIS
+`` “ LEFT DOUBLE QUOTATION MARK
+'' ” RIGHT DOUBLE QUOTATION MARK
+,, „ DOUBLE LOW-9 QUOTATION MARK
+`. ‘ LEFT SINGLE QUOTATION MARK
+'. ’ RIGHT SINGLE QUOTATION MARK
+<< « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+>> » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+** • BULLET
+,. · MIDDLE DOT
++- ± PLUS-MINUS SIGN
+^o ° DEGREE SIGN
+~~ ¬ NOT SIGN
+@@ ¤ CURRENCY SIGN
+$$ € EURO SIGN
+%% ‰ PER MILLE SIGN
++| † DAGGER
+++ ‡ DOUBLE DAGGER
+|| ¶ PILCROW SIGN
+
+" Accented characters cannot map onto cp1251 – use utf-8 file encoding.
+" To apply an accent to a letter, type the corresponding key combination
+" to the immediate right of that letter.
+^` <char-0x300> COMBINING GRAVE ACCENT
+^' <char-0x301> COMBINING ACUTE ACCENT
diff --git a/runtime/keymap/bulgarian-phonetic.vim b/runtime/keymap/bulgarian-phonetic.vim
new file mode 100644
index 0000000..eab2f15
--- /dev/null
+++ b/runtime/keymap/bulgarian-phonetic.vim
@@ -0,0 +1,135 @@
+" Vim keymap file for Bulgarian and Russian characters, "phonetic" layout.
+" Most of it can be used with both utf-8 and cp1251 file encodings, except
+" the accented vowels which can only be stored in utf-8.
+" This file itself is in utf-8.
+
+" Maintainer: Boyko Bantchev <boykobb@gmail.com>
+" URI: http://www.math.bas.bg/bantchev/vim/bulgarian-phonetic.vim
+" Last Changed: 2010 May 4
+
+" This keymap corresponds to what is called "phonetic layout" in Bulgaria:
+" Cyrillic letters tend to be mapped to their Latin homophones wherever
+" there are ones. Most keys corresponding to punctuation characters are
+" left unmapped, so they retain their usual (QWERTY) meanings when typing
+" Cyrillic.
+"
+" In addition to the Bulgarian alphabet, the keymap makes accessible the
+" following characters:
+" — The letters Ё and ё, Э and э, and Ы and ы (in pairs of capital and
+" small). These are the letters in the Russian alphabet that are not
+" present in Bulgarian, so using the bulgarian-phonetic keymap one can
+" type in Russian, too.
+" — The quotation marks „ “ ” ‘ ’ (used in the Bulgarian and English
+" quotation styles), as well as « » (Russian quotation style).
+" — The characters §, №, – (en-dash), — (em-dash), …, •, ·, ±, °, ¬,
+" ¤, €, ‰, †, ‡, and ¶.
+"
+" The keymap also defines key combinations for grave and acute accents.
+" (Grave accent is used in Bulgarian, acute in Russian, but both accents
+" apply to other languages as well.)
+"
+" For details of what key or key combination maps to what character, please
+" see below the map itself.
+"
+" See also http://www.math.bas.bg/bantchev/vim/kbdbul.html (in Bulgarian).
+
+scriptencoding utf-8
+
+let b:keymap_name = "pho"
+
+loadkeymap
+A А CYRILLIC CAPITAL LETTER A
+B Б CYRILLIC CAPITAL LETTER BE
+W В CYRILLIC CAPITAL LETTER VE
+G Г CYRILLIC CAPITAL LETTER GHE
+D Д CYRILLIC CAPITAL LETTER DE
+E Е CYRILLIC CAPITAL LETTER IE
+E:: Ё CYRILLIC CAPITAL LETTER IO
+V Ж CYRILLIC CAPITAL LETTER ZHE
+Z З CYRILLIC CAPITAL LETTER ZE
+I И CYRILLIC CAPITAL LETTER I
+J Й CYRILLIC CAPITAL LETTER SHORT I
+K К CYRILLIC CAPITAL LETTER KA
+L Л CYRILLIC CAPITAL LETTER EL
+M М CYRILLIC CAPITAL LETTER EM
+N Н CYRILLIC CAPITAL LETTER EN
+O О CYRILLIC CAPITAL LETTER O
+P П CYRILLIC CAPITAL LETTER PE
+R Р CYRILLIC CAPITAL LETTER ER
+S С CYRILLIC CAPITAL LETTER ES
+T Т CYRILLIC CAPITAL LETTER TE
+U У CYRILLIC CAPITAL LETTER U
+F Ф CYRILLIC CAPITAL LETTER EF
+H Х CYRILLIC CAPITAL LETTER HA
+C Ц CYRILLIC CAPITAL LETTER TSE
+~ Ч CYRILLIC CAPITAL LETTER CHE
+{ Ш CYRILLIC CAPITAL LETTER SHA
+} Щ CYRILLIC CAPITAL LETTER SHCHA
+Y Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+YI Ы CYRILLIC CAPITAL LETTER YERU
+X Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+YE Э CYRILLIC CAPITAL LETTER REVERSED E
+| Ю CYRILLIC CAPITAL LETTER YU
+Q Я CYRILLIC CAPITAL LETTER YA
+a а CYRILLIC SMALL LETTER A
+b б CYRILLIC SMALL LETTER BE
+w в CYRILLIC SMALL LETTER VE
+g г CYRILLIC SMALL LETTER GHE
+d д CYRILLIC SMALL LETTER DE
+e е CYRILLIC SMALL LETTER IE
+e:: ё CYRILLIC SMALL LETTER IO
+v ж CYRILLIC SMALL LETTER ZHE
+z з CYRILLIC SMALL LETTER ZE
+i и CYRILLIC SMALL LETTER I
+j й CYRILLIC SMALL LETTER SHORT I
+k к CYRILLIC SMALL LETTER KA
+l л CYRILLIC SMALL LETTER EL
+m м CYRILLIC SMALL LETTER EM
+n н CYRILLIC SMALL LETTER EN
+o о CYRILLIC SMALL LETTER O
+p п CYRILLIC SMALL LETTER PE
+r р CYRILLIC SMALL LETTER ER
+s с CYRILLIC SMALL LETTER ES
+t т CYRILLIC SMALL LETTER TE
+u у CYRILLIC SMALL LETTER U
+f ф CYRILLIC SMALL LETTER EF
+h х CYRILLIC SMALL LETTER HA
+c ц CYRILLIC SMALL LETTER TSE
+` ч CYRILLIC SMALL LETTER CHE
+[ ш CYRILLIC SMALL LETTER SHA
+] щ CYRILLIC SMALL LETTER SHCHA
+y ъ CYRILLIC SMALL LETTER HARD SIGN
+yi ы CYRILLIC SMALL LETTER YERU
+x ь CYRILLIC SMALL LETTER SOFT SIGN
+ye э CYRILLIC SMALL LETTER REVERSED E
+\\ ю CYRILLIC SMALL LETTER YU
+q я CYRILLIC SMALL LETTER YA
+!! § SECTION SIGN (PARAGRAPH SIGN)
+## № NUMERO SIGN
+-- – EN DASH
+--- — EM DASH
+.. … HORIZONTAL ELLIPSIS
+`` “ LEFT DOUBLE QUOTATION MARK
+'' ” RIGHT DOUBLE QUOTATION MARK
+,, „ DOUBLE LOW-9 QUOTATION MARK
+`. ‘ LEFT SINGLE QUOTATION MARK
+'. ’ RIGHT SINGLE QUOTATION MARK
+<< « LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+>> » RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+** • BULLET
+,. · MIDDLE DOT
++- ± PLUS-MINUS SIGN
+^o ° DEGREE SIGN
+~~ ¬ NOT SIGN
+@@ ¤ CURRENCY SIGN
+$$ € EURO SIGN
+%% ‰ PER MILLE SIGN
++| † DAGGER
+++ ‡ DOUBLE DAGGER
+|| ¶ PILCROW SIGN
+
+" Accented characters cannot map onto cp1251 – use utf-8 file encoding.
+" To apply an accent to a letter, type the corresponding key combination
+" to the immediate right of that letter.
+^` <char-0x300> COMBINING GRAVE ACCENT
+^' <char-0x301> COMBINING ACUTE ACCENT
diff --git a/runtime/keymap/canfr-win.vim b/runtime/keymap/canfr-win.vim
new file mode 100644
index 0000000..1907fc5
--- /dev/null
+++ b/runtime/keymap/canfr-win.vim
@@ -0,0 +1,91 @@
+" Vim Keymap file for the normalized Canadian multilingual keyboard
+" CAN/CSA Z243.200-92 using the latin1 encoding.
+" This mapping is limited in scope, as it assumes that the AltGr
+" key works as it typically does in a Windows system with a multilingual
+" English keyboard. It probably won't work with the US keyboard on US
+" English versions of Windows, because those don't provide the AltGr keys.
+" The mapping was tested with Win2k and WinXP.
+
+" Maintainer: Eric Joanis <joanis@cs.toronto.edu>
+" Last Change: 2004 Jan 13
+
+" 2003 Dec 04
+" Initial Revision
+
+" 2004 Jan 13
+" Added the upper case accented characters, forgotten in the initial version.
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding latin1
+
+" Use this short name in the status line.
+let b:keymap_name = "canfr"
+
+loadkeymap
+< '
+> "
+/
+?
+'
+\"
+\\
+|
+[a
+[e
+[i
+[o
+[u
+[A
+[E
+[I
+[O
+[U
+[[ ^
+{a
+{e
+{i
+{o
+{u
+{y
+{A
+{E
+{I
+{O
+{U
+]
+}
+` /
+~ \\
+^ ?
+
+
+ <
+ >
+
+a
+e
+i
+o
+u
+A
+E
+I
+O
+U
+ `
+a
+o
+n
+s
+A
+O
+N
+S
+ ~
+ |
+ {
+ }
+ [
+ ]
+
diff --git a/runtime/keymap/croatian.vim b/runtime/keymap/croatian.vim
new file mode 100644
index 0000000..b52eba0
--- /dev/null
+++ b/runtime/keymap/croatian.vim
@@ -0,0 +1,16 @@
+let s:encoding = &enc
+if s:encoding == 'latin1'
+ if has("unix")
+ let s:encoding = 'iso-8859-2'
+ else
+ let s:encoding = 'cp1250'
+ endif
+endif
+
+if s:encoding == 'utf-8'
+ source <sfile>:p:h/croatian_utf-8.vim
+elseif s:encoding == 'cp1250'
+ source <sfile>:p:h/croatian_cp1250.vim
+else
+ source <sfile>:p:h/croatian_iso-8859-2.vim
+endif
diff --git a/runtime/keymap/croatian_cp1250.vim b/runtime/keymap/croatian_cp1250.vim
new file mode 100644
index 0000000..a5a92e3
--- /dev/null
+++ b/runtime/keymap/croatian_cp1250.vim
@@ -0,0 +1,65 @@
+" Vim Keymap file for Croatian characters, classical variant, cp1250 encoding
+"
+" Maintainer: Paul B. Mahol <onemda@gmail.com>
+" Last Changed: 2007 Oct 15
+
+scriptencoding cp1250
+
+let b:keymap_name = "croatian-cp1250"
+" Uncomment line below if you prefer short name
+"let b:keymap_name = "hr-cp1250"
+
+loadkeymap
+z y
+Z Y
+y z
+Y Z
+[
+{
+]
+}
+;
+:
+'
+"
+\
+|
+/ -
+? _
+> :
+< ;
+ <
+ >
+ {
+ }
+ [
+ ]
+ \
+ |
+= +
++ *
+- '
+_ ?
+@ "
+^ &
+& /
+* (
+( )
+) =
+ ~
+ @
+ ^
+
+
+
+
+
+
+
+
+ `
+
+
+
+
+
diff --git a/runtime/keymap/croatian_iso-8859-2.vim b/runtime/keymap/croatian_iso-8859-2.vim
new file mode 100644
index 0000000..4afb0a1
--- /dev/null
+++ b/runtime/keymap/croatian_iso-8859-2.vim
@@ -0,0 +1,84 @@
+" Vim Keymap file for Croatian characters, classical variant, iso-8859-2 encoding
+"
+" Maintainer: Paul B. Mahol <onemda@gmail.com>
+" Last Changed: 2007 Oct 14
+
+scriptencoding iso-8859-2
+
+let b:keymap_name = "croatian-iso-8859-2"
+" Uncomment line below if you prefer short name
+"let b:keymap_name = "hr-iso-8859-2"
+
+loadkeymap
+" swap y and z, not important
+z y
+Z Y
+y z
+Y Z
+
+" s<
+[
+" S<
+{
+" D/
+}
+" d/
+]
+" c<
+;
+" c'
+'
+" C<
+:
+" C'
+"
+" z<
+\
+" Z<
+|
+ |
+ @
+ \
+
+
+
+
+
+
+
+ {
+ }
+ [
+ ]
+@ "
+^ &
+& /
+* (
+( )
+) =
+_ ?
+- '
+= +
++ *
+/ -
+< ;
+> :
+? _
+ ~
+
+
+
+ ^
+
+
+ `
+
+
+
+
+" you still want to be able to type <, >
+ <
+ >
+
+`
+
diff --git a/runtime/keymap/croatian_utf-8.vim b/runtime/keymap/croatian_utf-8.vim
new file mode 100644
index 0000000..11c005f
--- /dev/null
+++ b/runtime/keymap/croatian_utf-8.vim
@@ -0,0 +1,68 @@
+" Vim Keymap file for Croatian characters, classical variant, UTF-8 encoding
+"
+" Maintainer: Paul B. Mahol <onemda@gmail.com>
+" Last Changed: 2007 Oct 14
+
+scriptencoding UTF-8
+
+let b:keymap_name = "croatian-UTF-8"
+" Uncomment line below if you prefer short name
+"let b:keymap_name = "hr-UTF-8"
+
+loadkeymap
+z y
+Z Y
+y z
+Y Z
+[ š
+{ Š
+] đ
+} Đ
+; č
+: Č
+' ć
+" Ć
+\ ž
+| Ž
+@ "
+^ &
+& /
+* (
+( )
+) =
+_ ?
++ *
+= +
+- '
+æ [
+ç ]
+â {
+î }
+< ;
+> :
+/ -
+? _
+ö @
+ñ \
+÷ |
+å €
+¬ <
+® >
+± ~
+² ˇ
+³ ^
+´ ˘
+µ °
+· `
+¹ ´
+í §
+Û ÷
+Ü ¤
+Ý ×
+§ ß
+ì ł
+Ì Ł
+° ˝
+` ¸
+½ ¸
+­ ¨
diff --git a/runtime/keymap/czech.vim b/runtime/keymap/czech.vim
new file mode 100644
index 0000000..ffca531
--- /dev/null
+++ b/runtime/keymap/czech.vim
@@ -0,0 +1 @@
+source <sfile>:p:h/czech_utf-8.vim
diff --git a/runtime/keymap/czech_utf-8.vim b/runtime/keymap/czech_utf-8.vim
new file mode 100644
index 0000000..0a08474
--- /dev/null
+++ b/runtime/keymap/czech_utf-8.vim
@@ -0,0 +1,86 @@
+" Maintainer: Štěpán Němec <stepnem@gmail.com>
+" Last Changed: Fri 25 Jun 2010 22:08:43 CEST
+
+let b:keymap_name = "czech"
+
+loadkey
+0 é
+9 í
+8 á
+7 ý
+6 ž
+5 ř
+4 č
+3 š
+2 ě
+1 +
+` ;
+) 0
+( 9
+* 8
+& 7
+^ 6
+% 5
+$ 4
+# 3
+@ 2
+! 1
+] )
+} (
+[ ú
+{ /
+' §
+\" !
+; ů
+: "
+/ -
+? _
+> :
+< ?
+| '
+~u ů
+~U Ů
+\\a ä
+\\e ë
+\\i ï
+\\o ö
+\\u ü
+\\z ÿ
+\\A Ä
+\\E Ë
+\\I Ï
+\\O Ö
+\\U Ü
+\\Z Ÿ
+=a á
+=e é
+=i í
+=o ó
+=u ú
+=z ý
+=A Á
+=E É
+=I Í
+=O Ó
+=U Ú
+=Z Ý
++c č
++d ď
++e ě
++n ň
++r ř
++s š
++t ť
++y ž
++C Č
++D Ď
++E Ě
++N Ň
++R Ř
++S Š
++T Ť
++Y Ž
+y z
+Y Z
+z y
+Z Y
diff --git a/runtime/keymap/dvorak.vim b/runtime/keymap/dvorak.vim
new file mode 100644
index 0000000..77dc530
--- /dev/null
+++ b/runtime/keymap/dvorak.vim
@@ -0,0 +1,82 @@
+" Maintainer: Ashish SHUKLA <wahjava@members.fsf.org>
+" Last Changed: 2009 Jul 04
+"
+" All characters are ASCII, conversion to another encoding (e.g., UTF-8)
+" should work.
+
+let b:keymap_name = "en-dv"
+
+loadkeymap
+q '
+w ,
+e .
+r p
+t y
+y f
+u g
+i c
+o r
+p l
+[ /
+] =
+\\ \\
+a a
+s o
+d e
+f u
+g i
+h d
+j h
+k t
+l n
+; s
+' -
+z ;
+x q
+c j
+v k
+b x
+n b
+m m
+, w
+. v
+/ z
+Z :
+X Q
+C J
+V K
+B X
+N B
+M M
+< W
+> V
+? Z
+A A
+S O
+D E
+F U
+G I
+H D
+J H
+K T
+L N
+: S
+\" _
+Q "
+W <
+E >
+R P
+T Y
+Y F
+U G
+I C
+O R
+P L
+{ ?
+} +
+| |
+- [
+_ {
+= ]
++ }
+
diff --git a/runtime/keymap/esperanto.vim b/runtime/keymap/esperanto.vim
new file mode 100644
index 0000000..42b3987
--- /dev/null
+++ b/runtime/keymap/esperanto.vim
@@ -0,0 +1 @@
+source <sfile>:p:h/esperanto_utf-8.vim
diff --git a/runtime/keymap/esperanto_utf-8.vim b/runtime/keymap/esperanto_utf-8.vim
new file mode 100644
index 0000000..3d335cb
--- /dev/null
+++ b/runtime/keymap/esperanto_utf-8.vim
@@ -0,0 +1,58 @@
+" Esperanto keymap for utf-8
+" Maintainer: A.J.Mechelynck <antoine.mechelynck@skynet.be>
+" Last Changed: Sat 2003 Mar 15 05:23
+
+" This keymap adds the special consonants of Esperanto to an existing Latin
+" keyboard.
+"
+" All keys same as usual, except:
+" ^ followed by any of CcGgHhJjSs adds a circumflex on top of the letter
+" and replaces the grave accent by a breve
+" any of CcGgHhJjSsUu followed by X or x maps to consonant with ^ or Uu with
+" breve.
+
+" short keymap name for statusline
+let b:keymap_name = "Eo"
+
+" make cursor bright green when keymap is active
+"highlight lCursor guifg=NONE guibg=#00E000
+
+" The following digraphs are already defined
+" digraph C> 0x0108 c> 0x0109 G> 0x011C g> 0x011D H> 0x0124 h> 0x0125
+" digraph J> 0x0134 j> 0x0135 S> 0x015C s> 0x015D U( 0x016C u( 0x016D
+
+scriptencoding latin1
+
+loadkeymap
+
+^C <Char-0x0108> " (264) UPPERCASE C WITH CIRCUMFLEX
+^c <Char-0x0109> " (265) LOWERCASE c WITH CIRCUMFLEX
+^G <Char-0x011C> " (284) UPPERCASE G WITH CIRCUMFLEX
+^g <Char-0x011D> " (285) LOWERCASE g WITH CIRCUMFLEX
+^H <Char-0x0124> " (292) UPPERCASE H WITH CIRCUMFLEX
+^h <Char-0x0125> " (293) LOWERCASE h WITH CIRCUMFLEX
+^J <Char-0x0134> " (308) UPPERCASE J WITH CIRCUMFLEX
+^j <Char-0x0135> " (309) LOWERCASE j WITH CIRCUMFLEX
+^S <Char-0x015C> " (348) UPPERCASE S WITH CIRCUMFLEX
+^s <Char-0x015D> " (349) LOWERCASE s WITH CIRCUMFLEX
+ <Char-0x016C> " (364) UPPERCASE U WITH BREVE
+ <Char-0x016D> " (365) LOWERCASE u WITH BREVE
+
+CX <Char-0x0108> " (264) UPPERCASE C WITH CIRCUMFLEX
+Cx <Char-0x0108> " (264) UPPERCASE C WITH CIRCUMFLEX
+cx <Char-0x0109> " (265) LOWERCASE c WITH CIRCUMFLEX
+GX <Char-0x011C> " (284) UPPERCASE G WITH CIRCUMFLEX
+Gx <Char-0x011C> " (284) UPPERCASE G WITH CIRCUMFLEX
+gx <Char-0x011D> " (285) LOWERCASE g WITH CIRCUMFLEX
+HX <Char-0x0124> " (292) UPPERCASE H WITH CIRCUMFLEX
+Hx <Char-0x0124> " (292) UPPERCASE H WITH CIRCUMFLEX
+hx <Char-0x0125> " (293) LOWERCASE h WITH CIRCUMFLEX
+JX <Char-0x0134> " (308) UPPERCASE J WITH CIRCUMFLEX
+Jx <Char-0x0134> " (308) UPPERCASE J WITH CIRCUMFLEX
+jx <Char-0x0135> " (309) LOWERCASE j WITH CIRCUMFLEX
+SX <Char-0x015C> " (348) UPPERCASE S WITH CIRCUMFLEX
+Sx <Char-0x015C> " (348) UPPERCASE S WITH CIRCUMFLEX
+sx <Char-0x015D> " (349) LOWERCASE s WITH CIRCUMFLEX
+UX <Char-0x016C> " (364) UPPERCASE U WITH BREVE
+Ux <Char-0x016C> " (364) UPPERCASE U WITH BREVE
+ux <Char-0x016D> " (365) LOWERCASE u WITH BREVE
diff --git a/runtime/keymap/french-azerty.vim b/runtime/keymap/french-azerty.vim
new file mode 100644
index 0000000..b0fd758
--- /dev/null
+++ b/runtime/keymap/french-azerty.vim
@@ -0,0 +1,81 @@
+" Vim Keymap file for French standard keyboard layout (without AltGr keys as
+" they don't work reliably in all version of vim)
+
+" Maintainer: Yerlan Sergaziyev <yerlaser@outlook.com>
+" Last Changed: 2020-07-18
+
+scriptencoding utf-8
+
+let b:keymap_name = "fr"
+
+loadkeymap
+1 & ASCII AMPERSAND
+2 é LATIN SMALL LETTER E WITH ACUTE
+3 " ASCII DOUBLE QUOTES
+4 ' ASCII SINGLE QUOTE
+5 ( ASCII LEFT PARENTHESIS
+6 - ASCII MINUS
+7 è LATIN SMALL LETTER E WITH GRAVE
+8 _ ASCII UNDERSCORE
+9 ç LATIN SMALL LETTER C WITH CEDILLA
+0 à LATIN SMALL LETTER A WITH GRAVE
+- ) ASCII RIGHT PARENTHESIS
+! 1 ASCII DIGIT 1
+@ 2 ASCII DIGIT 2
+# 3 ASCII DIGIT 3
+$ 4 ASCII DIGIT 4
+% 5 ASCII DIGIT 5
+^ 6 ASCII DIGIT 6
+& 7 ASCII DIGIT 7
+* 8 ASCII DIGIT 8
+( 9 ASCII DIGIT 9
+) 0 ASCII DIGIT 0
+_ ° DEGREE SIGN
+q a LATIN SMALL LETTER A
+a q LATIN SMALL LETTER Q
+z w LATIN SMALL LETTER W
+w z LATIN SMALL LETTER Z
+Q A LATIN CAPITAL LETTER A
+A Q LATIN CAPITAL LETTER Q
+Z W LATIN CAPITAL LETTER W
+W Z LATIN CAPITAL LETTER Z
+[[ ^ ASCII CIRCUMFLEX
+[q â LATIN SMALL LETTER A WITH CIRCUMFLEX
+[e ê LATIN SMALL LETTER E WITH CIRCUMFLEX
+[u û LATIN SMALL LETTER U WITH CIRCUMFLEX
+[i î LATIN SMALL LETTER I WITH CIRCUMFLEX
+[o ô LATIN SMALL LETTER O WITH CIRCUMFLEX
+[Q Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+[E Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+[U Û LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+[I Î LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+[O Ô LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+{{ ¨ UMLAUT
+{q ä LATIN SMALL LETTER A WITH UMLAUT
+{e ë LATIN SMALL LETTER E WITH UMLAUT
+{y ÿ LATIN SMALL LETTER Y WITH UMLAUT
+{u ü LATIN SMALL LETTER U WITH UMLAUT
+{i ï LATIN SMALL LETTER I WITH UMLAUT
+{o ö LATIN SMALL LETTER O WITH UMLAUT
+{Q Ä LATIN CAPITAL LETTER A WITH UMLAUT
+{E Ë LATIN CAPITAL LETTER E WITH UMLAUT
+{Y Ÿ LATIN CAPITAL LETTER Y WITH UMLAUT
+{U Ü LATIN CAPITAL LETTER U WITH UMLAUT
+{I Ï LATIN CAPITAL LETTER I WITH UMLAUT
+{O Ö LATIN CAPITAL LETTER O WITH UMLAUT
+] $ ASCII GRAVE
+} £ POUND SIGN
+; m LATIN SMALL LETTER M
+: M LATIN CAPITAL LETTER M
+' ù LATIN SMALL LETTER U WITH GRAVE
+\" % ASCII PERCENT
+\\ * ASCII ASTERISK
+| µ GREEK LETTER MU
+m , ASCII COMMA
+M ? ASCII QUESTION MARK
+, ; ASCII SEMICOLON
+< . ASCII DOT
+. : ASCII COLON
+> / ASCII SLASH
+/ ! ASCII EXCLAMATION MARK
+? § SECTION SIGN
diff --git a/runtime/keymap/german-qwertz.vim b/runtime/keymap/german-qwertz.vim
new file mode 100644
index 0000000..c2ccb1b
--- /dev/null
+++ b/runtime/keymap/german-qwertz.vim
@@ -0,0 +1,76 @@
+" Vim Keymap file for German standard keyboard layout (without AltGr keys as
+" they don't work reliably in all version of vim)
+
+" Maintainer: Yerlan Sergaziyev <yerlaser@outlook.com>
+" Last Changed: 2020-07-18
+
+scriptencoding utf-8
+
+let b:keymap_name = "de"
+
+loadkeymap
+`` ^ ASCII CIRCUMFLEX
+`e ê LATIN SMALL LETTER E WITH CIRCUMFLEX
+`u û LATIN SMALL LETTER U WITH CIRCUMFLEX
+`i î LATIN SMALL LETTER I WITH CIRCUMFLEX
+`o ô LATIN SMALL LETTER O WITH CIRCUMFLEX
+`a â LATIN SMALL LETTER A WITH CIRCUMFLEX
+`E Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+`U Û LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+`I Î LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+`O Ô LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+`A Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+- ß LATIN SMALL LETTER SZ
+== ´ ASCII ACUTE ACCENT
+=e é LATIN SMALL LETTER E WITH ACUTE
+=u ú LATIN SMALL LETTER U WITH ACUTE
+=i í LATIN SMALL LETTER I WITH ACUTE
+=o ó LATIN SMALL LETTER O WITH ACUTE
+=a á LATIN SMALL LETTER A WITH ACUTE
+=z ý LATIN SMALL LETTER Y WITH ACUTE
+=E É LATIN CAPITAL LETTER E WITH ACUTE
+=U Ú LATIN CAPITAL LETTER U WITH ACUTE
+=I Í LATIN CAPITAL LETTER I WITH ACUTE
+=O Ó LATIN CAPITAL LETTER O WITH ACUTE
+=A Á LATIN CAPITAL LETTER A WITH ACUTE
+=Z Ý LATIN CAPITAL LETTER Y WITH ACUTE
+=S ẞ LATIN CAPITAL LETTER SZ
+++ ` ASCII GRAVE
++e è LATIN SMALL LETTER E WITH GRAVE
++u ù LATIN SMALL LETTER U WITH GRAVE
++i ì LATIN SMALL LETTER I WITH GRAVE
++o ò LATIN SMALL LETTER O WITH GRAVE
++a à LATIN SMALL LETTER A WITH GRAVE
++E È LATIN CAPITAL LETTER E WITH GRAVE
++U Ù LATIN CAPITAL LETTER U WITH GRAVE
++I Ì LATIN CAPITAL LETTER I WITH GRAVE
++O Ò LATIN CAPITAL LETTER O WITH GRAVE
++A À LATIN CAPITAL LETTER A WITH GRAVE
+y z LATIN SMALL LETTER Z
+[ ü LATIN SMALL LETTER U WITH UMLAUT
+] + ASCII PLUS
+\\ # ASCII NUMBER SIGN
+; ö LATIN SMALL LETTER O WITH UMLAUT
+' ä LATIN SMALL LETTER A WITH UMLAUT
+z y LATIN SMALL LETTER Y
+/ - ASCII MINUS
+~ ° DEGREE SIGN
+@ " ASCII DOUBLE QUOTES
+# § SECTION SIGN
+^ & ASCII AMPERSAND
+& / ASCII SLASH
+* ( ASCII LEFT PARENTHESIS
+( ) ASCII RIGHT PARENTHESIS
+) = ASCII EQUAL SIGN
+_ ? ASCII QUESTION MARK
++ ` ASCII GRAVE
+Y Z LATIN CAPITAL LETTER Z
+{ Ü LATIN CAPITAL LETTER U WITH UMLAUT
+} * ASCII ASTERISK
+| ' ASCII SINGLE QUOTE
+: Ö LATIN CAPITAL LETTER O WITH UMLAUT
+\" Ä LATIN CAPITAL LETTER A WITH UMLAUT
+Z Y LATIN CAPITAL LETTER Y
+< ; ASCII SEMICOLON
+> : ASCII COLON
+? _ ASCII UNDERSCORE
diff --git a/runtime/keymap/greek.vim b/runtime/keymap/greek.vim
new file mode 100644
index 0000000..eb2c1de
--- /dev/null
+++ b/runtime/keymap/greek.vim
@@ -0,0 +1,7 @@
+" Assume 'encoding' is set to "latin1" while actually cp1253 or iso-8859-7 is
+" being used
+if has("win16") || has("win32") || has("win32unix")
+ source <sfile>:p:h/greek_cp1253.vim
+else
+ source <sfile>:p:h/greek_iso-8859-7.vim
+endif
diff --git a/runtime/keymap/greek_cp1253.vim b/runtime/keymap/greek_cp1253.vim
new file mode 100644
index 0000000..a146477
--- /dev/null
+++ b/runtime/keymap/greek_cp1253.vim
@@ -0,0 +1,119 @@
+" Vim Keymap file for greek
+" Maintainer: Grigorios Magklis <maglis@cs.rochester.edu>
+" Patched for MS-Windows CP1253: Panagiotis Louridas <louridas@acm.org>
+" Last Updated: Fri 13 Feb 2004 13:01:33
+"
+" This keyboard layout allows all Greek symbols to be typed,
+" including accented capitals, diaeresis & accent on the same
+" vowel, and the Greek semicolon sign.
+"
+" accent ";" + letter
+" diaeresis ":" + letter
+" diaeresis + accent ";" + ":" (or ":" + ";") + letter
+" semicolon "q"
+" colon "Q"
+" greek semicolon "W"
+" sigma at end of word "w"
+" greek left double-quote "<" twice
+" greek right double-quote ">" twice
+
+" Use this short name in the status line.
+let b:keymap_name = "greek"
+
+loadkeymap
+" capital
+A <char-193> "
+B <char-194> "
+G <char-195> "
+D <char-196> "
+E <char-197> "
+Z <char-198> "
+H <char-199> "
+U <char-200> "
+I <char-201> "
+K <char-202> "
+L <char-203> "
+M <char-204> "
+N <char-205> "
+J <char-206> "
+O <char-207> "
+P <char-208> "
+R <char-209> "
+S <char-211> "
+T <char-212> "
+Y <char-213> "
+F <char-214> "
+X <char-215> "
+C <char-216> "
+V <char-217> "
+
+" small
+a <char-225> "
+b <char-226> "
+g <char-227> "
+d <char-228> "
+e <char-229> "
+z <char-230> "
+h <char-231> "
+u <char-232> "
+i <char-233> "
+k <char-234> "
+l <char-235> "
+m <char-236> "
+n <char-237> "
+j <char-238> "
+o <char-239> "
+p <char-240> "
+r <char-241> "
+w <char-242> "
+s <char-243> "
+t <char-244> "
+y <char-245> "
+f <char-246> "
+x <char-247> "
+c <char-248> "
+v <char-249> "
+
+" accented capital
+;A <char-162> "
+;E <char-184> "
+;H <char-185> "
+;I <char-186> "
+;Y <char-190> "
+;O <char-188> "
+;V <char-191> "
+"
+:I <char-218> "
+:Y <char-219> "
+
+" accented small
+;a <char-220> "
+;e <char-221> "
+;h <char-222> "
+;i <char-223> "
+;y <char-253> "
+;o <char-252> "
+;v <char-254> "
+"
+:i <char-250> "
+:y <char-251> "
+"
+;:i <char-192> "
+:;i <char-192> "
+;:y <char-224> "
+:;y <char-224> "
+
+" symbols
+q ; " ;
+Q : " :
+W <char-183> "
+; <char-180> "
+: <char-168> "
+;: <char-181> "
+:; <char-181> "
+
+" quotes
+<< <char-171> "
+>> <char-187> "
+" <char-161> "
+" <char-162> "
diff --git a/runtime/keymap/greek_cp737.vim b/runtime/keymap/greek_cp737.vim
new file mode 100644
index 0000000..dd0b372
--- /dev/null
+++ b/runtime/keymap/greek_cp737.vim
@@ -0,0 +1,104 @@
+" Vim Keymap file for greek DOS cp737
+" Maintainer: Panagiotis Louridas <louridas@acm.org>
+" Last Updated: Thu Mar 23 14:05:45 EET 2006
+
+" This keyboard layout allows all Greek symbols to be typed,
+" including accented capitals and diaeresis. It does not
+" include diaeresis and accent on the same vowel, nor
+" the greek quotes, as these were not included in the codepage.
+" It includes the Greek semicolon sign.
+
+"
+" accent ";" + letter
+" diaeresis ":" + letter
+" diaeresis + accent ";" + ":" (or ":" + ";") + letter
+" semicolon "q"
+" colon "Q"
+" greek semicolon "W"
+" sigma at end of word "w"
+
+" Use this short name in the status line.
+let b:keymap_name = "greek"
+
+loadkeymap
+" capital
+A <char-128> "
+B <char-129> "
+G <char-130> "
+D <char-131> "
+E <char-132> "
+Z <char-133> "
+H <char-134> "
+U <char-135> "
+I <char-136> "
+K <char-137> "
+L <char-138> "
+M <char-139> "
+N <char-140> "
+J <char-141> "
+O <char-142> "
+P <char-143> "
+R <char-144> "
+S <char-145> "
+T <char-146> "
+Y <char-147> "
+F <char-148> "
+X <char-149> "
+C <char-150> "
+V <char-151> "
+
+" small
+a <char-152> "
+b <char-153> "
+g <char-154> "
+d <char-155> "
+e <char-156> "
+z <char-157> "
+h <char-158> "
+u <char-159> "
+i <char-160> "
+k <char-161> "
+l <char-162> "
+m <char-163> "
+n <char-164> "
+j <char-165> "
+o <char-166> "
+p <char-167> "
+r <char-168> "
+s <char-169> "
+w <char-170> "
+t <char-171> "
+y <char-172> "
+f <char-173> "
+x <char-174> "
+c <char-175> "
+v <char-224> "
+
+" accented capital
+;A <char-234> "
+;E <char-235> "
+;H <char-236> "
+;I <char-237> "
+;O <char-238> "
+;Y <char-239> "
+;V <char-240> "
+"
+:I <char-244> "
+:Y <char-245> "
+
+" accented small
+;a <char-225> "
+;e <char-226> "
+;h <char-227> "
+;i <char-229> "
+;o <char-230> "
+;y <char-231> "
+;v <char-233> "
+"
+:i <char-228> "
+:y <char-232> "
+"
+" symbols
+q ; " ;
+Q : " :
+W <char-250> "
diff --git a/runtime/keymap/greek_iso-8859-7.vim b/runtime/keymap/greek_iso-8859-7.vim
new file mode 100644
index 0000000..5cfd936
--- /dev/null
+++ b/runtime/keymap/greek_iso-8859-7.vim
@@ -0,0 +1,118 @@
+" Vim Keymap file for greek
+" Maintainer: Grigorios Magklis <maglis@cs.rochester.edu>
+" Last Updated: Tue 10 Jul 2001 16:50:50
+"
+" This keyboard layout allows all Greek symbols to be typed,
+" including accented capitals, diaeresis & accent on the same
+" vowel, and the Greek semicolon sign.
+"
+" accent ";" + letter
+" diaeresis ":" + letter
+" diaeresis + accent ";" + ":" (or ":" + ";") + letter
+" semicolon "q"
+" colon "Q"
+" greek semicolon "W"
+" sigma at end of word "w"
+" greek left double-quote "<" twice
+" greek right double-quote ">" twice
+
+" Use this short name in the status line.
+let b:keymap_name = "greek"
+
+loadkeymap
+" capital
+A <char-193> "
+B <char-194> "
+G <char-195> "
+D <char-196> "
+E <char-197> "
+Z <char-198> "
+H <char-199> "
+U <char-200> "
+I <char-201> "
+K <char-202> "
+L <char-203> "
+M <char-204> "
+N <char-205> "
+J <char-206> "
+O <char-207> "
+P <char-208> "
+R <char-209> "
+S <char-211> "
+T <char-212> "
+Y <char-213> "
+F <char-214> "
+X <char-215> "
+C <char-216> "
+V <char-217> "
+
+" small
+a <char-225> "
+b <char-226> "
+g <char-227> "
+d <char-228> "
+e <char-229> "
+z <char-230> "
+h <char-231> "
+u <char-232> "
+i <char-233> "
+k <char-234> "
+l <char-235> "
+m <char-236> "
+n <char-237> "
+j <char-238> "
+o <char-239> "
+p <char-240> "
+r <char-241> "
+w <char-242> "
+s <char-243> "
+t <char-244> "
+y <char-245> "
+f <char-246> "
+x <char-247> "
+c <char-248> "
+v <char-249> "
+
+" accented capital
+;A <char-182> "
+;E <char-184> "
+;H <char-185> "
+;I <char-186> "
+;Y <char-190> "
+;O <char-188> "
+;V <char-191> "
+"
+:I <char-218> "
+:Y <char-219> "
+
+" accented small
+;a <char-220> "
+;e <char-221> "
+;h <char-222> "
+;i <char-223> "
+;y <char-253> "
+;o <char-252> "
+;v <char-254> "
+"
+:i <char-250> "
+:y <char-251> "
+"
+;:i <char-192> "
+:;i <char-192> "
+;:y <char-224> "
+:;y <char-224> "
+
+" symbols
+q ; " ;
+Q : " :
+W <char-183> "
+; <char-180> "
+: <char-168> "
+;: <char-181> "
+:; <char-181> "
+
+" quotes
+<< <char-171> "
+>> <char-187> "
+" <char-161> "
+" <char-162> "
diff --git a/runtime/keymap/greek_utf-8.vim b/runtime/keymap/greek_utf-8.vim
new file mode 100644
index 0000000..1756454
--- /dev/null
+++ b/runtime/keymap/greek_utf-8.vim
@@ -0,0 +1,622 @@
+" Vim Keymap file for greek
+" Maintainer: Panagiotis Louridas <louridas@acm.org>
+" Last Updated: Thu Mar 23 23:45:02 EET 2006
+
+" This file was corrected for Vim after the version adapted for Vim 6 from
+" the yudit distribution by Robert Goulding <goulding@princeton.edu>
+"
+" The monotonic part of this kmap was made by Constantine Stathopoulos
+" <cstath@irismedia.gr>.
+" The polytonic part was made by <birger.langkjer@image.dk> 04/11-1999,
+" Aarhus, Denmark.
+" It was modified and completed by A. Tsolomitis <atsol@aegean.gr>
+" The licence allows modifications but redistribution of modifications
+" should be with another name.
+
+" The keymap now conforms with the
+" LaTeX's-Babel Standard by A. Syropoulos <apostolo@ocean1.ee.duth.gr>
+
+" The conventions are as follows:
+" EURO SIGN is E$ (0x20AC),
+" Drachma sign is D$ (0x20AF)
+
+" RIGHT an LEFT QUOTATION MARKS (0x00BB), (0x00AB),
+" follow the kikbd conventions (;< abd ;>) AND << and >>
+
+" Apostrofos is corrected in order to agree with the Greek grammar rules
+" of Triantafilidis who requires the PSILI (or Koronis) symbol for an
+" apostrophe.
+
+" The Greek ANO TELEIA (0x0387), follows again the kikbd conventions as
+" well as the Emacs conventions. So it is produced by both ;. and W
+
+" All greek accents are added so they can be produced by scholars
+" without having to combine them with letters (usufull for grammarians
+" in particular) (especially for dasia and psiln we use ' for psili
+" (that is apostrophe) and ;' for dasia. This is done in order to
+" preserve the posibility to write a plain < or >.
+
+" Ypogegrammeni is | following the character (the originally proposed
+" i after the character is problematic: can't write easily ai or vi) :
+
+" > dasia " an oxia or baria *always* should follow dasia
+" < psili " an oxia or baria *always* should follow psili
+" ; tonos
+" / oxia
+" ` varia
+" ~ perispomeni
+" : dialytika
+" :; or ;: dialytika oxia
+" :` or `: dialytika baria
+" || a single ypogegrammeni
+" vowel followed by | gives ypogegrammeni to the vowel
+" -vowel gives vowel with macron
+" ^vowel gives vowel with braxy
+" -- endash
+" --- emdash
+" ;b ;p ;f ;u ;r ;k give alternative forms
+" && give the Greek kai symbol
+" #Q and #q give archaic Qoppa and qoppa
+" ;U is capital Theta symbol
+" !e and !E are lunate epsilon and Epsilon
+" #ST stigma
+" #SP sampi
+" #G digamma
+" #Q qoppa
+" ;# avw tovos (for numerals)
+" ;## katw tovos (for numerals)
+
+
+" All accents are supported. Even rho with < and > and Rho with <
+" Also :~i and :~u and macron and braxy a,i,u and their capitals.
+let b:keymap_name = "grk"
+loadkeymap
+" PUNCTUATION MARKS - SYMBOLS (GREEK SPECIFIC)
+"
+E$ <char-0x20AC> " EURO SIGN
+>> <char-0x00BB> " RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK [GREEK
+ " EISAGOGIKA/OMOIOMATIKA - DEFINITION
+ " MISSING FROM UNICODE]
+;> <char-0x00BB> "
+<< <char-0x00AB> " LEFT-POINTING DOUBLE ANGLE QUOTATION MARK [GREEK
+ " EISAGOGIKA - DEFINITION MISSING FROM UNICODE]
+;< <char-0x00AB> "
+Q <char-0x003A> " COLON [GREEK EPEXIGIMATIKA OR ANO & KATO TELEIA -
+ " DEFINITION MISSING FROM UNICODE]
+q <char-0x037E> " GREEK QUESTION MARK (EROTIMATIKO)
+;. <char-0x0387> " GREEK ANO TELEIA (KDE/kikbd/Xinput standard)
+W <char-0x0387> " GREEK ANO TELEIA (Emacs standard)
+' <char-0x1FBD> " GREEK APOSTROFOS
+-- <char-0x2013> " endash
+--- <char-0x2014> " emdash
+"
+" GREEK DIACRITICS
+"
+: <char-0x00A8> " DIAERESIS [GREEK DIALYTIKA - DEFINITION MISSING FROM
+ " UNICODE]
+; <char-0x0384> " GREEK TONOS
+:; <char-0x0385> " GREEK DIALYTIKA Oxia
+;: <char-0x0385> " GREEK DIALYTIKA Oxia
+:` <char-0x1FED> " GREEK DIALYTIKA VARIA
+`: <char-0x1FED> " GREEK DIALYTIKA VARIA
+/ <char-0x1FFD> " GREEK OXIA
+` <char-0x1FEF> " GREEK VARIA
+~ <char-0x1FC0> " PERISPOMENI
+>` <char-0x1FCD> " PSILI VARIA
+<` <char-0x1FDD> " DASIA VARIA
+>; <char-0x1FCE> " PSILI OXIA
+<; <char-0x1FDE> " DASIA OXIA
+<~ <char-0x1FDF> " DASIA PERISPOMENI
+>~ <char-0x1FCF> " PSILI PERISPOMENI
+"For plain psili use apostrophe
+;' <char-0x1FFE> " (Plain) dasia
+"
+"
+"
+" GREEK LETTERS
+"
+A <char-0x0391> " GREEK CAPITAL LETTER ALPHA
+B <char-0x0392> " GREEK CAPITAL LETTER BETA
+G <char-0x0393> " GREEK CAPITAL LETTER GAMMA
+D <char-0x0394> " GREEK CAPITAL LETTER DELTA
+E <char-0x0395> " GREEK CAPITAL LETTER EPSILON
+Z <char-0x0396> " GREEK CAPITAL LETTER ZETA
+H <char-0x0397> " GREEK CAPITAL LETTER ETA
+U <char-0x0398> " GREEK CAPITAL LETTER THETA
+I <char-0x0399> " GREEK CAPITAL LETTER IOTA
+K <char-0x039A> " GREEK CAPITAL LETTER KAPPA
+L <char-0x039B> " GREEK CAPITAL LETTER LAMDA
+M <char-0x039C> " GREEK CAPITAL LETTER MU
+N <char-0x039D> " GREEK CAPITAL LETTER NU
+J <char-0x039E> " GREEK CAPITAL LETTER XI
+O <char-0x039F> " GREEK CAPITAL LETTER OMIKRON
+P <char-0x03A0> " GREEK CAPITAL LETTER PI
+R <char-0x03A1> " GREEK CAPITAL LETTER RHO
+S <char-0x03A3> " GREEK CAPITAL LETTER SIGMA
+T <char-0x03A4> " GREEK CAPITAL LETTER TAU
+Y <char-0x03A5> " GREEK CAPITAL LETTER UPSILON
+F <char-0x03A6> " GREEK CAPITAL LETTER PHI
+X <char-0x03A7> " GREEK CAPITAL LETTER CHI
+C <char-0x03A8> " GREEK CAPITAL LETTER PSI
+V <char-0x03A9> " GREEK CAPITAL LETTER OMEGA
+a <char-0x03B1> " GREEK SMALL LETTER ALPHA
+b <char-0x03B2> " GREEK SMALL LETTER BETA
+g <char-0x03B3> " GREEK SMALL LETTER GAMMA
+d <char-0x03B4> " GREEK SMALL LETTER DELTA
+e <char-0x03B5> " GREEK SMALL LETTER EPSILON
+z <char-0x03B6> " GREEK SMALL LETTER ZETA
+h <char-0x03B7> " GREEK SMALL LETTER ETA
+u <char-0x03B8> " GREEK SMALL LETTER THETA
+i <char-0x03B9> " GREEK SMALL LETTER IOTA
+k <char-0x03BA> " GREEK SMALL LETTER KAPPA
+l <char-0x03BB> " GREEK SMALL LETTER LAMDA
+m <char-0x03BC> " GREEK SMALL LETTER MU
+n <char-0x03BD> " GREEK SMALL LETTER NU
+j <char-0x03BE> " GREEK SMALL LETTER XI
+o <char-0x03BF> " GREEK SMALL LETTER OMICRON
+p <char-0x03C0> " GREEK SMALL LETTER PI
+r <char-0x03C1> " GREEK SMALL LETTER RHO
+w <char-0x03C2> " GREEK SMALL LETTER FINAL SIGMA
+s <char-0x03C3> " GREEK SMALL LETTER SIGMA
+t <char-0x03C4> " GREEK SMALL LETTER TAU
+y <char-0x03C5> " GREEK SMALL LETTER UPSILON
+f <char-0x03C6> " GREEK SMALL LETTER PHI
+x <char-0x03C7> " GREEK SMALL LETTER CHI
+c <char-0x03C8> " GREEK SMALL LETTER PSI
+v <char-0x03C9> " GREEK SMALL LETTER OMEGA
+"
+"COMBINED GREEK LETTERS WITH DIACRITICS
+"
+;A <char-0x0386> " GREEK CAPITAL LETTER ALPHA WITH TONOS
+;E <char-0x0388> " GREEK CAPITAL LETTER EPSILON WITH TONOS
+;H <char-0x0389> " GREEK CAPITAL LETTER ETA WITH TONOS
+;I <char-0x038A> " GREEK CAPITAL LETTER IOTA WITH TONOS
+;O <char-0x038C> " GREEK CAPITAL LETTER OMICRON WITH TONOS
+;Y <char-0x038E> " GREEK CAPITAL LETTER UPSILON WITH TONOS
+;V <char-0x038F> " GREEK CAPITAL LETTER OMEGA WITH TONOS
+:;i <char-0x0390> " GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+;:i <char-0x0390> " GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+:`i <char-0x1FD2> " GREEK SMALL LETTER IOTA WITH DIALYTIKA AND baria
+`:i <char-0x1FD2> " GREEK SMALL LETTER IOTA WITH DIALYTIKA AND baria
+:I <char-0x03AA> " GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+:Y <char-0x03AB> " GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+;a <char-0x03AC> " GREEK SMALL LETTER ALPHA WITH TONOS
+;e <char-0x03AD> " GREEK SMALL LETTER EPSILON WITH TONOS
+;h <char-0x03AE> " GREEK SMALL LETTER ETA WITH TONOS
+;i <char-0x03AF> " GREEK SMALL LETTER IOTA WITH TONOS
+:;y <char-0x03B0> " GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+;:y <char-0x03B0> " GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+:`y <char-0x1FE2> " GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND baria
+`:y <char-0x1FE2> " GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND baria
+:i <char-0x03CA> " GREEK SMALL LETTER IOTA WITH DIALYTIKA
+:y <char-0x03CB> " GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+;o <char-0x03CC> " GREEK SMALL LETTER OMICRON WITH TONOS
+;y <char-0x03CD> " GREEK SMALL LETTER UPSILON WITH TONOS
+;v <char-0x03CE> " GREEK SMALL LETTER OMEGA WITH TONOS
+
+"
+" This area covers 0x1F00-0x1FFF
+"
+"
+" letters with Varia:
+"
+`A <char-0x1FBA> " GREEK CAPITAL LETTER ALPHA WITH VARIA
+`E <char-0x1FC8> " GREEK CAPITAL LETTER ALPHA WITH VARIA
+`H <char-0x1FCA> " GREEK CAPITAL LETTER ETA WITH VARIA
+`I <char-0x1FDA> " GREEK CAPITAL LETTER IOTA WITH VARIA
+`O <char-0x1FF8> " GREEK CAPITAL LETTER ALPHA WITH VARIA
+`Y <char-0x1FEA> " GREEK CAPITAL LETTER ALPHA WITH VARIA
+`V <char-0x1FFA> " GREEK CAPITAL LETTER OMEGA WITH VARIA
+`a <char-0x1F70> " GREEK SMALL LETTER ALPHA WITH VARIA
+`e <char-0x1F72> " GREEK SMALL LETTER ALPHA WITH VARIA
+`h <char-0x1F74> " GREEK SMALL LETTER ETA WITH VARIA
+`i <char-0x1F76> " GREEK SMALL LETTER IOTA WITH VARIA
+`o <char-0x1F78> " GREEK SMALL LETTER ALPHA WITH VARIA
+`y <char-0x1F7A> " GREEK SMALL LETTER ALPHA WITH VARIA
+`v <char-0x1F7C> " GREEK SMALL LETTER OMEGA WITH VARIA
+"
+" letters with Oxia:
+"
+/A <char-0x1FBB> " GREEK CAPITAL LETTER ALPHA WITH OXIA
+/E <char-0x1FC9> " GREEK CAPITAL LETTER EPSILON WITH OXIA
+/H <char-0x1FCB> " GREEK CAPITAL LETTER ETA WITH OXIA
+/I <char-0x1FDB> " GREEK CAPITAL LETTER IOTA WITH OXIA
+/O <char-0x1FF9> " GREEK CAPITAL LETTER OMICRON WITH OXIA
+/Y <char-0x1FEB> " GREEK CAPITAL LETTER UPSILON WITH OXIA
+/V <char-0x1FFB> " GREEK CAPITAL LETTER OMEGA WITH OXIA
+/a <char-0x1F71> " GREEK SMALL LETTER ALPHA WITH OXIA
+/e <char-0x1F73> " GREEK SMALL LETTER EPSILON WITH OXIA
+/h <char-0x1F75> " GREEK SMALL LETTER ETA WITH OXIA
+/i <char-0x1F77> " GREEK SMALL LETTER IOTA WITH OXIA
+/o <char-0x1F79> " GREEK SMALL LETTER OMICRON WITH OXIA
+/y <char-0x1F7B> " GREEK SMALL LETTER UPSILON WITH OXIA
+/v <char-0x1F7D> " GREEK SMALL LETTER OMEGA WITH OXIA
+"
+" letters with Psili:
+"
+>A <char-0x1F08> " GREEK CAPITAL LETTER ALPHA WITH PSILI
+>E <char-0x1F18> " GREEK CAPITAL LETTER EPSILON WITH PSILI
+>H <char-0x1F28> " GREEK CAPITAL LETTER ETA WITH PSILI
+>I <char-0x1F38> " GREEK CAPITAL LETTER IOTA WITH PSILI
+>O <char-0x1F48> " GREEK CAPITAL LETTER OMICRON WITH PSILI
+>Y <char-0x1F58> " GREEK CAPITAL LETTER UPSILON WITH PSILI
+>V <char-0x1F68> " GREEK CAPITAL LETTER OMEGA WITH PSILI
+>a <char-0x1F00> " GREEK SMALL LETTER ALPHA WITH PSILI
+>e <char-0x1F10> " GREEK SMALL LETTER EPSILON WITH PSILI
+>h <char-0x1F20> " GREEK SMALL LETTER ETA WITH PSILI
+>i <char-0x1F30> " GREEK SMALL LETTER IOTA WITH PSILI
+>o <char-0x1F40> " GREEK SMALL LETTER OMICRON WITH PSILI
+>y <char-0x1F50> " GREEK SMALL LETTER UPSILON WITH PSILI
+>v <char-0x1F60> " GREEK SMALL LETTER OMEGA WITH PSILI
+
+"
+" Letters with Dasia:
+"
+<A <char-0x1F09> " GREEK CAPITAL LETTER ALPHA WITH DASIA
+<E <char-0x1F19> " GREEK CAPITAL LETTER EPSILON WITH DASIA
+<H <char-0x1F29> " GREEK CAPITAL LETTER ETA WITH DASIA
+<I <char-0x1F39> " GREEK CAPITAL LETTER IOTA WITH DASIA
+<O <char-0x1F49> " GREEK CAPITAL LETTER OMICRON WITH DASIA
+<Y <char-0x1F59> " GREEK CAPITAL LETTER UPSILON WITH DASIA
+<V <char-0x1F69> " GREEK CAPITAL LETTER OMEGA WITH DASIA
+<a <char-0x1F01> " GREEK SMALL LETTER ALPHA WITH DASIA
+<e <char-0x1F11> " GREEK SMALL LETTER EPSILON WITH DASIA
+<h <char-0x1F21> " GREEK SMALL LETTER ETA WITH DASIA
+<i <char-0x1F31> " GREEK SMALL LETTER IOTA WITH DASIA
+<o <char-0x1F41> " GREEK SMALL LETTER OMICRON WITH DASIA
+<y <char-0x1F51> " GREEK SMALL LETTER UPSILON WITH DASIA
+<v <char-0x1F61> " GREEK SMALL LETTER OMEGA WITH DASIA
+"
+" letters with Psili and Varia:
+"
+>`A <char-0x1F0A> " GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA
+>`E <char-0x1F1A> " GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA
+>`H <char-0x1F2A> " GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA
+>`I <char-0x1F3A> " GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA
+>`O <char-0x1F4A> " GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA
+>`Y <char-0x1F5A> " GREEK CAPITAL LETTER UPSILON WITH PSILI AND VARIA
+>`V <char-0x1F6A> " GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA
+>`a <char-0x1F02> " GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA
+>`e <char-0x1F12> " GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA
+>`h <char-0x1F22> " GREEK SMALL LETTER ETA WITH PSILI AND VARIA
+>`i <char-0x1F32> " GREEK SMALL LETTER IOTA WITH PSILI AND VARIA
+>`o <char-0x1F42> " GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA
+>`y <char-0x1F52> " GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
+>`v <char-0x1F62> " GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA
+"
+" Letters with Dasia and Varia:
+"
+<`A <char-0x1F0B> " GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA
+<`E <char-0x1F1B> " GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA
+<`H <char-0x1F2B> " GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA
+<`I <char-0x1F3B> " GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA
+<`O <char-0x1F4B> " GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA
+<`Y <char-0x1F5B> " GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+<`V <char-0x1F6B> " GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA
+<`a <char-0x1F03> " GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA
+<`e <char-0x1F13> " GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA
+<`h <char-0x1F23> " GREEK SMALL LETTER ETA WITH DASIA AND VARIA
+<`i <char-0x1F33> " GREEK SMALL LETTER IOTA WITH DASIA AND VARIA
+<`o <char-0x1F43> " GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA
+<`y <char-0x1F53> " GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA
+<`v <char-0x1F63> " GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA
+"
+" letters with Psili and Oxia:
+"
+>;A <char-0x1F0C> " GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA
+>;E <char-0x1F1C> " GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA
+>;H <char-0x1F2C> " GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+>;I <char-0x1F3C> " GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA
+>;O <char-0x1F4C> " GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA
+>;Y <char-0x1F5C> " GREEK CAPITAL LETTER UPSILON WITH PSILI AND OXIA
+>;V <char-0x1F6C> " GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA
+>;a <char-0x1F04> " GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA
+>;e <char-0x1F14> " GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA
+>;h <char-0x1F24> " GREEK SMALL LETTER ETA WITH PSILI AND OXIA
+>;i <char-0x1F34> " GREEK SMALL LETTER IOTA WITH PSILI AND OXIA
+>;o <char-0x1F44> " GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA
+>;y <char-0x1F54> " GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
+>;v <char-0x1F64> " GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA
+"
+" Letters with Dasia and Oxia:
+"
+<;A <char-0x1F0D> " GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA
+<;E <char-0x1F1D> " GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+<;H <char-0x1F2D> " GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA
+<;I <char-0x1F3D> " GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA
+<;O <char-0x1F4D> " GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+<;Y <char-0x1F5D> " GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+<;V <char-0x1F6D> " GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA
+<;a <char-0x1F05> " GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA
+<;e <char-0x1F15> " GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+<;h <char-0x1F25> " GREEK SMALL LETTER ETA WITH DASIA AND OXIA
+<;i <char-0x1F35> " GREEK SMALL LETTER IOTA WITH DASIA AND OXIA
+<;o <char-0x1F45> " GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+<;y <char-0x1F55> " GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA
+<;v <char-0x1F65> " GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA
+"
+" letters with Psili and Perispomeni:
+"
+>~A <char-0x1F0E> " GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+>~E <char-0x1F1E> " GREEK CAPITAL LETTER EPSILON WITH PSILI AND PERISPOMENI
+>~H <char-0x1F2E> " GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI
+>~I <char-0x1F3E> " GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI
+>~O <char-0x1F4E> " GREEK CAPITAL LETTER OMICRON WITH PSILI AND PERISPOMENI
+>~Y <char-0x1F5E> " GREEK CAPITAL LETTER UPSILON WITH PSILI AND PERISPOMENI
+>~V <char-0x1F6E> " GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+>~a <char-0x1F06> " GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+>~e <char-0x1F16> " GREEK SMALL LETTER EPSILON WITH PSILI AND PERISPOMENI
+>~h <char-0x1F26> " GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI
+>~i <char-0x1F36> " GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI
+>~o <char-0x1F46> " GREEK SMALL LETTER OMICRON WITH PSILI AND PERISPOMENI
+>~y <char-0x1F56> " GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
+>~v <char-0x1F66> " GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+"
+" Letters with Dasia and Perispomeni:
+"
+<~A <char-0x1F0F> " GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<~E <char-0x1F1F> " GREEK CAPITAL LETTER EPSILON WITH DASIA AND PERISPOMENI
+<~H <char-0x1F2F> " GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+<~I <char-0x1F3F> " GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
+<~O <char-0x1F4F> " GREEK CAPITAL LETTER OMICRON WITH DASIA AND PERISPOMENI
+<~Y <char-0x1F5F> " GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<~V <char-0x1F6F> " GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+<~a <char-0x1F07> " GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+<~e <char-0x1F17> " GREEK SMALL LETTER EPSILON WITH DASIA AND PERISPOMENI
+<~h <char-0x1F27> " GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI
+<~i <char-0x1F37> " GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI
+<~o <char-0x1F47> " GREEK SMALL LETTER OMICRON WITH DASIA AND PERISPOMENI
+<~y <char-0x1F57> " GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+<~v <char-0x1F67> " GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+"
+"
+"
+" letters with Ypogegrammeni/Prosgegrammeni:
+"
+A| <char-0x1FBC> " GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+H| <char-0x1FCC> " GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+V| <char-0x1FFC> " GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+a| <char-0x1FB3> " GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
+h| <char-0x1FC3> " GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
+v| <char-0x1FF3> " GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
+"
+"
+"
+" letters with Psili and Ypogegrammeni/Prosgegrammeni:
+"
+>A| <char-0x1F88> " GREEK CAPITAL LETTER ALPHA WITH PSILI AND
+ " PROSGEGRAMMENI
+>H| <char-0x1F98> " GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
+>V| <char-0x1FA8> " GREEK CAPITAL LETTER OMEGA WITH PSILI AND
+ " PROSGEGRAMMENI
+>a| <char-0x1F80> " GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
+>h| <char-0x1F90> " GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
+>v| <char-0x1FA0> " GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
+"
+"
+"
+" letters with Dasia and Ypogegrammeni/Prosgegrammeni:
+"
+<A| <char-0x1F89> " GREEK CAPITAL LETTER ALPHA WITH DASIA AND
+ " PROSGEGRAMMENI
+<H| <char-0x1F99> " GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
+<V| <char-0x1FA9> " GREEK CAPITAL LETTER OMEGA WITH DASIA AND
+ " PROSGEGRAMMENI
+<a| <char-0x1F81> " GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
+<h| <char-0x1F91> " GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
+<v| <char-0x1FA1> " GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
+"
+"
+"
+" letters with Psili and Varia and Ypogegrammeni/Prosgegrammeni:
+"
+>`A| <char-0x1F8A> " GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND
+ " PROSGEGRAMMENI
+>`H| <char-0x1F9A> " GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND
+ " PROSGEGRAMMENI
+>`V| <char-0x1FAA> " GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND
+ " PROSGEGRAMMENI
+>`a| <char-0x1F82> " GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND
+ " YPOGEGRAMMENI
+>`h| <char-0x1F92> " GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND
+ " YPOGEGRAMMENI
+>`v| <char-0x1FA2> " GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND
+ " YPOGEGRAMMENI
+"
+"
+"
+" letters with Dasia and Varia and Ypogegrammeni/Prosgegrammeni:
+"
+<`A| <char-0x1F8B> " GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND
+ " PROSGEGRAMMENI
+<`H| <char-0x1F9B> " GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND
+ " PROSGEGRAMMENI
+<`V| <char-0x1FAB> " GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND
+ " PROSGEGRAMMENI
+<`a| <char-0x1F83> " GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND
+ " YPOGEGRAMMENI
+<`h| <char-0x1F93> " GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND
+ " YPOGEGRAMMENI
+<`v| <char-0x1FA3> " GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND
+ " YPOGEGRAMMENI
+"
+" letters with Psili and Oxia and Ypogegrammeni/Prosgegrammeni:
+"
+"
+"
+>;A| <char-0x1F8C> " GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND
+ " PROSGEGRAMMENI
+>;H| <char-0x1F9C> " GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND
+ " PROSGEGRAMMENI
+>;V| <char-0x1FAC> " GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND
+ " PROSGEGRAMMENI
+>;a| <char-0x1F84> " GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND
+ " YPOGEGRAMMENI
+>;h| <char-0x1F94> " GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND
+ " YPOGEGRAMMENI
+>;v| <char-0x1FA4> " GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND
+ " YPOGEGRAMMENI
+"
+" letters with Dasia and Oxia and Ypogegrammeni/Prosgegrammeni:
+"
+"
+"
+<;A| <char-0x1F8D> " GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND
+ " PROSGEGRAMMENI
+<;H| <char-0x1F9D> " GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND
+ " PROSGEGRAMMENI
+<;V| <char-0x1FAD> " GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND
+ " PROSGEGRAMMENI
+<;a| <char-0x1F85> " GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND
+ " YPOGEGRAMMENI
+<;h| <char-0x1F95> " GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND
+ " YPOGEGRAMMENI
+<;v| <char-0x1FA5> " GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND
+ " YPOGEGRAMMENI
+"
+" letters with Psili and Perispomeni and Ypogegrammeni/Prosgegrammeni:
+"
+"
+"
+>~A| <char-0x1F8E> " GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ " AND PROSGEGRAMMENI
+>~H| <char-0x1F9E> " GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA
+ " PERISPOMENI PROSGEGRAMMENI
+>~V| <char-0x1FAE> " GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI
+ " AND PROSGEGRAMMENI
+>~a| <char-0x1F86> " GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI
+ " AND YPOGEGRAMMENI
+>~h| <char-0x1F96> " GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND
+ " YPOGEGRAMMENI
+>~v| <char-0x1FA6> " GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI
+ " AND YPOGEGRAMMENI
+"
+" letters with Dasia and Perispomeni and Ypogegrammeni/Prosgegrammeni:
+"
+"
+"
+<~A| <char-0x1F8F> " GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ " AND PROSGEGRAMMENI
+<~H| <char-0x1F9F> " GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
+ " AND PROSGEGRAMMENI
+<~V| <char-0x1FAF> " GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ " AND PROSGEGRAMMENI
+<~a| <char-0x1F87> " GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI
+ " AND YPOGEGRAMMENI
+<~h| <char-0x1F97> " GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND
+ " YPOGEGRAMMENI
+<~v| <char-0x1FA7> " GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI
+ " AND YPOGEGRAMMENI
+"
+" letters with Perispomeni:
+"
+"
+"
+~a <char-0x1FB6> " GREEK SMALL LETTER ALPHA WITH PERISPOMENI
+~h <char-0x1FC6> " GREEK SMALL LETTER ETA WITH PERISPOMENI
+~i <char-0x1FD6> " GREEK SMALL LETTER IOTA WITH PERISPOMENI
+~y <char-0x1FE6> " GREEK SMALL LETTER UPSILON WITH PERISPOMENI
+~v <char-0x1FF6> " GREEK SMALL LETTER OMEGA WITH PERISPOMENI
+"
+" letters with Perispomeni and Ypogegrammeni:
+"
+"
+"
+~a| <char-0x1FB7> " GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND
+ " YPOGEGRAMMENI
+~h| <char-0x1FC7> " GREEK SMALL LETTER ETA WITH PERISPOMENI AND
+ " YPOGEGRAMMENI
+~v| <char-0x1FF7> " GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND
+ " YPOGEGRAMMENI
+"
+"
+" letters with Varia and Ypogegrammeni:
+"
+"
+"
+`a| <char-0x1FB2> " GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
+`h| <char-0x1FC2> " GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
+`v| <char-0x1FF2> " GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
+"
+" letters with Oxia and Ypogegrammeni:
+"
+"
+"
+;a| <char-0x1FB4> " GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+;h| <char-0x1FC4> " GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+;v| <char-0x1FF4> " GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+"
+"
+" Combining/Nonspacing comma above (0x0313) instead of Psili:
+"
+>, <char-0x0313> " COMBINING COMMA ABOVE
+"
+" Combining/Nonspacing reversed comma above (0x0314) instead of Dasia:
+"
+<, <char-0x0314> " COMBINING REVERSED COMMA ABOVE
+"
+"
+" Greek Quotes if your keyboard supports them
+ <char-0x201C> " QUOTEDBLLEFT
+ <char-0x201D> " QUOTEDBLRIGHT
+"
+"
+"
+
+
+" APPENDIX A - Additional characters
+"
+"
+;# <char-0x0374> " GREEK NUMERAL SIGN
+;## <char-0x0375> " GREEK LOWER NUMERAL SIGN
+|| <char-0x037A> " GREEK YPOGEGRAMMENI
+;b <char-0x03D0> " GREEK BETA SYMBOL
+;u <char-0x03D1> " GREEK THETA SYMBOL
+" <char-0x03D2> " GREEK UPSILON WITH HOOK SYMBOL
+" <char-0x03D3> " GREEK UPSILON WITH ACUTE AND HOOK SYMBOL
+" <char-0x03D4> " GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL
+;f <char-0x03D5> " GREEK PHI SYMBOL
+;p <char-0x03D6> " GREEK PI SYMBOL
+#ST <char-0x03DA> " GREEK LETTER STIGMA
+#G <char-0x03DC> " GREEK LETTER DIGAMMA
+#Q <char-0x03DE> " GREEK LETTER KOPPA
+#SP <char-0x03E0> " GREEK LETTER SAMPI
+;k <char-0x03F0> " GREEK KAPPA SYMBOL
+;r <char-0x03F1> " GREEK RHO SYMBOL
+" <char-0x03F2> " GREEK LUNATE SIGMA SYMBOL
+" <char-0x03F3> " GREEK LETTER YOT
+
+:~ <char-0x1FC1> "dialytika peripswmevn
+~: <char-0x1FC1> "dialytika peripswmevn
+
+:~i <char-0x1FD7> "iota dialytika perispomeni
+~:i <char-0x1FD7> "iota dialytika perispomeni
+
+:~y <char-0x1FE7> "upsilon dialytika perispomeni
+~:y <char-0x1FE7> "upsilon dialytika perispomeni
+
+-a <char-0x1FB1> "alpha macron
+-i <char-0x1FD1> "iota macron
+-y <char-0x1FE1> "upsilon macron
+-A <char-0x1FB9> "Alpha macron
+-I <char-0x1FD9> "Iota macron
+-Y <char-0x1FE9> "Upsilon macron
+^a <char-0x1FB0> "alpha braxy
+^i <char-0x1FD0> "iota braxy
+^y <char-0x1FE0> "upsilon braxy
+^A <char-0x1FB8> "alpha braxy
+^I <char-0x1FD8> "iota braxy
+^Y <char-0x1FE8> "upsilon braxy
+>r <char-0x1FE4> "rho psili
+<r <char-0x1FE5> "rho dasia
+
+<R <char-0x1FEC> "Rho dasia
+
+" More Symbols
+&& <char-0x03D7> "Greek kai
+D$ <char-0x20AF> "Drachma symbol
+#Q <char-0x03D8> "Archaic Qoppa
+#q <char-0x03D9> "Archaic qoppa
+;U <char-0x03F4> "Capital Theta symbol
+"!e <char-0x03F5> "Lunate epsilon
+"!E <char-0x03F6> "Lunate Epsilon
diff --git a/runtime/keymap/hebrew.vim b/runtime/keymap/hebrew.vim
new file mode 100644
index 0000000..0928fca
--- /dev/null
+++ b/runtime/keymap/hebrew.vim
@@ -0,0 +1,16 @@
+let encoding = &enc
+if encoding == 'latin1'
+ if has("unix")
+ let encoding = 'iso-8859-8'
+ else
+ let encoding = 'cp1255'
+ endif
+endif
+
+if encoding == 'utf-8'
+ source <sfile>:p:h/hebrew_utf-8.vim
+elseif encoding == 'cp1255'
+ source <sfile>:p:h/hebrew_cp1255.vim
+else
+ source <sfile>:p:h/hebrew_iso-8859-8.vim
+endif
diff --git a/runtime/keymap/hebrew_cp1255.vim b/runtime/keymap/hebrew_cp1255.vim
new file mode 100644
index 0000000..67a8ca7
--- /dev/null
+++ b/runtime/keymap/hebrew_cp1255.vim
@@ -0,0 +1,62 @@
+" add in the vowel points, known as 'niqud', which are present in
+" CP1255: Note: there are several 'standards' for placement of the vowel
+" points, and I ignored all of them. Since we can input English by simply
+" pressing Ctrl-^ and eliminating this map, I saw no reason to try to use
+" exotic key locations. If you don't like it, that's just too bad :-)
+let b:keymap_name = "heb"
+loadkeymap
+a <char-249> " ש - shin
+b <char-240> " נ - nun
+c <char-225> " ב - bet
+d <char-226> " ג - gimel
+e <char-247> " ק - qof
+f <char-235> " כ - kaf
+g <char-242> " ע - ayin
+h <char-233> " י - yod
+i <char-239> " ן - final nun
+j <char-231> " ח - het
+k <char-236> " ל - lamed
+l <char-234> " ך - final kaf
+m <char-246> " צ - tsadi
+n <char-238> " מ - mem
+o <char-237> " ם - final mem
+p <char-244> " פ - pe
+q / " / - slash
+r <char-248> " ר - resh
+s <char-227> " ד - dalet
+t <char-224> " א - alef
+u <char-229> " ו - vav
+v <char-228> " ה - he
+w ' " ' - single-quote
+x <char-241> " ס - samekh
+y <char-232> " ט - tet
+z <char-230> " ז - zayin
+, <char-250> " ת - tav
+. <char-245> " ץ - final tsadi
+; <char-243> " ף - final pe
+' , " , - comma
+/ . " . - period
+` ; " ; - semicolon
+" vowels:
+A: <Char-192> " sheva
+HE <Char-193> " hataf segol
+HA <Char-194> " hataf patah
+HO <Char-195> " hataf qamats
+I <Char-196> " hiriq
+AY <Char-197> " tsere
+E <Char-198> " segol
+AA <Char-199> " patah
+AO <Char-200> " qamats
+O <Char-201> " holam
+U <Char-203> " qubuts
+D <Char-204> " dagesh
+]T <Char-205> " meteg
+]Q <Char-206> " maqaf
+]R <ּChar-207> " rafe
+]p <Char-208> " paseq
+SR <Char-209> " shin-dot
+SL <Char-210> " sin-dot
+]P <Char-211> " sof-pasuq
+VV <Char-212> " double-vav
+VY <Char-213> " vav-yod
+YY <Char-214> " yod-yod
diff --git a/runtime/keymap/hebrew_iso-8859-8.vim b/runtime/keymap/hebrew_iso-8859-8.vim
new file mode 100644
index 0000000..eab3084
--- /dev/null
+++ b/runtime/keymap/hebrew_iso-8859-8.vim
@@ -0,0 +1,41 @@
+" Vim Keymap file for hebrew
+" Maintainer : Ron Aaron <ron@ronware.org>
+" Last Updated: Wed 28 Feb 2001 21:28:51
+" This is the standard Israeli keyboard layout
+
+" Use this short name in the status line.
+let b:keymap_name = "heb"
+
+loadkeymap
+a <char-249> " - shin
+b <char-240> " - nun
+c <char-225> " - bet
+d <char-226> " - gimel
+e <char-247> " - qof
+f <char-235> " - kaf
+g <char-242> " - ayin
+h <char-233> " - yod
+i <char-239> " - final nun
+j <char-231> " - het
+k <char-236> " - lamed
+l <char-234> " - final kaf
+m <char-246> " - tsadi
+n <char-238> " - mem
+o <char-237> " - final mem
+p <char-244> " - pe
+q / " / - slash
+r <char-248> " - resh
+s <char-227> " - dalet
+t <char-224> " - alef
+u <char-229> " - vav
+v <char-228> " - he
+w ' " ' - single-quote
+x <char-241> " - samekh
+y <char-232> " - tet
+z <char-230> " - zayin
+, <char-250> " - tav
+. <char-245> " - final tsadi
+; <char-243> " - final pe
+' , " , - comma
+/ . " . - period
+` ; " ; - semicolon
diff --git a/runtime/keymap/hebrew_utf-8.vim b/runtime/keymap/hebrew_utf-8.vim
new file mode 100644
index 0000000..6343884
--- /dev/null
+++ b/runtime/keymap/hebrew_utf-8.vim
@@ -0,0 +1,128 @@
+" Vim Keymap file for hebrew
+" Maintainer : Ron Aaron <ron@ronware.org>
+" Last Updated: Wed 28 Feb 2001 21:28:51
+" This is the standard Israeli keyboard layout with (my nonstandard locations
+" for) niqud, for utf:
+
+" Use this short name in the status line.
+let b:keymap_name = "heb"
+loadkeymap
+a <char-0x5e9> " ש - shin
+b <char-0x5e0> " נ - nun
+c <char-0x5d1> " ב - bet
+d <char-0x5d2> " ג - gimel
+e <char-0x5e7> " ק - qof
+f <char-0x5db> " כ - kaf
+g <char-0x5e2> " ע - ayin
+h <char-0x5d9> " י - yod
+i <char-0x5df> " ן - final nun
+j <char-0x5d7> " ח - het
+k <char-0x5dc> " ל - lamed
+l <char-0x5da> " ך - final kaf
+m <char-0x5e6> " צ - tsadi
+n <char-0x5de> " מ - mem
+o <char-0x5dd> " ם - final mem
+p <char-0x5e4> " פ - pe
+q / " / - slash
+r <char-0x5e8> " ר - resh
+s <char-0x5d3> " ד - dalet
+t <char-0x5d0> " א - alef
+u <char-0x5d5> " ו - vav
+v <char-0x5d4> " ה - he
+w ' " ' - single-quote
+x <char-0x5e1> " ס - samekh
+y <char-0x5d8> " ט - tet
+z <char-0x5d6> " ז - zayin
+, <char-0x5ea> " ת - tav
+. <char-0x5e5> " ץ - final tsadi
+; <char-0x5e3> " ף - final pe
+' , " , - comma
+/ . " . - period
+` ; " ; - semicolon
+A: <Char-0x5b0> " sheva
+HE <Char-0x5b1> " hataf segol
+HA <Char-0x5b2> " hataf patah
+HO <Char-0x5b3> " hataf qamats
+I <Char-0x5b4> " hiriq
+AY <Char-0x5b5> " tsere
+E <Char-0x5b6> " segol
+AA <Char-0x5b7> " patah
+AO <Char-0x5b8> " qamats
+O <Char-0x5b9> " holam
+U <Char-0x5bb> " qubuts
+D <Char-0x5bc> " dagesh
+]T <Char-0x5bd> " meteg
+]Q <Char-0x5be> " maqaf
+]R <Char-0x5bf> " rafe
+]p <Char-0x5c0> " paseq
+SR <Char-0x5c1> " shin-dot
+SL <Char-0x5c2> " sin-dot
+]P <Char-0x5c3> " sof-pasuq
+VV <Char-0x5f0> " double-vav
+VY <Char-0x5f1> " vav-yod
+YY <Char-0x5f2> " yod-yod
+" cantillation:
+C: <Char-0x591> " etnahta
+Cs <Char-0x592> " segol
+CS <Char-0x593> " shalshelet
+Cz <Char-0x594> " zaqef qatan
+CZ <Char-0x595> " zaqef gadol
+Ct <Char-0x596> " tipeha
+Cr <Char-0x597> " revia
+Cq <Char-0x598> " zarqa
+Cp <Char-0x599> " pashta
+C! <Char-0x59a> " yetiv
+Cv <Char-0x59b> " tevir
+Cg <Char-0x59c> " geresh
+C* <Char-0x59d> " geresh qadim
+CG <Char-0x59e> " gershayim
+CP <Char-0x59f> " qarnei-parah
+Cy <Char-0x5aa> " yerach-ben-yomo
+Co <Char-0x5ab> " ole
+Ci <Char-0x5ac> " iluy
+Cd <Char-0x5ad> " dehi
+Cn <Char-0x5ae> " zinor
+CC <Char-0x5af> " masora circle
+X` <Char-0xfb20> " Alternative `ayin
+X' <Char-0xfb21> " Alternative 'alef
+X-d <Char-0xfb22> " Alternative dalet
+X-h <Char-0xfb23> " Alternative he
+X-k <Char-0xfb24> " Alternative kaf
+X-l <Char-0xfb25> " Alternative lamed
+X-m <Char-0xfb26> " Alternative mem-sofit
+X-r <Char-0xfb27> " Alternative resh
+X-t <Char-0xfb28> " Alternative tav
+X-+ <Char-0xfb29> " Alternative plus
+XW <Char-0xfb2a> " shin+shin-dot
+Xw <Char-0xfb2b> " shin+sin-dot
+X..W <Char-0xfb2c> " shin+shin-dot+dagesh
+X..w <Char-0xfb2d> " shin+sin-dot+dagesh
+XA <Char-0xfb2e> " alef+patah
+XO <Char-0xfb2f> " alef+qamats
+XI <Char-0xfb30> " alef+hiriq (mapiq)
+X.b <Char-0xfb31> " bet+dagesh
+X.g <Char-0xfb32> " gimel+dagesh
+X.d <Char-0xfb33> " dalet+dagesh
+X.h <Char-0xfb34> " he+dagesh
+Xu <Char-0xfb35> " vav+dagesh
+X.z <Char-0xfb36> " zayin+dagesh
+X.T <Char-0xfb38> " tet+dagesh
+X.y <Char-0xfb39> " yud+dagesh
+X.K <Char-0xfb3a> " kaf sofit+dagesh
+X.k <Char-0xfb3b> " kaf+dagesh
+X.l <Char-0xfb3c> " lamed+dagesh
+X.m <Char-0xfb3e> " mem+dagesh
+X.n <Char-0xfb40> " nun+dagesh
+X.s <Char-0xfb41> " samech+dagesh
+X.P <Char-0xfb43> " pe sofit+dagesh
+X.p <Char-0xfb44> " pe+dagesh
+X.x <Char-0xfb46> " tsadi+dagesh
+X.q <Char-0xfb47> " qof+dagesh
+X.r <Char-0xfb48> " resh+dagesh
+X.w <Char-0xfb49> " shin+dagesh
+X.t <Char-0xfb4a> " tav+dagesh
+Xo <Char-0xfb4b> " vav+holam
+XRb <Char-0xfb4c> " bet+rafe
+XRk <Char-0xfb4d> " kaf+rafe
+XRp <Char-0xfb4e> " pe+rafe
+Xal <Char-0xfb4f> " alef-lamed
diff --git a/runtime/keymap/hebrewp.vim b/runtime/keymap/hebrewp.vim
new file mode 100644
index 0000000..a87cdc7
--- /dev/null
+++ b/runtime/keymap/hebrewp.vim
@@ -0,0 +1,16 @@
+let encoding = &enc
+if encoding == 'latin1'
+ if has("unix")
+ let encoding = 'iso-8859-8'
+ else
+ let encoding = 'cp1255'
+ endif
+endif
+
+if encoding == 'utf-8'
+ source <sfile>:p:h/hebrewp_utf-8.vim
+elseif encoding == 'cp1255'
+ source <sfile>:p:h/hebrewp_cp1255.vim
+else
+ source <sfile>:p:h/hebrewp_iso-8859-8.vim
+endif
diff --git a/runtime/keymap/hebrewp_cp1255.vim b/runtime/keymap/hebrewp_cp1255.vim
new file mode 100644
index 0000000..990f908
--- /dev/null
+++ b/runtime/keymap/hebrewp_cp1255.vim
@@ -0,0 +1,58 @@
+" codepage 1255 on Windows is equal to ISO 8859-8 but it
+" adds in the vowel points, known as 'niqud', which are present in
+" CP1255: Note: there are several 'standards' for placement of the vowel
+" points, and I ignored all of them. Since we can input English by simply
+" pressing Ctrl-^ and eliminating this map, I saw no reason to try to use
+" exotic key locations. If you don't like it, that's just too bad :-)
+let b:keymap_name = "hebp"
+loadkeymap
+K <char-234> " final kaf
+M <char-237> " final mem
+N <char-239> " final nun
+P <char-243> " final pe
+T <char-232> " tet
+X <char-245> " final tsadi
+a <char-224> " alef
+b <char-225> " bet
+d <char-227> " dalet
+g <char-226> " gimel
+h <char-228> " he
+j <char-231> " het
+k <char-235> " kaf
+l <char-236> " lamed
+m <char-238> " mem
+n <char-240> " nun
+s <char-241> " samekh
+p <char-244> " pe
+q <char-247> " qof
+r <char-248> " resh
+t <char-250> " tav
+u <char-242> " ayin
+v <char-229> " vav
+w <char-249> " shin
+x <char-246> " tsadi
+y <char-233> " yod
+z <char-230> " zayin
+" vowels:
+A: <Char-192> " sheva
+HE <Char-193> " hataf segol
+HA <Char-194> " hataf patah
+HO <Char-195> " hataf qamats
+I <Char-196> " hiriq
+AY <Char-197> " tsere
+E <Char-198> " segol
+AA <Char-199> " patah
+AO <Char-200> " qamats
+O <Char-201> " holam
+U <Char-203> " qubuts
+D <Char-204> " dagesh
+]T <Char-205> " meteg
+]Q <Char-206> " maqaf
+]R <Char-207> " rafe
+]p <Char-208> " paseq
+SR <Char-209> " shin-dot
+SL <Char-210> " sin-dot
+]P <Char-211> " sof-pasuq
+VV <Char-212> " double-vav
+VY <Char-213> " vav-yod
+YY <Char-214> " yod-yod
diff --git a/runtime/keymap/hebrewp_iso-8859-8.vim b/runtime/keymap/hebrewp_iso-8859-8.vim
new file mode 100644
index 0000000..d4b9714
--- /dev/null
+++ b/runtime/keymap/hebrewp_iso-8859-8.vim
@@ -0,0 +1,36 @@
+" Vim Keymap file for hebrew
+" Maintainer : Ron Aaron <ron@ronware.org>
+" Last Updated: Sun 10 Feb 2002 11:50:56
+" This is my version of a phonetic Hebrew
+
+" Use this short name in the status line.
+let b:keymap_name = "hebp"
+
+loadkeymap
+K <char-234> " final kaf
+M <char-237> " final mem
+N <char-239> " final nun
+P <char-243> " final pe
+T <char-232> " tet
+X <char-245> " final tsadi
+a <char-224> " alef
+b <char-225> " bet
+d <char-227> " dalet
+g <char-226> " gimel
+h <char-228> " he
+j <char-231> " het
+k <char-235> " kaf
+l <char-236> " lamed
+m <char-238> " mem
+n <char-240> " nun
+s <char-241> " samekh
+p <char-244> " pe
+q <char-247> " qof
+r <char-248> " resh
+t <char-250> " tav
+u <char-242> " ayin
+v <char-229> " vav
+w <char-249> " shin
+x <char-246> " tsadi
+y <char-233> " yod
+z <char-230> " zayin
diff --git a/runtime/keymap/hebrewp_utf-8.vim b/runtime/keymap/hebrewp_utf-8.vim
new file mode 100644
index 0000000..dded60e
--- /dev/null
+++ b/runtime/keymap/hebrewp_utf-8.vim
@@ -0,0 +1,122 @@
+" Vim Keymap file for hebrew
+" Maintainer : Ron Aaron <ron@ronware.org>
+" Last Updated: Thu 08 Mar 2001 13:49:01
+" This is my version of a phonetic Hebrew
+
+" Use this short name in the status line.
+let b:keymap_name = "hebp"
+loadkeymap
+w <char-0x5e9> " - shin
+n <char-0x5e0> " - nun
+b <char-0x5d1> " - bet
+g <char-0x5d2> " - gimel
+q <char-0x5e7> " - qof
+k <char-0x5db> " - kaf
+g <char-0x5e2> " - ayin
+y <char-0x5d9> " - yod
+N <char-0x5df> " - final nun
+j <char-0x5d7> " - het
+l <char-0x5dc> " - lamed
+K <char-0x5da> " - final kaf
+x <char-0x5e6> " - tsadi
+m <char-0x5de> " - mem
+M <char-0x5dd> " - final mem
+p <char-0x5e4> " - pe
+r <char-0x5e8> " - resh
+d <char-0x5d3> " - dalet
+a <char-0x5d0> " - alef
+v <char-0x5d5> " - vav
+h <char-0x5d4> " - he
+s <char-0x5e1> " - samekh
+T <char-0x5d8> " - tet
+z <char-0x5d6> " - zayin
+t <char-0x5ea> " - tav
+X <char-0x5e5> " - final tsadi
+P <char-0x5e3> " - final pe
+A: <Char-0x5b0> " sheva
+HE <Char-0x5b1> " hataf segol
+HA <Char-0x5b2> " hataf patah
+HO <Char-0x5b3> " hataf qamats
+I <Char-0x5b4> " hiriq
+AY <Char-0x5b5> " tsere
+E <Char-0x5b6> " segol
+AA <Char-0x5b7> " patah
+AO <Char-0x5b8> " qamats
+O <Char-0x5b9> " holam
+U <Char-0x5bb> " qubuts
+D <Char-0x5bc> " dagesh
+]T <Char-0x5bd> " meteg
+]Q <Char-0x5be> " maqaf
+]R <Char-0x5bf> " rafe
+]p <Char-0x5c0> " paseq
+SR <Char-0x5c1> " shin-dot
+SL <Char-0x5c2> " sin-dot
+]P <Char-0x5c3> " sof-pasuq
+VV <Char-0x5f0> " double-vav
+VY <Char-0x5f1> " vav-yod
+YY <Char-0x5f2> " yod-yod
+" cantillation:
+C: <Char-0x591> " etnahta
+Cs <Char-0x592> " segol
+CS <Char-0x593> " shalshelet
+Cz <Char-0x594> " zaqef qatan
+CZ <Char-0x595> " zaqef gadol
+Ct <Char-0x596> " tipeha
+Cr <Char-0x597> " revia
+Cq <Char-0x598> " zarqa
+Cp <Char-0x599> " pashta
+C! <Char-0x59a> " yetiv
+Cv <Char-0x59b> " tevir
+Cg <Char-0x59c> " geresh
+C* <Char-0x59d> " geresh qadim
+CG <Char-0x59e> " gershayim
+CP <Char-0x59f> " qarnei-parah
+Cy <Char-0x5aa> " yerach-ben-yomo
+Co <Char-0x5ab> " ole
+Ci <Char-0x5ac> " iluy
+Cd <Char-0x5ad> " dehi
+Cn <Char-0x5ae> " zinor
+CC <Char-0x5af> " masora circle
+X` <Char-0xfb20> " Alternative `ayin
+X' <Char-0xfb21> " Alternative 'alef
+X-d <Char-0xfb22> " Alternative dalet
+X-h <Char-0xfb23> " Alternative he
+X-k <Char-0xfb24> " Alternative kaf
+X-l <Char-0xfb25> " Alternative lamed
+X-m <Char-0xfb26> " Alternative mem-sofit
+X-r <Char-0xfb27> " Alternative resh
+X-t <Char-0xfb28> " Alternative tav
+X-+ <Char-0xfb29> " Alternative plus
+XW <Char-0xfb2a> " shin+shin-dot
+Xw <Char-0xfb2b> " shin+sin-dot
+X..W <Char-0xfb2c> " shin+shin-dot+dagesh
+X..w <Char-0xfb2d> " shin+sin-dot+dagesh
+XA <Char-0xfb2e> " alef+patah
+XO <Char-0xfb2f> " alef+qamats
+XI <Char-0xfb30> " alef+hiriq (mapiq)
+X.b <Char-0xfb31> " bet+dagesh
+X.g <Char-0xfb32> " gimel+dagesh
+X.d <Char-0xfb33> " dalet+dagesh
+X.h <Char-0xfb34> " he+dagesh
+Xu <Char-0xfb35> " vav+dagesh
+X.z <Char-0xfb36> " zayin+dagesh
+X.T <Char-0xfb38> " tet+dagesh
+X.y <Char-0xfb39> " yud+dagesh
+X.K <Char-0xfb3a> " kaf sofit+dagesh
+X.k <Char-0xfb3b> " kaf+dagesh
+X.l <Char-0xfb3c> " lamed+dagesh
+X.m <Char-0xfb3e> " mem+dagesh
+X.n <Char-0xfb40> " nun+dagesh
+X.s <Char-0xfb41> " samech+dagesh
+X.P <Char-0xfb43> " pe sofit+dagesh
+X.p <Char-0xfb44> " pe+dagesh
+X.x <Char-0xfb46> " tsadi+dagesh
+X.q <Char-0xfb47> " qof+dagesh
+X.r <Char-0xfb48> " resh+dagesh
+X.w <Char-0xfb49> " shin+dagesh
+X.t <Char-0xfb4a> " tav+dagesh
+Xo <Char-0xfb4b> " vav+holam
+XRb <Char-0xfb4c> " bet+rafe
+XRk <Char-0xfb4d> " kaf+rafe
+XRp <Char-0xfb4e> " pe+rafe
+Xal <Char-0xfb4f> " alef-lamed
diff --git a/runtime/keymap/kana.vim b/runtime/keymap/kana.vim
new file mode 100644
index 0000000..9aff4eb
--- /dev/null
+++ b/runtime/keymap/kana.vim
@@ -0,0 +1,727 @@
+" This script was originally created by Rory McCann <ebelular at gmail dot com>.
+" Dan Kenigsberg noticed some deficiencies and suggested this one instead.
+"
+" Maintainer: Rory McCann <ebelular at gmail dot com>
+" Modified by: Edward L. Fox <edyfox at gmail dot com>
+" Last Change: 2006 Apr 30
+"
+"
+"
+" Kana.kmap (Japanese Phonograms)
+"
+" Converted from Gaspar Sinai's yudit 2.7.6
+" GNU (C) Gaspar Sinai <gsinai@yudit.org>
+"
+" WARNING
+" -------
+" This version of Kana.kmap is different from the one that has been used
+" with yudit-2.7.2 or earlier. The main difference is that this kmap is
+" arranged in such a way that it complies with an authorized Japanese
+" transliteration. As a result, backward compatibility is not guaranteed.
+"
+" NOTE
+" ----
+" 1. In general, the transliteration is based on Japanese Government's
+" Cabinet Notification 1 (Dec. 9, 1954).
+"
+" Summary:
+"
+" (1) To transliterate Japanese language, Table 1 should be used
+" primarily.
+" (2) Table 2 may be used only when existing conventions such as
+" international relationship should be respected.
+" (3) Other transliteration is acceptable only when neither Table 1
+" nor Table 2 gives any specification of the sound in question
+"
+" For details, refer to
+"
+" http://xembho.tripod.com/siryo/naikaku_kokuzi.html
+"
+" 2. The specification instructed by the Cabinet Notification is rather
+" inadequate even for daily use. At the present time there are thus
+" many unauthorized but widely accepted conventions used together with
+" the authorized transliteration. This kmap contains some of them for
+" user's convenience (cf. Hiragana 3 and Katakana 3).
+"
+" 3. For the unicode mapping relevant to this kmap, refer to 3075--30F5 of
+"
+" http://www.macchiato.com/unicode/charts.html
+"
+" HISTORY
+" -------
+" 2005-01-11 <danken@cs.technion.ac.il>
+" * Converted to Vim format.
+" 2003-01-22 <kazunobu.kuriyama@nifty.com>
+"
+" * Submitted to gsinai@yudit.org
+"
+" ============================================================================
+
+scriptencoding utf-8
+
+" ----------------------------------------------------------------------------
+" Kigou (Punctuation etc.)
+" ----------------------------------------------------------------------------
+
+let b:keymap_name = "kana"
+
+loadkeymap
+"0x20 0x3000
+, 、
+. 。
+,, 〃
+
+
+xx 〆
+@ 〇
+< 〈
+> 〉
+<< 《
+>> 》
+{ 「
+} 」
+{{ 『
+}} 』
+[.( 【
+).] 】
+
+
+[ 〔
+] 〕
+[( 〖
+)] 〗
+
+
+[[ 〚
+]] 〛
+
+
+.. ・
+- ー
+
+
+" ----------------------------------------------------------------------------
+" Hiragana 1 --- Table 1, Cabinet Notification No. 1 (Dec. 9, 1954)
+" ----------------------------------------------------------------------------
+a あ
+i い
+u う
+e え
+o お
+
+ka か
+ki き
+ku く
+ke け
+ko こ
+
+sa さ
+si し
+su す
+se せ
+so そ
+
+ta た
+ti ち
+tu つ
+te て
+to と
+
+na な
+ni に
+nu ぬ
+ne ね
+no の
+
+ha は
+hi ひ
+hu ふ
+he へ
+ho ほ
+
+ma ま
+mi み
+mu む
+me め
+mo も
+
+ya や
+yu ゆ
+yo よ
+
+ra ら
+ri り
+ru る
+re れ
+ro ろ
+
+wa わ
+
+ga が
+gi ぎ
+gu ぐ
+ge げ
+go ご
+
+za ざ
+zi じ
+zu ず
+ze ぜ
+zo ぞ
+
+da だ
+de で
+do ど
+
+ba ば
+bi び
+bu ぶ
+be べ
+bo ぼ
+
+pa ぱ
+pi ぴ
+pu ぷ
+pe ぺ
+po ぽ
+
+kya きゃ
+kyu きゅ
+kyo きょ
+
+sya しゃ
+syu しゅ
+syo しょ
+
+tya ちゃ
+tyu ちゅ
+tyo ちょ
+
+nya にゃ
+nyu にゅ
+nyo にょ
+
+hya ひゃ
+hyu ひゅ
+hyo ひょ
+
+mya みゃ
+myu みゅ
+myo みょ
+
+rya りゃ
+ryu りゅ
+ryo りょ
+
+gya ぎゃ
+gyu ぎゅ
+gyo ぎょ
+
+zya じゃ
+zyu じゅ
+zyo じょ
+
+bya びゃ
+byu びゅ
+byo びょ
+
+pya ぴゃ
+pyu ぴゅ
+pyo ぴょ
+
+n ん
+n' ん
+
+
+" ----------------------------------------------------------------------------
+" Hiragana 2 --- Table 2, Cabinet Notification No. 1 (Dec. 9, 1954)
+" ----------------------------------------------------------------------------
+sha しゃ
+shi し
+shu しゅ
+sho しょ
+
+tsu つ
+
+cha ちゃ
+chi ち
+chu ちゅ
+cho ちょ
+
+fu ふ
+
+ja じゃ
+ji じ
+ju じゅ
+jo じょ
+
+di ぢ
+du づ
+dya ぢゃ
+dyu ぢゅ
+dyo ぢょ
+
+kwa くゎ
+gwa ぐゎ
+
+wo を
+
+
+" ----------------------------------------------------------------------------
+" Hiragana 3 --- Conventional transliterations
+" ----------------------------------------------------------------------------
+
+" Small Hiragana: The prefix X is never pronounced. It is used as something
+" like an escape character.
+xa ぁ
+xi ぃ
+xu ぅ
+xe ぇ
+xo ぉ
+
+xtu っ
+
+xya ゃ
+xyu ゅ
+xyo ょ
+
+xwa ゎ
+
+" Historic `wi' and `we'
+wi ゐ
+we ゑ
+
+" Preceded by a small `tu'
+kka っか
+kki っき
+kku っく
+kke っけ
+kko っこ
+
+ssa っさ
+ssi っし
+ssu っす
+sse っせ
+sso っそ
+
+tta った
+tti っち
+ttu っつ
+tte って
+tto っと
+
+hha っは
+hhi っひ
+hhu っふ
+hhe っへ
+hho っほ
+
+mma っま
+mmi っみ
+mmu っむ
+mme っめ
+mmo っも
+
+yya っや
+yyu っゆ
+yyo っよ
+
+rra っら
+rri っり
+rru っる
+rre っれ
+rro っろ
+
+wwa っわ
+
+gga っが
+ggi っぎ
+ggu っぐ
+gge っげ
+ggo っご
+
+zza っざ
+zzi っじ
+zzu っず
+zze っぜ
+zzo っぞ
+
+dda っだ
+ddi っぢ
+ddu っづ
+dde っで
+ddo っど
+
+bba っば
+bbi っび
+bbu っぶ
+bbe っべ
+bbo っぼ
+
+ppa っぱ
+ppi っぴ
+ppu っぷ
+ppe っぺ
+ppo っぽ
+
+" Preceded by a small `tu' and followed by a small 'ya', 'yu' or 'yo'
+kkya っきゃ
+kkyu っきゅ
+kkyo っきょ
+
+ssya っしゃ
+ssyu っしゅ
+ssyo っしょ
+
+ttya っちゃ
+ttyu っちゅ
+ttyo っちょ
+
+hhya っひゃ
+hhyu っひゅ
+hhyo っひょ
+
+mmya っみゃ
+mmyu っみゅ
+mmyo っみょ
+
+rrya っりゃ
+rryu っりゅ
+rryo っりょ
+
+ggya っぎゃ
+ggyu っぎゅ
+ggyo っぎょ
+
+zzya っじゃ
+zzyu っじゅ
+zzyo っじょ
+
+bbya っびゃ
+bbyu っびゅ
+bbyo っびょ
+
+ppya っぴゃ
+ppyu っぴゅ
+ppyo っぴょ
+
+
+" ----------------------------------------------------------------------------
+" Katakana 1 --- Table 1, Cabinet Notification No. 1 (Dec. 9, 1954)
+" ----------------------------------------------------------------------------
+A ア
+I イ
+U ウ
+E エ
+O オ
+
+KA カ
+KI キ
+KU ク
+KE ケ
+KO コ
+
+SA サ
+SI シ
+SU ス
+SE セ
+SO ソ
+
+TA タ
+TI チ
+TU ツ
+TE テ
+TO ト
+
+NA ナ
+NI ニ
+NU ヌ
+NE ネ
+NO ノ
+
+HA ハ
+HI ヒ
+HU フ
+HE ヘ
+HO ホ
+
+MA マ
+MI ミ
+MU ム
+ME メ
+MO モ
+
+YA ヤ
+YU ユ
+YO ヨ
+
+RA ラ
+RI リ
+RU ル
+RE レ
+RO ロ
+
+WA ワ
+
+GA ガ
+GI ギ
+GU グ
+GE ゲ
+GO ゴ
+
+ZA ザ
+ZI ジ
+ZU ズ
+ZE ゼ
+ZO ゾ
+
+DA ダ
+DE デ
+DO ド
+
+BA バ
+BI ビ
+BU ブ
+BE ベ
+BO ボ
+
+PA パ
+PI ピ
+PU プ
+PE ペ
+PO ポ
+
+KYA キャ
+KYU キュ
+KYO キョ
+
+SYA シャ
+SYU シュ
+SYO ショ
+
+TYA チャ
+TYU チュ
+TYO チョ
+
+NYA ニャ
+NYU ニュ
+NYO ニョ
+
+HYA ヒャ
+HYU ヒュ
+HYO ヒョ
+
+MYA ミャ
+MYU ミュ
+MYO ミョ
+
+RYA リャ
+RYU リュ
+RYO リョ
+
+GYA ギャ
+GYU ギュ
+GYO ギョ
+
+ZYA ジャ
+ZYU ジュ
+ZYO ジョ
+
+BYA ビャ
+BYU ビュ
+BYO ビョ
+
+PYA ピャ
+PYU ピュ
+PYO ピョ
+
+N ン
+N' ン
+
+
+" ----------------------------------------------------------------------------
+" Katakana 2 --- Table 2, Cabinet Notification No. 1 (Dec. 9, 1954)
+" ----------------------------------------------------------------------------
+SHA シャ
+SHI シ
+SHU シュ
+SHO ショ
+
+TSU ツ
+
+CHA チャ
+CHI チ
+CHU チュ
+CHO チョ
+
+FU フ
+
+JA ジャ
+JI ジ
+JU ジュ
+JO ジョ
+
+DI ヂ
+DU ヅ
+DYA ヂャ
+DYU ヂュ
+DYO ヂョ
+
+KWA クヮ
+GWA グヮ
+
+WO ヲ
+
+
+" ----------------------------------------------------------------------------
+" Katakana 3 --- Conventional transliterations
+" ----------------------------------------------------------------------------
+
+" Small Katakana: The prefix X is never pronounced. It is used as something
+" like an escape character.
+XA ァ
+XI ィ
+XU ゥ
+XE ェ
+XO ォ
+
+XTU ッ
+
+XYA ャ
+XYU ュ
+XYO ョ
+
+XWA ヮ
+
+" Used only for counting someone or something
+XKA ヵ
+XKE ヶ
+
+" Historic `wi' and `we'
+WI ヰ
+WE ヱ
+
+" Used for the sound `v' of European languages
+VA ヴァ
+VI ヴィ
+VU ヴ
+VE ヴェ
+VO ヴォ
+
+VYU ヴュ
+
+" Preceded by a small `tu'
+KKA ッカ
+KKI ッキ
+KKU ック
+KKE ッケ
+KKO ッコ
+
+SSA ッサ
+SSI ッシ
+SSU ッス
+SSE ッセ
+SSO ッソ
+
+TTA ッタ
+TTI ッチ
+TTU ッツ
+TTE ッテ
+TTO ット
+
+HHA ッハ
+HHI ッヒ
+HHU ッフ
+HHE ッヘ
+HHO ッホ
+
+MMA ッマ
+MMI ッミ
+MMU ッム
+MME ッメ
+MMO ッモ
+
+YYA ッヤ
+YYU ッユ
+YYO ッヨ
+
+RRA ッラ
+RRI ッリ
+RRU ッル
+RRE ッレ
+RRO ッロ
+
+WWA ッワ
+
+GGA ッガ
+GGI ッギ
+GGU ッグ
+GGE ッゲ
+GGO ッゴ
+
+ZZA ッザ
+ZZI ッジ
+ZZU ッズ
+ZZE ッゼ
+ZZO ッゾ
+
+DDA ッダ
+DDI ッヂ
+DDU ッヅ
+DDE ッデ
+DDO ッド
+
+BBA ッバ
+BBI ッビ
+BBU ッブ
+BBE ッベ
+BBO ッボ
+
+PPA ッパ
+PPI ッピ
+PPU ップ
+PPE ッペ
+PPO ッポ
+
+" Preceded by a small `tu' and followed by a small 'ya', 'yu' or 'yo'
+KKYA ッキャ
+KKYU ッキュ
+KKYO ッキョ
+
+SSYA ッシャ
+SSYU ッシュ
+SSYO ッショ
+
+TTYA ッチャ
+TTYU ッチュ
+TTYO ッチョ
+
+HHYA ッヒャ
+HHYU ッヒュ
+HHYO ッヒョ
+
+MMYA ッミャ
+MMYU ッミュ
+MMYO ッミョ
+
+RRYA ッリャ
+RRYU ッリュ
+RRYO ッリョ
+
+GGYA ッギャ
+GGYU ッギュ
+GGYO ッギョ
+
+ZZYA ッジャ
+ZZYU ッジュ
+ZZYO ッジョ
+
+BBYA ッビャ
+BBYU ッビュ
+BBYO ッビョ
+
+PPYA ッピャ
+PPYU ッピュ
+PPYO ッピョ
+
+
diff --git a/runtime/keymap/kazakh-jcuken.vim b/runtime/keymap/kazakh-jcuken.vim
new file mode 100644
index 0000000..63d122d
--- /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/korean-dubeolsik_utf-8.vim b/runtime/keymap/korean-dubeolsik_utf-8.vim
new file mode 100644
index 0000000..a6b5f2a
--- /dev/null
+++ b/runtime/keymap/korean-dubeolsik_utf-8.vim
@@ -0,0 +1,11237 @@
+" Maintainer: Jang Whemoon <palindrom615@gmail.com>
+" Last Change: Nov 24, 2020
+"
+"
+"
+" Unlike Japanese or Chinese, modern Korean texts do not depends on conversion
+" to Hanja (Chinese character). Thus, general Korean text totally can be
+" covered without help of IME but this keymap.
+"
+" BUT, simply mapping each letter of Hangul with sequence of alphabet 1 by 1
+" can fail to combine Hangul jamo (conconants and vowels) right.
+" For example, sequentially pressing `ㅅㅓㅇㅜㄹㄷㅐㅎㅏㄱㅛ` can not only be
+" combined as `서울대학교`, but alse `성ㅜㄹ댛ㅏㄱ교`, which is totally
+" nonsense.
+" Though combining Hangul is deterministic with law that each letter must be
+" one of (consonant + vowel) or (consonant + vowel + consonant), there is no
+" way to apply such law without implementing input engine.
+"
+" Thus, user of this keymap should wait until previous hangul letter is
+" completed before typing next one. To reduce such inconvenience, I suggest to
+" set `timeoutlen` as their own value. (default value is 1000ms)
+scriptencoding utf-8
+
+let b:keymap_name = "ko"
+
+loadkeymap
+
+" Hangul jamo of 40 letters
+
+q ㅂ
+w ㅈ
+e ㄷ
+r ㄱ
+t ㅅ
+y ㅛ
+u ㅕ
+i ㅑ
+o ㅐ
+p ㅔ
+a ㅁ
+s ㄴ
+d ㅇ
+f ㄹ
+g ㅎ
+h ㅗ
+j ㅓ
+k ㅏ
+l ㅣ
+z ㅋ
+x ㅌ
+c ㅊ
+v ㅍ
+b ㅠ
+n ㅜ
+m ㅡ
+Q ㅃ
+W ㅉ
+E ㄸ
+R ㄲ
+T ㅆ
+O ㅒ
+P ㅖ
+
+" Hangul syllables of 11172 letters
+
+rk 가
+ro 개
+ri 갸
+rO 걔
+rj 거
+rp 게
+ru 겨
+rP 계
+rh 고
+rhk 과
+rho 괘
+rhl 괴
+ry 교
+rn 구
+rnj 궈
+rnp 궤
+rnl 귀
+rb 규
+rm 그
+rml 긔
+rl 기
+Rk 까
+Ro 깨
+Ri 꺄
+RO 꺠
+Rj 꺼
+Rp 께
+Ru 껴
+RP 꼐
+Rh 꼬
+Rhk 꽈
+Rho 꽤
+Rhl 꾀
+Ry 꾜
+Rn 꾸
+Rnj 꿔
+Rnp 꿰
+Rnl 뀌
+Rb 뀨
+Rm 끄
+Rml 끠
+Rl 끼
+sk 나
+so 내
+si 냐
+sO 냬
+sj 너
+sp 네
+su 녀
+sP 녜
+sh 노
+shk 놔
+sho 놰
+shl 뇌
+sy 뇨
+sn 누
+snj 눠
+snp 눼
+snl 뉘
+sb 뉴
+sm 느
+sml 늬
+sl 니
+ek 다
+eo 대
+ei 댜
+eO 댸
+ej 더
+ep 데
+eu 뎌
+eP 뎨
+eh 도
+ehk 돠
+eho 돼
+ehl 되
+ey 됴
+en 두
+enj 둬
+enp 뒈
+enl 뒤
+eb 듀
+em 드
+eml 듸
+el 디
+Ek 따
+Eo 때
+Ei 땨
+EO 떄
+Ej 떠
+Ep 떼
+Eu 뗘
+EP 뗴
+Eh 또
+Ehk 똬
+Eho 뙈
+Ehl 뙤
+Ey 뚀
+En 뚜
+Enj 뚸
+Enp 뛔
+Enl 뛰
+Eb 뜌
+Em 뜨
+Eml 띄
+El 띠
+fk 라
+fo 래
+fi 랴
+fO 럐
+fj 러
+fp 레
+fu 려
+fP 례
+fh 로
+fhk 롸
+fho 뢔
+fhl 뢰
+fy 료
+fn 루
+fnj 뤄
+fnp 뤠
+fnl 뤼
+fb 류
+fm 르
+fml 릐
+fl 리
+ak 마
+ao 매
+ai 먀
+aO 먜
+aj 머
+ap 메
+au 며
+aP 몌
+ah 모
+ahk 뫄
+aho 뫠
+ahl 뫼
+ay 묘
+an 무
+anj 뭐
+anp 뭬
+anl 뮈
+ab 뮤
+am 므
+aml 믜
+al 미
+qk 바
+qo 배
+qi 뱌
+qO 뱨
+qj 버
+qp 베
+qu 벼
+qP 볘
+qh 보
+qhk 봐
+qho 봬
+qhl 뵈
+qy 뵤
+qn 부
+qnj 붜
+qnp 붸
+qnl 뷔
+qb 뷰
+qm 브
+qml 븨
+ql 비
+Qk 빠
+Qo 빼
+Qi 뺘
+QO 뺴
+Qj 뻐
+Qp 뻬
+Qu 뼈
+QP 뼤
+Qh 뽀
+Qhk 뽜
+Qho 뽸
+Qhl 뾔
+Qy 뾰
+Qn 뿌
+Qnj 뿨
+Qnp 쀄
+Qnl 쀠
+Qb 쀼
+Qm 쁘
+Qml 쁴
+Ql 삐
+tk 사
+to 새
+ti 샤
+tO 섀
+tj 서
+tp 세
+tu 셔
+tP 셰
+th 소
+thk 솨
+tho 쇄
+thl 쇠
+ty 쇼
+tn 수
+tnj 숴
+tnp 쉐
+tnl 쉬
+tb 슈
+tm 스
+tml 싀
+tl 시
+Tk 싸
+To 쌔
+Ti 쌰
+TO 썌
+Tj 써
+Tp 쎄
+Tu 쎠
+TP 쎼
+Th 쏘
+Thk 쏴
+Tho 쐐
+Thl 쐬
+Ty 쑈
+Tn 쑤
+Tnj 쒀
+Tnp 쒜
+Tnl 쒸
+Tb 쓔
+Tm 쓰
+Tml 씌
+Tl 씨
+dk 아
+do 애
+di 야
+dO 얘
+dj 어
+dp 에
+du 여
+dP 예
+dh 오
+dhk 와
+dho 왜
+dhl 외
+dy 요
+dn 우
+dnj 워
+dnp 웨
+dnl 위
+db 유
+dm 으
+dml 의
+dl 이
+wk 자
+wo 재
+wi 쟈
+wO 쟤
+wj 저
+wp 제
+wu 져
+wP 졔
+wh 조
+whk 좌
+who 좨
+whl 죄
+wy 죠
+wn 주
+wnj 줘
+wnp 줴
+wnl 쥐
+wb 쥬
+wm 즈
+wml 즤
+wl 지
+Wk 짜
+Wo 째
+Wi 쨔
+WO 쨰
+Wj 쩌
+Wp 쩨
+Wu 쪄
+WP 쪠
+Wh 쪼
+Whk 쫘
+Who 쫴
+Whl 쬐
+Wy 쬬
+Wn 쭈
+Wnj 쭤
+Wnp 쮀
+Wnl 쮜
+Wb 쮸
+Wm 쯔
+Wml 쯰
+Wl 찌
+ck 차
+co 채
+ci 챠
+cO 챼
+cj 처
+cp 체
+cu 쳐
+cP 쳬
+ch 초
+chk 촤
+cho 쵀
+chl 최
+cy 쵸
+cn 추
+cnj 춰
+cnp 췌
+cnl 취
+cb 츄
+cm 츠
+cml 츼
+cl 치
+zk 카
+zo 캐
+zi 캬
+zO 컈
+zj 커
+zp 케
+zu 켜
+zP 켸
+zh 코
+zhk 콰
+zho 쾌
+zhl 쾨
+zy 쿄
+zn 쿠
+znj 쿼
+znp 퀘
+znl 퀴
+zb 큐
+zm 크
+zml 킈
+zl 키
+xk 타
+xo 태
+xi 탸
+xO 턔
+xj 터
+xp 테
+xu 텨
+xP 톄
+xh 토
+xhk 톼
+xho 퇘
+xhl 퇴
+xy 툐
+xn 투
+xnj 퉈
+xnp 퉤
+xnl 튀
+xb 튜
+xm 트
+xml 틔
+xl 티
+vk 파
+vo 패
+vi 퍄
+vO 퍠
+vj 퍼
+vp 페
+vu 펴
+vP 폐
+vh 포
+vhk 퐈
+vho 퐤
+vhl 푀
+vy 표
+vn 푸
+vnj 풔
+vnp 풰
+vnl 퓌
+vb 퓨
+vm 프
+vml 픠
+vl 피
+gk 하
+go 해
+gi 햐
+gO 햬
+gj 허
+gp 헤
+gu 혀
+gP 혜
+gh 호
+ghk 화
+gho 홰
+ghl 회
+gy 효
+gn 후
+gnj 훠
+gnp 훼
+gnl 휘
+gb 휴
+gm 흐
+gml 희
+gl 히
+rkr 각
+rkR 갂
+rkrt 갃
+rks 간
+rksw 갅
+rksg 갆
+rke 갇
+rkf 갈
+rkfr 갉
+rkfa 갊
+rkfq 갋
+rkft 갌
+rkfx 갍
+rkfv 갎
+rkfg 갏
+rka 감
+rkq 갑
+rkqt 값
+rkt 갓
+rkT 갔
+rkd 강
+rkw 갖
+rkc 갗
+rkz 갘
+rkx 같
+rkv 갚
+rkg 갛
+ror 객
+roR 갞
+rort 갟
+ros 갠
+rosw 갡
+rosg 갢
+roe 갣
+rof 갤
+rofr 갥
+rofa 갦
+rofq 갧
+roft 갨
+rofx 갩
+rofv 갪
+rofg 갫
+roa 갬
+roq 갭
+roqt 갮
+rot 갯
+roT 갰
+rod 갱
+row 갲
+roc 갳
+roz 갴
+rox 갵
+rov 갶
+rog 갷
+rir 갹
+riR 갺
+rirt 갻
+ris 갼
+risw 갽
+risg 갾
+rie 갿
+rif 걀
+rifr 걁
+rifa 걂
+rifq 걃
+rift 걄
+rifx 걅
+rifv 걆
+rifg 걇
+ria 걈
+riq 걉
+riqt 걊
+rit 걋
+riT 걌
+rid 걍
+riw 걎
+ric 걏
+riz 걐
+rix 걑
+riv 걒
+rig 걓
+rOr 걕
+rOR 걖
+rOrt 걗
+rOs 걘
+rOsw 걙
+rOsg 걚
+rOe 걛
+rOf 걜
+rOfr 걝
+rOfa 걞
+rOfq 걟
+rOft 걠
+rOfx 걡
+rOfv 걢
+rOfg 걣
+rOa 걤
+rOq 걥
+rOqt 걦
+rOt 걧
+rOT 걨
+rOd 걩
+rOw 걪
+rOc 걫
+rOz 걬
+rOx 걭
+rOv 걮
+rOg 걯
+rjr 걱
+rjR 걲
+rjrt 걳
+rjs 건
+rjsw 걵
+rjsg 걶
+rje 걷
+rjf 걸
+rjfr 걹
+rjfa 걺
+rjfq 걻
+rjft 걼
+rjfx 걽
+rjfv 걾
+rjfg 걿
+rja 검
+rjq 겁
+rjqt 겂
+rjt 것
+rjT 겄
+rjd 겅
+rjw 겆
+rjc 겇
+rjz 겈
+rjx 겉
+rjv 겊
+rjg 겋
+rpr 겍
+rpR 겎
+rprt 겏
+rps 겐
+rpsw 겑
+rpsg 겒
+rpe 겓
+rpf 겔
+rpfr 겕
+rpfa 겖
+rpfq 겗
+rpft 겘
+rpfx 겙
+rpfv 겚
+rpfg 겛
+rpa 겜
+rpq 겝
+rpqt 겞
+rpt 겟
+rpT 겠
+rpd 겡
+rpw 겢
+rpc 겣
+rpz 겤
+rpx 겥
+rpv 겦
+rpg 겧
+rur 격
+ruR 겪
+rurt 겫
+rus 견
+rusw 겭
+rusg 겮
+rue 겯
+ruf 결
+rufr 겱
+rufa 겲
+rufq 겳
+ruft 겴
+rufx 겵
+rufv 겶
+rufg 겷
+rua 겸
+ruq 겹
+ruqt 겺
+rut 겻
+ruT 겼
+rud 경
+ruw 겾
+ruc 겿
+ruz 곀
+rux 곁
+ruv 곂
+rug 곃
+rPr 곅
+rPR 곆
+rPrt 곇
+rPs 곈
+rPsw 곉
+rPsg 곊
+rPe 곋
+rPf 곌
+rPfr 곍
+rPfa 곎
+rPfq 곏
+rPft 곐
+rPfx 곑
+rPfv 곒
+rPfg 곓
+rPa 곔
+rPq 곕
+rPqt 곖
+rPt 곗
+rPT 곘
+rPd 곙
+rPw 곚
+rPc 곛
+rPz 곜
+rPx 곝
+rPv 곞
+rPg 곟
+rhr 곡
+rhR 곢
+rhrt 곣
+rhs 곤
+rhsw 곥
+rhsg 곦
+rhe 곧
+rhf 골
+rhfr 곩
+rhfa 곪
+rhfq 곫
+rhft 곬
+rhfx 곭
+rhfv 곮
+rhfg 곯
+rha 곰
+rhq 곱
+rhqt 곲
+rht 곳
+rhT 곴
+rhd 공
+rhw 곶
+rhc 곷
+rhz 곸
+rhx 곹
+rhv 곺
+rhg 곻
+rhkr 곽
+rhkR 곾
+rhkrt 곿
+rhks 관
+rhksw 괁
+rhksg 괂
+rhke 괃
+rhkf 괄
+rhkfr 괅
+rhkfa 괆
+rhkfq 괇
+rhkft 괈
+rhkfx 괉
+rhkfv 괊
+rhkfg 괋
+rhka 괌
+rhkq 괍
+rhkqt 괎
+rhkt 괏
+rhkT 괐
+rhkd 광
+rhkw 괒
+rhkc 괓
+rhkz 괔
+rhkx 괕
+rhkv 괖
+rhkg 괗
+rhor 괙
+rhoR 괚
+rhort 괛
+rhos 괜
+rhosw 괝
+rhosg 괞
+rhoe 괟
+rhof 괠
+rhofr 괡
+rhofa 괢
+rhofq 괣
+rhoft 괤
+rhofx 괥
+rhofv 괦
+rhofg 괧
+rhoa 괨
+rhoq 괩
+rhoqt 괪
+rhot 괫
+rhoT 괬
+rhod 괭
+rhow 괮
+rhoc 괯
+rhoz 괰
+rhox 괱
+rhov 괲
+rhog 괳
+rhlr 괵
+rhlR 괶
+rhlrt 괷
+rhls 괸
+rhlsw 괹
+rhlsg 괺
+rhle 괻
+rhlf 괼
+rhlfr 괽
+rhlfa 괾
+rhlfq 괿
+rhlft 굀
+rhlfx 굁
+rhlfv 굂
+rhlfg 굃
+rhla 굄
+rhlq 굅
+rhlqt 굆
+rhlt 굇
+rhlT 굈
+rhld 굉
+rhlw 굊
+rhlc 굋
+rhlz 굌
+rhlx 굍
+rhlv 굎
+rhlg 굏
+ryr 굑
+ryR 굒
+ryrt 굓
+rys 굔
+rysw 굕
+rysg 굖
+rye 굗
+ryf 굘
+ryfr 굙
+ryfa 굚
+ryfq 굛
+ryft 굜
+ryfx 굝
+ryfv 굞
+ryfg 굟
+rya 굠
+ryq 굡
+ryqt 굢
+ryt 굣
+ryT 굤
+ryd 굥
+ryw 굦
+ryc 굧
+ryz 굨
+ryx 굩
+ryv 굪
+ryg 굫
+rnr 국
+rnR 굮
+rnrt 굯
+rns 군
+rnsw 굱
+rnsg 굲
+rne 굳
+rnf 굴
+rnfr 굵
+rnfa 굶
+rnfq 굷
+rnft 굸
+rnfx 굹
+rnfv 굺
+rnfg 굻
+rna 굼
+rnq 굽
+rnqt 굾
+rnt 굿
+rnT 궀
+rnd 궁
+rnw 궂
+rnc 궃
+rnz 궄
+rnx 궅
+rnv 궆
+rng 궇
+rnjr 궉
+rnjR 궊
+rnjrt 궋
+rnjs 권
+rnjsw 궍
+rnjsg 궎
+rnje 궏
+rnjf 궐
+rnjfr 궑
+rnjfa 궒
+rnjfq 궓
+rnjft 궔
+rnjfx 궕
+rnjfv 궖
+rnjfg 궗
+rnja 궘
+rnjq 궙
+rnjqt 궚
+rnjt 궛
+rnjT 궜
+rnjd 궝
+rnjw 궞
+rnjc 궟
+rnjz 궠
+rnjx 궡
+rnjv 궢
+rnjg 궣
+rnpr 궥
+rnpR 궦
+rnprt 궧
+rnps 궨
+rnpsw 궩
+rnpsg 궪
+rnpe 궫
+rnpf 궬
+rnpfr 궭
+rnpfa 궮
+rnpfq 궯
+rnpft 궰
+rnpfx 궱
+rnpfv 궲
+rnpfg 궳
+rnpa 궴
+rnpq 궵
+rnpqt 궶
+rnpt 궷
+rnpT 궸
+rnpd 궹
+rnpw 궺
+rnpc 궻
+rnpz 궼
+rnpx 궽
+rnpv 궾
+rnpg 궿
+rnlr 귁
+rnlR 귂
+rnlrt 귃
+rnls 귄
+rnlsw 귅
+rnlsg 귆
+rnle 귇
+rnlf 귈
+rnlfr 귉
+rnlfa 귊
+rnlfq 귋
+rnlft 귌
+rnlfx 귍
+rnlfv 귎
+rnlfg 귏
+rnla 귐
+rnlq 귑
+rnlqt 귒
+rnlt 귓
+rnlT 귔
+rnld 귕
+rnlw 귖
+rnlc 귗
+rnlz 귘
+rnlx 귙
+rnlv 귚
+rnlg 귛
+rbr 귝
+rbR 귞
+rbrt 귟
+rbs 균
+rbsw 귡
+rbsg 귢
+rbe 귣
+rbf 귤
+rbfr 귥
+rbfa 귦
+rbfq 귧
+rbft 귨
+rbfx 귩
+rbfv 귪
+rbfg 귫
+rba 귬
+rbq 귭
+rbqt 귮
+rbt 귯
+rbT 귰
+rbd 귱
+rbw 귲
+rbc 귳
+rbz 귴
+rbx 귵
+rbv 귶
+rbg 귷
+rmr 극
+rmR 귺
+rmrt 귻
+rms 근
+rmsw 귽
+rmsg 귾
+rme 귿
+rmf 글
+rmfr 긁
+rmfa 긂
+rmfq 긃
+rmft 긄
+rmfx 긅
+rmfv 긆
+rmfg 긇
+rma 금
+rmq 급
+rmqt 긊
+rmt 긋
+rmT 긌
+rmd 긍
+rmw 긎
+rmc 긏
+rmz 긐
+rmx 긑
+rmv 긒
+rmg 긓
+rmlr 긕
+rmlR 긖
+rmlrt 긗
+rmls 긘
+rmlsw 긙
+rmlsg 긚
+rmle 긛
+rmlf 긜
+rmlfr 긝
+rmlfa 긞
+rmlfq 긟
+rmlft 긠
+rmlfx 긡
+rmlfv 긢
+rmlfg 긣
+rmla 긤
+rmlq 긥
+rmlqt 긦
+rmlt 긧
+rmlT 긨
+rmld 긩
+rmlw 긪
+rmlc 긫
+rmlz 긬
+rmlx 긭
+rmlv 긮
+rmlg 긯
+rlr 긱
+rlR 긲
+rlrt 긳
+rls 긴
+rlsw 긵
+rlsg 긶
+rle 긷
+rlf 길
+rlfr 긹
+rlfa 긺
+rlfq 긻
+rlft 긼
+rlfx 긽
+rlfv 긾
+rlfg 긿
+rla 김
+rlq 깁
+rlqt 깂
+rlt 깃
+rlT 깄
+rld 깅
+rlw 깆
+rlc 깇
+rlz 깈
+rlx 깉
+rlv 깊
+rlg 깋
+Rkr 깍
+RkR 깎
+Rkrt 깏
+Rks 깐
+Rksw 깑
+Rksg 깒
+Rke 깓
+Rkf 깔
+Rkfr 깕
+Rkfa 깖
+Rkfq 깗
+Rkft 깘
+Rkfx 깙
+Rkfv 깚
+Rkfg 깛
+Rka 깜
+Rkq 깝
+Rkqt 깞
+Rkt 깟
+RkT 깠
+Rkd 깡
+Rkw 깢
+Rkc 깣
+Rkz 깤
+Rkx 깥
+Rkv 깦
+Rkg 깧
+Ror 깩
+RoR 깪
+Rort 깫
+Ros 깬
+Rosw 깭
+Rosg 깮
+Roe 깯
+Rof 깰
+Rofr 깱
+Rofa 깲
+Rofq 깳
+Roft 깴
+Rofx 깵
+Rofv 깶
+Rofg 깷
+Roa 깸
+Roq 깹
+Roqt 깺
+Rot 깻
+RoT 깼
+Rod 깽
+Row 깾
+Roc 깿
+Roz 꺀
+Rox 꺁
+Rov 꺂
+Rog 꺃
+Rir 꺅
+RiR 꺆
+Rirt 꺇
+Ris 꺈
+Risw 꺉
+Risg 꺊
+Rie 꺋
+Rif 꺌
+Rifr 꺍
+Rifa 꺎
+Rifq 꺏
+Rift 꺐
+Rifx 꺑
+Rifv 꺒
+Rifg 꺓
+Ria 꺔
+Riq 꺕
+Riqt 꺖
+Rit 꺗
+RiT 꺘
+Rid 꺙
+Riw 꺚
+Ric 꺛
+Riz 꺜
+Rix 꺝
+Riv 꺞
+Rig 꺟
+ROr 꺡
+ROR 꺢
+ROrt 꺣
+ROs 꺤
+ROsw 꺥
+ROsg 꺦
+ROe 꺧
+ROf 꺨
+ROfr 꺩
+ROfa 꺪
+ROfq 꺫
+ROft 꺬
+ROfx 꺭
+ROfv 꺮
+ROfg 꺯
+ROa 꺰
+ROq 꺱
+ROqt 꺲
+ROt 꺳
+ROT 꺴
+ROd 꺵
+ROw 꺶
+ROc 꺷
+ROz 꺸
+ROx 꺹
+ROv 꺺
+ROg 꺻
+Rjr 꺽
+RjR 꺾
+Rjrt 꺿
+Rjs 껀
+Rjsw 껁
+Rjsg 껂
+Rje 껃
+Rjf 껄
+Rjfr 껅
+Rjfa 껆
+Rjfq 껇
+Rjft 껈
+Rjfx 껉
+Rjfv 껊
+Rjfg 껋
+Rja 껌
+Rjq 껍
+Rjqt 껎
+Rjt 껏
+RjT 껐
+Rjd 껑
+Rjw 껒
+Rjc 껓
+Rjz 껔
+Rjx 껕
+Rjv 껖
+Rjg 껗
+Rpr 껙
+RpR 껚
+Rprt 껛
+Rps 껜
+Rpsw 껝
+Rpsg 껞
+Rpe 껟
+Rpf 껠
+Rpfr 껡
+Rpfa 껢
+Rpfq 껣
+Rpft 껤
+Rpfx 껥
+Rpfv 껦
+Rpfg 껧
+Rpa 껨
+Rpq 껩
+Rpqt 껪
+Rpt 껫
+RpT 껬
+Rpd 껭
+Rpw 껮
+Rpc 껯
+Rpz 껰
+Rpx 껱
+Rpv 껲
+Rpg 껳
+Rur 껵
+RuR 껶
+Rurt 껷
+Rus 껸
+Rusw 껹
+Rusg 껺
+Rue 껻
+Ruf 껼
+Rufr 껽
+Rufa 껾
+Rufq 껿
+Ruft 꼀
+Rufx 꼁
+Rufv 꼂
+Rufg 꼃
+Rua 꼄
+Ruq 꼅
+Ruqt 꼆
+Rut 꼇
+RuT 꼈
+Rud 꼉
+Ruw 꼊
+Ruc 꼋
+Ruz 꼌
+Rux 꼍
+Ruv 꼎
+Rug 꼏
+RPr 꼑
+RPR 꼒
+RPrt 꼓
+RPs 꼔
+RPsw 꼕
+RPsg 꼖
+RPe 꼗
+RPf 꼘
+RPfr 꼙
+RPfa 꼚
+RPfq 꼛
+RPft 꼜
+RPfx 꼝
+RPfv 꼞
+RPfg 꼟
+RPa 꼠
+RPq 꼡
+RPqt 꼢
+RPt 꼣
+RPT 꼤
+RPd 꼥
+RPw 꼦
+RPc 꼧
+RPz 꼨
+RPx 꼩
+RPv 꼪
+RPg 꼫
+Rhr 꼭
+RhR 꼮
+Rhrt 꼯
+Rhs 꼰
+Rhsw 꼱
+Rhsg 꼲
+Rhe 꼳
+Rhf 꼴
+Rhfr 꼵
+Rhfa 꼶
+Rhfq 꼷
+Rhft 꼸
+Rhfx 꼹
+Rhfv 꼺
+Rhfg 꼻
+Rha 꼼
+Rhq 꼽
+Rhqt 꼾
+Rht 꼿
+RhT 꽀
+Rhd 꽁
+Rhw 꽂
+Rhc 꽃
+Rhz 꽄
+Rhx 꽅
+Rhv 꽆
+Rhg 꽇
+Rhkr 꽉
+RhkR 꽊
+Rhkrt 꽋
+Rhks 꽌
+Rhksw 꽍
+Rhksg 꽎
+Rhke 꽏
+Rhkf 꽐
+Rhkfr 꽑
+Rhkfa 꽒
+Rhkfq 꽓
+Rhkft 꽔
+Rhkfx 꽕
+Rhkfv 꽖
+Rhkfg 꽗
+Rhka 꽘
+Rhkq 꽙
+Rhkqt 꽚
+Rhkt 꽛
+RhkT 꽜
+Rhkd 꽝
+Rhkw 꽞
+Rhkc 꽟
+Rhkz 꽠
+Rhkx 꽡
+Rhkv 꽢
+Rhkg 꽣
+Rhor 꽥
+RhoR 꽦
+Rhort 꽧
+Rhos 꽨
+Rhosw 꽩
+Rhosg 꽪
+Rhoe 꽫
+Rhof 꽬
+Rhofr 꽭
+Rhofa 꽮
+Rhofq 꽯
+Rhoft 꽰
+Rhofx 꽱
+Rhofv 꽲
+Rhofg 꽳
+Rhoa 꽴
+Rhoq 꽵
+Rhoqt 꽶
+Rhot 꽷
+RhoT 꽸
+Rhod 꽹
+Rhow 꽺
+Rhoc 꽻
+Rhoz 꽼
+Rhox 꽽
+Rhov 꽾
+Rhog 꽿
+Rhlr 꾁
+RhlR 꾂
+Rhlrt 꾃
+Rhls 꾄
+Rhlsw 꾅
+Rhlsg 꾆
+Rhle 꾇
+Rhlf 꾈
+Rhlfr 꾉
+Rhlfa 꾊
+Rhlfq 꾋
+Rhlft 꾌
+Rhlfx 꾍
+Rhlfv 꾎
+Rhlfg 꾏
+Rhla 꾐
+Rhlq 꾑
+Rhlqt 꾒
+Rhlt 꾓
+RhlT 꾔
+Rhld 꾕
+Rhlw 꾖
+Rhlc 꾗
+Rhlz 꾘
+Rhlx 꾙
+Rhlv 꾚
+Rhlg 꾛
+Ryr 꾝
+RyR 꾞
+Ryrt 꾟
+Rys 꾠
+Rysw 꾡
+Rysg 꾢
+Rye 꾣
+Ryf 꾤
+Ryfr 꾥
+Ryfa 꾦
+Ryfq 꾧
+Ryft 꾨
+Ryfx 꾩
+Ryfv 꾪
+Ryfg 꾫
+Rya 꾬
+Ryq 꾭
+Ryqt 꾮
+Ryt 꾯
+RyT 꾰
+Ryd 꾱
+Ryw 꾲
+Ryc 꾳
+Ryz 꾴
+Ryx 꾵
+Ryv 꾶
+Ryg 꾷
+Rnr 꾹
+RnR 꾺
+Rnrt 꾻
+Rns 꾼
+Rnsw 꾽
+Rnsg 꾾
+Rne 꾿
+Rnf 꿀
+Rnfr 꿁
+Rnfa 꿂
+Rnfq 꿃
+Rnft 꿄
+Rnfx 꿅
+Rnfv 꿆
+Rnfg 꿇
+Rna 꿈
+Rnq 꿉
+Rnqt 꿊
+Rnt 꿋
+RnT 꿌
+Rnd 꿍
+Rnw 꿎
+Rnc 꿏
+Rnz 꿐
+Rnx 꿑
+Rnv 꿒
+Rng 꿓
+Rnjr 꿕
+RnjR 꿖
+Rnjrt 꿗
+Rnjs 꿘
+Rnjsw 꿙
+Rnjsg 꿚
+Rnje 꿛
+Rnjf 꿜
+Rnjfr 꿝
+Rnjfa 꿞
+Rnjfq 꿟
+Rnjft 꿠
+Rnjfx 꿡
+Rnjfv 꿢
+Rnjfg 꿣
+Rnja 꿤
+Rnjq 꿥
+Rnjqt 꿦
+Rnjt 꿧
+RnjT 꿨
+Rnjd 꿩
+Rnjw 꿪
+Rnjc 꿫
+Rnjz 꿬
+Rnjx 꿭
+Rnjv 꿮
+Rnjg 꿯
+Rnpr 꿱
+RnpR 꿲
+Rnprt 꿳
+Rnps 꿴
+Rnpsw 꿵
+Rnpsg 꿶
+Rnpe 꿷
+Rnpf 꿸
+Rnpfr 꿹
+Rnpfa 꿺
+Rnpfq 꿻
+Rnpft 꿼
+Rnpfx 꿽
+Rnpfv 꿾
+Rnpfg 꿿
+Rnpa 뀀
+Rnpq 뀁
+Rnpqt 뀂
+Rnpt 뀃
+RnpT 뀄
+Rnpd 뀅
+Rnpw 뀆
+Rnpc 뀇
+Rnpz 뀈
+Rnpx 뀉
+Rnpv 뀊
+Rnpg 뀋
+Rnlr 뀍
+RnlR 뀎
+Rnlrt 뀏
+Rnls 뀐
+Rnlsw 뀑
+Rnlsg 뀒
+Rnle 뀓
+Rnlf 뀔
+Rnlfr 뀕
+Rnlfa 뀖
+Rnlfq 뀗
+Rnlft 뀘
+Rnlfx 뀙
+Rnlfv 뀚
+Rnlfg 뀛
+Rnla 뀜
+Rnlq 뀝
+Rnlqt 뀞
+Rnlt 뀟
+RnlT 뀠
+Rnld 뀡
+Rnlw 뀢
+Rnlc 뀣
+Rnlz 뀤
+Rnlx 뀥
+Rnlv 뀦
+Rnlg 뀧
+Rbr 뀩
+RbR 뀪
+Rbrt 뀫
+Rbs 뀬
+Rbsw 뀭
+Rbsg 뀮
+Rbe 뀯
+Rbf 뀰
+Rbfr 뀱
+Rbfa 뀲
+Rbfq 뀳
+Rbft 뀴
+Rbfx 뀵
+Rbfv 뀶
+Rbfg 뀷
+Rba 뀸
+Rbq 뀹
+Rbqt 뀺
+Rbt 뀻
+RbT 뀼
+Rbd 뀽
+Rbw 뀾
+Rbc 뀿
+Rbz 끀
+Rbx 끁
+Rbv 끂
+Rbg 끃
+Rmr 끅
+RmR 끆
+Rmrt 끇
+Rms 끈
+Rmsw 끉
+Rmsg 끊
+Rme 끋
+Rmf 끌
+Rmfr 끍
+Rmfa 끎
+Rmfq 끏
+Rmft 끐
+Rmfx 끑
+Rmfv 끒
+Rmfg 끓
+Rma 끔
+Rmq 끕
+Rmqt 끖
+Rmt 끗
+RmT 끘
+Rmd 끙
+Rmw 끚
+Rmc 끛
+Rmz 끜
+Rmx 끝
+Rmv 끞
+Rmg 끟
+Rmlr 끡
+RmlR 끢
+Rmlrt 끣
+Rmls 끤
+Rmlsw 끥
+Rmlsg 끦
+Rmle 끧
+Rmlf 끨
+Rmlfr 끩
+Rmlfa 끪
+Rmlfq 끫
+Rmlft 끬
+Rmlfx 끭
+Rmlfv 끮
+Rmlfg 끯
+Rmla 끰
+Rmlq 끱
+Rmlqt 끲
+Rmlt 끳
+RmlT 끴
+Rmld 끵
+Rmlw 끶
+Rmlc 끷
+Rmlz 끸
+Rmlx 끹
+Rmlv 끺
+Rmlg 끻
+Rlr 끽
+RlR 끾
+Rlrt 끿
+Rls 낀
+Rlsw 낁
+Rlsg 낂
+Rle 낃
+Rlf 낄
+Rlfr 낅
+Rlfa 낆
+Rlfq 낇
+Rlft 낈
+Rlfx 낉
+Rlfv 낊
+Rlfg 낋
+Rla 낌
+Rlq 낍
+Rlqt 낎
+Rlt 낏
+RlT 낐
+Rld 낑
+Rlw 낒
+Rlc 낓
+Rlz 낔
+Rlx 낕
+Rlv 낖
+Rlg 낗
+skr 낙
+skR 낚
+skrt 낛
+sks 난
+sksw 낝
+sksg 낞
+ske 낟
+skf 날
+skfr 낡
+skfa 낢
+skfq 낣
+skft 낤
+skfx 낥
+skfv 낦
+skfg 낧
+ska 남
+skq 납
+skqt 낪
+skt 낫
+skT 났
+skd 낭
+skw 낮
+skc 낯
+skz 낰
+skx 낱
+skv 낲
+skg 낳
+sor 낵
+soR 낶
+sort 낷
+sos 낸
+sosw 낹
+sosg 낺
+soe 낻
+sof 낼
+sofr 낽
+sofa 낾
+sofq 낿
+soft 냀
+sofx 냁
+sofv 냂
+sofg 냃
+soa 냄
+soq 냅
+soqt 냆
+sot 냇
+soT 냈
+sod 냉
+sow 냊
+soc 냋
+soz 냌
+sox 냍
+sov 냎
+sog 냏
+sir 냑
+siR 냒
+sirt 냓
+sis 냔
+sisw 냕
+sisg 냖
+sie 냗
+sif 냘
+sifr 냙
+sifa 냚
+sifq 냛
+sift 냜
+sifx 냝
+sifv 냞
+sifg 냟
+sia 냠
+siq 냡
+siqt 냢
+sit 냣
+siT 냤
+sid 냥
+siw 냦
+sic 냧
+siz 냨
+six 냩
+siv 냪
+sig 냫
+sOr 냭
+sOR 냮
+sOrt 냯
+sOs 냰
+sOsw 냱
+sOsg 냲
+sOe 냳
+sOf 냴
+sOfr 냵
+sOfa 냶
+sOfq 냷
+sOft 냸
+sOfx 냹
+sOfv 냺
+sOfg 냻
+sOa 냼
+sOq 냽
+sOqt 냾
+sOt 냿
+sOT 넀
+sOd 넁
+sOw 넂
+sOc 넃
+sOz 넄
+sOx 넅
+sOv 넆
+sOg 넇
+sjr 넉
+sjR 넊
+sjrt 넋
+sjs 넌
+sjsw 넍
+sjsg 넎
+sje 넏
+sjf 널
+sjfr 넑
+sjfa 넒
+sjfq 넓
+sjft 넔
+sjfx 넕
+sjfv 넖
+sjfg 넗
+sja 넘
+sjq 넙
+sjqt 넚
+sjt 넛
+sjT 넜
+sjd 넝
+sjw 넞
+sjc 넟
+sjz 넠
+sjx 넡
+sjv 넢
+sjg 넣
+spr 넥
+spR 넦
+sprt 넧
+sps 넨
+spsw 넩
+spsg 넪
+spe 넫
+spf 넬
+spfr 넭
+spfa 넮
+spfq 넯
+spft 넰
+spfx 넱
+spfv 넲
+spfg 넳
+spa 넴
+spq 넵
+spqt 넶
+spt 넷
+spT 넸
+spd 넹
+spw 넺
+spc 넻
+spz 넼
+spx 넽
+spv 넾
+spg 넿
+sur 녁
+suR 녂
+surt 녃
+sus 년
+susw 녅
+susg 녆
+sue 녇
+suf 녈
+sufr 녉
+sufa 녊
+sufq 녋
+suft 녌
+sufx 녍
+sufv 녎
+sufg 녏
+sua 념
+suq 녑
+suqt 녒
+sut 녓
+suT 녔
+sud 녕
+suw 녖
+suc 녗
+suz 녘
+sux 녙
+suv 녚
+sug 녛
+sPr 녝
+sPR 녞
+sPrt 녟
+sPs 녠
+sPsw 녡
+sPsg 녢
+sPe 녣
+sPf 녤
+sPfr 녥
+sPfa 녦
+sPfq 녧
+sPft 녨
+sPfx 녩
+sPfv 녪
+sPfg 녫
+sPa 녬
+sPq 녭
+sPqt 녮
+sPt 녯
+sPT 녰
+sPd 녱
+sPw 녲
+sPc 녳
+sPz 녴
+sPx 녵
+sPv 녶
+sPg 녷
+shr 녹
+shR 녺
+shrt 녻
+shs 논
+shsw 녽
+shsg 녾
+she 녿
+shf 놀
+shfr 놁
+shfa 놂
+shfq 놃
+shft 놄
+shfx 놅
+shfv 놆
+shfg 놇
+sha 놈
+shq 놉
+shqt 놊
+sht 놋
+shT 놌
+shd 농
+shw 놎
+shc 놏
+shz 놐
+shx 놑
+shv 높
+shg 놓
+shkr 놕
+shkR 놖
+shkrt 놗
+shks 놘
+shksw 놙
+shksg 놚
+shke 놛
+shkf 놜
+shkfr 놝
+shkfa 놞
+shkfq 놟
+shkft 놠
+shkfx 놡
+shkfv 놢
+shkfg 놣
+shka 놤
+shkq 놥
+shkqt 놦
+shkt 놧
+shkT 놨
+shkd 놩
+shkw 놪
+shkc 놫
+shkz 놬
+shkx 놭
+shkv 놮
+shkg 놯
+shor 놱
+shoR 놲
+short 놳
+shos 놴
+shosw 놵
+shosg 놶
+shoe 놷
+shof 놸
+shofr 놹
+shofa 놺
+shofq 놻
+shoft 놼
+shofx 놽
+shofv 놾
+shofg 놿
+shoa 뇀
+shoq 뇁
+shoqt 뇂
+shot 뇃
+shoT 뇄
+shod 뇅
+show 뇆
+shoc 뇇
+shoz 뇈
+shox 뇉
+shov 뇊
+shog 뇋
+shlr 뇍
+shlR 뇎
+shlrt 뇏
+shls 뇐
+shlsw 뇑
+shlsg 뇒
+shle 뇓
+shlf 뇔
+shlfr 뇕
+shlfa 뇖
+shlfq 뇗
+shlft 뇘
+shlfx 뇙
+shlfv 뇚
+shlfg 뇛
+shla 뇜
+shlq 뇝
+shlqt 뇞
+shlt 뇟
+shlT 뇠
+shld 뇡
+shlw 뇢
+shlc 뇣
+shlz 뇤
+shlx 뇥
+shlv 뇦
+shlg 뇧
+syr 뇩
+syR 뇪
+syrt 뇫
+sys 뇬
+sysw 뇭
+sysg 뇮
+sye 뇯
+syf 뇰
+syfr 뇱
+syfa 뇲
+syfq 뇳
+syft 뇴
+syfx 뇵
+syfv 뇶
+syfg 뇷
+sya 뇸
+syq 뇹
+syqt 뇺
+syt 뇻
+syT 뇼
+syd 뇽
+syw 뇾
+syc 뇿
+syz 눀
+syx 눁
+syv 눂
+syg 눃
+snr 눅
+snR 눆
+snrt 눇
+sns 눈
+snsw 눉
+snsg 눊
+sne 눋
+snf 눌
+snfr 눍
+snfa 눎
+snfq 눏
+snft 눐
+snfx 눑
+snfv 눒
+snfg 눓
+sna 눔
+snq 눕
+snqt 눖
+snt 눗
+snT 눘
+snd 눙
+snw 눚
+snc 눛
+snz 눜
+snx 눝
+snv 눞
+sng 눟
+snjr 눡
+snjR 눢
+snjrt 눣
+snjs 눤
+snjsw 눥
+snjsg 눦
+snje 눧
+snjf 눨
+snjfr 눩
+snjfa 눪
+snjfq 눫
+snjft 눬
+snjfx 눭
+snjfv 눮
+snjfg 눯
+snja 눰
+snjq 눱
+snjqt 눲
+snjt 눳
+snjT 눴
+snjd 눵
+snjw 눶
+snjc 눷
+snjz 눸
+snjx 눹
+snjv 눺
+snjg 눻
+snpr 눽
+snpR 눾
+snprt 눿
+snps 뉀
+snpsw 뉁
+snpsg 뉂
+snpe 뉃
+snpf 뉄
+snpfr 뉅
+snpfa 뉆
+snpfq 뉇
+snpft 뉈
+snpfx 뉉
+snpfv 뉊
+snpfg 뉋
+snpa 뉌
+snpq 뉍
+snpqt 뉎
+snpt 뉏
+snpT 뉐
+snpd 뉑
+snpw 뉒
+snpc 뉓
+snpz 뉔
+snpx 뉕
+snpv 뉖
+snpg 뉗
+snlr 뉙
+snlR 뉚
+snlrt 뉛
+snls 뉜
+snlsw 뉝
+snlsg 뉞
+snle 뉟
+snlf 뉠
+snlfr 뉡
+snlfa 뉢
+snlfq 뉣
+snlft 뉤
+snlfx 뉥
+snlfv 뉦
+snlfg 뉧
+snla 뉨
+snlq 뉩
+snlqt 뉪
+snlt 뉫
+snlT 뉬
+snld 뉭
+snlw 뉮
+snlc 뉯
+snlz 뉰
+snlx 뉱
+snlv 뉲
+snlg 뉳
+sbr 뉵
+sbR 뉶
+sbrt 뉷
+sbs 뉸
+sbsw 뉹
+sbsg 뉺
+sbe 뉻
+sbf 뉼
+sbfr 뉽
+sbfa 뉾
+sbfq 뉿
+sbft 늀
+sbfx 늁
+sbfv 늂
+sbfg 늃
+sba 늄
+sbq 늅
+sbqt 늆
+sbt 늇
+sbT 늈
+sbd 늉
+sbw 늊
+sbc 늋
+sbz 늌
+sbx 늍
+sbv 늎
+sbg 늏
+smr 늑
+smR 늒
+smrt 늓
+sms 는
+smsw 늕
+smsg 늖
+sme 늗
+smf 늘
+smfr 늙
+smfa 늚
+smfq 늛
+smft 늜
+smfx 늝
+smfv 늞
+smfg 늟
+sma 늠
+smq 늡
+smqt 늢
+smt 늣
+smT 늤
+smd 능
+smw 늦
+smc 늧
+smz 늨
+smx 늩
+smv 늪
+smg 늫
+smlr 늭
+smlR 늮
+smlrt 늯
+smls 늰
+smlsw 늱
+smlsg 늲
+smle 늳
+smlf 늴
+smlfr 늵
+smlfa 늶
+smlfq 늷
+smlft 늸
+smlfx 늹
+smlfv 늺
+smlfg 늻
+smla 늼
+smlq 늽
+smlqt 늾
+smlt 늿
+smlT 닀
+smld 닁
+smlw 닂
+smlc 닃
+smlz 닄
+smlx 닅
+smlv 닆
+smlg 닇
+slr 닉
+slR 닊
+slrt 닋
+sls 닌
+slsw 닍
+slsg 닎
+sle 닏
+slf 닐
+slfr 닑
+slfa 닒
+slfq 닓
+slft 닔
+slfx 닕
+slfv 닖
+slfg 닗
+sla 님
+slq 닙
+slqt 닚
+slt 닛
+slT 닜
+sld 닝
+slw 닞
+slc 닟
+slz 닠
+slx 닡
+slv 닢
+slg 닣
+ekr 닥
+ekR 닦
+ekrt 닧
+eks 단
+eksw 닩
+eksg 닪
+eke 닫
+ekf 달
+ekfr 닭
+ekfa 닮
+ekfq 닯
+ekft 닰
+ekfx 닱
+ekfv 닲
+ekfg 닳
+eka 담
+ekq 답
+ekqt 닶
+ekt 닷
+ekT 닸
+ekd 당
+ekw 닺
+ekc 닻
+ekz 닼
+ekx 닽
+ekv 닾
+ekg 닿
+eor 댁
+eoR 댂
+eort 댃
+eos 댄
+eosw 댅
+eosg 댆
+eoe 댇
+eof 댈
+eofr 댉
+eofa 댊
+eofq 댋
+eoft 댌
+eofx 댍
+eofv 댎
+eofg 댏
+eoa 댐
+eoq 댑
+eoqt 댒
+eot 댓
+eoT 댔
+eod 댕
+eow 댖
+eoc 댗
+eoz 댘
+eox 댙
+eov 댚
+eog 댛
+eir 댝
+eiR 댞
+eirt 댟
+eis 댠
+eisw 댡
+eisg 댢
+eie 댣
+eif 댤
+eifr 댥
+eifa 댦
+eifq 댧
+eift 댨
+eifx 댩
+eifv 댪
+eifg 댫
+eia 댬
+eiq 댭
+eiqt 댮
+eit 댯
+eiT 댰
+eid 댱
+eiw 댲
+eic 댳
+eiz 댴
+eix 댵
+eiv 댶
+eig 댷
+eOr 댹
+eOR 댺
+eOrt 댻
+eOs 댼
+eOsw 댽
+eOsg 댾
+eOe 댿
+eOf 덀
+eOfr 덁
+eOfa 덂
+eOfq 덃
+eOft 덄
+eOfx 덅
+eOfv 덆
+eOfg 덇
+eOa 덈
+eOq 덉
+eOqt 덊
+eOt 덋
+eOT 덌
+eOd 덍
+eOw 덎
+eOc 덏
+eOz 덐
+eOx 덑
+eOv 덒
+eOg 덓
+ejr 덕
+ejR 덖
+ejrt 덗
+ejs 던
+ejsw 덙
+ejsg 덚
+eje 덛
+ejf 덜
+ejfr 덝
+ejfa 덞
+ejfq 덟
+ejft 덠
+ejfx 덡
+ejfv 덢
+ejfg 덣
+eja 덤
+ejq 덥
+ejqt 덦
+ejt 덧
+ejT 덨
+ejd 덩
+ejw 덪
+ejc 덫
+ejz 덬
+ejx 덭
+ejv 덮
+ejg 덯
+epr 덱
+epR 덲
+eprt 덳
+eps 덴
+epsw 덵
+epsg 덶
+epe 덷
+epf 델
+epfr 덹
+epfa 덺
+epfq 덻
+epft 덼
+epfx 덽
+epfv 덾
+epfg 덿
+epa 뎀
+epq 뎁
+epqt 뎂
+ept 뎃
+epT 뎄
+epd 뎅
+epw 뎆
+epc 뎇
+epz 뎈
+epx 뎉
+epv 뎊
+epg 뎋
+eur 뎍
+euR 뎎
+eurt 뎏
+eus 뎐
+eusw 뎑
+eusg 뎒
+eue 뎓
+euf 뎔
+eufr 뎕
+eufa 뎖
+eufq 뎗
+euft 뎘
+eufx 뎙
+eufv 뎚
+eufg 뎛
+eua 뎜
+euq 뎝
+euqt 뎞
+eut 뎟
+euT 뎠
+eud 뎡
+euw 뎢
+euc 뎣
+euz 뎤
+eux 뎥
+euv 뎦
+eug 뎧
+ePr 뎩
+ePR 뎪
+ePrt 뎫
+ePs 뎬
+ePsw 뎭
+ePsg 뎮
+ePe 뎯
+ePf 뎰
+ePfr 뎱
+ePfa 뎲
+ePfq 뎳
+ePft 뎴
+ePfx 뎵
+ePfv 뎶
+ePfg 뎷
+ePa 뎸
+ePq 뎹
+ePqt 뎺
+ePt 뎻
+ePT 뎼
+ePd 뎽
+ePw 뎾
+ePc 뎿
+ePz 돀
+ePx 돁
+ePv 돂
+ePg 돃
+ehr 독
+ehR 돆
+ehrt 돇
+ehs 돈
+ehsw 돉
+ehsg 돊
+ehe 돋
+ehf 돌
+ehfr 돍
+ehfa 돎
+ehfq 돏
+ehft 돐
+ehfx 돑
+ehfv 돒
+ehfg 돓
+eha 돔
+ehq 돕
+ehqt 돖
+eht 돗
+ehT 돘
+ehd 동
+ehw 돚
+ehc 돛
+ehz 돜
+ehx 돝
+ehv 돞
+ehg 돟
+ehkr 돡
+ehkR 돢
+ehkrt 돣
+ehks 돤
+ehksw 돥
+ehksg 돦
+ehke 돧
+ehkf 돨
+ehkfr 돩
+ehkfa 돪
+ehkfq 돫
+ehkft 돬
+ehkfx 돭
+ehkfv 돮
+ehkfg 돯
+ehka 돰
+ehkq 돱
+ehkqt 돲
+ehkt 돳
+ehkT 돴
+ehkd 돵
+ehkw 돶
+ehkc 돷
+ehkz 돸
+ehkx 돹
+ehkv 돺
+ehkg 돻
+ehor 돽
+ehoR 돾
+ehort 돿
+ehos 됀
+ehosw 됁
+ehosg 됂
+ehoe 됃
+ehof 됄
+ehofr 됅
+ehofa 됆
+ehofq 됇
+ehoft 됈
+ehofx 됉
+ehofv 됊
+ehofg 됋
+ehoa 됌
+ehoq 됍
+ehoqt 됎
+ehot 됏
+ehoT 됐
+ehod 됑
+ehow 됒
+ehoc 됓
+ehoz 됔
+ehox 됕
+ehov 됖
+ehog 됗
+ehlr 됙
+ehlR 됚
+ehlrt 됛
+ehls 된
+ehlsw 됝
+ehlsg 됞
+ehle 됟
+ehlf 될
+ehlfr 됡
+ehlfa 됢
+ehlfq 됣
+ehlft 됤
+ehlfx 됥
+ehlfv 됦
+ehlfg 됧
+ehla 됨
+ehlq 됩
+ehlqt 됪
+ehlt 됫
+ehlT 됬
+ehld 됭
+ehlw 됮
+ehlc 됯
+ehlz 됰
+ehlx 됱
+ehlv 됲
+ehlg 됳
+eyr 됵
+eyR 됶
+eyrt 됷
+eys 됸
+eysw 됹
+eysg 됺
+eye 됻
+eyf 됼
+eyfr 됽
+eyfa 됾
+eyfq 됿
+eyft 둀
+eyfx 둁
+eyfv 둂
+eyfg 둃
+eya 둄
+eyq 둅
+eyqt 둆
+eyt 둇
+eyT 둈
+eyd 둉
+eyw 둊
+eyc 둋
+eyz 둌
+eyx 둍
+eyv 둎
+eyg 둏
+enr 둑
+enR 둒
+enrt 둓
+ens 둔
+ensw 둕
+ensg 둖
+ene 둗
+enf 둘
+enfr 둙
+enfa 둚
+enfq 둛
+enft 둜
+enfx 둝
+enfv 둞
+enfg 둟
+ena 둠
+enq 둡
+enqt 둢
+ent 둣
+enT 둤
+end 둥
+enw 둦
+enc 둧
+enz 둨
+enx 둩
+env 둪
+eng 둫
+enjr 둭
+enjR 둮
+enjrt 둯
+enjs 둰
+enjsw 둱
+enjsg 둲
+enje 둳
+enjf 둴
+enjfr 둵
+enjfa 둶
+enjfq 둷
+enjft 둸
+enjfx 둹
+enjfv 둺
+enjfg 둻
+enja 둼
+enjq 둽
+enjqt 둾
+enjt 둿
+enjT 뒀
+enjd 뒁
+enjw 뒂
+enjc 뒃
+enjz 뒄
+enjx 뒅
+enjv 뒆
+enjg 뒇
+enpr 뒉
+enpR 뒊
+enprt 뒋
+enps 뒌
+enpsw 뒍
+enpsg 뒎
+enpe 뒏
+enpf 뒐
+enpfr 뒑
+enpfa 뒒
+enpfq 뒓
+enpft 뒔
+enpfx 뒕
+enpfv 뒖
+enpfg 뒗
+enpa 뒘
+enpq 뒙
+enpqt 뒚
+enpt 뒛
+enpT 뒜
+enpd 뒝
+enpw 뒞
+enpc 뒟
+enpz 뒠
+enpx 뒡
+enpv 뒢
+enpg 뒣
+enlr 뒥
+enlR 뒦
+enlrt 뒧
+enls 뒨
+enlsw 뒩
+enlsg 뒪
+enle 뒫
+enlf 뒬
+enlfr 뒭
+enlfa 뒮
+enlfq 뒯
+enlft 뒰
+enlfx 뒱
+enlfv 뒲
+enlfg 뒳
+enla 뒴
+enlq 뒵
+enlqt 뒶
+enlt 뒷
+enlT 뒸
+enld 뒹
+enlw 뒺
+enlc 뒻
+enlz 뒼
+enlx 뒽
+enlv 뒾
+enlg 뒿
+ebr 듁
+ebR 듂
+ebrt 듃
+ebs 듄
+ebsw 듅
+ebsg 듆
+ebe 듇
+ebf 듈
+ebfr 듉
+ebfa 듊
+ebfq 듋
+ebft 듌
+ebfx 듍
+ebfv 듎
+ebfg 듏
+eba 듐
+ebq 듑
+ebqt 듒
+ebt 듓
+ebT 듔
+ebd 듕
+ebw 듖
+ebc 듗
+ebz 듘
+ebx 듙
+ebv 듚
+ebg 듛
+emr 득
+emR 듞
+emrt 듟
+ems 든
+emsw 듡
+emsg 듢
+eme 듣
+emf 들
+emfr 듥
+emfa 듦
+emfq 듧
+emft 듨
+emfx 듩
+emfv 듪
+emfg 듫
+ema 듬
+emq 듭
+emqt 듮
+emt 듯
+emT 듰
+emd 등
+emw 듲
+emc 듳
+emz 듴
+emx 듵
+emv 듶
+emg 듷
+emlr 듹
+emlR 듺
+emlrt 듻
+emls 듼
+emlsw 듽
+emlsg 듾
+emle 듿
+emlf 딀
+emlfr 딁
+emlfa 딂
+emlfq 딃
+emlft 딄
+emlfx 딅
+emlfv 딆
+emlfg 딇
+emla 딈
+emlq 딉
+emlqt 딊
+emlt 딋
+emlT 딌
+emld 딍
+emlw 딎
+emlc 딏
+emlz 딐
+emlx 딑
+emlv 딒
+emlg 딓
+elr 딕
+elR 딖
+elrt 딗
+els 딘
+elsw 딙
+elsg 딚
+ele 딛
+elf 딜
+elfr 딝
+elfa 딞
+elfq 딟
+elft 딠
+elfx 딡
+elfv 딢
+elfg 딣
+ela 딤
+elq 딥
+elqt 딦
+elt 딧
+elT 딨
+eld 딩
+elw 딪
+elc 딫
+elz 딬
+elx 딭
+elv 딮
+elg 딯
+Ekr 딱
+EkR 딲
+Ekrt 딳
+Eks 딴
+Eksw 딵
+Eksg 딶
+Eke 딷
+Ekf 딸
+Ekfr 딹
+Ekfa 딺
+Ekfq 딻
+Ekft 딼
+Ekfx 딽
+Ekfv 딾
+Ekfg 딿
+Eka 땀
+Ekq 땁
+Ekqt 땂
+Ekt 땃
+EkT 땄
+Ekd 땅
+Ekw 땆
+Ekc 땇
+Ekz 땈
+Ekx 땉
+Ekv 땊
+Ekg 땋
+Eor 땍
+EoR 땎
+Eort 땏
+Eos 땐
+Eosw 땑
+Eosg 땒
+Eoe 땓
+Eof 땔
+Eofr 땕
+Eofa 땖
+Eofq 땗
+Eoft 땘
+Eofx 땙
+Eofv 땚
+Eofg 땛
+Eoa 땜
+Eoq 땝
+Eoqt 땞
+Eot 땟
+EoT 땠
+Eod 땡
+Eow 땢
+Eoc 땣
+Eoz 땤
+Eox 땥
+Eov 땦
+Eog 땧
+Eir 땩
+EiR 땪
+Eirt 땫
+Eis 땬
+Eisw 땭
+Eisg 땮
+Eie 땯
+Eif 땰
+Eifr 땱
+Eifa 땲
+Eifq 땳
+Eift 땴
+Eifx 땵
+Eifv 땶
+Eifg 땷
+Eia 땸
+Eiq 땹
+Eiqt 땺
+Eit 땻
+EiT 땼
+Eid 땽
+Eiw 땾
+Eic 땿
+Eiz 떀
+Eix 떁
+Eiv 떂
+Eig 떃
+EOr 떅
+EOR 떆
+EOrt 떇
+EOs 떈
+EOsw 떉
+EOsg 떊
+EOe 떋
+EOf 떌
+EOfr 떍
+EOfa 떎
+EOfq 떏
+EOft 떐
+EOfx 떑
+EOfv 떒
+EOfg 떓
+EOa 떔
+EOq 떕
+EOqt 떖
+EOt 떗
+EOT 떘
+EOd 떙
+EOw 떚
+EOc 떛
+EOz 떜
+EOx 떝
+EOv 떞
+EOg 떟
+Ejr 떡
+EjR 떢
+Ejrt 떣
+Ejs 떤
+Ejsw 떥
+Ejsg 떦
+Eje 떧
+Ejf 떨
+Ejfr 떩
+Ejfa 떪
+Ejfq 떫
+Ejft 떬
+Ejfx 떭
+Ejfv 떮
+Ejfg 떯
+Eja 떰
+Ejq 떱
+Ejqt 떲
+Ejt 떳
+EjT 떴
+Ejd 떵
+Ejw 떶
+Ejc 떷
+Ejz 떸
+Ejx 떹
+Ejv 떺
+Ejg 떻
+Epr 떽
+EpR 떾
+Eprt 떿
+Eps 뗀
+Epsw 뗁
+Epsg 뗂
+Epe 뗃
+Epf 뗄
+Epfr 뗅
+Epfa 뗆
+Epfq 뗇
+Epft 뗈
+Epfx 뗉
+Epfv 뗊
+Epfg 뗋
+Epa 뗌
+Epq 뗍
+Epqt 뗎
+Ept 뗏
+EpT 뗐
+Epd 뗑
+Epw 뗒
+Epc 뗓
+Epz 뗔
+Epx 뗕
+Epv 뗖
+Epg 뗗
+Eur 뗙
+EuR 뗚
+Eurt 뗛
+Eus 뗜
+Eusw 뗝
+Eusg 뗞
+Eue 뗟
+Euf 뗠
+Eufr 뗡
+Eufa 뗢
+Eufq 뗣
+Euft 뗤
+Eufx 뗥
+Eufv 뗦
+Eufg 뗧
+Eua 뗨
+Euq 뗩
+Euqt 뗪
+Eut 뗫
+EuT 뗬
+Eud 뗭
+Euw 뗮
+Euc 뗯
+Euz 뗰
+Eux 뗱
+Euv 뗲
+Eug 뗳
+EPr 뗵
+EPR 뗶
+EPrt 뗷
+EPs 뗸
+EPsw 뗹
+EPsg 뗺
+EPe 뗻
+EPf 뗼
+EPfr 뗽
+EPfa 뗾
+EPfq 뗿
+EPft 똀
+EPfx 똁
+EPfv 똂
+EPfg 똃
+EPa 똄
+EPq 똅
+EPqt 똆
+EPt 똇
+EPT 똈
+EPd 똉
+EPw 똊
+EPc 똋
+EPz 똌
+EPx 똍
+EPv 똎
+EPg 똏
+Ehr 똑
+EhR 똒
+Ehrt 똓
+Ehs 똔
+Ehsw 똕
+Ehsg 똖
+Ehe 똗
+Ehf 똘
+Ehfr 똙
+Ehfa 똚
+Ehfq 똛
+Ehft 똜
+Ehfx 똝
+Ehfv 똞
+Ehfg 똟
+Eha 똠
+Ehq 똡
+Ehqt 똢
+Eht 똣
+EhT 똤
+Ehd 똥
+Ehw 똦
+Ehc 똧
+Ehz 똨
+Ehx 똩
+Ehv 똪
+Ehg 똫
+Ehkr 똭
+EhkR 똮
+Ehkrt 똯
+Ehks 똰
+Ehksw 똱
+Ehksg 똲
+Ehke 똳
+Ehkf 똴
+Ehkfr 똵
+Ehkfa 똶
+Ehkfq 똷
+Ehkft 똸
+Ehkfx 똹
+Ehkfv 똺
+Ehkfg 똻
+Ehka 똼
+Ehkq 똽
+Ehkqt 똾
+Ehkt 똿
+EhkT 뙀
+Ehkd 뙁
+Ehkw 뙂
+Ehkc 뙃
+Ehkz 뙄
+Ehkx 뙅
+Ehkv 뙆
+Ehkg 뙇
+Ehor 뙉
+EhoR 뙊
+Ehort 뙋
+Ehos 뙌
+Ehosw 뙍
+Ehosg 뙎
+Ehoe 뙏
+Ehof 뙐
+Ehofr 뙑
+Ehofa 뙒
+Ehofq 뙓
+Ehoft 뙔
+Ehofx 뙕
+Ehofv 뙖
+Ehofg 뙗
+Ehoa 뙘
+Ehoq 뙙
+Ehoqt 뙚
+Ehot 뙛
+EhoT 뙜
+Ehod 뙝
+Ehow 뙞
+Ehoc 뙟
+Ehoz 뙠
+Ehox 뙡
+Ehov 뙢
+Ehog 뙣
+Ehlr 뙥
+EhlR 뙦
+Ehlrt 뙧
+Ehls 뙨
+Ehlsw 뙩
+Ehlsg 뙪
+Ehle 뙫
+Ehlf 뙬
+Ehlfr 뙭
+Ehlfa 뙮
+Ehlfq 뙯
+Ehlft 뙰
+Ehlfx 뙱
+Ehlfv 뙲
+Ehlfg 뙳
+Ehla 뙴
+Ehlq 뙵
+Ehlqt 뙶
+Ehlt 뙷
+EhlT 뙸
+Ehld 뙹
+Ehlw 뙺
+Ehlc 뙻
+Ehlz 뙼
+Ehlx 뙽
+Ehlv 뙾
+Ehlg 뙿
+Eyr 뚁
+EyR 뚂
+Eyrt 뚃
+Eys 뚄
+Eysw 뚅
+Eysg 뚆
+Eye 뚇
+Eyf 뚈
+Eyfr 뚉
+Eyfa 뚊
+Eyfq 뚋
+Eyft 뚌
+Eyfx 뚍
+Eyfv 뚎
+Eyfg 뚏
+Eya 뚐
+Eyq 뚑
+Eyqt 뚒
+Eyt 뚓
+EyT 뚔
+Eyd 뚕
+Eyw 뚖
+Eyc 뚗
+Eyz 뚘
+Eyx 뚙
+Eyv 뚚
+Eyg 뚛
+Enr 뚝
+EnR 뚞
+Enrt 뚟
+Ens 뚠
+Ensw 뚡
+Ensg 뚢
+Ene 뚣
+Enf 뚤
+Enfr 뚥
+Enfa 뚦
+Enfq 뚧
+Enft 뚨
+Enfx 뚩
+Enfv 뚪
+Enfg 뚫
+Ena 뚬
+Enq 뚭
+Enqt 뚮
+Ent 뚯
+EnT 뚰
+End 뚱
+Enw 뚲
+Enc 뚳
+Enz 뚴
+Enx 뚵
+Env 뚶
+Eng 뚷
+Enjr 뚹
+EnjR 뚺
+Enjrt 뚻
+Enjs 뚼
+Enjsw 뚽
+Enjsg 뚾
+Enje 뚿
+Enjf 뛀
+Enjfr 뛁
+Enjfa 뛂
+Enjfq 뛃
+Enjft 뛄
+Enjfx 뛅
+Enjfv 뛆
+Enjfg 뛇
+Enja 뛈
+Enjq 뛉
+Enjqt 뛊
+Enjt 뛋
+EnjT 뛌
+Enjd 뛍
+Enjw 뛎
+Enjc 뛏
+Enjz 뛐
+Enjx 뛑
+Enjv 뛒
+Enjg 뛓
+Enpr 뛕
+EnpR 뛖
+Enprt 뛗
+Enps 뛘
+Enpsw 뛙
+Enpsg 뛚
+Enpe 뛛
+Enpf 뛜
+Enpfr 뛝
+Enpfa 뛞
+Enpfq 뛟
+Enpft 뛠
+Enpfx 뛡
+Enpfv 뛢
+Enpfg 뛣
+Enpa 뛤
+Enpq 뛥
+Enpqt 뛦
+Enpt 뛧
+EnpT 뛨
+Enpd 뛩
+Enpw 뛪
+Enpc 뛫
+Enpz 뛬
+Enpx 뛭
+Enpv 뛮
+Enpg 뛯
+Enlr 뛱
+EnlR 뛲
+Enlrt 뛳
+Enls 뛴
+Enlsw 뛵
+Enlsg 뛶
+Enle 뛷
+Enlf 뛸
+Enlfr 뛹
+Enlfa 뛺
+Enlfq 뛻
+Enlft 뛼
+Enlfx 뛽
+Enlfv 뛾
+Enlfg 뛿
+Enla 뜀
+Enlq 뜁
+Enlqt 뜂
+Enlt 뜃
+EnlT 뜄
+Enld 뜅
+Enlw 뜆
+Enlc 뜇
+Enlz 뜈
+Enlx 뜉
+Enlv 뜊
+Enlg 뜋
+Ebr 뜍
+EbR 뜎
+Ebrt 뜏
+Ebs 뜐
+Ebsw 뜑
+Ebsg 뜒
+Ebe 뜓
+Ebf 뜔
+Ebfr 뜕
+Ebfa 뜖
+Ebfq 뜗
+Ebft 뜘
+Ebfx 뜙
+Ebfv 뜚
+Ebfg 뜛
+Eba 뜜
+Ebq 뜝
+Ebqt 뜞
+Ebt 뜟
+EbT 뜠
+Ebd 뜡
+Ebw 뜢
+Ebc 뜣
+Ebz 뜤
+Ebx 뜥
+Ebv 뜦
+Ebg 뜧
+Emr 뜩
+EmR 뜪
+Emrt 뜫
+Ems 뜬
+Emsw 뜭
+Emsg 뜮
+Eme 뜯
+Emf 뜰
+Emfr 뜱
+Emfa 뜲
+Emfq 뜳
+Emft 뜴
+Emfx 뜵
+Emfv 뜶
+Emfg 뜷
+Ema 뜸
+Emq 뜹
+Emqt 뜺
+Emt 뜻
+EmT 뜼
+Emd 뜽
+Emw 뜾
+Emc 뜿
+Emz 띀
+Emx 띁
+Emv 띂
+Emg 띃
+Emlr 띅
+EmlR 띆
+Emlrt 띇
+Emls 띈
+Emlsw 띉
+Emlsg 띊
+Emle 띋
+Emlf 띌
+Emlfr 띍
+Emlfa 띎
+Emlfq 띏
+Emlft 띐
+Emlfx 띑
+Emlfv 띒
+Emlfg 띓
+Emla 띔
+Emlq 띕
+Emlqt 띖
+Emlt 띗
+EmlT 띘
+Emld 띙
+Emlw 띚
+Emlc 띛
+Emlz 띜
+Emlx 띝
+Emlv 띞
+Emlg 띟
+Elr 띡
+ElR 띢
+Elrt 띣
+Els 띤
+Elsw 띥
+Elsg 띦
+Ele 띧
+Elf 띨
+Elfr 띩
+Elfa 띪
+Elfq 띫
+Elft 띬
+Elfx 띭
+Elfv 띮
+Elfg 띯
+Ela 띰
+Elq 띱
+Elqt 띲
+Elt 띳
+ElT 띴
+Eld 띵
+Elw 띶
+Elc 띷
+Elz 띸
+Elx 띹
+Elv 띺
+Elg 띻
+fkr 락
+fkR 띾
+fkrt 띿
+fks 란
+fksw 랁
+fksg 랂
+fke 랃
+fkf 랄
+fkfr 랅
+fkfa 랆
+fkfq 랇
+fkft 랈
+fkfx 랉
+fkfv 랊
+fkfg 랋
+fka 람
+fkq 랍
+fkqt 랎
+fkt 랏
+fkT 랐
+fkd 랑
+fkw 랒
+fkc 랓
+fkz 랔
+fkx 랕
+fkv 랖
+fkg 랗
+for 랙
+foR 랚
+fort 랛
+fos 랜
+fosw 랝
+fosg 랞
+foe 랟
+fof 랠
+fofr 랡
+fofa 랢
+fofq 랣
+foft 랤
+fofx 랥
+fofv 랦
+fofg 랧
+foa 램
+foq 랩
+foqt 랪
+fot 랫
+foT 랬
+fod 랭
+fow 랮
+foc 랯
+foz 랰
+fox 랱
+fov 랲
+fog 랳
+fir 략
+fiR 랶
+firt 랷
+fis 랸
+fisw 랹
+fisg 랺
+fie 랻
+fif 랼
+fifr 랽
+fifa 랾
+fifq 랿
+fift 럀
+fifx 럁
+fifv 럂
+fifg 럃
+fia 럄
+fiq 럅
+fiqt 럆
+fit 럇
+fiT 럈
+fid 량
+fiw 럊
+fic 럋
+fiz 럌
+fix 럍
+fiv 럎
+fig 럏
+fOr 럑
+fOR 럒
+fOrt 럓
+fOs 럔
+fOsw 럕
+fOsg 럖
+fOe 럗
+fOf 럘
+fOfr 럙
+fOfa 럚
+fOfq 럛
+fOft 럜
+fOfx 럝
+fOfv 럞
+fOfg 럟
+fOa 럠
+fOq 럡
+fOqt 럢
+fOt 럣
+fOT 럤
+fOd 럥
+fOw 럦
+fOc 럧
+fOz 럨
+fOx 럩
+fOv 럪
+fOg 럫
+fjr 럭
+fjR 럮
+fjrt 럯
+fjs 런
+fjsw 럱
+fjsg 럲
+fje 럳
+fjf 럴
+fjfr 럵
+fjfa 럶
+fjfq 럷
+fjft 럸
+fjfx 럹
+fjfv 럺
+fjfg 럻
+fja 럼
+fjq 럽
+fjqt 럾
+fjt 럿
+fjT 렀
+fjd 렁
+fjw 렂
+fjc 렃
+fjz 렄
+fjx 렅
+fjv 렆
+fjg 렇
+fpr 렉
+fpR 렊
+fprt 렋
+fps 렌
+fpsw 렍
+fpsg 렎
+fpe 렏
+fpf 렐
+fpfr 렑
+fpfa 렒
+fpfq 렓
+fpft 렔
+fpfx 렕
+fpfv 렖
+fpfg 렗
+fpa 렘
+fpq 렙
+fpqt 렚
+fpt 렛
+fpT 렜
+fpd 렝
+fpw 렞
+fpc 렟
+fpz 렠
+fpx 렡
+fpv 렢
+fpg 렣
+fur 력
+fuR 렦
+furt 렧
+fus 련
+fusw 렩
+fusg 렪
+fue 렫
+fuf 렬
+fufr 렭
+fufa 렮
+fufq 렯
+fuft 렰
+fufx 렱
+fufv 렲
+fufg 렳
+fua 렴
+fuq 렵
+fuqt 렶
+fut 렷
+fuT 렸
+fud 령
+fuw 렺
+fuc 렻
+fuz 렼
+fux 렽
+fuv 렾
+fug 렿
+fPr 롁
+fPR 롂
+fPrt 롃
+fPs 롄
+fPsw 롅
+fPsg 롆
+fPe 롇
+fPf 롈
+fPfr 롉
+fPfa 롊
+fPfq 롋
+fPft 롌
+fPfx 롍
+fPfv 롎
+fPfg 롏
+fPa 롐
+fPq 롑
+fPqt 롒
+fPt 롓
+fPT 롔
+fPd 롕
+fPw 롖
+fPc 롗
+fPz 롘
+fPx 롙
+fPv 롚
+fPg 롛
+fhr 록
+fhR 롞
+fhrt 롟
+fhs 론
+fhsw 롡
+fhsg 롢
+fhe 롣
+fhf 롤
+fhfr 롥
+fhfa 롦
+fhfq 롧
+fhft 롨
+fhfx 롩
+fhfv 롪
+fhfg 롫
+fha 롬
+fhq 롭
+fhqt 롮
+fht 롯
+fhT 롰
+fhd 롱
+fhw 롲
+fhc 롳
+fhz 롴
+fhx 롵
+fhv 롶
+fhg 롷
+fhkr 롹
+fhkR 롺
+fhkrt 롻
+fhks 롼
+fhksw 롽
+fhksg 롾
+fhke 롿
+fhkf 뢀
+fhkfr 뢁
+fhkfa 뢂
+fhkfq 뢃
+fhkft 뢄
+fhkfx 뢅
+fhkfv 뢆
+fhkfg 뢇
+fhka 뢈
+fhkq 뢉
+fhkqt 뢊
+fhkt 뢋
+fhkT 뢌
+fhkd 뢍
+fhkw 뢎
+fhkc 뢏
+fhkz 뢐
+fhkx 뢑
+fhkv 뢒
+fhkg 뢓
+fhor 뢕
+fhoR 뢖
+fhort 뢗
+fhos 뢘
+fhosw 뢙
+fhosg 뢚
+fhoe 뢛
+fhof 뢜
+fhofr 뢝
+fhofa 뢞
+fhofq 뢟
+fhoft 뢠
+fhofx 뢡
+fhofv 뢢
+fhofg 뢣
+fhoa 뢤
+fhoq 뢥
+fhoqt 뢦
+fhot 뢧
+fhoT 뢨
+fhod 뢩
+fhow 뢪
+fhoc 뢫
+fhoz 뢬
+fhox 뢭
+fhov 뢮
+fhog 뢯
+fhlr 뢱
+fhlR 뢲
+fhlrt 뢳
+fhls 뢴
+fhlsw 뢵
+fhlsg 뢶
+fhle 뢷
+fhlf 뢸
+fhlfr 뢹
+fhlfa 뢺
+fhlfq 뢻
+fhlft 뢼
+fhlfx 뢽
+fhlfv 뢾
+fhlfg 뢿
+fhla 룀
+fhlq 룁
+fhlqt 룂
+fhlt 룃
+fhlT 룄
+fhld 룅
+fhlw 룆
+fhlc 룇
+fhlz 룈
+fhlx 룉
+fhlv 룊
+fhlg 룋
+fyr 룍
+fyR 룎
+fyrt 룏
+fys 룐
+fysw 룑
+fysg 룒
+fye 룓
+fyf 룔
+fyfr 룕
+fyfa 룖
+fyfq 룗
+fyft 룘
+fyfx 룙
+fyfv 룚
+fyfg 룛
+fya 룜
+fyq 룝
+fyqt 룞
+fyt 룟
+fyT 룠
+fyd 룡
+fyw 룢
+fyc 룣
+fyz 룤
+fyx 룥
+fyv 룦
+fyg 룧
+fnr 룩
+fnR 룪
+fnrt 룫
+fns 룬
+fnsw 룭
+fnsg 룮
+fne 룯
+fnf 룰
+fnfr 룱
+fnfa 룲
+fnfq 룳
+fnft 룴
+fnfx 룵
+fnfv 룶
+fnfg 룷
+fna 룸
+fnq 룹
+fnqt 룺
+fnt 룻
+fnT 룼
+fnd 룽
+fnw 룾
+fnc 룿
+fnz 뤀
+fnx 뤁
+fnv 뤂
+fng 뤃
+fnjr 뤅
+fnjR 뤆
+fnjrt 뤇
+fnjs 뤈
+fnjsw 뤉
+fnjsg 뤊
+fnje 뤋
+fnjf 뤌
+fnjfr 뤍
+fnjfa 뤎
+fnjfq 뤏
+fnjft 뤐
+fnjfx 뤑
+fnjfv 뤒
+fnjfg 뤓
+fnja 뤔
+fnjq 뤕
+fnjqt 뤖
+fnjt 뤗
+fnjT 뤘
+fnjd 뤙
+fnjw 뤚
+fnjc 뤛
+fnjz 뤜
+fnjx 뤝
+fnjv 뤞
+fnjg 뤟
+fnpr 뤡
+fnpR 뤢
+fnprt 뤣
+fnps 뤤
+fnpsw 뤥
+fnpsg 뤦
+fnpe 뤧
+fnpf 뤨
+fnpfr 뤩
+fnpfa 뤪
+fnpfq 뤫
+fnpft 뤬
+fnpfx 뤭
+fnpfv 뤮
+fnpfg 뤯
+fnpa 뤰
+fnpq 뤱
+fnpqt 뤲
+fnpt 뤳
+fnpT 뤴
+fnpd 뤵
+fnpw 뤶
+fnpc 뤷
+fnpz 뤸
+fnpx 뤹
+fnpv 뤺
+fnpg 뤻
+fnlr 뤽
+fnlR 뤾
+fnlrt 뤿
+fnls 륀
+fnlsw 륁
+fnlsg 륂
+fnle 륃
+fnlf 륄
+fnlfr 륅
+fnlfa 륆
+fnlfq 륇
+fnlft 륈
+fnlfx 륉
+fnlfv 륊
+fnlfg 륋
+fnla 륌
+fnlq 륍
+fnlqt 륎
+fnlt 륏
+fnlT 륐
+fnld 륑
+fnlw 륒
+fnlc 륓
+fnlz 륔
+fnlx 륕
+fnlv 륖
+fnlg 륗
+fbr 륙
+fbR 륚
+fbrt 륛
+fbs 륜
+fbsw 륝
+fbsg 륞
+fbe 륟
+fbf 률
+fbfr 륡
+fbfa 륢
+fbfq 륣
+fbft 륤
+fbfx 륥
+fbfv 륦
+fbfg 륧
+fba 륨
+fbq 륩
+fbqt 륪
+fbt 륫
+fbT 륬
+fbd 륭
+fbw 륮
+fbc 륯
+fbz 륰
+fbx 륱
+fbv 륲
+fbg 륳
+fmr 륵
+fmR 륶
+fmrt 륷
+fms 른
+fmsw 륹
+fmsg 륺
+fme 륻
+fmf 를
+fmfr 륽
+fmfa 륾
+fmfq 륿
+fmft 릀
+fmfx 릁
+fmfv 릂
+fmfg 릃
+fma 름
+fmq 릅
+fmqt 릆
+fmt 릇
+fmT 릈
+fmd 릉
+fmw 릊
+fmc 릋
+fmz 릌
+fmx 릍
+fmv 릎
+fmg 릏
+fmlr 릑
+fmlR 릒
+fmlrt 릓
+fmls 릔
+fmlsw 릕
+fmlsg 릖
+fmle 릗
+fmlf 릘
+fmlfr 릙
+fmlfa 릚
+fmlfq 릛
+fmlft 릜
+fmlfx 릝
+fmlfv 릞
+fmlfg 릟
+fmla 릠
+fmlq 릡
+fmlqt 릢
+fmlt 릣
+fmlT 릤
+fmld 릥
+fmlw 릦
+fmlc 릧
+fmlz 릨
+fmlx 릩
+fmlv 릪
+fmlg 릫
+flr 릭
+flR 릮
+flrt 릯
+fls 린
+flsw 릱
+flsg 릲
+fle 릳
+flf 릴
+flfr 릵
+flfa 릶
+flfq 릷
+flft 릸
+flfx 릹
+flfv 릺
+flfg 릻
+fla 림
+flq 립
+flqt 릾
+flt 릿
+flT 맀
+fld 링
+flw 맂
+flc 맃
+flz 맄
+flx 맅
+flv 맆
+flg 맇
+akr 막
+akR 맊
+akrt 맋
+aks 만
+aksw 맍
+aksg 많
+ake 맏
+akf 말
+akfr 맑
+akfa 맒
+akfq 맓
+akft 맔
+akfx 맕
+akfv 맖
+akfg 맗
+aka 맘
+akq 맙
+akqt 맚
+akt 맛
+akT 맜
+akd 망
+akw 맞
+akc 맟
+akz 맠
+akx 맡
+akv 맢
+akg 맣
+aor 맥
+aoR 맦
+aort 맧
+aos 맨
+aosw 맩
+aosg 맪
+aoe 맫
+aof 맬
+aofr 맭
+aofa 맮
+aofq 맯
+aoft 맰
+aofx 맱
+aofv 맲
+aofg 맳
+aoa 맴
+aoq 맵
+aoqt 맶
+aot 맷
+aoT 맸
+aod 맹
+aow 맺
+aoc 맻
+aoz 맼
+aox 맽
+aov 맾
+aog 맿
+air 먁
+aiR 먂
+airt 먃
+ais 먄
+aisw 먅
+aisg 먆
+aie 먇
+aif 먈
+aifr 먉
+aifa 먊
+aifq 먋
+aift 먌
+aifx 먍
+aifv 먎
+aifg 먏
+aia 먐
+aiq 먑
+aiqt 먒
+ait 먓
+aiT 먔
+aid 먕
+aiw 먖
+aic 먗
+aiz 먘
+aix 먙
+aiv 먚
+aig 먛
+aOr 먝
+aOR 먞
+aOrt 먟
+aOs 먠
+aOsw 먡
+aOsg 먢
+aOe 먣
+aOf 먤
+aOfr 먥
+aOfa 먦
+aOfq 먧
+aOft 먨
+aOfx 먩
+aOfv 먪
+aOfg 먫
+aOa 먬
+aOq 먭
+aOqt 먮
+aOt 먯
+aOT 먰
+aOd 먱
+aOw 먲
+aOc 먳
+aOz 먴
+aOx 먵
+aOv 먶
+aOg 먷
+ajr 먹
+ajR 먺
+ajrt 먻
+ajs 먼
+ajsw 먽
+ajsg 먾
+aje 먿
+ajf 멀
+ajfr 멁
+ajfa 멂
+ajfq 멃
+ajft 멄
+ajfx 멅
+ajfv 멆
+ajfg 멇
+aja 멈
+ajq 멉
+ajqt 멊
+ajt 멋
+ajT 멌
+ajd 멍
+ajw 멎
+ajc 멏
+ajz 멐
+ajx 멑
+ajv 멒
+ajg 멓
+apr 멕
+apR 멖
+aprt 멗
+aps 멘
+apsw 멙
+apsg 멚
+ape 멛
+apf 멜
+apfr 멝
+apfa 멞
+apfq 멟
+apft 멠
+apfx 멡
+apfv 멢
+apfg 멣
+apa 멤
+apq 멥
+apqt 멦
+apt 멧
+apT 멨
+apd 멩
+apw 멪
+apc 멫
+apz 멬
+apx 멭
+apv 멮
+apg 멯
+aur 멱
+auR 멲
+aurt 멳
+aus 면
+ausw 멵
+ausg 멶
+aue 멷
+auf 멸
+aufr 멹
+aufa 멺
+aufq 멻
+auft 멼
+aufx 멽
+aufv 멾
+aufg 멿
+aua 몀
+auq 몁
+auqt 몂
+aut 몃
+auT 몄
+aud 명
+auw 몆
+auc 몇
+auz 몈
+aux 몉
+auv 몊
+aug 몋
+aPr 몍
+aPR 몎
+aPrt 몏
+aPs 몐
+aPsw 몑
+aPsg 몒
+aPe 몓
+aPf 몔
+aPfr 몕
+aPfa 몖
+aPfq 몗
+aPft 몘
+aPfx 몙
+aPfv 몚
+aPfg 몛
+aPa 몜
+aPq 몝
+aPqt 몞
+aPt 몟
+aPT 몠
+aPd 몡
+aPw 몢
+aPc 몣
+aPz 몤
+aPx 몥
+aPv 몦
+aPg 몧
+ahr 목
+ahR 몪
+ahrt 몫
+ahs 몬
+ahsw 몭
+ahsg 몮
+ahe 몯
+ahf 몰
+ahfr 몱
+ahfa 몲
+ahfq 몳
+ahft 몴
+ahfx 몵
+ahfv 몶
+ahfg 몷
+aha 몸
+ahq 몹
+ahqt 몺
+aht 못
+ahT 몼
+ahd 몽
+ahw 몾
+ahc 몿
+ahz 뫀
+ahx 뫁
+ahv 뫂
+ahg 뫃
+ahkr 뫅
+ahkR 뫆
+ahkrt 뫇
+ahks 뫈
+ahksw 뫉
+ahksg 뫊
+ahke 뫋
+ahkf 뫌
+ahkfr 뫍
+ahkfa 뫎
+ahkfq 뫏
+ahkft 뫐
+ahkfx 뫑
+ahkfv 뫒
+ahkfg 뫓
+ahka 뫔
+ahkq 뫕
+ahkqt 뫖
+ahkt 뫗
+ahkT 뫘
+ahkd 뫙
+ahkw 뫚
+ahkc 뫛
+ahkz 뫜
+ahkx 뫝
+ahkv 뫞
+ahkg 뫟
+ahor 뫡
+ahoR 뫢
+ahort 뫣
+ahos 뫤
+ahosw 뫥
+ahosg 뫦
+ahoe 뫧
+ahof 뫨
+ahofr 뫩
+ahofa 뫪
+ahofq 뫫
+ahoft 뫬
+ahofx 뫭
+ahofv 뫮
+ahofg 뫯
+ahoa 뫰
+ahoq 뫱
+ahoqt 뫲
+ahot 뫳
+ahoT 뫴
+ahod 뫵
+ahow 뫶
+ahoc 뫷
+ahoz 뫸
+ahox 뫹
+ahov 뫺
+ahog 뫻
+ahlr 뫽
+ahlR 뫾
+ahlrt 뫿
+ahls 묀
+ahlsw 묁
+ahlsg 묂
+ahle 묃
+ahlf 묄
+ahlfr 묅
+ahlfa 묆
+ahlfq 묇
+ahlft 묈
+ahlfx 묉
+ahlfv 묊
+ahlfg 묋
+ahla 묌
+ahlq 묍
+ahlqt 묎
+ahlt 묏
+ahlT 묐
+ahld 묑
+ahlw 묒
+ahlc 묓
+ahlz 묔
+ahlx 묕
+ahlv 묖
+ahlg 묗
+ayr 묙
+ayR 묚
+ayrt 묛
+ays 묜
+aysw 묝
+aysg 묞
+aye 묟
+ayf 묠
+ayfr 묡
+ayfa 묢
+ayfq 묣
+ayft 묤
+ayfx 묥
+ayfv 묦
+ayfg 묧
+aya 묨
+ayq 묩
+ayqt 묪
+ayt 묫
+ayT 묬
+ayd 묭
+ayw 묮
+ayc 묯
+ayz 묰
+ayx 묱
+ayv 묲
+ayg 묳
+anr 묵
+anR 묶
+anrt 묷
+ans 문
+answ 묹
+ansg 묺
+ane 묻
+anf 물
+anfr 묽
+anfa 묾
+anfq 묿
+anft 뭀
+anfx 뭁
+anfv 뭂
+anfg 뭃
+ana 뭄
+anq 뭅
+anqt 뭆
+ant 뭇
+anT 뭈
+and 뭉
+anw 뭊
+anc 뭋
+anz 뭌
+anx 뭍
+anv 뭎
+ang 뭏
+anjr 뭑
+anjR 뭒
+anjrt 뭓
+anjs 뭔
+anjsw 뭕
+anjsg 뭖
+anje 뭗
+anjf 뭘
+anjfr 뭙
+anjfa 뭚
+anjfq 뭛
+anjft 뭜
+anjfx 뭝
+anjfv 뭞
+anjfg 뭟
+anja 뭠
+anjq 뭡
+anjqt 뭢
+anjt 뭣
+anjT 뭤
+anjd 뭥
+anjw 뭦
+anjc 뭧
+anjz 뭨
+anjx 뭩
+anjv 뭪
+anjg 뭫
+anpr 뭭
+anpR 뭮
+anprt 뭯
+anps 뭰
+anpsw 뭱
+anpsg 뭲
+anpe 뭳
+anpf 뭴
+anpfr 뭵
+anpfa 뭶
+anpfq 뭷
+anpft 뭸
+anpfx 뭹
+anpfv 뭺
+anpfg 뭻
+anpa 뭼
+anpq 뭽
+anpqt 뭾
+anpt 뭿
+anpT 뮀
+anpd 뮁
+anpw 뮂
+anpc 뮃
+anpz 뮄
+anpx 뮅
+anpv 뮆
+anpg 뮇
+anlr 뮉
+anlR 뮊
+anlrt 뮋
+anls 뮌
+anlsw 뮍
+anlsg 뮎
+anle 뮏
+anlf 뮐
+anlfr 뮑
+anlfa 뮒
+anlfq 뮓
+anlft 뮔
+anlfx 뮕
+anlfv 뮖
+anlfg 뮗
+anla 뮘
+anlq 뮙
+anlqt 뮚
+anlt 뮛
+anlT 뮜
+anld 뮝
+anlw 뮞
+anlc 뮟
+anlz 뮠
+anlx 뮡
+anlv 뮢
+anlg 뮣
+abr 뮥
+abR 뮦
+abrt 뮧
+abs 뮨
+absw 뮩
+absg 뮪
+abe 뮫
+abf 뮬
+abfr 뮭
+abfa 뮮
+abfq 뮯
+abft 뮰
+abfx 뮱
+abfv 뮲
+abfg 뮳
+aba 뮴
+abq 뮵
+abqt 뮶
+abt 뮷
+abT 뮸
+abd 뮹
+abw 뮺
+abc 뮻
+abz 뮼
+abx 뮽
+abv 뮾
+abg 뮿
+amr 믁
+amR 믂
+amrt 믃
+ams 믄
+amsw 믅
+amsg 믆
+ame 믇
+amf 믈
+amfr 믉
+amfa 믊
+amfq 믋
+amft 믌
+amfx 믍
+amfv 믎
+amfg 믏
+ama 믐
+amq 믑
+amqt 믒
+amt 믓
+amT 믔
+amd 믕
+amw 믖
+amc 믗
+amz 믘
+amx 믙
+amv 믚
+amg 믛
+amlr 믝
+amlR 믞
+amlrt 믟
+amls 믠
+amlsw 믡
+amlsg 믢
+amle 믣
+amlf 믤
+amlfr 믥
+amlfa 믦
+amlfq 믧
+amlft 믨
+amlfx 믩
+amlfv 믪
+amlfg 믫
+amla 믬
+amlq 믭
+amlqt 믮
+amlt 믯
+amlT 믰
+amld 믱
+amlw 믲
+amlc 믳
+amlz 믴
+amlx 믵
+amlv 믶
+amlg 믷
+alr 믹
+alR 믺
+alrt 믻
+als 민
+alsw 믽
+alsg 믾
+ale 믿
+alf 밀
+alfr 밁
+alfa 밂
+alfq 밃
+alft 밄
+alfx 밅
+alfv 밆
+alfg 밇
+ala 밈
+alq 밉
+alqt 밊
+alt 밋
+alT 밌
+ald 밍
+alw 밎
+alc 및
+alz 밐
+alx 밑
+alv 밒
+alg 밓
+qkr 박
+qkR 밖
+qkrt 밗
+qks 반
+qksw 밙
+qksg 밚
+qke 받
+qkf 발
+qkfr 밝
+qkfa 밞
+qkfq 밟
+qkft 밠
+qkfx 밡
+qkfv 밢
+qkfg 밣
+qka 밤
+qkq 밥
+qkqt 밦
+qkt 밧
+qkT 밨
+qkd 방
+qkw 밪
+qkc 밫
+qkz 밬
+qkx 밭
+qkv 밮
+qkg 밯
+qor 백
+qoR 밲
+qort 밳
+qos 밴
+qosw 밵
+qosg 밶
+qoe 밷
+qof 밸
+qofr 밹
+qofa 밺
+qofq 밻
+qoft 밼
+qofx 밽
+qofv 밾
+qofg 밿
+qoa 뱀
+qoq 뱁
+qoqt 뱂
+qot 뱃
+qoT 뱄
+qod 뱅
+qow 뱆
+qoc 뱇
+qoz 뱈
+qox 뱉
+qov 뱊
+qog 뱋
+qir 뱍
+qiR 뱎
+qirt 뱏
+qis 뱐
+qisw 뱑
+qisg 뱒
+qie 뱓
+qif 뱔
+qifr 뱕
+qifa 뱖
+qifq 뱗
+qift 뱘
+qifx 뱙
+qifv 뱚
+qifg 뱛
+qia 뱜
+qiq 뱝
+qiqt 뱞
+qit 뱟
+qiT 뱠
+qid 뱡
+qiw 뱢
+qic 뱣
+qiz 뱤
+qix 뱥
+qiv 뱦
+qig 뱧
+qOr 뱩
+qOR 뱪
+qOrt 뱫
+qOs 뱬
+qOsw 뱭
+qOsg 뱮
+qOe 뱯
+qOf 뱰
+qOfr 뱱
+qOfa 뱲
+qOfq 뱳
+qOft 뱴
+qOfx 뱵
+qOfv 뱶
+qOfg 뱷
+qOa 뱸
+qOq 뱹
+qOqt 뱺
+qOt 뱻
+qOT 뱼
+qOd 뱽
+qOw 뱾
+qOc 뱿
+qOz 벀
+qOx 벁
+qOv 벂
+qOg 벃
+qjr 벅
+qjR 벆
+qjrt 벇
+qjs 번
+qjsw 벉
+qjsg 벊
+qje 벋
+qjf 벌
+qjfr 벍
+qjfa 벎
+qjfq 벏
+qjft 벐
+qjfx 벑
+qjfv 벒
+qjfg 벓
+qja 범
+qjq 법
+qjqt 벖
+qjt 벗
+qjT 벘
+qjd 벙
+qjw 벚
+qjc 벛
+qjz 벜
+qjx 벝
+qjv 벞
+qjg 벟
+qpr 벡
+qpR 벢
+qprt 벣
+qps 벤
+qpsw 벥
+qpsg 벦
+qpe 벧
+qpf 벨
+qpfr 벩
+qpfa 벪
+qpfq 벫
+qpft 벬
+qpfx 벭
+qpfv 벮
+qpfg 벯
+qpa 벰
+qpq 벱
+qpqt 벲
+qpt 벳
+qpT 벴
+qpd 벵
+qpw 벶
+qpc 벷
+qpz 벸
+qpx 벹
+qpv 벺
+qpg 벻
+qur 벽
+quR 벾
+qurt 벿
+qus 변
+qusw 볁
+qusg 볂
+que 볃
+quf 별
+qufr 볅
+qufa 볆
+qufq 볇
+quft 볈
+qufx 볉
+qufv 볊
+qufg 볋
+qua 볌
+quq 볍
+quqt 볎
+qut 볏
+quT 볐
+qud 병
+quw 볒
+quc 볓
+quz 볔
+qux 볕
+quv 볖
+qug 볗
+qPr 볙
+qPR 볚
+qPrt 볛
+qPs 볜
+qPsw 볝
+qPsg 볞
+qPe 볟
+qPf 볠
+qPfr 볡
+qPfa 볢
+qPfq 볣
+qPft 볤
+qPfx 볥
+qPfv 볦
+qPfg 볧
+qPa 볨
+qPq 볩
+qPqt 볪
+qPt 볫
+qPT 볬
+qPd 볭
+qPw 볮
+qPc 볯
+qPz 볰
+qPx 볱
+qPv 볲
+qPg 볳
+qhr 복
+qhR 볶
+qhrt 볷
+qhs 본
+qhsw 볹
+qhsg 볺
+qhe 볻
+qhf 볼
+qhfr 볽
+qhfa 볾
+qhfq 볿
+qhft 봀
+qhfx 봁
+qhfv 봂
+qhfg 봃
+qha 봄
+qhq 봅
+qhqt 봆
+qht 봇
+qhT 봈
+qhd 봉
+qhw 봊
+qhc 봋
+qhz 봌
+qhx 봍
+qhv 봎
+qhg 봏
+qhkr 봑
+qhkR 봒
+qhkrt 봓
+qhks 봔
+qhksw 봕
+qhksg 봖
+qhke 봗
+qhkf 봘
+qhkfr 봙
+qhkfa 봚
+qhkfq 봛
+qhkft 봜
+qhkfx 봝
+qhkfv 봞
+qhkfg 봟
+qhka 봠
+qhkq 봡
+qhkqt 봢
+qhkt 봣
+qhkT 봤
+qhkd 봥
+qhkw 봦
+qhkc 봧
+qhkz 봨
+qhkx 봩
+qhkv 봪
+qhkg 봫
+qhor 봭
+qhoR 봮
+qhort 봯
+qhos 봰
+qhosw 봱
+qhosg 봲
+qhoe 봳
+qhof 봴
+qhofr 봵
+qhofa 봶
+qhofq 봷
+qhoft 봸
+qhofx 봹
+qhofv 봺
+qhofg 봻
+qhoa 봼
+qhoq 봽
+qhoqt 봾
+qhot 봿
+qhoT 뵀
+qhod 뵁
+qhow 뵂
+qhoc 뵃
+qhoz 뵄
+qhox 뵅
+qhov 뵆
+qhog 뵇
+qhlr 뵉
+qhlR 뵊
+qhlrt 뵋
+qhls 뵌
+qhlsw 뵍
+qhlsg 뵎
+qhle 뵏
+qhlf 뵐
+qhlfr 뵑
+qhlfa 뵒
+qhlfq 뵓
+qhlft 뵔
+qhlfx 뵕
+qhlfv 뵖
+qhlfg 뵗
+qhla 뵘
+qhlq 뵙
+qhlqt 뵚
+qhlt 뵛
+qhlT 뵜
+qhld 뵝
+qhlw 뵞
+qhlc 뵟
+qhlz 뵠
+qhlx 뵡
+qhlv 뵢
+qhlg 뵣
+qyr 뵥
+qyR 뵦
+qyrt 뵧
+qys 뵨
+qysw 뵩
+qysg 뵪
+qye 뵫
+qyf 뵬
+qyfr 뵭
+qyfa 뵮
+qyfq 뵯
+qyft 뵰
+qyfx 뵱
+qyfv 뵲
+qyfg 뵳
+qya 뵴
+qyq 뵵
+qyqt 뵶
+qyt 뵷
+qyT 뵸
+qyd 뵹
+qyw 뵺
+qyc 뵻
+qyz 뵼
+qyx 뵽
+qyv 뵾
+qyg 뵿
+qnr 북
+qnR 붂
+qnrt 붃
+qns 분
+qnsw 붅
+qnsg 붆
+qne 붇
+qnf 불
+qnfr 붉
+qnfa 붊
+qnfq 붋
+qnft 붌
+qnfx 붍
+qnfv 붎
+qnfg 붏
+qna 붐
+qnq 붑
+qnqt 붒
+qnt 붓
+qnT 붔
+qnd 붕
+qnw 붖
+qnc 붗
+qnz 붘
+qnx 붙
+qnv 붚
+qng 붛
+qnjr 붝
+qnjR 붞
+qnjrt 붟
+qnjs 붠
+qnjsw 붡
+qnjsg 붢
+qnje 붣
+qnjf 붤
+qnjfr 붥
+qnjfa 붦
+qnjfq 붧
+qnjft 붨
+qnjfx 붩
+qnjfv 붪
+qnjfg 붫
+qnja 붬
+qnjq 붭
+qnjqt 붮
+qnjt 붯
+qnjT 붰
+qnjd 붱
+qnjw 붲
+qnjc 붳
+qnjz 붴
+qnjx 붵
+qnjv 붶
+qnjg 붷
+qnpr 붹
+qnpR 붺
+qnprt 붻
+qnps 붼
+qnpsw 붽
+qnpsg 붾
+qnpe 붿
+qnpf 뷀
+qnpfr 뷁
+qnpfa 뷂
+qnpfq 뷃
+qnpft 뷄
+qnpfx 뷅
+qnpfv 뷆
+qnpfg 뷇
+qnpa 뷈
+qnpq 뷉
+qnpqt 뷊
+qnpt 뷋
+qnpT 뷌
+qnpd 뷍
+qnpw 뷎
+qnpc 뷏
+qnpz 뷐
+qnpx 뷑
+qnpv 뷒
+qnpg 뷓
+qnlr 뷕
+qnlR 뷖
+qnlrt 뷗
+qnls 뷘
+qnlsw 뷙
+qnlsg 뷚
+qnle 뷛
+qnlf 뷜
+qnlfr 뷝
+qnlfa 뷞
+qnlfq 뷟
+qnlft 뷠
+qnlfx 뷡
+qnlfv 뷢
+qnlfg 뷣
+qnla 뷤
+qnlq 뷥
+qnlqt 뷦
+qnlt 뷧
+qnlT 뷨
+qnld 뷩
+qnlw 뷪
+qnlc 뷫
+qnlz 뷬
+qnlx 뷭
+qnlv 뷮
+qnlg 뷯
+qbr 뷱
+qbR 뷲
+qbrt 뷳
+qbs 뷴
+qbsw 뷵
+qbsg 뷶
+qbe 뷷
+qbf 뷸
+qbfr 뷹
+qbfa 뷺
+qbfq 뷻
+qbft 뷼
+qbfx 뷽
+qbfv 뷾
+qbfg 뷿
+qba 븀
+qbq 븁
+qbqt 븂
+qbt 븃
+qbT 븄
+qbd 븅
+qbw 븆
+qbc 븇
+qbz 븈
+qbx 븉
+qbv 븊
+qbg 븋
+qmr 븍
+qmR 븎
+qmrt 븏
+qms 븐
+qmsw 븑
+qmsg 븒
+qme 븓
+qmf 블
+qmfr 븕
+qmfa 븖
+qmfq 븗
+qmft 븘
+qmfx 븙
+qmfv 븚
+qmfg 븛
+qma 븜
+qmq 븝
+qmqt 븞
+qmt 븟
+qmT 븠
+qmd 븡
+qmw 븢
+qmc 븣
+qmz 븤
+qmx 븥
+qmv 븦
+qmg 븧
+qmlr 븩
+qmlR 븪
+qmlrt 븫
+qmls 븬
+qmlsw 븭
+qmlsg 븮
+qmle 븯
+qmlf 븰
+qmlfr 븱
+qmlfa 븲
+qmlfq 븳
+qmlft 븴
+qmlfx 븵
+qmlfv 븶
+qmlfg 븷
+qmla 븸
+qmlq 븹
+qmlqt 븺
+qmlt 븻
+qmlT 븼
+qmld 븽
+qmlw 븾
+qmlc 븿
+qmlz 빀
+qmlx 빁
+qmlv 빂
+qmlg 빃
+qlr 빅
+qlR 빆
+qlrt 빇
+qls 빈
+qlsw 빉
+qlsg 빊
+qle 빋
+qlf 빌
+qlfr 빍
+qlfa 빎
+qlfq 빏
+qlft 빐
+qlfx 빑
+qlfv 빒
+qlfg 빓
+qla 빔
+qlq 빕
+qlqt 빖
+qlt 빗
+qlT 빘
+qld 빙
+qlw 빚
+qlc 빛
+qlz 빜
+qlx 빝
+qlv 빞
+qlg 빟
+Qkr 빡
+QkR 빢
+Qkrt 빣
+Qks 빤
+Qksw 빥
+Qksg 빦
+Qke 빧
+Qkf 빨
+Qkfr 빩
+Qkfa 빪
+Qkfq 빫
+Qkft 빬
+Qkfx 빭
+Qkfv 빮
+Qkfg 빯
+Qka 빰
+Qkq 빱
+Qkqt 빲
+Qkt 빳
+QkT 빴
+Qkd 빵
+Qkw 빶
+Qkc 빷
+Qkz 빸
+Qkx 빹
+Qkv 빺
+Qkg 빻
+Qor 빽
+QoR 빾
+Qort 빿
+Qos 뺀
+Qosw 뺁
+Qosg 뺂
+Qoe 뺃
+Qof 뺄
+Qofr 뺅
+Qofa 뺆
+Qofq 뺇
+Qoft 뺈
+Qofx 뺉
+Qofv 뺊
+Qofg 뺋
+Qoa 뺌
+Qoq 뺍
+Qoqt 뺎
+Qot 뺏
+QoT 뺐
+Qod 뺑
+Qow 뺒
+Qoc 뺓
+Qoz 뺔
+Qox 뺕
+Qov 뺖
+Qog 뺗
+Qir 뺙
+QiR 뺚
+Qirt 뺛
+Qis 뺜
+Qisw 뺝
+Qisg 뺞
+Qie 뺟
+Qif 뺠
+Qifr 뺡
+Qifa 뺢
+Qifq 뺣
+Qift 뺤
+Qifx 뺥
+Qifv 뺦
+Qifg 뺧
+Qia 뺨
+Qiq 뺩
+Qiqt 뺪
+Qit 뺫
+QiT 뺬
+Qid 뺭
+Qiw 뺮
+Qic 뺯
+Qiz 뺰
+Qix 뺱
+Qiv 뺲
+Qig 뺳
+QOr 뺵
+QOR 뺶
+QOrt 뺷
+QOs 뺸
+QOsw 뺹
+QOsg 뺺
+QOe 뺻
+QOf 뺼
+QOfr 뺽
+QOfa 뺾
+QOfq 뺿
+QOft 뻀
+QOfx 뻁
+QOfv 뻂
+QOfg 뻃
+QOa 뻄
+QOq 뻅
+QOqt 뻆
+QOt 뻇
+QOT 뻈
+QOd 뻉
+QOw 뻊
+QOc 뻋
+QOz 뻌
+QOx 뻍
+QOv 뻎
+QOg 뻏
+Qjr 뻑
+QjR 뻒
+Qjrt 뻓
+Qjs 뻔
+Qjsw 뻕
+Qjsg 뻖
+Qje 뻗
+Qjf 뻘
+Qjfr 뻙
+Qjfa 뻚
+Qjfq 뻛
+Qjft 뻜
+Qjfx 뻝
+Qjfv 뻞
+Qjfg 뻟
+Qja 뻠
+Qjq 뻡
+Qjqt 뻢
+Qjt 뻣
+QjT 뻤
+Qjd 뻥
+Qjw 뻦
+Qjc 뻧
+Qjz 뻨
+Qjx 뻩
+Qjv 뻪
+Qjg 뻫
+Qpr 뻭
+QpR 뻮
+Qprt 뻯
+Qps 뻰
+Qpsw 뻱
+Qpsg 뻲
+Qpe 뻳
+Qpf 뻴
+Qpfr 뻵
+Qpfa 뻶
+Qpfq 뻷
+Qpft 뻸
+Qpfx 뻹
+Qpfv 뻺
+Qpfg 뻻
+Qpa 뻼
+Qpq 뻽
+Qpqt 뻾
+Qpt 뻿
+QpT 뼀
+Qpd 뼁
+Qpw 뼂
+Qpc 뼃
+Qpz 뼄
+Qpx 뼅
+Qpv 뼆
+Qpg 뼇
+Qur 뼉
+QuR 뼊
+Qurt 뼋
+Qus 뼌
+Qusw 뼍
+Qusg 뼎
+Que 뼏
+Quf 뼐
+Qufr 뼑
+Qufa 뼒
+Qufq 뼓
+Quft 뼔
+Qufx 뼕
+Qufv 뼖
+Qufg 뼗
+Qua 뼘
+Quq 뼙
+Quqt 뼚
+Qut 뼛
+QuT 뼜
+Qud 뼝
+Quw 뼞
+Quc 뼟
+Quz 뼠
+Qux 뼡
+Quv 뼢
+Qug 뼣
+QPr 뼥
+QPR 뼦
+QPrt 뼧
+QPs 뼨
+QPsw 뼩
+QPsg 뼪
+QPe 뼫
+QPf 뼬
+QPfr 뼭
+QPfa 뼮
+QPfq 뼯
+QPft 뼰
+QPfx 뼱
+QPfv 뼲
+QPfg 뼳
+QPa 뼴
+QPq 뼵
+QPqt 뼶
+QPt 뼷
+QPT 뼸
+QPd 뼹
+QPw 뼺
+QPc 뼻
+QPz 뼼
+QPx 뼽
+QPv 뼾
+QPg 뼿
+Qhr 뽁
+QhR 뽂
+Qhrt 뽃
+Qhs 뽄
+Qhsw 뽅
+Qhsg 뽆
+Qhe 뽇
+Qhf 뽈
+Qhfr 뽉
+Qhfa 뽊
+Qhfq 뽋
+Qhft 뽌
+Qhfx 뽍
+Qhfv 뽎
+Qhfg 뽏
+Qha 뽐
+Qhq 뽑
+Qhqt 뽒
+Qht 뽓
+QhT 뽔
+Qhd 뽕
+Qhw 뽖
+Qhc 뽗
+Qhz 뽘
+Qhx 뽙
+Qhv 뽚
+Qhg 뽛
+Qhkr 뽝
+QhkR 뽞
+Qhkrt 뽟
+Qhks 뽠
+Qhksw 뽡
+Qhksg 뽢
+Qhke 뽣
+Qhkf 뽤
+Qhkfr 뽥
+Qhkfa 뽦
+Qhkfq 뽧
+Qhkft 뽨
+Qhkfx 뽩
+Qhkfv 뽪
+Qhkfg 뽫
+Qhka 뽬
+Qhkq 뽭
+Qhkqt 뽮
+Qhkt 뽯
+QhkT 뽰
+Qhkd 뽱
+Qhkw 뽲
+Qhkc 뽳
+Qhkz 뽴
+Qhkx 뽵
+Qhkv 뽶
+Qhkg 뽷
+Qhor 뽹
+QhoR 뽺
+Qhort 뽻
+Qhos 뽼
+Qhosw 뽽
+Qhosg 뽾
+Qhoe 뽿
+Qhof 뾀
+Qhofr 뾁
+Qhofa 뾂
+Qhofq 뾃
+Qhoft 뾄
+Qhofx 뾅
+Qhofv 뾆
+Qhofg 뾇
+Qhoa 뾈
+Qhoq 뾉
+Qhoqt 뾊
+Qhot 뾋
+QhoT 뾌
+Qhod 뾍
+Qhow 뾎
+Qhoc 뾏
+Qhoz 뾐
+Qhox 뾑
+Qhov 뾒
+Qhog 뾓
+Qhlr 뾕
+QhlR 뾖
+Qhlrt 뾗
+Qhls 뾘
+Qhlsw 뾙
+Qhlsg 뾚
+Qhle 뾛
+Qhlf 뾜
+Qhlfr 뾝
+Qhlfa 뾞
+Qhlfq 뾟
+Qhlft 뾠
+Qhlfx 뾡
+Qhlfv 뾢
+Qhlfg 뾣
+Qhla 뾤
+Qhlq 뾥
+Qhlqt 뾦
+Qhlt 뾧
+QhlT 뾨
+Qhld 뾩
+Qhlw 뾪
+Qhlc 뾫
+Qhlz 뾬
+Qhlx 뾭
+Qhlv 뾮
+Qhlg 뾯
+Qyr 뾱
+QyR 뾲
+Qyrt 뾳
+Qys 뾴
+Qysw 뾵
+Qysg 뾶
+Qye 뾷
+Qyf 뾸
+Qyfr 뾹
+Qyfa 뾺
+Qyfq 뾻
+Qyft 뾼
+Qyfx 뾽
+Qyfv 뾾
+Qyfg 뾿
+Qya 뿀
+Qyq 뿁
+Qyqt 뿂
+Qyt 뿃
+QyT 뿄
+Qyd 뿅
+Qyw 뿆
+Qyc 뿇
+Qyz 뿈
+Qyx 뿉
+Qyv 뿊
+Qyg 뿋
+Qnr 뿍
+QnR 뿎
+Qnrt 뿏
+Qns 뿐
+Qnsw 뿑
+Qnsg 뿒
+Qne 뿓
+Qnf 뿔
+Qnfr 뿕
+Qnfa 뿖
+Qnfq 뿗
+Qnft 뿘
+Qnfx 뿙
+Qnfv 뿚
+Qnfg 뿛
+Qna 뿜
+Qnq 뿝
+Qnqt 뿞
+Qnt 뿟
+QnT 뿠
+Qnd 뿡
+Qnw 뿢
+Qnc 뿣
+Qnz 뿤
+Qnx 뿥
+Qnv 뿦
+Qng 뿧
+Qnjr 뿩
+QnjR 뿪
+Qnjrt 뿫
+Qnjs 뿬
+Qnjsw 뿭
+Qnjsg 뿮
+Qnje 뿯
+Qnjf 뿰
+Qnjfr 뿱
+Qnjfa 뿲
+Qnjfq 뿳
+Qnjft 뿴
+Qnjfx 뿵
+Qnjfv 뿶
+Qnjfg 뿷
+Qnja 뿸
+Qnjq 뿹
+Qnjqt 뿺
+Qnjt 뿻
+QnjT 뿼
+Qnjd 뿽
+Qnjw 뿾
+Qnjc 뿿
+Qnjz 쀀
+Qnjx 쀁
+Qnjv 쀂
+Qnjg 쀃
+Qnpr 쀅
+QnpR 쀆
+Qnprt 쀇
+Qnps 쀈
+Qnpsw 쀉
+Qnpsg 쀊
+Qnpe 쀋
+Qnpf 쀌
+Qnpfr 쀍
+Qnpfa 쀎
+Qnpfq 쀏
+Qnpft 쀐
+Qnpfx 쀑
+Qnpfv 쀒
+Qnpfg 쀓
+Qnpa 쀔
+Qnpq 쀕
+Qnpqt 쀖
+Qnpt 쀗
+QnpT 쀘
+Qnpd 쀙
+Qnpw 쀚
+Qnpc 쀛
+Qnpz 쀜
+Qnpx 쀝
+Qnpv 쀞
+Qnpg 쀟
+Qnlr 쀡
+QnlR 쀢
+Qnlrt 쀣
+Qnls 쀤
+Qnlsw 쀥
+Qnlsg 쀦
+Qnle 쀧
+Qnlf 쀨
+Qnlfr 쀩
+Qnlfa 쀪
+Qnlfq 쀫
+Qnlft 쀬
+Qnlfx 쀭
+Qnlfv 쀮
+Qnlfg 쀯
+Qnla 쀰
+Qnlq 쀱
+Qnlqt 쀲
+Qnlt 쀳
+QnlT 쀴
+Qnld 쀵
+Qnlw 쀶
+Qnlc 쀷
+Qnlz 쀸
+Qnlx 쀹
+Qnlv 쀺
+Qnlg 쀻
+Qbr 쀽
+QbR 쀾
+Qbrt 쀿
+Qbs 쁀
+Qbsw 쁁
+Qbsg 쁂
+Qbe 쁃
+Qbf 쁄
+Qbfr 쁅
+Qbfa 쁆
+Qbfq 쁇
+Qbft 쁈
+Qbfx 쁉
+Qbfv 쁊
+Qbfg 쁋
+Qba 쁌
+Qbq 쁍
+Qbqt 쁎
+Qbt 쁏
+QbT 쁐
+Qbd 쁑
+Qbw 쁒
+Qbc 쁓
+Qbz 쁔
+Qbx 쁕
+Qbv 쁖
+Qbg 쁗
+Qmr 쁙
+QmR 쁚
+Qmrt 쁛
+Qms 쁜
+Qmsw 쁝
+Qmsg 쁞
+Qme 쁟
+Qmf 쁠
+Qmfr 쁡
+Qmfa 쁢
+Qmfq 쁣
+Qmft 쁤
+Qmfx 쁥
+Qmfv 쁦
+Qmfg 쁧
+Qma 쁨
+Qmq 쁩
+Qmqt 쁪
+Qmt 쁫
+QmT 쁬
+Qmd 쁭
+Qmw 쁮
+Qmc 쁯
+Qmz 쁰
+Qmx 쁱
+Qmv 쁲
+Qmg 쁳
+Qmlr 쁵
+QmlR 쁶
+Qmlrt 쁷
+Qmls 쁸
+Qmlsw 쁹
+Qmlsg 쁺
+Qmle 쁻
+Qmlf 쁼
+Qmlfr 쁽
+Qmlfa 쁾
+Qmlfq 쁿
+Qmlft 삀
+Qmlfx 삁
+Qmlfv 삂
+Qmlfg 삃
+Qmla 삄
+Qmlq 삅
+Qmlqt 삆
+Qmlt 삇
+QmlT 삈
+Qmld 삉
+Qmlw 삊
+Qmlc 삋
+Qmlz 삌
+Qmlx 삍
+Qmlv 삎
+Qmlg 삏
+Qlr 삑
+QlR 삒
+Qlrt 삓
+Qls 삔
+Qlsw 삕
+Qlsg 삖
+Qle 삗
+Qlf 삘
+Qlfr 삙
+Qlfa 삚
+Qlfq 삛
+Qlft 삜
+Qlfx 삝
+Qlfv 삞
+Qlfg 삟
+Qla 삠
+Qlq 삡
+Qlqt 삢
+Qlt 삣
+QlT 삤
+Qld 삥
+Qlw 삦
+Qlc 삧
+Qlz 삨
+Qlx 삩
+Qlv 삪
+Qlg 삫
+tkr 삭
+tkR 삮
+tkrt 삯
+tks 산
+tksw 삱
+tksg 삲
+tke 삳
+tkf 살
+tkfr 삵
+tkfa 삶
+tkfq 삷
+tkft 삸
+tkfx 삹
+tkfv 삺
+tkfg 삻
+tka 삼
+tkq 삽
+tkqt 삾
+tkt 삿
+tkT 샀
+tkd 상
+tkw 샂
+tkc 샃
+tkz 샄
+tkx 샅
+tkv 샆
+tkg 샇
+tor 색
+toR 샊
+tort 샋
+tos 샌
+tosw 샍
+tosg 샎
+toe 샏
+tof 샐
+tofr 샑
+tofa 샒
+tofq 샓
+toft 샔
+tofx 샕
+tofv 샖
+tofg 샗
+toa 샘
+toq 샙
+toqt 샚
+tot 샛
+toT 샜
+tod 생
+tow 샞
+toc 샟
+toz 샠
+tox 샡
+tov 샢
+tog 샣
+tir 샥
+tiR 샦
+tirt 샧
+tis 샨
+tisw 샩
+tisg 샪
+tie 샫
+tif 샬
+tifr 샭
+tifa 샮
+tifq 샯
+tift 샰
+tifx 샱
+tifv 샲
+tifg 샳
+tia 샴
+tiq 샵
+tiqt 샶
+tit 샷
+tiT 샸
+tid 샹
+tiw 샺
+tic 샻
+tiz 샼
+tix 샽
+tiv 샾
+tig 샿
+tOr 섁
+tOR 섂
+tOrt 섃
+tOs 섄
+tOsw 섅
+tOsg 섆
+tOe 섇
+tOf 섈
+tOfr 섉
+tOfa 섊
+tOfq 섋
+tOft 섌
+tOfx 섍
+tOfv 섎
+tOfg 섏
+tOa 섐
+tOq 섑
+tOqt 섒
+tOt 섓
+tOT 섔
+tOd 섕
+tOw 섖
+tOc 섗
+tOz 섘
+tOx 섙
+tOv 섚
+tOg 섛
+tjr 석
+tjR 섞
+tjrt 섟
+tjs 선
+tjsw 섡
+tjsg 섢
+tje 섣
+tjf 설
+tjfr 섥
+tjfa 섦
+tjfq 섧
+tjft 섨
+tjfx 섩
+tjfv 섪
+tjfg 섫
+tja 섬
+tjq 섭
+tjqt 섮
+tjt 섯
+tjT 섰
+tjd 성
+tjw 섲
+tjc 섳
+tjz 섴
+tjx 섵
+tjv 섶
+tjg 섷
+tpr 섹
+tpR 섺
+tprt 섻
+tps 센
+tpsw 섽
+tpsg 섾
+tpe 섿
+tpf 셀
+tpfr 셁
+tpfa 셂
+tpfq 셃
+tpft 셄
+tpfx 셅
+tpfv 셆
+tpfg 셇
+tpa 셈
+tpq 셉
+tpqt 셊
+tpt 셋
+tpT 셌
+tpd 셍
+tpw 셎
+tpc 셏
+tpz 셐
+tpx 셑
+tpv 셒
+tpg 셓
+tur 셕
+tuR 셖
+turt 셗
+tus 션
+tusw 셙
+tusg 셚
+tue 셛
+tuf 셜
+tufr 셝
+tufa 셞
+tufq 셟
+tuft 셠
+tufx 셡
+tufv 셢
+tufg 셣
+tua 셤
+tuq 셥
+tuqt 셦
+tut 셧
+tuT 셨
+tud 셩
+tuw 셪
+tuc 셫
+tuz 셬
+tux 셭
+tuv 셮
+tug 셯
+tPr 셱
+tPR 셲
+tPrt 셳
+tPs 셴
+tPsw 셵
+tPsg 셶
+tPe 셷
+tPf 셸
+tPfr 셹
+tPfa 셺
+tPfq 셻
+tPft 셼
+tPfx 셽
+tPfv 셾
+tPfg 셿
+tPa 솀
+tPq 솁
+tPqt 솂
+tPt 솃
+tPT 솄
+tPd 솅
+tPw 솆
+tPc 솇
+tPz 솈
+tPx 솉
+tPv 솊
+tPg 솋
+thr 속
+thR 솎
+thrt 솏
+ths 손
+thsw 솑
+thsg 솒
+the 솓
+thf 솔
+thfr 솕
+thfa 솖
+thfq 솗
+thft 솘
+thfx 솙
+thfv 솚
+thfg 솛
+tha 솜
+thq 솝
+thqt 솞
+tht 솟
+thT 솠
+thd 송
+thw 솢
+thc 솣
+thz 솤
+thx 솥
+thv 솦
+thg 솧
+thkr 솩
+thkR 솪
+thkrt 솫
+thks 솬
+thksw 솭
+thksg 솮
+thke 솯
+thkf 솰
+thkfr 솱
+thkfa 솲
+thkfq 솳
+thkft 솴
+thkfx 솵
+thkfv 솶
+thkfg 솷
+thka 솸
+thkq 솹
+thkqt 솺
+thkt 솻
+thkT 솼
+thkd 솽
+thkw 솾
+thkc 솿
+thkz 쇀
+thkx 쇁
+thkv 쇂
+thkg 쇃
+thor 쇅
+thoR 쇆
+thort 쇇
+thos 쇈
+thosw 쇉
+thosg 쇊
+thoe 쇋
+thof 쇌
+thofr 쇍
+thofa 쇎
+thofq 쇏
+thoft 쇐
+thofx 쇑
+thofv 쇒
+thofg 쇓
+thoa 쇔
+thoq 쇕
+thoqt 쇖
+thot 쇗
+thoT 쇘
+thod 쇙
+thow 쇚
+thoc 쇛
+thoz 쇜
+thox 쇝
+thov 쇞
+thog 쇟
+thlr 쇡
+thlR 쇢
+thlrt 쇣
+thls 쇤
+thlsw 쇥
+thlsg 쇦
+thle 쇧
+thlf 쇨
+thlfr 쇩
+thlfa 쇪
+thlfq 쇫
+thlft 쇬
+thlfx 쇭
+thlfv 쇮
+thlfg 쇯
+thla 쇰
+thlq 쇱
+thlqt 쇲
+thlt 쇳
+thlT 쇴
+thld 쇵
+thlw 쇶
+thlc 쇷
+thlz 쇸
+thlx 쇹
+thlv 쇺
+thlg 쇻
+tyr 쇽
+tyR 쇾
+tyrt 쇿
+tys 숀
+tysw 숁
+tysg 숂
+tye 숃
+tyf 숄
+tyfr 숅
+tyfa 숆
+tyfq 숇
+tyft 숈
+tyfx 숉
+tyfv 숊
+tyfg 숋
+tya 숌
+tyq 숍
+tyqt 숎
+tyt 숏
+tyT 숐
+tyd 숑
+tyw 숒
+tyc 숓
+tyz 숔
+tyx 숕
+tyv 숖
+tyg 숗
+tnr 숙
+tnR 숚
+tnrt 숛
+tns 순
+tnsw 숝
+tnsg 숞
+tne 숟
+tnf 술
+tnfr 숡
+tnfa 숢
+tnfq 숣
+tnft 숤
+tnfx 숥
+tnfv 숦
+tnfg 숧
+tna 숨
+tnq 숩
+tnqt 숪
+tnt 숫
+tnT 숬
+tnd 숭
+tnw 숮
+tnc 숯
+tnz 숰
+tnx 숱
+tnv 숲
+tng 숳
+tnjr 숵
+tnjR 숶
+tnjrt 숷
+tnjs 숸
+tnjsw 숹
+tnjsg 숺
+tnje 숻
+tnjf 숼
+tnjfr 숽
+tnjfa 숾
+tnjfq 숿
+tnjft 쉀
+tnjfx 쉁
+tnjfv 쉂
+tnjfg 쉃
+tnja 쉄
+tnjq 쉅
+tnjqt 쉆
+tnjt 쉇
+tnjT 쉈
+tnjd 쉉
+tnjw 쉊
+tnjc 쉋
+tnjz 쉌
+tnjx 쉍
+tnjv 쉎
+tnjg 쉏
+tnpr 쉑
+tnpR 쉒
+tnprt 쉓
+tnps 쉔
+tnpsw 쉕
+tnpsg 쉖
+tnpe 쉗
+tnpf 쉘
+tnpfr 쉙
+tnpfa 쉚
+tnpfq 쉛
+tnpft 쉜
+tnpfx 쉝
+tnpfv 쉞
+tnpfg 쉟
+tnpa 쉠
+tnpq 쉡
+tnpqt 쉢
+tnpt 쉣
+tnpT 쉤
+tnpd 쉥
+tnpw 쉦
+tnpc 쉧
+tnpz 쉨
+tnpx 쉩
+tnpv 쉪
+tnpg 쉫
+tnlr 쉭
+tnlR 쉮
+tnlrt 쉯
+tnls 쉰
+tnlsw 쉱
+tnlsg 쉲
+tnle 쉳
+tnlf 쉴
+tnlfr 쉵
+tnlfa 쉶
+tnlfq 쉷
+tnlft 쉸
+tnlfx 쉹
+tnlfv 쉺
+tnlfg 쉻
+tnla 쉼
+tnlq 쉽
+tnlqt 쉾
+tnlt 쉿
+tnlT 슀
+tnld 슁
+tnlw 슂
+tnlc 슃
+tnlz 슄
+tnlx 슅
+tnlv 슆
+tnlg 슇
+tbr 슉
+tbR 슊
+tbrt 슋
+tbs 슌
+tbsw 슍
+tbsg 슎
+tbe 슏
+tbf 슐
+tbfr 슑
+tbfa 슒
+tbfq 슓
+tbft 슔
+tbfx 슕
+tbfv 슖
+tbfg 슗
+tba 슘
+tbq 슙
+tbqt 슚
+tbt 슛
+tbT 슜
+tbd 슝
+tbw 슞
+tbc 슟
+tbz 슠
+tbx 슡
+tbv 슢
+tbg 슣
+tmr 슥
+tmR 슦
+tmrt 슧
+tms 슨
+tmsw 슩
+tmsg 슪
+tme 슫
+tmf 슬
+tmfr 슭
+tmfa 슮
+tmfq 슯
+tmft 슰
+tmfx 슱
+tmfv 슲
+tmfg 슳
+tma 슴
+tmq 습
+tmqt 슶
+tmt 슷
+tmT 슸
+tmd 승
+tmw 슺
+tmc 슻
+tmz 슼
+tmx 슽
+tmv 슾
+tmg 슿
+tmlr 싁
+tmlR 싂
+tmlrt 싃
+tmls 싄
+tmlsw 싅
+tmlsg 싆
+tmle 싇
+tmlf 싈
+tmlfr 싉
+tmlfa 싊
+tmlfq 싋
+tmlft 싌
+tmlfx 싍
+tmlfv 싎
+tmlfg 싏
+tmla 싐
+tmlq 싑
+tmlqt 싒
+tmlt 싓
+tmlT 싔
+tmld 싕
+tmlw 싖
+tmlc 싗
+tmlz 싘
+tmlx 싙
+tmlv 싚
+tmlg 싛
+tlr 식
+tlR 싞
+tlrt 싟
+tls 신
+tlsw 싡
+tlsg 싢
+tle 싣
+tlf 실
+tlfr 싥
+tlfa 싦
+tlfq 싧
+tlft 싨
+tlfx 싩
+tlfv 싪
+tlfg 싫
+tla 심
+tlq 십
+tlqt 싮
+tlt 싯
+tlT 싰
+tld 싱
+tlw 싲
+tlc 싳
+tlz 싴
+tlx 싵
+tlv 싶
+tlg 싷
+Tkr 싹
+TkR 싺
+Tkrt 싻
+Tks 싼
+Tksw 싽
+Tksg 싾
+Tke 싿
+Tkf 쌀
+Tkfr 쌁
+Tkfa 쌂
+Tkfq 쌃
+Tkft 쌄
+Tkfx 쌅
+Tkfv 쌆
+Tkfg 쌇
+Tka 쌈
+Tkq 쌉
+Tkqt 쌊
+Tkt 쌋
+TkT 쌌
+Tkd 쌍
+Tkw 쌎
+Tkc 쌏
+Tkz 쌐
+Tkx 쌑
+Tkv 쌒
+Tkg 쌓
+Tor 쌕
+ToR 쌖
+Tort 쌗
+Tos 쌘
+Tosw 쌙
+Tosg 쌚
+Toe 쌛
+Tof 쌜
+Tofr 쌝
+Tofa 쌞
+Tofq 쌟
+Toft 쌠
+Tofx 쌡
+Tofv 쌢
+Tofg 쌣
+Toa 쌤
+Toq 쌥
+Toqt 쌦
+Tot 쌧
+ToT 쌨
+Tod 쌩
+Tow 쌪
+Toc 쌫
+Toz 쌬
+Tox 쌭
+Tov 쌮
+Tog 쌯
+Tir 쌱
+TiR 쌲
+Tirt 쌳
+Tis 쌴
+Tisw 쌵
+Tisg 쌶
+Tie 쌷
+Tif 쌸
+Tifr 쌹
+Tifa 쌺
+Tifq 쌻
+Tift 쌼
+Tifx 쌽
+Tifv 쌾
+Tifg 쌿
+Tia 썀
+Tiq 썁
+Tiqt 썂
+Tit 썃
+TiT 썄
+Tid 썅
+Tiw 썆
+Tic 썇
+Tiz 썈
+Tix 썉
+Tiv 썊
+Tig 썋
+TOr 썍
+TOR 썎
+TOrt 썏
+TOs 썐
+TOsw 썑
+TOsg 썒
+TOe 썓
+TOf 썔
+TOfr 썕
+TOfa 썖
+TOfq 썗
+TOft 썘
+TOfx 썙
+TOfv 썚
+TOfg 썛
+TOa 썜
+TOq 썝
+TOqt 썞
+TOt 썟
+TOT 썠
+TOd 썡
+TOw 썢
+TOc 썣
+TOz 썤
+TOx 썥
+TOv 썦
+TOg 썧
+Tjr 썩
+TjR 썪
+Tjrt 썫
+Tjs 썬
+Tjsw 썭
+Tjsg 썮
+Tje 썯
+Tjf 썰
+Tjfr 썱
+Tjfa 썲
+Tjfq 썳
+Tjft 썴
+Tjfx 썵
+Tjfv 썶
+Tjfg 썷
+Tja 썸
+Tjq 썹
+Tjqt 썺
+Tjt 썻
+TjT 썼
+Tjd 썽
+Tjw 썾
+Tjc 썿
+Tjz 쎀
+Tjx 쎁
+Tjv 쎂
+Tjg 쎃
+Tpr 쎅
+TpR 쎆
+Tprt 쎇
+Tps 쎈
+Tpsw 쎉
+Tpsg 쎊
+Tpe 쎋
+Tpf 쎌
+Tpfr 쎍
+Tpfa 쎎
+Tpfq 쎏
+Tpft 쎐
+Tpfx 쎑
+Tpfv 쎒
+Tpfg 쎓
+Tpa 쎔
+Tpq 쎕
+Tpqt 쎖
+Tpt 쎗
+TpT 쎘
+Tpd 쎙
+Tpw 쎚
+Tpc 쎛
+Tpz 쎜
+Tpx 쎝
+Tpv 쎞
+Tpg 쎟
+Tur 쎡
+TuR 쎢
+Turt 쎣
+Tus 쎤
+Tusw 쎥
+Tusg 쎦
+Tue 쎧
+Tuf 쎨
+Tufr 쎩
+Tufa 쎪
+Tufq 쎫
+Tuft 쎬
+Tufx 쎭
+Tufv 쎮
+Tufg 쎯
+Tua 쎰
+Tuq 쎱
+Tuqt 쎲
+Tut 쎳
+TuT 쎴
+Tud 쎵
+Tuw 쎶
+Tuc 쎷
+Tuz 쎸
+Tux 쎹
+Tuv 쎺
+Tug 쎻
+TPr 쎽
+TPR 쎾
+TPrt 쎿
+TPs 쏀
+TPsw 쏁
+TPsg 쏂
+TPe 쏃
+TPf 쏄
+TPfr 쏅
+TPfa 쏆
+TPfq 쏇
+TPft 쏈
+TPfx 쏉
+TPfv 쏊
+TPfg 쏋
+TPa 쏌
+TPq 쏍
+TPqt 쏎
+TPt 쏏
+TPT 쏐
+TPd 쏑
+TPw 쏒
+TPc 쏓
+TPz 쏔
+TPx 쏕
+TPv 쏖
+TPg 쏗
+Thr 쏙
+ThR 쏚
+Thrt 쏛
+Ths 쏜
+Thsw 쏝
+Thsg 쏞
+The 쏟
+Thf 쏠
+Thfr 쏡
+Thfa 쏢
+Thfq 쏣
+Thft 쏤
+Thfx 쏥
+Thfv 쏦
+Thfg 쏧
+Tha 쏨
+Thq 쏩
+Thqt 쏪
+Tht 쏫
+ThT 쏬
+Thd 쏭
+Thw 쏮
+Thc 쏯
+Thz 쏰
+Thx 쏱
+Thv 쏲
+Thg 쏳
+Thkr 쏵
+ThkR 쏶
+Thkrt 쏷
+Thks 쏸
+Thksw 쏹
+Thksg 쏺
+Thke 쏻
+Thkf 쏼
+Thkfr 쏽
+Thkfa 쏾
+Thkfq 쏿
+Thkft 쐀
+Thkfx 쐁
+Thkfv 쐂
+Thkfg 쐃
+Thka 쐄
+Thkq 쐅
+Thkqt 쐆
+Thkt 쐇
+ThkT 쐈
+Thkd 쐉
+Thkw 쐊
+Thkc 쐋
+Thkz 쐌
+Thkx 쐍
+Thkv 쐎
+Thkg 쐏
+Thor 쐑
+ThoR 쐒
+Thort 쐓
+Thos 쐔
+Thosw 쐕
+Thosg 쐖
+Thoe 쐗
+Thof 쐘
+Thofr 쐙
+Thofa 쐚
+Thofq 쐛
+Thoft 쐜
+Thofx 쐝
+Thofv 쐞
+Thofg 쐟
+Thoa 쐠
+Thoq 쐡
+Thoqt 쐢
+Thot 쐣
+ThoT 쐤
+Thod 쐥
+Thow 쐦
+Thoc 쐧
+Thoz 쐨
+Thox 쐩
+Thov 쐪
+Thog 쐫
+Thlr 쐭
+ThlR 쐮
+Thlrt 쐯
+Thls 쐰
+Thlsw 쐱
+Thlsg 쐲
+Thle 쐳
+Thlf 쐴
+Thlfr 쐵
+Thlfa 쐶
+Thlfq 쐷
+Thlft 쐸
+Thlfx 쐹
+Thlfv 쐺
+Thlfg 쐻
+Thla 쐼
+Thlq 쐽
+Thlqt 쐾
+Thlt 쐿
+ThlT 쑀
+Thld 쑁
+Thlw 쑂
+Thlc 쑃
+Thlz 쑄
+Thlx 쑅
+Thlv 쑆
+Thlg 쑇
+Tyr 쑉
+TyR 쑊
+Tyrt 쑋
+Tys 쑌
+Tysw 쑍
+Tysg 쑎
+Tye 쑏
+Tyf 쑐
+Tyfr 쑑
+Tyfa 쑒
+Tyfq 쑓
+Tyft 쑔
+Tyfx 쑕
+Tyfv 쑖
+Tyfg 쑗
+Tya 쑘
+Tyq 쑙
+Tyqt 쑚
+Tyt 쑛
+TyT 쑜
+Tyd 쑝
+Tyw 쑞
+Tyc 쑟
+Tyz 쑠
+Tyx 쑡
+Tyv 쑢
+Tyg 쑣
+Tnr 쑥
+TnR 쑦
+Tnrt 쑧
+Tns 쑨
+Tnsw 쑩
+Tnsg 쑪
+Tne 쑫
+Tnf 쑬
+Tnfr 쑭
+Tnfa 쑮
+Tnfq 쑯
+Tnft 쑰
+Tnfx 쑱
+Tnfv 쑲
+Tnfg 쑳
+Tna 쑴
+Tnq 쑵
+Tnqt 쑶
+Tnt 쑷
+TnT 쑸
+Tnd 쑹
+Tnw 쑺
+Tnc 쑻
+Tnz 쑼
+Tnx 쑽
+Tnv 쑾
+Tng 쑿
+Tnjr 쒁
+TnjR 쒂
+Tnjrt 쒃
+Tnjs 쒄
+Tnjsw 쒅
+Tnjsg 쒆
+Tnje 쒇
+Tnjf 쒈
+Tnjfr 쒉
+Tnjfa 쒊
+Tnjfq 쒋
+Tnjft 쒌
+Tnjfx 쒍
+Tnjfv 쒎
+Tnjfg 쒏
+Tnja 쒐
+Tnjq 쒑
+Tnjqt 쒒
+Tnjt 쒓
+TnjT 쒔
+Tnjd 쒕
+Tnjw 쒖
+Tnjc 쒗
+Tnjz 쒘
+Tnjx 쒙
+Tnjv 쒚
+Tnjg 쒛
+Tnpr 쒝
+TnpR 쒞
+Tnprt 쒟
+Tnps 쒠
+Tnpsw 쒡
+Tnpsg 쒢
+Tnpe 쒣
+Tnpf 쒤
+Tnpfr 쒥
+Tnpfa 쒦
+Tnpfq 쒧
+Tnpft 쒨
+Tnpfx 쒩
+Tnpfv 쒪
+Tnpfg 쒫
+Tnpa 쒬
+Tnpq 쒭
+Tnpqt 쒮
+Tnpt 쒯
+TnpT 쒰
+Tnpd 쒱
+Tnpw 쒲
+Tnpc 쒳
+Tnpz 쒴
+Tnpx 쒵
+Tnpv 쒶
+Tnpg 쒷
+Tnlr 쒹
+TnlR 쒺
+Tnlrt 쒻
+Tnls 쒼
+Tnlsw 쒽
+Tnlsg 쒾
+Tnle 쒿
+Tnlf 쓀
+Tnlfr 쓁
+Tnlfa 쓂
+Tnlfq 쓃
+Tnlft 쓄
+Tnlfx 쓅
+Tnlfv 쓆
+Tnlfg 쓇
+Tnla 쓈
+Tnlq 쓉
+Tnlqt 쓊
+Tnlt 쓋
+TnlT 쓌
+Tnld 쓍
+Tnlw 쓎
+Tnlc 쓏
+Tnlz 쓐
+Tnlx 쓑
+Tnlv 쓒
+Tnlg 쓓
+Tbr 쓕
+TbR 쓖
+Tbrt 쓗
+Tbs 쓘
+Tbsw 쓙
+Tbsg 쓚
+Tbe 쓛
+Tbf 쓜
+Tbfr 쓝
+Tbfa 쓞
+Tbfq 쓟
+Tbft 쓠
+Tbfx 쓡
+Tbfv 쓢
+Tbfg 쓣
+Tba 쓤
+Tbq 쓥
+Tbqt 쓦
+Tbt 쓧
+TbT 쓨
+Tbd 쓩
+Tbw 쓪
+Tbc 쓫
+Tbz 쓬
+Tbx 쓭
+Tbv 쓮
+Tbg 쓯
+Tmr 쓱
+TmR 쓲
+Tmrt 쓳
+Tms 쓴
+Tmsw 쓵
+Tmsg 쓶
+Tme 쓷
+Tmf 쓸
+Tmfr 쓹
+Tmfa 쓺
+Tmfq 쓻
+Tmft 쓼
+Tmfx 쓽
+Tmfv 쓾
+Tmfg 쓿
+Tma 씀
+Tmq 씁
+Tmqt 씂
+Tmt 씃
+TmT 씄
+Tmd 씅
+Tmw 씆
+Tmc 씇
+Tmz 씈
+Tmx 씉
+Tmv 씊
+Tmg 씋
+Tmlr 씍
+TmlR 씎
+Tmlrt 씏
+Tmls 씐
+Tmlsw 씑
+Tmlsg 씒
+Tmle 씓
+Tmlf 씔
+Tmlfr 씕
+Tmlfa 씖
+Tmlfq 씗
+Tmlft 씘
+Tmlfx 씙
+Tmlfv 씚
+Tmlfg 씛
+Tmla 씜
+Tmlq 씝
+Tmlqt 씞
+Tmlt 씟
+TmlT 씠
+Tmld 씡
+Tmlw 씢
+Tmlc 씣
+Tmlz 씤
+Tmlx 씥
+Tmlv 씦
+Tmlg 씧
+Tlr 씩
+TlR 씪
+Tlrt 씫
+Tls 씬
+Tlsw 씭
+Tlsg 씮
+Tle 씯
+Tlf 씰
+Tlfr 씱
+Tlfa 씲
+Tlfq 씳
+Tlft 씴
+Tlfx 씵
+Tlfv 씶
+Tlfg 씷
+Tla 씸
+Tlq 씹
+Tlqt 씺
+Tlt 씻
+TlT 씼
+Tld 씽
+Tlw 씾
+Tlc 씿
+Tlz 앀
+Tlx 앁
+Tlv 앂
+Tlg 앃
+dkr 악
+dkR 앆
+dkrt 앇
+dks 안
+dksw 앉
+dksg 않
+dke 앋
+dkf 알
+dkfr 앍
+dkfa 앎
+dkfq 앏
+dkft 앐
+dkfx 앑
+dkfv 앒
+dkfg 앓
+dka 암
+dkq 압
+dkqt 앖
+dkt 앗
+dkT 았
+dkd 앙
+dkw 앚
+dkc 앛
+dkz 앜
+dkx 앝
+dkv 앞
+dkg 앟
+dor 액
+doR 앢
+dort 앣
+dos 앤
+dosw 앥
+dosg 앦
+doe 앧
+dof 앨
+dofr 앩
+dofa 앪
+dofq 앫
+doft 앬
+dofx 앭
+dofv 앮
+dofg 앯
+doa 앰
+doq 앱
+doqt 앲
+dot 앳
+doT 앴
+dod 앵
+dow 앶
+doc 앷
+doz 앸
+dox 앹
+dov 앺
+dog 앻
+dir 약
+diR 앾
+dirt 앿
+dis 얀
+disw 얁
+disg 얂
+die 얃
+dif 얄
+difr 얅
+difa 얆
+difq 얇
+dift 얈
+difx 얉
+difv 얊
+difg 얋
+dia 얌
+diq 얍
+diqt 얎
+dit 얏
+diT 얐
+did 양
+diw 얒
+dic 얓
+diz 얔
+dix 얕
+div 얖
+dig 얗
+dOr 얙
+dOR 얚
+dOrt 얛
+dOs 얜
+dOsw 얝
+dOsg 얞
+dOe 얟
+dOf 얠
+dOfr 얡
+dOfa 얢
+dOfq 얣
+dOft 얤
+dOfx 얥
+dOfv 얦
+dOfg 얧
+dOa 얨
+dOq 얩
+dOqt 얪
+dOt 얫
+dOT 얬
+dOd 얭
+dOw 얮
+dOc 얯
+dOz 얰
+dOx 얱
+dOv 얲
+dOg 얳
+djr 억
+djR 얶
+djrt 얷
+djs 언
+djsw 얹
+djsg 얺
+dje 얻
+djf 얼
+djfr 얽
+djfa 얾
+djfq 얿
+djft 엀
+djfx 엁
+djfv 엂
+djfg 엃
+dja 엄
+djq 업
+djqt 없
+djt 엇
+djT 었
+djd 엉
+djw 엊
+djc 엋
+djz 엌
+djx 엍
+djv 엎
+djg 엏
+dpr 엑
+dpR 엒
+dprt 엓
+dps 엔
+dpsw 엕
+dpsg 엖
+dpe 엗
+dpf 엘
+dpfr 엙
+dpfa 엚
+dpfq 엛
+dpft 엜
+dpfx 엝
+dpfv 엞
+dpfg 엟
+dpa 엠
+dpq 엡
+dpqt 엢
+dpt 엣
+dpT 엤
+dpd 엥
+dpw 엦
+dpc 엧
+dpz 엨
+dpx 엩
+dpv 엪
+dpg 엫
+dur 역
+duR 엮
+durt 엯
+dus 연
+dusw 엱
+dusg 엲
+due 엳
+duf 열
+dufr 엵
+dufa 엶
+dufq 엷
+duft 엸
+dufx 엹
+dufv 엺
+dufg 엻
+dua 염
+duq 엽
+duqt 엾
+dut 엿
+duT 였
+dud 영
+duw 옂
+duc 옃
+duz 옄
+dux 옅
+duv 옆
+dug 옇
+dPr 옉
+dPR 옊
+dPrt 옋
+dPs 옌
+dPsw 옍
+dPsg 옎
+dPe 옏
+dPf 옐
+dPfr 옑
+dPfa 옒
+dPfq 옓
+dPft 옔
+dPfx 옕
+dPfv 옖
+dPfg 옗
+dPa 옘
+dPq 옙
+dPqt 옚
+dPt 옛
+dPT 옜
+dPd 옝
+dPw 옞
+dPc 옟
+dPz 옠
+dPx 옡
+dPv 옢
+dPg 옣
+dhr 옥
+dhR 옦
+dhrt 옧
+dhs 온
+dhsw 옩
+dhsg 옪
+dhe 옫
+dhf 올
+dhfr 옭
+dhfa 옮
+dhfq 옯
+dhft 옰
+dhfx 옱
+dhfv 옲
+dhfg 옳
+dha 옴
+dhq 옵
+dhqt 옶
+dht 옷
+dhT 옸
+dhd 옹
+dhw 옺
+dhc 옻
+dhz 옼
+dhx 옽
+dhv 옾
+dhg 옿
+dhkr 왁
+dhkR 왂
+dhkrt 왃
+dhks 완
+dhksw 왅
+dhksg 왆
+dhke 왇
+dhkf 왈
+dhkfr 왉
+dhkfa 왊
+dhkfq 왋
+dhkft 왌
+dhkfx 왍
+dhkfv 왎
+dhkfg 왏
+dhka 왐
+dhkq 왑
+dhkqt 왒
+dhkt 왓
+dhkT 왔
+dhkd 왕
+dhkw 왖
+dhkc 왗
+dhkz 왘
+dhkx 왙
+dhkv 왚
+dhkg 왛
+dhor 왝
+dhoR 왞
+dhort 왟
+dhos 왠
+dhosw 왡
+dhosg 왢
+dhoe 왣
+dhof 왤
+dhofr 왥
+dhofa 왦
+dhofq 왧
+dhoft 왨
+dhofx 왩
+dhofv 왪
+dhofg 왫
+dhoa 왬
+dhoq 왭
+dhoqt 왮
+dhot 왯
+dhoT 왰
+dhod 왱
+dhow 왲
+dhoc 왳
+dhoz 왴
+dhox 왵
+dhov 왶
+dhog 왷
+dhlr 왹
+dhlR 왺
+dhlrt 왻
+dhls 왼
+dhlsw 왽
+dhlsg 왾
+dhle 왿
+dhlf 욀
+dhlfr 욁
+dhlfa 욂
+dhlfq 욃
+dhlft 욄
+dhlfx 욅
+dhlfv 욆
+dhlfg 욇
+dhla 욈
+dhlq 욉
+dhlqt 욊
+dhlt 욋
+dhlT 욌
+dhld 욍
+dhlw 욎
+dhlc 욏
+dhlz 욐
+dhlx 욑
+dhlv 욒
+dhlg 욓
+dyr 욕
+dyR 욖
+dyrt 욗
+dys 욘
+dysw 욙
+dysg 욚
+dye 욛
+dyf 욜
+dyfr 욝
+dyfa 욞
+dyfq 욟
+dyft 욠
+dyfx 욡
+dyfv 욢
+dyfg 욣
+dya 욤
+dyq 욥
+dyqt 욦
+dyt 욧
+dyT 욨
+dyd 용
+dyw 욪
+dyc 욫
+dyz 욬
+dyx 욭
+dyv 욮
+dyg 욯
+dnr 욱
+dnR 욲
+dnrt 욳
+dns 운
+dnsw 욵
+dnsg 욶
+dne 욷
+dnf 울
+dnfr 욹
+dnfa 욺
+dnfq 욻
+dnft 욼
+dnfx 욽
+dnfv 욾
+dnfg 욿
+dna 움
+dnq 웁
+dnqt 웂
+dnt 웃
+dnT 웄
+dnd 웅
+dnw 웆
+dnc 웇
+dnz 웈
+dnx 웉
+dnv 웊
+dng 웋
+dnjr 웍
+dnjR 웎
+dnjrt 웏
+dnjs 원
+dnjsw 웑
+dnjsg 웒
+dnje 웓
+dnjf 월
+dnjfr 웕
+dnjfa 웖
+dnjfq 웗
+dnjft 웘
+dnjfx 웙
+dnjfv 웚
+dnjfg 웛
+dnja 웜
+dnjq 웝
+dnjqt 웞
+dnjt 웟
+dnjT 웠
+dnjd 웡
+dnjw 웢
+dnjc 웣
+dnjz 웤
+dnjx 웥
+dnjv 웦
+dnjg 웧
+dnpr 웩
+dnpR 웪
+dnprt 웫
+dnps 웬
+dnpsw 웭
+dnpsg 웮
+dnpe 웯
+dnpf 웰
+dnpfr 웱
+dnpfa 웲
+dnpfq 웳
+dnpft 웴
+dnpfx 웵
+dnpfv 웶
+dnpfg 웷
+dnpa 웸
+dnpq 웹
+dnpqt 웺
+dnpt 웻
+dnpT 웼
+dnpd 웽
+dnpw 웾
+dnpc 웿
+dnpz 윀
+dnpx 윁
+dnpv 윂
+dnpg 윃
+dnlr 윅
+dnlR 윆
+dnlrt 윇
+dnls 윈
+dnlsw 윉
+dnlsg 윊
+dnle 윋
+dnlf 윌
+dnlfr 윍
+dnlfa 윎
+dnlfq 윏
+dnlft 윐
+dnlfx 윑
+dnlfv 윒
+dnlfg 윓
+dnla 윔
+dnlq 윕
+dnlqt 윖
+dnlt 윗
+dnlT 윘
+dnld 윙
+dnlw 윚
+dnlc 윛
+dnlz 윜
+dnlx 윝
+dnlv 윞
+dnlg 윟
+dbr 육
+dbR 윢
+dbrt 윣
+dbs 윤
+dbsw 윥
+dbsg 윦
+dbe 윧
+dbf 율
+dbfr 윩
+dbfa 윪
+dbfq 윫
+dbft 윬
+dbfx 윭
+dbfv 윮
+dbfg 윯
+dba 윰
+dbq 윱
+dbqt 윲
+dbt 윳
+dbT 윴
+dbd 융
+dbw 윶
+dbc 윷
+dbz 윸
+dbx 윹
+dbv 윺
+dbg 윻
+dmr 윽
+dmR 윾
+dmrt 윿
+dms 은
+dmsw 읁
+dmsg 읂
+dme 읃
+dmf 을
+dmfr 읅
+dmfa 읆
+dmfq 읇
+dmft 읈
+dmfx 읉
+dmfv 읊
+dmfg 읋
+dma 음
+dmq 읍
+dmqt 읎
+dmt 읏
+dmT 읐
+dmd 응
+dmw 읒
+dmc 읓
+dmz 읔
+dmx 읕
+dmv 읖
+dmg 읗
+dmlr 읙
+dmlR 읚
+dmlrt 읛
+dmls 읜
+dmlsw 읝
+dmlsg 읞
+dmle 읟
+dmlf 읠
+dmlfr 읡
+dmlfa 읢
+dmlfq 읣
+dmlft 읤
+dmlfx 읥
+dmlfv 읦
+dmlfg 읧
+dmla 읨
+dmlq 읩
+dmlqt 읪
+dmlt 읫
+dmlT 읬
+dmld 읭
+dmlw 읮
+dmlc 읯
+dmlz 읰
+dmlx 읱
+dmlv 읲
+dmlg 읳
+dlr 익
+dlR 읶
+dlrt 읷
+dls 인
+dlsw 읹
+dlsg 읺
+dle 읻
+dlf 일
+dlfr 읽
+dlfa 읾
+dlfq 읿
+dlft 잀
+dlfx 잁
+dlfv 잂
+dlfg 잃
+dla 임
+dlq 입
+dlqt 잆
+dlt 잇
+dlT 있
+dld 잉
+dlw 잊
+dlc 잋
+dlz 잌
+dlx 잍
+dlv 잎
+dlg 잏
+wkr 작
+wkR 잒
+wkrt 잓
+wks 잔
+wksw 잕
+wksg 잖
+wke 잗
+wkf 잘
+wkfr 잙
+wkfa 잚
+wkfq 잛
+wkft 잜
+wkfx 잝
+wkfv 잞
+wkfg 잟
+wka 잠
+wkq 잡
+wkqt 잢
+wkt 잣
+wkT 잤
+wkd 장
+wkw 잦
+wkc 잧
+wkz 잨
+wkx 잩
+wkv 잪
+wkg 잫
+wor 잭
+woR 잮
+wort 잯
+wos 잰
+wosw 잱
+wosg 잲
+woe 잳
+wof 잴
+wofr 잵
+wofa 잶
+wofq 잷
+woft 잸
+wofx 잹
+wofv 잺
+wofg 잻
+woa 잼
+woq 잽
+woqt 잾
+wot 잿
+woT 쟀
+wod 쟁
+wow 쟂
+woc 쟃
+woz 쟄
+wox 쟅
+wov 쟆
+wog 쟇
+wir 쟉
+wiR 쟊
+wirt 쟋
+wis 쟌
+wisw 쟍
+wisg 쟎
+wie 쟏
+wif 쟐
+wifr 쟑
+wifa 쟒
+wifq 쟓
+wift 쟔
+wifx 쟕
+wifv 쟖
+wifg 쟗
+wia 쟘
+wiq 쟙
+wiqt 쟚
+wit 쟛
+wiT 쟜
+wid 쟝
+wiw 쟞
+wic 쟟
+wiz 쟠
+wix 쟡
+wiv 쟢
+wig 쟣
+wOr 쟥
+wOR 쟦
+wOrt 쟧
+wOs 쟨
+wOsw 쟩
+wOsg 쟪
+wOe 쟫
+wOf 쟬
+wOfr 쟭
+wOfa 쟮
+wOfq 쟯
+wOft 쟰
+wOfx 쟱
+wOfv 쟲
+wOfg 쟳
+wOa 쟴
+wOq 쟵
+wOqt 쟶
+wOt 쟷
+wOT 쟸
+wOd 쟹
+wOw 쟺
+wOc 쟻
+wOz 쟼
+wOx 쟽
+wOv 쟾
+wOg 쟿
+wjr 적
+wjR 젂
+wjrt 젃
+wjs 전
+wjsw 젅
+wjsg 젆
+wje 젇
+wjf 절
+wjfr 젉
+wjfa 젊
+wjfq 젋
+wjft 젌
+wjfx 젍
+wjfv 젎
+wjfg 젏
+wja 점
+wjq 접
+wjqt 젒
+wjt 젓
+wjT 젔
+wjd 정
+wjw 젖
+wjc 젗
+wjz 젘
+wjx 젙
+wjv 젚
+wjg 젛
+wpr 젝
+wpR 젞
+wprt 젟
+wps 젠
+wpsw 젡
+wpsg 젢
+wpe 젣
+wpf 젤
+wpfr 젥
+wpfa 젦
+wpfq 젧
+wpft 젨
+wpfx 젩
+wpfv 젪
+wpfg 젫
+wpa 젬
+wpq 젭
+wpqt 젮
+wpt 젯
+wpT 젰
+wpd 젱
+wpw 젲
+wpc 젳
+wpz 젴
+wpx 젵
+wpv 젶
+wpg 젷
+wur 젹
+wuR 젺
+wurt 젻
+wus 젼
+wusw 젽
+wusg 젾
+wue 젿
+wuf 졀
+wufr 졁
+wufa 졂
+wufq 졃
+wuft 졄
+wufx 졅
+wufv 졆
+wufg 졇
+wua 졈
+wuq 졉
+wuqt 졊
+wut 졋
+wuT 졌
+wud 졍
+wuw 졎
+wuc 졏
+wuz 졐
+wux 졑
+wuv 졒
+wug 졓
+wPr 졕
+wPR 졖
+wPrt 졗
+wPs 졘
+wPsw 졙
+wPsg 졚
+wPe 졛
+wPf 졜
+wPfr 졝
+wPfa 졞
+wPfq 졟
+wPft 졠
+wPfx 졡
+wPfv 졢
+wPfg 졣
+wPa 졤
+wPq 졥
+wPqt 졦
+wPt 졧
+wPT 졨
+wPd 졩
+wPw 졪
+wPc 졫
+wPz 졬
+wPx 졭
+wPv 졮
+wPg 졯
+whr 족
+whR 졲
+whrt 졳
+whs 존
+whsw 졵
+whsg 졶
+whe 졷
+whf 졸
+whfr 졹
+whfa 졺
+whfq 졻
+whft 졼
+whfx 졽
+whfv 졾
+whfg 졿
+wha 좀
+whq 좁
+whqt 좂
+wht 좃
+whT 좄
+whd 종
+whw 좆
+whc 좇
+whz 좈
+whx 좉
+whv 좊
+whg 좋
+whkr 좍
+whkR 좎
+whkrt 좏
+whks 좐
+whksw 좑
+whksg 좒
+whke 좓
+whkf 좔
+whkfr 좕
+whkfa 좖
+whkfq 좗
+whkft 좘
+whkfx 좙
+whkfv 좚
+whkfg 좛
+whka 좜
+whkq 좝
+whkqt 좞
+whkt 좟
+whkT 좠
+whkd 좡
+whkw 좢
+whkc 좣
+whkz 좤
+whkx 좥
+whkv 좦
+whkg 좧
+whor 좩
+whoR 좪
+whort 좫
+whos 좬
+whosw 좭
+whosg 좮
+whoe 좯
+whof 좰
+whofr 좱
+whofa 좲
+whofq 좳
+whoft 좴
+whofx 좵
+whofv 좶
+whofg 좷
+whoa 좸
+whoq 좹
+whoqt 좺
+whot 좻
+whoT 좼
+whod 좽
+whow 좾
+whoc 좿
+whoz 죀
+whox 죁
+whov 죂
+whog 죃
+whlr 죅
+whlR 죆
+whlrt 죇
+whls 죈
+whlsw 죉
+whlsg 죊
+whle 죋
+whlf 죌
+whlfr 죍
+whlfa 죎
+whlfq 죏
+whlft 죐
+whlfx 죑
+whlfv 죒
+whlfg 죓
+whla 죔
+whlq 죕
+whlqt 죖
+whlt 죗
+whlT 죘
+whld 죙
+whlw 죚
+whlc 죛
+whlz 죜
+whlx 죝
+whlv 죞
+whlg 죟
+wyr 죡
+wyR 죢
+wyrt 죣
+wys 죤
+wysw 죥
+wysg 죦
+wye 죧
+wyf 죨
+wyfr 죩
+wyfa 죪
+wyfq 죫
+wyft 죬
+wyfx 죭
+wyfv 죮
+wyfg 죯
+wya 죰
+wyq 죱
+wyqt 죲
+wyt 죳
+wyT 죴
+wyd 죵
+wyw 죶
+wyc 죷
+wyz 죸
+wyx 죹
+wyv 죺
+wyg 죻
+wnr 죽
+wnR 죾
+wnrt 죿
+wns 준
+wnsw 줁
+wnsg 줂
+wne 줃
+wnf 줄
+wnfr 줅
+wnfa 줆
+wnfq 줇
+wnft 줈
+wnfx 줉
+wnfv 줊
+wnfg 줋
+wna 줌
+wnq 줍
+wnqt 줎
+wnt 줏
+wnT 줐
+wnd 중
+wnw 줒
+wnc 줓
+wnz 줔
+wnx 줕
+wnv 줖
+wng 줗
+wnjr 줙
+wnjR 줚
+wnjrt 줛
+wnjs 줜
+wnjsw 줝
+wnjsg 줞
+wnje 줟
+wnjf 줠
+wnjfr 줡
+wnjfa 줢
+wnjfq 줣
+wnjft 줤
+wnjfx 줥
+wnjfv 줦
+wnjfg 줧
+wnja 줨
+wnjq 줩
+wnjqt 줪
+wnjt 줫
+wnjT 줬
+wnjd 줭
+wnjw 줮
+wnjc 줯
+wnjz 줰
+wnjx 줱
+wnjv 줲
+wnjg 줳
+wnpr 줵
+wnpR 줶
+wnprt 줷
+wnps 줸
+wnpsw 줹
+wnpsg 줺
+wnpe 줻
+wnpf 줼
+wnpfr 줽
+wnpfa 줾
+wnpfq 줿
+wnpft 쥀
+wnpfx 쥁
+wnpfv 쥂
+wnpfg 쥃
+wnpa 쥄
+wnpq 쥅
+wnpqt 쥆
+wnpt 쥇
+wnpT 쥈
+wnpd 쥉
+wnpw 쥊
+wnpc 쥋
+wnpz 쥌
+wnpx 쥍
+wnpv 쥎
+wnpg 쥏
+wnlr 쥑
+wnlR 쥒
+wnlrt 쥓
+wnls 쥔
+wnlsw 쥕
+wnlsg 쥖
+wnle 쥗
+wnlf 쥘
+wnlfr 쥙
+wnlfa 쥚
+wnlfq 쥛
+wnlft 쥜
+wnlfx 쥝
+wnlfv 쥞
+wnlfg 쥟
+wnla 쥠
+wnlq 쥡
+wnlqt 쥢
+wnlt 쥣
+wnlT 쥤
+wnld 쥥
+wnlw 쥦
+wnlc 쥧
+wnlz 쥨
+wnlx 쥩
+wnlv 쥪
+wnlg 쥫
+wbr 쥭
+wbR 쥮
+wbrt 쥯
+wbs 쥰
+wbsw 쥱
+wbsg 쥲
+wbe 쥳
+wbf 쥴
+wbfr 쥵
+wbfa 쥶
+wbfq 쥷
+wbft 쥸
+wbfx 쥹
+wbfv 쥺
+wbfg 쥻
+wba 쥼
+wbq 쥽
+wbqt 쥾
+wbt 쥿
+wbT 즀
+wbd 즁
+wbw 즂
+wbc 즃
+wbz 즄
+wbx 즅
+wbv 즆
+wbg 즇
+wmr 즉
+wmR 즊
+wmrt 즋
+wms 즌
+wmsw 즍
+wmsg 즎
+wme 즏
+wmf 즐
+wmfr 즑
+wmfa 즒
+wmfq 즓
+wmft 즔
+wmfx 즕
+wmfv 즖
+wmfg 즗
+wma 즘
+wmq 즙
+wmqt 즚
+wmt 즛
+wmT 즜
+wmd 증
+wmw 즞
+wmc 즟
+wmz 즠
+wmx 즡
+wmv 즢
+wmg 즣
+wmlr 즥
+wmlR 즦
+wmlrt 즧
+wmls 즨
+wmlsw 즩
+wmlsg 즪
+wmle 즫
+wmlf 즬
+wmlfr 즭
+wmlfa 즮
+wmlfq 즯
+wmlft 즰
+wmlfx 즱
+wmlfv 즲
+wmlfg 즳
+wmla 즴
+wmlq 즵
+wmlqt 즶
+wmlt 즷
+wmlT 즸
+wmld 즹
+wmlw 즺
+wmlc 즻
+wmlz 즼
+wmlx 즽
+wmlv 즾
+wmlg 즿
+wlr 직
+wlR 짂
+wlrt 짃
+wls 진
+wlsw 짅
+wlsg 짆
+wle 짇
+wlf 질
+wlfr 짉
+wlfa 짊
+wlfq 짋
+wlft 짌
+wlfx 짍
+wlfv 짎
+wlfg 짏
+wla 짐
+wlq 집
+wlqt 짒
+wlt 짓
+wlT 짔
+wld 징
+wlw 짖
+wlc 짗
+wlz 짘
+wlx 짙
+wlv 짚
+wlg 짛
+Wkr 짝
+WkR 짞
+Wkrt 짟
+Wks 짠
+Wksw 짡
+Wksg 짢
+Wke 짣
+Wkf 짤
+Wkfr 짥
+Wkfa 짦
+Wkfq 짧
+Wkft 짨
+Wkfx 짩
+Wkfv 짪
+Wkfg 짫
+Wka 짬
+Wkq 짭
+Wkqt 짮
+Wkt 짯
+WkT 짰
+Wkd 짱
+Wkw 짲
+Wkc 짳
+Wkz 짴
+Wkx 짵
+Wkv 짶
+Wkg 짷
+Wor 짹
+WoR 짺
+Wort 짻
+Wos 짼
+Wosw 짽
+Wosg 짾
+Woe 짿
+Wof 쨀
+Wofr 쨁
+Wofa 쨂
+Wofq 쨃
+Woft 쨄
+Wofx 쨅
+Wofv 쨆
+Wofg 쨇
+Woa 쨈
+Woq 쨉
+Woqt 쨊
+Wot 쨋
+WoT 쨌
+Wod 쨍
+Wow 쨎
+Woc 쨏
+Woz 쨐
+Wox 쨑
+Wov 쨒
+Wog 쨓
+Wir 쨕
+WiR 쨖
+Wirt 쨗
+Wis 쨘
+Wisw 쨙
+Wisg 쨚
+Wie 쨛
+Wif 쨜
+Wifr 쨝
+Wifa 쨞
+Wifq 쨟
+Wift 쨠
+Wifx 쨡
+Wifv 쨢
+Wifg 쨣
+Wia 쨤
+Wiq 쨥
+Wiqt 쨦
+Wit 쨧
+WiT 쨨
+Wid 쨩
+Wiw 쨪
+Wic 쨫
+Wiz 쨬
+Wix 쨭
+Wiv 쨮
+Wig 쨯
+WOr 쨱
+WOR 쨲
+WOrt 쨳
+WOs 쨴
+WOsw 쨵
+WOsg 쨶
+WOe 쨷
+WOf 쨸
+WOfr 쨹
+WOfa 쨺
+WOfq 쨻
+WOft 쨼
+WOfx 쨽
+WOfv 쨾
+WOfg 쨿
+WOa 쩀
+WOq 쩁
+WOqt 쩂
+WOt 쩃
+WOT 쩄
+WOd 쩅
+WOw 쩆
+WOc 쩇
+WOz 쩈
+WOx 쩉
+WOv 쩊
+WOg 쩋
+Wjr 쩍
+WjR 쩎
+Wjrt 쩏
+Wjs 쩐
+Wjsw 쩑
+Wjsg 쩒
+Wje 쩓
+Wjf 쩔
+Wjfr 쩕
+Wjfa 쩖
+Wjfq 쩗
+Wjft 쩘
+Wjfx 쩙
+Wjfv 쩚
+Wjfg 쩛
+Wja 쩜
+Wjq 쩝
+Wjqt 쩞
+Wjt 쩟
+WjT 쩠
+Wjd 쩡
+Wjw 쩢
+Wjc 쩣
+Wjz 쩤
+Wjx 쩥
+Wjv 쩦
+Wjg 쩧
+Wpr 쩩
+WpR 쩪
+Wprt 쩫
+Wps 쩬
+Wpsw 쩭
+Wpsg 쩮
+Wpe 쩯
+Wpf 쩰
+Wpfr 쩱
+Wpfa 쩲
+Wpfq 쩳
+Wpft 쩴
+Wpfx 쩵
+Wpfv 쩶
+Wpfg 쩷
+Wpa 쩸
+Wpq 쩹
+Wpqt 쩺
+Wpt 쩻
+WpT 쩼
+Wpd 쩽
+Wpw 쩾
+Wpc 쩿
+Wpz 쪀
+Wpx 쪁
+Wpv 쪂
+Wpg 쪃
+Wur 쪅
+WuR 쪆
+Wurt 쪇
+Wus 쪈
+Wusw 쪉
+Wusg 쪊
+Wue 쪋
+Wuf 쪌
+Wufr 쪍
+Wufa 쪎
+Wufq 쪏
+Wuft 쪐
+Wufx 쪑
+Wufv 쪒
+Wufg 쪓
+Wua 쪔
+Wuq 쪕
+Wuqt 쪖
+Wut 쪗
+WuT 쪘
+Wud 쪙
+Wuw 쪚
+Wuc 쪛
+Wuz 쪜
+Wux 쪝
+Wuv 쪞
+Wug 쪟
+WPr 쪡
+WPR 쪢
+WPrt 쪣
+WPs 쪤
+WPsw 쪥
+WPsg 쪦
+WPe 쪧
+WPf 쪨
+WPfr 쪩
+WPfa 쪪
+WPfq 쪫
+WPft 쪬
+WPfx 쪭
+WPfv 쪮
+WPfg 쪯
+WPa 쪰
+WPq 쪱
+WPqt 쪲
+WPt 쪳
+WPT 쪴
+WPd 쪵
+WPw 쪶
+WPc 쪷
+WPz 쪸
+WPx 쪹
+WPv 쪺
+WPg 쪻
+Whr 쪽
+WhR 쪾
+Whrt 쪿
+Whs 쫀
+Whsw 쫁
+Whsg 쫂
+Whe 쫃
+Whf 쫄
+Whfr 쫅
+Whfa 쫆
+Whfq 쫇
+Whft 쫈
+Whfx 쫉
+Whfv 쫊
+Whfg 쫋
+Wha 쫌
+Whq 쫍
+Whqt 쫎
+Wht 쫏
+WhT 쫐
+Whd 쫑
+Whw 쫒
+Whc 쫓
+Whz 쫔
+Whx 쫕
+Whv 쫖
+Whg 쫗
+Whkr 쫙
+WhkR 쫚
+Whkrt 쫛
+Whks 쫜
+Whksw 쫝
+Whksg 쫞
+Whke 쫟
+Whkf 쫠
+Whkfr 쫡
+Whkfa 쫢
+Whkfq 쫣
+Whkft 쫤
+Whkfx 쫥
+Whkfv 쫦
+Whkfg 쫧
+Whka 쫨
+Whkq 쫩
+Whkqt 쫪
+Whkt 쫫
+WhkT 쫬
+Whkd 쫭
+Whkw 쫮
+Whkc 쫯
+Whkz 쫰
+Whkx 쫱
+Whkv 쫲
+Whkg 쫳
+Whor 쫵
+WhoR 쫶
+Whort 쫷
+Whos 쫸
+Whosw 쫹
+Whosg 쫺
+Whoe 쫻
+Whof 쫼
+Whofr 쫽
+Whofa 쫾
+Whofq 쫿
+Whoft 쬀
+Whofx 쬁
+Whofv 쬂
+Whofg 쬃
+Whoa 쬄
+Whoq 쬅
+Whoqt 쬆
+Whot 쬇
+WhoT 쬈
+Whod 쬉
+Whow 쬊
+Whoc 쬋
+Whoz 쬌
+Whox 쬍
+Whov 쬎
+Whog 쬏
+Whlr 쬑
+WhlR 쬒
+Whlrt 쬓
+Whls 쬔
+Whlsw 쬕
+Whlsg 쬖
+Whle 쬗
+Whlf 쬘
+Whlfr 쬙
+Whlfa 쬚
+Whlfq 쬛
+Whlft 쬜
+Whlfx 쬝
+Whlfv 쬞
+Whlfg 쬟
+Whla 쬠
+Whlq 쬡
+Whlqt 쬢
+Whlt 쬣
+WhlT 쬤
+Whld 쬥
+Whlw 쬦
+Whlc 쬧
+Whlz 쬨
+Whlx 쬩
+Whlv 쬪
+Whlg 쬫
+Wyr 쬭
+WyR 쬮
+Wyrt 쬯
+Wys 쬰
+Wysw 쬱
+Wysg 쬲
+Wye 쬳
+Wyf 쬴
+Wyfr 쬵
+Wyfa 쬶
+Wyfq 쬷
+Wyft 쬸
+Wyfx 쬹
+Wyfv 쬺
+Wyfg 쬻
+Wya 쬼
+Wyq 쬽
+Wyqt 쬾
+Wyt 쬿
+WyT 쭀
+Wyd 쭁
+Wyw 쭂
+Wyc 쭃
+Wyz 쭄
+Wyx 쭅
+Wyv 쭆
+Wyg 쭇
+Wnr 쭉
+WnR 쭊
+Wnrt 쭋
+Wns 쭌
+Wnsw 쭍
+Wnsg 쭎
+Wne 쭏
+Wnf 쭐
+Wnfr 쭑
+Wnfa 쭒
+Wnfq 쭓
+Wnft 쭔
+Wnfx 쭕
+Wnfv 쭖
+Wnfg 쭗
+Wna 쭘
+Wnq 쭙
+Wnqt 쭚
+Wnt 쭛
+WnT 쭜
+Wnd 쭝
+Wnw 쭞
+Wnc 쭟
+Wnz 쭠
+Wnx 쭡
+Wnv 쭢
+Wng 쭣
+Wnjr 쭥
+WnjR 쭦
+Wnjrt 쭧
+Wnjs 쭨
+Wnjsw 쭩
+Wnjsg 쭪
+Wnje 쭫
+Wnjf 쭬
+Wnjfr 쭭
+Wnjfa 쭮
+Wnjfq 쭯
+Wnjft 쭰
+Wnjfx 쭱
+Wnjfv 쭲
+Wnjfg 쭳
+Wnja 쭴
+Wnjq 쭵
+Wnjqt 쭶
+Wnjt 쭷
+WnjT 쭸
+Wnjd 쭹
+Wnjw 쭺
+Wnjc 쭻
+Wnjz 쭼
+Wnjx 쭽
+Wnjv 쭾
+Wnjg 쭿
+Wnpr 쮁
+WnpR 쮂
+Wnprt 쮃
+Wnps 쮄
+Wnpsw 쮅
+Wnpsg 쮆
+Wnpe 쮇
+Wnpf 쮈
+Wnpfr 쮉
+Wnpfa 쮊
+Wnpfq 쮋
+Wnpft 쮌
+Wnpfx 쮍
+Wnpfv 쮎
+Wnpfg 쮏
+Wnpa 쮐
+Wnpq 쮑
+Wnpqt 쮒
+Wnpt 쮓
+WnpT 쮔
+Wnpd 쮕
+Wnpw 쮖
+Wnpc 쮗
+Wnpz 쮘
+Wnpx 쮙
+Wnpv 쮚
+Wnpg 쮛
+Wnlr 쮝
+WnlR 쮞
+Wnlrt 쮟
+Wnls 쮠
+Wnlsw 쮡
+Wnlsg 쮢
+Wnle 쮣
+Wnlf 쮤
+Wnlfr 쮥
+Wnlfa 쮦
+Wnlfq 쮧
+Wnlft 쮨
+Wnlfx 쮩
+Wnlfv 쮪
+Wnlfg 쮫
+Wnla 쮬
+Wnlq 쮭
+Wnlqt 쮮
+Wnlt 쮯
+WnlT 쮰
+Wnld 쮱
+Wnlw 쮲
+Wnlc 쮳
+Wnlz 쮴
+Wnlx 쮵
+Wnlv 쮶
+Wnlg 쮷
+Wbr 쮹
+WbR 쮺
+Wbrt 쮻
+Wbs 쮼
+Wbsw 쮽
+Wbsg 쮾
+Wbe 쮿
+Wbf 쯀
+Wbfr 쯁
+Wbfa 쯂
+Wbfq 쯃
+Wbft 쯄
+Wbfx 쯅
+Wbfv 쯆
+Wbfg 쯇
+Wba 쯈
+Wbq 쯉
+Wbqt 쯊
+Wbt 쯋
+WbT 쯌
+Wbd 쯍
+Wbw 쯎
+Wbc 쯏
+Wbz 쯐
+Wbx 쯑
+Wbv 쯒
+Wbg 쯓
+Wmr 쯕
+WmR 쯖
+Wmrt 쯗
+Wms 쯘
+Wmsw 쯙
+Wmsg 쯚
+Wme 쯛
+Wmf 쯜
+Wmfr 쯝
+Wmfa 쯞
+Wmfq 쯟
+Wmft 쯠
+Wmfx 쯡
+Wmfv 쯢
+Wmfg 쯣
+Wma 쯤
+Wmq 쯥
+Wmqt 쯦
+Wmt 쯧
+WmT 쯨
+Wmd 쯩
+Wmw 쯪
+Wmc 쯫
+Wmz 쯬
+Wmx 쯭
+Wmv 쯮
+Wmg 쯯
+Wmlr 쯱
+WmlR 쯲
+Wmlrt 쯳
+Wmls 쯴
+Wmlsw 쯵
+Wmlsg 쯶
+Wmle 쯷
+Wmlf 쯸
+Wmlfr 쯹
+Wmlfa 쯺
+Wmlfq 쯻
+Wmlft 쯼
+Wmlfx 쯽
+Wmlfv 쯾
+Wmlfg 쯿
+Wmla 찀
+Wmlq 찁
+Wmlqt 찂
+Wmlt 찃
+WmlT 찄
+Wmld 찅
+Wmlw 찆
+Wmlc 찇
+Wmlz 찈
+Wmlx 찉
+Wmlv 찊
+Wmlg 찋
+Wlr 찍
+WlR 찎
+Wlrt 찏
+Wls 찐
+Wlsw 찑
+Wlsg 찒
+Wle 찓
+Wlf 찔
+Wlfr 찕
+Wlfa 찖
+Wlfq 찗
+Wlft 찘
+Wlfx 찙
+Wlfv 찚
+Wlfg 찛
+Wla 찜
+Wlq 찝
+Wlqt 찞
+Wlt 찟
+WlT 찠
+Wld 찡
+Wlw 찢
+Wlc 찣
+Wlz 찤
+Wlx 찥
+Wlv 찦
+Wlg 찧
+ckr 착
+ckR 찪
+ckrt 찫
+cks 찬
+cksw 찭
+cksg 찮
+cke 찯
+ckf 찰
+ckfr 찱
+ckfa 찲
+ckfq 찳
+ckft 찴
+ckfx 찵
+ckfv 찶
+ckfg 찷
+cka 참
+ckq 찹
+ckqt 찺
+ckt 찻
+ckT 찼
+ckd 창
+ckw 찾
+ckc 찿
+ckz 챀
+ckx 챁
+ckv 챂
+ckg 챃
+cor 책
+coR 챆
+cort 챇
+cos 챈
+cosw 챉
+cosg 챊
+coe 챋
+cof 챌
+cofr 챍
+cofa 챎
+cofq 챏
+coft 챐
+cofx 챑
+cofv 챒
+cofg 챓
+coa 챔
+coq 챕
+coqt 챖
+cot 챗
+coT 챘
+cod 챙
+cow 챚
+coc 챛
+coz 챜
+cox 챝
+cov 챞
+cog 챟
+cir 챡
+ciR 챢
+cirt 챣
+cis 챤
+cisw 챥
+cisg 챦
+cie 챧
+cif 챨
+cifr 챩
+cifa 챪
+cifq 챫
+cift 챬
+cifx 챭
+cifv 챮
+cifg 챯
+cia 챰
+ciq 챱
+ciqt 챲
+cit 챳
+ciT 챴
+cid 챵
+ciw 챶
+cic 챷
+ciz 챸
+cix 챹
+civ 챺
+cig 챻
+cOr 챽
+cOR 챾
+cOrt 챿
+cOs 첀
+cOsw 첁
+cOsg 첂
+cOe 첃
+cOf 첄
+cOfr 첅
+cOfa 첆
+cOfq 첇
+cOft 첈
+cOfx 첉
+cOfv 첊
+cOfg 첋
+cOa 첌
+cOq 첍
+cOqt 첎
+cOt 첏
+cOT 첐
+cOd 첑
+cOw 첒
+cOc 첓
+cOz 첔
+cOx 첕
+cOv 첖
+cOg 첗
+cjr 척
+cjR 첚
+cjrt 첛
+cjs 천
+cjsw 첝
+cjsg 첞
+cje 첟
+cjf 철
+cjfr 첡
+cjfa 첢
+cjfq 첣
+cjft 첤
+cjfx 첥
+cjfv 첦
+cjfg 첧
+cja 첨
+cjq 첩
+cjqt 첪
+cjt 첫
+cjT 첬
+cjd 청
+cjw 첮
+cjc 첯
+cjz 첰
+cjx 첱
+cjv 첲
+cjg 첳
+cpr 첵
+cpR 첶
+cprt 첷
+cps 첸
+cpsw 첹
+cpsg 첺
+cpe 첻
+cpf 첼
+cpfr 첽
+cpfa 첾
+cpfq 첿
+cpft 쳀
+cpfx 쳁
+cpfv 쳂
+cpfg 쳃
+cpa 쳄
+cpq 쳅
+cpqt 쳆
+cpt 쳇
+cpT 쳈
+cpd 쳉
+cpw 쳊
+cpc 쳋
+cpz 쳌
+cpx 쳍
+cpv 쳎
+cpg 쳏
+cur 쳑
+cuR 쳒
+curt 쳓
+cus 쳔
+cusw 쳕
+cusg 쳖
+cue 쳗
+cuf 쳘
+cufr 쳙
+cufa 쳚
+cufq 쳛
+cuft 쳜
+cufx 쳝
+cufv 쳞
+cufg 쳟
+cua 쳠
+cuq 쳡
+cuqt 쳢
+cut 쳣
+cuT 쳤
+cud 쳥
+cuw 쳦
+cuc 쳧
+cuz 쳨
+cux 쳩
+cuv 쳪
+cug 쳫
+cPr 쳭
+cPR 쳮
+cPrt 쳯
+cPs 쳰
+cPsw 쳱
+cPsg 쳲
+cPe 쳳
+cPf 쳴
+cPfr 쳵
+cPfa 쳶
+cPfq 쳷
+cPft 쳸
+cPfx 쳹
+cPfv 쳺
+cPfg 쳻
+cPa 쳼
+cPq 쳽
+cPqt 쳾
+cPt 쳿
+cPT 촀
+cPd 촁
+cPw 촂
+cPc 촃
+cPz 촄
+cPx 촅
+cPv 촆
+cPg 촇
+chr 촉
+chR 촊
+chrt 촋
+chs 촌
+chsw 촍
+chsg 촎
+che 촏
+chf 촐
+chfr 촑
+chfa 촒
+chfq 촓
+chft 촔
+chfx 촕
+chfv 촖
+chfg 촗
+cha 촘
+chq 촙
+chqt 촚
+cht 촛
+chT 촜
+chd 총
+chw 촞
+chc 촟
+chz 촠
+chx 촡
+chv 촢
+chg 촣
+chkr 촥
+chkR 촦
+chkrt 촧
+chks 촨
+chksw 촩
+chksg 촪
+chke 촫
+chkf 촬
+chkfr 촭
+chkfa 촮
+chkfq 촯
+chkft 촰
+chkfx 촱
+chkfv 촲
+chkfg 촳
+chka 촴
+chkq 촵
+chkqt 촶
+chkt 촷
+chkT 촸
+chkd 촹
+chkw 촺
+chkc 촻
+chkz 촼
+chkx 촽
+chkv 촾
+chkg 촿
+chor 쵁
+choR 쵂
+chort 쵃
+chos 쵄
+chosw 쵅
+chosg 쵆
+choe 쵇
+chof 쵈
+chofr 쵉
+chofa 쵊
+chofq 쵋
+choft 쵌
+chofx 쵍
+chofv 쵎
+chofg 쵏
+choa 쵐
+choq 쵑
+choqt 쵒
+chot 쵓
+choT 쵔
+chod 쵕
+chow 쵖
+choc 쵗
+choz 쵘
+chox 쵙
+chov 쵚
+chog 쵛
+chlr 쵝
+chlR 쵞
+chlrt 쵟
+chls 쵠
+chlsw 쵡
+chlsg 쵢
+chle 쵣
+chlf 쵤
+chlfr 쵥
+chlfa 쵦
+chlfq 쵧
+chlft 쵨
+chlfx 쵩
+chlfv 쵪
+chlfg 쵫
+chla 쵬
+chlq 쵭
+chlqt 쵮
+chlt 쵯
+chlT 쵰
+chld 쵱
+chlw 쵲
+chlc 쵳
+chlz 쵴
+chlx 쵵
+chlv 쵶
+chlg 쵷
+cyr 쵹
+cyR 쵺
+cyrt 쵻
+cys 쵼
+cysw 쵽
+cysg 쵾
+cye 쵿
+cyf 춀
+cyfr 춁
+cyfa 춂
+cyfq 춃
+cyft 춄
+cyfx 춅
+cyfv 춆
+cyfg 춇
+cya 춈
+cyq 춉
+cyqt 춊
+cyt 춋
+cyT 춌
+cyd 춍
+cyw 춎
+cyc 춏
+cyz 춐
+cyx 춑
+cyv 춒
+cyg 춓
+cnr 축
+cnR 춖
+cnrt 춗
+cns 춘
+cnsw 춙
+cnsg 춚
+cne 춛
+cnf 출
+cnfr 춝
+cnfa 춞
+cnfq 춟
+cnft 춠
+cnfx 춡
+cnfv 춢
+cnfg 춣
+cna 춤
+cnq 춥
+cnqt 춦
+cnt 춧
+cnT 춨
+cnd 충
+cnw 춪
+cnc 춫
+cnz 춬
+cnx 춭
+cnv 춮
+cng 춯
+cnjr 춱
+cnjR 춲
+cnjrt 춳
+cnjs 춴
+cnjsw 춵
+cnjsg 춶
+cnje 춷
+cnjf 춸
+cnjfr 춹
+cnjfa 춺
+cnjfq 춻
+cnjft 춼
+cnjfx 춽
+cnjfv 춾
+cnjfg 춿
+cnja 췀
+cnjq 췁
+cnjqt 췂
+cnjt 췃
+cnjT 췄
+cnjd 췅
+cnjw 췆
+cnjc 췇
+cnjz 췈
+cnjx 췉
+cnjv 췊
+cnjg 췋
+cnpr 췍
+cnpR 췎
+cnprt 췏
+cnps 췐
+cnpsw 췑
+cnpsg 췒
+cnpe 췓
+cnpf 췔
+cnpfr 췕
+cnpfa 췖
+cnpfq 췗
+cnpft 췘
+cnpfx 췙
+cnpfv 췚
+cnpfg 췛
+cnpa 췜
+cnpq 췝
+cnpqt 췞
+cnpt 췟
+cnpT 췠
+cnpd 췡
+cnpw 췢
+cnpc 췣
+cnpz 췤
+cnpx 췥
+cnpv 췦
+cnpg 췧
+cnlr 췩
+cnlR 췪
+cnlrt 췫
+cnls 췬
+cnlsw 췭
+cnlsg 췮
+cnle 췯
+cnlf 췰
+cnlfr 췱
+cnlfa 췲
+cnlfq 췳
+cnlft 췴
+cnlfx 췵
+cnlfv 췶
+cnlfg 췷
+cnla 췸
+cnlq 췹
+cnlqt 췺
+cnlt 췻
+cnlT 췼
+cnld 췽
+cnlw 췾
+cnlc 췿
+cnlz 츀
+cnlx 츁
+cnlv 츂
+cnlg 츃
+cbr 츅
+cbR 츆
+cbrt 츇
+cbs 츈
+cbsw 츉
+cbsg 츊
+cbe 츋
+cbf 츌
+cbfr 츍
+cbfa 츎
+cbfq 츏
+cbft 츐
+cbfx 츑
+cbfv 츒
+cbfg 츓
+cba 츔
+cbq 츕
+cbqt 츖
+cbt 츗
+cbT 츘
+cbd 츙
+cbw 츚
+cbc 츛
+cbz 츜
+cbx 츝
+cbv 츞
+cbg 츟
+cmr 측
+cmR 츢
+cmrt 츣
+cms 츤
+cmsw 츥
+cmsg 츦
+cme 츧
+cmf 츨
+cmfr 츩
+cmfa 츪
+cmfq 츫
+cmft 츬
+cmfx 츭
+cmfv 츮
+cmfg 츯
+cma 츰
+cmq 츱
+cmqt 츲
+cmt 츳
+cmT 츴
+cmd 층
+cmw 츶
+cmc 츷
+cmz 츸
+cmx 츹
+cmv 츺
+cmg 츻
+cmlr 츽
+cmlR 츾
+cmlrt 츿
+cmls 칀
+cmlsw 칁
+cmlsg 칂
+cmle 칃
+cmlf 칄
+cmlfr 칅
+cmlfa 칆
+cmlfq 칇
+cmlft 칈
+cmlfx 칉
+cmlfv 칊
+cmlfg 칋
+cmla 칌
+cmlq 칍
+cmlqt 칎
+cmlt 칏
+cmlT 칐
+cmld 칑
+cmlw 칒
+cmlc 칓
+cmlz 칔
+cmlx 칕
+cmlv 칖
+cmlg 칗
+clr 칙
+clR 칚
+clrt 칛
+cls 친
+clsw 칝
+clsg 칞
+cle 칟
+clf 칠
+clfr 칡
+clfa 칢
+clfq 칣
+clft 칤
+clfx 칥
+clfv 칦
+clfg 칧
+cla 침
+clq 칩
+clqt 칪
+clt 칫
+clT 칬
+cld 칭
+clw 칮
+clc 칯
+clz 칰
+clx 칱
+clv 칲
+clg 칳
+zkr 칵
+zkR 칶
+zkrt 칷
+zks 칸
+zksw 칹
+zksg 칺
+zke 칻
+zkf 칼
+zkfr 칽
+zkfa 칾
+zkfq 칿
+zkft 캀
+zkfx 캁
+zkfv 캂
+zkfg 캃
+zka 캄
+zkq 캅
+zkqt 캆
+zkt 캇
+zkT 캈
+zkd 캉
+zkw 캊
+zkc 캋
+zkz 캌
+zkx 캍
+zkv 캎
+zkg 캏
+zor 캑
+zoR 캒
+zort 캓
+zos 캔
+zosw 캕
+zosg 캖
+zoe 캗
+zof 캘
+zofr 캙
+zofa 캚
+zofq 캛
+zoft 캜
+zofx 캝
+zofv 캞
+zofg 캟
+zoa 캠
+zoq 캡
+zoqt 캢
+zot 캣
+zoT 캤
+zod 캥
+zow 캦
+zoc 캧
+zoz 캨
+zox 캩
+zov 캪
+zog 캫
+zir 캭
+ziR 캮
+zirt 캯
+zis 캰
+zisw 캱
+zisg 캲
+zie 캳
+zif 캴
+zifr 캵
+zifa 캶
+zifq 캷
+zift 캸
+zifx 캹
+zifv 캺
+zifg 캻
+zia 캼
+ziq 캽
+ziqt 캾
+zit 캿
+ziT 컀
+zid 컁
+ziw 컂
+zic 컃
+ziz 컄
+zix 컅
+ziv 컆
+zig 컇
+zOr 컉
+zOR 컊
+zOrt 컋
+zOs 컌
+zOsw 컍
+zOsg 컎
+zOe 컏
+zOf 컐
+zOfr 컑
+zOfa 컒
+zOfq 컓
+zOft 컔
+zOfx 컕
+zOfv 컖
+zOfg 컗
+zOa 컘
+zOq 컙
+zOqt 컚
+zOt 컛
+zOT 컜
+zOd 컝
+zOw 컞
+zOc 컟
+zOz 컠
+zOx 컡
+zOv 컢
+zOg 컣
+zjr 컥
+zjR 컦
+zjrt 컧
+zjs 컨
+zjsw 컩
+zjsg 컪
+zje 컫
+zjf 컬
+zjfr 컭
+zjfa 컮
+zjfq 컯
+zjft 컰
+zjfx 컱
+zjfv 컲
+zjfg 컳
+zja 컴
+zjq 컵
+zjqt 컶
+zjt 컷
+zjT 컸
+zjd 컹
+zjw 컺
+zjc 컻
+zjz 컼
+zjx 컽
+zjv 컾
+zjg 컿
+zpr 켁
+zpR 켂
+zprt 켃
+zps 켄
+zpsw 켅
+zpsg 켆
+zpe 켇
+zpf 켈
+zpfr 켉
+zpfa 켊
+zpfq 켋
+zpft 켌
+zpfx 켍
+zpfv 켎
+zpfg 켏
+zpa 켐
+zpq 켑
+zpqt 켒
+zpt 켓
+zpT 켔
+zpd 켕
+zpw 켖
+zpc 켗
+zpz 켘
+zpx 켙
+zpv 켚
+zpg 켛
+zur 켝
+zuR 켞
+zurt 켟
+zus 켠
+zusw 켡
+zusg 켢
+zue 켣
+zuf 켤
+zufr 켥
+zufa 켦
+zufq 켧
+zuft 켨
+zufx 켩
+zufv 켪
+zufg 켫
+zua 켬
+zuq 켭
+zuqt 켮
+zut 켯
+zuT 켰
+zud 켱
+zuw 켲
+zuc 켳
+zuz 켴
+zux 켵
+zuv 켶
+zug 켷
+zPr 켹
+zPR 켺
+zPrt 켻
+zPs 켼
+zPsw 켽
+zPsg 켾
+zPe 켿
+zPf 콀
+zPfr 콁
+zPfa 콂
+zPfq 콃
+zPft 콄
+zPfx 콅
+zPfv 콆
+zPfg 콇
+zPa 콈
+zPq 콉
+zPqt 콊
+zPt 콋
+zPT 콌
+zPd 콍
+zPw 콎
+zPc 콏
+zPz 콐
+zPx 콑
+zPv 콒
+zPg 콓
+zhr 콕
+zhR 콖
+zhrt 콗
+zhs 콘
+zhsw 콙
+zhsg 콚
+zhe 콛
+zhf 콜
+zhfr 콝
+zhfa 콞
+zhfq 콟
+zhft 콠
+zhfx 콡
+zhfv 콢
+zhfg 콣
+zha 콤
+zhq 콥
+zhqt 콦
+zht 콧
+zhT 콨
+zhd 콩
+zhw 콪
+zhc 콫
+zhz 콬
+zhx 콭
+zhv 콮
+zhg 콯
+zhkr 콱
+zhkR 콲
+zhkrt 콳
+zhks 콴
+zhksw 콵
+zhksg 콶
+zhke 콷
+zhkf 콸
+zhkfr 콹
+zhkfa 콺
+zhkfq 콻
+zhkft 콼
+zhkfx 콽
+zhkfv 콾
+zhkfg 콿
+zhka 쾀
+zhkq 쾁
+zhkqt 쾂
+zhkt 쾃
+zhkT 쾄
+zhkd 쾅
+zhkw 쾆
+zhkc 쾇
+zhkz 쾈
+zhkx 쾉
+zhkv 쾊
+zhkg 쾋
+zhor 쾍
+zhoR 쾎
+zhort 쾏
+zhos 쾐
+zhosw 쾑
+zhosg 쾒
+zhoe 쾓
+zhof 쾔
+zhofr 쾕
+zhofa 쾖
+zhofq 쾗
+zhoft 쾘
+zhofx 쾙
+zhofv 쾚
+zhofg 쾛
+zhoa 쾜
+zhoq 쾝
+zhoqt 쾞
+zhot 쾟
+zhoT 쾠
+zhod 쾡
+zhow 쾢
+zhoc 쾣
+zhoz 쾤
+zhox 쾥
+zhov 쾦
+zhog 쾧
+zhlr 쾩
+zhlR 쾪
+zhlrt 쾫
+zhls 쾬
+zhlsw 쾭
+zhlsg 쾮
+zhle 쾯
+zhlf 쾰
+zhlfr 쾱
+zhlfa 쾲
+zhlfq 쾳
+zhlft 쾴
+zhlfx 쾵
+zhlfv 쾶
+zhlfg 쾷
+zhla 쾸
+zhlq 쾹
+zhlqt 쾺
+zhlt 쾻
+zhlT 쾼
+zhld 쾽
+zhlw 쾾
+zhlc 쾿
+zhlz 쿀
+zhlx 쿁
+zhlv 쿂
+zhlg 쿃
+zyr 쿅
+zyR 쿆
+zyrt 쿇
+zys 쿈
+zysw 쿉
+zysg 쿊
+zye 쿋
+zyf 쿌
+zyfr 쿍
+zyfa 쿎
+zyfq 쿏
+zyft 쿐
+zyfx 쿑
+zyfv 쿒
+zyfg 쿓
+zya 쿔
+zyq 쿕
+zyqt 쿖
+zyt 쿗
+zyT 쿘
+zyd 쿙
+zyw 쿚
+zyc 쿛
+zyz 쿜
+zyx 쿝
+zyv 쿞
+zyg 쿟
+znr 쿡
+znR 쿢
+znrt 쿣
+zns 쿤
+znsw 쿥
+znsg 쿦
+zne 쿧
+znf 쿨
+znfr 쿩
+znfa 쿪
+znfq 쿫
+znft 쿬
+znfx 쿭
+znfv 쿮
+znfg 쿯
+zna 쿰
+znq 쿱
+znqt 쿲
+znt 쿳
+znT 쿴
+znd 쿵
+znw 쿶
+znc 쿷
+znz 쿸
+znx 쿹
+znv 쿺
+zng 쿻
+znjr 쿽
+znjR 쿾
+znjrt 쿿
+znjs 퀀
+znjsw 퀁
+znjsg 퀂
+znje 퀃
+znjf 퀄
+znjfr 퀅
+znjfa 퀆
+znjfq 퀇
+znjft 퀈
+znjfx 퀉
+znjfv 퀊
+znjfg 퀋
+znja 퀌
+znjq 퀍
+znjqt 퀎
+znjt 퀏
+znjT 퀐
+znjd 퀑
+znjw 퀒
+znjc 퀓
+znjz 퀔
+znjx 퀕
+znjv 퀖
+znjg 퀗
+znpr 퀙
+znpR 퀚
+znprt 퀛
+znps 퀜
+znpsw 퀝
+znpsg 퀞
+znpe 퀟
+znpf 퀠
+znpfr 퀡
+znpfa 퀢
+znpfq 퀣
+znpft 퀤
+znpfx 퀥
+znpfv 퀦
+znpfg 퀧
+znpa 퀨
+znpq 퀩
+znpqt 퀪
+znpt 퀫
+znpT 퀬
+znpd 퀭
+znpw 퀮
+znpc 퀯
+znpz 퀰
+znpx 퀱
+znpv 퀲
+znpg 퀳
+znlr 퀵
+znlR 퀶
+znlrt 퀷
+znls 퀸
+znlsw 퀹
+znlsg 퀺
+znle 퀻
+znlf 퀼
+znlfr 퀽
+znlfa 퀾
+znlfq 퀿
+znlft 큀
+znlfx 큁
+znlfv 큂
+znlfg 큃
+znla 큄
+znlq 큅
+znlqt 큆
+znlt 큇
+znlT 큈
+znld 큉
+znlw 큊
+znlc 큋
+znlz 큌
+znlx 큍
+znlv 큎
+znlg 큏
+zbr 큑
+zbR 큒
+zbrt 큓
+zbs 큔
+zbsw 큕
+zbsg 큖
+zbe 큗
+zbf 큘
+zbfr 큙
+zbfa 큚
+zbfq 큛
+zbft 큜
+zbfx 큝
+zbfv 큞
+zbfg 큟
+zba 큠
+zbq 큡
+zbqt 큢
+zbt 큣
+zbT 큤
+zbd 큥
+zbw 큦
+zbc 큧
+zbz 큨
+zbx 큩
+zbv 큪
+zbg 큫
+zmr 큭
+zmR 큮
+zmrt 큯
+zms 큰
+zmsw 큱
+zmsg 큲
+zme 큳
+zmf 클
+zmfr 큵
+zmfa 큶
+zmfq 큷
+zmft 큸
+zmfx 큹
+zmfv 큺
+zmfg 큻
+zma 큼
+zmq 큽
+zmqt 큾
+zmt 큿
+zmT 킀
+zmd 킁
+zmw 킂
+zmc 킃
+zmz 킄
+zmx 킅
+zmv 킆
+zmg 킇
+zmlr 킉
+zmlR 킊
+zmlrt 킋
+zmls 킌
+zmlsw 킍
+zmlsg 킎
+zmle 킏
+zmlf 킐
+zmlfr 킑
+zmlfa 킒
+zmlfq 킓
+zmlft 킔
+zmlfx 킕
+zmlfv 킖
+zmlfg 킗
+zmla 킘
+zmlq 킙
+zmlqt 킚
+zmlt 킛
+zmlT 킜
+zmld 킝
+zmlw 킞
+zmlc 킟
+zmlz 킠
+zmlx 킡
+zmlv 킢
+zmlg 킣
+zlr 킥
+zlR 킦
+zlrt 킧
+zls 킨
+zlsw 킩
+zlsg 킪
+zle 킫
+zlf 킬
+zlfr 킭
+zlfa 킮
+zlfq 킯
+zlft 킰
+zlfx 킱
+zlfv 킲
+zlfg 킳
+zla 킴
+zlq 킵
+zlqt 킶
+zlt 킷
+zlT 킸
+zld 킹
+zlw 킺
+zlc 킻
+zlz 킼
+zlx 킽
+zlv 킾
+zlg 킿
+xkr 탁
+xkR 탂
+xkrt 탃
+xks 탄
+xksw 탅
+xksg 탆
+xke 탇
+xkf 탈
+xkfr 탉
+xkfa 탊
+xkfq 탋
+xkft 탌
+xkfx 탍
+xkfv 탎
+xkfg 탏
+xka 탐
+xkq 탑
+xkqt 탒
+xkt 탓
+xkT 탔
+xkd 탕
+xkw 탖
+xkc 탗
+xkz 탘
+xkx 탙
+xkv 탚
+xkg 탛
+xor 택
+xoR 탞
+xort 탟
+xos 탠
+xosw 탡
+xosg 탢
+xoe 탣
+xof 탤
+xofr 탥
+xofa 탦
+xofq 탧
+xoft 탨
+xofx 탩
+xofv 탪
+xofg 탫
+xoa 탬
+xoq 탭
+xoqt 탮
+xot 탯
+xoT 탰
+xod 탱
+xow 탲
+xoc 탳
+xoz 탴
+xox 탵
+xov 탶
+xog 탷
+xir 탹
+xiR 탺
+xirt 탻
+xis 탼
+xisw 탽
+xisg 탾
+xie 탿
+xif 턀
+xifr 턁
+xifa 턂
+xifq 턃
+xift 턄
+xifx 턅
+xifv 턆
+xifg 턇
+xia 턈
+xiq 턉
+xiqt 턊
+xit 턋
+xiT 턌
+xid 턍
+xiw 턎
+xic 턏
+xiz 턐
+xix 턑
+xiv 턒
+xig 턓
+xOr 턕
+xOR 턖
+xOrt 턗
+xOs 턘
+xOsw 턙
+xOsg 턚
+xOe 턛
+xOf 턜
+xOfr 턝
+xOfa 턞
+xOfq 턟
+xOft 턠
+xOfx 턡
+xOfv 턢
+xOfg 턣
+xOa 턤
+xOq 턥
+xOqt 턦
+xOt 턧
+xOT 턨
+xOd 턩
+xOw 턪
+xOc 턫
+xOz 턬
+xOx 턭
+xOv 턮
+xOg 턯
+xjr 턱
+xjR 턲
+xjrt 턳
+xjs 턴
+xjsw 턵
+xjsg 턶
+xje 턷
+xjf 털
+xjfr 턹
+xjfa 턺
+xjfq 턻
+xjft 턼
+xjfx 턽
+xjfv 턾
+xjfg 턿
+xja 텀
+xjq 텁
+xjqt 텂
+xjt 텃
+xjT 텄
+xjd 텅
+xjw 텆
+xjc 텇
+xjz 텈
+xjx 텉
+xjv 텊
+xjg 텋
+xpr 텍
+xpR 텎
+xprt 텏
+xps 텐
+xpsw 텑
+xpsg 텒
+xpe 텓
+xpf 텔
+xpfr 텕
+xpfa 텖
+xpfq 텗
+xpft 텘
+xpfx 텙
+xpfv 텚
+xpfg 텛
+xpa 템
+xpq 텝
+xpqt 텞
+xpt 텟
+xpT 텠
+xpd 텡
+xpw 텢
+xpc 텣
+xpz 텤
+xpx 텥
+xpv 텦
+xpg 텧
+xur 텩
+xuR 텪
+xurt 텫
+xus 텬
+xusw 텭
+xusg 텮
+xue 텯
+xuf 텰
+xufr 텱
+xufa 텲
+xufq 텳
+xuft 텴
+xufx 텵
+xufv 텶
+xufg 텷
+xua 텸
+xuq 텹
+xuqt 텺
+xut 텻
+xuT 텼
+xud 텽
+xuw 텾
+xuc 텿
+xuz 톀
+xux 톁
+xuv 톂
+xug 톃
+xPr 톅
+xPR 톆
+xPrt 톇
+xPs 톈
+xPsw 톉
+xPsg 톊
+xPe 톋
+xPf 톌
+xPfr 톍
+xPfa 톎
+xPfq 톏
+xPft 톐
+xPfx 톑
+xPfv 톒
+xPfg 톓
+xPa 톔
+xPq 톕
+xPqt 톖
+xPt 톗
+xPT 톘
+xPd 톙
+xPw 톚
+xPc 톛
+xPz 톜
+xPx 톝
+xPv 톞
+xPg 톟
+xhr 톡
+xhR 톢
+xhrt 톣
+xhs 톤
+xhsw 톥
+xhsg 톦
+xhe 톧
+xhf 톨
+xhfr 톩
+xhfa 톪
+xhfq 톫
+xhft 톬
+xhfx 톭
+xhfv 톮
+xhfg 톯
+xha 톰
+xhq 톱
+xhqt 톲
+xht 톳
+xhT 톴
+xhd 통
+xhw 톶
+xhc 톷
+xhz 톸
+xhx 톹
+xhv 톺
+xhg 톻
+xhkr 톽
+xhkR 톾
+xhkrt 톿
+xhks 퇀
+xhksw 퇁
+xhksg 퇂
+xhke 퇃
+xhkf 퇄
+xhkfr 퇅
+xhkfa 퇆
+xhkfq 퇇
+xhkft 퇈
+xhkfx 퇉
+xhkfv 퇊
+xhkfg 퇋
+xhka 퇌
+xhkq 퇍
+xhkqt 퇎
+xhkt 퇏
+xhkT 퇐
+xhkd 퇑
+xhkw 퇒
+xhkc 퇓
+xhkz 퇔
+xhkx 퇕
+xhkv 퇖
+xhkg 퇗
+xhor 퇙
+xhoR 퇚
+xhort 퇛
+xhos 퇜
+xhosw 퇝
+xhosg 퇞
+xhoe 퇟
+xhof 퇠
+xhofr 퇡
+xhofa 퇢
+xhofq 퇣
+xhoft 퇤
+xhofx 퇥
+xhofv 퇦
+xhofg 퇧
+xhoa 퇨
+xhoq 퇩
+xhoqt 퇪
+xhot 퇫
+xhoT 퇬
+xhod 퇭
+xhow 퇮
+xhoc 퇯
+xhoz 퇰
+xhox 퇱
+xhov 퇲
+xhog 퇳
+xhlr 퇵
+xhlR 퇶
+xhlrt 퇷
+xhls 퇸
+xhlsw 퇹
+xhlsg 퇺
+xhle 퇻
+xhlf 퇼
+xhlfr 퇽
+xhlfa 퇾
+xhlfq 퇿
+xhlft 툀
+xhlfx 툁
+xhlfv 툂
+xhlfg 툃
+xhla 툄
+xhlq 툅
+xhlqt 툆
+xhlt 툇
+xhlT 툈
+xhld 툉
+xhlw 툊
+xhlc 툋
+xhlz 툌
+xhlx 툍
+xhlv 툎
+xhlg 툏
+xyr 툑
+xyR 툒
+xyrt 툓
+xys 툔
+xysw 툕
+xysg 툖
+xye 툗
+xyf 툘
+xyfr 툙
+xyfa 툚
+xyfq 툛
+xyft 툜
+xyfx 툝
+xyfv 툞
+xyfg 툟
+xya 툠
+xyq 툡
+xyqt 툢
+xyt 툣
+xyT 툤
+xyd 툥
+xyw 툦
+xyc 툧
+xyz 툨
+xyx 툩
+xyv 툪
+xyg 툫
+xnr 툭
+xnR 툮
+xnrt 툯
+xns 툰
+xnsw 툱
+xnsg 툲
+xne 툳
+xnf 툴
+xnfr 툵
+xnfa 툶
+xnfq 툷
+xnft 툸
+xnfx 툹
+xnfv 툺
+xnfg 툻
+xna 툼
+xnq 툽
+xnqt 툾
+xnt 툿
+xnT 퉀
+xnd 퉁
+xnw 퉂
+xnc 퉃
+xnz 퉄
+xnx 퉅
+xnv 퉆
+xng 퉇
+xnjr 퉉
+xnjR 퉊
+xnjrt 퉋
+xnjs 퉌
+xnjsw 퉍
+xnjsg 퉎
+xnje 퉏
+xnjf 퉐
+xnjfr 퉑
+xnjfa 퉒
+xnjfq 퉓
+xnjft 퉔
+xnjfx 퉕
+xnjfv 퉖
+xnjfg 퉗
+xnja 퉘
+xnjq 퉙
+xnjqt 퉚
+xnjt 퉛
+xnjT 퉜
+xnjd 퉝
+xnjw 퉞
+xnjc 퉟
+xnjz 퉠
+xnjx 퉡
+xnjv 퉢
+xnjg 퉣
+xnpr 퉥
+xnpR 퉦
+xnprt 퉧
+xnps 퉨
+xnpsw 퉩
+xnpsg 퉪
+xnpe 퉫
+xnpf 퉬
+xnpfr 퉭
+xnpfa 퉮
+xnpfq 퉯
+xnpft 퉰
+xnpfx 퉱
+xnpfv 퉲
+xnpfg 퉳
+xnpa 퉴
+xnpq 퉵
+xnpqt 퉶
+xnpt 퉷
+xnpT 퉸
+xnpd 퉹
+xnpw 퉺
+xnpc 퉻
+xnpz 퉼
+xnpx 퉽
+xnpv 퉾
+xnpg 퉿
+xnlr 튁
+xnlR 튂
+xnlrt 튃
+xnls 튄
+xnlsw 튅
+xnlsg 튆
+xnle 튇
+xnlf 튈
+xnlfr 튉
+xnlfa 튊
+xnlfq 튋
+xnlft 튌
+xnlfx 튍
+xnlfv 튎
+xnlfg 튏
+xnla 튐
+xnlq 튑
+xnlqt 튒
+xnlt 튓
+xnlT 튔
+xnld 튕
+xnlw 튖
+xnlc 튗
+xnlz 튘
+xnlx 튙
+xnlv 튚
+xnlg 튛
+xbr 튝
+xbR 튞
+xbrt 튟
+xbs 튠
+xbsw 튡
+xbsg 튢
+xbe 튣
+xbf 튤
+xbfr 튥
+xbfa 튦
+xbfq 튧
+xbft 튨
+xbfx 튩
+xbfv 튪
+xbfg 튫
+xba 튬
+xbq 튭
+xbqt 튮
+xbt 튯
+xbT 튰
+xbd 튱
+xbw 튲
+xbc 튳
+xbz 튴
+xbx 튵
+xbv 튶
+xbg 튷
+xmr 특
+xmR 튺
+xmrt 튻
+xms 튼
+xmsw 튽
+xmsg 튾
+xme 튿
+xmf 틀
+xmfr 틁
+xmfa 틂
+xmfq 틃
+xmft 틄
+xmfx 틅
+xmfv 틆
+xmfg 틇
+xma 틈
+xmq 틉
+xmqt 틊
+xmt 틋
+xmT 틌
+xmd 틍
+xmw 틎
+xmc 틏
+xmz 틐
+xmx 틑
+xmv 틒
+xmg 틓
+xmlr 틕
+xmlR 틖
+xmlrt 틗
+xmls 틘
+xmlsw 틙
+xmlsg 틚
+xmle 틛
+xmlf 틜
+xmlfr 틝
+xmlfa 틞
+xmlfq 틟
+xmlft 틠
+xmlfx 틡
+xmlfv 틢
+xmlfg 틣
+xmla 틤
+xmlq 틥
+xmlqt 틦
+xmlt 틧
+xmlT 틨
+xmld 틩
+xmlw 틪
+xmlc 틫
+xmlz 틬
+xmlx 틭
+xmlv 틮
+xmlg 틯
+xlr 틱
+xlR 틲
+xlrt 틳
+xls 틴
+xlsw 틵
+xlsg 틶
+xle 틷
+xlf 틸
+xlfr 틹
+xlfa 틺
+xlfq 틻
+xlft 틼
+xlfx 틽
+xlfv 틾
+xlfg 틿
+xla 팀
+xlq 팁
+xlqt 팂
+xlt 팃
+xlT 팄
+xld 팅
+xlw 팆
+xlc 팇
+xlz 팈
+xlx 팉
+xlv 팊
+xlg 팋
+vkr 팍
+vkR 팎
+vkrt 팏
+vks 판
+vksw 팑
+vksg 팒
+vke 팓
+vkf 팔
+vkfr 팕
+vkfa 팖
+vkfq 팗
+vkft 팘
+vkfx 팙
+vkfv 팚
+vkfg 팛
+vka 팜
+vkq 팝
+vkqt 팞
+vkt 팟
+vkT 팠
+vkd 팡
+vkw 팢
+vkc 팣
+vkz 팤
+vkx 팥
+vkv 팦
+vkg 팧
+vor 팩
+voR 팪
+vort 팫
+vos 팬
+vosw 팭
+vosg 팮
+voe 팯
+vof 팰
+vofr 팱
+vofa 팲
+vofq 팳
+voft 팴
+vofx 팵
+vofv 팶
+vofg 팷
+voa 팸
+voq 팹
+voqt 팺
+vot 팻
+voT 팼
+vod 팽
+vow 팾
+voc 팿
+voz 퍀
+vox 퍁
+vov 퍂
+vog 퍃
+vir 퍅
+viR 퍆
+virt 퍇
+vis 퍈
+visw 퍉
+visg 퍊
+vie 퍋
+vif 퍌
+vifr 퍍
+vifa 퍎
+vifq 퍏
+vift 퍐
+vifx 퍑
+vifv 퍒
+vifg 퍓
+via 퍔
+viq 퍕
+viqt 퍖
+vit 퍗
+viT 퍘
+vid 퍙
+viw 퍚
+vic 퍛
+viz 퍜
+vix 퍝
+viv 퍞
+vig 퍟
+vOr 퍡
+vOR 퍢
+vOrt 퍣
+vOs 퍤
+vOsw 퍥
+vOsg 퍦
+vOe 퍧
+vOf 퍨
+vOfr 퍩
+vOfa 퍪
+vOfq 퍫
+vOft 퍬
+vOfx 퍭
+vOfv 퍮
+vOfg 퍯
+vOa 퍰
+vOq 퍱
+vOqt 퍲
+vOt 퍳
+vOT 퍴
+vOd 퍵
+vOw 퍶
+vOc 퍷
+vOz 퍸
+vOx 퍹
+vOv 퍺
+vOg 퍻
+vjr 퍽
+vjR 퍾
+vjrt 퍿
+vjs 펀
+vjsw 펁
+vjsg 펂
+vje 펃
+vjf 펄
+vjfr 펅
+vjfa 펆
+vjfq 펇
+vjft 펈
+vjfx 펉
+vjfv 펊
+vjfg 펋
+vja 펌
+vjq 펍
+vjqt 펎
+vjt 펏
+vjT 펐
+vjd 펑
+vjw 펒
+vjc 펓
+vjz 펔
+vjx 펕
+vjv 펖
+vjg 펗
+vpr 펙
+vpR 펚
+vprt 펛
+vps 펜
+vpsw 펝
+vpsg 펞
+vpe 펟
+vpf 펠
+vpfr 펡
+vpfa 펢
+vpfq 펣
+vpft 펤
+vpfx 펥
+vpfv 펦
+vpfg 펧
+vpa 펨
+vpq 펩
+vpqt 펪
+vpt 펫
+vpT 펬
+vpd 펭
+vpw 펮
+vpc 펯
+vpz 펰
+vpx 펱
+vpv 펲
+vpg 펳
+vur 펵
+vuR 펶
+vurt 펷
+vus 편
+vusw 펹
+vusg 펺
+vue 펻
+vuf 펼
+vufr 펽
+vufa 펾
+vufq 펿
+vuft 폀
+vufx 폁
+vufv 폂
+vufg 폃
+vua 폄
+vuq 폅
+vuqt 폆
+vut 폇
+vuT 폈
+vud 평
+vuw 폊
+vuc 폋
+vuz 폌
+vux 폍
+vuv 폎
+vug 폏
+vPr 폑
+vPR 폒
+vPrt 폓
+vPs 폔
+vPsw 폕
+vPsg 폖
+vPe 폗
+vPf 폘
+vPfr 폙
+vPfa 폚
+vPfq 폛
+vPft 폜
+vPfx 폝
+vPfv 폞
+vPfg 폟
+vPa 폠
+vPq 폡
+vPqt 폢
+vPt 폣
+vPT 폤
+vPd 폥
+vPw 폦
+vPc 폧
+vPz 폨
+vPx 폩
+vPv 폪
+vPg 폫
+vhr 폭
+vhR 폮
+vhrt 폯
+vhs 폰
+vhsw 폱
+vhsg 폲
+vhe 폳
+vhf 폴
+vhfr 폵
+vhfa 폶
+vhfq 폷
+vhft 폸
+vhfx 폹
+vhfv 폺
+vhfg 폻
+vha 폼
+vhq 폽
+vhqt 폾
+vht 폿
+vhT 퐀
+vhd 퐁
+vhw 퐂
+vhc 퐃
+vhz 퐄
+vhx 퐅
+vhv 퐆
+vhg 퐇
+vhkr 퐉
+vhkR 퐊
+vhkrt 퐋
+vhks 퐌
+vhksw 퐍
+vhksg 퐎
+vhke 퐏
+vhkf 퐐
+vhkfr 퐑
+vhkfa 퐒
+vhkfq 퐓
+vhkft 퐔
+vhkfx 퐕
+vhkfv 퐖
+vhkfg 퐗
+vhka 퐘
+vhkq 퐙
+vhkqt 퐚
+vhkt 퐛
+vhkT 퐜
+vhkd 퐝
+vhkw 퐞
+vhkc 퐟
+vhkz 퐠
+vhkx 퐡
+vhkv 퐢
+vhkg 퐣
+vhor 퐥
+vhoR 퐦
+vhort 퐧
+vhos 퐨
+vhosw 퐩
+vhosg 퐪
+vhoe 퐫
+vhof 퐬
+vhofr 퐭
+vhofa 퐮
+vhofq 퐯
+vhoft 퐰
+vhofx 퐱
+vhofv 퐲
+vhofg 퐳
+vhoa 퐴
+vhoq 퐵
+vhoqt 퐶
+vhot 퐷
+vhoT 퐸
+vhod 퐹
+vhow 퐺
+vhoc 퐻
+vhoz 퐼
+vhox 퐽
+vhov 퐾
+vhog 퐿
+vhlr 푁
+vhlR 푂
+vhlrt 푃
+vhls 푄
+vhlsw 푅
+vhlsg 푆
+vhle 푇
+vhlf 푈
+vhlfr 푉
+vhlfa 푊
+vhlfq 푋
+vhlft 푌
+vhlfx 푍
+vhlfv 푎
+vhlfg 푏
+vhla 푐
+vhlq 푑
+vhlqt 푒
+vhlt 푓
+vhlT 푔
+vhld 푕
+vhlw 푖
+vhlc 푗
+vhlz 푘
+vhlx 푙
+vhlv 푚
+vhlg 푛
+vyr 푝
+vyR 푞
+vyrt 푟
+vys 푠
+vysw 푡
+vysg 푢
+vye 푣
+vyf 푤
+vyfr 푥
+vyfa 푦
+vyfq 푧
+vyft 푨
+vyfx 푩
+vyfv 푪
+vyfg 푫
+vya 푬
+vyq 푭
+vyqt 푮
+vyt 푯
+vyT 푰
+vyd 푱
+vyw 푲
+vyc 푳
+vyz 푴
+vyx 푵
+vyv 푶
+vyg 푷
+vnr 푹
+vnR 푺
+vnrt 푻
+vns 푼
+vnsw 푽
+vnsg 푾
+vne 푿
+vnf 풀
+vnfr 풁
+vnfa 풂
+vnfq 풃
+vnft 풄
+vnfx 풅
+vnfv 풆
+vnfg 풇
+vna 품
+vnq 풉
+vnqt 풊
+vnt 풋
+vnT 풌
+vnd 풍
+vnw 풎
+vnc 풏
+vnz 풐
+vnx 풑
+vnv 풒
+vng 풓
+vnjr 풕
+vnjR 풖
+vnjrt 풗
+vnjs 풘
+vnjsw 풙
+vnjsg 풚
+vnje 풛
+vnjf 풜
+vnjfr 풝
+vnjfa 풞
+vnjfq 풟
+vnjft 풠
+vnjfx 풡
+vnjfv 풢
+vnjfg 풣
+vnja 풤
+vnjq 풥
+vnjqt 풦
+vnjt 풧
+vnjT 풨
+vnjd 풩
+vnjw 풪
+vnjc 풫
+vnjz 풬
+vnjx 풭
+vnjv 풮
+vnjg 풯
+vnpr 풱
+vnpR 풲
+vnprt 풳
+vnps 풴
+vnpsw 풵
+vnpsg 풶
+vnpe 풷
+vnpf 풸
+vnpfr 풹
+vnpfa 풺
+vnpfq 풻
+vnpft 풼
+vnpfx 풽
+vnpfv 풾
+vnpfg 풿
+vnpa 퓀
+vnpq 퓁
+vnpqt 퓂
+vnpt 퓃
+vnpT 퓄
+vnpd 퓅
+vnpw 퓆
+vnpc 퓇
+vnpz 퓈
+vnpx 퓉
+vnpv 퓊
+vnpg 퓋
+vnlr 퓍
+vnlR 퓎
+vnlrt 퓏
+vnls 퓐
+vnlsw 퓑
+vnlsg 퓒
+vnle 퓓
+vnlf 퓔
+vnlfr 퓕
+vnlfa 퓖
+vnlfq 퓗
+vnlft 퓘
+vnlfx 퓙
+vnlfv 퓚
+vnlfg 퓛
+vnla 퓜
+vnlq 퓝
+vnlqt 퓞
+vnlt 퓟
+vnlT 퓠
+vnld 퓡
+vnlw 퓢
+vnlc 퓣
+vnlz 퓤
+vnlx 퓥
+vnlv 퓦
+vnlg 퓧
+vbr 퓩
+vbR 퓪
+vbrt 퓫
+vbs 퓬
+vbsw 퓭
+vbsg 퓮
+vbe 퓯
+vbf 퓰
+vbfr 퓱
+vbfa 퓲
+vbfq 퓳
+vbft 퓴
+vbfx 퓵
+vbfv 퓶
+vbfg 퓷
+vba 퓸
+vbq 퓹
+vbqt 퓺
+vbt 퓻
+vbT 퓼
+vbd 퓽
+vbw 퓾
+vbc 퓿
+vbz 픀
+vbx 픁
+vbv 픂
+vbg 픃
+vmr 픅
+vmR 픆
+vmrt 픇
+vms 픈
+vmsw 픉
+vmsg 픊
+vme 픋
+vmf 플
+vmfr 픍
+vmfa 픎
+vmfq 픏
+vmft 픐
+vmfx 픑
+vmfv 픒
+vmfg 픓
+vma 픔
+vmq 픕
+vmqt 픖
+vmt 픗
+vmT 픘
+vmd 픙
+vmw 픚
+vmc 픛
+vmz 픜
+vmx 픝
+vmv 픞
+vmg 픟
+vmlr 픡
+vmlR 픢
+vmlrt 픣
+vmls 픤
+vmlsw 픥
+vmlsg 픦
+vmle 픧
+vmlf 픨
+vmlfr 픩
+vmlfa 픪
+vmlfq 픫
+vmlft 픬
+vmlfx 픭
+vmlfv 픮
+vmlfg 픯
+vmla 픰
+vmlq 픱
+vmlqt 픲
+vmlt 픳
+vmlT 픴
+vmld 픵
+vmlw 픶
+vmlc 픷
+vmlz 픸
+vmlx 픹
+vmlv 픺
+vmlg 픻
+vlr 픽
+vlR 픾
+vlrt 픿
+vls 핀
+vlsw 핁
+vlsg 핂
+vle 핃
+vlf 필
+vlfr 핅
+vlfa 핆
+vlfq 핇
+vlft 핈
+vlfx 핉
+vlfv 핊
+vlfg 핋
+vla 핌
+vlq 핍
+vlqt 핎
+vlt 핏
+vlT 핐
+vld 핑
+vlw 핒
+vlc 핓
+vlz 핔
+vlx 핕
+vlv 핖
+vlg 핗
+gkr 학
+gkR 핚
+gkrt 핛
+gks 한
+gksw 핝
+gksg 핞
+gke 핟
+gkf 할
+gkfr 핡
+gkfa 핢
+gkfq 핣
+gkft 핤
+gkfx 핥
+gkfv 핦
+gkfg 핧
+gka 함
+gkq 합
+gkqt 핪
+gkt 핫
+gkT 핬
+gkd 항
+gkw 핮
+gkc 핯
+gkz 핰
+gkx 핱
+gkv 핲
+gkg 핳
+gor 핵
+goR 핶
+gort 핷
+gos 핸
+gosw 핹
+gosg 핺
+goe 핻
+gof 핼
+gofr 핽
+gofa 핾
+gofq 핿
+goft 햀
+gofx 햁
+gofv 햂
+gofg 햃
+goa 햄
+goq 햅
+goqt 햆
+got 햇
+goT 했
+god 행
+gow 햊
+goc 햋
+goz 햌
+gox 햍
+gov 햎
+gog 햏
+gir 햑
+giR 햒
+girt 햓
+gis 햔
+gisw 햕
+gisg 햖
+gie 햗
+gif 햘
+gifr 햙
+gifa 햚
+gifq 햛
+gift 햜
+gifx 햝
+gifv 햞
+gifg 햟
+gia 햠
+giq 햡
+giqt 햢
+git 햣
+giT 햤
+gid 향
+giw 햦
+gic 햧
+giz 햨
+gix 햩
+giv 햪
+gig 햫
+gOr 햭
+gOR 햮
+gOrt 햯
+gOs 햰
+gOsw 햱
+gOsg 햲
+gOe 햳
+gOf 햴
+gOfr 햵
+gOfa 햶
+gOfq 햷
+gOft 햸
+gOfx 햹
+gOfv 햺
+gOfg 햻
+gOa 햼
+gOq 햽
+gOqt 햾
+gOt 햿
+gOT 헀
+gOd 헁
+gOw 헂
+gOc 헃
+gOz 헄
+gOx 헅
+gOv 헆
+gOg 헇
+gjr 헉
+gjR 헊
+gjrt 헋
+gjs 헌
+gjsw 헍
+gjsg 헎
+gje 헏
+gjf 헐
+gjfr 헑
+gjfa 헒
+gjfq 헓
+gjft 헔
+gjfx 헕
+gjfv 헖
+gjfg 헗
+gja 험
+gjq 헙
+gjqt 헚
+gjt 헛
+gjT 헜
+gjd 헝
+gjw 헞
+gjc 헟
+gjz 헠
+gjx 헡
+gjv 헢
+gjg 헣
+gpr 헥
+gpR 헦
+gprt 헧
+gps 헨
+gpsw 헩
+gpsg 헪
+gpe 헫
+gpf 헬
+gpfr 헭
+gpfa 헮
+gpfq 헯
+gpft 헰
+gpfx 헱
+gpfv 헲
+gpfg 헳
+gpa 헴
+gpq 헵
+gpqt 헶
+gpt 헷
+gpT 헸
+gpd 헹
+gpw 헺
+gpc 헻
+gpz 헼
+gpx 헽
+gpv 헾
+gpg 헿
+gur 혁
+guR 혂
+gurt 혃
+gus 현
+gusw 혅
+gusg 혆
+gue 혇
+guf 혈
+gufr 혉
+gufa 혊
+gufq 혋
+guft 혌
+gufx 혍
+gufv 혎
+gufg 혏
+gua 혐
+guq 협
+guqt 혒
+gut 혓
+guT 혔
+gud 형
+guw 혖
+guc 혗
+guz 혘
+gux 혙
+guv 혚
+gug 혛
+gPr 혝
+gPR 혞
+gPrt 혟
+gPs 혠
+gPsw 혡
+gPsg 혢
+gPe 혣
+gPf 혤
+gPfr 혥
+gPfa 혦
+gPfq 혧
+gPft 혨
+gPfx 혩
+gPfv 혪
+gPfg 혫
+gPa 혬
+gPq 혭
+gPqt 혮
+gPt 혯
+gPT 혰
+gPd 혱
+gPw 혲
+gPc 혳
+gPz 혴
+gPx 혵
+gPv 혶
+gPg 혷
+ghr 혹
+ghR 혺
+ghrt 혻
+ghs 혼
+ghsw 혽
+ghsg 혾
+ghe 혿
+ghf 홀
+ghfr 홁
+ghfa 홂
+ghfq 홃
+ghft 홄
+ghfx 홅
+ghfv 홆
+ghfg 홇
+gha 홈
+ghq 홉
+ghqt 홊
+ght 홋
+ghT 홌
+ghd 홍
+ghw 홎
+ghc 홏
+ghz 홐
+ghx 홑
+ghv 홒
+ghg 홓
+ghkr 확
+ghkR 홖
+ghkrt 홗
+ghks 환
+ghksw 홙
+ghksg 홚
+ghke 홛
+ghkf 활
+ghkfr 홝
+ghkfa 홞
+ghkfq 홟
+ghkft 홠
+ghkfx 홡
+ghkfv 홢
+ghkfg 홣
+ghka 홤
+ghkq 홥
+ghkqt 홦
+ghkt 홧
+ghkT 홨
+ghkd 황
+ghkw 홪
+ghkc 홫
+ghkz 홬
+ghkx 홭
+ghkv 홮
+ghkg 홯
+ghor 홱
+ghoR 홲
+ghort 홳
+ghos 홴
+ghosw 홵
+ghosg 홶
+ghoe 홷
+ghof 홸
+ghofr 홹
+ghofa 홺
+ghofq 홻
+ghoft 홼
+ghofx 홽
+ghofv 홾
+ghofg 홿
+ghoa 횀
+ghoq 횁
+ghoqt 횂
+ghot 횃
+ghoT 횄
+ghod 횅
+ghow 횆
+ghoc 횇
+ghoz 횈
+ghox 횉
+ghov 횊
+ghog 횋
+ghlr 획
+ghlR 횎
+ghlrt 횏
+ghls 횐
+ghlsw 횑
+ghlsg 횒
+ghle 횓
+ghlf 횔
+ghlfr 횕
+ghlfa 횖
+ghlfq 횗
+ghlft 횘
+ghlfx 횙
+ghlfv 횚
+ghlfg 횛
+ghla 횜
+ghlq 횝
+ghlqt 횞
+ghlt 횟
+ghlT 횠
+ghld 횡
+ghlw 횢
+ghlc 횣
+ghlz 횤
+ghlx 횥
+ghlv 횦
+ghlg 횧
+gyr 횩
+gyR 횪
+gyrt 횫
+gys 횬
+gysw 횭
+gysg 횮
+gye 횯
+gyf 횰
+gyfr 횱
+gyfa 횲
+gyfq 횳
+gyft 횴
+gyfx 횵
+gyfv 횶
+gyfg 횷
+gya 횸
+gyq 횹
+gyqt 횺
+gyt 횻
+gyT 횼
+gyd 횽
+gyw 횾
+gyc 횿
+gyz 훀
+gyx 훁
+gyv 훂
+gyg 훃
+gnr 훅
+gnR 훆
+gnrt 훇
+gns 훈
+gnsw 훉
+gnsg 훊
+gne 훋
+gnf 훌
+gnfr 훍
+gnfa 훎
+gnfq 훏
+gnft 훐
+gnfx 훑
+gnfv 훒
+gnfg 훓
+gna 훔
+gnq 훕
+gnqt 훖
+gnt 훗
+gnT 훘
+gnd 훙
+gnw 훚
+gnc 훛
+gnz 훜
+gnx 훝
+gnv 훞
+gng 훟
+gnjr 훡
+gnjR 훢
+gnjrt 훣
+gnjs 훤
+gnjsw 훥
+gnjsg 훦
+gnje 훧
+gnjf 훨
+gnjfr 훩
+gnjfa 훪
+gnjfq 훫
+gnjft 훬
+gnjfx 훭
+gnjfv 훮
+gnjfg 훯
+gnja 훰
+gnjq 훱
+gnjqt 훲
+gnjt 훳
+gnjT 훴
+gnjd 훵
+gnjw 훶
+gnjc 훷
+gnjz 훸
+gnjx 훹
+gnjv 훺
+gnjg 훻
+gnpr 훽
+gnpR 훾
+gnprt 훿
+gnps 휀
+gnpsw 휁
+gnpsg 휂
+gnpe 휃
+gnpf 휄
+gnpfr 휅
+gnpfa 휆
+gnpfq 휇
+gnpft 휈
+gnpfx 휉
+gnpfv 휊
+gnpfg 휋
+gnpa 휌
+gnpq 휍
+gnpqt 휎
+gnpt 휏
+gnpT 휐
+gnpd 휑
+gnpw 휒
+gnpc 휓
+gnpz 휔
+gnpx 휕
+gnpv 휖
+gnpg 휗
+gnlr 휙
+gnlR 휚
+gnlrt 휛
+gnls 휜
+gnlsw 휝
+gnlsg 휞
+gnle 휟
+gnlf 휠
+gnlfr 휡
+gnlfa 휢
+gnlfq 휣
+gnlft 휤
+gnlfx 휥
+gnlfv 휦
+gnlfg 휧
+gnla 휨
+gnlq 휩
+gnlqt 휪
+gnlt 휫
+gnlT 휬
+gnld 휭
+gnlw 휮
+gnlc 휯
+gnlz 휰
+gnlx 휱
+gnlv 휲
+gnlg 휳
+gbr 휵
+gbR 휶
+gbrt 휷
+gbs 휸
+gbsw 휹
+gbsg 휺
+gbe 휻
+gbf 휼
+gbfr 휽
+gbfa 휾
+gbfq 휿
+gbft 흀
+gbfx 흁
+gbfv 흂
+gbfg 흃
+gba 흄
+gbq 흅
+gbqt 흆
+gbt 흇
+gbT 흈
+gbd 흉
+gbw 흊
+gbc 흋
+gbz 흌
+gbx 흍
+gbv 흎
+gbg 흏
+gmr 흑
+gmR 흒
+gmrt 흓
+gms 흔
+gmsw 흕
+gmsg 흖
+gme 흗
+gmf 흘
+gmfr 흙
+gmfa 흚
+gmfq 흛
+gmft 흜
+gmfx 흝
+gmfv 흞
+gmfg 흟
+gma 흠
+gmq 흡
+gmqt 흢
+gmt 흣
+gmT 흤
+gmd 흥
+gmw 흦
+gmc 흧
+gmz 흨
+gmx 흩
+gmv 흪
+gmg 흫
+gmlr 흭
+gmlR 흮
+gmlrt 흯
+gmls 흰
+gmlsw 흱
+gmlsg 흲
+gmle 흳
+gmlf 흴
+gmlfr 흵
+gmlfa 흶
+gmlfq 흷
+gmlft 흸
+gmlfx 흹
+gmlfv 흺
+gmlfg 흻
+gmla 흼
+gmlq 흽
+gmlqt 흾
+gmlt 흿
+gmlT 힀
+gmld 힁
+gmlw 힂
+gmlc 힃
+gmlz 힄
+gmlx 힅
+gmlv 힆
+gmlg 힇
+glr 힉
+glR 힊
+glrt 힋
+gls 힌
+glsw 힍
+glsg 힎
+gle 힏
+glf 힐
+glfr 힑
+glfa 힒
+glfq 힓
+glft 힔
+glfx 힕
+glfv 힖
+glfg 힗
+gla 힘
+glq 힙
+glqt 힚
+glt 힛
+glT 힜
+gld 힝
+glw 힞
+glc 힟
+glz 힠
+glx 힡
+glv 힢
+glg 힣
diff --git a/runtime/keymap/korean.vim b/runtime/keymap/korean.vim
new file mode 100644
index 0000000..64ae519
--- /dev/null
+++ b/runtime/keymap/korean.vim
@@ -0,0 +1,23 @@
+" Maintainer: Jang Whemoon <palindrom615@gmail.com>
+" Last Change: Nov 24, 2020
+"
+"
+"
+" Unlike Japanese or Chinese, modern Korean texts do not depends on conversion
+" to Hanja (Chinese character). Thus, general Korean text totally can be
+" covered without help of IME but this keymap.
+"
+" BUT, simply mapping each letter of Hangul with sequence of alphabet 1 by 1
+" can fail to combine Hangul jamo (conconants and vowels) right.
+" For example, sequentially pressing `ㅅㅓㅇㅜㄹㄷㅐㅎㅏㄱㅛ` can not only be
+" combined as `서울대학교`, but also `성ㅜㄹ댛ㅏㄱ교`, which is totally
+" nonsense.
+" Though combining Hangul is deterministic with law that each letter must be
+" one of (consonant + vowel) or (consonant + vowel + consonant), there is no
+" way to apply such law without implementing input engine.
+"
+" Thus, user of this keymap should wait until previous hangul letter is
+" completed before typing next one. To reduce such inconvenience, I suggest to
+" set `timeoutlen` with their own value. (default value is 1000ms)
+
+source <sfile>:p:h/korean-dubeolsik_utf-8.vim
diff --git a/runtime/keymap/lithuanian-baltic.vim b/runtime/keymap/lithuanian-baltic.vim
new file mode 100644
index 0000000..b888db6
--- /dev/null
+++ b/runtime/keymap/lithuanian-baltic.vim
@@ -0,0 +1,31 @@
+" Vim Keymap file for lithuanian characters, phonetic layout 'Baltic'
+" Useful mainly with utf-8 but may work with other encodings
+
+" Maintainer: Alex Jakushev <Alex.Jakushev@kemek.lt>
+" Last Changed: 2002 Apr 12
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding utf-8
+
+let b:keymap_name = "lt"
+
+loadkeymap
+! Ą LITHUANIAN CAPITAL A NOSINE
+@ Č LITHUANIAN CAPITAL CH
+# Ę LITHUANIAN CAPITAL E NOSINE
+$ Ė LITHUANIAN CAPITAL E SU TASKU
+% Į LITHUANIAN CAPITAL I NOSINE
+^ Š LITHUANIAN CAPITAL SH
+& Ų LITHUANIAN CAPITAL U NOSINE
+* Ū LITHUANIAN CAPITAL U SU BRUKSNIU
++ Ž LITHUANIAN CAPITAL ZH
+1 ą LITHUANIAN LOWERCASE A NOSINE
+2 č LITHUANIAN LOWERCASE CH
+3 ę LITHUANIAN LOWERCASE E NOSINE
+4 ė LITHUANIAN LOWERCASE E SU TASKU
+5 į LITHUANIAN LOWERCASE I NOSINE
+6 š LITHUANIAN LOWERCASE SH
+7 ų LITHUANIAN LOWERCASE U NOSINE
+8 ū LITHUANIAN LOWERCASE U SU BRUKSNIU
+= ž LITHUANIAN LOWERCASE ZH
diff --git a/runtime/keymap/magyar_utf-8.vim b/runtime/keymap/magyar_utf-8.vim
new file mode 100644
index 0000000..7297717
--- /dev/null
+++ b/runtime/keymap/magyar_utf-8.vim
@@ -0,0 +1,37 @@
+" Maintainer: Laszlo Zavaleta <zavaleta@smartchat.net.au>
+" Last Changed: 2003 Aug 08
+" it has all the accents and a few of the character alterations
+
+let b:keymap = "magyar"
+
+loadkey
+` í
+~ Í
+! '
+@ "
+# +
+$ !
+^ /
+& =
+* (
+( )
+0 ö
+) Ö
+- ü
+_ Ü
+= ó
++ Ó
+\\ ű
+| Ű
+[ ő
+{ Ő
+] ú
+} Ú
+; é
+: É
+' á
+\" Á
+/ -
+< ?
+> :
+? _
diff --git a/runtime/keymap/mongolian_utf-8.vim b/runtime/keymap/mongolian_utf-8.vim
new file mode 100644
index 0000000..a52e3e9
--- /dev/null
+++ b/runtime/keymap/mongolian_utf-8.vim
@@ -0,0 +1,101 @@
+" Maintainer: Natsagdorj Shagdar <natsag2000@yahoo.com>
+" Last Changed: 2007 Jun 26
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding utf-8
+
+let b:keymap_name = "mn"
+
+loadkeymap
+C Ё CYRILLIC CAPITAL LETTER IO
+c ё CYRILLIC SMALL LETTER IO
+G А CYRILLIC CAPITAL LETTER A
+D Б CYRILLIC CAPITAL LETTER BE
+> В CYRILLIC CAPITAL LETTER VE
+U Г CYRILLIC CAPITAL LETTER GHE
+: Д CYRILLIC CAPITAL LETTER DE
+_ Е CYRILLIC CAPITAL LETTER IE
+R Ж CYRILLIC CAPITAL LETTER ZHE
+P З CYRILLIC CAPITAL LETTER ZE
+N И CYRILLIC CAPITAL LETTER I
+A Й CYRILLIC CAPITAL LETTER SHORT I
+{ К CYRILLIC CAPITAL LETTER KA
+L Л CYRILLIC CAPITAL LETTER EL
+B М CYRILLIC CAPITAL LETTER EM
+Y Н CYRILLIC CAPITAL LETTER EN
+K О CYRILLIC CAPITAL LETTER O
+\" П CYRILLIC CAPITAL LETTER PE
+J Р CYRILLIC CAPITAL LETTER ER
+V С CYRILLIC CAPITAL LETTER ES
+M Т CYRILLIC CAPITAL LETTER TE
+E У CYRILLIC CAPITAL LETTER U
+Q Ф CYRILLIC CAPITAL LETTER EF
+H Х CYRILLIC CAPITAL LETTER HA
+W Ц CYRILLIC CAPITAL LETTER TSE
+X Ч CYRILLIC CAPITAL LETTER CHE
+I Ш CYRILLIC CAPITAL LETTER SHA
++ Щ CYRILLIC CAPITAL LETTER SHCHA
+} Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+S Ы CYRILLIC CAPITAL LETTER YERU
+< Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+T Э CYRILLIC CAPITAL LETTER E
+? Ю CYRILLIC CAPITAL LETTER YU
+Z Я CYRILLIC CAPITAL LETTER YA
+g а CYRILLIC SMALL LETTER A
+d б CYRILLIC SMALL LETTER BE
+. в CYRILLIC SMALL LETTER VE
+u г CYRILLIC SMALL LETTER GHE
+; д CYRILLIC SMALL LETTER DE
+- е CYRILLIC SMALL LETTER IE
+r ж CYRILLIC SMALL LETTER ZHE
+p з CYRILLIC SMALL LETTER ZE
+n и CYRILLIC SMALL LETTER I
+a й CYRILLIC SMALL LETTER SHORT I
+[ к CYRILLIC SMALL LETTER KA
+l л CYRILLIC SMALL LETTER EL
+b м CYRILLIC SMALL LETTER EM
+y н CYRILLIC SMALL LETTER EN
+k о CYRILLIC SMALL LETTER O
+' п CYRILLIC SMALL LETTER PE
+j р CYRILLIC SMALL LETTER ER
+v с CYRILLIC SMALL LETTER ES
+m т CYRILLIC SMALL LETTER TE
+e у CYRILLIC SMALL LETTER U
+q ф CYRILLIC SMALL LETTER EF
+h х CYRILLIC SMALL LETTER HA
+w ц CYRILLIC SMALL LETTER TSE
+x ч CYRILLIC SMALL LETTER CHE
+i ш CYRILLIC SMALL LETTER SHA
+= щ CYRILLIC SMALL LETTER SHCHA
+] ъ CYRILLIC SMALL LETTER HARD SIGN
+s ы CYRILLIC SMALL LETTER YERU
+, ь CYRILLIC SMALL LETTER SOFT SIGN
+t э CYRILLIC SMALL LETTER E
+/ ю CYRILLIC SMALL LETTER YU
+z я CYRILLIC SMALL LETTER YA
+f ө CYRILLIC SMALL LETTER Oе
+F Ө CYRILLIC SMALL LETTER Oе
+o ү CYRILLIC SMALL LETTER Ге
+O Ү CYRILLIC SMALL LETTER Oе
+` =
+1 № NUMERO SIGN
+2 -
+3 "
+4 T
+5 :
+7 ?
+6 .
+8 ,
+9 (
+0 )
+! 1
+@ 2
+# 3
+$ 4
+% 5
+^ 6
+& 7
+* 8
+( 9
+) 0
diff --git a/runtime/keymap/oldturkic-orkhon_utf-8.vim b/runtime/keymap/oldturkic-orkhon_utf-8.vim
new file mode 100644
index 0000000..e1f0015
--- /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 0000000..09722e7
--- /dev/null
+++ b/runtime/keymap/oldturkic-yenisei_utf-8.vim
@@ -0,0 +1,159 @@
+" 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 = "oty"
+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
+OO 𐰆 10C06 OLD TURKIC LETTER ORKHON O
+U 𐰆 10C06 OLD TURKIC LETTER ORKHON O
+06 𐰆 10C06 OLD TURKIC LETTER ORKHON O
+E 𐰈 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
+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 𐰕 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
+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
+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
+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 𐰳 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
+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 𐱀 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
+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/persian-iranian_utf-8.vim b/runtime/keymap/persian-iranian_utf-8.vim
new file mode 100644
index 0000000..e8dcd76
--- /dev/null
+++ b/runtime/keymap/persian-iranian_utf-8.vim
@@ -0,0 +1,113 @@
+" Vim Keymap file for Persian Standard Keyboard Layout
+" Maintainers: Behnam 'ZWNJ' Esfahbod <behnam@zwnj.org>,
+" Amir Hedayaty <hedayaty@gmail.com>
+" Last Change: 2006 Apr 21
+
+scriptencoding utf-8
+
+" Use this short name in the status line.
+let b:keymap_name = "per"
+
+loadkeymap
+` ‍
+1 ۱
+2 ۲
+3 ۳
+4 ۴
+5 ۵
+6 ۶
+7 ۷
+8 ۸
+9 ۹
+0 ۰
+- -
+= =
+
+q ض
+w ص
+e ث
+r ق
+t ف
+y غ
+u ع
+i ه
+o خ
+p ح
+[ ج
+] چ
+
+a ش
+s س
+d ی
+f ب
+g ل
+h ا
+j ت
+k ن
+l م
+; ک
+' گ
+
+z ظ
+x ط
+c ز
+v ر
+b ذ
+n د
+m پ
+, و
+. .
+/ /
+\\ \\
+
+~ ÷
+! !
+@ ٬
+# ٫
+$ ﷼
+% ٪
+^ ×
+& ،
+* *
+( )
+) (
+_ ـ
++ +
+
+Q ْ
+W ٌ
+E ٍ
+R ً
+T ُ
+Y ِ
+U َ
+I ّ
+O ]
+P [
+{ }
+} {
+
+A ؤ
+S ئ
+D ي
+F إ
+G أ
+H آ
+J ة
+K »
+L «
+: :
+\" ؛
+
+Z ك
+X ٓ
+C ژ
+V ٰ
+B ‌
+N ٔ
+M ء
+< >
+> <
+? ؟
+| |
+
diff --git a/runtime/keymap/persian.vim b/runtime/keymap/persian.vim
new file mode 100644
index 0000000..7bf5cd6
--- /dev/null
+++ b/runtime/keymap/persian.vim
@@ -0,0 +1,8 @@
+let encoding = &enc
+if encoding == ''
+ let encoding = 'utf-8'
+endif
+
+if encoding == 'utf-8'
+ source <sfile>:p:h/persian-iranian_utf-8.vim
+endif
diff --git a/runtime/keymap/pinyin.vim b/runtime/keymap/pinyin.vim
new file mode 100644
index 0000000..253814c
--- /dev/null
+++ b/runtime/keymap/pinyin.vim
@@ -0,0 +1,54 @@
+" Vim Keymap file for Hanyu Pinyin tone marks through numbers.
+" Maintainer: Fredrik Roubert <fredrik@roubert.name>
+" Last Changed: February 15, 2004
+
+" All characters are given literally.
+scriptencoding utf-8
+
+" Use this short name in the status line.
+let b:keymap_name = "py"
+
+loadkeymap
+a0 a
+a1 ā
+a2 á
+a3 ǎ
+a4 à
+a5 a
+e0 e
+e1 ē
+e2 é
+e3 ě
+e4 è
+e5 e
+i0 i
+i1 ī
+i2 í
+i3 ǐ
+i4 ì
+i5 i
+o0 o
+o1 ō
+o2 ó
+o3 ǒ
+o4 ò
+o5 o
+u0 u
+u1 ū
+u2 ú
+u3 ǔ
+u4 ù
+u5 u
+ü0 ü
+ü1 ǖ
+ü2 ǘ
+ü3 ǚ
+ü4 ǜ
+ü5 ü
+v0 ü
+v1 ǖ
+v2 ǘ
+v3 ǚ
+v4 ǜ
+v5 ü
+
diff --git a/runtime/keymap/polish-slash.vim b/runtime/keymap/polish-slash.vim
new file mode 100644
index 0000000..a430078
--- /dev/null
+++ b/runtime/keymap/polish-slash.vim
@@ -0,0 +1,27 @@
+" Polish letters under VIM >= 6
+" Maintainer: HS6_06 <hs6_06@o2.pl>
+" Last changed: 2005 Jan 12
+" Current version: 1.0.2
+" History:
+" 2005.01.12 1.0.2 keymap_name shortened, added Current version, History
+" 2005.01.10 1.0.1 un*x line ends for all files
+" 2005.01.09 1.0.0 Initial release
+
+let encoding = &enc
+if encoding == 'latin1'
+ if has("unix")
+ let encoding = 'iso-8859-2'
+ else
+ let encoding = 'cp1250'
+ endif
+endif
+
+if encoding == 'utf-8'
+ source <sfile>:p:h/polish-slash_utf-8.vim
+elseif encoding == 'cp1250'
+ source <sfile>:p:h/polish-slash_cp1250.vim
+elseif encoding == 'iso-8859-2'
+ source <sfile>:p:h/polish-slash_iso-8859-2.vim
+else
+ source <sfile>:p:h/polish-slash_cp852.vim
+endif
diff --git a/runtime/keymap/polish-slash_cp1250.vim b/runtime/keymap/polish-slash_cp1250.vim
new file mode 100644
index 0000000..4ef2b22
--- /dev/null
+++ b/runtime/keymap/polish-slash_cp1250.vim
@@ -0,0 +1,40 @@
+" Polish letters keymap for cp1250
+" Maintainer: HS6_06 <hs6_06@o2.pl>
+" Last Changed: 2005 Jan 12
+" Current version: 1.0.2
+" History: see polish-slash.vim
+
+" This keymap adds the special Polish letters
+" to an existing Latin keyboard.
+" All chars as usual except:
+" Polish:
+" instead of AltGr+{acelnosxz} you ve to use "/" followed by {acelnosxz}
+
+" short keymap name for statusline
+let b:keymap_name = "PL-slash-WIN"
+
+scriptencoding latin1
+
+loadkeymap
+
+" Polish letters
+/a <Char-185> " LATIN SMALL LETTER A WITH OGONEK
+/c <Char-230> " LATIN SMALL LETTER C WITH ACUTE
+/e <Char-234> " LATIN SMALL LETTER E WITH OGONEK
+/l <Char-179> " LATIN SMALL LETTER L WITH STROKE
+/n <Char-241> " LATIN SMALL LETTER N WITH ACUTE
+/o <Char-243> " LATIN SMALL LETTER O WITH ACUTE
+/s <Char-156> " LATIN SMALL LETTER S WITH ACUTE
+/x <Char-159> " LATIN SMALL LETTER Z WITH ACUTE
+/z <Char-191> " LATIN SMALL LETTER Z WITH DOT ABOVE
+
+/A <Char-165> " LATIN CAPITAL LETTER A WITH OGONEK
+/C <Char-198> " LATIN CAPITAL LETTER C WITH ACUTE
+/E <Char-202> " LATIN CAPITAL LETTER E WITH OGONEK
+/L <Char-163> " LATIN CAPITAL LETTER L WITH STROKE
+/N <Char-209> " LATIN CAPITAL LETTER N WITH ACUTE
+/O <Char-211> " LATIN CAPITAL LETTER O WITH ACUTE
+/S <Char-140> " LATIN CAPITAL LETTER S WITH ACUTE
+/X <Char-143> " LATIN CAPITAL LETTER Z WITH ACUTE
+/Z <Char-175> " LATIN CAPITAL LETTER Z WITH DOT ABOVE
+
diff --git a/runtime/keymap/polish-slash_cp852.vim b/runtime/keymap/polish-slash_cp852.vim
new file mode 100644
index 0000000..22c1809
--- /dev/null
+++ b/runtime/keymap/polish-slash_cp852.vim
@@ -0,0 +1,40 @@
+" Polish letters keymap for cp852
+" Maintainer: HS6_06 <hs6_06@o2.pl>
+" Last Changed: 2005 Jan 12
+" Current version: 1.0.2
+" History: see polish-slash.vim
+
+" This keymap adds the special Polish letters
+" to an existing Latin keyboard.
+" All chars as usual except:
+" Polish:
+" instead of AltGr+{acelnosxz} you ve to use "/" followed by {acelnosxz}
+
+" short keymap name for statusline
+let b:keymap_name = "PL-slash-DOS"
+
+scriptencoding latin1
+
+loadkeymap
+
+" Polish letters
+/a <Char-165> " LATIN SMALL LETTER A WITH OGONEK
+/c <Char-134> " LATIN SMALL LETTER C WITH ACUTE
+/e <Char-169> " LATIN SMALL LETTER E WITH OGONEK
+/l <Char-136> " LATIN SMALL LETTER L WITH STROKE
+/n <Char-228> " LATIN SMALL LETTER N WITH ACUTE
+/o <Char-162> " LATIN SMALL LETTER O WITH ACUTE
+/s <Char-152> " LATIN SMALL LETTER S WITH ACUTE
+/x <Char-171> " LATIN SMALL LETTER Z WITH ACUTE
+/z <Char-190> " LATIN SMALL LETTER Z WITH DOT ABOVE
+
+/A <Char-164> " LATIN CAPITAL LETTER A WITH OGONEK
+/C <Char-143> " LATIN CAPITAL LETTER C WITH ACUTE
+/E <Char-168> " LATIN CAPITAL LETTER E WITH OGONEK
+/L <Char-157> " LATIN CAPITAL LETTER L WITH STROKE
+/N <Char-227> " LATIN CAPITAL LETTER N WITH ACUTE
+/O <Char-224> " LATIN CAPITAL LETTER O WITH ACUTE
+/S <Char-151> " LATIN CAPITAL LETTER S WITH ACUTE
+/X <Char-141> " LATIN CAPITAL LETTER Z WITH ACUTE
+/Z <Char-189> " LATIN CAPITAL LETTER Z WITH DOT ABOVE
+
diff --git a/runtime/keymap/polish-slash_iso-8859-2.vim b/runtime/keymap/polish-slash_iso-8859-2.vim
new file mode 100644
index 0000000..3a1203a
--- /dev/null
+++ b/runtime/keymap/polish-slash_iso-8859-2.vim
@@ -0,0 +1,40 @@
+" Polish letters keymap for iso-8859-2
+" Maintainer: HS6_06 <hs6_06@o2.pl>
+" Last Changed: 2005 Jan 12
+" Current version: 1.0.2
+" History: polish-slash.vim
+
+" This keymap adds the special Polish letters
+" to an existing Latin keyboard.
+" All chars as usual except:
+" Polish:
+" instead of AltGr+{acelnosxz} you ve to use "/" followed by {acelnosxz}
+
+" short keymap name for statusline
+let b:keymap_name = "PL-slash-ISO"
+
+scriptencoding latin1
+
+loadkeymap
+
+" Polish letters
+/a <Char-177> " LATIN SMALL LETTER A WITH OGONEK
+/c <Char-230> " LATIN SMALL LETTER C WITH ACUTE
+/e <Char-234> " LATIN SMALL LETTER E WITH OGONEK
+/l <Char-179> " LATIN SMALL LETTER L WITH STROKE
+/n <Char-241> " LATIN SMALL LETTER N WITH ACUTE
+/o <Char-243> " LATIN SMALL LETTER O WITH ACUTE
+/s <Char-182> " LATIN SMALL LETTER S WITH ACUTE
+/x <Char-188> " LATIN SMALL LETTER Z WITH ACUTE
+/z <Char-191> " LATIN SMALL LETTER Z WITH DOT ABOVE
+
+/A <Char-161> " LATIN CAPITAL LETTER A WITH OGONEK
+/C <Char-198> " LATIN CAPITAL LETTER C WITH ACUTE
+/E <Char-202> " LATIN CAPITAL LETTER E WITH OGONEK
+/L <Char-163> " LATIN CAPITAL LETTER L WITH STROKE
+/N <Char-209> " LATIN CAPITAL LETTER N WITH ACUTE
+/O <Char-211> " LATIN CAPITAL LETTER O WITH ACUTE
+/S <Char-166> " LATIN CAPITAL LETTER S WITH ACUTE
+/X <Char-172> " LATIN CAPITAL LETTER Z WITH ACUTE
+/Z <Char-175> " LATIN CAPITAL LETTER Z WITH DOT ABOVE
+
diff --git a/runtime/keymap/polish-slash_utf-8.vim b/runtime/keymap/polish-slash_utf-8.vim
new file mode 100644
index 0000000..3a4eb70
--- /dev/null
+++ b/runtime/keymap/polish-slash_utf-8.vim
@@ -0,0 +1,40 @@
+" Polish letters keymap for utf-8
+" Maintainer: HS6_06 <hs6_06@o2.pl>
+" Last Changed: 2005 Jan 12
+" Current version: 1.0.2
+" History: see polish-slash.vim
+
+" This keymap adds the special Polish letters
+" to an existing Latin keyboard.
+" All chars as usual except:
+" Polish:
+" instead of AltGr+{acelnosxz} you ve to use "/" followed by {acelnosxz}
+
+" short keymap name for statusline
+let b:keymap_name = "PL-slash-UTF"
+
+scriptencoding latin1
+
+loadkeymap
+
+" Polish letters
+/a <Char-0x0105> " LATIN SMALL LETTER A WITH OGONEK
+/c <Char-0x0107> " LATIN SMALL LETTER C WITH ACUTE
+/e <Char-0x0119> " LATIN SMALL LETTER E WITH OGONEK
+/l <Char-0x0142> " LATIN SMALL LETTER L WITH STROKE
+/n <Char-0x0144> " LATIN SMALL LETTER N WITH ACUTE
+/o <Char-0x00f3> " LATIN SMALL LETTER O WITH ACUTE
+/s <Char-0x015b> " LATIN SMALL LETTER S WITH ACUTE
+/x <Char-0x017a> " LATIN SMALL LETTER Z WITH ACUTE
+/z <Char-0x017c> " LATIN SMALL LETTER Z WITH DOT ABOVE
+
+/A <Char-0x0104> " LATIN CAPITAL LETTER A WITH OGONEK
+/C <Char-0x0106> " LATIN CAPITAL LETTER C WITH ACUTE
+/E <Char-0x0118> " LATIN CAPITAL LETTER E WITH OGONEK
+/L <Char-0x0141> " LATIN CAPITAL LETTER L WITH STROKE
+/N <Char-0x0143> " LATIN CAPITAL LETTER N WITH ACUTE
+/O <Char-0x00d3> " LATIN CAPITAL LETTER O WITH ACUTE
+/S <Char-0x015a> " LATIN CAPITAL LETTER S WITH ACUTE
+/X <Char-0x0179> " LATIN CAPITAL LETTER Z WITH ACUTE
+/Z <Char-0x017b> " LATIN CAPITAL LETTER Z WITH DOT ABOVE
+
diff --git a/runtime/keymap/russian-dvorak.vim b/runtime/keymap/russian-dvorak.vim
new file mode 100644
index 0000000..498ffa1
--- /dev/null
+++ b/runtime/keymap/russian-dvorak.vim
@@ -0,0 +1,89 @@
+" Vim Keymap file for russian characters, layout 'dvorak', MS Windows variant
+" Derived from russian-jcuken.vim by Artem Chuprina <ran@ran.pp.ru>
+" Useful mainly with utf-8 but may work with other encodings
+
+" Maintainer: Serhiy Boiko <cris.kiev@gmail.com>
+" Last Changed: 2007 Jun 29
+
+" 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
+U А CYRILLIC CAPITAL LETTER A
+W Б CYRILLIC CAPITAL LETTER BE
+E В CYRILLIC CAPITAL LETTER VE
+G Г CYRILLIC CAPITAL LETTER GHE
+N Д CYRILLIC CAPITAL LETTER DE
+Y Е CYRILLIC CAPITAL LETTER IE
+S Ж CYRILLIC CAPITAL LETTER ZHE
+L З CYRILLIC CAPITAL LETTER ZE
+X И CYRILLIC CAPITAL LETTER I
+\" Й CYRILLIC CAPITAL LETTER SHORT I
+P К CYRILLIC CAPITAL LETTER KA
+T Л CYRILLIC CAPITAL LETTER EL
+K М CYRILLIC CAPITAL LETTER EM
+F Н CYRILLIC CAPITAL LETTER EN
+H О CYRILLIC CAPITAL LETTER O
+I П CYRILLIC CAPITAL LETTER PE
+D Р CYRILLIC CAPITAL LETTER ER
+J С CYRILLIC CAPITAL LETTER ES
+B Т CYRILLIC CAPITAL LETTER TE
+> У CYRILLIC CAPITAL LETTER U
+A Ф CYRILLIC CAPITAL LETTER EF
+? Х CYRILLIC CAPITAL LETTER HA
+< Ц CYRILLIC CAPITAL LETTER TSE
+Q Ч CYRILLIC CAPITAL LETTER CHE
+C Ш CYRILLIC CAPITAL LETTER SHA
+R Щ CYRILLIC CAPITAL LETTER SHCHA
++ Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+O Ы CYRILLIC CAPITAL LETTER YERU
+M Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+_ Э CYRILLIC CAPITAL LETTER E
+V Ю CYRILLIC CAPITAL LETTER YU
+: Я CYRILLIC CAPITAL LETTER YA
+u а CYRILLIC SMALL LETTER A
+w б CYRILLIC SMALL LETTER BE
+e в CYRILLIC SMALL LETTER VE
+g г CYRILLIC SMALL LETTER GHE
+n д CYRILLIC SMALL LETTER DE
+y е CYRILLIC SMALL LETTER IE
+s ж CYRILLIC SMALL LETTER ZHE
+l з CYRILLIC SMALL LETTER ZE
+x и CYRILLIC SMALL LETTER I
+' й CYRILLIC SMALL LETTER SHORT I
+p к CYRILLIC SMALL LETTER KA
+t л CYRILLIC SMALL LETTER EL
+k м CYRILLIC SMALL LETTER EM
+f н CYRILLIC SMALL LETTER EN
+h о CYRILLIC SMALL LETTER O
+i п CYRILLIC SMALL LETTER PE
+d р CYRILLIC SMALL LETTER ER
+j с CYRILLIC SMALL LETTER ES
+b т CYRILLIC SMALL LETTER TE
+. у CYRILLIC SMALL LETTER U
+a ф CYRILLIC SMALL LETTER EF
+/ х CYRILLIC SMALL LETTER HA
+, ц CYRILLIC SMALL LETTER TSE
+q ч CYRILLIC SMALL LETTER CHE
+c ш CYRILLIC SMALL LETTER SHA
+r щ CYRILLIC SMALL LETTER SHCHA
+= ъ CYRILLIC SMALL LETTER HARD SIGN
+o ы CYRILLIC SMALL LETTER YERU
+m ь CYRILLIC SMALL LETTER SOFT SIGN
+- э CYRILLIC SMALL LETTER E
+v ю CYRILLIC SMALL LETTER YU
+; я CYRILLIC SMALL LETTER YA
+@ "
+# № NUMERO SIGN
+$ ;
+^ :
+& ?
+z .
+Z ,
+[ -
+] =
diff --git a/runtime/keymap/russian-jcuken.vim b/runtime/keymap/russian-jcuken.vim
new file mode 100644
index 0000000..840ec8c
--- /dev/null
+++ b/runtime/keymap/russian-jcuken.vim
@@ -0,0 +1,87 @@
+" Vim Keymap file for russian characters, layout 'jcuken', classical variant
+" (compatible with XFree86 'ru' keymap)
+" Useful mainly with utf-8 but may work with other encodings
+
+" Maintainer: Artem Chuprina <ran@ran.pp.ru>
+" Last Changed: 2001 Jun 23
+
+" 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/russian-jcukenmac.vim b/runtime/keymap/russian-jcukenmac.vim
new file mode 100644
index 0000000..e2120ca
--- /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/russian-jcukenwin.vim b/runtime/keymap/russian-jcukenwin.vim
new file mode 100644
index 0000000..d56470f
--- /dev/null
+++ b/runtime/keymap/russian-jcukenwin.vim
@@ -0,0 +1,87 @@
+" Vim Keymap file for russian characters, layout 'jcuken', MS Windows variant
+" (slightly incompatible with XFree86 'ru' keymap - makes use of NUMERO SIGN)
+" Useful mainly with utf-8 but may work with other encodings
+
+" Maintainer: Artem Chuprina <ran@ran.pp.ru>
+" Last Changed: 2001 Jun 23
+
+" 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
+@ "
+# № NUMERO SIGN
+$ ;
+^ :
+& ?
+/ .
+? ,
diff --git a/runtime/keymap/russian-jcukenwintype.vim b/runtime/keymap/russian-jcukenwintype.vim
new file mode 100644
index 0000000..2d5856a
--- /dev/null
+++ b/runtime/keymap/russian-jcukenwintype.vim
@@ -0,0 +1,112 @@
+" Vim Keymap file for russian characters, layout 'jcuken', MS Windows
+" Typewriter variant (slightly incompatible with XFree86 'ru' keymap -
+" makes use of NUMERO SIGN)
+" Useful mainly with utf-8 but may work with other encodings
+
+" Derived from russian-jcuken.vim by Artem Chuprina <ran@ran.pp.ru>
+" Typewriter variant of standard russian layout
+" Maintainer: Denis Proskurin <danwerspb@gmail.com>
+" Last Changed: 2015 May 15
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+
+scriptencoding utf-8
+
+let b:keymap_name = "ru"
+
+loadkeymap
+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 IO
+: Ж 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 IO
+; ж 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
+` |
+1 №
+2 -
+3 /
+4 "
+5 :
+6 ,
+7 .
+8 _
+9 ?
+0 %
+- !
+= ;
+~ +
+! 1
+@ 2
+# 3
+$ 4
+% 5
+^ 6
+& 7
+* 8
+( 9
+) 0
+_ =
++ \\
+\\ )
+\| (
diff --git a/runtime/keymap/russian-typograph.vim b/runtime/keymap/russian-typograph.vim
new file mode 100644
index 0000000..e0fbf22
--- /dev/null
+++ b/runtime/keymap/russian-typograph.vim
@@ -0,0 +1,190 @@
+" Vim Keymap file for Russian characters
+" layout English-US standard 104 key 'QWERTY', 'JCUKEN'
+"
+" Maintainer: Restorer <restorers@users.sourceforge.net>
+" Last Changed: 20 Jan 2019
+" Description: Раскладка сделана на основе раскладки «русская машинопись»
+" (KBDRU1.DLL), поставляемой в составе ОС MS Windows. Эта раскладка позволяет
+" печать практически все знаки препинания используя цифровой ряд и не требуя при
+" этом нажатия дополнительных клавиш, ну и также удобное расположение буквы «Ё».
+" Однако были внесены некоторые дополнения (улучшения?), в частности:
+" ‐ раздельные символы круглых скобок (), расположены на тех же позициях, что и
+" в US-International;
+" ‐ раздельные символы типографских кавычек «», расположены на клавишах «3» и
+" «4» соответственно;
+" ‐ на этих же клавишах находятся внутренние кавычки “лапки”, набираемые при
+" нажатой клавише «ALT»;
+" ‐ возможность набирать символы, отсутствующие в русской раскладке клавиатуры,
+" а именно @#$^&*{}[]"'`~<>, которые расположены на тех же местах, что и раньше.
+" Для этого не требуется переключаться в латинскую раскладку клавиатуры, а
+" оставаясь в русской, использовать для этого дополнительные клавиши «SHIFT» и
+" «ALT»;
+" ‐ и ещё несколько удобств, которые позволяют быстро и с минимальными усилиями
+" набирать текст.
+
+scriptencoding utf-8
+
+" Переключение языка ввода со стандартного сочетания <CTRL+^> на указанные ниже
+" Для режимов вставки и замены
+""или SHIFT+SPACE
+" inoremap <S-Space> <C-^>
+""или CTRL+SPACE"
+" inoremap <C-Space> <C-^>
+" Для режима командной строки
+""или SHIFT+SPACE
+" cnoremap <S-Space> <C-^>
+""или CTRL+SPACE"
+" cnoremap <C-Space> <C-^>
+" Одной командой для режимов вставки, замены и командной строки
+" noremap! <S-Space> <C-^>
+" noremap! <C-Space> <C-^>
+"
+" Стандартное переключение по CTRL+^ после этих переназначений также сохраняется
+
+let b:keymap_name ="RUS"
+
+loadkeymap
+
+" DIGITAL ROW
+
+" The Shift key is not pressed
+"
+<char-0x0060> <char-0x0025> " PERCENT SIGN
+<char-0x0031> <char-0x0021> " EXCLAMATION MARK
+<char-0x0032> <char-0x2014> " EM DASH
+<char-0x0033> <char-0x00ab> " LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+<char-0x0034> <char-0x00bb> " RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+<char-0x0035> <char-0x003a> " COLON
+<char-0x0036> <char-0x002c> " COMMA
+<char-0x0037> <char-0x002e> " FULL STOP
+<char-0x0038> <char-0x003f> " QUESTION MARK
+<char-0x0039> <char-0x0028> " LEFT PARENTHESIS
+<char-0x0030> <char-0x0029> " RIGHT PARENTHESIS
+<char-0x002d> <char-0x2010> " HYPHEN
+<char-0x003d> <char-0x003b> " SEMICOLON
+
+" The Shift key is pressed
+
+<char-0x007e> <char-0x003d> " EQUALS SIGN
+<char-0x0021> <char-0x0031> " DIGIT ONE
+<char-0x0040> <char-0x0032> " DIGIT TWO
+<char-0x0023> <char-0x0033> " DIGIT THREE
+<char-0x0024> <char-0x0034> " DIGIT FOUR
+<char-0x0025> <char-0x0035> " DIGIT FIVE
+<char-0x005e> <char-0x0036> " DIGIT SIX
+<char-0x0026> <char-0x0037> " DIGIT SEVEN
+<char-0x002a> <char-0x0038> " DIGIT EIGHT
+<char-0x0028> <char-0x0039> " DIGIT NINE
+<char-0x0029> <char-0x0030> " DIGIT ZERO
+<char-0x005f> <char-0x002d> " HYPHEN-MINUS
+<char-0x002b> <char-0x002b> " PLUS SIGN
+
+" ALPHABETICAL 1st ROW
+
+<char-0x0071> <char-0x0439> " CYRILLIC SMALL LETTER SHORT I
+<char-0x0051> <char-0x0419> " CYRILLIC CAPITAL LETTER SHORT I
+<char-0x0077> <char-0x0446> " CYRILLIC SMALL LETTER TSE
+<char-0x0057> <char-0x0426> " CYRILLIC CAPITAL LETTER TSE
+<char-0x0065> <char-0x0443> " CYRILLIC SMALL LETTER U
+<char-0x0045> <char-0x0423> " CYRILLIC CAPITAL LETTER U
+<char-0x0072> <char-0x043a> " CYRILLIC SMALL LETTER KA
+<char-0x0052> <char-0x041a> " CYRILLIC CAPITAL LETTER KA
+<char-0x0074> <char-0x0435> " CYRILLIC SMALL LETTER IE
+<char-0x0054> <char-0x0415> " CYRILLIC CAPITAL LETTER IE
+<char-0x0079> <char-0x043d> " CYRILLIC SMALL LETTER EN
+<char-0x0059> <char-0x041d> " CYRILLIC CAPITAL LETTER EN
+<char-0x0075> <char-0x0433> " CYRILLIC SMALL LETTER GHE
+<char-0x0055> <char-0x0413> " CYRILLIC CAPITAL LETTER GHE
+<char-0x0069> <char-0x0448> " CYRILLIC SMALL LETTER SHA
+<char-0x0049> <char-0x0428> " CYRILLIC CAPITAL LETTER SHA
+<char-0x006f> <char-0x0449> " CYRILLIC SMALL LETTER SHCHA
+<char-0x004f> <char-0x0429> " CYRILLIC CAPITAL LETTER SHCHA
+<char-0x0070> <char-0x0437> " CYRILLIC SMALL LETTER ZE
+<char-0x0050> <char-0x0417> " CYRILLIC CAPITAL LETTER ZE
+<char-0x005b> <char-0x0445> " CYRILLIC SMALL LETTER HA
+<char-0x007b> <char-0x0425> " CYRILLIC CAPITAL LETTER HA
+<char-0x005d> <char-0x044a> " CYRILLIC SMALL LETTER HARD SIGN
+<char-0x007d> <char-0x042a> " CYRILLIC CAPITAL LETTER HARD SIGN
+
+" ALPHABETIC 2nd ROW
+
+<char-0x0061> <char-0x0444> " CYRILLIC SMALL LETTER EF
+<char-0x0041> <char-0x0424> " CYRILLIC CAPITAL LETTER EF
+<char-0x0073> <char-0x044b> " CYRILLIC SMALL LETTER YERU
+<char-0x0053> <char-0x042b> " CYRILLIC CAPITAL LETTER YERU
+<char-0x0064> <char-0x0432> " CYRILLIC SMALL LETTER VE
+<char-0x0044> <char-0x0412> " CYRILLIC CAPITAL LETTER VE
+<char-0x0066> <char-0x0430> " CYRILLIC SMALL LETTER A
+<char-0x0046> <char-0x0410> " CYRILLIC CAPITAL LETTER A
+<char-0x0067> <char-0x043f> " CYRILLIC SMALL LETTER PE
+<char-0x0047> <char-0x041f> " CYRILLIC CAPITAL LETTER PE
+<char-0x0068> <char-0x0440> " CYRILLIC SMALL LETTER ER
+<char-0x0048> <char-0x0420> " CYRILLIC CAPITAL LETTER ER
+<char-0x006a> <char-0x043e> " CYRILLIC SMALL LETTER O
+<char-0x004a> <char-0x041e> " CYRILLIC CAPITAL LETTER O
+<char-0x006b> <char-0x043b> " CYRILLIC SMALL LETTER EL
+<char-0x004b> <char-0x041b> " CYRILLIC CAPITAL LETTER EL
+<char-0x006c> <char-0x0434> " CYRILLIC SMALL LETTER DE
+<char-0x004c> <char-0x0414> " CYRILLIC CAPITAL LETTER DE
+<char-0x003b> <char-0x0436> " CYRILLIC SMALL LETTER ZHE
+<char-0x003a> <char-0x0416> " CYRILLIC CAPITAL LETTER ZHE
+<char-0x0027> <char-0x044d> " CYRILLIC SMALL LETTER E
+<char-0x0022> <char-0x042d> " CYRILLIC CAPITAL LETTER E
+
+" ALPHABETIC 3rd ROW
+
+<char-0x007a> <char-0x044f> " CYRILLIC SMALL LETTER YA
+<char-0x005a> <char-0x042f> " CYRILLIC CAPITAL LETTER YA
+<char-0x0078> <char-0x0447> " CYRILLIC SMALL LETTER CHE
+<char-0x0058> <char-0x0427> " CYRILLIC CAPITAL LETTER CHE
+<char-0x0063> <char-0x0441> " CYRILLIC SMALL LETTER ES
+<char-0x0043> <char-0x0421> " CYRILLIC CAPITAL LETTER ES
+<char-0x0076> <char-0x043c> " CYRILLIC SMALL LETTER EM
+<char-0x0056> <char-0x041c> " CYRILLIC CAPITAL LETTER EM
+<char-0x0062> <char-0x0438> " CYRILLIC SMALL LETTER I
+<char-0x0042> <char-0x0418> " CYRILLIC CAPITAL LETTER I
+<char-0x006e> <char-0x0442> " CYRILLIC SMALL LETTER TE
+<char-0x004e> <char-0x0422> " CYRILLIC CAPITAL LETTER TE
+<char-0x006d> <char-0x044c> " CYRILLIC SMALL LETTER SOFT SIGN
+<char-0x004d> <char-0x042c> " CYRILLIC CAPITAL LETTER SOFT SIGN
+<char-0x002c> <char-0x0431> " CYRILLIC SMALL LETTER BE
+<char-0x003c> <char-0x0411> " CYRILLIC CAPITAL LETTER BE
+<char-0x002e> <char-0x044e> " CYRILLIC SMALL LETTER YU
+<char-0x003e> <char-0x042e> " CYRILLIC CAPITAL LETTER YU
+<char-0x002f> <char-0x0451> " CYRILLIC SMALL LETTER IO
+<char-0x003f> <char-0x0401> " CYRILLIC CAPITAL LETTER IO
+
+" VK_OEM_5 key (scan code 2b)
+
+" The Shift key is not pressed
+<char-0x005c> <char-0x002f> " SOLIDUS
+" The Shift key is pressed
+<char-0x007c> <char-0x005c> " REVERSE SOLIDUS
+
+" Alt key pressed
+
+<A-char-0x0060> <char-0x0060> " GRAVE ACCENT
+<A-char-0x0031> <char-0x2116> " NUMERO SIGN
+<A-char-0x0033> <char-0x201c> " LEFT DOUBLE QUOTATION MARK
+<A-char-0x0034> <char-0x201d> " RIGHT DOUBLE QUOTATION MARK
+<A-char-0x005b> <char-0x005b> " LEFT SQUARE BRACKET
+<A-char-0x005d> <char-0x005d> " RIGHT SQUARE BRACKET
+<A-char-0x0027> <char-0x0027> " APOSTROPHE
+
+" Alt and Shift keys pressed
+
+<A-char-0x007e> <char-0x007e> " TILDE
+<A-char-0x0040> <char-0x0040> " COMMERCIAL AT
+<A-char-0x0023> <char-0x0023> " NUMBER SIGN
+<A-char-0x0024> <char-0x0024> " DOLLAR SIGN
+<A-char-0x005e> <char-0x005e> " CIRCUMFLEX ACCENT
+<A-char-0x0026> <char-0x0026> " AMPERSAND
+<A-char-0x002a> <char-0x002a> " ASTERISK
+<A-char-0x005f> <char-0x005f> " LOW LINE
+<A-char-0x007b> <char-0x007b> " LEFT CURLY BRACKET
+<A-char-0x007d> <char-0x007d> " RIGHT CURLY BRACKET
+<A-char-0x0022> <char-0x0022> " QUOTATION MARK
+<A-char-0x003c> <char-0x003c> " LESS-THAN SIGN
+<A-char-0x003e> <char-0x003e> " GREATER-THAN SIGN
+<A-char-0x007c> <char-0x007c> " VERTICAL LINE
+
diff --git a/runtime/keymap/russian-yawerty.vim b/runtime/keymap/russian-yawerty.vim
new file mode 100644
index 0000000..64949ff
--- /dev/null
+++ b/runtime/keymap/russian-yawerty.vim
@@ -0,0 +1,79 @@
+" Vim Keymap file for russian characters, phonetic layout 'yawerty'
+" Useful mainly with utf-8 but may work with other encodings
+
+" Maintainer: Igor Goldenberg <igogold@gmail.com>
+" Last Changed: 2007 Aug 15
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding utf-8
+
+let b:keymap_name = "ru"
+
+loadkeymap
+A А CYRILLIC CAPITAL LETTER A
+B Б CYRILLIC CAPITAL LETTER BE
+W В CYRILLIC CAPITAL LETTER VE
+G Г CYRILLIC CAPITAL LETTER GHE
+D Д CYRILLIC CAPITAL LETTER DE
+E Е CYRILLIC CAPITAL LETTER IE
+$ Ё CYRILLIC CAPITAL LETTER IO
+V Ж CYRILLIC CAPITAL LETTER ZHE
+Z З CYRILLIC CAPITAL LETTER ZE
+I И CYRILLIC CAPITAL LETTER I
+J Й CYRILLIC CAPITAL LETTER SHORT I
+K К CYRILLIC CAPITAL LETTER KA
+L Л CYRILLIC CAPITAL LETTER EL
+M М CYRILLIC CAPITAL LETTER EM
+N Н CYRILLIC CAPITAL LETTER EN
+O О CYRILLIC CAPITAL LETTER O
+P П CYRILLIC CAPITAL LETTER PE
+R Р CYRILLIC CAPITAL LETTER ER
+S С CYRILLIC CAPITAL LETTER ES
+T Т CYRILLIC CAPITAL LETTER TE
+U У CYRILLIC CAPITAL LETTER U
+F Ф CYRILLIC CAPITAL LETTER EF
+H Х CYRILLIC CAPITAL LETTER HA
+C Ц CYRILLIC CAPITAL LETTER TSE
++ Ч CYRILLIC CAPITAL LETTER CHE
+{ Ш CYRILLIC CAPITAL LETTER SHA
+} Щ CYRILLIC CAPITAL LETTER SHCHA
+^ Ъ CYRILLIC CAPITAL LETTER HARD SIGN
+Y Ы CYRILLIC CAPITAL LETTER YERU
+X Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+| Э CYRILLIC CAPITAL LETTER E
+~ Ю CYRILLIC CAPITAL LETTER YU
+Q Я CYRILLIC CAPITAL LETTER YA
+a а CYRILLIC SMALL LETTER A
+b б CYRILLIC SMALL LETTER BE
+w в CYRILLIC SMALL LETTER VE
+g г CYRILLIC SMALL LETTER GHE
+d д CYRILLIC SMALL LETTER DE
+e е CYRILLIC SMALL LETTER IE
+# ё CYRILLIC SMALL LETTER IO
+v ж CYRILLIC SMALL LETTER ZHE
+z з CYRILLIC SMALL LETTER ZE
+i и CYRILLIC SMALL LETTER I
+j й CYRILLIC SMALL LETTER SHORT I
+k к CYRILLIC SMALL LETTER KA
+l л CYRILLIC SMALL LETTER EL
+m м CYRILLIC SMALL LETTER EM
+n н CYRILLIC SMALL LETTER EN
+o о CYRILLIC SMALL LETTER O
+p п CYRILLIC SMALL LETTER PE
+r р CYRILLIC SMALL LETTER ER
+s с CYRILLIC SMALL LETTER ES
+t т CYRILLIC SMALL LETTER TE
+u у CYRILLIC SMALL LETTER U
+f ф CYRILLIC SMALL LETTER EF
+h х CYRILLIC SMALL LETTER HA
+c ц CYRILLIC SMALL LETTER TSE
+= ч CYRILLIC SMALL LETTER CHE
+[ ш CYRILLIC SMALL LETTER SHA
+] щ CYRILLIC SMALL LETTER SHCHA
+% ъ CYRILLIC SMALL LETTER HARD SIGN
+y ы CYRILLIC SMALL LETTER YERU
+x ь CYRILLIC SMALL LETTER SOFT SIGN
+\\ э CYRILLIC SMALL LETTER E
+` ю CYRILLIC SMALL LETTER YU
+q я CYRILLIC SMALL LETTER YA
diff --git a/runtime/keymap/serbian-latin.vim b/runtime/keymap/serbian-latin.vim
new file mode 100644
index 0000000..0d2de15
--- /dev/null
+++ b/runtime/keymap/serbian-latin.vim
@@ -0,0 +1 @@
+source <sfile>:p:h/serbian-latin_utf-8.vim
diff --git a/runtime/keymap/serbian-latin_utf-8.vim b/runtime/keymap/serbian-latin_utf-8.vim
new file mode 100644
index 0000000..a1b577a
--- /dev/null
+++ b/runtime/keymap/serbian-latin_utf-8.vim
@@ -0,0 +1,44 @@
+" Vim Keymap file for Serbian characters, classical variant, UTF-8 encoding
+"
+" Maintainer: Aleksandar Veselinovic <aleksa@cs.cmu.edu>
+" URL: http://www.cs.cmu.edu/~aleksa/personal/vim/keymap/serbian-latin-UTF-8.vim
+" Last Changed: 2002 Mar 29
+
+scriptencoding UTF-8
+
+let b:keymap_name = "serbian-UTF-8"
+
+loadkeymap
+Y Z
+{ Š
+} Đ
+y z
+[ š
+] đ
+: Č
+\" Ć
+\| Ž
+; č
+' ć
+\\ ž
+"Z Y
+"z y
+< ;
+> :
+/ -
+_ ?
+,, „
+'' ”
+
+E$ <char-0x20AC> " EURO SIGN
+-- <char-0x2013> " endash
+--- <char-0x2014> " emdash
+
+" @ "
+" # '
+" $ *
+" % :
+" ^ ,
+" &amp; .
+" * ;
+
diff --git a/runtime/keymap/serbian.vim b/runtime/keymap/serbian.vim
new file mode 100644
index 0000000..56d247c
--- /dev/null
+++ b/runtime/keymap/serbian.vim
@@ -0,0 +1,20 @@
+let encoding = &enc
+if encoding == 'latin1'
+ if has("unix")
+ let encoding = 'iso-8859-2'
+ else
+ let encoding = 'cp1250'
+ endif
+endif
+
+if encoding == 'utf-8'
+ source <sfile>:p:h/serbian_utf-8.vim
+elseif encoding == 'cp1250'
+ source <sfile>:p:h/serbian_cp1250.vim
+elseif encoding == 'cp1251'
+ source <sfile>:p:h/serbian_cp1251.vim
+elseif encoding == 'iso-8859-2'
+ source <sfile>:p:h/serbian_iso-8859-2.vim
+else
+ source <sfile>:p:h/serbian_iso-8859-5.vim
+endif
diff --git a/runtime/keymap/serbian_cp1250.vim b/runtime/keymap/serbian_cp1250.vim
new file mode 100644
index 0000000..30f80ad
--- /dev/null
+++ b/runtime/keymap/serbian_cp1250.vim
@@ -0,0 +1,40 @@
+" Vim Keymap file for Serbian characters, classical variant, cp1250 encoding
+"
+" Maintainer: Aleksandar Veselinovic <aleksa@cs.cmu.edu>
+" URL: http://galeb.etf.bg.ac.yu/~alexa/vim/keymap/serbian-cp1250.vim
+" Last Changed: 2002 Mar 29
+
+scriptencoding cp1250
+
+let b:keymap_name = "serbian-cp1250"
+
+loadkeymap
+Y Z
+{
+}
+y z
+[
+]
+:
+\"
+\|
+;
+'
+\\
+"Z Y
+"z y
+< ;
+> :
+/ -
+_ ?
+,,
+''
+
+" @ "
+" # '
+" $ *
+" % :
+" ^ ,
+" &amp; .
+" * ;
+
diff --git a/runtime/keymap/serbian_cp1251.vim b/runtime/keymap/serbian_cp1251.vim
new file mode 100644
index 0000000..0b1ce96
--- /dev/null
+++ b/runtime/keymap/serbian_cp1251.vim
@@ -0,0 +1,90 @@
+" Vim Keymap file for Serbian characters, classical variant, win cp1251
+" encoding
+"
+" Maintainer: Aleksandar Veselinovic <aleksa@cs.cmu.edu>
+" URL: http://www.cs.cmu.edu/~aleksa/personal/vim/keymap/serbian-cp1251.vim
+" Last Changed: 2002 Mar 29
+
+scriptencoding cp1251
+
+let b:keymap_name = "serbian-cp1251"
+
+loadkeymap
+Q
+W
+E
+R
+T
+Y
+U
+I
+O
+P
+{
+}
+q
+w
+e
+r
+t
+y
+u
+i
+o
+p
+[
+]
+A
+S
+D
+F
+G
+H
+J
+K
+L
+:
+\"
+\|
+a
+s
+d
+f
+g
+h
+j
+k
+l
+;
+'
+\\
+"Z
+X
+C
+V
+B
+N
+M
+"z
+x
+c
+v
+b
+n
+m
+
+< ;
+> :
+/ -
+_ ?
+,,
+''
+
+" @ "
+" # '
+" $ *
+" % :
+" ^ ,
+" &amp; .
+" * ;
+
diff --git a/runtime/keymap/serbian_iso-8859-2.vim b/runtime/keymap/serbian_iso-8859-2.vim
new file mode 100644
index 0000000..d3be35e
--- /dev/null
+++ b/runtime/keymap/serbian_iso-8859-2.vim
@@ -0,0 +1,40 @@
+" Vim Keymap file for Serbian characters, classical variant, iso-8859-2 encoding
+"
+" Maintainer: Aleksandar Veselinovic <aleksa@cs.cmu.edu>
+" URL: http://www.cs.cmu.edu/~aleksa/personal/vim/keymap/serbian-iso-8859-2.vim
+" Last Changed: 2002 Mar 29
+
+scriptencoding iso-8859-2
+
+let b:keymap_name = "serbian-iso-8859-2"
+
+loadkeymap
+Y Z
+{
+}
+y z
+[
+]
+:
+\"
+\|
+;
+'
+\\
+"Z Y
+"z y
+< ;
+> :
+/ -
+_ ?
+,, ?
+'' ?
+
+" @ "
+" # '
+" $ *
+" % :
+" ^ ,
+" &amp; .
+" * ;
+
diff --git a/runtime/keymap/serbian_iso-8859-5.vim b/runtime/keymap/serbian_iso-8859-5.vim
new file mode 100644
index 0000000..113383c
--- /dev/null
+++ b/runtime/keymap/serbian_iso-8859-5.vim
@@ -0,0 +1,89 @@
+" Vim Keymap file for Serbian characters, classical variant, iso-8859-5 encoding
+"
+" Maintainer: Aleksandar Veselinovic <aleksa@cs.cmu.edu>
+" URL: http://www.cs.cmu.edu/~aleksa/personal/vim/keymap/serbian-iso-8859-5.vim
+" Last Changed: 2002 Mar 29
+
+scriptencoding iso-8859-5
+
+let b:keymap_name = "serbian-iso-8859-5"
+
+loadkeymap
+Q
+W
+E
+R
+T
+Y
+U
+I
+O
+P
+{
+}
+q
+w
+e
+r
+t
+y
+u
+i
+o
+p
+[
+]
+A
+S
+D
+F
+G
+H
+J
+K
+L
+:
+\"
+\|
+a
+s
+d
+f
+g
+h
+j
+k
+l
+;
+'
+\\
+"Z
+X
+C
+V
+B
+N
+M
+"z
+x
+c
+v
+b
+n
+m
+
+< ;
+> :
+/ -
+_ ?
+,, ?
+'' ?
+
+" @ "
+" # '
+" $ *
+" % :
+" ^ ,
+" & .
+" * ;
+
diff --git a/runtime/keymap/serbian_utf-8.vim b/runtime/keymap/serbian_utf-8.vim
new file mode 100644
index 0000000..3388bfd
--- /dev/null
+++ b/runtime/keymap/serbian_utf-8.vim
@@ -0,0 +1,93 @@
+" Vim Keymap file for Serbian characters, classical variant, UTF-8 encoding
+"
+" Maintainer: Aleksandar Veselinovic <aleksa@cs.cmu.edu>
+" URL: http://www.cs.cmu.edu/~aleksa/personal/vim/keymap/serbian-UTF-8.vim
+" Last Changed: 2002 Mar 29
+
+scriptencoding UTF-8
+
+let b:keymap_name = "serbian-UTF-8"
+
+loadkeymap
+Q Љ
+W Њ
+E Е
+R Р
+T Т
+Y З
+U У
+I И
+O О
+P П
+{ Ш
+} Ђ
+q љ
+w њ
+e е
+r р
+t т
+y з
+u у
+i и
+o о
+p п
+[ ш
+] ђ
+A А
+S С
+D Д
+F Ф
+G Г
+H Х
+J Ј
+K К
+L Л
+: Ч
+\" Ћ
+\| Ж
+a а
+s с
+d д
+f ф
+g г
+h х
+j ј
+k к
+l л
+; ч
+' ћ
+\\ ж
+"Z З
+X Џ
+C Ц
+V В
+B Б
+N Н
+M М
+"z з
+x џ
+c ц
+v в
+b б
+n н
+m м
+
+< ;
+> :
+/ -
+_ ?
+,, „
+'' ”
+
+E$ <char-0x20AC> " EURO SIGN
+-- <char-0x2013> " endash
+--- <char-0x2014> " emdash
+
+" @ "
+" # '
+" $ *
+" % :
+" ^ ,
+" &amp; .
+" * ;
+
diff --git a/runtime/keymap/sinhala-phonetic_utf-8.vim b/runtime/keymap/sinhala-phonetic_utf-8.vim
new file mode 100644
index 0000000..adedc3f
--- /dev/null
+++ b/runtime/keymap/sinhala-phonetic_utf-8.vim
@@ -0,0 +1,107 @@
+" Vim Keymap file for Sinhala (Sri Lanka) (2003-11-02)
+" Maintainer : Harshula Jayasuriya <harshula@gmail.com>
+" Last Updated: 2007-06-30
+" This is a phonetic static mapping for a standard US-English keyboard
+" (qwerty)
+" http://www.nongnu.org/sinhala/doc/keymaps/sinhala-keyboard_3.html
+
+" Copy the keymap to ~/.vim/keymap/
+" Start gvim
+" Need to disable the menu so that you can use the 'alt' key.
+" set guioptions-=m
+" Select the new keymap
+" set keymap=sinhala-phonetic_utf-8
+
+let b:keymap_name = "sinhala"
+
+loadkeymap
+<A-n> <char-0x0d82> " ං - anusvaraya (anusvara)
+H <char-0x0d83> " ඃ - visargaya (visarga)
+a <char-0x0d85> " අ - ayanna (a)
+A <char-0x0d86> " ආ - aayanna (aa)
+w <char-0x0d87> " ඇ - aeyanna (ae)
+W <char-0x0d88> " ඈ - aeeyanna (aee)
+i <char-0x0d89> " ඉ - iyanna (i)
+I <char-0x0d8a> " ඊ - iiyanna (ii)
+u <char-0x0d8b> " උ - uyanna (u)
+U <char-0x0d8c> " ඌ - uuyanna (uu)
+q <char-0x0d8d> " ඍ - iruyanna (iru)
+Q <char-0x0d8e> " ඎ - iruuyanna (iruu)
+<A-k> <char-0x0d8f> " ඏ - iluyanna (ilu)
+<A-K> <char-0x0d90> " ඐ - iluuyanna (iluu)
+e <char-0x0d91> " එ - eyanna (e)
+E <char-0x0d92> " ඒ - eeyanna (ee)
+<A-F> <char-0x0d93> " ඓ - aiyanna (ai)
+o <char-0x0d94> " ඔ - oyanna (o)
+O <char-0x0d95> " ඕ - ooyanna (oo)
+<A-H> <char-0x0d96> " ඖ - auyanna (au)
+k <char-0x0d9a> " ක - alpapraana kayanna (ka)
+K <char-0x0d9b> " ඛ - mahaapraana kayanna (kha)
+g <char-0x0d9c> " ග - alpapraana gayanna (ga)
+G <char-0x0d9d> " ඝ - mahaapraana gayanna (gha)
+<A-N> <char-0x0d9e> " ඞ - kantaja naasikyaya (nga)
+<A-g> <char-0x0d9f> " ඟ - sanyaka gayanna (nnga)
+c <char-0x0da0> " ච - alpapraana cayanna (ca)
+C <char-0x0da1> " ඡ - mahaapraana cayanna (cha)
+j <char-0x0da2> " ජ - alpapraana jayanna (ja)
+J <char-0x0da3> " ඣ - mahaapraana jayanna (jha)
+z <char-0x0da4> " ඤ - taaluja naasikyaya (nya)
+Z <char-0x0da5> " ඥ - taaluja sanyooga naasikyaya (jnya)
+<A-j> <char-0x0da6> " ඦ - sanyaka jayanna (nyja)
+<A-t> <char-0x0da7> " ට - alpapraana ttayanna (tta)
+<A-T> <char-0x0da8> " ඨ - mahaapraana ttayanna (ttha)
+<A-d> <char-0x0da9> " ඩ - alpapraana ddayanna (dda)
+<A-D> <char-0x0daa> " ඪ - mahaapraana ddayanna (ddha)
+N <char-0x0dab> " ණ - muurdhaja nayanna (nna)
+X <char-0x0dac> " ඬ - sanyaka ddayanna (nndda)
+t <char-0x0dad> " ත - alpapraana tayanna (ta)
+T <char-0x0dae> " ථ - mahaapraana tayanna (tha)
+d <char-0x0daf> " ද - alpapraana dayanna (da)
+D <char-0x0db0> " ධ - mahaapraana dayanna (dha)
+n <char-0x0db1> " න - dantaja nayanna (na)
+x <char-0x0db3> " ඳ - sanyaka dayanna (nda)
+p <char-0x0db4> " ප - alpapraana payanna (pa)
+P <char-0x0db5> " ඵ - mahaapraana payanna (pha)
+b <char-0x0db6> " බ - alpapraana bayanna (ba)
+B <char-0x0db7> " භ - mahaapraana bayanna (bha)
+m <char-0x0db8> " ම - mayanna (ma)
+M <char-0x0db9> " ඹ - amba bayanna (mba)
+y <char-0x0dba> " ය - yayanna (ya)
+r <char-0x0dbb> " ර - rayanna (ra)
+l <char-0x0dbd> " ල - dantaja layanna (la)
+v <char-0x0dc0> " ව - vayanna (va)
+S <char-0x0dc1> " ශ - taaluja sayanna (sha)
+<A-s> <char-0x0dc2> " ෂ - muurdhaja sayanna (ssa)
+s <char-0x0dc3> " ස - dantaja sayanna (sa)
+h <char-0x0dc4> " හ - hayanna (ha)
+L <char-0x0dc5> " ළ - muurdhaja layanna (lla)
+f <char-0x0dc6> " ෆ - fayanna (fa)
+<A-a> <char-0x0dca> " ් - al-lakuna
+<A-A> <char-0x0dcf> " ා - aela-pilla (aa)
+<A-w> <char-0x0dd0> " ැ - ketti aeda-pilla (ae)
+<A-W> <char-0x0dd1> " ෑ - diga aeda-pilla (aae)
+<A-i> <char-0x0dd2> " ි - ketti is-pilla (i)
+<A-I> <char-0x0dd3> " ී - diga is-pilla (ii)
+<A-u> <char-0x0dd4> " ු - ketti paa-pilla (u)
+<A-U> <char-0x0dd6> " ූ - diga paa-pilla (uu)
+<A-q> <char-0x0dd8> " ෘ - gaetta-pilla (r)
+<A-e> <char-0x0dd9> " ෙ - kombuva (e)
+<A-E> <char-0x0dda> " ේ - diga kombuva (ee)
+<A-f> <char-0x0ddb> " ෛ - kombu deka (ai)
+<A-o> <char-0x0ddc> " ො - kombuva haa aela-pilla (o)
+<A-O> <char-0x0ddd> " ෝ - kombuva haa diga aela-pilla (oo)
+<A-h> <char-0x0dde> " ෞ - kombuva haa gayanukitta (au)
+<A-l> <char-0x0ddf> " ෟ - gayanukitta (l)
+<A-Q> <char-0x0df2> " ෲ - diga gaetta-pilla (rr)
+<A-L> <char-0x0df3> " ෳ - diga gayanukitta (ll)
+<A-.> <char-0x0df4> " ෴ - kunddaliya (punctuation)
+
+R <char-0x0dca><char-0x200d><char-0x0dbb> " ්‍ර - rakaaranshaya
+Y <char-0x0dca><char-0x200d><char-0x0dba> " ්‍ය - yansaya
+<A-r> <char-0x0dbb><char-0x0dca><char-0x200d> " ර්‍ - repaya
+
+<A-,> <char-0x0dca><char-0x200d> " join - conjunct letters cons 0DCA ZWJ cons
+<A-/> <char-0x200d><char-0x0dca> " touch - cons ZWJ 0DCA cons
+
+<C-space> <char-0x00a0> " - no-break space. <S-space> didn't work.
+<A-space> <char-0x200c> " - ZWNJ. <A-space> doesn't work!
diff --git a/runtime/keymap/sinhala.vim b/runtime/keymap/sinhala.vim
new file mode 100644
index 0000000..86091b4
--- /dev/null
+++ b/runtime/keymap/sinhala.vim
@@ -0,0 +1,3 @@
+" Vim Keymap file for Sinhala (Sri Lanka)
+"
+source <sfile>:p:h/sinhala-phonetic_utf-8.vim
diff --git a/runtime/keymap/slovak.vim b/runtime/keymap/slovak.vim
new file mode 100644
index 0000000..f9fd6d6
--- /dev/null
+++ b/runtime/keymap/slovak.vim
@@ -0,0 +1,16 @@
+let encoding = &enc
+if encoding == 'latin1'
+ if has("unix")
+ let encoding = 'iso-8859-2'
+ else
+ let encoding = 'cp1250'
+ endif
+endif
+
+if encoding == 'utf-8'
+ source <sfile>:p:h/slovak_utf-8.vim
+elseif encoding == 'cp1250'
+ source <sfile>:p:h/slovak_cp1250.vim
+else
+ source <sfile>:p:h/slovak_iso-8859-2.vim
+endif
diff --git a/runtime/keymap/slovak_cp1250.vim b/runtime/keymap/slovak_cp1250.vim
new file mode 100644
index 0000000..73234cb
--- /dev/null
+++ b/runtime/keymap/slovak_cp1250.vim
@@ -0,0 +1,100 @@
+" Maintainer: Peter Valach <pvalach@gmx.net>
+" Last Changed: 2002 Feb 3
+" URL: http://www.pv2c.sk/free/sk_vimkeymap/
+
+let b:keymap_name = "sk"
+
+loadkeymap
+" Z a Y - ak chcete slovensku qwerty, zakomentujte tieto styri riadky
+y z
+z y
+Y Z
+Z Y
+
+" Horny riadok
+` ;
+1 +
+! 1
+2
+@ 2
+3
+# 3
+4
+$ 4
+5
+% 5
+6
+^ 6
+7
+& 7
+8
+* 8
+9
+( 9
+0
+) 0
+- =
+_ %
+
+" Klavesy okolo Enteru :)
+[
+{ /
+]
+} (
+\\
+<Bar> )
+;
+: "
+'
+\" !
+", , ;-)
+< ?
+". . ;-)
+> :
+/ -
+? _
+
+" Dlzne
+=a
+=A
+=e
+=E
+=i
+=I
+=l
+=L
+=o
+=O
+=r
+=R
+=u
+=U
+=z
+=Z
+" pre pripad omylu :) alebo slovenskej QWERTY
+=y
+=Y
+
+" Makcene
++a
++A
++c
++C
++d
++D
++l
++L
++n
++N
++o
++O
++s
++S
++t
++T
++y
++Y
+" pre pripad omylu :) alebo slovenskej QWERTY
++z
++Z
+
diff --git a/runtime/keymap/slovak_iso-8859-2.vim b/runtime/keymap/slovak_iso-8859-2.vim
new file mode 100644
index 0000000..8c43fb1
--- /dev/null
+++ b/runtime/keymap/slovak_iso-8859-2.vim
@@ -0,0 +1,100 @@
+" Maintainer: Peter Valach <pvalach@gmx.net>
+" Last Changed: 2002 Feb 3
+" URL: http://www.pv2c.sk/free/sk_vimkeymap/
+
+let b:keymap_name = "sk"
+
+loadkeymap
+" Z a Y - ak chcete slovensku qwerty, zakomentujte tieto styri riadky
+y z
+z y
+Y Z
+Z Y
+
+" Horny riadok
+` ;
+1 +
+! 1
+2
+@ 2
+3
+# 3
+4
+$ 4
+5
+% 5
+6
+^ 6
+7
+& 7
+8
+* 8
+9
+( 9
+0
+) 0
+- =
+_ %
+
+" Klavesy okolo Enteru :)
+[
+{ /
+]
+} (
+\\
+<Bar> )
+;
+: "
+'
+\" !
+", , ;-)
+< ?
+". . ;-)
+> :
+/ -
+? _
+
+" Dlzne
+=a
+=A
+=e
+=E
+=i
+=I
+=l
+=L
+=o
+=O
+=r
+=R
+=u
+=U
+=z
+=Z
+" pre pripad omylu :) alebo slovenskej QWERTY
+=y
+=Y
+
+" Makcene
++a
++A
++c
++C
++d
++D
++l
++L
++n
++N
++o
++O
++s
++S
++t
++T
++y
++Y
+" pre pripad omylu :) alebo slovenskej QWERTY
++z
++Z
+
diff --git a/runtime/keymap/slovak_utf-8.vim b/runtime/keymap/slovak_utf-8.vim
new file mode 100644
index 0000000..8e3e083
--- /dev/null
+++ b/runtime/keymap/slovak_utf-8.vim
@@ -0,0 +1,100 @@
+" Maintainer: Peter Valach <pvalach@gmx.net>
+" Last Changed: 2002 Nov 5
+" URL: http://www.pv2c.sk/free/sk_vimkeymap/
+
+let b:keymap_name = "sk"
+
+loadkeymap
+" Z a Y - ak chcete slovensku qwerty, zakomentujte tieto styri riadky
+y z
+z y
+Y Z
+Z Y
+
+" Horny riadok
+` ;
+1 +
+! 1
+2 ľ
+@ 2
+3 š
+# 3
+4 č
+$ 4
+5 ť
+% 5
+6 ž
+^ 6
+7 ý
+& 7
+8 á
+* 8
+9 í
+( 9
+0 é
+) 0
+- =
+_ %
+
+" Klavesy okolo Enteru :)
+[ ú
+{ /
+] ä
+} (
+\\ ň
+<Bar> )
+; ô
+: "
+' §
+\" !
+", , ;-)
+< ?
+". . ;-)
+> :
+/ -
+? _
+
+" Dlzne
+=a á
+=A Á
+=e é
+=E É
+=i í
+=I Í
+=l ĺ
+=L Ĺ
+=o ó
+=O Ó
+=r ŕ
+=R Ŕ
+=u ú
+=U Ú
+=z ý
+=Z Ý
+" pre pripad omylu :) alebo slovenskej QWERTY
+=y ý
+=Y Ý
+
+" Makcene
++a ä
++A Ä
++c č
++C Č
++d ď
++D Ď
++l ľ
++L Ľ
++n ň
++N Ň
++o ô
++O Ô
++s š
++S Š
++t ť
++T Ť
++y ž
++Y Ž
+" pre pripad omylu :) alebo slovenskej QWERTY
++z ž
++Z Ž
+
diff --git a/runtime/keymap/tamil_tscii.vim b/runtime/keymap/tamil_tscii.vim
new file mode 100644
index 0000000..df85a4e
--- /dev/null
+++ b/runtime/keymap/tamil_tscii.vim
@@ -0,0 +1,572 @@
+" Keymap file for the editing Tamil language files in TSCII encoding.
+"
+" Maintainer: Yegappan Lakshmanan (yegappan AT yahoo DOT com)
+" Last updated: 2006 June 17
+"
+" You will need a fixed width TSCII font to use this encoding. The
+" Avarangal TSCII fixed width font (TSC_AvarangalFxd) is used to test
+" this keymap.
+"
+" Visit http://www.tscii.org for more information about the TSCII
+" encoding.
+"
+let b:keymap_name = "tamil_tscii"
+
+loadkeymap
+
+" Uyir (Vowels) letters
+a <char-171>
+aa <char-172>
+A <char-172>
+i <char-173>
+ii <char-174>
+I <char-174>
+u <char-175>
+uu <char-176>
+U <char-176>
+e <char-177>
+ee <char-178>
+E <char-178>
+ai <char-179>
+o <char-180>
+oo <char-181>
+O <char-181>
+au <char-182>
+q <char-183>
+
+" mey (Consonants) letters
+k <char-236>
+ka <char-184>
+kaa <char-184><char-161>
+kA <char-184><char-161>
+ki <char-184><char-162>
+kii <char-184><char-163>
+kI <char-184><char-163>
+ku <char-204>
+kuu <char-220>
+kU <char-220>
+ke <char-166><char-184>
+kee <char-167><char-184>
+kE <char-167><char-184>
+kai <char-168><char-184>
+ko <char-166><char-184><char-161>
+koo <char-167><char-184><char-161>
+kO <char-167><char-184><char-161>
+kau <char-166><char-184><char-199>
+
+g <char-236>
+ga <char-184>
+gaa <char-184><char-161>
+gA <char-184><char-161>
+gi <char-184><char-162>
+gii <char-184><char-163>
+gI <char-184><char-163>
+gu <char-204>
+guu <char-220>
+gU <char-220>
+ge <char-166><char-184>
+gee <char-167><char-184>
+gE <char-167><char-184>
+gai <char-168><char-184>
+go <char-166><char-184><char-161>
+goo <char-167><char-184><char-161>
+gO <char-167><char-184><char-161>
+gau <char-166><char-184><char-199>
+
+ng <char-237>
+nga <char-185>
+ngaa <char-185><char-161>
+ngA <char-185><char-161>
+ngi <char-185><char-162>
+ngii <char-185><char-163>
+ngI <char-185><char-163>
+ngu <char-153>
+nguu <char-155>
+ngU <char-155>
+nge <char-166><char-185>
+ngee <char-167><char-185>
+ngE <char-167><char-185>
+ngai <char-168><char-185>
+ngo <char-166><char-185><char-161>
+ngoo <char-167><char-185><char-161>
+ngO <char-167><char-185><char-161>
+ngau <char-166><char-185><char-199>
+
+ch <char-238>
+cha <char-186>
+chaa <char-186><char-161>
+chA <char-186><char-161>
+chi <char-186><char-162>
+chii <char-186><char-163>
+chI <char-186><char-163>
+chu <char-204>
+chuu <char-221>
+chU <char-221>
+che <char-166><char-186>
+chee <char-167><char-186>
+chE <char-167><char-186>
+chai <char-168><char-186>
+cho <char-166><char-186><char-161>
+choo <char-167><char-186><char-161>
+chO <char-167><char-186><char-161>
+chau <char-166><char-186><char-199>
+
+s <char-238>
+sa <char-186>
+saa <char-186><char-161>
+sA <char-186><char-161>
+si <char-186><char-162>
+sii <char-186><char-163>
+sI <char-186><char-163>
+su <char-205>
+suu <char-221>
+sU <char-221>
+se <char-166><char-186>
+see <char-167><char-186>
+sE <char-167><char-186>
+sai <char-168><char-186>
+so <char-166><char-186><char-161>
+soo <char-167><char-186><char-161>
+sO <char-167><char-186><char-161>
+sau <char-166><char-186><char-199>
+
+nj <char-239>
+nja <char-187>
+njaa <char-187><char-161>
+njA <char-187><char-161>
+nji <char-187><char-162>
+njii <char-187><char-163>
+njI <char-187><char-163>
+nju <char-154>
+njuu <char-156>
+njU <char-156>
+nje <char-166><char-187>
+njee <char-167><char-187>
+njE <char-167><char-187>
+njai <char-168><char-187>
+njo <char-166><char-187><char-161>
+njoo <char-167><char-187><char-161>
+njO <char-167><char-187><char-161>
+njau <char-166><char-187><char-199>
+
+t <char-240>
+ta <char-188>
+taa <char-188><char-161>
+tA <char-188><char-161>
+ti <char-202>
+tii <char-203>
+tI <char-203>
+tu <char-206>
+tuu <char-222>
+tU <char-222>
+te <char-166><char-188>
+tee <char-167><char-188>
+tE <char-167><char-188>
+tai <char-168><char-188>
+to <char-166><char-188><char-161>
+too <char-167><char-188><char-161>
+tO <char-167><char-188><char-161>
+tau <char-166><char-188><char-199>
+
+d <char-240>
+da <char-188>
+daa <char-188><char-161>
+dA <char-188><char-161>
+di <char-202>
+dii <char-203>
+dI <char-203>
+du <char-206>
+duu <char-222>
+dU <char-222>
+de <char-166><char-188>
+dee <char-167><char-188>
+dE <char-167><char-188>
+dai <char-168><char-188>
+do <char-166><char-188><char-161>
+doo <char-167><char-188><char-161>
+dO <char-167><char-188><char-161>
+dau <char-166><char-188><char-199>
+
+N <char-241>
+Na <char-189>
+Naa <char-189><char-161>
+NA <char-189><char-161>
+Ni <char-189><char-162>
+Nii <char-189><char-163>
+NI <char-189><char-163>
+Nu <char-207>
+Nuu <char-223>
+NU <char-223>
+Ne <char-166><char-189>
+Nee <char-167><char-189>
+NE <char-167><char-189>
+Nai <char-168><char-189>
+No <char-166><char-189><char-161>
+Noo <char-167><char-189><char-161>
+NO <char-167><char-189><char-161>
+Nau <char-166><char-189><char-199>
+
+th <char-242>
+tha <char-190>
+thaa <char-190><char-161>
+thA <char-190><char-161>
+thi <char-190><char-162>
+thii <char-190><char-163>
+thI <char-190><char-163>
+thu <char-208>
+thuu <char-224>
+thU <char-224>
+the <char-166><char-190>
+thee <char-167><char-190>
+thE <char-167><char-190>
+thai <char-168><char-190>
+tho <char-166><char-190><char-161>
+thoo <char-167><char-190><char-161>
+thO <char-167><char-190><char-161>
+thau <char-166><char-190><char-199>
+
+w <char-243>
+wa <char-191>
+waa <char-191><char-161>
+wA <char-191><char-161>
+wi <char-191><char-162>
+wii <char-191><char-163>
+wI <char-191><char-163>
+wu <char-209>
+wuu <char-225>
+wU <char-225>
+we <char-166><char-191>
+wee <char-167><char-191>
+wE <char-167><char-191>
+wai <char-168><char-191>
+wo <char-166><char-191><char-161>
+woo <char-167><char-191><char-161>
+wO <char-167><char-191><char-161>
+wau <char-166><char-191><char-199>
+
+n- <char-243>
+n-a <char-191>
+n-aa <char-191><char-161>
+n-A <char-191><char-161>
+n-i <char-191><char-162>
+n-ii <char-191><char-163>
+n-I <char-191><char-163>
+n-u <char-209>
+n-uu <char-225>
+n-U <char-225>
+n-e <char-166><char-191>
+n-ee <char-167><char-191>
+n-E <char-167><char-191>
+n-ai <char-168><char-191>
+n-o <char-166><char-191><char-161>
+n-oo <char-167><char-191><char-161>
+n-O <char-167><char-191><char-161>
+n-au <char-166><char-191><char-199>
+
+p <char-244>
+pa <char-192>
+paa <char-192><char-161>
+pA <char-192><char-161>
+pi <char-192><char-162>
+pii <char-192><char-163>
+pI <char-192><char-163>
+pu <char-210>
+puu <char-226>
+pU <char-226>
+pe <char-166><char-192>
+pee <char-167><char-192>
+pE <char-167><char-192>
+pai <char-168><char-192>
+po <char-166><char-192><char-161>
+poo <char-167><char-192><char-161>
+pO <char-167><char-192><char-161>
+pau <char-166><char-192><char-199>
+
+b <char-244>
+ba <char-192>
+baa <char-192><char-161>
+bA <char-192><char-161>
+bi <char-192><char-162>
+bii <char-192><char-163>
+bI <char-192><char-163>
+bu <char-210>
+buu <char-226>
+bU <char-226>
+be <char-166><char-192>
+bee <char-167><char-192>
+bE <char-167><char-192>
+bai <char-168><char-192>
+bo <char-166><char-192><char-161>
+boo <char-167><char-192><char-161>
+bO <char-167><char-192><char-161>
+bau <char-166><char-192><char-199>
+
+m <char-245>
+ma <char-193>
+maa <char-193><char-161>
+mA <char-193><char-161>
+mi <char-193><char-162>
+mii <char-193><char-163>
+mI <char-193><char-163>
+mu <char-211>
+muu <char-227>
+mU <char-227>
+me <char-166><char-193>
+mee <char-167><char-193>
+mE <char-167><char-193>
+mai <char-168><char-193>
+mo <char-166><char-193><char-161>
+moo <char-167><char-193><char-161>
+mO <char-167><char-193><char-161>
+mau <char-166><char-193><char-199>
+
+y <char-246>
+ya <char-194>
+yaa <char-194><char-161>
+yA <char-194><char-161>
+yi <char-194><char-162>
+yii <char-194><char-163>
+yI <char-194><char-163>
+yu <char-212>
+yuu <char-228>
+yU <char-228>
+ye <char-166><char-194>
+yee <char-167><char-194>
+yE <char-167><char-194>
+yai <char-168><char-194>
+yo <char-166><char-194><char-161>
+yoo <char-167><char-194><char-161>
+yO <char-167><char-194><char-161>
+yau <char-166><char-194><char-199>
+
+r <char-247>
+ra <char-195>
+raa <char-195><char-161>
+rA <char-195><char-161>
+ri <char-195><char-162>
+rii <char-195><char-163>
+rI <char-195><char-163>
+ru <char-213>
+ruu <char-229>
+rU <char-229>
+re <char-166><char-195>
+ree <char-167><char-195>
+rE <char-167><char-195>
+rai <char-168><char-195>
+ro <char-166><char-195><char-161>
+roo <char-167><char-195><char-161>
+rO <char-167><char-195><char-161>
+rau <char-166><char-195><char-199>
+
+l <char-248>
+la <char-196>
+laa <char-196><char-161>
+lA <char-196><char-161>
+li <char-196><char-162>
+lii <char-196><char-163>
+lI <char-196><char-163>
+lu <char-214>
+luu <char-230>
+lU <char-230>
+le <char-166><char-196>
+lee <char-167><char-196>
+lE <char-167><char-196>
+lai <char-168><char-196>
+lo <char-166><char-196><char-161>
+loo <char-167><char-196><char-161>
+lO <char-167><char-196><char-161>
+lau <char-166><char-196><char-199>
+
+v <char-249>
+va <char-197>
+vaa <char-197><char-161>
+vA <char-197><char-161>
+vi <char-197><char-162>
+vii <char-197><char-163>
+vI <char-197><char-163>
+vu <char-215>
+vuu <char-231>
+vU <char-231>
+ve <char-166><char-197>
+vee <char-167><char-197>
+vE <char-167><char-197>
+vai <char-168><char-197>
+vo <char-166><char-197><char-161>
+voo <char-167><char-197><char-161>
+vO <char-167><char-197><char-161>
+vau <char-166><char-197><char-199>
+
+z <char-250>
+za <char-198>
+zaa <char-198><char-161>
+zA <char-198><char-161>
+zi <char-198><char-162>
+zii <char-198><char-163>
+zI <char-198><char-163>
+zu <char-216>
+zuu <char-232>
+zU <char-232>
+ze <char-166><char-198>
+zee <char-167><char-198>
+zE <char-167><char-198>
+zai <char-168><char-198>
+zo <char-166><char-198><char-161>
+zoo <char-167><char-198><char-161>
+zO <char-167><char-198><char-161>
+zau <char-166><char-198><char-199>
+
+L <char-251>
+La <char-199>
+Laa <char-199><char-161>
+LA <char-199><char-161>
+Li <char-199><char-162>
+Lii <char-199><char-163>
+LI <char-199><char-163>
+Lu <char-217>
+Luu <char-233>
+LU <char-233>
+Le <char-166><char-199>
+Lee <char-167><char-199>
+LE <char-167><char-199>
+Lai <char-168><char-199>
+Lo <char-166><char-199><char-161>
+Loo <char-167><char-199><char-161>
+LO <char-167><char-199><char-161>
+Lau <char-166><char-199><char-199>
+
+R <char-252>
+Ra <char-200>
+Raa <char-200><char-161>
+RA <char-200><char-161>
+Ri <char-200><char-162>
+Rii <char-200><char-163>
+RI <char-200><char-163>
+Ru <char-218>
+Ruu <char-234>
+RU <char-234>
+Re <char-166><char-200>
+Ree <char-167><char-200>
+RE <char-167><char-200>
+Rai <char-168><char-200>
+Ro <char-166><char-200><char-161>
+Roo <char-167><char-200><char-161>
+RO <char-167><char-200><char-161>
+Rau <char-166><char-200><char-199>
+
+n <char-253>
+na <char-201>
+naa <char-201><char-161>
+nA <char-201><char-161>
+ni <char-201><char-162>
+nii <char-201><char-163>
+nI <char-201><char-163>
+nu <char-219>
+nuu <char-235>
+nU <char-235>
+ne <char-166><char-201>
+nee <char-167><char-201>
+nE <char-167><char-201>
+nai <char-168><char-201>
+no <char-166><char-201><char-161>
+noo <char-167><char-201><char-161>
+nO <char-167><char-201><char-161>
+nau <char-166><char-201><char-199>
+
+" Grantha letters
+j <char-136>
+ja <char-131>
+jaa <char-131><char-161>
+jA <char-131><char-161>
+ji <char-131><char-162>
+jii <char-131><char-163>
+jI <char-131><char-163>
+ju <char-131><char-164>
+juu <char-131><char-164>
+jU <char-131><char-165>
+je <char-166><char-131>
+jee <char-167><char-131>
+jE <char-167><char-131>
+jai <char-168><char-131>
+jo <char-166><char-131><char-161>
+joo <char-167><char-131><char-161>
+jO <char-167><char-131><char-161>
+jau <char-166><char-131><char-199>
+
+sh <char-137>
+sha <char-132>
+shaa <char-132><char-161>
+shA <char-132><char-161>
+shi <char-132><char-162>
+shii <char-132><char-163>
+shI <char-132><char-163>
+shu <char-131><char-164>
+shuu <char-131><char-164>
+shU <char-131><char-165>
+she <char-166><char-132>
+shee <char-167><char-132>
+shE <char-167><char-132>
+shai <char-168><char-132>
+sho <char-166><char-132><char-161>
+shoo <char-167><char-132><char-161>
+shO <char-167><char-132><char-161>
+shau <char-166><char-132><char-199>
+
+S <char-138>
+Sa <char-133>
+Saa <char-133><char-161>
+SA <char-133><char-161>
+Si <char-133><char-162>
+Sii <char-133><char-163>
+SI <char-133><char-163>
+Su <char-133><char-164>
+Suu <char-133><char-165>
+SU <char-133><char-165>
+Se <char-166><char-133>
+See <char-167><char-133>
+SE <char-167><char-133>
+Sai <char-168><char-133>
+So <char-166><char-133><char-161>
+Soo <char-167><char-133><char-161>
+SO <char-167><char-133><char-161>
+Sau <char-166><char-133><char-199>
+
+h <char-139>
+ha <char-134>
+haa <char-134><char-161>
+hA <char-134><char-161>
+hi <char-134><char-162>
+hii <char-134><char-163>
+hI <char-134><char-163>
+hu <char-134><char-164>
+huu <char-134><char-165>
+hU <char-134><char-165>
+he <char-166><char-134>
+hee <char-167><char-134>
+hE <char-167><char-134>
+hai <char-168><char-134>
+ho <char-166><char-134><char-161>
+hoo <char-167><char-134><char-161>
+hO <char-167><char-134><char-161>
+hau <char-166><char-134><char-199>
+
+x <char-140>
+xa <char-135>
+xaa <char-135><char-161>
+xA <char-135><char-161>
+xi <char-135><char-162>
+xii <char-135><char-163>
+xI <char-135><char-163>
+xu <char-135><char-164>
+xuu <char-135><char-165>
+xU <char-135><char-165>
+xe <char-166><char-135>
+xee <char-167><char-135>
+xE <char-167><char-135>
+xai <char-168><char-135>
+xo <char-166><char-135><char-161>
+xoo <char-167><char-135><char-161>
+xO <char-167><char-135><char-161>
+xau <char-166><char-135><char-199>
+
+sri <char-130>
+
diff --git a/runtime/keymap/thaana-phonetic_utf-8.vim b/runtime/keymap/thaana-phonetic_utf-8.vim
new file mode 100644
index 0000000..ec235ac
--- /dev/null
+++ b/runtime/keymap/thaana-phonetic_utf-8.vim
@@ -0,0 +1,86 @@
+" thaana keymap
+" Maintainer: Ibrahim fayaz <p h a y a x at gmail dot com>
+" please set enc to utf-8
+" thaana phonetic keyboard is used as a reference
+" http://www.mcst.gov.mv/News_and_Events/xpfonts.htm
+" changelog: 18th Feb 2006 - came up the initial idea of writing the keymap..
+" 13th May 2006 - made some few corrections regarding < and >..
+
+let b:keymap_name= "thaana"
+
+" THAANA NORMAL LETTERS
+loadkeymap
+h <char-0x0780> "letter haa
+S <char-0x0781> "shaviani
+n <char-0x0782> "noonu
+r <char-0x0783> "raa
+b <char-0x0784> "baa
+L <char-0x0785> "lhaviani
+k <char-0x0786> "kaafu
+w <char-0x0787> "alifu
+v <char-0x0788> "vaavu
+m <char-0x0789> "meemu
+f <char-0x078A> "faafu
+d <char-0x078B> "dhaalu
+t <char-0x078C> "thaa
+l <char-0x078D> "laamu
+g <char-0x078E> "gaafu
+N <char-0x078F> "gnaviani
+s <char-0x0790> "seenu
+D <char-0x0791> "daviani
+z <char-0x0792> "zaviani
+T <char-0x0793> "taviani
+y <char-0x0794> "yaa
+p <char-0x0795> "paviani
+j <char-0x0796> "javiani
+c <char-0x0797> "chaviani
+
+"THAANA DOTTED LETTERS
+X <char-0x0798> "TTAA (thaa mathee thin thiki)
+H <char-0x0799> "HHAA (haa thiree ehthiki)
+K <char-0x079A> "KHAA (haa mathee ehthiki)
+J <char-0x079B> "THAALU (dhaa mathee ehthiki)
+R <char-0x079C> "ZAA (raa mathee ehthiki)
+C <char-0x079D> "SHEENU (seenu mathee thinthiki)
+M <char-0x079E> "SAADHU (seenu thiree ehthiki)
+B <char-0x079F> "DHAADHU(seenu mathee ehthiki)
+Y <char-0x07A0> "TO (thaa thiree ehthiki)
+Z <char-0x07A1> "ZO (thaa mathee ehthiki)
+W <char-0x07A2> "AINU (alifu thiree ehthiki)
+G <char-0x07A3> "GHAINU (alifu mathee ehthiki)
+Q <char-0x07A4> "QAAFU (gaafu mathee dhethkiki)
+V <char-0x07A5> "VAAVU (vaavu mathee ehthiki)
+
+"THAANA FILI (combining characters)
+a <char-0x07A6> "abafili
+A <char-0x07A7> "aabaafili
+i <char-0x07A8> "ibifili
+I <char-0x07A9> "eebeefili
+u <char-0x07AA> "ubufili
+U <char-0x07AB> "ooboofili
+e <char-0x07AC> "ebefili
+E <char-0x07AD> "ebeyfili
+o <char-0x07AE> "obofili
+O <char-0x07AF> "oaboafili
+q <char-0x07B0> "sukun
+
+"OTHER THAANA RELATED
+F <char-0xFDF2> "arabic ligature allah isolated form
+? <char-0x061F> "arabic question mark
+"~ <char-0xFDFD> "arabic -bismillah ahrahman araheem- not in phonetic keyboard, thats why commented
+[ <char-0x005D> "english open bracket is thaana closing bracket
+] <char-0x005B> "english close bracket = thaana open bracket
+{ <char-0x007B> "braces reversed
+} <char-0x007D>
+x <char-0x00D7> " x for multiplication sign..
+P <char-0x00F7> " division symbol mapped to 'p'
+> <char-0x003C>
+< <char-0x003E>
+<M-v> <char-0x200D> "zwj - ZERO WIDTH JOINER i dont know how to use these yet..
+<M-b> <char-0x200C> "zwnj - ZERO WIDTH NON JOINER
+<M-n> <char-0x200E> "lrm - LEFT TO RIGHT MARK
+<M-m> <char-0x200F> "rlm - RIGHT TO LEFT MARK
+; <char-0x061B> "arabic semicolon
+, <char-0x060C> "arabic coma
+<M-;> ;
+<M-,> ,
diff --git a/runtime/keymap/thaana.vim b/runtime/keymap/thaana.vim
new file mode 100644
index 0000000..bf22d80
--- /dev/null
+++ b/runtime/keymap/thaana.vim
@@ -0,0 +1,3 @@
+if &enc == 'utf-8'
+ source <sfile>:p:h/thaana-phonetic_utf-8.vim
+endif
diff --git a/runtime/keymap/turkish-f.vim b/runtime/keymap/turkish-f.vim
new file mode 100644
index 0000000..f03c5eb
--- /dev/null
+++ b/runtime/keymap/turkish-f.vim
@@ -0,0 +1,113 @@
+" Vim keymap file for Turkish F layout
+" Maintainer: Emir SARI <bitigchi@me.com>
+" Last changed: 5 August 2020
+
+scriptencoding utf-8
+let b:keymap_name = "tr-f"
+loadkeymap
+
+F A LATIN CAPITAL LETTER A
+< B LATIN CAPITAL LETTER B
+V C LATIN CAPITAL LETTER C
+B Ç LATIN CAPITAL LETTER C WITH CEDILLA
+Y D LATIN CAPITAL LETTER D
+D E LATIN CAPITAL LETTER E
+Q F LATIN CAPITAL LETTER F
+W G LATIN CAPITAL LETTER G
+E Ğ LATIN CAPITAL LETTER G WITH BREVE
+O H LATIN CAPITAL LETTER H
+R I LATIN CAPITAL LETTER I
+S İ LATIN CAPITAL LETTER I WITH DOT ABOVE
+Z J LATIN CAPITAL LETTER J
+J K LATIN CAPITAL LETTER K
+K M LATIN CAPITAL LETTER M
+I N LATIN CAPITAL LETTER N
+T O LATIN CAPITAL LETTER O
+X Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+U R LATIN CAPITAL LETTER R
+M S LATIN CAPITAL LETTER S
+\" Ş LATIN CAPITAL LETTER S WITH CEDILLA
+H T LATIN CAPITAL LETTER T
+A U LATIN CAPITAL LETTER U
+G Ü LATIN CAPITAL LETTER U WITH DIAERESIS
+C V LATIN CAPITAL LETTER V
+: Y LATIN CAPITAL LETTER Y
+N Z LATIN CAPITAL LETTER Z
+
+{ Q LATIN CAPITAL LETTER Q
+} W LATIN CAPITAL LETTER W
+| X LATIN CAPITAL LETTER X
+
+± * ASTERISK
+@ " QUOTATION MARK
+# ^ CIRCUMFLEX ACCENT
+^ & AMPERSAND
+& ' APOSTROPHE
+* ( LEFT PARENTHESIS
+( ) RIGHT PARENTHESIS
+) = EQUALS SIGN
+_ ? QUESTION MARK
++ _ LOW LINE
+> : COLON
+? ; SEMICOLON
+~ > GREATER-THAN SIGN
+
+Å Û LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+Í Î LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+Ï Â LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+
+f a LATIN SMALL LETTER A
+, b LATIN SMALL LETTER B
+v c LATIN SMALL LETTER C
+b ç LATIN SMALL LETTER C WITH CEDILLA
+y d LATIN SMALL LETTER D
+d e LATIN SMALL LETTER E
+q f LATIN SMALL LETTER F
+w g LATIN SMALL LETTER G
+e ğ LATIN SMALL LETTER G WITH BREVE
+o h LATIN SMALL LETTER H
+r ı LATIN SMALL LETTER I
+s i LATIN SMALL LETTER I WITH DOT ABOVE
+z j LATIN SMALL LETTER J
+j k LATIN SMALL LETTER K
+k m LATIN SMALL LETTER M
+i n LATIN SMALL LETTER N
+t o LATIN SMALL LETTER O
+x ö LATIN SMALL LETTER O WITH DIAERESIS
+u r LATIN SMALL LETTER R
+m s LATIN SMALL LETTER S
+\' ş LATIN SMALL LETTER S WITH CEDILLA
+h t LATIN SMALL LETTER T
+a u LATIN SMALL LETTER U
+g ü LATIN SMALL LETTER U WITH DIAERESIS
+c v LATIN SMALL LETTER V
+; y LATIN SMALL LETTER Y
+n z LATIN SMALL LETTER Z
+
+[ q LATIN SMALL LETTER Q
+] w LATIN SMALL LETTER W
+\\ x LATIN SMALL LETTER X
+
+§ + PLUS SIGN
+- / SOLIDUS
+= - HYPHEN-MINUS
+/ , COMMA
+` < LESS-THAN SIGN
+
+£ # NUMBER SIGN
+¶ { LEFT CURLY BRACKET
+• [ LEFT SQUARE BRACKET
+ª ] RIGHT SQUARE BRACKET
+º } RIGHT CURLY BRACKET
+– \\ REVERSE SOLIDUS
+≠ | VERTICAL LINE
+œ @ COMMERCIAL AT
+‘ ~ TILDE
+å û LATIN SMALL LETTER U WITH CIRCUMFLEX
+ß î LATIN SMALL LETTER I WITH CIRCUMFLEX
+∂ € EURO SIGN
+ƒ â LATIN SMALL LETTER A WITH CIRCUMFLEX
+˙ ₺ TURKISH LIRA SIGN
+¬ £ POUND SIGN
+… ¥ YEN SIGN
+« ` GRAVE ACCENT
diff --git a/runtime/keymap/turkish-q.vim b/runtime/keymap/turkish-q.vim
new file mode 100644
index 0000000..326b08e
--- /dev/null
+++ b/runtime/keymap/turkish-q.vim
@@ -0,0 +1,62 @@
+" Vim keymap file for Turkish Q layout
+" Maintainer: Emir SARI <bitigchi@me.com>
+" Last changed: 5 August 2020
+
+scriptencoding utf-8
+let b:keymap_name = "tr-q"
+loadkeymap
+
+\> Ç LATIN CAPITAL LETTER C WITH CEDILLA
+\{ Ğ LATIN CAPITAL LETTER G WITH BREVE
+\" İ LATIN CAPITAL LETTER I WITH DOT ABOVE
+\< Ö LATIN CAPITAL LETTER O WITH DIAERESIS
+\: Ş LATIN CAPITAL LETTER S WITH CEDILLA
+\} Ü LATIN CAPITAL LETTER U WITH DIAERESIS
+
+± é LATIN SMALL LETTER E WITH ACUTE
+@ ' APOSTROPHE
+# ^ CIRCUMFLEX ACCENT
+$ + PLUS SIGN
+^ & AMPERSAND
+& / SOLIDUS
+* ( LEFT PARENTHESIS
+( ) RIGHT PARENTHESIS
+) = EQUAL SIGN
+_ ? QUESTION MARK
++ _ LOW LINE
+~ > GREATER-THAN SIGN
+| ; SEMICOLON
+? : COLON
+
+\. ç LATIN SMALL LETTER C WITH CEDILLA
+\[ ğ LATIN SMALL LETTER G WITH BREVE
+\' i LATIN SMALL LETTER I
+\, ö LATIN SMALL LETTER O WITH DIAERESIS
+\; ş LATIN SMALL LETTER S WITH CEDILLA
+\] ü LATIN SMALL LETTER U WITH DIAERESIS
+i ı LATIN SMALL LETTER DOTLESS I
+
+§ " QUOTATION MARK
+- * ASTERISK
+= - HYPHEN-MINUS
+\\ , COMMA
+\/ . FULL STOP
+` < LESS-THAN SIGN
+
+™ £ POUND SIGN
+£ # NUMBER SIGN
+¢ $ DOLLAR SIGN
+∞ ½ VULGAR FRACTION ONE HALF
+¶ { LEFT CURLY BRACKET
+• [ LEFT SQUARE BRACKET
+ª ] RIGHT SQUARE BRACKET
+º } RIGHT CURLY BRACKET
+– \\ REVERSE SOLIDUS
+≠ | VERTICAL LINE
+œ @ COMMERCIAL AT
+´ € EURO SIGN
+† ₺ TURKISH LIRA SIGN
+¥ ¥ YEN SIGN
+‘ ~ TILDE
+… ´ ACUTE ACCENT
+« ` GRAVE ACCENT
diff --git a/runtime/keymap/ukrainian-dvorak.vim b/runtime/keymap/ukrainian-dvorak.vim
new file mode 100644
index 0000000..589dae1
--- /dev/null
+++ b/runtime/keymap/ukrainian-dvorak.vim
@@ -0,0 +1,92 @@
+" Vim Keymap file for ukrainian characters, layout 'dvorak',
+" MS Windows variant
+" Derived from ukrainian-jcuken.vim by Anatoli Sakhnik <sakhnik@gmail.com>
+" Useful mainly with utf-8 but may work with other encodings
+
+" Maintainer: Serhiy Boiko <cris.kiev@gmail.com>
+" Last Changed: 2007 Jun 29
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding utf-8
+
+let b:keymap_name = "uk"
+
+loadkeymap
+~ ~ CYRILLIC CAPITAL LETTER IO
+` ' CYRILLIC SMALL LETTER IO
+U А CYRILLIC CAPITAL LETTER A
+W Б CYRILLIC CAPITAL LETTER BE
+E В CYRILLIC CAPITAL LETTER VE
+G Г CYRILLIC CAPITAL LETTER GHE
+N Д CYRILLIC CAPITAL LETTER DE
+Y Е CYRILLIC CAPITAL LETTER IE
+S Ж CYRILLIC CAPITAL LETTER ZHE
+L З CYRILLIC CAPITAL LETTER ZE
+X И CYRILLIC CAPITAL LETTER I
+\" Й CYRILLIC CAPITAL LETTER SHORT I
+P К CYRILLIC CAPITAL LETTER KA
+T Л CYRILLIC CAPITAL LETTER EL
+K М CYRILLIC CAPITAL LETTER EM
+F Н CYRILLIC CAPITAL LETTER EN
+H О CYRILLIC CAPITAL LETTER O
+I П CYRILLIC CAPITAL LETTER PE
+D Р CYRILLIC CAPITAL LETTER ER
+J С CYRILLIC CAPITAL LETTER ES
+B Т CYRILLIC CAPITAL LETTER TE
+> У CYRILLIC CAPITAL LETTER U
+A Ф CYRILLIC CAPITAL LETTER EF
+? Х CYRILLIC CAPITAL LETTER HA
+< Ц CYRILLIC CAPITAL LETTER TSE
+Q Ч CYRILLIC CAPITAL LETTER CHE
+C Ш CYRILLIC CAPITAL LETTER SHA
+R Щ CYRILLIC CAPITAL LETTER SHCHA
++ Ї CYRILLIC CAPITAL LETTER YI
+O І CYRILLIC CAPITAL LETTER BYELORUSSION-UKRAINIAN I
+M Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+_ Є CYRILLIC CAPITAL LETTER UKRAINIAN IE
+V Ю CYRILLIC CAPITAL LETTER YU
+: Я CYRILLIC CAPITAL LETTER YA
+| Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+u а CYRILLIC SMALL LETTER A
+w б CYRILLIC SMALL LETTER BE
+e в CYRILLIC SMALL LETTER VE
+g г CYRILLIC SMALL LETTER GHE
+n д CYRILLIC SMALL LETTER DE
+y е CYRILLIC SMALL LETTER IE
+s ж CYRILLIC SMALL LETTER ZHE
+l з CYRILLIC SMALL LETTER ZE
+x и CYRILLIC SMALL LETTER I
+' й CYRILLIC SMALL LETTER SHORT I
+p к CYRILLIC SMALL LETTER KA
+t л CYRILLIC SMALL LETTER EL
+k м CYRILLIC SMALL LETTER EM
+f н CYRILLIC SMALL LETTER EN
+h о CYRILLIC SMALL LETTER O
+i п CYRILLIC SMALL LETTER PE
+d р CYRILLIC SMALL LETTER ER
+j с CYRILLIC SMALL LETTER ES
+b т CYRILLIC SMALL LETTER TE
+. у CYRILLIC SMALL LETTER U
+a ф CYRILLIC SMALL LETTER EF
+/ х CYRILLIC SMALL LETTER HA
+, ц CYRILLIC SMALL LETTER TSE
+q ч CYRILLIC SMALL LETTER CHE
+c ш CYRILLIC SMALL LETTER SHA
+r щ CYRILLIC SMALL LETTER SHCHA
+= ї CYRILLIC SMALL LETTER YI
+o і CYRILLIC SMALL LETTER BYELORUSSION-UKRAINIAN I
+m ь CYRILLIC SMALL LETTER SOFT SIGN
+- є CYRILLIC SMALL LETTER UKRAINIAN IE
+v ю CYRILLIC SMALL LETTER YU
+; я CYRILLIC SMALL LETTER YA
+\\ ґ CYRILLIC SMALL LETTER GHE WITH UPTURN
+@ "
+# № NUMERO SIGN
+$ ;
+^ :
+& ?
+z .
+Z ,
+[ -
+] =
diff --git a/runtime/keymap/ukrainian-jcuken.vim b/runtime/keymap/ukrainian-jcuken.vim
new file mode 100644
index 0000000..fcc1c34
--- /dev/null
+++ b/runtime/keymap/ukrainian-jcuken.vim
@@ -0,0 +1,92 @@
+" Vim Keymap file for ukrainian characters, layout 'jcuken', classical variant
+" (compatible with XFree86 'uk' keymap)
+" Derived from russian-jcuken.vim by Artem Chuprina <ran@ran.pp.ru>
+" Useful mainly with utf-8 but may work with other encodings
+
+" Maintainer: Anatoli Sakhnik <sakhnik@gmail.com>
+" Last Changed: 2007 Nov 11
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding utf-8
+
+let b:keymap_name = "uk"
+
+loadkeymap
+~ ~
+` '
+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 YI
+S І CYRILLIC CAPITAL LETTER BYELORUSSION-UKRAINIAN I
+M Ь CYRILLIC CAPITAL LETTER SOFT SIGN
+\" Є CYRILLIC CAPITAL LETTER UKRAINIAN IE
+> Ю CYRILLIC CAPITAL LETTER YU
+Z Я CYRILLIC CAPITAL LETTER YA
+| Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN
+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 YI
+s і CYRILLIC SMALL LETTER BYELORUSSION-UKRAINIAN I
+m ь CYRILLIC SMALL LETTER SOFT SIGN
+' є CYRILLIC SMALL LETTER UKRAINIAN IE
+. ю CYRILLIC SMALL LETTER YU
+z я CYRILLIC SMALL LETTER YA
+\\ ґ CYRILLIC SMALL LETTER GHE WITH UPTURN
+@ "
+# '
+$ *
+% :
+^ ,
+& .
+* ;
+~ ~
+~~ <char-0x301> Stress
diff --git a/runtime/keymap/vietnamese-telex_utf-8.vim b/runtime/keymap/vietnamese-telex_utf-8.vim
new file mode 100644
index 0000000..f9fd055
--- /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-viqr_utf-8.vim b/runtime/keymap/vietnamese-viqr_utf-8.vim
new file mode 100644
index 0000000..b17be6d
--- /dev/null
+++ b/runtime/keymap/vietnamese-viqr_utf-8.vim
@@ -0,0 +1,160 @@
+" Vim Keymap file for vietnamese through the usual viqr method
+" Maintainer: Samuel Thibault <samuel.thibault@ens-lyon.org>
+" Last Change: 2006 Jun 17
+
+scriptencoding utf-8
+
+let b:keymap_name = "vietnamese"
+
+loadkeymap
+a a
+A A
+a` à
+A` À
+a? ả
+A? Ả
+a~ ã
+A~ Ã
+a' á
+A' Á
+a. ạ
+A. Ạ
+a( ă
+A( Ă
+a(` ằ
+A(` Ằ
+a(? ẳ
+A(? Ẳ
+a(~ ẵ
+A(~ Ẵ
+a(' ắ
+A(' Ắ
+a(. ặ
+A(. Ặ
+a^ â
+A^ Â
+a^` ầ
+A^` Ầ
+a^? ẩ
+A^? Ẩ
+a^~ ẫ
+A^~ Ẫ
+a^' ấ
+A^' Ấ
+a^. ậ
+A^. Ậ
+d d
+D D
+dd đ
+Dd Đ
+DD Đ
+e e
+E E
+e` è
+E` È
+e? ẻ
+E? Ẻ
+e~ ẽ
+E~ Ẽ
+e' é
+E' É
+e. ẹ
+E. Ẹ
+e^ ê
+E^ Ê
+e^` ề
+E^` Ề
+e^? ể
+E^? Ể
+e^~ ễ
+E^~ Ễ
+e^' ế
+E^' Ế
+e^. ệ
+E^. Ệ
+i i
+I I
+i` ì
+I` Ì
+i? ỉ
+I? Ỉ
+i~ ĩ
+I~ Ĩ
+i' í
+I' Í
+i. ị
+I. Ị
+o o
+O O
+o` ò
+O` Ò
+o? ỏ
+O? Ỏ
+o~ õ
+O~ Õ
+o' ó
+O' Ó
+o. ọ
+O. Ọ
+o^ ô
+O^ Ô
+o^` ồ
+O^` Ồ
+o^? ổ
+O^? Ổ
+o^~ ỗ
+O^~ Ỗ
+o^' ố
+O^' Ố
+o^. ộ
+O^. Ộ
+o+ ơ
+O+ Ơ
+o+` ờ
+O+` Ờ
+o+? ở
+O+? Ở
+o+~ ỡ
+O+~ Ỡ
+o+' ớ
+O+' Ớ
+o+. ợ
+O+. Ợ
+u u
+U U
+u` ù
+U` Ù
+u? ủ
+U? Ủ
+u~ ũ
+U~ Ũ
+u' ú
+U' Ú
+u. ụ
+U. Ụ
+u+ ư
+U+ Ư
+u+` ừ
+U+` Ừ
+u+? ử
+U+? Ử
+u+~ ữ
+U+~ Ữ
+u+' ứ
+U+' Ứ
+u+. ự
+U+. Ự
+y y
+Y Y
+y` ỳ
+Y` Ỳ
+y? ỷ
+Y? Ỷ
+y~ ỹ
+Y~ Ỹ
+y' ý
+Y' Ý
+y. ỵ
+Y. Ỵ
+\\d d
+\\D D
diff --git a/runtime/keymap/vietnamese-vni_utf-8.vim b/runtime/keymap/vietnamese-vni_utf-8.vim
new file mode 100644
index 0000000..c9312c6
--- /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/lang/Makefile b/runtime/lang/Makefile
new file mode 100644
index 0000000..901c4eb
--- /dev/null
+++ b/runtime/lang/Makefile
@@ -0,0 +1,211 @@
+# Author: Ada (Haowen) Yu <me@yuhaowen.com>
+
+all: \
+ menu_chinese_gb.936.vim \
+ menu_uk_ua.cp1251.vim \
+ menu_uk_ua.koi8-u.vim \
+ menu_chinese_taiwan.950.vim \
+ menu_cs_cz.iso_8859-2.vim \
+ menu_czech_czech_republic.1250.vim \
+ menu_ja_jp.euc-jp.vim \
+ menu_japanese_japan.932.vim \
+ menu_ko_kr.euckr.vim \
+ menu_pl_pl.iso_8859-2.vim \
+ menu_polish_poland.1250.vim \
+ menu_ru_ru.koi8-r.vim \
+ menu_sl_si.cp1250.vim \
+ menu_sl_si.latin2.vim \
+ menu_slovak_slovak_republic.1250.vim \
+ menu_tr_tr.cp1254.vim \
+ menu_tr_tr.iso_8859-9.vim \
+ menu_sr_rs.iso_8859-5.vim \
+ menu_sr_rs.iso_8859-2.vim \
+ menu_sr_rs.ascii.vim \
+ menu_czech_czech_republic.ascii.vim \
+ menu_hu_hu.iso_8859-2.vim \
+ menu_sk_sk.iso_8859-2.vim \
+
+
+# Convert menu_zh_cn.utf-8.vim to create menu_chinese_gb.936.vim.
+menu_chinese_gb.936.vim: menu_zh_cn.utf-8.vim
+ rm -f menu_chinese_gb.936.vim
+ iconv -f utf-8 -t cp936 menu_zh_cn.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding cp936/' -e 's/" Original translations/" Generated from menu_zh_cn.utf-8.vim, DO NOT EDIT/' > menu_chinese_gb.936.vim
+
+# Convert menu_zh_tw.utf-8.vim to create menu_chinese_taiwan.950.vim.
+menu_chinese_taiwan.950.vim: menu_zh_tw.utf-8.vim
+ rm -f menu_chinese_taiwan.950.vim
+ iconv -f utf-8 -t cp950 menu_zh_tw.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding cp950/' -e 's/" Original translations/" Generated from menu_zh_tw.utf-8.vim, DO NOT EDIT/' > menu_chinese_taiwan.950.vim
+
+# Convert menu_cs_cz.utf-8.vim to create menu_cs_cz.iso_8859-2.vim.
+menu_cs_cz.iso_8859-2.vim: menu_cs_cz.utf-8.vim
+ rm -f menu_cs_cz.iso_8859-2.vim
+ iconv -f utf-8 -t iso8859-2 menu_cs_cz.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding iso-8859-2/' \
+ -e 's/" Original translations/" Generated from menu_cs_cz.utf-8.vim, DO NOT EDIT/' \
+ -e 's/\(" Menu Translations:.*\)(.*)/\1(ISO8859-2)/' \
+ > menu_cs_cz.iso_8859-2.vim
+
+# Convert menu_cs_cz.utf-8.vim to create menu_czech_czech_republic.1250.vim.
+menu_czech_czech_republic.1250.vim: menu_cs_cz.utf-8.vim
+ rm -f menu_czech_czech_republic.1250.vim
+ iconv -f utf-8 -t cp1250 menu_cs_cz.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding cp1250/' \
+ -e 's/" Original translations/" Generated from menu_cs_cz.utf-8.vim, DO NOT EDIT/' \
+ -e 's/\(" Menu Translations:.*\)(.*)/\1(CP1250)/' \
+ > menu_czech_czech_republic.1250.vim
+
+# Convert menu_cs_cz.utf-8.vim to create menu_czech_czech_republic.ascii.vim.
+menu_czech_czech_republic.ascii.vim: menu_cs_cz.utf-8.vim
+ rm -f menu_czech_czech_republic.ascii.vim
+ sed -e 's/Á/A/g' -e 's/á/a/g' -e 's/Č/C/g' -e 's/č/c/g' -e 's/Ď/D/g' \
+ -e 's/ď/d/g' -e 's/É/E/g' -e 's/é/e/g' -e 's/Ě/E/g' -e 's/ě/e/g' \
+ -e 's/Í/I/g' -e 's/í/i/g' -e 's/Ň/N/g' -e 's/ň/n/g' -e 's/Ó/O/g' \
+ -e 's/ó/o/g' -e 's/Ř/R/g' -e 's/ř/r/g' -e 's/Š/S/g' -e 's/š/s/g' \
+ -e 's/Ť/T/g' -e 's/ť/t/g' -e 's/Ú/U/g' -e 's/ú/u/g' -e 's/Ů/U/g' \
+ -e 's/ů/u/g' -e 's/Ý/Y/g' -e 's/ý/y/g' -e 's/Ž/Z/g' -e 's/ž/z/g' \
+ -e 's/scriptencoding utf-8/scriptencoding latin1/' \
+ -e 's/" Original translations/" Generated from menu_cs_cz.utf-8.vim, DO NOT EDIT/' \
+ -e 's/\(" Menu Translations:.*\)(.*)/\1(ASCII - without diacritics)/' \
+ menu_cs_cz.utf-8.vim > menu_czech_czech_republic.ascii.vim
+
+# Convert menu_ja_jp.utf-8.vim to create menu_ja_jp.euc-jp.vim.
+menu_ja_jp.euc-jp.vim: menu_ja_jp.utf-8.vim
+ rm -f menu_ja_jp.euc-jp.vim
+ iconv -f utf-8 -t euc-jp menu_ja_jp.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding euc-jp/' \
+ -e 's/" Original translations/" Generated from menu_ja_jp.utf-8.vim, DO NOT EDIT/' \
+ -e 's/\(" Menu Translations:.*\)(.*)/\1(EUC-JP)/' \
+ > menu_ja_jp.euc-jp.vim
+
+# Convert menu_ja_jp.utf-8.vim to create menu_japanese_japan.932.vim.
+menu_japanese_japan.932.vim: menu_ja_jp.utf-8.vim
+ rm -f menu_japanese_japan.932.vim
+ iconv -f utf-8 -t cp932 menu_ja_jp.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding cp932/' \
+ -e 's/" Original translations/" Generated from menu_ja_jp.utf-8.vim, DO NOT EDIT/' \
+ -e 's/\(" Menu Translations:.*\)(.*)/\1(CP932)/' \
+ > menu_japanese_japan.932.vim
+
+# Convert menu_ko_kr.utf-8.vim to create menu_ko_kr.euckr.vim.
+menu_ko_kr.euckr.vim: menu_ko_kr.utf-8.vim
+ rm -f menu_ko_kr.euckr.vim
+ iconv -f utf-8 -t euc-kr menu_ko_kr.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding euc-kr/' -e 's/" Original translations/" Generated from menu_ko_kr.utf-8.vim, DO NOT EDIT/' > menu_ko_kr.euckr.vim
+
+# Convert menu_pl_pl.utf-8.vim to create menu_pl_pl.iso_8859-2.vim.
+menu_pl_pl.iso_8859-2.vim: menu_pl_pl.utf-8.vim
+ rm -f menu_pl_pl.iso_8859-2.vim
+ iconv -f utf-8 -t iso8859-2 menu_pl_pl.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding iso-8859-2/' -e 's/" Original translations/" Generated from menu_pl_pl.utf-8.vim, DO NOT EDIT/' > menu_pl_pl.iso_8859-2.vim
+
+# Convert menu_pl_pl.utf-8.vim to create menu_polish_poland.1250.vim.
+menu_polish_poland.1250.vim: menu_pl_pl.utf-8.vim
+ rm -f menu_polish_poland.1250.vim
+ iconv -f utf-8 -t cp1250 menu_pl_pl.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding cp1250/' -e 's/" Original translations/" Generated from menu_pl_pl.utf-8.vim, DO NOT EDIT/' > menu_polish_poland.1250.vim
+
+# Convert menu_ru_ru.utf-8.vim to create menu_ru_ru.koi8-r.vim.
+menu_ru_ru.koi8-r.vim: menu_ru_ru.utf-8.vim
+ rm -f menu_ru_ru.koi8-r.vim
+ iconv -f utf-8 -t koi8-r menu_ru_ru.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding koi8-r/' -e 's/" Original translations/" Generated from menu_ru_ru.utf-8.vim, DO NOT EDIT/' > menu_ru_ru.koi8-r.vim
+
+# Convert menu_sl_si.utf-8.vim to create menu_sl_si.cp1250.vim.
+menu_sl_si.cp1250.vim: menu_sl_si.utf-8.vim
+ rm -f menu_sl_si.cp1250.vim
+ iconv -f utf-8 -t cp1250 menu_sl_si.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding cp1250/' \
+ -e 's/" Original translations/" Generated from menu_sl_si.utf-8.vim, DO NOT EDIT/' > menu_sl_si.cp1250.vim
+
+# Convert menu_uk_ua.utf-8.vim to create menu_sl_si.latin2.vim.
+menu_sl_si.latin2.vim: menu_sl_si.utf-8.vim
+ rm -f menu_sl_si.latin2.vim
+ iconv -f utf-8 -t latin2 menu_sl_si.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding latin2/' -e 's/" Original translations/" Generated from menu_sl_si.utf-8.vim, DO NOT EDIT/' > menu_sl_si.latin2.vim
+
+# Convert menu_uk_ua.utf-8.vim to create menu_slovak_slovak_republic.1250.vim.
+menu_slovak_slovak_republic.1250.vim: menu_sl_si.utf-8.vim
+ rm -f menu_slovak_slovak_republic.1250.vim
+ iconv -f utf-8 -t cp1250 menu_sl_si.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding cp1250/' -e 's/" Original translations/" Generated from menu_sl_si.utf-8.vim, DO NOT EDIT/' > menu_slovak_slovak_republic.1250.vim
+
+# Convert menu_tr_tr.utf-8.vim to create menu_tr_tr.cp1254.vim.
+menu_tr_tr.cp1254.vim: menu_tr_tr.utf-8.vim
+ rm -f menu_tr_tr.cp1254.vim
+ iconv -f utf-8 -t cp1254 menu_tr_tr.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding cp1254/' -e 's/" Original translations/" Generated from menu_tr_tr.utf-8.vim, DO NOT EDIT/' > menu_tr_tr.cp1254.vim
+
+# Convert menu_tr_tr.utf-8.vim to create menu_tr_tr.iso_8859-9.vim.
+menu_tr_tr.iso_8859-9.vim: menu_tr_tr.utf-8.vim
+ rm -f menu_tr_tr.iso_8859-9.vim
+ iconv -f utf-8 -t iso8859-9 menu_tr_tr.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding iso8859-9/' -e 's/" Original translations/" Generated from menu_tr_tr.utf-8.vim, DO NOT EDIT/' > menu_tr_tr.iso_8859-9.vim
+
+# Convert menu_sr_rs.utf-8.vim to create menu_sr_rs.iso_8859-5.vim.
+menu_sr_rs.iso_8859-5.vim: menu_sr_rs.utf-8.vim
+ rm -f menu_sr_rs.iso_8859-5.vim
+ iconv -f utf-8 -t iso8859-5 menu_sr_rs.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding iso8859-5/' -e 's/" Original translations/" Generated from menu_sr_rs.utf-8.vim, DO NOT EDIT/' > menu_sr_rs.iso_8859-5.vim
+
+# Convert menu_sr_rs.utf-8.vim to create menu_sr_rs.iso_8859-2.vim.
+menu_sr_rs.iso_8859-2.vim: menu_sr_rs.utf-8.vim
+ rm -f menu_sr_rs.iso_8859-2.vim
+ sed -e 's/а/a/g' -e 's/б/b/g' -e 's/в/v/g' -e 's/г/g/g' -e 's/д/d/g' \
+ -e 's/ђ/đ/g' -e 's/е/e/g' -e 's/ж/ž/g' -e 's/з/z/g' -e 's/и/i/g' \
+ -e 's/ј/j/g' -e 's/к/k/g' -e 's/л/l/g' -e 's/љ/lj/g' -e 's/м/m/g' \
+ -e 's/н/n/g' -e 's/њ/nj/g' -e 's/о/o/g' -e 's/п/p/g' -e 's/р/r/g' \
+ -e 's/с/s/g' -e 's/т/t/g' -e 's/ћ/ć/g' -e 's/у/u/g' -e 's/ф/f/g' \
+ -e 's/х/h/g' -e 's/ц/c/g' -e 's/ч/č/g' -e 's/џ/dž/g' -e 's/ш/š/g' \
+ -e 's/А/A/g' -e 's/Б/B/g' -e 's/В/V/g' -e 's/Г/G/g' -e 's/Д/D/g' \
+ -e 's/Ђ/Đ/g' -e 's/Е/E/g' -e 's/Ж/Ž/g' -e 's/З/Z/g' -e 's/И/I/g' \
+ -e 's/Ј/J/g' -e 's/К/K/g' -e 's/Л/L/g' -e 's/Љ/Lj/g' -e 's/М/M/g' \
+ -e 's/Н/N/g' -e 's/Њ/Nj/g' -e 's/О/O/g' -e 's/П/P/g' -e 's/Р/R/g' \
+ -e 's/С/S/g' -e 's/Т/T/g' -e 's/Ћ/Ć/g' -e 's/У/U/g' -e 's/Ф/F/g' \
+ -e 's/Х/H/g' -e 's/Ц/C/g' -e 's/Ч/Č/g' -e 's/Џ/Dž/g' -e 's/Ш/Š/g' \
+ -e 's/scriptencoding utf-8/scriptencoding iso8859-2/' -e 's/" Original translations/" Generated from menu_sr_rs.utf-8.vim, DO NOT EDIT/' \
+ menu_sr_rs.utf-8.vim | iconv -f utf-8 -t iso8859-2 \
+ > menu_sr_rs.iso_8859-2.vim
+
+# Convert menu_sr_rs.utf-8.vim to create menu_sr_rs.ascii.vim.
+menu_sr_rs.ascii.vim: menu_sr_rs.utf-8.vim
+ rm -f menu_sr_rs.ascii.vim
+ sed -e 's/а/a/g' -e 's/б/b/g' -e 's/в/v/g' -e 's/г/g/g' -e 's/д/d/g' \
+ -e 's/ђ/dj/g' -e 's/е/e/g' -e 's/ж/z/g' -e 's/з/z/g' -e 's/и/i/g' \
+ -e 's/ј/j/g' -e 's/к/k/g' -e 's/л/l/g' -e 's/љ/lj/g' -e 's/м/m/g' \
+ -e 's/н/n/g' -e 's/њ/nj/g' -e 's/о/o/g' -e 's/п/p/g' -e 's/р/r/g' \
+ -e 's/с/s/g' -e 's/т/t/g' -e 's/ћ/c/g' -e 's/у/u/g' -e 's/ф/f/g' \
+ -e 's/х/h/g' -e 's/ц/c/g' -e 's/ч/c/g' -e 's/џ/dz/g' -e 's/ш/s/g' \
+ -e 's/А/A/g' -e 's/Б/B/g' -e 's/В/V/g' -e 's/Г/G/g' -e 's/Д/D/g' \
+ -e 's/Ђ/Đ/g' -e 's/Е/E/g' -e 's/Ж/Z/g' -e 's/З/Z/g' -e 's/И/I/g' \
+ -e 's/Ј/J/g' -e 's/К/K/g' -e 's/Л/L/g' -e 's/Љ/Lj/g' -e 's/М/M/g' \
+ -e 's/Н/N/g' -e 's/Њ/Nj/g' -e 's/О/O/g' -e 's/П/P/g' -e 's/Р/R/g' \
+ -e 's/С/S/g' -e 's/Т/T/g' -e 's/Ћ/C/g' -e 's/У/U/g' -e 's/Ф/F/g' \
+ -e 's/Х/H/g' -e 's/Ц/C/g' -e 's/Ч/C/g' -e 's/Џ/Dz/g' -e 's/Ш/S/g' \
+ -e 's/scriptencoding utf-8/scriptencoding latin1/' -e 's/" Original translations/" Generated from menu_sr_rs.utf-8.vim, DO NOT EDIT/' \
+ menu_sr_rs.utf-8.vim > menu_sr_rs.ascii.vim
+
+# Convert menu_uk_ua.utf-8.vim to create menu_uk_ua.cp1251.vim.
+menu_uk_ua.cp1251.vim: menu_uk_ua.utf-8.vim
+ rm -f menu_uk_ua.cp1251.vim
+ iconv -f utf-8 -t cp1251 menu_uk_ua.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding cp1251/' -e 's/" Original translations/" Generated from menu_uk_ua.utf-8.vim, DO NOT EDIT/' > menu_uk_ua.cp1251.vim
+
+# Convert menu_uk_ua.utf-8.vim to create menu_uk_ua.koi8-u.vim.
+menu_uk_ua.koi8-u.vim: menu_uk_ua.utf-8.vim
+ rm -f menu_uk_ua.koi8-u.vim
+ iconv -f utf-8 -t koi8-u menu_uk_ua.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding koi8-u/' -e 's/" Original translations/" Generated from menu_uk_ua.utf-8.vim, DO NOT EDIT/' > menu_uk_ua.koi8-u.vim
+
+# Convert menu_hu_hu.utf-8.vim to create menu_hu_hu.iso_8859-2.vim.
+menu_hu_hu.iso_8859-2.vim: menu_hu_hu.utf-8.vim
+ rm -f menu_hu_hu.iso_8859-2.vim
+ iconv -f utf-8 -t iso8859-2 menu_hu_hu.utf-8.vim | \
+ sed -e 's/scriptencoding utf-8/scriptencoding iso-8859-2/' -e 's/" Original translations/" Generated from menu_hu_hu.utf-8.vim, DO NOT EDIT/' > menu_hu_hu.iso_8859-2.vim
+
+# Convert menu_slovak_slovak_republic.1250.vim to create menu_sk_sk.iso_8859-2.vim.
+menu_sk_sk.iso_8859-2.vim: menu_slovak_slovak_republic.1250.vim
+ rm -f menu_sk_sk.iso_8859-2.vim
+ iconv -f cp1250 -t iso8859-2 menu_slovak_slovak_republic.1250.vim | \
+ sed -e 's/scriptencoding cp1250/scriptencoding iso-8859-2/' -e 's/" Original translations/" Generated from menu_slovak_slovak_republic.1250.vim, DO NOT EDIT/' > menu_sk_sk.iso_8859-2.vim
diff --git a/runtime/lang/README.txt b/runtime/lang/README.txt
new file mode 100644
index 0000000..150ccd9
--- /dev/null
+++ b/runtime/lang/README.txt
@@ -0,0 +1,56 @@
+Language files for Vim: Translated menus
+
+The contents of each menu file is a sequence of lines with "menutrans"
+commands. Read one of the existing files to get an idea of how this works.
+
+More information in the on-line help:
+
+ :help multilang-menus
+ :help :menutrans
+ :help 'langmenu'
+ :help :language
+
+You can find a couple of helper tools for translating menus on github:
+https://github.com/adaext/vim-menutrans-helper
+
+The "$VIMRUNTIME/menu.vim" file will search for a menu translation file. This
+depends on the value of the "v:lang" variable.
+
+ "menu_" . v:lang . ".vim"
+
+When the 'menutrans' option is set, its value will be used instead of v:lang.
+
+The file name is always lower case. It is the full name as the ":language"
+command shows (the LC_MESSAGES value).
+
+For example, to use the Big5 (Taiwan) menus on MS-Windows the $LANG will be
+
+ Chinese(Taiwan)_Taiwan.950
+
+and use the menu translation file:
+
+ $VIMRUNTIME/lang/menu_chinese(taiwan)_taiwan.950.vim
+
+On Unix you should set $LANG, depending on your shell:
+
+ csh/tcsh: setenv LANG "zh_TW.Big5"
+ sh/bash/ksh: export LANG="zh_TW.Big5"
+
+and the menu translation file is:
+
+ $VIMRUNTIME/lang/menu_zh_tw.big5.vim
+
+The menu translation file should set the "did_menu_trans" variable so that Vim
+will not load another file.
+
+
+AUTOMATIC CONVERSION
+
+When Vim was compiled with multi-byte support, conversion between latin1 and
+UTF-8 will always be possible. Other conversions depend on the iconv
+library, which is not always available.
+For UTF-8 menu files which only use latin1 characters, you can rely on Vim
+doing the conversion. Let the UTF-8 menu file source the latin1 menu file,
+and put "scriptencoding latin1" in that one.
+Other conversions may not always be available (e.g., between iso-8859-# and
+MS-Windows codepages), thus the converted menu file must be available.
diff --git a/runtime/lang/menu_af.latin1.vim b/runtime/lang/menu_af.latin1.vim
new file mode 100644
index 0000000..aac2e72
--- /dev/null
+++ b/runtime/lang/menu_af.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Afrikaans
+
+source <sfile>:p:h/menu_af_af.latin1.vim
diff --git a/runtime/lang/menu_af.utf-8.vim b/runtime/lang/menu_af.utf-8.vim
new file mode 100644
index 0000000..be39b59
--- /dev/null
+++ b/runtime/lang/menu_af.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Afrikaans for UTF-8 encoding
+
+source <sfile>:p:h/menu_af_af.latin1.vim
diff --git a/runtime/lang/menu_af_af.latin1.vim b/runtime/lang/menu_af_af.latin1.vim
new file mode 100644
index 0000000..649c4e1
--- /dev/null
+++ b/runtime/lang/menu_af_af.latin1.vim
@@ -0,0 +1,158 @@
+" Menu Translations: Afrikaas
+" Maintainer: Danie Roux <droux@tuks.co.za>
+" Last Change: 2012 May 01
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" The translations below are in latin1, but they work for cp1252 and
+" iso-8859-15 without conversion as well.
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+
+" Help menu
+menutrans &Help &Hulp
+menutrans &Overview<Tab><F1> &Oorsig<Tab><F1>
+menutrans &How-to\ links &How-to\ Indeks
+"menutrans &GUI &GUI
+menutrans &Credits &Met\ dank\ aan
+menutrans Co&pying &Kopiereg
+menutrans &Find\.\.\. &Soek\.\.\.
+menutrans &Version &Weergawe
+menutrans &About &Inleiding\ skerm
+
+" File menu
+menutrans &File &Ler
+menutrans &Open\.\.\.<Tab>:e &Open\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Maak\ oop\ in\ nuwe\ &venster\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Nuut<Tab>:enew
+menutrans &Close<Tab>:close Maak\ &Toe<Tab>:close
+menutrans &Save<Tab>:w &Skryf<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:w Skryf\ &as\.\.\.<Tab>:w
+menutrans &Print &Druk
+menutrans Sa&ve-Exit<Tab>:wqa Skryf\ en\ verlaat<Tab>:wqa
+menutrans E&xit<Tab>:qa &Verlaat<Tab>:qa
+
+" Edit menu
+menutrans &Edit &Wysig
+menutrans &Undo<Tab>u Terug<Tab>u
+menutrans &Redo<Tab>^R Voo&ruit<Tab>^R
+menutrans Rep&eat<Tab>\. &Herhaal<Tab>\.
+menutrans Cu&t<Tab>"+x &Knip<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopier<Tab>"+y
+menutrans &Paste<Tab>"+gP Plak<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Voeg\ &Voor\ in<Tab>[p
+menutrans Put\ &After<Tab>]p Voeg\ A&gter\ in<Tab>]p
+menutrans &Select\ all<Tab>ggVG Kies\ &Alles<Tab>ggVG
+menutrans &Find\.\.\. &Soek\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Soek\ en\ Vervang\.\.\.
+menutrans Options\.\.\. Opsies\.\.\.
+
+" Programming menu
+menutrans &Tools &Gereedskap
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Spring\ na\ Etiket<Tab>g^]
+menutrans Jump\ &back<Tab>^T Spring\ &Terug<Tab>^T
+menutrans Build\ &Tags\ File Genereer\ &Etiket\ Ler
+menutrans &Make<Tab>:make Voer\ &Make\ uit<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Foutlys<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &Boodskaplys<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Volgende\ Fout<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Vorige\ Fout<Tab>:cp
+menutrans &Older\ List<Tab>:cold &Ouer\ Lys<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &Nuwer\ Lys<Tab>:cnew
+menutrans Error\ &Window<Tab>:cwin Foute\ Venster<Tab>:cwin
+menutrans Convert\ to\ HEX<Tab>:%!xxd Verwissel\ na\ HEX<Tab>:%!xxd
+menutrans Convert\ back<Tab>:%!xxd\ -r Verwissel\ terug<Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers &Buffers
+menutrans Refresh Verfris
+menutrans Delete Verwyder
+menutrans Alternate Vorige
+menutrans [No\ File] [Geen\ Ler]
+
+" Window menu
+menutrans &Window &Venster
+menutrans &New<Tab>^Wn &Nuut<Tab>^Wn
+menutrans S&plit<Tab>^Ws Ver&deel<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Verdeel\ N&a\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Verdeel\ Vertikaal<Tab>^Wv
+menutrans &Close<Tab>^Wc &Maak\ toe<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Maak\ &Ander\ Toe<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww Volgende<Tab>^Ww
+menutrans P&revious<Tab>^WW &Vorige<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Gelyke\ hoogte<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ &Maksimale\ hoogte<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Mi&nimale\ hoogte<Tab>^W1_
+menutrans Max\ Width<Tab>^W\| Maksimale\ breedte<Tab>^W\|
+menutrans Min\ Width<Tab>^W1\| Minimale\ breedte<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR Roteer\ na\ &bo<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Roteer\ na\ &onder<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. Kies\ font\.\.\.
+
+" The popup menu
+menutrans &Undo &Terug
+menutrans Cu&t Knip
+menutrans &Copy &Kopier
+menutrans &Paste &Plak
+menutrans &Delete &Verwyder
+menutrans Select\ Blockwise Kies\ per\ Blok
+menutrans Select\ &Word Kies\ een\ &Woord
+menutrans Select\ &Line Kies\ een\ &Rel
+menutrans Select\ &Block Kies\ een\ &Blok
+menutrans Select\ &All Kies\ &Alles
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Maak ler oop
+ tmenu ToolBar.Save Skryf ler
+ tmenu ToolBar.SaveAll Skryf alle lers
+ tmenu ToolBar.Print Druk
+ tmenu ToolBar.Undo Terug
+ tmenu ToolBar.Redo Vooruit
+ tmenu ToolBar.Cut Knip
+ tmenu ToolBar.Copy Kopier
+ tmenu ToolBar.Paste Plak
+ tmenu ToolBar.Find Soek...
+ tmenu ToolBar.FindNext Soek volgende
+ tmenu ToolBar.FindPrev Soek vorige
+ tmenu ToolBar.Replace Soek en vervang...
+ tmenu ToolBar.LoadSesn Laai sessie
+ tmenu ToolBar.SaveSesn Stoor sessie
+ tmenu ToolBar.RunScript Voer vim skrip uit
+ tmenu ToolBar.Make Voer make uit
+ tmenu ToolBar.Shell Begin dop
+ tmenu ToolBar.RunCtags Genereer etikette
+ tmenu ToolBar.TagJump Spring na etiket
+ tmenu ToolBar.Help Hulp
+ tmenu ToolBar.FindHelp Soek hulp...
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Sintaks
+menutrans Set\ 'syntax'\ only Stel\ slegs\ 'syntax'
+menutrans Set\ 'filetype'\ too Verander\ 'filetype'\ ook
+menutrans &Off &Af
+menutrans &Manual &Met\ die\ hand
+menutrans A&utomatic O&utomaties
+menutrans o&n\ (this\ file) Aa&n\ (die\ ler)
+menutrans o&ff\ (this\ file) &Af\ (die\ ler)
+menutrans Co&lor\ test Toets\ die\ &kleure
+menutrans &Highlight\ test Toets\ die\ verligting
+menutrans &Convert\ to\ HTML Verwissel\ na\ HTML
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_af_af.utf-8.vim b/runtime/lang/menu_af_af.utf-8.vim
new file mode 100644
index 0000000..be39b59
--- /dev/null
+++ b/runtime/lang/menu_af_af.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Afrikaans for UTF-8 encoding
+
+source <sfile>:p:h/menu_af_af.latin1.vim
diff --git a/runtime/lang/menu_ca.latin1.vim b/runtime/lang/menu_ca.latin1.vim
new file mode 100644
index 0000000..9eedfd8
--- /dev/null
+++ b/runtime/lang/menu_ca.latin1.vim
@@ -0,0 +1,3 @@
+" Menu translations for Catalan
+"
+source <sfile>:p:h/menu_ca_es.latin1.vim
diff --git a/runtime/lang/menu_ca.utf-8.vim b/runtime/lang/menu_ca.utf-8.vim
new file mode 100644
index 0000000..23ee10d
--- /dev/null
+++ b/runtime/lang/menu_ca.utf-8.vim
@@ -0,0 +1,7 @@
+" Menu translations for Catalan
+"
+" Maintainer: Ernest Adrogu <eadrogue@gmx.net>
+" Last Change: 29 Dec 2003
+"
+source <sfile>:p:h/menu_ca_es.latin1.vim
+
diff --git a/runtime/lang/menu_ca_es.latin1.vim b/runtime/lang/menu_ca_es.latin1.vim
new file mode 100644
index 0000000..6f8ea7f
--- /dev/null
+++ b/runtime/lang/menu_ca_es.latin1.vim
@@ -0,0 +1,316 @@
+" Menu translations for Catalan
+"
+" Maintainer: Ernest Adrogu <eadrogue@gmx.net>
+" Last Change: 26 Jul 2017
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" The translations below are in latin1, but they work for cp1252,
+" iso-8859-15 without conversion as well.
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+" men Ajuda
+menutrans &Help &Ajuda
+menutrans &Overview<Tab><F1> &Introducci<Tab><F1>
+menutrans &User\ Manual &Manual\ de\ l'usuari
+menutrans &How-to\ links Com\ &fer\.\.\.?
+menutrans &Find\.\.\. &Cerca\.\.\.
+menutrans &Credits &Autors
+menutrans Co&pying Con&dicions
+menutrans &Sponsor/Register &Patrocini/Registre
+menutrans O&rphans &Orfes
+menutrans &Version &Versi
+menutrans &About &Quant\ a\.\.\.
+" text del dileg Ajuda/Cerca...
+let g:menutrans_help_dialog = "Introduu el terme sobre el qual necessiteu ajuda.\n\nUseu el prefix i_ per ordres d'entrada (p.ex.: i_CTRL-X)\nUseu el prefix c_ per ordres de la lnia d'ordres (p.ex.: c_<Del>)\nUseu el prefix ' per noms d'opcions (p.ex.: 'shiftwidth')"
+
+" men Fitxer
+menutrans &File &Fitxer
+menutrans &Open\.\.\.<Tab>:e &Obre\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Obre\ en\ una\ &finestra\ nova\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Obre\ pestanya\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nou<Tab>:enew
+menutrans &Close<Tab>:close &Tanca<Tab>:close
+menutrans &Save<Tab>:w &Desa<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav &Anomena\ i\ desa\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. &Mostra\ les\ diferncies\ respecte\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Aplica\ les\ modificacions\ de\.\.\.
+menutrans &Print &Imprimeix
+menutrans Sa&ve-Exit<Tab>:wqa Desa\ i\ s&urt<Tab>:wqa
+menutrans E&xit<Tab>:qa &Surt<Tab>:qa
+
+" men Edita
+menutrans &Edit &Edita
+menutrans &Undo<Tab>u &Desfs<Tab>u
+menutrans &Redo<Tab>^R &Refs<Tab>^R
+menutrans Rep&eat<Tab>\. Re&peteix<Tab>\.
+menutrans Cu&t<Tab>"+x Re&talla<Tab>"+x
+menutrans &Copy<Tab>"+y &Copia<Tab>"+y
+menutrans &Paste<Tab>"+gP Engan&xa<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Posa\ &abans<Tab>[p
+menutrans Put\ &After<Tab>]p P&osa\ desprs<Tab>]p
+menutrans &Delete<Tab>x Suprimeix<Tab>x
+menutrans &Select\ All<Tab>ggVG &Selecciona-ho\ tot<Tab>ggVG
+menutrans &Find\.\.\. &Cerca\.\.\.
+menutrans &Find<Tab>/ &Cerca<Tab>/
+menutrans Find\ and\ Rep&lace Cerca\ i\ s&ubstitueix
+menutrans Find\ and\ Rep&lace\.\.\. Cerca\ i\ s&ubstitueix\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s Cerca\ i\ s&ubstitueix<Tab>:%s
+menutrans Find\ and\ Rep&lace<Tab>:s Cerca\ i\ s&ubstitueix<Tab>:s
+menutrans Settings\ &Window Fin&estra\ d'opcions
+menutrans Startup\ &Settings Opcions\ i&nicials
+menutrans &Global\ Settings Opcions\ &globals
+" submen Edita/Opcions Globals
+ menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Ressaltat\ de\ &patrons<Tab>:set\ hls!
+ menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Sensibilitat\ a\ les\ ma&jscules<Tab>:set\ ic!
+ menutrans Toggle\ &Showmatch<Tab>:set\ sm! &Ressaltat\ de\ coincidncies<Tab>:set\ sm!
+ menutrans &Context\ lines Lnies\ de\ co&ntext
+ menutrans &Virtual\ Edit Edici\ &virtual
+" submen Edita/Opcions Globals/Edici virtual
+ menutrans Never &Mai
+ menutrans Block\ Selection &Selecci\ de\ blocs
+ menutrans Insert\ mode Mode\ d'&inserci
+ menutrans Block\ and\ Insert &Blocs\ i\ inserci
+ menutrans Always S&empre
+ menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Mode\ d'&inserci<Tab>:set\ im!
+ menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Co&mpatible\ amb\ Vi<Tab>:set\ cp!
+ menutrans Search\ &Path\.\.\. &Ubicacions\.\.\.
+ menutrans Ta&g\ Files\.\.\. Fitxers\ d'&etiquetes\.\.\.
+ menutrans Toggle\ &Toolbar &Barra\ d'eines
+ menutrans Toggle\ &Bottom\ Scrollbar Barra\ de\ &desplaament\ inferior
+ menutrans Toggle\ &Left\ Scrollbar Barra\ de\ desplaament\ e&squerra
+ menutrans Toggle\ &Right\ Scrollbar Barra\ de\ desplaament\ dre&ta
+menutrans F&ile\ Settings Opcions\ del\ f&itxer
+" submen Edita/Opcions del fitxer
+ menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Ennumera\ les\ lnies<Tab>:set\ nu!
+ menutrans Toggle\ &List\ Mode<Tab>:set\ list! Mode\ &llista<Tab>:set\ list!
+ menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! A&justa\ les\ lnies\ llargues<Tab>:set\ wrap!
+ menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Ajusta\ sense\ partir\ &paraules<Tab>:set\ lbr!
+ menutrans Toggle\ &expand-tab<Tab>:set\ et! Estn\ les\ ta&bulacions<Tab>:set\ et!
+ menutrans Toggle\ &auto-indent<Tab>:set\ ai! &Sagnia\ automtica<Tab>:set\ ai!
+ menutrans Toggle\ &C-indenting<Tab>:set\ cin! Sagnia\ estil\ &C<Tab>:set\ cin!
+ menutrans &Shiftwidth Sa&gnia
+ menutrans Soft\ &Tabstop Amplada\ de\ &tabulaci
+ menutrans Te&xt\ Width\.\.\. &Amplada\ del\ text\.\.\.
+ menutrans &File\ Format\.\.\. &Format\ del\ fitxer\.\.\.
+menutrans Select\ Fo&nt\.\.\. &Fosa\.\.\.
+menutrans C&olor\ Scheme Es&quema\ de\ colors
+" submen Edita/Esquema de colors
+ menutrans blue blau
+ menutrans darkblue blau\ fosc
+ menutrans default normal
+ menutrans desert desert
+ menutrans evening vesprada
+ menutrans morning matinada
+ menutrans peachpuff prssec
+ menutrans shine brillant
+menutrans &Keymap &Mapa\ de\ tecles
+" submen Edita/Mapa de tecles
+ menutrans None Cap
+ menutrans accents Accents
+ menutrans arabic rab
+ menutrans czech Txec
+ menutrans esperanto Esperanto
+ menutrans greek Grec
+ menutrans hebrew Hebreu
+ menutrans hebrewp Hebreu\ (fontic)
+ menutrans lithuanian-baltic Litu\ (bltic)
+ menutrans pinyin Mandar\ (fontic)
+ menutrans russian-jcuken Rus\ (jcuken)
+ menutrans russian-jcukenwin Rus\ (jcukenwin)
+ menutrans russian-yawerty Rus\ (yawerty)
+ menutrans serbian Serbi
+ menutrans serbian-latin Serbi\ (llat)
+ menutrans slovak Eslovac
+" text del dileg Edita/Opcions globals/Ubicacions...
+let g:menutrans_path_dialog = "Introduu les ubicacions on cercar fitxers.\nSepareu els noms dels directoris amb una coma."
+" text del dileg Edita/Opcions globals/Fitxers d'etiquetes...
+let g:menutrans_tags_dialog = "Introduu els noms dels fitxers d'etiquetes.\nSepareu els noms amb una coma."
+" text del dileg Edita/Opcions del fitxer/Amplada del text...
+let g:menutrans_textwidth_dialog = "Introduu la nova amplada del text (0 per infinit): "
+" text del dileg Edita/Opcions del fitxer/Format del fitxer...
+let g:menutrans_fileformat_dialog = "Seleccioneu el format per escriure el fitxer."
+
+
+" men Eines
+menutrans &Tools Ei&nes
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Salta\ a\ aquesta\ etiqueta<Tab>g^]
+menutrans Jump\ &back<Tab>^T Salta\ en&rere<Tab>^T
+menutrans Build\ &Tags\ File Crea\ un\ fitxer\ d'eti&quetes
+menutrans &Spelling &Ortografia
+" submen Eines/Ortografia
+ menutrans &Spell\ Check\ On Activa\ la\ &revisi\ ortogrfica
+ menutrans Spell\ Check\ &Off &Desactiva\ la\ revisi\ ortogrfica
+ menutrans To\ &Next\ error<Tab>]s Error\ &segent<tab>]s
+ menutrans To\ &Previous\ error<Tab>[s Error\ &anterior<tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= Su&ggeriments<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall Re&peteix\ la\ correcci<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" Selecciona\ l'idioma\ "en"
+ menutrans Set\ language\ to\ "en_au" Selecciona\ l'idioma\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" Selecciona\ l'idioma\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" Selecciona\ l'idioma\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" Selecciona\ l'idioma\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" Selecciona\ l'idioma\ "en_us"
+ menutrans Set\ language\ to\ "ca" Selecciona\ l'idioma\ "ca"
+ menutrans Set\ language\ to\ "es" Selecciona\ l'idioma\ "es"
+ menutrans Set\ language\ to\ "fr" Selecciona\ l'idioma\ "fr"
+ menutrans Set\ language\ to\ "it" Selecciona\ l'idioma\ "it"
+ menutrans &Find\ More\ Languages &Cerca\ altres\ idiomes
+menutrans &Folding &Plecs
+" submen Eines/Plecs
+ menutrans &Enable/Disable\ folds<Tab>zi &Habilita/Deshabilita\ els\ plecs<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv &Lnia\ del\ cursor\ visible<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx &Noms\ visible\ la\ lnia\ del\ cursor<Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm &Tanca\ ms\ plecs<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Tanca\ t&ots\ els\ plecs<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Obre\ &ms\ plecs<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR O&bre\ tots\ els\ plecs<Tab>zR
+ menutrans Fold\ Met&hod Mto&de
+" submen Eines/Plcs/Mtode
+ menutrans M&anual M&anual
+ menutrans I&ndent &Sagnia
+ menutrans E&xpression E&xpressi
+ menutrans S&yntax S&intaxi
+ menutrans &Diff &Diferncies
+ menutrans Ma&rker &Marques
+ menutrans Create\ &Fold<Tab>zf &Crea\ un\ plec<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd &Elimina\ un\ plec<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Elimina\ tot&s\ els\ plecs<Tab>zD
+ menutrans Fold\ col&umn\ width &Amplada\ de\ la\ columna\ de\ plecs
+menutrans &Diff &Diferncies
+" submen Eines/Diferncies
+ menutrans &Update &Actualitza
+ menutrans &Get\ Block &Obtingues\ un\ bloc
+ menutrans &Put\ Block &Posa\ un\ bloc
+menutrans &Make<Tab>:make Crida\ &make<Tab>:make
+menutrans &List\ Errors<Tab>:cl Llista\ d'&errors<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &Llista\ de\ missatges<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Error\ se&gent<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Error\ an&terior<Tab>:cp
+menutrans &Older\ List<Tab>:cold Llista\ &antiga<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Llista\ no&va<Tab>:cnew
+menutrans Error\ &Window F&inestra\ d'errors
+" submen Eines/Finestra d'errors
+ menutrans &Update<Tab>:cwin &Actualitza<Tab>:cwin
+ menutrans &Open<Tab>:copen &Obre<Tab>:copen
+ menutrans &Close<Tab>:cclose &Tanca<Tab>:cclose
+menutrans Se&t\ Compiler &Compilador
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Converteix\ a\ &HEX<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Torna\ al\ format\ &original<Tab>:%!xxd\ -r
+
+
+" men Buffers
+menutrans &Buffers &Buffers
+menutrans &Refresh\ menu &Refresca\ el\ men
+menutrans &Delete &Elimina
+menutrans &Alternate &Alterna
+menutrans &Next &Segent
+menutrans &Previous A&nterior
+let g:menutrans_no_file = "[Cap fitxer]"
+
+
+" men Finestra
+menutrans &Window F&inestra
+menutrans &New<Tab>^Wn &Nova<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Divideix<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Divideix\ &en\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Divideix\ &verticalment<Tab>^Wv
+menutrans Split\ File\ E&xplorer E&xplorador\ de\ fitxers
+menutrans &Close<Tab>^Wc &Tanca<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Tanca\ les\ altre&s<Tab>^Wo
+menutrans Move\ &To M&ou\ a
+" submen Finestra/Mou
+ menutrans &Top<Tab>^WK &Dalt\ de\ tot<Tab>^WK
+ menutrans &Bottom<Tab>^WJ &Baix\ de\ tot<Tab>^WJ
+ menutrans &Left\ side<Tab>^WH Costat\ &esquerra<Tab>^WH
+ menutrans &Right\ side<Tab>^WL Costat\ d&ret<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Alterna\ cap\ am&unt<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Alte&rna\ cap\ avall<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= &Iguala<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Mxima\ &alada<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Mnima\ a&lada<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Mxima\ a&mplada<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Mnima\ am&plada<Tab>^W1\|
+
+
+" men emergent
+menutrans &Undo &Desfs
+menutrans Cu&t &Retalla
+menutrans &Copy &Copia
+menutrans &Paste &Enganxa
+menutrans &Delete &Suprimeix
+menutrans Select\ Blockwise Se&lecci
+menutrans Select\ &Word Selecci\ de\ &paraules
+menutrans Select\ &Line Selecci\ de\ &lnies
+menutrans Select\ &Block Selecci\ de\ bl&ocs
+menutrans Select\ &All Selecciona-ho\ &tot
+
+
+" barra d'eines
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Obre un fitxer
+ tmenu ToolBar.Save Desa el fitxer
+ tmenu ToolBar.SaveAll Desa tots els fitxers
+ tmenu ToolBar.Print Imprimeix
+ tmenu ToolBar.Undo Desfs
+ tmenu ToolBar.Redo Refs
+ tmenu ToolBar.Cut Retalla
+ tmenu ToolBar.Copy Copia
+ tmenu ToolBar.Paste Enganxa
+ tmenu ToolBar.Find Cerca
+ tmenu ToolBar.FindNext Cerca el segent
+ tmenu ToolBar.FindPrev Cerca l'anterior
+ tmenu ToolBar.Replace Cerca i substitueix
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Finestra nova
+ tmenu ToolBar.WinSplit Divideix la finestra
+ tmenu ToolBar.WinMax Alada mxima
+ tmenu ToolBar.WinMin Alada mnima
+ tmenu ToolBar.WinVSplit Divideix la finestra verticalment
+ tmenu ToolBar.WinMaxWidth Amplada mxima
+ tmenu ToolBar.WinMinWidth Amplada mnima
+ tmenu ToolBar.WinClose Tanca la finestra
+ endif
+ tmenu ToolBar.LoadSesn Carrega una sessi
+ tmenu ToolBar.SaveSesn Desa la sessi
+ tmenu ToolBar.RunScript Executa un script
+ tmenu ToolBar.Make Crida a make
+ tmenu ToolBar.Shell Obre l'intrpret d'ordres
+ tmenu ToolBar.RunCtags Crea un fitxer d'etiquetes
+ tmenu ToolBar.TagJump Salta a una etiqueta
+ tmenu ToolBar.Help Ajuda
+ tmenu ToolBar.FindHelp Cerca a l'ajuda
+ endfun
+endif
+
+
+" men Sintaxi
+menutrans &Syntax &Sintaxi
+menutrans &Manual &Manual
+menutrans A&utomatic A&utomtica
+menutrans on/off\ for\ &This\ file Activa/Desactiva\ en\ &aquest\ fitxer
+menutrans &Show\ File\ Types\ in\ Menu Mostra\ tots\ els\ &tipus\ al\ men
+menutrans &Off &Desactiva
+menutrans Co&lor\ test Prova\ dels\ &colors
+menutrans &Highlight\ test Prova\ del\ &ressaltat
+menutrans &Convert\ to\ HTML Converteix\ a\ &HTML
+menutrans Assembly Ensamblador
+menutrans Config Configuraci
+menutrans Set\ '&syntax'\ only Noms\ el\ ressaltat\ de\ sintaxi
+menutrans Set\ '&filetype'\ too Carrega\ tamb\ els\ plugins
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_ca_es.utf-8.vim b/runtime/lang/menu_ca_es.utf-8.vim
new file mode 100644
index 0000000..23ee10d
--- /dev/null
+++ b/runtime/lang/menu_ca_es.utf-8.vim
@@ -0,0 +1,7 @@
+" Menu translations for Catalan
+"
+" Maintainer: Ernest Adrogu <eadrogue@gmx.net>
+" Last Change: 29 Dec 2003
+"
+source <sfile>:p:h/menu_ca_es.latin1.vim
+
diff --git a/runtime/lang/menu_chinese(gb)_gb.936.vim b/runtime/lang/menu_chinese(gb)_gb.936.vim
new file mode 100644
index 0000000..cc526fb
--- /dev/null
+++ b/runtime/lang/menu_chinese(gb)_gb.936.vim
@@ -0,0 +1,7 @@
+" Menu Translations: Simplified Chinese (Windows)
+" Last Change: Tue Sep 4 11:26:52 CST 2001
+
+" $LANG on Windows 95/98/NT is Chinese(GB)_GB.936
+" $LANG on Windows 2000/ME is Chinese_GB.936
+" Source the other one from here.
+source <sfile>:p:h/menu_chinese_gb.936.vim
diff --git a/runtime/lang/menu_chinese(taiwan)_taiwan.950.vim b/runtime/lang/menu_chinese(taiwan)_taiwan.950.vim
new file mode 100644
index 0000000..7636039
--- /dev/null
+++ b/runtime/lang/menu_chinese(taiwan)_taiwan.950.vim
@@ -0,0 +1,7 @@
+" Menu Translations: Traditional Chinese (for UNIX/Big5 Windows)
+" Last Change: 2000 Nov 11
+
+" $LANG on Windows 95/98/NT is Chinese(Taiwan)_Taiwan.950
+" $LANG on Windows 2000/ME is Chinese_Taiwan.950
+" Source the other one from here.
+source <sfile>:p:h/menu_chinese_taiwan.950.vim
diff --git a/runtime/lang/menu_chinese_gb.936.vim b/runtime/lang/menu_chinese_gb.936.vim
new file mode 100644
index 0000000..915cd80
--- /dev/null
+++ b/runtime/lang/menu_chinese_gb.936.vim
@@ -0,0 +1,571 @@
+" Menu Translations: Simplified Chinese
+" Maintainer: Ada (Haowen) Yu <me@yuhaowen.com>
+" Previous Maintainer: Shun Bai <baishunde@gmail.com>, Yuheng Xie <elephant@linux.net.cn>
+" Last Change: 2022 July 9
+" Generated from menu_zh_cn.utf-8.vim, DO NOT EDIT
+"
+" Generated with the scripts from:
+"
+" https://github.com/adaext/vim-menutrans-helper
+
+" Quit when menu translations have already been done.
+
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo = &cpo
+set cpo&vim
+
+scriptencoding cp936
+
+" Help menu
+menutrans &Help (&H)
+" Help menuitems and dialog {{{1
+menutrans &Overview<Tab><F1> (&O)<Tab><F1>
+menutrans &User\ Manual ûֲ(&U)
+menutrans &How-to\ Links ʹ(&H)
+menutrans &Find\.\.\. (&F)\.\.\.
+menutrans &Credits л(&C)
+menutrans Co&pying Ȩ(&P)
+menutrans &Sponsor/Register /ע(&S)
+menutrans O&rphans ȹ¶(&R)
+menutrans &Version 汾(&V)
+menutrans &About (&A)
+
+" fun! s:Helpfind()
+if !exists("g:menutrans_help_dialog")
+ let g:menutrans_help_dialog = "򵥴Իð:\n\nǰ׺ i_ ʾģʽµ(: i_CTRL-X)\nǰ׺ c_ ʾµı༭(: c_<Del>)\nǰ׺ ' ʾѡ(: 'shiftwidth')"
+endif
+" }}}
+
+" File menu
+menutrans &File ļ(&F)
+" File menuitems {{{1
+menutrans &Open\.\.\.<Tab>:e (&O)\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp ڲִڴ(&L)\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew ڱǩҳ\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew ½(&N)<Tab>:enew
+menutrans &Close<Tab>:close ر(&C)<Tab>:close
+menutrans &Save<Tab>:w (&S)<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Ϊ(&A)\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ With\.\.\. ִԶԱȲ(Diff)(&D)\.\.\.
+menutrans Split\ Patched\ &By\.\.\. ִԽ޲(Patch)(&B)\.\.\.
+menutrans &Print ӡ(&P)
+menutrans Sa&ve-Exit<Tab>:wqa 沢˳(&V)<Tab>:wqa
+menutrans E&xit<Tab>:qa ˳(&X)<Tab>:qa
+" }}}
+
+" Edit menu
+menutrans &Edit ༭(&E)
+" Edit menuitems {{{1
+menutrans &Undo<Tab>u (&U)<Tab>u
+menutrans &Redo<Tab>^R ָ(&R)<Tab>^R
+menutrans Rep&eat<Tab>\. ظ(&E)<Tab>\.
+menutrans Cu&t<Tab>"+x (&T)<Tab>"+x
+menutrans &Copy<Tab>"+y (&C)<Tab>"+y
+menutrans &Paste<Tab>"+gP ճ(&P)<Tab>"+gP
+menutrans Put\ &Before<Tab>[p ճǰ(&B)<Tab>[p
+menutrans Put\ &After<Tab>]p ճ(&A)<Tab>]p
+menutrans &Delete<Tab>x ɾ(&D)<Tab>x
+menutrans &Select\ All<Tab>ggVG ȫѡ(&S)<Tab>ggVG
+menutrans &Find\.\.\. (&F)\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Һ滻(&L)\.\.\.
+menutrans &Find<Tab>/ (&F)<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s Һ滻(&L)<Tab>:%s
+menutrans Find\ and\ Rep&lace<Tab>:s Һ滻(&L)<Tab>:s
+menutrans Settings\ &Window ô(&W)
+menutrans Startup\ &Settings (&S)
+
+" Edit/Global Settings
+menutrans &Global\ Settings ȫ(&G)
+" Edit.Global Settings menuitems and dialogs {{{2
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! /ظ(&H)<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! /غԴСд(&I)<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! /ʾƥ(&S)<Tab>:set\ sm!
+menutrans &Context\ Lines (&C)
+menutrans &Virtual\ Edit ༭(&V)
+" Edit.Global Settings.Virtual Edit menuitems {{{3
+menutrans Never Ӳ
+menutrans Block\ Selection ֻѡοʱ
+menutrans Insert\ Mode ֻڲģʽʱ
+menutrans Block\ and\ Insert ѡοͲģʽʱ
+menutrans Always ʼ
+" }}}
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! /زģʽ(&M)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! /\ Vi\ (&O)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. ·(&P)\.\.\.
+menutrans Ta&g\ Files\.\.\. ļ(Tags)(&G)\.\.\.
+
+" GUI options
+menutrans Toggle\ &Toolbar /ع(&T)
+menutrans Toggle\ &Bottom\ Scrollbar /صײ(&B)
+menutrans Toggle\ &Left\ Scrollbar /(&L)
+menutrans Toggle\ &Right\ Scrollbar /Ҳ(&R)
+
+" fun! s:SearchP()
+if !exists("g:menutrans_path_dialog")
+ let g:menutrans_path_dialog = "·\nöŷָĿ¼"
+endif
+
+" fun! s:TagFiles()
+if !exists("g:menutrans_tags_dialog")
+ let g:menutrans_tags_dialog = "ļ(Tags)ơ\nöŷָļ"
+endif
+" }}}
+
+" Edit/File Settings
+menutrans F&ile\ Settings ļ(&I)
+" Edit.File Settings menuitems and dialogs {{{2
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! /к(&N)<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! /к(&V)<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! /бģʽ(&L)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! /ػ(&W)<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! /شβ(&R)<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et! /Ʊչ(&E)<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! /Զ(&A)<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! /\ C\ ʽ(&C)<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth (&S)
+menutrans Soft\ &Tabstop Ʊλ(Soft\ Tabstop)(&T)
+menutrans Te&xt\ Width\.\.\. ı(&X)\.\.\.
+menutrans &File\ Format\.\.\. ļʽ(&F)\.\.\.
+
+" fun! s:TextWidth()
+if !exists("g:menutrans_textwidth_dialog")
+ let g:menutrans_textwidth_dialog = "ı(ÿַ0 ʾ):"
+endif
+
+" fun! s:FileFormat()
+if !exists("g:menutrans_fileformat_dialog")
+ let g:menutrans_fileformat_dialog = "ѡļıʽ:"
+endif
+if !exists("g:menutrans_fileformat_choices")
+ let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\nȡ(&C)"
+endif
+" }}}
+menutrans Show\ C&olor\ Schemes\ in\ Menu ڲ˵ʾɫ(&O)
+menutrans C&olor\ Scheme ɫ(&O)
+menutrans Show\ &Keymaps\ in\ Menu ڲ˵ʾӳ(&K)
+menutrans &Keymap ӳ(&K)
+menutrans Select\ Fo&nt\.\.\. ѡ(&N)\.\.\.
+" }}}
+
+" Programming menu
+menutrans &Tools (&T)
+" Tools menuitems {{{1
+menutrans &Jump\ to\ This\ Tag<Tab>g^] ת(Tag)(&J)<Tab>g^]
+menutrans Jump\ &Back<Tab>^T ת(&B)<Tab>^T
+menutrans Build\ &Tags\ File ɱļ(Tags)(&T)
+
+" Tools.Spelling Menu
+menutrans &Spelling ƴд(&S)
+" Tools.Spelling menuitems and dialog {{{2
+menutrans &Spell\ Check\ On ƴд(&S)
+menutrans Spell\ Check\ &Off رƴд(&O)
+menutrans To\ &Next\ Error<Tab>]s һ(&N)<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s һ(&P)<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= (&C)<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall ȫͬ(&R)<Tab>:spellrepall
+menutrans Set\ Language\ to\ "en" Ϊ\ "en"
+menutrans Set\ Language\ to\ "en_au" Ϊ\ "en_au"
+menutrans Set\ Language\ to\ "en_ca" Ϊ\ "en_ca"
+menutrans Set\ Language\ to\ "en_gb" Ϊ\ "en_gb"
+menutrans Set\ Language\ to\ "en_nz" Ϊ\ "en_nz"
+menutrans Set\ Language\ to\ "en_us" Ϊ\ "en_us"
+menutrans &Find\ More\ Languages Ҹ(&F)
+
+" func! s:SpellLang()
+if !exists("g:menutrans_set_lang_to")
+ let g:menutrans_set_lang_to = "Ϊ"
+endif
+" }}}
+
+" Tools.Fold Menu
+menutrans &Folding ۵(&F)
+" Tools.Fold menuitems {{{2
+" open close folds
+menutrans &Enable/Disable\ Folds<Tab>zi /۵(&E)<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv չ(&V)<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ Only<Tab>zMzx ֻչ(&W)<Tab>zMzx
+menutrans C&lose\ More\ Folds<Tab>zm ۵һ(&L)<Tab>zm
+menutrans &Close\ All\ Folds<Tab>zM ۵ȫ(&C)<Tab>zM
+menutrans O&pen\ More\ Folds<Tab>zr չһ(&P)<Tab>zr
+menutrans &Open\ All\ Folds<Tab>zR չȫ(&O)<Tab>zR
+" fold method
+menutrans Fold\ Met&hod ۵ʽ(&H)
+" Tools.Fold.Fold Method menuitems {{{3
+menutrans M&anual ֶ(&A)
+menutrans I&ndent (&N)
+menutrans E&xpression ʽ(&X)
+menutrans S&yntax ﷨(&Y)
+menutrans &Diff (Diff)(&D)
+menutrans Ma&rker Ǻ(Marker)(&R)
+" }}}
+" create and delete folds
+menutrans Create\ &Fold<Tab>zf ۵(&F)<Tab>zf
+menutrans &Delete\ Fold<Tab>zd ɾ۵(&D)<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD ɾȫ۵(&A)<Tab>zD
+" moving around in folds
+menutrans Fold\ Col&umn\ Width ۵(&W)
+" }}}
+
+" Tools.Diff Menu
+menutrans &Diff (Diff)(&D)
+" Tools.Diff menuitems {{{2
+menutrans &Update ˢ(&U)
+menutrans &Get\ Block öԲı(&G)
+menutrans &Put\ Block ñı(&P)
+" }}}
+
+menutrans &Make<Tab>:make (Make)(&M)<Tab>:make
+menutrans &List\ Errors<Tab>:cl г(&L)<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! гϢ(&I)<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn һ(&N)<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp һ(&P)<Tab>:cp
+menutrans &Older\ List<Tab>:cold ϾɵĴб(&O)<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew µĴб(&E)<Tab>:cnew
+menutrans Error\ &Window 󴰿(&W)
+" Tools.Error Window menuitems {{{2
+menutrans &Update<Tab>:cwin ˢ(&U)<Tab>:cwin
+menutrans &Open<Tab>:copen (&O)<Tab>:copen
+menutrans &Close<Tab>:cclose ر(&C)<Tab>:cclose
+" }}}
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu ڲ˵ʾ(&T)
+menutrans Se&t\ Compiler ñ(&T)
+menutrans &Convert\ to\ HEX<Tab>:%!xxd תʮ(&C)<Tab>:%!xxd
+menutrans Conve&rt\ Back<Tab>:%!xxd\ -r ת(&R)<Tab>:%!xxd\ -r
+" }}}
+
+" Buffer menu
+menutrans &Buffers (&B)
+" Buffer menuitems and dialog {{{1
+menutrans &Refresh\ Menu ˢ±˵(&R)
+menutrans &Delete ɾ(&D)
+menutrans &Alternate л(&A)
+menutrans &Next һ(&N)
+menutrans &Previous һ(&P)
+
+" func! s:BMMunge(fname, bnum)
+if !exists("g:menutrans_no_file")
+ let g:menutrans_no_file = "[ļ]"
+endif
+" }}}
+
+" Window menu
+menutrans &Window (&W)
+" Window menuitems {{{1
+menutrans &New<Tab>^Wn ½(&N)<Tab>^Wn
+menutrans S&plit<Tab>^Ws (&P)<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ ֲʾ\ #(&L)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv ֱ(&V)<Tab>^Wv
+menutrans Split\ File\ E&xplorer ֲļ(&X)
+menutrans &Close<Tab>^Wc ر(&C)<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo ֮ȫر(&O)<Tab>^Wo
+menutrans Move\ &To ƶ(&T)
+menutrans &Top<Tab>^WK (&T)<Tab>^WK
+menutrans &Bottom<Tab>^WJ ׶(&B)<Tab>^WJ
+menutrans &Left\ Side<Tab>^WH (&L)<Tab>^WH
+menutrans &Right\ Side<Tab>^WL ұ(&R)<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR ֻ(&U)<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr ֻ(&D)<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= ƽֲ(&E)<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ ߶(&M)<Tab>^W
+menutrans M&in\ Height<Tab>^W1_ С߶(&I)<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| (&W)<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| С(&H)<Tab>^W1\|
+" }}}
+
+" The popup menu {{{1
+menutrans &Undo (&U)
+menutrans Cu&t (&T)
+menutrans &Copy (&C)
+menutrans &Paste ճ(&P)
+menutrans &Delete ɾ(&D)
+menutrans Select\ Blockwise Ϊѡο
+menutrans Select\ &Word ѡ(&W)
+menutrans Select\ &Sentence ѡ(&S)
+menutrans Select\ Pa&ragraph ѡ(&R)
+menutrans Select\ &Line ѡ(&L)
+menutrans Select\ &Block ѡο(&B)
+menutrans Select\ &All ȫѡ(&A)
+
+" func! <SID>SpellPopup()
+if !exists("g:menutrans_spell_change_ARG_to")
+ let g:menutrans_spell_change_ARG_to = '\ "%s"\ Ϊ'
+endif
+if !exists("g:menutrans_spell_add_ARG_to_word_list")
+ let g:menutrans_spell_add_ARG_to_word_list = '\ "%s"\ ӵʵ'
+endif
+if !exists("g:menutrans_spell_ignore_ARG")
+ let g:menutrans_spell_ignore_ARG = '\ "%s"'
+endif
+" }}}
+
+" The GUI toolbar {{{1
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ let did_toolbar_tmenu = 1
+ tmenu ToolBar.Open ļ
+ tmenu ToolBar.Save 浱ǰļ
+ tmenu ToolBar.SaveAll ȫ
+ tmenu ToolBar.Print ӡ
+ tmenu ToolBar.Undo
+ tmenu ToolBar.Redo ָ
+ tmenu ToolBar.Cut е
+ tmenu ToolBar.Copy Ƶ
+ tmenu ToolBar.Paste Ӽճ
+ if !has("gui_athena")
+ tmenu ToolBar.Replace Һ滻...
+ tmenu ToolBar.FindNext һ
+ tmenu ToolBar.FindPrev һ
+ endif
+ tmenu ToolBar.LoadSesn ػỰ
+ tmenu ToolBar.SaveSesn 浱ǰỰ
+ tmenu ToolBar.RunScript Vim ű
+ tmenu ToolBar.Make ɵǰĿ (:make)
+ tmenu ToolBar.RunCtags ڵǰĿ¼ɱ(Tags) (!ctags -R .)
+ tmenu ToolBar.TagJump תڱ(Tag)
+ tmenu ToolBar.Help Vim
+ tmenu ToolBar.FindHelp Vim в
+ endfun
+endif
+" }}}
+
+" Syntax menu
+menutrans &Syntax ﷨(&S)
+" Syntax menuitems {{{1
+menutrans &Show\ File\ Types\ in\ Menu ڲ˵ʾļ(&S)
+menutrans &Off ر(&O)
+menutrans &Manual ֶ(&M)
+menutrans A&utomatic Զ(&U)
+menutrans On/Off\ for\ &This\ File ֻļ/(&T)
+menutrans Co&lor\ Test ɫʲ(&L)
+menutrans &Highlight\ Test (&H)
+menutrans &Convert\ to\ HTML ת\ HTML(&C)
+
+" From synmenu.vim
+menutrans Set\ '&syntax'\ Only ֻ\ 'syntax'(&S)
+menutrans Set\ '&filetype'\ Too Ҳ\ 'filetype'(&F)
+menutrans Oracle\ config Oracle\ ļ
+menutrans Vim\ help\ file Vim\ ļ
+menutrans Vim\ script Vim\ ű
+menutrans Viminfo\ file Vim\ Ϣļ
+menutrans Virata\ config Virata\ ļ
+menutrans Whitespace\ (add) Ӽո
+" }}}
+
+" Netrw menu {{{1
+" Plugin loading may be after menu translation
+" So giveup testing if Netrw Plugin is loaded
+" if exists("g:loaded_netrwPlugin")
+ menutrans Help<tab><F1> <tab><F1>
+ menutrans Bookmarks ǩ
+ menutrans History ʷ¼
+ menutrans Go\ Up\ Directory<tab>- һ<tab>-
+ menutrans Apply\ Special\ Viewer<tab>x Ĭϳ<tab>x
+ menutrans Bookmarks\ and\ History ǩʷ¼
+ " Netrw.Bookmarks and History menuitems {{{2
+ menutrans Bookmark\ Current\ Directory<tab>mb ǩ<tab>mb
+ menutrans Bookmark\ Delete Ƴǩ
+ menutrans Goto\ Prev\ Dir\ (History)<tab>u (ʷ¼)<tab>u
+ menutrans Goto\ Next\ Dir\ (History)<tab>U ǰ(ʷ¼)<tab>U
+ menutrans List<tab>qb б<tab>qb
+ " }}}
+ menutrans Browsing\ Control
+ " Netrw.Browsing Control menuitems {{{2
+ menutrans Horizontal\ Split<tab>o ڲִڴ<tab>o
+ menutrans Vertical\ Split<tab>v ڴֱִڴ<tab>v
+ menutrans New\ Tab<tab>t ڱǩҳ<tab>t
+ menutrans Preview<tab>p Ԥ<tab>p
+ menutrans Edit\ File\ Hiding\ List<tab><ctrl-h> ༭(Hiding\ List)<tab><ctrl-h>
+ menutrans Edit\ Sorting\ Sequence<tab>S ༭(Sorting\ Sequence)<tab>S
+ menutrans Quick\ Hide/Unhide\ Dot\ Files<tab>gh /ʾ\.ͷļ<tab>gh
+ menutrans Refresh\ Listing<tab><ctrl-l> ˢ<tab><ctrl-l>
+ menutrans Settings/Options<tab>:NetrwSettings /ѡ<tab>:NetrwSettings
+ " }}}
+ menutrans Delete\ File/Directory<tab>D ɾļ/Ŀ¼<tab>D
+ menutrans Edit\ File/Dir ༭ļ/Ŀ¼
+ " Netrw.Edit File menuitems {{{2
+ menutrans Create\ New\ File<tab>% ½ļ<tab>%
+ menutrans In\ Current\ Window<tab><cr> ڵǰ<tab><cr>
+ menutrans Preview\ File/Directory<tab>p Ԥļ/Ŀ¼<tab>p
+ menutrans In\ Previous\ Window<tab>P һ<tab>P
+ menutrans In\ New\ Window<tab>o ´<tab>o
+ menutrans In\ New\ Tab<tab>t ±ǩҳ<tab>t
+ menutrans In\ New\ Vertical\ Window<tab>v ´ֱ<tab>v
+ " }}}
+ menutrans Explore
+ " Netrw.Explore menuitems {{{2
+ menutrans Directory\ Name ָĿ¼
+ menutrans Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ ƥָļģʽ(ǰĿ¼)<tab>:Explore\ */
+ menutrans Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ ƥָļģʽ(Ŀ¼)<tab>:Explore\ **/
+ menutrans Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// ݰַָģʽ(ǰĿ¼)<tab>:Explore\ *//
+ menutrans Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// ݰַָģʽ(Ŀ¼)<tab>:Explore\ **//
+ menutrans Next\ Match<tab>:Nexplore һƥ<tab>:Nexplore
+ menutrans Prev\ Match<tab>:Pexplore һƥ<tab>:Pexplore
+ " }}}
+ menutrans Make\ Subdirectory<tab>d ½Ŀ¼<tab>d
+ menutrans Marked\ Files ѡ(Marked)ļ
+ " Netrw.Marked Files menuitems {{{2
+ menutrans Mark\ File<tab>mf ѡ(Mark)/ȡ<tab>mf
+ menutrans Mark\ Files\ by\ Regexp<tab>mr ʽ(Regexp)ѡ<tab>mr
+ menutrans Hide-Show-List\ Control<tab>a /ʾ<tab>a
+ menutrans Copy\ To\ Target<tab>mc ƵĿ<tab>mc
+ menutrans Delete<tab>D ɾ<tab>D
+ menutrans Diff<tab>md (Diff)<tab>md
+ menutrans Edit<tab>me ༭<tab>me
+ menutrans Exe\ Cmd<tab>mx Ϊ<tab>mx
+ menutrans Move\ To\ Target<tab>mm ƶĿ<tab>mm
+ menutrans Obtain<tab>O ȡ<tab>O
+ menutrans Print<tab>mp ӡ<tab>mp
+ menutrans Replace<tab>R 滻<tab>R
+ menutrans Set\ Target<tab>mt Ŀ<tab>mt
+ menutrans Tag<tab>mT ɱļ(Tags)<tab>mT
+ menutrans Zip/Unzip/Compress/Uncompress<tab>mz ѹ/ѹ<tab>mz
+ " }}}
+ menutrans Obtain\ File<tab>O ȡļ<tab>O
+ menutrans Style ʾ
+ " Netrw.Style menuitems {{{2
+ menutrans Listing бʽ
+ " Netrw.Style.Listing menuitems {{{3
+ menutrans thin<tab>i <thin)<tab>i
+ menutrans long<tab>i ϸ(long)<tab>i
+ menutrans wide<tab>i (wide)<tab>i
+ menutrans tree<tab>i ״(tree)<tab>i
+ " }}}
+ menutrans Normal-Hide-Show ʾ/
+ " Netrw.Style.Normal-Hide_show menuitems {{{3
+ menutrans Show\ All<tab>a ʾȫ
+ menutrans Normal<tab>a ʾļ
+ menutrans Hidden\ Only<tab>a ֻʾļ
+ " }}}
+ menutrans Reverse\ Sorting\ Order<tab>r /<tab>r
+ menutrans Sorting\ Method ʽ
+ " Netrw.Style.Sorting Method menuitems {{{3
+ menutrans Name<tab>s ļ<tab>s
+ menutrans Time<tab>s ޸ʱ<tab>s
+ menutrans Size<tab>s С<tab>s
+ menutrans Exten<tab>s չ<tab>s
+ " }}}
+ " }}}
+ menutrans Rename\ File/Directory<tab>R ļ/Ŀ¼<tab>R
+ menutrans Set\ Current\ Directory<tab>c \ Vim\ Ŀ¼<tab>c
+ menutrans Targets Ŀ
+" endif
+" }}}
+
+" Shellmenu menu
+" Shellmenu menuitems {{{1
+" From shellmenu.vim
+menutrans ShellMenu Shell\ ˵
+menutrans Statements
+menutrans Test
+menutrans Existence
+menutrans Existence\ -\ file \ -\ ļ
+menutrans Existence\ -\ file\ (not\ empty) \ -\ ļ(ǿ)
+menutrans Existence\ -\ directory \ -\ Ŀ¼
+menutrans Existence\ -\ executable \ -\ ִ
+menutrans Existence\ -\ readable \ -\ ɶ
+menutrans Existence\ -\ writable \ -\ д
+menutrans String\ is\ empty ַΪ
+menutrans String\ is\ not\ empty ַǿ
+menutrans Strings\ are\ equal ֵַ
+menutrans Strings\ are\ not\ equal ֵַ
+menutrans Value\ is\ greater\ than ֵ
+menutrans Value\ is\ greater\ equal ֵڵ
+menutrans Values\ are\ equal ֵ
+menutrans Values\ are\ not\ equal ֵ
+menutrans Value\ is\ less\ than ֵС
+menutrans Value\ is\ less\ equal ֵСڵ
+menutrans ParmSub 滻
+menutrans Substitute\ word\ if\ parm\ not\ set ûþ滻ô
+menutrans Set\ parm\ to\ word\ if\ not\ set δþΪô
+menutrans Substitute\ word\ if\ parm\ set\ else\ nothing þ滻ôʣʲô
+menutrans If\ parm\ not\ set\ print\ word\ and\ exit ûþʹӡôʲ˳
+menutrans SpShVars Shell\
+menutrans Number\ of\ positional\ parameters λòĿ
+menutrans All\ positional\ parameters\ (quoted\ spaces) λò(quoted\ spaces)
+menutrans All\ positional\ parameters\ (unquoted\ spaces) λò(unquoted\ spaces)
+menutrans Flags\ set ñ־
+menutrans Return\ code\ of\ last\ command ǰһĴ
+menutrans Process\ number\ of\ this\ shell shell\ ̺
+menutrans Process\ number\ of\ last\ background\ command ǰһ̨Ľ̺
+menutrans Environ
+menutrans Mark\ created\ or\ modified\ variables\ for\ export ޸ĵĻߴıΪ
+menutrans Exit\ when\ command\ returns\ non-zero\ status ط״̬ʱ˳
+menutrans Disable\ file\ name\ expansion ļչ
+menutrans Locate\ and\ remember\ commands\ when\ being\ looked\ up ѯʱλס
+menutrans All\ assignment\ statements\ are\ placed\ in\ the\ environment\ for\ a\ command еĸֵĻ
+menutrans Read\ commands\ but\ do\ not\ execute\ them DzҪִ
+menutrans Exit\ after\ reading\ and\ executing\ one\ command ִһ֮˳
+menutrans Treat\ unset\ variables\ as\ an\ error\ when\ substituting 滻ʱδΪ
+menutrans Print\ shell\ input\ lines\ as\ they\ are\ read \ shell\ еʱӡ
+menutrans Print\ commands\ and\ their\ arguments\ as\ they\ are\ executed ִʱӡͲ
+" }}}
+
+" termdebug menu
+" termdebug menuitems {{{1
+" From termdebug.vim
+menutrans Set\ breakpoint öϵ
+menutrans Clear\ breakpoint ϵ
+menutrans Run\ until е
+menutrans Evaluate ֵ
+menutrans WinBar
+menutrans Step
+menutrans Next һ
+menutrans Finish
+menutrans Cont
+menutrans Stop ֹͣ
+" }}}
+
+" debchangelog menu
+" debchangelog menuitems {{{1
+" From debchangelog.vim
+menutrans &Changelog ־(&C)
+menutrans &New\ Version °汾(&N)
+menutrans &Add\ Entry Ŀ(&A)
+menutrans &Close\ Bug ر\ Bug(&C)
+menutrans Set\ &Distribution ÷а(&D)
+menutrans &unstable ȶ(&U)
+menutrans Set\ &Urgency ý(&U)
+menutrans &low (&L)
+menutrans &medium (&M)
+menutrans &high (&H)
+menutrans U&nfinalise δ(&N)
+menutrans &Finalise (&F)
+" }}}
+
+" ada menu
+" ada menuitems {{{1
+" From ada.vim
+menutrans Tag ǩ
+menutrans List б
+menutrans Jump ת
+menutrans Create\ File ļ
+menutrans Create\ Dir Ŀ¼
+menutrans Highlight
+menutrans Toggle\ Space\ Errors лո
+menutrans Toggle\ Lines\ Errors лд
+menutrans Toggle\ Rainbow\ Color лʺɫ
+menutrans Toggle\ Standard\ Types л׼
+" }}}
+
+" gnat menu
+" gnat menuitems {{{1
+" From gnat.vim
+menutrans Build
+menutrans Pretty\ Print ¸ʽ
+menutrans Find
+menutrans Set\ Projectfile\.\.\. Ŀļ\.\.\.
+" }}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: set ts=4 sw=4 noet fdm=marker fdc=4 :
diff --git a/runtime/lang/menu_chinese_taiwan.950.vim b/runtime/lang/menu_chinese_taiwan.950.vim
new file mode 100644
index 0000000..c2ae9f9
--- /dev/null
+++ b/runtime/lang/menu_chinese_taiwan.950.vim
@@ -0,0 +1,292 @@
+" Menu Translations: Traditional Chinese
+" Translated By: Hung-Te Lin <piaip@csie.ntu.edu.tw>
+" Last Change: 2012 May 01
+" Generated from menu_zh_tw.utf-8.vim, DO NOT EDIT
+
+" {{{ Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+" }}}
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding cp950
+
+" {{{ Help menu: complete
+menutrans &Help U(&H)
+" ------------------------------------------------------------------------
+menutrans &Overview<Tab><F1> `(&O)<Tab><F1>
+menutrans &User\ Manual ϥΪ̤U(&U)
+menutrans &How-to\ links p@\.\.\.(&H)
+menutrans &GUI ϫɭ(&G)
+menutrans &Credits P(&C)
+menutrans Co&pying v(&P)
+menutrans &Sponsor/Register ٧U/U(&S)
+menutrans O&rphans @ϩt(&R)
+" ------------------------------------------------------------------------
+menutrans &Version {T(&V)
+menutrans &About \ Vim(&A)
+" }}}
+
+" {{{ File menu: complete
+menutrans &File ɮ(&F)
+" ------------------------------------------------------------------------
+menutrans &Open\.\.\.<Tab>:e }(&O)\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp εö}(&L)<Tab>:sp
+menutrans &New<Tab>:enew ssɮ(&N)<Tab>:enew
+menutrans &Close<Tab>:close ɮ(&C)<Tab>:close
+" ------------------------------------------------------------------------
+menutrans &Save<Tab>:w xs(&S)<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav tss(&A)\.\.\.<Tab>:sav
+" ------------------------------------------------------------------------
+menutrans Split\ &Diff\ with\.\.\. (&Diff)\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Patch(&B)\.\.\.
+" ------------------------------------------------------------------------
+menutrans &Print CL(&P)
+" ------------------------------------------------------------------------
+menutrans Sa&ve-Exit<Tab>:wqa xs}(&V)<Tab>:wqa
+menutrans E&xit<Tab>:qa }(&X)<Tab>:qa
+" }}}
+
+" {{{ Edit menu
+menutrans &Edit s(&E)
+" ------------------------------------------------------------------------
+menutrans &Undo<Tab>u _(&U)<Tab>u
+menutrans &Redo<Tab>^R W_(&R)<Tab>^R
+menutrans Rep&eat<Tab>\. ƤWʧ@(&E)<Tab>\.
+" ------------------------------------------------------------------------
+menutrans Cu&t<Tab>"+x ŤU(&T)<Tab>"+x
+menutrans &Copy<Tab>"+y ƻs(&C)<Tab>"+y
+menutrans &Paste<Tab>"+gP KW(&P)<Tab>"+gP
+menutrans Put\ &Before<Tab>[p KЫe(&B)<Tab>[p
+menutrans Put\ &After<Tab>]p KЫ(&A)<Tab>]p
+menutrans &Delete<Tab>x R(&D)<Tab>x
+menutrans &Select\ All<Tab>ggVG (&S)<Tab>ggvG
+" ------------------------------------------------------------------------
+menutrans &Find\.\.\. M(&F)\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. MèN(&L)\.\.\.
+" ------------------------------------------------------------------------
+menutrans Settings\ &Window ]w(&W)
+menutrans &Global\ Settings ]w(&G)
+menutrans F&ile\ Settings ]wɮ(&I)
+menutrans C&olor\ Scheme t]w(&O)
+menutrans &Keymap L(&K)
+ " "{{{ Keymap:
+ menutrans None L
+ " }}}
+menutrans Select\ Fo&nt\.\.\. ]wr(&N)\.\.\.
+" }}}
+
+" {{{ Edit.FileSettings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! ܦ渹(&N)<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! ܦTAB(&L)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! ۰ʧ(&W)<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! ܥiN_y(&R)<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! i}TAB(&E)<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! ۰Y(&A)<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! ѻyY(&C)<Tab>:set\ cin!
+" ------------------------------------------------------------------------
+menutrans &Shiftwidth YƼe(shiftwidth)(&S)
+menutrans Soft\ &Tabstop nTAB(softtabstop)(&T)
+menutrans Te&xt\ Width\.\.\. re(textwidth)(&X)\.\.\.
+menutrans &File\ Format\.\.\. ]wɮ׮榡(@~t)(&F)\.\.\.
+" }}}
+
+" {{{ Edit.GlobalSettings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! G׷jMr(&H)<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! jpg(&I)<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! ܹA(&S)<Tab>:set\ sm!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! DzViۮeҦ(&O)<Tab>:set\ cp!
+menutrans &Context\ lines eOd(scrolloff)(&C)
+menutrans &Virtual\ Edit ХN(virtualedit)(&V)
+ " {{{ Edit.GlobalSettings.VirtualEdit
+ menutrans Never ϥ
+ menutrans Block\ Selection ϶ܮ
+ menutrans Insert\ mode JҦ
+ menutrans Block\ and\ Insert ϶PJҦ
+ menutrans Always @}
+ " }}}
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! JҦ(&M)<Tab>:set\ im!
+menutrans Search\ &Path\.\.\. jM|(&P)\.\.\.
+menutrans Ta&g\ Files\.\.\. Tag\ үɮ(&G)\.\.\.
+" ------------------------------------------------------------------------
+menutrans Toggle\ &Toolbar ϥΤuC(&T)
+menutrans Toggle\ &Bottom\ Scrollbar ϥΩݱʶb(&B)
+menutrans Toggle\ &Left\ Scrollbar ϥΥݱʶb(&L)
+menutrans Toggle\ &Right\ Scrollbar ϥΥkݱʶb(&R)
+" }}}
+
+" {{{ Tools menu: complete
+menutrans &Tools u(&T)
+" ------------------------------------------------------------------------
+menutrans &Jump\ to\ this\ tag<Tab>g^] ˯гBr(tag)(&J)<Tab>g^]
+menutrans Jump\ &back<Tab>^T ^˯em(&B)<Tab>^T
+menutrans Build\ &Tags\ File إ߼ү\ Tags(&T)
+" ------------------------------------------------------------------------
+menutrans &Folding |(Fold)]w(&F)
+ " {{{ Tools.Fold
+ menutrans &Enable/Disable\ folds<Tab>zi ϥ\ Folding(&E)<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv ˵h\ Fold(&V)<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx u˵\ Fold(&W)<Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm _@h\ Folds(&L)<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM _Ҧ\ Folds(&C)<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr }@h\ Folds(&P)<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR }Ҧ\ Folds(&O)<Tab>zR
+ menutrans Fold\ Met&hod Folding\ 覡(&H)
+ " {{{ Tools.Fold.Method
+ menutrans M&anual ʫإ(&A)
+ menutrans I&ndent ̷Y(&N)
+ menutrans E&xpression ۭqB⦡(&X)
+ menutrans S&yntax ̷ӻyk]w(&Y)
+ menutrans &Diff Diff(&D)
+ menutrans Ma&rker аO(Marker)(&R)
+ " }}}
+ " ------------------------------------------------------------------------
+ menutrans Create\ &Fold<Tab>zf إ\ Fold(&F)<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd R\ Fold(&D)<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD RҦ\ Fold(&A)<Tab>zD
+ " ------------------------------------------------------------------------
+ menutrans Fold\ column\ &width ]w\ Folde(&W)
+ " }}}
+menutrans &Diff Diff(&D)
+ " {{{ Tools.Diff
+ menutrans &Update s(&U)
+ menutrans &Get\ Block o϶(&G)
+ menutrans &Put\ Block KW϶(&P)
+ " }}}
+" ------------------------------------------------------------------------
+menutrans &Make<Tab>:make \ Make(&M)<Tab>:make
+menutrans &List\ Errors<Tab>:cl CXsĶ~(&E)<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! CXҦT(&I)<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn U@ӽsĶ~B(&N)<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp W@ӽsĶ~B(&P)<Tab>:cp
+menutrans &Older\ List<Tab>:cold ˵¿~C(&O)<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew ˵s~C(&E)<Tab>:cnew
+menutrans Error\ &Window ~T(&W)
+ " {{{ Tools.ErrorWindow
+ menutrans &Update<Tab>:cwin s(&U)<Tab>:cwin
+ menutrans &Open<Tab>:copen }(&O)<Tab>:copen
+ menutrans &Close<Tab>:cclose (&C)<Tab>:cclose
+ " }}}
+menutrans &Set\ Compiler ]wsĶCompiler(&S)
+" ------------------------------------------------------------------------
+menutrans &Convert\ to\ HEX<Tab>:%!xxd ഫ16iX(&C)<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r q16iXഫ^r(&R)<Tab>:%!xxd\ -r
+" }}}
+
+" {{{ Syntax menu: compete
+menutrans &Syntax ykĪG(&S)
+" ------------------------------------------------------------------------
+menutrans &Show\ filetypes\ in\ menu ܩҦiɮ׮榡(&S)
+menutrans Set\ '&syntax'\ only uϥ\ 'syntax'(&S)
+menutrans Set\ '&filetype'\ too ϥ\ 'syntax'+'filetype'(&F)
+menutrans &Off ĪG(&O)
+menutrans &Manual ʳ]w(&M)
+menutrans A&utomatic ۰ʳ]w(&U)
+menutrans on/off\ for\ &This\ file uɪĪG]w(&T)
+" ------------------------------------------------------------------------
+menutrans Co&lor\ test mܴ(&L)
+menutrans &Highlight\ test ykĪG(&H)
+menutrans &Convert\ to\ HTML ഫ\ HTML\ 榡(&C)
+" }}}
+
+" {{{ Buffers menu: complete
+menutrans &Buffers wİ(&B)
+" ------------------------------------------------------------------------
+menutrans &Refresh\ menu s(&R)
+menutrans &Delete R(&D)
+menutrans &Alternate Wswİ(&A)
+menutrans &Next U@(&N)
+menutrans &Previous e@(&P)
+" ------------------------------------------------------------------------
+" menutrans [No\ file] [Lɮ]
+" }}}
+
+" {{{ Window menu: complete
+menutrans &Window (&W)
+" ------------------------------------------------------------------------
+menutrans &New<Tab>^Wn }s(&N)<Tab>^Wn
+menutrans S&plit<Tab>^Ws ε(&P)<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Ψ#(&L)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv (&V)<Tab>^Wv
+menutrans Split\ File\ E&xplorer ɮ`ަ(&X)
+" ------------------------------------------------------------------------
+menutrans &Close<Tab>^Wc (&C)<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo 䥦(&O)<Tab>^Wo
+" ------------------------------------------------------------------------
+menutrans Move\ &To (&T)
+ " {{{ Window.MoveTo
+ menutrans &Top<Tab>^WK (&T)<Tab>^WK
+ menutrans &Bottom<Tab>^WJ (&B)<Tab>^WJ
+ menutrans &Left\ side<Tab>^WH (&L)<Tab>^WH
+ menutrans &Right\ side<Tab>^WL k(&R)<Tab>^WL
+ " }}}
+menutrans Rotate\ &Up<Tab>^WR W(&U)<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr U(&D)<Tab>^Wr
+" ------------------------------------------------------------------------
+menutrans &Equal\ Size<Tab>^W= Ҧ(&E)<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ ̤j(&M)<Tab>^W
+menutrans M&in\ Height<Tab>^W1_ ̤p(&I)<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| ̤je(&W)<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| ̤pe(&H)<Tab>^W1\|
+" }}}
+
+" {{{ The popup menu: complete
+menutrans &Undo _(&U)
+" ------------------------------------------------------------------------
+menutrans Cu&t ŤU(&T)
+menutrans &Copy ƻs(&C)
+menutrans &Paste KW(&P)
+menutrans &Delete R(&D)
+" ------------------------------------------------------------------------
+menutrans Select\ Blockwise Blockwise
+menutrans Select\ &Word ܳr(&W)
+menutrans Select\ &Line ܦ(&L)
+menutrans Select\ &Block ܰ϶(&B)
+menutrans Select\ &All (&A)
+" }}}
+
+" {{{ The GUI toolbar: complete
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open }ɮ
+ tmenu ToolBar.Save xsثes褤ɮ
+ tmenu ToolBar.SaveAll xsɮ
+ tmenu ToolBar.Print CL
+" ------------------------------------------------------------------------
+ tmenu ToolBar.Undo _Wܰ
+ tmenu ToolBar.Redo W_ʧ@
+" ------------------------------------------------------------------------
+ tmenu ToolBar.Cut ŤUܰŶKï
+ tmenu ToolBar.Copy ƻsŶKï
+ tmenu ToolBar.Paste ѰŶKïKW
+" ------------------------------------------------------------------------
+ tmenu ToolBar.Find M...
+ tmenu ToolBar.FindNext U@
+ tmenu ToolBar.FindPrev W@
+ tmenu ToolBar.Replace N...
+" ------------------------------------------------------------------------
+ tmenu ToolBar.LoadSesn J Session
+ tmenu ToolBar.SaveSesn xsثe Session
+ tmenu ToolBar.RunScript Vim {
+" ------------------------------------------------------------------------
+ tmenu ToolBar.Make Make
+ tmenu ToolBar.Shell }Ҥ@өROC DosBox
+ tmenu ToolBar.RunCtags ctags
+ tmenu ToolBar.TagJump ثeЦm tag
+ tmenu ToolBar.Help Vim U
+ tmenu ToolBar.FindHelp jM Vim
+ endfun
+endif
+" }}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:foldmethod=marker:nowrap:foldcolumn=2:foldlevel=1
diff --git a/runtime/lang/menu_cs.cp1250.vim b/runtime/lang/menu_cs.cp1250.vim
new file mode 100644
index 0000000..becbd93
--- /dev/null
+++ b/runtime/lang/menu_cs.cp1250.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Czech
+
+source <sfile>:p:h/menu_czech_czech_republic.1250.vim
diff --git a/runtime/lang/menu_cs.latin1.vim b/runtime/lang/menu_cs.latin1.vim
new file mode 100644
index 0000000..efb28a0
--- /dev/null
+++ b/runtime/lang/menu_cs.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Czech
+
+source <sfile>:p:h/menu_czech_czech_republic.1252.vim
diff --git a/runtime/lang/menu_cs_cz.cp1250.vim b/runtime/lang/menu_cs_cz.cp1250.vim
new file mode 100644
index 0000000..becbd93
--- /dev/null
+++ b/runtime/lang/menu_cs_cz.cp1250.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Czech
+
+source <sfile>:p:h/menu_czech_czech_republic.1250.vim
diff --git a/runtime/lang/menu_cs_cz.iso_8859-2.vim b/runtime/lang/menu_cs_cz.iso_8859-2.vim
new file mode 100644
index 0000000..c93b84b
--- /dev/null
+++ b/runtime/lang/menu_cs_cz.iso_8859-2.vim
@@ -0,0 +1,309 @@
+" Menu Translations: Czech (ISO8859-2)
+" Maintainer: Jiri Sedlak <jiri_sedlak@users.sourceforge.net>
+" Previous maintainer: Jiri Brezina
+" Based on: menu.vim (2012-10-21)
+" Generated from menu_cs_cz.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding iso8859-2
+
+" {{{ File menu
+menutrans &File &Soubor
+menutrans &Open\.\.\.<Tab>:e &Otevt\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Otevt\ v\ no&vm\ okn\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Otevt\ tab\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nov<Tab>:enew
+menutrans &Close<Tab>:close &Zavt<Tab>:close
+menutrans &Save<Tab>:w &Uloit<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Uloit\ &jako\.\.\.<Tab>:sav
+if has("printer") || has("unix")
+ menutrans &Print &Tisk
+endif
+menutrans Sa&ve-Exit<Tab>:wqa U&loit\ a\ ukonit<Tab>:wqa
+menutrans E&xit<Tab>:qa &Ukonit<Tab>:qa
+
+if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. Rozdlit\ okno\ -\ &Diff\.\.\.
+ menutrans Split\ Patched\ &By\.\.\. Rozdlit\ okno\ -\ &Patch\.\.\.
+endif
+" }}}
+
+" {{{ Edit menu
+menutrans &Edit pr&avy
+menutrans &Undo<Tab>u &Zpt<Tab>u
+menutrans &Redo<Tab>^R Z&ruit\ vrcen<Tab>^R
+menutrans Rep&eat<Tab>\. &Opakovat<Tab>\.
+menutrans Cu&t<Tab>"+x &Vyznout<Tab>"+x
+menutrans &Copy<Tab>"+y &Koprovat<Tab>"+y
+menutrans &Paste<Tab>"+gP V&loit<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Vloit\ &ped<Tab>[p
+menutrans Put\ &After<Tab>]p Vloi&t\ za<Tab>]p
+if has("win32") || has("win16")
+ menutrans &Delete<Tab>x &Smazat<Tab>x
+endif
+menutrans &Select\ All<Tab>ggVG Vy&brat\ ve<Tab>ggVG
+if has("win32") || has("win16") || has("gui_gtk") || has("gui_kde") || has("gui_motif")
+ menutrans &Find\.\.\. &Hledat\.\.\.
+ menutrans Find\ and\ Rep&lace\.\.\. &Nahradit\.\.\.
+else
+ menutrans Find<Tab>/ &Hledat<Tab>/
+ menutrans Find\ and\ Rep&lace<Tab>:%s &Nahradit<Tab>:%s
+ menutrans Find\ and\ Rep&lace<Tab>:s &Nahradit<Tab>:s
+endif
+menutrans Settings\ &Window Nastav&en\ okna
+" {{{2 Edit -1
+menutrans Startup\ &Settings Poten\ &nastaven
+menutrans &Global\ Settings &Globln\ nastaven
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Pepnout\ zvraznn\ vzoru<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Pepnout\ ignorovn\ &VERZLEK<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Pepnout\ &Showmatch\ \{\(\[\])\}<Tab>:set\ sm!
+menutrans &Context\ lines Zobrazit\ konte&xt\ kurzoru
+menutrans &Virtual\ Edit Virtuln\ p&ozice\ kurzoru
+menutrans Never Nikdy
+menutrans Block\ Selection Vbr\ Bloku
+menutrans Insert\ mode Insert\ md
+menutrans Block\ and\ Insert Blok\ a\ Insert
+menutrans Always Vdycky
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Pepnout\ Insert\ m&d<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Pepnout\ kompatibiln\ reim\ s\ 'vi'<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Nastavit\ &cestu\ k\ prohledvn\.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&g\ soubory\.\.\.
+menutrans Toggle\ &Toolbar Pepnout\ &Toolbar
+menutrans Toggle\ &Bottom\ Scrollbar P&epnout\ doln\ rolovac\ litu
+menutrans Toggle\ &Left\ Scrollbar Pepnout\ &levou\ rolovac\ litu
+menutrans Toggle\ &Right\ Scrollbar Pepnout\ p&ravou\ rolovac\ litu
+" {{{2 Edit -2
+menutrans F&ile\ Settings Nastaven\ so&uboru
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Pepnout\ slovn\ &dk<Tab>:set\ nu!
+menutrans Toggle\ relati&ve\ Line\ Numbering<Tab>:set\ rnu! Pepnout\ relativn\ slovn\ &dk<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Pepnout\ &List\ md<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Pepnout\ zala&movn\ dk<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Pepnout\ zl&om\ ve\ slov<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Pepnout\ &expand-tab<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Pepnout\ &auto-indent<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Pepnout\ &C-indenting<Tab>:set\ cin!
+menutrans &Shiftwidth Nastav&it\ ku\ od&sazen
+menutrans Soft\ &Tabstop Nastavit\ Soft\ &Tabstop
+menutrans Te&xt\ Width\.\.\. ka\ te&xtu\.\.\.
+menutrans &File\ Format\.\.\. &Formt\ souboru\.\.\.
+" {{{2 Edit -3
+menutrans C&olor\ Scheme Barevn\ s&chma
+menutrans &Keymap Klvesov\ m&apa
+if has("win32") || has("win16") || has("gui_motif") || has("gui_gtk") || has("gui_kde") || has("gui_photon") || has("gui_mac")
+ menutrans Select\ Fo&nt\.\.\. Vybrat\ ps&mo\.\.\.
+endif
+" }}}1
+
+" {{{ Programming menu
+menutrans &Tools Nst&roje
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skoit\ na\ tag<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skoit\ &zpt<Tab>^T
+menutrans Build\ &Tags\ File &Vytvoit\ soubor\ tag
+
+if has("spell")
+ menutrans &Spelling &Kontrola\ pravopisu
+ menutrans &Spell\ Check\ On &Zapnout\ kontrolu\ pravopisu
+ menutrans Spell\ Check\ &Off &Vypnout\ kontrolu\ pravopisu
+ menutrans To\ &Next\ error<Tab>]s &Dal\ chyba<Tab>]s
+ menutrans To\ &Previous\ error<Tab>[s &Pedchoz\ chyba<Tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= &Navrhnout\ opravy<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall Zopakovat\ &opravu<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" Nastavit\ jazyk\ na\ "en"
+ menutrans Set\ language\ to\ "en_au" Nastavit\ jazyk\ na\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" Nastavit\ jazyk\ na\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" Nastavit\ jazyk\ na\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" Nastavit\ jazyk\ na\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" Nastavit\ jazyk\ na\ "en_us"
+ menutrans &Find\ More\ Languages Nalzt\ dal\ &jazyky
+ let g:menutrans_set_lang_to = "Nastavit jazyk na"
+endif
+
+if has("Folding")
+ menutrans &Folding &Skldn
+ menutrans &Enable/Disable\ folds<Tab>zi &Ano/Ne<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Zobrazit\ dek\ &kurzoru<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Zobrazit\ &pouze\ dek\ kurzoru\ <Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm Sloit\ &jednu\ rove\ sklad<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Sloit\ vechny\ sklady<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Pidat\ jednu\ rove\ sklad<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR &Otevt\ vechny\ sklady<Tab>zR
+ menutrans Fold\ Met&hod &Metoda\ skldn
+ menutrans M&anual &Run
+ menutrans I&ndent &Odsazen
+ menutrans E&xpression &Vraz
+ menutrans S&yntax &Syntaxe
+ menutrans &Diff &Rozdly
+ menutrans Ma&rker &Znaky
+ menutrans Create\ &Fold<Tab>zf Vytvoit\ &sklad<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd Vymazat\ skla&d<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Vymazat\ vechny\ sklady<Tab>zD
+ menutrans Fold\ col&umn\ width Sloupec\ zob&razen\ sklad
+endif
+
+if has("diff")
+ menutrans &Update &Obnovit
+ menutrans &Get\ Block &Sejmout\ Blok
+ menutrans &Put\ Block &Vloit\ Blok
+endif
+
+menutrans &Make<Tab>:make &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl Vpis\ &chyb<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Vp&is\ zprv<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Dal\ ch&yba<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Pedchoz\ chyba<Tab>:cp
+menutrans &Older\ List<Tab>:cold Sta&r\ seznam<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew N&ovj\ seznam<Tab>:cnew
+menutrans Error\ &Window Chybov\ o&kno
+menutrans SeT\ Compiler Nas&taven\ kompiltoru
+menutrans &Update<Tab>:cwin O&bnovit<Tab>:cwin
+menutrans &Open<Tab>:copen &Otevt<Tab>:copen
+menutrans &Close<Tab>:cclose &Zavt<Tab>:cclose
+menutrans Se&T\ Compiler N&astavit\ kompiltor
+
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Pevst\ do\ estnctkovho\ formt&u<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r P&evst\ zpt<Tab>:%!xxd\ -r
+" }}}
+
+" {{{ Syntax menu
+menutrans &Syntax Synta&xe
+menutrans Set\ '&syntax'\ only Nastavit\ pouze\ 'synta&x'
+menutrans Set\ '&filetype'\ too Nastavit\ tak\ '&filetype'
+menutrans &Off &Vypnout
+menutrans &Manual &Run
+menutrans A&utomatic A&utomaticky
+menutrans on/off\ for\ &This\ file &Pepnout\ (pro\ tento\ soubor)
+menutrans o&ff\ (this\ file) vyp&nout\ (pro\ tento\ soubor)
+menutrans Co&lor\ test Test\ &barev
+menutrans &Highlight\ test &Test\ zvrazovn
+menutrans &Convert\ to\ HTML Pevst\ &do\ HTML
+menutrans &Show\ filetypes\ in\ menu &Zobrazit\ vbr\ monost
+" }}}
+
+" {{{ Menu Buffers
+menutrans &Buffers &Buffery
+menutrans &Refresh\ menu &Obnovit\ menu
+menutrans &Delete Z&ruit
+menutrans &Alternate &Zmnit
+menutrans &Next &Dal
+menutrans &Previous &Pedchoz
+" }}}
+
+" {{{ Menu Window
+menutrans &Window &Okna
+menutrans &New<Tab>^Wn &Nov<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Rozdlit<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Ro&zdlit\ na\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Rozdlit\ &vertikln<Tab>^Wv
+menutrans Split\ File\ E&xplorer Rozdlit\ -\ File\ E&xplorer
+menutrans Move\ &To &Pesun
+menutrans &Top<Tab>^WK &Nahoru<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Dolu<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Vlevo<Tab>^WH
+menutrans &Right\ side<Tab>^WL Vp&ravo<Tab>^WL
+
+menutrans &Close<Tab>^Wc Zav&t<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zavt\ &ostatn<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Dal<Tab>^Ww
+menutrans P&revious<Tab>^WW &Pedchoz<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Stejn\ vka<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Maximln\ v&ka<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ M&inimln\ vka<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| &Maximln\ ka<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimln\ k&a<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR Rotovat\ na&horu<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotovat\ &dol<Tab>^Wr
+
+" {{{ Help menu
+menutrans &Help &Npovda
+menutrans &Overview<Tab><F1> &Pehled<Tab><F1>
+menutrans &User\ Manual &Uivatelsk\ Manul
+menutrans &How-to\ links Ho&wto
+menutrans &GUI &Grafick\ rozhran
+menutrans &Credits &Autoi
+menutrans Co&pying &Licenn\ politika
+menutrans &Sponsor/Register Sponzorovn/&Registrace
+menutrans &Find\.\.\. &Hledat\.\.\.
+menutrans O&rphans O&siel\ dti
+menutrans &Version &Verze
+menutrans &About &O\ aplikaci
+" }}}
+
+" {{{ The popup menu
+menutrans &Undo &Zpt
+menutrans Cu&t &Vyznout
+menutrans &Copy &Koprovat
+menutrans &Paste &Vloit
+menutrans &Delete &Smazat
+menutrans Select\ Blockwise Vybrat\ blokov
+menutrans Select\ &Word Vybrat\ &slovo
+menutrans Select\ Pa&ragraph Vybrat\ &odstavec
+menutrans Select\ &Sentence Vybrat\ v&tu
+menutrans Select\ &Line Vybrat\ &dek
+menutrans Select\ &Block Vybrat\ &blok
+menutrans Select\ &All Vybrat\ &ve
+" }}}
+
+" {{{ The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Otevt soubor
+ tmenu ToolBar.Save Uloit soubor
+ tmenu ToolBar.SaveAll Uloit vechny soubory
+ if has("printer") || has("unix")
+ tmenu ToolBar.Print Tisk
+ endif
+ tmenu ToolBar.Undo Zpt
+ tmenu ToolBar.Redo Zruit vrcen
+ tmenu ToolBar.Cut Vyznout
+ tmenu ToolBar.Copy Koprovat
+ tmenu ToolBar.Paste Vloit
+ tmenu ToolBar.Find Hledat...
+ tmenu ToolBar.FindNext Hledat dal
+ tmenu ToolBar.FindPrev Hledat pedchoz
+ tmenu ToolBar.Replace Nahradit...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nov okno
+ tmenu ToolBar.WinSplit Rozdlit okno
+ tmenu ToolBar.WinMax Maximalizovat okno
+ tmenu ToolBar.WinMin Minimalizovat okno
+ tmenu ToolBar.WinClose Zavt okno
+ endif
+ tmenu ToolBar.LoadSesn Nast sezen
+ tmenu ToolBar.SaveSesn Uloit sezen
+ tmenu ToolBar.RunScript Spustit skript
+ tmenu ToolBar.Make Spustit make
+ tmenu ToolBar.Shell Spustit shell
+ tmenu ToolBar.RunCtags Spustit ctags
+ tmenu ToolBar.TagJump Skoit na tag pod kurzorem
+ tmenu ToolBar.Help Npovda
+ tmenu ToolBar.FindHelp Hledat npovdu k...
+ endfun
+endif
+" }}}
+
+" {{{ DIALOG TEXTS
+let g:menutrans_no_file = "[dn soubor]"
+let g:menutrans_help_dialog = "Zadejte hledan pkaz nebo slovo:\n\n\tPidejte i_ pro pkazy vkldacho reimu (nap. i_CTRL-X)\n\tPidejte c_ pro pkazy pkazov dky (nap. c_<Del>)\n\tPidejte ' pro jmno volby (nap. 'shiftwidth')"
+let g:menutrans_path_dialog = "Zadejte cesty pro vyhledvn soubor. Jednotliv cesty oddlte rkou"
+let g:menutrans_tags_dialog = "Zadejte jmna soubor s tagy. Jmna oddlte rkami."
+let g:menutrans_textwidth_dialog = "Zadejte dlku dku (0 pro zakzn formtovn):"
+let g:menutrans_fileformat_dialog = "Vyberte typ konce dk"
+" }}}"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+
+
+" vim:set foldmethod=marker expandtab tabstop=3 shiftwidth=3:
diff --git a/runtime/lang/menu_cs_cz.latin1.vim b/runtime/lang/menu_cs_cz.latin1.vim
new file mode 100644
index 0000000..3bf608d
--- /dev/null
+++ b/runtime/lang/menu_cs_cz.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Czech
+
+source <sfile>:p:h/menu_czech_czech_republic.ascii.vim
diff --git a/runtime/lang/menu_cs_cz.utf-8.vim b/runtime/lang/menu_cs_cz.utf-8.vim
new file mode 100644
index 0000000..e083626
--- /dev/null
+++ b/runtime/lang/menu_cs_cz.utf-8.vim
@@ -0,0 +1,309 @@
+" Menu Translations: Czech (UTF-8)
+" Maintainer: Jiri Sedlak <jiri_sedlak@users.sourceforge.net>
+" Previous maintainer: Jiri Brezina
+" Based on: menu.vim (2012-10-21)
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" {{{ File menu
+menutrans &File &Soubor
+menutrans &Open\.\.\.<Tab>:e &Otevřít\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Otevřít\ v\ no&vém\ okně\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Otevřít\ tab\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nový<Tab>:enew
+menutrans &Close<Tab>:close &Zavřít<Tab>:close
+menutrans &Save<Tab>:w &Uložit<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Uložit\ &jako\.\.\.<Tab>:sav
+if has("printer") || has("unix")
+ menutrans &Print &Tisk
+endif
+menutrans Sa&ve-Exit<Tab>:wqa U&ložit\ a\ ukončit<Tab>:wqa
+menutrans E&xit<Tab>:qa &Ukončit<Tab>:qa
+
+if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. Rozdělit\ okno\ -\ &Diff\.\.\.
+ menutrans Split\ Patched\ &By\.\.\. Rozdělit\ okno\ -\ &Patch\.\.\.
+endif
+" }}}
+
+" {{{ Edit menu
+menutrans &Edit Úpr&avy
+menutrans &Undo<Tab>u &Zpět<Tab>u
+menutrans &Redo<Tab>^R Z&rušit\ vrácení<Tab>^R
+menutrans Rep&eat<Tab>\. &Opakovat<Tab>\.
+menutrans Cu&t<Tab>"+x &Vyříznout<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopírovat<Tab>"+y
+menutrans &Paste<Tab>"+gP V&ložit<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Vložit\ &před<Tab>[p
+menutrans Put\ &After<Tab>]p Vloži&t\ za<Tab>]p
+if has("win32") || has("win16")
+ menutrans &Delete<Tab>x &Smazat<Tab>x
+endif
+menutrans &Select\ All<Tab>ggVG Vy&brat\ vše<Tab>ggVG
+if has("win32") || has("win16") || has("gui_gtk") || has("gui_kde") || has("gui_motif")
+ menutrans &Find\.\.\. &Hledat\.\.\.
+ menutrans Find\ and\ Rep&lace\.\.\. &Nahradit\.\.\.
+else
+ menutrans Find<Tab>/ &Hledat<Tab>/
+ menutrans Find\ and\ Rep&lace<Tab>:%s &Nahradit<Tab>:%s
+ menutrans Find\ and\ Rep&lace<Tab>:s &Nahradit<Tab>:s
+endif
+menutrans Settings\ &Window Nastav&ení\ okna
+" {{{2 Edit -1
+menutrans Startup\ &Settings Počáteční\ &nastavení
+menutrans &Global\ Settings &Globální\ nastavení
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Přepnout\ zvýraznění\ vzoru<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Přepnout\ ignorování\ &VERZÁLEK<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Přepnout\ &Showmatch\ \{\(\[\])\}<Tab>:set\ sm!
+menutrans &Context\ lines Zobrazit\ konte&xt\ kurzoru
+menutrans &Virtual\ Edit Virtuální\ p&ozice\ kurzoru
+menutrans Never Nikdy
+menutrans Block\ Selection Výběr\ Bloku
+menutrans Insert\ mode Insert\ mód
+menutrans Block\ and\ Insert Blok\ a\ Insert
+menutrans Always Vždycky
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Přepnout\ Insert\ mó&d<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Přepnout\ kompatibilní\ režim\ s\ 'vi'<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Nastavit\ &cestu\ k\ prohledávání\.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&g\ soubory\.\.\.
+menutrans Toggle\ &Toolbar Přepnout\ &Toolbar
+menutrans Toggle\ &Bottom\ Scrollbar Př&epnout\ dolní\ rolovací\ lištu
+menutrans Toggle\ &Left\ Scrollbar Přepnout\ &levou\ rolovací\ lištu
+menutrans Toggle\ &Right\ Scrollbar Přepnout\ p&ravou\ rolovací\ lištu
+" {{{2 Edit -2
+menutrans F&ile\ Settings Nastavení\ so&uboru
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Přepnout\ číslování\ řá&dků<Tab>:set\ nu!
+menutrans Toggle\ relati&ve\ Line\ Numbering<Tab>:set\ rnu! Přepnout\ relativní\ číslování\ řá&dků<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Přepnout\ &List\ mód<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Přepnout\ zala&mování\ řádků<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Přepnout\ zl&om\ ve\ slově<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Přepnout\ &expand-tab<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Přepnout\ &auto-indent<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Přepnout\ &C-indenting<Tab>:set\ cin!
+menutrans &Shiftwidth Nastav&it\ šířku\ od&sazení
+menutrans Soft\ &Tabstop Nastavit\ Soft\ &Tabstop
+menutrans Te&xt\ Width\.\.\. Šířka\ te&xtu\.\.\.
+menutrans &File\ Format\.\.\. &Formát\ souboru\.\.\.
+" {{{2 Edit -3
+menutrans C&olor\ Scheme Barevné\ s&chéma
+menutrans &Keymap Klávesová\ m&apa
+if has("win32") || has("win16") || has("gui_motif") || has("gui_gtk") || has("gui_kde") || has("gui_photon") || has("gui_mac")
+ menutrans Select\ Fo&nt\.\.\. Vybrat\ pís&mo\.\.\.
+endif
+" }}}1
+
+" {{{ Programming menu
+menutrans &Tools Nást&roje
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skočit\ na\ tag<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skočit\ &zpět<Tab>^T
+menutrans Build\ &Tags\ File &Vytvořit\ soubor\ tagů
+
+if has("spell")
+ menutrans &Spelling &Kontrola\ pravopisu
+ menutrans &Spell\ Check\ On &Zapnout\ kontrolu\ pravopisu
+ menutrans Spell\ Check\ &Off &Vypnout\ kontrolu\ pravopisu
+ menutrans To\ &Next\ error<Tab>]s &Další\ chyba<Tab>]s
+ menutrans To\ &Previous\ error<Tab>[s &Předchozí\ chyba<Tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= &Navrhnout\ opravy<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall Zopakovat\ &opravu<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" Nastavit\ jazyk\ na\ "en"
+ menutrans Set\ language\ to\ "en_au" Nastavit\ jazyk\ na\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" Nastavit\ jazyk\ na\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" Nastavit\ jazyk\ na\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" Nastavit\ jazyk\ na\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" Nastavit\ jazyk\ na\ "en_us"
+ menutrans &Find\ More\ Languages Nalézt\ další\ &jazyky
+ let g:menutrans_set_lang_to = "Nastavit jazyk na"
+endif
+
+if has("Folding")
+ menutrans &Folding &Skládání
+ menutrans &Enable/Disable\ folds<Tab>zi &Ano/Ne<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Zobrazit\ řádek\ &kurzoru<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Zobrazit\ &pouze\ řádek\ kurzoru\ <Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm Složit\ &jednu\ úroveň\ skladů<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Složit\ všechny\ sklady<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Přidat\ jednu\ úroveň\ skladů<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR &Otevřít\ všechny\ sklady<Tab>zR
+ menutrans Fold\ Met&hod &Metoda\ skládání
+ menutrans M&anual &Ručně
+ menutrans I&ndent &Odsazení
+ menutrans E&xpression &Výraz
+ menutrans S&yntax &Syntaxe
+ menutrans &Diff &Rozdíly
+ menutrans Ma&rker &Značky
+ menutrans Create\ &Fold<Tab>zf Vytvořit\ &sklad<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd Vymazat\ skla&d<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Vymazat\ všechny\ sklady<Tab>zD
+ menutrans Fold\ col&umn\ width Sloupec\ zob&razení\ skladů
+endif
+
+if has("diff")
+ menutrans &Update &Obnovit
+ menutrans &Get\ Block &Sejmout\ Blok
+ menutrans &Put\ Block &Vložit\ Blok
+endif
+
+menutrans &Make<Tab>:make &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl Výpis\ &chyb<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Výp&is\ zpráv<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Další\ ch&yba<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Předchozí\ chyba<Tab>:cp
+menutrans &Older\ List<Tab>:cold Sta&rší\ seznam<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew N&ovější\ seznam<Tab>:cnew
+menutrans Error\ &Window Chybové\ o&kno
+menutrans SeT\ Compiler Nas&tavení\ kompilátoru
+menutrans &Update<Tab>:cwin O&bnovit<Tab>:cwin
+menutrans &Open<Tab>:copen &Otevřít<Tab>:copen
+menutrans &Close<Tab>:cclose &Zavřít<Tab>:cclose
+menutrans Se&T\ Compiler N&astavit\ kompilátor
+
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Převést\ do\ šestnáctkového\ formát&u<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Př&evést\ zpět<Tab>:%!xxd\ -r
+" }}}
+
+" {{{ Syntax menu
+menutrans &Syntax Synta&xe
+menutrans Set\ '&syntax'\ only Nastavit\ pouze\ 'synta&x'
+menutrans Set\ '&filetype'\ too Nastavit\ také\ '&filetype'
+menutrans &Off &Vypnout
+menutrans &Manual &Ručně
+menutrans A&utomatic A&utomaticky
+menutrans on/off\ for\ &This\ file &Přepnout\ (pro\ tento\ soubor)
+menutrans o&ff\ (this\ file) vyp&nout\ (pro\ tento\ soubor)
+menutrans Co&lor\ test Test\ &barev
+menutrans &Highlight\ test &Test\ zvýrazňování
+menutrans &Convert\ to\ HTML Převést\ &do\ HTML
+menutrans &Show\ filetypes\ in\ menu &Zobrazit\ výběr\ možností
+" }}}
+
+" {{{ Menu Buffers
+menutrans &Buffers &Buffery
+menutrans &Refresh\ menu &Obnovit\ menu
+menutrans &Delete Z&rušit
+menutrans &Alternate &Změnit
+menutrans &Next &Další
+menutrans &Previous &Předchozí
+" }}}
+
+" {{{ Menu Window
+menutrans &Window &Okna
+menutrans &New<Tab>^Wn &Nové<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Rozdělit<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Ro&zdělit\ na\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Rozdělit\ &vertikálně<Tab>^Wv
+menutrans Split\ File\ E&xplorer Rozdělit\ -\ File\ E&xplorer
+menutrans Move\ &To &Přesun
+menutrans &Top<Tab>^WK &Nahoru<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Dolu<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Vlevo<Tab>^WH
+menutrans &Right\ side<Tab>^WL Vp&ravo<Tab>^WL
+
+menutrans &Close<Tab>^Wc Zavří&t<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zavřít\ &ostatní<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Další<Tab>^Ww
+menutrans P&revious<Tab>^WW &Předchozí<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Stejná\ výška<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Maximální\ výš&ka<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ M&inimální\ výška<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| &Maximální\ šířka<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimální\ šířk&a<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR Rotovat\ na&horu<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotovat\ &dolů<Tab>^Wr
+
+" {{{ Help menu
+menutrans &Help &Nápověda
+menutrans &Overview<Tab><F1> &Přehled<Tab><F1>
+menutrans &User\ Manual &Uživatelský\ Manuál
+menutrans &How-to\ links Ho&wto
+menutrans &GUI &Grafické\ rozhraní
+menutrans &Credits &Autoři
+menutrans Co&pying &Licenční\ politika
+menutrans &Sponsor/Register Sponzorování/&Registrace
+menutrans &Find\.\.\. &Hledat\.\.\.
+menutrans O&rphans O&siřelé\ děti
+menutrans &Version &Verze
+menutrans &About &O\ aplikaci
+" }}}
+
+" {{{ The popup menu
+menutrans &Undo &Zpět
+menutrans Cu&t &Vyříznout
+menutrans &Copy &Kopírovat
+menutrans &Paste &Vložit
+menutrans &Delete &Smazat
+menutrans Select\ Blockwise Vybrat\ blokově
+menutrans Select\ &Word Vybrat\ &slovo
+menutrans Select\ Pa&ragraph Vybrat\ &odstavec
+menutrans Select\ &Sentence Vybrat\ vě&tu
+menutrans Select\ &Line Vybrat\ &řádek
+menutrans Select\ &Block Vybrat\ &blok
+menutrans Select\ &All Vybrat\ &vše
+" }}}
+
+" {{{ The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Otevřít soubor
+ tmenu ToolBar.Save Uložit soubor
+ tmenu ToolBar.SaveAll Uložit všechny soubory
+ if has("printer") || has("unix")
+ tmenu ToolBar.Print Tisk
+ endif
+ tmenu ToolBar.Undo Zpět
+ tmenu ToolBar.Redo Zrušit vrácení
+ tmenu ToolBar.Cut Vyříznout
+ tmenu ToolBar.Copy Kopírovat
+ tmenu ToolBar.Paste Vložit
+ tmenu ToolBar.Find Hledat...
+ tmenu ToolBar.FindNext Hledat další
+ tmenu ToolBar.FindPrev Hledat předchozí
+ tmenu ToolBar.Replace Nahradit...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nové okno
+ tmenu ToolBar.WinSplit Rozdělit okno
+ tmenu ToolBar.WinMax Maximalizovat okno
+ tmenu ToolBar.WinMin Minimalizovat okno
+ tmenu ToolBar.WinClose Zavřít okno
+ endif
+ tmenu ToolBar.LoadSesn Načíst sezení
+ tmenu ToolBar.SaveSesn Uložit sezení
+ tmenu ToolBar.RunScript Spustit skript
+ tmenu ToolBar.Make Spustit make
+ tmenu ToolBar.Shell Spustit shell
+ tmenu ToolBar.RunCtags Spustit ctags
+ tmenu ToolBar.TagJump Skočit na tag pod kurzorem
+ tmenu ToolBar.Help Nápověda
+ tmenu ToolBar.FindHelp Hledat nápovědu k...
+ endfun
+endif
+" }}}
+
+" {{{ DIALOG TEXTS
+let g:menutrans_no_file = "[Žádný soubor]"
+let g:menutrans_help_dialog = "Zadejte hledaný příkaz nebo slovo:\n\n\tPřidejte i_ pro příkazy vkládacího režimu (např. i_CTRL-X)\n\tPřidejte c_ pro příkazy příkazové řádky (např. c_<Del>)\n\tPřidejte ' pro jméno volby (např. 'shiftwidth')"
+let g:menutrans_path_dialog = "Zadejte cesty pro vyhledávání souborů. Jednotlivé cesty oddělte čárkou"
+let g:menutrans_tags_dialog = "Zadejte jména souborů s tagy. Jména oddělte čárkami."
+let g:menutrans_textwidth_dialog = "Zadejte délku řádku (0 pro zakázání formátování):"
+let g:menutrans_fileformat_dialog = "Vyberte typ konce řádků"
+" }}}"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+
+
+" vim:set foldmethod=marker expandtab tabstop=3 shiftwidth=3:
diff --git a/runtime/lang/menu_czech_czech_republic.1250.vim b/runtime/lang/menu_czech_czech_republic.1250.vim
new file mode 100644
index 0000000..6691a88
--- /dev/null
+++ b/runtime/lang/menu_czech_czech_republic.1250.vim
@@ -0,0 +1,309 @@
+" Menu Translations: Czech (CP1250)
+" Maintainer: Jiri Sedlak <jiri_sedlak@users.sourceforge.net>
+" Previous maintainer: Jiri Brezina
+" Based on: menu.vim (2012-10-21)
+" Generated from menu_cs_cz.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding cp1250
+
+" {{{ File menu
+menutrans &File &Soubor
+menutrans &Open\.\.\.<Tab>:e &Otevt\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Otevt\ v\ no&vm\ okn\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Otevt\ tab\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nov<Tab>:enew
+menutrans &Close<Tab>:close &Zavt<Tab>:close
+menutrans &Save<Tab>:w &Uloit<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Uloit\ &jako\.\.\.<Tab>:sav
+if has("printer") || has("unix")
+ menutrans &Print &Tisk
+endif
+menutrans Sa&ve-Exit<Tab>:wqa U&loit\ a\ ukonit<Tab>:wqa
+menutrans E&xit<Tab>:qa &Ukonit<Tab>:qa
+
+if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. Rozdlit\ okno\ -\ &Diff\.\.\.
+ menutrans Split\ Patched\ &By\.\.\. Rozdlit\ okno\ -\ &Patch\.\.\.
+endif
+" }}}
+
+" {{{ Edit menu
+menutrans &Edit pr&avy
+menutrans &Undo<Tab>u &Zpt<Tab>u
+menutrans &Redo<Tab>^R Z&ruit\ vrcen<Tab>^R
+menutrans Rep&eat<Tab>\. &Opakovat<Tab>\.
+menutrans Cu&t<Tab>"+x &Vyznout<Tab>"+x
+menutrans &Copy<Tab>"+y &Koprovat<Tab>"+y
+menutrans &Paste<Tab>"+gP V&loit<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Vloit\ &ped<Tab>[p
+menutrans Put\ &After<Tab>]p Vloi&t\ za<Tab>]p
+if has("win32") || has("win16")
+ menutrans &Delete<Tab>x &Smazat<Tab>x
+endif
+menutrans &Select\ All<Tab>ggVG Vy&brat\ ve<Tab>ggVG
+if has("win32") || has("win16") || has("gui_gtk") || has("gui_kde") || has("gui_motif")
+ menutrans &Find\.\.\. &Hledat\.\.\.
+ menutrans Find\ and\ Rep&lace\.\.\. &Nahradit\.\.\.
+else
+ menutrans Find<Tab>/ &Hledat<Tab>/
+ menutrans Find\ and\ Rep&lace<Tab>:%s &Nahradit<Tab>:%s
+ menutrans Find\ and\ Rep&lace<Tab>:s &Nahradit<Tab>:s
+endif
+menutrans Settings\ &Window Nastav&en\ okna
+" {{{2 Edit -1
+menutrans Startup\ &Settings Poten\ &nastaven
+menutrans &Global\ Settings &Globln\ nastaven
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Pepnout\ zvraznn\ vzoru<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Pepnout\ ignorovn\ &VERZLEK<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Pepnout\ &Showmatch\ \{\(\[\])\}<Tab>:set\ sm!
+menutrans &Context\ lines Zobrazit\ konte&xt\ kurzoru
+menutrans &Virtual\ Edit Virtuln\ p&ozice\ kurzoru
+menutrans Never Nikdy
+menutrans Block\ Selection Vbr\ Bloku
+menutrans Insert\ mode Insert\ md
+menutrans Block\ and\ Insert Blok\ a\ Insert
+menutrans Always Vdycky
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Pepnout\ Insert\ m&d<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Pepnout\ kompatibiln\ reim\ s\ 'vi'<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Nastavit\ &cestu\ k\ prohledvn\.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&g\ soubory\.\.\.
+menutrans Toggle\ &Toolbar Pepnout\ &Toolbar
+menutrans Toggle\ &Bottom\ Scrollbar P&epnout\ doln\ rolovac\ litu
+menutrans Toggle\ &Left\ Scrollbar Pepnout\ &levou\ rolovac\ litu
+menutrans Toggle\ &Right\ Scrollbar Pepnout\ p&ravou\ rolovac\ litu
+" {{{2 Edit -2
+menutrans F&ile\ Settings Nastaven\ so&uboru
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Pepnout\ slovn\ &dk<Tab>:set\ nu!
+menutrans Toggle\ relati&ve\ Line\ Numbering<Tab>:set\ rnu! Pepnout\ relativn\ slovn\ &dk<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Pepnout\ &List\ md<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Pepnout\ zala&movn\ dk<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Pepnout\ zl&om\ ve\ slov<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Pepnout\ &expand-tab<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Pepnout\ &auto-indent<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Pepnout\ &C-indenting<Tab>:set\ cin!
+menutrans &Shiftwidth Nastav&it\ ku\ od&sazen
+menutrans Soft\ &Tabstop Nastavit\ Soft\ &Tabstop
+menutrans Te&xt\ Width\.\.\. ka\ te&xtu\.\.\.
+menutrans &File\ Format\.\.\. &Formt\ souboru\.\.\.
+" {{{2 Edit -3
+menutrans C&olor\ Scheme Barevn\ s&chma
+menutrans &Keymap Klvesov\ m&apa
+if has("win32") || has("win16") || has("gui_motif") || has("gui_gtk") || has("gui_kde") || has("gui_photon") || has("gui_mac")
+ menutrans Select\ Fo&nt\.\.\. Vybrat\ ps&mo\.\.\.
+endif
+" }}}1
+
+" {{{ Programming menu
+menutrans &Tools Nst&roje
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skoit\ na\ tag<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skoit\ &zpt<Tab>^T
+menutrans Build\ &Tags\ File &Vytvoit\ soubor\ tag
+
+if has("spell")
+ menutrans &Spelling &Kontrola\ pravopisu
+ menutrans &Spell\ Check\ On &Zapnout\ kontrolu\ pravopisu
+ menutrans Spell\ Check\ &Off &Vypnout\ kontrolu\ pravopisu
+ menutrans To\ &Next\ error<Tab>]s &Dal\ chyba<Tab>]s
+ menutrans To\ &Previous\ error<Tab>[s &Pedchoz\ chyba<Tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= &Navrhnout\ opravy<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall Zopakovat\ &opravu<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" Nastavit\ jazyk\ na\ "en"
+ menutrans Set\ language\ to\ "en_au" Nastavit\ jazyk\ na\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" Nastavit\ jazyk\ na\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" Nastavit\ jazyk\ na\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" Nastavit\ jazyk\ na\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" Nastavit\ jazyk\ na\ "en_us"
+ menutrans &Find\ More\ Languages Nalzt\ dal\ &jazyky
+ let g:menutrans_set_lang_to = "Nastavit jazyk na"
+endif
+
+if has("Folding")
+ menutrans &Folding &Skldn
+ menutrans &Enable/Disable\ folds<Tab>zi &Ano/Ne<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Zobrazit\ dek\ &kurzoru<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Zobrazit\ &pouze\ dek\ kurzoru\ <Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm Sloit\ &jednu\ rove\ sklad<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Sloit\ vechny\ sklady<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Pidat\ jednu\ rove\ sklad<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR &Otevt\ vechny\ sklady<Tab>zR
+ menutrans Fold\ Met&hod &Metoda\ skldn
+ menutrans M&anual &Run
+ menutrans I&ndent &Odsazen
+ menutrans E&xpression &Vraz
+ menutrans S&yntax &Syntaxe
+ menutrans &Diff &Rozdly
+ menutrans Ma&rker &Znaky
+ menutrans Create\ &Fold<Tab>zf Vytvoit\ &sklad<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd Vymazat\ skla&d<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Vymazat\ vechny\ sklady<Tab>zD
+ menutrans Fold\ col&umn\ width Sloupec\ zob&razen\ sklad
+endif
+
+if has("diff")
+ menutrans &Update &Obnovit
+ menutrans &Get\ Block &Sejmout\ Blok
+ menutrans &Put\ Block &Vloit\ Blok
+endif
+
+menutrans &Make<Tab>:make &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl Vpis\ &chyb<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Vp&is\ zprv<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Dal\ ch&yba<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Pedchoz\ chyba<Tab>:cp
+menutrans &Older\ List<Tab>:cold Sta&r\ seznam<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew N&ovj\ seznam<Tab>:cnew
+menutrans Error\ &Window Chybov\ o&kno
+menutrans SeT\ Compiler Nas&taven\ kompiltoru
+menutrans &Update<Tab>:cwin O&bnovit<Tab>:cwin
+menutrans &Open<Tab>:copen &Otevt<Tab>:copen
+menutrans &Close<Tab>:cclose &Zavt<Tab>:cclose
+menutrans Se&T\ Compiler N&astavit\ kompiltor
+
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Pevst\ do\ estnctkovho\ formt&u<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r P&evst\ zpt<Tab>:%!xxd\ -r
+" }}}
+
+" {{{ Syntax menu
+menutrans &Syntax Synta&xe
+menutrans Set\ '&syntax'\ only Nastavit\ pouze\ 'synta&x'
+menutrans Set\ '&filetype'\ too Nastavit\ tak\ '&filetype'
+menutrans &Off &Vypnout
+menutrans &Manual &Run
+menutrans A&utomatic A&utomaticky
+menutrans on/off\ for\ &This\ file &Pepnout\ (pro\ tento\ soubor)
+menutrans o&ff\ (this\ file) vyp&nout\ (pro\ tento\ soubor)
+menutrans Co&lor\ test Test\ &barev
+menutrans &Highlight\ test &Test\ zvrazovn
+menutrans &Convert\ to\ HTML Pevst\ &do\ HTML
+menutrans &Show\ filetypes\ in\ menu &Zobrazit\ vbr\ monost
+" }}}
+
+" {{{ Menu Buffers
+menutrans &Buffers &Buffery
+menutrans &Refresh\ menu &Obnovit\ menu
+menutrans &Delete Z&ruit
+menutrans &Alternate &Zmnit
+menutrans &Next &Dal
+menutrans &Previous &Pedchoz
+" }}}
+
+" {{{ Menu Window
+menutrans &Window &Okna
+menutrans &New<Tab>^Wn &Nov<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Rozdlit<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Ro&zdlit\ na\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Rozdlit\ &vertikln<Tab>^Wv
+menutrans Split\ File\ E&xplorer Rozdlit\ -\ File\ E&xplorer
+menutrans Move\ &To &Pesun
+menutrans &Top<Tab>^WK &Nahoru<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Dolu<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Vlevo<Tab>^WH
+menutrans &Right\ side<Tab>^WL Vp&ravo<Tab>^WL
+
+menutrans &Close<Tab>^Wc Zav&t<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zavt\ &ostatn<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Dal<Tab>^Ww
+menutrans P&revious<Tab>^WW &Pedchoz<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Stejn\ vka<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Maximln\ v&ka<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ M&inimln\ vka<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| &Maximln\ ka<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimln\ k&a<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR Rotovat\ na&horu<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotovat\ &dol<Tab>^Wr
+
+" {{{ Help menu
+menutrans &Help &Npovda
+menutrans &Overview<Tab><F1> &Pehled<Tab><F1>
+menutrans &User\ Manual &Uivatelsk\ Manul
+menutrans &How-to\ links Ho&wto
+menutrans &GUI &Grafick\ rozhran
+menutrans &Credits &Autoi
+menutrans Co&pying &Licenn\ politika
+menutrans &Sponsor/Register Sponzorovn/&Registrace
+menutrans &Find\.\.\. &Hledat\.\.\.
+menutrans O&rphans O&siel\ dti
+menutrans &Version &Verze
+menutrans &About &O\ aplikaci
+" }}}
+
+" {{{ The popup menu
+menutrans &Undo &Zpt
+menutrans Cu&t &Vyznout
+menutrans &Copy &Koprovat
+menutrans &Paste &Vloit
+menutrans &Delete &Smazat
+menutrans Select\ Blockwise Vybrat\ blokov
+menutrans Select\ &Word Vybrat\ &slovo
+menutrans Select\ Pa&ragraph Vybrat\ &odstavec
+menutrans Select\ &Sentence Vybrat\ v&tu
+menutrans Select\ &Line Vybrat\ &dek
+menutrans Select\ &Block Vybrat\ &blok
+menutrans Select\ &All Vybrat\ &ve
+" }}}
+
+" {{{ The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Otevt soubor
+ tmenu ToolBar.Save Uloit soubor
+ tmenu ToolBar.SaveAll Uloit vechny soubory
+ if has("printer") || has("unix")
+ tmenu ToolBar.Print Tisk
+ endif
+ tmenu ToolBar.Undo Zpt
+ tmenu ToolBar.Redo Zruit vrcen
+ tmenu ToolBar.Cut Vyznout
+ tmenu ToolBar.Copy Koprovat
+ tmenu ToolBar.Paste Vloit
+ tmenu ToolBar.Find Hledat...
+ tmenu ToolBar.FindNext Hledat dal
+ tmenu ToolBar.FindPrev Hledat pedchoz
+ tmenu ToolBar.Replace Nahradit...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nov okno
+ tmenu ToolBar.WinSplit Rozdlit okno
+ tmenu ToolBar.WinMax Maximalizovat okno
+ tmenu ToolBar.WinMin Minimalizovat okno
+ tmenu ToolBar.WinClose Zavt okno
+ endif
+ tmenu ToolBar.LoadSesn Nast sezen
+ tmenu ToolBar.SaveSesn Uloit sezen
+ tmenu ToolBar.RunScript Spustit skript
+ tmenu ToolBar.Make Spustit make
+ tmenu ToolBar.Shell Spustit shell
+ tmenu ToolBar.RunCtags Spustit ctags
+ tmenu ToolBar.TagJump Skoit na tag pod kurzorem
+ tmenu ToolBar.Help Npovda
+ tmenu ToolBar.FindHelp Hledat npovdu k...
+ endfun
+endif
+" }}}
+
+" {{{ DIALOG TEXTS
+let g:menutrans_no_file = "[dn soubor]"
+let g:menutrans_help_dialog = "Zadejte hledan pkaz nebo slovo:\n\n\tPidejte i_ pro pkazy vkldacho reimu (nap. i_CTRL-X)\n\tPidejte c_ pro pkazy pkazov dky (nap. c_<Del>)\n\tPidejte ' pro jmno volby (nap. 'shiftwidth')"
+let g:menutrans_path_dialog = "Zadejte cesty pro vyhledvn soubor. Jednotliv cesty oddlte rkou"
+let g:menutrans_tags_dialog = "Zadejte jmna soubor s tagy. Jmna oddlte rkami."
+let g:menutrans_textwidth_dialog = "Zadejte dlku dku (0 pro zakzn formtovn):"
+let g:menutrans_fileformat_dialog = "Vyberte typ konce dk"
+" }}}"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+
+
+" vim:set foldmethod=marker expandtab tabstop=3 shiftwidth=3:
diff --git a/runtime/lang/menu_czech_czech_republic.1252.vim b/runtime/lang/menu_czech_czech_republic.1252.vim
new file mode 100644
index 0000000..27e1fb4
--- /dev/null
+++ b/runtime/lang/menu_czech_czech_republic.1252.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Czech for Windows in ASCII encoding
+
+source <sfile>:p:h/menu_czech_czech_republic.ascii.vim
diff --git a/runtime/lang/menu_czech_czech_republic.ascii.vim b/runtime/lang/menu_czech_czech_republic.ascii.vim
new file mode 100644
index 0000000..7e86720
--- /dev/null
+++ b/runtime/lang/menu_czech_czech_republic.ascii.vim
@@ -0,0 +1,309 @@
+" Menu Translations: Czech (ASCII - without diacritics)
+" Maintainer: Jiri Sedlak <jiri_sedlak@users.sourceforge.net>
+" Previous maintainer: Jiri Brezina
+" Based on: menu.vim (2012-10-21)
+" Generated from menu_cs_cz.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding latin1
+
+" {{{ File menu
+menutrans &File &Soubor
+menutrans &Open\.\.\.<Tab>:e &Otevrit\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Otevrit\ v\ no&vem\ okne\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Otevrit\ tab\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Novy<Tab>:enew
+menutrans &Close<Tab>:close &Zavrit<Tab>:close
+menutrans &Save<Tab>:w &Ulozit<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Ulozit\ &jako\.\.\.<Tab>:sav
+if has("printer") || has("unix")
+ menutrans &Print &Tisk
+endif
+menutrans Sa&ve-Exit<Tab>:wqa U&lozit\ a\ ukoncit<Tab>:wqa
+menutrans E&xit<Tab>:qa &Ukoncit<Tab>:qa
+
+if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. Rozdelit\ okno\ -\ &Diff\.\.\.
+ menutrans Split\ Patched\ &By\.\.\. Rozdelit\ okno\ -\ &Patch\.\.\.
+endif
+" }}}
+
+" {{{ Edit menu
+menutrans &Edit Upr&avy
+menutrans &Undo<Tab>u &Zpet<Tab>u
+menutrans &Redo<Tab>^R Z&rusit\ vraceni<Tab>^R
+menutrans Rep&eat<Tab>\. &Opakovat<Tab>\.
+menutrans Cu&t<Tab>"+x &Vyriznout<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopirovat<Tab>"+y
+menutrans &Paste<Tab>"+gP V&lozit<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Vlozit\ &pred<Tab>[p
+menutrans Put\ &After<Tab>]p Vlozi&t\ za<Tab>]p
+if has("win32") || has("win16")
+ menutrans &Delete<Tab>x &Smazat<Tab>x
+endif
+menutrans &Select\ All<Tab>ggVG Vy&brat\ vse<Tab>ggVG
+if has("win32") || has("win16") || has("gui_gtk") || has("gui_kde") || has("gui_motif")
+ menutrans &Find\.\.\. &Hledat\.\.\.
+ menutrans Find\ and\ Rep&lace\.\.\. &Nahradit\.\.\.
+else
+ menutrans Find<Tab>/ &Hledat<Tab>/
+ menutrans Find\ and\ Rep&lace<Tab>:%s &Nahradit<Tab>:%s
+ menutrans Find\ and\ Rep&lace<Tab>:s &Nahradit<Tab>:s
+endif
+menutrans Settings\ &Window Nastav&eni\ okna
+" {{{2 Edit -1
+menutrans Startup\ &Settings Pocatecni\ &nastaveni
+menutrans &Global\ Settings &Globalni\ nastaveni
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Prepnout\ zvyrazneni\ vzoru<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Prepnout\ ignorovani\ &VERZALEK<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Prepnout\ &Showmatch\ \{\(\[\])\}<Tab>:set\ sm!
+menutrans &Context\ lines Zobrazit\ konte&xt\ kurzoru
+menutrans &Virtual\ Edit Virtualni\ p&ozice\ kurzoru
+menutrans Never Nikdy
+menutrans Block\ Selection Vyber\ Bloku
+menutrans Insert\ mode Insert\ mod
+menutrans Block\ and\ Insert Blok\ a\ Insert
+menutrans Always Vzdycky
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Prepnout\ Insert\ mo&d<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Prepnout\ kompatibilni\ rezim\ s\ 'vi'<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Nastavit\ &cestu\ k\ prohledavani\.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&g\ soubory\.\.\.
+menutrans Toggle\ &Toolbar Prepnout\ &Toolbar
+menutrans Toggle\ &Bottom\ Scrollbar Pr&epnout\ dolni\ rolovaci\ listu
+menutrans Toggle\ &Left\ Scrollbar Prepnout\ &levou\ rolovaci\ listu
+menutrans Toggle\ &Right\ Scrollbar Prepnout\ p&ravou\ rolovaci\ listu
+" {{{2 Edit -2
+menutrans F&ile\ Settings Nastaveni\ so&uboru
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Prepnout\ cislovani\ ra&dku<Tab>:set\ nu!
+menutrans Toggle\ relati&ve\ Line\ Numbering<Tab>:set\ rnu! Prepnout\ relativni\ cislovani\ ra&dku<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Prepnout\ &List\ mod<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Prepnout\ zala&movani\ radku<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Prepnout\ zl&om\ ve\ slove<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Prepnout\ &expand-tab<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Prepnout\ &auto-indent<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Prepnout\ &C-indenting<Tab>:set\ cin!
+menutrans &Shiftwidth Nastav&it\ sirku\ od&sazeni
+menutrans Soft\ &Tabstop Nastavit\ Soft\ &Tabstop
+menutrans Te&xt\ Width\.\.\. Sirka\ te&xtu\.\.\.
+menutrans &File\ Format\.\.\. &Format\ souboru\.\.\.
+" {{{2 Edit -3
+menutrans C&olor\ Scheme Barevne\ s&chema
+menutrans &Keymap Klavesova\ m&apa
+if has("win32") || has("win16") || has("gui_motif") || has("gui_gtk") || has("gui_kde") || has("gui_photon") || has("gui_mac")
+ menutrans Select\ Fo&nt\.\.\. Vybrat\ pis&mo\.\.\.
+endif
+" }}}1
+
+" {{{ Programming menu
+menutrans &Tools Nast&roje
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skocit\ na\ tag<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skocit\ &zpet<Tab>^T
+menutrans Build\ &Tags\ File &Vytvorit\ soubor\ tagu
+
+if has("spell")
+ menutrans &Spelling &Kontrola\ pravopisu
+ menutrans &Spell\ Check\ On &Zapnout\ kontrolu\ pravopisu
+ menutrans Spell\ Check\ &Off &Vypnout\ kontrolu\ pravopisu
+ menutrans To\ &Next\ error<Tab>]s &Dalsi\ chyba<Tab>]s
+ menutrans To\ &Previous\ error<Tab>[s &Predchozi\ chyba<Tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= &Navrhnout\ opravy<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall Zopakovat\ &opravu<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" Nastavit\ jazyk\ na\ "en"
+ menutrans Set\ language\ to\ "en_au" Nastavit\ jazyk\ na\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" Nastavit\ jazyk\ na\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" Nastavit\ jazyk\ na\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" Nastavit\ jazyk\ na\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" Nastavit\ jazyk\ na\ "en_us"
+ menutrans &Find\ More\ Languages Nalezt\ dalsi\ &jazyky
+ let g:menutrans_set_lang_to = "Nastavit jazyk na"
+endif
+
+if has("Folding")
+ menutrans &Folding &Skladani
+ menutrans &Enable/Disable\ folds<Tab>zi &Ano/Ne<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Zobrazit\ radek\ &kurzoru<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Zobrazit\ &pouze\ radek\ kurzoru\ <Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm Slozit\ &jednu\ uroven\ skladu<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Slozit\ vsechny\ sklady<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Pridat\ jednu\ uroven\ skladu<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR &Otevrit\ vsechny\ sklady<Tab>zR
+ menutrans Fold\ Met&hod &Metoda\ skladani
+ menutrans M&anual &Rucne
+ menutrans I&ndent &Odsazeni
+ menutrans E&xpression &Vyraz
+ menutrans S&yntax &Syntaxe
+ menutrans &Diff &Rozdily
+ menutrans Ma&rker &Znacky
+ menutrans Create\ &Fold<Tab>zf Vytvorit\ &sklad<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd Vymazat\ skla&d<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Vymazat\ vsechny\ sklady<Tab>zD
+ menutrans Fold\ col&umn\ width Sloupec\ zob&razeni\ skladu
+endif
+
+if has("diff")
+ menutrans &Update &Obnovit
+ menutrans &Get\ Block &Sejmout\ Blok
+ menutrans &Put\ Block &Vlozit\ Blok
+endif
+
+menutrans &Make<Tab>:make &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl Vypis\ &chyb<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Vyp&is\ zprav<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Dalsi\ ch&yba<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Predchozi\ chyba<Tab>:cp
+menutrans &Older\ List<Tab>:cold Sta&rsi\ seznam<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew N&ovejsi\ seznam<Tab>:cnew
+menutrans Error\ &Window Chybove\ o&kno
+menutrans SeT\ Compiler Nas&taveni\ kompilatoru
+menutrans &Update<Tab>:cwin O&bnovit<Tab>:cwin
+menutrans &Open<Tab>:copen &Otevrit<Tab>:copen
+menutrans &Close<Tab>:cclose &Zavrit<Tab>:cclose
+menutrans Se&T\ Compiler N&astavit\ kompilator
+
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Prevest\ do\ sestnactkoveho\ format&u<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Pr&evest\ zpet<Tab>:%!xxd\ -r
+" }}}
+
+" {{{ Syntax menu
+menutrans &Syntax Synta&xe
+menutrans Set\ '&syntax'\ only Nastavit\ pouze\ 'synta&x'
+menutrans Set\ '&filetype'\ too Nastavit\ take\ '&filetype'
+menutrans &Off &Vypnout
+menutrans &Manual &Rucne
+menutrans A&utomatic A&utomaticky
+menutrans on/off\ for\ &This\ file &Prepnout\ (pro\ tento\ soubor)
+menutrans o&ff\ (this\ file) vyp&nout\ (pro\ tento\ soubor)
+menutrans Co&lor\ test Test\ &barev
+menutrans &Highlight\ test &Test\ zvyraznovani
+menutrans &Convert\ to\ HTML Prevest\ &do\ HTML
+menutrans &Show\ filetypes\ in\ menu &Zobrazit\ vyber\ moznosti
+" }}}
+
+" {{{ Menu Buffers
+menutrans &Buffers &Buffery
+menutrans &Refresh\ menu &Obnovit\ menu
+menutrans &Delete Z&rusit
+menutrans &Alternate &Zmenit
+menutrans &Next &Dalsi
+menutrans &Previous &Predchozi
+" }}}
+
+" {{{ Menu Window
+menutrans &Window &Okna
+menutrans &New<Tab>^Wn &Nove<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Rozdelit<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Ro&zdelit\ na\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Rozdelit\ &vertikalne<Tab>^Wv
+menutrans Split\ File\ E&xplorer Rozdelit\ -\ File\ E&xplorer
+menutrans Move\ &To &Presun
+menutrans &Top<Tab>^WK &Nahoru<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Dolu<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Vlevo<Tab>^WH
+menutrans &Right\ side<Tab>^WL Vp&ravo<Tab>^WL
+
+menutrans &Close<Tab>^Wc Zavri&t<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zavrit\ &ostatni<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Dalsi<Tab>^Ww
+menutrans P&revious<Tab>^WW &Predchozi<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Stejna\ vyska<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Maximalni\ vys&ka<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ M&inimalni\ vyska<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| &Maximalni\ sirka<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimalni\ sirk&a<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR Rotovat\ na&horu<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotovat\ &dolu<Tab>^Wr
+
+" {{{ Help menu
+menutrans &Help &Napoveda
+menutrans &Overview<Tab><F1> &Prehled<Tab><F1>
+menutrans &User\ Manual &Uzivatelsky\ Manual
+menutrans &How-to\ links Ho&wto
+menutrans &GUI &Graficke\ rozhrani
+menutrans &Credits &Autori
+menutrans Co&pying &Licencni\ politika
+menutrans &Sponsor/Register Sponzorovani/&Registrace
+menutrans &Find\.\.\. &Hledat\.\.\.
+menutrans O&rphans O&sirele\ deti
+menutrans &Version &Verze
+menutrans &About &O\ aplikaci
+" }}}
+
+" {{{ The popup menu
+menutrans &Undo &Zpet
+menutrans Cu&t &Vyriznout
+menutrans &Copy &Kopirovat
+menutrans &Paste &Vlozit
+menutrans &Delete &Smazat
+menutrans Select\ Blockwise Vybrat\ blokove
+menutrans Select\ &Word Vybrat\ &slovo
+menutrans Select\ Pa&ragraph Vybrat\ &odstavec
+menutrans Select\ &Sentence Vybrat\ ve&tu
+menutrans Select\ &Line Vybrat\ &radek
+menutrans Select\ &Block Vybrat\ &blok
+menutrans Select\ &All Vybrat\ &vse
+" }}}
+
+" {{{ The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Otevrit soubor
+ tmenu ToolBar.Save Ulozit soubor
+ tmenu ToolBar.SaveAll Ulozit vsechny soubory
+ if has("printer") || has("unix")
+ tmenu ToolBar.Print Tisk
+ endif
+ tmenu ToolBar.Undo Zpet
+ tmenu ToolBar.Redo Zrusit vraceni
+ tmenu ToolBar.Cut Vyriznout
+ tmenu ToolBar.Copy Kopirovat
+ tmenu ToolBar.Paste Vlozit
+ tmenu ToolBar.Find Hledat...
+ tmenu ToolBar.FindNext Hledat dalsi
+ tmenu ToolBar.FindPrev Hledat predchozi
+ tmenu ToolBar.Replace Nahradit...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nove okno
+ tmenu ToolBar.WinSplit Rozdelit okno
+ tmenu ToolBar.WinMax Maximalizovat okno
+ tmenu ToolBar.WinMin Minimalizovat okno
+ tmenu ToolBar.WinClose Zavrit okno
+ endif
+ tmenu ToolBar.LoadSesn Nacist sezeni
+ tmenu ToolBar.SaveSesn Ulozit sezeni
+ tmenu ToolBar.RunScript Spustit skript
+ tmenu ToolBar.Make Spustit make
+ tmenu ToolBar.Shell Spustit shell
+ tmenu ToolBar.RunCtags Spustit ctags
+ tmenu ToolBar.TagJump Skocit na tag pod kurzorem
+ tmenu ToolBar.Help Napoveda
+ tmenu ToolBar.FindHelp Hledat napovedu k...
+ endfun
+endif
+" }}}
+
+" {{{ DIALOG TEXTS
+let g:menutrans_no_file = "[Zadny soubor]"
+let g:menutrans_help_dialog = "Zadejte hledany prikaz nebo slovo:\n\n\tPridejte i_ pro prikazy vkladaciho rezimu (napr. i_CTRL-X)\n\tPridejte c_ pro prikazy prikazove radky (napr. c_<Del>)\n\tPridejte ' pro jmeno volby (napr. 'shiftwidth')"
+let g:menutrans_path_dialog = "Zadejte cesty pro vyhledavani souboru. Jednotlive cesty oddelte carkou"
+let g:menutrans_tags_dialog = "Zadejte jmena souboru s tagy. Jmena oddelte carkami."
+let g:menutrans_textwidth_dialog = "Zadejte delku radku (0 pro zakazani formatovani):"
+let g:menutrans_fileformat_dialog = "Vyberte typ konce radku"
+" }}}"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+
+
+" vim:set foldmethod=marker expandtab tabstop=3 shiftwidth=3:
diff --git a/runtime/lang/menu_da.latin1.vim b/runtime/lang/menu_da.latin1.vim
new file mode 100644
index 0000000..b258495
--- /dev/null
+++ b/runtime/lang/menu_da.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Danish for iso-8859-1 encoding
+
+source <sfile>:p:h/menu_da.utf-8.vim
diff --git a/runtime/lang/menu_da.utf-8.vim b/runtime/lang/menu_da.utf-8.vim
new file mode 100644
index 0000000..cffe1cc
--- /dev/null
+++ b/runtime/lang/menu_da.utf-8.vim
@@ -0,0 +1,464 @@
+" Menu Translations: Danish
+" Maintainer: scootergrisen
+" Last Change: 2022 Nov 17
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Help menu
+menut &Help Hjælp
+
+menut &Overview<Tab><F1> Overblik<Tab><F1>
+menut &User\ Manual Brugermanual
+menut &How-to\ links How-to-links
+menut &Find\.\.\. Find\.\.\.
+" -SEP1-
+menut &Credits Anerkendelser
+menut Co&pying Kopiering
+menut &Sponsor/Register Sponsorer/registrer
+menut O&rphans Forældreløse\ børn
+" -SEP2-
+menut &Version Version
+menut &About Om
+
+let g:menutrans_help_dialog = "Indtast en kommando eller ord for at finde hjælp om:\n\nStart med i_ for kommandoer til inputtilstand (f.eks.: i_CTRL-X)\nStart med c_ for kommandoer til redigering af kommandolinje (f.eks.: c_<Del>)\nStart med ' for et tilvalgsnavn (f.eks.: 'shiftwidth')"
+
+" File menu
+menut &File Fil
+
+menut &Open\.\.\.<Tab>:e Åbn\.\.\.<Tab>:e
+menut Sp&lit-Open\.\.\.<Tab>:sp Opdel-åbn\.\.\.<Tab>:sp
+menut Open\ Tab\.\.\.<Tab>:tabnew Åbn\ faneblad\.\.\.<Tab>:tabnew
+menut &New<Tab>:enew Ny<Tab>:enew
+menut &Close<Tab>:close Luk<Tab>:close
+" -SEP1-
+menut &Save<Tab>:w Gem<Tab>:w
+menut Save\ &As\.\.\.<Tab>:sav Gem\ som\.\.\.<Tab>:sav
+" -SEP2-
+menut Split\ &Diff\ with\.\.\. Opdel\ diff\ med\.\.\.
+menut Split\ Patched\ &By\.\.\. Opdel\ patched\ af\.\.\.
+" -SEP3-
+menut &Print Udskriv
+" -SEP4-
+menut Sa&ve-Exit<Tab>:wqa Gem-afslut
+menut E&xit<Tab>:qa Afslut
+
+" Edit menu
+menut &Edit Rediger
+
+menut &Undo<Tab>u Fortryd<Tab>u
+menut &Redo<Tab>^R Omgør<Tab>^R
+menut Rep&eat<Tab>\. Gentag<Tab>\.
+" -SEP1-
+menut Cu&t<Tab>"+x Klip<Tab>"+x
+menut &Copy<Tab>"+y Kopiér<Tab>"+y
+menut &Paste<Tab>"+gP Indsæt<Tab>"+gP
+menut Put\ &Before<Tab>[p Indsæt\ inden\ (put)<Tab>[p
+menut Put\ &After<Tab>]p Indsæt\ efter\ (put)<Tab>]p
+menut &Delete<Tab>x Slet<Tab>x
+menut &Select\ all<Tab>ggVG Markér\ alt<Tab>ggVG
+" -SEP2-
+menut &Find\.\.\. Find\.\.\.
+menut &Find\.\.\.<Tab>/ Find\.\.\.<Tab>/
+menut Find\ and\ Rep&lace\.\.\. Find\ og\ erstat\.\.\.
+menut Find\ and\ Rep&lace\.\.\.<Tab>:%s Find\ og\ erstat\.\.\.<Tab>:%s
+menut Find\ and\ Rep&lace\.\.\.<Tab>:s Find\ og\ erstat\.\.\.<Tab>:s
+" -SEP3-
+menut Settings\ &Window Indstillinger-vindue
+menut Startup\ &Settings Opstartsindstillinger
+menut &Global\ Settings Globale\ indstillinger
+menut Question Spørgsmål
+
+" Edit
+
+menut Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Fremhævning\ af\ mønster\ til/fra<Tab>:set\ hls!
+menut Toggle\ &Ignoring\ Case<Tab>:set\ ic! Ignorerer\ forskel\ på\ store\ og\ små\ bogstaver\ til/fra<Tab>:set\ ic!
+menut Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Viser\ matchende\ par\ til/fra<Tab>:set\ sm!
+
+menut &Context\ lines Kontekstlinjer
+
+menut &Virtual\ Edit Virtuel\ redigering
+menut Never Aldrig
+menut Block\ Selection Blokmarkering
+menut Insert\ mode Indsæt-tilstand
+menut Block\ and\ Insert Blok\ og\ indsæt
+menut Always Altid
+
+menut Toggle\ Insert\ &Mode<Tab>:set\ im! Indsæt-tilstand\ til/fra<Tab>:set\ im!
+menut Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! Vi-kompatibel\ til/fra<Tab>:set\ cp!
+menut Search\ &Path\.\.\. Søgesti\.\.\.
+menut Ta&g\ Files\.\.\. Tag-filer\.\.\.
+" -SEP1-
+menut Toggle\ &Toolbar Værktøjslinje\ til/fra
+menut Toggle\ &Bottom\ Scrollbar Nederste\ rullebjælke\ til/fra
+menut Toggle\ &Left\ Scrollbar Venstre\ rullebjælke\ til/fra
+menut Toggle\ &Right\ Scrollbar Højre\ rullebjælke\ til/fra
+
+let g:menutrans_path_dialog = "Indtast søgesti til filer.\nSeparer mappenavne med et komma."
+let g:menutrans_tags_dialog = "Indtast navne på tag-filer.\nSeparer navnene med et komma."
+
+" Edit/File Settings
+menut F&ile\ Settings Filindstillinger
+
+" Boolean options
+menut Toggle\ Line\ &Numbering<Tab>:set\ nu! Linjenummerering\ til/fra<Tab>:set\ nu!
+menut Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! Relativ\ linjenummerering\ til/fra<Tab>:set\ rnu!
+menut Toggle\ &List\ Mode<Tab>:set\ list! Listetilstand\ til/fra<Tab>:set\ list!
+menut Toggle\ Line\ &Wrapping<Tab>:set\ wrap! Linjeombrydning\ til/fra<Tab>:set\ wrap!
+menut Toggle\ W&rapping\ at\ word<Tab>:set\ lbr! Ombrydning\ ved\ ord\ til/fra<Tab>:set\ lbr!
+menut Toggle\ Tab\ &expanding<Tab>:set\ et! Udvidelse\ af\ tabulator\ til/fra<Tab>:set\ et!
+menut Toggle\ &Auto\ Indenting<Tab>:set\ ai! Automatisk\ indrykning\ til/fra<Tab>:set\ ai!
+menut Toggle\ &C-Style\ Indenting<Tab>:set\ cin! Indrykning\ i\ &C-stil\ til/fra<Tab>:set\ cin!
+" -SEP2-
+menut &Shiftwidth Shiftwidth
+" menut &Shiftwidth.2<Tab>:set\ sw=2\ sw?<CR> Shiftwidth.2<Tab>:set\ sw=2\ sw?<CR>
+" menut &Shiftwidth.3<Tab>:set\ sw=3\ sw?<CR> Shiftwidth.3<Tab>:set\ sw=3\ sw?<CR>
+" menut &Shiftwidth.4<Tab>:set\ sw=4\ sw?<CR> Shiftwidth.4<Tab>:set\ sw=4\ sw?<CR>
+" menut &Shiftwidth.5<Tab>:set\ sw=5\ sw?<CR> Shiftwidth.5<Tab>:set\ sw=5\ sw?<CR>
+" menut &Shiftwidth.6<Tab>:set\ sw=6\ sw?<CR> Shiftwidth.6<Tab>:set\ sw=6\ sw?<CR>
+" menut &Shiftwidth.8<Tab>:set\ sw=8\ sw?<CR> Shiftwidth.8<Tab>:set\ sw=8\ sw?<CR>
+menut Soft\ &Tabstop Blødt\ tabulatorstop
+" menut Soft\ &Tabstop.2<Tab>:set\ sts=2\ sts? Blødt\ Tabstop.2<Tab>:set\ sts=2\ sts?
+" menut Soft\ &Tabstop.3<Tab>:set\ sts=3\ sts? Blødt\ Tabstop.3<Tab>:set\ sts=3\ sts?
+" menut Soft\ &Tabstop.4<Tab>:set\ sts=4\ sts? Blødt\ Tabstop.4<Tab>:set\ sts=4\ sts?
+" menut Soft\ &Tabstop.5<Tab>:set\ sts=5\ sts? Blødt\ Tabstop.5<Tab>:set\ sts=5\ sts?
+" menut Soft\ &Tabstop.6<Tab>:set\ sts=6\ sts? Blødt\ Tabstop.6<Tab>:set\ sts=6\ sts?
+" menut Soft\ &Tabstop.8<Tab>:set\ sts=8\ sts? Blødt\ Tabstop.8<Tab>:set\ sts=8\ sts?
+menut Te&xt\ Width\.\.\. Tekstbredde\.\.\.
+menut &File\ Format\.\.\. Filformat\.\.\.
+
+let g:menutrans_textwidth_dialog = "Indtast ny tekstbredde (0 for at deaktivere formatering): "
+let g:menutrans_fileformat_dialog = "Vælg format til skrivning af filen"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Annuller"
+
+menut Show\ C&olor\ Schemes\ in\ Menu Vis\ farveskemaer\ i\ menu
+menut C&olor\ Scheme Farveskema
+
+" menut blue blå
+" menut darkblue mørkeblå
+" menut desert ørken
+" menut elflord elverherre
+" menut evening aften
+" menut industry industri
+" menut morning morgen
+" menut peachpuff fersken
+" menut shine skær
+" menut slate skiffer
+" menut default standard
+" menut torte tærte
+" menut zellner ???
+" menut delek ???
+" menut koehler ???
+" menut murphy ???
+" menut pablo ???
+" menut ron ron
+
+menut Show\ &Keymaps\ in\ Menu Vis\ tastaturlayouts\ i\ menu
+menut &Keymap Tastaturlayout
+
+menut None Intet
+" menut accents Diakritiske\ tegn
+" menut arabic arabisk
+" menut armenian-eastern armensk\ (østlig)
+" menut armenian-western armensk\ (vestlig)
+" menut belarusian-jcuken hviderussisk\ [belarusian-jcuken]
+" menut czech tjekkisk
+" menut greek græsk
+" menut hebrew hebraisk
+" menut hebrewp hebraisk\ [hebrewp]
+" menut magyar ungarsk
+" menut persian persisk
+" menut serbian serbisk
+" menut serbian-latin serbisk\ (latinsk)
+" menut slovak slovakisk
+
+menut Select\ Fo&nt\.\.\. Vælg\ skrifttype\.\.\.
+
+" Programming menu
+menut &Tools Værktøjer
+
+menut &Jump\ to\ this\ tag<Tab>g^] Hop\ til\ tagget<Tab>g^]
+menut Jump\ &back<Tab>^T Hop\ tilbage<Tab>^T
+menut Build\ &Tags\ File Build\ tags-fil
+" -SEP1-
+" Tools.Spelling Menu
+menut &Spelling Stavning
+menut &Spell\ Check\ On Stavekontrol\ til
+menut Spell\ Check\ &Off Stavekontrol\ fra
+menut To\ &Next\ error<Tab>]s Til\ næste\ fejl<Tab>]s
+menut To\ &Previous\ error<Tab>[s Til\ forrige\ fejl<Tab>[s
+menut Suggest\ &Corrections<Tab>z= Foreslå\ rettelse<Tab>z=
+menut &Repeat\ correction<Tab>:spellrepall Gentag\ rettelse<Tab>:spellrepall
+menut Set\ language\ to\ "en" Sæt\ sprog\ til\ "en"
+menut Set\ language\ to\ "en_au" Sæt\ sprog\ til\ "en_au"
+menut Set\ language\ to\ "en_ca" Sæt\ sprog\ til\ "en_ca"
+menut Set\ language\ to\ "en_gb" Sæt\ sprog\ til\ "en_gb"
+menut Set\ language\ to\ "en_nz" Sæt\ sprog\ til\ "en_nz"
+menut Set\ language\ to\ "en_us" Sæt\ sprog\ til\ "en_us"
+menut &Find\ More\ Languages Find\ flere\ sprog
+
+" Tools.Fold Menu
+menut &Folding Foldning
+" open close folds
+menut &Enable/Disable\ folds<Tab>zi Aktivér/deaktivér\ sammenfoldninger<Tab>zi
+menut &View\ Cursor\ Line<Tab>zv Vis\ markørlinje<Tab>zv
+menut Vie&w\ Cursor\ Line\ only<Tab>zMzx Vis\ kun\ markørlinje<Tab>zMzx
+menut C&lose\ more\ folds<Tab>zm Luk\ flere\ sammenfoldninger<Tab>zm
+menut &Close\ all\ folds<Tab>zM Luk\ alle\ sammenfoldninger<Tab>zM
+menut O&pen\ more\ folds<Tab>zr Åbn\ flere\ sammenfoldninger<Tab>zr
+menut &Open\ all\ folds<Tab>zR Åbn\ alle\ sammenfoldninger<Tab>zR
+" fold method
+" -SEP1-
+menut Fold\ Met&hod Sammenfoldningsmetode
+menut M&anual Manuelt
+menut I&ndent Indryk
+menut E&xpression Udtryk
+menut S&yntax Syntaks
+menut &Diff Diff
+menut Ma&rker Markør
+" create and delete folds
+menut Create\ &Fold<Tab>zf Opret\ sammenfoldning<Tab>zf
+menut &Delete\ Fold<Tab>zd Slet\ sammenfoldning<Tab>zd
+menut Delete\ &All\ Folds<Tab>zD Slet\ alle\ sammenfoldninger<Tab>zD
+" moving around in folds
+" -SEP2-
+menut Fold\ col&umn\ width Kolonnebredde\ for\ sammenfoldning
+
+menut &Diff Diff
+"
+menut &Update Opdater
+menut &Get\ Block Hent\ blok\ (get)
+menut &Put\ Block Indsæt\ blok\ (put)
+
+" -SEP2-
+menut &Make<Tab>:make &Make<Tab>:make
+
+menut &List\ Errors<Tab>:cl Oplist\ fejl<Tab>:cl
+menut L&ist\ Messages<Tab>:cl! Oplist\ meddelelser<Tab>:cl!
+menut &Next\ Error<Tab>:cn Næste\ fejl<Tab>:cn
+menut &Previous\ Error<Tab>:cp Forrige\ fejl<Tab>:cp
+menut &Older\ List<Tab>:cold Ældre\ liste<Tab>:cold
+menut N&ewer\ List<Tab>:cnew Nyere\ liste<Tab>:cnew
+
+menut Error\ &Window Fejl-vindue
+
+menut &Update<Tab>:cwin Opdater<Tab>:cwin
+menut &Open<Tab>:copen Åbn<Tab>:copen
+menut &Close<Tab>:cclose Luk<Tab>:cclose
+
+" -SEP3-
+menut &Convert\ to\ HEX<Tab>:%!xxd Konvertér\ til\ HEX<Tab>:%!xxd
+menut Conve&rt\ back<Tab>:%!xxd\ -r Konvertér\ tilbage<Tab>:%!xxd\ -r
+
+menut Se&T\ Compiler Sæt\ kompiler
+
+" Buffers menu
+menut &Buffers Buffere
+
+menut &Refresh\ menu Genopfrisk\ menu
+menut &Delete Slet
+menut &Alternate Skift
+menut &Next Næste
+menut &Previous Forrige
+menut [No\ File] [Ingen\ fil]
+
+" Syntax menu
+menut &Syntax Syntaks
+
+menut &Show\ File\ Types\ in\ menu Vis\ filtyper\ i\ menu
+menut Set\ '&syntax'\ only Sæt\ kun\ 'syntax'
+menut Set\ '&filetype'\ too Sæt\ også\ 'filetype'
+menut &Off Fra
+menut &Manual Manuelt
+menut A&utomatic Automatisk
+menut On/Off\ for\ &This\ File Til/fra\ for\ denne\ fil
+menut Co&lor\ test Farvetest
+menut &Highlight\ test Fremhævningstest
+menut &Convert\ to\ HTML Konvertér\ til\ HTML
+
+let g:menutrans_no_file = "[Ingen fil]"
+
+" Window menu
+menut &Window Vindue
+
+menut &New<Tab>^Wn Nyt<Tab>^Wn
+menut S&plit<Tab>^Ws Opdel<Tab>^Ws
+menut Sp&lit\ To\ #<Tab>^W^^ Opdel\ til\ #<Tab>^W^^
+menut Split\ &Vertically<Tab>^Wv Opdel\ lodret<Tab>^Wv
+menut Split\ File\ E&xplorer Opdel\ filbrowser
+" -SEP1-
+menut &Close<Tab>^Wc Luk<Tab>^Wc
+menut Close\ &Other(s)<Tab>^Wo Luk\ andre<Tab>^Wo
+" -SEP2-
+menut Move\ &To Flyt\ til
+
+menut &Top<Tab>^WK Øverst<Tab>^WK
+menut &Bottom<Tab>^WJ Nederst<Tab>^WJ
+menut &Left\ side<Tab>^WH Venstre\ side<Tab>^WH
+menut &Right\ side<Tab>^WL Højre\ side<Tab>^WL
+menut Rotate\ &Up<Tab>^WR Roter\ op<Tab>^WR
+menut Rotate\ &Down<Tab>^Wr Roter\ ned<Tab>^Wr
+" -SEP3-
+menut &Equal\ Size<Tab>^W= Samme\ størrelse<Tab>^W=
+menut &Max\ Height<Tab>^W_ Maks\.\ højde<Tab>^W_
+menut M&in\ Height<Tab>^W1_ Min\.\ højde<Tab>^W1_
+menut Max\ &Width<Tab>^W\| Maks\.\ bredde<Tab>^W\|
+menut Min\ Widt&h<Tab>^W1\| Min\.\ bredde<Tab>^W1\|
+
+" The popup menu
+menut &Undo Fortryd
+" -SEP1-
+menut Cu&t Klip
+menut &Copy Kopiér
+menut &Paste Indsæt
+menut &Delete Slet
+" -SEP2-
+menut Select\ Blockwise Markér\ blokvis
+menut Select\ &Word Markér\ ord
+
+menut Select\ &Sentence Markér\ sætning
+menut Select\ Pa&ragraph Markér\ afsnit
+
+menut Select\ &Line Markér\ linje
+menut Select\ &Block Markér\ blok
+menut Select\ &All Markér\ alt
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Åbn fil
+ tmenu ToolBar.Save Gem nuværende fil
+ tmenu ToolBar.SaveAll Gem alle filer
+ tmenu ToolBar.Print Udskriv
+ tmenu ToolBar.Undo Fortryd
+ tmenu ToolBar.Redo Omgør
+ tmenu ToolBar.Cut Klip til udklipsholder
+ tmenu ToolBar.Copy Kopiér til udklipsholder
+ tmenu ToolBar.Paste Indsæt fra udklipsholder
+ if !has("gui_athena")
+ tmenu ToolBar.Replace Find/erstat...
+ tmenu ToolBar.FindNext Find næste
+ tmenu ToolBar.FindPrev Find forrige
+ endif
+ tmenu ToolBar.LoadSesn Vælg en session som skal indlæses
+ tmenu ToolBar.SaveSesn Gem nuværende session
+ tmenu ToolBar.RunScript Vælg et Vim-script som skal køres
+ tmenu ToolBar.Make Make nuværende projekt (:make)
+ tmenu ToolBar.RunCtags Build tags i nuværende mappetræ (!ctags -R .)
+ tmenu ToolBar.TagJump Hop til tag under markør
+ tmenu ToolBar.Help Vim hjælp
+ tmenu ToolBar.FindHelp Søg i Vim hjælp
+ endfun
+endif
+
+let g:menutrans_set_lang_to = "Sæt sprog til"
+
+" stavegenvejsmenu pop op ting
+let g:menutrans_spell_change_ARG_to = 'Ændr\ "%s"\ til'
+let g:menutrans_spell_add_ARG_to_word_list = 'Tilføj\ "%s"\ til\ ordliste'
+let g:menutrans_spell_ignore_ARG = 'Ignorer "%s"'
+
+
+
+" Forsøg på at oversætte netrw-menuen
+menut Help<tab><F1> Hjælp<tab><F1>
+" -Sep1-
+menut Go\ Up\ Directory<tab>- Gå\ mappe\ op<tab>-
+menut Apply\ Special\ Viewer<tab>x Anvend\ speciel\ fremviser<tab>x
+
+menut Bookmarks\ and\ History Bogmærker\ og\ historik<tab>:echo "(disabled)"
+menut Bookmark\ Current\ Directory<tab>mb Sæt\ bogmærke\ for\ nuværende\ mappe<tab>mb
+menut Goto\ Prev\ Dir\ (History)<tab>u Gå\ til\ forrige\ mappe\ (historik)<tab>u
+menut Goto\ Next\ Dir\ (History)<tab>U Gå\ til\ næste\ mappe\ (historik)<tab>U
+menut List<tab>qb Oplist<tab>qb
+
+menut Browsing\ Control Gennemgangskontol
+menut Horizontal\ Split<tab>o Vandret\ opdeling<tab>o
+menut Vertical\ Split<tab>v Lodret\ opdeling<tab>v
+menut New\ Tab<tab>t Nyt\ faneblad<tab>t
+menut Preview<tab>p Forhåndsvis<tab>p
+menut Edit\ File\ Hiding\ List<tab><ctrl-h> Rediger\ liste\ til\ filskjulning
+menut Edit\ Sorting\ Sequence<tab>S Rediger\ sorteringssekvens<tab>S
+menut Quick\ Hide/Unhide\ Dot\ Files<tab>gh Hurtig\ skjul/vis\ punktum-filer<tab>gh
+menut Refresh\ Listing<tab><ctrl-l> Genopfrisk\ oplistning<tab>\<c-l>\ ikke\ sikker\ det\ med\ er\ korrekt
+menut Settings/Options<tab>:NetrwSettings Indstillinger/valgmuligheder<tab>
+
+menut Delete\ File/Directory<tab>D Slet\ fil/mappe<tab>D
+
+menut Edit\ File/Dir Rediger\ fil/mappe
+menut Create\ New\ File<tab>% Opret\ ny\ fil<tab>%
+menut In\ Current\ Window<tab><cr> I\ nuværende\ vindue<tab>
+menut Preview\ File/Directory<tab>p Forhåndsvis\ fil/mappe<tab>p
+menut In\ Previous\ Window<tab>P I\ forrige\ vindue<tab>P
+menut In\ New\ Window<tab>o I\ nyt\ vindue<tab>o
+menut In\ New\ Tab<tab>t I\ nyt\ faneblad<tab>t
+menut In\ New\ Vertical\ Window<tab>v I\ nyt\ lodret\ vindue<tab>v
+
+menut Explore Gennemse
+menut Directory\ Name Mappenavn<tab>:Explore
+menut Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ test29<tab>:Explore\ */
+menut Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ test30<tab>:Explore\ **/
+menut Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// test31<tab>:Explore\ *//
+menut Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// test32<tab>:Explore\ **//
+menut Next\ Match<tab>:Nexplore Næste\ match<tab>:Nexplore<cr>
+menut Prev\ Match<tab>:Pexplore Forrige\ match<tab>:Pexplore<cr>
+
+menut Make\ Subdirectory<tab>d Opret\ undermappe<tab>d
+
+menut Marked\ Files Mærkede\ filer
+menut Mark\ File<tab>mf Mærk\ fil<tab>mf
+menut Mark\ Files\ by\ Regexp<tab>mr Mærk\ filer\ efter\ regulært\ udtrk<tab>mr
+menut Hide-Show-List\ Control<tab>a test38<tab>a
+menut Copy\ To\ Target<tab>mc Kopiér\ til\ mål<tab>mc
+menut Delete<tab>D Slet<tab>D
+menut Diff<tab>md Diff<tab>md
+menut Edit<tab>me Rediger<tab>me
+menut Exe\ Cmd<tab>mx test43<tab>mx
+menut Move\ To\ Target<tab>mm Flyt\ til\ mål<tab>mm
+menut Obtain<tab>O Indhent<tab>O
+menut Print<tab>mp Udskriv<tab>mp
+menut Replace<tab>R Erstat<tab>R
+menut Set\ Target<tab>mt Sæt\ mål<tab>mt
+menut Tag<tab>mT test49<tab>mT
+menut Zip/Unzip/Compress/Uncompress<tab>mz Zip/unzip/komprimér/udpak<tab>mz
+
+menut Obtain\ File<tab>O Indhent\ fil<tab>O
+
+menut Style Stile
+menut Listing Oplisting
+menut thin<tab>i tynd
+menut long<tab>i lang
+menut wide<tab>i bred
+menut tree<tab>i træ
+menut Normal-Hide-Show Normal-skjul-vis
+menut Show\ All<tab>a Vis\ alle<tab>
+menut Normal<tab>a Normal<tab>
+menut Hidden\ Only<tab>a Kun\ skulte<tab>
+menut Reverse\ Sorting\ Order<tab> Omvendt\ sorteringsrækkefølge
+menut Sorting\ Method Sorteringsmetode
+menut Name<tab>s Navn
+menut Time<tab>s Tidspunkt
+menut Size<tab>s Størrelse
+menut Exten<tab>s Endelse
+menut Rename\ File/Directory<tab>R Omdøb\ fil/mappe<tab>R
+menut Set\ Current\ Directory<tab>c Sæt\ nuværende\ mappe<tab>c
+
+menut History Historik
+
+menut Targets Mål
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: set sw=2 :
diff --git a/runtime/lang/menu_de.latin1.vim b/runtime/lang/menu_de.latin1.vim
new file mode 100644
index 0000000..07fee4b
--- /dev/null
+++ b/runtime/lang/menu_de.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: German for iso-8859-1 encoding
+
+source <sfile>:p:h/menu_de_de.latin1.vim
diff --git a/runtime/lang/menu_de.utf-8.vim b/runtime/lang/menu_de.utf-8.vim
new file mode 100644
index 0000000..a64bdd0
--- /dev/null
+++ b/runtime/lang/menu_de.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: German for UTF-8 encoding
+
+source <sfile>:p:h/menu_de_de.latin1.vim
diff --git a/runtime/lang/menu_de_de.latin1.vim b/runtime/lang/menu_de_de.latin1.vim
new file mode 100644
index 0000000..17c748f
--- /dev/null
+++ b/runtime/lang/menu_de_de.latin1.vim
@@ -0,0 +1,312 @@
+" Menu Translations: German / Deutsch
+" Maintainer: Jn Arnar Briem <jonbriem@gmail.com>
+" Originally By: Georg Dahn <gorgyd@yahoo.co.uk>
+" Marcin Dalecki <dalecki@cs.net.pl>
+" Johannes Zellner <johannes@zellner.org>
+" Last Change: Mon, 1 April 2019
+" vim:set foldmethod=marker tabstop=8:
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" The translations below are in latin1, but they work for cp1252 and
+" iso-8859-15 without conversion as well.
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+" {{{ FILE / DATEI
+menutrans &File &Datei
+menutrans &Open\.\.\.<Tab>:e &ffnen\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp In\ geteiltem\ &Fenster\ ffnen\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew In\ neuem\ &Tab\ ffnen\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Neue\ Datei<Tab>:enew
+menutrans &Close<Tab>:close S&chlieen<Tab>:close
+menutrans &Save<Tab>:w &Speichern<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Speichern\ &als\.\.\.<Tab>:sav
+menutrans &Print &Drucken
+menutrans Sa&ve-Exit<Tab>:wqa Speichern\ und\ Be&enden<Tab>:wqa
+menutrans E&xit<Tab>:qa &Beenden<Tab>:qa
+
+if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. D&ifferenz\ in\ geteiltem\ Fenster\ mit\.\.\.
+ menutrans Split\ Patched\ &By\.\.\. &Patch\ in\ geteiltem\ Fenster\ mit\.\.\.
+endif
+" }}} FILE / DATEI
+
+" {{{ EDIT / EDITIEREN
+menutrans &Edit &Editieren
+menutrans &Undo<Tab>u Z&urck<Tab>u
+menutrans &Redo<Tab>^R Vo&r<Tab>^R
+menutrans Rep&eat<Tab>\. &Wiederholen<Tab>\.
+menutrans Cu&t<Tab>"+x &Ausschneiden<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopieren<Tab>"+y
+menutrans &Paste<Tab>"+gP Ein&fgen<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Da&vor\ einfgen<Tab>[p
+menutrans Put\ &After<Tab>]p Da&nach\ einfgen<Tab>]p
+menutrans &Delete<Tab>x &Lschen<Tab>x
+menutrans &Select\ All<Tab>ggVG Alles\ &markieren<Tab>ggVG
+menutrans &Find\.\.\. &Suchen\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Suchen\ und\ &Ersetzen\.\.\.
+
+" [-- SETTINGS --]
+" XXX &E would conflict with 'Suchen\ und\ &Ersetzen', see above
+menutrans Settings\ &Window E&instellungen\.\.\.
+menutrans &Global\ Settings &Globale\ Einstellungen
+menutrans Startup\ &Settings &Starteinstellungen
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Hervorhebungen\ ein-\ und\ ausschalten<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! Groschreibung\ &ignorieren\ oder\ benutzen<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Anzeige\ des\ passenden\ &Symbols\ ein-\ und\ ausschalten<Tab>:set\ sm!
+
+menutrans &Context\ lines &Zusammenhang
+
+menutrans &Virtual\ Edit &Virtueller\ Editier-Modus
+menutrans Never Nie
+menutrans Block\ Selection Block-Auswahl
+menutrans Insert\ mode Einfge-Modus
+menutrans Block\ and\ Insert Block-Auswahl\ und\ Einfge-Modus
+menutrans Always Immer
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Einfge-&Modus\ ein-\ und\ ausschalten<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Vi-Kompatibilitt\ ein-\ und\ ausschalten<Tab>:set\ cp!
+
+menutrans Search\ &Path\.\.\. Such-&Pfad\.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&g-Dateien\.\.\.
+
+menutrans Toggle\ &Toolbar Werkzeugleiste\ ein-\ und\ ausschalten
+menutrans Toggle\ &Bottom\ Scrollbar Unteren\ Rollbalken\ ein-\ und\ ausschalten
+menutrans Toggle\ &Left\ Scrollbar Linken\ Rollbalken\ ein-\ und\ ausschalten
+menutrans Toggle\ &Right\ Scrollbar Rechten\ Rollbalken\ ein-\ und\ ausschalten
+
+" Edit/File Settings
+menutrans F&ile\ Settings &Datei-Einstellungen
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Anzeige\ der\ Zeilen&nummer\ ein-\ und\ ausschalten<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! Anzeige\ der\ relati&ven\ Zeilennummer\ ein-\ und\ ausschalten<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! &List-Modus\ ein-\ und\ ausschalten<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! &Zeilenumbruch\ ein-\ und\ ausschalten<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ word<Tab>:set\ lbr! Umbruch\ an\ &Wortgrenzen\ ein-\ und\ ausschalten<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et! &Erweiterung\ von\ Tabulatoren\ ein-\ und\ ausschalten<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! &Automatische\ Einrckung\ ein-\ und\ ausschalten<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! &C-Einrckung\ ein-\ und\ ausschalten<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth &Schiebeweite
+menutrans Soft\ &Tabstop &Tabulator
+menutrans Te&xt\ Width\.\.\. Te&xtbreite\.\.\.
+menutrans &File\ Format\.\.\. &Dateiformat\.\.\.
+menutrans C&olor\ Scheme F&arbschema\.\.\.
+menutrans &Keymap &Tastaturbelegung
+" }}} EDIT / EDITIEREN
+
+" {{{ TOOLS / WERKZEUGE
+if has("spell")
+ menutrans &Spelling &Rechtschreibung
+ menutrans &Spell\ Check\ On &Rechtschreibprfung\ an
+ menutrans Spell\ Check\ &Off Rechtschreibprfung\ &aus
+ menutrans To\ &Next\ error<Tab>]s Zum\ &nchsten\ Fehler<Tab>]s
+ menutrans To\ &Previous\ error<Tab>[s Zum\ &vorherigen\ Fehler<Tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= &Korrekturvorschlge<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall &Wiederhole\ Korrektur<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" Verwende\ Wrterbuch\ "en"
+ menutrans Set\ language\ to\ "en_au" Verwende\ Wrterbuch\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" Verwende\ Wrterbuch\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" Verwende\ Wrterbuch\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" Verwende\ Wrterbuch\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" Verwende\ Wrterbuch\ "en_us"
+ menutrans Set\ language\ to\ "de" Verwende\ Wrterbuch\ "de"
+ menutrans &Find\ More\ Languages &Suche\ nach\ Wrterbchern
+endif
+if has("folding")
+ menutrans &Folding Fa&ltung
+ " open close folds
+ menutrans &Enable/Disable\ folds<Tab>zi &Ein-\ und\ ausschalten<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Momentane\ &Position\ anzeigen<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx &Ausschlielich\ momentane\ Position\ anzeigen<Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm Faltungen\ &schlieen<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Alle\ Faltungen\ schlieen<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Faltungen\ &ffnen<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR Alle\ Faltungen\ ffnen<Tab>zR
+ " fold method
+ menutrans Fold\ Met&hod Faltungs-&Methode
+ menutrans M&anual &Manuell
+ menutrans I&ndent &Einrckungen
+ menutrans E&xpression &Ausdruck
+ menutrans S&yntax &Syntax
+ menutrans &Diff &Differenz
+ menutrans Ma&rker Ma&rkierungen
+ " create and delete folds
+ " TODO accelerators
+ menutrans Create\ &Fold<Tab>zf Faltung\ erzeugen<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd Faltung\ lschen<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Alle\ Faltungen\ lschen<Tab>zD
+ " moving around in folds
+ menutrans Fold\ col&umn\ width &Breite\ der\ Faltungsspalte
+endif " has folding
+
+if has("diff")
+ menutrans &Diff &Differenz
+ menutrans &Update &Aktualisieren
+ menutrans &Get\ Block Block\ &einfgen
+ menutrans &Put\ Block Block\ &bertragen
+endif
+
+menutrans &Tools &Werkzeuge
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Springe\ zum\ Tag<Tab>g^]
+menutrans Jump\ &back<Tab>^T Springe\ &zurck<Tab>^T
+menutrans Build\ &Tags\ File Erstelle\ &Tag-Datei
+menutrans &Make<Tab>:make &Erstellen<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Fehler\ anzeigen<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &Hinweise\ anzeigen<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Zum\ &nchsten\ Fehler<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Zum\ &vorherigen\ Fehler<Tab>:cp
+menutrans &Older\ List<Tab>:cold &ltere\ Liste<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &Neuere\ Liste<Tab>:cnew
+
+menutrans Error\ &Window Feh&ler-Fenster
+menutrans Se&t\ Compiler &Compiler
+menutrans Se&T\ Compiler &Compiler
+menutrans &Update<Tab>:cwin &Aktualisieren<Tab>:cwin
+menutrans &Open<Tab>:copen &ffnen<Tab>:copen
+menutrans &Close<Tab>:cclose &Schlieen<Tab>:cclose
+
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Nach\ HE&X\ konvertieren<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Zurck\ konvertieren<Tab>:%!xxd\ -r
+" }}} TOOLS / WERKZEUGE
+
+" {{{ SYNTAX / SYNTAX
+menutrans &Syntax &Syntax
+menutrans &Show\ filetypes\ in\ menu Dateitypen\ an&zeigen
+menutrans Set\ '&syntax'\ only Nur\ '&syntax'\ setzen
+menutrans Set\ '&filetype'\ too Auch\ '&filetype'\ setzen
+menutrans &Off &Aus
+menutrans &Manual &Manuell
+menutrans A&utomatic A&utomatisch
+menutrans on/off\ for\ &This\ file An/Aus\ (diese\ &Datei)
+menutrans Co&lor\ test Test\ der\ Farben
+menutrans &Highlight\ test Test\ der\ Un&terstreichungen
+menutrans &Convert\ to\ HTML Konvertieren\ nach\ &HTML
+" }}} SYNTAX / SYNTAX
+
+" {{{ BUFFERS / PUFFER
+menutrans &Buffers &Puffer
+menutrans &Refresh\ menu &Aktualisieren
+menutrans Delete Lschen
+menutrans &Alternate &Wechseln
+menutrans &Next &Nchster
+menutrans &Previous &Vorheriger
+" }}} BUFFERS / PUFFER
+
+" {{{ WINDOW / ANSICHT
+menutrans &Window &Ansicht
+menutrans &New<Tab>^Wn &Neu<Tab>^Wn
+menutrans S&plit<Tab>^Ws Aufs&palten<Tab>^Ws
+menutrans Split\ &Vertically<Tab>^Wv &Vertikal\ aufspalten<Tab>^Wv
+menutrans Split\ File\ E&xplorer Ver&zeichnis
+menutrans Sp&lit\ To\ #<Tab>^W^^ Aufspa&lten\ in\ #<Tab>^W^^
+menutrans &Close<Tab>^Wc &Schlieen<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo &Andere\ schlieen<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww N&chstes<Tab>^Ww
+menutrans P&revious<Tab>^WW Vor&heriges<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Gleiche\ Hhen<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ &Maximale\ Hhe<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ M&inimale\ Hhe<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Maximale\ &Breite<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimale\ Brei&te<Tab>^W1\|
+menutrans Move\ &To V&erschiebe\ nach
+menutrans &Top<Tab>^WK &Oben<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Unten<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Links<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Rechts<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Rotiere\ nach\ &oben<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotiere\ nach\ &unten<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. Auswahl\ der\ Schriftart\.\.\.
+" }}} WINDOW / ANSICHT
+
+" {{{ HELP / HILFE
+menutrans &Help &Hilfe
+menutrans &Overview<Tab><F1> &berblick<Tab><F1>
+menutrans &User\ Manual &Handbuch
+menutrans &How-to\ links How-to\ &Index
+menutrans &GUI &Graphische\ Oberflche
+menutrans &Credits &Autoren
+menutrans Co&pying &Urheberrecht
+menutrans &Sponsor/Register Sponsern/&Registrieren
+menutrans O&rphans &Waisen
+menutrans &Find\.\.\. &Suchen\.\.\. " conflicts with Edit.Find
+menutrans &Version &Version
+menutrans &About &Titelseite
+" }}} HELP / HILFE
+
+" {{{ POPUP
+menutrans &Undo &Zurck
+menutrans Cu&t Aus&schneiden
+menutrans &Copy &Kopieren
+menutrans &Paste &Einfgen
+menutrans &Delete &Lschen
+menutrans Select\ Blockwise Auswahl\ blockartig
+menutrans Select\ &Word Auswahl\ des\ &Wortes
+menutrans Select\ &Sentence Auswahl\ des\ Sa&tzes
+menutrans Select\ Pa&ragraph Auswahl\ des\ Absatzes
+menutrans Select\ &Line Auswahl\ der\ &Zeile
+menutrans Select\ &Block Auswahl\ des\ &Blocks
+menutrans Select\ &All &Alles\ Auswhlen
+" }}} POPUP
+
+" {{{ TOOLBAR
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Datei ffnen
+ tmenu ToolBar.Save Datei speichern
+ tmenu ToolBar.SaveAll Alle Dateien speichern
+ tmenu ToolBar.Print Drucken
+ tmenu ToolBar.Undo Zurck
+ tmenu ToolBar.Redo Wiederholen
+ tmenu ToolBar.Cut Ausschneiden
+ tmenu ToolBar.Copy Kopieren
+ tmenu ToolBar.Paste Einfgen
+ tmenu ToolBar.Find Suchen...
+ tmenu ToolBar.FindNext Suche nchsten
+ tmenu ToolBar.FindPrev Suche vorherigen
+ tmenu ToolBar.Replace Suchen und Ersetzen...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Neue Ansicht
+ tmenu ToolBar.WinSplit Ansicht aufspalten
+ tmenu ToolBar.WinMax Ansicht maximale Hhen
+ tmenu ToolBar.WinMin Ansicht minimale Hhen
+ tmenu ToolBar.WinClose Ansicht schlieen
+ endif
+ tmenu ToolBar.LoadSesn Sitzung laden
+ tmenu ToolBar.SaveSesn Sitzung speichern
+ tmenu ToolBar.RunScript Vim-Skript ausfhren
+ tmenu ToolBar.Make Erstellen
+ tmenu ToolBar.Shell Shell starten
+ tmenu ToolBar.RunCtags Erstelle Tag-Datei
+ tmenu ToolBar.TagJump Springe zum Tag
+ tmenu ToolBar.Help Hilfe!
+ tmenu ToolBar.FindHelp Hilfe durchsuchen...
+ endfun
+endif
+" }}} TOOLBAR
+
+" {{{ DIALOG TEXTS
+let g:menutrans_no_file = "[Keine Datei]"
+let g:menutrans_help_dialog = "Geben Sie einen Befehl oder ein Wort ein, fr das Sie Hilfe bentigen:\n\nVerwenden Sie i_ fr Eingabe ('input') Befehle (z.B.: i_CTRL-X)\nVerwenden Sie c_ fr Befehls-Zeilen ('command-line') Befehle (z.B.: c_<Del>)\nVerwenden Sie ' fr Options-Namen (z.B.: 'shiftwidth')"
+let g:menutrans_path_dialog = "Geben Sie Such-Pfade fr Dateien ein.\nTrennen Sie die Verzeichnis-Namen durch Kommata."
+let g:menutrans_tags_dialog = "Geben Sie die Namen der 'tag'-Dateien ein.\nTrennen Sie die Namen durch Kommata."
+let g:menutrans_textwidth_dialog = "Geben Sie eine neue Text-Breite ein (oder 0, um die Formatierung abzuschalten)"
+let g:menutrans_fileformat_dialog = "Whlen Sie ein Datei-Format aus"
+" }}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_de_de.utf-8.vim b/runtime/lang/menu_de_de.utf-8.vim
new file mode 100644
index 0000000..a64bdd0
--- /dev/null
+++ b/runtime/lang/menu_de_de.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: German for UTF-8 encoding
+
+source <sfile>:p:h/menu_de_de.latin1.vim
diff --git a/runtime/lang/menu_en_gb.latin1.vim b/runtime/lang/menu_en_gb.latin1.vim
new file mode 100644
index 0000000..7fbcf72
--- /dev/null
+++ b/runtime/lang/menu_en_gb.latin1.vim
@@ -0,0 +1,16 @@
+" Menu Translations: UK English
+" Maintainer: Mike Williams <mrw@eandem.co.uk>
+" Last Change: 2003 Feb 10
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+
+" Note: there is no "scriptencoding" command here, all encodings should be
+" able to handle ascii characters without conversion.
+
+" Convert from American to UK spellings.
+menutrans C&olor\ Scheme C&olour\ Scheme
+menutrans Co&lor\ test Co&lour\ test
diff --git a/runtime/lang/menu_en_gb.utf-8.vim b/runtime/lang/menu_en_gb.utf-8.vim
new file mode 100644
index 0000000..b22b3bb
--- /dev/null
+++ b/runtime/lang/menu_en_gb.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: UK English
+
+source <sfile>:p:h/menu_en_gb.latin1.vim
diff --git a/runtime/lang/menu_english_united_kingdom.1252.vim b/runtime/lang/menu_english_united_kingdom.1252.vim
new file mode 100644
index 0000000..fe73f16
--- /dev/null
+++ b/runtime/lang/menu_english_united_kingdom.1252.vim
@@ -0,0 +1,3 @@
+" Menu Translations: UK English for ASCII
+
+source <sfile>:p:h/menu_en_gb.latin1.vim
diff --git a/runtime/lang/menu_english_united_kingdom.ascii.vim b/runtime/lang/menu_english_united_kingdom.ascii.vim
new file mode 100644
index 0000000..fe73f16
--- /dev/null
+++ b/runtime/lang/menu_english_united_kingdom.ascii.vim
@@ -0,0 +1,3 @@
+" Menu Translations: UK English for ASCII
+
+source <sfile>:p:h/menu_en_gb.latin1.vim
diff --git a/runtime/lang/menu_eo.utf-8.vim b/runtime/lang/menu_eo.utf-8.vim
new file mode 100644
index 0000000..cc888a5
--- /dev/null
+++ b/runtime/lang/menu_eo.utf-8.vim
@@ -0,0 +1,463 @@
+" Menu Translations: Esperanto
+" Maintainer: Dominique PELLE <dominique.pelle@free.fr>
+" Last Change: 2012 May 01
+" Original translations
+"
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+menutrans &Help &Helpo
+
+menutrans &Overview<Tab><F1> &Enhavtabelo<Tab><F1>
+menutrans &User\ Manual &Uzula\ manlibro
+menutrans &How-to\ links &Kiel\ fari
+menutrans &Find\.\.\. T&rovi\.\.\.
+" -sep1-
+menutrans &Credits &Dankoj
+menutrans Co&pying &Permisilo
+menutrans &Sponsor/Register &Subteni/Registriĝi
+menutrans O&rphans &Orfoj
+" -sep2-
+menutrans &Version &Versio
+menutrans &About Pri\ &Vim
+
+let g:menutrans_help_dialog = "Tajpu komandon aŭ serĉendan vorton en la helparo.\n\nAldonu i_ por la komandoj de la enmeta reĝimo (ekz: i_CTRL-X)\nAldonu c_ por redakto de la komanda linio (ekz: c_<Del>)\nĈirkaŭi la opciojn per apostrofoj (ekz: 'shiftwidth')"
+
+menutrans &File &Dosiero
+
+menutrans &Open\.\.\.<Tab>:e &Malfermi\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Malfermi\ &divide\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Malfermi\ &langeton\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nova<Tab>:enew
+menutrans &Close<Tab>:close &Fermi<Tab>:close
+" -SEP1-
+menutrans &Save<Tab>:w &Konservi<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Konservi\ ki&el\.\.\.<Tab>:sav
+" -SEP2-
+menutrans Split\ &Diff\ with\.\.\. Kom&pari\ divide\.\.\.
+menutrans Split\ Patched\ &By\.\.\. &Testi\ flikaĵon\.\.\.
+" -SEP3-
+menutrans &Print &Presi
+" -SEP4-
+menutrans Sa&ve-Exit<Tab>:wqa Konservi\ kaj\ eli&ri<Tab>:wqa
+menutrans E&xit<Tab>:qa &Eliri<Tab>:qa
+
+
+menutrans &Edit &Redakti
+
+menutrans &Undo<Tab>u &Malfari<Tab>u
+menutrans &Redo<Tab>^R Re&fari<Tab>^R
+menutrans Rep&eat<Tab>\. R&ipeti<Tab>\.
+" -SEP1-
+menutrans Cu&t<Tab>"+x &Tondi<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopii<Tab>"+y
+menutrans &Paste<Tab>"+gP Al&glui<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Enmeti\ &antaŭ<Tab>[p
+menutrans Put\ &After<Tab>]p Enmeti\ ma&lantaŭ<Tab>]p
+menutrans &Delete<Tab>x &Forviŝi<Tab>x
+menutrans &Select\ All<Tab>ggVG A&partigi\ ĉion<Tab>ggVG
+" -SEP2-
+menutrans &Find\.\.\. &Trovi\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Trovi\ kaj\ a&nstataŭigi\.\.\.
+menutrans &Find<Tab>/ &Trovi<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s Trovi\ kaj\ ansta&taŭigi<Tab>:%s
+menutrans Find\ and\ Rep&lace<Tab>:s Trovi\ kaj\ ansta&taŭigi<Tab>:s
+" -SEP3-
+menutrans Settings\ &Window Fenestro\ de\ a&gordoj
+menutrans Startup\ &Settings Agordoj\ de\ prav&aloroj
+menutrans &Global\ Settings Mallo&kaj\ agordoj
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Baskuli\ emfazon\ de\ ŝa&blono<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Baskuli\ kongruon\ de\ uskle&co<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Baskuli\ kongruon\ de\ kram&poj<Tab>:set\ sm!
+
+menutrans &Context\ lines Linioj\ de\ &kunteksto
+
+menutrans &Virtual\ Edit &Virtuala\ redakto
+menutrans Never &Neniam
+menutrans Block\ Selection &Bloka\ apartigo
+menutrans Insert\ mode &Enmeta\ reĝimo
+menutrans Block\ and\ Insert Blo&ko\ kaj\ enmeto
+menutrans Always Ĉia&m
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Baskuli\ &enmetan\ reĝimon<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Baskuli\ kongruon\ kun\ &Vi<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. &Serĉvojo\ de\ dosieroj\.\.\.
+menutrans Ta&g\ Files\.\.\. Dosiero\ de\ etike&doj\.\.\.
+" -SEP1-
+menutrans Toggle\ &Toolbar Baskuli\ &ilobreton
+menutrans Toggle\ &Bottom\ Scrollbar Baskuli\ su&ban\ rulumskalon
+menutrans Toggle\ &Left\ Scrollbar Baskuli\ &maldekstran\ rulumskalon
+menutrans Toggle\ &Right\ Scrollbar Baskuli\ &dekstran\ rulumskalon
+
+let g:menutrans_path_dialog = "Tajpu la vojon de serĉo de dosieroj.\nDisigu la dosierujojn per komoj."
+let g:menutrans_tags_dialog = "Tajpu la nomojn de dosieroj de etikedoj.\nDisigu la nomojn per komoj."
+
+menutrans F&ile\ Settings A&gordoj\ de\ dosiero
+
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Baskuli\ &numerojn\ de\ linioj<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Baskuli\ &listan\ reĝimon<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Baskuli\ linifal&don<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Baskuli\ &vortofaldon<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Baskuli\ ekspansio\ de\ &taboj<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Baskuli\ &aŭtokrommarĝenon<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Baskuli\ &C-krommarĝenon<Tab>:set\ cin!
+" -SEP2-
+menutrans &Shiftwidth &Larĝo\ de\ krommarĝeno
+menutrans Soft\ &Tabstop &Malm&olaj\ taboj
+menutrans Te&xt\ Width\.\.\. Larĝo\ de\ te&ksto\.\.\.
+menutrans &File\ Format\.\.\. &Formato\ de\ &dosiero\.\.\.
+
+let g:menutrans_textwidth_dialog = "Tajpu la novan larĝon de teksto\n(0 por malŝalti formatigon)."
+let g:menutrans_fileformat_dialog = "Elektu la formaton de la skribonta dosiero."
+let g:menutrans_fileformat_choices = " &Unikso \n &Dos \n &Mak \n &Rezigni "
+
+menutrans C&olor\ Scheme &Koloraro
+menutrans &Keymap Klavo&mapo
+menutrans None (nenio)
+menutrans Select\ Fo&nt\.\.\. Elekti\ &tiparon\.\.\.
+
+
+menutrans &Tools &Iloj
+
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Aliri\ al\ tiu\ etikedo<Tab>g^]
+menutrans Jump\ &back<Tab>^T &Retroiri<Tab>^T
+menutrans Build\ &Tags\ File Krei\ &etikedan\ dosieron
+
+" -SEP1-
+menutrans &Spelling &Literumilo
+menutrans &Spell\ Check\ On Ŝal&ti\ literumilon
+menutrans Spell\ Check\ &Off &Malŝalti\ literumilon
+menutrans To\ &Next\ error<Tab>]s Al\ sek&vonta\ eraro<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s Al\ an&taŭa\ eraro<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= &Sugesti\ korektojn<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall R&ipeti\ korekton<Tab>:spellrepall
+
+menutrans Set\ language\ to\ "en" Angla
+menutrans Set\ language\ to\ "en_au" Angla\ (Aŭstralio)
+menutrans Set\ language\ to\ "en_ca" Angla\ (Kanado)
+menutrans Set\ language\ to\ "en_gb" Angla\ (Britio)
+menutrans Set\ language\ to\ "en_nz" Angla\ (Novzelando)
+menutrans Set\ language\ to\ "en_us" Angla\ (Usono)
+
+menutrans &Find\ More\ Languages &Trovi\ pli\ da\ lingvoj
+
+
+menutrans &Folding &Faldo
+
+menutrans &Enable/Disable\ folds<Tab>zi &Baskuli\ faldojn<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Vidi\ linion\ de\ kursoro<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Vidi\ nur\ &kursoran\ linion<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm F&ermi\ pli\ da\ faldoj<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Fermi\ ĉiu&jn\ faldojn<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr &Malfermi\ pli\ da\ faldoj<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR Malfermi\ ĉiuj&n\ faldojn<Tab>zR
+" -SEP1-
+menutrans Fold\ Met&hod &Metodo\ de\ faldo
+
+menutrans M&anual &Permana\ metodo
+menutrans I&ndent &Krommarĝeno
+menutrans E&xpression &Esprimo
+menutrans S&yntax &Sintakso
+menutrans &Diff &Komparo
+menutrans Ma&rker Ma&rko
+
+menutrans Create\ &Fold<Tab>zf &Krei\ faldon<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Forv&iŝi\ faldon<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Forviŝi\ ĉiu&jn\ faldojn<Tab>zD
+" -SEP2-
+menutrans Fold\ col&umn\ width &Larĝo\ de\ falda\ kolumno
+
+menutrans &Diff Kom&pari
+
+menutrans &Update Ĝis&datigi
+menutrans &Get\ Block &Akiri\ blokon
+menutrans &Put\ Block Enme&ti\ blokon
+
+" -SEP2-
+menutrans &Make<Tab>:make Lanĉi\ ma&ke<Tab>:make
+menutrans &List\ Errors<Tab>:cl Listigi\ &erarojn<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Listigi\ &mesaĝojn<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Sek&vanta\ eraro<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp An&taŭa\ eraro<Tab>:cp
+menutrans &Older\ List<Tab>:cold Pli\ ma&lnova\ listo<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Pli\ nova\ listo<Tab>:cnew
+
+menutrans Error\ &Window &Fenestro\ de\ eraroj
+
+menutrans &Update<Tab>:cwin Ĝis&datigi<Tab>:cwin
+menutrans &Open<Tab>:copen &Malfermi<Tab>:copen
+menutrans &Close<Tab>:cclose &Fermi<Tab>:cclose
+
+" -SEP3-
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Konverti\ al\ deksesuma<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Retrokonverti<Tab>:%!xxd\ -r
+
+menutrans Se&T\ Compiler &Elekti\ kompililon
+
+
+menutrans &Buffers &Bufroj
+
+menutrans Dummy Fikcia
+menutrans &Refresh\ menu Ĝis&datigi\ menuon
+menutrans &Delete &Forviŝi
+menutrans &Alternate &Alterni
+menutrans &Next &Sekvanta
+menutrans &Previous An&taŭa
+" -SEP-
+
+menutrans &others a&liaj
+menutrans &u-z &u-z
+let g:menutrans_no_file = "[Neniu dosiero]"
+
+
+menutrans &Window Fene&stro
+
+menutrans &New<Tab>^Wn &Nova<Tab>^Wn
+menutrans S&plit<Tab>^Ws Di&vidi<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Dividi\ &al\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Dividi\ &vertikale<Tab>^Wv
+menutrans Split\ File\ E&xplorer Dividi\ &dosierfoliumilo
+" -SEP1-
+menutrans &Close<Tab>^Wc &Fermi<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Fermi\ &aliajn<Tab>^Wo
+" -SEP2-
+menutrans Move\ &To &Movu\ al
+
+menutrans &Top<Tab>^WK Su&pro<Tab>^WK
+menutrans &Bottom<Tab>^WJ Su&bo<Tab>^WJ
+menutrans &Left\ side<Tab>^WH Maldekstra\ &flanko<Tab>^WH
+menutrans &Right\ side<Tab>^WL Dekstra\ f&lanko<Tab>^WL
+
+menutrans Rotate\ &Up<Tab>^WR Rota&cii\ supre<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotac&ii\ sube<Tab>^Wr
+" -SEP3-
+menutrans &Equal\ Size<Tab>^W= &Egala\ grando<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Ma&ksimuma\ alto<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Mi&nimuma\ alto<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Maksimuma\ &larĝo<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimuma\ lar&ĝo<Tab>^W1\|
+
+
+" PopUp
+
+menutrans &Undo &Malfari
+" -SEP1-
+menutrans Cu&t &Tondi
+menutrans &Copy &Kopii
+menutrans &Paste &Al&glui
+" &Buffers.&Delete overwrites this one
+menutrans &Delete &Forviŝi
+" -SEP2-
+menutrans Select\ Blockwise Apartigi\ &bloke
+menutrans Select\ &Word Apartigi\ &vorton
+menutrans Select\ &Line Apartigi\ &linion
+menutrans Select\ &Block Apartigi\ blo&kon
+menutrans Select\ &All Apartigi\ ĉi&on
+
+
+" ToolBar
+
+menutrans Open Malfermi
+menutrans Save Konservi
+menutrans SaveAll Konservi\ ĉion
+menutrans Print Presi
+" -sep1-
+menutrans Undo Rezigni
+menutrans Redo Refari
+" -sep2-
+menutrans Cut Tondi
+menutrans Copy Kopii
+menutrans Paste Alglui
+" -sep3-
+menutrans Find Trovi
+menutrans FindNext Trovi\ sekvanten
+menutrans FindPrev Trovi\ antaŭen
+menutrans Replace Anstataŭigi
+" -sep4-
+menutrans New Nova
+menutrans WinSplit DividFen
+menutrans WinMax MaksFen
+menutrans WinMin MinFen
+menutrans WinVSplit VDividFen
+menutrans WinMaxWidth MaksLarĝFen
+menutrans WinMinWidth MinLarĝFen
+menutrans WinClose FermFen
+" -sep5-
+menutrans LoadSesn ŜargSeanc
+menutrans SaveSesn KonsSeanc
+menutrans RunScript LanĉSkript
+" -sep6-
+menutrans Make Make
+menutrans RunCtags KreiEtik
+menutrans TagJump IriAlEtik
+" -sep7-
+menutrans Help Helpo
+menutrans FindHelp SerĉHelp
+
+fun! Do_toolbar_tmenu()
+ let did_toolbar_tmenu = 1
+ tmenu ToolBar.Open Malfermi dosieron
+ tmenu ToolBar.Save Konservi aktualan dosieron
+ tmenu ToolBar.SaveAll Konservi ĉiujn dosierojn
+ tmenu ToolBar.Print Presi
+ tmenu ToolBar.Undo Rezigni
+ tmenu ToolBar.Redo Refari
+ tmenu ToolBar.Cut Tondi
+ tmenu ToolBar.Copy Kopii
+ tmenu ToolBar.Paste Alglui
+ if !has("gui_athena")
+ tmenu ToolBar.Find Trovi
+ tmenu ToolBar.FindNext Trovi sekvanten
+ tmenu ToolBar.FindPrev Trovi antaŭen
+ tmenu ToolBar.Replace Anstataŭigi
+ endif
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nova fenestro
+ tmenu ToolBar.WinSplit Dividi fenestron
+ tmenu ToolBar.WinMax Maksimumi fenestron
+ tmenu ToolBar.WinMin Minimumi fenestron
+ tmenu ToolBar.WinVSplit Dividi vertikale
+ tmenu ToolBar.WinMaxWidth Maksimumi larĝon de fenestro
+ tmenu ToolBar.WinMinWidth Minimumi larĝon de fenestro
+ tmenu ToolBar.WinClose Fermi fenestron
+ endif
+ tmenu ToolBar.LoadSesn Malfermi seancon
+ tmenu ToolBar.SaveSesn Konservi aktualan seancon
+ tmenu ToolBar.RunScript Ruli skripton Vim
+ tmenu ToolBar.Make Lanĉi make
+ tmenu ToolBar.RunCtags Krei etikedojn
+ tmenu ToolBar.TagJump Atingi tiun etikedon
+ tmenu ToolBar.Help Helpo de Vim
+ tmenu ToolBar.FindHelp Serĉo en helparo
+endfun
+
+
+menutrans &Syntax &Sintakso
+
+menutrans &Off &Malŝalti
+menutrans &Manual &Permana
+menutrans A&utomatic &Aŭtomata
+menutrans on/off\ for\ &This\ file Ŝalti/Malŝalti\ por\ &tiu\ dosiero
+
+" The Start Of The Syntax Menu
+menutrans ABC\ music\ notation ABC\ (muzika\ notacio)
+menutrans AceDB\ model Modelo\ AceDB
+menutrans Apache\ config Konfiguro\ de\ Apache
+menutrans Apache-style\ config Konfiguro\ de\ stilo\ Apache
+menutrans ASP\ with\ VBScript ASP\ kun\ VBScript
+menutrans ASP\ with\ Perl ASP\ kun\ Perl
+menutrans Assembly Asemblilo
+menutrans BC\ calculator Kalkulilo\ BC
+menutrans BDF\ font Tiparo\ BDF
+menutrans BIND\ config Konfiguro\ de\ BIND
+menutrans BIND\ zone Zone\ BIND
+menutrans Cascading\ Style\ Sheets CSS
+menutrans Cfg\ Config\ file Konfigura\ dosiero\ \.cfg
+menutrans Cheetah\ template Ŝablono\ Cheetah
+menutrans commit\ file Dosiero\ commit
+menutrans Generic\ Config\ file Dosiero\ de\ ĝenerala\ konfiguro
+menutrans Digital\ Command\ Lang DCL
+menutrans DNS/BIND\ zone Regiono\ BIND/DNS
+menutrans Dylan\ interface Interfaco\ Dylan
+menutrans Dylan\ lid Dylan\ lid
+menutrans Elm\ filter\ rules Reguloj\ de\ filtrado\ Elm
+menutrans ERicsson\ LANGuage Erlang\ (Lingvo\ de\ Ericsson)
+menutrans Essbase\ script Skripto\ Essbase
+menutrans Eterm\ config Konfiguro\ de\ Eterm
+menutrans Exim\ conf Konfiguro\ de\ Exim
+menutrans Fvwm\ configuration Konfiguro\ de\ Fvwm
+menutrans Fvwm2\ configuration Konfiguro\ de\ Fvwm2
+menutrans Fvwm2\ configuration\ with\ M4 Konfiguro\ de\ Fvwm2\ kun\ M4
+menutrans GDB\ command\ file Komanda\ dosiero\ de\ GDB
+menutrans HTML\ with\ M4 HTML\ kun\ M4
+menutrans Cheetah\ HTML\ template Ŝablono\ Cheetah\ HTML
+menutrans IDL\Generic\ IDL Ĝenerala\ IDL\IDL
+menutrans IDL\Microsoft\ IDL IDL\IDL\ Mikrosofto
+menutrans Indent\ profile Profilo\ Indent
+menutrans Inno\ setup Konfiguro\ de\ Inno
+menutrans InstallShield\ script Skripto\ InstallShield
+menutrans KDE\ script Skripto\ KDE
+menutrans LFTP\ config Konfiguro\ de\ LFTP
+menutrans LifeLines\ script Skripto\ LifeLines
+menutrans Lynx\ Style Stilo\ de\ Lynx
+menutrans Lynx\ config Konfiguro\ de\ Lynx
+menutrans Man\ page Manlibra\ paĝo
+menutrans MEL\ (for\ Maya) MEL\ (por\ Maya)
+menutrans 4DOS\ \.bat\ file Dosiero\ \.bat\ 4DOS
+menutrans \.bat\/\.cmd\ file Dosiero\ \.bat\/\.cmd
+menutrans \.ini\ file Dosiero\ \.ini
+menutrans Module\ Definition Difino\ de\ modulo
+menutrans Registry Registraro
+menutrans Resource\ file Dosiero\ de\ rimedoj
+menutrans Novell\ NCF\ batch Staplo\ Novell\ NCF
+menutrans NSIS\ script Skripto\ NSIS
+menutrans Oracle\ config Konfiguro\ de\ Oracle
+menutrans Palm\ resource\ compiler Tradukilo\ de\ rimedoj\ Palm
+menutrans PHP\ 3-4 PHP\ 3\ et\ 4
+menutrans Postfix\ main\ config Ĉefa\ konfiguro\ de\ Postfix
+menutrans Povray\ scene\ descr Scenejo\ Povray
+menutrans Povray\ configuration Konfiguro\ de\ Povray
+menutrans Purify\ log Protokolo\ de\ Purify
+menutrans Readline\ config Konfiguro\ de\ Readline
+menutrans RCS\ log\ output Protokola\ eligo\ de\ RCS
+menutrans RCS\ file Dosiero\ RCS
+menutrans RockLinux\ package\ desc\. Priskribo\ de\ pakaĵoj\ RockLinux
+menutrans Samba\ config Konfiguro\ de\ Samba
+menutrans SGML\ catalog Katalogo\ SGML
+menutrans SGML\ DTD DTD\ SGML
+menutrans SGML\ Declaration Deklaracio\ SGML
+menutrans Shell\ script Skripto-ŝelo
+menutrans sh\ and\ ksh sh\ kaj\ ksh
+menutrans Sinda\ compare Komparo\ Sinda
+menutrans Sinda\ input Enigo\ Sinda
+menutrans Sinda\ output Eligo\ Sinda
+menutrans SKILL\ for\ Diva SKILL\ por\ Diva
+menutrans Smarty\ Templates Ŝablono\ Smarty
+menutrans SNNS\ network Reto\ SNNS
+menutrans SNNS\ pattern Ŝablono\ SNNS
+menutrans SNNS\ result Rezulto\ SNNS
+menutrans Snort\ Configuration Konfiguro\ de\ Snort
+menutrans Squid\ config Konfiguro\ de\ Squid
+menutrans Subversion\ commit Commit\ Subversion
+menutrans TAK\ compare Komparo\ TAK
+menutrans TAK\ input Enigo\ TAK
+menutrans TAK\ output Eligo\ TAK
+menutrans TeX\ configuration Konfiguro\ de\ TeX
+menutrans TF\ mud\ client TF\ (client\ MUD)
+menutrans Tidy\ configuration Konfiguro\ de\ Tidy
+menutrans Trasys\ input Enigo\ Trasys
+menutrans Command\ Line Komanda\ linio
+menutrans Geometry Geometrio
+menutrans Optics Optiko
+menutrans Vim\ help\ file Helpa\ dosiero\ de\ Vim
+menutrans Vim\ script Skripto\ Vim
+menutrans Viminfo\ file Dosiero\ Viminfo
+menutrans Virata\ config Konfiguro\ de\ Virata
+menutrans Wget\ config Konfiguro\ de\ wget
+menutrans Whitespace\ (add) Spacetoj
+menutrans WildPackets\ EtherPeek\ Decoder Malkodilo\ WildPackets\ EtherPeek
+menutrans X\ resources Rimedoj\ X
+menutrans XXD\ hex\ dump Eligo\ deksesuma\.\ de\ xxd
+menutrans XFree86\ Config Konfiguro\ de\ XFree86
+" The End Of The Syntax Menu
+
+menutrans &Show\ filetypes\ in\ menu &Montri\ dosiertipojn\ en\ menuo
+" -SEP1-
+menutrans Set\ '&syntax'\ only Ŝalti\ nur\ '&syntax'
+menutrans Set\ '&filetype'\ too Ŝalti\ ankaŭ\ '&filetype'
+menutrans &Off M&alŝaltita
+" -SEP3-
+menutrans Co&lor\ test Testo\ de\ &koloroj
+menutrans &Highlight\ test Testo\ de\ &emfazo
+menutrans &Convert\ to\ HTML Konverti\ al\ &HTML
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_eo_eo.utf-8.vim b/runtime/lang/menu_eo_eo.utf-8.vim
new file mode 100644
index 0000000..7a2b9ee
--- /dev/null
+++ b/runtime/lang/menu_eo_eo.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Esperanto for UTF-8 encoding
+
+source <sfile>:p:h/menu_eo.utf-8.vim
diff --git a/runtime/lang/menu_eo_xx.utf-8.vim b/runtime/lang/menu_eo_xx.utf-8.vim
new file mode 100644
index 0000000..7a2b9ee
--- /dev/null
+++ b/runtime/lang/menu_eo_xx.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Esperanto for UTF-8 encoding
+
+source <sfile>:p:h/menu_eo.utf-8.vim
diff --git a/runtime/lang/menu_es.latin1.vim b/runtime/lang/menu_es.latin1.vim
new file mode 100644
index 0000000..b8efe51
--- /dev/null
+++ b/runtime/lang/menu_es.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Spanish
+
+source <sfile>:p:h/menu_es_es.latin1.vim
diff --git a/runtime/lang/menu_es.utf-8.vim b/runtime/lang/menu_es.utf-8.vim
new file mode 100644
index 0000000..ca6f754
--- /dev/null
+++ b/runtime/lang/menu_es.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Spanish for UTF-8 encoding
+
+source <sfile>:p:h/menu_es_es.latin1.vim
diff --git a/runtime/lang/menu_es_es.latin1.vim b/runtime/lang/menu_es_es.latin1.vim
new file mode 100644
index 0000000..e6aceb9
--- /dev/null
+++ b/runtime/lang/menu_es_es.latin1.vim
@@ -0,0 +1,323 @@
+" Menu Translations: Espaol
+" Previous translator: Alejandro Lpez-Valencia <dradul@users.sourceforge.net>
+" Last translator: Omar Campagne Polaino <ocampagne@gmail.com>
+" Version: 7.2.245
+" Last Change: 2012 May 01
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" The translations below are in latin1, but they work for cp1252,
+" iso-8859-15 without conversion as well.
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+
+" Help menu
+menutrans &Help Ay&uda
+menutrans &Overview<Tab><F1> Tabla\ de\ &contenidos<Tab><F1>
+menutrans &User\ Manual &Manual\ del\ usuario
+menutrans &How-to\ links &Enlaces\ a\ Cmo\ hago\.\.\.?
+menutrans &Find\.\.\. &Buscar\ en\ la\ ayuda
+menutrans &Credits &Reconocimientos
+menutrans O&rphans Ayude\ a\ los\ nios\ &hurfanos
+menutrans Co&pying &Trminos\ de\ Licencia
+menutrans Sponsor/Register Benefactor/Regstrese
+menutrans &Version &Versin\ e\ \informacin\ de\ configuracin
+menutrans &About &Acerca\ de\ Vim
+
+" File menu
+menutrans &File &Archivo
+menutrans &Open\.\.\.<Tab>:e &Abrir\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp A&brir\ en\ otra\ ventana\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Nuevo<Tab>:enew
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Abrir\ pes&taa\.\.\.<Tab>:tabnew
+menutrans &Close<Tab>:close &Cerrar<Tab>:close
+menutrans &Save<Tab>:w &Guardar<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Guardar\ &como\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. &Mostrar\ diferencias\ con\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Mostrar\ &parcheado\ por\.\.\.
+menutrans &Print &Imprimir
+menutrans Sa&ve-Exit<Tab>:wqa Gua&rdar\ y\ salir<Tab>:wqa
+menutrans E&xit<Tab>:qa &Salir<Tab>:qa
+
+" Edit menu
+menutrans &Edit &Editar
+menutrans &Undo<Tab>u &Deshacer<Tab>u
+menutrans &Redo<Tab>^R &Rehacer<Tab>^R
+menutrans Rep&eat<Tab>\. Repe&tir<Tab>\.
+menutrans Cu&t<Tab>"+x Cor&tar<Tab>"+x
+menutrans &Copy<Tab>"+y &Copiar<Tab>"+y
+menutrans &Paste<Tab>"+gP &Pegar<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Poner\ &antes<Tab>[p
+menutrans Put\ &After<Tab>]p Poner\ &despus<Tab>]p
+if has("win32") || has("win16")
+ menutrans &Delete<Tab>x S&uprimir<Tab>x
+endif
+menutrans &Select\ all<Tab>ggVG &Seleccionar\ todo<Tab>ggVG
+menutrans &Find\.\.\. &Buscar\.\.\.
+menutrans &Find<Tab>/ &Buscar<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. Buscar\ y\ R&eemplazar\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s Buscar\ y\ R&eemplazar<Tab>:%s
+menutrans Find\ and\ Rep&lace Buscar\ y\ R&eemplazar
+menutrans Find\ and\ Rep&lace<Tab>:s Buscar\ y\ R&eemplazar<Tab>:s
+menutrans Settings\ &Window &Ventana\ de\ opciones
+menutrans Startup\ &Settings Opciones\ de\ arranque
+
+" Edit/Global Settings
+menutrans &Global\ Settings Opciones\ &globales
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Activar/Desactivar\ &resaltado\ de\ sintaxis<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Activar/Desactivar\ &ignorar\ maysculas\ y\ minsculas<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Activar/Desactivar\ &mostrar\ coincidencias<Tab>:set\ sm!
+
+menutrans &Context\ lines Lneas\ de\ &contexto
+
+menutrans &Virtual\ Edit Edicin\ &virtual
+menutrans Never Nunca
+menutrans Block\ Selection Seleccin\ de\ bloque
+menutrans Insert\ mode Modo\ de\ insercin
+menutrans Block\ and\ Insert Bloque\ e\ insercin
+menutrans Always Siempre
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Activar/Desactivar\ modo\ de\ in&sercin<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Activar/Desactivar\ compatiblidad\ con\ Vi<Tab>:set\ cp!
+
+menutrans Search\ &Path\.\.\. Ruta\ de\ &bsqueda\.\.\.
+
+menutrans Ta&g\ Files\.\.\. Ficheros\ de\ &etiquetas\.\.\.
+
+" GUI options
+menutrans Toggle\ &Toolbar Ocultar/Mostrar\ barra\ de\ &herramientas
+menutrans Toggle\ &Bottom\ Scrollbar Ocultar/Mostrar\ barra\ de\ desplazamiento\ &inferior
+menutrans Toggle\ &Left\ Scrollbar Ocultar/Mostrar\ barra\ de\ desplazamiento\ i&zquierda
+menutrans Toggle\ &Right\ Scrollbar Ocultar/Mostrar\ barra\ de\ desplazamiento\ &derecha
+
+let g:menutrans_path_dialog = "Introduzca la ruta de bsqueda para los archivos.\nSepare los nombres de los directorios con una coma."
+let g:menutrans_tags_dialog = "Introduzca los nombres de los archivos de tags.\nSepare los nombres con una coma."
+
+" Edit/File Settings
+menutrans F&ile\ Settings Opciones\ del\ &archivo
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Activar/Desactivar\ &numeracin\ de\ lneas<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Activar/Desactivar\ modo\ de\ lista<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Activar/Desactivar\ &quiebre\ de\ lneas<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Activar/Desactivar\ quiebre\ entre\ &palabras<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Activar/Desactivar\ &expansin\ de\ marcas\ de\ \tabulado<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Activar/Desactivar\ &auto-sangrado<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Activar/Desactivar\ sangrado\ &C<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth Anchura\ del\ &sangrado
+
+menutrans Soft\ &Tabstop &Tabulado\ blando
+
+menutrans Te&xt\ Width\.\.\. Anchura\ del\ te&xto\.\.\.
+let g:menutrans_textwidth_dialog = "Introduzca el nuevo ancho del texto (0 para desactivar el quiebre de lnea): "
+
+menutrans &File\ Format\.\.\. &Formato\ del\ archivo\.\.\.
+let g:menutrans_fileformat_dialog = "Seleccione el formato para escribir el archivo"
+
+menutrans C&olor\ Scheme Esquema\ de\ c&olores
+menutrans blue azul
+menutrans darkblue azul\ oscuro
+menutrans default original
+menutrans desert desierto
+menutrans evening vespertino
+menutrans morning matutino
+menutrans peachpuff melocotn
+menutrans shine brillante
+
+menutrans Select\ Fo&nt\.\.\. Seleccionar\ fue&nte\.\.\.
+
+menutrans &Keymap Asociacin\ de\ teclados
+menutrans None Ninguna
+menutrans accents acentos
+menutrans arabic rabe
+menutrans czech checo
+menutrans greek griego
+menutrans hebrew hebreo
+menutrans hebrewp hebreo\ fontico
+menutrans lithuanian-baltic lituano-bltico
+menutrans russian-jcuken ruso-jcuken
+menutrans russian-jcukenwin ruso-jcuken\ Windows
+menutrans russian-yawerty ruso-yawerty
+menutrans serbian-latin serbio-latino
+menutrans serbian serbio
+menutrans slovak eslovaco
+
+
+" Programming menu
+menutrans &Tools &Herramientas
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Saltar\ a\ este\ etiqueta<Tab>g^]
+menutrans Jump\ &back<Tab>^T Saltar\ &atrs<Tab>^T
+menutrans Build\ &Tags\ File Crear\ archivo\ de\ &etiquetas\
+menutrans &Diff Modo\ de\ &diferencias
+menutrans &Folding &Plegado
+menutrans &Make<Tab>:make Ejecutar\ &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Lista\ de\ errores<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! L&ista\ de\ mensajes<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &Error\ siguiente<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Error\ p&revio<Tab>:cp
+menutrans &Older\ List<Tab>:cold Lista\ de\ &viejos\ a\ nuevos<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Lista\ de\ &nuevos\ a\ viejos<Tab>:cnew
+menutrans Error\ &Window Ven&tana\ de\ errores
+menutrans &Set\ Compiler Esco&ger\ el\ compilador\ a\ usar
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Convertir\ a\ formato\ &hexadecimal<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r &Convertir\ al\ formato\ original<Tab>:%!xxd\ -r
+
+" Tools.Spelling Menu
+menutrans &Spelling Correccin\ ortogrfica
+menutrans &Spell\ Check\ On &Activar\ correccin\ ortogrfica
+menutrans Spell\ Check\ &Off &Desactivar\ correccin\ ortogrfica
+menutrans To\ &Next\ error<Tab>]s &Siguiente\ error<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s Error\ &precedente<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Sugerir\ &correccin<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall &Repetir\ correccin<Tab>:spellrepall
+an 40.335.205 &Tools.&Spelling.Castellano\ (es) :set spl=es spell<CR>
+menutrans Set\ language\ to\ "en" Ingls
+menutrans Set\ language\ to\ "en_au" Ingls\ (en_au)
+menutrans Set\ language\ to\ "en_ca" Ingls\ (en_ca)
+menutrans Set\ language\ to\ "en_gb" Ingls\ (en_gb)
+menutrans Set\ language\ to\ "en_nz" Ingls\ (en_nz)
+menutrans Set\ language\ to\ "en_us" Ingls\ (en_us)
+
+menutrans &Find\ More\ Languages &Buscar\ otras\ lenguas
+
+" Tools.Fold Menu
+menutrans &Enable/Disable\ folds<Tab>zi &Activar/Desactivar\ pliegues<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Ver\ lnea\ del\ cursor<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Ve&r\ slo\ la\ lnea\ del\ cursor<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm C&errar\ ms\ pliegues<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM &Cerrar\ todos\ los\ pliegues<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr Abrir\ &ms\ pliegues<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR &Abrir\ todos\ los\ pliegues<Tab>zR
+" fold method
+menutrans Fold\ Met&hod &Mtodo\ de\ plegado
+" create and delete folds
+menutrans Create\ &Fold<Tab>zf Crear\ &pliegue<Tab>zf
+menutrans &Delete\ Fold<Tab>zd &Suprimir\ pliegue<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Suprimir\ &todos\ los\ pliegues<Tab>zD
+" moving around in folds
+menutrans Fold\ col&umn\ width A&nchura\ de\ columna\ del\ pliegue
+
+" Tools.Diff Menu
+menutrans &Update &Actualizar
+menutrans &Get\ Block &Obtener\ bloque
+menutrans &Put\ Block &Poner\ bloque
+
+"Tools.Error Menu
+menutrans &Update<Tab>:cwin &Actualizar
+menutrans &Open<Tab>:copen A&brir
+menutrans &Close<Tab>:cclose &Cerrar
+
+" Names for buffer menu.
+menutrans &Buffers &Buffers
+menutrans &Refresh\ menu &Refrescar\ men
+menutrans &Delete &Suprimir
+menutrans &Alternate &Alternar
+menutrans &Next Si&guiente
+menutrans &Previous &Previo
+let g:menutrans_no_file = "[Sin archivo]"
+
+" Window menu
+menutrans &Window &Ventana
+menutrans &New<Tab>^Wn Ventana\ &nueva<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Dividir\ la\ ventana<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ D&ividir\ en\ el\ marcador\ (#)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Dividir\ &verticalmente<Tab>^Wv
+menutrans Split\ File\ E&xplorer &Abrir\ el\ Explorador\ de\ archivos
+menutrans &Close<Tab>^Wc &Cerrar\ esta\ ventana<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Cerrar\ &otra(s)\ ventana(s)<Tab>^Wo
+menutrans Move\ &To Mov&er\ a
+menutrans &Top<Tab>^WK &Arriba<Tab>^WK
+menutrans &Bottom<Tab>^WJ A&bajo<Tab>^WJ
+menutrans &Left\ side<Tab>^WH Lado\ &izquierdo<Tab>^WH
+menutrans &Right\ side<Tab>^WL Lado\ &derecho<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR &Rotar\ hacia\ arriba<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotar\ hacia\ a&bajo<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= Mismo\ &tamao<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Altura\ &mxima<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Altura\ m&nima<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Anchura\ m&xima<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Anc&hura\ mnima<Tab>^W1\|
+
+" The popup menu
+menutrans &Undo &Deshacer
+menutrans Cu&t Cor&tar
+menutrans &Copy &Copiar
+menutrans &Paste &Pegar
+menutrans &Delete &Borrar
+menutrans Select\ Blockwise Seleccionar\ por\ bloque
+menutrans Select\ &Word Seleccionar\ &palabra
+menutrans Select\ &Line Seleccionar\ una\ &lnea
+menutrans Select\ &Block Seleccionar\ un\ &bloque
+menutrans Select\ &All Seleccionar\ &todo
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Abrir archivo
+ tmenu ToolBar.Save Guardar archivo
+ tmenu ToolBar.SaveAll Guardar todos los archivos
+ tmenu ToolBar.Print Imprimir
+ tmenu ToolBar.Undo Deshacer
+ tmenu ToolBar.Redo Rehacer
+ tmenu ToolBar.Cut Cortar
+ tmenu ToolBar.Copy Copiar
+ tmenu ToolBar.Paste Pegar
+ tmenu ToolBar.Find Buscar...
+ tmenu ToolBar.FindNext Buscar siguiente
+ tmenu ToolBar.FindPrev Buscar precedente
+ tmenu ToolBar.Replace Buscar y reemplazar
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Ventana nueva
+ tmenu ToolBar.WinSplit Dividir ventana
+ tmenu ToolBar.WinMax Altura mxima
+ tmenu ToolBar.WinMin Altura mnima
+ tmenu ToolBar.WinVSplit Dividir verticalmente
+ tmenu ToolBar.WinMaxWidth Anchura mxima
+ tmenu ToolBar.WinMinWidth Anchura mnima
+ tmenu ToolBar.WinClose Cerrar ventana
+ endif
+ tmenu ToolBar.LoadSesn Cargar sesin
+ tmenu ToolBar.SaveSesn Guardar sesin
+ tmenu ToolBar.RunScript Ejecutar un archivo de rdenes
+ tmenu ToolBar.Make Ejecutar Make
+ tmenu ToolBar.Shell Abrir un intrprete de comandos
+ tmenu ToolBar.RunCtags Generar un archivo de etiquetas
+ tmenu ToolBar.TagJump Saltar a una etiqueta
+ tmenu ToolBar.Help Ayuda
+ tmenu ToolBar.FindHelp Buscar en la ayuda...
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Sintaxis
+menutrans &Show\ filetypes\ in\ menu &Mostrar\ listas\ de\ tipo\ de\ archivo
+menutrans Set\ '&syntax'\ only Activar\ slo\ sintaxis
+menutrans Set\ '&filetype'\ too Activar\ tambin\ tipo\ de\ archivo
+menutrans &Off &Desactivar\ sintaxis
+menutrans &Manual Sintaxis\ &manual
+menutrans A&utomatic Sintaxis\ a&utomtica
+menutrans on/off\ for\ &This\ file Activar/Desactivar\ en\ es&te\ archivo
+menutrans Co&lor\ test &Prueba\ de\ colores
+menutrans &Highlight\ test Prueba\ de\ &resaltado
+menutrans &Convert\ to\ HTML &Convertir\ a\ HTML
+
+" Find Help dialog text
+let g:menutrans_help_dialog = "Introduzca un nombre de comando o palabra para obtener ayuda;\n\nAnteponga i_ para comandos de entrada (e.g.: i_CTRL-X)\nAnteponga c_ para comandos de la lnea de comandos (e.g.: c_<Del>)\nAnteponga ` para un nombre de opcin (e.g.: `shiftwidth`)"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_es_es.utf-8.vim b/runtime/lang/menu_es_es.utf-8.vim
new file mode 100644
index 0000000..ca6f754
--- /dev/null
+++ b/runtime/lang/menu_es_es.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Spanish for UTF-8 encoding
+
+source <sfile>:p:h/menu_es_es.latin1.vim
diff --git a/runtime/lang/menu_fi.latin1.vim b/runtime/lang/menu_fi.latin1.vim
new file mode 100644
index 0000000..4dd9140
--- /dev/null
+++ b/runtime/lang/menu_fi.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Finnish for latin 1 encoding
+
+source <sfile>:p:h/menu_fi_fi.latin1.vim
diff --git a/runtime/lang/menu_fi.utf-8.vim b/runtime/lang/menu_fi.utf-8.vim
new file mode 100644
index 0000000..b33639c
--- /dev/null
+++ b/runtime/lang/menu_fi.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Finnish for UTF-8 encoding
+
+source <sfile>:p:h/menu_fi_fi.latin1.vim
diff --git a/runtime/lang/menu_fi_fi.latin1.vim b/runtime/lang/menu_fi_fi.latin1.vim
new file mode 100644
index 0000000..73aa3f5
--- /dev/null
+++ b/runtime/lang/menu_fi_fi.latin1.vim
@@ -0,0 +1,479 @@
+" Menu Translations: Finnish
+" Maintainer: Flammie Pirinen <flammie@iki.fi>
+" Last Change: 2020 Apr 23
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Translations should be in latin1, if it requires latin9 or even unicode,
+" change this:
+if &enc != "cp1252" && &enc != "iso-8859-15" && &enc != "iso-8859-1"
+ scriptencoding latin1
+endif
+
+" Accels: TMYSPIO
+menutrans &File &Tiedosto
+" Accels: AJTUSNIDPOE
+menutrans &Open\.\.\.<Tab>:e &Avaa\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Avaa\ &jaettuna\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Avaa\ &tabissa\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Uusi<Tab>:enew
+menutrans &Close<Tab>:close &Sulje<Tab>:close
+" -SEP1-
+menutrans &Save<Tab>:w Talle&nna<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Tallenna\ n&imell\.\.\.<Tab>:sav
+" -SEP2-
+menutrans Split\ &Diff\ with\.\.\. Jaa\ &diffill\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Jaa\ &patchilla\.\.\.
+" -SEP3-
+menutrans &Print Tul&osta
+" -SEP4-
+menutrans Sa&ve-Exit<Tab>:wqa Tall&enna\ ja\ lopeta<Tab>:wqa
+menutrans E&xit<Tab>:qa &Lopeta<Tab>:qa
+
+
+menutrans &Edit &Muokkaa
+" Accels: KPTLOIEJSAHRUYKVNF
+menutrans &Undo<Tab>u &Kumoa<Tab>u
+menutrans &Redo<Tab>^R &Palauta<Tab>^R
+menutrans Rep&eat<Tab>\. &Toista<Tab>\.
+" -SEP1-
+menutrans Cu&t<Tab>"+x &Leikkaa<Tab>"+x
+menutrans &Copy<Tab>"+y K&opioi<Tab>"+y
+menutrans &Paste<Tab>"+gP L&iit<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Lis\ &ennen<Tab>[p
+menutrans Put\ &After<Tab>]p Lis\ &jlkeen<Tab>]p
+menutrans &Delete<Tab>x Poi&sta<Tab>x
+menutrans &Select\ All<Tab>ggVG V&alitse\ kaikki<Tab>ggVG
+" -SEP2-
+menutrans &Find\.\.\. &Hae\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Hae\ ja\ ko&rvaa\.\.\.
+menutrans &Find<Tab>/ &Hae<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s Hae\ ja\ ko&rvaa<Tab>:%s
+menutrans Find\ and\ Rep&lace<Tab>:s Hae\ ja\ ko&rvaa<Tab>:s
+" -SEP3-
+menutrans Settings\ &Window Aset&usikkuna
+menutrans Startup\ &Settings &Kynnistysasetukset
+menutrans &Global\ Settings &Yleiset\ asetukset
+" Submenu:
+" Accels: KOSHVYIATLEPR
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Korostus<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Ohita\ kirjaintaso<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! &Suljekorostus<Tab>:set\ sm!
+
+menutrans &Context\ lines &Huomioitavat\ kontekstirivit
+" Subsubmenu:
+" Accels: ELSOA
+menutrans &Virtual\ Edit &Virtuaalimuokkaus
+menutrans Never &Ei\ koskaan
+menutrans Block\ Selection &Lohkovalinta
+menutrans Insert\ mode &Sytttila
+menutrans Block\ and\ Insert L&ohkosytttila
+menutrans Always &Aina
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! S&ytttila<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! V&i-tila<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. H&akupolku\.\.\.
+menutrans Ta&g\ Files\.\.\. &Tgitiedostot\.\.\.
+" -SEP1-
+menutrans Toggle\ &Toolbar Tyka&lupalkki
+menutrans Toggle\ &Bottom\ Scrollbar Vaakavi&erityspalkki
+menutrans Toggle\ &Left\ Scrollbar Vasen\ &pystyvierityspalkki
+menutrans Toggle\ &Right\ Scrollbar Oikea\ pystyvie&rityspalkki
+
+let g:menutrans_path_dialog = "Anna tiedostojen hakupolku.\nErota hakemistot pilkuin."
+let g:menutrans_tags_dialog = "Anna tgitiedostojen nimet.\nErota tidostot pilkuin."
+
+menutrans F&ile\ Settings Tiedostoasetu&kset
+" Submenu:
+" Accels: NLRSTACIBEM
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Rivi&numerointi<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! &Listaustila<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! &Rivitys<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! &Sanoittainen\ rivitys<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Muuta\ &tabit\ vleiksi<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! &Automaattinen\ sisennys<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! &C-kielen\ sisennys<Tab>:set\ cin!
+" -SEP2-
+menutrans &Shiftwidth S&isennysleveys
+menutrans Soft\ &Tabstop Nennista&bulointi
+menutrans Te&xt\ Width\.\.\. Tekstinl&eveys\.\.\.
+menutrans &File\ Format\.\.\. Tiedosto&muoto\.\.\.
+
+let g:menutrans_textwidth_dialog = "Anna uusi tekstin leveys\n(0 poistaa kytst)"
+let g:menutrans_fileformat_dialog = "Anaa tiedoston kirjoitusmuoto."
+let g:menutrans_fileformat_choices = " &Unix \n &Dos \n &Mac \n &Peru "
+
+menutrans C&olor\ Scheme &Vriteema
+menutrans &Keymap &Nppinkartta
+menutrans None Ei\ mikn
+menutrans Select\ Fo&nt\.\.\. Valitse\ &fontti\.\.\.
+
+
+menutrans &Tools T&ykalut
+" Accels: ___OTDM__
+menutrans &Jump\ to\ this\ tag<Tab>g^] Siirry\ tgiin<Tab>g^]
+menutrans Jump\ &back<Tab>^T Siirry\ takaisin<Tab>^T
+menutrans Build\ &Tags\ File Luo\ tgitiedosto
+
+" -SEP1-
+menutrans &Spelling &Oikeinkirjoitus
+" Submenu:
+" Accels: OSEKT
+menutrans &Spell\ Check\ On &Oikaisuluku\ plle
+menutrans Spell\ Check\ &Off &Oikaisuluku\ pois\ plt
+menutrans To\ &Next\ error<Tab>]s &Seuraavaan\ virheeseen<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s &Edelliseen\ virheeseen<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Ehdota\ &korjausta<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall &Toista\ korjaus<Tab>:spellrepall
+
+menutrans Set\ language\ to\ "en" Aseta\ kieleksi\ en
+menutrans Set\ language\ to\ "en_au" Aseta\ kieleksi\ en_au
+menutrans Set\ language\ to\ "en_ca" Aseta\ kieleksi\ en_ca
+menutrans Set\ language\ to\ "en_gb" Aseta\ kieleksi\ en_gb
+menutrans Set\ language\ to\ "en_nz" Aseta\ kieleksi\ en_nz
+menutrans Set\ language\ to\ "en_us" Aseta\ kieleksi\ en_us
+
+menutrans &Find\ More\ Languages Hae\ lis\ kieli
+
+
+
+menutrans &Folding &Taitokset
+" Accels: TNVSAPEOKL
+menutrans &Enable/Disable\ folds<Tab>zi &Taitokset<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Nyt\ kursorin\ rivi<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Nyt\ &vain\ kursorin\ rivi<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm &Sulje\ lis\ taitoksia<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM &Sulje\ kaikki\ taitokset<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr &Avaa\ lis\ taitoksia<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR &Avaa\ kaikki\ taitokset<Tab>zR
+" -SEP1-
+menutrans Fold\ Met&hod Taitteluta&pa
+" Submenu:
+" Accels: MILSDM
+menutrans M&anual &Manuaalinen
+menutrans I&ndent S&isennys
+menutrans E&xpression I&lmaus
+menutrans S&yntax &Syntaksi
+menutrans &Diff &Diff
+menutrans Ma&rker &Merkit
+
+menutrans Create\ &Fold<Tab>zf T&ee\ taitos<Tab>zf
+menutrans &Delete\ Fold<Tab>zd P&oista\ taitos<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Poista\ &kaikki\ taitokset<Tab>zD
+" -SEP2-
+menutrans Fold\ col&umn\ width Taitossarakkeen\ &leveys
+
+menutrans &Diff &Diffit
+" Submenu:
+" Accels: PHL
+menutrans &Update &Pivit
+menutrans &Get\ Block &Hae\ lohko
+menutrans &Put\ Block &Lis\ lohko
+
+" -SEP2-
+menutrans &Make<Tab>:make &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl Virheluettelo<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Virheviestit<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Seuraava\ virhe<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Edellinen\ virhe<Tab>:cp
+menutrans &Older\ List<Tab>:cold Edellinen\ lista<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Seuraava\ lista<Tab>:cnew
+
+menutrans Error\ &Window Virheikkuna
+" Submenu:
+" Accels: PAS
+menutrans &Update<Tab>:cwin &Pivit<Tab>:cwin
+menutrans &Open<Tab>:copen &Avaa<Tab>:copen
+menutrans &Close<Tab>:cclose &Sulje<Tab>:cclose
+
+menutrans Se&T\ Compiler Ase&ta\ kntj
+" -SEP3-
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Muunna\ heksoiksi<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Muunna\ takaisin<Tab>:%!xxd\ -r
+
+
+menutrans &Syntax &Syntaksi
+" Accels: NSFPMAT
+menutrans &Show\ filetypes\ in\ menu &Nyt\ tiedostotyypit\ valikossa
+" -SEP1-
+menutrans Set\ '&syntax'\ only Aseta\ vain\ &syntax
+menutrans Set\ '&filetype'\ too Aseta\ mys\ &filetype
+menutrans &Off &Pois\ plt
+" -SEP3-
+menutrans Co&lor\ test Testaa\ vrit
+menutrans &Highlight\ test Testaa\ korostukset
+menutrans &Convert\ to\ HTML Muunna\ HTML:ksi
+" -SEP2-
+menutrans &Off &Pois\ plt
+menutrans &Manual &Manuaalinen
+menutrans A&utomatic &Automaattinen
+menutrans on/off\ for\ &This\ file Kytke\ &tlle\ tiedostolle
+
+" The Start Of The Syntax Menu
+menutrans ABC\ music\ notation ABC\ (notation\ musicale)
+menutrans AceDB\ model Modle\ AceDB
+menutrans Apache\ config Config\.\ Apache
+menutrans Apache-style\ config Config\.\ style\ Apache
+menutrans ASP\ with\ VBScript ASP\ avec\ VBScript
+menutrans ASP\ with\ Perl ASP\ avec\ Perl
+menutrans Assembly Assembleur
+menutrans BC\ calculator Calculateur\ BC
+menutrans BDF\ font Fonte\ BDF
+menutrans BIND\ config Config\.\ BIND
+menutrans BIND\ zone Zone\ BIND
+menutrans Cascading\ Style\ Sheets Feuilles\ de\ style\ en\ cascade
+menutrans Cfg\ Config\ file Fichier\ de\ config\.\ \.cfg
+menutrans Cheetah\ template Patron\ Cheetah
+menutrans commit\ file Fichier\ commit
+menutrans Generic\ Config\ file Fichier\ de\ config\.\ gnrique
+menutrans Digital\ Command\ Lang DCL
+menutrans DNS/BIND\ zone Zone\ BIND/DNS
+menutrans Dylan\ interface Interface
+menutrans Dylan\ lid LID
+menutrans Elm\ filter\ rules Rgles\ de\ filtrage\ Elm
+menutrans ERicsson\ LANGuage Erlang\ (langage\ Ericsson)
+menutrans Essbase\ script Script\ Essbase
+menutrans Eterm\ config Config\.\ Eterm
+menutrans Exim\ conf Config\.\ Exim
+menutrans Fvwm\ configuration Config\.\ Fvwm
+menutrans Fvwm2\ configuration Config\.\ Fvwm2
+menutrans Fvwm2\ configuration\ with\ M4 Config\.\ Fvwm2\ avec\ M4
+menutrans GDB\ command\ file Fichier\ de\ commandes\ GDB
+menutrans HTML\ with\ M4 HTML\ avec\ M4
+menutrans Cheetah\ HTML\ template Patron\ Cheetah\ pour\ HTML
+menutrans IDL\Generic\ IDL IDL\IDL\ gnrique
+menutrans IDL\Microsoft\ IDL IDL\IDL\ Microsoft
+menutrans Indent\ profile Profil\ Indent
+menutrans Inno\ setup Config\.\ Inno
+menutrans InstallShield\ script Script\ InstallShield
+menutrans KDE\ script Script\ KDE
+menutrans LFTP\ config Config\.\ LFTP
+menutrans LifeLines\ script Script\ LifeLines
+menutrans Lynx\ Style Style\ Lynx
+menutrans Lynx\ config Config\.\ Lynx
+menutrans Man\ page Page\ Man
+menutrans MEL\ (for\ Maya) MEL\ (pour\ Maya)
+menutrans 4DOS\ \.bat\ file Fichier\ \.bat\ 4DOS
+menutrans \.bat\/\.cmd\ file Fichier\ \.bat\ /\ \.cmd
+menutrans \.ini\ file Fichier\ \.ini
+menutrans Module\ Definition Dfinition\ de\ module
+menutrans Registry Extrait\ du\ registre
+menutrans Resource\ file Fichier\ de\ ressources
+menutrans Novell\ NCF\ batch Batch\ Novell\ NCF
+menutrans NSIS\ script Script\ NSIS
+menutrans Oracle\ config Config\.\ Oracle
+menutrans Palm\ resource\ compiler Compil\.\ de\ resources\ Palm
+menutrans PHP\ 3-4 PHP\ 3\ et\ 4
+menutrans Postfix\ main\ config Config\.\ Postfix
+menutrans Povray\ scene\ descr Scne\ Povray
+menutrans Povray\ configuration Config\.\ Povray
+menutrans Purify\ log Log\ Purify
+menutrans Readline\ config Config\.\ Readline
+menutrans RCS\ log\ output Log\ RCS
+menutrans RCS\ file Fichier\ RCS
+menutrans RockLinux\ package\ desc\. Desc\.\ pkg\.\ RockLinux
+menutrans Samba\ config Config\.\ Samba
+menutrans SGML\ catalog Catalogue\ SGML
+menutrans SGML\ DTD DTD\ SGML
+menutrans SGML\ Declaration Dclaration\ SGML
+menutrans Shell\ script Script\ shell
+menutrans sh\ and\ ksh sh\ et\ ksh
+menutrans Sinda\ compare Comparaison\ Sinda
+menutrans Sinda\ input Entre\ Sinda
+menutrans Sinda\ output Sortie\ Sinda
+menutrans SKILL\ for\ Diva SKILL\ pour\ Diva
+menutrans Smarty\ Templates Patrons\ Smarty
+menutrans SNNS\ network Rseau\ SNNS
+menutrans SNNS\ pattern Motif\ SNNS
+menutrans SNNS\ result Rsultat\ SNNS
+menutrans Snort\ Configuration Config\.\ Snort
+menutrans Squid\ config Config\.\ Squid
+menutrans Subversion\ commit Commit\ Subversion
+menutrans TAK\ compare Comparaison\ TAK
+menutrans TAK\ input Entre\ TAK
+menutrans TAK\ output Sortie\ TAK
+menutrans TeX\ configuration Config\.\ TeX
+menutrans TF\ mud\ client TF\ (client\ MUD)
+menutrans Tidy\ configuration Config\.\ Tidy
+menutrans Trasys\ input Entre\ Trasys
+menutrans Command\ Line Ligne\ de\ commande
+menutrans Geometry Gomtrie
+menutrans Optics Optiques
+menutrans Vim\ help\ file Fichier\ d'aide\ Vim
+menutrans Vim\ script Script\ Vim
+menutrans Viminfo\ file Fichier\ Viminfo
+menutrans Virata\ config Config\.\ Virata
+menutrans Wget\ config Config\.\ wget
+menutrans Whitespace\ (add) Espaces\ et\ tabulations
+menutrans WildPackets\ EtherPeek\ Decoder Dcodeur\ WildPackets\ EtherPeek
+menutrans X\ resources Resources\ X
+menutrans XXD\ hex\ dump Sortie\ hexa\.\ de\ xxd
+menutrans XFree86\ Config Config\.\ XFree86
+
+menutrans &Buffers &Puskurit
+" Accels: VPASE
+menutrans Dummy Dummy
+menutrans &Refresh\ menu Pivit\ &valikko
+menutrans &Delete &Poista
+menutrans &Alternate V&aihda
+menutrans &Next &Seuraava
+menutrans &Previous &Edellinen
+" -SEP-
+" (Alphabet menus)
+menutrans &others &muut
+let g:menutrans_no_file = "[Ei tiedostoja]"
+
+
+menutrans &Window &Ikkuna
+" Accels: UJPTSMIYAKOL
+menutrans &New<Tab>^Wn &Uusi\ ikkuna<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Jaa<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ &Jaa\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Jaa\ &pystysuunnassa<Tab>^Wv
+menutrans Split\ File\ E&xplorer Jaa\ &tiedostonhallinnalle
+" -SEP1-
+menutrans &Close<Tab>^Wc &Sulje<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Sulje\ &muut<Tab>^Wo
+" -SEP2-
+menutrans Move\ &To S&iirr
+" Submenu:
+" Accels: YAOV
+menutrans &Top<Tab>^WK &Yls<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Alas<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Oikealle<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Vasemmalle<Tab>^WL
+
+menutrans Rotate\ &Up<Tab>^WR Vaihda\ &ylemms<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Vaihda\ &alemmas<Tab>^Wr
+" -SEP3-
+menutrans &Equal\ Size<Tab>^W= Saman\ &kokoisiksi<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Enimmisk&orkeuteen<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Vhimmisk&orkeuteen<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Enimmis&leveyteen<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Vhimmis&leveyteen<Tab>^W1\|
+
+" (Plugin menus here)
+menutrans Plugin Liitnniset
+
+menutrans &Help &Ohje
+" Accels: YKUHTLROVI
+menutrans &Overview<Tab><F1> &Yleiskatsaus<Tab><F1>
+menutrans &User\ Manual &Kyttohje
+menutrans &How-to\ links K&UINKA-linkkej
+menutrans &Find\.\.\. &Hae\.\.\.
+" -sep1-
+menutrans &Credits &Tekijt
+menutrans Co&pying &Lisenssi
+menutrans &Sponsor/Register Sponsoroi/&Rekisteri
+menutrans O&rphans &Orvoista
+" -sep2-
+menutrans &Version &Versio
+menutrans &About T&ietoja
+
+let g:menutrans_help_dialog = "Anna komento tai sana, jota haetaan ohjeesta.\n\nAloita i_:ll sytttilan komentoja varten (esim. i_CTRL-X)\nAloita c_:ll komentorivi varten (esim. c_<Del>)\nKirjoita asetukset puolilainausmerkkeijin (esim. 'shiftwidth')"
+
+
+" PopUp
+
+menutrans &Undo &Kumoa
+" -SEP1-
+menutrans Cu&t &Leikkaa
+menutrans &Copy &Kopioi
+menutrans &Paste L&iit
+" &Buffers.&Delete overwrites this one
+menutrans &Delete &Poista
+" -SEP2-
+menutrans Select\ Blockwise Valitse\ lohkoittain
+menutrans Select\ &Word Valitse\ &sana
+menutrans Select\ &Line Valitse\ &rivi
+menutrans Select\ &Block Valitse\ &lohko
+menutrans Select\ &All Valitse\ &kaikki
+
+
+" ToolBar
+
+menutrans Open Avaa
+menutrans Save Tallenna
+menutrans SaveAll TallennaKaikki
+menutrans Print Tulosta
+" -sep1-
+menutrans Undo Kumoa
+menutrans Redo Palauta
+" -sep2-
+menutrans Cut Leikkaa
+menutrans Copy Kopioi
+menutrans Paste Liit
+" -sep3-
+menutrans Find Etsi
+menutrans FindNext EtsiSeur
+menutrans FindPrev EtsiEd
+menutrans Replace Korvaa
+" -sep4-
+menutrans New Uusi
+menutrans WinSplit JaaIkk
+menutrans WinMax IkkMax
+menutrans WinMin IkkMin
+menutrans WinVSplit JaaIkkV
+menutrans WinMaxWidth IkkMaxLev
+menutrans WinMinWidth IkkMinLev
+menutrans WinClose SuljeIkk
+" -sep5-
+menutrans LoadSesn AvaaSess
+menutrans SaveSesn TallSess
+menutrans RunScript AjaSkripti
+" -sep6-
+menutrans Make Make
+menutrans RunCtags AjaCTags
+menutrans TagJump TagHypp
+" -sep7-
+menutrans Help Ohje
+menutrans FindHelp OhjeHaku
+
+fun! Do_toolbar_tmenu()
+ let did_toolbar_tmenu = 1
+ tmenu ToolBar.Open Avaa tiedosto
+ tmenu ToolBar.Save Tallenna nykyinen tiedosto
+ tmenu ToolBar.SaveAll Tallenna kaikki tiedostot
+ tmenu ToolBar.Print Tulosta
+ tmenu ToolBar.Undo Kumoa
+ tmenu ToolBar.Redo Palauta
+ tmenu ToolBar.Cut Leikkaa
+ tmenu ToolBar.Copy Kopioi
+ tmenu ToolBar.Paste Liit
+ if !has("gui_athena")
+ tmenu ToolBar.Find Hae
+ tmenu ToolBar.FindNext Hae seuraava
+ tmenu ToolBar.FindPrev Hae edellinen
+ tmenu ToolBar.Replace Korvaa
+ endif
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Uusi ikkuna
+ tmenu ToolBar.WinSplit Jaa ikkuna
+ tmenu ToolBar.WinMax Maximiser fentre
+ tmenu ToolBar.WinMin Minimiser fentre
+ tmenu ToolBar.WinVSplit Fractionner verticalement
+ tmenu ToolBar.WinMaxWidth Maximiser largeur fentre
+ tmenu ToolBar.WinMinWidth Minimiser largeur fentre
+ tmenu ToolBar.WinClose Fermer fentre
+ endif
+ tmenu ToolBar.LoadSesn Avaa sessio
+ tmenu ToolBar.SaveSesn Tallenna nykyinen sessio
+ tmenu ToolBar.RunScript Lataa vim-skripti
+ tmenu ToolBar.Make Suorita make
+ tmenu ToolBar.RunCtags Suorita CTags
+ tmenu ToolBar.TagJump Hypp tgiin
+ tmenu ToolBar.Help Vimin ohje
+ tmenu ToolBar.FindHelp Etsi ohjeesta
+endfun
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: set fileencoding=latin1
diff --git a/runtime/lang/menu_fi_fi.utf-8.vim b/runtime/lang/menu_fi_fi.utf-8.vim
new file mode 100644
index 0000000..b33639c
--- /dev/null
+++ b/runtime/lang/menu_fi_fi.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Finnish for UTF-8 encoding
+
+source <sfile>:p:h/menu_fi_fi.latin1.vim
diff --git a/runtime/lang/menu_finnish_finland.1252.vim b/runtime/lang/menu_finnish_finland.1252.vim
new file mode 100644
index 0000000..ad62e03
--- /dev/null
+++ b/runtime/lang/menu_finnish_finland.1252.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Finnish for Windows CodePage 1252 encoding
+
+source <sfile>:p:h/menu_fi_fi.latin1.vim
diff --git a/runtime/lang/menu_fr.latin1.vim b/runtime/lang/menu_fr.latin1.vim
new file mode 100644
index 0000000..064680b
--- /dev/null
+++ b/runtime/lang/menu_fr.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: French for ISO 8859-1 encoding
+
+source <sfile>:p:h/menu_fr_fr.latin1.vim
diff --git a/runtime/lang/menu_fr.utf-8.vim b/runtime/lang/menu_fr.utf-8.vim
new file mode 100644
index 0000000..5e41906
--- /dev/null
+++ b/runtime/lang/menu_fr.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: French for UTF-8 encoding
+
+source <sfile>:p:h/menu_fr_fr.latin1.vim
diff --git a/runtime/lang/menu_fr_fr.latin1.vim b/runtime/lang/menu_fr_fr.latin1.vim
new file mode 100644
index 0000000..ef741d7
--- /dev/null
+++ b/runtime/lang/menu_fr_fr.latin1.vim
@@ -0,0 +1,486 @@
+" Menu Translations: Francais
+" Maintainer: Adrien Beau <version.francaise@free.fr>
+" First Version: Francois Thunus <thunus@systran.fr>
+" Contributors: David Blanchet <david.blanchet@free.fr>
+" Gabriel Dupras <gabrieldupras@gmail.com>
+" Last Change: 2021 Feb 16
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" The translations below are in latin1, but they work for cp1252 and
+" iso-8859-15 without conversion as well.
+if &enc != "cp1252" && &enc != "iso-8859-15" && &enc != "iso-8859-1"
+ scriptencoding latin1
+endif
+
+menutrans &Help &Aide
+
+menutrans &Overview<Tab><F1> &Sommaire<Tab><F1>
+menutrans &User\ Manual &Manuel\ utilisateur
+menutrans &How-to\ links &Tches\ courantes
+menutrans &Find\.\.\. Rec&hercher\.\.\.
+" -sep1-
+menutrans &Credits &Remerciements
+menutrans Co&pying &License
+menutrans &Sponsor/Register Sponsor/&Enregistrement
+menutrans O&rphans &Orphelins
+" -sep2-
+menutrans &Version &Version
+menutrans &About \ &propos\ de\ Vim
+
+let g:menutrans_help_dialog = "Entrez une commande ou un mot rechercher dans l'aide.\n\nAjoutez i_ pour les commandes du mode Insertion (ex: i_CTRL-X)\nAjoutez c_ pour l'dition de la ligne de commande (ex: c_<Del>)\nEntourez les options avec des apostrophes (ex: 'shiftwidth')"
+
+
+menutrans &File &Fichier
+
+menutrans &Open\.\.\.<Tab>:e &Ouvrir\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Ouvrir\ \ p&art\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Ouvrir\ dans\ un\ onglet\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nouveau<Tab>:enew
+menutrans &Close<Tab>:close &Fermer<Tab>:close
+" -SEP1-
+menutrans &Save<Tab>:w &Enregistrer<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Enregistrer\ &sous\.\.\.<Tab>:sav
+" -SEP2-
+menutrans Split\ &Diff\ with\.\.\. &Diffrence\ avec\.\.\.
+"menutrans Split\ Patched\ &By\.\.\. &Patcher\ avec\.\.\.
+menutrans Split\ Patched\ &By\.\.\. &Tester\ un\ patch\.\.\.
+" -SEP3-
+menutrans &Print &Imprimer
+" -SEP4-
+menutrans Sa&ve-Exit<Tab>:wqa En&registrer\ et\ quitter<Tab>:wqa
+menutrans E&xit<Tab>:qa &Quitter<Tab>:qa
+
+
+menutrans &Edit &Edition
+
+menutrans &Undo<Tab>u &Annuler<Tab>u
+menutrans &Redo<Tab>^R Re&faire<Tab>^R
+menutrans Rep&eat<Tab>\. R&pter<Tab>\.
+" -SEP1-
+menutrans Cu&t<Tab>"+x Co&uper<Tab>"+x
+menutrans &Copy<Tab>"+y Cop&ier<Tab>"+y
+menutrans &Paste<Tab>"+gP C&oller<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Placer\ a&vant<Tab>[p
+menutrans Put\ &After<Tab>]p Placer\ apr&s<Tab>]p
+menutrans &Delete<Tab>x Effa&cer<Tab>x
+menutrans &Select\ All<Tab>ggVG &Slectionner\ tout<Tab>ggVG
+" -SEP2-
+menutrans &Find\.\.\. Rec&hercher\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Re&mplacer\.\.\.
+menutrans &Find<Tab>/ Rec&hercher<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s Re&mplacer<Tab>:%s
+menutrans Find\ and\ Rep&lace<Tab>:s Re&mplacer<Tab>:s
+" -SEP3-
+menutrans Settings\ &Window Fe&ntre\ des\ rglages
+menutrans Startup\ &Settings Rglages\ de\ &lancement
+menutrans &Global\ Settings Rglages\ globau&x
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Surligner\ recherche\ on/off<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ case<Tab>:set\ ic! &Ignorer\ casse\ on/off<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Vrifier\ parenth&ses\ on/off<Tab>:set\ sm!
+
+menutrans &Context\ lines Lignes\ &autour\ du\ curseur
+
+menutrans &Virtual\ Edit dition\ &virtuelle
+menutrans Never &Jamais
+menutrans Block\ Selection &Slection\ en\ bloc
+menutrans Insert\ mode &Mode\ insertion
+menutrans Block\ and\ Insert &Bloc\ et\ insertion
+menutrans Always &Toujours
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! I&nsertion\ permanente\ on/off<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! &Compatibilit\ Vi\ on/off<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Chemin\ de\ rec&herche\ des\ fichiers\.\.\.
+menutrans Ta&g\ Files\.\.\. Fichiers\ d'&tiquettes\.\.\.
+" -SEP1-
+menutrans Toggle\ &Toolbar Barre\ d'&outils\ on/off
+menutrans Toggle\ &Bottom\ Scrollbar Ascenseur\ &horizontal\ on/off
+menutrans Toggle\ &Left\ Scrollbar Ascenseur\ \ ga&uche\ on/off
+menutrans Toggle\ &Right\ Scrollbar Ascenseur\ \ &droite\ on/off
+
+let g:menutrans_path_dialog = "Entrez le chemin de recherche des fichiers.\nSparez les rpertoires par des virgules."
+let g:menutrans_tags_dialog = "Entrez les noms des fichiers d'tiquettes.\nSparez les noms par des virgules."
+
+menutrans F&ile\ Settings Rglages\ fichie&r
+
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Numrotation\ on/off<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! &Numrotation\ relative\ on/off<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Mode\ &listing\ on/off<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! &Retour\ \ la\ ligne\ on/off<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! Retour\ sur\ &mot\ on/off<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et! &Tab\.\ en\ espaces\ on/off<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! Indentation\ &auto\.\ on/off<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! Indent\.\ langage\ &C\ on/off<Tab>:set\ cin!
+" -SEP2-
+menutrans &Shiftwidth Largeur\ des\ in&dentations
+menutrans Soft\ &Tabstop &Pseudo-tabulations
+menutrans Te&xt\ Width\.\.\. Largeur\ du\ te&xte\.\.\.
+menutrans &File\ Format\.\.\. Format\ du\ &fichier\.\.\.
+
+let g:menutrans_textwidth_dialog = "Entrez la nouvelle largeur du texte\n(0 pour dsactiver le formatage)."
+let g:menutrans_fileformat_dialog = "Choisissez le format dans lequel crire le fichier."
+let g:menutrans_fileformat_choices = " &Unix \n &Dos \n &Mac \n &Annuler "
+
+menutrans C&olor\ Scheme &Jeu\ de\ couleurs
+menutrans Show\ C&olor\ Schemes\ in\ Menu Afficher\ les\ &jeux\ de\ couleurs
+menutrans &Keymap &Type\ de\ clavier
+menutrans Show\ &Keymaps\ in\ Menu Afficher\ les\ &types\ de\ clavier
+menutrans None (aucun)
+menutrans Select\ Fo&nt\.\.\. Slectionner\ &police\.\.\.
+
+
+menutrans &Tools &Outils
+
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Atteindre\ cette\ tiquette<Tab>g^]
+menutrans Jump\ &back<Tab>^T Repartir\ en\ arri&re<Tab>^T
+menutrans Build\ &Tags\ File &Gnrer\ fichier\ d'tiquettes
+
+" -SEP1-
+menutrans &Spelling &Orthographe
+menutrans &Spell\ Check\ On &Activer
+menutrans Spell\ Check\ &Off &Dsactiver
+menutrans To\ &Next\ error<Tab>]s \ l'erreur\ &suivante<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s \ l'erreur\ &prcdente<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Suggrer\ &correction<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall &Reporter\ la\ correction<Tab>:spellrepall
+
+an 40.335.205 &Tools.&Spelling.Dictionnaire\ &franais\ (fr) :set spl=fr spell<CR>
+menutrans Set\ language\ to\ "en" Dictionnaire\ &anglais\ (en)
+menutrans Set\ language\ to\ "en_au" Dictionnaire\ anglais\ (en_au)
+menutrans Set\ language\ to\ "en_ca" Dictionnaire\ anglais\ (en_ca)
+menutrans Set\ language\ to\ "en_gb" Dictionnaire\ anglais\ (en_gb)
+menutrans Set\ language\ to\ "en_nz" Dictionnaire\ anglais\ (en_nz)
+menutrans Set\ language\ to\ "en_us" Dictionnaire\ anglais\ (en_us)
+
+menutrans &Find\ More\ Languages &Trouver\ d'autres\ langues
+
+let g:menutrans_set_lang_to = "Dictionnaire "
+
+
+menutrans &Folding &Replis
+
+menutrans &Enable/Disable\ folds<Tab>zi &Replis\ on/off<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv D&plier\ ligne\ curseur<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Tout\ plier\ &sauf\ ligne\ curseur<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Fermer\ &plus\ de\ replis<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM F&ermer\ tous\ les\ replis<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr Ouvrir\ pl&us\ de\ replis<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR &Ouvrir\ tous\ les\ replis<Tab>zR
+" -SEP1-
+menutrans Fold\ Met&hod &Mthode\ de\ repli
+
+menutrans M&anual &Manuelle
+menutrans I&ndent &Indentation
+menutrans E&xpression &Expression
+menutrans S&yntax &Syntaxe
+menutrans &Diff &Diffrence
+menutrans Ma&rker Ma&rqueurs
+
+menutrans Create\ &Fold<Tab>zf &Crer\ repli<Tab>zf
+menutrans &Delete\ Fold<Tab>zd E&ffacer\ repli<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Effacer\ &tous\ les\ replis<Tab>zD
+" -SEP2-
+menutrans Fold\ col&umn\ width &Largeur\ colonne\ replis
+
+menutrans &Diff &Diffrence
+
+menutrans &Update &Mettre\ \ jour
+menutrans &Get\ Block Corriger\ &ce\ tampon
+menutrans &Put\ Block Corriger\ l'&autre\ tampon
+
+" -SEP2-
+menutrans &Make<Tab>:make Lancer\ ma&ke<Tab>:make
+menutrans &List\ Errors<Tab>:cl Lister\ &erreurs<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Lister\ &messages<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Erreur\ &suivante<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Erreur\ pr&cdente<Tab>:cp
+"menutrans &Older\ List<Tab>:cold A&ncienne\ liste<Tab>:cold
+menutrans &Older\ List<Tab>:cold Liste\ &prcdente<Tab>:cold
+"menutrans N&ewer\ List<Tab>:cnew No&uvelle\ liste<Tab>:cnew
+menutrans N&ewer\ List<Tab>:cnew Liste\ suivan&te<Tab>:cnew
+
+menutrans Error\ &Window &Fentre\ d'erreurs
+
+menutrans &Update<Tab>:cwin &Mettre\ \ jour<Tab>:cwin
+menutrans &Open<Tab>:copen &Ouvrir<Tab>:copen
+menutrans &Close<Tab>:cclose &Fermer<Tab>:cclose
+
+" -SEP3-
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Convertir\ en\ he&xa<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Dcon&vertir<Tab>:%!xxd\ -r
+
+menutrans Se&T\ Compiler &Type\ de\ compilateur
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu &Afficher\ les\ compilateurs
+
+
+menutrans &Buffers &Tampons
+
+menutrans Dummy Factice
+menutrans &Refresh\ menu &Mettre\ ce\ menu\ \ jour
+menutrans &Delete &Effacer
+menutrans &Alternate &Alterner
+menutrans &Next &Suivant
+menutrans &Previous &Prcdent
+" -SEP-
+
+menutrans &others au&tres
+menutrans &u-z &uvwxyz
+let g:menutrans_no_file = "[Aucun fichier]"
+
+
+menutrans &Window Fe&ntre
+
+menutrans &New<Tab>^Wn &Nouvelle\ fentre<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Fractionner<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Fractionner\ p&our\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Fractionner\ &verticalement<Tab>^Wv
+menutrans Split\ File\ E&xplorer Fractionner\ &explorateur
+" -SEP1-
+menutrans &Close<Tab>^Wc Fer&mer<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Fermer\ les\ &autres<Tab>^Wo
+" -SEP2-
+menutrans Move\ &To &Dplacer\ vers\ le
+
+menutrans &Top<Tab>^WK &Haut<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Bas<Tab>^WJ
+menutrans &Left\ side<Tab>^WH Ct\ &gauche<Tab>^WH
+menutrans &Right\ side<Tab>^WL Ct\ &droit<Tab>^WL
+
+menutrans Rotate\ &Up<Tab>^WR Rotation\ vers\ le\ &haut<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotation\ vers\ le\ &bas<Tab>^Wr
+" -SEP3-
+menutrans &Equal\ Size<Tab>^W= galiser\ ta&illes<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Hau&teur\ maximale<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Ha&uteur\ minimale<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| &Largeur\ maximale<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| La&rgeur\ minimale<Tab>^W1\|
+
+
+" PopUp
+
+menutrans &Undo &Annuler
+" -SEP1-
+menutrans Cu&t Co&uper
+menutrans &Copy Cop&ier
+menutrans &Paste C&oller
+" &Buffers.&Delete overwrites this one
+menutrans &Delete &Effacer
+" -SEP2-
+menutrans Select\ Blockwise Slectionner\ &bloc
+menutrans Select\ &Word Slectionner\ &mot
+menutrans Select\ &Sentence Slectionner\ &phrase
+menutrans Select\ Pa&ragraph Slectionner\ pa&ragraphe
+menutrans Select\ &Line Slectionner\ &ligne
+menutrans Select\ &Block Slectionner\ &bloc
+menutrans Select\ &All Slectionner\ &tout
+
+let g:menutrans_spell_change_ARG_to = 'Remplacer\ "%s"\ par'
+let g:menutrans_spell_add_ARG_to_word_list = 'Ajouter\ "%s"\ au\ dictionnaire'
+let g:menutrans_spell_ignore_ARG = 'Ignorer\ "%s"'
+
+" ToolBar
+
+menutrans Open Ouvrir
+menutrans Save Enreg
+menutrans SaveAll EnregTout
+menutrans Print Imprimer
+" -sep1-
+menutrans Undo Annuler
+menutrans Redo Refaire
+" -sep2-
+menutrans Cut Couper
+menutrans Copy Copier
+menutrans Paste Coller
+" -sep3-
+menutrans Find Chercher
+menutrans FindNext CherchSuiv
+menutrans FindPrev CherchPrec
+menutrans Replace Remplacer
+" -sep4-
+menutrans New Nouvelle
+menutrans WinSplit FenFract
+menutrans WinMax FenMax
+menutrans WinMin FenMin
+menutrans WinVSplit FenVFract
+menutrans WinMaxWidth FenMaxLarg
+menutrans WinMinWidth FenMinLarg
+menutrans WinClose FenFerme
+" -sep5-
+menutrans LoadSesn OuvrirSess
+menutrans SaveSesn EnregSess
+menutrans RunScript LancScript
+" -sep6-
+menutrans Make Make
+menutrans RunCtags CrerEtiqu
+menutrans TagJump AllerEtiqu
+" -sep7-
+menutrans Help Aide
+menutrans FindHelp CherchAide
+
+fun! Do_toolbar_tmenu()
+ let did_toolbar_tmenu = 1
+ tmenu ToolBar.Open Ouvrir fichier
+ tmenu ToolBar.Save Enregistrer fichier courant
+ tmenu ToolBar.SaveAll Enregistrer tous les fichiers
+ tmenu ToolBar.Print Imprimer
+ tmenu ToolBar.Undo Annuler
+ tmenu ToolBar.Redo Refaire
+ tmenu ToolBar.Cut Couper
+ tmenu ToolBar.Copy Copier
+ tmenu ToolBar.Paste Coller
+ if !has("gui_athena")
+ tmenu ToolBar.Find Rechercher
+ tmenu ToolBar.FindNext Chercher suivant
+ tmenu ToolBar.FindPrev Chercher prcdent
+ tmenu ToolBar.Replace Remplacer
+ endif
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nouvelle fentre
+ tmenu ToolBar.WinSplit Fractionner fentre
+ tmenu ToolBar.WinMax Maximiser fentre
+ tmenu ToolBar.WinMin Minimiser fentre
+ tmenu ToolBar.WinVSplit Fractionner verticalement
+ tmenu ToolBar.WinMaxWidth Maximiser largeur fentre
+ tmenu ToolBar.WinMinWidth Minimiser largeur fentre
+ tmenu ToolBar.WinClose Fermer fentre
+ endif
+ tmenu ToolBar.LoadSesn Ouvrir session
+ tmenu ToolBar.SaveSesn Enregistrer session courante
+ tmenu ToolBar.RunScript Lancer un script Vim
+ tmenu ToolBar.Make Lancer make
+ tmenu ToolBar.RunCtags Crer les tiquettes
+ tmenu ToolBar.TagJump Atteindre cette tiquette
+ tmenu ToolBar.Help Aide de Vim
+ tmenu ToolBar.FindHelp Rechercher dans l'aide
+endfun
+
+
+menutrans &Syntax &Syntaxe
+
+menutrans &Off Dsactiver
+menutrans &Manual &Manuelle
+menutrans A&utomatic &Automatique
+menutrans on/off\ for\ &This\ file On/off\ pour\ &ce\ fichier
+
+" The Start Of The Syntax Menu
+menutrans ABC\ music\ notation ABC\ (notation\ musicale)
+menutrans AceDB\ model Modle\ AceDB
+menutrans Apache\ config Config\.\ Apache
+menutrans Apache-style\ config Config\.\ style\ Apache
+menutrans ASP\ with\ VBScript ASP\ avec\ VBScript
+menutrans ASP\ with\ Perl ASP\ avec\ Perl
+menutrans Assembly Assembleur
+menutrans BC\ calculator Calculateur\ BC
+menutrans BDF\ font Fonte\ BDF
+menutrans BIND\ config Config\.\ BIND
+menutrans BIND\ zone Zone\ BIND
+menutrans Cascading\ Style\ Sheets Feuilles\ de\ style\ en\ cascade
+menutrans Cfg\ Config\ file Fichier\ de\ config\.\ \.cfg
+menutrans Cheetah\ template Patron\ Cheetah
+menutrans commit\ file Fichier\ commit
+menutrans Generic\ Config\ file Fichier\ de\ config\.\ gnrique
+menutrans Digital\ Command\ Lang DCL
+menutrans DNS/BIND\ zone Zone\ BIND/DNS
+menutrans Dylan\ interface Interface
+menutrans Dylan\ lid LID
+menutrans Elm\ filter\ rules Rgles\ de\ filtrage\ Elm
+menutrans ERicsson\ LANGuage Erlang\ (langage\ Ericsson)
+menutrans Essbase\ script Script\ Essbase
+menutrans Eterm\ config Config\.\ Eterm
+menutrans Exim\ conf Config\.\ Exim
+menutrans Fvwm\ configuration Config\.\ Fvwm
+menutrans Fvwm2\ configuration Config\.\ Fvwm2
+menutrans Fvwm2\ configuration\ with\ M4 Config\.\ Fvwm2\ avec\ M4
+menutrans GDB\ command\ file Fichier\ de\ commandes\ GDB
+menutrans HTML\ with\ M4 HTML\ avec\ M4
+menutrans Cheetah\ HTML\ template Patron\ Cheetah\ pour\ HTML
+menutrans IDL\Generic\ IDL IDL\IDL\ gnrique
+menutrans IDL\Microsoft\ IDL IDL\IDL\ Microsoft
+menutrans Indent\ profile Profil\ Indent
+menutrans Inno\ setup Config\.\ Inno
+menutrans InstallShield\ script Script\ InstallShield
+menutrans KDE\ script Script\ KDE
+menutrans LFTP\ config Config\.\ LFTP
+menutrans LifeLines\ script Script\ LifeLines
+menutrans Lynx\ Style Style\ Lynx
+menutrans Lynx\ config Config\.\ Lynx
+menutrans Man\ page Page\ Man
+menutrans MEL\ (for\ Maya) MEL\ (pour\ Maya)
+menutrans 4DOS\ \.bat\ file Fichier\ \.bat\ 4DOS
+menutrans \.bat\/\.cmd\ file Fichier\ \.bat\ /\ \.cmd
+menutrans \.ini\ file Fichier\ \.ini
+menutrans Module\ Definition Dfinition\ de\ module
+menutrans Registry Extrait\ du\ registre
+menutrans Resource\ file Fichier\ de\ ressources
+menutrans Novell\ NCF\ batch Batch\ Novell\ NCF
+menutrans NSIS\ script Script\ NSIS
+menutrans Oracle\ config Config\.\ Oracle
+menutrans Palm\ resource\ compiler Compil\.\ de\ resources\ Palm
+menutrans PHP\ 3-4 PHP\ 3\ et\ 4
+menutrans Postfix\ main\ config Config\.\ Postfix
+menutrans Povray\ scene\ descr Scne\ Povray
+menutrans Povray\ configuration Config\.\ Povray
+menutrans Purify\ log Log\ Purify
+menutrans Readline\ config Config\.\ Readline
+menutrans RCS\ log\ output Log\ RCS
+menutrans RCS\ file Fichier\ RCS
+menutrans RockLinux\ package\ desc\. Desc\.\ pkg\.\ RockLinux
+menutrans Samba\ config Config\.\ Samba
+menutrans SGML\ catalog Catalogue\ SGML
+menutrans SGML\ DTD DTD\ SGML
+menutrans SGML\ Declaration Dclaration\ SGML
+menutrans Shell\ script Script\ shell
+menutrans sh\ and\ ksh sh\ et\ ksh
+menutrans Sinda\ compare Comparaison\ Sinda
+menutrans Sinda\ input Entre\ Sinda
+menutrans Sinda\ output Sortie\ Sinda
+menutrans SKILL\ for\ Diva SKILL\ pour\ Diva
+menutrans Smarty\ Templates Patrons\ Smarty
+menutrans SNNS\ network Rseau\ SNNS
+menutrans SNNS\ pattern Motif\ SNNS
+menutrans SNNS\ result Rsultat\ SNNS
+menutrans Snort\ Configuration Config\.\ Snort
+menutrans Squid\ config Config\.\ Squid
+menutrans Subversion\ commit Commit\ Subversion
+menutrans TAK\ compare Comparaison\ TAK
+menutrans TAK\ input Entre\ TAK
+menutrans TAK\ output Sortie\ TAK
+menutrans TeX\ configuration Config\.\ TeX
+menutrans TF\ mud\ client TF\ (client\ MUD)
+menutrans Tidy\ configuration Config\.\ Tidy
+menutrans Trasys\ input Entre\ Trasys
+menutrans Command\ Line Ligne\ de\ commande
+menutrans Geometry Gomtrie
+menutrans Optics Optiques
+menutrans Vim\ help\ file Fichier\ d'aide\ Vim
+menutrans Vim\ script Script\ Vim
+menutrans Viminfo\ file Fichier\ Viminfo
+menutrans Virata\ config Config\.\ Virata
+menutrans Wget\ config Config\.\ wget
+menutrans Whitespace\ (add) Espaces\ et\ tabulations
+menutrans WildPackets\ EtherPeek\ Decoder Dcodeur\ WildPackets\ EtherPeek
+menutrans X\ resources Resources\ X
+menutrans XXD\ hex\ dump Sortie\ hexa\.\ de\ xxd
+menutrans XFree86\ Config Config\.\ XFree86
+" The End Of The Syntax Menu
+
+menutrans &Show\ file\ types\ in\ menu &Afficher\ tout\ le\ menu
+" -SEP1-
+menutrans Set\ '&syntax'\ only Changer\ '&syntax'\ seulement
+menutrans Set\ '&filetype'\ too Changer\ '&filetype'\ aussi
+menutrans &Off &Off
+" -SEP3-
+menutrans Co&lor\ test Tester\ les\ co&uleurs
+menutrans &Highlight\ test Tester\ les\ g&roupes\ de\ surbrillance
+menutrans &Convert\ to\ HTML Con&vertir\ en\ HTML
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_fr_fr.utf-8.vim b/runtime/lang/menu_fr_fr.utf-8.vim
new file mode 100644
index 0000000..5e41906
--- /dev/null
+++ b/runtime/lang/menu_fr_fr.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: French for UTF-8 encoding
+
+source <sfile>:p:h/menu_fr_fr.latin1.vim
diff --git a/runtime/lang/menu_french_france.1252.vim b/runtime/lang/menu_french_france.1252.vim
new file mode 100644
index 0000000..2c5ddb5
--- /dev/null
+++ b/runtime/lang/menu_french_france.1252.vim
@@ -0,0 +1,3 @@
+" Menu Translations: French for Windows CodePage 1252 encoding
+
+source <sfile>:p:h/menu_fr_fr.latin1.vim
diff --git a/runtime/lang/menu_german_germany.1252.vim b/runtime/lang/menu_german_germany.1252.vim
new file mode 100644
index 0000000..f40d6b5
--- /dev/null
+++ b/runtime/lang/menu_german_germany.1252.vim
@@ -0,0 +1,3 @@
+" Menu Translations: German for Windows CodePage 1252 encoding
+
+source <sfile>:p:h/menu_de_de.latin1.vim
diff --git a/runtime/lang/menu_hu.iso_8859-2.vim b/runtime/lang/menu_hu.iso_8859-2.vim
new file mode 100644
index 0000000..cd21d10
--- /dev/null
+++ b/runtime/lang/menu_hu.iso_8859-2.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Italian for UTF-8 encoding
+
+source <sfile>:p:h/menu_hu_hu.iso_8859-2.vim
diff --git a/runtime/lang/menu_hu.utf-8.vim b/runtime/lang/menu_hu.utf-8.vim
new file mode 100644
index 0000000..2dd35ef
--- /dev/null
+++ b/runtime/lang/menu_hu.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Italian for UTF-8 encoding
+
+source <sfile>:p:h/menu_hu_hu.utf-8.vim
diff --git a/runtime/lang/menu_hu_hu.iso_8859-2.vim b/runtime/lang/menu_hu_hu.iso_8859-2.vim
new file mode 100644
index 0000000..6917417
--- /dev/null
+++ b/runtime/lang/menu_hu_hu.iso_8859-2.vim
@@ -0,0 +1,248 @@
+" Menu Translations: Hungarian (Magyar)
+" Original Translation: Zoltn rpdffy
+" Maintained By: Kontra Gergely <kgergely@mcl.hu>
+" Last Change: 2020 Apr 23
+"
+" This file was converted from menu_hu_hu.iso_8859-2.vim. See there for
+" remarks.
+" Generated from menu_hu_hu.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding iso-8859-2
+
+" Help menu
+menutrans &Help &Sg
+menutrans &Overview<Tab><F1> &ttekints<Tab><F1>
+menutrans &How-to\ links &HOGYAN\ linkek
+menutrans &User\ Manual &Kziknyv
+menutrans &Credits &Szerzk,\ ksznetek
+menutrans Co&pying &Vdjegy
+menutrans O&rphans rv&k
+menutrans &Find\.\.\. Ke&ress\.\.\.
+menutrans &Version &Verzi
+menutrans &About &Nvjegy
+" File menu
+menutrans &File &Fjl
+menutrans &Open\.\.\.<Tab>:e Meg&nyits\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Megnyits\ j\ a&blakba\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew j\ dok&umentum<Tab>:enew
+menutrans &Close<Tab>:close Be&zrs<Tab>:close
+menutrans &Save<Tab>:w &Ments<Tab>:w
+menutrans Split\ &Diff\ with\.\.\. ssze&hasonlts\.\.\.
+menutrans Split\ Patched\ &By\.\.\. sszehasonlts\ &patch\ -el\.\.\.
+menutrans Save\ &As\.\.\.<Tab>:sav Ment&s\ msknt\.\.\.<Tab>:w
+menutrans &Print Nyomt&ats
+menutrans Sa&ve-Exit<Tab>:wqa Ments\ s\ k&ilps<Tab>:wqa
+menutrans E&xit<Tab>:qa &Kilps<Tab>:qa
+
+" Edit menu
+menutrans &Edit S&zerkeszts
+menutrans &Undo<Tab>u &Visszavons<Tab>u
+menutrans &Redo<Tab>^R M&gis<Tab>^R
+menutrans Rep&eat<Tab>\. &Ismt<Tab>\.
+menutrans Cu&t<Tab>"+x &Kivgs<Tab>"+x
+menutrans &Copy<Tab>"+y &Msols<Tab>"+y
+menutrans &Paste<Tab>"+gP &Beilleszts<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Beraks\ e&l<Tab>[p
+menutrans Put\ &After<Tab>]p Beraks\ &mg<Tab>]p
+menutrans &Delete<Tab>x &Trls<Tab>x
+menutrans &Select\ all<Tab>ggVG A&z\ sszes\ kijellse<Tab>ggvG
+menutrans &Find\.\.\. Ke&ress\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Keress\ s\ c&sere\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s Keress\ s\ c&sere<Tab>:%s
+menutrans Find\ and\ Rep&lace Keress\ s\ c&sere
+menutrans Find\ and\ Rep&lace<Tab>:s Keress\ s\ c&sere<Tab>:s
+menutrans Settings\ &Window &Ablak\ belltsai
+menutrans &Global\ Settings l&talnos\ belltsok
+menutrans F&ile\ Settings &Fjl\ belltsok
+menutrans C&olor\ Scheme &Sznek
+menutrans &Keymap Billent&yzetkioszts
+
+" Edit.Global Settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Minta\ kiemels\ BE/KI<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Kis/nagybet\ azonos/klnbz<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! &Zrjelpr\ mutatsa\ BE/KI<Tab>:set\ sm!
+menutrans &Context\ lines &Kurzor\ ablak\ szltl
+menutrans &Virtual\ Edit &Virtulis\ szerkeszts
+menutrans Never &Soha
+menutrans Block\ Selection &Blokk\ kijellsekor
+menutrans Insert\ mode S&zveg\ bevitelekor
+menutrans Block\ and\ Insert Bl&okk\ kijellsekor\ s\ szveg\ bevitelekor
+menutrans Always &Mindig
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! &Szvegbeviteli\ md\ BE/KI<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! &Vi\ kompatbilis\ md\ BE/Ki<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Ke&ressi\ tvonal\.\.\.
+menutrans Ta&g\ Files\.\.\. &Tag\ fjl\.\.\.
+menutrans Toggle\ &Toolbar &Eszkztr\ BE/KI
+menutrans Toggle\ &Bottom\ Scrollbar &Vzszintes\ Grgetsv\ BE/KI
+menutrans Toggle\ &Left\ Scrollbar &Bal\ grgetsv\ BE/KI
+menutrans Toggle\ &Right\ Scrollbar &Jobb\ grgetsv\ BE/KI
+menutrans None Nincs
+
+" Edit.File Settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Sorsz&mozs\ BE/KI<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! &Lista\ md\ BE/KI<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Sor&trs\ BE/KI<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Sortrs\ s&zvgeknl\ BE/KI<tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! &Tab\ kifejts\ BE/KI<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! &Automatikus\ behzs\ BE/KI<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! &C-behzs\ BE/KI<Tab>:set\ cin!
+menutrans &Shiftwidth &Behzs\ mrtke\ ('sw')
+menutrans Soft\ &Tabstop T&abulls\ mrtke\ ('sts')
+menutrans Te&xt\ Width\.\.\. &Szveg\ szlessge\.\.\.
+menutrans &File\ Format\.\.\. &Fjlformtum\.\.\.
+
+" Tools menu
+menutrans &Tools &Eszkzk
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Ugrs\ a\ taghoz<Tab>g^]
+menutrans Jump\ &back<Tab>^T Ugrs\ &vissza<Tab>^T
+menutrans Build\ &Tags\ File &Tag\ fjl\ ksztse
+menutrans &Folding &Behajtsok
+menutrans &Make<Tab>:make &Fordts<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Hibk\ listja<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &zenetek\ listja<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &Kvetkez\ &hiba<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Elz\ hiba<Tab>:cp
+menutrans &Older\ List<Tab>:cold &Rgebbi\ lista<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &jabb\ lista<Tab>:cnew
+menutrans Error\ &Window Hibaablak
+menutrans &Update<Tab>:cwin &Frissts<Tab>:cwin
+menutrans &Open<Tab>:copen M&egnyits<Tab>:copen
+menutrans &Close<Tab>:cclose Be&zrs<Tab>:cclose
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Norml->HEX\ nzet<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r HEX->Norml\ nzet<Tab>:%!xxd\ -r
+menutrans &Set\ Compiler Fordt\ &megadsa
+
+" Tools.Folding
+menutrans &Enable/Disable\ folds<Tab>zi Behajtsok\ BE&/KI<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Aktulis\ sor\ ltszik<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx &Csak\ aktulis\ sor\ ltszik<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Kvetkez\ szint\ be&zrsa<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM sszes\ hajts\ &bezrsa<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr Kvetkez\ szint\ ki&nyitsa<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR sszes\ hajts\ &kinyitsa<Tab>zR
+menutrans Fold\ Met&hod Behajtsok\ &ltrehozsa
+menutrans M&anual &Kzi
+menutrans I&ndent Be&hzs
+menutrans E&xpression Ki&fejezs
+menutrans S&yntax &Szintaxis
+menutrans &Diff &Diff-klnbsg
+menutrans Ma&rker &Jells
+menutrans Create\ &Fold<Tab>zf &j\ behajts<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Behajts\ &trlse<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD ss&zes\ behajts\ trlse<Tab>zD
+menutrans Fold\ col&umn\ width Behajtsok\ a\ &margn\ x\ oszlopban
+
+" Tools.Diff
+menutrans &Update &Frissts
+menutrans &Get\ Block Block\ &BE
+menutrans &Put\ Block Block\ &KI
+
+
+
+" Names for buffer menu.
+menutrans &Buffers &Pufferok
+menutrans &Refresh\ menu &Frissts
+menutrans Delete &Trls
+menutrans &Alternate &Csere
+menutrans &Next &Kvetkez
+menutrans &Previous &Elz
+
+" Window menu
+menutrans &Window &Ablak
+menutrans &New<Tab>^Wn &j<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Feloszts<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Feloszts\ &#-val<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Feloszts\ F&gglegesen<Tab>^Wv
+menutrans Split\ File\ E&xplorer j\ &intz
+menutrans &Close<Tab>^Wc Be&zrs<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo &Tbbi\ bezrsa<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Kvetkez<Tab>^Ww
+menutrans P&revious<Tab>^WW &Elz<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Azonos\ magassg<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Ma&x\ magassg<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ &Min\ magassg<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Max\ &szlessg<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Mi&n\ szlessg<Tab>^W1\|
+menutrans Move\ &To &Elmozdts
+menutrans &Top<Tab>^WK &Fel<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Le<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Balra<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Jobbra<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Grdts\ &felfel<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Grdts\ &lefel<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. &Bettpus\.\.\.
+
+" The popup menu
+menutrans &Undo &Visszavons
+menutrans Cu&t &Kivgs
+menutrans &Copy &Msols
+menutrans &Paste &Beilleszts
+menutrans &Delete &Trls
+menutrans Select\ Blockwise Kijells\ blo&kknt
+menutrans Select\ &Word S&z\ kijellse
+menutrans Select\ &Line &Sor\ kijellse
+menutrans Select\ &Block B&lokk\ kijellse
+menutrans Select\ &All A&z\ sszes\ kijellse
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Megnyits
+ tmenu ToolBar.Save Ments
+ tmenu ToolBar.SaveAll Mindet menti
+ tmenu ToolBar.Print Nyomtats
+ tmenu ToolBar.Undo Visszavons
+ tmenu ToolBar.Redo Mgis
+ tmenu ToolBar.Cut Kivgs
+ tmenu ToolBar.Copy Msols
+ tmenu ToolBar.Paste Beilleszts
+ tmenu ToolBar.Find Keress
+ tmenu ToolBar.FindNext Tovbb keress
+ tmenu ToolBar.FindPrev Keress visszafel
+ tmenu ToolBar.Replace Keress/csere
+ tmenu ToolBar.LoadSesn Munkamenet beolvass
+ tmenu ToolBar.SaveSesn Munkamenet ments
+ tmenu ToolBar.RunScript Vim program indts
+ tmenu ToolBar.Make Projekt pts
+ tmenu ToolBar.Shell Shell indts
+ tmenu ToolBar.RunCtags Tag pts
+ tmenu ToolBar.TagJump Ugrs a kurzor alatti tagra
+ tmenu ToolBar.Help Vim sg
+ tmenu ToolBar.FindHelp Keress a Vim sgban
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax Sz&intaxis
+menutrans &Show\ filetypes\ in\ menu Fjl&tpusok\ men
+menutrans Set\ '&syntax'\ only Csak\ '&syntax'
+menutrans Set\ '&filetype'\ too '&filetype'\ is
+menutrans &Off &Ki
+menutrans &Manual K&zi
+menutrans A&utomatic A&utomatikus
+menutrans on/off\ for\ &This\ file &BE/KI\ ennl\ a\ fjlnl
+menutrans Co&lor\ test &Sznteszt
+menutrans &Highlight\ test Kiemels\ &teszt
+menutrans &Convert\ to\ HTML &HTML\ oldal\ ksztse
+
+" dialog texts
+let menutrans_no_file = "[Nincs file]"
+let menutrans_help_dialog = "rd be a kvnt szt vagy parancsot:\n\n A szvegbeviteli parancsok el rj i_-t (pl.: i_CTRL-X)\nA sorszerkesz parancsok el c_-t (pl.: c_<Del>)\nA vltozkat a ' jellel vedd krl (pl.: 'shiftwidth')"
+let g:menutrans_path_dialog = "rd be a keresett fjl lehetsges elrsi tjait, vesszvel elvlasztva"
+let g:menutrans_tags_dialog = "rd be a tag fjl lehetsges elrsi tjait, vesszvel elvlasztva"
+let g:menutrans_textwidth_dialog = "rd be a szveg szlessgt (0 = formzs kikapcsolva)"
+let g:menutrans_fileformat_dialog = "Vlaszd ki a fjl formtumt"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_hu_hu.utf-8.vim b/runtime/lang/menu_hu_hu.utf-8.vim
new file mode 100644
index 0000000..b76af0d
--- /dev/null
+++ b/runtime/lang/menu_hu_hu.utf-8.vim
@@ -0,0 +1,248 @@
+" Menu Translations: Hungarian (Magyar)
+" Original Translation: Zoltán Árpádffy
+" Maintained By: Kontra Gergely <kgergely@mcl.hu>
+" Last Change: 2020 Apr 23
+"
+" This file was converted from menu_hu_hu.iso_8859-2.vim. See there for
+" remarks.
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Help menu
+menutrans &Help &Súgó
+menutrans &Overview<Tab><F1> Á&ttekintés<Tab><F1>
+menutrans &How-to\ links &HOGYAN\ linkek
+menutrans &User\ Manual &Kézikönyv
+menutrans &Credits &Szerzők,\ köszönetek
+menutrans Co&pying &Védjegy
+menutrans O&rphans Árvá&k
+menutrans &Find\.\.\. Ke&resés\.\.\.
+menutrans &Version &Verzió
+menutrans &About &Névjegy
+" File menu
+menutrans &File &Fájl
+menutrans &Open\.\.\.<Tab>:e Meg&nyitás\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Megnyitás\ új\ a&blakba\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew Új\ dok&umentum<Tab>:enew
+menutrans &Close<Tab>:close Be&zárás<Tab>:close
+menutrans &Save<Tab>:w &Mentés<Tab>:w
+menutrans Split\ &Diff\ with\.\.\. Össze&hasonlítás\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Összehasonlítás\ &patch\ -el\.\.\.
+menutrans Save\ &As\.\.\.<Tab>:sav Menté&s\ másként\.\.\.<Tab>:w
+menutrans &Print Nyomt&atás
+menutrans Sa&ve-Exit<Tab>:wqa Mentés\ és\ k&ilépés<Tab>:wqa
+menutrans E&xit<Tab>:qa &Kilépés<Tab>:qa
+
+" Edit menu
+menutrans &Edit S&zerkesztés
+menutrans &Undo<Tab>u &Visszavonás<Tab>u
+menutrans &Redo<Tab>^R Mé&gis<Tab>^R
+menutrans Rep&eat<Tab>\. &Ismét<Tab>\.
+menutrans Cu&t<Tab>"+x &Kivágás<Tab>"+x
+menutrans &Copy<Tab>"+y &Másolás<Tab>"+y
+menutrans &Paste<Tab>"+gP &Beillesztés<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Berakás\ e&lé<Tab>[p
+menutrans Put\ &After<Tab>]p Berakás\ &mögé<Tab>]p
+menutrans &Delete<Tab>x &Törlés<Tab>x
+menutrans &Select\ all<Tab>ggVG A&z\ összes\ kijelölése<Tab>ggvG
+menutrans &Find\.\.\. Ke&resés\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Keresés\ és\ c&sere\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s Keresés\ és\ c&sere<Tab>:%s
+menutrans Find\ and\ Rep&lace Keresés\ és\ c&sere
+menutrans Find\ and\ Rep&lace<Tab>:s Keresés\ és\ c&sere<Tab>:s
+menutrans Settings\ &Window &Ablak\ beállításai
+menutrans &Global\ Settings Ál&talános\ beállítások
+menutrans F&ile\ Settings &Fájl\ beállítások
+menutrans C&olor\ Scheme &Színek
+menutrans &Keymap Billent&yűzetkiosztás
+
+" Edit.Global Settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Minta\ kiemelés\ BE/KI<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Kis/nagybetű\ azonos/különböző<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! &Zárójelpár\ mutatása\ BE/KI<Tab>:set\ sm!
+menutrans &Context\ lines &Kurzor\ ablak\ szélétől
+menutrans &Virtual\ Edit &Virtuális\ szerkesztés
+menutrans Never &Soha
+menutrans Block\ Selection &Blokk\ kijelölésekor
+menutrans Insert\ mode S&zöveg\ bevitelekor
+menutrans Block\ and\ Insert Bl&okk\ kijelölésekor\ és\ szöveg\ bevitelekor
+menutrans Always &Mindig
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! &Szövegbeviteli\ mód\ BE/KI<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! &Vi\ kompatíbilis\ mód\ BE/Ki<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Ke&resési\ útvonal\.\.\.
+menutrans Ta&g\ Files\.\.\. &Tag\ fájl\.\.\.
+menutrans Toggle\ &Toolbar &Eszköztár\ BE/KI
+menutrans Toggle\ &Bottom\ Scrollbar &Vízszintes\ Görgetősáv\ BE/KI
+menutrans Toggle\ &Left\ Scrollbar &Bal\ görgetősáv\ BE/KI
+menutrans Toggle\ &Right\ Scrollbar &Jobb\ görgetősáv\ BE/KI
+menutrans None Nincs
+
+" Edit.File Settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Sorszá&mozás\ BE/KI<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! &Lista\ mód\ BE/KI<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Sor&törés\ BE/KI<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Sortörés\ s&zóvégeknél\ BE/KI<tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! &Tab\ kifejtés\ BE/KI<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! &Automatikus\ behúzás\ BE/KI<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! &C-behúzás\ BE/KI<Tab>:set\ cin!
+menutrans &Shiftwidth &Behúzás\ mértéke\ ('sw')
+menutrans Soft\ &Tabstop T&abulálás\ mértéke\ ('sts')
+menutrans Te&xt\ Width\.\.\. &Szöveg\ szélessége\.\.\.
+menutrans &File\ Format\.\.\. &Fájlformátum\.\.\.
+
+" Tools menu
+menutrans &Tools &Eszközök
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Ugrás\ a\ taghoz<Tab>g^]
+menutrans Jump\ &back<Tab>^T Ugrás\ &vissza<Tab>^T
+menutrans Build\ &Tags\ File &Tag\ fájl\ készítése
+menutrans &Folding &Behajtások
+menutrans &Make<Tab>:make &Fordítás<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Hibák\ listája<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Ü&zenetek\ listája<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &Következő\ &hiba<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Előző\ hiba<Tab>:cp
+menutrans &Older\ List<Tab>:cold &Régebbi\ lista<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &Újabb\ lista<Tab>:cnew
+menutrans Error\ &Window Hibaablak
+menutrans &Update<Tab>:cwin &Frissítés<Tab>:cwin
+menutrans &Open<Tab>:copen M&egnyitás<Tab>:copen
+menutrans &Close<Tab>:cclose Be&zárás<Tab>:cclose
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Normál->HEX\ nézet<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r HEX->Normál\ nézet<Tab>:%!xxd\ -r
+menutrans &Set\ Compiler Fordító\ &megadása
+
+" Tools.Folding
+menutrans &Enable/Disable\ folds<Tab>zi Behajtások\ BE&/KI<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Aktuális\ sor\ látszik<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx &Csak\ aktuális\ sor\ látszik<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Következő\ szint\ be&zárása<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Összes\ hajtás\ &bezárása<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr Következő\ szint\ ki&nyitása<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR Összes\ hajtás\ &kinyitása<Tab>zR
+menutrans Fold\ Met&hod Behajtások\ &létrehozása
+menutrans M&anual &Kézi
+menutrans I&ndent Be&húzás
+menutrans E&xpression Ki&fejezés
+menutrans S&yntax &Szintaxis
+menutrans &Diff &Diff-különbség
+menutrans Ma&rker &Jelölés
+menutrans Create\ &Fold<Tab>zf Ú&j\ behajtás<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Behajtás\ &törlése<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Öss&zes\ behajtás\ törlése<Tab>zD
+menutrans Fold\ col&umn\ width Behajtások\ a\ &margón\ x\ oszlopban
+
+" Tools.Diff
+menutrans &Update &Frissítés
+menutrans &Get\ Block Block\ &BE
+menutrans &Put\ Block Block\ &KI
+
+
+
+" Names for buffer menu.
+menutrans &Buffers &Pufferok
+menutrans &Refresh\ menu &Frissítés
+menutrans Delete &Törlés
+menutrans &Alternate &Csere
+menutrans &Next &Következő
+menutrans &Previous &Előző
+
+" Window menu
+menutrans &Window &Ablak
+menutrans &New<Tab>^Wn Ú&j<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Felosztás<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Felosztás\ &#-val<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Felosztás\ Fü&ggőlegesen<Tab>^Wv
+menutrans Split\ File\ E&xplorer Új\ &intéző
+menutrans &Close<Tab>^Wc Be&zárás<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo &Többi\ bezárása<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Következő<Tab>^Ww
+menutrans P&revious<Tab>^WW &Előző<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Azonos\ magasság<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Ma&x\ magasság<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ &Min\ magasság<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Max\ &szélesség<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Mi&n\ szélesség<Tab>^W1\|
+menutrans Move\ &To &Elmozdítás
+menutrans &Top<Tab>^WK &Fel<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Le<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Balra<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Jobbra<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Gördítés\ &felfelé<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Gördítés\ &lefelé<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. &Betűtípus\.\.\.
+
+" The popup menu
+menutrans &Undo &Visszavonás
+menutrans Cu&t &Kivágás
+menutrans &Copy &Másolás
+menutrans &Paste &Beillesztés
+menutrans &Delete &Törlés
+menutrans Select\ Blockwise Kijelölés\ blo&kként
+menutrans Select\ &Word S&zó\ kijelölése
+menutrans Select\ &Line &Sor\ kijelölése
+menutrans Select\ &Block B&lokk\ kijelölése
+menutrans Select\ &All A&z\ összes\ kijelölése
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Megnyitás
+ tmenu ToolBar.Save Mentés
+ tmenu ToolBar.SaveAll Mindet menti
+ tmenu ToolBar.Print Nyomtatás
+ tmenu ToolBar.Undo Visszavonás
+ tmenu ToolBar.Redo Mégis
+ tmenu ToolBar.Cut Kivágás
+ tmenu ToolBar.Copy Másolás
+ tmenu ToolBar.Paste Beillesztés
+ tmenu ToolBar.Find Keresés
+ tmenu ToolBar.FindNext Tovább keresés
+ tmenu ToolBar.FindPrev Keresés visszafelé
+ tmenu ToolBar.Replace Keresés/csere
+ tmenu ToolBar.LoadSesn Munkamenet beolvasás
+ tmenu ToolBar.SaveSesn Munkamenet mentés
+ tmenu ToolBar.RunScript Vim program indítás
+ tmenu ToolBar.Make Projekt építés
+ tmenu ToolBar.Shell Shell indítás
+ tmenu ToolBar.RunCtags Tag építés
+ tmenu ToolBar.TagJump Ugrás a kurzor alatti tagra
+ tmenu ToolBar.Help Vim súgó
+ tmenu ToolBar.FindHelp Keresés a Vim súgóban
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax Sz&intaxis
+menutrans &Show\ filetypes\ in\ menu Fájl&típusok\ menü
+menutrans Set\ '&syntax'\ only Csak\ '&syntax'
+menutrans Set\ '&filetype'\ too '&filetype'\ is
+menutrans &Off &Ki
+menutrans &Manual Ké&zi
+menutrans A&utomatic A&utomatikus
+menutrans on/off\ for\ &This\ file &BE/KI\ ennél\ a\ fájlnál
+menutrans Co&lor\ test &Színteszt
+menutrans &Highlight\ test Kiemelés\ &teszt
+menutrans &Convert\ to\ HTML &HTML\ oldal\ készítése
+
+" dialog texts
+let menutrans_no_file = "[Nincs file]"
+let menutrans_help_dialog = "Írd be a kívánt szót vagy parancsot:\n\n A szövegbeviteli parancsok elé írj i_-t (pl.: i_CTRL-X)\nA sorszerkesző parancsok elé c_-t (pl.: c_<Del>)\nA változókat a ' jellel vedd körül (pl.: 'shiftwidth')"
+let g:menutrans_path_dialog = "Írd be a keresett fájl lehetséges elérési útjait, vesszővel elválasztva"
+let g:menutrans_tags_dialog = "Írd be a tag fájl lehetséges elérési útjait, vesszővel elválasztva"
+let g:menutrans_textwidth_dialog = "Írd be a szöveg szélességét (0 = formázás kikapcsolva)"
+let g:menutrans_fileformat_dialog = "Válaszd ki a fájl formátumát"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_is.latin1.vim b/runtime/lang/menu_is.latin1.vim
new file mode 100644
index 0000000..114bf3b
--- /dev/null
+++ b/runtime/lang/menu_is.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Icelandic for iso-8859-1 encoding
+
+source <sfile>:p:h/menu_is_is.latin1.vim
diff --git a/runtime/lang/menu_is.utf-8.vim b/runtime/lang/menu_is.utf-8.vim
new file mode 100644
index 0000000..1f587f0
--- /dev/null
+++ b/runtime/lang/menu_is.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Icelandic for UTF-8 encoding
+
+source <sfile>:p:h/menu_is_is.latin1.vim
diff --git a/runtime/lang/menu_is_is.latin1.vim b/runtime/lang/menu_is_is.latin1.vim
new file mode 100644
index 0000000..bcb7096
--- /dev/null
+++ b/runtime/lang/menu_is_is.latin1.vim
@@ -0,0 +1,306 @@
+" Menu Translations: Icelandic / slenska
+" Maintainer: Jn Arnar Briem <jonbriem@gmail.com>
+" Originally By: Jn Arnar Briem <jonbriem@gmail.com>
+" Last Change: Sun, 24 Mar 2019 22:40:00 CEST
+" Original translations
+" vim:set foldmethod=marker tabstop=8:
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" The translations below are in latin1, but they work for cp1252 and
+" iso-8859-15 without conversion as well.
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+" {{{ FILE / SKR
+menutrans &File Skr
+menutrans &Open\.\.\.<Tab>:e Opna\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Splitt\ opna\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Opna\ flipa\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew N\ Skr<Tab>:enew
+menutrans &Close<Tab>:close Loka<Tab>:close
+menutrans &Save<Tab>:w Vista<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Vista\ sem\.\.\.<Tab>:sav
+menutrans &Print Prenta
+menutrans Sa&ve-Exit<Tab>:wqa Vista\ og\ Loka<Tab>:wqa
+menutrans E&xit<Tab>:qa Loka<Tab>:qa
+
+if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. Splitt\ opna\ mismun\ vi\.\.\.
+ menutrans Split\ Patched\ &By\.\.\. Splitt\ opna\ plstra\ af\.\.\.
+endif
+" }}} FILE / SKR
+
+" {{{ EDIT / BREYTA
+menutrans &Edit Breyta
+menutrans &Undo<Tab>u Afturkalla<Tab>u
+menutrans &Redo<Tab>^R Endurkalla<Tab>^R
+menutrans Rep&eat<Tab>\. Endurtaka<Tab>\.
+menutrans Cu&t<Tab>"+x Klippa<Tab>"+x
+menutrans &Copy<Tab>"+y Afrita<Tab>"+y
+menutrans &Paste<Tab>"+gP Lma<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Lma\ Fyrir<Tab>[p
+menutrans Put\ &After<Tab>]p Lma\ Eftir<Tab>]p
+menutrans &Delete<Tab>x Eya<Tab>x
+menutrans &Select\ All<Tab>ggVG Velja\ Allt<Tab>ggVG
+menutrans &Find\.\.\. Finna\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Finna\ og\ Skipta\.\.\.
+
+" [-- SETTINGS --]
+menutrans Settings\ &Window Stillingar\ Glugga
+menutrans &Global\ Settings Vvrar\ Stillingar
+menutrans Startup\ &Settings Rsistillingar
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Munsturaukenning\ \/af<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! Hunsa\ h-lgstafi\ \/af<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Sna\ Prun\ \/af<Tab>:set\ sm!
+
+menutrans &Context\ lines Samhengislnur
+
+menutrans &Virtual\ Edit Skinbreytihamur
+menutrans Never Aldrei
+menutrans Block\ Selection Blkval
+menutrans Insert\ mode Innskotshamur
+menutrans Block\ and\ Insert Blkval\ og\ Innskotshamur
+menutrans Always Alltaf
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Innskotshamur\ \/af<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! Vi\ Samhfanleiki\ \/af<Tab>:set\ cp!
+
+menutrans Search\ &Path\.\.\. Leita\ \ Sl\.\.\.
+menutrans Ta&g\ Files\.\.\. Merkja\ Skrr\.\.\.
+
+menutrans Toggle\ &Toolbar Tlabor\ \/af
+menutrans Toggle\ &Bottom\ Scrollbar Neri\ Skrunbori\ \/af
+menutrans Toggle\ &Left\ Scrollbar Vinstri\ Skrunbori\ \/af
+menutrans Toggle\ &Right\ Scrollbar Hgri\ Skrunbori\ \/af
+
+" Edit/File Settings
+menutrans F&ile\ Settings Skrar-Stilingar
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Lnunmering\ \/af<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! Afst\ Lnunmering\ \/af<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Listahamur\ \/af<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! Lnuhlaup\ \/af<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ word<Tab>:set\ lbr! Lnuhlaup\ \ ori\ \/af<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et! Tab-vkkun\ \/af<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! Sjlfvirkur\ Inndrttur\ \/af<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! C-Inndrttur\ \/af<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth Shiftbreidd
+menutrans Soft\ &Tabstop Mjk\ Tabstopp
+menutrans Te&xt\ Width\.\.\. Textabreidd\.\.\.
+menutrans &File\ Format\.\.\. Skrarform\.\.\.
+menutrans C&olor\ Scheme Litaema\.\.\.
+menutrans &Keymap Lyklaskipan
+" }}} EDIT / BREYTA
+
+" {{{ TOOLS / Tl
+if has("spell")
+ menutrans &Spelling Stafsetning
+ menutrans &Spell\ Check\ On Villuleit\
+ menutrans Spell\ Check\ &Off Villuleit\ af
+ menutrans To\ &Next\ error<Tab>]s Nsta\ Villa<Tab>]s
+ menutrans To\ &Previous\ error<Tab>[s Fyrri\ Villa<Tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= Leggja\ til\ Leirttingar<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall Endurtaka\ Leirttingu<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" Stilla\ Orabk\ "en"
+ menutrans Set\ language\ to\ "en_au" Stilla\ Orabk\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" Stilla\ Orabk\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" Stilla\ Orabk\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" Stilla\ Orabk\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" Stilla\ Orabk\ "en_us"
+ menutrans &Find\ More\ Languages Finna\ fleiri\ Orabkur
+endif
+if has("folding")
+ menutrans &Folding Fldun
+ " open close folds
+ menutrans &Enable/Disable\ folds<Tab>zi Fldun\ \/af<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Sj\ Lnu\ Bendils<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Sj\ Eingngu\ Lnu\ Bendils<Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm Loka\ Fleiri\ Fldunum<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Loka\ llum\ Fldunum<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Opna\ Fleiri\ Faldanir<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR Opna\ Allar\ Faldanir<Tab>zR
+ " fold method
+ menutrans Fold\ Met&hod Fldunar-httur
+ menutrans M&anual Handvirkur
+ menutrans I&ndent Inndrttur
+ menutrans E&xpression Seg
+ menutrans S&yntax Mlskipan
+ menutrans &Diff Mismunur
+ menutrans Ma&rker Merking
+ " create and delete folds
+ menutrans Create\ &Fold<Tab>zf Ba\ til\ Fldun<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd Eya\ Fldun<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Eya\ llum\ Fldunum<Tab>zD
+ " moving around in folds
+ menutrans Fold\ Col&umn\ Width Breidd\ Fldunar
+endif " has folding
+
+if has("diff")
+ menutrans &Diff Mismunur
+ menutrans &Update Uppfra
+ menutrans &Get\ Block Skja\ Blk
+ menutrans &Put\ Block Setja\ Blk
+endif
+
+menutrans &Tools Tl
+menutrans &Jump\ to\ this\ tag<Tab>g^] Stkkva\ \ Merki<Tab>g^]
+menutrans Jump\ &back<Tab>^T Stkkva\ til\ baka<Tab>^T
+menutrans Build\ &Tags\ File Ba\ til\ Merkjaskr
+menutrans &Make<Tab>:make Sma<Tab>:make
+menutrans &List\ Errors<Tab>:cl Birta\ Villur<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Birta\ Skilabo<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Nsta\ Villa<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Fyrri\ Villa<Tab>:cp
+menutrans &Older\ List<Tab>:cold Eldri\ Listi<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Nrri\ Listi<Tab>:cnew
+
+menutrans Error\ &Window Villugluggi
+menutrans Se&t\ Compiler Smiur
+menutrans &Update<Tab>:cwin Uppfra<Tab>:cwin
+menutrans &Open<Tab>:copen Opna<Tab>:copen
+menutrans &Close<Tab>:cclose Loka<Tab>:cclose
+
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Breyta\ \ HEX<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Breyta\ til\ baka<Tab>:%!xxd\ -r
+" }}} TOOLS / TL
+
+" {{{ SYNTAX / MLSKIPAN
+menutrans &Syntax Mlskipan
+menutrans &Show\ filetypes\ in\ menu Sna\ Skrartegundir
+menutrans Set\ '&syntax'\ only Stilla\ aeins\ 'mlskipan'\
+menutrans Set\ '&filetype'\ too Stilla\ einnig\ 'skrartegund'\
+menutrans &Off Af
+menutrans &Manual Handvirkt
+menutrans A&utomatic Sjlfvirkt
+menutrans on/off\ for\ &This\ file /af\ fyrir\ essa\ skr
+menutrans Co&lor\ test Litaprfun
+menutrans &Highlight\ test Aukenningarprfun
+menutrans &Convert\ to\ HTML Breyta\ \ HTML
+" }}} SYNTAX / MLSKIPAN
+
+" {{{ BUFFERS / BIMINNI
+menutrans &Buffers Biminni
+menutrans &Refresh\ menu Uppfra\ valmynd
+menutrans Delete Eya
+menutrans &Alternate Skipta
+menutrans &Next Nsta
+menutrans &Previous Fyrra
+" }}} BUFFERS / BIMINNI
+
+" {{{ WINDOW / GLUGGI
+menutrans &Window Gluggi
+menutrans &New<Tab>^Wn Nr<Tab>^Wn
+menutrans S&plit<Tab>^Ws Splitta<Tab>^Ws
+menutrans Split\ &Vertically<Tab>^Wv Splitta\ Lrtt<Tab>^Wv
+menutrans Split\ File\ E&xplorer Splitta\ Skrarvafra
+menutrans Sp&lit\ To\ #<Tab>^W^^ Splitta\ \ Flipa\ #<Tab>^W^^
+menutrans &Close<Tab>^Wc Loka\ Flipa<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Loka\ rum\ Flipum<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww Nsti<Tab>^Ww
+menutrans P&revious<Tab>^WW Fyrri<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= Jafn\ Str<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Hmarksh<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Lgmarksh<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Hmarksbreidd<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Lgmarksbreidd<Tab>^W1\|
+menutrans Move\ &To Fra
+menutrans &Top<Tab>^WK Upp<Tab>^WK
+menutrans &Bottom<Tab>^WJ Niur<Tab>^WJ
+menutrans &Left\ side<Tab>^WH Til\ Vinstri<Tab>^WH
+menutrans &Right\ side<Tab>^WL Til\ Hgri<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Rlla\ upp<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rlla\ niur<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. Velja\ Leturger\.\.\.
+" }}} WINDOW / GLUGGI
+
+" {{{ HELP / HJLP
+menutrans &Help Hjlp
+menutrans &Overview<Tab><F1> Yfirlit<Tab><F1>
+menutrans &User\ Manual Notendahandbk
+menutrans &How-to\ links Hjlparhlekkir
+menutrans &GUI Myndrnt\ Vimt
+menutrans &Credits Hfundar
+menutrans Co&pying Afritun
+menutrans &Sponsor/Register Styrkja/Skrning
+menutrans O&rphans Ggerarstarf
+menutrans &Find\.\.\. Leit\.\.\. " conflicts with Edit.Find
+menutrans &Version tgfa
+menutrans &About Um\ Forriti
+" }}} HELP / HJLP
+
+" {{{ POPUP
+menutrans &Undo Til\ Baka
+menutrans Cu&t Klippa
+menutrans &Copy Afrita
+menutrans &Paste Lma
+menutrans &Delete Eya
+menutrans Select\ Blockwise Velja\ Blkvst
+menutrans Select\ &Word Velja\ Or
+menutrans Select\ &Sentence Velja\ Setningu
+menutrans Select\ Pa&ragraph Velja\ Efnisgrein
+menutrans Select\ &Line Velja\ Lnu
+menutrans Select\ &Block Velja\ Blk
+menutrans Select\ &All Velja\ Allt
+" }}} POPUP
+
+" {{{ TOOLBAR
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Opna Skr
+ tmenu ToolBar.Save Vista Skr
+ tmenu ToolBar.SaveAll Vista Allar Skrr
+ tmenu ToolBar.Print Prenta
+ tmenu ToolBar.Undo Afturkalla
+ tmenu ToolBar.Redo Endurkalla
+ tmenu ToolBar.Cut Klippa
+ tmenu ToolBar.Copy Afrita
+ tmenu ToolBar.Paste Lma
+ tmenu ToolBar.Find Finna...
+ tmenu ToolBar.FindNext Finna Nsta
+ tmenu ToolBar.FindPrev Finna fyrri
+ tmenu ToolBar.Replace Finna og Skipta...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nr
+ tmenu ToolBar.WinSplit Splitta Glugga
+ tmenu ToolBar.WinMax Hmarksstr Glugga
+ tmenu ToolBar.WinMin Lgmarksstr Glugga
+ tmenu ToolBar.WinClose Loka Glugga
+ endif
+ tmenu ToolBar.LoadSesn Hlaa Setu
+ tmenu ToolBar.SaveSesn Vista Setu
+ tmenu ToolBar.RunScript Keyra Skriptu
+ tmenu ToolBar.Make Sma
+ tmenu ToolBar.Shell Opna Skel
+ tmenu ToolBar.RunCtags Sma Merki
+ tmenu ToolBar.TagJump Hoppa Merki
+ tmenu ToolBar.Help Hjlp
+ tmenu ToolBar.FindHelp Finna Hjlp...
+ endfun
+endif
+" }}} TOOLBAR
+
+" {{{ DIALOG TEXTS
+let g:menutrans_no_file = "[Engin Skr]"
+let g:menutrans_help_dialog = "Sli inn skipun ea ora til a leita upplsinga um:\n\nForskeyti i_ fyrir lagshamsskipanir (t.d. i_CTRL-X)\nForskeyti c_ fyrir skipanalnuskipanir (t.d. c_<Del>)\nForskeyti ' fyrir nafn valmguleika (t.d. 'shiftbreidd')"
+let g:menutrans_path_dialog = "Sli inn leitarsl fyrir skrr.\nAskilji mppur me kommu"
+let g:menutrans_tags_dialog = "Sli inn nafn Merkjaskra.\nAskilji nfnin me kommu"
+let g:menutrans_textwidth_dialog = "Sli inn nja textabreidd (0 til a virkja snimtun): "
+let g:menutrans_fileformat_dialog = "Velji Skrarsni"
+" }}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_is_is.utf-8.vim b/runtime/lang/menu_is_is.utf-8.vim
new file mode 100644
index 0000000..1f587f0
--- /dev/null
+++ b/runtime/lang/menu_is_is.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Icelandic for UTF-8 encoding
+
+source <sfile>:p:h/menu_is_is.latin1.vim
diff --git a/runtime/lang/menu_it.latin1.vim b/runtime/lang/menu_it.latin1.vim
new file mode 100644
index 0000000..333bb41
--- /dev/null
+++ b/runtime/lang/menu_it.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Italian
+
+source <sfile>:p:h/menu_it_it.latin1.vim
diff --git a/runtime/lang/menu_it.utf-8.vim b/runtime/lang/menu_it.utf-8.vim
new file mode 100644
index 0000000..1770445
--- /dev/null
+++ b/runtime/lang/menu_it.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Italian for UTF-8 encoding
+
+source <sfile>:p:h/menu_it_it.latin1.vim
diff --git a/runtime/lang/menu_it_it.latin1.vim b/runtime/lang/menu_it_it.latin1.vim
new file mode 100644
index 0000000..a37c2f0
--- /dev/null
+++ b/runtime/lang/menu_it_it.latin1.vim
@@ -0,0 +1,409 @@
+" Menu Translations: Italian / Italiano
+" Maintainer: Antonio Colombo <azc100@gmail.com>
+" Vlad Sandrini <vlad.gently@gmail.com>
+" Luciano Montanaro <mikelima@cirulla.net>
+" Last Change: 2022 Jun 17
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding iso-8859-1
+
+" Help / Aiuto
+menut &Help &Aiuto
+
+menut &Overview<Tab><F1> &Panoramica<Tab><F1>
+menut &User\ Manual Manuale\ &Utente
+menut &How-to\ links Co&Me\.\.\.
+menut &Find\.\.\. &Cerca\.\.\.
+menut &Credits Cr&Editi
+menut Co&pying C&Opie
+menut &Sponsor/Register &Sponsor/Registrazione
+menut O&rphans O&Rfani
+menut &Version &Versione
+menut &About &Intro
+
+let g:menutrans_help_dialog = "Batti un comando o una parola per cercare aiuto:\n\nPremetti i_ per comandi in modo Input (p.es.: i_CTRL-X)\nPremetti c_ per comandi che editano la linea-comandi (p.es.: c_<Del>)\nPremetti ' per un nome di opzione (p.es.: 'shiftwidth')"
+
+" File / File
+menut &File &File
+
+menut &Open\.\.\.<Tab>:e &Apri\.\.\.<Tab>:e
+menut Sp&lit-Open\.\.\.<Tab>:sp A&Pri\ nuova\ finestra\.\.\.<Tab>:sp
+menut Open\ Tab\.\.\.<Tab>:tabnew Apri\ nuova\ &Linguetta\.\.\.<Tab>:tabnew
+menut &New<Tab>:enew &Nuovo<Tab>:enew
+menut &Close<Tab>:close &Chiudi<Tab>:close
+menut &Save<Tab>:w &Salva<Tab>:w
+menut Save\ &As\.\.\.<Tab>:sav Salva\ &Con\ nome\.\.\.<Tab>:sav
+menut Split\ &Diff\ with\.\.\. &Differenza\ con\.\.\.
+menut Split\ Patched\ &By\.\.\. Patc&H\ da\.\.\.
+menut &Print S&tampa
+menut Sa&ve-Exit<Tab>:wqa Sa&Lva\ ed\ esci<Tab>:wqa
+menut E&xit<Tab>:qa &Esci<Tab>:qa
+
+" Edit / Modifica
+menut &Edit &Modifica
+
+menut &Undo<Tab>u &Annulla<Tab>u
+menut &Redo<Tab>^R &Ripristina<Tab>^R
+menut Rep&eat<Tab>\. Ri&Peti<Tab>\.
+menut Cu&t<Tab>"+x &Taglia<Tab>"+x
+menut &Copy<Tab>"+y &Copia<Tab>"+y
+menut &Paste<Tab>"+gP &Incolla<Tab>"+gP
+menut Put\ &Before<Tab>[p &Metti\ davanti<Tab>[p
+menut Put\ &After<Tab>]p M&Etti\ dietro<Tab>]p
+menut &Delete<Tab>x Cance&Lla<Tab>x
+menut &Select\ all<Tab>ggVG Seleziona\ &Tutto<Tab>ggVG
+menut &Find\.\.\. &Cerca\.\.\.
+menut &Find\.\.\.<Tab>/ &Cerca\.\.\.<Tab>/
+menut Find\ and\ Rep&lace\.\.\. &Sostituisci\.\.\.
+menut Find\ and\ Rep&lace\.\.\.<Tab>:%s &Sostituisci\.\.\.<Tab>:%s
+menut Find\ and\ Rep&lace\.\.\.<Tab>:s &Sostituisci\.\.\.<Tab>:s
+menut Settings\ &Window &Finestra\ Impostazioni
+menut Startup\ &Settings Impostazioni\ di\ &Avvio
+menut &Global\ Settings Impostazioni\ &Globali
+menut Question Domanda
+
+" Edit / Modifica / Impostazioni Globali
+
+menut Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Evidenzia\ ricerche\ S/No<Tab>:set\ hls!
+menut Toggle\ &Ignoring\ Case<Tab>:set\ ic! &Ignora\ maiusc\.-minusc\.\ S/No<Tab>:set\ ic!
+menut Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Indica\ &Corrispondenze\ S/No<Tab>:set\ sm!
+
+menut &Context\ lines &Linee\ di\ contesto
+
+menut &Virtual\ Edit &Edit\ virtuale
+menut Never Mai
+menut Block\ Selection Selezione\ Blocco
+menut Insert\ mode Modo\ Insert
+menut Block\ and\ Insert Selezione\ Blocco\ e\ Inserimento
+menut Always Sempre
+
+menut Toggle\ Insert\ &Mode<Tab>:set\ im! &Modo\ Insert\ S/No<Tab>:set\ im!
+menut Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! C&Ompatibilit\ VI\ S/No<Tab>:set\ cp!
+menut Search\ &Path\.\.\. &Percorso\ di\ ricerca\.\.\.
+menut Ta&g\ Files\.\.\. File\ ta&G\.\.\.
+menut Toggle\ &Toolbar Barra\ s&Trumenti\ S/No
+menut Toggle\ &Bottom\ Scrollbar Barra\ scorrimento\ in\ &Fondo\ S/No
+menut Toggle\ &Left\ Scrollbar Barra\ scorrimento\ a\ &Sinistra\ S/No
+menut Toggle\ &Right\ Scrollbar Barra\ scorrimento\ a\ &Destra\ S/No
+
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Apri file
+ tmenu ToolBar.Save Salva file
+ tmenu ToolBar.SaveAll Salva tutti i file
+ if has("printer") || has("unix")
+ tmenu ToolBar.Print Stampa
+ endif
+ tmenu ToolBar.Undo Annulla
+ tmenu ToolBar.Redo Rifai
+ tmenu ToolBar.Cut Taglia
+ tmenu ToolBar.Copy Copia
+ tmenu ToolBar.Paste Incolla
+ tmenu ToolBar.Find Trova...
+ tmenu ToolBar.FindNext Trova seguente
+ tmenu ToolBar.FindPrev Trova precedente
+ tmenu ToolBar.Replace Sostituisci
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nuovo
+ tmenu ToolBar.WinSplit Dividi
+ tmenu ToolBar.WinMax Massimizza
+ tmenu ToolBar.WinMin Minimizza
+ tmenu ToolBar.WinClose Chiudi
+ endif
+ tmenu ToolBar.LoadSesn Carica sessione
+ tmenu ToolBar.SaveSesn Salva sessione
+ tmenu ToolBar.RunScript Esegui script
+ tmenu ToolBar.Make Esegui make
+ tmenu ToolBar.Shell Esegui shell
+ tmenu ToolBar.RunCtags Esegui ctags
+ tmenu ToolBar.TagJump Salta alla tag
+ tmenu ToolBar.Help Aiuto
+ tmenu ToolBar.FindHelp Trova aiuto...
+ endfun
+endif
+
+let g:menutrans_path_dialog = "Batti percorso di ricerca per i file.\nSepara fra loro i nomi di directory con una virgola."
+let g:menutrans_tags_dialog = "Batti nome dei file di tag.\nSepara fra loro i nomi di directory con una virgola."
+
+" Edit / Impostazioni File
+menut F&ile\ Settings &Impostazioni\ file
+
+" Boolean options
+menut Toggle\ Line\ &Numbering<Tab>:set\ nu! &Numerazione\ S/No<Tab>:set\ nu!
+menut Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! Numerazione\ relati&Va\ S/No<Tab>:set\ rnu!
+menut Toggle\ &List\ Mode<Tab>:set\ list! Modo\ &List\ S/No<Tab>:set\ list!
+menut Toggle\ Line\ &Wrapping<Tab>:set\ wrap! Linee\ &Continuate\ S/No<Tab>:set\ wrap!
+menut Toggle\ W&rapping\ at\ word<Tab>:set\ lbr! A\ capo\ alla\ &Parola\ S/No<Tab>:set\ lbr!
+menut Toggle\ Tab\ &expanding<Tab>:set\ et! &Espandi\ Tabulazione\ S/No<Tab>:set\ et!
+menut Toggle\ &Auto\ Indenting<Tab>:set\ ai! Indentazione\ &Automatica\ S/No<Tab>:set\ ai!
+menut Toggle\ &C-Style\ Indenting<Tab>:set\ cin! Indentazione\ stile\ &C\ S/No<Tab>:set\ cin!
+menut &Shiftwidth &Spazi\ rientranza
+"menut &Shiftwidth.2<Tab>:set\ sw=2\ sw?<CR> &Spazi\ rientranza.2<Tab>:set\ sw=2\ sw?<CR>
+"menut &Shiftwidth.3<Tab>:set\ sw=3\ sw?<CR> &Spazi\ rientranza.3<Tab>:set\ sw=3\ sw?<CR>
+"menut &Shiftwidth.4<Tab>:set\ sw=4\ sw?<CR> &Spazi\ rientranza.4<Tab>:set\ sw=4\ sw?<CR>
+"menut &Shiftwidth.5<Tab>:set\ sw=5\ sw?<CR> &Spazi\ rientranza.5<Tab>:set\ sw=5\ sw?<CR>
+"menut &Shiftwidth.6<Tab>:set\ sw=6\ sw?<CR> &Spazi\ rientranza.6<Tab>:set\ sw=6\ sw?<CR>
+"menut &Shiftwidth.8<Tab>:set\ sw=8\ sw?<CR> &Spazi\ rientranza.8<Tab>:set\ sw=8\ sw?<CR>
+menut Soft\ &Tabstop &Tabulazione\ software
+"menut Soft\ &Tabstop.2<Tab>:set\ sts=2\ sts? &Tabulazione\ software.2<Tab>:set\ sts=2\ sts?
+"menut Soft\ &Tabstop.3<Tab>:set\ sts=3\ sts? &Tabulazione\ software.3<Tab>:set\ sts=3\ sts?
+"menut Soft\ &Tabstop.4<Tab>:set\ sts=4\ sts? &Tabulazione\ software.4<Tab>:set\ sts=4\ sts?
+"menut Soft\ &Tabstop.5<Tab>:set\ sts=5\ sts? &Tabulazione\ software.5<Tab>:set\ sts=5\ sts?
+"menut Soft\ &Tabstop.6<Tab>:set\ sts=6\ sts? &Tabulazione\ software.6<Tab>:set\ sts=6\ sts?
+"menut Soft\ &Tabstop.8<Tab>:set\ sts=8\ sts? &Tabulazione\ software.8<Tab>:set\ sts=8\ sts?
+menut Te&xt\ Width\.\.\. Lunghe&Zza\ riga\.\.\.
+menut &File\ Format\.\.\. Formato\ &File\.\.\.
+
+let g:menutrans_textwidth_dialog = "Batti nuova lunghezza linea (0 per inibire la formattazione): "
+let g:menutrans_fileformat_dialog = "Scegli formato con cui scrivere il file"
+let g:menutrans_fileformat_choices = " &Unix \n &Dos \n &Mac \n &Annullare "
+
+menut Show\ C&olor\ Schemes\ in\ Menu Mostra\ Schemi\ C&olore\ in\ Men
+menut C&olor\ Scheme Schema\ c&Olori
+
+menut blue bl
+menut darkblue bl\ scuro
+menut desert deserto
+menut elflord signore\ degli\ elfi
+menut evening sera
+menut industry industria
+menut morning mattino
+menut peachpuff pesca
+menut shine brillante
+menut slate ardesia
+menut BLUE BL
+menut DARKBLUE BL\ SCURO
+menut DESERT DESERTO
+menut ELFLORD SIGNORE\ DEGLI\ ELFI
+menut EVENING SERA
+menut INDUSTRY INDUSTRIA
+menut MORNING MATTINO
+menut PEACHPUFF PESCA
+menut SHINE BRILLANTE
+menut SLATE ARDESIA
+
+menut Show\ &Keymaps\ in\ Menu Mostra\ Ma&ppe\ tastiera\ in\ Men
+menut &Keymap Ma&ppa\ tastiera
+
+menut None nessuna
+menut accents accenti
+menut arabic arabo
+menut armenian-eastern armeno-orientale
+menut armenian-western armeno-occidentale
+menut belarusian-jcuken bielorusso-jcuken
+menut czech ceco
+menut greek greco
+menut hebrew ebraico
+menut hebrewp ebraicop
+menut magyar ungherese
+menut persian persiano
+menut serbian serbo
+menut serbian-latin serbo-latino
+menut slovak slovacco
+menut ACCENTS ACCENTI
+menut ARABIC ARABO
+menut ARMENIAN-EASTERN ARMENO-ORIENTALE
+menut ARMENIAN-WESTERN ARMENO-OCCIDENTALE
+menut BELARUSIAN-JCUKEN BIELORUSSO-JCUKEN
+menut CZECH CECO
+menut GREEK GRECO
+menut HEBREW EBRAICO
+menut HEBREWP EBRAICOP
+menut MAGYAR UNGHERESE
+menut PERSIAN PERSIANO
+menut SERBIAN SERBO
+menut SERBIAN-LATIN SERBO-LATINO
+menut SLOVAK SLOVACCO
+
+menut Select\ Fo&nt\.\.\. Scegli\ &Font\.\.\.
+
+" Men strumenti programmazione
+menut &Tools &Strumenti
+
+menut &Jump\ to\ this\ tag<Tab>g^] &Vai\ a\ questa\ tag<Tab>g^]
+menut Jump\ &back<Tab>^T Torna\ &Indietro<Tab>^T
+menut Build\ &Tags\ File Costruisci\ file\ &Tags\
+" Men ortografia / Spelling
+menut &Spelling &Ortografia
+
+menut &Spell\ Check\ On Attiva\ &Controllo\ ortografico
+menut Spell\ Check\ &Off &Disattiva\ controllo\ ortografico
+menut To\ &Next\ error<Tab>]s Errore\ &Seguente<tab>]s
+menut To\ &Previous\ error<Tab>[s Errore\ &Precedente<tab>[s
+menut Suggest\ &Corrections<Tab>z= &Suggerimenti<Tab>z=
+menut &Repeat\ correction<Tab>:spellrepall &Ripeti\ correzione<Tab>:spellrepall
+menut Set\ language\ to\ "en" Imposta\ lingua\ a\ "en"
+menut Set\ language\ to\ "en_au" Imposta\ lingua\ a\ "en_au"
+menut Set\ language\ to\ "en_ca" Imposta\ lingua\ a\ "en_ca"
+menut Set\ language\ to\ "en_gb" Imposta\ lingua\ a\ "en_gb"
+menut Set\ language\ to\ "en_nz" Imposta\ lingua\ a\ "en_nz"
+menut Set\ language\ to\ "en_us" Imposta\ lingua\ a\ "en_us"
+menut &Find\ More\ Languages &Trova\ altre\ lingue
+
+" Men piegature / Fold
+menut &Folding &Piegature
+" apri e chiudi piegature
+menut &Enable/Disable\ folds<Tab>zi Pi&egature\ S/No<Tab>zi
+menut &View\ Cursor\ Line<Tab>zv &Vedi\ linea\ col\ Cursore<Tab>zv
+menut Vie&w\ Cursor\ Line\ only<Tab>zMzx Vedi\ &Solo\ linea\ col\ Cursore<Tab>zMzx
+menut C&lose\ more\ folds<Tab>zm C&Hiudi\ pi\ piegature<Tab>zm
+menut &Close\ all\ folds<Tab>zM &Chiudi\ tutte\ le\ piegature<Tab>zM
+menut O&pen\ more\ folds<Tab>zr A&Pri\ pi\ piegature<Tab>zr
+menut &Open\ all\ folds<Tab>zR &Apri\ tutte\ le\ piegature<Tab>zR
+" metodo piegatura
+menut Fold\ Met&hod Meto&Do\ piegatura
+menut M&anual &Manuale
+menut I&ndent &Nidificazione
+menut E&xpression &Espressione\ Reg\.
+menut S&yntax &Sintassi
+menut &Diff &Differenza
+menut Ma&rker Mar&Catura
+
+" crea e cancella piegature
+menut Create\ &Fold<Tab>zf Crea\ &Piegatura<Tab>zf
+menut &Delete\ Fold<Tab>zd &Leva\ piegatura<Tab>zd
+menut Delete\ &All\ Folds<Tab>zD Leva\ &Tutte\ le\ piegature<Tab>zD
+" movimenti all'interno delle piegature
+menut Fold\ col&umn\ width Larghezza\ piegat&Ure\ in\ colonne
+
+menut &Diff &Differenza
+"
+menut &Update &Aggiorna
+menut &Get\ Block &Importa\ differenze
+menut &Put\ Block &Esporta\ differenze
+
+menut &Make<Tab>:make Esegui\ &Make<Tab>:make
+
+menut &List\ Errors<Tab>:cl Lista\ &Errori<Tab>:cl
+menut L&ist\ Messages<Tab>:cl! Lista\ &Messaggi<Tab>:cl!
+menut &Next\ Error<Tab>:cn Errore\ s&Uccessivo<Tab>:cn
+menut &Previous\ Error<Tab>:cp Errore\ &Precedente<Tab>:cp
+menut &Older\ List<Tab>:cold Lista\ men&O\ recente<Tab>:cold
+menut N&ewer\ List<Tab>:cnew Lista\ pi\ rece&Nte<Tab>:cnew
+
+menut Error\ &Window &Finestra\ errori
+
+menut &Update<Tab>:cwin A&Ggiorna<Tab>:cwin
+menut &Open<Tab>:copen &Apri<Tab>:copen
+menut &Close<Tab>:cclose &Chiudi<Tab>:cclose
+
+menut &Convert\ to\ HEX<Tab>:%!xxd &Converti\ a\ esadecimale<Tab>:%!xxd
+menut Conve&rt\ back<Tab>:%!xxd\ -r Conve&rti\ da\ esadecimale<Tab>:%!xxd\ -r
+
+menut Se&T\ Compiler Impo&Sta\ Compilatore
+
+" Buffers / Buffer
+menut &Buffers &Buffer
+
+menut &Refresh\ menu A&ggiorna\ men
+menut &Delete &Elimina
+menut &Alternate &Alternato
+menut &Next &Successivo
+menut &Previous &Precedente
+menut [No\ File] [Nessun\ File]
+
+" Syntax / Sintassi
+menut &Syntax &Sintassi
+
+menut &Show\ File\ Types\ in\ menu Mo&Stra\ tipi\ di\ file\ nel\ men
+menut Set\ '&syntax'\ only &S\ Attiva\ solo\ \ 'syntax'
+menut Set\ '&filetype'\ too &F\ Attiva\ anche\ 'filetype'
+menut &Off &Disattiva
+menut &Manual &Manuale
+menut A&utomatic A&Utomatico
+menut on/off\ for\ &This\ file Attiva\ S/No\ su\ ques&To\ file
+menut Co&lor\ test Test\ &Colori
+menut &Highlight\ test Test\ &Evidenziamento
+menut &Convert\ to\ HTML Converti\ ad\ &HTML
+
+let g:menutrans_set_lang_to = "Cambia linguaggio a"
+let g:menutrans_no_file = "[Senza nome]"
+let g:menutrans_spell_change_ARG = 'Cambia\ da\ "%s"\ a'
+let g:menutrans_spell_add_ARG_to_word_list = 'Aggiungi\ "%s"\ alla\ Word\ List'
+let g:menutrans_spell_ignore_ARG = 'Ignora\ "%s"'
+
+" Window / Finestra
+menut &Window &Finestra
+
+menut &New<Tab>^Wn &Nuova<Tab>^Wn
+menut S&plit<Tab>^Ws &Dividi\ lo\ schermo<Tab>^Ws
+menut Sp&lit\ To\ #<Tab>^W^^ D&Ividi\ verso\ #<Tab>^W^^
+menut Split\ &Vertically<Tab>^Wv Di&Vidi\ verticalmente<Tab>^Wv
+menut Split\ File\ E&xplorer Aggiungi\ finestra\ e&Xplorer
+menut &Close<Tab>^Wc &Chiudi<Tab>^Wc
+menut Close\ &Other(s)<Tab>^Wo C&Hiudi\ altra(e)<Tab>^Wo
+menut Move\ &To &Muovi\ verso
+
+menut &Top<Tab>^WK &Cima<Tab>^WK
+menut &Bottom<Tab>^WJ &Fondo<Tab>^WJ
+menut &Left\ side<Tab>^WH Lato\ &Sinistro<Tab>^WH
+menut &Right\ side<Tab>^WL Lato\ &Destro<Tab>^WL
+menut Rotate\ &Up<Tab>^WR Ruota\ verso\ l'&Alto<Tab>^WR
+menut Rotate\ &Down<Tab>^Wr Ruota\ verso\ il\ &Basso<Tab>^Wr
+menut &Equal\ Size<Tab>^W= &Uguale\ ampiezza<Tab>^W=
+menut &Max\ Height<Tab>^W_ &Altezza\ massima<Tab>^W_
+menut M&in\ Height<Tab>^W1_ A&Ltezza\ minima<Tab>^W1_
+menut Max\ &Width<Tab>^W\| Larghezza\ massima<Tab>^W\|
+menut Min\ Widt&h<Tab>^W1\| Larghezza\ minima<Tab>^W1\|
+
+" The popup menu
+menut &Undo &Annulla
+menut Cu&t &Taglia
+menut &Copy &Copia
+menut &Paste &Incolla
+menut &Delete &Elimina
+menut Select\ Blockwise Seleziona\ in\ blocco
+menut Select\ &Word Seleziona\ &Parola
+menut Select\ &Line Seleziona\ &Linea
+menut Select\ &Block Seleziona\ &Blocco
+menut Select\ &All Seleziona\ t&Utto
+
+" The GUI Toolbar / Barra Strumenti
+menut Open Apri
+menut Save Salva
+menut SaveAll Salva\ Tutto
+menut Print Stampa
+menut Undo Annulla
+menut Redo Ripristina
+menut Cut Taglia
+menut Copy Copia
+menut Paste Incolla
+" -sep3-
+menut Find Cerca
+menut FindNext Cerca\ Successivo
+menut FindPrev Cerca\ Precedente
+menut Replace Sostituisci
+" -sep4-
+menut New Nuova\ finestra
+menut WinSplit Dividi\ finestra
+menut WinMax Massima\ ampiezza
+menut WinMin Minima\ ampiezza
+menut WinVSplit Dividi\ verticalmente
+menut WinMaxWidth Massima\ larghezza
+menut WinMinWidth Minima\ larghezza
+menut WinClose Chiudi\ finestra
+menut LoadSesn Carica\ Sessione
+menut SaveSesn Salva\ Sessione
+menut RunScript Esegui\ Script
+menut Make Make
+menut Shell Shell
+menut RunCtags Esegui\ Ctags
+menut TagJump Vai\ a\ Tag
+menut Help Aiuto
+menut FindHelp Cerca\ in\ Aiuto
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: set sw=2 :
diff --git a/runtime/lang/menu_it_it.utf-8.vim b/runtime/lang/menu_it_it.utf-8.vim
new file mode 100644
index 0000000..1770445
--- /dev/null
+++ b/runtime/lang/menu_it_it.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Italian for UTF-8 encoding
+
+source <sfile>:p:h/menu_it_it.latin1.vim
diff --git a/runtime/lang/menu_italian_italy.1252.vim b/runtime/lang/menu_italian_italy.1252.vim
new file mode 100644
index 0000000..b336fcb
--- /dev/null
+++ b/runtime/lang/menu_italian_italy.1252.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Italian for Latin1
+
+source <sfile>:p:h/menu_it_it.latin1.vim
diff --git a/runtime/lang/menu_ja.cp932.vim b/runtime/lang/menu_ja.cp932.vim
new file mode 100644
index 0000000..50856d5
--- /dev/null
+++ b/runtime/lang/menu_ja.cp932.vim
@@ -0,0 +1,8 @@
+" Menu Translations: Japanese (for Windows)
+" Translated By: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 15-Jun-2012.
+"
+" Copyright (C) 2004,12 MURAOKA Taro <koron.kaoriya@gmail.com>
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+
+source <sfile>:p:h/menu_japanese_japan.932.vim
diff --git a/runtime/lang/menu_ja.euc-jp.vim b/runtime/lang/menu_ja.euc-jp.vim
new file mode 100644
index 0000000..4dcd60c
--- /dev/null
+++ b/runtime/lang/menu_ja.euc-jp.vim
@@ -0,0 +1,9 @@
+" Menu Translations: Japanese (for UNIX)
+" Translated By: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 15-Jun-2012.
+"
+" Copyright (C) 2004,12 MURAOKA Taro <koron.kaoriya@gmail.com>
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+
+" ja is the same as ja_jp. Source the other one from here.
+source <sfile>:p:h/menu_ja_jp.euc-jp.vim
diff --git a/runtime/lang/menu_ja.eucjp.vim b/runtime/lang/menu_ja.eucjp.vim
new file mode 100644
index 0000000..0eff4d9
--- /dev/null
+++ b/runtime/lang/menu_ja.eucjp.vim
@@ -0,0 +1,9 @@
+" Menu Translations: Japanese (for UNIX)
+" Translated By: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 15-Jun-2012.
+"
+" Copyright (C) 2004,12 MURAOKA Taro <koron.kaoriya@gmail.com>
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+
+" eucjp is the same as euc-jp. Source the other one from here.
+source <sfile>:p:h/menu_ja_jp.euc-jp.vim
diff --git a/runtime/lang/menu_ja.ujis.vim b/runtime/lang/menu_ja.ujis.vim
new file mode 100644
index 0000000..e74ff80
--- /dev/null
+++ b/runtime/lang/menu_ja.ujis.vim
@@ -0,0 +1,9 @@
+" Menu Translations: Japanese (for UNIX)
+" Translated By: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 15-Jun-2012.
+"
+" Copyright (C) 2004,12 MURAOKA Taro <koron.kaoriya@gmail.com>
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+
+" ujis is the same as euc-jp. Source the other one from here.
+source <sfile>:p:h/menu_ja_jp.euc-jp.vim
diff --git a/runtime/lang/menu_ja.utf-8.vim b/runtime/lang/menu_ja.utf-8.vim
new file mode 100644
index 0000000..a47cdbe
--- /dev/null
+++ b/runtime/lang/menu_ja.utf-8.vim
@@ -0,0 +1,4 @@
+" Menu Translations: Japanese
+
+" ja is the same as ja_jp. Source the other one from here.
+source <sfile>:p:h/menu_ja_jp.utf-8.vim
diff --git a/runtime/lang/menu_ja_jp.cp932.vim b/runtime/lang/menu_ja_jp.cp932.vim
new file mode 100644
index 0000000..50856d5
--- /dev/null
+++ b/runtime/lang/menu_ja_jp.cp932.vim
@@ -0,0 +1,8 @@
+" Menu Translations: Japanese (for Windows)
+" Translated By: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 15-Jun-2012.
+"
+" Copyright (C) 2004,12 MURAOKA Taro <koron.kaoriya@gmail.com>
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+
+source <sfile>:p:h/menu_japanese_japan.932.vim
diff --git a/runtime/lang/menu_ja_jp.euc-jp.vim b/runtime/lang/menu_ja_jp.euc-jp.vim
new file mode 100644
index 0000000..21138f1
--- /dev/null
+++ b/runtime/lang/menu_ja_jp.euc-jp.vim
@@ -0,0 +1,315 @@
+" vi:set ts=8 sts=8 sw=8 tw=0:
+"
+" Menu Translations: Japanese (EUC-JP)
+" Last Translator: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 20-Feb-2022.
+"
+" Copyright (C) 2001-2022 MURAOKA Taro <koron.kaoriya@gmail.com>,
+" vim-jp <http://vim-jp.org/>
+"
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+"
+" Generated from menu_ja_jp.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding euc-jp
+
+" Help menu
+menutrans &Help إ(&H)
+menutrans &Overview<Tab><F1> ά(&O)<Tab><F1>
+menutrans &User\ Manual 桼ޥ˥奢(&U)
+menutrans &How-To\ links &How-to
+menutrans &Credits 쥸å(&C)
+menutrans Co&pying (&P)
+menutrans &Sponsor/Register ݥ󥵡/Ͽ(&S)
+menutrans O&rphans ɻ(&R)
+menutrans &Version С(&V)
+menutrans &About VimˤĤ(&A)
+
+let g:menutrans_help_dialog = "إפ򸡺ޥɤ⤷ñϤƤ:\n\n⡼ɤΥޥɤˤ i_ Ƭղäޤ. (: i_CTRL-X)\nޥɥ饤Խޥɤˤ c_ Ƭղäޤ. (: c_<Del>)\nץ̾ˤ ' ղäޤ. (: 'shiftwidth')"
+
+" File menu
+menutrans &File ե(&F)
+menutrans &Open\.\.\.<Tab>:e (&O)\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp ʬ䤷Ƴ(&L)\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew ֥ڡdz<Tab>:tabnew
+menutrans &New<Tab>:enew (&N)<Tab>:enew
+menutrans &Close<Tab>:close Ĥ(&C)<Tab>:close
+menutrans &Save<Tab>:w ¸(&S)<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav ̾դ¸(&A)\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. ʬɽ(&D)\.\.\.
+menutrans Split\ Patched\ &By\.\.\. ѥå̤ɽ(&B)\.\.\.
+menutrans &Print (&P)
+menutrans Sa&ve-Exit<Tab>:wqa ¸ƽλ(&V)<Tab>:wqa
+menutrans E&xit<Tab>:qa λ(&X)<Tab>:qa
+
+" Edit menu
+menutrans &Edit Խ(&E)
+menutrans &Undo<Tab>u ä(&U)<Tab>u
+menutrans &Redo<Tab>^R ⤦٤(&R)<Tab>^R
+menutrans Rep&eat<Tab>\. ֤(&E)<Tab>\.
+menutrans Cu&t<Tab>"+x ڤ(&T)<Tab>"+x
+menutrans &Copy<Tab>"+y ԡ(&C)<Tab>"+y
+menutrans &Paste<Tab>"+gP Žդ(&P)<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Ž(&B)<Tab>[p
+menutrans Put\ &After<Tab>]p Ž(&A)<Tab>]p
+menutrans &Delete<Tab>x ä(&D)<Tab>x
+menutrans &Select\ All<Tab>ggVG (&S)<Tab>ggVG
+menutrans &Find\.\.\. (&F)\.\.\.
+menutrans &Find<Tab>/ (&F)<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. ִ(&L)\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s ִ(&L)<Tab>:%s
+menutrans Find\ and\ Rep&lace<Tab>:s ִ(&L)<Tab>:s
+"menutrans Options\.\.\. ץ(&O)\.\.\.
+menutrans Settings\ &Window ꥦɥ(&W)
+menutrans Startup\ &Settings ư(&S)
+
+" Edit/Global Settings
+menutrans &Global\ Settings (&G)
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls!
+ \ ѥĴ(&H)<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic!
+ \ 羮ʸ(&I)<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm!
+ \ ޥåɽ(&S)<Tab>:set\ sm!
+menutrans &Context\ lines չԿ(&C)
+menutrans &Virtual\ Edit Խ(&V)
+menutrans Never ̵
+menutrans Block\ Selection ֥å
+menutrans Insert\ mode ⡼ɻ
+menutrans Block\ and\ Insert ֥å/⡼ɻ
+menutrans Always
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im!
+ \ (鿴)⡼(&M)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp!
+ \ Viߴ⡼(&O)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. ѥ(&P)\.\.\.
+menutrans Ta&g\ Files\.\.\. ե(&G)\.\.\.
+"
+" GUI options
+menutrans Toggle\ &Toolbar ġСɽ(&T)
+menutrans Toggle\ &Bottom\ Scrollbar С()ɽ(&B)
+menutrans Toggle\ &Left\ Scrollbar С()ɽ(&L)
+menutrans Toggle\ &Right\ Scrollbar С()ɽ(&R)
+
+let g:menutrans_path_dialog = "եθѥϤƤ:\nǥ쥯ȥ̾ϥ ( , ) ǶڤäƤ."
+let g:menutrans_tags_dialog = "ե̾ϤƤ:\n̾ϥ ( , ) ǶڤäƤ."
+
+" Edit/File Settings
+
+" Boolean options
+menutrans F&ile\ Settings ե(&I)
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu!
+ \ ֹɽ(&N)<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu!
+ \ йֹɽ(&V)<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list!
+ \ ꥹȥ⡼(&L)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap!
+ \ ֤(&W)<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ word<Tab>:set\ lbr!
+ \ ñ֤(&R)<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et!
+ \ Ÿ(&E)<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai!
+ \ ư(&A)<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin!
+ \ C(&C)<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth ե(&S)
+menutrans Soft\ &Tabstop եȥ(&T)
+menutrans Te&xt\ Width\.\.\. ƥ(&X)\.\.\.
+menutrans &File\ Format\.\.\. Ե(&F)\.\.\.
+
+let g:menutrans_textwidth_dialog = "ƥȤ('textwidth')ꤷƤ (0̵):"
+let g:menutrans_fileformat_dialog = "եϤκݤβԵηǤ."
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n󥻥(&C)"
+
+menutrans Show\ C&olor\ Schemes\ in\ Menu ơޤ˥塼ɽ(&O)
+menutrans C&olor\ Scheme ơ(&O)
+menutrans Show\ &Keymaps\ in\ Menu ޥåפ˥塼ɽ(&K)
+menutrans &Keymap ޥå(&K)
+menutrans None ʤ
+
+" Programming menu
+menutrans &Tools ġ(&T)
+menutrans &Jump\ to\ this\ tag<Tab>g^] (&J)<Tab>g^]
+menutrans Jump\ &back<Tab>^T (&B)<Tab>^T
+menutrans Build\ &Tags\ File ե(&T)
+menutrans &Make<Tab>:make ӥ(&M)<Tab>:make
+menutrans &List\ Errors<Tab>:cl 顼ꥹ(&L)<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! åꥹ(&I)<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Υ顼(&N)<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Υ顼(&P)<Tab>:cp
+menutrans &Older\ List<Tab>:cold Ťꥹ(&O)<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew ꥹ(&E)<Tab>:cnew
+menutrans Error\ &Window 顼ɥ(&W)
+menutrans &Update<Tab>:cwin (&U)<Tab>:cwin
+menutrans &Open<Tab>:copen (&O)<Tab>:copen
+menutrans &Close<Tab>:cclose Ĥ(&C)<Tab>:cclose
+menutrans &Convert\ to\ HEX<Tab>:%!xxd HEXѴ(&C)<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r HEXѴ(&R)<Tab>%!xxd\ -r
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu ѥ˥塼ɽ(&T)
+menutrans Se&t\ Compiler ѥ(&T)
+
+" Tools.Spelling Menu
+menutrans &Spelling ڥ(&S)
+menutrans &Spell\ Check\ On ڥåͭ(&S)
+menutrans Spell\ Check\ &Off ڥå̵(&O)
+menutrans To\ &Next\ error<Tab>]s Υ顼(&N)<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s Υ顼(&P)<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= (&C)<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall 򷫤֤(&R)<Tab>:spellrepall
+menutrans Set\ language\ to\ "en" \ "en"\ ꤹ
+menutrans Set\ language\ to\ "en_au" \ "en_au"\ ꤹ
+menutrans Set\ language\ to\ "en_ca" \ "en_ca"\ ꤹ
+menutrans Set\ language\ to\ "en_gb" \ "en_gb"\ ꤹ
+menutrans Set\ language\ to\ "en_nz" \ "en_nz"\ ꤹ
+menutrans Set\ language\ to\ "en_us" \ "en_us"\ ꤹ
+menutrans &Find\ More\ Languages ¾θ򸡺(&F)
+
+let g:menutrans_spell_change_ARG_to = '"%s"\ ѹ'
+let g:menutrans_spell_add_ARG_to_word_list = '"%s"\ ñꥹȤɲ'
+let g:menutrans_spell_ignore_ARG = '"%s"\ ̵'
+
+" Tools.Fold Menu
+menutrans &Folding ޾(&F)
+" open close folds
+menutrans &Enable/Disable\ folds<Tab>zi ͭ/̵(&E)<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv Ԥɽ(&V)<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Ԥɽ(&W)<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm ޾ߤĤ(&L)<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM ޾ߤĤ(&C)<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr ޾ߤ򳫤(&P)<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR ޾ߤ򳫤(&O)<Tab>zR
+" fold method
+menutrans Fold\ Met&hod ޾ˡ(&H)
+menutrans M&anual ư(&A)
+menutrans I&ndent ǥ(&N)
+menutrans E&xpression ɾ(&X)
+menutrans S&yntax 󥿥å(&Y)
+menutrans &Diff ʬ(&D)
+menutrans Ma&rker ޡ(&R)
+" create and delete folds
+menutrans Create\ &Fold<Tab>zf ޾ߺ(&F)<Tab>zf
+menutrans &Delete\ Fold<Tab>zd ޾ߺ(&D)<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD ޾ߺ(&A)<Tab>zD
+" moving around in folds
+menutrans Fold\ col&umn\ width ޾ߥ(&U)
+
+menutrans &Update (&U)
+menutrans &Get\ Block ֥å(&G)
+menutrans &Put\ Block ֥åŬ(&P)
+
+" Names for buffer menu.
+menutrans &Buffers Хåե(&B)
+menutrans &Refresh\ menu ˥塼ɹ(&R)
+menutrans &Delete (&D)
+menutrans &Alternate ΢(&A)
+menutrans &Next ΥХåե(&N)
+menutrans &Previous ΥХåե(&P)
+let g:menutrans_no_file = "[̵̾]"
+
+" Window menu
+menutrans &Window ɥ(&W)
+menutrans &New<Tab>^Wn (&N)<Tab>^Wn
+menutrans S&plit<Tab>^Ws ʬ(&P)<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ ΢Хåեʬ(&L)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv ľʬ(&V)<Tab>^Wv
+menutrans Split\ File\ E&xplorer ե륨ץ(&X)
+menutrans &Close<Tab>^Wc Ĥ(&C)<Tab>^Wc
+menutrans Move\ &To ư(&T)
+menutrans &Top<Tab>^WK (&T)<Tab>^WK
+menutrans &Bottom<Tab>^WJ (&B)<Tab>^WJ
+menutrans &Left\ side<Tab>^WH (&L)<Tab>^WH
+menutrans &Right\ side<Tab>^WL (&R)<Tab>^WL
+menutrans Close\ &Other(s)<Tab>^Wo ¾Ĥ(&O)<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww (&X)<Tab>^Ww
+menutrans P&revious<Tab>^WW (&R)<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= Ʊ⤵(&E)<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ (&M)<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Ǿ(&i)<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| (&W)<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Ǿ(&H)<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR ˥ơ(&U)<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr ˥ơ(&D)<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. ե(&N)\.\.\.
+
+" The popup menu
+menutrans &Undo ä(&U)
+menutrans Cu&t ڤ(&T)
+menutrans &Copy ԡ(&C)
+menutrans &Paste Žդ(&P)
+menutrans &Delete (&D)
+menutrans Select\ Blockwise ֥å
+menutrans Select\ &Word ñ(&W)
+menutrans Select\ &Sentence ʸ(&S)
+menutrans Select\ Pa&ragraph (&R)
+menutrans Select\ &Line (&L)
+menutrans Select\ &Block ֥å(&B)
+menutrans Select\ &All ٤(&A)
+
+" The GUI toolbar (for Win32 or GTK)
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open ե򳫤
+ tmenu ToolBar.Save ߤΥե¸
+ tmenu ToolBar.SaveAll ٤ƤΥե¸
+ tmenu ToolBar.Print
+ tmenu ToolBar.Undo ä
+ tmenu ToolBar.Redo ⤦٤
+ tmenu ToolBar.Cut åץܡɤڤ
+ tmenu ToolBar.Copy åץܡɤإԡ
+ tmenu ToolBar.Paste åץܡɤŽդ
+ tmenu ToolBar.Replace / ִ...
+ tmenu ToolBar.FindNext 򸡺
+ tmenu ToolBar.FindPrev 򸡺
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New ɥ
+ tmenu ToolBar.WinSplit ɥʬ
+ tmenu ToolBar.WinMax ɥ粽
+ tmenu ToolBar.WinMin ɥǾ
+ tmenu ToolBar.WinClose ɥĤ
+ endif
+ tmenu ToolBar.LoadSesn åɹ
+ tmenu ToolBar.SaveSesn å¸
+ tmenu ToolBar.RunScript Vimץȼ¹
+ tmenu ToolBar.Make ץȤMake
+ tmenu ToolBar.Shell 򳫤
+ tmenu ToolBar.RunCtags tags
+ tmenu ToolBar.TagJump
+ tmenu ToolBar.Help Vimإ
+ tmenu ToolBar.FindHelp Vimإ׸
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax 󥿥å(&S)
+menutrans &Show\ File\ Types\ in\ Menu б˥塼ɽ(&S)
+menutrans Set\ '&syntax'\ only 'syntax'(&S)
+menutrans Set\ '&filetype'\ too 'filetype'(&F)
+menutrans &Off ̵(&O)
+menutrans &Manual ư(&M)
+menutrans A&utomatic ư(&U)
+menutrans on/off\ for\ &This\ file
+ \ /(&T)
+menutrans Co&lor\ test 顼ƥ(&L)
+menutrans &Highlight\ test ϥ饤ȥƥ(&H)
+menutrans &Convert\ to\ HTML HTMLإС(&C)
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" filler to avoid the line above being recognized as a modeline
+" filler
diff --git a/runtime/lang/menu_ja_jp.eucjp.vim b/runtime/lang/menu_ja_jp.eucjp.vim
new file mode 100644
index 0000000..0eff4d9
--- /dev/null
+++ b/runtime/lang/menu_ja_jp.eucjp.vim
@@ -0,0 +1,9 @@
+" Menu Translations: Japanese (for UNIX)
+" Translated By: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 15-Jun-2012.
+"
+" Copyright (C) 2004,12 MURAOKA Taro <koron.kaoriya@gmail.com>
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+
+" eucjp is the same as euc-jp. Source the other one from here.
+source <sfile>:p:h/menu_ja_jp.euc-jp.vim
diff --git a/runtime/lang/menu_ja_jp.ujis.vim b/runtime/lang/menu_ja_jp.ujis.vim
new file mode 100644
index 0000000..e74ff80
--- /dev/null
+++ b/runtime/lang/menu_ja_jp.ujis.vim
@@ -0,0 +1,9 @@
+" Menu Translations: Japanese (for UNIX)
+" Translated By: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 15-Jun-2012.
+"
+" Copyright (C) 2004,12 MURAOKA Taro <koron.kaoriya@gmail.com>
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+
+" ujis is the same as euc-jp. Source the other one from here.
+source <sfile>:p:h/menu_ja_jp.euc-jp.vim
diff --git a/runtime/lang/menu_ja_jp.utf-8.vim b/runtime/lang/menu_ja_jp.utf-8.vim
new file mode 100644
index 0000000..b3a8d64
--- /dev/null
+++ b/runtime/lang/menu_ja_jp.utf-8.vim
@@ -0,0 +1,315 @@
+" vi:set ts=8 sts=8 sw=8 tw=0:
+"
+" Menu Translations: Japanese (UTF-8)
+" Last Translator: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 20-Feb-2022.
+"
+" Copyright (C) 2001-2022 MURAOKA Taro <koron.kaoriya@gmail.com>,
+" vim-jp <http://vim-jp.org/>
+"
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+"
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Help menu
+menutrans &Help ヘルプ(&H)
+menutrans &Overview<Tab><F1> 概略(&O)<Tab><F1>
+menutrans &User\ Manual ユーザーマニュアル(&U)
+menutrans &How-To\ links &How-toリンク
+menutrans &Credits クレジット(&C)
+menutrans Co&pying 著作権情報(&P)
+menutrans &Sponsor/Register スポンサー/登録(&S)
+menutrans O&rphans 孤児(&R)
+menutrans &Version バージョン情報(&V)
+menutrans &About Vimについて(&A)
+
+let g:menutrans_help_dialog = "ヘルプを検索したいコマンドもしくは単語を入力してください:\n\n挿入モードのコマンドには i_ を先頭に付加します. (例: i_CTRL-X)\nコマンドライン編集コマンドには c_ を先頭に付加します. (例: c_<Del>)\nオプションの名前には ' を付加します. (例: 'shiftwidth')"
+
+" File menu
+menutrans &File ファイル(&F)
+menutrans &Open\.\.\.<Tab>:e 開く(&O)\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp 分割して開く(&L)\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew タブページで開く<Tab>:tabnew
+menutrans &New<Tab>:enew 新規作成(&N)<Tab>:enew
+menutrans &Close<Tab>:close 閉じる(&C)<Tab>:close
+menutrans &Save<Tab>:w 保存(&S)<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav 名前を付けて保存(&A)\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. 差分表示(&D)\.\.\.
+menutrans Split\ Patched\ &By\.\.\. パッチ結果を表示(&B)\.\.\.
+menutrans &Print 印刷(&P)
+menutrans Sa&ve-Exit<Tab>:wqa 保存して終了(&V)<Tab>:wqa
+menutrans E&xit<Tab>:qa 終了(&X)<Tab>:qa
+
+" Edit menu
+menutrans &Edit 編集(&E)
+menutrans &Undo<Tab>u 取り消す(&U)<Tab>u
+menutrans &Redo<Tab>^R もう一度やる(&R)<Tab>^R
+menutrans Rep&eat<Tab>\. 繰り返す(&E)<Tab>\.
+menutrans Cu&t<Tab>"+x 切り取り(&T)<Tab>"+x
+menutrans &Copy<Tab>"+y コピー(&C)<Tab>"+y
+menutrans &Paste<Tab>"+gP 貼り付け(&P)<Tab>"+gP
+menutrans Put\ &Before<Tab>[p 前に貼る(&B)<Tab>[p
+menutrans Put\ &After<Tab>]p 後に貼る(&A)<Tab>]p
+menutrans &Delete<Tab>x 消す(&D)<Tab>x
+menutrans &Select\ All<Tab>ggVG 全て選択(&S)<Tab>ggVG
+menutrans &Find\.\.\. 検索(&F)\.\.\.
+menutrans &Find<Tab>/ 検索(&F)<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. 置換(&L)\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s 置換(&L)<Tab>:%s
+menutrans Find\ and\ Rep&lace<Tab>:s 置換(&L)<Tab>:s
+"menutrans Options\.\.\. オプション(&O)\.\.\.
+menutrans Settings\ &Window 設定ウィンドウ(&W)
+menutrans Startup\ &Settings 起動時の設定(&S)
+
+" Edit/Global Settings
+menutrans &Global\ Settings 全体設定(&G)
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls!
+ \ パターン強調切替(&H)<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic!
+ \ 大小文字区別切替(&I)<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm!
+ \ マッチ表示切替(&S)<Tab>:set\ sm!
+menutrans &Context\ lines カーソル周辺行数(&C)
+menutrans &Virtual\ Edit 仮想編集(&V)
+menutrans Never 無効
+menutrans Block\ Selection ブロック選択時
+menutrans Insert\ mode 挿入モード時
+menutrans Block\ and\ Insert ブロック/挿入モード時
+menutrans Always 常時
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im!
+ \ 挿入(初心者)モード切替(&M)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp!
+ \ Vi互換モード切替(&O)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. 検索パス(&P)\.\.\.
+menutrans Ta&g\ Files\.\.\. タグファイル(&G)\.\.\.
+"
+" GUI options
+menutrans Toggle\ &Toolbar ツールバー表示切替(&T)
+menutrans Toggle\ &Bottom\ Scrollbar スクロールバー(下)表示切替(&B)
+menutrans Toggle\ &Left\ Scrollbar スクロールバー(左)表示切替(&L)
+menutrans Toggle\ &Right\ Scrollbar スクロールバー(右)表示切替(&R)
+
+let g:menutrans_path_dialog = "ファイルの検索パスを入力してください:\nディレクトリ名はカンマ ( , ) で区切ってください."
+let g:menutrans_tags_dialog = "タグファイルの名前を入力してください:\n名前はカンマ ( , ) で区切ってください."
+
+" Edit/File Settings
+
+" Boolean options
+menutrans F&ile\ Settings ファイル設定(&I)
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu!
+ \ 行番号表示切替(&N)<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu!
+ \ 相対行番号表示切替(&V)<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list!
+ \ リストモード切替(&L)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap!
+ \ 行折返し切替(&W)<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ word<Tab>:set\ lbr!
+ \ 単語折返し切替(&R)<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et!
+ \ タブ展開切替(&E)<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai!
+ \ 自動字下げ切替(&A)<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin!
+ \ C言語字下げ切替(&C)<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth シフト幅(&S)
+menutrans Soft\ &Tabstop ソフトウェアタブ幅(&T)
+menutrans Te&xt\ Width\.\.\. テキスト幅(&X)\.\.\.
+menutrans &File\ Format\.\.\. 改行記号選択(&F)\.\.\.
+
+let g:menutrans_textwidth_dialog = "テキストの幅('textwidth')を設定してください (0で整形を無効化):"
+let g:menutrans_fileformat_dialog = "ファイル出力の際の改行記号の形式を選んでください."
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\nキャンセル(&C)"
+
+menutrans Show\ C&olor\ Schemes\ in\ Menu 色テーマをメニューに表示(&O)
+menutrans C&olor\ Scheme 色テーマ選択(&O)
+menutrans Show\ &Keymaps\ in\ Menu キーマップをメニューに表示(&K)
+menutrans &Keymap キーマップ(&K)
+menutrans None なし
+
+" Programming menu
+menutrans &Tools ツール(&T)
+menutrans &Jump\ to\ this\ tag<Tab>g^] タグジャンプ(&J)<Tab>g^]
+menutrans Jump\ &back<Tab>^T 戻る(&B)<Tab>^T
+menutrans Build\ &Tags\ File タグファイル作成(&T)
+menutrans &Make<Tab>:make ビルド(&M)<Tab>:make
+menutrans &List\ Errors<Tab>:cl エラーリスト(&L)<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! メッセージリスト(&I)<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn 次のエラーへ(&N)<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp 前のエラーへ(&P)<Tab>:cp
+menutrans &Older\ List<Tab>:cold 古いリスト(&O)<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew 新しいリスト(&E)<Tab>:cnew
+menutrans Error\ &Window エラーウィンドウ(&W)
+menutrans &Update<Tab>:cwin 更新(&U)<Tab>:cwin
+menutrans &Open<Tab>:copen 開く(&O)<Tab>:copen
+menutrans &Close<Tab>:cclose 閉じる(&C)<Tab>:cclose
+menutrans &Convert\ to\ HEX<Tab>:%!xxd HEXへ変換(&C)<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r HEXから逆変換(&R)<Tab>%!xxd\ -r
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu コンパイラ設定をメニューに表示(&T)
+menutrans Se&t\ Compiler コンパイラ設定(&T)
+
+" Tools.Spelling Menu
+menutrans &Spelling スペリング(&S)
+menutrans &Spell\ Check\ On スペルチェック有効(&S)
+menutrans Spell\ Check\ &Off スペルチェック無効(&O)
+menutrans To\ &Next\ error<Tab>]s 次のエラー(&N)<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s 前のエラー(&P)<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= 修正候補(&C)<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall 修正を繰り返す(&R)<Tab>:spellrepall
+menutrans Set\ language\ to\ "en" 言語を\ "en"\ に設定する
+menutrans Set\ language\ to\ "en_au" 言語を\ "en_au"\ に設定する
+menutrans Set\ language\ to\ "en_ca" 言語を\ "en_ca"\ に設定する
+menutrans Set\ language\ to\ "en_gb" 言語を\ "en_gb"\ に設定する
+menutrans Set\ language\ to\ "en_nz" 言語を\ "en_nz"\ に設定する
+menutrans Set\ language\ to\ "en_us" 言語を\ "en_us"\ に設定する
+menutrans &Find\ More\ Languages 他の言語を検索する(&F)
+
+let g:menutrans_spell_change_ARG_to = '"%s"\ を変更'
+let g:menutrans_spell_add_ARG_to_word_list = '"%s"\ を単語リストに追加'
+let g:menutrans_spell_ignore_ARG = '"%s"\ を無視'
+
+" Tools.Fold Menu
+menutrans &Folding 折畳み(&F)
+" open close folds
+menutrans &Enable/Disable\ folds<Tab>zi 有効/無効切替(&E)<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv カーソル行を表示(&V)<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx カーソル行だけを表示(&W)<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm 折畳みを閉じる(&L)<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM 全折畳みを閉じる(&C)<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr 折畳みを開く(&P)<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR 全折畳みを開く(&O)<Tab>zR
+" fold method
+menutrans Fold\ Met&hod 折畳み方法(&H)
+menutrans M&anual 手動(&A)
+menutrans I&ndent インデント(&N)
+menutrans E&xpression 式評価(&X)
+menutrans S&yntax シンタックス(&Y)
+menutrans &Diff 差分(&D)
+menutrans Ma&rker マーカー(&R)
+" create and delete folds
+menutrans Create\ &Fold<Tab>zf 折畳み作成(&F)<Tab>zf
+menutrans &Delete\ Fold<Tab>zd 折畳み削除(&D)<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD 全折畳み削除(&A)<Tab>zD
+" moving around in folds
+menutrans Fold\ col&umn\ width 折畳みカラム幅(&U)
+
+menutrans &Update 更新(&U)
+menutrans &Get\ Block ブロック抽出(&G)
+menutrans &Put\ Block ブロック適用(&P)
+
+" Names for buffer menu.
+menutrans &Buffers バッファ(&B)
+menutrans &Refresh\ menu メニュー再読込(&R)
+menutrans &Delete 削除(&D)
+menutrans &Alternate 裏へ切替(&A)
+menutrans &Next 次のバッファ(&N)
+menutrans &Previous 前のバッファ(&P)
+let g:menutrans_no_file = "[無名]"
+
+" Window menu
+menutrans &Window ウィンドウ(&W)
+menutrans &New<Tab>^Wn 新規作成(&N)<Tab>^Wn
+menutrans S&plit<Tab>^Ws 分割(&P)<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ 裏バッファへ分割(&L)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv 垂直分割(&V)<Tab>^Wv
+menutrans Split\ File\ E&xplorer ファイルエクスプローラ(&X)
+menutrans &Close<Tab>^Wc 閉じる(&C)<Tab>^Wc
+menutrans Move\ &To 移動(&T)
+menutrans &Top<Tab>^WK 上(&T)<Tab>^WK
+menutrans &Bottom<Tab>^WJ 下(&B)<Tab>^WJ
+menutrans &Left\ side<Tab>^WH 左(&L)<Tab>^WH
+menutrans &Right\ side<Tab>^WL 右(&R)<Tab>^WL
+menutrans Close\ &Other(s)<Tab>^Wo 他を閉じる(&O)<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww 次へ(&X)<Tab>^Ww
+menutrans P&revious<Tab>^WW 前へ(&R)<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= 同じ高さに(&E)<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ 最大高に(&M)<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ 最小高に(&i)<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| 最大幅に(&W)<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| 最小幅に(&H)<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR 上にローテーション(&U)<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr 下にローテーション(&D)<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. フォント設定(&N)\.\.\.
+
+" The popup menu
+menutrans &Undo 取り消す(&U)
+menutrans Cu&t 切り取り(&T)
+menutrans &Copy コピー(&C)
+menutrans &Paste 貼り付け(&P)
+menutrans &Delete 削除(&D)
+menutrans Select\ Blockwise 矩形ブロック選択
+menutrans Select\ &Word 単語選択(&W)
+menutrans Select\ &Sentence 文選択(&S)
+menutrans Select\ Pa&ragraph 段落選択(&R)
+menutrans Select\ &Line 行選択(&L)
+menutrans Select\ &Block ブロック選択(&B)
+menutrans Select\ &All すべて選択(&A)
+
+" The GUI toolbar (for Win32 or GTK)
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open ファイルを開く
+ tmenu ToolBar.Save 現在のファイルを保存
+ tmenu ToolBar.SaveAll すべてのファイルを保存
+ tmenu ToolBar.Print 印刷
+ tmenu ToolBar.Undo 取り消し
+ tmenu ToolBar.Redo もう一度やる
+ tmenu ToolBar.Cut クリップボードへ切り取り
+ tmenu ToolBar.Copy クリップボードへコピー
+ tmenu ToolBar.Paste クリップボードから貼り付け
+ tmenu ToolBar.Replace 検索 / 置換...
+ tmenu ToolBar.FindNext 次を検索
+ tmenu ToolBar.FindPrev 前を検索
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New 新規ウィンドウ作成
+ tmenu ToolBar.WinSplit ウィンドウ分割
+ tmenu ToolBar.WinMax ウィンドウ最大化
+ tmenu ToolBar.WinMin ウィンドウ最小化
+ tmenu ToolBar.WinClose ウィンドウを閉じる
+ endif
+ tmenu ToolBar.LoadSesn セッション読込
+ tmenu ToolBar.SaveSesn セッション保存
+ tmenu ToolBar.RunScript Vimスクリプト実行
+ tmenu ToolBar.Make プロジェクトをMake
+ tmenu ToolBar.Shell シェルを開く
+ tmenu ToolBar.RunCtags tags作成
+ tmenu ToolBar.TagJump タグジャンプ
+ tmenu ToolBar.Help Vimヘルプ
+ tmenu ToolBar.FindHelp Vimヘルプ検索
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax シンタックス(&S)
+menutrans &Show\ File\ Types\ in\ Menu 対応形式をメニューに表示(&S)
+menutrans Set\ '&syntax'\ only 'syntax'だけ設定(&S)
+menutrans Set\ '&filetype'\ too 'filetype'も設定(&F)
+menutrans &Off 無効化(&O)
+menutrans &Manual 手動設定(&M)
+menutrans A&utomatic 自動設定(&U)
+menutrans on/off\ for\ &This\ file
+ \ オン/オフ切替(&T)
+menutrans Co&lor\ test カラーテスト(&L)
+menutrans &Highlight\ test ハイライトテスト(&H)
+menutrans &Convert\ to\ HTML HTMLへコンバート(&C)
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" filler to avoid the line above being recognized as a modeline
+" filler
diff --git a/runtime/lang/menu_japanese_japan.932.vim b/runtime/lang/menu_japanese_japan.932.vim
new file mode 100644
index 0000000..530131b
--- /dev/null
+++ b/runtime/lang/menu_japanese_japan.932.vim
@@ -0,0 +1,315 @@
+" vi:set ts=8 sts=8 sw=8 tw=0:
+"
+" Menu Translations: Japanese (CP932)
+" Last Translator: MURAOKA Taro <koron.kaoriya@gmail.com>
+" Last Change: 20-Feb-2022.
+"
+" Copyright (C) 2001-2022 MURAOKA Taro <koron.kaoriya@gmail.com>,
+" vim-jp <http://vim-jp.org/>
+"
+" THIS FILE IS DISTRIBUTED UNDER THE VIM LICENSE.
+"
+" Generated from menu_ja_jp.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding cp932
+
+" Help menu
+menutrans &Help wv(&H)
+menutrans &Overview<Tab><F1> T(&O)<Tab><F1>
+menutrans &User\ Manual [U[}jA(&U)
+menutrans &How-To\ links &How-toN
+menutrans &Credits NWbg(&C)
+menutrans Co&pying 쌠(&P)
+menutrans &Sponsor/Register X|T[/o^(&S)
+menutrans O&rphans ǎ(&R)
+menutrans &Version o[W(&V)
+menutrans &About Vimɂ‚(&A)
+
+let g:menutrans_help_dialog = "wvR}h͒P͂Ă:\n\n}[h̃R}hɂ i_ 擪ɕt܂. (: i_CTRL-X)\nR}hCҏWR}hɂ c_ 擪ɕt܂. (: c_<Del>)\nIvV̖Oɂ ' t܂. (: 'shiftwidth')"
+
+" File menu
+menutrans &File t@C(&F)
+menutrans &Open\.\.\.<Tab>:e J(&O)\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp ĊJ(&L)\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew ^uy[WŊJ<Tab>:tabnew
+menutrans &New<Tab>:enew VK쐬(&N)<Tab>:enew
+menutrans &Close<Tab>:close ‚(&C)<Tab>:close
+menutrans &Save<Tab>:w ۑ(&S)<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Otĕۑ(&A)\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. \(&D)\.\.\.
+menutrans Split\ Patched\ &By\.\.\. pb`ʂ\(&B)\.\.\.
+menutrans &Print (&P)
+menutrans Sa&ve-Exit<Tab>:wqa ۑďI(&V)<Tab>:wqa
+menutrans E&xit<Tab>:qa I(&X)<Tab>:qa
+
+" Edit menu
+menutrans &Edit ҏW(&E)
+menutrans &Undo<Tab>u (&U)<Tab>u
+menutrans &Redo<Tab>^R x(&R)<Tab>^R
+menutrans Rep&eat<Tab>\. JԂ(&E)<Tab>\.
+menutrans Cu&t<Tab>"+x ؂(&T)<Tab>"+x
+menutrans &Copy<Tab>"+y Rs[(&C)<Tab>"+y
+menutrans &Paste<Tab>"+gP \t(&P)<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Oɓ\(&B)<Tab>[p
+menutrans Put\ &After<Tab>]p ɓ\(&A)<Tab>]p
+menutrans &Delete<Tab>x (&D)<Tab>x
+menutrans &Select\ All<Tab>ggVG SđI(&S)<Tab>ggVG
+menutrans &Find\.\.\. (&F)\.\.\.
+menutrans &Find<Tab>/ (&F)<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. u(&L)\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s u(&L)<Tab>:%s
+menutrans Find\ and\ Rep&lace<Tab>:s u(&L)<Tab>:s
+"menutrans Options\.\.\. IvV(&O)\.\.\.
+menutrans Settings\ &Window ݒEBhE(&W)
+menutrans Startup\ &Settings N̐ݒ(&S)
+
+" Edit/Global Settings
+menutrans &Global\ Settings S̐ݒ(&G)
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls!
+ \ p^[ؑ(&H)<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic!
+ \ 召ʐؑ(&I)<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm!
+ \ }b`\ؑ(&S)<Tab>:set\ sm!
+menutrans &Context\ lines J[\Ӎs(&C)
+menutrans &Virtual\ Edit zҏW(&V)
+menutrans Never
+menutrans Block\ Selection ubNI
+menutrans Insert\ mode }[h
+menutrans Block\ and\ Insert ubN/}[h
+menutrans Always 펞
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im!
+ \ }(S)[hؑ(&M)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp!
+ \ Vi݊[hؑ(&O)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. pX(&P)\.\.\.
+menutrans Ta&g\ Files\.\.\. ^Ot@C(&G)\.\.\.
+"
+" GUI options
+menutrans Toggle\ &Toolbar c[o[\ؑ(&T)
+menutrans Toggle\ &Bottom\ Scrollbar XN[o[()\ؑ(&B)
+menutrans Toggle\ &Left\ Scrollbar XN[o[()\ؑ(&L)
+menutrans Toggle\ &Right\ Scrollbar XN[o[(E)\ؑ(&R)
+
+let g:menutrans_path_dialog = "t@ČpX͂Ă:\nfBNg̓J} ( , ) ŋ؂Ă."
+let g:menutrans_tags_dialog = "^Ot@C̖O͂Ă:\nO̓J} ( , ) ŋ؂Ă."
+
+" Edit/File Settings
+
+" Boolean options
+menutrans F&ile\ Settings t@Cݒ(&I)
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu!
+ \ sԍ\ؑ(&N)<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu!
+ \ ΍sԍ\ؑ(&V)<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list!
+ \ Xg[hؑ(&L)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap!
+ \ sܕԂؑ(&W)<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ word<Tab>:set\ lbr!
+ \ PܕԂؑ(&R)<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et!
+ \ ^uWJؑ(&E)<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai!
+ \ ؑ(&A)<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin!
+ \ Cꎚؑ(&C)<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth Vtg(&S)
+menutrans Soft\ &Tabstop \tgEFA^u(&T)
+menutrans Te&xt\ Width\.\.\. eLXg(&X)\.\.\.
+menutrans &File\ Format\.\.\. sLI(&F)\.\.\.
+
+let g:menutrans_textwidth_dialog = "eLXg̕('textwidth')ݒ肵Ă (0Ő`𖳌):"
+let g:menutrans_fileformat_dialog = "t@Co͂̍ۂ̉sĽ`Ił."
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\nLZ(&C)"
+
+menutrans Show\ C&olor\ Schemes\ in\ Menu Fe[}j[ɕ\(&O)
+menutrans C&olor\ Scheme Fe[}I(&O)
+menutrans Show\ &Keymaps\ in\ Menu L[}bvj[ɕ\(&K)
+menutrans &Keymap L[}bv(&K)
+menutrans None Ȃ
+
+" Programming menu
+menutrans &Tools c[(&T)
+menutrans &Jump\ to\ this\ tag<Tab>g^] ^OWv(&J)<Tab>g^]
+menutrans Jump\ &back<Tab>^T ߂(&B)<Tab>^T
+menutrans Build\ &Tags\ File ^Ot@C쐬(&T)
+menutrans &Make<Tab>:make rh(&M)<Tab>:make
+menutrans &List\ Errors<Tab>:cl G[Xg(&L)<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! bZ[WXg(&I)<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn ̃G[(&N)<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp ÕG[(&P)<Tab>:cp
+menutrans &Older\ List<Tab>:cold ÂXg(&O)<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew VXg(&E)<Tab>:cnew
+menutrans Error\ &Window G[EBhE(&W)
+menutrans &Update<Tab>:cwin XV(&U)<Tab>:cwin
+menutrans &Open<Tab>:copen J(&O)<Tab>:copen
+menutrans &Close<Tab>:cclose ‚(&C)<Tab>:cclose
+menutrans &Convert\ to\ HEX<Tab>:%!xxd HEX֕ϊ(&C)<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r HEXtϊ(&R)<Tab>%!xxd\ -r
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu RpCݒj[ɕ\(&T)
+menutrans Se&t\ Compiler RpCݒ(&T)
+
+" Tools.Spelling Menu
+menutrans &Spelling XyO(&S)
+menutrans &Spell\ Check\ On Xy`FbNL(&S)
+menutrans Spell\ Check\ &Off Xy`FbN(&O)
+menutrans To\ &Next\ error<Tab>]s ̃G[(&N)<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s ÕG[(&P)<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= C(&C)<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall CJԂ(&R)<Tab>:spellrepall
+menutrans Set\ language\ to\ "en" \ "en"\ ɐݒ肷
+menutrans Set\ language\ to\ "en_au" \ "en_au"\ ɐݒ肷
+menutrans Set\ language\ to\ "en_ca" \ "en_ca"\ ɐݒ肷
+menutrans Set\ language\ to\ "en_gb" \ "en_gb"\ ɐݒ肷
+menutrans Set\ language\ to\ "en_nz" \ "en_nz"\ ɐݒ肷
+menutrans Set\ language\ to\ "en_us" \ "en_us"\ ɐݒ肷
+menutrans &Find\ More\ Languages ̌(&F)
+
+let g:menutrans_spell_change_ARG_to = '"%s"\ ύX'
+let g:menutrans_spell_add_ARG_to_word_list = '"%s"\ PꃊXgɒlj'
+let g:menutrans_spell_ignore_ARG = '"%s"\ 𖳎'
+
+" Tools.Fold Menu
+menutrans &Folding ܏(&F)
+" open close folds
+menutrans &Enable/Disable\ folds<Tab>zi L/ؑ(&E)<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv J[\s\(&V)<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx J[\s\(&W)<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm ܏݂‚(&L)<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM S܏݂‚(&C)<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr ܏݂J(&P)<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR S܏݂J(&O)<Tab>zR
+" fold method
+menutrans Fold\ Met&hod ܏ݕ@(&H)
+menutrans M&anual 蓮(&A)
+menutrans I&ndent Cfg(&N)
+menutrans E&xpression ](&X)
+menutrans S&yntax V^bNX(&Y)
+menutrans &Diff (&D)
+menutrans Ma&rker }[J[(&R)
+" create and delete folds
+menutrans Create\ &Fold<Tab>zf ܏ݍ쐬(&F)<Tab>zf
+menutrans &Delete\ Fold<Tab>zd ܏ݍ폜(&D)<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD S܏ݍ폜(&A)<Tab>zD
+" moving around in folds
+menutrans Fold\ col&umn\ width ܏݃J(&U)
+
+menutrans &Update XV(&U)
+menutrans &Get\ Block ubNo(&G)
+menutrans &Put\ Block ubNKp(&P)
+
+" Names for buffer menu.
+menutrans &Buffers obt@(&B)
+menutrans &Refresh\ menu j[ēǍ(&R)
+menutrans &Delete 폜(&D)
+menutrans &Alternate ֐ؑ(&A)
+menutrans &Next ̃obt@(&N)
+menutrans &Previous Õobt@(&P)
+let g:menutrans_no_file = "[]"
+
+" Window menu
+menutrans &Window EBhE(&W)
+menutrans &New<Tab>^Wn VK쐬(&N)<Tab>^Wn
+menutrans S&plit<Tab>^Ws (&P)<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ obt@֕(&L)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv (&V)<Tab>^Wv
+menutrans Split\ File\ E&xplorer t@CGNXv[(&X)
+menutrans &Close<Tab>^Wc ‚(&C)<Tab>^Wc
+menutrans Move\ &To ړ(&T)
+menutrans &Top<Tab>^WK (&T)<Tab>^WK
+menutrans &Bottom<Tab>^WJ (&B)<Tab>^WJ
+menutrans &Left\ side<Tab>^WH (&L)<Tab>^WH
+menutrans &Right\ side<Tab>^WL E(&R)<Tab>^WL
+menutrans Close\ &Other(s)<Tab>^Wo ‚(&O)<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww (&X)<Tab>^Ww
+menutrans P&revious<Tab>^WW O(&R)<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= (&E)<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ ő卂(&M)<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ ŏ(&i)<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| ő啝(&W)<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| ŏ(&H)<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR Ƀ[e[V(&U)<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Ƀ[e[V(&D)<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. tHgݒ(&N)\.\.\.
+
+" The popup menu
+menutrans &Undo (&U)
+menutrans Cu&t ؂(&T)
+menutrans &Copy Rs[(&C)
+menutrans &Paste \t(&P)
+menutrans &Delete 폜(&D)
+menutrans Select\ Blockwise `ubNI
+menutrans Select\ &Word PI(&W)
+menutrans Select\ &Sentence I(&S)
+menutrans Select\ Pa&ragraph iI(&R)
+menutrans Select\ &Line sI(&L)
+menutrans Select\ &Block ubNI(&B)
+menutrans Select\ &All ׂđI(&A)
+
+" The GUI toolbar (for Win32 or GTK)
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open t@CJ
+ tmenu ToolBar.Save ݂̃t@Cۑ
+ tmenu ToolBar.SaveAll ׂẴt@Cۑ
+ tmenu ToolBar.Print
+ tmenu ToolBar.Undo
+ tmenu ToolBar.Redo x
+ tmenu ToolBar.Cut Nbv{[h֐؂
+ tmenu ToolBar.Copy Nbv{[hփRs[
+ tmenu ToolBar.Paste Nbv{[h\t
+ tmenu ToolBar.Replace / u...
+ tmenu ToolBar.FindNext
+ tmenu ToolBar.FindPrev O
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New VKEBhE쐬
+ tmenu ToolBar.WinSplit EBhE
+ tmenu ToolBar.WinMax EBhEő剻
+ tmenu ToolBar.WinMin EBhEŏ
+ tmenu ToolBar.WinClose EBhE‚
+ endif
+ tmenu ToolBar.LoadSesn ZbVǍ
+ tmenu ToolBar.SaveSesn ZbVۑ
+ tmenu ToolBar.RunScript VimXNvgs
+ tmenu ToolBar.Make vWFNgMake
+ tmenu ToolBar.Shell VFJ
+ tmenu ToolBar.RunCtags tags쐬
+ tmenu ToolBar.TagJump ^OWv
+ tmenu ToolBar.Help Vimwv
+ tmenu ToolBar.FindHelp Vimwv
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax V^bNX(&S)
+menutrans &Show\ File\ Types\ in\ Menu Ή`j[ɕ\(&S)
+menutrans Set\ '&syntax'\ only 'syntax'ݒ(&S)
+menutrans Set\ '&filetype'\ too 'filetype'ݒ(&F)
+menutrans &Off (&O)
+menutrans &Manual 蓮ݒ(&M)
+menutrans A&utomatic ݒ(&U)
+menutrans on/off\ for\ &This\ file
+ \ I/Itؑ(&T)
+menutrans Co&lor\ test J[eXg(&L)
+menutrans &Highlight\ test nCCgeXg(&H)
+menutrans &Convert\ to\ HTML HTMLփRo[g(&C)
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" filler to avoid the line above being recognized as a modeline
+" filler
diff --git a/runtime/lang/menu_ko.utf-8.vim b/runtime/lang/menu_ko.utf-8.vim
new file mode 100644
index 0000000..52efddc
--- /dev/null
+++ b/runtime/lang/menu_ko.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Korean
+
+source <sfile>:p:h/menu_ko_kr.utf-8.vim
diff --git a/runtime/lang/menu_ko_kr.euckr.vim b/runtime/lang/menu_ko_kr.euckr.vim
new file mode 100644
index 0000000..59e9580
--- /dev/null
+++ b/runtime/lang/menu_ko_kr.euckr.vim
@@ -0,0 +1,266 @@
+" Menu Translations: Korean
+" Maintainer: SungHyun Nam <goweol@gmail.com>
+" Last Change: 2012 May 01
+" Generated from menu_ko_kr.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding euc-kr
+
+" Help menu
+menutrans &Help (&H)
+menutrans &Overview<Tab><F1> (&O)<Tab><F1>
+menutrans &User\ Manual \ Ŵ(&U)
+menutrans &How-to\ links Ͽ\ (&H)
+menutrans &GUI GUI(&G)
+menutrans &Find\.\.\. ã(&F)\.\.\.
+menutrans &Credits \ (&C)
+menutrans Co&pying ۱(&p)
+menutrans &Sponsor/Register Ŀ/(&S)
+menutrans O&rphans (&r)
+menutrans &Version (&V)
+menutrans &About \ α׷(&A)
+
+" File menu
+menutrans &File (&F)
+menutrans &Open\.\.\.<Tab>:e (&O)\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp \ (&l)\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew \ \.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew ο(&N)<Tab>:enew
+menutrans &Close<Tab>:close ݱ(&C)<Tab>:close
+menutrans &Save<Tab>:w (&S)<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav ٸ\ ̸\ (&A)\.\.\.<Tab>:sav
+"menutrans Split\ &Diff\ with\.\.\. Split\ &Diff\ with\.\.\.
+"menutrans Split\ Patched\ &By\.\.\. Split\ Patched\ &By\.\.\.
+menutrans &Print μ(&P)
+menutrans Sa&ve-Exit<Tab>:wqa ϰ\ (&v)<Tab>:wqa
+menutrans E&xit<Tab>:qa (&x)<Tab>:qa
+
+" Edit menu
+menutrans &Edit (&E)
+menutrans &Undo<Tab>u (&U)<Tab>u
+menutrans &Redo<Tab>^R ٽ\ (&R)<Tab>^R
+menutrans Rep&eat<Tab>\. Ǯ(&e)<Tab>\.
+menutrans Cu&t<Tab>"+x ڸ(&t)<Tab>"+x
+menutrans &Copy<Tab>"+y (&C)<Tab>"+y
+menutrans &Paste<Tab>"+gP ̱(&P)<Tab>"+gP
+menutrans Put\ &Before<Tab>[p տ\ ̱(&B)<Tab>[p
+menutrans Put\ &After<Tab>]p ڿ\ ̱(&A)<Tab>]p
+menutrans &Delete<Tab>x (&D)<Tab>x
+menutrans &Select\ All<Tab>ggVG \ (&S)<Tab>ggVG
+menutrans &Find\.\.\. ã(&F)\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. ãƼ\ ٲٱ(&l)\.\.\.
+menutrans Settings\ &Window \ â(&W)
+menutrans Startup\ &Settings \ (&S)
+
+" Edit/Global Settings
+menutrans &Global\ Settings \ (&G)
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! \ ̶Ʈ\ (&H)<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! ҹ\ \ (&I)<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Showmatch\ (&S)<Tab>:set\ sm!
+menutrans &Context\ lines ؽƮ\ (&C)
+menutrans &Virtual\ Edit \ (&V)
+menutrans Never \ \
+menutrans Block\ Selection \
+menutrans Insert\ mode \
+menutrans Block\ and\ Insert \
+menutrans Always ׻\
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! \ \ (&M)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Vi\ ȣȯ\ (&o)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. ã\ (&P)\.\.\.
+menutrans Ta&g\ Files\.\.\. ǥ\ (&g)\.\.\.
+
+" GUI options
+menutrans Toggle\ &Toolbar \ (&T)
+menutrans Toggle\ &Bottom\ Scrollbar ٴ\ ũѹ\ (&B)
+menutrans Toggle\ &Left\ Scrollbar \ ũѹ\ (&L)
+menutrans Toggle\ &Right\ Scrollbar \ ũѹ\ (&R)
+
+" Edit/File Settings
+menutrans F&ile\ Settings \ (&i)
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! \ ȣ̱\ (&N)<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! \ \ (&L)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! \ Wrap\ (&W)<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! \ Wrap\ (&r)<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! \ Ȯ\ (&e)<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! ڵεƮ\ (&a)<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! C-ε\ (&C)<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth Ʈ\ ʺ(&S)
+menutrans Soft\ &Tabstop Ʈ\ ǽ(&T)
+menutrans Te&xt\ Width\.\.\. ؽƮ\ ʺ(&x)\.\.\.
+menutrans &File\ Format\.\.\. \ (&F)\.\.\.
+menutrans C&olor\ Scheme ÷\ Ŵ(&o)
+menutrans &Keymap Ű(&K)
+
+menutrans Select\ Fo&nt\.\.\. ۲\ (&F)\.\.\.
+
+" Programming menu
+menutrans &Tools (&T)
+menutrans &Jump\ to\ this\ tag<Tab>g^] \ ǥ\ (&J)<Tab>g^]
+menutrans Jump\ &back<Tab>^T ڷ\ (&b)<Tab>^T
+menutrans Build\ &Tags\ File ǥ\ \ (&T)
+
+menutrans &Spelling \ ˻(&S)
+menutrans &Spell\ Check\ On \ ˻\ (&S)
+menutrans Spell\ Check\ &Off \ ˻\ (&O)
+menutrans To\ &Next\ error<Tab>]s \ (&N)<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s \ (&P)<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= \ (&C)<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall \ ݺ(&R)<Tab>:spellrepall
+menutrans Set\ language\ to\ "en" \ "en"\
+menutrans Set\ language\ to\ "en_au" \ "en_au"\
+menutrans Set\ language\ to\ "en_ca" \ "en_ca"\
+menutrans Set\ language\ to\ "en_gb" \ "en_gb"\
+menutrans Set\ language\ to\ "en_nz" \ "en_nz"\
+menutrans Set\ language\ to\ "en_us" \ "en_us"\
+menutrans &Find\ More\ Languages ٸ\ \ ã(&F)
+
+" Tools.Fold Menu
+menutrans &Folding (&F)
+" open close folds
+menutrans &Enable/Disable\ folds<Tab>zi \ \ (&E)<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv Ŀ\ \ (&V)<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Ŀ\ ٸ\ (&w)<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm \ \ \ ݱ(&l)<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM \ \ ݱ(&C)<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr \ \ \ (&p)<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR \ κ\ \ (&O)<Tab>zR
+" fold method
+menutrans Fold\ Met&hod \ (&h)
+menutrans M&anual (&a)
+menutrans I&ndent 鿩(&n)
+menutrans E&xpression ǥ(&x)
+menutrans S&yntax ý(&y)
+"menutrans &Diff &Diff
+menutrans Ma&rker ǥ(&r)
+" create and delete folds
+menutrans Create\ &Fold<Tab>zf \ (&F)<Tab>zf
+menutrans &Delete\ Fold<Tab>zd \ (&D)<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD \ \ (&A)<Tab>zD
+" moving around in folds
+menutrans Fold\ column\ &width \ ÷\ ʺ(&w)
+
+"menutrans &Diff &Diff
+menutrans &Update (&U)
+menutrans &Get\ Block \ (&G)
+menutrans &Put\ Block \ ֱ(&P)
+
+menutrans &Make<Tab>:make (&M)<Tab>:make
+menutrans &List\ Errors<Tab>:cl \ \ (&L)<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! ޽\ \ (&i)<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn \ (&N)<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp \ (&P)<Tab>:cp
+menutrans &Older\ List<Tab>:cold \ (&O)<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew ο\ (&e)<Tab>:cnew
+menutrans Error\ &Window \ â(&W)
+menutrans &Update<Tab>:cwin (&U)<Tab>:cwin
+menutrans &Open<Tab>:copen (&O)<Tab>:copen
+menutrans &Close<Tab>:cclose ݱ(&C)<Tab>:cclose
+menutrans Se&T\ Compiler Ϸ\ (&T)
+menutrans &Convert\ to\ HEX<Tab>:%!mc\ vim:xxd \ ȯ<Tab>:%!mc\ vim:xxd
+menutrans &Convert\ to\ HEX<Tab>:%!xxd \ ȯ(&C)<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!mc\ vim:xxd\ -r \ ȯ(&r)<Tab>:%!mc\ vim:xxd\ -r
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r \ ȯ(&r)<Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers (&B)
+menutrans &Refresh\ menu ǥ\ ٽñ׸(&R)
+menutrans &Delete (&D)
+menutrans &Alternate ü(&A)
+menutrans &Next (&N)
+menutrans &Previous (&P)
+
+" Window menu
+menutrans &Window â(&W)
+menutrans &New<Tab>^Wn \ â(&N)<Tab>^Wn
+menutrans S&plit<Tab>^Ws (&p)<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ #\ (&l)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv η\ (&V)<Tab>^Wv
+menutrans Split\ File\ E&xplorer \ ͽ÷η\
+
+menutrans &Close<Tab>^Wc ݱ(&C)<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo ٸ\ â\ ݱ(&O)<Tab>^Wo
+
+menutrans Move\ &To ̵(&T)
+menutrans &Top<Tab>^WK (&T)<Tab>^WK
+menutrans &Bottom<Tab>^WJ ٴ(&B)<Tab>^WJ
+menutrans &Left\ side<Tab>^WH (&L)<Tab>^WH
+menutrans &Right\ side<Tab>^WL (&R)<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR \ ȸ(&U)<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Ʒ\ ȸ(&D)<Tab>^Wr
+
+menutrans &Equal\ Size<Tab>^W= \ ̷(&E)<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ ִ\ ̷(&M)<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ ּ\ ̷(&i)<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| ִ\ ̷(&W)<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| ּ\ ̷(&h)<Tab>^W1\|
+
+" The popup menu
+menutrans &Undo (&U)
+menutrans Cu&t ڸ(&t)
+menutrans &Copy (&C)
+menutrans &Paste ̱(&P)
+menutrans &Delete (&D)
+menutrans Select\ Blockwise 簢\
+menutrans Select\ &Word \ (&W)
+menutrans Select\ &Line \ (&L)
+menutrans Select\ &Block ȹ\ (&B)
+menutrans Select\ &All \ (&A)
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open
+ tmenu ToolBar.Save
+ tmenu ToolBar.SaveAll
+ tmenu ToolBar.Print μ
+ tmenu ToolBar.Undo
+ tmenu ToolBar.Redo ٽ
+ tmenu ToolBar.Cut ڸ
+ tmenu ToolBar.Copy
+ tmenu ToolBar.Paste ̱
+ tmenu ToolBar.Find ã...
+ tmenu ToolBar.FindNext ã
+ tmenu ToolBar.FindPrev ã
+ tmenu ToolBar.Replace ٲٱ
+ tmenu ToolBar.LoadSesn о
+ tmenu ToolBar.SaveSesn
+ tmenu ToolBar.RunScript ũƮ
+ tmenu ToolBar.Make Make
+ tmenu ToolBar.Shell
+ tmenu ToolBar.RunCtags ǥ
+ tmenu ToolBar.TagJump ǥ
+ tmenu ToolBar.Help
+ tmenu ToolBar.FindHelp ã...
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax (&S)
+menutrans &Show\ filetypes\ in\ menu \ ð\ ׸\ (&S)
+menutrans Set\ '&syntax'\ only 'syntax'\ (&s)
+menutrans Set\ '&filetype'\ too 'filetype'\ (&f)
+menutrans &Off (&O)
+menutrans &Manual (&M)
+menutrans A&utomatic ڵ(&u)
+menutrans on/off\ for\ &This\ file \ ϸ\ ѱ/(&T)
+
+menutrans Co&lor\ test \ (&l)
+menutrans &Highlight\ test Highlight\ (&H)
+menutrans &Convert\ to\ HTML HTML\ ȯ(&C)
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_ko_kr.utf-8.vim b/runtime/lang/menu_ko_kr.utf-8.vim
new file mode 100644
index 0000000..6da5f73
--- /dev/null
+++ b/runtime/lang/menu_ko_kr.utf-8.vim
@@ -0,0 +1,266 @@
+" Menu Translations: Korean
+" Maintainer: SungHyun Nam <goweol@gmail.com>
+" Last Change: 2012 May 01
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Help menu
+menutrans &Help 도움말(&H)
+menutrans &Overview<Tab><F1> 개관(&O)<Tab><F1>
+menutrans &User\ Manual 사용자\ 매뉴얼(&U)
+menutrans &How-to\ links 하우투\ 목록(&H)
+menutrans &GUI GUI(&G)
+menutrans &Find\.\.\. 찾기(&F)\.\.\.
+menutrans &Credits 고마운\ 분(&C)
+menutrans Co&pying 저작권(&p)
+menutrans &Sponsor/Register 후원/등록(&S)
+menutrans O&rphans 고아(&r)
+menutrans &Version 버젼(&V)
+menutrans &About 이\ 프로그램은(&A)
+
+" File menu
+menutrans &File 파일(&F)
+menutrans &Open\.\.\.<Tab>:e 열기(&O)\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp 나눠서\ 열기(&l)\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew 탭\ 열기\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew 새로운(&N)<Tab>:enew
+menutrans &Close<Tab>:close 닫기(&C)<Tab>:close
+menutrans &Save<Tab>:w 저장(&S)<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav 다른\ 이름으로\ 저장(&A)\.\.\.<Tab>:sav
+"menutrans Split\ &Diff\ with\.\.\. Split\ &Diff\ with\.\.\.
+"menutrans Split\ Patched\ &By\.\.\. Split\ Patched\ &By\.\.\.
+menutrans &Print 인쇄(&P)
+menutrans Sa&ve-Exit<Tab>:wqa 저장하고\ 끝내기(&v)<Tab>:wqa
+menutrans E&xit<Tab>:qa 끝내기(&x)<Tab>:qa
+
+" Edit menu
+menutrans &Edit 편집(&E)
+menutrans &Undo<Tab>u 취소(&U)<Tab>u
+menutrans &Redo<Tab>^R 다시\ 실행(&R)<Tab>^R
+menutrans Rep&eat<Tab>\. 되풀이(&e)<Tab>\.
+menutrans Cu&t<Tab>"+x 자르기(&t)<Tab>"+x
+menutrans &Copy<Tab>"+y 복사(&C)<Tab>"+y
+menutrans &Paste<Tab>"+gP 붙이기(&P)<Tab>"+gP
+menutrans Put\ &Before<Tab>[p 앞에\ 붙이기(&B)<Tab>[p
+menutrans Put\ &After<Tab>]p 뒤에\ 붙이기(&A)<Tab>]p
+menutrans &Delete<Tab>x 지우기(&D)<Tab>x
+menutrans &Select\ All<Tab>ggVG 모두\ 고르기(&S)<Tab>ggVG
+menutrans &Find\.\.\. 찾기(&F)\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. 찾아서\ 바꾸기(&l)\.\.\.
+menutrans Settings\ &Window 설정\ 창(&W)
+menutrans Startup\ &Settings 시작\ 설정(&S)
+
+" Edit/Global Settings
+menutrans &Global\ Settings 전역\ 설정(&G)
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! 패턴\ 하이라이트\ 토글(&H)<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! 대소문자\ 구분\ 토글(&I)<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Showmatch\ 토글(&S)<Tab>:set\ sm!
+menutrans &Context\ lines 콘텍스트\ 줄(&C)
+menutrans &Virtual\ Edit 가상\ 편집(&V)
+menutrans Never 사용\ 안\ 함
+menutrans Block\ Selection 블럭\ 고르기
+menutrans Insert\ mode 삽입\ 모드
+menutrans Block\ and\ Insert 블럭과\ 삽입
+menutrans Always 항상\ 사용
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! 삽입\ 모드\ 토글(&M)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Vi\ 호환\ 토글(&o)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. 찾기\ 경로(&P)\.\.\.
+menutrans Ta&g\ Files\.\.\. 꼬리표\ 파일(&g)\.\.\.
+
+" GUI options
+menutrans Toggle\ &Toolbar 도구막대\ 토글(&T)
+menutrans Toggle\ &Bottom\ Scrollbar 바닥\ 스크롤바\ 토글(&B)
+menutrans Toggle\ &Left\ Scrollbar 왼쪽\ 스크롤바\ 토글(&L)
+menutrans Toggle\ &Right\ Scrollbar 오른쪽\ 스크롤바\ 토글(&R)
+
+" Edit/File Settings
+menutrans F&ile\ Settings 파일\ 설정(&i)
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! 줄\ 번호붙이기\ 토글(&N)<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! 목록\ 모드\ 토글(&L)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! 줄\ Wrap\ 토글(&W)<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! 낱말에서\ Wrap\ 토글(&r)<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! 탭\ 확장\ 토글(&e)<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! 자동인덴트\ 토글(&a)<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! C-인덴팅\ 토글(&C)<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth 쉬프트\ 너비(&S)
+menutrans Soft\ &Tabstop 소프트\ 탭스톱(&T)
+menutrans Te&xt\ Width\.\.\. 텍스트\ 너비(&x)\.\.\.
+menutrans &File\ Format\.\.\. 파일\ 형식(&F)\.\.\.
+menutrans C&olor\ Scheme 컬러\ 스킴(&o)
+menutrans &Keymap 키맵(&K)
+
+menutrans Select\ Fo&nt\.\.\. 글꼴\ 고르기(&F)\.\.\.
+
+" Programming menu
+menutrans &Tools 도구(&T)
+menutrans &Jump\ to\ this\ tag<Tab>g^] 이\ 꼬리표로\ 가기(&J)<Tab>g^]
+menutrans Jump\ &back<Tab>^T 뒤로\ 가기(&b)<Tab>^T
+menutrans Build\ &Tags\ File 꼬리표\ 파일\ 만들기(&T)
+
+menutrans &Spelling 맞춤법\ 검사(&S)
+menutrans &Spell\ Check\ On 맞춤법\ 검사\ 시작(&S)
+menutrans Spell\ Check\ &Off 맞춤법\ 검사\ 끝(&O)
+menutrans To\ &Next\ error<Tab>]s 다음\ 에러로(&N)<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s 이전\ 에러로(&P)<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= 수정\ 제안(&C)<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall 수정\ 반복(&R)<Tab>:spellrepall
+menutrans Set\ language\ to\ "en" 언어를\ "en"으로\ 설정
+menutrans Set\ language\ to\ "en_au" 언어를\ "en_au"로\ 설정
+menutrans Set\ language\ to\ "en_ca" 언어를\ "en_ca"로\ 설정
+menutrans Set\ language\ to\ "en_gb" 언어를\ "en_gb"로\ 설정
+menutrans Set\ language\ to\ "en_nz" 언어를\ "en_nz"으로\ 설정
+menutrans Set\ language\ to\ "en_us" 언어를\ "en_us"로\ 설정
+menutrans &Find\ More\ Languages 다른\ 언어\ 찾기(&F)
+
+" Tools.Fold Menu
+menutrans &Folding 접기(&F)
+" open close folds
+menutrans &Enable/Disable\ folds<Tab>zi 접기\ 사용\ 토글(&E)<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv 커서\ 줄\ 보기(&V)<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx 커서\ 줄만\ 보기(&w)<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm 더\ 많은\ 접기\ 닫기(&l)<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM 모든\ 접기\ 닫기(&C)<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr 더\ 많은\ 접기\ 열기(&p)<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR 접힌\ 부분\ 모두\ 펴기(&O)<Tab>zR
+" fold method
+menutrans Fold\ Met&hod 접는\ 방법(&h)
+menutrans M&anual 수동(&a)
+menutrans I&ndent 들여쓰기(&n)
+menutrans E&xpression 표현식(&x)
+menutrans S&yntax 신택스(&y)
+"menutrans &Diff &Diff
+menutrans Ma&rker 꼬리표(&r)
+" create and delete folds
+menutrans Create\ &Fold<Tab>zf 접기\ 생성(&F)<Tab>zf
+menutrans &Delete\ Fold<Tab>zd 접기\ 삭제(&D)<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD 모든\ 접기\ 삭제(&A)<Tab>zD
+" moving around in folds
+menutrans Fold\ column\ &width 접기\ 컬럼\ 너비(&w)
+
+"menutrans &Diff &Diff
+menutrans &Update 갱신(&U)
+menutrans &Get\ Block 블럭\ 가져오기(&G)
+menutrans &Put\ Block 블럭\ 집어넣기(&P)
+
+menutrans &Make<Tab>:make 빌드(&M)<Tab>:make
+menutrans &List\ Errors<Tab>:cl 에러\ 목록\ 보기(&L)<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! 메시지\ 목록\ 보기(&i)<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn 다음\ 에러(&N)<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp 이전\ 에러(&P)<Tab>:cp
+menutrans &Older\ List<Tab>:cold 오래된\ 목록(&O)<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew 새로운\ 목록(&e)<Tab>:cnew
+menutrans Error\ &Window 에러\ 창(&W)
+menutrans &Update<Tab>:cwin 갱신(&U)<Tab>:cwin
+menutrans &Open<Tab>:copen 열기(&O)<Tab>:copen
+menutrans &Close<Tab>:cclose 닫기(&C)<Tab>:cclose
+menutrans Se&T\ Compiler 컴파일러\ 설정(&T)
+menutrans &Convert\ to\ HEX<Tab>:%!mc\ vim:xxd 십육진으로\ 변환<Tab>:%!mc\ vim:xxd
+menutrans &Convert\ to\ HEX<Tab>:%!xxd 십육진으로\ 변환(&C)<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!mc\ vim:xxd\ -r 원래대로\ 변환(&r)<Tab>:%!mc\ vim:xxd\ -r
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r 원래대로\ 변환(&r)<Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers 버퍼(&B)
+menutrans &Refresh\ menu 차림표\ 다시그리기(&R)
+menutrans &Delete 지우기(&D)
+menutrans &Alternate 교체(&A)
+menutrans &Next 다음(&N)
+menutrans &Previous 이전(&P)
+
+" Window menu
+menutrans &Window 창(&W)
+menutrans &New<Tab>^Wn 새\ 창(&N)<Tab>^Wn
+menutrans S&plit<Tab>^Ws 나누기(&p)<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ #으로\ 나누기(&l)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv 세로로\ 나누기(&V)<Tab>^Wv
+menutrans Split\ File\ E&xplorer 파일\ 익스플로러\ 나누기
+
+menutrans &Close<Tab>^Wc 닫기(&C)<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo 다른\ 창\ 닫기(&O)<Tab>^Wo
+
+menutrans Move\ &To 이동(&T)
+menutrans &Top<Tab>^WK 꼭대기(&T)<Tab>^WK
+menutrans &Bottom<Tab>^WJ 바닥(&B)<Tab>^WJ
+menutrans &Left\ side<Tab>^WH 왼쪽(&L)<Tab>^WH
+menutrans &Right\ side<Tab>^WL 오른쪽(&R)<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR 위로\ 회전(&U)<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr 아래로\ 회전(&D)<Tab>^Wr
+
+menutrans &Equal\ Size<Tab>^W= 같은\ 높이로(&E)<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ 최대\ 높이로(&M)<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ 최소\ 높이로(&i)<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| 최대\ 넓이로(&W)<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| 최소\ 넓이로(&h)<Tab>^W1\|
+
+" The popup menu
+menutrans &Undo 취소(&U)
+menutrans Cu&t 자르기(&t)
+menutrans &Copy 복사(&C)
+menutrans &Paste 붙이기(&P)
+menutrans &Delete 지우기(&D)
+menutrans Select\ Blockwise 사각형\ 고르기
+menutrans Select\ &Word 낱말\ 고르기(&W)
+menutrans Select\ &Line 줄\ 고르기(&L)
+menutrans Select\ &Block 구획\ 고르기(&B)
+menutrans Select\ &All 모두\ 고르기(&A)
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open 파일 열기
+ tmenu ToolBar.Save 현재 파일 저장
+ tmenu ToolBar.SaveAll 모두 저장
+ tmenu ToolBar.Print 인쇄
+ tmenu ToolBar.Undo 취소
+ tmenu ToolBar.Redo 다시 실행
+ tmenu ToolBar.Cut 자르기
+ tmenu ToolBar.Copy 복사
+ tmenu ToolBar.Paste 붙이기
+ tmenu ToolBar.Find 찾기...
+ tmenu ToolBar.FindNext 다음 찾기
+ tmenu ToolBar.FindPrev 이전 찾기
+ tmenu ToolBar.Replace 바꾸기
+ tmenu ToolBar.LoadSesn 세션 읽어오기
+ tmenu ToolBar.SaveSesn 세션 저장
+ tmenu ToolBar.RunScript 스크립트 실행
+ tmenu ToolBar.Make Make
+ tmenu ToolBar.Shell 쉘
+ tmenu ToolBar.RunCtags 꼬리표 만들기
+ tmenu ToolBar.TagJump 꼬리표로 가기
+ tmenu ToolBar.Help 도움말
+ tmenu ToolBar.FindHelp 도움말 찾기...
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax 문법(&S)
+menutrans &Show\ filetypes\ in\ menu 모든\ 선택가능한\ 항목\ 보기(&S)
+menutrans Set\ '&syntax'\ only 'syntax'만\ 설정(&s)
+menutrans Set\ '&filetype'\ too 'filetype'도\ 설정(&f)
+menutrans &Off 끄기(&O)
+menutrans &Manual 수동(&M)
+menutrans A&utomatic 자동(&u)
+menutrans on/off\ for\ &This\ file 이\ 파일만\ 켜기/끄기(&T)
+
+menutrans Co&lor\ test 색\ 시험(&l)
+menutrans &Highlight\ test Highlight\ 시험(&H)
+menutrans &Convert\ to\ HTML HTML로\ 변환(&C)
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_ko_kr.vim b/runtime/lang/menu_ko_kr.vim
new file mode 100644
index 0000000..b67d0cc
--- /dev/null
+++ b/runtime/lang/menu_ko_kr.vim
@@ -0,0 +1,5 @@
+" Menu Translations: Korean
+" Translated By: SungHyun Nam <goweol@gmail.com>
+" Last Change: 2008 Sep 17
+
+source <sfile>:p:h/menu_ko_kr.euckr.vim
diff --git a/runtime/lang/menu_nl.latin1.vim b/runtime/lang/menu_nl.latin1.vim
new file mode 100644
index 0000000..f10ec44
--- /dev/null
+++ b/runtime/lang/menu_nl.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Nederlands
+
+source <sfile>:p:h/menu_nl_nl.latin1.vim
diff --git a/runtime/lang/menu_nl.utf-8.vim b/runtime/lang/menu_nl.utf-8.vim
new file mode 100644
index 0000000..8e87d96
--- /dev/null
+++ b/runtime/lang/menu_nl.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Nederlands for UTF-8 encoding
+
+source <sfile>:p:h/menu_nl_nl.latin1.vim
diff --git a/runtime/lang/menu_nl_nl.latin1.vim b/runtime/lang/menu_nl_nl.latin1.vim
new file mode 100644
index 0000000..d613d58
--- /dev/null
+++ b/runtime/lang/menu_nl_nl.latin1.vim
@@ -0,0 +1,246 @@
+" Menu Translations: Nederlands
+" Maintainer: Bram Moolenaar
+" Last Change: 2012 May 01
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" The translations below are in latin1, but they work for cp1252 and
+" iso-8859-15 without conversion as well.
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+" Help menu
+menutrans &Help &Help
+menutrans &Overview<Tab><F1> &Overzicht<Tab><F1>
+menutrans &User\ Manual Gebruikershandleiding
+menutrans &How-to\ links &Hoe-doe-ik\ lijst
+"menutrans &GUI &GUI
+menutrans &Credits &Met\ dank\ aan
+menutrans Co&pying &Copyright
+menutrans &Sponsor/Register &Sponsor/Registreer
+menutrans O&rphans &Weeskinderen
+menutrans &Version &Versie
+menutrans &About &Introductiescherm
+
+" File menu
+menutrans &File &Bestand
+menutrans &Open\.\.\.<Tab>:e &Openen\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp In\ nieuw\ &Venster\ openen\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Nieuw<Tab>:enew
+menutrans &Close<Tab>:close &Sluiten<Tab>:close
+menutrans &Save<Tab>:w &Bewaren<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Bewaren\ als\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Toon\ diff\ met\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Toon\ gewijzigd\ door\.\.\.
+menutrans &Print Af&drukken
+menutrans Sa&ve-Exit<Tab>:wqa Bewaren\ en\ Afsluiten<Tab>:wqa
+menutrans E&xit<Tab>:qa &Afsluiten<Tab>:qa
+
+" Edit menu
+menutrans &Edit Be&werken
+menutrans &Undo<Tab>u Terug<Tab>u
+menutrans &Redo<Tab>^R Voo&ruit<Tab>^R
+menutrans Rep&eat<Tab>\. &Herhalen<Tab>\.
+menutrans Cu&t<Tab>"+x &Knippen<Tab>"+x
+menutrans &Copy<Tab>"+y K&opieren<Tab>"+y
+menutrans &Paste<Tab>"+gP Plakken<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Ervoor\ invoegen<Tab>[p
+menutrans Put\ &After<Tab>]p Erachter\ invoegen<Tab>]p
+menutrans &Select\ all<Tab>ggVG Alles\ &Markeren<Tab>ggVG
+menutrans &Find\.\.\. &Zoeken\.\.\.
+menutrans &Find<Tab>/ &Zoeken<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. Zoeken\ en\ &Vervangen\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s Zoeken\ en\ &Vervangen<Tab>:%s
+menutrans Find\ and\ Rep&lace Zoeken\ en\ &Vervangen
+menutrans Find\ and\ Rep&lace<Tab>:s Zoeken\ en\ &Vervangen<Tab>:s
+menutrans Settings\ &Window Optievenster
+menutrans &Global\ Settings Globale\ Opties
+menutrans F&ile\ Settings Bestandopties
+menutrans C&olor\ Scheme Kleurenschema
+menutrans &Keymap Toetsenbordindeling
+
+" Edit.Global Settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Flip\ Patroonkleuring<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Flip\ Negeren\ hoofd/kleine\ letters<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Flip\ Showmatch<Tab>:set\ sm!
+menutrans &Context\ lines Contextregels
+menutrans &Virtual\ Edit Virtueel\ positioneren
+menutrans Never Nooit
+menutrans Block\ Selection Bij\ Blokselectie
+menutrans Insert\ mode In\ Invoegmode
+menutrans Block\ and\ Insert Bij\ Blokselectie\ en\ Invoegmode
+menutrans Always Altijd
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Flip\ Invoegmode<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Flip\ Vi\ Compatibiliteit<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Zoekpad\.\.\.
+menutrans Ta&g\ Files\.\.\. Tag\ Bestanden\.\.\.
+menutrans Toggle\ &Toolbar Toon/verberg\ Knoppenbalk
+menutrans Toggle\ &Bottom\ Scrollbar Toon/verberg\ onderste\ schuifbalk
+menutrans Toggle\ &Left\ Scrollbar Toon/verberg\ linker\ schuifbalk
+menutrans Toggle\ &Right\ Scrollbar Toon/verberg\ rechter\ schuifbalk
+menutrans None Geen
+
+" Edit.File Settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Flip\ regelnummers<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Flip\ list\ mode<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Flip\ regelafbreken<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Flip\ afbreken\ op\ woordgrens<tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Flip\ tabexpansie<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Flip\ automatisch\ indenteren<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Flip\ C-indenteren<Tab>:set\ cin!
+menutrans Te&xt\ Width\.\.\. Tekstbreedte\.\.\.
+menutrans &File\ Format\.\.\. Bestandsformaat\.\.\.
+
+" Tools menu
+menutrans &Tools &Gereedschap
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Spring\ naar\ Tag<Tab>g^]
+menutrans Jump\ &back<Tab>^T Spring\ &Terug<Tab>^T
+menutrans Build\ &Tags\ File Genereer\ &Tagsbestand
+menutrans &Make<Tab>:make &Make\ uitvoeren<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Foutenlijst<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &Berichtenlijst<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Volgende\ Fout<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Vorige\ Fout<Tab>:cp
+menutrans &Older\ List<Tab>:cold &Oudere\ Lijst<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &Nieuwere\ Lijst<Tab>:cnew
+menutrans Error\ &Window Foutenvenster
+menutrans &Update<Tab>:cwin &Aanpassen<Tab>:cwin
+menutrans &Open<Tab>:copen &Openen<Tab>:copen
+menutrans &Close<Tab>:cclose &Sluiten<Tab>:cclose
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Converteer\ naar\ HEX<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Converteer\ terug<Tab>:%!xxd\ -r
+menutrans &Set\ Compiler Kies\ Compiler
+
+" Tools.Folding
+menutrans &Enable/Disable\ folds<Tab>zi Flip\ tonen\ folds<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv Toon\ cursorregel<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Toon\ alleen\ cursorregel<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Sluit\ meer\ folds<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Sluit\ alle\ folds<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr Open\ meer\ folds<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR Open\ alle\ folds<Tab>zR
+menutrans Fold\ Met&hod Foldwijze
+menutrans M&anual Handmatig
+menutrans I&ndent Inspringing
+menutrans E&xpression Expressie
+menutrans S&yntax Syntax
+menutrans &Diff Verschillen
+menutrans Ma&rker Markeringen
+menutrans Create\ &Fold<Tab>zf maak\ Fold<Tab>zf
+menutrans &Delete\ Fold<Tab>zd verwijder\ Fold<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD verwijder\ alle\ Folds<Tab>zD
+menutrans Fold\ column\ &width Fold\ kolom\ breedte
+
+" Tools.Diff
+menutrans &Update Verversen
+menutrans &Get\ Block Blok\ ophalen\ van\ ander\ venster
+menutrans &Put\ Block Blok\ naar\ ander\ venster
+
+" Names for buffer menu.
+menutrans &Buffers &Buffer
+menutrans &Refresh\ menu Ververs\ menu
+menutrans &Delete Wissen
+menutrans &Alternate Vorige
+menutrans &Next Vooruit
+menutrans &Previous Achteruit
+
+" Window menu
+menutrans &Window &Venster
+menutrans &New<Tab>^Wn &Nieuw<Tab>^Wn
+menutrans S&plit<Tab>^Ws Splitsen<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Splits\ naar\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Splits\ &Vertikaal<Tab>^Wv
+menutrans Split\ File\ E&xplorer Splits\ Bestandverkenner
+menutrans &Close<Tab>^Wc &Sluiten<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo &Sluit\ alle\ andere<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww Volgende<Tab>^Ww
+menutrans P&revious<Tab>^WW &Vorige<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Gelijke\ afmetingen<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ &Maximale\ hoogte<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Mi&nimale\ hoogte<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Maximale\ breedte<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimale\ breedte<Tab>^W1\|
+menutrans Move\ &To Verplaats\ naar
+menutrans &Top<Tab>^WK Bovenkant<Tab>^WK
+menutrans &Bottom<Tab>^WJ Onderkant<Tab>^WJ
+menutrans &Left\ side<Tab>^WH Linkerkant<Tab>^WH
+menutrans &Right\ side<Tab>^WL Rechterkant<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Roteren\ naar\ &boven<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Roteren\ naar\ &onder<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. Selecteer\ font\.\.\.
+
+" The popup menu
+menutrans &Undo &Terug
+menutrans Cu&t Knip
+menutrans &Copy &Kopier
+menutrans &Paste &Plak
+menutrans &Delete &Wissen
+menutrans Select\ Blockwise Selecteer\ per\ Rechthoek
+menutrans Select\ &Word Selecteer\ een\ &Woord
+menutrans Select\ &Line Selecteer\ een\ &Regel
+menutrans Select\ &Block Selecteer\ een\ Recht&hoek
+menutrans Select\ &All Selecteer\ &Alles
+
+" The GUI toolbar (for Win32 or GTK)
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Bestand openen
+ tmenu ToolBar.Save Bestand opslaan
+ tmenu ToolBar.SaveAll Alle bestanden opslaan
+ tmenu ToolBar.Print afdrukken
+ tmenu ToolBar.Undo terug
+ tmenu ToolBar.Redo vooruit
+ tmenu ToolBar.Cut knippen
+ tmenu ToolBar.Copy Kopiren
+ tmenu ToolBar.Paste Plakken
+ tmenu ToolBar.Find Zoeken...
+ tmenu ToolBar.FindNext Zoek volgende
+ tmenu ToolBar.FindPrev Zoek vorige
+ tmenu ToolBar.Replace Zoek en vervang...
+ tmenu ToolBar.LoadSesn Sessie Laden
+ tmenu ToolBar.SaveSesn Sessie opslaan
+ tmenu ToolBar.RunScript Vim script uitvoeren
+ tmenu ToolBar.Make Make uitvoeren
+ tmenu ToolBar.Shell Shell starten
+ tmenu ToolBar.RunCtags Tags bestand genereren
+ tmenu ToolBar.TagJump Spring naar tag
+ tmenu ToolBar.Help Help!
+ tmenu ToolBar.FindHelp Help vinden...
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Syntax
+menutrans &Show\ filetypes\ in\ menu Toon\ filetypes\ in\ menu
+menutrans Set\ '&syntax'\ only Alleen\ 'syntax'\ wijzigen
+menutrans Set\ '&filetype'\ too Ook\ 'filetype'\ wijzigen
+menutrans &Off &Uit
+menutrans &Manual &Handmatig
+menutrans A&utomatic A&utomatisch
+menutrans on/off\ for\ &This\ file Aan/Uit\ voor\ dit\ Bestand
+menutrans Co&lor\ test Test\ de\ &Kleuren
+menutrans &Highlight\ test Test\ de\ Markeringen
+menutrans &Convert\ to\ HTML Converteren\ naar\ &HTML
+menutrans &Show\ individual\ choices Toon\ elke\ keuze
+
+" dialog texts
+let menutrans_no_file = "[Geen Bestand]"
+let menutrans_help_dialog = "Typ een commando of woord om help voor te vinden:\n\nVoeg i_ in voor Input mode commandos (bijv. i_CTRL-X)\nVoeg c_ in voor een commando-regel edit commando (bijv. c_<Del>)\nVoeg ' in \voor een optie naam (bijv. 'shiftwidth')"
+let g:menutrans_path_dialog = "Typ het zoekpad voor bestanden.\nGebruik commas tussen de padnamen."
+let g:menutrans_tags_dialog = "Typ namen van tag bestanden.\nGebruik commas tussen de namen."
+let g:menutrans_textwidth_dialog = "Typ de nieuwe tekst breedte (0 om formatteren uit the schakelen): "
+let g:menutrans_fileformat_dialog = "Selecteer formaat voor het schrijven van het bestand"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_nl_nl.utf-8.vim b/runtime/lang/menu_nl_nl.utf-8.vim
new file mode 100644
index 0000000..8e87d96
--- /dev/null
+++ b/runtime/lang/menu_nl_nl.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Nederlands for UTF-8 encoding
+
+source <sfile>:p:h/menu_nl_nl.latin1.vim
diff --git a/runtime/lang/menu_no.latin1.vim b/runtime/lang/menu_no.latin1.vim
new file mode 100644
index 0000000..fa71aed
--- /dev/null
+++ b/runtime/lang/menu_no.latin1.vim
@@ -0,0 +1,4 @@
+" Menu Translations: Norwegian
+" menu_no.latin1.vim 289 2004-05-16 18:00:52Z sunny
+
+source <sfile>:p:h/menu_no_no.latin1.vim
diff --git a/runtime/lang/menu_no.utf-8.vim b/runtime/lang/menu_no.utf-8.vim
new file mode 100644
index 0000000..42ce868
--- /dev/null
+++ b/runtime/lang/menu_no.utf-8.vim
@@ -0,0 +1,4 @@
+" Menu Translations: Norwegian for UTF-8 encoding
+" menu_no.utf-8.vim 289 2004-05-16 18:00:52Z sunny
+
+source <sfile>:p:h/menu_no_no.latin1.vim
diff --git a/runtime/lang/menu_no_no.latin1.vim b/runtime/lang/menu_no_no.latin1.vim
new file mode 100644
index 0000000..4e3e6f0
--- /dev/null
+++ b/runtime/lang/menu_no_no.latin1.vim
@@ -0,0 +1,239 @@
+" Menu Translations: Norwegian / Norsk (Bokml)
+" Maintainer: yvind A. Holm <sunny@sunbase.org>
+" Last Change: 2020 Apr 23
+" menu_no_no.latin1.vim 289 2004-05-16 18:00:52Z sunny
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" The translations below are in ISO-8859-1, but they work for ISO-8859-15 and
+" CP1252 without conversion as well.
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+menutrans &File &Fil
+ menutrans &Open\.\.\.<Tab>:e &pne\.\.\.<Tab>:e
+ menutrans Sp&lit-Open\.\.\.<Tab>:sp pne\ i\ nytt\ &vindu\.\.\.<Tab>:sp
+ menutrans &New<Tab>:enew &Ny\ fil<Tab>:enew
+ menutrans &Close<Tab>:close L&ukk<Tab>:close
+ menutrans &Save<Tab>:w &Lagre<Tab>:w
+ menutrans Save\ &As\.\.\.<Tab>:sav Lagre\ s&om\.\.\.<Tab>:sav
+ if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. Sa&mmenlign\ med\ ny\ fil\.\.\.
+ menutrans Split\ Patched\ &By\.\.\. &Patch\ i\ nytt\ vindu\.\.\.
+ endif
+ menutrans &Print &Skriv\ ut
+ menutrans Sa&ve-Exit<Tab>:wqa Lagre\ o&g\ avslutt<Tab>:wqa
+ menutrans E&xit<Tab>:qa &Avslutt<Tab>:qa
+menutrans &Edit &Rediger
+ menutrans &Undo<Tab>u &Angre<Tab>u
+ menutrans &Redo<Tab>^R &Gjenopprett<Tab>^R
+ menutrans Rep&eat<Tab>\. &Repeter<Tab>\.
+ menutrans Cu&t<Tab>"+x &Klipp\ ut<Tab>"+x
+ menutrans &Copy<Tab>"+y K&opier<Tab>"+y
+ menutrans &Paste<Tab>"+gP &Lim\ inn<Tab>"+gP
+ menutrans Put\ &Before<Tab>[p Lim\ i&nn\ fr\ markr<Tab>[p
+ menutrans Put\ &After<Tab>]p Lim\ inn\ &etter\ markr<Tab>]p
+ menutrans &Select\ All<Tab>ggVG &Merk\ alt<Tab>ggVG
+ menutrans &Find\.\.\. &Sk\.\.\.
+ menutrans Find\ and\ Rep&lace\.\.\. S&k\ og\ erstatt\.\.\.
+ menutrans Settings\ &Window &Innstillinger
+ menutrans &Global\ Settings Glo&bale\ innstillinger
+ menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Utheving\ av\ sketekst\ av/p<Tab>:set\ hls!
+ menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Forskjell\ mellom\ store/sm\ bokstaver\ av/p<Tab>:set\ ic!
+ menutrans Toggle\ &Showmatch<Tab>:set\ sm! &Indikering\ av\ samsvarende\ parentes\ av/p<Tab>:set\ sm!
+ menutrans &Context\ lines &Kontekstlinjer
+ menutrans &Virtual\ Edit Vi&rtuell\ redigering
+ menutrans Never &Aldri
+ menutrans Block\ Selection I\ &blokkmodus
+ menutrans Insert\ mode I\ &Innsettingsmodus
+ menutrans Block\ and\ Insert I\ Blokk-\ &og\ innsettingsmodus
+ menutrans Always A&lltid
+ menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Innsettings&modus\ av/p<Tab>:set\ im!
+ menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! &Vi-kompatiblitet\ av/p<Tab>:set\ cp!
+ menutrans Search\ &Path\.\.\. &Skesti\.\.\.
+ menutrans Ta&g\ Files\.\.\. Ta&gfiler\.\.\.
+ menutrans Toggle\ &Toolbar Verkt&ylinje
+ menutrans Toggle\ &Bottom\ Scrollbar Ne&dre\ rullefelt\ av/p
+ menutrans Toggle\ &Left\ Scrollbar Ve&nstre\ rullefelt\ av/p
+ menutrans Toggle\ &Right\ Scrollbar &Hyre\ rullefelt\ av/p
+ menutrans F&ile\ Settings Filo&ppsett
+ menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Linjenummer\ av/p<Tab>:set\ nu!
+ menutrans Toggle\ &List\ Mode<Tab>:set\ list! L&istemodus\ av/p<Tab>:set\ list!
+ menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Li&njebryting\ av/p<Tab>:set\ wrap!
+ menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Linjebryting\ ved\ &ord\ av/p<Tab>:set\ lbr!
+ menutrans Toggle\ &expand-tab<Tab>:set\ et! Utvidelse\ av\ &tabulatorer\ av/p<Tab>:set\ et!
+ menutrans Toggle\ &auto-indent<Tab>:set\ ai! A&utomatisk\ innrykk\ av/p<Tab>:set\ ai!
+ menutrans Toggle\ &C-indenting<Tab>:set\ cin! &C-innrykk\ av/p<Tab>:set\ cin!
+ menutrans &Shiftwidth &Strrelse\ p\ innrykk
+ menutrans Soft\ &Tabstop &Myke\ tabulatorstopp
+ menutrans Te&xt\ Width\.\.\. Te&kstbredde\.\.\.
+ menutrans &File\ Format\.\.\. &Filformat\.\.\.
+ menutrans C&olor\ Scheme &Fargekart
+ menutrans &Keymap &Tastaturoppsett
+ menutrans Select\ Fo&nt\.\.\. Skriftt&ype\.\.\.
+menutrans &Tools &Verkty
+ menutrans &Jump\ to\ this\ tag<Tab>g^] &Hopp\ til\ tag\ under\ markr<Tab>g^]
+ menutrans Jump\ &back<Tab>^T Hopp\ &tilbake<Tab>^T
+ menutrans Build\ &Tags\ File Lag\ ta&gfil
+ if has("folding")
+ menutrans &Folding Fol&der
+ menutrans &Enable/Disable\ folds<Tab>zi &Folder\ av/p<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Se\ &markrlinje<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Se\ &bare\ markrlinjen<Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm L&ukk\ flere\ folder<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Lukk\ &alle\ folder<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr &pne\ flere\ folder<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR &pne\ alle\ folder<Tab>zR
+ menutrans Fold\ Met&hod Foldme&tode
+ menutrans M&anual &Manuell
+ menutrans I&ndent &Innrykk
+ menutrans E&xpression &Uttrykk
+ menutrans S&yntax &Syntaks
+ menutrans &Diff &Forskjeller
+ menutrans Ma&rker M&arkering
+ menutrans Create\ &Fold<Tab>zf La&g\ fold<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd &Slett\ fold<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Sl&ett\ alle\ folder<Tab>zD
+ menutrans Fold\ col&umn\ width Bredde\ p\ fold&kolonne
+ endif
+ if has("diff")
+ menutrans &Diff &Forskjeller
+ menutrans &Update &Oppdater
+ menutrans &Get\ Block &Hent\ blokk
+ menutrans &Put\ Block &Putt\ blokk
+ endif
+ menutrans &Make<Tab>:make &Kjr\ "make"<Tab>:make
+ menutrans &List\ Errors<Tab>:cl &List\ feil<Tab>:cl
+ menutrans L&ist\ Messages<Tab>:cl! List\ &meldinger<Tab>:cl!
+ menutrans &Next\ Error<Tab>:cn &Neste\ feil<Tab>:cn
+ menutrans &Previous\ Error<Tab>:cp Fo&rrige\ feil<Tab>:cp
+ menutrans &Older\ List<Tab>:cold &Eldre\ liste<Tab>:cold
+ menutrans N&ewer\ List<Tab>:cnew N&yere\ liste<Tab>:cnew
+ menutrans Error\ &Window Fe&ilvindu
+ menutrans &Update<Tab>:cwin &Oppdater<Tab>:cwin
+ menutrans &Open<Tab>:copen &pne<Tab>:copen
+ menutrans &Close<Tab>:cclose &Lukk<Tab>:cclose
+ menutrans &Set\ Compiler &Velg\ kompilator
+ menutrans &Convert\ to\ HEX<Tab>:%!xxd Konverter\ til\ hek&sadesimal<Tab>:%!xxd
+ menutrans Conve&rt\ back<Tab>:%!xxd\ -r K&onverter\ tilbake<Tab>:%!xxd\ -r
+menutrans &Syntax &Syntaks
+ menutrans &Show\ filetypes\ in\ menu &Vis\ filtyper\ i\ menyen
+ menutrans Set\ '&syntax'\ only Sett\ bare\ '&syntax'
+ menutrans Set\ '&filetype'\ too Sett\ '&filetype'\ ogs
+ menutrans &Off &Av
+ menutrans &Manual &Manuell
+ menutrans A&utomatic A&utomatisk
+ menutrans on/off\ for\ &This\ file Av/p\ for\ &denne\ filen
+ menutrans Co&lor\ test Far&getest
+ menutrans &Highlight\ test Uthevings&test
+ menutrans &Convert\ to\ HTML Konverter\ til\ &HTML
+menutrans &Buffers &Buffer
+ menutrans &Refresh\ menu &Oppdater
+ menutrans Delete &Slett
+ menutrans &Alternate &Veksle
+ menutrans &Next &Neste
+ menutrans &Previous &Forrige
+ menutrans [No\ File] [Uten\ navn]
+menutrans &Window Vi&ndu
+ menutrans &New<Tab>^Wn &Nytt<Tab>^Wn
+ menutrans S&plit<Tab>^Ws &Splitt<Tab>^Ws
+ menutrans Sp&lit\ To\ #<Tab>^W^^ Splitt\ &til\ #<Tab>^W^^
+ menutrans Split\ &Vertically<Tab>^Wv S&plitt\ loddrett<Tab>^Ws
+ menutrans Split\ File\ E&xplorer &Filbehandler
+ menutrans &Close<Tab>^Wc &Lukk<Tab>^Wc
+ menutrans Close\ &Other(s)<Tab>^Wo Lukk\ &andre<Tab>^Wo
+ menutrans Move\ &To Fl&ytt\ til
+ menutrans &Top<Tab>^WK &Toppen<Tab>^WK
+ menutrans &Bottom<Tab>^WJ &Bunnen<Tab>^WJ
+ menutrans &Left\ side<Tab>^WH &Venstre\ side<Tab>^WH
+ menutrans &Right\ side<Tab>^WL &Hyre\ side<Tab>^WL
+ menutrans Rotate\ &Up<Tab>^WR Roter\ &opp<Tab>^WR
+ menutrans Rotate\ &Down<Tab>^Wr &Roter\ ned<Tab>^Wr
+ menutrans &Equal\ Size<Tab>^W= Lik\ st&rrelse<Tab>^W=
+ menutrans &Max\ Height<Tab>^W_ &Maksimal\ hyde<Tab>^W_
+ menutrans M&in\ Height<Tab>^W1_ M&inimal\ hyde<Tab>^W1_
+ menutrans Max\ &Width<Tab>^W\| Ma&ksimal\ bredde<Tab>^W\|
+ menutrans Min\ Widt&h<Tab>^W1\| Minimal\ &bredde<Tab>^W1\|
+menutrans &Help &Hjelp
+ menutrans &Overview<Tab><F1> &Oversikt<Tab><F1>
+ menutrans &User\ Manual &Brukerhndbok
+ menutrans &How-to\ links &Frstehjelp
+ menutrans &Find\.\.\. &Sk\.\.\.
+ menutrans &Credits &Kreditering
+ menutrans Co&pying &Programlisens
+ menutrans &Sponsor/Register S&ttte/Registrering
+ menutrans O&rphans Fo&reldrelse
+ menutrans &Version &Versjon
+ menutrans &About &Om\ Vim
+
+" Popup
+ menutrans &Undo &Angre
+ menutrans Cu&t Klipp\ &ut
+ menutrans &Copy &Kopier
+ menutrans &Paste &Lim\ inn
+ menutrans &Delete &Slett
+ menutrans Select\ Blockwise Marker\ blokk&vis
+ menutrans Select\ &Word Marker\ &ord
+ menutrans Select\ &Line Marker\ lin&je
+ menutrans Select\ &Block Marker\ &blokk
+ menutrans Select\ &All Marker\ al&t
+
+" Verktylinje
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfunction Do_toolbar_tmenu
+ endif
+ function Do_toolbar_tmenu()
+ tmenu ToolBar.Open pne fil
+ tmenu ToolBar.Save Lagre fil
+ tmenu ToolBar.SaveAll Lagre alle filer
+ tmenu ToolBar.Print Skriv ut
+ tmenu ToolBar.Undo Angre
+ tmenu ToolBar.Redo Gjenopprett
+ tmenu ToolBar.Cut Klipp
+ tmenu ToolBar.Copy Kopier
+ tmenu ToolBar.Paste Lim inn
+ tmenu ToolBar.Find Sk...
+ tmenu ToolBar.FindNext Finn neste
+ tmenu ToolBar.FindPrev Finn forrige
+ tmenu ToolBar.Replace Sk og erstatt...
+ if 0 " Disabled, they are in the Windows menu
+ tmenu ToolBar.New Nytt vindu
+ tmenu ToolBar.WinSplit Splitt vindu
+ tmenu ToolBar.WinMax Maksimal vindushyde
+ tmenu ToolBar.WinMin Minimal vindushyde
+ tmenu ToolBar.WinClose Lukk vindu
+ endif
+ tmenu ToolBar.LoadSesn pne kt
+ tmenu ToolBar.SaveSesn Lagre kt
+ tmenu ToolBar.RunScript Kjr Vim-skript
+ tmenu ToolBar.Make Kjr "make"
+ tmenu ToolBar.Shell Start skall
+ tmenu ToolBar.RunCtags Oppdater tag-fil
+ tmenu ToolBar.TagJump Hopp til tag
+ tmenu ToolBar.Help Hjelp!
+ tmenu ToolBar.FindHelp Sk i hjelpen...
+ endfunction
+endif
+
+" Dialogmeldinger
+ let g:menutrans_no_file = "[Uten navn]"
+ let g:menutrans_help_dialog = "Skriv en kommando eller ord du vil ha hjelp om:\n\nLegg til i_ i begynnelsen for inndatametoder (f.eks.: i_CTRL-X)\nLegg til c_ i begynnelsen for kommandoer som redigerer kommandolinjen (f.eks.: c_<Del>)\nLegg til ' i begynnelsen for et valgnavn (f.eks.: 'shiftwidth')"
+ let g:menutrans_path_dialog = "Skriv skesti for filer.\nSkill katalognavn med komma."
+ let g:menutrans_tags_dialog = "Skriv navn p tagfiler.\nSkill navnene med komma."
+ let g:menutrans_textwidth_dialog = "Velg ny tekstbredde (0 for forhindre formatering): "
+ let g:menutrans_fileformat_dialog = "Velg filformat som filen skal lagres med"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: set ts=8 sw=8 :
+" vim600: set fdm=indent :
diff --git a/runtime/lang/menu_no_no.utf-8.vim b/runtime/lang/menu_no_no.utf-8.vim
new file mode 100644
index 0000000..af39cc8
--- /dev/null
+++ b/runtime/lang/menu_no_no.utf-8.vim
@@ -0,0 +1,4 @@
+" Menu Translations: Norwegian for UTF-8 encoding
+" menu_no_no.utf-8.vim 289 2004-05-16 18:00:52Z sunny
+
+source <sfile>:p:h/menu_no_no.latin1.vim
diff --git a/runtime/lang/menu_pl.cp1250.vim b/runtime/lang/menu_pl.cp1250.vim
new file mode 100644
index 0000000..0e0fdd0
--- /dev/null
+++ b/runtime/lang/menu_pl.cp1250.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Polish
+
+source <sfile>:p:h/menu_polish_poland.1250.vim
diff --git a/runtime/lang/menu_pl_pl.cp1250.vim b/runtime/lang/menu_pl_pl.cp1250.vim
new file mode 100644
index 0000000..0e0fdd0
--- /dev/null
+++ b/runtime/lang/menu_pl_pl.cp1250.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Polish
+
+source <sfile>:p:h/menu_polish_poland.1250.vim
diff --git a/runtime/lang/menu_pl_pl.iso_8859-2.vim b/runtime/lang/menu_pl_pl.iso_8859-2.vim
new file mode 100644
index 0000000..a92389e
--- /dev/null
+++ b/runtime/lang/menu_pl_pl.iso_8859-2.vim
@@ -0,0 +1,293 @@
+" Menu Translations: Polish
+" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Initial Translation: Marcin Dalecki <martin@dalecki.de>
+" Last Change: 17 May 2010
+" Generated from menu_pl_pl.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding iso-8859-2
+
+" Help menu
+menutrans &Help Po&moc
+menutrans &Overview<Tab><F1> &Oglnie<Tab><F1>
+menutrans &User\ Manual Podrcznik\ &uytkownika
+menutrans &How-to\ links &Odnoniki\ JTZ
+menutrans &Find\.\.\. &Szukaj\.\.\.
+menutrans &Credits Po&dzikowania
+menutrans Co&pying &Kopiowanie
+menutrans &Sponsor/Register &Sponsorowanie/Rejestracja
+menutrans O&rphans Sie&roty
+menutrans &Version &Wersja
+menutrans &About o\ &Programie
+
+" File menu
+menutrans &File &Plik
+menutrans &Open\.\.\.<Tab>:e &Otwrz\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Otwrz\ z\ &podziaem\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Nowy<Tab>:enew
+menutrans &Close<Tab>:close &Zamknij<Tab>:close
+menutrans &Save<Tab>:w Za&pisz<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Zapisz\ &jako\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Podziel\ na\ diff-a\ midzy\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Podziel\ atane\ przez\.\.\.
+menutrans &Print &Drukuj
+menutrans Sa&ve-Exit<Tab>:wqa W&yjcie\ z\ zapisem<Tab>:wqa
+menutrans E&xit<Tab>:qa &Wyjcie<Tab>:qa
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Otwrz\ &kart\.\.\.<Tab>:tabnew
+
+" Edit menu
+menutrans &Edit &Edycja
+menutrans &Undo<Tab>u &Cofnij<Tab>u
+menutrans &Redo<Tab>^R &Ponw<Tab>^R
+menutrans Rep&eat<Tab>\. P&owtrz<Tab>\.
+menutrans Cu&t<Tab>"+x W&ytnij<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopiuj<Tab>"+y
+menutrans &Paste<Tab>"+gP &Wklej<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Wstaw\ p&rzed<Tab>[p
+menutrans Put\ &After<Tab>]p Wstaw\ p&o<Tab>]p
+menutrans &Select\ All<Tab>ggVG Z&aznacz\ cao<Tab>ggVG
+menutrans &Find\.\.\. &Szukaj\.\.\.
+menutrans &Find<Tab>/ &Szukaj<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. &Zamie\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s &Zamie<Tab>:%s
+menutrans Find\ and\ Rep&lace &Zamie
+menutrans Find\ and\ Rep&lace<Tab>:s &Zamie<Tab>:s
+menutrans Options\.\.\. Opcje\.\.\.
+menutrans Settings\ &Window Ustawienia
+menutrans &Global\ Settings Ustawienia\ &globalne
+menutrans Startup\ &Settings Ustawienia\ &startowe
+menutrans F&ile\ Settings Ustawienia\ dla\ pliku
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Numerowanie\ wierszy<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Tryb\ &listowania<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Za&wijanie\ wierszy<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! amanie\ wie&rsza<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Rozwijani&e\ tabulatorw<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! &Automatyczne\ wcicia<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Wcicia\ &C<Tab>:set\ cin!
+menutrans &Shiftwidth &Szeroko\ wcicia
+menutrans Te&xt\ Width\.\.\. Dugo\ linii\.\.\.
+menutrans &File\ Format\.\.\. &Format\ pliku\.\.\.
+menutrans Soft\ &Tabstop Rozmiar\ &tabulacji
+menutrans C&olor\ Scheme Zestawy\ kolorw
+menutrans &Keymap Ukady\ klawiatury
+menutrans None aden
+menutrans accents akcenty
+menutrans hebrew hebrajski
+menutrans hebrewp hebrajski\ p
+menutrans russian-jcuken rosyjski-jcuken
+menutrans russian-jcukenwin rosyjski-jcukenwin
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Podwietlanie\ &wzorcw<Tab>:set\ hls!
+
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Ignorowanie\ wielkoci<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! &Pokazywanie\ pasujcych<Tab>:set\ sm!
+
+menutrans &Context\ lines Wiersze\ &kontekstowe
+menutrans &Virtual\ Edit Edycja\ &wirtualna
+
+menutrans Never Nigdy
+menutrans Block\ Selection Zaznaczanie\ blokowe
+menutrans Insert\ mode Tryb\ wprowadzania
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Tryb\ zg&odnoci\ z\ Vi<Tab>:set\ cp!
+menutrans Block\ and\ Insert Blokowe\ i\ wprowadzanie
+menutrans Always Zawsze
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Tryb\ wprowadzania<Tab>:set\ im!
+menutrans Search\ &Path\.\.\. Scieka\ poszukiwania\.\.\.
+menutrans Ta&g\ Files\.\.\. Pliki\ tagw\.\.\.
+
+
+"
+" GUI options
+menutrans Toggle\ &Toolbar Pasek\ narzdzi
+menutrans Toggle\ &Bottom\ Scrollbar Dolny\ przewijacz
+menutrans Toggle\ &Left\ Scrollbar &Lewy\ przewijacz
+menutrans Toggle\ &Right\ Scrollbar P&rawy\ przewijacz
+
+" Programming menu
+menutrans &Tools &Narzdzia
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skocz\ do\ taga<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skok\ w\ &ty<Tab>^T
+menutrans Build\ &Tags\ File &Twrz\ plik\ tagw
+" Spelling
+menutrans &Spelling Pi&sownia
+menutrans &Spell\ Check\ On Wcz
+menutrans Spell\ Check\ &Off Wycz
+menutrans To\ &Next\ error<Tab>]s Do\ &nastpnego\ bdu<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s Do\ &poprzedniego\ bdu<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Sugestie\ poprawek<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall Powtr&z\ poprawk<Tab>:spellrepall
+menutrans Set\ language\ to\ "en" Ustaw\ jzyk\ na\ "en"
+menutrans Set\ language\ to\ "en_au" Ustaw\ jzyk\ na\ "en_au"
+menutrans Set\ language\ to\ "en_ca" Ustaw\ jzyk\ na\ "en_ca"
+menutrans Set\ language\ to\ "en_gb" Ustaw\ jzyk\ na\ "en_gb"
+menutrans Set\ language\ to\ "en_nz" Ustaw\ jzyk\ na\ "en_nz"
+menutrans Set\ language\ to\ "en_us" Ustaw\ jzyk\ na\ "en_us"
+menutrans Set\ language\ to\ "pl" Ustaw\ jzyk\ na\ "pl"
+menutrans &Find\ More\ Languages &Znajd\ wicej\ jzykw
+
+" Folding
+menutrans &Folding &Zwijanie
+menutrans &Enable/Disable\ folds<Tab>zi &Zwi/rozwi<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Linia\ kursora<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx &Tylko\ linia\ kursora<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Zwi\ wicej<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Z&wi\ wszystkie<Tab>zM
+menutrans &Open\ all\ folds<Tab>zR Rozwi\ wszystkie<Tab>zR
+menutrans O&pen\ more\ folds<Tab>zr R&ozwi\ wicej<Tab>zr
+
+menutrans Create\ &Fold<Tab>zf T&wrz\ zawinicie<Tab>zf
+menutrans &Delete\ Fold<Tab>zd U&su\ zawinicie<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD &Usu\ wszystkie\ zawinicia<Tab>zD
+menutrans Fold\ column\ &width Szeroko\ kolumny\ za&wini
+menutrans Fold\ Met&hod Me&toda\ zawijania
+menutrans M&anual &Rcznie
+menutrans I&ndent W&cicie
+menutrans E&xpression W&yraenie
+menutrans S&yntax S&kadnia
+menutrans Ma&rker Zn&acznik
+
+" Diff
+menutrans &Update &Odwie
+menutrans &Get\ Block &Pobierz\ blok
+menutrans &Put\ Block &Wstaw\ blok
+
+" Make and stuff...
+menutrans &Make<Tab>:make M&ake<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Poka\ bdy<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! W&ylicz\ powiadomienia<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &Nastpny\ bd<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Poprzedni\ bd<Tab>:cp
+menutrans &Older\ List<Tab>:cold &Starsza\ lista<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew N&owsza\ lista<Tab>:cnew
+menutrans Error\ &Window Okno\ bd&w
+menutrans &Update<Tab>:cwin Akt&ualizuj<Tab>:cwin
+menutrans &Close<Tab>:cclose &Zamknij<Tab>:cclose
+menutrans &Open<Tab>:copen &Otwrz<Tab>:copen
+
+menutrans Se&T\ Compiler U&staw\ kompilator
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Kody\ szesnastkowe<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Zwyky\ tekst<Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers &Bufory
+menutrans &Refresh\ menu &Odwie
+menutrans &Delete &Skasuj
+menutrans &Alternate &Zmie
+menutrans &Next &Nastpny
+menutrans &Previous &Poprzedni
+menutrans [No\ File] [Brak\ Pliku]
+
+" Window menu
+menutrans &Window &Widoki
+menutrans &New<Tab>^Wn &Nowy<Tab>^Wn
+menutrans S&plit<Tab>^Ws Po&dziel<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ P&odziel\ na\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Podziel\ pionowo<Tab>^Wv
+menutrans Split\ File\ E&xplorer Otwrz\ meneder\ plikw
+
+menutrans &Close<Tab>^Wc &Zamknij<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zamknij\ &inne<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Nastpny<Tab>^Ww
+menutrans P&revious<Tab>^WW &Poprzedni<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Wyrwnaj\ wysokoci<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Z&maksymalizuj\ wysoko<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Zminim&alizuj\ wysoko<Tab>^W1_
+menutrans Max\ Width<Tab>^W\| Maksymalna\ szeroko<Tab>^W\|
+menutrans Min\ Width<Tab>^W1\| Minimalna\ szeroko<Tab>^W1\|
+menutrans Max\ &Width<Tab>^W\| Zmaksymalizuj\ szeroko<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Zminimalizuj\ szeroko<Tab>^W1\|
+menutrans Move\ &To &Id\ do
+menutrans &Top<Tab>^WK &Gra<Tab>^WK
+menutrans &Bottom<Tab>^WJ &D<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Lewa\ strona<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Prawa\ strona<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Obr\ w\ &gr<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Obr\ w\ &d<Tab>^Wr
+menutrans Split\ &Vertically<Tab>^Wv &Podziel\ w\ poziomie<Tab>^Wv
+menutrans Select\ Fo&nt\.\.\. Wybierz\ &czcionk\.\.\.
+
+" The popup menu
+menutrans &Undo &Cofnij
+menutrans Cu&t W&ytnij
+menutrans &Copy &Kopiuj
+menutrans &Paste &Wklej
+menutrans &Delete &Skasuj
+menutrans Select\ Blockwise Zaznacz\ &blok
+menutrans Select\ &Sentence Zaznacz\ &zdanie
+menutrans Select\ Pa&ragraph Zaznacz\ aka&pit
+menutrans Select\ &Word Zaznacz\ &sowo
+menutrans Select\ &Line Zaznacz\ w&iersz
+menutrans Select\ &Block Zaznacz\ &blok
+menutrans Select\ &All Zaznacz\ c&ao
+menutrans Input\ &Methods Wprowadza&nie
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Otwrz plik
+ tmenu ToolBar.Save Zapisz biecy plik
+ tmenu ToolBar.SaveAll Zapisz wszystkie pliki
+ tmenu ToolBar.Print Drukuj
+ tmenu ToolBar.Undo Cofnij
+ tmenu ToolBar.Redo Ponw
+ tmenu ToolBar.Cut Wytnij
+ tmenu ToolBar.Copy Skopiuj
+ tmenu ToolBar.Paste Wklej
+ tmenu ToolBar.Find Szukaj...
+ tmenu ToolBar.FindNext Szukaj nastpnego
+ tmenu ToolBar.FindPrev Szukaj poprzedniego
+ tmenu ToolBar.Replace Szukaj i zamieniaj...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nowy widok
+ tmenu ToolBar.WinSplit Podziel widok
+ tmenu ToolBar.WinMax Zmaksymalizuj widok
+ tmenu ToolBar.WinMin Zminimalizuj widok
+ tmenu ToolBar.WinClose Zamknij widok
+ endif
+ tmenu ToolBar.LoadSesn Zaaduj sesj
+ tmenu ToolBar.SaveSesn Zachowaj biec sesj
+ tmenu ToolBar.RunScript Uruchom skrypt Vima
+ tmenu ToolBar.Make Wykonaj biecy projekt
+ tmenu ToolBar.Shell Otwrz powok
+ tmenu ToolBar.RunCtags Twrz tagi w biecym katalogu
+ tmenu ToolBar.TagJump Skok do taga pod kursorem
+ tmenu ToolBar.Help Pomoc Vima
+ tmenu ToolBar.FindHelp Przeszukuj pomoc Vim-a
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Skadnia
+menutrans &Show\ filetypes\ in\ menu Poka\ typy\ &plikw\ w\ menu
+menutrans Set\ '&syntax'\ only Ustaw\ tylko\ '&syntax'
+menutrans Set\ '&filetype'\ too Ustaw\ rwnie\ '&filetype'
+menutrans &Off &Wycz
+menutrans &Manual &Rcznie
+menutrans A&utomatic A&utomatyczne
+menutrans on/off\ for\ &This\ file wcz/w&ycz\ dla\ pliku
+menutrans Co&lor\ test Test\ &kolorw
+menutrans &Highlight\ test &Test\ podwietlania
+menutrans &Convert\ to\ HTML Przetwrz\ na\ &HTML
+
+" dialog texts
+let menutrans_no_file = "[Brak pliku]"
+let menutrans_help_dialog = "Wprowad komend lub sowo, aby otrzyma pomoc o:\n\nPrzedrostek i_ oznacza komend trybu Wprowadzania (np. i_CTRL-X)\nPrzedrostek c_ oznacza komend edycji wiersza komend (np. c_<Del>)\nPrzedrostek ' oznacza nazw opcji (np. 'shiftwidth')"
+let g:menutrans_path_dialog = "Wprowad ciek poszukiwania plikw.\nProsz rozdziela nazwy katalogw przecinkiem."
+let g:menutrans_tags_dialog = "Podaj nazwy plikw tagw.\nProsz rozdziela nazwy przecinkiem."
+let g:menutrans_textwidth_dialog = "Wprowad now szeroko tekstu (0 wycza przewijanie): "
+let g:menutrans_fileformat_dialog = "Wybierz format w ktrym ten plik ma by zapisany"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Anuluj"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_pl_pl.utf-8.vim b/runtime/lang/menu_pl_pl.utf-8.vim
new file mode 100644
index 0000000..01bd585
--- /dev/null
+++ b/runtime/lang/menu_pl_pl.utf-8.vim
@@ -0,0 +1,293 @@
+" Menu Translations: Polish
+" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Initial Translation: Marcin Dalecki <martin@dalecki.de>
+" Last Change: 17 May 2010
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Help menu
+menutrans &Help Po&moc
+menutrans &Overview<Tab><F1> &Ogólnie<Tab><F1>
+menutrans &User\ Manual Podręcznik\ &użytkownika
+menutrans &How-to\ links &Odnośniki\ JTZ
+menutrans &Find\.\.\. &Szukaj\.\.\.
+menutrans &Credits Po&dziękowania
+menutrans Co&pying &Kopiowanie
+menutrans &Sponsor/Register &Sponsorowanie/Rejestracja
+menutrans O&rphans Sie&roty
+menutrans &Version &Wersja
+menutrans &About o\ &Programie
+
+" File menu
+menutrans &File &Plik
+menutrans &Open\.\.\.<Tab>:e &Otwórz\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Otwórz\ z\ &podziałem\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Nowy<Tab>:enew
+menutrans &Close<Tab>:close &Zamknij<Tab>:close
+menutrans &Save<Tab>:w Za&pisz<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Zapisz\ &jako\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Podziel\ na\ diff-a\ między\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Podziel\ łatane\ przez\.\.\.
+menutrans &Print &Drukuj
+menutrans Sa&ve-Exit<Tab>:wqa W&yjście\ z\ zapisem<Tab>:wqa
+menutrans E&xit<Tab>:qa &Wyjście<Tab>:qa
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Otwórz\ &kartę\.\.\.<Tab>:tabnew
+
+" Edit menu
+menutrans &Edit &Edycja
+menutrans &Undo<Tab>u &Cofnij<Tab>u
+menutrans &Redo<Tab>^R &Ponów<Tab>^R
+menutrans Rep&eat<Tab>\. P&owtórz<Tab>\.
+menutrans Cu&t<Tab>"+x W&ytnij<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopiuj<Tab>"+y
+menutrans &Paste<Tab>"+gP &Wklej<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Wstaw\ p&rzed<Tab>[p
+menutrans Put\ &After<Tab>]p Wstaw\ p&o<Tab>]p
+menutrans &Select\ All<Tab>ggVG Z&aznacz\ całość<Tab>ggVG
+menutrans &Find\.\.\. &Szukaj\.\.\.
+menutrans &Find<Tab>/ &Szukaj<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. &Zamień\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s &Zamień<Tab>:%s
+menutrans Find\ and\ Rep&lace &Zamień
+menutrans Find\ and\ Rep&lace<Tab>:s &Zamień<Tab>:s
+menutrans Options\.\.\. Opcje\.\.\.
+menutrans Settings\ &Window Ustawienia
+menutrans &Global\ Settings Ustawienia\ &globalne
+menutrans Startup\ &Settings Ustawienia\ &startowe
+menutrans F&ile\ Settings Ustawienia\ dla\ pliku
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Numerowanie\ wierszy<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Tryb\ &listowania<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Za&wijanie\ wierszy<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Łamanie\ wie&rsza<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Rozwijani&e\ tabulatorów<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! &Automatyczne\ wcięcia<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Wcięcia\ &C<Tab>:set\ cin!
+menutrans &Shiftwidth &Szerokość\ wcięcia
+menutrans Te&xt\ Width\.\.\. Długość\ linii\.\.\.
+menutrans &File\ Format\.\.\. &Format\ pliku\.\.\.
+menutrans Soft\ &Tabstop Rozmiar\ &tabulacji
+menutrans C&olor\ Scheme Zestawy\ kolorów
+menutrans &Keymap Układy\ klawiatury
+menutrans None żaden
+menutrans accents akcenty
+menutrans hebrew hebrajski
+menutrans hebrewp hebrajski\ p
+menutrans russian-jcuken rosyjski-jcuken
+menutrans russian-jcukenwin rosyjski-jcukenwin
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Podświetlanie\ &wzorców<Tab>:set\ hls!
+
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Ignorowanie\ wielkości<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! &Pokazywanie\ pasujących<Tab>:set\ sm!
+
+menutrans &Context\ lines Wiersze\ &kontekstowe
+menutrans &Virtual\ Edit Edycja\ &wirtualna
+
+menutrans Never Nigdy
+menutrans Block\ Selection Zaznaczanie\ blokowe
+menutrans Insert\ mode Tryb\ wprowadzania
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Tryb\ zg&odności\ z\ Vi<Tab>:set\ cp!
+menutrans Block\ and\ Insert Blokowe\ i\ wprowadzanie
+menutrans Always Zawsze
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Tryb\ wprowadzania<Tab>:set\ im!
+menutrans Search\ &Path\.\.\. Scieżka\ poszukiwania\.\.\.
+menutrans Ta&g\ Files\.\.\. Pliki\ tagów\.\.\.
+
+
+"
+" GUI options
+menutrans Toggle\ &Toolbar Pasek\ narzędzi
+menutrans Toggle\ &Bottom\ Scrollbar Dolny\ przewijacz
+menutrans Toggle\ &Left\ Scrollbar &Lewy\ przewijacz
+menutrans Toggle\ &Right\ Scrollbar P&rawy\ przewijacz
+
+" Programming menu
+menutrans &Tools &Narzędzia
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skocz\ do\ taga<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skok\ w\ &tył<Tab>^T
+menutrans Build\ &Tags\ File &Twórz\ plik\ tagów
+" Spelling
+menutrans &Spelling Pi&sownia
+menutrans &Spell\ Check\ On Włącz
+menutrans Spell\ Check\ &Off Wyłącz
+menutrans To\ &Next\ error<Tab>]s Do\ &następnego\ błędu<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s Do\ &poprzedniego\ błędu<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Sugestie\ poprawek<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall Powtór&z\ poprawkę<Tab>:spellrepall
+menutrans Set\ language\ to\ "en" Ustaw\ język\ na\ "en"
+menutrans Set\ language\ to\ "en_au" Ustaw\ język\ na\ "en_au"
+menutrans Set\ language\ to\ "en_ca" Ustaw\ język\ na\ "en_ca"
+menutrans Set\ language\ to\ "en_gb" Ustaw\ język\ na\ "en_gb"
+menutrans Set\ language\ to\ "en_nz" Ustaw\ język\ na\ "en_nz"
+menutrans Set\ language\ to\ "en_us" Ustaw\ język\ na\ "en_us"
+menutrans Set\ language\ to\ "pl" Ustaw\ język\ na\ "pl"
+menutrans &Find\ More\ Languages &Znajdź\ więcej\ języków
+
+" Folding
+menutrans &Folding &Zwijanie
+menutrans &Enable/Disable\ folds<Tab>zi &Zwiń/rozwiń<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Linia\ kursora<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx &Tylko\ linia\ kursora<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Zwiń\ więcej<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Z&wiń\ wszystkie<Tab>zM
+menutrans &Open\ all\ folds<Tab>zR Rozwiń\ wszystkie<Tab>zR
+menutrans O&pen\ more\ folds<Tab>zr R&ozwiń\ więcej<Tab>zr
+
+menutrans Create\ &Fold<Tab>zf T&wórz\ zawinięcie<Tab>zf
+menutrans &Delete\ Fold<Tab>zd U&suń\ zawinięcie<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD &Usuń\ wszystkie\ zawinięcia<Tab>zD
+menutrans Fold\ column\ &width Szerokość\ kolumny\ za&winięć
+menutrans Fold\ Met&hod Me&toda\ zawijania
+menutrans M&anual &Ręcznie
+menutrans I&ndent W&cięcie
+menutrans E&xpression W&yrażenie
+menutrans S&yntax S&kładnia
+menutrans Ma&rker Zn&acznik
+
+" Diff
+menutrans &Update &Odśwież
+menutrans &Get\ Block &Pobierz\ blok
+menutrans &Put\ Block &Wstaw\ blok
+
+" Make and stuff...
+menutrans &Make<Tab>:make M&ake<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Pokaż\ błędy<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! W&ylicz\ powiadomienia<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &Następny\ błąd<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Poprzedni\ błąd<Tab>:cp
+menutrans &Older\ List<Tab>:cold &Starsza\ lista<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew N&owsza\ lista<Tab>:cnew
+menutrans Error\ &Window Okno\ błędó&w
+menutrans &Update<Tab>:cwin Akt&ualizuj<Tab>:cwin
+menutrans &Close<Tab>:cclose &Zamknij<Tab>:cclose
+menutrans &Open<Tab>:copen &Otwórz<Tab>:copen
+
+menutrans Se&T\ Compiler U&staw\ kompilator
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Kody\ szesnastkowe<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Zwykły\ tekst<Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers &Bufory
+menutrans &Refresh\ menu &Odśwież
+menutrans &Delete &Skasuj
+menutrans &Alternate &Zmień
+menutrans &Next &Następny
+menutrans &Previous &Poprzedni
+menutrans [No\ File] [Brak\ Pliku]
+
+" Window menu
+menutrans &Window &Widoki
+menutrans &New<Tab>^Wn &Nowy<Tab>^Wn
+menutrans S&plit<Tab>^Ws Po&dziel<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ P&odziel\ na\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Podziel\ pionowo<Tab>^Wv
+menutrans Split\ File\ E&xplorer Otwórz\ menedżer\ plików
+
+menutrans &Close<Tab>^Wc &Zamknij<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zamknij\ &inne<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Następny<Tab>^Ww
+menutrans P&revious<Tab>^WW &Poprzedni<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Wyrównaj\ wysokości<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Z&maksymalizuj\ wysokość<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Zminim&alizuj\ wysokość<Tab>^W1_
+menutrans Max\ Width<Tab>^W\| Maksymalna\ szerokość<Tab>^W\|
+menutrans Min\ Width<Tab>^W1\| Minimalna\ szerokość<Tab>^W1\|
+menutrans Max\ &Width<Tab>^W\| Zmaksymalizuj\ szerokość<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Zminimalizuj\ szerokość<Tab>^W1\|
+menutrans Move\ &To &Idź\ do
+menutrans &Top<Tab>^WK &Góra<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Dół<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Lewa\ strona<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Prawa\ strona<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Obróć\ w\ &górę<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Obróć\ w\ &dół<Tab>^Wr
+menutrans Split\ &Vertically<Tab>^Wv &Podziel\ w\ poziomie<Tab>^Wv
+menutrans Select\ Fo&nt\.\.\. Wybierz\ &czcionkę\.\.\.
+
+" The popup menu
+menutrans &Undo &Cofnij
+menutrans Cu&t W&ytnij
+menutrans &Copy &Kopiuj
+menutrans &Paste &Wklej
+menutrans &Delete &Skasuj
+menutrans Select\ Blockwise Zaznacz\ &blok
+menutrans Select\ &Sentence Zaznacz\ &zdanie
+menutrans Select\ Pa&ragraph Zaznacz\ aka&pit
+menutrans Select\ &Word Zaznacz\ &słowo
+menutrans Select\ &Line Zaznacz\ w&iersz
+menutrans Select\ &Block Zaznacz\ &blok
+menutrans Select\ &All Zaznacz\ c&ałość
+menutrans Input\ &Methods Wprowadza&nie
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Otwórz plik
+ tmenu ToolBar.Save Zapisz bieżący plik
+ tmenu ToolBar.SaveAll Zapisz wszystkie pliki
+ tmenu ToolBar.Print Drukuj
+ tmenu ToolBar.Undo Cofnij
+ tmenu ToolBar.Redo Ponów
+ tmenu ToolBar.Cut Wytnij
+ tmenu ToolBar.Copy Skopiuj
+ tmenu ToolBar.Paste Wklej
+ tmenu ToolBar.Find Szukaj...
+ tmenu ToolBar.FindNext Szukaj następnego
+ tmenu ToolBar.FindPrev Szukaj poprzedniego
+ tmenu ToolBar.Replace Szukaj i zamieniaj...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nowy widok
+ tmenu ToolBar.WinSplit Podziel widok
+ tmenu ToolBar.WinMax Zmaksymalizuj widok
+ tmenu ToolBar.WinMin Zminimalizuj widok
+ tmenu ToolBar.WinClose Zamknij widok
+ endif
+ tmenu ToolBar.LoadSesn Załaduj sesję
+ tmenu ToolBar.SaveSesn Zachowaj bieżącą sesję
+ tmenu ToolBar.RunScript Uruchom skrypt Vima
+ tmenu ToolBar.Make Wykonaj bieżący projekt
+ tmenu ToolBar.Shell Otwórz powłokę
+ tmenu ToolBar.RunCtags Twórz tagi w bieżącym katalogu
+ tmenu ToolBar.TagJump Skok do taga pod kursorem
+ tmenu ToolBar.Help Pomoc Vima
+ tmenu ToolBar.FindHelp Przeszukuj pomoc Vim-a
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Składnia
+menutrans &Show\ filetypes\ in\ menu Pokaż\ typy\ &plików\ w\ menu
+menutrans Set\ '&syntax'\ only Ustaw\ tylko\ '&syntax'
+menutrans Set\ '&filetype'\ too Ustaw\ również\ '&filetype'
+menutrans &Off &Wyłącz
+menutrans &Manual &Ręcznie
+menutrans A&utomatic A&utomatyczne
+menutrans on/off\ for\ &This\ file włącz/w&yłącz\ dla\ pliku
+menutrans Co&lor\ test Test\ &kolorów
+menutrans &Highlight\ test &Test\ podświetlania
+menutrans &Convert\ to\ HTML Przetwórz\ na\ &HTML
+
+" dialog texts
+let menutrans_no_file = "[Brak pliku]"
+let menutrans_help_dialog = "Wprowadź komendę lub słowo, aby otrzymać pomoc o:\n\nPrzedrostek i_ oznacza komendę trybu Wprowadzania (np. i_CTRL-X)\nPrzedrostek c_ oznacza komendę edycji wiersza komend (np. c_<Del>)\nPrzedrostek ' oznacza nazwę opcji (np. 'shiftwidth')"
+let g:menutrans_path_dialog = "Wprowadź ścieżkę poszukiwania plików.\nProszę rozdzielać nazwy katalogów przecinkiem."
+let g:menutrans_tags_dialog = "Podaj nazwy plików tagów.\nProszę rozdzielać nazwy przecinkiem."
+let g:menutrans_textwidth_dialog = "Wprowadź nową szerokość tekstu (0 wyłącza przewijanie): "
+let g:menutrans_fileformat_dialog = "Wybierz format w którym ten plik ma być zapisany"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Anuluj"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_polish_poland.1250.vim b/runtime/lang/menu_polish_poland.1250.vim
new file mode 100644
index 0000000..5077703
--- /dev/null
+++ b/runtime/lang/menu_polish_poland.1250.vim
@@ -0,0 +1,293 @@
+" Menu Translations: Polish
+" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Initial Translation: Marcin Dalecki <martin@dalecki.de>
+" Last Change: 17 May 2010
+" Generated from menu_pl_pl.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding cp1250
+
+" Help menu
+menutrans &Help Po&moc
+menutrans &Overview<Tab><F1> &Oglnie<Tab><F1>
+menutrans &User\ Manual Podrcznik\ &uytkownika
+menutrans &How-to\ links &Odnoniki\ JTZ
+menutrans &Find\.\.\. &Szukaj\.\.\.
+menutrans &Credits Po&dzikowania
+menutrans Co&pying &Kopiowanie
+menutrans &Sponsor/Register &Sponsorowanie/Rejestracja
+menutrans O&rphans Sie&roty
+menutrans &Version &Wersja
+menutrans &About o\ &Programie
+
+" File menu
+menutrans &File &Plik
+menutrans &Open\.\.\.<Tab>:e &Otwrz\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Otwrz\ z\ &podziaem\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Nowy<Tab>:enew
+menutrans &Close<Tab>:close &Zamknij<Tab>:close
+menutrans &Save<Tab>:w Za&pisz<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Zapisz\ &jako\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Podziel\ na\ diff-a\ midzy\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Podziel\ atane\ przez\.\.\.
+menutrans &Print &Drukuj
+menutrans Sa&ve-Exit<Tab>:wqa W&yjcie\ z\ zapisem<Tab>:wqa
+menutrans E&xit<Tab>:qa &Wyjcie<Tab>:qa
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Otwrz\ &kart\.\.\.<Tab>:tabnew
+
+" Edit menu
+menutrans &Edit &Edycja
+menutrans &Undo<Tab>u &Cofnij<Tab>u
+menutrans &Redo<Tab>^R &Ponw<Tab>^R
+menutrans Rep&eat<Tab>\. P&owtrz<Tab>\.
+menutrans Cu&t<Tab>"+x W&ytnij<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopiuj<Tab>"+y
+menutrans &Paste<Tab>"+gP &Wklej<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Wstaw\ p&rzed<Tab>[p
+menutrans Put\ &After<Tab>]p Wstaw\ p&o<Tab>]p
+menutrans &Select\ All<Tab>ggVG Z&aznacz\ cao<Tab>ggVG
+menutrans &Find\.\.\. &Szukaj\.\.\.
+menutrans &Find<Tab>/ &Szukaj<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. &Zamie\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s &Zamie<Tab>:%s
+menutrans Find\ and\ Rep&lace &Zamie
+menutrans Find\ and\ Rep&lace<Tab>:s &Zamie<Tab>:s
+menutrans Options\.\.\. Opcje\.\.\.
+menutrans Settings\ &Window Ustawienia
+menutrans &Global\ Settings Ustawienia\ &globalne
+menutrans Startup\ &Settings Ustawienia\ &startowe
+menutrans F&ile\ Settings Ustawienia\ dla\ pliku
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Numerowanie\ wierszy<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Tryb\ &listowania<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Za&wijanie\ wierszy<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! amanie\ wie&rsza<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Rozwijani&e\ tabulatorw<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! &Automatyczne\ wcicia<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Wcicia\ &C<Tab>:set\ cin!
+menutrans &Shiftwidth &Szeroko\ wcicia
+menutrans Te&xt\ Width\.\.\. Dugo\ linii\.\.\.
+menutrans &File\ Format\.\.\. &Format\ pliku\.\.\.
+menutrans Soft\ &Tabstop Rozmiar\ &tabulacji
+menutrans C&olor\ Scheme Zestawy\ kolorw
+menutrans &Keymap Ukady\ klawiatury
+menutrans None aden
+menutrans accents akcenty
+menutrans hebrew hebrajski
+menutrans hebrewp hebrajski\ p
+menutrans russian-jcuken rosyjski-jcuken
+menutrans russian-jcukenwin rosyjski-jcukenwin
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Podwietlanie\ &wzorcw<Tab>:set\ hls!
+
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Ignorowanie\ wielkoci<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! &Pokazywanie\ pasujcych<Tab>:set\ sm!
+
+menutrans &Context\ lines Wiersze\ &kontekstowe
+menutrans &Virtual\ Edit Edycja\ &wirtualna
+
+menutrans Never Nigdy
+menutrans Block\ Selection Zaznaczanie\ blokowe
+menutrans Insert\ mode Tryb\ wprowadzania
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Tryb\ zg&odnoci\ z\ Vi<Tab>:set\ cp!
+menutrans Block\ and\ Insert Blokowe\ i\ wprowadzanie
+menutrans Always Zawsze
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Tryb\ wprowadzania<Tab>:set\ im!
+menutrans Search\ &Path\.\.\. Scieka\ poszukiwania\.\.\.
+menutrans Ta&g\ Files\.\.\. Pliki\ tagw\.\.\.
+
+
+"
+" GUI options
+menutrans Toggle\ &Toolbar Pasek\ narzdzi
+menutrans Toggle\ &Bottom\ Scrollbar Dolny\ przewijacz
+menutrans Toggle\ &Left\ Scrollbar &Lewy\ przewijacz
+menutrans Toggle\ &Right\ Scrollbar P&rawy\ przewijacz
+
+" Programming menu
+menutrans &Tools &Narzdzia
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skocz\ do\ taga<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skok\ w\ &ty<Tab>^T
+menutrans Build\ &Tags\ File &Twrz\ plik\ tagw
+" Spelling
+menutrans &Spelling Pi&sownia
+menutrans &Spell\ Check\ On Wcz
+menutrans Spell\ Check\ &Off Wycz
+menutrans To\ &Next\ error<Tab>]s Do\ &nastpnego\ bdu<Tab>]s
+menutrans To\ &Previous\ error<Tab>[s Do\ &poprzedniego\ bdu<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Sugestie\ poprawek<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall Powtr&z\ poprawk<Tab>:spellrepall
+menutrans Set\ language\ to\ "en" Ustaw\ jzyk\ na\ "en"
+menutrans Set\ language\ to\ "en_au" Ustaw\ jzyk\ na\ "en_au"
+menutrans Set\ language\ to\ "en_ca" Ustaw\ jzyk\ na\ "en_ca"
+menutrans Set\ language\ to\ "en_gb" Ustaw\ jzyk\ na\ "en_gb"
+menutrans Set\ language\ to\ "en_nz" Ustaw\ jzyk\ na\ "en_nz"
+menutrans Set\ language\ to\ "en_us" Ustaw\ jzyk\ na\ "en_us"
+menutrans Set\ language\ to\ "pl" Ustaw\ jzyk\ na\ "pl"
+menutrans &Find\ More\ Languages &Znajd\ wicej\ jzykw
+
+" Folding
+menutrans &Folding &Zwijanie
+menutrans &Enable/Disable\ folds<Tab>zi &Zwi/rozwi<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Linia\ kursora<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx &Tylko\ linia\ kursora<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Zwi\ wicej<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Z&wi\ wszystkie<Tab>zM
+menutrans &Open\ all\ folds<Tab>zR Rozwi\ wszystkie<Tab>zR
+menutrans O&pen\ more\ folds<Tab>zr R&ozwi\ wicej<Tab>zr
+
+menutrans Create\ &Fold<Tab>zf T&wrz\ zawinicie<Tab>zf
+menutrans &Delete\ Fold<Tab>zd U&su\ zawinicie<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD &Usu\ wszystkie\ zawinicia<Tab>zD
+menutrans Fold\ column\ &width Szeroko\ kolumny\ za&wini
+menutrans Fold\ Met&hod Me&toda\ zawijania
+menutrans M&anual &Rcznie
+menutrans I&ndent W&cicie
+menutrans E&xpression W&yraenie
+menutrans S&yntax S&kadnia
+menutrans Ma&rker Zn&acznik
+
+" Diff
+menutrans &Update &Odwie
+menutrans &Get\ Block &Pobierz\ blok
+menutrans &Put\ Block &Wstaw\ blok
+
+" Make and stuff...
+menutrans &Make<Tab>:make M&ake<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Poka\ bdy<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! W&ylicz\ powiadomienia<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &Nastpny\ bd<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Poprzedni\ bd<Tab>:cp
+menutrans &Older\ List<Tab>:cold &Starsza\ lista<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew N&owsza\ lista<Tab>:cnew
+menutrans Error\ &Window Okno\ bd&w
+menutrans &Update<Tab>:cwin Akt&ualizuj<Tab>:cwin
+menutrans &Close<Tab>:cclose &Zamknij<Tab>:cclose
+menutrans &Open<Tab>:copen &Otwrz<Tab>:copen
+
+menutrans Se&T\ Compiler U&staw\ kompilator
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Kody\ szesnastkowe<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Zwyky\ tekst<Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers &Bufory
+menutrans &Refresh\ menu &Odwie
+menutrans &Delete &Skasuj
+menutrans &Alternate &Zmie
+menutrans &Next &Nastpny
+menutrans &Previous &Poprzedni
+menutrans [No\ File] [Brak\ Pliku]
+
+" Window menu
+menutrans &Window &Widoki
+menutrans &New<Tab>^Wn &Nowy<Tab>^Wn
+menutrans S&plit<Tab>^Ws Po&dziel<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ P&odziel\ na\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Podziel\ pionowo<Tab>^Wv
+menutrans Split\ File\ E&xplorer Otwrz\ meneder\ plikw
+
+menutrans &Close<Tab>^Wc &Zamknij<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zamknij\ &inne<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Nastpny<Tab>^Ww
+menutrans P&revious<Tab>^WW &Poprzedni<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Wyrwnaj\ wysokoci<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Z&maksymalizuj\ wysoko<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Zminim&alizuj\ wysoko<Tab>^W1_
+menutrans Max\ Width<Tab>^W\| Maksymalna\ szeroko<Tab>^W\|
+menutrans Min\ Width<Tab>^W1\| Minimalna\ szeroko<Tab>^W1\|
+menutrans Max\ &Width<Tab>^W\| Zmaksymalizuj\ szeroko<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Zminimalizuj\ szeroko<Tab>^W1\|
+menutrans Move\ &To &Id\ do
+menutrans &Top<Tab>^WK &Gra<Tab>^WK
+menutrans &Bottom<Tab>^WJ &D<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Lewa\ strona<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Prawa\ strona<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Obr\ w\ &gr<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Obr\ w\ &d<Tab>^Wr
+menutrans Split\ &Vertically<Tab>^Wv &Podziel\ w\ poziomie<Tab>^Wv
+menutrans Select\ Fo&nt\.\.\. Wybierz\ &czcionk\.\.\.
+
+" The popup menu
+menutrans &Undo &Cofnij
+menutrans Cu&t W&ytnij
+menutrans &Copy &Kopiuj
+menutrans &Paste &Wklej
+menutrans &Delete &Skasuj
+menutrans Select\ Blockwise Zaznacz\ &blok
+menutrans Select\ &Sentence Zaznacz\ &zdanie
+menutrans Select\ Pa&ragraph Zaznacz\ aka&pit
+menutrans Select\ &Word Zaznacz\ &sowo
+menutrans Select\ &Line Zaznacz\ w&iersz
+menutrans Select\ &Block Zaznacz\ &blok
+menutrans Select\ &All Zaznacz\ c&ao
+menutrans Input\ &Methods Wprowadza&nie
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Otwrz plik
+ tmenu ToolBar.Save Zapisz biecy plik
+ tmenu ToolBar.SaveAll Zapisz wszystkie pliki
+ tmenu ToolBar.Print Drukuj
+ tmenu ToolBar.Undo Cofnij
+ tmenu ToolBar.Redo Ponw
+ tmenu ToolBar.Cut Wytnij
+ tmenu ToolBar.Copy Skopiuj
+ tmenu ToolBar.Paste Wklej
+ tmenu ToolBar.Find Szukaj...
+ tmenu ToolBar.FindNext Szukaj nastpnego
+ tmenu ToolBar.FindPrev Szukaj poprzedniego
+ tmenu ToolBar.Replace Szukaj i zamieniaj...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nowy widok
+ tmenu ToolBar.WinSplit Podziel widok
+ tmenu ToolBar.WinMax Zmaksymalizuj widok
+ tmenu ToolBar.WinMin Zminimalizuj widok
+ tmenu ToolBar.WinClose Zamknij widok
+ endif
+ tmenu ToolBar.LoadSesn Zaaduj sesj
+ tmenu ToolBar.SaveSesn Zachowaj biec sesj
+ tmenu ToolBar.RunScript Uruchom skrypt Vima
+ tmenu ToolBar.Make Wykonaj biecy projekt
+ tmenu ToolBar.Shell Otwrz powok
+ tmenu ToolBar.RunCtags Twrz tagi w biecym katalogu
+ tmenu ToolBar.TagJump Skok do taga pod kursorem
+ tmenu ToolBar.Help Pomoc Vima
+ tmenu ToolBar.FindHelp Przeszukuj pomoc Vim-a
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Skadnia
+menutrans &Show\ filetypes\ in\ menu Poka\ typy\ &plikw\ w\ menu
+menutrans Set\ '&syntax'\ only Ustaw\ tylko\ '&syntax'
+menutrans Set\ '&filetype'\ too Ustaw\ rwnie\ '&filetype'
+menutrans &Off &Wycz
+menutrans &Manual &Rcznie
+menutrans A&utomatic A&utomatyczne
+menutrans on/off\ for\ &This\ file wcz/w&ycz\ dla\ pliku
+menutrans Co&lor\ test Test\ &kolorw
+menutrans &Highlight\ test &Test\ podwietlania
+menutrans &Convert\ to\ HTML Przetwrz\ na\ &HTML
+
+" dialog texts
+let menutrans_no_file = "[Brak pliku]"
+let menutrans_help_dialog = "Wprowad komend lub sowo, aby otrzyma pomoc o:\n\nPrzedrostek i_ oznacza komend trybu Wprowadzania (np. i_CTRL-X)\nPrzedrostek c_ oznacza komend edycji wiersza komend (np. c_<Del>)\nPrzedrostek ' oznacza nazw opcji (np. 'shiftwidth')"
+let g:menutrans_path_dialog = "Wprowad ciek poszukiwania plikw.\nProsz rozdziela nazwy katalogw przecinkiem."
+let g:menutrans_tags_dialog = "Podaj nazwy plikw tagw.\nProsz rozdziela nazwy przecinkiem."
+let g:menutrans_textwidth_dialog = "Wprowad now szeroko tekstu (0 wycza przewijanie): "
+let g:menutrans_fileformat_dialog = "Wybierz format w ktrym ten plik ma by zapisany"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Anuluj"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_pt_br.latin1.vim b/runtime/lang/menu_pt_br.latin1.vim
new file mode 100644
index 0000000..bed9487
--- /dev/null
+++ b/runtime/lang/menu_pt_br.latin1.vim
@@ -0,0 +1,3 @@
+" Menu translations: Portuguese
+
+source <sfile>:p:h/menu_pt_br.vim
diff --git a/runtime/lang/menu_pt_br.utf-8.vim b/runtime/lang/menu_pt_br.utf-8.vim
new file mode 100644
index 0000000..4879c24
--- /dev/null
+++ b/runtime/lang/menu_pt_br.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu translations: Portuguese for UTF-8 encoding
+
+source <sfile>:p:h/menu_pt_br.vim
diff --git a/runtime/lang/menu_pt_br.vim b/runtime/lang/menu_pt_br.vim
new file mode 100644
index 0000000..0c6ff93
--- /dev/null
+++ b/runtime/lang/menu_pt_br.vim
@@ -0,0 +1,290 @@
+" Menu Translations: Portugus do Brasil
+" Maintainer: Jos de Paula <jose@infoviaweb.com>
+" Last Change: 2020 Apr 23
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Translations in latin1 (ISO-8859-1), and should work in
+" latin9 (ISO-8859-15)
+
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+" Help menu
+menutrans &Help A&juda
+menutrans &Overview<Tab><F1> &Contedo
+menutrans &User\ Manual &Manual\ do\ Usurio
+menutrans &How-to\ links &Como\ fazer?
+menutrans &Find\.\.\. &Procurar\.\.\.
+menutrans &Credits &Crditos
+menutrans O&rphans &rfos
+menutrans Co&pying &Licena
+menutrans &Sponsor/Register &Doar/Registrar
+menutrans &Version &Verso
+menutrans &About &Sobre
+
+" File menu
+menutrans &File &Arquivo
+menutrans &Open\.\.\.<Tab>:e A&brir\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Ab&rir\ em\ outra\ janela\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Novo<Tab>:enew
+menutrans &Close<Tab>:close &Fechar<Tab>:close
+menutrans &Save<Tab>:w &Salvar<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Sa&lvar\ como\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. &Exibir\ diferenas\ com\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Ex&ibir\ patcheado\ por\.\.\.
+menutrans &Print I&mprimir
+menutrans Sa&ve-Exit<Tab>:wqa Sal&var\ e\ sair<Tab>:wqa
+menutrans E&xit<Tab>:qa Sai&r<Tab>:qa
+
+" Edit menu
+menutrans &Edit &Editar
+menutrans &Undo<Tab>u &Desfazer<Tab>u
+menutrans &Redo<Tab>^R &Refazer<Tab>u
+menutrans Rep&eat<Tab>\. Repe&tir<Tab>\.
+menutrans Cu&t<Tab>"+x Re&cortar<Tab>"+x
+menutrans &Copy<Tab>"+y Cop&iar<Tab>"+y
+menutrans &Paste<Tab>"+gP C&olar<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Colocar\ &antes<Tab>[p
+menutrans Put\ &After<Tab>]p Colocar\ &depois<Tab>]p
+menutrans &Select\ all<Tab>ggVG &Selecionar\ tudo<Tab>ggVG
+menutrans &Find\.\.\. &Procurar\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Procurar\ e\ substit&uir\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s Procurar\ e\ substit&uir<Tab>:%s
+menutrans Find\ and\ Rep&lace Procurar\ e\ substit&uir
+menutrans Find\ and\ Rep&lace<Tab>:s Procurar\ e\ substituir<Tab>:s
+menutrans Settings\ &Window &Opes
+menutrans Startup\ &Settings &Inicializao
+
+" Edit/Global Settings
+menutrans &Global\ Settings Opes\ &Globais
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Ativar/Desativar\ &Realce\ de\ Padres<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Ativar/Desativar\ &Ignorar\ maisculas<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Ativar/Desativar\ &coincidncias<Tab>:set\ sm!
+
+menutrans &Context\ lines Linhas\ de\ C&ontexto
+
+menutrans &Virtual\ Edit Edio\ &Virtual
+menutrans Never Nunca
+menutrans Block\ Selection Seleo\ de\ Bloco
+menutrans Insert\ mode Modo\ de\ insero
+menutrans Block\ and\ Insert Bloco\ e\ insero
+menutrans Always Sempre
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Ativar/Desativar\ Modo\ de\ In&sero<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Ativar/Desativar\ Co&mpatibilidade\ com\ Vi<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Camin&ho\ de\ Busca\.\.\.
+menutrans Ta&g\ Files\.\.\. Arquivos\ de\ Tags\.\.\.
+
+" GUI options
+menutrans Toggle\ &Toolbar Ocultar/Exibir\ Barra\ de\ &Ferramentas
+menutrans Toggle\ &Bottom\ Scrollbar Ocultar/Exibir\ Barra\ de\ &Rolagem\ Inferior
+menutrans Toggle\ &Left\ Scrollbar Ocultar/Exibir\ Barra\ de\ R&olagem\ Esquerda
+menutrans Toggle\ &Right\ Scrollbar Ocultar/Exibir\ Barra\ de\ Ro&lagem\ Direita
+let g:menutrans_path_dialog = "Indique um caminho de procura para os arquivos.\nSepare os nomes dos diretrios com uma vrgula."
+let g:menutrans_tags_dialog = "Indique os nomes dos arquivos de tags.\nSepare os nomes com uma vrgula."
+
+" Edit/File Settings
+menutrans F&ile\ Settings Opes\ do\ &Arquivo
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Ativar/Desativar\ &numerao\ de\ linhas<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Ativar/Desativar\ modo\ &list<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Ativar/Desativar\ &quebra\ de\ linhas<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Ativar/Desativar\ quebra\ na\ &palavra<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Ativar/Desativar\ expanso\ de\ tabs<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Ativar/Desativar\ &auto-indentao<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Ativar/Desativar\ indentao\ estilo\ &C<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth Largura\ da\ &indentao
+
+menutrans Soft\ &Tabstop &Tabulao\ com\ espaos
+
+menutrans Te&xt\ Width\.\.\. Largura\ do\ te&xto\.\.\.
+let g:menutrans_textwidth_dialog = "Digite a nova largura do texto (0 para desativar a formatao): "
+
+menutrans &File\ Format\.\.\. &Formato\ do\ arquivo\.\.\.
+let g:menutrans_fileformat_dialog = "Selecione o formato para gravar o arquivo"
+
+menutrans C&olor\ Scheme Esquema\ de\ c&ores
+menutrans default padro
+
+menutrans Select\ Fo&nt\.\.\. Selecionar\ fo&nte\.\.\.
+
+menutrans &Keymap &Mapa\ de\ teclado
+menutrans None Nenhum
+
+" Programming menu
+menutrans &Tools &Ferramentas
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Pular\ para\ este\ tag<Tab>g^]
+menutrans Jump\ &back<Tab>^T &Voltar<Tab>^T
+menutrans Build\ &Tags\ File &Construir\ Arquivo\ de\ tags
+menutrans &Spelling &Ortografia
+menutrans &Folding &Dobra
+menutrans &Make<Tab>:make &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Lista\ de\ erros<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Li&sta\ de\ mensagens<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn P&rximo\ erro<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Erro\ anterior<Tab>:cp
+menutrans &Older\ List<Tab>:cold Listar\ erros\ &antigos<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Listar\ erros\ &novos<Tab>:cnew
+menutrans Error\ &Window &Janela\ de\ erros
+menutrans Se&T\ Compiler Def&inir\ Compilador
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Converter\ para\ hexadecimal<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Conver&ter\ de\ volta<Tab>:%!xxd\ -r
+
+" Tools.Spelling menu
+menutrans &Spell\ Check\ On &Ativar\ Correo\ Ortogrfica
+menutrans &Spell\ Check\ Off &Desativar\ Correo\ Ortogrfica
+menutrans To\ &Next\ error<Tab>]s &Prximo\ Erro<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s Erro\ A&nterior<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= &Sugerir\ Correes<Tab>z=
+menutrans &Repeat\ correction<Tab>:spellrepall &Repetir\ Correo<Tab>:spellrepall
+
+menutrans Set\ language\ to\ "en" Ingls
+menutrans Set\ language\ to\ "en_au" Ingls\ (en_au)
+menutrans Set\ language\ to\ "en_ca" Ingls\ (en_ca)
+menutrans Set\ language\ to\ "en_gb" Ingls\ (en_gb)
+menutrans Set\ language\ to\ "en_nz" Ingls\ (en_nz)
+menutrans Set\ language\ to\ "en_us" Ingls\ (en_us)
+
+menutrans &Find\ More\ Languages &Buscar\ mais\ idiomas
+
+" Tools.Fold Menu
+menutrans &Enable/Disable\ folds<Tab>zi &Ativar/Desativar\ dobras<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Ver\ linha\ do\ cursor<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Ve&r\ somente\ linha\ do\ cursor<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm &Fechar\ mais\ dobras<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM F&echar\ todas\ as\ dobras<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr A&brir\ mais\ dobras<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR Abr&ir\ todas\ as\ dobras<Tab>zR
+" fold method
+menutrans Fold\ Met&hod &Modo\ de\ dobras
+menutrans Create\ &Fold<Tab>zf Criar\ &dobras<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Remover\ d&obras<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Remover\ &todas\ as\ dobras<Tab>zD
+" moving around in folds
+menutrans Fold\ col&umn\ width &Largura\ da\ coluna\ da\ dobra
+
+" Tools.Diff Menu
+menutrans &Update &Atualizar
+menutrans &Get\ Block &Obter\ Bloco
+menutrans &Put\ Block &Pr\ Bloco
+
+" Tools.Error Menu
+menutrans &Update<Tab>:cwin &Atualizar<Tab>:cwin
+menutrans &Open<Tab>:copen A&brir<Tab>:copen
+menutrans &Close<Tab>:cclose &Fechar<Tab>:cclose
+
+" Names for buffer menu.
+menutrans &Buffers &Buffers
+menutrans &Refresh\ menu A&tualizar\ menu
+menutrans &Delete &Apagar
+menutrans &Alternate A&lternar
+menutrans &Next P&rximo
+menutrans &Previous A&nterior
+let g:menutrans_no_file = "[Sem arquivos]"
+
+" Window menu
+menutrans &Window &Janela
+menutrans &New<Tab>^Wn N&ova<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Dividir<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ D&ividir\ para\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Dividir\ &verticalmente<Tab>^Wv
+menutrans Split\ File\ E&xplorer &Abrir\ Gerenciador\ de\ arquivos
+menutrans &Close<Tab>^Wc &Fechar<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Fechar\ &outra(s)<Tab>^Wo
+menutrans Move\ &To Mover\ &para
+menutrans &Top<Tab>^WK A&cima<Tab>^WK
+menutrans &Bottom<Tab>^WJ A&baixo<Tab>^WJ
+menutrans &Left\ side<Tab>^WH Lado\ &esquerdo<Tab>^WH
+menutrans &Right\ side<Tab>^WL Lado\ di&reito<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR &Girar\ para\ cima<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Girar\ para\ bai&xo<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= Mesmo\ &Tamanho<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Altura\ &Mxima<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ A&ltura\ Mnima<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Larg&ura\ Mxima<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Largura\ M&nima<Tab>^W1\|
+
+" The popup menu
+menutrans &Undo &Desfazer
+menutrans Cu&t Recor&tar
+menutrans &Copy &Copiar
+menutrans &Paste Co&lar
+menutrans &Delete &Apagar
+menutrans Select\ Blockwise Seleo\ de\ bloco
+menutrans Select\ &Word Selecionar\ &Palavra
+menutrans Select\ &Line Selecionar\ L&inha
+menutrans Select\ &All Selecionar\ T&udo
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Abrir Arquivo
+ tmenu ToolBar.Save Salvar Arquivo
+ tmenu ToolBar.SaveAll Salvar Todos os arquivos
+ tmenu ToolBar.Print Imprimir
+ tmenu ToolBar.Undo Desfazer
+ tmenu ToolBar.Redo Refazer
+ tmenu ToolBar.Cut Recortar
+ tmenu ToolBar.Copy Copiar
+ tmenu ToolBar.Paste Colar
+ tmenu ToolBar.Find Procurar...
+ tmenu ToolBar.FindNext Procurar Prximo
+ tmenu ToolBar.FindPrev Procurar Anterior
+ tmenu ToolBar.Replace Procurar e Substituir
+ if 0 " disable; these are in the Windoze menu
+ tmenu ToolBar.New Nova Janela
+ tmenu ToolBar.WinSplit Dividir Janela
+ tmenu ToolBar.WinMax Janela Mxima
+ tmenu ToolBar.WinMin Janela Mnima
+ tmenu ToolBar.WinVSplit Dividir Verticalmente
+ tmenu ToolBar.WinMaxWidth Largura Mxima
+ tmenu ToolBar.WinMinWidth Largura Mnima
+ tmenu ToolBar.WinClose Fechar Janela
+ endif
+ tmenu ToolBar.LoadSesn Carregar Sesso
+ tmenu ToolBar.SaveSesn Salvar Sesso
+ tmenu ToolBar.RunScript Executar script
+ tmenu ToolBar.Make Make
+ tmenu ToolBar.Shell Abrir um shell
+ tmenu ToolBar.RunCtags Gerar um arquivo de tags
+ tmenu ToolBar.TagJump Saltar para um tag
+ tmenu ToolBar.Help Ajuda
+ tmenu ToolBar.FindHelp Procurar na Ajuda
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Sintaxe
+"menutrans &Show\ individual\ choices E&xibir\ escolhas\ individuais
+menutrans &Show\ filetypes\ in\ menu E&xibir\ tipos\ de\ arquivos\ no\ menu
+menutrans Set\ '&syntax'\ only Ativar\ somente\ s&intaxe
+menutrans Set\ '&filetype'\ too Ativar\ tambm\ &tipo\ de\ arquivo
+menutrans &Off &Desativar
+menutrans &Manual &Manual
+menutrans A&utomatic A&utomtica
+menutrans on/off\ for\ &This\ file Ativar/Desativar\ neste\ &arquivo
+menutrans Co&lor\ test T&este\ de\ cores
+menutrans &Highlight\ test Teste\ de\ &realce
+menutrans &Convert\ to\ HTML &Converter\ para\ HTML
+
+" Find Help dialog text
+let g:menutrans_help_dialog = "Digite um comando ou palavra para obter ajuda;\n\nAnteponha i_ para comandos de entrada (ex.: i_CTRL-X)\nAnteponha c_ para comandos da linha de comandos (ex.: c_<Del>)\nAnteponha ` para um nome de opo (ex.: `shiftwidth`)"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_pt_pt.latin1.vim b/runtime/lang/menu_pt_pt.latin1.vim
new file mode 100644
index 0000000..7fc73d1
--- /dev/null
+++ b/runtime/lang/menu_pt_pt.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Portugus
+
+source <sfile>:p:h/menu_pt_pt.vim
diff --git a/runtime/lang/menu_pt_pt.utf-8.vim b/runtime/lang/menu_pt_pt.utf-8.vim
new file mode 100644
index 0000000..7fc73d1
--- /dev/null
+++ b/runtime/lang/menu_pt_pt.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Portugus
+
+source <sfile>:p:h/menu_pt_pt.vim
diff --git a/runtime/lang/menu_pt_pt.vim b/runtime/lang/menu_pt_pt.vim
new file mode 100644
index 0000000..423d918
--- /dev/null
+++ b/runtime/lang/menu_pt_pt.vim
@@ -0,0 +1,270 @@
+" Menu Translations: Portugus
+" adaptado de pt_br.
+" Maintainer: Duarte Henriques <duarte_henriques@myrealbox.com>
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Translations in latin1 (ISO-8859-1), and should work in
+" latin9 (ISO-8859-15)
+
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+" Help menu
+menutrans &Help A&juda
+menutrans &Overview<Tab><F1> &Contedo
+menutrans &User\ Manual &Manual\ do\ Utilizador
+menutrans &How-to\ links &Como\ fazer?
+menutrans &Find\.\.\. &Procurar\.\.\.
+menutrans &Credits &Crditos
+menutrans O&rphans &rfos
+menutrans Co&pying &Licena
+menutrans &Version &Verso
+menutrans &About &Sobre
+
+" File menu
+menutrans &File &Ficheiro
+menutrans &Open\.\.\.<Tab>:e A&brir\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Abrir\ noutra\ &janela\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Novo<Tab>:enew
+menutrans &Close<Tab>:close &Fechar<Tab>:close
+menutrans &Save<Tab>:w &Guardar<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Gu&ardar\ como\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. &Exibir\ diferenas\ com\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Ex&ibir\ patcheado\ por\.\.\.
+menutrans &Print Im&primir
+menutrans Sa&ve-Exit<Tab>:wqa Gua&rdar\ e\ sair<Tab>:wqa
+menutrans E&xit<Tab>:qa Sai&r<Tab>:qa
+
+" Edit menu
+menutrans &Edit &Editar
+menutrans &Undo<Tab>u &Desfazer<Tab>u
+menutrans &Redo<Tab>^R &Refazer<Tab>u
+menutrans Rep&eat<Tab>\. Repe&tir<Tab>\.
+menutrans Cu&t<Tab>"+x &Cortar<Tab>"+x
+menutrans &Copy<Tab>"+y Cop&iar<Tab>"+y
+menutrans &Paste<Tab>"+gP C&olar<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Colocar\ &antes<Tab>[p
+menutrans Put\ &After<Tab>]p Colocar\ &depois<Tab>]p
+menutrans &Select\ all<Tab>ggVG &Seleccionar\ tudo<Tab>ggVG
+menutrans &Find\.\.\. &Procurar\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Procurar\ e\ substit&uir\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s Procurar\ e\ substit&uir<Tab>:%s
+menutrans Find\ and\ Rep&lace Procurar\ e\ substit&uir
+menutrans Find\ and\ Rep&lace<Tab>:s Procurar\ e\ substituir<Tab>:s
+menutrans Settings\ &Window Op&es
+
+" Edit/Global Settings
+menutrans &Global\ Settings Opes\ &Globais
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Activar/Desactivar\ &Realce\ de\ Padres<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Activar/Desactivar\ &Ignorar\ maisculas<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Activar/Desactivar\ &coincidncias<Tab>:set\ sm!
+
+menutrans &Context\ lines Linhas\ de\ C&ontexto
+
+menutrans &Virtual\ Edit Edio\ &Virtual
+menutrans Never Nunca
+menutrans Block\ Selection Seleo\ de\ Bloco
+menutrans Insert\ mode Modo\ de\ insero
+menutrans Block\ and\ Insert Bloco\ e\ insero
+menutrans Always Sempre
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Activar/Desactivar\ Modo\ de\ In&sero<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Activar/Desactivar\ Co&mpatibilidade\ com\ Vi<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Camin&ho\ de\ Busca\.\.\.
+menutrans Ta&g\ Files\.\.\. Arquivos\ de\ Tags\.\.\.
+
+" GUI options
+menutrans Toggle\ &Toolbar Ocultar/Exibir\ Barra\ de\ &Ferramentas
+menutrans Toggle\ &Bottom\ Scrollbar Ocultar/Exibir\ Barra\ de\ &Rolagem\ Inferior
+menutrans Toggle\ &Left\ Scrollbar Ocultar/Exibir\ Barra\ de\ R&olagem\ Esquerda
+menutrans Toggle\ &Right\ Scrollbar Ocultar/Exibir\ Barra\ de\ Ro&lagem\ Direita
+let g:menutrans_path_dialog = "Indique um caminho de procura para os arquivos.\nSepare os nomes dos diretrios com uma vrgula."
+let g:menutrans_tags_dialog = "Indique os nomes dos arquivos de tags.\nSepare os nomes com uma vrgula."
+
+" Edit/File Settings
+menutrans F&ile\ Settings Opes\ do\ &Arquivo
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Activar/Desactivar\ &numerao\ de\ linhas<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Activar/Desactivar\ modo\ &list<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Activar/Desactivar\ &quebra\ de\ linhas<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Activar/Desactivar\ quebra\ na\ &palavra<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Activar/Desactivar\ expanso\ de\ tabs<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Activar/Desactivar\ &auto-indentao<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Activar/Desactivar\ indentao\ estilo\ &C<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth Largura\ da\ &indentao
+
+menutrans Soft\ &Tabstop &Tabulao\ com\ espaos
+
+menutrans Te&xt\ Width\.\.\. Largura\ do\ te&xto\.\.\.
+let g:menutrans_textwidth_dialog = "Digite a nova largura do texto (0 para desativar a formatao): "
+
+menutrans &File\ Format\.\.\. &Formato\ do\ arquivo\.\.\.
+let g:menutrans_fileformat_dialog = "Selecione o formato para gravar o arquivo"
+
+menutrans C&olor\ Scheme Esquema\ de\ c&ores
+menutrans default padro
+
+menutrans Select\ Fo&nt\.\.\. Seleccionar\ fo&nte\.\.\.
+
+menutrans &Keymap Mapa\ de\ teclado
+menutrans None Nenhum
+
+" Programming menu
+menutrans &Tools Fe&rramentas
+menutrans &Jump\ to\ this\ tag<Tab>g^] Saltar\ para\ esta\ &tag<Tab>g^]
+menutrans Jump\ &back<Tab>^T &Voltar<Tab>^T
+menutrans Build\ &Tags\ File &Construir\ Arquivo\ de\ tags
+menutrans &Folding &Dobra
+menutrans &Make<Tab>:make &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Lista\ de\ erros<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Li&sta\ de\ mensagens<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn P&rximo\ erro<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Erro\ anterior<Tab>:cp
+menutrans &Older\ List<Tab>:cold Listar\ erros\ &antigos<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Listar\ erros\ &novos<Tab>:cnew
+menutrans Error\ &Window &Janela\ de\ erros
+menutrans &Set\ Compiler Def&inir\ Compilador
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Converter\ para\ hexadecimal<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Conver&ter\ de\ volta<Tab>:%!xxd\ -r
+
+" Tools.Fold Menu
+menutrans &Enable/Disable\ folds<Tab>zi &Activar/Desactivar\ dobras<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Ver\ linha\ do\ cursor<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Ve&r\ somente\ linha\ do\ cursor<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm &Fechar\ mais\ dobras<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM F&echar\ todas\ as\ dobras<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr A&brir\ mais\ dobras<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR Abr&ir\ todas\ as\ dobras<Tab>zR
+" fold method
+menutrans Fold\ Met&hod &Modo\ de\ dobras
+menutrans Create\ &Fold<Tab>zf Criar\ &dobras<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Remover\ d&obras<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Remover\ &todas\ as\ dobras<Tab>zD
+" moving around in folds
+menutrans Fold\ col&umn\ width &Largura\ da\ coluna\ da\ dobra
+
+" Tools.Diff Menu
+menutrans &Update &Actualizar
+menutrans &Get\ Block &Obter\ Bloco
+menutrans &Put\ Block &Pr\ Bloco
+
+" Tools.Error Menu
+menutrans &Update<Tab>:cwin &Actualizar<Tab>:cwin
+menutrans &Open<Tab>:copen A&brir<Tab>:copen
+menutrans &Close<Tab>:cclose &Fechar<Tab>:cclose
+
+" Names for buffer menu.
+menutrans &Buffers &Buffers
+menutrans &Refresh\ menu A&ctualizar\ menu
+menutrans &Delete &Apagar
+menutrans &Alternate A&lternar
+menutrans &Next P&rximo
+menutrans &Previous A&nterior
+let g:menutrans_no_file = "[Sem arquivos]"
+
+" Window menu
+menutrans &Window &Janela
+menutrans &New<Tab>^Wn N&ova<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Dividir<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ D&ividir\ para\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Dividir\ &verticalmente<Tab>^Wv
+menutrans Split\ File\ E&xplorer &Abrir\ Gerenciador\ de\ arquivos
+menutrans &Close<Tab>^Wc &Fechar<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Fechar\ &outra(s)<Tab>^Wo
+menutrans Move\ &To Mover\ &para
+menutrans &Top<Tab>^WK A&cima<Tab>^WK
+menutrans &Bottom<Tab>^WJ A&baixo<Tab>^WJ
+menutrans &Left\ side<Tab>^WH Lado\ &esquerdo<Tab>^WH
+menutrans &Right\ side<Tab>^WL Lado\ di&reito<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR &Girar\ para\ cima<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Girar\ para\ bai&xo<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= Mesmo\ &Tamanho<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Altura\ &Mxima<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ A&ltura\ Mnima<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Larg&ura\ Mxima<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Largura\ M&nima<Tab>^W1\|
+
+" The popup menu
+menutrans &Undo &Desfazer
+menutrans Cu&t Recor&tar
+menutrans &Copy &Copiar
+menutrans &Paste Co&lar
+menutrans &Delete &Apagar
+menutrans Select\ Blockwise Seleo\ de\ bloco
+menutrans Select\ &Word Seleccionar\ &Palavra
+menutrans Select\ &Line Seleccionar\ L&inha
+menutrans Select\ &All Seleccionar\ T&udo
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Abrir Arquivo
+ tmenu ToolBar.Save Salvar Arquivo
+ tmenu ToolBar.SaveAll Salvar Todos os arquivos
+ tmenu ToolBar.Print Imprimir
+ tmenu ToolBar.Undo Desfazer
+ tmenu ToolBar.Redo Refazer
+ tmenu ToolBar.Cut Recortar
+ tmenu ToolBar.Copy Copiar
+ tmenu ToolBar.Paste Colar
+ tmenu ToolBar.Find Procurar...
+ tmenu ToolBar.FindNext Procurar Prximo
+ tmenu ToolBar.FindPrev Procurar Anterior
+ tmenu ToolBar.Replace Procurar e Substituir
+ if 0 " disable; these are in the Windoze menu
+ tmenu ToolBar.New Nova Janela
+ tmenu ToolBar.WinSplit Dividir Janela
+ tmenu ToolBar.WinMax Janela Mxima
+ tmenu ToolBar.WinMin Janela Mnima
+ tmenu ToolBar.WinVSplit Dividir Verticalmente
+ tmenu ToolBar.WinMaxWidth Largura Mxima
+ tmenu ToolBar.WinMinWidth Largura Mnima
+ tmenu ToolBar.WinClose Fechar Janela
+ endif
+ tmenu ToolBar.LoadSesn Carregar Sesso
+ tmenu ToolBar.SaveSesn Salvar Sesso
+ tmenu ToolBar.RunScript Executar script
+ tmenu ToolBar.Make Make
+ tmenu ToolBar.Shell Abrir um shell
+ tmenu ToolBar.RunCtags Gerar um arquivo de tags
+ tmenu ToolBar.TagJump Saltar para um tag
+ tmenu ToolBar.Help Ajuda
+ tmenu ToolBar.FindHelp Procurar na Ajuda
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Sintaxe
+"menutrans &Show\ individual\ choices E&xibir\ escolhas\ individuais
+menutrans &Show\ filetypes\ in\ menu E&xibir\ tipos\ de\ arquivos\ no\ menu
+menutrans Set\ '&syntax'\ only Activar\ somente\ s&intaxe
+menutrans Set\ '&filetype'\ too Activar\ tambm\ &tipo\ de\ arquivo
+menutrans &Off &Desactivar
+menutrans &Manual &Manual
+menutrans A&utomatic A&utomtica
+menutrans on/off\ for\ &This\ file Activar/Desactivar\ neste\ &arquivo
+menutrans Co&lor\ test T&este\ de\ cores
+menutrans &Highlight\ test Teste\ de\ &realce
+menutrans &Convert\ to\ HTML &Converter\ para\ HTML
+
+" Find Help dialog text
+let g:menutrans_help_dialog = "Digite um comando ou palavra para obter ajuda;\n\nAnteponha i_ para comandos de entrada (ex.: i_CTRL-X)\nAnteponha c_ para comandos da linha de comandos (ex.: c_<Del>)\nAnteponha ` para um nome de opo (ex.: `shiftwidth`)"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_ru.utf-8.vim b/runtime/lang/menu_ru.utf-8.vim
new file mode 100644
index 0000000..b5e4b79
--- /dev/null
+++ b/runtime/lang/menu_ru.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Russian
+
+source <sfile>:p:h/menu_ru_ru.utf-8.vim
diff --git a/runtime/lang/menu_ru_ru.koi8-r.vim b/runtime/lang/menu_ru_ru.koi8-r.vim
new file mode 100644
index 0000000..10eb68a
--- /dev/null
+++ b/runtime/lang/menu_ru_ru.koi8-r.vim
@@ -0,0 +1,337 @@
+" Menu Translations: Russian
+" Maintainer: Sergey Alyoshin <alyoshin.s@gmail.com>
+" Previous Maintainer: Vassily Ragosin <vrr[at]users.sourceforge.net>
+" Last Change: 16 May 2018
+" Generated from menu_ru_ru.utf-8.vim, DO NOT EDIT
+" URL: cvs://cvs.sf.net:/cvsroot/ruvim/extras/menu/menu_ru_ru.vim
+"
+" $Id: menu_ru_ru.vim,v 1.1 2004/06/13 16:09:10 vimboss Exp $
+"
+" Adopted for RuVim project by Vassily Ragosin.
+" First translation: Tim Alexeevsky <realtim [at] mail.ru>,
+" based on ukrainian translation by Bohdan Vlasyuk <bohdan@vstu.edu.ua>
+"
+"
+" Quit when menu translations have already been done.
+"
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding koi8-r
+
+" Top
+menutrans &File &
+menutrans &Edit &
+menutrans &Tools &
+menutrans &Syntax &
+menutrans &Buffers &
+menutrans &Window &
+menutrans &Help &
+"
+"
+"
+" Help menu
+menutrans &Overview<Tab><F1> &<Tab><F1>
+menutrans &User\ Manual &\
+menutrans &How-To\ Links &\ \ \.\.\.
+menutrans &Find\.\.\. &
+"--------------------
+menutrans &Credits &
+menutrans Co&pying &
+menutrans &Sponsor/Register &/
+menutrans O&rphans &
+"--------------------
+menutrans &Version &\ \
+menutrans &About &
+"
+"
+" File menu
+menutrans &Open\.\.\.<Tab>:e &\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &\ \.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew \ &\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &<Tab>:enew
+menutrans &Close<Tab>:close &<Tab>:close
+"--------------------
+menutrans &Save<Tab>:w &<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav \ &\.\.\.<Tab>:sav
+"--------------------
+menutrans Split\ &Diff\ With\.\.\. &\ \.\.\.
+menutrans Split\ Patched\ &By\.\.\. \ \ \ &\.\.\.
+"--------------------
+menutrans &Print &
+menutrans Sa&ve-Exit<Tab>:wqa &\ \ <Tab>:wqa
+menutrans E&xit<Tab>:qa &<Tab>:qa
+"
+"
+" Edit menu
+menutrans &Undo<Tab>u &<Tab>u
+menutrans &Redo<Tab>^R &<Tab>^R
+menutrans Rep&eat<Tab>\. &<Tab>\.
+"--------------------
+menutrans Cu&t<Tab>"+x &<Tab>"+x
+menutrans &Copy<Tab>"+y &<Tab>"+y
+menutrans &Paste<Tab>"+gP &<Tab>"+gP
+menutrans Put\ &Before<Tab>[p \ &<Tab>[p
+menutrans Put\ &After<Tab>]p \ &<Tab>]p
+menutrans &Delete<Tab>x &<Tab>x
+menutrans &Select\ All<Tab>ggVG &\ ӣ<Tab>ggVG
+"--------------------
+" Athena GUI only
+menutrans &Find<Tab>/ &<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s \ \ &<Tab>:%s
+" End Athena GUI only
+menutrans &Find\.\.\.<Tab>/ &\.\.\.<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. \ \ &\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:%s \ \ &\.\.\.<Tab>:%s
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:s \ \ &\.\.\.<Tab>:s
+"--------------------
+menutrans Settings\ &Window \ \ &
+menutrans Startup\ &Settings \ &
+menutrans &Global\ Settings &\
+menutrans F&ile\ Settings \ &
+menutrans C&olor\ Scheme &\
+menutrans &Keymap \ &
+menutrans Select\ Fo&nt\.\.\. \ &\.\.\.
+">>>----------------- Edit/Global settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! \ &\ <Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! &\ <Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! \ \ &<Tab>:set\ sm!
+menutrans &Context\ Lines &\ \
+menutrans &Virtual\ Edit &\
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! \ &<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! &\ \ Vi<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. &\ \ \ \.\.\.
+menutrans Ta&g\ Files\.\.\. \ &\.\.\.
+"
+menutrans Toggle\ &Toolbar &\
+menutrans Toggle\ &Bottom\ Scrollbar \ \ &
+menutrans Toggle\ &Left\ Scrollbar \ \ &
+menutrans Toggle\ &Right\ Scrollbar \ \ &
+">>>->>>------------- Edit/Global settings/Virtual edit
+menutrans Never
+menutrans Block\ Selection \ \
+menutrans Insert\ Mode \ \
+menutrans Block\ and\ Insert \ \ \ \ \ \
+menutrans Always \
+">>>----------------- Edit/File settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &\ <Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! &\ \ <Tab>:set\ nru!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! &\ \ <Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! &\ \ <Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! \ &\ <Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding-tab<Tab>:set\ et! &\ \ <Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! \ \ &<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! \ \ \ &\ C<Tab>:set\ cin!
+">>>---
+menutrans &Shiftwidth &\
+menutrans Soft\ &Tabstop \ &
+menutrans Te&xt\ Width\.\.\. &\ \.\.\.
+menutrans &File\ Format\.\.\. &\ \.\.\.
+"
+"
+"
+" Tools menu
+menutrans &Jump\ to\ This\ Tag<Tab>g^] &\ \ <Tab>g^]
+menutrans Jump\ &Back<Tab>^T &\ <Tab>^T
+menutrans Build\ &Tags\ File \ \ &
+"-------------------
+menutrans &Folding &
+menutrans &Spelling &
+menutrans &Diff &\ (diff)
+"-------------------
+menutrans &Make<Tab>:make &<Tab>:make
+menutrans &List\ Errors<Tab>:cl \ &<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! \ &<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &\ <Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &\ <Tab>:cp
+menutrans &Older\ List<Tab>:cold \ &\ \ <Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew \ &\ \ <Tab>:cnew
+menutrans Error\ &Window &\
+menutrans Se&t\ Compiler \ &
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu &\ \ &\ \
+"-------------------
+menutrans &Convert\ to\ HEX<Tab>:%!xxd &\ \ HEX<Tab>:%!xxd
+menutrans Conve&rt\ Back<Tab>:%!xxd\ -r \ &\ HEX<Tab>:%!xxd\ -r
+">>>---------------- Tools/Spelling
+menutrans &Spell\ Check\ On &\ \
+menutrans Spell\ Check\ &Off &\ \
+menutrans To\ &Next\ Error<Tab>]s &\ <Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s &\ <Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= \ &<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall &\ \ \ <Tab>spellrepall
+"-------------------
+menutrans Set\ Language\ to\ "en" \ \ "en"
+menutrans Set\ Language\ to\ "en_au" \ \ "en_au"
+menutrans Set\ Language\ to\ "en_ca" \ \ "en_ca"
+menutrans Set\ Language\ to\ "en_gb" \ \ "en_gb"
+menutrans Set\ Language\ to\ "en_nz" \ \ "en_nz"
+menutrans Set\ Language\ to\ "en_us" \ \ "en_us"
+menutrans &Find\ More\ Languages &\ \
+let g:menutrans_set_lang_to = ' '
+"
+"
+" The Spelling popup menu
+"
+"
+let g:menutrans_spell_change_ARG_to = '\ "%s"\ '
+let g:menutrans_spell_add_ARG_to_word_list = '\ "%s"\ \ '
+let g:menutrans_spell_ignore_ARG = '\ "%s"'
+">>>---------------- Folds
+menutrans &Enable/Disable\ Folds<Tab>zi /\ &<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv \ \ \ &<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ Only<Tab>zMzx \ &\ \ \ <Tab>zMzx
+menutrans C&lose\ More\ Folds<Tab>zm \ &\ <Tab>zm
+menutrans &Close\ All\ Folds<Tab>zM \ &\ <Tab>zM
+menutrans &Open\ All\ Folds<Tab>zR &\ \ <Tab>zR
+menutrans O&pen\ More\ Folds<Tab>zr &\ \ <Tab>zr
+menutrans Fold\ Met&hod &\
+menutrans Create\ &Fold<Tab>zf &\ <Tab>zf
+menutrans &Delete\ Fold<Tab>zd &\ <Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD \ &\ <Tab>zD
+menutrans Fold\ col&umn\ Width &\ \
+">>>->>>----------- Tools/Folds/Fold Method
+menutrans M&anual &
+menutrans I&ndent &
+menutrans E&xpression &
+menutrans S&yntax &
+menutrans Ma&rker &
+">>>--------------- Tools/Diff
+menutrans &Update &
+menutrans &Get\ Block \ &\
+menutrans &Put\ Block \ &\
+">>>--------------- Tools/Diff/Error window
+menutrans &Update<Tab>:cwin &<Tab>:cwin
+menutrans &Close<Tab>:cclose &<Tab>:cclose
+menutrans &Open<Tab>:copen &<Tab>:copen
+"
+"
+" Syntax menu
+"
+menutrans &Show\ File\ Types\ in\ Menu \ \ \ \ &
+menutrans Set\ '&syntax'\ only &\ \ \ 'syntax'
+menutrans Set\ '&filetype'\ too \ &\ \ 'filetype'
+menutrans &Off &
+menutrans &Manual &
+menutrans A&utomatic &
+menutrans On/Off\ for\ &This\ File /\ \ &\
+menutrans Co&lor\ Test \ &
+menutrans &Highlight\ Test \ &
+menutrans &Convert\ to\ HTML &\ HTML\ \
+"
+"
+" Buffers menu
+"
+menutrans &Refresh\ menu &\
+menutrans Delete &
+menutrans &Alternate &
+menutrans &Next &
+menutrans &Previous &
+menutrans [No\ File] [\ ]
+"
+"
+" Window menu
+"
+menutrans &New<Tab>^Wn &\ <Tab>^Wn
+menutrans S&plit<Tab>^Ws &\ <Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ \ &\ \ \ \ <Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv \ \ &<Tab>^Wv
+menutrans Split\ File\ E&xplorer \ \ \ &\
+"
+menutrans &Close<Tab>^Wc &\ \ <Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo \ &\ <Tab>^Wo
+"
+menutrans Move\ &To &
+menutrans Rotate\ &Up<Tab>^WR \ &<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr \ &<Tab>^Wr
+"
+menutrans &Equal\ Size<Tab>^W= &\ <Tab>^W=
+menutrans &Max\ Height<Tab>^W_ \ &<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ \ &<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| \ &<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| &\ <Tab>^W1\|
+">>>----------------- Window/Move To
+menutrans &Top<Tab>^WK &<Tab>^WK
+menutrans &Bottom<Tab>^WJ &<Tab>^WJ
+menutrans &Left\ Side<Tab>^WH &<Tab>^WH
+menutrans &Right\ Side<Tab>^WL &<Tab>^WL
+"
+"
+" The popup menu
+"
+"
+menutrans &Undo &
+menutrans Cu&t &
+menutrans &Copy &
+menutrans &Paste &
+menutrans &Delete &
+menutrans Select\ Blockwise \
+menutrans Select\ &Word \ &
+menutrans Select\ &Sentence \ &
+menutrans Select\ Pa&ragraph \ &
+menutrans Select\ &Line \ &
+menutrans Select\ &Block \ &
+menutrans Select\ &All \ &ӣ
+"
+" The GUI toolbar
+"
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open
+ tmenu ToolBar.Save
+ tmenu ToolBar.SaveAll
+ tmenu ToolBar.Print
+ tmenu ToolBar.Undo
+ tmenu ToolBar.Redo
+ tmenu ToolBar.Cut
+ tmenu ToolBar.Copy
+ tmenu ToolBar.Paste
+ tmenu ToolBar.FindNext
+ tmenu ToolBar.FindPrev
+ tmenu ToolBar.Replace ...
+ tmenu ToolBar.LoadSesn
+ tmenu ToolBar.SaveSesn
+ tmenu ToolBar.RunScript Vim
+ tmenu ToolBar.Make
+ tmenu ToolBar.Shell
+ tmenu ToolBar.RunCtags
+ tmenu ToolBar.TagJump
+ tmenu ToolBar.Help
+ tmenu ToolBar.FindHelp
+ endfun
+endif
+"
+"
+" Dialog texts
+"
+" Find in help dialog
+"
+let g:menutrans_help_dialog = " :\n\n i_ (, i_CTRL-X)\n c_ (, _<Del>)\n ' (, 'shiftwidth')"
+"
+" Searh path dialog
+"
+let g:menutrans_path_dialog = " .\n ."
+"
+" Tag files dialog
+"
+let g:menutrans_tags_dialog = " ( ).\n"
+"
+" Text width dialog
+"
+let g:menutrans_textwidth_dialog = " .\n 0."
+"
+" File format dialog
+"
+let g:menutrans_fileformat_dialog = " ."
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&"
+"
+let menutrans_no_file = "[ ]"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_ru_ru.utf-8.vim b/runtime/lang/menu_ru_ru.utf-8.vim
new file mode 100644
index 0000000..45ef2be
--- /dev/null
+++ b/runtime/lang/menu_ru_ru.utf-8.vim
@@ -0,0 +1,337 @@
+" Menu Translations: Russian
+" Maintainer: Sergey Alyoshin <alyoshin.s@gmail.com>
+" Previous Maintainer: Vassily Ragosin <vrr[at]users.sourceforge.net>
+" Last Change: 16 May 2018
+" Original translations
+" URL: cvs://cvs.sf.net:/cvsroot/ruvim/extras/menu/menu_ru_ru.vim
+"
+" $Id: menu_ru_ru.vim,v 1.1 2004/06/13 16:09:10 vimboss Exp $
+"
+" Adopted for RuVim project by Vassily Ragosin.
+" First translation: Tim Alexeevsky <realtim [at] mail.ru>,
+" based on ukrainian translation by Bohdan Vlasyuk <bohdan@vstu.edu.ua>
+"
+"
+" Quit when menu translations have already been done.
+"
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Top
+menutrans &File &Файл
+menutrans &Edit П&равка
+menutrans &Tools &Инструменты
+menutrans &Syntax &Синтаксис
+menutrans &Buffers &Буферы
+menutrans &Window &Окно
+menutrans &Help С&правка
+"
+"
+"
+" Help menu
+menutrans &Overview<Tab><F1> &Обзор<Tab><F1>
+menutrans &User\ Manual Руково&дство\ пользователя
+menutrans &How-To\ Links &Как\ это\ сделать\.\.\.
+menutrans &Find\.\.\. &Поиск
+"--------------------
+menutrans &Credits &Благодарности
+menutrans Co&pying &Распространение
+menutrans &Sponsor/Register Помо&щь/Регистрация
+menutrans O&rphans &Сироты
+"--------------------
+menutrans &Version &Информация\ о\ программе
+menutrans &About &Заставка
+"
+"
+" File menu
+menutrans &Open\.\.\.<Tab>:e &Открыть\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp По&делить\ окно\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Открыть\ в&кладку\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Новый<Tab>:enew
+menutrans &Close<Tab>:close &Закрыть<Tab>:close
+"--------------------
+menutrans &Save<Tab>:w &Сохранить<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Сохранить\ &как\.\.\.<Tab>:sav
+"--------------------
+menutrans Split\ &Diff\ With\.\.\. Ср&авнить\ с\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Сравнить\ с\ применением\ зап&латки\.\.\.
+"--------------------
+menutrans &Print На&печатать
+menutrans Sa&ve-Exit<Tab>:wqa Вы&ход\ с\ сохранением<Tab>:wqa
+menutrans E&xit<Tab>:qa &Выход<Tab>:qa
+"
+"
+" Edit menu
+menutrans &Undo<Tab>u О&тменить<Tab>u
+menutrans &Redo<Tab>^R В&ернуть<Tab>^R
+menutrans Rep&eat<Tab>\. Повторит&ь<Tab>\.
+"--------------------
+menutrans Cu&t<Tab>"+x &Вырезать<Tab>"+x
+menutrans &Copy<Tab>"+y &Копировать<Tab>"+y
+menutrans &Paste<Tab>"+gP Вк&леить<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Вклеить\ пере&д<Tab>[p
+menutrans Put\ &After<Tab>]p Вклеить\ по&сле<Tab>]p
+menutrans &Delete<Tab>x &Удалить<Tab>x
+menutrans &Select\ All<Tab>ggVG В&ыделить\ всё<Tab>ggVG
+"--------------------
+" Athena GUI only
+menutrans &Find<Tab>/ &Поиск<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s Поиск\ и\ &замена<Tab>:%s
+" End Athena GUI only
+menutrans &Find\.\.\.<Tab>/ &Поиск\.\.\.<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. Поиск\ и\ &замена\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:%s Поиск\ и\ &замена\.\.\.<Tab>:%s
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:s Поиск\ и\ &замена\.\.\.<Tab>:s
+"--------------------
+menutrans Settings\ &Window Окно\ настройки\ &опций
+menutrans Startup\ &Settings Настройки\ запус&ка
+menutrans &Global\ Settings &Глобальные\ настройки
+menutrans F&ile\ Settings Настройки\ &файлов
+menutrans C&olor\ Scheme &Цветовая\ схема
+menutrans &Keymap Раскладка\ кл&авиатуры
+menutrans Select\ Fo&nt\.\.\. Выбор\ &шрифта\.\.\.
+">>>----------------- Edit/Global settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Подсветка\ &найденных\ соответствий<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! &Регистронезависимый\ поиск<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Показывать\ парные\ &элементы<Tab>:set\ sm!
+menutrans &Context\ Lines Стр&ок\ вокруг\ курсора
+menutrans &Virtual\ Edit Вир&туальное\ редактирование
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Режим\ &Вставки<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! &Совместимость\ с\ Vi<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. &Путь\ для\ поиска\ файлов\.\.\.
+menutrans Ta&g\ Files\.\.\. Файлы\ &меток\.\.\.
+"
+menutrans Toggle\ &Toolbar &Инструментальная\ панель
+menutrans Toggle\ &Bottom\ Scrollbar Полоса\ прокрутки\ вни&зу
+menutrans Toggle\ &Left\ Scrollbar Полоса\ прокрутки\ с&лева
+menutrans Toggle\ &Right\ Scrollbar Полоса\ прокрутки\ спр&ава
+">>>->>>------------- Edit/Global settings/Virtual edit
+menutrans Never Выключено
+menutrans Block\ Selection При\ выделении\ блока
+menutrans Insert\ Mode В\ режиме\ Вставки
+menutrans Block\ and\ Insert При\ выделении\ блока\ и\ в\ режиме\ Вставки
+menutrans Always Включено\ всегда
+">>>----------------- Edit/File settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Нумерация\ строк<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! Относите&льная\ нумерация\ строк<Tab>:set\ nru!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Отобра&жение\ невидимых\ символов<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! &Перенос\ длинных\ строк<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! Перенос\ &целых\ слов<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding-tab<Tab>:set\ et! Про&белы\ вместо\ табуляции<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! Автоматическое\ форматирование\ &отступов<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! Форматирование\ отступов\ в\ &стиле\ C<Tab>:set\ cin!
+">>>---
+menutrans &Shiftwidth Вели&чина\ отступа
+menutrans Soft\ &Tabstop Ширина\ &табуляции
+menutrans Te&xt\ Width\.\.\. &Ширина\ текста\.\.\.
+menutrans &File\ Format\.\.\. &Формат\ файла\.\.\.
+"
+"
+"
+" Tools menu
+menutrans &Jump\ to\ This\ Tag<Tab>g^] &Перейти\ к\ метке<Tab>g^]
+menutrans Jump\ &Back<Tab>^T &Вернуться\ назад<Tab>^T
+menutrans Build\ &Tags\ File Создать\ файл\ ме&ток
+"-------------------
+menutrans &Folding &Складки
+menutrans &Spelling Пр&авописание
+menutrans &Diff &Отличия\ (diff)
+"-------------------
+menutrans &Make<Tab>:make Ко&мпилировать<Tab>:make
+menutrans &List\ Errors<Tab>:cl Список\ о&шибок<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Список\ соо&бщений<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Следу&ющая\ ошибка<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp П&редыдущая\ ошибка<Tab>:cp
+menutrans &Older\ List<Tab>:cold Более\ стар&ый\ список\ ошибок<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Более\ све&жий\ список\ ошибок<Tab>:cnew
+menutrans Error\ &Window Ок&но\ ошибок
+menutrans Se&t\ Compiler Выбор\ &компилятора
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu Пока&зать\ настройки\ компи&лятора\ в\ меню
+"-------------------
+menutrans &Convert\ to\ HEX<Tab>:%!xxd П&еревести\ в\ HEX<Tab>:%!xxd
+menutrans Conve&rt\ Back<Tab>:%!xxd\ -r Перевести\ и&з\ HEX<Tab>:%!xxd\ -r
+">>>---------------- Tools/Spelling
+menutrans &Spell\ Check\ On &Вкл\ проверку\ правописания
+menutrans Spell\ Check\ &Off Вы&кл\ проверку\ правописания
+menutrans To\ &Next\ Error<Tab>]s &Следующая\ ошибка<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s &Предыдущая\ ошибка<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Предложить\ исп&равления<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall Пов&торить\ исправление\ для\ всех<Tab>spellrepall
+"-------------------
+menutrans Set\ Language\ to\ "en" Установить\ язык\ "en"
+menutrans Set\ Language\ to\ "en_au" Установить\ язык\ "en_au"
+menutrans Set\ Language\ to\ "en_ca" Установить\ язык\ "en_ca"
+menutrans Set\ Language\ to\ "en_gb" Установить\ язык\ "en_gb"
+menutrans Set\ Language\ to\ "en_nz" Установить\ язык\ "en_nz"
+menutrans Set\ Language\ to\ "en_us" Установить\ язык\ "en_us"
+menutrans &Find\ More\ Languages &Найти\ больше\ языков
+let g:menutrans_set_lang_to = 'Установить язык'
+"
+"
+" The Spelling popup menu
+"
+"
+let g:menutrans_spell_change_ARG_to = 'Исправить\ "%s"\ на'
+let g:menutrans_spell_add_ARG_to_word_list = 'Добавить\ "%s"\ в\ словарь'
+let g:menutrans_spell_ignore_ARG = 'Пропустить\ "%s"'
+">>>---------------- Folds
+menutrans &Enable/Disable\ Folds<Tab>zi Вкл/выкл\ &складки<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv Открыть\ строку\ с\ &курсором<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ Only<Tab>zMzx Открыть\ &только\ строку\ с\ курсором<Tab>zMzx
+menutrans C&lose\ More\ Folds<Tab>zm Закрыть\ &больше\ складок<Tab>zm
+menutrans &Close\ All\ Folds<Tab>zM Закрыть\ &все\ складки<Tab>zM
+menutrans &Open\ All\ Folds<Tab>zR Откр&ыть\ все\ складки<Tab>zR
+menutrans O&pen\ More\ Folds<Tab>zr Отк&рыть\ больше\ складок<Tab>zr
+menutrans Fold\ Met&hod &Метод\ складок
+menutrans Create\ &Fold<Tab>zf Со&здать\ складку<Tab>zf
+menutrans &Delete\ Fold<Tab>zd У&далить\ складку<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Удалить\ вс&е\ складки<Tab>zD
+menutrans Fold\ col&umn\ Width &Ширина\ колонки\ складок
+">>>->>>----------- Tools/Folds/Fold Method
+menutrans M&anual Вру&чную
+menutrans I&ndent О&тступ
+menutrans E&xpression &Выражение
+menutrans S&yntax &Синтаксис
+menutrans Ma&rker &Маркеры
+">>>--------------- Tools/Diff
+menutrans &Update О&бновить
+menutrans &Get\ Block Изменить\ &этот\ буфер
+menutrans &Put\ Block Изменить\ &другой\ буфер
+">>>--------------- Tools/Diff/Error window
+menutrans &Update<Tab>:cwin О&бновить<Tab>:cwin
+menutrans &Close<Tab>:cclose &Закрыть<Tab>:cclose
+menutrans &Open<Tab>:copen &Открыть<Tab>:copen
+"
+"
+" Syntax menu
+"
+menutrans &Show\ File\ Types\ in\ Menu Показать\ меню\ выбора\ типа\ &файла
+menutrans Set\ '&syntax'\ only &Изменять\ только\ значение\ 'syntax'
+menutrans Set\ '&filetype'\ too Изменять\ &также\ значение\ 'filetype'
+menutrans &Off &Отключить
+menutrans &Manual Вру&чную
+menutrans A&utomatic &Автоматически
+menutrans On/Off\ for\ &This\ File Вкл/выкл\ для\ &этого\ файла
+menutrans Co&lor\ Test Проверка\ &цветов
+menutrans &Highlight\ Test Проверка\ под&светки
+menutrans &Convert\ to\ HTML С&делать\ HTML\ с\ подсветкой
+"
+"
+" Buffers menu
+"
+menutrans &Refresh\ menu О&бновить\ меню
+menutrans Delete У&далить
+menutrans &Alternate &Соседний
+menutrans &Next С&ледующий
+menutrans &Previous &Предыдущий
+menutrans [No\ File] [Нет\ файла]
+"
+"
+" Window menu
+"
+menutrans &New<Tab>^Wn &Новое\ окно<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Разделить\ окно<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Открыть\ &соседний\ файл\ в\ новом\ окне<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Разделить\ по\ &вертикали<Tab>^Wv
+menutrans Split\ File\ E&xplorer Открыть\ проводник\ по\ &файловой\ системе
+"
+menutrans &Close<Tab>^Wc &Закрыть\ это\ окно<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Закрыть\ &остальные\ окна<Tab>^Wo
+"
+menutrans Move\ &To &Переместить
+menutrans Rotate\ &Up<Tab>^WR Сдвинуть\ ввер&х<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Сдвинуть\ в&низ<Tab>^Wr
+"
+menutrans &Equal\ Size<Tab>^W= О&динаковый\ размер<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Максимальная\ в&ысота<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Минимальная\ высо&та<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Максимальная\ &ширина<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Минимал&ьная\ ширина<Tab>^W1\|
+">>>----------------- Window/Move To
+menutrans &Top<Tab>^WK В&верх<Tab>^WK
+menutrans &Bottom<Tab>^WJ В&низ<Tab>^WJ
+menutrans &Left\ Side<Tab>^WH В&лево<Tab>^WH
+menutrans &Right\ Side<Tab>^WL В&право<Tab>^WL
+"
+"
+" The popup menu
+"
+"
+menutrans &Undo О&тменить
+menutrans Cu&t &Вырезать
+menutrans &Copy &Копировать
+menutrans &Paste Вк&леить
+menutrans &Delete &Удалить
+menutrans Select\ Blockwise Блоковое\ выделение
+menutrans Select\ &Word Выделить\ &слово
+menutrans Select\ &Sentence Выделить\ &предложение
+menutrans Select\ Pa&ragraph Выделить\ пара&граф
+menutrans Select\ &Line Выделить\ ст&року
+menutrans Select\ &Block Выделить\ &блок
+menutrans Select\ &All Выделить\ &всё
+"
+" The GUI toolbar
+"
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Открыть файл
+ tmenu ToolBar.Save Сохранить файл
+ tmenu ToolBar.SaveAll Сохранить все файлы
+ tmenu ToolBar.Print Напечатать
+ tmenu ToolBar.Undo Отменить
+ tmenu ToolBar.Redo Вернуть
+ tmenu ToolBar.Cut Вырезать
+ tmenu ToolBar.Copy Копировать
+ tmenu ToolBar.Paste Вклеить
+ tmenu ToolBar.FindNext Найти следующее
+ tmenu ToolBar.FindPrev Найти предыдущее
+ tmenu ToolBar.Replace Найти или заменить...
+ tmenu ToolBar.LoadSesn Загрузить сеанс редактирования
+ tmenu ToolBar.SaveSesn Сохранить сеанс редактирования
+ tmenu ToolBar.RunScript Выполнить сценарий Vim
+ tmenu ToolBar.Make Компиляция
+ tmenu ToolBar.Shell Оболочка
+ tmenu ToolBar.RunCtags Создать файл меток
+ tmenu ToolBar.TagJump Перейти к метке
+ tmenu ToolBar.Help Справка
+ tmenu ToolBar.FindHelp Найти справку
+ endfun
+endif
+"
+"
+" Dialog texts
+"
+" Find in help dialog
+"
+let g:menutrans_help_dialog = "Введите команду или слово для поиска:\n\nДобавьте i_ для поиска команд режима Вставки (например, i_CTRL-X)\nДобавьте c_ для поиска команд Обычного режима (например, с_<Del>)\nДобавьте ' для поиска справки по опции (например, 'shiftwidth')"
+"
+" Searh path dialog
+"
+let g:menutrans_path_dialog = "Укажите путь для поиска файлов.\nИмена каталогов разделяются запятыми."
+"
+" Tag files dialog
+"
+let g:menutrans_tags_dialog = "Введите имена файлов меток (через запятую).\n"
+"
+" Text width dialog
+"
+let g:menutrans_textwidth_dialog = "Введите ширину текста для форматирования.\nДля отмены форматирования введите 0."
+"
+" File format dialog
+"
+let g:menutrans_fileformat_dialog = "Выберите формат файла."
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\nО&тмена"
+"
+let menutrans_no_file = "[Нет файла]"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_ru_ru.vim b/runtime/lang/menu_ru_ru.vim
new file mode 100644
index 0000000..b5e4b79
--- /dev/null
+++ b/runtime/lang/menu_ru_ru.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Russian
+
+source <sfile>:p:h/menu_ru_ru.utf-8.vim
diff --git a/runtime/lang/menu_sk.cp1250.vim b/runtime/lang/menu_sk.cp1250.vim
new file mode 100644
index 0000000..51b49b8
--- /dev/null
+++ b/runtime/lang/menu_sk.cp1250.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Slovak
+
+source <sfile>:p:h/menu_slovak_slovak_republic.1250.vim
diff --git a/runtime/lang/menu_sk_sk.1250.vim b/runtime/lang/menu_sk_sk.1250.vim
new file mode 100644
index 0000000..5fe378d
--- /dev/null
+++ b/runtime/lang/menu_sk_sk.1250.vim
@@ -0,0 +1,6 @@
+" Menu Translations: Slovak
+" Translated By: Martin Lacko <lacko@host.sk>
+" Last Change: 2003 May 11
+" This is redirection to slovak menu-translations file
+
+source <sfile>:p:h/menu_slovak_slovak_republic.1250.vim
diff --git a/runtime/lang/menu_sk_sk.cp1250.vim b/runtime/lang/menu_sk_sk.cp1250.vim
new file mode 100644
index 0000000..51b49b8
--- /dev/null
+++ b/runtime/lang/menu_sk_sk.cp1250.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Slovak
+
+source <sfile>:p:h/menu_slovak_slovak_republic.1250.vim
diff --git a/runtime/lang/menu_sk_sk.iso_8859-2.vim b/runtime/lang/menu_sk_sk.iso_8859-2.vim
new file mode 100644
index 0000000..29e6fb9
--- /dev/null
+++ b/runtime/lang/menu_sk_sk.iso_8859-2.vim
@@ -0,0 +1,238 @@
+" Menu Translations: Slovak
+" Translated By: Martin Lacko <lacko@host.sk>
+" Last Change: 2020 Apr 23
+" Generated from menu_slovak_slovak_republic.1250.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding iso-8859-2
+
+" Help menu
+menutrans &Help &Pomocnk
+menutrans &Overview<Tab><F1> &Prehad<Tab><F1>
+menutrans &User\ Manual Po&uvatesk\ manul
+menutrans &How-to\ links &Tipy
+menutrans &Find\.\.\. &Njs\.\.\.
+menutrans &Credits Po&akovanie
+menutrans O&rphans Si&roty
+menutrans Co&pying &Licencia
+menutrans &Version &Verzia
+menutrans &About &O\ programe
+
+" File menu
+menutrans &File &Sbor
+menutrans &Open\.\.\.<Tab>:e &Otvori\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Ot&vori\ v\ novom\ okne\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Nov<Tab>:enew
+menutrans &Close<Tab>:close &Zatvori<Tab>:close
+menutrans &Save<Tab>:w &Uloi<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Uloi\ &ako\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Otvor&i\ porovnanie\ v\ novom\ okne\ s\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Otvo&ri\ aktualizovan\ s\.\.\.
+menutrans &Print &Tla
+menutrans Sa&ve-Exit<Tab>:wqa U&loi-Koniec<Tab>:wqa
+menutrans E&xit<Tab>:qa &Koniec<Tab>:qa
+
+" Edit menu
+menutrans &Edit &pravy
+menutrans &Undo<Tab>u &Sp<Tab>u
+menutrans &Redo<Tab>^R Z&rui\ sp<Tab>^R
+menutrans Rep&eat<Tab>\. &Opakova<Tab>\.
+menutrans Cu&t<Tab>"+x &Vystrihn<Tab>"+x
+menutrans &Copy<Tab>"+y &Koprova<Tab>"+y
+menutrans &Paste<Tab>"+gP V&loi<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Vloi\ &pred<Tab>[p
+menutrans Put\ &After<Tab>]p Vloi\ za<Tab>]p
+menutrans &Select\ all<Tab>ggVG Vy&bra\ vetko<Tab>ggVG
+menutrans &Delete<Tab>x Vy&maza<Tab>x
+menutrans &Find\.\.\. &Njs\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. N&ahradi\.\.\.
+menutrans Settings\ &Window Mo&nosti
+menutrans &Global\ Settings &Globlne\ monosti
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Prepn\ paletu\ zvrazovania<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Prepn\ &ignorovanie\ vekosti<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Prepn\ &ukza\ zhodu<Tab>:set\ sm!
+menutrans &Context\ lines &Kontextov\ riadky
+menutrans &Virtual\ Edit &Virtulne\ pravy
+menutrans Never Nikdy
+menutrans Block\ Selection Blokov\ vber
+menutrans Insert\ mode Reim\ vkladania
+menutrans Block\ and\ Insert Blok\ a\ vkladanie
+menutrans Always Vdy
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Prepn\ rei&m\ vkladania<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Prepn\ vi\ kompatibilitu<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Cesta\ &hadania\.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&gov\ sbory\.\.\.
+menutrans Toggle\ &Toolbar Prepn\ &panel
+menutrans Toggle\ &Bottom\ Scrollbar Prepn\ spodn\ posuvnk
+menutrans Toggle\ &Left\ Scrollbar Prepn\ av\ posuvnk
+menutrans Toggle\ &Right\ Scrollbar Prepn\ prav\ posuvnk
+menutrans F&ile\ Settings Nastavenia\ sboru
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Prepn\ slova&nie\ riadkov<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Prepn\ reim\ &zoznamu<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Prepn\ z&alamovanie\ riadkov<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Prepn\ za&lamovanie\ slov<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Prepn\ rozr&en\ tabultory<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Prepn\ automatick\ &odsadzovanie<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Prepn\ &C-odsadzovanie<Tab>:set\ cin!
+menutrans &Shiftwidth &rka\ iftu
+menutrans Soft\ &Tabstop &Softvrov\ tabultor
+menutrans Te&xt\ Width\.\.\. rka\ te&xtu\.\.\.
+menutrans &File\ Format\.\.\. &Formt\ sboru\.\.\.
+menutrans C&olor\ Scheme Far&ebn\ schma
+
+" Programming menu
+menutrans &Tools &Nstroje
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skoi\ na\ znaku<Tab>g^]
+menutrans Jump\ &back<Tab>^T Sk&oi\ sp<Tab>^T
+menutrans Build\ &Tags\ File &Vytvori\ sbor\ znaiek
+menutrans &Folding &Vnranie
+menutrans &Enable/Disable\ folds<Tab>zi Zapn/Vypn\ vnrani&e<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv Zobrazi\ kurzoro&v\ riadok<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Zobrazi\ iba\ kurzorov\ riadok<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Zatvori\ viac\ vnoren<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Zatvor&i\ vetky\ vnorenia<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr O&tvori\ viac\ vnoren<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR &Otvori\ vetky\ vnorenia<Tab>zR
+menutrans Fold\ Met&hod Met&da\ vnrania
+menutrans M&anual M&anulne
+menutrans I&ndent Odsade&nie
+menutrans E&xpression &Vraz
+menutrans S&yntax S&yntax
+menutrans &Diff Roz&diel
+menutrans Ma&rker Zna&kova
+menutrans Create\ &Fold<Tab>zf Vyt&vori\ vnorenie<Tab>zf
+menutrans &Delete\ Fold<Tab>zd V&ymaza\ vnorenie<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Vymaza\ vetky\ vnorenia<Tab>zD
+menutrans Fold\ column\ &width rka\ &vkladanho\ stpca
+menutrans &Diff &Rozdiely
+menutrans &Update Akt&ualizova
+menutrans &Get\ Block Zob&ra\ blok
+menutrans &Put\ Block &Vloi\ blok
+menutrans Error\ &Window Chybov\ &okno
+menutrans &Update<Tab>:cwin Akt&ualizova<Tab>:cwin
+menutrans &Open<Tab>:copen &Otvori<Tab>:copen
+menutrans &Close<Tab>:cclose &Zatvori<Tab>:cclose
+menutrans &Convert\ to\ HEX<Tab>:%!xxd &Konvertova\ do\ HEX<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Konve&rtova\ sp<Tab>:%!xxd\ -r
+menutrans &Make<Tab>:make &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl Vpis\ &chb<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Vp&is\ sprv<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn a&lia\ chyba<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Predchdzajca\ chyba<Tab>:cp
+menutrans &Older\ List<Tab>:cold Sta&r\ zoznam<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Nov\ &zoznam<Tab>:cnew
+menutrans Error\ &Window<Tab>:cwin Chybov\ o&kno<Tab>:cwin
+menutrans &Set\ Compiler Vyberte\ k&ompiltor
+menutrans Convert\ to\ HEX<Tab>:%!xxd Prvies\ do\ es&tnstkovho\ formtu<Tab>:%!xxd
+menutrans Convert\ back<Tab>:%!xxd\ -r Pr&evies\ sp<Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers &Vyrovnvacia\ pam
+menutrans &Refresh\ menu Obnovi
+menutrans &Delete Vymaza
+menutrans &Alternate Zmeni
+menutrans &Next &alia
+menutrans &Previous &Predchdzajca
+menutrans [No\ File] [iadny\ sbor]
+
+" Window menu
+menutrans &Window &Okn
+menutrans &New<Tab>^Wn &Nov<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Rozdeli<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Ro&zdeli\ na\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Rozdeli\ &vertiklne<Tab>^Wv
+menutrans Split\ File\ E&xplorer Otvori\ pri&eskumnka
+menutrans &Close<Tab>^Wc Zatvor&i<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zatvori\ i&n<Tab>^Wo
+menutrans Move\ &To Presun&
+menutrans &Top<Tab>^WK Na&hor<Tab>^WK
+menutrans &Bottom<Tab>^WJ Nado&l<Tab>^WJ
+menutrans &Left\ side<Tab>^WH V&avo<Tab>^WJ
+menutrans &Right\ side<Tab>^WL Vprav&o<Tab>^WL
+menutrans Ne&xt<Tab>^Ww &alie<Tab>^Ww
+menutrans P&revious<Tab>^WW &Predchdzajce<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= Rovnak\ v&ka<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ &Maximlna\ vka<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Minimlna\ v&ka<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Maximlna\ rka<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimlna\ irka<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR Rotova&\ nahor<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotova\ na&dol<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. Vy&bra\ psmo\.\.\.
+
+" The popup menu
+menutrans &Undo &Sp
+menutrans Cu&t &Vystrihn
+menutrans &Copy &Koprova
+menutrans &Paste V&loi
+menutrans &Delete V&ymaza
+menutrans Select\ Blockwise Vybra\ blokovo
+menutrans Select\ &Word Vybra\ sl&ovo
+menutrans Select\ &Line Vybra\ &riadok
+menutrans Select\ &Block Vybra\ &blok
+menutrans Select\ &All Vybra\ v&etko
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Otvori sbor
+ tmenu ToolBar.Save Uloi sbor
+ tmenu ToolBar.SaveAll Uloi vetky
+ tmenu ToolBar.Print Tla
+ tmenu ToolBar.Undo Sp
+ tmenu ToolBar.Redo Opakova
+ tmenu ToolBar.Cut Vystrihn
+ tmenu ToolBar.Copy Koprova
+ tmenu ToolBar.Paste Vloi
+ tmenu ToolBar.Find Njs...
+ tmenu ToolBar.FindNext Njs alie
+ tmenu ToolBar.FindPrev Njs predchdzajce
+ tmenu ToolBar.Replace Nahradi...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nov okno
+ tmenu ToolBar.WinSplit Rozdeli okno
+ tmenu ToolBar.WinMax Maximalizova okno
+ tmenu ToolBar.WinMin Minimalizova okno
+ tmenu ToolBar.WinVSplit Rozdeli okno vertiklne
+ tmenu ToolBar.WinMaxWidth Maximalizova rku okna
+ tmenu ToolBar.WinMinWidth Minimalizova rku okna
+ tmenu ToolBar.WinClose Zatvori okno
+ endif
+ tmenu ToolBar.LoadSesn Nata sedenie
+ tmenu ToolBar.SaveSesn Uloi sedenie
+ tmenu ToolBar.RunScript Spusti skript
+ tmenu ToolBar.Make Spusti make
+ tmenu ToolBar.Shell Spusti el
+ tmenu ToolBar.RunCtags Spusti ctags
+ tmenu ToolBar.TagJump Skoi na tag pod kurzorom
+ tmenu ToolBar.Help Pomocnk
+ tmenu ToolBar.FindHelp Njs pomocnka k...
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Syntax
+menutrans Set\ '&syntax'\ only Nastavi\ iba\ 'syntax'
+menutrans Set\ '&filetype'\ too Nastavi\ aj\ 'filetype'
+menutrans &Off &Vypn
+menutrans &Manual &Rune
+menutrans A&utomatic A&utomaticky
+" menutrans o&n\ (this\ file) &Zapn\ (pre\ tento\ sbor)
+" menutrans o&ff\ (this\ file) Vyp&n\ (pre\ tento\ sbor )
+menutrans on/off\ for\ &This\ file Zapn/vypn\ pre\ &tento\ sbor
+menutrans Co&lor\ test Test\ &farieb
+menutrans &Highlight\ test &Test\ zvrazovania
+menutrans &Convert\ to\ HTML &Previes\ do\ HTML
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_sk_sk.vim b/runtime/lang/menu_sk_sk.vim
new file mode 100644
index 0000000..d02a7cf
--- /dev/null
+++ b/runtime/lang/menu_sk_sk.vim
@@ -0,0 +1,9 @@
+" Menu Translations: Slovak
+" Translated By: Martin Lacko <lacko@host.sk>
+" Last Change: 2002 May 27
+
+if has("win32")
+ source <sfile>:p:h/menu_sk_sk.1250.vim
+else
+ source <sfile>:p:h/menu_sk_sk.iso_8859-2.vim
+endif
diff --git a/runtime/lang/menu_sl_si.cp1250.vim b/runtime/lang/menu_sl_si.cp1250.vim
new file mode 100644
index 0000000..16af3a7
--- /dev/null
+++ b/runtime/lang/menu_sl_si.cp1250.vim
@@ -0,0 +1,300 @@
+" Menu Translations: Slovenian / Slovensko
+" Maintainer: Mojca Miklavec <mojca.miklavec.lists@gmail.com>
+" Originally By: Mojca Miklavec <mojca.miklavec.lists@gmail.com>
+" Last Change: 2020 Apr 23
+" vim:set foldmethod=marker tabstop=8:
+" Generated from menu_sl_si.utf-8.vim, DO NOT EDIT
+
+" TODO: add/check all '&'s
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding cp1250
+
+" {{{ FILE / DATOTEKA
+menutrans &File &Datoteka
+menutrans &Open\.\.\.<Tab>:e &Odpri\ \.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Odpri\ de&ljeno\ \.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Odpri\ v\ zavi&hku\ \.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nova<Tab>:enew
+menutrans &Close<Tab>:close &Zapri<Tab>:close
+menutrans &Save<Tab>:w &Shrani<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Shrani\ &kot\ \.\.\.<Tab>:sav
+menutrans &Print Na&tisni
+menutrans Sa&ve-Exit<Tab>:wqa Shrani\ in\ &konaj<Tab>:wqa
+menutrans E&xit<Tab>:qa &Izhod<Tab>:qa
+
+if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. Primerjaj\ z\ (di&ff)\ \.\.\.
+ menutrans Split\ Patched\ &By\.\.\. &Popravi\ s\ (patch)\ \.\.\.
+endif
+" }}} FILE / DATOTEKA
+
+" {{{ EDIT / UREDI
+menutrans &Edit &Uredi
+menutrans &Undo<Tab>u &Razveljavi<Tab>u
+menutrans &Redo<Tab>^R &Obnovi<Tab>^R
+menutrans Rep&eat<Tab>\. Po&novi<Tab>\.
+menutrans Cu&t<Tab>"+x &Izrei<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopiraj<Tab>"+y
+menutrans &Paste<Tab>"+gP &Prilepi<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Vrini\ pred<Tab>[p
+menutrans Put\ &After<Tab>]p Vrini\ za<Tab>]p
+menutrans &Delete<Tab>x Iz&brii<Tab>x
+menutrans &Select\ all<Tab>ggVG Izberi\ vse<Tab>ggVG
+menutrans &Find\.\.\. Po&ii\ \.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Poii\ in\ &zamenjaj\ \.\.\.
+
+" [-- SETTINGS --]
+menutrans Settings\ &Window Nastavitve\ \.\.\.
+menutrans Startup\ &Settings Zaetne\ nastavitve
+menutrans &Global\ Settings &Globalne\ nastavitve
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Vkljui/izkljui\ poudarjanje\ iskanega\ niza<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Vkljui/izkljui\ loevanje\ velikih\ in\ malih\ rk<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Vkljui/izkljui\ kratek\ skok\ na\ pripadajoi\ oklepaj<Tab>:set\ sm!
+
+menutrans &Context\ lines t\.\ vidnih\ vrstic\ pred/za\ kurzorjem
+
+menutrans &Virtual\ Edit Dovoli\ poloaj\ kazalka,\ kjer\ ni\ besedila
+menutrans Never Nikoli
+menutrans Block\ Selection Le\ med\ izbiranjem\ bloka
+menutrans Insert\ mode Le\ v\ nainu\ za\ pisanje
+menutrans Block\ and\ Insert Pri\ obojem
+menutrans Always Vedno
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Vkljui/izkljui\ nain\ za\ pisanje<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Vkljui/izkljui\ zdruljivost\ z\ Vi-jem<Tab>:set\ cp!
+
+menutrans Search\ &Path\.\.\. Pot\ za\ iskanje\ \.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&g-datoteke\.\.\.
+
+menutrans Toggle\ &Toolbar Pokai/skrij\ Orodja
+menutrans Toggle\ &Bottom\ Scrollbar Pokai/skrij\ spodnji\ drsnik
+menutrans Toggle\ &Left\ Scrollbar Pokai/skrij\ levi\ drsnik
+menutrans Toggle\ &Right\ Scrollbar Pokai/skrij\ desni\ drsnik
+
+" Edit/File Settings
+menutrans F&ile\ Settings &Nastavitve\ datoteke
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Pokai/skrij\ tevilke\ vrstic<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Pokai/skrij\ nevidne\ znake<Tab>:set\ list! " space/tab
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Vkljui/izkljui\ prelome\ vrstic<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Vkljui/izkljui\ prelome\ vrstic\ med\ besedami<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Vkljui/izkljui\ zamenjavo\ tabulatorjev\ s\ presledki<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Vkljui/izkljui\ avtomatsko\ zamikanje\ vrstic<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Vkljui/izkljui\ C-jevski\ nain\ zamikanja\ vrstic<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth irina\ zamika\ vrstic
+menutrans Soft\ &Tabstop irina\ &tabulatorja
+menutrans Te&xt\ Width\.\.\. irina\ besedila\ \.\.\.
+menutrans &File\ Format\.\.\. Format\ &datoteke\ \.\.\.
+menutrans C&olor\ Scheme &Barvna\ shema\ \.\.\.
+menutrans &Keymap Razporeditev\ tip&k
+menutrans Select\ Fo&nt\.\.\. Pisava\ \.\.\.
+" }}} EDIT / UREDI
+
+" {{{ TOOLS / ORODJA
+menutrans &Tools O&rodja
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skoi\ k\ tej\ znaki<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skoi\ Na&zaj<Tab>^T
+menutrans Build\ &Tags\ File Napravi\ datoteke\ z\ znakami\ (tag)
+if has("spell")
+ menutrans &Spelling rkovalnik
+ menutrans &Spell\ Check\ On &Vkljui
+ menutrans Spell\ Check\ &Off &Izkljui
+ menutrans To\ &Next\ error<Tab>]s K\ &naslednji\ napaki<Tab>]s
+ menutrans To\ &Previous\ error<Tab>[s K\ &prejnji\ napaki<Tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= Predlagaj\ popravek<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall Po&novi\ popravke\ na\ vseh\ besedah<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" rkovalnik:\ angleki\ "en"
+ menutrans Set\ language\ to\ "en_au" rkovalnik:\ angleki\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" rkovalnik:\ angleki\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" rkovalnik:\ angleki\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" rkovalnik:\ angleki\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" rkovalnik:\ angleki\ "en_us"
+ menutrans Set\ language\ to\ "sl" rkovalnik:\ slovenski\ "sl"
+ menutrans Set\ language\ to\ "de" rkovalnik:\ nemki\ "de"
+ menutrans Set\ language\ to\ rkovalnik:\
+ menutrans &Find\ More\ Languages &Ostali\ jeziki
+endif
+if has("folding")
+ menutrans &Folding Zavihek
+ " open close folds
+ menutrans &Enable/Disable\ folds<Tab>zi Omogoi/onemogoi\ zavihke<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Pokai\ vrstico\ s\ kazalcem<Tab>zv " kjer je kazalec
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Pokai\ samo\ vrstico\ s\ kazalcem<Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm Zapri\ ve\ zavihkov<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Zapri\ vse\ zavihke<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Odpri\ ve\ zavihkov<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR Odpri\ vse\ zavihke<Tab>zR
+ " fold method
+ menutrans Fold\ Met&hod Ustvarjanje\ zavihkov
+ menutrans M&anual &Rono
+ menutrans I&ndent Glede\ na\ &poravnavo
+ menutrans E&xpression Z\ &izrazi\ (foldexpr)
+ menutrans S&yntax Glede\ na\ &sintakso
+ menutrans &Diff Razlike\ (&diff)
+ menutrans Ma&rker Z\ &markerji/oznabami
+ " create and delete folds
+ " TODO accelerators
+ menutrans Create\ &Fold<Tab>zf Ustvari\ zavihek<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd Izbrii\ zavihek<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Izbrii\ vse\ zavihke<Tab>zD
+ " moving around in folds
+ menutrans Fold\ column\ &width irina\ stolpca\ z\ zavihkom
+endif " has folding
+
+if has("diff")
+ menutrans &Diff Razlike\ (&Diff)
+ menutrans &Update &Posodobi<Tab>
+ menutrans &Get\ Block &Sprejmi\ (spremeni\ to\ okno) " TODO: check if translation is OK
+ menutrans &Put\ Block &Polji\ (spremeni\ drugo\ okno)
+endif
+
+menutrans &Make<Tab>:make Napravi\ (&make)<Tab>:make
+menutrans &List\ Errors<Tab>:cl Pokai\ napake<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Pokai\ sporoila<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn K\ &naslednji\ napaki<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp K\ &prejnji\ napaki<Tab>:cp
+menutrans &Older\ List<Tab>:cold K\ &starejemu\ seznamu\ napak<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew K\ &novejemu\ seznamu\ napak<Tab>:cnew
+
+menutrans Error\ &Window Okno\ z\ napakami
+menutrans &Update<Tab>:cwin &Posodobi<Tab>:cwin
+menutrans &Open<Tab>:copen &Odpri<Tab>:copen
+menutrans &Close<Tab>:cclose &Zapri<Tab>:cclose
+
+menutrans &Set\ Compiler Nastavi\ &prevajalnik
+menutrans Se&T\ Compiler Nastavi\ &prevajalnik " bug in original translation?
+
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Pretvori\ v\ HE&X<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Povrni\ pretvo&rbo<Tab>:%!xxd\ -r
+" }}} TOOLS / ORODJA
+
+" {{{ SYNTAX / BARVANJE KODE
+menutrans &Syntax &Barvanje\ kode
+menutrans &Show\ filetypes\ in\ menu Podprte\ vrste\ datotek
+menutrans Set\ '&syntax'\ only Samo\ barvanje\ ('&syntax')
+menutrans Set\ '&filetype'\ too Tudi\ obnaanje\ ('&filetype')
+menutrans &Off &Izkljueno
+menutrans &Manual &Rono
+menutrans A&utomatic &Avtomatsko
+menutrans on/off\ for\ &This\ file Vkljui/izkljui\ za\ to\ datoteko
+menutrans Co&lor\ test Preizkus\ barv
+menutrans &Highlight\ test Preizkus\ barvanja\ kode
+menutrans &Convert\ to\ HTML Pretvori\ v\ &HTML
+" }}} SYNTAX / BARVANJE KODE
+
+" {{{ BUFFERS / MEDPOMNILNIK
+menutrans &Buffers &Medpomnilnik " XXX: ni najbolje: okno bi bolj pristajalo, ampak okno je e
+menutrans &Refresh\ menu &Osvei
+menutrans Delete &Brii
+menutrans &Alternate &Menjaj
+menutrans &Next &Naslednji
+menutrans &Previous &Prejnji
+menutrans [No\ File] [Brez\ datoteke]
+" }}} BUFFERS / MEDPOMNILNIK
+
+" {{{ WINDOW / OKNO
+menutrans &Window &Okno
+menutrans &New<Tab>^Wn &Novo<Tab>^Wn
+menutrans S&plit<Tab>^Ws Razdeli<Tab>^Ws
+menutrans Split\ &Vertically<Tab>^Wv Razdeli\ navpino<Tab>^Ws
+menutrans Split\ File\ E&xplorer Razdeli:\ Vsebina\ mape
+menutrans Sp&lit\ To\ #<Tab>^W^^ Razdeli\ v\ #<Tab>^W^^
+menutrans &Close<Tab>^Wc &Zapri<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zapri\ &ostala<Tab>^Wo
+menutrans Move\ &To Premakni
+menutrans &Top<Tab>^WK &Gor<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Dol<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Levo<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Desno<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Zavrti\ navzgor<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Zavrti\ navzdol<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= &Enaka\ velikost<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Najvije<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Najnije<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Najire<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Najoje<Tab>^W1\|
+" }}} WINDOW / OKNO
+
+" {{{ HELP / POMO
+menutrans &Help &Pomo
+menutrans &Overview<Tab><F1> Hitri\ pregled<Tab><F1>
+menutrans &User\ Manual P&rironik
+menutrans &How-to\ links &How-to\ kazalo
+menutrans &Find\.\.\. Po&ii\ \.\.\. " conflicts with Edit.Find
+menutrans &Credits &Avtorji
+menutrans Co&pying &Licenca
+menutrans &Sponsor/Register Registracija\ in\ &donacije
+menutrans O&rphans &Sirotam
+menutrans &Version &Verzija
+menutrans &About &O\ programu
+" }}} HELP / POMO
+
+" {{{ POPUP
+menutrans &Undo &Razveljavi
+menutrans Cu&t &Izrei
+menutrans &Copy &Kopiraj
+menutrans &Paste &Prilepi
+menutrans &Delete &Zbrii
+menutrans Select\ Blockwise Izbiraj\ po\ blokih
+menutrans Select\ &Word Izberi\ &besedo
+menutrans Select\ &Sentence Izberi\ &stavek
+menutrans Select\ Pa&ragraph Izberi\ &odstavek
+menutrans Select\ &Line Izberi\ vrs&tico
+menutrans Select\ &Block Izberi\ b&lok
+menutrans Select\ &All Izberi\ &vse
+" }}} POPUP
+
+" {{{ TOOLBAR
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Odpri datoteko
+ tmenu ToolBar.Save Shrani datoteko
+ tmenu ToolBar.SaveAll Shrani vse datoteke
+ tmenu ToolBar.Print Natisni
+ tmenu ToolBar.Undo Razveljavi
+ tmenu ToolBar.Redo Obnovi
+ tmenu ToolBar.Cut Izrei
+ tmenu ToolBar.Copy Kopiraj
+ tmenu ToolBar.Paste Prilepi
+ tmenu ToolBar.Find Najdi ...
+ tmenu ToolBar.FindNext Najdi naslednje
+ tmenu ToolBar.FindPrev Najdi prejnje
+ tmenu ToolBar.Replace Najdi in zamenjaj ...
+ tmenu ToolBar.LoadSesn Naloi sejo
+ tmenu ToolBar.SaveSesn Shrani trenutno sejo
+ tmenu ToolBar.RunScript Izberi Vim skripto za izvajanje
+ tmenu ToolBar.Make Napravi trenutni projekt (:make)
+ tmenu ToolBar.RunCtags Napravi znake v trenutnem direktoriju (!ctags -R.)
+ tmenu ToolBar.TagJump Skoi k znaki pod kurzorjem
+ tmenu ToolBar.Help Pomo za Vim
+ tmenu ToolBar.FindHelp Ii v pomoi za Vim
+ endfun
+endif
+" }}} TOOLBAR
+
+" {{{ DIALOG TEXTS
+let g:menutrans_no_file = "[Brez datoteke]"
+let g:menutrans_help_dialog = "Vnesite ukaz ali besedo, za katero elite pomo:\n\nUporabite predpono i_ za ukaze v nainu za pisanje (npr.: i_CTRL-X)\nUporabite predpono c_ za ukaze v ukazni vrstici (command-line) (npr.: c_<Del>)\nUporabite predpono ' za imena opcij (npr.: 'shiftwidth')"
+let g:menutrans_path_dialog = "Vnesite poti za iskanje datotek.\nImena direktorijev loite z vejico."
+let g:menutrans_tags_dialog = "Vnesite imena datotek z znakami ('tag').\nImana loite z vejicami."
+let g:menutrans_textwidth_dialog = "Vnesite novo irino besedila (ali 0 za izklop formatiranja): "
+let g:menutrans_fileformat_dialog = "Izberite format datoteke"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Preklii"
+" }}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_sl_si.latin2.vim b/runtime/lang/menu_sl_si.latin2.vim
new file mode 100644
index 0000000..99f2aa1
--- /dev/null
+++ b/runtime/lang/menu_sl_si.latin2.vim
@@ -0,0 +1,300 @@
+" Menu Translations: Slovenian / Slovensko
+" Maintainer: Mojca Miklavec <mojca.miklavec.lists@gmail.com>
+" Originally By: Mojca Miklavec <mojca.miklavec.lists@gmail.com>
+" Last Change: 2020 Apr 23
+" vim:set foldmethod=marker tabstop=8:
+" Generated from menu_sl_si.utf-8.vim, DO NOT EDIT
+
+" TODO: add/check all '&'s
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding latin2
+
+" {{{ FILE / DATOTEKA
+menutrans &File &Datoteka
+menutrans &Open\.\.\.<Tab>:e &Odpri\ \.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Odpri\ de&ljeno\ \.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Odpri\ v\ zavi&hku\ \.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nova<Tab>:enew
+menutrans &Close<Tab>:close &Zapri<Tab>:close
+menutrans &Save<Tab>:w &Shrani<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Shrani\ &kot\ \.\.\.<Tab>:sav
+menutrans &Print Na&tisni
+menutrans Sa&ve-Exit<Tab>:wqa Shrani\ in\ &konaj<Tab>:wqa
+menutrans E&xit<Tab>:qa &Izhod<Tab>:qa
+
+if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. Primerjaj\ z\ (di&ff)\ \.\.\.
+ menutrans Split\ Patched\ &By\.\.\. &Popravi\ s\ (patch)\ \.\.\.
+endif
+" }}} FILE / DATOTEKA
+
+" {{{ EDIT / UREDI
+menutrans &Edit &Uredi
+menutrans &Undo<Tab>u &Razveljavi<Tab>u
+menutrans &Redo<Tab>^R &Obnovi<Tab>^R
+menutrans Rep&eat<Tab>\. Po&novi<Tab>\.
+menutrans Cu&t<Tab>"+x &Izrei<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopiraj<Tab>"+y
+menutrans &Paste<Tab>"+gP &Prilepi<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Vrini\ pred<Tab>[p
+menutrans Put\ &After<Tab>]p Vrini\ za<Tab>]p
+menutrans &Delete<Tab>x Iz&brii<Tab>x
+menutrans &Select\ all<Tab>ggVG Izberi\ vse<Tab>ggVG
+menutrans &Find\.\.\. Po&ii\ \.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Poii\ in\ &zamenjaj\ \.\.\.
+
+" [-- SETTINGS --]
+menutrans Settings\ &Window Nastavitve\ \.\.\.
+menutrans Startup\ &Settings Zaetne\ nastavitve
+menutrans &Global\ Settings &Globalne\ nastavitve
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Vkljui/izkljui\ poudarjanje\ iskanega\ niza<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Vkljui/izkljui\ loevanje\ velikih\ in\ malih\ rk<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Vkljui/izkljui\ kratek\ skok\ na\ pripadajoi\ oklepaj<Tab>:set\ sm!
+
+menutrans &Context\ lines t\.\ vidnih\ vrstic\ pred/za\ kurzorjem
+
+menutrans &Virtual\ Edit Dovoli\ poloaj\ kazalka,\ kjer\ ni\ besedila
+menutrans Never Nikoli
+menutrans Block\ Selection Le\ med\ izbiranjem\ bloka
+menutrans Insert\ mode Le\ v\ nainu\ za\ pisanje
+menutrans Block\ and\ Insert Pri\ obojem
+menutrans Always Vedno
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Vkljui/izkljui\ nain\ za\ pisanje<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Vkljui/izkljui\ zdruljivost\ z\ Vi-jem<Tab>:set\ cp!
+
+menutrans Search\ &Path\.\.\. Pot\ za\ iskanje\ \.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&g-datoteke\.\.\.
+
+menutrans Toggle\ &Toolbar Pokai/skrij\ Orodja
+menutrans Toggle\ &Bottom\ Scrollbar Pokai/skrij\ spodnji\ drsnik
+menutrans Toggle\ &Left\ Scrollbar Pokai/skrij\ levi\ drsnik
+menutrans Toggle\ &Right\ Scrollbar Pokai/skrij\ desni\ drsnik
+
+" Edit/File Settings
+menutrans F&ile\ Settings &Nastavitve\ datoteke
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Pokai/skrij\ tevilke\ vrstic<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Pokai/skrij\ nevidne\ znake<Tab>:set\ list! " space/tab
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Vkljui/izkljui\ prelome\ vrstic<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Vkljui/izkljui\ prelome\ vrstic\ med\ besedami<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Vkljui/izkljui\ zamenjavo\ tabulatorjev\ s\ presledki<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Vkljui/izkljui\ avtomatsko\ zamikanje\ vrstic<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Vkljui/izkljui\ C-jevski\ nain\ zamikanja\ vrstic<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth irina\ zamika\ vrstic
+menutrans Soft\ &Tabstop irina\ &tabulatorja
+menutrans Te&xt\ Width\.\.\. irina\ besedila\ \.\.\.
+menutrans &File\ Format\.\.\. Format\ &datoteke\ \.\.\.
+menutrans C&olor\ Scheme &Barvna\ shema\ \.\.\.
+menutrans &Keymap Razporeditev\ tip&k
+menutrans Select\ Fo&nt\.\.\. Pisava\ \.\.\.
+" }}} EDIT / UREDI
+
+" {{{ TOOLS / ORODJA
+menutrans &Tools O&rodja
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skoi\ k\ tej\ znaki<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skoi\ Na&zaj<Tab>^T
+menutrans Build\ &Tags\ File Napravi\ datoteke\ z\ znakami\ (tag)
+if has("spell")
+ menutrans &Spelling rkovalnik
+ menutrans &Spell\ Check\ On &Vkljui
+ menutrans Spell\ Check\ &Off &Izkljui
+ menutrans To\ &Next\ error<Tab>]s K\ &naslednji\ napaki<Tab>]s
+ menutrans To\ &Previous\ error<Tab>[s K\ &prejnji\ napaki<Tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= Predlagaj\ popravek<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall Po&novi\ popravke\ na\ vseh\ besedah<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" rkovalnik:\ angleki\ "en"
+ menutrans Set\ language\ to\ "en_au" rkovalnik:\ angleki\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" rkovalnik:\ angleki\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" rkovalnik:\ angleki\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" rkovalnik:\ angleki\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" rkovalnik:\ angleki\ "en_us"
+ menutrans Set\ language\ to\ "sl" rkovalnik:\ slovenski\ "sl"
+ menutrans Set\ language\ to\ "de" rkovalnik:\ nemki\ "de"
+ menutrans Set\ language\ to\ rkovalnik:\
+ menutrans &Find\ More\ Languages &Ostali\ jeziki
+endif
+if has("folding")
+ menutrans &Folding Zavihek
+ " open close folds
+ menutrans &Enable/Disable\ folds<Tab>zi Omogoi/onemogoi\ zavihke<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Pokai\ vrstico\ s\ kazalcem<Tab>zv " kjer je kazalec
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Pokai\ samo\ vrstico\ s\ kazalcem<Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm Zapri\ ve\ zavihkov<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Zapri\ vse\ zavihke<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Odpri\ ve\ zavihkov<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR Odpri\ vse\ zavihke<Tab>zR
+ " fold method
+ menutrans Fold\ Met&hod Ustvarjanje\ zavihkov
+ menutrans M&anual &Rono
+ menutrans I&ndent Glede\ na\ &poravnavo
+ menutrans E&xpression Z\ &izrazi\ (foldexpr)
+ menutrans S&yntax Glede\ na\ &sintakso
+ menutrans &Diff Razlike\ (&diff)
+ menutrans Ma&rker Z\ &markerji/oznabami
+ " create and delete folds
+ " TODO accelerators
+ menutrans Create\ &Fold<Tab>zf Ustvari\ zavihek<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd Izbrii\ zavihek<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Izbrii\ vse\ zavihke<Tab>zD
+ " moving around in folds
+ menutrans Fold\ column\ &width irina\ stolpca\ z\ zavihkom
+endif " has folding
+
+if has("diff")
+ menutrans &Diff Razlike\ (&Diff)
+ menutrans &Update &Posodobi<Tab>
+ menutrans &Get\ Block &Sprejmi\ (spremeni\ to\ okno) " TODO: check if translation is OK
+ menutrans &Put\ Block &Polji\ (spremeni\ drugo\ okno)
+endif
+
+menutrans &Make<Tab>:make Napravi\ (&make)<Tab>:make
+menutrans &List\ Errors<Tab>:cl Pokai\ napake<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Pokai\ sporoila<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn K\ &naslednji\ napaki<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp K\ &prejnji\ napaki<Tab>:cp
+menutrans &Older\ List<Tab>:cold K\ &starejemu\ seznamu\ napak<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew K\ &novejemu\ seznamu\ napak<Tab>:cnew
+
+menutrans Error\ &Window Okno\ z\ napakami
+menutrans &Update<Tab>:cwin &Posodobi<Tab>:cwin
+menutrans &Open<Tab>:copen &Odpri<Tab>:copen
+menutrans &Close<Tab>:cclose &Zapri<Tab>:cclose
+
+menutrans &Set\ Compiler Nastavi\ &prevajalnik
+menutrans Se&T\ Compiler Nastavi\ &prevajalnik " bug in original translation?
+
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Pretvori\ v\ HE&X<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Povrni\ pretvo&rbo<Tab>:%!xxd\ -r
+" }}} TOOLS / ORODJA
+
+" {{{ SYNTAX / BARVANJE KODE
+menutrans &Syntax &Barvanje\ kode
+menutrans &Show\ filetypes\ in\ menu Podprte\ vrste\ datotek
+menutrans Set\ '&syntax'\ only Samo\ barvanje\ ('&syntax')
+menutrans Set\ '&filetype'\ too Tudi\ obnaanje\ ('&filetype')
+menutrans &Off &Izkljueno
+menutrans &Manual &Rono
+menutrans A&utomatic &Avtomatsko
+menutrans on/off\ for\ &This\ file Vkljui/izkljui\ za\ to\ datoteko
+menutrans Co&lor\ test Preizkus\ barv
+menutrans &Highlight\ test Preizkus\ barvanja\ kode
+menutrans &Convert\ to\ HTML Pretvori\ v\ &HTML
+" }}} SYNTAX / BARVANJE KODE
+
+" {{{ BUFFERS / MEDPOMNILNIK
+menutrans &Buffers &Medpomnilnik " XXX: ni najbolje: okno bi bolj pristajalo, ampak okno je e
+menutrans &Refresh\ menu &Osvei
+menutrans Delete &Brii
+menutrans &Alternate &Menjaj
+menutrans &Next &Naslednji
+menutrans &Previous &Prejnji
+menutrans [No\ File] [Brez\ datoteke]
+" }}} BUFFERS / MEDPOMNILNIK
+
+" {{{ WINDOW / OKNO
+menutrans &Window &Okno
+menutrans &New<Tab>^Wn &Novo<Tab>^Wn
+menutrans S&plit<Tab>^Ws Razdeli<Tab>^Ws
+menutrans Split\ &Vertically<Tab>^Wv Razdeli\ navpino<Tab>^Ws
+menutrans Split\ File\ E&xplorer Razdeli:\ Vsebina\ mape
+menutrans Sp&lit\ To\ #<Tab>^W^^ Razdeli\ v\ #<Tab>^W^^
+menutrans &Close<Tab>^Wc &Zapri<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zapri\ &ostala<Tab>^Wo
+menutrans Move\ &To Premakni
+menutrans &Top<Tab>^WK &Gor<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Dol<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Levo<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Desno<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Zavrti\ navzgor<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Zavrti\ navzdol<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= &Enaka\ velikost<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Najvije<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Najnije<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Najire<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Najoje<Tab>^W1\|
+" }}} WINDOW / OKNO
+
+" {{{ HELP / POMO
+menutrans &Help &Pomo
+menutrans &Overview<Tab><F1> Hitri\ pregled<Tab><F1>
+menutrans &User\ Manual P&rironik
+menutrans &How-to\ links &How-to\ kazalo
+menutrans &Find\.\.\. Po&ii\ \.\.\. " conflicts with Edit.Find
+menutrans &Credits &Avtorji
+menutrans Co&pying &Licenca
+menutrans &Sponsor/Register Registracija\ in\ &donacije
+menutrans O&rphans &Sirotam
+menutrans &Version &Verzija
+menutrans &About &O\ programu
+" }}} HELP / POMO
+
+" {{{ POPUP
+menutrans &Undo &Razveljavi
+menutrans Cu&t &Izrei
+menutrans &Copy &Kopiraj
+menutrans &Paste &Prilepi
+menutrans &Delete &Zbrii
+menutrans Select\ Blockwise Izbiraj\ po\ blokih
+menutrans Select\ &Word Izberi\ &besedo
+menutrans Select\ &Sentence Izberi\ &stavek
+menutrans Select\ Pa&ragraph Izberi\ &odstavek
+menutrans Select\ &Line Izberi\ vrs&tico
+menutrans Select\ &Block Izberi\ b&lok
+menutrans Select\ &All Izberi\ &vse
+" }}} POPUP
+
+" {{{ TOOLBAR
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Odpri datoteko
+ tmenu ToolBar.Save Shrani datoteko
+ tmenu ToolBar.SaveAll Shrani vse datoteke
+ tmenu ToolBar.Print Natisni
+ tmenu ToolBar.Undo Razveljavi
+ tmenu ToolBar.Redo Obnovi
+ tmenu ToolBar.Cut Izrei
+ tmenu ToolBar.Copy Kopiraj
+ tmenu ToolBar.Paste Prilepi
+ tmenu ToolBar.Find Najdi ...
+ tmenu ToolBar.FindNext Najdi naslednje
+ tmenu ToolBar.FindPrev Najdi prejnje
+ tmenu ToolBar.Replace Najdi in zamenjaj ...
+ tmenu ToolBar.LoadSesn Naloi sejo
+ tmenu ToolBar.SaveSesn Shrani trenutno sejo
+ tmenu ToolBar.RunScript Izberi Vim skripto za izvajanje
+ tmenu ToolBar.Make Napravi trenutni projekt (:make)
+ tmenu ToolBar.RunCtags Napravi znake v trenutnem direktoriju (!ctags -R.)
+ tmenu ToolBar.TagJump Skoi k znaki pod kurzorjem
+ tmenu ToolBar.Help Pomo za Vim
+ tmenu ToolBar.FindHelp Ii v pomoi za Vim
+ endfun
+endif
+" }}} TOOLBAR
+
+" {{{ DIALOG TEXTS
+let g:menutrans_no_file = "[Brez datoteke]"
+let g:menutrans_help_dialog = "Vnesite ukaz ali besedo, za katero elite pomo:\n\nUporabite predpono i_ za ukaze v nainu za pisanje (npr.: i_CTRL-X)\nUporabite predpono c_ za ukaze v ukazni vrstici (command-line) (npr.: c_<Del>)\nUporabite predpono ' za imena opcij (npr.: 'shiftwidth')"
+let g:menutrans_path_dialog = "Vnesite poti za iskanje datotek.\nImena direktorijev loite z vejico."
+let g:menutrans_tags_dialog = "Vnesite imena datotek z znakami ('tag').\nImana loite z vejicami."
+let g:menutrans_textwidth_dialog = "Vnesite novo irino besedila (ali 0 za izklop formatiranja): "
+let g:menutrans_fileformat_dialog = "Izberite format datoteke"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Preklii"
+" }}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_sl_si.utf-8.vim b/runtime/lang/menu_sl_si.utf-8.vim
new file mode 100644
index 0000000..e219130
--- /dev/null
+++ b/runtime/lang/menu_sl_si.utf-8.vim
@@ -0,0 +1,300 @@
+" Menu Translations: Slovenian / Slovensko
+" Maintainer: Mojca Miklavec <mojca.miklavec.lists@gmail.com>
+" Originally By: Mojca Miklavec <mojca.miklavec.lists@gmail.com>
+" Last Change: 2020 Apr 23
+" vim:set foldmethod=marker tabstop=8:
+" Original translations
+
+" TODO: add/check all '&'s
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" {{{ FILE / DATOTEKA
+menutrans &File &Datoteka
+menutrans &Open\.\.\.<Tab>:e &Odpri\ \.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Odpri\ de&ljeno\ \.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Odpri\ v\ zavi&hku\ \.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nova<Tab>:enew
+menutrans &Close<Tab>:close &Zapri<Tab>:close
+menutrans &Save<Tab>:w &Shrani<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Shrani\ &kot\ \.\.\.<Tab>:sav
+menutrans &Print Na&tisni
+menutrans Sa&ve-Exit<Tab>:wqa Shrani\ in\ &končaj<Tab>:wqa
+menutrans E&xit<Tab>:qa &Izhod<Tab>:qa
+
+if has("diff")
+ menutrans Split\ &Diff\ with\.\.\. Primerjaj\ z\ (di&ff)\ \.\.\.
+ menutrans Split\ Patched\ &By\.\.\. &Popravi\ s\ (patch)\ \.\.\.
+endif
+" }}} FILE / DATOTEKA
+
+" {{{ EDIT / UREDI
+menutrans &Edit &Uredi
+menutrans &Undo<Tab>u &Razveljavi<Tab>u
+menutrans &Redo<Tab>^R &Obnovi<Tab>^R
+menutrans Rep&eat<Tab>\. Po&novi<Tab>\.
+menutrans Cu&t<Tab>"+x &Izreži<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopiraj<Tab>"+y
+menutrans &Paste<Tab>"+gP &Prilepi<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Vrini\ pred<Tab>[p
+menutrans Put\ &After<Tab>]p Vrini\ za<Tab>]p
+menutrans &Delete<Tab>x Iz&briši<Tab>x
+menutrans &Select\ all<Tab>ggVG Izberi\ vse<Tab>ggVG
+menutrans &Find\.\.\. Po&išči\ \.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Poišči\ in\ &zamenjaj\ \.\.\.
+
+" [-- SETTINGS --]
+menutrans Settings\ &Window Nastavitve\ \.\.\.
+menutrans Startup\ &Settings Začetne\ nastavitve
+menutrans &Global\ Settings &Globalne\ nastavitve
+
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Vključi/izključi\ poudarjanje\ iskanega\ niza<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Vključi/izključi\ ločevanje\ velikih\ in\ malih\ črk<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Vključi/izključi\ kratek\ skok\ na\ pripadajoči\ oklepaj<Tab>:set\ sm!
+
+menutrans &Context\ lines Št\.\ vidnih\ vrstic\ pred/za\ kurzorjem
+
+menutrans &Virtual\ Edit Dovoli\ položaj\ kazalčka,\ kjer\ ni\ besedila
+menutrans Never Nikoli
+menutrans Block\ Selection Le\ med\ izbiranjem\ bloka
+menutrans Insert\ mode Le\ v\ načinu\ za\ pisanje
+menutrans Block\ and\ Insert Pri\ obojem
+menutrans Always Vedno
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Vključi/izključi\ način\ za\ pisanje<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Vključi/izključi\ združljivost\ z\ Vi-jem<Tab>:set\ cp!
+
+menutrans Search\ &Path\.\.\. Pot\ za\ iskanje\ \.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&g-datoteke\.\.\.
+
+menutrans Toggle\ &Toolbar Pokaži/skrij\ Orodja
+menutrans Toggle\ &Bottom\ Scrollbar Pokaži/skrij\ spodnji\ drsnik
+menutrans Toggle\ &Left\ Scrollbar Pokaži/skrij\ levi\ drsnik
+menutrans Toggle\ &Right\ Scrollbar Pokaži/skrij\ desni\ drsnik
+
+" Edit/File Settings
+menutrans F&ile\ Settings &Nastavitve\ datoteke
+
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Pokaži/skrij\ številke\ vrstic<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Pokaži/skrij\ nevidne\ znake<Tab>:set\ list! " space/tab
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Vključi/izključi\ prelome\ vrstic<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Vključi/izključi\ prelome\ vrstic\ med\ besedami<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Vključi/izključi\ zamenjavo\ tabulatorjev\ s\ presledki<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Vključi/izključi\ avtomatsko\ zamikanje\ vrstic<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Vključi/izključi\ C-jevski\ način\ zamikanja\ vrstic<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth Širina\ zamika\ vrstic
+menutrans Soft\ &Tabstop Širina\ &tabulatorja
+menutrans Te&xt\ Width\.\.\. Širina\ besedila\ \.\.\.
+menutrans &File\ Format\.\.\. Format\ &datoteke\ \.\.\.
+menutrans C&olor\ Scheme &Barvna\ shema\ \.\.\.
+menutrans &Keymap Razporeditev\ tip&k
+menutrans Select\ Fo&nt\.\.\. Pisava\ \.\.\.
+" }}} EDIT / UREDI
+
+" {{{ TOOLS / ORODJA
+menutrans &Tools O&rodja
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skoči\ k\ tej\ znački<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skoči\ Na&zaj<Tab>^T
+menutrans Build\ &Tags\ File Napravi\ datoteke\ z\ značkami\ (tag)
+if has("spell")
+ menutrans &Spelling Črkovalnik
+ menutrans &Spell\ Check\ On &Vključi
+ menutrans Spell\ Check\ &Off &Izključi
+ menutrans To\ &Next\ error<Tab>]s K\ &naslednji\ napaki<Tab>]s
+ menutrans To\ &Previous\ error<Tab>[s K\ &prejšnji\ napaki<Tab>[s
+ menutrans Suggest\ &Corrections<Tab>z= Predlagaj\ popravek<Tab>z=
+ menutrans &Repeat\ correction<Tab>:spellrepall Po&novi\ popravke\ na\ vseh\ besedah<Tab>:spellrepall
+ menutrans Set\ language\ to\ "en" Črkovalnik:\ angleški\ "en"
+ menutrans Set\ language\ to\ "en_au" Črkovalnik:\ angleški\ "en_au"
+ menutrans Set\ language\ to\ "en_ca" Črkovalnik:\ angleški\ "en_ca"
+ menutrans Set\ language\ to\ "en_gb" Črkovalnik:\ angleški\ "en_gb"
+ menutrans Set\ language\ to\ "en_nz" Črkovalnik:\ angleški\ "en_nz"
+ menutrans Set\ language\ to\ "en_us" Črkovalnik:\ angleški\ "en_us"
+ menutrans Set\ language\ to\ "sl" Črkovalnik:\ slovenski\ "sl"
+ menutrans Set\ language\ to\ "de" Črkovalnik:\ nemški\ "de"
+ menutrans Set\ language\ to\ Črkovalnik:\
+ menutrans &Find\ More\ Languages &Ostali\ jeziki
+endif
+if has("folding")
+ menutrans &Folding Zavihek
+ " open close folds
+ menutrans &Enable/Disable\ folds<Tab>zi Omogoči/onemogoči\ zavihke<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv Pokaži\ vrstico\ s\ kazalcem<Tab>zv " kjer je kazalec
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Pokaži\ samo\ vrstico\ s\ kazalcem<Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm Zapri\ več\ zavihkov<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM Zapri\ vse\ zavihke<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr Odpri\ več\ zavihkov<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR Odpri\ vse\ zavihke<Tab>zR
+ " fold method
+ menutrans Fold\ Met&hod Ustvarjanje\ zavihkov
+ menutrans M&anual &Ročno
+ menutrans I&ndent Glede\ na\ &poravnavo
+ menutrans E&xpression Z\ &izrazi\ (foldexpr)
+ menutrans S&yntax Glede\ na\ &sintakso
+ menutrans &Diff Razlike\ (&diff)
+ menutrans Ma&rker Z\ &markerji/označbami
+ " create and delete folds
+ " TODO accelerators
+ menutrans Create\ &Fold<Tab>zf Ustvari\ zavihek<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd Izbriši\ zavihek<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD Izbriši\ vse\ zavihke<Tab>zD
+ " moving around in folds
+ menutrans Fold\ column\ &width Širina\ stolpca\ z\ zavihkom
+endif " has folding
+
+if has("diff")
+ menutrans &Diff Razlike\ (&Diff)
+ menutrans &Update &Posodobi<Tab>
+ menutrans &Get\ Block &Sprejmi\ (spremeni\ to\ okno) " TODO: check if translation is OK
+ menutrans &Put\ Block &Pošlji\ (spremeni\ drugo\ okno)
+endif
+
+menutrans &Make<Tab>:make Napravi\ (&make)<Tab>:make
+menutrans &List\ Errors<Tab>:cl Pokaži\ napake<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Pokaži\ sporočila<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn K\ &naslednji\ napaki<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp K\ &prejšnji\ napaki<Tab>:cp
+menutrans &Older\ List<Tab>:cold K\ &starejšemu\ seznamu\ napak<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew K\ &novejšemu\ seznamu\ napak<Tab>:cnew
+
+menutrans Error\ &Window Okno\ z\ napakami
+menutrans &Update<Tab>:cwin &Posodobi<Tab>:cwin
+menutrans &Open<Tab>:copen &Odpri<Tab>:copen
+menutrans &Close<Tab>:cclose &Zapri<Tab>:cclose
+
+menutrans &Set\ Compiler Nastavi\ &prevajalnik
+menutrans Se&T\ Compiler Nastavi\ &prevajalnik " bug in original translation?
+
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Pretvori\ v\ HE&X<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Povrni\ pretvo&rbo<Tab>:%!xxd\ -r
+" }}} TOOLS / ORODJA
+
+" {{{ SYNTAX / BARVANJE KODE
+menutrans &Syntax &Barvanje\ kode
+menutrans &Show\ filetypes\ in\ menu Podprte\ vrste\ datotek
+menutrans Set\ '&syntax'\ only Samo\ barvanje\ ('&syntax')
+menutrans Set\ '&filetype'\ too Tudi\ obnašanje\ ('&filetype')
+menutrans &Off &Izključeno
+menutrans &Manual &Ročno
+menutrans A&utomatic &Avtomatsko
+menutrans on/off\ for\ &This\ file Vključi/izključi\ za\ to\ datoteko
+menutrans Co&lor\ test Preizkus\ barv
+menutrans &Highlight\ test Preizkus\ barvanja\ kode
+menutrans &Convert\ to\ HTML Pretvori\ v\ &HTML
+" }}} SYNTAX / BARVANJE KODE
+
+" {{{ BUFFERS / MEDPOMNILNIK
+menutrans &Buffers &Medpomnilnik " XXX: ni najbolje: okno bi bolj pristajalo, ampak okno je že
+menutrans &Refresh\ menu &Osveži
+menutrans Delete &Briši
+menutrans &Alternate &Menjaj
+menutrans &Next &Naslednji
+menutrans &Previous &Prejšnji
+menutrans [No\ File] [Brez\ datoteke]
+" }}} BUFFERS / MEDPOMNILNIK
+
+" {{{ WINDOW / OKNO
+menutrans &Window &Okno
+menutrans &New<Tab>^Wn &Novo<Tab>^Wn
+menutrans S&plit<Tab>^Ws Razdeli<Tab>^Ws
+menutrans Split\ &Vertically<Tab>^Wv Razdeli\ navpično<Tab>^Ws
+menutrans Split\ File\ E&xplorer Razdeli:\ Vsebina\ mape
+menutrans Sp&lit\ To\ #<Tab>^W^^ Razdeli\ v\ #<Tab>^W^^
+menutrans &Close<Tab>^Wc &Zapri<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zapri\ &ostala<Tab>^Wo
+menutrans Move\ &To Premakni
+menutrans &Top<Tab>^WK &Gor<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Dol<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Levo<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Desno<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Zavrti\ navzgor<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Zavrti\ navzdol<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= &Enaka\ velikost<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Najvišje<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Najnižje<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Najširše<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Najožje<Tab>^W1\|
+" }}} WINDOW / OKNO
+
+" {{{ HELP / POMOČ
+menutrans &Help &Pomoč
+menutrans &Overview<Tab><F1> Hitri\ pregled<Tab><F1>
+menutrans &User\ Manual P&riročnik
+menutrans &How-to\ links &How-to\ kazalo
+menutrans &Find\.\.\. Po&išči\ \.\.\. " conflicts with Edit.Find
+menutrans &Credits &Avtorji
+menutrans Co&pying &Licenca
+menutrans &Sponsor/Register Registracija\ in\ &donacije
+menutrans O&rphans &Sirotam
+menutrans &Version &Verzija
+menutrans &About &O\ programu
+" }}} HELP / POMOČ
+
+" {{{ POPUP
+menutrans &Undo &Razveljavi
+menutrans Cu&t &Izreži
+menutrans &Copy &Kopiraj
+menutrans &Paste &Prilepi
+menutrans &Delete &Zbriši
+menutrans Select\ Blockwise Izbiraj\ po\ blokih
+menutrans Select\ &Word Izberi\ &besedo
+menutrans Select\ &Sentence Izberi\ &stavek
+menutrans Select\ Pa&ragraph Izberi\ &odstavek
+menutrans Select\ &Line Izberi\ vrs&tico
+menutrans Select\ &Block Izberi\ b&lok
+menutrans Select\ &All Izberi\ &vse
+" }}} POPUP
+
+" {{{ TOOLBAR
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Odpri datoteko
+ tmenu ToolBar.Save Shrani datoteko
+ tmenu ToolBar.SaveAll Shrani vse datoteke
+ tmenu ToolBar.Print Natisni
+ tmenu ToolBar.Undo Razveljavi
+ tmenu ToolBar.Redo Obnovi
+ tmenu ToolBar.Cut Izreži
+ tmenu ToolBar.Copy Kopiraj
+ tmenu ToolBar.Paste Prilepi
+ tmenu ToolBar.Find Najdi ...
+ tmenu ToolBar.FindNext Najdi naslednje
+ tmenu ToolBar.FindPrev Najdi prejšnje
+ tmenu ToolBar.Replace Najdi in zamenjaj ...
+ tmenu ToolBar.LoadSesn Naloži sejo
+ tmenu ToolBar.SaveSesn Shrani trenutno sejo
+ tmenu ToolBar.RunScript Izberi Vim skripto za izvajanje
+ tmenu ToolBar.Make Napravi trenutni projekt (:make)
+ tmenu ToolBar.RunCtags Napravi značke v trenutnem direktoriju (!ctags -R.)
+ tmenu ToolBar.TagJump Skoči k znački pod kurzorjem
+ tmenu ToolBar.Help Pomoč za Vim
+ tmenu ToolBar.FindHelp Išči v pomoči za Vim
+ endfun
+endif
+" }}} TOOLBAR
+
+" {{{ DIALOG TEXTS
+let g:menutrans_no_file = "[Brez datoteke]"
+let g:menutrans_help_dialog = "Vnesite ukaz ali besedo, za katero želite pomoč:\n\nUporabite predpono i_ za ukaze v načinu za pisanje (npr.: i_CTRL-X)\nUporabite predpono c_ za ukaze v ukazni vrstici (command-line) (npr.: c_<Del>)\nUporabite predpono ' za imena opcij (npr.: 'shiftwidth')"
+let g:menutrans_path_dialog = "Vnesite poti za iskanje datotek.\nImena direktorijev ločite z vejico."
+let g:menutrans_tags_dialog = "Vnesite imena datotek z značkami ('tag').\nImana ločite z vejicami."
+let g:menutrans_textwidth_dialog = "Vnesite novo širino besedila (ali 0 za izklop formatiranja): "
+let g:menutrans_fileformat_dialog = "Izberite format datoteke"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Prekliči"
+" }}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_slovak_slovak_republic.1250.vim b/runtime/lang/menu_slovak_slovak_republic.1250.vim
new file mode 100644
index 0000000..965cc91
--- /dev/null
+++ b/runtime/lang/menu_slovak_slovak_republic.1250.vim
@@ -0,0 +1,238 @@
+" Menu Translations: Slovak
+" Translated By: Martin Lacko <lacko@host.sk>
+" Last Change: 2020 Apr 23
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding cp1250
+
+" Help menu
+menutrans &Help &Pomocnk
+menutrans &Overview<Tab><F1> &Prehad<Tab><F1>
+menutrans &User\ Manual Po&uvatesk\ manul
+menutrans &How-to\ links &Tipy
+menutrans &Find\.\.\. &Njs\.\.\.
+menutrans &Credits Po&akovanie
+menutrans O&rphans Si&roty
+menutrans Co&pying &Licencia
+menutrans &Version &Verzia
+menutrans &About &O\ programe
+
+" File menu
+menutrans &File &Sbor
+menutrans &Open\.\.\.<Tab>:e &Otvori\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp Ot&vori\ v\ novom\ okne\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Nov<Tab>:enew
+menutrans &Close<Tab>:close &Zatvori<Tab>:close
+menutrans &Save<Tab>:w &Uloi<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Uloi\ &ako\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Otvor&i\ porovnanie\ v\ novom\ okne\ s\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Otvo&ri\ aktualizovan\ s\.\.\.
+menutrans &Print &Tla
+menutrans Sa&ve-Exit<Tab>:wqa U&loi-Koniec<Tab>:wqa
+menutrans E&xit<Tab>:qa &Koniec<Tab>:qa
+
+" Edit menu
+menutrans &Edit &pravy
+menutrans &Undo<Tab>u &Sp<Tab>u
+menutrans &Redo<Tab>^R Z&rui\ sp<Tab>^R
+menutrans Rep&eat<Tab>\. &Opakova<Tab>\.
+menutrans Cu&t<Tab>"+x &Vystrihn<Tab>"+x
+menutrans &Copy<Tab>"+y &Koprova<Tab>"+y
+menutrans &Paste<Tab>"+gP V&loi<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Vloi\ &pred<Tab>[p
+menutrans Put\ &After<Tab>]p Vloi\ za<Tab>]p
+menutrans &Select\ all<Tab>ggVG Vy&bra\ vetko<Tab>ggVG
+menutrans &Delete<Tab>x Vy&maza<Tab>x
+menutrans &Find\.\.\. &Njs\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. N&ahradi\.\.\.
+menutrans Settings\ &Window Mo&nosti
+menutrans &Global\ Settings &Globlne\ monosti
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Prepn\ paletu\ zvrazovania<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Prepn\ &ignorovanie\ vekosti<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Prepn\ &ukza\ zhodu<Tab>:set\ sm!
+menutrans &Context\ lines &Kontextov\ riadky
+menutrans &Virtual\ Edit &Virtulne\ pravy
+menutrans Never Nikdy
+menutrans Block\ Selection Blokov\ vber
+menutrans Insert\ mode Reim\ vkladania
+menutrans Block\ and\ Insert Blok\ a\ vkladanie
+menutrans Always Vdy
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Prepn\ rei&m\ vkladania<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Prepn\ vi\ kompatibilitu<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Cesta\ &hadania\.\.\.
+menutrans Ta&g\ Files\.\.\. Ta&gov\ sbory\.\.\.
+menutrans Toggle\ &Toolbar Prepn\ &panel
+menutrans Toggle\ &Bottom\ Scrollbar Prepn\ spodn\ posuvnk
+menutrans Toggle\ &Left\ Scrollbar Prepn\ av\ posuvnk
+menutrans Toggle\ &Right\ Scrollbar Prepn\ prav\ posuvnk
+menutrans F&ile\ Settings Nastavenia\ sboru
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Prepn\ slova&nie\ riadkov<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Prepn\ reim\ &zoznamu<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Prepn\ z&alamovanie\ riadkov<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Prepn\ za&lamovanie\ slov<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Prepn\ rozr&en\ tabultory<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Prepn\ automatick\ &odsadzovanie<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Prepn\ &C-odsadzovanie<Tab>:set\ cin!
+menutrans &Shiftwidth &rka\ iftu
+menutrans Soft\ &Tabstop &Softvrov\ tabultor
+menutrans Te&xt\ Width\.\.\. rka\ te&xtu\.\.\.
+menutrans &File\ Format\.\.\. &Formt\ sboru\.\.\.
+menutrans C&olor\ Scheme Far&ebn\ schma
+
+" Programming menu
+menutrans &Tools &Nstroje
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Skoi\ na\ znaku<Tab>g^]
+menutrans Jump\ &back<Tab>^T Sk&oi\ sp<Tab>^T
+menutrans Build\ &Tags\ File &Vytvori\ sbor\ znaiek
+menutrans &Folding &Vnranie
+menutrans &Enable/Disable\ folds<Tab>zi Zapn/Vypn\ vnrani&e<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv Zobrazi\ kurzoro&v\ riadok<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Zobrazi\ iba\ kurzorov\ riadok<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Zatvori\ viac\ vnoren<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Zatvor&i\ vetky\ vnorenia<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr O&tvori\ viac\ vnoren<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR &Otvori\ vetky\ vnorenia<Tab>zR
+menutrans Fold\ Met&hod Met&da\ vnrania
+menutrans M&anual M&anulne
+menutrans I&ndent Odsade&nie
+menutrans E&xpression &Vraz
+menutrans S&yntax S&yntax
+menutrans &Diff Roz&diel
+menutrans Ma&rker Zna&kova
+menutrans Create\ &Fold<Tab>zf Vyt&vori\ vnorenie<Tab>zf
+menutrans &Delete\ Fold<Tab>zd V&ymaza\ vnorenie<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Vymaza\ vetky\ vnorenia<Tab>zD
+menutrans Fold\ column\ &width rka\ &vkladanho\ stpca
+menutrans &Diff &Rozdiely
+menutrans &Update Akt&ualizova
+menutrans &Get\ Block Zob&ra\ blok
+menutrans &Put\ Block &Vloi\ blok
+menutrans Error\ &Window Chybov\ &okno
+menutrans &Update<Tab>:cwin Akt&ualizova<Tab>:cwin
+menutrans &Open<Tab>:copen &Otvori<Tab>:copen
+menutrans &Close<Tab>:cclose &Zatvori<Tab>:cclose
+menutrans &Convert\ to\ HEX<Tab>:%!xxd &Konvertova\ do\ HEX<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Konve&rtova\ sp<Tab>:%!xxd\ -r
+menutrans &Make<Tab>:make &Make<Tab>:make
+menutrans &List\ Errors<Tab>:cl Vpis\ &chb<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Vp&is\ sprv<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn a&lia\ chyba<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Predchdzajca\ chyba<Tab>:cp
+menutrans &Older\ List<Tab>:cold Sta&r\ zoznam<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Nov\ &zoznam<Tab>:cnew
+menutrans Error\ &Window<Tab>:cwin Chybov\ o&kno<Tab>:cwin
+menutrans &Set\ Compiler Vyberte\ k&ompiltor
+menutrans Convert\ to\ HEX<Tab>:%!xxd Prvies\ do\ es&tnstkovho\ formtu<Tab>:%!xxd
+menutrans Convert\ back<Tab>:%!xxd\ -r Pr&evies\ sp<Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers &Vyrovnvacia\ pam
+menutrans &Refresh\ menu Obnovi
+menutrans &Delete Vymaza
+menutrans &Alternate Zmeni
+menutrans &Next &alia
+menutrans &Previous &Predchdzajca
+menutrans [No\ File] [iadny\ sbor]
+
+" Window menu
+menutrans &Window &Okn
+menutrans &New<Tab>^Wn &Nov<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Rozdeli<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Ro&zdeli\ na\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Rozdeli\ &vertiklne<Tab>^Wv
+menutrans Split\ File\ E&xplorer Otvori\ pri&eskumnka
+menutrans &Close<Tab>^Wc Zatvor&i<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zatvori\ i&n<Tab>^Wo
+menutrans Move\ &To Presun&
+menutrans &Top<Tab>^WK Na&hor<Tab>^WK
+menutrans &Bottom<Tab>^WJ Nado&l<Tab>^WJ
+menutrans &Left\ side<Tab>^WH V&avo<Tab>^WJ
+menutrans &Right\ side<Tab>^WL Vprav&o<Tab>^WL
+menutrans Ne&xt<Tab>^Ww &alie<Tab>^Ww
+menutrans P&revious<Tab>^WW &Predchdzajce<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= Rovnak\ v&ka<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ &Maximlna\ vka<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Minimlna\ v&ka<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Maximlna\ rka<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimlna\ irka<Tab>^W1\|
+menutrans Rotate\ &Up<Tab>^WR Rotova&\ nahor<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotova\ na&dol<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. Vy&bra\ psmo\.\.\.
+
+" The popup menu
+menutrans &Undo &Sp
+menutrans Cu&t &Vystrihn
+menutrans &Copy &Koprova
+menutrans &Paste V&loi
+menutrans &Delete V&ymaza
+menutrans Select\ Blockwise Vybra\ blokovo
+menutrans Select\ &Word Vybra\ sl&ovo
+menutrans Select\ &Line Vybra\ &riadok
+menutrans Select\ &Block Vybra\ &blok
+menutrans Select\ &All Vybra\ v&etko
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Otvori sbor
+ tmenu ToolBar.Save Uloi sbor
+ tmenu ToolBar.SaveAll Uloi vetky
+ tmenu ToolBar.Print Tla
+ tmenu ToolBar.Undo Sp
+ tmenu ToolBar.Redo Opakova
+ tmenu ToolBar.Cut Vystrihn
+ tmenu ToolBar.Copy Koprova
+ tmenu ToolBar.Paste Vloi
+ tmenu ToolBar.Find Njs...
+ tmenu ToolBar.FindNext Njs alie
+ tmenu ToolBar.FindPrev Njs predchdzajce
+ tmenu ToolBar.Replace Nahradi...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Nov okno
+ tmenu ToolBar.WinSplit Rozdeli okno
+ tmenu ToolBar.WinMax Maximalizova okno
+ tmenu ToolBar.WinMin Minimalizova okno
+ tmenu ToolBar.WinVSplit Rozdeli okno vertiklne
+ tmenu ToolBar.WinMaxWidth Maximalizova rku okna
+ tmenu ToolBar.WinMinWidth Minimalizova rku okna
+ tmenu ToolBar.WinClose Zatvori okno
+ endif
+ tmenu ToolBar.LoadSesn Nata sedenie
+ tmenu ToolBar.SaveSesn Uloi sedenie
+ tmenu ToolBar.RunScript Spusti skript
+ tmenu ToolBar.Make Spusti make
+ tmenu ToolBar.Shell Spusti el
+ tmenu ToolBar.RunCtags Spusti ctags
+ tmenu ToolBar.TagJump Skoi na tag pod kurzorom
+ tmenu ToolBar.Help Pomocnk
+ tmenu ToolBar.FindHelp Njs pomocnka k...
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Syntax
+menutrans Set\ '&syntax'\ only Nastavi\ iba\ 'syntax'
+menutrans Set\ '&filetype'\ too Nastavi\ aj\ 'filetype'
+menutrans &Off &Vypn
+menutrans &Manual &Rune
+menutrans A&utomatic A&utomaticky
+" menutrans o&n\ (this\ file) &Zapn\ (pre\ tento\ sbor)
+" menutrans o&ff\ (this\ file) Vyp&n\ (pre\ tento\ sbor )
+menutrans on/off\ for\ &This\ file Zapn/vypn\ pre\ &tento\ sbor
+menutrans Co&lor\ test Test\ &farieb
+menutrans &Highlight\ test &Test\ zvrazovania
+menutrans &Convert\ to\ HTML &Previes\ do\ HTML
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_spanish_spain.850.vim b/runtime/lang/menu_spanish_spain.850.vim
new file mode 100644
index 0000000..4a96a39
--- /dev/null
+++ b/runtime/lang/menu_spanish_spain.850.vim
@@ -0,0 +1 @@
+source <sfile>:p:h/menu_es_es.latin1.vim
diff --git a/runtime/lang/menu_sr.utf-8.vim b/runtime/lang/menu_sr.utf-8.vim
new file mode 100644
index 0000000..4d278f9
--- /dev/null
+++ b/runtime/lang/menu_sr.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Serbian
+
+source <sfile>:p:h/menu_sr_rs.utf-8.vim
diff --git a/runtime/lang/menu_sr_rs.ascii.vim b/runtime/lang/menu_sr_rs.ascii.vim
new file mode 100644
index 0000000..f62fc82
--- /dev/null
+++ b/runtime/lang/menu_sr_rs.ascii.vim
@@ -0,0 +1,297 @@
+" Menu Translations: Serbian
+" Maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
+" Last Change: Fri, 30 May 2003 10:17:39 Eastern Daylight Time
+" Adapted for VIM 8 by: Ivan Pesic on 2017-12-28 12:05+0400
+" Generated from menu_sr_rs.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding latin1
+
+" Help menu
+menutrans &Help Pomo&c
+menutrans &Overview<Tab><F1> &Pregled<Tab><F1>
+menutrans &User\ Manual &Uputstvo\ za\ korisnike
+menutrans &How-to\ links &Kako\ da\.\.\.
+menutrans &Find &Nadji
+menutrans &Credits &Zasluge
+menutrans Co&pying P&reuzimanje
+menutrans O&rphans &Sirocici
+menutrans &Sponsor/Register Sponzor/&Registrujte\ se
+menutrans &Version &Verzija
+menutrans &About &O\ programu
+
+" File menu
+menutrans &File &Fajl
+menutrans &Open\.\.\.<Tab>:e &Otvori\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &Podeli-otvori\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Otvori\ karticu\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nov<Tab>:enew
+menutrans &Close<Tab>:close &Zatvori<Tab>:close
+menutrans &Save<Tab>:w &Sacuvaj<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Sacuvaj\ &kao\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Podeli\ i\ &uporedi\ sa\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Po&deli\ i\ prepravi\ sa\.\.\.
+menutrans &Print Sta&mpaj
+menutrans Sa&ve-Exit<Tab>:wqa Sacuvaj\ i\ za&vrsi<Tab>:wqa
+menutrans E&xit<Tab>:qa K&raj<Tab>:qa
+
+" Edit menu
+menutrans &Edit &Uredjivanje
+menutrans &Undo<Tab>u &Ponisti<Tab>u
+menutrans &Redo<Tab>^R &Vrati\ izmenu<Tab>^R
+menutrans Rep&eat<Tab>\. P&onovi<Tab>\.
+menutrans Cu&t<Tab>"+x Ise&ci<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopiraj<Tab>"+y
+menutrans &Paste<Tab>"+gP &Ubaci<Tab>"+gP
+menutrans &Paste<Tab>"+P &Ubaci<Tab>"+P
+menutrans Put\ &Before<Tab>[p Stavi\ ispre&d<Tab>[p
+menutrans Put\ &After<Tab>]p Stavi\ &iza<Tab>]p
+menutrans &Delete<Tab>x Iz&brisi<Tab>x
+menutrans &Select\ all<Tab>ggVG Izaberi\ sv&e<Tab>ggVG
+menutrans &Find\.\.\. &Nadji\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Nadji\ i\ &zameni\.\.\.
+menutrans Settings\ &Window P&rozor\ podesavanja
+menutrans Startup\ &Settings Po&desavanja\ pri\ pokretanju
+menutrans &Global\ Settings Op&sta\ podesavanja
+menutrans F&ile\ Settings Podesavanja\ za\ faj&love
+menutrans &Shiftwidth &Korak\ uvlacenja
+menutrans Soft\ &Tabstop &Meka\ tabulacija
+menutrans Te&xt\ Width\.\.\. &Sirina\ teksta\.\.\.
+menutrans &File\ Format\.\.\. &Vrsta\ fajla\.\.\.
+menutrans Show\ C&olor\ Schemes\ in\ Menu Prikazi\ seme\ bo&ja\ u\ meniju
+menutrans C&olor\ Scheme \Seme\ bo&ja
+menutrans Show\ &Keymaps\ in\ Menu Prikazi\ pres&likavanja\ tastature\ u\ meniju
+menutrans &Keymap Pres&likavanja\ tastature
+menutrans Select\ Fo&nt\.\.\. Izbor\ &fonta\.\.\.
+
+" Edit/Global Settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Isticanje\ &sablona\ (da/ne)<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! Zanemari\ velicinu\ &slova\ (da/ne)<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Prikazi\ uparenu\ &zagradu\ (da/ne)<Tab>:set\ sm!
+menutrans &Context\ lines Vidljivi\ &redovi
+menutrans &Virtual\ Edit Virtuelno\ &uredjivanje
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Rezim\ U&metanje\ (da/ne)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! '&Vi'\ saglasno\ (da/ne)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Putanja\ &pretrage\.\.\.
+menutrans Ta&g\ Files\.\.\. &Fajlovi\ oznaka\.\.\.
+menutrans Toggle\ &Toolbar Linija\ sa\ &alatkama\ (da/ne)
+menutrans Toggle\ &Bottom\ Scrollbar Donja\ l&inija\ klizanja\ (da/ne)
+menutrans Toggle\ &Left\ Scrollbar &Leva\ linija\ klizanja\ (da/ne)
+menutrans Toggle\ &Right\ Scrollbar &Desna\ linija\ klizanja\ (da/ne)
+
+" Edit/Global Settings/Virtual Edit
+menutrans Never Nikad
+menutrans Block\ Selection Izbor\ bloka
+menutrans Insert\ mode Rezim\ Umetanje
+menutrans Block\ and\ Insert Blok\ i\ Umetanje
+menutrans Always Uvek
+
+" Edit/File Settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Prikazi\ &numeraciju\ linija\ (da/ne)<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! Prikazi\ Relati&vnu\ numeraciju\ linija\ (da/ne)<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Rezim\ &liste\ (da/ne)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! Obavijanje\ &redova\ (da/ne)<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! Prelomi\ &na\ rec\ (da/ne)<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et! Razmaci\ umesto\ &tabulacije\ (da/ne)<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! Auto-&uvlacenje\ (da/ne)<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! &C-uvlacenje\ (da/ne)<Tab>:set\ cin!
+
+" Edit/Keymap
+menutrans None Bez\ preslikavanja
+
+" Tools menu
+menutrans &Tools &Alatke
+menutrans &Jump\ to\ this\ tag<Tab>g^] Skoci\ na\ &ovu\ oznaku<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skoci\ &natrag<Tab>^T
+menutrans Build\ &Tags\ File Izgradi\ &fajl\ oznaka
+menutrans &Spelling Pra&vopis
+menutrans &Folding &Podvijanje
+menutrans Create\ &Fold<Tab>zf S&tvori\ svijutak<Tab>zf
+menutrans &Delete\ Fold<Tab>zd O&brisi\ svijutak<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Obrisi\ sve\ sv&ijutke<Tab>zD
+menutrans Fold\ column\ &width Sirina\ &reda\ cvijutka
+"menutrans &Diff &Uporedjivanje
+menutrans &Make<Tab>:make 'mak&e'<Tab>:make
+menutrans &List\ Errors<Tab>:cl Spisak\ &gresaka<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Sp&isak\ poruka<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn S&ledeca\ greska<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Pre&thodna\ greska<Tab>:cp
+menutrans &Older\ List<Tab>:cold Stari\ spisa&k<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew No&vi\ spisak<Tab>:cnew
+menutrans Error\ &Window Prozor\ sa\ g&reskama
+menutrans Se&t\ Compiler I&zaberi\ prevodioca
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Pretvori\ u\ &HEKS<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Vr&ati\ u\ prvobitan\ oblik<Tab>:%!xxd\ -r
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu Prikazi\ pode&savanja\ prevodioca\ u\ meniju
+
+" Tools/Spelling
+menutrans &Spell\ Check\ On &Ukljuci\ proveru\ pravopisa
+menutrans Spell\ Check\ &Off &Iskljuci\ proveru\ pravopisa
+menutrans To\ &Next\ Error<Tab>]s Idi\ na\ &sledecu\ gresku<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s Idi\ na\ &prethodnu\ gresku<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Predlozi\ isp&ravke<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall P&onovi\ ispravku<Tab>:spellrepall
+menutrans Set\ Language\ to\ "en" Postavi\ jezik\ na\ "en"
+menutrans Set\ Language\ to\ "en_au" Postavi\ jezik\ na\ "en_au"
+menutrans Set\ Language\ to\ "en_ca" Postavi\ jezik\ na\ "en_ca"
+menutrans Set\ Language\ to\ "en_gb" Postavi\ jezik\ na\ "en_gb"
+menutrans Set\ Language\ to\ "en_nz" Postavi\ jezik\ na\ "en_nz"
+menutrans Set\ Language\ to\ "en_us" Postavi\ jezik\ na\ "en_us"
+menutrans &Find\ More\ Languages Pronadji\ jos\ jezika
+
+" Tools/Folding
+menutrans &Enable/Disable\ folds<Tab>zi &Omoguci/prekini\ svijanje<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Pokazi\ red\ sa\ kursorom<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Pokazi\ &samo\ red\ sa\ kursorom<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm &Zatvori\ vise\ svijutaka<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Zatvori\ s&ve\ svijutke<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr Otvori\ vis&e\ svijutaka<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR O&tvori\ sve\ svijutke<Tab>zR
+menutrans Fold\ Met&hod &Nacin\ podvijanja
+menutrans Fold\ Col&umn\ Width Sirina\ kolone\ ispred\ svijutaka
+
+" Tools/Folding/Fold Method
+menutrans M&anual &Rucno
+menutrans I&ndent &Uvucenost
+menutrans E&xpression &Izraz
+menutrans S&yntax &Sintaksa
+"menutrans &Diff
+menutrans Ma&rker &Oznaka
+
+" Tools/Diff
+menutrans &Update &Azuriraj
+menutrans &Get\ Block &Prihvati\ blok\ izmena
+menutrans &Put\ Block Pre&baci\ blok\ izmena
+
+" Tools/Error Window
+menutrans &Update<Tab>:cwin &Azuriraj<Tab>:cwin
+menutrans &Open<Tab>:copen &Otvori<Tab>:copen
+menutrans &Close<Tab>:cclose &Zatvori<Tab>:cclose
+
+" Bufers menu
+menutrans &Buffers &Baferi
+menutrans &Refresh\ menu &Azuriraj
+menutrans Delete &Obrisi
+menutrans &Alternate A&lternativni
+menutrans &Next &Sledeci
+menutrans &Previous &Prethodni
+menutrans [No\ File] [Nema\ fajla]
+
+" Window menu
+menutrans &Window &Prozor
+menutrans &New<Tab>^Wn &Novi<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Podeli<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Podeli\ sa\ &alternativnim<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Podeli\ &uspravno<Tab>^Wv
+menutrans Split\ File\ E&xplorer Podeli\ za\ pregled\ &fajlova
+menutrans &Close<Tab>^Wc &Zatvori<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zatvori\ &ostale<Tab>^Wo
+"menutrans Ne&xt<Tab>^Ww &Sledeci<Tab>^Ww
+"menutrans P&revious<Tab>^WW P&rethodni<Tab>^WW
+menutrans Move\ &To Pre&mesti
+menutrans Rotate\ &Up<Tab>^WR &Kruzno\ nagore<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Kruzno\ nadol&e<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= &Iste\ velicine<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Maksimalna\ &visina<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Minima&lna\ visina<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Maksimalna\ &sirina<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimalna\ si&rina<Tab>^W1\|
+
+" Window/Move To
+menutrans &Top<Tab>^WK &Vrh<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Podnozje<Tab>^WJ
+menutrans &Left\ side<Tab>^WH U&levo<Tab>^WH
+menutrans &Right\ side<Tab>^WL U&desno<Tab>^WL
+
+" The popup menu
+menutrans &Undo &Ponisti
+menutrans Cu&t &Iseci
+menutrans &Copy &Kopiraj
+menutrans &Paste &Ubaci
+menutrans &Delete I&zbrisi
+menutrans Select\ Blockwise Biraj\ b&lokovski
+menutrans Select\ &Word Izaberi\ &rec
+menutrans Select\ &Sentence Izaberi\ r&ecenicu
+menutrans Select\ Pa&ragraph Izaberi\ &pasus
+menutrans Select\ &Line Izaberi\ r&ed
+menutrans Select\ &Block Izaberi\ &blok
+menutrans Select\ &All Izaberi\ &sve
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Ucitaj
+ tmenu ToolBar.Save Sacuvaj
+ tmenu ToolBar.SaveAll Sacuvaj sve
+ tmenu ToolBar.Print Stampaj
+ tmenu ToolBar.Undo Vrati
+ tmenu ToolBar.Redo Povrati
+ tmenu ToolBar.Cut Iseci
+ tmenu ToolBar.Copy Kopiraj
+ tmenu ToolBar.Paste Ubaci
+ tmenu ToolBar.Find Nadji
+ tmenu ToolBar.FindNext Nadji sledeci
+ tmenu ToolBar.FindPrev Nadji prethodni
+ tmenu ToolBar.Replace Zameni
+ tmenu ToolBar.New Novi
+ tmenu ToolBar.WinSplit Podeli prozor
+ tmenu ToolBar.WinMax Maksimalna visina
+ tmenu ToolBar.WinMin Minimalna visina
+ tmenu ToolBar.WinVSplit Podeli uspravno
+ tmenu ToolBar.WinMaxWidth Maksimalna sirina
+ tmenu ToolBar.WinMinWidth Minimalna sirina
+ tmenu ToolBar.WinClose Zatvori prozor
+ tmenu ToolBar.LoadSesn Ucitaj seansu
+ tmenu ToolBar.SaveSesn Sacuvaj seansu
+ tmenu ToolBar.RunScript Izvrsi spis
+ tmenu ToolBar.Make 'make'
+ tmenu ToolBar.Shell Operativno okruzenje
+ tmenu ToolBar.RunCtags Napravi oznake
+ tmenu ToolBar.TagJump Idi na oznaku
+ tmenu ToolBar.Help Pomoc
+ tmenu ToolBar.FindHelp Nadji objasnjenje
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Sintaksa
+menutrans &Show\ File\ Types\ in\ Menu Prikazi\ tipove\ fajlova\ u\ &meniju
+menutrans Set\ '&syntax'\ only Pode&si\ samo\ 'syntax'
+menutrans Set\ '&filetype'\ too Podesi\ &takodje\ i\ 'filetype'
+menutrans &Off &Iskljuceno
+menutrans &Manual &Rucno
+menutrans A&utomatic &Automatski
+menutrans on/off\ for\ &This\ file Da/ne\ za\ ovaj\ &fajl
+menutrans Co&lor\ test Provera\ &boja
+menutrans &Highlight\ test Provera\ isti&canja
+menutrans &Convert\ to\ HTML Pretvori\ &u\ HTML
+
+" dialog texts
+let menutrans_help_dialog = "Unesite naredbu ili rec cije pojasnjenje trazite:\n\nDodajte i_ za naredbe unosa (npr. i_CTRL-X)\nDodajte c_ za naredbe komandnog rezima (npr. s_<Del>)\nDodajte ' za imena opcija (npr. 'shiftwidth')"
+
+let g:menutrans_path_dialog = "Unesite putanju pretrage za fajlove\nRazdvojite zarezima imena direktorijuma."
+
+let g:menutrans_tags_dialog = "Unesite imena fajlova sa oznakama\nRazdvojite zarezima imena."
+
+let g:menutrans_textwidth_dialog = "Unesite novu sirinu teksta (0 sprecava prelom)"
+
+let g:menutrans_fileformat_dialog = "Izaberite format zapisa fajla"
+
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Otkazi"
+
+let menutrans_no_file = "[Nema fajla]"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: tw=0 keymap=serbian
diff --git a/runtime/lang/menu_sr_rs.iso_8859-2.vim b/runtime/lang/menu_sr_rs.iso_8859-2.vim
new file mode 100644
index 0000000..9b1d933
--- /dev/null
+++ b/runtime/lang/menu_sr_rs.iso_8859-2.vim
@@ -0,0 +1,297 @@
+" Menu Translations: Serbian
+" Maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
+" Last Change: Fri, 30 May 2003 10:17:39 Eastern Daylight Time
+" Adapted for VIM 8 by: Ivan Pei on 2017-12-28 12:05+0400
+" Generated from menu_sr_rs.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding iso8859-2
+
+" Help menu
+menutrans &Help Pomo&
+menutrans &Overview<Tab><F1> &Pregled<Tab><F1>
+menutrans &User\ Manual &Uputstvo\ za\ korisnike
+menutrans &How-to\ links &Kako\ da\.\.\.
+menutrans &Find &Nai
+menutrans &Credits &Zasluge
+menutrans Co&pying P&reuzimanje
+menutrans O&rphans &Siroii
+menutrans &Sponsor/Register Sponzor/&Registrujte\ se
+menutrans &Version &Verzija
+menutrans &About &O\ programu
+
+" File menu
+menutrans &File &Fajl
+menutrans &Open\.\.\.<Tab>:e &Otvori\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &Podeli-otvori\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Otvori\ karticu\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Nov<Tab>:enew
+menutrans &Close<Tab>:close &Zatvori<Tab>:close
+menutrans &Save<Tab>:w &Sauvaj<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Sauvaj\ &kao\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Podeli\ i\ &uporedi\ sa\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Po&deli\ i\ prepravi\ sa\.\.\.
+menutrans &Print ta&mpaj
+menutrans Sa&ve-Exit<Tab>:wqa Sauvaj\ i\ za&vri<Tab>:wqa
+menutrans E&xit<Tab>:qa K&raj<Tab>:qa
+
+" Edit menu
+menutrans &Edit &Ureivanje
+menutrans &Undo<Tab>u &Poniti<Tab>u
+menutrans &Redo<Tab>^R &Vrati\ izmenu<Tab>^R
+menutrans Rep&eat<Tab>\. P&onovi<Tab>\.
+menutrans Cu&t<Tab>"+x Ise&ci<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopiraj<Tab>"+y
+menutrans &Paste<Tab>"+gP &Ubaci<Tab>"+gP
+menutrans &Paste<Tab>"+P &Ubaci<Tab>"+P
+menutrans Put\ &Before<Tab>[p Stavi\ ispre&d<Tab>[p
+menutrans Put\ &After<Tab>]p Stavi\ &iza<Tab>]p
+menutrans &Delete<Tab>x Iz&brii<Tab>x
+menutrans &Select\ all<Tab>ggVG Izaberi\ sv&e<Tab>ggVG
+menutrans &Find\.\.\. &Nai\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Nai\ i\ &zameni\.\.\.
+menutrans Settings\ &Window P&rozor\ podeavanja
+menutrans Startup\ &Settings Po&deavanja\ pri\ pokretanju
+menutrans &Global\ Settings Op&ta\ podeavanja
+menutrans F&ile\ Settings Podeavanja\ za\ faj&love
+menutrans &Shiftwidth &Korak\ uvlaenja
+menutrans Soft\ &Tabstop &Meka\ tabulacija
+menutrans Te&xt\ Width\.\.\. &irina\ teksta\.\.\.
+menutrans &File\ Format\.\.\. &Vrsta\ fajla\.\.\.
+menutrans Show\ C&olor\ Schemes\ in\ Menu Prikai\ eme\ bo&ja\ u\ meniju
+menutrans C&olor\ Scheme \eme\ bo&ja
+menutrans Show\ &Keymaps\ in\ Menu Prikai\ pres&likavanja\ tastature\ u\ meniju
+menutrans &Keymap Pres&likavanja\ tastature
+menutrans Select\ Fo&nt\.\.\. Izbor\ &fonta\.\.\.
+
+" Edit/Global Settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Isticanje\ &ablona\ (da/ne)<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! Zanemari\ veliinu\ &slova\ (da/ne)<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Prikai\ uparenu\ &zagradu\ (da/ne)<Tab>:set\ sm!
+menutrans &Context\ lines Vidljivi\ &redovi
+menutrans &Virtual\ Edit Virtuelno\ &ureivanje
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Reim\ U&metanje\ (da/ne)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! '&Vi'\ saglasno\ (da/ne)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Putanja\ &pretrage\.\.\.
+menutrans Ta&g\ Files\.\.\. &Fajlovi\ oznaka\.\.\.
+menutrans Toggle\ &Toolbar Linija\ sa\ &alatkama\ (da/ne)
+menutrans Toggle\ &Bottom\ Scrollbar Donja\ l&inija\ klizanja\ (da/ne)
+menutrans Toggle\ &Left\ Scrollbar &Leva\ linija\ klizanja\ (da/ne)
+menutrans Toggle\ &Right\ Scrollbar &Desna\ linija\ klizanja\ (da/ne)
+
+" Edit/Global Settings/Virtual Edit
+menutrans Never Nikad
+menutrans Block\ Selection Izbor\ bloka
+menutrans Insert\ mode Reim\ Umetanje
+menutrans Block\ and\ Insert Blok\ i\ Umetanje
+menutrans Always Uvek
+
+" Edit/File Settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Prikai\ &numeraciju\ linija\ (da/ne)<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! Prikai\ Relati&vnu\ numeraciju\ linija\ (da/ne)<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Reim\ &liste\ (da/ne)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! Obavijanje\ &redova\ (da/ne)<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! Prelomi\ &na\ re\ (da/ne)<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et! Razmaci\ umesto\ &tabulacije\ (da/ne)<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! Auto-&uvlaenje\ (da/ne)<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! &C-uvlaenje\ (da/ne)<Tab>:set\ cin!
+
+" Edit/Keymap
+menutrans None Bez\ preslikavanja
+
+" Tools menu
+menutrans &Tools &Alatke
+menutrans &Jump\ to\ this\ tag<Tab>g^] Skoi\ na\ &ovu\ oznaku<Tab>g^]
+menutrans Jump\ &back<Tab>^T Skoi\ &natrag<Tab>^T
+menutrans Build\ &Tags\ File Izgradi\ &fajl\ oznaka
+menutrans &Spelling Pra&vopis
+menutrans &Folding &Podvijanje
+menutrans Create\ &Fold<Tab>zf S&tvori\ svijutak<Tab>zf
+menutrans &Delete\ Fold<Tab>zd O&brii\ svijutak<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Obrii\ sve\ sv&ijutke<Tab>zD
+menutrans Fold\ column\ &width irina\ &reda\ cvijutka
+"menutrans &Diff &Uporeivanje
+menutrans &Make<Tab>:make 'mak&e'<Tab>:make
+menutrans &List\ Errors<Tab>:cl Spisak\ &greaka<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Sp&isak\ poruka<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn S&ledea\ greka<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Pre&thodna\ greka<Tab>:cp
+menutrans &Older\ List<Tab>:cold Stari\ spisa&k<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew No&vi\ spisak<Tab>:cnew
+menutrans Error\ &Window Prozor\ sa\ g&rekama
+menutrans Se&t\ Compiler I&zaberi\ prevodioca
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Pretvori\ u\ &HEKS<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Vr&ati\ u\ prvobitan\ oblik<Tab>:%!xxd\ -r
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu Prikai\ pode&avanja\ prevodioca\ u\ meniju
+
+" Tools/Spelling
+menutrans &Spell\ Check\ On &Ukljui\ proveru\ pravopisa
+menutrans Spell\ Check\ &Off &Iskljui\ proveru\ pravopisa
+menutrans To\ &Next\ Error<Tab>]s Idi\ na\ &sledeu\ greku<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s Idi\ na\ &prethodnu\ greku<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Predloi\ isp&ravke<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall P&onovi\ ispravku<Tab>:spellrepall
+menutrans Set\ Language\ to\ "en" Postavi\ jezik\ na\ "en"
+menutrans Set\ Language\ to\ "en_au" Postavi\ jezik\ na\ "en_au"
+menutrans Set\ Language\ to\ "en_ca" Postavi\ jezik\ na\ "en_ca"
+menutrans Set\ Language\ to\ "en_gb" Postavi\ jezik\ na\ "en_gb"
+menutrans Set\ Language\ to\ "en_nz" Postavi\ jezik\ na\ "en_nz"
+menutrans Set\ Language\ to\ "en_us" Postavi\ jezik\ na\ "en_us"
+menutrans &Find\ More\ Languages Pronai\ jo\ jezika
+
+" Tools/Folding
+menutrans &Enable/Disable\ folds<Tab>zi &Omogui/prekini\ svijanje<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Pokai\ red\ sa\ kursorom<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Pokai\ &samo\ red\ sa\ kursorom<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm &Zatvori\ vie\ svijutaka<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Zatvori\ s&ve\ svijutke<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr Otvori\ vi&e\ svijutaka<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR O&tvori\ sve\ svijutke<Tab>zR
+menutrans Fold\ Met&hod &Nain\ podvijanja
+menutrans Fold\ Col&umn\ Width irina\ kolone\ ispred\ svijutaka
+
+" Tools/Folding/Fold Method
+menutrans M&anual &Runo
+menutrans I&ndent &Uvuenost
+menutrans E&xpression &Izraz
+menutrans S&yntax &Sintaksa
+"menutrans &Diff
+menutrans Ma&rker &Oznaka
+
+" Tools/Diff
+menutrans &Update &Auriraj
+menutrans &Get\ Block &Prihvati\ blok\ izmena
+menutrans &Put\ Block Pre&baci\ blok\ izmena
+
+" Tools/Error Window
+menutrans &Update<Tab>:cwin &Auriraj<Tab>:cwin
+menutrans &Open<Tab>:copen &Otvori<Tab>:copen
+menutrans &Close<Tab>:cclose &Zatvori<Tab>:cclose
+
+" Bufers menu
+menutrans &Buffers &Baferi
+menutrans &Refresh\ menu &Auriraj
+menutrans Delete &Obrii
+menutrans &Alternate A&lternativni
+menutrans &Next &Sledei
+menutrans &Previous &Prethodni
+menutrans [No\ File] [Nema\ fajla]
+
+" Window menu
+menutrans &Window &Prozor
+menutrans &New<Tab>^Wn &Novi<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Podeli<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Podeli\ sa\ &alternativnim<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Podeli\ &uspravno<Tab>^Wv
+menutrans Split\ File\ E&xplorer Podeli\ za\ pregled\ &fajlova
+menutrans &Close<Tab>^Wc &Zatvori<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Zatvori\ &ostale<Tab>^Wo
+"menutrans Ne&xt<Tab>^Ww &Sledei<Tab>^Ww
+"menutrans P&revious<Tab>^WW P&rethodni<Tab>^WW
+menutrans Move\ &To Pre&mesti
+menutrans Rotate\ &Up<Tab>^WR &Kruno\ nagore<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Kruno\ nadol&e<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= &Iste\ veliine<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Maksimalna\ &visina<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Minima&lna\ visina<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Maksimalna\ &irina<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimalna\ i&rina<Tab>^W1\|
+
+" Window/Move To
+menutrans &Top<Tab>^WK &Vrh<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Podnoje<Tab>^WJ
+menutrans &Left\ side<Tab>^WH U&levo<Tab>^WH
+menutrans &Right\ side<Tab>^WL U&desno<Tab>^WL
+
+" The popup menu
+menutrans &Undo &Poniti
+menutrans Cu&t &Iseci
+menutrans &Copy &Kopiraj
+menutrans &Paste &Ubaci
+menutrans &Delete I&zbrii
+menutrans Select\ Blockwise Biraj\ b&lokovski
+menutrans Select\ &Word Izaberi\ &re
+menutrans Select\ &Sentence Izaberi\ r&eenicu
+menutrans Select\ Pa&ragraph Izaberi\ &pasus
+menutrans Select\ &Line Izaberi\ r&ed
+menutrans Select\ &Block Izaberi\ &blok
+menutrans Select\ &All Izaberi\ &sve
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Uitaj
+ tmenu ToolBar.Save Sauvaj
+ tmenu ToolBar.SaveAll Sauvaj sve
+ tmenu ToolBar.Print tampaj
+ tmenu ToolBar.Undo Vrati
+ tmenu ToolBar.Redo Povrati
+ tmenu ToolBar.Cut Iseci
+ tmenu ToolBar.Copy Kopiraj
+ tmenu ToolBar.Paste Ubaci
+ tmenu ToolBar.Find Nai
+ tmenu ToolBar.FindNext Nai sledei
+ tmenu ToolBar.FindPrev Nai prethodni
+ tmenu ToolBar.Replace Zameni
+ tmenu ToolBar.New Novi
+ tmenu ToolBar.WinSplit Podeli prozor
+ tmenu ToolBar.WinMax Maksimalna visina
+ tmenu ToolBar.WinMin Minimalna visina
+ tmenu ToolBar.WinVSplit Podeli uspravno
+ tmenu ToolBar.WinMaxWidth Maksimalna irina
+ tmenu ToolBar.WinMinWidth Minimalna irina
+ tmenu ToolBar.WinClose Zatvori prozor
+ tmenu ToolBar.LoadSesn Uitaj seansu
+ tmenu ToolBar.SaveSesn Sauvaj seansu
+ tmenu ToolBar.RunScript Izvri spis
+ tmenu ToolBar.Make 'make'
+ tmenu ToolBar.Shell Operativno okruenje
+ tmenu ToolBar.RunCtags Napravi oznake
+ tmenu ToolBar.TagJump Idi na oznaku
+ tmenu ToolBar.Help Pomo
+ tmenu ToolBar.FindHelp Nai objanjenje
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Sintaksa
+menutrans &Show\ File\ Types\ in\ Menu Prikai\ tipove\ fajlova\ u\ &meniju
+menutrans Set\ '&syntax'\ only Pode&si\ samo\ 'syntax'
+menutrans Set\ '&filetype'\ too Podesi\ &takoe\ i\ 'filetype'
+menutrans &Off &Iskljueno
+menutrans &Manual &Runo
+menutrans A&utomatic &Automatski
+menutrans on/off\ for\ &This\ file Da/ne\ za\ ovaj\ &fajl
+menutrans Co&lor\ test Provera\ &boja
+menutrans &Highlight\ test Provera\ isti&canja
+menutrans &Convert\ to\ HTML Pretvori\ &u\ HTML
+
+" dialog texts
+let menutrans_help_dialog = "Unesite naredbu ili re ije pojanjenje traite:\n\nDodajte i_ za naredbe unosa (npr. i_CTRL-X)\nDodajte c_ za naredbe komandnog reima (npr. s_<Del>)\nDodajte ' za imena opcija (npr. 'shiftwidth')"
+
+let g:menutrans_path_dialog = "Unesite putanju pretrage za fajlove\nRazdvojite zarezima imena direktorijuma."
+
+let g:menutrans_tags_dialog = "Unesite imena fajlova sa oznakama\nRazdvojite zarezima imena."
+
+let g:menutrans_textwidth_dialog = "Unesite novu irinu teksta (0 spreava prelom)"
+
+let g:menutrans_fileformat_dialog = "Izaberite format zapisa fajla"
+
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Otkai"
+
+let menutrans_no_file = "[Nema fajla]"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: tw=0 keymap=serbian
diff --git a/runtime/lang/menu_sr_rs.iso_8859-5.vim b/runtime/lang/menu_sr_rs.iso_8859-5.vim
new file mode 100644
index 0000000..536dd27
--- /dev/null
+++ b/runtime/lang/menu_sr_rs.iso_8859-5.vim
@@ -0,0 +1,297 @@
+" Menu Translations: Serbian
+" Maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
+" Last Change: Fri, 30 May 2003 10:17:39 Eastern Daylight Time
+" Adapted for VIM 8 by: on 2017-12-28 12:05+0400
+" Generated from menu_sr_rs.utf-8.vim, DO NOT EDIT
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding iso8859-5
+
+" Help menu
+menutrans &Help &
+menutrans &Overview<Tab><F1> &<Tab><F1>
+menutrans &User\ Manual &\ \
+menutrans &How-to\ links &\ \.\.\.
+menutrans &Find &
+menutrans &Credits &
+menutrans Co&pying &
+menutrans O&rphans &
+menutrans &Sponsor/Register /&\
+menutrans &Version &
+menutrans &About &\
+
+" File menu
+menutrans &File &
+menutrans &Open\.\.\.<Tab>:e &\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &-\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew \ \.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &<Tab>:enew
+menutrans &Close<Tab>:close &<Tab>:close
+menutrans &Save<Tab>:w &<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav \ &\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. \ \ &\ \.\.\.
+menutrans Split\ Patched\ &By\.\.\. &\ \ \ \.\.\.
+menutrans &Print &
+menutrans Sa&ve-Exit<Tab>:wqa \ \ &<Tab>:wqa
+menutrans E&xit<Tab>:qa &<Tab>:qa
+
+" Edit menu
+menutrans &Edit &
+menutrans &Undo<Tab>u &<Tab>u
+menutrans &Redo<Tab>^R &\ <Tab>^R
+menutrans Rep&eat<Tab>\. &<Tab>\.
+menutrans Cu&t<Tab>"+x &<Tab>"+x
+menutrans &Copy<Tab>"+y &<Tab>"+y
+menutrans &Paste<Tab>"+gP &<Tab>"+gP
+menutrans &Paste<Tab>"+P &<Tab>"+P
+menutrans Put\ &Before<Tab>[p \ &<Tab>[p
+menutrans Put\ &After<Tab>]p \ &<Tab>]p
+menutrans &Delete<Tab>x &<Tab>x
+menutrans &Select\ all<Tab>ggVG \ &<Tab>ggVG
+menutrans &Find\.\.\. &\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. \ \ &\.\.\.
+menutrans Settings\ &Window &\
+menutrans Startup\ &Settings &\ \
+menutrans &Global\ Settings &\
+menutrans F&ile\ Settings \ \ &
+menutrans &Shiftwidth &\
+menutrans Soft\ &Tabstop &\
+menutrans Te&xt\ Width\.\.\. &\ \.\.\.
+menutrans &File\ Format\.\.\. &\ \.\.\.
+menutrans Show\ C&olor\ Schemes\ in\ Menu \ \ &\ \
+menutrans C&olor\ Scheme \\ &
+menutrans Show\ &Keymaps\ in\ Menu \ &\ \ \
+menutrans &Keymap &\
+menutrans Select\ Fo&nt\.\.\. \ &\.\.\.
+
+" Edit/Global Settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! \ &\ (/)<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! \ \ &\ (/)<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! \ \ &\ (/)<Tab>:set\ sm!
+menutrans &Context\ lines \ &
+menutrans &Virtual\ Edit \ &
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! \ &\ (/)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! '&Vi'\ \ (/)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. \ &\.\.\.
+menutrans Ta&g\ Files\.\.\. &\ \.\.\.
+menutrans Toggle\ &Toolbar \ \ &\ (/)
+menutrans Toggle\ &Bottom\ Scrollbar \ &\ \ (/)
+menutrans Toggle\ &Left\ Scrollbar &\ \ \ (/)
+menutrans Toggle\ &Right\ Scrollbar &\ \ \ (/)
+
+" Edit/Global Settings/Virtual Edit
+menutrans Never
+menutrans Block\ Selection \
+menutrans Insert\ mode \
+menutrans Block\ and\ Insert \ \
+menutrans Always
+
+" Edit/File Settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! \ &\ \ (/)<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! \ &\ \ \ (/)<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! \ &\ (/)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! \ &\ (/)<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! \ &\ \ (/)<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et! \ \ &\ (/)<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! -&\ (/)<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! &C-\ (/)<Tab>:set\ cin!
+
+" Edit/Keymap
+menutrans None \
+
+" Tools menu
+menutrans &Tools &
+menutrans &Jump\ to\ this\ tag<Tab>g^] \ \ &\ <Tab>g^]
+menutrans Jump\ &back<Tab>^T \ &<Tab>^T
+menutrans Build\ &Tags\ File \ &\
+menutrans &Spelling &
+menutrans &Folding &
+menutrans Create\ &Fold<Tab>zf &\ <Tab>zf
+menutrans &Delete\ Fold<Tab>zd &\ <Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD \ \ &<Tab>zD
+menutrans Fold\ column\ &width \ &\
+"menutrans &Diff &
+menutrans &Make<Tab>:make 'mak&'<Tab>:make
+menutrans &List\ Errors<Tab>:cl \ &<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &\ <Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &\ <Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &\ <Tab>:cp
+menutrans &Older\ List<Tab>:cold \ &<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &\ <Tab>:cnew
+menutrans Error\ &Window \ \ &
+menutrans Se&t\ Compiler &\
+menutrans &Convert\ to\ HEX<Tab>:%!xxd \ \ &ŵ<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r &\ \ \ <Tab>:%!xxd\ -r
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu \ &\ \ \
+
+" Tools/Spelling
+menutrans &Spell\ Check\ On &\ \
+menutrans Spell\ Check\ &Off &\ \
+menutrans To\ &Next\ Error<Tab>]s \ \ &\ <Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s \ \ &\ <Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= \ &<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall &\ <Tab>:spellrepall
+menutrans Set\ Language\ to\ "en" \ \ \ "en"
+menutrans Set\ Language\ to\ "en_au" \ \ \ "en_au"
+menutrans Set\ Language\ to\ "en_ca" \ \ \ "en_ca"
+menutrans Set\ Language\ to\ "en_gb" \ \ \ "en_gb"
+menutrans Set\ Language\ to\ "en_nz" \ \ \ "en_nz"
+menutrans Set\ Language\ to\ "en_us" \ \ \ "en_us"
+menutrans &Find\ More\ Languages \ \
+
+" Tools/Folding
+menutrans &Enable/Disable\ folds<Tab>zi &/\ <Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &\ \ \ <Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx \ &\ \ \ <Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm &\ \ <Tab>zm
+menutrans &Close\ all\ folds<Tab>zM \ &\ <Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr \ &\ <Tab>zr
+menutrans &Open\ all\ folds<Tab>zR &\ \ <Tab>zR
+menutrans Fold\ Met&hod &\
+menutrans Fold\ Col&umn\ Width \ \ \
+
+" Tools/Folding/Fold Method
+menutrans M&anual &
+menutrans I&ndent &
+menutrans E&xpression &
+menutrans S&yntax &
+"menutrans &Diff
+menutrans Ma&rker &
+
+" Tools/Diff
+menutrans &Update &
+menutrans &Get\ Block &\ \ a
+menutrans &Put\ Block &\ \
+
+" Tools/Error Window
+menutrans &Update<Tab>:cwin &<Tab>:cwin
+menutrans &Open<Tab>:copen &<Tab>:copen
+menutrans &Close<Tab>:cclose &<Tab>:cclose
+
+" Bufers menu
+menutrans &Buffers &
+menutrans &Refresh\ menu &
+menutrans Delete &
+menutrans &Alternate &
+menutrans &Next &
+menutrans &Previous &
+menutrans [No\ File] [\ ]
+
+" Window menu
+menutrans &Window &
+menutrans &New<Tab>^Wn &<Tab>^Wn
+menutrans S&plit<Tab>^Ws &<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ \ \ &<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv \ &<Tab>^Wv
+menutrans Split\ File\ E&xplorer \ \ \ &
+menutrans &Close<Tab>^Wc &<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo \ &<Tab>^Wo
+"menutrans Ne&xt<Tab>^Ww &<Tab>^Ww
+"menutrans P&revious<Tab>^WW &<Tab>^WW
+menutrans Move\ &To &
+menutrans Rotate\ &Up<Tab>^WR &\ <Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr \ &<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= &\ <Tab>^W=
+menutrans &Max\ Height<Tab>^W_ \ &<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ &\ <Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| \ &<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| \ &<Tab>^W1\|
+
+" Window/Move To
+menutrans &Top<Tab>^WK &<Tab>^WK
+menutrans &Bottom<Tab>^WJ &<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &<Tab>^WH
+menutrans &Right\ side<Tab>^WL &<Tab>^WL
+
+" The popup menu
+menutrans &Undo &
+menutrans Cu&t &
+menutrans &Copy &
+menutrans &Paste &
+menutrans &Delete &
+menutrans Select\ Blockwise \ &
+menutrans Select\ &Word \ &
+menutrans Select\ &Sentence \ &
+menutrans Select\ Pa&ragraph \ &
+menutrans Select\ &Line \ &
+menutrans Select\ &Block \ &
+menutrans Select\ &All \ &
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open
+ tmenu ToolBar.Save
+ tmenu ToolBar.SaveAll
+ tmenu ToolBar.Print
+ tmenu ToolBar.Undo
+ tmenu ToolBar.Redo
+ tmenu ToolBar.Cut
+ tmenu ToolBar.Copy
+ tmenu ToolBar.Paste
+ tmenu ToolBar.Find
+ tmenu ToolBar.FindNext
+ tmenu ToolBar.FindPrev
+ tmenu ToolBar.Replace
+ tmenu ToolBar.New
+ tmenu ToolBar.WinSplit
+ tmenu ToolBar.WinMax
+ tmenu ToolBar.WinMin
+ tmenu ToolBar.WinVSplit
+ tmenu ToolBar.WinMaxWidth
+ tmenu ToolBar.WinMinWidth
+ tmenu ToolBar.WinClose
+ tmenu ToolBar.LoadSesn
+ tmenu ToolBar.SaveSesn
+ tmenu ToolBar.RunScript
+ tmenu ToolBar.Make 'make'
+ tmenu ToolBar.Shell
+ tmenu ToolBar.RunCtags
+ tmenu ToolBar.TagJump
+ tmenu ToolBar.Help
+ tmenu ToolBar.FindHelp
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &
+menutrans &Show\ File\ Types\ in\ Menu \ \ \ \ &
+menutrans Set\ '&syntax'\ only &\ \ 'syntax'
+menutrans Set\ '&filetype'\ too \ &\ \ 'filetype'
+menutrans &Off &
+menutrans &Manual &
+menutrans A&utomatic &
+menutrans on/off\ for\ &This\ file /\ \ \ &
+menutrans Co&lor\ test \ &
+menutrans &Highlight\ test \ &
+menutrans &Convert\ to\ HTML \ &\ HTML
+
+" dialog texts
+let menutrans_help_dialog = " :\n\n i_ (. i_CTRL-X)\n c_ (. _<Del>)\n ' (. 'shiftwidth')"
+
+let g:menutrans_path_dialog = " \n ."
+
+let g:menutrans_tags_dialog = " \n ."
+
+let g:menutrans_textwidth_dialog = " (0 )"
+
+let g:menutrans_fileformat_dialog = " "
+
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&"
+
+let menutrans_no_file = "[ ]"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: tw=0 keymap=serbian
diff --git a/runtime/lang/menu_sr_rs.utf-8.vim b/runtime/lang/menu_sr_rs.utf-8.vim
new file mode 100644
index 0000000..3d89168
--- /dev/null
+++ b/runtime/lang/menu_sr_rs.utf-8.vim
@@ -0,0 +1,297 @@
+" Menu Translations: Serbian
+" Maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
+" Last Change: Fri, 30 May 2003 10:17:39 Eastern Daylight Time
+" Adapted for VIM 8 by: Иван Пешић on 2017-12-28 12:05+0400
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Help menu
+menutrans &Help Помо&ћ
+menutrans &Overview<Tab><F1> &Преглед<Tab><F1>
+menutrans &User\ Manual &Упутство\ за\ кориснике
+menutrans &How-to\ links &Како\ да\.\.\.
+menutrans &Find &Нађи
+menutrans &Credits &Заслуге
+menutrans Co&pying П&реузимање
+menutrans O&rphans &Сирочићи
+menutrans &Sponsor/Register Спонзор/&Региструјте\ се
+menutrans &Version &Верзија
+menutrans &About &О\ програму
+
+" File menu
+menutrans &File &Фајл
+menutrans &Open\.\.\.<Tab>:e &Отвори\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &Подели-отвори\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew Отвори\ картицу\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Нов<Tab>:enew
+menutrans &Close<Tab>:close &Затвори<Tab>:close
+menutrans &Save<Tab>:w &Сачувај<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Сачувај\ &као\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Подели\ и\ &упореди\ са\.\.\.
+menutrans Split\ Patched\ &By\.\.\. По&дели\ и\ преправи\ са\.\.\.
+menutrans &Print Шта&мпај
+menutrans Sa&ve-Exit<Tab>:wqa Сачувај\ и\ за&врши<Tab>:wqa
+menutrans E&xit<Tab>:qa К&рај<Tab>:qa
+
+" Edit menu
+menutrans &Edit &Уређивање
+menutrans &Undo<Tab>u &Поништи<Tab>u
+menutrans &Redo<Tab>^R &Врати\ измену<Tab>^R
+menutrans Rep&eat<Tab>\. П&онови<Tab>\.
+menutrans Cu&t<Tab>"+x Исе&ци<Tab>"+x
+menutrans &Copy<Tab>"+y &Копирај<Tab>"+y
+menutrans &Paste<Tab>"+gP &Убаци<Tab>"+gP
+menutrans &Paste<Tab>"+P &Убаци<Tab>"+P
+menutrans Put\ &Before<Tab>[p Стави\ испре&д<Tab>[p
+menutrans Put\ &After<Tab>]p Стави\ &иза<Tab>]p
+menutrans &Delete<Tab>x Из&бриши<Tab>x
+menutrans &Select\ all<Tab>ggVG Изабери\ св&е<Tab>ggVG
+menutrans &Find\.\.\. &Нађи\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. Нађи\ и\ &замени\.\.\.
+menutrans Settings\ &Window П&розор\ подешавања
+menutrans Startup\ &Settings По&дешавања\ при\ покретању
+menutrans &Global\ Settings Оп&шта\ подешавања
+menutrans F&ile\ Settings Подешавања\ за\ фај&лове
+menutrans &Shiftwidth &Корак\ увлачења
+menutrans Soft\ &Tabstop &Мека\ табулација
+menutrans Te&xt\ Width\.\.\. &Ширина\ текста\.\.\.
+menutrans &File\ Format\.\.\. &Врста\ фајла\.\.\.
+menutrans Show\ C&olor\ Schemes\ in\ Menu Прикажи\ шеме\ бо&ја\ у\ менију
+menutrans C&olor\ Scheme \Шеме\ бо&ја
+menutrans Show\ &Keymaps\ in\ Menu Прикажи\ прес&ликавања\ тастатуре\ у\ менију
+menutrans &Keymap Прес&ликавања\ тастатуре
+menutrans Select\ Fo&nt\.\.\. Избор\ &фонта\.\.\.
+
+" Edit/Global Settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Истицање\ &шаблона\ (да/не)<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! Занемари\ величину\ &слова\ (да/не)<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Прикажи\ упарену\ &заграду\ (да/не)<Tab>:set\ sm!
+menutrans &Context\ lines Видљиви\ &редови
+menutrans &Virtual\ Edit Виртуелно\ &уређивање
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Режим\ У&метање\ (да/не)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! '&Vi'\ сагласно\ (да/не)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Путања\ &претраге\.\.\.
+menutrans Ta&g\ Files\.\.\. &Фајлови\ ознака\.\.\.
+menutrans Toggle\ &Toolbar Линија\ са\ &алаткама\ (да/не)
+menutrans Toggle\ &Bottom\ Scrollbar Доња\ л&инија\ клизања\ (да/не)
+menutrans Toggle\ &Left\ Scrollbar &Лева\ линија\ клизања\ (да/не)
+menutrans Toggle\ &Right\ Scrollbar &Десна\ линија\ клизања\ (да/не)
+
+" Edit/Global Settings/Virtual Edit
+menutrans Never Никад
+menutrans Block\ Selection Избор\ блока
+menutrans Insert\ mode Режим\ Уметање
+menutrans Block\ and\ Insert Блок\ и\ Уметање
+menutrans Always Увек
+
+" Edit/File Settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Прикажи\ &нумерацију\ линија\ (да/не)<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! Прикажи\ Релати&вну\ нумерацију\ линија\ (да/не)<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Режим\ &листе\ (да/не)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! Обавијање\ &редова\ (да/не)<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! Преломи\ &на\ реч\ (да/не)<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et! Размаци\ уместо\ &табулације\ (да/не)<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! Ауто-&увлачење\ (да/не)<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! &C-увлачење\ (да/не)<Tab>:set\ cin!
+
+" Edit/Keymap
+menutrans None Без\ пресликавања
+
+" Tools menu
+menutrans &Tools &Алатке
+menutrans &Jump\ to\ this\ tag<Tab>g^] Скочи\ на\ &ову\ ознаку<Tab>g^]
+menutrans Jump\ &back<Tab>^T Скочи\ &натраг<Tab>^T
+menutrans Build\ &Tags\ File Изгради\ &фајл\ ознака
+menutrans &Spelling Пра&вопис
+menutrans &Folding &Подвијање
+menutrans Create\ &Fold<Tab>zf С&твори\ свијутак<Tab>zf
+menutrans &Delete\ Fold<Tab>zd О&бриши\ свијутак<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Обриши\ све\ св&ијутке<Tab>zD
+menutrans Fold\ column\ &width Ширина\ &реда\ цвијутка
+"menutrans &Diff &Упоређивање
+menutrans &Make<Tab>:make 'mak&е'<Tab>:make
+menutrans &List\ Errors<Tab>:cl Списак\ &грешака<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Сп&исак\ порука<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn С&ледећа\ грешка<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Пре&тходна\ грешка<Tab>:cp
+menutrans &Older\ List<Tab>:cold Стари\ списа&к<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Но&ви\ списак<Tab>:cnew
+menutrans Error\ &Window Прозор\ са\ г&решкама
+menutrans Se&t\ Compiler И&забери\ преводиоца
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Претвори\ у\ &ХЕКС<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Вр&ати\ у\ првобитан\ облик<Tab>:%!xxd\ -r
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu Прикажи\ поде&шавања\ преводиоца\ у\ менију
+
+" Tools/Spelling
+menutrans &Spell\ Check\ On &Укључи\ проверу\ правописа
+menutrans Spell\ Check\ &Off &Искључи\ проверу\ правописа
+menutrans To\ &Next\ Error<Tab>]s Иди\ на\ &следећу\ грешку<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s Иди\ на\ &претходну\ грешку<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Предложи\ исп&равке<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall П&онови\ исправку<Tab>:spellrepall
+menutrans Set\ Language\ to\ "en" Постави\ језик\ на\ "en"
+menutrans Set\ Language\ to\ "en_au" Постави\ језик\ на\ "en_au"
+menutrans Set\ Language\ to\ "en_ca" Постави\ језик\ на\ "en_ca"
+menutrans Set\ Language\ to\ "en_gb" Постави\ језик\ на\ "en_gb"
+menutrans Set\ Language\ to\ "en_nz" Постави\ језик\ на\ "en_nz"
+menutrans Set\ Language\ to\ "en_us" Постави\ језик\ на\ "en_us"
+menutrans &Find\ More\ Languages Пронађи\ још\ језика
+
+" Tools/Folding
+menutrans &Enable/Disable\ folds<Tab>zi &Омогући/прекини\ свијање<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Покажи\ ред\ са\ курсором<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Покажи\ &само\ ред\ са\ курсором<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm &Затвори\ више\ свијутака<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Затвори\ с&ве\ свијутке<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr Отвори\ виш&е\ свијутака<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR О&твори\ све\ свијутке<Tab>zR
+menutrans Fold\ Met&hod &Начин\ подвијања
+menutrans Fold\ Col&umn\ Width Ширина\ колоне\ испред\ свијутака
+
+" Tools/Folding/Fold Method
+menutrans M&anual &Ручно
+menutrans I&ndent &Увученост
+menutrans E&xpression &Израз
+menutrans S&yntax &Синтакса
+"menutrans &Diff
+menutrans Ma&rker &Ознака
+
+" Tools/Diff
+menutrans &Update &Ажурирај
+menutrans &Get\ Block &Прихвати\ блок\ изменa
+menutrans &Put\ Block Пре&баци\ блок\ измена
+
+" Tools/Error Window
+menutrans &Update<Tab>:cwin &Ажурирај<Tab>:cwin
+menutrans &Open<Tab>:copen &Отвори<Tab>:copen
+menutrans &Close<Tab>:cclose &Затвори<Tab>:cclose
+
+" Bufers menu
+menutrans &Buffers &Бафери
+menutrans &Refresh\ menu &Ажурирај
+menutrans Delete &Обриши
+menutrans &Alternate А&лтернативни
+menutrans &Next &Следећи
+menutrans &Previous &Претходни
+menutrans [No\ File] [Нема\ фајла]
+
+" Window menu
+menutrans &Window &Прозор
+menutrans &New<Tab>^Wn &Нови<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Подели<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Подели\ са\ &алтернативним<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Подели\ &усправно<Tab>^Wv
+menutrans Split\ File\ E&xplorer Подели\ за\ преглед\ &фајлова
+menutrans &Close<Tab>^Wc &Затвори<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Затвори\ &остале<Tab>^Wo
+"menutrans Ne&xt<Tab>^Ww &Следећи<Tab>^Ww
+"menutrans P&revious<Tab>^WW П&ретходни<Tab>^WW
+menutrans Move\ &To Пре&мести
+menutrans Rotate\ &Up<Tab>^WR &Кружно\ нагоре<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Кружно\ надол&е<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= &Исте\ величине<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Максимална\ &висина<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Минима&лна\ висина<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Максимална\ &ширина<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Минимална\ ши&рина<Tab>^W1\|
+
+" Window/Move To
+menutrans &Top<Tab>^WK &Врх<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Подножје<Tab>^WJ
+menutrans &Left\ side<Tab>^WH У&лево<Tab>^WH
+menutrans &Right\ side<Tab>^WL У&десно<Tab>^WL
+
+" The popup menu
+menutrans &Undo &Поништи
+menutrans Cu&t &Исеци
+menutrans &Copy &Копирај
+menutrans &Paste &Убаци
+menutrans &Delete И&збриши
+menutrans Select\ Blockwise Бирај\ б&локовски
+menutrans Select\ &Word Изабери\ &реч
+menutrans Select\ &Sentence Изабери\ р&еченицу
+menutrans Select\ Pa&ragraph Изабери\ &пасус
+menutrans Select\ &Line Изабери\ р&ед
+menutrans Select\ &Block Изабери\ &блок
+menutrans Select\ &All Изабери\ &све
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Учитај
+ tmenu ToolBar.Save Сачувај
+ tmenu ToolBar.SaveAll Сачувај све
+ tmenu ToolBar.Print Штампај
+ tmenu ToolBar.Undo Врати
+ tmenu ToolBar.Redo Поврати
+ tmenu ToolBar.Cut Исеци
+ tmenu ToolBar.Copy Копирај
+ tmenu ToolBar.Paste Убаци
+ tmenu ToolBar.Find Нађи
+ tmenu ToolBar.FindNext Нађи следећи
+ tmenu ToolBar.FindPrev Нађи претходни
+ tmenu ToolBar.Replace Замени
+ tmenu ToolBar.New Нови
+ tmenu ToolBar.WinSplit Подели прозор
+ tmenu ToolBar.WinMax Максимална висина
+ tmenu ToolBar.WinMin Минимална висина
+ tmenu ToolBar.WinVSplit Подели усправно
+ tmenu ToolBar.WinMaxWidth Максимална ширина
+ tmenu ToolBar.WinMinWidth Минимална ширина
+ tmenu ToolBar.WinClose Затвори прозор
+ tmenu ToolBar.LoadSesn Учитај сеансу
+ tmenu ToolBar.SaveSesn Сачувај сеансу
+ tmenu ToolBar.RunScript Изврши спис
+ tmenu ToolBar.Make 'make'
+ tmenu ToolBar.Shell Оперативно окружење
+ tmenu ToolBar.RunCtags Направи ознаке
+ tmenu ToolBar.TagJump Иди на ознаку
+ tmenu ToolBar.Help Помоћ
+ tmenu ToolBar.FindHelp Нађи објашњење
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Синтакса
+menutrans &Show\ File\ Types\ in\ Menu Прикажи\ типове\ фајлова\ у\ &менију
+menutrans Set\ '&syntax'\ only Поде&си\ само\ 'syntax'
+menutrans Set\ '&filetype'\ too Подеси\ &такође\ и\ 'filetype'
+menutrans &Off &Искључено
+menutrans &Manual &Ручно
+menutrans A&utomatic &Аутоматски
+menutrans on/off\ for\ &This\ file Да/не\ за\ овај\ &фајл
+menutrans Co&lor\ test Провера\ &боја
+menutrans &Highlight\ test Провера\ исти&цања
+menutrans &Convert\ to\ HTML Претвори\ &у\ HTML
+
+" dialog texts
+let menutrans_help_dialog = "Унесите наредбу или реч чије појашњење тражите:\n\nДодајте i_ за наредбе уноса (нпр. i_CTRL-X)\nДодајте c_ за наредбе командног режима (нпр. с_<Del>)\nДодајте ' за имена опција (нпр. 'shiftwidth')"
+
+let g:menutrans_path_dialog = "Унесите путању претраге за фајлове\nРаздвојите зарезима имена директоријума."
+
+let g:menutrans_tags_dialog = "Унесите имена фајлова са ознакама\nРаздвојите зарезима имена."
+
+let g:menutrans_textwidth_dialog = "Унесите нову ширину текста (0 спречава прелом)"
+
+let g:menutrans_fileformat_dialog = "Изаберите формат записа фајла"
+
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Откажи"
+
+let menutrans_no_file = "[Нема фајла]"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: tw=0 keymap=serbian
diff --git a/runtime/lang/menu_sr_yu.ascii.vim b/runtime/lang/menu_sr_yu.ascii.vim
new file mode 100644
index 0000000..9d90887
--- /dev/null
+++ b/runtime/lang/menu_sr_yu.ascii.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Serbian
+
+source <sfile>:p:h/menu_sr_rs.ascii.vim
diff --git a/runtime/lang/menu_sr_yu.iso_8859-2.vim b/runtime/lang/menu_sr_yu.iso_8859-2.vim
new file mode 100644
index 0000000..98b209e
--- /dev/null
+++ b/runtime/lang/menu_sr_yu.iso_8859-2.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Serbian
+
+source <sfile>:p:h/menu_sr_rs.iso_8859-2.vim
diff --git a/runtime/lang/menu_sr_yu.iso_8859-5.vim b/runtime/lang/menu_sr_yu.iso_8859-5.vim
new file mode 100644
index 0000000..f0aef77
--- /dev/null
+++ b/runtime/lang/menu_sr_yu.iso_8859-5.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Serbian
+
+source <sfile>:p:h/menu_sr_rs.iso_8859-5.vim
diff --git a/runtime/lang/menu_sr_yu.utf-8.vim b/runtime/lang/menu_sr_yu.utf-8.vim
new file mode 100644
index 0000000..4d278f9
--- /dev/null
+++ b/runtime/lang/menu_sr_yu.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Serbian
+
+source <sfile>:p:h/menu_sr_rs.utf-8.vim
diff --git a/runtime/lang/menu_sv.latin1.vim b/runtime/lang/menu_sv.latin1.vim
new file mode 100644
index 0000000..c5c4671
--- /dev/null
+++ b/runtime/lang/menu_sv.latin1.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Swedish
+
+source <sfile>:p:h/menu_sv_se.latin1.vim
diff --git a/runtime/lang/menu_sv.utf-8.vim b/runtime/lang/menu_sv.utf-8.vim
new file mode 100644
index 0000000..6b4f294
--- /dev/null
+++ b/runtime/lang/menu_sv.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Swedish for UTF-8 encoding
+
+source <sfile>:p:h/menu_sv_se.latin1.vim
diff --git a/runtime/lang/menu_sv_se.latin1.vim b/runtime/lang/menu_sv_se.latin1.vim
new file mode 100644
index 0000000..b10cfd3
--- /dev/null
+++ b/runtime/lang/menu_sv_se.latin1.vim
@@ -0,0 +1,256 @@
+" Menu Translations: Swedish
+" Maintainer: Johan Svedberg <johan@svedberg.com>
+" Last Change: 2020 Apr 22
+" Original translations
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+" The translations below are in latin1, but they work for cp1252 and
+" iso-8859-15 without conversion as well.
+if &enc != "cp1252" && &enc != "iso-8859-15"
+ scriptencoding latin1
+endif
+
+" Help menu
+menutrans &Help &Hjlp
+menutrans &Overview<Tab><F1> &versikt<Tab><F1>
+menutrans &User\ Manual &Anvndarmanual
+menutrans &How-to\ links &Hur-gra-lnkar
+menutrans &Find\.\.\. &Sk\.\.\.
+menutrans &Credits &Tack
+menutrans Co&pying &Kopieringsrttigheter
+menutrans &Sponsor/Register &Sponsra/Registrera
+menutrans O&rphans &Frldralsa
+menutrans &Version &Version
+menutrans &About &Om
+
+" File menu
+menutrans &File &Arkiv
+menutrans &Open\.\.\.<Tab>:e &ppna\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp ppna\ i\ splitt-vy\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew ppna\ flik\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew &Ny<Tab>:enew
+menutrans &Close<Tab>:close S&tng<Tab>:close
+menutrans &Save<Tab>:w &Spara<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Spara\ som\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. Dela\ diff\ med\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Dela\ lappad\ med\.\.\.
+menutrans &Print Skriv\ &ut
+menutrans Sa&ve-Exit<Tab>:wqa Spara\ &och\ avsluta<Tab>:wqa
+menutrans E&xit<Tab>:qa &Avsluta<Tab>:qa
+
+" Edit menu
+menutrans &Edit &Redigera
+menutrans &Undo<Tab>u &ngra<Tab>u
+menutrans &Redo<Tab>^R &Gr\ om<Tab>^R
+menutrans Rep&eat<Tab>\. &Repetera<Tab>\.
+menutrans Cu&t<Tab>"+x Klipp\ &ut<Tab>"+x
+menutrans &Copy<Tab>"+y &Kopiera<Tab>"+y
+menutrans &Paste<Tab>"+gP Klistra\ &in<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Stt\ in\ &fre<Tab>[p
+menutrans Put\ &After<Tab>]p Stt\ in\ &efter<Tab>]p
+menutrans &Select\ All<Tab>ggVG &Markera\ allt<Tab>ggVG
+menutrans &Find\.\.\. &Sk\.\.\.
+menutrans &Find<Tab>/ &Sk<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. Sk\ och\ erstt\.\.\.
+menutrans Find\ and\ Rep&lace<Tab>:%s Sk\ och\ erstt<Tab>:%s
+menutrans Find\ and\ Rep&lace Sk\ och\ erstt
+menutrans Find\ and\ Rep&lace<Tab>:s Sk\ och\ erstt<Tab>:s
+menutrans Settings\ &Window In&stllningar
+menutrans &Global\ Settings Gl&obala\ instllningar
+menutrans F&ile\ Settings Fi&linstllningar
+menutrans C&olor\ Scheme F&rgschema
+menutrans &Keymap &Tangentbordsuppsttning
+
+" Edit.Global Settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Vxla\ mnsterframhvning<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! Vxla\ ignorering\ av\ storlek<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Vxla\ matchningsvisning<Tab>:set\ sm!
+menutrans &Context\ lines Sammanhangsrader
+menutrans &Virtual\ Edit Virtuell\ redigering
+menutrans Never Aldrig
+menutrans Block\ Selection Blockval
+menutrans Insert\ mode Infogningslge
+menutrans Block\ and\ Insert Block\ och\ infogning
+menutrans Always Alltid
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Vxla\ infogningslge<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Vxla\ Vi-kompabilitet<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Skvg\.\.\.
+menutrans Ta&g\ Files\.\.\. Taggfiler\.\.\.
+menutrans Toggle\ &Toolbar Vxla\ verktygsrad
+menutrans Toggle\ &Bottom\ Scrollbar Vxla\ rullningslista\ i\ botten
+menutrans Toggle\ &Left\ Scrollbar Vxla\ vnster\ rullningslista
+menutrans Toggle\ &Right\ Scrollbar Vxla\ hger\ rullningslista
+menutrans None Ingen
+
+" Edit.File Settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Vxla\ radnumrering<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Vxla\ listlge<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Vxla\ radbrytning<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Vxla\ radbrytning\ vid\ ord<tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Vxla\ tab-expandering<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Vxla\ auto-indentering<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Vxla\ C-indentering<Tab>:set\ cin!
+menutrans &Shiftwidth Shiftbredd
+menutrans Soft\ &Tabstop Mjuk\ tab-stopp
+menutrans Te&xt\ Width\.\.\. Textbredd\.\.\.
+menutrans &File\ Format\.\.\. Filformat\.\.\.
+
+" Tools menu
+menutrans &Tools &Verktyg
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Hoppa\ till\ den\ hr\ taggen<Tab>g^]
+menutrans Jump\ &back<Tab>^T Hoppa\ tillbaka<Tab>^T
+menutrans Build\ &Tags\ File Bygg\ taggfil
+menutrans &Make<Tab>:make &Bygg<Tab>:make
+menutrans &List\ Errors<Tab>:cl Listfel<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Listmeddelande<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Nsta\ fel<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Tidigare\ fel<Tab>:cp
+menutrans &Older\ List<Tab>:cold &ldre\ lista<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &Nyare\ lista<Tab>:cnew
+menutrans Error\ &Window Felfnster
+menutrans &Update<Tab>:cwin &Uppdatera<Tab>:cwin
+menutrans &Open<Tab>:copen &ppna<Tab>:copen
+menutrans &Close<Tab>:cclose &Stng<Tab>:cclose
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Konvertera\ till\ HEX<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Konvertera\ tillbaka<Tab>:%!xxd\ -r
+menutrans Se&T\ Compiler Stt\ &kompilerare
+
+" Tools.Spelling
+menutrans &Spelling &Stavning
+menutrans &Spell\ Check\ On &Stavningskontroll\ p
+menutrans &Spell\ Check\ Off Stavningskontroll\ &av
+menutrans To\ &Next\ error<Tab>]s Till\ &nsta\ fel
+menutrans To\ &Previous\ error<Tab>[s Till\ &fregende\ fel
+menutrans Suggest\ &Corrections<Tab>z= Fresl\ &korrigeringar
+menutrans &Repeat\ correction<Tab>:spellrepall &Upprepa\ korrigering
+
+" Tools.Folding
+menutrans &Enable/Disable\ folds<Tab>zi Vxla\ veck<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv Visa\ markrrad<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Visa\ bara\ markrrad<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Stng\ mer\ veck<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Stng\ alla\ veck<Tab>zM
+menutrans O&pen\ more\ folds<Tab>zr ppna\ mer\ veck<Tab>zr
+menutrans &Open\ all\ folds<Tab>zR ppna\ mer\ veck<Tab>zR
+menutrans Fold\ Met&hod Veckmetod
+menutrans M&anual Manual
+menutrans I&ndent Indentering
+menutrans E&xpression Uttryck
+menutrans S&yntax Syntax
+menutrans &Folding Vikning
+menutrans &Diff Differans
+menutrans Ma&rker Markering
+menutrans Create\ &Fold<Tab>zf Skapa\ veck<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Ta\ bort\ veck<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Ta\ bort\ alla\ veck<Tab>zD
+menutrans Fold\ col&umn\ width Veckcolumnsbredd
+
+" Tools.Diff
+menutrans &Update Uppdatera
+menutrans &Get\ Block Hmta\ block
+menutrans &Put\ Block Lmna\ block
+
+" Names for buffer menu.
+menutrans &Buffers &Buffertar
+menutrans &Refresh\ menu Uppdatera\ meny
+menutrans &Delete Ta\ bort
+menutrans &Alternate Alternativ
+menutrans &Next &Nsta
+menutrans &Previous &Tidigare
+
+" Window menu
+menutrans &Window &Fnster
+menutrans &New<Tab>^Wn &Nytt<Tab>^Wn
+menutrans S&plit<Tab>^Ws Dela<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Dela\ till\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Dela\ &vertikalt<Tab>^Wv
+menutrans Split\ File\ E&xplorer Dela\ filhanterare
+menutrans &Close<Tab>^Wc &Stng<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo &Stng\ alla\ andra<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww Nsta<Tab>^Ww
+menutrans P&revious<Tab>^WW &Tidigare<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Samma\ storlek<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ &Maximal\ storlek<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ M&inimal\ storlek<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Maximal\ bredd<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Minimal\ bredd<Tab>^W1\|
+menutrans Move\ &To Flytta\ till
+menutrans &Top<Tab>^WK Toppen<Tab>^WK
+menutrans &Bottom<Tab>^WJ Botten<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Vnstra\ sidan<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Hgra\ sidan<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR Rotera\ upp<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Rotera\ ned<Tab>^Wr
+menutrans Select\ Fo&nt\.\.\. Vlj\ typsnitt\.\.\.
+
+" The popup menu
+menutrans &Undo &ngra
+menutrans Cu&t Klipp\ ut
+menutrans &Copy &Kopiera
+menutrans &Paste &Klistra\ in
+menutrans &Delete &Ta\ bort
+menutrans Select\ Blockwise Markera\ blockvis
+menutrans Select\ &Word Markera\ ord
+menutrans Select\ &Line Markera\ rad
+menutrans Select\ &Block Markera\ block
+menutrans Select\ &All Markera\ allt
+
+" The GUI toolbar (for Win32 or GTK)
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open ppna fil
+ tmenu ToolBar.Save Spara aktuell fil
+ tmenu ToolBar.SaveAll Spara alla filer
+ tmenu ToolBar.Print Skriv ut
+ tmenu ToolBar.Undo ngra
+ tmenu ToolBar.Redo Gr om
+ tmenu ToolBar.Cut Klipp ut
+ tmenu ToolBar.Copy Kopiera
+ tmenu ToolBar.Paste Klistra in
+ tmenu ToolBar.Find Sk...
+ tmenu ToolBar.FindNext Sk nsta
+ tmenu ToolBar.FindPrev Sk tidigare
+ tmenu ToolBar.Replace Sk och erstt...
+ tmenu ToolBar.LoadSesn Ladda session
+ tmenu ToolBar.SaveSesn Spara session
+ tmenu ToolBar.RunScript Kr ett Vim-skript
+ tmenu ToolBar.Make Bygg aktuellt projekt
+ tmenu ToolBar.Shell ppna ett kommandoskal
+ tmenu ToolBar.RunCtags Kr Ctags
+ tmenu ToolBar.TagJump Hoppa till tagg under markr
+ tmenu ToolBar.Help Hjlp
+ tmenu ToolBar.FindHelp Sk i hjlp
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Syntax
+menutrans &Show\ filetypes\ in\ menu &Visa\ filtyper\ i\ meny
+menutrans &Off &Av
+menutrans &Manual &Manuellt
+menutrans A&utomatic Automatiskt
+menutrans on/off\ for\ &This\ file Av/P\ fr\ aktuell\ fil
+menutrans Co&lor\ test Frgtest
+menutrans &Highlight\ test Framhvningstest
+menutrans &Convert\ to\ HTML Konvertera\ till\ &HTML
+
+" dialog texts
+let menutrans_no_file = "[Ingen fil]"
+let menutrans_help_dialog = "Skriv in ett kommando eller ord som du vill ska hjlp p:\n\nBrja med i_ fr infogninglgeskommandon (t.ex. i_CTRL-X)\nBrja med c_ fr kommandoradredigeringskommandon (t.ex. c_<Del>)\nBrja med ' fr ett instllningsnamn (t.ex. 'shiftwidth')"
+let g:menutrans_path_dialog = "Skriv in skvg fr filer.\nSeparera katalognamn med komma"
+let g:menutrans_tags_dialog = "Skriv in namn p taggfiler.\nSeparera namn med komma."
+let g:menutrans_textwidth_dialog = "Vlj ny textbredd (0 fr att frhindra formatering): "
+let g:menutrans_fileformat_dialog = "Vlj filformat som filen ska sparas med"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_sv_se.utf-8.vim b/runtime/lang/menu_sv_se.utf-8.vim
new file mode 100644
index 0000000..6b4f294
--- /dev/null
+++ b/runtime/lang/menu_sv_se.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Swedish for UTF-8 encoding
+
+source <sfile>:p:h/menu_sv_se.latin1.vim
diff --git a/runtime/lang/menu_tr.cp1254.vim b/runtime/lang/menu_tr.cp1254.vim
new file mode 100644
index 0000000..e27de90
--- /dev/null
+++ b/runtime/lang/menu_tr.cp1254.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Turkish
+
+source <sfile>:p:h/menu_tr_tr.cp1254.vim
diff --git a/runtime/lang/menu_tr.iso_8859-9.vim b/runtime/lang/menu_tr.iso_8859-9.vim
new file mode 100644
index 0000000..2c5158d
--- /dev/null
+++ b/runtime/lang/menu_tr.iso_8859-9.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Turkish
+
+source <sfile>:p:h/menu_tr_tr.iso_8859-9.vim
diff --git a/runtime/lang/menu_tr.utf-8.vim b/runtime/lang/menu_tr.utf-8.vim
new file mode 100644
index 0000000..a07a64b
--- /dev/null
+++ b/runtime/lang/menu_tr.utf-8.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Turkish
+
+source <sfile>:p:h/menu_tr_tr.utf-8.vim
diff --git a/runtime/lang/menu_tr_tr.cp1254.vim b/runtime/lang/menu_tr_tr.cp1254.vim
new file mode 100644
index 0000000..db575c2
--- /dev/null
+++ b/runtime/lang/menu_tr_tr.cp1254.vim
@@ -0,0 +1,309 @@
+" Menu Translations: Turkish
+" Maintainer: Emir SARI <bitigchi@me.com>
+" Generated from menu_tr_tr.utf-8.vim, DO NOT EDIT
+
+if exists("did_menu_trans")
+ finish
+endif
+
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+scriptencoding cp1254
+
+" Top
+menutrans &File &Dosya
+menutrans &Edit D&zen
+menutrans &Tools &Aralar
+menutrans &Syntax &Szdizim
+menutrans &Buffers A&rabellekler
+menutrans &Window &Pencere
+menutrans &Help &Yardm
+
+" Help menu
+menutrans &Overview<Tab><F1> &Genel\ Bak<Tab><F1>
+menutrans &User\ Manual &Kullanm\ Klavuzu
+menutrans &How-To\ Links &Nasl\ Yaplr?
+menutrans &Find\.\.\. &Bul\.\.\.
+"--------------------
+menutrans &Credits &Teekkrler
+menutrans Co&pying &Datm
+menutrans &Sponsor/Register &Sponsorluk/Kayt
+menutrans O&rphans &Yetimler
+"--------------------
+menutrans &Version Srm\ &Bilgisi
+menutrans &About &Hakknda
+
+" File menu
+menutrans &Open\.\.\.<Tab>:e &A\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &Yeni\ Blmde\ A\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew S&ekme\ A\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew Yeni\ &Sekme<Tab>:enew
+menutrans &Close<Tab>:close Ka&pat<Tab>:close
+"--------------------
+menutrans &Save<Tab>:w Kayde&t<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav &Farkl\ Kaydet\.\.\.<Tab>:sav
+"--------------------
+menutrans Split\ &Diff\ With\.\.\. Ka&rlatr\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Ya&ma\ le\ Karlatr\.\.\.
+"--------------------
+menutrans &Print Ya&zdr
+menutrans Sa&ve-Exit<Tab>:wqa Kaydet\ &ve\ k<Tab>:wqa
+menutrans E&xit<Tab>:qa &k<Tab>:qa
+
+" Edit menu
+menutrans &Undo<Tab>u &Geri\ Al<Tab>u
+menutrans &Redo<Tab>^R &Yinele<Tab>^R
+menutrans Rep&eat<Tab>\. Son\ Komutu\ Y&inele<Tab>\.
+"--------------------
+menutrans Cu&t<Tab>"+x &Kes<Tab>"+x
+menutrans &Copy<Tab>"+y K&opyala<Tab>"+y
+menutrans &Paste<Tab>"+gP Ya&ptr<Tab>"+gP
+menutrans Put\ &Before<Tab>[p &nne\ Koy<Tab>[p
+menutrans Put\ &After<Tab>]p A&rkasna\ Koy<Tab>]p
+menutrans &Delete<Tab>x Si&l<Tab>x
+menutrans &Select\ All<Tab>ggVG T&mn\ Se<Tab>ggVG
+"--------------------
+" Athena GUI only
+menutrans &Find<Tab>/ &Bul<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s Bul\ &ve\ Deitir<Tab>:%s
+" End Athena GUI only
+menutrans &Find\.\.\.<Tab>/ &Bul\.\.\.<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. Bul\ ve\ &Deitir\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:%s Bul\ ve\ &Deitir\.\.\.<Tab>:%s
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:s Bul\ ve\ &Deitir\.\.\.<Tab>:s
+"--------------------
+menutrans Settings\ &Window &Ayarlar\ Penceresi
+menutrans Startup\ &Settings Balan&g\ Ayarlar
+menutrans &Global\ Settings Ge&nel\ Ayarlar
+menutrans F&ile\ Settings &Dosya\ Ayarlar
+menutrans C&olor\ Scheme &Renk\ Dzeni
+menutrans &Keymap Dme\ &Elem
+menutrans Select\ Fo&nt\.\.\. Ya&ztipi\ Se\.\.\.
+
+">>>----------------- Edit/Global settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Dizgi\ &Vurgulamasn\ A/Kapat<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! BYK/kk\ Harf\ &Duyarl\ A/Kapat<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! E&leen\ kilileri\ A/Kapat<Tab>:set\ sm!
+menutrans &Context\ Lines &mlele\ Oynayan\ Satrlar
+menutrans &Virtual\ Edit &Sanal\ Dzenleme
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Ekleme\ &Kipini\ A/Kapat<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! &Vi\ Uyumlu\ Kipi\ A/Kapat<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. &Arama\ Yolu\.\.\.
+menutrans Ta&g\ Files\.\.\. &Etiket\ Dosyalar\.\.\.
+"
+menutrans Toggle\ &Toolbar &Ara\ ubuunu\ A/Kapat
+menutrans Toggle\ &Bottom\ Scrollbar A&lt\ Kaydrma\ ubuunu\ A/Kapat
+menutrans Toggle\ &Left\ Scrollbar &Sol\ Kaydrma\ ubuunu\ A/Kapat
+menutrans Toggle\ &Right\ Scrollbar S&a\ Kaydrma\ ubuunu\ A/Kapat
+
+">>>->>>------------- Edit/Global settings/Virtual edit
+menutrans Never Kapal
+menutrans Block\ Selection Blok\ Seimi
+menutrans Insert\ Mode Ekleme\ Kipi
+menutrans Block\ and\ Insert Blok\ Seiminde\ ve\ Ekleme\ Kipinde
+menutrans Always Her\ Zaman\ Ak
+">>>----------------- Edit/File settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Satr\ Numaralandrmay\ A/Kapat<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! &Greceli\ Satr\ Numaralandrmay\ A/Kapat<Tab>:set\ nru!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! G&rnmeyen\ Karakterleri\ A/Kapat<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! Sa&tr\ Kaydrmay\ A/Kapat<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! S&zck\ Kaydrmay\ A/Kapat<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding-tab<Tab>:set\ et! S&ekmeleri\ Boluklara\ Dntrmeyi\ A/Kapat<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! &Otomatik\ Girintilemeyi\ A/Kapat<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! &C\ Tarz\ Girintilemeyi\ A/Kapat<Tab>:set\ cin!
+">>>---
+menutrans &Shiftwidth &Girinti\ Dzeyi
+menutrans Soft\ &Tabstop &Sekme\ Genilii
+menutrans Te&xt\ Width\.\.\. &Metin\ Genilii\.\.\.
+menutrans &File\ Format\.\.\. &Dosya\ Biimi\.\.\.
+
+" Tools menu
+menutrans &Jump\ to\ This\ Tag<Tab>g^] &u\ Etikete\ Atla<Tab>g^]
+menutrans Jump\ &Back<Tab>^T &Geri\ Dn<Tab>^T
+menutrans Build\ &Tags\ File &Etiket\ Dosyas\ Olutur
+"-------------------
+menutrans &Folding &Kvrmalar
+menutrans &Spelling &Yazm\ Denetimi
+menutrans &Diff K&arlatrma\ (diff)
+"-------------------
+menutrans &Make<Tab>:make &Derle<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Hatalar\ Listele<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &letileri\ Listele<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Bir\ &Sonraki\ Hata<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Bir\ &nceki\ Hata<Tab>:cp
+menutrans &Older\ List<Tab>:cold Daha\ &Eski\ Hatalar<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Daha\ &Yeni\ Hatalar<Tab>:cnew
+menutrans Error\ &Window Hatalar\ &Penceresi
+menutrans Se&t\ Compiler De&rleyici\ Se
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu Derleyici\ Ayarlarn\ Mende\ &Gster
+"-------------------
+menutrans &Convert\ to\ HEX<Tab>:%!xxd HEX'e\ D&ntr<Tab>:%!xxd
+menutrans Conve&rt\ Back<Tab>:%!xxd\ -r HEX'&ten\ Dntr<Tab>:%!xxd\ -r
+">>>---------------- Tools/Spelling
+menutrans &Spell\ Check\ On Yazm\ Denetimini\ &A
+menutrans Spell\ Check\ &Off Yazm\ Denetimini\ &Kapat
+menutrans To\ &Next\ Error<Tab>]s Bir\ &Sonraki\ Hata<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s Bir\ &nceki\ Hata<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= D&zeltme\ ner<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall Dzeltmeyi\ &Yinele<Tab>spellrepall
+"-------------------
+menutrans Set\ Language\ to\ "en" Dili\ "en"\ yap
+menutrans Set\ Language\ to\ "en_au" Dili\ "en_au"\ yap
+menutrans Set\ Language\ to\ "en_ca" Dili\ "en_ca"\ yap
+menutrans Set\ Language\ to\ "en_gb" Dili\ "en_gb"\ yap
+menutrans Set\ Language\ to\ "en_nz" Dili\ "en_nz"\ yap
+menutrans Set\ Language\ to\ "en_us" Dili\ "en_us"\ yap
+menutrans &Find\ More\ Languages &Baka\ Diller\ Bul
+let g:menutrans_set_lang_to = 'Dil Ykle'
+
+" The Spelling popup menu
+let g:menutrans_spell_change_ARG_to = 'Dzeltilecek:\ "%s"\ ->'
+let g:menutrans_spell_add_ARG_to_word_list = '"%s"\ szcn\ szle\ ekle'
+let g:menutrans_spell_ignore_ARG = '"%s"\ szcn\ yoksay'
+">>>---------------- Folds
+menutrans &Enable/Disable\ Folds<Tab>zi &Kvrmalar\ A/Kapat<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &mlecin\ Olduu\ Satr\ Grntle<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ Only<Tab>zMzx Ya&lnzca\ mlecin\ Olduu\ Satr\ Grntle<Tab>zMzx
+menutrans C&lose\ More\ Folds<Tab>zm &Daha\ Fazla\ Kvrma\ Kapat<Tab>zm
+menutrans &Close\ All\ Folds<Tab>zM Btn\ K&vrmalar\ Kapat<Tab>zM
+menutrans &Open\ All\ Folds<Tab>zR B&tn\ Kvrmalar\ A<Tab>zR
+menutrans O&pen\ More\ Folds<Tab>zr D&aha\ Fazla\ Kvrma\ A<Tab>zr
+menutrans Fold\ Met&hod Kv&rma\ Yntemi
+menutrans Create\ &Fold<Tab>zf Kvrma\ &Olutur<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Kvrma\ &Sil<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD T&m\ Kvrmalar\ Sil<Tab>zD
+menutrans Fold\ col&umn\ Width Kvrma\ Stunu\ &Genilii
+">>>->>>----------- Tools/Folds/Fold Method
+menutrans M&anual &El\ le
+menutrans I&ndent &Girinti
+menutrans E&xpression &fade
+menutrans S&yntax &Szdizim
+menutrans Ma&rker &mleyici
+">>>--------------- Tools/Diff
+menutrans &Update &Gncelle
+menutrans &Get\ Block Blou\ &Al
+menutrans &Put\ Block Blou\ &Koy
+">>>--------------- Tools/Diff/Error window
+menutrans &Update<Tab>:cwin &Gncelle<Tab>:cwin
+menutrans &Close<Tab>:cclose &Kapat<Tab>:cclose
+menutrans &Open<Tab>:copen &A<Tab>:copen
+
+" Syntax menu
+menutrans &Show\ File\ Types\ in\ Menu Dosya\ Trlerini\ Mende\ &Gster
+menutrans Set\ '&syntax'\ only Yalnzca\ 'syntax'\ &Ayarla
+menutrans Set\ '&filetype'\ too 'filetype'\ in\ &de\ Ayarla
+menutrans &Off &Kapat
+menutrans &Manual &El\ le
+menutrans A&utomatic &Otomatik
+menutrans On/Off\ for\ &This\ File &Bu\ Dosya\ in\ A/Kapat
+menutrans Co&lor\ Test &Renk\ Testi
+menutrans &Highlight\ Test &Vurgulama\ Testi
+menutrans &Convert\ to\ HTML &HTML'ye\ Dntr
+
+" Buffers menu
+menutrans &Refresh\ menu &Meny\ Gncelle
+menutrans Delete &Sil
+menutrans &Alternate &teki
+menutrans &Next So&nraki
+menutrans &Previous n&ceki
+menutrans [No\ File] [Dosya\ Yok]
+
+" Window menu
+menutrans &New<Tab>^Wn Yeni\ &Pencere<Tab>^Wn
+menutrans S&plit<Tab>^Ws Pencereyi\ &Bl<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Pencereyi\ Bakasna\ B&l<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Pencereyi\ &Dikey\ Olarak\ Bl<Tab>^Wv
+menutrans Split\ File\ E&xplorer Yeni\ Bl&mde\ Dosya\ Gezginini\ A
+"
+menutrans &Close<Tab>^Wc Pen&cereyi\ Kapat<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Dier\ Pencerele&ri\ Kapat<Tab>^Wo
+"
+menutrans Move\ &To &Ta
+menutrans Rotate\ &Up<Tab>^WR &Yukar\ Ta<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr &Aa\ Ta<Tab>^Wr
+"
+menutrans &Equal\ Size<Tab>^W= &Eit\ Boyut<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ E&n\ Byk\ Ykseklik<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ En\ Kk\ Yksekl&ik<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| En\ Byk\ Gen&ilik<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| En\ Kk\ Genili&k<Tab>^W1\|
+
+">>>----------------- Window/Move To
+menutrans &Top<Tab>^WK &Yukar<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Aa<Tab>^WJ
+menutrans &Left\ Side<Tab>^WH So&la<Tab>^WH
+menutrans &Right\ Side<Tab>^WL &Saa<Tab>^WL
+
+" The popup menu
+menutrans &Undo &Geri\ Al
+menutrans Cu&t &Kes
+menutrans &Copy K&opyala
+menutrans &Paste &Yaptr
+menutrans &Delete &Sil
+menutrans Select\ Blockwise &Blok\ Biiminde\ Se
+menutrans Select\ &Word S&zck\ Se
+menutrans Select\ &Sentence &Tmce\ Se
+menutrans Select\ Pa&ragraph &Paragraf\ Se
+menutrans Select\ &Line S&atr\ Se
+menutrans Select\ &Block Bl&ok\ Se
+menutrans Select\ &All Tm&n\ Se
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Dosya A
+ tmenu ToolBar.Save Dosya Kaydet
+ tmenu ToolBar.SaveAll Tm Dosyalar Kaydet
+ tmenu ToolBar.Print Yazdr
+ tmenu ToolBar.Undo Geri Al
+ tmenu ToolBar.Redo Yinele
+ tmenu ToolBar.Cut Kes
+ tmenu ToolBar.Copy Kopyala
+ tmenu ToolBar.Paste Yaptr
+ tmenu ToolBar.Find Bul...
+ tmenu ToolBar.FindNext Sonrakini Bul
+ tmenu ToolBar.FindPrev ncekini Bul
+ tmenu ToolBar.Replace Bul ve Deitir...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Yeni Pencere
+ tmenu ToolBar.WinSplit Pencereyi Bl
+ tmenu ToolBar.WinMax En Byk Pencere Ykseklii
+ tmenu ToolBar.WinMin En Kk Pencere Ykseklii
+ tmenu ToolBar.WinClose Pencereyi Kapat
+ endif
+ tmenu ToolBar.LoadSesn Oturum Ykle
+ tmenu ToolBar.SaveSesn Oturum Kaydet
+ tmenu ToolBar.RunScript Betik altr
+ tmenu ToolBar.Make Derle
+ tmenu ToolBar.Shell Kabuk
+ tmenu ToolBar.RunCtags Etiket Dosyas Olutur
+ tmenu ToolBar.TagJump Etikete Atla
+ tmenu ToolBar.Help Yardm
+ tmenu ToolBar.FindHelp Yardm Bul
+ endfun
+endif
+
+" Dialog texts
+" Find in help dialog
+let g:menutrans_help_dialog = "Yardm iin komut veya szck girin:\n\nEkleme Kipi komutlarn aramak iin i_ ekleyin (rnein i_CTRL-X)\nNormal Kip komutlarn aramak iin _c ekleyin (rnein c_<Del>)\nSeenekler hakknda yardm almak iin ' ekleyin (rnein 'shiftwidth')"
+
+" Searh path dialog
+let g:menutrans_path_dialog = "Dosya aramas iin yol belirtin.\nDizin adlar virgllerle ayrlr."
+
+" Tag files dialog
+let g:menutrans_tags_dialog = "Etiket dosyas adlar belirtin (virglle ayrarak).\n"
+
+" Text width dialog
+let g:menutrans_textwidth_dialog = "Biimlendirme iin metin geniliini belirtin.\nBiimlendirme iptali iin 0 girin."
+
+" File format dialog
+let g:menutrans_fileformat_dialog = "Dosya biimi sein"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&ptal"
+let menutrans_no_file = "[Dosya Yok]"
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_tr_tr.iso_8859-9.vim b/runtime/lang/menu_tr_tr.iso_8859-9.vim
new file mode 100644
index 0000000..9cfe4f0
--- /dev/null
+++ b/runtime/lang/menu_tr_tr.iso_8859-9.vim
@@ -0,0 +1,309 @@
+" Menu Translations: Turkish
+" Maintainer: Emir SARI <bitigchi@me.com>
+" Generated from menu_tr_tr.utf-8.vim, DO NOT EDIT
+
+if exists("did_menu_trans")
+ finish
+endif
+
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+scriptencoding iso8859-9
+
+" Top
+menutrans &File &Dosya
+menutrans &Edit D&zen
+menutrans &Tools &Aralar
+menutrans &Syntax &Szdizim
+menutrans &Buffers A&rabellekler
+menutrans &Window &Pencere
+menutrans &Help &Yardm
+
+" Help menu
+menutrans &Overview<Tab><F1> &Genel\ Bak<Tab><F1>
+menutrans &User\ Manual &Kullanm\ Klavuzu
+menutrans &How-To\ Links &Nasl\ Yaplr?
+menutrans &Find\.\.\. &Bul\.\.\.
+"--------------------
+menutrans &Credits &Teekkrler
+menutrans Co&pying &Datm
+menutrans &Sponsor/Register &Sponsorluk/Kayt
+menutrans O&rphans &Yetimler
+"--------------------
+menutrans &Version Srm\ &Bilgisi
+menutrans &About &Hakknda
+
+" File menu
+menutrans &Open\.\.\.<Tab>:e &A\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &Yeni\ Blmde\ A\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew S&ekme\ A\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew Yeni\ &Sekme<Tab>:enew
+menutrans &Close<Tab>:close Ka&pat<Tab>:close
+"--------------------
+menutrans &Save<Tab>:w Kayde&t<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav &Farkl\ Kaydet\.\.\.<Tab>:sav
+"--------------------
+menutrans Split\ &Diff\ With\.\.\. Ka&rlatr\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Ya&ma\ le\ Karlatr\.\.\.
+"--------------------
+menutrans &Print Ya&zdr
+menutrans Sa&ve-Exit<Tab>:wqa Kaydet\ &ve\ k<Tab>:wqa
+menutrans E&xit<Tab>:qa &k<Tab>:qa
+
+" Edit menu
+menutrans &Undo<Tab>u &Geri\ Al<Tab>u
+menutrans &Redo<Tab>^R &Yinele<Tab>^R
+menutrans Rep&eat<Tab>\. Son\ Komutu\ Y&inele<Tab>\.
+"--------------------
+menutrans Cu&t<Tab>"+x &Kes<Tab>"+x
+menutrans &Copy<Tab>"+y K&opyala<Tab>"+y
+menutrans &Paste<Tab>"+gP Ya&ptr<Tab>"+gP
+menutrans Put\ &Before<Tab>[p &nne\ Koy<Tab>[p
+menutrans Put\ &After<Tab>]p A&rkasna\ Koy<Tab>]p
+menutrans &Delete<Tab>x Si&l<Tab>x
+menutrans &Select\ All<Tab>ggVG T&mn\ Se<Tab>ggVG
+"--------------------
+" Athena GUI only
+menutrans &Find<Tab>/ &Bul<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s Bul\ &ve\ Deitir<Tab>:%s
+" End Athena GUI only
+menutrans &Find\.\.\.<Tab>/ &Bul\.\.\.<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. Bul\ ve\ &Deitir\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:%s Bul\ ve\ &Deitir\.\.\.<Tab>:%s
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:s Bul\ ve\ &Deitir\.\.\.<Tab>:s
+"--------------------
+menutrans Settings\ &Window &Ayarlar\ Penceresi
+menutrans Startup\ &Settings Balan&g\ Ayarlar
+menutrans &Global\ Settings Ge&nel\ Ayarlar
+menutrans F&ile\ Settings &Dosya\ Ayarlar
+menutrans C&olor\ Scheme &Renk\ Dzeni
+menutrans &Keymap Dme\ &Elem
+menutrans Select\ Fo&nt\.\.\. Ya&ztipi\ Se\.\.\.
+
+">>>----------------- Edit/Global settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Dizgi\ &Vurgulamasn\ A/Kapat<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! BYK/kk\ Harf\ &Duyarl\ A/Kapat<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! E&leen\ kilileri\ A/Kapat<Tab>:set\ sm!
+menutrans &Context\ Lines &mlele\ Oynayan\ Satrlar
+menutrans &Virtual\ Edit &Sanal\ Dzenleme
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Ekleme\ &Kipini\ A/Kapat<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! &Vi\ Uyumlu\ Kipi\ A/Kapat<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. &Arama\ Yolu\.\.\.
+menutrans Ta&g\ Files\.\.\. &Etiket\ Dosyalar\.\.\.
+"
+menutrans Toggle\ &Toolbar &Ara\ ubuunu\ A/Kapat
+menutrans Toggle\ &Bottom\ Scrollbar A&lt\ Kaydrma\ ubuunu\ A/Kapat
+menutrans Toggle\ &Left\ Scrollbar &Sol\ Kaydrma\ ubuunu\ A/Kapat
+menutrans Toggle\ &Right\ Scrollbar S&a\ Kaydrma\ ubuunu\ A/Kapat
+
+">>>->>>------------- Edit/Global settings/Virtual edit
+menutrans Never Kapal
+menutrans Block\ Selection Blok\ Seimi
+menutrans Insert\ Mode Ekleme\ Kipi
+menutrans Block\ and\ Insert Blok\ Seiminde\ ve\ Ekleme\ Kipinde
+menutrans Always Her\ Zaman\ Ak
+">>>----------------- Edit/File settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Satr\ Numaralandrmay\ A/Kapat<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! &Greceli\ Satr\ Numaralandrmay\ A/Kapat<Tab>:set\ nru!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! G&rnmeyen\ Karakterleri\ A/Kapat<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! Sa&tr\ Kaydrmay\ A/Kapat<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! S&zck\ Kaydrmay\ A/Kapat<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding-tab<Tab>:set\ et! S&ekmeleri\ Boluklara\ Dntrmeyi\ A/Kapat<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! &Otomatik\ Girintilemeyi\ A/Kapat<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! &C\ Tarz\ Girintilemeyi\ A/Kapat<Tab>:set\ cin!
+">>>---
+menutrans &Shiftwidth &Girinti\ Dzeyi
+menutrans Soft\ &Tabstop &Sekme\ Genilii
+menutrans Te&xt\ Width\.\.\. &Metin\ Genilii\.\.\.
+menutrans &File\ Format\.\.\. &Dosya\ Biimi\.\.\.
+
+" Tools menu
+menutrans &Jump\ to\ This\ Tag<Tab>g^] &u\ Etikete\ Atla<Tab>g^]
+menutrans Jump\ &Back<Tab>^T &Geri\ Dn<Tab>^T
+menutrans Build\ &Tags\ File &Etiket\ Dosyas\ Olutur
+"-------------------
+menutrans &Folding &Kvrmalar
+menutrans &Spelling &Yazm\ Denetimi
+menutrans &Diff K&arlatrma\ (diff)
+"-------------------
+menutrans &Make<Tab>:make &Derle<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Hatalar\ Listele<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &letileri\ Listele<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Bir\ &Sonraki\ Hata<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Bir\ &nceki\ Hata<Tab>:cp
+menutrans &Older\ List<Tab>:cold Daha\ &Eski\ Hatalar<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Daha\ &Yeni\ Hatalar<Tab>:cnew
+menutrans Error\ &Window Hatalar\ &Penceresi
+menutrans Se&t\ Compiler De&rleyici\ Se
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu Derleyici\ Ayarlarn\ Mende\ &Gster
+"-------------------
+menutrans &Convert\ to\ HEX<Tab>:%!xxd HEX'e\ D&ntr<Tab>:%!xxd
+menutrans Conve&rt\ Back<Tab>:%!xxd\ -r HEX'&ten\ Dntr<Tab>:%!xxd\ -r
+">>>---------------- Tools/Spelling
+menutrans &Spell\ Check\ On Yazm\ Denetimini\ &A
+menutrans Spell\ Check\ &Off Yazm\ Denetimini\ &Kapat
+menutrans To\ &Next\ Error<Tab>]s Bir\ &Sonraki\ Hata<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s Bir\ &nceki\ Hata<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= D&zeltme\ ner<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall Dzeltmeyi\ &Yinele<Tab>spellrepall
+"-------------------
+menutrans Set\ Language\ to\ "en" Dili\ "en"\ yap
+menutrans Set\ Language\ to\ "en_au" Dili\ "en_au"\ yap
+menutrans Set\ Language\ to\ "en_ca" Dili\ "en_ca"\ yap
+menutrans Set\ Language\ to\ "en_gb" Dili\ "en_gb"\ yap
+menutrans Set\ Language\ to\ "en_nz" Dili\ "en_nz"\ yap
+menutrans Set\ Language\ to\ "en_us" Dili\ "en_us"\ yap
+menutrans &Find\ More\ Languages &Baka\ Diller\ Bul
+let g:menutrans_set_lang_to = 'Dil Ykle'
+
+" The Spelling popup menu
+let g:menutrans_spell_change_ARG_to = 'Dzeltilecek:\ "%s"\ ->'
+let g:menutrans_spell_add_ARG_to_word_list = '"%s"\ szcn\ szle\ ekle'
+let g:menutrans_spell_ignore_ARG = '"%s"\ szcn\ yoksay'
+">>>---------------- Folds
+menutrans &Enable/Disable\ Folds<Tab>zi &Kvrmalar\ A/Kapat<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &mlecin\ Olduu\ Satr\ Grntle<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ Only<Tab>zMzx Ya&lnzca\ mlecin\ Olduu\ Satr\ Grntle<Tab>zMzx
+menutrans C&lose\ More\ Folds<Tab>zm &Daha\ Fazla\ Kvrma\ Kapat<Tab>zm
+menutrans &Close\ All\ Folds<Tab>zM Btn\ K&vrmalar\ Kapat<Tab>zM
+menutrans &Open\ All\ Folds<Tab>zR B&tn\ Kvrmalar\ A<Tab>zR
+menutrans O&pen\ More\ Folds<Tab>zr D&aha\ Fazla\ Kvrma\ A<Tab>zr
+menutrans Fold\ Met&hod Kv&rma\ Yntemi
+menutrans Create\ &Fold<Tab>zf Kvrma\ &Olutur<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Kvrma\ &Sil<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD T&m\ Kvrmalar\ Sil<Tab>zD
+menutrans Fold\ col&umn\ Width Kvrma\ Stunu\ &Genilii
+">>>->>>----------- Tools/Folds/Fold Method
+menutrans M&anual &El\ le
+menutrans I&ndent &Girinti
+menutrans E&xpression &fade
+menutrans S&yntax &Szdizim
+menutrans Ma&rker &mleyici
+">>>--------------- Tools/Diff
+menutrans &Update &Gncelle
+menutrans &Get\ Block Blou\ &Al
+menutrans &Put\ Block Blou\ &Koy
+">>>--------------- Tools/Diff/Error window
+menutrans &Update<Tab>:cwin &Gncelle<Tab>:cwin
+menutrans &Close<Tab>:cclose &Kapat<Tab>:cclose
+menutrans &Open<Tab>:copen &A<Tab>:copen
+
+" Syntax menu
+menutrans &Show\ File\ Types\ in\ Menu Dosya\ Trlerini\ Mende\ &Gster
+menutrans Set\ '&syntax'\ only Yalnzca\ 'syntax'\ &Ayarla
+menutrans Set\ '&filetype'\ too 'filetype'\ in\ &de\ Ayarla
+menutrans &Off &Kapat
+menutrans &Manual &El\ le
+menutrans A&utomatic &Otomatik
+menutrans On/Off\ for\ &This\ File &Bu\ Dosya\ in\ A/Kapat
+menutrans Co&lor\ Test &Renk\ Testi
+menutrans &Highlight\ Test &Vurgulama\ Testi
+menutrans &Convert\ to\ HTML &HTML'ye\ Dntr
+
+" Buffers menu
+menutrans &Refresh\ menu &Meny\ Gncelle
+menutrans Delete &Sil
+menutrans &Alternate &teki
+menutrans &Next So&nraki
+menutrans &Previous n&ceki
+menutrans [No\ File] [Dosya\ Yok]
+
+" Window menu
+menutrans &New<Tab>^Wn Yeni\ &Pencere<Tab>^Wn
+menutrans S&plit<Tab>^Ws Pencereyi\ &Bl<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Pencereyi\ Bakasna\ B&l<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Pencereyi\ &Dikey\ Olarak\ Bl<Tab>^Wv
+menutrans Split\ File\ E&xplorer Yeni\ Bl&mde\ Dosya\ Gezginini\ A
+"
+menutrans &Close<Tab>^Wc Pen&cereyi\ Kapat<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Dier\ Pencerele&ri\ Kapat<Tab>^Wo
+"
+menutrans Move\ &To &Ta
+menutrans Rotate\ &Up<Tab>^WR &Yukar\ Ta<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr &Aa\ Ta<Tab>^Wr
+"
+menutrans &Equal\ Size<Tab>^W= &Eit\ Boyut<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ E&n\ Byk\ Ykseklik<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ En\ Kk\ Yksekl&ik<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| En\ Byk\ Gen&ilik<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| En\ Kk\ Genili&k<Tab>^W1\|
+
+">>>----------------- Window/Move To
+menutrans &Top<Tab>^WK &Yukar<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Aa<Tab>^WJ
+menutrans &Left\ Side<Tab>^WH So&la<Tab>^WH
+menutrans &Right\ Side<Tab>^WL &Saa<Tab>^WL
+
+" The popup menu
+menutrans &Undo &Geri\ Al
+menutrans Cu&t &Kes
+menutrans &Copy K&opyala
+menutrans &Paste &Yaptr
+menutrans &Delete &Sil
+menutrans Select\ Blockwise &Blok\ Biiminde\ Se
+menutrans Select\ &Word S&zck\ Se
+menutrans Select\ &Sentence &Tmce\ Se
+menutrans Select\ Pa&ragraph &Paragraf\ Se
+menutrans Select\ &Line S&atr\ Se
+menutrans Select\ &Block Bl&ok\ Se
+menutrans Select\ &All Tm&n\ Se
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Dosya A
+ tmenu ToolBar.Save Dosya Kaydet
+ tmenu ToolBar.SaveAll Tm Dosyalar Kaydet
+ tmenu ToolBar.Print Yazdr
+ tmenu ToolBar.Undo Geri Al
+ tmenu ToolBar.Redo Yinele
+ tmenu ToolBar.Cut Kes
+ tmenu ToolBar.Copy Kopyala
+ tmenu ToolBar.Paste Yaptr
+ tmenu ToolBar.Find Bul...
+ tmenu ToolBar.FindNext Sonrakini Bul
+ tmenu ToolBar.FindPrev ncekini Bul
+ tmenu ToolBar.Replace Bul ve Deitir...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Yeni Pencere
+ tmenu ToolBar.WinSplit Pencereyi Bl
+ tmenu ToolBar.WinMax En Byk Pencere Ykseklii
+ tmenu ToolBar.WinMin En Kk Pencere Ykseklii
+ tmenu ToolBar.WinClose Pencereyi Kapat
+ endif
+ tmenu ToolBar.LoadSesn Oturum Ykle
+ tmenu ToolBar.SaveSesn Oturum Kaydet
+ tmenu ToolBar.RunScript Betik altr
+ tmenu ToolBar.Make Derle
+ tmenu ToolBar.Shell Kabuk
+ tmenu ToolBar.RunCtags Etiket Dosyas Olutur
+ tmenu ToolBar.TagJump Etikete Atla
+ tmenu ToolBar.Help Yardm
+ tmenu ToolBar.FindHelp Yardm Bul
+ endfun
+endif
+
+" Dialog texts
+" Find in help dialog
+let g:menutrans_help_dialog = "Yardm iin komut veya szck girin:\n\nEkleme Kipi komutlarn aramak iin i_ ekleyin (rnein i_CTRL-X)\nNormal Kip komutlarn aramak iin _c ekleyin (rnein c_<Del>)\nSeenekler hakknda yardm almak iin ' ekleyin (rnein 'shiftwidth')"
+
+" Searh path dialog
+let g:menutrans_path_dialog = "Dosya aramas iin yol belirtin.\nDizin adlar virgllerle ayrlr."
+
+" Tag files dialog
+let g:menutrans_tags_dialog = "Etiket dosyas adlar belirtin (virglle ayrarak).\n"
+
+" Text width dialog
+let g:menutrans_textwidth_dialog = "Biimlendirme iin metin geniliini belirtin.\nBiimlendirme iptali iin 0 girin."
+
+" File format dialog
+let g:menutrans_fileformat_dialog = "Dosya biimi sein"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&ptal"
+let menutrans_no_file = "[Dosya Yok]"
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_tr_tr.utf-8.vim b/runtime/lang/menu_tr_tr.utf-8.vim
new file mode 100644
index 0000000..ef0f290
--- /dev/null
+++ b/runtime/lang/menu_tr_tr.utf-8.vim
@@ -0,0 +1,309 @@
+" Menu Translations: Turkish
+" Maintainer: Emir SARI <bitigchi@me.com>
+" Original translations
+
+if exists("did_menu_trans")
+ finish
+endif
+
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+scriptencoding utf-8
+
+" Top
+menutrans &File &Dosya
+menutrans &Edit Dü&zen
+menutrans &Tools &Araçlar
+menutrans &Syntax &Sözdizim
+menutrans &Buffers A&rabellekler
+menutrans &Window &Pencere
+menutrans &Help &Yardım
+
+" Help menu
+menutrans &Overview<Tab><F1> &Genel\ Bakış<Tab><F1>
+menutrans &User\ Manual &Kullanım\ Kılavuzu
+menutrans &How-To\ Links &Nasıl\ Yapılır?
+menutrans &Find\.\.\. &Bul\.\.\.
+"--------------------
+menutrans &Credits &Teşekkürler
+menutrans Co&pying &Dağıtım
+menutrans &Sponsor/Register &Sponsorluk/Kayıt
+menutrans O&rphans &Yetimler
+"--------------------
+menutrans &Version Sürüm\ &Bilgisi
+menutrans &About &Hakkında
+
+" File menu
+menutrans &Open\.\.\.<Tab>:e &Aç\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &Yeni\ Bölümde\ Aç\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew S&ekme\ Aç\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew Yeni\ &Sekme<Tab>:enew
+menutrans &Close<Tab>:close Ka&pat<Tab>:close
+"--------------------
+menutrans &Save<Tab>:w Kayde&t<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav &Farklı\ Kaydet\.\.\.<Tab>:sav
+"--------------------
+menutrans Split\ &Diff\ With\.\.\. Ka&rşılaştır\.\.\.
+menutrans Split\ Patched\ &By\.\.\. Ya&ma\ İle\ Karşılaştır\.\.\.
+"--------------------
+menutrans &Print Ya&zdır
+menutrans Sa&ve-Exit<Tab>:wqa Kaydet\ &ve\ Çık<Tab>:wqa
+menutrans E&xit<Tab>:qa Çı&k<Tab>:qa
+
+" Edit menu
+menutrans &Undo<Tab>u &Geri\ Al<Tab>u
+menutrans &Redo<Tab>^R &Yinele<Tab>^R
+menutrans Rep&eat<Tab>\. Son\ Komutu\ Y&inele<Tab>\.
+"--------------------
+menutrans Cu&t<Tab>"+x &Kes<Tab>"+x
+menutrans &Copy<Tab>"+y K&opyala<Tab>"+y
+menutrans &Paste<Tab>"+gP Ya&pıştır<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Ö&nüne\ Koy<Tab>[p
+menutrans Put\ &After<Tab>]p A&rkasına\ Koy<Tab>]p
+menutrans &Delete<Tab>x Si&l<Tab>x
+menutrans &Select\ All<Tab>ggVG Tü&münü\ Seç<Tab>ggVG
+"--------------------
+" Athena GUI only
+menutrans &Find<Tab>/ &Bul<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s Bul\ &ve\ Değiştir<Tab>:%s
+" End Athena GUI only
+menutrans &Find\.\.\.<Tab>/ &Bul\.\.\.<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. Bul\ ve\ &Değiştir\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:%s Bul\ ve\ &Değiştir\.\.\.<Tab>:%s
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:s Bul\ ve\ &Değiştir\.\.\.<Tab>:s
+"--------------------
+menutrans Settings\ &Window &Ayarlar\ Penceresi
+menutrans Startup\ &Settings Başlan&gıç\ Ayarları
+menutrans &Global\ Settings Ge&nel\ Ayarlar
+menutrans F&ile\ Settings &Dosya\ Ayarları
+menutrans C&olor\ Scheme &Renk\ Düzeni
+menutrans &Keymap Düğme\ &Eşlem
+menutrans Select\ Fo&nt\.\.\. Ya&zıtipi\ Seç\.\.\.
+
+">>>----------------- Edit/Global settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Dizgi\ &Vurgulamasını\ Aç/Kapat<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! BÜYÜK/küçük\ Harf\ &Duyarlı\ Aç/Kapat<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! Eş&leşen\ İkilileri\ Aç/Kapat<Tab>:set\ sm!
+menutrans &Context\ Lines İ&mleçle\ Oynayan\ Satırlar
+menutrans &Virtual\ Edit &Sanal\ Düzenleme
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Ekleme\ &Kipini\ Aç/Kapat<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! &Vi\ Uyumlu\ Kipi\ Aç/Kapat<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. &Arama\ Yolu\.\.\.
+menutrans Ta&g\ Files\.\.\. &Etiket\ Dosyaları\.\.\.
+"
+menutrans Toggle\ &Toolbar &Araç\ Çubuğunu\ Aç/Kapat
+menutrans Toggle\ &Bottom\ Scrollbar A&lt\ Kaydırma\ Çubuğunu\ Aç/Kapat
+menutrans Toggle\ &Left\ Scrollbar &Sol\ Kaydırma\ Çubuğunu\ Aç/Kapat
+menutrans Toggle\ &Right\ Scrollbar S&ağ\ Kaydırma\ Çubuğunu\ Aç/Kapat
+
+">>>->>>------------- Edit/Global settings/Virtual edit
+menutrans Never Kapalı
+menutrans Block\ Selection Blok\ Seçimi
+menutrans Insert\ Mode Ekleme\ Kipi
+menutrans Block\ and\ Insert Blok\ Seçiminde\ ve\ Ekleme\ Kipinde
+menutrans Always Her\ Zaman\ Açık
+">>>----------------- Edit/File settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Satır\ Numaralandırmayı\ Aç/Kapat<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! &Göreceli\ Satır\ Numaralandırmayı\ Aç/Kapat<Tab>:set\ nru!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Gö&rünmeyen\ Karakterleri\ Aç/Kapat<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! Sa&tır\ Kaydırmayı\ Aç/Kapat<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! Sö&zcük\ Kaydırmayı\ Aç/Kapat<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding-tab<Tab>:set\ et! S&ekmeleri\ Boşluklara\ Dönüştürmeyi\ Aç/Kapat<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! &Otomatik\ Girintilemeyi\ Aç/Kapat<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! &C\ Tarzı\ Girintilemeyi\ Aç/Kapat<Tab>:set\ cin!
+">>>---
+menutrans &Shiftwidth &Girinti\ Düzeyi
+menutrans Soft\ &Tabstop &Sekme\ Genişliği
+menutrans Te&xt\ Width\.\.\. &Metin\ Genişliği\.\.\.
+menutrans &File\ Format\.\.\. &Dosya\ Biçimi\.\.\.
+
+" Tools menu
+menutrans &Jump\ to\ This\ Tag<Tab>g^] Ş&u\ Etikete\ Atla<Tab>g^]
+menutrans Jump\ &Back<Tab>^T &Geri\ Dön<Tab>^T
+menutrans Build\ &Tags\ File &Etiket\ Dosyası\ Oluştur
+"-------------------
+menutrans &Folding &Kıvırmalar
+menutrans &Spelling &Yazım\ Denetimi
+menutrans &Diff K&arşılaştırma\ (diff)
+"-------------------
+menutrans &Make<Tab>:make &Derle<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Hataları\ Listele<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! İ&letileri\ Listele<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn Bir\ &Sonraki\ Hata<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Bir\ Ö&nceki\ Hata<Tab>:cp
+menutrans &Older\ List<Tab>:cold Daha\ &Eski\ Hatalar<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Daha\ &Yeni\ Hatalar<Tab>:cnew
+menutrans Error\ &Window Hatalar\ &Penceresi
+menutrans Se&t\ Compiler De&rleyici\ Seç
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu Derleyici\ Ayarlarını\ Menüde\ &Göster
+"-------------------
+menutrans &Convert\ to\ HEX<Tab>:%!xxd HEX'e\ Dö&nüştür<Tab>:%!xxd
+menutrans Conve&rt\ Back<Tab>:%!xxd\ -r HEX'&ten\ Dönüştür<Tab>:%!xxd\ -r
+">>>---------------- Tools/Spelling
+menutrans &Spell\ Check\ On Yazım\ Denetimini\ &Aç
+menutrans Spell\ Check\ &Off Yazım\ Denetimini\ &Kapat
+menutrans To\ &Next\ Error<Tab>]s Bir\ &Sonraki\ Hata<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s Bir\ Ö&nceki\ Hata<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= Dü&zeltme\ Öner<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall Düzeltmeyi\ &Yinele<Tab>spellrepall
+"-------------------
+menutrans Set\ Language\ to\ "en" Dili\ "en"\ yap
+menutrans Set\ Language\ to\ "en_au" Dili\ "en_au"\ yap
+menutrans Set\ Language\ to\ "en_ca" Dili\ "en_ca"\ yap
+menutrans Set\ Language\ to\ "en_gb" Dili\ "en_gb"\ yap
+menutrans Set\ Language\ to\ "en_nz" Dili\ "en_nz"\ yap
+menutrans Set\ Language\ to\ "en_us" Dili\ "en_us"\ yap
+menutrans &Find\ More\ Languages &Başka\ Diller\ Bul
+let g:menutrans_set_lang_to = 'Dil Yükle'
+
+" The Spelling popup menu
+let g:menutrans_spell_change_ARG_to = 'Düzeltilecek:\ "%s"\ ->'
+let g:menutrans_spell_add_ARG_to_word_list = '"%s"\ sözcüğünü\ sözlüğe\ ekle'
+let g:menutrans_spell_ignore_ARG = '"%s"\ sözcüğünü\ yoksay'
+">>>---------------- Folds
+menutrans &Enable/Disable\ Folds<Tab>zi &Kıvırmaları\ Aç/Kapat<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv İ&mlecin\ Olduğu\ Satırı\ Görüntüle<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ Only<Tab>zMzx Ya&lnızca\ İmlecin\ Olduğu\ Satırı\ Görüntüle<Tab>zMzx
+menutrans C&lose\ More\ Folds<Tab>zm &Daha\ Fazla\ Kıvırma\ Kapat<Tab>zm
+menutrans &Close\ All\ Folds<Tab>zM Bütün\ Kı&vırmaları\ Kapat<Tab>zM
+menutrans &Open\ All\ Folds<Tab>zR Bü&tün\ Kıvırmaları\ Aç<Tab>zR
+menutrans O&pen\ More\ Folds<Tab>zr D&aha\ Fazla\ Kıvırma\ Aç<Tab>zr
+menutrans Fold\ Met&hod Kıvı&rma\ Yöntemi
+menutrans Create\ &Fold<Tab>zf Kıvırma\ &Oluştur<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Kıvırma\ &Sil<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Tü&m\ Kıvırmaları\ Sil<Tab>zD
+menutrans Fold\ col&umn\ Width Kıvırma\ Sütunu\ &Genişliği
+">>>->>>----------- Tools/Folds/Fold Method
+menutrans M&anual &El\ İle
+menutrans I&ndent &Girinti
+menutrans E&xpression İ&fade
+menutrans S&yntax &Sözdizim
+menutrans Ma&rker İ&mleyici
+">>>--------------- Tools/Diff
+menutrans &Update &Güncelle
+menutrans &Get\ Block Bloğu\ &Al
+menutrans &Put\ Block Bloğu\ &Koy
+">>>--------------- Tools/Diff/Error window
+menutrans &Update<Tab>:cwin &Güncelle<Tab>:cwin
+menutrans &Close<Tab>:cclose &Kapat<Tab>:cclose
+menutrans &Open<Tab>:copen &Aç<Tab>:copen
+
+" Syntax menu
+menutrans &Show\ File\ Types\ in\ Menu Dosya\ Türlerini\ Menüde\ &Göster
+menutrans Set\ '&syntax'\ only Yalnızca\ 'syntax'\ &Ayarla
+menutrans Set\ '&filetype'\ too 'filetype'\ İçin\ &de\ Ayarla
+menutrans &Off &Kapat
+menutrans &Manual &El\ İle
+menutrans A&utomatic &Otomatik
+menutrans On/Off\ for\ &This\ File &Bu\ Dosya\ İçin\ Aç/Kapat
+menutrans Co&lor\ Test &Renk\ Testi
+menutrans &Highlight\ Test &Vurgulama\ Testi
+menutrans &Convert\ to\ HTML &HTML'ye\ Dönüştür
+
+" Buffers menu
+menutrans &Refresh\ menu &Menüyü\ Güncelle
+menutrans Delete &Sil
+menutrans &Alternate Ö&teki
+menutrans &Next So&nraki
+menutrans &Previous Ön&ceki
+menutrans [No\ File] [Dosya\ Yok]
+
+" Window menu
+menutrans &New<Tab>^Wn Yeni\ &Pencere<Tab>^Wn
+menutrans S&plit<Tab>^Ws Pencereyi\ &Böl<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Pencereyi\ Başkasına\ Bö&l<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Pencereyi\ &Dikey\ Olarak\ Böl<Tab>^Wv
+menutrans Split\ File\ E&xplorer Yeni\ Bölü&mde\ Dosya\ Gezginini\ Aç
+"
+menutrans &Close<Tab>^Wc Pen&cereyi\ Kapat<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Diğer\ Pencerele&ri\ Kapat<Tab>^Wo
+"
+menutrans Move\ &To &Taşı
+menutrans Rotate\ &Up<Tab>^WR &Yukarı\ Taşı<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr &Aşağı\ Taşı<Tab>^Wr
+"
+menutrans &Equal\ Size<Tab>^W= &Eşit\ Boyut<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ E&n\ Büyük\ Yükseklik<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ En\ Küçük\ Yüksekl&ik<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| En\ Büyük\ Gen&işlik<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| En\ Küçük\ Genişli&k<Tab>^W1\|
+
+">>>----------------- Window/Move To
+menutrans &Top<Tab>^WK &Yukarı<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Aşağı<Tab>^WJ
+menutrans &Left\ Side<Tab>^WH So&la<Tab>^WH
+menutrans &Right\ Side<Tab>^WL &Sağa<Tab>^WL
+
+" The popup menu
+menutrans &Undo &Geri\ Al
+menutrans Cu&t &Kes
+menutrans &Copy K&opyala
+menutrans &Paste &Yapıştır
+menutrans &Delete &Sil
+menutrans Select\ Blockwise &Blok\ Biçiminde\ Seç
+menutrans Select\ &Word Sö&zcük\ Seç
+menutrans Select\ &Sentence &Tümce\ Seç
+menutrans Select\ Pa&ragraph &Paragraf\ Seç
+menutrans Select\ &Line S&atır\ Seç
+menutrans Select\ &Block Bl&ok\ Seç
+menutrans Select\ &All Tümü&nü\ Seç
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Dosya Aç
+ tmenu ToolBar.Save Dosya Kaydet
+ tmenu ToolBar.SaveAll Tüm Dosyaları Kaydet
+ tmenu ToolBar.Print Yazdır
+ tmenu ToolBar.Undo Geri Al
+ tmenu ToolBar.Redo Yinele
+ tmenu ToolBar.Cut Kes
+ tmenu ToolBar.Copy Kopyala
+ tmenu ToolBar.Paste Yapıştır
+ tmenu ToolBar.Find Bul...
+ tmenu ToolBar.FindNext Sonrakini Bul
+ tmenu ToolBar.FindPrev Öncekini Bul
+ tmenu ToolBar.Replace Bul ve Değiştir...
+ if 0 " disabled; These are in the Windows menu
+ tmenu ToolBar.New Yeni Pencere
+ tmenu ToolBar.WinSplit Pencereyi Böl
+ tmenu ToolBar.WinMax En Büyük Pencere Yüksekliği
+ tmenu ToolBar.WinMin En Küçük Pencere Yüksekliği
+ tmenu ToolBar.WinClose Pencereyi Kapat
+ endif
+ tmenu ToolBar.LoadSesn Oturum Yükle
+ tmenu ToolBar.SaveSesn Oturum Kaydet
+ tmenu ToolBar.RunScript Betik Çalıştır
+ tmenu ToolBar.Make Derle
+ tmenu ToolBar.Shell Kabuk
+ tmenu ToolBar.RunCtags Etiket Dosyası Oluştur
+ tmenu ToolBar.TagJump Etikete Atla
+ tmenu ToolBar.Help Yardım
+ tmenu ToolBar.FindHelp Yardım Bul
+ endfun
+endif
+
+" Dialog texts
+" Find in help dialog
+let g:menutrans_help_dialog = "Yardım için komut veya sözcük girin:\n\nEkleme Kipi komutlarını aramak için i_ ekleyin (örneğin i_CTRL-X)\nNormal Kip komutlarını aramak için _c ekleyin (örneğin c_<Del>)\nSeçenekler hakkında yardım almak için ' ekleyin (örneğin 'shiftwidth')"
+
+" Searh path dialog
+let g:menutrans_path_dialog = "Dosya araması için yol belirtin.\nDizin adları virgüllerle ayrılır."
+
+" Tag files dialog
+let g:menutrans_tags_dialog = "Etiket dosyası adları belirtin (virgülle ayırarak).\n"
+
+" Text width dialog
+let g:menutrans_textwidth_dialog = "Biçimlendirme için metin genişliğini belirtin.\nBiçimlendirme iptali için 0 girin."
+
+" File format dialog
+let g:menutrans_fileformat_dialog = "Dosya biçimi seçin"
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\nİ&ptal"
+let menutrans_no_file = "[Dosya Yok]"
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_uk_ua.cp1251.vim b/runtime/lang/menu_uk_ua.cp1251.vim
new file mode 100644
index 0000000..d672934
--- /dev/null
+++ b/runtime/lang/menu_uk_ua.cp1251.vim
@@ -0,0 +1,252 @@
+" Menu Translations: Ukrainian
+" Maintainer: Bohdan Vlasyuk <bohdan@vstu.edu.ua>
+" Last Change: 11 Oct 2001
+" Generated from menu_uk_ua.utf-8.vim, DO NOT EDIT
+
+"
+" Please, see readme at htpp://www.vstu.edu.ua/~bohdan/vim before any
+" complains, and even if you won't complain, read it anyway.
+"
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding cp1251
+
+" Help menu
+menutrans &Help &
+menutrans &Overview<Tab><F1> &\ <Tab><F1>
+menutrans &User\ Manual &\ \
+menutrans &How-to\ links &-?
+"menutrans &GUI &GIU
+menutrans &Credits &
+menutrans Co&pying &
+menutrans O&rphans &\
+menutrans &Version &
+menutrans &About \ &
+
+" File menu
+menutrans &File &
+menutrans &Open\.\.\.<Tab>:e &³\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &\ \.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &<Tab>:enew
+menutrans &Close<Tab>:close &<Tab>:close
+menutrans &Save<Tab>:w &'<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav '\ &\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. &\ \.\.\.
+menutrans Split\ Patched\ &By\.\.\. &\.\.\.
+menutrans &Print &
+menutrans Sa&ve-Exit<Tab>:wqa \ \ &<Tab>:wqa
+menutrans E&xit<Tab>:qa &<Tab>:qa
+
+" Edit menu
+menutrans &Edit &
+menutrans &Undo<Tab>u &³<Tab>u
+menutrans &Redo<Tab>^R &<Tab>^R
+menutrans Rep&eat<Tab>\. &<Tab>\.
+menutrans Cu&t<Tab>"+x &<Tab>"+x
+menutrans &Copy<Tab>"+y &<Tab>"+y
+menutrans &Paste<Tab>"+gP &<Tab>"+gP
+menutrans Put\ &Before<Tab>[p \ &<Tab>[p
+menutrans Put\ &After<Tab>]p \ &<Tab>]p
+menutrans &Select\ all<Tab>ggVG &\ <Tab>ggVG
+menutrans &Find\.\.\. &\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. &\.\.\.
+menutrans Settings\ &Window ³\ &
+menutrans &Global\ Settings \ &
+menutrans F&ile\ Settings \ \ &
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &\ <Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! \ &\ <Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! \ &<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! \ \ &<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! \ \ &<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! \ &<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! ³\ \ \ &C<Tab>:set\ cin!
+menutrans &Shiftwidth &
+menutrans Te&xt\ Width\.\.\. &\ \.\.\.
+menutrans &File\ Format\.\.\. &\ \.\.\.
+menutrans Soft\ &Tabstop \ &
+menutrans C&olor\ Scheme &
+menutrans Select\ Fo&nt\.\.\. \ &\.\.\.
+
+
+menutrans &Keymap \
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! \ &<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &\ \\ \ \ <Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! &\ <Tab>:set\ sm!
+menutrans &Context\ lines ʳ\ &\
+menutrans &Virtual\ Edit \ &\ \
+
+menutrans Never ͳ
+menutrans Block\ Selection \
+menutrans Insert\ mode \
+menutrans Block\ and\ Insert \ \
+menutrans Always
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! \ &<Tab>:set\ im!
+menutrans Search\ &Path\.\.\. &\ \.\.\.
+menutrans Ta&g\ Files\.\.\. \ &\.\.\.
+
+
+"
+" GUI options
+menutrans Toggle\ &Toolbar \ &
+menutrans Toggle\ &Bottom\ Scrollbar &\ \
+menutrans Toggle\ &Left\ Scrollbar &˳\ \
+menutrans Toggle\ &Right\ Scrollbar &\ \
+
+" Programming menu
+menutrans &Tools &
+menutrans &Jump\ to\ this\ tag<Tab>g^] &\ \ <Tab>g^]
+menutrans Jump\ &back<Tab>^T &<Tab>^T
+menutrans Build\ &Tags\ File &\ \
+" Folding
+menutrans &Folding &
+menutrans &Enable/Disable\ folds<Tab>zi &/\ <Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &\ \ \ <Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx \ &\ \ \ <Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm \ &\ <Tab>zm
+menutrans &Close\ all\ folds<Tab>zM \ &\ <Tab>zM
+menutrans &Open\ all\ folds<Tab>zR ³\ &\ <Tab>zR
+menutrans O&pen\ more\ folds<Tab>zr ³\ &\ <Tab>zr
+
+menutrans Create\ &Fold<Tab>zf &\ <Tab>zf
+menutrans &Delete\ Fold<Tab>zd &\ <Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD &\ \ <Tab>zD
+menutrans Fold\ column\ &width &\ \
+menutrans Fold\ Met&hod &\
+menutrans M&anual &
+menutrans I&ndent &³
+menutrans E&xpression &
+menutrans S&yntax &
+menutrans Ma&rker &
+
+" Diff
+menutrans &Diff &
+menutrans &Update &
+menutrans &Get\ Block &\
+menutrans &Put\ Block &\
+
+" Make and stuff...
+menutrans &Make<Tab>:make &(make)<Tab>:make
+menutrans &List\ Errors<Tab>:cl &\ <Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &\ <Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &\ <Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &\ <Tab>:cp
+menutrans &Older\ List<Tab>:cold &\ <Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &\ <Tab>:cnew
+menutrans Error\ &Window &³\
+menutrans &Update<Tab>:cwin &<Tab>:cwin
+menutrans &Close<Tab>:cclose &<Tab>:cclose
+menutrans &Open<Tab>:copen &³<Tab>:copen
+
+menutrans &Set\ Compiler \ &
+menutrans &Convert\ to\ HEX<Tab>:%!xxd \ \ \ <Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r \ \ \ <Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers &
+menutrans &Refresh\ menu &
+menutrans Delete &
+menutrans &Alternate &
+menutrans &Next &
+menutrans &Previous &
+menutrans [No\ File] [\ ]
+
+" Window menu
+menutrans &Window &³
+menutrans &New<Tab>^Wn &<Tab>^Wn
+menutrans S&plit<Tab>^Ws &<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ \ \ &\ <Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv \ &<Tab>^Wv
+"menutrans Split\ &Vertically<Tab>^Wv &\ <Tab>^Wv
+menutrans Split\ File\ E&xplorer \ \ &\
+
+menutrans &Close<Tab>^Wc &<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo \ \ &<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &<Tab>^Ww
+menutrans P&revious<Tab>^WW &<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &\ <Tab>^W=
+menutrans &Max\ Height<Tab>^W_ &\ <Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ &\ <Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| &\ <Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| &\ <Tab>^W1\|
+menutrans Move\ &To &
+menutrans &Top<Tab>^WK &<Tab>^WK
+menutrans &Bottom<Tab>^WJ &<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &<Tab>^WH
+menutrans &Right\ side<Tab>^WL &<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR &\ <Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr &\ <Tab>^Wr
+
+" The popup menu
+menutrans &Undo &³
+menutrans Cu&t &
+menutrans &Copy &
+menutrans &Paste &
+menutrans &Delete &
+menutrans Select\ &Word \ &
+menutrans Select\ &Line \ &
+menutrans Select\ &Block \ &
+menutrans Select\ &All \ &
+
+
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open ³
+ tmenu ToolBar.Save '
+ tmenu ToolBar.SaveAll '
+ tmenu ToolBar.Print
+ tmenu ToolBar.Undo ³
+ tmenu ToolBar.Redo
+ tmenu ToolBar.Cut
+ tmenu ToolBar.Copy
+ tmenu ToolBar.Paste
+ tmenu ToolBar.Find ...
+ tmenu ToolBar.FindNext
+ tmenu ToolBar.FindPrev
+ tmenu ToolBar.Replace ...
+ tmenu ToolBar.LoadSesn
+ tmenu ToolBar.SaveSesn '
+ tmenu ToolBar.RunScript
+ tmenu ToolBar.Make
+ tmenu ToolBar.Shell Shell
+ tmenu ToolBar.RunCtags
+ tmenu ToolBar.TagJump
+ tmenu ToolBar.Help
+ tmenu ToolBar.FindHelp
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &
+menutrans Set\ '&syntax'\ only \ \ '&syntax'
+menutrans Set\ '&filetype'\ too \ '&filetype'\
+menutrans &Off &
+menutrans &Manual &
+menutrans A&utomatic &
+menutrans on/off\ for\ &This\ file \ \ \ &
+menutrans Co&lor\ test \ &
+menutrans &Highlight\ test &\
+menutrans &Convert\ to\ HTML \ &HTML
+
+" dialog texts
+let menutrans_no_file = "[\ ]"
+let menutrans_help_dialog = " :\n\n i_ (. i_CTRL-X)\n i_ (. _<Del>)\n ' (. 'shiftwidth')"
+let g:menutrans_path_dialog = " \n ."
+let g:menutrans_tags_dialog = " \n ."
+let g:menutrans_textwidth_dialog = " (0 )"
+let g:menutrans_fileformat_dialog = " "
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_uk_ua.koi8-u.vim b/runtime/lang/menu_uk_ua.koi8-u.vim
new file mode 100644
index 0000000..107be9b
--- /dev/null
+++ b/runtime/lang/menu_uk_ua.koi8-u.vim
@@ -0,0 +1,252 @@
+" Menu Translations: Ukrainian
+" Maintainer: Bohdan Vlasyuk <bohdan@vstu.edu.ua>
+" Last Change: 11 Oct 2001
+" Generated from menu_uk_ua.utf-8.vim, DO NOT EDIT
+
+"
+" Please, see readme at htpp://www.vstu.edu.ua/~bohdan/vim before any
+" complains, and even if you won't complain, read it anyway.
+"
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding koi8-u
+
+" Help menu
+menutrans &Help &
+menutrans &Overview<Tab><F1> &\ æ<Tab><F1>
+menutrans &User\ Manual &Ҧ\ \
+menutrans &How-to\ links &-?
+"menutrans &GUI &GIU
+menutrans &Credits &
+menutrans Co&pying &
+menutrans O&rphans &\
+menutrans &Version &Ӧ
+menutrans &About \ &
+
+" File menu
+menutrans &File &
+menutrans &Open\.\.\.<Tab>:e &\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &Ħ\ צ\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &<Tab>:enew
+menutrans &Close<Tab>:close &<Tab>:close
+menutrans &Save<Tab>:w &'<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav '\ &\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. &Ҧ\ \.\.\.
+menutrans Split\ Patched\ &By\.\.\. &\.\.\.
+menutrans &Print &
+menutrans Sa&ve-Exit<Tab>:wqa \ \ &<Tab>:wqa
+menutrans E&xit<Tab>:qa &Ȧ<Tab>:qa
+
+" Edit menu
+menutrans &Edit &
+menutrans &Undo<Tab>u &ͦ<Tab>u
+menutrans &Redo<Tab>^R &<Tab>^R
+menutrans Rep&eat<Tab>\. &<Tab>\.
+menutrans Cu&t<Tab>"+x &Ҧ<Tab>"+x
+menutrans &Copy<Tab>"+y &Ц<Tab>"+y
+menutrans &Paste<Tab>"+gP &<Tab>"+gP
+menutrans Put\ &Before<Tab>[p \ &<Tab>[p
+menutrans Put\ &After<Tab>]p \ &<Tab>]p
+menutrans &Select\ all<Tab>ggVG &\ <Tab>ggVG
+menutrans &Find\.\.\. &\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. &ͦ\.\.\.
+menutrans Settings\ &Window \ &
+menutrans &Global\ Settings Φ\ &
+menutrans F&ile\ Settings \ \ &
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &æ\ ˦<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! \ &\ צ<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! \ &<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! \ \ &<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! \ \ &æ<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! \ &צ<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! \ \ \ &C<Tab>:set\ cin!
+menutrans &Shiftwidth &
+menutrans Te&xt\ Width\.\.\. &\ \.\.\.
+menutrans &File\ Format\.\.\. &\ \.\.\.
+menutrans Soft\ &Tabstop æ\ &æ
+menutrans C&olor\ Scheme &
+menutrans Select\ Fo&nt\.\.\. \ &\.\.\.
+
+
+menutrans &Keymap \ צ
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Ħ\ &<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Ҧ\ \˦\ \ ̦\ ̦<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! &\ <Tab>:set\ sm!
+menutrans &Context\ lines ˦\ &\ ˦
+menutrans &Virtual\ Edit \ &\ \
+
+menutrans Never
+menutrans Block\ Selection ¦\
+menutrans Insert\ mode \
+menutrans Block\ and\ Insert ¦\ \
+menutrans Always
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! \ &<Tab>:set\ im!
+menutrans Search\ &Path\.\.\. &\ \.\.\.
+menutrans Ta&g\ Files\.\.\. \ &ͦ\.\.\.
+
+
+"
+" GUI options
+menutrans Toggle\ &Toolbar \ &Ԧ
+menutrans Toggle\ &Bottom\ Scrollbar &\ ̦Φ\
+menutrans Toggle\ &Left\ Scrollbar &\ ̦Φ\
+menutrans Toggle\ &Right\ Scrollbar &\ ̦Φ\
+
+" Programming menu
+menutrans &Tools &
+menutrans &Jump\ to\ this\ tag<Tab>g^] &\ \ ͦ<Tab>g^]
+menutrans Jump\ &back<Tab>^T &<Tab>^T
+menutrans Build\ &Tags\ File &\ \ ͦ
+" Folding
+menutrans &Folding &
+menutrans &Enable/Disable\ folds<Tab>zi &/\ <Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &\ \ \ <Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx \ &\ \ \ <Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm \ &¦\ ˦<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM \ &Ӧ\ <Tab>zM
+menutrans &Open\ all\ folds<Tab>zR \ &Ӧ\ <Tab>zR
+menutrans O&pen\ more\ folds<Tab>zr \ &\ ˦<Tab>zr
+
+menutrans Create\ &Fold<Tab>zf &\ <Tab>zf
+menutrans &Delete\ Fold<Tab>zd &\ <Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD &\ Ӧ\ <Tab>zD
+menutrans Fold\ column\ &width &\ \ ˦
+menutrans Fold\ Met&hod &\
+menutrans M&anual &
+menutrans I&ndent &
+menutrans E&xpression &
+menutrans S&yntax &
+menutrans Ma&rker &
+
+" Diff
+menutrans &Diff &Ҧ
+menutrans &Update &
+menutrans &Get\ Block &\ Ҧ
+menutrans &Put\ Block &\ Ҧ
+
+" Make and stuff...
+menutrans &Make<Tab>:make &(make)<Tab>:make
+menutrans &List\ Errors<Tab>:cl &\ <Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! &\ צ<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &\ <Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &\ <Tab>:cp
+menutrans &Older\ List<Tab>:cold &ۦ\ <Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &Φ\ <Tab>:cnew
+menutrans Error\ &Window &\
+menutrans &Update<Tab>:cwin &<Tab>:cwin
+menutrans &Close<Tab>:cclose &<Tab>:cclose
+menutrans &Open<Tab>:copen &<Tab>:copen
+
+menutrans &Set\ Compiler \ &Ц
+menutrans &Convert\ to\ HEX<Tab>:%!xxd \ \ ۦצ\ <Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r \ \ צ\ <Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers &
+menutrans &Refresh\ menu &
+menutrans Delete &
+menutrans &Alternate &
+menutrans &Next &̦
+menutrans &Previous &Φ
+menutrans [No\ File] [\ ]
+
+" Window menu
+menutrans &Window &
+menutrans &New<Tab>^Wn &<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Ħ<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Ħ\ \ &\ <Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Ħ\ &<Tab>^Wv
+"menutrans Split\ &Vertically<Tab>^Wv &Ħ\ <Tab>^Wv
+menutrans Split\ File\ E&xplorer Ħ\ \ &\ ̦
+
+menutrans &Close<Tab>^Wc &<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo \ Ӧ\ &ۦ<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &<Tab>^Ww
+menutrans P&revious<Tab>^WW &Τ<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Ҧ\ ͦ<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ &¦\ <Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ &\ <Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| ¦&\ <Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| &\ <Tab>^W1\|
+menutrans Move\ &To &ͦ
+menutrans &Top<Tab>^WK &<Tab>^WK
+menutrans &Bottom<Tab>^WJ &<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &̦<Tab>^WH
+menutrans &Right\ side<Tab>^WL &<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR &̦\ <Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr &̦\ <Tab>^Wr
+
+" The popup menu
+menutrans &Undo &ͦ
+menutrans Cu&t &Ҧ
+menutrans &Copy &Ц
+menutrans &Paste &
+menutrans &Delete &
+menutrans Select\ &Word \ &
+menutrans Select\ &Line \ &
+menutrans Select\ &Block \ &
+menutrans Select\ &All \ &
+
+
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open
+ tmenu ToolBar.Save '
+ tmenu ToolBar.SaveAll ' Ӧ
+ tmenu ToolBar.Print
+ tmenu ToolBar.Undo ͦ
+ tmenu ToolBar.Redo
+ tmenu ToolBar.Cut Ҧ
+ tmenu ToolBar.Copy Ц
+ tmenu ToolBar.Paste
+ tmenu ToolBar.Find ...
+ tmenu ToolBar.FindNext
+ tmenu ToolBar.FindPrev Φ
+ tmenu ToolBar.Replace ͦ...
+ tmenu ToolBar.LoadSesn
+ tmenu ToolBar.SaveSesn '
+ tmenu ToolBar.RunScript
+ tmenu ToolBar.Make
+ tmenu ToolBar.Shell Shell
+ tmenu ToolBar.RunCtags ͦ
+ tmenu ToolBar.TagJump ͦ
+ tmenu ToolBar.Help
+ tmenu ToolBar.FindHelp ڦ
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &
+menutrans Set\ '&syntax'\ only \ \ '&syntax'
+menutrans Set\ '&filetype'\ too \ '&filetype'\
+menutrans &Off &
+menutrans &Manual &
+menutrans A&utomatic &
+menutrans on/off\ for\ &This\ file \ \ \ &
+menutrans Co&lor\ test צ\ &Ҧ
+menutrans &Highlight\ test &צ\ Ħ
+menutrans &Convert\ to\ HTML \ &HTML
+
+" dialog texts
+let menutrans_no_file = "[\ ]"
+let menutrans_help_dialog = "֦ :\n\n i_ (. i_CTRL-X)\n i_ (. _<Del>)\n ' æ (. 'shiftwidth')"
+let g:menutrans_path_dialog = "֦ ̦\nĦ Ҧ ."
+let g:menutrans_tags_dialog = "֦ ̦ ͦ\nĦ ."
+let g:menutrans_textwidth_dialog = "֦ (0 צͦ )"
+let g:menutrans_fileformat_dialog = "Ҧ "
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_uk_ua.utf-8.vim b/runtime/lang/menu_uk_ua.utf-8.vim
new file mode 100644
index 0000000..c34e551
--- /dev/null
+++ b/runtime/lang/menu_uk_ua.utf-8.vim
@@ -0,0 +1,252 @@
+" Menu Translations: Ukrainian
+" Maintainer: Bohdan Vlasyuk <bohdan@vstu.edu.ua>
+" Last Change: 11 Oct 2001
+" Original translations
+
+"
+" Please, see readme at htpp://www.vstu.edu.ua/~bohdan/vim before any
+" complains, and even if you won't complain, read it anyway.
+"
+
+" Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Help menu
+menutrans &Help &Допомога
+menutrans &Overview<Tab><F1> &Загальна\ Інформація<Tab><F1>
+menutrans &User\ Manual &Керівництво\ для\ користувача
+menutrans &How-to\ links &Як-Зробити?
+"menutrans &GUI &GIU
+menutrans &Credits &Подяки
+menutrans Co&pying &Розповсюдження
+menutrans O&rphans &Допомога\ сиротам
+menutrans &Version &Версія
+menutrans &About Про\ &програму
+
+" File menu
+menutrans &File &Файл
+menutrans &Open\.\.\.<Tab>:e &Відкрити\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &Розділити\ вікно\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew &Новий<Tab>:enew
+menutrans &Close<Tab>:close &Закрити<Tab>:close
+menutrans &Save<Tab>:w За&пам'ятати<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Запам'ятати\ &як\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ with\.\.\. По&рівняти\ з\.\.\.
+menutrans Split\ Patched\ &By\.\.\. За&латати\.\.\.
+menutrans &Print &Друкувати
+menutrans Sa&ve-Exit<Tab>:wqa Записати\ і\ ви&йти<Tab>:wqa
+menutrans E&xit<Tab>:qa &Вихід<Tab>:qa
+
+" Edit menu
+menutrans &Edit &Редагувати
+menutrans &Undo<Tab>u &Відмінити<Tab>u
+menutrans &Redo<Tab>^R &Повернути<Tab>^R
+menutrans Rep&eat<Tab>\. П&овторити<Tab>\.
+menutrans Cu&t<Tab>"+x Ви&різати<Tab>"+x
+menutrans &Copy<Tab>"+y &Копіювати<Tab>"+y
+menutrans &Paste<Tab>"+gP В&ставити<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Вставити\ попе&реду<Tab>[p
+menutrans Put\ &After<Tab>]p Вставити\ п&ісля<Tab>]p
+menutrans &Select\ all<Tab>ggVG Ви&брати\ усе<Tab>ggVG
+menutrans &Find\.\.\. &Знайти\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. За&мінити\.\.\.
+menutrans Settings\ &Window Вікно\ &налаштувань
+menutrans &Global\ Settings Загальні\ на&лаштування
+menutrans F&ile\ Settings Налаштування\ для\ &файлу
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! &Нумерація\ рядків<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! Режим\ на&длишкового\ відображення<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! Режим\ &переносу<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Переносити\ усе\ &слово<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! Користуватися\ символом\ &табуляції<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! Автоматичний\ &відступ<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! Відступи\ для\ мови\ &C<Tab>:set\ cin!
+menutrans &Shiftwidth &Зсув
+menutrans Te&xt\ Width\.\.\. &Ширина\ тексту\.\.\.
+menutrans &File\ Format\.\.\. &Формат\ файлу\.\.\.
+menutrans Soft\ &Tabstop Позиція\ &табуляції
+menutrans C&olor\ Scheme &Кольори
+menutrans Select\ Fo&nt\.\.\. Вибрати\ &шрифт\.\.\.
+
+
+menutrans &Keymap Режим\ клавіатури
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! Виділяти\ &зразок<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Розрізняти\ \великі\ та\ малі\ літери<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! &Негайний\ пошук<Tab>:set\ sm!
+menutrans &Context\ lines Кількість\ &важливих\ рядків
+menutrans &Virtual\ Edit Курсор\ &рухається\ без\ меж
+
+menutrans Never Ніколи
+menutrans Block\ Selection Вибір\ Блоку
+menutrans Insert\ mode Режим\ вставки
+menutrans Block\ and\ Insert Вибір\ і\ вставка
+menutrans Always Завжди
+
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Режим\ &вставки<Tab>:set\ im!
+menutrans Search\ &Path\.\.\. &Шлях\ пошуку\.\.\.
+menutrans Ta&g\ Files\.\.\. Файли\ &поміток\.\.\.
+
+
+"
+" GUI options
+menutrans Toggle\ &Toolbar Панель\ &інструментів
+menutrans Toggle\ &Bottom\ Scrollbar &Нижня\ лінійка\ зсуву
+menutrans Toggle\ &Left\ Scrollbar &Ліва\ лінійка\ зсуву
+menutrans Toggle\ &Right\ Scrollbar &Права\ лінійка\ зсуву
+
+" Programming menu
+menutrans &Tools &Інструменти
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Перейти\ до\ помітки<Tab>g^]
+menutrans Jump\ &back<Tab>^T По&вернутися<Tab>^T
+menutrans Build\ &Tags\ File &Створити\ файл\ поміток
+" Folding
+menutrans &Folding &Згортки
+menutrans &Enable/Disable\ folds<Tab>zi &Дозволити/заборонити\ згортки<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Бачити\ рядок\ з\ курсором<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx Бачити\ &лише\ рядок\ з\ курсором<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Закрити\ &більше\ згортків<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Закрити\ &усі\ згортки<Tab>zM
+menutrans &Open\ all\ folds<Tab>zR Відкрити\ у&сі\ згортки<Tab>zR
+menutrans O&pen\ more\ folds<Tab>zr Відкрити\ б&ільше\ згортків<Tab>zr
+
+menutrans Create\ &Fold<Tab>zf С&творити\ згорток<Tab>zf
+menutrans &Delete\ Fold<Tab>zd &Видалити\ згорток<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Видалит&и\ усі\ згортки<Tab>zD
+menutrans Fold\ column\ &width &Товщина\ рядка\ згортків
+menutrans Fold\ Met&hod &Метод\ згортання
+menutrans M&anual &Ручний
+menutrans I&ndent &Відступ
+menutrans E&xpression В&ираз
+menutrans S&yntax &Синтаксично
+menutrans Ma&rker По&значки
+
+" Diff
+menutrans &Diff По&рівняння
+menutrans &Update &Поновити
+menutrans &Get\ Block &Запозичити\ різницю
+menutrans &Put\ Block &Впровадити\ різницю
+
+" Make and stuff...
+menutrans &Make<Tab>:make &Будувати(make)<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Список\ помилок<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Сп&исок\ повідомлень<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &Наступна\ помилка<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp &Попередня\ помилка<Tab>:cp
+menutrans &Older\ List<Tab>:cold &Бувші\ помилки<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew &Майбутні\ помилки<Tab>:cnew
+menutrans Error\ &Window &Вікно\ помилок
+menutrans &Update<Tab>:cwin &Поновити<Tab>:cwin
+menutrans &Close<Tab>:cclose &Закрити<Tab>:cclose
+menutrans &Open<Tab>:copen &Відкрити<Tab>:copen
+
+menutrans &Set\ Compiler Встановити\ &компілятор
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Перевести\ в\ шістнадцяткові\ коди<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Повернути\ в\ двійкову\ форму<Tab>:%!xxd\ -r
+
+" Names for buffer menu.
+menutrans &Buffers &Буфери
+menutrans &Refresh\ menu &Поновити
+menutrans Delete &Видалити
+menutrans &Alternate &Вторинний
+menutrans &Next &Слідуючий
+menutrans &Previous &Попередній
+menutrans [No\ File] [Немає\ Файла]
+
+" Window menu
+menutrans &Window &Вікно
+menutrans &New<Tab>^Wn &Нове<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Розділити<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Розділити\ для\ &вторинного\ файлу<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Розділити\ &поперек<Tab>^Wv
+"menutrans Split\ &Vertically<Tab>^Wv &Розділити\ поперек<Tab>^Wv
+menutrans Split\ File\ E&xplorer Розділити\ для\ &перегляду\ файлів
+
+menutrans &Close<Tab>^Wc &Закрити<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Закрити\ усі\ &інші<Tab>^Wo
+menutrans Ne&xt<Tab>^Ww &Наступне<Tab>^Ww
+menutrans P&revious<Tab>^WW &Попереднє<Tab>^WW
+menutrans &Equal\ Size<Tab>^W= &Вирівняти\ розмір<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Най&більша\ висота<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Най&менша\ висота<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Найбі&льша\ ширина<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Наймен&ша\ ширина<Tab>^W1\|
+menutrans Move\ &To &Змістити
+menutrans &Top<Tab>^WK До&гори<Tab>^WK
+menutrans &Bottom<Tab>^WJ До&низу<Tab>^WJ
+menutrans &Left\ side<Tab>^WH У&ліво<Tab>^WH
+menutrans &Right\ side<Tab>^WL В&право<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR &Циклічно\ догори<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr Ц&иклічно\ униз<Tab>^Wr
+
+" The popup menu
+menutrans &Undo &Відмінити
+menutrans Cu&t Ви&різати
+menutrans &Copy &Копіювати
+menutrans &Paste В&ставити
+menutrans &Delete Ви&далити
+menutrans Select\ &Word Вибрати\ &слово
+menutrans Select\ &Line Вибрати\ &рядок
+menutrans Select\ &Block Вибрати\ &блок
+menutrans Select\ &All Вибрати\ &усе
+
+
+
+" The GUI toolbar
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Відкрити файл
+ tmenu ToolBar.Save Запам'ятати файл
+ tmenu ToolBar.SaveAll Запам'ятати усі файли
+ tmenu ToolBar.Print Друкувати
+ tmenu ToolBar.Undo Відмінити
+ tmenu ToolBar.Redo Повернути
+ tmenu ToolBar.Cut Вирізати
+ tmenu ToolBar.Copy Копіювати
+ tmenu ToolBar.Paste Вставити
+ tmenu ToolBar.Find Знайти...
+ tmenu ToolBar.FindNext Знайти наступний
+ tmenu ToolBar.FindPrev Знайти попередній
+ tmenu ToolBar.Replace Замінити...
+ tmenu ToolBar.LoadSesn Завантажити сеанс редагування
+ tmenu ToolBar.SaveSesn Запам'ятати сеанс редагування
+ tmenu ToolBar.RunScript Виконати файл команд
+ tmenu ToolBar.Make Збудувати проект
+ tmenu ToolBar.Shell Shell
+ tmenu ToolBar.RunCtags Створити файл поміток
+ tmenu ToolBar.TagJump Перейти до помітки
+ tmenu ToolBar.Help Допомога
+ tmenu ToolBar.FindHelp Пошук у допомозі
+ endfun
+endif
+
+" Syntax menu
+menutrans &Syntax &Синтаксис
+menutrans Set\ '&syntax'\ only Встановлювати\ лише\ '&syntax'
+menutrans Set\ '&filetype'\ too Встановлювати\ '&filetype'\ також
+menutrans &Off &Вимкнено
+menutrans &Manual &Ручний
+menutrans A&utomatic &Автоматично
+menutrans on/off\ for\ &This\ file Перемкнути\ для\ цього\ &файла
+menutrans Co&lor\ test Перевірка\ &кольорів
+menutrans &Highlight\ test &Перевірка\ виділення
+menutrans &Convert\ to\ HTML Створити\ &HTML
+
+" dialog texts
+let menutrans_no_file = "[Немає\ Файла]"
+let menutrans_help_dialog = "Вкажіть команду або слово для пошуку:\n\nДодайте i_ для команд режиму вставки (напр. i_CTRL-X)\nДодайте i_ для командного режиму (напр. с_<Del>)\nДодайте ' для позначення назви опції (напр. 'shiftwidth')"
+let g:menutrans_path_dialog = "Вкажіть шлях пошуку файлів\nРозділяйте назви директорій комами."
+let g:menutrans_tags_dialog = "Вкажіть назви файлів поміток\nРозділяйте назви комами."
+let g:menutrans_textwidth_dialog = "Вкажіть нову ширину тексту (0 для відміни фоматування)"
+let g:menutrans_fileformat_dialog = "Виберіть формат файлу"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_vi_vn.vim b/runtime/lang/menu_vi_vn.vim
new file mode 100644
index 0000000..cc108d2
--- /dev/null
+++ b/runtime/lang/menu_vi_vn.vim
@@ -0,0 +1,335 @@
+" Menu Translations: Vietnamese
+" Maintainer: Phan Vinh Thinh <teppi@vnlinux.org>
+" Last Change: 12 Mar 2005
+" Original translations
+" URL: http://iatp.vspu.ac.ru/phan/vietvim/lang/menu_vi_vn.vim
+"
+"
+" Adopted for VietVim project by Phan Vinh Thinh.
+" First translation: Phan Vinh Thinh <teppi@vnlinux.org>
+"
+"
+" Quit when menu translations have already been done.
+"
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Top
+menutrans &File &Tập\ tin
+menutrans &Edit &Soạn\ thảo
+menutrans &Tools Cô&ng\ cụ
+menutrans &Syntax &Cú\ pháp
+menutrans &Buffers &Bộ\ đệm
+menutrans &Window Cử&a\ sổ
+menutrans &Help Trợ\ &giúp
+"
+"
+"
+" Help menu
+menutrans &Overview<Tab><F1> &Tổng\ quan<Tab><F1>
+menutrans &User\ Manual &Hướng\ dẫn\ sử\ dụng
+menutrans &How-to\ links &Làm\ như\ thế\ nào
+menutrans &Find\.\.\. Tìm\ &kiếm\.\.\.
+"--------------------
+menutrans &Credits Lời\ &cảm\ ơn
+menutrans Co&pying &Bản\ quyền
+menutrans &Sponsor/Register &Giúp\ đỡ/Đăng\ ký
+menutrans O&rphans Trẻ\ &mồ\ côi
+"--------------------
+menutrans &Version &Phiên\ bản
+menutrans &About &Về\ Vim
+"
+"
+" File menu
+menutrans &Open\.\.\.<Tab>:e &Mở\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp &Chia-Mở\.\.\.<Tab>:sp
+menutrans &New<Tab>:enew Mớ&i<Tab>:enew
+menutrans &Close<Tab>:close Đó&ng<Tab>:close
+"--------------------
+menutrans &Save<Tab>:w &Ghi\ nhớ<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav Ghi\ n&hư\.\.\.<Tab>:sav
+"--------------------
+menutrans Split\ &Diff\ with\.\.\. &So\ sánh\ với\.\.\.
+menutrans Split\ Patched\ &By\.\.\. So\ sánh\ đã\ vá\ lỗi\ &bởi\.\.\.
+"--------------------
+menutrans &Print In\ &ra
+menutrans Sa&ve-Exit<Tab>:wqa Ghi\ nhớ\ rồi\ th&oát\ <Tab>:wqa
+menutrans E&xit<Tab>:qa &Thoát<Tab>:qa
+"
+"
+" Edit menu
+menutrans &Undo<Tab>u &Hủy\ bước<Tab>u
+menutrans &Redo<Tab>^R &Làm\ lại<Tab>^R
+menutrans Rep&eat<Tab>\. Lặ&p\ lại<Tab>\.
+"--------------------
+menutrans Cu&t<Tab>"+x &Cắt<Tab>"+x
+menutrans &Copy<Tab>"+y &Sao\ chép<Tab>"+y
+menutrans &Paste<Tab>"+gP &Dán<Tab>"+gP
+menutrans Put\ &Before<Tab>[p Dán\ trướ&c<Tab>[p
+menutrans Put\ &After<Tab>]p Dán\ sa&u<Tab>]p
+menutrans &Delete<Tab>x &Xóa<Tab>x
+menutrans &Select\ All<Tab>ggVG Chọ&n\ tất\ cả<Tab>ggVG
+"--------------------
+menutrans &Find\.\.\.<Tab>/ &Tìm\ kiếm\.\.\.<Tab>/
+menutrans Find\ and\ Rep&lace\.\.\. Tìm\ kiếm\ &và\ thay\ thế\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:%s Tìm\ kiếm\ &và\ thay\ thế\.\.\.<Tab>:%s
+menutrans Find\ and\ Rep&lace\.\.\.<Tab>:s Tìm\ kiếm\ &và\ thay\ thế\.\.\<Tab>:s
+"--------------------
+menutrans Settings\ &Window Cửa\ &sổ\ thiết\ lập
+menutrans &Global\ Settings Thiết\ lập\ t&oàn\ cầu
+menutrans F&ile\ Settings &Thiết\ lập\ tập\ t&in
+menutrans C&olor\ Scheme Phối\ hợp\ màu\ &sắc
+menutrans &Keymap Sơ\ đồ\ &bàn\ phím
+menutrans Select\ Fo&nt\.\.\. Chọn\ &phông\ chữ\.\.\.
+">>>----------------- Edit/Global settings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! &Chiếu\ sáng\ từ\ tìm\ thấy\ <Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! &Không\ tính\ đến\ kiểu\ chữ<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! Cho\ &biết\ phần\ tử\ có\ cặp<Tab>:set\ sm!
+menutrans &Context\ lines Số\ &dòng\ quanh\ con\ trỏ
+menutrans &Virtual\ Edit &Soạn\ thảo\ ảo
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! Chế\ độ\ chè&n<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! Tương\ thích\ với\ &Vi<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. Đường\ dẫn\ tìm\ &kiếm\.\.\.
+menutrans Ta&g\ Files\.\.\. Tập\ tin\ t&hẻ\ ghi\.\.\.
+"
+menutrans Toggle\ &Toolbar Ẩn/hiện\ th&anh\ công\ cụ
+menutrans Toggle\ &Bottom\ Scrollbar Ẩn/hiện\ thanh\ kéo\ nằ&m\ dưới
+menutrans Toggle\ &Left\ Scrollbar Ẩn/hiện\ thanh\ ké&o\ bên\ trái
+menutrans Toggle\ &Right\ Scrollbar Ẩn/hiện\ thanh\ kéo\ bên\ &phải
+">>>->>>------------- Edit/Global settings/Virtual edit
+menutrans Never Tắt
+menutrans Block\ Selection Khi\ chọn\ khối
+menutrans Insert\ mode Trong\ chế\ độ\ Chèn
+menutrans Block\ and\ Insert Khi\ chọn\ khối\ và\ Chèn
+menutrans Always Luôn\ luôn\ bật
+">>>----------------- Edit/File settings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! Đánh\ &số\ dòng<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! &Chế\ độ\ danh\ sách<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! &Ngắt\ những\ dòng\ dài<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! Ngắt\ từ\ nguyên\ &vẹn<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! &Dấu\ trắng\ thay\ cho\ tab<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! &Tự\ động\ thụt\ dòng<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! T&hụt\ dòng\ kiểu\ C<Tab>:set\ cin!
+">>>---
+menutrans &Shiftwidth Chiều\ &rộng\ thụt\ dòng
+menutrans Soft\ &Tabstop Chiều\ rộng\ T&ab
+menutrans Te&xt\ Width\.\.\. Chiều\ rộng\ văn\ &bản\.\.\.
+menutrans &File\ Format\.\.\. Định\ dạng\ tậ&p\ tin\.\.\.
+">>>----------------- Edit/File settings/Color Scheme
+menutrans default Mặc\ định
+">>>----------------- Edit/File settings/Keymap
+menutrans None Không\ dùng
+menutrans arabic Ả\ rập
+menutrans czech Séc
+menutrans esperanto Etperantô
+menutrans greek Hy\ Lạp
+menutrans hebrew Do\ thái
+menutrans hebrewp Do\ thái\ p
+menutrans lithuania-baltic Lát-vi\ Bal-tíc
+menutrans magyar Hungari
+menutrans persian-iranian Iran\ Ba\ Tư
+menutrans persian Ba\ Tư
+menutrans russian-jcuken Nga\ jcuken
+menutrans russian-jcukenwin Nga\ jcukenwin
+menutrans russian-yawerty Nga\ yawerty
+menutrans serbian-latin Xéc-bi\ La-tinh
+menutrans serbian Xéc-bi
+menutrans slovak slovak
+"
+"
+"
+" Tools menu
+menutrans &Jump\ to\ this\ tag<Tab>g^] &Nhảy\ tới\ thẻ\ ghi<Tab>g^]
+menutrans Jump\ &back<Tab>^T &Quay\ lại<Tab>^T
+menutrans Build\ &Tags\ File &Tạo\ tập\ tin\ thẻ\ ghi
+"-------------------
+menutrans &Folding Nếp\ &gấp
+menutrans &Diff &Khác\ biệt\ (diff)
+"-------------------
+menutrans &Make<Tab>:make &Biên\ dịch<Tab>:make
+menutrans &List\ Errors<Tab>:cl &Danh\ sách\ lỗi<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! Danh\ &sách\ thông\ báo<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn &Lỗi\ tiếp\ theo<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp Lỗi\ t&rước<Tab>:cp
+menutrans &Older\ List<Tab>:cold Danh\ sách\ &cũ\ hơn<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew Danh\ sách\ &mới\ hơn<Tab>:cnew
+menutrans Error\ &Window Cử&a\ sổ\ lỗi
+menutrans &Set\ Compiler C&họn\ trình\ biên\ dịch
+"-------------------
+menutrans &Convert\ to\ HEX<Tab>:%!xxd Ch&uyển\ thành\ HEX<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r Chuyển\ từ\ HE&X<Tab>:%!xxd\ -r
+">>>---------------- Folds
+menutrans &Enable/Disable\ folds<Tab>zi &Bật/tắt\ nếp\ gấp<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv &Xem\ dòng\ có\ con\ trỏ<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx &Chỉ\ xem\ dòng\ có\ con\ trỏ<Tab>zMzx
+menutrans C&lose\ more\ folds<Tab>zm Đóng\ &nhiều\ nếp\ gấp\ hơn<Tab>zm
+menutrans &Close\ all\ folds<Tab>zM Đóng\ mọi\ nếp\ &gấp<Tab>zM
+menutrans &Open\ all\ folds<Tab>zR &Mở\ mọi\ nếp\ gấp<Tab>zR
+menutrans O&pen\ more\ folds<Tab>zr Mở\ n&hiều\ nếp\ gấp\ hơn<Tab>zr
+menutrans Fold\ Met&hod &Phương\ pháp\ gấp
+menutrans Create\ &Fold<Tab>zf &Tạo\ nếp\ gấp<Tab>zf
+menutrans &Delete\ Fold<Tab>zd Xó&a\ nếp\ gấp<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD Xóa\ mọ&i\ nếp\ gấp<Tab>zD
+menutrans Fold\ col&umn\ width Chiều\ &rộng\ cột\ nếp\ gấp
+">>>->>>----------- Tools/Folds/Fold Method
+menutrans M&anual &Thủ\ công
+menutrans I&ndent Thụt\ &dòng
+menutrans E&xpression &Biểu\ thức
+menutrans S&yntax &Cú\ pháp
+menutrans Ma&rker &Dấu\ hiệu
+">>>--------------- Tools/Diff
+menutrans &Update &Cập\ nhật
+menutrans &Get\ Block &Thay\ đổi\ bộ\ đệm\ này
+menutrans &Put\ Block T&hay\ đổi\ bộ\ đệm\ khác
+">>>--------------- Tools/Diff/Error window
+menutrans &Update<Tab>:cwin &Cập\ nhật<Tab>:cwin
+menutrans &Close<Tab>:cclose Đó&ng<Tab>:cclose
+menutrans &Open<Tab>:copen &Mở<Tab>:copen
+"
+"
+" Syntax menu
+"
+menutrans &Show\ filetypes\ in\ menu &Hiển\ thị\ loại\ tập\ tin\ trong\ trình\ đơn
+menutrans Set\ '&syntax'\ only &Chỉ\ thay\ đổi\ giá\ trị\ 'syntax'
+menutrans Set\ '&filetype'\ too Th&ay\ đổi\ cả\ giá\ trị\ 'filetype'
+menutrans &Off &Tắt
+menutrans &Manual &Bằng\ tay
+menutrans A&utomatic Tự\ độ&ng
+menutrans on/off\ for\ &This\ file Bật\ tắt\ &cho\ tập\ tin\ này
+menutrans Co&lor\ test &Kiểm\ tra\ màu\ sắc
+menutrans &Highlight\ test Kiểm\ tra\ chiếu\ &sáng
+menutrans &Convert\ to\ HTML &Chuyển\ thành\ HTML
+">>>---------------- Syntax/AB
+menutrans Apache\ config Cấu\ hình\ Apache
+menutrans Ant\ build\ file Tập\ tin\ biên\ dịch\ Ant
+menutrans Apache-style\ config Cấu\ hình\ phong\ cách\ Apache
+menutrans Arc\ Macro\ Language Ngôn\ ngữ\ Macro\ Arc
+menutrans Arch\ inventory Kiểm\ kê\ Arch
+menutrans ASP\ with\ VBScript ASP\ với\ VBScript
+menutrans ASP\ with\ Perl ASP\ với\ Perl
+menutrans BC\ calculator Máy\ tính\ BC
+menutrans BDF\ font Phông\ chữ\ BDF
+menutrans blank không\ dùng
+">>>---------------- Syntax/C
+menutrans Calendar Lịch
+menutrans Cheetah\ template Mẫu\ Cheetah
+menutrans Config Cấu\ hình
+"
+"
+" Buffers menu
+"
+menutrans &Refresh\ menu &Cập\ nhật\ trình\ đơn
+menutrans Delete &Xóa
+menutrans &Alternate Xen\ &kẽ
+menutrans &Next Tiế&p\ theo
+menutrans &Previous &Trước
+menutrans [No\ File] [Không\ có\ tập\ tin]
+"
+"
+" Window menu
+"
+menutrans &New<Tab>^Wn &Mới<Tab>^Wn
+menutrans S&plit<Tab>^Ws &Chia\ đôi<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ Chia\ &tới\ #<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv Chia\ &dọc<Tab>^Wv
+menutrans Split\ File\ E&xplorer Mở\ trình\ &duyệt\ tập\ tin
+"
+menutrans &Close<Tab>^Wc Đó&ng<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo Đóng\ các\ cửa\ sổ\ &khác<Tab>^Wo
+"
+menutrans Move\ &To C&huyển\ tới
+menutrans Rotate\ &Up<Tab>^WR &Lên\ trên<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr &Xuống\ dưới<Tab>^Wr
+"
+menutrans &Equal\ Size<Tab>^W= Cân\ &bằng\ kích\ thước<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ Chiều\ c&ao\ lớn\ nhất<Tab>^W_
+menutrans M&in\ Height<Tab>^W1_ Chiều\ ca&o\ nhỏ\ nhất<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| Chiều\ &rộng\ lớn\ nhất<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| Chiề&u\ rộng\ nhỏ\ nhất<Tab>^W1\|
+">>>----------------- Window/Move To
+menutrans &Top<Tab>^WK Đầ&u<Tab>^WK
+menutrans &Bottom<Tab>^WJ &Cuối<Tab>^WJ
+menutrans &Left\ side<Tab>^WH &Trái<Tab>^WH
+menutrans &Right\ side<Tab>^WL &Phải<Tab>^WL
+"
+"
+" The popup menu
+"
+"
+menutrans &Undo &Hủy\ bước
+menutrans Cu&t &Cắt
+menutrans &Copy &Sao\ chép
+menutrans &Paste &Dán
+menutrans &Delete &Xóa
+menutrans Select\ Blockwise Chọn\ &theo\ khối
+menutrans Select\ &Word Chọ&n\ từ
+menutrans Select\ &Line Chọn\ dòn&g
+menutrans Select\ &Block Chọn\ &khối
+menutrans Select\ &All Chọn\ tất\ &cả
+"
+" The GUI toolbar
+"
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open Mở tập tin
+ tmenu ToolBar.Save Ghi nhớ tập tin
+ tmenu ToolBar.SaveAll Ghi nhớ tất cả
+ tmenu ToolBar.Print In ra
+ tmenu ToolBar.Undo Hủy bước
+ tmenu ToolBar.Redo Làm lại
+ tmenu ToolBar.Cut Cắt
+ tmenu ToolBar.Copy Sao chép
+ tmenu ToolBar.Paste Dán
+ tmenu ToolBar.Find Tìm kiếm
+ tmenu ToolBar.FindNext Tìm tiếp theo
+ tmenu ToolBar.FindPrev Tìm ngược lại
+ tmenu ToolBar.Replace Thay thế...
+ tmenu ToolBar.LoadSesn Nạp buổi làm việc
+ tmenu ToolBar.SaveSesn Ghi nhớ buổi làm việc
+ tmenu ToolBar.RunScript Chạy script của Vim
+ tmenu ToolBar.Make Biên dịch
+ tmenu ToolBar.Shell Shell
+ tmenu ToolBar.RunCtags Tạo tập tin thẻ ghi
+ tmenu ToolBar.TagJump Chuyển tới thẻ ghi
+ tmenu ToolBar.Help Trợ giúp
+ tmenu ToolBar.FindHelp Tìm trong trợ giúp
+ endfun
+endif
+"
+"
+" Dialog texts
+"
+" Find in help dialog
+"
+let g:menutrans_help_dialog = "Hãy nhập câu lệnh hoặc từ khóa tìm kiếm:\n\nThêm i_ để tìm kiếm câu lệnh của chế độ Nhập Input (Ví dụ, i_CTRL-X)\nThêm c_ để tìm kiếm câu lệnh của chế độ soạn thảo dòng lệnh (Ví dụ, с_<Del>)\nThêm ' để tìm kiếm trợ giúp cho một tùy chọn (ví dụ, 'shiftwidth')"
+"
+" Searh path dialog
+"
+let g:menutrans_path_dialog = "Hãy chỉ ra đường dẫn để tìm kiếm tập tin.\nTên của thư mục phân cách nhau bởi dấu phẩy."
+"
+" Tag files dialog
+"
+let g:menutrans_tags_dialog = "Nhập tên tập tin thẻ ghi (phân cách bởi dấu phẩy).\n"
+"
+" Text width dialog
+"
+let g:menutrans_textwidth_dialog = "Hãy nhập chiều rộng văn bản mới.\nNhập 0 để hủy bỏ."
+"
+" File format dialog
+"
+let g:menutrans_fileformat_dialog = "Hãy chọn định dạng tập tin."
+let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Hủy bỏ"
+"
+let menutrans_no_file = "[không có tập tin]"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/lang/menu_zh.big5.vim b/runtime/lang/menu_zh.big5.vim
new file mode 100644
index 0000000..f437ce7
--- /dev/null
+++ b/runtime/lang/menu_zh.big5.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Traditional Chinese
+
+source <sfile>:p:h/menu_chinese_taiwan.950.vim
diff --git a/runtime/lang/menu_zh.cp936.vim b/runtime/lang/menu_zh.cp936.vim
new file mode 100644
index 0000000..e398582
--- /dev/null
+++ b/runtime/lang/menu_zh.cp936.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Simplified Chinese (for Windows)
+
+source <sfile>:p:h/menu_chinese_gb.936.vim
diff --git a/runtime/lang/menu_zh.cp950.vim b/runtime/lang/menu_zh.cp950.vim
new file mode 100644
index 0000000..f437ce7
--- /dev/null
+++ b/runtime/lang/menu_zh.cp950.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Traditional Chinese
+
+source <sfile>:p:h/menu_chinese_taiwan.950.vim
diff --git a/runtime/lang/menu_zh.gb2312.vim b/runtime/lang/menu_zh.gb2312.vim
new file mode 100644
index 0000000..5a16e18
--- /dev/null
+++ b/runtime/lang/menu_zh.gb2312.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Simplified Chinese (for Windows)
+
+source <sfile>:p:h/menu_zh_cn.gb2312.vim
diff --git a/runtime/lang/menu_zh_cn.18030.vim b/runtime/lang/menu_zh_cn.18030.vim
new file mode 100644
index 0000000..99da41a
--- /dev/null
+++ b/runtime/lang/menu_zh_cn.18030.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Simplified Chinese
+
+source <sfile>:p:h/menu_zh_cn.gb2312.vim
diff --git a/runtime/lang/menu_zh_cn.cp936.vim b/runtime/lang/menu_zh_cn.cp936.vim
new file mode 100644
index 0000000..e398582
--- /dev/null
+++ b/runtime/lang/menu_zh_cn.cp936.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Simplified Chinese (for Windows)
+
+source <sfile>:p:h/menu_chinese_gb.936.vim
diff --git a/runtime/lang/menu_zh_cn.gb2312.vim b/runtime/lang/menu_zh_cn.gb2312.vim
new file mode 100644
index 0000000..f0d7cca
--- /dev/null
+++ b/runtime/lang/menu_zh_cn.gb2312.vim
@@ -0,0 +1,13 @@
+" Menu Translations: Simplified Chinese
+" Maintainer: Shun Bai <baishunde@gmail.com>
+" Previous Maintainer: Yuheng Xie <elephant@linux.net.cn>
+" Last Change: 2019-09-09
+
+" This causes trouble for a broken iconv (symptom: last character is always
+" ??). Without this it works fine anyway, because gbk/cp936 is a superset of
+" gb2312. (suggested by Edward L. Fox)
+" scriptencoding gb2312
+
+" As mentioned above, gbk/cp936 is a superset of (and backward compatible with)
+" gb2312, then source the translation encoded in cp936 should be ok. -- Shun
+source <sfile>:p:h/menu_zh_cn.cp936.vim
diff --git a/runtime/lang/menu_zh_cn.gbk.vim b/runtime/lang/menu_zh_cn.gbk.vim
new file mode 100644
index 0000000..99da41a
--- /dev/null
+++ b/runtime/lang/menu_zh_cn.gbk.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Simplified Chinese
+
+source <sfile>:p:h/menu_zh_cn.gb2312.vim
diff --git a/runtime/lang/menu_zh_cn.utf-8.vim b/runtime/lang/menu_zh_cn.utf-8.vim
new file mode 100644
index 0000000..baf56cb
--- /dev/null
+++ b/runtime/lang/menu_zh_cn.utf-8.vim
@@ -0,0 +1,571 @@
+" Menu Translations: Simplified Chinese
+" Maintainer: Ada (Haowen) Yu <me@yuhaowen.com>
+" Previous Maintainer: Shun Bai <baishunde@gmail.com>, Yuheng Xie <elephant@linux.net.cn>
+" Last Change: 2022 July 9
+" Original translations
+"
+" Generated with the scripts from:
+"
+" https://github.com/adaext/vim-menutrans-helper
+
+" Quit when menu translations have already been done.
+
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+let s:keepcpo = &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" Help menu
+menutrans &Help 帮助(&H)
+" Help menuitems and dialog {{{1
+menutrans &Overview<Tab><F1> 概述(&O)<Tab><F1>
+menutrans &User\ Manual 用户手册(&U)
+menutrans &How-to\ Links 如何使用(&H)
+menutrans &Find\.\.\. 查找(&F)\.\.\.
+menutrans &Credits 致谢(&C)
+menutrans Co&pying 版权(&P)
+menutrans &Sponsor/Register 赞助/注册(&S)
+menutrans O&rphans 拯救孤儿(&R)
+menutrans &Version 版本(&V)
+menutrans &About 关于(&A)
+
+" fun! s:Helpfind()
+if !exists("g:menutrans_help_dialog")
+ let g:menutrans_help_dialog = "输入命令或单词以获得帮助:\n\n前缀 i_ 表示输入模式下的命令(如: i_CTRL-X)\n前缀 c_ 表示命令行下的编辑命令(如: c_<Del>)\n前缀 ' 表示选项名(如: 'shiftwidth')"
+endif
+" }}}
+
+" File menu
+menutrans &File 文件(&F)
+" File menuitems {{{1
+menutrans &Open\.\.\.<Tab>:e 打开(&O)\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp 在拆分窗口打开(&L)\.\.\.<Tab>:sp
+menutrans Open\ Tab\.\.\.<Tab>:tabnew 在标签页打开\.\.\.<Tab>:tabnew
+menutrans &New<Tab>:enew 新建(&N)<Tab>:enew
+menutrans &Close<Tab>:close 关闭(&C)<Tab>:close
+menutrans &Save<Tab>:w 保存(&S)<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav 另存为(&A)\.\.\.<Tab>:sav
+menutrans Split\ &Diff\ With\.\.\. 拆分窗口以对比差异(Diff)(&D)\.\.\.
+menutrans Split\ Patched\ &By\.\.\. 拆分窗口以进行修补(Patch)(&B)\.\.\.
+menutrans &Print 打印(&P)
+menutrans Sa&ve-Exit<Tab>:wqa 保存并退出(&V)<Tab>:wqa
+menutrans E&xit<Tab>:qa 退出(&X)<Tab>:qa
+" }}}
+
+" Edit menu
+menutrans &Edit 编辑(&E)
+" Edit menuitems {{{1
+menutrans &Undo<Tab>u 撤销(&U)<Tab>u
+menutrans &Redo<Tab>^R 恢复(&R)<Tab>^R
+menutrans Rep&eat<Tab>\. 重复(&E)<Tab>\.
+menutrans Cu&t<Tab>"+x 剪切(&T)<Tab>"+x
+menutrans &Copy<Tab>"+y 复制(&C)<Tab>"+y
+menutrans &Paste<Tab>"+gP 粘贴(&P)<Tab>"+gP
+menutrans Put\ &Before<Tab>[p 粘贴到光标前(&B)<Tab>[p
+menutrans Put\ &After<Tab>]p 粘贴到光标后(&A)<Tab>]p
+menutrans &Delete<Tab>x 删除(&D)<Tab>x
+menutrans &Select\ All<Tab>ggVG 全选(&S)<Tab>ggVG
+menutrans &Find\.\.\. 查找(&F)\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. 查找和替换(&L)\.\.\.
+menutrans &Find<Tab>/ 查找(&F)<Tab>/
+menutrans Find\ and\ Rep&lace<Tab>:%s 查找和替换(&L)<Tab>:%s
+menutrans Find\ and\ Rep&lace<Tab>:s 查找和替换(&L)<Tab>:s
+menutrans Settings\ &Window 设置窗口(&W)
+menutrans Startup\ &Settings 启动设置(&S)
+
+" Edit/Global Settings
+menutrans &Global\ Settings 全局设置(&G)
+" Edit.Global Settings menuitems and dialogs {{{2
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! 开/关高亮查找内容(&H)<Tab>:set\ hls!
+menutrans Toggle\ &Ignoring\ Case<Tab>:set\ ic! 开/关忽略大小写(&I)<Tab>:set\ ic!
+menutrans Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! 开/关显示括号匹配(&S)<Tab>:set\ sm!
+menutrans &Context\ Lines 上下文行数(&C)
+menutrans &Virtual\ Edit 虚拟编辑(&V)
+" Edit.Global Settings.Virtual Edit menuitems {{{3
+menutrans Never 从不
+menutrans Block\ Selection 只在选定矩形块时
+menutrans Insert\ Mode 只在插入模式时
+menutrans Block\ and\ Insert 在选定矩形块和插入模式时
+menutrans Always 始终
+" }}}
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! 开/关插入模式(&M)<Tab>:set\ im!
+menutrans Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! 开/关\ Vi\ 兼容性(&O)<Tab>:set\ cp!
+menutrans Search\ &Path\.\.\. 搜索路径(&P)\.\.\.
+menutrans Ta&g\ Files\.\.\. 标记文件(Tags)(&G)\.\.\.
+
+" GUI options
+menutrans Toggle\ &Toolbar 开/关工具栏(&T)
+menutrans Toggle\ &Bottom\ Scrollbar 开/关底部滚动条(&B)
+menutrans Toggle\ &Left\ Scrollbar 开/关左侧滚动条(&L)
+menutrans Toggle\ &Right\ Scrollbar 开/关右侧滚动条(&R)
+
+" fun! s:SearchP()
+if !exists("g:menutrans_path_dialog")
+ let g:menutrans_path_dialog = "输入搜索路径。\n用逗号分隔目录名。"
+endif
+
+" fun! s:TagFiles()
+if !exists("g:menutrans_tags_dialog")
+ let g:menutrans_tags_dialog = "输入标记文件(Tags)名称。\n用逗号分隔文件名。"
+endif
+" }}}
+
+" Edit/File Settings
+menutrans F&ile\ Settings 文件设置(&I)
+" Edit.File Settings menuitems and dialogs {{{2
+" Boolean options
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! 开/关行号(&N)<Tab>:set\ nu!
+menutrans Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! 开/关相对行号(&V)<Tab>:set\ rnu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! 开/关列表模式(&L)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrapping<Tab>:set\ wrap! 开/关换行(&W)<Tab>:set\ wrap!
+menutrans Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! 开/关词尾换行(&R)<Tab>:set\ lbr!
+menutrans Toggle\ Tab\ &Expanding<Tab>:set\ et! 开/关制表符扩展(&E)<Tab>:set\ et!
+menutrans Toggle\ &Auto\ Indenting<Tab>:set\ ai! 开/关自动缩进(&A)<Tab>:set\ ai!
+menutrans Toggle\ &C-Style\ Indenting<Tab>:set\ cin! 开/关\ C\ 语言式缩进(&C)<Tab>:set\ cin!
+
+" other options
+menutrans &Shiftwidth 缩进宽度(&S)
+menutrans Soft\ &Tabstop 软制表位宽度(Soft\ Tabstop)(&T)
+menutrans Te&xt\ Width\.\.\. 文本宽度(&X)\.\.\.
+menutrans &File\ Format\.\.\. 文件格式(&F)\.\.\.
+
+" fun! s:TextWidth()
+if !exists("g:menutrans_textwidth_dialog")
+ let g:menutrans_textwidth_dialog = "输入文本宽度(每行最大字符数,0 表示禁用):"
+endif
+
+" fun! s:FileFormat()
+if !exists("g:menutrans_fileformat_dialog")
+ let g:menutrans_fileformat_dialog = "选择文件的保存格式:"
+endif
+if !exists("g:menutrans_fileformat_choices")
+ let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n取消(&C)"
+endif
+" }}}
+menutrans Show\ C&olor\ Schemes\ in\ Menu 在菜单中显示配色方案(&O)
+menutrans C&olor\ Scheme 配色方案(&O)
+menutrans Show\ &Keymaps\ in\ Menu 在菜单中显示键盘映射(&K)
+menutrans &Keymap 键盘映射(&K)
+menutrans Select\ Fo&nt\.\.\. 选择字体(&N)\.\.\.
+" }}}
+
+" Programming menu
+menutrans &Tools 工具(&T)
+" Tools menuitems {{{1
+menutrans &Jump\ to\ This\ Tag<Tab>g^] 跳转到这个标记(Tag)(&J)<Tab>g^]
+menutrans Jump\ &Back<Tab>^T 跳转回(&B)<Tab>^T
+menutrans Build\ &Tags\ File 生成标记文件(Tags)(&T)
+
+" Tools.Spelling Menu
+menutrans &Spelling 拼写检查(&S)
+" Tools.Spelling menuitems and dialog {{{2
+menutrans &Spell\ Check\ On 打开拼写检查(&S)
+menutrans Spell\ Check\ &Off 关闭拼写检查(&O)
+menutrans To\ &Next\ Error<Tab>]s 上一个错误(&N)<Tab>]s
+menutrans To\ &Previous\ Error<Tab>[s 下一个错误(&P)<Tab>[s
+menutrans Suggest\ &Corrections<Tab>z= 更正建议(&C)<Tab>z=
+menutrans &Repeat\ Correction<Tab>:spellrepall 更正全部同类错误(&R)<Tab>:spellrepall
+menutrans Set\ Language\ to\ "en" 设置语言为\ "en"
+menutrans Set\ Language\ to\ "en_au" 设置语言为\ "en_au"
+menutrans Set\ Language\ to\ "en_ca" 设置语言为\ "en_ca"
+menutrans Set\ Language\ to\ "en_gb" 设置语言为\ "en_gb"
+menutrans Set\ Language\ to\ "en_nz" 设置语言为\ "en_nz"
+menutrans Set\ Language\ to\ "en_us" 设置语言为\ "en_us"
+menutrans &Find\ More\ Languages 查找更多语言(&F)
+
+" func! s:SpellLang()
+if !exists("g:menutrans_set_lang_to")
+ let g:menutrans_set_lang_to = "设置语言为"
+endif
+" }}}
+
+" Tools.Fold Menu
+menutrans &Folding 折叠(&F)
+" Tools.Fold menuitems {{{2
+" open close folds
+menutrans &Enable/Disable\ Folds<Tab>zi 启用/禁用折叠(&E)<Tab>zi
+menutrans &View\ Cursor\ Line<Tab>zv 展开光标所在行(&V)<Tab>zv
+menutrans Vie&w\ Cursor\ Line\ Only<Tab>zMzx 只展开光标所在行(&W)<Tab>zMzx
+menutrans C&lose\ More\ Folds<Tab>zm 折叠一级(&L)<Tab>zm
+menutrans &Close\ All\ Folds<Tab>zM 折叠全部(&C)<Tab>zM
+menutrans O&pen\ More\ Folds<Tab>zr 展开一级(&P)<Tab>zr
+menutrans &Open\ All\ Folds<Tab>zR 展开全部(&O)<Tab>zR
+" fold method
+menutrans Fold\ Met&hod 折叠方式(&H)
+" Tools.Fold.Fold Method menuitems {{{3
+menutrans M&anual 手动(&A)
+menutrans I&ndent 缩进(&N)
+menutrans E&xpression 表达式(&X)
+menutrans S&yntax 语法(&Y)
+menutrans &Diff 差异(Diff)(&D)
+menutrans Ma&rker 记号(Marker)(&R)
+" }}}
+" create and delete folds
+menutrans Create\ &Fold<Tab>zf 创建折叠(&F)<Tab>zf
+menutrans &Delete\ Fold<Tab>zd 删除折叠(&D)<Tab>zd
+menutrans Delete\ &All\ Folds<Tab>zD 删除全部折叠(&A)<Tab>zD
+" moving around in folds
+menutrans Fold\ Col&umn\ Width 折叠操作栏宽度(&W)
+" }}}
+
+" Tools.Diff Menu
+menutrans &Diff 差异(Diff)(&D)
+" Tools.Diff menuitems {{{2
+menutrans &Update 刷新(&U)
+menutrans &Get\ Block 采用对侧文本块(&G)
+menutrans &Put\ Block 采用本侧文本块(&P)
+" }}}
+
+menutrans &Make<Tab>:make 生成(Make)(&M)<Tab>:make
+menutrans &List\ Errors<Tab>:cl 列出错误(&L)<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! 列出消息(&I)<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn 下一个错误(&N)<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp 上一个错误(&P)<Tab>:cp
+menutrans &Older\ List<Tab>:cold 较旧的错误列表(&O)<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew 较新的错误列表(&E)<Tab>:cnew
+menutrans Error\ &Window 错误窗口(&W)
+" Tools.Error Window menuitems {{{2
+menutrans &Update<Tab>:cwin 刷新(&U)<Tab>:cwin
+menutrans &Open<Tab>:copen 打开(&O)<Tab>:copen
+menutrans &Close<Tab>:cclose 关闭(&C)<Tab>:cclose
+" }}}
+menutrans Show\ Compiler\ Se&ttings\ in\ Menu 在菜单中显示编译器设置(&T)
+menutrans Se&t\ Compiler 设置编译器(&T)
+menutrans &Convert\ to\ HEX<Tab>:%!xxd 转换成十六进制(&C)<Tab>:%!xxd
+menutrans Conve&rt\ Back<Tab>:%!xxd\ -r 转换回(&R)<Tab>:%!xxd\ -r
+" }}}
+
+" Buffer menu
+menutrans &Buffers 缓冲区(&B)
+" Buffer menuitems and dialog {{{1
+menutrans &Refresh\ Menu 刷新本菜单(&R)
+menutrans &Delete 删除(&D)
+menutrans &Alternate 切换(&A)
+menutrans &Next 下一个(&N)
+menutrans &Previous 上一个(&P)
+
+" func! s:BMMunge(fname, bnum)
+if !exists("g:menutrans_no_file")
+ let g:menutrans_no_file = "[无文件]"
+endif
+" }}}
+
+" Window menu
+menutrans &Window 窗口(&W)
+" Window menuitems {{{1
+menutrans &New<Tab>^Wn 新建(&N)<Tab>^Wn
+menutrans S&plit<Tab>^Ws 拆分(&P)<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ 拆分并显示缓冲区\ #(&L)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv 垂直拆分(&V)<Tab>^Wv
+menutrans Split\ File\ E&xplorer 拆分并打开文件浏览器(&X)
+menutrans &Close<Tab>^Wc 关闭(&C)<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo 除此之外全部关闭(&O)<Tab>^Wo
+menutrans Move\ &To 移动到(&T)
+menutrans &Top<Tab>^WK 顶端(&T)<Tab>^WK
+menutrans &Bottom<Tab>^WJ 底端(&B)<Tab>^WJ
+menutrans &Left\ Side<Tab>^WH 左边(&L)<Tab>^WH
+menutrans &Right\ Side<Tab>^WL 右边(&R)<Tab>^WL
+menutrans Rotate\ &Up<Tab>^WR 向上轮换(&U)<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr 向下轮换(&D)<Tab>^Wr
+menutrans &Equal\ Size<Tab>^W= 平均分布(&E)<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ 最大高度(&M)<Tab>^W
+menutrans M&in\ Height<Tab>^W1_ 最小高度(&I)<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| 最大宽度(&W)<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| 最小宽度(&H)<Tab>^W1\|
+" }}}
+
+" The popup menu {{{1
+menutrans &Undo 撤销(&U)
+menutrans Cu&t 剪切(&T)
+menutrans &Copy 复制(&C)
+menutrans &Paste 粘贴(&P)
+menutrans &Delete 删除(&D)
+menutrans Select\ Blockwise 改为选定矩形块
+menutrans Select\ &Word 选定单词(&W)
+menutrans Select\ &Sentence 选定句(&S)
+menutrans Select\ Pa&ragraph 选定段落(&R)
+menutrans Select\ &Line 选定行(&L)
+menutrans Select\ &Block 选定矩形块(&B)
+menutrans Select\ &All 全选(&A)
+
+" func! <SID>SpellPopup()
+if !exists("g:menutrans_spell_change_ARG_to")
+ let g:menutrans_spell_change_ARG_to = '将\ "%s"\ 更改为'
+endif
+if !exists("g:menutrans_spell_add_ARG_to_word_list")
+ let g:menutrans_spell_add_ARG_to_word_list = '将\ "%s"\ 添加到词典'
+endif
+if !exists("g:menutrans_spell_ignore_ARG")
+ let g:menutrans_spell_ignore_ARG = '忽略\ "%s"'
+endif
+" }}}
+
+" The GUI toolbar {{{1
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ let did_toolbar_tmenu = 1
+ tmenu ToolBar.Open 打开文件
+ tmenu ToolBar.Save 保存当前文件
+ tmenu ToolBar.SaveAll 全部保存
+ tmenu ToolBar.Print 打印
+ tmenu ToolBar.Undo 撤销
+ tmenu ToolBar.Redo 恢复
+ tmenu ToolBar.Cut 剪切到剪贴板
+ tmenu ToolBar.Copy 复制到剪贴板
+ tmenu ToolBar.Paste 从剪贴板粘贴
+ if !has("gui_athena")
+ tmenu ToolBar.Replace 查找和替换...
+ tmenu ToolBar.FindNext 查找下一个
+ tmenu ToolBar.FindPrev 查找上一个
+ endif
+ tmenu ToolBar.LoadSesn 加载会话
+ tmenu ToolBar.SaveSesn 保存当前会话
+ tmenu ToolBar.RunScript 运行 Vim 脚本
+ tmenu ToolBar.Make 生成当前项目 (:make)
+ tmenu ToolBar.RunCtags 在当前目录生成标记(Tags) (!ctags -R .)
+ tmenu ToolBar.TagJump 跳转到光标所在标记(Tag)
+ tmenu ToolBar.Help Vim 帮助
+ tmenu ToolBar.FindHelp 在 Vim 帮助中查找
+ endfun
+endif
+" }}}
+
+" Syntax menu
+menutrans &Syntax 语法(&S)
+" Syntax menuitems {{{1
+menutrans &Show\ File\ Types\ in\ Menu 在菜单中显示文件类型(&S)
+menutrans &Off 关闭(&O)
+menutrans &Manual 手动(&M)
+menutrans A&utomatic 自动(&U)
+menutrans On/Off\ for\ &This\ File 只对这个文件开/关(&T)
+menutrans Co&lor\ Test 色彩测试(&L)
+menutrans &Highlight\ Test 高亮测试(&H)
+menutrans &Convert\ to\ HTML 转换成\ HTML(&C)
+
+" From synmenu.vim
+menutrans Set\ '&syntax'\ Only 只设置\ 'syntax'(&S)
+menutrans Set\ '&filetype'\ Too 也设置\ 'filetype'(&F)
+menutrans Oracle\ config Oracle\ 配置文件
+menutrans Vim\ help\ file Vim\ 帮助文件
+menutrans Vim\ script Vim\ 脚本
+menutrans Viminfo\ file Vim\ 信息文件
+menutrans Virata\ config Virata\ 配置文件
+menutrans Whitespace\ (add) 增加加亮空格
+" }}}
+
+" Netrw menu {{{1
+" Plugin loading may be after menu translation
+" So giveup testing if Netrw Plugin is loaded
+" if exists("g:loaded_netrwPlugin")
+ menutrans Help<tab><F1> 帮助<tab><F1>
+ menutrans Bookmarks 书签
+ menutrans History 历史记录
+ menutrans Go\ Up\ Directory<tab>- 向上一级<tab>-
+ menutrans Apply\ Special\ Viewer<tab>x 用默认程序打开<tab>x
+ menutrans Bookmarks\ and\ History 书签和历史记录
+ " Netrw.Bookmarks and History menuitems {{{2
+ menutrans Bookmark\ Current\ Directory<tab>mb 添加书签<tab>mb
+ menutrans Bookmark\ Delete 移除书签
+ menutrans Goto\ Prev\ Dir\ (History)<tab>u 后退(历史记录)<tab>u
+ menutrans Goto\ Next\ Dir\ (History)<tab>U 前进(历史记录)<tab>U
+ menutrans List<tab>qb 完整列表<tab>qb
+ " }}}
+ menutrans Browsing\ Control 控制
+ " Netrw.Browsing Control menuitems {{{2
+ menutrans Horizontal\ Split<tab>o 在拆分窗口打开<tab>o
+ menutrans Vertical\ Split<tab>v 在垂直拆分窗口打开<tab>v
+ menutrans New\ Tab<tab>t 在标签页打开<tab>t
+ menutrans Preview<tab>p 预览<tab>p
+ menutrans Edit\ File\ Hiding\ List<tab><ctrl-h> 编辑隐藏条件(Hiding\ List)<tab><ctrl-h>
+ menutrans Edit\ Sorting\ Sequence<tab>S 编辑排序条件(Sorting\ Sequence)<tab>S
+ menutrans Quick\ Hide/Unhide\ Dot\ Files<tab>gh 快速隐藏/显示以\.开头的文件<tab>gh
+ menutrans Refresh\ Listing<tab><ctrl-l> 刷新<tab><ctrl-l>
+ menutrans Settings/Options<tab>:NetrwSettings 设置/选项<tab>:NetrwSettings
+ " }}}
+ menutrans Delete\ File/Directory<tab>D 删除文件/目录<tab>D
+ menutrans Edit\ File/Dir 编辑文件/目录
+ " Netrw.Edit File menuitems {{{2
+ menutrans Create\ New\ File<tab>% 新建文件<tab>%
+ menutrans In\ Current\ Window<tab><cr> 在当前窗口<tab><cr>
+ menutrans Preview\ File/Directory<tab>p 预览文件/目录<tab>p
+ menutrans In\ Previous\ Window<tab>P 在上一个窗口<tab>P
+ menutrans In\ New\ Window<tab>o 在新窗口<tab>o
+ menutrans In\ New\ Tab<tab>t 在新标签页<tab>t
+ menutrans In\ New\ Vertical\ Window<tab>v 在新垂直窗口<tab>v
+ " }}}
+ menutrans Explore 浏览
+ " Netrw.Explore menuitems {{{2
+ menutrans Directory\ Name 指定目录名
+ menutrans Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ 匹配指定文件名模式(当前目录)<tab>:Explore\ */
+ menutrans Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ 匹配指定文件名模式(含子目录)<tab>:Explore\ **/
+ menutrans Files\ Containing\ String\ Pattern\ (curdir\ only)<tab>:Explore\ *// 内容包含指定字符串模式(当前目录)<tab>:Explore\ *//
+ menutrans Files\ Containing\ String\ Pattern\ (+subdirs)<tab>:Explore\ **// 内容包含指定字符串模式(含子目录)<tab>:Explore\ **//
+ menutrans Next\ Match<tab>:Nexplore 下一个匹配项<tab>:Nexplore
+ menutrans Prev\ Match<tab>:Pexplore 上一个匹配项<tab>:Pexplore
+ " }}}
+ menutrans Make\ Subdirectory<tab>d 新建子目录<tab>d
+ menutrans Marked\ Files 选定的(Marked)文件
+ " Netrw.Marked Files menuitems {{{2
+ menutrans Mark\ File<tab>mf 选定(Mark)/取消<tab>mf
+ menutrans Mark\ Files\ by\ Regexp<tab>mr 用正则表达式(Regexp)选定<tab>mr
+ menutrans Hide-Show-List\ Control<tab>a 隐藏/显示<tab>a
+ menutrans Copy\ To\ Target<tab>mc 复制到目标<tab>mc
+ menutrans Delete<tab>D 删除<tab>D
+ menutrans Diff<tab>md 差异(Diff)<tab>md
+ menutrans Edit<tab>me 编辑<tab>me
+ menutrans Exe\ Cmd<tab>mx 作为参数运行命令<tab>mx
+ menutrans Move\ To\ Target<tab>mm 移动到目标<tab>mm
+ menutrans Obtain<tab>O 获取<tab>O
+ menutrans Print<tab>mp 打印<tab>mp
+ menutrans Replace<tab>R 替换<tab>R
+ menutrans Set\ Target<tab>mt 设置目标<tab>mt
+ menutrans Tag<tab>mT 生成标记文件(Tags)<tab>mT
+ menutrans Zip/Unzip/Compress/Uncompress<tab>mz 压缩/解压缩<tab>mz
+ " }}}
+ menutrans Obtain\ File<tab>O 获取文件<tab>O
+ menutrans Style 显示风格
+ " Netrw.Style menuitems {{{2
+ menutrans Listing 列表形式
+ " Netrw.Style.Listing menuitems {{{3
+ menutrans thin<tab>i 紧凑<thin)<tab>i
+ menutrans long<tab>i 详细(long)<tab>i
+ menutrans wide<tab>i 多列(wide)<tab>i
+ menutrans tree<tab>i 树状(tree)<tab>i
+ " }}}
+ menutrans Normal-Hide-Show 显示/隐藏
+ " Netrw.Style.Normal-Hide_show menuitems {{{3
+ menutrans Show\ All<tab>a 显示全部
+ menutrans Normal<tab>a 不显示隐藏文件
+ menutrans Hidden\ Only<tab>a 只显示隐藏文件
+ " }}}
+ menutrans Reverse\ Sorting\ Order<tab>r 升序/降序<tab>r
+ menutrans Sorting\ Method 排序方式
+ " Netrw.Style.Sorting Method menuitems {{{3
+ menutrans Name<tab>s 文件名<tab>s
+ menutrans Time<tab>s 修改时间<tab>s
+ menutrans Size<tab>s 大小<tab>s
+ menutrans Exten<tab>s 扩展名<tab>s
+ " }}}
+ " }}}
+ menutrans Rename\ File/Directory<tab>R 重命名文件/目录<tab>R
+ menutrans Set\ Current\ Directory<tab>c 设置\ Vim\ 工作目录<tab>c
+ menutrans Targets 目标
+" endif
+" }}}
+
+" Shellmenu menu
+" Shellmenu menuitems {{{1
+" From shellmenu.vim
+menutrans ShellMenu Shell\ 菜单
+menutrans Statements 语句
+menutrans Test 测试
+menutrans Existence 存在
+menutrans Existence\ -\ file 存在\ -\ 文件
+menutrans Existence\ -\ file\ (not\ empty) 存在\ -\ 文件(非空)
+menutrans Existence\ -\ directory 存在\ -\ 目录
+menutrans Existence\ -\ executable 存在\ -\ 可执行
+menutrans Existence\ -\ readable 存在\ -\ 可读
+menutrans Existence\ -\ writable 存在\ -\ 可写
+menutrans String\ is\ empty 字符串为空
+menutrans String\ is\ not\ empty 字符串非空
+menutrans Strings\ are\ equal 字符串值相等
+menutrans Strings\ are\ not\ equal 字符串值不相等
+menutrans Value\ is\ greater\ than 值大于
+menutrans Value\ is\ greater\ equal 值大于等于
+menutrans Values\ are\ equal 值相等
+menutrans Values\ are\ not\ equal 值不相等
+menutrans Value\ is\ less\ than 值小于
+menutrans Value\ is\ less\ equal 值小于等于
+menutrans ParmSub 参数替换
+menutrans Substitute\ word\ if\ parm\ not\ set 如果参数没设置就替换该词
+menutrans Set\ parm\ to\ word\ if\ not\ set 参数未设置就设为该词
+menutrans Substitute\ word\ if\ parm\ set\ else\ nothing 如果参数设置就替换该词,否则什么都不做
+menutrans If\ parm\ not\ set\ print\ word\ and\ exit 如果参数没有设置就打印该词并退出
+menutrans SpShVars Shell\ 特殊变量
+menutrans Number\ of\ positional\ parameters 位置参数的数目
+menutrans All\ positional\ parameters\ (quoted\ spaces) 所有位置参数(quoted\ spaces)
+menutrans All\ positional\ parameters\ (unquoted\ spaces) 所有位置参数(unquoted\ spaces)
+menutrans Flags\ set 设置标志
+menutrans Return\ code\ of\ last\ command 返回前一条命令的代码
+menutrans Process\ number\ of\ this\ shell shell\ 自身进程号
+menutrans Process\ number\ of\ last\ background\ command 前一条后台命令的进程号
+menutrans Environ 环境变量
+menutrans Mark\ created\ or\ modified\ variables\ for\ export 标记修改的或者创建的变量为导出
+menutrans Exit\ when\ command\ returns\ non-zero\ status 当命令返回非零状态时退出
+menutrans Disable\ file\ name\ expansion 禁用文件名拓展
+menutrans Locate\ and\ remember\ commands\ when\ being\ looked\ up 当查询命令时定位并记住该命令
+menutrans All\ assignment\ statements\ are\ placed\ in\ the\ environment\ for\ a\ command 所有的赋值参数被放在命令的环境中
+menutrans Read\ commands\ but\ do\ not\ execute\ them 读命令但是不要执行
+menutrans Exit\ after\ reading\ and\ executing\ one\ command 读并执行一个命令之后退出
+menutrans Treat\ unset\ variables\ as\ an\ error\ when\ substituting 替换时把未设置命令视为错误
+menutrans Print\ shell\ input\ lines\ as\ they\ are\ read 读\ shell\ 输入行的时候打印
+menutrans Print\ commands\ and\ their\ arguments\ as\ they\ are\ executed 被执行时打印命令和参数
+" }}}
+
+" termdebug menu
+" termdebug menuitems {{{1
+" From termdebug.vim
+menutrans Set\ breakpoint 设置断点
+menutrans Clear\ breakpoint 清除断点
+menutrans Run\ until 运行到
+menutrans Evaluate 求值
+menutrans WinBar 工具条
+menutrans Step 单步
+menutrans Next 下一个
+menutrans Finish 结束
+menutrans Cont 继续
+menutrans Stop 停止
+" }}}
+
+" debchangelog menu
+" debchangelog menuitems {{{1
+" From debchangelog.vim
+menutrans &Changelog 更新日志(&C)
+menutrans &New\ Version 新版本(&N)
+menutrans &Add\ Entry 添加条目(&A)
+menutrans &Close\ Bug 关闭\ Bug(&C)
+menutrans Set\ &Distribution 设置发行版(&D)
+menutrans &unstable 不稳定(&U)
+menutrans Set\ &Urgency 设置紧急(&U)
+menutrans &low 低(&L)
+menutrans &medium 中(&M)
+menutrans &high 高(&H)
+menutrans U&nfinalise 未完成(&N)
+menutrans &Finalise 完成(&F)
+" }}}
+
+" ada menu
+" ada menuitems {{{1
+" From ada.vim
+menutrans Tag 标签
+menutrans List 列表
+menutrans Jump 跳转
+menutrans Create\ File 创建文件
+menutrans Create\ Dir 创建目录
+menutrans Highlight 高亮
+menutrans Toggle\ Space\ Errors 切换空格错误
+menutrans Toggle\ Lines\ Errors 切换行错误
+menutrans Toggle\ Rainbow\ Color 切换彩虹颜色
+menutrans Toggle\ Standard\ Types 切换标准类型
+" }}}
+
+" gnat menu
+" gnat menuitems {{{1
+" From gnat.vim
+menutrans Build 构建
+menutrans Pretty\ Print 重新格式化代码
+menutrans Find 查找
+menutrans Set\ Projectfile\.\.\. 设置项目文件\.\.\.
+" }}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: set ts=4 sw=4 noet fdm=marker fdc=4 :
diff --git a/runtime/lang/menu_zh_tw.big5.vim b/runtime/lang/menu_zh_tw.big5.vim
new file mode 100644
index 0000000..f437ce7
--- /dev/null
+++ b/runtime/lang/menu_zh_tw.big5.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Traditional Chinese
+
+source <sfile>:p:h/menu_chinese_taiwan.950.vim
diff --git a/runtime/lang/menu_zh_tw.cp950.vim b/runtime/lang/menu_zh_tw.cp950.vim
new file mode 100644
index 0000000..f437ce7
--- /dev/null
+++ b/runtime/lang/menu_zh_tw.cp950.vim
@@ -0,0 +1,3 @@
+" Menu Translations: Traditional Chinese
+
+source <sfile>:p:h/menu_chinese_taiwan.950.vim
diff --git a/runtime/lang/menu_zh_tw.utf-8.vim b/runtime/lang/menu_zh_tw.utf-8.vim
new file mode 100644
index 0000000..693e28d
--- /dev/null
+++ b/runtime/lang/menu_zh_tw.utf-8.vim
@@ -0,0 +1,292 @@
+" Menu Translations: Traditional Chinese
+" Translated By: Hung-Te Lin <piaip@csie.ntu.edu.tw>
+" Last Change: 2012 May 01
+" Original translations
+
+" {{{ Quit when menu translations have already been done.
+if exists("did_menu_trans")
+ finish
+endif
+let did_menu_trans = 1
+" }}}
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+scriptencoding utf-8
+
+" {{{ Help menu: complete
+menutrans &Help 輔助說明(&H)
+" ------------------------------------------------------------------------
+menutrans &Overview<Tab><F1> 說明文件總覽(&O)<Tab><F1>
+menutrans &User\ Manual 使用者手冊(&U)
+menutrans &How-to\ links 如何作\.\.\.(&H)
+menutrans &GUI 圖型界面(&G)
+menutrans &Credits 感謝(&C)
+menutrans Co&pying 版權(&P)
+menutrans &Sponsor/Register 贊助/註冊(&S)
+menutrans O&rphans 拯救孤兒(&R)
+" ------------------------------------------------------------------------
+menutrans &Version 程式版本資訊(&V)
+menutrans &About 關於\ Vim(&A)
+" }}}
+
+" {{{ File menu: complete
+menutrans &File 檔案(&F)
+" ------------------------------------------------------------------------
+menutrans &Open\.\.\.<Tab>:e 開啟(&O)\.\.\.<Tab>:e
+menutrans Sp&lit-Open\.\.\.<Tab>:sp 分割視窗並開啟(&L)<Tab>:sp
+menutrans &New<Tab>:enew 編輯新檔案(&N)<Tab>:enew
+menutrans &Close<Tab>:close 關閉檔案(&C)<Tab>:close
+" ------------------------------------------------------------------------
+menutrans &Save<Tab>:w 儲存(&S)<Tab>:w
+menutrans Save\ &As\.\.\.<Tab>:sav 另存新檔(&A)\.\.\.<Tab>:sav
+" ------------------------------------------------------------------------
+menutrans Split\ &Diff\ with\.\.\. 比較(&Diff)\.\.\.
+menutrans Split\ Patched\ &By\.\.\. 執行Patch(&B)\.\.\.
+" ------------------------------------------------------------------------
+menutrans &Print 列印(&P)
+" ------------------------------------------------------------------------
+menutrans Sa&ve-Exit<Tab>:wqa 儲存並離開(&V)<Tab>:wqa
+menutrans E&xit<Tab>:qa 離開(&X)<Tab>:qa
+" }}}
+
+" {{{ Edit menu
+menutrans &Edit 編輯(&E)
+" ------------------------------------------------------------------------
+menutrans &Undo<Tab>u 復原(&U)<Tab>u
+menutrans &Redo<Tab>^R 取消上次復原(&R)<Tab>^R
+menutrans Rep&eat<Tab>\. 重複上次動作(&E)<Tab>\.
+" ------------------------------------------------------------------------
+menutrans Cu&t<Tab>"+x 剪下(&T)<Tab>"+x
+menutrans &Copy<Tab>"+y 複製(&C)<Tab>"+y
+menutrans &Paste<Tab>"+gP 貼上(&P)<Tab>"+gP
+menutrans Put\ &Before<Tab>[p 貼到游標前(&B)<Tab>[p
+menutrans Put\ &After<Tab>]p 貼到游標後(&A)<Tab>]p
+menutrans &Delete<Tab>x 刪除(&D)<Tab>x
+menutrans &Select\ All<Tab>ggVG 全選(&S)<Tab>ggvG
+" ------------------------------------------------------------------------
+menutrans &Find\.\.\. 尋找(&F)\.\.\.
+menutrans Find\ and\ Rep&lace\.\.\. 尋找並取代(&L)\.\.\.
+" ------------------------------------------------------------------------
+menutrans Settings\ &Window 設定視窗(&W)
+menutrans &Global\ Settings 全域設定(&G)
+menutrans F&ile\ Settings 設定此檔案(&I)
+menutrans C&olor\ Scheme 配色設定(&O)
+menutrans &Keymap 鍵盤對應(&K)
+ " "{{{ Keymap:
+ menutrans None 無
+ " }}}
+menutrans Select\ Fo&nt\.\.\. 設定字型(&N)\.\.\.
+" }}}
+
+" {{{ Edit.FileSettings
+menutrans Toggle\ Line\ &Numbering<Tab>:set\ nu! 切換顯示行號(&N)<Tab>:set\ nu!
+menutrans Toggle\ &List\ Mode<Tab>:set\ list! 切換顯示行尾及TAB(&L)<Tab>:set\ list!
+menutrans Toggle\ Line\ &Wrap<Tab>:set\ wrap! 切換自動折行顯示(&W)<Tab>:set\ wrap!
+menutrans Toggle\ W&rap\ at\ word<Tab>:set\ lbr! 切換折行顯示可任意斷句(&R)<Tab>:set\ lbr!
+menutrans Toggle\ &expand-tab<Tab>:set\ et! 切換展開TAB(&E)<Tab>:set\ et!
+menutrans Toggle\ &auto-indent<Tab>:set\ ai! 切換自動縮排(&A)<Tab>:set\ ai!
+menutrans Toggle\ &C-indenting<Tab>:set\ cin! 切換C語言縮排(&C)<Tab>:set\ cin!
+" ------------------------------------------------------------------------
+menutrans &Shiftwidth 縮排寬度(shiftwidth)(&S)
+menutrans Soft\ &Tabstop 軟體模擬TAB(softtabstop)(&T)
+menutrans Te&xt\ Width\.\.\. 文字頁面寬度(textwidth)(&X)\.\.\.
+menutrans &File\ Format\.\.\. 設定檔案格式(對應作業系統)(&F)\.\.\.
+" }}}
+
+" {{{ Edit.GlobalSettings
+menutrans Toggle\ Pattern\ &Highlight<Tab>:set\ hls! 切換高亮度搜尋字串(&H)<Tab>:set\ hls!
+menutrans Toggle\ &Ignore-case<Tab>:set\ ic! 切換忽略大小寫(&I)<Tab>:set\ ic!
+menutrans Toggle\ &Showmatch<Tab>:set\ sm! 切換顯示對應括號(&S)<Tab>:set\ sm!
+menutrans Toggle\ Vi\ C&ompatible<Tab>:set\ cp! 切換傳統Vi相容模式(&O)<Tab>:set\ cp!
+menutrans &Context\ lines 本文前後保留行數(scrolloff)(&C)
+menutrans &Virtual\ Edit 游標任意移動(virtualedit)(&V)
+ " {{{ Edit.GlobalSettings.VirtualEdit
+ menutrans Never 不使用
+ menutrans Block\ Selection 區塊選擇時
+ menutrans Insert\ mode 插入模式時
+ menutrans Block\ and\ Insert 區塊與插入模式
+ menutrans Always 一直開啟
+ " }}}
+menutrans Toggle\ Insert\ &Mode<Tab>:set\ im! 切換插入模式(&M)<Tab>:set\ im!
+menutrans Search\ &Path\.\.\. 搜尋路徑(&P)\.\.\.
+menutrans Ta&g\ Files\.\.\. Tag\ 標籤索引檔案(&G)\.\.\.
+" ------------------------------------------------------------------------
+menutrans Toggle\ &Toolbar 切換使用工具列(&T)
+menutrans Toggle\ &Bottom\ Scrollbar 切換使用底端捲動軸(&B)
+menutrans Toggle\ &Left\ Scrollbar 切換使用左端捲動軸(&L)
+menutrans Toggle\ &Right\ Scrollbar 切換使用右端捲動軸(&R)
+" }}}
+
+" {{{ Tools menu: complete
+menutrans &Tools 工具(&T)
+" ------------------------------------------------------------------------
+menutrans &Jump\ to\ this\ tag<Tab>g^] 檢索游標處的標籤關鍵字(tag)(&J)<Tab>g^]
+menutrans Jump\ &back<Tab>^T 跳回檢索前的位置(&B)<Tab>^T
+menutrans Build\ &Tags\ File 建立標籤索引檔\ Tags(&T)
+" ------------------------------------------------------------------------
+menutrans &Folding 覆疊(Fold)設定(&F)
+ " {{{ Tools.Fold
+ menutrans &Enable/Disable\ folds<Tab>zi 切換使用\ Folding(&E)<Tab>zi
+ menutrans &View\ Cursor\ Line<Tab>zv 檢視此層\ Fold(&V)<Tab>zv
+ menutrans Vie&w\ Cursor\ Line\ only<Tab>zMzx 只檢視此\ Fold(&W)<Tab>zMzx
+ menutrans C&lose\ more\ folds<Tab>zm 收起一層\ Folds(&L)<Tab>zm
+ menutrans &Close\ all\ folds<Tab>zM 收起所有\ Folds(&C)<Tab>zM
+ menutrans O&pen\ more\ folds<Tab>zr 打開一層\ Folds(&P)<Tab>zr
+ menutrans &Open\ all\ folds<Tab>zR 打開所有\ Folds(&O)<Tab>zR
+ menutrans Fold\ Met&hod Folding\ 方式(&H)
+ " {{{ Tools.Fold.Method
+ menutrans M&anual 手動建立(&A)
+ menutrans I&ndent 依照縮排(&N)
+ menutrans E&xpression 自訂運算式(&X)
+ menutrans S&yntax 依照語法設定(&Y)
+ menutrans &Diff Diff(&D)
+ menutrans Ma&rker 標記(Marker)(&R)
+ " }}}
+ " ------------------------------------------------------------------------
+ menutrans Create\ &Fold<Tab>zf 建立\ Fold(&F)<Tab>zf
+ menutrans &Delete\ Fold<Tab>zd 刪除\ Fold(&D)<Tab>zd
+ menutrans Delete\ &All\ Folds<Tab>zD 刪除所有\ Fold(&A)<Tab>zD
+ " ------------------------------------------------------------------------
+ menutrans Fold\ column\ &width 設定\ Fold欄寬(&W)
+ " }}}
+menutrans &Diff Diff(&D)
+ " {{{ Tools.Diff
+ menutrans &Update 更新(&U)
+ menutrans &Get\ Block 取得區塊(&G)
+ menutrans &Put\ Block 貼上區塊(&P)
+ " }}}
+" ------------------------------------------------------------------------
+menutrans &Make<Tab>:make 執行\ Make(&M)<Tab>:make
+menutrans &List\ Errors<Tab>:cl 列出編譯錯誤(&E)<Tab>:cl
+menutrans L&ist\ Messages<Tab>:cl! 列出所有訊息(&I)<Tab>:cl!
+menutrans &Next\ Error<Tab>:cn 下一個編譯錯誤處(&N)<Tab>:cn
+menutrans &Previous\ Error<Tab>:cp 上一個編譯錯誤處(&P)<Tab>:cp
+menutrans &Older\ List<Tab>:cold 檢視舊錯誤列表(&O)<Tab>:cold
+menutrans N&ewer\ List<Tab>:cnew 檢視新錯誤列表(&E)<Tab>:cnew
+menutrans Error\ &Window 錯誤訊息視窗(&W)
+ " {{{ Tools.ErrorWindow
+ menutrans &Update<Tab>:cwin 更新(&U)<Tab>:cwin
+ menutrans &Open<Tab>:copen 開啟(&O)<Tab>:copen
+ menutrans &Close<Tab>:cclose 關閉(&C)<Tab>:cclose
+ " }}}
+menutrans &Set\ Compiler 設定編譯器Compiler(&S)
+" ------------------------------------------------------------------------
+menutrans &Convert\ to\ HEX<Tab>:%!xxd 轉換成16進位碼(&C)<Tab>:%!xxd
+menutrans Conve&rt\ back<Tab>:%!xxd\ -r 從16進位碼轉換回文字(&R)<Tab>:%!xxd\ -r
+" }}}
+
+" {{{ Syntax menu: compete
+menutrans &Syntax 語法效果(&S)
+" ------------------------------------------------------------------------
+menutrans &Show\ filetypes\ in\ menu 顯示所有可用檔案格式(&S)
+menutrans Set\ '&syntax'\ only 只使用\ 'syntax'(&S)
+menutrans Set\ '&filetype'\ too 使用\ 'syntax'+'filetype'(&F)
+menutrans &Off 關閉效果(&O)
+menutrans &Manual 手動設定(&M)
+menutrans A&utomatic 自動設定(&U)
+menutrans on/off\ for\ &This\ file 只切換此檔的效果設定(&T)
+" ------------------------------------------------------------------------
+menutrans Co&lor\ test 色彩顯示測試(&L)
+menutrans &Highlight\ test 語法效果測試(&H)
+menutrans &Convert\ to\ HTML 轉換成\ HTML\ 格式(&C)
+" }}}
+
+" {{{ Buffers menu: complete
+menutrans &Buffers 緩衝區(&B)
+" ------------------------------------------------------------------------
+menutrans &Refresh\ menu 更新(&R)
+menutrans &Delete 刪除(&D)
+menutrans &Alternate 切換上次編輯緩衝區(&A)
+menutrans &Next 下一個(&N)
+menutrans &Previous 前一個(&P)
+" ------------------------------------------------------------------------
+" menutrans [No\ file] [無檔案]
+" }}}
+
+" {{{ Window menu: complete
+menutrans &Window 視窗(&W)
+" ------------------------------------------------------------------------
+menutrans &New<Tab>^Wn 開新視窗(&N)<Tab>^Wn
+menutrans S&plit<Tab>^Ws 分割視窗(&P)<Tab>^Ws
+menutrans Sp&lit\ To\ #<Tab>^W^^ 分割到#(&L)<Tab>^W^^
+menutrans Split\ &Vertically<Tab>^Wv 垂直分割(&V)<Tab>^Wv
+menutrans Split\ File\ E&xplorer 檔案總管式分割(&X)
+" ------------------------------------------------------------------------
+menutrans &Close<Tab>^Wc 關閉視窗(&C)<Tab>^Wc
+menutrans Close\ &Other(s)<Tab>^Wo 關閉其它視窗(&O)<Tab>^Wo
+" ------------------------------------------------------------------------
+menutrans Move\ &To 移至(&T)
+ " {{{ Window.MoveTo
+ menutrans &Top<Tab>^WK 頂端(&T)<Tab>^WK
+ menutrans &Bottom<Tab>^WJ 底端(&B)<Tab>^WJ
+ menutrans &Left\ side<Tab>^WH 左邊(&L)<Tab>^WH
+ menutrans &Right\ side<Tab>^WL 右邊(&R)<Tab>^WL
+ " }}}
+menutrans Rotate\ &Up<Tab>^WR 上移視窗(&U)<Tab>^WR
+menutrans Rotate\ &Down<Tab>^Wr 下移視窗(&D)<Tab>^Wr
+" ------------------------------------------------------------------------
+menutrans &Equal\ Size<Tab>^W= 所有視窗等高(&E)<Tab>^W=
+menutrans &Max\ Height<Tab>^W_ 最大高度(&M)<Tab>^W
+menutrans M&in\ Height<Tab>^W1_ 最小高度(&I)<Tab>^W1_
+menutrans Max\ &Width<Tab>^W\| 最大寬度(&W)<Tab>^W\|
+menutrans Min\ Widt&h<Tab>^W1\| 最小寬度(&H)<Tab>^W1\|
+" }}}
+
+" {{{ The popup menu: complete
+menutrans &Undo 復原(&U)
+" ------------------------------------------------------------------------
+menutrans Cu&t 剪下(&T)
+menutrans &Copy 複製(&C)
+menutrans &Paste 貼上(&P)
+menutrans &Delete 刪除(&D)
+" ------------------------------------------------------------------------
+menutrans Select\ Blockwise Blockwise式選擇
+menutrans Select\ &Word 選擇單字(&W)
+menutrans Select\ &Line 選擇行(&L)
+menutrans Select\ &Block 選擇區塊(&B)
+menutrans Select\ &All 全選(&A)
+" }}}
+
+" {{{ The GUI toolbar: complete
+if has("toolbar")
+ if exists("*Do_toolbar_tmenu")
+ delfun Do_toolbar_tmenu
+ endif
+ fun Do_toolbar_tmenu()
+ tmenu ToolBar.Open 開啟檔案
+ tmenu ToolBar.Save 儲存目前編輯中的檔案
+ tmenu ToolBar.SaveAll 儲存全部檔案
+ tmenu ToolBar.Print 列印
+" ------------------------------------------------------------------------
+ tmenu ToolBar.Undo 復原上次變動
+ tmenu ToolBar.Redo 取消上次復原動作
+" ------------------------------------------------------------------------
+ tmenu ToolBar.Cut 剪下至剪貼簿
+ tmenu ToolBar.Copy 複製到剪貼簿
+ tmenu ToolBar.Paste 由剪貼簿貼上
+" ------------------------------------------------------------------------
+ tmenu ToolBar.Find 尋找...
+ tmenu ToolBar.FindNext 找下一個
+ tmenu ToolBar.FindPrev 找上一個
+ tmenu ToolBar.Replace 取代...
+" ------------------------------------------------------------------------
+ tmenu ToolBar.LoadSesn 載入 Session
+ tmenu ToolBar.SaveSesn 儲存目前的 Session
+ tmenu ToolBar.RunScript 執行 Vim 程式檔
+" ------------------------------------------------------------------------
+ tmenu ToolBar.Make 執行 Make
+ tmenu ToolBar.Shell 開啟一個命令列視窗 DosBox
+ tmenu ToolBar.RunCtags 執行 ctags
+ tmenu ToolBar.TagJump 跳到目前游標位置的 tag
+ tmenu ToolBar.Help Vim 輔助說明
+ tmenu ToolBar.FindHelp 搜尋 Vim 說明文件
+ endfun
+endif
+" }}}
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:foldmethod=marker:nowrap:foldcolumn=2:foldlevel=1
diff --git a/runtime/macmap.vim b/runtime/macmap.vim
new file mode 100644
index 0000000..dc76f15
--- /dev/null
+++ b/runtime/macmap.vim
@@ -0,0 +1,75 @@
+" System gvimrc file for Mac OS X
+" Author: Benji Fisher <benji@member.AMS.org>
+" Last Change: Thu Mar 09 09:00 AM 2006 EST
+"
+" Define Mac-standard keyboard shortcuts.
+
+" We don't change 'cpoptions' here, because it would not be set properly when
+" a .vimrc file is found later. Thus don't use line continuation and use
+" <special> in mappings.
+
+nnoremap <special> <D-n> :confirm enew<CR>
+vmap <special> <D-n> <Esc><D-n>gv
+imap <special> <D-n> <C-O><D-n>
+cmap <special> <D-n> <C-C><D-n>
+omap <special> <D-n> <Esc><D-n>
+
+nnoremap <special> <D-o> :browse confirm e<CR>
+vmap <special> <D-o> <Esc><D-o>gv
+imap <special> <D-o> <C-O><D-o>
+cmap <special> <D-o> <C-C><D-o>
+omap <special> <D-o> <Esc><D-o>
+
+nnoremap <silent> <special> <D-w> :if winheight(2) < 0 <Bar> confirm enew <Bar> else <Bar> confirm close <Bar> endif<CR>
+vmap <special> <D-w> <Esc><D-w>gv
+imap <special> <D-w> <C-O><D-w>
+cmap <special> <D-w> <C-C><D-w>
+omap <special> <D-w> <Esc><D-w>
+
+nnoremap <silent> <special> <D-s> :if expand("%") == ""<Bar>browse confirm w<Bar> else<Bar>confirm w<Bar>endif<CR>
+vmap <special> <D-s> <Esc><D-s>gv
+imap <special> <D-s> <C-O><D-s>
+cmap <special> <D-s> <C-C><D-s>
+omap <special> <D-s> <Esc><D-s>
+
+nnoremap <special> <D-S-s> :browse confirm saveas<CR>
+vmap <special> <D-S-s> <Esc><D-s>gv
+imap <special> <D-S-s> <C-O><D-s>
+cmap <special> <D-S-s> <C-C><D-s>
+omap <special> <D-S-s> <Esc><D-s>
+
+" From the Edit menu of SimpleText:
+nnoremap <special> <D-z> u
+vmap <special> <D-z> <Esc><D-z>gv
+imap <special> <D-z> <C-O><D-z>
+cmap <special> <D-z> <C-C><D-z>
+omap <special> <D-z> <Esc><D-z>
+
+vnoremap <special> <D-x> "+x
+
+vnoremap <special> <D-c> "+y
+
+cnoremap <special> <D-c> <C-Y>
+
+nnoremap <special> <D-v> "+gP
+cnoremap <special> <D-v> <C-R>+
+execute 'vnoremap <script> <special> <D-v>' paste#paste_cmd['v']
+execute 'inoremap <script> <special> <D-v>' paste#paste_cmd['i']
+
+nnoremap <silent> <special> <D-a> :if &slm != ""<Bar>exe ":norm gggH<C-O>G"<Bar> else<Bar>exe ":norm ggVG"<Bar>endif<CR>
+vmap <special> <D-a> <Esc><D-a>
+imap <special> <D-a> <Esc><D-a>
+cmap <special> <D-a> <C-C><D-a>
+omap <special> <D-a> <Esc><D-a>
+
+nnoremap <special> <D-f> /
+vmap <special> <D-f> <Esc><D-f>
+imap <special> <D-f> <Esc><D-f>
+cmap <special> <D-f> <C-C><D-f>
+omap <special> <D-f> <Esc><D-f>
+
+nnoremap <special> <D-g> n
+vmap <special> <D-g> <Esc><D-g>
+imap <special> <D-g> <C-O><D-g>
+cmap <special> <D-g> <C-C><D-g>
+omap <special> <D-g> <Esc><D-g>
diff --git a/runtime/macros.info b/runtime/macros.info
new file mode 100755
index 0000000..bbb0b4f
--- /dev/null
+++ b/runtime/macros.info
Binary files differ
diff --git a/runtime/macros/README.txt b/runtime/macros/README.txt
new file mode 100644
index 0000000..22f9a97
--- /dev/null
+++ b/runtime/macros/README.txt
@@ -0,0 +1,33 @@
+The macros in the maze, hanoi and urm directories can be used to test Vim for
+vi compatibility. They have been written for vi to show its unlimited
+possibilities. The life macros can be used for performance comparisons.
+
+hanoi Macros that solve the tower of hanoi problem.
+life Macros that run Conway's game of life.
+maze Macros that solve a maze (amazing!).
+urm Macros that simulate a simple computer: "Universal Register Machine"
+
+
+
+The other files contain some handy utilities. They also serve as examples for
+how to use Vi and Vim functionality.
+
+less.sh + less.vim make Vim work like less (or more)
+
+
+
+The following have been moved to an optional package. Add the command to your
+vimrc file to use the package:
+
+packadd! dvorak " Dvorak keyboard support; adds mappings
+
+packadd! editexisting " when editing a file that is already edited with
+ " another Vim instance, go to that Vim instance
+
+packadd! justify " justifying text.
+
+packadd! matchit " makes the % command work better
+
+packadd! shellmenu " menus for editing shell scripts in the GUI version
+
+packadd! swapmouse " swap left and right mouse buttons
diff --git a/runtime/macros/README.txt.info b/runtime/macros/README.txt.info
new file mode 100644
index 0000000..d173e72
--- /dev/null
+++ b/runtime/macros/README.txt.info
Binary files differ
diff --git a/runtime/macros/editexisting.vim b/runtime/macros/editexisting.vim
new file mode 100644
index 0000000..6e8f74f
--- /dev/null
+++ b/runtime/macros/editexisting.vim
@@ -0,0 +1,3 @@
+" Load the editexisting package.
+" For those users who were loading the editexisting plugin from here.
+packadd editexisting
diff --git a/runtime/macros/hanoi.info b/runtime/macros/hanoi.info
new file mode 100644
index 0000000..8072e56
--- /dev/null
+++ b/runtime/macros/hanoi.info
Binary files differ
diff --git a/runtime/macros/hanoi/click.me b/runtime/macros/hanoi/click.me
new file mode 100644
index 0000000..24f178b
--- /dev/null
+++ b/runtime/macros/hanoi/click.me
@@ -0,0 +1,14 @@
+
+
+See Vim solve the towers of Hanoi!
+
+Instructions:
+ type ":so hanoi.vim<RETURN>" to load the macros
+ type "g" to start it
+
+and watch it go.
+
+ to quit type ":q!<RETURN>"
+to interrupt type CTRL-C
+
+(This text will disappear as soon as you type "g")
diff --git a/runtime/macros/hanoi/click.me.info b/runtime/macros/hanoi/click.me.info
new file mode 100644
index 0000000..f38cb5a
--- /dev/null
+++ b/runtime/macros/hanoi/click.me.info
Binary files differ
diff --git a/runtime/macros/hanoi/hanoi.vim b/runtime/macros/hanoi/hanoi.vim
new file mode 100644
index 0000000..1d075fa
--- /dev/null
+++ b/runtime/macros/hanoi/hanoi.vim
@@ -0,0 +1,64 @@
+set remap
+set noterse
+set wrapscan
+" to set the height of the tower, change the digit in the following
+" two lines to the height you want (select from 1 to 9)
+map t 7
+map! t 7
+map L 1G/t X/^0 $P1GJ$An$BGC0e$X0E0F$X/T @f @h $A1GJ@f0l$Xn$PU
+map g IL
+
+map J /^0[^t]*$
+map X x
+map P p
+map U L
+map A "fyl
+map B "hyl
+map C "fp
+map e "fy2l
+map E "hp
+map F "hy2l
+
+" initialisations:
+" KM cleanup buffer
+" Y create tower of desired height
+" NOQ copy it and insert a T
+" NO copy this one
+" S change last char into a $
+" R change last char in previous line into a n
+" T insert two lines containing a zero
+" V add a last line containing a backslash
+map I KMYNOQNOSkRTV
+
+"create empty line
+map K 1Go
+
+"delete to end of file
+map M dG
+
+"yank one line
+map N yy
+
+"put
+map O p
+
+"delete more than height-of-tower characters
+map q tllD
+
+"create a tower of desired height
+map Y o0123456789Z0q
+
+"insert a T in column 1
+map Q 0iT
+
+"substitute last character with a n
+map R $rn
+
+"substitute last character with a $
+map S $r$
+
+"insert two lines containing a zero
+map T ko0 0 
+
+"add a backslash at the end
+map V Go/
diff --git a/runtime/macros/hanoi/poster b/runtime/macros/hanoi/poster
new file mode 100644
index 0000000..dd03b26
--- /dev/null
+++ b/runtime/macros/hanoi/poster
@@ -0,0 +1,36 @@
+Article 2913 of alt.sources:
+Path: oce-rd1!hp4nl!mcsun!uunet!munnari.oz.au!metro!cluster!swift!softway!otc!gregm
+From: gregm@otc.otca.oz.au (Greg McFarlane)
+Newsgroups: comp.sources.d,alt.sources,comp.editors
+Subject: VI SOLVES HANOI
+Message-ID: <2323@otc.otca.oz>
+Date: 19 Feb 91 01:32:14 GMT
+Sender: news@otc.otca.oz
+Reply-To: gregm@otc.otca.oz.au (Greg McFarlane)
+Organization: OTC Development Unit, Australia
+Lines: 80
+Xref: oce-rd1 comp.sources.d:5702 alt.sources:2913 comp.editors:2313
+
+Submitted-by: gregm@otc.otca.oz.au
+Archive-name: hanoi.vi.macros/part01
+
+Everyone seems to be writing stupid Tower of Hanoi programs.
+Well, here is the stupidest of them all: the hanoi solving vi macros.
+
+Save this article, unshar it, and run uudecode on hanoi.vi.macros.uu.
+This will give you the macro file hanoi.vi.macros.
+Then run vi (with no file: just type "vi") and type:
+ :so hanoi.vi.macros
+ g
+and watch it go.
+
+The default height of the tower is 7 but can be easily changed by editing
+the macro file.
+
+The disks aren't actually shown in this version, only numbers representing
+each disk, but I believe it is possible to write some macros to show the
+disks moving about as well. Any takers?
+
+(For maze solving macros, see alt.sources or comp.editors)
+
+Greg
diff --git a/runtime/macros/hanoi/poster.info b/runtime/macros/hanoi/poster.info
new file mode 100644
index 0000000..780fa35
--- /dev/null
+++ b/runtime/macros/hanoi/poster.info
Binary files differ
diff --git a/runtime/macros/justify.vim b/runtime/macros/justify.vim
new file mode 100644
index 0000000..011a911
--- /dev/null
+++ b/runtime/macros/justify.vim
@@ -0,0 +1,3 @@
+" Load the justify package.
+" For those users who were loading the justify plugin from here.
+packadd justify
diff --git a/runtime/macros/less.bat b/runtime/macros/less.bat
new file mode 100644
index 0000000..bbe619b
--- /dev/null
+++ b/runtime/macros/less.bat
@@ -0,0 +1,10 @@
+@echo off
+rem batch file to start Vim with less.vim.
+rem Read stdin if no arguments were given.
+rem Written by Ken Takata.
+
+if "%1"=="" (
+ vim --cmd "let no_plugin_maps = 1" -c "runtime! macros/less.vim" -
+) else (
+ vim --cmd "let no_plugin_maps = 1" -c "runtime! macros/less.vim" %*
+)
diff --git a/runtime/macros/less.sh b/runtime/macros/less.sh
new file mode 100755
index 0000000..e29958f
--- /dev/null
+++ b/runtime/macros/less.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Shell script to start Vim with less.vim.
+# Read stdin if no arguments were given and stdin was redirected.
+
+if test -t 1; then
+ if test $# = 0; then
+ if test -t 0; then
+ echo "Missing filename" 1>&2
+ exit
+ fi
+ vim --cmd 'let no_plugin_maps = 1' -c 'runtime! macros/less.vim' -
+ else
+ vim --cmd 'let no_plugin_maps = 1' -c 'runtime! macros/less.vim' "$@"
+ fi
+else
+ # Output is not a terminal, cat arguments or stdin
+ if test $# = 0; then
+ if test -t 0; then
+ echo "Missing filename" 1>&2
+ exit
+ fi
+ cat
+ else
+ cat "$@"
+ fi
+fi
diff --git a/runtime/macros/less.vim b/runtime/macros/less.vim
new file mode 100644
index 0000000..17433f4
--- /dev/null
+++ b/runtime/macros/less.vim
@@ -0,0 +1,292 @@
+" Vim script to work like "less"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2020 Dec 17
+
+" Avoid loading this file twice, allow the user to define his own script.
+if exists("loaded_less")
+ finish
+endif
+let loaded_less = 1
+
+" If not reading from stdin, skip files that can't be read.
+" Exit if there is no file at all.
+if argc() > 0
+ let s:i = 0
+ while 1
+ if filereadable(argv(s:i))
+ if s:i != 0
+ sleep 3
+ endif
+ break
+ endif
+ if isdirectory(argv(s:i))
+ echomsg "Skipping directory " . argv(s:i)
+ elseif getftime(argv(s:i)) < 0
+ echomsg "Skipping non-existing file " . argv(s:i)
+ else
+ echomsg "Skipping unreadable file " . argv(s:i)
+ endif
+ echo "\n"
+ let s:i = s:i + 1
+ if s:i == argc()
+ quit
+ endif
+ next
+ endwhile
+endif
+
+" we don't want 'compatible' here
+if &cp
+ set nocp
+endif
+
+" enable syntax highlighting if not done already
+if !get(g:, 'syntax_on', 0)
+ syntax enable
+endif
+
+set so=0
+set hlsearch
+set incsearch
+nohlsearch
+" Don't remember file names and positions
+set viminfo=
+set nows
+" Inhibit screen updates while searching
+let s:lz = &lz
+set lz
+
+" Allow the user to define a function, which can set options specifically for
+" this script.
+if exists('*LessInitFunc')
+ call LessInitFunc()
+endif
+
+" Used after each command: put cursor at end and display position
+if &wrap
+ noremap <SID>L L0:redraw<CR>:file<CR>
+ au VimEnter * normal! L0
+else
+ noremap <SID>L Lg0:redraw<CR>:file<CR>
+ au VimEnter * normal! Lg0
+endif
+
+" When reading from stdin don't consider the file modified.
+au VimEnter * set nomod
+
+" Can't modify the text or write the file.
+set nomodifiable readonly
+
+" Give help
+noremap h :call <SID>Help()<CR>
+map H h
+fun! s:Help()
+ echo "<Space> One page forward b One page backward"
+ echo "d Half a page forward u Half a page backward"
+ echo "<Enter> One line forward k One line backward"
+ echo "G End of file g Start of file"
+ echo "N% percentage in file"
+ 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"
+ echo "q Quit v Edit file"
+ let i = input("Hit Enter to continue")
+endfun
+
+" Scroll one page forward
+noremap <script> <Space> :call <SID>NextPage()<CR><SID>L
+map <C-V> <Space>
+map f <Space>
+map <C-F> <Space>
+map <PageDown> <Space>
+map <kPageDown> <Space>
+map <S-Down> <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("$")
+ if argidx() + 1 >= argc()
+ " Don't quit at the end of the last file
+ return
+ endif
+ next
+ 1
+ else
+ exe "normal! \<C-F>"
+ endif
+endfun
+
+" Re-read file and page forward "tail -f"
+map F :e<CR>G<SID>L:sleep 1<CR>F
+
+" Scroll half a page forward
+noremap <script> d <C-D><SID>L
+map <C-D> d
+
+" Scroll one line forward
+noremap <script> <CR> <C-E><SID>L
+map <C-N> <CR>
+map e <CR>
+map <C-E> <CR>
+map j <CR>
+map <C-J> <CR>
+map <Down> <CR>
+
+" Scroll one page backward
+noremap <script> b <C-B><SID>L
+map <C-B> b
+map <PageUp> b
+map <kPageUp> b
+map <S-Up> b
+map w b
+map <Esc>v b
+
+" Scroll half a page backward
+noremap <script> u <C-U><SID>L
+noremap <script> <C-U> <C-U><SID>L
+
+" Scroll one line backward
+noremap <script> k <C-Y><SID>L
+map y k
+map <C-Y> k
+map <C-P> k
+map <C-K> k
+map <Up> k
+
+" Redraw
+noremap <script> r <C-L><SID>L
+noremap <script> <C-R> <C-L><SID>L
+noremap <script> R <C-L><SID>L
+
+" Start of file
+noremap <script> g gg<SID>L
+map < g
+map <Esc>< g
+map <Home> g
+map <kHome> g
+
+" End of file
+noremap <script> G G<SID>L
+map > G
+map <Esc>> G
+map <End> G
+map <kEnd> G
+
+" Go to percentage
+noremap <script> % %<SID>L
+map p %
+
+" Search
+noremap <script> / H$:call <SID>Forward()<CR>/
+if &wrap
+ noremap <script> ? H0:call <SID>Backward()<CR>?
+else
+ noremap <script> ? Hg0:call <SID>Backward()<CR>?
+endif
+
+fun! s:Forward()
+ " Searching forward
+ noremap <script> n H$nzt<SID>L
+ if &wrap
+ noremap <script> N H0Nzt<SID>L
+ else
+ noremap <script> N Hg0Nzt<SID>L
+ endif
+ cnoremap <silent> <script> <CR> <CR>:cunmap <lt>CR><CR>zt<SID>L
+endfun
+
+fun! s:Backward()
+ " Searching backward
+ if &wrap
+ noremap <script> n H0nzt<SID>L
+ else
+ noremap <script> n Hg0nzt<SID>L
+ endif
+ noremap <script> N H$Nzt<SID>L
+ cnoremap <silent> <script> <CR> <CR>:cunmap <lt>CR><CR>zt<SID>L
+endfun
+
+call s:Forward()
+cunmap <CR>
+
+" Quitting
+noremap q :q<CR>
+
+" Switch to editing (switch off less mode)
+map v :silent call <SID>End()<CR>
+fun! s:End()
+ set ma
+ if exists('s:lz')
+ let &lz = s:lz
+ endif
+ unmap h
+ unmap H
+ unmap <Space>
+ unmap <C-V>
+ unmap f
+ unmap <C-F>
+ unmap z
+ unmap <Esc><Space>
+ unmap F
+ unmap d
+ unmap <C-D>
+ unmap <CR>
+ unmap <C-N>
+ unmap e
+ unmap <C-E>
+ unmap j
+ unmap <C-J>
+ unmap b
+ unmap <C-B>
+ unmap w
+ unmap <Esc>v
+ unmap u
+ unmap <C-U>
+ unmap k
+ unmap y
+ unmap <C-Y>
+ unmap <C-P>
+ unmap <C-K>
+ unmap r
+ unmap <C-R>
+ unmap R
+ unmap g
+ unmap <
+ unmap <Esc><
+ unmap G
+ unmap >
+ unmap <Esc>>
+ unmap %
+ unmap p
+ unmap n
+ unmap N
+ unmap q
+ unmap v
+ unmap /
+ unmap ?
+ unmap <Up>
+ unmap <Down>
+ unmap <PageDown>
+ unmap <kPageDown>
+ unmap <PageUp>
+ unmap <kPageUp>
+ unmap <S-Down>
+ unmap <S-Up>
+ unmap <Home>
+ unmap <kHome>
+ unmap <End>
+ unmap <kEnd>
+endfun
+
+" vim: sw=2
diff --git a/runtime/macros/life/click.me b/runtime/macros/life/click.me
new file mode 100644
index 0000000..c2ed469
--- /dev/null
+++ b/runtime/macros/life/click.me
@@ -0,0 +1,9 @@
+
+To run the "Conway's game of life" macros:
+
+ 1. Type ":so life.vim". This loads the macros.
+ 2. Type "g" to run the macros.
+ 3. Type CTRL-C to interrupt.
+ 4. Type ":q!" to get out.
+
+See life.vim for more advanced usage.
diff --git a/runtime/macros/life/click.me.info b/runtime/macros/life/click.me.info
new file mode 100644
index 0000000..f575650
--- /dev/null
+++ b/runtime/macros/life/click.me.info
Binary files differ
diff --git a/runtime/macros/life/life.vim b/runtime/macros/life/life.vim
new file mode 100644
index 0000000..29832f0
--- /dev/null
+++ b/runtime/macros/life/life.vim
@@ -0,0 +1,262 @@
+" Macros to play Conway's Game of Life in vi
+" Version 1.0m: edges wrap
+" by Eli-the-Bearded Benjamin Elijah Griffin <vim@eli.users.panix.com>
+" Sept 1996
+" This file may be free distributed so long as these credits remain unchanged.
+"
+" Modified by Bram Moolenaar (Bram@vim.org), 1996 Sept 10
+" - Made it quite a bit faster, but now needs search patterns in the text
+" - Changed the order of mappings to top-down.
+" - Made "g" run the whole thing, "C" run one generation.
+" - Added support for any uppercase character instead of 'X'
+"
+" Rules:
+" If a germ has 0 or 1 live neighbors it dies of loneliness
+" If a germ has 2 or 3 live neighbors it survives
+" If a germ has 4 to 8 live neighbors it dies of starvation
+" If an empty box has 3 live neighbors a new germ is born
+"
+" A new born germ is an "A". Every generation it gets older: B, C, etc.
+" A germ dies of old age when it reaches "Z".
+"
+" Notice the rules do not mention edges. This version has the edges wrap
+" around. I have an earlier version that offers the option of live edges or
+" dead edges. Email me if you are interested. -Eli-
+"
+" Note: This is slow! One generation may take up to ten minutes (depends on
+" your computer and the vi version).
+"
+" Quite a lot of the messy stuff is to work around the vi error "Can't yank
+" inside global/macro". Still doesn't work for all versions of vi.
+"
+" To use these macros:
+"
+" vi start vi/vim
+"
+" :so life.mac Source this file
+"
+" g 'g'o! runs everything until interrupted: "IR".
+"
+" I Initialize everything. A board will be drawn at the end
+" of the current buffer. All line references in these macros
+" are relative to the end of the file and playing the game
+" can be done safely with any file as the current buffer.
+"
+" Change the left field with spaces and uppercase letters to suit
+" your taste.
+"
+" C 'C'ompute one generation.
+" + idem, time running one generation.
+" R 'R'un 'C'ompute until interrupted.
+" i<nr><Esc>z Make a number the only thing on the current line and use
+" 'z' to time that many generations.
+"
+" Time to run 30 generations on my 233 AMD K6 (FreeBSD 3.0):
+" vim 5.4 xterm 51 sec
+" gvim 5.4 Athena 42 sec
+" gvim 5.4 Motif 42 sec
+" gvim 5.4 GTK 50 sec
+" nvi 1.79 xterm 58 sec
+" vi 3.7 xterm 2 min 30 sec
+" Elvis 2.1 xterm 7 min 50 sec
+" Elvis 2.1 X11 6 min 31 sec
+"
+" Time to run 30 generations on my 850 AMD Duron (FreeBSD 4.2):
+" vim 5.8 xterm 21 sec
+" vim 6.0 xterm 24 sec
+" vim 6.0 Motif 32 sec
+" nvi 1.79 xterm 29 sec
+" vi 3.7 xterm 32 sec
+" elvis 2.1.4 xterm 34 sec
+"
+" And now the macros, more or less in top-down order.
+"
+" ----- macros that can be used by the human -----
+"
+" 'g'o: 'I'nitialize and then 'R'un 'C'ompute recursively (used by the human)
+map g IR
+"
+"
+" 'R'un 'C'ompute recursively (used by the human and 'g'o)
+map R CV
+" work around "tail recursion" problem in vi, "V" == "R".
+map V R
+"
+"
+" 'I'nitialize the board (used by the human and 'g'o)
+map I G)0)0)0)0)1)0)0)2)0)0)0)0,ok,-11k,-,R,IIN
+"
+"
+" 'C'ompute next generation (used by the human and others)
+map C T>>>>>>>>B&
+"
+"
+" Time running one generation (used by the human)
+map + <1C<2
+"
+"
+" Time running N generations, where N is the number on the current line.
+" (used by the human)
+map z ,^,&,*,&<1,*<2
+"
+" ----- END of macros that can be used by the human -----
+"
+" ----- Initialisation -----
+"
+map ,- :s/./-/g
+map ,o oPut 'X's in the left box, then hit 'C' or 'R'
+map ,R 03stop
+"
+" Write a new line (used by 'I'nitialize board)
+" In remembrance of John Conway, 26 December 1937 – 11 April 2020.
+map )0 o- --....................--....................-
+map )1 o- JOHN CONWAY --....................--....................-
+map )2 o- LIVES --....................--....................-
+"
+"
+" Initialisation of the pattern/command to execute for working out a square.
+" Pattern is: "#<germ><count>"
+" where <germ> is " " if the current germ is dead, "X" when living.
+" <count> is the number of living neighbours (including current germ)
+" expressed in X's
+"
+map ,Il8 O#XXXXXXXXXX .`a22lr 
+map ,Id8 o# XXXXXXXX .`a22lr 
+map ,Il7 o#XXXXXXXXX .`a22lr 
+map ,Id7 o# XXXXXXX .`a22lr 
+map ,Il6 o#XXXXXXXX .`a22lr 
+map ,Id6 o# XXXXXX .`a22lr 
+map ,Il5 o#XXXXXXX .`a22lr 
+map ,Id5 o# XXXXX .`a22lr 
+map ,Il4 o#XXXXXX .`a22lr 
+map ,Id4 o# XXXX .`a22lr 
+map ,Il3 o#XXXXX .,a
+map ,Id3 o# XXX .`a22lrA
+map ,Il2 o#XXXX .,a
+map ,Id2 o# XX .`a22lr 
+map ,Il1 o#XXX .`a22lr 
+map ,Id1 o# X .`a22lr 
+map ,Il0 o#XX .`a22lr 
+map ,Id0 o# .`a22lr 
+"
+" Patterns used to replace a germ with its next generation
+map ,Iaa o=AB =BC =CD =DE =EF =FG =GH =HI =IJ =JK =KL =LM =MN =NO =OP =PQ =QR
+map ,Iab o=RS =ST =TU =UV =VW =WX =XY =YZ =Z 
+"
+" Insert the searched patterns above the board
+map ,IIN G?^top ,Il8,Id8,Il7,Id7,Il6,Id6,Il5,Id5,Il4,Id4,Il3,Id3,Il2,Id2,Il1,Id1,Il0,Id0,Iaa,Iab
+"
+" ----- END of Initialisation -----
+"
+" ----- Work out one line -----
+"
+" Work out 'T'op line (used by show next)
+map T G,c2k,!9k,@,#j>2k,$j
+"
+" Work out 'B'ottom line (used by show next)
+map B ,%k>,$
+"
+" Work out a line (used by show next, work out top and bottom lines)
+map > 0 LWWWWWWWWWWWWWWWWWW,rj
+"
+" Refresh board (used by show next)
+map & :%s/^\(-[ A-Z]*-\)\(-[ A-Z]*-\)\(-[.]*-\)$/\2\3\3/
+"
+"
+" Work around vi multiple yank/put in a single macro limitation
+" (used by work out top and/or bottom line)
+map ,$ dd
+map ,% "cp
+map ,! "byy
+map ,@ "cyy
+map ,# "bP
+map ,c c$
+"
+" ----- END of Work out one line -----
+"
+" ----- Work out one square -----
+"
+" The next three work out a square: put all nine chars around the current
+" character on the bottom line (the bottom line must be empty when starting).
+"
+" 'W'ork out a center square (used by work out line)
+map W makh,3`ah,3`ajh,3(
+"
+"
+" Work out a 'L'eft square (used by work out line)
+map L makf-h,1`ak,2`af-h,1`a,2`ajf-h,1`aj,2(
+"
+"
+" Work out a 'R'ight square (used by work out line)
+map ,r makh,2`akF-l,1`ah,2`aF-l,1`ajh,2`ajF-l,1(
+"
+" 'M'ove a character to the end of the file (used by all work out square
+" macros)
+"
+map ,1 y G$p
+map ,2 2y G$p
+map ,3 3y G$p
+"
+"
+" ----- END of Work out one square -----
+"
+" ----- Work out one germ -----
+"
+" Generate an edit command that depends on the number of living in the last
+" line, and then run the edit command. (used by work out square).
+" Leaves the cursor on the next character to be processed.
+"
+map ( ,s,i,X0i?^#A  0,df.l,Y21h
+"
+" Delete 's'paces (deads);
+" The number of remaining characters is the number of living neighbours.
+map ,s :.g/ /s///g
+"
+" Insert current character in the last line
+map ,i `ay GP
+"
+" Replace any uppercase letter with 'X';
+map ,X :.g/[A-Z]/s//X/g
+"
+" Delete and execute the rest of the line
+map ,d "qd$@q
+"
+" Yank and execute the rest of the line
+map ,Y "qy$@q
+"
+" Yank the character under the cursor
+map ,j y
+"
+" Put the current cut buffer after the cursor
+map ,m p
+"
+" Delete the character under the cursor
+map ,n x
+"
+" Replace a character by its next, A --> B, B --> C, etc.
+map ,a `a,jGi?=,ma 0,dll,j`a21l,ml,nh
+"
+" ----- END of Work out one germ -----
+"
+" ----- timing macros -----
+"
+" Get current date (used by time a generation)
+map << :r!date
+map <1 G?^top O<<
+map <2 G?^top k<<
+"
+"
+" Turn number on current line into edit command (used by time N generations)
+map ,^ AiC
+"
+"
+" Delete current line and save current line (used by time N generations)
+map ,& 0"gd$
+"
+"
+" Run saved line (used by time N generations)
+map ,* @g
+"
+" ----- END of timing macros -----
+"
+" End of the macros.
diff --git a/runtime/macros/matchit.vim b/runtime/macros/matchit.vim
new file mode 100644
index 0000000..f6f463f
--- /dev/null
+++ b/runtime/macros/matchit.vim
@@ -0,0 +1,5 @@
+" Load the matchit package.
+" For those users who were loading the matchit plugin from here.
+if 1
+ packadd matchit
+endif
diff --git a/runtime/macros/maze.info b/runtime/macros/maze.info
new file mode 100644
index 0000000..2ad27db
--- /dev/null
+++ b/runtime/macros/maze.info
Binary files differ
diff --git a/runtime/macros/maze/Makefile b/runtime/macros/maze/Makefile
new file mode 100644
index 0000000..c34e115
--- /dev/null
+++ b/runtime/macros/maze/Makefile
@@ -0,0 +1,7 @@
+# It's simple...
+
+maze: mazeansi.c
+ cc -o maze mazeansi.c
+
+mazeclean: mazeclean.c
+ cc -o mazeclean mazeclean.c
diff --git a/runtime/macros/maze/README.txt b/runtime/macros/maze/README.txt
new file mode 100644
index 0000000..be8e8ef
--- /dev/null
+++ b/runtime/macros/maze/README.txt
@@ -0,0 +1,49 @@
+To run the maze macros with Vim:
+
+ vim -u maze_mac maze_5.78
+ press "g"
+
+The "-u maze.mac" loads the maze macros and skips loading your .vimrc, which
+may contain settings and mappings that get in the way.
+
+
+The original README:
+
+To prove that you can do anything in vi, I wrote a couple of macros that
+allows vi to solve mazes. It will solve any maze produced by maze.c
+that was posted to the net recently.
+
+Just follow this recipe and SEE FOR YOURSELF.
+ 1. run uudecode on the file "maze.vi.macros.uu" to
+ produce the file "maze.vi.macros"
+ (If you can't wait to see the action, jump to step 4)
+ 2. compile maze.c with "cc -o maze maze.c"
+ 3. run maze > maze.out and input a small number (for example 10 if
+ you are on a fast machine, 3-5 if slow) which
+ is the size of the maze to produce
+ 4. edit the maze (vi maze.out)
+ 5. include the macros with the vi command:
+ :so maze.vi.macros
+ 6. type the letter "g" (for "go") and watch vi solve the maze
+ 7. when vi solves the maze, you will see why it lies
+ 8. now look at maze.vi.macros and all will be revealed
+
+Tested on a sparc, a sun and a pyramid (although maze.c will not compile
+on the pyramid).
+
+Anyone who can't get the maze.c file to compile, get a new compiler,
+try maze.ansi.c which was also posted to the net.
+If you can get it to compile but the maze comes out looking like a fence
+and not a maze and you are using SysV or DOS replace the "27" on the
+last line of maze.c by "11"
+Thanks to John Tromp (tromp@piring.cwi.nl) for maze.c.
+Thanks to antonyc@nntp-server.caltech.edu (Bill T. Cat) for maze.ansi.c.
+
+Any donations should be in unmarked small denomination bills :^)=.
+
+ ACSnet: gregm@otc.otca.oz.au
+Greg McFarlane UUCP: {uunet,mcvax}!otc.otca.oz.au!gregm
+|||| OTC || Snail: OTC R&D GPO Box 7000, Sydney 2001, Australia
+ Phone: +61 2 287 3139 Fax: +61 2 287 3299
+
+
diff --git a/runtime/macros/maze/README.txt.info b/runtime/macros/maze/README.txt.info
new file mode 100644
index 0000000..263ddcd
--- /dev/null
+++ b/runtime/macros/maze/README.txt.info
Binary files differ
diff --git a/runtime/macros/maze/maze.c b/runtime/macros/maze/maze.c
new file mode 100644
index 0000000..b917453
--- /dev/null
+++ b/runtime/macros/maze/maze.c
@@ -0,0 +1,7 @@
+char*M,A,Z,E=40,J[40],T[40];main(C){for(*J=A=scanf(M="%d",&C);
+-- E; J[ E] =T
+[E ]= E) printf("._"); for(;(A-=Z=!Z) || (printf("\n|"
+) , A = 39 ,C --
+) ; Z || printf (M ))M[Z]=Z[A-(E =A[J-Z])&&!C
+& A == T[ A]
+|6<<27<rand()||!C&!Z?J[T[E]=T[A]]=E,J[T[A]=A-Z]=A,"_.":" |"];}
diff --git a/runtime/macros/maze/maze_5.78 b/runtime/macros/maze/maze_5.78
new file mode 100644
index 0000000..dbe3d27
--- /dev/null
+++ b/runtime/macros/maze/maze_5.78
@@ -0,0 +1,16 @@
+._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
+| ._| . . ._| | |_._._. . ._|_._._._._. ._|_. ._|_._. ._| . ._|_. | . ._._. |
+| ._|_| |_. | | | | ._._|_._|_._. . |_. | | | ._._| |_._._| | ._. ._| . . |_|
+|_._._._. | ._|_. ._._._. | | ._. |_._. . | ._._| |_. | ._._._. |_. | |_|_| |
+| | . |_._| . ._._._| ._._. ._._| | | |_| . | |_. . ._|_| ._._. |_._|_| . | |
+|_._|_._._._|_._._._|_|_._._._|_._|_._._._|_._._._|_._._._|_._._._._._._|_._|
+
+See Vim solve a maze!
+
+ type ":so maze_mac<RETURN>" to load the macros
+
+ type "g" to start
+
+to interrupt type "<CTRL-C>"
+ to quit type ":q!<RETURN>"
+
diff --git a/runtime/macros/maze/maze_5.78.info b/runtime/macros/maze/maze_5.78.info
new file mode 100644
index 0000000..fd65cef
--- /dev/null
+++ b/runtime/macros/maze/maze_5.78.info
Binary files differ
diff --git a/runtime/macros/maze/maze_mac b/runtime/macros/maze/maze_mac
new file mode 100644
index 0000000..621aeec
--- /dev/null
+++ b/runtime/macros/maze/maze_mac
@@ -0,0 +1,271 @@
+" These macros 'solve' any maze produced by the a-maze-ing maze.c program.
+"
+" First, a bit of maze theory.
+" If you were put into a maze, a guaranteed method of finding your way
+" out of the maze is to put your left hand onto a wall and just keep walking,
+" never taking your hand off the wall. This technique is only guaranteed to
+" work if the maze does not have any 'islands', or if the 'exit' is on the
+" same island as your starting point. These conditions hold for the mazes
+" under consideration.
+"
+" Assuming that the maze is made up of horizontal and vertical walls spaced
+" one step apart and that you can move either north, south, east or west,
+" then you can automate this procedure by carrying out the following steps.
+"
+" 1. Put yourself somewhere in the maze near a wall.
+" 2. Check if you have a wall on your left. If so, go to step 4.
+" 3. There is no wall on your left, so turn on the spot to your left and step
+" forward by one step and repeat step 2.
+" 4. Check what is directly in front of you. If it is a wall, turn on the
+" spot to your right by 90 degrees and repeat step 4.
+" 5. There is no wall in front of you, so step forward one step and
+" go to step 2.
+"
+" In this way you will cover all the corridors of the maze (until you get back
+" to where you started from, if you do not stop).
+"
+" By examining a maze produced by the maze.c program you will see that
+" each square of the maze is one character high and two characters wide.
+" To go north or south, you move by a one character step, but to move east or
+" west you move by a two character step. Also note that in any position
+" there are four places where walls could be put - to the north, to the south,
+" to the east and to the west.
+" A wall exists to the north of you if the character to the north of
+" you is a _ (otherwise it is a space).
+" A wall exists to the east of you if the character to the east of you
+" is a | (otherwise it is a .).
+" A wall exists to the west of you if the character to the west of you
+" is a | (otherwise it is a .).
+" A wall exists to the south of you if the character where you are
+" is a _ (otherwise it is a space).
+"
+" Note the difference for direction south, where we must examine the character
+" where the cursor is rather than an adjacent cell.
+"
+" If you were implementing the above procedure is a normal computer language
+" you could use a loop with if statements and continue statements,
+" However, these constructs are not available in vi macros so I have used
+" a state machine with 8 states. Each state signifies the direction you
+" are going in and whether or not you have checked if there is a wall on
+" your left.
+"
+" The transition from state to state and the actions taken on each transition
+" are given in the state table below.
+" The names of the states are N1, N2, S1, S2, E1, E2, W1, W2, where each letter
+" stands for a direction of the compass, the number 1 indicates that the we
+" have not yet checked to see if there is a wall on our left and the number 2
+" indicates that we have checked and there is a wall on our left.
+"
+" For each state we must consider the existence or not of a wall in a
+" particular direction. This direction is given in the following table.
+"
+" NextChar table:
+" state direction vi commands
+" N1 W hF
+" N2 N kF
+" S1 E lF
+" S2 S F
+" E1 N kF
+" E2 E lF
+" W1 S F
+" W2 W hF
+"
+" where F is a macro which yanks the character under the cursor into
+" the NextChar register (n).
+"
+" State table:
+" In the 'vi commands' column is given the actions to carry out when in
+" this state and the NextChar is as given. The commands k, j, ll, hh move
+" the current position north, south, east and west respectively. The
+" command mm is used as a no-op command.
+" In the 'next state' column is given the new state of the machine after
+" the action is carried out.
+"
+" current state NextChar vi commands next state
+" N1 . hh W1
+" N1 | mm N2
+" N2 _ mm E1
+" N2 space k N1
+" S1 . ll E1
+" S1 | mm S2
+" S2 _ mm W1
+" S2 space j S1
+" E1 space k N1
+" E1 _ mm E2
+" E2 | mm S1
+" E2 . ll E1
+" W1 space j S1
+" W1 _ mm W2
+" W2 | mm N1
+" W2 . hh W1
+"
+"
+" Complaint about vi macros:
+" It seems that you cannot have more than one 'undo-able' vi command
+" in the one macro, so you have to make lots of little macros and
+" put them together.
+"
+" I'll explain what I mean by an example. Edit a file and
+" type ':map Q rXY'. This should map the Q key to 'replace the
+" character under the cursor with X and yank the line'.
+" But when I type Q, vi tells me 'Can't yank inside global/macro' and
+" goes into ex mode. However if I type ':map Q rXT' and ':map T Y',
+" everything is OK. I`m doing all this on a Sparcstation.
+" If anyone reading this has an answer to this problem, the author would
+" love to find out. Mail to gregm@otc.otca.oz.au.
+"
+" The macros:
+" The macro to run the maze solver is 'g'. This simply calls two other
+" macros: I, to initialise everything, and L, to loop forever running
+" through the state table.
+" Both of these macros are long sequences of calls to other macros. All
+" of these other macros are quite simple and so to understand how this
+" works, all you need to do is examine macros I and L and learn what they
+" do (a simple sequence of vi actions) and how L loops (by calling U, which
+" simply calls L again).
+"
+" Macro I sets up the state table and NextChar table at the end of the file.
+" Macro L then searches these tables to find out what actions to perform and
+" what state changes to make.
+"
+" The entries in the state table all begin with a key consisting of the
+" letter 's', the current state and the NextChar. After this is the
+" action to take in this state and after this is the next state to change to.
+"
+" The entries in the NextChar table begin with a key consisting of the
+" letter 'n' and the current state. After this is the action to take to
+" obtain NextChar - the character that must be examined to change state.
+"
+" One way to see what each part of the macros is doing is to type in the
+" body of the macros I and L manually (instead of typing 'g') and see
+" what happens at each step.
+"
+" Good luck.
+"
+" Registers used by the macros:
+" s (State) - holds the state the machine is in
+" c (Char) - holds the character under the current position
+" m (Macro) - holds a vi command string to be executed later
+" n (NextChar) - holds the character we must examine to change state
+" r (Second Macro) - holds a second vi command string to be executed later
+"
+set remap
+set nomagic
+set noterse
+set wrapscan
+"
+"================================================================
+" g - go runs the whole show
+" I - initialise
+" L - then loop forever
+map g IL
+"
+"================================================================
+" I - initialise everything before running the loop
+" G$?.^M - find the last . in the maze
+" ^ - replace it with an X (the goal)
+" GYKeDP - print the state table and next char table at the end of the file
+" 0S - initialise the state of the machine to E1
+" 2Gl - move to the top left cell of the maze
+map I G$?. ^GYKeDP0S2Gl
+"
+"================================================================
+" L - the loop which is executed forever
+" Q - save the current character in the Char register
+" A - replace the current character with an 'O'
+" ma - mark the current position with mark 'a'
+" GNB - on bottom line, create a command to search the NextChar table
+" for the current state
+" 0M0E@m^M - yank the command into the Macro register and execute it
+" wX - we have now found the entry in the table, now yank the
+" following word into the Macro register
+" `a@m - go back to the current position and execute the macro, this will
+" yank the NextChar in register n
+" GT$B$R - on bottom line, create a command to search the state table
+" for the current state and NextChar
+" 0M0E@m^M - yank the command into the Macro register and execute it
+" 2WS - we have now found the entry in the table, now yank the
+" next state into the State macro
+" bX - and yank the action corresponding to this state table entry
+" into the Macro register
+" GVJ - on bottom line, create a command to restore the current character
+" 0H - and save the command into the second Macro register
+" `a@r - go back to the current position and exectute the macro to restore
+" the current character
+" @m - execute the action associated with this state
+" U - and repeat
+map L QAmaGNB0M0E@m wX`a@mGT$B$R0M0E@m 2WSbXGVJ0H`a@r@mU
+"
+"================================================================
+" U - no tail recursion allowed in vi macros so cheat and set U = L
+map U L
+"
+"================================================================
+" S - yank the next two characters into the State register
+map S "sy2l
+"
+"================================================================
+" Q - save the current character in the Char register
+map Q "cyl
+"
+"================================================================
+" A - replace the current character with an 'O'
+map A rO
+"
+"================================================================
+" N - replace this line with the string 'n'
+map N C/n
+"
+"================================================================
+" B - put the current state
+map B "sp
+"
+"================================================================
+" M - yank this line into the Macro register
+map M "my$
+"
+"================================================================
+" E - delete to the end of the line
+map E d$
+"
+"================================================================
+" X - yank this word into the Macro register
+map X "myt
+"
+"================================================================
+" T - replace this line with the string 's'
+map T C/s
+"
+"================================================================
+" R - put NextChar
+map R "np
+"
+"================================================================
+" V - add the letter 'r' (the replace vi command)
+map V ar
+"
+"================================================================
+" J - restore the current character
+map J "cp
+"
+"================================================================
+" H - yank this line into the second Macro register
+map H "ry$
+"
+"================================================================
+" F - yank NextChar (this macro is called from the Macro register)
+map F "nyl
+"
+"================================================================
+" ^ - replace the current character with an 'X'
+map ^ rX
+"
+"================================================================
+" YKeDP - create the state table, NextChar table and initial state
+" Note that you have to escape the bar character, since it is special to
+" the map command (it indicates a new line).
+map Y osE1 k N1 sE1_ mm E2 sE2| mm S1 sE2. ll E1
+map K osW1 j S1 sW1_ mm W2 sW2| mm N1 sW2. hh W1
+map e osN1. hh W1 sN1| mm N2 sN2 k N1 sN2_ mm E1
+map D osS1. ll E1 sS1| mm S2 sS2 j S1 sS2_ mm W1
+map P onE1 kF nE2 lF nW1 G$JF nW2 hF nN1 hF nN2 kF nS1 lF nS2 G$JF E1
diff --git a/runtime/macros/maze/mazeansi.c b/runtime/macros/maze/mazeansi.c
new file mode 100644
index 0000000..b8e5e79
--- /dev/null
+++ b/runtime/macros/maze/mazeansi.c
@@ -0,0 +1,7 @@
+char*M,A,Z,E=40,J[80],T[3];main(C){for(M=J+E,*J=A=scanf("%d",&
+C) ;-- E;J [E ]=M
+[E ]= E) printf("._"); for(;(A-=Z=!Z) || (printf("\n|"
+) , A = 39 ,C --
+) ; Z || printf (T ))T[Z]=Z[A-(E =A[J-Z])&&!C
+& A == M[ A]
+|6<<27<rand()||!C&!Z?J[M[E]=M[A]]=E,J[M[A]=A-Z]=A,"_.":" |"];}
diff --git a/runtime/macros/maze/mazeclean.c b/runtime/macros/maze/mazeclean.c
new file mode 100644
index 0000000..04dcebd
--- /dev/null
+++ b/runtime/macros/maze/mazeclean.c
@@ -0,0 +1,22 @@
+/*
+ * Cleaned-up version of the maze program.
+ * Doesn't look as nice, but should work with all C compilers.
+ * Sascha Wilde, October 2003
+ */
+#include <stdio.h>
+#include <stdlib.h>
+
+char *M, A, Z, E = 40, line[80], T[3];
+int
+main (C)
+{
+ for (M = line + E, *line = A = scanf ("%d", &C); --E; line[E] = M[E] = E)
+ printf ("._");
+ for (; (A -= Z = !Z) || (printf ("\n|"), A = 39, C--); Z || printf (T))
+ T[Z] = Z[A - (E = A[line - Z]) && !C
+ & A == M[A]
+ | RAND_MAX/3 < rand ()
+ || !C & !Z ? line[M[E] = M[A]] = E, line[M[A] = A - Z] =
+ A, "_." : " |"];
+ return 0;
+}
diff --git a/runtime/macros/maze/poster b/runtime/macros/maze/poster
new file mode 100644
index 0000000..9114f59
--- /dev/null
+++ b/runtime/macros/maze/poster
@@ -0,0 +1,37 @@
+Article 2846 of alt.sources:
+Path: oce-rd1!hp4nl!mcsun!uunet!munnari.oz.au!metro!otc!gregm
+From: gregm@otc.otca.oz.au (Greg McFarlane)
+Newsgroups: alt.sources
+Subject: VI SOLVES MAZE (commented macros)
+Message-ID: <2289@otc.otca.oz>
+Date: 10 Feb 91 23:31:02 GMT
+Sender: news@otc.otca.oz
+Reply-To: gregm@otc.otca.oz.au (Greg McFarlane)
+Organization: OTC Development Unit, Australia
+Lines: 464
+
+Submitted-by: gregm@otc.otca.oz.au
+Archive-name: maze_solving_vi_macros
+
+A real working model. See it walk the maze in front of your very own eyes.
+
+To prove that you can do anything in vi, I wrote a couple of macros that
+allows vi to solve mazes. It will solve any maze produced by maze.c
+that was posted to the alt.sources last month. (Maze.c is also included
+in this posting as well as an example of its output.)
+
+The uncommented version of the macros was sent to alt.sources last month.
+However, so many people mailed me requesting the commented version of the
+macros that I decided to post it. I have made some modifications to the
+original macros to make them easier to follow and also after I learnt
+that you can escape the special meaning of '|' in macros by using '^V|'.
+
+Save this article and unshar it. Then read maze.README.
+
+After studying these macros, anyone who cannot write an emacs emulator
+in vi macros should just curl up and :q!.
+
+Coming soon to a newsgroup near you: "Vi macros solve Tower of Hanoi",
+and a repost of the original "Turing Machine implemented in Vi macros"
+
+Anyone who has a version of these macros for edlin or nroff, please post.
diff --git a/runtime/macros/maze/poster.info b/runtime/macros/maze/poster.info
new file mode 100644
index 0000000..9a478d6
--- /dev/null
+++ b/runtime/macros/maze/poster.info
Binary files differ
diff --git a/runtime/macros/shellmenu.vim b/runtime/macros/shellmenu.vim
new file mode 100644
index 0000000..4eb72a5
--- /dev/null
+++ b/runtime/macros/shellmenu.vim
@@ -0,0 +1,3 @@
+" 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
new file mode 100644
index 0000000..5884d83
--- /dev/null
+++ b/runtime/macros/swapmous.vim
@@ -0,0 +1,3 @@
+" Load the swapmouse package.
+" For those users who were loading the swapmous plugin from here.
+packadd swapmouse
diff --git a/runtime/macros/urm.info b/runtime/macros/urm.info
new file mode 100644
index 0000000..65e8234
--- /dev/null
+++ b/runtime/macros/urm.info
Binary files differ
diff --git a/runtime/macros/urm/README.txt b/runtime/macros/urm/README.txt
new file mode 100644
index 0000000..a1ecc65
--- /dev/null
+++ b/runtime/macros/urm/README.txt
@@ -0,0 +1,47 @@
+This is another proof that Vim is perfectly compatible with Vi.
+The URM macro package was written by Rudolf Koenig ("Rudi")
+(rudolf@koeniglich.de) for hpux-vi in August 1991.
+
+Getting started:
+
+type
+in your shell: vim urm<RETURN>
+in vim: :so urm.vim<RETURN>
+in vim: * (to load the registers and boot the URM-machine :-)
+in vim: g (for 'go') and watch the fun. Per default, 3 and 4
+ are multiplied. Watch the Program counter, it is
+ visible as a komma moving around.
+
+This is a "standard URM" (Universal register machine) interpreter. The URM
+concept is used in theoretical computer science to aid in theorem proving.
+Here it proves that vim is a general problem solver (if you bring enough
+patience).
+
+The interpreter begins with register 1 (not 0), without macros and more-lines
+capability. A dot marks the end of a program. (Bug: there must be a space
+after the dot.)
+
+The registers are the first few lines, beginning with a '>' .
+The program is the first line after the registers.
+You should always initialize the registers required by the program.
+
+Output register: line 2
+Input registers: line 2 to ...
+
+Commands:
+a<n> increment register <n>
+s<n> decrement register <n>
+<x>;<y> execute command <x> and then <y>
+(<x>)<n> execute command <x> while register <n> is nonzero
+. ("dot blank") halt the machine.
+
+Examples:
+
+Add register 2 to register 3:
+ (a2;s3)3.
+Multiply register 2 with register 3:
+ (a4;a5;s2)2; ((a2;s4)4; s3; (a1;a4;s5)5; (a5;s1)1)3.
+
+There are more (complicated) examples in the file examples.
+Note, undo may take a while after a division.
+
diff --git a/runtime/macros/urm/README.txt.info b/runtime/macros/urm/README.txt.info
new file mode 100644
index 0000000..1337937
--- /dev/null
+++ b/runtime/macros/urm/README.txt.info
Binary files differ
diff --git a/runtime/macros/urm/examples b/runtime/macros/urm/examples
new file mode 100644
index 0000000..9907d4a
--- /dev/null
+++ b/runtime/macros/urm/examples
@@ -0,0 +1,16 @@
+Note that enough temporary registers should be provided for each example.
+All should be initialised to 0.
+
+Initial register values for benchmarking: 0,8,3,0,...
+
+Performed on a Xenix 386/16:
+Operation [sec, kbyte tmp space]: program
+
+Asym. Diff.[ 7, 4]: (s2;s3)3.
+Abs. Diff. [90,81]: (a1;a4;s2)2; (a2;s1)1; (a1;a5;s3)3; (a3;s1)1; (s2;s3)3; (s5;s4)4; (a2;s5)5.
+Add [ 7, 4]: (a2;s3)3.
+Mult [227, 161]: (a4;a5;s2)2; ((a2;s4)4; s3; (a1;a4;s5)5; (a5;s1)1)3.
+Copy [ 48, 25]: (a1;a3;s2)2; (a2;s1)1.
+sign [ 30, 17]: (a3;s2)2; (a2;(s3)3)3.
+!sign[ 36, 28]: (a3;s2)2; (a2;(s3)3)3; a3; (s3;s2)2; (s3;a2)3.
+Div [630,1522]: (a9;s2)2; (a2;a10;s3)3; (a3;s2)2; (a2;(s3)3)3; a3; (s3;s2)2; (s3;a2)3; (a2)2;(a2;s9)9;(a3;s10)10; (a9;a10;s2)2; (a11;a12;s3)3; (a2;s12)12; (a3;s9)9; (s2;s3)3; (a3;s2)2; (a2;(s3)3)3; a3; (s3;s2)2; (s3;a2)3; (a1;s2)2; (a2;s10)10; (a3;s11)11; ((a12;a13;s3)3; (a3;s13)13; (s2;s3)3; (a3;s12)12; a14; (s1)1; (a9;a10;s2)2; (a11;a12;s3)3; (a2;s12)12; (a3;s9)9; (s2;s3)3; (a3;s2)2; (a2;(s3)3)3; a3; (s3;s2)2; (s3;a2)3; (a1;s2)2; (a2;s10)10; (a3;s11)11)1; (s2)2; (a2;s14)14.
diff --git a/runtime/macros/urm/urm b/runtime/macros/urm/urm
new file mode 100644
index 0000000..9cbefb7
--- /dev/null
+++ b/runtime/macros/urm/urm
@@ -0,0 +1,22 @@
+>0
+>3
+>4
+>0
+>0
+>0
+(a4;a5;s2)2; ((a2;s4)4; s3; (a1;a4;s5)5; (a5;s1)1)3.
+_________
+O ; =xp ( =x%hp ) @l a @db s @dt . =x0xkdd:ready _end_
+o 0 1 2 3 4 5 6 7 8 9 0
+_________
+INIT main(k), l, b, c, t, u, q, d
+ "kT "lT "bT "cT "tT "uT "qT "dT
+=lF'wa/O fpaw"zdt hp@z0"xD@x@k
+=2ldwhp'wiGT'wp0P0"yD@ya =xlwP >0 =x%p I k/>0 ww"ydt 0D@y
+'wa/o fwF'wpi`ar`aF'wffp0"vD@v0"vDp03x@v'wa @c 0 0 0I f0w"wdt 0D@w
+`ahmaF'wa 'aa1 > @b 0p0f>w"vdt 0D@v
+'wa/o wfbF'wpi`ar`aF'wffp0"vD@v0"vDp03x@v'wa @u 9 0 0I f9w"wdt 0D@w
+`ahmaF'wa `alr0 > @q 0p0f>w"vdt 0D@v
+`ahy2l'wa `ax >1 @t 0p0/>1 ww"idt 0D@i
+=xwhpbldwhp'wpaG$ma0"yD@y@
+
diff --git a/runtime/macros/urm/urm.vim b/runtime/macros/urm/urm.vim
new file mode 100644
index 0000000..3108180
--- /dev/null
+++ b/runtime/macros/urm/urm.vim
@@ -0,0 +1,5 @@
+map * 1G/INIT j"iT@i1G/INIT dG
+map g 1G/^[(as;.] i >,mkkmw@k
+map T y$
+map F yl
+map = 'kf,
diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim
new file mode 100644
index 0000000..b9cd8cb
--- /dev/null
+++ b/runtime/makemenu.vim
@@ -0,0 +1,683 @@
+vim9script
+
+# Script to define the syntax menu in synmenu.vim
+# Maintainer: Bram Moolenaar <Bram@vim.org>
+# Last Change: 2022 Jun 27
+
+# This is used by "make menu" in the src directory.
+edit <sfile>:p:h/synmenu.vim
+
+:/The Start Of The Syntax Menu/+1,/The End Of The Syntax Menu/-1d
+var lnum = line(".") - 1
+call append(lnum, "")
+lnum += 1
+
+# Use the SynMenu command and function to define all menu entries
+command! -nargs=* SynMenu call Syn(<q-args>)
+
+var cur_menu_name = ""
+var cur_menu_nr = 0
+var cur_menu_item = 0
+var cur_menu_char = ""
+
+def Syn(arg: string)
+ # isolate menu name: until the first dot
+ var i = match(arg, '\.')
+ var menu_name = strpart(arg, 0, i)
+ var r = strpart(arg, i + 1, 999)
+ # isolate submenu name: until the colon
+ i = match(r, ":")
+ var submenu_name = strpart(r, 0, i)
+ # after the colon is the syntax name
+ var syntax_name = strpart(r, i + 1, 999)
+
+ if cur_menu_name != menu_name
+ cur_menu_name = menu_name
+ cur_menu_nr += 10
+ cur_menu_item = 100
+ cur_menu_char = submenu_name[0]
+ else
+ # When starting a new letter, insert a menu separator.
+ var c = submenu_name[0]
+ if c != cur_menu_char
+ exe 'an 50.' .. cur_menu_nr .. '.' .. cur_menu_item .. ' &Syntax.' .. menu_name .. ".-" .. c .. '- <nul>'
+ cur_menu_item += 10
+ cur_menu_char = c
+ endif
+ endif
+ append(lnum, 'an 50.' .. cur_menu_nr .. '.' .. cur_menu_item .. ' &Syntax.' .. menu_name .. "." .. submenu_name .. ' :cal SetSyn("' .. syntax_name .. '")<CR>')
+ cur_menu_item += 10
+ lnum += 1
+enddef
+
+SynMenu AB.A2ps\ config:a2ps
+SynMenu AB.Aap:aap
+SynMenu AB.ABAP/4:abap
+SynMenu AB.Abaqus:abaqus
+SynMenu AB.ABC\ music\ notation:abc
+SynMenu AB.ABEL:abel
+SynMenu AB.AceDB\ model:acedb
+SynMenu AB.Ada:ada
+SynMenu AB.AfLex:aflex
+SynMenu AB.ALSA\ config:alsaconf
+SynMenu AB.Altera\ AHDL:ahdl
+SynMenu AB.Amiga\ DOS:amiga
+SynMenu AB.AMPL:ampl
+SynMenu AB.Ant\ build\ file:ant
+SynMenu AB.ANTLR:antlr
+SynMenu AB.Apache\ config:apache
+SynMenu AB.Apache-style\ config:apachestyle
+SynMenu AB.Applix\ ELF:elf
+SynMenu AB.APT\ config:aptconf
+SynMenu AB.Arc\ Macro\ Language:aml
+SynMenu AB.Arch\ inventory:arch
+SynMenu AB.Arduino:arduino
+SynMenu AB.ART:art
+SynMenu AB.Ascii\ Doc:asciidoc
+SynMenu AB.ASP\ with\ VBScript:aspvbs
+SynMenu AB.ASP\ with\ Perl:aspperl
+SynMenu AB.Assembly.680x0:asm68k
+SynMenu AB.Assembly.AVR:avra
+SynMenu AB.Assembly.Flat:fasm
+SynMenu AB.Assembly.GNU:asm
+SynMenu AB.Assembly.GNU\ H-8300:asmh8300
+SynMenu AB.Assembly.Intel\ IA-64:ia64
+SynMenu AB.Assembly.Microsoft:masm
+SynMenu AB.Assembly.Netwide:nasm
+SynMenu AB.Assembly.PIC:pic
+SynMenu AB.Assembly.Turbo:tasm
+SynMenu AB.Assembly.VAX\ Macro\ Assembly:vmasm
+SynMenu AB.Assembly.Z-80:z8a
+SynMenu AB.Assembly.xa\ 6502\ cross\ assember:a65
+SynMenu AB.ASN\.1:asn
+SynMenu AB.Asterisk\ config:asterisk
+SynMenu AB.Asterisk\ voicemail\ config:asteriskvm
+SynMenu AB.Atlas:atlas
+SynMenu AB.Autodoc:autodoc
+SynMenu AB.AutoHotKey:autohotkey
+SynMenu AB.AutoIt:autoit
+SynMenu AB.Automake:automake
+SynMenu AB.Avenue:ave
+SynMenu AB.Awk:awk
+SynMenu AB.AYacc:ayacc
+
+SynMenu AB.B:b
+SynMenu AB.Baan:baan
+SynMenu AB.Bash:bash
+SynMenu AB.Basic.FreeBasic:freebasic
+SynMenu AB.Basic.IBasic:ibasic
+SynMenu AB.Basic.QBasic:basic
+SynMenu AB.Basic.Visual\ Basic:vb
+SynMenu AB.Bazaar\ commit\ file:bzr
+SynMenu AB.Bazel:bzl
+SynMenu AB.BC\ calculator:bc
+SynMenu AB.BDF\ font:bdf
+SynMenu AB.BibTeX.Bibliography\ database:bib
+SynMenu AB.BibTeX.Bibliography\ Style:bst
+SynMenu AB.BIND.BIND\ config:named
+SynMenu AB.BIND.BIND\ zone:bindzone
+SynMenu AB.Blank:blank
+
+SynMenu C.C:c
+SynMenu C.C++:cpp
+SynMenu C.C#:cs
+SynMenu C.Cabal\ Haskell\ build\ file:cabal
+SynMenu C.Calendar:calendar
+SynMenu C.Cascading\ Style\ Sheets:css
+SynMenu C.CDL:cdl
+SynMenu C.Cdrdao\ TOC:cdrtoc
+SynMenu C.Cdrdao\ config:cdrdaoconf
+SynMenu C.Century\ Term:cterm
+SynMenu C.CH\ script:ch
+SynMenu C.ChaiScript:chaiscript
+SynMenu C.ChangeLog:changelog
+SynMenu C.CHILL:chill
+SynMenu C.Cheetah\ template:cheetah
+SynMenu C.Chicken:chicken
+SynMenu C.ChordPro:chordpro
+SynMenu C.Clean:clean
+SynMenu C.Clever:cl
+SynMenu C.Clipper:clipper
+SynMenu C.Clojure:clojure
+SynMenu C.Cmake:cmake
+SynMenu C.Cmod:cmod
+SynMenu C.Cmusrc:cmusrc
+SynMenu C.Cobol:cobol
+SynMenu C.Coco/R:coco
+SynMenu C.Cold\ Fusion:cf
+SynMenu C.Conary\ Recipe:conaryrecipe
+SynMenu C.Config.Cfg\ Config\ file:cfg
+SynMenu C.Config.Configure\.in:config
+SynMenu C.Config.Generic\ Config\ file:conf
+SynMenu C.CRM114:crm
+SynMenu C.Crontab:crontab
+SynMenu C.CSDL:csdl
+SynMenu C.CSP:csp
+SynMenu C.Ctrl-H:ctrlh
+SynMenu C.Cucumber:cucumber
+SynMenu C.CUDA:cuda
+SynMenu C.CUPL.CUPL:cupl
+SynMenu C.CUPL.Simulation:cuplsim
+SynMenu C.CVS.commit\ file:cvs
+SynMenu C.CVS.cvsrc:cvsrc
+SynMenu C.Cyn++:cynpp
+SynMenu C.Cynlib:cynlib
+
+SynMenu DE.D:d
+SynMenu DE.Dart:dart
+SynMenu DE.Datascript:datascript
+SynMenu DE.Debian.Debian\ ChangeLog:debchangelog
+SynMenu DE.Debian.Debian\ Control:debcontrol
+SynMenu DE.Debian.Debian\ Copyright:debcopyright
+SynMenu DE.Debian.Debian\ Sources\.list:debsources
+SynMenu DE.Denyhosts:denyhosts
+SynMenu DE.Desktop:desktop
+SynMenu DE.Dict\ config:dictconf
+SynMenu DE.Dictd\ config:dictdconf
+SynMenu DE.Diff:diff
+SynMenu DE.Digital\ Command\ Lang:dcl
+SynMenu DE.Dircolors:dircolors
+SynMenu DE.Dirpager:dirpager
+SynMenu DE.Django\ template:django
+SynMenu DE.DNS/BIND\ zone:bindzone
+SynMenu DE.Dnsmasq\ config:dnsmasq
+SynMenu DE.DocBook.auto-detect:docbk
+SynMenu DE.DocBook.SGML:docbksgml
+SynMenu DE.DocBook.XML:docbkxml
+SynMenu DE.Dockerfile:dockerfile
+SynMenu DE.Dot:dot
+SynMenu DE.Doxygen.C\ with\ doxygen:c.doxygen
+SynMenu DE.Doxygen.C++\ with\ doxygen:cpp.doxygen
+SynMenu DE.Doxygen.IDL\ with\ doxygen:idl.doxygen
+SynMenu DE.Doxygen.Java\ with\ doxygen:java.doxygen
+SynMenu DE.Doxygen.DataScript\ with\ doxygen:datascript.doxygen
+SynMenu DE.Dracula:dracula
+SynMenu DE.DSSSL:dsl
+SynMenu DE.DTD:dtd
+SynMenu DE.DTML\ (Zope):dtml
+SynMenu DE.DTrace:dtrace
+SynMenu DE.Dts/dtsi:dts
+SynMenu DE.Dune:dune
+SynMenu DE.Dylan.Dylan:dylan
+SynMenu DE.Dylan.Dylan\ interface:dylanintr
+SynMenu DE.Dylan.Dylan\ lid:dylanlid
+
+SynMenu DE.EDIF:edif
+SynMenu DE.Eiffel:eiffel
+SynMenu DE.Eight:8th
+SynMenu DE.Elinks\ config:elinks
+SynMenu DE.Elm\ filter\ rules:elmfilt
+SynMenu DE.Embedix\ Component\ Description:ecd
+SynMenu DE.ERicsson\ LANGuage:erlang
+SynMenu DE.ESMTP\ rc:esmtprc
+SynMenu DE.ESQL-C:esqlc
+SynMenu DE.Essbase\ script:csc
+SynMenu DE.Esterel:esterel
+SynMenu DE.Eterm\ config:eterm
+SynMenu DE.Euphoria\ 3:euphoria3
+SynMenu DE.Euphoria\ 4:euphoria4
+SynMenu DE.Eviews:eviews
+SynMenu DE.Exim\ conf:exim
+SynMenu DE.Expect:expect
+SynMenu DE.Exports:exports
+
+SynMenu FG.Falcon:falcon
+SynMenu FG.Fantom:fan
+SynMenu FG.Fetchmail:fetchmail
+SynMenu FG.FlexWiki:flexwiki
+SynMenu FG.Focus\ Executable:focexec
+SynMenu FG.Focus\ Master:master
+SynMenu FG.FORM:form
+SynMenu FG.Forth:forth
+SynMenu FG.Fortran:fortran
+SynMenu FG.FoxPro:foxpro
+SynMenu FG.FrameScript:framescript
+SynMenu FG.Fstab:fstab
+SynMenu FG.Fvwm.Fvwm\ configuration:fvwm1
+SynMenu FG.Fvwm.Fvwm2\ configuration:fvwm2
+SynMenu FG.Fvwm.Fvwm2\ configuration\ with\ M4:fvwm2m4
+
+SynMenu FG.GDB\ command\ file:gdb
+SynMenu FG.GDMO:gdmo
+SynMenu FG.Gedcom:gedcom
+SynMenu FG.Git.Output:git
+SynMenu FG.Git.Commit:gitcommit
+SynMenu FG.Git.Config:gitconfig
+SynMenu FG.Git.Rebase:gitrebase
+SynMenu FG.Git.Send\ Email:gitsendemail
+SynMenu FG.Gitolite:gitolite
+SynMenu FG.Gkrellmrc:gkrellmrc
+SynMenu FG.Gnash:gnash
+SynMenu FG.Go:go
+SynMenu FG.Godoc:godoc
+SynMenu FG.GP:gp
+SynMenu FG.GPG:gpg
+SynMenu FG.Grof:gprof
+SynMenu FG.Group\ file:group
+SynMenu FG.Grub:grub
+SynMenu FG.GNU\ Server\ Pages:gsp
+SynMenu FG.GNUplot:gnuplot
+SynMenu FG.GrADS\ scripts:grads
+SynMenu FG.Gretl:gretl
+SynMenu FG.Groff:groff
+SynMenu FG.Groovy:groovy
+SynMenu FG.GTKrc:gtkrc
+
+SynMenu HIJK.Haml:haml
+SynMenu HIJK.Hamster:hamster
+SynMenu HIJK.Haskell.Haskell:haskell
+SynMenu HIJK.Haskell.Haskell-c2hs:chaskell
+SynMenu HIJK.Haskell.Haskell-literate:lhaskell
+SynMenu HIJK.HASTE:haste
+SynMenu HIJK.HASTE\ preproc:hastepreproc
+SynMenu HIJK.Hercules:hercules
+SynMenu HIJK.Hex\ dump.XXD:xxd
+SynMenu HIJK.Hex\ dump.Intel\ MCS51:hex
+SynMenu HIJK.Hg\ commit:hgcommit
+SynMenu HIJK.Hollywood:hollywood
+SynMenu HIJK.HTML.HTML:html
+SynMenu HIJK.HTML.HTML\ with\ M4:htmlm4
+SynMenu HIJK.HTML.HTML\ with\ Ruby\ (eRuby):eruby
+SynMenu HIJK.HTML.Cheetah\ HTML\ template:htmlcheetah
+SynMenu HIJK.HTML.Django\ HTML\ template:htmldjango
+SynMenu HIJK.HTML.Vue.js\ HTML\ template:vuejs
+SynMenu HIJK.HTML.HTML/OS:htmlos
+SynMenu HIJK.HTML.XHTML:xhtml
+SynMenu HIJK.Host\.conf:hostconf
+SynMenu HIJK.Hosts\ access:hostsaccess
+SynMenu HIJK.Hyper\ Builder:hb
+SynMenu HIJK.Icewm\ menu:icemenu
+SynMenu HIJK.Icon:icon
+SynMenu HIJK.IDL\Generic\ IDL:idl
+SynMenu HIJK.IDL\Microsoft\ IDL:msidl
+SynMenu HIJK.Indent\ profile:indent
+SynMenu HIJK.Inform:inform
+SynMenu HIJK.Informix\ 4GL:fgl
+SynMenu HIJK.Initng:initng
+SynMenu HIJK.Inittab:inittab
+SynMenu HIJK.Inno\ setup:iss
+SynMenu HIJK.Innovation\ Data\ Processing.Upstream\ dat:upstreamdat
+SynMenu HIJK.Innovation\ Data\ Processing.Upstream\ log:upstreamlog
+SynMenu HIJK.Innovation\ Data\ Processing.Upstream\ rpt:upstreamrpt
+SynMenu HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log:upstreaminstalllog
+SynMenu HIJK.Innovation\ Data\ Processing.Usserver\ log:usserverlog
+SynMenu HIJK.Innovation\ Data\ Processing.USW2KAgt\ log:usw2kagtlog
+SynMenu HIJK.InstallShield\ script:ishd
+SynMenu HIJK.Interactive\ Data\ Lang:idlang
+SynMenu HIJK.IPfilter:ipfilter
+SynMenu HIJK.J:j
+SynMenu HIJK.JAL:jal
+SynMenu HIJK.JAM:jam
+SynMenu HIJK.Jargon:jargon
+SynMenu HIJK.Java.Java:java
+SynMenu HIJK.Java.JavaCC:javacc
+SynMenu HIJK.Java.Java\ Server\ Pages:jsp
+SynMenu HIJK.Java.Java\ Properties:jproperties
+SynMenu HIJK.JavaScript:javascript
+SynMenu HIJK.JavaScriptReact:javascriptreact
+SynMenu HIJK.Jess:jess
+SynMenu HIJK.Jgraph:jgraph
+SynMenu HIJK.Jovial:jovial
+SynMenu HIJK.JSON:json
+SynMenu HIJK.Kconfig:kconfig
+SynMenu HIJK.KDE\ script:kscript
+SynMenu HIJK.Kimwitu++:kwt
+SynMenu HIJK.Kivy:kivy
+SynMenu HIJK.KixTart:kix
+
+SynMenu L.Lace:lace
+SynMenu L.LamdaProlog:lprolog
+SynMenu L.Latte:latte
+SynMenu L.Ld\ script:ld
+SynMenu L.LDAP.LDIF:ldif
+SynMenu L.LDAP.Configuration:ldapconf
+SynMenu L.Less:less
+SynMenu L.Lex:lex
+SynMenu L.LFTP\ config:lftp
+SynMenu L.Libao:libao
+SynMenu L.LifeLines\ script:lifelines
+SynMenu L.Lilo:lilo
+SynMenu L.Limits\ config:limits
+SynMenu L.Linden\ scripting:lsl
+SynMenu L.Liquid:liquid
+SynMenu L.Lisp:lisp
+SynMenu L.Lite:lite
+SynMenu L.LiteStep\ RC:litestep
+SynMenu L.Locale\ Input:fdcc
+SynMenu L.Login\.access:loginaccess
+SynMenu L.Login\.defs:logindefs
+SynMenu L.Logtalk:logtalk
+SynMenu L.LOTOS:lotos
+SynMenu L.LotusScript:lscript
+SynMenu L.Lout:lout
+SynMenu L.LPC:lpc
+SynMenu L.Lua:lua
+SynMenu L.Lynx\ Style:lss
+SynMenu L.Lynx\ config:lynx
+
+SynMenu M.M4:m4
+SynMenu M.MaGic\ Point:mgp
+SynMenu M.Mail:mail
+SynMenu M.Mail\ aliases:mailaliases
+SynMenu M.Mailcap:mailcap
+SynMenu M.Mallard:mallard
+SynMenu M.Makefile:make
+SynMenu M.MakeIndex:ist
+SynMenu M.Man\ page:man
+SynMenu M.Man\.conf:manconf
+SynMenu M.Maple\ V:maple
+SynMenu M.Markdown:markdown
+SynMenu M.Markdown\ with\ R\ statements:rmd
+SynMenu M.Mason:mason
+SynMenu M.Mathematica:mma
+SynMenu M.Matlab:matlab
+SynMenu M.Maxima:maxima
+SynMenu M.MEL\ (for\ Maya):mel
+SynMenu M.Meson:meson
+SynMenu M.Messages\ (/var/log):messages
+SynMenu M.Metafont:mf
+SynMenu M.MetaPost:mp
+SynMenu M.MGL:mgl
+SynMenu M.MIX:mix
+SynMenu M.MMIX:mmix
+SynMenu M.Modconf:modconf
+SynMenu M.Model:model
+SynMenu M.Modsim\ III:modsim3
+SynMenu M.Modula\ 2:modula2
+SynMenu M.Modula\ 3:modula3
+SynMenu M.Monk:monk
+SynMenu M.Motorola\ S-Record:srec
+SynMenu M.Mplayer\ config:mplayerconf
+SynMenu M.MOO:moo
+SynMenu M.Mrxvtrc:mrxvtrc
+SynMenu M.MS-DOS/Windows.4DOS\ \.bat\ file:btm
+SynMenu M.MS-DOS/Windows.\.bat\/\.cmd\ file:dosbatch
+SynMenu M.MS-DOS/Windows.\.ini\ file:dosini
+SynMenu M.MS-DOS/Windows.Message\ text:msmessages
+SynMenu M.MS-DOS/Windows.Module\ Definition:def
+SynMenu M.MS-DOS/Windows.Registry:registry
+SynMenu M.MS-DOS/Windows.Resource\ file:rc
+SynMenu M.Msql:msql
+SynMenu M.MuPAD:mupad
+SynMenu M.Murphi:murphi
+SynMenu M.MUSHcode:mush
+SynMenu M.Muttrc:muttrc
+
+SynMenu NO.N1QL:n1ql
+SynMenu NO.Nanorc:nanorc
+SynMenu NO.Nastran\ input/DMAP:nastran
+SynMenu NO.Natural:natural
+SynMenu NO.NeoMutt\ setup\ files:neomuttrc
+SynMenu NO.Netrc:netrc
+SynMenu NO.Ninja:ninja
+SynMenu NO.Novell\ NCF\ batch:ncf
+SynMenu NO.Not\ Quite\ C\ (LEGO):nqc
+SynMenu NO.Nroff:nroff
+SynMenu NO.NSIS\ script:nsis
+SynMenu NO.Obj\ 3D\ wavefront:obj
+SynMenu NO.Objective\ C:objc
+SynMenu NO.Objective\ C++:objcpp
+SynMenu NO.OCAML:ocaml
+SynMenu NO.Occam:occam
+SynMenu NO.Omnimark:omnimark
+SynMenu NO.OpenROAD:openroad
+SynMenu NO.Open\ Psion\ Lang:opl
+SynMenu NO.Oracle\ config:ora
+
+SynMenu PQ.Packet\ filter\ conf:pf
+SynMenu PQ.Palm\ resource\ compiler:pilrc
+SynMenu PQ.Pam\ config:pamconf
+SynMenu PQ.PApp:papp
+SynMenu PQ.Pascal:pascal
+SynMenu PQ.Password\ file:passwd
+SynMenu PQ.PCCTS:pccts
+SynMenu PQ.PDF:pdf
+SynMenu PQ.Perl.Perl:perl
+SynMenu PQ.Perl.Perl\ 6:perl6
+SynMenu PQ.Perl.Perl\ POD:pod
+SynMenu PQ.Perl.Perl\ XS:xs
+SynMenu PQ.Perl.Template\ toolkit:tt2
+SynMenu PQ.Perl.Template\ toolkit\ Html:tt2html
+SynMenu PQ.Perl.Template\ toolkit\ JS:tt2js
+SynMenu PQ.PHP.PHP\ 3-4:php
+SynMenu PQ.PHP.Phtml\ (PHP\ 2):phtml
+SynMenu PQ.Pike:pike
+SynMenu PQ.Pine\ RC:pine
+SynMenu PQ.Pinfo\ RC:pinfo
+SynMenu PQ.PL/M:plm
+SynMenu PQ.PL/SQL:plsql
+SynMenu PQ.Pli:pli
+SynMenu PQ.PLP:plp
+SynMenu PQ.PO\ (GNU\ gettext):po
+SynMenu PQ.Postfix\ main\ config:pfmain
+SynMenu PQ.PostScript.PostScript:postscr
+SynMenu PQ.PostScript.PostScript\ Printer\ Description:ppd
+SynMenu PQ.Povray.Povray\ scene\ descr:pov
+SynMenu PQ.Povray.Povray\ configuration:povini
+SynMenu PQ.PPWizard:ppwiz
+SynMenu PQ.Prescribe\ (Kyocera):prescribe
+SynMenu PQ.Printcap:pcap
+SynMenu PQ.Privoxy:privoxy
+SynMenu PQ.Procmail:procmail
+SynMenu PQ.Product\ Spec\ File:psf
+SynMenu PQ.Progress:progress
+SynMenu PQ.Prolog:prolog
+SynMenu PQ.ProMeLa:promela
+SynMenu PQ.Proto:proto
+SynMenu PQ.Protocols:protocols
+SynMenu PQ.Purify\ log:purifylog
+SynMenu PQ.Pyrex:pyrex
+SynMenu PQ.Python:python
+SynMenu PQ.Quake:quake
+SynMenu PQ.Quickfix\ window:qf
+
+SynMenu R.R.R:r
+SynMenu R.R.R\ help:rhelp
+SynMenu R.R.R\ noweb:rnoweb
+SynMenu R.Racc\ input:racc
+SynMenu R.Radiance:radiance
+SynMenu R.Raml:raml
+SynMenu R.Ratpoison:ratpoison
+SynMenu R.RCS.RCS\ log\ output:rcslog
+SynMenu R.RCS.RCS\ file:rcs
+SynMenu R.Readline\ config:readline
+SynMenu R.Rebol:rebol
+SynMenu R.ReDIF:redif
+SynMenu R.Rego:rego
+SynMenu R.Relax\ NG:rng
+SynMenu R.Remind:remind
+SynMenu R.Relax\ NG\ compact:rnc
+SynMenu R.Renderman.Renderman\ Shader\ Lang:sl
+SynMenu R.Renderman.Renderman\ Interface\ Bytestream:rib
+SynMenu R.Resolv\.conf:resolv
+SynMenu R.Reva\ Forth:reva
+SynMenu R.Rexx:rexx
+SynMenu R.Robots\.txt:robots
+SynMenu R.RockLinux\ package\ desc\.:desc
+SynMenu R.Rpcgen:rpcgen
+SynMenu R.RPL/2:rpl
+SynMenu R.ReStructuredText:rst
+SynMenu M.ReStructuredText\ with\ R\ statements:rrst
+SynMenu R.RTF:rtf
+SynMenu R.Ruby:ruby
+SynMenu R.Rust:rust
+
+SynMenu S-Sm.S-Lang:slang
+SynMenu S-Sm.Samba\ config:samba
+SynMenu S-Sm.SAS:sas
+SynMenu S-Sm.Sass:sass
+SynMenu S-Sm.Sather:sather
+SynMenu S-Sm.Sbt:sbt
+SynMenu S-Sm.Scala:scala
+SynMenu S-Sm.Scheme:scheme
+SynMenu S-Sm.Scilab:scilab
+SynMenu S-Sm.Screen\ RC:screen
+SynMenu S-Sm.SCSS:scss
+SynMenu S-Sm.SDC\ Synopsys\ Design\ Constraints:sdc
+SynMenu S-Sm.SDL:sdl
+SynMenu S-Sm.Sed:sed
+SynMenu S-Sm.Sendmail\.cf:sm
+SynMenu S-Sm.Send-pr:sendpr
+SynMenu S-Sm.Sensors\.conf:sensors
+SynMenu S-Sm.Service\ Location\ config:slpconf
+SynMenu S-Sm.Service\ Location\ registration:slpreg
+SynMenu S-Sm.Service\ Location\ SPI:slpspi
+SynMenu S-Sm.Services:services
+SynMenu S-Sm.Setserial\ config:setserial
+SynMenu S-Sm.SGML.SGML\ catalog:catalog
+SynMenu S-Sm.SGML.SGML\ DTD:sgml
+SynMenu S-Sm.SGML.SGML\ Declaration:sgmldecl
+SynMenu S-Sm.SGML.SGML-linuxdoc:sgmllnx
+SynMenu S-Sm.Shell\ script.sh\ and\ ksh:sh
+SynMenu S-Sm.Shell\ script.csh:csh
+SynMenu S-Sm.Shell\ script.tcsh:tcsh
+SynMenu S-Sm.Shell\ script.zsh:zsh
+SynMenu S-Sm.SiCAD:sicad
+SynMenu S-Sm.Sieve:sieve
+SynMenu S-Sm.Simula:simula
+SynMenu S-Sm.Sinda.Sinda\ compare:sindacmp
+SynMenu S-Sm.Sinda.Sinda\ input:sinda
+SynMenu S-Sm.Sinda.Sinda\ output:sindaout
+SynMenu S-Sm.SiSU:sisu
+SynMenu S-Sm.SKILL.SKILL:skill
+SynMenu S-Sm.SKILL.SKILL\ for\ Diva:diva
+SynMenu S-Sm.Slice:slice
+SynMenu S-Sm.SLRN.Slrn\ rc:slrnrc
+SynMenu S-Sm.SLRN.Slrn\ score:slrnsc
+SynMenu S-Sm.SmallTalk:st
+SynMenu S-Sm.Smarty\ Templates:smarty
+SynMenu S-Sm.SMIL:smil
+SynMenu S-Sm.SMITH:smith
+
+SynMenu Sn-Sy.SNMP\ MIB:mib
+SynMenu Sn-Sy.SNNS.SNNS\ network:snnsnet
+SynMenu Sn-Sy.SNNS.SNNS\ pattern:snnspat
+SynMenu Sn-Sy.SNNS.SNNS\ result:snnsres
+SynMenu Sn-Sy.Snobol4:snobol4
+SynMenu Sn-Sy.Snort\ Configuration:hog
+SynMenu Sn-Sy.SPEC\ (Linux\ RPM):spec
+SynMenu Sn-Sy.Specman:specman
+SynMenu Sn-Sy.Spice:spice
+SynMenu Sn-Sy.Spyce:spyce
+SynMenu Sn-Sy.Speedup:spup
+SynMenu Sn-Sy.Splint:splint
+SynMenu Sn-Sy.Squid\ config:squid
+SynMenu Sn-Sy.SQL.SAP\ HANA:sqlhana
+SynMenu Sn-Sy.SQL.ESQL-C:esqlc
+SynMenu Sn-Sy.SQL.MySQL:mysql
+SynMenu Sn-Sy.SQL.PL/SQL:plsql
+SynMenu Sn-Sy.SQL.SQL\ Anywhere:sqlanywhere
+SynMenu Sn-Sy.SQL.SQL\ (automatic):sql
+SynMenu Sn-Sy.SQL.SQL\ (Oracle):sqloracle
+SynMenu Sn-Sy.SQL.SQL\ Forms:sqlforms
+SynMenu Sn-Sy.SQL.SQLJ:sqlj
+SynMenu Sn-Sy.SQL.SQL-Informix:sqlinformix
+SynMenu Sn-Sy.SQR:sqr
+SynMenu Sn-Sy.Ssh.ssh_config:sshconfig
+SynMenu Sn-Sy.Ssh.sshd_config:sshdconfig
+SynMenu Sn-Sy.Standard\ ML:sml
+SynMenu Sn-Sy.Stata.SMCL:smcl
+SynMenu Sn-Sy.Stata.Stata:stata
+SynMenu Sn-Sy.Stored\ Procedures:stp
+SynMenu Sn-Sy.Strace:strace
+SynMenu Sn-Sy.Streaming\ descriptor\ file:sd
+SynMenu Sn-Sy.Subversion\ commit:svn
+SynMenu Sn-Sy.Sudoers:sudoers
+SynMenu Sn-Sy.SVG:svg
+SynMenu Sn-Sy.Symbian\ meta-makefile:mmp
+SynMenu Sn-Sy.Sysctl\.conf:sysctl
+SynMenu Sn-Sy.Systemd:systemd
+SynMenu Sn-Sy.SystemVerilog:systemverilog
+
+SynMenu T.TADS:tads
+SynMenu T.Tags:tags
+SynMenu T.TAK.TAK\ compare:takcmp
+SynMenu T.TAK.TAK\ input:tak
+SynMenu T.TAK.TAK\ output:takout
+SynMenu T.Tar\ listing:tar
+SynMenu T.Task\ data:taskdata
+SynMenu T.Task\ 42\ edit:taskedit
+SynMenu T.Tcl/Tk:tcl
+SynMenu T.TealInfo:tli
+SynMenu T.Telix\ Salt:tsalt
+SynMenu T.Termcap/Printcap:ptcap
+SynMenu T.Terminfo:terminfo
+SynMenu T.Tera\ Term:teraterm
+SynMenu T.TeX.TeX/LaTeX:tex
+SynMenu T.TeX.plain\ TeX:plaintex
+SynMenu T.TeX.Initex:initex
+SynMenu T.TeX.ConTeXt:context
+SynMenu T.TeX.TeX\ configuration:texmf
+SynMenu T.TeX.Texinfo:texinfo
+SynMenu T.TF\ mud\ client:tf
+SynMenu T.Tidy\ configuration:tidy
+SynMenu T.Tilde:tilde
+SynMenu T.Tmux\ configuration:tmux
+SynMenu T.TPP:tpp
+SynMenu T.Trasys\ input:trasys
+SynMenu T.Treetop:treetop
+SynMenu T.Trustees:trustees
+SynMenu T.TSS.Command\ Line:tsscl
+SynMenu T.TSS.Geometry:tssgm
+SynMenu T.TSS.Optics:tssop
+SynMenu T.Typescript:typescript
+SynMenu T.TypescriptReact:typescriptreact
+
+SynMenu UV.Udev\ config:udevconf
+SynMenu UV.Udev\ permissions:udevperm
+SynMenu UV.Udev\ rules:udevrules
+SynMenu UV.UIT/UIL:uil
+SynMenu UV.UnrealScript:uc
+SynMenu UV.Updatedb\.conf:updatedb
+SynMenu UV.Upstart:upstart
+SynMenu UV.Valgrind:valgrind
+SynMenu UV.Vera:vera
+SynMenu UV.Verbose\ TAP\ Output:tap
+SynMenu UV.Verilog-AMS\ HDL:verilogams
+SynMenu UV.Verilog\ HDL:verilog
+SynMenu UV.Vgrindefs:vgrindefs
+SynMenu UV.VHDL:vhdl
+SynMenu UV.Vim.Vim\ help\ file:help
+SynMenu UV.Vim.Vim\ script:vim
+SynMenu UV.Vim.Viminfo\ file:viminfo
+SynMenu UV.Virata\ config:virata
+SynMenu UV.Visual\ Basic:vb
+SynMenu UV.VOS\ CM\ macro:voscm
+SynMenu UV.VRML:vrml
+SynMenu UV.Vroom:vroom
+SynMenu UV.VSE\ JCL:vsejcl
+
+SynMenu WXYZ.WEB.CWEB:cweb
+SynMenu WXYZ.WEB.WEB:web
+SynMenu WXYZ.WEB.WEB\ Changes:change
+SynMenu WXYZ.WebAssembly:wast
+SynMenu WXYZ.Webmacro:webmacro
+SynMenu WXYZ.Website\ MetaLanguage:wml
+SynMenu WXYZ.wDiff:wdiff
+SynMenu WXYZ.Wget\ config:wget
+SynMenu WXYZ.Whitespace\ (add):whitespace
+SynMenu WXYZ.WildPackets\ EtherPeek\ Decoder:dcd
+SynMenu WXYZ.WinBatch/Webbatch:winbatch
+SynMenu WXYZ.Windows\ Scripting\ Host:wsh
+SynMenu WXYZ.WSML:wsml
+SynMenu WXYZ.WvDial:wvdial
+SynMenu WXYZ.X\ Keyboard\ Extension:xkb
+SynMenu WXYZ.X\ Pixmap:xpm
+SynMenu WXYZ.X\ Pixmap\ (2):xpm2
+SynMenu WXYZ.X\ resources:xdefaults
+SynMenu WXYZ.XBL:xbl
+SynMenu WXYZ.Xinetd\.conf:xinetd
+SynMenu WXYZ.Xmodmap:xmodmap
+SynMenu WXYZ.Xmath:xmath
+SynMenu WXYZ.XML:xml
+SynMenu WXYZ.XML\ Schema\ (XSD):xsd
+SynMenu WXYZ.XQuery:xquery
+SynMenu WXYZ.Xslt:xslt
+SynMenu WXYZ.XFree86\ Config:xf86conf
+SynMenu WXYZ.YAML:yaml
+SynMenu WXYZ.Yacc:yacc
+SynMenu WXYZ.Zimbu:zimbu
+
+append(lnum, "")
+
+wq
diff --git a/runtime/menu.vim b/runtime/menu.vim
new file mode 100644
index 0000000..dc90eeb
--- /dev/null
+++ b/runtime/menu.vim
@@ -0,0 +1,1220 @@
+" Vim support file to define the default menus
+" You can also use this as a start for your own set of menus.
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Nov 27
+
+" 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.
+
+" Make sure the '<' and 'C' flags are not included in 'cpoptions', otherwise
+" <CR> would not be recognized. See ":help 'cpoptions'".
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Avoid installing the menus twice
+if !exists("did_install_default_menus")
+let did_install_default_menus = 1
+
+
+if exists("v:lang") || &langmenu != ""
+ " Try to find a menu translation file for the current language.
+ if &langmenu != ""
+ if &langmenu =~ "none"
+ let s:lang = ""
+ else
+ let s:lang = &langmenu
+ endif
+ else
+ let s:lang = v:lang
+ endif
+ " A language name must be at least two characters, don't accept "C"
+ " Also skip "en_US" to avoid picking up "en_gb" translations.
+ if strlen(s:lang) > 1 && s:lang !~? '^en_us'
+ " When the language does not include the charset add 'encoding'
+ if s:lang =~ '^\a\a$\|^\a\a_\a\a$'
+ let s:lang = s:lang .. '.' .. &enc
+ endif
+
+ " We always use a lowercase name.
+ " Change "iso-8859" to "iso_8859" and "iso8859" to "iso_8859", some
+ " systems appear to use this.
+ " Change spaces to underscores.
+ let s:lang = substitute(tolower(s:lang), '\.iso-', ".iso_", "")
+ let s:lang = substitute(s:lang, '\.iso8859', ".iso_8859", "")
+ let s:lang = substitute(s:lang, " ", "_", "g")
+ " Remove "@euro", otherwise "LC_ALL=de_DE@euro gvim" will show English menus
+ let s:lang = substitute(s:lang, "@euro", "", "")
+ " Change "iso_8859-1" and "iso_8859-15" to "latin1", we always use the
+ " same menu file for them.
+ let s:lang = substitute(s:lang, 'iso_8859-15\=$', "latin1", "")
+ menutrans clear
+ exe "runtime! lang/menu_" .. s:lang .. ".vim"
+
+ if !exists("did_menu_trans")
+ " There is no exact match, try matching with a wildcard added
+ " (e.g. find menu_de_de.iso_8859-1.vim if s:lang == de_DE).
+ 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".
+ " But don't match "slovak" when $LANG is "sl".
+ exe "runtime! lang/menu_" .. tolower($LANG) .. "[^a-z]*vim"
+ endif
+ endif
+ endif
+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 <silent> 9999.40 &Help.&Find\.\.\. :call <SID>Helpfind()<CR>
+an 9999.45 &Help.-sep1- <Nop>
+an 9999.50 &Help.&Credits :help credits<CR>
+an 9999.60 &Help.Co&pying :help copying<CR>
+an 9999.70 &Help.&Sponsor/Register :help sponsor<CR>
+an 9999.70 &Help.O&rphans :help kcc<CR>
+an 9999.75 &Help.-sep2- <Nop>
+an 9999.80 &Help.&Version :version<CR>
+an 9999.90 &Help.&About :intro<CR>
+
+if exists(':tlmenu')
+ tlnoremenu 9999.10 &Help.&Overview<Tab><F1> <C-W>:help<CR>
+ tlnoremenu 9999.20 &Help.&User\ Manual <C-W>:help usr_toc<CR>
+ tlnoremenu 9999.30 &Help.&How-To\ Links <C-W>:help how-to<CR>
+ tlnoremenu <silent> 9999.40 &Help.&Find\.\.\. <C-W>:call <SID>Helpfind()<CR>
+ tlnoremenu 9999.45 &Help.-sep1- <Nop>
+ tlnoremenu 9999.50 &Help.&Credits <C-W>:help credits<CR>
+ tlnoremenu 9999.60 &Help.Co&pying <C-W>:help copying<CR>
+ tlnoremenu 9999.70 &Help.&Sponsor/Register <C-W>:help sponsor<CR>
+ tlnoremenu 9999.70 &Help.O&rphans <C-W>:help kcc<CR>
+ tlnoremenu 9999.75 &Help.-sep2- <Nop>
+ tlnoremenu 9999.80 &Help.&Version <C-W>:version<CR>
+ tlnoremenu 9999.90 &Help.&About <C-W>:intro<CR>
+endif
+
+def s:Helpfind()
+ if !exists("g:menutrans_help_dialog")
+ g:menutrans_help_dialog = "Enter a command or word to find help on:\n\nPrepend i_ for Input mode commands (e.g.: i_CTRL-X)\nPrepend c_ for command-line editing commands (e.g.: c_<Del>)\nPrepend ' for an option name (e.g.: 'shiftwidth')"
+ endif
+ var h = inputdialog(g:menutrans_help_dialog)
+ if h != ""
+ v:errmsg = ""
+ silent! exe "help " .. h
+ if v:errmsg != ""
+ echo v:errmsg
+ endif
+ endif
+enddef
+
+" File menu
+an 10.310 &File.&Open\.\.\.<Tab>:e :browse confirm e<CR>
+an 10.320 &File.Sp&lit-Open\.\.\.<Tab>:sp :browse sp<CR>
+an 10.320 &File.Open\ Tab\.\.\.<Tab>:tabnew :browse tabnew<CR>
+an 10.325 &File.&New<Tab>:enew :confirm enew<CR>
+an <silent> 10.330 &File.&Close<Tab>:close
+ \ :if winheight(2) < 0 && tabpagewinnr(2) == 0 <Bar>
+ \ confirm enew <Bar>
+ \ else <Bar>
+ \ confirm close <Bar>
+ \ endif<CR>
+tln <silent> 10.330 &File.&Close<Tab>:close
+ \ <C-W>:if winheight(2) < 0 && tabpagewinnr(2) == 0 <Bar>
+ \ confirm enew <Bar>
+ \ else <Bar>
+ \ confirm close <Bar>
+ \ endif<CR>
+an 10.335 &File.-SEP1- <Nop>
+an <silent> 10.340 &File.&Save<Tab>:w :if expand("%") == ""<Bar>browse confirm w<Bar>else<Bar>confirm w<Bar>endif<CR>
+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.420 &File.Split\ Patched\ &By\.\.\. :browse vert diffpatch<CR>
+endif
+
+if has("printer")
+ an 10.500 &File.-SEP3- <Nop>
+ an 10.510 &File.&Print :hardcopy<CR>
+ vunmenu &File.&Print
+ vnoremenu &File.&Print :hardcopy<CR>
+elseif has("unix")
+ an 10.500 &File.-SEP3- <Nop>
+ an 10.510 &File.&Print :w !lpr<CR>
+ vunmenu &File.&Print
+ vnoremenu &File.&Print :w !lpr<CR>
+endif
+an 10.600 &File.-SEP4- <Nop>
+an 10.610 &File.Sa&ve-Exit<Tab>:wqa :confirm wqa<CR>
+an 10.620 &File.E&xit<Tab>:qa :confirm qa<CR>
+
+def s:SelectAll()
+ exe "norm! gg" .. (&slm == "" ? "VG" : "gH\<C-O>G")
+enddef
+
+" Edit menu
+an 20.310 &Edit.&Undo<Tab>u u
+an 20.320 &Edit.&Redo<Tab>^R <C-R>
+an 20.330 &Edit.Rep&eat<Tab>\. .
+
+an 20.335 &Edit.-SEP1- <Nop>
+vnoremenu 20.340 &Edit.Cu&t<Tab>"+x "+x
+vnoremenu 20.350 &Edit.&Copy<Tab>"+y "+y
+cnoremenu 20.350 &Edit.&Copy<Tab>"+y <C-Y>
+if exists(':tlmenu')
+ tlnoremenu 20.350 &Edit.&Copy<Tab>"+y <C-W>:<C-Y><CR>
+endif
+nnoremenu 20.360 &Edit.&Paste<Tab>"+gP "+gP
+cnoremenu &Edit.&Paste<Tab>"+gP <C-R>+
+if exists(':tlmenu')
+ tlnoremenu &Edit.&Paste<Tab>"+gP <C-W>"+
+endif
+exe 'vnoremenu <script> &Edit.&Paste<Tab>"+gP ' .. paste#paste_cmd['v']
+exe 'inoremenu <script> &Edit.&Paste<Tab>"+gP ' .. paste#paste_cmd['i']
+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")
+ 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>
+inoremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG <C-O>:call <SID>SelectAll()<CR>
+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("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>
+ an 20.420 &Edit.Find\ and\ Rep&lace\.\.\. :promptrepl<CR>
+ vunmenu &Edit.Find\ and\ Rep&lace\.\.\.
+ vnoremenu <silent> &Edit.Find\ and\ Rep&lace\.\.\. y:promptrepl <C-R>=<SID>FixFText()<CR><CR>
+else
+ an 20.410 &Edit.&Find<Tab>/ /
+ an 20.420 &Edit.Find\ and\ Rep&lace<Tab>:%s :%s/
+ vunmenu &Edit.Find\ and\ Rep&lace<Tab>:%s
+ vnoremenu &Edit.Find\ and\ Rep&lace<Tab>:s :s/
+endif
+
+an 20.425 &Edit.-SEP3- <Nop>
+an 20.430 &Edit.Settings\ &Window :options<CR>
+an 20.435 &Edit.Startup\ &Settings :call <SID>EditVimrc()<CR>
+
+def s:EditVimrc()
+ var fname: string
+ if $MYVIMRC != ''
+ fname = $MYVIMRC
+ elseif has("win32")
+ if $HOME != ''
+ fname = $HOME .. "/_vimrc"
+ else
+ fname = $VIM .. "/_vimrc"
+ endif
+ elseif has("amiga")
+ fname = "s:.vimrc"
+ else
+ fname = $HOME .. "/.vimrc"
+ endif
+ fname = fnameescape(fname)
+ if &mod
+ exe "split " .. fname
+ else
+ exe "edit " .. fname
+ endif
+enddef
+
+def s:FixFText(): string
+ # Fix text in nameless register to be used with :promptfind.
+ return substitute(@", "[\r\n]", '\\n', 'g')
+enddef
+
+" 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\ &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.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&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>
+"
+" GUI options
+an 20.440.300 &Edit.&Global\ Settings.-SEP1- <Nop>
+an <silent> 20.440.310 &Edit.&Global\ Settings.Toggle\ &Toolbar :call <SID>ToggleGuiOption("T")<CR>
+an <silent> 20.440.320 &Edit.&Global\ Settings.Toggle\ &Bottom\ Scrollbar :call <SID>ToggleGuiOption("b")<CR>
+an <silent> 20.440.330 &Edit.&Global\ Settings.Toggle\ &Left\ Scrollbar :call <SID>ToggleGuiOption("l")<CR>
+an <silent> 20.440.340 &Edit.&Global\ Settings.Toggle\ &Right\ Scrollbar :call <SID>ToggleGuiOption("r")<CR>
+
+def s:SearchP()
+ if !exists("g:menutrans_path_dialog")
+ g:menutrans_path_dialog = "Enter search path for files.\nSeparate directory names with a comma."
+ endif
+ var n = inputdialog(g:menutrans_path_dialog, substitute(&path, '\\ ', ' ', 'g'))
+ if n != ""
+ &path = substitute(n, ' ', '\\ ', 'g')
+ endif
+enddef
+
+def s:TagFiles()
+ if !exists("g:menutrans_tags_dialog")
+ g:menutrans_tags_dialog = "Enter names of tag files.\nSeparate the names with a comma."
+ endif
+ var n = inputdialog(g:menutrans_tags_dialog, substitute(&tags, '\\ ', ' ', 'g'))
+ if n != ""
+ &tags = substitute(n, ' ', '\\ ', 'g')
+ endif
+enddef
+
+def s:ToggleGuiOption(option: string)
+ # If a:option is already set in guioptions, then we want to remove it
+ if match(&guioptions, "\\C" .. option) > -1
+ exec "set go-=" .. option
+ else
+ exec "set go+=" .. option
+ endif
+enddef
+
+" Edit/File Settings
+
+" 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.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\ &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>
+an 20.440.610.20 &Edit.F&ile\ Settings.&Shiftwidth.2 :set sw=2 sw?<CR>
+an 20.440.610.30 &Edit.F&ile\ Settings.&Shiftwidth.3 :set sw=3 sw?<CR>
+an 20.440.610.40 &Edit.F&ile\ Settings.&Shiftwidth.4 :set sw=4 sw?<CR>
+an 20.440.610.50 &Edit.F&ile\ Settings.&Shiftwidth.5 :set sw=5 sw?<CR>
+an 20.440.610.60 &Edit.F&ile\ Settings.&Shiftwidth.6 :set sw=6 sw?<CR>
+an 20.440.610.80 &Edit.F&ile\ Settings.&Shiftwidth.8 :set sw=8 sw?<CR>
+
+an 20.440.620.20 &Edit.F&ile\ Settings.Soft\ &Tabstop.2 :set sts=2 sts?<CR>
+an 20.440.620.30 &Edit.F&ile\ Settings.Soft\ &Tabstop.3 :set sts=3 sts?<CR>
+an 20.440.620.40 &Edit.F&ile\ Settings.Soft\ &Tabstop.4 :set sts=4 sts?<CR>
+an 20.440.620.50 &Edit.F&ile\ Settings.Soft\ &Tabstop.5 :set sts=5 sts?<CR>
+an 20.440.620.60 &Edit.F&ile\ Settings.Soft\ &Tabstop.6 :set sts=6 sts?<CR>
+an 20.440.620.80 &Edit.F&ile\ Settings.Soft\ &Tabstop.8 :set sts=8 sts?<CR>
+
+an <silent> 20.440.630 &Edit.F&ile\ Settings.Te&xt\ Width\.\.\. :call <SID>TextWidth()<CR>
+an <silent> 20.440.640 &Edit.F&ile\ Settings.&File\ Format\.\.\. :call <SID>FileFormat()<CR>
+
+def s:TextWidth()
+ if !exists("g:menutrans_textwidth_dialog")
+ g:menutrans_textwidth_dialog = "Enter new text width (0 to disable formatting): "
+ endif
+ var n = inputdialog(g:menutrans_textwidth_dialog, &tw .. '')
+ if n != ""
+ # Remove leading zeros to avoid it being used as an octal number.
+ # But keep a zero by itself.
+ var tw = substitute(n, "^0*", "", "")
+ &tw = tw == '' ? 0 : str2nr(tw)
+ endif
+enddef
+
+def s:FileFormat()
+ if !exists("g:menutrans_fileformat_dialog")
+ g:menutrans_fileformat_dialog = "Select format for writing the file"
+ endif
+ if !exists("g:menutrans_fileformat_choices")
+ g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Cancel"
+ endif
+ var def_choice: number
+ if &ff == "dos"
+ def_choice = 2
+ elseif &ff == "mac"
+ def_choice = 3
+ else
+ def_choice = 1
+ endif
+ var n = confirm(g:menutrans_fileformat_dialog, g:menutrans_fileformat_choices, def_choice, "Question")
+ if n == 1
+ set ff=unix
+ elseif n == 2
+ set ff=dos
+ elseif n == 3
+ set ff=mac
+ endif
+enddef
+
+let s:did_setup_color_schemes = 0
+
+" Setup the Edit.Color Scheme submenu
+def s:SetupColorSchemes()
+ if s:did_setup_color_schemes
+ return
+ endif
+ s:did_setup_color_schemes = 1
+
+ var n = globpath(&runtimepath, "colors/*.vim", 1, 1)
+ n += globpath(&packpath, "pack/*/start/*/colors/*.vim", 1, 1)
+ n += globpath(&packpath, "pack/*/opt/*/colors/*.vim", 1, 1)
+
+ # Ignore case for VMS and windows, sort on name
+ var names = sort(map(n, 'substitute(v:val, "\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 'i')
+
+ # define all the submenu entries
+ var idx = 100
+ for name in names
+ exe "an 20.450." .. idx .. ' &Edit.C&olor\ Scheme.' .. name .. " :colors " .. name .. "<CR>"
+ idx += 10
+ endfor
+ silent! aunmenu &Edit.Show\ C&olor\ Schemes\ in\ Menu
+enddef
+
+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:did_setup_keymaps = 0
+
+ def s:SetupKeymaps()
+ if s:did_setup_keymaps
+ return
+ endif
+ s:did_setup_keymaps = 1
+
+ var names = globpath(&runtimepath, "keymap/*.vim", 1, 1)
+ if !empty(names)
+ var idx = 100
+ an 20.460.90 &Edit.&Keymap.None :set keymap=<CR>
+ for name in names
+ # Ignore case for VMS and windows
+ var mapname = substitute(name, '\c.*[/\\:\]]\([^/\\:_]*\)\(_[0-9a-zA-Z-]*\)\=\.vim', '\1', '')
+ exe "an 20.460." .. idx .. ' &Edit.&Keymap.' .. mapname .. " :set keymap=" .. mapname .. "<CR>"
+ idx += 10
+ endfor
+ endif
+ silent! aunmenu &Edit.Show\ &Keymaps\ in\ Menu
+ enddef
+
+ if exists("do_no_lazyload_menus")
+ call s:SetupKeymaps()
+ else
+ an <silent> 20.460 &Edit.Show\ &Keymaps\ in\ Menu :call <SID>SetupKeymaps()<CR>
+ endif
+endif
+
+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")
+ 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.320 &Tools.Build\ &Tags\ File :exe "!" .. g:ctags_command<CR>
+
+if has("folding") || has("spell")
+ an 40.330 &Tools.-SEP1- <Nop>
+endif
+
+" Tools.Spelling Menu
+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.140 &Tools.&Spelling.Suggest\ &Corrections<Tab>z= z=
+ 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 <silent> 40.335.270 &Tools.&Spelling.&Find\ More\ Languages :call <SID>SpellLang()<CR>
+
+ let s:undo_spelllang = ['aun &Tools.&Spelling.&Find\ More\ Languages']
+ def s:SpellLang(encChanged = false)
+ for cmd in s:undo_spelllang
+ exe "silent! " .. cmd
+ endfor
+ s:undo_spelllang = []
+
+ var enc = &enc == "iso-8859-15" ? "latin1" : &enc
+
+ # Reset g:menutrans_set_lang_to when called for the EncodingChanged event.
+ if !exists("g:menutrans_set_lang_to") || encChanged
+ g:menutrans_set_lang_to = 'Set Language to'
+ endif
+
+ var found = 0
+ var _nm = ''
+ var names = globpath(&runtimepath, "spell/*." .. enc .. ".spl", 1, 1)
+ if !empty(names)
+ var n = 300
+ for f in names
+ var nm = substitute(f, '.*spell[/\\]\(..\)\.[^/\\]*\.spl', '\1', "")
+ if nm != "en" && nm !~ '/'
+ _nm = nm
+ found += 1
+ var menuname = '&Tools.&Spelling.' .. escape(g:menutrans_set_lang_to, "\\. \t|") .. '\ "' .. nm .. '"'
+ exe 'an 40.335.' .. n .. ' ' .. menuname .. ' :set spl=' .. nm .. ' spell<CR>'
+ s:undo_spelllang += ['aun ' .. menuname]
+ endif
+ n += 10
+ endfor
+ endif
+ if found == 0
+ echomsg "Could not find other spell files"
+ elseif found == 1
+ echomsg "Found spell file " .. _nm
+ else
+ echomsg "Found " .. found .. " more spell files"
+ endif
+
+ # Need to redo this when 'encoding' is changed.
+ augroup spellmenu
+ au! EncodingChanged * call SpellLang(true)
+ augroup END
+ enddef
+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.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
+ " 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>
+ an 40.340.210 &Tools.&Folding.Fold\ Met&hod.I&ndent :set fdm=indent<CR>
+ an 40.340.210 &Tools.&Folding.Fold\ Met&hod.E&xpression :set fdm=expr<CR>
+ an 40.340.210 &Tools.&Folding.Fold\ Met&hod.S&yntax :set fdm=syntax<CR>
+ an 40.340.210 &Tools.&Folding.Fold\ Met&hod.&Diff :set fdm=diff<CR>
+ an 40.340.210 &Tools.&Folding.Fold\ Met&hod.Ma&rker :set fdm=marker<CR>
+ " create and delete folds
+ vnoremenu 40.340.220 &Tools.&Folding.Create\ &Fold<Tab>zf zf
+ an 40.340.230 &Tools.&Folding.&Delete\ Fold<Tab>zd zd
+ 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>
+endif " has folding
+
+if has("diff")
+ an 40.350.100 &Tools.&Diff.&Update :diffupdate<CR>
+ an 40.350.110 &Tools.&Diff.&Get\ Block :diffget<CR>
+ vunmenu &Tools.&Diff.&Get\ Block
+ vnoremenu &Tools.&Diff.&Get\ Block :diffget<CR>
+ an 40.350.120 &Tools.&Diff.&Put\ Block :diffput<CR>
+ vunmenu &Tools.&Diff.&Put\ Block
+ vnoremenu &Tools.&Diff.&Put\ Block :diffput<CR>
+endif
+
+an 40.358 &Tools.-SEP2- <Nop>
+an 40.360 &Tools.&Make<Tab>:make :make<CR>
+an 40.370 &Tools.&List\ Errors<Tab>:cl :cl<CR>
+an 40.380 &Tools.L&ist\ Messages<Tab>:cl! :cl!<CR>
+an 40.390 &Tools.&Next\ Error<Tab>:cn :cn<CR>
+an 40.400 &Tools.&Previous\ Error<Tab>:cp :cp<CR>
+an 40.410 &Tools.&Older\ List<Tab>:cold :colder<CR>
+an 40.420 &Tools.N&ewer\ List<Tab>:cnew :cnewer<CR>
+an 40.430.50 &Tools.Error\ &Window.&Update<Tab>:cwin :cwin<CR>
+an 40.430.60 &Tools.Error\ &Window.&Open<Tab>:copen :copen<CR>
+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
+ \ :call <SID>XxdBack()<CR>
+
+" Use a function to do the conversion, so that it also works with 'insertmode'
+" set.
+def s:XxdConv()
+ var mod = &mod
+ if has("vms")
+ :%!mc vim:xxd
+ else
+ s:XxdFind()
+ exe ':%!' .. g:xxdprogram
+ endif
+ if getline(1) =~ "^00000000:" # only if it worked
+ set ft=xxd
+ endif
+ &mod = mod
+enddef
+
+def s:XxdBack()
+ var mod = &mod
+ if has("vms")
+ :%!mc vim:xxd -r
+ else
+ s:XxdFind()
+ exe ':%!' .. g:xxdprogram .. ' -r'
+ endif
+ set ft=
+ doautocmd filetypedetect BufReadPost
+ &mod = mod
+enddef
+
+def s:XxdFind()
+ if !exists("g:xxdprogram")
+ # On the PC xxd may not be in the path but in the install directory
+ if has("win32") && !executable("xxd")
+ g:xxdprogram = $VIMRUNTIME .. (&shellslash ? '/' : '\') .. "xxd.exe"
+ if g:xxdprogram =~ ' '
+ g:xxdprogram = '"' .. g:xxdprogram .. '"'
+ endif
+ else
+ g:xxdprogram = "xxd"
+ endif
+ endif
+enddef
+
+let s:did_setup_compilers = 0
+
+" Setup the Tools.Compiler submenu
+def s:SetupCompilers()
+ if s:did_setup_compilers
+ return
+ endif
+ s:did_setup_compilers = 1
+
+ var names = globpath(&runtimepath, "compiler/*.vim", 1, 1)
+ var idx = 100
+ for name in names
+ # Ignore case for VMS and windows
+ var cname = substitute(name, '\c.*[/\\:\]]\([^/\\:]*\)\.vim', '\1', '')
+ exe "an 30.440." .. idx .. ' &Tools.Se&t\ Compiler.' .. cname .. " :compiler " .. cname .. "<CR>"
+ idx += 10
+ endfor
+ silent! aunmenu &Tools.Show\ Compiler\ Se&ttings\ in\ Menu
+enddef
+
+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")
+ def s:SetupLazyloadMenus()
+ s:SetupColorSchemes()
+ s:SetupCompilers()
+ if has("keymap")
+ s:SetupKeymaps()
+ endif
+ enddef
+ augroup SetupLazyloadMenus
+ au!
+ au CursorHold,CursorHoldI * call <SID>SetupLazyloadMenus() | au! SetupLazyloadMenus
+ augroup END
+endif
+
+
+if !exists("no_buffers_menu")
+
+" Buffer list menu -- Setup functions & actions
+
+" wait with building the menu until after loading 'session' files. Makes
+" startup faster.
+let s:bmenu_wait = 1
+
+" Dictionary of buffer number to name. This helps prevent problems where a
+" buffer as renamed and we didn't keep track of that.
+let s:bmenu_items = {}
+
+if !exists("bmenu_priority")
+ let bmenu_priority = 60
+endif
+
+" invoked from a BufCreate or BufFilePost autocommand
+def s:BMAdd()
+ if s:bmenu_wait == 0
+ # when adding too many buffers, redraw in short format
+ if s:bmenu_count == &menuitems && s:bmenu_short == 0
+ s:BMShow()
+ else
+ var name = expand("<afile>")
+ var num = str2nr(expand("<abuf>"))
+ if s:BMCanAdd(name, num)
+ s:BMFilename(name, num)
+ s:bmenu_count += 1
+ endif
+ endif
+ endif
+enddef
+
+" invoked from a BufDelete or BufFilePre autocommand
+def s:BMRemove()
+ if s:bmenu_wait == 0
+ var bufnum = expand("<abuf>")
+ if s:bmenu_items->has_key(bufnum)
+ var menu_name = s:bmenu_items[bufnum]
+ exe 'silent! aun &Buffers.' .. menu_name
+ s:bmenu_count = s:bmenu_count - 1
+ unlet s:bmenu_items[bufnum]
+ endif
+ endif
+enddef
+
+" Return non-zero if buffer with number "name" / "num" is useful to add in the
+" buffer menu.
+def s:BMCanAdd(name: string, num: number): bool
+ # no directory or unlisted buffer
+ if isdirectory(name) || !buflisted(num)
+ return false
+ endif
+
+ # no name with control characters
+ if name =~ '[\x01-\x1f]'
+ return false
+ endif
+
+ # no special buffer, such as terminal or popup
+ var buftype = getbufvar(num, '&buftype')
+ if buftype != '' && buftype != 'nofile' && buftype != 'nowrite'
+ return false
+ endif
+
+ # only existing buffers
+ return bufexists(num)
+enddef
+
+" Create the buffer menu (delete an existing one first).
+def s:BMShow()
+ s:bmenu_wait = 1
+ s:bmenu_short = 1
+ s:bmenu_count = 0
+ s:bmenu_items = {}
+
+ # Remove old menu, if it exists; keep one entry to avoid a torn off menu to
+ # disappear. Use try/catch to avoid setting v:errmsg
+ try
+ unmenu &Buffers
+ catch
+ endtry
+ exe 'noremenu ' .. g:bmenu_priority .. ".1 &Buffers.Dummy l"
+ try
+ unmenu! &Buffers
+ catch
+ endtry
+
+ # create new menu
+ exe 'an <silent> ' .. g:bmenu_priority .. ".2 &Buffers.&Refresh\\ menu :call <SID>BMShow()<CR>"
+ exe 'an ' .. g:bmenu_priority .. ".4 &Buffers.&Delete :confirm bd<CR>"
+ exe 'an ' .. g:bmenu_priority .. ".6 &Buffers.&Alternate :confirm b #<CR>"
+ exe 'an ' .. g:bmenu_priority .. ".7 &Buffers.&Next :confirm bnext<CR>"
+ exe 'an ' .. g:bmenu_priority .. ".8 &Buffers.&Previous :confirm bprev<CR>"
+ exe 'an ' .. g:bmenu_priority .. ".9 &Buffers.-SEP- :"
+ unmenu &Buffers.Dummy
+
+ # figure out how many buffers there are
+ var buf = 1
+ while buf <= bufnr('$')
+ if s:BMCanAdd(bufname(buf), buf)
+ s:bmenu_count = s:bmenu_count + 1
+ endif
+ buf += 1
+ endwhile
+ if s:bmenu_count <= &menuitems
+ s:bmenu_short = 0
+ endif
+
+ # iterate through buffer list, adding each buffer to the menu:
+ buf = 1
+ while buf <= bufnr('$')
+ var name = bufname(buf)
+ if s:BMCanAdd(name, buf)
+ call s:BMFilename(name, buf)
+ endif
+ buf += 1
+ endwhile
+ s:bmenu_wait = 0
+ aug buffer_list
+ au!
+ au BufCreate,BufFilePost * call s:BMAdd()
+ au BufDelete,BufFilePre * call s:BMRemove()
+ aug END
+enddef
+
+def s:BMHash(name: string): number
+ # Make name all upper case, so that chars are between 32 and 96
+ var nm = substitute(name, ".*", '\U\0', "")
+ var sp: number
+ if has("ebcdic")
+ # HACK: Replace all non alphabetics with 'Z'
+ # Just to make it work for now.
+ nm = substitute(nm, "[^A-Z]", 'Z', "g")
+ sp = char2nr('A') - 1
+ else
+ 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)
+enddef
+
+def s:BMHash2(name: string): string
+ var nm = substitute(name, ".", '\L\0', "")
+ if nm[0] < 'a' || nm[0] > 'z'
+ return '&others.'
+ elseif nm[0] <= 'd'
+ return '&abcd.'
+ elseif nm[0] <= 'h'
+ return '&efgh.'
+ elseif nm[0] <= 'l'
+ return '&ijkl.'
+ elseif nm[0] <= 'p'
+ return '&mnop.'
+ elseif nm[0] <= 't'
+ return '&qrst.'
+ else
+ return '&u-z.'
+ endif
+enddef
+
+" Insert a buffer name into the buffer menu.
+def s:BMFilename(name: string, num: number)
+ var munge = s:BMMunge(name, num)
+ var hash = s:BMHash(munge)
+ var cmd: string
+ if s:bmenu_short == 0
+ s:bmenu_items[num] = munge
+ cmd = 'an ' .. g:bmenu_priority .. '.' .. hash .. ' &Buffers.' .. munge
+ else
+ var menu_name = s:BMHash2(munge) .. munge
+ s:bmenu_items[num] = menu_name
+ cmd = 'an ' .. g:bmenu_priority .. '.' .. hash .. '.' .. hash .. ' &Buffers.' .. menu_name
+ endif
+ exe cmd .. ' :confirm b' .. num .. '<CR>'
+enddef
+
+" Truncate a long path to fit it in a menu item.
+if !exists("g:bmenu_max_pathlen")
+ let g:bmenu_max_pathlen = 35
+endif
+
+def s:BMTruncName(fname: string): string
+ var name = fname
+ if g:bmenu_max_pathlen < 5
+ name = ""
+ else
+ var len = strlen(name)
+ if len > g:bmenu_max_pathlen
+ var amountl = (g:bmenu_max_pathlen / 2) - 2
+ var amountr = g:bmenu_max_pathlen - amountl - 3
+ var pattern = '^\(.\{,' .. amountl .. '}\).\{-}\(.\{,' .. amountr .. '}\)$'
+ var left = substitute(name, pattern, '\1', '')
+ var right = substitute(name, pattern, '\2', '')
+ if strlen(left) + strlen(right) < len
+ name = left .. '...' .. right
+ endif
+ endif
+ endif
+ return name
+enddef
+
+def s:BMMunge(fname: string, bnum: number): string
+ var name = fname
+ if name == ''
+ if !exists("g:menutrans_no_file")
+ g:menutrans_no_file = "[No Name]"
+ endif
+ name = g:menutrans_no_file
+ else
+ name = fnamemodify(name, ':p:~')
+ endif
+ # detach file name and separate it out:
+ var name2 = fnamemodify(name, ':t')
+ if bnum >= 0
+ name2 = name2 .. ' (' .. bnum .. ')'
+ endif
+ name = name2 .. "\t" .. s:BMTruncName(fnamemodify(name, ':h'))
+ name = escape(name, "\\. \t|")
+ name = substitute(name, "&", "&&", "g")
+ name = substitute(name, "\n", "^@", "g")
+ return name
+enddef
+
+" When just starting Vim, load the buffer menu later
+if has("vim_starting")
+ augroup LoadBufferMenu
+ au! VimEnter * if !exists("no_buffers_menu") | call <SID>BMShow() | endif
+ au VimEnter * au! LoadBufferMenu
+ augroup END
+else
+ call <SID>BMShow()
+endif
+
+endif " !exists("no_buffers_menu")
+
+" Window menu
+an 70.300 &Window.&New<Tab>^Wn <C-W>n
+an 70.310 &Window.S&plit<Tab>^Ws <C-W>s
+an 70.320 &Window.Sp&lit\ To\ #<Tab>^W^^ <C-W><C-^>
+an 70.330 &Window.Split\ &Vertically<Tab>^Wv <C-W>v
+an <silent> 70.332 &Window.Split\ File\ E&xplorer :call MenuExplOpen()<CR>
+if !exists("*MenuExplOpen")
+ def MenuExplOpen()
+ if @% == ""
+ :20vsp .
+ else
+ exe ":20vsp " .. fnameescape(expand("%:p:h"))
+ endif
+ enddef
+endif
+an 70.335 &Window.-SEP1- <Nop>
+an 70.340 &Window.&Close<Tab>^Wc :confirm close<CR>
+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.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>
+an 70.370 &Window.&Equal\ Size<Tab>^W= <C-W>=
+an 70.380 &Window.&Max\ Height<Tab>^W_ <C-W>_
+an 70.390 &Window.M&in\ Height<Tab>^W1_ <C-W>1_
+an 70.400 &Window.Max\ &Width<Tab>^W\| <C-W>\|
+an 70.410 &Window.Min\ Widt&h<Tab>^W1\| <C-W>1\|
+
+" The popup menu
+an 1.10 PopUp.&Undo u
+an 1.15 PopUp.-SEP1- <Nop>
+vnoremenu 1.20 PopUp.Cu&t "+x
+vnoremenu 1.30 PopUp.&Copy "+y
+cnoremenu 1.30 PopUp.&Copy <C-Y>
+nnoremenu 1.40 PopUp.&Paste "+gP
+cnoremenu 1.40 PopUp.&Paste <C-R>+
+exe 'vnoremenu <script> 1.40 PopUp.&Paste ' .. paste#paste_cmd['v']
+exe 'inoremenu <script> 1.40 PopUp.&Paste ' .. paste#paste_cmd['i']
+vnoremenu 1.50 PopUp.&Delete x
+an 1.55 PopUp.-SEP2- <Nop>
+vnoremenu 1.60 PopUp.Select\ Blockwise <C-V>
+
+nnoremenu 1.70 PopUp.Select\ &Word vaw
+onoremenu 1.70 PopUp.Select\ &Word aw
+vnoremenu 1.70 PopUp.Select\ &Word <C-C>vaw
+inoremenu 1.70 PopUp.Select\ &Word <C-O>vaw
+cnoremenu 1.70 PopUp.Select\ &Word <C-C>vaw
+
+nnoremenu 1.73 PopUp.Select\ &Sentence vas
+onoremenu 1.73 PopUp.Select\ &Sentence as
+vnoremenu 1.73 PopUp.Select\ &Sentence <C-C>vas
+inoremenu 1.73 PopUp.Select\ &Sentence <C-O>vas
+cnoremenu 1.73 PopUp.Select\ &Sentence <C-C>vas
+
+nnoremenu 1.77 PopUp.Select\ Pa&ragraph vap
+onoremenu 1.77 PopUp.Select\ Pa&ragraph ap
+vnoremenu 1.77 PopUp.Select\ Pa&ragraph <C-C>vap
+inoremenu 1.77 PopUp.Select\ Pa&ragraph <C-O>vap
+cnoremenu 1.77 PopUp.Select\ Pa&ragraph <C-C>vap
+
+nnoremenu 1.80 PopUp.Select\ &Line V
+onoremenu 1.80 PopUp.Select\ &Line <C-C>V
+vnoremenu 1.80 PopUp.Select\ &Line <C-C>V
+inoremenu 1.80 PopUp.Select\ &Line <C-O>V
+cnoremenu 1.80 PopUp.Select\ &Line <C-C>V
+
+nnoremenu 1.90 PopUp.Select\ &Block <C-V>
+onoremenu 1.90 PopUp.Select\ &Block <C-C><C-V>
+vnoremenu 1.90 PopUp.Select\ &Block <C-C><C-V>
+inoremenu 1.90 PopUp.Select\ &Block <C-O><C-V>
+cnoremenu 1.90 PopUp.Select\ &Block <C-C><C-V>
+
+noremenu <script> <silent> 1.100 PopUp.Select\ &All :<C-U>call <SID>SelectAll()<CR>
+inoremenu <script> <silent> 1.100 PopUp.Select\ &All <C-O>:call <SID>SelectAll()<CR>
+cnoremenu <script> <silent> 1.100 PopUp.Select\ &All <C-U>call <SID>SelectAll()<CR>
+
+if has("spell")
+ " Spell suggestions in the popup menu. Note that this will slow down the
+ " appearance of the menu!
+ def s:SpellPopup()
+ if exists("s:changeitem") && s:changeitem != ''
+ call s:SpellDel()
+ endif
+
+ # Return quickly if spell checking is not enabled.
+ if !&spell || &spelllang == ''
+ return
+ endif
+
+ var curcol = col('.')
+ var w: string
+ var a: string
+ [w, a] = spellbadword()
+ if col('.') > curcol # don't use word after the cursor
+ w = ''
+ endif
+ if w != ''
+ if a == 'caps'
+ s:suglist = [substitute(w, '.*', '\u&', '')]
+ else
+ s:suglist = spellsuggest(w, 10)
+ endif
+ if len(s:suglist) > 0
+ if !exists("g:menutrans_spell_change_ARG_to")
+ g:menutrans_spell_change_ARG_to = 'Change\ "%s"\ to'
+ endif
+ s:changeitem = printf(g:menutrans_spell_change_ARG_to, escape(w, ' .'))
+ s:fromword = w
+ var pri = 1
+ for sug in s:suglist
+ exe 'anoremenu 1.5.' .. pri .. ' PopUp.' .. s:changeitem .. '.' .. escape(sug, ' .')
+ \ .. ' :call <SID>SpellReplace(' .. pri .. ')<CR>'
+ pri += 1
+ endfor
+
+ if !exists("g:menutrans_spell_add_ARG_to_word_list")
+ g:menutrans_spell_add_ARG_to_word_list = 'Add\ "%s"\ to\ Word\ List'
+ endif
+ s:additem = printf(g:menutrans_spell_add_ARG_to_word_list, escape(w, ' .'))
+ exe 'anoremenu 1.6 PopUp.' .. s:additem .. ' :spellgood ' .. w .. '<CR>'
+
+ if !exists("g:menutrans_spell_ignore_ARG")
+ g:menutrans_spell_ignore_ARG = 'Ignore\ "%s"'
+ endif
+ 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- :
+ endif
+ endif
+ call cursor(0, curcol) # put the cursor back where it was
+ enddef
+
+ def s:SpellReplace(n: number)
+ var l = getline('.')
+ # Move the cursor to the start of the word.
+ call spellbadword()
+ call setline('.', strpart(l, 0, col('.') - 1) .. s:suglist[n - 1]
+ \ .. strpart(l, col('.') + len(s:fromword) - 1))
+ enddef
+
+ def s:SpellDel()
+ exe "aunmenu PopUp." .. s:changeitem
+ exe "aunmenu PopUp." .. s:additem
+ exe "aunmenu PopUp." .. s:ignoreitem
+ aunmenu PopUp.-SpellSep-
+ s:changeitem = ''
+ enddef
+
+ augroup SpellPopupMenu
+ au! MenuPopup * call <SID>SpellPopup()
+ augroup END
+endif
+
+" The GUI toolbar (for MS-Windows and GTK)
+if has("toolbar")
+ an 1.10 ToolBar.Open :browse confirm e<CR>
+ an <silent> 1.20 ToolBar.Save :if expand("%") == ""<Bar>browse confirm w<Bar>else<Bar>confirm w<Bar>endif<CR>
+ an 1.30 ToolBar.SaveAll :browse confirm wa<CR>
+
+ if has("printer")
+ an 1.40 ToolBar.Print :hardcopy<CR>
+ vunmenu ToolBar.Print
+ vnoremenu ToolBar.Print :hardcopy<CR>
+ elseif has("unix")
+ an 1.40 ToolBar.Print :w !lpr<CR>
+ vunmenu ToolBar.Print
+ vnoremenu ToolBar.Print :w !lpr<CR>
+ endif
+
+ an 1.45 ToolBar.-sep1- <Nop>
+ an 1.50 ToolBar.Undo u
+ an 1.60 ToolBar.Redo <C-R>
+
+ an 1.65 ToolBar.-sep2- <Nop>
+ vnoremenu 1.70 ToolBar.Cut "+x
+ vnoremenu 1.80 ToolBar.Copy "+y
+ cnoremenu 1.80 ToolBar.Copy <C-Y>
+ nnoremenu 1.90 ToolBar.Paste "+gP
+ cnoremenu ToolBar.Paste <C-R>+
+ exe 'vnoremenu <script> ToolBar.Paste ' .. paste#paste_cmd['v']
+ exe 'inoremenu <script> ToolBar.Paste ' .. paste#paste_cmd['i']
+
+ if !has("gui_athena")
+ an 1.95 ToolBar.-sep3- <Nop>
+ an 1.100 ToolBar.Replace :promptrepl<CR>
+ vunmenu ToolBar.Replace
+ vnoremenu ToolBar.Replace y:promptrepl <C-R>=<SID>FixFText()<CR><CR>
+ an 1.110 ToolBar.FindNext n
+ an 1.120 ToolBar.FindPrev N
+ endif
+
+ an 1.215 ToolBar.-sep5- <Nop>
+ an <silent> 1.220 ToolBar.LoadSesn :call <SID>LoadVimSesn()<CR>
+ an <silent> 1.230 ToolBar.SaveSesn :call <SID>SaveVimSesn()<CR>
+ an 1.240 ToolBar.RunScript :browse so<CR>
+
+ an 1.245 ToolBar.-sep6- <Nop>
+ an 1.250 ToolBar.Make :make<CR>
+ an 1.270 ToolBar.RunCtags :exe "!" .. g:ctags_command<CR>
+ an 1.280 ToolBar.TagJump g<C-]>
+
+ an 1.295 ToolBar.-sep7- <Nop>
+ an 1.300 ToolBar.Help :help<CR>
+ an <silent> 1.310 ToolBar.FindHelp :call <SID>Helpfind()<CR>
+
+" Only set the tooltips here if not done in a language menu file
+if exists("*Do_toolbar_tmenu")
+ call Do_toolbar_tmenu()
+else
+ let did_toolbar_tmenu = 1
+ tmenu ToolBar.Open Open file
+ tmenu ToolBar.Save Save current file
+ tmenu ToolBar.SaveAll Save all files
+ tmenu ToolBar.Print Print
+ tmenu ToolBar.Undo Undo
+ tmenu ToolBar.Redo Redo
+ tmenu ToolBar.Cut Cut to clipboard
+ tmenu ToolBar.Copy Copy to clipboard
+ tmenu ToolBar.Paste Paste from Clipboard
+ if !has("gui_athena")
+ tmenu ToolBar.Replace Find / Replace...
+ tmenu ToolBar.FindNext Find Next
+ tmenu ToolBar.FindPrev Find Previous
+ endif
+ tmenu ToolBar.LoadSesn Choose a session to load
+ tmenu ToolBar.SaveSesn Save current session
+ tmenu ToolBar.RunScript Choose a Vim Script to run
+ tmenu ToolBar.Make Make current project (:make)
+ tmenu ToolBar.RunCtags Build tags in current directory tree (!ctags -R .)
+ tmenu ToolBar.TagJump Jump to tag under cursor
+ tmenu ToolBar.Help Vim Help
+ tmenu ToolBar.FindHelp Search Vim Help
+endif
+
+" Select a session to load; default to current session name if present
+def s:LoadVimSesn()
+ var name: string
+ if strlen(v:this_session) > 0
+ name = fnameescape(v:this_session)
+ else
+ name = "Session.vim"
+ endif
+ execute "browse so " .. name
+enddef
+
+" Select a session to save; default to current session name if present
+def s:SaveVimSesn()
+ if strlen(v:this_session) == 0
+ v:this_session = "Session.vim"
+ endif
+ execute "browse mksession! " .. fnameescape(v:this_session)
+enddef
+
+endif
+
+endif " !exists("did_install_default_menus")
+
+" Define these items always, so that syntax can be switched on when it wasn't.
+" But skip them when the Syntax menu was disabled by the user.
+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>
+ if !exists("*s:SynOnOff")
+ def s:SynOnOff()
+ if has("syntax_items")
+ syn clear
+ else
+ if !exists("g:syntax_on")
+ syn manual
+ endif
+ set syn=ON
+ endif
+ enddef
+ endif
+endif
+
+
+" Install the Syntax menu only when filetype.vim has been loaded or when
+" manual syntax highlighting is enabled.
+" Avoid installing the Syntax menu twice.
+if (exists("did_load_filetypes") || exists("syntax_on"))
+ \ && !exists("did_install_syntax_menu")
+ let did_install_syntax_menu = 1
+
+" Skip setting up the individual syntax selection menus unless
+" do_syntax_sel_menu is defined (it takes quite a bit of time).
+if exists("do_syntax_sel_menu")
+ runtime! synmenu.vim
+else
+ 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.730 &Syntax.&Convert\ to\ HTML :runtime syntax/2html.vim<CR>
+
+" Uncomment the next line to compile the functions early to find any mistakes
+" defcompile
+
+endif " !exists("did_install_syntax_menu")
+
+" Restore the previous value of 'cpoptions'.
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: set sw=2 :
diff --git a/runtime/mswin.vim b/runtime/mswin.vim
new file mode 100644
index 0000000..2b04c1a
--- /dev/null
+++ b/runtime/mswin.vim
@@ -0,0 +1,125 @@
+" Set options and add mapping such that Vim behaves a lot like MS-Windows
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2018 Dec 07
+
+" Bail out if this isn't wanted.
+if exists("g:skip_loading_mswin") && g:skip_loading_mswin
+ finish
+endif
+
+" set the 'cpoptions' to its Vim default
+if 1 " only do this when compiled with expression evaluation
+ let s:save_cpo = &cpoptions
+endif
+set cpo&vim
+
+" set 'selection', 'selectmode', 'mousemodel' and 'keymodel' for MS-Windows
+behave mswin
+
+" backspace and cursor keys wrap to previous/next line
+set backspace=indent,eol,start whichwrap+=<,>,[,]
+
+" backspace in Visual mode deletes selection
+vnoremap <BS> d
+
+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-V and SHIFT-Insert are Paste
+ map <C-V> "+gP
+ map <S-Insert> "+gP
+
+ 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
+" were characterwise instead.
+" Uses the paste.vim autoload script.
+" Use CTRL-G u to have CTRL-Z only undo the paste.
+
+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>
+
+" 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 (<C-O> doesn't work well when
+" using completions).
+noremap <C-S> :update<CR>
+vnoremap <C-S> <C-C>: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.
+if !has("unix")
+ set guioptions-=a
+endif
+
+" CTRL-Z is Undo; not in cmdline though
+noremap <C-Z> u
+inoremap <C-Z> <C-O>u
+
+" CTRL-Y is Redo (although not repeat); not in cmdline though
+noremap <C-Y> <C-R>
+inoremap <C-Y> <C-O><C-R>
+
+" Alt-Space is System menu
+if has("gui")
+ noremap <M-Space> :simalt ~<CR>
+ inoremap <M-Space> <C-O>:simalt ~<CR>
+ cnoremap <M-Space> <C-C>:simalt ~<CR>
+endif
+
+" CTRL-A is Select all
+noremap <C-A> gggH<C-O>G
+inoremap <C-A> <C-O>gg<C-O>gH<C-O>G
+cnoremap <C-A> <C-C>gggH<C-O>G
+onoremap <C-A> <C-C>gggH<C-O>G
+snoremap <C-A> <C-C>gggH<C-O>G
+xnoremap <C-A> <C-C>ggVG
+
+" CTRL-Tab is Next window
+noremap <C-Tab> <C-W>w
+inoremap <C-Tab> <C-O><C-W>w
+cnoremap <C-Tab> <C-C><C-W>w
+onoremap <C-Tab> <C-C><C-W>w
+
+" CTRL-F4 is Close window
+noremap <C-F4> <C-W>c
+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
+ let &cpoptions = s:save_cpo
+ unlet s:save_cpo
+endif
diff --git a/runtime/optwin.vim b/runtime/optwin.vim
new file mode 100644
index 0000000..ed31b67
--- /dev/null
+++ b/runtime/optwin.vim
@@ -0,0 +1,1491 @@
+" These commands create the option window.
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Dec 16
+
+" If there already is an option window, jump to that one.
+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
+ endif
+endif
+
+" Make sure the '<' flag is not included in 'cpoptions', otherwise <CR> would
+" not be recognized. See ":help 'cpoptions'".
+let s:cpo_save = &cpo
+set cpo&vim
+
+" function to be called when <CR> is hit in the option-window
+func <SID>CR()
+
+ " If on a continued comment line, go back to the first comment line
+ let lnum = search("^[^\t]", 'bWcn')
+ let line = getline(lnum)
+
+ " <CR> on a "set" line executes the option line
+ if match(line, "^ \tset ") >= 0
+
+ " For a local option: go to the previous window
+ " If this is a help window, go to the window below it
+ let thiswin = winnr()
+ let local = <SID>Find(lnum)
+ if local >= 0
+ exe line
+ call <SID>Update(lnum, line, local, thiswin)
+ endif
+
+ " <CR> on a "option" line shows help for that option
+ elseif match(line, "^[a-z]") >= 0
+ let name = substitute(line, '\([^\t]*\).*', '\1', "")
+ exe "help '" . name . "'"
+
+ " <CR> on an index line jumps to the group
+ elseif match(line, '^ \=[0-9]') >= 0
+ exe "norm! /" . line . "\<CR>zt"
+ endif
+endfunc
+
+" function to be called when <Space> is hit in the option-window
+func <SID>Space()
+
+ let lnum = line(".")
+ let line = getline(lnum)
+
+ " <Space> on a "set" line refreshes the option line
+ if match(line, "^ \tset ") >= 0
+
+ " For a local option: go to the previous window
+ " If this is a help window, go to the window below it
+ let thiswin = winnr()
+ let local = <SID>Find(lnum)
+ if local >= 0
+ call <SID>Update(lnum, line, local, thiswin)
+ endif
+
+ endif
+endfunc
+
+let s:local_to_window = gettext('(local to window)')
+let s:local_to_buffer = gettext('(local to buffer)')
+let s:global_or_local = gettext('(global or local to buffer)')
+
+" find the window in which the option applies
+" returns 0 for global option, 1 for local option, -1 for error
+func <SID>Find(lnum)
+ let line = getline(a:lnum - 1)
+ if line =~ s:local_to_window || line =~ s:local_to_buffer
+ let local = 1
+ let thiswin = winnr()
+ wincmd p
+ if exists("b:current_syntax") && b:current_syntax == "help"
+ wincmd j
+ if winnr() == thiswin
+ wincmd j
+ endif
+ endif
+ else
+ let local = 0
+ endif
+ if local && (winnr() == thiswin || (exists("b:current_syntax")
+ \ && b:current_syntax == "help"))
+ echo "Don't know in which window"
+ let local = -1
+ endif
+ return local
+endfunc
+
+" Update a "set" line in the option window
+func <SID>Update(lnum, line, local, thiswin)
+ " get the new value of the option and update the option window line
+ if match(a:line, "=") >= 0
+ let name = substitute(a:line, '^ \tset \([^=]*\)=.*', '\1', "")
+ else
+ let name = substitute(a:line, '^ \tset \(no\)\=\([a-z]*\).*', '\2', "")
+ endif
+ if name == "pt" && &pt =~ "\x80"
+ let val = <SID>PTvalue()
+ else
+ let val = escape(eval('&' . name), " \t\\\"|")
+ endif
+ if a:local
+ exe a:thiswin . "wincmd w"
+ endif
+ if match(a:line, "=") >= 0 || (val != "0" && val != "1")
+ call setline(a:lnum, " \tset " . name . "=" . val)
+ else
+ if val
+ call setline(a:lnum, " \tset " . name . "\tno" . name)
+ else
+ call setline(a:lnum, " \tset no" . name . "\t" . name)
+ endif
+ endif
+ set nomodified
+endfunc
+
+" 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
+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.
+let s:thiswin = winnr()
+while exists("b:current_syntax") && b:current_syntax == "help"
+ wincmd w
+ if s:thiswin == winnr()
+ break
+ endif
+endwhile
+
+" 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.
+call append(0, gettext('" Each "set" line shows the current value of an option (on the left).'))
+call append(1, gettext('" Hit <Enter> on a "set" line to execute it.'))
+call append(2, gettext('" A boolean option will be toggled.'))
+call append(3, gettext('" For other options you can edit the value before hitting <Enter>.'))
+call append(4, gettext('" Hit <Enter> on a help line to open a help window on this option.'))
+call append(5, gettext('" Hit <Enter> on an index line to jump there.'))
+call append(6, gettext('" Hit <Space> on a "set" line to refresh it.'))
+
+" These functions are called often below. Keep them fast!
+
+" Add an option name and explanation. The text can contain "\n" characters
+" where a line break is to be inserted.
+func <SID>AddOption(name, text)
+ let lines = split(a:text, "\n")
+ call append("$", a:name .. "\t" .. lines[0])
+ for line in lines[1:]
+ call append("$", "\t" .. line)
+ endfor
+endfunc
+
+" Init a local binary option
+func <SID>BinOptionL(name)
+ let val = getwinvar(winnr('#'), '&' . a:name)
+ call append("$", substitute(substitute(" \tset " . val . a:name . "\t" .
+ \!val . a:name, "0", "no", ""), "1", "", ""))
+endfunc
+
+" Init a global binary option
+func <SID>BinOptionG(name, val)
+ call append("$", substitute(substitute(" \tset " . a:val . a:name . "\t" .
+ \!a:val . a:name, "0", "no", ""), "1", "", ""))
+endfunc
+
+" Init a local string option
+func <SID>OptionL(name)
+ let val = escape(getwinvar(winnr('#'), '&' . a:name), " \t\\\"|")
+ call append("$", " \tset " . a:name . "=" . val)
+endfunc
+
+" Init a global string option
+func <SID>OptionG(name, val)
+ call append("$", " \tset " . a:name . "=" . escape(a:val, " \t\\\"|"))
+endfunc
+
+let s:idx = 1
+let s:lnum = line("$")
+call append("$", "")
+
+func <SID>Header(text)
+ let line = s:idx . " " . a:text
+ if s:idx < 10
+ let line = " " . line
+ endif
+ call append("$", "")
+ call append("$", line)
+ call append("$", "")
+ call append(s:lnum, line)
+ let s:idx = s:idx + 1
+ let s:lnum = s:lnum + 1
+endfunc
+
+" Get the value of 'pastetoggle'. It could be a special key.
+func <SID>PTvalue()
+ redir @a
+ silent set pt
+ redir END
+ return substitute(@a, '[^=]*=\(.*\)', '\1', "")
+endfunc
+
+" Restore the previous value of 'cpoptions' here, it's used below.
+let &cpo = s:cpo_save
+
+" List of all options, organized by function.
+" The text should be sufficient to know what the option is used for.
+
+call <SID>Header(gettext("important"))
+call <SID>AddOption("compatible", gettext("behave very Vi compatible (not advisable)"))
+call <SID>BinOptionG("cp", &cp)
+call <SID>AddOption("cpoptions", gettext("list of flags to specify Vi compatibility"))
+call <SID>OptionG("cpo", &cpo)
+call <SID>AddOption("insertmode", gettext("use Insert mode as the default mode"))
+call <SID>BinOptionG("im", &im)
+call <SID>AddOption("paste", gettext("paste mode, insert typed text literally"))
+call <SID>BinOptionG("paste", &paste)
+call <SID>AddOption("pastetoggle", gettext("key sequence to toggle paste mode"))
+if &pt =~ "\x80"
+ call append("$", " \tset pt=" . <SID>PTvalue())
+else
+ call <SID>OptionG("pt", &pt)
+endif
+call <SID>AddOption("runtimepath", gettext("list of directories used for runtime files and plugins"))
+call <SID>OptionG("rtp", &rtp)
+call <SID>AddOption("packpath", gettext("list of directories used for plugin packages"))
+call <SID>OptionG("pp", &pp)
+call <SID>AddOption("helpfile", gettext("name of the main help file"))
+call <SID>OptionG("hf", &hf)
+
+
+call <SID>Header(gettext("moving around, searching and patterns"))
+call <SID>AddOption("whichwrap", gettext("list of flags specifying which commands wrap to another line"))
+call <SID>OptionG("ww", &ww)
+call <SID>AddOption("startofline", gettext("many jump commands move the cursor to the first non-blank\ncharacter of a line"))
+call <SID>BinOptionG("sol", &sol)
+call <SID>AddOption("paragraphs", gettext("nroff macro names that separate paragraphs"))
+call <SID>OptionG("para", &para)
+call <SID>AddOption("sections", gettext("nroff macro names that separate sections"))
+call <SID>OptionG("sect", &sect)
+call <SID>AddOption("path", gettext("list of directory names used for file searching"))
+call append("$", "\t" .. s:global_or_local)
+call <SID>OptionG("pa", &pa)
+call <SID>AddOption("cdhome", gettext(":cd without argument goes to the home directory"))
+call <SID>BinOptionG("cdh", &cdh)
+call <SID>AddOption("cdpath", gettext("list of directory names used for :cd"))
+call <SID>OptionG("cd", &cd)
+if exists("+autochdir")
+ call <SID>AddOption("autochdir", gettext("change to directory of file in buffer"))
+ call <SID>BinOptionG("acd", &acd)
+endif
+call <SID>AddOption("autoshelldir", gettext("change to pwd of shell in terminal buffer"))
+call <SID>BinOptionG("asd", &asd)
+call <SID>AddOption("wrapscan", gettext("search commands wrap around the end of the buffer"))
+call <SID>BinOptionG("ws", &ws)
+call <SID>AddOption("incsearch", gettext("show match for partly typed search command"))
+call <SID>BinOptionG("is", &is)
+call <SID>AddOption("magic", gettext("change the way backslashes are used in search patterns"))
+call <SID>BinOptionG("magic", &magic)
+call <SID>AddOption("regexpengine", gettext("select the default regexp engine used"))
+call <SID>OptionG("re", &re)
+call <SID>AddOption("ignorecase", gettext("ignore case when using a search pattern"))
+call <SID>BinOptionG("ic", &ic)
+call <SID>AddOption("smartcase", gettext("override 'ignorecase' when pattern has upper case characters"))
+call <SID>BinOptionG("scs", &scs)
+call <SID>AddOption("casemap", gettext("what method to use for changing case of letters"))
+call <SID>OptionG("cmp", &cmp)
+call <SID>AddOption("maxmempattern", gettext("maximum amount of memory in Kbyte used for pattern matching"))
+call append("$", " \tset mmp=" . &mmp)
+call <SID>AddOption("define", gettext("pattern for a macro definition line"))
+call append("$", "\t" .. s:global_or_local)
+call <SID>OptionG("def", &def)
+if has("find_in_path")
+ call <SID>AddOption("include", gettext("pattern for an include-file line"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("inc")
+ call <SID>AddOption("includeexpr", gettext("expression used to transform an include line to a file name"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("inex")
+endif
+
+
+call <SID>Header(gettext("tags"))
+call <SID>AddOption("tagbsearch", gettext("use binary searching in tags files"))
+call <SID>BinOptionG("tbs", &tbs)
+call <SID>AddOption("taglength", gettext("number of significant characters in a tag name or zero"))
+call append("$", " \tset tl=" . &tl)
+call <SID>AddOption("tags", gettext("list of file names to search for tags"))
+call append("$", "\t" .. s:global_or_local)
+call <SID>OptionG("tag", &tag)
+call <SID>AddOption("tagcase", gettext("how to handle case when searching in tags files:\n\"followic\" to follow 'ignorecase', \"ignore\" or \"match\""))
+call append("$", "\t" .. s:global_or_local)
+call <SID>OptionG("tc", &tc)
+call <SID>AddOption("tagrelative", gettext("file names in a tags file are relative to the tags file"))
+call <SID>BinOptionG("tr", &tr)
+call <SID>AddOption("tagstack", gettext("a :tag command will use the tagstack"))
+call <SID>BinOptionG("tgst", &tgst)
+call <SID>AddOption("showfulltag", gettext("when completing tags in Insert mode show more info"))
+call <SID>BinOptionG("sft", &sft)
+if has("eval")
+ call <SID>AddOption("tagfunc", gettext("a function to be used to perform tag searches"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("tfu")
+endif
+if has("cscope")
+ call <SID>AddOption("cscopeprg", gettext("command for executing cscope"))
+ call <SID>OptionG("csprg", &csprg)
+ call <SID>AddOption("cscopetag", gettext("use cscope for tag commands"))
+ call <SID>BinOptionG("cst", &cst)
+ call <SID>AddOption("cscopetagorder", gettext("0 or 1; the order in which \":cstag\" performs a search"))
+ call append("$", " \tset csto=" . &csto)
+ call <SID>AddOption("cscopeverbose", gettext("give messages when adding a cscope database"))
+ call <SID>BinOptionG("csverb", &csverb)
+ call <SID>AddOption("cscopepathcomp", gettext("how many components of the path to show"))
+ call append("$", " \tset cspc=" . &cspc)
+ call <SID>AddOption("cscopequickfix", gettext("when to open a quickfix window for cscope"))
+ call <SID>OptionG("csqf", &csqf)
+ call <SID>AddOption("cscoperelative", gettext("file names in a cscope file are relative to that file"))
+ call <SID>BinOptionG("csre", &csre)
+endif
+
+
+call <SID>Header(gettext("displaying text"))
+call <SID>AddOption("scroll", gettext("number of lines to scroll for CTRL-U and CTRL-D"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>OptionL("scr")
+call <SID>AddOption("smoothscroll", gettext("scroll by screen line"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("sms")
+call <SID>AddOption("scrolloff", gettext("number of screen lines to show around the cursor"))
+call append("$", " \tset so=" . &so)
+call <SID>AddOption("wrap", gettext("long lines wrap"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("wrap")
+call <SID>AddOption("linebreak", gettext("wrap long lines at a character in 'breakat'"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("lbr")
+call <SID>AddOption("breakindent", gettext("preserve indentation in wrapped text"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("bri")
+call <SID>AddOption("breakindentopt", gettext("adjust breakindent behaviour"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>OptionL("briopt")
+call <SID>AddOption("breakat", gettext("which characters might cause a line break"))
+call <SID>OptionG("brk", &brk)
+call <SID>AddOption("showbreak", gettext("string to put before wrapped screen lines"))
+call <SID>OptionG("sbr", &sbr)
+call <SID>AddOption("sidescroll", gettext("minimal number of columns to scroll horizontally"))
+call append("$", " \tset ss=" . &ss)
+call <SID>AddOption("sidescrolloff", gettext("minimal number of columns to keep left and right of the cursor"))
+call append("$", " \tset siso=" . &siso)
+call <SID>AddOption("display", gettext("include \"lastline\" to show the last line even if it doesn't fit\ninclude \"uhex\" to show unprintable characters as a hex number"))
+call <SID>OptionG("dy", &dy)
+call <SID>AddOption("fillchars", gettext("characters to use for the status line, folds and filler lines"))
+call <SID>OptionG("fcs", &fcs)
+call <SID>AddOption("cmdheight", gettext("number of lines used for the command-line"))
+call append("$", " \tset ch=" . &ch)
+call <SID>AddOption("columns", gettext("width of the display"))
+call append("$", " \tset co=" . &co)
+call <SID>AddOption("lines", gettext("number of lines in the display"))
+call append("$", " \tset lines=" . &lines)
+call <SID>AddOption("window", gettext("number of lines to scroll for CTRL-F and CTRL-B"))
+call append("$", " \tset window=" . &window)
+call <SID>AddOption("lazyredraw", gettext("don't redraw while executing macros"))
+call <SID>BinOptionG("lz", &lz)
+if has("reltime")
+ call <SID>AddOption("redrawtime", gettext("timeout for 'hlsearch' and :match highlighting in msec"))
+ call append("$", " \tset rdt=" . &rdt)
+endif
+call <SID>AddOption("writedelay", gettext("delay in msec for each char written to the display\n(for debugging)"))
+call append("$", " \tset wd=" . &wd)
+call <SID>AddOption("list", gettext("show <Tab> as ^I and end-of-line as $"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("list")
+call <SID>AddOption("listchars", gettext("list of strings used for list mode"))
+call <SID>OptionG("lcs", &lcs)
+call <SID>AddOption("number", gettext("show the line number for each line"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("nu")
+call <SID>AddOption("relativenumber", gettext("show the relative line number for each line"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("rnu")
+if has("linebreak")
+ call <SID>AddOption("numberwidth", gettext("number of columns to use for the line number"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("nuw")
+endif
+if has("conceal")
+ call <SID>AddOption("conceallevel", gettext("controls whether concealable text is hidden"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("cole")
+ call <SID>AddOption("concealcursor", gettext("modes in which text in the cursor line can be concealed"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("cocu")
+endif
+
+
+call <SID>Header(gettext("syntax, highlighting and spelling"))
+call <SID>AddOption("background", gettext("\"dark\" or \"light\"; the background color brightness"))
+call <SID>OptionG("bg", &bg)
+call <SID>AddOption("filetype", gettext("type of file; triggers the FileType event when set"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("ft")
+if has("syntax")
+ call <SID>AddOption("syntax", gettext("name of syntax highlighting used"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("syn")
+ call <SID>AddOption("synmaxcol", gettext("maximum column to look for syntax items"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("smc")
+endif
+call <SID>AddOption("highlight", gettext("which highlighting to use for various occasions"))
+call <SID>OptionG("hl", &hl)
+call <SID>AddOption("hlsearch", gettext("highlight all matches for the last used search pattern"))
+call <SID>BinOptionG("hls", &hls)
+call <SID>AddOption("wincolor", gettext("highlight group to use for the window"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>OptionL("wcr")
+if has("termguicolors")
+ call <SID>AddOption("termguicolors", gettext("use GUI colors for the terminal"))
+ call <SID>BinOptionG("tgc", &tgc)
+endif
+if has("syntax")
+ call <SID>AddOption("cursorcolumn", gettext("highlight the screen column of the cursor"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>BinOptionL("cuc")
+ call <SID>AddOption("cursorline", gettext("highlight the screen line of the cursor"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>BinOptionL("cul")
+ call <SID>AddOption("cursorlineopt", gettext("specifies which area 'cursorline' highlights"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("culopt")
+ call <SID>AddOption("colorcolumn", gettext("columns to highlight"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("cc")
+ call <SID>AddOption("spell", gettext("highlight spelling mistakes"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>BinOptionL("spell")
+ call <SID>AddOption("spelllang", gettext("list of accepted languages"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("spl")
+ call <SID>AddOption("spellfile", gettext("file that \"zg\" adds good words to"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("spf")
+ call <SID>AddOption("spellcapcheck", gettext("pattern to locate the end of a sentence"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("spc")
+ call <SID>AddOption("spelloptions", gettext("flags to change how spell checking works"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("spo")
+ call <SID>AddOption("spellsuggest", gettext("methods used to suggest corrections"))
+ call <SID>OptionG("sps", &sps)
+ call <SID>AddOption("mkspellmem", gettext("amount of memory used by :mkspell before compressing"))
+ call <SID>OptionG("msm", &msm)
+endif
+
+
+call <SID>Header(gettext("multiple windows"))
+call <SID>AddOption("laststatus", gettext("0, 1 or 2; when to use a status line for the last window"))
+call append("$", " \tset ls=" . &ls)
+if has("statusline")
+ call <SID>AddOption("statusline", gettext("alternate format to be used for a status line"))
+ call <SID>OptionG("stl", &stl)
+endif
+call <SID>AddOption("equalalways", gettext("make all windows the same size when adding/removing windows"))
+call <SID>BinOptionG("ea", &ea)
+call <SID>AddOption("eadirection", gettext("in which direction 'equalalways' works: \"ver\", \"hor\" or \"both\""))
+call <SID>OptionG("ead", &ead)
+call <SID>AddOption("winheight", gettext("minimal number of lines used for the current window"))
+call append("$", " \tset wh=" . &wh)
+call <SID>AddOption("winminheight", gettext("minimal number of lines used for any window"))
+call append("$", " \tset wmh=" . &wmh)
+call <SID>AddOption("winfixheight", gettext("keep the height of the window"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("wfh")
+call <SID>AddOption("winfixwidth", gettext("keep the width of the window"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("wfw")
+call <SID>AddOption("winwidth", gettext("minimal number of columns used for the current window"))
+call append("$", " \tset wiw=" . &wiw)
+call <SID>AddOption("winminwidth", gettext("minimal number of columns used for any window"))
+call append("$", " \tset wmw=" . &wmw)
+call <SID>AddOption("helpheight", gettext("initial height of the help window"))
+call append("$", " \tset hh=" . &hh)
+if has("quickfix")
+ call <SID>AddOption("previewpopup", gettext("use a popup window for preview"))
+ call append("$", " \tset pvp=" . &pvp)
+ call <SID>AddOption("previewheight", gettext("default height for the preview window"))
+ call append("$", " \tset pvh=" . &pvh)
+ call <SID>AddOption("previewwindow", gettext("identifies the preview window"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>BinOptionL("pvw")
+endif
+call <SID>AddOption("hidden", gettext("don't unload a buffer when no longer shown in a window"))
+call <SID>BinOptionG("hid", &hid)
+call <SID>AddOption("switchbuf", gettext("\"useopen\" and/or \"split\"; which window to use when jumping\nto a buffer"))
+call <SID>OptionG("swb", &swb)
+call <SID>AddOption("splitbelow", gettext("a new window is put below the current one"))
+call <SID>BinOptionG("sb", &sb)
+call <SID>AddOption("splitkeep", gettext("determines scroll behavior for split windows"))
+call <SID>BinOptionG("spk", &spk)
+call <SID>AddOption("splitright", gettext("a new window is put right of the current one"))
+call <SID>BinOptionG("spr", &spr)
+call <SID>AddOption("scrollbind", gettext("this window scrolls together with other bound windows"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("scb")
+call <SID>AddOption("scrollopt", gettext("\"ver\", \"hor\" and/or \"jump\"; list of options for 'scrollbind'"))
+call <SID>OptionG("sbo", &sbo)
+call <SID>AddOption("cursorbind", gettext("this window's cursor moves together with other bound windows"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>BinOptionL("crb")
+if has("terminal")
+ call <SID>AddOption("termwinsize", gettext("size of a terminal window"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("tws")
+ call <SID>AddOption("termwinkey", gettext("key that precedes Vim commands in a terminal window"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("twk")
+ call <SID>AddOption("termwinscroll", gettext("max number of lines to keep for scrollback in a terminal window"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("twsl")
+ if has('win32')
+ call <SID>AddOption("termwintype", gettext("type of pty to use for a terminal window"))
+ call <SID>OptionG("twt", &twt)
+ endif
+ if exists("&winptydll")
+ call <SID>AddOption("winptydll", gettext("name of the winpty dynamic library"))
+ call <SID>OptionG("winptydll", &winptydll)
+ endif
+endif
+
+
+call <SID>Header(gettext("multiple tab pages"))
+call <SID>AddOption("showtabline", gettext("0, 1 or 2; when to use a tab pages line"))
+call append("$", " \tset stal=" . &stal)
+call <SID>AddOption("tabpagemax", gettext("maximum number of tab pages to open for -p and \"tab all\""))
+call append("$", " \tset tpm=" . &tpm)
+call <SID>AddOption("tabline", gettext("custom tab pages line"))
+call <SID>OptionG("tal", &tal)
+if has("gui")
+ call <SID>AddOption("guitablabel", gettext("custom tab page label for the GUI"))
+ call <SID>OptionG("gtl", &gtl)
+ call <SID>AddOption("guitabtooltip", gettext("custom tab page tooltip for the GUI"))
+ call <SID>OptionG("gtt", &gtt)
+endif
+
+
+call <SID>Header(gettext("terminal"))
+call <SID>AddOption("term", gettext("name of the used terminal"))
+call <SID>OptionG("term", &term)
+
+call <SID>AddOption("ttytype", gettext("alias for 'term'"))
+call <SID>OptionG("tty", &tty)
+
+call <SID>AddOption("ttybuiltin", gettext("check built-in termcaps first"))
+call <SID>BinOptionG("tbi", &tbi)
+
+call <SID>AddOption("ttyfast", gettext("terminal connection is fast"))
+call <SID>BinOptionG("tf", &tf)
+
+call <SID>AddOption("xtermcodes", gettext("request terminal key codes when an xterm is detected"))
+call <SID>BinOptionG("xtermcodes", &xtermcodes)
+
+call <SID>AddOption("weirdinvert", gettext("terminal that requires extra redrawing"))
+call <SID>BinOptionG("wiv", &wiv)
+
+call <SID>AddOption("keyprotocol", gettext("what keyboard protocol to use for which terminal"))
+call <SID>OptionG("kpc", &kpc)
+call <SID>AddOption("esckeys", gettext("recognize keys that start with <Esc> in Insert mode"))
+call <SID>BinOptionG("ek", &ek)
+call <SID>AddOption("scrolljump", gettext("minimal number of lines to scroll at a time"))
+call append("$", " \tset sj=" . &sj)
+call <SID>AddOption("ttyscroll", gettext("maximum number of lines to use scrolling instead of redrawing"))
+call append("$", " \tset tsl=" . &tsl)
+if has("gui") || has("win32")
+ call <SID>AddOption("guicursor", gettext("specifies what the cursor looks like in different modes"))
+ call <SID>OptionG("gcr", &gcr)
+endif
+if has("title")
+ let &title = s:old_title
+ call <SID>AddOption("title", gettext("show info in the window title"))
+ call <SID>BinOptionG("title", &title)
+ set notitle
+ call <SID>AddOption("titlelen", gettext("percentage of 'columns' used for the window title"))
+ call append("$", " \tset titlelen=" . &titlelen)
+ call <SID>AddOption("titlestring", gettext("when not empty, string to be used for the window title"))
+ call <SID>OptionG("titlestring", &titlestring)
+ call <SID>AddOption("titleold", gettext("string to restore the title to when exiting Vim"))
+ call <SID>OptionG("titleold", &titleold)
+ let &icon = s:old_icon
+ call <SID>AddOption("icon", gettext("set the text of the icon for this window"))
+ call <SID>BinOptionG("icon", &icon)
+ set noicon
+ call <SID>AddOption("iconstring", gettext("when not empty, text for the icon of this window"))
+ call <SID>OptionG("iconstring", &iconstring)
+endif
+if has("win32")
+ call <SID>AddOption("restorescreen", gettext("restore the screen contents when exiting Vim"))
+ call <SID>BinOptionG("rs", &rs)
+endif
+
+
+call <SID>Header(gettext("using the mouse"))
+call <SID>AddOption("mouse", gettext("list of flags for using the mouse"))
+call <SID>OptionG("mouse", &mouse)
+if has("gui")
+ call <SID>AddOption("mousefocus", gettext("the window with the mouse pointer becomes the current one"))
+ call <SID>BinOptionG("mousef", &mousef)
+endif
+call <SID>AddOption("scrollfocus", gettext("the window with the mouse pointer scrolls with the mouse wheel"))
+call <SID>BinOptionG("scf", &scf)
+if has("gui")
+ call <SID>AddOption("mousehide", gettext("hide the mouse pointer while typing"))
+ call <SID>BinOptionG("mh", &mh)
+ call <SID>AddOption("mousemoveevent", gettext("report mouse movement events"))
+ call <SID>BinOptionG("mousemev", &mousemev)
+endif
+call <SID>AddOption("mousemodel", gettext("\"extend\", \"popup\" or \"popup_setpos\"; what the right\nmouse button is used for"))
+call <SID>OptionG("mousem", &mousem)
+call <SID>AddOption("mousetime", gettext("maximum time in msec to recognize a double-click"))
+call append("$", " \tset mouset=" . &mouset)
+call <SID>AddOption("ttymouse", gettext("\"xterm\", \"xterm2\", \"sgr\", etc.; type of mouse"))
+call <SID>OptionG("ttym", &ttym)
+if has("mouseshape")
+ call <SID>AddOption("mouseshape", gettext("what the mouse pointer looks like in different modes"))
+ call <SID>OptionG("mouses", &mouses)
+endif
+
+
+if has("gui")
+ call <SID>Header(gettext("GUI"))
+ call <SID>AddOption("guifont", gettext("list of font names to be used in the GUI"))
+ call <SID>OptionG("gfn", &gfn)
+ if has("xfontset")
+ call <SID>AddOption("guifontset", gettext("pair of fonts to be used, for multibyte editing"))
+ call <SID>OptionG("gfs", &gfs)
+ endif
+ call <SID>AddOption("guifontwide", gettext("list of font names to be used for double-wide characters"))
+ call <SID>OptionG("gfw", &gfw)
+ if has("mac")
+ call <SID>AddOption("antialias", gettext("use smooth, antialiased fonts"))
+ call <SID>BinOptionG("anti", &anti)
+ endif
+ call <SID>AddOption("guioptions", gettext("list of flags that specify how the GUI works"))
+ call <SID>OptionG("go", &go)
+ if has("gui_gtk")
+ call <SID>AddOption("toolbar", gettext("\"icons\", \"text\" and/or \"tooltips\"; how to show the toolbar"))
+ call <SID>OptionG("tb", &tb)
+ if has("gui_gtk2")
+ call <SID>AddOption("toolbariconsize", gettext("size of toolbar icons"))
+ call <SID>OptionG("tbis", &tbis)
+ endif
+ call <SID>AddOption("guiheadroom", gettext("room (in pixels) left above/below the window"))
+ call append("$", " \tset ghr=" . &ghr)
+ call <SID>AddOption("guiligatures", gettext("list of ASCII characters that can be combined into complex shapes"))
+ call <SID>OptionG("gli", &gli)
+ endif
+ if has("directx")
+ call <SID>AddOption("renderoptions", gettext("options for text rendering"))
+ call <SID>OptionG("rop", &rop)
+ endif
+ call <SID>AddOption("guipty", gettext("use a pseudo-tty for I/O to external commands"))
+ call <SID>BinOptionG("guipty", &guipty)
+ if has("browse")
+ call <SID>AddOption("browsedir", gettext("\"last\", \"buffer\" or \"current\": which directory used for the file browser"))
+ call <SID>OptionG("bsdir", &bsdir)
+ endif
+ if has("multi_lang")
+ call <SID>AddOption("langmenu", gettext("language to be used for the menus"))
+ call <SID>OptionG("langmenu", &lm)
+ endif
+ call <SID>AddOption("menuitems", gettext("maximum number of items in one menu"))
+ call append("$", " \tset mis=" . &mis)
+ if has("winaltkeys")
+ call <SID>AddOption("winaltkeys", gettext("\"no\", \"yes\" or \"menu\"; how to use the ALT key"))
+ call <SID>OptionG("wak", &wak)
+ endif
+ call <SID>AddOption("linespace", gettext("number of pixel lines to use between characters"))
+ call append("$", " \tset lsp=" . &lsp)
+ if has("balloon_eval") || has("balloon_eval_term")
+ call <SID>AddOption("balloondelay", gettext("delay in milliseconds before a balloon may pop up"))
+ call append("$", " \tset bdlay=" . &bdlay)
+ if has("balloon_eval")
+ call <SID>AddOption("ballooneval", gettext("use balloon evaluation in the GUI"))
+ call <SID>BinOptionG("beval", &beval)
+ endif
+ if has("balloon_eval_term")
+ call <SID>AddOption("balloonevalterm", gettext("use balloon evaluation in the terminal"))
+ call <SID>BinOptionG("bevalterm", &beval)
+ endif
+ if has("eval")
+ call <SID>AddOption("balloonexpr", gettext("expression to show in balloon eval"))
+ call append("$", " \tset bexpr=" . &bexpr)
+ endif
+ endif
+endif
+
+if has("printer")
+ call <SID>Header(gettext("printing"))
+ call <SID>AddOption("printoptions", gettext("list of items that control the format of :hardcopy output"))
+ call <SID>OptionG("popt", &popt)
+ call <SID>AddOption("printdevice", gettext("name of the printer to be used for :hardcopy"))
+ call <SID>OptionG("pdev", &pdev)
+ if has("postscript")
+ call <SID>AddOption("printexpr", gettext("expression used to print the PostScript file for :hardcopy"))
+ call <SID>OptionG("pexpr", &pexpr)
+ endif
+ call <SID>AddOption("printfont", gettext("name of the font to be used for :hardcopy"))
+ call <SID>OptionG("pfn", &pfn)
+ call <SID>AddOption("printheader", gettext("format of the header used for :hardcopy"))
+ call <SID>OptionG("pheader", &pheader)
+ if has("postscript")
+ call <SID>AddOption("printencoding", gettext("encoding used to print the PostScript file for :hardcopy"))
+ call <SID>OptionG("penc", &penc)
+ endif
+ call <SID>AddOption("printmbcharset", gettext("the CJK character set to be used for CJK output from :hardcopy"))
+ call <SID>OptionG("pmbcs", &pmbcs)
+ call <SID>AddOption("printmbfont", gettext("list of font names to be used for CJK output from :hardcopy"))
+ call <SID>OptionG("pmbfn", &pmbfn)
+endif
+
+call <SID>Header(gettext("messages and info"))
+call <SID>AddOption("terse", gettext("add 's' flag in 'shortmess' (don't show search message)"))
+call <SID>BinOptionG("terse", &terse)
+call <SID>AddOption("shortmess", gettext("list of flags to make messages shorter"))
+call <SID>OptionG("shm", &shm)
+call <SID>AddOption("showcmd", gettext("show (partial) command keys in location given by 'showcmdloc'"))
+let &sc = s:old_sc
+call <SID>BinOptionG("sc", &sc)
+set nosc
+call <SID>AddOption("showcmdloc", gettext("location where to show the (partial) command keys for 'showcmd'"))
+ call <SID>OptionG("sloc", &sloc)
+call <SID>AddOption("showmode", gettext("display the current mode in the status line"))
+call <SID>BinOptionG("smd", &smd)
+call <SID>AddOption("ruler", gettext("show cursor position below each window"))
+let &ru = s:old_ru
+call <SID>BinOptionG("ru", &ru)
+set noru
+if has("statusline")
+ call <SID>AddOption("rulerformat", gettext("alternate format to be used for the ruler"))
+ call <SID>OptionG("ruf", &ruf)
+endif
+call <SID>AddOption("report", gettext("threshold for reporting number of changed lines"))
+call append("$", " \tset report=" . &report)
+call <SID>AddOption("verbose", gettext("the higher the more messages are given"))
+call append("$", " \tset vbs=" . &vbs)
+call <SID>AddOption("verbosefile", gettext("file to write messages in"))
+call <SID>OptionG("vfile", &vfile)
+call <SID>AddOption("more", gettext("pause listings when the screen is full"))
+call <SID>BinOptionG("more", &more)
+if has("dialog_con") || has("dialog_gui")
+ call <SID>AddOption("confirm", gettext("start a dialog when a command fails"))
+ call <SID>BinOptionG("cf", &cf)
+endif
+call <SID>AddOption("errorbells", gettext("ring the bell for error messages"))
+call <SID>BinOptionG("eb", &eb)
+call <SID>AddOption("visualbell", gettext("use a visual bell instead of beeping"))
+call <SID>BinOptionG("vb", &vb)
+call <SID>AddOption("belloff", gettext("do not ring the bell for these reasons"))
+call <SID>OptionG("belloff", &belloff)
+if has("multi_lang")
+ call <SID>AddOption("helplang", gettext("list of preferred languages for finding help"))
+ call <SID>OptionG("hlg", &hlg)
+endif
+
+
+call <SID>Header(gettext("selecting text"))
+call <SID>AddOption("selection", gettext("\"old\", \"inclusive\" or \"exclusive\"; how selecting text behaves"))
+call <SID>OptionG("sel", &sel)
+call <SID>AddOption("selectmode", gettext("\"mouse\", \"key\" and/or \"cmd\"; when to start Select mode\ninstead of Visual mode"))
+call <SID>OptionG("slm", &slm)
+if has("clipboard")
+ call <SID>AddOption("clipboard", gettext("\"unnamed\" to use the * register like unnamed register\n\"autoselect\" to always put selected text on the clipboard"))
+ call <SID>OptionG("cb", &cb)
+endif
+call <SID>AddOption("keymodel", gettext("\"startsel\" and/or \"stopsel\"; what special keys can do"))
+call <SID>OptionG("km", &km)
+
+
+call <SID>Header(gettext("editing text"))
+call <SID>AddOption("undolevels", gettext("maximum number of changes that can be undone"))
+call append("$", "\t" .. s:global_or_local)
+call append("$", " \tset ul=" . s:old_ul)
+call <SID>AddOption("undofile", gettext("automatically save and restore undo history"))
+call <SID>BinOptionG("udf", &udf)
+call <SID>AddOption("undodir", gettext("list of directories for undo files"))
+call <SID>OptionG("udir", &udir)
+call <SID>AddOption("undoreload", gettext("maximum number lines to save for undo on a buffer reload"))
+call append("$", " \tset ur=" . &ur)
+call <SID>AddOption("modified", gettext("changes have been made and not written to a file"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("mod")
+call <SID>AddOption("readonly", gettext("buffer is not to be written"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("ro")
+call <SID>AddOption("modifiable", gettext("changes to the text are possible"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("ma")
+call <SID>AddOption("textwidth", gettext("line length above which to break a line"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("tw")
+call <SID>AddOption("wrapmargin", gettext("margin from the right in which to break a line"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("wm")
+call <SID>AddOption("backspace", gettext("specifies what <BS>, CTRL-W, etc. can do in Insert mode"))
+call append("$", " \tset bs=" . &bs)
+call <SID>AddOption("comments", gettext("definition of what comment lines look like"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("com")
+call <SID>AddOption("formatoptions", gettext("list of flags that tell how automatic formatting works"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("fo")
+call <SID>AddOption("formatlistpat", gettext("pattern to recognize a numbered list"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("flp")
+if has("eval")
+ call <SID>AddOption("formatexpr", gettext("expression used for \"gq\" to format lines"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("fex")
+endif
+if has("insert_expand")
+ call <SID>AddOption("complete", gettext("specifies how Insert mode completion works for CTRL-N and CTRL-P"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("cpt")
+ call <SID>AddOption("completeopt", gettext("whether to use a popup menu for Insert mode completion"))
+ call <SID>OptionG("cot", &cot)
+ if exists("+completepopup")
+ call <SID>AddOption("completepopup", gettext("options for the Insert mode completion info popup"))
+ call <SID>OptionG("cpp", &cpp)
+ endif
+ call <SID>AddOption("pumheight", gettext("maximum height of the popup menu"))
+ call <SID>OptionG("ph", &ph)
+ call <SID>AddOption("pumwidth", gettext("minimum width of the popup menu"))
+ call <SID>OptionG("pw", &pw)
+ call <SID>AddOption("completefunc", gettext("user defined function for Insert mode completion"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("cfu")
+ call <SID>AddOption("omnifunc", gettext("function for filetype-specific Insert mode completion"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("ofu")
+ call <SID>AddOption("dictionary", gettext("list of dictionary files for keyword completion"))
+ call append("$", "\t" .. s:global_or_local)
+ call <SID>OptionG("dict", &dict)
+ call <SID>AddOption("thesaurus", gettext("list of thesaurus files for keyword completion"))
+ call append("$", "\t" .. s:global_or_local)
+ call <SID>OptionG("tsr", &tsr)
+ call <SID>AddOption("thesaurusfunc", gettext("function used for thesaurus completion"))
+ call append("$", "\t" .. s:global_or_local)
+ call <SID>OptionG("tsrfu", &tsrfu)
+endif
+call <SID>AddOption("infercase", gettext("adjust case of a keyword completion match"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("inf")
+if has("digraphs")
+ call <SID>AddOption("digraph", gettext("enable entering digraphs with c1 <BS> c2"))
+ call <SID>BinOptionG("dg", &dg)
+endif
+call <SID>AddOption("tildeop", gettext("the \"~\" command behaves like an operator"))
+call <SID>BinOptionG("top", &top)
+call <SID>AddOption("operatorfunc", gettext("function called for the \"g@\" operator"))
+call <SID>OptionG("opfunc", &opfunc)
+call <SID>AddOption("showmatch", gettext("when inserting a bracket, briefly jump to its match"))
+call <SID>BinOptionG("sm", &sm)
+call <SID>AddOption("matchtime", gettext("tenth of a second to show a match for 'showmatch'"))
+call append("$", " \tset mat=" . &mat)
+call <SID>AddOption("matchpairs", gettext("list of pairs that match for the \"%\" command"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("mps")
+call <SID>AddOption("joinspaces", gettext("use two spaces after '.' when joining a line"))
+call <SID>BinOptionG("js", &js)
+call <SID>AddOption("nrformats", gettext("\"alpha\", \"octal\", \"hex\", \"bin\" and/or \"unsigned\"; number formats\nrecognized for CTRL-A and CTRL-X commands"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("nf")
+
+
+call <SID>Header(gettext("tabs and indenting"))
+call <SID>AddOption("tabstop", gettext("number of spaces a <Tab> in the text stands for"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("ts")
+call <SID>AddOption("shiftwidth", gettext("number of spaces used for each step of (auto)indent"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("sw")
+if has("vartabs")
+ call <SID>AddOption("vartabstop", gettext("list of number of spaces a tab counts for"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("vts")
+ call <SID>AddOption("varsofttabstop", gettext("list of number of spaces a soft tabsstop counts for"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("vsts")
+endif
+call <SID>AddOption("smarttab", gettext("a <Tab> in an indent inserts 'shiftwidth' spaces"))
+call <SID>BinOptionG("sta", &sta)
+call <SID>AddOption("softtabstop", gettext("if non-zero, number of spaces to insert for a <Tab>"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("sts")
+call <SID>AddOption("shiftround", gettext("round to 'shiftwidth' for \"<<\" and \">>\""))
+call <SID>BinOptionG("sr", &sr)
+call <SID>AddOption("expandtab", gettext("expand <Tab> to spaces in Insert mode"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("et")
+call <SID>AddOption("autoindent", gettext("automatically set the indent of a new line"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("ai")
+if has("smartindent")
+ call <SID>AddOption("smartindent", gettext("do clever autoindenting"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>BinOptionL("si")
+endif
+if has("cindent")
+ call <SID>AddOption("cindent", gettext("enable specific indenting for C code"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>BinOptionL("cin")
+ call <SID>AddOption("cinoptions", gettext("options for C-indenting"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("cino")
+ call <SID>AddOption("cinkeys", gettext("keys that trigger C-indenting in Insert mode"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("cink")
+ call <SID>AddOption("cinwords", gettext("list of words that cause more C-indent"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("cinw")
+ call <SID>AddOption("cinscopedecls", gettext("list of scope declaration names used by cino-g"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("cinsd")
+ call <SID>AddOption("indentexpr", gettext("expression used to obtain the indent of a line"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("inde")
+ call <SID>AddOption("indentkeys", gettext("keys that trigger indenting with 'indentexpr' in Insert mode"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("indk")
+endif
+call <SID>AddOption("copyindent", gettext("copy whitespace for indenting from previous line"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("ci")
+call <SID>AddOption("preserveindent", gettext("preserve kind of whitespace when changing indent"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("pi")
+if has("lispindent")
+ call <SID>AddOption("lisp", gettext("enable lisp mode"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>BinOptionL("lisp")
+ call <SID>AddOption("lispwords", gettext("words that change how lisp indenting works"))
+ call <SID>OptionL("lw")
+ call <SID>AddOption("lispoptions", gettext("options for Lisp indenting"))
+ call <SID>OptionL("lop")
+endif
+
+
+if has("folding")
+ call <SID>Header(gettext("folding"))
+ call <SID>AddOption("foldenable", gettext("unset to display all folds open"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>BinOptionL("fen")
+ call <SID>AddOption("foldlevel", gettext("folds with a level higher than this number will be closed"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("fdl")
+ call <SID>AddOption("foldlevelstart", gettext("value for 'foldlevel' when starting to edit a file"))
+ call append("$", " \tset fdls=" . &fdls)
+ call <SID>AddOption("foldcolumn", gettext("width of the column used to indicate folds"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("fdc")
+ call <SID>AddOption("foldtext", gettext("expression used to display the text of a closed fold"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("fdt")
+ call <SID>AddOption("foldclose", gettext("set to \"all\" to close a fold when the cursor leaves it"))
+ call <SID>OptionG("fcl", &fcl)
+ call <SID>AddOption("foldopen", gettext("specifies for which commands a fold will be opened"))
+ call <SID>OptionG("fdo", &fdo)
+ call <SID>AddOption("foldminlines", gettext("minimum number of screen lines for a fold to be closed"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("fml")
+ call <SID>AddOption("commentstring", gettext("template for comments; used to put the marker in"))
+ call <SID>OptionL("cms")
+ call <SID>AddOption("foldmethod", gettext("folding type: \"manual\", \"indent\", \"expr\", \"marker\",\n\"syntax\" or \"diff\""))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("fdm")
+ call <SID>AddOption("foldexpr", gettext("expression used when 'foldmethod' is \"expr\""))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("fde")
+ call <SID>AddOption("foldignore", gettext("used to ignore lines when 'foldmethod' is \"indent\""))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("fdi")
+ call <SID>AddOption("foldmarker", gettext("markers used when 'foldmethod' is \"marker\""))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("fmr")
+ call <SID>AddOption("foldnestmax", gettext("maximum fold depth for when 'foldmethod' is \"indent\" or \"syntax\""))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("fdn")
+endif
+
+
+if has("diff")
+ call <SID>Header(gettext("diff mode"))
+ call <SID>AddOption("diff", gettext("use diff mode for the current window"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>BinOptionL("diff")
+ call <SID>AddOption("diffopt", gettext("options for using diff mode"))
+ call <SID>OptionG("dip", &dip)
+ call <SID>AddOption("diffexpr", gettext("expression used to obtain a diff file"))
+ call <SID>OptionG("dex", &dex)
+ call <SID>AddOption("patchexpr", gettext("expression used to patch a file"))
+ call <SID>OptionG("pex", &pex)
+endif
+
+
+call <SID>Header(gettext("mapping"))
+call <SID>AddOption("maxmapdepth", gettext("maximum depth of mapping"))
+call append("$", " \tset mmd=" . &mmd)
+call <SID>AddOption("remap", gettext("recognize mappings in mapped keys"))
+call <SID>BinOptionG("remap", &remap)
+call <SID>AddOption("timeout", gettext("allow timing out halfway into a mapping"))
+call <SID>BinOptionG("to", &to)
+call <SID>AddOption("ttimeout", gettext("allow timing out halfway into a key code"))
+call <SID>BinOptionG("ttimeout", &ttimeout)
+call <SID>AddOption("timeoutlen", gettext("time in msec for 'timeout'"))
+call append("$", " \tset tm=" . &tm)
+call <SID>AddOption("ttimeoutlen", gettext("time in msec for 'ttimeout'"))
+call append("$", " \tset ttm=" . &ttm)
+
+
+call <SID>Header(gettext("reading and writing files"))
+call <SID>AddOption("modeline", gettext("enable using settings from modelines when reading a file"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("ml")
+call <SID>AddOption("modelineexpr", gettext("allow setting expression options from a modeline"))
+call <SID>BinOptionG("mle", &mle)
+call <SID>AddOption("modelines", gettext("number of lines to check for modelines"))
+call append("$", " \tset mls=" . &mls)
+call <SID>AddOption("binary", gettext("binary file editing"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("bin")
+call <SID>AddOption("endofline", gettext("last line in the file has an end-of-line"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("eol")
+call <SID>AddOption("endoffile", gettext("last line in the file followed by CTRL-Z"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("eof")
+call <SID>AddOption("fixendofline", gettext("fixes missing end-of-line at end of text file"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("fixeol")
+call <SID>AddOption("bomb", gettext("prepend a Byte Order Mark to the file"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("bomb")
+call <SID>AddOption("fileformat", gettext("end-of-line format: \"dos\", \"unix\" or \"mac\""))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("ff")
+call <SID>AddOption("fileformats", gettext("list of file formats to look for when editing a file"))
+call <SID>OptionG("ffs", &ffs)
+call <SID>AddOption("textmode", gettext("obsolete, use 'fileformat'"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("tx")
+call <SID>AddOption("textauto", gettext("obsolete, use 'fileformats'"))
+call <SID>BinOptionG("ta", &ta)
+call <SID>AddOption("write", gettext("writing files is allowed"))
+call <SID>BinOptionG("write", &write)
+call <SID>AddOption("writebackup", gettext("write a backup file before overwriting a file"))
+call <SID>BinOptionG("wb", &wb)
+call <SID>AddOption("backup", gettext("keep a backup after overwriting a file"))
+call <SID>BinOptionG("bk", &bk)
+call <SID>AddOption("backupskip", gettext("patterns that specify for which files a backup is not made"))
+call append("$", " \tset bsk=" . &bsk)
+call <SID>AddOption("backupcopy", gettext("whether to make the backup as a copy or rename the existing file"))
+call append("$", "\t" .. s:global_or_local)
+call append("$", " \tset bkc=" . &bkc)
+call <SID>AddOption("backupdir", gettext("list of directories to put backup files in"))
+call <SID>OptionG("bdir", &bdir)
+call <SID>AddOption("backupext", gettext("file name extension for the backup file"))
+call <SID>OptionG("bex", &bex)
+call <SID>AddOption("autowrite", gettext("automatically write a file when leaving a modified buffer"))
+call <SID>BinOptionG("aw", &aw)
+call <SID>AddOption("autowriteall", gettext("as 'autowrite', but works with more commands"))
+call <SID>BinOptionG("awa", &awa)
+call <SID>AddOption("writeany", gettext("always write without asking for confirmation"))
+call <SID>BinOptionG("wa", &wa)
+call <SID>AddOption("autoread", gettext("automatically read a file when it was modified outside of Vim"))
+call append("$", "\t" .. s:global_or_local)
+call <SID>BinOptionG("ar", &ar)
+call <SID>AddOption("patchmode", gettext("keep oldest version of a file; specifies file name extension"))
+call <SID>OptionG("pm", &pm)
+call <SID>AddOption("fsync", gettext("forcibly sync the file to disk after writing it"))
+call <SID>BinOptionG("fs", &fs)
+call <SID>AddOption("shortname", gettext("use 8.3 file names"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("sn")
+call <SID>AddOption("cryptmethod", gettext("encryption method for file writing: zip, blowfish or blowfish2"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("cm")
+
+
+call <SID>Header(gettext("the swap file"))
+call <SID>AddOption("directory", gettext("list of directories for the swap file"))
+call <SID>OptionG("dir", &dir)
+call <SID>AddOption("swapfile", gettext("use a swap file for this buffer"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("swf")
+call <SID>AddOption("swapsync", gettext("\"sync\", \"fsync\" or empty; how to flush a swap file to disk"))
+call <SID>OptionG("sws", &sws)
+call <SID>AddOption("updatecount", gettext("number of characters typed to cause a swap file update"))
+call append("$", " \tset uc=" . &uc)
+call <SID>AddOption("updatetime", gettext("time in msec after which the swap file will be updated"))
+call append("$", " \tset ut=" . &ut)
+call <SID>AddOption("maxmem", gettext("maximum amount of memory in Kbyte used for one buffer"))
+call append("$", " \tset mm=" . &mm)
+call <SID>AddOption("maxmemtot", gettext("maximum amount of memory in Kbyte used for all buffers"))
+call append("$", " \tset mmt=" . &mmt)
+
+
+call <SID>Header(gettext("command line editing"))
+call <SID>AddOption("history", gettext("how many command lines are remembered"))
+call append("$", " \tset hi=" . &hi)
+call <SID>AddOption("wildchar", gettext("key that triggers command-line expansion"))
+call append("$", " \tset wc=" . &wc)
+call <SID>AddOption("wildcharm", gettext("like 'wildchar' but can also be used in a mapping"))
+call append("$", " \tset wcm=" . &wcm)
+call <SID>AddOption("wildmode", gettext("specifies how command line completion works"))
+call <SID>OptionG("wim", &wim)
+if has("wildoptions")
+ call <SID>AddOption("wildoptions", gettext("empty or \"tagfile\" to list file name of matching tags"))
+ call <SID>OptionG("wop", &wop)
+endif
+call <SID>AddOption("suffixes", gettext("list of file name extensions that have a lower priority"))
+call <SID>OptionG("su", &su)
+if has("file_in_path")
+ call <SID>AddOption("suffixesadd", gettext("list of file name extensions added when searching for a file"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("sua")
+endif
+if has("wildignore")
+ call <SID>AddOption("wildignore", gettext("list of patterns to ignore files for file name completion"))
+ call <SID>OptionG("wig", &wig)
+endif
+call <SID>AddOption("fileignorecase", gettext("ignore case when using file names"))
+call <SID>BinOptionG("fic", &fic)
+call <SID>AddOption("wildignorecase", gettext("ignore case when completing file names"))
+call <SID>BinOptionG("wic", &wic)
+if has("wildmenu")
+ call <SID>AddOption("wildmenu", gettext("command-line completion shows a list of matches"))
+ call <SID>BinOptionG("wmnu", &wmnu)
+endif
+call <SID>AddOption("cedit", gettext("key used to open the command-line window"))
+call <SID>OptionG("cedit", &cedit)
+call <SID>AddOption("cmdwinheight", gettext("height of the command-line window"))
+call <SID>OptionG("cwh", &cwh)
+
+
+call <SID>Header(gettext("executing external commands"))
+call <SID>AddOption("shell", gettext("name of the shell program used for external commands"))
+call <SID>OptionG("sh", &sh)
+if has("amiga")
+ call <SID>AddOption("shelltype", gettext("when to use the shell or directly execute a command"))
+ call append("$", " \tset st=" . &st)
+endif
+call <SID>AddOption("shellquote", gettext("character(s) to enclose a shell command in"))
+call <SID>OptionG("shq", &shq)
+call <SID>AddOption("shellxquote", gettext("like 'shellquote' but include the redirection"))
+call <SID>OptionG("sxq", &sxq)
+call <SID>AddOption("shellxescape", gettext("characters to escape when 'shellxquote' is ("))
+call <SID>OptionG("sxe", &sxe)
+call <SID>AddOption("shellcmdflag", gettext("argument for 'shell' to execute a command"))
+call <SID>OptionG("shcf", &shcf)
+call <SID>AddOption("shellredir", gettext("used to redirect command output to a file"))
+call <SID>OptionG("srr", &srr)
+call <SID>AddOption("shelltemp", gettext("use a temp file for shell commands instead of using a pipe"))
+call <SID>BinOptionG("stmp", &stmp)
+call <SID>AddOption("equalprg", gettext("program used for \"=\" command"))
+call append("$", "\t" .. s:global_or_local)
+call <SID>OptionG("ep", &ep)
+call <SID>AddOption("formatprg", gettext("program used to format lines with \"gq\" command"))
+call <SID>OptionG("fp", &fp)
+call <SID>AddOption("keywordprg", gettext("program used for the \"K\" command"))
+call <SID>OptionG("kp", &kp)
+call <SID>AddOption("warn", gettext("warn when using a shell command and a buffer has changes"))
+call <SID>BinOptionG("warn", &warn)
+
+
+if has("quickfix")
+ call <SID>Header(gettext("running make and jumping to errors (quickfix)"))
+ call <SID>AddOption("errorfile", gettext("name of the file that contains error messages"))
+ call <SID>OptionG("ef", &ef)
+ call <SID>AddOption("errorformat", gettext("list of formats for error messages"))
+ call append("$", "\t" .. s:global_or_local)
+ call <SID>OptionG("efm", &efm)
+ call <SID>AddOption("makeprg", gettext("program used for the \":make\" command"))
+ call append("$", "\t" .. s:global_or_local)
+ call <SID>OptionG("mp", &mp)
+ call <SID>AddOption("shellpipe", gettext("string used to put the output of \":make\" in the error file"))
+ call <SID>OptionG("sp", &sp)
+ call <SID>AddOption("makeef", gettext("name of the errorfile for the 'makeprg' command"))
+ call <SID>OptionG("mef", &mef)
+ call <SID>AddOption("grepprg", gettext("program used for the \":grep\" command"))
+ call append("$", "\t" .. s:global_or_local)
+ call <SID>OptionG("gp", &gp)
+ call <SID>AddOption("grepformat", gettext("list of formats for output of 'grepprg'"))
+ call <SID>OptionG("gfm", &gfm)
+ call <SID>AddOption("makeencoding", gettext("encoding of the \":make\" and \":grep\" output"))
+ call append("$", "\t" .. s:global_or_local)
+ call <SID>OptionG("menc", &menc)
+ call <SID>AddOption("quickfixtextfunc", gettext("function to display text in the quickfix window"))
+ call <SID>OptionG("qftf", &qftf)
+endif
+
+
+if has("win32")
+ call <SID>Header(gettext("system specific"))
+ call <SID>AddOption("shellslash", gettext("use forward slashes in file names; for Unix-like shells"))
+ call <SID>BinOptionG("ssl", &ssl)
+ call <SID>AddOption("completeslash", gettext("specifies slash/backslash used for completion"))
+ call <SID>OptionG("csl", &csl)
+endif
+
+
+call <SID>Header(gettext("language specific"))
+call <SID>AddOption("isfname", gettext("specifies the characters in a file name"))
+call <SID>OptionG("isf", &isf)
+call <SID>AddOption("isident", gettext("specifies the characters in an identifier"))
+call <SID>OptionG("isi", &isi)
+call <SID>AddOption("iskeyword", gettext("specifies the characters in a keyword"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("isk")
+call <SID>AddOption("isprint", gettext("specifies printable characters"))
+call <SID>OptionG("isp", &isp)
+if has("textobjects")
+ call <SID>AddOption("quoteescape", gettext("specifies escape characters in a string"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("qe")
+endif
+if has("rightleft")
+ call <SID>AddOption("rightleft", gettext("display the buffer right-to-left"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>BinOptionL("rl")
+ call <SID>AddOption("rightleftcmd", gettext("when to edit the command-line right-to-left"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("rlc")
+ call <SID>AddOption("revins", gettext("insert characters backwards"))
+ call <SID>BinOptionG("ri", &ri)
+ call <SID>AddOption("allowrevins", gettext("allow CTRL-_ in Insert and Command-line mode to toggle 'revins'"))
+ call <SID>BinOptionG("ari", &ari)
+ call <SID>AddOption("aleph", gettext("the ASCII code for the first letter of the Hebrew alphabet"))
+ call append("$", " \tset al=" . &al)
+ call <SID>AddOption("hkmap", gettext("use Hebrew keyboard mapping"))
+ call <SID>BinOptionG("hk", &hk)
+ call <SID>AddOption("hkmapp", gettext("use phonetic Hebrew keyboard mapping"))
+ call <SID>BinOptionG("hkp", &hkp)
+endif
+if has("arabic")
+ call <SID>AddOption("arabic", gettext("prepare for editing Arabic text"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>BinOptionL("arab")
+ call <SID>AddOption("arabicshape", gettext("perform shaping of Arabic characters"))
+ call <SID>BinOptionG("arshape", &arshape)
+ call <SID>AddOption("termbidi", gettext("terminal will perform bidi handling"))
+ call <SID>BinOptionG("tbidi", &tbidi)
+endif
+if has("keymap")
+ call <SID>AddOption("keymap", gettext("name of a keyboard mapping"))
+ call <SID>OptionL("kmp")
+endif
+if has("langmap")
+ call <SID>AddOption("langmap", gettext("list of characters that are translated in Normal mode"))
+ call <SID>OptionG("lmap", &lmap)
+ call <SID>AddOption("langremap", gettext("apply 'langmap' to mapped characters"))
+ call <SID>BinOptionG("lrm", &lrm)
+endif
+if has("xim")
+ call <SID>AddOption("imdisable", gettext("when set never use IM; overrules following IM options"))
+ call <SID>BinOptionG("imd", &imd)
+endif
+call <SID>AddOption("iminsert", gettext("in Insert mode: 1: use :lmap; 2: use IM; 0: neither"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>OptionL("imi")
+call <SID>AddOption("imstyle", gettext("input method style, 0: on-the-spot, 1: over-the-spot"))
+call <SID>OptionG("imst", &imst)
+call <SID>AddOption("imsearch", gettext("entering a search pattern: 1: use :lmap; 2: use IM; 0: neither"))
+call append("$", "\t" .. s:local_to_window)
+call <SID>OptionL("ims")
+if has("xim")
+ call <SID>AddOption("imcmdline", gettext("when set always use IM when starting to edit a command line"))
+ call <SID>BinOptionG("imc", &imc)
+ call <SID>AddOption("imstatusfunc", gettext("function to obtain IME status"))
+ call <SID>OptionG("imsf", &imsf)
+ call <SID>AddOption("imactivatefunc", gettext("function to enable/disable IME"))
+ call <SID>OptionG("imaf", &imaf)
+endif
+
+
+call <SID>Header(gettext("multi-byte characters"))
+call <SID>AddOption("encoding", gettext("character encoding used in Vim: \"latin1\", \"utf-8\",\n\"euc-jp\", \"big5\", etc."))
+call <SID>OptionG("enc", &enc)
+call <SID>AddOption("fileencoding", gettext("character encoding for the current file"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>OptionL("fenc")
+call <SID>AddOption("fileencodings", gettext("automatically detected character encodings"))
+call <SID>OptionG("fencs", &fencs)
+call <SID>AddOption("termencoding", gettext("character encoding used by the terminal"))
+call <SID>OptionG("tenc", &tenc)
+call <SID>AddOption("charconvert", gettext("expression used for character encoding conversion"))
+call <SID>OptionG("ccv", &ccv)
+call <SID>AddOption("delcombine", gettext("delete combining (composing) characters on their own"))
+call <SID>BinOptionG("deco", &deco)
+call <SID>AddOption("maxcombine", gettext("maximum number of combining (composing) characters displayed"))
+call <SID>OptionG("mco", &mco)
+if has("xim") && has("gui_gtk")
+ call <SID>AddOption("imactivatekey", gettext("key that activates the X input method"))
+ call <SID>OptionG("imak", &imak)
+endif
+call <SID>AddOption("ambiwidth", gettext("width of ambiguous width characters"))
+call <SID>OptionG("ambw", &ambw)
+call <SID>AddOption("emoji", gettext("emoji characters are full width"))
+call <SID>BinOptionG("emo", &emo)
+
+
+call <SID>Header(gettext("various"))
+call <SID>AddOption("virtualedit", gettext("when to use virtual editing: \"block\", \"insert\", \"all\"\nand/or \"onemore\""))
+call <SID>OptionG("ve", &ve)
+call <SID>AddOption("eventignore", gettext("list of autocommand events which are to be ignored"))
+call <SID>OptionG("ei", &ei)
+call <SID>AddOption("loadplugins", gettext("load plugin scripts when starting up"))
+call <SID>BinOptionG("lpl", &lpl)
+call <SID>AddOption("exrc", gettext("enable reading .vimrc/.exrc/.gvimrc in the current directory"))
+call <SID>BinOptionG("ex", &ex)
+call <SID>AddOption("secure", gettext("safer working with script files in the current directory"))
+call <SID>BinOptionG("secure", &secure)
+call <SID>AddOption("gdefault", gettext("use the 'g' flag for \":substitute\""))
+call <SID>BinOptionG("gd", &gd)
+call <SID>AddOption("edcompatible", gettext("'g' and 'c' flags of \":substitute\" toggle"))
+call <SID>BinOptionG("ed", &ed)
+if exists("+opendevice")
+ call <SID>AddOption("opendevice", gettext("allow reading/writing devices"))
+ call <SID>BinOptionG("odev", &odev)
+endif
+if exists("+maxfuncdepth")
+ call <SID>AddOption("maxfuncdepth", gettext("maximum depth of function calls"))
+ call append("$", " \tset mfd=" . &mfd)
+endif
+if has("mksession")
+ call <SID>AddOption("sessionoptions", gettext("list of words that specifies what to put in a session file"))
+ call <SID>OptionG("ssop", &ssop)
+ call <SID>AddOption("viewoptions", gettext("list of words that specifies what to save for :mkview"))
+ call <SID>OptionG("vop", &vop)
+ call <SID>AddOption("viewdir", gettext("directory where to store files with :mkview"))
+ call <SID>OptionG("vdir", &vdir)
+endif
+if has("viminfo")
+ call <SID>AddOption("viminfo", gettext("list that specifies what to write in the viminfo file"))
+ call <SID>OptionG("vi", &vi)
+ call <SID>AddOption("viminfofile", gettext("file name used for the viminfo file"))
+ call <SID>OptionG("vif", &vif)
+endif
+if has("quickfix")
+ call <SID>AddOption("bufhidden", gettext("what happens with a buffer when it's no longer in a window"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("bh")
+ call <SID>AddOption("buftype", gettext("empty, \"nofile\", \"nowrite\", \"quickfix\", etc.: type of buffer"))
+ call append("$", "\t" .. s:local_to_buffer)
+ call <SID>OptionL("bt")
+endif
+call <SID>AddOption("buflisted", gettext("whether the buffer shows up in the buffer list"))
+call append("$", "\t" .. s:local_to_buffer)
+call <SID>BinOptionL("bl")
+call <SID>AddOption("debug", gettext("set to \"msg\" to see all error messages"))
+call append("$", " \tset debug=" . &debug)
+if has("signs")
+ call <SID>AddOption("signcolumn", gettext("whether to show the signcolumn"))
+ call append("$", "\t" .. s:local_to_window)
+ call <SID>OptionL("scl")
+endif
+if has("mzscheme")
+ call <SID>AddOption("mzquantum", gettext("interval in milliseconds between polls for MzScheme threads"))
+ call append("$", " \tset mzq=" . &mzq)
+endif
+if exists("&luadll")
+ call <SID>AddOption("luadll", gettext("name of the Lua dynamic library"))
+ call <SID>OptionG("luadll", &luadll)
+endif
+if exists("&perldll")
+ call <SID>AddOption("perldll", gettext("name of the Perl dynamic library"))
+ call <SID>OptionG("perldll", &perldll)
+endif
+if has('pythonx')
+ call <SID>AddOption("pyxversion", gettext("whether to use Python 2 or 3"))
+ call append("$", " \tset pyx=" . &wd)
+endif
+if exists("&pythondll")
+ call <SID>AddOption("pythondll", gettext("name of the Python 2 dynamic library"))
+ call <SID>OptionG("pythondll", &pythondll)
+endif
+if exists("&pythonhome")
+ call <SID>AddOption("pythonhome", gettext("name of the Python 2 home directory"))
+ call <SID>OptionG("pythonhome", &pythonhome)
+endif
+if exists("&pythonthreedll")
+ call <SID>AddOption("pythonthreedll", gettext("name of the Python 3 dynamic library"))
+ call <SID>OptionG("pythonthreedll", &pythonthreedll)
+endif
+if exists("&pythonthreehome")
+ call <SID>AddOption("pythonthreehome", gettext("name of the Python 3 home directory"))
+ call <SID>OptionG("pythonthreehome", &pythonthreehome)
+endif
+if exists("&rubydll")
+ call <SID>AddOption("rubydll", gettext("name of the Ruby dynamic library"))
+ call <SID>OptionG("rubydll", &rubydll)
+endif
+if exists("&tcldll")
+ call <SID>AddOption("tcldll", gettext("name of the Tcl dynamic library"))
+ call <SID>OptionG("tcldll", &tcldll)
+endif
+if exists("&mzschemedll")
+ call <SID>AddOption("mzschemedll", gettext("name of the MzScheme dynamic library"))
+ call <SID>OptionG("mzschemedll", &mzschemedll)
+ call <SID>AddOption("mzschemegcdll", gettext("name of the MzScheme GC dynamic library"))
+ call <SID>OptionG("mzschemegcdll", &mzschemegcdll)
+endif
+
+set cpo&vim
+
+" go to first line
+1
+
+" reset 'modified', so that ":q" can be used to close the window
+setlocal nomodified
+
+if has("syntax")
+ " Use Vim highlighting, with some additional stuff
+ setlocal ft=vim
+ syn match optwinHeader "^ \=[0-9].*"
+ syn match optwinName "^[a-z]*\t" nextgroup=optwinComment
+ syn match optwinComment ".*" contained
+ syn match optwinComment "^\t.*"
+ if !exists("did_optwin_syntax_inits")
+ let did_optwin_syntax_inits = 1
+ hi link optwinHeader Title
+ hi link optwinName Identifier
+ hi link optwinComment Comment
+ endif
+endif
+
+" Install autocommands to enable mappings in option-window
+noremap <silent> <buffer> <CR> <C-\><C-N>:call <SID>CR()<CR>
+inoremap <silent> <buffer> <CR> <Esc>:call <SID>CR()<CR>
+noremap <silent> <buffer> <Space> :call <SID>Space()<CR>
+
+" Make the buffer be deleted when the window is closed.
+setlocal buftype=nofile bufhidden=delete noswapfile
+
+augroup optwin
+ au! BufUnload,BufHidden option-window nested
+ \ call <SID>unload() | delfun <SID>unload
+augroup END
+
+func <SID>unload()
+ delfun <SID>CR
+ delfun <SID>Space
+ delfun <SID>Find
+ delfun <SID>Update
+ delfun <SID>OptionL
+ delfun <SID>OptionG
+ delfun <SID>BinOptionL
+ delfun <SID>BinOptionG
+ delfun <SID>Header
+ au! optwin
+endfunc
+
+" Restore the previous value of 'title' and 'icon'.
+let &title = s:old_title
+let &icon = s:old_icon
+let &ru = s:old_ru
+let &sc = s:old_sc
+let &cpo = s:cpo_save
+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 0000000..7a65630
--- /dev/null
+++ b/runtime/pack/dist/opt/cfilter/plugin/cfilter.vim
@@ -0,0 +1,72 @@
+vim9script
+
+# cfilter.vim: Plugin to filter entries from a quickfix/location list
+# Last Change: Jun 30, 2022
+# Maintainer: Yegappan Lakshmanan (yegappan AT yahoo DOT com)
+# Version: 2.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. The pattern can be optionally enclosed using one of
+# the following characters: ', ", /. If the pattern is empty, then the
+# last used search pattern is used.
+# :Lfilter[!] /{pat}/
+# Same as :Cfilter but operates on the current location list.
+#
+
+def Qf_filter(qf: bool, searchpat: string, bang: string)
+ var Xgetlist: func
+ var Xsetlist: func
+ var cmd: string
+ var firstchar: string
+ var lastchar: string
+ var pat: string
+ var title: string
+ var Cond: func
+ var items: list<any>
+
+ if qf
+ Xgetlist = function('getqflist')
+ Xsetlist = function('setqflist')
+ cmd = ':Cfilter' .. bang
+ else
+ Xgetlist = function('getloclist', [0])
+ Xsetlist = function('setloclist', [0])
+ cmd = ':Lfilter' .. bang
+ endif
+
+ firstchar = searchpat[0]
+ lastchar = searchpat[-1 :]
+ if firstchar == lastchar &&
+ (firstchar == '/' || firstchar == '"' || firstchar == "'")
+ pat = searchpat[1 : -2]
+ if pat == ''
+ # Use the last search pattern
+ pat = @/
+ endif
+ else
+ pat = searchpat
+ endif
+
+ if pat == ''
+ return
+ endif
+
+ if bang == '!'
+ Cond = (_, val) => val.text !~# pat && bufname(val.bufnr) !~# pat
+ else
+ Cond = (_, val) => val.text =~# pat || bufname(val.bufnr) =~# pat
+ endif
+
+ items = filter(Xgetlist(), Cond)
+ title = cmd .. ' /' .. pat .. '/'
+ Xsetlist([], ' ', {title: title, items: items})
+enddef
+
+command! -nargs=+ -bang Cfilter Qf_filter(true, <q-args>, <q-bang>)
+command! -nargs=+ -bang Lfilter Qf_filter(false, <q-args>, <q-bang>)
+
+# vim: shiftwidth=2 sts=2 expandtab
diff --git a/runtime/pack/dist/opt/dvorak/dvorak/disable.vim b/runtime/pack/dist/opt/dvorak/dvorak/disable.vim
new file mode 100644
index 0000000..1e9b070
--- /dev/null
+++ b/runtime/pack/dist/opt/dvorak/dvorak/disable.vim
@@ -0,0 +1,72 @@
+" Back to Qwerty keyboard after using Dvorak.
+
+iunmap a
+iunmap b
+iunmap c
+iunmap d
+iunmap e
+iunmap f
+iunmap g
+iunmap h
+iunmap i
+iunmap j
+iunmap k
+iunmap l
+iunmap m
+iunmap n
+iunmap o
+iunmap p
+iunmap q
+iunmap r
+iunmap s
+iunmap t
+iunmap u
+iunmap v
+iunmap w
+iunmap x
+iunmap y
+iunmap z
+iunmap ;
+iunmap '
+iunmap "
+iunmap ,
+iunmap .
+iunmap /
+iunmap A
+iunmap B
+iunmap C
+iunmap D
+iunmap E
+iunmap F
+iunmap G
+iunmap H
+iunmap I
+iunmap J
+iunmap K
+iunmap L
+iunmap M
+iunmap N
+iunmap O
+iunmap P
+iunmap Q
+iunmap R
+iunmap S
+iunmap T
+iunmap U
+iunmap V
+iunmap W
+iunmap X
+iunmap Y
+iunmap Z
+iunmap <
+iunmap >
+iunmap ?
+iunmap :
+iunmap [
+iunmap ]
+iunmap {
+iunmap }
+iunmap -
+iunmap _
+iunmap =
+iunmap +
diff --git a/runtime/pack/dist/opt/dvorak/dvorak/enable.vim b/runtime/pack/dist/opt/dvorak/dvorak/enable.vim
new file mode 100644
index 0000000..8ff363f
--- /dev/null
+++ b/runtime/pack/dist/opt/dvorak/dvorak/enable.vim
@@ -0,0 +1,77 @@
+" Dvorak keyboard, only in Insert mode.
+"
+" Change "inoremap" to "map!" to also use in Ex mode.
+" Also change disable.vim then: "iunmap" to "unmap!".
+"
+" You may want to add a list of map's too.
+
+inoremap a a
+inoremap b x
+inoremap c j
+inoremap d e
+inoremap e .
+inoremap f u
+inoremap g i
+inoremap h d
+inoremap i c
+inoremap j h
+inoremap k t
+inoremap l n
+inoremap m m
+inoremap n b
+inoremap o r
+inoremap p l
+inoremap q '
+inoremap r p
+inoremap s o
+inoremap t y
+inoremap u g
+inoremap v k
+inoremap w ,
+inoremap x q
+inoremap y f
+inoremap z ;
+inoremap ; s
+inoremap ' -
+inoremap " _
+inoremap , w
+inoremap . v
+inoremap / z
+inoremap A A
+inoremap B X
+inoremap C J
+inoremap D E
+inoremap E >
+inoremap F U
+inoremap G I
+inoremap H D
+inoremap I C
+inoremap J H
+inoremap K T
+inoremap L N
+inoremap M M
+inoremap N B
+inoremap O R
+inoremap P L
+inoremap Q "
+inoremap R P
+inoremap S O
+inoremap T Y
+inoremap U G
+inoremap V K
+inoremap W <
+inoremap X Q
+inoremap Y F
+inoremap Z :
+inoremap < W
+inoremap > V
+inoremap ? Z
+inoremap : S
+inoremap [ /
+inoremap ] =
+inoremap { ?
+inoremap } +
+inoremap - [
+inoremap _ {
+inoremap = ]
+inoremap + }
diff --git a/runtime/pack/dist/opt/dvorak/plugin/dvorak.vim b/runtime/pack/dist/opt/dvorak/plugin/dvorak.vim
new file mode 100644
index 0000000..c8d5d5c
--- /dev/null
+++ b/runtime/pack/dist/opt/dvorak/plugin/dvorak.vim
@@ -0,0 +1,16 @@
+" When using a dvorak keyboard this file may be of help to you.
+" These mappings have been made by Lawrence Kesteloot <kesteloo@cs.unc.edu>.
+" What they do is that the most often used keys, like hjkl, are put in a more
+" easy to use position.
+" It may take some time to learn using this.
+
+if exists("g:loaded_dvorak_plugin")
+ finish
+endif
+let g:loaded_dvorak_plugin = 1
+
+" Key to go into dvorak mode:
+map ,d :runtime dvorak/enable.vim<CR>
+
+" Key to get out of dvorak mode:
+map ,q :runtime dvorak/disable.vim<CR>
diff --git a/runtime/pack/dist/opt/editexisting/plugin/editexisting.vim b/runtime/pack/dist/opt/editexisting/plugin/editexisting.vim
new file mode 100644
index 0000000..5eda290
--- /dev/null
+++ b/runtime/pack/dist/opt/editexisting/plugin/editexisting.vim
@@ -0,0 +1,118 @@
+" Vim Plugin: Edit the file with an existing Vim if possible
+" Maintainer: Bram Moolenaar
+" Last Change: 2022 Jun 17
+
+" To use add ":packadd! editexisting" in your vimrc file.
+
+" This plugin serves two purposes:
+" 1. On startup, if we were invoked with one file name argument and the file
+" is not modified then try to find another Vim instance that is editing
+" this file. If there is one then bring it to the foreground and exit.
+" 2. When a file is edited and a swap file exists for it, try finding that
+" other Vim and bring it to the foreground. Requires Vim 7, because it
+" uses the SwapExists autocommand event.
+
+" Function that finds the Vim instance that is editing "filename" and brings
+" it to the foreground.
+func s:EditElsewhere(filename)
+ let fname_esc = substitute(a:filename, "'", "''", "g")
+
+ let servers = serverlist()
+ while servers != ''
+ " Get next server name in "servername"; remove it from "servers".
+ let i = match(servers, "\n")
+ if i == -1
+ let servername = servers
+ let servers = ''
+ else
+ let servername = strpart(servers, 0, i)
+ let servers = strpart(servers, i + 1)
+ endif
+
+ " Skip ourselves.
+ if servername ==? v:servername
+ continue
+ endif
+
+ " Check if this server is editing our file.
+ try
+ if remote_expr(servername, "bufloaded('" . fname_esc . "')")
+ " Yes, bring it to the foreground.
+ if has("win32")
+ call remote_foreground(servername)
+ endif
+ call remote_expr(servername, "foreground()")
+
+ if remote_expr(servername, "exists('*EditExisting')")
+ " Make sure the file is visible in a window (not hidden).
+ " If v:swapcommand exists and is set, send it to the server.
+ if exists("v:swapcommand")
+ let c = substitute(v:swapcommand, "'", "''", "g")
+ call remote_expr(servername, "EditExisting('" . fname_esc . "', '" . c . "')")
+ else
+ call remote_expr(servername, "EditExisting('" . fname_esc . "', '')")
+ endif
+ endif
+
+ if !(has('vim_starting') && has('gui_running') && has('gui_win32'))
+ " Tell the user what is happening. Not when the GUI is starting
+ " though, it would result in a message box.
+ echomsg "File is being edited by " . servername
+ sleep 2
+ endif
+ return 'q'
+ endif
+ catch /^Vim\%((\a\+)\)\=:E241:/
+ " Unable to send to this server, ignore it.
+ endtry
+ endwhile
+ return ''
+endfunc
+
+" When the plugin is loaded and there is one file name argument: Find another
+" Vim server that is editing this file right now.
+if argc() == 1 && !&modified
+ if s:EditElsewhere(expand("%:p")) == 'q'
+ quit
+ endif
+endif
+
+" Setup for handling the situation that an existing swap file is found.
+try
+ au! SwapExists * let v:swapchoice = s:EditElsewhere(expand("<afile>:p"))
+catch
+ " Without SwapExists we don't do anything for ":edit" commands
+endtry
+
+" Function used on the server to make the file visible and possibly execute a
+" command.
+func! EditExisting(fname, command)
+ " Get the window number of the file in the current tab page.
+ let winnr = bufwinnr(a:fname)
+ if winnr <= 0
+ " Not found, look in other tab pages.
+ let bufnr = bufnr(a:fname)
+ for i in range(tabpagenr('$'))
+ if index(tabpagebuflist(i + 1), bufnr) >= 0
+ " Make this tab page the current one and find the window number.
+ exe 'tabnext ' . (i + 1)
+ let winnr = bufwinnr(a:fname)
+ break
+ endif
+ endfor
+ endif
+
+ if winnr > 0
+ exe winnr . "wincmd w"
+ elseif exists('*fnameescape')
+ exe "split " . fnameescape(a:fname)
+ else
+ exe "split " . escape(a:fname, " \t\n*?[{`$\\%#'\"|!<")
+ endif
+
+ if a:command != ''
+ exe "normal! " . a:command
+ endif
+
+ redraw
+endfunc
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 0000000..4ef3bf9
--- /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/matchit/autoload/matchit.vim b/runtime/pack/dist/opt/matchit/autoload/matchit.vim
new file mode 100644
index 0000000..eafb7c0
--- /dev/null
+++ b/runtime/pack/dist/opt/matchit/autoload/matchit.vim
@@ -0,0 +1,777 @@
+" matchit.vim: (global plugin) Extended "%" matching
+" autload script of matchit plugin, see ../plugin/matchit.vim
+" Last Change: Jun 10, 2021
+
+" Neovim does not support scriptversion
+if has("vimscript-4")
+ scriptversion 4
+endif
+
+let s:last_mps = ""
+let s:last_words = ":"
+let s:patBR = ""
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Auto-complete mappings: (not yet "ready for prime time")
+" TODO Read :help write-plugin for the "right" way to let the user
+" specify a key binding.
+" let g:match_auto = '<C-]>'
+" let g:match_autoCR = '<C-CR>'
+" if exists("g:match_auto")
+" execute "inoremap " . g:match_auto . ' x<Esc>"=<SID>Autocomplete()<CR>Pls'
+" endif
+" if exists("g:match_autoCR")
+" execute "inoremap " . g:match_autoCR . ' <CR><C-R>=<SID>Autocomplete()<CR>'
+" endif
+" if exists("g:match_gthhoh")
+" execute "inoremap " . g:match_gthhoh . ' <C-O>:call <SID>Gthhoh()<CR>'
+" endif " gthhoh = "Get the heck out of here!"
+
+let s:notslash = '\\\@1<!\%(\\\\\)*'
+
+function s:RestoreOptions()
+ " In s:CleanUp(), :execute "set" restore_options .
+ let restore_options = ""
+ if get(b:, 'match_ignorecase', &ic) != &ic
+ let restore_options ..= (&ic ? " " : " no") .. "ignorecase"
+ let &ignorecase = b:match_ignorecase
+ endif
+ if &ve != ''
+ let restore_options = " ve=" .. &ve .. restore_options
+ set ve=
+ endif
+ return restore_options
+endfunction
+
+function matchit#Match_wrapper(word, forward, mode) range
+ let restore_options = s:RestoreOptions()
+ " In s:CleanUp(), we may need to check whether the cursor moved forward.
+ let startpos = [line("."), col(".")]
+ " if a count has been applied, use the default [count]% mode (see :h N%)
+ if v:count
+ exe "normal! " .. v:count .. "%"
+ return s:CleanUp(restore_options, a:mode, startpos)
+ end
+ if a:mode =~# "v" && mode(1) =~# 'ni'
+ exe "norm! gv"
+ elseif a:mode == "o" && mode(1) !~# '[vV]'
+ exe "norm! v"
+ " If this function was called from Visual mode, make sure that the cursor
+ " is at the correct end of the Visual range:
+ elseif a:mode == "v"
+ execute "normal! gv\<Esc>"
+ let startpos = [line("."), col(".")]
+ endif
+
+ " First step: if not already done, set the script variables
+ " s:do_BR flag for whether there are backrefs
+ " s:pat parsed version of b:match_words
+ " s:all regexp based on s:pat and the default groups
+ if !exists("b:match_words") || b:match_words == ""
+ let match_words = ""
+ elseif b:match_words =~ ":"
+ let match_words = b:match_words
+ else
+ " Allow b:match_words = "GetVimMatchWords()" .
+ 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_mps = &mps
+ " quote the special chars in 'matchpairs', replace [,:] with \| and then
+ " append the builtin pairs (/*, */, #if, #ifdef, #ifndef, #else, #elif,
+ " #endif)
+ let default = escape(&mps, '[$^.*~\\/?]') .. (strlen(&mps) ? "," : "") ..
+ \ '\/\*:\*\/,#\s*if\%(n\=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
+ else
+ let s:do_BR = 1
+ let s:pat = s:ParseWords(match_words)
+ endif
+ let s:all = substitute(s:pat, s:notslash .. '\zs[,:]\+', '\\|', 'g')
+ " Just in case there are too many '\(...)' groups inside the pattern, make
+ " sure to use \%(...) groups, so that error E872 can be avoided
+ let s:all = substitute(s:all, '\\(', '\\%(', 'g')
+ let s:all = '\%(' .. s:all .. '\)'
+ 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:
+ " matchline = line on which the cursor started
+ " curcol = number of characters before match
+ " prefix = regexp for start of line to start of match
+ " suffix = regexp for end of match to end of line
+ " Require match to end on or after the cursor and prefer it to
+ " start on or before the cursor.
+ let matchline = getline(startpos[0])
+ if a:word != ''
+ " word given
+ if a:word !~ s:all
+ echohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONE
+ return s:CleanUp(restore_options, a:mode, startpos)
+ endif
+ let matchline = a:word
+ let curcol = 0
+ let prefix = '^\%('
+ let suffix = '\)$'
+ " Now the case when "word" is not given
+ else " Find the match that ends on or after the cursor and set curcol.
+ let regexp = s:Wholematch(matchline, s:all, startpos[1]-1)
+ let curcol = match(matchline, regexp)
+ " If there is no match, give up.
+ if curcol == -1
+ " Make sure macros abort properly
+ "exe "norm! \<esc>"
+ call feedkeys("\e", 'tni')
+ return s:CleanUp(restore_options, a:mode, startpos)
+ endif
+ let endcol = matchend(matchline, regexp)
+ let suf = strlen(matchline) - endcol
+ let prefix = (curcol ? '^.*\%' .. (curcol + 1) .. 'c\%(' : '^\%(')
+ let suffix = (suf ? '\)\%' .. (endcol + 1) .. 'c.*$' : '\)$')
+ endif
+ if exists("b:match_debug")
+ let b:match_match = matchstr(matchline, regexp)
+ let b:match_col = curcol+1
+ endif
+
+ " Third step: Find the group and single word that match, and the original
+ " (backref) versions of these. Then, resolve the backrefs.
+ " Set the following local variable:
+ " group = colon-separated list of patterns, one of which matches
+ " = ini:mid:fin or ini:fin
+ "
+ " 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, s:patBR)
+ let i = matchend(group, s:notslash .. ",")
+ let groupBR = strpart(group, i)
+ let group = strpart(group, 0, i-1)
+ " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix
+ if s:do_BR " Do the hard part: resolve those backrefs!
+ let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline)
+ endif
+ if exists("b:match_debug")
+ let b:match_wholeBR = groupBR
+ let i = matchend(groupBR, s:notslash .. ":")
+ let b:match_iniBR = strpart(groupBR, 0, i-1)
+ endif
+
+ " Fourth step: Set the arguments for searchpair().
+ let i = matchend(group, s:notslash .. ":")
+ let j = matchend(group, '.*' .. s:notslash .. ":")
+ let ini = strpart(group, 0, i-1)
+ let mid = substitute(strpart(group, i,j-i-1), s:notslash .. '\zs:', '\\|', 'g')
+ let fin = strpart(group, j)
+ "Un-escape the remaining , and : characters.
+ let ini = substitute(ini, s:notslash .. '\zs\\\(:\|,\)', '\1', 'g')
+ let mid = substitute(mid, s:notslash .. '\zs\\\(:\|,\)', '\1', 'g')
+ let fin = substitute(fin, s:notslash .. '\zs\\\(:\|,\)', '\1', 'g')
+ " searchpair() requires that these patterns avoid \(\) groups.
+ let ini = substitute(ini, s:notslash .. '\zs\\(', '\\%(', 'g')
+ let mid = substitute(mid, s:notslash .. '\zs\\(', '\\%(', 'g')
+ let fin = substitute(fin, s:notslash .. '\zs\\(', '\\%(', 'g')
+ " Set mid. This is optimized for readability, not micro-efficiency!
+ if a:forward && matchline =~ prefix .. fin .. suffix
+ \ || !a:forward && matchline =~ prefix .. ini .. suffix
+ let mid = ""
+ endif
+ " Set flag. This is optimized for readability, not micro-efficiency!
+ if a:forward && matchline =~ prefix .. fin .. suffix
+ \ || !a:forward && matchline !~ prefix .. ini .. suffix
+ let flag = "bW"
+ else
+ let flag = "W"
+ endif
+ " Set skip.
+ if exists("b:match_skip")
+ let skip = b:match_skip
+ elseif exists("b:match_comment") " backwards compatibility and testing!
+ let skip = "r:" .. b:match_comment
+ else
+ let skip = 's:comment\|string'
+ endif
+ let skip = s:ParseSkip(skip)
+ if exists("b:match_debug")
+ let b:match_ini = ini
+ let b:match_tail = (strlen(mid) ? mid .. '\|' : '') .. fin
+ endif
+
+ " Fifth step: actually start moving the cursor and call searchpair().
+ " Later, :execute restore_cursor to get to the original screen.
+ let view = winsaveview()
+ call cursor(0, curcol + 1)
+ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
+ let skip = "0"
+ else
+ execute "if " .. skip .. "| let skip = '0' | endif"
+ endif
+ let sp_return = searchpair(ini, mid, fin, flag, skip)
+ if &selection isnot# 'inclusive' && a:mode == 'v'
+ " move cursor one pos to the right, because selection is not inclusive
+ " add virtualedit=onemore, to make it work even when the match ends the
+ " line
+ if !(col('.') < col('$')-1)
+ let eolmark=1 " flag to set a mark on eol (since we cannot move there)
+ endif
+ norm! l
+ endif
+ let final_position = "call cursor(" .. line(".") .. "," .. col(".") .. ")"
+ " Restore cursor position and original screen.
+ call winrestview(view)
+ normal! m'
+ if sp_return > 0
+ execute final_position
+ endif
+ if exists('eolmark') && eolmark
+ call setpos("''", [0, line('.'), col('$'), 0]) " set mark on the eol
+ endif
+ return s:CleanUp(restore_options, a:mode, startpos, mid .. '\|' .. fin)
+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, startpos, ...)
+ if strlen(a:options)
+ execute "set" a:options
+ endif
+ " Open folds, if appropriate.
+ if a:mode != "o"
+ if &foldopen =~ "percent"
+ normal! zv
+ endif
+ " In Operator-pending mode, we want to include the whole match
+ " (for example, d%).
+ " This is only a problem if we end up moving in the forward direction.
+ elseif (a:startpos[0] < line(".")) ||
+ \ (a:startpos[0] == line(".") && a:startpos[1] < col("."))
+ if a:0
+ " Check whether the match is a single character. If not, move to the
+ " end of the match.
+ let matchline = getline(".")
+ let currcol = col(".")
+ let regexp = s:Wholematch(matchline, a:1, currcol-1)
+ let endcol = matchend(matchline, regexp)
+ if endcol > currcol " This is NOT off by one!
+ call cursor(0, endcol)
+ endif
+ endif " a:0
+ endif " a:mode != "o" && etc.
+ return 0
+endfun
+
+" Example (simplified HTML patterns): if
+" a:groupBR = '<\(\k\+\)>:</\1>'
+" a:prefix = '^.\{3}\('
+" a:group = '<\(\k\+\)>:</\(\k\+\)>'
+" a:suffix = '\).\{2}$'
+" a:matchline = "123<tag>12" or "123</tag>12"
+" then extract "tag" from a:matchline and return "<tag>:</tag>" .
+fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline)
+ if a:matchline !~ a:prefix ..
+ \ substitute(a:group, s:notslash .. '\zs:', '\\|', 'g') .. a:suffix
+ return a:group
+ endif
+ let i = matchend(a:groupBR, s:notslash .. ':')
+ let ini = strpart(a:groupBR, 0, i-1)
+ let tailBR = strpart(a:groupBR, i)
+ let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix,
+ \ a:groupBR)
+ let i = matchend(word, s:notslash .. ":")
+ let wordBR = strpart(word, i)
+ let word = strpart(word, 0, i-1)
+ " Now, a:matchline =~ a:prefix . word . a:suffix
+ if wordBR != ini
+ let table = s:Resolve(ini, wordBR, "table")
+ else
+ let table = ""
+ let d = 0
+ while d < 10
+ if tailBR =~ s:notslash .. '\\' .. d
+ let table = table .. d
+ else
+ let table = table .. "-"
+ endif
+ let d = d + 1
+ endwhile
+ endif
+ let d = 9
+ while d
+ if table[d] != "-"
+ let backref = substitute(a:matchline, a:prefix .. word .. a:suffix,
+ \ '\' .. table[d], "")
+ " Are there any other characters that should be escaped?
+ let backref = escape(backref, '*,:')
+ execute s:Ref(ini, d, "start", "len")
+ let ini = strpart(ini, 0, start) .. backref .. strpart(ini, start+len)
+ let tailBR = substitute(tailBR, s:notslash .. '\zs\\' .. d,
+ \ escape(backref, '\\&'), 'g')
+ endif
+ let d = d-1
+ endwhile
+ if exists("b:match_debug")
+ if s:do_BR
+ let b:match_table = table
+ let b:match_word = word
+ else
+ let b:match_table = ""
+ let b:match_word = ""
+ endif
+ endif
+ return ini .. ":" .. tailBR
+endfun
+
+" Input a comma-separated list of groups with backrefs, such as
+" a:groups = '\(foo\):end\1,\(bar\):end\1'
+" and return a comma-separated list of groups with backrefs replaced:
+" return '\(foo\):end\(foo\),\(bar\):end\(bar\)'
+fun! s:ParseWords(groups)
+ let groups = substitute(a:groups .. ",", s:notslash .. '\zs[,:]*,[,:]*', ',', 'g')
+ let groups = substitute(groups, s:notslash .. '\zs:\{2,}', ':', 'g')
+ let parsed = ""
+ while groups =~ '[^,:]'
+ let i = matchend(groups, s:notslash .. ':')
+ let j = matchend(groups, s:notslash .. ',')
+ let ini = strpart(groups, 0, i-1)
+ let tail = strpart(groups, i, j-i-1) .. ":"
+ let groups = strpart(groups, j)
+ let parsed = parsed .. ini
+ let i = matchend(tail, s:notslash .. ':')
+ while i != -1
+ " In 'if:else:endif', ini='if' and word='else' and then word='endif'.
+ let word = strpart(tail, 0, i-1)
+ let tail = strpart(tail, i)
+ let i = matchend(tail, s:notslash .. ':')
+ let parsed = parsed .. ":" .. s:Resolve(ini, word, "word")
+ endwhile " Now, tail has been used up.
+ let parsed = parsed .. ","
+ endwhile " groups =~ '[^,:]'
+ let parsed = substitute(parsed, ',$', '', '')
+ return parsed
+endfun
+
+" TODO I think this can be simplified and/or made more efficient.
+" TODO What should I do if a:start is out of range?
+" Return a regexp that matches all of a:string, such that
+" matchstr(a:string, regexp) represents the match for a:pat that starts
+" as close to a:start as possible, before being preferred to after, and
+" ends after a:start .
+" Usage:
+" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1)
+" let i = match(getline("."), regexp)
+" let j = matchend(getline("."), regexp)
+" let match = matchstr(getline("."), regexp)
+fun! s:Wholematch(string, pat, start)
+ let group = '\%(' .. a:pat .. '\)'
+ let prefix = (a:start ? '\(^.*\%<' .. (a:start + 2) .. 'c\)\zs' : '^')
+ let len = strlen(a:string)
+ let suffix = (a:start+1 < len ? '\(\%>' .. (a:start+1) .. 'c.*$\)\@=' : '$')
+ if a:string !~ prefix .. group .. suffix
+ let prefix = ''
+ endif
+ return prefix .. group .. suffix
+endfun
+
+" No extra arguments: s:Ref(string, d) will
+" find the d'th occurrence of '\(' and return it, along with everything up
+" to and including the matching '\)'.
+" One argument: s:Ref(string, d, "start") returns the index of the start
+" of the d'th '\(' and any other argument returns the length of the group.
+" Two arguments: s:Ref(string, d, "foo", "bar") returns a string to be
+" executed, having the effect of
+" :let foo = s:Ref(string, d, "start")
+" :let bar = s:Ref(string, d, "len")
+fun! s:Ref(string, d, ...)
+ let len = strlen(a:string)
+ if a:d == 0
+ let start = 0
+ else
+ let cnt = a:d
+ let match = a:string
+ while cnt
+ let cnt = cnt - 1
+ let index = matchend(match, s:notslash .. '\\(')
+ if index == -1
+ return ""
+ endif
+ let match = strpart(match, index)
+ endwhile
+ let start = len - strlen(match)
+ if a:0 == 1 && a:1 == "start"
+ return start - 2
+ endif
+ let cnt = 1
+ while cnt
+ let index = matchend(match, s:notslash .. '\\(\|\\)') - 1
+ if index == -2
+ return ""
+ endif
+ " Increment if an open, decrement if a ')':
+ let cnt = cnt + (match[index]=="(" ? 1 : -1) " ')'
+ let match = strpart(match, index+1)
+ endwhile
+ let start = start - 2
+ let len = len - start - strlen(match)
+ endif
+ if a:0 == 1
+ return len
+ elseif a:0 == 2
+ return "let " .. a:1 .. "=" .. start .. "| let " .. a:2 .. "=" .. len
+ else
+ return strpart(a:string, start, len)
+ endif
+endfun
+
+" Count the number of disjoint copies of pattern in string.
+" If the pattern is a literal string and contains no '0' or '1' characters
+" then s:Count(string, pattern, '0', '1') should be faster than
+" s:Count(string, pattern).
+fun! s:Count(string, pattern, ...)
+ let pat = escape(a:pattern, '\\')
+ if a:0 > 1
+ let foo = substitute(a:string, '[^' .. a:pattern .. ']', "a:1", "g")
+ let foo = substitute(a:string, pat, a:2, "g")
+ let foo = substitute(foo, '[^' .. a:2 .. ']', "", "g")
+ return strlen(foo)
+ endif
+ let result = 0
+ let foo = a:string
+ let index = matchend(foo, pat)
+ while index != -1
+ let result = result + 1
+ let foo = strpart(foo, index)
+ let index = matchend(foo, pat)
+ endwhile
+ return result
+endfun
+
+" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where
+" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'. That is, the first
+" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this
+" indicates that all other instances of '\1' in target are to be replaced
+" by '\3'. The hard part is dealing with nesting...
+" Note that ":" is an illegal character for source and target,
+" unless it is preceded by "\".
+fun! s:Resolve(source, target, output)
+ let word = a:target
+ let i = matchend(word, s:notslash .. '\\\d') - 1
+ let table = "----------"
+ while i != -2 " There are back references to be replaced.
+ let d = word[i]
+ let backref = s:Ref(a:source, d)
+ " The idea is to replace '\d' with backref. Before we do this,
+ " replace any \(\) groups in backref with :1, :2, ... if they
+ " correspond to the first, second, ... group already inserted
+ " into backref. Later, replace :1 with \1 and so on. The group
+ " number w+b within backref corresponds to the group number
+ " s within a:source.
+ " w = number of '\(' in word before the current one
+ let w = s:Count(
+ \ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1')
+ let b = 1 " number of the current '\(' in backref
+ let s = d " number of the current '\(' in a:source
+ while b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1')
+ \ && s < 10
+ if table[s] == "-"
+ if w + b < 10
+ " let table[s] = w + b
+ let table = strpart(table, 0, s) .. (w+b) .. strpart(table, s+1)
+ endif
+ let b = b + 1
+ let s = s + 1
+ else
+ execute s:Ref(backref, b, "start", "len")
+ let ref = strpart(backref, start, len)
+ let backref = strpart(backref, 0, start) .. ":" .. table[s]
+ \ .. strpart(backref, start+len)
+ let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1')
+ endif
+ endwhile
+ let word = strpart(word, 0, i-1) .. backref .. strpart(word, i+1)
+ let i = matchend(word, s:notslash .. '\\\d') - 1
+ endwhile
+ let word = substitute(word, s:notslash .. '\zs:', '\\', 'g')
+ if a:output == "table"
+ return table
+ elseif a:output == "word"
+ return word
+ else
+ return table .. word
+ endif
+endfun
+
+" Assume a:comma = ",". Then the format for a:patterns and a:1 is
+" a:patterns = "<pat1>,<pat2>,..."
+" a:1 = "<alt1>,<alt2>,..."
+" If <patn> is the first pattern that matches a:string then return <patn>
+" if no optional arguments are given; return <patn>,<altn> if a:1 is given.
+fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...)
+ let tail = (a:patterns =~ a:comma .. "$" ? a:patterns : a:patterns .. a:comma)
+ let i = matchend(tail, s:notslash .. a:comma)
+ if a:0
+ let alttail = (a:1 =~ a:comma .. "$" ? a:1 : a:1 .. a:comma)
+ let j = matchend(alttail, s:notslash .. a:comma)
+ endif
+ let current = strpart(tail, 0, i-1)
+ if a:branch == ""
+ let currpat = current
+ else
+ let currpat = substitute(current, s:notslash .. a:branch, '\\|', 'g')
+ endif
+ while a:string !~ a:prefix .. currpat .. a:suffix
+ let tail = strpart(tail, i)
+ let i = matchend(tail, s:notslash .. a:comma)
+ if i == -1
+ return -1
+ endif
+ let current = strpart(tail, 0, i-1)
+ if a:branch == ""
+ let currpat = current
+ else
+ let currpat = substitute(current, s:notslash .. a:branch, '\\|', 'g')
+ endif
+ if a:0
+ let alttail = strpart(alttail, j)
+ let j = matchend(alttail, s:notslash .. a:comma)
+ endif
+ endwhile
+ if a:0
+ let current = current .. a:comma .. strpart(alttail, 0, j-1)
+ endif
+ return current
+endfun
+
+fun! matchit#Match_debug()
+ let b:match_debug = 1 " Save debugging information.
+ " pat = all of b:match_words with backrefs parsed
+ amenu &Matchit.&pat :echo b:match_pat<CR>
+ " match = bit of text that is recognized as a match
+ amenu &Matchit.&match :echo b:match_match<CR>
+ " curcol = cursor column of the start of the matching text
+ amenu &Matchit.&curcol :echo b:match_col<CR>
+ " wholeBR = matching group, original version
+ amenu &Matchit.wh&oleBR :echo b:match_wholeBR<CR>
+ " iniBR = 'if' piece, original version
+ amenu &Matchit.ini&BR :echo b:match_iniBR<CR>
+ " ini = 'if' piece, with all backrefs resolved from match
+ amenu &Matchit.&ini :echo b:match_ini<CR>
+ " tail = 'else\|endif' piece, with all backrefs resolved from match
+ amenu &Matchit.&tail :echo b:match_tail<CR>
+ " fin = 'endif' piece, with all backrefs resolved from match
+ amenu &Matchit.&word :echo b:match_word<CR>
+ " '\'.d in ini refers to the same thing as '\'.table[d] in word.
+ amenu &Matchit.t&able :echo '0:' .. b:match_table .. ':9'<CR>
+endfun
+
+" Jump to the nearest unmatched "(" or "if" or "<tag>" if a:spflag == "bW"
+" or the nearest unmatched "</tag>" or "endif" or ")" if a:spflag == "W".
+" Return a "mark" for the original position, so that
+" let m = MultiMatch("bW", "n") ... call winrestview(m)
+" will return to the original position. If there is a problem, do not
+" move the cursor and return {}, unless a count is given, in which case
+" go up or down as many levels as possible and again return {}.
+" TODO This relies on the same patterns as % matching. It might be a good
+" idea to give it its own matching patterns.
+fun! matchit#MultiMatch(spflag, mode)
+ let restore_options = s:RestoreOptions()
+ let startpos = [line("."), col(".")]
+ " save v:count1 variable, might be reset from the restore_cursor command
+ let level = v:count1
+ if a:mode == "o" && mode(1) !~# '[vV]'
+ exe "norm! v"
+ endif
+
+ " First step: if not already done, set the script variables
+ " s:do_BR flag for whether there are backrefs
+ " s:pat parsed version of b:match_words
+ " s:all regexp based on s:pat and the default groups
+ " This part is copied and slightly modified from matchit#Match_wrapper().
+ if !exists("b:match_words") || b:match_words == ""
+ let match_words = ""
+ " Allow b:match_words = "GetVimMatchWords()" .
+ elseif b:match_words =~ ":"
+ let match_words = b:match_words
+ else
+ execute "let match_words =" b:match_words
+ endif
+ if (match_words != s:last_words) || (&mps != s:last_mps) ||
+ \ exists("b:match_debug")
+ let default = escape(&mps, '[$^.*~\\/?]') .. (strlen(&mps) ? "," : "") ..
+ \ '\/\*:\*\/,#\s*if\%(n\=def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>'
+ let s:last_mps = &mps
+ 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
+ else
+ let s:do_BR = 1
+ let s:pat = s:ParseWords(match_words)
+ endif
+ let s:all = '\%(' .. substitute(s:pat, '[,:]\+', '\\|', 'g') .. '\)'
+ 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: figure out the patterns for searchpair()
+ " and save the screen, cursor position, and 'ignorecase'.
+ " - TODO: A lot of this is copied from matchit#Match_wrapper().
+ " - maybe even more functionality should be split off
+ " - into separate functions!
+ let openlist = split(s:pat .. ',', s:notslash .. '\zs:.\{-}' .. s:notslash .. ',')
+ let midclolist = split(',' .. s:pat, s:notslash .. '\zs,.\{-}' .. s:notslash .. ':')
+ call map(midclolist, {-> split(v:val, s:notslash .. ':')})
+ let closelist = []
+ let middlelist = []
+ call map(midclolist, {i,v -> [extend(closelist, v[-1 : -1]),
+ \ extend(middlelist, v[0 : -2])]})
+ call map(openlist, {i,v -> v =~# s:notslash .. '\\|' ? '\%(' .. v .. '\)' : v})
+ call map(middlelist, {i,v -> v =~# s:notslash .. '\\|' ? '\%(' .. v .. '\)' : v})
+ call map(closelist, {i,v -> v =~# s:notslash .. '\\|' ? '\%(' .. v .. '\)' : v})
+ let open = join(openlist, ',')
+ let middle = join(middlelist, ',')
+ let close = join(closelist, ',')
+ if exists("b:match_skip")
+ let skip = b:match_skip
+ elseif exists("b:match_comment") " backwards compatibility and testing!
+ let skip = "r:" .. b:match_comment
+ else
+ let skip = 's:comment\|string'
+ endif
+ let skip = s:ParseSkip(skip)
+ let view = winsaveview()
+
+ " Third step: call searchpair().
+ " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'.
+ let openpat = substitute(open, '\%(' .. s:notslash .. '\)\@<=\\(', '\\%(', 'g')
+ let openpat = substitute(openpat, ',', '\\|', 'g')
+ let closepat = substitute(close, '\%(' .. s:notslash .. '\)\@<=\\(', '\\%(', 'g')
+ let closepat = substitute(closepat, ',', '\\|', 'g')
+ let middlepat = substitute(middle, '\%(' .. s:notslash .. '\)\@<=\\(', '\\%(', 'g')
+ let middlepat = substitute(middlepat, ',', '\\|', 'g')
+
+ if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
+ let skip = '0'
+ else
+ 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 '
+ while level
+ if searchpair(openpat, middlepat, closepat, a:spflag, skip) < 1
+ call s:CleanUp(restore_options, a:mode, startpos)
+ return {}
+ endif
+ let level = level - 1
+ endwhile
+
+ " Restore options and return a string to restore the original position.
+ call s:CleanUp(restore_options, a:mode, startpos)
+ return view
+endfun
+
+" Search backwards for "if" or "while" or "<tag>" or ...
+" and return "endif" or "endwhile" or "</tag>" or ... .
+" For now, this uses b:match_words and the same script variables
+" as matchit#Match_wrapper() . Later, it may get its own patterns,
+" either from a buffer variable or passed as arguments.
+" fun! s:Autocomplete()
+" echo "autocomplete not yet implemented :-("
+" if !exists("b:match_words") || b:match_words == ""
+" return ""
+" end
+" let startpos = matchit#MultiMatch("bW")
+"
+" if startpos == ""
+" return ""
+" endif
+" " - TODO: figure out whether 'if' or '<tag>' matched, and construct
+" " - the appropriate closing.
+" let matchline = getline(".")
+" let curcol = col(".") - 1
+" " - TODO: Change the s:all argument if there is a new set of match pats.
+" let regexp = s:Wholematch(matchline, s:all, curcol)
+" let suf = strlen(matchline) - matchend(matchline, regexp)
+" let prefix = (curcol ? '^.\{' . curcol . '}\%(' : '^\%(')
+" let suffix = (suf ? '\).\{' . suf . '}$' : '\)$')
+" " Reconstruct the version with unresolved backrefs.
+" let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g')
+" let patBR = substitute(patBR, ':\{2,}', ':', "g")
+" " Now, set group and groupBR to the matching group: 'if:endif' or
+" " 'while:endwhile' or whatever.
+" let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR)
+" let i = matchend(group, s:notslash . ",")
+" let groupBR = strpart(group, i)
+" let group = strpart(group, 0, i-1)
+" " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix
+" if s:do_BR
+" let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline)
+" endif
+" " let g:group = group
+"
+" " - TODO: Construct the closing from group.
+" let fake = "end" . expand("<cword>")
+" execute startpos
+" return fake
+" endfun
+
+" Close all open structures. "Get the heck out of here!"
+" fun! s:Gthhoh()
+" let close = s:Autocomplete()
+" while strlen(close)
+" put=close
+" let close = s:Autocomplete()
+" endwhile
+" endfun
+
+" Parse special strings as typical skip arguments for searchpair():
+" s:foo becomes (current syntax item) =~ foo
+" S:foo becomes (current syntax item) !~ foo
+" r:foo becomes (line before cursor) =~ foo
+" R:foo becomes (line before cursor) !~ foo
+fun! s:ParseSkip(str)
+ let skip = a:str
+ if skip[1] == ":"
+ if skip[0] == "s"
+ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" ..
+ \ strpart(skip,2) .. "'"
+ elseif skip[0] == "S"
+ let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" ..
+ \ strpart(skip,2) .. "'"
+ elseif skip[0] == "r"
+ let skip = "strpart(getline('.'),0,col('.'))=~'" .. strpart(skip,2) .. "'"
+ elseif skip[0] == "R"
+ let skip = "strpart(getline('.'),0,col('.'))!~'" .. strpart(skip,2) .. "'"
+ endif
+ endif
+ return skip
+endfun
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim:sts=2:sw=2:et:
diff --git a/runtime/pack/dist/opt/matchit/doc/matchit.txt b/runtime/pack/dist/opt/matchit/doc/matchit.txt
new file mode 100644
index 0000000..52f448f
--- /dev/null
+++ b/runtime/pack/dist/opt/matchit/doc/matchit.txt
@@ -0,0 +1,397 @@
+*matchit.txt* Extended "%" matching
+
+For instructions on installing this file, type
+ `:help matchit-install`
+inside Vim.
+
+For Vim version 8.2. Last change: 2021 Dec 24
+
+
+ VIM REFERENCE MANUAL by Benji Fisher et al
+
+*matchit* *matchit.vim*
+
+1. Extended matching with "%" |matchit-intro|
+2. Activation |matchit-activate|
+3. Configuration |matchit-configure|
+4. Supporting a New Language |matchit-newlang|
+5. Known Bugs and Limitations |matchit-bugs|
+
+The functionality mentioned here is a plugin, see |add-plugin|.
+This plugin is only available if 'compatible' is not set.
+
+==============================================================================
+1. Extended matching with "%" *matchit-intro*
+
+ *matchit-%*
+% Cycle forward through matching groups, such as "if", "else", "endif",
+ as specified by |b:match_words|.
+
+ *g%* *v_g%* *o_g%*
+g% Cycle backwards through matching groups, as specified by
+ |b:match_words|. For example, go from "if" to "endif" to "else".
+
+ *[%* *v_[%* *o_[%*
+[% Go to [count] previous unmatched group, as specified by
+ |b:match_words|. Similar to |[{|.
+
+ *]%* *v_]%* *o_]%*
+]% Go to [count] next unmatched group, as specified by
+ |b:match_words|. Similar to |]}|.
+
+ *v_a%*
+a% In Visual mode, select the matching group, as specified by
+ |b:match_words|, containing the cursor. Similar to |v_a[|.
+ A [count] is ignored, and only the first character of the closing
+ pattern is selected.
+
+In Vim, as in plain vi, the percent key, |%|, jumps the cursor from a brace,
+bracket, or paren to its match. This can be configured with the 'matchpairs'
+option. The matchit plugin extends this in several ways:
+
+ You can match whole words, such as "if" and "endif", not just
+ single characters. You can also specify a |regular-expression|.
+ You can define groups with more than two words, such as "if",
+ "else", "endif". Banging on the "%" key will cycle from the "if" to
+ the first "else", the next "else", ..., the closing "endif", and back
+ to the opening "if". Nested structures are skipped. Using |g%| goes
+ in the reverse direction.
+ By default, words inside comments and strings are ignored, unless
+ the cursor is inside a comment or string when you type "%". If the
+ only thing you want to do is modify the behavior of "%" so that it
+ behaves this way, you do not have to define |b:match_words|, since the
+ script uses the 'matchpairs' option as well as this variable.
+
+See |matchit-details| for details on what the script does, and |b:match_words|
+for how to specify matching patterns.
+
+MODES: *matchit-modes* *matchit-v_%* *matchit-o_%*
+
+Mostly, % and related motions (|g%| and |[%| and |]%|) should just work like built-in
+|motion| commands in |Operator-pending| and |Visual| modes (as of 8.1.648)
+
+LANGUAGES: *matchit-languages*
+
+Currently, the following languages are supported: Ada, ASP with VBS, Csh,
+DTD, Entity, Essbase, Fortran, HTML, JSP (same as HTML), LaTeX, Lua, Pascal,
+SGML, Shell, Tcsh, Vim, XML. Other languages may already have support via
+the default |filetype-plugin|s in the standard vim distribution.
+
+To support a new language, see |matchit-newlang| below.
+
+DETAILS: *matchit-details* *matchit-parse*
+
+Here is an outline of what matchit.vim does each time you hit the "%" key. If
+there are |backref|s in |b:match_words| then the first step is to produce a
+version in which these back references have been eliminated; if there are no
+|backref|s then this step is skipped. This step is called parsing. For
+example, "\(foo\|bar\):end\1" is parsed to yield
+"\(foo\|bar\):end\(foo\|bar\)". This can get tricky, especially if there are
+nested groups. If debugging is turned on, the parsed version is saved as
+|b:match_pat|.
+
+ *matchit-choose*
+Next, the script looks for a word on the current line that matches the pattern
+just constructed. It includes the patterns from the 'matchpairs' option.
+The goal is to do what you expect, which turns out to be a little complicated.
+The script follows these rules:
+
+ Insist on a match that ends on or after the cursor.
+ Prefer a match that includes the cursor position (that is, one that
+ starts on or before the cursor).
+ Prefer a match that starts as close to the cursor as possible.
+ If more than one pattern in |b:match_words| matches, choose the one
+ that is listed first.
+
+Examples:
+
+ Suppose you >
+ :let b:match_words = '<:>,<tag>:</tag>'
+< and hit "%" with the cursor on or before the "<" in "a <tag> is born".
+ The pattern '<' comes first, so it is preferred over '<tag>', which
+ also matches. If the cursor is on the "t", however, then '<tag>' is
+ preferred, because this matches a bit of text containing the cursor.
+ If the two groups of patterns were reversed then '<' would never be
+ preferred.
+
+ Suppose you >
+ :let b:match_words = 'if:end if'
+< (Note the space!) and hit "%" with the cursor at the end of "end if".
+ Then "if" matches, which is probably not what you want, but if the
+ cursor starts on the "end " then "end if" is chosen. (You can avoid
+ this problem by using a more complicated pattern.)
+
+If there is no match, the cursor does not move. (Before version 1.13 of the
+script, it would fall back on the usual behavior of |%|). If debugging is
+turned on, the matched bit of text is saved as |b:match_match| and the cursor
+column of the start of the match is saved as |b:match_col|.
+
+Next, the script looks through |b:match_words| (original and parsed versions)
+for the group and pattern that match. If debugging is turned on, the group is
+saved as |b:match_ini| (the first pattern) and |b:match_tail| (the rest). If
+there are |backref|s then, in addition, the matching pattern is saved as
+|b:match_word| and a table of translations is saved as |b:match_table|. If
+there are |backref|s, these are determined from the matching pattern and
+|b:match_match| and substituted into each pattern in the matching group.
+
+The script decides whether to search forwards or backwards and chooses
+arguments for the |searchpair()| function. Then, the cursor is moved to the
+start of the match, and |searchpair()| is called. By default, matching
+structures inside strings and comments are ignored. This can be changed by
+setting |b:match_skip|.
+
+==============================================================================
+2. Activation *matchit-activate*
+
+To use the matchit plugin add this line to your |vimrc|: >
+ packadd! matchit
+
+The script should start working the next time you start Vim.
+
+To use the matching plugin after startup, you can use this command (note the
+omitted '!'): >
+ packadd matchit
+
+To use the matchit plugin after Vim has started, execute this command: >
+ packadd matchit
+
+(Earlier versions of the script did nothing unless a |buffer-variable| named
+|b:match_words| was defined. Even earlier versions contained autocommands
+that set this variable for various file types. Now, |b:match_words| is
+defined in many of the default |filetype-plugin|s instead.)
+
+For a new language, you can add autocommands to the script or to your vimrc
+file, but the recommended method is to add a line such as >
+ let b:match_words = '\<foo\>:\<bar\>'
+to the |filetype-plugin| for your language. See |b:match_words| below for how
+this variable is interpreted.
+
+TROUBLESHOOTING *matchit-troubleshoot*
+
+The script should work in most installations of Vim. It may not work if Vim
+was compiled with a minimal feature set, for example if the |+syntax| option
+was not enabled. If your Vim has support for syntax compiled in, but you do
+not have |syntax| highlighting turned on, matchit.vim should work, but it may
+fail to skip matching groups in comments and strings. If the |filetype|
+mechanism is turned off, the |b:match_words| variable will probably not be
+defined automatically.
+
+==============================================================================
+3. Configuration *matchit-configure*
+
+There are several variables that govern the behavior of matchit.vim. Note
+that these are variables local to the buffer, not options, so use |:let| to
+define them, not |:set|. Some of these variables have values that matter; for
+others, it only matters whether the variable has been defined. All of these
+can be defined in the |filetype-plugin| or autocommand that defines
+|b:match_words| or "on the fly."
+
+The main variable is |b:match_words|. It is described in the section below on
+supporting a new language.
+
+ *MatchError* *matchit-hl* *matchit-highlight*
+MatchError is the highlight group for error messages from the script. By
+default, it is linked to WarningMsg. If you do not want to be bothered by
+error messages, you can define this to be something invisible. For example,
+if you use the GUI version of Vim and your command line is normally white, you
+can do >
+ :hi MatchError guifg=white guibg=white
+<
+ *b:match_ignorecase*
+If you >
+ :let b:match_ignorecase = 1
+then matchit.vim acts as if 'ignorecase' is set: for example, "end" and "END"
+are equivalent. If you >
+ :let b:match_ignorecase = 0
+then matchit.vim treats "end" and "END" differently. (There will be no
+b:match_infercase option unless someone requests it.)
+
+ *b:match_debug*
+Define b:match_debug if you want debugging information to be saved. See
+|matchit-debug|, below.
+
+ *b:match_skip*
+If b:match_skip is defined, it is passed as the skip argument to
+|searchpair()|. This controls when matching structures are skipped, or
+ignored. By default, they are ignored inside comments and strings, as
+determined by the |syntax| mechanism. (If syntax highlighting is turned off,
+nothing is skipped.) You can set b:match_skip to a string, which evaluates to
+a non-zero, numerical value if the match is to be skipped or zero if the match
+should not be skipped. In addition, the following special values are
+supported by matchit.vim:
+ s:foo becomes (current syntax item) =~ foo
+ S:foo becomes (current syntax item) !~ foo
+ r:foo becomes (line before cursor) =~ foo
+ R:foo becomes (line before cursor) !~ foo
+(The "s" is meant to suggest "syntax", and the "r" is meant to suggest
+"regular expression".)
+
+Examples:
+
+ You can get the default behavior with >
+ :let b:match_skip = 's:comment\|string'
+<
+ If you want to skip matching structures unless they are at the start
+ of the line (ignoring whitespace) then you can >
+ :let b:match_skip = 'R:^\s*'
+< Do not do this if strings or comments can span several lines, since
+ the normal syntax checking will not be done if you set b:match_skip.
+
+ 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 escaped backslash followed by the
+ comment character) you can >
+ :let b:match_skip = 'r:\(^\|[^\\]\)\(\\\\\)*%'
+<
+==============================================================================
+4. Supporting a New Language *matchit-newlang*
+ *b:match_words*
+In order for matchit.vim to support a new language, you must define a suitable
+pattern for |b:match_words|. You may also want to set some of the
+|matchit-configure| variables, as described above. If your language has a
+complicated syntax, or many keywords, you will need to know something about
+Vim's |regular-expression|s.
+
+The format for |b:match_words| is similar to that of the 'matchpairs' option:
+it is a comma (,)-separated list of groups; each group is a colon(:)-separated
+list of patterns (regular expressions). Commas and backslashes that are part
+of a pattern should be escaped with backslashes ('\:' and '\,'). It is OK to
+have only one group; the effect is undefined if a group has only one pattern.
+A simple example is >
+ :let b:match_words = '\<if\>:\<endif\>,'
+ \ . '\<while\>:\<continue\>:\<break\>:\<endwhile\>'
+(In Vim regular expressions, |\<| and |\>| denote word boundaries. Thus "if"
+matches the end of "endif" but "\<if\>" does not.) Then banging on the "%"
+key will bounce the cursor between "if" and the matching "endif"; and from
+"while" to any matching "continue" or "break", then to the matching "endwhile"
+and back to the "while". It is almost always easier to use |literal-string|s
+(single quotes) as above: '\<if\>' rather than "\\<if\\>" and so on.
+
+Exception: If the ":" character does not appear in b:match_words, then it is
+treated as an expression to be evaluated. For example, >
+ :let b:match_words = 'GetMatchWords()'
+allows you to define a function. This can return a different string depending
+on the current syntax, for example.
+
+Once you have defined the appropriate value of |b:match_words|, you will
+probably want to have this set automatically each time you edit the
+appropriate file type. The recommended way to do this is by adding the
+definition to a |filetype-plugin| file.
+
+Tips: Be careful that your initial pattern does not match your final pattern.
+See the example above for the use of word-boundary expressions. It is usually
+better to use ".\{-}" (as many as necessary) instead of ".*" (as many as
+possible). See |\{-|. For example, in the string "<tag>label</tag>", "<.*>"
+matches the whole string whereas "<.\{-}>" and "<[^>]*>" match "<tag>" and
+"</tag>".
+
+ *matchit-spaces* *matchit-s:notend*
+If "if" is to be paired with "end if" (Note the space!) then word boundaries
+are not enough. Instead, define a regular expression s:notend that will match
+anything but "end" and use it as follows: >
+ :let s:notend = '\%(\<end\s\+\)\@<!'
+ :let b:match_words = s:notend . '\<if\>:\<end\s\+if\>'
+< *matchit-s:sol*
+This is a simplified version of what is done for Ada. The s:notend is a
+|script-variable|. Similarly, you may want to define a start-of-line regular
+expression >
+ :let s:sol = '\%(^\|;\)\s*'
+if keywords are only recognized after the start of a line or after a
+semicolon (;), with optional white space.
+
+ *matchit-backref* *matchit-\1*
+In any group, the expressions |\1|, |\2|, ..., |\9| refer to parts of the
+INITIAL pattern enclosed in |\(|escaped parentheses|\)|. These are referred
+to as back references, or backrefs. For example, >
+ :let b:match_words = '\<b\(o\+\)\>:\(h\)\1\>'
+means that "bo" pairs with "ho" and "boo" pairs with "hoo" and so on. Note
+that "\1" does not refer to the "\(h\)" in this example. If you have
+"\(nested \(parentheses\)\) then "\d" refers to the d-th "\(" and everything
+up to and including the matching "\)": in "\(nested\(parentheses\)\)", "\1"
+refers to everything and "\2" refers to "\(parentheses\)". If you use a
+variable such as |s:notend| or |s:sol| in the previous paragraph then remember
+to count any "\(" patterns in this variable. You do not have to count groups
+defined by |\%(\)|.
+
+It should be possible to resolve back references from any pattern in the
+group. For example, >
+ :let b:match_words = '\(foo\)\(bar\):more\1:and\2:end\1\2'
+would not work because "\2" cannot be determined from "morefoo" and "\1"
+cannot be determined from "andbar". On the other hand, >
+ :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1'
+should work (and have the same effect as "foobar:barfoo:endfoobar"), although
+this has not been thoroughly tested.
+
+You can use |zero-width| patterns such as |\@<=| and |\zs|. (The latter has
+not been thoroughly tested in matchit.vim.) For example, if the keyword "if"
+must occur at the start of the line, with optional white space, you might use
+the pattern "\(^\s*\)\@<=if" so that the cursor will end on the "i" instead of
+at the start of the line. For another example, if HTML had only one tag then
+one could >
+ :let b:match_words = '<:>,<\@<=tag>:<\@<=/tag>'
+so that "%" can bounce between matching "<" and ">" pairs or (starting on
+"tag" or "/tag") between matching tags. Without the |\@<=|, the script would
+bounce from "tag" to the "<" in "</tag>", and another "%" would not take you
+back to where you started.
+
+DEBUGGING *matchit-debug* *:MatchDebug*
+
+If you are having trouble figuring out the appropriate definition of
+|b:match_words| then you can take advantage of the same information I use when
+debugging the script. This is especially true if you are not sure whether
+your patterns or my script are at fault! To make this more convenient, I have
+made the command :MatchDebug, which defines the variable |b:match_debug| and
+creates a Matchit menu. This menu makes it convenient to check the values of
+the variables described below. You will probably also want to read
+|matchit-details| above.
+
+Defining the variable |b:match_debug| causes the script to set the following
+variables, each time you hit the "%" key. Several of these are only defined
+if |b:match_words| includes |backref|s.
+
+ *b:match_pat*
+The b:match_pat variable is set to |b:match_words| with |backref|s parsed.
+ *b:match_match*
+The b:match_match variable is set to the bit of text that is recognized as a
+match.
+ *b:match_col*
+The b:match_col variable is set to the cursor column of the start of the
+matching text.
+ *b:match_wholeBR*
+The b:match_wholeBR variable is set to the comma-separated group of patterns
+that matches, with |backref|s unparsed.
+ *b:match_iniBR*
+The b:match_iniBR variable is set to the first pattern in |b:match_wholeBR|.
+ *b:match_ini*
+The b:match_ini variable is set to the first pattern in |b:match_wholeBR|,
+with |backref|s resolved from |b:match_match|.
+ *b:match_tail*
+The b:match_tail variable is set to the remaining patterns in
+|b:match_wholeBR|, with |backref|s resolved from |b:match_match|.
+ *b:match_word*
+The b:match_word variable is set to the pattern from |b:match_wholeBR| that
+matches |b:match_match|.
+ *b:match_table*
+The back reference '\'.d refers to the same thing as '\'.b:match_table[d] in
+|b:match_word|.
+
+==============================================================================
+5. Known Bugs and Limitations *matchit-bugs*
+
+Repository: https://github.com/chrisbra/matchit/
+Bugs can be reported at the repository and the latest development snapshot can
+also be downloaded there.
+
+Just because I know about a bug does not mean that it is on my todo list. I
+try to respond to reports of bugs that cause real problems. If it does not
+cause serious problems, or if there is a work-around, a bug may sit there for
+a while. Moral: if a bug (known or not) bothers you, let me know.
+
+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". I may
+try to implement this in a future version. (This is not so easy to arrange as
+you might think!)
+
+==============================================================================
+vim:tw=78:ts=8:fo=tcq2:ft=help:
diff --git a/runtime/pack/dist/opt/matchit/doc/tags b/runtime/pack/dist/opt/matchit/doc/tags
new file mode 100644
index 0000000..4ccdc87
--- /dev/null
+++ b/runtime/pack/dist/opt/matchit/doc/tags
@@ -0,0 +1,50 @@
+:MatchDebug matchit.txt /*:MatchDebug*
+MatchError matchit.txt /*MatchError*
+[% matchit.txt /*[%*
+]% matchit.txt /*]%*
+b:match_col matchit.txt /*b:match_col*
+b:match_debug matchit.txt /*b:match_debug*
+b:match_ignorecase matchit.txt /*b:match_ignorecase*
+b:match_ini matchit.txt /*b:match_ini*
+b:match_iniBR matchit.txt /*b:match_iniBR*
+b:match_match matchit.txt /*b:match_match*
+b:match_pat matchit.txt /*b:match_pat*
+b:match_skip matchit.txt /*b:match_skip*
+b:match_table matchit.txt /*b:match_table*
+b:match_tail matchit.txt /*b:match_tail*
+b:match_wholeBR matchit.txt /*b:match_wholeBR*
+b:match_word matchit.txt /*b:match_word*
+b:match_words matchit.txt /*b:match_words*
+g% matchit.txt /*g%*
+matchit matchit.txt /*matchit*
+matchit-% matchit.txt /*matchit-%*
+matchit-\1 matchit.txt /*matchit-\\1*
+matchit-activate matchit.txt /*matchit-activate*
+matchit-backref matchit.txt /*matchit-backref*
+matchit-bugs matchit.txt /*matchit-bugs*
+matchit-choose matchit.txt /*matchit-choose*
+matchit-configure matchit.txt /*matchit-configure*
+matchit-debug matchit.txt /*matchit-debug*
+matchit-details matchit.txt /*matchit-details*
+matchit-highlight matchit.txt /*matchit-highlight*
+matchit-hl matchit.txt /*matchit-hl*
+matchit-intro matchit.txt /*matchit-intro*
+matchit-languages matchit.txt /*matchit-languages*
+matchit-modes matchit.txt /*matchit-modes*
+matchit-newlang matchit.txt /*matchit-newlang*
+matchit-o_% matchit.txt /*matchit-o_%*
+matchit-parse matchit.txt /*matchit-parse*
+matchit-s:notend matchit.txt /*matchit-s:notend*
+matchit-s:sol matchit.txt /*matchit-s:sol*
+matchit-spaces matchit.txt /*matchit-spaces*
+matchit-troubleshoot matchit.txt /*matchit-troubleshoot*
+matchit-v_% matchit.txt /*matchit-v_%*
+matchit.txt matchit.txt /*matchit.txt*
+matchit.vim matchit.txt /*matchit.vim*
+o_[% matchit.txt /*o_[%*
+o_]% matchit.txt /*o_]%*
+o_g% matchit.txt /*o_g%*
+v_[% matchit.txt /*v_[%*
+v_]% matchit.txt /*v_]%*
+v_a% matchit.txt /*v_a%*
+v_g% matchit.txt /*v_g%*
diff --git a/runtime/pack/dist/opt/matchit/plugin/matchit.vim b/runtime/pack/dist/opt/matchit/plugin/matchit.vim
new file mode 100644
index 0000000..51ba3a7
--- /dev/null
+++ b/runtime/pack/dist/opt/matchit/plugin/matchit.vim
@@ -0,0 +1,98 @@
+" matchit.vim: (global plugin) Extended "%" matching
+" Maintainer: Christian Brabandt
+" Version: 1.18
+" Last Change: 2020 Dec 23
+" Repository: https://github.com/chrisbra/matchit
+" Previous URL:http://www.vim.org/script.php?script_id=39
+" Previous Maintainer: Benji Fisher PhD <benji@member.AMS.org>
+
+" Documentation:
+" The documentation is in a separate file: ../doc/matchit.txt
+
+" Credits:
+" Vim editor by Bram Moolenaar (Thanks, Bram!)
+" Original script and design by Raul Segura Acevedo
+" Support for comments by Douglas Potts
+" Support for back references and other improvements by Benji Fisher
+" Support for many languages by Johannes Zellner
+" Suggestions for improvement, bug reports, and support for additional
+" languages by Jordi-Albert Batalla, Neil Bird, Servatius Brandt, Mark
+" Collett, Stephen Wall, Dany St-Amant, Yuheng Xie, and Johannes Zellner.
+
+" Debugging:
+" If you'd like to try the built-in debugging commands...
+" :MatchDebug to activate debugging for the current buffer
+" This saves the values of several key script variables as buffer-local
+" variables. See the MatchDebug() function, below, for details.
+
+" TODO: I should think about multi-line patterns for b:match_words.
+" This would require an option: how many lines to scan (default 1).
+" This would be useful for Python, maybe also for *ML.
+" TODO: Maybe I should add a menu so that people will actually use some of
+" the features that I have implemented.
+" TODO: Eliminate the MultiMatch function. Add yet another argument to
+" Match_wrapper() instead.
+" TODO: Allow :let b:match_words = '\(\(foo\)\(bar\)\):\3\2:end\1'
+" TODO: Make backrefs safer by using '\V' (very no-magic).
+" TODO: Add a level of indirection, so that custom % scripts can use my
+" work but extend it.
+
+" Allow user to prevent loading and prevent duplicate loading.
+if exists("g:loaded_matchit") || &cp
+ finish
+endif
+let g:loaded_matchit = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+nnoremap <silent> <Plug>(MatchitNormalForward) :<C-U>call matchit#Match_wrapper('',1,'n')<CR>
+nnoremap <silent> <Plug>(MatchitNormalBackward) :<C-U>call matchit#Match_wrapper('',0,'n')<CR>
+xnoremap <silent> <Plug>(MatchitVisualForward) :<C-U>call matchit#Match_wrapper('',1,'v')<CR>
+ \:if col("''") != col("$") \| exe ":normal! m'" \| endif<cr>gv``
+xnoremap <silent> <Plug>(MatchitVisualBackward) :<C-U>call matchit#Match_wrapper('',0,'v')<CR>m'gv``
+onoremap <silent> <Plug>(MatchitOperationForward) :<C-U>call matchit#Match_wrapper('',1,'o')<CR>
+onoremap <silent> <Plug>(MatchitOperationBackward) :<C-U>call matchit#Match_wrapper('',0,'o')<CR>
+
+" Analogues of [{ and ]} using matching patterns:
+nnoremap <silent> <Plug>(MatchitNormalMultiBackward) :<C-U>call matchit#MultiMatch("bW", "n")<CR>
+nnoremap <silent> <Plug>(MatchitNormalMultiForward) :<C-U>call matchit#MultiMatch("W", "n")<CR>
+xnoremap <silent> <Plug>(MatchitVisualMultiBackward) :<C-U>call matchit#MultiMatch("bW", "n")<CR>m'gv``
+xnoremap <silent> <Plug>(MatchitVisualMultiForward) :<C-U>call matchit#MultiMatch("W", "n")<CR>m'gv``
+onoremap <silent> <Plug>(MatchitOperationMultiBackward) :<C-U>call matchit#MultiMatch("bW", "o")<CR>
+onoremap <silent> <Plug>(MatchitOperationMultiForward) :<C-U>call matchit#MultiMatch("W", "o")<CR>
+
+" text object:
+xmap <silent> <Plug>(MatchitVisualTextObject) <Plug>(MatchitVisualMultiBackward)o<Plug>(MatchitVisualMultiForward)
+
+if !exists("g:no_plugin_maps")
+ nmap <silent> % <Plug>(MatchitNormalForward)
+ nmap <silent> g% <Plug>(MatchitNormalBackward)
+ xmap <silent> % <Plug>(MatchitVisualForward)
+ xmap <silent> g% <Plug>(MatchitVisualBackward)
+ omap <silent> % <Plug>(MatchitOperationForward)
+ omap <silent> g% <Plug>(MatchitOperationBackward)
+
+ " Analogues of [{ and ]} using matching patterns:
+ nmap <silent> [% <Plug>(MatchitNormalMultiBackward)
+ nmap <silent> ]% <Plug>(MatchitNormalMultiForward)
+ xmap <silent> [% <Plug>(MatchitVisualMultiBackward)
+ xmap <silent> ]% <Plug>(MatchitVisualMultiForward)
+ omap <silent> [% <Plug>(MatchitOperationMultiBackward)
+ omap <silent> ]% <Plug>(MatchitOperationMultiForward)
+
+ " Text object
+ xmap a% <Plug>(MatchitVisualTextObject)
+endif
+
+" Call this function to turn on debugging information. Every time the main
+" script is run, buffer variables will be saved. These can be used directly
+" or viewed using the menu items below.
+if !exists(":MatchDebug")
+ command! -nargs=0 MatchDebug call matchit#Match_debug()
+endif
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim:sts=2:sw=2:et:
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 0000000..04b48b9
--- /dev/null
+++ b/runtime/pack/dist/opt/shellmenu/plugin/shellmenu.vim
@@ -0,0 +1,104 @@
+" 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.
+"
+" Maintainer: Ada (Haowen) Yu <me@yuhaowen.com>
+" Original author: Lennart Schultz <les@dmi.min.dk> (mail unreachable)
+
+" Make sure the '<' and 'C' flags are not included in 'cpoptions', otherwise
+" <CR> would not be recognized. See ":help 'cpoptions'".
+let s:cpo_save = &cpo
+set cpo&vim
+
+imenu ShellMenu.Statements.for for in <CR>do<CR><CR>done<esc>ki <esc>kk0elli
+imenu ShellMenu.Statements.case case in<CR>) ;;<CR>esac<esc>bki <esc>k0elli
+imenu ShellMenu.Statements.if if <CR>then<CR><CR>fi<esc>ki <esc>kk0elli
+imenu ShellMenu.Statements.if-else if <CR>then<CR><CR>else<CR><CR>fi<esc>ki <esc>kki <esc>kk0elli
+imenu ShellMenu.Statements.elif elif <CR>then<CR><CR><esc>ki <esc>kk0elli
+imenu ShellMenu.Statements.while while do<CR><CR>done<esc>ki <esc>kk0elli
+imenu ShellMenu.Statements.break break
+imenu ShellMenu.Statements.continue continue
+imenu ShellMenu.Statements.function () {<CR><CR>}<esc>ki <esc>k0i
+imenu ShellMenu.Statements.return return
+imenu ShellMenu.Statements.return-true return 0
+imenu ShellMenu.Statements.return-false return 1
+imenu ShellMenu.Statements.exit exit
+imenu ShellMenu.Statements.shift shift
+imenu ShellMenu.Statements.trap trap
+imenu ShellMenu.Test.Existence [ -e ]<esc>hi
+imenu ShellMenu.Test.Existence\ -\ file [ -f ]<esc>hi
+imenu ShellMenu.Test.Existence\ -\ file\ (not\ empty) [ -s ]<esc>hi
+imenu ShellMenu.Test.Existence\ -\ directory [ -d ]<esc>hi
+imenu ShellMenu.Test.Existence\ -\ executable [ -x ]<esc>hi
+imenu ShellMenu.Test.Existence\ -\ readable [ -r ]<esc>hi
+imenu ShellMenu.Test.Existence\ -\ writable [ -w ]<esc>hi
+imenu ShellMenu.Test.String\ is\ empty [ x = "x$" ]<esc>hhi
+imenu ShellMenu.Test.String\ is\ not\ empty [ x != "x$" ]<esc>hhi
+imenu ShellMenu.Test.Strings\ are\ equal [ "" = "" ]<esc>hhhhhhhi
+imenu ShellMenu.Test.Strings\ are\ not\ equal [ "" != "" ]<esc>hhhhhhhhi
+imenu ShellMenu.Test.Value\ is\ greater\ than [ -gt ]<esc>hhhhhhi
+imenu ShellMenu.Test.Value\ is\ greater\ equal [ -ge ]<esc>hhhhhhi
+imenu ShellMenu.Test.Values\ are\ equal [ -eq ]<esc>hhhhhhi
+imenu ShellMenu.Test.Values\ are\ not\ equal [ -ne ]<esc>hhhhhhi
+imenu ShellMenu.Test.Value\ is\ less\ than [ -lt ]<esc>hhhhhhi
+imenu ShellMenu.Test.Value\ is\ less\ equal [ -le ]<esc>hhhhhhi
+imenu ShellMenu.ParmSub.Substitute\ word\ if\ parm\ not\ set ${:-}<esc>hhi
+imenu ShellMenu.ParmSub.Set\ parm\ to\ word\ if\ not\ set ${:=}<esc>hhi
+imenu ShellMenu.ParmSub.Substitute\ word\ if\ parm\ set\ else\ nothing ${:+}<esc>hhi
+imenu ShellMenu.ParmSub.If\ parm\ not\ set\ print\ word\ and\ exit ${:?}<esc>hhi
+imenu ShellMenu.SpShVars.Number\ of\ positional\ parameters ${#}
+imenu ShellMenu.SpShVars.All\ positional\ parameters\ (quoted\ spaces) ${*}
+imenu ShellMenu.SpShVars.All\ positional\ parameters\ (unquoted\ spaces) ${@}
+imenu ShellMenu.SpShVars.Flags\ set ${-}
+imenu ShellMenu.SpShVars.Return\ code\ of\ last\ command ${?}
+imenu ShellMenu.SpShVars.Process\ number\ of\ this\ shell ${$}
+imenu ShellMenu.SpShVars.Process\ number\ of\ last\ background\ command ${!}
+imenu ShellMenu.Environ.HOME ${HOME}
+imenu ShellMenu.Environ.PATH ${PATH}
+imenu ShellMenu.Environ.CDPATH ${CDPATH}
+imenu ShellMenu.Environ.MAIL ${MAIL}
+imenu ShellMenu.Environ.MAILCHECK ${MAILCHECK}
+imenu ShellMenu.Environ.PS1 ${PS1}
+imenu ShellMenu.Environ.PS2 ${PS2}
+imenu ShellMenu.Environ.IFS ${IFS}
+imenu ShellMenu.Environ.SHACCT ${SHACCT}
+imenu ShellMenu.Environ.SHELL ${SHELL}
+imenu ShellMenu.Environ.LC_CTYPE ${LC_CTYPE}
+imenu ShellMenu.Environ.LC_MESSAGES ${LC_MESSAGES}
+imenu ShellMenu.Builtins.cd cd
+imenu ShellMenu.Builtins.echo echo
+imenu ShellMenu.Builtins.eval eval
+imenu ShellMenu.Builtins.exec exec
+imenu ShellMenu.Builtins.export export
+imenu ShellMenu.Builtins.getopts getopts
+imenu ShellMenu.Builtins.hash hash
+imenu ShellMenu.Builtins.newgrp newgrp
+imenu ShellMenu.Builtins.pwd pwd
+imenu ShellMenu.Builtins.read read
+imenu ShellMenu.Builtins.readonly readonly
+imenu ShellMenu.Builtins.return return
+imenu ShellMenu.Builtins.times times
+imenu ShellMenu.Builtins.type type
+imenu ShellMenu.Builtins.umask umask
+imenu ShellMenu.Builtins.wait wait
+imenu ShellMenu.Set.set set
+imenu ShellMenu.Set.unset unset
+imenu ShellMenu.Set.Mark\ created\ or\ modified\ variables\ for\ export set -a
+imenu ShellMenu.Set.Exit\ when\ command\ returns\ non-zero\ status set -e
+imenu ShellMenu.Set.Disable\ file\ name\ expansion set -f
+imenu ShellMenu.Set.Locate\ and\ remember\ commands\ when\ being\ looked\ up set -h
+imenu ShellMenu.Set.All\ assignment\ statements\ are\ placed\ in\ the\ environment\ for\ a\ command set -k
+imenu ShellMenu.Set.Read\ commands\ but\ do\ not\ execute\ them set -n
+imenu ShellMenu.Set.Exit\ after\ reading\ and\ executing\ one\ command set -t
+imenu ShellMenu.Set.Treat\ unset\ variables\ as\ an\ error\ when\ substituting set -u
+imenu ShellMenu.Set.Print\ shell\ input\ lines\ as\ they\ are\ read set -v
+imenu ShellMenu.Set.Print\ commands\ and\ their\ arguments\ as\ they\ are\ executed set -x
+
+" Restore the previous value of 'cpoptions'.
+let &cpo = s:cpo_save
+unlet s:cpo_save
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 0000000..8b85be0
--- /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 0000000..9fd4bcb
--- /dev/null
+++ b/runtime/pack/dist/opt/termdebug/plugin/termdebug.vim
@@ -0,0 +1,1527 @@
+" Debugger plugin using gdb.
+"
+" Author: Bram Moolenaar
+" Copyright: Vim license applies, see ":help license"
+" Last Change: 2022 Nov 10
+"
+" WORK IN PROGRESS - The basics works stable, more to come
+" Note: In general you need at least GDB 7.12 because this provides the
+" frame= response in MI thread-selected events we need to sync stack to file.
+" The one included with "old" MingW is too old (7.6.1), you may upgrade it or
+" use a newer version from http://www.equation.com/servlet/equation.cmd?fa=gdb
+"
+" There are two ways to run gdb:
+" - In a terminal window; used if possible, does not work on MS-Windows
+" Not used when g:termdebug_use_prompt is set to 1.
+" - Using a "prompt" buffer; may use a terminal window for the program
+"
+" For both the current window is used to view source code and shows the
+" current statement from gdb.
+"
+" USING A TERMINAL WINDOW
+"
+" Opens two visible terminal windows:
+" 1. runs a pty for the debugged program, as with ":term NONE"
+" 2. runs gdb, passing the pty of the debugged program
+" A third terminal window is hidden, it is used for communication with gdb.
+"
+" USING A PROMPT BUFFER
+"
+" Opens a window with a prompt buffer to communicate with gdb.
+" Gdb is run as a job with callbacks for I/O.
+" On Unix another terminal window is opened to run the debugged program
+" On MS-Windows a separate console is opened to run the debugged program
+"
+" The communication with gdb uses GDB/MI. See:
+" https://sourceware.org/gdb/current/onlinedocs/gdb/GDB_002fMI.html
+
+" In case this gets sourced twice.
+if exists(':Termdebug')
+ finish
+endif
+
+" Need either the +terminal feature or +channel and the prompt buffer.
+" The terminal feature does not work with gdb on win32.
+if has('terminal') && !has('win32')
+ let s:way = 'terminal'
+elseif has('channel') && exists('*prompt_setprompt')
+ let s:way = 'prompt'
+else
+ if has('terminal')
+ let s:err = 'Cannot debug, missing prompt buffer support'
+ else
+ let s:err = 'Cannot debug, +channel feature is not supported'
+ endif
+ command -nargs=* -complete=file -bang Termdebug echoerr s:err
+ command -nargs=+ -complete=file -bang TermdebugCommand echoerr s:err
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+" The command that starts debugging, e.g. ":Termdebug vim".
+" To end type "quit" in the gdb window.
+command -nargs=* -complete=file -bang Termdebug call s:StartDebug(<bang>0, <f-args>)
+command -nargs=+ -complete=file -bang TermdebugCommand call s:StartDebugCommand(<bang>0, <f-args>)
+
+let s:pc_id = 12
+let s:asm_id = 13
+let s:break_id = 14 " breakpoint number is added to this
+let s:stopped = 1
+
+let s:parsing_disasm_msg = 0
+let s:asm_lines = []
+let s:asm_addr = ''
+
+" Take a breakpoint number as used by GDB and turn it into an integer.
+" The breakpoint may contain a dot: 123.4 -> 123004
+" The main breakpoint has a zero subid.
+func s:Breakpoint2SignNumber(id, subid)
+ return s:break_id + a:id * 1000 + a:subid
+endfunction
+
+func s:Highlight(init, old, new)
+ let default = a:init ? 'default ' : ''
+ if a:new ==# 'light' && a:old !=# 'light'
+ exe "hi " . default . "debugPC term=reverse ctermbg=lightblue guibg=lightblue"
+ elseif a:new ==# 'dark' && a:old !=# 'dark'
+ exe "hi " . default . "debugPC term=reverse ctermbg=darkblue guibg=darkblue"
+ endif
+endfunc
+
+call s:Highlight(1, '', &background)
+hi default debugBreakpoint term=reverse ctermbg=red guibg=red
+hi default debugBreakpointDisabled term=reverse ctermbg=gray guibg=gray
+
+" Get the command to execute the debugger as a list, defaults to ["gdb"].
+func s:GetCommand()
+ if exists('g:termdebug_config')
+ let cmd = get(g:termdebug_config, 'command', 'gdb')
+ elseif exists('g:termdebugger')
+ let cmd = g:termdebugger
+ else
+ let cmd = 'gdb'
+ endif
+
+ return type(cmd) == v:t_list ? copy(cmd) : [cmd]
+endfunc
+
+func s:StartDebug(bang, ...)
+ " First argument is the command to debug, second core file or process ID.
+ call s:StartDebug_internal({'gdb_args': a:000, 'bang': a:bang})
+endfunc
+
+func s:StartDebugCommand(bang, ...)
+ " First argument is the command to debug, rest are run arguments.
+ call s:StartDebug_internal({'gdb_args': [a:1], 'proc_args': a:000[1:], 'bang': a:bang})
+endfunc
+
+func s:StartDebug_internal(dict)
+ if exists('s:gdbwin')
+ echoerr 'Terminal debugger already running, cannot run two'
+ return
+ endif
+ let gdbcmd = s:GetCommand()
+ if !executable(gdbcmd[0])
+ echoerr 'Cannot execute debugger program "' .. gdbcmd[0] .. '"'
+ return
+ endif
+
+ let s:ptywin = 0
+ let s:pid = 0
+ let s:asmwin = 0
+
+ if exists('#User#TermdebugStartPre')
+ doauto <nomodeline> User TermdebugStartPre
+ endif
+
+ " Uncomment this line to write logging in "debuglog".
+ " call ch_logfile('debuglog', 'w')
+
+ let s:sourcewin = win_getid(winnr())
+
+ " Remember the old value of 'signcolumn' for each buffer that it's set in, so
+ " that we can restore the value for all buffers.
+ let b:save_signcolumn = &signcolumn
+ let s:signcolumn_buflist = [bufnr()]
+
+ let s:save_columns = 0
+ let s:allleft = 0
+ let wide = 0
+ if exists('g:termdebug_config')
+ let wide = get(g:termdebug_config, 'wide', 0)
+ elseif exists('g:termdebug_wide')
+ let wide = g:termdebug_wide
+ endif
+ if wide > 0
+ if &columns < wide
+ let s:save_columns = &columns
+ let &columns = wide
+ " If we make the Vim window wider, use the whole left half for the debug
+ " windows.
+ let s:allleft = 1
+ endif
+ let s:vertical = 1
+ else
+ let s:vertical = 0
+ endif
+
+ " Override using a terminal window by setting g:termdebug_use_prompt to 1.
+ let use_prompt = 0
+ if exists('g:termdebug_config')
+ let use_prompt = get(g:termdebug_config, 'use_prompt', 0)
+ elseif exists('g:termdebug_use_prompt')
+ let use_prompt = g:termdebug_use_prompt
+ endif
+ if has('terminal') && !has('win32') && !use_prompt
+ let s:way = 'terminal'
+ else
+ let s:way = 'prompt'
+ endif
+
+ if s:way == 'prompt'
+ call s:StartDebug_prompt(a:dict)
+ else
+ call s:StartDebug_term(a:dict)
+ endif
+
+ if s:GetDisasmWindow()
+ let curwinid = win_getid(winnr())
+ call s:GotoAsmwinOrCreateIt()
+ call win_gotoid(curwinid)
+ endif
+
+ if exists('#User#TermdebugStartPost')
+ doauto <nomodeline> User TermdebugStartPost
+ endif
+endfunc
+
+" Use when debugger didn't start or ended.
+func s:CloseBuffers()
+ exe 'bwipe! ' . s:ptybuf
+ exe 'bwipe! ' . s:commbuf
+ unlet! s:gdbwin
+endfunc
+
+func s:CheckGdbRunning()
+ let gdbproc = term_getjob(s:gdbbuf)
+ if gdbproc == v:null || job_status(gdbproc) !=# 'run'
+ echoerr string(s:GetCommand()[0]) . ' exited unexpectedly'
+ call s:CloseBuffers()
+ return ''
+ endif
+ return 'ok'
+endfunc
+
+" Open a terminal window without a job, to run the debugged program in.
+func s:StartDebug_term(dict)
+ let s:ptybuf = term_start('NONE', {
+ \ 'term_name': 'debugged program',
+ \ 'vertical': s:vertical,
+ \ })
+ if s:ptybuf == 0
+ echoerr 'Failed to open the program terminal window'
+ return
+ endif
+ let pty = job_info(term_getjob(s:ptybuf))['tty_out']
+ let s:ptywin = win_getid(winnr())
+ if s:vertical
+ " Assuming the source code window will get a signcolumn, use two more
+ " columns for that, thus one less for the terminal window.
+ exe (&columns / 2 - 1) . "wincmd |"
+ if s:allleft
+ " use the whole left column
+ wincmd H
+ endif
+ endif
+
+ " Create a hidden terminal window to communicate with gdb
+ let s:commbuf = term_start('NONE', {
+ \ 'term_name': 'gdb communication',
+ \ 'out_cb': function('s:CommOutput'),
+ \ 'hidden': 1,
+ \ })
+ if s:commbuf == 0
+ echoerr 'Failed to open the communication terminal window'
+ exe 'bwipe! ' . s:ptybuf
+ return
+ endif
+ let commpty = job_info(term_getjob(s:commbuf))['tty_out']
+
+ let gdb_args = get(a:dict, 'gdb_args', [])
+ let proc_args = get(a:dict, 'proc_args', [])
+
+ let gdb_cmd = s:GetCommand()
+
+ if exists('g:termdebug_config') && has_key(g:termdebug_config, 'command_add_args')
+ let gdb_cmd = g:termdebug_config.command_add_args(gdb_cmd, pty)
+ else
+ " Add -quiet to avoid the intro message causing a hit-enter prompt.
+ let gdb_cmd += ['-quiet']
+ " Disable pagination, it causes everything to stop at the gdb
+ let gdb_cmd += ['-iex', 'set pagination off']
+ " Interpret commands while the target is running. This should usually only
+ " be exec-interrupt, since many commands don't work properly while the
+ " target is running (so execute during startup).
+ let gdb_cmd += ['-iex', 'set mi-async on']
+ " Open a terminal window to run the debugger.
+ let gdb_cmd += ['-tty', pty]
+ " Command executed _after_ startup is done, provides us with the necessary
+ " feedback
+ let gdb_cmd += ['-ex', 'echo startupdone\n']
+ endif
+
+ if exists('g:termdebug_config') && has_key(g:termdebug_config, 'command_filter')
+ let gdb_cmd = g:termdebug_config.command_filter(gdb_cmd)
+ endif
+
+ " Adding arguments requested by the user
+ let gdb_cmd += gdb_args
+
+ call ch_log('executing "' . join(gdb_cmd) . '"')
+ let s:gdbbuf = term_start(gdb_cmd, {
+ \ 'term_finish': 'close',
+ \ })
+ if s:gdbbuf == 0
+ echoerr 'Failed to open the gdb terminal window'
+ call s:CloseBuffers()
+ return
+ endif
+ let s:gdbwin = win_getid(winnr())
+
+ " Wait for the "startupdone" message before sending any commands.
+ let try_count = 0
+ while 1
+ if s:CheckGdbRunning() != 'ok'
+ return
+ endif
+
+ for lnum in range(1, 200)
+ if term_getline(s:gdbbuf, lnum) =~ 'startupdone'
+ let try_count = 9999
+ break
+ endif
+ endfor
+ let try_count += 1
+ if try_count > 300
+ " done or give up after five seconds
+ break
+ endif
+ sleep 10m
+ endwhile
+
+ " Set arguments to be run.
+ if len(proc_args)
+ call term_sendkeys(s:gdbbuf, 'server set args ' . join(proc_args) . "\r")
+ endif
+
+ " Connect gdb to the communication pty, using the GDB/MI interface.
+ " Prefix "server" to avoid adding this to the history.
+ call term_sendkeys(s:gdbbuf, 'server new-ui mi ' . commpty . "\r")
+
+ " Wait for the response to show up, users may not notice the error and wonder
+ " why the debugger doesn't work.
+ let try_count = 0
+ while 1
+ if s:CheckGdbRunning() != 'ok'
+ return
+ endif
+
+ let response = ''
+ for lnum in range(1, 200)
+ let line1 = term_getline(s:gdbbuf, lnum)
+ let line2 = term_getline(s:gdbbuf, lnum + 1)
+ if line1 =~ 'new-ui mi '
+ " response can be in the same line or the next line
+ let response = line1 . line2
+ if response =~ 'Undefined command'
+ echoerr 'Sorry, your gdb is too old, gdb 7.12 is required'
+ " CHECKME: possibly send a "server show version" here
+ call s:CloseBuffers()
+ return
+ endif
+ if response =~ 'New UI allocated'
+ " Success!
+ break
+ endif
+ elseif line1 =~ 'Reading symbols from' && line2 !~ 'new-ui mi '
+ " Reading symbols might take a while, try more times
+ let try_count -= 1
+ endif
+ endfor
+ if response =~ 'New UI allocated'
+ break
+ endif
+ let try_count += 1
+ if try_count > 100
+ echoerr 'Cannot check if your gdb works, continuing anyway'
+ break
+ endif
+ sleep 10m
+ endwhile
+
+ call job_setoptions(term_getjob(s:gdbbuf), {'exit_cb': function('s:EndTermDebug')})
+
+ " Set the filetype, this can be used to add mappings.
+ set filetype=termdebug
+
+ call s:StartDebugCommon(a:dict)
+endfunc
+
+" Open a window with a prompt buffer to run gdb in.
+func s:StartDebug_prompt(dict)
+ if s:vertical
+ vertical new
+ else
+ new
+ endif
+ let s:gdbwin = win_getid(winnr())
+ let s:promptbuf = bufnr('')
+ call prompt_setprompt(s:promptbuf, 'gdb> ')
+ set buftype=prompt
+ file gdb
+ call prompt_setcallback(s:promptbuf, function('s:PromptCallback'))
+ call prompt_setinterrupt(s:promptbuf, function('s:PromptInterrupt'))
+
+ if s:vertical
+ " Assuming the source code window will get a signcolumn, use two more
+ " columns for that, thus one less for the terminal window.
+ exe (&columns / 2 - 1) . "wincmd |"
+ endif
+
+ let gdb_args = get(a:dict, 'gdb_args', [])
+ let proc_args = get(a:dict, 'proc_args', [])
+
+ let gdb_cmd = s:GetCommand()
+ " Add -quiet to avoid the intro message causing a hit-enter prompt.
+ let gdb_cmd += ['-quiet']
+ " Disable pagination, it causes everything to stop at the gdb, needs to be run early
+ let gdb_cmd += ['-iex', 'set pagination off']
+ " Interpret commands while the target is running. This should usually only
+ " be exec-interrupt, since many commands don't work properly while the
+ " target is running (so execute during startup).
+ let gdb_cmd += ['-iex', 'set mi-async on']
+ " directly communicate via mi2
+ let gdb_cmd += ['--interpreter=mi2']
+
+ " Adding arguments requested by the user
+ let gdb_cmd += gdb_args
+
+ call ch_log('executing "' . join(gdb_cmd) . '"')
+ let s:gdbjob = job_start(gdb_cmd, {
+ \ 'exit_cb': function('s:EndPromptDebug'),
+ \ 'out_cb': function('s:GdbOutCallback'),
+ \ })
+ if job_status(s:gdbjob) != "run"
+ echoerr 'Failed to start gdb'
+ exe 'bwipe! ' . s:promptbuf
+ return
+ endif
+ " Mark the buffer modified so that it's not easy to close.
+ set modified
+ let s:gdb_channel = job_getchannel(s:gdbjob)
+
+ let s:ptybuf = 0
+ if has('win32')
+ " MS-Windows: run in a new console window for maximum compatibility
+ call s:SendCommand('set new-console on')
+ elseif has('terminal')
+ " Unix: Run the debugged program in a terminal window. Open it below the
+ " gdb window.
+ belowright let s:ptybuf = term_start('NONE', {
+ \ 'term_name': 'debugged program',
+ \ })
+ if s:ptybuf == 0
+ echoerr 'Failed to open the program terminal window'
+ call job_stop(s:gdbjob)
+ return
+ endif
+ let s:ptywin = win_getid(winnr())
+ let pty = job_info(term_getjob(s:ptybuf))['tty_out']
+ call s:SendCommand('tty ' . pty)
+
+ " Since GDB runs in a prompt window, the environment has not been set to
+ " match a terminal window, need to do that now.
+ call s:SendCommand('set env TERM = xterm-color')
+ call s:SendCommand('set env ROWS = ' . winheight(s:ptywin))
+ call s:SendCommand('set env LINES = ' . winheight(s:ptywin))
+ call s:SendCommand('set env COLUMNS = ' . winwidth(s:ptywin))
+ call s:SendCommand('set env COLORS = ' . &t_Co)
+ call s:SendCommand('set env VIM_TERMINAL = ' . v:version)
+ else
+ " TODO: open a new terminal, get the tty name, pass on to gdb
+ call s:SendCommand('show inferior-tty')
+ endif
+ call s:SendCommand('set print pretty on')
+ call s:SendCommand('set breakpoint pending on')
+
+ " Set arguments to be run
+ if len(proc_args)
+ call s:SendCommand('set args ' . join(proc_args))
+ endif
+
+ call s:StartDebugCommon(a:dict)
+ startinsert
+endfunc
+
+func s:StartDebugCommon(dict)
+ " Sign used to highlight the line where the program has stopped.
+ " There can be only one.
+ call sign_define('debugPC', #{linehl: 'debugPC'})
+
+ " Install debugger commands in the text window.
+ call win_gotoid(s:sourcewin)
+ call s:InstallCommands()
+ call win_gotoid(s:gdbwin)
+
+ " Enable showing a balloon with eval info
+ if has("balloon_eval") || has("balloon_eval_term")
+ set balloonexpr=TermDebugBalloonExpr()
+ if has("balloon_eval")
+ set ballooneval
+ endif
+ if has("balloon_eval_term")
+ set balloonevalterm
+ endif
+ endif
+
+ " Contains breakpoints that have been placed, key is a string with the GDB
+ " breakpoint number.
+ " Each entry is a dict, containing the sub-breakpoints. Key is the subid.
+ " For a breakpoint that is just a number the subid is zero.
+ " For a breakpoint "123.4" the id is "123" and subid is "4".
+ " Example, when breakpoint "44", "123", "123.1" and "123.2" exist:
+ " {'44': {'0': entry}, '123': {'0': entry, '1': entry, '2': entry}}
+ let s:breakpoints = {}
+
+ " Contains breakpoints by file/lnum. The key is "fname:lnum".
+ " Each entry is a list of breakpoint IDs at that position.
+ let s:breakpoint_locations = {}
+
+ augroup TermDebug
+ au BufRead * call s:BufRead()
+ au BufUnload * call s:BufUnloaded()
+ au OptionSet background call s:Highlight(0, v:option_old, v:option_new)
+ augroup END
+
+ " Run the command if the bang attribute was given and got to the debug
+ " window.
+ if get(a:dict, 'bang', 0)
+ call s:SendResumingCommand('-exec-run')
+ call win_gotoid(s:ptywin)
+ endif
+endfunc
+
+" Send a command to gdb. "cmd" is the string without line terminator.
+func s:SendCommand(cmd)
+ call ch_log('sending to gdb: ' . a:cmd)
+ if s:way == 'prompt'
+ call ch_sendraw(s:gdb_channel, a:cmd . "\n")
+ else
+ call term_sendkeys(s:commbuf, a:cmd . "\r")
+ endif
+endfunc
+
+" This is global so that a user can create their mappings with this.
+func TermDebugSendCommand(cmd)
+ if s:way == 'prompt'
+ call ch_sendraw(s:gdb_channel, a:cmd . "\n")
+ else
+ let do_continue = 0
+ if !s:stopped
+ let do_continue = 1
+ Stop
+ sleep 10m
+ endif
+ " TODO: should we prepend CTRL-U to clear the command?
+ call term_sendkeys(s:gdbbuf, a:cmd . "\r")
+ if do_continue
+ Continue
+ endif
+ endif
+endfunc
+
+" Send a command that resumes the program. If the program isn't stopped the
+" command is not sent (to avoid a repeated command to cause trouble).
+" If the command is sent then reset s:stopped.
+func s:SendResumingCommand(cmd)
+ if s:stopped
+ " reset s:stopped here, it may take a bit of time before we get a response
+ let s:stopped = 0
+ call ch_log('assume that program is running after this command')
+ call s:SendCommand(a:cmd)
+ else
+ call ch_log('dropping command, program is running: ' . a:cmd)
+ endif
+endfunc
+
+" Function called when entering a line in the prompt buffer.
+func s:PromptCallback(text)
+ call s:SendCommand(a:text)
+endfunc
+
+" Function called when pressing CTRL-C in the prompt buffer and when placing a
+" breakpoint.
+func s:PromptInterrupt()
+ call ch_log('Interrupting gdb')
+ if has('win32')
+ " Using job_stop() does not work on MS-Windows, need to send SIGTRAP to
+ " the debugger program so that gdb responds again.
+ if s:pid == 0
+ echoerr 'Cannot interrupt gdb, did not find a process ID'
+ else
+ call debugbreak(s:pid)
+ endif
+ else
+ call job_stop(s:gdbjob, 'int')
+ endif
+endfunc
+
+" Function called when gdb outputs text.
+func s:GdbOutCallback(channel, text)
+ call ch_log('received from gdb: ' . a:text)
+
+ " Drop the gdb prompt, we have our own.
+ " Drop status and echo'd commands.
+ if a:text == '(gdb) ' || a:text == '^done' || a:text[0] == '&'
+ return
+ endif
+ if a:text =~ '^\^error,msg='
+ let text = s:DecodeMessage(a:text[11:])
+ if exists('s:evalexpr') && text =~ 'A syntax error in expression, near\|No symbol .* in current context'
+ " Silently drop evaluation errors.
+ unlet s:evalexpr
+ return
+ endif
+ elseif a:text[0] == '~'
+ let text = s:DecodeMessage(a:text[1:])
+ else
+ call s:CommOutput(a:channel, a:text)
+ return
+ endif
+
+ let curwinid = win_getid(winnr())
+ call win_gotoid(s:gdbwin)
+
+ " Add the output above the current prompt.
+ call append(line('$') - 1, text)
+ set modified
+
+ call win_gotoid(curwinid)
+endfunc
+
+" Decode a message from gdb. quotedText starts with a ", return the text up
+" to the next ", unescaping characters:
+" - remove line breaks
+" - change \\t to \t
+" - change \0xhh to \xhh (disabled for now)
+" - change \ooo to octal
+" - change \\ to \
+func s:DecodeMessage(quotedText)
+ if a:quotedText[0] != '"'
+ echoerr 'DecodeMessage(): missing quote in ' . a:quotedText
+ return
+ endif
+ return a:quotedText
+ \ ->substitute('^"\|".*\|\\n', '', 'g')
+ \ ->substitute('\\t', "\t", 'g')
+ " multi-byte characters arrive in octal form
+ " NULL-values must be kept encoded as those break the string otherwise
+ \ ->substitute('\\000', s:NullRepl, 'g')
+ \ ->substitute('\\\o\o\o', {-> eval('"' .. submatch(0) .. '"')}, 'g')
+ " Note: GDB docs also mention hex encodings - the translations below work
+ " but we keep them out for performance-reasons until we actually see
+ " those in mi-returns
+ " \ ->substitute('\\0x\(\x\x\)', {-> eval('"\x' .. submatch(1) .. '"')}, 'g')
+ " \ ->substitute('\\0x00', s:NullRepl, 'g')
+ \ ->substitute('\\\\', '\', 'g')
+ \ ->substitute(s:NullRepl, '\\000', 'g')
+endfunc
+const s:NullRepl = 'XXXNULLXXX'
+
+" Extract the "name" value from a gdb message with fullname="name".
+func s:GetFullname(msg)
+ if a:msg !~ 'fullname'
+ return ''
+ endif
+ let name = s:DecodeMessage(substitute(a:msg, '.*fullname=', '', ''))
+ if has('win32') && name =~ ':\\\\'
+ " sometimes the name arrives double-escaped
+ let name = substitute(name, '\\\\', '\\', 'g')
+ endif
+ return name
+endfunc
+
+" Extract the "addr" value from a gdb message with addr="0x0001234".
+func s:GetAsmAddr(msg)
+ if a:msg !~ 'addr='
+ return ''
+ endif
+ let addr = s:DecodeMessage(substitute(a:msg, '.*addr=', '', ''))
+ return addr
+endfunc
+
+func s:EndTermDebug(job, status)
+ if exists('#User#TermdebugStopPre')
+ doauto <nomodeline> User TermdebugStopPre
+ endif
+
+ exe 'bwipe! ' . s:commbuf
+ unlet s:gdbwin
+
+ call s:EndDebugCommon()
+endfunc
+
+func s:EndDebugCommon()
+ let curwinid = win_getid(winnr())
+
+ if exists('s:ptybuf') && s:ptybuf
+ exe 'bwipe! ' . s:ptybuf
+ endif
+
+ " Restore 'signcolumn' in all buffers for which it was set.
+ call win_gotoid(s:sourcewin)
+ let was_buf = bufnr()
+ for bufnr in s:signcolumn_buflist
+ if bufexists(bufnr)
+ exe bufnr .. "buf"
+ if exists('b:save_signcolumn')
+ let &signcolumn = b:save_signcolumn
+ unlet b:save_signcolumn
+ endif
+ endif
+ endfor
+ if bufexists(was_buf)
+ exe was_buf .. "buf"
+ endif
+
+ call s:DeleteCommands()
+
+ call win_gotoid(curwinid)
+
+ if s:save_columns > 0
+ let &columns = s:save_columns
+ endif
+
+ if has("balloon_eval") || has("balloon_eval_term")
+ set balloonexpr=
+ if has("balloon_eval")
+ set noballooneval
+ endif
+ if has("balloon_eval_term")
+ set noballoonevalterm
+ endif
+ endif
+
+ if exists('#User#TermdebugStopPost')
+ doauto <nomodeline> User TermdebugStopPost
+ endif
+
+ au! TermDebug
+endfunc
+
+func s:EndPromptDebug(job, status)
+ if exists('#User#TermdebugStopPre')
+ doauto <nomodeline> User TermdebugStopPre
+ endif
+
+ let curwinid = win_getid(winnr())
+ call win_gotoid(s:gdbwin)
+ set nomodified
+ close
+ if curwinid != s:gdbwin
+ call win_gotoid(curwinid)
+ endif
+
+ call s:EndDebugCommon()
+ unlet s:gdbwin
+ call ch_log("Returning from EndPromptDebug()")
+endfunc
+
+" Disassembly window - added by Michael Sartain
+"
+" - CommOutput: disassemble $pc
+" - CommOutput: &"disassemble $pc\n"
+" - CommOutput: ~"Dump of assembler code for function main(int, char**):\n"
+" - CommOutput: ~" 0x0000555556466f69 <+0>:\tpush rbp\n"
+" ...
+" - CommOutput: ~" 0x0000555556467cd0:\tpop rbp\n"
+" - CommOutput: ~" 0x0000555556467cd1:\tret \n"
+" - CommOutput: ~"End of assembler dump.\n"
+" - CommOutput: ^done
+
+" - CommOutput: disassemble $pc
+" - CommOutput: &"disassemble $pc\n"
+" - CommOutput: &"No function contains specified address.\n"
+" - CommOutput: ^error,msg="No function contains specified address."
+func s:HandleDisasmMsg(msg)
+ if a:msg =~ '^\^done'
+ let curwinid = win_getid(winnr())
+ if win_gotoid(s:asmwin)
+ silent normal! gg0"_dG
+ call setline(1, s:asm_lines)
+ set nomodified
+ set filetype=asm
+
+ let lnum = search('^' . s:asm_addr)
+ if lnum != 0
+ call sign_unplace('TermDebug', #{id: s:asm_id})
+ call sign_place(s:asm_id, 'TermDebug', 'debugPC', '%', #{lnum: lnum})
+ endif
+
+ call win_gotoid(curwinid)
+ endif
+
+ let s:parsing_disasm_msg = 0
+ let s:asm_lines = []
+ elseif a:msg =~ '^\^error,msg='
+ if s:parsing_disasm_msg == 1
+ " Disassemble call ran into an error. This can happen when gdb can't
+ " find the function frame address, so let's try to disassemble starting
+ " at current PC
+ call s:SendCommand('disassemble $pc,+100')
+ endif
+ let s:parsing_disasm_msg = 0
+ elseif a:msg =~ '\&\"disassemble \$pc'
+ if a:msg =~ '+100'
+ " This is our second disasm attempt
+ let s:parsing_disasm_msg = 2
+ endif
+ else
+ let value = substitute(a:msg, '^\~\"[ ]*', '', '')
+ let value = substitute(value, '^=>[ ]*', '', '')
+ let value = substitute(value, '\\n\"\r$', '', '')
+ let value = substitute(value, '\\n\"$', '', '')
+ let value = substitute(value, '\r', '', '')
+ let value = substitute(value, '\\t', ' ', 'g')
+
+ if value != '' || !empty(s:asm_lines)
+ call add(s:asm_lines, value)
+ endif
+ endif
+endfunc
+
+" Handle a message received from gdb on the GDB/MI interface.
+func s:CommOutput(chan, msg)
+ let msgs = split(a:msg, "\r")
+
+ for msg in msgs
+ " remove prefixed NL
+ if msg[0] == "\n"
+ let msg = msg[1:]
+ endif
+
+ if s:parsing_disasm_msg
+ call s:HandleDisasmMsg(msg)
+ elseif msg != ''
+ if msg =~ '^\(\*stopped\|\*running\|=thread-selected\)'
+ call s:HandleCursor(msg)
+ elseif msg =~ '^\^done,bkpt=' || msg =~ '^=breakpoint-created,'
+ call s:HandleNewBreakpoint(msg, 0)
+ elseif msg =~ '^=breakpoint-modified,'
+ call s:HandleNewBreakpoint(msg, 1)
+ elseif msg =~ '^=breakpoint-deleted,'
+ call s:HandleBreakpointDelete(msg)
+ elseif msg =~ '^=thread-group-started'
+ call s:HandleProgramRun(msg)
+ elseif msg =~ '^\^done,value='
+ call s:HandleEvaluate(msg)
+ elseif msg =~ '^\^error,msg='
+ call s:HandleError(msg)
+ elseif msg =~ '^disassemble'
+ let s:parsing_disasm_msg = 1
+ let s:asm_lines = []
+ endif
+ endif
+ endfor
+endfunc
+
+func s:GotoProgram()
+ if has('win32')
+ if executable('powershell')
+ call system(printf('powershell -Command "add-type -AssemblyName microsoft.VisualBasic;[Microsoft.VisualBasic.Interaction]::AppActivate(%d);"', s:pid))
+ endif
+ else
+ call win_gotoid(s:ptywin)
+ endif
+endfunc
+
+" Install commands in the current window to control the debugger.
+func s:InstallCommands()
+ let save_cpo = &cpo
+ set cpo&vim
+
+ command -nargs=? Break call s:SetBreakpoint(<q-args>)
+ command Clear call s:ClearBreakpoint()
+ command Step call s:SendResumingCommand('-exec-step')
+ command Over call s:SendResumingCommand('-exec-next')
+ command -nargs=? Until call s:Until(<q-args>)
+ command Finish call s:SendResumingCommand('-exec-finish')
+ command -nargs=* Run call s:Run(<q-args>)
+ command -nargs=* Arguments call s:SendResumingCommand('-exec-arguments ' . <q-args>)
+
+ if s:way == 'prompt'
+ command Stop call s:PromptInterrupt()
+ command Continue call s:SendCommand('continue')
+ else
+ command Stop call s:SendCommand('-exec-interrupt')
+ " using -exec-continue results in CTRL-C in the gdb window not working,
+ " communicating via commbuf (= use of SendCommand) has the same result
+ "command Continue call s:SendCommand('-exec-continue')
+ command Continue call term_sendkeys(s:gdbbuf, "continue\r")
+ endif
+
+ command -range -nargs=* Evaluate call s:Evaluate(<range>, <q-args>)
+ command Gdb call win_gotoid(s:gdbwin)
+ command Program call s:GotoProgram()
+ command Source call s:GotoSourcewinOrCreateIt()
+ command Asm call s:GotoAsmwinOrCreateIt()
+ command Winbar call s:InstallWinbar()
+
+ let map = 1
+ if exists('g:termdebug_config')
+ let map = get(g:termdebug_config, 'map_K', 1)
+ elseif exists('g:termdebug_map_K')
+ let map = g:termdebug_map_K
+ endif
+ if map
+ let s:k_map_saved = maparg('K', 'n', 0, 1)
+ nnoremap K :Evaluate<CR>
+ endif
+
+ if has('menu') && &mouse != ''
+ " install the window toolbar by default, can be disabled in the config
+ let winbar = 1
+ if exists('g:termdebug_config')
+ let winbar = get(g:termdebug_config, 'winbar', 1)
+ endif
+ if winbar
+ call s:InstallWinbar()
+ endif
+
+ let popup = 1
+ if exists('g:termdebug_config')
+ let popup = get(g:termdebug_config, 'popup', 1)
+ elseif exists('g:termdebug_popup')
+ let popup = g:termdebug_popup
+ endif
+ if popup
+ let s:saved_mousemodel = &mousemodel
+ let &mousemodel = 'popup_setpos'
+ an 1.200 PopUp.-SEP3- <Nop>
+ an 1.210 PopUp.Set\ breakpoint :Break<CR>
+ an 1.220 PopUp.Clear\ breakpoint :Clear<CR>
+ an 1.230 PopUp.Run\ until :Until<CR>
+ an 1.240 PopUp.Evaluate :Evaluate<CR>
+ endif
+ endif
+
+ let &cpo = save_cpo
+endfunc
+
+let s:winbar_winids = []
+
+" Install the window toolbar in the current window.
+func s:InstallWinbar()
+ if has('menu') && &mouse != ''
+ nnoremenu WinBar.Step :Step<CR>
+ nnoremenu WinBar.Next :Over<CR>
+ nnoremenu WinBar.Finish :Finish<CR>
+ nnoremenu WinBar.Cont :Continue<CR>
+ nnoremenu WinBar.Stop :Stop<CR>
+ nnoremenu WinBar.Eval :Evaluate<CR>
+ call add(s:winbar_winids, win_getid(winnr()))
+ endif
+endfunc
+
+" Delete installed debugger commands in the current window.
+func s:DeleteCommands()
+ delcommand Break
+ delcommand Clear
+ delcommand Step
+ delcommand Over
+ delcommand Until
+ delcommand Finish
+ delcommand Run
+ delcommand Arguments
+ delcommand Stop
+ delcommand Continue
+ delcommand Evaluate
+ delcommand Gdb
+ delcommand Program
+ delcommand Source
+ delcommand Asm
+ delcommand Winbar
+
+ if exists('s:k_map_saved')
+ if empty(s:k_map_saved)
+ nunmap K
+ else
+ call mapset(s:k_map_saved)
+ endif
+ unlet s:k_map_saved
+ endif
+
+ if has('menu')
+ " Remove the WinBar entries from all windows where it was added.
+ let curwinid = win_getid(winnr())
+ for winid in s:winbar_winids
+ if win_gotoid(winid)
+ aunmenu WinBar.Step
+ aunmenu WinBar.Next
+ aunmenu WinBar.Finish
+ aunmenu WinBar.Cont
+ aunmenu WinBar.Stop
+ aunmenu WinBar.Eval
+ endif
+ endfor
+ call win_gotoid(curwinid)
+ let s:winbar_winids = []
+
+ if exists('s:saved_mousemodel')
+ let &mousemodel = s:saved_mousemodel
+ unlet s:saved_mousemodel
+ aunmenu PopUp.-SEP3-
+ aunmenu PopUp.Set\ breakpoint
+ aunmenu PopUp.Clear\ breakpoint
+ aunmenu PopUp.Run\ until
+ aunmenu PopUp.Evaluate
+ endif
+ endif
+
+ call sign_unplace('TermDebug')
+ unlet s:breakpoints
+ unlet s:breakpoint_locations
+
+ call sign_undefine('debugPC')
+ call sign_undefine(s:BreakpointSigns->map("'debugBreakpoint' .. v:val"))
+ let s:BreakpointSigns = []
+endfunc
+
+" :Until - Execute until past a specified position or current line
+func s:Until(at)
+ if s:stopped
+ " reset s:stopped here, it may take a bit of time before we get a response
+ let s:stopped = 0
+ call ch_log('assume that program is running after this command')
+ " Use the fname:lnum format
+ let at = empty(a:at) ?
+ \ fnameescape(expand('%:p')) . ':' . line('.') : a:at
+ call s:SendCommand('-exec-until ' . at)
+ else
+ call ch_log('dropping command, program is running: exec-until')
+ endif
+endfunc
+
+" :Break - Set a breakpoint at the cursor position.
+func s:SetBreakpoint(at)
+ " Setting a breakpoint may not work while the program is running.
+ " Interrupt to make it work.
+ let do_continue = 0
+ if !s:stopped
+ let do_continue = 1
+ Stop
+ sleep 10m
+ endif
+
+ " Use the fname:lnum format, older gdb can't handle --source.
+ let at = empty(a:at) ?
+ \ fnameescape(expand('%:p')) . ':' . line('.') : a:at
+ call s:SendCommand('-break-insert ' . at)
+ if do_continue
+ Continue
+ endif
+endfunc
+
+" :Clear - Delete a breakpoint at the cursor position.
+func s:ClearBreakpoint()
+ let fname = fnameescape(expand('%:p'))
+ let lnum = line('.')
+ let bploc = printf('%s:%d', fname, lnum)
+ if has_key(s:breakpoint_locations, bploc)
+ let idx = 0
+ let nr = 0
+ for id in s:breakpoint_locations[bploc]
+ if has_key(s:breakpoints, id)
+ " Assume this always works, the reply is simply "^done".
+ call s:SendCommand('-break-delete ' . id)
+ for subid in keys(s:breakpoints[id])
+ call sign_unplace('TermDebug',
+ \ #{id: s:Breakpoint2SignNumber(id, subid)})
+ endfor
+ unlet s:breakpoints[id]
+ unlet s:breakpoint_locations[bploc][idx]
+ let nr = id
+ break
+ else
+ let idx += 1
+ endif
+ endfor
+ if nr != 0
+ if empty(s:breakpoint_locations[bploc])
+ unlet s:breakpoint_locations[bploc]
+ endif
+ echomsg 'Breakpoint ' . id . ' cleared from line ' . lnum . '.'
+ else
+ echoerr 'Internal error trying to remove breakpoint at line ' . lnum . '!'
+ endif
+ else
+ echomsg 'No breakpoint to remove at line ' . lnum . '.'
+ endif
+endfunc
+
+func s:Run(args)
+ if a:args != ''
+ call s:SendResumingCommand('-exec-arguments ' . a:args)
+ endif
+ call s:SendResumingCommand('-exec-run')
+endfunc
+
+func s:SendEval(expr)
+ " check for "likely" boolean expressions, in which case we take it as lhs
+ if a:expr =~ "[=!<>]="
+ let exprLHS = a:expr
+ else
+ " remove text that is likely an assignment
+ let exprLHS = substitute(a:expr, ' *=.*', '', '')
+ endif
+
+ " encoding expression to prevent bad errors
+ let expr = a:expr
+ let expr = substitute(expr, '\\', '\\\\', 'g')
+ let expr = substitute(expr, '"', '\\"', 'g')
+ call s:SendCommand('-data-evaluate-expression "' . expr . '"')
+ let s:evalexpr = exprLHS
+endfunc
+
+" :Evaluate - evaluate what is specified / under the cursor
+func s:Evaluate(range, arg)
+ let expr = s:GetEvaluationExpression(a:range, a:arg)
+ let s:ignoreEvalError = 0
+ call s:SendEval(expr)
+endfunc
+
+" get what is specified / under the cursor
+func s:GetEvaluationExpression(range, arg)
+ if a:arg != ''
+ " user supplied evaluation
+ let expr = s:CleanupExpr(a:arg)
+ " DSW: replace "likely copy + paste" assignment
+ let expr = substitute(expr, '"\([^"]*\)": *', '\1=', 'g')
+ elseif a:range == 2
+ " no evaluation but provided but range set
+ let pos = getcurpos()
+ let reg = getreg('v', 1, 1)
+ let regt = getregtype('v')
+ normal! gv"vy
+ let expr = s:CleanupExpr(@v)
+ call setpos('.', pos)
+ call setreg('v', reg, regt)
+ else
+ " no evaluation provided: get from C-expression under cursor
+ " TODO: allow filetype specific lookup #9057
+ let expr = expand('<cexpr>')
+ endif
+ return expr
+endfunc
+
+" clean up expression that may get in because of range
+" (newlines and surrounding whitespace)
+" As it can also be specified via ex-command for assignments this function
+" may not change the "content" parts (like replacing contained spaces)
+func s:CleanupExpr(expr)
+ " replace all embedded newlines/tabs/...
+ let expr = substitute(a:expr, '\_s', ' ', 'g')
+
+ if &filetype ==# 'cobol'
+ " extra cleanup for COBOL:
+ " - a semicolon nmay be used instead of a space
+ " - a trailing comma or period is ignored as it commonly separates/ends
+ " multiple expr
+ let expr = substitute(expr, ';', ' ', 'g')
+ let expr = substitute(expr, '[,.]\+ *$', '', '')
+ endif
+
+ " get rid of leading and trailing spaces
+ let expr = substitute(expr, '^ *', '', '')
+ let expr = substitute(expr, ' *$', '', '')
+ return expr
+endfunc
+
+let s:ignoreEvalError = 0
+let s:evalFromBalloonExpr = 0
+
+" Handle the result of data-evaluate-expression
+func s:HandleEvaluate(msg)
+ let value = a:msg
+ \ ->substitute('.*value="\(.*\)"', '\1', '')
+ \ ->substitute('\\"', '"', 'g')
+ \ ->substitute('\\\\', '\\', 'g')
+ "\ multi-byte characters arrive in octal form, replace everything but NULL values
+ \ ->substitute('\\000', s:NullRepl, 'g')
+ \ ->substitute('\\\o\o\o', {-> eval('"' .. submatch(0) .. '"')}, 'g')
+ "\ Note: GDB docs also mention hex encodings - the translations below work
+ "\ but we keep them out for performance-reasons until we actually see
+ "\ those in mi-returns
+ "\ ->substitute('\\0x00', s:NullRep, 'g')
+ "\ ->substitute('\\0x\(\x\x\)', {-> eval('"\x' .. submatch(1) .. '"')}, 'g')
+ \ ->substitute(s:NullRepl, '\\000', 'g')
+ if s:evalFromBalloonExpr
+ if s:evalFromBalloonExprResult == ''
+ let s:evalFromBalloonExprResult = s:evalexpr . ': ' . value
+ else
+ let s:evalFromBalloonExprResult .= ' = ' . value
+ endif
+ call balloon_show(s:evalFromBalloonExprResult)
+ else
+ echomsg '"' . s:evalexpr . '": ' . value
+ endif
+
+ if s:evalexpr[0] != '*' && value =~ '^0x' && value != '0x0' && value !~ '"$'
+ " Looks like a pointer, also display what it points to.
+ let s:ignoreEvalError = 1
+ call s:SendEval('*' . s:evalexpr)
+ else
+ let s:evalFromBalloonExpr = 0
+ endif
+endfunc
+
+" Show a balloon with information of the variable under the mouse pointer,
+" if there is any.
+func TermDebugBalloonExpr()
+ if v:beval_winid != s:sourcewin
+ return ''
+ endif
+ if !s:stopped
+ " Only evaluate when stopped, otherwise setting a breakpoint using the
+ " mouse triggers a balloon.
+ return ''
+ endif
+ let s:evalFromBalloonExpr = 1
+ let s:evalFromBalloonExprResult = ''
+ let s:ignoreEvalError = 1
+ let expr = s:CleanupExpr(v:beval_text)
+ call s:SendEval(expr)
+ return ''
+endfunc
+
+" Handle an error.
+func s:HandleError(msg)
+ if s:ignoreEvalError
+ " Result of s:SendEval() failed, ignore.
+ let s:ignoreEvalError = 0
+ let s:evalFromBalloonExpr = 0
+ return
+ endif
+ let msgVal = substitute(a:msg, '.*msg="\(.*\)"', '\1', '')
+ echoerr substitute(msgVal, '\\"', '"', 'g')
+endfunc
+
+func s:GotoSourcewinOrCreateIt()
+ if !win_gotoid(s:sourcewin)
+ new
+ let s:sourcewin = win_getid(winnr())
+ call s:InstallWinbar()
+ endif
+endfunc
+
+func s:GetDisasmWindow()
+ if exists('g:termdebug_config')
+ return get(g:termdebug_config, 'disasm_window', 0)
+ endif
+ if exists('g:termdebug_disasm_window')
+ return g:termdebug_disasm_window
+ endif
+ return 0
+endfunc
+
+func s:GetDisasmWindowHeight()
+ if exists('g:termdebug_config')
+ return get(g:termdebug_config, 'disasm_window_height', 0)
+ endif
+ if exists('g:termdebug_disasm_window') && g:termdebug_disasm_window > 1
+ return g:termdebug_disasm_window
+ endif
+ return 0
+endfunc
+
+func s:GotoAsmwinOrCreateIt()
+ if !win_gotoid(s:asmwin)
+ if win_gotoid(s:sourcewin)
+ exe 'rightbelow new'
+ else
+ exe 'new'
+ endif
+
+ let s:asmwin = win_getid(winnr())
+
+ setlocal nowrap
+ setlocal number
+ setlocal noswapfile
+ setlocal buftype=nofile
+ setlocal modifiable
+
+ let asmbuf = bufnr('Termdebug-asm-listing')
+ if asmbuf > 0
+ exe 'buffer' . asmbuf
+ else
+ exe 'file Termdebug-asm-listing'
+ endif
+
+ if s:GetDisasmWindowHeight() > 0
+ exe 'resize ' .. s:GetDisasmWindowHeight()
+ endif
+ endif
+
+ if s:asm_addr != ''
+ let lnum = search('^' . s:asm_addr)
+ if lnum == 0
+ if s:stopped
+ call s:SendCommand('disassemble $pc')
+ endif
+ else
+ call sign_unplace('TermDebug', #{id: s:asm_id})
+ call sign_place(s:asm_id, 'TermDebug', 'debugPC', '%', #{lnum: lnum})
+ endif
+ endif
+endfunc
+
+" Handle stopping and running message from gdb.
+" Will update the sign that shows the current position.
+func s:HandleCursor(msg)
+ let wid = win_getid(winnr())
+
+ if a:msg =~ '^\*stopped'
+ call ch_log('program stopped')
+ let s:stopped = 1
+ elseif a:msg =~ '^\*running'
+ call ch_log('program running')
+ let s:stopped = 0
+ endif
+
+ if a:msg =~ 'fullname='
+ let fname = s:GetFullname(a:msg)
+ else
+ let fname = ''
+ endif
+
+ if a:msg =~ 'addr='
+ let asm_addr = s:GetAsmAddr(a:msg)
+ if asm_addr != ''
+ let s:asm_addr = asm_addr
+
+ let curwinid = win_getid(winnr())
+ if win_gotoid(s:asmwin)
+ let lnum = search('^' . s:asm_addr)
+ if lnum == 0
+ call s:SendCommand('disassemble $pc')
+ else
+ call sign_unplace('TermDebug', #{id: s:asm_id})
+ call sign_place(s:asm_id, 'TermDebug', 'debugPC', '%', #{lnum: lnum})
+ endif
+
+ call win_gotoid(curwinid)
+ endif
+ endif
+ endif
+
+ if a:msg =~ '^\(\*stopped\|=thread-selected\)' && filereadable(fname)
+ let lnum = substitute(a:msg, '.*line="\([^"]*\)".*', '\1', '')
+ if lnum =~ '^[0-9]*$'
+ call s:GotoSourcewinOrCreateIt()
+ if expand('%:p') != fnamemodify(fname, ':p')
+echomsg 'different fname: "' .. expand('%:p') .. '" vs "' .. fnamemodify(fname, ':p') .. '"'
+ augroup Termdebug
+ " Always open a file read-only instead of showing the ATTENTION
+ " prompt, since it is unlikely we want to edit the file.
+ " The file may be changed but not saved, warn for that.
+ au SwapExists * echohl WarningMsg
+ \ | echo 'Warning: file is being edited elsewhere'
+ \ | echohl None
+ \ | let v:swapchoice = 'o'
+ augroup END
+ if &modified
+ " TODO: find existing window
+ exe 'split ' . fnameescape(fname)
+ let s:sourcewin = win_getid(winnr())
+ call s:InstallWinbar()
+ else
+ exe 'edit ' . fnameescape(fname)
+ endif
+ augroup Termdebug
+ au! SwapExists
+ augroup END
+ endif
+ exe lnum
+ normal! zv
+ call sign_unplace('TermDebug', #{id: s:pc_id})
+ call sign_place(s:pc_id, 'TermDebug', 'debugPC', fname,
+ \ #{lnum: lnum, priority: 110})
+ if !exists('b:save_signcolumn')
+ let b:save_signcolumn = &signcolumn
+ call add(s:signcolumn_buflist, bufnr())
+ endif
+ setlocal signcolumn=yes
+ endif
+ elseif !s:stopped || fname != ''
+ call sign_unplace('TermDebug', #{id: s:pc_id})
+ endif
+
+ call win_gotoid(wid)
+endfunc
+
+let s:BreakpointSigns = []
+
+func s:CreateBreakpoint(id, subid, enabled)
+ let nr = printf('%d.%d', a:id, a:subid)
+ if index(s:BreakpointSigns, nr) == -1
+ call add(s:BreakpointSigns, nr)
+ if a:enabled == "n"
+ let hiName = "debugBreakpointDisabled"
+ else
+ let hiName = "debugBreakpoint"
+ endif
+ call sign_define('debugBreakpoint' .. nr,
+ \ #{text: substitute(nr, '\..*', '', ''),
+ \ texthl: hiName})
+ endif
+endfunc
+
+func! s:SplitMsg(s)
+ return split(a:s, '{.\{-}}\zs')
+endfunction
+
+" Handle setting a breakpoint
+" Will update the sign that shows the breakpoint
+func s:HandleNewBreakpoint(msg, modifiedFlag)
+ if a:msg !~ 'fullname='
+ " a watch or a pending breakpoint does not have a file name
+ if a:msg =~ 'pending='
+ let nr = substitute(a:msg, '.*number=\"\([0-9.]*\)\".*', '\1', '')
+ let target = substitute(a:msg, '.*pending=\"\([^"]*\)\".*', '\1', '')
+ echomsg 'Breakpoint ' . nr . ' (' . target . ') pending.'
+ endif
+ return
+ endif
+ for msg in s:SplitMsg(a:msg)
+ let fname = s:GetFullname(msg)
+ if empty(fname)
+ continue
+ endif
+ let nr = substitute(msg, '.*number="\([0-9.]*\)\".*', '\1', '')
+ if empty(nr)
+ return
+ endif
+
+ " If "nr" is 123 it becomes "123.0" and subid is "0".
+ " If "nr" is 123.4 it becomes "123.4.0" and subid is "4"; "0" is discarded.
+ let [id, subid; _] = map(split(nr . '.0', '\.'), 'v:val + 0')
+ let enabled = substitute(msg, '.*enabled="\([yn]\)".*', '\1', '')
+ call s:CreateBreakpoint(id, subid, enabled)
+
+ if has_key(s:breakpoints, id)
+ let entries = s:breakpoints[id]
+ else
+ let entries = {}
+ let s:breakpoints[id] = entries
+ endif
+ if has_key(entries, subid)
+ let entry = entries[subid]
+ else
+ let entry = {}
+ let entries[subid] = entry
+ endif
+
+ let lnum = substitute(msg, '.*line="\([^"]*\)".*', '\1', '')
+ let entry['fname'] = fname
+ let entry['lnum'] = lnum
+
+ let bploc = printf('%s:%d', fname, lnum)
+ if !has_key(s:breakpoint_locations, bploc)
+ let s:breakpoint_locations[bploc] = []
+ endif
+ let s:breakpoint_locations[bploc] += [id]
+
+ if bufloaded(fname)
+ call s:PlaceSign(id, subid, entry)
+ let posMsg = ' at line ' . lnum . '.'
+ else
+ let posMsg = ' in ' . fname . ' at line ' . lnum . '.'
+ endif
+ if !a:modifiedFlag
+ let actionTaken = 'created'
+ elseif enabled == 'n'
+ let actionTaken = 'disabled'
+ else
+ let actionTaken = 'enabled'
+ endif
+ echomsg 'Breakpoint ' . nr . ' ' . actionTaken . posMsg
+ endfor
+endfunc
+
+func s:PlaceSign(id, subid, entry)
+ let nr = printf('%d.%d', a:id, a:subid)
+ call sign_place(s:Breakpoint2SignNumber(a:id, a:subid), 'TermDebug',
+ \ 'debugBreakpoint' .. nr, a:entry['fname'],
+ \ #{lnum: a:entry['lnum'], priority: 110})
+ let a:entry['placed'] = 1
+endfunc
+
+" Handle deleting a breakpoint
+" Will remove the sign that shows the breakpoint
+func s:HandleBreakpointDelete(msg)
+ let id = substitute(a:msg, '.*id="\([0-9]*\)\".*', '\1', '') + 0
+ if empty(id)
+ return
+ endif
+ if has_key(s:breakpoints, id)
+ for [subid, entry] in items(s:breakpoints[id])
+ if has_key(entry, 'placed')
+ call sign_unplace('TermDebug',
+ \ #{id: s:Breakpoint2SignNumber(id, subid)})
+ unlet entry['placed']
+ endif
+ endfor
+ unlet s:breakpoints[id]
+ echomsg 'Breakpoint ' . id . ' cleared.'
+ endif
+endfunc
+
+" Handle the debugged program starting to run.
+" Will store the process ID in s:pid
+func s:HandleProgramRun(msg)
+ let nr = substitute(a:msg, '.*pid="\([0-9]*\)\".*', '\1', '') + 0
+ if nr == 0
+ return
+ endif
+ let s:pid = nr
+ call ch_log('Detected process ID: ' . s:pid)
+endfunc
+
+" Handle a BufRead autocommand event: place any signs.
+func s:BufRead()
+ let fname = expand('<afile>:p')
+ for [id, entries] in items(s:breakpoints)
+ for [subid, entry] in items(entries)
+ if entry['fname'] == fname
+ call s:PlaceSign(id, subid, entry)
+ endif
+ endfor
+ endfor
+endfunc
+
+" Handle a BufUnloaded autocommand event: unplace any signs.
+func s:BufUnloaded()
+ let fname = expand('<afile>:p')
+ for [id, entries] in items(s:breakpoints)
+ for [subid, entry] in items(entries)
+ if entry['fname'] == fname
+ let entry['placed'] = 0
+ endif
+ endfor
+ endfor
+endfunc
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/plugin/README.txt b/runtime/plugin/README.txt
new file mode 100644
index 0000000..11bf1e9
--- /dev/null
+++ b/runtime/plugin/README.txt
@@ -0,0 +1,21 @@
+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
+logiPat.vim logical operators on patterns
+manpager.vim using Vim as manpager
+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/getscriptPlugin.vim b/runtime/plugin/getscriptPlugin.vim
new file mode 100644
index 0000000..8faa029
--- /dev/null
+++ b/runtime/plugin/getscriptPlugin.vim
@@ -0,0 +1,41 @@
+" ---------------------------------------------------------------------
+" getscriptPlugin.vim
+" Author: Charles E. Campbell
+" Date: Nov 29, 2013
+" Installing: :help glvs-install
+" Usage: :help glvs
+"
+" GetLatestVimScripts: 642 1 :AutoInstall: getscript.vim
+"
+" (Rom 15:11 WEB) Again, "Praise the Lord, all you Gentiles! Let
+" all the peoples praise Him."
+" ---------------------------------------------------------------------
+" Initialization: {{{1
+" if you're sourcing this file, surely you can't be
+" expecting vim to be in its vi-compatible mode
+if exists("g:loaded_getscriptPlugin")
+ finish
+endif
+if &cp
+ if &verbose
+ echo "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)"
+ endif
+ finish
+endif
+let g:loaded_getscriptPlugin = "v36"
+let s:keepcpo = &cpo
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+com! -nargs=0 GetLatestVimScripts call getscript#GetLatestVimScripts()
+com! -nargs=0 GetScripts call getscript#GetLatestVimScripts()
+sil! com -nargs=0 GLVS call getscript#GetLatestVimScripts()
+
+" ---------------------------------------------------------------------
+" Restore Options: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+
+" ---------------------------------------------------------------------
+" vim: ts=8 sts=2 fdm=marker nowrap
diff --git a/runtime/plugin/gzip.vim b/runtime/plugin/gzip.vim
new file mode 100644
index 0000000..7214488
--- /dev/null
+++ b/runtime/plugin/gzip.vim
@@ -0,0 +1,60 @@
+" Vim plugin for editing compressed files.
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2016 Oct 30
+
+" Exit quickly when:
+" - this plugin was already loaded
+" - when 'compatible' is set
+" - some autocommands are already taking care of compressed files
+if exists("loaded_gzip") || &cp || exists("#BufReadPre#*.gz")
+ finish
+endif
+let loaded_gzip = 1
+
+augroup gzip
+ " Remove all gzip autocommands
+ au!
+
+ " Enable editing of gzipped files.
+ " The functions are defined in autoload/gzip.vim.
+ "
+ " Set binary mode before reading the file.
+ " Use "gzip -d", gunzip isn't always available.
+ autocmd BufReadPre,FileReadPre *.gz,*.bz2,*.Z,*.lzma,*.xz,*.lz,*.zst,*.br,*.lzo 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 BufReadPost,FileReadPost *.br call gzip#read("brotli -d --rm")
+ autocmd BufReadPost,FileReadPost *.lzo call gzip#read("lzop -d -U")
+ 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 BufWritePost,FileWritePost *.br call gzip#write("brotli --rm")
+ autocmd BufWritePost,FileWritePost *.lzo call gzip#write("lzop -U")
+ 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 FileAppendPre *.br call gzip#appre("brotli -d --rm")
+ autocmd FileAppendPre *.lzo call gzip#appre("lzop -d -U")
+ 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")
+ autocmd FileAppendPost *.br call gzip#write("brotli --rm")
+ autocmd FileAppendPost *.lzo call gzip#write("lzop -U")
+augroup END
diff --git a/runtime/plugin/logiPat.vim b/runtime/plugin/logiPat.vim
new file mode 100644
index 0000000..47fabe9
--- /dev/null
+++ b/runtime/plugin/logiPat.vim
@@ -0,0 +1,339 @@
+" LogiPat: Boolean logical pattern matcher
+" Author: Charles E. Campbell
+" Date: Apr 04, 2016
+" Version: 4
+" Purpose: to do Boolean-logic based regular expression pattern matching
+" Copyright: Copyright (C) 1999-2011 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 most anything else that's free,
+" LogiPat.vim is provided *as is* and comes with no warranty
+" of any kind, either 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.
+"
+" Usage: {{{1
+" :LogiPat ...
+"
+" Boolean logic supported:
+" () grouping operators
+" ! not the following pattern
+" | logical or
+" & logical and
+" "..pattern.."
+" Example: {{{1
+" :LogiPat !("january"|"february")
+" would match all strings not containing the strings january
+" or february
+" GetLatestVimScripts: 1290 1 :AutoInstall: LogiPat.vim
+"
+" Behold, you will conceive in your womb, and bring forth a son, {{{1
+" and will call his name Jesus. He will be great, and will be
+" called the Son of the Most High. The Lord God will give him the
+" throne of his father, David, and he will reign over the house of
+" Jacob forever. There will be no end to his kingdom. (Luke 1:31-33 WEB)
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("loaded_logiPat")
+ finish
+endif
+let g:loaded_logiPat = "v4"
+let s:keepcpo = &cpo
+set cpo&vim
+"DechoRemOn
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+com! -nargs=* LogiPat call LogiPat(<q-args>,1)
+sil! com -nargs=* LP call LogiPat(<q-args>,1)
+sil! com -nargs=* LPR call LogiPat(<q-args>,1,"r")
+com! -nargs=+ LPE echomsg LogiPat(<q-args>)
+com! -nargs=+ LogiPatFlags let s:LogiPatFlags="<args>"
+sil! com -nargs=+ LPF let s:LogiPatFlags="<args>"
+
+" =====================================================================
+" Functions: {{{1
+
+" ---------------------------------------------------------------------
+" LogiPat: this function interprets the boolean-logic pattern {{{2
+fun! LogiPat(pat,...)
+" call Dfunc("LogiPat(pat<".a:pat.">)")
+
+ " LogiPat(pat,dosearch)
+ if a:0 > 0
+ let dosearch= a:1
+ else
+ let dosearch= 0
+ endif
+ if a:0 >= 3
+ let s:LogiPatFlags= a:3
+ endif
+
+ let s:npatstack = 0
+ let s:nopstack = 0
+ let s:preclvl = 0
+ let expr = a:pat
+
+ " Lexer/Parser
+ while expr != ""
+" call Decho("expr<".expr.">")
+
+ if expr =~ '^"'
+ " push a Pattern; accept "" as a single " in the pattern
+ let expr = substitute(expr,'^\s*"','','')
+ let pat = substitute(expr,'^\(\%([^"]\|\"\"\)\{-}\)"\([^"].*$\|$\)','\1','')
+ let pat = substitute(pat,'""','"','g')
+ let expr = substitute(expr,'^\(\%([^"]\|\"\"\)\{-}\)"\([^"].*$\|$\)','\2','')
+ let expr = substitute(expr,'^\s*','','')
+" call Decho("pat<".pat."> expr<".expr.">")
+
+ call s:LP_PatPush('.*'.pat.'.*')
+
+ elseif expr =~ '^[!()|&]'
+ " push an operator
+ let op = strpart(expr,0,1)
+ let expr = strpart(expr,strlen(op))
+ " allow for those who can't resist doubling their and/or operators
+ if op =~ '[|&]' && expr[0] == op
+ let expr = strpart(expr,strlen(op))
+ endif
+ call s:LP_OpPush(op)
+
+ elseif expr =~ '^\s'
+ " skip whitespace
+ let expr= strpart(expr,1)
+
+ else
+ echoerr "operator<".strpart(expr,0,1)."> not supported (yet)"
+ let expr= strpart(expr,1)
+ endif
+
+ endwhile
+
+ " Final Execution
+ call s:LP_OpPush('Z')
+
+ let result= s:LP_PatPop(1)
+" call Decho("result=".result)
+
+ " sanity checks and cleanup
+ if s:npatstack > 0
+ echoerr s:npatstack." patterns left on stack!"
+ let s:npatstack= 0
+ endif
+ if s:nopstack > 0
+ echoerr s:nopstack." operators left on stack!"
+ let s:nopstack= 0
+ endif
+
+ " perform the indicated search
+ if dosearch
+ if exists("s:LogiPatFlags") && s:LogiPatFlags != ""
+" call Decho("search(result<".result."> LogiPatFlags<".s:LogiPatFlags.">)")
+ call search(result,s:LogiPatFlags)
+ else
+" call Decho("search(result<".result.">)")
+ call search(result)
+ endif
+ let @/= result
+ endif
+
+" call Dret("LogiPat ".result)
+ return result
+endfun
+
+" ---------------------------------------------------------------------
+" s:String: Vim6.4 doesn't have string() {{{2
+func! s:String(str)
+ return "'".escape(a:str, '"')."'"
+endfunc
+
+" ---------------------------------------------------------------------
+" LP_PatPush: {{{2
+fun! s:LP_PatPush(pat)
+" call Dfunc("LP_PatPush(pat<".a:pat.">)")
+ let s:npatstack = s:npatstack + 1
+ let s:patstack_{s:npatstack} = a:pat
+" call s:StackLook("patpush") "Decho
+" call Dret("LP_PatPush : npatstack=".s:npatstack)
+endfun
+
+" ---------------------------------------------------------------------
+" LP_PatPop: pop a number/variable from LogiPat's pattern stack {{{2
+fun! s:LP_PatPop(lookup)
+" call Dfunc("LP_PatPop(lookup=".a:lookup.")")
+ if s:npatstack > 0
+ let ret = s:patstack_{s:npatstack}
+ let s:npatstack = s:npatstack - 1
+ else
+ let ret= "---error---"
+ echoerr "(LogiPat) invalid expression"
+ endif
+" call s:StackLook("patpop") "Decho
+" call Dret("LP_PatPop ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" LP_OpPush: {{{2
+fun! s:LP_OpPush(op)
+" call Dfunc("LP_OpPush(op<".a:op.">)")
+
+ " determine new operator's precedence level
+ if a:op == '('
+ let s:preclvl= s:preclvl + 10
+ let preclvl = s:preclvl
+ elseif a:op == ')'
+ let s:preclvl= s:preclvl - 10
+ if s:preclvl < 0
+ let s:preclvl= 0
+ echoerr "too many )s"
+ endif
+ let preclvl= s:preclvl
+ elseif a:op =~ '|'
+ let preclvl= s:preclvl + 2
+ elseif a:op =~ '&'
+ let preclvl= s:preclvl + 4
+ elseif a:op == '!'
+ let preclvl= s:preclvl + 6
+ elseif a:op == 'Z'
+ let preclvl= -1
+ else
+ echoerr "expr<".expr."> not supported (yet)"
+ let preclvl= s:preclvl
+ endif
+" call Decho("new operator<".a:op."> preclvl=".preclvl)
+
+ " execute higher-precdence operators
+" call Decho("execute higher-precedence operators")
+ call s:LP_Execute(preclvl)
+
+ " push new operator onto operator-stack
+" call Decho("push new operator<".a:op."> onto stack with preclvl=".preclvl." at nopstack=".(s:nopstack+1))
+ if a:op =~ '!'
+ let s:nopstack = s:nopstack + 1
+ let s:opprec_{s:nopstack} = preclvl
+ let s:opstack_{s:nopstack} = a:op
+ elseif a:op =~ '|'
+ let s:nopstack = s:nopstack + 1
+ let s:opprec_{s:nopstack} = preclvl
+ let s:opstack_{s:nopstack} = a:op
+ elseif a:op == '&'
+ let s:nopstack = s:nopstack + 1
+ let s:opprec_{s:nopstack} = preclvl
+ let s:opstack_{s:nopstack} = a:op
+ endif
+
+" call s:StackLook("oppush") "Decho
+" call Dret("LP_OpPush : s:preclvl=".s:preclvl)
+endfun
+
+" ---------------------------------------------------------------------
+" LP_Execute: execute operators from opstack using pattern stack {{{2
+fun! s:LP_Execute(preclvl)
+" call Dfunc("LP_Execute(preclvl=".a:preclvl.") npatstack=".s:npatstack." nopstack=".s:nopstack)
+
+ " execute all higher precedence operators
+ while s:nopstack > 0 && a:preclvl < s:opprec_{s:nopstack}
+ let op= s:opstack_{s:nopstack}
+" call Decho("op<".op."> nop=".s:nopstack." [preclvl=".a:preclvl."] < [opprec_".s:nopstack."=".s:opprec_{s:nopstack}."]")
+
+ let s:nopstack = s:nopstack - 1
+
+ if op == '!'
+ let n1= s:LP_PatPop(1)
+ call s:LP_PatPush(s:LP_Not(n1))
+
+ elseif op == '|'
+ let n1= s:LP_PatPop(1)
+ let n2= s:LP_PatPop(1)
+ call s:LP_PatPush(s:LP_Or(n2,n1))
+
+ elseif op =~ '&'
+ let n1= s:LP_PatPop(1)
+ let n2= s:LP_PatPop(1)
+ call s:LP_PatPush(s:LP_And(n2,n1))
+ endif
+
+" call s:StackLook("execute") "Decho
+ endwhile
+
+" call Dret("LP_Execute")
+endfun
+
+" ---------------------------------------------------------------------
+" LP_Not: writes a logical-not for a pattern {{{2
+fun! s:LP_Not(pat)
+" call Dfunc("LP_Not(pat<".a:pat.">)")
+ if a:pat =~ '^\.\*' && a:pat =~ '\.\*$'
+ let pat= substitute(a:pat,'^\.\*\(.*\)\.\*$','\1','')
+ let ret= '^\%(\%('.pat.'\)\@!.\)*$'
+ else
+ let ret= '^\%(\%('.a:pat.'\)\@!.\)*$'
+ endif
+" call Dret("LP_Not ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" LP_Or: writes a logical-or branch using two patterns {{{2
+fun! s:LP_Or(pat1,pat2)
+" call Dfunc("LP_Or(pat1<".a:pat1."> pat2<".a:pat2.">)")
+ let ret= '\%('.a:pat1.'\|'.a:pat2.'\)'
+" call Dret("LP_Or ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" LP_And: writes a logical-and concat using two patterns {{{2
+fun! s:LP_And(pat1,pat2)
+" call Dfunc("LP_And(pat1<".a:pat1."> pat2<".a:pat2.">)")
+ let ret= '\%('.a:pat1.'\&'.a:pat2.'\)'
+" call Dret("LP_And ".ret)
+ return ret
+endfun
+
+" ---------------------------------------------------------------------
+" StackLook: {{{2
+fun! s:StackLook(description)
+" call Dfunc("StackLook(description<".a:description.">)")
+ let iop = 1
+ let ifp = 1
+" call Decho("Pattern Operator")
+
+ " print both pattern and operator
+ while ifp <= s:npatstack && iop <= s:nopstack
+ let fp = s:patstack_{ifp}
+ let op = s:opstack_{iop}." (P".s:opprec_{s:nopstack}.')'
+ let fplen= strlen(fp)
+ if fplen < 30
+ let fp= fp.strpart(" ",1,30-fplen)
+ endif
+" call Decho(fp.op)
+ let ifp = ifp + 1
+ let iop = iop + 1
+ endwhile
+
+ " print just pattern
+ while ifp <= s:npatstack
+ let fp = s:patstack_{ifp}
+" call Decho(fp)
+ let ifp = ifp + 1
+ endwhile
+
+ " print just operator
+ while iop <= s:nopstack
+ let op = s:opstack_{iop}." (P".s:opprec_{s:nopstack}.')'
+" call Decho(" ".op)
+ let iop = iop + 1
+ endwhile
+" call Dret("StackLook")
+endfun
+
+" ---------------------------------------------------------------------
+" Cleanup And Modeline: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim: ts=4 fdm=marker
diff --git a/runtime/plugin/manpager.vim b/runtime/plugin/manpager.vim
new file mode 100644
index 0000000..1738dc9
--- /dev/null
+++ b/runtime/plugin/manpager.vim
@@ -0,0 +1,51 @@
+" Vim plugin for using Vim as manpager.
+" Maintainer: Enno Nagel <ennonagel+vim@gmail.com>
+" Last Change: 2022 Oct 17
+
+if exists('g:loaded_manpager_plugin')
+ finish
+endif
+let g:loaded_manpager_plugin = 1
+
+" Set up the current buffer (likely read from stdin) as a manpage
+command MANPAGER call s:ManPager()
+
+function s:ManPager()
+ " global options, keep these to a minimum to avoid side effects
+ if &compatible
+ set nocompatible
+ endif
+ if exists('+viminfofile')
+ set viminfofile=NONE
+ endif
+ syntax on
+
+ " Make this an unlisted, readonly scratch buffer
+ setlocal buftype=nofile noswapfile bufhidden=hide nobuflisted readonly
+
+ " Ensure text width matches window width
+ setlocal foldcolumn& nofoldenable nonumber norelativenumber
+
+ " In case Vim was invoked with -M
+ setlocal modifiable
+
+ " Emulate 'col -b'
+ silent! keepj keepp %s/\v(.)\b\ze\1?//ge
+
+ " Remove ansi sequences
+ silent! keepj keepp %s/\v\e\[%(%(\d;)?\d{1,2})?[mK]//ge
+
+ " Remove empty lines above the header
+ call cursor(1, 1)
+ let n = search(".*(.*)", "c")
+ if n > 1
+ exe "1," . n-1 . "d"
+ endif
+
+ " Finished preprocessing the buffer, prevent any further modifications
+ setlocal nomodified nomodifiable
+
+ " Set filetype to man even if ftplugin is disabled
+ setlocal filetype=man
+ runtime ftplugin/man.vim
+endfunction
diff --git a/runtime/plugin/matchparen.vim b/runtime/plugin/matchparen.vim
new file mode 100644
index 0000000..e19b283
--- /dev/null
+++ b/runtime/plugin/matchparen.vim
@@ -0,0 +1,225 @@
+" Vim plugin for showing matching parens
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Dec 01
+
+" Exit quickly when:
+" - this plugin was already loaded (or disabled)
+" - when 'compatible' is set
+if exists("g:loaded_matchparen") || &cp
+ finish
+endif
+let g:loaded_matchparen = 1
+
+if !exists("g:matchparen_timeout")
+ let g:matchparen_timeout = 300
+endif
+if !exists("g:matchparen_insert_timeout")
+ let g:matchparen_insert_timeout = 60
+endif
+
+augroup matchparen
+ " Replace all matchparen autocommands
+ autocmd! CursorMoved,CursorMovedI,WinEnter,BufWinEnter,WinScrolled * call s:Highlight_Matching_Pair()
+ autocmd! WinLeave,BufLeave * call s:Remove_Matches()
+ if exists('##TextChanged')
+ autocmd! TextChanged,TextChangedI * call s:Highlight_Matching_Pair()
+ endif
+augroup END
+
+" Skip the rest if it was already done.
+if exists("*s:Highlight_Matching_Pair")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" The function that is invoked (very often) to define a ":match" highlighting
+" for any matching paren.
+func s:Highlight_Matching_Pair()
+ " Remove any previous match.
+ call s:Remove_Matches()
+
+ " Avoid that we remove the popup menu.
+ " Return when there are no colors (looks like the cursor jumps).
+ if pumvisible() || (&t_Co < 8 && !has("gui_running"))
+ return
+ endif
+
+ " Get the character under the cursor and check if it's in 'matchpairs'.
+ let c_lnum = line('.')
+ let c_col = col('.')
+ let before = 0
+
+ let text = getline(c_lnum)
+ let matches = matchlist(text, '\(.\)\=\%'.c_col.'c\(.\=\)')
+ if empty(matches)
+ let [c_before, c] = ['', '']
+ else
+ let [c_before, c] = matches[1:2]
+ endif
+ let plist = split(&matchpairs, '.\zs[:,]')
+ let i = index(plist, c)
+ if i < 0
+ " not found, in Insert mode try character before the cursor
+ if c_col > 1 && (mode() == 'i' || mode() == 'R')
+ let before = strlen(c_before)
+ let c = c_before
+ let i = index(plist, c)
+ endif
+ if i < 0
+ " not found, nothing to do
+ return
+ endif
+ endif
+
+ " Figure out the arguments for searchpairpos().
+ if i % 2 == 0
+ let s_flags = 'nW'
+ let c2 = plist[i + 1]
+ else
+ let s_flags = 'nbW'
+ let c2 = c
+ let c = plist[i - 1]
+ endif
+ if c == '['
+ let c = '\['
+ let c2 = '\]'
+ endif
+
+ " Find the match. When it was just before the cursor move it there for a
+ " moment.
+ if before > 0
+ let has_getcurpos = exists("*getcurpos")
+ if has_getcurpos
+ " getcurpos() is more efficient but doesn't exist before 7.4.313.
+ let save_cursor = getcurpos()
+ else
+ let save_cursor = winsaveview()
+ endif
+ call cursor(c_lnum, c_col - before)
+ endif
+
+ 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, and
+ " match "symbol" for lispBarSymbol.
+ let s_skip = 'synstack(".", col("."))'
+ \ . '->indexof({_, id -> synIDattr(id, "name") =~? '
+ \ . '"string\\|character\\|singlequote\\|escape\\|symbol\\|comment"}) >= 0'
+ " 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$')
+ let stoplinetop = line('w0')
+ if i % 2 == 0
+ let stopline = stoplinebottom
+ else
+ let stopline = stoplinetop
+ endif
+
+ " Limit the search time to 300 msec to avoid a hang on very long lines.
+ " This fails when a timeout is not supported.
+ if mode() == 'i' || mode() == 'R'
+ let timeout = exists("b:matchparen_insert_timeout") ? b:matchparen_insert_timeout : g:matchparen_insert_timeout
+ else
+ let timeout = exists("b:matchparen_timeout") ? b:matchparen_timeout : g:matchparen_timeout
+ endif
+ try
+ let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, timeout)
+ catch /E118/
+ " Can't use the timeout, restrict the stopline a bit more to avoid taking
+ " a long time on closed folds and long lines.
+ " The "viewable" variables give a range in which we can scroll while
+ " keeping the cursor at the same position.
+ " adjustedScrolloff accounts for very large numbers of scrolloff.
+ let adjustedScrolloff = min([&scrolloff, (line('w$') - line('w0')) / 2])
+ let bottom_viewable = min([line('$'), c_lnum + &lines - adjustedScrolloff - 2])
+ let top_viewable = max([1, c_lnum-&lines+adjustedScrolloff + 2])
+ " one of these stoplines will be adjusted below, but the current values are
+ " minimal boundaries within the current window
+ if i % 2 == 0
+ if has("byte_offset") && has("syntax_items") && &smc > 0
+ let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2])
+ let stopline = min([bottom_viewable, byte2line(stopbyte)])
+ else
+ let stopline = min([bottom_viewable, c_lnum + 100])
+ endif
+ let stoplinebottom = stopline
+ else
+ if has("byte_offset") && has("syntax_items") && &smc > 0
+ let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2])
+ let stopline = max([top_viewable, byte2line(stopbyte)])
+ else
+ let stopline = max([top_viewable, c_lnum - 100])
+ endif
+ let stoplinetop = stopline
+ endif
+ let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline)
+ endtry
+
+ if before > 0
+ if has_getcurpos
+ call setpos('.', save_cursor)
+ else
+ call winrestview(save_cursor)
+ endif
+ endif
+
+ " If a match is found setup match highlighting.
+ if m_lnum > 0 && m_lnum >= stoplinetop && m_lnum <= stoplinebottom
+ if exists('*matchaddpos')
+ call matchaddpos('MatchParen', [[c_lnum, c_col - before], [m_lnum, m_col]], 10, 3)
+ else
+ exe '3match MatchParen /\(\%' . c_lnum . 'l\%' . (c_col - before) .
+ \ 'c\)\|\(\%' . m_lnum . 'l\%' . m_col . 'c\)/'
+ endif
+ let w:paren_hl_on = 1
+ endif
+endfunction
+
+func s:Remove_Matches()
+ if exists('w:paren_hl_on') && w:paren_hl_on
+ silent! call matchdelete(3)
+ let w:paren_hl_on = 0
+ endif
+endfunc
+
+
+" Define commands that will disable and enable the plugin.
+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
new file mode 100644
index 0000000..d309f81
--- /dev/null
+++ b/runtime/plugin/netrwPlugin.vim
@@ -0,0 +1,223 @@
+" netrwPlugin.vim: Handles file transfer and remote directory listing across a network
+" PLUGIN SECTION
+" Date: Feb 09, 2021
+" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
+" Copyright: Copyright (C) 1999-2021 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,
+" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
+" *as is* and comes with no warranty of any kind, either
+" 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.
+"
+" But be doers of the Word, and not only hearers, deluding your own selves {{{1
+" (James 1:22 RSV)
+" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+" Load Once: {{{1
+if &cp || exists("g:loaded_netrwPlugin")
+ finish
+endif
+let g:loaded_netrwPlugin = "v171"
+let s:keepcpo = &cpo
+set cpo&vim
+"DechoRemOn
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+
+" Local Browsing Autocmds: {{{2
+augroup FileExplorer
+ au!
+ au BufLeave * if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif
+ au BufEnter * sil call s:LocalBrowse(expand("<amatch>"))
+ au VimEnter * sil call s:VimEnter(expand("<amatch>"))
+ if has("win32") || has("win95") || has("win64") || has("win16")
+ au BufEnter .* sil call s:LocalBrowse(expand("<amatch>"))
+ endif
+augroup END
+
+" Network Browsing Reading Writing: {{{2
+augroup Network
+ au!
+ au BufReadCmd file://* call netrw#FileUrlEdit(expand("<amatch>"))
+ au BufReadCmd ftp://*,rcp://*,scp://*,http://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(2,expand("<amatch>"))|exe "sil doau BufReadPost ".fnameescape(expand("<amatch>"))
+ au FileReadCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(1,expand("<amatch>"))|exe "sil doau FileReadPost ".fnameescape(expand("<amatch>"))
+ au BufWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufWritePre ".fnameescape(expand("<amatch>"))|exe 'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau BufWritePost ".fnameescape(expand("<amatch>"))
+ au FileWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileWritePre ".fnameescape(expand("<amatch>"))|exe "'[,']".'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau FileWritePost ".fnameescape(expand("<amatch>"))
+ try
+ au SourceCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
+ catch /^Vim\%((\a\+)\)\=:E216/
+ au SourcePre ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>"))
+ endtry
+augroup END
+
+" Commands: :Nread, :Nwrite, :NetUserPass {{{2
+com! -count=1 -nargs=* Nread let s:svpos= winsaveview()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call winrestview(s:svpos)
+com! -range=% -nargs=* Nwrite let s:svpos= winsaveview()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call winrestview(s:svpos)
+com! -nargs=* NetUserPass call NetUserPass(<f-args>)
+com! -nargs=* Nsource let s:svpos= winsaveview()<bar>call netrw#NetSource(<f-args>)<bar>call winrestview(s:svpos)
+com! -nargs=? Ntree call netrw#SetTreetop(1,<q-args>)
+
+" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2
+com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(<count>,0,0+<bang>0,<q-args>)
+com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(<count>,1,0+<bang>0,<q-args>)
+com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>)
+com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(<count>,1,4+<bang>0,<q-args>)
+com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(<count>,0,6 ,<q-args>)
+com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,<q-args>)
+com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,<q-args>)
+com! -nargs=* -bar -bang -count=0 -complete=dir Lexplore call netrw#Lexplore(<count>,<bang>0,<q-args>)
+
+" Commands: NetrwSettings {{{2
+com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings()
+com! -bang NetrwClean call netrw#Clean(<bang>0)
+
+" Maps:
+if !exists("g:netrw_nogx")
+ if maparg('gx','n') == ""
+ if !hasmapto('<Plug>NetrwBrowseX')
+ nmap <unique> gx <Plug>NetrwBrowseX
+ endif
+ nno <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX()))<cr>
+ endif
+ if maparg('gx','x') == ""
+ if !hasmapto('<Plug>NetrwBrowseXVis')
+ xmap <unique> gx <Plug>NetrwBrowseXVis
+ endif
+ xno <silent> <Plug>NetrwBrowseXVis :<c-u>call netrw#BrowseXVis()<cr>
+ endif
+endif
+if exists("g:netrw_usetab") && g:netrw_usetab
+ if maparg('<c-tab>','n') == ""
+ nmap <unique> <c-tab> <Plug>NetrwShrink
+ endif
+ nno <silent> <Plug>NetrwShrink :call netrw#Shrink()<cr>
+endif
+
+" ---------------------------------------------------------------------
+" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2
+fun! s:LocalBrowse(dirname)
+ " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here.
+ " Otherwise, the BufEnter event gets triggered when attempts to write to
+ " the DBG buffer are made.
+
+ if !exists("s:vimentered")
+ " If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will,
+ " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined.
+" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)")
+" call Dret("s:LocalBrowse")
+ return
+ endif
+
+" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")")
+
+ if has("amiga")
+ " The check against '' is made for the Amiga, where the empty
+ " string is the current directory and not checking would break
+ " things such as the help command.
+" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)")
+ if a:dirname != '' && isdirectory(a:dirname)
+ sil! call netrw#LocalBrowseCheck(a:dirname)
+ if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
+ exe w:netrw_bannercnt
+ endif
+ endif
+
+ elseif isdirectory(a:dirname)
+" call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft." (isdirectory, not amiga)")
+" call Dredir("LocalBrowse ft last set: ","verbose set ft")
+ " Jul 13, 2021: for whatever reason, preceding the following call with
+ " a sil! causes an unbalanced if-endif vim error
+ call netrw#LocalBrowseCheck(a:dirname)
+ if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt
+ exe w:netrw_bannercnt
+ endif
+
+ else
+ " not a directory, ignore it
+" call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...")
+ endif
+
+" call Dret("s:LocalBrowse")
+endfun
+
+" ---------------------------------------------------------------------
+" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2
+" Its purpose: to look over all windows and run s:LocalBrowse() on
+" them, which checks if they're directories and will create a directory
+" listing when appropriate.
+" It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter()
+" has already been called.
+fun! s:VimEnter(dirname)
+" call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">")
+ if has('nvim') || v:version < 802
+ " Johann Höchtl: reported that the call range... line causes an E488: Trailing characters
+ " error with neovim. I suspect its because neovim hasn't updated with recent
+ " vim patches. As is, this code will have problems with popup terminals
+ " instantiated before the VimEnter event runs.
+ " Ingo Karkat : E488 also in Vim 8.1.1602
+ let curwin = winnr()
+ let s:vimentered = 1
+ windo call s:LocalBrowse(expand("%:p"))
+ exe curwin."wincmd w"
+ else
+ " the following complicated expression comes courtesy of lacygoill; largely does the same thing as the windo and
+ " wincmd which are commented out, but avoids some side effects. Allows popup terminal before VimEnter.
+ let s:vimentered = 1
+ call range(1, winnr('$'))->map({_, v -> win_execute(win_getid(v), 'call expand("%:p")->s:LocalBrowse()')})
+ endif
+" call Dret("s:VimEnter")
+endfun
+
+" ---------------------------------------------------------------------
+" NetrwStatusLine: {{{1
+fun! NetrwStatusLine()
+" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".")
+ if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list")
+ let &stl= s:netrw_explore_stl
+ if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
+ if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
+ return ""
+ else
+ return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
+ endif
+endfun
+
+" ------------------------------------------------------------------------
+" NetUserPass: set username and password for subsequent ftp transfer {{{1
+" Usage: :call NetUserPass() -- will prompt for userid and password
+" :call NetUserPass("uid") -- will prompt for password
+" :call NetUserPass("uid","password") -- sets global userid and password
+fun! NetUserPass(...)
+
+ " get/set userid
+ if a:0 == 0
+" call Dfunc("NetUserPass(a:0<".a:0.">)")
+ if !exists("g:netrw_uid") || g:netrw_uid == ""
+ " via prompt
+ let g:netrw_uid= input('Enter username: ')
+ endif
+ else " from command line
+" call Dfunc("NetUserPass(a:1<".a:1.">) {")
+ let g:netrw_uid= a:1
+ endif
+
+ " get password
+ if a:0 <= 1 " via prompt
+" call Decho("a:0=".a:0." case <=1:")
+ let g:netrw_passwd= inputsecret("Enter Password: ")
+ else " from command line
+" call Decho("a:0=".a:0." case >1: a:2<".a:2.">")
+ let g:netrw_passwd=a:2
+ endif
+" call Dret("NetUserPass")
+endfun
+
+" ------------------------------------------------------------------------
+" Modelines And Restoration: {{{1
+let &cpo= s:keepcpo
+unlet s:keepcpo
+" vim:ts=8 fdm=marker
diff --git a/runtime/plugin/rrhelper.vim b/runtime/plugin/rrhelper.vim
new file mode 100644
index 0000000..b09cbc1
--- /dev/null
+++ b/runtime/plugin/rrhelper.vim
@@ -0,0 +1,48 @@
+" 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/spellfile.vim b/runtime/plugin/spellfile.vim
new file mode 100644
index 0000000..4372960
--- /dev/null
+++ b/runtime/plugin/spellfile.vim
@@ -0,0 +1,15 @@
+" Vim plugin for downloading spell files
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2006 Feb 01
+
+" Exit quickly when:
+" - this plugin was already loaded
+" - when 'compatible' is set
+" - some autocommands are already taking care of spell files
+if exists("loaded_spellfile_plugin") || &cp || exists("#SpellFileMissing")
+ finish
+endif
+let loaded_spellfile_plugin = 1
+
+" The function is in the autoload directory.
+autocmd SpellFileMissing * call spellfile#LoadFile(expand('<amatch>'))
diff --git a/runtime/plugin/tarPlugin.vim b/runtime/plugin/tarPlugin.vim
new file mode 100644
index 0000000..d55492a
--- /dev/null
+++ b/runtime/plugin/tarPlugin.vim
@@ -0,0 +1,56 @@
+" tarPlugin.vim -- a Vim plugin for browsing tarfiles
+" Original was copyright (c) 2002, Michael C. Toren <mct@toren.net>
+" Modified by Charles E. Campbell
+" Distributed under the GNU General Public License.
+"
+" Updates are available from <http://michael.toren.net/code/>. If you
+" find this script useful, or have suggestions for improvements, please
+" let me know.
+" Also look there for further comments and documentation.
+"
+" This part only sets the autocommands. The functions are in autoload/tar.vim.
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_tarPlugin")
+ finish
+endif
+let g:loaded_tarPlugin = "v32"
+let s:keepcpo = &cpo
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+augroup tar
+ au!
+ au BufReadCmd tarfile::* call tar#Read(expand("<amatch>"), 1)
+ au FileReadCmd tarfile::* call tar#Read(expand("<amatch>"), 0)
+ au BufWriteCmd tarfile::* call tar#Write(expand("<amatch>"))
+ au FileWriteCmd tarfile::* call tar#Write(expand("<amatch>"))
+
+ if has("unix")
+ au BufReadCmd tarfile::*/* call tar#Read(expand("<amatch>"), 1)
+ au FileReadCmd tarfile::*/* call tar#Read(expand("<amatch>"), 0)
+ au BufWriteCmd tarfile::*/* call tar#Write(expand("<amatch>"))
+ au FileWriteCmd tarfile::*/* call tar#Write(expand("<amatch>"))
+ endif
+
+ au BufReadCmd *.tar.gz call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tar call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.lrp call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tar.bz2 call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tar.Z call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tbz call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tgz 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>"))
+ au BufReadCmd *.tar.zst call tar#Browse(expand("<amatch>"))
+ au BufReadCmd *.tzs call tar#Browse(expand("<amatch>"))
+augroup END
+com! -nargs=? -complete=file Vimuntar call tar#Vimuntar(<q-args>)
+
+" ---------------------------------------------------------------------
+" Restoration And Modelines: {{{1
+" vim: fdm=marker
+let &cpo= s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/plugin/tohtml.vim b/runtime/plugin/tohtml.vim
new file mode 100644
index 0000000..0369313
--- /dev/null
+++ b/runtime/plugin/tohtml.vim
@@ -0,0 +1,235 @@
+" Vim plugin for converting a syntax highlighted file to HTML.
+" Maintainer: Ben Fritz <fritzophrenic@gmail.com>
+" Last Change: 2023 Jan 01
+"
+" The core of the code is in $VIMRUNTIME/autoload/tohtml.vim and
+" $VIMRUNTIME/syntax/2html.vim
+"
+if exists('g:loaded_2html_plugin')
+ finish
+endif
+let g:loaded_2html_plugin = 'vim9.0_v1'
+
+"
+" Changelog: {{{
+" 9.0_v1 (this version): - Implement g:html_no_doc and g:html_no_modeline
+" for diff mode. Add tests.
+" (Vim 9.0.1122): NOTE: no version string update for this version!
+" - Bugfix for variable name in g:html_no_doc
+" (Vim 9.0.0819): NOTE: no version string update for this version!
+" - Add options g:html_no_doc, g:html_no_lines,
+" and g:html_no_modeline (partially included in Vim
+" runtime prior to version string update).
+" - Updates for new Vim9 string append style (i.e. use
+" ".." instead of ".")
+"
+" 8.1 updates: {{{
+" 8.1_v2 (Vim 8.1.2312): - Fix SourceForge issue #19: fix calculation of tab
+" stop position to use in expanding a tab, when that
+" tab occurs after a syntax match which in turn
+" comes after previously expanded tabs.
+" - Set eventignore while splitting a window for the
+" destination file to ignore FileType events;
+" speeds up processing when the destination file
+" already exists and HTML highlight takes too long.
+" - Fix SourceForge issue #20: progress bar could not be
+" seen when DiffDelete background color matched
+" StatusLine background color. Added TOhtmlProgress
+" highlight group for manual user override, but
+" calculate it to be visible compared to StatusLine
+" by default.
+" - Fix SourceForge issue #1: Remove workaround for old
+" browsers which don't support 'ch' CSS unit, since
+" all modern browsers, including IE>=9, support it.
+" - Fix SourceForge issue #10: support termguicolors
+" - Fix SourceForge issue #21: default to using
+" generated content instead of <input> tags for
+" uncopyable text, so that text is correctly
+" prevented from being copied in chrome. Use
+" g:html_use_input_for_pc option to control the
+" method used.
+" - Switch to HTML5 to allow using vnu as a validator
+" in unit test.
+" - Fix fallback sizing of <input> tags for browsers
+" without "ch" support.
+" - Fix cursor on unselectable diff filler text.
+" 8.1_v1 (Vim 8.1.0528): - Fix SourceForge issue #6: Don't generate empty
+" script tag.
+" - Fix SourceForge issue #5: javascript should
+" declare variables with "var".
+" - Fix SourceForge issue #13: errors thrown sourcing
+" 2html.vim directly when plugins not loaded.
+" - Fix SourceForge issue #16: support 'vartabstop'.
+"}}}
+"
+" 7.4 updates: {{{
+" 7.4_v2 (Vim 7.4.0899): Fix error raised when converting a diff containing
+" an empty buffer. Jan Stocker: allow g:html_font to
+" take a list so it is easier to specfiy fallback
+" fonts in the generated CSS.
+" 7.4_v1 (Vim 7.4.0000): Fix modeline mangling for new "Vim:" format, and
+" also for version-specific modelines like "vim>703:".
+"}}}
+"
+" 7.3 updates: {{{
+" 7.3_v14 (Vim 7.3.1246): Allow suppressing line number anchors using
+" g:html_line_ids=0. Allow customizing
+" important IDs (like line IDs and fold IDs) using
+" g:html_id_expr evaluated when the buffer conversion
+" is started.
+" 7.3_v13 (Vim 7.3.1088): Keep foldmethod at manual in the generated file and
+" insert modeline to set it to manual.
+" Fix bug: diff mode with 2 unsaved buffers creates a
+" duplicate of one buffer instead of including both.
+" Add anchors to each line so you can put '#L123'
+" or '#123' at the end of the URL to jump to line 123
+" (idea by Andy Spencer). Add javascript to open folds
+" to show the anchor being jumped to if it is hidden.
+" Fix XML validation error: &nsbp; not part of XML.
+" Allow TOhtml to chain together with other commands
+" using |.
+" 7.3_v12 (Vim 7.3.0616): Fix modeline mangling to also work for when multiple
+" highlight groups make up the start-of-modeline text.
+" Improve render time of page with uncopyable regions
+" by not using one-input-per-char. Change name of
+" uncopyable option from html_unselectable to
+" html_prevent_copy. Added html_no_invalid option and
+" default to inserting invalid markup for uncopyable
+" regions to prevent MS Word from pasting undeletable
+" <input> elements. Fix 'cpo' handling (Thilo Six).
+" 7.3_v12b1: Add html_unselectable option. Rework logic to
+" eliminate post-processing substitute commands in
+" favor of doing the work up front. Remove unnecessary
+" special treatment of 'LineNr' highlight group. Minor
+" speed improvements. Fix modeline mangling in
+" generated output so it works for text in the first
+" column. Fix missing line number and fold column in
+" diff filler lines. Fix that some fonts have a 1px
+" gap (using a dirty hack, improvements welcome). Add
+" "colorscheme" meta tag. Does NOT include support for
+" the new default foldtext added in v11, as the patch
+" adding it has not yet been included in Vim.
+" 7.3_v11 ( unreleased ): Support new default foldtext from patch by Christian
+" Brabandt in
+" http://groups.google.com/d/topic/vim_dev/B6FSGfq9VoI/discussion.
+" This patch has not yet been included in Vim, thus
+" these changes are removed in the next version.
+" 7.3_v10 (Vim 7.3.0227): Fix error E684 when converting a range wholly inside
+" multiple nested folds with dynamic folding on.
+" Also fix problem with foldtext in this situation.
+" 7.3_v9 (Vim 7.3.0170): Add html_pre_wrap option active with html_use_css
+" and without html_no_pre, default value same as
+" 'wrap' option, (Andy Spencer). Don't use
+" 'fileencoding' for converted document encoding if
+" 'buftype' indicates a special buffer which isn't
+" written.
+" 7.3_v8 (Vim 7.3.0100): Add html_expand_tabs option to allow leaving tab
+" characters in generated output (Andy Spencer).
+" Escape text that looks like a modeline so Vim
+" doesn't use anything in the converted HTML as a
+" modeline. Bugfixes: Fix folding when a fold starts
+" before the conversion range. Remove fold column when
+" there are no folds.
+" 7.3_v7 (Vim 7-3-0063): see betas released on vim_dev below:
+" 7.3_v7b3: Fixed bug, convert Unicode to UTF-8 all the way.
+" 7.3_v7b2: Remove automatic detection of encodings that are not
+" supported by all major browsers according to
+" http://wiki.whatwg.org/wiki/Web_Encodings and
+" convert to UTF-8 for all Unicode encodings. Make
+" HTML encoding to Vim encoding detection be
+" case-insensitive for built-in pairs.
+" 7.3_v7b1: Remove use of setwinvar() function which cannot be
+" called in restricted mode (Andy Spencer). Use
+" 'fencoding' instead of 'encoding' to determine by
+" charset, and make sure the 'fenc' of the generated
+" file matches its indicated charset. Add charsets for
+" all of Vim's natively supported encodings.
+" 7.3_v6 (Vim 7.3.0000): Really fix bug with 'nowrapscan', 'magic' and other
+" user settings interfering with diff mode generation,
+" trailing whitespace (e.g. line number column) when
+" using html_no_pre, and bugs when using
+" html_hover_unfold.
+" 7.3_v5 ( unreleased ): Fix bug with 'nowrapscan' and also with out-of-sync
+" folds in diff mode when first line was folded.
+" 7.3_v4 (Vim 7.3.0000): Bugfixes, especially for xhtml markup, and diff mode
+" 7.3_v3 (Vim 7.3.0000): Refactor option handling and make html_use_css
+" default to true when not set to anything. Use strict
+" doctypes where possible. Rename use_xhtml option to
+" html_use_xhtml for consistency. Use .xhtml extension
+" when using this option. Add meta tag for settings.
+" 7.3_v2 (Vim 7.3.0000): Fix syntax highlighting in diff mode to use both the
+" diff colors and the normal syntax colors
+" 7.3_v1 (Vim 7.3.0000): Add conceal support and meta tags in output
+"}}}
+"}}}
+
+" TODO: {{{
+" * Check the issue tracker:
+" https://sourceforge.net/p/vim-tohtml/issues/search/?q=%21status%3Aclosed
+" * Options for generating the CSS in external style sheets. New :TOcss
+" command to convert the current color scheme into a (mostly) generic CSS
+" stylesheet which can be re-used. Alternate stylesheet support? Good start
+" by Erik Falor
+" ( https://groups.google.com/d/topic/vim_use/7XTmC4D22dU/discussion ).
+" * Add optional argument to :TOhtml command to specify mode (gui, cterm,
+" term) to use for the styling. Suggestion by "nacitar".
+" * Add way to override or specify which RGB colors map to the color numbers
+" in cterm. Get better defaults than just guessing? Suggestion by "nacitar".
+" * Disable filetype detection until after all processing is done.
+" * Add option for not generating the hyperlink on stuff that looks like a
+" URL? Or just color the link to fit with the colorscheme (and only special
+" when hovering)?
+" * Bug: Opera does not allow printing more than one page if uncopyable
+" regions is turned on. Possible solution: Add normal text line numbers with
+" display:none, set to display:inline for print style sheets, and hide
+" <input> elements for print, to allow Opera printing multiple pages (and
+" other uncopyable areas?). May need to make the new text invisible to IE
+" with conditional comments to prevent copying it, IE for some reason likes
+" to copy hidden text. Other browsers too?
+" * Bug: still a 1px gap throughout the fold column when html_prevent_copy is
+" "fn" in some browsers. Specifically, in Chromium on Ubuntu (but not Chrome
+" on Windows). Perhaps it is font related?
+" * Bug: still some gaps in the fold column when html_prevent_copy contains
+" 'd' and showing the whole diff (observed in multiple browsers). Only gaps
+" on diff lines though.
+" * Undercurl support via CSS3, with fallback to dotted or something:
+" https://groups.google.com/d/topic/vim_use/BzXA6He1pHg/discussion
+" * Redo updates for modified default foldtext (v11) when/if the patch is
+" accepted to modify it.
+" * Test case +diff_one_file-dynamic_folds+expand_tabs-hover_unfold
+" +ignore_conceal-ignore_folding+no_foldcolumn+no_pre+no_progress
+" +number_lines-pre_wrap-use_css+use_xhtml+whole_filler.xhtml
+" does not show the whole diff filler as it is supposed to?
+" * Bug: when 'isprint' is wrong for the current encoding, will generate
+" invalid content. Can/should anything be done about this? Maybe a separate
+" plugin to correct 'isprint' based on encoding?
+" * Check to see if the windows-125\d encodings actually work in Unix without
+" the 8bit- prefix. Add prefix to autoload dictionaries for Unix if not.
+" * Font auto-detection similar to
+" http://www.vim.org/scripts/script.php?script_id=2384 but for a variety of
+" platforms.
+" * Pull in code from http://www.vim.org/scripts/script.php?script_id=3113 :
+" - listchars support
+" - full-line background highlight
+" - other?
+" * Make it so deleted lines in a diff don't create side-scrolling (get it
+" free with full-line background highlight above).
+" * Restore open/closed folds and cursor position after processing each file
+" with option not to restore for speed increase.
+" * Add extra meta info (generation time, etc.)?
+" * Tidy up so we can use strict doctype in even more situations
+" * Implementation detail: add threshold for writing the lines to the html
+" buffer before we're done (5000 or so lines should do it)
+" * TODO comments for code cleanup scattered throughout
+"}}}
+
+" Define the :TOhtml command when:
+" - 'compatible' is not set
+" - this plugin or user override was not already loaded
+" - user commands are available. {{{
+if !&cp && !exists(":TOhtml") && has("user_commands")
+ command -range=% -bar TOhtml :call tohtml#Convert2HTML(<line1>, <line2>)
+endif "}}}
+
+" Make sure any patches will probably use consistent indent
+" vim: ts=8 sw=2 sts=2 noet fdm=marker
diff --git a/runtime/plugin/vimballPlugin.vim b/runtime/plugin/vimballPlugin.vim
new file mode 100644
index 0000000..d7473a0
--- /dev/null
+++ b/runtime/plugin/vimballPlugin.vim
@@ -0,0 +1,43 @@
+" vimballPlugin : construct a file containing both paths and files
+" Author: Charles E. Campbell
+" Copyright: (c) 2004-2014 by Charles E. Campbell
+" The VIM LICENSE applies to Vimball.vim, and Vimball.txt
+" (see |copyright|) except use "Vimball" instead of "Vim".
+" No warranty, express or implied.
+" *** *** Use At-Your-Own-Risk! *** ***
+"
+" (Rom 2:1 WEB) Therefore you are without excuse, O man, whoever you are who
+" judge. For in that which you judge another, you condemn yourself. For
+" you who judge practice the same things.
+" GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_vimballPlugin")
+ finish
+endif
+let g:loaded_vimballPlugin = "v37"
+let s:keepcpo = &cpo
+set cpo&vim
+
+" ------------------------------------------------------------------------------
+" Public Interface: {{{1
+com! -range -complete=file -nargs=+ -bang MkVimball call vimball#MkVimball(<line1>,<line2>,<bang>0,<f-args>)
+com! -nargs=? -complete=dir UseVimball call vimball#Vimball(1,<f-args>)
+com! -nargs=0 VimballList call vimball#Vimball(0)
+com! -nargs=* -complete=dir RmVimball call vimball#SaveSettings()|call vimball#RmVimball(<f-args>)|call vimball#RestoreSettings()
+augroup Vimball
+ au!
+ au BufEnter *.vba,*.vba.gz,*.vba.bz2,*.vba.zip,*.vba.xz setlocal bt=nofile fmr=[[[,]]] fdm=marker|if &ff != 'unix'|setlocal ma ff=unix noma|endif|if line('$') > 1|call vimball#ShowMesg(0,"Source this file to extract it! (:so %)")|endif
+ au SourceCmd *.vba.gz,*.vba.bz2,*.vba.zip,*.vba.xz let s:origfile=expand("%")|if expand("%")!=expand("<afile>") | exe "1sp" fnameescape(expand("<afile>"))|endif|call vimball#Decompress(expand("<amatch>"))|so %|if s:origfile!=expand("<afile>")|close|endif
+ au SourceCmd *.vba if expand("%")!=expand("<afile>") | exe "1sp" fnameescape(expand("<afile>"))|call vimball#Vimball(1)|close|else|call vimball#Vimball(1)|endif
+ au BufEnter *.vmb,*.vmb.gz,*.vmb.bz2,*.vmb.zip,*.vmb.xz setlocal bt=nofile fmr=[[[,]]] fdm=marker|if &ff != 'unix'|setlocal ma ff=unix noma|endif|if line('$') > 1|call vimball#ShowMesg(0,"Source this file to extract it! (:so %)")|endif
+ au SourceCmd *.vmb.gz,*.vmb.bz2,*.vmb.zip,*.vmb.xz let s:origfile=expand("%")|if expand("%")!=expand("<afile>") | exe "1sp" fnameescape(expand("<afile>"))|endif|call vimball#Decompress(expand("<amatch>"))|so %|if s:origfile!=expand("<afile>")|close|endif
+ au SourceCmd *.vmb if expand("%")!=expand("<afile>") | exe "1sp" fnameescape(expand("<afile>"))|call vimball#Vimball(1)|close|else|call vimball#Vimball(1)|endif
+augroup END
+
+" =====================================================================
+" Restoration And Modelines: {{{1
+" vim: fdm=marker
+let &cpo= s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/plugin/zipPlugin.vim b/runtime/plugin/zipPlugin.vim
new file mode 100644
index 0000000..edc5271
--- /dev/null
+++ b/runtime/plugin/zipPlugin.vim
@@ -0,0 +1,56 @@
+" zipPlugin.vim: Handles browsing zipfiles
+" PLUGIN PORTION
+" Date: Jan 07, 2020
+" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" License: Vim License (see vim's :help license)
+" 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,
+" zipPlugin.vim is provided *as is* and comes with no warranty
+" of any kind, either 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.
+"
+" (James 4:8 WEB) Draw near to God, and he will draw near to you.
+" Cleanse your hands, you sinners; and purify your hearts, you double-minded.
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if &cp || exists("g:loaded_zipPlugin")
+ finish
+endif
+let g:loaded_zipPlugin = "v32"
+let s:keepcpo = &cpo
+set cpo&vim
+
+" ---------------------------------------------------------------------
+" Options: {{{1
+if !exists("g:zipPlugin_ext")
+ let g:zipPlugin_ext='*.aar,*.apk,*.celzip,*.crtx,*.docm,*.docx,*.dotm,*.dotx,*.ear,*.epub,*.gcsx,*.glox,*.gqsx,*.ja,*.jar,*.kmz,*.odb,*.odc,*.odf,*.odg,*.odi,*.odm,*.odp,*.ods,*.odt,*.otc,*.otf,*.otg,*.oth,*.oti,*.otp,*.ots,*.ott,*.oxt,*.potm,*.potx,*.ppam,*.ppsm,*.ppsx,*.pptm,*.pptx,*.sldx,*.thmx,*.vdw,*.war,*.wsz,*.xap,*.xlam,*.xlam,*.xlsb,*.xlsm,*.xlsx,*.xltm,*.xltx,*.xpi,*.zip'
+endif
+
+" ---------------------------------------------------------------------
+" Public Interface: {{{1
+augroup zip
+ au!
+ au BufReadCmd zipfile:* call zip#Read(expand("<amatch>"), 1)
+ au FileReadCmd zipfile:* call zip#Read(expand("<amatch>"), 0)
+ au BufWriteCmd zipfile:* call zip#Write(expand("<amatch>"))
+ au FileWriteCmd zipfile:* call zip#Write(expand("<amatch>"))
+
+ if has("unix")
+ au BufReadCmd zipfile:*/* call zip#Read(expand("<amatch>"), 1)
+ au FileReadCmd zipfile:*/* call zip#Read(expand("<amatch>"), 0)
+ au BufWriteCmd zipfile:*/* call zip#Write(expand("<amatch>"))
+ au FileWriteCmd zipfile:*/* call zip#Write(expand("<amatch>"))
+ endif
+
+ exe "au BufReadCmd ".g:zipPlugin_ext.' call zip#Browse(expand("<amatch>"))'
+augroup END
+
+" ---------------------------------------------------------------------
+" Restoration And Modelines: {{{1
+" vim: fdm=marker
+let &cpo= s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/print/ascii.ps b/runtime/print/ascii.ps
new file mode 100644
index 0000000..5fcffb6
--- /dev/null
+++ b/runtime/print/ascii.ps
@@ -0,0 +1,22 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-ascii
+%%Version: 1.0 0
+%%EndComments
+/VIM-ascii[
+32{/.notdef}repeat
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+128{/.notdef}repeat]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/cidfont.ps b/runtime/print/cidfont.ps
new file mode 100644
index 0000000..a06ebc8
--- /dev/null
+++ b/runtime/print/cidfont.ps
@@ -0,0 +1,26 @@
+%!PS-Adobe-3.0 Resource-ProcSet
+%%Title: VIM-CIDFont
+%%Version: 1.0 0
+%%EndComments
+% Editing of this file is NOT RECOMMENDED. You run a very good risk of causing
+% all PostScript printing from VIM failing if you do. PostScript is not called
+% a write-only language for nothing!
+/CP currentpacking d T setpacking
+/SB 256 string d
+/CIDN? systemdict/composefont known d /GS? systemdict/.makeoperator known d
+CIDN?{
+GS?{/vim_findresource{2 copy resourcestatus not{1 index SB cvs runlibfile}{
+pop pop}ifelse findresource}bd/vim_composefont{0 get/CIDFont vim_findresource
+exch/CMap vim_findresource exch[exch]composefont pop}bd}{/vim_findresource
+/findresource ld/vim_composefont{composefont pop}bd}ifelse
+}{
+/vim_fontname{0 get SB cvs length dup SB exch(-)putinterval 1 add dup SB exch
+dup 256 exch sub getinterval 3 -1 roll exch cvs length add SB exch 0 exch
+getinterval cvn}bd/vim_composefont{vim_fontname findfont d}bd
+} ifelse
+/cfs{exch scalefont d}bd
+/sffs{findfont 3 1 roll 1 index mul exch 2 index/FontMatrix get matrix copy
+scale makefont d}bd
+CP setpacking
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/cns_roman.ps b/runtime/print/cns_roman.ps
new file mode 100644
index 0000000..dba385c
--- /dev/null
+++ b/runtime/print/cns_roman.ps
@@ -0,0 +1,23 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-cns_roman
+%%Version: 1.0 0
+%%EndComments
+% Different to ASCII at code point 126
+/VIM-cns_roman[
+32{/.notdef}repeat
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /overline /.notdef
+128{/.notdef}repeat]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/cp1250.ps b/runtime/print/cp1250.ps
new file mode 100644
index 0000000..9e733cc
--- /dev/null
+++ b/runtime/print/cp1250.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-cp1250
+%%Version: 1.0 0
+%%EndComments
+/VIM-cp1250[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /tilde /.notdef
+/Euro /.notdef /quotesinglbase /.notdef /quotedblbase /ellipsis /dagger /daggerdbl
+/.notdef /perthousand /Scaron /guilsinglleft /Sacute /Tcaron /Zcaron /Zacute
+/.notdef /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+/.notdef /trademark /scaron /guilsinglright /sacute /tcaron /zcaron /zacute
+/space /caron /breve /Lslash /currency /Aogonek /brokenbar /section
+/dieresis /copyright /Scedilla /guillemotleft /logicalnot /hyphen /registered /Zdotaccent
+/degree /plusminus /ogonek /lslash /acute /mu /paragraph /periodcentered
+/cedilla /aogonek /scedilla /guillemotright /Lcaron /hungarumlaut /lcaron /zdotaccent
+/Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla
+/Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron
+/Dcroat /Nacute /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply
+/Rcaron /Uring /Uacute /Uhungarumlaut /Udieresis /Yacute /Tcedilla /germandbls
+/racute /aacute /acircumflex /abreve /adieresis /lacute /cacute /ccedilla
+/ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron
+/dcroat /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide
+/rcaron /uring /uacute /uhungarumlaut /udieresis /yacute /tcedilla /dotaccent]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/cp1251.ps b/runtime/print/cp1251.ps
new file mode 100644
index 0000000..7137504
--- /dev/null
+++ b/runtime/print/cp1251.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-cp1251
+%%Version: 1.0 0
+%%EndComments
+/VIM-cp1251[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/afii10051 /afii10052 /quotesinglbase /afii10100 /quotedblbase /ellipsis /dagger /daggerdbl
+/Euro /perthousand /afii10058 /guilsinglleft /afii10059 /afii10061 /afii10060 /afii10145
+/afii10099 /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+/.notdef /trademark /afii10106 /guilsinglright /afii10107 /afii10109 /afii10108 /afii10193
+/space /afii10062 /afii10110 /afii10057 /currency /afii10050 /brokenbar /section
+/afii10023 /copyright /afii10053 /guillemotleft /logicalnot /hyphen /registered /afii10056
+/degree /plusminus /afii10055 /afii10103 /afii10098 /mu /paragraph /periodcentered
+/afii10071 /afii61352 /afii10101 /guillemotright /afii10105 /afii10054 /afii10102 /afii10104
+/afii10017 /afii10018 /afii10019 /afii10020 /afii10021 /afii10022 /afii10024 /afii10025
+/afii10026 /afii10027 /afii10028 /afii10029 /afii10030 /afii10031 /afii10032 /afii10033
+/afii10034 /afii10035 /afii10036 /afii10037 /afii10038 /afii10039 /afii10040 /afii10041
+/afii10042 /afii10043 /afii10044 /afii10045 /afii10046 /afii10047 /afii10048 /afii10049
+/afii10065 /afii10066 /afii10067 /afii10068 /afii10069 /afii10070 /afii10072 /afii10073
+/afii10074 /afii10075 /afii10076 /afii10077 /afii10078 /afii10079 /afii10080 /afii10081
+/afii10082 /afii10083 /afii10084 /afii10085 /afii10086 /afii10087 /afii10088 /afii10089
+/afii10090 /afii10091 /afii10092 /afii10093 /afii10094 /afii10095 /afii10096 /afii10097]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/cp1252.ps b/runtime/print/cp1252.ps
new file mode 100644
index 0000000..a4dd7e6
--- /dev/null
+++ b/runtime/print/cp1252.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-cp1252
+%%Version: 1.0 0
+%%EndComments
+/VIM-cp1252[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/Euro /.notdef /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
+/circumflex /perthousand /Scaron /guilsinglleft /OE /.notdef /Zcaron /.notdef
+/.notdef /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+/tilde /trademark /scaron /guilsinglright /oe /.notdef /zcaron /Ydieresis
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/cp1253.ps b/runtime/print/cp1253.ps
new file mode 100644
index 0000000..0482232
--- /dev/null
+++ b/runtime/print/cp1253.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-cp1253
+%%Version: 1.0 0
+%%EndComments
+/VIM-cp1253[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
+/.notdef /perthousand /.notdef /guilsinglleft /.notdef /.notdef /.notdef /.notdef
+/.notdef /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+/.notdef /trademark /.notdef /guilsinglright /.notdef /.notdef /.notdef /.notdef
+/space /dieresistonos /Alphatonos /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /emdash
+/degree /plusminus /twosuperior /threesuperior /tonos /mu /paragraph /periodcentered
+/Epsilontonos /Etatonos /Iotatonos /guillemotright /Omicrontonos /onehalf /Upsilontonos /Omegatonos
+/iotadieresistonos /Alpha /Beta /Gamma /Delta /Epsilon /Zeta /Eta
+/Theta /Iota /Kappa /Lambda /Mu /Nu /Xi /Omicron
+/Pi /Rho /.notdef /Sigma /Tau /Upsilon /Phi /Chi
+/Psi /Omega /Iotadieresis /Upsilondieresis /alphatonos /epsilontonos /etatonos /iotatonos
+/upsilondieresistonos /alpha /beta /gamma /delta /epsilon /zeta /eta
+/theta /iota /kappa /lambda /mu /nu /xi /omicron
+/pi /rho /sigma1 /sigma /tau /upsilon /phi /chi
+/psi /omega /iotadieresis /upsilondieresis /omicrontonos /upsilontonos /omegatonos /.notdef]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/cp1254.ps b/runtime/print/cp1254.ps
new file mode 100644
index 0000000..9fe7e47
--- /dev/null
+++ b/runtime/print/cp1254.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-cp1254
+%%Version: 1.0 0
+%%EndComments
+/VIM-cp1254[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/Euro /.notdef /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
+/circumflex /perthousand /Scaron /guilsinglleft /OE /.notdef /Zcaron /.notdef
+/.notdef /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+/tilde /trademark /scaron /guilsinglright /oe /.notdef /zcaron /Ydieresis
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Gbreve /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Idotaccent /Scedilla /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/gbreve /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /dotlessi /scedilla /ydieresis]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/cp1255.ps b/runtime/print/cp1255.ps
new file mode 100644
index 0000000..cd82f46
--- /dev/null
+++ b/runtime/print/cp1255.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-cp1255
+%%Version: 1.0 0
+%%EndComments
+/VIM-cp1255[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
+/circumflex /perthousand /.notdef /guilsinglleft /.notdef /.notdef /.notdef /.notdef
+/.notdef /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+/tilde /trademark /.notdef /guilsinglright /.notdef /.notdef /.notdef /.notdef
+/space /.notdef /cent /sterling /newsheqelsign /yen /brokenbar /section
+/dieresis /copyright /.notdef /guillemotleft /logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/.notdef /onesuperior /.notdef /guillemotright /onequarter /onehalf /threequarters /.notdef
+/sheva /hatafsegol /hatafpatah /hatafqamats /hiriq /tsere /segol /patah
+/qamats /holam /.notdef /qubuts /dagesh /meteg /maqaf /rafe
+/paseq /shindot /sindot /sofpasuq /doublevav /vavyod /doubleyod /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/alef /bet /gimel /dalet /he /vav /zayin /het
+/tet /yod /finalkaf /kaf /lamed /finalmem /mem /finalnun
+/nun /samekh /ayin /finalpe /pe /finaltsadi /tsadi /qof
+/resh /shin /tav /.notdef /.notdef /.notdef /.notdef /.notdef]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/cp1257.ps b/runtime/print/cp1257.ps
new file mode 100644
index 0000000..2e5d7a7
--- /dev/null
+++ b/runtime/print/cp1257.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-cp1257
+%%Version: 1.0 0
+%%EndComments
+/VIM-cp1257[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /quotesinglbase /.notdef /quotedblbase /ellipsis /dagger /daggerdbl
+/.notdef /perthousand /.notdef /guilsinglleft /.notdef /.notdef /.notdef /.notdef
+/.notdef /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
+/.notdef /trademark /.notdef /guilsinglright /.notdef /.notdef /.notdef /.notdef
+/space /caron /breve /sterling /currency /.notdef /brokenbar /section
+/dieresis /copyright /Rcedilla /guillemotleft /logicalnot /hyphen /registered /AE
+/degree /plusminus /ogonek /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /rcedilla /guillemotright /onequarter /onehalf /threequarters /ae
+/Aogonek /Iogonek /Amacron /Cacute /Adieresis /Aring /Eogonek /Emacron
+/Ccaron /Eacute /Zacute /Edot /Gcedilla /Kcedilla /Imacron /Lcedilla
+/Scaron /Nacute /Ncedilla /Oacute /Omacron /Otilde /Odieresis /multiply
+/Uogonek /Lslash /Sacute /Umacron /Udieresis /Zdotaccent /Zcaron /germandbls
+/aogonek /iogonek /amacron /cacute /adieresis /aring /eogonek /emacron
+/ccaron /eacute /zacute /edot /gcedilla /kcedilla /imacron /lcedilla
+/scaron /nacute /ncedilla /oacute /omacron /otilde /odieresis /divide
+/uogonek /lslash /sacute /umacron /udieresis /zdotaccent /zcaron /dotaccent]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/dec-mcs.ps b/runtime/print/dec-mcs.ps
new file mode 100644
index 0000000..34702b7
--- /dev/null
+++ b/runtime/print/dec-mcs.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-dec-mcs
+%%Version: 1.0 0
+%%EndComments
+/VIM-dec-mcs[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /exclamdown /cent /sterling /.notdef /yen /.notdef /section
+/currency /copyright /ordfeminine /guillemotleft /.notdef /.notdef /.notdef /.notdef
+/degree /plusminus /twosuperior /threesuperior /.notdef /mu /paragraph /periodcentered
+/.notdef /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /.notdef /questiondown
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/.notdef /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /OE
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Ydieresis /.notdef /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/.notdef /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /oe
+/oslash /ugrave /uacute /ucircumflex /udieresis /ydieresis /.notdef /.notdef]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/ebcdic-uk.ps b/runtime/print/ebcdic-uk.ps
new file mode 100644
index 0000000..1070074
--- /dev/null
+++ b/runtime/print/ebcdic-uk.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-ebcdic-uk
+%%Version: 1.0 0
+%%EndComments
+/VIM-ebcdic-uk[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /dollar /period /less /parenleft /plus /bar
+/ampersand /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /exclam /sterling /asterisk /parenright /semicolon /logicalnot
+/minus /slash /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /brokenbar /comma /percent /underscore /greater /question
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /quotereversed /colon /numbersign /at /quoteright /equal /quotedbl
+/.notdef /a /b /c /d /e /f /g
+/h /i /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /j /k /l /m /n /o /p
+/q /r /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /macron /s /t /u /v /w /x
+/y /z /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/braceleft /A /B /C /D /E /F /G
+/H /I /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/braceright /J /K /L /M /N /O /P
+/Q /R /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/backslash /.notdef /S /T /U /V /W /X
+/Y /Z /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/zero /one /two /three /four /five /six /seven
+/eight /nine /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/gb_roman.ps b/runtime/print/gb_roman.ps
new file mode 100644
index 0000000..fa78dbf
--- /dev/null
+++ b/runtime/print/gb_roman.ps
@@ -0,0 +1,23 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-gb_roman
+%%Version: 1.0 0
+%%EndComments
+% Different to ASCII at code points 36 and 126
+/VIM-gb_roman[
+32{/.notdef}repeat
+/space /exclam /quotedbl /numbersign /yuan /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /overline /.notdef
+128{/.notdef}repeat]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/hp-roman8.ps b/runtime/print/hp-roman8.ps
new file mode 100644
index 0000000..d71b876
--- /dev/null
+++ b/runtime/print/hp-roman8.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-hp-roman8
+%%Version: 1.0 0
+%%EndComments
+/VIM-hp-roman8[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /Agrave /Acircumflex /Egrave /Ecircumflex /Edieresis /Icircumflex /Idieresis
+/acute /grave /circumflex /dieresis /tilde /Ugrave /Ucircumflex /lira
+/macron /Yacute /yacute /degree /Ccedilla /ccedilla /Ntilde /ntilde
+/exclamdown /questiondown /currency /sterling /yen /section /florin /cent
+/acircumflex /ecircumflex /ocircumflex /ucircumflex /aacute /eacute /oacute /uacute
+/agrave /egrave /ograve /ugrave /adieresis /edieresis /odieresis /udieresis
+/Aring /icircumflex /Oslash /AE /aring /iacute /oslash /ae
+/Adieresis /igrave /Odieresis /Udieresis /Eacute /idieresis /germandbls /Ocircumflex
+/Aacute /Atilde /atilde /Eth /eth /Iacute /Igrave /Oacute
+/Ograve /Otilde /otilde /Scaron /scaron /Uacute /Ydieresis /ydieresis
+/Thorn /thorn /periodcentered /mu /paragraph /threequarters /hyphen /onequarter
+/onehalf /ordfeminine /ordmasculine /guillemotleft /filledbox /guillemotright /plusminus /.notdef]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-10.ps b/runtime/print/iso-8859-10.ps
new file mode 100644
index 0000000..7d8e2a0
--- /dev/null
+++ b/runtime/print/iso-8859-10.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-10
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-10[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /Aogonek /Emacron /Gcedilla /Imacron /Itilde /Kcedilla /section
+/Lcedilla /Dcroat /Scaron /Tbar /Zcaron /endash /Umacron /Eng
+/degree /aogonek /emacron /gcedilla /imacron /itilde /kcedilla /periodcentered
+/lcedilla /dcroat /scaron /tbar /zcaron /emdash /umacron /eng
+/Amacron /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Iogonek
+/Ccaron /Eacute /Eogonek /Edieresis /Edot /Iacute /Icircumflex /Idieresis
+/Eth /Ncedilla /Omacron /Oacute /Ocircumflex /Otilde /Odieresis /Utilde
+/Oslash /Uogonek /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+/amacron /aacute /acircumflex /atilde /adieresis /aring /ae /iogonek
+/ccaron /eacute /eogonek /edieresis /edot /iacute /icircumflex /idieresis
+/eth /ncedilla /omacron /oacute /ocircumflex /otilde /odieresis /utilde
+/oslash /uogonek /uacute /ucircumflex /udieresis /yacute /thorn /kgreenlandic]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-11.ps b/runtime/print/iso-8859-11.ps
new file mode 100644
index 0000000..78f775b
--- /dev/null
+++ b/runtime/print/iso-8859-11.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-11
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-11[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /uni0E01 /uni0E02 /uni0E03 /uni0E04 /uni0E05 /uni0E06 /uni0E07
+/uni0E08 /uni0E09 /uni0E0A /uni0E0B /uni0E0C /uni0E0D /uni0E0E /uni0E0F
+/uni0E10 /uni0E11 /uni0E12 /uni0E13 /uni0E14 /uni0E15 /uni0E16 /uni0E17
+/uni0E18 /uni0E19 /uni0E1A /uni0E1B /uni0E1C /uni0E1D /uni0E1E /uni0E1F
+/uni0E20 /uni0E21 /uni0E22 /uni0E23 /uni0E24 /uni0E25 /uni0E26 /uni0E27
+/uni0E28 /uni0E29 /uni0E2A /uni0E2B /uni0E2C /uni0E2D /uni0E2E /uni0E2F
+/uni0E30 /uni0E31 /uni0E32 /uni0E33 /uni0E34 /uni0E35 /uni0E36 /uni0E37
+/uni0E38 /uni0E39 /uni0E3A /.notdef /space /.notdef /.notdef /uni0E3F
+/uni0E40 /uni0E41 /uni0E42 /uni0E43 /uni0E44 /uni0E45 /uni0E46 /uni0E47
+/uni0E48 /uni0E49 /uni0E4A /uni0E4B /uni0E4C /uni0E4D /uni0E4E /uni0E4F
+/uni0E50 /uni0E51 /uni0E52 /uni0E53 /uni0E54 /uni0E55 /uni0E56 /uni0E57
+ /uni0E58 /uni0E59 /uni0E5A /.notdef /.notdef /.notdef /.notdef /.notdef]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-13.ps b/runtime/print/iso-8859-13.ps
new file mode 100644
index 0000000..b4348f6
--- /dev/null
+++ b/runtime/print/iso-8859-13.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-13
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-13[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /quotedblright /cent /sterling /currency /quotedblbase /brokenbar /section
+/Oslash /copyright /Rcedilla /guillemotleft /logicalnot /hyphen /registered /AE
+/degree /plusminus /twosuperior /threesuperior /quotedblleft /mu /paragraph /periodcentered
+/oslash /onesuperior /rcedilla /guillemotright /onequarter /onehalf /threequarters /ae
+/Aogonek /Iogonek /Amacron /Cacute /Adieresis /Aring /Eogonek /Emacron
+/Ccaron /Eacute /Zacute /Edot /Gcedilla /Kcedilla /Imacron /Lcedilla
+/Scaron /Nacute /Ncedilla /Oacute /Omacron /Otilde /Odieresis /multiply
+/Uogonek /Lslash /Sacute /Umacron /Udieresis /Zdotaccent /Zcaron /germandbls
+/aogonek /iogonek /amacron /cacute /adieresis /aring /eogonek /emacron
+/ccaron /eacute /zacute /edot /gcedilla /kcedilla /imacron /lcedilla
+/scaron /nacute /ncedilla /oacute /omacron /otilde /odieresis /divide
+/uogonek /lslash /sacute /umacron /udieresis /zdotaccent /zcaron /quoteright]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-14.ps b/runtime/print/iso-8859-14.ps
new file mode 100644
index 0000000..cdfe042
--- /dev/null
+++ b/runtime/print/iso-8859-14.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-14
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-14[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /uni1E02 /uni1E03 /sterling /Cdotaccent /cdotaccent /uni1E0A /section
+/Wgrave /copyright /Wacute /uni1E0B /Ygrave /hyphen /registered /Ydieresis
+/uni1E1E /uni1E1F /Gdotaccent /gdotaccent /uni1E40 /uni1E41 /paragraph /uni1E56
+/wgrave /uni1E57 /wacute /uni1E60 /ygrave /Wdieresis /wdieresis /uni1E61
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Wcircumflex /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /uni1E6A
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Ycircumflex /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/wcircumflex /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /uni1E6B
+/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /ycircumflex /ydieresis]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-15.ps b/runtime/print/iso-8859-15.ps
new file mode 100644
index 0000000..46ea691
--- /dev/null
+++ b/runtime/print/iso-8859-15.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-15
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-15[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /Euro /yen /Scaron /section
+/scaron /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior /Zcaron /mu /paragraph /periodcentered
+/zcaron /onesuperior /ordmasculine /guillemotright /OE /oe /Ydieresis /questiondown
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-2.ps b/runtime/print/iso-8859-2.ps
new file mode 100644
index 0000000..f6e1933
--- /dev/null
+++ b/runtime/print/iso-8859-2.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-2
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-2[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /Aogonek /breve /Lslash /currency /Lcaron /Sacute /section
+/dieresis /Scaron /Scedilla /Tcaron /Zacute /hyphen /Zcaron /Zdotaccent
+/degree /aogonek /ogonek /lslash /acute /lcaron /sacute /caron
+/cedilla /scaron /scedilla /tcaron /zacute /hungarumlaut /zcaron /zdotaccent
+/Racute /Aacute /Acircumflex /Abreve /Adieresis /Lacute /Cacute /Ccedilla
+/Ccaron /Eacute /Eogonek /Edieresis /Ecaron /Iacute /Icircumflex /Dcaron
+/Dcroat /Nacute /Ncaron /Oacute /Ocircumflex /Ohungarumlaut /Odieresis /multiply
+/Rcaron /Uring /Uacute /Uhungarumlaut /Udieresis /Yacute /Tcedilla /germandbls
+/racute /aacute /acircumflex /abreve /adieresis /lacute /cacute /ccedilla
+/ccaron /eacute /eogonek /edieresis /ecaron /iacute /icircumflex /dcaron
+/dcroat /nacute /ncaron /oacute /ocircumflex /ohungarumlaut /odieresis /divide
+/rcaron /uring /uacute /uhungarumlaut /udieresis /yacute /tcedilla /dotaccent]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-3.ps b/runtime/print/iso-8859-3.ps
new file mode 100644
index 0000000..b5a3474
--- /dev/null
+++ b/runtime/print/iso-8859-3.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-3
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-3[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /Hbar /breve /sterling /currency /.notdef /Hcircumflex /section
+/dieresis /Idot /Scedilla /Gbreve /Jcircumflex /hyphen /.notdef /Zdotaccent
+/degree /hbar /twosuperior /threesuperior /acute /mu /hcircumflex /periodcentered
+/cedilla /dotlessi /scedilla /gbreve /jcircumflex /onehalf /.notdef /zdotaccent
+/Agrave /Aacute /Acircumflex /.notdef /Adieresis /Cdotaccent /Ccircumflex /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/.notdef /Ntilde /Ograve /Oacute /Ocircumflex /Gdotaccent /Odieresis /multiply
+/Gcircumflex /Ugrave /Uacute /Ucircumflex /Udieresis /Ubreve /Scircumflex /germandbls
+/agrave /aacute /acircumflex /.notdef /adieresis /cdotaccent /ccircumflex /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/.notdef /ntilde /ograve /oacute /ocircumflex /gdotaccent /odieresis /divide
+/gcircumflex /ugrave /uacute /ucircumflex /udieresis /ubreve /scircumflex /dotaccent]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-4.ps b/runtime/print/iso-8859-4.ps
new file mode 100644
index 0000000..c917d1f
--- /dev/null
+++ b/runtime/print/iso-8859-4.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-4
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-4[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /Aogonek /kgreenlandic /Rcedilla /currency /Itilde /Lcedilla /section
+/dieresis /Scaron /Emacron /Gcedilla /Tbar /.notdef /Zcaron /macron
+/degree /aogonek /ogonek /rcedilla /acute /itilde /lcedilla /caron
+/cedilla /scaron /emacron /gcedilla /tbar /Eng /zcaron /eng
+/Amacron /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Iogonek
+/Ccaron /Eacute /Eogonek /Edieresis /Edot /Iacute /Icircumflex /Imacron
+/Dcroat /Ncedilla /Omacron /Kcedilla /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Uogonek /Uacute /Ucircumflex /Udieresis /Utilde /Umacron /germandbls
+/amacron /aacute /acircumflex /atilde /adieresis /aring /ae /iogonek
+/ccaron /eacute /eogonek /edieresis /edot /iacute /icircumflex /imacron
+/dcroat /ncedilla /omacron /kcedilla /ocircumflex /otilde /odieresis /divide
+/oslash /uogonek /uacute /ucircumflex /udieresis /utilde /umacron /dotaccent]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-5.ps b/runtime/print/iso-8859-5.ps
new file mode 100644
index 0000000..dbe9628
--- /dev/null
+++ b/runtime/print/iso-8859-5.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-5
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-5[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /afii10023 /afii10051 /afii10052 /afii10053 /afii10054 /afii10055 /afii10056
+/afii10057 /afii10058 /afii10059 /afii10060 /afii10061 /.notdef /afii10062 /afii10145
+/afii10017 /afii10018 /afii10019 /afii10020 /afii10021 /afii10022 /afii10024 /afii10025
+/afii10026 /afii10027 /afii10028 /afii10029 /afii10030 /afii10031 /afii10032 /afii10033
+/afii10034 /afii10035 /afii10036 /afii10037 /afii10038 /afii10039 /afii10040 /afii10041
+/afii10042 /afii10043 /afii10044 /afii10045 /afii10046 /afii10047 /afii10048 /afii10049
+/afii10065 /afii10066 /afii10067 /afii10068 /afii10069 /afii10070 /afii10072 /afii10073
+/afii10074 /afii10075 /afii10076 /afii10077 /afii10078 /afii10079 /afii10080 /afii10081
+/afii10082 /afii10083 /afii10084 /afii10085 /afii10086 /afii10087 /afii10088 /afii10089
+/afii10090 /afii10091 /afii10092 /afii10093 /afii10094 /afii10095 /afii10096 /afii10097
+/afii61352 /afii10071 /afii10099 /afii10100 /afii10101 /afii10102 /afii10103 /afii10104
+/afii10105 /afii10106 /afii10107 /afii10108 /afii10109 /section /afii10110 /afii10193]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-7.ps b/runtime/print/iso-8859-7.ps
new file mode 100644
index 0000000..fc16bf1
--- /dev/null
+++ b/runtime/print/iso-8859-7.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-7
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-7[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /quotereversed /quoteright /sterling /.notdef /.notdef /brokenbar /section
+/dieresis /copyright /.notdef /guillemotleft /logicalnot /.notdef /.notdef /emdash
+/degree /plusminus /twosuperior /threesuperior /tonos /dieresistonos /Alphatonos /periodcentered
+/Epsilontonos /Etatonos /Iotatonos /guillemotright /Omicrontonos /onehalf /Upsilontonos /Omegatonos
+/iotadieresistonos /Alpha /Beta /Gamma /Delta /Epsilon /Zeta /Eta
+/Theta /Iota /Kappa /Lambda /Mu /Nu /Xi /Omicron
+/Pi /Rho /.notdef /Sigma /Tau /Upsilon /Phi /Chi
+/Psi /Omega /Iotadieresis /Upsilondieresis /alphatonos /epsilontonos /etatonos /iotatonos
+/upsilondieresistonos /alpha /beta /gamma /delta /epsilon /zeta /eta
+/theta /iota /kappa /lambda /mu /nu /xi /omicron
+/pi /rho /sigma1 /sigma /tau /upsilon /phi /chi
+/psi /omega /iotadieresis /upsilondieresis /omicrontonos /upsilontonos /omegatonos /.notdef]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-8.ps b/runtime/print/iso-8859-8.ps
new file mode 100644
index 0000000..15193cc
--- /dev/null
+++ b/runtime/print/iso-8859-8.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-8
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-8[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /.notdef /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /multiply /guillemotleft /logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /divide /guillemotright /onequarter /onehalf /threequarters /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /underscoredbl
+/alef /bet /gimel /dalet /he /vav /zayin /het
+/tet /yod /finalkaf /kaf /lamed /finalmem /mem /finalnun
+/nun /samekh /ayin /finalpe /pe /finaltsadi /tsadi /qof
+/resh /shin /tav /.notdef /.notdef /.notdef /.notdef /.notdef]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/iso-8859-9.ps b/runtime/print/iso-8859-9.ps
new file mode 100644
index 0000000..d40f6e9
--- /dev/null
+++ b/runtime/print/iso-8859-9.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-iso-8859-9
+%%Version: 1.0 0
+%%EndComments
+/VIM-iso-8859-9[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Gbreve /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Idotaccent /Scedilla /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/gbreve /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /dotlessi /scedilla /ydieresis]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/jis_roman.ps b/runtime/print/jis_roman.ps
new file mode 100644
index 0000000..f24a806
--- /dev/null
+++ b/runtime/print/jis_roman.ps
@@ -0,0 +1,23 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-jis_roman
+%%Version: 1.0 0
+%%EndComments
+% Different to ASCII at code points 92 and 126
+/VIM-jis_roman[
+32{/.notdef}repeat
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /yen /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /overline /.notdef
+128{/.notdef}repeat]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/koi8-r.ps b/runtime/print/koi8-r.ps
new file mode 100644
index 0000000..d42daab
--- /dev/null
+++ b/runtime/print/koi8-r.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-koi8-r
+%%Version: 1.0 0
+%%EndComments
+/VIM-koi8-r[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/SF100000 /SF110000 /SF010000 /SF030000 /SF020000 /SF040000 /SF080000 /SF090000
+/SF060000 /SF070000 /SF050000 /upblock /dnblock /block /lfblock /rtblock
+/ltshade /shade /dkshade /integraltp /filledbox /bullet /radical /approxequal
+/lessequal /greaterequal /space /integralbt /degree /twosuperior /periodcentered /divide
+/SF430000 /SF240000 /SF510000 /afii10071 /SF520000 /SF390000 /SF220000 /SF210000
+/SF250000 /SF500000 /SF490000 /SF380000 /SF280000 /SF270000 /SF260000 /SF360000
+/SF370000 /SF420000 /SF190000 /afii10023 /SF200000 /SF230000 /SF470000 /SF480000
+/SF410000 /SF450000 /SF460000 /SF400000 /SF540000 /SF530000 /SF440000 /copyright
+/afii10096 /afii10065 /afii10066 /afii10088 /afii10069 /afii10070 /afii10086 /afii10068
+/afii10087 /afii10074 /afii10075 /afii10076 /afii10077 /afii10078 /afii10079 /afii10080
+/afii10081 /afii10097 /afii10082 /afii10083 /afii10084 /afii10085 /afii10072 /afii10067
+/afii10094 /afii10093 /afii10073 /afii10090 /afii10095 /afii10091 /afii10089 /afii10092
+/afii10048 /afii10017 /afii10018 /afii10040 /afii10021 /afii10022 /afii10038 /afii10020
+/afii10039 /afii10026 /afii10027 /afii10028 /afii10029 /afii10030 /afii10031 /afii10032
+/afii10033 /afii10049 /afii10034 /afii10035 /afii10036 /afii10037 /afii10024 /afii10019
+/afii10046 /afii10045 /afii10025 /afii10042 /afii10047 /afii10043 /afii10041 /afii10044]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/koi8-u.ps b/runtime/print/koi8-u.ps
new file mode 100644
index 0000000..5363104
--- /dev/null
+++ b/runtime/print/koi8-u.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-koi8-u
+%%Version: 1.0 0
+%%EndComments
+/VIM-koi8-u[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/SF100000 /SF110000 /SF010000 /SF030000 /SF020000 /SF040000 /SF080000 /SF090000
+/SF060000 /SF070000 /SF050000 /upblock /dnblock /block /lfblock /rtblock
+/ltshade /shade /dkshade /integraltp /filledbox /bullet /radical /approxequal
+/lessequal /greaterequal /space /integralbt /degree /twosuperior /periodcentered /divide
+/SF430000 /SF240000 /SF510000 /afii10071 /afii10101 /SF390000 /afii10103 /afii10104
+/SF250000 /SF500000 /SF490000 /SF380000 /SF280000 /afii10098 /SF260000 /SF360000
+/SF370000 /SF420000 /SF190000 /afii10023 /afii10053 /SF230000 /afii10055 /afii10056
+/SF410000 /SF450000 /SF460000 /SF400000 /SF540000 /afii10050 /SF440000 /copyright
+/afii10096 /afii10065 /afii10066 /afii10088 /afii10069 /afii10070 /afii10086 /afii10068
+/afii10087 /afii10074 /afii10075 /afii10076 /afii10077 /afii10078 /afii10079 /afii10080
+/afii10081 /afii10097 /afii10082 /afii10083 /afii10084 /afii10085 /afii10072 /afii10067
+/afii10094 /afii10093 /afii10073 /afii10090 /afii10095 /afii10091 /afii10089 /afii10092
+/afii10048 /afii10017 /afii10018 /afii10040 /afii10021 /afii10022 /afii10038 /afii10020
+/afii10039 /afii10026 /afii10027 /afii10028 /afii10029 /afii10030 /afii10031 /afii10032
+/afii10033 /afii10049 /afii10034 /afii10035 /afii10036 /afii10037 /afii10024 /afii10019
+/afii10046 /afii10045 /afii10025 /afii10042 /afii10047 /afii10043 /afii10041 /afii10044]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/ks_roman.ps b/runtime/print/ks_roman.ps
new file mode 100644
index 0000000..b688550
--- /dev/null
+++ b/runtime/print/ks_roman.ps
@@ -0,0 +1,23 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-ks_roman
+%%Version: 1.0 0
+%%EndComments
+% Different to ASCII at code points 96 and 126
+/VIM-ks_roman[
+32{/.notdef}repeat
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /won /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /overline /.notdef
+128{/.notdef}repeat]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/latin1.ps b/runtime/print/latin1.ps
new file mode 100644
index 0000000..569db9b
--- /dev/null
+++ b/runtime/print/latin1.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-latin1
+%%Version: 1.0 0
+%%EndComments
+/VIM-latin1[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclamdown /cent /sterling /currency /yen /brokenbar /section
+/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
+/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
+/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
+/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
+/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
+/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
+/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
+/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/mac-roman.ps b/runtime/print/mac-roman.ps
new file mode 100644
index 0000000..b0941be
--- /dev/null
+++ b/runtime/print/mac-roman.ps
@@ -0,0 +1,40 @@
+%!PS-Adobe-3.0 Resource-Encoding
+%%Title: VIM-mac-roman
+%%Version: 1.0 0
+%%EndComments
+/VIM-mac-roman[
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
+/parenleft /parenright /asterisk /plus /comma /minus /period /slash
+/zero /one /two /three /four /five /six /seven
+/eight /nine /colon /semicolon /less /equal /greater /question
+/at /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 /bracketleft /backslash /bracketright /asciicircum /underscore
+/grave /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 /braceleft /bar /braceright /asciitilde /.notdef
+/Adieresis /Aring /Ccedilla /Eacute /Ntilde /Odieresis /Udieresis /aacute
+/agrave /acircumflex /adieresis /atilde /aring /ccedilla /eacute /egrave
+/ecircumflex /edieresis /iacute /igrave /icircumflex /idieresis /ntilde /oacute
+/ograve /ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex /udieresis
+/dagger /degree /cent /sterling /section /bullet /paragraph /germandbls
+/registered /copyright /trademark /acute /dieresis /notequal /AE /Oslash
+/infinity /plusminus /lessequal /greaterequal /yen /mu /partialdiff /summation
+/Pi /pi /integral /ordfeminine /ordmasculine /Omega /ae /oslash
+/questiondown /exclamdown /logicalnot /radical /florin /approxequal /delta /guillemotleft
+/guillemotright /ellipsis /space /Agrave /Atilde /Otilde /OE /oe
+/endash /emdash /quotedblleft /quotedblright /quoteleft /quoteright /divide /lozenge
+/ydieresis /Ydieresis /fraction /currency /guilsinglleft /guilsinglright /fi /fl
+/daggerdbl /periodcentered /quotesinglbase /quotedblbase /perthousand /Acircumflex /Ecircumflex /Aacute
+/Edieresis /Egrave /Iacute /Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex
+/heart /Ograve /Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde
+/macron /breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron]
+/Encoding defineresource pop
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/print/prolog.ps b/runtime/print/prolog.ps
new file mode 100644
index 0000000..6208569
--- /dev/null
+++ b/runtime/print/prolog.ps
@@ -0,0 +1,44 @@
+%!PS-Adobe-3.0 Resource-ProcSet
+%%Title: VIM-Prolog
+%%Version: 1.4 1
+%%EndComments
+% Editing of this file is NOT RECOMMENDED. You run a very good risk of causing
+% all PostScript printing from VIM failing if you do. PostScript is not called
+% a write-only language for nothing!
+/packedarray where not{userdict begin/setpacking/pop load def/currentpacking
+false def end}{pop}ifelse/CP currentpacking def true setpacking
+/bd{bind def}bind def/ld{load def}bd/ed{exch def}bd/d/def ld
+/db{dict begin}bd/cde{currentdict end}bd
+/T true d/F false d
+/SO null d/sv{/SO save d}bd/re{SO restore}bd
+/L2 systemdict/languagelevel 2 copy known{get exec}{pop pop 1}ifelse 2 ge d
+/m/moveto ld/s/show ld /ms{m s}bd /g/setgray ld/r/setrgbcolor ld/sp{showpage}bd
+/gs/gsave ld/gr/grestore ld/cp/currentpoint ld
+/ul{gs UW setlinewidth cp UO add 2 copy newpath m 3 1 roll add exch lineto
+stroke gr}bd
+/bg{gs r cp BO add 4 -2 roll rectfill gr}bd
+/sl{90 rotate 0 exch translate}bd
+L2{
+/sspd{mark exch{setpagedevice}stopped cleartomark}bd
+/nc{1 db/NumCopies ed cde sspd}bd
+/sps{3 db/Orientation ed[3 1 roll]/PageSize ed/ImagingBBox null d cde sspd}bd
+/dt{2 db/Tumble ed/Duplex ed cde sspd}bd
+/c{1 db/Collate ed cde sspd}bd
+}{
+/nc{/#copies ed}bd
+/sps{statusdict/setpage get exec}bd
+/dt{statusdict/settumble 2 copy known{get exec}{pop pop pop}ifelse
+statusdict/setduplexmode 2 copy known{get exec}{pop pop pop}ifelse}bd
+/c{pop}bd
+}ifelse
+/ffs{findfont exch scalefont d}bd/sf{setfont}bd
+/ref{1 db findfont dup maxlength dict/NFD ed{exch dup/FID ne{exch NFD 3 1 roll
+put}{pop pop}ifelse}forall/Encoding findresource dup length 256 eq{NFD/Encoding
+3 -1 roll put}{pop}ifelse NFD dup/FontType get 3 ne{/CharStrings}{/CharProcs}
+ifelse 2 copy known{2 copy get dup maxlength dict copy[/questiondown/space]{2
+copy known{2 copy get 2 index/.notdef 3 -1 roll put pop exit}if pop}forall put
+}{pop pop}ifelse dup NFD/FontName 3 -1 roll put NFD definefont pop end}bd
+CP setpacking
+(\004)cvn{}bd
+% vim:ff=unix:
+%%EOF
diff --git a/runtime/scripts.vim b/runtime/scripts.vim
new file mode 100644
index 0000000..9f9c065
--- /dev/null
+++ b/runtime/scripts.vim
@@ -0,0 +1,30 @@
+" Vim support file to detect file types in scripts
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last change: 2022 Feb 13
+
+" 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.
+
+
+" Bail out when a FileType autocommand has already set the filetype.
+if did_filetype()
+ finish
+endif
+
+" Load the user defined scripts file first
+" Only do this when the FileType autocommand has not been triggered yet
+if exists("myscriptsfile") && filereadable(expand(myscriptsfile))
+ execute "source " . myscriptsfile
+ if did_filetype()
+ finish
+ endif
+endif
+
+" The main code is in a compiled function for speed.
+call dist#script#DetectFiletype()
diff --git a/runtime/spell/README.txt b/runtime/spell/README.txt
new file mode 100644
index 0000000..9fc3fd1
--- /dev/null
+++ b/runtime/spell/README.txt
@@ -0,0 +1,116 @@
+The spell files included here are in Vim's special format. You can't edit
+them. See ":help spell" for more information.
+
+
+COPYRIGHT
+
+The files used as input for the spell files come from the OpenOffice.org spell
+files. Most of them go under the LGPL or a similar license.
+
+Copyright notices for specific languages are in README_??.txt. Note that the
+files for different regions are merged, both to save space and to make it
+possible to highlight words for another region different from bad words.
+
+Most of the soundslike mappings come from Aspell ??_phonet.dat files:
+ftp://ftp.gnu.org/gnu/aspell/dict/. Most go under the GPL or LGPL copyright.
+
+
+GENERATING .SPL FILES
+
+This involves downloading the files from the github server, applying a
+patch and running Vim to generate the .spl file. To do this all in one go use
+the Aap program (www.a-a-p.org). It's simple to install, it only requires
+Python (http://www.a-a-p.org/download.html)
+
+Before generating spell files, verify your system has the required locale
+support. Source the check_locales.vim script to find out. If something is
+missing, see LOCALE below.
+
+
+You can also do it manually:
+1. Fetch the right spell file from:
+ https://github.com/LibreOffice/dictionaries
+
+2. Unzip the archive:
+ unzip LL_RR.zip
+
+3. Apply the patch:
+ patch < LL_RR.diff
+
+4. If the language has multiple regions do the above for each region. E.g.,
+ for English there are five regions: US, CA, AU, NZ and GB.
+
+5. Run Vim and execute ":mkspell". Make sure you do this with the correct
+ locale, that influences the upper/lower case letters and word characters.
+ On Unix it's something like:
+ env LANG=en_US.UTF-8 vim
+ mkspell! en en_US en_AU en_CA en_GB en_NZ
+
+6. Repeat step 5 for other locales. For English you could generate a spell
+ file for latin1, utf-8 and ASCII. ASCII only makes sense for languages
+ that have very few words with non-ASCII letters.
+
+Now you understand why I prefer using the Aap recipe :-).
+
+
+MAINTAINING A LANGUAGE
+
+Every language should have a maintainer. His tasks are to track the changes
+in the spell files and make updated patches. Words that haven't been
+added/removed from the LibreOffice lists can also be handled by the patches.
+
+It is important to keep the version of the .dic and .aff files that you
+started with. When LibreOffice brings out new versions of these files you can
+find out what changed and take over these changes in your patch. When there
+are very many changes you can do it the other way around: re-apply the changes
+for Vim to the new versions of the .dic and .aff files.
+
+This procedure should work well:
+
+1. Obtain the zip archive with the .aff and .dic files. Unpack it as
+ explained above and copy (don't rename!) the .aff and .dic files to
+ .orig.aff and .orig.dic. Using the Aap recipe should work, it will make
+ the copies for you.
+
+2. Tweak the .aff and .dic files to generate the perfect .spl file. Don't
+ change too much, the OpenOffice people are not stupid. However, you may
+ want to remove obvious mistakes. And remove single-letter words that
+ aren't really words, they mess up the suggestions (English has this
+ problem). You can use the "fixdup.vim" Vim script to find duplicate words.
+
+3. Include needed parts from the aspell phonetic dictionary to the aff files. For
+ example add the relevant SAL lines to the .aff file (this is needed to make good
+ suggestions). The aspell dictionaries can be found here:
+ https://ftp.gnu.org/gnu/aspell/dict/0index.html
+
+4. Make the diff file. "aap diff" will do this for you. If a diff would be
+ too big you might consider writing a Vim script to do systematic changes.
+ Do check that someone else can reproduce building the spell file. Send the
+ result to Bram for inclusion in the distribution. Bram will generate the
+ .spl file and upload it to the ftp server (if he can't generate it you will
+ have to send him the .spl file too).
+
+5. When OpenOffice makes a new zip file available you need to update the
+ patch. "aap check" should do most of the work for you: if there are
+ changes the .new.dic and .new.aff files will appear. You can now figure
+ out the differences with .orig.dic and .orig.aff, adjust the .dic and .aff
+ files and finally move the .new.dic to .orig.dic and .new.aff to .orig.aff.
+
+6. Repeat step 5. regularly.
+
+
+LOCALE
+
+For proper spell file generation the required locale must be installed.
+Otherwise Vim doesn't know what are letters and upper-lower case differences.
+Modern systems use UTF-8, but we also generate spell files for 8-bit locales
+for users with older systems.
+
+On Ubuntu the default is to only support locales for your own language. To
+add others you need to do this:
+ sudo vim /var/lib/locales/supported.d/local
+ Add needed lines from /usr/share/i18n/SUPPORTED
+ sudo dpkg-reconfigure locales
+
+When using the check_locales.vim script, you need to exit Vim and restart it
+to pickup the newly installed locales.
diff --git a/runtime/spell/README_en.txt b/runtime/spell/README_en.txt
new file mode 100644
index 0000000..39443a2
--- /dev/null
+++ b/runtime/spell/README_en.txt
@@ -0,0 +1,12940 @@
+en_US
+en_US Hunspell Dictionary
+Version 2015.08.24
+Mon Aug 24 16:39:36 2015 -0400 [79c892e]
+http://wordlist.sourceforge.net
+
+README file for English Hunspell dictionaries derived from SCOWL.
+
+These dictionaries are created using the speller/make-hunspell-dict
+script in SCOWL.
+
+The following dictionaries are available:
+
+ en_US (American)
+ en_CA (Canadian)
+ en_GB-ise (British with "ise" spelling)
+ en_GB-ize (British with "ize" spelling)
+
+ en_US-large
+ en_CA-large
+ en_GB-large (with both "ise" and "ize" spelling)
+
+The normal (non-large) dictionaries correspond to SCOWL size 60 and,
+to encourage consistent spelling, generally only include one spelling
+variant for a word. The large dictionaries correspond to SCOWL size
+70 and may include multiple spelling for a word when both variants are
+considered almost equal. Also, the general quality of the larger
+dictionaries may also be less as they are not as carefully checked for
+errors as the normal dictionaries.
+
+To get an idea of the difference in size, here are 25 random words
+only found in the large dictionary for American English:
+
+ Bermejo Freyr's Guenevere Hatshepsut Nottinghamshire arrestment
+ crassitudes crural dogwatches errorless fetial flaxseeds godroon
+ incretion jalapeño's kelpie kishkes neuroglias pietisms pullulation
+ stemwinder stenoses syce thalassic zees
+
+The en_US and en_CA are the official dictionaries for Hunspell. The
+en_GB and large dictionaries are made available on an experimental
+basis. If you find them useful please send me a quick email at
+kevina@gnu.org.
+
+If none of these dictionaries suite you (for example, maybe you want
+the larger dictionary but only use spelling of a word) additional
+dictionaries can be generated at http://app.aspell.net/create or by
+modifying speller/make-hunspell-dict in SCOWL. Please do let me know
+if you end up publishing a customized dictionary.
+
+If a word is not found in the dictionary or a word is there you think
+shouldn't be, you can lookup the word up at http://app.aspell.net/lookup
+to help determine why that is.
+
+General comments on these list can be sent directly to me at
+kevina@gnu.org or to the wordlist-devel mailing lists
+(https://lists.sourceforge.net/lists/listinfo/wordlist-devel). If you
+have specific issues with any of these dictionaries please file a bug
+report at https://github.com/kevina/wordlist/issues.
+
+IMPORTANT CHANGES FROM 2015.02.15:
+
+The dictionaries are now in UTF-8 format instead of ISO-8859-1. This
+was required to handle smart quotes correctly.
+
+ADDITIONAL NOTES:
+
+The NOSUGGEST flag was added to certain taboo words. While I made an
+honest attempt to flag the strongest taboo words with the NOSUGGEST
+flag, I MAKE NO GUARANTEE THAT I FLAGGED EVERY POSSIBLE TABOO WORD.
+The list was originally derived from Németh László, however I removed
+some words which, while being considered taboo by some dictionaries,
+are not really considered swear words in today's society.
+
+COPYRIGHT, SOURCES, and CREDITS:
+
+The English dictionaries come directly from SCOWL
+and is thus under the same copyright of SCOWL. The affix file is
+a heavily modified version of the original english.aff file which was
+released as part of Geoff Kuenning's Ispell and as such is covered by
+his BSD license. Part of SCOWL is also based on Ispell thus the
+Ispell copyright is included with the SCOWL copyright.
+
+The collective work is Copyright 2000-2015 by Kevin Atkinson as well
+as any of the copyrights mentioned below:
+
+ Copyright 2000-2015 by Kevin Atkinson
+
+ Permission to use, copy, modify, distribute and sell these word
+ lists, the associated scripts, the output created from the scripts,
+ and its documentation for any purpose is hereby granted without fee,
+ provided that the above copyright notice appears in all copies and
+ that both that copyright notice and this permission notice appear in
+ supporting documentation. Kevin Atkinson makes no representations
+ about the suitability of this array for any purpose. It is provided
+ "as is" without express or implied warranty.
+
+Alan Beale <biljir@pobox.com> also deserves special credit as he has,
+in addition to providing the 12Dicts package and being a major
+contributor to the ENABLE word list, given me an incredible amount of
+feedback and created a number of special lists (those found in the
+Supplement) in order to help improve the overall quality of SCOWL.
+
+The 10 level includes the 1000 most common English words (according to
+the Moby (TM) Words II [MWords] package), a subset of the 1000 most
+common words on the Internet (again, according to Moby Words II), and
+frequently class 16 from Brian Kelk's "UK English Wordlist
+with Frequency Classification".
+
+The MWords package was explicitly placed in the public domain:
+
+ The Moby lexicon project is complete and has
+ been place into the public domain. Use, sell,
+ rework, excerpt and use in any way on any platform.
+
+ Placing this material on internal or public servers is
+ also encouraged. The compiler is not aware of any
+ export restrictions so freely distribute world-wide.
+
+ You can verify the public domain status by contacting
+
+ Grady Ward
+ 3449 Martha Ct.
+ Arcata, CA 95521-4884
+
+ grady@netcom.com
+ grady@northcoast.com
+
+The "UK English Wordlist With Frequency Classification" is also in the
+Public Domain:
+
+ Date: Sat, 08 Jul 2000 20:27:21 +0100
+ From: Brian Kelk <Brian.Kelk@cl.cam.ac.uk>
+
+ > I was wondering what the copyright status of your "UK English
+ > Wordlist With Frequency Classification" word list as it seems to
+ > be lacking any copyright notice.
+
+ There were many many sources in total, but any text marked
+ "copyright" was avoided. Locally-written documentation was one
+ source. An earlier version of the list resided in a filespace called
+ PUBLIC on the University mainframe, because it was considered public
+ domain.
+
+ Date: Tue, 11 Jul 2000 19:31:34 +0100
+
+ > So are you saying your word list is also in the public domain?
+
+ That is the intention.
+
+The 20 level includes frequency classes 7-15 from Brian's word list.
+
+The 35 level includes frequency classes 2-6 and words appearing in at
+least 11 of 12 dictionaries as indicated in the 12Dicts package. All
+words from the 12Dicts package have had likely inflections added via
+my inflection database.
+
+The 12Dicts package and Supplement is in the Public Domain.
+
+The WordNet database, which was used in the creation of the
+Inflections database, is under the following copyright:
+
+ This software and database is being provided to you, the LICENSEE,
+ by Princeton University under the following license. By obtaining,
+ using and/or copying this software and database, you agree that you
+ have read, understood, and will comply with these terms and
+ conditions.:
+
+ Permission to use, copy, modify and distribute this software and
+ database and its documentation for any purpose and without fee or
+ royalty is hereby granted, provided that you agree to comply with
+ the following copyright notice and statements, including the
+ disclaimer, and that the same appear on ALL copies of the software,
+ database and documentation, including modifications that you make
+ for internal use or for distribution.
+
+ WordNet 1.6 Copyright 1997 by Princeton University. All rights
+ reserved.
+
+ THIS SOFTWARE AND DATABASE IS PROVIDED "AS IS" AND PRINCETON
+ UNIVERSITY MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PRINCETON
+ UNIVERSITY MAKES NO REPRESENTATIONS OR WARRANTIES OF MERCHANT-
+ ABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE
+ LICENSED SOFTWARE, DATABASE OR DOCUMENTATION WILL NOT INFRINGE ANY
+ THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+ The name of Princeton University or Princeton may not be used in
+ advertising or publicity pertaining to distribution of the software
+ and/or database. Title to copyright in this software, database and
+ any associated documentation shall at all times remain with
+ Princeton University and LICENSEE agrees to preserve same.
+
+The 40 level includes words from Alan's 3esl list found in version 4.0
+of his 12dicts package. Like his other stuff the 3esl list is also in the
+public domain.
+
+The 50 level includes Brian's frequency class 1, words appearing
+in at least 5 of 12 of the dictionaries as indicated in the 12Dicts
+package, and uppercase words in at least 4 of the previous 12
+dictionaries. A decent number of proper names is also included: The
+top 1000 male, female, and Last names from the 1990 Census report; a
+list of names sent to me by Alan Beale; and a few names that I added
+myself. Finally a small list of abbreviations not commonly found in
+other word lists is included.
+
+The name files form the Census report is a government document which I
+don't think can be copyrighted.
+
+The file special-jargon.50 uses common.lst and word.lst from the
+"Unofficial Jargon File Word Lists" which is derived from "The Jargon
+File". All of which is in the Public Domain. This file also contain
+a few extra UNIX terms which are found in the file "unix-terms" in the
+special/ directory.
+
+The 55 level includes words from Alan's 2of4brif list found in version
+4.0 of his 12dicts package. Like his other stuff the 2of4brif is also
+in the public domain.
+
+The 60 level includes all words appearing in at least 2 of the 12
+dictionaries as indicated by the 12Dicts package.
+
+The 70 level includes Brian's frequency class 0 and the 74,550 common
+dictionary words from the MWords package. The common dictionary words,
+like those from the 12Dicts package, have had all likely inflections
+added. The 70 level also included the 5desk list from version 4.0 of
+the 12Dics package which is in the public domain.
+
+The 80 level includes the ENABLE word list, all the lists in the
+ENABLE supplement package (except for ABLE), the "UK Advanced Cryptics
+Dictionary" (UKACD), the list of signature words from the YAWL package,
+and the 10,196 places list from the MWords package.
+
+The ENABLE package, mainted by M\Cooper <thegrendel@theriver.com>,
+is in the Public Domain:
+
+ The ENABLE master word list, WORD.LST, is herewith formally released
+ into the Public Domain. Anyone is free to use it or distribute it in
+ any manner they see fit. No fee or registration is required for its
+ use nor are "contributions" solicited (if you feel you absolutely
+ must contribute something for your own peace of mind, the authors of
+ the ENABLE list ask that you make a donation on their behalf to your
+ favorite charity). This word list is our gift to the Scrabble
+ community, as an alternate to "official" word lists. Game designers
+ may feel free to incorporate the WORD.LST into their games. Please
+ mention the source and credit us as originators of the list. Note
+ that if you, as a game designer, use the WORD.LST in your product,
+ you may still copyright and protect your product, but you may *not*
+ legally copyright or in any way restrict redistribution of the
+ WORD.LST portion of your product. This *may* under law restrict your
+ rights to restrict your users' rights, but that is only fair.
+
+UKACD, by J Ross Beresford <ross@bryson.demon.co.uk>, is under the
+following copyright:
+
+ Copyright (c) J Ross Beresford 1993-1999. All Rights Reserved.
+
+ The following restriction is placed on the use of this publication:
+ if The UK Advanced Cryptics Dictionary is used in a software package
+ or redistributed in any form, the copyright notice must be
+ prominently displayed and the text of this document must be included
+ verbatim.
+
+ There are no other restrictions: I would like to see the list
+ distributed as widely as possible.
+
+The 95 level includes the 354,984 single words, 256,772 compound
+words, 4,946 female names and the 3,897 male names, and 21,986 names
+from the MWords package, ABLE.LST from the ENABLE Supplement, and some
+additional words found in my part-of-speech database that were not
+found anywhere else.
+
+Accent information was taken from UKACD.
+
+My VARCON package was used to create the American, British, and
+Canadian word list.
+
+Since the original word lists used in the VARCON package came
+from the Ispell distribution they are under the Ispell copyright:
+
+ Copyright 1993, Geoff Kuenning, Granada Hills, CA
+ All rights reserved.
+
+ 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.
+ 3. All modifications to the source code must be clearly marked as
+ such. Binary redistributions based on modified source code
+ must be clearly marked as modified versions in the documentation
+ and/or other materials provided with the distribution.
+ (clause 4 removed with permission from Geoff Kuenning)
+ 5. The name of Geoff Kuenning may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+
+ THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING 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 GEOFF
+ KUENNING 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.
+
+Build Date: Mon Aug 24 16:41:56 EDT 2015
+Wordlist Command: mk-list --accents=strip en_US 60
+===================================================
+en_AU:
+This dictionary was based on the en_GB Myspell dictionary
+which in turn was initially based on a subset of the
+original English wordlist created by Kevin Atkinson for
+Pspell and Aspell and thus is covered by his original
+LGPL licence.
+
+The credit for this en_AU dictionary goes to:
+
+Kelvin Eldridge (maintainer)
+Jean Hollis Weber
+David Wilson
+
+- Words incorrect in Australian English removed
+- a list from the previously removed words with corrected spelling was added
+- a list of major rivers was added
+- a list of place names was added
+- a list of Australian mammals was added
+- a list of Aboriginal/Koori words commonly used was added
+
+A total of 119,267 words are now recognized
+by the dictionary.
+
+Of course, special thanks go to the editors of the
+en_GB dictionary (David Bartlett, Brian Kelk and
+Andrew Brown) which provided the starting point
+for this dictionary.
+
+The affix file is currently a duplicate of the en_AU.aff
+created completely from scratch by David Bartlett and
+Andrew Brown, based on the published
+rules for MySpell and is also provided under the LGPL.
+
+If you find omissions or bugs or have new words to
+add to the dictionary, please contact the en_AU
+maintainer at:
+
+ "Kelvin" <audictionary@onlineconnections.com.au>
+
+
+
+===================================================
+en_CA:
+en_CA Hunspell Dictionary
+Version 2015.08.24
+Mon Aug 24 16:39:36 2015 -0400 [79c892e]
+http://wordlist.sourceforge.net
+
+README file for English Hunspell dictionaries derived from SCOWL.
+
+These dictionaries are created using the speller/make-hunspell-dict
+script in SCOWL.
+
+The following dictionaries are available:
+
+ en_US (American)
+ en_CA (Canadian)
+ en_GB-ise (British with "ise" spelling)
+ en_GB-ize (British with "ize" spelling)
+
+ en_US-large
+ en_CA-large
+ en_GB-large (with both "ise" and "ize" spelling)
+
+The normal (non-large) dictionaries correspond to SCOWL size 60 and,
+to encourage consistent spelling, generally only include one spelling
+variant for a word. The large dictionaries correspond to SCOWL size
+70 and may include multiple spelling for a word when both variants are
+considered almost equal. Also, the general quality of the larger
+dictionaries may also be less as they are not as carefully checked for
+errors as the normal dictionaries.
+
+To get an idea of the difference in size, here are 25 random words
+only found in the large dictionary for American English:
+
+ Bermejo Freyr's Guenevere Hatshepsut Nottinghamshire arrestment
+ crassitudes crural dogwatches errorless fetial flaxseeds godroon
+ incretion jalapeño's kelpie kishkes neuroglias pietisms pullulation
+ stemwinder stenoses syce thalassic zees
+
+The en_US and en_CA are the official dictionaries for Hunspell. The
+en_GB and large dictionaries are made available on an experimental
+basis. If you find them useful please send me a quick email at
+kevina@gnu.org.
+
+If none of these dictionaries suite you (for example, maybe you want
+the larger dictionary but only use spelling of a word) additional
+dictionaries can be generated at http://app.aspell.net/create or by
+modifying speller/make-hunspell-dict in SCOWL. Please do let me know
+if you end up publishing a customized dictionary.
+
+If a word is not found in the dictionary or a word is there you think
+shouldn't be, you can lookup the word up at http://app.aspell.net/lookup
+to help determine why that is.
+
+General comments on these list can be sent directly to me at
+kevina@gnu.org or to the wordlist-devel mailing lists
+(https://lists.sourceforge.net/lists/listinfo/wordlist-devel). If you
+have specific issues with any of these dictionaries please file a bug
+report at https://github.com/kevina/wordlist/issues.
+
+IMPORTANT CHANGES FROM 2015.02.15:
+
+The dictionaries are now in UTF-8 format instead of ISO-8859-1. This
+was required to handle smart quotes correctly.
+
+ADDITIONAL NOTES:
+
+The NOSUGGEST flag was added to certain taboo words. While I made an
+honest attempt to flag the strongest taboo words with the NOSUGGEST
+flag, I MAKE NO GUARANTEE THAT I FLAGGED EVERY POSSIBLE TABOO WORD.
+The list was originally derived from Németh László, however I removed
+some words which, while being considered taboo by some dictionaries,
+are not really considered swear words in today's society.
+
+COPYRIGHT, SOURCES, and CREDITS:
+
+The English dictionaries come directly from SCOWL
+and is thus under the same copyright of SCOWL. The affix file is
+a heavily modified version of the original english.aff file which was
+released as part of Geoff Kuenning's Ispell and as such is covered by
+his BSD license. Part of SCOWL is also based on Ispell thus the
+Ispell copyright is included with the SCOWL copyright.
+
+The collective work is Copyright 2000-2015 by Kevin Atkinson as well
+as any of the copyrights mentioned below:
+
+ Copyright 2000-2015 by Kevin Atkinson
+
+ Permission to use, copy, modify, distribute and sell these word
+ lists, the associated scripts, the output created from the scripts,
+ and its documentation for any purpose is hereby granted without fee,
+ provided that the above copyright notice appears in all copies and
+ that both that copyright notice and this permission notice appear in
+ supporting documentation. Kevin Atkinson makes no representations
+ about the suitability of this array for any purpose. It is provided
+ "as is" without express or implied warranty.
+
+Alan Beale <biljir@pobox.com> also deserves special credit as he has,
+in addition to providing the 12Dicts package and being a major
+contributor to the ENABLE word list, given me an incredible amount of
+feedback and created a number of special lists (those found in the
+Supplement) in order to help improve the overall quality of SCOWL.
+
+The 10 level includes the 1000 most common English words (according to
+the Moby (TM) Words II [MWords] package), a subset of the 1000 most
+common words on the Internet (again, according to Moby Words II), and
+frequently class 16 from Brian Kelk's "UK English Wordlist
+with Frequency Classification".
+
+The MWords package was explicitly placed in the public domain:
+
+ The Moby lexicon project is complete and has
+ been place into the public domain. Use, sell,
+ rework, excerpt and use in any way on any platform.
+
+ Placing this material on internal or public servers is
+ also encouraged. The compiler is not aware of any
+ export restrictions so freely distribute world-wide.
+
+ You can verify the public domain status by contacting
+
+ Grady Ward
+ 3449 Martha Ct.
+ Arcata, CA 95521-4884
+
+ grady@netcom.com
+ grady@northcoast.com
+
+The "UK English Wordlist With Frequency Classification" is also in the
+Public Domain:
+
+ Date: Sat, 08 Jul 2000 20:27:21 +0100
+ From: Brian Kelk <Brian.Kelk@cl.cam.ac.uk>
+
+ > I was wondering what the copyright status of your "UK English
+ > Wordlist With Frequency Classification" word list as it seems to
+ > be lacking any copyright notice.
+
+ There were many many sources in total, but any text marked
+ "copyright" was avoided. Locally-written documentation was one
+ source. An earlier version of the list resided in a filespace called
+ PUBLIC on the University mainframe, because it was considered public
+ domain.
+
+ Date: Tue, 11 Jul 2000 19:31:34 +0100
+
+ > So are you saying your word list is also in the public domain?
+
+ That is the intention.
+
+The 20 level includes frequency classes 7-15 from Brian's word list.
+
+The 35 level includes frequency classes 2-6 and words appearing in at
+least 11 of 12 dictionaries as indicated in the 12Dicts package. All
+words from the 12Dicts package have had likely inflections added via
+my inflection database.
+
+The 12Dicts package and Supplement is in the Public Domain.
+
+The WordNet database, which was used in the creation of the
+Inflections database, is under the following copyright:
+
+ This software and database is being provided to you, the LICENSEE,
+ by Princeton University under the following license. By obtaining,
+ using and/or copying this software and database, you agree that you
+ have read, understood, and will comply with these terms and
+ conditions.:
+
+ Permission to use, copy, modify and distribute this software and
+ database and its documentation for any purpose and without fee or
+ royalty is hereby granted, provided that you agree to comply with
+ the following copyright notice and statements, including the
+ disclaimer, and that the same appear on ALL copies of the software,
+ database and documentation, including modifications that you make
+ for internal use or for distribution.
+
+ WordNet 1.6 Copyright 1997 by Princeton University. All rights
+ reserved.
+
+ THIS SOFTWARE AND DATABASE IS PROVIDED "AS IS" AND PRINCETON
+ UNIVERSITY MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PRINCETON
+ UNIVERSITY MAKES NO REPRESENTATIONS OR WARRANTIES OF MERCHANT-
+ ABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE
+ LICENSED SOFTWARE, DATABASE OR DOCUMENTATION WILL NOT INFRINGE ANY
+ THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+ The name of Princeton University or Princeton may not be used in
+ advertising or publicity pertaining to distribution of the software
+ and/or database. Title to copyright in this software, database and
+ any associated documentation shall at all times remain with
+ Princeton University and LICENSEE agrees to preserve same.
+
+The 40 level includes words from Alan's 3esl list found in version 4.0
+of his 12dicts package. Like his other stuff the 3esl list is also in the
+public domain.
+
+The 50 level includes Brian's frequency class 1, words appearing
+in at least 5 of 12 of the dictionaries as indicated in the 12Dicts
+package, and uppercase words in at least 4 of the previous 12
+dictionaries. A decent number of proper names is also included: The
+top 1000 male, female, and Last names from the 1990 Census report; a
+list of names sent to me by Alan Beale; and a few names that I added
+myself. Finally a small list of abbreviations not commonly found in
+other word lists is included.
+
+The name files form the Census report is a government document which I
+don't think can be copyrighted.
+
+The file special-jargon.50 uses common.lst and word.lst from the
+"Unofficial Jargon File Word Lists" which is derived from "The Jargon
+File". All of which is in the Public Domain. This file also contain
+a few extra UNIX terms which are found in the file "unix-terms" in the
+special/ directory.
+
+The 55 level includes words from Alan's 2of4brif list found in version
+4.0 of his 12dicts package. Like his other stuff the 2of4brif is also
+in the public domain.
+
+The 60 level includes all words appearing in at least 2 of the 12
+dictionaries as indicated by the 12Dicts package.
+
+The 70 level includes Brian's frequency class 0 and the 74,550 common
+dictionary words from the MWords package. The common dictionary words,
+like those from the 12Dicts package, have had all likely inflections
+added. The 70 level also included the 5desk list from version 4.0 of
+the 12Dics package which is in the public domain.
+
+The 80 level includes the ENABLE word list, all the lists in the
+ENABLE supplement package (except for ABLE), the "UK Advanced Cryptics
+Dictionary" (UKACD), the list of signature words from the YAWL package,
+and the 10,196 places list from the MWords package.
+
+The ENABLE package, mainted by M\Cooper <thegrendel@theriver.com>,
+is in the Public Domain:
+
+ The ENABLE master word list, WORD.LST, is herewith formally released
+ into the Public Domain. Anyone is free to use it or distribute it in
+ any manner they see fit. No fee or registration is required for its
+ use nor are "contributions" solicited (if you feel you absolutely
+ must contribute something for your own peace of mind, the authors of
+ the ENABLE list ask that you make a donation on their behalf to your
+ favorite charity). This word list is our gift to the Scrabble
+ community, as an alternate to "official" word lists. Game designers
+ may feel free to incorporate the WORD.LST into their games. Please
+ mention the source and credit us as originators of the list. Note
+ that if you, as a game designer, use the WORD.LST in your product,
+ you may still copyright and protect your product, but you may *not*
+ legally copyright or in any way restrict redistribution of the
+ WORD.LST portion of your product. This *may* under law restrict your
+ rights to restrict your users' rights, but that is only fair.
+
+UKACD, by J Ross Beresford <ross@bryson.demon.co.uk>, is under the
+following copyright:
+
+ Copyright (c) J Ross Beresford 1993-1999. All Rights Reserved.
+
+ The following restriction is placed on the use of this publication:
+ if The UK Advanced Cryptics Dictionary is used in a software package
+ or redistributed in any form, the copyright notice must be
+ prominently displayed and the text of this document must be included
+ verbatim.
+
+ There are no other restrictions: I would like to see the list
+ distributed as widely as possible.
+
+The 95 level includes the 354,984 single words, 256,772 compound
+words, 4,946 female names and the 3,897 male names, and 21,986 names
+from the MWords package, ABLE.LST from the ENABLE Supplement, and some
+additional words found in my part-of-speech database that were not
+found anywhere else.
+
+Accent information was taken from UKACD.
+
+My VARCON package was used to create the American, British, and
+Canadian word list.
+
+Since the original word lists used in the VARCON package came
+from the Ispell distribution they are under the Ispell copyright:
+
+ Copyright 1993, Geoff Kuenning, Granada Hills, CA
+ All rights reserved.
+
+ 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.
+ 3. All modifications to the source code must be clearly marked as
+ such. Binary redistributions based on modified source code
+ must be clearly marked as modified versions in the documentation
+ and/or other materials provided with the distribution.
+ (clause 4 removed with permission from Geoff Kuenning)
+ 5. The name of Geoff Kuenning may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+
+ THIS SOFTWARE IS PROVIDED BY GEOFF KUENNING 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 GEOFF
+ KUENNING 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.
+
+Build Date: Mon Aug 24 16:41:58 EDT 2015
+Wordlist Command: mk-list --accents=strip en_CA 60
+===================================================
+en_GB:
+This dictionary was initially based on a subset of the
+original English wordlist created by Kevin Atkinson for
+Pspell and Aspell and thus is covered by his original
+LGPL licence.
+
+It has been extensively updated by David Bartlett, Brian Kelk
+and Andrew Brown:
+- Numerous Americanism have been removed;
+- Numerous American spellings have been corrected;
+- Missing words have been added;
+- Many errors have been corrected;
+- Compound hyphenated words have been added where appropriate.
+
+Valuable inputs to this process were received from many other
+people - far too numerous to name. Serious thanks to you all
+for your greatly appreciated help.
+
+This wordlist is intended to be a good representation of
+current modern British English and thus it should be a good
+basis for Commonwealth English in most countries of the world
+outside North America.
+
+The affix file has been created completely from scratch
+by David Bartlett and Andrew Brown, based on the published
+rules for MySpell and is also provided under the LGPL.
+
+In creating the affix rules an attempt has been made to
+reproduce the most general rules for English word
+formation, rather than merely use it as a means to
+compress the size of the dictionary. It is hoped that this
+will facilitate future localisation to other variants of
+English.
+
+---
+
+This is a locally hosted copy of the English dictionaries with fixed dash handling and new ligature and phonetic suggestion support extension:
+http://extensions.openoffice.org/en/node/3785
+
+Original version of the en_GB dictionary:
+http://www.openoffice.org/issues/show_bug.cgi/id=72145
+
+OpenOffice.org patch and morphological extension.
+
+The morphological extension based on Wordlist POS and AGID data
+created by Kevin Atkinson and released on http://wordlist.sourceforge.net.
+
+Other fixes:
+
+OOo Issue 48060 - add numbers with affixes by COMPOUNDRULE (1st, 111th, 1990s etc.)
+OOo Issue 29112, 55498 - add NOSUGGEST flags to taboo words
+New REP items (better suggestions for accented words and a few mistakes)
+OOo Issue 63541 - remove *dessicated
+
+2008-12-18 nemeth AT OOo
+
+---
+
+MARCO A.G.PINTO:
+Since the dictionary hasn't been updated for many years,
+I decided to fork it in order to add new words and fixes.
+
+I even added words such as common names of software and hardware.
+
+I grabbed Mozilla's version since it wasn't obfuscated. Alexandro Colorado and I
+tried to unmunch the OpenOffice version but all we got was garbage.
+
+The dictionary icon in the Extension Manager was designed by Pedro Marques.
+
+The sources used to verify the spelling of the words I included in the dictionary:
+1) Oxford Dictionaries;
+2) Collins Dictionary;
+3) Macmillan Dictionary;
+4) Wiktionary (used with caution);
+5) Wikipedia (used with caution);
+6) Physical dictionaries
+
+Main difficulties developing this dictionary:
+1) Proper names;
+2) Possessive forms;
+3) Plurals.
+
+Please let Marco A.G.Pinto know of any errors that you find:
+E-mail: marcoagpinto@mail.telepac.pt
+ Site: http://marcoagpinto.cidadevirtual.pt/proofingtoolgui.html
+
+
+V2.00 - 25-AUG-2013
+-------------------
+Added the words:
+1) Thunderbird
+2) Firefox
+3) LibreOffice
+4) Ubuntu
+5) Amiga (from Commodore)
+6) mIRC
+7) Facebook
+8) ChanServ
+9) NickServ
+10) IRC
+11) PhD (+plural)
+12) Ph.D.
+13) screenshot (+plural)
+14) PowerPC
+15) internship (+plural)
+16) D-day
+17) Wikipedia
+18) committer (+plural)
+19) anymore
+20) GitHub
+21) Blu-ray (+plural)
+22) airplane (+plural)
+23) unsubscribe
+
+
+V2.01 - 31-AUG-2013
+-------------------
+Added the words:
+24) cyberterrorist (+plural)
+25) cyberterrorism
+26) DVD-RW
+27) DVD-RAM
+28) DVD+RW
+29) cyberattack (+plural)
+30) encyclopedia (+plural)
+31) spyware
+32) adware
+33) malware
+34) Trojan (First letter capitalized - Oxford Dictionary)
+35) Freeware
+36) rootkit (+plural)
+37) keylogger (+plural)
+38) keylogging
+39) subprogram (+plural)
+40) webcam (+plural)
+41) antivirus
+42) Coca-Cola
+43) fuckable
+44) fuckability
+45) NSA
+46) GnuPG
+47) melancholiac
+48) scammer (+plural)
+49) XML
+50) movie (+plural) (Oxford Dictionary says it is chiefly North American)
+51) YouTube
+52) cyberwar (+plural)
+
+
+V2.02 - 4-SEP-2013
+-------------------
+Added the words:
+53) aargh
+54) ABC (+plural)
+55) admin
+56) ADSL
+57) JPEG
+58) megapixel (+plural)
+59) PDF
+60) HDD
+61) FPU
+62) boing
+63) google
+64) Google (capitalized-company)
+65) IDE
+66) fallback
+67) re-establish
+68) MUFON
+69) transborder (+plural)
+70) leveraging
+71) geek (+plural)
+72) bestseller (+plural)
+73) playlist (+plural +ing)
+74) PowerPoint
+75) DALnet
+76) meetup (Oxford Dictionary says it is chiefly North American)
+77) traineeship (Fix - it was only inserted in plural)
+78) phishing
+79) phisher (+plural)
+80) botnet (+plural)
+81) guestbook
+82) widescreen (fix - it was inserted wide-screen)
+83) shortcut (+plural)
+84) retrocession
+85) hardcover (Oxford Dictionary says it is chiefly North American)
+86) Bryon (name of person)
+87) Aleister (name of person)
+88) teleport
+89) teleportation
+90) etheric
+91) telepath
+92) trustable
+93) contactee (+plural)
+94) chakra (+plural)
+95) Adamski (name of person)
+96) diapers (Added plural)
+97) Pleiades (place in the universe)
+98) PGP
+99) lineman
+100) linemen
+101) videography
+102) videographer
+103) HDMI
+104) mentoring
+105) mentored (merged to mentor+ed)
+106) anytime
+107) skywatch (+er +ers +er's)
+108) statewide
+109) caseload
+110) experiencer (+plural)
+111) experienceable
+112) blog (+plural)
+113) blogging
+114) blogged
+115) blogger
+116) crimeware
+117) multisession
+118) cyberstalking
+119) cyberstalker (+plural)
+120) PCMCIA
+121) failover
+122) placeholder (+plural)
+123) showstopper (+plural)
+124) showstopping
+125) API
+126) SeaMonkey
+127) markup
+128) watchdogging
+129) watchdogged
+130) cockapoo
+131) Elohim (name)
+132) undine (+plural)
+133) Plutonian
+134) technostructure
+135) uncommercial
+136) uncompetitively
+137) uncompetitiveness
+138) uncomplicatedly
+139) uncomplicatedness
+140) graphitic
+141) blacklead
+142) ufological
+143) UEFA
+
+
+V2.03 - 13-SEP-2013
+-------------------
+144) Merged uncompetitiveness and uncompetitively into uncompetitive.
+145) e-book (+plural)
+146) e-business
+147) e-card (+plural)
+148) e-crime (+plural)
+149) e-criminal (plural)
+150) infomediary
+151) infomercial (Oxford Dictionary says it is chiefly North American)
+152) infonaut
+153) SQL
+154) cybercafe
+155) cyberbullying
+156) cyberbully
+157) microcontroller
+158) microcircuitry
+159) PDFs (plural)
+160) AGP
+161) BIOS (computer)
+162) bio (+plural) -> (Oxford Dictionary->informal->a biography)
+163) biofuel
+164) biodata
+165) biodefence
+166) biodiesel
+167) bioconversion
+168) biocomputer
+169) biocomputing
+170) bioclimatic
+171) biochip
+172) dpi
+173) BitTorrent
+174) spellcheck (+ er)
+175) GPS
+176) GIF
+177) MPEG
+178) NGO
+179) NTSC
+180) psychotomimetic
+181) OLED
+182) biocircuit
+183) subwoofer
+184) stereophonically
+185) stereophony
+186) subclinical
+187) electro-oculography
+188) electro-oculographic
+189) electrochemistry
+190) electrochemist
+191) triplexed (added +ed to triplex)
+192) sextodecimo (+plural)
+193) thermography
+194) thermographic
+195) thermogram (+plural)
+196) thermograph
+197) infrared
+198) fetus (+plural)
+199) unhatched
+200) unharmful (added +un to harmful)
+201) open-source
+202) gigabit (+plural)
+203) gigaflop (+plural)
+204) giganotosaurus
+205) gigantism
+206) polyploid (+plural)
+207) polyploidy
+208) intracellularly (added ly to intracellular)
+209) daughterboard
+210) daughtercard
+211) transmissivity (+plural)
+212) complementarities (plural)
+213) RNA
+214) polysaccharide (singular)
+215) bioplastic
+216) agonist
+217) agonism
+218) app (+plural)
+219) Xanax
+220) X-rated
+221) subtotalling
+222) subtotalled
+223) derivational
+224) Bergström (Swedish name)
+225) 104+105 (placed in individual words due to a bug in the .AFF)
+
+
+V2.04 - 20-SEP-2013
+-------------------
+226) spoofer (merged into spoof)
+227) spoofery
+228) spoofable
+229) PayPal
+230) distro (+plural)
+231) geoinformation
+232) geolocation
+233) geolocate
+234) favicon
+235) gameplay
+236) webmaster (+plural)
+237) holler (+ ed)
+238) chemtrail (+plural)
+239) Günther (name)
+240) twopenn'orth (John Wilcock from the Mozilla ML)
+241) reinstallation
+242) Alexandro (name)
+243) URLs (plural)
+244) discombobulate (+ed - Ian Neal from the Mozilla ML)
+245) discombobulation (Ian Neal from the Mozilla ML)
+246) Asturias
+247) Asturian
+248) LanguageTool (software)
+249) UI (Oxford: User Interface)
+250) pootle
+251) pootling
+252) counterclaim (+ed)
+253) sublicense (+ed)
+254) double-click (+ed +ing)
+255) Pootle (capitalised, for the utility)
+256) toolbar (+plural)
+257) joypad
+258) PNP
+259) nanomaterial
+260) nanoscale
+261) virtualise (+s +d +ing)
+262) virtualisation (+plural)
+263) voicemail
+264) steadier (added un)
+265) steadiest (added un)
+266) sci-fi (Oxford Dictionary: informal)
+267) namespace
+268) online (both on-line and online exist)
+269) webmail
+270) hardcover (removed, because in en_GB is hardback, thanks Ian Neal)
+271) likelihoods (merged into likelihood with an s code)
+272) postnuptial
+273) Coloradan (relating Colorado: noun and adjective: Oxford)
+274) LaVey (name)
+275) Belial (name)
+276) Rhadamanthus (name)
+277) Sarpedon (name)
+278) Pelops (name)
+279) sociopath (+plural +ic +y)
+280) schizo-affective
+281) walk-through
+282) unsexy (+ier + iest)
+283) handheld
+284) filename (+plural)
+285) unhide (added un to hide)
+286) overlayer (merged into overlay +plural)
+287) overinsured
+288) overinsurance
+289) overkeen
+290) overhit (+s +ing)
+291) Chiu (name)
+292) squawfish (+plural)
+292) podcast (+able +er +ing)
+293) autocorrect (+s +ed)
+294) autocomplete (+s +ed)
+295) waka
+296) watercraft
+297) spacecrafts (added plural - Oxford)
+298) weatherboards (added plural - Oxford)
+299) firewall (added +ed +ing)
+300) firestorm (+plural)
+
+
+V2.05 - 7-OCT-2013
+------------------
+301) GPU (+plural)
+302) AMD (hardware company)
+303) wireframe
+304) leverages (with s)
+305) tooltip (+plural)
+306) hyperlink (+plural +ed)
+307) wirelessly (merged into wireless)
+308) ultraconservatism
+309) ultramicroscope
+310) ultramicroscopic
+311) enigmatical
+312) enharmonically (merged into enharmonic)
+313) René (name)
+314) Kant's
+315) Kantian
+316) Kantianism
+317) Confucianist
+318) Azrael (name)
+319) exemplarily (merged into exemplary)
+320) exemplarity
+321) wholistic (+ally) (Oxford: variant spelling of holistic)
+322) homeopathy (Oxford: also homoeopathy)
+323) homeopathic (+ally)
+324) homeopathist
+325) Ashtar (name)
+326) teleporting (added "ing" to "teleport")
+327) Dreamtime
+328) Patricia (name)
+329) Patrícia (name with accent in "i")
+330) videographics
+331) megastar (informal)
+332) songcraft
+333) fado (+plural Oxford: Portuguese song)
+334) divagate (+s +ed)
+335) divagation
+336) biopharmaceutics
+337) WinZip (software)
+338) WinRAR (software)
+339) NTFS (file system for Windows)
+340) UDF (file system)
+341) subfolder (+plural)
+342) Ubuntu's (added the ')
+343) USB
+344) smartphone (+plural)
+345) rescript (added re into script)
+346) OpenGL
+347) GPL
+348) LGPL
+349) shutdown
+350) uninstall (+s +ing +ed +er)
+351) fundraise (+s +er +ing)
+352) googled (merged into google)
+353) pyjamaed (merged into pyjama)
+354) hackerspace
+355) miscreation (merged mis into creation)
+356) quinary
+357) senary
+358) septenary
+359) octonary
+360) nonary
+361) denary
+362) duodenary
+363) juvenilia
+364) megastore
+365) lightsabre (+Plural Oxford: from Star Wars)
+366) ultracold
+367) cerebrospinal
+368) midbrain
+369) hindbrain
+370) brainstem
+371) pluripotent
+372) microcephaly (+lic)
+373) microcephalous
+374) hippocampus
+375) hippocampi
+376) clavicular
+377) megastardom (informal)
+
+
+V2.06 - 1-NOV-2013
+------------------
+378) ongoingness (merged into ongoing)
+379) hacktivist (+plural)
+380) hacktivism
+381) cybercrime (+plural)
+382) cybercriminal (+plural)
+383) leakers (plural)
+384) NSA's (added the 's)
+385) infringers (plural)
+386) username
+387) Moodle
+388) breathalyse
+389) unappropriated
+390) defalcator (+plural)
+391) imponderably (merged into imponderable)
+392) imponderability
+393) forecasted (merged into forecast)
+394) salvific (Oxford: adjective, Theology)
+395) dualist
+396) dualistic (+ally)
+397) infographic
+398) cybernaut
+399) prepayable (merged into prepay)
+400) prepayability (merged into prepay)
+401) monoecious
+402) monoecy
+403) passerine (+plural)
+404) Google's (added the 's)
+405) subedit (+s +ed +ing)
+406) subeditor
+407) overhitting (merged into overhit)
+408) countback
+409) volleyer (merged into volley)
+410) standalone (removed - According to Oxford is: stand-alone)
+411) stroganoff
+412) timeshare (+s +ed)
+413) submodify (+er +ies +ing +tion)
+414) timeline (+plural)
+415) trainspotter (+plural)
+416) trainspotting
+417) burka
+418) Brezhnev (Russian name)
+419) Gorbachev (Russian name)
+420) preset (+s)
+421) Wicca
+422) Wiccan
+423) archangelic (merged into archangel)
+424) angelology
+425) typologist (merged into typology)
+426) Wi-Fi
+427) WC
+428) wiki (yes, it exists in Oxford)
+429) Wikipedian
+430) LinkedIn (Business Social Network)
+431) interlinkage
+432) monotype
+433) spiritlessly (merged into spiritless)
+434) spiritlessness (merged into spiritless)
+435) spiritism
+436) spiritist
+437) spiritistic
+438) (merged spirit's into spirit)
+439) bestselling
+440) subterraneous
+441) subterraneously (merged into subterraneous)
+442) subterminal
+443) viscousness (merged into viscous)
+444) imperatrix
+445) imperatrices
+446) Metallica (+'s - the heavy metal band)
+447) SMS (+plural +ing +ed)
+448) MMS (+plural +ing +ed)
+449) infowar
+450) wipeable (merged into wipe)
+451) multiplayer
+452) (merged multitasking into multitask)
+453) multitasked (merged into multitask)
+454) multitasker (merged into multitask)
+455) petabyte (+plural)
+456) Bluetooth (+ed)
+457) terabyte (+plural)
+458) metadata
+459) metafile
+460) netiquette
+461) DSL
+462) listenership
+463) videoconference (+ing)
+464) narrowcast (+ed +ing +er)
+465) cypherpunk (+plural)
+466) MSN
+467) viewport
+468) Hezbollah
+469) unibody (+plural)
+470) escargot
+471) yogurt (+plural)
+472) knifepoint
+473) guerrilla (fix: it had plural only and 's)
+474) teacherly
+475) varicella
+476) herpesvirus
+477) postnatally (merged into postnatal)
+478) echoer (merged into echo)
+479) echoey (merged into echo)
+480) echoless (merged into echo)
+481) (merged echo's into echo)
+482) (merged echoic into echo)
+483) Transifex
+484) biogeochemical
+485) biogeochemist
+486) biogeochemistry
+487) centremost
+488) workpiece
+489) WordPad
+490) netbook (+plural)
+491) Atlantean
+492) Tir-na-nog
+493) Hadean
+494) Edenic (merged into Eden)
+495) Midgard
+496) Gehenna
+497) Perseus
+498) Andromeda
+499) Pegasus
+500) originalism
+501) pastiched (merged into pastiche)
+502) choirman
+503) choirmen
+504) conservatoire
+505) hindwing
+506) something's (Oxford - something's behalf - merged into something)
+507) Croats (merged into Croat)
+508) Bahamian
+509) Qatari
+510) Belorussia
+511) Rwandese
+512) Mongols (plural)
+513) mongol (+plural - both in lower case - offensive - Down’s syndrome)
+514) counterterrorism
+515) counterterrorist
+516) countermine (+ing)
+517) pepperminty
+518) duckwalk (+ed)
+519) Fátima (name)
+520) Fatima (name without accent)
+521) fatidic
+522) Nostradamus (name)
+523) monocrat (+ic)
+524) monocracy (+plural)
+525) omnicompetent
+526) omnicompetence
+527) omnisexual
+528) omnisexuality
+529) ureteric
+530) ureteral
+531) vinculum
+532) vincular
+533) amygdala
+534) amygdalae
+535) BCG
+536) hyperkeratosis
+537) monolingually (merged into monolingual)
+538) monoglot
+539) polyglottal
+540) polyglottic
+541) polyglottism
+542) mentoring + mentored (merged to mentor - The .AFF had no bug after all)
+543) Afrotropical
+544) unholier (merged into unholy)
+545) unholiest (merged into unholy)
+546) unholiness (merged into unholy)
+
+
+V2.07 - 27-NOV-2013
+-------------------
+547) newsfeed
+548) telerecording
+549) televiewer
+550) televiewing
+551) radiogenic (+ally)
+552) sRGB
+553) RGB
+554) tech (Oxford - informal)
+555) infotech
+556) bandolero (+plural)
+557) honeytrap
+558) gangboard
+559) gangsta (Oxford - black slang)
+560) bottlescrew
+561) shrimper (+plural)
+562) longline
+563) prawner (merged into prawn)
+564) wanna (Oxford - informal - want to; want a)
+565) Wankie
+566) wanky (Oxford - British vulgar slang)
+567) kbyte (+plural)
+568) maxwell (if in lower case it is a physics measure)
+569) bushelful (+plural)
+570) kilometric (merged into kilometre)
+571) fibreless (merged into fibre)
+572) midline
+573) inbox
+574) linkbait
+575) pseudorandom
+576) pseudorandomly (merged into pseudorandom)
+577) pseudoscience
+578) pseudoscientific
+579) pseudoscientist
+580) parapsychological
+581) parapsychologically (merged into parapsychological)
+582) parapsychic
+583) psychometrist (merged into psychometry)
+584) psychometrician
+585) demonology (plural + demonological + demonologist)
+586) vampirism
+587) quickstepping (merged into quickstep)
+588) quickstepped (merged into quickstep)
+589) Solomonic (merged into Solomon)
+590) millenary (+plural)
+591) Floréal
+592) Amazonia
+593) timeout
+594) undelete (+ed +ing)
+595) screenable (merged into screen)
+596) screenful (merged into screen)
+597) preselection
+598) preselective
+599) techie (+plural - Oxford: informal)
+600) techy (Oxford: informal)
+601) chargrill (+ed)
+602) technicals (added plural)
+603) knockout
+604) speedball
+605) decametre (+ic)
+606) decigram
+607) decigramme
+608) magnifico (Oxford: informal)
+609) magnificoes (Oxford: informal)
+610) postpositive (+vely)
+611) intentionalism
+612) grottoed (merged into grotto)
+613) preadolescent
+614) preambular
+615) summariness (merged into summary)
+616) summational
+617) summative
+618) Zeuxis (Oxford: Greek painter)
+619) zettabyte
+620) rollerball
+621) autoroute
+622) backstreets (plural)
+623) downfold
+624) masterdom
+625) masterhood
+626) masterless (merged into master)
+627) zinced (merged into zinc)
+628) cobaltic (merged into cobalt)
+629) cobaltous
+630) combust
+631) combustor
+632) multithreaded
+633) multithreading
+634) netizen (+plural - Oxford: informal)
+635) Photoshop (Oxford: +s +ing +ed)
+636) rangefinder
+637) microcapsule
+638) colonoscope
+639) colonoscopy (+plural)
+640) hypnotherapist (+plural)
+641) abductee (+plural)
+642) ET (+plural)
+643) Harzan (name of person)
+644) Denise (name of person)
+645) celeb (+plural - Oxford: informal)
+646) CEO (added +s and 's)
+647) CNN (added 's)
+648) scats (merged plural into scat)
+649) synchronicity
+650) Sananda (name of person)
+651) micropyle
+652) spermatozoid (+plural)
+
+
+V2.08 - 1-JAN-2014
+------------------
+653) Ilachinski (name of person)
+654) journaling (fix: it had two ll)
+655) journaled (fix: it had two ll)
+656) weathergirl
+657) greyscale
+658) rollback
+659) pushback
+660) patball
+661) blowout
+662) debut (+ed +ing)
+663) debutante
+664) proaction
+665) proactively (merged into proactive)
+666) proactivity
+667) MUFON's (added 's)
+668) intension (+al +ally)
+669) conjecturable (merged into conjecture)
+670) hypercorrect
+671) hypercorrection
+672) reduplicative
+673) redwing
+674) underwing (+plural)
+675) nymphal (merged into nymph)
+676) nymphean
+677) Persephone (name)
+678) myriapod
+679) pictography
+680) hieroglyphical
+681) hieroglyphically (merged into hieroglyphical)
+682) interlanguage
+683) correlativity
+684) predicability
+685) sulphadiazine
+686) biopharmaceutical (+plural)
+687) dealmaker
+688) dealmaking
+689) subclause
+690) dischargeable (merged into chargeable)
+691) disciplic
+692) discipular
+693) tachistoscope
+694) tachistoscopic (merged into tachistoscope)
+695) tachistoscopically (merged into tachistoscope)
+696) Dropbox
+697) headhunt (+er +ing)
+698) VCRs (plural)
+699) videocassette
+700) stuntwoman
+701) stuntwomen
+702) Steadicam
+703) filmstrip
+704) shirtsleeved (merged into shirtsleeve)
+705) warez (Oxford: informal)
+706) cybersex
+707) cybershop (+s +ing +ed)
+708) cybersecurity
+709) cyberphobia
+710) cyberphobe
+711) cyberphobic
+712) cyberneticist
+713) multivalve
+714) doomy
+715) doomier (merged into doomy)
+716) doomily (merged into doomy)
+717) doominess (merged into doomy)
+718) doomiest (merged into doomy)
+719) satanically (merged into satanic)
+720) monolatry
+721) monolater
+722) monolatrist
+723) monolatrous
+724) picnicky (merged into picnic)
+725) fastball
+726) curveball
+727) fetal
+728) EPROM
+729) Perl
+730) shovelware
+731) prosthetically (merged into prosthetic)
+732) microsurgeon
+733) microsurgical
+734) bistoury (+plural)
+735) vaselined
+736) OpenPGP
+737) alienability
+738) survivorship
+739) refrigeratory
+740) desiccative (merged into desiccate)
+741) replaced spongelike with sponge-like (Fix - Oxford)
+742) oystering (merged into oyster)
+743) cephalopod
+744) milreis (currency)
+745) cruzado (currency) (+plural)
+746) kwanza (currency) (+plural)
+747) dobra (currency)
+748) bitcoin (+plural)
+749) spreadsheeting (merged into spreadsheet)
+750) DDoS
+751) bloggable (merged into blog)
+752) hectarage
+753) megalitre
+754) Svedberg
+755) petaflop
+756) iPhone
+757) iPad
+758) criminalistics
+759) triable
+760) sequestrable (merged into sequestrate)
+761) sequestrator
+762) sociolegal
+763) orthomolecular
+764) cryopreserve
+765) cryopreservation (merged into cryopreserve)
+766) allogeneic
+766) thrombose (fixed thromboses + added ed)
+767) immunotherapy
+768) shadowgraph
+769) radiograph
+770) microphysics
+771) microphysical
+772) ionizable (merged into ionize)
+773) intramolecular
+774) intramolecularly (merged into intramolecular)
+775) superspace
+776) metamaterial (+plural)
+777) isoelectronic
+778) seventhly
+779) UVA
+780) radioscopic (merged into radioscopy)
+781) antigravity
+782) spacewalk (+er)
+783) Geminis (plural - merged into Gemini)
+784) Geminian
+785) xenology
+786) xenologist
+787) cockfight (+s +ing)
+788) neuroticism
+789) megalomanic
+790) anaclitic
+791) megalomaniacal
+792) megaflop (+plural)
+793) kilocalorie
+794) multigym
+795) powerlifting
+796) powerlifter
+797) kettlebell
+798) translunar
+799) checkbox (+plural)
+800) duplexity
+801) preagricultural
+802) admins (plural)
+803) housefather
+804) housemother
+805) mainstreamed (merged into mainstream)
+806) merged mainstreamer into mainstream
+807) remediate
+809) remediation (merged into remediate)
+810) biopiracy
+811) sublittoral
+812) biogeography
+813) biogeographic (merged into biogeography)
+814) biogeographer
+815) biogeographically
+816) biogeographical
+817) excretive (merged into excrete)
+818) hyperparasite
+819) hyperparasitic (merged into hyperparasite)
+820) hyperparasitism
+821) acellular
+822) charcuterie (+plural)
+823) chiffonade
+824) piri-piri
+825) crispbread
+826) fricasseed (merged into fricassee)
+827) tsukemono (+plural)
+828) feijoada
+829) tourtière
+830) macaronies (fixed - plural)
+831) fourchette
+832) quadratus
+833) quadrati
+834) submandibular
+835) rectus
+836) recti
+837) umbilically (merged into umbilical)
+838) preflighting (merged into preflight)
+839) gyropilot
+840) mainsheet
+841) helmsmanship
+842) unnavigability
+843) coachroof
+844) waypoint (+plural)
+845) ASUS
+
+
+V2.09 - 1-FEB-2014
+-------------------
+846) payday
+847) MySpell
+848) Alexandro's (added the 's)
+849) neuropathy
+850) neuropathic
+851) stomatitis
+852) malarious
+853) remittent
+854) haemodialysis
+855) haemodialyses
+856) inhalator
+857) cataplexy
+858) cataplectic
+859) heartworm
+860) encephalopathies (merged into encephalopathy)
+861) bluetongue
+862) endemism
+863) exospheric (merged into exosphere)
+864) polyphonist (merged into polyphony)
+865) polyphonous
+866) unsettlement (merged into unsettle)
+867) spiderman (Oxford: informal)
+868) spidermen (Oxford: informal)
+869) airbrick
+870) stringboard
+871) icehouse
+872) portcullised (merged into portcullis)
+873) sexfoil
+874) isometry
+875) lunette
+876) tympan
+877) catchline
+878) countermark
+879) printability
+880) sterilely (merged into sterile)
+881) frogspawn
+882) behaviouralism
+883) behaviouralist
+884) tartare
+885) fishcake
+886) pâtés (merged plural and removed the 's into the singular form)
+887) dragonfish (+plural)
+888) stonefish (+plural)
+889) Quechua (+plural)
+890) Quechuan
+891) Bolognese
+892) bolognese (lower case)
+893) bolognaise
+894) heteronym (+ic)
+895) heteronymous
+896) ungeared
+897) ungenial (merged into genial)
+898) ungenerousness
+899) ungifted (merged into gifted)
+900) unfussily (merged into unfussy)
+901) Hunspell
+902) ungainsayable
+903) doubleton
+904) causalgia
+905) vesical
+906) cryptogenic
+907) ultrasonography
+908) ultrasonographic (merged into ultrasonography)
+909) tonometer
+910) moonset
+911) intercalary
+912) Ramadan
+913) overstimulation
+914) psychomotor
+915) psychosomatically (merged into psychosomatic)
+916) hyperactively (merged into hyperactive)
+917) hyperkinetic
+918) hyperkinesis
+919) captcha
+920) APIs (plural)
+921) iTunes
+922) iPhones (plural)
+923) iPads (plural)
+924) iOS
+925) hydroculture
+926) perlite
+927) hydrography
+928) hydrographer
+929) hydrographic
+930) hydrographical
+931) hydrographically
+932) underframe
+933) underminer (merged into undermine)
+934) megacity (+plural)
+935) mudbank
+936) geospatial
+937) postiche
+938) sideburn (fixed: the speller only had plural)
+939) upswept
+940) reuptake (merged into uptake)
+941) DEFCON (and defcon - Oxford: US armed forces)
+942) shipbroker
+943) furcula
+944) furcular
+945) furculae
+946) springtail (+plural)
+947) mealworm
+948) viviparity
+949) viviparously
+950) plantable (merged into plant)
+951) plantlet (+plural)
+952) floriculture
+953) floricultural (merged into floriculture)
+954) floriculturist (merged into floriculture)
+955) diaspore
+956) diasporic (merged into diaspora)
+957) tetanic (+ally)
+958) Kalashnikov
+959) alkane (+plural)
+960) heterocyclic
+961) benzenoid
+962) semimetal
+963) semimetallic (merged into semimetal)
+964) betaine
+965) bicyclic
+966) astrochemistry
+967) astrochemical
+968) astrochemist
+969) magnetopause
+970) nanoscopic
+971) nanostructure
+972) nanotech
+973) nanotube
+974) nanorobot
+975) EEPROM
+976) chipmaker
+977) bitstream
+978) Bitstream (Oxford: trademark in the US)
+979) superheterodyne
+980) radiogoniometer
+981) overscan
+982) multitrack (+ed)
+983) nanobot
+984) bioelectronics
+985) intercellular
+986) heteromerous
+987) neurosciences (plural)
+988) biostatistical
+989) biostatistician
+990) pornification
+991) pornify
+992) laserdisc
+993) genlock
+994) S-VHS
+995) chrominance
+996) videocast
+997) defrag (+s +ing +ed)
+998) ultraportable
+999) defragment (+ion +er)
+1000) PDA
+1001) webspace
+1002) cybercrook (+plural)
+1003) bootable
+1004) preload (+ing)
+1005) RTF
+1005) GPRS
+1006) SOSs (plural)
+1007) chatline
+1008) welcomely (merged into welcome)
+1009) welcomeness (merged into welcome)
+1010) welcomer (merged into welcome)
+1011) welcomingly (merged into welcome)
+1012) terroristic (merged into terrorist)
+1013) terroristically
+1014) instrumentalism
+1015) superbug
+1016) hantavirus
+1017) herpesviruses (plural)
+1018) herpetic
+1019) leucoma
+1020) headmasterly (merged into headmaster)
+1021) schoolwork
+1022) playschool
+1023) schooldays
+1024) encyclopedism
+1025) encyclopedist
+1026) encyclopedic
+1027) exocentric
+1028) endocentric
+1029) psycholinguist (added singular)
+1030) grimoire
+1031) psychotronics
+1032) Raelian (+plural)
+1033) attunement
+1034) attritional (merged into attrition)
+1035) attornment
+1036) subsoiling (merged into subsoil)
+1037) fishmeal
+1038) charro (+plural)
+1039) horsebean
+1040) pigman
+1041) pigmen
+1042) slaughterman
+1043) agriproduct
+1044) arboriculture
+1045) arboricultural (merged into arboriculture)
+1046) arboriculturist (merged into arboriculture)
+1047) vermiculture
+1048) nitrochalk
+1049) unreactive (merged into reactive)
+1050) bronzy
+1051) bronzer (merged into bronze)
+1052) reliefs (plural)
+1053) superalloy
+1054) metallographic (merged into metallography)
+1055) metallographically
+1056) silversmithing (merged into silversmith)
+1057) tinplate (+ed)
+1058) EURIBOR
+1059) Euromarket
+1060) Eurocurrency (+plural)
+1061) sexer (merged into sex)
+1062) aristo (+plural - Oxford: informal term for aristocrat)
+1063) toymakers (plural - merged into toymaker)
+1064) toymaker's (merged into toymaker)
+1065) rainswept
+1066) acidophil (+plural +ic)
+1067) basophil (+plural + merged ic into it)
+1068) monocyte (+plural)
+1069) glutamine
+1070) chipset (+plural)
+1071) HD
+1072) ATA
+1073) SATA
+1074) AmigaOS
+1075) Amigas (plural)
+1076) archboard
+1077) flatboat (+plural)
+1078) keelboat (+plural)
+1079) webinar (+plural)
+1080) duodecimo (+plural)
+1081) barmy (+ier +iest + ily +iness)
+1082) barmbrack
+1083) cushiony (merged into cushion)
+1084) whoopers (plural)
+1085) fireback (+plural)
+1086) airgun (+plural)
+1087) airheaded (Oxford: informal - merged into airhead)
+1088) warplane (+plural)
+1089) warpaint
+1090) Cheyennes (plural)
+1091) checklist (+plural)
+1092) cafetière
+1093) caffeinated
+1094) cuppa (+plural - Oxford: informal)
+1095) atriums (plural)
+1096) basilican
+1097) cartonnage
+1098) cartophily
+1099) cartophilist (+plural)
+1100) Johan (name of person)
+1101) virtuosic
+1102) tessitura
+1103) countertenor (+plural)
+1104) antiretroviral (+plural)
+1105) Prussia
+1106) Prussian (+plural)
+1107) countryfied (Oxford: also countrified)
+1108) antiterror
+1109) antiterrorist
+1110) antitoxic
+1111) micro-organism (Fix/deleted: it is microorganism)
+1112) microorganism (+plural)
+1113) micropayment (+plural)
+1114) micronutrient (+plural)
+1115) nanowire (+plural)
+1116) nanobacterium
+1117) nanobacteria
+1118) nanobots (plural)
+1119) nanoparticle (+plural)
+1120) nanorobots (plural)
+1121) nanotubes (plural)
+1122) wordlessness (merged into wordless)
+1123) wordlist
+1124) contrafactive
+1125) contrafactual
+1126) contralateral
+1127) contraposition
+1128) multiplatform
+1129) CSS
+1130) yup
+1131) yep
+1132) XHTML
+1133) SVGA
+1134) namespaces (plural)
+1135) sumptuary
+1136) adminicle
+1137) adminicular
+1138) procurers (plural)
+1139) paraplegic's (added the 's)
+1140) victimhood
+1141) camgirl
+1142) unawakened (merged into awakened)
+1143) gainly (Oxford: archaic)
+1144) Ofcom (Oxford: abbreviation in the UK - Office of Communications)
+1145) Facebook's (added the 's)
+1146) giveaway (+plural)
+1147) cheerleading
+1148) telltale (+plural)
+1149) zoospore (+plural)
+1150) swarmer (+plural)
+1151) hatchling (+plural)
+1152) intercostal (+ly)
+1153) radiolarian (+plural)
+1154) ammonoid (+plural)
+1155) allometry (+ic)
+1156) dorsoventral (+ly)
+1157) embryologic (merged into embryology)
+1158) embryologically
+1159) Pspell
+1160) Aspell
+1161) throwdown
+1162) bodybuilder (+plural)
+1163) bodybuilding
+1164) bodyboard (+plural)
+1165) bodyboarder (+plural)
+1166) bodyboarding
+1167) knowledgeability (merged into knowledge)
+1168) knowledgable
+1169) trichotomy (+plural)
+1170) trichotomous
+1171) tricker (merged into trick)
+1172) trickish
+1173) pixilated
+1174) pixillated (other way of writing the above)
+1175) glitchy (merged into glitch)
+1176) cashback
+1177) casuarina (+plural)
+1178) MacOS
+1179) overviewed (merged into overview)
+1180) overviewing (merged into overview)
+1181) overvaluation
+1182) overwater (+ed +ing)
+1183) overwear
+1184) overwhelmingness
+1185) overwind (+ing)
+1186) overwound
+1187) Bitrex (Oxford: trademark)
+1188) bitonal
+1189) bitonality
+1190) hoo-ha (Oxford: British informal)
+1191) synergist (+plural + ally)
+1192) synfuel (+plural)
+1193) aryl
+1194) chromoly
+1195) chromogenic
+1196) haemophilic (+plural)
+1197) antiscorbutic (+plural)
+1198) antisense
+1199) antirrhinum (+plural)
+
+
+V2.10 - 1-MAR-2014
+------------------
+1200) POS
+1201) Wikipedia's (added the ')
+1202) PDAs (plural)
+1203) FireWire
+1204) mic (+plural - Oxford: short for microphone)
+1205) deniability
+1206) deniably (merged into deniable)
+1207) remanent
+1208) remanence
+1209) coercivity
+1210) CD-RW (+plural)
+1211) onboard
+1212) NAND
+1213) modding+modded+modder (merged into mod)
+1214) defragmenting (merged into defragment)
+1215) DVD-ROM (+plural)
+1216) CD-ROMs (plural)
+1217) offline
+1218) jeep (+plural)
+1219) minidisc (+plural)
+1220) predate (+ed)
+1221) Boole (name + 's)
+1222) phenotypic (merged into phenotype)
+1223) phenotypical
+1224) phenotypically (merged into phenotypical)
+1225) triploid (+plural)
+1226) tetraploid (+plural)
+1227) tetraploidy
+1228) hexaploid
+1229) hexaploidy
+1230) sparrowhawk (+plural)
+1231) whinchat (+plural)
+1232) transgender (+ed +ing)
+1233) homophobe (added singular, by fixing plural)
+1234) intersexual
+1235) intersexuality
+1236) show's (added 's)
+1237) battleaxes (plural)
+1238) battlebus (+plural - Oxford: British informal)
+1239) battlecruiser (+plural +'s)
+1240) echinus
+1241) echinoid (+plural)
+1242) scriptoriums (plural of scriptorium)
+1243) scriptoria (also plural of scriptorium)
+1244) iMac
+1245) cameraperson
+1246) camerawork
+1247) noir (+plural)
+1248) noirish
+1249) screwball (+plural +er)
+1250) venesection
+1251) gamelan
+1252) gamepad (+plural)
+1253) gamekeeping
+1254) gamesman
+1255) gamefowl
+1256) catchlight (+plural)
+1257) x86
+1258) x64
+1259) UTF-8
+1260) PureBasic
+1261) Algarve (famous city in Portugal)
+1262) calculuses (added plural)
+1263) Calcuttan
+1264) caldarium
+1265) caldaria (plural of caldarium)
+1266) man-at-arms
+1267) men-at-arms (plural)
+1268) horsebox (+plural)
+1269) horsebeans (plural)
+1270) cornetto
+1271) cornetti (plural of cornetto)
+1272) cornett (+plural)
+1273) cornetfish (+plural)
+1274) cornerwise
+1275) cornerman
+1276) cornermen (plural of cornerman)
+1277) Missourian
+1278) eww (informal: exclamation)
+1279) untypical (+ally)
+1280) counter-jumper
+1281) counter-offer (+plural)
+1282) plumed (merged into plume)
+1283) plume-like (fixed plumelike)
+1284) plumbous
+1285) blackleaded (merged into blacklead)
+1286) duotone (+plural)
+1287) duopolies (plural of duopoly)
+1288) duology (+plural)
+1289) underwork (+ed)
+1290) alley-oop
+1291) underpainting
+1292) underperform (+s +ing)
+1293) underperformance
+1294) underplant (+s +ed)
+1295) arbovirus (+plural)
+1296) antibiosis
+1297) bioenergy
+1298) bioengineer (+s +ed)
+1299) bioethical
+1300) bioethicist (+plural)
+1301) xenograft (+s)
+1302) allograft (+s)
+1303) homograft (+s)
+1304) chemotaxis
+1305) chemotactic
+1306) secretor (+s)
+1307) secretory
+1308) meningioma (+plural)
+1309) meningiomata (another plural of meningioma)
+1310) meningitic
+1311) flavivirus (+plural)
+1312) seropositive
+1313) seropositivity
+1314) seronegative
+1315) seronegativity
+1316) seroprevalence
+1317) SSD (+plural +'s)
+1318) IOPS
+1319) mSATA
+1320) Z80
+1321) tablier
+1322) handcraft (+ed)
+1323) candleholder (+plural)
+1324) beadwork
+1325) Polokwane (town in northern South Africa)
+1326) Polonnaruwa (town in NE Sri Lanka)
+1327) reptoid (+plural)
+1328) poltroonery
+1329) counteragent (+plural)
+1330) counterblast
+1331) counterbore (+plural)
+1332) countercharge (+plural)
+1333) countercheck (+plural)
+1334) south-western
+1335) wingbeat (+plural)
+1336) sailplane (+plural)
+1337) reimagine (+ed)
+1338) groundbreaking
+1339) groundbreaker (+plural)
+1340) Shaolin
+1341) teammate (+plural - fixed: team-mate)
+1342) ninjutsu
+1343) aikido
+1344) McAfee
+1345) cyber
+1346) apparat (Oxford: chiefly historical)
+1347) Mandela's (added the 's)
+1348) Obama (name of person + 's)
+1349) Snowden (name of person + 's)
+1350) MasterCard
+1351) Moodle's (added the 's)
+1352) workflow (+plural)
+1353) 720p
+1354) 1080i
+1355) 1080p
+1356) artemisia (+plural)
+1357) santolina (+plural)
+1358) bloodroots (added plural)
+1359) Emily (name + 's)
+1360) H.264
+1361) Corel
+1362) brushstroke (+plural)
+1363) 1024x768
+1364) 1366x768
+1365) 800x600
+1366) 640x480
+1367) 320x240
+1368) 1280x720
+1369) 1920x1080
+1370) 1280x720p
+1371) 1920x1080i
+1372) 1920x1080p
+1373) nasogastric
+1374) nasopharynx
+1375) nasopharyngeal
+1376) mucosae (plural of mucosa)
+1377) mucosal
+1378) stroma
+1379) stromata (plural of stroma)
+1380) stromatoporoid (+plural)
+1381) edaphosaurus (+plural)
+1382) opacify (+s +ed +ing +er)
+1383) oesophaguses (another plural of oesophagus)
+1384) signifieds
+1385) signifiers
+1386) signifié (another term for signified)
+1387) Harris (added 's)
+1388) signifiant
+1389) middleware
+1390) choirgirl (+plural +'s)
+1391) choisya (+plural)
+1392) cowbane
+1393) Nathel (name)
+1394) eyehole (+plural)
+1395) eyeline
+1396) eyeliner (+plural)
+1397) eyepatch
+1398) fisheye
+1399) fishbowl
+1400) railroad (+plural +ing +ed)
+1401) railman
+1402) railmen (plural of railman)
+1403) Horwich (name)
+1404) railwayana
+1405) raiments (plural)
+1406) couchette (+plural)
+1407) couchant
+1408) addorsed
+1409) coudé
+1410) testee (+plural)
+1411) fundus
+1412) fundi (plural of fundus)
+1413) funebrial
+1414) micropipette (+plural)
+1415) micropig (+plural)
+1416) microphotograph (+s +ic +y)
+1417) microphagous
+1418) microphagic
+1419) phytochemical (+plural)
+1420) phytochrome
+1421) phytogenetic
+1422) phytogeography
+1423) phytolith (+plural)
+1424) lumens (plural)
+1425) biogenic
+1426) biogenesis
+1427) biogenetic
+1428) biogas
+1429) high-pass
+1430) sthenic
+1431) veratrum (+plural)
+1432) veratrine
+1433) chimichanga (+plural)
+1434) chimichurri
+1435) burrito (+plural)
+1436) drop-down
+1437) pull-in
+1438) cafe (+plural)
+1439) brassard (+plural)
+1440) brass-necked
+1441) glissandos (plural, there is also glissandi)
+1442) glissé (+plural)
+1443) glitterati (Oxford: informal)
+1444) Bollywood
+1445) bollworm (+plural)
+1446) sprayings (plural)
+1447) horntail (+plural)
+1448) Hornung (name of person)
+1449) cracksman
+1450) cracksmen
+1451) cracknel (+plural)
+1452) bucatini
+1453) clementine (+plural - both lowercase - the fruit)
+1454) cheesemonger (+plural)
+1455) cheesewood
+1456) cheffing + cheffed (merged into chef)
+
+
+V2.11 - 1-APR-2014
+------------------
+1457) curriculum vitae
+1458) curricula vitae (plural of curriculum vitae)
+1459) multiparty
+1460) polyphase
+1461) polyphasic
+1462) multiplatinum
+1463) multiplay
+1464) fabulate (+ion)
+1465) fabulator
+1466) fabulist (+plural +')
+1467) autochange (+er)
+1468) airbag (+plural)
+1469) airband
+1470) airbed
+1471) airboat
+1472) airbricks (added plural)
+1473) stairlift (+plural)
+1474) stairhead
+1475) rundown
+1476) staithe (+plural)
+1477) double-ender
+1478) notes inégales
+1479) touchscreen (+plural)
+1480) touchpoint (+plural)
+1481) touchpad
+1482) touchless
+1483) toucher (+plural)
+1484) faceplates (added plural)
+1485) facetiae
+1486) epigraphic (merged into epigraphy)
+1487) epigraphically (merged into epigraphy)
+1488) epigraphist (merged into epigraphy)
+1489) epigrammatically
+1490) trachoma
+1491) trachomatous
+1492) acetogenic
+1493) biofilm (+plural)
+1494) bioenergetics
+1495) bioelectric
+1496) bioelectrical
+1497) supramolecular
+1498) phospholipid (+plural)
+1499) proteinase (+plural)
+1500) proteoglycan (+plural)
+1501) sulfate (+plural - another form of sulphate)
+1502) alkene (+plural)
+1503) alicyclic (+plural)
+1504) cyclohexane
+1505) involutes (+plural)
+1506) parapodium
+1507) parapodia (plural of parapodium) (+parapodial)
+1508) polychaete (+plural)
+1509) bryozoan (+plural)
+1510) pustulate (+ing +ion)
+1511) pussyfooter (+plural)
+1512) pussycat (+plural)
+1513) pussy-whip (+ed - Oxford: vulgar slang)
+1514) multifold
+1515) New Ager (+plural)
+1516) New Ageism
+1517) New Age
+1518) groundbait (+ing)
+1519) ground-to-air
+1520) crosstrees
+1521) flexitarian (+plural)
+1522) nightlife
+1523) ragweed
+1524) bottlebrush (+plural)
+1525) multi-agency
+1526) multiaxial
+1527) biohazard (+plural)
+1528) bioindicator (+plural)
+1529) seabird (+plural)
+1530) murrelet (+plural)
+1531) steelhead
+1532) eutectoid
+1533) user-friendly (added +ier +est +ness)
+1534) user-hostile
+1535) darknet
+1536) backlight (+ed +ing)
+1537) backlift
+1538) backline
+1539) backlink (+plural)
+1540) cellmate
+1541) Whitemoor (name)
+1542) Sundberg (name)
+1543) multiculturalist
+1544) multiculturally
+1545) multidirectional
+1546) multifaith
+1547) multifactorial
+1548) electrocoagulation
+1549) electrocautery
+1550) aeromedical
+1551) aeromagnetic
+1552) aerolite (+plural)
+1553) aerogramme
+1554) aerogel (+plural)
+1555) aeroelasticity
+1556) aeroelastic
+1557) under-read
+1558) speedo (+plural - Oxford: short informal for speedometer)
+1559) Speedos (Oxford: trademark Men’s brief, tight swimming trunks)
+1560) speedballs (added plural)
+1561) punchball
+1562) Saughton (name)
+1563) methamphetamine
+1564) methanal
+1565) flocculant (+plural)
+1566) whistle-blowing
+1567) telescreen
+1568) Morrisons (name)
+1569) long-stay
+1570) multicore
+1571) binational
+1572) binate
+1573) cross-compiler
+1574) autoresponder
+1575) autorotate
+1576) autorotation (+plural)
+1577) autosave (+ing +ed)
+1578) autoroutes (added plural)
+1579) autoshaping
+1580) Comanches (added plural)
+1581) Lakota (+plural)
+1582) anti-ageing
+1583) anti-American
+1584) anti-British
+1585) anti-capitalist
+1586) anti-capitalism
+1587) anti-Christian
+1588) anti-constitutional
+1589) anti-corruption
+1590) anti-democratic
+1591) anti-emetic
+1592) anti-feminist
+1593) anti-feminism
+1594) anti-fraud
+1595) anti-gay
+1596) right-click
+1597) cybernauts (added plural)
+1598) cyberculture
+1599) cyberespionage
+1600) backchannel (+plural)
+1601) backcast (+plural)
+1602) left-click
+1603) Hilberg (name +')
+1604) unfeasible (+bly)
+1605) unfeasibility
+1606) unfavourite (merged into favourite)
+1607) misconfigure (+ed)
+1608) bitmapping + bitmapped (merged into bitmap)
+1609) CCD
+1610) Williard (name)
+1611) neonatologist
+1612) neonatology
+1613) neonicotinoid (+plural)
+1614) pyrethroid (+plural)
+1615) neopaganism
+1616) neopagan (+plural)
+1617) neophobia
+1618) neophobic
+1619) neontology
+1620) neontological
+1621) catabolism
+1622) catabolic
+1622) catabolize (+ing)
+1623) biosynthesis
+1624) biosynthetic
+1625) metaphysician (+plural)
+1626) metaplasia
+1627) metaplastic
+1628) by-blow
+1629) Mendelssohn (added 's)
+1630) goop
+1630) goopy (+ness +er +est)
+1631) goosander (+plural)
+1632) waterbird (+plural)
+1633) waterbed (+plural)
+1634) footboard (+plural)
+1635) alright
+1636) footbrake (+plural)
+1637) rpm
+1638) footgear
+1639) footle
+1640) facade (also façade)
+1641) footmark (added singular)
+1642) tobyman + tobymen
+1643) Witherington (name)
+1644) Higton (name)
+1645) ottocento
+1646) mulattos (plural)
+1647) vice anglais
+1648) magnesian
+1649) ultrabasic
+1650) volcanicity
+1651) geopark
+1652) geomorphologist (merged into geomorphology)
+1653) catastrophism
+1654) catastrophist
+1655) uniformitarianism
+1656) gralloch
+1657) superhelix
+1658) superhelices
+1659) superhelical
+1660) superheavyweight
+1661) superheavy
+1662) supergroup
+1663) supergravity
+1664) superstring (+plural)
+1665) supersymmetry (+ic)
+1666) supertax
+1667) supertwist
+1668) LCD's (added the 's)
+1669) multibillion
+1670) multibuy (+plural)
+1671) telepathist (merged into telepathy)
+1672) telepathise (merged into telepathy)
+1673) empath
+1674) clairaudience
+1675) clairaudient
+1676) apozem (+plural - Oxford: archaic)
+1677) electuary (+plural - Oxford: archaic)
+1678) qubit (+plural)
+1679) autodialler + autodials + autodialling + autodialled (merged into autodial)
+1680) autocue (fix: It only accepted uppercase - in Oxford it is in lowercase)
+1681) filmgoer (+plural)
+1682) somatically
+1683) microinject (+ed +ing)
+1684) microinjection
+1685) postdoctoral
+1686) mutagenesis
+1687) mutagenicity
+1688) blastoderm
+1689) syncytium
+1690) syncytia
+1691) syncytial
+1692) plasmodium
+1693) plasmodia
+1694) plasmodial
+1695) trophoblast (+plural +ic)
+1696) trisomy (+plural)
+1697) monosomy (+ic)
+1698) Wacker (name)
+1699) dystopias (plural)
+1700) dystopian (+plural)
+1701) dystopic
+1702) Vorticist (+plural)
+1703) Vorticism
+1704) Bloomsbury
+1705) Dadaism
+1706) Dadaist (+ic)
+1707) vortical
+1708) vortically
+1709) vorticose
+1710) vorticular
+1711) vorticella (+plural)
+1712) araneid (+plural)
+1713) wickiup
+1714) wicketkeeper (+plural)
+1715) wicketkeeping
+1716) supersize (+s +ing +ed)
+1717) supersensitive
+1718) unaspirated
+1719) forma (+plural)
+1720) formae (another plural of forma)
+1721) overleap (+s +ed)
+1722) overleapt
+1723) overlarge
+1724) beget (+s +ing +er +est)
+1725) foredune (+plural)
+1726) embayment (+plural)
+1727) longshore
+1728) longship (+plural)
+1729) longlist (+plural)
+1730) shortlist (+s +ed)
+1731) shortlistee (+plural)
+1732) shorthold
+1733) thug-like
+1734) shorthair (+plural)
+1735) short-tempered
+
+
+V2.12 - 1-MAY-2014
+------------------
+1736) hurrahed + hurrahing (merged into hurrah)
+1737) extrados
+1738) intrados
+1739) voussoir (+plural)
+1740) Lillie (name)
+1741) Udmurt
+1742) Votyak (former term for the language Udmurt)
+1743) Casio (+'s - company)
+1744) W
+1745) Windows XP
+1746) status quo
+1747) deadlight (+plural)
+1748) deadeye (+plural)
+1749) greenie (+plural)
+1750) whinge (+s +ing +ed)
+1751) whingeing (another form of the previous one)
+1752) stonechat (+plural)
+1753) wheatear (+plural)
+1754) figbird (+plural)
+1755) forktail (+plural)
+1756) sunbird (+plural)
+1757) downcurved
+1758) leafbird (+plural)
+1759) bulbul (+plural)
+1760) drongo (+plural)
+1761) drongoes (another plural of the previous one)
+1762) bee-eater (+plural)
+1763) bee-stung
+1764) sunblind (+plural)
+1765) sunbittern (+plural)
+1766) antbird (+plural)
+1767) hoatzin (+plural)
+1768) manakin (+plural)
+1769) cotinga (+plural)
+1770) Neotropical
+1771) neotropics
+1772) fernbird (+plural)
+1773) fernbrake
+1774) ferox
+1775) butterfish (+plural)
+1776) butterflying + butterflied (merged into butterfly)
+1777) superfamily (+plural)
+1778) superfecundation
+1779) superfetation
+1780) ecdysis
+1781) ecdysial
+1782) clavate
+1783) thalli
+1784) thallus
+1785) thallophytes (plural)
+1786) cyanophyte (+plural)
+1787) dysenteric (merged into dysentery)
+1788) dysfunctionality
+1789) dysgraphia
+1790) dysgraphic
+1791) transracial
+1792) wildwood
+1793) redshank (+plural)
+1794) oystercatcher (+plural)
+1795) turnstones (plural)
+1796) transsexuality
+1797) transputers (plural)
+1798) chipmakers (plural)
+1799) photonics
+1800) photonegative
+1801) photomultipliers (plural)
+1802) photonic
+1803) echograph
+1804) echogram (+plural)
+1805) echocardiograph (+y +ic)
+1806) auscultatory
+1807) cervicitis
+1808) vaginosis
+1809) preterm
+1810) backmarker (+plural)
+1811) backlot (+plural)
+1812) backload (+plural)
+1813) dropside (+plural)
+1814) dropseed
+1815) buttonbush (+plural)
+1816) Lesley (name)
+1817) hatband (+plural)
+1818) hatbox (+plural)
+1819) weighbridges (plural)
+1820) backstroker (+plural)
+1821) downhillers (plural)
+1822) downhole
+1823) doodah (Oxford: informal)
+1824) doodly-squat (another term for diddly-squat)
+1825) plenish (+ed)
+1826) pleiotropy
+1827) euroland
+1828) eurozone
+1829) Eurotrash
+1830) Eurosceptic
+1831) Eurosceptical
+1832) Europoort
+1833) Europhobe
+1834) Europhile
+1835) Europop
+1836) Eurovision
+1837) Athenaeum
+1838) inunction
+1839) linoleate
+1840) oleate
+1841) OLEDs (plural)
+1842) peaberry (+plural)
+1843) bibelot (+plural)
+1844) grotesques (plural)
+1845) elementals (plural)
+1846) elementalism
+1847) uncombined
+1848) thaumaturge (+ic +ist +y)
+1849) thaumaturgical
+1850) mage (+plural)
+1851) divinatory
+1852) demonolatry
+1853) candomblé
+1854) Umbanda
+1855) macumba
+1856) maculate (+ed +ion)
+1857) gouache (+plural)
+1857) aquarelle (+plural)
+1858) pegmatite (+plural)
+1859) spessartine
+1860) pyrope
+1861) grossular
+1862) almandine
+1863) carnotite
+1864) vanadate
+1865) autunite
+1866) uraninite
+1867) vanadinite
+1868) columbium
+1869) Alentejo (name of region in Portugal)
+1870) Galicia (name of region in Spain)
+1871) Galician
+1872) Callisto (name)
+1873) callop (+plural)
+1874) mulloway
+1875) fingerlings (plural)
+1876) parr
+1877) smolt (+plural)
+1878) amphipod (+plural)
+1879) filmset (+ing +er)
+1880) filmography (+plural)
+1881) filmstrips (plural)
+1882) filopodium
+1883) filopodia (plural of filopodium)
+1884) filopodial (merged into filopodia)
+1885) pseudopodium
+1886) pseudonymity
+1887) pseudonymously
+1888) pseudopods (plural)
+1889) spermatidal
+1890) biorhythmic (merged into biorhythm)
+1891) biosafety
+1892) biosecurity
+1893) bioscientist (merged into bioscience)
+1894) axoneme (+plural +axonemal)
+1895) microtubule (+plural)
+1896) microvascular
+1897) cytoskeleton
+1898) cytoskeletal
+1899) abiotic
+1900) abiogenesis
+1901) abiogenic
+1902) sinters (plural +ed +ing)
+1903) flocculent
+1904) flocculence
+1905) haploidy (merged into haploid)
+1906) autosome (+plural)
+1907) autosomal
+1908) Josh (name)
+1909) cryonic (+s +ally)
+1910) cryopreserved (merged into cryopreserve)
+1911) autotransplant (+s +ion +ed)
+1912) splenic
+1913) bacilliform
+1914) trinomial (+plural)
+1915) superspecies
+1916) downtrend
+1917) downturned (merged into downturn)
+1918) dot-com (+plural +er)
+1919) dot-org
+1920) dot-bomb (+plural)
+1921) bloggers (plural)
+1922) cyberspying
+1923) cybersphere
+1924) cyberslacker (+plural)
+1925) cyberslacking
+1926) bloatware
+1927) gigapixel (+plural)
+1928) bookmarklet
+1929) clickjacking
+1930) clickstream (+plural)
+1931) client-server
+1932) clientele
+1933) upscale (+s +ed +ing)
+1934) downrate (+ed)
+1935) downmarket
+1936) downlight (+s +er +ing)
+1937) ludic
+1938) schoolteaching
+1939) Madison (added the 's)
+1940) schoolmasterly (merged into schoolmaster)
+1941) schoolmastering (merged into schoolmaster)
+1942) bookselling
+1943) bookplate (+plural)
+1944) floorman
+1945) floormen
+1946) floorpan
+1947) underbody (+plural)
+1948) underboss (Oxford: informal)
+1949) underbridge (+plural)
+1950) overbridge (+plural)
+1951) overbreed (+plural)
+1952) overbred (past and past participle of the previous word)
+1953) overboot (+plural)
+1954) overboldly (merged into overbold)
+1955) overboldness (merged into overbold)
+1956) oversail (+plural +ing)
+1957) euro (+plural)
+1958) freewheel (+ed +ing)
+1959) entresol
+1960) pointe
+1961) entropically
+1962) entrustment (merged into entrust)
+1963) entropion
+1964) trichiasis
+1965) luxate (+ed +ing +ion)
+1966) dysplasia
+1967) dysplastic
+1968) adenoma (+plural)
+1969) adenomata (another plural form of the previous word)
+1970) herpetofauna (+al)
+1971) bifid
+1972) ampulla
+1973) ampullae (plural of the previous word)
+1974) autograft (+plural)
+1975) conjunctival (merged into conjunctiva)
+1976) autographic (merged into autograph)
+1977) autography (merged into autograph)
+1978) autoharp
+1979) autohypnosis
+1980) autointoxication
+1981) flameout (+plural)
+1982) flameproof
+1983) flamethrower
+1984) investigable
+1985) investable (merged into invest)
+1986) investible (merged into invest)
+1987) canonicals (added plural)
+1988) replaced salt-water with saltwater (fix)
+1989) saltwort
+1990) comfrey (+plural)
+1991) canoness (+plural)
+1992) archiepiscopacy (+plural)
+1993) archiepiscopate
+1994) Eurocommunism
+1995) Eurocommunist
+1996) Gramsci (+'s - name)
+1997) eurocreep (Oxford: informal)
+1998) Eurodollar (+plural)
+1999) Eurocrat (+plural)
+2000) Eurobond (+plural)
+2001) Euro-MP (+plural)
+2002) coalhouse
+2003) coalfish (+plural)
+2004) arenosol (+plural)
+2005) arenavirus (+plural)
+2006) adenovirus (+plural)
+2007) adenoviral
+2008) corynebacterium
+2009) corynebacteria (plural of previous word)
+2010) coryphée (+plural)
+2011) ballboy (+plural)
+2012) dogshore (+plural)
+2013) autofocusing (merged into autofocus)
+2014) autofill
+2015) autoecology
+2016) rallycross
+2017) milord (+'s - word of the day in Oxford Dictionary)
+2018) milometer
+2019) mileometer (another word for the previous word)
+2020) close-ratio
+2021) jink (+ed +s +ing)
+2022) ju-jutsu (another way of writing it)
+2023) kung fu
+2024) unvalidated
+2025) unvaccinated
+2026) aeromodelling
+2027) aeromodeller
+2028) angiogenesis
+2029) dermatome (+plural)
+2030) tragus
+2031) tragi (plural of previous word)
+2032) friarbird (+plural)
+2033) raptor (+plural)
+2034) gravlax
+2035) gravadlax (another way of writing the previous word)
+2036) caviar (also caviare)
+2037) cavewoman
+2038) cavewomen
+2039) unfriend (+ed +ing)
+2040) unfollow (+ed +ing)
+2041) underway (also "under way")
+2042) homeowner (+plural)
+2043) teenybopper (+plural)
+2044) teenybop
+2045) teenaged (merged into teenage)
+2046) teensy
+2047) teensier + teensiest (merged into teensy)
+2048) overpack (+s +ed)
+2049) overnighted + overnights + overnighter (merged into overnight)
+2050) overmuch
+2051) overmighty
+2052) overman (+s +ed +ing)
+2053) overlordship
+2054) overlooker (+plural)
+2055) overlong
+2056) overlock (+ed)
+2057) overlocker (+plural)
+2058) mudstone
+2059) afferents (added plural)
+2060) cholinergic
+2061) fairwater
+2062) dockage
+2063) fah (Oxford: also fa)
+2064) soybean (+plural)
+2065) satanize + satanise (both possible - +s +ed)
+2066) shitted (merged into shit)
+2067) shat (Oxford: past participle shitted or shit or shat)
+2068) autocephalous
+2069) coachwood (+plural)
+2070) coachwhip
+2071) bird-like
+2072) bipedality
+2073) EuroMillions
+2074) biphasic
+2075) blackbuck (+plural)
+2076) brushtail
+2077) brushback (+plural)
+2078) brush-turkey (+plural)
+2079) Seychellois (place)
+2080) Byelorussia (place - also Belorussia)
+2081) bellyboard (+s +er +ing)
+2082) bellyflop (+s +ed +ing)
+2083) bellyband
+2084) breasthook (+plural)
+2085) breastfeeds (plural)
+2086) breastpin (+plural)
+2087) breaststroker (+plural)
+2088) breastsummer
+2089) biotecture
+2090) bioterrorism
+2091) bioterrorist
+2092) biotherapy (+plural)
+2093) agriproducts (plural)
+2094) agriscience (+ist)
+2095) agritourism
+2096) destock (+ing)
+2097) telecom (+plural - both in lower case)
+2098) telecomputer (+plural)
+2099) telecomputing
+2100) debacle (+plural)
+2101) deattribute (+ed)
+2102) deattribution
+2103) conservatoires (added plural)
+2104) deathtrap
+2105) death-or-glory
+2106) death-dealing
+2107) death-obsessed
+2108) cupholder
+2109) box-shifter (+plural)
+2110) boxboard
+2111) anti-tank
+2112) bumboat (+plural)
+2113) bumfluff
+2114) Antichrists (added plural)
+2115) animatronic (+plural)
+2116) anime (Japanese cartoons)
+2117) manga (Japanese cartoons)
+2118) manfulness
+2119) quadragenarian
+2120) quadplex
+2121) Eid (Muslim festival)
+2122) Azania (name of place)
+2123) Azanian
+2124) azeotrope (+s +ic)
+2125) fusel oil (+plural)
+2126) monocoque
+2127) polyclonal
+2128) analyte (+plural)
+2129) circumcircle (+plural)
+2130) incircle
+2131) incipit (+plural)
+2132) universalist (+plural)
+2133) Quaker (+plural)
+2134) Quakerish
+2135) Quakerism
+
+
+V2.13 - 1-JUN-2014
+------------------
+2136) iPod (+plural)
+2137) hoody (+plural)
+2138) hoodie (+plural) (another form of the previous word)
+2139) operant (+plural)
+2140) operantly (merged into operant)
+2141) pneumonectomy (+plural)
+2142) pneumonic
+2143) bronchopneumonia
+2144) pneumonoultramicroscopicsilicovolcanoconiosis
+2145) pruritus + pruritic
+2146) bulla
+2147) bullae (plural of previous word)
+2148) sacs (added plural)
+2149) sac-like
+2150) aneurysmal (merged into aneurysm)
+2151) subarachnoid
+2152) subantarctic
+2153) subagency (+plural)
+2154) subagent (+plural)
+2155) subadult (+plural)
+2156) never-changing
+2157) never-dying
+2158) never-failing
+2159) candlenut (+plural)
+2160) Portlaoise (name)
+2161) Portlaoighise (another form for the previous word)
+2162) galangal
+2163) lemongrass
+2164) lemonwood
+2165) candleberry (+plural)
+2166) subacid
+2167) greenbottle (+plural - Oxford: A metallic green fly)
+2168) canola
+2169) Bayer (name of company)
+2170) UFO's (added the 's)
+2171) Schratt (name)
+2172) cyberbullying (merged into cyberbully)
+2173) cyberbullies (plural - merged into cyberbully)
+2174) cybercast (+s +ing)
+2175) cyberchondriac (+plural)
+2176) cyberchondria
+2177) cyberphobics (added plural)
+2178) constitutionalism
+2179) statism
+2180) statist (+plural)
+2181) cardiological
+2182) cardiographer + cardiography (merged into cardiograph)
+2183) bootloader
+2184) bootlick (+ing)
+2185) disenchantingly
+2186) disempower (+s +ing +ed +ment)
+2187) disembarrass (+ed +ing +ment)
+2188) diseconomy (+plural)
+2189) initialling (merged into initial)
+2190) retrievability
+2191) laddish (+ness)
+2192) mis-sell + mis-selling + mis-sold
+2193) misallocate (+s +ed +ing +tion)
+2194) misandry
+2195) misanthropical
+2196) misapprehensive
+2197) imperceptive
+2198) imperator + imperatorial
+2199) bioarchaeology
+2200) bioarchaeological
+2201) bioarchaeologist
+2202) bioactive
+2203) bioactivity
+2204) monolayer (added singular)
+2205) multilinguals (added plural)
+2206) scaleless (merged into scale)
+2207) endothermal
+2208) endotoxin (+plural)
+2209) exotoxin (+plural)
+2210) tiki (+plural)
+2211) removed "informations" since it is a singular word only
+2212) blagueur (rare)
+2213) vestiary (+plural)
+2214) cruciate
+2215) interphase
+2216) metaphase
+2217) radiobiology
+2218) radiobiological + radiobiologically
+2219) radiobiologist (+plural)
+2220) repairability
+2221) multimodal
+2222) multimeter (added plural)
+2223) cryobiology + cryobiologist
+2224) cryobiological
+2225) andropause + andropausal
+2226) terraform (+ing)
+2227) terraformer (+plural)
+2228) airscrew (+plural)
+2229) triplanes (added plural)
+2230) airside
+2231) buff-tip
+2232) dialectology + dialectological + dialectologist
+2233) diatheses (plural of diathesis)
+2234) sterol (+plural)
+2235) sphingolipid (+plural)
+2236) condonation (merged into condone)
+2237) neo-Nazi (+plural)
+2238) neo-Nazism
+2239) neo-Marxist (+plural)
+2240) neo-Marxism
+2241) neo-liberal (+plural)
+2242) neo-liberalism
+2243) communalism
+2244) communalist (+plural +ic)
+2245) neocolonial
+2246) neocolonialist (+plural)
+2247) neoconservative (+plural)
+2248) neoconservatism
+2249) neocortices (plural of neocortex)
+2250) neocortical
+2251) neurologic (merged into neurology)
+2252) neurolinguistic (+plural)
+2253) analphabetic
+2254) aspheric (+ally)
+2255) aspherical
+2256) fluxional
+2257) fluxion (+plural)
+2258) fluxgate
+2259) demagnetizer
+2260) demagnetiser
+2261) chaology (+ist)
+2262) semi-classical
+2263) semi-conservative
+2264) reinstalment
+2265) Gerrit (software)
+2266) occultation (merged into occult)
+2267) occultist (+plural)
+2268) occultness (merged into occult)
+2269) contactless
+2270) contact-breaker
+2271) gnomon (+plural)
+2272) (merged gnomonic into gnomon)
+2273) Arminian (+plural)
+2274) Arminianism
+2275) popery
+2276) Popemobile
+2277) jokester
+2278) jokesmith (+plural)
+2279) biggies (added plural)
+2280) Bigfoot
+2281) Bigfeet (plural of previous word)
+2282) bigeneric
+2283) falcate
+2284) emerald-cut
+2285) dustheap
+2286) dustcoat (+plural)
+2287) dustcarts (added plural)
+2288) barney (+plural)
+2289) bunfight (+plural)
+2290) backstabbings (added plural)
+2291) Milroy (name)
+2292) bungarotoxin
+2293) neurotoxin (+plural)
+2294) neurotoxic
+2295) neurotoxicity
+2296) neurotoxicology
+2297) neurotrophic
+2298) neurotypical
+2299) user-definable
+2300) user-generated
+2301) unlikeable (merged into likeable)
+2302) unliberated
+2303) unlet (merged into let)
+2304) unlearnedly
+2305) unlay (+ing)
+2306) unlaid (past and past participle of previous word)
+2307) sensorimotor
+2308) sensorineural
+2309) sensorily (merged into sensory)
+2310) subclavian
+2311) semi-retired
+2312) semi-opera (+plural)
+2313) semi-modal
+2314) semi-liquid (+plural)
+2315) semi-invalid
+2316) semi-lethal
+2317) semi-fluid
+2318) semi-finalist (+plural)
+2319) semi-double
+2320) semi-documentary (+plural)
+2321) clock-watch (+ing +er)
+2322) clockmakers (added plural)
+2323) clockmaking
+2324) chronographic (merged into chronograph)
+2325) chronobiology
+2326) chronobiologist (+plural)
+2327) viewports (added plural)
+2328) viewscreen
+2329) hi-fi (+plural - fix: made it lowercase like in Oxford)
+2330) hi-res (Oxford: informal)
+2331) high-res (Oxford: informal - another form of the previous word)
+2332) biopharma (+plural)
+2333) unmunch (+s +ed +ing)
+2334) focaccia
+2335) Mailänder (name)
+2336) backwards-compatible
+2337) backward-compatible
+2338) bottom-dwelling
+2339) bottom-dweller (+plural)
+
+
+V2.14 - 1-JUL-2014
+------------------
+2340) hard-code (+ed)
+2341) autocorrecting (merged into autocorrect)
+2342) autarchy (+ic +plural +al)
+2343) autarky (same as the previous word - +plural +ic)
+2344) marcasite
+2345) microcrystalline
+2346) microcredit
+2347) irredeemability
+2348) irrecusable
+2349) bullseyes (added plural)
+2350) bullshot
+2351) inter-agency
+2352) inter-allied
+2353) inter-class
+2354) interactant
+2355) interactionism
+2356) interactionist
+2357) interarticular
+2358) interatomic
+2359) interbed (+ed)
+2360) mudstones (added plural)
+2361) shakuhachi (+plural)
+2362) flat-top (+plural)
+2363) flatbed
+2364) formational (merged into formation)
+2365) endpaper (added singular)
+2366) electrotyper (added singular)
+2367) electrotherapeutic
+2368) electrotherapeutical
+2369) electrosurgery
+2370) electrosurgical
+2371) electrotechnology
+2372) electrotechnic (+s)
+2373) electrotechnical
+2374) electrothermal
+2375) toolkit
+2376) drop-dead
+2377) englacial
+2378) enginery
+2379) gearhead (+plural)
+2380) notchy (+ier +est)
+2381) telemark (+ing)
+2382) triclinic
+2383) tricot
+2384) catteries (added plural)
+2385) diphtherial (merged into diphtheria)
+2386) diphtheritic
+2387) porphyria
+2388) neuropathies (added plural)
+2389) neuropath (+plural) (+ merged ic into it)
+2390) acetylcholine
+2391) Alzheimer (+ 's)
+2392) alyssum (+plural)
+2393) Solaris (OS)
+2394) Arial (font)
+2395) Verisign (+'s - company name)
+2396) DNS
+2397) Symantec (+'s - company name)
+2398) courseware
+2399) coursebook (+plural)
+2400) blipvert (+plural)
+2401) offshores + offshored (merged into offshore)
+2402) eBay (+er)
+2403) shovelboard
+2404) shovelhead (shark)
+2405) bonnethead (shark)
+2406) blackfish (+plural)
+2407) blackfly (+plural)
+2408) astroturfing
+2409) astrophotography
+2410) astrophotographer (+plural)
+2411) astrophotographic
+2412) breakbeat (+plural)
+2413) breakdance (+ing +er +ed)
+2414) PCI
+2415) HDDs (added plural)
+2416) headquarter (added singular + ed)
+2417) OEMs (added plural)
+2418) Gb
+2419) NAS
+2420) drive's (added the 's)
+2421) MMX
+2422) cacheing (it can also be written caching)
+2423) cacheable (merged into cache)
+2424) cacheless (merged into cache)
+2425) uncached
+2426) rebrand (+ing)
+2427) webcast (+plural +ing +er)
+2428) videoconferences (added plural)
+2429) videogram (+plural)
+2430) headnotes (added plural)
+2431) accretive
+2432) amassment (+plural)
+2433) bodger (+plural - Oxford: British informal)
+2434) 'gainst (Oxford: short for against)
+2435) unsex (+ed +s)
+2436) epicene
+2437) stepdad (+plural - Oxford: informal)
+2438) stepfamily (+plural)
+2439) stepmum (+plural - Oxford: informal)
+2440) Stepford (name)
+2441) robotically
+2442) robotisation
+2443) sh*tless (merged into sh*t - Oxford: vulgar slang)
+2444) sh*thouse (Oxford: vulgar slang)
+2445) sh*thead (Oxford: vulgar slang)
+2446) sh*tface (Oxford: vulgar slang)
+2447) shi*hole (Oxford: vulgar slang)
+2448) trafficless (merged into traffic)
+2449) downslope (+plural)
+2450) eyeballed + eyeballing (merged into eyeball)
+2451) brachycephalic
+2452) brachycephaly
+2453) registrant (+plural)
+2454) registrarship
+2455) rheumatology (+ist)
+2456) rheumatological
+2457) francophones (added plural)
+2458) simple-mindedness (merged into simple-minded)
+2459) uncompounded
+2460) uncompanionable
+2461) uncommunicated
+2462) undeciphered
+2463) undecided (+s +ly - merged into a new word)
+2464) shilly-shally (+s +ing +ed +ier)
+2465) shilly-shallyer (previous word can also have this form)
+2466) precoital (+ally)
+2467) precolonial
+2468) preconcert (+ed)
+2469) preconsciousness (merged into preconscious)
+2470) precycling
+2471) showbizzy (merged into showbiz)
+2472) showband (+plural)
+2473) bandmate
+2474) bandleader (+plural)
+2475) banditti (another plural of bandit)
+2476) arse (+ed - Oxford: vulgar slang)
+2477) interceders (added plural)
+2478) interdental
+2479) intercut (+s +ing)
+2480) intercultural
+2481) interculturalism
+2482) intercross (+plural +ing)
+2483) intercostals (added plural)
+2484) intercool (+ed +er)
+2485) intercontinentally
+2486) intercommunity
+2487) intercommunion
+2488) anthropomorphize
+2489) anthropomorphise (another form of the previous word)
+2490) antinomians (added plural)
+2491) antinomianism
+2492) catechetics
+2493) catechesis
+2494) catchily + catchiness (merged into catchy)
+2495) Chiu's (name - added the 's)
+2496) examinee (added singular)
+2497) backflip (+plural)
+2498) backflow
+2499) ATX
+2500) reaccept (+ed)
+2501) reacceptance
+2502) reabsorption
+2503) re-sort (+ing)
+2504) compostable (merged into compost)
+2505) composter (merged into compost)
+2506) budstick (+plural)
+2507) budwood
+2508) budworm (+plural)
+2509) earworm (+plural)
+2510) silviculture (+al +ist)
+2511) agro-industry (+plural +al)
+2512) foodgrain (+plural)
+2513) agronomical
+2514) agronomically
+2515) agrobiology
+2516) agrobiological
+2517) agrobiologist
+2518) agroecosystem (+plural)
+2519) algicide (+plural)
+2520) aeroponic (+s)
+2521) aeroponically
+2522) aerophone (+plural)
+2523) gyroplane (+plural)
+2524) fixed-wing
+2525) crowdsource (+ed +ing)
+2526) crowdfunding
+2527) crowdfunded
+2528) creatives (added plural)
+2529) Johnson's (added the 's)
+2530) astrobiology
+2531) astrobiological
+2532) astrobiologist (+plural)
+2533) archipelagoes (Oxford: another way of archipelagos)
+2534) circumnavigator
+2535) subalpine
+2536) treeline
+2537) boreal + Boreal
+2538) geotechnic (+s)
+2539) geotechnical
+2540) geothermally (merged into geothermal)
+2541) cataclysmically
+2542) Phoenician (+plural)
+2543) Phoenicia
+2544) bc ("Before Christ" in dates, can also be written in lower case)
+2545) cross-post (+ing)
+2546) cross-point
+2547) rebreathe (+ed)
+2548) rebreather (+plural)
+2549) rebuildable (merged into rebuild)
+2550) rebuilder (+plural)
+2551) pumpkinseed (+plural)
+2552) amberjack
+2553) boxfish (+plural)
+2554) trunkfish (+plural)
+2555) brickyards (added plural)
+2556) bricolage (+plural)
+2557) genomics (added plural, suggested by the IRC nick on Mozilla wsmwk)
+2558) proteomic (+plural)
+2559) biomarker (+plural)
+2560) microarray (+plural)
+2561) proteome (+plural)
+2562) bioinformatic (+plural)
+2563) biographee (+plural)
+2564) Lepidoptera + lepidoptera
+2565) lepidopteran (+plural)
+2566) lepidopterous
+2567) decor (+plural)
+2568) cliche (+plural)
+2569) texted + texting + texter + textless (merged into text)
+2570) merged self-consciousness into self-conscious
+2571) check-ins (added plural)
+2572) pissy (Oxford: vulgar slang)
+2573) low-cut
+2574) firefighter (+plural)
+2575) firefight (+plural)
+2576) firefighting (merged into firefight)
+2577) firefish (+plural)
+2578) fireguard
+2579) firelit
+2580) firelock (+plural)
+2581) blowouts (added plural)
+2582) blowlamp
+2583) blown-up
+2584) blowing-up
+2585) blowhole (+plural)
+2586) blowfishes (added plural - Oxford: it can also be blowfish)
+2587) blowback
+2588) karateka (+plural)
+2589) judoka (+plural)
+2590) sensei (karate teacher)
+2591) break-fall
+2592) break-off
+2593) karate-chop
+2594) off-message
+2595) off-patent
+2596) off-pitch
+2597) off-plan
+2598) 4x4 (+plural - vehicles)
+2599) protestor (+plural - Oxford: another way for protester)
+2600) Proteus (a God + satellite)
+2601) penistone
+2602) telepaths (added plural)
+2603) teleost (+plural)
+2604) paddlefish (+plural)
+2605) garfish (+plural)
+2606) bowfin (+plural)
+2607) infraclass (+plural)
+2608) ruche (+plural +ed +ing)
+2609) dolman (+plural)
+2610) batwing
+2611) storylines (added plural)
+2612) hairband (+plural)
+2613) batwoman
+2614) batwomen
+2615) megalopolitan (+plural)
+2616) megalosaurus (+plural)
+2617) iguanodon (+plural)
+2618) carnosaur (+plural)
+2619) infraorder (+plural)
+2620) decapod (+plural)
+2621) allée (+plural)
+2622) averment (+plural)
+2623) gratifier (merged into gratify)
+2624) assuagement (merged into assuage)
+2625) sangfroid
+2626) unflashy (merged into flashy)
+2627) ugly-looking
+2628) ill-smelling
+2629) ill-shaped
+2630) ill-prepared
+2631) ill-proportioned
+2632) masturbator
+2633) mastoiditis
+2634) otitis
+2635) otoscope
+2636) otoscopic
+2637) otoscopically
+2638) uncultivable
+2639) uncured
+2640) uncurtained
+2641) uncustomary
+2642) undead
+2643) undebatable
+2644) undecidable
+2645) undecidability
+2646) facades (added plural)
+2647) wodge (+plural)
+2648) gloop (+y)
+2649) herby (+ier +iest)
+2650) bakeware
+2651) swigger (+plural)
+2652) citrusy
+2653) citrussy (another way of the previous word - merged into citrus)
+2654) swifty (+plural)
+2655) swiftie (another way of previous word)
+2656) enchantedly
+2657) enchainment (merged into enchain)
+
+
+V2.15 - 1-AUG-2014
+------------------
+2658) Cordova (name)
+2659) upsize (+ing)
+2660) downshift (+s +ing)
+2661) righto (Oxford: informal)
+2662) righty-ho (Oxford: another way of the previous word)
+2663) burbot (+plural)
+2664) non-black
+2665) non-biodegradable
+2666) non-biological
+2667) non-capital
+2668) non-chemical
+2669) non-Christian
+2670) non-Catholic
+2671) portrayers (added plural)
+2672) filmdom (+'s)
+2673) portrayable (merged into portray)
+2674) autochrome
+2675) over-simplistic
+2676) over-sentimental
+2677) nonsensicality
+2678) Nonya
+2679) noob (+plural Oxford: informal)
+2680) cancelbot (+plural)
+2681) backloaded (merged into backload)
+2682) backlist (+plural)
+2683) gilet (+plural)
+2684) blaxploitation
+2685) bardolatry
+2686) bardolater (+plural)
+2687) bardolator (+plural Oxford: another way of the previous word)
+2688) florilegium (+plural)
+2689) florilegia (another plural of the previous word)
+2690) floriferous
+2691) aide-memoire
+2692) aides-memoire + aides-memoires (both plural of previous word)
+2693) breveted + breveting (merged into brevet)
+ (Oxford says: brevets, breveting or brevetting, breveted or brevetted)
+2694) compendiously + compendiousness (merged into compendious)
+2695) addictively
+2696) audiobook (+plural)
+2697) audiogram (+plural)
+2698) LP (+plural)
+2699) boomy + boomier + boomiest + boominess
+2700) boomers (added plural)
+2701) bicolour (+ed)
+2702) bicultural
+2703) biculturalism
+2704) areolate
+2705) papule (+plural)
+2706) papulae (another plural form of previous word)
+2707) papular
+2708) papulose
+2709) papulous
+2710) cholerically
+2711) counterproductive
+2712) counterproliferation
+2713) counterpunch (+s +ed +ing)
+2714) counterpuncher (+plural)
+2715) counterrotate (+ing +ion)
+2716) countershading
+2717) countershaded
+2718) counterstatement (+plural)
+2719) countersubject
+2720) counterterrorists (added plural)
+2721) runaround
+2722) juvenility
+2723) juvenescence
+2724) juvenescent
+2725) ovotestis
+2726) ovotestes (plural of previous word)
+2727) ovoviviparous
+2728) ovoviviparity
+2729) coroneted (fix: coronetted and merged into coronet)
+2730) bagwash
+2731) bagworm (+plural)
+2732) porkling
+2733) cowhand
+2734) Mb
+2735) SecurDisc
+2736) securable + securement + secureness (merged into secure)
+2737) unthreatening
+2738) unthreatened
+2739) unthinkingness (merged into unthinking)
+2740) unthinkability
+2741) unthought
+2742) unthread (+ed +ing)
+2743) unthrifty + unthriftiness + unthriftily
+2744) unthrone (+s +ed)
+2745) Melbourne's (added the 's)
+2746) DPhil (another way for PhD)
+2747) nobble (+ing +ed)
+2748) nobbler (+plural)
+2749) bribable (merged into bribe)
+2750) sawlog (+plural)
+2751) peelers (added plural)
+2752) bloodwort
+2753) bloodwood (+plural)
+2754) coastland (+plural)
+2755) coasteering
+2756) tuberculoid
+2757) Hansen's (added the 's)
+2758) lepromatous
+2759) leprosarium (+plural)
+2760) chemo (Oxford: informal)
+2761) chemoattractant (+plural)
+2762) granuloma (+plural)
+2763) granulomata (another plural of previous word)
+2764) granulomatous
+2765) lurgy (+plural)
+2766) bizarrerie (+plural)
+2767) protogynous
+2768) protogyny
+2769) prolificacy
+2770) geitonogamy
+2771) geitonogamous
+2772) xenogamy
+2773) xenogamous
+2774) autogamy
+2775) autogamous
+2776) agamospermy
+2777) agamospermous
+2778) unfertilized (ize)
+2779) unfertilised (ise)
+2780) enucleate (+ed +ion)
+2781) protoplast (+plural)
+2782) protoplanet
+2783) protostar (+plural)
+2784) circumlunar
+2785) gibbosity
+2786) Rushdie (name)
+2787) Levinson (name)
+2788) Patton (name)
+2789) Naber (name)
+2790) Moore’s (added the 's)
+2791) narrational
+2792) sidecar (+plural)
+2793) indiscrete
+2794) tonner
+2795) doddle
+2796) incidently
+2797) imagesetter (+plural)
+2798) imager (+plural)
+2799) image-maker (+plural)
+2800) dealmakers (added plural)
+2801) dealign (+ed +ing +ment)
+2802) dealfish (+plural)
+2803) deal-breaker
+2804) cardholder (added singular)
+2805) B-movie (+plural)
+2806) B-film (+plural)
+2807) b'day (Oxford: informal - another short word for birthday)
+2808) visuomotor
+2809) visuospatial
+2810) deistical
+2811) carbon-14
+2812) carbo-load (+ing)
+2813) spiderweb (+s +ed +ing)
+2814) Kasparov (name)
+2815) Abdullah (name)
+2816) childmind
+2817) childbed
+2818) childminder (added singular + 's)
+2819) childminding
+2820) paraphrasable
+2821) paraphrastic
+2822) deverbal (+plural)
+2823) primordium
+2824) primordia (plural of previous word)
+2825) autoradiograph (+s +ed +ic +y)
+2826) acentric
+2827) dicentric
+2828) biotech (Oxford: short for biotechnology)
+2829) morphologic + morphologist (merged into morphology)
+2830) morphogenetic
+2831) morphogenic
+2832) morpholine
+2833) basicity
+2834) chromous
+2835) chromospheric (merged into chromosphere)
+2836) plage (+plural)
+2837) plagiaristic
+2838) morphometry (+ic)
+2839) morphometrically
+2840) morphometrics
+2841) neuroimaging
+2842) neurohormone (+plural)
+2843) vasopressin
+2844) procoagulant (+plural)
+2845) glycoprotein (+plural)
+2846) ecdysone
+2847) synchronic
+2848) synchronically
+2849) Darwin's (added the 's)
+2850) evolutional (+ly)
+2851) evolutive
+2852) complementarily (merged into complementary)
+2853) semiosis
+2854) personhood
+2855) acrolect (+plural +al)
+2856) syntagmatic (+s)
+2857) syntagmatically
+2858) syntagm (+plural)
+2859) syntagmas (another plural of syntagm)
+2860) syntagmata (another plural of syntagm)
+2861) cognitivist (+plural)
+2862) cognitivism
+2863) functionalist (+plural)
+2864) electrophysiology (+ist)
+2865) electrophysiological (+ly)
+2866) electroplax
+2867) electroplaque (another way of the previous word)
+2868) electropolish (+ed +ing)
+2869) nitinol
+2870) stent (+plural)
+2871) stenotypes (added plural)
+2872) stenotypist (+plural)
+2873) stenothermal
+2874) Princeton (name)
+2875) steepled (merged into steeple)
+2876) steeplechasers (added plural)
+2877) bookman
+2878) bookmen (plural of previous word)
+2879) booklouse
+2880) booklice (plural of previous word)
+2881) bookland
+2882) bumf
+2883) bumph (another way of previous word)
+2884) bumboy (Oxford: vulgar slang)
+2885) bumbledom
+2886) bumbag (+plural - Oxford: informal)
+2887) bum-sucking (Oxford: vulgar slang)
+2888) bum-sucker (Oxford: vulgar slang)
+2889) bum-bailiff (+plural)
+2890) crookery
+2891) cronyism
+2892) croneyism (another way of previous word)
+2893) depositaries (added plural)
+2894) redeposition
+2895) upwelling
+2896) multistage
+2897) multitalented
+2898) dequeueing (another way of dequeuing)
+2899) defriend
+2900) unsecure
+2901) unsectarian
+2902) unseaworthiness
+2903) utopians (added plural)
+2904) decontrols (added +s)
+2905) decontaminant
+2906) deconstructionism
+2907) deconstructionist (+plural)
+2908) postmodern (fix: removed post-modern)
+2909) postmodify (+s +ing +ed +tion +er)
+2910) postorbital (+plural)
+2911) postmodernism (fix: removed post-modernism)
+2912) postmodernist (fix: removed post-modernist)
+2913) postmodernity
+2914) postdoctoral (fix: removed post-doctoral)
+2915) postcolonial (fix: removed post-colonial)
+2916) fix: removed post-office as actually it is "post office"
+2917) dreck (+y)
+2918) dreckish
+2919) savvy (+er +est +s +ing +ed)
+2920) salaryman
+2921) salarymen (plural of previous word)
+2922) untether (+s +ed +ing)
+2923) reframe (+s +ed)
+2924) GMOs (added plural)
+2925) sext (+ing +er)
+2926) selfie (+plural)
+2927) selfy (another way of the previous word)
+2928) tagger (+plural)
+2929) tagetes
+2930) fulminant
+2931) haemoptysis
+2932) telepathize (IZE - +s +ed +ing)
+2933) cryptocrystalline
+2934) cryptocurrency (+plural)
+2935) cryptogam (+s)
+2936) cryptogamic
+2937) orthoepy (+ic)
+2938) orthoepist
+2939) orthogenesis
+2940) orthogenesist
+2941) orthogenetic
+2942) orthogenetically
+2943) myosin
+2944) actin
+2945) antiparallel
+2946) palaeopathology
+2947) palaeopathological
+2948) palaeopathologist (+plural)
+2949) playsuit
+2950) playscheme (+plural)
+2951) after-school
+2952) aftercare (fix: removed after-care)
+2953) afterdamp
+2954) afterworld
+2955) aftersun
+2956) bergamot
+2957) inswing (+ing +er)
+2958) insurrectionary
+2959) underage (fix: removed under-age)
+2960) underactive
+2961) put-you-up
+2962) cragsman
+2963) cragsmen (plural of previous word)
+2964) wisecracker (+plural)
+2965) campfire (fix: removed camp-fire)
+2966) campsite (fix: removed camp-site)
+2967) Caesar's (added the 's)
+2968) bedload
+2969) wordlists (added plural)
+2970) bedjacket
+2971) bedight
+2972) bedhead (+plural)
+2973) lustrate (+ed +ion)
+2974) lustral
+2975) contemporarily (merged into contemporary)
+2976) Moldovan (+plural)
+2977) Andorran (+plural)
+2978) NW (North-west)
+2979) Azerbaijani (+plural)
+2980) acetaldehyde
+2981) bailor
+2982) bailment
+2983) recognisance (added singular)
+2984) distraint
+2985) disquisitional (merged into disquisition)
+2986) disputatiousness (merged into disputatious)
+2987) preadaptation (+plural)
+2988) preadapt (+ed)
+2989) theropod (+plural)
+2990) cowbird (+plural)
+2991) preachiness
+2992) pre-vocational
+2993) pre-wash
+2994) pre-shrunk
+2995) pre-shrink
+2996) pre-sell
+2997) pre-Roman
+2998) pre-release
+2999) pre-scientific
+3000) pre-service
+3001) pre-tension (+s)
+3002) punctum
+3003) puncta (plural of previous word)
+3004) biomechanics
+3005) biomechanical
+3006) biomechanically
+3007) biomechanist
+3008) phagocytic (merged into phagocyte)
+3009) degranulate (+ion)
+3010) neutrophil (+plural)
+3011) prostaglandin (+plural)
+3012) reticuloendothelial
+3013) mononuclear
+3014) histologic (merged into histology)
+3015) monomorphic
+3016) monomorphism
+3017) monomorphous
+3018) lysozyme
+3019) ferritin
+3020) ferrimagnetic
+3021) ferrimagnetism
+3022) rhizosphere
+3023) translocate (+s +ing +ed +ion)
+3024) transmarine
+3025) transman
+3026) transmen (plural of previous word)
+3027) transmembrane
+3028) transmigrant (+plural)
+3029) Pilates
+3030) Pilate (name)
+3031) pilastered (merged into pilaster)
+3032) dentil (+plural)
+3033) pyrolysed (merged into pyrolyse)
+3034) spellchecks + spellchecked + spellchecking (merged into spellcheck)
+3035) unpowered
+3036) unpractical
+3037) unpracticality
+3038) unpossessed
+3039) unpolitical
+3040) unpolitic
+3041) unpointed
+3042) unpoetic
+3043) unpoetical
+3044) unpoetically
+3045) Prometheus (name)
+3046) unplumbable
+3047) unacademic
+3048) Unabomber (name)
+3049) unabating
+3050) unscalable
+3051) unscaleable (another way of previous word)
+3052) unsay (+s +ing)
+3053) unsatisfyingly
+3054) unsatisfactoriness
+3055) unsanctified
+3056) unsalaried
+3057) biosignature
+3058) downwash
+3059) airstream (+plural)
+3060) landside
+3061) airmobile
+3062) airmanship
+3063) divulgation (+plural)
+3064) divulgence
+3065) Diwali
+3066) Divali (another way of previous word)
+3067) Lakshmi (name)
+3068) Lakshadweep (name)
+3069) long-termism
+3070) long-windedly
+3071) longboard
+3072) longdog
+3073) goldendoodle (+plural)
+3074) labradoodle (+plural)
+3075) cockapoos (added plural)
+3076) colourpoint
+3077) Himalayan
+3078) Birman
+3079) Clermont-Ferrand (name)
+3080) Auvergne (name)
+3081) derivate (+plural)
+3082) butyric (acid)
+3083) Grammy + Grammies + Grammys (annual awards)
+3084) heartbreaker (+plural)
+3085) hyperacidity
+3086) pyrosis
+3087) calcific (merged into calcify)
+3088) myxoma (+plural)
+3089) myxomata (another plural of previous word)
+3090) myxomatous
+3091) bartholinitis
+3092) asthmatically
+3093) autohypnotic
+3094) colectomy (+plural)
+3095) chlamydial (merged into chlamydia)
+3096) bronchospasm
+3097) balanitis
+3098) erythema (+al)
+3099) erythematous
+3100) chancroid (+plural)
+3102) trichomoniasis
+3103) candidiasis
+3104) neutropenia
+3105) neutropenic
+3106) thrombocytopenia
+3107) anticonvulsant (+plural)
+3108) diazepam
+3109) temazepam (fix: removed tamazepam)
+3110) nitrazepam
+3111) nitpicky (merged into nitpick)
+3112) nitid
+3113) Niterói (Oxford: industrial port on Brazil)
+3114) Folkestone (fix: removed Folkstone)
+3115) barbican (+plural)
+3116) Ragusa (name)
+3117) ragworm
+3118) lugworm (+plural)
+3119) gapers (added plural)
+3120) geoduck (+plural)
+3121) geoengineering
+3122) smily (another way of the word smiley) (+er +est)
+3123) smileys (added plural - notice also smilies)
+3124) gallberry (+plural)
+3125) inkberry (+plural)
+3126) inkhorn
+3127) narratological
+3128) narratologist (merged into narratology)
+3129) narrativity
+3130) eucatastrophe
+3131) euchologion
+3132) euchology (another way of the previous word)
+3133) euchromatin
+3134) euchromatic
+3135) telomere (+plural +ic)
+3136) telomerase
+3137) cross-curricular
+3138) cross-cultural
+3139) cross-court
+3140) forehanded (merged info forehand)
+3141) forehock
+3142) tapas
+3143) tundish
+3144) alloxan
+3145) fenugreek
+3146) diphtheroid
+3147) blastomycosis
+3148) granulocyte (+plural)
+3149) ectomorph (+plural)
+3150) ectoparasite (+plural)
+3151) carboxylase
+3152) cat-sit (+er +ers +ing)
+3153) cat-bear
+3154) -> 12) Ph.D. (removed one entry since it was there twice. Thanks, Filiep)
+3155) groupset (+plural)
+3156) beaconfish (+plural)
+3157) characin (+plural)
+3158) killifish (+plural)
+3159) toothcarp
+3160) topminnow (+plural)
+3161) topman
+3162) topmen (plural of previous word)
+3163) toplessness
+3164) Templar (+plural)
+3165) withering
+3166) withers (merged into wither)
+3167) witherite
+3168) analytics (merged into analytic)
+3169) braincase
+3170) sagittal (+ly)
+3171) condyle (+plural)
+3172) tibias (another plural of tibia)
+3173) tibial (merged into tibia)
+3174) medullary (merged into medulla)
+3175) osteotomy (+plural)
+3176) osteospermum (+plural)
+3177) osteosarcoma (+plural)
+3178) osteosarcomata (another plural way of previous word)
+3179) osteoblast (+plural +ic)
+3180) osteoarthritic
+3181) LTR
+3182) uncheck (+s +ing +ed)
+3183) unselect (+s +ing +ed)
+3184) unsentimentally (merged into unsentimental)
+3185) unsensational (+ally)
+3186) unseparated
+3187) unserious
+3188) unserviceability
+3189) unsewn
+3190) Macbeth (name)
+3191) Ethelred's (added the 's)
+3192) Gmail + gmail
+3193) SETI
+3194) doughboy (+plural)
+3195) croquembouche
+3196) choux
+3197) loudmouth (+s - Fixed: loud-mouth)
+3198) loud-mouthed (Oxford, it has a "-")
+3199) loudhailer (+plural)
+3200) biochips (added plural)
+3201) biocircuits (added plural)
+3202) high-security
+3203) infirmarer
+3204) infixed + infixing (merged into infix)
+3205) septics (added plural)
+3206) septically
+3207) septicity
+3208) embolus
+3209) emboli (plural of previous word)
+3210) cavitary
+3211) cavernulous
+3212) vermiculate (+ed)
+3213) vermicular
+3214) vermicide (+plural)
+3215) vermicomposting
+3216) vermicomposter
+3217) esparto (+plural)
+3218) espial
+3119) leftish
+3120) malcontents (added plural)
+3121) Malbec
+3122) Labrusca
+3123) labradorite
+3124) plagioclase
+3125) aluminosilicate (+plural)
+3126) muscovite (added lower case too)
+3127) euhedral
+3128) biotite
+3129) titanite
+3130) monazite
+3131) xenotime
+3132) chlorite (+ic)
+3133) slaty (merged into slate)
+3134) epidote
+3135) chalcopyrite
+3136) tetrahedrite
+3137) electrum
+3138) pyrargyrite
+3139) pyrrhotite
+3140) goethite
+3141) kaolinite
+3142) wurtzite
+3143) ferberite
+3144) tungstate
+3145) tunesmith (+plural Oxford: informal)
+3146) tunelessness (merged into tuneless)
+3147) tuneage (Oxford: informal)
+3148) Zhangjiakou (name of city in China)
+3149) Kevin's (added the 's)
+3150) non-compete
+3151) non-communist
+3152) barracouta (+plural)
+3153) clownfish (+plural)
+3154) damselfish (+plural)
+3155) ghee
+3156) Ghaznavid (+plural)
+3157) Edwy (+'s - name)
+3158) Antiochus (name)
+3159) antinovel (+plural)
+3160) disrelish
+3161) louche (+ness)
+3162) motorsailer
+3163) motormouth (+ed)
+3164) incentivize (+ed)
+3165) incentivise (+ed - ize/ise)
+3166) immunosuppressive (+plural)
+3167) IMO (Oxford: informal: In My Opinion)
+3168) blogosphere
+3169) bloggy (+ier +est)
+3170) blogroll
+3171) liposome (+plural)
+3172) liposculpture
+3173) lipoprotein (+plural)
+3174) lipopolysaccharide (+plural)
+3175) aldosterone
+3176) folate
+3177) Cenozoic
+3178) Cainozoic (another way of previous word)
+3179) terebratulid (+plural)
+3180) pedicle (+plural)
+3181) pedicel (+plural)
+3182) pedicellate
+3183) intervertebral
+3184) congruencies (added plural to congruency)
+3185) quadrics (added plural)
+3186) bilocation
+3187) OBE (+plural)
+3188) psoriatic
+3189) whoever's (added the 's)
+3190) multicellularity
+3191) organismal (merged into organism)
+3192) ODF
+3193) copyleft (+ed)
+3194) copyhold
+3195) copyholder (+plural)
+3196) copy-edit (+s +ed +ing)
+3197) preamplifier (+plural - Fix: removed pre-amplifier)
+3198) preamplify (+s +ing +ed)
+3199) EQ
+3200) epyllion
+3201) epyllia (plural of previous word)
+3202) unexcitable
+3203) unexcitability
+3204) unexaggerated
+3205) uneventfulness (merged into uneventful)
+3206) unevangelical
+3207) equanimous
+3208) Redditch (name of city)
+3209) brutalism
+3210) brutalist
+3211) DDR
+3212) backsight (+plural)
+3213) kickflip (+plural)
+3214) heelflip (+plural)
+3215) frontside
+3216) bodysurf (+er +ers +ing)
+3217) bodyworker (+plural - merged into bodywork)
+3218) thicknesses (added plural)
+3219) thickheaded (fix: removed thick-headed) (added +ness)
+3220) curation (merged into curate)
+3221) cinephile (+plural)
+3222) cinephilia
+3223) cinematograph (+plural)
+3224) cinematheque (+plural)
+3225) Rohmer (name)
+3226) summarization (-ize)
+3227) summarisation (-ise)
+3228) CVs (added plural)
+3229) catechetical
+3230) Christianity's (added the 's)
+3231) catechetically
+3232) anticlericalism
+3233) warfarin
+3234) taipan (+plural)
+3235) workwear
+3236) Adolf (+'s)
+3237) MPLA
+3238) UNITA
+3239) Angolan (+plural +'s)
+3240) Peter's (added upper case as name +'s)
+3241) peterman
+3242) petermen (plural of previous word)
+3243) petersham
+3244) grosgrain
+3245) fieldfare (+plural)
+3246) redwings (added plural)
+3247) Zhu (name)
+3248) Yuanzhang (name)
+3249) minesweeping
+3250) mineshafts (added plural)
+3251) mineworker (added singular)
+3252) Hohenzollern (name)
+3253) hogweed (+plural)
+3254) hognut
+3255) Eminem (+'s - name)
+3256) Elvira's (added 's - name)
+3257) Elsa (+'s - name)
+3258) Elisa (+'s - name)
+3259) Elanor (+'s - name)
+3260) Edison's (added 's - name)
+3261) Egyptian's (added 's - name)
+3262) Edwin's (added 's - name)
+3263) Edwina's (added 's - name)
+3264) Eleanor's (added 's - name)
+3265) Eloise's (added 's - name)
+3266) Eloy (+'s - name)
+3267) Elias's (added 's - name)
+3268) Emilia (+'s - name)
+3269) Ernesto (+'s - name)
+3270) Esmeralda (+'s - name)
+3271) Evangelina (+'s - name)
+3272) FBI's (added 's)
+3273) Fernandez (+'s - name)
+3274) Fernando's (added 's - name)
+3275) Fiona (+'s - name)
+3276) Firefox's (added 's)
+3277) Flintstones (name)
+3278) Florence's (added 's - name)
+3279) Fitzgerald's (added 's - name)
+3280) Fisher (+'s - name)
+3281) Fischer's (added 's - name)
+3282) Francesca's (added 's - name)
+3283) Francis's (added 's - name)
+3284) Francisca (+'s - name)
+3285) Franks (+'s - name)
+3286) Putin (+'s - name)
+3287) Python (+'s - name)
+3288) QWERTY (added upper case and removed lower case)
+3289) AZERTY
+3290) Rachael (+'s - name)
+3291) Ramirez (+'s - name)
+3292) Rambo (+'s - name)
+3293) Coke (+plural + 's - the drink)
+3294) Catholic + Catholic's (already had plural)
+3295) Latinos (added plural - Oxford: Chiefly North American)
+3296) KO + KO's + KO'ing + KO'd
+3297) US (+'s - Country: United States in upper case)
+3298) eclair (+s +'s)
+3299) RTL
+
+
+V2.16 - 1-SEP-2014
+------------------
+3300) Pinto (+'s - my name)
+3301) add-on's (added the 's)
+3302) Sagan (+'s - name)
+3303) Steckling (name)
+3304) Adamski's (added the 's - name)
+3305) Ruppelt (+'s - name)
+3306) Keyhoe (name)
+3307) exoplanet (+plural)
+3308) extrapyramidal
+3309) antipsychotic (+plural)
+3310) neuroleptic (+plural)
+3311) benzodiazepine (+plural)
+3312) benzocaine
+3313) colposcope (+y)
+3314) cytologically
+3315) interspecific (+ally)
+3316) bronchogenic
+3317) amuck (other way of amock)
+3318) amoebiasis
+3319) superconscious (+ness +ly)
+3320) unitive
+3321) weakliness
+3322) softie (added singular)
+3323) softphone
+3324) softshell (+plural)
+3325) circumvallation (+plural)
+3326) castellation (+plural)
+3327) stats (Oxford: short for statistics)
+3328) statoscope
+3329) altimetry (+ic)
+3330) innovational (merged into innovation)
+3331) neoteric (+plural)
+3332) Catullus (name)
+3333) Vincenzo (name)
+3334) Bellinis (added plural - Oxford: name + cocktail)
+3335) catchfly (+plural)
+3336) earthfall (+plural)
+3337) foreshock (+plural)
+3338) microseism (+plural +ic)
+3339) microsite (+plural)
+3340) biocompatible
+3341) biocompatibility
+3342) biocomputers (added plural)
+3343) scopolamine
+3344) hyoscyamine
+3345) sexualize (+ion +ed -IZE)
+3346) sexualise (+ion +ed -ISE)
+3347) pansexual (+plural)
+3348) pansexuality
+3349) panspermia
+3350) Cretans (added plural - Kevin Atkinson wordlist 60)
+3351) Byzantines (added plural)
+3352) Micmac (+plural - Kevin Atkinson wordlist 60)
+3353) aberrational (merged into aberration - Kevin Atkinson wordlist 60)
+3354) anywise (Kevin Atkinson wordlist 60)
+3355) armloads (added plural - Kevin Atkinson wordlist 60)
+3356) backchat (Oxford: informal - Kevin Atkinson wordlist 60)
+3357) zappy (+ier +iest Oxford: informal - Kevin Atkinson wordlist 60)
+3358) Zarathustra
+3359) Zarathustrian (+plural)
+3360) ZAPU
+3361) zeitgeist (+y - added lower case)
+3362) whited (Kevin Atkinson wordlist 60)
+3363) whensoever (Kevin Atkinson wordlist 60)
+3364) whencesoever
+3365) utilizable + utilizer (merged into utilize - Kevin Atkinson wordlist 60)
+3366) 3365 + derivates with -ISE
+3367) untasted (Kevin Atkinson wordlist 60)
+3368) unrated (Kevin Atkinson wordlist 60)
+3369) thingy (+plural - Kevin Atkinson wordlist 60)
+3370) thingummy (+plural - Oxford: informal)
+3371) taildragger (+plural)
+3372) tailwheel
+3373) unstick (+s +ing)
+3374) unstimulating
+3375) superglue (+s +ing +ed - Kevin Atkinson wordlist 60)
+3376) superglueing (another way of previous word - ing)
+3377) Lucifer's (added the 's)
+3378) Cain's (added the 's)
+3379) supergroups (added plural)
+3380) supercoil (+s +ed +ing)
+3381) osmolarity
+3382) supergene (+plural)
+3383) supergalaxy (+plural)
+3384) supercluster (+plural)
+3385) supercollider (+plural)
+3386) superconduct (+ive)
+3387) antiferromagnetic
+3388) antiglobalization (-IZE)
+3389) antiglobalisation (-ISE)
+3390) counterparty (+plural)
+3391) counterplot (+s +ing +ed)
+3392) swansongs (added plural - Kevin Atkinson wordlist 60)
+3393) syndicalists (added plural - Kevin Atkinson wordlist 60)
+3394) Trotskyism
+3395) Trotskyist (+plural)
+3396) Trotskyite (+plural)
+3397) Stalinism
+3398) Stalinists (added plural)
+3399) recomposition
+3400) 8-bit
+3401) 16-bit
+3402) 24-bit
+3403) 32-bit
+3404) 64-bit
+3405) recommitment (merged into recommit)
+3406) hypermutable
+3407) hypermutation
+3408) microsatellite (+plural)
+3409) microreader (+plural)
+3410) microprint (+ing)
+3411) microform (+plural)
+3412) microfungus
+3413) microfungi (plural of previous word)
+3414) microfossil (added singular)
+3415) microflora
+3416) microfauna
+3417) microevolution
+3418) microevolutionary
+3419) macroevolution
+3420) macroevolutionary
+3421) microenterprise
+3422) microelectromechanical
+3423) microcyte (+plural +ic)
+3424) Arabic (removed duplicate - PTG V3 build 64+)
+3425) Atlantic (removed duplicate - PTG V3 build 64+)
+3426) Lucy (removed duplicate - PTG V3 build 64+)
+3427) ElGamal (cryptography)
+3428) Elgamal (name of who created 3427)
+3429) cryptosystem (+'s +plural)
+3430) DES (+'s - cryptography)
+3431) DSA (cryptography)
+3432) TLS (cryptography)
+3433) Diffie-Hellman (cryptography)
+3434) VPNs (added plural)
+3435) cryptanalysts (added plural)
+3436) cryptanalytical
+3437) AES (cryptography)
+3438) Lagrange's (added 's)
+3439) cryotherapy
+3440) brachytherapy
+3441) prostatectomy (+plural)
+3442) photodynamic
+3443) adjuvant (+plural)
+3444) anorectal
+3445) windproof
+3446) dermabrasion
+3447) sclerotherapy
+3448) dermatoglyphics
+3449) internegative (+plural)
+3450) documentarian (+plural)
+3451) documentarist (+plural)
+3452) documentalist (+plural)
+3453) toxophilite (+plural - Oxford: word of the day)
+3454) pandanus
+3455) pandan (another way of previous word)
+3456) photomontage (+plural)
+3457) photomosaic
+3458) gluons (added plural)
+3459) pions (added plural)
+3460) antiquark (+plural)
+3461) kaon (+plural)
+3462) Easter (removed duplicate - PTG V3 build 64+)
+3463) yogic
+3464) asana (+plural)
+3465) pranayama
+3466) ashtanga
+3467) astanga (another way of previous word)
+3468) e-cigarette (+plural)
+3469) cig (+plural - Oxford: informal for cigar)
+3470) burley
+3471) chromodynamics
+3472) QCD (Oxford: short for quantum chromodynamics)
+3473) backwind (+plural)
+3474) forepart (+plural)
+3475) voluted (merged to volute)
+3476) volupté
+3477) cristobalite
+3478) suaver + suavest (merged into suave)
+3479) suaveness (merged into suave)
+3480) Rimbaud (+'s - name - Kevin Atkinson wordlist 50)
+3481) Ringo (+'s - name - Kevin Atkinson wordlist 50)
+3482) bluethroat (+plural)
+3483) oxpecker (+plural)
+3484) dunnock (+plural)
+3485) credentialism
+3486) camelback
+3487) purslane
+3488) glutathione
+3489) cysteine
+3490) glutamic
+3491) asparagine
+3492) histidine
+3493) proline
+3494) proliferous
+3495) prolly (Oxford: informal of "probably")
+3496) pleonastic
+3497) pleonastically
+3498) antistrophe (+plural)
+3499) stanzaed (merged into stanza)
+3500) stanzaic
+3501) tailpiece (+plural - Kevin Atkinson wordlist 60)
+3502) thumbprints (added plural - Kevin Atkinson wordlist 60)
+3503) underclasses (added plural - Kevin Atkinson wordlist 60)
+3504) Riefenstahl (+'s - name - Kevin Atkinson wordlist 50)
+3505) Ragnarök
+3506) Prozac (+'s - Kevin Atkinson wordlist 50)
+3507) Karloff (+'s - name - Kevin Atkinson wordlist 50)
+3508) Kasparov's (added +'s - name - Kevin Atkinson wordlist 50)
+3509) KKK (+'s - Ku Klux Klan - Kevin Atkinson wordlist 50)
+3510) Islamism (+'s - Kevin Atkinson wordlist 50)
+3511) Islamist (Kevin Atkinson wordlist 50)
+3512) Invar (+'s - Kevin Atkinson wordlist 50)
+3513) Ingrid (+'s - name - Kevin Atkinson wordlist 50)
+3514) highlandman
+3515) highlandmen (plural of previous word)
+3516) Aymara (+plural)
+3517) Ayrshires (added plural - animal breed)
+3518) Aboriginals + aboriginals (added the 's)
+3519) ethnomusicologist (+plural)
+3520) ethnomusicologic
+3521) ethnomusicological
+3522) ethnomusicology
+3523) intranet (fix: + added plural - changed to lower case)
+3524) Parkinson (+'s - name)
+3525) workaholism
+3526) timepass
+3527) watchmaking
+3528) saddlers (added plural)
+3529) saddlery (+plural)
+3530) decompilations (added plural)
+3531) cross-assembler (+plural)
+3532) antitype (+plural)
+3533) demerge (+ed +er)
+3534) Demerol
+3535) sloshy (+ier +iest)
+3536) captivatingly
+3537) captchas (added plural)
+3538) abandonware
+3539) freeware (fix: changed to lower case)
+3540) entrepreneurially (merged into entrepreneurial)
+3541) entrepreneurialism
+3542) gunsight (+plural)
+3543) gunslinger (+plural - Oxford: informal)
+3544) gunslinging (Oxford: informal)
+3545) gunstock (+plural)
+3546) cannoneer (+plural)
+3547) cannonry
+3548) anti-piracy
+3549) anti-racists (added plural)
+3550) blockheaded (merged into blockhead)
+3551) blockish
+3552) supervillain (+plural)
+3553) sysop (+plural - Oxford: informal - A system operator)
+3554) sysadmin (+plural - Oxford: informal - A system administrator)
+3555) CRC
+3556) choccy (+plural - Oxford: informal)
+3557) G7
+3558) G8
+3559) G2B
+3560) drippy (removed duplicate - PTG V3 build 64+)
+3561) OSes (added plural)
+3562) sexennial
+3563) sexcentenary (+plural)
+3564) sexagesimal (+plural +ly)
+3565) unpicks (merged into unpick - Kevin Atkinson wordlist 60)
+3566) viewership (+'s - Kevin Atkinson wordlist 60)
+3567) vitriolically (Kevin Atkinson wordlist 60)
+3568) walkies (merged into walkie - Kevin Atkinson wordlist 60)
+3569) wanker (+plural - Oxford: vulgar slang - Kevin Atkinson wordlist 60)
+3570) weepily + weepiness (merged into weepy)
+3571) weepie (Kevin Atkinson wordlist 60)
+3572) whatshername + whatsername (Kevin Atkinson wordlist 60)
+3573) whatshisname + whatsisname (Kevin Atkinson wordlist 60)
+3574) wheatmeal (Kevin Atkinson wordlist 60)
+3575) wheatish
+3576) wheatgrass
+3577) wheatgerm
+3578) borage
+3579) echinacea
+3580) ginkgos (another plural form of ginkgo)
+3581) cocobolo (+plural)
+3582) hardwoods (added plural)
+3583) tablemate
+3584) penne
+3585) tortelli
+3586) gnocchi
+3587) woodworms (added plural - Kevin Atkinson wordlist 60)
+3588) OpenSSL (cryptography)
+3589) https
+3590) subdomain (+s +'s)
+3591) ChatZilla (+'s)
+3592) Bugzilla (+'s)
+3593) XULRunner (+'s)
+3594) Instantbird
+3595) rheme (+plural)
+3596) gonna (Oxford: informal)
+3597) subcritical
+3598) subcostal
+3599) amygdaloid
+3600) ventromedial (+ly)
+3601) trigeminal
+3602) endothelium
+3603) undersurface
+3604) mesoderm (+al)
+3605) mesogastrium
+3606) mesogastria (plural of previous word)
+3607) epigastrium
+3608) epigastria (plural of previous word)
+3609) hypogastrium
+3610) hypogastria (plural of previous word)
+3611) epifluorescence
+3612) epifauna (+al)
+3613) botanicals (added plural)
+3614) funguses (Oxford: another plural of fungus)
+3615) pelecypod (+plural)
+3616) lamellibranch
+3617) lamellibranchs (plural of previous word)
+3618) wholefood (+plural - Kevin Atkinson wordlist 60)
+3619) weekenders (added plural - Kevin Atkinson wordlist 60)
+3620) wog (+plural - Oxford: offensive - Kevin Atkinson wordlist 60)
+3621) woggle (+plural)
+3622) neckwear
+3623) necrobiosis
+3624) necrobiotic
+3625) Gregorio (+'s - name - Kevin Atkinson wordlist 50)
+3626) Guantánamo (+'s - added accent - name - Kevin Atkinson wordlist 50)
+3627) Hammarskjöld (+'s - added accent - name - Kevin Atkinson wordlist 50)
+3628) Hayworth (+'s - name - Kevin Atkinson wordlist 50)
+3629) Margolin (+'s - name)
+3630) l10n
+3631) i18n
+3632) glocalization (-ize)
+3633) glocalisation (-ise)
+3634) localizable (-ize)
+3635) localisable (-ise)
+3636) logogram (+plural)
+3637) foreseeably (merged into foreseeable)
+3638) destructors (added plural)
+3639) prepend + prepends + prepending + prepended
+3640) tuple (+plural)
+3641) ISO's + ISOs (added +'s +s)
+3642) metrology (+ist)
+3643) metrological
+3644) somatosensory
+3645) paraphilia (+plural)
+3646) paraphiliac (+plural)
+3647) asexuals (added plural)
+3648) subgenre (+plural)
+3649) standout (+plural)
+3650) psychosexual (+ally)
+3651) psychophysiologist (+plural - merged into psychophysiology)
+3652) neuropsychology (+ist +ists)
+3653) neuropsychological
+3654) electrodermal
+3655) CIA's (added the 's)
+3656) cryptomeria (+plural)
+3657) cryptonym (+plural)
+3658) cryptorchid (+plural)
+3659) cryptorchidism
+3660) spermatic
+3661) suprarenal
+3662) midlife (fixed mid-life)
+3663) Harleys (motorcycle)
+3664) Harley-Davidson (+'s)
+3665) flathead (+plural)
+3666) teardrop (+plural +'s - fixed: tear-drop)
+3667) knucklehead (+s +ed - Oxford: informal)
+3668) motorhome (+plural)
+3669) pushrod (+plural)
+3670) Cadillac's (added the 's)
+3671) drivetrain (+plural)
+3672) sportster (+plural)
+3673) crankpin (+plural)
+3674) Porsche (name)
+3675) unsourced
+3676) woody (removed duplicate - PTG V3 build 64+)
+3677) wonderful (removed duplicate - PTG V3 build 64+)
+3678) Branson (+'s - name)
+3679) Bramah (+'s - name)
+3680) Keble (+'s - name)
+3681) scholasticism
+3682) scholarliness
+3683) Confucians (added plural)
+3684) quietism
+3685) shamanic
+3686) shamanist (+plural)
+3687) shamanize (+ed - ize)
+3688) shamanise (+ed - ise)
+3689) archpriest (+plural)
+3690) archosaur (+plural)
+3691) basilosaurus
+3692) deinstall (+s +ing +ed +er +ion +ions)
+3693) deinstal (+s - another way of previous word)
+3694) hot-swap (+ed +ing +able)
+3695) blokeish (+ness)
+3696) cochoa (+plural)
+3697) barbet (+plural)
+3698) tinkerbird (+plural)
+3699) greenbul (+plural)
+3700) hornbill (+plural)
+3701) hornbook (+plural)
+3702) deliration
+3703) Delian (+plural)
+3704) Delos (island)
+3705) paralogy
+3706) paralogous
+3707) paralogism (+plural)
+3708) speciate (+ed +ing +ion)
+3709) centromere (+plural)
+3710) centromeric
+3711) centuple (+ed +ing)
+3712) centrum (+plural)
+3713) centra (another plural way of previous word)
+3714) discoverability
+3715) Chevy's (added the 's)
+3716) thermite
+3717) cutlassfish (+plural)
+3718) Porsche (added 's + plural)
+3719) cetology (+ist +ists)
+3720) orca (+plural)
+3721) Payne (+'s - name)
+3722) Patagonia (name of place)
+3723) Patagonian (+plural)
+3724) non-humans (added plural)
+3725) axonal (merged into axon)
+3726) capsid (+plural)
+3727) dendritic (+ally)
+3728) Palaeolithic (fix: now starts with upper case)
+3729) mutualism (+plural)
+3730) mutualist (+plural +ic +ically)
+3731) perioperative
+3732) bruxism
+3733) assistive
+3734) wikis (added plural)
+3735) odt
+3736) docx
+3737) pdf (added also in lower case)
+3738) OpenDocument
+3739) mouseover (+plural)
+3740) goaty (merged into goat)
+3741) goatish
+3742) ballotine (+plural)
+3743) galantine (+plural)
+3744) terrines (added plural)
+3745) saltimbocca
+3746) zipx
+3747) brill
+3748) gratin
+3749) ovenproof
+3750) monkfish (+plural)
+3751) anglerfish (+plural)
+3752) Bokmål (language)
+3753) mash-up
+3754) ID + ID's + ID'ing + ID'd (Oxford: don't confuse with "id" in lower case)
+3755) downloader (+plural)
+3756) downmost
+3757) supercell (+plural)
+3758) turbocharge + turbocharging + turbocharged (merged into one entry)
+3759) turboboost
+3760) crashworthy (+ness)
+3761) afterdeck
+3762) foresheet (+plural)
+3763) Paki (+plural - Oxford: offensive, used in GB)
+3764) Lillee (+'s - name)
+3765) Bradman (+'s - name)
+3766) Dryopithecus
+3767) cryptobiotic
+3768) cryptobiosis
+3769) saccharide (+plural)
+3770) defat (+s +ed +ing)
+3771) defeasance (+plural)
+3772) defeasible
+3773) defeatedly (merged into defeated)
+3774) defeminize (+ed +ing - IZE)
+3775) defeminise (+ed +ing - ISE)
+3776) Apelles (+'s - name)
+3777) mesmerize (+s +r +ing +ed - IZE)
+3778) mesmerically (merged into mesmeric)
+3779) unpersuadable
+3780) unperson (+plural)
+3781) unperfumed
+3782) unpersuaded
+3783) unphysical
+3784) unphilosophic (+ally)
+3785) unphilosophical
+3786) unphysiological
+3787) unphysiologic (+ally)
+3788) unpicturesque
+3789) unpigmented
+3790) exfoliate (+s +ed +ing)
+3791) exfoliant (+plural)
+3792) Ardennes (name of place)
+3793) unamplified
+3794) unamiable
+3795) unamended
+3796) zing + zed (removed duplicate - PTG V3 build 64+)
+3797) z's + zs (Z - can be either in upper or lower case)
+3798) unambivalent (+ly)
+3799) ready (removed duplicate - PTG V3 build 64+)
+3800) unambitiousness
+3801) unambiguity
+3802) weaponed (merged into weapon)
+3803) weaponless (merged into weapon - Kevin Atkinson wordlist 50)
+3804) whitefish + whitefishes + whitefish's (Kevin Atkinson wordlist 50)
+3805) wheresoever (Kevin Atkinson wordlist 50)
+3806) weeper (+s +'s - Kevin Atkinson wordlist 50)
+3807) weenier + weeniest (merged into weeny)
+3808) unskilful (+ly +ness)
+3809) unready
+3810) unreadably
+3811) unreachableness
+3812) unreachably
+3813) unratified
+3814) preseason (+plural)
+3815) preselector
+3816) preselections (added plural)
+3817) unquotable (merged into unquote)
+3818) unquiet (+ly +ness)
+3819) unsuspected (+ly - Kevin Atkinson wordlist 50)
+3820) jackrabbit jackrabbit's jackrabbits (Kevin Atkinson wordlist 50)
+3821) amazon (added also lower case because of some animal names)
+3822) Amazonas (name of state in Brazil)
+3823) Trekkie (+'s +plural - Oxford: informal - another way of Trekker)
+3824) trelliswork (fixed: trellis-work)
+3825) Tharp (+'s - name - Kevin Atkinson wordlist 50)
+3826) Sumerians (added plural)
+3827) sudoku
+3828) sudoriferous
+3829) ecoterrorism
+3830) ecoterrorist (+plural)
+3831) ecosphere
+3832) bioregionalism
+3833) bioregionalist (+plural)
+3834) biodynamic (+plural)
+3835) bioenergetic (added plural)
+3836) bioethanol
+3837) biotransformation
+3838) biotype (+plural)
+3839) biowarfare
+3840) bioweapon (+plural)
+3841) firepower (fixed: fire-power)
+3842) fireship (+plural)
+3843) Cmdre (Oxford: abbreviation of Commodore)
+3844) Cmdr (Oxford: abbreviation of Commander)
+3845) Bdr (Oxford: abbreviation of Bombardier)
+3846) aircraftman
+3847) aircraftmen (plural of previous word)
+3848) aircraftwoman
+3849) aircraftwomen (plural of previous word)
+3850) airdrop (+s +ing +ed)
+3851) combfish (+plural)
+3852) nannygai (+plural)
+3853) redfish (+plural)
+3854) rockfish (+plural)
+3855) scorpionfish (+plural)
+3856) calvary (added lower case too - Oxford: when used as noun)
+3857) parasail (+ing)
+3858) ballgirl (+plural)
+3859) backcourt (+plural)
+3860) foredawn
+3861) multilateralism
+3862) multilateralist (added singular)
+3863) unheroic (+ally)
+3864) unheretical
+3865) unheedingly
+3866) unheedful
+3867) unhedged
+3868) unhearing
+3869) unhealthiness
+3870) untaken
+3871) untalkative
+3872) talkboard (+plural)
+3873) talkback
+3874) talkathon (+plural - Oxford: informal)
+3875) over-talkative (+ness)
+3876) overabundant (fix: over-abundant)
+3877) overabundance (fix: over-abundance)
+3878) overabundantly
+3879) overachievement (merged into overachieve)
+3880) DirectX
+3881) XP (therefore removed "Windows XP")
+3882) AVCHD
+3883) BD-R (+plural)
+3884) BD-RE (+plural)
+3885) M-DISC (+'s)
+3886) LightScribe
+3887) CD-R (+plural)
+3888) pre-plan (+ed)
+3889) BD-ROM (+plural)
+3890) BD-XL
+3891) BDXL
+3892) H.265
+3893) DivX
+3894) divx (also in lower case)
+
+
+V2.17 - 1-OCT-2014
+------------------
+3895) toolbar's (added the 's)
+3896) advisors (added plural)
+3897) adviser (+plural +'s)
+3898) kookily (merged into kooky)
+3899) yawp (+ed +er +ers)
+3900) yay (Oxford: informal)
+3901) Darth (+'s - name from Star Wars)
+3902) glam (+s +ing +ed)
+3903) nothosaur (+plural)
+3904) semiaquatic
+3905) plesiosaur (+plural)
+3906) ichthyosaur (+plural)
+3907) ichthyosaurus (another way of previous word)
+3908) ichthyophagous
+3909) ichthyophagy
+3910) ichthyornis
+3911) nerve-racking
+3912) nerve-wracking (another way of previous word)
+3913) nervure (+plural)
+3914) fangirl (+plural - Oxford: informal)
+3915) fanboy (+plural - Oxford: informal)
+3916) Bielefeld (name of city in Germany)
+3917) georgette (added lower case)
+3918) buckskinned (merged into buckskin)
+3919) parfleche (+plural)
+3920) musquash (another way for muskrat)
+3921) byssus (+plural)
+3922) byssi (another plural of previous word)
+3923) byssinosis
+3924) epidemiologic
+3925) atopy (+ic)
+3926) sarcoidosis
+3927) colorectal
+3928) absorbance (+plural)
+3929) quinoa
+3930) SIM (+plural)
+3931) Nohl (+'s - name)
+3932) sandboxing + sandboxed (merged into sandbox)
+3933) Karsten (+'s - name)
+3934) GSM + gsm
+3935) telco (+plural)
+3936) echocardiogram (+plural)
+3937) angiogram (+plural)
+3938) mesentery (+plural +ic)
+3939) innominate
+3940) exteriorize (+ed +ion - IZE)
+3941) exteriorise (+ed +ion - ISE)
+3942) Peigan (+plural)
+3943) Piegan (+plural - another way of previous word)
+3944) Blackfeet (plural of Blackfoot)
+3945) whitehead (+plural)
+3946) whitefront (+plural)
+3947) waterfowling
+3948) waterfowler (+plural)
+3949) watergate (also lower case for gate)
+3950) waterhen (+plural)
+3951) tardigrade (+plural)
+3952) onychophoran (+plural)
+3953) Taiping (Kevin Atkinson wordlist 50)
+3954) Swammerdam (+'s - name - Kevin Atkinson wordlist 50)
+3955) sunbed (added singular)
+3956) sunbelt (fix: changed to lower case)
+3957) sunbow (+plural)
+3958) vitalism
+3959) casuistical (+ally)
+3960) homebuyer (+plural)
+3961) homebuilder (+plural)
+3962) homebuilding
+3963) homeobox
+3964) homoeobox (another way of previous word)
+3965) homeopath (+plural - another way of homoeopath)
+3966) prescribers (added plural)
+3967) prescribable
+3968) integrationist (+plural)
+3969) allopathy
+3970) allopathic
+3971) allopathist (+plural)
+3972) reiki
+3973) reimportation
+3974) reimposition
+3975) idol-worshipping
+3976) idocrase
+3977) Jiangxi (name of place)
+3978) Kiangsi (another way of previous word)
+3979) Qing
+3980) Ch'ing (another way of previous word)
+3981) mafic
+3982) retiré (Ballet)
+3983) retiree (+plural)
+3984) retirer (+plural)
+3985) overtype (+ing)
+3986) overweeningly (merged into overweening)
+3987) rufous
+3988) bettong (+plural)
+3989) potoroo (+plural)
+3990) bandicoot (+plural)
+3991) roadkill (+plural)
+3992) bilby (+plural)
+3993) numbat (+plural)
+3994) woylie (+plural)
+3995) aardwolf
+3996) aardwolves (plural of previous word)
+3997) Århus (name of place - another word for Aarhus)
+3998) Barranquilla (name of place)
+3999) barramundi (+plural)
+4000) fireguards (added plural)
+4001) firebreak (+plural)
+4002) firebrick (+plural)
+4003) firebrat (+plural)
+4004) firebomb (+ derivates - fixed: fire-bomb)
+4005) fireblight
+4006) fireballer
+4007) fireballing
+4008) blockwork
+4009) blockship (+plural)
+4010) blockboard
+4011) Shandong (another way of Shantung)
+4012) shandies (plural of shandy)
+4013) aguardiente
+4014) agroterrorism
+4015) agroterrorist
+4016) agrostology
+4017) Hitchcock's (name - added the 's)
+4018) botanize (+ing - IZE)
+4019) botanise (+ing - ISE)
+4020) wireline
+4021) wireframes (added plural)
+4022) chatbot (+plural)
+4023) immersive
+4024) barcode (+s +ed)
+4025) MP (+plural)
+4026) mp (lower case)
+4027) barchan (+plural)
+4028) barcarolle (another way of barcarole)
+4029) barbule (+plural)
+4030) Sumer (name of place)
+4031) Sumbawa (name of place)
+4032) Sudra (+plural - Kevin Atkinson wordlist 50)
+4033) sudorific (+plural)
+4034) depuration
+4035) depurate (+ed)
+4036) depurative (+plural)
+4037) depurator (+plural)
+4038) depthless (+ly)
+4039) stomachic (+plural)
+4040) febrifuge
+4041) ophthalmia
+4042) pyrexia
+4043) sigil (+plural)
+4044) sightworthy
+4045) Tangiers (another way of Tangier - Kevin Atkinson wordlist 50)
+4046) Tarantino (+'s - name - Kevin Atkinson wordlist 50)
+4047) Terry (+'s - name - Kevin Atkinson wordlist 50)
+4048) paraesthesia (+plural)
+4049) paraesthesiae (another plural of previous word)
+4050) paradrop (+s +ing +ed)
+4051) atomism
+4052) atomist (+plural)
+4053) moderns (added plural)
+4054) moderatorship (+plural)
+4055) RSS
+4056) drawdown (+plural)
+4057) drawcard (+plural)
+4058) drawbar (+plural)
+4059) drawcord (+plural)
+4060) zipless (Oxford: informal)
+4061) wearability
+4062) pre-order (+plural)
+4063) pre-prepare (+ed)
+4064) neurodegenerative
+4065) neurocomputer (+plural)
+4066) neuroeconomics
+4067) neurofibril (+plural)
+4068) neurofibrillary
+4069) supranuclear
+4070) supraorbital
+4071) foramen
+4072) foramina (plural of previous word)
+4073) argyrophilic
+4074) suprasegmental (+plural)
+4075) phrenic
+4076) supremacism
+4077) miniscule (another way of minuscule)
+4078) neo-fascist (+plural)
+4079) neo-Gothic
+4080) neo-Latin
+4081) neo-impressionism
+4082) neo-impressionist (+plural)
+4083) neo-Georgian
+4084) neo-Darwinian
+4085) neo-Darwinism
+4086) neo-Darwinist
+4087) neo-Confucianism
+4088) neo-Confucian
+4089) blissed (merged into bliss)
+4090) gazania (+plural)
+4091) bluegum
+4092) stringybark
+4093) stringpiece
+4094) mallee (+plural)
+4095) tad (Oxford: informal)
+4096) tacticity
+4097) configurational (merged into configuration)
+4098) associationism
+4099) associationist (+plural)
+4100) epidemiologic (merged into epidemiology)
+4101) colosseum (+plural - fixed: lower case - another word for coliseum)
+4102) clearwing
+4103) peacemonger (+ing +ed)
+4104) peacekeeper (added singular)
+4105) InterCity (trademark)
+4106) intercolonial
+4107) intercolumniation
+4108) intercolumnar
+4109) astragal (+plural)
+4110) astragalus
+4111) astragali (plural of previous word)
+4112) antherozoid (+plural)
+4113) gametophyte
+4114) gametophytic (merged into gametophyte)
+4115) microspore (+plural)
+4116) megaspore (+plural)
+4117) megastores (added plural)
+4118) megastars (added plural)
+4119) megastructure (+plural)
+4120) Wright's (added 's)
+4121) wretcheder (merged into wretched)
+4122) wretchedest
+4123) arteriovenous
+4124) parenchyma (+al)
+4125) parenchymatous
+4126) sawfish (+plural)
+4127) sawlike
+4128) crowberry (+plural)
+4129) cordgrass
+4130) benzoin
+4131) unorganized
+4132) benzoic (acid)
+4133) stereochemistry
+4134) stereochemical (+ally)
+4135) epoxide (+plural)
+4136) catechol
+4137) norepinephrine
+4138) fluorochrome (+plural)
+4139) fluoropolymer
+4140) tetrafluoroethylene
+4141) waitressing (merged into waitress)
+4142) busbar (+plural)
+4143) busby (+plural)
+4144) semibreve (+plural)
+4145) semibold
+4146) semidemisemiquaver
+4147) hemidemisemiquaver (+plural - another way of previous word)
+4148) hemicylindrical
+4149) hemicycle (+plural)
+4150) azulejo (+plural)
+4151) archivolt (+plural)
+4152) entablement
+4153) architectonically (merged into architectonic)
+4154) annulet (+plural)
+4155) policymaker (+plural - Fixed: policy-maker)
+4156) policymaking (fixed: policy-making)
+4157) policier
+4158) Melville's (added the 's)
+4159) counterscarp (+plural)
+4160) countershaft (+plural)
+4161) artiodactyl (+plural)
+4162) bioluminescence
+4163) bioluminescent
+4164) biomagnetism
+4165) biomaterial
+4166) biomathematics
+4167) biome (+plural)
+4168) transgene (+plural)
+4169) introgression
+4170) backcross (+s +ed +ing)
+4171) cultivar (+plural)
+4172) cultigen (+plural)
+4173) bifacial
+4174) biface (+plural)
+4175) uniface
+4176) tricycling (merged into tricycle)
+4177) tricyclist (+plural)
+4178) petroglyphs (added plural)
+4179) ghostwrite (+derivates - fixed: ghost-write)
+4180) ghostwritten (fixed: ghost-written)
+4181) speechifies + speechifying + speechified + speechifier (merged into speechify)
+4182) speechification
+4183) speedwriting
+4184) speedwriter (+plural)
+4185) Magdalenian
+4186) Aurignacian
+4187) defloration
+4188) deflocculate (+ed)
+4189) deflocculation
+4190) deflesh (+ed)
+4191) arsehole (+plural +ed - Oxford: vulgar slang)
+4192) arsenates (added plural)
+4193) selenates (added plural)
+4194) selenide (+plural)
+4195) machinability
+4196) weldability (merged into weld)
+4197) weldable (merged into weld)
+4198) weldmesh
+4199) corkwood (+plural)
+4200) Graeco-Roman
+4201) Greco-Roman (another way of previous word)
+4202) paperbark (+plural)
+4203) paperboy (fixed: paper-boy)
+4204) papergirl (fixed: paper-girl)
+4205) paperknife
+4206) paperknives (plural of previous word)
+4207) papermaking
+4208) papermaker
+4209) paperchase
+4210) paperboard
+4211) oldspeak
+4212) Oldowan
+4213) Epidaurus (ancient Greek city)
+4214) epicycloidal (merged into epicycloid)
+4215) epicycloids (added plural)
+4216) hypocycloid (+al)
+4217) commissure (+plural)
+4218) legalist (+plural)
+4219) legalistically (merged into legalistic)
+4220) Carcassonne
+4221) Carchemish (city)
+4222) chiliastic
+4223) chiliarch (+plural - chiliarchs)
+4224) bowsers (added plural)
+4225) bowshot
+4226) bowstrung (past and past participle of bowstring)
+4227) fletchers (added plural)
+4228) pickerelweed
+4229) pickelhaube
+4230) orebody (+plural)
+4231) noise-maker (removed - American word)
+4232) noisette (+plural)
+4233) noisomeness (merged into noisome)
+4234) Nok
+4235) Osbert (name - Osbert Guy Stanhope Crawford)
+4236) Stanhope (name - Osbert Guy Stanhope Crawford)
+4237) Belgic
+4238) encash (+ed +able +ment)
+4239) consortiums (another plural of consortium)
+4240) conspecific (+plural)
+4241) conspecificity
+4242) spatterware
+4243) spatterdash (+plural)
+4244) allseed
+4245) zugzwang
+4246) myxoedema
+4247) filariasis
+4248) geotag (+s +ing +ed)
+4249) geotaxis
+4250) geotactic
+4251) geotropism
+4252) geotropic
+4253) megapode (+plural)
+4254) ensiform
+4255) geosyncline (+plural)
+4256) bioclast (+s +ic)
+4257) biocide (+s +idal)
+4258) antifouling
+4259) alprazolam
+4260) depredator (+plural)
+4261) depredatory
+4262) lo-fi
+4263) low-fi (another way of previous word)
+4264) bokeh
+4265) lo-res
+4266) low-res (another way of previous word)
+4267) dojo (+plural)
+4268) ippon (+plural)
+4269) bushido (now in lower case according to Oxford)
+4270) bushmeat
+4271) clifftop (+plural)
+4272) geoid
+4273) eukaryotic
+4274) biosocial
+4275) biometeorology
+4276) autostereoscopic
+4277) taskbar
+4278) gamification
+4279) gamify (+plural +ing +ed)
+4280) gamgee
+4281) gametogenesis
+4282) gametogenic
+4283) gametogeny
+4284) systematist (+plural)
+4285) autorotated (merged into autorotate)
+4286) cyphel
+4287) fire-brick (removed: it is firebrick)
+4288) coleopteran (+plural)
+4289) coleopterous
+4290) dermestid
+4291) dermatophytosis
+4292) dermatophytoses (plural of previous word)
+4293) dermatosis
+4294) dermatoses (plural of previous word)
+4295) hypermetropia
+4296) hypermnesia
+4297) hyperon (+plural)
+4298) parasitoid (+plural)
+4299) biopharming
+4300) biophilia
+4301) biopolymer (+plural)
+4302) geeked + geeking (merged into geek)
+4303) geekdom
+4304) geekish
+4305) geeky (+ier +iest +ness)
+4306) geekery (Oxford: informal)
+4307) geekspeak (Oxford: informal)
+4308) chappie (+plural - Oxford: informal)
+4309) eyeshadow (fix: eye-shadow)
+4310) eyeshot
+4311) eyestalk
+4312) eyestripe (+plural)
+4313) unpatterned
+4314) unpatrolled
+4315) unpatriotically
+4316) unpatched
+4317) unpassable
+4318) unpardonableness
+4319) unpacker (+plural)
+4320) unornamented
+4321) unoriginality
+4322) unoriginally
+4323) unordinary
+4324) unoiled
+4325) unoffending
+4326) unobscured
+4327) unobjective
+4328) unoaked
+4329) unnoticeably
+4330) unnamable (another way for unnameable)
+4331) unnail (+ed)
+4332) unmusicality
+4333) unmusicalness (merged into unmusical)
+4334) unmutilated
+4335) unmurmuring (+ly)
+4336) unmuffle (+ed)
+4337) unmothered
+4338) unmotherly
+4339) unmoral
+4340) unmorality
+4341) unpeople (+s +ing)
+4342) unpeg (+s +ing +ed)
+4343) unpatented
+4344) untouchability
+4345) untouristed
+4346) untowardness (merged into untoward)
+4347) untransferable
+4348) untranslatability
+4349) untraversable
+4350) untrendy (Oxford: informal)
+4351) untrusting
+4352) untuck (+ed)
+4353) unknowingness (merged into unknowing)
+4354) sideward (added singular)
+4355) sidewall
+4356) sideswipe (fixed: side-swipe)
+4357) sidestroke (fixed: side-stroke)
+4358) starchitect
+4359) columnated
+4360) starchitecture
+4361) decretal (+plural)
+4362) Decretum
+4363) decubitus
+4364) codebreaking
+4365) codebreakers (added plural)
+4366) codependence
+4367) beatbox (+plural +er +ing)
+4368) bandoneon
+4369) bandpasses (added plural)
+4370) photodiode (+plural)
+4371) photodegrade
+4372) photodegradation
+4373) photodetector (+plural)
+4374) photodissociation
+4375) photoelectron (added singular)
+4376) photoemission
+4377) photoemissive
+4378) photoemitter
+4379) photoessay (+plural)
+4380) photofit (+plural)
+4381) photogram (+plural)
+4382) landmines (added plural)
+4383) shoreside
+4384) shoreweed
+4385) shorelark (+plural)
+4386) bellbird (+plural)
+4387) honeyeater (+plural)
+4388) honeyguide (+plural)
+4389) honeypot (+plural)
+4390) honeysucker (+plural)
+4391) honeywort
+4392) snowberry (+plural)
+4393) snowblade (+s +ing +er)
+4394) snowblink
+4395) granodiorite
+4396) plutonic + Plutonic
+4397) biostratigraphy
+4398) biosurgery
+4399) biosolids
+4400) biosimilar (+plural)
+4401) biospheric (merged into biosphere)
+4402) biofuels (added plural)
+4403) bioflavonoid (+plural)
+4404) biometrical
+4405) biometrician (+plural)
+4406) ectoparasitic (merged into ectoparasite)
+4407) microhabitat (+plural)
+4408) study's (added the 's)
+4409) anthropogenically (merged into anthropogenic)
+4410) timescale (fixed: time-scale)
+4411) spermatid (+plural +al)
+4412) spermatocyte (+plural)
+4413) spermatogonium
+4414) spermatogonia (plural of previous word)
+4415) seminiferous
+4416) semiochemical (+plural)
+4417) semiological
+4418) elenchus
+4419) elenchi (plural of previous word)
+4420) alienee (+plural)
+4421) aliform
+4422) encephalon
+4423) encephalography
+4424) encephalograph
+4425) encephalogram (+plural)
+4426) myoclonus
+4427) myoclonic
+4428) capitular
+4429) glomerulus
+4430) glomeruli (plural of previous word)
+4431) glomerular
+4432) nephron (+plural)
+4433) nephrotoxic
+4434) nephrotoxicity
+4435) nephrotoxin (+plural)
+4436) vancomycin
+4437) virality
+4438) somewhen (Oxford: informal)
+4439) somite (+plural)
+4440) dichromatism
+4441) dichromatic
+4442) cephalothorax
+4443) holotype (+plural)
+4444) syntype (+plural)
+4445) fishcakes (added plural)
+4446) amatriciana
+4447) amaurosis
+4448) amaurotic
+4449) foo (foo fighter)
+4450) geoscience (+plural)
+4451) geoscientist (+plural)
+4452) botty (+plural)
+4453) Swabia (place in Germany)
+4454) Swabian
+4455) clamant
+4456) dragonet (+plural)
+4457) bigeye (fish)
+4458) bluefin (fish)
+4459) yellowfin (fish)
+4460) catalufa (+plural)
+4461) catalyser
+4462) APU
+4463) dumbshow (+plural)
+4464) dumbphone (+plural)
+4465) dumbo (+plural - Oxford: informal)
+4466) vetchling (+plural)
+4467) buckthorn
+4468) buckyball (+plural)
+4469) nanomaterials (added plural)
+4470) nanogram
+4471) ng (Oxford: abbreviation of previous word)
+4472) oxidase (+plural)
+4473) pharaoh (+plural - changed to lower case - upper case only if name)
+4474) abubble
+4475) idiotype (+plural)
+
+
+V2.18 - 1-NOV-2014
+------------------
+4476) mothercraft
+4477) mainboard (+plural)
+4478) maincrop
+4479) tricuspid
+4480) unicuspid
+4481) fivestones
+4482) fivesome
+4483) Flathead (+plural - upper case - Kevin Atkinson wordlist 60)
+4484) bioturbation
+4485) pilgriming + pilgrimed (merged into pilgrim)
+4486) pilgrimize (-IZE)
+4487) pilgrimise (-ISE)
+4488) rubescent
+4489) evacuant
+4490) Salvadorean (+plural +'s - Kevin Atkinson wordlist 60)
+4491) statant
+4492) Zarathustra's (added +'s - Kevin Atkinson wordlist 60)
+4493) adventurist (+plural - Kevin Atkinson wordlist 60)
+4494) acquiree (+plural)
+4495) acquirer (+plural - Kevin Atkinson wordlist 60)
+4496) answerphone (+plural - Kevin Atkinson wordlist 60)
+4497) bulleted (merged into bullet)
+4498) bedchambers (added plural - Kevin Atkinson wordlist 60)
+4499) biodegrade (+s +ed +ing +ion - Kevin Atkinson wordlist 60)
+4500) blobfish (+plural)
+4501) binman (Oxford: informal - Kevin Atkinson wordlist 60)
+4502) binmen (plural of previous word - Kevin Atkinson wordlist 60)
+4503) blowlamps (added plural - Kevin Atkinson wordlist 60)
+4504) breathalyses (added plural - Kevin Atkinson wordlist 60)
+4505) cellmates (added plural - Kevin Atkinson wordlist 60)
+4506) chatlines (added plural - Kevin Atkinson wordlist 60)
+4507) chirpily + chirpiness (merged into chirpy - Kevin Atkinson wordlist 60)
+4508) computerate (Oxford: informal - Kevin Atkinson wordlist 60)
+4509) comfortless (merged into comfort - Kevin Atkinson wordlist 60)
+4510) conchie (+plural - Oxford: informal - Kevin Atkinson wordlist 60)
+4511) cookhouse (+plural - Kevin Atkinson wordlist 60)
+4512) crabwise (Kevin Atkinson wordlist 60)
+4513) crepuscular (Kevin Atkinson wordlist 60)
+4514) cripes (Oxford: informal - Kevin Atkinson wordlist 60)
+4515) criollo (+plural)
+4516) cuboids (added plural - Kevin Atkinson wordlist 60)
+4517) cuboidal (merged into cuboid)
+4518) demonically (Kevin Atkinson wordlist 60)
+4519) deselection (+plural - Kevin Atkinson wordlist 60)
+4520) immunoblotting
+4521) electrophorese
+4522) electrophoretic + electrophoretically
+4523) electrometer (+ic)
+4524) electrometry
+4525) electromyogram (+plural)
+4526) multipolar
+4527) multipolarity
+4528) multipole
+4529) unipolarity
+4530) unipotent
+4531) unironed
+4532) uniserial
+4533) unisexual (+ly)
+4534) unisexuality
+4535) unironic (+ly)
+4536) UNISON
+4537) unissued
+4538) deep-discount
+4539) supercalifragilisticexpialidocious (Oxford: informal)
+4540) supercalifragilistic (another way of previous word)
+4541) superbugs (added plural)
+4542) autorickshaw (+plural)
+4543) e-billing
+4544) e-cash
+4545) e-edition
+4546) e-dating
+4547) e-fit
+4548) overclock (+ed +ing +s)
+4549) overclocker (+plural +'s)
+4550) overcheck (+plural)
+4551) overcautiously + overcautiousness (merged into overcautious)
+4552) overcaution
+4553) overclass
+4554) overcompensatingly
+4555) overcompensatory
+4556) overcommits (added plural)
+4557) descale (+s +ing +ed - Kevin Atkinson wordlist 60)
+4558) descaler (+plural)
+4559) euryapsid (+plural)
+4560) darkie (+plural - Kevin Atkinson wordlist 60)
+4561) decathlete (+plural - Kevin Atkinson wordlist 60)
+4562) dickhead (+plural - Kevin Atkinson wordlist 60)
+4563) doodahs (added plural - Kevin Atkinson wordlist 60)
+4564) doolally (Oxford: informal - Kevin Atkinson wordlist 60)
+4565) doomster (+plural - Kevin Atkinson wordlist 60)
+4566) doomwatch (+er +ers)
+4567) draughtboard (+plural - Kevin Atkinson wordlist 60)
+4568) ecolodge (+plural)
+4569) ecofreak (+plural)
+4570) ecofeminism
+4571) ecofeminist (+plural)
+4572) educationist (+plural - Kevin Atkinson wordlist 60)
+4573) endgames (added plural - Kevin Atkinson wordlist 60)
+4574) consecrator
+4575) consecratory
+4576) emblematical
+4577) emblematically (Kevin Atkinson wordlist 60)
+4578) emblematist
+4579) dozier+doziest+dozily+doziness (merged into dozy - Kevin Atkinson wordlist 60)
+4580) ecu (+plural - Kevin Atkinson wordlist 60)
+4581) diaconate
+4582) premodify (+s +ing +ed +ion +er)
+4583) premonish (+ing)
+4584) Petersburg (name)
+4585) entryphone (+plural - Kevin Atkinson wordlist 60)
+4586) extrajudicial (Kevin Atkinson wordlist 60)
+4587) extrajudicially (merged into extrajudicial)
+4588) selfhood
+4589) continuants (added plural)
+4590) cacuminal
+4591) coarticulation (+plural)
+4592) silicify (+s +ing +ed +ion)
+4593) extraordinaire (Kevin Atkinson wordlist 60)
+4594) extranet (+plural)
+4595) extramusical
+4596) fab (+s +ing +ed)
+4597) fatsos (added plural - Kevin Atkinson wordlist 60)
+4598) fitment (added singular - Kevin Atkinson wordlist 60)
+4599) fluvial (Kevin Atkinson wordlist 60)
+4600) fuckhead (+plural - Kevin Atkinson wordlist 60)
+4601) fuckwit (Oxford: vulgar slang)
+4602) fucoxanthin
+4603) carotenoid (+plural)
+4604) lutein
+4605) ZX (ZX Spectrum - computer from the 1980s)
+4606) exabyte (+plural)
+4607) EB (abbreviation of previous word)
+4608) yottabyte (+plural)
+4609) YB (abbreviation of previous word)
+4610) zettabytes (added plural)
+4611) ZB (abbreviation of previous word)
+4612) Amiga's (added the 's)
+4613) lower-level
+4614) higher-level
+4615) akasha (+ic)
+4616) inbreathe (+ed +ing)
+4617) fracking
+4618) commenters (added plural)
+4619) bynames (added plural)
+4620) bye-byes (added plural)
+4621) goodliness (merged into goodly)
+4622) mailshots (added plural)
+4623) backbend (+plural)
+4624) jawless (merged into jaw)
+4625) hagfish (+plural)
+4626) beardfish (+plural)
+4627) clade (+plural)
+4628) taxon
+4629) taxa (plural of previous word)
+4630) avoision
+4631) kyu (martial arts)
+4632) dan (martial arts)
+4633) budo (martial arts)
+4634) bokken (martial arts)
+4635) kyudo (martial arts)
+4636) kendo (martial arts)
+4637) lamers (added plural)
+4635) 2D
+4636) 3D
+4637) galactically (merged into galactic)
+4638) galactagogue (+plural)
+4639) prolactin
+4640) oxytocin
+4641) oxytocic
+4642) monoamine (+plural)
+4643) monamine (+plural - another way of previous word)
+4644) neuropeptide (+plural)
+4645) neuropathological
+4646) neuropathologist (+plural)
+4647) neuroma (+plural)
+4648) neuromata (another plural of previous word)
+4649) geriatrician (+plural)
+4650) defervescence
+4651) anastomose (added singular +ing +ed)
+4652) arthroplasty
+4653) vegetal
+4654) aepyornis
+4655) calcination (merged into calcine)
+4656) dimercaprol
+4657) dimerous
+4658) meerkat (+plural)
+4659) tamarin (+plural)
+4660) mara (+plural)
+4661) suricate (+plural)
+4662) Bannockburn (place)
+4663) Mozillian (+'s +plural)
+4664) annock
+4665) bendy (+ier iest +ness)
+4666) funfairs (added plural - Kevin Atkinson wordlist 60)
+4667) goodie (another way of goody)
+4668) ganja (Kevin Atkinson wordlist 60)
+4669) charas
+4670) spliff (+plural)
+4671) afebrile
+4672) Eddington (+'s - name)
+4673) dyskinesia (+plural)
+4674) dyspraxia
+4675) dysregulation
+4676) bariatrics
+4677) bronchodilator (+plural)
+4678) bronchodilation
+4679) pharmacodynamic (+plural)
+4680) zonation (+plural)
+4681) nomenclator
+4682) nomenclatural
+4683) monotypic
+4684) monovalent
+4685) nonagon
+4686) gasman (Kevin Atkinson wordlist 60)
+4687) gasmen (plural of previous word - Kevin Atkinson wordlist 60)
+4688) gaslighting (merged into gaslight)
+4689) gaslit
+4690) gasometers (added plural - Kevin Atkinson wordlist 60)
+4691) bionomic (+plural)
+4692) anticathode (+plural)
+4693) anticholinergic (+plural)
+4694) misdial (+s +ing +ed)
+4695) misdescribe (+s +ed +ion)
+4696) misdoubt (+s +ed)
+4697) compand (+s +er +ing +ed)
+4698) datacomms
+4699) datacoms (another way of previous word)
+4700) dataveillance
+4701) case-sensitive
+4702) backstamp (+plural)
+4703) backstay (+plural)
+4704) donkeyman
+4705) donkeymen (plural of previous word)
+4706) bathymeter (+plural +ic)
+4707) bathymetry
+4708) scaleable (another way of scalable)
+4709) intercrop (+s +ing +ed)
+4710) intercorrelation (+plural)
+4711) intercorrelate
+4712) baseload
+4713) baselessly
+4714) baseborn
+4715) subcell (Collins)
+4716) subcellular (Collins)
+4717) supralunar (Collins)
+4718) supratemporal (Collins)
+4719) hepatocellular (Collins)
+4720) gluteals (added plural)
+4721) gastrocnemius
+4722) gastrocnemii (plural of previous word)
+4723) soleus
+4724) appendicular
+4725) scute (+plural)
+4726) allosaurus (+plural)
+4727) allopurinol
+4728) colchicine
+4729) disarticulate (+ion)
+4730) flexicuffs (Macmillan)
+4731) plasticuffs (Macmillan)
+4732) PCIe
+4733) RJ45
+4734) blackboy (+plural)
+4735) mistle (mistle thrush)
+4736) broadbill (+plural)
+4737) Arabism
+4738) Arabist (+plural)
+4739) arabinose
+4740) galactose
+4741) xylose
+4742) mannose
+4743) fibrinogen
+4744) extravascular
+4745) intravascular (+ly)
+4746) extravasate (+ed)
+4747) petechia
+4748) petechiae (plural of previous word)
+4749) petcock
+4750) petasus
+4751) undersheriff (fixed: under-sheriff)
+4752) underset (+s +ing)
+4753) unviable
+4754) unviability
+4755) unviolated
+4756) Eliot's (added the 's)
+4757) unvitiated
+4758) unwaged
+4759) unwaisted
+4760) hashtag (+plural)
+4761) cliched (merged into cliche)
+4762) gotcha (Oxford: informal)
+4763) gotcher (Oxford: informal - another way of previous word)
+4764) gossypol
+4765) cottonweed (+plural)
+4766) oligotrophy (+ic)
+4767) eutrophic
+4768) lapis
+4769) UTF-16
+4770) UTF-32
+4771) 1D
+4772) unvented
+4773) unvaryingness
+4774) meningococcus
+4775) meningococci (plural of previous word)
+4776) meningococcal
+4777) serogroup (Collins)
+4778) anti-war (fixed antiwar)
+4779) anti-Western
+4780) anti-tetanus
+4781) anorgasmia
+4782) activewear
+4783) Diana's (added the 's)
+4784) misestimate (+ed)
+4785) misestimation (+plural)
+4786) QuickTime
+4787) trackpad
+4788) ringtone (+plural)
+4789) Netflix (company)
+4790) podcasts (added plural)
+4791) waifish
+4792) waiflike
+4793) retroelement (+plural)
+4794) bivalents (added plural)
+4795) non-disjunction
+4796) spermatogenesis
+4797) spermatophore (+plural)
+4798) oviposit (+s +ing +ed)
+4799) oviparity
+4800) asphyxial
+4801) asphyxiant (+plural)
+4802) diverticular
+4803) diverticulum
+4804) diverticula (plural of previous word)
+4805) axilla
+4806) axillae (plural of previous word)
+4807) aviating + aviated (merged into aviate)
+4808) prosoma
+4809) tagma
+4810) tagmata (plural of previous word)
+4811) antivivisection
+4812) antivivisectionism
+4813) gangstas (added plural - Kevin Atkinson wordlist 60)
+4814) counterchange (+s +ed +ing)
+4815) counterclaims (added plural)
+4816) counterculture (fixed: counter-culture)
+4817) countercultural
+4818) counterdemonstration (+plural)
+4819) Blairism
+4820) Blairite (+plural)
+4821) church (added also lower case)
+4822) churchy + churchier + churchiest
+4823) chuppah + chuppa
+4824) chuppot (plural of previous word)
+4825) chupacabra (+plural +'s)
+4826) Gawd + gawd (Oxford: informal - Kevin Atkinson wordlist 60)
+4827) geddit (Oxford: informal - Kevin Atkinson wordlist 60)
+4828) gasholder (+plural - Kevin Atkinson wordlist 60)
+4829) sunseeker (+plural - Oxford: informal)
+4830) Jain (+plural)
+4831) jailbreaker (merged into jailbreak)
+4832) detainers (added plural)
+4833) gigawatts (added plural - Kevin Atkinson wordlist 60)
+4834) GW (abbreviation of previous word)
+4835) gigaton (+plural)
+4836) gigatonne (+plural - another way of previous word)
+4837) godawful (Kevin Atkinson wordlist 60)
+4838) goddammit (Collins - informal)
+4839) godlessly (merged into godless - Kevin Atkinson wordlist 60)
+4840) giros (added plural - Kevin Atkinson wordlist 60)
+4841) groupware (+'s - Kevin Atkinson wordlist 60)
+4842) Debian
+4843) versioned + versioning + versional (merged into version)
+4844) diehard (fixed: die-hard)
+4845) versicoloured
+4846) verset (+plural)
+4847) triolet (+plural)
+4848) sestina (+plural)
+4849) villanelle (+plural)
+4850) rondel (+plural)
+4851) pantoum (+plural)
+4852) pantryman
+4853) pantrymen (plural of previous word)
+4854) groundburst (Collins)
+4855) adaptationism
+4856) adaptationist
+4857) adaptably
+4858) Emmy (+plural - the awards)
+4859) greenflies (added plural - Kevin Atkinson wordlist 60)
+4860) gymslip (+plural - Kevin Atkinson wordlist 60)
+4861) hairsprays (added plural - Kevin Atkinson wordlist 60)
+4862) colourist (+plural)
+4863) colourway (+plural)
+4864) colouristic (+ally)
+4865) watercolourist (+plural - merged into watercolour)
+4866) watercock (+plural)
+4867) waterdog (+plural)
+4868) cottonmouth (+plural)
+4869) deergrass
+4870) dotterel (+plural)
+4871) dottily (merged into dotty)
+4872) Crockford (+'s)
+4873) Avesta
+4874) Vedic
+4875) Kubuntu (+'s)
+4876) ESA (+'s)
+4877) ESC
+4878) escabeche
+4879) escalade
+4880) rockwork (Collins)
+4881) rocketeer (+plural)
+4882) aerobrake (+ing)
+4883) aerobicist (+plural)
+4884) aerobiology
+4885) neurophysiological
+4886) neurophysiologist (+plural)
+4887) atherogenic
+4888) atherogenesis
+4889) pathophysiology
+4890) pathophysiologic
+4891) pathophysiological
+4892) pathophysiologically
+4893) pathophysiologist
+4894) colonoscopes (added plural)
+4895) autotransformers (added plural)
+4896) autotoxin (+plural)
+4897) autotoxic
+4898) allogenic
+4899) catastrophists (added plural)
+4900) tailplanes (added plural)
+4901) tailspinning (merged into tailspin)
+4902) tailspun (past of tailspin)
+4903) tailwater (+plural)
+4904) fishable (merged into fish)
+4905) hemimetabolous
+4906) hemimetabolic
+4907) DLL (+plural)
+4908) aerophagy
+
+
+V2.19 - 1-DEC-2014
+------------------
+4909) Zuckerberg (+'s - name)
+4910) XL
+4911) XXL
+4912) Facebooking (+ed +er +ers - merged into Facebook)
+4913) convocational
+4914) convolutional (merged into convolution)
+4915) denticle (+plural)
+4916) reticulary (Collins - another way for reticulate)
+4917) cephalopods (added plural)
+4918) crinoid (+plural)
+4919) brachiopod (+plural)
+4920) conodont (+plural)
+4921) intracompany (Collins)
+4922) agglutinogen (+plural)
+4923) downdrift
+4924) downcut (+s +ing)
+4925) upcurve (+ed - Collins + Oxford)
+4926) upcycle (+ed)
+4927) upcast
+4928) faceworker
+4929) homeworking (merged into homework)
+4930) homewrecker (+plural)
+4931) teleworker (+plural - Macmillan)
+4932) jack-o'-lantern (+plural)
+4933) jackanapes
+4934) goosefoot (+plural)
+4935) sumpweed (Collins)
+4936) sandbagger (+plural)
+4937) shopfront (+plural)
+4938) shopaholic (+plural)
+4939) shopfitter (+plural)
+4940) shopfitting
+4941) boutiquey (Oxford: informal)
+4942) Baphomet (Collins)
+4943) baphometic (Collins)
+4944) Mendes (name)
+4945) Judaeo-Christian (Collins)
+4946) magus
+4947) Szandor (name)
+4948) cosmopolite (+plural)
+4949) cosmopolitanize (+ed -IZE)
+4050) cosmopolitanise (+ed -ISE)
+4051) spacewalks (added plural)
+4052) spaceplane (+plural)
+4053) spacefaring
+4054) Lilith (+'s - name)
+4055) Samael (+'s - name)
+4056) clubmate (+plural)
+4057) curtilage (+plural)
+4058) circumstantiality
+4059) disburden
+4060) disbud (+s +ing +ed)
+4061) disbenefit (+plural)
+4062) disbound
+4063) basketmaker (+plural)
+4064) basketmaking
+4065) gadgeteer (+plural)
+4066) gadgety
+4067) cabbalistic
+4068) cabbalist (+plural)
+4069) cabbalism
+4070) Kabbalah + Kabbala + Cabbala + Qabalah
+4071) Kabbalism
+4072) Kabbalist (+plural)
+4073) Kabbalistic
+4074) Hasidism + Chasidism + Chassidism + Hassidism
+4075) copyread (+ing +er)
+4076) hardbody (+plural +ed)
+4077) Hardecanute (+'s - name)
+4078) bentonite
+4079) citrine
+4080) ricking + ricked (merged into rick)
+4081) cowfish (+plural)
+4082) diffusivities (added plural)
+4083) cal (Oxford: small calorie, abbreviation)
+4084) Cal (Oxford: large calorie, abbreviation)
+4085) multispectral
+4086) BTC (Oxford: abbreviation of bitcoin)
+4087) backbiting
+4088) deracinate (+ed)
+4089) train's (added the 's)
+4090) decoct (+ed +ing)
+4091) decocture
+4092) dibasic
+4093) monobasic
+4094) diamine (+plural)
+4095) triaxial
+4096) triatomic
+4097) triathlete (+plural)
+4098) deadeners (added plural)
+4099) copperas
+4100) spadefoot (+plural)
+4101) spadefish (+plural)
+4102) spadille
+4103) cribellum
+4104) cribella (plural of previous word)
+4105) cribellate
+4106) chelicerate (+plural)
+4107) lexicology
+4108) lexicological + lexicologically
+4109) pomodoro
+4110) unobvious (Collins)
+4111) recompress (+s +ed +ing +ion)
+4112) redistributor (+plural)
+4113) hyphenator (+plural)
+4114) refactor (+s +ed +ing)
+4115) misdistribution (Collins)
+4116) maldistribution
+4117) maldistributed
+4118) distributary (+plural)
+4119) dogwatch (+plural)
+4120) dogstail
+4121) dogskin
+4122) dogsbodies + dogsbodying (merged into dogsbody)
+4123) austenite (+ic)
+4124) Ozzies (added plural)
+4125) microstructure (+plural +al)
+4126) cementite
+4127) pearlite
+4128) contactor (+plural)
+4129) elastomers (added plural)
+4130) elastomeric
+4131) nitro (Oxford: Short for nitroglycerine)
+4132) polyolefin (Collins)
+4133) gapping
+4134) hypotaxis
+4135) hypotactic
+4136) parataxis
+4137) paratactic (+ally)
+4138) phasor (+plural)
+4139) phasic
+4140) reactance
+4141) acetanilide
+4142) orcein
+4143) cocreate (Collins)
+4144) Cota-Robles (name)
+4145) DSLR (+s +'s)
+4146) HDSLR (+s +'s)
+4147) SDK (Collins)
+4148) FreeBSD
+4149) AutoCAD (+'s)
+4150) CAD (in upper case - Oxford: short for Computer-aided design)
+4151) cadaverousness (merged into cadaverous)
+4152) CADCAM
+4153) androecium
+4154) androecia (plural of previous word)
+4155) androecial
+4156) gynoecium
+4157) gynoecia (plural of previous word)
+4158) gynocentric
+4159) unallowable
+4160) unallied
+4161) unalive
+4162) unalarmed
+4163) unaired
+4164) unaggressive
+4165) unaesthetic
+4166) unadvisedly
+4167) unadjacent
+4168) unaddressed
+4169) IRCop (+plural)
+4170) moldavite (Collins)
+4171) Jaban (+'s - name)
+4172) Joseph's (added the 's)
+4173) starships (added plural)
+4174) Anunnaki
+4175) Lyra
+4176) Sheran (+'s - name)
+4177) relink (+ed +ing)
+4178) reliquiae
+4179) relist (+ed +ing)
+4180) relleno (+plural)
+4181) tortious (+ly)
+4182) licensors (added plural)
+4183) RTFM (Oxford: vulgar slang)
+4184) Thunderbird's (added the 's)
+4185) personas (added plural)
+4186) Los (Los Angeles - city)
+4187) neuroanatomical
+4188) neuroanatomist (+plural)
+4189) neurochemistry
+4190) neurochemist
+4191) neurochemical
+4192) nephrology
+4193) nephrological
+4194) nephrologist (+plural)
+4195) interventional (merged into intervention)
+4196) subcortical
+4197) putamen (+plural)
+4198) putamina (another plural of previous word)
+4199) nondevelopment (Collins)
+4200) subdevelopment (Collins)
+4201) antidevelopment (Collins)
+4202) predevelopment (Collins)
+4203) neurohormonal (Collins)
+4204) military's (added the 's)
+4205) gizmo (+s +'s)
+4206) gismo (+s +'s - another way of previous word)
+4207) antimilitarism (Collins)
+4208) militaries (added plural)
+4209) Clausewitz (+'s - name)
+4210) antimilitarist (+plural - Collins)
+4211) hairgrip (+plural - Kevin Atkinson wordlist 60)
+4212) bikeable
+4213) bikable (another way of previous word)
+4214) BMX
+4215) boneshaker (+plural - Oxford: informal)
+4216) pushbike (+plural - Oxford: informal - Fixed: push-bike)
+4217) pushful (+ly +ness)
+4218) pushpit
+4219) lectionary (+plural)
+4220) commination (+plural)
+4221) comminatory
+4222) grotty (+ier +iest +ness - Kevin Atkinson wordlist 60)
+4223) polenta
+4224) carpaccio
+4225) Carpaccio (name)
+4226) footy (Oxford: informal - Kevin Atkinson wordlist 60)
+4227) footie (another way of previous word - Kevin Atkinson wordlist 60)
+4228) footslog (+s +ing +ed +er +ers)
+4229) fleapit (+plural - Kevin Atkinson wordlist 60)
+4230) glaive (+plural)
+4231) whoremaster (+plural)
+4232) gangmaster (+plural)
+4233) spymaster (+plural)
+4234) workmaster (Collins)
+4235) weaponeer (+ing - Collins)
+4236) ironmaster (+plural)
+4237) goldfield (+plural - Kevin Atkinson wordlist 60)
+4238) headcase (+plural - Oxford: informal - Kevin Atkinson wordlist 60)
+4239) headcam
+4240) headbutt (+ed +ing)
+4241) headbanging
+4242) headbanger (+plural)
+4243) headage
+4244) suckler (+plural)
+4245) unweaned
+4246) unweary
+4247) unwedded (+ness - another way of unwed)
+4248) unweighted
+4249) unwept
+4250) unwhipped
+4251) unwinnable
+4252) unwisdom
+4253) unwired
+4254) unwinking (+ly)
+4255) helipad (+plural - Kevin Atkinson wordlist 60)
+4256) holism (Kevin Atkinson wordlist 60)
+4257) holist (+plural)
+4258) serialism
+4259) serialist (+plural)
+4260) atonalism
+4261) atonalist (+plural)
+4262) jeeze + geez (another way of jeez - Oxford: informal)
+4263) wearables (added plural)
+4264) millennials (added plural)
+4265) Jehovah's (added the 's)
+4266) millenarianist (+plural)
+4267) millenarians (added plural)
+4268) apocalyptically
+4269) eschatological
+4270) eschatologist (+plural)
+4271) unmediated
+4272) unmelodic
+4273) unmelted
+4274) unmemorably (merged into unmemorable)
+4275) unmercifulness (merged into unmerciful)
+4276) unmetalled
+4277) unmetered
+4278) unmetrical
+4279) unmethodically (merged into unmethodical)
+4280) unmilitary
+4281) unmindfully
+4282) unmindfulness
+4283) unmissed
+4284) unmistaken
+4285) unmitigatedly
+4286) bombardon (+plural)
+4287) saxhorn (+plural)
+4288) sedum (+plural)
+4289) bellflowers (added plural)
+4290) untrusty (Collins)
+4291) counterstyle (Collins)
+4292) unthorough (Collins)
+4293) uninstallation (+plural)
+4294) hoick (+s +ing +ed - Kevin Atkinson wordlist 60)
+4295) hoofers (added plural - Kevin Atkinson wordlist 60)
+4296) hetero (+s +'s - Kevin Atkinson wordlist 60)
+4297) hotpots (added plural - Kevin Atkinson wordlist 60)
+4298) interwar (Kevin Atkinson wordlist 60)
+4299) ironwood (added singular - Kevin Atkinson wordlist 60)
+4300) jerrycan (+plural - Kevin Atkinson wordlist 60)
+4301) jerrican (+plural - another way of previous word)
+4302) leucotomy (+plural - Kevin Atkinson wordlist 60)
+4303) lexis (changed to lower case - Oxford)
+4304) lexigram (+plural)
+4305) errorless (merged into error)
+4306) catchweight
+4307) listenable (Kevin Atkinson wordlist 60)
+4308) listenability
+4309) linkman + linkmen (Kevin Atkinson wordlist 60)
+4310) lughole (+plural - Kevin Atkinson wordlist 60)
+4311) lulus (added plural - Kevin Atkinson wordlist 60)
+4312) lumpectomy (+plural - Kevin Atkinson wordlist 60)
+4313) meteorologically
+4314) unbearableness
+4315) unbeautiful (+ly)
+4316) unbefitting (+ly +ness)
+4317) unbeholden
+4318) irreligion
+4319) irreligionist
+4320) irreligiously
+4321) irreligiousness
+4322) irremissible
+4323) irremovability
+4324) irremovably
+4325) irreplaceably
+4326) irreproachability
+4327) irreproducible
+4328) bcc (Blind carbon copy - used in e-mails)
+4329) b.c.c. (another way of previous word)
+4330) aberdevine (Collins)
+4331) siskin (Collins)
+4332) uninstal (+s - Oxford: another way in British for uninstall)
+4333) prolongedly
+4334) prolusion
+4335) phonecard (+plural)
+4336) collet
+4337) photocard (Collins)
+4338) photocall (+plural)
+4339) phonematic (Collins - another way of phonemic)
+4340) battlespace (Collins)
+4341) counterbored (merged into counterbore)
+4342) bolthole (+plural)
+4343) necrophile
+4344) necrophilic
+4345) necrophilism
+4346) necrophilist
+4347) necrophobia
+4348) theurgy
+4349) theurgic
+4350) theurgical
+4351) theurgist (+plural)
+4352) Wiccans (added plural)
+4353) rosacea
+4354) asthenia
+4355) asthenic
+4356) cellulitis
+4357) barotrauma
+4358) necrose (+ed)
+4359) necropsies (plural of necropsy)
+4360) PayPal's (added the 's)
+4361) majeure (force majeure)
+4362) benchwork
+4363) dogfood (+ing)
+4364) outgun (+s +ing +ed)
+4365) Dakota's (added the 's)
+4366) Hutterite (+plural)
+4367) cytophotometry (+ic)
+4368) cytophotometer (+plural)
+4369) macronuclear (Collins)
+4370) conjugant (Collins)
+4371) conjurator (Collins)
+4372) conjugality
+4373) unconjugal (Collins)
+4374) sexercise (Collins)
+4375) sexennium (+plural)
+4376) sexennia (another plural of previous word)
+4377) cinquefoil
+4378) sexologic (Collins)
+4379) sexological
+4380) uncontainable
+4381) unconstructive
+4382) muscleman + musclemen (Kevin Atkinson wordlist 60)
+4383) muscly (+ier +iest - Kevin Atkinson wordlist 60)
+4384) weanlings (added plural)
+4385) unwatchful
+4386) unwatered
+4387) myxomatosis (Kevin Atkinson wordlist 60)
+4388) naturism (Kevin Atkinson wordlist 60)
+4389) naturists (add plural - Kevin Atkinson wordlist 60)
+4390) non-official
+4391) nosebags (add plural - Kevin Atkinson wordlist 60)
+4392) nosepiece
+4393) noshery (+plural)
+4394) nosocomial
+4395) electroreception
+4396) electroreceptor
+4397) planktic
+4398) planktonic
+4399) foraminifer (+plural)
+4400) foraminifera (another plural of previous word)
+4401) foraminiferal
+4402) foraminiferan (+plural)
+4403) foraminiferous
+4404) zooxanthella
+4405) zooxanthellae (plural of previous word)
+4406) zooxanthellate
+4407) SCOWL (+'s)
+4408) readme + README (Collins)
+4409) rechipping
+4410) officialese (Kevin Atkinson wordlist 60)
+4411) oilcan (+plural - Kevin Atkinson wordlist 60)
+4412) oilbird (+plural)
+4413) goatsucker (+plural)
+4414) nightjar (+plural)
+4415) chirr (+ing +ed)
+4416) churr (+ing +ed - another way of previous word)
+4417) chiropteran (+plural)
+4418) cardiothoracic
+4419) cardiorespiratory
+4420) sequela
+4421) sequelae (plural of previous word)
+4422) sepulture
+4423) orangish
+4424) orangewood (Collins)
+4425) outperformance
+4426) outworker (+plural - Kevin Atkinson wordlist 60)
+4427) outworld (+er +ers)
+4428) oxtails (added plural - Kevin Atkinson wordlist 60)
+4429) paintball (+s +er +ers +ing)
+4430) paparazzo (Kevin Atkinson wordlist 60)
+4431) phat (Kevin Atkinson wordlist 60)
+4432) Picasso (name)
+4433) Picassoesque
+4434) picaro (+plural)
+4435) pinewood (+plural - Kevin Atkinson wordlist 60)
+4436) pitheads (added plural - Kevin Atkinson wordlist 60)
+4437) playschools (added plural - Kevin Atkinson wordlist 60)
+4438) playmaker (+plural)
+4439) playmaking
+4440) racegoer (added singular)
+4441) racecard (+plural)
+4442) poppets (added plural - Kevin Atkinson wordlist 60)
+4443) postmenopausal (Kevin Atkinson wordlist 60)
+4444) precast (+s +ing)
+4445) adenomatous
+4446) psychoanalytically (Kevin Atkinson wordlist 60)
+4447) bibliotherapy
+4448) punchbag (+plural - Kevin Atkinson wordlist 60)
+4449) headguard (+plural)
+4450) quick-fire
+4451) quietist (+plural +ic)
+4452) ragga
+4453) railcard (+plural - Kevin Atkinson wordlist 60)
+4454) railbus (+plural)
+4455) railcar (+plural)
+4456) springless
+4457) springlet (+plural)
+4458) hornbeams (added plural)
+4459) junglefowl
+4460) backstory (+plural)
+4461) bandfish (+plural)
+4462) agrestic
+4463) agrichemical (+plural - another way of agrochemical)
+4464) apatosaurus
+4465) brachiosaurus
+4466) diplodocus
+4467) daybook (+plural)
+4468) dayboat
+4469) daysailor
+4470) bifold
+4471) windslab (+plural)
+4472) dynode (+plural)
+4473) defervesce (+ed)
+4474) defibrillation
+4475) defibrillate (+ed +ion)
+4476) discographer (+plural)
+4477) discoid (+al)
+4478) venter (+plural)
+4479) ventail
+4480) coeternal (+ally)
+4481) fluoroscopy
+4482) fluoroquinolone
+4483) non-pregnant
+4484) sulfacetamide
+4485) microsurgeons (added plural)
+4486) colossuses (another plural of colossus)
+4487) maldevelopment
+4488) cicatrize (+s +ed +ing +ion -IZE-)
+4489) cicatrise (+s +ed +ing +ion -ISE-)
+4490) cicatricial
+4491) novelly (merged into novel)
+4492) lesbigay (+plural - Oxford: informal)
+4493) lesbo (+plural - Oxford: informal offensive)
+4494) Lesbos (Island in Greece)
+4495) Sprachgefühl
+4496) eggcorn
+4497) advocaat
+4498) caipirinha (+plural)
+4499) cachaca
+4500) chincherinchee (+plural)
+4501) chinaberry (+plural)
+4502) cranesbill (+plural)
+4503) abutilon
+4504) clivia (+s +'s)
+4505) beddable (Oxford: informal)
+4506) fanciable (Oxford: informal)
+4507) culverin (+plural)
+4508) localism (added singular)
+4509) localist (+plural)
+4510) bacteraemia
+4511) untagging
+4512) freemium
+4513) freeride (+ing)
+4514) biathlete (+plural)
+4515) fieldcraft
+4516) fairlead (+plural)
+4517) Bel (another word for Baal)
+4518) Dione (name)
+4519) Enceladus (name)
+4520) mucocutaneous (Collins)
+4521) bpm (abbreviation: beats per minute)
+4522) BPhil
+4523) caravanners (added plural)
+4524) caravanette (+plural)
+4525) coatigan
+4526) all-knowing
+4527) supranationality
+4528) supramundane
+4529) subnuclear
+4530) subnormality
+4531) suboptimally (merged into suboptimal)
+4532) subordinary (+plural)
+4533) subnetwork
+4534) submunition (+plural)
+4535) submultiple (+plural)
+4536) submucosa
+4537) submucosae (plural of previous word)
+4538) gradable
+4539) gradability
+4540) cross-beam (+plural)
+4541) cross-border
+4542) cross-colour
+4543) cross-contaminate (+ed +ing)
+4544) cross-connection (+plural)
+4545) cross-correlate (+ed)
+4546) cross-correlation (+plural)
+4547) i-mode
+4548) I-beam (+plural)
+4549) I-chun (variant of Yichun)
+4550) Yichun (city in China)
+4551) demos
+4552) demoi (plural of previous word)
+4553) demotivation
+4554) goateed (merged into goatee)
+4555) swallow-tailed
+4556) developable
+4557) devein (+ed)
+4558) ethnologic (merged into ethnology)
+4559) ethnologically
+4560) folkloristic
+4561) folklife
+4562) theanthropic
+4563) guncotton
+4564) tagliatelle
+4565) capellini
+4566) fettucine + fettucini (there are three words for this, one was already in)
+4567) fettuccine (fix: removed plural, since this is already a plural word)
+
+
+V2.20 - 1-JAN-2015
+------------------
+4568) scramjet (+plural)
+4569) neurofeedback (Collins)
+4570) astrochemists (added plural)
+4571) astrocompass
+4572) m (abbreviation)
+4573) ratbag (+plural - Kevin Atkinson wordlist 60)
+4574) Rottweiler (+plural - but uppercase - Kevin Atkinson wordlist 60)
+4575) rotters (added plural - Kevin Atkinson wordlist 60)
+4576) roughcast (Kevin Atkinson wordlist 60)
+4577) rowlock (+plural - Kevin Atkinson wordlist 60)
+4578) schoolkid (+plural - Kevin Atkinson wordlist 60)
+4579) exteroceptor (+plural)
+4580) interoceptor (+plural)
+4581) chemoceptors (+plural - Collins)
+4582) proprioceptor (+plural)
+4583) propshaft
+4584) proprioceptively
+4585) bayside
+4586) earthnut
+4587) pignut (+plural)
+4588) androcracy (+plural)
+4589) androcratic
+4590) androcentric
+4591) androcentrism
+4592) partridgeberry (+plural)
+4593) anabiosis
+4594) anabiotic
+4595) chlorosis
+4596) chloroses (plural of previous word)
+4597) chlorotic
+4598) aleurone
+4599) acropetal (+ally)
+4600) basipetal (+ally)
+4601) taproot (+plural)
+4602) tapster (+plural)
+4603) digestif (added singular)
+4604) predigestion
+4605) ptyalin
+4606) Carnivora (plural noun)
+4607) extendability
+4608) extendable
+4609) multiscreen (Collins)
+4610) multirange (Collins)
+4611) nonequilibrium (Collins)
+4612) OODA (loop - military)
+4613) differentia
+4614) differentiae (plural of previous word)
+4615) ecotourism (+'s)
+4616) ecotour (+plural)
+4617) ecotourist (+plural)
+4618) ecotoxicology
+4619) ecotoxicological
+4620) ecotoxicologist
+4621) nontarget (Collins)
+4622) ecotown (+plural)
+4623) arcology (+plural)
+4624) bioremediation
+4625) bioregion (+plural)
+4626) bioregional
+4627) cropland (+plural)
+4628) autoxidation
+4629) autoxidize (+s +ing - IZE)
+4630) autoxidise (+s +ing - ISE)
+4631) autotype (+s)
+4632) autogenesis (Collins)
+4633) autogeny (Collins: another way of previous word)
+4634) autogenetic (Collins)
+4635) electrogenesis (Collins)
+4636) Valium
+4637) Librium
+4638) Orbison (+'s - name)
+4639) intrathecal (+ally)
+4640) intraspecific
+4641) genet (+plural)
+4642) antechapel
+4643) bioplay
+4644) bioplasm (+ic - Collins)
+4645) emoticon (+plural)
+4646) emotionalist (+plural)
+4647) subnational (Collins)
+4648) anti-government
+4649) nongovernment (Collins)
+4650) nongovernmental (Collins)
+4651) supergovernment (Collins)
+4652) governmentalism (Collins)
+4653) incrementalism
+4654) incrementalist (+plural)
+4655) inadaptive (Collins)
+4656) adaption (+plural)
+4657) preadaptive (Collins)
+4658) adaptogen (+plural)
+4659) balneology
+4660) balneological
+4661) balneologist (+plural)
+4662) balneotherapy
+4663) caramelization (-IZE)
+4664) caramelisation (-ISE)
+4665) carambola (+plural)
+4666) eggfruit (Collins)
+4667) satsuma (+plural)
+4668) Satsuma (name of province)
+4669) blackberried (merged into blackberry)
+4670) hackberry (+plural)
+4671) hackathon (+plural - Oxford: informal)
+4672) incurvate (+ed)
+4673) incurvation (+plural)
+4674) railbed (Collins)
+4675) railage
+4676) railless
+4677) bogie (+plural)
+4678) bogland
+4679) Achill (island)
+4680) deuterons (added plural)
+4681) photosystem (+plural)
+4682) phototherapy
+4683) phototransistor
+4684) phototropism
+4685) phototropic
+4686) phototaxis
+4687) phototaxes (plural of previous word)
+4688) phototactic
+4689) heliotropism
+4690) heliotropic
+4691) shitwork (Oxford: vulgar slang)
+4692) wetware
+4693) disincorporate (+ing)
+4694) disinfest (+ing +ion)
+4695) disintermediate (+ed +ion)
+4696) disinvent (+ed)
+4697) disinvite (+ed +ing)
+4698) disinvoltura
+4699) disjoins + disjoined (merged into disjoin)
+4700) ubuntu (+'s - also allow lower case)
+4701) permalink (+plural)
+4702) permaculture
+4703) permadeath
+4704) foldback (Collins)
+4705) readvance (Collins)
+4706) readapt (+s +ing +ed +ion)
+4707) readerly
+4708) undersense (Collins)
+4709) letterset
+4710) intersex (+plural)
+4711) interspace (+s +ed)
+4712) interspinal
+4713) interspinous
+4714) interstadial
+4715) intersegmental (+ally)
+4716) Peterson (+'s - name)
+4717) Jespersen (+'s - name)
+4718) petrogeny
+4719) petrogenesis (another way of the previous word)
+4720) countercurrent (+plural)
+4721) counterfactual (+plural)
+4722) firebug (fixed: fire-bug and added plural)
+4723) firepit
+4724) firedog (+plural)
+4725) palazzo (+plural)
+4726) palazzi (another plural way of the previous word)
+4727) palea
+4728) paleae (plural of previous word)
+4729) extrorse
+4730) introrse
+4731) introspect
+4732) anadromous
+4733) catadromous
+4734) intrigant
+4735) colourable
+4736) cryptococcosis
+4737) cryptococcal
+4738) coolth
+4739) CoolMax (trademark)
+4740) bombazine
+4741) breathability
+4742) Pennsylvanian (+plural)
+4743) chetrum (+plural - currency)
+4744) afghani (+plural - currency)
+4745) avoparcin
+4746) enterovirus (+plural)
+4747) rhinovirus (+plural)
+4748) picornavirus (+plural)
+4749) coronavirus (+plural)
+4750) VS (Veterinary Surgeon)
+4751) vs (Versus)
+4752) vroom (+ed)
+4753) min
+4754) secs (added plural)
+4755) SECAM
+4756) offshoring
+4757) vegetatively
+4758) vegetativeness
+4759) sargassum
+4760) clubroot
+4761) nightclubber (+plural - merged into nightclub)
+4762) mentorship (Collins)
+4763) ballgown (+plural)
+4764) videographers (added plural)
+4765) post-tension
+4766) extensometer (+plural)
+4767) floodwater (+plural)
+4768) floorcloth (+plural)
+4769) posthospital (Collins)
+4770) posttreatment (Collins)
+4771) twerk (+s +ing)
+4772) choreology
+4773) choreologist
+4774) onesie (+plural)
+4775) descriptivist (+plural)
+4776) phenomenalism
+4777) phenomenalist
+4778) phenomenalistic
+4779) physicalism
+4780) physicalist
+4781) physicalistic
+4782) mentalism
+4783) mentalistic
+4784) neonomian (+plural - Collins)
+4785) neonomianism (Collins)
+4786) techno
+4787) soundscape (+plural)
+4788) Thomas's (added the 's)
+4789) semiquaver (added singular)
+4790) semiquinone (+plural)
+4791) phototoxicity (Collins)
+4792) superoxide
+4793) superorder
+4794) supernaturalist (+plural)
+4795) supernormality
+4796) superordinates (added plural)
+4797) superplastic
+4798) superplasticity
+4799) supersale (Collins)
+4800) superreal (Collins)
+4801) supermale (Collins)
+4802) supersalt (Collins)
+4803) superjet (Collins)
+4804) supersell (+er - Collins)
+4805) superfusion
+4806) superfood (+plural)
+4807) superfluidity
+4808) superfluid (+plural)
+4809) superfatted
+4810) auriculate
+4811) auriculotherapy
+4812) allopath
+4813) catmint (+'s)
+4814) catlick (Oxford: informal)
+4815) circumvallate (+ed +ing)
+4816) play's (added the 's)
+4817) venography
+4818) venographic
+4819) venographically
+4820) extravasation (merged into extravasate)
+4821) vasculature
+4822) cross-promotion
+4823) cross-promote (+ed)
+4824) cross-question (+ing +ed)
+4825) home-cooked
+4826) seedeater (fixed: seed-eater)
+4827) bowerbird (+plural)
+4828) brassfounder (+plural - Collins)
+4829) coppernob (+plural - Oxford: informal)
+4830) flybridge
+4831) skybridge (Collins)
+4832) fly-by (+plural "fly-bys")
+4833) arm-wrestling
+4834) arm-wrestle
+4835) audax (+plural)
+4836) valorousness (merged into valorous)
+4837) venturous (+ness)
+4838) temerarious (+ness)
+4839) mesothelioma (+plural)
+4840) mesotherapy
+4841) mesothorax
+4842) mesothoracic
+4843) metathorax
+4844) metathoracic
+4845) interneural (Collins)
+4846) stereoregular (Collins)
+4847) stereometry
+4848) stereological (+ally - Collins)
+4849) stereogram (+plural)
+4850) stereocamera (+plural)
+4851) stereognosis
+4852) stereognostic
+4853) thermic
+4854) interneuron
+4855) interneurone (another way of previous word)
+4856) interneuronal
+4857) internode (+plural)
+4858) depaint (Collins)
+4859) dependingly (Collins)
+4860) depravingly (Collins)
+4861) depravation (merged into deprave - Collins)
+4862) depreciatory
+4863) Németh (+'s - name)
+4864) László (+'s - name)
+4865) cryptonymous
+4866) monorchid (+plural)
+4867) monorchidism
+4868) cathodoluminescence
+4869) anisotropically
+4870) undrained
+4871) metagenesis
+4872) metagenetic
+4873) metageneses (plural of metagenesis - Collins)
+4874) muniment (+plural)
+4875) alienage
+4876) spondylolysis (Collins)
+4877) agammaglobulinaemia
+4878) agammaglobulinemia (another way of previous word)
+4879) antepartum
+4880) intrapartum (Collins)
+4881) intrasexual (Collins)
+4882) bicephalous
+4883) electronica
+4884) craniofacial
+4885) craniology
+4886) craniological
+4887) craniologist (+plural)
+4888) overexcitable
+4889) overexcitement
+4890) Napster (+'s - software)
+4891) scattergun
+4892) scattershot
+4893) scatty (+ier +iest +ly +ness - Oxford: informal)
+4894) impactful
+4895) frameable + frameless (merged into frame)
+4896) Xeon
+4897) Centrino
+4898) vPro
+4899) Itanium (+'s)
+4900) microclimate (+s +ic)
+4901) microclimatically
+4902) micropower
+4903) microprobe (+plural)
+4904) macrocephalic
+4905) macrocephalous (another way of previous word)
+4906) macrocephaly
+4907) cerebrovascular
+4908) intracranial (+ly)
+4909) intractableness
+4910) intradermal (+ly)
+4911) micropropagation
+4912) micropterous
+4913) microRNA
+4914) microscooter (+plural)
+4915) yo-yos (added plural)
+4916) yo-yoing, yo-yoed (verb - merged into yo-yo)
+4917) yo-yoes (verb)
+4918) foldable (merged into fold)
+4919) microampere (Collins)
+4920) Thomist (+plural)
+4921) Thomistic
+4922) covenantal
+4923) covenantor (+plural +'s)
+4924) scorelines (added plural - Kevin Atkinson wordlist 60)
+4925) scorekeeping
+4926) scrutineer (added singular - Kevin Atkinson wordlist 60)
+4927) shambolic (+ally - Kevin Atkinson wordlist 60)
+4928) sharpish (Kevin Atkinson wordlist 60)
+4929) shebeen (+plural - Kevin Atkinson wordlist 60)
+4930) sheetlike (Collins - Kevin Atkinson wordlist 60)
+4931) shitload (Oxford: vulgar slang - Kevin Atkinson wordlist 60)
+4932) shit-faced (Oxford: vulgar slang - Kevin Atkinson wordlist 60)
+4933) bristlebird (+plural)
+4934) birdling (+plural)
+4935) shh (Kevin Atkinson wordlist 60)
+4936) sh (another way of previous word)
+4937) acupoint (+plural)
+4938) aromatherapeutic
+4939) showerproof (+ed +ing)
+4940) circlip (+plural)
+4941) desuperheater (+plural)
+4942) Interweb
+4943) intervocalically
+4944) obstruent (+plural)
+4945) sonorant (+plural)
+4946) atonic
+4947) atony
+4948) homorganic
+4949) homophile (+plural)
+4050) servery (+plural - Kevin Atkinson wordlist 60)
+4051) smoocher (+plural - merged into smooch)
+4052) smoochy (+ier +iest)
+4053) weirdo (+plural +'s - Kevin Atkinson wordlist 40)
+4054) Mbit (Collins)
+4055) XMP
+4056) SNR (signal-to-noise ratio)
+4057) THz
+4058) skinful (Kevin Atkinson wordlist 60)
+4059) skinfold (+plural)
+4060) subscapular (Collins)
+4061) smokily (merged into smoky)
+4062) smokey (another way of smoky - Kevin Atkinson wordlist 60)
+4063) snog (+s +ing +ed +er +ers - Kevin Atkinson wordlist 60)
+4064) softback (+plural - Kevin Atkinson wordlist 60)
+4065) unremitted (+ly - Collins)
+4066) slutty
+4067) sluttishness (merged into sluttish)
+4068) softcover (Kevin Atkinson wordlist 60)
+4069) songwriting (Kevin Atkinson wordlist 60)
+4070) sprog (+s +ing +ed - Kevin Atkinson wordlist 60)
+4071) spiv (+plural - Kevin Atkinson wordlist 60)
+4072) spivvish
+4073) spivvy (+ier +iest)
+4074) splake
+4075) splanchnopleure
+4076) endoblast (+ic - Collins)
+4077) splashback (+plural)
+4078) splashboard (+plural)
+4079) splatterpunk (+plural)
+4080) spleenwort (+plural)
+4081) polypody (+plural)
+4082) bryophyte (+plural)
+4083) trichome (+plural)
+4084) trichology
+4085) trichological
+4086) trichologist (+plural)
+4087) stallholder (added singular - Kevin Atkinson wordlist 60)
+4088) stallage
+4089) pontage (Collins)
+4090) lastage (Collins)
+4091) arborist
+4092) eyebright
+4093) arrowgrass
+4094) barrenwort (+plural)
+4095) bioadhesive (+plural)
+4096) buccal
+4097) gingiva
+4098) gingivae (plural of previous word)
+4099) radula
+4100) radulae (plural of previous word)
+4101) radular
+4102) graminivorous
+4103) grammalogue
+4104) anteverted
+4105) anteroposterior
+4106) anterolateral
+4107) anterograde
+4108) Atkins's (added the 's)
+4109) churchianity (Collins)
+4110) hiya (Oxford: informal)
+4111) HIV-negative
+4112) HIV-positive
+4113) acidimetry (+ic)
+4114) acidimetrical
+4115) acidimetrically
+4116) conjunctional
+4117) amphibologies (added plural)
+4118) statementing + statemented (Kevin Atkinson wordlist 60)
+4119) stationmasters (added plural - Kevin Atkinson wordlist 60)
+4120) Lankan (+plural - Sri Lanka)
+4121) sundress (+plural - Kevin Atkinson wordlist 60)
+4122) sundrops
+4123) suntrap (+plural - Kevin Atkinson wordlist 60)
+4124) summat (Kevin Atkinson wordlist 60)
+4125) suppertime (Collins - Kevin Atkinson wordlist 60)
+4126) supremos (added plural troppy
+4127) confederal
+4128) collectorate
+4129) centrism
+4130) strikebound (Collins - Kevin Atkinson wordlist 60)
+4131) sweatsuit (+plural - Kevin Atkinson wordlist 60)
+4132) succubi (plural of succubus - Kevin Atkinson wordlist 60)
+4133) stripey (another way of stripy - Kevin Atkinson wordlist 60)
+4134) stripier
+4135) stripiest
+4136) strivers (added plural)
+4137) lamish (Collins)
+4138) spambot (+plural - Collins)
+4139) spammie (Collins)
+4140) pregnable
+4141) preglacial
+4142) pregnability (Collins)
+4143) pregrowth (Collins)
+4144) preguide (Collins)
+4145) prehension
+4146) prehistorian (+plural)
+4147) prehuman (+plural)
+4148) brainbox (+plural - Oxford: informal)
+4149) troppy (+ier +iest +ly +ness - Kevin Atkinson wordlist 60)
+4150) strophanthin
+4151) analeptic (+plural)
+4152) meperidine
+4153) prolepsis
+4154) prolepses (plural of previous word)
+4155) proleptic
+4156) propertyless (Collins)
+4157) Avernus (lake in Italy)
+4158) stunners (added plural - Kevin Atkinson wordlist 60)
+4159) stunsail (+plural)
+4160) tarty (+ier +iest +ly +ness)
+4161) tarweed (+plural)
+4162) forb (+plural)
+4163) betatrons (added plural)
+4164) thermopiles (added plural)
+4165) chromakey
+4166) tatami (+s +'s - Kevin Atkinson wordlist 60)
+4167) clapperboard
+4168) telesales (Kevin Atkinson wordlist 60)
+4169) telerecordings (added plural)
+4170) telework
+4171) televisually (merged into televisual)
+4172) keypal (+plural - Oxford: informal)
+4173) penfriend (+plural)
+4174) twinset (+plural - Kevin Atkinson wordlist 60)
+4175) zookeeper (+plural +'s - Kevin Atkinson wordlist 60)
+4176) zloties (added plural - Kevin Atkinson wordlist 60)
+4177) zlotys (another plural of previous word)
+4178) zine (+plural - Kevin Atkinson wordlist 60)
+4179) ya (Kevin Atkinson wordlist 60)
+4180) Y2K (year 2000)
+4181) clickable
+4182) clickbait
+4183) wordsmith (+plural - Kevin Atkinson wordlist 60)
+4184) vapourware
+4185) overhype (+ed)
+4186) bibliolater (+plural)
+4187) bibliomancy
+4188) Ching (I Ching)
+4189) ching
+4190) bibliomania
+4191) bibliomaniac (+'s)
+4192) bibliophilic
+4193) bibliophily
+4194) bibliopole (+plural)
+4195) bibliometric (+plural)
+4196) bibliomane (+plural)
+4197) wing-like
+4198) downstroke
+4199) downswing (+plural)
+4200) waybill (+s +'s - Kevin Atkinson wordlist 60)
+4201) watchable (Kevin Atkinson wordlist 60)
+4202) watchability
+4203) weedkiller (+plural - Kevin Atkinson wordlist 60)
+4204) weedicide (+plural)
+4205) weedgrown
+4206) weebill (+plural)
+4207) apostlebird (+plural)
+4208) currawong (+plural)
+4209) weeder (+plural)
+4210) weedless (merged into weed - Kevin Atkinson wordlist 60)
+4211) warm-blooded (+ness)
+4212) warmblood (+plural)
+4213) vulturine
+4214) vulturish
+4215) vulturous (Kevin Atkinson wordlist 60)
+4216) boobook (+plural)
+4217) blackpoll (+plural)
+4218) watchstrap (+plural - Collins - Kevin Atkinson wordlist 60)
+4219) voicelessness (merged into voiceless - Kevin Atkinson wordlist 60)
+4220) vigesimal (Kevin Atkinson wordlist 60)
+4221) centesimal (+ly)
+4222) vincible (Kevin Atkinson wordlist 60)
+4223) vincibility
+4224) urogenital (Kevin Atkinson wordlist 60)
+4225) urography
+4226) urogram (+plural)
+4227) urodynamic (+plural)
+4228) varix
+4229) varices (plural of previous word)
+4230) endocarditis
+4231) endocarditic
+4232) unsmart (Collins)
+
+
+V2.21 - 1-FEB-2015
+------------------
+4233) Crowley's (added the 's)
+4234) recursivity (+plural - Wiktionary)
+4235) recursiveness (Wiktionary)
+4236) she-male (+plural)
+4237) pseudocode (+plural +ed - Wiktionary)
+4238) pseudocopulation
+4239) scumbag (+plural - Oxford: informal)
+4240) heterosocial (Collins)
+4241) heterosociality (Collins)
+4242) homosocial (Collins)
+4243) homosociality (Collins)
+4244) homosexualist (+plural - Collins)
+4245) homosex (Collins)
+4246) heteropteran (+plural)
+4247) heteropterous
+4248) limewash (+plural +ing +ed)
+4249) limescale
+4250) BMWs (added plural)
+4251) limepit
+4252) Robben (name of island)
+4253) Bornholm (name of island)
+4254) born-free (+plural)
+4255) Bornean
+4256) quoll (+plural)
+4257) monkery (Oxford: derogatory)
+4258) zealotry
+4259) deseed (+ed)
+4260) deseeder (+plural)
+4261) terotechnology
+4262) terotechnological
+4263) terotechnologist (+plural)
+4264) microtechnology
+4265) microtechnological
+4266) waveguide (+plural)
+4267) Adidas (+'s - name)
+4268) geotechnology (Collins)
+4269) femtosecond (+plural)
+4270) fs (abbreviation of previous word)
+4271) femtocell
+4272) unfought (Collins)
+4273) unforked (Collins)
+4274) unforgivingness (Collins)
+4275) refigure (Collins - +plural +ing +ed - Wiktionary)
+4276) refire (Collins - +plural +ing +ed - Wiktionary)
+4277) dentary (+plural)
+4278) readd (Collins - +plural +ing +ed - Wiktionary)
+4279) rebottle (Collins - +plural +ing +ed +er +ers - Wiktionary)
+4280) hypertrophic (merged into hypertrophy)
+4281) Barbie (+plural +'s - name)
+4282) guidable
+4283) cutscene (+plural)
+4284) whatsit (+plural - Kevin Atkinson wordlist 60)
+4285) whee (Kevin Atkinson wordlist 60)
+4286) horseshed
+4287) Fenimore (+'s - name)
+4288) coopery (+plural)
+4289) peridot (+plural)
+4290) peridium
+4291) peridia (plural of previous word)
+4292) galea
+4293) galeae (plural of previous word)
+4294) low-carb (Oxford: informal)
+4295) low-class
+4296) yonks (Kevin Atkinson wordlist 60)
+4297) Zinfandel (+'s +plural)
+4298) zonal (+ly)
+4299) rack-and-pinion
+4300) fishplate (+plural - fixed: fish-plate)
+4301) bodyshell (+plural)
+4302) switchable (merged into switch - Kevin Atkinson wordlist 40)
+4303) postdoc (+plural - Kevin Atkinson wordlist 40)
+4304) postcolonialism
+4305) postcolonialist
+4306) postcoded (merged into postcode)
+4307) mailboat (+plural)
+4308) Percy's (added the 's)
+4309) postwoman
+4310) postwomen (plural of previous word)
+4311) Boulogne (+'s - name)
+4312) synovial
+4313) flexion
+4314) flection (another way of previous word)
+4315) dorsiflex (+plural +ing +ed +ion)
+4316) electromyograph
+4317) electromyography
+4318) chemoprevention (Collins)
+4319) Palomar (+'s - name)
+4320) serine
+4321) bugbane (+plural)
+4322) squawroot (+plural)
+4323) tidemark (+plural)
+4324) tideline (+plural)
+4325) saltings (added plural)
+4326) geodata
+4327) neoclassicist (+plural)
+4328) neorealism
+4329) neorealist (+plural)
+4330) academicism
+4331) academism (another way of previous word)
+4332) academicals (added plural)
+4333) Picasso's (added the 's)
+4334) iconology
+4335) iconological
+4336) iconolatry
+4337) deconstruct (+plural +ing +ed +ive)
+4338) outsized (merged into outsize)
+4339) should've
+4340) corporatize (+plural +ed +ing +ion - IZE)
+4341) corporatise (+plural +ed +ing +ion - ISE)
+4342) hereditament (+plural)
+4343) hereditarily + hereditariness (merged into hereditary)
+4344) hereditarian (+plural)
+4345) hereditarianism
+4346) nanotechnological
+4347) nanotechnologist (+plural)
+4348) neurovascular (Collins)
+4349) nanocomposite (+plural)
+4350) undersize
+4351) undershrub (+plural)
+4352) kneeled (another past of kneel)
+4353) kneehole
+4354) knee-highs (added plural)
+4355) cerebroside (+plural)
+4356) workup (+plural)
+4357) jackstay
+4358) Tobruk (+'s - name of place)
+4359) woosh (+plural +ing +ed - another way of whoosh)
+4360) Jacinto (+'s - name)
+4361) starboarding (merged into starboard)
+4362) bioprospecting
+4363) bioprospector (+plural)
+4364) Kamchatka (+'s - name)
+4365) flamethrowers (added plural)
+4366) laserdiscs (added plural)
+4367) Betacam (trademark)
+4368) Betamax (trademark)
+4369) PlayStation (+plural)
+4370) breakfront
+4371) Easton (+'s - name)
+4372) geochronological
+4373) geochronologist (+plural)
+4374) declivitous
+4375) bluntish (Collins)
+4376) subchapter (+plural - Collins)
+4377) cosupervisor (+plural - Wiktionary)
+4378) supervoltage (+plural)
+4379) cosupervision (Wiktionary)
+4380) cosupervise (+plural +ing +ed - Wiktionary)
+4381) resect (+ed +able)
+4382) resectional
+4383) resectionist
+4384) microbiologically (Collins)
+4385) microbiologic (Collins)
+4386) Cmd. (abbreviation - UK - Command Paper - 4th series)
+4387) Cmnd. (abbreviation - UK - Command Paper - 5th series)
+4388) handgrip (+plural)
+4389) cyanoacrylate (+plural)
+4390) photostimulation (+plural - Wiktionary)
+4391) chromophore (+plural)
+4392) chromophoric
+4393) chromoplast (+plural)
+4394) exoatmospheric
+4395) exobiological
+4396) exobiologist (+plural)
+4397) ethnolinguistics
+4398) ethnolinguist (+plural)
+4399) ethnohistory
+4400) ethnohistorian (+plural)
+4401) ethnohistoric
+4402) ethnohistorical
+4403) ethnoscience
+4404) ethogram (+plural)
+4405) twinflower (+plural)
+4406) townland (+plural)
+4407) chronometry
+4408) chronometrical
+4409) chronometrically
+4410) chronotherapy
+4411) chronostratigraphy (+ic)
+4412) substage
+4413) subspecific
+4414) subsonically
+4415) deflagration
+4416) ketones (added plural)
+4417) ketonic
+4418) ferrocene (+plural)
+4419) ferroconcrete
+4420) ferroelectrics (added plural)
+4421) ferroelectricity
+4422) ferromagnetism
+4423) Zeeman (Zeeman effect)
+4424) atomicities (added plural)
+4425) multiagent (+plural - Wiktionary)
+4426) non-typical
+4427) non-transparency
+4428) non-U (Oxford: informal)
+4429) non-urban
+4430) non-use
+4431) non-validity
+4432) non-variable
+4433) non-vintage
+4434) non-word (added singular)
+4435) irregardless (Oxford: informal)
+4436) irrefutability
+4437) refutability (Collins)
+4438) regalism
+4439) regalist (+plural)
+4440) canonry (+plural)
+4441) Bastogne (name of place)
+4442) Junagarh (name of place)
+4443) flaunching
+4444) leadwork (+plural - Collins)
+4445) flat-woven
+4446) flat-weave
+4447) dhurrie (+plural)
+4448) durrie (+plural - another way of previous word)
+4449) awardee (+plural)
+4450) Waterville (name of place)
+4451) award-winning
+4452) traumatization (-IZE)
+4453) traumatisation (-ISE)
+4454) traumatism
+4455) multicentre (Collins)
+4456) multicentral (Collins)
+4457) crossmatch (+plural +ing +ed)
+4458) posttransfusion (Collins)
+4459) eponymously (merged into eponymous)
+4460) Lanchester (+'s - name)
+4461) routinism
+4462) routinist (+plural)
+4463) routineness (merged into routine)
+4464) streamlet (+plural)
+4465) Zealander (added singular)
+4466) psychosurgery
+4467) psychosurgical
+4468) radiochemist (+plural)
+4469) bohrium
+4470) permeance (+plural)
+4471) electropositive
+4472) electronegativity (+plural)
+4473) electrophilic
+4474) electrophile (+plural)
+4475) nucleonic (+plural)
+4476) nucleophilic
+4477) nucleophile (+plural)
+4478) nucleoplasm
+4479) nucleoprotein (+plural)
+4480) nucleosome (+plural)
+4481) nucleosomal
+4482) overprescribe (+s +ing +ed +ion)
+4483) titanically
+4484) Cicciolina (+'s - name)
+4485) pornocracy (Collins)
+4486) voguishly + voguishness (merged into voguish - Collins)
+4487) prenominal (+ly - Collins)
+4488) curricula vitae (removed since it was two words)
+4489) curriculum vitae (removed since it was two words)
+4490) curriculums (another plural way of curriculum)
+4491) gradience
+4492) ethnomethodological
+4493) ethnomethodologist (+plural)
+4494) avunculate
+4495) queendom
+4496) queenless
+4497) queenlike
+4498) queenship
+4499) filamented (merged into filament)
+4500) microelectrode (+plural - Collins)
+4501) astrometry (+ic)
+4502) Gaia (+'s - name)
+4503) Gaian (+plural)
+4504) ethicality
+4505) primitivist (+plural)
+4506) supervisee (+plural - Collins)
+4507) re-enacts + re-enacted + re-enacting (merged into re-enact)
+4508) re-enactment (+plural)
+4509) re-enactor (+plural)
+4510) handlist (+plural)
+4511) Barack (name)
+4512) McKinsey (+'s - name)
+4513) NGOs (added plural)
+4514) Croatians (added plural)
+4515) Armenians (added plural)
+4516) Assyrians (added plural)
+4517) Encaenia
+4518) succulently (merged into succulent)
+4519) imbibition
+4520) shadowland (+plural)
+4521) shadowgraphs (added plural)
+4522) radiographs (added plural)
+4523) radiographed (added ed)
+4524) radiographically
+4525) radioimmunoassay
+4526) radioisotopic
+4527) andrology
+4528) andrologist
+4529) areology
+4530) areological
+4531) areologist (+plural)
+4532) areole (+plural)
+4533) glochid (+plural)
+4534) discommodious
+4535) discommodity
+4536) sassy (+ier +iest +ly +ness - Oxford: informal)
+4537) WWI (World War I)
+4538) NYC (New York City)
+4539) bushbuck (+plural)
+4540) waterbuck (+plural)
+4541) bonobo (+plural)
+4542) capuchin (+plural)
+4543) Capuchin (+plural - upper case - Franciscan order)
+4544) Pio (+'s - name)
+4545) stigmatist
+4546) Francesco's (added the 's)
+4547) sublanguage (+plural)
+4548) sublateral
+4549) subkingdom (+plural)
+4550) Milton's (added the 's)
+4551) subjunctively
+4552) sublate (+plural +ed +ing +ion)
+4553) egomaniacal
+4554) egosurf (+plural +ed +ing - Oxford: informal)
+4555) Baikal (+'s - name of lake)
+4556) Baykal (+'s - another way of the previous word)
+4557) Bresenham (+'s - name)
+4558) milfoil (+plural)
+4559) allamanda (+plural)
+4560) plumeria (+plural)
+4561) voiceful
+4562) voice-activated
+4563) glassmaking (fixed: glass-making)
+4564) glassmaker (+plural)
+4565) glasspaper (fixed: glass-paper)
+4566) fiddleback
+4567) saddleback (+plural +ed)
+4568) birdlife (Collins)
+4569) xix + XIX (Roman numeral - 19)
+4570) Cyanobacteria (upper case)
+4571) cyanobacteria (lower case)
+4572) cyanobacterial
+4573) stromatolite (+plural)
+4574) apeman
+4575) apemen (plural of previous word)
+4576) coelurosaur (+plural)
+4577) integumental
+4578) integumentary
+4579) reconstructable
+4580) reconstructive
+4581) reconstructor
+4582) Egyptological
+4583) Egyptologist (+plural)
+4584) Tutankhamun (another way of Tutankhamen)
+4585) centrefire
+4586) varnisher (+plural)
+4587) sealers (added plural)
+4588) photocomposition
+4589) photocurrent
+4590) photodegradable
+4591) lookism
+4592) lookist
+4593) essentialism
+4594) Jesuitical (+ly)
+4595) south-west (fixed: south-West)
+4596) south-east (fixed: south-East)
+4597) north-east (fixed: north-East)
+4598) north-eastern (fixed: north-Eastern)
+4599) north-west (fixed: north-West)
+4600) north-western (fixed: north-Western)
+4601) south-eastern (fixed: south-Eastern)
+4602) southwardly (merged into southward)
+4603) fatling
+4604) Gatlings (added plural - Gatling gun)
+4605) stowable (Collins)
+4606) outlands (added plural)
+4607) photochromic
+4608) photochromism
+4609) viologen (+plural)
+4610) photo-oxidation
+4611) irradiance
+4612) anti-magnetic
+4613) tweeze (+plural +ed +ing)
+4614) tweezer (added singular)
+4615) post-date (+plural +ed +ing - fixed: postdate)
+4616) hybridity
+4617) Ludwig's (added the 's)
+4618) rotifers (added plural)
+4619) multicell (+ed - Collins)
+4620) telson (+plural)
+4621) setiferous (Collins)
+4622) setigerous (Collins - another way of previous word)
+4623) Telstar (+'s - name of satellite)
+4624) Ishtar (+'s - name)
+4625) Qataris (added plural)
+4626) VM (+plural - Virtual Machine - Wiktionary)
+4627) V-mail
+4628) ATMs (added plural)
+4629) automagically (Oxford: informal)
+4630) autologous
+4631) decompensation
+4632) decompensated
+4633) hepatoma (+plural)
+4634) hepatomata (another plural of previous word)
+4635) hepatopancreas
+4636) mouthpart (+plural)
+4637) foregut (+plural)
+4638) vitellogenin
+4639) xenobiotic (+plural)
+4640) recompilable (Wiktionary)
+4641) compilatory (Collins)
+4642) recompact (+plural +ing +ed - Wiktionary)
+4643) GUIs (added plural - Wiktionary)
+4644) burnoose (removed as it was American)
+4645) burnous (British way of previous word)
+4646) buttonhook (+plural)
+4647) downfield
+4648) Bukowski (+'s - name)
+4649) Xbox (+plural - video game console - Wiktionary)
+4650) Matroska
+4651) FLAC (+'s)
+4652) HEVC (+'s)
+4653) MP3s (added plural)
+4654) WAV (upper case)
+4655) wav (lower case)
+4656) terascale (Wiktionary)
+4657) teraflop (+plural)
+4658) electronvolt (+plural)
+4659) eV (abbreviation of previous word)
+4660) electro-oculogram
+4661) electro-optic (+plural)
+4662) electro-optical
+4663) agarose
+4664) MBA's + MBAs (merged into MBA)
+4665) daywork (+er +ers)
+4666) parasitize (+plural +ed +ing +ion - IZE)
+4667) parasitize (+plural +ed +ing +ion - ISE)
+4668) Rothstein (+'s - name)
+4669) greenling (+plural)
+4670) greenmailer (+plural)
+4671) Garner (+'s - name)
+4672) Greenaway (+'s - name)
+4673) Pietro (name)
+4674) annexationist (+plural)
+4675) Zululand (name of place)
+4676) KwaZulu-Natal (name of place)
+4677) Indo-European
+4678) Proto-Indo-European
+4679) Indic
+4680) indican
+4681) bilirubin
+4682) perimenopause
+4683) perimenopausal
+4684) undescended
+4685) anaphylaxis
+4686) telemedicine
+4687) psychophysiological
+4688) psychodynamic (+plural)
+4689) psychodynamically
+4690) antipyretic (+plural)
+4691) hyperthermia
+4692) hyperthermic
+4693) bootloaders (added plural - Wiktionary)
+4694) UEFI (Wiktionary)
+4695) EFI
+4696) sportsperson (+plural)
+4697) sportspeople (another plural of previous word)
+4698) sportswomanship
+4699) sportswriter (+plural)
+4700) doubletons (added plural)
+4701) dumortierite
+4702) hydroxyapatite
+4703) hydrometric
+4704) winemaking
+4705) streamflow (+plural)
+4706) snowpack (+plural)
+4707) snowmobiling + snowmobiled + er + ers (merged into snowmobile)
+4708) groomer (+plural - merged into groom)
+4709) snowcat (+plural)
+4710) heli-ski (+ing +er +ers)
+4711) vrooming (merged into vroom)
+4712) Vince's (added the 's)
+4713) Neale (name)
+4714) frequentative
+4715) benefactive (+plural)
+4716) grammaticalize (+ed +ion - IZE)
+4717) grammaticalise (+ed +ion - ISE)
+4718) Walkman (+plural)
+4719) Walkmen (another plural of previous word)
+4720) microchipping + microchipped (merged into microchip)
+4721) woodchip (+plural)
+4722) Collingwood (+'s - name)
+4723) pavers (added plural)
+4724) teahouse (+plural)
+4725) Teagarden (+'s - name)
+4726) contradance (+plural)
+4727) coffee-houses (removed - Oxford: it has no hyphen, two words)
+4728) Megan (+'s - name)
+4829) megamouth (+'s)
+4830) megaphonic (merged into megaphone)
+4831) Babygro (+plural - trademark)
+4832) babyishly + babyishness (merged into babyish)
+4833) girly (another way of girlie + plural)
+4834) malaguetta (+plural)
+4835) malagueta (+plural - another way of the previous word)
+4836) metasomatism
+4837) metasomatic
+4838) metasomatize (+ed - IZE)
+4839) metasomatize (+ed - ISE)
+4840) emplaced (merged into emplace)
+4841) pluton (+plural)
+4842) plutocratically
+4943) backport (+plural +ing +ed - Wiktionary)
+4944) demoscene (Collins)
+4945) autosuggestion
+4946) completist (+plural)
+4947) autostereoscopy
+4948) autosaves (merged into autosave)
+4949) haplotype (+plural)
+4950) cardio (Oxford: mass noun informal)
+4951) goalball
+4952) Paralympic (+plural)
+4953) Paralympian (+plural)
+4954) goalhanger (+plural)
+4955) Kristine (name)
+4956) Hawaiian's (added the 's)
+4957) pseudosciences (added plural)
+4958) pseudoscientists (added plural)
+4959) Scientologist (+plural)
+4960) symbology
+4961) hagiology
+4962) hagiological
+4963) hagiologist (+plural)
+4964) demonize (+plural +ed +ing - IZE)
+4965) demonise (+plural +ed +ing - ISE)
+4966) demonization ( - IZE)
+4967) demonisation ( - ISE)
+4968) infographics (added plural)
+4969) infolded
+4970) infomania
+4971) infomaniac (+plural)
+4972) infomediaries (added plural)
+4973) infomercial (removed since it is chiefly American)
+4974) infonauts (added plural)
+4975) Rhode's (added the 's)
+4976) subplot (fixed: sub-plot)
+4977) subparallel
+4978) subphylum
+4979) Eutheria
+4980) eutherian (+plural)
+4981) lamella
+4982) lamellae (plural of previous word)
+4983) lamellar
+4984) lamellate
+4985) lamelliform
+4986) lamellose
+4987) pHs (added plural)
+4988) cuvette (+plural)
+4989) acetylcholinesterase
+4990) cryoglobulin (+plural)
+4991) glucoside (+plural +ic)
+4992) geomatic (+plural)
+4993) palaeomagnetism
+4994) palaeomagnetic
+4995) declinism
+4996) Pitchford (+'s - name)
+4997) footplates (added plural)
+4998) diesel-electrics (added plural)
+4999) batfish (+plural)
+5000) bitterling (+plural)
+5001) exoskeletal
+5002) exfoliate (+plural +ing +ed +ion)
+5003) exfoliative
+5004) exfoliator (+plural)
+5005) anticellulite (Collins)
+5006) endoskeleton (+plural)
+5007) endoskeletal
+5008) endoscopically
+5009) endoscopist (+plural)
+5010) gastroscope (+plural +ic)
+5011) gastroscopy
+5012) bronchoscope (+plural)
+5013) bronchoscopy
+5014) pneumothorax
+5015) reinflate (+plural +ed +ing +ion)
+5016) reinflatable
+5017) reinforcers (added plural)
+5018) rebar
+5019) positioner (+plural)
+5020) declarant (+plural +'s)
+5021) transexual (+plural +'s - another way of transsexual)
+5022) noncultivated (Collins)
+5023) Rackham (+'s - name)
+5024) summiteer (+plural)
+5025) orienteer (+plural +ed +ing)
+5026) backcrawl
+5027) dilophosaurus
+5028) earthstar
+5029) earthshine
+5030) earthlight
+5031) earthslip (+plural)
+5032) multiplicate (Collins)
+5033) multipartite
+5034) metazoan (+plural)
+5035) sexpartite
+5036) partite
+5037) slaveholder (+plural)
+5038) slaveholding (+plural)
+5039) genuflector (+plural)
+5040) stomper (+plural)
+5041) stompy (+ier +iest)
+5042) synth (+plural - Oxford: informal)
+5043) synthy
+5044) goth (added lower case)
+5045) emo (+plural)
+5046) emocore (another way of the previous word)
+5047) deflexed
+5048) inflexed
+5049) hypoallergenic (fixed: hypo-allergenic)
+5050) cosmeceutical (+plural)
+5051) glycolic
+5052) glycollic
+5053) retinol
+5054) Strawson (+'s - name)
+5055) squillion (+plural - Oxford: informal)
+5056) squillionaire (+plural - Oxford: informal)
+5057) squinancywort
+5058) greenweed
+5059) candytuft (+plural)
+5060) coralberry (+plural)
+5061) narcissuses (plural of narcissus)
+5062) narcissi (another plural of narcissus)
+5063) narcolepsy
+5064) narcoleptics (added plural)
+5065) hyperreal
+5066) hyperrealism
+5067) hyperrealist
+5068) hyperrealistic
+5069) hyperreality
+5070) phantasmagorical
+5071) stum (+plural +ing +ed)
+5072) washtub (+plural)
+5073) twin-tub (+plural)
+5074) twirly (+ier +iest)
+5075) gumshield (+plural)
+5076) Flagler (+'s - name)
+5077) flagitious (+ly +ness)
+5078) suppositious (+ly +ness)
+5079) confessant (+'s +plural)
+5080) skilfish (+plural)
+5081) skijoring
+5082) skijorer (+plural)
+5083) clingstone (+plural)
+5084) clingfish (+plural)
+5085) beachy (+ier +iest +ness)
+5086) creamware
+5087) objectivism
+5088) objectivist (+plural)
+5089) objectivistic
+5090) Bayes (+'s - name)
+5091) Jaynes (+'s - name)
+5092) deerhound (+plural)
+5093) saluki (+plural)
+5094) Ibizan (Ibizan hound)
+5095) Tartarus (+'s - name)
+5096) Tartarean
+5097) Ixion (+'s - name)
+5098) Hera (+'s - name)
+5099) Cronus (+'s - name)
+5100) Kronos (+'s - name)
+5101) Gaea (+'s - name - another way of Gaia)
+5102) busway (+plural)
+5103) Jakarta's (added the 's)
+5104) premiere (+plural +ed +ing)
+5105) Pusan (name)
+5106) bedsock (+plural)
+5107) copywriting
+5108) signwriter (+plural)
+5109) signwriting
+5110) vinyls (added plural)
+5111) housepainter (+plural - Collins)
+5112) blowbacks (added plural)
+5113) unendingness (merged into unending)
+5114) trackway (+plural)
+5115) souterrain (+plural)
+5116) Epipalaeolithic
+5117) epiphenomenal
+5118) epinician
+5119) unendowed
+5120) unenergetic
+5121) unengaged
+5122) unenjoyable
+5123) un-English
+5124) unenlightenment
+5125) ectoderm (+al)
+5126) endoderm (+al)
+5127) tetrapods (added plural)
+5128) spastically
+5129) spasticity
+5130) overactive (fixed: over-active)
+5131) overactivity (fixed: over-activity)
+5132) Kayla (added 's - name)
+5133) holier-than-thou
+5134) Dalai (name: Dalai Lama)
+5135) Hornblower's (added the 's - name)
+5136) holystoning + holystoned (merged into holystone)
+5137) hatemonger (+plural)
+5138) POWs (added plural - Wiktionary)
+5139) Euclid's (added 's - name)
+5140) multiparity (Collins)
+5141) multiparous
+5142) aeroshell
+5143) headliner (+plural - merged into headline)
+5144) indie (+plural)
+5145) metalhead (+plural - Oxford: informal)
+5146) headbanger's (added the 's)
+5147) popster (+'s +plural - Oxford: informal)
+5148) frontman
+5149) frontmen (plural of previous word)
+5150) folkie (+'s +plural - Oxford: informal)
+5151) melodicism
+5152) Seeger (+'s - name)
+5153) nonissue (Collins)
+5154) Junoesque
+5155) humoresque (+plural)
+5156) Sinbad (+'s - another way of Sindbad)
+5157) Dillingham (name)
+5158) Gordonstoun (+'s - name)
+5159) Junr (abbreviation in names)
+5160) juneberry (+plural)
+5161) liana (+plural)
+5162) liane (+plural - another way of the previous word)
+5163) antifeedant (+plural)
+5164) bioassay (+plural)
+5165) UCLA (+'s - University of California in Los Angeles)
+5166) physico-chemical
+5167) extropy
+5168) extropian (+plural)
+5169) transhumanism
+5170) transhumanist
+5171) Fukuyama (name)
+5172) world-view (removed: it is two words in Oxford)
+5173) balk (+plural +ed)
+5174) Maddock (+'s - name)
+5175) transhistorical
+5176) alchemic (merged into alchemy)
+5177) alchemize (+s +ed +ing - IZE)
+5178) alchemise (+s +ed +ing - ISE)
+5179) ultrafast (Collins)
+5180) ultrafastidious (Collins)
+5181) ultrafiltration
+5182) ultradian
+5183) ultracritical
+5184) fermionic (Collins)
+5185) ultracentrifuged (merged into ultracentrifuge)
+5186) ultracentrifugal
+5187) ultracentrifugation
+5188) overthrust (+ing)
+5189) fluorometer (+plural)
+5190) fluorometric
+5191) fluorometrically
+5192) fluorometry
+5193) misconstruction (+plural)
+5194) construction's (fix: removed it - it had dictionary codes)
+5195) intersubjective (+ly)
+5196) intersubjectivity
+5197) intertextuality
+5198) intertextual
+5199) intertextually
+5200) dialogic
+5201) dialogical
+5202) sourcebook (+plural)
+5203) Matilda's (added the 's - name)
+5204) workshopping + workshopped (merged into workshop)
+5205) Jonah's (added the 's - name)
+5206) monologic
+5207) monological
+5208) monologize (+plural +ing +ed - IZE)
+5209) monologise (+plural +ing +ed - ISE)
+5210) worksite (+plural)
+5211) tenace (+plural)
+5212) breadstick (+plural)
+5213) breadwinning
+5214) SWOT (SWOT analysis)
+5215) shapewear
+5216) trigraph (+plural)
+5217) adverbials (added plural)
+5218) j (letter)
+5219) w (letter)
+5220) graphemes (added plural)
+5221) graphemic (+plural)
+5222) graphemically
+5223) misperceiving
+5224) misperception (+plural)
+5225) enlace (+ed)
+5226) autochromes (added plural)
+5227) microaerophilic
+5228) microaerophile (+plural)
+5229) recombinants (added plural)
+5230) unswollen (Collins)
+5231) DNase
+5232) RNase
+5233) resuspend (+plural +ed +ing +ion)
+5234) triturate (+plural +ed +ing +ion)
+5235) triturator (+plural)
+5236) triumphally (merged into triumphal)
+5237) triumphalists (added plural)
+5238) zander
+5239) marshalship
+5240) wing-tip (fixed: removed since in Oxford it is two words)
+5241) wingsuit
+5242) airboats (added plural)
+5243) AdWords (Google AdWords)
+5244) ECTS (European Credit Transfer Scheme)
+5245) plug-compatible
+5246) plugboard (+plural)
+5247) autosuggestion (fixed: auto-suggestion)
+5248) autotune
+5249) JPG (upper case)
+5250) jpg (lower case)
+5251) autoxidized (merged into autoxidize - IZE)
+5252) autoxidised (merged into autoxidise - ISE)
+5253) Transylvanian
+5254) transwoman
+5255) transwomen (plural of previous word)
+5256) appropriacy (+plural)
+5257) Wiktionary
+5258) auditorial
+5259) Deems (+'s - name)
+5260) deemster (+plural)
+5261) houseroom
+5262) abdominoplasty (+plural)
+5263) mammaplasty (+plural - Collins)
+5264) mammoplasty (+plural - Collins - another way of previous word)
+5265) extracorporeal
+5266) lithotripsy
+5267) lithotripter (+plural)
+5268) lithotriptor (+plural - another way of previous word)
+5269) lithotriptic
+5270) facelifts (added plural)
+5271) injectables (added plural)
+5272) Botox (+ed - trademark)
+5273) antipruritic (+plural)
+5274) nonsteroidal (Collins)
+5275) nonaspirin (Collins)
+5276) antitussive
+5277) premedication
+5278) premaxillary
+5279) prematch
+5280) premaster (+plural +ing +ed)
+5281) prelusive
+5282) prem (+plural)
+5283) hypothermal
+5284) hypothermic
+5285) zoophobia
+5286) bacteriophobia
+5287) cyberphobic's (added the ´s)
+5288) cyberphobes (added plural)
+5290) computerphobia (Collins)
+5291) realpolitik (fix: it was in upper case)
+5292) Talleyrand (+'s - name)
+5293) fuehrer (+plural +'s - another way for führer)
+5294) faunal
+5295) faunistic
+5296) fraternalism (+'s)
+5297) pledgee
+5298) Kelk (name)
+5299) aerosphere
+5300) aesthetician (+plural +'s)
+5301) badware
+5302) von (now in lower case - fixed: Von)
+5303) baculovirus (+plural)
+5304) baculum
+5305) bacula (plural of previous word)
+5306) ctenoid
+5307) aviculture
+5308) avicultural
+5309) aviculturalist (+plural)
+5310) aviculturist (+plural)
+5311) cubital
+5312) cubitus
+5313) kilobase (+plural)
+5314) hydrogel (+plural)
+5315) hydrofracturing
+5316) hydrofluorocarbon (+plural)
+5317) HFC (+plural - abbreviation of previous word)
+5318) irrigator (+plural)
+5319) megalitres (added plural)
+5320) tympanic
+5321) petrosal (+plural)
+5322) semilunar
+5323) semi-literate
+5324) semi-literacy
+5325) Malayalam
+5326) MiB (Wikipedia)
+5327) KiB (Wikipedia)
+5328) GiB (Wikipedia)
+5329) TiB (Wikipedia)
+5330) PiB (Wikipedia)
+5331) EiB (Wikipedia)
+5332) ZiB (Wikipedia)
+5333) YiB (Wikipedia)
+5334) unsharp + unsharpness
+5335) draughtproof (+ing)
+5336) testiculate
+5337) eel-like
+5338) eely
+5339) underprepared
+5340) underpopulation
+5341) midtowns + midtown's (removed: American)
+5342) teriyaki
+5343) butternut (+plural)
+5344) movie (+plural - removed: chiefly American)
+5345) groovily + grooviness (merged into groovy)
+5346) dharma
+5347) cherubically
+5348) fifty-fifty
+5349) figgy (+ier +iest)
+5350) fightbacks (added plural)
+5351) Tynecastle (+'s - name)
+5352) fighter-bomber (+plural)
+5353) frontlet (+plural)
+5354) depigment (+ed)
+5355) depigmentation
+5356) vitiligo
+5357) leucoderma
+5358) catenative (+plural)
+5359) non-finite
+5360) prepose (+s +ing +ed)
+5361) backshift
+5362) unsurveyed
+5363) subpopulation (Collins)
+5364) unsusceptible
+5365) unsusceptibility
+5366) Westbury (+'s - name)
+5367) theming (merged into theme)
+5368) urbanist (+plural)
+5369) inliers (added plural)
+5370) Cimmerian (+plural +'s)
+5371) orogeny (+plural)
+5372) orogenesis
+5373) orogenic
+5374) orogen (+plural)
+5375) ultrastructure (Collins)
+5376) ultrastructural (Collins)
+5377) Proterozoic
+5378) Precambrian
+5379) Archaean
+5380) Priscoan
+5381) prismatically
+5382) starburst (+plural)
+5383) blocky (+ier +iest)
+5384) aragonitic (Collins)
+5385) unsprayed
+5386) unstabler + unstablest + unstableness (merged into unstable)
+5387) microarchitecture (+plural - Wiktionary)
+5388) Celeron (Intel)
+5389) i3 (Intel)
+5390) i5 (Intel)
+5391) i7 (Intel)
+5392) LGA (Intel)
+5393) Broadwell (+'s - name)
+5394) Haswell (+'s - name)
+5395) Krzanich (+'s - name)
+5396) Skylake (+'s - name)
+5397) transcriptome (+plural)
+5398) cybrid (Collins)
+5399) shoaled + shoaling (merged into shoal)
+5400) boneyard (Oxford: informal)
+5401) nuthouse (Oxford: informal)
+5402) hypochondriacal
+5403) pedicular (Collins)
+5404) immunocompromised
+5405) humoral
+5406) bloodlust (fixed: blood-lust)
+5407) upthrust (+s +ing +ed)
+5408) bloodletting (fixed: blood-letting)
+5409) Elaine's (added the 's - name)
+5410) alphafetoprotein
+5411) unconjugated (Collins)
+5412) immunohistochemistry (Collins)
+5413) orthotic (+plural)
+5414) orthotist (+plural)
+5415) POP3
+5416) POP
+5417) RFC
+5418) brainwork
+5419) brainily (merged into brainy)
+5420) caseloads (added plural)
+5421) gromwell (+plural)
+5422) odiferous (another way of odoriferous)
+5423) Anubis (+'s - name)
+5424) cupholders (added plural)
+5425) telecourse (+plural - Collins)
+5426) baserunner (+plural - Collins)
+5427) angiographer (+plural)
+5428) angiographic
+5429) angiographically
+5430) angioneurotic
+5431) angiotensin
+5432) hydrocortisone
+5433) glucocorticoid (+plural)
+5434) agonists (added plural)
+5435) univalents (added plural)
+5436) nonhomologous (Collins)
+5437) Hansard (+plural +'s)
+5438) denotative
+5439) reverberantly
+5440) reverberative
+5441) reverberator
+5442) reverberatory
+5443) filmic
+5444) film-going
+5445) fade-up
+5446) fade-out (+plural)
+5447) fade-in (+plural)
+5448) docusoap (+plural)
+5449) film-maker's (added the 's)
+5450) featurette (+plural)
+5451) chromakeys + chromakeying + chromakeyed (merged into chromakey)
+5452) beleaguerment
+5453) transport's (added the 's)
+5454) adversarially (merged into adversarial)
+5455) adverbials (added plural)
+5456) commissarial
+5457) fantasist
+5458) incubi (plural of incubus)
+5459) linguistician (+plural)
+5460) metamathematics
+5461) metamathematician (+plural)
+5462) Las (Las Vegas)
+5463) dimmable
+5464) dimmish
+4565) concious (fix: removed, it doesn't exist)
+4566) conciousness (fix: removed, it doesn't exist)
+4567) subdiscipline (+plural - Collins)
+4568) subfield (+plural - Collins)
+4569) subduct (+plural +ing +ed)
+4570) subeditorial (fixed: sub-editorial)
+4571) subeditor (+plural +'s - fixed: sub-editor)
+4572) subeditorship (Collins)
+4573) netsplit (+plural +ing +ed - IRC - Wiktionary)
+4574) biennale (+plural)
+4575) documentalist's (added the 's)
+4576) ornamentalism
+4577) ornamentalist (+plural)
+4578) dextrous (+ly +ness - another way of dexterous)
+4579) dextral
+4580) dextrality
+4581) dextrally
+4582) apertural
+4583) regionalize (+ed +ion -IZE)
+4584) regionalise (+ed +ion -ISE)
+4585) methodic
+4586) lodgepole (lodgepole pine)
+4587) patrology
+4588) patronal
+4589) farouche
+4590) barouche (+plural)
+4591) Romanic
+4592) Vulcanian
+4593) Cappadocia
+4594) Cappadocian (+plural)
+4595) cappellacci
+4596) Diego's (added the 's - name)
+4597) breadhead (+plural - Oxford: informal)
+4598) jackfruit
+4599) centuples (added plural)
+4600) centrosome (+plural)
+
+
+V2.22 - 1-MAR-2015
+------------------
+4601) reupload (+s +ing +ed - Wiktionary)
+4602) Purim
+4603) purificatory
+4604) Hecate (+'s - name)
+4605) Selene (+'s - name)
+4606) Endymion (+'s - name)
+4607) enduro (+plural)
+4608) karts (added plural)
+4609) karting (merged into kart)
+4610) autotest (+plural - Collins)
+4611) heathlands (added plural)
+4612) euphrasia
+4613) sabadilla
+4614) smartwatch (+plural)
+4615) Engelmann (+'s - name)
+4616) blackbutt (+plural)
+4617) cordwood
+4618) signage
+4619) overleveraged
+4620) DVR (+plural)
+4621) newsfeeds (added plural)
+4622) aggregator (+plural)
+4623) cladogram (+plural)
+4624) cladogenesis
+4625) cladogenetic
+4626) co-evolution
+4627) co-evolutionary
+4628) co-evolve (+s +ing +ed)
+4629) countertransference
+4630) buttercream
+4631) candyfloss
+4632) eco-warrior (+plural)
+4633) phenology
+4634) phenological
+4635) triglycerides (added plural)
+4636) squalene
+4637) glycerides (added plural)
+4638) hydrocephalic
+4639) hydrocephaly
+4640) sonography + sonograph + sonographic
+4641) Matangi (+'s - name)
+4642) synchromesh
+4643) diachroneity
+4644) diachronically
+4645) diachronistic
+4646) diachrony
+4647) ammonite (added singular)
+4648) inserters (added plural)
+4649) insertable
+4650) turnable (Collins)
+4651) mujahideen + mujahedin + mujahidin
+4652) semivowel (fixed: semi-vowel)
+4653) unmatch (+s +ing +ed - Wiktionary)
+4654) unmatchably
+4655) uncatchable
+4656) Osiris (+'s - name)
+4657) Osirian
+4658) Horus (+'s - name)
+4659) hosannah (another way of hosanna)
+4660) taskforce
+4661) pisciculture
+4662) piscicultural
+4663) pisciculturist
+4664) Piscean (+plural)
+4665) Andromedae
+4666) Andromache (+'s - name)
+4667) Neoptolemus (+'s - name)
+4668) Priam (+'s - name)
+4669) Hecuba (+'s - name)
+4670) Troilus (+'s - name)
+4671) Cressida (+'s - name)
+4672) Calchas (+'s - name)
+4673) frontwoman
+4674) frontwomen (plural of previous word)
+4675) kick-turn (+plural)
+4676) lipslide (+plural)
+4677) fakie (+plural)
+4678) unproblematical
+4679) unproblematically
+4680) progressivist (+plural)
+4681) degressive
+4682) concessive
+4683) bifunctional
+4684) functionalistic (Collins)
+4685) non-formal
+4686) non-fluent
+4687) transformative
+4688) transformationally
+4689) transfixion
+4690) transferware
+4691) underlease
+4692) underinvest (+s +ing +ed)
+4693) monogrammatic
+4694) sonogram (+plural)
+4695) to-dos (added plural - Collins)
+4696) tiramisu
+4697) cock-a-doodle-doo
+4698) cockaded (merged into cockade)
+4699) unswayed
+4700) home-loving
+4701) BFI (abbreviation: British Film Institute)
+4702) adland
+4703) Adlerian (+plural)
+4704) Freudians (added plural)
+4705) Freudianism
+4706) placeman (added singular)
+4707) unobstructive (Collins)
+4708) unobserving (Collins)
+4709) inconsequentiality (+plural)
+4710) inconsequentialness
+4711) soundbox
+4712) charango (+plural)
+4713) roadless (merged into road)
+4714) clearways (added plural)
+4715) KDE's (added the 's)
+4716) extended-play
+4717) EP
+4718) shaly (+ier +iest)
+4719) shaley (another way of previous word)
+4720) outsail (+s +ing +ed)
+4721) wiretap (+s +ing +ed)
+4722) wiretapper (+plural)
+4723) bivalence
+4724) quo (status quo)
+4725) ROI (abbreviation: Return On Investment)
+4726) skyrocket (+s +ing +ed - fixed: sky-rocket)
+4727) skysail (+plural)
+4728) Brooklyn (+'s - name of city)
+4729) snowscape (+plural)
+4730) roadmap (removed: Oxford says it is two words)
+4731) Citrix (+'s - name of company - Wikipedia)
+4732) SEO
+4733) relatable
+4734) relatability
+4735) eco-tax (+plural)
+4736) ecotone (+plural)
+4737) ecotonal
+4738) antiepileptic (Collins)
+4739) antianxiety (Collins)
+4740) unmedicated (Collins)
+4741) non-relative
+4742) non-selective
+4743) non-combative
+4744) e-learning
+4745) Aquitaine (+'s - name)
+4746) hawklike
+4747) waterlog (+s +ing +ed)
+4748) Carolingians (added plural)
+4749) genotoxic (Collins)
+4750) carbon-neutral
+4751) biocoenosis
+4752) biocoenoses (plural of previous word)
+4753) elevational
+4754) facies
+4755) antialiasing
+4756) antifungal (Collins)
+4757) antiballistic
+4758) antibubble
+4759) pharma (+plural)
+4760) anovulant (+plural)
+4761) calmative (+plural)
+4762) tricyclic (+plural)
+4763) bioavailability
+4764) bioavailable
+4765) monocyclic
+4766) membered
+4767) memberless
+4768) leptin
+4769) parvovirus (+plural)
+4770) leptospirosis
+4771) postulatory
+4772) posturers (added plural)
+4773) kleptocrat (+plural)
+4774) kleptocracy (+plural)
+4775) kleptocratic
+4776) kleptoparasite (+plural)
+4776) kleptoparasitic
+4777) kleptoparasitism
+4778) libitum (ad libitum)
+4779) unsized
+4780) unrevised
+4781) unrevoked
+4782) unreversed
+4783) unrestored
+4784) bling + blingy + blingier + blingiest
+4785) bling-bling (another way of previous word)
+4786) burkas (added plural)
+4787) burkha (+plural - another way of previous word)
+4788) burqa (+plural - another way of previous word)
+4789) chadors (added plural)
+4790) headscarves (added plural)
+4791) crowdfund (+plural)
+4792) deleverage (+s +ed +ing - Wiktionary)
+4793) delexical
+4794) earbud (+plural)
+4795) earbash (+ing - Oxford: informal)
+4796) emoji (+plural)
+4797) geocache (+s +ing +ed +er)
+4798) googles + googling (merged into google)
+4799) googleable
+4800) googlable (another way of previous word)
+4801) weblog (+plural + er)
+4802) underwire (+s +ed)
+4803) pat-down
+4804) Islamophobia
+4805) Islamophobe
+4806) Islamophobic
+4807) Islamists (added plural)
+4808) Wikileaks (+'s - Wikipedia)
+4809) Oxfordian (+plural)
+4810) unfermented
+4811) unrented (Collins)
+4812) unparented (Collins)
+4813) untormented (Collins)
+4814) unaugmented (Collins)
+4815) teleplay (+plural)
+4816) telepresence
+4817) televiewers (added plural)
+4818) monocrystalline
+4819) sugarbird (+plural)
+4820) flockmaster
+4821) teleports + teleported (merged into teleport)
+4822) gyroscopically
+4823) ISS (Collins - abbreviation: International Space Station)
+4824) spacewalking + spacewalked (merged into spacewalk)
+4825) spacefarer (+plural)
+4826) film-making
+4827) archaebacterium
+4828) archaebacteria (plural of previous word)
+4829) eubacterium
+4830) eubacteria (plural of previous word)
+4831) biliously (merged into bilious)
+4832) trilinear
+4833) affectless
+4834) affectlessness
+4835) immunosuppression
+4836) immunosuppressant (+plural)
+4837) immunosuppressed
+4838) immunosorbent
+4839) quantitation (+plural)
+4840) quantitate (+ed)
+4841) monochord (+plural)
+4842) pentachord
+4843) subdominant
+4844) ISPs (added plural)
+4845) subduable
+4846) subduer
+4847) Belford (+'s - name of place)
+4848) seamount (+plural)
+4849) seamfree
+4850) seamers (added plural)
+4851) puckery
+4852) pintuck (+plural)
+4853) hangup (+plural - removed since Oxford says it is two words)
+4854) hyperlinking (merged into hyperlink)
+4855) Hitlers (added plural)
+4856) Hitlerian
+4857) Hitlerism
+4858) Hitlerite (+plural)
+4859) Megachiroptera
+4860) megachiropteran (+plural)
+4861) multiyear (Collins)
+4862) bancassurance
+4863) bankassurance (another way of previous word)
+4864) bancassurer (+plural)
+4865) Allianz (+'s - name)
+4866) Kieran (name)
+4867) banausic
+4868) haricot (+plural)
+4869) contrarian (+plural)
+4870) contrarianism
+4871) quinquagenarian
+4872) majoritarian (+plural)
+4873) majoritarianism
+4874) Gibraltarian (+plural)
+4875) Raith's (added the 's - name)
+4876) bioprivacy (Collins)
+4877) Obamacare
+4878) apices (another plural of apex)
+4879) apetalous
+4880) stipule (+plural)
+4881) stipular
+4882) unsubmerged (Collins)
+4883) Brookes (+'s - name)
+4884) Bodleian (Bodleian Library)
+4885) Ashmolean (Ashmolean Museum)
+4886) Sheldonian (Sheldonian Theatre)
+4887) sculpturesque
+4888) freewheels (added plural)
+4889) freewheeler
+4890) passible
+4891) passibility
+4892) Athanasius (+'s - name)
+4893) discarnate
+4894) Eileen's (added the 's - name)
+4895) Platonism
+4896) Platonist (+plural)
+4897) logicism
+4898) intuitionists (added plural)
+4899) intuitionism
+4900) intuitionalism (another way of previous word)
+4901) compresence
+4902) compresent
+4903) immoralism
+4904) immoralist
+4905) Thrasymachus (+'s - name - Wikipedia)
+4906) absurdism
+4907) Chaplin's (added the 's - name)
+4908) absurdist (+plural)
+4909) Cartesians (added plural)
+4910) Descartes's (added the 's - name)
+4911) Cartesianism
+4912) defeasibility
+4913) defeasibly
+4914) counterclaiming (merged into counterclaim)
+4915) multithread
+4916) Timberlake (name)
+4917) offstage (fixed: off-stage)
+4918) onstage (fixed: on-stage)
+4919) lovelock (+plural)
+4920) lovelily
+4921) jubbly
+4922) vestiture (+plural)
+4923) excommunicator (+plural)
+4924) excommunicatory
+4925) ex-con (+plural - Oxford: informal)
+4926) bilboes
+4927) pathognomonic
+4928) Holmes's (added the 's - name)
+4929) shrink-wrap (+s +ing +ed)
+4930) break-bulk
+4931) multitaskers (added plural)
+4932) multitasks (merged into multitask)
+4933) multitouch
+4934) multituberculate (+plural)
+4935) monotreme (+plural)
+4936) condylarth (+plural)
+4937) condyloma (+plural)
+4938) condylomata (another plural of previous word)
+4939) condylomatous
+4940) CVA (abbreviation: cerebrovascular accident)
+4941) STDs (added plural)
+4942) reverb (+plural)
+4943) handclap (+plural +ing)
+4944) popish (+ly)
+4945) trad (Oxford: informal)
+4946) theremin (+plural)
+4947) cinnarizine (Collins)
+4948) cyclizine (Collins)
+4949) promethazine
+4950) amoxycillin
+4951) amoxicillin (another way of previous word)
+4952) ampicillin
+4953) erythromycin
+4954) dishwashing
+4955) dishy (+ier +iest)
+4956) telegenic
+4957) telefilm (+plural)
+4958) Gucci's (added the 's - name)
+4959) clinginess (merged into clingy)
+4960) annoyingness
+4961) balibuntal
+4962) trampette (Collins)
+4963) solanaceous
+4964) bioacoustics
+4965) James's (added the 's - name)
+4966) bioaccumulate (+s +ing +ed +ion)
+4967) Lucas's (added the 's - name)
+4968) sapiens (Homo sapiens)
+4969) assibilate (+ed +ion)
+4970) rhotic
+4971) rhoticity
+4972) postvocalic
+4973) tics (added plural)
+4974) pic (+plural - Oxford: informal)
+4975) digicam (+plural)
+4976) digipak
+4977) untruly (Kevin Atkinson wordlist 60)
+4978) unremarked (Kevin Atkinson wordlist 60)
+4979) unshaped (Kevin Atkinson wordlist 60)
+4980) unposed
+4981) mustardy
+4982) chorography
+4983) chorographer (+plural)
+4984) chorographic
+4985) geostrategic
+4986) geostrategy
+4987) Africanism
+4988) Africanist
+4989) Africanize (+s +ed +ing +ion -IZE)
+4990) Africanise (+s +ed +ing +ion -ISE)
+4991) bezoar (+plural)
+4992) lungworm (+plural)
+4993) furunculosis
+4994) interdigital
+4995) OCRs + OCRing + OCRed (merged into OCR - Wiktionary)
+4996) versicle (+plural)
+4997) responsory (+plural)
+4998) graduals (added plural)
+4999) gradiometer
+5000) altazimuth
+5001) gradualistic
+5002) dragline (+plural)
+5003) bucketwheel (+plural)
+5004) dozers (added plural)
+5005) deckhouse (+plural)
+5006) shotted
+5007) lionfish (+plural - Collins)
+5008) triggerfish (+plural)
+5009) amidship (added singular)
+5010) baggywrinkle
+5011) overemployment (Collins)
+5012) foozle (+s +ing +ed - Oxford: informal)
+5013) forewing (+plural)
+5014) beeswing
+5015) haltere (+plural)
+5016) imaginal
+5017) instar (+plural)
+5018) hindwings (added plural)
+5019) alisphenoid (+plural)
+5020) glenoid
+5021) fossa
+5022) glenohumeral
+5023) hyperextend (+s +ing +ed +ion)
+5024) dystonia
+5025) dystonic
+5026) embolization (-IZE)
+5027) embolisation (-ISE)
+5028) thrombolysis
+5029) thrombolytic
+5030) ischaemia
+5031) ischaemic
+5032) autolysis
+5033) autolytic
+5034) lysosome (+plural)
+5035) lysosomal
+5036) angulate (+s +ing +ed)
+5037) angulation (+plural)
+5038) cerebriform (Collins)
+5039) Pott (+'s - name)
+5040) calcalkaline
+5041) laurustinus
+5042) desex (+s +ing +ed)
+5043) deservingness
+5044) lolcat (+plural)
+5045) mash-ups (added plural)
+5046) Chekhov's (added 's - name)
+5047) masjid (+plural)
+5048) gurdwara (+plural)
+5049) microloan (+plural - Collins)
+5050) muggle (+plural - Oxford: informal)
+5051) multiverse (+plural)
+5052) meme (+plural)
+5053) memetic
+5054) declass (+ed)
+5055) cosplay (+s +ing +ed +er +ers)
+5056) COSPAR (abbreviation: Committee on Space Research)
+5057) meh (Oxford: informal)
+5058) orc (+plural)
+5059) orcish
+5060) hobbit (added plural +'s)
+5061) Gandalf (+'s - name - Wikipedia)
+5062) Frodo (+'s - name - Wikipedia)
+5063) Tolkien (+'s - name)
+5064) Tolkienesque
+5065) overshare (+s +ing +ed +er +ers)
+5066) grassquit (+plural)
+5067) bananaquit (+plural)
+5068) soulmate (+plural)
+5069) Rastafarian (+plural)
+5070) Rastafarianism
+5071) Anthropocene
+5072) wish-list (removed - Oxford says it is two words)
+5073) webisode (+plural)
+5074) vuvuzela (+plural)
+5075) unfriends (merged into unfriend)
+5076) usernames (added plural)
+5077) handhelds (added plural)
+5078) lammergeier
+5079) lammergeyer (another way of previous word)
+5080) Fraktur
+5081) thunderbird (+plural +'s - lower case - mythical bird)
+5082) thickheads (added plural)
+5083) Asgard (+'s - name)
+5084) Camelopardalis (name of place)
+5085) Centaurus (name of place)
+5086) aquarobics
+5087) divemaster (+plural)
+5088) freestyling + freestyled + freestyler + freestylers (merged into freestyle)
+5089) biscotti
+5090) codebase (+plural - Wiktionary)
+5091) postmortem (fixed: post-mortem)
+5092) codeless (Collins)
+5093) undebated (Collins)
+5094) firebase
+5095) winery (added singular)
+5096) wineskins (added plural)
+5097) unshrunk
+5098) Winesap (+plural)
+5099) nock (+s +ing +ed)
+5100) keyserver (+plural - Wiktionary)
+5101) QA (abbreviation: Quality assurance)
+5102) passphrase (+plural - Wiktionary)
+5103) GnuPG's (added the 's)
+5104) PostScript (trademark)
+5105) Fri (abbreviation: Friday)
+5106) Jun (abbreviation: June)
+5107) Jul (abbreviation: July)
+5108) Sep (abbreviation: September)
+
+
+V2.23 - 1-APR-2015
+------------------
+5109) Aintree (name)
+5110) ainhum
+5111) cholelithiasis
+5112) cholecystitis
+5113) pancreatitis
+5114) cardiomyopathy
+5115) pericardial
+5116) mammal-like
+5117) mammalogy (+ist +ists)
+5118) Merriam's (added the 's - name)
+5119) supinate (+s +ing +ed +ion)
+5120) pronate (+s +ing +ed +ion)
+5121) pronator (+plural)
+5122) metacentres (added plural)
+5123) acrocentric (Collins)
+5124) submetacentric (Collins)
+5125) Malory (+'s - name)
+5126) malperformance
+5127) loti (currency)
+5128) maloti (plural of previous word)
+5129) Lothario (+plural)
+5130) butterbur (+'s - Collins)
+5131) institute's (added the 's)
+5132) extremophile (+plural)
+5133) archaebacterial
+5134) toxigenicity (Collins)
+5135) botulinum (botulinum toxin)
+5136) variola
+5137) variolar
+5138) variolous
+5139) Mather (name)
+5140) Smoot (+'s - name)
+5141) RISC
+5142) click-through (+plural)
+5143) clientelism
+5144) followee (+plural)
+5145) aggressivity (Collins)
+5146) ballistically
+5147) hydroforming (Collins)
+5148) SourceForge (+'s)
+5149) logon (+plural)
+5150) logouts (added plural)
+5151) logoff (+plural)
+5152) newfound
+5153) Harington (name)
+5154) sightlessness
+5155) Arkansans (added plural - Kevin Atkinson wordlist 60)
+5156) Axis (The Axis - alliance of Germany and Italy WWII - Kevin wordlist 60)
+5157) Bayamón (name of city - Kevin Atkinson wordlist 60)
+5158) Camelots (added plural - Kevin Atkinson wordlist 60)
+5159) Carib (+plural)
+5160) Devonians (added plural)
+5161) cockboat
+5162) backwinding + backwinded (merged into backwind)
+5163) ripstop
+5164) longstop
+5165) half-centuries (added plural)
+5166) Barclays (+'s - name - Wikipedia)
+5167) peggy (+plural - slang)
+5168) Peggy (+'s - name)
+5169) Chekhovian (Kevin Atkinson wordlist 60)
+5170) Comoran (Kevin Atkinson wordlist 60)
+5171) Darwinist (+plural - Kevin Atkinson wordlist 60)
+5172) Fräulein (Kevin Atkinson wordlist 60)
+5173) Galaxy (The Galaxy - uppercase - Kevin Atkinson wordlist 60)
+5174) Greenlandic (Kevin Atkinson wordlist 60)
+5175) gorgon's (added the 's)
+5176) multiheaded (Collins)
+5177) Grozny (+'s - name - Kevin Atkinson wordlist 60)
+5178) Ivorian (+plural - Kevin Atkinson wordlist 60)
+5179) Nepalis (added plural - Kevin Atkinson wordlist 60)
+5180) Gurkhali
+5181) Gorkhali (another way of previous word)
+5182) Vallejo's (added the 's - name)
+5183) vallecula
+5184) valleculae (plural of previous word)
+5185) Nibelungenlied
+5186) Nibelung (+plural)
+5187) Nibelungen (another plural of previous word)
+5188) Burgundians (added plural)
+5189) Cassidy (+'s - name - Wikipedia)
+5190) Longmire (+'s - name - Wikipedia)
+5191) Eurocard (Wikipedia)
+5192) lightwork (+er +ers - Wiktionary)
+5193) Kenney (name - Wikipedia)
+5194) Medina's (added the 's - name)
+5195) exclusivism
+5196) exclusivist (+plural)
+5197) excogitate (+s +ing +ed +ion)
+5198) antidisestablishmentarian (+plural)
+5199) exceptionalism
+5200) ecclesial
+5201) interreligious (Collins)
+5202) penates
+5203) penannular
+5204) zoomorphic
+5205) zoomorphism
+5206) biomorphs (added plural)
+5207) biomorph's (added the 's)
+5208) biomorphic
+5209) Dawkins (+'s - name)
+5210) Aristotelians (added plural)
+5211) Sacrobosco (+'s - name - Wikipedia)
+5212) Paracelsus (+'s - name)
+5213) MKV + mkv
+5214) AVI
+5215) FLV
+5216) MK3D + mk3d
+5217) MKA + mka
+5218) MKS
+5219) streamable (Wiktionary)
+5220) Matroska's (added the 's)
+5221) MOV
+5222) Vorbis (+'s - Wikipedia)
+5223) ogg + Ogg
+5224) oga
+5225) WMA
+5226) AAC
+5227) ambisonic (+plural)
+5228) DirectShow (+'s - Wikipedia)
+5229) Netherhampton (name)
+5230) Phillips's (added the 's - name)
+5231) touch-sensitive
+5232) microchannel (+plural - Wiktionary)
+5233) photoresist (+plural)
+5234) photolithography
+5235) photolitho (another way of previous word)
+5236) photolithographic
+5237) photolithographically
+5238) microminiature (Collins)
+5239) oligonucleotide (+plural)
+5240) polynucleotide (+plural)
+5241) polynuclear
+5242) Woburn (+'s - name)
+5243) acrylamide
+5244) toxicant (+plural)
+5245) immunogenetic (+plural - Collins)
+5246) immunogenetical (Collins)
+5247) browntop
+5248) androsterone
+5249) oestradiol
+5250) oestrogenic
+5251) progestin (+plural)
+5252) translocations (added plural)
+5253) mistranslate
+5254) quadrate (+plural)
+5255) trabecula
+5256) trabeculae (plural of previous word)
+5257) trabecular
+5258) trabeculate
+5259) intergrowth (+plural)
+5260) intergrow
+5261) intergrew (past of previous word)
+5262) intergrown (past participle of intergrow)
+5263) limonite (+ic)
+5264) pseudomorph (+plural +ic)
+5265) pseudomorphism
+5266) pseudomorphous
+5267) Charron (name - Wikipedia)
+5268) Theophrastus (+'s - name)
+5269) Heraclitus (+'s - name)
+5270) Parmenides (+'s - name)
+5271) Bentham (name)
+5272) Kircher (+'s - name - Wikipedia)
+5273) Cetacea
+5274) Odontoceti
+5275) odontocete (+plural)
+5276) Mysticeti
+5277) mysticete (+plural)
+5278) rorqual (+plural)
+5279) Bryde (+'s - name - Wikipedia)
+5280) Hywel (name - Wikipedia)
+5281) Antin (+'s - name - Wikipedia)
+5282) medusa (lowercase - +plural)
+5283) medusae (lowercase - another plural of previous word)
+5284) planula
+5285) planulae (plural of previous word)
+5286) apoptosis
+5287) apoptotic
+5288) radioiodine (Collins)
+5289) gastrocolic
+5290) apoprotein (+plural)
+5291) waterborne (fixed: water-borne)
+5292) firstborn (fixed: first-born + added 's)
+5393) aposematic
+5394) aposematism
+5395) herbarium
+5396) herbaria (plural of previous word)
+5397) angiospermous
+5398) gymnospermous
+5399) monocot (+plural)
+5400) dicot (+plural)
+5401) dicrotic
+5402) phosphodiesterase
+5403) methotrexate
+5404) HPV (abbreviation: Human papillomavirus)
+5405) kindergartener (+plural - Kevin Atkinson wordlist 40)
+5406) Fulghum (+'s - name - Wikipedia)
+5407) Audra (+'s - name - Wikipedia)
+5408) overparted
+5409) Leonardo's (added the 's - name)
+5410) overpaint (+s +ing +ed)
+5411) Baconian (+plural)
+5412) inductivism
+5413) inductivist (+'s +plural)
+5414) consequentialism
+5415) consequentialist (+plural)
+5416) utilitarians (added plural)
+5417) Bosphorus (another way for Bosporus)
+5418) deontology
+5419) deontological
+5420) deontologist (+plural)
+5421) PHP (+'s)
+5422) php (lower case)
+5423) CGI
+5424) Ibsen's (added the 's - name)
+5425) Gerhart (+'s - name)
+5426) Crébillon (name - Wikipedia)
+5427) Henrik (+'s - name)
+5428) Flaubert (+'s - name)
+5429) flaunter
+5430) flaunty
+5431) Pouncey (+'s - name - Wikipedia)
+5432) Byblos (+'s - name)
+5433) phospholipase
+5434) linolenic (linolenic acid)
+5435) chitosan (Collins)
+5436) oropharynx
+5437) oropharynges + oropharynxes (plural ways of previous word)
+5438) oropharyngeal
+5439) fungiform
+5440) vallate (Collins)
+5441) adventitia
+5442) adventitial
+5443) Adventism
+5444) Pentecostals (added plural + changed to upper case)
+5445) Pentecostalism
+5446) acceptation (+plural)
+5447) Riegl (+'s - name - Wikipedia)
+5448) Venkova (name - Wikipedia)
+5449) admass
+5450) Lifford (name)
+5451) ambisexual (+ly)
+5452) cufflink (+plural)
+5453) Paula (+'s - name)
+5454) monobrow (+ed - Oxford: informal)
+5455) Hayek (+'s - name)
+5456) Darger (+'s - name - Wikipedia)
+5457) anomalistic
+5458) ascidian (+plural)
+5459) Cloney (+'s - name - Wikipedia)
+5460) Walney (+'s - name - Wikipedia)
+5461) razorfish (+plural)
+5462) APC (abbreviation: Armoured Personnel Carrier)
+5463) Bukrin (name)
+5464) Otway (+'s - name)
+5465) Amfreville (name)
+5466) defenceman
+5467) defencemen (plural of previous word)
+5468) commodification
+5469) Killarney (+'s - name)
+5470) peloton (+plural)
+5471) bittersweet (fixed: bitter-sweet)
+5472) bittersweetness (fixed: bitter-sweetness)
+5473) blueliner
+5474) multisensory
+5475) Bayern (name)
+5476) Hašek (+'s - name - Wikipedia)
+5477) multiplet (+plural)
+5478) diborane
+5479) boride (+plural)
+5480) borane (+plural)
+5481) intermetallic (Collins)
+5482) nanostructures (added plural)
+5483) nanostructured (merged into nanostructure - Wiktionary)
+5484) silicide (+plural)
+5485) hepatocyte (+plural)
+5486) immunoglobulin (+plural)
+5487) cellularity
+5488) pleomorphism
+5489) pleomorphic
+5490) eosinophilic
+5491) mucinous
+5492) eosinophil (+plural)
+5493) chargee
+5494) chargeback (+plural)
+5495) velodrome (+plural)
+5496) McGlynn (+'s - name - Wikipedia)
+5497) Daytona (+'s - name)
+5498) McRae (+'s - name - Wikipedia)
+5499) Nemechek (+'s - name - Wikipedia)
+5500) dayside
+5501) nightside
+5502) astrobleme (+plural)
+5503) Pentecost
+5504) polyacrylamide
+5505) ethidium (ethidium bromide)
+5506) Timor (+'s - country)
+5507) Timorese
+5508) timocracy (+plural)
+5509) bacchanalian (in lower case it has other meaning)
+5510) archegonium
+5511) archegonia (plural of previous word)
+5512) Leopold's (added the 's - name)
+5513) archducal
+5514) archduchy (+plural)
+5515) Stringfield (+'s - name - Wikipedia)
+5516) Lumberton (+'s - name - Wikipedia)
+5517) Revenna (name - Wikipedia)
+5518) exopolitics (Wiktionary)
+5519) Moulton (+'s - name - Wikipedia)
+5520) Marden (+'s - name - Wikipedia)
+5521) Westrum (+'s - name - Wikipedia)
+5522) Isadora (+'s - name)
+5523) adoptee (+plural)
+5524) Zawadski (name)
+5525) Gavron (+'s - name - Wikipedia)
+5526) chromatid (+plural)
+5527) anaphase
+5528) telophase
+5529) prophase
+5530) tankage
+5531) Gunnar's (added the 's - name)
+5532) birdshot
+5533) Garda
+5534) Gardai (plural of previous word)
+5535) Moyross (name - Wikipedia)
+5536) unjaded (Collins)
+5537) over-bright
+5538) glowy (+ier +iest - Oxford: informal)
+5539) gloxinia (+plural)
+5540) achimenes
+5541) cohosh
+5542) folic (folic acid)
+5543) pteroylglutamic (pteroylglutamic acid)
+5544) pterosaur (added singular)
+5545) chalicothere (+plural)
+5546) glucagon
+5547) fluctuant
+5548) interpretability
+5549) bacteriostat (+plural)
+5550) bacteriostasis
+5551) bacteriostatic
+5552) bacteriostatically
+5553) sterilant (+plural)
+5554) Vincentian (+plural)
+5555) Lazarist (+plural)
+5556) Perryville (+'s - name - Wikipedia)
+5557) isethionic (isethionic acid)
+5558) isethionate
+5559) isentropic
+5560) Chalmers (+'s - name - Wikipedia)
+5561) microelectronically (Collins)
+5562) electropolar (Collins)
+5563) Hershey's (added the 's - name)
+5564) Simson (+'s - name - Wikipedia)
+5565) Pathan (+plural)
+5566) Chaldean (+plural)
+5567) Anatolians (added plural)
+5568) napoleon (+plural - allow lower case)
+5569) neologist (+plural)
+5570) neologize (+s +ing +ed - IZE)
+5571) neologise (+s +ing +ed - ISE)
+5572) sonics
+5573) spaceport (+plural)
+5574) Kourou (+'s - name)
+5575) nullifidian
+5576) uglily
+5577) uglify (+s +ing +ed +ion +ly)
+5578) streetscape (+plural)
+5579) Trowbridge (+'s - name)
+5580) Molesworth (+'s - name - Wikipedia)
+5581) Nicholls (+'s - name - Wikipedia)
+5582) Eindhoven (+'s - name)
+5583) Bluefields (+'s - name)
+5584) Belém (+'s - name of city)
+5585) belemnite (+plural)
+5586) Flandrian
+5587) auriferous
+5588) downwelling (+plural)
+5589) upwellings (added plural)
+5590) nearshore (+s +ing +ed)
+5591) solitarily (merged into solitary)
+5592) limitary
+5593) limitative
+5594) textualist (+plural)
+5595) textualism
+5596) Latham (+'s - name - Wikipedia)
+5597) Humphreys (+'s - name - Wikipedia)
+5598) osmotically
+5599) Eliza (+'s - name)
+5600) Hoberman (+'s - name - Wikipedia)
+5601) semipermeable
+5602) hydrocolloid (+plural)
+5603) subprocess (+plural - Wiktionary)
+5604) Dwayne (name - Wikipedia)
+5605) updatable
+5606) Rappaport (+'s - name - Wikipedia)
+5607) upcycling + upcycles (merged into upcycle)
+5608) Sheldrick (+'s - name - Wikipedia)
+5609) upcoast
+5610) upcasts (added plural)
+5611) upcase (+s +ed)
+5612) downcase (+s +ed)
+5613) Westerman (+'s - name - Wikipedia)
+5614) Scart + SCART
+5615) roll-outs (added plural)
+5616) Oberth (+'s - name - Wikipedia)
+5617) Emme (+'s - name - Wikipedia)
+5618) ESR
+5619) Jacklyn (name - Wikipedia)
+5620) GCC (+'s)
+5621) mudflap (+plural)
+5622) misexplanation (+plural - Wiktionary)
+5623) misexplain (+s +ing +ed - Wiktionary)
+5624) Beatty (+'s - name)
+5625) Delphine (+'s - name - Wikipedia)
+5626) misqualify (+s +ing +ed - Wiktionary)
+5627) cocreates + cocreating + cocreated (merged into cocreate - Wiktionary)
+5628) cocreator (+plural - Wiktionary)
+5629) cocreation (Wiktionary)
+5630) subclauses (added plural)
+5631) standard's (added the 's)
+5632) vert (+plural)
+5633) Tallis (+'s - name)
+5634) Flodden (name)
+5635) Moreton (+'s - name)
+5636) Suffolks (added plural)
+5637) Pius (+'s - name)
+5638) Wulfsige (name - Wikipedia)
+5639) Bardstown (+'s - name - Wikipedia)
+5640) Asser (+'s - name - Wikipedia)
+5641) Dermot (+'s - name - Wikipedia)
+5642) gramophonic
+5643) dropout (+plural)
+5644) trimerous
+5645) pentamerous
+5646) tetramerous
+5647) cotoneaster
+5648) rowan (+plural - in lower case - rowan tree)
+5649) broadleaf
+5650) whitebeam (+plural)
+5651) agapanthus
+5652) pelargonium (+plural)
+5653) goosegrass
+5654) bedstraws (added plural)
+5655) Bedu (another term for Bedouin)
+5656) McHale (+'s - name - Wikipedia)
+5657) Aegon (+'s - name - Wikipedia)
+5658) pochard (+plural)
+5659) Pocahontas (+'s - name)
+5660) Aragon (+'s - name)
+5661) Zara (+'s - name - Wikipedia)
+5662) crappie (+plural)
+5663) flappy (+ier +iest)
+5664) giftware
+5665) Pattaya (+'s - name)
+5666) Chemnitz (+'s - name)
+5667) Austerlitz (+'s - name)
+5668) Meara (name)
+5669) anemophilous
+5670) anemophily
+5671) hydrophilous
+5672) hydrophily
+5673) hydrophobicity
+5674) intermembrane (Collins)
+5675) Zenobia (+'s - name)
+5676) cymbidium (+plural)
+5677) boneset
+5678) knitbone
+5679) intarsia
+5680) Hendrick (+'s - name - Wikipedia)
+5681) panstick
+5682) denitrify (+s +ing +ed +ion)
+5683) bioreactor (+plural)
+5684) wasabi
+5685) cruciferous
+5686) somniferous
+5687) melliferous
+5688) umbellifer (+plural)
+5689) umbelliferous
+5690) bottlescrews (added plural)
+5691) forestay
+5692) staysail (+plural)
+5693) turnbuckle (+plural)
+5694) Cowell (+'s - name - Wikipedia)
+5695) turnround (another way of turnaround)
+5696) Landon (+'s - name)
+5697) yuan (allow lower case too - not name in lower case)
+5698) Baudot (+'s - name - Wikipedia)
+5699) Baudrillard (+'s - name)
+5700) Saavedra (+'s - name - Wikipedia)
+
+
+V2.24 - 1-MAY-2015
+------------------
+5701) Hopson (+'s - name - Wikipedia)
+5702) Coolaney (name - Wikipedia)
+5703) Barkley (name - Wikipedia)
+5704) hydroid (+plural)
+5705) polypoid
+5706) theca
+5707) thecae (plural of previous word)
+5708) thecate
+5709) dinoflagellate (+plural)
+5710) jobseeker (+'s +plural)
+5711) wreaker
+5712) Frederica (+'s - name - Wikipedia)
+5713) Krista (+'s - name - Wikipedia)
+5714) agoraphobe (+plural)
+5715) Heworth (name - Wikipedia)
+5716) Crothers (+'s - name - Wikipedia)
+5717) anorgasmic
+5718) anorthosite
+5719) uncirculated
+5720) Dante's (added the 's - name)
+5721) baht (currency of Thailand)
+5722) gossamery
+5723) Friel (+'s - name - Wikipedia)
+5724) grume (+plural)
+5725) Duchamp (+'s - name)
+5726) balmoral (+plural)
+5727) Balmoral (+'s - name)
+5728) bluchers
+5729) cachectic
+5730) cachexia
+5731) dyspnoea
+5732) cyanosis
+5733) cyanotic
+5734) lymphadenopathy
+5735) splenomegaly
+5736) sarcoid (+plural)
+5737) immunocompetent
+5738) immunocompetence
+5739) autoconfigure (+s +ing +ed +ion - Wiktionary)
+5740) ultra-thin
+5741) Brookhaven (+'s - name)
+5742) Brooklands (+'s - name)
+5743) Newlands (+'s - name)
+5744) interfix (+plural +ing +ed - Wiktionary)
+5745) Theodoric (+'s - name)
+5746) Ostrogoth (+plural)
+5747) Ostrogothic
+5748) Goths (added plural)
+5749) goths (added plural - lower case)
+5750) Crimeans (added plural)
+5751) Visigothic
+5752) Justinian (+'s - name)
+5753) Dalmatia (+'s - name)
+5754) Dalmatian (+plural - fix: now in upper case)
+5755) Doberman (removed: Chiefly American)
+5756) Dobermann (+plural)
+5757) Pomeranian (+plural)
+5758) Akita (+plural)
+5759) Raby (+'s - name - Wikipedia)
+5760) Akkadian (+plural)
+5761) Akkad (+'s - name)
+5762) Dakotas (added plural)
+5763) Siouan
+5764) undefeatable
+5765) Kimble (+'s - name - Wikipedia)
+5766) inkjet (inkjet printer)
+5767) draftsman
+5768) draftsmen (plural of previous word)
+5768) egosurfer (+plural - merged into egosurf - Wiktionary)
+5769) themself
+5770) Themistocles (+'s - name)
+5771) Ki-moon (+'s - name)
+5772) Bevan (+'s - name)
+5773) bevatron (+plural)
+5774) radiotherapeutic
+5775) repopulation (merged into repopulate)
+5776) Liguria (name of place)
+5777) Ligurian (+plural)
+5778) Surya
+5779) appealable
+5780) reviewable
+5781) reviewal
+5782) incompletion
+5783) Montaigne's (added the 's - name)
+5784) inexhaustibility
+5785) Bessey (+'s - name - Wikipedia)
+5786) incomputable
+5787) agrimony (+plural)
+5788) chokecherry
+5789) nandina
+5790) Afrocentric (Kevin Atkinson wordlist 60)
+5791) Afrocentrism
+5792) Afrocentrist (+plural)
+5793) Barthes (+'s - name - Kevin Atkinson wordlist 60)
+5794) bartend (+plural +ing +ed)
+5795) parascend (+ing +er +ers)
+5796) waterski (+s +ing +ed +er +ers)
+5797) Windermere (+'s - name)
+5798) ringbone
+5799) ringbolt
+5800) ringback
+5801) ringbark (+s +ing +ed)
+5802) ploughland
+5803) Pembrokeshire's (added the 's - name)
+5804) thorned + thornless (merged into thorn)
+5805) thornlike
+5806) thornproof
+5807) Thorn (+'s - name)
+5808) Glenhead (name - Wikipedia)
+5809) Cockett (name - Wikipedia)
+5810) overstorey (+plural)
+5811) overstress (+s +ing +ed)
+5812) overnutrition (Collins)
+5813) commodify (+plural +ing +ed)
+5814) ACW (abbreviation: aircraftwoman)
+5815) passcode
+5816) correctitude
+5817) Overdale (name - Wikipedia)
+5818) Pleasington (name - Wikipedia)
+5819) Fulford (name - Wikipedia)
+5820) Rosenallis (name - Wikipedia)
+5821) Butterworth (+'s - name - Wikipedia)
+5822) ca (abbreviation)
+5823) CA (abbreviation)
+5824) washland
+5825) Heligoland (+'s - name)
+5826) heliocentrically
+5827) Copernicus's (added the 's - name)
+5828) Shermer (+'s - name - Wikipedia)
+5829) Nicolaus (+'s - name)
+5830) geocentrism
+5831) geobotany
+5832) geobotanical
+5833) geobotanist (+plural)
+5834) phytosociology (Collins)
+5835) arctic (also in lower case for other use)
+5836) nipplewort
+5837) lungwort
+5838) lunisolar
+5839) geodynamical (Collins)
+5840) semimajor (semimajor axis)
+5841) semimetals (added plural)
+5842) metalloids (added plural)
+5843) butanol
+5844) thymol
+5845) fusel (fusel oil)
+5846) fuseway (+plural)
+5847) fuscous
+5848) McCann (+'s - name - Wikipedia)
+5849) Eamon (+'s - name)
+5850) ruckus
+5851) Kattegat (name)
+5852) katsura (+plural)
+5853) crenulate (+ed)
+5854) crenulation (+plural)
+5855) papillated (Collins)
+5856) denticulate (+ed)
+5857) unretouched (Collins)
+5858) ornithoid (Collins)
+5859) Guardi (+'s - name)
+5860) Kaczorowski (+'s - name - Wikipedia)
+5861) Redgrave (+'s - name)
+5862) IDs (added plural - Wiktionary)
+5863) mins (added plural - Wiktionary)
+5864) PMC (abbreviation - Collins)
+5865) Schenk (+'s - name - Wikipedia)
+5866) Afrikanerdom
+5867) Broederbond (+'s)
+5868) life-force (removed since Oxford says it is two words)
+5869) autoreverse (Collins)
+5870) autocrime (+plural - Collins)
+5871) 3DES (cryptography - Wiktionary)
+5872) IEC (International Electrotechnical Commission - Wiktionary)
+5873) Framingham (+'s - name)
+5874) Mahdia (+'s - name - Wikipedia)
+5875) rulemaking
+5876) Zoloft (medicament - Wikipedia)
+5877) Paxil (medicament - Wikipedia)
+5878) antiulcer (Collins)
+5879) polyneuropathy
+5880) Ecstasy (the drug - upper case - Kevin Atkinson wordlist 60)
+5881) Victorianism (Kevin Atkinson wordlist 60)
+5882) Forster's (added the 's - name)
+5883) Ecuadorean (+plural - another way of Ecuadorian)
+5884) ectotherm (+plural +ic)
+5885) ectothermy
+5886) endotherm (+plural)
+5887) endothermy
+5888) hominoid (+plural)
+5889) frugivore (+plural)
+5890) frugivorous
+5891) nectarivorous
+5892) Iban
+5893) IBAN (+plural - abbreviation: International Bank Account Number)
+5894) BIC (+plural - abbreviation: Bank Identifier Code - Wiktionary)
+5895) outshoot
+5896) outshot (past of previous word)
+5897) subacute
+5898) haematogenous
+5899) extrasystole (+plural)
+5900) counterirritant (+plural)
+5901) counterirritation
+5902) antilogy (+plural)
+5903) antilog (added singular)
+5904) anti-lock
+5905) Lexus (+'s - name of car - Wikipedia)
+5906) outdrink (+s +ing)
+5907) outdrank (past of previous word)
+5908) outdrunk (past participle of word before previous word)
+5909) outdrive (+s +ing)
+5910) outdrove (past of previous word)
+5911) outdriven (past participle of word before previous word)
+5912) Carrington (+'s - name)
+5913) Beckmann (+'s - name)
+5914) McClintock (+'s - name)
+5915) McCullers (+'s - name)
+5916) McEnroe (+'s - name)
+5917) substring (+plural - Wiktionary)
+5918) awk (+plural - Oxford: informal)
+5919) Gloria's (added the 's - name)
+5920) logistician (+plural - Wiktionary)
+5921) pseudoword (+plural - Wiktionary)
+5922) phonotactic (+plural)
+5923) associability
+5924) Cayley (+'s - name)
+5925) associateships (added plural)
+5926) vocables (added plural)
+5927) trigram (+plural)
+5928) bigram (+plural)
+5929) phonogram (+plural)
+5930) encipherment
+5931) doornails (added plural)
+5932) Ebbinghaus (+'s - name - Wikipedia)
+5933) housebuilder (+plural)
+5934) Halstead (+'s - name - Wikipedia)
+5935) forcemeat
+5936) power-hungry
+5937) Douglas's (added the 's - name)
+5938) Menelaus (+'s - name)
+5939) Spyckerelle (name of friend)
+5940) Filiep (name of friend)
+5941) piecrust (piecrust table)
+5942) Christie's (added the 's - name)
+5943) buy-back (+plural)
+5944) Charlie's (added the 's - name)
+5945) shrimping (merged into shrimp)
+5946) Padstow (name - Wikipedia)
+5947) FY (abbreviation: British: Financial Year)
+5948) FX
+5949) FWIW (Oxford: informal: For What It's Worth)
+5950) fuzzy-wuzzy (+plural - Oxford: informal and offensive)
+5951) Heckmann (+'s - name - Wikipedia)
+5952) bassline (+plural)
+5953) mellophone
+5954) Etherington (+'s - name - Wikipedia)
+5955) lynchpin (+plural - another way of linchpin)
+5956) Allcock (+'s - name - Wikipedia)
+5957) preplan (+s +ing +ed - Collins)
+5958) chamade (Collins)
+5959) prepolymer (+plural)
+5960) siloxane (+plural)
+5961) silane (+plural)
+5962) penetrant (+plural)
+5963) berk (+plural - Kevin Atkinson wordlist 60)
+5964) billhook (+plural - Kevin Atkinson wordlist 60)
+5965) Rawiri (name - Wikipedia)
+5966) billfish (+plural)
+5967) mesopelagic
+5968) benthos
+5969) benthic
+5970) satrapy (+plural)
+5971) Persepolis (+'s - name)
+5972) perseverate (+s +ing +ed +ion)
+5973) Bitterman (+'s - name - Wikipedia)
+5974) stressless (merged into stress)
+5975) stressor (+plural)
+5976) STRESS (computer programming language)
+5977) underdress (+s +ing +ed)
+5978) incandesce (+s +ing +ed)
+5979) Soay (+'s - name)
+5980) soaraway
+5981) Ryanair (+'s - name - Wikipedia)
+5982) soapily (merged into soapy)
+5983) Rennie (+'s - name)
+5984) countertrade
+5985) countervalue
+5986) counterweigh (+s +ing +ed)
+5987) Zazzo (+'s - name - Wikipedia)
+5988) Tynan (name - Wikipedia)
+5989) Mephisto (+'s - name - Wikipedia)
+5990) Mephistophelian
+5991) Mephistophelean
+5992) Cynewulf (+'s - name)
+5993) Bentham (added the 's - name)
+5994) retranslate (+s +ing +ed)
+5995) retranslation (+plural)
+5996) Teilhard (+'s - name)
+5997) Loeb (+'s - name - Wikipedia)
+5998) amu (abbreviation: Atomic mass unit)
+5999) bigha (+plural)
+6000) Warminster (+'s - name - Wikipedia)
+6001) Durnford (+'s - name - Wikipedia)
+6002) Darell (name - Wikipedia)
+6003) Ancaster (+'s - name - Wikipedia)
+6004) Waterval (name - Wikipedia)
+6005) Balla (+'s - name - Wikipedia)
+6006) Malton (+'s - name - Wikipedia)
+6007) Croke (+'s - name - Wikipedia)
+6008) Moorhead (+'s - name)
+6009) Clemente (+'s - name)
+6010) sophomoric
+6011) Salford's (added the 's - name)
+6012) skint (Oxford: informal)
+6013) Hemphill (+'s - name - Wikipedia)
+6014) skintight
+6015) Cassie (+'s - name - Wikipedia)
+6016) hued + hueless (merged into hue)
+6017) kung + fu (kung fu)
+6018) buckbean (+plural)
+6019) bogbean (+plural - another way of previous word)
+6020) cloudberry (+plural)
+6021) Grahamstown (+'s - name - Wikipedia)
+6022) airburst (+plural)
+6023) flip-flopping + flip-flopped (merged into flip-flop)
+6024) frack (+s +ing +ed +er +ers)
+6025) hazmat (+plural)
+6026) overthink (+s +ing)
+6027) overthought (past participle of previous word)
+6028) paraglider (+plural)
+6029) paraglide (+s +ing +ed)
+6030) paywall (+s +ed)
+6031) photobomb (+s +ing +ed +er +ers)
+6032) fave (+plural - Oxford: informal)
+6033) plastique
+6034) polyamory
+6035) polyamorist
+6036) polyamorous
+6037) remortgage (+s +ing +ed)
+6038) reorg (+plural - Oxford: informal)
+6039) Vinson (+'s - name)
+6040) satay
+6041) scrunchier + scrunchiest + scrunchy
+6042) scrunchie (+plural)
+6043) slumdog (+plural - Wiktionary)
+6044) spams (merged into spam)
+6045) stoners (added plural)
+6046) truthiness (Oxford: informal)
+6047) Colbert's (added the 's - name)
+6048) twerked (merged into twerk)
+6049) widescreens (added plural)
+6050) DMCA (abbreviation: Digital Millennium Copyright Act)
+6051) DHSS (abbreviation: Department of Health and Social Security)
+6052) Affero (GNU Affero General Public License)
+6053) AGPL
+6054) Stallman (+'s - name - Wikipedia)
+6055) Stallmann (+'s - name - Wikipedia)
+6056) relicense (+s +ing +ed)
+6057) Hibbard (+'s - name - Wikipedia)
+6058) Geraldton (+'s - name)
+6059) demi-glace (another way of demi-glaze)
+6060) Hippolyta (+'s - name - Wikipedia)
+6061) Engberg (+'s - name - Wikipedia)
+6062) Aldiss (+'s - name)
+6063) Carnell (+'s - name - Wikipedia)
+6064) Stubbs (+'s - name - Wikipedia)
+6065) Buckland (+'s - name)
+6066) globe-like
+6067) globoid
+6068) globose
+6069) perinuclear
+6070) microfilament (+plural)
+6071) poliovirus (+plural)
+6072) echovirus (+plural)
+6073) Coxsackie (Coxsackie virus)
+6074) Kaposi (+'s - name)
+6075) cytomegalovirus
+6076) anoxia
+6077) anoxic
+6078) toxoplasmosis
+6079) Harrison's (added the 's - name)
+6080) unsubjugated
+6081) unsubdued
+6082) unstylish
+6083) unstuffed
+6084) Coogan (+'s - name - Wikipedia)
+6085) unstudiedly
+6086) Armani (+'s - name)
+6087) unstring (+s +ing)
+6088) unpressed
+6089) prestressed
+6090) prestressing
+6091) unpresuming
+6092) Pollyanna (+plural)
+6093) Pollyannaish
+6094) Pollyannaism
+6095) Mattson (+'s - name - Wikipedia)
+6096) unpresentable
+6097) Lyotard (+'s - name)
+6098) unprescribed
+6099) unpreparedness
+6100) Harbor (name: Pearl Harbor)
+6101) unpremeditatedly
+6102) Ullmann (+'s - name - Wikipedia)
+6103) UN's (added the 's - United Nations)
+6104) unprintably
+6105) Carson's (added the 's - name)
+6106) Millie's (added the 's - name)
+6107) Alexandra (+'s - name - Wikipedia)
+6108) ataraxy
+6109) ataraxia (another way of previous word)
+6110) ataractic
+6111) ataraxic
+6112) chiromancy
+6113) cartomancy
+6114) archaeoastronomy
+6115) antitumour
+6116) archaea
+6117) archaean (+plural - in lower case - biology related)
+6118) predawn
+6119) Marvin's (added the 's - name)
+6120) Harrigan (+'s - name - Wikipedia)
+6121) Goldie (+'s - name - Wikipedia)
+6122) sporophyte (+plural)
+6123) sporophytic
+6124) sporangium
+6125) sporangia (plural of previous word)
+6126) sporangial
+6127) avgas
+6128) dustproof (Collins)
+6129) Bingley (+'s - name - Wikipedia)
+6130) Malmesbury (name - Wikipedia)
+6131) rebirth (+s +ing +ed +er +ers)
+6132) meshwork
+6133) mesial (+ly)
+6134) crus
+6135) crura (plural of previous word)
+6136) neoplasia
+6137) cingulum
+6138) cingula (plural of previous word)
+6140) cingulate
+6141) commissural
+6142) acetabulum
+6143) acetabula
+6144) cheekpiece (+plural)
+6145) Frederickson (+'s - name - Wikipedia)
+6146) Gonubie (name - Wikipedia)
+6147) lytic
+6148) lytically
+6149) Sudetenland (name)
+6150) Baltistan (+'s - name)
+6151) Karakoram
+6152) karaka
+6153) fescue (+plural)
+6154) orchardist (+plural)
+6155) rootstocks (added plural)
+6156) poisonwood (Collins)
+6157) rootsy (+ier +iest)
+6158) rootworm (+plural)
+6159) nerd's (added the 's)
+6160) nerdiness
+6161) nerdish
+6162) nerdishness
+6163) Mahoney (+'s - name - Wikipedia)
+6164) Pasadena (+'s - name)
+6165) technobabble (Oxford: informal)
+6166) Pekar (+'s - name - Wikipedia)
+6167) teratogen (+plural +ic)
+6168) teratogenicity
+6169) teratological
+6170) teratologist (+plural)
+6171) zeaxanthin
+6172) chloroplastic (Collins)
+6173) helotage
+6174) helotism
+6175) helotry
+6176) Messenia (+'s - name - Wikipedia)
+6177) unfree
+6178) unfreedom
+6179) Keane's (added the 's - name)
+6180) condoners (added plural)
+6181) undersow (+s +ing +ed)
+6182) undersown (past participle of previous word)
+6183) understaffing
+6184) engrailed
+6185) invected
+6186) keyer (+plural)
+6187) keyless
+6188) Everman (+'s - name - Wikipedia)
+6189) Bharati (+'s - name - Wikipedia)
+6190) Durga (+'s - name)
+6191) Waterberg (name - Wikipedia)
+6192) Durey (+'s - name)
+6194) Saint-Tropez (+'s - name)
+6195) revalorization (Collins -IZE)
+6196) revalorisation (Collins -ISE)
+6197) Ainsley (+'s - name - Wikipedia)
+6198) Matsuyama (name)
+6199) matsuri
+6200) scablands
+6201) Mengele (+'s - name - Wikipedia)
+6202) Neuburg (name - Wikipedia)
+6203) clientship
+6204) clanship
+6205) mafia (+plural - lower case - generic Mafia)
+6206) Lucian's (added the 's - name)
+6207) contrabandist (+plural)
+6208) contrabasses (added plural)
+6209) autocatalysis
+6210) autocatalyst (+plural)
+6211) autocatalytic
+6212) reprography
+6213) reprographer (+plural)
+6214) reprographic
+6215) cosmography (+plural)
+6216) cosmographer (+plural)
+6217) cosmographic
+6218) cosmographical
+6219) Strieber (+'s - name - Wikipedia)
+6220) Randle (+'s - name - Wikipedia)
+6221) Symington (+'s - name - Wikipedia)
+6222) Hellyer (+'s - name - Wikipedia)
+6223) landrace (+plural)
+6224) admix (+s +ing +ed)
+6225) landrail
+6226) landplane (+plural)
+6227) Corsham (+'s - name - Wikipedia)
+6228) lordship (+plural - also in lower case)
+6229) signorial (Collins)
+6230) signoria (Collins)
+6231) Denbigh (name - Wikipedia)
+6232) malar
+6233) zygomatic (zygomatic bone)
+6234) hyperpigmentation
+6235) erythematosus (lupus erythematosus)
+6236) dermatomyositis
+6237) scleroderma
+6238) polymyositis
+6239) carnitine (Collins)
+6240) polymyalgia
+6241) rheumatica (polymyalgia rheumatica)
+6242) arthralgia
+6243) vasculitis
+6244) vasculitides (plural of previous word)
+6245) myalgia
+6246) myalgic
+6247) resplendency
+6248) demurrable
+6249) demurrer (+plural)
+6250) potentiate (+plural)
+6251) cannabinoid (+plural)
+6252) tetrahydrocannabinol
+6253) digoxin
+6254) glycoside (+plural)
+6255) elastin
+6256) UTC (Collins - abbreviation: Universal Time Coordinated)
+6257) CET (abbreviation: Central European Time)
+6258) bimillenary (+plural)
+6259) unimodal
+6260) extravert (another way for extrovert)
+6261) extraversion (another way for extroversion)
+6262) underserved
+6263) undersecretary (+plural)
+6264) frontbencher (+plural)
+6265) snubbers (added plural)
+6266) clubber (+plural - Oxford: informal)
+6267) clozapine
+6268) myocarditis
+6269) carphology
+6270) Elvington (name - Wikipedia)
+6271) Lakenheath (+'s - name - Wikipedia)
+6272) drysuit (+plural)
+6273) Balharry (+'s - name - Wikipedia)
+6274) spinneys (added plural)
+6275) Schoharie (name - Wikipedia)
+6276) maquette (+plural)
+6277) Schutte (+'s - name - Wikipedia)
+6278) Puget (+'s - name - Wikipedia)
+6279) Mapuche (+plural)
+6280) Araucanian (+plural)
+6281) Gaeltacht (name)
+6282) Ramsden (+'s - name - Wikipedia)
+6283) Xcode (+'s - Wikipedia)
+6284) freeboots + freebooting + freebooted (merged into freeboot)
+6285) Blackthorne (+'s - name - Wikipedia)
+
+
+V2.25 - 1-JUN-2015
+------------------
+6286) lux
+6287) lx (abbreviation of previous word)
+6288) illuminance (+plural)
+6289) fluoxetine
+6290) luminaire (+plural)
+6291) chromaticity
+6292) nestlings (added plural)
+6293) winkler (+plural)
+6294) Breydon (+'s - name - Wikipedia)
+6295) Netherfield (name - Wikipedia)
+6296) Bintley (name - Wikipedia)
+6297) Kircubbin (name - Wikipedia)
+6298) trail's (added the 's)
+6299) Rossendale (+'s - name - Wikipedia)
+6300) Gillian (+'s - name - Wikipedia)
+6301) sheepshead
+6302) waymark (+s +ing +ed +er +ers)
+6303) Hawkshead (name - Wikipedia)
+6304) Sperrin (name - Wikipedia)
+6305) Evette (+'s - name - Wikipedia)
+6306) Donnie (+'s - name - Wikipedia)
+6307) Maddy (+'s - name - Wikipedia)
+6308) surtout
+6309) Wilder (+'s - name - Wikipedia)
+6310) Cassady (+'s - name - Wikipedia)
+6311) Wootton (+'s - name - Wikipedia)
+6312) Marisol (+'s - name - Wikipedia)
+6313) Mencken (+'s - name - Wikipedia)
+6314) Denpasar (+'s - name - Wikipedia)
+6315) Tybee (+'s - name - Wikipedia)
+6316) Kurtz (+'s - name - Wikipedia)
+6317) Smithville (+'s - name - Wikipedia)
+6318) Dothan (+'s - name - Wikipedia)
+6319) Fogg (+'s - name - Wikipedia)
+6320) Flintoff's (added the 's - name)
+6321) batsmanship
+6322) batrachian
+6323) anuran (+plural)
+6324) branchia
+6325) branchiae (plural of previous word)
+6326) branchial
+6327) Janvier (+'s - name - Wikipedia)
+6328) unjointed
+6329) craniate (+plural)
+6330) out-group (+plural)
+6331) cephalochordate (+plural)
+6332) urochordate (+plural)
+6333) tunicate (+plural +ed)
+6334) plumose
+6335) glabrous
+6336) labellum
+6337) labella (plural of previous word)
+6338) diapause (+ing)
+6339) diapedesis
+6340) Waller (+'s - name - Wikipedia)
+6341) polymorphonuclear
+6342) leucocyte (+plural +ic)
+6343) immunoreactive (Collins)
+6344) phagocytosis
+6345) phagocytize (+s +ing +ed - IZE)
+6346) phagocytize (+s +ing +ed - ISE)
+6347) phagocytose (+ed)
+6348) neutrophilic
+6349) chronobiologist's (added the 's)
+6350) outpaces (added plural)
+6351) Arber (+'s - name - Wikipedia)
+6352) Columba (name)
+6353) Columbae
+6354) outmuscle (+s +ing +ed)
+6355) outbreed (+ing)
+6356) outbred (past and past participle of previous word)
+6357) carnivalesque
+6358) weblogging (Collins)
+6359) orgiastically
+6360) orgulous
+6361) orgasmically
+6362) orgastic
+6363) orgastically
+6364) vaginismus
+6365) vaginoplasty
+6366) biohacking
+6367) biohacker (+plural)
+6368) Gerstein (+'s - name - Wikipedia)
+6369) bioaccumulations (added plural)
+6370) metabolizes + metabolizing + metabolized (merged into metabolize - IZE)
+6371) metabolizable (IZE)
+6372) metabolisable (ISE)
+6373) metabolizer (+plural - IZE)
+6374) metaboliser (+plural - ISE)
+6375) evaginate
+6376) evagination (+plural)
+6377) evert (+s +ing +ed)
+6378) eversible
+6379) eversion
+6380) adenohypophysis (Collins)
+6381) adenohypophyses (Collins - plural of previous word)
+6382) nuchal
+6383) trapezius
+6384) trapezii (plural of previous word)
+6385) spinose
+6386) spinous (another way of previous word)
+6387) subnatural (Collins)
+6388) subsale (Collins)
+6389) subsocial (Collins)
+6390) substyle (Collins)
+6391) suprarational (Collins)
+6392) seminatural (Collins)
+6393) supernature (Collins)
+6394) supravitally (Collins)
+6395) Edentata
+6396) Xenarthra (another way of previous word)
+6397) xenarthran (+plural)
+6398) polyphyletic
+6399) paraphyletic
+6400) edentate (+plural)
+6401) sloths (added plural)
+6402) sabretooth
+6403) Pleistocene
+6404) australopithecine (+plural)
+6405) Pliocene
+6406) unconformably
+6407) Wiens (name - Wikipedia)
+6408) Moine (name - Wikipedia)
+6409) Permian
+6410) Lindisfarne (+'s - name)
+6411) ammoniacal
+6412) semelparous (Collins)
+6413) cupro-nickel
+6414) cupule (+plural)
+6415) uniaxial (+ly)
+6416) encapsidate (+s +ing +ed +ion)
+6417) isotopically
+6418) isotopy
+6419) triton (+plural +'s)
+6420) Triton (+'s - name)
+6421) overmedicate (Collins)
+6422) overmedication (Collins)
+6423) overprocess (Collins)
+6424) overpromote (Collins)
+6425) overcredulous (Collins)
+6426) overedit (Collins)
+6427) overtedious (Collins)
+6428) Declan (+'s - name - Wikipedia)
+6429) electroclash (Collins)
+6430) Kandy (name - Wikipedia)
+6431) Mandy (+'s - name - Wikipedia)
+6432) Nandi (+'s - name - Wikipedia)
+6433) bandy-bandy (+plural)
+6434) Zack (+'s - name - Wikipedia)
+6425) Phobos (name)
+6426) Brixton (+'s - name - Wikipedia)
+6427) Bettman (+'s - name - Wikipedia)
+6428) Schlemiel (+s - name - Wikipedia)
+6429) Ursa (Ursa Major)
+6430) uroscopy
+6431) Theophilus (+'s - name - Wikipedia)
+6432) urostyle
+6433) kinesis
+6434) kineses (plural of previous word)
+6435) kinesiology
+6436) kinesiological
+6437) kinesiologist (+plural)
+6438) Samarra (+'s - name - Wikipedia)
+6439) symplast (+ic)
+6440) plasmodesma
+6441) plasmodesmata (plural of previous word)
+6442) adpressed
+6443) sclerite (+plural)
+6444) dolphinarium (+plural)
+6445) dolphinaria (another plural of previous word)
+6446) bottlenose (dolphin + whale)
+6447) bottle-nosed (dolphin + whale)
+6448) armamentarium
+6449) armamentaria (plural of previous word)
+6450) interneurons (plural of interneuron)
+6451) interneurones (plural of interneurone - another way of previous word)
+6452) Gurley (+'s - name - Wikipedia)
+6453) homonymic
+6454) homonymous
+6455) homonymy
+6456) polysemy
+6457) polysemic
+6458) polysemous
+6459) anonym (+plural)
+6460) Oguibe (+'s - name - Wikipedia)
+6461) thunderbox (fixed: thunder-box)
+6462) Max (+'s - name - Wikipedia)
+6463) Turnbull (+'s - name - Wikipedia)
+6464) thunderbug (+plural)
+6465) Newbridge (name - Wikipedia)
+6466) McNally (+'s - name - Wikipedia)
+6467) McCaffrey (+'s - name - Wikipedia)
+6468) Queally (+'s - name - Wikipedia)
+6469) thunderousness
+6470) Gilmartin (+'s - name - Wikipedia)
+6471) thunderhead (+plural)
+6472) thunderfly (+plural)
+6473) aftersales
+6474) hotlines (added plural)
+6475) hotlink (+plural +ing - Wiktionary)
+6476) hotlist
+6477) apolune
+6478) perilune
+6479) manoeuvrer (+plural)
+6480) Maugham (+'s - name - Wikipedia)
+6481) chlorophyte (+plural)
+6482) rhodophyte (+plural)
+6483) monophyly (Collins)
+6484) adnate
+6485) connate
+6486) calathea (+plural)
+6487) beefwood
+6488) stocktake (+r +ers)
+6489) RAAF (abbreviation for: Royal Australian Air Force)
+6490) Mochizuki (+'s - name - Wikipedia)
+6491) Eratosthenes's (added the 's - name)
+6492) compositeness (merged into composite)
+6493) Andie (+'s - name - Wikipedia)
+6494) Annabelle (+'s - name - Wikipedia)
+6495) Resnick (+'s - name - Wikipedia)
+6496) Muthesius (name - Wikipedia)
+6497) workboat (+plural)
+6498) refloat (+s +ing +ed)
+6499) reflexologist (+plural)
+6500) reflexible
+6501) reflexibility
+6502) Zeiss (+'s - name)
+6503) Leica (+'s - name - Wikipedia)
+6504) Pentax (+'s - name - Wikipedia)
+6505) Benoni (+'s - name - Wikipedia)
+6506) zeitgeber (+plural)
+6507) zein
+6508) Evans-Pritchard (+'s - name)
+6509) evaporable
+6510) hydroperoxide (Collins)
+6511) anthracene
+6512) pyrene
+6513) alizarin
+6514) Kossa (+'s - name - Wikipedia)
+6515) Raes (name - Wikipedia)
+6516) unimolecular
+6517) Stern-Volmer (Stern-Volmer relationship: Wikipedia)
+6518) unseduced (Collins)
+6519) Giuliani (+'s - name - Wikipedia)
+6520) unimposingly
+6521) Ana (+'s - name - Wikipedia)
+6522) biryani + biriyani + biriani (Indian dish)
+6523) birthwort (+plural)
+6524) birthweight
+6525) haematocrit
+6526) intraoperative
+6527) spectate (+s +ing +ed)
+6528) spectatorial
+6529) spectatorship
+6530) spectinomycin
+6531) biogeneric (+plural)
+6532) Coughlin (+'s - name - Wikipedia)
+6533) equivalency
+6534) Bahamians (added plural)
+6535) Cameroonian (+plural)
+6536) Mariel (+'s - name - Wikipedia)
+6537) Savimbi (+'s - name - Wikipedia)
+6538) McKenna (+'s - name - Wikipedia)
+6539) Robichaud (+'s - name - Wikipedia)
+6540) plugger (+plural)
+6541) Chuckie (+'s - name - Wikipedia)
+6542) Francophile (+plural)
+6543) Lennox (+'s - name - Wikipedia)
+6544) Sandhurst (+'s - name - Wikipedia)
+6545) Anglophilia
+6546) Breitinger (+'s - name - Wikipedia)
+6547) flatbread
+6548) flatbug
+6549) Nuttall (+'s - name - Wikipedia)
+6550) flyest
+6551) flyness
+6552) ferruginous
+6553) Mery (+'s - name of friend)
+6554) Eckard (+'s - name - Wikipedia)
+6555) Berberich (+'s - name - Wikipedia)
+6556) MS-DOS
+6557) bootmaker (+plural)
+6558) Brighouse (+'s - name - Wikipedia)
+6559) Gupta (+'s - name - Wikipedia)
+6560) Sharam (+'s - name - Wikipedia)
+6561) bootlicker (+plural - Oxford: informal)
+6562) Bloomberg (+'s - name - Wikipedia)
+6563) Babs (+'s - name - Wikipedia)
+6564) necklet (+plural)
+6565) Lismore (+'s - name - Wikipedia)
+6566) Netto (+'s - name - Wikipedia)
+6567) surjection (+plural)
+6568) surjective
+6569) permutational
+6570) Tattersall (+'s - name - Wikipedia)
+6571) Petrov (+'s - name - Wikipedia)
+6572) out-half
+6573) Mullingar (+'s - name - Wikipedia)
+6574) monophyletic
+6575) endosymbiosis
+6576) endosymbiont (+plural)
+6577) endosymbiotic
+6578) phototroph (+ic)
+6579) anthozoan (+plural)
+6580) anthophilous
+6581) Anthozoa
+6582) Cnidaria
+6583) Ctenophora
+6584) Placozoa
+6585) Echiura
+6586) echiuran (+plural)
+6587) echiuroid (+plural)
+6588) respirometer (+plural)
+6589) polarographic
+6590) potentiometry (+ic)
+6591) Polaroid (+plural - Oxford: trademark)
+6592) Jeana (name - Wikipedia)
+6593) doublure
+6594) Borobudur (+'s - name - Wikipedia)
+6595) photogravure (+plural)
+6596) Gornik (+'s - name - Wikipedia)
+6597) calotype
+6598) Lacock (name - Wikipedia)
+6599) Ezekiel's (added the 's - name)
+6600) Antiguan
+6601) antihypertensive
+6602) antidiabetic (Collins)
+6603) hypotension
+6604) multisystem (Collins)
+6605) obtention
+6606) hypostyle
+6607) Ramses (+'s - name - Wikipedia)
+6608) Karnak (+'s - name - Wikipedia)
+6609) Serlio (+'s - name - Wikipedia)
+6610) Iphigenia (+'s - name - Wikipedia)
+6611) tetrastyle
+6612) porticos (another plural of portico)
+6613) hexastyle (+plural)
+6614) octastyle
+6615) Bernini (+'s - name - Wikipedia)
+6616) octavalent
+6617) octarchy (+plural)
+6618) Gaurav (+'s - name - Wikipedia)
+6619) Jamil (+'s - name - Wikipedia)
+6620) Joel's (added the 's - name - Wikipedia)
+6621) Arriaga (+'s - name - Wikipedia)
+6622) Burney (+'s - name - Wikipedia)
+6623) Lynette (+'s - name - Wikipedia)
+6624) piquet
+6625) wagonette + waggonette (+plural)
+6626) Rivington (name - Wikipedia)
+6627) Harwood (+'s - name - Wikipedia)
+6628) Newbould (+'s - name - Wikipedia)
+6629) wagonload (+plural)
+6630) Lupe (+'s - name - Wikipedia)
+6631) wagoner + waggoner (+'s +plural)
+6632) Fairburn (+'s - name - Wikipedia)
+6633) wagon-lit
+6634) wagons-lits (plural of previous word)
+6635) Arlette (name - Wikipedia)
+6636) Paulette (+'s - name - Wikipedia)
+6637) Claudette (+'s - name - Wikipedia)
+
+
+V2.26 - 1-JUL-2015
+------------------
+6638) understeer (+s +ing +ed)
+6639) oversteer (+s +ing +ed)
+6640) WAP
+6641) druggy
+6642) Tomaselli (+'s - name - Wikipedia)
+6643) Parello (+'s - name - Wikipedia)
+6644) Dulwich (+'s - name - Wikipedia)
+6645) drugget
+6646) drug-related
+6647) drug-free
+6648) Liam (+'s - name - Wikipedia)
+6649) Nadelmann (+'s - name - Wikipedia)
+6650) Dewhurst (+'s - name - Wikipedia)
+6651) Haider (+'s - name - Wikipedia)
+6652) Ravenscroft (+'s - name - Wikipedia)
+6653) Ede (+'s - name - Wikipedia)
+6654) Aguila (+'s - name - Wikipedia)
+6655) Bowker (+'s - name - Wikipedia)
+6656) dribbly
+6657) hyaline
+6658) disodium (Collins)
+6659) intranuclear (Collins)
+6660) svn (lower case)
+6661) SVN (upper case)
+6662) tarball (+plural - Wiktionary)
+6663) gzip (+s +ing +ed - Wiktionary)
+6664) Walfield (name - Wikipedia)
+6665) Gillmor (+'s - name - Wikipedia)
+6666) Pescetti (+'s - name - Wikipedia)
+6667) Galoppini (name - Wikipedia)
+6668) Beaussier (name - Wikipedia)
+6669) Valk (+'s - name - Wikipedia)
+6670) CMS (abbreviation: Content Management System)
+6671) Henschel (+'s - name - Wikipedia)
+6672) Yutaka (+'s - name - Wikipedia)
+6673) Philipp (+'s - name - Wikipedia)
+6674) Kewisch (+'s - name - Wikipedia)
+6675) stargate (+plural - Wiktionary)
+6676) teleporter (+plural - Wiktionary)
+6677) Redfern (+'s - name - Wikipedia)
+6678) Hopkinsville (+'s - name - Wikipedia)
+6679) CST (abbreviation: Central Standard Time)
+6680) Lynne (+'s - name - Wikipedia)
+6681) DipEd
+6682) classily
+6683) clastic
+6684) fissility
+6685) decompaction (+plural - Wiktionary)
+6686) interlayers (added plural)
+6687) sconces (added plural)
+6688) scombroid (+plural)
+6689) ciguatera
+6690) parrotfish (+plural)
+6691) parrotbill (+plural)
+6692) vegetational
+6693) acridine
+6694) ammoniated
+6695) valerian (+plural - in lower case if not a name)
+6696) campanula (+plural)
+6697) cannabinol
+6698) photoproduct (+plural)
+6699) photoprotein
+6700) photorealist
+6701) photorealistic
+6702) anamorphosis
+6703) anamorphoses (plural of previous word)
+6704) eccentrical (Collins)
+6705) gesso
+6706) gessoes (plural of previous word)
+6707) glass-like
+6708) didymium
+6709) Pyrex (trademark)
+6710) Jena (+'s - name)
+6711) cullet
+6712) Flemings (added plural)
+6713) Bretons (added plural)
+6714) Celts (added plural)
+6715) Galicians (added plural)
+6716) Catalans (added plural)
+6717) Asturians (added plural)
+6718) Pyrenees
+6719) Pyrenean
+6720) carbamate (+plural)
+6721) organophosphate (+plural)
+6722) organochlorine (+plural)
+6723) disruptors (added plural)
+6724) arbitral
+6725) riskless
+6726) Shleifer (+'s - name - Wikipedia)
+6727) risk-neutral
+6728) chargehand (+plural)
+6729) Kuster (+'s - name - Wikipedia)
+6730) lampstand (Collins)
+6731) Auriga (name in space)
+6732) MacPherson (+'s - name - Wikipedia)
+6733) moxibustion
+6734) adaptogenic
+6735) Yoda (+'s - name - Wikipedia)
+6736) therapeutical
+6737) therapeutist (+plural)
+6738) glucosamine
+6739) nicotinamide
+6740) nicotinic (nicotinic acid)
+6741) catabolite (+plural)
+6742) catachresis
+6743) catachreses (plural of previous word)
+6744) catachrestic
+6745) continuative (+plural)
+6746) basilect (+plural +'s)
+6747) acrolect's (added the 's)
+6748) basilectal
+6749) idiolects (added plural)
+6750) eggcorns (added plural)
+6751) Coren (+'s - name - Wikipedia)
+6752) antepenult
+6753) penult
+6754) boustrophedon
+6755) Gellibrand (+'s - name - Wikipedia)
+6756) declinational
+6757) declaw (+s +ing +ed)
+6758) enzootic
+6759) epizootic
+6760) epizoic
+6761) epizoite (+plural)
+6762) nutcase (+plural - Oxford: informal)
+6763) Lachman (+'s - name - Wikipedia)
+6764) Lawrie (+'s - name - Wikipedia)
+6765) dispiritingly
+6766) Balanchine (+'s - name - Wikipedia)
+6767) suffixal (Collins)
+6768) suffixion (Collins)
+6769) aspectual
+6770) aspecting + aspected (merged into aspect)
+6771) trine (+plural)
+6772) Dorotheus (name - Wikipedia)
+6773) midheaven
+6774) Torrington (+'s - name - Wikipedia)
+6775) beachside
+6776) Suttons (name - Wikipedia)
+6777) Redcliffe (+'s - name - Wikipedia)
+6778) Klandasan (name - Wikipedia)
+6779) meathead (+plural - Oxford: informal)
+6780) Hitchman (+'s - name - Wikipedia)
+6781) Clegg (+'s - name - Wikipedia)
+6782) Rodwell (+'s - name - Wikipedia)
+6783) Guiley (+'s - name - Wikipedia)
+6784) NDE (+plural - Wiktionary - Abbreviation: near-death experience)
+6785) dromos
+6786) dromoi (plural of previous word)
+6787) Bactrian (Bactrian camel)
+6788) bacteroid (+plural)
+6789) Bactria (name of place)
+6790) semiformal
+6791) semiweekly
+6792) semirural (Collins)
+6793) semierect (Collins)
+6794) semilethal (Collins)
+6795) semifeudal (Collins)
+6796) semivocal (Collins)
+6797) semideaf (Collins)
+6798) semiraw (Collins)
+6799) semioval (Collins)
+6800) Ashtaroth (+'s - name - Wikipedia)
+6801) totemism
+6802) totemist (+plural)
+6803) totemistic
+6804) Gotham (+'s - name - Wikipedia)
+6805) Lacan (+'s - name - Wikipedia)
+6806) Lacanian (+plural)
+6807) Lacanianism
+6808) Havelock (+'s - name - Wikipedia)
+6809) Bergenfield (+'s - name - Wikipedia)
+6810) uprose
+6811) uninterruptible
+6812) uninterruptedness
+6813) uninterestingness
+6814) psychobabble
+6815) untestable
+6816) unrequested
+6817) unintellectual
+6818) MacDiarmid (+'s - name - Wikipedia)
+6819) Kerala (+'s - name - Wikipedia)
+6820) arrondissement (+plural)
+6821) Chen's (added the 's - name)
+6822) judiciary's (added the 's)
+6823) arriviste (+plural)
+6824) Thackeray (+'s - name - Wikipedia)
+6825) arrivisme
+6826) midfielders (added plural)
+6827) Bullen (+'s - name - Wikipedia)
+6828) yielder (+plural)
+6829) Yiddishism
+6830) Yiddishist (+plural)
+6831) anaphylactic
+6832) camwood
+6833) Camus (+'s - name - Wikipedia)
+6834) layshaft (+plural)
+6835) driveshaft (+plural)
+6836) swingarm (Collins)
+6837) Hinkley (+'s - name - Wikipedia)
+6838) GTA (Wiktionary)
+6839) demerges + demerging (merged into demerge)
+6840) demeritorious
+6841) Piaget (+'s - name - Wikipedia)
+6842) electricals (added plural)
+6843) photoelectricity
+6844) gas-cooled
+6845) Torness (name - Wikipedia)
+6846) comminuted
+6847) orthopaedist (+plural)
+6848) trochanteric (Collins)
+6849) trochanteral (Collins)
+6850) triacetate
+6851) macrolanguage (+plural - Wiktionary)
+6852) macrolinguistics (Collins)
+6853) protolanguage (+plural)
+6854) paralanguage
+6855) code-switch (+s +ing +ed)
+6856) unilingual
+6857) unilingualism
+6858) unilingually
+6859) Quebecer (+plural)
+6860) Ogunquit (+'s - name - Wikipedia)
+6861) quebracho (+plural)
+6862) bluegums (added plural)
+6863) agroforestry
+6864) florals (added plural)
+6865) selfing + selfed (merged into self)
+6866) Brahmana (+plural)
+6867) branks (Collins)
+6868) araneous (Collins)
+6869) rankish (Collins)
+6870) rankless (Collins)
+6871) rankism (Collins)
+6872) crankish (Collins)
+6873) Bruegel + Breughel + Brueghel (name)
+6874) Cree (+plural - Kevin Atkinson wordlist 60)
+6875) dayan
+6876) dayanim (plural of previous word)
+6877) Frunze (+'s - name - Kevin Atkinson wordlist 60)
+6878) Bresson (+'s - name - Wikipedia)
+6879) fountainhead (+plural)
+6880) Guamanian (+plural - Kevin Atkinson wordlist 60)
+6881) Qur'an + Quran (another way of Koran)
+6882) Koranic + Qur'anic + Quranic
+6883) Lydians (added plural - Kevin Atkinson wordlist 60)
+6884) Mede (+plural)
+6885) Chicagoland (+plural +'s)
+6886) Imola (+'s - name - Wikipedia)
+6887) hand-pick (+ed)
+6888) Handan (+'s - name - Wikipedia)
+6889) hand-painted
+6890) Romina (+'s - name - Wikipedia)
+6891) fritillary (+plural)
+6892) Silverton (+'s - name - Wikipedia)
+6893) Tretikov (+'s - name - Wikipedia)
+6894) Wikimedia (+'s - name - Wikipedia)
+6895) Solapur (+'s - name - Wikipedia)
+6896) Akshaya (+'s - name - Wikipedia)
+6897) Iyengar (+'s - name - Wikipedia)
+6898) triggers (merged into trigger)
+6899) added "re" to trigger + triggers + triggering + triggered (Wiktionary)
+6900) pinboard (+plural)
+6901) Breightmet (name - Wikipedia)
+6902) dev (+plural - Wiktionary: abbreviation of developer)
+6903) devkit (+plural - Wiktionary)
+6904) annulate (+ed)
+6905) annulation (+plural)
+6906) seta
+6907) setae (plural of previous word)
+6908) setaceous
+6909) setal
+6910) clayware (Collins)
+6911) epidermoid
+6912) gastrula
+6913) gastrulae (plural of previous word)
+6914) gastrulation
+6915) Cottesloe (+'s - name - Wikipedia)
+6916) Bonnybridge (name - Wikipedia)
+6917) Grangemouth (+'s - name - Wikipedia)
+6918) Beckton
+6919) printworks
+6920) Boroughbridge (name - Wikipedia)
+6921) flashover (+plural)
+6922) oversaturated (Collins)
+6923) teleoperation
+6924) teleoperate (+s +ing +ed)
+6925) teleoperator
+6926) chatterbot (+plural)
+6927) Ramona (+'s - name - Wikipedia)
+6928) cyberporn
+6929) Danni (+'s - name - Wikipedia)
+6930) cyberpet (+plural)
+6931) Leonard (added the 's - name)
+6932) Lolita (+plural)
+6933) literality
+6934) literalize (-IZE)
+6935) literalise (-ISE)
+6936) literalist (+plural)
+6937) scientism
+6938) scientistic
+6939) pettifoggery
+6940) barratry
+6941) barrator (+plural)
+6942) barratrous
+6943) cusk-eel (+plural)
+6944) gorgonian (+plural)
+6945) pipefish (+plural)
+6946) pipeclay (+s +ing +ed)
+6947) trishaw (+plural)
+6948) Sharath (+'s - name - Wikipedia)
+6949) Penang (+'s - name - Wikipedia)
+6950) shophouse (+plural)
+6951) Lovett (+'s - name - Wikipedia)
+6952) shopman
+6953) shopmen (plural of previous word)
+6954) shopworker (+plural)
+6955) Burnham (+'s - name - Wikipedia)
+6956) obstructor (+plural)
+6957) Kingsford (+'s - name - Wikipedia)
+6958) Jens (+'s - name - Wikipedia)
+6959) postglacial
+6960) peatland (+plural)
+6961) ActiveX
+6962) autorecovery (Google)
+6963) autorecover (Google)
+6964) anonymise (+s +ing +ed - ISE)
+6965) anonymize (+s +ing +ed - IZE)
+6966) anonymization (-IZE)
+6967) anonymisation (-ISE)
+6968) Keaton (+'s - name - Wikipedia)
+6969) Kinsella (+'s - name - Wikipedia)
+6970) Al-Anon
+6971) Groff (+'s - name - Wikipedia)
+6972) immunotoxic (Collins)
+6973) aflatoxin (+plural)
+6974) groundnuts (added plural)
+6975) groundmass
+6976) phenocryst (+plural)
+6977) xenocryst (+plural +ic)
+6978) apomixis
+6979) apomictic
+6980) facultative
+6981) facultatively
+6982) auxotroph (+plural +ic)
+6983) thiamin (another way of thiamine)
+6984) autocrine
+6985) paracrine
+6986) chemosensory
+6987) sensillum
+6988) sensilla (plural of previous word)
+6989) campaniform (Collins)
+6990) palp (+plural)
+6991) palpi (another plural of previous word)
+6992) palpus (another way of palp)
+6993) palpal
+6994) palpability
+6995) multicentric
+6996) mammographic
+6997) deuteranopia
+6998) bryology
+6999) bryological
+7000) bryologist (+plural)
+7001) Ruud (+'s - name - Wikipedia)
+7002) bryony (+plural)
+7003) coralroot (+plural)
+7004) thimbleberry (+plural)
+7005) bittercress
+7006) fireweed
+7007) waterweed
+7008) silverweed
+7009) willowherb
+7010) rosebay
+7011) Scythia (name)
+7012) Scythian (+plural)
+7013) Sarmatia (name)
+7014) Sarmatian
+7015) Ossete (+plural)
+7016) Ossetic
+7017) Ossetia (name)
+7018) Ossetian (+plural)
+7019) Chechens (added plural)
+7020) Levi's (added the 's - name)
+7021) Hannah's (added the 's - name)
+7022) browbeater (+plural)
+7023) Wolfowitz (+'s - name - Wikipedia)
+7024) Broward (name of place)
+7025) chaffweed
+7026) buffo (+plural)
+7027) CRM (abbreviation: Customer Relationship Management)
+7028) Paterson (+'s - name - Wikipedia)
+7029) croakily
+7030) Maggie's (added the 's - name)
+7031) okey-dokey
+7032) okey-doke (another way of previous word)
+7033) Protista
+7034) protist (+plural)
+7035) protistan (+plural)
+7036) protistology
+7037) unwalled
+7038) embryogenesis
+7039) embryogenic
+7040) embryogeny
+7041) explant (+plural +ed)
+7042) explantation
+7043) concrescence
+7044) concrescent
+7045) intermedium
+7046) intermedia (plural of previous word)
+7047) griot (+plural)
+7048) oilstone
+7049) cheese-skipper
+7050) cheese-cutter (+plural)
+7051) cheese-paring
+7052) Kidman (+'s - name - Wikipedia)
+7053) Sheehan (+'s - name - Wikipedia)
+7054) meany (another way of meanie)
+7055) capitulum
+7056) capitula (plural of previous word)
+7057) coracoid
+7058) CNS (abbreviation: Central Nervous System)
+7059) cnidarian (+plural)
+7060) nematocyst (+plural)
+7061) lancelet (+plural)
+7062) notochord (+plural)
+
+
+V2.27 - 1-AUG-2015
+------------------
+7063) Uriarte (+'s - name - Wikipedia)
+7064) Traynor (+'s - name - Wikipedia)
+7065) dreamwork
+7066) Hergenröther (+'s - name - Wikipedia)
+7067) Ralph (+'s - name - Wikipedia)
+7068) far-distant
+7069) far-ranging
+7070) Verdana
+7071) unextended (Collins)
+7072) blobby (+ier +iest)
+7073) luderick
+7074) Luddites (added plural)
+7075) Luddism
+7076) Ludditism
+7077) pressroom (Collins)
+7078) dominators (added plural)
+7079) gynarchy (+plural)
+7080) Augustine's (added the 's - name)
+7081) emmet
+7082) mitogen (+plural +ic)
+7083) vasoconstriction
+7084) vasoconstrictive
+7085) vasoconstrictor (+plural)
+7086) antidiuretic (antidiuretic hormone)
+7087) antidiarrhoeal
+7088) anti-emetics (added plural)
+7089) inhabitability
+7090) ultrarapid (Collins)
+7091) ultracompetent (Collins)
+7092) multispeed (Collins)
+7093) superspeed (Collins)
+7094) ultrasafe (Collins)
+7095) outspeed (Collins)
+7096) counterterror (Collins)
+7097) counterthreat (Collins)
+7098) counterthrust (Collins)
+7099) countereffort (Collins)
+7100) counterreformer (Collins)
+7101) ultisol (+plural)
+7102) oxisol (+plural)
+7103) epicentral
+7104) transcurrent
+7105) rockslide (+plural)
+7106) icefall (+plural)
+7107) Perry (+'s - name - Wikipedia)
+7108) snowshoers (added plural)
+7109) après-ski (+ing)
+7110) Zermatt (+'s - name - Wikipedia)
+7111) barrique (+plural)
+7112) cedary (Collins)
+7113) unprioritized (Wiktionary: -IZE)
+7114) unprioritised (Wiktionary: -ISE)
+7115) PDT (abbreviation: Pacific Daylight Time)
+7116) daymare (+plural)
+7117) daypack (+plural)
+7118) daysacks (added plural)
+7119) flyblow
+7120) flyback
+7121) Damietta (+'s - name - Wikipedia)
+7122) referentiality
+7123) Watten (+'s - name - Wikipedia)
+7124) Derrida (+'s - name - Wikipedia)
+7125) Stancanelli (name - Wikipedia)
+7126) Appiah (+'s - name - Wikipedia)
+7127) gastroenterology
+7128) gastroenterological
+7129) gastroenterologist (+plural)
+7130) dysphagia
+7131) dysarthria
+7132) contrabassoon
+7133) endometrium
+7134) endometrial
+7135) endometriosis
+7136) endolymph
+7137) endoglossic
+7138) exoglossic
+7139) agrammatism
+7140) agranulocytosis
+7141) epiphanic
+7142) Azilian
+7143) Chalcolithic
+7144) Acheulian
+7145) agonistic
+7146) agonistically
+7147) welfarism
+7148) welfarist
+7149) Bretton (+'s - name - Wikipedia)
+7150) Beveridge (+'s - name - Wikipedia)
+7151) Metrotown (+'s - name - Wikipedia)
+7152) Burnaby (+'s - name - Wikipedia)
+7153) Rideau (+'s - name - Wikipedia)
+7154) Manulife (+'s - name - Wikipedia)
+7155) Ripon (+'s - name - Wikipedia)
+7156) Wakefield's (added the 's - name - Wikipedia)
+7157) Southwell (+'s - name - Wikipedia)
+7158) Devonport (+'s - name - Wikipedia)
+7159) Stonehouse (+'s - name - Wikipedia)
+7160) Teesside (+'s - name - Wikipedia)
+7161) Sarum (+'s - name - Wikipedia)
+7162) Sandwell (+'s - name - Wikipedia)
+7163) Asaph (+'s - name - Wikipedia)
+7164) Ilkley (+'s - name - Wikipedia)
+7165) Shipley (+'s - name - Wikipedia)
+7166) Herne (+'s - name - Wikipedia)
+7167) Carnforth (+'s - name - Wikipedia)
+7168) Heysham (+'s - name - Wikipedia)
+7169) Otley (+'s - name - Wikipedia)
+7170) Harpenden (+'s - name - Wikipedia)
+7171) Pendlebury (+'s - name - Wikipedia)
+7172) Swinton (+'s - name - Wikipedia)
+7173) Hetton-le-Hole (name - Wikipedia)
+7174) Houghton-le-Spring (+'s - name - Wikipedia)
+7175) Castleford (+'s - name - Wikipedia)
+7176) Ossett (+'s - name - Wikipedia)
+7177) Pontefract (+'s - name - Wikipedia)
+7178) Alresford (+'s - name - Wikipedia)
+7179) Tameside (+'s - name - Wikipedia)
+7180) Cottingham (+'s - name - Wikipedia)
+7181) Brechin (+'s - name - Wikipedia)
+7182) Dunkeld (+'s - name - Wikipedia)
+7183) Letchworth (+'s - name - Wikipedia)
+7184) Earley (+'s - name - Wikipedia)
+7185) Woodley (+'s - name - Wikipedia)
+7186) Ashgate (+'s - name - Wikipedia)
+7187) Kirkwall (+'s - name - Wikipedia)
+7188) credentialed + credentialing (merged into credential)
+7189) irreverential
+7190) Alfie (+'s - name - Wikipedia)
+7191) irresponsive
+7192) irresponsiveness
+7193) non-Aboriginal
+7194) non-achiever (+plural)
+7195) dehydrocholesterol
+7196) cholecalciferol
+7197) IU (abbreviation: International Unit)
+7198) decimetric
+7199) centimetric (Collins)
+7200) clast (+plural)
+7201) clathrate (+plural)
+7202) Blackmore (+'s - name - Wikipedia)
+7203) buckytube (+plural)
+7204) electrolytical
+7205) electroluminescence
+7206) immunoassays (added plural)
+7207) Menindee (name - Wikipedia)
+7208) Macalister (+'s - name - Wikipedia)
+7209) Avebury (+'s - name - Wikipedia)
+7210) Slieve (name - Wikipedia)
+7211) encage (+s +ing +ed)
+7212) CFOs (added plural)
+7213) antivenene (another way for antivenin)
+7214) antivenom (+plural)
+7215) Somersby (+'s - name - Wikipedia)
+7216) Brownwood (+'s - name - Wikipedia)
+7217) Britt (+'s - name - Wikipedia)
+7218) antitypical
+7219) Prynne (+'s - name - Wikipedia)
+7220) anti-inflammatory
+7221) antiparasitic (Collins)
+7222) anti-intellectual (+plural)
+7223) anti-infective
+7224) alarmism
+7225) Caton (+'s - name - Wikipedia)
+7226) unscriptural
+7227) salvationist
+7228) Salvationist (+plural)
+7229) salvationism
+7230) Luther's (added the 's - name - Wikipedia)
+7231) consubstantial
+7232) consubstantiality
+7233) Tillard (+'s - name - Wikipedia)
+7234) Christology
+7235) Christological
+7236) Christologically
+7237) Bonhoeffer (+'s - name - Wikipedia)
+7238) Mariology
+7239) Mariological
+7240) Mariologist (+plural)
+7241) Montfort (+'s - name - Wikipedia)
+7242) Cranmer (+'s - name - Wikipedia)
+7243) upvote (+s +ing +ed)
+7244) downvote (+s +ing +ed)
+7245) raptorial
+7246) raptorially
+7247) avifauna
+7248) avifaunal
+7249) biomaterials (added plural)
+7250) Hampden (+'s - name - Wikipedia)
+7251) grapeseed (grapeseed oil)
+7252) oaked
+7253) monographic
+7254) Gifford's (added the 's - name)
+7255) Patricia's (added the 's - name)
+7256) Jenkins's (added the 's - name)
+7257) historiographic
+7258) historiographically
+7259) situationally
+7260) Kildavin (name - Wikipedia)
+7261) Stanmore (+'s - name - Wikipedia)
+7262) Howth (+'s - name - Wikipedia)
+7263) situates (merged into situate)
+7264) dumpsite (Collins)
+7265) Eudora (+'s - name - Wikipedia)
+7266) Pepsi (+plural - Wiktionary)
+7267) prefetch (+s +ing +ed)
+7268) prefigurative
+7269) prefigurement
+7270) prefigurations (added plural)
+7271) anymore (removed since it is chiefly North American)
+7272) blocklist (+plural - Wiktionary)
+7273) censorware (Wiktionary)
+7274) killfile (+s +ing +ed - Wiktionary)
+7275) squee (+s +ing +ed - Oxford: informal)
+7276) squeegeed (merged into squeegee)
+7277) brookweed
+7278) loosestrife
+7279) alstroemeria
+7280) waltzer (+plural)
+7281) dogdom
+7282) doggish
+7283) doglike
+7284) hottie (+plural)
+7285) hotty (another way of previous word)
+7286) Pavarotti (+'s - name - Wikipedia)
+7287) hotters (added plural)
+7288) dorsum
+7289) dorsa (plural of previous word)
+7290) dorsolateral
+7291) dorsolaterally
+7292) cuticular
+7293) abaxial
+7294) adaxial
+7295) micrographs (added plural)
+7296) micrographic
+7297) micrographics
+7298) microgranite
+7299) hydroxyproline (Collins)
+7300) microgeneration
+7301) microgenerate
+7302) co-founders (added plural)
+7303) co-found (+ed +ing)
+7304) co-education
+7305) co-educational
+7306) homopolar
+7307) tocopherol (+plural)
+7308) synergetic
+7309) synergic
+7310) metaphorist (Collins)
+7311) euroterminal (Collins)
+7312) starshine (Collins)
+7313) anaphrodisiac (+plural)
+7314) decalcify (+s +ing +ed)
+7315) decalcifier
+7316) decalcification
+7317) remineralize (+s +ing +ed -IZE)
+7318) remineralise (+s +ing +ed -ISE)
+7319) remineralization (-IZE)
+7320) remineralisation (-ISE)
+7321) osteoclast (+plural +ic)
+7322) resorb (+s +ing +ed)
+7323) resonation
+7324) rhetor (+plural)
+7325) interactional
+7326) retroact (+s +ing +ed)
+7327) retroaction
+7328) scrollwork
+7329) coachroofs (added plural)
+7330) redrill (+s +ing +ed - Wiktionary)
+7331) foredecks (added plural)
+7332) soundcheck (+plural)
+7333) soundbar (+plural)
+7334) soundalike (+plural)
+7335) neep (+plural)
+7336) Soundex
+7337) soundhole (+plural)
+7338) soundclash
+7339) dance-off (+plural)
+7340) dancercise (-ISE)
+7341) dancercize (-IZE)
+7342) Discman (Collins)
+7343) alveolate
+7344) conjunctivae (another plural of conjunctiva)
+7345) pericarditis
+7346) lymphangitis
+7347) subspecialist (+plural - Wiktionary)
+7348) non-functioning
+7349) non-gendered
+7350) non-genetic
+7351) non-genetically
+7352) non-hostile
+7353) biobank (+plural)
+7354) biobibliography (+plural)
+7355) hydrobiology
+7356) biocentrism
+7357) biocentric
+7358) biocentrist (+plural)
+7359) cosmopolis
+7360) Heliopolis (name)
+7361) spangly (+ier +iest)
+7362) blackface
+7363) demassify (+s +ing +ed +ion)
+7364) dematerialize (+s +ing +ed +ion -IZE)
+7365) dematerialise (+s +ing +ed +ion -ISE)
+7366) attestable
+7367) attestor (+plural)
+7368) preparer (+plural)
+7369) carboxylic (carboxylic acid)
+7370) ethanoic (ethanoic acid)
+7371) methanoic (methanoic acid)
+7372) methanogenesis
+7373) Horace's (added the 's - name - Wikipedia)
+7374) badger-baiting
+7375) beagler (+plural)
+7376) lurchers (added plural)
+7377) Higham (+'s - name - Wikipedia)
+7378) underfeed (+ing)
+7379) droid (+plural)
+7380) Bharat (+'s - name)
+7381) Bharatanatyam
+7382) Bhavnagar (+'s - name)
+7383) Antalya (+'s - name)
+7384) pharmacotherapy
+7385) clonidine (Collins)
+7386) reserpine
+7387) hydralazine (Collins)
+7388) Edith's (added the 's - name - Wikipedia)
+7389) firewall's (added the 's)
+7390) BSE (Abbreviation: Bovine Spongiform Encephalopathy)
+7391) spongiform
+7392) redwater
+7393) babesiosis
+7394) piroplasmosis
+7395) pirogue (+plural)
+7396) pirk (+plural)
+7397) cardoon (+plural)
+7398) Calc (OpenOffice/LibreOffice)
+7399) chit-chat (+s +ing +ed)
+7400) Danielle (+'s - name - Wikipedia)
+7401) nitty-gritty (Oxford: informal)
+7402) nitrox
+7403) Machmeter
+7404) Canopus (name in space)
+7405) Nibiru (+'s - name of Planet X - Wikipedia)
+7406) Aldebaran (name in space)
+7407) arctophile (+plural)
+7408) arctophilia
+7409) arctophilist
+7410) arctophily
+7411) peckish (Oxford: informal)
+7412) Pecksniffian
+7413) Dodge (+'s - name - Wikipedia)
+7414) pecorino (+plural)
+7415) non-medical
+7416) EU (added the 's - abbreviation of European Union)
+7417) Eu (chemical element)
+7418) kidology (Oxford: informal)
+7419) iridology
+7420) iridologist (+plural)
+7421) naturopathy
+7422) naturopath (+plural)
+7423) naturopathic
+7424) naturopathically
+
+
+V2.28 - 1-SEP-2015
+------------------
+7425) sloganeer (+plural +ing)
+7426) shutdowns (added plural)
+7427) slogger (+plural)
+7428) Dyson (+'s - name - Wikipedia)
+7429) Bronson (+'s - name - Wikipedia)
+7430) escargots (added plural)
+7431) Otago (+'s - name - Wikipedia)
+7432) Margot (+'s - name - Wikipedia)
+7433) escapologist (+plural)
+7434) ASBO (+plural)
+7435) guardee (Oxford: informal)
+7436) Denbigh's (added the 's - name - Wikipedia)
+7437) Demosthenes
+7438) Demosthenic
+7439) Dillon's (added the 's - name - Wikipedia)
+7440) antiscience (Collins)
+7441) technophile (added singular)
+7442) technophilia
+7443) technophilic
+7444) technophobe (+plural)
+7445) technopreneur (+plural)
+7446) technopreneurial
+7447) technospeak
+7448) inboxes (added plural)
+7449) newspeak
+7450) textspeak
+7451) forepeak (+plural)
+7452) bobsleigh (fixed: bob-sleigh)
+7453) Rudman (+'s - name - Wikipedia)
+7454) Oxfam
+7455) coevality
+7456) citriculture
+7457) fruticulture (Wiktionary)
+7458) orphanism (Collins)
+7459) Zephaniah (+'s - name)
+7460) suspire
+7461) suspiration
+7462) subsumable
+7463) subsumption
+7464) potentiated (merged into potentiate)
+7465) biologics (added plural)
+7466) monotherapy
+7467) diplopia
+7468) photophobia
+7469) photophobic
+7470) uveitis
+7471) exophthalmos + exophthalmus + exophthalmia
+7472) hepatomegaly
+7473) oncologic (Collins)
+7474) vomeronasal (Collins)
+7475) chemoreceptor (+plural)
+7476) chemoreception
+7477) bugless (Wiktionary)
+7478) unpublish (+s +ing +ed - Wiktionary)
+7479) relearnt
+7480) epitope (+plural)
+7481) epitomic
+7482) epitomist
+7483) epithelia (plural of epithelium)
+7484) mesothelium
+7485) mesothelia (plural of previous word)
+7486) mesothelial
+7487) antrum
+7488) antra (plural of previous word)
+7489) rhinoplasty (+plural +ic)
+7490) gastrostomy (+plural)
+7491) cystectomy (+plural)
+7492) tetraplegic's (added the 's)
+7493) clitoridectomy (+plural)
+7494) craniotomy (+plural)
+7495) drachmae (another plural of drachma)
+7496) Draco (+'s - name)
+7497) draconic
+7498) Bram (+'s - name - Wikipedia)
+7499) mortadella
+7500) expellee (+plural)
+7501) expeller (+plural)
+7502) changelog (+plural - Wiktionary)
+7503) OpenSolaris
+7504) OpenBSD
+7505) autocompletion (Wiktionary)
+7506) autodiscovery (Wiktionary)
+7507) autodetect (+s +ing +ed - Wiktionary)
+7508) autodetection (Wiktionary)
+7509) autofit (+s +ing +ed - Wiktionary)
+7510) autoformat (+s +ing +ed - Wiktionary)
+7511) BSOD (abbreviation: blue screen of death - Wikipedia)
+7512) enqueuing + enqueueing
+7513) enprint (+plural)
+7514) autowind (+s +ing +er +ers)
+7515) autowound (past of previous word)
+7516) electroconvulsive
+7517) electrochemists (added plural)
+7518) Hagelstein (+'s - name - Wikipedia)
+7519) Borazon (Oxford: trademark)
+7520) elastase
+7521) eldritch
+7522) Eleatic (+plural)
+7523) Zeno (+'s - name)
+7524) Xenophanes (+'s - name)
+7525) Bonapartism
+7526) Bonapartist
+7527) crowd-pleaser (+plural)
+7528) Pelagius (name)
+7529) Pelagian (+plural)
+7530) Pelagianism
+7531) airplane (removed - Chiefly American - GB is: aeroplane)
+7532) microglia
+7533) microglial
+7534) gliosis (Collins)
+7535) perivascular
+7536) leptomeninges
+7537) leptomeningeal
+7538) backmost
+7539) sternway
+7540) cross-link (+s +ing +ed)
+7541) cross-linkage
+7542) psyllium
+7543) psychrophile (+plural)
+7544) psychrophilic
+7545) thermophile (+plural)
+7546) thermophilic
+7547) pneumonitis
+7548) pneumogastric
+7549) pneumoencephalography (+ic)
+7550) giantism
+7551) acromegaly (+ic)
+7552) polycystic
+7553) anovulation (Collins)
+7554) diverticulosis
+7555) divertissement (+plural)
+7556) Surtees (+'s - name)
+7557) Montreal's (added the 's - name)
+7558) Mandelson (+'s - name - Wikipedia)
+7559) Criswell (+'s - name - Wikipedia)
+7560) scintillatingly
+7561) scintigram (+plural)
+7562) revaccinate (+s +ing +ed +ion)
+7563) Glaister (+'s - name - Wikipedia)
+7564) Beckenham (+'s - name - Wikipedia)
+7565) elicitor (+plural)
+7566) emmenagogue (+plural)
+7567) vermifuge
+7568) abortifacient
+7569) AZT (Oxford: trademark)
+7570) ghostbuster (+plural)
+7571) speech-writer (+plural)
+7572) affordably
+7573) lordless
+7574) disafforest (+s +ing +ed +ion)
+7575) Tweedy (+'s - name - Wikipedia)
+7576) Hughes's (added the 's - name - Wikipedia)
+7577) disaffirm (+s +ing +ed +ion)
+7578) reaggregate (Collins)
+7579) unhandled
+7580) unhandsome
+7581) unhang
+7582) unhung (past of previous word)
+7583) unhappen
+7584) unsearched
+7585) unrevealed
+7586) SDRAM (Wiktionary)
+7587) VRAM (Wiktionary)
+7588) NVRAM (+plural - Wiktionary)
+7589) RAMs (added plural - Wiktionary)
+7590) ROMs (added plural - Wiktionary)
+7591) initialism (+plural)
+7592) initiand (+plural)
+7593) macrodiagonal (Collins)
+7594) macrocopy (+plural - Collins)
+7595) macrodome (Collins)
+7596) antenatally
+7597) rostering + rostered (merged into roster)
+7598) Kramer's (added the 's - name - Wikipedia)
+7599) Melba's (added the 's - name - Wikipedia)
+7600) canterbury (+plural - noun - don't confuse with the name)
+7601) armoire (+plural)
+7602) ropework (Collins)
+7603) Tenebrae
+7604) Brozman (+'s - name - Wikipedia)
+7605) CWO (abbreviation: Chief Warrant Officer)
+7606) Cwmbran (+'s - name - Wikipedia)
+7607) babyfather (+plural)
+7608) baby-faced
+7609) baby-doll
+7610) patchouli
+7611) ylang-ylang
+7612) ilang-ilang (another way of previous word)
+7613) Yizkor (+plural)
+7614) Yishuv
+7615) Betjeman (+'s - name)
+7616) twitterer (+plural)
+7617) twittery
+7618) flitter (+s +ing +ed)
+7619) twittish
+7620) twistor
+7621) eigenfrequency (+plural)
+7622) Sangiovese
+7623) chaptalization (-IZE)
+7624) chaptalisation (-ISE)
+7625) chaptalize (+s +ing +ed -IZE)
+7626) chaptalise (+s +ing +ed -ISE)
+7627) Chaplinesque
+7628) cryptozoology
+7629) cryptozoological
+7630) cryptozoologist (+plural)
+7631) cryptosporidium
+7632) cryptosporidia
+7633) coccidia
+7634) coccidian
+7635) toxoplasma
+7636) utero (in utero)
+7637) goldeneye (+plural)
+7638) alveolars (added plural)
+7639) circumcisers (added plural)
+
+
+V2.29 - 1-OCT-2015
+------------------
+7640) Emmental + Emmenthal
+7641) Brie
+7642) ciabatta (+plural)
+7643) flatbreads (added plural)
+7644) pita (removed as it was American)
+7645) pitta (+plural - it is a bread and a bird)
+7646) bap (+plural)
+7647) Redditor (+plural)
+7648) Reddit
+7649) subreddit (+plural)
+7650) manspreading
+7651) MacGyver (+'s - name)
+7652) Brexit + Brixit
+7653) awestricken (another way of awestruck)
+7654) stagehand (fixed: stage-hand)
+7655) CVT (abbreviation: Continuously Variable Transmission)
+7656) Europass (European Union site)
+7657) anything's (added the 's)
+7658) everything's (added the 's)
+7659) how'd (Wiktionary)
+7660) how're (Wiktionary)
+7661) can't've (Wiktionary)
+7662) couldn't've (Wiktionary)
+7663) how've (Wiktionary)
+7664) might've (Wiktionary)
+7665) mightn't've (Wiktionary)
+7666) nothing's (added the 's)
+7667) shouldn't've (Wiktionary)
+7668) there're (Wiktionary)
+7669) this'd (Wiktionary)
+7670) wouldn't've (Wiktionary)
+7671) arses + arsing (merged into arse)
+7672) half-arse (+ing +ed)
+7673) anxiolytic (+plural)
+7674) antiepileptics (added plural - Wiktionary)
+7675) clonazepam
+7676) hydrocodone (+plural - Wiktionary)
+7677) MAOI
+7678) naproxen
+7679) oxycodone
+7680) SSRI
+7681) sublingual (+ally)
+7682) ADHD (abbreviation: Attention deficit hyperactivity disorder)
+7683) BPD
+7684) CBT (abbreviation: Cognitive behavioural therapy)
+7685) cyclothymia
+7686) cyclothymic
+7687) dysmorphia
+7688) dysmorphic
+7689) dysphoria
+7690) dysphoric
+7691) dysthymia
+7692) dysthymic
+7693) NPD
+7694) suicidality
+7695) backtick (+plural)
+7696) configurability (Google)
+7697) display's (added the 's)
+7698) ECMAScript (+'s - Wiktionary)
+7699) microSD (Wikipedia)
+7700) programmatically
+7701) symlink (+s +ing +ed)
+7702) throbber (+plural)
+7703) untick (+s +ing +ed - Wiktionary)
+7704) transclude (+s +ing +ed - Wiktionary)
+7705) wiki's (added the 's)
+7706) blog's (added the 's)
+7707) blogger's (added the 's)
+7708) griefing + griefed (merged into grief - Wiktionary)
+7709) griefer (+plural +'s)
+7710) hiragana
+7711) kana
+7712) kanji
+7713) katakana
+7714) classism
+7715) classist (+plural)
+7716) heteronormative
+7717) heteronormativity
+7718) heterophobe (+plural - Wiktionary)
+7719) Hopkins's (added the 's - name - Wikipedia)
+7720) heterophobia (Wiktionary)
+7721) heterophobic (Wiktionary)
+7722) heterosexism
+7723) heterosexist
+7724) intersectionality
+7725) intersectional
+7726) intersectionalism (Wiktionary)
+7727) misandrist (+plural)
+7728) patriarchically
+7729) transphobe (+plural - Wiktionary)
+7730) transphobia
+7731) transphobic
+7732) aromantic (+plural)
+7733) aromanticism (Wiktionary)
+7734) demisexual (+plural + ity - Wiktionary)
+7735) demisexuality (Wiktionary)
+7736) heteroflexible (Collins)
+7737) agender
+7738) teen's (added the 's - Wikipedia)
+7739) androgyne (+plural)
+7740) androgynously
+7741) bi-gender
+7742) bi-gendered
+7743) cis
+7744) substituent (+plural)
+7745) methoxyl
+7746) cisgender
+7747) cisgendered
+7748) gender-fluid
+7749) genderqueer (+plural)
+7750) trans
+7751) autotune (+s +ing +ed +er +ers - merged into autotune)
+7752) cancellable (Collins)
+7753) miscategorise (+s +ing +ed - Wiktionary)
+7754) epilation
+7755) epilate (+s +ing +ed)
+7756) epilator (+plural)
+7757) isopropyl
+7758) sequitur (+plural - non sequitur)
+7759) trinary (Collins)
+7760) unfulfillable
+7761) unfulfilling
+7762) veganism
+7763) fruitarian (+plural)
+7764) fruitarianism
+7765) non-American
+7766) unpair (+s +ing +ed - Wiktionary)
+7767) linting (merged into lint - Collins)
+7768) genericise (+s +ing +ed - Wiktionary)
+7769) geneticize (-IZE)
+7770) geneticise (-ISE)
+7771) geneticism
+7772) repolarization
+7773) repolish (+s +ing +ed)
+7774) reanalyse (+s +ing +ed)
+7775) intraindividual (Wiktionary)
+7776) denaturation
+7777) photovoltage (Wiktionary)
+7778) oftenness
+7779) Oftel + OFTEL
+7780) superphylum (Collins)
+7781) Asteroidea
+7782) Ophiuroidea
+7783) crossopterygian (+plural)
+7784) burrfish (+plural)
+7785) catfight (+s +ing)
+7786) Felix's (added the 's - name)
+7787) baddy (another way of baddie)
+7788) Darnley (+'s - name)
+7789) azidothymidine
+7790) zidovudine
+7791) thymidine
+7792) nucleoside (+plural)
+7793) miscreate (+s +ing +ed)
+7794) miscreative
+7795) Germain (+'s - name - Wikipedia)
+7796) that've (Wiktionary)
+7797) there've (Wiktionary)
+7798) which've (Wiktionary)
+7799) unsupportive
+8800) kibibit (+plural - IEC - Wikipedia)
+8801) mebibit (+plural - IEC - Wikipedia)
+8802) gibibit (+plural - IEC - Wikipedia)
+8803) tebibit (+plural - IEC - Wikipedia)
+8804) pebibit (+plural - IEC - Wikipedia)
+8805) exbibit (+plural - IEC - Wikipedia)
+8806) zebibit (+plural - IEC - Wikipedia)
+8807) yobibit (+plural - IEC - Wikipedia)
+8808) kibibyte (+plural - IEC - Wikipedia)
+8809) mebibyte (+plural - IEC - Wikipedia)
+8810) gibibyte (+plural - IEC - Wikipedia)
+8811) tebibyte (+plural - IEC - Wikipedia)
+8812) pebibyte (+plural - IEC - Wikipedia)
+8813) exbibyte (+plural - IEC - Wikipedia)
+8814) zebibyte (+plural - IEC - Wikipedia)
+8815) yobibyte (+plural - IEC - Wikipedia)
+8816) anonymiser (+plural - Wiktionary)
+8817) backtrace (+s +ing +ed - Wiktionary)
+8818) bashism (+plural - Wiktionary)
+8819) bi-endian (Wiktionary)
+8820) big-endian
+8821) little-endian
+8822) bytecode (+plural - Wiktionary)
+8823) misprice (+s +ing +ed)
+8824) noncallable
+8825) classful (Wiktionary)
+8826) cron
+8827) draggability (Wiktionary)
+8828) draggable (Wiktionary)
+8829) daemonize (+s +ing +ed - Wiktionary)
+8830) diff (+s +ing +ed)
+8831) endian
+8832) idempotence
+8833) ‎idempotency
+8834) metasyntactic (Wiktionary)
+8835) nullable
+8836) opcode (+plural)
+8837) pageable (Wiktionary)
+8838) parallelize (+s +ing +ed +ion -IZE)
+8839) parallelise (+s +ing +ed +ion -ISE)
+8840) performant (Wiktionary)
+8841) procuracy (+plural)
+8842) proxying + proxied (merged into proxy - Wiktionary)
+8843) stateful
+8844) Marston (+'s - name - Wikipedia)
+8845) bedplate
+8846) templating + templated (Wiktionary)
+8847) tokenisation (Wiktionary)
+8848) tokeniser (+plural - Wiktionary)
+8849) webmail's (added the 's)
+8850) unmount (+s +ing +ed)
+8851) noninfringement (Collins)
+8852) nonrefoulement
+8853) refoulement
+8854) unmourned
+8855) unwarned
+8856) unwatchable
+8857) resurrectable
+8858) paralexia
+8859) paralexic
+8860) audiotaping + audiotaped (merged into audiotape)
+8861) Lenin's (added the 's - name - Wikipedia)
+8862) presentism
+8863) presentist
+8864) presentimental
+8865) presentness
+8866) presentor
+8867) fleuron (+plural)
+8868) mouchette
+8869) mouchard
+8870) psycho-educational
+8871) psycho-aesthetic (+plural)
+8872) psychicist
+8873) psychist
+8874) psychicism
+8875) unprovided
+8876) unprovability
+8877) unproud
+8878) unprotrusive
+8879) unprotesting
+8880) unprotestingly
+8881) unresting
+8882) unrestingly
+8883) unrestorable
+8884) CLI (abbreviation: Command Line Interface)
+8885) Ci (abbreviation: Curie)
+8886) CI (abbreviation: several meanings)
+8887) minify (+s +ing +ed +ion)
+8888) transpile (+s +ing +ed +er +ers - Wiktionary)
+8889) transcompile (+s +ing +ed - Wiktionary)
+8890) setup (setup file - Collins)
+8891) technocentric
+8892) technocomplex
+8893) technocratically
+8894) managerialism
+8895) managerialist
+8896) technofear
+8897) technofreak
+8898) technographer
+8899) technography
+8900) technologism
+8901) technomaniac
+8902) technomania
+8903) technomic
+8904) technopark
+8905) technopolis
+8906) technopolitan
+8907) technoscience
+8908) technoscientist
+8909) technosphere
+8910) technostress
+8911) technostructures (added plural)
+8912) technotronic + technetronic
+8913) combatting + combatted (another way of combating and combated)
+8914) cross-hair (removed, Oxford says it is two words)
+8915) debounce (+s +ing +ed - Wiktionary)
+8916) yuck + yuk (Oxford: informal)
+8917) gyro (+plural)
+8918) repo (+plural - source code repository - Wiktionary)
+8919) unopinionated
+8920) useable (another way of usable)
+8921) unicity
+8922) thusly (Oxford: informal)
+8923) spandex
+8924) buildable (Collins)
+8925) buildability (Wiktionary)
+8926) primatial
+8927) dilatancy
+8928) sulphonate (+plural +ing +ed +ion)
+8929) sulfonamide (+plural - another way of sulphonamide)
+8930) lovebird (+plural - fixed: love-bird)
+8931) she-god
+8932) she-goat
+8933) she-friend
+8934) she-dog
+8935) she-devil
+8936) she-dragon
+8937) she-cat
+8938) she-ass
+8939) Jacopo (+'s - name)
+8940) caryopsis
+8941) caryopses (plural of previous word)
+8942) digitate
+8943) digitation
+8944) behaviouralists (added plural)
+8945) underbred
+8946) bioterrorists (added plural)
+8947) ironworking
+8948) glasswork (+plural - Collins)
+8949) Whitehouse (+'s - name - Wikipedia)
+8950) Serenity (+'s - name - Wikipedia)
+8951) serenities (plural of serenity)
+8952) Pinochet (+'s - name - Wikipedia)
+
+
+V2.30 - 1-NOV-2015
+------------------
+8953) affordance
+8954) roofline (+plural)
+8955) ideating + ideated (merged into ideate)
+8956) repurpose (+s +ing +ed)
+8957) collotype (+plural)
+8958) Jones's (added the 's - name - Wikipedia)
+8959) biosensor (+plural)
+8960) radiotracer
+8961) microsphere (+plural)
+8962) radiotoxicity
+8963) radiotoxic
+8964) radiothorium
+8965) radiothermal
+8966) radiotherapeutically
+8967) radiotelex
+8968) radioteletype
+8969) radiotelemetry
+8970) radiotelegraphically
+8971) radiosurgery
+8972) radiosurgical
+8973) radiostrontium
+8974) radiosterilized
+8975) radiosterilization
+8976) radiostereometric
+8977) radiosondage
+8978) radiosity
+8979) radiosensitizer
+8980) radiosensitizing
+8981) radiosensitization
+8982) radiosensitize
+8983) radiosensitivity
+8984) radiosensitive (+ness)
+8985) radioscanning
+8986) radioresistant
+8987) radioreceptor
+8988) radiolabelled
+8989) radioland
+8990) radiolaria
+8991) Sipuncula
+8992) sipunculan (+plural)
+8993) sipunculid (+plural)
+8994) Sipunculus
+8995) Coverley (+'s - name - Wikipedia)
+8996) Harvey's (added the 's - name - Wikipedia)
+8997) colourblock (+ing +ed)
+8998) tankini (+plural)
+8999) tankodrome
+8000) tankette
+9001) tankbuster (Oxford: informal)
+9002) airgraph
+9003) encaustic
+9004) Gogh (+'s - name - Wikipedia)
+9005) pastegrain
+9006) pasteboard-like
+9007) headbay
+9008) headborough
+9009) headcams (added plural)
+9010) headbutts (added plural)
+9011) Fairfax's (added the 's - name - Wikipedia)
+9012) royalism
+9013) parliamentarianism
+9014) Aquarian (+plural)
+9015) libra
+9016) librae (plural of previous word)
+9017) libidinally
+9018) object-libido
+9019) libertyless
+9020) LIBOR
+9021) amylose
+9022) crystallizable (-IZE)
+9023) crystallisable (-ISE)
+9024) unbranched (Collins)
+9025) amylopectin
+9026) valproic (valproic acid)
+9027) Antisthenes (name)
+9028) trisectors (added plural)
+9029) conchoid
+9030) Nicomedes (+'s - name - Wikipedia)
+9031) pappus
+9032) pappi (plural of previous word)
+9033) pappose
+9034) Pappus (+'s - name - Wikipedia)
+9035) pappy (+plural)
+9036) poppyseeds (added plural)
+9037) poppywort
+9038) popsock (+plural)
+9039) Steckling’s (added the 's - name)
+9040) Clancarty (+'s - name - Wikipedia)
+9041) co-trimoxazole
+9042) doxycycline
+9043) minocycline
+9044) ciprofloxacin (Collins)
+9045) sulphamethoxazole + sulfamethoxazole
+9046) trimethoprim
+9047) trimeter (+plural)
+9048) trimetric
+9049) trimetrical
+9050) trisyllables (added plural)
+9051) trisyllabic
+9052) accentualist
+9053) accentuality
+9054) accentor (+plural)
+9055) waxbill (+plural)
+9056) congeneric
+9057) congenerous
+9058) primogenital
+9059) primogenitary
+9060) primogenitive
+9061) co-ally (+ed)
+9062) co-belligerent (+plural)
+9063) co-belligerence
+9064) co-branded
+9065) co-branding
+9066) co-conspirator (+plural)
+9067) co-chair (+plural)
+9068) co-counselling
+9069) Balliol (+'s - name - Wikipedia)
+9070) Whitworth
+9071) Pitt (+'s - name - Wikipedia)
+9072) Pitressin
+9073) pitpan (+plural)
+9074) touchlines (added plural)
+9075) bookaholic (Oxford: informal)
+9076) blogrolls (added plural)
+9077) noseband
+9078) cavesson (+plural)
+9079) biostratigrapher (+plural)
+9080) biostratigraphic
+9081) biostratigraphical
+9082) biostratigraphically
+9083) macrofossil
+9084) macrofungus
+9085) macrogametocyte
+9086) macrogamete
+9087) flagellar
+9088) epaxial
+9089) unwellness
+9090) aitchbone
+9091) aitchless
+9092) anterogradely
+9093) claustrum
+9094) claustra
+9095) lentiform (lentiform nucleus)
+9096) buccinator (+plural)
+9097) Bucephalus (name)
+9098) anacreontic (+plural)
+9099) Anacreon (+'s - name - Wikipedia)
+9100) essayistic
+9101) recontinuance
+9102) recontinue
+9103) reconvalescence
+9104) reconvalescent
+9105) thicko (+plural - Oxford: informal)
+9106) thicknesser (+plural)
+9107) Castro's (added the 's - name - Wikipedia)
+9108) IQs (added plural)
+9109) intellectualistic
+9110) intellectualist (+plural)
+9111) voluntarist
+9112) voluntaristic
+9113) dogmatise (+s +ing +ed - ISE)
+9114) dogmatize (+s +ing +ed - IZE)
+9115) dognap (+s +ing +ed +er +ers)
+9116) dogology
+9117) dogship
+9118) dogsleep
+9119) dogstones
+9120) televisionary (+plural)
+9121) broadleaves
+9122) broadloomed
+9123) duplet (+plural)
+9124) Burtenshaw (+'s - name - Wikipedia)
+9125) unship (+s +ing +ed)
+9126) unshockable
+9127) unshockability
+9128) unshrinkable
+9129) unshrinkability
+9130) unshrinkingly
+9131) speargun
+9132) spearfish (+plural +ing)
+9133) lumpfish (+plural)
+9134) lumpsucker (+plural)
+9135) featherback (+plural)
+9136) knifefish (+plural)
+9137) jammer (+plural)
+9138) woodturning
+9139) woodturner (+plural)
+9140) woodswallow (+plural)
+9141) corella (+plural)
+9142) wattlebird (+plural)
+9143) geckoes (another plural of gecko)
+9144) redox
+9145) stibine (Collins)
+9146) arsewipe (Oxford: slang)
+9147) arsenopyrite
+9148) wolframite
+9149) axinite (Collins)
+9150) apophyllite
+9151) heulandite (Collins)
+9152) sperrylite (Collins)
+9153) thaumasite (Collins)
+9154) fezzes (added plural)
+9155) fezzed (merged into fez)
+9156) blousy (+ier +iest - Collins)
+9157) incommensurables (added plural)
+9158) incommensurability
+9159) incommensurably
+9160) workpeople
+9161) shewn (Collins)
+9162) workperson
+9163) workwoman
+9164) workwise
+9165) Forby (+'s - name - Wikipedia)
+9166) componentry
+9167) cuirass (+plural)
+9168) chiliarch's (added the 's)
+9169) supergiant (+plural)
+9170) WordPress (+'s - name - Wikipedia)
+9171) Verizon (+'s - name - Wikipedia)
+9172) Comcast (+'s - name - Wikipedia)
+9173) underappreciate (+ed +ion)
+9174) tachyon (+plural)
+9175) bosonic
+9176) supergalactic
+9177) transmural
+9178) superfuse (+ed +ing)
+9179) superfruit
+9180) superfortress
+9181) superforce
+9182) superflux
+9183) superfluorescent
+9184) floristic (+plural)
+9185) floristically
+9186) barrenly
+9187) barrelhead (+plural)
+9188) barrelfish (+plural)
+9189) achillea
+9190) euphorbia (+plural)
+9191) cistus
+9192) lavatera
+9193) buddleia
+9194) accessorial
+9195) possessory
+9196) digresser (+plural)
+9197) dihedrals (added plural)
+9198) reflectional + reflexional
+9199) reflectionless
+9200) reflectogram (+plural)
+9201) reflectography
+9202) reflectograph
+9203) reflectogramme
+9204) coetaneous
+9205) Castilian (+plural)
+9206) pastureland (+plural)
+9207) shrubland (+plural - Collins)
+9208) cinematographically
+9209) Dumont's (added the 's - name - Wikipedia)
+9210) Bertolucci (+'s - name)
+9211) ICANN (+'s - name - Wikipedia)
+9212) DNSSEC (+'s - Wikipedia)
+9213) WHOIS (Wikipedia)
+9214) headrail (+plural)
+9215) Kieran's (added the 's - name - Wikipedia)
+9216) Euro-wasp
+9217) Eurobank
+9218) eurocredit (Collins)
+9219) Eurocentrist
+9220) IMF (+'s - Oxford: abbreviation: International Monetary Fund)
+
+
+V2.31 - 1-DEC-2015
+------------------
+9221) Euroclear
+9222) Euroconnector
+9223) Euroconvertible
+9224) blackcap (+plural)
+9225) gonolek (+plural)
+9226) shoebill (+plural)
+9227) shoeboxes (added plural)
+9228) cornmill
+9229) ropemaker
+9230) ropemanship
+9231) ropesight
+9232) campanulate
+9233) umbo (+plural)
+9234) umbones (another plural of previous word)
+9235) umbonal
+9236) umbonate
+9237) invagination (+plural)
+9238) invaginate (+ed)
+9239) chondrocyte (+plural)
+9240) chondrocranium
+9241) tessera
+9242) tesserae (plural of previous word)
+9243) tesseral
+9244) colourman
+9245) outcross (+s +ing +ed)
+9246) outcrying
+9247) dependents (added plural)
+9248) periodogram
+9249) periodograph
+9250) periodology
+9251) endodontics (Collins)
+9252) criminogenic
+9253) reconvict (+s +ing +ed +ion)
+9254) recopper
+9255) reconvoke
+9256) reconveyance
+9257) reconvertible
+9258) reconverge
+9259) reconvention
+9260) counterpetition (Collins)
+9261) reconsult
+9262) reconstructiveness
+9263) reconstructionary
+9264) reconstructional
+9265) teleprocessing (Collins)
+9266) tiddly (+ier +iest - Oxford: informal)
+9267) Tippex + Tipp-Ex (British trademark)
+9268) trendsetters (added plural)
+9269) disrate (+s +ing +ed)
+9270) snakefish (+plural)
+9271) lizardfish (+plural)
+9272) Gradle (+'s - name - Wikipedia)
+9273) Percival (+'s - name - Wikipedia)
+9274) Burnage (+'s - name - Wikipedia)
+9275) Wexler (+'s - name - Wikipedia)
+9276) picturable
+9277) Thorson (+'s - name - Wikipedia)
+9278) Fass (+'s - name - Wikipedia)
+9279) zooplankton
+9280) york (+s +ing +ed)
+9281) zeolite (+plural +ic)
+9282) zeroth
+9283) zestfulness
+9284) zesty (+ier +iest)
+9285) wunderkind (+plural)
+9286) wunderkinder (another plural of previous word)
+9287) xylene
+9288) trichloroethylene
+9289) yaks (added plural)
+9290) subwindow (+plural - Wiktionary)
+9291) multiwindow (+ed)
+9292) multiwire
+9293) subindex (+plural - Collins)
+9294) sub-idea
+9295) subindustry (+plural - Collins)
+9296) subimpose
+9297) subincandescent
+9298) subincision
+9299) subinfeud
+9300) subinfeudation + subenfeudation
+9301) subinfeudatory
+9302) subfeudatory + subfeudatary
+9303) subfeudation
+9304) subfertile
+9305) subfertility
+9306) subfauna
+9307) subfactor
+9308) subface
+9309) subevergreen
+9310) suberyl
+9311) suberous
+9312) suberose
+9313) corky (+ier +iest)
+9314) subproject (+plural - Collins)
+9315) subpubic (Collins)
+9316) analysation
+9317) analysandum
+9318) re-experience
+9319) restenosis
+9320) fibromuscular (Wiktionary)
+9321) endarterectomy (+plural)
+9322) cholecystectomy (+plural)
+9323) laparoscopy (+plural)
+9324) laparoscope
+9325) laparoscopic
+9326) laparoscopically
+9327) laparotomy (+plural)
+9328) splenectomy (+plural)
+9329) asplenia (Wiktionary)
+9330) Excel (+'s - Wikipedia)
+9331) O'Farrell (+'s - name - Wikipedia)
+9332) Kerensa (name - Wikipedia)
+9333) XUL (Wiktionary: XML user interface language)
+9334) changeset (+plural - Wiktionary)
+9335) Daniel's (added the 's - name - Wikipedia)
+9336) IIRC (Wiktionary: informal - If I remember correctly, if I recall correctly)
+9337) Stehmann (name - Wikipedia)
+9338) theophoric + theophorous
+9339) toponymy + toponymics (Collins)
+9340) topophilia (Collins)
+9341) tapless
+9342) tappable
+9343) Ginsburg (+'s - name)
+9344) panax
+9345) underlet (+s +ing)
+9346) quickset
+9347) Odette (+'s - name)
+9348) Debrett (+'s - name)
+9349) Rhett (+'s - name - Wikipedia)
+9350) comms
+9351) commove (+s +ing +ed - Wiktionary)
+9352) aidful
+9353) unclearly
+9354) unclearness
+9355) uncleared
+9356) sandfly (+plural)
+9357) Wickepin (+'s - name - Wikipedia)
+9358) Winton (+'s - name - Wikipedia)
+9359) Surman (+'s - name - Wikipedia)
+9360) Berna (+'s - name - Wikipedia)
+9361) Birk (+'s - name - Wikipedia)
+9362) Witts (+'s - name - Wikipedia)
+9363) Balrog (+'s - name - Wikipedia)
+9364) Cloke (+'s - name - Wikipedia)
+9365) xvi's (added the 's)
+9366) cybersquatter (+plural)
+9367) cybersurf
+9368) cybertheft
+9369) cyberthreat (+plural)
+9370) cyberwarfare
+9371) cyberwarrior (+plural)
+9372) cyberworld
+9373) cybrarian (+plural)
+9374) Oshii (+'s - name - Wikipedia)
+9375) Floyd's (added the 's - name - Wikipedia)
+9376) Gilmour (+'s - name - Wikipedia)
+9377) uninvested (Collins)
+9378) Ezrin (+'s - name - Wikipedia)
+9379) maximalist (+plural)
+9380) maximalism
+9381) rejectionist (+plural)
+9382) ISIS (+'s - name of terrorist group - Wikipedia)
+9383) EMI (+'s - name - Wikipedia)
+9384) scenography
+9385) scenographic
+9386) Isis (added the 's - name - Wikipedia)
+9387) Scenopegia
+9388) Everly (+'s - name - Wikipedia)
+9389) bandmates (added plural)
+9390) freak-out (Oxford: informal)
+9391) freakily
+9392) freakiness
+9393) weakish
+9394) isospin
+9395) axisymmetric
+9396) apothem (+plural)
+9397) coplanarity
+9398) nonradiative (Wiktionary)
+9399) degradability
+9400) degradative
+9401) ethylbenzene
+9402) nitrobenzene
+9403) nitrobacterium
+9404) nitrify (+s +ing +ed)
+9405) Cortana (+'s - name - Wikipedia)
+9406) Ginnie (+'s - name - Wikipedia)
+9407) Qualcomm (+'s - name - Wikipedia)
+9408) datacard (Collins)
+9409) databus (Collins)
+9410) undogmatic
+9411) undoable (Oxford: informal)
+9412) undiversified
+9413) undistracted
+9414) undisputedly
+9415) undissociated
+9416) cycloaddition (+plural)
+9417) interpolar (Collins)
+9418) meristem (+plural)
+9419) meristematic
+9420) periderm
+9421) peridermal
+9422) phellogen
+9423) Diemen (+'s - name)
+9424) aerostatics
+9425) macromutation
+9426) micromutation
+9427) micromotor
+9428) micromorphology
+9429) micromorphological
+9430) micromorph (+plural)
+9431) micromolar
+9432) micromole (+plural)
+9433) micromodule
+9434) micromodelling + micromodeling
+9435) micromodel
+9436) microminiaturization + microminiaturisation
+9437) photoelectronics
+9438) Chambers (+'s - name - Wikipedia)
+9439) photoelectromagnetic + photomagnetoelectric
+9440) photomask
+9441) pellicle
+9442) pellicular
+9443) interceptive
+9444) multilayered (+ness)
+9445) macrospore
+9446) heterosporous (Collins)
+9447) Protoctista
+9448) protoctist (+plural)
+9449) prokaryote + procaryote
+9450) prokaryotic
+9451) homologues (added plural)
+9452) extrametrical (Collins)
+9453) riffage
+9454) illuminati
+9455) Illuminati
+9456) illuminism
+9457) illuminist (+plural)
+9458) catechumen (+plural)
+9459) Eucharistical
+9460) Euboea (name of place)
+9461) eubacterial
+9462) thunderless (Collins)
+9463) pleximetry
+9464) pleximeter
+9465) plexor + plessor
+9466) obturator (+plural)
+9467) arthroscopy
+9468) debridement
+9469) debride (+ed)
+9470) micro-environment (+plural)
+9471) autecology
+9472) autecological
+9473) caatinga
+9474) acetobacter
+9475) mycotoxin (+plural)
+9476) osteoderm (+plural)
+9477) osteodontokeratic
+9478) osteodermal
+9479) osteodentine
+9480) osteodystrophic
+9481) osteodystrophy
+9482) hyperparathyroidism
+9483) hyperparathyroid
+9484) hyperparasites (added plural)
+9485) hyperphagia
+9486) hypersomnia (Collins)
+9487) hypersomnolence (Collins)
+9488) postinflammatory
+9489) postinfectious
+9490) postinfection
+9491) postillation
+9492) postilioned
+9493) buckhound (+plural)
+9494) staghound (+plural)
+9495) elkhound (+plural)
+9496) Anglosphere
+9497) Anglophony + Anglophonie
+9498) Francophonie
+9499) Francophonia
+9500) disintegrative
+9501) disintegrator (+plural)
+9502) microcapsules (added plural)
+9503) sprayable
+9504) droppable
+9505) starchitects (added plural)
+9506) Baez (+'s - name)
+9507) sexvirate
+9508) sexuparous
+9509) sexuate (+ed)
+9510) Mondrian's (added the 's - name - Wikipedia)
+9511) naloxone
+9512) naltrexone
+9513) oxycodone's (added the 's)
+9514) opioids (added plural)
+9515) radiopaque + radio-opaque
+9516) radiopacity
+9517) psionic (+plural)
+9518) psionically
+9519) psilothrum
+9520) psilophyte
+9521) psilomelane
+9522) psilocybin
+9523) serotonergic
+9524) serotype (+plural)
+9525) serotypic
+9526) pneumococcus
+9527) pneumococci (plural of previous word)
+9528) pneumococcal
+9529) basophilia
+9530) nunchaku (+plural)
+9531) Zyrian
+9532) zythum
+9533) hippogriff + hippogryph (+plural of both)
+9534) manticore (+plural)
+9535) mantic
+9536) geomantical + geomantic
+
+
+V2.32 - 1-JAN-2016
+------------------
+9537) Horatian
+9538) explicator
+9539) explicatory
+9540) Palladian
+9541) Palladianism
+9542) Piccadilly
+9543) Orcadian (+plural)
+9544) Trumland (name)
+9545) Caithness (+'s - name - Wikipedia)
+9546) Rousay (+'s - name - Wikipedia)
+9547) Shapinsay (+'s - name - Wikipedia)
+9548) Oddie (+'s - name - Wikipedia)
+9549) Govan (+'s - name - Wikipedia)
+9550) Diane's (added the 's - name - Wikipedia)
+9551) Lynch (+'s - name - Wikipedia)
+9552) Selwyn's (added the 's - name - Wikipedia)
+9553) Camilla's (added the 's - name - Wikipedia)
+9554) overanalysis
+9555) overanalyse (+s +ing +ed)
+9556) diegesis
+9557) diegeses (plural of previous word)
+9558) diegetic
+9559) Harring (+'s - name - Wikipedia)
+9560) dieffenbachia (+plural)
+9561) horticulturalist (+plural)
+9562) unreviewed
+9563) Wikipedians (added plural)
+9564) unversioned (Wiktionary)
+9565) autoconfirm (+s +ing +ed +ion - Wiktionary)
+9566) vandalistic
+9567) vandalistically
+9568) HTML's (added the 's + uppercase - Wikipedia)
+9569) wikiquette (Wiktionary)
+9570) reasonability
+9571) cherry-pick (+s +ing +ed)
+9572) Reagle (+'s - name - Wikipedia)
+9573) BlackBerry (+s +ing +ed)
+9574) wolfberry (+plural)
+9575) bloodletter
+9576) bloodish
+9577) bloodshedder
+9578) tear-stained
+9579) bloodshedding
+9580) blepharitis
+9581) keratitis
+9582) iritis
+9583) atherosclerotic
+9584) atheroma
+9585) atheromatous
+9586) distensibility
+9587) distensible
+9588) haemodynamic
+9589) haemodynamically
+9590) haemodynamics
+9591) photoreceptors (added plural)
+9592) electromedical
+9593) ferrites (added plural)
+9594) ferritic
+9595) martensite (+ic)
+9596) martempering
+9597) martempered
+9598) martellato
+9599) Martello (+plural)
+9600) Napoleonism
+9601) Napoleonically
+9602) Napoleonist
+9603) outrightly
+9604) cutie (+plural - Oxford: informal)
+9605) Marilyn's (added the 's - name - Wikipedia)
+9606) geniculate
+9607) antennule (+plural)
+9608) concavo-convex
+9609) prosome
+9610) copepod (+plural)
+9611) mantid (+plural)
+9612) prothorax
+9613) prothoracic
+9614) prothonotaryship
+9615) protonotary + prothonotary (+plural of both)
+9616) protonosphere
+9617) geocorona
+9618) geocoronal
+9619) geocratic
+9620) geocyclic
+9621) cadastral
+9622) occurrent
+9623) Washingtonian (+plural)
+9624) Washingtonologist
+9625) IPs (added plural - Wiktionary)
+9626) homepage's (added the 's - Wikipedia)
+9627) telepathing + telepathed (merged into telepath - Wiktionary)
+9628) interdimensional (Wiktionary)
+9629) Carrolton (name of place - Wikipedia)
+9630) Galactica (+'s - name of TV series - Wikipedia)
+9631) Okrand (+'s - name - Wikipedia)
+9632) Ragnar (+'s - name - Wikipedia)
+9633) Redbeard (+'s - name - Wikipedia)
+9634) Kristy (+'s - name - Wikipedia)
+9635) Schulman (+'s - name - Wikipedia)
+9636) adverted + adverting (merged into advert)
+9637) aftertaste (fixed: after-taste)
+9638) albedos (added plural)
+9639) aldehydes (added plural)
+9640) Angelus + angelus
+9641) Angelou (+'s - name - Wikipedia)
+9642) Corbin (+'s - name - Wikipedia)
+9643) apostolate (+plural)
+9644) charism (+plural)
+9645) constraining (merged into constrain)
+9646) Smithers (+'s - name - Wikipedia)
+9647) Dostoyevsky (+'s - name - Wikipedia)
+9648) fusionist (+plural)
+9649) fusionism
+9650) Greenock (+'s - name - Wikipedia)
+9651) Crawfurd (+'s - name - Wikipedia)
+9652) Gourock (+'s - name - Wikipedia)
+9653) greenlet
+9654) greenless
+9655) Greenlandman
+9656) Greenlandish
+9657) Greenlander (+plural)
+9658) greenlandite + greenlandit
+9659) mezzotint (+s +ing +ed +er +ers)
+9660) Morland (+'s - name - Wikipedia)
+9661) Glenn's (added the 's - name - Wikipedia)
+9662) STI (+plural - Abbreviation: sexually transmitted infection)
+9663) papillomavirus
+9664) protozoal
+9665) protozoon (joined with protozoon's)
+9666) ureaplasma (+plural)
+9667) mycoplasma (+plural)
+9668) mycoplasmata (another plural of previous word)
+9669) metronidazole
+9670) polyisoprene
+9671) isoprene
+9672) presymptomatic (Collins)
+9673) Salvarsan
+9674) arsphenamine
+9675) apple-cart (removed, Oxford says it is two words)
+9676) auricula (+plural)
+9677) avens
+9678) Ayurveda
+9679) Ayurvedic
+9680) backbeat (+plural)
+9681) balustraded
+9682) baptize (+s +ing +ed - IZE)
+9683) birching + birched (merged into birch)
+9684) biscuity
+9685) blackshirt (+plural - added lowercase)
+9686) Jabotinsky (+'s - name - Wikipedia)
+9687) Lisa's (added the 's - name - Wikipedia)
+9688) Clarkson (+'s - name - Wikipedia)
+9689) Dara (+'s - name - Wikipedia)
+9690) Christiansen's (added the 's - name - Wikipedia)
+9691) kick-boxing
+9692) nutraceutical (+plural)
+9693) neurobiological
+9694) neurobiologist (+plural)
+9695) neurobiochemistry
+9696) neurobics
+9697) neurobehavioural
+9698) psychopharmacology
+9699) psychopharmacological
+9700) psychopharmacologist (+plural)
+9701) Enigmail (+'s - name of Mozilla add-on)
+9702) misenter (+s +ing +ed - Wiktionary)
+9703) Canute (+'s - name - Wikipedia)
+9704) rewrap (+s +ing +ed)
+9705) logfile (+plural - Wiktionary)
+9706) Josie (+'s - name - Wikipedia)
+9707) posey (+ier +iest - Oxford: informal)
+9708) mag (+plural - Oxford: informal)
+9709) mimeo
+9710) Berrigan (+'s - name - Wikipedia)
+9711) detachability
+9712) performative (+plural)
+9713) performativity
+9714) constative (+plural)
+9715) polysiloxane
+9716) phenylmethyl (Collins)
+9717) GUI's (added the 's - Wikipedia)
+9718) rebuffer (+s +ing +ed - Wiktionary)
+9719) upsample (+s +ing +ed - Wiktionary)
+9720) blockiness (Collins)
+9721) Netflix’s (added the 's)
+9722) downsample (+s +ing +ed - Wiktionary)
+9723) choosable (Wiktionary)
+9724) bootboy (+plural)
+9725) bootie (added singular)
+9726) outsole (+plural)
+9727) Thinsulate (Oxford: trademark)
+9728) minibreak (+plural)
+9729) NASCAR (abbreviation: National Association for Stock Car Auto Racing)
+9730) minicell
+9731) minicar (+plural)
+9732) minichain
+9733) minichromosome
+9734) minicircle
+9735) kinetoplast (+plural)
+9736) kinetoscope (+plural)
+9737) Leysdown (Wikipedia - name of place)
+9738) unrefuted
+9739) microscopists (added plural)
+9740) photocycle
+9741) reorganizational
+9742) reorganizationist
+9743) reovirus
+9744) enteric
+9745) ante-mortem
+9746) mediastinum
+9747) mediastina (plural of previous word)
+9748) mediastinal
+9749) mediastinoscopy
+9750) prereform
+9751) postreform (Wiktionary)
+9752) tragical
+9753) bathypelagic
+9754) octopod (+plural)
+9755) blastocyst (+plural)
+9756) blastula
+9757) blastulae (plural of previous word)
+9758) denticulation (+plural)
+9759) septal
+9760) atrioventricular
+9761) endocardial
+9762) parapophysis
+9763) parapolitical
+9764) parapolar
+9765) parapod
+9766) iOS's (added the 's - Wikipedia)
+9767) polyamine
+9768) polyamidation
+9769) polyamide (+plural)
+9770) adipic (adipic acid)
+9771) adipoceration
+9772) adipocere
+9773) hypotensive
+9774) normotensive
+9775) vagus
+9776) vagi (plural of previous word)
+9777) ventifact (+plural)
+9778) erraticism
+9779) speech-making
+9780) speech-maker (+plural)
+9781) countermark (added +s +ing +ed)
+9782) sublibrary (+plural - Wiktionary)
+9783) subrectangular (Wiktionary)
+9784) subsensible (Collins)
+9785) suboption (+plural - Wiktionary)
+9786) suborganization (+plural - Collins - IZE)
+9787) suborganisation (+plural - Collins - ISE)
+9788) suboval
+9789) subovoid
+9790) suboptimum
+9791) suboperation (+plural - Wiktionary)
+9792) Ascher (+'s - name - Wikipedia)
+9793) Plohman (name - Wikipedia)
+9794) Gervase (+'s - name - Wikipedia)
+9795) Phipps (+'s - name - Wikipedia)
+9796) PEP (+plural +'s - abbreviation: Political and Economic Planning)
+9797) penectomy
+9798) orchiectomy (+plural - Collins)
+9799) orchidectomy (+plural - Collins)
+9800) curette (+s +ing +ed)
+9801) electrodesiccation
+9802) osteotome (+plural)
+9803) cerumen
+9804) zoster (herpes zoster)
+9805) photosensitivity
+9806) urticaria
+9807) omeprazole
+9808) bing
+9809) Bing (Microsoft)
+9810) OneDrive (Microsoft)
+9811) Silverlight (Microsoft)
+9812) subparagraph (+plural - Collins)
+9813) sublicensee (+plural - Wiktionary)
+9814) sublicenses (added plural)
+9815) Satya (+'s - name - Wikipedia)
+9816) Nadella (+'s - name - Wikipedia)
+9817) MSDN (Microsoft)
+9818) Altair (+'s - name - Wikipedia)
+9819) Bellevue (+'s - name - Wikipedia)
+9820) rebrands + rebranded (merged into rebrand)
+9821) Gates (+'s - name - Wikipedia)
+9822) Ballmer (+'s - name - Wikipedia)
+9823) Gartner (+'s - name - Wikipedia)
+9824) CE
+9825) Ce
+9826) Klawe (+'s - name - Wikipedia)
+9827) Moody (+'s - name - Wikipedia)
+9828) write-down (+plural)
+9829) TCO (abbreviation: Total cost of Ownership)
+9830) videocasts (added plural)
+9831) Issaquah (+'s - name - Wikipedia)
+9832) anglicized + anglicised (fixed: it was in uppercase)
+9833) Gilman (+'s - name - Wikipedia)
+9834) regauge (+s +ing +ed)
+9835) Sammamish (+'s - name - Wikipedia)
+9836) regelate (+ed +ion)
+9837) calorifically
+9838) smokelessly
+9839) tostada + tostado (+plural of both)
+9840) tosylate (+plural)
+9841) nonactivated (Collins)
+9842) adrenergic
+9843) histaminic
+9844) muscarinic
+9845) hyperreactivity (Collins)
+9846) submucosal
+9847) muscularis
+9848) tunica
+9849) tunicae (plural of previous word)
+9850) insectile
+9851) insectarium + insectary (+plural of both)
+9852) avicularium
+9853) avicularia (plural of previous word)
+9854) Earlybird (Mozilla)
+9855) woodman + woodmen
+9856) woodsmoke
+9857) workless (+ness)
+9858) Wordsworthiana
+9859) workpieces (added plural)
+9860) bowie (+plural)
+9861) bradycardia
+9862) caliper (+plural)
+9863) caparisoned
+9864) carabiniere
+9865) carabinieri (plural of previous word)
+9866) carboxyl + carboxy
+9867) casuals (added plural)
+9868) catheterization (-IZE)
+9869) catheterisation (-ISE)
+9870) bacteriuria
+9871) prostatitis
+9872) pyelonephritis
+9873) pyelonephritic
+9874) pyuria
+9875) haematuria
+9876) cedarwood (Collins)
+9877) ceilidhs (added plural)
+9878) celeriac
+9879) VLC (+'s - name of software)
+9880) bidimensional (Wiktionary)
+9881) tridimensional (Collins)
+9882) four-dimensional
+9883) coromandel
+9884) lacquerware
+9885) lacquerwork
+9886) japan (+s +ing +ed - noun + verb)
+9887) Jap (+plural - offensive - short for Japanese - Wiktionary)
+9888) arse-licking (vulgar slang)
+9889) arse-licker (vulgar slang)
+9890) postlanding (Collins)
+9891) beanfeast (+plural)
+9892) believingly
+9893) freezingly (Collins)
+9894) bobbish (Collins - slang)
+9895) breaktime (Collins)
+9896) nanofibre (+plural)
+9897) oxysulphide
+9898) cashpoint (+plural)
+9899) classmanship
+9900) clicket (Collins)
+9901) clubbable
+9902) clubbability
+9903) costermonger (+plural)
+9904) cream-crackered
+9905) decenary + decinary + decennary
+9906) declinatory
+9907) eyeable
+9908) faceache (Oxford: informal)
+9909) fandabidozi (Collins)
+9910) Fenian (+plural)
+9911) Fenianism
+9912) fibrescope (+plural)
+9913) flasket (Collins)
+9914) flaysome (Collins)
+9915) flyman
+9916) flymen (plural of previous word)
+9917) foretop (+plural)
+9918) forjudge + forejudge
+9919) formularise (+s +ing +ed)
+9920) forspeak (Collins)
+9921) freeload (+s +ing +ed +er +ers)
+9922) fundholder (added singular)
+9923) garibaldi (+plural)
+9924) gastropub (+plural)
+9925) gemminess
+9926) gyratory (+plural)
+9927) elevatory
+9928) incubatory
+9929) modificatory
+9930) pulsatory
+9931) clarificatory
+9932) denigratory
+9933) Obi (+'s - name - Wikipedia)
+9934) Obi-Wan (+'s - name - Wikipedia)
+9935) Kenobi (+'s - name - Wikipedia)
+9936) Anakin (+'s - name - Wikipedia)
+9937) Skywalker (+'s - name - Wikipedia)
+9938) Jedi (+plural +'s)
+9939) Sith (+'s - name - Wikipedia)
+9940) McCallum (+'s - name - Wikipedia)
+9941) Ewan (+'s - name - Wikipedia)
+9942) Portman (+'s - name - Wikipedia)
+9943) McDiarmid (+'s - name - Wikipedia)
+9944) Lucasfilm (+'s - name - Wikipedia)
+9945) workprint
+9946) lightsaber (+plural)
+9947) Coruscant (+'s - name - Wikipedia)
+9948) Palpatine (+'s - name - Wikipedia)
+9949) Padmé (+'s - name - Wikipedia)
+9950) Colton (+'s - name - Wikipedia)
+9951) Chewbacca (+'s - name - Wikipedia)
+9952) Kamino (+'s - name - Wikipedia)
+9953) refilm (+s +ing +ed - Wiktionary)
+9954) animatic (+plural)
+9955) pre-visualize + previsualise + previsualize
+9956) Shepperton (+'s - name - Wikipedia)
+9957) Elstree (+'s - name - Wikipedia)
+9958) armlock (+plural)
+9959) Gillard (+'s - name - Wikipedia)
+9960) Oldman (+'s - name - Wikipedia)
+9961) Smithee (+'s - name - Wikipedia)
+9962) Grauman (+'s - name - Wikipedia)
+9963) Rosenbaum (+'s - name - Wikipedia)
+9964) outgross (+s +ing +ed)
+9965) Narnia (+'s - name - Wikipedia)
+9966) Elsey (+'s - name - Wikipedia)
+9967) Gooley (+'s - name - Wikipedia)
+9968) Razzie (+'s - name - Wikipedia)
+9969) Windu (+'s - name - Wikipedia)
+9970) Sidious (+'s - name - Wikipedia)
+9971) Leia (+'s - name - Wikipedia)
+9972) Han (+'s - name - Wikipedia)
+9973) Jaina (+'s - name - Wikipedia)
+9974) provene
+9975) Bridger (+'s - name - Wikipedia)
+9976) Katarn (+'s - name - Wikipedia)
+9977) Qui-Gon (+'s - name - Wikipedia)
+9978) Organa (+'s - name - Wikipedia)
+9979) Jacen (+'s - name - Wikipedia)
+9980) unlogical (Wiktionary)
+9981) Twichell (+'s - name - Wikipedia)
+9982) Corso (+'s - name - Wikipedia)
+9983) McKinnon (+'s - name - Wikipedia)
+9984) Tomkins (+'s - name - Wikipedia)
+9985) Puckett (+'s - name - Wikipedia)
+9986) Elmwood (+'s - name - Wikipedia)
+9987) Medford (+'s - name - Wikipedia)
+9988) Georgie (+'s - name - Wikipedia)
+9989) Pedrick (+'s - name - Wikipedia)
+9990) Bucksch (name - Wikipedia)
+9991) Koelmeyer (name - Wikipedia)
+9992) Grandon (+'s - name - Wikipedia)
+9993) rammelly + rambly
+9994) Fernhout (name - Wikipedia)
+9995) xlsx
+9996) UX (abbreviation: user experience)
+9997) uxoricide
+9998) uxoricidal
+9999) uxoriously
+10000) uxoriousness
+10001) uxorilocal
+10002) matrilocal
+10003) matrilocality
+===================================================
+en_NZ:
+I. Copyright
+II. Copying (Licence)
+----------------------------
+
+I. Copyright
+
+NZ English Dictionary v0.9 beta - Build 06SEP03
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+NB This is an initial version, please check:
+http://lingucomponent.openoffice.org/download_dictionary.html
+or
+http://www.girlza.com/dictionary/download.html
+for a final version, after a little while (no hurry).
+
+This dictionary is based on the en_GB Myspell dictionary
+which in turn was initially based on a subset of the
+original English wordlist created by Kevin Atkinson for
+Pspell and Aspell and thus is covered by his original
+LGPL licence.
+
+
+Introduction
+~~~~~~~~~~~~
+en_NZ.dic has been altered to include New Zealand places,
+including major cities and towns, and major suburbs. It
+also contains NZ words, organisations and expressions.
+
+en_NZ.aff has had a few REPlace strings added, but is
+basically unchanged.
+
+
+Acknowledgements
+~~~~~~~~~~~~~~~~
+Thanks must go to the original creators of the British
+dictionary, David Bartlett, Brian Kelk and Andrew Brown.
+
+I wouldn't have started this without seeing the Australian
+dictionary, thanks Kelvin Eldridge, Jean Hollis Weber and
+David Wilson.
+
+And thank you to all who've contributed to OpenOffice.org.
+
+
+License
+~~~~~~~
+This dictionary is covered by the GNU Lesser General Public
+License, viewable at http://www.gnu.org/copyleft/lesser.html
+
+
+Issues
+~~~~~~
+Many of the proper nouns already in the dictionary do not have
+an affix for 's.
+All my new words start after the z's of the original dictionary.
+
+
+Contact
+~~~~~~~
+Contact Tristan Burtenshaw (hooty@slingshot.co.nz) with any words,
+places or other suggestions for the dictionary.
+
+
+
+II. Copying
+
+ 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
+
diff --git a/runtime/spell/af/af_ZA.diff b/runtime/spell/af/af_ZA.diff
new file mode 100644
index 0000000..4ad0e50
--- /dev/null
+++ b/runtime/spell/af/af_ZA.diff
@@ -0,0 +1,35 @@
+*** af_ZA.orig.aff Sun Aug 14 17:37:01 2005
+--- af_ZA.aff Sun Jan 22 14:21:54 2006
+***************
+*** 23,24 ****
+--- 23,33 ----
+
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
++ MIDWORD '-
++
+ MAP 3
+*** af_ZA.orig.dic Sun Aug 14 17:37:01 2005
+--- af_ZA.dic Sun Jan 22 14:22:17 2006
+***************
+*** 1861,1864 ****
+ T-skyf
+! TCP/IP
+! TCP/IP-bondel
+ TLA
+--- 1861,1864 ----
+ T-skyf
+! TCP\/IP
+! TCP\/IP-bondel
+ TLA
+***************
+*** 124109,124111 ****
+ vrywilliglik
+- vt
+ vuile/R
+--- 124109,124110 ----
diff --git a/runtime/spell/af/main.aap b/runtime/spell/af/main.aap
new file mode 100644
index 0000000..ec53825
--- /dev/null
+++ b/runtime/spell/af/main.aap
@@ -0,0 +1,79 @@
+# Aap recipe for Afrikaans Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = af_ZA.aff af_ZA.dic
+
+all: $SPELLDIR/af.latin1.spl $SPELLDIR/af.utf-8.spl ../README_af.txt
+
+$SPELLDIR/af.latin1.spl : $FILES
+ :sys env LANG=af_ZA.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/af af_ZA" -c q
+
+$SPELLDIR/af.utf-8.spl : $FILES
+ :sys env LANG=af_ZA.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/af af_ZA" -c q
+
+../README_af.txt : README_af_ZA.txt
+ :copy $source $target
+
+#
+# Fetching the file from SourceForge. The archive at OpenOffice is broken!
+#
+FILE = http://surfnet.dl.sourceforge.net/sourceforge/translate/myspell-af_ZA-20040727.zip
+
+:attr {fetch = $FILE} af_ZA.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+af_ZA.aff af_ZA.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch af_ZA.zip
+ :sys $UNZIP af_ZA.zip
+ :delete af_ZA.zip
+ @if not os.path.exists('af_ZA.orig.aff'):
+ :copy af_ZA.aff af_ZA.orig.aff
+ @if not os.path.exists('af_ZA.orig.dic'):
+ :copy af_ZA.dic af_ZA.orig.dic
+ @if os.path.exists('af_ZA.diff'):
+ :sys patch <af_ZA.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 af_ZA.orig.aff af_ZA.aff >af_ZA.diff
+ :sys {force} diff -a -C 1 af_ZA.orig.dic af_ZA.dic >>af_ZA.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch af_ZA.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../af_ZA.zip
+ :sys {force} diff ../af_ZA.orig.aff af_ZA.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy af_ZA.aff ../af_ZA.new.aff
+ :sys {force} diff ../af_ZA.orig.dic af_ZA.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy af_ZA.dic ../af_ZA.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete af_ZA.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/am/am_ET.diff b/runtime/spell/am/am_ET.diff
new file mode 100644
index 0000000..cbac554
--- /dev/null
+++ b/runtime/spell/am/am_ET.diff
@@ -0,0 +1,9 @@
+*** am_ET.orig.aff Mon Aug 22 11:52:57 2005
+--- am_ET.aff Thu Sep 29 21:56:20 2005
+***************
+*** 24 ****
+--- 24,27 ----
+ SFX c 0 ዎች 
++
++ # Aspell has sound folding for Amharic, but it doesn't look right, it uses
++ # different characters than the dictionary. Therefore it was not included.
diff --git a/runtime/spell/am/main.aap b/runtime/spell/am/main.aap
new file mode 100644
index 0000000..e8ba35c
--- /dev/null
+++ b/runtime/spell/am/main.aap
@@ -0,0 +1,63 @@
+# Aap recipe for Amharic Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = am_ET.aff am_ET.dic
+
+all: $SPELLDIR/am.utf-8.spl ../README_am.txt
+
+$SPELLDIR/am.utf-8.spl : $FILES
+ :sys env LANG=am_ET.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/am am_ET" -c q
+
+../README_am.txt: README_am.txt
+ :copy $source $target
+
+#
+# Fetching the files from Hunspell.
+#
+HTTPDIR = http://hunspell.sourceforge.net
+TARNAME = am-demo.tar.gz
+:attr {fetch = $HTTPDIR/%file%} $TARNAME
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+am_ET.aff am_ET.dic: {buildcheck=}
+ :assertpkg tar gzip
+ :fetch $TARNAME
+ :sys gzip -d -c $TARNAME | tar xf -
+ :move am/am.aff am_ET.aff
+ :move am/am.dic am_ET.dic
+ :move am/README README_am.txt
+ :delete {recursive} am
+ :delete $TARNAME
+ @if not os.path.exists('am_ET.orig.aff'):
+ :copy am_ET.aff am_ET.orig.aff
+ @if not os.path.exists('am_ET.orig.dic'):
+ :copy am_ET.dic am_ET.orig.dic
+ @if os.path.exists('am_ET.diff'):
+ :sys patch <am_ET.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 am_ET.orig.aff am_ET.aff >am_ET.diff
+ :sys {force} diff -a -C 1 am_ET.orig.dic am_ET.dic >>am_ET.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :print Sorry, not implemented yet.
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/bg/bg_BG.diff b/runtime/spell/bg/bg_BG.diff
new file mode 100644
index 0000000..e3ccbb6
--- /dev/null
+++ b/runtime/spell/bg/bg_BG.diff
@@ -0,0 +1,186 @@
+*** bg_BG.orig.aff Sun Aug 28 21:34:44 2005
+--- bg_BG.aff Thu Sep 29 21:59:31 2005
+***************
+*** 1,2 ****
+! SET microsoft-cp1251
+ TRY
+--- 1,2 ----
+! SET cp1251
+ TRY
+***************
+*** 1682,1684 ****
+
+! MAP 26
+ MAP a
+--- 1682,1684 ----
+
+! MAP 25
+ MAP a
+***************
+*** 1691,1695 ****
+ MAP
+! MAP
+ MAP p
+- MAP c
+ MAP x
+--- 1691,1694 ----
+ MAP
+! MAP c
+ MAP p
+ MAP x
+***************
+*** 1707,1709 ****
+ MAP P
+- MAP Y
+ MAP X
+--- 1706,1855 ----
+ MAP P
+ MAP X
++
++ REP 2
++ REP Y
++ REP Y
++
++ # Bulgarian phonetic transformation rules for use with Aspell
++ # Copyright (C) 2003 Anton Zinoviev
++ #
++ # This software may be used and distributed under the same terms as
++ # the other parts of the bgoffice project.
++ #
++ # Changelog:
++ #
++ # 19.IX.2003 Anton Zinoviev <zinoviev@debian.org>
++ # Initial release
++
++ SAL version 1
++ SAL followup 0
++ SAL collapse_result 1
++
++ SAL
++ SAL
++ SAL
++ SAL
++ SAL
++ SAL
++ SAL
++ SAL
++ SAL _
++ SAL _
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL <
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL <
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL T()-
++ SAL $
++ SAL T$
++ SAL
++ SAL
++ SAL ()-
++ SAL $
++ SAL
diff --git a/runtime/spell/bg/main.aap b/runtime/spell/bg/main.aap
new file mode 100644
index 0000000..bb34b9a
--- /dev/null
+++ b/runtime/spell/bg/main.aap
@@ -0,0 +1,80 @@
+# Aap recipe for Bulgarian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = bg_BG.aff bg_BG.dic
+
+all: $SPELLDIR/bg.cp1251.spl $SPELLDIR/bg.utf-8.spl ../README_bg.txt
+
+$SPELLDIR/bg.cp1251.spl : $FILES
+ :sys env LANG=bg_BG.CP1251 $VIM -u NONE -e -c "mkspell! $SPELLDIR/bg bg_BG" -c q
+
+$SPELLDIR/bg.utf-8.spl : $FILES
+ :sys env LANG=bg_BG.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/bg bg_BG" -c q
+
+../README_bg.txt: README_bg_BG.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} bg_BG.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+bg_BG.aff bg_BG.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch bg_BG.zip
+ :sys $UNZIP bg_BG.zip
+ :delete bg_BG.zip
+ :sys $VIM bg_BG.aff -u NONE -e -c "set ff=unix" -c update -c q
+ :sys $VIM bg_BG.dic -u NONE -e -c "set ff=unix" -c update -c q
+ :sys $VIM README_bg_BG.txt -u NONE -e -c "set ff=unix" -c update -c q
+ @if not os.path.exists('bg_BG.orig.aff'):
+ :copy bg_BG.aff bg_BG.orig.aff
+ @if not os.path.exists('bg_BG.orig.dic'):
+ :copy bg_BG.dic bg_BG.orig.dic
+ @if os.path.exists('bg_BG.diff'):
+ :sys patch <bg_BG.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 bg_BG.orig.aff bg_BG.aff >bg_BG.diff
+ :sys {force} diff -a -C 1 bg_BG.orig.dic bg_BG.dic >>bg_BG.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch bg_BG.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../bg_BG.zip
+ :sys {force} diff ../bg_BG.orig.aff bg_BG.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy bg_BG.aff ../bg_BG.new.aff
+ :sys {force} diff ../bg_BG.orig.dic bg_BG.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy bg_BG.dic ../bg_BG.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete bg_BG.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/br/br_FR.diff b/runtime/spell/br/br_FR.diff
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/runtime/spell/br/br_FR.diff
diff --git a/runtime/spell/br/main.aap b/runtime/spell/br/main.aap
new file mode 100644
index 0000000..8f6040e
--- /dev/null
+++ b/runtime/spell/br/main.aap
@@ -0,0 +1,86 @@
+# Aap recipe for Breton Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = br_FR.aff br_FR.dic
+
+all: $SPELLDIR/br.latin1.spl $SPELLDIR/br.utf-8.spl ../README_br.txt
+
+$SPELLDIR/br.latin1.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=latin1"
+ -c "mkspell! $SPELLDIR/br br_FR" -c q
+
+$SPELLDIR/br.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=UTF-8"
+ -c "mkspell! $SPELLDIR/br br_FR" -c q
+
+../README_br.txt : package-description.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://extensions.libreoffice.org/extension-center/an-drouizig-breton-spellchecker/releases/0.13/
+:attr {fetch = $OODIR/%file%} difazier-an-drouizig-0_13.oxt
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+br_FR.aff br_FR.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch difazier-an-drouizig-0_13.oxt
+ :sys $UNZIP difazier-an-drouizig-0_13.oxt
+ :delete difazier-an-drouizig-0_13.oxt
+ :copy dictionaries/br_FR.aff br_FR.aff
+ :copy dictionaries/br_FR.dic br_FR.dic
+ # The br_FR.aff file contains a BOM, remove it.
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "e br_FR.aff"
+ -c "set nobomb ff=unix"
+ -c "update" -c q
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "e br_FR.dic"
+ -c "set nobomb ff=unix"
+ -c "update" -c q
+ @if not os.path.exists('br_FR.orig.aff'):
+ :copy br_FR.aff br_FR.orig.aff
+ @if os.path.exists('br_FR.diff'):
+ :sys patch <br_FR.diff
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 dictionaries/br_FR.aff br_FR.aff >br_FR.diff
+ :sys {force} diff -a -C 1 dictionaries/br_FR.dic br_FR.dic >>br_FR.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch difazier-an-drouizig-0_13.oxt
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../difazier-an-drouizig-0_13.oxt
+ :sys {force} diff ../dictionaries/br_FR.aff br_FR.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy br_FR.aff ../br_FR.new.aff
+ :sys {force} diff ../dictionaries/br_FR.dic br_FR.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy br_FR.dic ../br_FR.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete difazier-an-drouizig-0_13.oxt
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/ca/ca_ES.diff b/runtime/spell/ca/ca_ES.diff
new file mode 100644
index 0000000..2372e8c
--- /dev/null
+++ b/runtime/spell/ca/ca_ES.diff
@@ -0,0 +1,83 @@
+*** ca_ES.orig.aff Sat Aug 13 18:33:44 2005
+--- ca_ES.aff Tue Jan 10 18:06:05 2006
+***************
+*** 44,48 ****
+
+! # substitucions preferides
+! FIRST a/ e// //e //e i// /i/ o// //o //o u// /u/ /u/
+! FIRST l/ll ll/l
+
+--- 44,65 ----
+
+! FOL
+! LOW
+! UPP
+!
+! SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
+! SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
+!
+! MIDWORD -'
+!
+! MAP 6
+! MAP a
+! MAP e
+! MAP i
+! MAP o
+! MAP u
+! MAP c
+!
+! REP 2
+! REP l ll
+! REP ll l
+
+*** ca_ES.orig.dic Sat Aug 13 18:33:44 2005
+--- ca_ES.dic Thu Apr 20 20:31:16 2006
+***************
+*** 1,2 ****
+! 149661
+ a/VY
+--- 1,2 ----
+! 149665
+ a/VY
+***************
+*** 25312,25314 ****
+ caos/E
+- cap
+ cap-rodo/E
+--- 25312,25313 ----
+***************
+*** 35103,35105 ****
+ corrasi/G
+- corre
+ corre-corrents
+--- 35102,35103 ----
+***************
+*** 99806,99808 ****
+ majscul/F
+- mal
+ mal-llevat/E
+--- 99804,99805 ----
+***************
+*** 107517,107519 ****
+ notriament
+- nou
+ nou-centes/E
+--- 107514,107515 ----
+***************
+*** 122687,122689 ****
+ ratnia/E
+- rau
+ rau-rau/E
+--- 122683,122684 ----
+***************
+*** 139389,139391 ****
+ tat/E
+- te
+ te'l
+--- 139384,139385 ----
+***************
+*** 147590,147592 ****
+ vitcola/E
+- viu
+ viu-viu/E
+--- 147584,147585 ----
diff --git a/runtime/spell/ca/main.aap b/runtime/spell/ca/main.aap
new file mode 100644
index 0000000..8ba8c1a
--- /dev/null
+++ b/runtime/spell/ca/main.aap
@@ -0,0 +1,81 @@
+# Aap recipe for Catelan (Spain) Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = ca_ES.aff ca_ES.dic
+
+all: $SPELLDIR/ca.latin1.spl $SPELLDIR/ca.utf-8.spl ../README_ca.txt
+
+$SPELLDIR/ca.latin1.spl : $FILES
+ :sys env LANG=ca_ES.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/ca ca_ES" -c q
+
+$SPELLDIR/ca.utf-8.spl : $FILES
+ :sys env LANG=ca_ES.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/ca ca_ES" -c q
+
+../README_ca.txt : README_ca_ES.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} ca_ES.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# Make sure the files are in Unix fileformat
+ca_ES.aff ca_ES.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch ca_ES.zip
+ :sys $UNZIP ca_ES.zip
+ :delete ca_ES.zip
+ :sys $VIM ca_ES.aff -u NONE -c "set ff=unix" -c "update" -c q
+ :sys $VIM ca_ES.dic -u NONE -c "set ff=unix" -c "update" -c q
+ @if not os.path.exists('ca_ES.orig.aff'):
+ :copy ca_ES.aff ca_ES.orig.aff
+ @if not os.path.exists('ca_ES.orig.dic'):
+ :copy ca_ES.dic ca_ES.orig.dic
+ @if os.path.exists('ca_ES.diff'):
+ :sys patch <ca_ES.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 ca_ES.orig.aff ca_ES.aff >ca_ES.diff
+ :sys {force} diff -a -C 1 ca_ES.orig.dic ca_ES.dic >>ca_ES.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch ca_ES.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../ca_ES.zip
+ :sys {force} diff ../ca_ES.orig.aff ca_ES.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ca_ES.aff ../ca_ES.new.aff
+ :sys {force} diff ../ca_ES.orig.dic ca_ES.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ca_ES.dic ../ca_ES.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete ca_ES.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/check/check_aa.aff b/runtime/spell/check/check_aa.aff
new file mode 100644
index 0000000..20e1633
--- /dev/null
+++ b/runtime/spell/check/check_aa.aff
@@ -0,0 +1,50 @@
+SET ISO8859-1
+TRY esianrtolcdugmphbyfvkwjkqxz-'ESIANRTOLCDUGMPHBYFVKWJKQXZ
+
+FOL
+LOW
+UPP
+
+SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
+SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
+
+MIDWORD '-
+
+PFXPOSTPONE
+
+COMPOUNDFLAG x
+COMPOUNDMIN 5
+
+KEEPCASE =
+RARE ?
+BAD !
+
+MAP 9
+MAP a
+MAP e
+MAP i
+MAP o
+MAP u
+MAP n
+MAP c
+MAP y
+MAP s
+
+PFX A Y 1
+PFX A 0 aan .
+
+PFX B N 1
+PFX B 0 be .
+
+PFX C Y 1
+PFX C a in aa
+
+SFX J N 1
+SFX J 0 tje [aeiou][aeiou]
+
+SFX Z N 1
+SFX Z af ven aaf
+
+REP 2
+REP g ch
+REP cht gd
diff --git a/runtime/spell/check/check_aa.dic b/runtime/spell/check/check_aa.dic
new file mode 100644
index 0000000..697a9c9
--- /dev/null
+++ b/runtime/spell/check/check_aa.dic
@@ -0,0 +1,12 @@
+1234
+#Some Comment that isn't supposed to matter
+/Another Comment that isn't supposed to matter
+'s-Graveland
+A4
+AagJe
+Aalburg/xZBCJZ
+Aals'meer/x
+Aal-ten/x
+Aalburgers/x
+Aalsmeer/x
+Aalten/x
diff --git a/runtime/spell/check/check_bb.aff b/runtime/spell/check/check_bb.aff
new file mode 100644
index 0000000..20e1633
--- /dev/null
+++ b/runtime/spell/check/check_bb.aff
@@ -0,0 +1,50 @@
+SET ISO8859-1
+TRY esianrtolcdugmphbyfvkwjkqxz-'ESIANRTOLCDUGMPHBYFVKWJKQXZ
+
+FOL
+LOW
+UPP
+
+SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
+SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
+
+MIDWORD '-
+
+PFXPOSTPONE
+
+COMPOUNDFLAG x
+COMPOUNDMIN 5
+
+KEEPCASE =
+RARE ?
+BAD !
+
+MAP 9
+MAP a
+MAP e
+MAP i
+MAP o
+MAP u
+MAP n
+MAP c
+MAP y
+MAP s
+
+PFX A Y 1
+PFX A 0 aan .
+
+PFX B N 1
+PFX B 0 be .
+
+PFX C Y 1
+PFX C a in aa
+
+SFX J N 1
+SFX J 0 tje [aeiou][aeiou]
+
+SFX Z N 1
+SFX Z af ven aaf
+
+REP 2
+REP g ch
+REP cht gd
diff --git a/runtime/spell/check/check_bb.dic b/runtime/spell/check/check_bb.dic
new file mode 100644
index 0000000..c01e716
--- /dev/null
+++ b/runtime/spell/check/check_bb.dic
@@ -0,0 +1,12 @@
+1234
+#Some Comment that isn't supposed to matter
+/Another Comment that isn't supposed to matter
+'s-Graveland
+A4
+AagJe
+Aalburg/xZBCJZ
+Aals'meer/x
+Aal-ten/x
+foobar/=
+rare/?
+Emacs/!
diff --git a/runtime/spell/check/main.aap b/runtime/spell/check/main.aap
new file mode 100644
index 0000000..a47351f
--- /dev/null
+++ b/runtime/spell/check/main.aap
@@ -0,0 +1,15 @@
+# Aap recipe for a dummy spell file.
+# This is used to check if the .spl file format changes.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+all: check.latin1.spl
+
+check.latin1.spl : $VIM check_aa.aff check_aa.dic check_bb.aff check_bb.dic
+ :sys $VIM -u NONE -e -c "mkspell! check check_aa check_bb" -c q
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/check_locales.vim b/runtime/spell/check_locales.vim
new file mode 100644
index 0000000..fe7be93
--- /dev/null
+++ b/runtime/spell/check_locales.vim
@@ -0,0 +1,21 @@
+" Script to check if all the locales used in spell files are available.
+
+grep /sys env LANG/ */main.aap
+let not_supported = []
+for item in getqflist()
+ let lang = substitute(item.text, '.*LANG=\(\S\+\).*', '\1', '')
+ try
+ exe 'lang ' . lang
+ catch /E197/
+ call add(not_supported, lang)
+ endtry
+endfor
+
+if len(not_supported) > 0
+ echo "Unsupported languages:"
+ for l in not_supported
+ echo l
+ endfor
+else
+ echo "Everything appears to be OK"
+endif
diff --git a/runtime/spell/cleanadd.vim b/runtime/spell/cleanadd.vim
new file mode 100644
index 0000000..6dc0692
--- /dev/null
+++ b/runtime/spell/cleanadd.vim
@@ -0,0 +1,32 @@
+" Vim script to clean the ll.xxxxx.add files of commented out entries
+" Author: Antonio Colombo, Bram Moolenaar
+" Last Update: 2008 Jun 3
+
+" Time in seconds after last time an ll.xxxxx.add file was updated
+" Default is one second.
+" If you invoke this script often set it to something bigger, e.g. 60 * 60
+" (one hour)
+if !exists("g:spell_clean_limit")
+ let g:spell_clean_limit = 1
+endif
+
+" Loop over all the runtime/spell/*.add files.
+" Delete all comment lines, except the ones starting with ##.
+for s:fname in split(globpath(&rtp, "spell/*.add"), "\n")
+ if filewritable(s:fname) && localtime() - getftime(s:fname) > g:spell_clean_limit
+ if exists('*fnameescape')
+ let s:f = fnameescape(s:fname)
+ else
+ let s:f = escape(s:fname, ' \|<')
+ endif
+ silent exe "tab split " . s:f
+ echo "Processing" s:f
+ silent! g/^#[^#]/d
+ silent update
+ close
+ unlet s:f
+ endif
+endfor
+unlet s:fname
+
+echo "Done"
diff --git a/runtime/spell/cs/cs_CZ.diff b/runtime/spell/cs/cs_CZ.diff
new file mode 100644
index 0000000..40a84ef
--- /dev/null
+++ b/runtime/spell/cs/cs_CZ.diff
@@ -0,0 +1,783 @@
+*** cs_CZ.orig.aff Sat Aug 13 21:38:29 2005
+--- cs_CZ.aff Sat Aug 13 23:29:13 2005
+***************
+*** 3,4 ****
+--- 3,8 ----
+
++ FOL
++ LOW
++ UPP
++
+ PFX N Y 1
+***************
+*** 2118,2120 ****
+ SFX A nout ly [aeiouy]rnout
+! SFX A nout l [aeiouyr][^aeiouyrl][^aeiouy
+ SFX A nout l [aeiouyr][^aeiouyrl]nout
+--- 2122,2124 ----
+ SFX A nout ly [aeiouy]rnout
+! SFX A nout l [aeiouyr][^aeiouyrl][^aeiouy]out
+ SFX A nout l [aeiouyr][^aeiouyrl]nout
+*** cs_CZ.orig.dic Sat Aug 13 21:38:29 2005
+--- cs_CZ.dic Sun Aug 14 15:33:38 2005
+***************
+*** 2944,2946 ****
+ ar/H
+- arch
+ archaick/YCRN
+--- 2944,2945 ----
+***************
+*** 3098,3100 ****
+ arogantn/YKRN
+- aroma
+ aroma/K
+--- 3097,3098 ----
+***************
+*** 4753,4755 ****
+ banjo/MQ
+- bank
+ banka/ZQ
+--- 4751,4752 ----
+***************
+*** 5540,5542 ****
+ Bechykv/Y
+- Bechyn
+ Bechyn/S
+--- 5537,5538 ----
+***************
+*** 5945,5947 ****
+ bermudsk/YRN
+- Bermudy
+ Bermudy/ZQ
+--- 5941,5942 ----
+***************
+*** 6111,6113 ****
+ Beustv/Y
+- bez
+ Bezkov/Y
+--- 6106,6107 ----
+***************
+*** 7294,7296 ****
+ blna/Z
+- Blanc
+ Blanc/PV
+--- 7288,7289 ----
+***************
+*** 9456,9458 ****
+ bichovit/YKR
+- bm
+ bm/M
+--- 9449,9450 ----
+***************
+*** 9667,9669 ****
+ budynsk/Y
+- bufet
+ bufetin/Y
+--- 9659,9660 ----
+***************
+*** 9677,9679 ****
+ bufferov/YRN
+- buffet
+ buffet/H
+--- 9668,9669 ----
+***************
+*** 11386,11388 ****
+ cop/H
+- copyright
+ copyright/H
+--- 11376,11377 ----
+***************
+*** 11446,11448 ****
+ cresc
+- crescendo
+ crescendo/MQ
+--- 11435,11436 ----
+***************
+*** 13810,13812 ****
+ daktylus/Q
+- dl
+ dalajlma/PV
+--- 13798,13799 ----
+***************
+*** 13816,13818 ****
+ dl/E
+- dle
+ Daleck/Y
+--- 13803,13804 ----
+***************
+*** 13821,13823 ****
+ dle/E
+- daleko
+ dalekohled/H
+--- 13807,13808 ----
+***************
+*** 14082,14084 ****
+ datla
+- datle
+ datlech
+--- 14067,14068 ----
+***************
+*** 14756,14758 ****
+ dekuran/YRN
+- dl
+ delaborace/Z
+--- 14740,14741 ----
+***************
+*** 15301,15303 ****
+ desaterkv/Y
+- desatero
+ desatero/MQ
+--- 15284,15285 ----
+***************
+*** 15716,15718 ****
+ devaternk/H
+- devatero
+ devatero/MQ
+--- 15698,15699 ----
+***************
+*** 16152,16154 ****
+ DIK
+- dk
+ dikalciumfosft/H
+--- 16133,16134 ----
+***************
+*** 16603,16605 ****
+ Div/Y
+- div
+ divck/YKR
+--- 16583,16584 ----
+***************
+*** 19886,19888 ****
+ dopola
+- dopoledne
+ dopoledne/M
+--- 19865,19866 ----
+***************
+*** 19970,19972 ****
+ doprat/ATN
+- doprava
+ doprava/ZQ
+--- 19948,19949 ----
+***************
+*** 22912,22914 ****
+ dv/E
+- dve
+ dveko/MQ
+--- 22889,22890 ----
+***************
+*** 26369,26371 ****
+ fakoemulsifikace/Z
+- faksimile
+ faksimile/Z
+--- 26345,26346 ----
+***************
+*** 27266,27268 ****
+ fimza/ZQ
+- finle
+ finle/Z
+--- 27241,27242 ----
+***************
+*** 28101,28103 ****
+ foxtrotov/Y
+- foyer
+ foyer/H
+--- 28075,28076 ----
+***************
+*** 28759,28761 ****
+ Gajdv/Y
+- Gal
+ gal
+--- 28732,28733 ----
+***************
+*** 29060,29062 ****
+ gemovat/ATN
+- gen
+ gencinov/YR
+--- 29032,29033 ----
+***************
+*** 29410,29412 ****
+ glejt/H
+- glissando
+ glissando/MQ
+--- 29381,29382 ----
+***************
+*** 31247,31249 ****
+ hefebrand/H
+- Hegel
+ Hegela
+--- 31217,31218 ----
+***************
+*** 31602,31604 ****
+ Herkulem
+- Herkules
+ Herkules/D
+--- 31571,31572 ----
+***************
+*** 32258,32260 ****
+ hloubtnsk/Y
+- hloubi
+ hloubic/Y
+--- 32226,32227 ----
+***************
+*** 32612,32614 ****
+ Hock/Y
+- hod
+ Hodjice/C
+--- 32579,32580 ----
+***************
+*** 33069,33071 ****
+ homoisoflavonoid/H
+- Homola
+ Homola/PV
+--- 33035,33036 ----
+***************
+*** 34389,34391 ****
+ hebelec/S
+- heben
+ hebenatka/ZQ
+--- 34354,34355 ----
+***************
+*** 34817,34819 ****
+ Huserkv/Y
+- hus
+ husice/ZQ
+--- 34781,34782 ----
+***************
+*** 36441,36443 ****
+ chupav/YKRN
+- cht
+ chtje/XN
+--- 36404,36405 ----
+***************
+*** 38569,38571 ****
+ jajaj
+- jak
+ jakkoli
+--- 38531,38532 ----
+***************
+*** 39323,39325 ****
+ jedn/N
+- jedni
+ jednice/ZQ
+--- 39284,39285 ----
+***************
+*** 39534,39536 ****
+ jednotdenn/YR
+- jednou
+ jednoelov/YRN
+--- 39494,39495 ----
+***************
+*** 39717,39719 ****
+ jemu
+- jen
+ Jena/ZQ
+--- 39676,39677 ----
+***************
+*** 39755,39757 ****
+ jen/N
+- jenom
+ jenom/N
+--- 39713,39714 ----
+***************
+*** 40149,40151 ****
+ jin/S
+- jinak
+ jinak/N
+--- 40106,40107 ----
+***************
+*** 41317,41319 ****
+ Kalistv/Y
+- Kali
+ kalek/Q
+--- 41273,41274 ----
+***************
+*** 42861,42863 ****
+ kdeto
+- kdo
+ kdojjak
+--- 42816,42817 ----
+***************
+*** 44048,44050 ****
+ Klskv/Y
+- klub
+ klubajc/YN
+--- 44002,44003 ----
+***************
+*** 44235,44237 ****
+ Knev/Y
+- knz
+ knze
+--- 44188,44189 ----
+***************
+*** 45007,45009 ****
+ kolik
+- kolika
+ kolikacifern/YKRN
+--- 44959,44960 ----
+***************
+*** 46292,46294 ****
+ kontinuum/MQ
+- konto
+ kontokorent/H
+--- 46243,46244 ----
+***************
+*** 47152,47154 ****
+ kosmopolitv/Y
+- kosmos
+ kosmos/Q
+--- 47102,47103 ----
+***************
+*** 51844,51846 ****
+ Leclanchev/Y
+- le
+ lba/ZQ
+--- 51793,51794 ----
+***************
+*** 52449,52451 ****
+ letiv/YKRN
+- let
+ ltac/YN
+--- 52397,52398 ----
+***************
+*** 54351,54353 ****
+ lj
+- luk
+ Lukov/Y
+--- 54298,54299 ----
+***************
+*** 55408,55410 ****
+ Mallorca/ZQ
+- mlo
+ maloburoasie/Z
+--- 55354,55355 ----
+***************
+*** 55574,55576 ****
+ mamutv/Y
+- Man
+ m/N
+--- 55519,55520 ----
+***************
+*** 55852,55854 ****
+ Maputo/MQ
+- marabu
+ marabu/PV
+--- 55796,55797 ----
+***************
+*** 57254,57256 ****
+ Mendlv/Y
+- mn
+ mncennj/YRW
+--- 57197,57198 ----
+***************
+*** 58358,58360 ****
+ milen/YN
+- milerd
+ milerd/O
+--- 58300,58301 ----
+***************
+*** 59426,59428 ****
+ mocm
+- mocipn
+ mocipna
+--- 59367,59368 ----
+***************
+*** 60833,60835 ****
+ Muchv/Y
+- mj
+ mj/Y
+--- 60773,60774 ----
+***************
+*** 62308,62310 ****
+ nadplocha/ZQ
+- nadpoet
+ nadpoetnj/YRW
+--- 62247,62248 ----
+***************
+*** 66114,66116 ****
+ navaujc/YN
+- naveer
+ naveer/L
+--- 66052,66053 ----
+***************
+*** 66581,66583 ****
+ nebes
+- nebesa
+ nebesa/MQ
+--- 66518,66519 ----
+***************
+*** 68080,68082 ****
+ noblesn/YKR
+- noc
+ nocemi
+--- 68016,68017 ----
+***************
+*** 68562,68564 ****
+ novum/MQ
+- Nov
+ Nov/Y
+--- 68497,68498 ----
+***************
+*** 73018,73020 ****
+ odpojovvat/JTN
+- odpoledne
+ odpoledne/M
+--- 72952,72953 ----
+***************
+*** 73121,73123 ****
+ odpraovat/ATN
+- odprava
+ odprava/ZQ
+--- 73054,73055 ----
+***************
+*** 76145,76147 ****
+ oosfra/ZQ
+- op
+ open/SN
+--- 76077,76078 ----
+***************
+*** 78040,78042 ****
+ ostihnout/ATN
+- Ostihom
+ Ostihom/K
+--- 77971,77972 ----
+***************
+*** 80117,80121 ****
+ pantheistick/YCR
+- pantofel
+ pantofel/Q
+- pantofle
+ pantoflemi
+--- 80047,80049 ----
+***************
+*** 80258,80260 ****
+ par
+- pr
+ paraamfibolit/H
+--- 80186,80187 ----
+***************
+*** 81414,81416 ****
+ PE
+- pec
+ peca/U
+--- 81341,81342 ----
+***************
+*** 82720,82722 ****
+ pianistv/Y
+- piano
+ pino/MQ
+--- 82646,82647 ----
+***************
+*** 83321,83323 ****
+ pizzerie/Z
+- pizzicato
+ pizzicato/MQ
+--- 83246,83247 ----
+***************
+*** 83731,83733 ****
+ plebiscit/H
+- plebs
+ plebse
+--- 83655,83656 ----
+***************
+*** 83833,83835 ****
+ Pleskotv/Y
+- plesky
+ plesky/H
+--- 83756,83757 ----
+***************
+*** 85861,85863 ****
+ podadn/SN
+- podadn
+ podadn/YKRN
+--- 85783,85784 ----
+***************
+*** 89077,89079 ****
+ popvat/JN
+- poped
+ poped/S
+--- 88998,88999 ----
+***************
+*** 91358,91360 ****
+ pozabjet/JTN
+- pozad
+ pozad/S
+--- 91278,91279 ----
+***************
+*** 91783,91785 ****
+ prceschopn/YKR
+- prac
+ prci
+--- 91702,91703 ----
+***************
+*** 92176,92178 ****
+ pravk/YKR
+- prvem
+ prvem/N
+--- 92094,92095 ----
+***************
+*** 95377,95379 ****
+ prospvat/JTN
+- prospch
+ prospchn/SN
+--- 95294,95295 ----
+***************
+*** 105195,105197 ****
+ pldenn/YR
+- pldne
+ pldnech
+--- 105111,105112 ----
+***************
+*** 105216,105218 ****
+ pldruh/Y
+- ple
+ pulec/U
+--- 105131,105132 ----
+***************
+*** 106257,106259 ****
+ rmcov/YR
+- rm
+ rmec/S
+--- 106171,106172 ----
+***************
+*** 109304,109306 ****
+ rozdlujc/YN
+- rozdl
+ rozdlen/SN
+--- 109217,109218 ----
+***************
+*** 113029,113031 ****
+ Rr/H
+- Rus
+ rusal/Y
+--- 112941,112942 ----
+***************
+*** 113124,113126 ****
+ rutina/ZQ
+- Rt
+ Rta/PV
+--- 113035,113036 ----
+***************
+*** 115104,115106 ****
+ scezovat/ATN
+- science
+ science/Z
+--- 115014,115015 ----
+***************
+*** 115723,115725 ****
+ sedmere/K
+- sedmero
+ sedmero/MQ
+--- 115632,115633 ----
+***************
+*** 116249,116251 ****
+ Smv/Y
+- sen
+ sena/PI
+--- 116157,116158 ----
+***************
+*** 116962,116964 ****
+ sevindlovat/ATN
+- set
+ setba/ZQ
+--- 116869,116870 ----
+***************
+*** 117786,117788 ****
+ Sikv/Y
+- sil
+ silck/YKRN
+--- 117692,117693 ----
+***************
+*** 121635,121637 ****
+ spatn/YKR
+- spatra
+ spatra/ZQ
+--- 121540,121541 ----
+***************
+*** 121887,121889 ****
+ sp
+- spe
+ spe/E
+--- 121791,121792 ----
+***************
+*** 122323,122325 ****
+ spoluprce/N
+- spoluprci
+ spolupracch/N
+--- 122226,122227 ----
+***************
+*** 122890,122892 ****
+ srovnanj/YRW
+- srovnn
+ srovnn/SN
+--- 122792,122793 ----
+***************
+*** 129987,129989 ****
+ unt/H
+- up
+ upck/YKR
+--- 129888,129889 ----
+***************
+*** 130427,130429 ****
+ takovouto
+- takov
+ takovchto
+--- 130327,130328 ----
+***************
+*** 131190,131192 ****
+ temsk/Y
+- ten
+ tenata/MQ
+--- 131089,131090 ----
+***************
+*** 131958,131960 ****
+ tich/YKRO
+- tik
+ tikajc/YN
+--- 131856,131857 ----
+***************
+*** 132541,132543 ****
+ Tomaschv/Y
+- Tom
+ Tomek/PV
+--- 132438,132439 ----
+***************
+*** 133890,133892 ****
+ Trubsk/Y
+- truc
+ truc/H
+--- 133786,133787 ----
+***************
+*** 134057,134059 ****
+ tst/IN
+- teba
+ teba/N
+--- 133952,133953 ----
+***************
+*** 135024,135026 ****
+ tvrz/Z
+- tvj
+ tvj/Y
+--- 134918,134919 ----
+***************
+*** 135532,135534 ****
+ esov/YR
+- et
+ etnick/YRN
+--- 135425,135426 ----
+***************
+*** 139620,139622 ****
+ uzamknut/SN
+- uzamknut
+ uzamknut/YKRN
+--- 139512,139513 ----
+***************
+*** 141624,141626 ****
+ Verdolv/Y
+- vren
+ vren/N
+--- 141515,141516 ----
+***************
+*** 141651,141653 ****
+ vr/N
+- vrna
+ vrna/N
+--- 141541,141542 ----
+***************
+*** 141663,141665 ****
+ Verne/Y
+- vrni
+ vrni/N
+--- 141552,141553 ----
+***************
+*** 141667,141669 ****
+ vernis/Z
+- vrno
+ vrno/N
+--- 141555,141556 ----
+***************
+*** 141671,141676 ****
+ vernovka/ZQ
+- vrnu
+ vrnu/N
+ Vernv/Y
+- vrny
+ vrny/N
+--- 141558,141561 ----
+***************
+*** 141924,141926 ****
+ vetknut/SN
+- vetknut
+ vetknut/YKRN
+--- 141809,141810 ----
+***************
+*** 142117,142119 ****
+ vhlouben/YKRN
+- vhloubit
+ vhloubit/ATN
+--- 142001,142002 ----
+***************
+*** 144104,144106 ****
+ Voldnv/Y
+- vole
+ volebn/YR
+--- 143987,143988 ----
+***************
+*** 144409,144411 ****
+ Votpkv/Y
+- vous
+ vous/U
+--- 144291,144292 ----
+***************
+*** 144952,144954 ****
+ vrtulov/YR
+- vrub
+ vrub/H
+--- 144833,144834 ----
+***************
+*** 144979,144981 ****
+ vrvav/YR
+- vrz
+ Vrzek/PV
+--- 144859,144860 ----
+***************
+*** 151330,151332 ****
+ vytknut/SN
+- vytknut
+ vytknut/YRN
+--- 151209,151210 ----
+***************
+*** 151927,151929 ****
+ vyvrhnut/SN
+- vyvrhnut
+ vyvrhnut/YKRN
+--- 151805,151806 ----
+***************
+*** 152435,152437 ****
+ vzdlvat/JTN
+- vzdor
+ vzdor/H
+--- 152312,152313 ----
+***************
+*** 156040,156042 ****
+ zamknut/SN
+- zamknut
+ zamknut/YKRN
+--- 155916,155917 ----
+***************
+*** 157795,157797 ****
+ zastonejte/N
+- zastoupen
+ zastoupen/SN
+--- 157670,157671 ----
+***************
+*** 160364,160366 ****
+ zeb/Y
+- zebu
+ zebu/BN
+--- 160238,160239 ----
+***************
+*** 166409,166411 ****
+ mu
+- nec
+ nec/U
+--- 166282,166283 ----
diff --git a/runtime/spell/cs/main.aap b/runtime/spell/cs/main.aap
new file mode 100644
index 0000000..53ae46f
--- /dev/null
+++ b/runtime/spell/cs/main.aap
@@ -0,0 +1,81 @@
+# Aap recipe for Czech Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = cs_CZ.aff cs_CZ.dic
+
+all: $SPELLDIR/cs.iso-8859-2.spl $SPELLDIR/cs.utf-8.spl \
+ $SPELLDIR/cs.cp1250.spl ../README_cs.txt
+
+$SPELLDIR/cs.iso-8859-2.spl : $FILES
+ :sys env LANG=cs_CZ.ISO8859-2 $VIM -u NONE -e -c "mkspell! $SPELLDIR/cs cs_CZ" -c q
+
+$SPELLDIR/cs.utf-8.spl : $FILES
+ :sys env LANG=cs_CZ.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/cs cs_CZ" -c q
+
+$SPELLDIR/cs.cp1250.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=cp1250" -c "mkspell! $SPELLDIR/cs cs_CZ" -c q
+
+../README_cs.txt: README_cs_CZ.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} cs_CZ.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+cs_CZ.aff cs_CZ.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch cs_CZ.zip
+ :sys $UNZIP cs_CZ.zip
+ :delete cs_CZ.zip
+ @if not os.path.exists('cs_CZ.orig.aff'):
+ :copy cs_CZ.aff cs_CZ.orig.aff
+ @if not os.path.exists('cs_CZ.orig.dic'):
+ :copy cs_CZ.dic cs_CZ.orig.dic
+ @if os.path.exists('cs_CZ.diff'):
+ :sys patch <cs_CZ.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 cs_CZ.orig.aff cs_CZ.aff >cs_CZ.diff
+ :sys {force} diff -a -C 1 cs_CZ.orig.dic cs_CZ.dic >>cs_CZ.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch cs_CZ.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../cs_CZ.zip
+ :sys {force} diff ../cs_CZ.orig.aff cs_CZ.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy cs_CZ.aff ../cs_CZ.new.aff
+ :sys {force} diff ../cs_CZ.orig.dic cs_CZ.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy cs_CZ.dic ../cs_CZ.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete cs_CZ.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/cy/cy_GB.diff b/runtime/spell/cy/cy_GB.diff
new file mode 100644
index 0000000..75f3f42
--- /dev/null
+++ b/runtime/spell/cy/cy_GB.diff
@@ -0,0 +1,9 @@
+*** cy_GB.orig.aff Wed Aug 31 21:44:01 2005
+--- cy_GB.aff Wed Aug 31 21:44:01 2005
+***************
+*** 81,82 ****
+--- 81,84 ----
+
++ MIDWORD '-
++
+ PFX M Y 18
diff --git a/runtime/spell/cy/main.aap b/runtime/spell/cy/main.aap
new file mode 100644
index 0000000..1c1d20d
--- /dev/null
+++ b/runtime/spell/cy/main.aap
@@ -0,0 +1,82 @@
+# Aap recipe for Welsh Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = cy_GB.aff cy_GB.dic
+
+all: $SPELLDIR/cy.iso-8859-14.spl $SPELLDIR/cy.utf-8.spl \
+ ../README_cy.txt
+
+$SPELLDIR/cy.iso-8859-14.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=iso-8859-14"
+ -c "mkspell! $SPELLDIR/cy cy_GB" -c q
+
+$SPELLDIR/cy.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "mkspell! $SPELLDIR/cy cy_GB" -c q
+
+../README_cy.txt : README_cy_GB.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} cy_GB.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+cy_GB.aff cy_GB.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch cy_GB.zip
+ :sys $UNZIP cy_GB.zip
+ :delete cy_GB.zip
+ :sys $VIM cy_GB.aff -u NONE -e -c "set ff=unix" -c update -c q
+ :sys $VIM cy_GB.dic -u NONE -e -c "set ff=unix" -c update -c q
+ :sys $VIM README_cy_GB.txt -u NONE -e -c "set ff=unix" -c update -c q
+ @if not os.path.exists('cy_GB.orig.aff'):
+ :copy cy_GB.aff cy_GB.orig.aff
+ @if not os.path.exists('cy_GB.orig.dic'):
+ :copy cy_GB.dic cy_GB.orig.dic
+ @if os.path.exists('cy_GB.diff'):
+ :sys patch <cy_GB.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 cy_GB.orig.aff cy_GB.aff >cy_GB.diff
+ :sys {force} diff -a -C 1 cy_GB.orig.dic cy_GB.dic >>cy_GB.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch cy_GB.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../cy_GB.zip
+ :sys {force} diff ../cy_GB.orig.aff cy_GB.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy cy_GB.aff ../cy_GB.new.aff
+ :sys {force} diff ../cy_GB.orig.dic cy_GB.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy cy_GB.dic ../cy_GB.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete cy_GB.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/da/da_DK.diff b/runtime/spell/da/da_DK.diff
new file mode 100644
index 0000000..583652c
--- /dev/null
+++ b/runtime/spell/da/da_DK.diff
@@ -0,0 +1,140 @@
+*** da_DK.orig.aff Sun Aug 14 20:04:31 2005
+--- da_DK.aff Thu Sep 29 22:20:15 2005
+***************
+*** 6,7 ****
+--- 6,13 ----
+
++ FOL
++ LOW
++ UPP
++
++ MIDWORD '-
++
+ # Foranstilling af u-
+***************
+*** 606,618 ****
+--- 612,735 ----
+
++ # sound folding from Aspell
++ # Doesn't contain a copyright notice.
++ # version 0.1-2002.12.15-3
++
++ SAL AA<
++ SAL ACTION AKSJON
++ SAL AF< AV
++ SAL ASIE< ASJE
++ SAL A A
++
++ SAL BEDST< BEST
++ SAL BORD< BOR
++ SAL BRYST< BRST
++ SAL BUREAU BYRO
++ SAL B B
++
++ SAL CC< KS
++ SAL CK< K
++ SAL CH< TJ
++ SAL CI< SI
++ SAL CO< KO
++ SAL CY< SY
++ SAL C< S
++ SAL #C C
++
++ SAL DIG^$ DAJ
++ SAL DIG< DI
++ SAL D$ _
++ SAL D D
++
++ SAL EAUX< O
++ SAL EAU< O
++ SAL EJ$< AJ
++ SAL EU< V
++ SAL E E
++
++ SAL E
++
++ SAL E
++
++ SAL FEDT< FET
++ SAL F F
++
++ SAL G G
++
++ SAL HJ^< J
++ SAL HRD< HR
++ SAL HND< HN
++ SAL H H
++
++ SAL ION< JON
++ SAL IND^< IN
++ SAL I I
++
++ SAL J J
++
++ SAL K K
++
++ # Stumt G
++ SAL LIG< LI
++ SAL L L
++
++ SAL MAND< MAN
++ SAL MIG^$ MAJ
++ SAL M M
++
++ SAL N N
++
++ SAL OST ST
++ SAL O O
++
++ SAL O
++
++ SAL PH< F
++ SAL P P
++
++ SAL Q< KU
++
++ SAL REGN< REJN
++ SAL RUG< RU
++ SAL RYG RG
++ SAL R R
++
++ SAL SH< SJ
++ SAL SIG^$ SAJ
++ SAL SKIND< SKIN
++ SAL S'S<$ S
++ SAL S S
++
++ SAL TION SJON
++ SAL TZ< TS
++ SAL T T
+
++ SAL U U
+
++ SAL < Y
+
++ SAL V V
+
++ SAL W< V
+
++ SAL X'S< KS
++ SAL X< KS
+
++ SAL YKK< KK
++ SAL YND< ND
++ SAL Y Y
+
++ SAL Z'S< S
++ SAL Z< S
++ SAL #Z Z
+
++ SAL
+
++ SAL <
+
++ # eks. Han lv en tur (lb)
++ SAL B< V
++ SAL
+
++ SAL <
+
++ SAL
diff --git a/runtime/spell/da/main.aap b/runtime/spell/da/main.aap
new file mode 100644
index 0000000..4c371b2
--- /dev/null
+++ b/runtime/spell/da/main.aap
@@ -0,0 +1,79 @@
+# Aap recipe for Danish Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = da_DK.aff da_DK.dic
+
+all: $SPELLDIR/da.latin1.spl $SPELLDIR/da.utf-8.spl ../README_da.txt
+
+$SPELLDIR/da.latin1.spl : $FILES
+ :sys env LANG=da_DK.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/da da_DK" -c q
+
+$SPELLDIR/da.utf-8.spl : $FILES
+ :sys env LANG=da_DK.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/da da_DK" -c q
+
+../README_da.txt : README Copyright
+ :cat $source >! $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} da_DK.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+da_DK.aff da_DK.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch da_DK.zip
+ :sys $UNZIP da_DK.zip
+ :delete da_DK.zip
+ :delete COPYING Makefile da_DK.excluded
+ @if not os.path.exists('da_DK.orig.aff'):
+ :copy da_DK.aff da_DK.orig.aff
+ @if not os.path.exists('da_DK.orig.dic'):
+ :copy da_DK.dic da_DK.orig.dic
+ @if os.path.exists('da_DK.diff'):
+ :sys patch <da_DK.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 da_DK.orig.aff da_DK.aff >da_DK.diff
+ :sys {force} diff -a -C 1 da_DK.orig.dic da_DK.dic >>da_DK.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch da_DK.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../da_DK.zip
+ :sys {force} diff ../da_DK.orig.aff da_DK.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy da_DK.aff ../da_DK.new.aff
+ :sys {force} diff ../da_DK.orig.dic da_DK.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy da_DK.dic ../da_DK.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete da_DK.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/de/de_19.diff b/runtime/spell/de/de_19.diff
new file mode 100644
index 0000000..a2b9fa4
--- /dev/null
+++ b/runtime/spell/de/de_19.diff
@@ -0,0 +1,514 @@
+*** de_19.orig.aff 2019-01-19 18:45:26.468520305 +0100
+--- de_19.aff 2019-01-19 18:45:26.472520278 +0100
+***************
+*** 3,4 ****
+--- 3,21 ----
+
++ FOL
++ LOW
++ UPP
++
++ MIDWORD '
++
++ MAP 9
++ MAP a
++ MAP e
++ MAP i
++ MAP o
++ MAP u
++ MAP n
++ MAP c
++ MAP y
++ MAP s
++
+ # (c) copyright by Bjoern Jacke <bjoern@j3e.de>
+***************
+*** 560 ****
+--- 577,1052 ----
+
++ # German phonetic transformation rules from Aspell
++ # Copyright (C) 2000 Bjrn Jacke, distributed under LGPL.
++ # Bjrn Jacke may be reached by email at bjoern.jacke@gmx.de
++ # Last changed 2000-01-07
++
++ SAL followup 1
++ SAL collapse_result 1
++
++ SAL ER- E
++ SAL U< EU
++ SAL < E
++ SAL E
++ SAL ER-
++ SAL
++ SAL BER^^ IPA
++ SAL ER- I
++ SAL I
++ SAL Z
++ SAL ABELLE$ APL
++ SAL ABELL$ APL
++ SAL ABIENNE$ APIN
++ SAL ACEY$ AZI
++ SAL AEU< EU
++ SAL AE2 E
++ SAL AGNI-^ AKN
++ SAL AGNIE- ANI
++ SAL AGN(AEOU)-$ ANI
++ SAL AIA2 AIA
++ SAL AIE$ E
++ SAL AILL(EOU)- ALI
++ SAL AINE$ EN
++ SAL AIRE$ ER
++ SAL AIR- E
++ SAL AISE$ EZ
++ SAL AISSANCE$ EZANZ
++ SAL AISSE$ EZ
++ SAL AIX$ EX
++ SAL AJ(AEIOU)-- A
++ SAL AKTIE AXIE
++ SAL ALO(IY)^ ALUI
++ SAL AMATEU(RS)- ANAT
++ SAL ANIELLE$ ANIL
++ SAL ANTI^^ ANTI
++ SAL ANVER^^ ANFA
++ SAL ATIA$ ATIA
++ SAL ATIA(NS)-- ATI
++ SAL ATI(AOU)- AZI
++ SAL AUAU-- _
++ SAL AUER< AUA
++ SAL AUF^^ AUF
++ SAL AULT$ U
++ SAL AUSSE$ UZ
++ SAL AUS(ST)-^ AUZ
++ SAL AUS^^ AUZ
++ SAL AUTO^^ AUTU
++ SAL AUX(IY)- AUX
++ SAL AUX U
++ SAL AU AU
++ SAL AVIER$ AFIE
++ SAL AYER--< EI
++ SAL AY(AEIOU)-- A
++ SAL A(IJY)< EI
++ SAL A A
++ SAL BEA(BCMNRU)-^ PEA
++ SAL BEAT(AEIMORU)-^ PEAT
++ SAL BEIGE^$ PEZ
++ SAL BE(LMNRST)-^ PE
++ SAL BETTE$ PET
++ SAL BIC$ PIZ
++ SAL BOWL(EI)- PUL
++ SAL BP(AEIORUY)- P
++ SAL BUDGET7 PIKE
++ SAL BUFFET7 PIFE
++ SAL BYLLE$ PILE
++ SAL BYLL$ PIL
++ SAL BYTE< PEIT
++ SAL B P
++ SAL C- Z
++ SAL C$ ZI
++ SAL CACH(EI)-^ KEZ
++ SAL CAE-- Z
++ SAL CA(IY)$ ZEI
++ SAL CCH Z
++ SAL CCE- X
++ SAL CE(EIJUY)-- Z
++ SAL CENT< ZENT
++ SAL CERST(EI)----^ KE
++ SAL CER$ ZA
++ SAL CE3 ZE
++ SAL CHAO(ST)- KAU
++ SAL CHAMPIO-^ ZENPI
++ SAL CHAR(AI)-^ KAR
++ SAL CHAU(CDFSVWXZ)- ZU
++ SAL CHE(CF)- ZE
++ SAL CHEM-^ KE
++ SAL CHEQUE< ZEK
++ SAL CHI(CFGPVW)- ZI
++ SAL CH(AEUY)-<^ Z
++ SAL CHK- _
++ SAL CH(LOR)-<^ K
++ SAL CHST- X
++ SAL CH(SXZ)3 X
++ SAL CH K
++ SAL CIER$ ZIE
++ SAL CYB-^ ZEI
++ SAL CY9^ ZI
++ SAL C(IJY)-3 Z
++ SAL CKST XT
++ SAL CK(SXZ)3 X
++ SAL C(CK)- _
++ SAL CLAUDET--- KLU
++ SAL CLAUDINE^$ KLUTIN
++ SAL COLE$ KUL
++ SAL COUCH KAUZ
++ SAL CQUES$ K
++ SAL CQUE K
++ SAL CREAT-^ KREA
++ SAL CST XT
++ SAL CS<^ Z
++ SAL C(SX) X
++ SAL CT(SXZ) X
++ SAL CZ< Z
++ SAL C< K
++ SAL D'H^ T
++ SAL D'S3$ Z
++ SAL DAVO(NR)-^$ TAFU
++ SAL DD(SZ)--< _
++ SAL DEPOT7 TEPU
++ SAL DESIGN TIZEIN
++ SAL DE(LMNRST)-3^ TE
++ SAL DETTE$ TET
++ SAL DIC$ TIZ
++ SAL DJ(AEIOU)-^ I
++ SAL DS(CH)--< T
++ SAL DST ZT
++ SAL DT- _
++ SAL DUIS-^ TI
++ SAL DURCH^^ TURK
++ SAL DZS(CH)-- T
++ SAL D(SZ) Z
++ SAL D T
++ SAL EAULT$ U
++ SAL EAUX$ U
++ SAL EAU U
++ SAL EAV IF
++ SAL EA(AEIOY)-3 EA
++ SAL EA3$ EA
++ SAL EA3 I
++ SAL EBEN^^ EPN
++ SAL EE9 E
++ SAL EIEI-- _
++ SAL EIH-- E
++ SAL EILLE$ EI
++ SAL EI EI
++ SAL EJ$ EI
++ SAL EL-^ E
++ SAL EL(DKL)--1 E
++ SAL EL(MNT)--1$ E
++ SAL ELYNE$ ELINE
++ SAL ELYN$ ELIN
++ SAL EL(AEIOUY)-1 EL
++ SAL EL-1 L
++ SAL EM-^ E
++ SAL EM(DFKMPQT)--1 E
++ SAL EM(AEIOUY)--1 E
++ SAL EM-1 N
++ SAL EN-^ E
++ SAL EN(CDGKQT)--1 E
++ SAL ENZ(AEIOUY)--1 EN
++ SAL EN(AEINOUY)-1 EN
++ SAL EN-<1 N
++ SAL ERH(AEIOU)-^ ER
++ SAL ER-^ E
++ SAL ER(AEIOUY)-1 A
++ SAL ER1$ A
++ SAL ER<1 A
++ SAL ETI(AOU)- EZI
++ SAL EUEU-- _
++ SAL EUILLE$
++ SAL EUR$ R
++ SAL EUX
++ SAL EUYS$ EUZ
++ SAL EU EU
++ SAL EYER< EIA
++ SAL EY< EI
++ SAL E E
++ SAL FANS--^$ FE
++ SAL FAN-^$ FE
++ SAL FAULT- FUL
++ SAL FEE(DL)- FI
++ SAL FEHLER FELA
++ SAL FE(LMNRST)-3^ FE
++ SAL FOND7 FUN
++ SAL FRAIN$ FRA
++ SAL FRISEU(RS)- FRIZ # x
++ SAL F F
++ SAL G'S$ X
++ SAL GAGS^$ KEX
++ SAL GAG^$ KEK
++ SAL GD KT
++ SAL GEGEN^^ KEKN
++ SAL GE(LMNRST)-3^ KE
++ SAL GETTE$ KET
++ SAL G(CK)- _
++ SAL GG- _
++ SAL GI(AO)-^ I
++ SAL GION$ KIUN
++ SAL GIUS-^ IU
++ SAL GMBH^$ GMPH
++ SAL GNAC$ NIAK
++ SAL GNON$ NIUN
++ SAL GN$ N
++ SAL GONCAL-^ KUNZA
++ SAL GS(CH)-- K
++ SAL GST XT
++ SAL G(SXZ) X
++ SAL GUCK- KU
++ SAL GUI-^ K
++ SAL G K
++ SAL HEAD- E
++ SAL HE(LMNRST)-3^ E
++ SAL HE(LMN)-1 E
++ SAL HEUR1$ R
++ SAL H^ _
++ SAL IEC$ IZ
++ SAL IEI-3 _
++ SAL IELL3 IEL
++ SAL IENNE$ IN
++ SAL IERRE$ IER
++ SAL IETTE$ IT
++ SAL IEU I
++ SAL IE<4 I
++ SAL IGHT3$ EIT
++ SAL IGNI(EO)- INI
++ SAL IGN(AEOU)-$ INI
++ SAL IJ(AOU)- I
++ SAL IJ$ I
++ SAL IJ< EI
++ SAL IKOLE$ IKUL
++ SAL ILLAN(STZ)-- ILIA
++ SAL ILLAR(DT)-- ILIA
++ SAL INVER- INFE
++ SAL ITI(AOU)- IZI
++ SAL IVIER$ IFIE
++ SAL I I
++ SAL JAVIE---<^ ZA
++ SAL JEAN^$ IA
++ SAL JEAN-^ IA
++ SAL JER-^ IE
++ SAL JE(LMNST)- IE
++ SAL JOR(GK)^$ IRK
++ SAL J I
++ SAL KC(EIJ)- X
++ SAL KE(LMNRST)-3^ KE
++ SAL KH<^ K
++ SAL KIC$ KIZ
++ SAL KLE(LMNRST)-3^ KLE
++ SAL KOTELE-^ KUTL
++ SAL KREAT-^ KREA
++ SAL KST XT
++ SAL K(SXZ) X
++ SAL KTI(AIOU)-3 XI
++ SAL KT(SXZ) X
++ SAL K K
++ SAL LARVE- LARF
++ SAL LEAND-^ LEAN
++ SAL LEL- LE
++ SAL LE(MNRST)-3^ LE
++ SAL LETTE$ LET
++ SAL LFGNAG- LFKAN
++ SAL LIC$ LIZ
++ SAL LIVE^$ LEIF
++ SAL LUI(GS)-- LU
++ SAL L L
++ SAL MASSEU(RS)- NAZ
++ SAL MAURICE NURIZ
++ SAL MBH^$ MPH
++ SAL MB(SZ)- N
++ SAL MC9^ NK
++ SAL MEMOIR-^ NENUA
++ SAL ME(LMNRST)-3^ NE
++ SAL MIGUEL NIKL
++ SAL MIKE^$ NEIK
++ SAL MN N
++ SAL MPJUTE- NPUT
++ SAL MP(SZ)- N
++ SAL MP(BDJLMNPQRTVW)- NP
++ SAL M N
++ SAL NACH^^ NAK
++ SAL NADINE NATIN
++ SAL NAIV-- NA
++ SAL NAISE$ NEZE
++ SAL NCOISE$ ZUA
++ SAL NCOIS$ ZUA
++ SAL NEBEN^^ NEPN
++ SAL NE(LMNRST)-3^ NE
++ SAL NEN-3 NE
++ SAL NETTE$ NET
++ SAL NG(BDFJLMNPQRTVW)- NK
++ SAL NICHTS^^ NIX
++ SAL NICHT^^ NIKT
++ SAL NINE$ NIN
++ SAL NON^^ NUN
++ SAL NOT^^ NUT
++ SAL NTI(AIOU)-3 NZI
++ SAL NTIEL--3 NZI
++ SAL NYLON NEILUN
++ SAL ND(SZ)$ NZ
++ SAL NT(SZ)$ NZ
++ SAL ND'S$ NZ
++ SAL NT'S$ NZ
++ SAL NSTS$ NZ
++ SAL N N
++ SAL OBER^^ UPA
++ SAL OE2
++ SAL OGNIE- UNI
++ SAL OGN(AEOU)-$ UNI
++ SAL OIE$
++ SAL OIR$ UAR
++ SAL OIX UA
++ SAL OI<3 EU
++ SAL OJ(AEIOU)-- U
++ SAL OKAY^$ UKE
++ SAL OLYN$ ULIN
++ SAL OTI(AOU)- UZI
++ SAL OUI^ FI
++ SAL OUILLE$ ULIE
++ SAL OU(DT)-^ AU
++ SAL OUSE$ AUZ
++ SAL OUT- AU
++ SAL OU U
++ SAL OWS$ UZ
++ SAL OY(AEIOU)-- U
++ SAL O(JY)< EU
++ SAL O U
++ SAL PATIEN--^ PAZI
++ SAL PENSIO-^ PANZI
++ SAL PE(LMNRST)-3^ PE
++ SAL PFER-^ FE
++ SAL P(FH)< F
++ SAL POLY^^ PULI
++ SAL PORTRAIT7 PURTRE
++ SAL PP(FH)--< P
++ SAL PP- _
++ SAL PRIX^$ PRI
++ SAL P(SZ)^ Z
++ SAL PTI(AOU)-3 PZI
++ SAL PIC^$ PIK
++ SAL P P
++ SAL QUE(LMNRST)-3 KFE
++ SAL QUE$ K
++ SAL QUI(NS)$ KI
++ SAL QU KF
++ SAL Q< K
++ SAL RCH RK
++ SAL RECHERCH^ REZAZ
++ SAL RER$ RA
++ SAL RE(MNR)-4 RE
++ SAL RETTE$ RET
++ SAL RH<^ R
++ SAL RJA(MN)-- RI
++ SAL RTI(AOU)-3 RZI
++ SAL RY(KN)-$ RI
++ SAL R R
++ SAL SAFE^$ ZEIF
++ SAL SAUCE-^ ZUZ
++ SAL SCHSCH---7 _
++ SAL SCHTSCH Z
++ SAL SC(HZ)< Z
++ SAL SC ZK
++ SAL SELBSTST--7^^ ZELP
++ SAL SELBST7^^ ZELPZT
++ SAL SERVICE7^ ZRFIZ
++ SAL SE(LMNRST)-3^ ZE
++ SAL SETTE$ ZET
++ SAL SHP-^ Z
++ SAL SHST ZT
++ SAL SHTSH Z
++ SAL SHT Z
++ SAL SH3 Z
++ SAL SIEGLI-^ ZIKL
++ SAL SIGLI-^ ZIKL
++ SAL SIGHT ZEIT
++ SAL SIGN ZEIN
++ SAL SKI(NPZ)- ZKI
++ SAL SKI<^ ZI
++ SAL SOUND- ZAUN
++ SAL STAATS^^ ZTAZ
++ SAL STADT^^ ZTAT
++ SAL START^^ ZTART
++ SAL STAURANT7 ZTURAN
++ SAL STEAK- ZTE
++ SAL STRAF^^ ZTRAF
++ SAL ST'S$ Z
++ SAL STST-- _
++ SAL STS(ACEHIOU)-- ZT
++ SAL ST(SZ) Z
++ SAL STYN(AE)-$ ZTIN
++ SAL ST ZT
++ SAL SZE(NPT)-^ ZE
++ SAL SZI(ELN)-^ ZI
++ SAL SZCZ< Z
++ SAL SZT< ZT
++ SAL SZ<3 Z
++ SAL S Z
++ SAL T'S3$ Z
++ SAL TCH Z
++ SAL TEAT-^ TEA
++ SAL TE(LMNRST)-3^ TE
++ SAL TH< T
++ SAL TIC$ TIZ
++ SAL TOAS-^ TU
++ SAL TOILET- TULE
++ SAL TOIN- TUA
++ SAL TRAINI- TREN
++ SAL TSCH Z
++ SAL TSH Z
++ SAL TST ZT
++ SAL T(S) Z
++ SAL TT(SZ)--< _
++ SAL TT9 T
++ SAL TZ- _
++ SAL T T
++ SAL UEBER^^ IPA
++ SAL UE2 I
++ SAL UIE$ I
++ SAL UM^^ UN
++ SAL UNTERE-- UNTE
++ SAL UNTER^^ UNTA
++ SAL UNVER^^ UNFA
++ SAL UN^^ UN
++ SAL UTI(AOU)- UZI
++ SAL U U
++ SAL VACL-^ FAZ
++ SAL VAC$ FAZ
++ SAL VEDD-^ FE
++ SAL VEREIN FAEIN
++ SAL VERSEN^ FAZN
++ SAL VER^^ FA
++ SAL VER FA
++ SAL VET(HT)-^ FET
++ SAL VETTE$ FET
++ SAL VIC$ FIZ
++ SAL VIEL FIL
++ SAL VIEW FIU
++ SAL VOR^^ FUR
++ SAL VY9^ FI
++ SAL V< F
++ SAL WE(LMNRST)-3^ FE
++ SAL WIC$ FIZ
++ SAL WIEDER^^ FITA
++ SAL WY9^ FI
++ SAL W F
++ SAL XE(LMNRST)-3^ XE
++ SAL X<^ Z
++ SAL X(CSZ) X
++ SAL XTS(CH)-- XT
++ SAL XT(SZ) Z
++ SAL X X
++ SAL YE(LMNRST)-3^ IE
++ SAL YE-3 I
++ SAL YOR(GK)^$ IRK
++ SAL Y(AOU)-<7 I
++ SAL YVES^$ IF
++ SAL YVONNE^$ IFUN
++ SAL Y I
++ SAL ZC(AOU)- ZK
++ SAL ZE(LMNRST)-3^ ZE
++ SAL ZH< Z
++ SAL ZS(CHT)-- _
++ SAL ZS Z
++ SAL ZUERST ZUERZT
++ SAL ZURCK^^ ZURIK
++ SAL ZUVER^^ ZUFA # x
++ SAL Z Z
+*** de_19.orig.dic 2019-01-19 18:45:26.468520305 +0100
+--- de_19.dic 2019-01-19 18:45:26.476520252 +0100
+***************
+*** 76258,76259 ****
+ zynismusfrdernd/A
+! zzgl
+\ No newline at end of file
+--- 76258,76260 ----
+ zynismusfrdernd/A
+! zzgl
+!
diff --git a/runtime/spell/de/main.aap b/runtime/spell/de/main.aap
new file mode 100644
index 0000000..d0c378c
--- /dev/null
+++ b/runtime/spell/de/main.aap
@@ -0,0 +1,102 @@
+# Aap recipe for German Vim spell files.
+#
+# Since there is a big discussion about whether to use the old or the new
+# spelling rules, both have been included.
+# "de": new German spelling
+# "de_de": old and new German spelling
+# "de_19": old German spelling
+# "de_20": new German spelling
+# "de_AT": Austrian spelling
+# "de_CH": Swiss spelling
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+REGIONS = DE 19 20 AT CH
+DE_REGIONS = de_$*REGIONS
+
+SPELLDIR = ..
+FILES = de_$*(REGIONS).aff de_$*(REGIONS).dic
+
+# The de_20 is the same as de_DE dictionary and only uses the
+# new revised orthography
+FILE_DE_AFF = de_DE_frami.aff
+FILE_DE_DIC = de_DE_frami.dic
+FILE_20_AFF = de_DE_frami.aff
+FILE_20_DIC = de_DE_frami.dic
+FILE_AT_AFF = de_AT_frami.aff
+FILE_AT_DIC = de_AT_frami.dic
+FILE_CH_AFF = de_CH_frami.aff
+FILE_CH_DIC = de_CH_frami.dic
+#ZIPFILES = $ZIPFILE_DE $ZIPFILE_20 $ZIPFILE_AT $ZIPFILE_CH
+ZIPFILE_19 = de_OLDSPELL.zip # unmaintained
+DICT_FILES = $FILE_20_AFF $FILE_20_DIC $FILE_AT_AFF $FILE_AT_DIC $FILE_CH_AFF $FILE_CH_DIC
+
+# frami files adjusted for Vim are found here
+YAMAGIDIR = https://raw.githubusercontent.com/Yamagi/vim-german-dictionaries/master
+
+READMES = README.md
+:attr {fetch = $YAMAGIDIR/%file%} $READMES
+
+all: $SPELLDIR/de.latin1.spl $SPELLDIR/de.utf-8.spl ../README_de.txt
+
+$SPELLDIR/de.latin1.spl : $FILES
+ :sys env LANG=de_DE.ISO-8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/de $DE_REGIONS" -c q
+
+$SPELLDIR/de.utf-8.spl : $FILES
+ :sys env LANG=de_DE.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/de $DE_REGIONS" -c q
+
+../README_de.txt: $READMES
+ :fetch $READMES
+ :print README.md >! $target
+ :cat README.md >> $target
+
+#
+# Fetching the files from the LibreOffices github repository.
+# The OLDSPELL file comes from elsewhere
+#
+DEDIR = http://www.j3e.de/myspell
+:attr {fetch = $YAMAGIDIR/src/%file%} $DICT_FILES
+:attr {fetch = $DEDIR/%file%} $ZIPFILE_19
+
+de_DE.aff de_DE.dic de_20.aff de_20.dic: {buildcheck=}
+ :fetch $FILE_DE_AFF
+ :fetch $FILE_DE_DIC
+ :move de_DE_frami.aff de_DE.aff
+ :move de_DE_frami.dic de_DE.dic
+ :copy de_DE.aff de_20.aff
+ :copy de_DE.dic de_20.dic
+
+de_19.aff de_19.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch $ZIPFILE_19
+ :sys $UNZIP $ZIPFILE_19
+ :delete $ZIPFILE_19
+ :move de_OLDSPELL.aff de_19.aff
+ :move de_OLDSPELL.dic de_19.dic
+ @if not os.path.exists('de_19.orig.aff'):
+ :copy de_19.aff de_19.orig.aff
+ @if not os.path.exists('de_19.orig.dic'):
+ :copy de_19.dic de_19.orig.dic
+ @if os.path.exists('de_19.diff'):
+ :sys patch <de_19.diff
+
+de_AT.aff de_AT.dic: {buildcheck=}
+ :fetch $FILE_AT_AFF
+ :fetch $FILE_AT_DIC
+ :move $FILE_AT_AFF de_AT.aff
+ :move $FILE_AT_DIC de_AT.dic
+
+de_CH.aff de_CH.dic: {buildcheck=}
+ :fetch $FILE_CH_AFF
+ :fetch $FILE_CH_DIC
+ :move $FILE_CH_AFF de_CH.aff
+ :move $FILE_CH_DIC de_CH.dic
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/el/el_GR.diff b/runtime/spell/el/el_GR.diff
new file mode 100644
index 0000000..4d74ec6
--- /dev/null
+++ b/runtime/spell/el/el_GR.diff
@@ -0,0 +1,204 @@
+*** el_GR.orig.aff Tue Aug 16 18:02:27 2005
+--- el_GR.aff Thu Sep 29 22:28:12 2005
+***************
+*** 572,574 ****
+ SFX J . # >
+!
+ SFX K Y 4
+--- 572,574 ----
+ SFX J . # >
+!
+ SFX K Y 4
+***************
+*** 619,621 ****
+
+!
+ SFX R Y 4
+--- 619,621 ----
+
+!
+ SFX R Y 4
+***************
+*** 626,628 ****
+
+!
+ SFX S Y 4
+--- 626,628 ----
+
+!
+ SFX S Y 4
+***************
+*** 646,648 ****
+
+!
+ SFX V Y 5
+--- 646,648 ----
+
+!
+ SFX V Y 5
+***************
+*** 686,688 ****
+
+!
+ SFX b Y 4
+--- 686,688 ----
+
+!
+ SFX b Y 4
+***************
+*** 758 ****
+--- 758,911 ----
+ SFX n . # >
++
++ # sound folding from Aspell
++ # version 0.0 03/14/2002
++ # 03/14/2002 Evripidis Papakostas <evris@source.gr>
++
++ # all the following double letters are pronounced as one
++ SAL - _
++ SAL
++ SAL
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++ SAL - _
++ SAL
++
++ # alpha + (ypsilon or ypsilon tonos) becomes alpha + beta
++ SAL <
++ SAL --
++ SAL --
++ SAL --
++ SAL ()-
++ SAL
++ SAL (ն)-
++
++ # alpha + (ypsilon or ypsilon tonos) becomes alpha + phi
++ SAL
++ SAL --
++ SAL ()-
++ SAL -
++ SAL -
++
++ # alpha + (iota or iota tonos) becomes epsilon
++ SAL (ɺ)
++
++ # alpha is alpha
++ SAL
++
++ # epsilon + (ypsilon or ypsilon tonos) becomes epsilon + vita
++ SAL ž<
++ SAL --
++ SAL --
++ SAL --
++ SAL ()-
++ SAL
++ SAL (ն)-
++
++ # epsilon + (ypsilon or ypsilon tonos) becomes epsilon + phi
++ SAL
++ SAL -- # GUESSED!
++ SAL ()-
++ SAL -
++ SAL -
++
++ # epsilon + (iota or iota tonos) becomes iota
++ SAL (ɺ)
++
++ # epsilon is epsilon
++ SAL
++
++
++ # omikron + (iota or iota tonos) becomes iota
++ SAL (ɺ)
++
++ # omikron + (ypsilon or ypsilon tonos) becomes u
++ SAL (վ)
++
++ # omikron is omikron
++ SAL
++
++ # wmega becomes omikron
++ SAL
++
++ # ita becomes iota
++ SAL
++
++ # ypsilon + iota becomes iota
++ SAL
++
++ # ypsilon becomes iota
++ SAL
++
++ # iota is iota
++ SAL
++
++ # double ksi becomes ksi
++ SAL - _
++
++ # ksi + sigma becomes ksi
++ SAL
++
++ # ksi is ksi
++ SAL
++
++ # psi + psi becomes psi
++ SAL - _
++
++ # psi + sigma becomes psi
++ SAL
++
++ # psi is psi
++ SAL
++
++
++ # iota dialitika becomes iota
++ SAL
++
++ # ypsilon dialitika becomes I
++ SAL
++
++ # alpha tonos becomes alpha
++ SAL
++
++ # omikron tonos becomes omikron
++ SAL
++
++ # iota tonos becomes iota
++ SAL
++
++ # epsilon tonos becomes epsilon
++ SAL
++
++ # ypsilon tonos becomes ypsilon
++ SAL
++
++ # wmega tonos becomes omikron
++ SAL
++
++ # ita tonos becomes iota
++ SAL
diff --git a/runtime/spell/el/main.aap b/runtime/spell/el/main.aap
new file mode 100644
index 0000000..51fa0d3
--- /dev/null
+++ b/runtime/spell/el/main.aap
@@ -0,0 +1,78 @@
+# Aap recipe for Greek Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = el_GR.aff el_GR.dic
+
+all: $SPELLDIR/el.iso-8859-7.spl $SPELLDIR/el.utf-8.spl ../README_el.txt
+
+$SPELLDIR/el.iso-8859-7.spl : $FILES
+ :sys env LANG=el_GR.ISO8859-7
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/el el_GR" -c q
+
+$SPELLDIR/el.utf-8.spl : $FILES
+ :sys env LANG=el_GR.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/el el_GR" -c q
+
+../README_el.txt : README_el_GR.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} el_GR.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+el_GR.aff el_GR.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch el_GR.zip
+ :sys $UNZIP el_GR.zip
+ :delete el_GR.zip
+ @if not os.path.exists('el_GR.orig.aff'):
+ :copy el_GR.aff el_GR.orig.aff
+ @if not os.path.exists('el_GR.orig.dic'):
+ :copy el_GR.dic el_GR.orig.dic
+ @if os.path.exists('el_GR.diff'):
+ :sys patch <el_GR.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 el_GR.orig.aff el_GR.aff >el_GR.diff
+ :sys {force} diff -a -C 1 el_GR.orig.dic el_GR.dic >>el_GR.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch el_GR.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../el_GR.zip
+ :sys {force} diff ../el_GR.orig.aff el_GR.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy el_GR.aff ../el_GR.new.aff
+ :sys {force} diff ../el_GR.orig.dic el_GR.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy el_GR.dic ../el_GR.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete el_GR.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/en.ascii.spl b/runtime/spell/en.ascii.spl
new file mode 100644
index 0000000..a303b75
--- /dev/null
+++ b/runtime/spell/en.ascii.spl
Binary files differ
diff --git a/runtime/spell/en.ascii.sug b/runtime/spell/en.ascii.sug
new file mode 100644
index 0000000..22d27e2
--- /dev/null
+++ b/runtime/spell/en.ascii.sug
Binary files differ
diff --git a/runtime/spell/en.latin1.spl b/runtime/spell/en.latin1.spl
new file mode 100644
index 0000000..5ee18bd
--- /dev/null
+++ b/runtime/spell/en.latin1.spl
Binary files differ
diff --git a/runtime/spell/en.latin1.sug b/runtime/spell/en.latin1.sug
new file mode 100644
index 0000000..4a883be
--- /dev/null
+++ b/runtime/spell/en.latin1.sug
Binary files differ
diff --git a/runtime/spell/en.utf-8.spl b/runtime/spell/en.utf-8.spl
new file mode 100644
index 0000000..e4b1e1c
--- /dev/null
+++ b/runtime/spell/en.utf-8.spl
Binary files differ
diff --git a/runtime/spell/en.utf-8.sug b/runtime/spell/en.utf-8.sug
new file mode 100644
index 0000000..103ebfc
--- /dev/null
+++ b/runtime/spell/en.utf-8.sug
Binary files differ
diff --git a/runtime/spell/en/en_AU.diff b/runtime/spell/en/en_AU.diff
new file mode 100644
index 0000000..96a52a3
--- /dev/null
+++ b/runtime/spell/en/en_AU.diff
@@ -0,0 +1,2713 @@
+*** en_AU.orig.aff 2010-05-15 13:03:47.000000000 +0200
+--- en_AU.aff 2016-01-09 13:15:38.426627871 +0100
+***************
+*** 7,9 ****
+ SET ISO8859-1
+! TRY esianrtolcdugmphbyfvkw-'.zqjxSNRTLCGDMPHBEAUYOFIVKWZQJX
+ REP 24
+--- 7,147 ----
+ SET ISO8859-1
+! TRY esianrtolcdugmphbyfvkw-'.zqjxSNRTLCGDMPHBEAUYOFIVKWZQJX
+!
+! FOL
+! LOW
+! UPP
+!
+! MIDWORD '
+!
+! RARE ?
+! BAD %
+!
+! MAP 9
+! MAP a
+! MAP e
+! MAP i
+! MAP o
+! MAP u
+! MAP n
+! MAP c
+! MAP y
+! MAP s
+!
+! # This comes from Aspell en_phonet.dat, version 1.1, 2000-01-07
+!
+! 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 ^ *
+! SAL ^ *
+! 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 < 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
+!
+! # When soundfolding "th" is turned into "@". When this is mistyped as "ht" it
+! # soundfolds to "ht". This difference is too big, thus use REP items to lower
+! # the score.
+! REPSAL 2
+! REPSAL ht @
+! REPSAL @ ht
+!
+ REP 24
+***************
+*** 33,53 ****
+ REP ght t
+ PFX A Y 2
+! PFX A 0 re [^e]
+! PFX A 0 re- e
+ PFX a Y 1
+! PFX a 0 mis .
+ PFX I Y 4
+! PFX I 0 il l
+! PFX I 0 ir r
+! PFX I 0 im [bmp]
+! PFX I 0 in [^blmpr]
+ PFX c Y 1
+! PFX c 0 over .
+ PFX U Y 1
+! PFX U 0 un .
+ PFX C Y 2
+! PFX C 0 de [^e]
+! PFX C 0 de- e
+ PFX E Y 1
+! PFX E 0 dis .
+ PFX F Y 5
+--- 171,208 ----
+ REP ght t
++
++ # This is disabled, because if Vim does not support NOCOMPOUNDSUGS giving
++ # suggestions is extremely slow.
++ ## ordinal numbers
++ #COMPOUNDMIN 1
++ ## only in compounds: 1th, 2th, 3th
++ #ONLYINCOMPOUND ,
++ ## compound rules:
++ ## 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
++ ## 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
++ #COMPOUNDRULE 2
++ #COMPOUNDRULE (*:)
++ #COMPOUNDRULE (*{}
++ #NOCOMPOUNDSUGS
++
++ # WORDCHARS 0123456789
++
+ PFX A Y 2
+! PFX A 0 re [^e]
+! PFX A 0 re- e
+ PFX a Y 1
+! PFX a 0 mis .
+ PFX I Y 4
+! PFX I 0 il l
+! PFX I 0 ir r
+! PFX I 0 im [bmp]
+! PFX I 0 in [^blmpr]
+ PFX c Y 1
+! PFX c 0 over .
+ PFX U Y 1
+! PFX U 0 un .
+ PFX C Y 2
+! PFX C 0 de [^e]
+! PFX C 0 de- e
+ PFX E Y 1
+! PFX E 0 dis .
+ PFX F Y 5
+***************
+*** 57,451 ****
+ PFX F 0 col l
+! PFX F 0 con [^abehilmopru].
+ PFX K Y 1
+! PFX K 0 pre .
+ PFX e Y 1
+! PFX e 0 out .
+ PFX f Y 2
+! PFX f 0 under [^r]
+! PFX f 0 under- r
+ PFX O Y 1
+! PFX O 0 non- .
+ PFX 4 Y 1
+! PFX 4 0 trans .
+ SFX V Y 15
+! SFX V 0 tive [aio]
+! SFX V b ptive b
+! SFX V d sive d
+! SFX V be ptive be
+! SFX V e tive ce
+! SFX V de sive de
+! SFX V ke cative ke
+! SFX V e ptive me
+! SFX V e ive [st]e
+! SFX V e ative [^bcdkmst]e
+! SFX V 0 lative [aeiou]l
+! SFX V 0 ative [^aeiou]l
+! SFX V 0 ive [st]
+! SFX V y icative y
+! SFX V 0 ative [^abdeilosty]
+ SFX v Y 15
+! SFX v 0 tively [aio]
+! SFX v b ptively b
+! SFX v d sively d
+! SFX v be ptively be
+! SFX v e tively ce
+! SFX v de sively de
+! SFX v ke catively ke
+! SFX v e ptively me
+! SFX v e ively [st]e
+! SFX v e atively [^bcdkmst]e
+! SFX v 0 latively [aeiou]l
+! SFX v 0 atively [^aeiou]l
+! SFX v 0 ively [st]
+! SFX v y icatively y
+! SFX v 0 atively [^abdeilosty]
+ SFX u Y 15
+! SFX u 0 tiveness [aio]
+! SFX u b ptiveness b
+! SFX u d siveness d
+! SFX u be ptiveness be
+! SFX u e tiveness ce
+! SFX u de siveness de
+! SFX u ke cativeness ke
+! SFX u e ptiveness me
+! SFX u e iveness [st]e
+! SFX u e ativeness [^bcdkmst]e
+! SFX u 0 lativeness [aeiou]l
+! SFX u 0 ativeness [^aeiou]l
+! SFX u 0 iveness [st]
+! SFX u y icativeness y
+! SFX u 0 ativeness [^abdeilosty]
+ SFX N Y 26
+! SFX N b ption b
+! SFX N d sion d
+! SFX N be ption be
+! SFX N e tion ce
+! SFX N de sion de
+! SFX N ke cation ke
+! SFX N e ption ume
+! SFX N e mation [^u]me
+! SFX N e ion [^o]se
+! SFX N e ition ose
+! SFX N e ation [iou]te
+! SFX N e ion [^iou]te
+! SFX N e ation [^bcdkmst]e
+! SFX N el ulsion el
+! SFX N 0 lation [aiou]l
+! SFX N 0 ation [^aeiou]l
+! SFX N 0 mation [aeiou]m
+! SFX N 0 ation [^aeiou]m
+! SFX N er ration er
+! SFX N 0 ation [^e]r
+! SFX N 0 ion [sx]
+! SFX N t ssion mit
+! SFX N 0 ion [^m]it
+! SFX N 0 ation [^i]t
+! SFX N y ication y
+! SFX N 0 ation [^bdelmrstxy]
+ SFX n Y 28
+! SFX n 0 tion a
+! SFX n e tion ce
+! SFX n ke cation ke
+! SFX n e ation [iou]te
+! SFX n e ion [^iou]te
+! SFX n e ation [^ckt]e
+! SFX n el ulsion el
+! SFX n 0 lation [aiou]l
+! SFX n 0 ation [^aeiou]l
+! SFX n er ration er
+! SFX n 0 ation [^e]r
+! SFX n y ation py
+! SFX n y ication [^p]y
+! SFX n 0 ation [^aelry]
+! SFX n 0 tions a
+! SFX n e tions ce
+! SFX n ke cations ke
+! SFX n e ations [iou]te
+! SFX n e ions [^iou]te
+! SFX n e ations [^ckt]e
+! SFX n el ulsions el
+! SFX n 0 lations [aiou]l
+! SFX n 0 ations [^aeiou]l
+! SFX n er rations er
+! SFX n 0 ations [^e]r
+! SFX n y ations py
+! SFX n y ications [^p]y
+! SFX n 0 ations [^aelry]
+ SFX X Y 26
+! SFX X b ptions b
+! SFX X d sions d
+! SFX X be ptions be
+! SFX X e tions ce
+! SFX X ke cations ke
+! SFX X de sions de
+! SFX X e ptions ume
+! SFX X e mations [^u]me
+! SFX X e ions [^o]se
+! SFX X e itions ose
+! SFX X e ations [iou]te
+! SFX X e ions [^iou]te
+! SFX X e ations [^bcdkmst]e
+! SFX X el ulsions el
+! SFX X 0 lations [aiou]l
+! SFX X 0 ations [^aeiou]l
+! SFX X 0 mations [aeiou]m
+! SFX X 0 ations [^aeiou]m
+! SFX X er rations er
+! SFX X 0 ations [^e]r
+! SFX X 0 ions [sx]
+! SFX X t ssions mit
+! SFX X 0 ions [^m]it
+! SFX X 0 ations [^i]t
+! SFX X y ications y
+! SFX X 0 ations [^bdelmrstxy]
+ SFX x Y 40
+! SFX x b ptional b
+! SFX x d sional d
+! SFX x be ptional be
+! SFX x e tional ce
+! SFX x ke cational ke
+! SFX x de sional de
+! SFX x e ional [^o]se
+! SFX x e itional ose
+! SFX x e ional te
+! SFX x e ational [^bcdkst]e
+! SFX x el ulsional el
+! SFX x 0 lational [aiou]l
+! SFX x 0 ational [^aeiou]l
+! SFX x er rational er
+! SFX x 0 ational [^e]r
+! SFX x 0 ional [sx]
+! SFX x 0 ional [^n]t
+! SFX x 0 ational nt
+! SFX x y icational y
+! SFX x 0 ational [^bdelrstxy]
+! SFX x b ptionally b
+! SFX x d sionally d
+! SFX x be ptionally be
+! SFX x e tionally ce
+! SFX x ke cationally ke
+! SFX x de sionally de
+! SFX x e ionally [^o]se
+! SFX x e itionally ose
+! SFX x e ionally te
+! SFX x e ationally [^bcdkst]e
+! SFX x el ulsionally el
+! SFX x 0 lationally [aiou]l
+! SFX x 0 ationally [^aeiou]l
+! SFX x er rationally er
+! SFX x 0 ationally [^e]r
+! SFX x 0 ionally [sx]
+! SFX x 0 ionally [^n]t
+! SFX x 0 ationally nt
+! SFX x y icationally y
+! SFX x 0 ationally [^bdelrstxy]
+ SFX H N 13
+! SFX H y ieth y
+! SFX H ree ird ree
+! SFX H ve fth ve
+! SFX H e th [^ev]e
+! SFX H 0 h t
+! SFX H 0 th [^ety]
+! SFX H y ieths y
+! SFX H ree irds ree
+! SFX H ve fths ve
+! SFX H e ths [^ev]e
+! SFX H 0 hs t
+! SFX H 0 ths [^ety]
+! SFX H 0 fold .
+ SFX Y Y 9
+! SFX Y 0 ally ic
+! SFX Y 0 ly [^i]c
+! SFX Y e y [^aeiou]le
+! SFX Y 0 ly [aeiou]le
+! SFX Y 0 ly [^l]e
+! SFX Y 0 y [^aeiou]l
+! SFX Y y ily [^aeiou]y
+! SFX Y 0 ly [aeiou][ly]
+! SFX Y 0 ly [^cely]
+ SFX G Y 24
+! SFX G e ing [^eioy]e
+! SFX G 0 ing [eoy]e
+! SFX G ie ying ie
+! SFX G 0 bing [^aeio][aeiou]b
+! SFX G 0 king [^aeio][aeiou]c
+! SFX G 0 ding [^aeio][aeiou]d
+! SFX G 0 fing [^aeio][aeiou]f
+! SFX G 0 ging [^aeio][aeiou]g
+! SFX G 0 king [^aeio][aeiou]k
+! SFX G 0 ling [^aeio][eiou]l
+! SFX G 0 ing [aeio][eiou]l
+! SFX G 0 ling [^aeo]al
+! SFX G 0 ing [aeo]al
+! SFX G 0 ming [^aeio][aeiou]m
+! SFX G 0 ning [^aeio][aeiou]n
+! SFX G 0 ping [^aeio][aeiou]p
+! SFX G 0 ring [^aeio][aeiou]r
+! SFX G 0 sing [^aeio][aeiou]s
+! SFX G 0 ting [^aeio][aeiou]t
+! SFX G 0 ving [^aeio][aeiou]v
+! SFX G 0 zing [^aeio][aeiou]z
+! SFX G 0 ing [aeio][aeiou][bcdfgkmnprstvz]
+! SFX G 0 ing [^aeiou][bcdfgklmnprstvz]
+! SFX G 0 ing [^ebcdfgklmnprstvz]
+ SFX J Y 25
+! SFX J e ings [^eioy]e
+! SFX J 0 ings [eoy]e
+! SFX J ie yings ie
+! SFX J 0 bings [^aeio][aeiou]b
+! SFX J 0 king [^aeio][aeiou]c
+! SFX J 0 dings [^aeio][aeiou]d
+! SFX J 0 fings [^aeio][aeiou]f
+! SFX J 0 gings [^aeio][aeiou]g
+! SFX J 0 kings [^aeio][aeiou]k
+! SFX J 0 lings [^aeio][eiou]l
+! SFX J 0 ings [aeio][eiou]l
+! SFX J 0 lings [^aeo]al
+! SFX J 0 ings [aeo]al
+! SFX J 0 mings [^aeio][aeiou]m
+! SFX J 0 nings [^aeio][aiou]n
+! SFX J 0 pings [^aeio][aeiou]p
+! SFX J 0 rings [^aeio][aiou]r
+! SFX J 0 sings [^aeio][aeiou]s
+! SFX J 0 tings [^aeio][aiou]t
+! SFX J 0 vings [^aeio][aeiou]v
+! SFX J 0 zings [^aeio][aeiou]z
+! SFX J 0 ings [^aeio]e[nrt]
+! SFX J 0 ings [aeio][aeiou][bcdfgkmnprstvz]
+! SFX J 0 ings [^aeiou][bcdfgklmnprstvz]
+! SFX J 0 ings [^ebcdfgklmnprstvz]
+ SFX k Y 8
+! SFX k e ingly [^eioy]e
+! SFX k 0 ingly [eoy]e
+! SFX k ie yingly ie
+! SFX k 0 kingly [^aeio][aeiou]c
+! SFX k 0 lingly [^aeio][aeiou]l
+! SFX k 0 ingly [aeio][aeiou][cl]
+! SFX k 0 ingly [^aeiou][cl]
+! SFX k 0 ingly [^ecl]
+ SFX D Y 25
+! SFX D 0 d [^e]e
+! SFX D e d ee
+! SFX D 0 bed [^aeio][aeiou]b
+! SFX D 0 ked [^aeio][aeiou]c
+! SFX D 0 ded [^aeio][aeiou]d
+! SFX D 0 fed [^aeio][aeiou]f
+! SFX D 0 ged [^aeio][aeiou]g
+! SFX D 0 ked [^aeio][aeiou]k
+! SFX D 0 led [^aeio][eiou]l
+! SFX D 0 ed [aeio][eiou]l
+! SFX D 0 led [^aeo]al
+! SFX D 0 ed [aeo]al
+! SFX D 0 med [^aeio][aeiou]m
+! SFX D 0 ned [^aeio][aeiou]n
+! SFX D 0 ped [^aeio][aeiou]p
+! SFX D 0 red [^aeio][aeiou]r
+! SFX D 0 sed [^aeio][aeiou]s
+! SFX D 0 ted [^aeio][aeiou]t
+! SFX D 0 ved [^aeio][aeiou]v
+! SFX D 0 zed [^aeio][aeiou]z
+! SFX D y ied [^aeiou]y
+! SFX D 0 ed [aeiou]y
+! SFX D 0 ed [aeio][aeiou][bcdfgkmnprstvz]
+! SFX D 0 ed [^aeiou][bcdfgklmnprstvz]
+! SFX D 0 ed [^ebcdfgklmnprstvyz]
+ SFX d Y 16
+! SFX d 0 d e
+! SFX d 0 ked [^aeio][aeiou]c
+! SFX d 0 led [^aeio][aeiou]l
+! SFX d y ied [^aeiou]y
+! SFX d 0 ed [aeiou]y
+! SFX d 0 ed [aeio][aeiou][cl]
+! SFX d 0 ed [^aeiou][cl]
+! SFX d 0 ed [^ecly]
+! SFX d e ing [^eioy]e
+! SFX d 0 ing [eoy]e
+! SFX d ie ying ie
+! SFX d 0 king [^aeio][aeiou]c
+! SFX d 0 ling [^aeio][aeiou]l
+! SFX d 0 ing [aeio][aeiou][cl]
+! SFX d 0 ing [^aeiou][cl]
+! SFX d 0 ing [^ecl]
+ SFX h Y 22
+! SFX h 0 dly e
+! SFX h 0 bedly [^aeio][aeiou]b
+! SFX h 0 kedly [^aeio][aeiou]c
+! SFX h 0 dedly [^aeio][aeiou]d
+! SFX h 0 fedly [^aeio][aeiou]f
+! SFX h 0 gedly [^aeio][aeiou]g
+! SFX h 0 kedly [^aeio][aeiou]k
+! SFX h 0 ledly [^aeio][aeiou]l
+! SFX h 0 medly [^aeio][aeiou]m
+! SFX h 0 nedly [^aeio][aiou]n
+! SFX h 0 pedly [^aeio][aeiou]p
+! SFX h 0 redly [^aeio][aiou]r
+! SFX h 0 sedly [^aeio][aeiou]s
+! SFX h 0 tedly [^aeio][aiou]t
+! SFX h 0 vedly [^aeio][aeiou]v
+! SFX h 0 zedly [^aeio][aeiou]z
+! SFX h 0 edly [^aeio]e[nrt]
+! SFX h y iedly [^aeiou]y
+! SFX h 0 edly [aeiou]y
+! SFX h 0 edly [aeio][aeiou][bcdfgklmnprstvz]
+! SFX h 0 edly [^aeiou][bcdfgklmnprstvz]
+! SFX h 0 edly [^ebcdfgklmnprstvyz]
+ SFX i Y 22
+! SFX i 0 dness e
+! SFX i 0 bedness [^aeio][aeiou]b
+! SFX i 0 kedness [^aeio][aeiou]c
+! SFX i 0 dedness [^aeio][aeiou]d
+! SFX i 0 fedness [^aeio][aeiou]f
+! SFX i 0 gedness [^aeio][aeiou]g
+! SFX i 0 kedness [^aeio][aeiou]k
+! SFX i 0 ledness [^aeio][aeiou]l
+! SFX i 0 medness [^aeio][aeiou]m
+! SFX i 0 nedness [^aeio][aiou]n
+! SFX i 0 pedness [^aeio][aeiou]p
+! SFX i 0 redness [^aeio][aiou]r
+! SFX i 0 sedness [^aeio][aeiou]s
+! SFX i 0 tedness [^aeio][aiou]t
+! SFX i 0 vedness [^aeio][aeiou]v
+! SFX i 0 zedness [^aeio][aeiou]z
+! SFX i 0 edness [^aeio]e[nrt]
+! SFX i y iedness [^aeiou]y
+! SFX i 0 edness [aeiou]y
+! SFX i 0 edness [aeio][aeiou][bcdfgklmnprstvz]
+! SFX i 0 edness [^aeiou][bcdfgklmnprstvz]
+! SFX i 0 edness [^ebcdfgklmnprstvyz]
+ SFX T Y 42
+! SFX T 0 r e
+ SFX T 0 st e
+! SFX T 0 ber [^aeio][aeiou]b
+ SFX T 0 best [^aeio][aeiou]b
+! SFX T 0 ker [^aeio][aeiou]c
+ SFX T 0 kest [^aeio][aeiou]c
+! SFX T 0 der [^aeio][aeiou]d
+ SFX T 0 dest [^aeio][aeiou]d
+! SFX T 0 fer [^aeio][aeiou]f
+ SFX T 0 fest [^aeio][aeiou]f
+! SFX T 0 ger [^aeio][aeiou]g
+ SFX T 0 gest [^aeio][aeiou]g
+! SFX T 0 ker [^aeio][aeiou]k
+ SFX T 0 kest [^aeio][aeiou]k
+! SFX T 0 ler [^aeio][aeiou]l
+ SFX T 0 lest [^aeio][aeiou]l
+! SFX T 0 mer [^aeio][aeiou]m
+ SFX T 0 mest [^aeio][aeiou]m
+! SFX T 0 ner [^aeio][aeiou]n
+ SFX T 0 nest [^aeio][aeiou]n
+! SFX T 0 per [^aeio][aeiou]p
+ SFX T 0 pest [^aeio][aeiou]p
+! SFX T 0 rer [^aeio][aeiou]r
+ SFX T 0 rest [^aeio][aeiou]r
+! SFX T 0 ser [^aeio][aeiou]s
+ SFX T 0 sest [^aeio][aeiou]s
+! SFX T 0 ter [^aeio][aeiou]t
+ SFX T 0 test [^aeio][aeiou]t
+! SFX T 0 ver [^aeio][aeiou]v
+ SFX T 0 vest [^aeio][aeiou]v
+! SFX T 0 zer [^aeio][aeiou]z
+ SFX T 0 zest [^aeio][aeiou]z
+! SFX T y ier [^aeiou]y
+ SFX T y iest [^aeiou]y
+! SFX T 0 er [aeiou]y
+ SFX T 0 est [aeiou]y
+--- 212,606 ----
+ PFX F 0 col l
+! PFX F 0 con [^abehilmopru].
+ PFX K Y 1
+! PFX K 0 pre .
+ PFX e Y 1
+! PFX e 0 out .
+ PFX f Y 2
+! PFX f 0 under [^r]
+! PFX f 0 under- r
+ PFX O Y 1
+! PFX O 0 non- .
+ PFX 4 Y 1
+! PFX 4 0 trans .
+ SFX V Y 15
+! SFX V 0 tive [aio]
+! SFX V b ptive b
+! SFX V d sive d
+! SFX V be ptive be
+! SFX V e tive ce
+! SFX V de sive de
+! SFX V ke cative ke
+! SFX V e ptive me
+! SFX V e ive [st]e
+! SFX V e ative [^bcdkmst]e
+! SFX V 0 lative [aeiou]l
+! SFX V 0 ative [^aeiou]l
+! SFX V 0 ive [st]
+! SFX V y icative y
+! SFX V 0 ative [^abdeilosty]
+ SFX v Y 15
+! SFX v 0 tively [aio]
+! SFX v b ptively b
+! SFX v d sively d
+! SFX v be ptively be
+! SFX v e tively ce
+! SFX v de sively de
+! SFX v ke catively ke
+! SFX v e ptively me
+! SFX v e ively [st]e
+! SFX v e atively [^bcdkmst]e
+! SFX v 0 latively [aeiou]l
+! SFX v 0 atively [^aeiou]l
+! SFX v 0 ively [st]
+! SFX v y icatively y
+! SFX v 0 atively [^abdeilosty]
+ SFX u Y 15
+! SFX u 0 tiveness [aio]
+! SFX u b ptiveness b
+! SFX u d siveness d
+! SFX u be ptiveness be
+! SFX u e tiveness ce
+! SFX u de siveness de
+! SFX u ke cativeness ke
+! SFX u e ptiveness me
+! SFX u e iveness [st]e
+! SFX u e ativeness [^bcdkmst]e
+! SFX u 0 lativeness [aeiou]l
+! SFX u 0 ativeness [^aeiou]l
+! SFX u 0 iveness [st]
+! SFX u y icativeness y
+! SFX u 0 ativeness [^abdeilosty]
+ SFX N Y 26
+! SFX N b ption b
+! SFX N d sion d
+! SFX N be ption be
+! SFX N e tion ce
+! SFX N de sion de
+! SFX N ke cation ke
+! SFX N e ption ume
+! SFX N e mation [^u]me
+! SFX N e ion [^o]se
+! SFX N e ition ose
+! SFX N e ation [iou]te
+! SFX N e ion [^iou]te
+! SFX N e ation [^bcdkmst]e
+! SFX N el ulsion el
+! SFX N 0 lation [aiou]l
+! SFX N 0 ation [^aeiou]l
+! SFX N 0 mation [aeiou]m
+! SFX N 0 ation [^aeiou]m
+! SFX N er ration er
+! SFX N 0 ation [^e]r
+! SFX N 0 ion [sx]
+! SFX N t ssion mit
+! SFX N 0 ion [^m]it
+! SFX N 0 ation [^i]t
+! SFX N y ication y
+! SFX N 0 ation [^bdelmrstxy]
+ SFX n Y 28
+! SFX n 0 tion a
+! SFX n e tion ce
+! SFX n ke cation ke
+! SFX n e ation [iou]te
+! SFX n e ion [^iou]te
+! SFX n e ation [^ckt]e
+! SFX n el ulsion el
+! SFX n 0 lation [aiou]l
+! SFX n 0 ation [^aeiou]l
+! SFX n er ration er
+! SFX n 0 ation [^e]r
+! SFX n y ation py
+! SFX n y ication [^p]y
+! SFX n 0 ation [^aelry]
+! SFX n 0 tions a
+! SFX n e tions ce
+! SFX n ke cations ke
+! SFX n e ations [iou]te
+! SFX n e ions [^iou]te
+! SFX n e ations [^ckt]e
+! SFX n el ulsions el
+! SFX n 0 lations [aiou]l
+! SFX n 0 ations [^aeiou]l
+! SFX n er rations er
+! SFX n 0 ations [^e]r
+! SFX n y ations py
+! SFX n y ications [^p]y
+! SFX n 0 ations [^aelry]
+ SFX X Y 26
+! SFX X b ptions b
+! SFX X d sions d
+! SFX X be ptions be
+! SFX X e tions ce
+! SFX X ke cations ke
+! SFX X de sions de
+! SFX X e ptions ume
+! SFX X e mations [^u]me
+! SFX X e ions [^o]se
+! SFX X e itions ose
+! SFX X e ations [iou]te
+! SFX X e ions [^iou]te
+! SFX X e ations [^bcdkmst]e
+! SFX X el ulsions el
+! SFX X 0 lations [aiou]l
+! SFX X 0 ations [^aeiou]l
+! SFX X 0 mations [aeiou]m
+! SFX X 0 ations [^aeiou]m
+! SFX X er rations er
+! SFX X 0 ations [^e]r
+! SFX X 0 ions [sx]
+! SFX X t ssions mit
+! SFX X 0 ions [^m]it
+! SFX X 0 ations [^i]t
+! SFX X y ications y
+! SFX X 0 ations [^bdelmrstxy]
+ SFX x Y 40
+! SFX x b ptional b
+! SFX x d sional d
+! SFX x be ptional be
+! SFX x e tional ce
+! SFX x ke cational ke
+! SFX x de sional de
+! SFX x e ional [^o]se
+! SFX x e itional ose
+! SFX x e ional te
+! SFX x e ational [^bcdkst]e
+! SFX x el ulsional el
+! SFX x 0 lational [aiou]l
+! SFX x 0 ational [^aeiou]l
+! SFX x er rational er
+! SFX x 0 ational [^e]r
+! SFX x 0 ional [sx]
+! SFX x 0 ional [^n]t
+! SFX x 0 ational nt
+! SFX x y icational y
+! SFX x 0 ational [^bdelrstxy]
+! SFX x b ptionally b
+! SFX x d sionally d
+! SFX x be ptionally be
+! SFX x e tionally ce
+! SFX x ke cationally ke
+! SFX x de sionally de
+! SFX x e ionally [^o]se
+! SFX x e itionally ose
+! SFX x e ionally te
+! SFX x e ationally [^bcdkst]e
+! SFX x el ulsionally el
+! SFX x 0 lationally [aiou]l
+! SFX x 0 ationally [^aeiou]l
+! SFX x er rationally er
+! SFX x 0 ationally [^e]r
+! SFX x 0 ionally [sx]
+! SFX x 0 ionally [^n]t
+! SFX x 0 ationally nt
+! SFX x y icationally y
+! SFX x 0 ationally [^bdelrstxy]
+ SFX H N 13
+! SFX H y ieth y
+! SFX H ree ird ree
+! SFX H ve fth ve
+! SFX H e th [^ev]e
+! SFX H 0 h t
+! SFX H 0 th [^ety]
+! SFX H y ieths y
+! SFX H ree irds ree
+! SFX H ve fths ve
+! SFX H e ths [^ev]e
+! SFX H 0 hs t
+! SFX H 0 ths [^ety]
+! SFX H 0 fold .
+ SFX Y Y 9
+! SFX Y 0 ally ic
+! SFX Y 0 ly [^i]c
+! SFX Y e y [^aeiou]le
+! SFX Y 0 ly [aeiou]le
+! SFX Y 0 ly [^l]e
+! SFX Y 0 y [^aeiou]l
+! SFX Y y ily [^aeiou]y
+! SFX Y 0 ly [aeiou][ly]
+! SFX Y 0 ly [^cely]
+ SFX G Y 24
+! SFX G e ing [^eioy]e
+! SFX G 0 ing [eoy]e
+! SFX G ie ying ie
+! SFX G 0 bing [^aeio][aeiou]b
+! SFX G 0 king [^aeio][aeiou]c
+! SFX G 0 ding [^aeio][aeiou]d
+! SFX G 0 fing [^aeio][aeiou]f
+! SFX G 0 ging [^aeio][aeiou]g
+! SFX G 0 king [^aeio][aeiou]k
+! SFX G 0 ling [^aeio][eiou]l
+! SFX G 0 ing [aeio][eiou]l
+! SFX G 0 ling [^aeo]al
+! SFX G 0 ing [aeo]al
+! SFX G 0 ming [^aeio][aeiou]m
+! SFX G 0 ning [^aeio][aeiou]n
+! SFX G 0 ping [^aeio][aeiou]p
+! SFX G 0 ring [^aeio][aeiou]r
+! SFX G 0 sing [^aeio][aeiou]s
+! SFX G 0 ting [^aeio][aeiou]t
+! SFX G 0 ving [^aeio][aeiou]v
+! SFX G 0 zing [^aeio][aeiou]z
+! SFX G 0 ing [aeio][aeiou][bcdfgkmnprstvz]
+! SFX G 0 ing [^aeiou][bcdfgklmnprstvz]
+! SFX G 0 ing [^ebcdfgklmnprstvz]
+ SFX J Y 25
+! SFX J e ings [^eioy]e
+! SFX J 0 ings [eoy]e
+! SFX J ie yings ie
+! SFX J 0 bings [^aeio][aeiou]b
+! SFX J 0 king [^aeio][aeiou]c
+! SFX J 0 dings [^aeio][aeiou]d
+! SFX J 0 fings [^aeio][aeiou]f
+! SFX J 0 gings [^aeio][aeiou]g
+! SFX J 0 kings [^aeio][aeiou]k
+! SFX J 0 lings [^aeio][eiou]l
+! SFX J 0 ings [aeio][eiou]l
+! SFX J 0 lings [^aeo]al
+! SFX J 0 ings [aeo]al
+! SFX J 0 mings [^aeio][aeiou]m
+! SFX J 0 nings [^aeio][aiou]n
+! SFX J 0 pings [^aeio][aeiou]p
+! SFX J 0 rings [^aeio][aiou]r
+! SFX J 0 sings [^aeio][aeiou]s
+! SFX J 0 tings [^aeio][aiou]t
+! SFX J 0 vings [^aeio][aeiou]v
+! SFX J 0 zings [^aeio][aeiou]z
+! SFX J 0 ings [^aeio]e[nrt]
+! SFX J 0 ings [aeio][aeiou][bcdfgkmnprstvz]
+! SFX J 0 ings [^aeiou][bcdfgklmnprstvz]
+! SFX J 0 ings [^ebcdfgklmnprstvz]
+ SFX k Y 8
+! SFX k e ingly [^eioy]e
+! SFX k 0 ingly [eoy]e
+! SFX k ie yingly ie
+! SFX k 0 kingly [^aeio][aeiou]c
+! SFX k 0 lingly [^aeio][aeiou]l
+! SFX k 0 ingly [aeio][aeiou][cl]
+! SFX k 0 ingly [^aeiou][cl]
+! SFX k 0 ingly [^ecl]
+ SFX D Y 25
+! SFX D 0 d [^e]e
+! SFX D e d ee
+! SFX D 0 bed [^aeio][aeiou]b
+! SFX D 0 ked [^aeio][aeiou]c
+! SFX D 0 ded [^aeio][aeiou]d
+! SFX D 0 fed [^aeio][aeiou]f
+! SFX D 0 ged [^aeio][aeiou]g
+! SFX D 0 ked [^aeio][aeiou]k
+! SFX D 0 led [^aeio][eiou]l
+! SFX D 0 ed [aeio][eiou]l
+! SFX D 0 led [^aeo]al
+! SFX D 0 ed [aeo]al
+! SFX D 0 med [^aeio][aeiou]m
+! SFX D 0 ned [^aeio][aeiou]n
+! SFX D 0 ped [^aeio][aeiou]p
+! SFX D 0 red [^aeio][aeiou]r
+! SFX D 0 sed [^aeio][aeiou]s
+! SFX D 0 ted [^aeio][aeiou]t
+! SFX D 0 ved [^aeio][aeiou]v
+! SFX D 0 zed [^aeio][aeiou]z
+! SFX D y ied [^aeiou]y
+! SFX D 0 ed [aeiou]y
+! SFX D 0 ed [aeio][aeiou][bcdfgkmnprstvz]
+! SFX D 0 ed [^aeiou][bcdfgklmnprstvz]
+! SFX D 0 ed [^ebcdfgklmnprstvyz]
+ SFX d Y 16
+! SFX d 0 d e
+! SFX d 0 ked [^aeio][aeiou]c
+! SFX d 0 led [^aeio][aeiou]l
+! SFX d y ied [^aeiou]y
+! SFX d 0 ed [aeiou]y
+! SFX d 0 ed [aeio][aeiou][cl]
+! SFX d 0 ed [^aeiou][cl]
+! SFX d 0 ed [^ecly]
+! SFX d e ing [^eioy]e
+! SFX d 0 ing [eoy]e
+! SFX d ie ying ie
+! SFX d 0 king [^aeio][aeiou]c
+! SFX d 0 ling [^aeio][aeiou]l
+! SFX d 0 ing [aeio][aeiou][cl]
+! SFX d 0 ing [^aeiou][cl]
+! SFX d 0 ing [^ecl]
+ SFX h Y 22
+! SFX h 0 dly e
+! SFX h 0 bedly [^aeio][aeiou]b
+! SFX h 0 kedly [^aeio][aeiou]c
+! SFX h 0 dedly [^aeio][aeiou]d
+! SFX h 0 fedly [^aeio][aeiou]f
+! SFX h 0 gedly [^aeio][aeiou]g
+! SFX h 0 kedly [^aeio][aeiou]k
+! SFX h 0 ledly [^aeio][aeiou]l
+! SFX h 0 medly [^aeio][aeiou]m
+! SFX h 0 nedly [^aeio][aiou]n
+! SFX h 0 pedly [^aeio][aeiou]p
+! SFX h 0 redly [^aeio][aiou]r
+! SFX h 0 sedly [^aeio][aeiou]s
+! SFX h 0 tedly [^aeio][aiou]t
+! SFX h 0 vedly [^aeio][aeiou]v
+! SFX h 0 zedly [^aeio][aeiou]z
+! SFX h 0 edly [^aeio]e[nrt]
+! SFX h y iedly [^aeiou]y
+! SFX h 0 edly [aeiou]y
+! SFX h 0 edly [aeio][aeiou][bcdfgklmnprstvz]
+! SFX h 0 edly [^aeiou][bcdfgklmnprstvz]
+! SFX h 0 edly [^ebcdfgklmnprstvyz]
+ SFX i Y 22
+! SFX i 0 dness e
+! SFX i 0 bedness [^aeio][aeiou]b
+! SFX i 0 kedness [^aeio][aeiou]c
+! SFX i 0 dedness [^aeio][aeiou]d
+! SFX i 0 fedness [^aeio][aeiou]f
+! SFX i 0 gedness [^aeio][aeiou]g
+! SFX i 0 kedness [^aeio][aeiou]k
+! SFX i 0 ledness [^aeio][aeiou]l
+! SFX i 0 medness [^aeio][aeiou]m
+! SFX i 0 nedness [^aeio][aiou]n
+! SFX i 0 pedness [^aeio][aeiou]p
+! SFX i 0 redness [^aeio][aiou]r
+! SFX i 0 sedness [^aeio][aeiou]s
+! SFX i 0 tedness [^aeio][aiou]t
+! SFX i 0 vedness [^aeio][aeiou]v
+! SFX i 0 zedness [^aeio][aeiou]z
+! SFX i 0 edness [^aeio]e[nrt]
+! SFX i y iedness [^aeiou]y
+! SFX i 0 edness [aeiou]y
+! SFX i 0 edness [aeio][aeiou][bcdfgklmnprstvz]
+! SFX i 0 edness [^aeiou][bcdfgklmnprstvz]
+! SFX i 0 edness [^ebcdfgklmnprstvyz]
+ SFX T Y 42
+! SFX T 0 r e
+ SFX T 0 st e
+! SFX T 0 ber [^aeio][aeiou]b
+ SFX T 0 best [^aeio][aeiou]b
+! SFX T 0 ker [^aeio][aeiou]c
+ SFX T 0 kest [^aeio][aeiou]c
+! SFX T 0 der [^aeio][aeiou]d
+ SFX T 0 dest [^aeio][aeiou]d
+! SFX T 0 fer [^aeio][aeiou]f
+ SFX T 0 fest [^aeio][aeiou]f
+! SFX T 0 ger [^aeio][aeiou]g
+ SFX T 0 gest [^aeio][aeiou]g
+! SFX T 0 ker [^aeio][aeiou]k
+ SFX T 0 kest [^aeio][aeiou]k
+! SFX T 0 ler [^aeio][aeiou]l
+ SFX T 0 lest [^aeio][aeiou]l
+! SFX T 0 mer [^aeio][aeiou]m
+ SFX T 0 mest [^aeio][aeiou]m
+! SFX T 0 ner [^aeio][aeiou]n
+ SFX T 0 nest [^aeio][aeiou]n
+! SFX T 0 per [^aeio][aeiou]p
+ SFX T 0 pest [^aeio][aeiou]p
+! SFX T 0 rer [^aeio][aeiou]r
+ SFX T 0 rest [^aeio][aeiou]r
+! SFX T 0 ser [^aeio][aeiou]s
+ SFX T 0 sest [^aeio][aeiou]s
+! SFX T 0 ter [^aeio][aeiou]t
+ SFX T 0 test [^aeio][aeiou]t
+! SFX T 0 ver [^aeio][aeiou]v
+ SFX T 0 vest [^aeio][aeiou]v
+! SFX T 0 zer [^aeio][aeiou]z
+ SFX T 0 zest [^aeio][aeiou]z
+! SFX T y ier [^aeiou]y
+ SFX T y iest [^aeiou]y
+! SFX T 0 er [aeiou]y
+ SFX T 0 est [aeiou]y
+***************
+*** 458,1143 ****
+ SFX R Y 72
+! SFX R 0 r e
+! SFX R 0 rs e
+! SFX R 0 ber [^aeio][aeiou]b
+! SFX R 0 bers [^aeio][aeiou]b
+! SFX R 0 ker [^aeio][aeiou]c
+! SFX R 0 kers [^aeio][aeiou]c
+! SFX R 0 der [^aeio][aeiou]d
+! SFX R 0 ders [^aeio][aeiou]d
+! SFX R 0 fer [^aeio][aeiou]f
+! SFX R 0 fers [^aeio][aeiou]f
+! SFX R 0 ger [^aeio][aeiou]g
+! SFX R 0 gers [^aeio][aeiou]g
+! SFX R 0 ker [^aeio][aeiou]k
+! SFX R 0 kers [^aeio][aeiou]k
+! SFX R 0 ler [^aeio][eiou]l
+! SFX R 0 er [aeio][eiou]l
+! SFX R 0 ler [^aeo]al
+! SFX R 0 er [aeo]al
+! SFX R 0 lers [^aeio][eiou]l
+! SFX R 0 ers [aeio][eiou]l
+! SFX R 0 lers [^aeo]al
+! SFX R 0 ers [aeo]al
+! SFX R 0 mer [^aeio][aeiou]m
+! SFX R 0 mers [^aeio][aeiou]m
+! SFX R 0 ner [^aeio][aeiou]n
+! SFX R 0 ners [^aeio][aeiou]n
+! SFX R 0 per [^aeio][aeiou]p
+! SFX R 0 pers [^aeio][aeiou]p
+! SFX R 0 rer [^aeio][aeiou]r
+! SFX R 0 rers [^aeio][aeiou]r
+! SFX R 0 ser [^aeio][aeiou]s
+! SFX R 0 sers [^aeio][aeiou]s
+! SFX R 0 ter [^aeio][aeiou]t
+! SFX R 0 ters [^aeio][aeiou]t
+! SFX R 0 ver [^aeio][aeiou]v
+! SFX R 0 vers [^aeio][aeiou]v
+! SFX R 0 zer [^aeio][aeiou]z
+! SFX R 0 zers [^aeio][aeiou]z
+! SFX R y ier [^aeiou]y
+! SFX R y iers [^aeiou]y
+! SFX R 0 er [aeiou]y
+! SFX R 0 ers [aeiou]y
+! SFX R 0 er [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 ers [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 er [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 ers [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 er [^ebcdfgklmnprstvyz]
+! SFX R 0 ers [^ebcdfgklmnprstvyz]
+! SFX R 0 r's e
+! SFX R 0 ber's [^aeio][aeiou]b
+! SFX R 0 ker's [^aeio][aeiou]c
+! SFX R 0 der's [^aeio][aeiou]d
+! SFX R 0 fer's [^aeio][aeiou]f
+! SFX R 0 ger's [^aeio][aeiou]g
+! SFX R 0 ker's [^aeio][aeiou]k
+! SFX R 0 ler's [^aeio][eiou]l
+! SFX R 0 er's [aeio][eiou]l
+! SFX R 0 ler's [^aeo]al
+! SFX R 0 er's [aeo]al
+! SFX R 0 mer's [^aeio][aeiou]m
+! SFX R 0 ner's [^aeio][aeiou]n
+! SFX R 0 per's [^aeio][aeiou]p
+! SFX R 0 rer's [^aeio][aeiou]r
+! SFX R 0 ser's [^aeio][aeiou]s
+! SFX R 0 ter's [^aeio][aeiou]t
+! SFX R 0 ver's [^aeio][aeiou]v
+! SFX R 0 zer's [^aeio][aeiou]z
+! SFX R y ier's [^aeiou]y
+! SFX R 0 er's [aeiou]y
+! SFX R 0 er's [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 er's [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 er's [^ebcdfgklmnprstvyz]
+ SFX r Y 24
+! SFX r 0 r e
+! SFX r 0 ler [^aeio][aeiou]l
+! SFX r 0 ker [^aeio][aeiou]c
+! SFX r y ier [^aeiou]y
+! SFX r 0 er [aeiou]y
+! SFX r 0 er [aeio][aeiou][cl]
+! SFX r 0 er [^aeiou][cl]
+! SFX r 0 er [^ecly]
+! SFX r 0 rs e
+! SFX r 0 lers [^aeio][aeiou]l
+! SFX r 0 kers [^aeio][aeiou]c
+! SFX r y iers [^aeiou]y
+! SFX r 0 ers [aeiou]y
+! SFX r 0 ers [aeio][aeiou][cl]
+! SFX r 0 ers [^aeiou][cl]
+! SFX r 0 ers [^ecly]
+! SFX r 0 r's e
+! SFX r 0 ler's [^aeio][aeiou]l
+! SFX r 0 ker's [^aeio][aeiou]c
+! SFX r y ier's [^aeiou]y
+! SFX r 0 er's [aeiou]y
+! SFX r 0 er's [aeio][aeiou][cl]
+! SFX r 0 er's [^aeiou][cl]
+! SFX r 0 er's [^ecly]
+ SFX S Y 9
+! SFX S y ies [^aeiou]y
+! SFX S 0 s [aeiou]y
+! SFX S 0 es [sxz]
+! SFX S 0 es [cs]h
+! SFX S 0 s [^cs]h
+! SFX S 0 s [ae]u
+! SFX S 0 x [ae]u
+! SFX S 0 s [^ae]u
+ SFX S 0 s [^hsuxyz]
+ SFX P Y 6
+! SFX P y iness [^aeiou]y
+! SFX P 0 ness [aeiou]y
+! SFX P 0 ness [^y]
+! SFX P y iness's [^aeiou]y
+! SFX P 0 ness's [aeiou]y
+! SFX P 0 ness's [^y]
+ SFX m Y 20
+! SFX m 0 sman [bdknmt]
+! SFX m 0 sman [aeiou][bdklmnt]e
+! SFX m 0 man [^aeiou][bdklmnt]e
+! SFX m 0 man [^bdklmnt]e
+! SFX m 0 man [^bdeknmt]
+! SFX m 0 smen [bdknmt]
+! SFX m 0 smen [aeiou][bdklmnt]e
+! SFX m 0 men [^aeiou][bdklmnt]e
+! SFX m 0 men [^bdklmnt]e
+! SFX m 0 men [^bdeknmt]
+! SFX m 0 sman's [bdknmt]
+! SFX m 0 sman's [aeiou][bdklmnt]e
+! SFX m 0 man's [^aeiou][bdklmnt]e
+! SFX m 0 man's [^bdklmnt]e
+! SFX m 0 man's [^bdeknmt]
+! SFX m 0 smen's [bdknmt]
+! SFX m 0 smen's [aeiou][bdklmnt]e
+! SFX m 0 men's [^aeiou][bdklmnt]e
+! SFX m 0 men's [^bdklmnt]e
+! SFX m 0 men's [^bdeknmt]
+ SFX 5 Y 15
+! SFX 5 0 swoman [bdknmt]
+! SFX 5 0 swoman [aeiou][bdklmnt]e
+! SFX 5 0 woman [^aeiou][bdklmnt]e
+! SFX 5 0 woman [^bdklmnt]e
+! SFX 5 0 woman [^bdeknmt]
+! SFX 5 0 swomen [bdknmt]
+! SFX 5 0 swomen [aeiou][bdklmnt]e
+! SFX 5 0 women [^aeiou][bdklmnt]e
+! SFX 5 0 women [^bdklmnt]e
+! SFX 5 0 women [^bdeknmt]
+! SFX 5 0 swoman's [bdknmt]
+! SFX 5 0 swoman's [aeiou][bdklmnt]e
+! SFX 5 0 woman's [^aeiou][bdklmnt]e
+! SFX 5 0 woman's [^bdklmnt]e
+! SFX 5 0 woman's [^bdeknmt]
+ SFX 6 Y 3
+! SFX 6 y iful [^aeiou]y
+! SFX 6 0 ful [aeiou]y
+! SFX 6 0 ful [^y]
+ SFX j Y 3
+! SFX j y ifully [^aeiou]y
+! SFX j 0 fully [aeiou]y
+! SFX j 0 fully [^y]
+ SFX p Y 5
+! SFX p y iless [^aeiou]y
+! SFX p 0 less [aeiou]y
+! SFX p 0 ess ll
+! SFX p 0 less [^l]l
+! SFX p 0 less [^ly]
+ SFX Q Y 88
+! SFX Q 0 tise a
+! SFX Q e ise [^l]e
+! SFX Q le ilise [^aeiou]le
+! SFX Q e ise [aeiou]le
+! SFX Q um ise um
+! SFX Q 0 ise [^u]m
+! SFX Q s se is
+! SFX Q 0 ise [^i]s
+! SFX Q y ise [^aeiou]y
+! SFX Q 0 ise [aeiou]y
+! SFX Q 0 ise [^aemsy]
+! SFX Q 0 tises a
+! SFX Q e ises [^l]e
+! SFX Q le ilises [^aeiou]le
+! SFX Q e ises [aeiou]le
+! SFX Q um ises um
+! SFX Q 0 ises [^u]m
+! SFX Q s ses is
+! SFX Q 0 ises [^i]s
+! SFX Q y ises [^aeiou]y
+! SFX Q 0 ises [aeiou]y
+! SFX Q 0 ises [^aemsy]
+! SFX Q 0 tised a
+! SFX Q e ised [^l]e
+! SFX Q le ilised [^aeiou]le
+! SFX Q e ised [aeiou]le
+! SFX Q um ised um
+! SFX Q 0 ised [^u]m
+! SFX Q s sed is
+! SFX Q 0 ised [^i]s
+! SFX Q y ised [^aeiou]y
+! SFX Q 0 ised [aeiou]y
+! SFX Q 0 ised [^aemsy]
+! SFX Q 0 tising a
+! SFX Q e ising [^l]e
+! SFX Q le ilising [^aeiou]le
+! SFX Q e ising [aeiou]le
+! SFX Q um ising um
+! SFX Q 0 ising [^u]m
+! SFX Q s sing is
+! SFX Q 0 ising [^i]s
+! SFX Q y ising [^aeiou]y
+! SFX Q 0 ising [aeiou]y
+! SFX Q 0 ising [^aemsy]
+! SFX Q 0 tize a
+! SFX Q e ize [^l]e
+! SFX Q le ilize [^aeiou]le
+! SFX Q e ize [aeiou]le
+! SFX Q um ize um
+! SFX Q 0 ize [^u]m
+! SFX Q s ze is
+! SFX Q 0 ize [^i]s
+! SFX Q y ize [^aeiou]y
+! SFX Q 0 ize [aeiou]y
+! SFX Q 0 ize [^aemsy]
+! SFX Q 0 tizes a
+! SFX Q e izes [^l]e
+! SFX Q le ilizes [^aeiou]le
+! SFX Q e izes [aeiou]le
+! SFX Q um izes um
+! SFX Q 0 izes [^u]m
+! SFX Q s zes is
+! SFX Q 0 izes [^i]s
+! SFX Q y izes [^aeiou]y
+! SFX Q 0 izes [aeiou]y
+! SFX Q 0 izes [^aemsy]
+! SFX Q 0 tized a
+! SFX Q e ized [^l]e
+! SFX Q le ilized [^aeiou]le
+! SFX Q e ized [aeiou]le
+! SFX Q um ized um
+! SFX Q 0 ized [^u]m
+! SFX Q s zed is
+! SFX Q 0 ized [^i]s
+! SFX Q y ized [^aeiou]y
+! SFX Q 0 ized [aeiou]y
+! SFX Q 0 ized [^aemsy]
+! SFX Q 0 tizing a
+! SFX Q e izing [^l]e
+! SFX Q le ilizing [^aeiou]le
+! SFX Q e izing [aeiou]le
+! SFX Q um izing um
+! SFX Q 0 izing [^u]m
+! SFX Q s zing is
+! SFX Q 0 izing [^i]s
+! SFX Q y izing [^aeiou]y
+! SFX Q 0 izing [aeiou]y
+! SFX Q 0 izing [^aemsy]
+ SFX q Y 44
+! SFX q 0 tisation a
+! SFX q e isation [^l]e
+! SFX q le ilisation [^aeiou]le
+! SFX q e isation [aeiou]le
+! SFX q um isation um
+! SFX q 0 isation [^u]m
+! SFX q s sation is
+! SFX q 0 isation [^i]s
+! SFX q y isation [^aeiou]y
+! SFX q 0 isation [aeiou]y
+! SFX q 0 isation [^aemsy]
+! SFX q 0 tisations a
+! SFX q e isations [^l]e
+! SFX q le ilisations [^aeiou]le
+! SFX q e isations [aeiou]le
+! SFX q um isations um
+! SFX q 0 isations [^u]m
+! SFX q s sations is
+! SFX q 0 isations [^i]s
+! SFX q y isations [^aeiou]y
+! SFX q 0 isations [aeiou]y
+! SFX q 0 isations [^aemsy]
+! SFX q 0 tization a
+! SFX q e ization [^l]e
+! SFX q le ilization [^aeiou]le
+! SFX q e ization [aeiou]le
+! SFX q um ization um
+! SFX q 0 ization [^u]m
+! SFX q s zation is
+! SFX q 0 ization [^i]s
+! SFX q y ization [^aeiou]y
+! SFX q 0 ization [aeiou]y
+! SFX q 0 ization [^aemsy]
+! SFX q 0 tizations a
+! SFX q e izations [^l]e
+! SFX q le ilizations [^aeiou]le
+! SFX q e izations [aeiou]le
+! SFX q um izations um
+! SFX q 0 izations [^u]m
+! SFX q s zations is
+! SFX q 0 izations [^i]s
+! SFX q y izations [^aeiou]y
+! SFX q 0 izations [aeiou]y
+! SFX q 0 izations [^aemsy]
+ SFX s Y 66
+! SFX s 0 tiser a
+! SFX s e iser [^l]e
+! SFX s le iliser [^aeiou]le
+! SFX s e iser [aeiou]le
+! SFX s um iser um
+! SFX s 0 iser [^u]m
+! SFX s s ser is
+! SFX s 0 iser [^i]s
+! SFX s y iser [^aeiou]y
+! SFX s 0 iser [aeiou]y
+! SFX s 0 iser [^aemsy]
+! SFX s 0 tisers a
+! SFX s e isers [^l]e
+! SFX s le ilisers [^aeiou]le
+! SFX s e isers [aeiou]le
+! SFX s um isers um
+! SFX s 0 isers [^u]m
+! SFX s s sers is
+! SFX s 0 isers [^i]s
+! SFX s y isers [^aeiou]y
+! SFX s 0 isers [aeiou]y
+! SFX s 0 isers [^aemsy]
+! SFX s 0 tiser's a
+! SFX s e iser's [^l]e
+! SFX s le iliser's [^aeiou]le
+! SFX s e iser's [aeiou]le
+! SFX s um iser's um
+! SFX s 0 iser's [^u]m
+! SFX s s ser's is
+! SFX s 0 iser's [^i]s
+! SFX s y iser's [^aeiou]y
+! SFX s 0 iser's [aeiou]y
+! SFX s 0 iser's [^aemsy]
+! SFX s 0 tizer a
+! SFX s e izer [^l]e
+! SFX s le ilizer [^aeiou]le
+! SFX s e izer [aeiou]le
+! SFX s um izer um
+! SFX s 0 izer [^u]m
+! SFX s s zer is
+! SFX s 0 izer [^i]s
+! SFX s y izer [^aeiou]y
+! SFX s 0 izer [aeiou]y
+! SFX s 0 izer [^aemsy]
+! SFX s 0 tizers a
+! SFX s e izers [^l]e
+! SFX s le ilizers [^aeiou]le
+! SFX s e izers [aeiou]le
+! SFX s um izers um
+! SFX s 0 izers [^u]m
+! SFX s s zers is
+! SFX s 0 izers [^i]s
+! SFX s y izers [^aeiou]y
+! SFX s 0 izers [aeiou]y
+! SFX s 0 izers [^aemsy]
+! SFX s 0 tizer's a
+! SFX s e izer's [^l]e
+! SFX s le ilizer's [^aeiou]le
+! SFX s e izer's [aeiou]le
+! SFX s um izer's um
+! SFX s 0 izer's [^u]m
+! SFX s s zer's is
+! SFX s 0 izer's [^i]s
+! SFX s y izer's [^aeiou]y
+! SFX s 0 izer's [aeiou]y
+! SFX s 0 izer's [^aemsy]
+ SFX t Y 44
+! SFX t 0 tisable a
+! SFX t e isable [^l]e
+! SFX t le ilisable [^aeiou]le
+! SFX t e isable [aeiou]le
+! SFX t um isable um
+! SFX t 0 isable [^u]m
+! SFX t s sable is
+! SFX t 0 isable [^i]s
+! SFX t y isable [^aeiou]y
+! SFX t 0 isable [aeiou]y
+! SFX t 0 isable [^aemsy]
+! SFX t 0 tizable a
+! SFX t e izable [^l]e
+! SFX t le ilizable [^aeiou]le
+! SFX t e izable [aeiou]le
+! SFX t um izable um
+! SFX t 0 izable [^u]m
+! SFX t s zable is
+! SFX t 0 izable [^i]s
+! SFX t y izable [^aeiou]y
+! SFX t 0 izable [aeiou]y
+! SFX t 0 izable [^aemsy]
+! SFX t 0 tisability a
+! SFX t e isability [^l]e
+! SFX t le ilisability [^aeiou]le
+! SFX t e isability [aeiou]le
+! SFX t um isability um
+! SFX t 0 isability [^u]m
+! SFX t s sability is
+! SFX t 0 isability [^i]s
+! SFX t y isability [^aeiou]y
+! SFX t 0 isability [aeiou]y
+! SFX t 0 isability [^aemsy]
+! SFX t 0 tizability a
+! SFX t e izability [^l]e
+! SFX t le ilizability [^aeiou]le
+! SFX t e izability [aeiou]le
+! SFX t um izability um
+! SFX t 0 izability [^u]m
+! SFX t s zability is
+! SFX t 0 izability [^i]s
+! SFX t y izability [^aeiou]y
+! SFX t 0 izability [aeiou]y
+! SFX t 0 izability [^aemsy]
+ SFX M Y 1
+! SFX M 0 's .
+ SFX B Y 48
+! SFX B e able [^acegilotu]e
+! SFX B 0 able [acegilou]e
+! SFX B te ble ate
+! SFX B e able [^a]te
+! SFX B 0 bable [^aeio][aeiou]b
+! SFX B 0 kable [^aeio][aeiou]c
+! SFX B 0 dable [^aeio][aeiou]d
+! SFX B 0 fable [^aeio][aeiou]f
+! SFX B 0 gable [^aeio][aeiou]g
+! SFX B 0 kable [^aeio][aeiou]k
+! SFX B 0 lable [^aeio][aeiou]l
+! SFX B 0 mable [^aeio][aeiou]m
+! SFX B 0 nable [^aeio][aeiou]n
+! SFX B 0 pable [^aeio][aeiou]p
+! SFX B 0 rable [^aeio][aeiou]r
+! SFX B 0 sable [^aeio][aeiou]s
+! SFX B 0 table [^aeio][aeiou]t
+! SFX B 0 vable [^aeio][aeiou]v
+! SFX B 0 zable [^aeio][aeiou]z
+! SFX B 0 able [aeio][aeiou][bcdfgklmnprstvz]
+! SFX B 0 able [^aeiou][bcdfgklmnprstvz]
+! SFX B y iable [^aeiou]y
+! SFX B 0 able [aeiou]y
+! SFX B 0 able [^ebcdfgklmnprstvzy]
+! SFX B e ability [^acegilotu]e
+! SFX B 0 ability [acegilou]e
+! SFX B te bility ate
+! SFX B e ability [^a]te
+! SFX B 0 bability [^aeio][aeiou]b
+! SFX B 0 kability [^aeio][aeiou]c
+! SFX B 0 dability [^aeio][aeiou]d
+! SFX B 0 fability [^aeio][aeiou]f
+! SFX B 0 gability [^aeio][aeiou]g
+! SFX B 0 kability [^aeio][aeiou]k
+! SFX B 0 lability [^aeio][aeiou]l
+! SFX B 0 mability [^aeio][aeiou]m
+! SFX B 0 nability [^aeio][aeiou]n
+! SFX B 0 pability [^aeio][aeiou]p
+! SFX B 0 rability [^aeio][aeiou]r
+! SFX B 0 sability [^aeio][aeiou]s
+! SFX B 0 tability [^aeio][aeiou]t
+! SFX B 0 vability [^aeio][aeiou]v
+! SFX B 0 zability [^aeio][aeiou]z
+! SFX B 0 ability [aeio][aeiou][bcdfgklmnprstvz]
+! SFX B 0 ability [^aeiou][bcdfgklmnprstvz]
+! SFX B y iability [^aeiou]y
+! SFX B 0 ability [aeiou]y
+! SFX B 0 ability [^ebcdfgklmnprstvzy]
+ SFX 7 Y 9
+! SFX 7 e able [acegilou]e
+! SFX 7 0 able [^acegilou]e
+! SFX 7 0 kable [^aeio][aeiou]c
+! SFX 7 0 lable [^aeio][aeiou]l
+! SFX 7 0 able [aeio][aeiou][cl]
+! SFX 7 0 able [^aeiou][cl]
+! SFX 7 y iable [^aeiou]y
+! SFX 7 0 able [aeiou]y
+! SFX 7 0 able [^cely]
+ SFX g Y 9
+! SFX g e ability [^acegilou]e
+! SFX g 0 ability [acegilou]e
+! SFX g 0 kability [^aeio][aeiou]c
+! SFX g 0 lability [^aeio][aeiou]l
+! SFX g 0 ability [aeio][aeiou][cl]
+! SFX g 0 ability [^aeiou][cl]
+! SFX g y iability [^aeiou]y
+! SFX g 0 ability [aeiou]y
+! SFX g 0 ability [^cely]
+ SFX l Y 9
+! SFX l e ably [^acegilou]e
+! SFX l 0 ably [acegilou]e
+! SFX l 0 kably [^aeio][aeiou]c
+! SFX l 0 lably [^aeio][aeiou]l
+! SFX l 0 ably [aeio][aeiou][cl]
+! SFX l 0 ably [^aeiou][cl]
+! SFX l y iably [^aeiou]y
+! SFX l 0 ably [aeiou]y
+! SFX l 0 ably [^cely]
+ SFX b Y 3
+! SFX b e ible [^aeiou]e
+! SFX b 0 ible [aeiou]e
+! SFX b 0 ible [^e]
+ SFX L Y 12
+! SFX L 0 ament m
+! SFX L y iment [^aeiou]y
+! SFX L 0 ment [aeiou]y
+! SFX L 0 ment [^my]
+! SFX L 0 aments m
+! SFX L y iments [^aeiou]y
+! SFX L 0 ments [aeiou]y
+! SFX L 0 ments [^my]
+! SFX L 0 ament's m
+! SFX L y iment's [^aeiou]y
+! SFX L 0 ment's [aeiou]y
+! SFX L 0 ment's [^my]
+ SFX Z Y 22
+! SFX Z e y [^aeiouy]e
+! SFX Z 0 y [aeiouy]e
+! SFX Z 0 ey [aiouy]
+! SFX Z 0 by [^aeio][aeiou]b
+! SFX Z 0 ky [^aeio][aeiou]c
+! SFX Z 0 dy [^aeio][aeiou]d
+! SFX Z 0 fy [^aeio][aeiou]f
+! SFX Z 0 gy [^aeio][aeiou]g
+! SFX Z 0 ky [^aeio][aeiou]k
+! SFX Z 0 ly [^aeio][aeiou]l
+! SFX Z 0 my [^aeio][aeiou]m
+! SFX Z 0 ny [^aeio][aiou]n
+! SFX Z 0 py [^aeio][aeiou]p
+! SFX Z 0 ry [^aeio][aiou]r
+! SFX Z 0 sy [^aeio][aeiou]s
+! SFX Z 0 ty [^aeio][aiou]t
+! SFX Z 0 vy [^aeio][aeiou]v
+! SFX Z 0 zy [^aeio][aeiou]z
+! SFX Z 0 y [^aeio]e[nrt]
+! SFX Z 0 y [aeio][aeiou][bcdfgklmnprstvz]
+! SFX Z 0 y [^aeiou][bcdfgklmnprstvz]
+! SFX Z 0 y [^aebcdfgiklmnoprstuvyz]
+ SFX 2 Y 21
+! SFX 2 e iness [^aeiouy]e
+! SFX 2 0 iness [aeiouy]e
+! SFX 2 0 biness [^aeio][aeiou]b
+! SFX 2 0 kiness [^aeio][aeiou]c
+! SFX 2 0 diness [^aeio][aeiou]d
+! SFX 2 0 finess [^aeio][aeiou]f
+! SFX 2 0 giness [^aeio][aeiou]g
+! SFX 2 0 kiness [^aeio][aeiou]k
+! SFX 2 0 liness [^aeio][aeiou]l
+! SFX 2 0 miness [^aeio][aeiou]m
+! SFX 2 0 niness [^aeio][aiou]n
+! SFX 2 0 piness [^aeio][aeiou]p
+! SFX 2 0 riness [^aeio][aiou]r
+! SFX 2 0 siness [^aeio][aeiou]s
+! SFX 2 0 tiness [^aeio][aiou]t
+! SFX 2 0 viness [^aeio][aeiou]v
+! SFX 2 0 ziness [^aeio][aeiou]z
+! SFX 2 0 iness [^aeio]e[nrt]
+! SFX 2 0 iness [aeio][aeiou][bcdfgklmnprstvz]
+! SFX 2 0 iness [^aeiou][bcdfgklmnprstvz]
+! SFX 2 0 iness [^ebcdfgklmnprstvz]
+ SFX z Y 24
+! SFX z e ily [^aeiouy]e
+! SFX z 0 ily [aeiouy]e
+! SFX z 0 ily [aiou]y
+! SFX z ey ily ey
+! SFX z y ily [^aeiou]y
+! SFX z 0 bily [^aeio][aeiou]b
+! SFX z 0 kily [^aeio][aeiou]c
+! SFX z 0 dily [^aeio][aeiou]d
+! SFX z 0 fily [^aeio][aeiou]f
+! SFX z 0 gily [^aeio][aeiou]g
+! SFX z 0 kily [^aeio][aeiou]k
+! SFX z 0 lily [^aeio][aeiou]l
+! SFX z 0 mily [^aeio][aeiou]m
+! SFX z 0 nily [^aeio][aiou]n
+! SFX z 0 pily [^aeio][aeiou]p
+! SFX z 0 rily [^aeio][aiou]r
+! SFX z 0 sily [^aeio][aeiou]s
+! SFX z 0 tily [^aeio][aiou]t
+! SFX z 0 vily [^aeio][aeiou]v
+! SFX z 0 zily [^aeio][aeiou]z
+! SFX z 0 ily [^aeio]e[nrt]
+! SFX z 0 ily [aeio][aeiou][bcdfgklmnprstvyz]
+! SFX z 0 ily [^aeiou][bcdfgklmnprstvyz]
+! SFX z 0 ily [^ebcdfgklmnprstvyz]
+ SFX y Y 15
+! SFX y e ory te
+! SFX y e atory [mr]e
+! SFX y e ary se
+! SFX y 0 ry [^mrst]e
+! SFX y 0 ory [^aeous]t
+! SFX y 0 ry [aeous]t
+! SFX y 0 ery h
+! SFX y 0 atory [^i]m
+! SFX y im matory im
+! SFX y 0 ory s
+! SFX y 0 ary ion
+! SFX y 0 ry [^i]on
+! SFX y 0 nery [aiu]n
+! SFX y 0 ry [^aiou]n
+! SFX y 0 ry [^ehmstn]
+ SFX O Y 12
+! SFX O 0 l a
+! SFX O e al [^bcgv]e
+! SFX O e ial [bcgv]e
+! SFX O 0 ial [bcrx]
+! SFX O um al um
+! SFX O 0 al [^u]m
+! SFX O y al ty
+! SFX O y ial [^t]y
+! SFX O 0 ual [px]t
+! SFX O 0 tal [iu]t
+! SFX O 0 al [^ipux]t
+! SFX O 0 al [^aebcrtxmy]
+ SFX o Y 12
+! SFZ o 0 lly a
+! SFX o e ally [^bcgv]e
+! SFX o e ially [bcgv]e
+! SFX o 0 ially [bcrx]
+! SFX o um ally um
+! SFX o 0 ally [^u]m
+! SFX o y ally ty
+! SFX o y ially [^t]y
+! SFX o 0 ually [px]t
+! SFX o 0 tally [iu]t
+! SFX o 0 ally [^ipux]t
+! SFX o 0 ally [^aebcrtxmy]
+ SFX W Y 21
+! SFX W ce tific ce
+! SFX W e atic me
+! SFX W se tic se
+! SFX W le ic ble
+! SFX W e ic [^b]le
+! SFX W e ic [^clms]e
+! SFX W 0 lic [ay]l
+! SFX W 0 ic [^ay]l
+! SFX W us ic us
+! SFX W 0 tic [^u]s
+! SFX W er ric er
+! SFX W 0 ic [^e]r
+! SFX W 0 atic [aeiou]m
+! SFX W 0 ic [^aeiou]m
+! SFX W 0 tic ma
+! SFX W a ic [^m]a
+! SFX W y etic thy
+! SFX W y ic [^t]hy
+! SFX W y tic sy
+! SFX W y ic [^hs]y
+! SFX W 0 ic [^aelmrsy]
+ SFX w Y 9
+! SFX w e ical e
+! SFX w er rical er
+! SFX w 0 ical [^e]r
+! SFX w 0 atical [aeiou]m
+! SFX w 0 ical [^aeiou]m
+! SFX w 0 tical ma
+! SFX w a ical [^m]a
+! SFX w y ical y
+! SFX w 0 ical [^aemry]
+ SFX 1 Y 9
+! SFX 1 e ically e
+! SFX 1 er rically er
+! SFX 1 0 ically [^e]r
+! SFX 1 0 atically [aeiou]m
+! SFX 1 0 ically [^aeiou]m
+! SFX 1 0 tically ma
+! SFX 1 a ically [^m]a
+! SFX 1 y ically y
+! SFX 1 0 ically [^aemry]
+ SFX 3 Y 21
+! SFX 3 e ist [^aceiou]e
+! SFX 3 ce tist ce
+! SFX 3 0 ist [aeiou]e
+! SFX 3 y ist [^aeioubp]y
+! SFX 3 0 ist [aeioubp]y
+! SFX 3 o ist o
+! SFX 3 0 ists [^eoy]
+! SFX 3 e ists [^aceiou]e
+! SFX 3 ce tists ce
+! SFX 3 0 ists [aeiou]e
+! SFX 3 y ists [^aeioubp]y
+! SFX 3 0 ists [aeioubp]y
+! SFX 3 o ists o
+! SFX 3 0 ists [^eoy]
+! SFX 3 e ist's [^aceiou]e
+! SFX 3 ce tist's ce
+! SFX 3 0 ist's [aeiou]e
+! SFX 3 y ist's [^aeioubp]y
+! SFX 3 0 ist's [aeioubp]y
+! SFX 3 o ist's o
+! SFX 3 0 ist's [^eoy]
+--- 613,1322 ----
+ SFX R Y 72
+! SFX R 0 r e
+! SFX R 0 rs e
+! SFX R 0 ber [^aeio][aeiou]b
+! SFX R 0 bers [^aeio][aeiou]b
+! SFX R 0 ker [^aeio][aeiou]c
+! SFX R 0 kers [^aeio][aeiou]c
+! SFX R 0 der [^aeio][aeiou]d
+! SFX R 0 ders [^aeio][aeiou]d
+! SFX R 0 fer [^aeio][aeiou]f
+! SFX R 0 fers [^aeio][aeiou]f
+! SFX R 0 ger [^aeio][aeiou]g
+! SFX R 0 gers [^aeio][aeiou]g
+! SFX R 0 ker [^aeio][aeiou]k
+! SFX R 0 kers [^aeio][aeiou]k
+! SFX R 0 ler [^aeio][eiou]l
+! SFX R 0 er [aeio][eiou]l
+! SFX R 0 ler [^aeo]al
+! SFX R 0 er [aeo]al
+! SFX R 0 lers [^aeio][eiou]l
+! SFX R 0 ers [aeio][eiou]l
+! SFX R 0 lers [^aeo]al
+! SFX R 0 ers [aeo]al
+! SFX R 0 mer [^aeio][aeiou]m
+! SFX R 0 mers [^aeio][aeiou]m
+! SFX R 0 ner [^aeio][aeiou]n
+! SFX R 0 ners [^aeio][aeiou]n
+! SFX R 0 per [^aeio][aeiou]p
+! SFX R 0 pers [^aeio][aeiou]p
+! SFX R 0 rer [^aeio][aeiou]r
+! SFX R 0 rers [^aeio][aeiou]r
+! SFX R 0 ser [^aeio][aeiou]s
+! SFX R 0 sers [^aeio][aeiou]s
+! SFX R 0 ter [^aeio][aeiou]t
+! SFX R 0 ters [^aeio][aeiou]t
+! SFX R 0 ver [^aeio][aeiou]v
+! SFX R 0 vers [^aeio][aeiou]v
+! SFX R 0 zer [^aeio][aeiou]z
+! SFX R 0 zers [^aeio][aeiou]z
+! SFX R y ier [^aeiou]y
+! SFX R y iers [^aeiou]y
+! SFX R 0 er [aeiou]y
+! SFX R 0 ers [aeiou]y
+! SFX R 0 er [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 ers [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 er [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 ers [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 er [^ebcdfgklmnprstvyz]
+! SFX R 0 ers [^ebcdfgklmnprstvyz]
+! SFX R 0 r's e
+! SFX R 0 ber's [^aeio][aeiou]b
+! SFX R 0 ker's [^aeio][aeiou]c
+! SFX R 0 der's [^aeio][aeiou]d
+! SFX R 0 fer's [^aeio][aeiou]f
+! SFX R 0 ger's [^aeio][aeiou]g
+! SFX R 0 ker's [^aeio][aeiou]k
+! SFX R 0 ler's [^aeio][eiou]l
+! SFX R 0 er's [aeio][eiou]l
+! SFX R 0 ler's [^aeo]al
+! SFX R 0 er's [aeo]al
+! SFX R 0 mer's [^aeio][aeiou]m
+! SFX R 0 ner's [^aeio][aeiou]n
+! SFX R 0 per's [^aeio][aeiou]p
+! SFX R 0 rer's [^aeio][aeiou]r
+! SFX R 0 ser's [^aeio][aeiou]s
+! SFX R 0 ter's [^aeio][aeiou]t
+! SFX R 0 ver's [^aeio][aeiou]v
+! SFX R 0 zer's [^aeio][aeiou]z
+! SFX R y ier's [^aeiou]y
+! SFX R 0 er's [aeiou]y
+! SFX R 0 er's [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 er's [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 er's [^ebcdfgklmnprstvyz]
+ SFX r Y 24
+! SFX r 0 r e
+! SFX r 0 ler [^aeio][aeiou]l
+! SFX r 0 ker [^aeio][aeiou]c
+! SFX r y ier [^aeiou]y
+! SFX r 0 er [aeiou]y
+! SFX r 0 er [aeio][aeiou][cl]
+! SFX r 0 er [^aeiou][cl]
+! SFX r 0 er [^ecly]
+! SFX r 0 rs e
+! SFX r 0 lers [^aeio][aeiou]l
+! SFX r 0 kers [^aeio][aeiou]c
+! SFX r y iers [^aeiou]y
+! SFX r 0 ers [aeiou]y
+! SFX r 0 ers [aeio][aeiou][cl]
+! SFX r 0 ers [^aeiou][cl]
+! SFX r 0 ers [^ecly]
+! SFX r 0 r's e
+! SFX r 0 ler's [^aeio][aeiou]l
+! SFX r 0 ker's [^aeio][aeiou]c
+! SFX r y ier's [^aeiou]y
+! SFX r 0 er's [aeiou]y
+! SFX r 0 er's [aeio][aeiou][cl]
+! SFX r 0 er's [^aeiou][cl]
+! SFX r 0 er's [^ecly]
+ SFX S Y 9
+! SFX S y ies [^aeiou]y
+! SFX S 0 s [aeiou]y
+! SFX S 0 es [sxz]
+! SFX S 0 es [cs]h
+! SFX S 0 s [^cs]h
+! SFX S 0 s [ae]u
+! SFX S 0 x [ae]u
+! SFX S 0 s [^ae]u
+ SFX S 0 s [^hsuxyz]
+ SFX P Y 6
+! SFX P y iness [^aeiou]y
+! SFX P 0 ness [aeiou]y
+! SFX P 0 ness [^y]
+! SFX P y iness's [^aeiou]y
+! SFX P 0 ness's [aeiou]y
+! SFX P 0 ness's [^y]
+ SFX m Y 20
+! SFX m 0 sman [bdknmt]
+! SFX m 0 sman [aeiou][bdklmnt]e
+! SFX m 0 man [^aeiou][bdklmnt]e
+! SFX m 0 man [^bdklmnt]e
+! SFX m 0 man [^bdeknmt]
+! SFX m 0 smen [bdknmt]
+! SFX m 0 smen [aeiou][bdklmnt]e
+! SFX m 0 men [^aeiou][bdklmnt]e
+! SFX m 0 men [^bdklmnt]e
+! SFX m 0 men [^bdeknmt]
+! SFX m 0 sman's [bdknmt]
+! SFX m 0 sman's [aeiou][bdklmnt]e
+! SFX m 0 man's [^aeiou][bdklmnt]e
+! SFX m 0 man's [^bdklmnt]e
+! SFX m 0 man's [^bdeknmt]
+! SFX m 0 smen's [bdknmt]
+! SFX m 0 smen's [aeiou][bdklmnt]e
+! SFX m 0 men's [^aeiou][bdklmnt]e
+! SFX m 0 men's [^bdklmnt]e
+! SFX m 0 men's [^bdeknmt]
+ SFX 5 Y 15
+! SFX 5 0 swoman [bdknmt]
+! SFX 5 0 swoman [aeiou][bdklmnt]e
+! SFX 5 0 woman [^aeiou][bdklmnt]e
+! SFX 5 0 woman [^bdklmnt]e
+! SFX 5 0 woman [^bdeknmt]
+! SFX 5 0 swomen [bdknmt]
+! SFX 5 0 swomen [aeiou][bdklmnt]e
+! SFX 5 0 women [^aeiou][bdklmnt]e
+! SFX 5 0 women [^bdklmnt]e
+! SFX 5 0 women [^bdeknmt]
+! SFX 5 0 swoman's [bdknmt]
+! SFX 5 0 swoman's [aeiou][bdklmnt]e
+! SFX 5 0 woman's [^aeiou][bdklmnt]e
+! SFX 5 0 woman's [^bdklmnt]e
+! SFX 5 0 woman's [^bdeknmt]
+ SFX 6 Y 3
+! SFX 6 y iful [^aeiou]y
+! SFX 6 0 ful [aeiou]y
+! SFX 6 0 ful [^y]
+ SFX j Y 3
+! SFX j y ifully [^aeiou]y
+! SFX j 0 fully [aeiou]y
+! SFX j 0 fully [^y]
+ SFX p Y 5
+! SFX p y iless [^aeiou]y
+! SFX p 0 less [aeiou]y
+! SFX p 0 ess ll
+! SFX p 0 less [^l]l
+! SFX p 0 less [^ly]
+ SFX Q Y 88
+! SFX Q 0 tise a
+! SFX Q e ise [^l]e
+! SFX Q le ilise [^aeiou]le
+! SFX Q e ise [aeiou]le
+! SFX Q um ise um
+! SFX Q 0 ise [^u]m
+! SFX Q s se is
+! SFX Q 0 ise [^i]s
+! SFX Q y ise [^aeiou]y
+! SFX Q 0 ise [aeiou]y
+! SFX Q 0 ise [^aemsy]
+! SFX Q 0 tises a
+! SFX Q e ises [^l]e
+! SFX Q le ilises [^aeiou]le
+! SFX Q e ises [aeiou]le
+! SFX Q um ises um
+! SFX Q 0 ises [^u]m
+! SFX Q s ses is
+! SFX Q 0 ises [^i]s
+! SFX Q y ises [^aeiou]y
+! SFX Q 0 ises [aeiou]y
+! SFX Q 0 ises [^aemsy]
+! SFX Q 0 tised a
+! SFX Q e ised [^l]e
+! SFX Q le ilised [^aeiou]le
+! SFX Q e ised [aeiou]le
+! SFX Q um ised um
+! SFX Q 0 ised [^u]m
+! SFX Q s sed is
+! SFX Q 0 ised [^i]s
+! SFX Q y ised [^aeiou]y
+! SFX Q 0 ised [aeiou]y
+! SFX Q 0 ised [^aemsy]
+! SFX Q 0 tising a
+! SFX Q e ising [^l]e
+! SFX Q le ilising [^aeiou]le
+! SFX Q e ising [aeiou]le
+! SFX Q um ising um
+! SFX Q 0 ising [^u]m
+! SFX Q s sing is
+! SFX Q 0 ising [^i]s
+! SFX Q y ising [^aeiou]y
+! SFX Q 0 ising [aeiou]y
+! SFX Q 0 ising [^aemsy]
+! SFX Q 0 tize a
+! SFX Q e ize [^l]e
+! SFX Q le ilize [^aeiou]le
+! SFX Q e ize [aeiou]le
+! SFX Q um ize um
+! SFX Q 0 ize [^u]m
+! SFX Q s ze is
+! SFX Q 0 ize [^i]s
+! SFX Q y ize [^aeiou]y
+! SFX Q 0 ize [aeiou]y
+! SFX Q 0 ize [^aemsy]
+! SFX Q 0 tizes a
+! SFX Q e izes [^l]e
+! SFX Q le ilizes [^aeiou]le
+! SFX Q e izes [aeiou]le
+! SFX Q um izes um
+! SFX Q 0 izes [^u]m
+! SFX Q s zes is
+! SFX Q 0 izes [^i]s
+! SFX Q y izes [^aeiou]y
+! SFX Q 0 izes [aeiou]y
+! SFX Q 0 izes [^aemsy]
+! SFX Q 0 tized a
+! SFX Q e ized [^l]e
+! SFX Q le ilized [^aeiou]le
+! SFX Q e ized [aeiou]le
+! SFX Q um ized um
+! SFX Q 0 ized [^u]m
+! SFX Q s zed is
+! SFX Q 0 ized [^i]s
+! SFX Q y ized [^aeiou]y
+! SFX Q 0 ized [aeiou]y
+! SFX Q 0 ized [^aemsy]
+! SFX Q 0 tizing a
+! SFX Q e izing [^l]e
+! SFX Q le ilizing [^aeiou]le
+! SFX Q e izing [aeiou]le
+! SFX Q um izing um
+! SFX Q 0 izing [^u]m
+! SFX Q s zing is
+! SFX Q 0 izing [^i]s
+! SFX Q y izing [^aeiou]y
+! SFX Q 0 izing [aeiou]y
+! SFX Q 0 izing [^aemsy]
+ SFX q Y 44
+! SFX q 0 tisation a
+! SFX q e isation [^l]e
+! SFX q le ilisation [^aeiou]le
+! SFX q e isation [aeiou]le
+! SFX q um isation um
+! SFX q 0 isation [^u]m
+! SFX q s sation is
+! SFX q 0 isation [^i]s
+! SFX q y isation [^aeiou]y
+! SFX q 0 isation [aeiou]y
+! SFX q 0 isation [^aemsy]
+! SFX q 0 tisations a
+! SFX q e isations [^l]e
+! SFX q le ilisations [^aeiou]le
+! SFX q e isations [aeiou]le
+! SFX q um isations um
+! SFX q 0 isations [^u]m
+! SFX q s sations is
+! SFX q 0 isations [^i]s
+! SFX q y isations [^aeiou]y
+! SFX q 0 isations [aeiou]y
+! SFX q 0 isations [^aemsy]
+! SFX q 0 tization a
+! SFX q e ization [^l]e
+! SFX q le ilization [^aeiou]le
+! SFX q e ization [aeiou]le
+! SFX q um ization um
+! SFX q 0 ization [^u]m
+! SFX q s zation is
+! SFX q 0 ization [^i]s
+! SFX q y ization [^aeiou]y
+! SFX q 0 ization [aeiou]y
+! SFX q 0 ization [^aemsy]
+! SFX q 0 tizations a
+! SFX q e izations [^l]e
+! SFX q le ilizations [^aeiou]le
+! SFX q e izations [aeiou]le
+! SFX q um izations um
+! SFX q 0 izations [^u]m
+! SFX q s zations is
+! SFX q 0 izations [^i]s
+! SFX q y izations [^aeiou]y
+! SFX q 0 izations [aeiou]y
+! SFX q 0 izations [^aemsy]
+ SFX s Y 66
+! SFX s 0 tiser a
+! SFX s e iser [^l]e
+! SFX s le iliser [^aeiou]le
+! SFX s e iser [aeiou]le
+! SFX s um iser um
+! SFX s 0 iser [^u]m
+! SFX s s ser is
+! SFX s 0 iser [^i]s
+! SFX s y iser [^aeiou]y
+! SFX s 0 iser [aeiou]y
+! SFX s 0 iser [^aemsy]
+! SFX s 0 tisers a
+! SFX s e isers [^l]e
+! SFX s le ilisers [^aeiou]le
+! SFX s e isers [aeiou]le
+! SFX s um isers um
+! SFX s 0 isers [^u]m
+! SFX s s sers is
+! SFX s 0 isers [^i]s
+! SFX s y isers [^aeiou]y
+! SFX s 0 isers [aeiou]y
+! SFX s 0 isers [^aemsy]
+! SFX s 0 tiser's a
+! SFX s e iser's [^l]e
+! SFX s le iliser's [^aeiou]le
+! SFX s e iser's [aeiou]le
+! SFX s um iser's um
+! SFX s 0 iser's [^u]m
+! SFX s s ser's is
+! SFX s 0 iser's [^i]s
+! SFX s y iser's [^aeiou]y
+! SFX s 0 iser's [aeiou]y
+! SFX s 0 iser's [^aemsy]
+! SFX s 0 tizer a
+! SFX s e izer [^l]e
+! SFX s le ilizer [^aeiou]le
+! SFX s e izer [aeiou]le
+! SFX s um izer um
+! SFX s 0 izer [^u]m
+! SFX s s zer is
+! SFX s 0 izer [^i]s
+! SFX s y izer [^aeiou]y
+! SFX s 0 izer [aeiou]y
+! SFX s 0 izer [^aemsy]
+! SFX s 0 tizers a
+! SFX s e izers [^l]e
+! SFX s le ilizers [^aeiou]le
+! SFX s e izers [aeiou]le
+! SFX s um izers um
+! SFX s 0 izers [^u]m
+! SFX s s zers is
+! SFX s 0 izers [^i]s
+! SFX s y izers [^aeiou]y
+! SFX s 0 izers [aeiou]y
+! SFX s 0 izers [^aemsy]
+! SFX s 0 tizer's a
+! SFX s e izer's [^l]e
+! SFX s le ilizer's [^aeiou]le
+! SFX s e izer's [aeiou]le
+! SFX s um izer's um
+! SFX s 0 izer's [^u]m
+! SFX s s zer's is
+! SFX s 0 izer's [^i]s
+! SFX s y izer's [^aeiou]y
+! SFX s 0 izer's [aeiou]y
+! SFX s 0 izer's [^aemsy]
+ SFX t Y 44
+! SFX t 0 tisable a
+! SFX t e isable [^l]e
+! SFX t le ilisable [^aeiou]le
+! SFX t e isable [aeiou]le
+! SFX t um isable um
+! SFX t 0 isable [^u]m
+! SFX t s sable is
+! SFX t 0 isable [^i]s
+! SFX t y isable [^aeiou]y
+! SFX t 0 isable [aeiou]y
+! SFX t 0 isable [^aemsy]
+! SFX t 0 tizable a
+! SFX t e izable [^l]e
+! SFX t le ilizable [^aeiou]le
+! SFX t e izable [aeiou]le
+! SFX t um izable um
+! SFX t 0 izable [^u]m
+! SFX t s zable is
+! SFX t 0 izable [^i]s
+! SFX t y izable [^aeiou]y
+! SFX t 0 izable [aeiou]y
+! SFX t 0 izable [^aemsy]
+! SFX t 0 tisability a
+! SFX t e isability [^l]e
+! SFX t le ilisability [^aeiou]le
+! SFX t e isability [aeiou]le
+! SFX t um isability um
+! SFX t 0 isability [^u]m
+! SFX t s sability is
+! SFX t 0 isability [^i]s
+! SFX t y isability [^aeiou]y
+! SFX t 0 isability [aeiou]y
+! SFX t 0 isability [^aemsy]
+! SFX t 0 tizability a
+! SFX t e izability [^l]e
+! SFX t le ilizability [^aeiou]le
+! SFX t e izability [aeiou]le
+! SFX t um izability um
+! SFX t 0 izability [^u]m
+! SFX t s zability is
+! SFX t 0 izability [^i]s
+! SFX t y izability [^aeiou]y
+! SFX t 0 izability [aeiou]y
+! SFX t 0 izability [^aemsy]
+ SFX M Y 1
+! SFX M 0 's .
+ SFX B Y 48
+! SFX B e able [^acegilotu]e
+! SFX B 0 able [acegilou]e
+! SFX B te ble ate
+! SFX B e able [^a]te
+! SFX B 0 bable [^aeio][aeiou]b
+! SFX B 0 kable [^aeio][aeiou]c
+! SFX B 0 dable [^aeio][aeiou]d
+! SFX B 0 fable [^aeio][aeiou]f
+! SFX B 0 gable [^aeio][aeiou]g
+! SFX B 0 kable [^aeio][aeiou]k
+! SFX B 0 lable [^aeio][aeiou]l
+! SFX B 0 mable [^aeio][aeiou]m
+! SFX B 0 nable [^aeio][aeiou]n
+! SFX B 0 pable [^aeio][aeiou]p
+! SFX B 0 rable [^aeio][aeiou]r
+! SFX B 0 sable [^aeio][aeiou]s
+! SFX B 0 table [^aeio][aeiou]t
+! SFX B 0 vable [^aeio][aeiou]v
+! SFX B 0 zable [^aeio][aeiou]z
+! SFX B 0 able [aeio][aeiou][bcdfgklmnprstvz]
+! SFX B 0 able [^aeiou][bcdfgklmnprstvz]
+! SFX B y iable [^aeiou]y
+! SFX B 0 able [aeiou]y
+! SFX B 0 able [^ebcdfgklmnprstvzy]
+! SFX B e ability [^acegilotu]e
+! SFX B 0 ability [acegilou]e
+! SFX B te bility ate
+! SFX B e ability [^a]te
+! SFX B 0 bability [^aeio][aeiou]b
+! SFX B 0 kability [^aeio][aeiou]c
+! SFX B 0 dability [^aeio][aeiou]d
+! SFX B 0 fability [^aeio][aeiou]f
+! SFX B 0 gability [^aeio][aeiou]g
+! SFX B 0 kability [^aeio][aeiou]k
+! SFX B 0 lability [^aeio][aeiou]l
+! SFX B 0 mability [^aeio][aeiou]m
+! SFX B 0 nability [^aeio][aeiou]n
+! SFX B 0 pability [^aeio][aeiou]p
+! SFX B 0 rability [^aeio][aeiou]r
+! SFX B 0 sability [^aeio][aeiou]s
+! SFX B 0 tability [^aeio][aeiou]t
+! SFX B 0 vability [^aeio][aeiou]v
+! SFX B 0 zability [^aeio][aeiou]z
+! SFX B 0 ability [aeio][aeiou][bcdfgklmnprstvz]
+! SFX B 0 ability [^aeiou][bcdfgklmnprstvz]
+! SFX B y iability [^aeiou]y
+! SFX B 0 ability [aeiou]y
+! SFX B 0 ability [^ebcdfgklmnprstvzy]
+ SFX 7 Y 9
+! SFX 7 e able [acegilou]e
+! SFX 7 0 able [^acegilou]e
+! SFX 7 0 kable [^aeio][aeiou]c
+! SFX 7 0 lable [^aeio][aeiou]l
+! SFX 7 0 able [aeio][aeiou][cl]
+! SFX 7 0 able [^aeiou][cl]
+! SFX 7 y iable [^aeiou]y
+! SFX 7 0 able [aeiou]y
+! SFX 7 0 able [^cely]
+ SFX g Y 9
+! SFX g e ability [^acegilou]e
+! SFX g 0 ability [acegilou]e
+! SFX g 0 kability [^aeio][aeiou]c
+! SFX g 0 lability [^aeio][aeiou]l
+! SFX g 0 ability [aeio][aeiou][cl]
+! SFX g 0 ability [^aeiou][cl]
+! SFX g y iability [^aeiou]y
+! SFX g 0 ability [aeiou]y
+! SFX g 0 ability [^cely]
+ SFX l Y 9
+! SFX l e ably [^acegilou]e
+! SFX l 0 ably [acegilou]e
+! SFX l 0 kably [^aeio][aeiou]c
+! SFX l 0 lably [^aeio][aeiou]l
+! SFX l 0 ably [aeio][aeiou][cl]
+! SFX l 0 ably [^aeiou][cl]
+! SFX l y iably [^aeiou]y
+! SFX l 0 ably [aeiou]y
+! SFX l 0 ably [^cely]
+ SFX b Y 3
+! SFX b e ible [^aeiou]e
+! SFX b 0 ible [aeiou]e
+! SFX b 0 ible [^e]
+ SFX L Y 12
+! SFX L 0 ament m
+! SFX L y iment [^aeiou]y
+! SFX L 0 ment [aeiou]y
+! SFX L 0 ment [^my]
+! SFX L 0 aments m
+! SFX L y iments [^aeiou]y
+! SFX L 0 ments [aeiou]y
+! SFX L 0 ments [^my]
+! SFX L 0 ament's m
+! SFX L y iment's [^aeiou]y
+! SFX L 0 ment's [aeiou]y
+! SFX L 0 ment's [^my]
+ SFX Z Y 22
+! SFX Z e y [^aeiouy]e
+! SFX Z 0 y [aeiouy]e
+! SFX Z 0 ey [aiouy]
+! SFX Z 0 by [^aeio][aeiou]b
+! SFX Z 0 ky [^aeio][aeiou]c
+! SFX Z 0 dy [^aeio][aeiou]d
+! SFX Z 0 fy [^aeio][aeiou]f
+! SFX Z 0 gy [^aeio][aeiou]g
+! SFX Z 0 ky [^aeio][aeiou]k
+! SFX Z 0 ly [^aeio][aeiou]l
+! SFX Z 0 my [^aeio][aeiou]m
+! SFX Z 0 ny [^aeio][aiou]n
+! SFX Z 0 py [^aeio][aeiou]p
+! SFX Z 0 ry [^aeio][aiou]r
+! SFX Z 0 sy [^aeio][aeiou]s
+! SFX Z 0 ty [^aeio][aiou]t
+! SFX Z 0 vy [^aeio][aeiou]v
+! SFX Z 0 zy [^aeio][aeiou]z
+! SFX Z 0 y [^aeio]e[nrt]
+! SFX Z 0 y [aeio][aeiou][bcdfgklmnprstvz]
+! SFX Z 0 y [^aeiou][bcdfgklmnprstvz]
+! SFX Z 0 y [^aebcdfgiklmnoprstuvyz]
+ SFX 2 Y 21
+! SFX 2 e iness [^aeiouy]e
+! SFX 2 0 iness [aeiouy]e
+! SFX 2 0 biness [^aeio][aeiou]b
+! SFX 2 0 kiness [^aeio][aeiou]c
+! SFX 2 0 diness [^aeio][aeiou]d
+! SFX 2 0 finess [^aeio][aeiou]f
+! SFX 2 0 giness [^aeio][aeiou]g
+! SFX 2 0 kiness [^aeio][aeiou]k
+! SFX 2 0 liness [^aeio][aeiou]l
+! SFX 2 0 miness [^aeio][aeiou]m
+! SFX 2 0 niness [^aeio][aiou]n
+! SFX 2 0 piness [^aeio][aeiou]p
+! SFX 2 0 riness [^aeio][aiou]r
+! SFX 2 0 siness [^aeio][aeiou]s
+! SFX 2 0 tiness [^aeio][aiou]t
+! SFX 2 0 viness [^aeio][aeiou]v
+! SFX 2 0 ziness [^aeio][aeiou]z
+! SFX 2 0 iness [^aeio]e[nrt]
+! SFX 2 0 iness [aeio][aeiou][bcdfgklmnprstvz]
+! SFX 2 0 iness [^aeiou][bcdfgklmnprstvz]
+! SFX 2 0 iness [^ebcdfgklmnprstvz]
+ SFX z Y 24
+! SFX z e ily [^aeiouy]e
+! SFX z 0 ily [aeiouy]e
+! SFX z 0 ily [aiou]y
+! SFX z ey ily ey
+! SFX z y ily [^aeiou]y
+! SFX z 0 bily [^aeio][aeiou]b
+! SFX z 0 kily [^aeio][aeiou]c
+! SFX z 0 dily [^aeio][aeiou]d
+! SFX z 0 fily [^aeio][aeiou]f
+! SFX z 0 gily [^aeio][aeiou]g
+! SFX z 0 kily [^aeio][aeiou]k
+! SFX z 0 lily [^aeio][aeiou]l
+! SFX z 0 mily [^aeio][aeiou]m
+! SFX z 0 nily [^aeio][aiou]n
+! SFX z 0 pily [^aeio][aeiou]p
+! SFX z 0 rily [^aeio][aiou]r
+! SFX z 0 sily [^aeio][aeiou]s
+! SFX z 0 tily [^aeio][aiou]t
+! SFX z 0 vily [^aeio][aeiou]v
+! SFX z 0 zily [^aeio][aeiou]z
+! SFX z 0 ily [^aeio]e[nrt]
+! SFX z 0 ily [aeio][aeiou][bcdfgklmnprstvyz]
+! SFX z 0 ily [^aeiou][bcdfgklmnprstvyz]
+! SFX z 0 ily [^ebcdfgklmnprstvyz]
+ SFX y Y 15
+! SFX y e ory te
+! SFX y e atory [mr]e
+! SFX y e ary se
+! SFX y 0 ry [^mrst]e
+! SFX y 0 ory [^aeous]t
+! SFX y 0 ry [aeous]t
+! SFX y 0 ery h
+! SFX y 0 atory [^i]m
+! SFX y im matory im
+! SFX y 0 ory s
+! SFX y 0 ary ion
+! SFX y 0 ry [^i]on
+! SFX y 0 nery [aiu]n
+! SFX y 0 ry [^aiou]n
+! SFX y 0 ry [^ehmstn]
+ SFX O Y 12
+! SFX O 0 l a
+! SFX O e al [^bcgv]e
+! SFX O e ial [bcgv]e
+! SFX O 0 ial [bcrx]
+! SFX O um al um
+! SFX O 0 al [^u]m
+! SFX O y al ty
+! SFX O y ial [^t]y
+! SFX O 0 ual [px]t
+! SFX O 0 tal [iu]t
+! SFX O 0 al [^ipux]t
+! SFX O 0 al [^aebcrtxmy]
+ SFX o Y 12
+! SFX o 0 lly a
+! SFX o e ally [^bcgv]e
+! SFX o e ially [bcgv]e
+! SFX o 0 ially [bcrx]
+! SFX o um ally um
+! SFX o 0 ally [^u]m
+! SFX o y ally ty
+! SFX o y ially [^t]y
+! SFX o 0 ually [px]t
+! SFX o 0 tally [iu]t
+! SFX o 0 ally [^ipux]t
+! SFX o 0 ally [^aebcrtxmy]
+ SFX W Y 21
+! SFX W ce tific ce
+! SFX W e atic me
+! SFX W se tic se
+! SFX W le ic ble
+! SFX W e ic [^b]le
+! SFX W e ic [^clms]e
+! SFX W 0 lic [ay]l
+! SFX W 0 ic [^ay]l
+! SFX W us ic us
+! SFX W 0 tic [^u]s
+! SFX W er ric er
+! SFX W 0 ic [^e]r
+! SFX W 0 atic [aeiou]m
+! SFX W 0 ic [^aeiou]m
+! SFX W 0 tic ma
+! SFX W a ic [^m]a
+! SFX W y etic thy
+! SFX W y ic [^t]hy
+! SFX W y tic sy
+! SFX W y ic [^hs]y
+! SFX W 0 ic [^aelmrsy]
+ SFX w Y 9
+! SFX w e ical e
+! SFX w er rical er
+! SFX w 0 ical [^e]r
+! SFX w 0 atical [aeiou]m
+! SFX w 0 ical [^aeiou]m
+! SFX w 0 tical ma
+! SFX w a ical [^m]a
+! SFX w y ical y
+! SFX w 0 ical [^aemry]
+ SFX 1 Y 9
+! SFX 1 e ically e
+! SFX 1 er rically er
+! SFX 1 0 ically [^e]r
+! SFX 1 0 atically [aeiou]m
+! SFX 1 0 ically [^aeiou]m
+! SFX 1 0 tically ma
+! SFX 1 a ically [^m]a
+! SFX 1 y ically y
+! SFX 1 0 ically [^aemry]
+ SFX 3 Y 21
+! SFX 3 e ist [^aceiou]e
+! SFX 3 ce tist ce
+! SFX 3 0 ist [aeiou]e
+! SFX 3 y ist [^aeioubp]y
+! SFX 3 0 ist [aeioubp]y
+! SFX 3 o ist o
+! SFX 3 0 ists [^eoy]
+! SFX 3 e ists [^aceiou]e
+! SFX 3 ce tists ce
+! SFX 3 0 ists [aeiou]e
+! SFX 3 y ists [^aeioubp]y
+! SFX 3 0 ists [aeioubp]y
+! SFX 3 o ists o
+! SFX 3 0 ists [^eoy]
+! SFX 3 e ist's [^aceiou]e
+! SFX 3 ce tist's ce
+! SFX 3 0 ist's [aeiou]e
+! SFX 3 y ist's [^aeioubp]y
+! SFX 3 0 ist's [aeioubp]y
+! SFX 3 o ist's o
+! SFX 3 0 ist's [^eoy]
+!
+!
+! # list of 250 most common English words (plucked from the internet)
+! COMMON the of to and a in is it you that he was for on are with as I his they
+! COMMON be at one have this from or had by hot word but what some we can out
+! COMMON other were all there when up use your how said an each she which do
+! COMMON their time if will way about many then them write would like so these
+! COMMON her long make thing see him two has look more day could go come did
+! COMMON number sound no most people my over know water than call first who
+! COMMON may down side been now find any new work part take get place made live
+! COMMON where after back little only round man year came show every good me
+! COMMON give our under name very through just form sentence great think say
+! COMMON help low line differ turn cause much mean before move right boy old too
+! COMMON same tell does set three want air well also play small end put home
+! COMMON read hand port large spell add even land here must big high such follow
+! COMMON act why ask men change went light kind off need house picture try
+! COMMON us again animal point mother world near build self earth father head
+! COMMON stand own page should country found answer school grow study still
+! COMMON learn plant cover food sun four between state keep eye never last let
+! COMMON thought city tree cross farm hard start might story saw far sea draw
+! COMMON left late run don't while press close night real life few north
+!
+! # a few more for consistency
+! COMMON five six seven eight nine ten hundred thousand
+*** en_AU.orig.dic 2010-05-15 13:03:48.000000000 +0200
+--- en_AU.dic 2016-01-08 23:03:18.342461841 +0100
+***************
+*** 1,2 ****
+! 45654
+ AA
+--- 1,12 ----
+! 45653
+! 0th
+! 1st
+! 2nd
+! 3rd
+! 4th
+! 5th
+! 6th
+! 7th
+! 8th
+! 9th
+ AA
+***************
+*** 912,914 ****
+ Alaska/M
+! al/AY
+ albacore/MS
+--- 922,924 ----
+ Alaska/M
+! really
+ albacore/MS
+***************
+*** 4885,4887 ****
+ bozo/SM
+- b/pb
+ bpi
+--- 4895,4896 ----
+***************
+*** 4921,4922 ****
+--- 4930,4932 ----
+ Brahms
++ Bram/M
+ braid/DGS
+***************
+*** 5753,5755 ****
+ cad/ZSM
+- c/aE
+ CAE
+--- 5763,5764 ----
+***************
+*** 8535,8537 ****
+ coniferous
+- conj
+ conjectural
+--- 8544,8545 ----
+***************
+*** 8544,8545 ****
+--- 8552,8554 ----
+ conjunctiva/MS
++ conj.
+ conjunctive/S
+***************
+*** 10288,10289 ****
+--- 10297,10301 ----
+ dB/M
++ dBi
++ dBm
++ dBd
+ DBMS
+***************
+*** 11781,11783 ****
+ DNA
+- d/o
+ DOB
+--- 11793,11794 ----
+***************
+*** 12468,12469 ****
+--- 12479,12481 ----
+ Dutch/5m
++ Farsi
+ Dutchwomen/M
+***************
+*** 12516,12518 ****
+ dystrophy/M
+- e
+ ea
+--- 12528,12529 ----
+***************
+*** 12792,12794 ****
+ e.g.
+- e.g..
+ egad
+--- 12803,12804 ----
+***************
+*** 13779,13781 ****
+ estuary/MS
+! et
+ ETA
+--- 13789,13792 ----
+ estuary/MS
+! et cetera
+! et al.
+ ETA
+***************
+*** 15296,15298 ****
+ fjord/SM
+! f/K
+ flab/2zZM
+--- 15307,15309 ----
+ fjord/SM
+! pref
+ flab/2zZM
+***************
+*** 16480,16482 ****
+ FYI
+- g/7
+ gabardine/SM
+--- 16491,16492 ----
+***************
+*** 18599,18601 ****
+ HDTV
+- h/E
+ headache/SM
+--- 18609,18610 ----
+***************
+*** 19214,19216 ****
+ Hobbes
+! hobbit
+ hobble/RGSD
+--- 19223,19225 ----
+ Hobbes
+! hobbit/MS
+ hobble/RGSD
+***************
+*** 21791,21793 ****
+ jive/DSMG
+- j/k
+ jnr.
+--- 21800,21801 ----
+***************
+*** 22125,22127 ****
+ kcal
+- k/E
+ Keane
+--- 22133,22134 ----
+***************
+*** 22606,22608 ****
+ Kyushu/M
+- l/3
+ label/AGaSD
+--- 22613,22614 ----
+***************
+*** 22885,22887 ****
+ lass/SM
+- last-ditch
+ lasted/e
+--- 22891,22892 ----
+***************
+*** 22890,22892 ****
+ last/kJYDSG
+- last-minute
+ lasts/e
+--- 22895,22896 ----
+***************
+*** 26417,26418 ****
+--- 26421,26423 ----
+ Moolawatana
++ Moolenaar/M
+ Moomba
+***************
+*** 27188,27192 ****
+ nationals/4
+! national/sQq3S
+ nationhood/M
+! nation/M
+ nationwide
+--- 27193,27197 ----
+ nationals/4
+! national/sQq3SZ
+ nationhood/M
+! nation/MS
+ nationwide
+***************
+*** 27194,27195 ****
+--- 27199,27202 ----
+ nativity/MS
++ natively
++ nativeness
+ NATO/M
+***************
+*** 28365,28367 ****
+ nuzzle/SDG
+- n/xvuNVn
+ Nyah
+--- 28372,28373 ----
+***************
+*** 29464,29466 ****
+ oz
+- o/z
+ Ozark/MS
+--- 29470,29471 ----
+***************
+*** 31035,31037 ****
+ Pk
+- p/KF
+ pl.
+--- 31040,31041 ----
+***************
+*** 31288,31289 ****
+--- 31292,31294 ----
+ pneumonia/MS
++ pneumonic
+ PO
+***************
+*** 31460,31461 ****
+--- 31465,31467 ----
+ pompom/MS
++ pompon/M
+ pomposity/MS
+***************
+*** 32865,32867 ****
+ pyx/S
+- q
+ Qatar
+--- 32871,32872 ----
+***************
+*** 33378,33380 ****
+ razzmatazz
+- r/d
+ Rd/M
+--- 33383,33384 ----
+***************
+*** 34979,34981 ****
+ RSPCA
+- rte
+ rub-a-dub
+--- 34983,34984 ----
+***************
+*** 36012,36014 ****
+ sec.
+! s/eca
+ secant/MS
+--- 36015,36017 ----
+ sec.
+! outs
+ secant/MS
+***************
+*** 40242,40244 ****
+ Szechwan/M
+! t/7k
+ Ta
+--- 40245,40247 ----
+ Szechwan/M
+! tingly
+ Ta
+***************
+*** 42616,42618 ****
+ Tyson/M
+- u
+ ubiquitousness
+--- 42619,42620 ----
+***************
+*** 42990,42991 ****
+--- 42992,42994 ----
+ unscrupulous
++ searchable
+ unsearchable
+***************
+*** 43252,43254 ****
+ Uzi/M
+- v
+ vacancy/MS
+--- 43255,43256 ----
+***************
+*** 43749,43751 ****
+ Vilnius/M
+! vim/M
+ vinaigrette/MS
+--- 43751,43754 ----
+ Vilnius/M
+! Vim/M
+! vim/?
+ vinaigrette/MS
+***************
+*** 45494,45496 ****
+ yippee
+- y/K
+ YMCA
+--- 45497,45498 ----
+***************
+*** 45586,45588 ****
+ zap/SGRD
+- z/d
+ Zealanders
+--- 45588,45589 ----
+***************
+*** 45655 ****
+--- 45656,45670 ----
+ zymurgy/S
++ nd
++ PayPal
++ Google
++ TCP\/IP
++ a a/%
++ a an/%
++ a the/%
++ an a/%
++ an an/%
++ an the/%
++ and and/%
++ the a/%
++ the an/%
++ the the/%
diff --git a/runtime/spell/en/en_CA.diff b/runtime/spell/en/en_CA.diff
new file mode 100644
index 0000000..7b3f003
--- /dev/null
+++ b/runtime/spell/en/en_CA.diff
@@ -0,0 +1,238 @@
+*** en_CA.orig.aff 2015-12-30 18:18:20.076952127 +0100
+--- en_CA.aff 2016-01-09 13:15:51.306488848 +0100
+***************
+*** 2,18 ****
+ TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+! ICONV 1
+! ICONV ’ '
+ NOSUGGEST !
+
+! # ordinal numbers
+! COMPOUNDMIN 1
+! # only in compounds: 1th, 2th, 3th
+! ONLYINCOMPOUND c
+! # compound rules:
+! # 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
+! # 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
+! COMPOUNDRULE 2
+! COMPOUNDRULE n*1t
+! COMPOUNDRULE n*mp
+! WORDCHARS 0123456789
+
+--- 2,161 ----
+ TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+!
+! # ICONV 1
+! # ICONV ’ '
+!
+ NOSUGGEST !
+
+! FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
+! LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
+! UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ
+!
+! MIDWORD '
+!
+! RARE ?
+! BAD %
+!
+! MAP 9
+! MAP aàáâãäå
+! MAP eèéêë
+! MAP iìíîï
+! MAP oòóôõö
+! MAP uùúûü
+! MAP nñ
+! MAP cç
+! MAP yÿý
+! MAP sß
+!
+! # This comes from Aspell en_phonet.dat, version 1.1, 2000-01-07
+!
+! 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 À^ *
+! SAL Å^ *
+! 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 É< 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
+!
+! # When soundfolding "th" is turned into "@". When this is mistyped as "ht" it
+! # soundfolds to "ht". This difference is too big, thus use REP items to lower
+! # the score.
+! REPSAL 2
+! REPSAL ht @
+! REPSAL @ ht
+!
+! # This is disabled, because if Vim does not support NOCOMPOUNDSUGS giving
+! # suggestions is extremely slow.
+! ## ordinal numbers
+! #COMPOUNDMIN 1
+! ## only in compounds: 1th, 2th, 3th
+! #ONLYINCOMPOUND c
+! ## compound rules:
+! ## 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
+! ## 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
+! #COMPOUNDRULE 2
+! #COMPOUNDRULE n*1t
+! #COMPOUNDRULE n*mp
+! #NOCOMPOUNDSUGS
+!
+! # WORDCHARS 0123456789
+
+*** en_CA.orig.dic 2015-12-30 18:20:47.803358258 +0100
+--- en_CA.dic 2016-01-08 23:03:52.562085247 +0100
+***************
+*** 1,25 ****
+ 48929
+! 0/nm
+! 0th/pt
+! 1/n1
+! 1st/p
+! 1th/tc
+! 2/nm
+! 2nd/p
+! 2th/tc
+! 3/nm
+! 3rd/p
+! 3th/tc
+! 4/nm
+! 4th/pt
+! 5/nm
+! 5th/pt
+! 6/nm
+! 6th/pt
+! 7/nm
+! 7th/pt
+! 8/nm
+! 8th/pt
+! 9/nm
+! 9th/pt
+ A/SM
+--- 1,12 ----
+ 48929
+! 0th
+! 1st
+! 2nd
+! 3rd
+! 4th
+! 5th
+! 6th
+! 7th
+! 8th
+! 9th
+ A/SM
+***************
+*** 48930 ****
+--- 48917,48927 ----
+ zymurgy/M
++ a a/%
++ a an/%
++ a the/%
++ an a/%
++ an an/%
++ an the/%
++ and and/%
++ the a/%
++ the an/%
++ the the/%
diff --git a/runtime/spell/en/en_GB.diff b/runtime/spell/en/en_GB.diff
new file mode 100644
index 0000000..4c1c042
--- /dev/null
+++ b/runtime/spell/en/en_GB.diff
@@ -0,0 +1,214 @@
+*** en_GB.orig.aff 2015-12-30 18:49:37.568638905 +0100
+--- en_GB.aff 2016-01-09 13:15:56.490432894 +0100
+***************
+*** 20,21 ****
+--- 20,158 ----
+
++ FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
++ LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
++ UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ
++
++ MIDWORD '
++
++ RARE ?
++ BAD %
++
++ MAP 9
++ MAP aàáâãäå
++ MAP eèéêë
++ MAP iìíîï
++ MAP oòóôõö
++ MAP uùúûü
++ MAP nñ
++ MAP cç
++ MAP yÿý
++ MAP sß
++
++ # This comes from Aspell en_phonet.dat, version 1.1, 2000-01-07
++
++ 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 À^ *
++ SAL Å^ *
++ 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 É< 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
++
++ # When soundfolding "th" is turned into "@". When this is mistyped as "ht" it
++ # soundfolds to "ht". This difference is too big, thus use REP items to lower
++ # the score.
++ REPSAL 2
++ REPSAL ht @
++ REPSAL @ ht
++
+ REP 27
+***************
+*** 49,50 ****
+--- 186,203 ----
+
++ # This is disabled, because if Vim does not support NOCOMPOUNDSUGS giving
++ # suggestions is extremely slow.
++ ## ordinal numbers
++ #COMPOUNDMIN 1
++ ## only in compounds: 1th, 2th, 3th
++ #ONLYINCOMPOUND ,
++ ## compound rules:
++ ## 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
++ ## 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
++ #COMPOUNDRULE 2
++ #COMPOUNDRULE (*:)
++ #COMPOUNDRULE (*{}
++ #NOCOMPOUNDSUGS
++
++ # WORDCHARS 0123456789
++
+ PFX A Y 2
+*** en_GB.orig.dic 2015-12-30 18:49:42.360587040 +0100
+--- en_GB.dic 2016-01-08 23:03:35.510272903 +0100
+***************
+*** 1,2 ****
+--- 1,12 ----
+ 56453
++ 0th
++ 1st
++ 2nd
++ 3rd
++ 4th
++ 5th
++ 6th
++ 7th
++ 8th
++ 9th
+ 'gainst
+***************
+*** 3615,3617 ****
+ autosuggestion
+- autosuggestion
+ autotest/S
+--- 3625,3626 ----
+***************
+*** 9325,9327 ****
+ Church
+- church
+ Church-of-England
+--- 9334,9335 ----
+***************
+*** 22885,22887 ****
+ hand-painted
+- hand-pick/D
+ hand-pick/GSD
+--- 22893,22894 ----
+***************
+*** 56454 ****
+--- 56461,56471 ----
+ émigré/S
++ a a/%
++ a an/%
++ a the/%
++ an a/%
++ an an/%
++ an the/%
++ and and/%
++ the a/%
++ the an/%
++ the the/%
diff --git a/runtime/spell/en/en_NZ.diff b/runtime/spell/en/en_NZ.diff
new file mode 100644
index 0000000..8e6d1b5
--- /dev/null
+++ b/runtime/spell/en/en_NZ.diff
@@ -0,0 +1,2733 @@
+*** en_NZ.orig.aff 2010-05-15 13:03:47.000000000 +0200
+--- en_NZ.aff 2016-01-09 13:16:01.734376292 +0100
+***************
+*** 7,9 ****
+ SET ISO8859-1
+! TRY esianrtolcdugmphbyfvkw-'.zqjxSNRTLCGDMPHBEAUYOFIVKWZQJX
+ REP 66
+--- 7,147 ----
+ SET ISO8859-1
+! TRY esianrtolcdugmphbyfvkw-'.zqjxSNRTLCGDMPHBEAUYOFIVKWZQJX
+!
+! FOL
+! LOW
+! UPP
+!
+! MIDWORD '
+!
+! RARE ?
+! BAD %
+!
+! MAP 9
+! MAP a
+! MAP e
+! MAP i
+! MAP o
+! MAP u
+! MAP n
+! MAP c
+! MAP y
+! MAP s
+!
+! # This comes from Aspell en_phonet.dat, version 1.1, 2000-01-07
+!
+! 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 ^ *
+! SAL ^ *
+! 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 < 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
+!
+! # When soundfolding "th" is turned into "@". When this is mistyped as "ht" it
+! # soundfolds to "ht". This difference is too big, thus use REP items to lower
+! # the score.
+! REPSAL 2
+! REPSAL ht @
+! REPSAL @ ht
+!
+ REP 66
+***************
+*** 75,95 ****
+ REP ura aru
+ PFX A Y 2
+! PFX A 0 re [^e]
+! PFX A 0 re- e
+ PFX a Y 1
+! PFX a 0 mis .
+ PFX I Y 4
+! PFX I 0 il l
+! PFX I 0 ir r
+! PFX I 0 im [bmp]
+! PFX I 0 in [^blmpr]
+ PFX c Y 1
+! PFX c 0 over .
+ PFX U Y 1
+! PFX U 0 un .
+ PFX C Y 2
+! PFX C 0 de [^e]
+! PFX C 0 de- e
+ PFX E Y 1
+! PFX E 0 dis .
+ PFX F Y 5
+--- 213,250 ----
+ REP ura aru
++
++ # This is disabled, because if Vim does not support NOCOMPOUNDSUGS giving
++ # suggestions is extremely slow.
++ ## ordinal numbers
++ #COMPOUNDMIN 1
++ ## only in compounds: 1th, 2th, 3th
++ #ONLYINCOMPOUND ,
++ ## compound rules:
++ ## 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
++ ## 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
++ #COMPOUNDRULE 2
++ #COMPOUNDRULE (*:)
++ #COMPOUNDRULE (*{}
++ #NOCOMPOUNDSUGS
++
++ # WORDCHARS 0123456789
++
+ PFX A Y 2
+! PFX A 0 re [^e]
+! PFX A 0 re- e
+ PFX a Y 1
+! PFX a 0 mis .
+ PFX I Y 4
+! PFX I 0 il l
+! PFX I 0 ir r
+! PFX I 0 im [bmp]
+! PFX I 0 in [^blmpr]
+ PFX c Y 1
+! PFX c 0 over .
+ PFX U Y 1
+! PFX U 0 un .
+ PFX C Y 2
+! PFX C 0 de [^e]
+! PFX C 0 de- e
+ PFX E Y 1
+! PFX E 0 dis .
+ PFX F Y 5
+***************
+*** 99,493 ****
+ PFX F 0 col l
+! PFX F 0 con [^abehilmopru].
+ PFX K Y 1
+! PFX K 0 pre .
+ PFX e Y 1
+! PFX e 0 out .
+ PFX f Y 2
+! PFX f 0 under [^r]
+! PFX f 0 under- r
+ PFX O Y 1
+! PFX O 0 non- .
+ PFX 4 Y 1
+! PFX 4 0 trans .
+ SFX V Y 15
+! SFX V 0 tive [aio]
+! SFX V b ptive b
+! SFX V d sive d
+! SFX V be ptive be
+! SFX V e tive ce
+! SFX V de sive de
+! SFX V ke cative ke
+! SFX V e ptive me
+! SFX V e ive [st]e
+! SFX V e ative [^bcdkmst]e
+! SFX V 0 lative [aeiou]l
+! SFX V 0 ative [^aeiou]l
+! SFX V 0 ive [st]
+! SFX V y icative y
+! SFX V 0 ative [^abdeilosty]
+ SFX v Y 15
+! SFX v 0 tively [aio]
+! SFX v b ptively b
+! SFX v d sively d
+! SFX v be ptively be
+! SFX v e tively ce
+! SFX v de sively de
+! SFX v ke catively ke
+! SFX v e ptively me
+! SFX v e ively [st]e
+! SFX v e atively [^bcdkmst]e
+! SFX v 0 latively [aeiou]l
+! SFX v 0 atively [^aeiou]l
+! SFX v 0 ively [st]
+! SFX v y icatively y
+! SFX v 0 atively [^abdeilosty]
+ SFX u Y 15
+! SFX u 0 tiveness [aio]
+! SFX u b ptiveness b
+! SFX u d siveness d
+! SFX u be ptiveness be
+! SFX u e tiveness ce
+! SFX u de siveness de
+! SFX u ke cativeness ke
+! SFX u e ptiveness me
+! SFX u e iveness [st]e
+! SFX u e ativeness [^bcdkmst]e
+! SFX u 0 lativeness [aeiou]l
+! SFX u 0 ativeness [^aeiou]l
+! SFX u 0 iveness [st]
+! SFX u y icativeness y
+! SFX u 0 ativeness [^abdeilosty]
+ SFX N Y 26
+! SFX N b ption b
+! SFX N d sion d
+! SFX N be ption be
+! SFX N e tion ce
+! SFX N de sion de
+! SFX N ke cation ke
+! SFX N e ption ume
+! SFX N e mation [^u]me
+! SFX N e ion [^o]se
+! SFX N e ition ose
+! SFX N e ation [iou]te
+! SFX N e ion [^iou]te
+! SFX N e ation [^bcdkmst]e
+! SFX N el ulsion el
+! SFX N 0 lation [aiou]l
+! SFX N 0 ation [^aeiou]l
+! SFX N 0 mation [aeiou]m
+! SFX N 0 ation [^aeiou]m
+! SFX N er ration er
+! SFX N 0 ation [^e]r
+! SFX N 0 ion [sx]
+! SFX N t ssion mit
+! SFX N 0 ion [^m]it
+! SFX N 0 ation [^i]t
+! SFX N y ication y
+! SFX N 0 ation [^bdelmrstxy]
+ SFX n Y 28
+! SFX n 0 tion a
+! SFX n e tion ce
+! SFX n ke cation ke
+! SFX n e ation [iou]te
+! SFX n e ion [^iou]te
+! SFX n e ation [^ckt]e
+! SFX n el ulsion el
+! SFX n 0 lation [aiou]l
+! SFX n 0 ation [^aeiou]l
+! SFX n er ration er
+! SFX n 0 ation [^e]r
+! SFX n y ation py
+! SFX n y ication [^p]y
+! SFX n 0 ation [^aelry]
+! SFX n 0 tions a
+! SFX n e tions ce
+! SFX n ke cations ke
+! SFX n e ations [iou]te
+! SFX n e ions [^iou]te
+! SFX n e ations [^ckt]e
+! SFX n el ulsions el
+! SFX n 0 lations [aiou]l
+! SFX n 0 ations [^aeiou]l
+! SFX n er rations er
+! SFX n 0 ations [^e]r
+! SFX n y ations py
+! SFX n y ications [^p]y
+! SFX n 0 ations [^aelry]
+ SFX X Y 26
+! SFX X b ptions b
+! SFX X d sions d
+! SFX X be ptions be
+! SFX X e tions ce
+! SFX X ke cations ke
+! SFX X de sions de
+! SFX X e ptions ume
+! SFX X e mations [^u]me
+! SFX X e ions [^o]se
+! SFX X e itions ose
+! SFX X e ations [iou]te
+! SFX X e ions [^iou]te
+! SFX X e ations [^bcdkmst]e
+! SFX X el ulsions el
+! SFX X 0 lations [aiou]l
+! SFX X 0 ations [^aeiou]l
+! SFX X 0 mations [aeiou]m
+! SFX X 0 ations [^aeiou]m
+! SFX X er rations er
+! SFX X 0 ations [^e]r
+! SFX X 0 ions [sx]
+! SFX X t ssions mit
+! SFX X 0 ions [^m]it
+! SFX X 0 ations [^i]t
+! SFX X y ications y
+! SFX X 0 ations [^bdelmrstxy]
+ SFX x Y 40
+! SFX x b ptional b
+! SFX x d sional d
+! SFX x be ptional be
+! SFX x e tional ce
+! SFX x ke cational ke
+! SFX x de sional de
+! SFX x e ional [^o]se
+! SFX x e itional ose
+! SFX x e ional te
+! SFX x e ational [^bcdkst]e
+! SFX x el ulsional el
+! SFX x 0 lational [aiou]l
+! SFX x 0 ational [^aeiou]l
+! SFX x er rational er
+! SFX x 0 ational [^e]r
+! SFX x 0 ional [sx]
+! SFX x 0 ional [^n]t
+! SFX x 0 ational nt
+! SFX x y icational y
+! SFX x 0 ational [^bdelrstxy]
+! SFX x b ptionally b
+! SFX x d sionally d
+! SFX x be ptionally be
+! SFX x e tionally ce
+! SFX x ke cationally ke
+! SFX x de sionally de
+! SFX x e ionally [^o]se
+! SFX x e itionally ose
+! SFX x e ionally te
+! SFX x e ationally [^bcdkst]e
+! SFX x el ulsionally el
+! SFX x 0 lationally [aiou]l
+! SFX x 0 ationally [^aeiou]l
+! SFX x er rationally er
+! SFX x 0 ationally [^e]r
+! SFX x 0 ionally [sx]
+! SFX x 0 ionally [^n]t
+! SFX x 0 ationally nt
+! SFX x y icationally y
+! SFX x 0 ationally [^bdelrstxy]
+ SFX H N 13
+! SFX H y ieth y
+! SFX H ree ird ree
+! SFX H ve fth ve
+! SFX H e th [^ev]e
+! SFX H 0 h t
+! SFX H 0 th [^ety]
+! SFX H y ieths y
+! SFX H ree irds ree
+! SFX H ve fths ve
+! SFX H e ths [^ev]e
+! SFX H 0 hs t
+! SFX H 0 ths [^ety]
+! SFX H 0 fold .
+ SFX Y Y 9
+! SFX Y 0 ally ic
+! SFX Y 0 ly [^i]c
+! SFX Y e y [^aeiou]le
+! SFX Y 0 ly [aeiou]le
+! SFX Y 0 ly [^l]e
+! SFX Y 0 y [^aeiou]l
+! SFX Y y ily [^aeiou]y
+! SFX Y 0 ly [aeiou][ly]
+! SFX Y 0 ly [^cely]
+ SFX G Y 24
+! SFX G e ing [^eioy]e
+! SFX G 0 ing [eoy]e
+! SFX G ie ying ie
+! SFX G 0 bing [^aeio][aeiou]b
+! SFX G 0 king [^aeio][aeiou]c
+! SFX G 0 ding [^aeio][aeiou]d
+! SFX G 0 fing [^aeio][aeiou]f
+! SFX G 0 ging [^aeio][aeiou]g
+! SFX G 0 king [^aeio][aeiou]k
+! SFX G 0 ling [^aeio][eiou]l
+! SFX G 0 ing [aeio][eiou]l
+! SFX G 0 ling [^aeo]al
+! SFX G 0 ing [aeo]al
+! SFX G 0 ming [^aeio][aeiou]m
+! SFX G 0 ning [^aeio][aeiou]n
+! SFX G 0 ping [^aeio][aeiou]p
+! SFX G 0 ring [^aeio][aeiou]r
+! SFX G 0 sing [^aeio][aeiou]s
+! SFX G 0 ting [^aeio][aeiou]t
+! SFX G 0 ving [^aeio][aeiou]v
+! SFX G 0 zing [^aeio][aeiou]z
+! SFX G 0 ing [aeio][aeiou][bcdfgkmnprstvz]
+! SFX G 0 ing [^aeiou][bcdfgklmnprstvz]
+! SFX G 0 ing [^ebcdfgklmnprstvz]
+ SFX J Y 25
+! SFX J e ings [^eioy]e
+! SFX J 0 ings [eoy]e
+! SFX J ie yings ie
+! SFX J 0 bings [^aeio][aeiou]b
+! SFX J 0 king [^aeio][aeiou]c
+! SFX J 0 dings [^aeio][aeiou]d
+! SFX J 0 fings [^aeio][aeiou]f
+! SFX J 0 gings [^aeio][aeiou]g
+! SFX J 0 kings [^aeio][aeiou]k
+! SFX J 0 lings [^aeio][eiou]l
+! SFX J 0 ings [aeio][eiou]l
+! SFX J 0 lings [^aeo]al
+! SFX J 0 ings [aeo]al
+! SFX J 0 mings [^aeio][aeiou]m
+! SFX J 0 nings [^aeio][aiou]n
+! SFX J 0 pings [^aeio][aeiou]p
+! SFX J 0 rings [^aeio][aiou]r
+! SFX J 0 sings [^aeio][aeiou]s
+! SFX J 0 tings [^aeio][aiou]t
+! SFX J 0 vings [^aeio][aeiou]v
+! SFX J 0 zings [^aeio][aeiou]z
+! SFX J 0 ings [^aeio]e[nrt]
+! SFX J 0 ings [aeio][aeiou][bcdfgkmnprstvz]
+! SFX J 0 ings [^aeiou][bcdfgklmnprstvz]
+! SFX J 0 ings [^ebcdfgklmnprstvz]
+ SFX k Y 8
+! SFX k e ingly [^eioy]e
+! SFX k 0 ingly [eoy]e
+! SFX k ie yingly ie
+! SFX k 0 kingly [^aeio][aeiou]c
+! SFX k 0 lingly [^aeio][aeiou]l
+! SFX k 0 ingly [aeio][aeiou][cl]
+! SFX k 0 ingly [^aeiou][cl]
+! SFX k 0 ingly [^ecl]
+ SFX D Y 25
+! SFX D 0 d [^e]e
+! SFX D e d ee
+! SFX D 0 bed [^aeio][aeiou]b
+! SFX D 0 ked [^aeio][aeiou]c
+! SFX D 0 ded [^aeio][aeiou]d
+! SFX D 0 fed [^aeio][aeiou]f
+! SFX D 0 ged [^aeio][aeiou]g
+! SFX D 0 ked [^aeio][aeiou]k
+! SFX D 0 led [^aeio][eiou]l
+! SFX D 0 ed [aeio][eiou]l
+! SFX D 0 led [^aeo]al
+! SFX D 0 ed [aeo]al
+! SFX D 0 med [^aeio][aeiou]m
+! SFX D 0 ned [^aeio][aeiou]n
+! SFX D 0 ped [^aeio][aeiou]p
+! SFX D 0 red [^aeio][aeiou]r
+! SFX D 0 sed [^aeio][aeiou]s
+! SFX D 0 ted [^aeio][aeiou]t
+! SFX D 0 ved [^aeio][aeiou]v
+! SFX D 0 zed [^aeio][aeiou]z
+! SFX D y ied [^aeiou]y
+! SFX D 0 ed [aeiou]y
+! SFX D 0 ed [aeio][aeiou][bcdfgkmnprstvz]
+! SFX D 0 ed [^aeiou][bcdfgklmnprstvz]
+! SFX D 0 ed [^ebcdfgklmnprstvyz]
+ SFX d Y 16
+! SFX d 0 d e
+! SFX d 0 ked [^aeio][aeiou]c
+! SFX d 0 led [^aeio][aeiou]l
+! SFX d y ied [^aeiou]y
+! SFX d 0 ed [aeiou]y
+! SFX d 0 ed [aeio][aeiou][cl]
+! SFX d 0 ed [^aeiou][cl]
+! SFX d 0 ed [^ecly]
+! SFX d e ing [^eioy]e
+! SFX d 0 ing [eoy]e
+! SFX d ie ying ie
+! SFX d 0 king [^aeio][aeiou]c
+! SFX d 0 ling [^aeio][aeiou]l
+! SFX d 0 ing [aeio][aeiou][cl]
+! SFX d 0 ing [^aeiou][cl]
+! SFX d 0 ing [^ecl]
+ SFX h Y 22
+! SFX h 0 dly e
+! SFX h 0 bedly [^aeio][aeiou]b
+! SFX h 0 kedly [^aeio][aeiou]c
+! SFX h 0 dedly [^aeio][aeiou]d
+! SFX h 0 fedly [^aeio][aeiou]f
+! SFX h 0 gedly [^aeio][aeiou]g
+! SFX h 0 kedly [^aeio][aeiou]k
+! SFX h 0 ledly [^aeio][aeiou]l
+! SFX h 0 medly [^aeio][aeiou]m
+! SFX h 0 nedly [^aeio][aiou]n
+! SFX h 0 pedly [^aeio][aeiou]p
+! SFX h 0 redly [^aeio][aiou]r
+! SFX h 0 sedly [^aeio][aeiou]s
+! SFX h 0 tedly [^aeio][aiou]t
+! SFX h 0 vedly [^aeio][aeiou]v
+! SFX h 0 zedly [^aeio][aeiou]z
+! SFX h 0 edly [^aeio]e[nrt]
+! SFX h y iedly [^aeiou]y
+! SFX h 0 edly [aeiou]y
+! SFX h 0 edly [aeio][aeiou][bcdfgklmnprstvz]
+! SFX h 0 edly [^aeiou][bcdfgklmnprstvz]
+! SFX h 0 edly [^ebcdfgklmnprstvyz]
+ SFX i Y 22
+! SFX i 0 dness e
+! SFX i 0 bedness [^aeio][aeiou]b
+! SFX i 0 kedness [^aeio][aeiou]c
+! SFX i 0 dedness [^aeio][aeiou]d
+! SFX i 0 fedness [^aeio][aeiou]f
+! SFX i 0 gedness [^aeio][aeiou]g
+! SFX i 0 kedness [^aeio][aeiou]k
+! SFX i 0 ledness [^aeio][aeiou]l
+! SFX i 0 medness [^aeio][aeiou]m
+! SFX i 0 nedness [^aeio][aiou]n
+! SFX i 0 pedness [^aeio][aeiou]p
+! SFX i 0 redness [^aeio][aiou]r
+! SFX i 0 sedness [^aeio][aeiou]s
+! SFX i 0 tedness [^aeio][aiou]t
+! SFX i 0 vedness [^aeio][aeiou]v
+! SFX i 0 zedness [^aeio][aeiou]z
+! SFX i 0 edness [^aeio]e[nrt]
+! SFX i y iedness [^aeiou]y
+! SFX i 0 edness [aeiou]y
+! SFX i 0 edness [aeio][aeiou][bcdfgklmnprstvz]
+! SFX i 0 edness [^aeiou][bcdfgklmnprstvz]
+! SFX i 0 edness [^ebcdfgklmnprstvyz]
+ SFX T Y 42
+! SFX T 0 r e
+ SFX T 0 st e
+! SFX T 0 ber [^aeio][aeiou]b
+ SFX T 0 best [^aeio][aeiou]b
+! SFX T 0 ker [^aeio][aeiou]c
+ SFX T 0 kest [^aeio][aeiou]c
+! SFX T 0 der [^aeio][aeiou]d
+ SFX T 0 dest [^aeio][aeiou]d
+! SFX T 0 fer [^aeio][aeiou]f
+ SFX T 0 fest [^aeio][aeiou]f
+! SFX T 0 ger [^aeio][aeiou]g
+ SFX T 0 gest [^aeio][aeiou]g
+! SFX T 0 ker [^aeio][aeiou]k
+ SFX T 0 kest [^aeio][aeiou]k
+! SFX T 0 ler [^aeio][aeiou]l
+ SFX T 0 lest [^aeio][aeiou]l
+! SFX T 0 mer [^aeio][aeiou]m
+ SFX T 0 mest [^aeio][aeiou]m
+! SFX T 0 ner [^aeio][aeiou]n
+ SFX T 0 nest [^aeio][aeiou]n
+! SFX T 0 per [^aeio][aeiou]p
+ SFX T 0 pest [^aeio][aeiou]p
+! SFX T 0 rer [^aeio][aeiou]r
+ SFX T 0 rest [^aeio][aeiou]r
+! SFX T 0 ser [^aeio][aeiou]s
+ SFX T 0 sest [^aeio][aeiou]s
+! SFX T 0 ter [^aeio][aeiou]t
+ SFX T 0 test [^aeio][aeiou]t
+! SFX T 0 ver [^aeio][aeiou]v
+ SFX T 0 vest [^aeio][aeiou]v
+! SFX T 0 zer [^aeio][aeiou]z
+ SFX T 0 zest [^aeio][aeiou]z
+! SFX T y ier [^aeiou]y
+ SFX T y iest [^aeiou]y
+! SFX T 0 er [aeiou]y
+ SFX T 0 est [aeiou]y
+--- 254,648 ----
+ PFX F 0 col l
+! PFX F 0 con [^abehilmopru].
+ PFX K Y 1
+! PFX K 0 pre .
+ PFX e Y 1
+! PFX e 0 out .
+ PFX f Y 2
+! PFX f 0 under [^r]
+! PFX f 0 under- r
+ PFX O Y 1
+! PFX O 0 non- .
+ PFX 4 Y 1
+! PFX 4 0 trans .
+ SFX V Y 15
+! SFX V 0 tive [aio]
+! SFX V b ptive b
+! SFX V d sive d
+! SFX V be ptive be
+! SFX V e tive ce
+! SFX V de sive de
+! SFX V ke cative ke
+! SFX V e ptive me
+! SFX V e ive [st]e
+! SFX V e ative [^bcdkmst]e
+! SFX V 0 lative [aeiou]l
+! SFX V 0 ative [^aeiou]l
+! SFX V 0 ive [st]
+! SFX V y icative y
+! SFX V 0 ative [^abdeilosty]
+ SFX v Y 15
+! SFX v 0 tively [aio]
+! SFX v b ptively b
+! SFX v d sively d
+! SFX v be ptively be
+! SFX v e tively ce
+! SFX v de sively de
+! SFX v ke catively ke
+! SFX v e ptively me
+! SFX v e ively [st]e
+! SFX v e atively [^bcdkmst]e
+! SFX v 0 latively [aeiou]l
+! SFX v 0 atively [^aeiou]l
+! SFX v 0 ively [st]
+! SFX v y icatively y
+! SFX v 0 atively [^abdeilosty]
+ SFX u Y 15
+! SFX u 0 tiveness [aio]
+! SFX u b ptiveness b
+! SFX u d siveness d
+! SFX u be ptiveness be
+! SFX u e tiveness ce
+! SFX u de siveness de
+! SFX u ke cativeness ke
+! SFX u e ptiveness me
+! SFX u e iveness [st]e
+! SFX u e ativeness [^bcdkmst]e
+! SFX u 0 lativeness [aeiou]l
+! SFX u 0 ativeness [^aeiou]l
+! SFX u 0 iveness [st]
+! SFX u y icativeness y
+! SFX u 0 ativeness [^abdeilosty]
+ SFX N Y 26
+! SFX N b ption b
+! SFX N d sion d
+! SFX N be ption be
+! SFX N e tion ce
+! SFX N de sion de
+! SFX N ke cation ke
+! SFX N e ption ume
+! SFX N e mation [^u]me
+! SFX N e ion [^o]se
+! SFX N e ition ose
+! SFX N e ation [iou]te
+! SFX N e ion [^iou]te
+! SFX N e ation [^bcdkmst]e
+! SFX N el ulsion el
+! SFX N 0 lation [aiou]l
+! SFX N 0 ation [^aeiou]l
+! SFX N 0 mation [aeiou]m
+! SFX N 0 ation [^aeiou]m
+! SFX N er ration er
+! SFX N 0 ation [^e]r
+! SFX N 0 ion [sx]
+! SFX N t ssion mit
+! SFX N 0 ion [^m]it
+! SFX N 0 ation [^i]t
+! SFX N y ication y
+! SFX N 0 ation [^bdelmrstxy]
+ SFX n Y 28
+! SFX n 0 tion a
+! SFX n e tion ce
+! SFX n ke cation ke
+! SFX n e ation [iou]te
+! SFX n e ion [^iou]te
+! SFX n e ation [^ckt]e
+! SFX n el ulsion el
+! SFX n 0 lation [aiou]l
+! SFX n 0 ation [^aeiou]l
+! SFX n er ration er
+! SFX n 0 ation [^e]r
+! SFX n y ation py
+! SFX n y ication [^p]y
+! SFX n 0 ation [^aelry]
+! SFX n 0 tions a
+! SFX n e tions ce
+! SFX n ke cations ke
+! SFX n e ations [iou]te
+! SFX n e ions [^iou]te
+! SFX n e ations [^ckt]e
+! SFX n el ulsions el
+! SFX n 0 lations [aiou]l
+! SFX n 0 ations [^aeiou]l
+! SFX n er rations er
+! SFX n 0 ations [^e]r
+! SFX n y ations py
+! SFX n y ications [^p]y
+! SFX n 0 ations [^aelry]
+ SFX X Y 26
+! SFX X b ptions b
+! SFX X d sions d
+! SFX X be ptions be
+! SFX X e tions ce
+! SFX X ke cations ke
+! SFX X de sions de
+! SFX X e ptions ume
+! SFX X e mations [^u]me
+! SFX X e ions [^o]se
+! SFX X e itions ose
+! SFX X e ations [iou]te
+! SFX X e ions [^iou]te
+! SFX X e ations [^bcdkmst]e
+! SFX X el ulsions el
+! SFX X 0 lations [aiou]l
+! SFX X 0 ations [^aeiou]l
+! SFX X 0 mations [aeiou]m
+! SFX X 0 ations [^aeiou]m
+! SFX X er rations er
+! SFX X 0 ations [^e]r
+! SFX X 0 ions [sx]
+! SFX X t ssions mit
+! SFX X 0 ions [^m]it
+! SFX X 0 ations [^i]t
+! SFX X y ications y
+! SFX X 0 ations [^bdelmrstxy]
+ SFX x Y 40
+! SFX x b ptional b
+! SFX x d sional d
+! SFX x be ptional be
+! SFX x e tional ce
+! SFX x ke cational ke
+! SFX x de sional de
+! SFX x e ional [^o]se
+! SFX x e itional ose
+! SFX x e ional te
+! SFX x e ational [^bcdkst]e
+! SFX x el ulsional el
+! SFX x 0 lational [aiou]l
+! SFX x 0 ational [^aeiou]l
+! SFX x er rational er
+! SFX x 0 ational [^e]r
+! SFX x 0 ional [sx]
+! SFX x 0 ional [^n]t
+! SFX x 0 ational nt
+! SFX x y icational y
+! SFX x 0 ational [^bdelrstxy]
+! SFX x b ptionally b
+! SFX x d sionally d
+! SFX x be ptionally be
+! SFX x e tionally ce
+! SFX x ke cationally ke
+! SFX x de sionally de
+! SFX x e ionally [^o]se
+! SFX x e itionally ose
+! SFX x e ionally te
+! SFX x e ationally [^bcdkst]e
+! SFX x el ulsionally el
+! SFX x 0 lationally [aiou]l
+! SFX x 0 ationally [^aeiou]l
+! SFX x er rationally er
+! SFX x 0 ationally [^e]r
+! SFX x 0 ionally [sx]
+! SFX x 0 ionally [^n]t
+! SFX x 0 ationally nt
+! SFX x y icationally y
+! SFX x 0 ationally [^bdelrstxy]
+ SFX H N 13
+! SFX H y ieth y
+! SFX H ree ird ree
+! SFX H ve fth ve
+! SFX H e th [^ev]e
+! SFX H 0 h t
+! SFX H 0 th [^ety]
+! SFX H y ieths y
+! SFX H ree irds ree
+! SFX H ve fths ve
+! SFX H e ths [^ev]e
+! SFX H 0 hs t
+! SFX H 0 ths [^ety]
+! SFX H 0 fold .
+ SFX Y Y 9
+! SFX Y 0 ally ic
+! SFX Y 0 ly [^i]c
+! SFX Y e y [^aeiou]le
+! SFX Y 0 ly [aeiou]le
+! SFX Y 0 ly [^l]e
+! SFX Y 0 y [^aeiou]l
+! SFX Y y ily [^aeiou]y
+! SFX Y 0 ly [aeiou][ly]
+! SFX Y 0 ly [^cely]
+ SFX G Y 24
+! SFX G e ing [^eioy]e
+! SFX G 0 ing [eoy]e
+! SFX G ie ying ie
+! SFX G 0 bing [^aeio][aeiou]b
+! SFX G 0 king [^aeio][aeiou]c
+! SFX G 0 ding [^aeio][aeiou]d
+! SFX G 0 fing [^aeio][aeiou]f
+! SFX G 0 ging [^aeio][aeiou]g
+! SFX G 0 king [^aeio][aeiou]k
+! SFX G 0 ling [^aeio][eiou]l
+! SFX G 0 ing [aeio][eiou]l
+! SFX G 0 ling [^aeo]al
+! SFX G 0 ing [aeo]al
+! SFX G 0 ming [^aeio][aeiou]m
+! SFX G 0 ning [^aeio][aeiou]n
+! SFX G 0 ping [^aeio][aeiou]p
+! SFX G 0 ring [^aeio][aeiou]r
+! SFX G 0 sing [^aeio][aeiou]s
+! SFX G 0 ting [^aeio][aeiou]t
+! SFX G 0 ving [^aeio][aeiou]v
+! SFX G 0 zing [^aeio][aeiou]z
+! SFX G 0 ing [aeio][aeiou][bcdfgkmnprstvz]
+! SFX G 0 ing [^aeiou][bcdfgklmnprstvz]
+! SFX G 0 ing [^ebcdfgklmnprstvz]
+ SFX J Y 25
+! SFX J e ings [^eioy]e
+! SFX J 0 ings [eoy]e
+! SFX J ie yings ie
+! SFX J 0 bings [^aeio][aeiou]b
+! SFX J 0 king [^aeio][aeiou]c
+! SFX J 0 dings [^aeio][aeiou]d
+! SFX J 0 fings [^aeio][aeiou]f
+! SFX J 0 gings [^aeio][aeiou]g
+! SFX J 0 kings [^aeio][aeiou]k
+! SFX J 0 lings [^aeio][eiou]l
+! SFX J 0 ings [aeio][eiou]l
+! SFX J 0 lings [^aeo]al
+! SFX J 0 ings [aeo]al
+! SFX J 0 mings [^aeio][aeiou]m
+! SFX J 0 nings [^aeio][aiou]n
+! SFX J 0 pings [^aeio][aeiou]p
+! SFX J 0 rings [^aeio][aiou]r
+! SFX J 0 sings [^aeio][aeiou]s
+! SFX J 0 tings [^aeio][aiou]t
+! SFX J 0 vings [^aeio][aeiou]v
+! SFX J 0 zings [^aeio][aeiou]z
+! SFX J 0 ings [^aeio]e[nrt]
+! SFX J 0 ings [aeio][aeiou][bcdfgkmnprstvz]
+! SFX J 0 ings [^aeiou][bcdfgklmnprstvz]
+! SFX J 0 ings [^ebcdfgklmnprstvz]
+ SFX k Y 8
+! SFX k e ingly [^eioy]e
+! SFX k 0 ingly [eoy]e
+! SFX k ie yingly ie
+! SFX k 0 kingly [^aeio][aeiou]c
+! SFX k 0 lingly [^aeio][aeiou]l
+! SFX k 0 ingly [aeio][aeiou][cl]
+! SFX k 0 ingly [^aeiou][cl]
+! SFX k 0 ingly [^ecl]
+ SFX D Y 25
+! SFX D 0 d [^e]e
+! SFX D e d ee
+! SFX D 0 bed [^aeio][aeiou]b
+! SFX D 0 ked [^aeio][aeiou]c
+! SFX D 0 ded [^aeio][aeiou]d
+! SFX D 0 fed [^aeio][aeiou]f
+! SFX D 0 ged [^aeio][aeiou]g
+! SFX D 0 ked [^aeio][aeiou]k
+! SFX D 0 led [^aeio][eiou]l
+! SFX D 0 ed [aeio][eiou]l
+! SFX D 0 led [^aeo]al
+! SFX D 0 ed [aeo]al
+! SFX D 0 med [^aeio][aeiou]m
+! SFX D 0 ned [^aeio][aeiou]n
+! SFX D 0 ped [^aeio][aeiou]p
+! SFX D 0 red [^aeio][aeiou]r
+! SFX D 0 sed [^aeio][aeiou]s
+! SFX D 0 ted [^aeio][aeiou]t
+! SFX D 0 ved [^aeio][aeiou]v
+! SFX D 0 zed [^aeio][aeiou]z
+! SFX D y ied [^aeiou]y
+! SFX D 0 ed [aeiou]y
+! SFX D 0 ed [aeio][aeiou][bcdfgkmnprstvz]
+! SFX D 0 ed [^aeiou][bcdfgklmnprstvz]
+! SFX D 0 ed [^ebcdfgklmnprstvyz]
+ SFX d Y 16
+! SFX d 0 d e
+! SFX d 0 ked [^aeio][aeiou]c
+! SFX d 0 led [^aeio][aeiou]l
+! SFX d y ied [^aeiou]y
+! SFX d 0 ed [aeiou]y
+! SFX d 0 ed [aeio][aeiou][cl]
+! SFX d 0 ed [^aeiou][cl]
+! SFX d 0 ed [^ecly]
+! SFX d e ing [^eioy]e
+! SFX d 0 ing [eoy]e
+! SFX d ie ying ie
+! SFX d 0 king [^aeio][aeiou]c
+! SFX d 0 ling [^aeio][aeiou]l
+! SFX d 0 ing [aeio][aeiou][cl]
+! SFX d 0 ing [^aeiou][cl]
+! SFX d 0 ing [^ecl]
+ SFX h Y 22
+! SFX h 0 dly e
+! SFX h 0 bedly [^aeio][aeiou]b
+! SFX h 0 kedly [^aeio][aeiou]c
+! SFX h 0 dedly [^aeio][aeiou]d
+! SFX h 0 fedly [^aeio][aeiou]f
+! SFX h 0 gedly [^aeio][aeiou]g
+! SFX h 0 kedly [^aeio][aeiou]k
+! SFX h 0 ledly [^aeio][aeiou]l
+! SFX h 0 medly [^aeio][aeiou]m
+! SFX h 0 nedly [^aeio][aiou]n
+! SFX h 0 pedly [^aeio][aeiou]p
+! SFX h 0 redly [^aeio][aiou]r
+! SFX h 0 sedly [^aeio][aeiou]s
+! SFX h 0 tedly [^aeio][aiou]t
+! SFX h 0 vedly [^aeio][aeiou]v
+! SFX h 0 zedly [^aeio][aeiou]z
+! SFX h 0 edly [^aeio]e[nrt]
+! SFX h y iedly [^aeiou]y
+! SFX h 0 edly [aeiou]y
+! SFX h 0 edly [aeio][aeiou][bcdfgklmnprstvz]
+! SFX h 0 edly [^aeiou][bcdfgklmnprstvz]
+! SFX h 0 edly [^ebcdfgklmnprstvyz]
+ SFX i Y 22
+! SFX i 0 dness e
+! SFX i 0 bedness [^aeio][aeiou]b
+! SFX i 0 kedness [^aeio][aeiou]c
+! SFX i 0 dedness [^aeio][aeiou]d
+! SFX i 0 fedness [^aeio][aeiou]f
+! SFX i 0 gedness [^aeio][aeiou]g
+! SFX i 0 kedness [^aeio][aeiou]k
+! SFX i 0 ledness [^aeio][aeiou]l
+! SFX i 0 medness [^aeio][aeiou]m
+! SFX i 0 nedness [^aeio][aiou]n
+! SFX i 0 pedness [^aeio][aeiou]p
+! SFX i 0 redness [^aeio][aiou]r
+! SFX i 0 sedness [^aeio][aeiou]s
+! SFX i 0 tedness [^aeio][aiou]t
+! SFX i 0 vedness [^aeio][aeiou]v
+! SFX i 0 zedness [^aeio][aeiou]z
+! SFX i 0 edness [^aeio]e[nrt]
+! SFX i y iedness [^aeiou]y
+! SFX i 0 edness [aeiou]y
+! SFX i 0 edness [aeio][aeiou][bcdfgklmnprstvz]
+! SFX i 0 edness [^aeiou][bcdfgklmnprstvz]
+! SFX i 0 edness [^ebcdfgklmnprstvyz]
+ SFX T Y 42
+! SFX T 0 r e
+ SFX T 0 st e
+! SFX T 0 ber [^aeio][aeiou]b
+ SFX T 0 best [^aeio][aeiou]b
+! SFX T 0 ker [^aeio][aeiou]c
+ SFX T 0 kest [^aeio][aeiou]c
+! SFX T 0 der [^aeio][aeiou]d
+ SFX T 0 dest [^aeio][aeiou]d
+! SFX T 0 fer [^aeio][aeiou]f
+ SFX T 0 fest [^aeio][aeiou]f
+! SFX T 0 ger [^aeio][aeiou]g
+ SFX T 0 gest [^aeio][aeiou]g
+! SFX T 0 ker [^aeio][aeiou]k
+ SFX T 0 kest [^aeio][aeiou]k
+! SFX T 0 ler [^aeio][aeiou]l
+ SFX T 0 lest [^aeio][aeiou]l
+! SFX T 0 mer [^aeio][aeiou]m
+ SFX T 0 mest [^aeio][aeiou]m
+! SFX T 0 ner [^aeio][aeiou]n
+ SFX T 0 nest [^aeio][aeiou]n
+! SFX T 0 per [^aeio][aeiou]p
+ SFX T 0 pest [^aeio][aeiou]p
+! SFX T 0 rer [^aeio][aeiou]r
+ SFX T 0 rest [^aeio][aeiou]r
+! SFX T 0 ser [^aeio][aeiou]s
+ SFX T 0 sest [^aeio][aeiou]s
+! SFX T 0 ter [^aeio][aeiou]t
+ SFX T 0 test [^aeio][aeiou]t
+! SFX T 0 ver [^aeio][aeiou]v
+ SFX T 0 vest [^aeio][aeiou]v
+! SFX T 0 zer [^aeio][aeiou]z
+ SFX T 0 zest [^aeio][aeiou]z
+! SFX T y ier [^aeiou]y
+ SFX T y iest [^aeiou]y
+! SFX T 0 er [aeiou]y
+ SFX T 0 est [aeiou]y
+***************
+*** 500,1185 ****
+ SFX R Y 72
+! SFX R 0 r e
+! SFX R 0 rs e
+! SFX R 0 ber [^aeio][aeiou]b
+! SFX R 0 bers [^aeio][aeiou]b
+! SFX R 0 ker [^aeio][aeiou]c
+! SFX R 0 kers [^aeio][aeiou]c
+! SFX R 0 der [^aeio][aeiou]d
+! SFX R 0 ders [^aeio][aeiou]d
+! SFX R 0 fer [^aeio][aeiou]f
+! SFX R 0 fers [^aeio][aeiou]f
+! SFX R 0 ger [^aeio][aeiou]g
+! SFX R 0 gers [^aeio][aeiou]g
+! SFX R 0 ker [^aeio][aeiou]k
+! SFX R 0 kers [^aeio][aeiou]k
+! SFX R 0 ler [^aeio][eiou]l
+! SFX R 0 er [aeio][eiou]l
+! SFX R 0 ler [^aeo]al
+! SFX R 0 er [aeo]al
+! SFX R 0 lers [^aeio][eiou]l
+! SFX R 0 ers [aeio][eiou]l
+! SFX R 0 lers [^aeo]al
+! SFX R 0 ers [aeo]al
+! SFX R 0 mer [^aeio][aeiou]m
+! SFX R 0 mers [^aeio][aeiou]m
+! SFX R 0 ner [^aeio][aeiou]n
+! SFX R 0 ners [^aeio][aeiou]n
+! SFX R 0 per [^aeio][aeiou]p
+! SFX R 0 pers [^aeio][aeiou]p
+! SFX R 0 rer [^aeio][aeiou]r
+! SFX R 0 rers [^aeio][aeiou]r
+! SFX R 0 ser [^aeio][aeiou]s
+! SFX R 0 sers [^aeio][aeiou]s
+! SFX R 0 ter [^aeio][aeiou]t
+! SFX R 0 ters [^aeio][aeiou]t
+! SFX R 0 ver [^aeio][aeiou]v
+! SFX R 0 vers [^aeio][aeiou]v
+! SFX R 0 zer [^aeio][aeiou]z
+! SFX R 0 zers [^aeio][aeiou]z
+! SFX R y ier [^aeiou]y
+! SFX R y iers [^aeiou]y
+! SFX R 0 er [aeiou]y
+! SFX R 0 ers [aeiou]y
+! SFX R 0 er [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 ers [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 er [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 ers [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 er [^ebcdfgklmnprstvyz]
+! SFX R 0 ers [^ebcdfgklmnprstvyz]
+! SFX R 0 r's e
+! SFX R 0 ber's [^aeio][aeiou]b
+! SFX R 0 ker's [^aeio][aeiou]c
+! SFX R 0 der's [^aeio][aeiou]d
+! SFX R 0 fer's [^aeio][aeiou]f
+! SFX R 0 ger's [^aeio][aeiou]g
+! SFX R 0 ker's [^aeio][aeiou]k
+! SFX R 0 ler's [^aeio][eiou]l
+! SFX R 0 er's [aeio][eiou]l
+! SFX R 0 ler's [^aeo]al
+! SFX R 0 er's [aeo]al
+! SFX R 0 mer's [^aeio][aeiou]m
+! SFX R 0 ner's [^aeio][aeiou]n
+! SFX R 0 per's [^aeio][aeiou]p
+! SFX R 0 rer's [^aeio][aeiou]r
+! SFX R 0 ser's [^aeio][aeiou]s
+! SFX R 0 ter's [^aeio][aeiou]t
+! SFX R 0 ver's [^aeio][aeiou]v
+! SFX R 0 zer's [^aeio][aeiou]z
+! SFX R y ier's [^aeiou]y
+! SFX R 0 er's [aeiou]y
+! SFX R 0 er's [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 er's [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 er's [^ebcdfgklmnprstvyz]
+ SFX r Y 24
+! SFX r 0 r e
+! SFX r 0 ler [^aeio][aeiou]l
+! SFX r 0 ker [^aeio][aeiou]c
+! SFX r y ier [^aeiou]y
+! SFX r 0 er [aeiou]y
+! SFX r 0 er [aeio][aeiou][cl]
+! SFX r 0 er [^aeiou][cl]
+! SFX r 0 er [^ecly]
+! SFX r 0 rs e
+! SFX r 0 lers [^aeio][aeiou]l
+! SFX r 0 kers [^aeio][aeiou]c
+! SFX r y iers [^aeiou]y
+! SFX r 0 ers [aeiou]y
+! SFX r 0 ers [aeio][aeiou][cl]
+! SFX r 0 ers [^aeiou][cl]
+! SFX r 0 ers [^ecly]
+! SFX r 0 r's e
+! SFX r 0 ler's [^aeio][aeiou]l
+! SFX r 0 ker's [^aeio][aeiou]c
+! SFX r y ier's [^aeiou]y
+! SFX r 0 er's [aeiou]y
+! SFX r 0 er's [aeio][aeiou][cl]
+! SFX r 0 er's [^aeiou][cl]
+! SFX r 0 er's [^ecly]
+ SFX S Y 9
+! SFX S y ies [^aeiou]y
+! SFX S 0 s [aeiou]y
+! SFX S 0 es [sxz]
+! SFX S 0 es [cs]h
+! SFX S 0 s [^cs]h
+! SFX S 0 s [ae]u
+! SFX S 0 x [ae]u
+! SFX S 0 s [^ae]u
+ SFX S 0 s [^hsuxyz]
+ SFX P Y 6
+! SFX P y iness [^aeiou]y
+! SFX P 0 ness [aeiou]y
+! SFX P 0 ness [^y]
+! SFX P y iness's [^aeiou]y
+! SFX P 0 ness's [aeiou]y
+! SFX P 0 ness's [^y]
+ SFX m Y 20
+! SFX m 0 sman [bdknmt]
+! SFX m 0 sman [aeiou][bdklmnt]e
+! SFX m 0 man [^aeiou][bdklmnt]e
+! SFX m 0 man [^bdklmnt]e
+! SFX m 0 man [^bdeknmt]
+! SFX m 0 smen [bdknmt]
+! SFX m 0 smen [aeiou][bdklmnt]e
+! SFX m 0 men [^aeiou][bdklmnt]e
+! SFX m 0 men [^bdklmnt]e
+! SFX m 0 men [^bdeknmt]
+! SFX m 0 sman's [bdknmt]
+! SFX m 0 sman's [aeiou][bdklmnt]e
+! SFX m 0 man's [^aeiou][bdklmnt]e
+! SFX m 0 man's [^bdklmnt]e
+! SFX m 0 man's [^bdeknmt]
+! SFX m 0 smen's [bdknmt]
+! SFX m 0 smen's [aeiou][bdklmnt]e
+! SFX m 0 men's [^aeiou][bdklmnt]e
+! SFX m 0 men's [^bdklmnt]e
+! SFX m 0 men's [^bdeknmt]
+ SFX 5 Y 15
+! SFX 5 0 swoman [bdknmt]
+! SFX 5 0 swoman [aeiou][bdklmnt]e
+! SFX 5 0 woman [^aeiou][bdklmnt]e
+! SFX 5 0 woman [^bdklmnt]e
+! SFX 5 0 woman [^bdeknmt]
+! SFX 5 0 swomen [bdknmt]
+! SFX 5 0 swomen [aeiou][bdklmnt]e
+! SFX 5 0 women [^aeiou][bdklmnt]e
+! SFX 5 0 women [^bdklmnt]e
+! SFX 5 0 women [^bdeknmt]
+! SFX 5 0 swoman's [bdknmt]
+! SFX 5 0 swoman's [aeiou][bdklmnt]e
+! SFX 5 0 woman's [^aeiou][bdklmnt]e
+! SFX 5 0 woman's [^bdklmnt]e
+! SFX 5 0 woman's [^bdeknmt]
+ SFX 6 Y 3
+! SFX 6 y iful [^aeiou]y
+! SFX 6 0 ful [aeiou]y
+! SFX 6 0 ful [^y]
+ SFX j Y 3
+! SFX j y ifully [^aeiou]y
+! SFX j 0 fully [aeiou]y
+! SFX j 0 fully [^y]
+ SFX p Y 5
+! SFX p y iless [^aeiou]y
+! SFX p 0 less [aeiou]y
+! SFX p 0 ess ll
+! SFX p 0 less [^l]l
+! SFX p 0 less [^ly]
+ SFX Q Y 88
+! SFX Q 0 tise a
+! SFX Q e ise [^l]e
+! SFX Q le ilise [^aeiou]le
+! SFX Q e ise [aeiou]le
+! SFX Q um ise um
+! SFX Q 0 ise [^u]m
+! SFX Q s se is
+! SFX Q 0 ise [^i]s
+! SFX Q y ise [^aeiou]y
+! SFX Q 0 ise [aeiou]y
+! SFX Q 0 ise [^aemsy]
+! SFX Q 0 tises a
+! SFX Q e ises [^l]e
+! SFX Q le ilises [^aeiou]le
+! SFX Q e ises [aeiou]le
+! SFX Q um ises um
+! SFX Q 0 ises [^u]m
+! SFX Q s ses is
+! SFX Q 0 ises [^i]s
+! SFX Q y ises [^aeiou]y
+! SFX Q 0 ises [aeiou]y
+! SFX Q 0 ises [^aemsy]
+! SFX Q 0 tised a
+! SFX Q e ised [^l]e
+! SFX Q le ilised [^aeiou]le
+! SFX Q e ised [aeiou]le
+! SFX Q um ised um
+! SFX Q 0 ised [^u]m
+! SFX Q s sed is
+! SFX Q 0 ised [^i]s
+! SFX Q y ised [^aeiou]y
+! SFX Q 0 ised [aeiou]y
+! SFX Q 0 ised [^aemsy]
+! SFX Q 0 tising a
+! SFX Q e ising [^l]e
+! SFX Q le ilising [^aeiou]le
+! SFX Q e ising [aeiou]le
+! SFX Q um ising um
+! SFX Q 0 ising [^u]m
+! SFX Q s sing is
+! SFX Q 0 ising [^i]s
+! SFX Q y ising [^aeiou]y
+! SFX Q 0 ising [aeiou]y
+! SFX Q 0 ising [^aemsy]
+! SFX Q 0 tize a
+! SFX Q e ize [^l]e
+! SFX Q le ilize [^aeiou]le
+! SFX Q e ize [aeiou]le
+! SFX Q um ize um
+! SFX Q 0 ize [^u]m
+! SFX Q s ze is
+! SFX Q 0 ize [^i]s
+! SFX Q y ize [^aeiou]y
+! SFX Q 0 ize [aeiou]y
+! SFX Q 0 ize [^aemsy]
+! SFX Q 0 tizes a
+! SFX Q e izes [^l]e
+! SFX Q le ilizes [^aeiou]le
+! SFX Q e izes [aeiou]le
+! SFX Q um izes um
+! SFX Q 0 izes [^u]m
+! SFX Q s zes is
+! SFX Q 0 izes [^i]s
+! SFX Q y izes [^aeiou]y
+! SFX Q 0 izes [aeiou]y
+! SFX Q 0 izes [^aemsy]
+! SFX Q 0 tized a
+! SFX Q e ized [^l]e
+! SFX Q le ilized [^aeiou]le
+! SFX Q e ized [aeiou]le
+! SFX Q um ized um
+! SFX Q 0 ized [^u]m
+! SFX Q s zed is
+! SFX Q 0 ized [^i]s
+! SFX Q y ized [^aeiou]y
+! SFX Q 0 ized [aeiou]y
+! SFX Q 0 ized [^aemsy]
+! SFX Q 0 tizing a
+! SFX Q e izing [^l]e
+! SFX Q le ilizing [^aeiou]le
+! SFX Q e izing [aeiou]le
+! SFX Q um izing um
+! SFX Q 0 izing [^u]m
+! SFX Q s zing is
+! SFX Q 0 izing [^i]s
+! SFX Q y izing [^aeiou]y
+! SFX Q 0 izing [aeiou]y
+! SFX Q 0 izing [^aemsy]
+ SFX q Y 44
+! SFX q 0 tisation a
+! SFX q e isation [^l]e
+! SFX q le ilisation [^aeiou]le
+! SFX q e isation [aeiou]le
+! SFX q um isation um
+! SFX q 0 isation [^u]m
+! SFX q s sation is
+! SFX q 0 isation [^i]s
+! SFX q y isation [^aeiou]y
+! SFX q 0 isation [aeiou]y
+! SFX q 0 isation [^aemsy]
+! SFX q 0 tisations a
+! SFX q e isations [^l]e
+! SFX q le ilisations [^aeiou]le
+! SFX q e isations [aeiou]le
+! SFX q um isations um
+! SFX q 0 isations [^u]m
+! SFX q s sations is
+! SFX q 0 isations [^i]s
+! SFX q y isations [^aeiou]y
+! SFX q 0 isations [aeiou]y
+! SFX q 0 isations [^aemsy]
+! SFX q 0 tization a
+! SFX q e ization [^l]e
+! SFX q le ilization [^aeiou]le
+! SFX q e ization [aeiou]le
+! SFX q um ization um
+! SFX q 0 ization [^u]m
+! SFX q s zation is
+! SFX q 0 ization [^i]s
+! SFX q y ization [^aeiou]y
+! SFX q 0 ization [aeiou]y
+! SFX q 0 ization [^aemsy]
+! SFX q 0 tizations a
+! SFX q e izations [^l]e
+! SFX q le ilizations [^aeiou]le
+! SFX q e izations [aeiou]le
+! SFX q um izations um
+! SFX q 0 izations [^u]m
+! SFX q s zations is
+! SFX q 0 izations [^i]s
+! SFX q y izations [^aeiou]y
+! SFX q 0 izations [aeiou]y
+! SFX q 0 izations [^aemsy]
+ SFX s Y 66
+! SFX s 0 tiser a
+! SFX s e iser [^l]e
+! SFX s le iliser [^aeiou]le
+! SFX s e iser [aeiou]le
+! SFX s um iser um
+! SFX s 0 iser [^u]m
+! SFX s s ser is
+! SFX s 0 iser [^i]s
+! SFX s y iser [^aeiou]y
+! SFX s 0 iser [aeiou]y
+! SFX s 0 iser [^aemsy]
+! SFX s 0 tisers a
+! SFX s e isers [^l]e
+! SFX s le ilisers [^aeiou]le
+! SFX s e isers [aeiou]le
+! SFX s um isers um
+! SFX s 0 isers [^u]m
+! SFX s s sers is
+! SFX s 0 isers [^i]s
+! SFX s y isers [^aeiou]y
+! SFX s 0 isers [aeiou]y
+! SFX s 0 isers [^aemsy]
+! SFX s 0 tiser's a
+! SFX s e iser's [^l]e
+! SFX s le iliser's [^aeiou]le
+! SFX s e iser's [aeiou]le
+! SFX s um iser's um
+! SFX s 0 iser's [^u]m
+! SFX s s ser's is
+! SFX s 0 iser's [^i]s
+! SFX s y iser's [^aeiou]y
+! SFX s 0 iser's [aeiou]y
+! SFX s 0 iser's [^aemsy]
+! SFX s 0 tizer a
+! SFX s e izer [^l]e
+! SFX s le ilizer [^aeiou]le
+! SFX s e izer [aeiou]le
+! SFX s um izer um
+! SFX s 0 izer [^u]m
+! SFX s s zer is
+! SFX s 0 izer [^i]s
+! SFX s y izer [^aeiou]y
+! SFX s 0 izer [aeiou]y
+! SFX s 0 izer [^aemsy]
+! SFX s 0 tizers a
+! SFX s e izers [^l]e
+! SFX s le ilizers [^aeiou]le
+! SFX s e izers [aeiou]le
+! SFX s um izers um
+! SFX s 0 izers [^u]m
+! SFX s s zers is
+! SFX s 0 izers [^i]s
+! SFX s y izers [^aeiou]y
+! SFX s 0 izers [aeiou]y
+! SFX s 0 izers [^aemsy]
+! SFX s 0 tizer's a
+! SFX s e izer's [^l]e
+! SFX s le ilizer's [^aeiou]le
+! SFX s e izer's [aeiou]le
+! SFX s um izer's um
+! SFX s 0 izer's [^u]m
+! SFX s s zer's is
+! SFX s 0 izer's [^i]s
+! SFX s y izer's [^aeiou]y
+! SFX s 0 izer's [aeiou]y
+! SFX s 0 izer's [^aemsy]
+ SFX t Y 44
+! SFX t 0 tisable a
+! SFX t e isable [^l]e
+! SFX t le ilisable [^aeiou]le
+! SFX t e isable [aeiou]le
+! SFX t um isable um
+! SFX t 0 isable [^u]m
+! SFX t s sable is
+! SFX t 0 isable [^i]s
+! SFX t y isable [^aeiou]y
+! SFX t 0 isable [aeiou]y
+! SFX t 0 isable [^aemsy]
+! SFX t 0 tizable a
+! SFX t e izable [^l]e
+! SFX t le ilizable [^aeiou]le
+! SFX t e izable [aeiou]le
+! SFX t um izable um
+! SFX t 0 izable [^u]m
+! SFX t s zable is
+! SFX t 0 izable [^i]s
+! SFX t y izable [^aeiou]y
+! SFX t 0 izable [aeiou]y
+! SFX t 0 izable [^aemsy]
+! SFX t 0 tisability a
+! SFX t e isability [^l]e
+! SFX t le ilisability [^aeiou]le
+! SFX t e isability [aeiou]le
+! SFX t um isability um
+! SFX t 0 isability [^u]m
+! SFX t s sability is
+! SFX t 0 isability [^i]s
+! SFX t y isability [^aeiou]y
+! SFX t 0 isability [aeiou]y
+! SFX t 0 isability [^aemsy]
+! SFX t 0 tizability a
+! SFX t e izability [^l]e
+! SFX t le ilizability [^aeiou]le
+! SFX t e izability [aeiou]le
+! SFX t um izability um
+! SFX t 0 izability [^u]m
+! SFX t s zability is
+! SFX t 0 izability [^i]s
+! SFX t y izability [^aeiou]y
+! SFX t 0 izability [aeiou]y
+! SFX t 0 izability [^aemsy]
+ SFX M Y 1
+! SFX M 0 's .
+ SFX B Y 48
+! SFX B e able [^acegilotu]e
+! SFX B 0 able [acegilou]e
+! SFX B te ble ate
+! SFX B e able [^a]te
+! SFX B 0 bable [^aeio][aeiou]b
+! SFX B 0 kable [^aeio][aeiou]c
+! SFX B 0 dable [^aeio][aeiou]d
+! SFX B 0 fable [^aeio][aeiou]f
+! SFX B 0 gable [^aeio][aeiou]g
+! SFX B 0 kable [^aeio][aeiou]k
+! SFX B 0 lable [^aeio][aeiou]l
+! SFX B 0 mable [^aeio][aeiou]m
+! SFX B 0 nable [^aeio][aeiou]n
+! SFX B 0 pable [^aeio][aeiou]p
+! SFX B 0 rable [^aeio][aeiou]r
+! SFX B 0 sable [^aeio][aeiou]s
+! SFX B 0 table [^aeio][aeiou]t
+! SFX B 0 vable [^aeio][aeiou]v
+! SFX B 0 zable [^aeio][aeiou]z
+! SFX B 0 able [aeio][aeiou][bcdfgklmnprstvz]
+! SFX B 0 able [^aeiou][bcdfgklmnprstvz]
+! SFX B y iable [^aeiou]y
+! SFX B 0 able [aeiou]y
+! SFX B 0 able [^ebcdfgklmnprstvzy]
+! SFX B e ability [^acegilotu]e
+! SFX B 0 ability [acegilou]e
+! SFX B te bility ate
+! SFX B e ability [^a]te
+! SFX B 0 bability [^aeio][aeiou]b
+! SFX B 0 kability [^aeio][aeiou]c
+! SFX B 0 dability [^aeio][aeiou]d
+! SFX B 0 fability [^aeio][aeiou]f
+! SFX B 0 gability [^aeio][aeiou]g
+! SFX B 0 kability [^aeio][aeiou]k
+! SFX B 0 lability [^aeio][aeiou]l
+! SFX B 0 mability [^aeio][aeiou]m
+! SFX B 0 nability [^aeio][aeiou]n
+! SFX B 0 pability [^aeio][aeiou]p
+! SFX B 0 rability [^aeio][aeiou]r
+! SFX B 0 sability [^aeio][aeiou]s
+! SFX B 0 tability [^aeio][aeiou]t
+! SFX B 0 vability [^aeio][aeiou]v
+! SFX B 0 zability [^aeio][aeiou]z
+! SFX B 0 ability [aeio][aeiou][bcdfgklmnprstvz]
+! SFX B 0 ability [^aeiou][bcdfgklmnprstvz]
+! SFX B y iability [^aeiou]y
+! SFX B 0 ability [aeiou]y
+! SFX B 0 ability [^ebcdfgklmnprstvzy]
+ SFX 7 Y 9
+! SFX 7 e able [acegilou]e
+! SFX 7 0 able [^acegilou]e
+! SFX 7 0 kable [^aeio][aeiou]c
+! SFX 7 0 lable [^aeio][aeiou]l
+! SFX 7 0 able [aeio][aeiou][cl]
+! SFX 7 0 able [^aeiou][cl]
+! SFX 7 y iable [^aeiou]y
+! SFX 7 0 able [aeiou]y
+! SFX 7 0 able [^cely]
+ SFX g Y 9
+! SFX g e ability [^acegilou]e
+! SFX g 0 ability [acegilou]e
+! SFX g 0 kability [^aeio][aeiou]c
+! SFX g 0 lability [^aeio][aeiou]l
+! SFX g 0 ability [aeio][aeiou][cl]
+! SFX g 0 ability [^aeiou][cl]
+! SFX g y iability [^aeiou]y
+! SFX g 0 ability [aeiou]y
+! SFX g 0 ability [^cely]
+ SFX l Y 9
+! SFX l e ably [^acegilou]e
+! SFX l 0 ably [acegilou]e
+! SFX l 0 kably [^aeio][aeiou]c
+! SFX l 0 lably [^aeio][aeiou]l
+! SFX l 0 ably [aeio][aeiou][cl]
+! SFX l 0 ably [^aeiou][cl]
+! SFX l y iably [^aeiou]y
+! SFX l 0 ably [aeiou]y
+! SFX l 0 ably [^cely]
+ SFX b Y 3
+! SFX b e ible [^aeiou]e
+! SFX b 0 ible [aeiou]e
+! SFX b 0 ible [^e]
+ SFX L Y 12
+! SFX L 0 ament m
+! SFX L y iment [^aeiou]y
+! SFX L 0 ment [aeiou]y
+! SFX L 0 ment [^my]
+! SFX L 0 aments m
+! SFX L y iments [^aeiou]y
+! SFX L 0 ments [aeiou]y
+! SFX L 0 ments [^my]
+! SFX L 0 ament's m
+! SFX L y iment's [^aeiou]y
+! SFX L 0 ment's [aeiou]y
+! SFX L 0 ment's [^my]
+ SFX Z Y 22
+! SFX Z e y [^aeiouy]e
+! SFX Z 0 y [aeiouy]e
+! SFX Z 0 ey [aiouy]
+! SFX Z 0 by [^aeio][aeiou]b
+! SFX Z 0 ky [^aeio][aeiou]c
+! SFX Z 0 dy [^aeio][aeiou]d
+! SFX Z 0 fy [^aeio][aeiou]f
+! SFX Z 0 gy [^aeio][aeiou]g
+! SFX Z 0 ky [^aeio][aeiou]k
+! SFX Z 0 ly [^aeio][aeiou]l
+! SFX Z 0 my [^aeio][aeiou]m
+! SFX Z 0 ny [^aeio][aiou]n
+! SFX Z 0 py [^aeio][aeiou]p
+! SFX Z 0 ry [^aeio][aiou]r
+! SFX Z 0 sy [^aeio][aeiou]s
+! SFX Z 0 ty [^aeio][aiou]t
+! SFX Z 0 vy [^aeio][aeiou]v
+! SFX Z 0 zy [^aeio][aeiou]z
+! SFX Z 0 y [^aeio]e[nrt]
+! SFX Z 0 y [aeio][aeiou][bcdfgklmnprstvz]
+! SFX Z 0 y [^aeiou][bcdfgklmnprstvz]
+! SFX Z 0 y [^aebcdfgiklmnoprstuvyz]
+ SFX 2 Y 21
+! SFX 2 e iness [^aeiouy]e
+! SFX 2 0 iness [aeiouy]e
+! SFX 2 0 biness [^aeio][aeiou]b
+! SFX 2 0 kiness [^aeio][aeiou]c
+! SFX 2 0 diness [^aeio][aeiou]d
+! SFX 2 0 finess [^aeio][aeiou]f
+! SFX 2 0 giness [^aeio][aeiou]g
+! SFX 2 0 kiness [^aeio][aeiou]k
+! SFX 2 0 liness [^aeio][aeiou]l
+! SFX 2 0 miness [^aeio][aeiou]m
+! SFX 2 0 niness [^aeio][aiou]n
+! SFX 2 0 piness [^aeio][aeiou]p
+! SFX 2 0 riness [^aeio][aiou]r
+! SFX 2 0 siness [^aeio][aeiou]s
+! SFX 2 0 tiness [^aeio][aiou]t
+! SFX 2 0 viness [^aeio][aeiou]v
+! SFX 2 0 ziness [^aeio][aeiou]z
+! SFX 2 0 iness [^aeio]e[nrt]
+! SFX 2 0 iness [aeio][aeiou][bcdfgklmnprstvz]
+! SFX 2 0 iness [^aeiou][bcdfgklmnprstvz]
+! SFX 2 0 iness [^ebcdfgklmnprstvz]
+ SFX z Y 24
+! SFX z e ily [^aeiouy]e
+! SFX z 0 ily [aeiouy]e
+! SFX z 0 ily [aiou]y
+! SFX z ey ily ey
+! SFX z y ily [^aeiou]y
+! SFX z 0 bily [^aeio][aeiou]b
+! SFX z 0 kily [^aeio][aeiou]c
+! SFX z 0 dily [^aeio][aeiou]d
+! SFX z 0 fily [^aeio][aeiou]f
+! SFX z 0 gily [^aeio][aeiou]g
+! SFX z 0 kily [^aeio][aeiou]k
+! SFX z 0 lily [^aeio][aeiou]l
+! SFX z 0 mily [^aeio][aeiou]m
+! SFX z 0 nily [^aeio][aiou]n
+! SFX z 0 pily [^aeio][aeiou]p
+! SFX z 0 rily [^aeio][aiou]r
+! SFX z 0 sily [^aeio][aeiou]s
+! SFX z 0 tily [^aeio][aiou]t
+! SFX z 0 vily [^aeio][aeiou]v
+! SFX z 0 zily [^aeio][aeiou]z
+! SFX z 0 ily [^aeio]e[nrt]
+! SFX z 0 ily [aeio][aeiou][bcdfgklmnprstvyz]
+! SFX z 0 ily [^aeiou][bcdfgklmnprstvyz]
+! SFX z 0 ily [^ebcdfgklmnprstvyz]
+ SFX y Y 15
+! SFX y e ory te
+! SFX y e atory [mr]e
+! SFX y e ary se
+! SFX y 0 ry [^mrst]e
+! SFX y 0 ory [^aeous]t
+! SFX y 0 ry [aeous]t
+! SFX y 0 ery h
+! SFX y 0 atory [^i]m
+! SFX y im matory im
+! SFX y 0 ory s
+! SFX y 0 ary ion
+! SFX y 0 ry [^i]on
+! SFX y 0 nery [aiu]n
+! SFX y 0 ry [^aiou]n
+! SFX y 0 ry [^ehmstn]
+ SFX O Y 12
+! SFX O 0 l a
+! SFX O e al [^bcgv]e
+! SFX O e ial [bcgv]e
+! SFX O 0 ial [bcrx]
+! SFX O um al um
+! SFX O 0 al [^u]m
+! SFX O y al ty
+! SFX O y ial [^t]y
+! SFX O 0 ual [px]t
+! SFX O 0 tal [iu]t
+! SFX O 0 al [^ipux]t
+! SFX O 0 al [^aebcrtxmy]
+ SFX o Y 12
+! SFZ o 0 lly a
+! SFX o e ally [^bcgv]e
+! SFX o e ially [bcgv]e
+! SFX o 0 ially [bcrx]
+! SFX o um ally um
+! SFX o 0 ally [^u]m
+! SFX o y ally ty
+! SFX o y ially [^t]y
+! SFX o 0 ually [px]t
+! SFX o 0 tally [iu]t
+! SFX o 0 ally [^ipux]t
+! SFX o 0 ally [^aebcrtxmy]
+ SFX W Y 21
+! SFX W ce tific ce
+! SFX W e atic me
+! SFX W se tic se
+! SFX W le ic ble
+! SFX W e ic [^b]le
+! SFX W e ic [^clms]e
+! SFX W 0 lic [ay]l
+! SFX W 0 ic [^ay]l
+! SFX W us ic us
+! SFX W 0 tic [^u]s
+! SFX W er ric er
+! SFX W 0 ic [^e]r
+! SFX W 0 atic [aeiou]m
+! SFX W 0 ic [^aeiou]m
+! SFX W 0 tic ma
+! SFX W a ic [^m]a
+! SFX W y etic thy
+! SFX W y ic [^t]hy
+! SFX W y tic sy
+! SFX W y ic [^hs]y
+! SFX W 0 ic [^aelmrsy]
+ SFX w Y 9
+! SFX w e ical e
+! SFX w er rical er
+! SFX w 0 ical [^e]r
+! SFX w 0 atical [aeiou]m
+! SFX w 0 ical [^aeiou]m
+! SFX w 0 tical ma
+! SFX w a ical [^m]a
+! SFX w y ical y
+! SFX w 0 ical [^aemry]
+ SFX 1 Y 9
+! SFX 1 e ically e
+! SFX 1 er rically er
+! SFX 1 0 ically [^e]r
+! SFX 1 0 atically [aeiou]m
+! SFX 1 0 ically [^aeiou]m
+! SFX 1 0 tically ma
+! SFX 1 a ically [^m]a
+! SFX 1 y ically y
+! SFX 1 0 ically [^aemry]
+ SFX 3 Y 21
+! SFX 3 e ist [^aceiou]e
+! SFX 3 ce tist ce
+! SFX 3 0 ist [aeiou]e
+! SFX 3 y ist [^aeioubp]y
+! SFX 3 0 ist [aeioubp]y
+! SFX 3 o ist o
+! SFX 3 0 ists [^eoy]
+! SFX 3 e ists [^aceiou]e
+! SFX 3 ce tists ce
+! SFX 3 0 ists [aeiou]e
+! SFX 3 y ists [^aeioubp]y
+! SFX 3 0 ists [aeioubp]y
+! SFX 3 o ists o
+! SFX 3 0 ists [^eoy]
+! SFX 3 e ist's [^aceiou]e
+! SFX 3 ce tist's ce
+! SFX 3 0 ist's [aeiou]e
+! SFX 3 y ist's [^aeioubp]y
+! SFX 3 0 ist's [aeioubp]y
+! SFX 3 o ist's o
+! SFX 3 0 ist's [^eoy]
+\ No newline at end of file
+--- 655,1340 ----
+ SFX R Y 72
+! SFX R 0 r e
+! SFX R 0 rs e
+! SFX R 0 ber [^aeio][aeiou]b
+! SFX R 0 bers [^aeio][aeiou]b
+! SFX R 0 ker [^aeio][aeiou]c
+! SFX R 0 kers [^aeio][aeiou]c
+! SFX R 0 der [^aeio][aeiou]d
+! SFX R 0 ders [^aeio][aeiou]d
+! SFX R 0 fer [^aeio][aeiou]f
+! SFX R 0 fers [^aeio][aeiou]f
+! SFX R 0 ger [^aeio][aeiou]g
+! SFX R 0 gers [^aeio][aeiou]g
+! SFX R 0 ker [^aeio][aeiou]k
+! SFX R 0 kers [^aeio][aeiou]k
+! SFX R 0 ler [^aeio][eiou]l
+! SFX R 0 er [aeio][eiou]l
+! SFX R 0 ler [^aeo]al
+! SFX R 0 er [aeo]al
+! SFX R 0 lers [^aeio][eiou]l
+! SFX R 0 ers [aeio][eiou]l
+! SFX R 0 lers [^aeo]al
+! SFX R 0 ers [aeo]al
+! SFX R 0 mer [^aeio][aeiou]m
+! SFX R 0 mers [^aeio][aeiou]m
+! SFX R 0 ner [^aeio][aeiou]n
+! SFX R 0 ners [^aeio][aeiou]n
+! SFX R 0 per [^aeio][aeiou]p
+! SFX R 0 pers [^aeio][aeiou]p
+! SFX R 0 rer [^aeio][aeiou]r
+! SFX R 0 rers [^aeio][aeiou]r
+! SFX R 0 ser [^aeio][aeiou]s
+! SFX R 0 sers [^aeio][aeiou]s
+! SFX R 0 ter [^aeio][aeiou]t
+! SFX R 0 ters [^aeio][aeiou]t
+! SFX R 0 ver [^aeio][aeiou]v
+! SFX R 0 vers [^aeio][aeiou]v
+! SFX R 0 zer [^aeio][aeiou]z
+! SFX R 0 zers [^aeio][aeiou]z
+! SFX R y ier [^aeiou]y
+! SFX R y iers [^aeiou]y
+! SFX R 0 er [aeiou]y
+! SFX R 0 ers [aeiou]y
+! SFX R 0 er [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 ers [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 er [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 ers [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 er [^ebcdfgklmnprstvyz]
+! SFX R 0 ers [^ebcdfgklmnprstvyz]
+! SFX R 0 r's e
+! SFX R 0 ber's [^aeio][aeiou]b
+! SFX R 0 ker's [^aeio][aeiou]c
+! SFX R 0 der's [^aeio][aeiou]d
+! SFX R 0 fer's [^aeio][aeiou]f
+! SFX R 0 ger's [^aeio][aeiou]g
+! SFX R 0 ker's [^aeio][aeiou]k
+! SFX R 0 ler's [^aeio][eiou]l
+! SFX R 0 er's [aeio][eiou]l
+! SFX R 0 ler's [^aeo]al
+! SFX R 0 er's [aeo]al
+! SFX R 0 mer's [^aeio][aeiou]m
+! SFX R 0 ner's [^aeio][aeiou]n
+! SFX R 0 per's [^aeio][aeiou]p
+! SFX R 0 rer's [^aeio][aeiou]r
+! SFX R 0 ser's [^aeio][aeiou]s
+! SFX R 0 ter's [^aeio][aeiou]t
+! SFX R 0 ver's [^aeio][aeiou]v
+! SFX R 0 zer's [^aeio][aeiou]z
+! SFX R y ier's [^aeiou]y
+! SFX R 0 er's [aeiou]y
+! SFX R 0 er's [aeio][aeiou][bcdfgkmnprstvz]
+! SFX R 0 er's [^aeiou][bcdfgklmnprstvz]
+! SFX R 0 er's [^ebcdfgklmnprstvyz]
+ SFX r Y 24
+! SFX r 0 r e
+! SFX r 0 ler [^aeio][aeiou]l
+! SFX r 0 ker [^aeio][aeiou]c
+! SFX r y ier [^aeiou]y
+! SFX r 0 er [aeiou]y
+! SFX r 0 er [aeio][aeiou][cl]
+! SFX r 0 er [^aeiou][cl]
+! SFX r 0 er [^ecly]
+! SFX r 0 rs e
+! SFX r 0 lers [^aeio][aeiou]l
+! SFX r 0 kers [^aeio][aeiou]c
+! SFX r y iers [^aeiou]y
+! SFX r 0 ers [aeiou]y
+! SFX r 0 ers [aeio][aeiou][cl]
+! SFX r 0 ers [^aeiou][cl]
+! SFX r 0 ers [^ecly]
+! SFX r 0 r's e
+! SFX r 0 ler's [^aeio][aeiou]l
+! SFX r 0 ker's [^aeio][aeiou]c
+! SFX r y ier's [^aeiou]y
+! SFX r 0 er's [aeiou]y
+! SFX r 0 er's [aeio][aeiou][cl]
+! SFX r 0 er's [^aeiou][cl]
+! SFX r 0 er's [^ecly]
+ SFX S Y 9
+! SFX S y ies [^aeiou]y
+! SFX S 0 s [aeiou]y
+! SFX S 0 es [sxz]
+! SFX S 0 es [cs]h
+! SFX S 0 s [^cs]h
+! SFX S 0 s [ae]u
+! SFX S 0 x [ae]u
+! SFX S 0 s [^ae]u
+ SFX S 0 s [^hsuxyz]
+ SFX P Y 6
+! SFX P y iness [^aeiou]y
+! SFX P 0 ness [aeiou]y
+! SFX P 0 ness [^y]
+! SFX P y iness's [^aeiou]y
+! SFX P 0 ness's [aeiou]y
+! SFX P 0 ness's [^y]
+ SFX m Y 20
+! SFX m 0 sman [bdknmt]
+! SFX m 0 sman [aeiou][bdklmnt]e
+! SFX m 0 man [^aeiou][bdklmnt]e
+! SFX m 0 man [^bdklmnt]e
+! SFX m 0 man [^bdeknmt]
+! SFX m 0 smen [bdknmt]
+! SFX m 0 smen [aeiou][bdklmnt]e
+! SFX m 0 men [^aeiou][bdklmnt]e
+! SFX m 0 men [^bdklmnt]e
+! SFX m 0 men [^bdeknmt]
+! SFX m 0 sman's [bdknmt]
+! SFX m 0 sman's [aeiou][bdklmnt]e
+! SFX m 0 man's [^aeiou][bdklmnt]e
+! SFX m 0 man's [^bdklmnt]e
+! SFX m 0 man's [^bdeknmt]
+! SFX m 0 smen's [bdknmt]
+! SFX m 0 smen's [aeiou][bdklmnt]e
+! SFX m 0 men's [^aeiou][bdklmnt]e
+! SFX m 0 men's [^bdklmnt]e
+! SFX m 0 men's [^bdeknmt]
+ SFX 5 Y 15
+! SFX 5 0 swoman [bdknmt]
+! SFX 5 0 swoman [aeiou][bdklmnt]e
+! SFX 5 0 woman [^aeiou][bdklmnt]e
+! SFX 5 0 woman [^bdklmnt]e
+! SFX 5 0 woman [^bdeknmt]
+! SFX 5 0 swomen [bdknmt]
+! SFX 5 0 swomen [aeiou][bdklmnt]e
+! SFX 5 0 women [^aeiou][bdklmnt]e
+! SFX 5 0 women [^bdklmnt]e
+! SFX 5 0 women [^bdeknmt]
+! SFX 5 0 swoman's [bdknmt]
+! SFX 5 0 swoman's [aeiou][bdklmnt]e
+! SFX 5 0 woman's [^aeiou][bdklmnt]e
+! SFX 5 0 woman's [^bdklmnt]e
+! SFX 5 0 woman's [^bdeknmt]
+ SFX 6 Y 3
+! SFX 6 y iful [^aeiou]y
+! SFX 6 0 ful [aeiou]y
+! SFX 6 0 ful [^y]
+ SFX j Y 3
+! SFX j y ifully [^aeiou]y
+! SFX j 0 fully [aeiou]y
+! SFX j 0 fully [^y]
+ SFX p Y 5
+! SFX p y iless [^aeiou]y
+! SFX p 0 less [aeiou]y
+! SFX p 0 ess ll
+! SFX p 0 less [^l]l
+! SFX p 0 less [^ly]
+ SFX Q Y 88
+! SFX Q 0 tise a
+! SFX Q e ise [^l]e
+! SFX Q le ilise [^aeiou]le
+! SFX Q e ise [aeiou]le
+! SFX Q um ise um
+! SFX Q 0 ise [^u]m
+! SFX Q s se is
+! SFX Q 0 ise [^i]s
+! SFX Q y ise [^aeiou]y
+! SFX Q 0 ise [aeiou]y
+! SFX Q 0 ise [^aemsy]
+! SFX Q 0 tises a
+! SFX Q e ises [^l]e
+! SFX Q le ilises [^aeiou]le
+! SFX Q e ises [aeiou]le
+! SFX Q um ises um
+! SFX Q 0 ises [^u]m
+! SFX Q s ses is
+! SFX Q 0 ises [^i]s
+! SFX Q y ises [^aeiou]y
+! SFX Q 0 ises [aeiou]y
+! SFX Q 0 ises [^aemsy]
+! SFX Q 0 tised a
+! SFX Q e ised [^l]e
+! SFX Q le ilised [^aeiou]le
+! SFX Q e ised [aeiou]le
+! SFX Q um ised um
+! SFX Q 0 ised [^u]m
+! SFX Q s sed is
+! SFX Q 0 ised [^i]s
+! SFX Q y ised [^aeiou]y
+! SFX Q 0 ised [aeiou]y
+! SFX Q 0 ised [^aemsy]
+! SFX Q 0 tising a
+! SFX Q e ising [^l]e
+! SFX Q le ilising [^aeiou]le
+! SFX Q e ising [aeiou]le
+! SFX Q um ising um
+! SFX Q 0 ising [^u]m
+! SFX Q s sing is
+! SFX Q 0 ising [^i]s
+! SFX Q y ising [^aeiou]y
+! SFX Q 0 ising [aeiou]y
+! SFX Q 0 ising [^aemsy]
+! SFX Q 0 tize a
+! SFX Q e ize [^l]e
+! SFX Q le ilize [^aeiou]le
+! SFX Q e ize [aeiou]le
+! SFX Q um ize um
+! SFX Q 0 ize [^u]m
+! SFX Q s ze is
+! SFX Q 0 ize [^i]s
+! SFX Q y ize [^aeiou]y
+! SFX Q 0 ize [aeiou]y
+! SFX Q 0 ize [^aemsy]
+! SFX Q 0 tizes a
+! SFX Q e izes [^l]e
+! SFX Q le ilizes [^aeiou]le
+! SFX Q e izes [aeiou]le
+! SFX Q um izes um
+! SFX Q 0 izes [^u]m
+! SFX Q s zes is
+! SFX Q 0 izes [^i]s
+! SFX Q y izes [^aeiou]y
+! SFX Q 0 izes [aeiou]y
+! SFX Q 0 izes [^aemsy]
+! SFX Q 0 tized a
+! SFX Q e ized [^l]e
+! SFX Q le ilized [^aeiou]le
+! SFX Q e ized [aeiou]le
+! SFX Q um ized um
+! SFX Q 0 ized [^u]m
+! SFX Q s zed is
+! SFX Q 0 ized [^i]s
+! SFX Q y ized [^aeiou]y
+! SFX Q 0 ized [aeiou]y
+! SFX Q 0 ized [^aemsy]
+! SFX Q 0 tizing a
+! SFX Q e izing [^l]e
+! SFX Q le ilizing [^aeiou]le
+! SFX Q e izing [aeiou]le
+! SFX Q um izing um
+! SFX Q 0 izing [^u]m
+! SFX Q s zing is
+! SFX Q 0 izing [^i]s
+! SFX Q y izing [^aeiou]y
+! SFX Q 0 izing [aeiou]y
+! SFX Q 0 izing [^aemsy]
+ SFX q Y 44
+! SFX q 0 tisation a
+! SFX q e isation [^l]e
+! SFX q le ilisation [^aeiou]le
+! SFX q e isation [aeiou]le
+! SFX q um isation um
+! SFX q 0 isation [^u]m
+! SFX q s sation is
+! SFX q 0 isation [^i]s
+! SFX q y isation [^aeiou]y
+! SFX q 0 isation [aeiou]y
+! SFX q 0 isation [^aemsy]
+! SFX q 0 tisations a
+! SFX q e isations [^l]e
+! SFX q le ilisations [^aeiou]le
+! SFX q e isations [aeiou]le
+! SFX q um isations um
+! SFX q 0 isations [^u]m
+! SFX q s sations is
+! SFX q 0 isations [^i]s
+! SFX q y isations [^aeiou]y
+! SFX q 0 isations [aeiou]y
+! SFX q 0 isations [^aemsy]
+! SFX q 0 tization a
+! SFX q e ization [^l]e
+! SFX q le ilization [^aeiou]le
+! SFX q e ization [aeiou]le
+! SFX q um ization um
+! SFX q 0 ization [^u]m
+! SFX q s zation is
+! SFX q 0 ization [^i]s
+! SFX q y ization [^aeiou]y
+! SFX q 0 ization [aeiou]y
+! SFX q 0 ization [^aemsy]
+! SFX q 0 tizations a
+! SFX q e izations [^l]e
+! SFX q le ilizations [^aeiou]le
+! SFX q e izations [aeiou]le
+! SFX q um izations um
+! SFX q 0 izations [^u]m
+! SFX q s zations is
+! SFX q 0 izations [^i]s
+! SFX q y izations [^aeiou]y
+! SFX q 0 izations [aeiou]y
+! SFX q 0 izations [^aemsy]
+ SFX s Y 66
+! SFX s 0 tiser a
+! SFX s e iser [^l]e
+! SFX s le iliser [^aeiou]le
+! SFX s e iser [aeiou]le
+! SFX s um iser um
+! SFX s 0 iser [^u]m
+! SFX s s ser is
+! SFX s 0 iser [^i]s
+! SFX s y iser [^aeiou]y
+! SFX s 0 iser [aeiou]y
+! SFX s 0 iser [^aemsy]
+! SFX s 0 tisers a
+! SFX s e isers [^l]e
+! SFX s le ilisers [^aeiou]le
+! SFX s e isers [aeiou]le
+! SFX s um isers um
+! SFX s 0 isers [^u]m
+! SFX s s sers is
+! SFX s 0 isers [^i]s
+! SFX s y isers [^aeiou]y
+! SFX s 0 isers [aeiou]y
+! SFX s 0 isers [^aemsy]
+! SFX s 0 tiser's a
+! SFX s e iser's [^l]e
+! SFX s le iliser's [^aeiou]le
+! SFX s e iser's [aeiou]le
+! SFX s um iser's um
+! SFX s 0 iser's [^u]m
+! SFX s s ser's is
+! SFX s 0 iser's [^i]s
+! SFX s y iser's [^aeiou]y
+! SFX s 0 iser's [aeiou]y
+! SFX s 0 iser's [^aemsy]
+! SFX s 0 tizer a
+! SFX s e izer [^l]e
+! SFX s le ilizer [^aeiou]le
+! SFX s e izer [aeiou]le
+! SFX s um izer um
+! SFX s 0 izer [^u]m
+! SFX s s zer is
+! SFX s 0 izer [^i]s
+! SFX s y izer [^aeiou]y
+! SFX s 0 izer [aeiou]y
+! SFX s 0 izer [^aemsy]
+! SFX s 0 tizers a
+! SFX s e izers [^l]e
+! SFX s le ilizers [^aeiou]le
+! SFX s e izers [aeiou]le
+! SFX s um izers um
+! SFX s 0 izers [^u]m
+! SFX s s zers is
+! SFX s 0 izers [^i]s
+! SFX s y izers [^aeiou]y
+! SFX s 0 izers [aeiou]y
+! SFX s 0 izers [^aemsy]
+! SFX s 0 tizer's a
+! SFX s e izer's [^l]e
+! SFX s le ilizer's [^aeiou]le
+! SFX s e izer's [aeiou]le
+! SFX s um izer's um
+! SFX s 0 izer's [^u]m
+! SFX s s zer's is
+! SFX s 0 izer's [^i]s
+! SFX s y izer's [^aeiou]y
+! SFX s 0 izer's [aeiou]y
+! SFX s 0 izer's [^aemsy]
+ SFX t Y 44
+! SFX t 0 tisable a
+! SFX t e isable [^l]e
+! SFX t le ilisable [^aeiou]le
+! SFX t e isable [aeiou]le
+! SFX t um isable um
+! SFX t 0 isable [^u]m
+! SFX t s sable is
+! SFX t 0 isable [^i]s
+! SFX t y isable [^aeiou]y
+! SFX t 0 isable [aeiou]y
+! SFX t 0 isable [^aemsy]
+! SFX t 0 tizable a
+! SFX t e izable [^l]e
+! SFX t le ilizable [^aeiou]le
+! SFX t e izable [aeiou]le
+! SFX t um izable um
+! SFX t 0 izable [^u]m
+! SFX t s zable is
+! SFX t 0 izable [^i]s
+! SFX t y izable [^aeiou]y
+! SFX t 0 izable [aeiou]y
+! SFX t 0 izable [^aemsy]
+! SFX t 0 tisability a
+! SFX t e isability [^l]e
+! SFX t le ilisability [^aeiou]le
+! SFX t e isability [aeiou]le
+! SFX t um isability um
+! SFX t 0 isability [^u]m
+! SFX t s sability is
+! SFX t 0 isability [^i]s
+! SFX t y isability [^aeiou]y
+! SFX t 0 isability [aeiou]y
+! SFX t 0 isability [^aemsy]
+! SFX t 0 tizability a
+! SFX t e izability [^l]e
+! SFX t le ilizability [^aeiou]le
+! SFX t e izability [aeiou]le
+! SFX t um izability um
+! SFX t 0 izability [^u]m
+! SFX t s zability is
+! SFX t 0 izability [^i]s
+! SFX t y izability [^aeiou]y
+! SFX t 0 izability [aeiou]y
+! SFX t 0 izability [^aemsy]
+ SFX M Y 1
+! SFX M 0 's .
+ SFX B Y 48
+! SFX B e able [^acegilotu]e
+! SFX B 0 able [acegilou]e
+! SFX B te ble ate
+! SFX B e able [^a]te
+! SFX B 0 bable [^aeio][aeiou]b
+! SFX B 0 kable [^aeio][aeiou]c
+! SFX B 0 dable [^aeio][aeiou]d
+! SFX B 0 fable [^aeio][aeiou]f
+! SFX B 0 gable [^aeio][aeiou]g
+! SFX B 0 kable [^aeio][aeiou]k
+! SFX B 0 lable [^aeio][aeiou]l
+! SFX B 0 mable [^aeio][aeiou]m
+! SFX B 0 nable [^aeio][aeiou]n
+! SFX B 0 pable [^aeio][aeiou]p
+! SFX B 0 rable [^aeio][aeiou]r
+! SFX B 0 sable [^aeio][aeiou]s
+! SFX B 0 table [^aeio][aeiou]t
+! SFX B 0 vable [^aeio][aeiou]v
+! SFX B 0 zable [^aeio][aeiou]z
+! SFX B 0 able [aeio][aeiou][bcdfgklmnprstvz]
+! SFX B 0 able [^aeiou][bcdfgklmnprstvz]
+! SFX B y iable [^aeiou]y
+! SFX B 0 able [aeiou]y
+! SFX B 0 able [^ebcdfgklmnprstvzy]
+! SFX B e ability [^acegilotu]e
+! SFX B 0 ability [acegilou]e
+! SFX B te bility ate
+! SFX B e ability [^a]te
+! SFX B 0 bability [^aeio][aeiou]b
+! SFX B 0 kability [^aeio][aeiou]c
+! SFX B 0 dability [^aeio][aeiou]d
+! SFX B 0 fability [^aeio][aeiou]f
+! SFX B 0 gability [^aeio][aeiou]g
+! SFX B 0 kability [^aeio][aeiou]k
+! SFX B 0 lability [^aeio][aeiou]l
+! SFX B 0 mability [^aeio][aeiou]m
+! SFX B 0 nability [^aeio][aeiou]n
+! SFX B 0 pability [^aeio][aeiou]p
+! SFX B 0 rability [^aeio][aeiou]r
+! SFX B 0 sability [^aeio][aeiou]s
+! SFX B 0 tability [^aeio][aeiou]t
+! SFX B 0 vability [^aeio][aeiou]v
+! SFX B 0 zability [^aeio][aeiou]z
+! SFX B 0 ability [aeio][aeiou][bcdfgklmnprstvz]
+! SFX B 0 ability [^aeiou][bcdfgklmnprstvz]
+! SFX B y iability [^aeiou]y
+! SFX B 0 ability [aeiou]y
+! SFX B 0 ability [^ebcdfgklmnprstvzy]
+ SFX 7 Y 9
+! SFX 7 e able [acegilou]e
+! SFX 7 0 able [^acegilou]e
+! SFX 7 0 kable [^aeio][aeiou]c
+! SFX 7 0 lable [^aeio][aeiou]l
+! SFX 7 0 able [aeio][aeiou][cl]
+! SFX 7 0 able [^aeiou][cl]
+! SFX 7 y iable [^aeiou]y
+! SFX 7 0 able [aeiou]y
+! SFX 7 0 able [^cely]
+ SFX g Y 9
+! SFX g e ability [^acegilou]e
+! SFX g 0 ability [acegilou]e
+! SFX g 0 kability [^aeio][aeiou]c
+! SFX g 0 lability [^aeio][aeiou]l
+! SFX g 0 ability [aeio][aeiou][cl]
+! SFX g 0 ability [^aeiou][cl]
+! SFX g y iability [^aeiou]y
+! SFX g 0 ability [aeiou]y
+! SFX g 0 ability [^cely]
+ SFX l Y 9
+! SFX l e ably [^acegilou]e
+! SFX l 0 ably [acegilou]e
+! SFX l 0 kably [^aeio][aeiou]c
+! SFX l 0 lably [^aeio][aeiou]l
+! SFX l 0 ably [aeio][aeiou][cl]
+! SFX l 0 ably [^aeiou][cl]
+! SFX l y iably [^aeiou]y
+! SFX l 0 ably [aeiou]y
+! SFX l 0 ably [^cely]
+ SFX b Y 3
+! SFX b e ible [^aeiou]e
+! SFX b 0 ible [aeiou]e
+! SFX b 0 ible [^e]
+ SFX L Y 12
+! SFX L 0 ament m
+! SFX L y iment [^aeiou]y
+! SFX L 0 ment [aeiou]y
+! SFX L 0 ment [^my]
+! SFX L 0 aments m
+! SFX L y iments [^aeiou]y
+! SFX L 0 ments [aeiou]y
+! SFX L 0 ments [^my]
+! SFX L 0 ament's m
+! SFX L y iment's [^aeiou]y
+! SFX L 0 ment's [aeiou]y
+! SFX L 0 ment's [^my]
+ SFX Z Y 22
+! SFX Z e y [^aeiouy]e
+! SFX Z 0 y [aeiouy]e
+! SFX Z 0 ey [aiouy]
+! SFX Z 0 by [^aeio][aeiou]b
+! SFX Z 0 ky [^aeio][aeiou]c
+! SFX Z 0 dy [^aeio][aeiou]d
+! SFX Z 0 fy [^aeio][aeiou]f
+! SFX Z 0 gy [^aeio][aeiou]g
+! SFX Z 0 ky [^aeio][aeiou]k
+! SFX Z 0 ly [^aeio][aeiou]l
+! SFX Z 0 my [^aeio][aeiou]m
+! SFX Z 0 ny [^aeio][aiou]n
+! SFX Z 0 py [^aeio][aeiou]p
+! SFX Z 0 ry [^aeio][aiou]r
+! SFX Z 0 sy [^aeio][aeiou]s
+! SFX Z 0 ty [^aeio][aiou]t
+! SFX Z 0 vy [^aeio][aeiou]v
+! SFX Z 0 zy [^aeio][aeiou]z
+! SFX Z 0 y [^aeio]e[nrt]
+! SFX Z 0 y [aeio][aeiou][bcdfgklmnprstvz]
+! SFX Z 0 y [^aeiou][bcdfgklmnprstvz]
+! SFX Z 0 y [^aebcdfgiklmnoprstuvyz]
+ SFX 2 Y 21
+! SFX 2 e iness [^aeiouy]e
+! SFX 2 0 iness [aeiouy]e
+! SFX 2 0 biness [^aeio][aeiou]b
+! SFX 2 0 kiness [^aeio][aeiou]c
+! SFX 2 0 diness [^aeio][aeiou]d
+! SFX 2 0 finess [^aeio][aeiou]f
+! SFX 2 0 giness [^aeio][aeiou]g
+! SFX 2 0 kiness [^aeio][aeiou]k
+! SFX 2 0 liness [^aeio][aeiou]l
+! SFX 2 0 miness [^aeio][aeiou]m
+! SFX 2 0 niness [^aeio][aiou]n
+! SFX 2 0 piness [^aeio][aeiou]p
+! SFX 2 0 riness [^aeio][aiou]r
+! SFX 2 0 siness [^aeio][aeiou]s
+! SFX 2 0 tiness [^aeio][aiou]t
+! SFX 2 0 viness [^aeio][aeiou]v
+! SFX 2 0 ziness [^aeio][aeiou]z
+! SFX 2 0 iness [^aeio]e[nrt]
+! SFX 2 0 iness [aeio][aeiou][bcdfgklmnprstvz]
+! SFX 2 0 iness [^aeiou][bcdfgklmnprstvz]
+! SFX 2 0 iness [^ebcdfgklmnprstvz]
+ SFX z Y 24
+! SFX z e ily [^aeiouy]e
+! SFX z 0 ily [aeiouy]e
+! SFX z 0 ily [aiou]y
+! SFX z ey ily ey
+! SFX z y ily [^aeiou]y
+! SFX z 0 bily [^aeio][aeiou]b
+! SFX z 0 kily [^aeio][aeiou]c
+! SFX z 0 dily [^aeio][aeiou]d
+! SFX z 0 fily [^aeio][aeiou]f
+! SFX z 0 gily [^aeio][aeiou]g
+! SFX z 0 kily [^aeio][aeiou]k
+! SFX z 0 lily [^aeio][aeiou]l
+! SFX z 0 mily [^aeio][aeiou]m
+! SFX z 0 nily [^aeio][aiou]n
+! SFX z 0 pily [^aeio][aeiou]p
+! SFX z 0 rily [^aeio][aiou]r
+! SFX z 0 sily [^aeio][aeiou]s
+! SFX z 0 tily [^aeio][aiou]t
+! SFX z 0 vily [^aeio][aeiou]v
+! SFX z 0 zily [^aeio][aeiou]z
+! SFX z 0 ily [^aeio]e[nrt]
+! SFX z 0 ily [aeio][aeiou][bcdfgklmnprstvyz]
+! SFX z 0 ily [^aeiou][bcdfgklmnprstvyz]
+! SFX z 0 ily [^ebcdfgklmnprstvyz]
+ SFX y Y 15
+! SFX y e ory te
+! SFX y e atory [mr]e
+! SFX y e ary se
+! SFX y 0 ry [^mrst]e
+! SFX y 0 ory [^aeous]t
+! SFX y 0 ry [aeous]t
+! SFX y 0 ery h
+! SFX y 0 atory [^i]m
+! SFX y im matory im
+! SFX y 0 ory s
+! SFX y 0 ary ion
+! SFX y 0 ry [^i]on
+! SFX y 0 nery [aiu]n
+! SFX y 0 ry [^aiou]n
+! SFX y 0 ry [^ehmstn]
+ SFX O Y 12
+! SFX O 0 l a
+! SFX O e al [^bcgv]e
+! SFX O e ial [bcgv]e
+! SFX O 0 ial [bcrx]
+! SFX O um al um
+! SFX O 0 al [^u]m
+! SFX O y al ty
+! SFX O y ial [^t]y
+! SFX O 0 ual [px]t
+! SFX O 0 tal [iu]t
+! SFX O 0 al [^ipux]t
+! SFX O 0 al [^aebcrtxmy]
+ SFX o Y 12
+! SFX o 0 lly a
+! SFX o e ally [^bcgv]e
+! SFX o e ially [bcgv]e
+! SFX o 0 ially [bcrx]
+! SFX o um ally um
+! SFX o 0 ally [^u]m
+! SFX o y ally ty
+! SFX o y ially [^t]y
+! SFX o 0 ually [px]t
+! SFX o 0 tally [iu]t
+! SFX o 0 ally [^ipux]t
+! SFX o 0 ally [^aebcrtxmy]
+ SFX W Y 21
+! SFX W ce tific ce
+! SFX W e atic me
+! SFX W se tic se
+! SFX W le ic ble
+! SFX W e ic [^b]le
+! SFX W e ic [^clms]e
+! SFX W 0 lic [ay]l
+! SFX W 0 ic [^ay]l
+! SFX W us ic us
+! SFX W 0 tic [^u]s
+! SFX W er ric er
+! SFX W 0 ic [^e]r
+! SFX W 0 atic [aeiou]m
+! SFX W 0 ic [^aeiou]m
+! SFX W 0 tic ma
+! SFX W a ic [^m]a
+! SFX W y etic thy
+! SFX W y ic [^t]hy
+! SFX W y tic sy
+! SFX W y ic [^hs]y
+! SFX W 0 ic [^aelmrsy]
+ SFX w Y 9
+! SFX w e ical e
+! SFX w er rical er
+! SFX w 0 ical [^e]r
+! SFX w 0 atical [aeiou]m
+! SFX w 0 ical [^aeiou]m
+! SFX w 0 tical ma
+! SFX w a ical [^m]a
+! SFX w y ical y
+! SFX w 0 ical [^aemry]
+ SFX 1 Y 9
+! SFX 1 e ically e
+! SFX 1 er rically er
+! SFX 1 0 ically [^e]r
+! SFX 1 0 atically [aeiou]m
+! SFX 1 0 ically [^aeiou]m
+! SFX 1 0 tically ma
+! SFX 1 a ically [^m]a
+! SFX 1 y ically y
+! SFX 1 0 ically [^aemry]
+ SFX 3 Y 21
+! SFX 3 e ist [^aceiou]e
+! SFX 3 ce tist ce
+! SFX 3 0 ist [aeiou]e
+! SFX 3 y ist [^aeioubp]y
+! SFX 3 0 ist [aeioubp]y
+! SFX 3 o ist o
+! SFX 3 0 ists [^eoy]
+! SFX 3 e ists [^aceiou]e
+! SFX 3 ce tists ce
+! SFX 3 0 ists [aeiou]e
+! SFX 3 y ists [^aeioubp]y
+! SFX 3 0 ists [aeioubp]y
+! SFX 3 o ists o
+! SFX 3 0 ists [^eoy]
+! SFX 3 e ist's [^aceiou]e
+! SFX 3 ce tist's ce
+! SFX 3 0 ist's [aeiou]e
+! SFX 3 y ist's [^aeioubp]y
+! SFX 3 0 ist's [aeioubp]y
+! SFX 3 o ist's o
+! SFX 3 0 ist's [^eoy]
+*** en_NZ.orig.dic 2010-05-15 13:03:48.000000000 +0200
+--- en_NZ.dic 2016-01-08 23:04:05.825939282 +0100
+***************
+*** 1,2 ****
+--- 1,12 ----
+ 47141
++ 0th
++ 1st
++ 2nd
++ 3rd
++ 4th
++ 5th
++ 6th
++ 7th
++ 8th
++ 9th
+ 3GPP
+***************
+*** 4,6 ****
+ 2ZB
+- A
+ a/o
+--- 14,15 ----
+***************
+*** 927,929 ****
+ Al-Zawahiri
+- al/FAC
+ Al/M
+--- 936,937 ----
+***************
+*** 2941,2944 ****
+ B.Sc.
+- bless
+- bible
+ baa/GSD
+--- 2949,2950 ----
+***************
+*** 4974,4975 ****
+--- 4980,4982 ----
+ Brampton/M
++ Bram/M
+ bran/SDGM
+***************
+*** 5707,5709 ****
+ C.Lit.
+! cation/SM
+ Ca/y
+--- 5714,5716 ----
+ C.Lit.
+! cation/MWS
+ Ca/y
+***************
+*** 6450,6452 ****
+ Cathy
+- cation/MW
+ catkin/SM
+--- 6457,6458 ----
+***************
+*** 8589,8590 ****
+--- 8595,8597 ----
+ coniferous
++ conj.
+ conjectural
+***************
+*** 10153,10155 ****
+ red's
+- dally
+ dab/TSGD
+--- 10160,10161 ----
+***************
+*** 10360,10361 ****
+--- 10366,10368 ----
+ dBm
++ dBd
+ DBMS
+***************
+*** 12535,12536 ****
+--- 12542,12544 ----
+ Dutchwomen/M
++ Farsi
+ duteous/Y
+***************
+*** 12542,12544 ****
+ duvet/SM
+- duxes
+ DVD/MS
+--- 12550,12551 ----
+***************
+*** 13901,13903 ****
+ estuary/MS
+! et
+ ETA
+--- 13908,13911 ----
+ estuary/MS
+! et cetera
+! et al.
+ ETA
+***************
+*** 14531,14534 ****
+ f-stop/S
+- fable
+- fist/MS
+ fa/M
+--- 14539,14540 ----
+***************
+*** 15323,15325 ****
+ fissure/DSMG
+! fist/6GD
+ fistfight/MS
+--- 15329,15331 ----
+ fissure/DSMG
+! fist/6GDMS
+ fistfight/MS
+***************
+*** 16606,16608 ****
+ g's
+- gable
+ gist/MS
+--- 16612,16613 ----
+***************
+*** 16797,16799 ****
+ Garvey
+- Gary/M
+ gas-permeable
+--- 16802,16803 ----
+***************
+*** 18177,18179 ****
+ gyroscope/SWM
+- dish
+ ha
+--- 18181,18182 ----
+***************
+*** 22321,22323 ****
+ K-factor
+- disk/MS
+ kabob's
+--- 22324,22325 ----
+***************
+*** 23129,23132 ****
+ lassoer/M
+- last-ditch
+- last-minute
+ last/YSDGkJ
+--- 23131,23132 ----
+***************
+*** 26396,26398 ****
+ Missy
+! mist/CDRGS
+ mistakable/U
+--- 26396,26398 ----
+ Missy
+! mist/CDRGSM
+ mistakable/U
+***************
+*** 26745,26746 ****
+--- 26745,26747 ----
+ Moog
++ Moolenaar/M
+ moon/MGpDS
+***************
+*** 27018,27020 ****
+ mozzarella/SM
+- MP3
+ mpg
+--- 27019,27020 ----
+***************
+*** 27365,27372 ****
+ N'Djamena
+! native
+ natively
+ nativeness
+- nation/MS
+- national
+- nationally
+ Na/M
+--- 27365,27369 ----
+ N'Djamena
+! native/SP
+ natively
+ nativeness
+ Na/M
+***************
+*** 27507,27509 ****
+ Nathaniel/M
+! nation/M
+ national/sQ3Sq
+--- 27504,27506 ----
+ Nathaniel/M
+! nation/MS
+ national/sQ3Sq
+***************
+*** 27521,27523 ****
+ nationwide
+- native/SP
+ nativity/SM
+--- 27518,27519 ----
+***************
+*** 29852,29857 ****
+ P.O.
+- ply
+- reply
+- imply
+- comply
+ pa/oM
+--- 29848,29849 ----
+***************
+*** 31702,31703 ****
+--- 31694,31696 ----
+ pneumonia/MS
++ pneumonic
+ PO
+***************
+*** 31885,31886 ****
+--- 31878,31880 ----
+ pompom/SM
++ pompon/M
+ pomposity/SM
+***************
+*** 33561,33563 ****
+ qwertys
+- r/d
+ Ra
+--- 33555,33556 ----
+***************
+*** 35456,35458 ****
+ rt
+- rte
+ Ru/M
+--- 35449,35450 ----
+***************
+*** 35619,35622 ****
+ singly
+- sable
+- sally/DSG
+ SA
+--- 35611,35612 ----
+***************
+*** 40763,40766 ****
+ T's
+- mist/MS
+- overt
+ Ta
+--- 40753,40754 ----
+***************
+*** 43574,43575 ****
+--- 43562,43564 ----
+ unsearchable
++ searchable
+ unseeing/Y
+***************
+*** 44334,44336 ****
+ Vilnius/M
+! vim/M
+ vinaigrette/MS
+--- 44323,44326 ----
+ Vilnius/M
+! Vim/M
+! vim/?
+ vinaigrette/MS
+***************
+*** 45906,45908 ****
+ y'all
+- prey/M
+ yacht/M5SmGD
+--- 45896,45897 ----
+***************
+*** 46152,46154 ****
+ zymurgy/S
+-
+ font/SM
+--- 46141,46142 ----
+***************
+*** 46198,46200 ****
+ rata/M
+- kaka/M
+ waka/M
+--- 46186,46187 ----
+***************
+*** 46216,46218 ****
+ jandal/MS
+- Swanndri/M
+ hoon/MS
+--- 46203,46204 ----
+***************
+*** 46242,46244 ****
+ Invercargill/M
+- Te
+ Alexandra/M
+--- 46228,46229 ----
+***************
+*** 46261,46263 ****
+ Kawerau/M
+- Kerikeri/M
+ Lyttelton/M
+--- 46246,46247 ----
+***************
+*** 46491,46493 ****
+ Waianakarua
+- Hakatere
+ Swin
+--- 46475,46476 ----
+***************
+*** 46690,46692 ****
+ Omarama/M
+- Wairarapa/M
+ Kilda/M
+--- 46673,46674 ----
+***************
+*** 46711,46713 ****
+ Wellsford/M
+- Akaroa/M
+ Avonhead/M
+--- 46693,46694 ----
+***************
+*** 46838,46840 ****
+ Ballantyne's
+- DB
+ Monteith's
+--- 46819,46820 ----
+***************
+*** 46920,46922 ****
+ Egmont/M
+- Waitaki/M
+ katipo/M
+--- 46900,46901 ----
+***************
+*** 46956,46958 ****
+ Sunnyside/M
+- Wairau/M
+ Waikoropupu
+--- 46935,46936 ----
+***************
+*** 47141,47142 ****
+ Burkina
+! Faso/M
+\ No newline at end of file
+--- 47119,47134 ----
+ Burkina
+! Faso/M
+! nd
+! PayPal
+! Google
+! TCP\/IP
+! a a/%
+! a an/%
+! a the/%
+! an a/%
+! an an/%
+! an the/%
+! and and/%
+! the a/%
+! the an/%
+! the the/%
diff --git a/runtime/spell/en/en_US.diff b/runtime/spell/en/en_US.diff
new file mode 100644
index 0000000..7419f19
--- /dev/null
+++ b/runtime/spell/en/en_US.diff
@@ -0,0 +1,243 @@
+*** en_US.orig.aff 2015-12-30 18:55:30.352821552 +0100
+--- en_US.aff 2016-01-09 13:16:31.514054846 +0100
+***************
+*** 1,18 ****
+ SET UTF8
+ TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+! ICONV 1
+! ICONV ’ '
+ NOSUGGEST !
+
+! # ordinal numbers
+! COMPOUNDMIN 1
+! # only in compounds: 1th, 2th, 3th
+! ONLYINCOMPOUND c
+! # compound rules:
+! # 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
+! # 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
+! COMPOUNDRULE 2
+! COMPOUNDRULE n*1t
+! COMPOUNDRULE n*mp
+! WORDCHARS 0123456789
+
+--- 1,164 ----
++ # Affix file for US English MySpell dictionary
+ SET UTF8
+ TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ'
+!
+! FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
+! LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
+! UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ
+!
+! MIDWORD '
+!
+! RARE ?
+! BAD %
+!
+! MAP 9
+! MAP aàáâãäå
+! MAP eèéêë
+! MAP iìíîï
+! MAP oòóôõö
+! MAP uùúûü
+! MAP nñ
+! MAP cç
+! MAP yÿý
+! MAP sß
+!
+! # This comes from Aspell en_phonet.dat, version 1.1, 2000-01-07
+!
+! 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 À^ *
+! SAL Å^ *
+! 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 É< 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
+!
+! # When soundfolding "th" is turned into "@". When this is mistyped as "ht" it
+! # soundfolds to "ht". This difference is too big, thus use REP items to lower
+! # the score.
+! REPSAL 2
+! REPSAL ht @
+! REPSAL @ ht
+!
+! # ICONV 1
+! # ICONV ’ '
+!
+ NOSUGGEST !
+
+! # This is disabled, because if Vim does not support NOCOMPOUNDSUGS giving
+! # suggestions is extremely slow.
+! # This is disabled, because without NOCOMPOUNDSUGS support giving suggestions
+! # is extremely slow.
+! ## ordinal numbers
+! #COMPOUNDMIN 1
+! ## only in compounds: 1th, 2th, 3th
+! #ONLYINCOMPOUND c
+! ## compound rules:
+! ## 1. [0-9]*1[0-9]th (10th, 11th, 12th, 56714th, etc.)
+! ## 2. [0-9]*[02-9](1st|2nd|3rd|[4-9]th) (21st, 22nd, 123rd, 1234th, etc.)
+! #COMPOUNDRULE 2
+! #COMPOUNDRULE n*1t
+! #COMPOUNDRULE n*mp
+! #NOCOMPOUNDSUGS
+!
+! # WORDCHARS 0123456789
+
+*** en_US.orig.dic 2015-12-30 18:55:58.928512408 +0100
+--- en_US.dic 2016-01-08 23:04:15.241835664 +0100
+***************
+*** 1,25 ****
+ 48756
+! 0/nm
+! 0th/pt
+! 1/n1
+! 1st/p
+! 1th/tc
+! 2/nm
+! 2nd/p
+! 2th/tc
+! 3/nm
+! 3rd/p
+! 3th/tc
+! 4/nm
+! 4th/pt
+! 5/nm
+! 5th/pt
+! 6/nm
+! 6th/pt
+! 7/nm
+! 7th/pt
+! 8/nm
+! 8th/pt
+! 9/nm
+! 9th/pt
+ A/SM
+--- 1,12 ----
+ 48756
+! 0th
+! 1st
+! 2nd
+! 3rd
+! 4th
+! 5th
+! 6th
+! 7th
+! 8th
+! 9th
+ A/SM
+***************
+*** 48757 ****
+--- 48744,48754 ----
+ zymurgy/M
++ a a/%
++ a an/%
++ a the/%
++ an a/%
++ an an/%
++ an the/%
++ and and/%
++ the a/%
++ the an/%
++ the the/%
diff --git a/runtime/spell/en/main.aap b/runtime/spell/en/main.aap
new file mode 100644
index 0000000..09ae228
--- /dev/null
+++ b/runtime/spell/en/main.aap
@@ -0,0 +1,245 @@
+# Aap recipe for English Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = en_US.aff en_US.dic
+ en_AU.aff en_AU.dic
+ en_CA.aff en_CA.dic
+ en_GB.aff en_GB.dic
+ en_NZ.aff en_NZ.dic
+
+all: $SPELLDIR/en.latin1.spl $SPELLDIR/en.utf-8.spl \
+ $SPELLDIR/en.ascii.spl ../README_en.txt
+
+$SPELLDIR/en.latin1.spl : $FILES
+ :sys env LANG=en_US.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/en
+ en_US en_AU en_CA en_GB en_NZ" -c q
+
+$SPELLDIR/en.utf-8.spl : $FILES
+ :sys env LANG=en_US.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/en
+ en_US en_AU en_CA en_GB en_NZ" -c q
+
+$SPELLDIR/en.ascii.spl : $FILES
+ :sys $VIM -u NONE -e -c "mkspell! -ascii $SPELLDIR/en
+ en_US en_AU en_CA en_GB en_NZ" -c q
+
+../README_en.txt: README_en_US.txt README_en_AU.txt README_en_CA.txt README_en_GB.txt README_en_NZ.txt
+ :print en_US >!$target
+ :cat README_en_US.txt | :eval re.sub('\r', '', stdin) >>$target
+ :print =================================================== >>$target
+ :print en_AU: >>$target
+ :cat README_en_AU.txt | :eval re.sub('\r', '', stdin) >>$target
+ :print =================================================== >>$target
+ :print en_CA: >>$target
+ :cat README_en_CA.txt | :eval re.sub('\r', '', stdin) >>$target
+ :print =================================================== >>$target
+ :print en_GB: >>$target
+ :cat README_en_GB.txt | :eval re.sub('\r', '', stdin) >>$target
+ :print =================================================== >>$target
+ :print en_NZ: >>$target
+ :cat README_en_NZ.txt | :eval re.sub('\r', '', stdin) >>$target
+
+#
+# Fetching the files from OpenOffice.org.
+# THIS URL NO LONGER WORKS.
+#
+# Files for en_US, en_CA and en_GB can be obtained from:
+# github.com/marcoagpinto/aoo-mozilla-en-dict
+# Unfortunately, giving suggestions becomes terribly slow with these.
+# TODO: find out why suggestions are slow and fix that.
+#
+# For now we use the older libraries.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} en_US.zip en_CA.zip en_NZ.zip
+ en_GB.zip en_AU.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+en_US.aff en_US.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch en_US.zip
+ :sys $UNZIP en_US.zip
+ :delete en_US.zip
+ @if not os.path.exists('en_US.orig.aff'):
+ :copy en_US.aff en_US.orig.aff
+ @if not os.path.exists('en_US.orig.dic'):
+ :copy en_US.dic en_US.orig.dic
+ @if os.path.exists('en_US.diff'):
+ :sys patch <en_US.diff
+
+en_AU.aff en_AU.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch en_AU.zip
+ :sys $UNZIP en_AU.zip
+ :delete en_AU.zip
+ @if not os.path.exists('en_AU.orig.aff'):
+ :copy en_AU.aff en_AU.orig.aff
+ @if not os.path.exists('en_AU.orig.dic'):
+ :copy en_AU.dic en_AU.orig.dic
+ @if os.path.exists('en_AU.diff'):
+ :sys patch <en_AU.diff
+
+en_CA.aff en_CA.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch en_CA.zip
+ :sys $UNZIP en_CA.zip
+ :delete en_CA.zip
+ @if not os.path.exists('en_CA.orig.aff'):
+ :copy en_CA.aff en_CA.orig.aff
+ @if not os.path.exists('en_CA.orig.dic'):
+ :copy en_CA.dic en_CA.orig.dic
+ @if os.path.exists('en_CA.diff'):
+ :sys patch <en_CA.diff
+
+en_GB.aff en_GB.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch en_GB.zip
+ :sys $UNZIP en_GB.zip
+ :delete en_GB.zip
+ :delete dictionary.lst.example
+ @if not os.path.exists('en_GB.orig.aff'):
+ :copy en_GB.aff en_GB.orig.aff
+ @if not os.path.exists('en_GB.orig.dic'):
+ :copy en_GB.dic en_GB.orig.dic
+ @if os.path.exists('en_GB.diff'):
+ :sys patch <en_GB.diff
+
+en_NZ.aff en_NZ.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch en_NZ.zip
+ :sys $UNZIP en_NZ.zip
+ :delete en_NZ.zip
+ @if not os.path.exists('en_NZ.orig.aff'):
+ :copy en_NZ.aff en_NZ.orig.aff
+ @if not os.path.exists('en_NZ.orig.dic'):
+ :copy en_NZ.dic en_NZ.orig.dic
+ @if os.path.exists('en_NZ.diff'):
+ :sys patch <en_NZ.diff
+
+
+# Generate diff files, so that others can get the original files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 en_US.orig.aff en_US.aff >en_US.diff
+ :sys {force} diff -a -C 1 en_US.orig.dic en_US.dic >>en_US.diff
+ :sys {force} diff -a -C 1 en_AU.orig.aff en_AU.aff >en_AU.diff
+ :sys {force} diff -a -C 1 en_AU.orig.dic en_AU.dic >>en_AU.diff
+ :sys {force} diff -a -C 1 en_CA.orig.aff en_CA.aff >en_CA.diff
+ :sys {force} diff -a -C 1 en_CA.orig.dic en_CA.dic >>en_CA.diff
+ :sys {force} diff -a -C 1 en_GB.orig.aff en_GB.aff >en_GB.diff
+ :sys {force} diff -a -C 1 en_GB.orig.dic en_GB.dic >>en_GB.diff
+ :sys {force} diff -a -C 1 en_NZ.orig.aff en_NZ.aff >en_NZ.diff
+ :sys {force} diff -a -C 1 en_NZ.orig.dic en_NZ.dic >>en_NZ.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check: check-us check-au check-ca check-gb check-nz
+
+check-us:
+ :assertpkg unzip diff
+ :fetch en_US.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../en_US.zip
+ :sys {force} diff ../en_US.orig.aff en_US.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_US.aff ../en_US.new.aff
+ :sys {force} diff ../en_US.orig.dic en_US.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_US.dic ../en_US.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete en_US.zip
+
+check-au:
+ :assertpkg unzip diff
+ :fetch en_AU.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../en_AU.zip
+ :sys {force} diff ../en_AU.orig.aff en_AU.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_AU.aff ../en_AU.new.aff
+ :sys {force} diff ../en_AU.orig.dic en_AU.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_AU.dic ../en_AU.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete en_AU.zip
+
+check-ca:
+ :assertpkg unzip diff
+ :fetch en_CA.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../en_CA.zip
+ :sys {force} diff ../en_CA.orig.aff en_CA.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_CA.aff ../en_CA.new.aff
+ :sys {force} diff ../en_CA.orig.dic en_CA.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_CA.dic ../en_CA.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete en_CA.zip
+
+check-gb:
+ :assertpkg unzip diff
+ :fetch en_GB.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../en_GB.zip
+ :sys {force} diff ../en_GB.orig.aff en_GB.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_GB.aff ../en_GB.new.aff
+ :sys {force} diff ../en_GB.orig.dic en_GB.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_GB.dic ../en_GB.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete en_GB.zip
+
+check-nz:
+ :assertpkg unzip diff
+ :fetch en_NZ.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../en_NZ.zip
+ :sys {force} diff ../en_NZ.orig.aff en_NZ.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_NZ.aff ../en_NZ.new.aff
+ :sys {force} diff ../en_NZ.orig.dic en_NZ.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy en_NZ.dic ../en_NZ.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete en_NZ.zip
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/eo/eo_l3.diff b/runtime/spell/eo/eo_l3.diff
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/runtime/spell/eo/eo_l3.diff
diff --git a/runtime/spell/eo/main.aap b/runtime/spell/eo/main.aap
new file mode 100644
index 0000000..282b5b7
--- /dev/null
+++ b/runtime/spell/eo/main.aap
@@ -0,0 +1,80 @@
+# Aap recipe for Esperanto Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = eo_l3.aff eo_l3.dic
+
+all: $SPELLDIR/eo.iso-8859-3.spl $SPELLDIR/eo.utf-8.spl ../README_eo.txt
+
+$SPELLDIR/eo.iso-8859-3.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=iso-8859-3"
+ -c "mkspell! $SPELLDIR/eo eo_l3" -c q
+
+$SPELLDIR/eo.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "mkspell! $SPELLDIR/eo eo_l3" -c q
+
+../README_eo.txt : README_eo_l3.txt
+ :copy $source $target
+ # fix missing newline
+ :sys $VIM -u NONE -e -c "set ff=unix" -c wq $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} eo.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+eo_l3.aff eo_l3.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch eo.zip
+ :sys $UNZIP eo.zip
+ :delete eo.zip
+ @if not os.path.exists('eo_l3.orig.aff'):
+ :copy eo_l3.aff eo_l3.orig.aff
+ @if not os.path.exists('eo_l3.orig.dic'):
+ :copy eo_l3.dic eo_l3.orig.dic
+ @if os.path.exists('eo_l3.diff'):
+ :sys patch <eo_l3.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 eo_l3.orig.aff eo_l3.aff >eo_l3.diff
+ :sys {force} diff -a -C 1 eo_l3.orig.dic eo_l3.dic >>eo_l3.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch eo.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../eo.zip
+ :sys {force} diff ../eo_l3.orig.aff eo_l3.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy eo_l3.aff ../eo_l3.new.aff
+ :sys {force} diff ../eo_l3.orig.dic eo_l3.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy eo_l3.dic ../eo_l3.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete eo.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/es/es_ES.diff b/runtime/spell/es/es_ES.diff
new file mode 100644
index 0000000..cc4f3fb
--- /dev/null
+++ b/runtime/spell/es/es_ES.diff
@@ -0,0 +1,38 @@
+*** es_ES.orig.aff Fri Apr 21 10:57:12 2006
+--- es_ES.aff Fri Apr 21 11:10:16 2006
+***************
+*** 4,5 ****
+--- 4,12 ----
+
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
+ REP 20
+***************
+*** 26,33 ****
+
+! MAP 5
+! MAP aA
+! MAP eE
+! MAP iI
+! MAP oO
+! MAP uU
+ PFX a Y 2
+--- 33,45 ----
+
+! MAP 9
+! MAP a
+! MAP e
+! MAP i
+! MAP o
+! MAP u
+! MAP n
+! MAP c
+! MAP y
+! MAP s
+!
+ PFX a Y 2
diff --git a/runtime/spell/es/es_MX.diff b/runtime/spell/es/es_MX.diff
new file mode 100644
index 0000000..59d8312
--- /dev/null
+++ b/runtime/spell/es/es_MX.diff
@@ -0,0 +1,6975 @@
+*** es_MX.orig.aff Thu Aug 25 19:19:45 2005
+--- es_MX.aff Thu Aug 25 19:19:45 2005
+***************
+*** 1,4 ****
+! SET ISO8859-1
+! TRY aroeinltcsdumpbgvfhzjqxyCkAMIESPGRJBFDVTHUOwLNKZY
+!
+ SFX A Y 93
+--- 1,23 ----
+! SET ISO8859-1
+! TRY aroeinltcsdumpbgvfhzjqxyCkAMIESPGRJBFDVTHUOwLNKZY
+!
+! FOL
+! LOW
+! UPP
+!
+! SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
+! SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
+!
+! MAP 9
+! MAP a
+! MAP e
+! MAP i
+! MAP o
+! MAP u
+! MAP n
+! MAP c
+! MAP y
+! MAP s
+!
+!
+ SFX A Y 93
+***************
+*** 7,12 ****
+ SFX A ote
+! SFX A ota
+! SFX A a illa a
+! SFX A a illas a
+! SFX A a ita a
+ SFX A a itas a
+--- 26,31 ----
+ SFX A ote
+! SFX A ota
+! SFX A a illa a
+! SFX A a illas a
+! SFX A a ita a
+ SFX A a itas a
+***************
+*** 21,28 ****
+ SFX A co quilla co
+! SFX A co quillas co
+! SFX A co quillo co
+ SFX A co quillos co
+ SFX A co quita co
+! SFX A co quitas co
+! SFX A co quito co
+ SFX A co quitos co
+--- 40,47 ----
+ SFX A co quilla co
+! SFX A co quillas co
+! SFX A co quillo co
+ SFX A co quillos co
+ SFX A co quita co
+! SFX A co quitas co
+! SFX A co quito co
+ SFX A co quitos co
+***************
+*** 36,59 ****
+ SFX A go guillo go
+! SFX A go guillos go
+! SFX A go guito go
+! SFX A go guitos go
+! SFX A io illa io
+! SFX A io illas io
+! SFX A io ita io
+! SFX A io itas io
+! SFX A io illo io
+! SFX A io illos io
+! SFX A io ito io
+! SFX A io itos io
+! SFX A o ito o
+! SFX A o itos o
+! SFX A o illo o
+! SFX A o illos o
+! SFX A o ita o
+! SFX A o itas o
+! SFX A o illa o
+! SFX A o illas o
+! SFX A o ota o
+! SFX A o otas o
+! SFX A o ote o
+ SFX A o otes o
+--- 55,78 ----
+ SFX A go guillo go
+! SFX A go guillos go
+! SFX A go guito go
+! SFX A go guitos go
+! SFX A io illa io
+! SFX A io illas io
+! SFX A io ita io
+! SFX A io itas io
+! SFX A io illo io
+! SFX A io illos io
+! SFX A io ito io
+! SFX A io itos io
+! SFX A o ito o
+! SFX A o itos o
+! SFX A o illo o
+! SFX A o illos o
+! SFX A o ita o
+! SFX A o itas o
+! SFX A o illa o
+! SFX A o illas o
+! SFX A o ota o
+! SFX A o otas o
+! SFX A o ote o
+ SFX A o otes o
+***************
+*** 70,73 ****
+ SFX A zo cita zo
+! SFX A zo citas zo
+! SFX A zo cito zo
+ SFX A zo citos zo
+--- 89,92 ----
+ SFX A zo cita zo
+! SFX A zo citas zo
+! SFX A zo cito zo
+ SFX A zo citos zo
+***************
+*** 76,85 ****
+ SFX A 0 cillo [er]
+! SFX A 0 cillos [er]
+! SFX A 0 cito [er]
+! SFX A 0 citos [er]
+! SFX A 0 cita [er]
+! SFX A 0 citas [er]
+! SFX A 0 sote [er]
+! SFX A 0 sotes [er]
+! SFX A 0 sota [er]
+ SFX A 0 sotas [er]
+--- 95,104 ----
+ SFX A 0 cillo [er]
+! SFX A 0 cillos [er]
+! SFX A 0 cito [er]
+! SFX A 0 citos [er]
+! SFX A 0 cita [er]
+! SFX A 0 citas [er]
+! SFX A 0 sote [er]
+! SFX A 0 sotes [er]
+! SFX A 0 sota [er]
+ SFX A 0 sotas [er]
+***************
+*** 88,118 ****
+ SFX A 0 illo [ls]
+! SFX A 0 illos [ls]
+! SFX A 0 ita [ls]
+! SFX A 0 itas [ls]
+! SFX A 0 ito [ls]
+! SFX A 0 itos [ls]
+! SFX A 0 ota [ls]
+! SFX A 0 otas [ls]
+! SFX A 0 ote [ls]
+ SFX A 0 otes [ls]
+
+! SFX J Y 12
+! SFX J e simo e
+! SFX J e simos e
+! SFX J e sima e
+! SFX J e simas e
+! SFX J o simo o
+! SFX J o sima o
+! SFX J o simos o
+! SFX J o simas o
+! SFX J 0 simo l
+! SFX J 0 sima l
+! SFX J 0 simos l
+! SFX J 0 simas l
+!
+ SFX M Y 8
+ SFX M ble bilidad ble
+! SFX M ble bilidades ble
+ SFX M o idad o
+! SFX M o idades o
+ SFX M o amente o
+--- 107,137 ----
+ SFX A 0 illo [ls]
+! SFX A 0 illos [ls]
+! SFX A 0 ita [ls]
+! SFX A 0 itas [ls]
+! SFX A 0 ito [ls]
+! SFX A 0 itos [ls]
+! SFX A 0 ota [ls]
+! SFX A 0 otas [ls]
+! SFX A 0 ote [ls]
+ SFX A 0 otes [ls]
+
+! SFX J Y 12
+! SFX J e simo e
+! SFX J e simos e
+! SFX J e sima e
+! SFX J e simas e
+! SFX J o simo o
+! SFX J o sima o
+! SFX J o simos o
+! SFX J o simas o
+! SFX J 0 simo l
+! SFX J 0 sima l
+! SFX J 0 simos l
+! SFX J 0 simas l
+!
+ SFX M Y 8
+ SFX M ble bilidad ble
+! SFX M ble bilidades ble
+ SFX M o idad o
+! SFX M o idades o
+ SFX M o amente o
+***************
+*** 120,3490 ****
+ SFX M 0 idades [elnrsz]
+! SFX M 0 mente [elnrsz]
+!
+! SFX N Y 2
+! SFX N r damente [ai]r
+! SFX N er idamente er
+!
+! SFX P Y 20
+! SFX P e a e
+! SFX P o a o
+! SFX P 0 s [eo]
+! SFX P o as o
+! SFX P e as e
+! SFX P n ana n
+! SFX P n anes n
+! SFX P n anas n
+! SFX P n ina n
+! SFX P n ines n
+! SFX P n inas n
+! SFX P n ona n
+! SFX P n ones n
+! SFX P n onas n
+! SFX P 0 a [^aons]
+! SFX P 0 es [^aons]
+! SFX P 0 as [^aons]
+! SFX P s esa s
+! SFX P s eses s
+! SFX P s esas s
+!
+! SFX H Y 2
+! SFX H r cin [ai]r
+! SFX H r ciones [ai]r
+!
+! SFX I Y 4
+! SFX I r miento [ai]r
+! SFX I r mientos [ai]r
+! SFX I er imiento er
+! SFX I er imientos er
+!
+! SFX L Y 6
+! SFX L r nte ar
+! SFX L r ntes ar
+! SFX L er iente er
+! SFX L er ientes er
+! SFX L r ente ir
+! SFX L r entes ir
+!
+! SFX R Y 20
+! SFX R 0 me [aei]r
+! SFX R 0 te [aei]r
+! SFX R 0 se [aei]r
+! SFX R 0 nos [aei]r
+! SFX R 0 os [aei]r
+! SFX R ar ndome ar
+! SFX R ar ndote ar
+! SFX R ar ndose ar
+! SFX R ar ndonos ar
+! SFX R ar ndoos ar
+! SFX R er indome er
+! SFX R er indote er
+! SFX R er indose er
+! SFX R er indonos er
+! SFX R er indoos er
+! SFX R r ndome ir
+! SFX R r ndote ir
+! SFX R r ndose ir
+! SFX R r ndonos ir
+! SFX R r ndoos ir
+!
+! SFX S Y 11
+! SFX S 0 s [aeiou]
+! SFX S 0 es [djlry]
+! SFX S z ces z
+! SFX S 0 es [^]s
+! SFX S 0 es [^]n
+! SFX S n anes n
+! SFX S n enes n
+! SFX S n ines n
+! SFX S n ones n
+! SFX S n unes n
+! SFX S s eses s
+!
+! SFX T Y 24
+! SFX T 0 lo [aei]r
+! SFX T 0 la [aei]r
+! SFX T 0 le [aei]r
+! SFX T 0 los [aei]r
+! SFX T 0 las [aei]r
+! SFX T 0 les [aei]r
+! SFX T ar ndolo ar
+! SFX T ar ndola ar
+! SFX T ar ndole ar
+! SFX T ar ndolos ar
+! SFX T ar ndolas ar
+! SFX T ar ndoles ar
+! SFX T er indolo er
+! SFX T er indola er
+! SFX T er indole er
+! SFX T er indolos er
+! SFX T er indolas er
+! SFX T er indoles er
+! SFX T r ndolo ir
+! SFX T r ndola ir
+! SFX T r ndole ir
+! SFX T r ndolos ir
+! SFX T r ndolas ir
+! SFX T r ndoles ir
+!
+! SFX U Y 120
+! SFX U ar rmelo ar
+! SFX U ar rtelo ar
+! SFX U ar rselo ar
+! SFX U ar rnoslo ar
+! SFX U ar roslo ar
+! SFX U ar rmela ar
+! SFX U ar rtela ar
+! SFX U ar rsela ar
+! SFX U ar rnosla ar
+! SFX U ar rosla ar
+! SFX U ar rmelos ar
+! SFX U ar rtelos ar
+! SFX U ar rselos ar
+! SFX U ar rnoslos ar
+! SFX U ar roslos ar
+! SFX U ar rmelas ar
+! SFX U ar rtelas ar
+! SFX U ar rselas ar
+! SFX U ar rnoslas ar
+! SFX U ar roslas ar
+! SFX U ar ndomelo ar
+! SFX U ar ndotelo ar
+! SFX U ar ndoselo ar
+! SFX U ar ndonoslo ar
+! SFX U ar ndooslo ar
+! SFX U ar ndomela ar
+! SFX U ar ndotela ar
+! SFX U ar ndosela ar
+! SFX U ar ndonosla ar
+! SFX U ar ndoosla ar
+! SFX U ar ndomelos ar
+! SFX U ar ndotelos ar
+! SFX U ar ndoselos ar
+! SFX U ar ndonoslos ar
+! SFX U ar ndooslos ar
+! SFX U ar ndomelas ar
+! SFX U ar ndotelas ar
+! SFX U ar ndoselas ar
+! SFX U ar ndonoslas ar
+! SFX U ar ndooslas ar
+! SFX U er rmelo er
+! SFX U er rtelo er
+! SFX U er rselo er
+! SFX U er rnoslo er
+! SFX U er roslo er
+! SFX U er rmela er
+! SFX U er rtela er
+! SFX U er rsela er
+! SFX U er rnosla er
+! SFX U er rosla er
+! SFX U er rmelos er
+! SFX U er rtelos er
+! SFX U er rselos er
+! SFX U er rnoslos er
+! SFX U er roslos er
+! SFX U er rmelas er
+! SFX U er rtelas er
+! SFX U er rselas er
+! SFX U er rnoslas er
+! SFX U er roslas er
+! SFX U er indomelo er
+! SFX U er indotelo er
+! SFX U er indoselo er
+! SFX U er indonoslo er
+! SFX U er indooslo er
+! SFX U er indomela er
+! SFX U er indotela er
+! SFX U er indosela er
+! SFX U er indonosla er
+! SFX U er indoosla er
+! SFX U er indomelos er
+! SFX U er indotelos er
+! SFX U er indoselos er
+! SFX U er indonoslos er
+! SFX U er indooslos er
+! SFX U er indomelas er
+! SFX U er indotelas er
+! SFX U er indoselas er
+! SFX U er indonoslas er
+! SFX U er indooslas er
+! SFX U ir rmelo ir
+! SFX U ir rtelo ir
+! SFX U ir rselo ir
+! SFX U ir rnoslo ir
+! SFX U ir roslo ir
+! SFX U ir rmela ir
+! SFX U ir rtela ir
+! SFX U ir rsela ir
+! SFX U ir rnosla ir
+! SFX U ir rosla ir
+! SFX U ir rmelas ir
+! SFX U ir rtelas ir
+! SFX U ir rselas ir
+! SFX U ir rnoslas ir
+! SFX U ir roslas ir
+! SFX U ir rmelos ir
+! SFX U ir rtelos ir
+! SFX U ir rselos ir
+! SFX U ir rnoslos ir
+! SFX U ir roslos ir
+! SFX U r ndomelo ir
+! SFX U r ndotelo ir
+! SFX U r ndoselo ir
+! SFX U r ndonoslo ir
+! SFX U r ndooslo ir
+! SFX U r ndomela ir
+! SFX U r ndotela ir
+! SFX U r ndosela ir
+! SFX U r ndonosla ir
+! SFX U r ndoosla ir
+! SFX U r ndomelos ir
+! SFX U r ndotelos ir
+! SFX U r ndoselos ir
+! SFX U r ndonoslos ir
+! SFX U r ndooslos ir
+! SFX U r ndomelas ir
+! SFX U r ndotelas ir
+! SFX U r ndoselas ir
+! SFX U r ndonoslas ir
+! SFX U r ndooslas ir
+!
+! SFX V Y 169
+! SFX V ar o ar
+! SFX V er o [^cg]er
+! SFX V cer zo cer
+! SFX V ger jo ger
+! SFX V ir o [^cgu]ir
+! SFX V cir zo cir
+! SFX V gir jo gir
+! SFX V uir o guir
+! SFX V quir co quir
+! SFX V r s [ae]r
+! SFX V ir es ir
+! SFX V ar a ar
+! SFX V er e er
+! SFX V ir e ir
+! SFX V r mos [aei]r
+! SFX V ar is ar
+! SFX V er is er
+! SFX V ir s ir
+! SFX V r n [ae]r
+! SFX V ir en ir
+! SFX V r ba ar
+! SFX V er a er
+! SFX V ir a ir
+! SFX V r bas ar
+! SFX V er as er
+! SFX V ir as ir
+! SFX V ar bamos ar
+! SFX V er amos er
+! SFX V ir amos ir
+! SFX V r bais ar
+! SFX V er ais er
+! SFX V ir ais ir
+! SFX V r ban ar
+! SFX V er an er
+! SFX V ir an ir
+! SFX V ar [^czg]ar
+! SFX V car qu car
+! SFX V ar u gar
+! SFX V zar c zar
+! SFX V er er
+! SFX V ir ir
+! SFX V r ste [ai]r
+! SFX V er iste er
+! SFX V ar ar
+! SFX V er i er
+! SFX V r ir
+! SFX V er imos er
+! SFX V r steis [ai]r
+! SFX V er isteis er
+! SFX V 0 on ar
+! SFX V er ieron er
+! SFX V r eron ir
+! SFX V 0 [aei]r
+! SFX V 0 s [aei]r
+! SFX V 0 [aei]r
+! SFX V 0 emos [aei]r
+! SFX V 0 is [aei]r
+! SFX V 0 n [aei]r
+! SFX V 0 a [aei]r
+! SFX V 0 as [aei]r
+! SFX V 0 amos [aei]r
+! SFX V 0 ais [aei]r
+! SFX V 0 an [aei]r
+! SFX V ar e [^czg]ar
+! SFX V car que car
+! SFX V ar ue gar
+! SFX V zar ce zar
+! SFX V er a [^cg]er
+! SFX V cer za cer
+! SFX V ger ja ger
+! SFX V ir a [^cgu]ir
+! SFX V cir za cir
+! SFX V gir ja gir
+! SFX V uir a guir
+! SFX V quir ca quir
+! SFX V ar es [^czg]ar
+! SFX V car ques car
+! SFX V ar ues gar
+! SFX V zar ces zar
+! SFX V er as [^cg]er
+! SFX V cer zas cer
+! SFX V ger jas ger
+! SFX V ir as [^cgu]ir
+! SFX V cir zas cir
+! SFX V gir jas gir
+! SFX V uir as guir
+! SFX V quir cas quir
+! SFX V ar emos [^czg]ar
+! SFX V car quemos car
+! SFX V ar uemos gar
+! SFX V zar cemos zar
+! SFX V er amos [^cg]er
+! SFX V cer zamos cer
+! SFX V ger jamos ger
+! SFX V ir amos [^cgu]ir
+! SFX V cir zamos cir
+! SFX V gir jamos gir
+! SFX V uir amos guir
+! SFX V quir camos quir
+! SFX V ar is [^czg]ar
+! SFX V car quis car
+! SFX V ar uis gar
+! SFX V zar cis zar
+! SFX V er is [^cg]er
+! SFX V cer zis cer
+! SFX V ger jis ger
+! SFX V ir is [^cgu]ir
+! SFX V cir zis cir
+! SFX V gir jis gir
+! SFX V uir is guir
+! SFX V quir cis quir
+! SFX V ar en [^czg]ar
+! SFX V car quen car
+! SFX V ar uen gar
+! SFX V zar cen zar
+! SFX V er an [^cg]er
+! SFX V cer zan cer
+! SFX V ger jan ger
+! SFX V ir an [^cgu]ir
+! SFX V cir zan cir
+! SFX V gir jan gir
+! SFX V uir an guir
+! SFX V quir can quir
+! SFX V r se ar
+! SFX V r ra ar
+! SFX V er iese er
+! SFX V er iera er
+! SFX V r ese ir
+! SFX V r era ir
+! SFX V r ses ar
+! SFX V r ras ar
+! SFX V er ieses er
+! SFX V er ieras er
+! SFX V r eses ir
+! SFX V r eras ir
+! SFX V ar semos ar
+! SFX V ar ramos ar
+! SFX V er isemos er
+! SFX V er iramos er
+! SFX V r semos ir
+! SFX V r ramos ir
+! SFX V r seis ar
+! SFX V r rais ar
+! SFX V er ieseis er
+! SFX V er ierais er
+! SFX V r eseis ir
+! SFX V r erais ir
+! SFX V r sen ar
+! SFX V r ran ar
+! SFX V er iesen er
+! SFX V er ieran er
+! SFX V r esen ir
+! SFX V r eran ir
+! SFX V r re ar
+! SFX V er iere er
+! SFX V r ere ir
+! SFX V r res ar
+! SFX V er ieres er
+! SFX V r eres ir
+! SFX V ar remos ar
+! SFX V er iremos er
+! SFX V r remos ir
+! SFX V r reis ar
+! SFX V er iereis er
+! SFX V r ereis ir
+! SFX V r ren ar
+! SFX V er ieren er
+! SFX V r eren ir
+! SFX V r d r
+!
+! SFX X Y 11
+! SFX X r do [ai]r
+! SFX X r dos [ai]r
+! SFX X r da [ai]r
+! SFX X r das [ai]r
+! SFX X er ido er
+! SFX X er idos er
+! SFX X er ida er
+! SFX X er idas er
+! SFX X r ndo ar
+! SFX X er iendo er
+! SFX X r endo ir
+!
+! SFX W Y 197 S
+! SFX W ar a andar
+! SFX W ar a guar
+! SFX W er a [eo]er
+! SFX W r ba ar
+! SFX W obar ueba obar
+! SFX W ebir iba ebir
+! SFX W erbar ierba erbar
+! SFX W ibir ba ohibir
+! SFX W ocar ueca ocar
+! SFX W olcar uelca olcar
+! SFX W orcar uerca orcar
+! SFX W cer zca [^c]ocer
+! SFX W cer zca [^fh]acer
+! SFX W cer zca ecer
+! SFX W cir zca ucir
+! SFX W eder ieda eder
+! SFX W odar ueda odar
+! SFX W oder ueda oder
+! SFX W edir ida edir
+! SFX W oldar uelda [^g]oldar
+! SFX W oldar elda goldar
+! SFX W endar ienda endar
+! SFX W ender ienda ender
+! SFX W endir inda endir
+! SFX W erder ierda erder
+! SFX W ordar uerda ordar
+! SFX W order uerda order
+! SFX W cer ga [fh]acer
+! SFX W er ga [eo]ner
+! SFX W er ga aler
+! SFX W ir ga alir
+! SFX W gar ega ugar
+! SFX W egar iega egar
+! SFX W ogar uega ogar
+! SFX W ecir iga ecir
+! SFX W eguir iga eguir
+! SFX W er iga aer
+! SFX W er iga oer
+! SFX W r iga or
+! SFX W olgar uelga olgar
+! SFX W enir enga enir
+! SFX W engar ienga engar
+! SFX W enchir incha enchir
+! SFX W egir ija egir
+! SFX W ijar ja [ae]hijar
+! SFX W oblar uebla oblar
+! SFX W emblar iembla emblar
+! SFX W elar iela elar
+! SFX W olar uela olar
+! SFX W oler uela oler
+! SFX W ollar uella [^g]ollar
+! SFX W ollar ella gollar
+! SFX W ilar la [ae]hilar
+! SFX W emir ima emir
+! SFX W ormir uerma ormir
+! SFX W umar ma [ae]humar
+! SFX W onar uena onar
+! SFX W ernar ierna ernar
+! SFX W erner ierna erner
+! SFX W ernir ierna ernir
+! SFX W ornar uerna ornar
+! SFX W inar na [aeo]hinar
+! SFX W unir na eunir
+! SFX W aber epa saber
+! SFX W caber quepa caber
+! SFX W r ra [^a]ndar
+! SFX W r ra [^d]ar
+! SFX W r ra [^n]dar
+! SFX W ebrar iebra ebrar
+! SFX W embrar iembra embrar
+! SFX W edrar iedra edrar
+! SFX W endrar iendra endrar
+! SFX W r era alir
+! SFX W r era ernir
+! SFX W r era eunir
+! SFX W r era ohibir
+! SFX W er iera [^fh]acer
+! SFX W er iera aler
+! SFX W er iera e[cd]er
+! SFX W er iera ender
+! SFX W er iera er[dnt]er
+! SFX W er iera o[clv]er
+! SFX W er iera olver
+! SFX W er iera or[cd]er
+! SFX W erer iera erer
+! SFX W erir iera erir
+! SFX W er iera er
+! SFX W irir iera irir
+! SFX W ebir ibiera ebir
+! SFX W acer iciera [fh]acer
+! SFX W edir idiera edir
+! SFX W endir indiera endir
+! SFX W oder udiera oder
+! SFX W egir igiera egir
+! SFX W enchir inchiera enchir
+! SFX W emir imiera emir
+! SFX W ormir urmiera ormir
+! SFX W enir iniera enir
+! SFX W aber upiera aber
+! SFX W erir iriera erir
+! SFX W irir iriera irir
+! SFX W orir uriera orir
+! SFX W erer isiera erer
+! SFX W oner usiera oner
+! SFX W etir itiera etir
+! SFX W entir intiera entir
+! SFX W ertir irtiera ertir
+! SFX W estir istiera estir
+! SFX W eguir iguiera eguir
+! SFX W ervir irviera ervir
+! SFX W ar uviera andar
+! SFX W ener uviera ener
+! SFX W cir jera ucir
+! SFX W er jera raer
+! SFX W ecir ijera ecir
+! SFX W orar uera [^g]orar
+! SFX W orir uera orir
+! SFX W er yera [eo]er
+! SFX W er yera caer
+! SFX W ir yera [^g]uir
+! SFX W r yera or
+! SFX W ir uyera gir
+! SFX W eir iera eir
+! SFX W orar era gorar
+! SFX W errar ierra errar
+! SFX W ontrar uentra ontrar
+! SFX W ostrar uestra ostrar
+! SFX W esar iesa esar
+! SFX W osar uesa osar
+! SFX W ensar iensa ensar
+! SFX W usar sa [ae]husar
+! SFX W etar ieta etar
+! SFX W etir ita etir
+! SFX W oltar uelta oltar
+! SFX W entar ienta entar
+! SFX W entir ienta entir
+! SFX W ontar uenta ontar
+! SFX W ertar ierta ertar
+! SFX W erter ierta erter
+! SFX W ertir ierta ertir
+! SFX W ortar uerta ortar
+! SFX W estar iesta estar
+! SFX W ostar uesta ostar
+! SFX W estir ista estir
+! SFX W itar ta [ae]hitar
+! SFX W evar ieva evar
+! SFX W ovar ueva ovar
+! SFX W over ueva over
+! SFX W olver uelva olver
+! SFX W ervir irva ervir
+! SFX W er ya oer
+! SFX W ir ya [^g]uir
+! SFX W ir uya gir
+! SFX W ezar ieza ezar
+! SFX W ocer ueza cocer
+! SFX W enzar ienza enzar
+! SFX W onzar enza gonzar
+! SFX W orcer uerza orcer
+! SFX W orzar uerza orzar
+! SFX W izar za [ae]izar
+! SFX W 0 a [^fh]acer
+! SFX W 0 a [aeo]er
+! SFX W 0 a [io]rir
+! SFX W 0 a [u]ir
+! SFX W 0 a ar
+! SFX W 0 a e[bdgmrt]ir
+! SFX W 0 a e[cd]er
+! SFX W 0 a e[ns]tir
+! SFX W 0 a enchir
+! SFX W 0 a ender
+! SFX W 0 a endir
+! SFX W 0 a er[dnt]er
+! SFX W 0 a er[ntv]ir
+! SFX W 0 a eunir
+! SFX W 0 a o[clv]er
+! SFX W 0 a olver
+! SFX W 0 a or[cd]er
+! SFX W 0 a ormir
+! SFX W 0 a ucir
+! SFX W er a er
+! SFX W er a er
+! SFX W iar a iar
+! SFX W ir a ir
+! SFX W r a r
+! SFX W cer ra [fh]acer
+! SFX W er ra aber
+! SFX W er ra erer
+! SFX W er ra oder
+! SFX W er dra [eo]ner
+! SFX W er dra aler
+! SFX W ir dra alir
+! SFX W ir dra enir
+! SFX W ecir ira ecir
+! SFX W r ira [eo]r
+! SFX W oar uea oar
+! SFX W eir ia eir
+! SFX W uar a [^g]uar
+!
+! SFX W Y 264 S
+! SFX W ar e andar
+! SFX W er e [^c]ocer
+! SFX W er e [cr]aer
+! SFX W er e [eo]er
+! SFX W er e a[bcl]er
+! SFX W er e ecer
+! SFX W er e oner
+! SFX W ir e alir
+! SFX W ir e ucir
+! SFX W obar uebe obar
+! SFX W ebir ibe ebir
+! SFX W erbar ierbe erbar
+! SFX W ibir be ohibir
+! SFX W ezar iece ezar
+! SFX W ocer uece cocer
+! SFX W acer ice [fh]acer
+! SFX W ecir ice ecir
+! SFX W enzar ience enzar
+! SFX W onzar ence gonzar
+! SFX W orcer uerce orcer
+! SFX W orzar uerce orzar
+! SFX W izar ce [ae]izar
+! SFX W eder iede eder
+! SFX W odar uede odar
+! SFX W oder uede oder
+! SFX W edir ide edir
+! SFX W oldar uelde [^g]oldar
+! SFX W oldar elde goldar
+! SFX W endar iende endar
+! SFX W ender iende ender
+! SFX W endir inde endir
+! SFX W erder ierde erder
+! SFX W ordar uerde ordar
+! SFX W order uerde order
+! SFX W oder ude oder
+! SFX W egir ige egir
+! SFX W enchir inche enchir
+! SFX W cir je ucir
+! SFX W er je raer
+! SFX W ecir ije ecir
+! SFX W ijar je [ae]hijar
+! SFX W oblar ueble oblar
+! SFX W emblar iemble emblar
+! SFX W elar iele elar
+! SFX W olar uele olar
+! SFX W oler uele oler
+! SFX W ollar uelle [^g]ollar
+! SFX W ollar elle gollar
+! SFX W ilar le [ae]hilar
+! SFX W emir ime emir
+! SFX W ormir uerme ormir
+! SFX W umar me [ae]humar
+! SFX W ener iene ener
+! SFX W enir iene enir
+! SFX W onar uene onar
+! SFX W enir ine enir
+! SFX W ernar ierne ernar
+! SFX W erner ierne erner
+! SFX W ernir ierne ernir
+! SFX W ornar uerne ornar
+! SFX W inar ne [aeo]hinar
+! SFX W unir ne eunir
+! SFX W aber upe aber
+! SFX W r re [^a]ndar
+! SFX W r re [^d]ar
+! SFX W r re [^n]dar
+! SFX W ebrar iebre ebrar
+! SFX W embrar iembre embrar
+! SFX W edrar iedre edrar
+! SFX W endrar iendre endrar
+! SFX W r ere alir
+! SFX W r ere ernir
+! SFX W r ere eunir
+! SFX W r ere ohibir
+! SFX W er iere [^fh]acer
+! SFX W er iere aler
+! SFX W er iere e[cd]er
+! SFX W er iere ender
+! SFX W er iere er[dnt]er
+! SFX W er iere o[clv]er
+! SFX W er iere olver
+! SFX W er iere or[cd]er
+! SFX W erer iere erer
+! SFX W erir iere erir
+! SFX W er iere er
+! SFX W irir iere irir
+! SFX W ebir ibiere ebir
+! SFX W acer iciere [fh]acer
+! SFX W edir idiere edir
+! SFX W endir indiere endir
+! SFX W oder udiere oder
+! SFX W egir igiere egir
+! SFX W enchir inchiere enchir
+! SFX W emir imiere emir
+! SFX W ormir urmiere ormir
+! SFX W enir iniere enir
+! SFX W aber upiere aber
+! SFX W erir iriere erir
+! SFX W irir iriere irir
+! SFX W orir uriere orir
+! SFX W erer isiere erer
+! SFX W oner usiere oner
+! SFX W etir itiere etir
+! SFX W entir intiere entir
+! SFX W ertir irtiere ertir
+! SFX W estir istiere estir
+! SFX W eguir iguiere eguir
+! SFX W ervir irviere ervir
+! SFX W ar uviere andar
+! SFX W ener uviere ener
+! SFX W cir jere ucir
+! SFX W er jere raer
+! SFX W ecir ijere ecir
+! SFX W orar uere [^g]orar
+! SFX W orir uere orir
+! SFX W er yere [eo]er
+! SFX W er yere caer
+! SFX W ir yere [^g]uir
+! SFX W r yere or
+! SFX W ir uyere gir
+! SFX W eir iere eir
+! SFX W orar ere gorar
+! SFX W errar ierre errar
+! SFX W ontrar uentre ontrar
+! SFX W ostrar uestre ostrar
+! SFX W r se [^a]ndar
+! SFX W r se [^d]ar
+! SFX W r se [^n]dar
+! SFX W r ese alir
+! SFX W r ese ernir
+! SFX W r ese eunir
+! SFX W r ese ohibir
+! SFX W er iese [^fh]acer
+! SFX W er iese aler
+! SFX W er iese e[cd]er
+! SFX W er iese ender
+! SFX W er iese er[dnt]er
+! SFX W er iese o[clv]er
+! SFX W er iese olver
+! SFX W er iese or[cd]er
+! SFX W esar iese esar
+! SFX W er iese er
+! SFX W ebir ibiese ebir
+! SFX W acer iciese [fh]acer
+! SFX W edir idiese edir
+! SFX W endir indiese endir
+! SFX W oder udiese oder
+! SFX W egir igiese egir
+! SFX W enchir inchiese enchir
+! SFX W emir imiese emir
+! SFX W ormir urmiese ormir
+! SFX W enir iniese enir
+! SFX W aber upiese aber
+! SFX W erir iriese erir
+! SFX W irir iriese irir
+! SFX W orir uriese orir
+! SFX W erer isiese erer
+! SFX W oner usiese oner
+! SFX W etir itiese etir
+! SFX W entir intiese entir
+! SFX W ertir irtiese ertir
+! SFX W estir istiese estir
+! SFX W eguir iguiese eguir
+! SFX W ervir irviese ervir
+! SFX W ar uviese andar
+! SFX W ener uviese ener
+! SFX W cir jese ucir
+! SFX W er jese raer
+! SFX W ecir ijese ecir
+! SFX W osar uese osar
+! SFX W er yese [eo]er
+! SFX W er yese caer
+! SFX W ir yese [^g]uir
+! SFX W r yese or
+! SFX W ir uyese gir
+! SFX W eir iese eir
+! SFX W erer ise erer
+! SFX W ensar iense ensar
+! SFX W oner use oner
+! SFX W umar se [ae]husar
+! SFX W etar iete etar
+! SFX W etir ite etir
+! SFX W oltar uelte oltar
+! SFX W entar iente entar
+! SFX W entir iente entir
+! SFX W ontar uente ontar
+! SFX W ertar ierte ertar
+! SFX W erter ierte erter
+! SFX W ertir ierte ertir
+! SFX W ortar uerte ortar
+! SFX W r ste [^a]ndar
+! SFX W r ste [^d]ar
+! SFX W r ste [^n]dar
+! SFX W r ste [eo]r
+! SFX W r ste [u]ir
+! SFX W r ste alir
+! SFX W r ste ebir
+! SFX W r ste edir
+! SFX W r ste egir
+! SFX W r ste emir
+! SFX W r ste enchir
+! SFX W r ste endir
+! SFX W r ste entir
+! SFX W r ste erir
+! SFX W r ste ernir
+! SFX W r ste ertir
+! SFX W r ste ervir
+! SFX W r ste estir
+! SFX W r ste etir
+! SFX W r ste eunir
+! SFX W r ste eir
+! SFX W r ste irir
+! SFX W r ste orir
+! SFX W r ste ormir
+! SFX W estar ieste estar
+! SFX W ostar ueste ostar
+! SFX W er iste [^fh]acer
+! SFX W er iste aler
+! SFX W er iste e[cd]er
+! SFX W er iste ender
+! SFX W er iste er[dnt]er
+! SFX W er iste o[clv]er
+! SFX W er iste olver
+! SFX W er iste or[cd]er
+! SFX W estir iste estir
+! SFX W acer iciste [fh]acer
+! SFX W oder udiste oder
+! SFX W cir jiste ucir
+! SFX W er jiste raer
+! SFX W ecir ijiste ecir
+! SFX W enir iniste enir
+! SFX W aber upiste aber
+! SFX W erer isiste erer
+! SFX W oner usiste oner
+! SFX W ar uviste andar
+! SFX W ener uviste ener
+! SFX W er ste [eo]er
+! SFX W er ste caer
+! SFX W itar te [ae]hitar
+! SFX W gar egue ugar
+! SFX W egar iegue egar
+! SFX W ogar uegue ogar
+! SFX W eguir igue eguir
+! SFX W olgar uelgue olgar
+! SFX W engar iengue engar
+! SFX W ocar ueque ocar
+! SFX W olcar uelque olcar
+! SFX W orcar uerque orcar
+! SFX W evar ieve evar
+! SFX W ovar ueve ovar
+! SFX W over ueve over
+! SFX W olver uelve olver
+! SFX W ervir irve ervir
+! SFX W ar uve andar
+! SFX W ener uve ener
+! SFX W r ye or
+! SFX W uir uye [^g]uir
+! SFX W ir uye gir
+! SFX W er e er
+! SFX W iar e iar
+! SFX W oar uee oar
+! SFX W eir ie eir
+! SFX W uar e [^g]uar
+! SFX W uar e guar
+!
+!
+! SFX W Y 195 S
+! SFX W er an [eo]er
+! SFX W r ban ar
+! SFX W obar ueban obar
+! SFX W ebir iban ebir
+! SFX W erbar ierban erbar
+! SFX W ibir ban ohibir
+! SFX W ocar uecan ocar
+! SFX W olcar uelcan olcar
+! SFX W orcar uercan orcar
+! SFX W cer zcan [^c]ocer
+! SFX W cer zcan [^fh]acer
+! SFX W cer zcan ecer
+! SFX W cir zcan ucir
+! SFX W eder iedan eder
+! SFX W odar uedan odar
+! SFX W oder uedan oder
+! SFX W edir idan edir
+! SFX W oldar ueldan [^g]oldar
+! SFX W oldar eldan goldar
+! SFX W endar iendan endar
+! SFX W ender iendan ender
+! SFX W endir indan endir
+! SFX W erder ierdan erder
+! SFX W ordar uerdan ordar
+! SFX W order uerdan order
+! SFX W cer gan [fh]acer
+! SFX W er gan [eo]ner
+! SFX W er gan aler
+! SFX W ir gan alir
+! SFX W gar egan ugar
+! SFX W egar iegan egar
+! SFX W ogar uegan ogar
+! SFX W ecir igan ecir
+! SFX W eguir igan eguir
+! SFX W er igan aer
+! SFX W er igan oer
+! SFX W r igan or
+! SFX W olgar uelgan olgar
+! SFX W enir engan enir
+! SFX W engar iengan engar
+! SFX W enchir inchan enchir
+! SFX W egir ijan egir
+! SFX W ijar jan [ae]hijar
+! SFX W oblar ueblan oblar
+! SFX W emblar iemblan emblar
+! SFX W elar ielan elar
+! SFX W olar uelan olar
+! SFX W oler uelan oler
+! SFX W ollar uellan [^g]ollar
+! SFX W ollar ellan gollar
+! SFX W ilar lan [ae]hilar
+! SFX W emir iman emir
+! SFX W ormir uerman ormir
+! SFX W umar man [ae]humar
+! SFX W onar uenan onar
+! SFX W ernar iernan ernar
+! SFX W erner iernan erner
+! SFX W ernir iernan ernir
+! SFX W ornar uernan ornar
+! SFX W inar nan [aeo]hinar
+! SFX W unir nan eunir
+! SFX W aber epan saber
+! SFX W caber quepan caber
+! SFX W r ran [^a]ndar
+! SFX W r ran [^d]ar
+! SFX W r ran [^n]dar
+! SFX W ebrar iebran ebrar
+! SFX W embrar iembran embrar
+! SFX W edrar iedran edrar
+! SFX W endrar iendran endrar
+! SFX W r eran alir
+! SFX W r eran ernir
+! SFX W r eran eunir
+! SFX W r eran ohibir
+! SFX W er ieran [^fh]acer
+! SFX W er ieran aler
+! SFX W er ieran e[cd]er
+! SFX W er ieran ender
+! SFX W er ieran er[dnt]er
+! SFX W er ieran o[clv]er
+! SFX W er ieran olver
+! SFX W er ieran or[cd]er
+! SFX W erer ieran erer
+! SFX W erir ieran erir
+! SFX W er ieran er
+! SFX W irir ieran irir
+! SFX W ebir ibieran ebir
+! SFX W acer icieran [fh]acer
+! SFX W edir idieran edir
+! SFX W endir indieran endir
+! SFX W oder udieran oder
+! SFX W egir igieran egir
+! SFX W enchir inchieran enchir
+! SFX W emir imieran emir
+! SFX W ormir urmieran ormir
+! SFX W enir inieran enir
+! SFX W aber upieran aber
+! SFX W erir irieran erir
+! SFX W irir irieran irir
+! SFX W orir urieran orir
+! SFX W erer isieran erer
+! SFX W oner usieran oner
+! SFX W etir itieran etir
+! SFX W entir intieran entir
+! SFX W ertir irtieran ertir
+! SFX W estir istieran estir
+! SFX W eguir iguieran eguir
+! SFX W ervir irvieran ervir
+! SFX W ar uvieran andar
+! SFX W ener uvieran ener
+! SFX W cir jeran ucir
+! SFX W er jeran raer
+! SFX W ecir ijeran ecir
+! SFX W orar ueran [^g]orar
+! SFX W orir ueran orir
+! SFX W er yeran [eo]er
+! SFX W er yeran caer
+! SFX W ir yeran [^g]uir
+! SFX W r yeran or
+! SFX W ir uyeran gir
+! SFX W eir ieran eir
+! SFX W orar eran gorar
+! SFX W errar ierran errar
+! SFX W ontrar uentran ontrar
+! SFX W ostrar uestran ostrar
+! SFX W esar iesan esar
+! SFX W osar uesan osar
+! SFX W ensar iensan ensar
+! SFX W usar san [ae]husar
+! SFX W etar ietan etar
+! SFX W etir itan etir
+! SFX W oltar ueltan oltar
+! SFX W entar ientan entar
+! SFX W entir ientan entir
+! SFX W ontar uentan ontar
+! SFX W ertar iertan ertar
+! SFX W erter iertan erter
+! SFX W ertir iertan ertir
+! SFX W ortar uertan ortar
+! SFX W estar iestan estar
+! SFX W ostar uestan ostar
+! SFX W estir istan estir
+! SFX W itar tan [ae]hitar
+! SFX W evar ievan evar
+! SFX W ovar uevan ovar
+! SFX W over uevan over
+! SFX W olver uelvan olver
+! SFX W ervir irvan ervir
+! SFX W er yan oer
+! SFX W ir yan [^g]uir
+! SFX W ir uyan gir
+! SFX W ezar iezan ezar
+! SFX W ocer uezan cocer
+! SFX W enzar ienzan enzar
+! SFX W onzar enzan gonzar
+! SFX W orcer uerzan orcer
+! SFX W orzar uerzan orzar
+! SFX W izar zan [ae]izar
+! SFX W 0 an [^fh]acer
+! SFX W 0 an [aeo]er
+! SFX W 0 an [io]rir
+! SFX W 0 an [u]ir
+! SFX W 0 an ar
+! SFX W 0 an e[bdgmrt]ir
+! SFX W 0 an e[cd]er
+! SFX W 0 an e[ns]tir
+! SFX W 0 an enchir
+! SFX W 0 an ender
+! SFX W 0 an endir
+! SFX W 0 an er[dnt]er
+! SFX W 0 an er[ntv]ir
+! SFX W 0 an eunir
+! SFX W 0 an o[clv]er
+! SFX W 0 an olver
+! SFX W 0 an or[cd]er
+! SFX W 0 an ormir
+! SFX W 0 an ucir
+! SFX W er an er
+! SFX W er an er
+! SFX W iar an iar
+! SFX W ir an ir
+! SFX W r an r
+! SFX W cer ran [fh]acer
+! SFX W er ran aber
+! SFX W er ran erer
+! SFX W er ran oder
+! SFX W er dran [eo]ner
+! SFX W er dran aler
+! SFX W ir dran alir
+! SFX W ir dran enir
+! SFX W ecir iran ecir
+! SFX W r iran [eo]r
+! SFX W oar uean oar
+! SFX W eir ian eir
+! SFX W uar an [^g]uar
+!
+!
+! SFX W Y 202 S
+! SFX W ar en andar
+! SFX W ir en alir
+! SFX W ir en ucir
+! SFX W obar ueben obar
+! SFX W ebir iben ebir
+! SFX W erbar ierben erbar
+! SFX W ibir ben ohibir
+! SFX W ezar iecen ezar
+! SFX W ocer uecen cocer
+! SFX W ecir icen ecir
+! SFX W enzar iencen enzar
+! SFX W onzar encen gonzar
+! SFX W orcer uercen orcer
+! SFX W orzar uercen orzar
+! SFX W izar cen [ae]izar
+! SFX W eder ieden eder
+! SFX W odar ueden odar
+! SFX W oder ueden oder
+! SFX W edir iden edir
+! SFX W oldar uelden [^g]oldar
+! SFX W oldar elden goldar
+! SFX W endar ienden endar
+! SFX W ender ienden ender
+! SFX W endir inden endir
+! SFX W erder ierden erder
+! SFX W ordar uerden ordar
+! SFX W order uerden order
+! SFX W egir igen egir
+! SFX W enchir inchen enchir
+! SFX W ijar jen [ae]hijar
+! SFX W oblar ueblen oblar
+! SFX W emblar iemblen emblar
+! SFX W elar ielen elar
+! SFX W olar uelen olar
+! SFX W oler uelen oler
+! SFX W ollar uellen [^g]ollar
+! SFX W ollar ellen gollar
+! SFX W ilar len [ae]hilar
+! SFX W emir imen emir
+! SFX W ormir uermen ormir
+! SFX W umar men [ae]humar
+! SFX W ener ienen ener
+! SFX W enir ienen enir
+! SFX W onar uenen onar
+! SFX W ernar iernen ernar
+! SFX W erner iernen erner
+! SFX W ernir iernen ernir
+! SFX W ornar uernen ornar
+! SFX W inar nen [aeo]hinar
+! SFX W unir nen eunir
+! SFX W r ren [^a]ndar
+! SFX W r ren [^d]ar
+! SFX W r ren [^n]dar
+! SFX W ebrar iebren ebrar
+! SFX W embrar iembren embrar
+! SFX W edrar iedren edrar
+! SFX W endrar iendren endrar
+! SFX W r eren alir
+! SFX W r eren ernir
+! SFX W r eren eunir
+! SFX W r eren ohibir
+! SFX W er ieren [^fh]acer
+! SFX W er ieren aler
+! SFX W er ieren e[cd]er
+! SFX W er ieren ender
+! SFX W er ieren er[dnt]er
+! SFX W er ieren o[clv]er
+! SFX W er ieren olver
+! SFX W er ieren or[cd]er
+! SFX W erer ieren erer
+! SFX W erir ieren erir
+! SFX W er ieren er
+! SFX W irir ieren irir
+! SFX W ebir ibieren ebir
+! SFX W acer icieren [fh]acer
+! SFX W edir idieren edir
+! SFX W endir indieren endir
+! SFX W oder udieren oder
+! SFX W egir igieren egir
+! SFX W enchir inchieren enchir
+! SFX W emir imieren emir
+! SFX W ormir urmieren ormir
+! SFX W enir inieren enir
+! SFX W aber upieren aber
+! SFX W erir irieren erir
+! SFX W irir irieren irir
+! SFX W orir urieren orir
+! SFX W erer isieren erer
+! SFX W oner usieren oner
+! SFX W etir itieren etir
+! SFX W entir intieren entir
+! SFX W ertir irtieren ertir
+! SFX W estir istieren estir
+! SFX W eguir iguieren eguir
+! SFX W ervir irvieren ervir
+! SFX W ar uvieren andar
+! SFX W ener uvieren ener
+! SFX W cir jeren ucir
+! SFX W er jeren raer
+! SFX W ecir ijeren ecir
+! SFX W orar ueren [^g]orar
+! SFX W orir ueren orir
+! SFX W er yeren [eo]er
+! SFX W er yeren caer
+! SFX W ir yeren [^g]uir
+! SFX W r yeren or
+! SFX W ir uyeren gir
+! SFX W eir ieren eir
+! SFX W orar eren gorar
+! SFX W errar ierren errar
+! SFX W ontrar uentren ontrar
+! SFX W ostrar uestren ostrar
+! SFX W r sen [^a]ndar
+! SFX W r sen [^d]ar
+! SFX W r sen [^n]dar
+! SFX W r esen alir
+! SFX W r esen ernir
+! SFX W r esen eunir
+! SFX W r esen ohibir
+! SFX W er iesen [^fh]acer
+! SFX W er iesen aler
+! SFX W er iesen e[cd]er
+! SFX W er iesen ender
+! SFX W er iesen er[dnt]er
+! SFX W er iesen o[clv]er
+! SFX W er iesen olver
+! SFX W er iesen or[cd]er
+! SFX W esar iesen esar
+! SFX W er iesen er
+! SFX W ebir ibiesen ebir
+! SFX W acer iciesen [fh]acer
+! SFX W edir idiesen edir
+! SFX W endir indiesen endir
+! SFX W oder udiesen oder
+! SFX W egir igiesen egir
+! SFX W enchir inchiesen enchir
+! SFX W emir imiesen emir
+! SFX W ormir urmiesen ormir
+! SFX W enir iniesen enir
+! SFX W aber upiesen aber
+! SFX W erir iriesen erir
+! SFX W irir iriesen irir
+! SFX W orir uriesen orir
+! SFX W erer isiesen erer
+! SFX W oner usiesen oner
+! SFX W etir itiesen etir
+! SFX W entir intiesen entir
+! SFX W ertir irtiesen ertir
+! SFX W estir istiesen estir
+! SFX W eguir iguiesen eguir
+! SFX W ervir irviesen ervir
+! SFX W ar uviesen andar
+! SFX W ener uviesen ener
+! SFX W cir jesen ucir
+! SFX W er jesen raer
+! SFX W ecir ijesen ecir
+! SFX W osar uesen osar
+! SFX W er yesen [eo]er
+! SFX W er yesen caer
+! SFX W ir yesen [^g]uir
+! SFX W r yesen or
+! SFX W ir uyesen gir
+! SFX W eir iesen eir
+! SFX W ensar iensen ensar
+! SFX W usar sen [ae]husar
+! SFX W etar ieten etar
+! SFX W etir iten etir
+! SFX W oltar uelten oltar
+! SFX W entar ienten entar
+! SFX W entir ienten entir
+! SFX W ontar uenten ontar
+! SFX W ertar ierten ertar
+! SFX W erter ierten erter
+! SFX W ertir ierten ertir
+! SFX W ortar uerten ortar
+! SFX W estar iesten estar
+! SFX W ostar uesten ostar
+! SFX W estir isten estir
+! SFX W itar ten [ae]hitar
+! SFX W gar eguen ugar
+! SFX W egar ieguen egar
+! SFX W ogar ueguen ogar
+! SFX W eguir iguen eguir
+! SFX W olgar uelguen olgar
+! SFX W engar ienguen engar
+! SFX W ocar uequen ocar
+! SFX W olcar uelquen olcar
+! SFX W orcar uerquen orcar
+! SFX W evar ieven evar
+! SFX W ovar ueven ovar
+! SFX W over ueven over
+! SFX W olver uelven olver
+! SFX W ervir irven ervir
+! SFX W ir yen [^g]uir
+! SFX W r yen or
+! SFX W ir uyen gir
+! SFX W er en er
+! SFX W iar en iar
+! SFX W oar ueen oar
+! SFX W eir ien eir
+! SFX W uar en [^g]uar
+! SFX W uar en guar
+!
+!
+! SFX W Y 49 S
+! SFX W 0 on [^a]ndar
+! SFX W 0 on [^d]ar
+! SFX W 0 on [^n]dar
+! SFX W r eron alir
+! SFX W r eron ernir
+! SFX W r eron eunir
+! SFX W r eron irir
+! SFX W r eron ohibir
+! SFX W er ieron [^fh]acer
+! SFX W er ieron aler
+! SFX W er ieron e[cd]er
+! SFX W er ieron ender
+! SFX W er ieron er[dnt]er
+! SFX W er ieron o[clv]er
+! SFX W er ieron olver
+! SFX W er ieron or[cd]er
+! SFX W er ieron er
+! SFX W ebir ibieron ebir
+! SFX W acer icieron [fh]acer
+! SFX W edir idieron edir
+! SFX W endir indieron endir
+! SFX W oder udieron oder
+! SFX W egir igieron egir
+! SFX W enchir inchieron enchir
+! SFX W emir imieron emir
+! SFX W ormir urmieron ormir
+! SFX W enir inieron enir
+! SFX W aber upieron aber
+! SFX W erir irieron erir
+! SFX W orir urieron orir
+! SFX W erer isieron erer
+! SFX W oner usieron oner
+! SFX W etir itieron etir
+! SFX W entir intieron entir
+! SFX W ertir irtieron ertir
+! SFX W estir istieron estir
+! SFX W eguir iguieron eguir
+! SFX W ervir irvieron ervir
+! SFX W ar uvieron andar
+! SFX W ener uvieron ener
+! SFX W cir jeron ucir
+! SFX W er jeron raer
+! SFX W ecir ijeron ecir
+! SFX W er yeron [eo]er
+! SFX W er yeron caer
+! SFX W ir yeron [^g]uir
+! SFX W r yeron or
+! SFX W ir uyeron gir
+! SFX W eir ieron eir
+!
+!
+! SFX W Y 29 S
+! SFX W 0 n [^fh]acer
+! SFX W 0 n [aeo]er
+! SFX W 0 n [io]rir
+! SFX W 0 n [u]ir
+! SFX W 0 n ar
+! SFX W 0 n e[bdgmrt]ir
+! SFX W 0 n e[cd]er
+! SFX W 0 n e[ns]tir
+! SFX W 0 n enchir
+! SFX W 0 n ender
+! SFX W 0 n endir
+! SFX W 0 n er[dnt]er
+! SFX W 0 n er[ntv]ir
+! SFX W 0 n eunir
+! SFX W 0 n o[clv]er
+! SFX W 0 n olver
+! SFX W 0 n or[cd]er
+! SFX W 0 n ormir
+! SFX W 0 n ucir
+! SFX W cer rn [fh]acer
+! SFX W er rn aber
+! SFX W er rn erer
+! SFX W er rn oder
+! SFX W er drn [eo]ner
+! SFX W er drn aler
+! SFX W ir drn alir
+! SFX W ir drn enir
+! SFX W ecir irn ecir
+! SFX W r irn [eo]r
+!
+!
+! SFX W Y 126 S
+! SFX W ar o andar
+! SFX W ar o guar
+! SFX W er o [eo]er
+! SFX W obar uebo obar
+! SFX W ebir ibo ebir
+! SFX W erbar ierbo erbar
+! SFX W ibir bo ohibir
+! SFX W ocar ueco ocar
+! SFX W olcar uelco olcar
+! SFX W orcar uerco orcar
+! SFX W cer zco [^c]ocer
+! SFX W cer zco [^fh]acer
+! SFX W cer zco ecer
+! SFX W ucir uzco ucir
+! SFX W eder iedo eder
+! SFX W odar uedo odar
+! SFX W oder uedo oder
+! SFX W edir ido edir
+! SFX W oldar ueldo [^g]oldar
+! SFX W oldar eldo goldar
+! SFX W endar iendo endar
+! SFX W ender iendo ender
+! SFX W endir indo endir
+! SFX W erder ierdo erder
+! SFX W ordar uerdo ordar
+! SFX W order uerdo order
+! SFX W oder udo oder
+! SFX W cer go [fh]acer
+! SFX W er go aler
+! SFX W er go ener
+! SFX W er go oner
+! SFX W ir go alir
+! SFX W ir go enir
+! SFX W gar ego ugar
+! SFX W egar iego egar
+! SFX W ogar uego ogar
+! SFX W ecir igo ecir
+! SFX W eguir igo eguir
+! SFX W er igo [cr]aer
+! SFX W er igo oer
+! SFX W r igo or
+! SFX W olgar uelgo olgar
+! SFX W engar iengo engar
+! SFX W enchir incho enchir
+! SFX W cir jo ucir
+! SFX W er jo raer
+! SFX W ecir ijo ecir
+! SFX W egir ijo egir
+! SFX W ijar jo [ae]hijar
+! SFX W oblar ueblo oblar
+! SFX W emblar iemblo emblar
+! SFX W elar ielo elar
+! SFX W olar uelo olar
+! SFX W oler uelo oler
+! SFX W ollar uello [^g]ollar
+! SFX W ollar ello gollar
+! SFX W ilar lo [ae]hilar
+! SFX W emir imo emir
+! SFX W ormir uermo ormir
+! SFX W umar mo [ae]humar
+! SFX W onar ueno onar
+! SFX W enir ino enir
+! SFX W ernar ierno ernar
+! SFX W erner ierno erner
+! SFX W ernir ierno ernir
+! SFX W ornar uerno ornar
+! SFX W inar no [aeo]hinar
+! SFX W unir no eunir
+! SFX W caber quepo caber
+! SFX W aber upo aber
+! SFX W ebrar iebro ebrar
+! SFX W embrar iembro embrar
+! SFX W edrar iedro edrar
+! SFX W endrar iendro endrar
+! SFX W erer iero erer
+! SFX W erir iero erir
+! SFX W irir iero irir
+! SFX W orar uero [^g]orar
+! SFX W orir uero orir
+! SFX W orar ero gorar
+! SFX W errar ierro errar
+! SFX W ontrar uentro ontrar
+! SFX W ostrar uestro ostrar
+! SFX W esar ieso esar
+! SFX W osar ueso osar
+! SFX W erer iso erer
+! SFX W ensar ienso ensar
+! SFX W oner uso oner
+! SFX W usar so [ae]husar
+! SFX W etar ieto etar
+! SFX W etir ito etir
+! SFX W oltar uelto oltar
+! SFX W entar iento entar
+! SFX W entir iento entir
+! SFX W ontar uento ontar
+! SFX W ertar ierto ertar
+! SFX W erter ierto erter
+! SFX W ertir ierto ertir
+! SFX W ortar uerto ortar
+! SFX W estar iesto estar
+! SFX W ostar uesto ostar
+! SFX W estir isto estir
+! SFX W itar to [ae]hitar
+! SFX W evar ievo evar
+! SFX W ovar uevo ovar
+! SFX W over uevo over
+! SFX W olver uelvo olver
+! SFX W ervir irvo ervir
+! SFX W ar uvo andar
+! SFX W ener uvo ener
+! SFX W er yo oer
+! SFX W uir uyo [^g]uir
+! SFX W ir uyo gir
+! SFX W ezar iezo ezar
+! SFX W ocer uezo cocer
+! SFX W acer izo [fh]acer
+! SFX W enzar ienzo enzar
+! SFX W onzar enzo gonzar
+! SFX W orcer uerzo orcer
+! SFX W orzar uerzo orzar
+! SFX W izar zo [ae]izar
+! SFX W er o er
+! SFX W iar o iar
+! SFX W oar ueo oar
+! SFX W eir io eir
+! SFX W uar o [^g]uar
+!
+!
+!
+! SFX W Y 195 S
+! SFX W er as [eo]er
+! SFX W r bas ar
+! SFX W obar uebas obar
+! SFX W ebir ibas ebir
+! SFX W erbar ierbas erbar
+! SFX W ibir bas ohibir
+! SFX W ocar uecas ocar
+! SFX W olcar uelcas olcar
+! SFX W orcar uercas orcar
+! SFX W cer zcas [^c]ocer
+! SFX W cer zcas [^fh]acer
+! SFX W cer zcas ecer
+! SFX W cir zcas ucir
+! SFX W eder iedas eder
+! SFX W odar uedas odar
+! SFX W oder uedas oder
+! SFX W edir idas edir
+! SFX W oldar ueldas [^g]oldar
+! SFX W oldar eldas goldar
+! SFX W endar iendas endar
+! SFX W ender iendas ender
+! SFX W endir indas endir
+! SFX W erder ierdas erder
+! SFX W ordar uerdas ordar
+! SFX W order uerdas order
+! SFX W cer gas [fh]acer
+! SFX W er gas [eo]ner
+! SFX W er gas aler
+! SFX W ir gas alir
+! SFX W gar egas ugar
+! SFX W egar iegas egar
+! SFX W ogar uegas ogar
+! SFX W ecir igas ecir
+! SFX W eguir igas eguir
+! SFX W er igas aer
+! SFX W er igas oer
+! SFX W r igas or
+! SFX W olgar uelgas olgar
+! SFX W enir engas enir
+! SFX W engar iengas engar
+! SFX W enchir inchas enchir
+! SFX W egir ijas egir
+! SFX W ijar jas [ae]hijar
+! SFX W oblar ueblas oblar
+! SFX W emblar iemblas emblar
+! SFX W elar ielas elar
+! SFX W olar uelas olar
+! SFX W oler uelas oler
+! SFX W ollar uellas [^g]ollar
+! SFX W ollar ellas gollar
+! SFX W ilar las [ae]hilar
+! SFX W emir imas emir
+! SFX W ormir uermas ormir
+! SFX W umar mas [ae]humar
+! SFX W onar uenas onar
+! SFX W ernar iernas ernar
+! SFX W erner iernas erner
+! SFX W ernir iernas ernir
+! SFX W ornar uernas ornar
+! SFX W inar nas [aeo]hinar
+! SFX W unir nas eunir
+! SFX W aber epas saber
+! SFX W caber quepas caber
+! SFX W r ras [^a]ndar
+! SFX W r ras [^d]ar
+! SFX W r ras [^n]dar
+! SFX W ebrar iebras ebrar
+! SFX W embrar iembras embrar
+! SFX W edrar iedras edrar
+! SFX W endrar iendras endrar
+! SFX W r eras alir
+! SFX W r eras ernir
+! SFX W r eras eunir
+! SFX W r eras ohibir
+! SFX W er ieras [^fh]acer
+! SFX W er ieras aler
+! SFX W er ieras e[cd]er
+! SFX W er ieras ender
+! SFX W er ieras er[dnt]er
+! SFX W er ieras o[clv]er
+! SFX W er ieras olver
+! SFX W er ieras or[cd]er
+! SFX W erer ieras erer
+! SFX W erir ieras erir
+! SFX W er ieras er
+! SFX W irir ieras irir
+! SFX W ebir ibieras ebir
+! SFX W acer icieras [fh]acer
+! SFX W edir idieras edir
+! SFX W endir indieras endir
+! SFX W oder udieras oder
+! SFX W egir igieras egir
+! SFX W enchir inchieras enchir
+! SFX W emir imieras emir
+! SFX W ormir urmieras ormir
+! SFX W enir inieras enir
+! SFX W aber upieras aber
+! SFX W erir irieras erir
+! SFX W irir irieras irir
+! SFX W orir urieras orir
+! SFX W erer isieras erer
+! SFX W oner usieras oner
+! SFX W etir itieras etir
+! SFX W entir intieras entir
+! SFX W ertir irtieras ertir
+! SFX W estir istieras estir
+! SFX W eguir iguieras eguir
+! SFX W ervir irvieras ervir
+! SFX W ar uvieras andar
+! SFX W ener uvieras ener
+! SFX W cir jeras ucir
+! SFX W er jeras raer
+! SFX W ecir ijeras ecir
+! SFX W orar ueras [^g]orar
+! SFX W orir ueras orir
+! SFX W er yeras [eo]er
+! SFX W er yeras caer
+! SFX W ir yeras [^g]uir
+! SFX W r yeras or
+! SFX W ir uyeras gir
+! SFX W eir ieras eir
+! SFX W orar eras gorar
+! SFX W errar ierras errar
+! SFX W ontrar uentras ontrar
+! SFX W ostrar uestras ostrar
+! SFX W esar iesas esar
+! SFX W osar uesas osar
+! SFX W ensar iensas ensar
+! SFX W usar sas [ae]husar
+! SFX W etar ietas etar
+! SFX W etir itas etir
+! SFX W oltar ueltas oltar
+! SFX W entar ientas entar
+! SFX W entir ientas entir
+! SFX W ontar uentas ontar
+! SFX W ertar iertas ertar
+! SFX W erter iertas erter
+! SFX W ertir iertas ertir
+! SFX W ortar uertas ortar
+! SFX W estar iestas estar
+! SFX W ostar uestas ostar
+! SFX W estir istas estir
+! SFX W itar tas [ae]hitar
+! SFX W evar ievas evar
+! SFX W ovar uevas ovar
+! SFX W over uevas over
+! SFX W olver uelvas olver
+! SFX W ervir irvas ervir
+! SFX W er yas oer
+! SFX W ir yas [^g]uir
+! SFX W ir uyas gir
+! SFX W ezar iezas ezar
+! SFX W ocer uezas cocer
+! SFX W enzar ienzas enzar
+! SFX W onzar enzas gonzar
+! SFX W orcer uerzas orcer
+! SFX W orzar uerzas orzar
+! SFX W izar zas [ae]izar
+! SFX W 0 as [^fh]acer
+! SFX W 0 as [aeo]er
+! SFX W 0 as [io]rir
+! SFX W 0 as [u]ir
+! SFX W 0 as ar
+! SFX W 0 as e[bdgmrt]ir
+! SFX W 0 as e[cd]er
+! SFX W 0 as e[ns]tir
+! SFX W 0 as enchir
+! SFX W 0 as ender
+! SFX W 0 as endir
+! SFX W 0 as er[dnt]er
+! SFX W 0 as er[ntv]ir
+! SFX W 0 as eunir
+! SFX W 0 as o[clv]er
+! SFX W 0 as olver
+! SFX W 0 as or[cd]er
+! SFX W 0 as ormir
+! SFX W 0 as ucir
+! SFX W er as er
+! SFX W er as er
+! SFX W iar as iar
+! SFX W ir as ir
+! SFX W r as r
+! SFX W cer ras [fh]acer
+! SFX W er ras aber
+! SFX W er ras erer
+! SFX W er ras oder
+! SFX W er dras [eo]ner
+! SFX W er dras aler
+! SFX W ir dras alir
+! SFX W ir dras enir
+! SFX W ecir iras ecir
+! SFX W r iras [eo]r
+! SFX W oar ueas oar
+! SFX W eir ias eir
+! SFX W uar as [^g]uar
+!
+!
+!
+! SFX W Y 202 S
+! SFX W ar es andar
+! SFX W ir es ucir
+! SFX W r es alir
+! SFX W obar uebes obar
+! SFX W ebir ibes ebir
+! SFX W erbar ierbes erbar
+! SFX W ibir bes ohibir
+! SFX W ezar ieces ezar
+! SFX W ocer ueces cocer
+! SFX W ecir ices ecir
+! SFX W enzar iences enzar
+! SFX W onzar ences gonzar
+! SFX W orcer uerces orcer
+! SFX W orzar uerces orzar
+! SFX W izar ces [ae]izar
+! SFX W eder iedes eder
+! SFX W odar uedes odar
+! SFX W oder uedes oder
+! SFX W edir ides edir
+! SFX W oldar ueldes [^g]oldar
+! SFX W oldar eldes goldar
+! SFX W endar iendes endar
+! SFX W ender iendes ender
+! SFX W endir indes endir
+! SFX W erder ierdes erder
+! SFX W ordar uerdes ordar
+! SFX W order uerdes order
+! SFX W egir iges egir
+! SFX W enchir inches enchir
+! SFX W ijar jes [ae]hijar
+! SFX W oblar uebles oblar
+! SFX W emblar iembles emblar
+! SFX W elar ieles elar
+! SFX W olar ueles olar
+! SFX W oler ueles oler
+! SFX W ollar uelles [^g]ollar
+! SFX W ollar elles gollar
+! SFX W ilar les [ae]hilar
+! SFX W emir imes emir
+! SFX W ormir uermes ormir
+! SFX W umar mes [ae]humar
+! SFX W ener ienes ener
+! SFX W enir ienes enir
+! SFX W onar uenes onar
+! SFX W ernar iernes ernar
+! SFX W erner iernes erner
+! SFX W ernir iernes ernir
+! SFX W ornar uernes ornar
+! SFX W inar nes [aeo]hinar
+! SFX W unir nes eunir
+! SFX W r res [^a]ndar
+! SFX W r res [^d]ar
+! SFX W r res [^n]dar
+! SFX W ebrar iebres ebrar
+! SFX W embrar iembres embrar
+! SFX W edrar iedres edrar
+! SFX W endrar iendres endrar
+! SFX W r eres alir
+! SFX W r eres ernir
+! SFX W r eres eunir
+! SFX W r eres ohibir
+! SFX W er ieres [^fh]acer
+! SFX W er ieres aler
+! SFX W er ieres e[cd]er
+! SFX W er ieres ender
+! SFX W er ieres er[dnt]er
+! SFX W er ieres o[clv]er
+! SFX W er ieres olver
+! SFX W er ieres or[cd]er
+! SFX W erer ieres erer
+! SFX W erir ieres erir
+! SFX W er ieres er
+! SFX W irir ieres irir
+! SFX W ebir ibieres ebir
+! SFX W acer icieres [fh]acer
+! SFX W edir idieres edir
+! SFX W endir indieres endir
+! SFX W oder udieres oder
+! SFX W egir igieres egir
+! SFX W enchir inchieres enchir
+! SFX W emir imieres emir
+! SFX W ormir urmieres ormir
+! SFX W enir inieres enir
+! SFX W aber upieres aber
+! SFX W erir irieres erir
+! SFX W irir irieres irir
+! SFX W orir urieres orir
+! SFX W erer isieres erer
+! SFX W oner usieres oner
+! SFX W etir itieres etir
+! SFX W entir intieres entir
+! SFX W ertir irtieres ertir
+! SFX W estir istieres estir
+! SFX W eguir iguieres eguir
+! SFX W ervir irvieres ervir
+! SFX W ar uvieres andar
+! SFX W ener uvieres ener
+! SFX W cir jeres ucir
+! SFX W er jeres raer
+! SFX W ecir ijeres ecir
+! SFX W orar ueres [^g]orar
+! SFX W orir ueres orir
+! SFX W er yeres [eo]er
+! SFX W er yeres caer
+! SFX W ir yeres [^g]uir
+! SFX W r yeres or
+! SFX W ir uyeres gir
+! SFX W eir ieres eir
+! SFX W orar eres gorar
+! SFX W errar ierres errar
+! SFX W ontrar uentres ontrar
+! SFX W ostrar uestres ostrar
+! SFX W r ses [^a]ndar
+! SFX W r ses [^d]ar
+! SFX W r ses [^n]dar
+! SFX W r eses alir
+! SFX W r eses ernir
+! SFX W r eses eunir
+! SFX W r eses ohibir
+! SFX W er ieses [^fh]acer
+! SFX W er ieses aler
+! SFX W er ieses e[cd]er
+! SFX W er ieses ender
+! SFX W er ieses er[dnt]er
+! SFX W er ieses o[clv]er
+! SFX W er ieses olver
+! SFX W er ieses or[cd]er
+! SFX W esar ieses esar
+! SFX W er ieses er
+! SFX W ebir ibieses ebir
+! SFX W acer icieses [fh]acer
+! SFX W edir idieses edir
+! SFX W endir indieses endir
+! SFX W oder udieses oder
+! SFX W egir igieses egir
+! SFX W enchir inchieses enchir
+! SFX W emir imieses emir
+! SFX W ormir urmieses ormir
+! SFX W enir inieses enir
+! SFX W aber upieses aber
+! SFX W erir irieses erir
+! SFX W irir irieses irir
+! SFX W orir urieses orir
+! SFX W erer isieses erer
+! SFX W oner usieses oner
+! SFX W etir itieses etir
+! SFX W entir intieses entir
+! SFX W ertir irtieses ertir
+! SFX W estir istieses estir
+! SFX W eguir iguieses eguir
+! SFX W ervir irvieses ervir
+! SFX W ar uvieses andar
+! SFX W ener uvieses ener
+! SFX W cir jeses ucir
+! SFX W er jeses raer
+! SFX W ecir ijeses ecir
+! SFX W osar ueses osar
+! SFX W er yeses [eo]er
+! SFX W er yeses caer
+! SFX W ir yeses [^g]uir
+! SFX W r yeses or
+! SFX W ir uyeses gir
+! SFX W eir ieses eir
+! SFX W ensar ienses ensar
+! SFX W usar ses [ae]husar
+! SFX W etar ietes etar
+! SFX W etir ites etir
+! SFX W oltar ueltes oltar
+! SFX W entar ientes entar
+! SFX W entir ientes entir
+! SFX W ontar uentes ontar
+! SFX W ertar iertes ertar
+! SFX W erter iertes erter
+! SFX W ertir iertes ertir
+! SFX W ortar uertes ortar
+! SFX W estar iestes estar
+! SFX W ostar uestes ostar
+! SFX W estir istes estir
+! SFX W itar tes [ae]hitar
+! SFX W gar egues ugar
+! SFX W egar iegues egar
+! SFX W ogar uegues ogar
+! SFX W eguir igues eguir
+! SFX W olgar uelgues olgar
+! SFX W engar iengues engar
+! SFX W ocar ueques ocar
+! SFX W olcar uelques olcar
+! SFX W orcar uerques orcar
+! SFX W evar ieves evar
+! SFX W ovar ueves ovar
+! SFX W over ueves over
+! SFX W olver uelves olver
+! SFX W ervir irves ervir
+! SFX W r yes or
+! SFX W uir uyes [^g]uir
+! SFX W ir uyes gir
+! SFX W er es er
+! SFX W iar es iar
+! SFX W oar uees oar
+! SFX W eir ies eir
+! SFX W uar es [^g]uar
+! SFX W uar es guar
+!
+!
+! SFX W Y 49 S
+! SFX W r rais [^a]ndar
+! SFX W r rais [^d]ar
+! SFX W r rais [^n]dar
+! SFX W r erais alir
+! SFX W r erais ernir
+! SFX W r erais eunir
+! SFX W r erais ohibir
+! SFX W er ierais [^fh]acer
+! SFX W er ierais aler
+! SFX W er ierais e[cd]er
+! SFX W er ierais ender
+! SFX W er ierais er[dnt]er
+! SFX W er ierais o[clv]er
+! SFX W er ierais olver
+! SFX W er ierais or[cd]er
+! SFX W er ierais er
+! SFX W ebir ibierais ebir
+! SFX W acer icierais [fh]acer
+! SFX W edir idierais edir
+! SFX W endir indierais endir
+! SFX W oder udierais oder
+! SFX W egir igierais egir
+! SFX W enchir inchierais enchir
+! SFX W emir imierais emir
+! SFX W ormir urmierais ormir
+! SFX W enir inierais enir
+! SFX W aber upierais aber
+! SFX W erir irierais erir
+! SFX W irir irierais irir
+! SFX W orir urierais orir
+! SFX W erer isierais erer
+! SFX W oner usierais oner
+! SFX W etir itierais etir
+! SFX W entir intierais entir
+! SFX W ertir irtierais ertir
+! SFX W estir istierais estir
+! SFX W eguir iguierais eguir
+! SFX W ervir irvierais ervir
+! SFX W ar uvierais andar
+! SFX W ener uvierais ener
+! SFX W cir jerais ucir
+! SFX W er jerais raer
+! SFX W ecir ijerais ecir
+! SFX W er yerais [eo]er
+! SFX W er yerais caer
+! SFX W ir yerais [^g]uir
+! SFX W r yerais or
+! SFX W ir uyerais gir
+! SFX W eir ierais eir
+!
+!
+!
+! SFX W Y 32 S
+! SFX W 0 ais [^fh]acer
+! SFX W 0 ais [aeo]er
+! SFX W 0 ais [io]rir
+! SFX W 0 ais [u]ir
+! SFX W 0 ais ar
+! SFX W 0 ais e[bdgmrt]ir
+! SFX W 0 ais e[cd]er
+! SFX W 0 ais e[ns]tir
+! SFX W 0 ais enchir
+! SFX W 0 ais ender
+! SFX W 0 ais endir
+! SFX W 0 ais er[dnt]er
+! SFX W 0 ais er[ntv]ir
+! SFX W 0 ais eunir
+! SFX W 0 ais o[clv]er
+! SFX W 0 ais olver
+! SFX W 0 ais or[cd]er
+! SFX W 0 ais ormir
+! SFX W 0 ais ucir
+! SFX W er ais er
+! SFX W ir ais ir
+! SFX W r ais r
+! SFX W cer rais [fh]acer
+! SFX W er rais aber
+! SFX W er rais erer
+! SFX W er rais oder
+! SFX W er drais [eo]ner
+! SFX W er drais aler
+! SFX W ir drais alir
+! SFX W ir drais enir
+! SFX W ecir irais ecir
+! SFX W r irais [eo]r
+!
+!
+!
+! SFX W Y 48 S
+! SFX W r reis [^a]ndar
+! SFX W r reis [^d]ar
+! SFX W r reis [^n]dar
+! SFX W r ereis alir
+! SFX W r ereis ernir
+! SFX W r ereis ohibir
+! SFX W er iereis [^fh]acer
+! SFX W er iereis aler
+! SFX W er iereis e[cd]er
+! SFX W er iereis ender
+! SFX W er iereis er[dnt]er
+! SFX W er iereis o[clv]er
+! SFX W er iereis olver
+! SFX W er iereis or[cd]er
+! SFX W er iereis er
+! SFX W ebir ibiereis ebir
+! SFX W acer iciereis [fh]acer
+! SFX W edir idiereis edir
+! SFX W endir indiereis endir
+! SFX W oder udiereis oder
+! SFX W egir igiereis egir
+! SFX W enchir inchiereis enchir
+! SFX W emir imiereis emir
+! SFX W ormir urmiereis ormir
+! SFX W enir iniereis enir
+! SFX W aber upiereis aber
+! SFX W erir iriereis erir
+! SFX W irir iriereis irir
+! SFX W orir uriereis orir
+! SFX W oner usiereis oner
+! SFX W etir itiereis etir
+! SFX W entir intiereis entir
+! SFX W ertir irtiereis ertir
+! SFX W estir istiereis estir
+! SFX W eguir iguiereis eguir
+! SFX W ervir irviereis ervir
+! SFX W ar uviereis andar
+! SFX W ener uviereis ener
+! SFX W cir jereis ucir
+! SFX W er jereis raer
+! SFX W ecir ijereis ecir
+! SFX W er yereis [eo]er
+! SFX W er yereis caer
+! SFX W ir yereis [^g]uir
+! SFX W r yereis or
+! SFX W ir uyereis gir
+! SFX W eir iereis eir
+! SFX W erer isireis erer
+!
+!
+!
+! SFX W Y 49 S
+! SFX W r seis [^a]ndar
+! SFX W r seis [^d]ar
+! SFX W r seis [^n]dar
+! SFX W r eseis alir
+! SFX W r eseis ernir
+! SFX W r eseis eunir
+! SFX W r eseis ohibir
+! SFX W er ieseis [^fh]acer
+! SFX W er ieseis aler
+! SFX W er ieseis e[cd]er
+! SFX W er ieseis ender
+! SFX W er ieseis er[dnt]er
+! SFX W er ieseis o[clv]er
+! SFX W er ieseis olver
+! SFX W er ieseis or[cd]er
+! SFX W er ieseis er
+! SFX W ebir ibieseis ebir
+! SFX W acer icieseis [fh]acer
+! SFX W edir idieseis edir
+! SFX W endir indieseis endir
+! SFX W oder udieseis oder
+! SFX W egir igieseis egir
+! SFX W enchir inchieseis enchir
+! SFX W emir imieseis emir
+! SFX W ormir urmieseis ormir
+! SFX W enir inieseis enir
+! SFX W aber upieseis aber
+! SFX W erir irieseis erir
+! SFX W irir irieseis irir
+! SFX W orir urieseis orir
+! SFX W erer isieseis erer
+! SFX W oner usieseis oner
+! SFX W etir itieseis etir
+! SFX W entir intieseis entir
+! SFX W ertir irtieseis ertir
+! SFX W estir istieseis estir
+! SFX W eguir iguieseis eguir
+! SFX W ervir irvieseis ervir
+! SFX W ar uvieseis andar
+! SFX W ener uvieseis ener
+! SFX W cir jeseis ucir
+! SFX W er jeseis raer
+! SFX W ecir ijeseis ecir
+! SFX W er yeseis [eo]er
+! SFX W er yeseis caer
+! SFX W ir yeseis [^g]uir
+! SFX W r yeseis or
+! SFX W ir uyeseis gir
+! SFX W eir ieseis eir
+!
+!
+!
+! SFX W Y 45 S
+! SFX W r steis [^a]ndar
+! SFX W r steis [^d]ar
+! SFX W r steis [^n]dar
+! SFX W r steis [eo]r
+! SFX W r steis [u]ir
+! SFX W r steis alir
+! SFX W r steis ebir
+! SFX W r steis edir
+! SFX W r steis egir
+! SFX W r steis emir
+! SFX W r steis enchir
+! SFX W r steis endir
+! SFX W r steis entir
+! SFX W r steis erir
+! SFX W r steis ernir
+! SFX W r steis ertir
+! SFX W r steis ervir
+! SFX W r steis estir
+! SFX W r steis etir
+! SFX W r steis eunir
+! SFX W r steis eir
+! SFX W r steis irir
+! SFX W r steis orir
+! SFX W r steis ormir
+! SFX W er isteis [^fh]acer
+! SFX W er isteis aler
+! SFX W er isteis e[cd]er
+! SFX W er isteis ender
+! SFX W er isteis er[dnt]er
+! SFX W er isteis o[clv]er
+! SFX W er isteis olver
+! SFX W er isteis or[cd]er
+! SFX W acer icisteis [fh]acer
+! SFX W oder udisteis oder
+! SFX W cir jisteis ucir
+! SFX W er jisteis raer
+! SFX W ecir ijisteis ecir
+! SFX W enir inisteis enir
+! SFX W aber upisteis aber
+! SFX W erer isisteis erer
+! SFX W oner usisteis oner
+! SFX W ar uvisteis andar
+! SFX W ener uvisteis ener
+! SFX W er steis [eo]er
+! SFX W er steis caer
+!
+!
+!
+! SFX W Y 54 S
+! SFX W ar is ar
+! SFX W er is [eo]er
+! SFX W er is eder
+! SFX W er is ender
+! SFX W er is erder
+! SFX W er is erer
+! SFX W er is erner
+! SFX W er is erter
+! SFX W er is oder
+! SFX W er is oler
+! SFX W er is olver
+! SFX W er is order
+! SFX W er is over
+! SFX W ir is ernir
+! SFX W ir is eunir
+! SFX W ir is irir
+! SFX W ir is ohibir
+! SFX W ebir ibis ebir
+! SFX W cer zcis [^c]ocer
+! SFX W cer zcis [^fh]acer
+! SFX W cer zcis ecer
+! SFX W cir zcis ucir
+! SFX W edir idis edir
+! SFX W endir indis endir
+! SFX W cer gis [fh]acer
+! SFX W er gis [eo]ner
+! SFX W er gis aler
+! SFX W ir gis alir
+! SFX W ecir igis ecir
+! SFX W eguir igis eguir
+! SFX W er igis aer
+! SFX W er igis oer
+! SFX W r igis or
+! SFX W enir engis enir
+! SFX W enchir inchis enchir
+! SFX W er iis er
+! SFX W egir ijis egir
+! SFX W emir imis emir
+! SFX W ormir urmis ormir
+! SFX W aber epis saber
+! SFX W caber quepis caber
+! SFX W erir iris erir
+! SFX W orir uris orir
+! SFX W etir itis etir
+! SFX W entir intis entir
+! SFX W ertir irtis ertir
+! SFX W estir istis estir
+! SFX W ervir irvis ervir
+! SFX W er yis oer
+! SFX W ir yis [^g]uir
+! SFX W ir uyis gir
+! SFX W cer zis cocer
+! SFX W cer zis orcer
+! SFX W emir iis eir
+!
+!
+!
+! SFX W Y 84 S
+! SFX W 0 is [^fh]acer
+! SFX W 0 is [aeo]er
+! SFX W 0 is [io]rir
+! SFX W 0 is [u]ir
+! SFX W 0 is ar
+! SFX W 0 is e[bdgmrt]ir
+! SFX W 0 is e[cd]er
+! SFX W 0 is e[ns]tir
+! SFX W 0 is enchir
+! SFX W 0 is ender
+! SFX W 0 is endir
+! SFX W 0 is er[dnt]er
+! SFX W 0 is er[ntv]ir
+! SFX W 0 is eunir
+! SFX W 0 is o[clv]er
+! SFX W 0 is olver
+! SFX W 0 is or[cd]er
+! SFX W 0 is ormir
+! SFX W 0 is ucir
+! SFX W ar is [^g]uar
+! SFX W ar is [ae]hu[ms]ar
+! SFX W ar is [ae]ndar
+! SFX W ar is [aeo]hi[jlnt]ar
+! SFX W ar is ebrar
+! SFX W ar is edrar
+! SFX W ar is elar
+! SFX W ar is emblar
+! SFX W ar is embrar
+! SFX W ar is endrar
+! SFX W ar is ensar
+! SFX W ar is entar
+! SFX W ar is erbar
+! SFX W ar is ernar
+! SFX W ar is errar
+! SFX W ar is ertar
+! SFX W ar is esar
+! SFX W ar is estar
+! SFX W ar is etar
+! SFX W ar is evar
+! SFX W ar is iar
+! SFX W ar is obar
+! SFX W ar is oblar
+! SFX W ar is odar
+! SFX W ar is olar
+! SFX W ar is oldar
+! SFX W ar is ollar
+! SFX W ar is oltar
+! SFX W ar is onar
+! SFX W ar is ontar
+! SFX W ar is ontrar
+! SFX W ar is orar
+! SFX W ar is ordar
+! SFX W ar is ornar
+! SFX W ar is ortar
+! SFX W ar is osar
+! SFX W ar is ostar
+! SFX W ar is ostrar
+! SFX W ar is ovar
+! SFX W ar is oar
+! SFX W er is er
+! SFX W zar cis [ae]izar
+! SFX W zar cis enzar
+! SFX W zar cis ezar
+! SFX W zar cis gonzar
+! SFX W zar cis orzar
+! SFX W cer ris [fh]acer
+! SFX W er ris aber
+! SFX W er ris erer
+! SFX W er ris oder
+! SFX W er dris [eo]ner
+! SFX W er dris aler
+! SFX W ir dris alir
+! SFX W ir dris enir
+! SFX W ecir iris ecir
+! SFX W r iris [eo]r
+! SFX W ar uis olgar
+! SFX W gar guis egar
+! SFX W gar guis engar
+! SFX W gar guis ugar
+! SFX W ogar guis ogar
+! SFX W car quis olcar
+! SFX W car quis orcar
+! SFX W ocar quis ocar
+! SFX W uar is guar
+!
+!
+! SFX W Y 338 S
+! SFX W r mos r
+! SFX W er amos [eo]er
+! SFX W er amos eder
+! SFX W er amos ender
+! SFX W er amos erder
+! SFX W er amos erer
+! SFX W er amos erner
+! SFX W er amos erter
+! SFX W er amos oder
+! SFX W er amos oler
+! SFX W er amos olver
+! SFX W er amos order
+! SFX W er amos over
+! SFX W ir amos ernir
+! SFX W ir amos eunir
+! SFX W ir amos irir
+! SFX W ir amos ohibir
+! SFX W ebir ibamos ebir
+! SFX W ar bamos ar
+! SFX W cer zcamos [^c]ocer
+! SFX W cer zcamos [^fh]acer
+! SFX W cer zcamos ecer
+! SFX W cir zcamos ucir
+! SFX W edir idamos edir
+! SFX W endir indamos endir
+! SFX W cer gamos [fh]acer
+! SFX W er gamos [eo]ner
+! SFX W er gamos aler
+! SFX W ir gamos alir
+! SFX W ecir igamos ecir
+! SFX W eguir igamos eguir
+! SFX W er igamos aer
+! SFX W er igamos oer
+! SFX W r igamos or
+! SFX W enir engamos enir
+! SFX W enchir inchamos enchir
+! SFX W er iamos er
+! SFX W egir ijamos egir
+! SFX W emir imamos emir
+! SFX W ormir urmamos ormir
+! SFX W aber epamos saber
+! SFX W caber quepamos caber
+! SFX W erir iramos erir
+! SFX W orir uramos orir
+! SFX W ar ramos [^a]ndar
+! SFX W ar ramos [^d]ar
+! SFX W ar ramos [^n]dar
+! SFX W r ramos alir
+! SFX W r ramos ernir
+! SFX W r ramos eunir
+! SFX W r ramos ohibir
+! SFX W er iramos [^fh]acer
+! SFX W er iramos aler
+! SFX W er iramos e[cd]er
+! SFX W er iramos ender
+! SFX W er iramos er[dnt]er
+! SFX W er iramos o[clv]er
+! SFX W er iramos olver
+! SFX W er iramos or[cd]er
+! SFX W er iramos er
+! SFX W ebir ibiramos ebir
+! SFX W acer iciramos [fh]acer
+! SFX W edir idiramos edir
+! SFX W endir indiramos endir
+! SFX W oder udiramos oder
+! SFX W egir igiramos egir
+! SFX W enchir inchiramos enchir
+! SFX W emir imiramos emir
+! SFX W ormir urmiramos ormir
+! SFX W enir iniramos enir
+! SFX W aber upiramos aber
+! SFX W erir iriramos erir
+! SFX W irir iriramos irir
+! SFX W orir uriramos orir
+! SFX W erer isiramos erer
+! SFX W oner usiramos oner
+! SFX W etir itiramos etir
+! SFX W entir intiramos entir
+! SFX W ertir irtiramos ertir
+! SFX W estir istiramos estir
+! SFX W eguir iguiramos eguir
+! SFX W ervir irviramos ervir
+! SFX W ar uviramos andar
+! SFX W ener uviramos ener
+! SFX W cir jramos ucir
+! SFX W er jramos raer
+! SFX W ecir ijramos ecir
+! SFX W er yramos [eo]er
+! SFX W er yramos caer
+! SFX W ir yramos [^g]uir
+! SFX W r yramos or
+! SFX W ir uyramos gir
+! SFX W eir iramos eir
+! SFX W etir itamos etir
+! SFX W entir intamos entir
+! SFX W ertir irtamos ertir
+! SFX W estir istamos estir
+! SFX W ervir irvamos ervir
+! SFX W er yamos oer
+! SFX W ir yamos [^g]uir
+! SFX W ir uyamos gir
+! SFX W cer zamos cocer
+! SFX W cer zamos orcer
+! SFX W 0 amos [^fh]acer
+! SFX W 0 amos [aeo]er
+! SFX W 0 amos [io]rir
+! SFX W 0 amos [u]ir
+! SFX W 0 amos ar
+! SFX W 0 amos e[bdgmrt]ir
+! SFX W 0 amos e[cd]er
+! SFX W 0 amos e[ns]tir
+! SFX W 0 amos enchir
+! SFX W 0 amos ender
+! SFX W 0 amos endir
+! SFX W 0 amos er[dnt]er
+! SFX W 0 amos er[ntv]ir
+! SFX W 0 amos eunir
+! SFX W 0 amos o[clv]er
+! SFX W 0 amos olver
+! SFX W 0 amos or[cd]er
+! SFX W 0 amos ormir
+! SFX W 0 amos ucir
+! SFX W er amos er
+! SFX W ir amos ir
+! SFX W r amos r
+! SFX W cer ramos [fh]acer
+! SFX W er ramos aber
+! SFX W er ramos erer
+! SFX W er ramos oder
+! SFX W er dramos [eo]ner
+! SFX W er dramos aler
+! SFX W ir dramos alir
+! SFX W ir dramos enir
+! SFX W ecir iramos ecir
+! SFX W r iramos [eo]r
+! SFX W eir iamos eir
+! SFX W 0 emos [^fh]acer
+! SFX W 0 emos [aeo]er
+! SFX W 0 emos [io]rir
+! SFX W 0 emos [u]ir
+! SFX W 0 emos ar
+! SFX W 0 emos e[bdgmrt]ir
+! SFX W 0 emos e[cd]er
+! SFX W 0 emos e[ns]tir
+! SFX W 0 emos enchir
+! SFX W 0 emos ender
+! SFX W 0 emos endir
+! SFX W 0 emos er[dnt]er
+! SFX W 0 emos er[ntv]ir
+! SFX W 0 emos eunir
+! SFX W 0 emos o[clv]er
+! SFX W 0 emos olver
+! SFX W 0 emos or[cd]er
+! SFX W 0 emos ormir
+! SFX W 0 emos ucir
+! SFX W ar emos [^g]uar
+! SFX W ar emos [ae]hu[ms]ar
+! SFX W ar emos [ae]ndar
+! SFX W ar emos [aeo]hi[jlnt]ar
+! SFX W ar emos ebrar
+! SFX W ar emos edrar
+! SFX W ar emos elar
+! SFX W ar emos emblar
+! SFX W ar emos embrar
+! SFX W ar emos endrar
+! SFX W ar emos ensar
+! SFX W ar emos entar
+! SFX W ar emos erbar
+! SFX W ar emos ernar
+! SFX W ar emos errar
+! SFX W ar emos ertar
+! SFX W ar emos esar
+! SFX W ar emos estar
+! SFX W ar emos etar
+! SFX W ar emos evar
+! SFX W ar emos obar
+! SFX W ar emos oblar
+! SFX W ar emos odar
+! SFX W ar emos olar
+! SFX W ar emos oldar
+! SFX W ar emos ollar
+! SFX W ar emos oltar
+! SFX W ar emos onar
+! SFX W ar emos ontar
+! SFX W ar emos ontrar
+! SFX W ar emos orar
+! SFX W ar emos ordar
+! SFX W ar emos ornar
+! SFX W ar emos ortar
+! SFX W ar emos osar
+! SFX W ar emos ostar
+! SFX W ar emos ostrar
+! SFX W ar emos ovar
+! SFX W ar emos oar
+! SFX W zar cemos [ae]izar
+! SFX W zar cemos enzar
+! SFX W zar cemos ezar
+! SFX W zar cemos gonzar
+! SFX W zar cemos orzar
+! SFX W iar iemos iar
+! SFX W cer remos [fh]acer
+! SFX W er remos aber
+! SFX W er remos erer
+! SFX W er remos oder
+! SFX W er dremos [eo]ner
+! SFX W er dremos aler
+! SFX W ir dremos alir
+! SFX W ir dremos enir
+! SFX W ecir iremos ecir
+! SFX W r iremos [eo]r
+! SFX W ar remos [^a]ndar
+! SFX W ar remos [^d]ar
+! SFX W ar remos [^n]dar
+! SFX W r remos alir
+! SFX W r remos ernir
+! SFX W r remos eunir
+! SFX W r remos ohibir
+! SFX W er iremos [^fh]acer
+! SFX W er iremos aler
+! SFX W er iremos e[cd]er
+! SFX W er iremos ender
+! SFX W er iremos er[dnt]er
+! SFX W er iremos o[clv]er
+! SFX W er iremos olver
+! SFX W er iremos or[cd]er
+! SFX W er iremos er
+! SFX W ebir ibiremos ebir
+! SFX W acer iciremos [fh]acer
+! SFX W edir idiremos edir
+! SFX W endir indiremos endir
+! SFX W oder udiremos oder
+! SFX W egir igiremos egir
+! SFX W enchir inchiremos enchir
+! SFX W emir imiremos emir
+! SFX W ormir urmiremos ormir
+! SFX W enir iniremos enir
+! SFX W aber upiremos aber
+! SFX W erir iriremos erir
+! SFX W irir iriremos irir
+! SFX W orir uriremos orir
+! SFX W erer isiremos erer
+! SFX W oner usiremos oner
+! SFX W etir itiremos etir
+! SFX W entir intiremos entir
+! SFX W ertir irtiremos ertir
+! SFX W estir istiremos estir
+! SFX W eguir iguiremos eguir
+! SFX W ervir irviremos ervir
+! SFX W ar uviremos andar
+! SFX W ener uviremos ener
+! SFX W cir jremos ucir
+! SFX W er jremos raer
+! SFX W ecir ijremos ecir
+! SFX W er yremos [eo]er
+! SFX W er yremos caer
+! SFX W ir yremos [^g]uir
+! SFX W r yremos or
+! SFX W ir uyremos gir
+! SFX W eir iremos eir
+! SFX W ar semos [^d]ar
+! SFX W ar semos [^n]dar
+! SFX W r semos [^a]ndar
+! SFX W r semos alir
+! SFX W r semos ernir
+! SFX W r semos eunir
+! SFX W r semos ohibir
+! SFX W er isemos [^fh]acer
+! SFX W er isemos aler
+! SFX W er isemos e[cd]er
+! SFX W er isemos ender
+! SFX W er isemos er[dnt]er
+! SFX W er isemos o[clv]er
+! SFX W er isemos olver
+! SFX W er isemos or[cd]er
+! SFX W er isemos er
+! SFX W ebir ibisemos ebir
+! SFX W acer icisemos [fh]acer
+! SFX W edir idisemos edir
+! SFX W endir indisemos endir
+! SFX W oder udisemos oder
+! SFX W egir igisemos egir
+! SFX W enchir inchisemos enchir
+! SFX W emir imisemos emir
+! SFX W ormir urmisemos ormir
+! SFX W enir inisemos enir
+! SFX W aber upisemos aber
+! SFX W erir irisemos erir
+! SFX W irir irisemos irir
+! SFX W orir urisemos orir
+! SFX W erer isisemos erer
+! SFX W oner usisemos oner
+! SFX W etir itisemos etir
+! SFX W entir intisemos entir
+! SFX W ertir irtisemos ertir
+! SFX W estir istisemos estir
+! SFX W eguir iguisemos eguir
+! SFX W ervir irvisemos ervir
+! SFX W ar uvisemos andar
+! SFX W ener uvisemos ener
+! SFX W cir jsemos ucir
+! SFX W er jsemos raer
+! SFX W ecir ijsemos ecir
+! SFX W er ysemos [eo]er
+! SFX W er ysemos caer
+! SFX W ir ysemos [^g]uir
+! SFX W r ysemos or
+! SFX W ir uysemos gir
+! SFX W eir isemos eir
+! SFX W ar uemos olgar
+! SFX W gar guemos egar
+! SFX W gar guemos engar
+! SFX W gar guemos ogar
+! SFX W gar guemos ugar
+! SFX W car quemos ocar
+! SFX W car quemos olcar
+! SFX W car quemos orcar
+! SFX W uar emos guar
+! SFX W er imos [^fh]acer
+! SFX W er imos aler
+! SFX W er imos e[cd]er
+! SFX W er imos ender
+! SFX W er imos er[dnt]er
+! SFX W er imos o[clv]er
+! SFX W er imos olver
+! SFX W er imos or[cd]er
+! SFX W acer icimos [fh]acer
+! SFX W oder udimos oder
+! SFX W cir jimos ucir
+! SFX W er jimos raer
+! SFX W ecir ijimos ecir
+! SFX W enir inimos enir
+! SFX W aber upimos aber
+! SFX W erer isimos erer
+! SFX W oner usimos oner
+! SFX W ar uvimos andar
+! SFX W ener uvimos ener
+! SFX W er mos [eo]er
+! SFX W er mos caer
+!
+!
+!
+! SFX W Y 29 S
+! SFX W 0 s [^fh]acer
+! SFX W 0 s [aeo]er
+! SFX W 0 s [io]rir
+! SFX W 0 s [u]ir
+! SFX W 0 s ar
+! SFX W 0 s e[bdgmrt]ir
+! SFX W 0 s e[cd]er
+! SFX W 0 s e[ns]tir
+! SFX W 0 s enchir
+! SFX W 0 s ender
+! SFX W 0 s endir
+! SFX W 0 s er[dnt]er
+! SFX W 0 s er[ntv]ir
+! SFX W 0 s eunir
+! SFX W 0 s o[clv]er
+! SFX W 0 s olver
+! SFX W 0 s or[cd]er
+! SFX W 0 s ormir
+! SFX W 0 s ucir
+! SFX W cer rs [fh]acer
+! SFX W er rs aber
+! SFX W er rs erer
+! SFX W er rs oder
+! SFX W er drs [eo]ner
+! SFX W er drs aler
+! SFX W ir drs alir
+! SFX W ir drs enir
+! SFX W ecir irs ecir
+! SFX W r irs [eo]r
+!
+!
+! SFX W Y 29 S
+! SFX W 0 [^fh]acer
+! SFX W 0 [aeo]er
+! SFX W 0 [io]rir
+! SFX W 0 [u]ir
+! SFX W 0 ar
+! SFX W 0 e[bdgmrt]ir
+! SFX W 0 e[cd]er
+! SFX W 0 e[ns]tir
+! SFX W 0 enchir
+! SFX W 0 ender
+! SFX W 0 endir
+! SFX W 0 er[dnt]er
+! SFX W 0 er[ntv]ir
+! SFX W 0 eunir
+! SFX W 0 o[clv]er
+! SFX W 0 olver
+! SFX W 0 or[cd]er
+! SFX W 0 ormir
+! SFX W 0 ucir
+! SFX W cer r [fh]acer
+! SFX W er r aber
+! SFX W er r erer
+! SFX W er r oder
+! SFX W er dr [eo]ner
+! SFX W er dr aler
+! SFX W ir dr alir
+! SFX W ir dr enir
+! SFX W ecir ir ecir
+! SFX W r ir [eo]r
+!
+!
+!
+! SFX W Y 38 S
+! SFX W 0 [^fh]acer
+! SFX W 0 [aeo]er
+! SFX W 0 [io]rir
+! SFX W 0 [u]ir
+! SFX W 0 ar
+! SFX W 0 e[bdgmrt]ir
+! SFX W 0 e[cd]er
+! SFX W 0 e[ns]tir
+! SFX W 0 enchir
+! SFX W 0 ender
+! SFX W 0 endir
+! SFX W 0 er[dnt]er
+! SFX W 0 er[ntv]ir
+! SFX W 0 eunir
+! SFX W 0 o[clv]er
+! SFX W 0 olver
+! SFX W 0 or[cd]er
+! SFX W 0 ormir
+! SFX W 0 ucir
+! SFX W aber saber
+! SFX W ar [^a]ndar
+! SFX W ar [^cguzd]ar
+! SFX W ar [^g]uar
+! SFX W ar [^n]dar
+! SFX W zar c zar
+! SFX W cer r [fh]acer
+! SFX W er r aber
+! SFX W er r erer
+! SFX W er r oder
+! SFX W er dr [eo]ner
+! SFX W er dr aler
+! SFX W ir dr alir
+! SFX W ir dr enir
+! SFX W ecir ir ecir
+! SFX W r ir [eo]r
+! SFX W ar u gar
+! SFX W car qu car
+! SFX W uar guar
+!
+!
+! SFX W Y 31 S
+! SFX W er [^fh]acer
+! SFX W er [eo]er
+! SFX W er aler
+! SFX W er caer
+! SFX W er e[cd]er
+! SFX W er ender
+! SFX W er er[dnt]er
+! SFX W er o[clv]er
+! SFX W er olver
+! SFX W er or[cd]er
+! SFX W ir [u]ir
+! SFX W ir alir
+! SFX W ir ebir
+! SFX W ir edir
+! SFX W ir egir
+! SFX W ir emir
+! SFX W ir enchir
+! SFX W ir endir
+! SFX W ir entir
+! SFX W ir erir
+! SFX W ir ernir
+! SFX W ir ertir
+! SFX W ir ervir
+! SFX W ir estir
+! SFX W ir etir
+! SFX W ir eunir
+! SFX W ir eir
+! SFX W ir irir
+! SFX W ir orir
+! SFX W ir ormir
+! SFX W r [eo]r
+!
+!
+!
+! SFX W Y 39 S
+! SFX W ar [^a]ndar
+! SFX W ar [^d]ar
+! SFX W ar [^n]dar
+! SFX W r alir
+! SFX W r ernir
+! SFX W r eunir
+! SFX W r irir
+! SFX W r ohibir
+! SFX W er i [^fh]acer
+! SFX W er i aler
+! SFX W er i e[cd]er
+! SFX W er i ender
+! SFX W er i er[dnt]er
+! SFX W er i o[clv]er
+! SFX W er i olver
+! SFX W er i or[cd]er
+! SFX W er i order
+! SFX W er i er
+! SFX W ebir ibi ebir
+! SFX W edir idi edir
+! SFX W endir indi endir
+! SFX W egir igi egir
+! SFX W enchir inchi enchir
+! SFX W emir imi emir
+! SFX W ormir urmi ormir
+! SFX W erir iri erir
+! SFX W orir uri orir
+! SFX W etir iti etir
+! SFX W entir inti entir
+! SFX W ertir irti ertir
+! SFX W estir isti estir
+! SFX W eguir igui eguir
+! SFX W ervir irvi ervir
+! SFX W er y [eo]er
+! SFX W er y caer
+! SFX W ir y [^g]uir
+! SFX W r y or
+! SFX W ir uy gir
+! SFX W eir i eir
+!
+!
+!
+! SFX W Y 21
+! SFX W r d [aei]r
+! SFX W r n [^c]ocer
+! SFX W r n [cr]aer
+! SFX W r n [eo]er
+! SFX W r n a[bcl]er
+! SFX W r n andar
+! SFX W r n ecer
+! SFX W r n guar
+! SFX W r n oner
+! SFX W r s [^c]ocer
+! SFX W r s [cr]aer
+! SFX W r s [eo]er
+! SFX W r s a[bcl]er
+! SFX W r s andar
+! SFX W r s ecer
+! SFX W r s guar
+! SFX W r s oner
+! SFX W r bais ar
+! SFX W ir s ir
+! SFX W r s r
+! SFX W cer z [fh]acer
+!
+! SFX Y Y 102
+! SFX Y er do [aeo]er
+! SFX Y er dos [aeo]er
+! SFX Y er da [aeo]er
+! SFX Y er das [aeo]er
+! SFX Y acer echo [fh]acer
+! SFX Y acer echos [fh]acer
+! SFX Y acer echa [fh]acer
+! SFX Y acer echas [fh]acer
+! SFX Y er ido oder
+! SFX Y er idos oder
+! SFX Y er ida oder
+! SFX Y er idas oder
+! SFX Y olver uelto olver
+! SFX Y olver ueltos olver
+! SFX Y olver uelta olver
+! SFX Y olver ueltas olver
+! SFX Y oner uesto oner
+! SFX Y oner uestos oner
+! SFX Y oner uesta oner
+! SFX Y oner uestas oner
+! SFX Y rir ierto abrir
+! SFX Y rir iertos abrir
+! SFX Y rir ierta abrir
+! SFX Y rir iertas abrir
+! SFX Y r do e[bdgmnrt]ir
+! SFX Y r dos e[bdgmnrt]ir
+! SFX Y r da e[bdgmnrt]ir
+! SFX Y r das e[bdgmnrt]ir
+! SFX Y ecir icho ecir
+! SFX Y ecir ichos ecir
+! SFX Y ecir icha ecir
+! SFX Y ecir ichas ecir
+! SFX Y r do [eo]r
+! SFX Y r dos [eo]r
+! SFX Y r da [eo]r
+! SFX Y r das [eo]r
+! SFX Y r do enchir
+! SFX Y r dos enchir
+! SFX Y r da enchir
+! SFX Y r das enchir
+! SFX Y r do en[dt]ir
+! SFX Y r dos en[dt]ir
+! SFX Y r da en[dt]ir
+! SFX Y r das en[dt]ir
+! SFX Y r do er[tv]ir
+! SFX Y r dos er[tv]ir
+! SFX Y r da er[tv]ir
+! SFX Y r das er[tv]ir
+! SFX Y r do estir
+! SFX Y r dos estir
+! SFX Y r da estir
+! SFX Y r das estir
+! SFX Y bir to ibir
+! SFX Y bir tos ibir
+! SFX Y bir ta ibir
+! SFX Y bir tas ibir
+! SFX Y orir uerto orir
+! SFX Y orir uertos orir
+! SFX Y orir uerta orir
+! SFX Y orir uertas orir
+! SFX Y r do ormir
+! SFX Y r dos ormir
+! SFX Y r da ormir
+! SFX Y r das ormir
+! SFX Y rir ierto ubrir
+! SFX Y rir iertos ubrir
+! SFX Y rir ierta ubrir
+! SFX Y rir iertas ubrir
+! SFX Y r do [u]ir
+! SFX Y r da [u]ir
+! SFX Y r dos [u]ir
+! SFX Y r das [u]ir
+! SFX Y er iendo [fh]acer
+! SFX Y er yendo [aeo]er
+! SFX Y oder udiendo oder
+! SFX Y er iendo olver
+! SFX Y er iendo oner
+! SFX Y r endo abrir
+! SFX Y ebir ibiendo ebir
+! SFX Y ecir iciendo ecir
+! SFX Y edir idiendo edir
+! SFX Y egir igiendo egir
+! SFX Y emir imiendo emir
+! SFX Y er iendo er
+! SFX Y eir iendo eir
+! SFX Y enchir inchiendo enchir
+! SFX Y endir indiendo endir
+! SFX Y enir iniendo enir
+! SFX Y entir intiendo entir
+! SFX Y ertir irtiendo ertir
+! SFX Y ervir irviendo ervir
+! SFX Y estir istiendo estir
+! SFX Y eguir iguiendo eguir
+! SFX Y erir iriendo erir
+! SFX Y etir itiendo etir
+! SFX Y r endo ibir
+! SFX Y r yendo or
+! SFX Y orir uriendo orir
+! SFX Y ormir urmiendo ormir
+! SFX Y r endo ubrir
+! SFX Y ir yendo [^g]uir
+! SFX Y ir uyendo gir
+!
+! SFX O Y 115
+! SFX O 0 me [ei]r
+! SFX O 0 te [ei]r
+! SFX O 0 se [ei]r
+! SFX O 0 nos [ei]r
+! SFX O 0 os [ei]r
+! SFX O er yndome [aeo]er
+! SFX O er yndote [aeo]er
+! SFX O er yndose [aeo]er
+! SFX O er yndonos [aeo]er
+! SFX O er yndoos [aeo]er
+! SFX O oder udindome oder
+! SFX O oder udindote oder
+! SFX O oder udindose oder
+! SFX O oder udindonos oder
+! SFX O oder udindoos oder
+! SFX O ebir ibindome ebir
+! SFX O ebir ibindote ebir
+! SFX O ebir ibindose ebir
+! SFX O ebir ibindonos ebir
+! SFX O ebir ibindoos ebir
+! SFX O ecir icindome ecir
+! SFX O ecir icindote ecir
+! SFX O ecir icindose ecir
+! SFX O ecir icindonos ecir
+! SFX O ecir icindoos ecir
+! SFX O edir idindome edir
+! SFX O edir idindote edir
+! SFX O edir idindose edir
+! SFX O edir idindonos edir
+! SFX O edir idindoos edir
+! SFX O egir igindome egir
+! SFX O egir igindote egir
+! SFX O egir igindose egir
+! SFX O egir igindonos egir
+! SFX O egir igindoos egir
+! SFX O emir imindome emir
+! SFX O emir imindote emir
+! SFX O emir imindose emir
+! SFX O emir imindonos emir
+! SFX O emir imindoos emir
+! SFX O er indome er
+! SFX O er indote er
+! SFX O er indose er
+! SFX O er indonos er
+! SFX O er indoos er
+! SFX O eir indome eir
+! SFX O eir indote eir
+! SFX O eir indose eir
+! SFX O eir indonos eir
+! SFX O eir indoos eir
+! SFX O endir indindome endir
+! SFX O endir indindote endir
+! SFX O endir indindose endir
+! SFX O endir indindonos endir
+! SFX O endir indindoos endir
+! SFX O enir inindome enir
+! SFX O enir inindote enir
+! SFX O enir inindose enir
+! SFX O enir inindonos enir
+! SFX O enir inindoos enir
+! SFX O entir intindome entir
+! SFX O entir intindote entir
+! SFX O entir intindose entir
+! SFX O entir intindonos entir
+! SFX O entir intindoos entir
+! SFX O ertir irtindome ertir
+! SFX O ertir irtindote ertir
+! SFX O ertir irtindose ertir
+! SFX O ertir irtindonos ertir
+! SFX O ertir irtindoos ertir
+! SFX O ervir irvindome ervir
+! SFX O ervir irvindote ervir
+! SFX O ervir irvindose ervir
+! SFX O ervir irvindonos ervir
+! SFX O ervir irvindoos ervir
+! SFX O estir istindome estir
+! SFX O estir istindote estir
+! SFX O estir istindose estir
+! SFX O estir istindonos estir
+! SFX O estir istindoos estir
+! SFX O eguir iguindome eguir
+! SFX O eguir iguindote eguir
+! SFX O eguir iguindose eguir
+! SFX O eguir iguindonos eguir
+! SFX O eguir iguindoos eguir
+! SFX O erir irindome erir
+! SFX O erir irindote erir
+! SFX O erir irindose erir
+! SFX O erir irindonos erir
+! SFX O erir irindoos erir
+! SFX O etir itindome etir
+! SFX O etir itindote etir
+! SFX O etir itindose etir
+! SFX O etir itindonos etir
+! SFX O etir itindoos etir
+! SFX O r yndome or
+! SFX O r yndote or
+! SFX O r yndose or
+! SFX O r yndonos or
+! SFX O r yndoos or
+! SFX O orir urindome orir
+! SFX O orir urindote orir
+! SFX O orir urindose orir
+! SFX O orir urindonos orir
+! SFX O orir urindoos orir
+! SFX O ormir urmindome ormir
+! SFX O ormir urmindote ormir
+! SFX O ormir urmindose ormir
+! SFX O ormir urmindonos ormir
+! SFX O ormir urmindoos ormir
+! SFX O ir yndome [^g]uir
+! SFX O ir yndote [^g]uir
+! SFX O ir yndose [^g]uir
+! SFX O ir yndonos [^g]uir
+! SFX O ir yndoos [^g]uir
+!
+! SFX Q Y 138
+! SFX Q 0 lo [ei]r
+! SFX Q 0 la [ei]r
+! SFX Q 0 los [ei]r
+! SFX Q 0 las [ei]r
+! SFX Q 0 le [ei]r
+! SFX Q 0 les [ei]r
+! SFX Q er yndolo [aeo]er
+! SFX Q er yndola [aeo]er
+! SFX Q er yndolos [aeo]er
+! SFX Q er yndolas [aeo]er
+! SFX Q er yndole [aeo]er
+! SFX Q er yndoles [aeo]er
+! SFX Q oder udindolo oder
+! SFX Q oder udindola oder
+! SFX Q oder udindolos oder
+! SFX Q oder udindolas oder
+! SFX Q oder udindole oder
+! SFX Q oder udindoles oder
+! SFX Q ebir ibindolo ebir
+! SFX Q ebir ibindolos ebir
+! SFX Q ebir ibindola ebir
+! SFX Q ebir ibindolas ebir
+! SFX Q ebir ibindole ebir
+! SFX Q ebir ibindoles ebir
+! SFX Q ecir icindolo ecir
+! SFX Q ecir icindolos ecir
+! SFX Q ecir icindola ecir
+! SFX Q ecir icindolas ecir
+! SFX Q ecir icindole ecir
+! SFX Q ecir icindoles ecir
+! SFX Q edir idindolo edir
+! SFX Q edir idindolos edir
+! SFX Q edir idindola edir
+! SFX Q edir idindolas edir
+! SFX Q edir idindole edir
+! SFX Q edir idindoles edir
+! SFX Q egir igindolo egir
+! SFX Q egir igindolos egir
+! SFX Q egir igindola egir
+! SFX Q egir igindolas egir
+! SFX Q egir igindole egir
+! SFX Q egir igindoles egir
+! SFX Q emir imindolo emir
+! SFX Q emir imindolos emir
+! SFX Q emir imindola emir
+! SFX Q emir imindolas emir
+! SFX Q emir imindole emir
+! SFX Q emir imindoles emir
+! SFX Q er indolo er
+! SFX Q er indolos er
+! SFX Q er indola er
+! SFX Q er indolas er
+! SFX Q er indole er
+! SFX Q er indoles er
+! SFX Q eir indolo eir
+! SFX Q eir indolos eir
+! SFX Q eir indola eir
+! SFX Q eir indolas eir
+! SFX Q eir indole eir
+! SFX Q eir indoles eir
+! SFX Q endir indindolo endir
+! SFX Q endir indindolos endir
+! SFX Q endir indindola endir
+! SFX Q endir indindolas endir
+! SFX Q endir indindole endir
+! SFX Q endir indindoles endir
+! SFX Q enir inindolo enir
+! SFX Q enir inindolos enir
+! SFX Q enir inindola enir
+! SFX Q enir inindolas enir
+! SFX Q enir inindole enir
+! SFX Q enir inindoles enir
+! SFX Q entir intindolo entir
+! SFX Q entir intindolos entir
+! SFX Q entir intindola entir
+! SFX Q entir intindolas entir
+! SFX Q entir intindole entir
+! SFX Q entir intindoles entir
+! SFX Q ertir irtindolo ertir
+! SFX Q ertir irtindolos ertir
+! SFX Q ertir irtindola ertir
+! SFX Q ertir irtindolas ertir
+! SFX Q ertir irtindole ertir
+! SFX Q ertir irtindoles ertir
+! SFX Q ervir irvindolo ervir
+! SFX Q ervir irvindolos ervir
+! SFX Q ervir irvindola ervir
+! SFX Q ervir irvindolas ervir
+! SFX Q ervir irvindole ervir
+! SFX Q ervir irvindoles ervir
+! SFX Q estir istindolo estir
+! SFX Q estir istindolos estir
+! SFX Q estir istindola estir
+! SFX Q estir istindolas estir
+! SFX Q estir istindole estir
+! SFX Q estir istindoles estir
+! SFX Q eguir iguindolo eguir
+! SFX Q eguir iguindolos eguir
+! SFX Q eguir iguindola eguir
+! SFX Q eguir iguindolas eguir
+! SFX Q eguir iguindole eguir
+! SFX Q eguir iguindoles eguir
+! SFX Q erir irindolo erir
+! SFX Q erir irindolos erir
+! SFX Q erir irindola erir
+! SFX Q erir irindolas erir
+! SFX Q erir irindole erir
+! SFX Q erir irindoles erir
+! SFX Q etir itindolo etir
+! SFX Q etir itindolos etir
+! SFX Q etir itindola etir
+! SFX Q etir itindolas etir
+! SFX Q etir itindole etir
+! SFX Q etir itindoles etir
+! SFX Q r yndolo or
+! SFX Q r yndolos or
+! SFX Q r yndola or
+! SFX Q r yndolas or
+! SFX Q r yndole or
+! SFX Q r yndoles or
+! SFX Q orir urindolo orir
+! SFX Q orir urindolos orir
+! SFX Q orir urindola orir
+! SFX Q orir urindolas orir
+! SFX Q orir urindole orir
+! SFX Q orir urindoles orir
+! SFX Q ormir urmindolo ormir
+! SFX Q ormir urmindolos ormir
+! SFX Q ormir urmindola ormir
+! SFX Q ormir urmindolas ormir
+! SFX Q ormir urmindole ormir
+! SFX Q ormir urmindoles ormir
+! SFX Q ir yndolo [^g]uir
+! SFX Q ir yndolos [^g]uir
+! SFX Q ir yndola [^g]uir
+! SFX Q ir yndolas [^g]uir
+! SFX Q ir yndole [^g]uir
+! SFX Q ir yndoles [^g]uir
+!
+! SFX Z Y 171
+! SFX Z er rmelo er
+! SFX Z er rmela er
+! SFX Z er rmelos er
+! SFX Z er rmelas er
+! SFX Z er rtelo er
+! SFX Z er rtela er
+! SFX Z er rtelos er
+! SFX Z er rtelas er
+! SFX Z er rselo er
+! SFX Z er rsela er
+! SFX Z er rselos er
+! SFX Z er rselas er
+! SFX Z er roslo er
+! SFX Z er rosla er
+! SFX Z er roslos er
+! SFX Z er roslas er
+! SFX Z er rnoslo er
+! SFX Z er rnosla er
+! SFX Z er rnoslos er
+! SFX Z er rnoslas er
+! SFX Z er rnosles er
+! SFX Z ir rmelo ir
+! SFX Z ir rmela ir
+! SFX Z ir rmele ir
+! SFX Z ir rmelos ir
+! SFX Z ir rmelas ir
+! SFX Z ir rmeles ir
+! SFX Z ir rtelo ir
+! SFX Z ir rtela ir
+! SFX Z ir rtele ir
+! SFX Z ir rtelos ir
+! SFX Z ir rtelas ir
+! SFX Z ir rteles ir
+! SFX Z ir rselo ir
+! SFX Z ir rsela ir
+! SFX Z ir rsele ir
+! SFX Z ir rselos ir
+! SFX Z ir rselas ir
+! SFX Z ir rseles ir
+! SFX Z ir roslo ir
+! SFX Z ir rosla ir
+! SFX Z ir rosle ir
+! SFX Z ir roslos ir
+! SFX Z ir roslas ir
+! SFX Z ir rosles ir
+! SFX Z ir rnoslo ir
+! SFX Z ir rnosla ir
+! SFX Z ir rnosle ir
+! SFX Z ir rnoslos ir
+! SFX Z ir rnoslas ir
+! SFX Z ir rnosles ir
+! SFX Z er yndomelo [aeo]er
+! SFX Z er yndomela [aeo]er
+! SFX Z er yndomele [aeo]er
+! SFX Z er yndomelos [aeo]er
+! SFX Z er yndomelas [aeo]er
+! SFX Z er yndomeles [aeo]er
+! SFX Z er yndotelo [aeo]er
+! SFX Z er yndotela [aeo]er
+! SFX Z er yndotele [aeo]er
+! SFX Z er yndotelos [aeo]er
+! SFX Z er yndotelas [aeo]er
+! SFX Z er yndoteles [aeo]er
+! SFX Z er yndoselo [aeo]er
+! SFX Z er yndosela [aeo]er
+! SFX Z er yndosele [aeo]er
+! SFX Z er yndoselos [aeo]er
+! SFX Z er yndoselas [aeo]er
+! SFX Z er yndoseles [aeo]er
+! SFX Z er yndooslo [aeo]er
+! SFX Z er yndoosla [aeo]er
+! SFX Z er yndoosle [aeo]er
+! SFX Z er yndooslos [aeo]er
+! SFX Z er yndooslas [aeo]er
+! SFX Z er yndoosles [aeo]er
+! SFX Z er yndonoslo [aeo]er
+! SFX Z er yndonosla [aeo]er
+! SFX Z er yndonosle [aeo]er
+! SFX Z er yndonoslos [aeo]er
+! SFX Z er yndonoslas [aeo]er
+! SFX Z er yndonosles [aeo]er
+! SFX Z ir yndomelo [^g]uir
+! SFX Z ir yndomelos [^g]uir
+! SFX Z ir yndomela [^g]uir
+! SFX Z ir yndomelas [^g]uir
+! SFX Z ir yndomele [^g]uir
+! SFX Z ir yndomeles [^g]uir
+! SFX Z ir yndotelo [^g]uir
+! SFX Z ir yndotelos [^g]uir
+! SFX Z ir yndotela [^g]uir
+! SFX Z ir yndotelas [^g]uir
+! SFX Z ir yndotele [^g]uir
+! SFX Z ir yndoteles [^g]uir
+! SFX Z ir yndoselo [^g]uir
+! SFX Z ir yndoselos [^g]uir
+! SFX Z ir yndosela [^g]uir
+! SFX Z ir yndoselas [^g]uir
+! SFX Z ir yndosele [^g]uir
+! SFX Z ir yndoseles [^g]uir
+! SFX Z ir yndooslo [^g]uir
+! SFX Z ir yndooslos [^g]uir
+! SFX Z ir yndoosla [^g]uir
+! SFX Z ir yndooslas [^g]uir
+! SFX Z ir yndoosle [^g]uir
+! SFX Z ir yndoosles [^g]uir
+! SFX Z ir yndonoslo [^g]uir
+! SFX Z ir yndonoslos [^g]uir
+! SFX Z ir yndonosla [^g]uir
+! SFX Z ir yndonoslas [^g]uir
+! SFX Z ir yndonosle [^g]uir
+! SFX Z ir yndonosles [^g]uir
+! SFX Z egir igindomelo egir
+! SFX Z egir igindomelos egir
+! SFX Z egir igindomela egir
+! SFX Z egir igindomelas egir
+! SFX Z egir igindomele egir
+! SFX Z egir igindomeles egir
+! SFX Z egir igindotelo egir
+! SFX Z egir igindotelos egir
+! SFX Z egir igindotela egir
+! SFX Z egir igindotelas egir
+! SFX Z egir igindotele egir
+! SFX Z egir igindoteles egir
+! SFX Z egir igindoselo egir
+! SFX Z egir igindoselos egir
+! SFX Z egir igindosela egir
+! SFX Z egir igindoselas egir
+! SFX Z egir igindosele egir
+! SFX Z egir igindoseles egir
+! SFX Z egir igindooslo egir
+! SFX Z egir igindooslos egir
+! SFX Z egir igindoosla egir
+! SFX Z egir igindooslas egir
+! SFX Z egir igindoosle egir
+! SFX Z egir igindoosles egir
+! SFX Z egir igindonoslo egir
+! SFX Z egir igindonoslos egir
+! SFX Z egir igindonosla egir
+! SFX Z egir igindonoslas egir
+! SFX Z egir igindonosle egir
+! SFX Z egir igindonosles egir
+! SFX Z eguir iguindomelo eguir
+! SFX Z eguir iguindomelos eguir
+! SFX Z eguir iguindomela eguir
+! SFX Z eguir iguindomelas eguir
+! SFX Z eguir iguindomele eguir
+! SFX Z eguir iguindomeles eguir
+! SFX Z eguir iguindotelo eguir
+! SFX Z eguir iguindotelos eguir
+! SFX Z eguir iguindotela eguir
+! SFX Z eguir iguindotelas eguir
+! SFX Z eguir iguindotele eguir
+! SFX Z eguir iguindoteles eguir
+! SFX Z eguir iguindoselo eguir
+! SFX Z eguir iguindoselos eguir
+! SFX Z eguir iguindosela eguir
+! SFX Z eguir iguindoselas eguir
+! SFX Z eguir iguindosele eguir
+! SFX Z eguir iguindoseles eguir
+! SFX Z eguir iguindooslo eguir
+! SFX Z eguir iguindooslos eguir
+! SFX Z eguir iguindoosla eguir
+! SFX Z eguir iguindooslas eguir
+! SFX Z eguir iguindoosle eguir
+! SFX Z eguir iguindoosles eguir
+! SFX Z eguir iguindonoslo eguir
+! SFX Z eguir iguindonoslos eguir
+! SFX Z eguir iguindonosla eguir
+! SFX Z eguir iguindonoslas eguir
+! SFX Z eguir iguindonosle eguir
+! SFX Z eguir iguindonosles eguir
+--- 139,3509 ----
+ SFX M 0 idades [elnrsz]
+! SFX M 0 mente [elnrsz]
+!
+! SFX N Y 2
+! SFX N r damente [ai]r
+! SFX N er idamente er
+!
+! SFX P Y 20
+! SFX P e a e
+! SFX P o a o
+! SFX P 0 s [eo]
+! SFX P o as o
+! SFX P e as e
+! SFX P n ana n
+! SFX P n anes n
+! SFX P n anas n
+! SFX P n ina n
+! SFX P n ines n
+! SFX P n inas n
+! SFX P n ona n
+! SFX P n ones n
+! SFX P n onas n
+! SFX P 0 a [^aons]
+! SFX P 0 es [^aons]
+! SFX P 0 as [^aons]
+! SFX P s esa s
+! SFX P s eses s
+! SFX P s esas s
+!
+! SFX H Y 2
+! SFX H r cin [ai]r
+! SFX H r ciones [ai]r
+!
+! SFX I Y 4
+! SFX I r miento [ai]r
+! SFX I r mientos [ai]r
+! SFX I er imiento er
+! SFX I er imientos er
+!
+! SFX L Y 6
+! SFX L r nte ar
+! SFX L r ntes ar
+! SFX L er iente er
+! SFX L er ientes er
+! SFX L r ente ir
+! SFX L r entes ir
+!
+! SFX R Y 20
+! SFX R 0 me [aei]r
+! SFX R 0 te [aei]r
+! SFX R 0 se [aei]r
+! SFX R 0 nos [aei]r
+! SFX R 0 os [aei]r
+! SFX R ar ndome ar
+! SFX R ar ndote ar
+! SFX R ar ndose ar
+! SFX R ar ndonos ar
+! SFX R ar ndoos ar
+! SFX R er indome er
+! SFX R er indote er
+! SFX R er indose er
+! SFX R er indonos er
+! SFX R er indoos er
+! SFX R r ndome ir
+! SFX R r ndote ir
+! SFX R r ndose ir
+! SFX R r ndonos ir
+! SFX R r ndoos ir
+!
+! SFX S Y 11
+! SFX S 0 s [aeiou]
+! SFX S 0 es [djlry]
+! SFX S z ces z
+! SFX S 0 es [^]s
+! SFX S 0 es [^]n
+! SFX S n anes n
+! SFX S n enes n
+! SFX S n ines n
+! SFX S n ones n
+! SFX S n unes n
+! SFX S s eses s
+!
+! SFX T Y 24
+! SFX T 0 lo [aei]r
+! SFX T 0 la [aei]r
+! SFX T 0 le [aei]r
+! SFX T 0 los [aei]r
+! SFX T 0 las [aei]r
+! SFX T 0 les [aei]r
+! SFX T ar ndolo ar
+! SFX T ar ndola ar
+! SFX T ar ndole ar
+! SFX T ar ndolos ar
+! SFX T ar ndolas ar
+! SFX T ar ndoles ar
+! SFX T er indolo er
+! SFX T er indola er
+! SFX T er indole er
+! SFX T er indolos er
+! SFX T er indolas er
+! SFX T er indoles er
+! SFX T r ndolo ir
+! SFX T r ndola ir
+! SFX T r ndole ir
+! SFX T r ndolos ir
+! SFX T r ndolas ir
+! SFX T r ndoles ir
+!
+! SFX U Y 120
+! SFX U ar rmelo ar
+! SFX U ar rtelo ar
+! SFX U ar rselo ar
+! SFX U ar rnoslo ar
+! SFX U ar roslo ar
+! SFX U ar rmela ar
+! SFX U ar rtela ar
+! SFX U ar rsela ar
+! SFX U ar rnosla ar
+! SFX U ar rosla ar
+! SFX U ar rmelos ar
+! SFX U ar rtelos ar
+! SFX U ar rselos ar
+! SFX U ar rnoslos ar
+! SFX U ar roslos ar
+! SFX U ar rmelas ar
+! SFX U ar rtelas ar
+! SFX U ar rselas ar
+! SFX U ar rnoslas ar
+! SFX U ar roslas ar
+! SFX U ar ndomelo ar
+! SFX U ar ndotelo ar
+! SFX U ar ndoselo ar
+! SFX U ar ndonoslo ar
+! SFX U ar ndooslo ar
+! SFX U ar ndomela ar
+! SFX U ar ndotela ar
+! SFX U ar ndosela ar
+! SFX U ar ndonosla ar
+! SFX U ar ndoosla ar
+! SFX U ar ndomelos ar
+! SFX U ar ndotelos ar
+! SFX U ar ndoselos ar
+! SFX U ar ndonoslos ar
+! SFX U ar ndooslos ar
+! SFX U ar ndomelas ar
+! SFX U ar ndotelas ar
+! SFX U ar ndoselas ar
+! SFX U ar ndonoslas ar
+! SFX U ar ndooslas ar
+! SFX U er rmelo er
+! SFX U er rtelo er
+! SFX U er rselo er
+! SFX U er rnoslo er
+! SFX U er roslo er
+! SFX U er rmela er
+! SFX U er rtela er
+! SFX U er rsela er
+! SFX U er rnosla er
+! SFX U er rosla er
+! SFX U er rmelos er
+! SFX U er rtelos er
+! SFX U er rselos er
+! SFX U er rnoslos er
+! SFX U er roslos er
+! SFX U er rmelas er
+! SFX U er rtelas er
+! SFX U er rselas er
+! SFX U er rnoslas er
+! SFX U er roslas er
+! SFX U er indomelo er
+! SFX U er indotelo er
+! SFX U er indoselo er
+! SFX U er indonoslo er
+! SFX U er indooslo er
+! SFX U er indomela er
+! SFX U er indotela er
+! SFX U er indosela er
+! SFX U er indonosla er
+! SFX U er indoosla er
+! SFX U er indomelos er
+! SFX U er indotelos er
+! SFX U er indoselos er
+! SFX U er indonoslos er
+! SFX U er indooslos er
+! SFX U er indomelas er
+! SFX U er indotelas er
+! SFX U er indoselas er
+! SFX U er indonoslas er
+! SFX U er indooslas er
+! SFX U ir rmelo ir
+! SFX U ir rtelo ir
+! SFX U ir rselo ir
+! SFX U ir rnoslo ir
+! SFX U ir roslo ir
+! SFX U ir rmela ir
+! SFX U ir rtela ir
+! SFX U ir rsela ir
+! SFX U ir rnosla ir
+! SFX U ir rosla ir
+! SFX U ir rmelas ir
+! SFX U ir rtelas ir
+! SFX U ir rselas ir
+! SFX U ir rnoslas ir
+! SFX U ir roslas ir
+! SFX U ir rmelos ir
+! SFX U ir rtelos ir
+! SFX U ir rselos ir
+! SFX U ir rnoslos ir
+! SFX U ir roslos ir
+! SFX U r ndomelo ir
+! SFX U r ndotelo ir
+! SFX U r ndoselo ir
+! SFX U r ndonoslo ir
+! SFX U r ndooslo ir
+! SFX U r ndomela ir
+! SFX U r ndotela ir
+! SFX U r ndosela ir
+! SFX U r ndonosla ir
+! SFX U r ndoosla ir
+! SFX U r ndomelos ir
+! SFX U r ndotelos ir
+! SFX U r ndoselos ir
+! SFX U r ndonoslos ir
+! SFX U r ndooslos ir
+! SFX U r ndomelas ir
+! SFX U r ndotelas ir
+! SFX U r ndoselas ir
+! SFX U r ndonoslas ir
+! SFX U r ndooslas ir
+!
+! SFX V Y 169
+! SFX V ar o ar
+! SFX V er o [^cg]er
+! SFX V cer zo cer
+! SFX V ger jo ger
+! SFX V ir o [^cgu]ir
+! SFX V cir zo cir
+! SFX V gir jo gir
+! SFX V uir o guir
+! SFX V quir co quir
+! SFX V r s [ae]r
+! SFX V ir es ir
+! SFX V ar a ar
+! SFX V er e er
+! SFX V ir e ir
+! SFX V r mos [aei]r
+! SFX V ar is ar
+! SFX V er is er
+! SFX V ir s ir
+! SFX V r n [ae]r
+! SFX V ir en ir
+! SFX V r ba ar
+! SFX V er a er
+! SFX V ir a ir
+! SFX V r bas ar
+! SFX V er as er
+! SFX V ir as ir
+! SFX V ar bamos ar
+! SFX V er amos er
+! SFX V ir amos ir
+! SFX V r bais ar
+! SFX V er ais er
+! SFX V ir ais ir
+! SFX V r ban ar
+! SFX V er an er
+! SFX V ir an ir
+! SFX V ar [^czg]ar
+! SFX V car qu car
+! SFX V ar u gar
+! SFX V zar c zar
+! SFX V er er
+! SFX V ir ir
+! SFX V r ste [ai]r
+! SFX V er iste er
+! SFX V ar ar
+! SFX V er i er
+! SFX V r ir
+! SFX V er imos er
+! SFX V r steis [ai]r
+! SFX V er isteis er
+! SFX V 0 on ar
+! SFX V er ieron er
+! SFX V r eron ir
+! SFX V 0 [aei]r
+! SFX V 0 s [aei]r
+! SFX V 0 [aei]r
+! SFX V 0 emos [aei]r
+! SFX V 0 is [aei]r
+! SFX V 0 n [aei]r
+! SFX V 0 a [aei]r
+! SFX V 0 as [aei]r
+! SFX V 0 amos [aei]r
+! SFX V 0 ais [aei]r
+! SFX V 0 an [aei]r
+! SFX V ar e [^czg]ar
+! SFX V car que car
+! SFX V ar ue gar
+! SFX V zar ce zar
+! SFX V er a [^cg]er
+! SFX V cer za cer
+! SFX V ger ja ger
+! SFX V ir a [^cgu]ir
+! SFX V cir za cir
+! SFX V gir ja gir
+! SFX V uir a guir
+! SFX V quir ca quir
+! SFX V ar es [^czg]ar
+! SFX V car ques car
+! SFX V ar ues gar
+! SFX V zar ces zar
+! SFX V er as [^cg]er
+! SFX V cer zas cer
+! SFX V ger jas ger
+! SFX V ir as [^cgu]ir
+! SFX V cir zas cir
+! SFX V gir jas gir
+! SFX V uir as guir
+! SFX V quir cas quir
+! SFX V ar emos [^czg]ar
+! SFX V car quemos car
+! SFX V ar uemos gar
+! SFX V zar cemos zar
+! SFX V er amos [^cg]er
+! SFX V cer zamos cer
+! SFX V ger jamos ger
+! SFX V ir amos [^cgu]ir
+! SFX V cir zamos cir
+! SFX V gir jamos gir
+! SFX V uir amos guir
+! SFX V quir camos quir
+! SFX V ar is [^czg]ar
+! SFX V car quis car
+! SFX V ar uis gar
+! SFX V zar cis zar
+! SFX V er is [^cg]er
+! SFX V cer zis cer
+! SFX V ger jis ger
+! SFX V ir is [^cgu]ir
+! SFX V cir zis cir
+! SFX V gir jis gir
+! SFX V uir is guir
+! SFX V quir cis quir
+! SFX V ar en [^czg]ar
+! SFX V car quen car
+! SFX V ar uen gar
+! SFX V zar cen zar
+! SFX V er an [^cg]er
+! SFX V cer zan cer
+! SFX V ger jan ger
+! SFX V ir an [^cgu]ir
+! SFX V cir zan cir
+! SFX V gir jan gir
+! SFX V uir an guir
+! SFX V quir can quir
+! SFX V r se ar
+! SFX V r ra ar
+! SFX V er iese er
+! SFX V er iera er
+! SFX V r ese ir
+! SFX V r era ir
+! SFX V r ses ar
+! SFX V r ras ar
+! SFX V er ieses er
+! SFX V er ieras er
+! SFX V r eses ir
+! SFX V r eras ir
+! SFX V ar semos ar
+! SFX V ar ramos ar
+! SFX V er isemos er
+! SFX V er iramos er
+! SFX V r semos ir
+! SFX V r ramos ir
+! SFX V r seis ar
+! SFX V r rais ar
+! SFX V er ieseis er
+! SFX V er ierais er
+! SFX V r eseis ir
+! SFX V r erais ir
+! SFX V r sen ar
+! SFX V r ran ar
+! SFX V er iesen er
+! SFX V er ieran er
+! SFX V r esen ir
+! SFX V r eran ir
+! SFX V r re ar
+! SFX V er iere er
+! SFX V r ere ir
+! SFX V r res ar
+! SFX V er ieres er
+! SFX V r eres ir
+! SFX V ar remos ar
+! SFX V er iremos er
+! SFX V r remos ir
+! SFX V r reis ar
+! SFX V er iereis er
+! SFX V r ereis ir
+! SFX V r ren ar
+! SFX V er ieren er
+! SFX V r eren ir
+! SFX V r d r
+!
+! SFX X Y 11
+! SFX X r do [ai]r
+! SFX X r dos [ai]r
+! SFX X r da [ai]r
+! SFX X r das [ai]r
+! SFX X er ido er
+! SFX X er idos er
+! SFX X er ida er
+! SFX X er idas er
+! SFX X r ndo ar
+! SFX X er iendo er
+! SFX X r endo ir
+!
+! SFX W Y 197 S
+! SFX W ar a andar
+! SFX W ar a guar
+! SFX W er a [eo]er
+! SFX W r ba ar
+! SFX W obar ueba obar
+! SFX W ebir iba ebir
+! SFX W erbar ierba erbar
+! SFX W ibir ba ohibir
+! SFX W ocar ueca ocar
+! SFX W olcar uelca olcar
+! SFX W orcar uerca orcar
+! SFX W cer zca [^c]ocer
+! SFX W cer zca [^fh]acer
+! SFX W cer zca ecer
+! SFX W cir zca ucir
+! SFX W eder ieda eder
+! SFX W odar ueda odar
+! SFX W oder ueda oder
+! SFX W edir ida edir
+! SFX W oldar uelda [^g]oldar
+! SFX W oldar elda goldar
+! SFX W endar ienda endar
+! SFX W ender ienda ender
+! SFX W endir inda endir
+! SFX W erder ierda erder
+! SFX W ordar uerda ordar
+! SFX W order uerda order
+! SFX W cer ga [fh]acer
+! SFX W er ga [eo]ner
+! SFX W er ga aler
+! SFX W ir ga alir
+! SFX W gar ega ugar
+! SFX W egar iega egar
+! SFX W ogar uega ogar
+! SFX W ecir iga ecir
+! SFX W eguir iga eguir
+! SFX W er iga aer
+! SFX W er iga oer
+! SFX W r iga or
+! SFX W olgar uelga olgar
+! SFX W enir enga enir
+! SFX W engar ienga engar
+! SFX W enchir incha enchir
+! SFX W egir ija egir
+! SFX W ijar ja [ae]hijar
+! SFX W oblar uebla oblar
+! SFX W emblar iembla emblar
+! SFX W elar iela elar
+! SFX W olar uela olar
+! SFX W oler uela oler
+! SFX W ollar uella [^g]ollar
+! SFX W ollar ella gollar
+! SFX W ilar la [ae]hilar
+! SFX W emir ima emir
+! SFX W ormir uerma ormir
+! SFX W umar ma [ae]humar
+! SFX W onar uena onar
+! SFX W ernar ierna ernar
+! SFX W erner ierna erner
+! SFX W ernir ierna ernir
+! SFX W ornar uerna ornar
+! SFX W inar na [aeo]hinar
+! SFX W unir na eunir
+! SFX W aber epa saber
+! SFX W caber quepa caber
+! SFX W r ra [^a]ndar
+! SFX W r ra [^d]ar
+! SFX W r ra [^n]dar
+! SFX W ebrar iebra ebrar
+! SFX W embrar iembra embrar
+! SFX W edrar iedra edrar
+! SFX W endrar iendra endrar
+! SFX W r era alir
+! SFX W r era ernir
+! SFX W r era eunir
+! SFX W r era ohibir
+! SFX W er iera [^fh]acer
+! SFX W er iera aler
+! SFX W er iera e[cd]er
+! SFX W er iera ender
+! SFX W er iera er[dnt]er
+! SFX W er iera o[clv]er
+! SFX W er iera olver
+! SFX W er iera or[cd]er
+! SFX W erer iera erer
+! SFX W erir iera erir
+! SFX W er iera er
+! SFX W irir iera irir
+! SFX W ebir ibiera ebir
+! SFX W acer iciera [fh]acer
+! SFX W edir idiera edir
+! SFX W endir indiera endir
+! SFX W oder udiera oder
+! SFX W egir igiera egir
+! SFX W enchir inchiera enchir
+! SFX W emir imiera emir
+! SFX W ormir urmiera ormir
+! SFX W enir iniera enir
+! SFX W aber upiera aber
+! SFX W erir iriera erir
+! SFX W irir iriera irir
+! SFX W orir uriera orir
+! SFX W erer isiera erer
+! SFX W oner usiera oner
+! SFX W etir itiera etir
+! SFX W entir intiera entir
+! SFX W ertir irtiera ertir
+! SFX W estir istiera estir
+! SFX W eguir iguiera eguir
+! SFX W ervir irviera ervir
+! SFX W ar uviera andar
+! SFX W ener uviera ener
+! SFX W cir jera ucir
+! SFX W er jera raer
+! SFX W ecir ijera ecir
+! SFX W orar uera [^g]orar
+! SFX W orir uera orir
+! SFX W er yera [eo]er
+! SFX W er yera caer
+! SFX W ir yera [^g]uir
+! SFX W r yera or
+! SFX W ir uyera gir
+! SFX W eir iera eir
+! SFX W orar era gorar
+! SFX W errar ierra errar
+! SFX W ontrar uentra ontrar
+! SFX W ostrar uestra ostrar
+! SFX W esar iesa esar
+! SFX W osar uesa osar
+! SFX W ensar iensa ensar
+! SFX W usar sa [ae]husar
+! SFX W etar ieta etar
+! SFX W etir ita etir
+! SFX W oltar uelta oltar
+! SFX W entar ienta entar
+! SFX W entir ienta entir
+! SFX W ontar uenta ontar
+! SFX W ertar ierta ertar
+! SFX W erter ierta erter
+! SFX W ertir ierta ertir
+! SFX W ortar uerta ortar
+! SFX W estar iesta estar
+! SFX W ostar uesta ostar
+! SFX W estir ista estir
+! SFX W itar ta [ae]hitar
+! SFX W evar ieva evar
+! SFX W ovar ueva ovar
+! SFX W over ueva over
+! SFX W olver uelva olver
+! SFX W ervir irva ervir
+! SFX W er ya oer
+! SFX W ir ya [^g]uir
+! SFX W ir uya gir
+! SFX W ezar ieza ezar
+! SFX W ocer ueza cocer
+! SFX W enzar ienza enzar
+! SFX W onzar enza gonzar
+! SFX W orcer uerza orcer
+! SFX W orzar uerza orzar
+! SFX W izar za [ae]izar
+! SFX W 0 a [^fh]acer
+! SFX W 0 a [aeo]er
+! SFX W 0 a [io]rir
+! SFX W 0 a [u]ir
+! SFX W 0 a ar
+! SFX W 0 a e[bdgmrt]ir
+! SFX W 0 a e[cd]er
+! SFX W 0 a e[ns]tir
+! SFX W 0 a enchir
+! SFX W 0 a ender
+! SFX W 0 a endir
+! SFX W 0 a er[dnt]er
+! SFX W 0 a er[ntv]ir
+! SFX W 0 a eunir
+! SFX W 0 a o[clv]er
+! SFX W 0 a olver
+! SFX W 0 a or[cd]er
+! SFX W 0 a ormir
+! SFX W 0 a ucir
+! SFX W er a er
+! SFX W er a er
+! SFX W iar a iar
+! SFX W ir a ir
+! SFX W r a r
+! SFX W cer ra [fh]acer
+! SFX W er ra aber
+! SFX W er ra erer
+! SFX W er ra oder
+! SFX W er dra [eo]ner
+! SFX W er dra aler
+! SFX W ir dra alir
+! SFX W ir dra enir
+! SFX W ecir ira ecir
+! SFX W r ira [eo]r
+! SFX W oar uea oar
+! SFX W eir ia eir
+! SFX W uar a [^g]uar
+!
+! SFX W Y 264 S
+! SFX W ar e andar
+! SFX W er e [^c]ocer
+! SFX W er e [cr]aer
+! SFX W er e [eo]er
+! SFX W er e a[bcl]er
+! SFX W er e ecer
+! SFX W er e oner
+! SFX W ir e alir
+! SFX W ir e ucir
+! SFX W obar uebe obar
+! SFX W ebir ibe ebir
+! SFX W erbar ierbe erbar
+! SFX W ibir be ohibir
+! SFX W ezar iece ezar
+! SFX W ocer uece cocer
+! SFX W acer ice [fh]acer
+! SFX W ecir ice ecir
+! SFX W enzar ience enzar
+! SFX W onzar ence gonzar
+! SFX W orcer uerce orcer
+! SFX W orzar uerce orzar
+! SFX W izar ce [ae]izar
+! SFX W eder iede eder
+! SFX W odar uede odar
+! SFX W oder uede oder
+! SFX W edir ide edir
+! SFX W oldar uelde [^g]oldar
+! SFX W oldar elde goldar
+! SFX W endar iende endar
+! SFX W ender iende ender
+! SFX W endir inde endir
+! SFX W erder ierde erder
+! SFX W ordar uerde ordar
+! SFX W order uerde order
+! SFX W oder ude oder
+! SFX W egir ige egir
+! SFX W enchir inche enchir
+! SFX W cir je ucir
+! SFX W er je raer
+! SFX W ecir ije ecir
+! SFX W ijar je [ae]hijar
+! SFX W oblar ueble oblar
+! SFX W emblar iemble emblar
+! SFX W elar iele elar
+! SFX W olar uele olar
+! SFX W oler uele oler
+! SFX W ollar uelle [^g]ollar
+! SFX W ollar elle gollar
+! SFX W ilar le [ae]hilar
+! SFX W emir ime emir
+! SFX W ormir uerme ormir
+! SFX W umar me [ae]humar
+! SFX W ener iene ener
+! SFX W enir iene enir
+! SFX W onar uene onar
+! SFX W enir ine enir
+! SFX W ernar ierne ernar
+! SFX W erner ierne erner
+! SFX W ernir ierne ernir
+! SFX W ornar uerne ornar
+! SFX W inar ne [aeo]hinar
+! SFX W unir ne eunir
+! SFX W aber upe aber
+! SFX W r re [^a]ndar
+! SFX W r re [^d]ar
+! SFX W r re [^n]dar
+! SFX W ebrar iebre ebrar
+! SFX W embrar iembre embrar
+! SFX W edrar iedre edrar
+! SFX W endrar iendre endrar
+! SFX W r ere alir
+! SFX W r ere ernir
+! SFX W r ere eunir
+! SFX W r ere ohibir
+! SFX W er iere [^fh]acer
+! SFX W er iere aler
+! SFX W er iere e[cd]er
+! SFX W er iere ender
+! SFX W er iere er[dnt]er
+! SFX W er iere o[clv]er
+! SFX W er iere olver
+! SFX W er iere or[cd]er
+! SFX W erer iere erer
+! SFX W erir iere erir
+! SFX W er iere er
+! SFX W irir iere irir
+! SFX W ebir ibiere ebir
+! SFX W acer iciere [fh]acer
+! SFX W edir idiere edir
+! SFX W endir indiere endir
+! SFX W oder udiere oder
+! SFX W egir igiere egir
+! SFX W enchir inchiere enchir
+! SFX W emir imiere emir
+! SFX W ormir urmiere ormir
+! SFX W enir iniere enir
+! SFX W aber upiere aber
+! SFX W erir iriere erir
+! SFX W irir iriere irir
+! SFX W orir uriere orir
+! SFX W erer isiere erer
+! SFX W oner usiere oner
+! SFX W etir itiere etir
+! SFX W entir intiere entir
+! SFX W ertir irtiere ertir
+! SFX W estir istiere estir
+! SFX W eguir iguiere eguir
+! SFX W ervir irviere ervir
+! SFX W ar uviere andar
+! SFX W ener uviere ener
+! SFX W cir jere ucir
+! SFX W er jere raer
+! SFX W ecir ijere ecir
+! SFX W orar uere [^g]orar
+! SFX W orir uere orir
+! SFX W er yere [eo]er
+! SFX W er yere caer
+! SFX W ir yere [^g]uir
+! SFX W r yere or
+! SFX W ir uyere gir
+! SFX W eir iere eir
+! SFX W orar ere gorar
+! SFX W errar ierre errar
+! SFX W ontrar uentre ontrar
+! SFX W ostrar uestre ostrar
+! SFX W r se [^a]ndar
+! SFX W r se [^d]ar
+! SFX W r se [^n]dar
+! SFX W r ese alir
+! SFX W r ese ernir
+! SFX W r ese eunir
+! SFX W r ese ohibir
+! SFX W er iese [^fh]acer
+! SFX W er iese aler
+! SFX W er iese e[cd]er
+! SFX W er iese ender
+! SFX W er iese er[dnt]er
+! SFX W er iese o[clv]er
+! SFX W er iese olver
+! SFX W er iese or[cd]er
+! SFX W esar iese esar
+! SFX W er iese er
+! SFX W ebir ibiese ebir
+! SFX W acer iciese [fh]acer
+! SFX W edir idiese edir
+! SFX W endir indiese endir
+! SFX W oder udiese oder
+! SFX W egir igiese egir
+! SFX W enchir inchiese enchir
+! SFX W emir imiese emir
+! SFX W ormir urmiese ormir
+! SFX W enir iniese enir
+! SFX W aber upiese aber
+! SFX W erir iriese erir
+! SFX W irir iriese irir
+! SFX W orir uriese orir
+! SFX W erer isiese erer
+! SFX W oner usiese oner
+! SFX W etir itiese etir
+! SFX W entir intiese entir
+! SFX W ertir irtiese ertir
+! SFX W estir istiese estir
+! SFX W eguir iguiese eguir
+! SFX W ervir irviese ervir
+! SFX W ar uviese andar
+! SFX W ener uviese ener
+! SFX W cir jese ucir
+! SFX W er jese raer
+! SFX W ecir ijese ecir
+! SFX W osar uese osar
+! SFX W er yese [eo]er
+! SFX W er yese caer
+! SFX W ir yese [^g]uir
+! SFX W r yese or
+! SFX W ir uyese gir
+! SFX W eir iese eir
+! SFX W erer ise erer
+! SFX W ensar iense ensar
+! SFX W oner use oner
+! SFX W umar se [ae]husar
+! SFX W etar iete etar
+! SFX W etir ite etir
+! SFX W oltar uelte oltar
+! SFX W entar iente entar
+! SFX W entir iente entir
+! SFX W ontar uente ontar
+! SFX W ertar ierte ertar
+! SFX W erter ierte erter
+! SFX W ertir ierte ertir
+! SFX W ortar uerte ortar
+! SFX W r ste [^a]ndar
+! SFX W r ste [^d]ar
+! SFX W r ste [^n]dar
+! SFX W r ste [eo]r
+! SFX W r ste [u]ir
+! SFX W r ste alir
+! SFX W r ste ebir
+! SFX W r ste edir
+! SFX W r ste egir
+! SFX W r ste emir
+! SFX W r ste enchir
+! SFX W r ste endir
+! SFX W r ste entir
+! SFX W r ste erir
+! SFX W r ste ernir
+! SFX W r ste ertir
+! SFX W r ste ervir
+! SFX W r ste estir
+! SFX W r ste etir
+! SFX W r ste eunir
+! SFX W r ste eir
+! SFX W r ste irir
+! SFX W r ste orir
+! SFX W r ste ormir
+! SFX W estar ieste estar
+! SFX W ostar ueste ostar
+! SFX W er iste [^fh]acer
+! SFX W er iste aler
+! SFX W er iste e[cd]er
+! SFX W er iste ender
+! SFX W er iste er[dnt]er
+! SFX W er iste o[clv]er
+! SFX W er iste olver
+! SFX W er iste or[cd]er
+! SFX W estir iste estir
+! SFX W acer iciste [fh]acer
+! SFX W oder udiste oder
+! SFX W cir jiste ucir
+! SFX W er jiste raer
+! SFX W ecir ijiste ecir
+! SFX W enir iniste enir
+! SFX W aber upiste aber
+! SFX W erer isiste erer
+! SFX W oner usiste oner
+! SFX W ar uviste andar
+! SFX W ener uviste ener
+! SFX W er ste [eo]er
+! SFX W er ste caer
+! SFX W itar te [ae]hitar
+! SFX W gar egue ugar
+! SFX W egar iegue egar
+! SFX W ogar uegue ogar
+! SFX W eguir igue eguir
+! SFX W olgar uelgue olgar
+! SFX W engar iengue engar
+! SFX W ocar ueque ocar
+! SFX W olcar uelque olcar
+! SFX W orcar uerque orcar
+! SFX W evar ieve evar
+! SFX W ovar ueve ovar
+! SFX W over ueve over
+! SFX W olver uelve olver
+! SFX W ervir irve ervir
+! SFX W ar uve andar
+! SFX W ener uve ener
+! SFX W r ye or
+! SFX W uir uye [^g]uir
+! SFX W ir uye gir
+! SFX W er e er
+! SFX W iar e iar
+! SFX W oar uee oar
+! SFX W eir ie eir
+! SFX W uar e [^g]uar
+! SFX W uar e guar
+!
+!
+! SFX W Y 195 S
+! SFX W er an [eo]er
+! SFX W r ban ar
+! SFX W obar ueban obar
+! SFX W ebir iban ebir
+! SFX W erbar ierban erbar
+! SFX W ibir ban ohibir
+! SFX W ocar uecan ocar
+! SFX W olcar uelcan olcar
+! SFX W orcar uercan orcar
+! SFX W cer zcan [^c]ocer
+! SFX W cer zcan [^fh]acer
+! SFX W cer zcan ecer
+! SFX W cir zcan ucir
+! SFX W eder iedan eder
+! SFX W odar uedan odar
+! SFX W oder uedan oder
+! SFX W edir idan edir
+! SFX W oldar ueldan [^g]oldar
+! SFX W oldar eldan goldar
+! SFX W endar iendan endar
+! SFX W ender iendan ender
+! SFX W endir indan endir
+! SFX W erder ierdan erder
+! SFX W ordar uerdan ordar
+! SFX W order uerdan order
+! SFX W cer gan [fh]acer
+! SFX W er gan [eo]ner
+! SFX W er gan aler
+! SFX W ir gan alir
+! SFX W gar egan ugar
+! SFX W egar iegan egar
+! SFX W ogar uegan ogar
+! SFX W ecir igan ecir
+! SFX W eguir igan eguir
+! SFX W er igan aer
+! SFX W er igan oer
+! SFX W r igan or
+! SFX W olgar uelgan olgar
+! SFX W enir engan enir
+! SFX W engar iengan engar
+! SFX W enchir inchan enchir
+! SFX W egir ijan egir
+! SFX W ijar jan [ae]hijar
+! SFX W oblar ueblan oblar
+! SFX W emblar iemblan emblar
+! SFX W elar ielan elar
+! SFX W olar uelan olar
+! SFX W oler uelan oler
+! SFX W ollar uellan [^g]ollar
+! SFX W ollar ellan gollar
+! SFX W ilar lan [ae]hilar
+! SFX W emir iman emir
+! SFX W ormir uerman ormir
+! SFX W umar man [ae]humar
+! SFX W onar uenan onar
+! SFX W ernar iernan ernar
+! SFX W erner iernan erner
+! SFX W ernir iernan ernir
+! SFX W ornar uernan ornar
+! SFX W inar nan [aeo]hinar
+! SFX W unir nan eunir
+! SFX W aber epan saber
+! SFX W caber quepan caber
+! SFX W r ran [^a]ndar
+! SFX W r ran [^d]ar
+! SFX W r ran [^n]dar
+! SFX W ebrar iebran ebrar
+! SFX W embrar iembran embrar
+! SFX W edrar iedran edrar
+! SFX W endrar iendran endrar
+! SFX W r eran alir
+! SFX W r eran ernir
+! SFX W r eran eunir
+! SFX W r eran ohibir
+! SFX W er ieran [^fh]acer
+! SFX W er ieran aler
+! SFX W er ieran e[cd]er
+! SFX W er ieran ender
+! SFX W er ieran er[dnt]er
+! SFX W er ieran o[clv]er
+! SFX W er ieran olver
+! SFX W er ieran or[cd]er
+! SFX W erer ieran erer
+! SFX W erir ieran erir
+! SFX W er ieran er
+! SFX W irir ieran irir
+! SFX W ebir ibieran ebir
+! SFX W acer icieran [fh]acer
+! SFX W edir idieran edir
+! SFX W endir indieran endir
+! SFX W oder udieran oder
+! SFX W egir igieran egir
+! SFX W enchir inchieran enchir
+! SFX W emir imieran emir
+! SFX W ormir urmieran ormir
+! SFX W enir inieran enir
+! SFX W aber upieran aber
+! SFX W erir irieran erir
+! SFX W irir irieran irir
+! SFX W orir urieran orir
+! SFX W erer isieran erer
+! SFX W oner usieran oner
+! SFX W etir itieran etir
+! SFX W entir intieran entir
+! SFX W ertir irtieran ertir
+! SFX W estir istieran estir
+! SFX W eguir iguieran eguir
+! SFX W ervir irvieran ervir
+! SFX W ar uvieran andar
+! SFX W ener uvieran ener
+! SFX W cir jeran ucir
+! SFX W er jeran raer
+! SFX W ecir ijeran ecir
+! SFX W orar ueran [^g]orar
+! SFX W orir ueran orir
+! SFX W er yeran [eo]er
+! SFX W er yeran caer
+! SFX W ir yeran [^g]uir
+! SFX W r yeran or
+! SFX W ir uyeran gir
+! SFX W eir ieran eir
+! SFX W orar eran gorar
+! SFX W errar ierran errar
+! SFX W ontrar uentran ontrar
+! SFX W ostrar uestran ostrar
+! SFX W esar iesan esar
+! SFX W osar uesan osar
+! SFX W ensar iensan ensar
+! SFX W usar san [ae]husar
+! SFX W etar ietan etar
+! SFX W etir itan etir
+! SFX W oltar ueltan oltar
+! SFX W entar ientan entar
+! SFX W entir ientan entir
+! SFX W ontar uentan ontar
+! SFX W ertar iertan ertar
+! SFX W erter iertan erter
+! SFX W ertir iertan ertir
+! SFX W ortar uertan ortar
+! SFX W estar iestan estar
+! SFX W ostar uestan ostar
+! SFX W estir istan estir
+! SFX W itar tan [ae]hitar
+! SFX W evar ievan evar
+! SFX W ovar uevan ovar
+! SFX W over uevan over
+! SFX W olver uelvan olver
+! SFX W ervir irvan ervir
+! SFX W er yan oer
+! SFX W ir yan [^g]uir
+! SFX W ir uyan gir
+! SFX W ezar iezan ezar
+! SFX W ocer uezan cocer
+! SFX W enzar ienzan enzar
+! SFX W onzar enzan gonzar
+! SFX W orcer uerzan orcer
+! SFX W orzar uerzan orzar
+! SFX W izar zan [ae]izar
+! SFX W 0 an [^fh]acer
+! SFX W 0 an [aeo]er
+! SFX W 0 an [io]rir
+! SFX W 0 an [u]ir
+! SFX W 0 an ar
+! SFX W 0 an e[bdgmrt]ir
+! SFX W 0 an e[cd]er
+! SFX W 0 an e[ns]tir
+! SFX W 0 an enchir
+! SFX W 0 an ender
+! SFX W 0 an endir
+! SFX W 0 an er[dnt]er
+! SFX W 0 an er[ntv]ir
+! SFX W 0 an eunir
+! SFX W 0 an o[clv]er
+! SFX W 0 an olver
+! SFX W 0 an or[cd]er
+! SFX W 0 an ormir
+! SFX W 0 an ucir
+! SFX W er an er
+! SFX W er an er
+! SFX W iar an iar
+! SFX W ir an ir
+! SFX W r an r
+! SFX W cer ran [fh]acer
+! SFX W er ran aber
+! SFX W er ran erer
+! SFX W er ran oder
+! SFX W er dran [eo]ner
+! SFX W er dran aler
+! SFX W ir dran alir
+! SFX W ir dran enir
+! SFX W ecir iran ecir
+! SFX W r iran [eo]r
+! SFX W oar uean oar
+! SFX W eir ian eir
+! SFX W uar an [^g]uar
+!
+!
+! SFX W Y 202 S
+! SFX W ar en andar
+! SFX W ir en alir
+! SFX W ir en ucir
+! SFX W obar ueben obar
+! SFX W ebir iben ebir
+! SFX W erbar ierben erbar
+! SFX W ibir ben ohibir
+! SFX W ezar iecen ezar
+! SFX W ocer uecen cocer
+! SFX W ecir icen ecir
+! SFX W enzar iencen enzar
+! SFX W onzar encen gonzar
+! SFX W orcer uercen orcer
+! SFX W orzar uercen orzar
+! SFX W izar cen [ae]izar
+! SFX W eder ieden eder
+! SFX W odar ueden odar
+! SFX W oder ueden oder
+! SFX W edir iden edir
+! SFX W oldar uelden [^g]oldar
+! SFX W oldar elden goldar
+! SFX W endar ienden endar
+! SFX W ender ienden ender
+! SFX W endir inden endir
+! SFX W erder ierden erder
+! SFX W ordar uerden ordar
+! SFX W order uerden order
+! SFX W egir igen egir
+! SFX W enchir inchen enchir
+! SFX W ijar jen [ae]hijar
+! SFX W oblar ueblen oblar
+! SFX W emblar iemblen emblar
+! SFX W elar ielen elar
+! SFX W olar uelen olar
+! SFX W oler uelen oler
+! SFX W ollar uellen [^g]ollar
+! SFX W ollar ellen gollar
+! SFX W ilar len [ae]hilar
+! SFX W emir imen emir
+! SFX W ormir uermen ormir
+! SFX W umar men [ae]humar
+! SFX W ener ienen ener
+! SFX W enir ienen enir
+! SFX W onar uenen onar
+! SFX W ernar iernen ernar
+! SFX W erner iernen erner
+! SFX W ernir iernen ernir
+! SFX W ornar uernen ornar
+! SFX W inar nen [aeo]hinar
+! SFX W unir nen eunir
+! SFX W r ren [^a]ndar
+! SFX W r ren [^d]ar
+! SFX W r ren [^n]dar
+! SFX W ebrar iebren ebrar
+! SFX W embrar iembren embrar
+! SFX W edrar iedren edrar
+! SFX W endrar iendren endrar
+! SFX W r eren alir
+! SFX W r eren ernir
+! SFX W r eren eunir
+! SFX W r eren ohibir
+! SFX W er ieren [^fh]acer
+! SFX W er ieren aler
+! SFX W er ieren e[cd]er
+! SFX W er ieren ender
+! SFX W er ieren er[dnt]er
+! SFX W er ieren o[clv]er
+! SFX W er ieren olver
+! SFX W er ieren or[cd]er
+! SFX W erer ieren erer
+! SFX W erir ieren erir
+! SFX W er ieren er
+! SFX W irir ieren irir
+! SFX W ebir ibieren ebir
+! SFX W acer icieren [fh]acer
+! SFX W edir idieren edir
+! SFX W endir indieren endir
+! SFX W oder udieren oder
+! SFX W egir igieren egir
+! SFX W enchir inchieren enchir
+! SFX W emir imieren emir
+! SFX W ormir urmieren ormir
+! SFX W enir inieren enir
+! SFX W aber upieren aber
+! SFX W erir irieren erir
+! SFX W irir irieren irir
+! SFX W orir urieren orir
+! SFX W erer isieren erer
+! SFX W oner usieren oner
+! SFX W etir itieren etir
+! SFX W entir intieren entir
+! SFX W ertir irtieren ertir
+! SFX W estir istieren estir
+! SFX W eguir iguieren eguir
+! SFX W ervir irvieren ervir
+! SFX W ar uvieren andar
+! SFX W ener uvieren ener
+! SFX W cir jeren ucir
+! SFX W er jeren raer
+! SFX W ecir ijeren ecir
+! SFX W orar ueren [^g]orar
+! SFX W orir ueren orir
+! SFX W er yeren [eo]er
+! SFX W er yeren caer
+! SFX W ir yeren [^g]uir
+! SFX W r yeren or
+! SFX W ir uyeren gir
+! SFX W eir ieren eir
+! SFX W orar eren gorar
+! SFX W errar ierren errar
+! SFX W ontrar uentren ontrar
+! SFX W ostrar uestren ostrar
+! SFX W r sen [^a]ndar
+! SFX W r sen [^d]ar
+! SFX W r sen [^n]dar
+! SFX W r esen alir
+! SFX W r esen ernir
+! SFX W r esen eunir
+! SFX W r esen ohibir
+! SFX W er iesen [^fh]acer
+! SFX W er iesen aler
+! SFX W er iesen e[cd]er
+! SFX W er iesen ender
+! SFX W er iesen er[dnt]er
+! SFX W er iesen o[clv]er
+! SFX W er iesen olver
+! SFX W er iesen or[cd]er
+! SFX W esar iesen esar
+! SFX W er iesen er
+! SFX W ebir ibiesen ebir
+! SFX W acer iciesen [fh]acer
+! SFX W edir idiesen edir
+! SFX W endir indiesen endir
+! SFX W oder udiesen oder
+! SFX W egir igiesen egir
+! SFX W enchir inchiesen enchir
+! SFX W emir imiesen emir
+! SFX W ormir urmiesen ormir
+! SFX W enir iniesen enir
+! SFX W aber upiesen aber
+! SFX W erir iriesen erir
+! SFX W irir iriesen irir
+! SFX W orir uriesen orir
+! SFX W erer isiesen erer
+! SFX W oner usiesen oner
+! SFX W etir itiesen etir
+! SFX W entir intiesen entir
+! SFX W ertir irtiesen ertir
+! SFX W estir istiesen estir
+! SFX W eguir iguiesen eguir
+! SFX W ervir irviesen ervir
+! SFX W ar uviesen andar
+! SFX W ener uviesen ener
+! SFX W cir jesen ucir
+! SFX W er jesen raer
+! SFX W ecir ijesen ecir
+! SFX W osar uesen osar
+! SFX W er yesen [eo]er
+! SFX W er yesen caer
+! SFX W ir yesen [^g]uir
+! SFX W r yesen or
+! SFX W ir uyesen gir
+! SFX W eir iesen eir
+! SFX W ensar iensen ensar
+! SFX W usar sen [ae]husar
+! SFX W etar ieten etar
+! SFX W etir iten etir
+! SFX W oltar uelten oltar
+! SFX W entar ienten entar
+! SFX W entir ienten entir
+! SFX W ontar uenten ontar
+! SFX W ertar ierten ertar
+! SFX W erter ierten erter
+! SFX W ertir ierten ertir
+! SFX W ortar uerten ortar
+! SFX W estar iesten estar
+! SFX W ostar uesten ostar
+! SFX W estir isten estir
+! SFX W itar ten [ae]hitar
+! SFX W gar eguen ugar
+! SFX W egar ieguen egar
+! SFX W ogar ueguen ogar
+! SFX W eguir iguen eguir
+! SFX W olgar uelguen olgar
+! SFX W engar ienguen engar
+! SFX W ocar uequen ocar
+! SFX W olcar uelquen olcar
+! SFX W orcar uerquen orcar
+! SFX W evar ieven evar
+! SFX W ovar ueven ovar
+! SFX W over ueven over
+! SFX W olver uelven olver
+! SFX W ervir irven ervir
+! SFX W ir yen [^g]uir
+! SFX W r yen or
+! SFX W ir uyen gir
+! SFX W er en er
+! SFX W iar en iar
+! SFX W oar ueen oar
+! SFX W eir ien eir
+! SFX W uar en [^g]uar
+! SFX W uar en guar
+!
+!
+! SFX W Y 49 S
+! SFX W 0 on [^a]ndar
+! SFX W 0 on [^d]ar
+! SFX W 0 on [^n]dar
+! SFX W r eron alir
+! SFX W r eron ernir
+! SFX W r eron eunir
+! SFX W r eron irir
+! SFX W r eron ohibir
+! SFX W er ieron [^fh]acer
+! SFX W er ieron aler
+! SFX W er ieron e[cd]er
+! SFX W er ieron ender
+! SFX W er ieron er[dnt]er
+! SFX W er ieron o[clv]er
+! SFX W er ieron olver
+! SFX W er ieron or[cd]er
+! SFX W er ieron er
+! SFX W ebir ibieron ebir
+! SFX W acer icieron [fh]acer
+! SFX W edir idieron edir
+! SFX W endir indieron endir
+! SFX W oder udieron oder
+! SFX W egir igieron egir
+! SFX W enchir inchieron enchir
+! SFX W emir imieron emir
+! SFX W ormir urmieron ormir
+! SFX W enir inieron enir
+! SFX W aber upieron aber
+! SFX W erir irieron erir
+! SFX W orir urieron orir
+! SFX W erer isieron erer
+! SFX W oner usieron oner
+! SFX W etir itieron etir
+! SFX W entir intieron entir
+! SFX W ertir irtieron ertir
+! SFX W estir istieron estir
+! SFX W eguir iguieron eguir
+! SFX W ervir irvieron ervir
+! SFX W ar uvieron andar
+! SFX W ener uvieron ener
+! SFX W cir jeron ucir
+! SFX W er jeron raer
+! SFX W ecir ijeron ecir
+! SFX W er yeron [eo]er
+! SFX W er yeron caer
+! SFX W ir yeron [^g]uir
+! SFX W r yeron or
+! SFX W ir uyeron gir
+! SFX W eir ieron eir
+!
+!
+! SFX W Y 29 S
+! SFX W 0 n [^fh]acer
+! SFX W 0 n [aeo]er
+! SFX W 0 n [io]rir
+! SFX W 0 n [u]ir
+! SFX W 0 n ar
+! SFX W 0 n e[bdgmrt]ir
+! SFX W 0 n e[cd]er
+! SFX W 0 n e[ns]tir
+! SFX W 0 n enchir
+! SFX W 0 n ender
+! SFX W 0 n endir
+! SFX W 0 n er[dnt]er
+! SFX W 0 n er[ntv]ir
+! SFX W 0 n eunir
+! SFX W 0 n o[clv]er
+! SFX W 0 n olver
+! SFX W 0 n or[cd]er
+! SFX W 0 n ormir
+! SFX W 0 n ucir
+! SFX W cer rn [fh]acer
+! SFX W er rn aber
+! SFX W er rn erer
+! SFX W er rn oder
+! SFX W er drn [eo]ner
+! SFX W er drn aler
+! SFX W ir drn alir
+! SFX W ir drn enir
+! SFX W ecir irn ecir
+! SFX W r irn [eo]r
+!
+!
+! SFX W Y 126 S
+! SFX W ar o andar
+! SFX W ar o guar
+! SFX W er o [eo]er
+! SFX W obar uebo obar
+! SFX W ebir ibo ebir
+! SFX W erbar ierbo erbar
+! SFX W ibir bo ohibir
+! SFX W ocar ueco ocar
+! SFX W olcar uelco olcar
+! SFX W orcar uerco orcar
+! SFX W cer zco [^c]ocer
+! SFX W cer zco [^fh]acer
+! SFX W cer zco ecer
+! SFX W ucir uzco ucir
+! SFX W eder iedo eder
+! SFX W odar uedo odar
+! SFX W oder uedo oder
+! SFX W edir ido edir
+! SFX W oldar ueldo [^g]oldar
+! SFX W oldar eldo goldar
+! SFX W endar iendo endar
+! SFX W ender iendo ender
+! SFX W endir indo endir
+! SFX W erder ierdo erder
+! SFX W ordar uerdo ordar
+! SFX W order uerdo order
+! SFX W oder udo oder
+! SFX W cer go [fh]acer
+! SFX W er go aler
+! SFX W er go ener
+! SFX W er go oner
+! SFX W ir go alir
+! SFX W ir go enir
+! SFX W gar ego ugar
+! SFX W egar iego egar
+! SFX W ogar uego ogar
+! SFX W ecir igo ecir
+! SFX W eguir igo eguir
+! SFX W er igo [cr]aer
+! SFX W er igo oer
+! SFX W r igo or
+! SFX W olgar uelgo olgar
+! SFX W engar iengo engar
+! SFX W enchir incho enchir
+! SFX W cir jo ucir
+! SFX W er jo raer
+! SFX W ecir ijo ecir
+! SFX W egir ijo egir
+! SFX W ijar jo [ae]hijar
+! SFX W oblar ueblo oblar
+! SFX W emblar iemblo emblar
+! SFX W elar ielo elar
+! SFX W olar uelo olar
+! SFX W oler uelo oler
+! SFX W ollar uello [^g]ollar
+! SFX W ollar ello gollar
+! SFX W ilar lo [ae]hilar
+! SFX W emir imo emir
+! SFX W ormir uermo ormir
+! SFX W umar mo [ae]humar
+! SFX W onar ueno onar
+! SFX W enir ino enir
+! SFX W ernar ierno ernar
+! SFX W erner ierno erner
+! SFX W ernir ierno ernir
+! SFX W ornar uerno ornar
+! SFX W inar no [aeo]hinar
+! SFX W unir no eunir
+! SFX W caber quepo caber
+! SFX W aber upo aber
+! SFX W ebrar iebro ebrar
+! SFX W embrar iembro embrar
+! SFX W edrar iedro edrar
+! SFX W endrar iendro endrar
+! SFX W erer iero erer
+! SFX W erir iero erir
+! SFX W irir iero irir
+! SFX W orar uero [^g]orar
+! SFX W orir uero orir
+! SFX W orar ero gorar
+! SFX W errar ierro errar
+! SFX W ontrar uentro ontrar
+! SFX W ostrar uestro ostrar
+! SFX W esar ieso esar
+! SFX W osar ueso osar
+! SFX W erer iso erer
+! SFX W ensar ienso ensar
+! SFX W oner uso oner
+! SFX W usar so [ae]husar
+! SFX W etar ieto etar
+! SFX W etir ito etir
+! SFX W oltar uelto oltar
+! SFX W entar iento entar
+! SFX W entir iento entir
+! SFX W ontar uento ontar
+! SFX W ertar ierto ertar
+! SFX W erter ierto erter
+! SFX W ertir ierto ertir
+! SFX W ortar uerto ortar
+! SFX W estar iesto estar
+! SFX W ostar uesto ostar
+! SFX W estir isto estir
+! SFX W itar to [ae]hitar
+! SFX W evar ievo evar
+! SFX W ovar uevo ovar
+! SFX W over uevo over
+! SFX W olver uelvo olver
+! SFX W ervir irvo ervir
+! SFX W ar uvo andar
+! SFX W ener uvo ener
+! SFX W er yo oer
+! SFX W uir uyo [^g]uir
+! SFX W ir uyo gir
+! SFX W ezar iezo ezar
+! SFX W ocer uezo cocer
+! SFX W acer izo [fh]acer
+! SFX W enzar ienzo enzar
+! SFX W onzar enzo gonzar
+! SFX W orcer uerzo orcer
+! SFX W orzar uerzo orzar
+! SFX W izar zo [ae]izar
+! SFX W er o er
+! SFX W iar o iar
+! SFX W oar ueo oar
+! SFX W eir io eir
+! SFX W uar o [^g]uar
+!
+!
+!
+! SFX W Y 195 S
+! SFX W er as [eo]er
+! SFX W r bas ar
+! SFX W obar uebas obar
+! SFX W ebir ibas ebir
+! SFX W erbar ierbas erbar
+! SFX W ibir bas ohibir
+! SFX W ocar uecas ocar
+! SFX W olcar uelcas olcar
+! SFX W orcar uercas orcar
+! SFX W cer zcas [^c]ocer
+! SFX W cer zcas [^fh]acer
+! SFX W cer zcas ecer
+! SFX W cir zcas ucir
+! SFX W eder iedas eder
+! SFX W odar uedas odar
+! SFX W oder uedas oder
+! SFX W edir idas edir
+! SFX W oldar ueldas [^g]oldar
+! SFX W oldar eldas goldar
+! SFX W endar iendas endar
+! SFX W ender iendas ender
+! SFX W endir indas endir
+! SFX W erder ierdas erder
+! SFX W ordar uerdas ordar
+! SFX W order uerdas order
+! SFX W cer gas [fh]acer
+! SFX W er gas [eo]ner
+! SFX W er gas aler
+! SFX W ir gas alir
+! SFX W gar egas ugar
+! SFX W egar iegas egar
+! SFX W ogar uegas ogar
+! SFX W ecir igas ecir
+! SFX W eguir igas eguir
+! SFX W er igas aer
+! SFX W er igas oer
+! SFX W r igas or
+! SFX W olgar uelgas olgar
+! SFX W enir engas enir
+! SFX W engar iengas engar
+! SFX W enchir inchas enchir
+! SFX W egir ijas egir
+! SFX W ijar jas [ae]hijar
+! SFX W oblar ueblas oblar
+! SFX W emblar iemblas emblar
+! SFX W elar ielas elar
+! SFX W olar uelas olar
+! SFX W oler uelas oler
+! SFX W ollar uellas [^g]ollar
+! SFX W ollar ellas gollar
+! SFX W ilar las [ae]hilar
+! SFX W emir imas emir
+! SFX W ormir uermas ormir
+! SFX W umar mas [ae]humar
+! SFX W onar uenas onar
+! SFX W ernar iernas ernar
+! SFX W erner iernas erner
+! SFX W ernir iernas ernir
+! SFX W ornar uernas ornar
+! SFX W inar nas [aeo]hinar
+! SFX W unir nas eunir
+! SFX W aber epas saber
+! SFX W caber quepas caber
+! SFX W r ras [^a]ndar
+! SFX W r ras [^d]ar
+! SFX W r ras [^n]dar
+! SFX W ebrar iebras ebrar
+! SFX W embrar iembras embrar
+! SFX W edrar iedras edrar
+! SFX W endrar iendras endrar
+! SFX W r eras alir
+! SFX W r eras ernir
+! SFX W r eras eunir
+! SFX W r eras ohibir
+! SFX W er ieras [^fh]acer
+! SFX W er ieras aler
+! SFX W er ieras e[cd]er
+! SFX W er ieras ender
+! SFX W er ieras er[dnt]er
+! SFX W er ieras o[clv]er
+! SFX W er ieras olver
+! SFX W er ieras or[cd]er
+! SFX W erer ieras erer
+! SFX W erir ieras erir
+! SFX W er ieras er
+! SFX W irir ieras irir
+! SFX W ebir ibieras ebir
+! SFX W acer icieras [fh]acer
+! SFX W edir idieras edir
+! SFX W endir indieras endir
+! SFX W oder udieras oder
+! SFX W egir igieras egir
+! SFX W enchir inchieras enchir
+! SFX W emir imieras emir
+! SFX W ormir urmieras ormir
+! SFX W enir inieras enir
+! SFX W aber upieras aber
+! SFX W erir irieras erir
+! SFX W irir irieras irir
+! SFX W orir urieras orir
+! SFX W erer isieras erer
+! SFX W oner usieras oner
+! SFX W etir itieras etir
+! SFX W entir intieras entir
+! SFX W ertir irtieras ertir
+! SFX W estir istieras estir
+! SFX W eguir iguieras eguir
+! SFX W ervir irvieras ervir
+! SFX W ar uvieras andar
+! SFX W ener uvieras ener
+! SFX W cir jeras ucir
+! SFX W er jeras raer
+! SFX W ecir ijeras ecir
+! SFX W orar ueras [^g]orar
+! SFX W orir ueras orir
+! SFX W er yeras [eo]er
+! SFX W er yeras caer
+! SFX W ir yeras [^g]uir
+! SFX W r yeras or
+! SFX W ir uyeras gir
+! SFX W eir ieras eir
+! SFX W orar eras gorar
+! SFX W errar ierras errar
+! SFX W ontrar uentras ontrar
+! SFX W ostrar uestras ostrar
+! SFX W esar iesas esar
+! SFX W osar uesas osar
+! SFX W ensar iensas ensar
+! SFX W usar sas [ae]husar
+! SFX W etar ietas etar
+! SFX W etir itas etir
+! SFX W oltar ueltas oltar
+! SFX W entar ientas entar
+! SFX W entir ientas entir
+! SFX W ontar uentas ontar
+! SFX W ertar iertas ertar
+! SFX W erter iertas erter
+! SFX W ertir iertas ertir
+! SFX W ortar uertas ortar
+! SFX W estar iestas estar
+! SFX W ostar uestas ostar
+! SFX W estir istas estir
+! SFX W itar tas [ae]hitar
+! SFX W evar ievas evar
+! SFX W ovar uevas ovar
+! SFX W over uevas over
+! SFX W olver uelvas olver
+! SFX W ervir irvas ervir
+! SFX W er yas oer
+! SFX W ir yas [^g]uir
+! SFX W ir uyas gir
+! SFX W ezar iezas ezar
+! SFX W ocer uezas cocer
+! SFX W enzar ienzas enzar
+! SFX W onzar enzas gonzar
+! SFX W orcer uerzas orcer
+! SFX W orzar uerzas orzar
+! SFX W izar zas [ae]izar
+! SFX W 0 as [^fh]acer
+! SFX W 0 as [aeo]er
+! SFX W 0 as [io]rir
+! SFX W 0 as [u]ir
+! SFX W 0 as ar
+! SFX W 0 as e[bdgmrt]ir
+! SFX W 0 as e[cd]er
+! SFX W 0 as e[ns]tir
+! SFX W 0 as enchir
+! SFX W 0 as ender
+! SFX W 0 as endir
+! SFX W 0 as er[dnt]er
+! SFX W 0 as er[ntv]ir
+! SFX W 0 as eunir
+! SFX W 0 as o[clv]er
+! SFX W 0 as olver
+! SFX W 0 as or[cd]er
+! SFX W 0 as ormir
+! SFX W 0 as ucir
+! SFX W er as er
+! SFX W er as er
+! SFX W iar as iar
+! SFX W ir as ir
+! SFX W r as r
+! SFX W cer ras [fh]acer
+! SFX W er ras aber
+! SFX W er ras erer
+! SFX W er ras oder
+! SFX W er dras [eo]ner
+! SFX W er dras aler
+! SFX W ir dras alir
+! SFX W ir dras enir
+! SFX W ecir iras ecir
+! SFX W r iras [eo]r
+! SFX W oar ueas oar
+! SFX W eir ias eir
+! SFX W uar as [^g]uar
+!
+!
+!
+! SFX W Y 202 S
+! SFX W ar es andar
+! SFX W ir es ucir
+! SFX W r es alir
+! SFX W obar uebes obar
+! SFX W ebir ibes ebir
+! SFX W erbar ierbes erbar
+! SFX W ibir bes ohibir
+! SFX W ezar ieces ezar
+! SFX W ocer ueces cocer
+! SFX W ecir ices ecir
+! SFX W enzar iences enzar
+! SFX W onzar ences gonzar
+! SFX W orcer uerces orcer
+! SFX W orzar uerces orzar
+! SFX W izar ces [ae]izar
+! SFX W eder iedes eder
+! SFX W odar uedes odar
+! SFX W oder uedes oder
+! SFX W edir ides edir
+! SFX W oldar ueldes [^g]oldar
+! SFX W oldar eldes goldar
+! SFX W endar iendes endar
+! SFX W ender iendes ender
+! SFX W endir indes endir
+! SFX W erder ierdes erder
+! SFX W ordar uerdes ordar
+! SFX W order uerdes order
+! SFX W egir iges egir
+! SFX W enchir inches enchir
+! SFX W ijar jes [ae]hijar
+! SFX W oblar uebles oblar
+! SFX W emblar iembles emblar
+! SFX W elar ieles elar
+! SFX W olar ueles olar
+! SFX W oler ueles oler
+! SFX W ollar uelles [^g]ollar
+! SFX W ollar elles gollar
+! SFX W ilar les [ae]hilar
+! SFX W emir imes emir
+! SFX W ormir uermes ormir
+! SFX W umar mes [ae]humar
+! SFX W ener ienes ener
+! SFX W enir ienes enir
+! SFX W onar uenes onar
+! SFX W ernar iernes ernar
+! SFX W erner iernes erner
+! SFX W ernir iernes ernir
+! SFX W ornar uernes ornar
+! SFX W inar nes [aeo]hinar
+! SFX W unir nes eunir
+! SFX W r res [^a]ndar
+! SFX W r res [^d]ar
+! SFX W r res [^n]dar
+! SFX W ebrar iebres ebrar
+! SFX W embrar iembres embrar
+! SFX W edrar iedres edrar
+! SFX W endrar iendres endrar
+! SFX W r eres alir
+! SFX W r eres ernir
+! SFX W r eres eunir
+! SFX W r eres ohibir
+! SFX W er ieres [^fh]acer
+! SFX W er ieres aler
+! SFX W er ieres e[cd]er
+! SFX W er ieres ender
+! SFX W er ieres er[dnt]er
+! SFX W er ieres o[clv]er
+! SFX W er ieres olver
+! SFX W er ieres or[cd]er
+! SFX W erer ieres erer
+! SFX W erir ieres erir
+! SFX W er ieres er
+! SFX W irir ieres irir
+! SFX W ebir ibieres ebir
+! SFX W acer icieres [fh]acer
+! SFX W edir idieres edir
+! SFX W endir indieres endir
+! SFX W oder udieres oder
+! SFX W egir igieres egir
+! SFX W enchir inchieres enchir
+! SFX W emir imieres emir
+! SFX W ormir urmieres ormir
+! SFX W enir inieres enir
+! SFX W aber upieres aber
+! SFX W erir irieres erir
+! SFX W irir irieres irir
+! SFX W orir urieres orir
+! SFX W erer isieres erer
+! SFX W oner usieres oner
+! SFX W etir itieres etir
+! SFX W entir intieres entir
+! SFX W ertir irtieres ertir
+! SFX W estir istieres estir
+! SFX W eguir iguieres eguir
+! SFX W ervir irvieres ervir
+! SFX W ar uvieres andar
+! SFX W ener uvieres ener
+! SFX W cir jeres ucir
+! SFX W er jeres raer
+! SFX W ecir ijeres ecir
+! SFX W orar ueres [^g]orar
+! SFX W orir ueres orir
+! SFX W er yeres [eo]er
+! SFX W er yeres caer
+! SFX W ir yeres [^g]uir
+! SFX W r yeres or
+! SFX W ir uyeres gir
+! SFX W eir ieres eir
+! SFX W orar eres gorar
+! SFX W errar ierres errar
+! SFX W ontrar uentres ontrar
+! SFX W ostrar uestres ostrar
+! SFX W r ses [^a]ndar
+! SFX W r ses [^d]ar
+! SFX W r ses [^n]dar
+! SFX W r eses alir
+! SFX W r eses ernir
+! SFX W r eses eunir
+! SFX W r eses ohibir
+! SFX W er ieses [^fh]acer
+! SFX W er ieses aler
+! SFX W er ieses e[cd]er
+! SFX W er ieses ender
+! SFX W er ieses er[dnt]er
+! SFX W er ieses o[clv]er
+! SFX W er ieses olver
+! SFX W er ieses or[cd]er
+! SFX W esar ieses esar
+! SFX W er ieses er
+! SFX W ebir ibieses ebir
+! SFX W acer icieses [fh]acer
+! SFX W edir idieses edir
+! SFX W endir indieses endir
+! SFX W oder udieses oder
+! SFX W egir igieses egir
+! SFX W enchir inchieses enchir
+! SFX W emir imieses emir
+! SFX W ormir urmieses ormir
+! SFX W enir inieses enir
+! SFX W aber upieses aber
+! SFX W erir irieses erir
+! SFX W irir irieses irir
+! SFX W orir urieses orir
+! SFX W erer isieses erer
+! SFX W oner usieses oner
+! SFX W etir itieses etir
+! SFX W entir intieses entir
+! SFX W ertir irtieses ertir
+! SFX W estir istieses estir
+! SFX W eguir iguieses eguir
+! SFX W ervir irvieses ervir
+! SFX W ar uvieses andar
+! SFX W ener uvieses ener
+! SFX W cir jeses ucir
+! SFX W er jeses raer
+! SFX W ecir ijeses ecir
+! SFX W osar ueses osar
+! SFX W er yeses [eo]er
+! SFX W er yeses caer
+! SFX W ir yeses [^g]uir
+! SFX W r yeses or
+! SFX W ir uyeses gir
+! SFX W eir ieses eir
+! SFX W ensar ienses ensar
+! SFX W usar ses [ae]husar
+! SFX W etar ietes etar
+! SFX W etir ites etir
+! SFX W oltar ueltes oltar
+! SFX W entar ientes entar
+! SFX W entir ientes entir
+! SFX W ontar uentes ontar
+! SFX W ertar iertes ertar
+! SFX W erter iertes erter
+! SFX W ertir iertes ertir
+! SFX W ortar uertes ortar
+! SFX W estar iestes estar
+! SFX W ostar uestes ostar
+! SFX W estir istes estir
+! SFX W itar tes [ae]hitar
+! SFX W gar egues ugar
+! SFX W egar iegues egar
+! SFX W ogar uegues ogar
+! SFX W eguir igues eguir
+! SFX W olgar uelgues olgar
+! SFX W engar iengues engar
+! SFX W ocar ueques ocar
+! SFX W olcar uelques olcar
+! SFX W orcar uerques orcar
+! SFX W evar ieves evar
+! SFX W ovar ueves ovar
+! SFX W over ueves over
+! SFX W olver uelves olver
+! SFX W ervir irves ervir
+! SFX W r yes or
+! SFX W uir uyes [^g]uir
+! SFX W ir uyes gir
+! SFX W er es er
+! SFX W iar es iar
+! SFX W oar uees oar
+! SFX W eir ies eir
+! SFX W uar es [^g]uar
+! SFX W uar es guar
+!
+!
+! SFX W Y 49 S
+! SFX W r rais [^a]ndar
+! SFX W r rais [^d]ar
+! SFX W r rais [^n]dar
+! SFX W r erais alir
+! SFX W r erais ernir
+! SFX W r erais eunir
+! SFX W r erais ohibir
+! SFX W er ierais [^fh]acer
+! SFX W er ierais aler
+! SFX W er ierais e[cd]er
+! SFX W er ierais ender
+! SFX W er ierais er[dnt]er
+! SFX W er ierais o[clv]er
+! SFX W er ierais olver
+! SFX W er ierais or[cd]er
+! SFX W er ierais er
+! SFX W ebir ibierais ebir
+! SFX W acer icierais [fh]acer
+! SFX W edir idierais edir
+! SFX W endir indierais endir
+! SFX W oder udierais oder
+! SFX W egir igierais egir
+! SFX W enchir inchierais enchir
+! SFX W emir imierais emir
+! SFX W ormir urmierais ormir
+! SFX W enir inierais enir
+! SFX W aber upierais aber
+! SFX W erir irierais erir
+! SFX W irir irierais irir
+! SFX W orir urierais orir
+! SFX W erer isierais erer
+! SFX W oner usierais oner
+! SFX W etir itierais etir
+! SFX W entir intierais entir
+! SFX W ertir irtierais ertir
+! SFX W estir istierais estir
+! SFX W eguir iguierais eguir
+! SFX W ervir irvierais ervir
+! SFX W ar uvierais andar
+! SFX W ener uvierais ener
+! SFX W cir jerais ucir
+! SFX W er jerais raer
+! SFX W ecir ijerais ecir
+! SFX W er yerais [eo]er
+! SFX W er yerais caer
+! SFX W ir yerais [^g]uir
+! SFX W r yerais or
+! SFX W ir uyerais gir
+! SFX W eir ierais eir
+!
+!
+!
+! SFX W Y 32 S
+! SFX W 0 ais [^fh]acer
+! SFX W 0 ais [aeo]er
+! SFX W 0 ais [io]rir
+! SFX W 0 ais [u]ir
+! SFX W 0 ais ar
+! SFX W 0 ais e[bdgmrt]ir
+! SFX W 0 ais e[cd]er
+! SFX W 0 ais e[ns]tir
+! SFX W 0 ais enchir
+! SFX W 0 ais ender
+! SFX W 0 ais endir
+! SFX W 0 ais er[dnt]er
+! SFX W 0 ais er[ntv]ir
+! SFX W 0 ais eunir
+! SFX W 0 ais o[clv]er
+! SFX W 0 ais olver
+! SFX W 0 ais or[cd]er
+! SFX W 0 ais ormir
+! SFX W 0 ais ucir
+! SFX W er ais er
+! SFX W ir ais ir
+! SFX W r ais r
+! SFX W cer rais [fh]acer
+! SFX W er rais aber
+! SFX W er rais erer
+! SFX W er rais oder
+! SFX W er drais [eo]ner
+! SFX W er drais aler
+! SFX W ir drais alir
+! SFX W ir drais enir
+! SFX W ecir irais ecir
+! SFX W r irais [eo]r
+!
+!
+!
+! SFX W Y 48 S
+! SFX W r reis [^a]ndar
+! SFX W r reis [^d]ar
+! SFX W r reis [^n]dar
+! SFX W r ereis alir
+! SFX W r ereis ernir
+! SFX W r ereis ohibir
+! SFX W er iereis [^fh]acer
+! SFX W er iereis aler
+! SFX W er iereis e[cd]er
+! SFX W er iereis ender
+! SFX W er iereis er[dnt]er
+! SFX W er iereis o[clv]er
+! SFX W er iereis olver
+! SFX W er iereis or[cd]er
+! SFX W er iereis er
+! SFX W ebir ibiereis ebir
+! SFX W acer iciereis [fh]acer
+! SFX W edir idiereis edir
+! SFX W endir indiereis endir
+! SFX W oder udiereis oder
+! SFX W egir igiereis egir
+! SFX W enchir inchiereis enchir
+! SFX W emir imiereis emir
+! SFX W ormir urmiereis ormir
+! SFX W enir iniereis enir
+! SFX W aber upiereis aber
+! SFX W erir iriereis erir
+! SFX W irir iriereis irir
+! SFX W orir uriereis orir
+! SFX W oner usiereis oner
+! SFX W etir itiereis etir
+! SFX W entir intiereis entir
+! SFX W ertir irtiereis ertir
+! SFX W estir istiereis estir
+! SFX W eguir iguiereis eguir
+! SFX W ervir irviereis ervir
+! SFX W ar uviereis andar
+! SFX W ener uviereis ener
+! SFX W cir jereis ucir
+! SFX W er jereis raer
+! SFX W ecir ijereis ecir
+! SFX W er yereis [eo]er
+! SFX W er yereis caer
+! SFX W ir yereis [^g]uir
+! SFX W r yereis or
+! SFX W ir uyereis gir
+! SFX W eir iereis eir
+! SFX W erer isireis erer
+!
+!
+!
+! SFX W Y 49 S
+! SFX W r seis [^a]ndar
+! SFX W r seis [^d]ar
+! SFX W r seis [^n]dar
+! SFX W r eseis alir
+! SFX W r eseis ernir
+! SFX W r eseis eunir
+! SFX W r eseis ohibir
+! SFX W er ieseis [^fh]acer
+! SFX W er ieseis aler
+! SFX W er ieseis e[cd]er
+! SFX W er ieseis ender
+! SFX W er ieseis er[dnt]er
+! SFX W er ieseis o[clv]er
+! SFX W er ieseis olver
+! SFX W er ieseis or[cd]er
+! SFX W er ieseis er
+! SFX W ebir ibieseis ebir
+! SFX W acer icieseis [fh]acer
+! SFX W edir idieseis edir
+! SFX W endir indieseis endir
+! SFX W oder udieseis oder
+! SFX W egir igieseis egir
+! SFX W enchir inchieseis enchir
+! SFX W emir imieseis emir
+! SFX W ormir urmieseis ormir
+! SFX W enir inieseis enir
+! SFX W aber upieseis aber
+! SFX W erir irieseis erir
+! SFX W irir irieseis irir
+! SFX W orir urieseis orir
+! SFX W erer isieseis erer
+! SFX W oner usieseis oner
+! SFX W etir itieseis etir
+! SFX W entir intieseis entir
+! SFX W ertir irtieseis ertir
+! SFX W estir istieseis estir
+! SFX W eguir iguieseis eguir
+! SFX W ervir irvieseis ervir
+! SFX W ar uvieseis andar
+! SFX W ener uvieseis ener
+! SFX W cir jeseis ucir
+! SFX W er jeseis raer
+! SFX W ecir ijeseis ecir
+! SFX W er yeseis [eo]er
+! SFX W er yeseis caer
+! SFX W ir yeseis [^g]uir
+! SFX W r yeseis or
+! SFX W ir uyeseis gir
+! SFX W eir ieseis eir
+!
+!
+!
+! SFX W Y 45 S
+! SFX W r steis [^a]ndar
+! SFX W r steis [^d]ar
+! SFX W r steis [^n]dar
+! SFX W r steis [eo]r
+! SFX W r steis [u]ir
+! SFX W r steis alir
+! SFX W r steis ebir
+! SFX W r steis edir
+! SFX W r steis egir
+! SFX W r steis emir
+! SFX W r steis enchir
+! SFX W r steis endir
+! SFX W r steis entir
+! SFX W r steis erir
+! SFX W r steis ernir
+! SFX W r steis ertir
+! SFX W r steis ervir
+! SFX W r steis estir
+! SFX W r steis etir
+! SFX W r steis eunir
+! SFX W r steis eir
+! SFX W r steis irir
+! SFX W r steis orir
+! SFX W r steis ormir
+! SFX W er isteis [^fh]acer
+! SFX W er isteis aler
+! SFX W er isteis e[cd]er
+! SFX W er isteis ender
+! SFX W er isteis er[dnt]er
+! SFX W er isteis o[clv]er
+! SFX W er isteis olver
+! SFX W er isteis or[cd]er
+! SFX W acer icisteis [fh]acer
+! SFX W oder udisteis oder
+! SFX W cir jisteis ucir
+! SFX W er jisteis raer
+! SFX W ecir ijisteis ecir
+! SFX W enir inisteis enir
+! SFX W aber upisteis aber
+! SFX W erer isisteis erer
+! SFX W oner usisteis oner
+! SFX W ar uvisteis andar
+! SFX W ener uvisteis ener
+! SFX W er steis [eo]er
+! SFX W er steis caer
+!
+!
+!
+! SFX W Y 54 S
+! SFX W ar is ar
+! SFX W er is [eo]er
+! SFX W er is eder
+! SFX W er is ender
+! SFX W er is erder
+! SFX W er is erer
+! SFX W er is erner
+! SFX W er is erter
+! SFX W er is oder
+! SFX W er is oler
+! SFX W er is olver
+! SFX W er is order
+! SFX W er is over
+! SFX W ir is ernir
+! SFX W ir is eunir
+! SFX W ir is irir
+! SFX W ir is ohibir
+! SFX W ebir ibis ebir
+! SFX W cer zcis [^c]ocer
+! SFX W cer zcis [^fh]acer
+! SFX W cer zcis ecer
+! SFX W cir zcis ucir
+! SFX W edir idis edir
+! SFX W endir indis endir
+! SFX W cer gis [fh]acer
+! SFX W er gis [eo]ner
+! SFX W er gis aler
+! SFX W ir gis alir
+! SFX W ecir igis ecir
+! SFX W eguir igis eguir
+! SFX W er igis aer
+! SFX W er igis oer
+! SFX W r igis or
+! SFX W enir engis enir
+! SFX W enchir inchis enchir
+! SFX W er iis er
+! SFX W egir ijis egir
+! SFX W emir imis emir
+! SFX W ormir urmis ormir
+! SFX W aber epis saber
+! SFX W caber quepis caber
+! SFX W erir iris erir
+! SFX W orir uris orir
+! SFX W etir itis etir
+! SFX W entir intis entir
+! SFX W ertir irtis ertir
+! SFX W estir istis estir
+! SFX W ervir irvis ervir
+! SFX W er yis oer
+! SFX W ir yis [^g]uir
+! SFX W ir uyis gir
+! SFX W cer zis cocer
+! SFX W cer zis orcer
+! SFX W emir iis eir
+!
+!
+!
+! SFX W Y 84 S
+! SFX W 0 is [^fh]acer
+! SFX W 0 is [aeo]er
+! SFX W 0 is [io]rir
+! SFX W 0 is [u]ir
+! SFX W 0 is ar
+! SFX W 0 is e[bdgmrt]ir
+! SFX W 0 is e[cd]er
+! SFX W 0 is e[ns]tir
+! SFX W 0 is enchir
+! SFX W 0 is ender
+! SFX W 0 is endir
+! SFX W 0 is er[dnt]er
+! SFX W 0 is er[ntv]ir
+! SFX W 0 is eunir
+! SFX W 0 is o[clv]er
+! SFX W 0 is olver
+! SFX W 0 is or[cd]er
+! SFX W 0 is ormir
+! SFX W 0 is ucir
+! SFX W ar is [^g]uar
+! SFX W ar is [ae]hu[ms]ar
+! SFX W ar is [ae]ndar
+! SFX W ar is [aeo]hi[jlnt]ar
+! SFX W ar is ebrar
+! SFX W ar is edrar
+! SFX W ar is elar
+! SFX W ar is emblar
+! SFX W ar is embrar
+! SFX W ar is endrar
+! SFX W ar is ensar
+! SFX W ar is entar
+! SFX W ar is erbar
+! SFX W ar is ernar
+! SFX W ar is errar
+! SFX W ar is ertar
+! SFX W ar is esar
+! SFX W ar is estar
+! SFX W ar is etar
+! SFX W ar is evar
+! SFX W ar is iar
+! SFX W ar is obar
+! SFX W ar is oblar
+! SFX W ar is odar
+! SFX W ar is olar
+! SFX W ar is oldar
+! SFX W ar is ollar
+! SFX W ar is oltar
+! SFX W ar is onar
+! SFX W ar is ontar
+! SFX W ar is ontrar
+! SFX W ar is orar
+! SFX W ar is ordar
+! SFX W ar is ornar
+! SFX W ar is ortar
+! SFX W ar is osar
+! SFX W ar is ostar
+! SFX W ar is ostrar
+! SFX W ar is ovar
+! SFX W ar is oar
+! SFX W er is er
+! SFX W zar cis [ae]izar
+! SFX W zar cis enzar
+! SFX W zar cis ezar
+! SFX W zar cis gonzar
+! SFX W zar cis orzar
+! SFX W cer ris [fh]acer
+! SFX W er ris aber
+! SFX W er ris erer
+! SFX W er ris oder
+! SFX W er dris [eo]ner
+! SFX W er dris aler
+! SFX W ir dris alir
+! SFX W ir dris enir
+! SFX W ecir iris ecir
+! SFX W r iris [eo]r
+! SFX W ar uis olgar
+! SFX W gar guis egar
+! SFX W gar guis engar
+! SFX W gar guis ugar
+! SFX W ogar guis ogar
+! SFX W car quis olcar
+! SFX W car quis orcar
+! SFX W ocar quis ocar
+! SFX W uar is guar
+!
+!
+! SFX W Y 338 S
+! SFX W r mos r
+! SFX W er amos [eo]er
+! SFX W er amos eder
+! SFX W er amos ender
+! SFX W er amos erder
+! SFX W er amos erer
+! SFX W er amos erner
+! SFX W er amos erter
+! SFX W er amos oder
+! SFX W er amos oler
+! SFX W er amos olver
+! SFX W er amos order
+! SFX W er amos over
+! SFX W ir amos ernir
+! SFX W ir amos eunir
+! SFX W ir amos irir
+! SFX W ir amos ohibir
+! SFX W ebir ibamos ebir
+! SFX W ar bamos ar
+! SFX W cer zcamos [^c]ocer
+! SFX W cer zcamos [^fh]acer
+! SFX W cer zcamos ecer
+! SFX W cir zcamos ucir
+! SFX W edir idamos edir
+! SFX W endir indamos endir
+! SFX W cer gamos [fh]acer
+! SFX W er gamos [eo]ner
+! SFX W er gamos aler
+! SFX W ir gamos alir
+! SFX W ecir igamos ecir
+! SFX W eguir igamos eguir
+! SFX W er igamos aer
+! SFX W er igamos oer
+! SFX W r igamos or
+! SFX W enir engamos enir
+! SFX W enchir inchamos enchir
+! SFX W er iamos er
+! SFX W egir ijamos egir
+! SFX W emir imamos emir
+! SFX W ormir urmamos ormir
+! SFX W aber epamos saber
+! SFX W caber quepamos caber
+! SFX W erir iramos erir
+! SFX W orir uramos orir
+! SFX W ar ramos [^a]ndar
+! SFX W ar ramos [^d]ar
+! SFX W ar ramos [^n]dar
+! SFX W r ramos alir
+! SFX W r ramos ernir
+! SFX W r ramos eunir
+! SFX W r ramos ohibir
+! SFX W er iramos [^fh]acer
+! SFX W er iramos aler
+! SFX W er iramos e[cd]er
+! SFX W er iramos ender
+! SFX W er iramos er[dnt]er
+! SFX W er iramos o[clv]er
+! SFX W er iramos olver
+! SFX W er iramos or[cd]er
+! SFX W er iramos er
+! SFX W ebir ibiramos ebir
+! SFX W acer iciramos [fh]acer
+! SFX W edir idiramos edir
+! SFX W endir indiramos endir
+! SFX W oder udiramos oder
+! SFX W egir igiramos egir
+! SFX W enchir inchiramos enchir
+! SFX W emir imiramos emir
+! SFX W ormir urmiramos ormir
+! SFX W enir iniramos enir
+! SFX W aber upiramos aber
+! SFX W erir iriramos erir
+! SFX W irir iriramos irir
+! SFX W orir uriramos orir
+! SFX W erer isiramos erer
+! SFX W oner usiramos oner
+! SFX W etir itiramos etir
+! SFX W entir intiramos entir
+! SFX W ertir irtiramos ertir
+! SFX W estir istiramos estir
+! SFX W eguir iguiramos eguir
+! SFX W ervir irviramos ervir
+! SFX W ar uviramos andar
+! SFX W ener uviramos ener
+! SFX W cir jramos ucir
+! SFX W er jramos raer
+! SFX W ecir ijramos ecir
+! SFX W er yramos [eo]er
+! SFX W er yramos caer
+! SFX W ir yramos [^g]uir
+! SFX W r yramos or
+! SFX W ir uyramos gir
+! SFX W eir iramos eir
+! SFX W etir itamos etir
+! SFX W entir intamos entir
+! SFX W ertir irtamos ertir
+! SFX W estir istamos estir
+! SFX W ervir irvamos ervir
+! SFX W er yamos oer
+! SFX W ir yamos [^g]uir
+! SFX W ir uyamos gir
+! SFX W cer zamos cocer
+! SFX W cer zamos orcer
+! SFX W 0 amos [^fh]acer
+! SFX W 0 amos [aeo]er
+! SFX W 0 amos [io]rir
+! SFX W 0 amos [u]ir
+! SFX W 0 amos ar
+! SFX W 0 amos e[bdgmrt]ir
+! SFX W 0 amos e[cd]er
+! SFX W 0 amos e[ns]tir
+! SFX W 0 amos enchir
+! SFX W 0 amos ender
+! SFX W 0 amos endir
+! SFX W 0 amos er[dnt]er
+! SFX W 0 amos er[ntv]ir
+! SFX W 0 amos eunir
+! SFX W 0 amos o[clv]er
+! SFX W 0 amos olver
+! SFX W 0 amos or[cd]er
+! SFX W 0 amos ormir
+! SFX W 0 amos ucir
+! SFX W er amos er
+! SFX W ir amos ir
+! SFX W r amos r
+! SFX W cer ramos [fh]acer
+! SFX W er ramos aber
+! SFX W er ramos erer
+! SFX W er ramos oder
+! SFX W er dramos [eo]ner
+! SFX W er dramos aler
+! SFX W ir dramos alir
+! SFX W ir dramos enir
+! SFX W ecir iramos ecir
+! SFX W r iramos [eo]r
+! SFX W eir iamos eir
+! SFX W 0 emos [^fh]acer
+! SFX W 0 emos [aeo]er
+! SFX W 0 emos [io]rir
+! SFX W 0 emos [u]ir
+! SFX W 0 emos ar
+! SFX W 0 emos e[bdgmrt]ir
+! SFX W 0 emos e[cd]er
+! SFX W 0 emos e[ns]tir
+! SFX W 0 emos enchir
+! SFX W 0 emos ender
+! SFX W 0 emos endir
+! SFX W 0 emos er[dnt]er
+! SFX W 0 emos er[ntv]ir
+! SFX W 0 emos eunir
+! SFX W 0 emos o[clv]er
+! SFX W 0 emos olver
+! SFX W 0 emos or[cd]er
+! SFX W 0 emos ormir
+! SFX W 0 emos ucir
+! SFX W ar emos [^g]uar
+! SFX W ar emos [ae]hu[ms]ar
+! SFX W ar emos [ae]ndar
+! SFX W ar emos [aeo]hi[jlnt]ar
+! SFX W ar emos ebrar
+! SFX W ar emos edrar
+! SFX W ar emos elar
+! SFX W ar emos emblar
+! SFX W ar emos embrar
+! SFX W ar emos endrar
+! SFX W ar emos ensar
+! SFX W ar emos entar
+! SFX W ar emos erbar
+! SFX W ar emos ernar
+! SFX W ar emos errar
+! SFX W ar emos ertar
+! SFX W ar emos esar
+! SFX W ar emos estar
+! SFX W ar emos etar
+! SFX W ar emos evar
+! SFX W ar emos obar
+! SFX W ar emos oblar
+! SFX W ar emos odar
+! SFX W ar emos olar
+! SFX W ar emos oldar
+! SFX W ar emos ollar
+! SFX W ar emos oltar
+! SFX W ar emos onar
+! SFX W ar emos ontar
+! SFX W ar emos ontrar
+! SFX W ar emos orar
+! SFX W ar emos ordar
+! SFX W ar emos ornar
+! SFX W ar emos ortar
+! SFX W ar emos osar
+! SFX W ar emos ostar
+! SFX W ar emos ostrar
+! SFX W ar emos ovar
+! SFX W ar emos oar
+! SFX W zar cemos [ae]izar
+! SFX W zar cemos enzar
+! SFX W zar cemos ezar
+! SFX W zar cemos gonzar
+! SFX W zar cemos orzar
+! SFX W iar iemos iar
+! SFX W cer remos [fh]acer
+! SFX W er remos aber
+! SFX W er remos erer
+! SFX W er remos oder
+! SFX W er dremos [eo]ner
+! SFX W er dremos aler
+! SFX W ir dremos alir
+! SFX W ir dremos enir
+! SFX W ecir iremos ecir
+! SFX W r iremos [eo]r
+! SFX W ar remos [^a]ndar
+! SFX W ar remos [^d]ar
+! SFX W ar remos [^n]dar
+! SFX W r remos alir
+! SFX W r remos ernir
+! SFX W r remos eunir
+! SFX W r remos ohibir
+! SFX W er iremos [^fh]acer
+! SFX W er iremos aler
+! SFX W er iremos e[cd]er
+! SFX W er iremos ender
+! SFX W er iremos er[dnt]er
+! SFX W er iremos o[clv]er
+! SFX W er iremos olver
+! SFX W er iremos or[cd]er
+! SFX W er iremos er
+! SFX W ebir ibiremos ebir
+! SFX W acer iciremos [fh]acer
+! SFX W edir idiremos edir
+! SFX W endir indiremos endir
+! SFX W oder udiremos oder
+! SFX W egir igiremos egir
+! SFX W enchir inchiremos enchir
+! SFX W emir imiremos emir
+! SFX W ormir urmiremos ormir
+! SFX W enir iniremos enir
+! SFX W aber upiremos aber
+! SFX W erir iriremos erir
+! SFX W irir iriremos irir
+! SFX W orir uriremos orir
+! SFX W erer isiremos erer
+! SFX W oner usiremos oner
+! SFX W etir itiremos etir
+! SFX W entir intiremos entir
+! SFX W ertir irtiremos ertir
+! SFX W estir istiremos estir
+! SFX W eguir iguiremos eguir
+! SFX W ervir irviremos ervir
+! SFX W ar uviremos andar
+! SFX W ener uviremos ener
+! SFX W cir jremos ucir
+! SFX W er jremos raer
+! SFX W ecir ijremos ecir
+! SFX W er yremos [eo]er
+! SFX W er yremos caer
+! SFX W ir yremos [^g]uir
+! SFX W r yremos or
+! SFX W ir uyremos gir
+! SFX W eir iremos eir
+! SFX W ar semos [^d]ar
+! SFX W ar semos [^n]dar
+! SFX W r semos [^a]ndar
+! SFX W r semos alir
+! SFX W r semos ernir
+! SFX W r semos eunir
+! SFX W r semos ohibir
+! SFX W er isemos [^fh]acer
+! SFX W er isemos aler
+! SFX W er isemos e[cd]er
+! SFX W er isemos ender
+! SFX W er isemos er[dnt]er
+! SFX W er isemos o[clv]er
+! SFX W er isemos olver
+! SFX W er isemos or[cd]er
+! SFX W er isemos er
+! SFX W ebir ibisemos ebir
+! SFX W acer icisemos [fh]acer
+! SFX W edir idisemos edir
+! SFX W endir indisemos endir
+! SFX W oder udisemos oder
+! SFX W egir igisemos egir
+! SFX W enchir inchisemos enchir
+! SFX W emir imisemos emir
+! SFX W ormir urmisemos ormir
+! SFX W enir inisemos enir
+! SFX W aber upisemos aber
+! SFX W erir irisemos erir
+! SFX W irir irisemos irir
+! SFX W orir urisemos orir
+! SFX W erer isisemos erer
+! SFX W oner usisemos oner
+! SFX W etir itisemos etir
+! SFX W entir intisemos entir
+! SFX W ertir irtisemos ertir
+! SFX W estir istisemos estir
+! SFX W eguir iguisemos eguir
+! SFX W ervir irvisemos ervir
+! SFX W ar uvisemos andar
+! SFX W ener uvisemos ener
+! SFX W cir jsemos ucir
+! SFX W er jsemos raer
+! SFX W ecir ijsemos ecir
+! SFX W er ysemos [eo]er
+! SFX W er ysemos caer
+! SFX W ir ysemos [^g]uir
+! SFX W r ysemos or
+! SFX W ir uysemos gir
+! SFX W eir isemos eir
+! SFX W ar uemos olgar
+! SFX W gar guemos egar
+! SFX W gar guemos engar
+! SFX W gar guemos ogar
+! SFX W gar guemos ugar
+! SFX W car quemos ocar
+! SFX W car quemos olcar
+! SFX W car quemos orcar
+! SFX W uar emos guar
+! SFX W er imos [^fh]acer
+! SFX W er imos aler
+! SFX W er imos e[cd]er
+! SFX W er imos ender
+! SFX W er imos er[dnt]er
+! SFX W er imos o[clv]er
+! SFX W er imos olver
+! SFX W er imos or[cd]er
+! SFX W acer icimos [fh]acer
+! SFX W oder udimos oder
+! SFX W cir jimos ucir
+! SFX W er jimos raer
+! SFX W ecir ijimos ecir
+! SFX W enir inimos enir
+! SFX W aber upimos aber
+! SFX W erer isimos erer
+! SFX W oner usimos oner
+! SFX W ar uvimos andar
+! SFX W ener uvimos ener
+! SFX W er mos [eo]er
+! SFX W er mos caer
+!
+!
+!
+! SFX W Y 29 S
+! SFX W 0 s [^fh]acer
+! SFX W 0 s [aeo]er
+! SFX W 0 s [io]rir
+! SFX W 0 s [u]ir
+! SFX W 0 s ar
+! SFX W 0 s e[bdgmrt]ir
+! SFX W 0 s e[cd]er
+! SFX W 0 s e[ns]tir
+! SFX W 0 s enchir
+! SFX W 0 s ender
+! SFX W 0 s endir
+! SFX W 0 s er[dnt]er
+! SFX W 0 s er[ntv]ir
+! SFX W 0 s eunir
+! SFX W 0 s o[clv]er
+! SFX W 0 s olver
+! SFX W 0 s or[cd]er
+! SFX W 0 s ormir
+! SFX W 0 s ucir
+! SFX W cer rs [fh]acer
+! SFX W er rs aber
+! SFX W er rs erer
+! SFX W er rs oder
+! SFX W er drs [eo]ner
+! SFX W er drs aler
+! SFX W ir drs alir
+! SFX W ir drs enir
+! SFX W ecir irs ecir
+! SFX W r irs [eo]r
+!
+!
+! SFX W Y 29 S
+! SFX W 0 [^fh]acer
+! SFX W 0 [aeo]er
+! SFX W 0 [io]rir
+! SFX W 0 [u]ir
+! SFX W 0 ar
+! SFX W 0 e[bdgmrt]ir
+! SFX W 0 e[cd]er
+! SFX W 0 e[ns]tir
+! SFX W 0 enchir
+! SFX W 0 ender
+! SFX W 0 endir
+! SFX W 0 er[dnt]er
+! SFX W 0 er[ntv]ir
+! SFX W 0 eunir
+! SFX W 0 o[clv]er
+! SFX W 0 olver
+! SFX W 0 or[cd]er
+! SFX W 0 ormir
+! SFX W 0 ucir
+! SFX W cer r [fh]acer
+! SFX W er r aber
+! SFX W er r erer
+! SFX W er r oder
+! SFX W er dr [eo]ner
+! SFX W er dr aler
+! SFX W ir dr alir
+! SFX W ir dr enir
+! SFX W ecir ir ecir
+! SFX W r ir [eo]r
+!
+!
+!
+! SFX W Y 38 S
+! SFX W 0 [^fh]acer
+! SFX W 0 [aeo]er
+! SFX W 0 [io]rir
+! SFX W 0 [u]ir
+! SFX W 0 ar
+! SFX W 0 e[bdgmrt]ir
+! SFX W 0 e[cd]er
+! SFX W 0 e[ns]tir
+! SFX W 0 enchir
+! SFX W 0 ender
+! SFX W 0 endir
+! SFX W 0 er[dnt]er
+! SFX W 0 er[ntv]ir
+! SFX W 0 eunir
+! SFX W 0 o[clv]er
+! SFX W 0 olver
+! SFX W 0 or[cd]er
+! SFX W 0 ormir
+! SFX W 0 ucir
+! SFX W aber saber
+! SFX W ar [^a]ndar
+! SFX W ar [^cguzd]ar
+! SFX W ar [^g]uar
+! SFX W ar [^n]dar
+! SFX W zar c zar
+! SFX W cer r [fh]acer
+! SFX W er r aber
+! SFX W er r erer
+! SFX W er r oder
+! SFX W er dr [eo]ner
+! SFX W er dr aler
+! SFX W ir dr alir
+! SFX W ir dr enir
+! SFX W ecir ir ecir
+! SFX W r ir [eo]r
+! SFX W ar u gar
+! SFX W car qu car
+! SFX W uar guar
+!
+!
+! SFX W Y 31 S
+! SFX W er [^fh]acer
+! SFX W er [eo]er
+! SFX W er aler
+! SFX W er caer
+! SFX W er e[cd]er
+! SFX W er ender
+! SFX W er er[dnt]er
+! SFX W er o[clv]er
+! SFX W er olver
+! SFX W er or[cd]er
+! SFX W ir [u]ir
+! SFX W ir alir
+! SFX W ir ebir
+! SFX W ir edir
+! SFX W ir egir
+! SFX W ir emir
+! SFX W ir enchir
+! SFX W ir endir
+! SFX W ir entir
+! SFX W ir erir
+! SFX W ir ernir
+! SFX W ir ertir
+! SFX W ir ervir
+! SFX W ir estir
+! SFX W ir etir
+! SFX W ir eunir
+! SFX W ir eir
+! SFX W ir irir
+! SFX W ir orir
+! SFX W ir ormir
+! SFX W r [eo]r
+!
+!
+!
+! SFX W Y 39 S
+! SFX W ar [^a]ndar
+! SFX W ar [^d]ar
+! SFX W ar [^n]dar
+! SFX W r alir
+! SFX W r ernir
+! SFX W r eunir
+! SFX W r irir
+! SFX W r ohibir
+! SFX W er i [^fh]acer
+! SFX W er i aler
+! SFX W er i e[cd]er
+! SFX W er i ender
+! SFX W er i er[dnt]er
+! SFX W er i o[clv]er
+! SFX W er i olver
+! SFX W er i or[cd]er
+! SFX W er i order
+! SFX W er i er
+! SFX W ebir ibi ebir
+! SFX W edir idi edir
+! SFX W endir indi endir
+! SFX W egir igi egir
+! SFX W enchir inchi enchir
+! SFX W emir imi emir
+! SFX W ormir urmi ormir
+! SFX W erir iri erir
+! SFX W orir uri orir
+! SFX W etir iti etir
+! SFX W entir inti entir
+! SFX W ertir irti ertir
+! SFX W estir isti estir
+! SFX W eguir igui eguir
+! SFX W ervir irvi ervir
+! SFX W er y [eo]er
+! SFX W er y caer
+! SFX W ir y [^g]uir
+! SFX W r y or
+! SFX W ir uy gir
+! SFX W eir i eir
+!
+!
+!
+! SFX W Y 21
+! SFX W r d [aei]r
+! SFX W r n [^c]ocer
+! SFX W r n [cr]aer
+! SFX W r n [eo]er
+! SFX W r n a[bcl]er
+! SFX W r n andar
+! SFX W r n ecer
+! SFX W r n guar
+! SFX W r n oner
+! SFX W r s [^c]ocer
+! SFX W r s [cr]aer
+! SFX W r s [eo]er
+! SFX W r s a[bcl]er
+! SFX W r s andar
+! SFX W r s ecer
+! SFX W r s guar
+! SFX W r s oner
+! SFX W r bais ar
+! SFX W ir s ir
+! SFX W r s r
+! SFX W cer z [fh]acer
+!
+! SFX Y Y 102
+! SFX Y er do [aeo]er
+! SFX Y er dos [aeo]er
+! SFX Y er da [aeo]er
+! SFX Y er das [aeo]er
+! SFX Y acer echo [fh]acer
+! SFX Y acer echos [fh]acer
+! SFX Y acer echa [fh]acer
+! SFX Y acer echas [fh]acer
+! SFX Y er ido oder
+! SFX Y er idos oder
+! SFX Y er ida oder
+! SFX Y er idas oder
+! SFX Y olver uelto olver
+! SFX Y olver ueltos olver
+! SFX Y olver uelta olver
+! SFX Y olver ueltas olver
+! SFX Y oner uesto oner
+! SFX Y oner uestos oner
+! SFX Y oner uesta oner
+! SFX Y oner uestas oner
+! SFX Y rir ierto abrir
+! SFX Y rir iertos abrir
+! SFX Y rir ierta abrir
+! SFX Y rir iertas abrir
+! SFX Y r do e[bdgmnrt]ir
+! SFX Y r dos e[bdgmnrt]ir
+! SFX Y r da e[bdgmnrt]ir
+! SFX Y r das e[bdgmnrt]ir
+! SFX Y ecir icho ecir
+! SFX Y ecir ichos ecir
+! SFX Y ecir icha ecir
+! SFX Y ecir ichas ecir
+! SFX Y r do [eo]r
+! SFX Y r dos [eo]r
+! SFX Y r da [eo]r
+! SFX Y r das [eo]r
+! SFX Y r do enchir
+! SFX Y r dos enchir
+! SFX Y r da enchir
+! SFX Y r das enchir
+! SFX Y r do en[dt]ir
+! SFX Y r dos en[dt]ir
+! SFX Y r da en[dt]ir
+! SFX Y r das en[dt]ir
+! SFX Y r do er[tv]ir
+! SFX Y r dos er[tv]ir
+! SFX Y r da er[tv]ir
+! SFX Y r das er[tv]ir
+! SFX Y r do estir
+! SFX Y r dos estir
+! SFX Y r da estir
+! SFX Y r das estir
+! SFX Y bir to ibir
+! SFX Y bir tos ibir
+! SFX Y bir ta ibir
+! SFX Y bir tas ibir
+! SFX Y orir uerto orir
+! SFX Y orir uertos orir
+! SFX Y orir uerta orir
+! SFX Y orir uertas orir
+! SFX Y r do ormir
+! SFX Y r dos ormir
+! SFX Y r da ormir
+! SFX Y r das ormir
+! SFX Y rir ierto ubrir
+! SFX Y rir iertos ubrir
+! SFX Y rir ierta ubrir
+! SFX Y rir iertas ubrir
+! SFX Y r do [u]ir
+! SFX Y r da [u]ir
+! SFX Y r dos [u]ir
+! SFX Y r das [u]ir
+! SFX Y er iendo [fh]acer
+! SFX Y er yendo [aeo]er
+! SFX Y oder udiendo oder
+! SFX Y er iendo olver
+! SFX Y er iendo oner
+! SFX Y r endo abrir
+! SFX Y ebir ibiendo ebir
+! SFX Y ecir iciendo ecir
+! SFX Y edir idiendo edir
+! SFX Y egir igiendo egir
+! SFX Y emir imiendo emir
+! SFX Y er iendo er
+! SFX Y eir iendo eir
+! SFX Y enchir inchiendo enchir
+! SFX Y endir indiendo endir
+! SFX Y enir iniendo enir
+! SFX Y entir intiendo entir
+! SFX Y ertir irtiendo ertir
+! SFX Y ervir irviendo ervir
+! SFX Y estir istiendo estir
+! SFX Y eguir iguiendo eguir
+! SFX Y erir iriendo erir
+! SFX Y etir itiendo etir
+! SFX Y r endo ibir
+! SFX Y r yendo or
+! SFX Y orir uriendo orir
+! SFX Y ormir urmiendo ormir
+! SFX Y r endo ubrir
+! SFX Y ir yendo [^g]uir
+! SFX Y ir uyendo gir
+!
+! SFX O Y 115
+! SFX O 0 me [ei]r
+! SFX O 0 te [ei]r
+! SFX O 0 se [ei]r
+! SFX O 0 nos [ei]r
+! SFX O 0 os [ei]r
+! SFX O er yndome [aeo]er
+! SFX O er yndote [aeo]er
+! SFX O er yndose [aeo]er
+! SFX O er yndonos [aeo]er
+! SFX O er yndoos [aeo]er
+! SFX O oder udindome oder
+! SFX O oder udindote oder
+! SFX O oder udindose oder
+! SFX O oder udindonos oder
+! SFX O oder udindoos oder
+! SFX O ebir ibindome ebir
+! SFX O ebir ibindote ebir
+! SFX O ebir ibindose ebir
+! SFX O ebir ibindonos ebir
+! SFX O ebir ibindoos ebir
+! SFX O ecir icindome ecir
+! SFX O ecir icindote ecir
+! SFX O ecir icindose ecir
+! SFX O ecir icindonos ecir
+! SFX O ecir icindoos ecir
+! SFX O edir idindome edir
+! SFX O edir idindote edir
+! SFX O edir idindose edir
+! SFX O edir idindonos edir
+! SFX O edir idindoos edir
+! SFX O egir igindome egir
+! SFX O egir igindote egir
+! SFX O egir igindose egir
+! SFX O egir igindonos egir
+! SFX O egir igindoos egir
+! SFX O emir imindome emir
+! SFX O emir imindote emir
+! SFX O emir imindose emir
+! SFX O emir imindonos emir
+! SFX O emir imindoos emir
+! SFX O er indome er
+! SFX O er indote er
+! SFX O er indose er
+! SFX O er indonos er
+! SFX O er indoos er
+! SFX O eir indome eir
+! SFX O eir indote eir
+! SFX O eir indose eir
+! SFX O eir indonos eir
+! SFX O eir indoos eir
+! SFX O endir indindome endir
+! SFX O endir indindote endir
+! SFX O endir indindose endir
+! SFX O endir indindonos endir
+! SFX O endir indindoos endir
+! SFX O enir inindome enir
+! SFX O enir inindote enir
+! SFX O enir inindose enir
+! SFX O enir inindonos enir
+! SFX O enir inindoos enir
+! SFX O entir intindome entir
+! SFX O entir intindote entir
+! SFX O entir intindose entir
+! SFX O entir intindonos entir
+! SFX O entir intindoos entir
+! SFX O ertir irtindome ertir
+! SFX O ertir irtindote ertir
+! SFX O ertir irtindose ertir
+! SFX O ertir irtindonos ertir
+! SFX O ertir irtindoos ertir
+! SFX O ervir irvindome ervir
+! SFX O ervir irvindote ervir
+! SFX O ervir irvindose ervir
+! SFX O ervir irvindonos ervir
+! SFX O ervir irvindoos ervir
+! SFX O estir istindome estir
+! SFX O estir istindote estir
+! SFX O estir istindose estir
+! SFX O estir istindonos estir
+! SFX O estir istindoos estir
+! SFX O eguir iguindome eguir
+! SFX O eguir iguindote eguir
+! SFX O eguir iguindose eguir
+! SFX O eguir iguindonos eguir
+! SFX O eguir iguindoos eguir
+! SFX O erir irindome erir
+! SFX O erir irindote erir
+! SFX O erir irindose erir
+! SFX O erir irindonos erir
+! SFX O erir irindoos erir
+! SFX O etir itindome etir
+! SFX O etir itindote etir
+! SFX O etir itindose etir
+! SFX O etir itindonos etir
+! SFX O etir itindoos etir
+! SFX O r yndome or
+! SFX O r yndote or
+! SFX O r yndose or
+! SFX O r yndonos or
+! SFX O r yndoos or
+! SFX O orir urindome orir
+! SFX O orir urindote orir
+! SFX O orir urindose orir
+! SFX O orir urindonos orir
+! SFX O orir urindoos orir
+! SFX O ormir urmindome ormir
+! SFX O ormir urmindote ormir
+! SFX O ormir urmindose ormir
+! SFX O ormir urmindonos ormir
+! SFX O ormir urmindoos ormir
+! SFX O ir yndome [^g]uir
+! SFX O ir yndote [^g]uir
+! SFX O ir yndose [^g]uir
+! SFX O ir yndonos [^g]uir
+! SFX O ir yndoos [^g]uir
+!
+! SFX Q Y 138
+! SFX Q 0 lo [ei]r
+! SFX Q 0 la [ei]r
+! SFX Q 0 los [ei]r
+! SFX Q 0 las [ei]r
+! SFX Q 0 le [ei]r
+! SFX Q 0 les [ei]r
+! SFX Q er yndolo [aeo]er
+! SFX Q er yndola [aeo]er
+! SFX Q er yndolos [aeo]er
+! SFX Q er yndolas [aeo]er
+! SFX Q er yndole [aeo]er
+! SFX Q er yndoles [aeo]er
+! SFX Q oder udindolo oder
+! SFX Q oder udindola oder
+! SFX Q oder udindolos oder
+! SFX Q oder udindolas oder
+! SFX Q oder udindole oder
+! SFX Q oder udindoles oder
+! SFX Q ebir ibindolo ebir
+! SFX Q ebir ibindolos ebir
+! SFX Q ebir ibindola ebir
+! SFX Q ebir ibindolas ebir
+! SFX Q ebir ibindole ebir
+! SFX Q ebir ibindoles ebir
+! SFX Q ecir icindolo ecir
+! SFX Q ecir icindolos ecir
+! SFX Q ecir icindola ecir
+! SFX Q ecir icindolas ecir
+! SFX Q ecir icindole ecir
+! SFX Q ecir icindoles ecir
+! SFX Q edir idindolo edir
+! SFX Q edir idindolos edir
+! SFX Q edir idindola edir
+! SFX Q edir idindolas edir
+! SFX Q edir idindole edir
+! SFX Q edir idindoles edir
+! SFX Q egir igindolo egir
+! SFX Q egir igindolos egir
+! SFX Q egir igindola egir
+! SFX Q egir igindolas egir
+! SFX Q egir igindole egir
+! SFX Q egir igindoles egir
+! SFX Q emir imindolo emir
+! SFX Q emir imindolos emir
+! SFX Q emir imindola emir
+! SFX Q emir imindolas emir
+! SFX Q emir imindole emir
+! SFX Q emir imindoles emir
+! SFX Q er indolo er
+! SFX Q er indolos er
+! SFX Q er indola er
+! SFX Q er indolas er
+! SFX Q er indole er
+! SFX Q er indoles er
+! SFX Q eir indolo eir
+! SFX Q eir indolos eir
+! SFX Q eir indola eir
+! SFX Q eir indolas eir
+! SFX Q eir indole eir
+! SFX Q eir indoles eir
+! SFX Q endir indindolo endir
+! SFX Q endir indindolos endir
+! SFX Q endir indindola endir
+! SFX Q endir indindolas endir
+! SFX Q endir indindole endir
+! SFX Q endir indindoles endir
+! SFX Q enir inindolo enir
+! SFX Q enir inindolos enir
+! SFX Q enir inindola enir
+! SFX Q enir inindolas enir
+! SFX Q enir inindole enir
+! SFX Q enir inindoles enir
+! SFX Q entir intindolo entir
+! SFX Q entir intindolos entir
+! SFX Q entir intindola entir
+! SFX Q entir intindolas entir
+! SFX Q entir intindole entir
+! SFX Q entir intindoles entir
+! SFX Q ertir irtindolo ertir
+! SFX Q ertir irtindolos ertir
+! SFX Q ertir irtindola ertir
+! SFX Q ertir irtindolas ertir
+! SFX Q ertir irtindole ertir
+! SFX Q ertir irtindoles ertir
+! SFX Q ervir irvindolo ervir
+! SFX Q ervir irvindolos ervir
+! SFX Q ervir irvindola ervir
+! SFX Q ervir irvindolas ervir
+! SFX Q ervir irvindole ervir
+! SFX Q ervir irvindoles ervir
+! SFX Q estir istindolo estir
+! SFX Q estir istindolos estir
+! SFX Q estir istindola estir
+! SFX Q estir istindolas estir
+! SFX Q estir istindole estir
+! SFX Q estir istindoles estir
+! SFX Q eguir iguindolo eguir
+! SFX Q eguir iguindolos eguir
+! SFX Q eguir iguindola eguir
+! SFX Q eguir iguindolas eguir
+! SFX Q eguir iguindole eguir
+! SFX Q eguir iguindoles eguir
+! SFX Q erir irindolo erir
+! SFX Q erir irindolos erir
+! SFX Q erir irindola erir
+! SFX Q erir irindolas erir
+! SFX Q erir irindole erir
+! SFX Q erir irindoles erir
+! SFX Q etir itindolo etir
+! SFX Q etir itindolos etir
+! SFX Q etir itindola etir
+! SFX Q etir itindolas etir
+! SFX Q etir itindole etir
+! SFX Q etir itindoles etir
+! SFX Q r yndolo or
+! SFX Q r yndolos or
+! SFX Q r yndola or
+! SFX Q r yndolas or
+! SFX Q r yndole or
+! SFX Q r yndoles or
+! SFX Q orir urindolo orir
+! SFX Q orir urindolos orir
+! SFX Q orir urindola orir
+! SFX Q orir urindolas orir
+! SFX Q orir urindole orir
+! SFX Q orir urindoles orir
+! SFX Q ormir urmindolo ormir
+! SFX Q ormir urmindolos ormir
+! SFX Q ormir urmindola ormir
+! SFX Q ormir urmindolas ormir
+! SFX Q ormir urmindole ormir
+! SFX Q ormir urmindoles ormir
+! SFX Q ir yndolo [^g]uir
+! SFX Q ir yndolos [^g]uir
+! SFX Q ir yndola [^g]uir
+! SFX Q ir yndolas [^g]uir
+! SFX Q ir yndole [^g]uir
+! SFX Q ir yndoles [^g]uir
+!
+! SFX Z Y 171
+! SFX Z er rmelo er
+! SFX Z er rmela er
+! SFX Z er rmelos er
+! SFX Z er rmelas er
+! SFX Z er rtelo er
+! SFX Z er rtela er
+! SFX Z er rtelos er
+! SFX Z er rtelas er
+! SFX Z er rselo er
+! SFX Z er rsela er
+! SFX Z er rselos er
+! SFX Z er rselas er
+! SFX Z er roslo er
+! SFX Z er rosla er
+! SFX Z er roslos er
+! SFX Z er roslas er
+! SFX Z er rnoslo er
+! SFX Z er rnosla er
+! SFX Z er rnoslos er
+! SFX Z er rnoslas er
+! SFX Z er rnosles er
+! SFX Z ir rmelo ir
+! SFX Z ir rmela ir
+! SFX Z ir rmele ir
+! SFX Z ir rmelos ir
+! SFX Z ir rmelas ir
+! SFX Z ir rmeles ir
+! SFX Z ir rtelo ir
+! SFX Z ir rtela ir
+! SFX Z ir rtele ir
+! SFX Z ir rtelos ir
+! SFX Z ir rtelas ir
+! SFX Z ir rteles ir
+! SFX Z ir rselo ir
+! SFX Z ir rsela ir
+! SFX Z ir rsele ir
+! SFX Z ir rselos ir
+! SFX Z ir rselas ir
+! SFX Z ir rseles ir
+! SFX Z ir roslo ir
+! SFX Z ir rosla ir
+! SFX Z ir rosle ir
+! SFX Z ir roslos ir
+! SFX Z ir roslas ir
+! SFX Z ir rosles ir
+! SFX Z ir rnoslo ir
+! SFX Z ir rnosla ir
+! SFX Z ir rnosle ir
+! SFX Z ir rnoslos ir
+! SFX Z ir rnoslas ir
+! SFX Z ir rnosles ir
+! SFX Z er yndomelo [aeo]er
+! SFX Z er yndomela [aeo]er
+! SFX Z er yndomele [aeo]er
+! SFX Z er yndomelos [aeo]er
+! SFX Z er yndomelas [aeo]er
+! SFX Z er yndomeles [aeo]er
+! SFX Z er yndotelo [aeo]er
+! SFX Z er yndotela [aeo]er
+! SFX Z er yndotele [aeo]er
+! SFX Z er yndotelos [aeo]er
+! SFX Z er yndotelas [aeo]er
+! SFX Z er yndoteles [aeo]er
+! SFX Z er yndoselo [aeo]er
+! SFX Z er yndosela [aeo]er
+! SFX Z er yndosele [aeo]er
+! SFX Z er yndoselos [aeo]er
+! SFX Z er yndoselas [aeo]er
+! SFX Z er yndoseles [aeo]er
+! SFX Z er yndooslo [aeo]er
+! SFX Z er yndoosla [aeo]er
+! SFX Z er yndoosle [aeo]er
+! SFX Z er yndooslos [aeo]er
+! SFX Z er yndooslas [aeo]er
+! SFX Z er yndoosles [aeo]er
+! SFX Z er yndonoslo [aeo]er
+! SFX Z er yndonosla [aeo]er
+! SFX Z er yndonosle [aeo]er
+! SFX Z er yndonoslos [aeo]er
+! SFX Z er yndonoslas [aeo]er
+! SFX Z er yndonosles [aeo]er
+! SFX Z ir yndomelo [^g]uir
+! SFX Z ir yndomelos [^g]uir
+! SFX Z ir yndomela [^g]uir
+! SFX Z ir yndomelas [^g]uir
+! SFX Z ir yndomele [^g]uir
+! SFX Z ir yndomeles [^g]uir
+! SFX Z ir yndotelo [^g]uir
+! SFX Z ir yndotelos [^g]uir
+! SFX Z ir yndotela [^g]uir
+! SFX Z ir yndotelas [^g]uir
+! SFX Z ir yndotele [^g]uir
+! SFX Z ir yndoteles [^g]uir
+! SFX Z ir yndoselo [^g]uir
+! SFX Z ir yndoselos [^g]uir
+! SFX Z ir yndosela [^g]uir
+! SFX Z ir yndoselas [^g]uir
+! SFX Z ir yndosele [^g]uir
+! SFX Z ir yndoseles [^g]uir
+! SFX Z ir yndooslo [^g]uir
+! SFX Z ir yndooslos [^g]uir
+! SFX Z ir yndoosla [^g]uir
+! SFX Z ir yndooslas [^g]uir
+! SFX Z ir yndoosle [^g]uir
+! SFX Z ir yndoosles [^g]uir
+! SFX Z ir yndonoslo [^g]uir
+! SFX Z ir yndonoslos [^g]uir
+! SFX Z ir yndonosla [^g]uir
+! SFX Z ir yndonoslas [^g]uir
+! SFX Z ir yndonosle [^g]uir
+! SFX Z ir yndonosles [^g]uir
+! SFX Z egir igindomelo egir
+! SFX Z egir igindomelos egir
+! SFX Z egir igindomela egir
+! SFX Z egir igindomelas egir
+! SFX Z egir igindomele egir
+! SFX Z egir igindomeles egir
+! SFX Z egir igindotelo egir
+! SFX Z egir igindotelos egir
+! SFX Z egir igindotela egir
+! SFX Z egir igindotelas egir
+! SFX Z egir igindotele egir
+! SFX Z egir igindoteles egir
+! SFX Z egir igindoselo egir
+! SFX Z egir igindoselos egir
+! SFX Z egir igindosela egir
+! SFX Z egir igindoselas egir
+! SFX Z egir igindosele egir
+! SFX Z egir igindoseles egir
+! SFX Z egir igindooslo egir
+! SFX Z egir igindooslos egir
+! SFX Z egir igindoosla egir
+! SFX Z egir igindooslas egir
+! SFX Z egir igindoosle egir
+! SFX Z egir igindoosles egir
+! SFX Z egir igindonoslo egir
+! SFX Z egir igindonoslos egir
+! SFX Z egir igindonosla egir
+! SFX Z egir igindonoslas egir
+! SFX Z egir igindonosle egir
+! SFX Z egir igindonosles egir
+! SFX Z eguir iguindomelo eguir
+! SFX Z eguir iguindomelos eguir
+! SFX Z eguir iguindomela eguir
+! SFX Z eguir iguindomelas eguir
+! SFX Z eguir iguindomele eguir
+! SFX Z eguir iguindomeles eguir
+! SFX Z eguir iguindotelo eguir
+! SFX Z eguir iguindotelos eguir
+! SFX Z eguir iguindotela eguir
+! SFX Z eguir iguindotelas eguir
+! SFX Z eguir iguindotele eguir
+! SFX Z eguir iguindoteles eguir
+! SFX Z eguir iguindoselo eguir
+! SFX Z eguir iguindoselos eguir
+! SFX Z eguir iguindosela eguir
+! SFX Z eguir iguindoselas eguir
+! SFX Z eguir iguindosele eguir
+! SFX Z eguir iguindoseles eguir
+! SFX Z eguir iguindooslo eguir
+! SFX Z eguir iguindooslos eguir
+! SFX Z eguir iguindoosla eguir
+! SFX Z eguir iguindooslas eguir
+! SFX Z eguir iguindoosle eguir
+! SFX Z eguir iguindoosles eguir
+! SFX Z eguir iguindonoslo eguir
+! SFX Z eguir iguindonoslos eguir
+! SFX Z eguir iguindonosla eguir
+! SFX Z eguir iguindonoslas eguir
+! SFX Z eguir iguindonosle eguir
+! SFX Z eguir iguindonosles eguir
+*** es_MX.orig.dic Thu Aug 25 19:19:45 2005
+--- es_MX.dic Thu Aug 25 20:15:59 2005
+***************
+*** 1218,1220 ****
+ Internet
+- intraocular
+ Irapuato
+--- 1218,1219 ----
+***************
+*** 33345,33347 ****
+ nanear/PSVWX
+- nanche/S
+ nanjea/S
+--- 33344,33345 ----
diff --git a/runtime/spell/es/main.aap b/runtime/spell/es/main.aap
new file mode 100644
index 0000000..2421837
--- /dev/null
+++ b/runtime/spell/es/main.aap
@@ -0,0 +1,92 @@
+# Aap recipe for Spanish Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+REGIONS = ES MX
+ES_REGIONS = es_$*REGIONS
+
+SPELLDIR = ..
+FILES = es_$*(REGIONS).aff es_$*(REGIONS).dic
+
+ZIPFILE_ES = es_ES.zip
+ZIPFILE_MX = es_MX.zip
+ZIPFILES = $ZIPFILE_ES $ZIPFILE_MX
+
+READMES = README_es_$*(REGIONS).txt
+
+all: $SPELLDIR/es.latin1.spl $SPELLDIR/es.utf-8.spl ../README_es.txt
+
+$SPELLDIR/es.latin1.spl : $FILES
+ :sys env LANG=es_ES.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/es $ES_REGIONS" -c q
+
+$SPELLDIR/es.utf-8.spl : $FILES
+ :sys env LANG=es_ES.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/es $ES_REGIONS" -c q
+
+../README_es.txt: $READMES
+ :print es_ES >! $target
+ :cat README_es_ES.txt >> $target
+ :print =================================================== >>$target
+ :print es_MX >> $target
+ :cat README_es_MX.txt >> $target
+
+#
+# Fetching the files from the OpenOffice.org site.
+# The OLDSPELL file comes from elsewhere
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} $ZIPFILES
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+es_ES.aff es_ES.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch $ZIPFILE_ES
+ :sys $UNZIP $ZIPFILE_ES
+ :delete Changelog_es_ES.txt
+ :delete $ZIPFILE_ES
+ @if not os.path.exists('es_ES.orig.aff'):
+ :copy es_ES.aff es_ES.orig.aff
+ @if not os.path.exists('es_ES.orig.dic'):
+ :copy es_ES.dic es_ES.orig.dic
+ @if os.path.exists('es_ES.diff'):
+ :sys patch <es_ES.diff
+
+es_MX.aff es_MX.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch $ZIPFILE_MX
+ :print No copyright information for es_MX wordlist >! README_es_MX.txt
+ :sys $UNZIP $ZIPFILE_MX
+ :delete $ZIPFILE_MX
+ :sys $VIM -u NONE -e -c "set ff=unix | wq" es_MX.dic
+ @if not os.path.exists('es_MX.orig.aff'):
+ :copy es_MX.aff es_MX.orig.aff
+ @if not os.path.exists('es_MX.orig.dic'):
+ :copy es_MX.dic es_MX.orig.dic
+ @if os.path.exists('es_MX.diff'):
+ :sys patch <es_MX.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 es_ES.orig.aff es_ES.aff >es_ES.diff
+ :sys {force} diff -a -C 1 es_ES.orig.dic es_ES.dic >>es_ES.diff
+ :sys {force} diff -a -C 1 es_MX.orig.aff es_MX.aff >es_MX.diff
+ :sys {force} diff -a -C 1 es_MX.orig.dic es_MX.dic >>es_MX.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :print TODO!!!!
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/eu/main.aap b/runtime/spell/eu/main.aap
new file mode 100644
index 0000000..a31310d
--- /dev/null
+++ b/runtime/spell/eu/main.aap
@@ -0,0 +1,81 @@
+# Aap recipe for Basque Vim spell files.
+#
+# NOTE: This takes a VERY long time: several hours on a modern PC, more than
+# a day on older systems.
+
+# Select the amount of memory that can be used.
+# Default.
+#SETTING = 'set mkspellmem=460000,2000,500'
+
+# For about 1 Tbyte of RAM.
+#SETTING = 'set mkspellmem=900000,4000,1000'
+
+# For about 2 Tbyte of RAM.
+#SETTING = 'set mkspellmem=1900000,8000,2000'
+
+# For about 4 Tbyte of RAM.
+#SETTING = 'set mkspellmem=3900000,16000,4000'
+
+# For about 8 Tbyte of RAM.
+SETTING = 'set mkspellmem=7900000,30000,8000'
+
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = eu_ES.aff eu_ES.dic
+
+all: $SPELLDIR/eu.utf-8.spl ../README_eu.txt
+
+$SPELLDIR/eu.utf-8.spl : $FILES
+ :sys env LANG=eu_ES.UTF-8
+ $VIM -u NONE -e -c $SETTING -c "mkspell! $SPELLDIR/eu eu_ES" -c q
+
+#
+# Fetching the files.
+# URL suggested by Zuhaitz Beloki Leiza.
+#
+:attr {fetch = http://xuxen.eus/static/hunspell/xuxen_5.1_hunspell.tar.gz} xuxen_5.1_hunspell.tar.gz
+
+# The files don't depend on the tar file so that we can delete it.
+# Only download the tar file if the targets don't exist.
+eu_ES.aff eu_ES.dic: {buildcheck=}
+ :assertpkg tar
+ :fetch xuxen_5.1_hunspell.tar.gz
+ :sys tar xf xuxen_5.1_hunspell.tar.gz
+ :update cleanunused
+ @if not os.path.exists('eu_ES.orig.aff'):
+ :copy eu_ES.aff eu_ES.orig.aff
+ @if not os.path.exists('eu_ES.orig.dic'):
+ :copy eu_ES.dic eu_ES.orig.dic
+ @if os.path.exists('eu_ES.diff'):
+ :sys patch <eu_ES.diff
+
+../README_eu.txt : LICENSE.txt
+ :cat $source >! $target
+
+# Delete all the files unpacked from the archive
+clean: cleanunused
+ :delete {f} eu_ES.dic
+ :delete {f} eu_ES.aff
+
+# Delete all the files from the archive that are not used, including the
+# archive itself.
+cleanunused:
+ :delete {f} xuxen_5.1_hunspell.tar.gz
+
+# Generate diff files, so that others can get the files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 eu_ES.orig.aff eu_ES.aff >eu_ES.diff
+ :sys {force} diff -a -C 1 eu_ES.orig.dic eu_ES.dic >>eu_ES.diff
+
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/fixdup.vim b/runtime/spell/fixdup.vim
new file mode 100644
index 0000000..3f28fb5
--- /dev/null
+++ b/runtime/spell/fixdup.vim
@@ -0,0 +1,30 @@
+" Vim script to fix duplicate words in a .dic file vim: set ft=vim:
+"
+" Usage: Edit the .dic file and source this script.
+
+let deleted = 0
+
+" Start below the word count.
+let lnum = 2
+while lnum <= line('$')
+ let word = getline(lnum)
+ if word !~ '/'
+ if search('^' . word . '/', 'w') != 0
+ let deleted += 1
+ exe lnum . "d"
+ continue " don't increment lnum, it's already at the next word
+ endif
+ endif
+ if lnum%1000 == 0
+ echon "\r Processing line ".lnum. printf(" [ %02d%%]", lnum*100/line('$'))
+ endif
+ let lnum += 1
+endwhile
+
+if deleted == 0
+ echomsg "No duplicate words found"
+elseif deleted == 1
+ echomsg "Deleted 1 duplicate word"
+else
+ echomsg printf("Deleted %d duplicate words", deleted)
+endif
diff --git a/runtime/spell/fo/fo_FO.diff b/runtime/spell/fo/fo_FO.diff
new file mode 100644
index 0000000..a224d2b
--- /dev/null
+++ b/runtime/spell/fo/fo_FO.diff
@@ -0,0 +1,142 @@
+*** fo_FO.orig.aff Wed Aug 31 22:02:11 2005
+--- fo_FO.aff Fri Sep 30 12:55:30 2005
+***************
+*** 6 ****
+--- 6,142 ----
+
++ FOL
++ LOW
++ UPP
++
++ MIDWORD '-
++
++ # sound folding from Aspell, version 0.1-2001.04.30-5
++ # 2001.04.30: Jacob Sparre Andersen
++ # no copyright notice
++
++ # fra for eksempel aftage, det udtages avtage
++ SAL AA<
++ SAL AFT^ AT
++ #AF< AV
++ SAL AH$< A
++ SAL A A
++
++ SAL
++
++ SAL B B
++
++ # C udtales nogengange som K, andre gange som S og i f tilflde som SJ
++ # CK bruges ofte til at ndre lyden p det foregende (f.eks ren A lyd)
++ #
++ SAL CC< KK
++ SAL CK< K
++ SAL CHR^< KR
++ SAL CH< SJ
++ SAL CI< SI
++ SAL CO< KO
++ SAL CY< SY
++ SAL C C
++
++ # D udtales ofte bldt/stumt - regler?
++ #
++ # Stumt G
++
++ #DIG^$ DAJ
++ #DIG< DI
++ SAL D D
++
++ SAL UR< VUR
++ SAL _
++
++ SAL EAUX< O
++ SAL EAU< O
++ #EJ$< AJ
++ SAL EUS< VS
++ SAL E E
++
++ SAL < E
++
++ SAL < E
++
++ SAL F F
++
++ SAL G G
++
++ SAL HJ^< J
++ SAL HRD< HR
++ SAL HND< HN
++ SAL H H
++
++ SAL I^$
++ SAL I$< I
++ SAL IND^< IN
++ SAL I I
++
++ SAL
++
++ SAL J J
++
++ SAL KE^ TJE
++ SAL K K
++
++ # Stumt G
++ SAL LIG< LI
++ SAL L L
++
++ SAL M M
++
++ SAL N N
++
++ SAL OCH< OK
++ SAL O O
++
++ SAL
++
++ SAL PH< F
++ SAL P P
++
++ SAL Q< KU
++
++ #REGN< REJN
++ SAL R R
++
++ SAL SH< SJ
++ SAL SIN SJN
++ SAL S'S<$ S
++ SAL S S
++
++ SAL TH$< T
++ SAL TIN SJN
++ SAL T T
++
++ SAL U U
++
++ SAL
++
++ SAL < Y
++
++ SAL V V
++
++ SAL W< V
++
++ SAL X'S$< KS
++ SAL X< KS
++
++ SAL Y< I
++
++ SAL <
++
++ SAL Z'S$< S
++ SAL Z$< S
++ SAL Z Z
++
++ SAL < A
++
++ SAL <
++
++ SAL RN DN
++ SAL
++
++ SAL <
++
++ SAL <
diff --git a/runtime/spell/fo/main.aap b/runtime/spell/fo/main.aap
new file mode 100644
index 0000000..9e3eea4
--- /dev/null
+++ b/runtime/spell/fo/main.aap
@@ -0,0 +1,78 @@
+# Aap recipe for Faroese Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = fo_FO.aff fo_FO.dic
+
+all: $SPELLDIR/fo.latin1.spl $SPELLDIR/fo.utf-8.spl ../README_fo.txt
+
+$SPELLDIR/fo.latin1.spl : $FILES
+ :sys env LANG=fo_FO.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/fo fo_FO" -c q
+
+$SPELLDIR/fo.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8" -c "mkspell! $SPELLDIR/fo fo_FO" -c q
+
+../README_fo.txt : README_fo_FO.txt Copyright
+ :cat $source >! $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} fo_FO.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+fo_FO.aff fo_FO.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch fo_FO.zip
+ :sys $UNZIP fo_FO.zip
+ :delete fo_FO.zip
+ :delete contributors fo_FO.excluded Makefile COPYING
+ @if not os.path.exists('fo_FO.orig.aff'):
+ :copy fo_FO.aff fo_FO.orig.aff
+ @if not os.path.exists('fo_FO.orig.dic'):
+ :copy fo_FO.dic fo_FO.orig.dic
+ @if os.path.exists('fo_FO.diff'):
+ :sys patch <fo_FO.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 fo_FO.orig.aff fo_FO.aff >fo_FO.diff
+ :sys {force} diff -a -C 1 fo_FO.orig.dic fo_FO.dic >>fo_FO.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch fo_FO.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../fo_FO.zip
+ :sys {force} diff ../fo_FO.orig.aff fo_FO.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy fo_FO.aff ../fo_FO.new.aff
+ :sys {force} diff ../fo_FO.orig.dic fo_FO.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy fo_FO.dic ../fo_FO.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete fo_FO.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/fr/fr_FR.diff b/runtime/spell/fr/fr_FR.diff
new file mode 100644
index 0000000..2a8b6b5
--- /dev/null
+++ b/runtime/spell/fr/fr_FR.diff
@@ -0,0 +1,176 @@
+*** fr_FR.orig.aff Wed Feb 13 14:53:22 2008
+--- fr_FR.aff Wed Feb 13 15:03:20 2008
+***************
+*** 3,19 ****
+
+! MAP 12
+! MAP a
+! MAP e
+! MAP iy
+! MAP o
+! MAP u
+ MAP c
+- MAP A
+- MAP E
+- MAP IY
+- MAP O
+- MAP U
+ MAP C
+
+! REP 44
+ REP f ph
+--- 3,31 ----
+
+! FOL
+! LOW
+! UPP
+!
+! MIDWORD '-
+!
+! MAP 17
+! MAP a
+! MAP A
+! MAP e
+! MAP E
+! MAP i
+! MAP I
+! MAP o
+! MAP O
+! MAP u
+! MAP U
+! MAP n
+! MAP N
+ MAP c
+ MAP C
++ MAP y
++ MAP Y
++ MAP s
+
+!
+! REP 24
+ REP f ph
+***************
+*** 22,45 ****
+ REP qu c
+- REP bb b
+- REP b bb
+- REP cc c
+- REP c cc
+- REP ff f
+- REP f ff
+- REP ll l
+- REP l ll
+- REP mm m
+- REP m mm
+- REP nn n
+- REP n nn
+- REP pp p
+- REP p pp
+- REP rr r
+- REP r rr
+- REP ss s
+- REP s ss
+ REP ss c
+ REP c ss
+- REP tt t
+- REP t tt
+ REP oe
+--- 34,37 ----
+***************
+*** 687 ****
+--- 679,773 ----
+ SFX q ssait raient ssait
++
++
++ # sound folding from Aspell
++ # Copyright (C) 2000 Rmi Vanicat, distributed under LGPL
++ # version francais 0.000000001
++
++ #EMME ~ AME
++
++ SAL AIX$ E
++ SAL AI E
++ SAL AN(AEUIO)- AM
++ SAL AN A
++ SAL AMM AM
++ SAL AM(AEUIO)- AM
++ SAL AM A
++ SAL AUD$ O
++ SAL AUX$ O
++ SAL AU O
++ SAL A A
++ SAL A
++ SAL A
++ SAL BB P
++ SAL B P
++ SAL S
++ SAL C(EI)- S
++ SAL CU(EI)- K
++ SAL CC(EI)- X
++ SAL CC K
++ SAL CH CH
++ SAL C K
++ SAL DD T
++ SAL D T
++ SAL EMMENTAL EMATAL
++ SAL EMMENTHAL EMATAL
++ SAL EM(AEIOU)- EM
++ SAL EM A
++ SAL ET$ E
++ SAL EUX$ E
++ SAL EU E
++ SAL EN(AEUIO)- EM
++ SAL EN A
++ SAL ER$ E
++ SAL EO O
++ SAL EAUX$ O
++ SAL EAU O
++ SAL E E
++ SAL E
++ SAL E
++ SAL E
++ SAL F F
++ SAL G(EIY)- J
++ SAL GU(EIY)- G
++ SAL G G
++ SAL H _
++ SAL I I
++ SAL I
++ SAL J J
++ SAL KS X
++ SAL K K
++ SAL LL L
++ SAL L L
++ SAL MM M
++ SAL M M
++ SAL NN M
++ SAL N M
++ SAL OEU E
++ SAL OUX$ U
++ SAL OU U
++ SAL O U
++ SAL O O
++ SAL O
++ SAL PP P
++ SAL PH F
++ SAL P P
++ SAL QU K
++ SAL Q K
++ SAL RIX$ RI
++ SAL RR R
++ SAL R R
++ SAL S$ _
++ SAL SS S
++ SAL S S
++ SAL TT T
++ SAL T T
++ SAL U U
++ SAL U
++ SAL U
++ SAL V V
++ SAL W W
++ SAL X X
++ SAL Y(AEOU)- IL
++ SAL Y I
++ SAL ZZ S
++ SAL Z S
diff --git a/runtime/spell/fr/main.aap b/runtime/spell/fr/main.aap
new file mode 100644
index 0000000..a0cf374
--- /dev/null
+++ b/runtime/spell/fr/main.aap
@@ -0,0 +1,126 @@
+# Aap recipe for French Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = fr_FR.aff fr_FR.dic
+
+all: $SPELLDIR/fr.latin1.spl $SPELLDIR/fr.utf-8.spl ../README_fr.txt
+
+# The spell file is iso-8859-15, but Vim normally uses "latin1" for this.
+# This is OK for the utf-8 files, but for latin1 we need to avoid the "oe"
+# character. When unpacking we create four files:
+# fr_FR_latin1.aff modified file
+# fr_FR_latin1.dic modified file
+# fr_FR_iso15.aff original file (after applying diff)
+# fr_FR_iso15.dic original file (after applying diff)
+# Just before using the dictionary files, the right ones are copied to
+# fr_FR.aff
+# fr_FR.dic
+
+$SPELLDIR/fr.latin1.spl : $FILES
+ :copy {force} fr_FR_latin1.aff fr_FR.aff
+ :copy {force} fr_FR_latin1.dic fr_FR.dic
+ :sys env LANG=fr_FR.ISO-8859-15@euro
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/fr fr_FR" -c q
+
+$SPELLDIR/fr.utf-8.spl : $FILES
+ :copy {force} fr_FR_iso15.aff fr_FR.aff
+ :copy {force} fr_FR_iso15.dic fr_FR.dic
+ :sys env LANG=fr_FR.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/fr fr_FR" -c q
+
+../README_fr.txt : README_fr_FR.txt
+ :cat $source >!$target
+
+#
+# Used to fetch the files from OpenOffice.org. Those are old.
+# Later versions are elsewhere.
+#
+#OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+ZIPFILE = http://dico.savant.free.fr/_download/fr_FR_1-1-6.zip
+
+:attr {fetch = $ZIPFILE} fr_FR.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+fr_FR.aff fr_FR.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch fr_FR.zip
+ :sys $UNZIP fr_FR.zip
+ :delete fr_FR.zip
+ @if not os.path.exists('fr_FR.orig.aff'):
+ :copy fr_FR.aff fr_FR.orig.aff
+ @if not os.path.exists('fr_FR.orig.dic'):
+ :copy fr_FR.dic fr_FR.orig.dic
+ @if os.path.exists('fr_FR.diff'):
+ :sys patch <fr_FR.diff
+
+ # Keep the unmodified files (after diff) for ISO-8859-15.
+ :copy fr_FR.aff fr_FR_iso15.aff
+ :copy fr_FR.dic fr_FR_iso15.dic
+ # For the latin1 .dic file change all the "oe" characters to the two
+ # characters "oe".
+ :sys $VIM -u NONE -e -c "set enc=latin1"
+ -c "e fr_FR.dic"
+ -c "%s//oe/g"
+ -c "w! fr_FR_latin1.dic"
+ -c q
+ # For the latin1 .aff file delete all the "oe" and "OE" characters and
+ # delete the REP lines with those characters.
+ :sys $VIM -u NONE -e -c "set enc=latin1"
+ -c "e fr_FR.aff"
+ -c "%s///g"
+ -c "%s///g"
+ -c "%g/REP.*oe/d"
+ -c "w! fr_FR_latin1.aff"
+ -c q
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+# This uses the iso-8859-15 files.
+diff:
+ :assertpkg diff
+ :copy {force} fr_FR_iso15.aff fr_FR.aff
+ :copy {force} fr_FR_iso15.dic fr_FR.dic
+ :sys {force} diff -a -C 1 fr_FR.orig.aff fr_FR.aff >fr_FR.diff
+ :sys {force} diff -a -C 1 fr_FR.orig.dic fr_FR.dic >>fr_FR.diff
+
+# Delete all the unpacked and generated files, including the "orig" files.
+clean:
+ :delete {force} fr_FR.zip fr_FR.aff fr_FR.dic
+ fr_FR.aff.orig fr_FR.dic.orig
+ fr_FR.orig.aff fr_FR.orig.dic
+ fr_FR_latin1.aff fr_FR_latin1.dic
+ fr_FR_iso15.aff fr_FR_iso15.dic
+ README_fr_FR.txt
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch fr_FR.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../fr_FR.zip
+ :sys {force} diff ../fr_FR.orig.aff fr_FR.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy fr_FR.aff ../fr_FR.new.aff
+ :sys {force} diff ../fr_FR.orig.dic fr_FR.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy fr_FR.dic ../fr_FR.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete fr_FR.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/ga/ga_IE.diff b/runtime/spell/ga/ga_IE.diff
new file mode 100644
index 0000000..2a64d99
--- /dev/null
+++ b/runtime/spell/ga/ga_IE.diff
@@ -0,0 +1,308 @@
+*** ga_IE.orig.aff Wed Aug 31 16:48:49 2005
+--- ga_IE.aff Fri Sep 30 13:01:38 2005
+***************
+*** 37,38 ****
+--- 37,55 ----
+
++ FOL
++ LOW
++ UPP
++
++ MIDWORD '-
++
++ MAP 9
++ MAP a
++ MAP e
++ MAP i
++ MAP o
++ MAP u
++ MAP n
++ MAP c
++ MAP y
++ MAP s
++
+ PFX S Y 18
+***************
+*** 556 ****
+--- 573,853 ----
+
++ # soundslike mapping from Aspell
++ # Aspell phonetics for Irish, by Kevin Scannell <scannell@slu.edu>
++ # Copyright 2002, 2003 Kevin P. Scannell, distributed under GNU GPL
++ # version 2.0 or the Vim license (attribution by Kevin Scannell, Jan 2012)
++
++ SAL followup 0 # else breaks QU^, e.g.
++ SAL collapse_result 1 # no double letters in resulting strings
++
++ SAL ANBHANN----- *N* # epenthetic vowel, anbhanna? only, see NBH--
++ SAL ANBHAIN----- *N* # epenthetic vowel, anbhainne? only, see NBH--
++ SAL AERGA-- *R # epenthetic exception, see RG, aerga only
++ SAL AORG- *R # epenthetic exception, see RG, [ms]aorg*, etc.
++ SAL AEILG- *L # epenthetic exception, Gaeilge* only, see LG
++ SAL AILBH-- *L* # epenthetic vowel, [bcs]ailbh* only, see LBH--
++ SAL ALBHD---- *L # galbhd only, next few are exceptions to ALBH
++ SAL ALBHID----- *L # galbhid only (coinnealbhids, etc. b4)
++ SAL ALBHR--- *L # pobalbhreith, galbhruith, etc. except. to next
++ SAL ALBH-- *L* # epenthetic vowel
++ SAL ARBHD---- *R # mtarbhd only, exception to ARBH epenth.
++ SAL ARBHID----- *R # mtarbhid only, " " " "
++ SAL ARBHUIL----- *R # epenth. exception, garbhuille only, cuarbh* b4
++ SAL ARBHUA---- *R # epenth. exception, eadarbhuas* only
++ SAL ARBHIN---- *R* # exception to next, marbhintinn* only
++ SAL ARBH(EI)--- *R # epenthetic exception to next, *tarbhealach, etc.
++ SAL ARBH-- *R* # epenthetic, garbh, dearbh, etc. - [IU]ARBH b4
++ SAL ATHFH(AEIOU)--- *H # athfhill,uathfheidhmeach,etc.-exception to next
++ SAL ATH(BCDFGLMNPRST)- * # athlas, mionathr, etc. - exception to TH->H
++ SAL ADH * # bladhm, feadhain, tadhall, adhmad, -adh$, etc.
++ SAL AGHI--- * # exception to AGH, corraghiob only
++ SAL AGHLOIN------ * # " " ", pleicseaghl- only (not aghloit)
++ SAL AGH * # slaghdn, treaghd, saghas, etc.
++ SAL AOMH(FLNST)--- * # faomh[ft]-,caomhn*,naomh* only, OMH exception
++ SAL A *
++ SAL IRG- *R # epenthetic exception, see RG, tirg*, etc.
++ SAL DHU--- * # pdhuille only, exception to next
++ SAL DH * # dhil, -dh$ only
++ SAL THFH-- *H # tthfhithleann, gnthfh- only exception to next
++ SAL TH(BCDFGLMNPRST)- * # fthscal, gnth*, blthfhleasc, etc.
++ SAL *
++ SAL BANBH^$ B*N*V # epenthetic vowel, see NBH--, banbh, not -arn
++ SAL BHANBH^$ V*N*V # epenthetic vowel, see NBH--
++ SAL BAINBH^$ B*N*V # epenthetic vowel, see NBH--, bainbh only
++ SAL BHAINBH^$ V*N*V # epenthetic vowel, see NBH--
++ SAL BH V # includes bh$, eclipsis of F via collapsing
++ SAL B B # note eclipsis of P via collapsing
++ SAL CHADFA--$ K*TV # exception to FA$, (brag|do|m)
++ SAL CHEARCH-- K*R* # epenthetic vowel, chearchaill only
++ SAL CEARCH-- K*R* # epenthetic vowel, g?cearchaill only
++ SAL CHONF K*N*V # epenthetic vowel,no dash=>handles FAI?DH$excepts
++ SAL CONF K*N*V # " " " " " " "
++ SAL CANBH-- K*N* # epenthetic vowel, see NBH--, g?canbhs* only
++ SAL CHANBH-- K*N* # epenthetic vowel, see NBH--, chanbhs* only
++ SAL COLBHA--- K*L* # epenthetic vowel, see LBH--, g?colbha? only
++ SAL CHOLBHA--- K*L* # epenthetic vowel, see LBH--, cholbha? only
++ SAL CURF K*RV # exception to F$, g?curf(nna) only
++ SAL CHURF K*RV # exception to F$, churf(nna) only
++ SAL CH K # OK
++ SAL C K
++ SAL DHORCH-- K*R* # epenthetic vowel, dorcha root only
++ SAL DORCH-- T*R* # epenthetic vowel, dorcha root only
++ SAL DHEARF Y*R* # epenthetic vowel,init only, no dash=>FA except
++ SAL DEARF T*R* # epenthetic vowel,initial only (nd- done b4)
++ SAL DHEIRF- Y*R* # epenthetic vowel, initial only
++ SAL DEIRF- T*R* # epenthetic vowel, (leas)?deirf* only
++ SAL DHOIL(BF)- K*L* # epenthetic,see LBH--,initial only,dhoil(fe|bh)*
++ SAL DOIL(BF)- T*L* # epenthetic, see LBH--, " " (nd- done b4)
++ SAL DHIFEAR Y*V*R # exception to FEAR$, ^dhifear$ only
++ SAL DIFEAR T*V*R # exception to FEAR$, ^difear$ only (nd- b4)
++ SAL DH$ _ # [au]dh+most [io]dh done b4,[e]dh done here
++ SAL DH(AOU)- K # athdhchas, budhonn, comhdhil, etc.
++ SAL DH(EI)- Y # athdhan, caordhearg, cinedheighilt, etc.
++ SAL DHL(AU)-- K # comhdhlthaigh, ^dhl- only
++ SAL DHL(EI)-- Y # (m|neamh)dhl(istean|eath|thi), ^dhl only
++ SAL DHR(AOU)-- K # *dhroim,marbhdhra*,*dhr[u]ma, ^dhr only
++ SAL DHR(EI)-- Y # *dhreach,feirdhris,*dhracht,*dhreasacht,^dhr
++ SAL D T # note eclipsis of T via collapsing
++ SAL EAFAR--$ *V # geafar, meafar only, FAR$ exception
++ SAL EOFAR--$ * # silent verb ending, exception to OFAR$ except!
++ SAL EILBH-- *L* # epenthetic vowel, see LBH-- exception below
++ SAL EIDH(EI)- * # augments IDH rule,eidheann,teidheach,meidhir,etc
++ SAL EOMH(FT)--- * # leomh[ft]- only, exception to -omh rule
++ SAL E *
++ SAL ARBH-- *R # epenthetic exception, garbh- only
++ SAL ARM- *R # epenthetic exception, armh+ tarma root only
++ SAL ARG- *R # epenthetic exception, argh+(ln)?largas only
++ SAL IRG- *R # epenthetic exception, irgh+ aillirge only
++ SAL IRBH-- *R # epenthetic except. lirbhreith*, spirbhean only
++ SAL ALBH-- *L # balbhach only, exception to ALBH
++ SAL AF *V* # af only, exception to F$
++ SAL *
++ SAL FHAIRCH-- *R* # epenthetic vowel, fhairch* only
++ SAL FAIRCH-- V*R* # epenthetic vowel, (bh)?fairch* only
++ SAL FHOIRF- *R* # epenthetic vowel, foirfe root only
++ SAL FOIRF- V*R* # epenthetic vowel, initial (bh)?foirf* only
++ SAL FHONNMH-- *N* # epenthetic vowel, see NMH--, fhonnmhai?r* only
++ SAL FONNMH-- V*N* # " " " ", (bh)?fonnmhai?r* only
++ SAL FHOILMH-- *L* # epenthetic vowel, see LMH--, fhoilmhe only
++ SAL FOILMH-- V*L* # epenthetic vowel, see LMH--, (bh)?foilmhe only
++ SAL FHOLMH-- *L* # epenthetic vowel, see LMH--, fholmh* only
++ SAL FOLMH-- V*L* # epenthetic vowel, see LMH--, (bh)?folmh* only
++ SAL FEADH^$ V* # exception to verb ending below, eclipsis by luck
++ SAL FEAR^$ V*R # " " " " " " " "
++ SAL FINN^$ V*N # " " " " " " " "
++ SAL FE^$ V* # " " " " " " " "
++ SAL FA^$ V* # " " " " " " " "
++ SAL F^$ V* # " " " " " " " "
++ SAL FAIDH----$ _ # silent 'f' in verb ending
++ SAL FADH---$ _ # " " " " "
++ SAL FIDH---$ _ # " " " " "
++ SAL FEADH----$ _ # " " " " "
++ SAL FEAR---$ _ # " " " " "
++ SAL FAR--$ _ # " " " " "
++ SAL FINN---$ _ # " " " " "
++ SAL FAINN----$ _ # " " " " "
++ SAL F-$ _ # " " " " "
++ SAL FE--$ _ # " " " " "
++ SAL FA--$ _ # " " " " "
++ SAL F-$ _ # " " " " "
++ SAL FAIMI(DS)-----$ _ # " " " " " (no exceptions)
++ SAL FIMI(DS)----$ _ # " " " " " (no exceptions)
++ SAL FAIDS-----$ _ # " " " " " (no exceptions)
++ SAL FIDS----$ _ # " " " " " (no exceptions)
++ SAL FH _ # always silent
++ SAL F V
++ SAL GHAINMH-- K*N* # epenthetic vowel,see NMH--,^ghainmh* only
++ SAL GAINMH-- K*N* # epenthetic vowel,see NMH--,^gainmh* only, ng- b4
++ SAL GHEALLMH-- Y*L* # epenthetic vowel,see LMH--,gheallmhar only
++ SAL GEALLMH-- K*L* # epenthetic vowel,see LMH--,geallmhar only
++ SAL GLAFADH KL*V* # exception to FADH$, not glafarnach
++ SAL GHLAFADH KL*V* # exception to FADH$
++ SAL GLAFAIDH KL*V* # exception to FAIDH$, not glafaire
++ SAL GHLAFAIDH KL*V* # exception to FAIDH$
++ SAL GH$ _ # [aiu]gh,most ogh done b4,[e]gh all terminal
++ SAL GH(AOU)- K # bobghaiste, deoirghs, soghonta, etc.
++ SAL GH(EI)- Y # athghin, luasgharaigh, etc.
++ SAL GHL(AOU)-- K # ardghlrach, folsghlantir, etc.
++ SAL GHL(EI)-- Y # comhghlas, comhghleaca, scoiltghleann, etc.
++ SAL GHR(AOU)-- K # trghr, grianghraf, aoisghrpa, etc.
++ SAL GHR(EI)-- Y # idirghrasn, breithghreamannach, etc.
++ SAL GHN(AOU)-- K # deasghnth, neamhghnch, etc.
++ SAL GHN(EI)-- Y # leorgnomh, aonghnitheach, etc.
++ SAL G K # note eclipsis of C via collapsing
++ SAL H H # between vowels+Faranhat,forhalla,etc.
++ SAL IARG- *R # epenthetic exception, iargil, tiargil, etc.
++ SAL IARBH-- *R # iarbhis, giarbhosca, etc. epenth. exception
++ SAL IDIRBH-- *T*R # idirbheart, idirbhliain, etc., exception to IRBH
++ SAL IRBHR---- *R # muirbhrcht* only, exception to IRBH--
++ SAL IRBHU--- *R # eochairbhuille,litirbhuama only, except. to next
++ SAL IRBH-- *R* # *seirbhs, tairbh*, toirbh*, etc. epenthetic
++ SAL IF-$ *V # exception to F$, IF$ done before
++ SAL INMHE(A)---- *N # exception to next,ainmheasartha,inmheabhr, etc.
++ SAL INMHE--- *N* # epenthetic vowel, inmhe$ only by previous
++ SAL INNMH-- *N* # epenthetic vowel, fuinnmh-, coinnmhe only
++ SAL IONMHAG---- *N # exception to next, mionmhagadh only
++ SAL IONMHA--- *N* # epenthetic vowel, cionmhar only, see NMH--
++ SAL ITHFH(AEIOU)--- *H # cithfholc*,crithfhuacht,frith* only- see next
++ SAL ITH(BCDFGLMNPRST)- * # aithris, frith*, etc. exception to TH->H
++ SAL IDH(BCDFGLMNPRST)- * # feidhm, traidhfil, oidhre, etc.
++ SAL IGH(CDEFILNRST)- * # foighne,caighden,oighrigh,oighear,feighil,etc.
++ SAL I *
++ SAL ORM- *R # epenthetic exception, dorma, for- only
++ SAL OMH(BCDFGLMNPRST)--- * # (pr|r|l|sn|gn)omh- only, exceptions to omh-
++ SAL THS- * # clthseach only (no excp. for dthreabh, etc.)
++ SAL *
++ SAL J T # initial j, diosc-jaca only; bit like slender d
++ SAL K K # karat only
++ SAL LEANBH-- L*N* # epenthetic vowel, (ucht)?leanbh(aois)?,see NBH--
++ SAL LINBH-- L*N* # epenthetic vowel, (ucht)?linbh only, see NBH--
++ SAL LMH-- L # feallmhar, etc., epenth. exception
++ SAL LBH-- L # uaillbhreas, etc., epenth. exception
++ SAL LGH-- L # timpeallghearr, etc., epenth. exception
++ SAL L(BGM)- L* # epenthetic vowel, see also ULCH--
++ SAL L L
++ SAL MORFA--$ M*RV # exception to silent FA$
++ SAL MBANBH^$ M*N*V # epenthetic vowel, see NBH--, not -arn
++ SAL MBAINBH^$ M*N*V # epenthetic vowel, see NBH--
++ SAL MB^ M # eclipsis
++ SAL MHARF- V*R* # epenthetic vowel
++ SAL MARF- M*R* # epenthetic vowel, initial only
++ SAL MHODH V* # ODH exception, usually initial
++ SAL MODH M* # " " , " "
++ SAL MH V # includes mh$,/w/,/v/ + see UMH
++ SAL M M
++ SAL NAFA-- N*V # exception to FA$, snafa only
++ SAL NNARB- N*R # exception to RB epenthetic, ionnarb* only
++ SAL NNEALBH-- N*L # exception to ALBH epenthetic, coinnealbh only
++ SAL NDORCH-- N*R* # epenthetic vowel, see DORCH--
++ SAL NDEARF- N*R* # epenthetic vowel, see DEARF-
++ SAL NDEIRF- N*R* # epenthetic vowel, see DEIRF-
++ SAL NDOIL(BF)- N*L* # epenthetic vowel, see DOIL(BF)-
++ SAL NDIFEAR N*V*R # exception to FEAR$, ^ndifear$ only
++ SAL NGAINMH-- N*N* # epenthetic vowel, see GAINMH--
++ SAL NGEALLMH-- N*L* # epenthetic vowel, see GEALLMH-
++ SAL NGLAFADH NL*V* # exception to FADH$, ^nglafadh$ only
++ SAL NGLAFAIDH NL*V* # exception to FAIDH$, ^nglafaidh$ only
++ SAL NCHA(S)---- N* # epenthetic vowel, *sh?eancha(s)*,ionchas only
++ SAL NCHAIRD------ N # exception to next, daonchaird* only
++ SAL NCHAI(RS)----- N* # epenth. tionchair*, ionchais, *sh?eanchai*, etc.
++ SAL NCHAITHE------- N* # " " , sh?eanchaithe, not seanchaite
++ SAL N(DG)^ N # eclipsis
++ SAL NMH-- N # exception to N(BM)-, pianmhar, onnmhaire, etc.
++ SAL NBH-- N # " " ", aonbheannach, bunbhrat, etc.
++ SAL N(BM)- N* # epenthetic vowel, binb, ainm, etc.
++ SAL N N
++ SAL OFAR--$ *V # exception to FAR$, EOFAR done b4
++ SAL OIRCH-- *R* # epenthetic vowel, t?oirch* only
++ SAL OCALBH-- *K*L # exception to ALBH - focalbh* only
++ SAL ORBH--- *R* # epenthetic vowel, forbhs only
++ SAL ONNCHA--- *N* # epenthetic vowel fionncha, Donncha only
++ SAL OMHARB- *R # exception to epenth. R(BFGM)-, comharba* only
++ SAL OMH(BCDFGLMNPRST)- * # comh-, Domhnach, etc. (several excpts b4 this)
++ SAL OTH(BCDGLMNPRS)- * # cothrom, baothchaint, gaothscth, etc.
++ SAL ODHAO---- * # fodhao* only, exception to next
++ SAL ODH(ACLNR)- * # bodhrn,modhnaigh,todhcha,fodhla,bodhar etc.
++ SAL OGHRP----- * # foghrpa, this and next few are OGH->* excepts.
++ SAL OGHLUA----- * # so/doghluaiste* only
++ SAL OGHAF---- * # doghafa only
++ SAL OGH(ABCDFGLMNPRST)- * # ogham, foghlaim, boghdir, toghchn, etc.
++ SAL O *
++ SAL R(GM)- *R # epenthetic exception, (for)?th?rmach, rga,etc.
++ SAL GH * # gha?$ only
++ SAL *
++ SAL PH V # OK
++ SAL P B
++ SAL QU KV # ^quinn$, ^quarto$ only
++ SAL RANFA-- R*NV # exception to silent FA$, -chuaranfa only
++ SAL RAFA-- R*V # exception to silent FA$, all *graf-
++ SAL RRBHA--- R* # epenthetic vowel, cearrbh* only, no carrbhuama
++ SAL REALMH-- R*L* # epenthetic vowel, see LMH--, trealmh* only
++ SAL RFEAR^$ R*V*R # exception to FEAR$, not athrfear!
++ SAL ROMH(FT)--- R* # promh[ft]- only, exception to -omh rule
++ SAL RFEAN---- R* # epenthetic vowel, (be|se|ga)irfean only
++ SAL RFIN---$ R* # epenthetic vowel, same words as previous
++ SAL RBH-- R # corbhu, aerbhrat, etc., epenth. exception
++ SAL RMH-- R # iarmhar, lirmheas, etc., epenth. exception
++ SAL RGH-- R # daorghalar, etc., epenth. exception
++ SAL RBO-- R # cosarbolg only, epenth. exception
++ SAL R(BGM)- R* # epenthetic vowel
++ SAL R R
++ SAL SHORCH-- H*R* # epenthetic vowel, sorcha root only
++ SAL SORCH-- S*R* # epenthetic vowel, sorcha root only
++ SAL SHOILBH-- H*L* # epenthetic, see LBH--
++ SAL SOILBH-- S*L* # epenthetic, see LBH--
++ SAL SH H # OK
++ SAL S S
++ SAL TALMH-- T*L* # epenthetic vowel, see LMH--, talmhaigh only
++ SAL THALMH-- H*L* # epenthetic vowel, see LMH--, " "
++ SAL TINF(EI)- T*NV # exception to F(EA|I)DH$, d?tinf(ea|i)dh only
++ SAL THINF(EI)- H*NV # exception to F(EA|I)DH$, thinf(ea|i)dh only
++ SAL TAFA- T*V # exception to FAINN$, d?tafainn only
++ SAL THAFA- H*V # exception to FAINN$, thafainn only
++ SAL TSORCH-- T*R* # epenthetic vowel, see SORCH--
++ SAL TSOILBH-- T*L* # epenthetic vowel, see SOILBH--
++ SAL TS^ T # prefix-t
++ SAL TH$ _ # no exceptions
++ SAL TH H
++ SAL T T
++ SAL UFA(R)--$ *V # exception to FAR$, brufar/[cr]ufa only
++ SAL UARG- *R # epenthetic exception, fuarga*, tuargain only
++ SAL UAIRG- *R # epenthetic exception, tuairgn* only
++ SAL UARBH-- *R # epenthetic exception, fuarbh*, cuarbh* only
++ SAL UALGA-- *L # epenthetic exception, dualgas only
++ SAL ULLMH-- *L* # epenthetic vowel, see LMH--
++ SAL UMH * # cumhacht, umhlaocht, ciumhais, except. to MH->V
++ SAL UTH(BCDGLMNPR)- * # sruth*, guthphost only, TH->H exception
++ SAL ULCH-- *L* # epenth. vowel,ulcha,[tm]ulchn,amhulchach only
++ SAL URCH(A)--- *R* # epenthetic vowel, urchar, urchall, urchid, etc.
++ SAL UDH * # mudh* only (literary)
++ SAL UGH * # brugh* only (literary)
++ SAL U *
++ SAL IRG- *R # epenthetic exception, liotirg* only, see RG
++ SAL TH(BCDFLPR)- * # lthchleasa, dthracht, etc. - TH->H exception
++ SAL *
++ SAL V V
++ SAL W V # wigwam only
++ SAL X(AEI)-^ S # xileafn, etc.
++ SAL X^ *KS # x-gha* only
++ SAL X KS # Marxach only
++ SAL Y Y # yy only
++ SAL Z S # z, puzal, etc.
diff --git a/runtime/spell/ga/main.aap b/runtime/spell/ga/main.aap
new file mode 100644
index 0000000..d745de5
--- /dev/null
+++ b/runtime/spell/ga/main.aap
@@ -0,0 +1,79 @@
+# Aap recipe for Irish Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = ga_IE.aff ga_IE.dic
+
+all: $SPELLDIR/ga.latin1.spl $SPELLDIR/ga.utf-8.spl ../README_ga.txt
+
+# I don't have an Irish locale, use the Dutch one instead.
+$SPELLDIR/ga.latin1.spl : $FILES
+ :sys env LANG=nl_NL.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/ga ga_IE" -c q
+
+$SPELLDIR/ga.utf-8.spl : $FILES
+ :sys env LANG=nl_NL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/ga ga_IE" -c q
+
+../README_ga.txt : README_ga_IE.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} ga_IE.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+ga_IE.aff ga_IE.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch ga_IE.zip
+ :sys $UNZIP ga_IE.zip
+ :delete ga_IE.zip
+ @if not os.path.exists('ga_IE.orig.aff'):
+ :copy ga_IE.aff ga_IE.orig.aff
+ @if not os.path.exists('ga_IE.orig.dic'):
+ :copy ga_IE.dic ga_IE.orig.dic
+ @if os.path.exists('ga_IE.diff'):
+ :sys patch <ga_IE.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 ga_IE.orig.aff ga_IE.aff >ga_IE.diff
+ :sys {force} diff -a -C 1 ga_IE.orig.dic ga_IE.dic >>ga_IE.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch ga_IE.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../ga_IE.zip
+ :sys {force} diff ../ga_IE.orig.aff ga_IE.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ga_IE.aff ../ga_IE.new.aff
+ :sys {force} diff ../ga_IE.orig.dic ga_IE.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ga_IE.dic ../ga_IE.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete ga_IE.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/gd/gd_GB.diff b/runtime/spell/gd/gd_GB.diff
new file mode 100644
index 0000000..36aa12d
--- /dev/null
+++ b/runtime/spell/gd/gd_GB.diff
@@ -0,0 +1,304 @@
+*** gd_GB.orig.aff Wed Aug 31 20:50:02 2005
+--- gd_GB.aff Fri Sep 30 13:04:30 2005
+***************
+*** 19 ****
+--- 19,317 ----
+ TRY ahinrdesclgoutmbf-ACTBpGSDMIRPLNEFO'UH
++
++ FOL
++ LOW
++ UPP
++
++ MIDWORD '-
++
++ MAP 9
++ MAP a
++ MAP e
++ MAP i
++ MAP o
++ MAP u
++ MAP n
++ MAP c
++ MAP y
++ MAP s
++
++ # soundslike mapping from Aspell
++ # Aspell phonetics for Irish, by Kevin Scannell <scannell@slu.edu>
++ # Copyright 2002, 2003 Kevin P. Scannell, distributed under GNU GPL
++ # version 2.0 or the Vim license (attribution by Kevin Scannell, Jan 2012)
++
++ SAL followup 0 # else breaks QU^, e.g.
++ SAL collapse_result 1 # no double letters in resulting strings
++
++ SAL ANBHANN----- *N* # epenthetic vowel, anbhanna? only, see NBH--
++ SAL ANBHAIN----- *N* # epenthetic vowel, anbhainne? only, see NBH--
++ SAL AERGA-- *R # epenthetic exception, see RG, aerga only
++ SAL AORG- *R # epenthetic exception, see RG, [ms]aorg*, etc.
++ SAL AEILG- *L # epenthetic exception, Gaeilge* only, see LG
++ SAL AILBH-- *L* # epenthetic vowel, [bcs]ailbh* only, see LBH--
++ SAL ALBHD---- *L # galbhd only, next few are exceptions to ALBH
++ SAL ALBHID----- *L # galbhid only (coinnealbhids, etc. b4)
++ SAL ALBHR--- *L # pobalbhreith, galbhruith, etc. except. to next
++ SAL ALBH-- *L* # epenthetic vowel
++ SAL ARBHD---- *R # mtarbhd only, exception to ARBH epenth.
++ SAL ARBHID----- *R # mtarbhid only, " " " "
++ SAL ARBHUIL----- *R # epenth. exception, garbhuille only, cuarbh* b4
++ SAL ARBHUA---- *R # epenth. exception, eadarbhuas* only
++ SAL ARBHIN---- *R* # exception to next, marbhintinn* only
++ SAL ARBH(EI)--- *R # epenthetic exception to next, *tarbhealach, etc.
++ SAL ARBH-- *R* # epenthetic, garbh, dearbh, etc. - [IU]ARBH b4
++ SAL ATHFH(AEIOU)--- *H # athfhill,uathfheidhmeach,etc.-exception to next
++ SAL ATH(BCDFGLMNPRST)- * # athlas, mionathr, etc. - exception to TH->H
++ SAL ADH * # bladhm, feadhain, tadhall, adhmad, -adh$, etc.
++ SAL AGHI--- * # exception to AGH, corraghiob only
++ SAL AGHLOIN------ * # " " ", pleicseaghl- only (not aghloit)
++ SAL AGH * # slaghdn, treaghd, saghas, etc.
++ SAL AOMH(FLNST)--- * # faomh[ft]-,caomhn*,naomh* only, OMH exception
++ SAL A *
++ SAL IRG- *R # epenthetic exception, see RG, tirg*, etc.
++ SAL DHU--- * # pdhuille only, exception to next
++ SAL DH * # dhil, -dh$ only
++ SAL THFH-- *H # tthfhithleann, gnthfh- only exception to next
++ SAL TH(BCDFGLMNPRST)- * # fthscal, gnth*, blthfhleasc, etc.
++ SAL *
++ SAL BANBH^$ B*N*V # epenthetic vowel, see NBH--, banbh, not -arn
++ SAL BHANBH^$ V*N*V # epenthetic vowel, see NBH--
++ SAL BAINBH^$ B*N*V # epenthetic vowel, see NBH--, bainbh only
++ SAL BHAINBH^$ V*N*V # epenthetic vowel, see NBH--
++ SAL BH V # includes bh$, eclipsis of F via collapsing
++ SAL B B # note eclipsis of P via collapsing
++ SAL CHADFA--$ K*TV # exception to FA$, (brag|do|m)
++ SAL CHEARCH-- K*R* # epenthetic vowel, chearchaill only
++ SAL CEARCH-- K*R* # epenthetic vowel, g?cearchaill only
++ SAL CHONF K*N*V # epenthetic vowel,no dash=>handles FAI?DH$excepts
++ SAL CONF K*N*V # " " " " " " "
++ SAL CANBH-- K*N* # epenthetic vowel, see NBH--, g?canbhs* only
++ SAL CHANBH-- K*N* # epenthetic vowel, see NBH--, chanbhs* only
++ SAL COLBHA--- K*L* # epenthetic vowel, see LBH--, g?colbha? only
++ SAL CHOLBHA--- K*L* # epenthetic vowel, see LBH--, cholbha? only
++ SAL CURF K*RV # exception to F$, g?curf(nna) only
++ SAL CHURF K*RV # exception to F$, churf(nna) only
++ SAL CH K # OK
++ SAL C K
++ SAL DHORCH-- K*R* # epenthetic vowel, dorcha root only
++ SAL DORCH-- T*R* # epenthetic vowel, dorcha root only
++ SAL DHEARF Y*R* # epenthetic vowel,init only, no dash=>FA except
++ SAL DEARF T*R* # epenthetic vowel,initial only (nd- done b4)
++ SAL DHEIRF- Y*R* # epenthetic vowel, initial only
++ SAL DEIRF- T*R* # epenthetic vowel, (leas)?deirf* only
++ SAL DHOIL(BF)- K*L* # epenthetic,see LBH--,initial only,dhoil(fe|bh)*
++ SAL DOIL(BF)- T*L* # epenthetic, see LBH--, " " (nd- done b4)
++ SAL DHIFEAR Y*V*R # exception to FEAR$, ^dhifear$ only
++ SAL DIFEAR T*V*R # exception to FEAR$, ^difear$ only (nd- b4)
++ SAL DH$ _ # [au]dh+most [io]dh done b4,[e]dh done here
++ SAL DH(AOU)- K # athdhchas, budhonn, comhdhil, etc.
++ SAL DH(EI)- Y # athdhan, caordhearg, cinedheighilt, etc.
++ SAL DHL(AU)-- K # comhdhlthaigh, ^dhl- only
++ SAL DHL(EI)-- Y # (m|neamh)dhl(istean|eath|thi), ^dhl only
++ SAL DHR(AOU)-- K # *dhroim,marbhdhra*,*dhr[u]ma, ^dhr only
++ SAL DHR(EI)-- Y # *dhreach,feirdhris,*dhracht,*dhreasacht,^dhr
++ SAL D T # note eclipsis of T via collapsing
++ SAL EAFAR--$ *V # geafar, meafar only, FAR$ exception
++ SAL EOFAR--$ * # silent verb ending, exception to OFAR$ except!
++ SAL EILBH-- *L* # epenthetic vowel, see LBH-- exception below
++ SAL EIDH(EI)- * # augments IDH rule,eidheann,teidheach,meidhir,etc
++ SAL EOMH(FT)--- * # leomh[ft]- only, exception to -omh rule
++ SAL E *
++ SAL ARBH-- *R # epenthetic exception, garbh- only
++ SAL ARM- *R # epenthetic exception, armh+ tarma root only
++ SAL ARG- *R # epenthetic exception, argh+(ln)?largas only
++ SAL IRG- *R # epenthetic exception, irgh+ aillirge only
++ SAL IRBH-- *R # epenthetic except. lirbhreith*, spirbhean only
++ SAL ALBH-- *L # balbhach only, exception to ALBH
++ SAL AF *V* # af only, exception to F$
++ SAL *
++ SAL FHAIRCH-- *R* # epenthetic vowel, fhairch* only
++ SAL FAIRCH-- V*R* # epenthetic vowel, (bh)?fairch* only
++ SAL FHOIRF- *R* # epenthetic vowel, foirfe root only
++ SAL FOIRF- V*R* # epenthetic vowel, initial (bh)?foirf* only
++ SAL FHONNMH-- *N* # epenthetic vowel, see NMH--, fhonnmhai?r* only
++ SAL FONNMH-- V*N* # " " " ", (bh)?fonnmhai?r* only
++ SAL FHOILMH-- *L* # epenthetic vowel, see LMH--, fhoilmhe only
++ SAL FOILMH-- V*L* # epenthetic vowel, see LMH--, (bh)?foilmhe only
++ SAL FHOLMH-- *L* # epenthetic vowel, see LMH--, fholmh* only
++ SAL FOLMH-- V*L* # epenthetic vowel, see LMH--, (bh)?folmh* only
++ SAL FEADH^$ V* # exception to verb ending below, eclipsis by luck
++ SAL FEAR^$ V*R # " " " " " " " "
++ SAL FINN^$ V*N # " " " " " " " "
++ SAL FE^$ V* # " " " " " " " "
++ SAL FA^$ V* # " " " " " " " "
++ SAL F^$ V* # " " " " " " " "
++ SAL FAIDH----$ _ # silent 'f' in verb ending
++ SAL FADH---$ _ # " " " " "
++ SAL FIDH---$ _ # " " " " "
++ SAL FEADH----$ _ # " " " " "
++ SAL FEAR---$ _ # " " " " "
++ SAL FAR--$ _ # " " " " "
++ SAL FINN---$ _ # " " " " "
++ SAL FAINN----$ _ # " " " " "
++ SAL F-$ _ # " " " " "
++ SAL FE--$ _ # " " " " "
++ SAL FA--$ _ # " " " " "
++ SAL F-$ _ # " " " " "
++ SAL FAIMI(DS)-----$ _ # " " " " " (no exceptions)
++ SAL FIMI(DS)----$ _ # " " " " " (no exceptions)
++ SAL FAIDS-----$ _ # " " " " " (no exceptions)
++ SAL FIDS----$ _ # " " " " " (no exceptions)
++ SAL FH _ # always silent
++ SAL F V
++ SAL GHAINMH-- K*N* # epenthetic vowel,see NMH--,^ghainmh* only
++ SAL GAINMH-- K*N* # epenthetic vowel,see NMH--,^gainmh* only, ng- b4
++ SAL GHEALLMH-- Y*L* # epenthetic vowel,see LMH--,gheallmhar only
++ SAL GEALLMH-- K*L* # epenthetic vowel,see LMH--,geallmhar only
++ SAL GLAFADH KL*V* # exception to FADH$, not glafarnach
++ SAL GHLAFADH KL*V* # exception to FADH$
++ SAL GLAFAIDH KL*V* # exception to FAIDH$, not glafaire
++ SAL GHLAFAIDH KL*V* # exception to FAIDH$
++ SAL GH$ _ # [aiu]gh,most ogh done b4,[e]gh all terminal
++ SAL GH(AOU)- K # bobghaiste, deoirghs, soghonta, etc.
++ SAL GH(EI)- Y # athghin, luasgharaigh, etc.
++ SAL GHL(AOU)-- K # ardghlrach, folsghlantir, etc.
++ SAL GHL(EI)-- Y # comhghlas, comhghleaca, scoiltghleann, etc.
++ SAL GHR(AOU)-- K # trghr, grianghraf, aoisghrpa, etc.
++ SAL GHR(EI)-- Y # idirghrasn, breithghreamannach, etc.
++ SAL GHN(AOU)-- K # deasghnth, neamhghnch, etc.
++ SAL GHN(EI)-- Y # leorgnomh, aonghnitheach, etc.
++ SAL G K # note eclipsis of C via collapsing
++ SAL H H # between vowels+Faranhat,forhalla,etc.
++ SAL IARG- *R # epenthetic exception, iargil, tiargil, etc.
++ SAL IARBH-- *R # iarbhis, giarbhosca, etc. epenth. exception
++ SAL IDIRBH-- *T*R # idirbheart, idirbhliain, etc., exception to IRBH
++ SAL IRBHR---- *R # muirbhrcht* only, exception to IRBH--
++ SAL IRBHU--- *R # eochairbhuille,litirbhuama only, except. to next
++ SAL IRBH-- *R* # *seirbhs, tairbh*, toirbh*, etc. epenthetic
++ SAL IF-$ *V # exception to F$, IF$ done before
++ SAL INMHE(A)---- *N # exception to next,ainmheasartha,inmheabhr, etc.
++ SAL INMHE--- *N* # epenthetic vowel, inmhe$ only by previous
++ SAL INNMH-- *N* # epenthetic vowel, fuinnmh-, coinnmhe only
++ SAL IONMHAG---- *N # exception to next, mionmhagadh only
++ SAL IONMHA--- *N* # epenthetic vowel, cionmhar only, see NMH--
++ SAL ITHFH(AEIOU)--- *H # cithfholc*,crithfhuacht,frith* only- see next
++ SAL ITH(BCDFGLMNPRST)- * # aithris, frith*, etc. exception to TH->H
++ SAL IDH(BCDFGLMNPRST)- * # feidhm, traidhfil, oidhre, etc.
++ SAL IGH(CDEFILNRST)- * # foighne,caighden,oighrigh,oighear,feighil,etc.
++ SAL I *
++ SAL ORM- *R # epenthetic exception, dorma, for- only
++ SAL OMH(BCDFGLMNPRST)--- * # (pr|r|l|sn|gn)omh- only, exceptions to omh-
++ SAL THS- * # clthseach only (no excp. for dthreabh, etc.)
++ SAL *
++ SAL J T # initial j, diosc-jaca only; bit like slender d
++ SAL K K # karat only
++ SAL LEANBH-- L*N* # epenthetic vowel, (ucht)?leanbh(aois)?,see NBH--
++ SAL LINBH-- L*N* # epenthetic vowel, (ucht)?linbh only, see NBH--
++ SAL LMH-- L # feallmhar, etc., epenth. exception
++ SAL LBH-- L # uaillbhreas, etc., epenth. exception
++ SAL LGH-- L # timpeallghearr, etc., epenth. exception
++ SAL L(BGM)- L* # epenthetic vowel, see also ULCH--
++ SAL L L
++ SAL MORFA--$ M*RV # exception to silent FA$
++ SAL MBANBH^$ M*N*V # epenthetic vowel, see NBH--, not -arn
++ SAL MBAINBH^$ M*N*V # epenthetic vowel, see NBH--
++ SAL MB^ M # eclipsis
++ SAL MHARF- V*R* # epenthetic vowel
++ SAL MARF- M*R* # epenthetic vowel, initial only
++ SAL MHODH V* # ODH exception, usually initial
++ SAL MODH M* # " " , " "
++ SAL MH V # includes mh$,/w/,/v/ + see UMH
++ SAL M M
++ SAL NAFA-- N*V # exception to FA$, snafa only
++ SAL NNARB- N*R # exception to RB epenthetic, ionnarb* only
++ SAL NNEALBH-- N*L # exception to ALBH epenthetic, coinnealbh only
++ SAL NDORCH-- N*R* # epenthetic vowel, see DORCH--
++ SAL NDEARF- N*R* # epenthetic vowel, see DEARF-
++ SAL NDEIRF- N*R* # epenthetic vowel, see DEIRF-
++ SAL NDOIL(BF)- N*L* # epenthetic vowel, see DOIL(BF)-
++ SAL NDIFEAR N*V*R # exception to FEAR$, ^ndifear$ only
++ SAL NGAINMH-- N*N* # epenthetic vowel, see GAINMH--
++ SAL NGEALLMH-- N*L* # epenthetic vowel, see GEALLMH-
++ SAL NGLAFADH NL*V* # exception to FADH$, ^nglafadh$ only
++ SAL NGLAFAIDH NL*V* # exception to FAIDH$, ^nglafaidh$ only
++ SAL NCHA(S)---- N* # epenthetic vowel, *sh?eancha(s)*,ionchas only
++ SAL NCHAIRD------ N # exception to next, daonchaird* only
++ SAL NCHAI(RS)----- N* # epenth. tionchair*, ionchais, *sh?eanchai*, etc.
++ SAL NCHAITHE------- N* # " " , sh?eanchaithe, not seanchaite
++ SAL N(DG)^ N # eclipsis
++ SAL NMH-- N # exception to N(BM)-, pianmhar, onnmhaire, etc.
++ SAL NBH-- N # " " ", aonbheannach, bunbhrat, etc.
++ SAL N(BM)- N* # epenthetic vowel, binb, ainm, etc.
++ SAL N N
++ SAL OFAR--$ *V # exception to FAR$, EOFAR done b4
++ SAL OIRCH-- *R* # epenthetic vowel, t?oirch* only
++ SAL OCALBH-- *K*L # exception to ALBH - focalbh* only
++ SAL ORBH--- *R* # epenthetic vowel, forbhs only
++ SAL ONNCHA--- *N* # epenthetic vowel fionncha, Donncha only
++ SAL OMHARB- *R # exception to epenth. R(BFGM)-, comharba* only
++ SAL OMH(BCDFGLMNPRST)- * # comh-, Domhnach, etc. (several excpts b4 this)
++ SAL OTH(BCDGLMNPRS)- * # cothrom, baothchaint, gaothscth, etc.
++ SAL ODHAO---- * # fodhao* only, exception to next
++ SAL ODH(ACLNR)- * # bodhrn,modhnaigh,todhcha,fodhla,bodhar etc.
++ SAL OGHRP----- * # foghrpa, this and next few are OGH->* excepts.
++ SAL OGHLUA----- * # so/doghluaiste* only
++ SAL OGHAF---- * # doghafa only
++ SAL OGH(ABCDFGLMNPRST)- * # ogham, foghlaim, boghdir, toghchn, etc.
++ SAL O *
++ SAL R(GM)- *R # epenthetic exception, (for)?th?rmach, rga,etc.
++ SAL GH * # gha?$ only
++ SAL *
++ SAL PH V # OK
++ SAL P B
++ SAL QU KV # ^quinn$, ^quarto$ only
++ SAL RANFA-- R*NV # exception to silent FA$, -chuaranfa only
++ SAL RAFA-- R*V # exception to silent FA$, all *graf-
++ SAL RRBHA--- R* # epenthetic vowel, cearrbh* only, no carrbhuama
++ SAL REALMH-- R*L* # epenthetic vowel, see LMH--, trealmh* only
++ SAL RFEAR^$ R*V*R # exception to FEAR$, not athrfear!
++ SAL ROMH(FT)--- R* # promh[ft]- only, exception to -omh rule
++ SAL RFEAN---- R* # epenthetic vowel, (be|se|ga)irfean only
++ SAL RFIN---$ R* # epenthetic vowel, same words as previous
++ SAL RBH-- R # corbhu, aerbhrat, etc., epenth. exception
++ SAL RMH-- R # iarmhar, lirmheas, etc., epenth. exception
++ SAL RGH-- R # daorghalar, etc., epenth. exception
++ SAL RBO-- R # cosarbolg only, epenth. exception
++ SAL R(BGM)- R* # epenthetic vowel
++ SAL R R
++ SAL SHORCH-- H*R* # epenthetic vowel, sorcha root only
++ SAL SORCH-- S*R* # epenthetic vowel, sorcha root only
++ SAL SHOILBH-- H*L* # epenthetic, see LBH--
++ SAL SOILBH-- S*L* # epenthetic, see LBH--
++ SAL SH H # OK
++ SAL S S
++ SAL TALMH-- T*L* # epenthetic vowel, see LMH--, talmhaigh only
++ SAL THALMH-- H*L* # epenthetic vowel, see LMH--, " "
++ SAL TINF(EI)- T*NV # exception to F(EA|I)DH$, d?tinf(ea|i)dh only
++ SAL THINF(EI)- H*NV # exception to F(EA|I)DH$, thinf(ea|i)dh only
++ SAL TAFA- T*V # exception to FAINN$, d?tafainn only
++ SAL THAFA- H*V # exception to FAINN$, thafainn only
++ SAL TSORCH-- T*R* # epenthetic vowel, see SORCH--
++ SAL TSOILBH-- T*L* # epenthetic vowel, see SOILBH--
++ SAL TS^ T # prefix-t
++ SAL TH$ _ # no exceptions
++ SAL TH H
++ SAL T T
++ SAL UFA(R)--$ *V # exception to FAR$, brufar/[cr]ufa only
++ SAL UARG- *R # epenthetic exception, fuarga*, tuargain only
++ SAL UAIRG- *R # epenthetic exception, tuairgn* only
++ SAL UARBH-- *R # epenthetic exception, fuarbh*, cuarbh* only
++ SAL UALGA-- *L # epenthetic exception, dualgas only
++ SAL ULLMH-- *L* # epenthetic vowel, see LMH--
++ SAL UMH * # cumhacht, umhlaocht, ciumhais, except. to MH->V
++ SAL UTH(BCDGLMNPR)- * # sruth*, guthphost only, TH->H exception
++ SAL ULCH-- *L* # epenth. vowel,ulcha,[tm]ulchn,amhulchach only
++ SAL URCH(A)--- *R* # epenthetic vowel, urchar, urchall, urchid, etc.
++ SAL UDH * # mudh* only (literary)
++ SAL UGH * # brugh* only (literary)
++ SAL U *
++ SAL IRG- *R # epenthetic exception, liotirg* only, see RG
++ SAL TH(BCDFLPR)- * # lthchleasa, dthracht, etc. - TH->H exception
++ SAL *
++ SAL V V
++ SAL W V # wigwam only
++ SAL X(AEI)-^ S # xileafn, etc.
++ SAL X^ *KS # x-gha* only
++ SAL X KS # Marxach only
++ SAL Y Y # yy only
++ SAL Z S # z, puzal, etc.
diff --git a/runtime/spell/gd/main.aap b/runtime/spell/gd/main.aap
new file mode 100644
index 0000000..55443ae
--- /dev/null
+++ b/runtime/spell/gd/main.aap
@@ -0,0 +1,77 @@
+# Aap recipe for Scottish Gaelic Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = gd_GB.aff gd_GB.dic
+
+all: $SPELLDIR/gd.latin1.spl $SPELLDIR/gd.utf-8.spl ../README_gd.txt
+
+$SPELLDIR/gd.latin1.spl : $FILES
+ :sys env LANG=gd_GB.ISO8859-15
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/gd gd_GB" -c q
+
+$SPELLDIR/gd.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8" -c "mkspell! $SPELLDIR/gd gd_GB" -c q
+
+../README_gd.txt : README_gd_GB.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} gd_GB.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+gd_GB.aff gd_GB.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch gd_GB.zip
+ :sys $UNZIP gd_GB.zip
+ :delete gd_GB.zip
+ @if not os.path.exists('gd_GB.orig.aff'):
+ :copy gd_GB.aff gd_GB.orig.aff
+ @if not os.path.exists('gd_GB.orig.dic'):
+ :copy gd_GB.dic gd_GB.orig.dic
+ @if os.path.exists('gd_GB.diff'):
+ :sys patch <gd_GB.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 gd_GB.orig.aff gd_GB.aff >gd_GB.diff
+ :sys {force} diff -a -C 1 gd_GB.orig.dic gd_GB.dic >>gd_GB.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch gd_GB.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../gd_GB.zip
+ :sys {force} diff ../gd_GB.orig.aff gd_GB.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy gd_GB.aff ../gd_GB.new.aff
+ :sys {force} diff ../gd_GB.orig.dic gd_GB.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy gd_GB.dic ../gd_GB.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete gd_GB.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/gl/gl_ES.diff b/runtime/spell/gl/gl_ES.diff
new file mode 100644
index 0000000..be56937
--- /dev/null
+++ b/runtime/spell/gl/gl_ES.diff
@@ -0,0 +1,72 @@
+*** gl_ES.orig.aff Tue Aug 16 17:59:15 2005
+--- gl_ES.aff Fri Sep 30 13:06:45 2005
+***************
+*** 2,3 ****
+--- 2,8 ----
+ TRY esianrtolcdugmphbfv
++
++ FOL
++ LOW
++ UPP
++
+ # COMPOUNDMIN 3
+***************
+*** 1172 ****
+--- 1177,1233 ----
+ SFX C ionar cin cionar
++
++ # soundslike mapping from Aspell
++ # Copyright (C) 2000 Ramn Flores, distributed under GNU GPL
++ # Ramn Flores may be reached by email at fa2ramon@usc.es
++ # version galega 0.1
++
++ SAL followup 0
++ SAL collapse_result 0
++
++ SAL A
++ SAL A A
++ SAL BEL$ BLE
++ SAL BL L
++ SAL BM M
++ SAL BS S
++ SAL BT T
++ SAL B B
++ SAL C(EI) S
++ SAL C K
++ SAL D D
++ SAL E
++ SAL EI EC
++ SAL EI EP
++ SAL E E
++ SAL F F
++ SAL G G
++ SAL H _
++ SAL I
++ SAL IT ICT
++ SAL I I
++ SAL J X
++ SAL K K
++ SAL L L
++ SAL M M
++ SAL N MN
++ SAL N NN
++ SAL N N
++ SAL O
++ SAL N$ IN
++ SAL O O
++ SAL PS S
++ SAL QU K
++ SAL R R
++ SAL S S
++ SAL T T
++ SAL U
++ SAL UT UCT
++ SAL U U
++ SAL V B
++ SAL X S
++ SAL X G
++ SAL X J
++ SAL Y I
++ SAL ZA$ CIA
++ SAL ZO$ CIO
++ SAL Z S
diff --git a/runtime/spell/gl/main.aap b/runtime/spell/gl/main.aap
new file mode 100644
index 0000000..504fda0
--- /dev/null
+++ b/runtime/spell/gl/main.aap
@@ -0,0 +1,78 @@
+# Aap recipe for Galician (Spain) Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = gl_ES.aff gl_ES.dic
+
+all: $SPELLDIR/gl.latin1.spl $SPELLDIR/gl.utf-8.spl ../README_gl.txt
+
+$SPELLDIR/gl.latin1.spl : $FILES
+ :sys env LANG=es_ES.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/gl gl_ES" -c q
+
+$SPELLDIR/gl.utf-8.spl : $FILES
+ :sys env LANG=es_ES.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/gl gl_ES" -c q
+
+../README_gl.txt : README_gl_ES.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} gl_ES.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+gl_ES.aff gl_ES.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch gl_ES.zip
+ :sys $UNZIP gl_ES.zip
+ :delete gl_ES.zip
+ @if not os.path.exists('gl_ES.orig.aff'):
+ :copy gl_ES.aff gl_ES.orig.aff
+ @if not os.path.exists('gl_ES.orig.dic'):
+ :copy gl_ES.dic gl_ES.orig.dic
+ @if os.path.exists('gl_ES.diff'):
+ :sys patch <gl_ES.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 gl_ES.orig.aff gl_ES.aff >gl_ES.diff
+ :sys {force} diff -a -C 1 gl_ES.orig.dic gl_ES.dic >>gl_ES.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch gl_ES.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../gl_ES.zip
+ :sys {force} diff ../gl_ES.orig.aff gl_ES.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy gl_ES.aff ../gl_ES.new.aff
+ :sys {force} diff ../gl_ES.orig.dic gl_ES.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy gl_ES.dic ../gl_ES.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete gl_ES.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/he.vim b/runtime/spell/he.vim
new file mode 100644
index 0000000..76f52c4
--- /dev/null
+++ b/runtime/spell/he.vim
@@ -0,0 +1,10 @@
+" For Hebrew capitals should not be checked. But only change the
+" 'spellcapcheck' option when it is not at its default value.
+let s:spc = &l:spc
+setlocal spc&
+if s:spc == &l:spc
+ setlocal spc=
+else
+ let &l:spc = s:spc
+endif
+unlet s:spc
diff --git a/runtime/spell/he/he_IL.diff b/runtime/spell/he/he_IL.diff
new file mode 100644
index 0000000..ece381f
--- /dev/null
+++ b/runtime/spell/he/he_IL.diff
@@ -0,0 +1,76 @@
+*** he_IL.orig.aff Sun Jul 3 19:40:02 2005
+--- he_IL.aff Tue Aug 9 22:32:47 2005
+***************
+*** 2,3 ****
+--- 2,6 ----
+ TRY '"
++
++ PFXPOSTPONE
++
+ # This file was generated automatically from data prepared
+*** he_IL.orig.dic Sun Jul 3 19:40:02 2005
+--- he_IL.dic Sun Jul 3 19:40:02 2005
+***************
+*** 318898,318902 ****
+
+-
+
+-
+
+--- 318898,318900 ----
+***************
+*** 318911,318913 ****
+
+-
+
+--- 318909,318910 ----
+***************
+*** 318935,318950 ****
+
+-
+
+-
+-
+-
+
+-
+
+-
+
+-
+
+
+-
+
+--- 318932,318939 ----
+***************
+*** 318954,318964 ****
+
+-
+
+-
+
+-
+
+-
+
+-
+
+--- 318943,318948 ----
+***************
+*** 318978,318980 ****
+
+-
+
+--- 318962,318963 ----
+***************
+*** 318996,319003 ****
+
+-
+
+-
+
+
+-
+
+--- 318979,318983 ----
diff --git a/runtime/spell/he/main.aap b/runtime/spell/he/main.aap
new file mode 100644
index 0000000..7158517
--- /dev/null
+++ b/runtime/spell/he/main.aap
@@ -0,0 +1,78 @@
+# Aap recipe for Hebrew Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = he_IL.aff he_IL.dic
+
+all: $SPELLDIR/he.utf-8.spl $SPELLDIR/he.iso-8859-8.spl ../README_he.txt
+
+$SPELLDIR/he.utf-8.spl : $FILES
+ :sys env LANG=he_IL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/he he_IL" -c q
+
+$SPELLDIR/he.iso-8859-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=iso-8859-8"
+ -c "mkspell! $SPELLDIR/he he_IL" -c q
+
+../README_he.txt : README_he_IL.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} he_IL.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+he_IL.aff he_IL.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch he_IL.zip
+ :sys $UNZIP he_IL.zip
+ :delete he_IL.zip
+ @if not os.path.exists('he_IL.orig.aff'):
+ :copy he_IL.aff he_IL.orig.aff
+ @if not os.path.exists('he_IL.orig.dic'):
+ :copy he_IL.dic he_IL.orig.dic
+ @if os.path.exists('he_IL.diff'):
+ :sys patch <he_IL.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 he_IL.orig.aff he_IL.aff >he_IL.diff
+ :sys {force} diff -a -C 1 he_IL.orig.dic he_IL.dic >>he_IL.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch he_IL.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../he_IL.zip
+ :sys {force} diff ../he_IL.orig.aff he_IL.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy he_IL.aff ../he_IL.new.aff
+ :sys {force} diff ../he_IL.orig.dic he_IL.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy he_IL.dic ../he_IL.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete he_IL.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/hr/hr_HR.diff b/runtime/spell/hr/hr_HR.diff
new file mode 100644
index 0000000..68faebc
--- /dev/null
+++ b/runtime/spell/hr/hr_HR.diff
@@ -0,0 +1,11 @@
+*** hr_HR.orig.aff Sun Aug 14 20:00:56 2005
+--- hr_HR.aff Wed Aug 17 17:11:35 2005
+***************
+*** 4,5 ****
+--- 4,9 ----
+
++ FOL
++ LOW
++ UPP
++
+ SFX A N 1
diff --git a/runtime/spell/hr/main.aap b/runtime/spell/hr/main.aap
new file mode 100644
index 0000000..1b998ca
--- /dev/null
+++ b/runtime/spell/hr/main.aap
@@ -0,0 +1,81 @@
+# Aap recipe for Croatian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = hr_HR.aff hr_HR.dic
+
+all: $SPELLDIR/hr.iso-8859-2.spl $SPELLDIR/hr.utf-8.spl \
+ $SPELLDIR/hr.cp1250.spl ../README_hr.txt
+
+$SPELLDIR/hr.iso-8859-2.spl : $FILES
+ :sys env LANG=hr_HR.ISO8859-2 $VIM -u NONE -e -c "mkspell! $SPELLDIR/hr hr_HR" -c q
+
+$SPELLDIR/hr.utf-8.spl : $FILES
+ :sys env LANG=hr_HR.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/hr hr_HR" -c q
+
+$SPELLDIR/hr.cp1250.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=cp1250" -c "mkspell! $SPELLDIR/hr hr_HR" -c q
+
+../README_hr.txt: README_hr_HR.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} hr_HR.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+hr_HR.aff hr_HR.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch hr_HR.zip
+ :sys $UNZIP hr_HR.zip
+ :delete hr_HR.zip
+ @if not os.path.exists('hr_HR.orig.aff'):
+ :copy hr_HR.aff hr_HR.orig.aff
+ @if not os.path.exists('hr_HR.orig.dic'):
+ :copy hr_HR.dic hr_HR.orig.dic
+ @if os.path.exists('hr_HR.diff'):
+ :sys patch <hr_HR.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 hr_HR.orig.aff hr_HR.aff >hr_HR.diff
+ :sys {force} diff -a -C 1 hr_HR.orig.dic hr_HR.dic >>hr_HR.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch hr_HR.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../hr_HR.zip
+ :sys {force} diff ../hr_HR.orig.aff hr_HR.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy hr_HR.aff ../hr_HR.new.aff
+ :sys {force} diff ../hr_HR.orig.dic hr_HR.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy hr_HR.dic ../hr_HR.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete hr_HR.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/hu/hu_HU.diff b/runtime/spell/hu/hu_HU.diff
new file mode 100644
index 0000000..cccd0ab
--- /dev/null
+++ b/runtime/spell/hu/hu_HU.diff
@@ -0,0 +1,183 @@
+*** hu_HU.orig.aff Wed Apr 12 12:33:23 2006
+--- hu_HU.aff Wed Apr 12 12:43:39 2006
+***************
+*** 58,60 ****
+ NAME Magyar Ispell helyesrsi sztr
+! LANG hu_HU
+ HOME http://magyarispell.sourceforge.net
+--- 58,60 ----
+ NAME Magyar Ispell helyesrsi sztr
+! #LANG hu_HU
+ HOME http://magyarispell.sourceforge.net
+***************
+*** 64,77 ****
+ COMPOUNDMIN 2
+! COMPOUNDFLAG Y
+! COMPOUNDWORD 2 y
+! COMPOUNDSYLLABLE 6 aeiou
+! SYLLABLENUM klmc
+! COMPOUNDFIRST v
+! COMPOUNDLAST x
+! FORBIDDENWORD w
+! ONLYROOT u
+! ACCENT aeiooouuu
+! CHECKNUM
+! WORDCHARS -.%0123456789
+! HU_KOTOHANGZO Z
+
+--- 64,115 ----
+ COMPOUNDMIN 2
+! #COMPOUNDWORD 2 y
+! COMPOUNDWORDMAX 2
+! COMPOUNDROOT y
+!
+! #COMPOUNDSYLLABLE 6 aeiou
+! COMPOUNDSYLMAX 6
+! SYLLABLE a//e//i//o////u///
+! # Strange that every vowel is counted as a syllable, that's how the hunspell
+! # code works.
+!
+! # the effect of SYLLABLENUM is not documented
+! #SYLLABLENUM klmc
+!
+! #COMPOUNDFLAG Y
+! #COMPOUNDFIRST v
+! #COMPOUNDLAST x
+! COMPOUNDRULE Y+
+! COMPOUNDRULE vY*x
+! COMPOUNDRULE Y+x
+! COMPOUNDRULE vY+
+!
+! #FORBIDDENWORD w
+! BAD w
+!
+! #ONLYROOT u
+! NEEDAFFIX u
+!
+! #ACCENT aeiooouuu
+! MAP 5
+! MAP a
+! MAP e
+! MAP i
+! MAP o
+! MAP u
+!
+! #CHECKNUM
+! # Vim always handles numbers in the same way.
+!
+! #WORDCHARS -.%0123456789
+! FOL -%
+! LOW -%
+! UPP -%
+! MIDWORD .
+!
+! # Undocumented
+! #HU_KOTOHANGZO Z
+!
+! # There are soooo many affixes. Postpone the prefixes to keep the time needed
+! # for generating the .spl within reasonable limits.
+! PFXPOSTPONE
+
+***************
+*** 81,96 ****
+
+! REP 89
+! REP i
+! REP i
+! REP o
+! REP o
+! REP o
+! REP u
+! REP u
+! REP u
+! REP
+! REP
+ REP j ly
+ REP ly j
+- REP a # Handel->Hndel
+ REP S # Skoda->koda
+--- 119,123 ----
+
+! REP 78
+ REP j ly
+ REP ly j
+ REP S # Skoda->koda
+***************
+*** 173,241 ****
+
+- # character conversion table
+- # (HTML latin-1 entities -> latin-2)
+- # not implemented yet
+-
+- CHR HTML 35
+- CHR HTML &curren;
+- CHR HTML &deg;
+- CHR HTML &acute;
+- CHR HTML &cedil;
+- CHR HTML &Aacute;
+- CHR HTML &Acirc;
+- CHR HTML &Auml;
+- CHR HTML &Ccedil;
+- CHR HTML &Eacute;
+- CHR HTML &Euml;
+- CHR HTML &Iacute;
+- CHR HTML &Icirc;
+- CHR HTML &Oacute;
+- CHR HTML &Ocirc;
+- CHR HTML &Ouml;
+- CHR HTML &times;
+- CHR HTML &Uacute;
+- CHR HTML &Uuml;
+- CHR HTML &Yacute;
+- CHR HTML &szlig;
+- CHR HTML &aacute;
+- CHR HTML &acirc;
+- CHR HTML &auml;
+- CHR HTML &ccedil;
+- CHR HTML &eacute;
+- CHR HTML &euml;
+- CHR HTML &iacute;
+- CHR HTML &icirc;
+- CHR HTML &oacute;
+- CHR HTML &ocirc;
+- CHR HTML &ouml;
+- CHR HTML &divide;
+- CHR HTML &uacute;
+- CHR HTML &uuml;
+- CHR HTML &yacute;
+-
+- # character conversion table
+- # (Prszky-code -> latin-2)
+- # not implemented yet
+-
+- CHR 123 20
+- CHR 123 a1
+- CHR 123 e1
+- CHR 123 e2
+- CHR 123 i1
+- CHR 123 o1
+- CHR 123 o2
+- CHR 123 o3
+- CHR 123 u1
+- CHR 123 u2
+- CHR 123 u3
+- CHR 123 A1
+- CHR 123 E1
+- CHR 123 E2
+- CHR 123 I1
+- CHR 123 O1
+- CHR 123 O2
+- CHR 123 O3
+- CHR 123 U1
+- CHR 123 U2
+- CHR 123 U3
+-
+ SFX z Y 6
+--- 200,201 ----
+***************
+*** 17678,17681 ****
+ PFX D 0 leg .
+-
+- 1
+-
+--- 17638 ----
diff --git a/runtime/spell/hu/main.aap b/runtime/spell/hu/main.aap
new file mode 100644
index 0000000..629a4ec
--- /dev/null
+++ b/runtime/spell/hu/main.aap
@@ -0,0 +1,82 @@
+# Aap recipe for Hungarian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+VIMRC = ../spell.vim
+FILES = hu_HU.aff hu_HU.dic
+
+all: $SPELLDIR/hu.iso-8859-2.spl $SPELLDIR/hu.utf-8.spl \
+ $SPELLDIR/hu.cp1250.spl ../README_hu.txt
+
+$SPELLDIR/hu.iso-8859-2.spl : $FILES
+ :sys env LANG=hu_HU.ISO8859-2 $VIM -u $VIMRC -e -c "mkspell! $SPELLDIR/hu hu_HU" -c q
+
+$SPELLDIR/hu.utf-8.spl : $FILES
+ :sys env LANG=hu_HU.UTF-8 $VIM -u $VIMRC -e -c "mkspell! $SPELLDIR/hu hu_HU" -c q
+
+$SPELLDIR/hu.cp1250.spl : $FILES
+ :sys $VIM -u $VIMRC -e -c "set enc=cp1250" -c "mkspell! $SPELLDIR/hu hu_HU" -c q
+
+../README_hu.txt: README_hu_HU.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} hu_HU.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+hu_HU.aff hu_HU.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch hu_HU.zip
+ :sys $UNZIP hu_HU.zip
+ :delete hu_HU.zip
+ @if not os.path.exists('hu_HU.orig.aff'):
+ :copy hu_HU.aff hu_HU.orig.aff
+ @if not os.path.exists('hu_HU.orig.dic'):
+ :copy hu_HU.dic hu_HU.orig.dic
+ @if os.path.exists('hu_HU.diff'):
+ :sys patch <hu_HU.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 hu_HU.orig.aff hu_HU.aff >hu_HU.diff
+ :sys {force} diff -a -C 1 hu_HU.orig.dic hu_HU.dic >>hu_HU.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch hu_HU.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../hu_HU.zip
+ :sys {force} diff ../hu_HU.orig.aff hu_HU.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy hu_HU.aff ../hu_HU.new.aff
+ :sys {force} diff ../hu_HU.orig.dic hu_HU.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy hu_HU.dic ../hu_HU.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete hu_HU.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/id/id_ID.diff b/runtime/spell/id/id_ID.diff
new file mode 100644
index 0000000..d0273ae
--- /dev/null
+++ b/runtime/spell/id/id_ID.diff
@@ -0,0 +1,22 @@
+*** id_ID.orig.aff Wed Aug 31 16:41:11 2005
+--- id_ID.aff Wed Aug 31 16:43:29 2005
+***************
+*** 18,19 ****
+--- 18,26 ----
+
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
+ PFX A Y 1
+*** id_ID.orig.dic Wed Aug 31 16:41:11 2005
+--- id_ID.dic Wed Aug 31 16:41:35 2005
+***************
+*** 21729,21731 ****
+ berabarkan
+- buletin
+ kernu
+--- 21729,21730 ----
diff --git a/runtime/spell/id/main.aap b/runtime/spell/id/main.aap
new file mode 100644
index 0000000..8c04b55
--- /dev/null
+++ b/runtime/spell/id/main.aap
@@ -0,0 +1,79 @@
+# Aap recipe for Indonesian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = id_ID.aff id_ID.dic
+
+all: $SPELLDIR/id.latin1.spl $SPELLDIR/id.utf-8.spl ../README_id.txt
+
+# I don't have an Indonesian locale, use the Dutch one instead.
+$SPELLDIR/id.latin1.spl : $FILES
+ :sys env LANG=nl_NL.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/id id_ID" -c q
+
+$SPELLDIR/id.utf-8.spl : $FILES
+ :sys env LANG=nl_NL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/id id_ID" -c q
+
+../README_id.txt : README_id_ID.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} id_ID.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+id_ID.aff id_ID.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch id_ID.zip
+ :sys $UNZIP id_ID.zip
+ :delete id_ID.zip
+ @if not os.path.exists('id_ID.orig.aff'):
+ :copy id_ID.aff id_ID.orig.aff
+ @if not os.path.exists('id_ID.orig.dic'):
+ :copy id_ID.dic id_ID.orig.dic
+ @if os.path.exists('id_ID.diff'):
+ :sys patch <id_ID.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 id_ID.orig.aff id_ID.aff >id_ID.diff
+ :sys {force} diff -a -C 1 id_ID.orig.dic id_ID.dic >>id_ID.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch id_ID.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../id_ID.zip
+ :sys {force} diff ../id_ID.orig.aff id_ID.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy id_ID.aff ../id_ID.new.aff
+ :sys {force} diff ../id_ID.orig.dic id_ID.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy id_ID.dic ../id_ID.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete id_ID.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/it/it_IT.diff b/runtime/spell/it/it_IT.diff
new file mode 100644
index 0000000..f032bce
--- /dev/null
+++ b/runtime/spell/it/it_IT.diff
@@ -0,0 +1,375 @@
+*** it_IT.orig.aff Sun Jul 31 14:20:13 2005
+--- it_IT.aff Tue Jan 10 18:06:11 2006
+***************
+*** 33,34 ****
+--- 33,61 ----
+
++ # This is no longer required, now that we compress after adding every so many
++ # words.
++ # PFXPOSTPONE
++
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
++ # Building the soundfold tree takes too much memory, skip it.
++ NOSUGFILE
++
++ MIDWORD '
++
++ MAP 9
++ MAP a
++ MAP e
++ MAP i
++ MAP o
++ MAP u
++ MAP n
++ MAP c
++ MAP y
++ MAP s
++
+ SFX A Y 225
+***************
+*** 1112,1114 ****
+
+! PFX T Y 148
+ PFX T 0 l' [aeiouhAEIOUH]
+--- 1139,1141 ----
+
+! PFX T Y 70
+ PFX T 0 l' [aeiouhAEIOUH]
+***************
+*** 1120,1128 ****
+ PFX T h l'H h
+- PFX T 0 L' [AEIOUH]
+- PFX T a L'A a
+- PFX T e L'E e
+- PFX T i L'I i
+- PFX T o L'O o
+- PFX T u L'U u
+- PFX T h L'H h
+ PFX T 0 all' [aeiouhAEIOUH]
+--- 1147,1148 ----
+***************
+*** 1134,1143 ****
+ PFX T h all'H h
+- PFX T 0 All' [AEIOUH]
+- PFX T a All'A a
+- PFX T e All'E e
+- PFX T i All'I i
+- PFX T o All'O o
+- PFX T u All'U u
+- PFX T h All'H h
+- PFX T 0 ALL' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+ PFX T 0 dell' [aeiouhAEIOUH]
+--- 1154,1155 ----
+***************
+*** 1149,1158 ****
+ PFX T h dell'H h
+- PFX T 0 Dell' [AEIOUH]
+- PFX T a Dell'A a
+- PFX T e Dell'E e
+- PFX T i Dell'I i
+- PFX T o Dell'O o
+- PFX T u Dell'U u
+- PFX T h Dell'H h
+- PFX T 0 DELL' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+ PFX T 0 dall' [aeiouhAEIOUH]
+--- 1161,1162 ----
+***************
+*** 1164,1173 ****
+ PFX T h dall'H h
+- PFX T 0 Dall' [AEIOUH]
+- PFX T a Dall'A a
+- PFX T e Dall'E e
+- PFX T i Dall'I i
+- PFX T o Dall'O o
+- PFX T u Dall'U u
+- PFX T h Dall'H h
+- PFX T 0 DALL' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+ PFX T 0 nell' [aeiouhAEIOUH]
+--- 1168,1169 ----
+***************
+*** 1179,1188 ****
+ PFX T h nell'H h
+- PFX T 0 Nell' [AEIOUH]
+- PFX T a Nell'A a
+- PFX T e Nell'E e
+- PFX T i Nell'I i
+- PFX T o Nell'O o
+- PFX T u Nell'U u
+- PFX T h Nell'H h
+- PFX T 0 NELL' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+ PFX T 0 sull' [aeiouhAEIOUH]
+--- 1175,1176 ----
+***************
+*** 1194,1203 ****
+ PFX T h sull'H h
+- PFX T 0 Sull' [AEIOUH]
+- PFX T a Sull'A a
+- PFX T e Sull'E e
+- PFX T i Sull'I i
+- PFX T o Sull'O o
+- PFX T u Sull'U u
+- PFX T h Sull'H h
+- PFX T 0 SULL' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+ PFX T 0 coll' [aeiouhAEIOUH]
+--- 1182,1183 ----
+***************
+*** 1209,1218 ****
+ PFX T h coll'H h
+- PFX T 0 Coll' [AEIOUH]
+- PFX T a Coll'A a
+- PFX T e Coll'E e
+- PFX T i Coll'I i
+- PFX T o Coll'O o
+- PFX T u Coll'U u
+- PFX T h Coll'H h
+- PFX T 0 COLL' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+ PFX T 0 d' [aeiouhAEIOUH]
+--- 1189,1190 ----
+***************
+*** 1224,1232 ****
+ PFX T h d'H h
+- PFX T 0 D' [AEIOUH]
+- PFX T a D'A a
+- PFX T e D'E e
+- PFX T i D'I i
+- PFX T o D'O o
+- PFX T u D'U u
+- PFX T h D'H h
+ PFX T 0 quest' [aeiouhAEIOUH]
+--- 1196,1197 ----
+***************
+*** 1238,1247 ****
+ PFX T h quest'H h
+- PFX T 0 Quest' [AEIOUH]
+- PFX T a Quest'A a
+- PFX T e Quest'E e
+- PFX T i Quest'I i
+- PFX T o Quest'O o
+- PFX T u Quest'U u
+- PFX T h Quest'H h
+- PFX T 0 QUEST' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+ PFX T 0 quell' [aeiouhAEIOUH]
+--- 1203,1204 ----
+***************
+*** 1253,1264 ****
+ PFX T h quell'H h
+- PFX T 0 Quell' [AEIOUH]
+- PFX T a Quell'A a
+- PFX T e Quell'E e
+- PFX T i Quell'I i
+- PFX T o Quell'O o
+- PFX T u Quell'U u
+- PFX T h Quell'H h
+- PFX T 0 QUELL' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+
+! PFX U Y 30
+ PFX U 0 un' [aeiouhAEIOUH]
+--- 1210,1213 ----
+ PFX T h quell'H h
+
+! PFX U Y 14
+ PFX U 0 un' [aeiouhAEIOUH]
+***************
+*** 1270,1279 ****
+ PFX U h un'H h
+- PFX U 0 Un' [AEIOUH]
+- PFX U a Un'A a
+- PFX U e Un'E e
+- PFX U i Un'I i
+- PFX U o Un'O o
+- PFX U u Un'U u
+- PFX U h Un'H h
+- PFX U 0 UN' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+ PFX U 0 ciascun' [aeiouhAEIOUH]
+--- 1219,1220 ----
+***************
+*** 1285,1296 ****
+ PFX U h ciascun'H h
+- PFX U 0 Ciascun' [AEIOUH]
+- PFX U a Ciascun'A a
+- PFX U e Ciascun'E e
+- PFX U i Ciascun'I i
+- PFX U o Ciascun'O o
+- PFX U u Ciascun'U u
+- PFX U h Ciascun'H h
+- PFX U 0 CIASCUN' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+
+! PFX X Y 72
+ PFX X 0 m' [aeiouAEIOU]
+--- 1226,1229 ----
+ PFX U h ciascun'H h
+
+! PFX X Y 36
+ PFX X 0 m' [aeiouAEIOU]
+***************
+*** 1301,1308 ****
+ PFX X u m'U u
+- PFX X 0 M' [AEIOU]
+- PFX X a M'A a
+- PFX X e M'E e
+- PFX X i M'I i
+- PFX X o M'O o
+- PFX X u M'U u
+ PFX X 0 t' [aeiouAEIOU]
+--- 1234,1235 ----
+***************
+*** 1313,1320 ****
+ PFX X u t'U u
+- PFX X 0 T' [AEIOU]
+- PFX X a T'A a
+- PFX X e T'E e
+- PFX X i T'I i
+- PFX X o T'O o
+- PFX X u T'U u
+ PFX X 0 s' [aeiouAEIOU]
+--- 1240,1241 ----
+***************
+*** 1325,1332 ****
+ PFX X u s'U u
+- PFX X 0 S' [AEIOU]
+- PFX X a S'A a
+- PFX X e S'E e
+- PFX X i S'I i
+- PFX X o S'O o
+- PFX X u S'U u
+ PFX X 0 c' [aeiouAEIOU]
+--- 1246,1247 ----
+***************
+*** 1337,1344 ****
+ PFX X u c'U u
+- PFX X 0 C' [AEIOU]
+- PFX X a C'A a
+- PFX X e C'E e
+- PFX X i C'I i
+- PFX X o C'O o
+- PFX X u C'U u
+ PFX X 0 v' [aeiouAEIOU]
+--- 1252,1253 ----
+***************
+*** 1349,1356 ****
+ PFX X u v'U u
+- PFX X 0 V' [AEIOU]
+- PFX X a V'A a
+- PFX X e V'E e
+- PFX X i V'I i
+- PFX X o V'O o
+- PFX X u V'U u
+ PFX X 0 n' [aeiouAEIOU]
+--- 1258,1259 ----
+***************
+*** 1361,1368 ****
+ PFX X u n'U u
+- PFX X 0 N' [AEIOU]
+- PFX X a N'A a
+- PFX X e N'E e
+- PFX X i N'I i
+- PFX X o N'O o
+- PFX X u N'U u
+
+--- 1264,1265 ----
+***************
+*** 1669,1671 ****
+
+! PFX i Y 14
+ PFX i 0 l' [aeiouhAEIOUH]
+--- 1566,1568 ----
+
+! PFX i Y 7
+ PFX i 0 l' [aeiouhAEIOUH]
+***************
+*** 1677,1685 ****
+ PFX i h l'H h
+- PFX i 0 L' [AEIOUH]
+- PFX i a L'A a
+- PFX i e L'E e
+- PFX i i L'I i
+- PFX i o L'O o
+- PFX i u L'U u
+- PFX i h L'H h
+
+--- 1574,1575 ----
+***************
+*** 1738,1740 ****
+
+! PFX q Y 15
+ PFX q 0 bell' [aeiouhAEIOUH]
+--- 1628,1630 ----
+
+! PFX q Y 7
+ PFX q 0 bell' [aeiouhAEIOUH]
+***************
+*** 1746,1757 ****
+ PFX q h bell'H h
+- PFX q 0 Bell' [AEIOUH]
+- PFX q a Bell'A a
+- PFX q e Bell'E e
+- PFX q i Bell'I i
+- PFX q o Bell'O o
+- PFX q u Bell'U u
+- PFX q h Bell'H h
+- PFX q 0 BELL' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+
+! PFX r Y 15
+ PFX r 0 brav' [aeiouhAEIOUH]
+--- 1636,1639 ----
+ PFX q h bell'H h
+
+! PFX r Y 7
+ PFX r 0 brav' [aeiouhAEIOUH]
+***************
+*** 1763,1774 ****
+ PFX r h brav'H h
+- PFX r 0 Brav' [AEIOUH]
+- PFX r a Brav'A a
+- PFX r e Brav'E e
+- PFX r i Brav'I i
+- PFX r o Brav'O o
+- PFX r u Brav'U u
+- PFX r h Brav'H h
+- PFX r 0 BRAV' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+
+! PFX s Y 15
+ PFX s 0 buon' [aeiouhAEIOUH]
+--- 1645,1648 ----
+ PFX r h brav'H h
+
+! PFX s Y 7
+ PFX s 0 buon' [aeiouhAEIOUH]
+***************
+*** 1780,1789 ****
+ PFX s h buon'H h
+- PFX s 0 Buon' [AEIOUH]
+- PFX s a Buon'A a
+- PFX s e Buon'E e
+- PFX s i Buon'I i
+- PFX s o Buon'O o
+- PFX s u Buon'U u
+- PFX s h Buon'H h
+- PFX s 0 BUON' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+
+--- 1654,1655 ----
+***************
+*** 2072,2077 ****
+
+! PFX ^ Y 3 # gestione dell'elisione nei nomi dei santi
+ PFX ^ 0 sant' [AEIOUH]
+- PFX ^ 0 Sant' [AEIOUH]
+- PFX ^ 0 SANT' [AEIOUH][QWERTYUIOPLKJHGFDSAZXCVBNM]
+
+--- 1938,1941 ----
+
+! PFX ^ Y 1 # gestione dell'elisione nei nomi dei santi
+ PFX ^ 0 sant' [AEIOUH]
+
+***************
+*** 2364,2366 ****
+ PFX $ 0 mml x
+-
+-
+--- 2228 ----
diff --git a/runtime/spell/it/main.aap b/runtime/spell/it/main.aap
new file mode 100644
index 0000000..f1bd742
--- /dev/null
+++ b/runtime/spell/it/main.aap
@@ -0,0 +1,79 @@
+# Aap recipe for Italian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = it_IT.aff it_IT.dic
+
+all: $SPELLDIR/it.latin1.spl $SPELLDIR/it.utf-8.spl ../README_it.txt
+
+$SPELLDIR/it.latin1.spl : $FILES
+ :sys env LANG=it_IT.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/it it_IT" -c q
+
+$SPELLDIR/it.utf-8.spl : $FILES
+ :sys env LANG=it_IT.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/it it_IT" -c q
+
+../README_it.txt : README_it_IT.txt README.txt
+ :cat $source >! $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} it_IT.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+it_IT.aff it_IT.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch it_IT.zip
+ :sys $UNZIP it_IT.zip
+ :delete it_IT.zip
+ :delete GPL.txt history.txt license.txt notes.txt statistiche.sxc thanks.txt
+ @if not os.path.exists('it_IT.orig.aff'):
+ :copy it_IT.aff it_IT.orig.aff
+ @if not os.path.exists('it_IT.orig.dic'):
+ :copy it_IT.dic it_IT.orig.dic
+ @if os.path.exists('it_IT.diff'):
+ :sys patch <it_IT.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 it_IT.orig.aff it_IT.aff >it_IT.diff
+ :sys {force} diff -a -C 1 it_IT.orig.dic it_IT.dic >>it_IT.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch it_IT.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../it_IT.zip
+ :sys {force} diff ../it_IT.orig.aff it_IT.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy it_IT.aff ../it_IT.new.aff
+ :sys {force} diff ../it_IT.orig.dic it_IT.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy it_IT.dic ../it_IT.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete it_IT.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/ku/ku_TR.diff b/runtime/spell/ku/ku_TR.diff
new file mode 100644
index 0000000..4d6e875
--- /dev/null
+++ b/runtime/spell/ku/ku_TR.diff
@@ -0,0 +1,104 @@
+*** ku_TR.orig.dic Wed Aug 31 22:13:17 2005
+--- ku_TR.dic Wed Aug 31 22:19:22 2005
+***************
+*** 492,494 ****
+ bergan
+- bergeh
+ bergeh/m
+--- 492,493 ----
+***************
+*** 1144,1146 ****
+ digevize
+- digihje
+ digihje/Dd
+--- 1143,1144 ----
+***************
+*** 1150,1152 ****
+ digihtin
+- digire/D
+ digire/Dd
+--- 1148,1149 ----
+***************
+*** 1361,1363 ****
+ diubin
+- dine
+ dine/Dd
+--- 1358,1359 ----
+***************
+*** 1372,1374 ****
+ dom
+- domand
+ domand/Ee
+--- 1368,1369 ----
+***************
+*** 1489,1491 ****
+ Erba
+- erd
+ erd/n
+--- 1484,1485 ----
+***************
+*** 1893,1895 ****
+ Heso
+- hesp
+ hesp/n
+--- 1887,1888 ----
+***************
+*** 2139,2141 ****
+ jiyn
+- jor
+ jor/r
+--- 2132,2133 ----
+***************
+*** 2382,2384 ****
+ kund
+- kur
+ kur/n
+--- 2374,2375 ----
+***************
+*** 2414,2416 ****
+ kuxiyane
+- kue
+ kue/m
+--- 2405,2406 ----
+***************
+*** 2576,2578 ****
+ medyay
+- meh
+ meh/m
+--- 2566,2567 ----
+***************
+*** 3050,3052 ****
+ nivsb
+- nivsn
+ nivsn/m
+--- 3039,3040 ----
+***************
+*** 3443,3445 ****
+ qonax/m
+- Qoser
+ Qoser/m
+--- 3431,3432 ----
+***************
+*** 3467,3469 ****
+ radibe/Dd
+- radigihne
+ radigihne/Dd
+--- 3454,3455 ----
+***************
+*** 3671,3673 ****
+ sakoyek
+- sal/m
+ sal/mn
+--- 3657,3658 ----
+***************
+*** 3881,3883 ****
+ tar
+- tar
+ tar/m
+--- 3866,3867 ----
+***************
+*** 4303,4305 ****
+ xeratiy
+- xerb
+ xerb/m
+--- 4287,4288 ----
diff --git a/runtime/spell/ku/main.aap b/runtime/spell/ku/main.aap
new file mode 100644
index 0000000..987e6db
--- /dev/null
+++ b/runtime/spell/ku/main.aap
@@ -0,0 +1,82 @@
+# Aap recipe for Kurdish Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = ku_TR.aff ku_TR.dic
+
+# I don't have a Kurdish locale, us the Turkish one.
+all: $SPELLDIR/ku.iso-8859-9.spl $SPELLDIR/ku.utf-8.spl \
+ ../README_ku.txt
+
+$SPELLDIR/ku.iso-8859-9.spl : $FILES
+ :sys env LANG=tr_TR.ISO8859-9 $VIM -u NONE -e -c "mkspell! $SPELLDIR/ku ku_TR" -c q
+
+$SPELLDIR/ku.utf-8.spl : $FILES
+ :sys env LANG=tr_TR.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/ku ku_TR" -c q
+
+../README_ku.txt: README_ku_TR.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} ku_TR.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+ku_TR.aff ku_TR.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch ku_TR.zip
+ :sys $UNZIP ku_TR.zip
+ :delete ku_TR.zip
+ :sys $VIM ku_TR.aff -u NONE -e -c "set ff=unix" -c update -c q
+ :sys $VIM ku_TR.dic -u NONE -e -c "set ff=unix" -c update -c q
+ :sys $VIM README_ku_TR.txt -u NONE -e -c "set ff=unix" -c update -c q
+ @if not os.path.exists('ku_TR.orig.aff'):
+ :copy ku_TR.aff ku_TR.orig.aff
+ @if not os.path.exists('ku_TR.orig.dic'):
+ :copy ku_TR.dic ku_TR.orig.dic
+ @if os.path.exists('ku_TR.diff'):
+ :sys patch <ku_TR.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 ku_TR.orig.aff ku_TR.aff >ku_TR.diff
+ :sys {force} diff -a -C 1 ku_TR.orig.dic ku_TR.dic >>ku_TR.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch ku_TR.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../ku_TR.zip
+ :sys {force} diff ../ku_TR.orig.aff ku_TR.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ku_TR.aff ../ku_TR.new.aff
+ :sys {force} diff ../ku_TR.orig.dic ku_TR.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ku_TR.dic ../ku_TR.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete ku_TR.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/la/la.diff b/runtime/spell/la/la.diff
new file mode 100644
index 0000000..787b091
--- /dev/null
+++ b/runtime/spell/la/la.diff
@@ -0,0 +1,12 @@
+*** la.orig.aff Wed Aug 31 17:09:50 2005
+--- la.aff Wed Aug 31 17:10:42 2005
+***************
+*** 2,3 ****
+--- 2,8 ----
+ TRY esianrtolcdugmphbyfvkw
++
++ FOL
++ LOW
++ UPP
++
+ SFX a Y 124
diff --git a/runtime/spell/la/main.aap b/runtime/spell/la/main.aap
new file mode 100644
index 0000000..d981585
--- /dev/null
+++ b/runtime/spell/la/main.aap
@@ -0,0 +1,81 @@
+# Aap recipe for Latin Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = la.aff la.dic
+
+all: $SPELLDIR/la.latin1.spl $SPELLDIR/la.utf-8.spl ../README_la.txt
+
+# NOTE: the la_LN.ISO-8859-1 locale is not available on Ubuntu.
+# Use the English one instead.
+
+$SPELLDIR/la.latin1.spl : $FILES
+ :sys env LANG=en_US.ISO-8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/la la" -c q
+
+$SPELLDIR/la.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "mkspell! $SPELLDIR/la la" -c q
+
+../README_la.txt : README_la.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} la.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+la.aff la.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch la.zip
+ :sys $UNZIP la.zip
+ :delete la.zip
+ @if not os.path.exists('la.orig.aff'):
+ :copy la.aff la.orig.aff
+ @if not os.path.exists('la.orig.dic'):
+ :copy la.dic la.orig.dic
+ @if os.path.exists('la.diff'):
+ :sys patch <la.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 la.orig.aff la.aff >la.diff
+ :sys {force} diff -a -C 1 la.orig.dic la.dic >>la.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch la.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../la.zip
+ :sys {force} diff ../la.orig.aff la.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy la.aff ../la.new.aff
+ :sys {force} diff ../la.orig.dic la.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy la.dic ../la.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete la.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/lt/lt_LT.diff b/runtime/spell/lt/lt_LT.diff
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/runtime/spell/lt/lt_LT.diff
diff --git a/runtime/spell/lt/main.aap b/runtime/spell/lt/main.aap
new file mode 100644
index 0000000..92edad2
--- /dev/null
+++ b/runtime/spell/lt/main.aap
@@ -0,0 +1,78 @@
+# Aap recipe for Lithuanian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = lt_LT.aff lt_LT.dic
+
+all: $SPELLDIR/lt.iso-8859-13.spl $SPELLDIR/lt.utf-8.spl \
+ ../README_lt.txt
+
+$SPELLDIR/lt.iso-8859-13.spl : $FILES
+ :sys env LANG=lt_LT.ISO8859-13 $VIM -u NONE -e -c "mkspell! $SPELLDIR/lt lt_LT" -c q
+
+$SPELLDIR/lt.utf-8.spl : $FILES
+ :sys env LANG=lt_LT.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/lt lt_LT" -c q
+
+../README_lt.txt: README_lt_LT.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} lt_LT.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+lt_LT.aff lt_LT.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch lt_LT.zip
+ :sys $UNZIP lt_LT.zip
+ :delete lt_LT.zip
+ @if not os.path.exists('lt_LT.orig.aff'):
+ :copy lt_LT.aff lt_LT.orig.aff
+ @if not os.path.exists('lt_LT.orig.dic'):
+ :copy lt_LT.dic lt_LT.orig.dic
+ @if os.path.exists('lt_LT.diff'):
+ :sys patch <lt_LT.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 lt_LT.orig.aff lt_LT.aff >lt_LT.diff
+ :sys {force} diff -a -C 1 lt_LT.orig.dic lt_LT.dic >>lt_LT.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch lt_LT.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../lt_LT.zip
+ :sys {force} diff ../lt_LT.orig.aff lt_LT.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy lt_LT.aff ../lt_LT.new.aff
+ :sys {force} diff ../lt_LT.orig.dic lt_LT.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy lt_LT.dic ../lt_LT.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete lt_LT.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/lv/lv_LV.diff b/runtime/spell/lv/lv_LV.diff
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/runtime/spell/lv/lv_LV.diff
diff --git a/runtime/spell/lv/main.aap b/runtime/spell/lv/main.aap
new file mode 100644
index 0000000..460bd2b
--- /dev/null
+++ b/runtime/spell/lv/main.aap
@@ -0,0 +1,83 @@
+# Aap recipe for Latvian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = lv_LV.aff lv_LV.dic
+
+# I don't have a Latvian locale, use Lithuanian instead.
+all: $SPELLDIR/lv.iso-8859-13.spl $SPELLDIR/lv.utf-8.spl \
+ ../README_lv.txt
+
+$SPELLDIR/lv.iso-8859-13.spl : $FILES
+ :sys env LANG=lt_LT.ISO8859-13 $VIM -u NONE -e -c "mkspell! $SPELLDIR/lv lv_LV" -c q
+
+$SPELLDIR/lv.utf-8.spl : $FILES
+ :sys env LANG=lt_LT.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/lv lv_LV" -c q
+
+../README_lv.txt: README_lv_LV.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} lv_LV.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+lv_LV.aff lv_LV.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch lv_LV.zip
+ :sys $UNZIP lv_LV.zip
+ :delete lv_LV.zip
+ :delete changelog.txt gpl.txt lin-lv_LV_add.sh win-lv_LV_add.bat
+ :sys $VIM lv_LV.aff -u NONE -e -N -c "%s/\r//" -c update -c q
+ :sys $VIM lv_LV.dic -u NONE -e -N -c "%s/\r//" -c update -c q
+ :sys $VIM README_lv_LV.txt -u NONE -e -c "set ff=unix" -c update -c q
+ @if not os.path.exists('lv_LV.orig.aff'):
+ :copy lv_LV.aff lv_LV.orig.aff
+ @if not os.path.exists('lv_LV.orig.dic'):
+ :copy lv_LV.dic lv_LV.orig.dic
+ @if os.path.exists('lv_LV.diff'):
+ :sys patch <lv_LV.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 lv_LV.orig.aff lv_LV.aff >lv_LV.diff
+ :sys {force} diff -a -C 1 lv_LV.orig.dic lv_LV.dic >>lv_LV.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch lv_LV.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../lv_LV.zip
+ :sys {force} diff ../lv_LV.orig.aff lv_LV.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy lv_LV.aff ../lv_LV.new.aff
+ :sys {force} diff ../lv_LV.orig.dic lv_LV.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy lv_LV.dic ../lv_LV.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete lv_LV.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/main.aap b/runtime/spell/main.aap
new file mode 100644
index 0000000..9f051e2
--- /dev/null
+++ b/runtime/spell/main.aap
@@ -0,0 +1,27 @@
+# Toplevel Aap recipe for Vim spell files
+#
+# Usage:
+# aap generate all the .spl files
+# aap diff create all the diff files
+
+# "hu" is at the end, because it takes a very long time.
+# "eu" takes even longer (4 hours on my system).
+LANG = af am bg br ca cs cy da de el en eo es fr fo ga gd gl he hr id it
+ ku la lt lv mg mi ms nb nl nn ny pl pt ro ru rw sk sl sv sw
+ tet th tl tn tr uk yi zu hu eu
+
+# TODO:
+# Finnish doesn't work, the dictionary fi_FI.zip file contains hyphenation...
+
+diff: $*LANG/diff
+ :print Done.
+
+@for l in string.split(_no.LANG):
+ :child $l/main.aap
+
+# The existing .spl files need to be generated when the spell file format
+# changes. Depending on the Vim executable does that, but results in doing it
+# much too often. Generate a dummy .spl file and let the .spl depend on it, so
+# that they are outdated when it changes.
+:child check/main.aap
+*.spl: check/check.latin1.spl
diff --git a/runtime/spell/mg/main.aap b/runtime/spell/mg/main.aap
new file mode 100644
index 0000000..77860bf
--- /dev/null
+++ b/runtime/spell/mg/main.aap
@@ -0,0 +1,79 @@
+# Aap recipe for Malagasy Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = mg_MG.aff mg_MG.dic
+
+# I don't have a Malagasy locale, use the Dutch one instead.
+all: $SPELLDIR/mg.latin1.spl $SPELLDIR/mg.utf-8.spl ../README_mg.txt
+
+$SPELLDIR/mg.latin1.spl : $FILES
+ :sys env LANG=nl_NL.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/mg mg_MG" -c q
+
+$SPELLDIR/mg.utf-8.spl : $FILES
+ :sys env LANG=nl_NL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/mg mg_MG" -c q
+
+../README_mg.txt : README_mg_MG.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} mg_MG.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+mg_MG.aff mg_MG.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch mg_MG.zip
+ :sys $UNZIP mg_MG.zip
+ :delete mg_MG.zip
+ @if not os.path.exists('mg_MG.orig.aff'):
+ :copy mg_MG.aff mg_MG.orig.aff
+ @if not os.path.exists('mg_MG.orig.dic'):
+ :copy mg_MG.dic mg_MG.orig.dic
+ @if os.path.exists('mg_MG.diff'):
+ :sys patch <mg_MG.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 mg_MG.orig.aff mg_MG.aff >mg_MG.diff
+ :sys {force} diff -a -C 1 mg_MG.orig.dic mg_MG.dic >>mg_MG.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch mg_MG.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../mg_MG.zip
+ :sys {force} diff ../mg_MG.orig.aff mg_MG.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy mg_MG.aff ../mg_MG.new.aff
+ :sys {force} diff ../mg_MG.orig.dic mg_MG.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy mg_MG.dic ../mg_MG.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete mg_MG.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/mg/mg_MG.diff b/runtime/spell/mg/mg_MG.diff
new file mode 100644
index 0000000..92149a1
--- /dev/null
+++ b/runtime/spell/mg/mg_MG.diff
@@ -0,0 +1,26 @@
+*** mg_MG.orig.aff Wed Aug 31 17:58:59 2005
+--- mg_MG.aff Wed Aug 31 18:00:42 2005
+***************
+*** 19 ****
+--- 19,39 ----
+ TRY anyiotrmehsfkdzl'vpbg-AMjNTFIRHJSKVDELPBGZO
++
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
++ MIDWORD '-
++
++ MAP 9
++ MAP a
++ MAP e
++ MAP i
++ MAP o
++ MAP u
++ MAP n
++ MAP c
++ MAP y
++ MAP s
diff --git a/runtime/spell/mi/main.aap b/runtime/spell/mi/main.aap
new file mode 100644
index 0000000..7cd8419
--- /dev/null
+++ b/runtime/spell/mi/main.aap
@@ -0,0 +1,80 @@
+# Aap recipe for Maori Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = mi_NZ.aff mi_NZ.dic
+
+all: $SPELLDIR/mi.iso-8859-4.spl $SPELLDIR/mi.utf-8.spl ../README_mi.txt
+
+$SPELLDIR/mi.iso-8859-4.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=iso-8859-4"
+ -c "mkspell! $SPELLDIR/mi mi_NZ" -c q
+
+$SPELLDIR/mi.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "mkspell! $SPELLDIR/mi mi_NZ" -c q
+
+../README_mi.txt : README_mi_NZ.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} mi_NZ.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+mi_NZ.aff mi_NZ.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch mi_NZ.zip
+ :sys $UNZIP mi_NZ.zip
+ :delete mi_NZ.zip
+ # Fix missing end of line.
+ :print >>mi_NZ.aff
+ @if not os.path.exists('mi_NZ.orig.aff'):
+ :copy mi_NZ.aff mi_NZ.orig.aff
+ @if not os.path.exists('mi_NZ.orig.dic'):
+ :copy mi_NZ.dic mi_NZ.orig.dic
+ @if os.path.exists('mi_NZ.diff'):
+ :sys patch <mi_NZ.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 mi_NZ.orig.aff mi_NZ.aff >mi_NZ.diff
+ :sys {force} diff -a -C 1 mi_NZ.orig.dic mi_NZ.dic >>mi_NZ.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch mi_NZ.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../mi_NZ.zip
+ :sys {force} diff ../mi_NZ.orig.aff mi_NZ.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy mi_NZ.aff ../mi_NZ.new.aff
+ :sys {force} diff ../mi_NZ.orig.dic mi_NZ.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy mi_NZ.dic ../mi_NZ.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete mi_NZ.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/mi/mi_NZ.diff b/runtime/spell/mi/mi_NZ.diff
new file mode 100644
index 0000000..85ace6f
--- /dev/null
+++ b/runtime/spell/mi/mi_NZ.diff
@@ -0,0 +1,10 @@
+*** mi_NZ.orig.aff Wed Aug 31 18:22:03 2005
+--- mi_NZ.aff Wed Aug 31 18:21:56 2005
+***************
+*** 2,3 ****
+--- 2,6 ----
+ TRY aikturohenpgwmAIKTUROHENPGWM
++
++ MIDWORD -
++
+ REP 30
diff --git a/runtime/spell/ms/main.aap b/runtime/spell/ms/main.aap
new file mode 100644
index 0000000..09bb3d1
--- /dev/null
+++ b/runtime/spell/ms/main.aap
@@ -0,0 +1,81 @@
+# Aap recipe for Malay Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = ms_MY.aff ms_MY.dic
+
+# I do not have a Malay locale, use the Dutch one instead.
+all: $SPELLDIR/ms.latin1.spl $SPELLDIR/ms.utf-8.spl ../README_ms.txt
+
+$SPELLDIR/ms.latin1.spl : $FILES
+ :sys env LANG=nl_NL.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/ms ms_MY" -c q
+
+$SPELLDIR/ms.utf-8.spl : $FILES
+ :sys env LANG=nl_NL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/ms ms_MY" -c q
+
+../README_ms.txt : README_ms_MY.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} ms_MY.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+ms_MY.aff ms_MY.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch ms_MY.zip
+ :sys $UNZIP ms_MY.zip
+ :delete ms_MY.zip
+ :sys $VIM ms_MY.aff -u NONE -e -c "set ff=unix" -c update -c q
+ :sys $VIM ms_MY.dic -u NONE -e -c "set ff=unix" -c update -c q
+ @if not os.path.exists('ms_MY.orig.aff'):
+ :copy ms_MY.aff ms_MY.orig.aff
+ @if not os.path.exists('ms_MY.orig.dic'):
+ :copy ms_MY.dic ms_MY.orig.dic
+ @if os.path.exists('ms_MY.diff'):
+ :sys patch <ms_MY.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 ms_MY.orig.aff ms_MY.aff >ms_MY.diff
+ :sys {force} diff -a -C 1 ms_MY.orig.dic ms_MY.dic >>ms_MY.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch ms_MY.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../ms_MY.zip
+ :sys {force} diff ../ms_MY.orig.aff ms_MY.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ms_MY.aff ../ms_MY.new.aff
+ :sys {force} diff ../ms_MY.orig.dic ms_MY.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ms_MY.dic ../ms_MY.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete ms_MY.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/ms/ms_MY.diff b/runtime/spell/ms/ms_MY.diff
new file mode 100644
index 0000000..a6c9916
--- /dev/null
+++ b/runtime/spell/ms/ms_MY.diff
@@ -0,0 +1,24 @@
+*** ms_MY.orig.aff Wed Aug 31 18:14:01 2005
+--- ms_MY.aff Wed Aug 31 18:14:01 2005
+***************
+*** 25,26 ****
+--- 25,35 ----
+
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
++ MIDWORD -
++
+ PFX B Y 2
+*** ms_MY.orig.dic Wed Aug 31 18:14:01 2005
+--- ms_MY.dic Wed Aug 31 18:14:01 2005
+***************
+*** 4939,4941 ****
+ datin
+- Dato’
+ datuk/b
+--- 4939,4940 ----
diff --git a/runtime/spell/nb/main.aap b/runtime/spell/nb/main.aap
new file mode 100644
index 0000000..4d445c0
--- /dev/null
+++ b/runtime/spell/nb/main.aap
@@ -0,0 +1,78 @@
+# Aap recipe for Dutch Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = nb_NO.aff nb_NO.dic
+
+all: $SPELLDIR/nb.latin1.spl $SPELLDIR/nb.utf-8.spl ../README_nb.txt
+
+$SPELLDIR/nb.latin1.spl : $FILES
+ :sys env LANG=nb_NO.ISO-8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/nb nb_NO" -c q
+
+$SPELLDIR/nb.utf-8.spl : $FILES
+ :sys env LANG=nb_NO.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/nb nb_NO" -c q
+
+../README_nb.txt : README_nb_NO.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} nb_NO.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+nb_NO.aff nb_NO.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch nb_NO.zip
+ :sys $UNZIP nb_NO.zip
+ :delete nb_NO.zip
+ @if not os.path.exists('nb_NO.orig.aff'):
+ :copy nb_NO.aff nb_NO.orig.aff
+ @if not os.path.exists('nb_NO.orig.dic'):
+ :copy nb_NO.dic nb_NO.orig.dic
+ @if os.path.exists('nb_NO.diff'):
+ :sys patch <nb_NO.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 nb_NO.orig.aff nb_NO.aff >nb_NO.diff
+ :sys {force} diff -a -C 1 nb_NO.orig.dic nb_NO.dic >>nb_NO.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch nb_NO.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../nb_NO.zip
+ :sys {force} diff ../nb_NO.orig.aff nb_NO.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy nb_NO.aff ../nb_NO.new.aff
+ :sys {force} diff ../nb_NO.orig.dic nb_NO.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy nb_NO.dic ../nb_NO.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete nb_NO.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/nb/nb_NO.diff b/runtime/spell/nb/nb_NO.diff
new file mode 100644
index 0000000..751eb5b
--- /dev/null
+++ b/runtime/spell/nb/nb_NO.diff
@@ -0,0 +1,63 @@
+*** nb_NO.orig.aff Wed Aug 31 18:29:43 2005
+--- nb_NO.aff Wed Aug 31 18:35:09 2005
+***************
+*** 7,8 ****
+--- 7,26 ----
+
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
++ MAP 9
++ MAP a
++ MAP e
++ MAP i
++ MAP o
++ MAP u
++ MAP n
++ MAP c
++ MAP y
++ MAP s
++
+ PFX a Y 1
+*** nb_NO.orig.dic Wed Aug 31 18:29:43 2005
+--- nb_NO.dic Wed Aug 31 18:38:02 2005
+***************
+*** 2,4 ****
+ a.a
+- a.a
+ a.a.C
+--- 2,3 ----
+***************
+*** 15054,15056 ****
+ cand
+- cand/
+ cand.act
+--- 15053,15054 ----
+***************
+*** 28532,28534 ****
+ f.o.r
+- fr
+ fora/G
+--- 28530,28531 ----
+***************
+*** 28980,28982 ****
+ fordyelsessystem/BCEFGH
+- fre
+ fre/BEJtz
+--- 28977,28978 ----
+***************
+*** 43532,43534 ****
+ Idar/J
+- id
+ id/AEFGH[z
+--- 43528,43529 ----
+***************
+*** 57490,57492 ****
+ Lambertseter/J
+- lam
+ lam/A
+--- 57485,57486 ----
diff --git a/runtime/spell/nl/main.aap b/runtime/spell/nl/main.aap
new file mode 100644
index 0000000..c3cae27
--- /dev/null
+++ b/runtime/spell/nl/main.aap
@@ -0,0 +1,96 @@
+# Aap recipe for Dutch Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = nl_NL.aff nl_NL.dic
+
+all: $SPELLDIR/nl.latin1.spl $SPELLDIR/nl.utf-8.spl ../README_nl.txt
+
+$SPELLDIR/nl.latin1.spl : $FILES
+ :sys env LANG=nl_NL.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/nl nl_NL" -c q
+
+$SPELLDIR/nl.utf-8.spl : $FILES
+ :sys env LANG=nl_NL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/nl nl_NL" -c q
+
+../README_nl.txt : README_NL.txt README_EN.txt
+ :cat $source >! $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://extensions.services.openoffice.org/e-files/1456/5
+:attr {fetch = $OODIR/%file%} nl-dict.oxt
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+nl_NL.aff nl_NL.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch nl-dict.oxt
+ :sys $UNZIP nl-dict.oxt
+ :update cleanunused
+ @if not os.path.exists('nl_NL.orig.aff'):
+ :copy nl_NL.aff nl_NL.orig.aff
+ @if not os.path.exists('nl_NL.orig.dic'):
+ :copy nl_NL.dic nl_NL.orig.dic
+ @if os.path.exists('nl_NL.diff'):
+ :sys patch <nl_NL.diff
+
+# Delete all the files unpacked from the archive
+clean: cleanunused
+ :delete {f} nl_NL.dic
+ :delete {f} nl_NL.aff
+ :delete {f} README_EN.txt
+ :delete {f} README_NL.txt
+
+# Delete all the files from the archive that are not used, including the
+# archive itself.
+cleanunused:
+ :delete {f} nl-dict.oxt
+ :delete {f} description.xml
+ :delete {f} Dictionaries.xcu
+ :delete {f} hyph_nl_NL.dic
+ :delete {r}{f} description
+ :delete {r}{f} images
+ :delete {r}{f} META-INF
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 nl_NL.orig.aff nl_NL.aff >nl_NL.diff
+ :sys {force} diff -a -C 1 nl_NL.orig.dic nl_NL.dic >>nl_NL.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+# Currently doesn't work.
+
+#check:
+# :assertpkg unzip diff
+# :fetch nl_NL.zip
+# :mkdir tmp
+# :cd tmp
+# @try:
+# @import stat
+# :sys $UNZIP ../nl_NL.zip
+# :sys {force} diff ../nl_NL.orig.aff nl_NL.aff >d
+# @if os.stat('d')[stat.ST_SIZE] > 0:
+# :copy nl_NL.aff ../nl_NL.new.aff
+# :sys {force} diff ../nl_NL.orig.dic nl_NL.dic >d
+# @if os.stat('d')[stat.ST_SIZE] > 0:
+# :copy nl_NL.dic ../nl_NL.new.dic
+# @finally:
+# :cd ..
+# :delete {r}{f}{q} tmp
+# :delete nl_NL.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/nl/nl_NL.diff b/runtime/spell/nl/nl_NL.diff
new file mode 100644
index 0000000..4584a7c
--- /dev/null
+++ b/runtime/spell/nl/nl_NL.diff
@@ -0,0 +1,228 @@
+*** nl_NL.orig.aff 2010-08-06 22:12:39.000000000 +0200
+--- nl_NL.aff 2010-08-08 16:31:46.000000000 +0200
+***************
+*** 1,9 ****
+ SET ISO8859-1
+ TRY esianrtolcdugmphbyfvkwjkqxz-'ESIANRTOLCDUGMPHBYFVKWJKQXZ
+
+ # combined layout for BE and NL keyboards NL en BE
+! KEY qwertyuiop|asdfghjkl|zxcvbnm|qawsedrftgyhujikolp|azsxdcfvgbhnjmk|aze|qsd|lm|wx|aqz|qws|
+
+ # wordchars is (or is supposed to be) only for command line
+! WORDCHARS '
+ # . is not useful as wordchar
+--- 1,23 ----
+ SET ISO8859-1
++
++ NAME Nederlands
++ AUTHOR Various, edited by Bram Moolenaar
++ VERSION 1.1.2
++
+ TRY esianrtolcdugmphbyfvkwjkqxz-'ESIANRTOLCDUGMPHBYFVKWJKQXZ
+
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
++ MIDWORD '-
++
+ # combined layout for BE and NL keyboards NL en BE
+! #KEY qwertyuiop|asdfghjkl|zxcvbnm|qawsedrftgyhujikolp|azsxdcfvgbhnjmk|aze|qsd|lm|wx|aqz|qws|
+
+ # wordchars is (or is supposed to be) only for command line
+! #WORDCHARS '
+ # . is not useful as wordchar
+***************
+*** 14,16 ****
+ # do not offer wplit words (English desease)
+! NOSPLITSUGS
+
+--- 28,30 ----
+ # do not offer wplit words (English desease)
+! #NOSPLITSUGS
+
+***************
+*** 20,23 ****
+ # added to make this dictonary work on planned version 3.2 of OpenOffice.org too.
+! BREAK 1
+! BREAK -
+
+--- 34,37 ----
+ # added to make this dictonary work on planned version 3.2 of OpenOffice.org too.
+! #BREAK 1
+! #BREAK -
+
+***************
+*** 186,193 ****
+ # make calculation of alternatives better for words with accents
+! MAP 5
+! MAP e
+! MAP a
+! MAP i
+! MAP o
+! MAP u
+
+--- 200,217 ----
+ # make calculation of alternatives better for words with accents
+! #MAP 5
+! #MAP e
+! #MAP a
+! #MAP i
+! #MAP o
+! #MAP u
+! MAP 9
+! MAP a
+! MAP e
+! MAP i
+! MAP o
+! MAP u
+! MAP n
+! MAP c
+! MAP y
+! MAP s
+
+***************
+*** 359,479 ****
+ REP aflassen afgelasten
+- REP imho n.m.m.
+- REP nmm n.m.m.
+ REP ff even
+- REP AD A.D.
+- REP DV D.V.
+- REP HKH H.K.H.
+- REP HM H.M.
+- REP LB L.B.
+- REP NB N.B.
+- REP NH N.H.
+- REP NN N.N.
+- REP NO N.O.
+- REP NV N.V.
+- REP NW N.W.
+- REP OLV O.L.V.
+- REP RIP R.I.P.
+- REP St- St.-
+- REP St- St.-
+- REP ZH Z.H.
+- REP ZKH Z.K.H.
+- REP ahw a.h.w.
+- REP ajb a.j.b.
+- REP am a.m.
+- REP as a.s.
+- REP aub a.u.b.
+- REP bd b.d.
+- REP bgg b.g.g.
+- REP bvd b.v.d.
+- REP cq c.q.
+- REP cs c.s.
+- REP ca ca.
+- REP dd d.d.
+- REP di d.i.
+- REP dmv d.m.v.
+- REP dwz d.w.z.
+- REP ea e.a.
+- REP ed e.d.
+- REP eea e.e.a.
+- REP eo e.o.
+- REP ev e.v.
+- REP eva e.v.a.
+- REP ggd g.g.d.
+- REP ic i.c.
+- REP ie i.e.
+- REP iha i.h.a.
+- REP ihb i.h.b.
+- REP im i.m.
+- REP io i.o.
+- REP iov i.o.v.
+- REP ipv i.p.v.
+- REP ism i.s.m.
+- REP itt i.t.t.
+- REP ivm i.v.m.
+- REP izgst i.z.g.st.
+- REP kk k.k.
+- REP m m.
+- REP maw m.a.w.
+- REP mbt m.b.t.
+- REP mbv m.b.v.
+- REP mvg m.v.g.
+- REP mi m.i.
+- REP miv m.i.v.
+- REP mm m.m.
+- REP mn m.n.
+- REP muv m.u.v.
+- REP max max.
+- REP mevr mevr.
+- REP min min.
+- REP mld mld.
+- REP mln mln.
+- REP mr mr.
+- REP mw mw.
+- REP nav n.a.v.
+- REP notk n.o.t.k.
+- REP nvt n.v.t.
+- REP nl nl.
+- REP nr nr.
+- REP oa o.a.
+- REP oi o.i.
+- REP oid o.i.d.
+- REP olv o.l.v.
+- REP om o.m.
+- REP ott o.t.t.
+- REP ovt o.v.t.
+- REP ovv o.v.v.
+- REP p p.
+- REP pm p.m.
+- REP pp p.p.
+- REP pw p.w.
+- REP qed q.e.d.
+- REP qq q.q.
+- REP r-k r.-k.
+- REP sj s.j.
+- REP svp s.v.p.
+- REP sr sr.
+- REP tav t.a.v.
+- REP tbv t.b.v.
+- REP tgv t.g.v.
+- REP tht t.h.t.
+- REP tnv t.n.v.
+- REP tov t.o.v.
+- REP tw t.w.
+- REP twv t.w.v.
+- REP tzt t.z.t.
+- REP vChr v.Chr.
+- REP vd v.d.
+- REP vh v.h.
+- REP vtt v.t.t.
+- REP vv v.v.
+- REP vvt v.v.t.
+- REP wo w.o.
+- REP wvttk w.v.t.t.k.
+- REP zg z.g.
+- REP zgan z.g.a.n.
+- REP zi z.i.
+- REP zoz z.o.z.
+- REP zsm z.s.m.
+ REP idd inderdaad
+- REP etc etc.
+ REP enzo en_zo
+--- 383,386 ----
+***************
+*** 481,486 ****
+ REP zn zijn
+- REP enz enz.
+ REP ok ok
+ REP dr haar
+- REP dr er
+ REP ondermeer onder_meer
+--- 388,391 ----
+***************
+*** 508,509 ****
+ REP spercibo sperziebo
+! REP voorzover voor_zover
+\ No newline at end of file
+--- 413,415 ----
+ REP spercibo sperziebo
+! REP voorzover voor_zover
+! REP hopenlijk hopelijk
diff --git a/runtime/spell/nn/main.aap b/runtime/spell/nn/main.aap
new file mode 100644
index 0000000..efb0812
--- /dev/null
+++ b/runtime/spell/nn/main.aap
@@ -0,0 +1,78 @@
+# Aap recipe for Dutch Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = nn_NO.aff nn_NO.dic
+
+all: $SPELLDIR/nn.latin1.spl $SPELLDIR/nn.utf-8.spl ../README_nn.txt
+
+$SPELLDIR/nn.latin1.spl : $FILES
+ :sys env LANG=nb_NO.ISO-8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/nn nn_NO" -c q
+
+$SPELLDIR/nn.utf-8.spl : $FILES
+ :sys env LANG=nb_NO.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/nn nn_NO" -c q
+
+../README_nn.txt : README_nn_NO.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} nn_NO.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+nn_NO.aff nn_NO.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch nn_NO.zip
+ :sys $UNZIP nn_NO.zip
+ :delete nn_NO.zip
+ @if not os.path.exists('nn_NO.orig.aff'):
+ :copy nn_NO.aff nn_NO.orig.aff
+ @if not os.path.exists('nn_NO.orig.dic'):
+ :copy nn_NO.dic nn_NO.orig.dic
+ @if os.path.exists('nn_NO.diff'):
+ :sys patch <nn_NO.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 nn_NO.orig.aff nn_NO.aff >nn_NO.diff
+ :sys {force} diff -a -C 1 nn_NO.orig.dic nn_NO.dic >>nn_NO.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch nn_NO.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../nn_NO.zip
+ :sys {force} diff ../nn_NO.orig.aff nn_NO.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy nn_NO.aff ../nn_NO.new.aff
+ :sys {force} diff ../nn_NO.orig.dic nn_NO.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy nn_NO.dic ../nn_NO.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete nn_NO.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/nn/nn_NO.diff b/runtime/spell/nn/nn_NO.diff
new file mode 100644
index 0000000..c0e3581
--- /dev/null
+++ b/runtime/spell/nn/nn_NO.diff
@@ -0,0 +1,25 @@
+*** nn_NO.orig.aff Wed Aug 31 18:40:26 2005
+--- nn_NO.aff Wed Aug 31 18:42:00 2005
+***************
+*** 7,8 ****
+--- 7,26 ----
+
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
++ MAP 9
++ MAP a
++ MAP e
++ MAP i
++ MAP o
++ MAP u
++ MAP n
++ MAP c
++ MAP y
++ MAP s
++
+ PFX a Y 1
diff --git a/runtime/spell/ny/main.aap b/runtime/spell/ny/main.aap
new file mode 100644
index 0000000..b73b50c
--- /dev/null
+++ b/runtime/spell/ny/main.aap
@@ -0,0 +1,82 @@
+# Aap recipe for Chichewa Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = ny_MW.aff ny_MW.dic
+
+all: $SPELLDIR/ny.iso-8859-14.spl $SPELLDIR/ny.utf-8.spl \
+ $SPELLDIR/ny.ascii.spl ../README_ny.txt
+
+$SPELLDIR/ny.iso-8859-14.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=iso-8859-14"
+ -c "mkspell! $SPELLDIR/ny ny_MW" -c q
+
+$SPELLDIR/ny.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "mkspell! $SPELLDIR/ny ny_MW" -c q
+
+$SPELLDIR/ny.ascii.spl : $FILES
+ :sys $VIM -u NONE -e -c "mkspell! -ascii $SPELLDIR/ny ny_MW" -c q
+
+../README_ny.txt : README_ny_MW.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} ny_MW.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+ny_MW.aff ny_MW.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch ny_MW.zip
+ :sys $UNZIP ny_MW.zip
+ :delete ny_MW.zip
+ @if not os.path.exists('ny_MW.orig.aff'):
+ :copy ny_MW.aff ny_MW.orig.aff
+ @if not os.path.exists('ny_MW.orig.dic'):
+ :copy ny_MW.dic ny_MW.orig.dic
+ @if os.path.exists('ny_MW.diff'):
+ :sys patch <ny_MW.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 ny_MW.orig.aff ny_MW.aff >ny_MW.diff
+ :sys {force} diff -a -C 1 ny_MW.orig.dic ny_MW.dic >>ny_MW.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch ny_MW.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../ny_MW.zip
+ :sys {force} diff ../ny_MW.orig.aff ny_MW.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ny_MW.aff ../ny_MW.new.aff
+ :sys {force} diff ../ny_MW.orig.dic ny_MW.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ny_MW.dic ../ny_MW.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete ny_MW.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/ny/ny_MW.diff b/runtime/spell/ny/ny_MW.diff
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/runtime/spell/ny/ny_MW.diff
diff --git a/runtime/spell/pl/main.aap b/runtime/spell/pl/main.aap
new file mode 100644
index 0000000..74cd1d5
--- /dev/null
+++ b/runtime/spell/pl/main.aap
@@ -0,0 +1,92 @@
+# Aap recipe for Polish Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = pl_PL.aff pl_PL.dic
+
+all: $SPELLDIR/pl.iso-8859-2.spl $SPELLDIR/pl.utf-8.spl \
+ $SPELLDIR/pl.cp1250.spl ../README_pl.txt
+
+$SPELLDIR/pl.iso-8859-2.spl : $FILES
+ :sys env LANG=pl_PL.ISO8859-2 $VIM -u NONE -e -c "mkspell! $SPELLDIR/pl pl_PL" -c q
+
+$SPELLDIR/pl.utf-8.spl : $FILES
+ :sys env LANG=pl_PL.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/pl pl_PL" -c q
+
+$SPELLDIR/pl.cp1250.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=cp1250" -c "mkspell! $SPELLDIR/pl pl_PL" -c q
+
+../README_pl.txt: README_pl_PL.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+#OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+#:attr {fetch = $OODIR/%file%} pl_PL.zip
+
+#
+# Fetching the files from
+#
+HTTPDIR = http://www.kurnik.pl/dictionary
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+pl_PL.aff pl_PL.dic: {buildcheck=}
+ :assertpkg tar bunzip2
+ fname = alt-myspell-pl.tar.bz2
+ :attr {fetch = $HTTPDIR/%file%} $fname
+ :fetch $fname
+ :sys bunzip2 -c $fname | tar xf -
+ :move alt-myspell-pl-20[0-9]*/* .
+ :deldir alt-myspell-pl-20[0-9]*
+ :delete $fname
+ @if not os.path.exists('pl_PL.orig.aff'):
+ :copy pl_PL.aff pl_PL.orig.aff
+ @if not os.path.exists('pl_PL.orig.dic'):
+ :copy pl_PL.dic pl_PL.orig.dic
+ @if os.path.exists('pl_PL.diff'):
+ :sys patch <pl_PL.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 pl_PL.orig.aff pl_PL.aff >pl_PL.diff
+ :sys {force} diff -a -C 1 pl_PL.orig.dic pl_PL.dic >>pl_PL.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg tar bunzip2 diff
+ fname = alt-myspell-pl.tar.bz2
+ :attr {fetch = $HTTPDIR/%file%} $fname
+ :fetch $fname
+ :sys bunzip2 -c $fname | tar xf -
+ :cd alt-myspell-pl-20[0-9]*
+ @try:
+ @import stat
+ :sys $UNZIP ../pl_PL.zip
+ :sys {force} diff ../pl_PL.orig.aff pl_PL.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy pl_PL.aff ../pl_PL.new.aff
+ :sys {force} diff ../pl_PL.orig.dic pl_PL.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy pl_PL.dic ../pl_PL.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} $base
+ :delete $fname
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/pl/pl_PL.diff b/runtime/spell/pl/pl_PL.diff
new file mode 100644
index 0000000..a53ead3
--- /dev/null
+++ b/runtime/spell/pl/pl_PL.diff
@@ -0,0 +1,10 @@
+*** pl_PL.orig.aff Fri Jul 8 06:50:06 2005
+--- pl_PL.aff Fri Jul 8 23:03:48 2005
+***************
+*** 3,4 ****
+--- 3,7 ----
+
++ FOL
++ LOW
++ UPP
+
diff --git a/runtime/spell/pt/main.aap b/runtime/spell/pt/main.aap
new file mode 100644
index 0000000..d7be764
--- /dev/null
+++ b/runtime/spell/pt/main.aap
@@ -0,0 +1,168 @@
+# Aap recipe for Portuguese Vim spell files.
+# See ftp://ftp.vim.org/pub/vim/runtime/spell/README.txt
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = pt_PT.aff pt_PT.dic
+ pt_BR.aff pt_BR.dic
+
+#
+# Fetching the pt_PT files from the Natura project.
+#
+PT_FNAME = oo3x-pt-PT.oxt
+PT_DIR = http://extensions.services.openoffice.org/e-files/1196/5/$(PT_FNAME)
+:attr {fetch = $PT_DIR} $PT_FNAME
+
+#
+# Fetching the pt_BR files from BrOffice.org (Brazilian OOo).
+#
+BR_FNAME = Vero_pt_BR_V207AOC.oxt
+BR_DIR = http://www.broffice.org/files/$(BR_FNAME)
+:attr {fetch = $BR_DIR} $BR_FNAME
+
+all: $SPELLDIR/pt.latin1.spl $SPELLDIR/pt.utf-8.spl \
+ ../README_pt.txt
+
+$SPELLDIR/pt.latin1.spl : $FILES
+ :sys env LANG=pt_PT.ISO-8859-1 LC_ALL=pt_PT.ISO-8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/pt pt_PT pt_BR" -c q
+
+$SPELLDIR/pt.utf-8.spl : $FILES
+ :sys env LANG=pt_PT.UTF-8 LC_ALL=pt_PT.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/pt pt_PT pt_BR" -c q
+
+../README_pt.txt: README_pt_PT.txt README_pt_BR.txt
+ :print pt_PT >!$target
+ :cat README_pt_PT.txt | :eval re.sub('\r', '', stdin) >>$target
+ :print =================================================== >>$target
+ :print pt_BR: >>$target
+ :cat README_pt_BR.txt | :eval re.sub('\r', '', stdin) >>$target
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+pt_PT.aff pt_PT.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch $PT_FNAME
+ :sys $UNZIP $PT_FNAME
+ :delete $PT_FNAME
+ :move dictionaries/pt_PT.dic .
+ :move dictionaries/pt_PT.aff .
+ :move dictionaries/README_pt_PT.txt .
+ :move dictionaries/COPYING COPYING_pt_PT.txt
+ :delete {r}{f} dictionaries
+ :delete {r}{f} META-INF
+ :delete {f} description.xml
+ :delete {f} dictionaries.xcu
+ :delete {f} LICENSES.txt
+ # Remove grammar items and the duplicates this causes
+ :sys $VIM pt_PT.dic -u NONE -e -c "%s/\t.*//" -c "2,$$ sort u" -c update -c q
+ :sys $VIM pt_PT.aff -u NONE -e -c "%s/\S\+=\S\+$$//" -c update -c q
+ @if not os.path.exists('pt_PT.orig.aff'):
+ :copy pt_PT.aff pt_PT.orig.aff
+ @if not os.path.exists('pt_PT.orig.dic'):
+ :copy pt_PT.dic pt_PT.orig.dic
+ @if os.path.exists('pt_PT.diff'):
+ :sys patch <pt_PT.diff
+
+pt_BR.aff pt_BR.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch $BR_FNAME
+ :sys $UNZIP $BR_FNAME
+ :delete $BR_FNAME
+ :delete {f} description.xml
+ :delete {f} dictionaries.xcu
+ :delete {f} hyph_pt_BR.dic
+ :delete {r}{f} META-INF
+ :delete {f} README_en.TXT
+ :delete {f} README_hyph_pt_BR.TXT
+ :sys $VIM README_pt_BR.TXT -u NONE -N -e -c "set ff=unix" -c update -c q
+ :move README_pt_BR.TXT README_pt_BR.txt
+
+ :sys $VIM pt_BR.dic -u NONE -N -e -c "set ff=unix" -c update -c q
+ :sys $VIM pt_BR.aff -u NONE -N -e -c "set ff=unix" -c update -c q
+ @if not os.path.exists('pt_BR.orig.aff'):
+ :copy pt_BR.aff pt_BR.orig.aff
+ @if not os.path.exists('pt_BR.orig.dic'):
+ :copy pt_BR.dic pt_BR.orig.dic
+ @if os.path.exists('pt_BR.diff'):
+ :sys patch <pt_BR.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 pt_PT.orig.aff pt_PT.aff >pt_PT.diff
+ :sys {force} diff -a -C 1 pt_PT.orig.dic pt_PT.dic >>pt_PT.diff
+ :sys {force} diff -a -C 1 pt_BR.orig.aff pt_BR.aff >pt_BR.diff
+ :sys {force} diff -a -C 1 pt_BR.orig.dic pt_BR.dic >>pt_BR.diff
+
+# Delete all downloaded and generated files.
+clean: clean_pt_BR clean_pt_PT
+
+clean_pt_BR:
+ :delete {f} pt_BR.aff
+ :delete {f} pt_BR.dic
+ :delete {f} pt_BR.orig.aff
+ :delete {f} pt_BR.orig.dic
+ :delete {f} README_pt_BR.txt
+
+clean_pt_PT:
+ :delete {f} pt_PT.aff
+ :delete {f} pt_PT.dic
+ :delete {f} pt_PT.orig.aff
+ :delete {f} pt_PT.orig.dic
+ :delete {f} README_pt_PT.txt
+ :delete {f} COPYING_pt_PT.txt
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+# TO BE IMPLEMENTED
+
+check: check-pt check-br
+
+check-pt:
+ :assertpkg unzip diff
+ :fetch $PT_FNAME
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../$PT_FNAME
+ :sys {force} diff ../pt_PT.orig.aff pt_PT.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy pt_PT.aff ../pt_PT.new.aff
+ :sys {force} diff ../pt_PT.orig.dic pt_PT.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy pt_PT.dic ../pt_PT.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete $PT_FNAME
+
+check-br:
+ :assertpkg unzip diff
+ :fetch $BR_FNAME
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../$BR_FNAME
+ :sys {force} diff ../pt_BR.orig.aff pt_BR.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy pt_BR.aff ../pt_BR.new.aff
+ :sys {force} diff ../pt_BR.orig.dic pt_BR.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy pt_BR.dic ../pt_BR.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete $BR_FNAME
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/pt/pt_BR.diff b/runtime/spell/pt/pt_BR.diff
new file mode 100644
index 0000000..6ccf3f3
--- /dev/null
+++ b/runtime/spell/pt/pt_BR.diff
@@ -0,0 +1,88 @@
+*** pt_BR.orig.aff 2010-08-11 22:50:41.000000000 +0200
+--- pt_BR.aff 2010-08-11 23:01:57.000000000 +0200
+***************
+*** 1,3 ****
+ SET ISO8859-1
+! TRY esianrtolcdugmphbyfvkwjqxz
+
+--- 1,3 ----
+ SET ISO8859-1
+!
+
+***************
+*** 13,14 ****
+--- 13,32 ----
+
++ NAME Brazilian Portuguese
++ VERSION 2008-07-07V
++ HOME http://www.broffice.org/verortografico
++ AUTHOR Raimundo Santos Moura
++ EMAIL raimundomoura AT openoffice DOT org
++ AUTHOR Leonardo Ferreira Fontenelle
++ EMAIL leo DOT fontenelle AT gmail DOT org
++ COPYRIGHT LGPL
++
++
++ FOL
++ LOW
++ UPP
++
++
++ MIDWORD '-.
++
++
+ MAP 6
+***************
+*** 21,41 ****
+
+! BREAK 15
+! BREAK BREAK
+! BREAK ^-
+! BREAK -$
+! BREAK ^ex-
+! BREAK ^Ex-
+! BREAK ^EX-
+! BREAK ^recm-
+! BREAK ^Recm-
+! BREAK ^RECM-
+! BREAK ^ps-
+! BREAK ^Ps-
+! BREAK ^PS-
+! BREAK ^pr-
+! BREAK ^pr-
+! BREAK ^PR-
+
+ # Nmero mximo de sugestes
+! MAXNGRAMSUGS 12
+
+--- 39,59 ----
+
+! #BREAK 15
+! #BREAK BREAK
+! #BREAK ^-
+! #BREAK -$
+! #BREAK ^ex-
+! #BREAK ^Ex-
+! #BREAK ^EX-
+! #BREAK ^recm-
+! #BREAK ^Recm-
+! #BREAK ^RECM-
+! #BREAK ^ps-
+! #BREAK ^Ps-
+! #BREAK ^PS-
+! #BREAK ^pr-
+! #BREAK ^pr-
+! #BREAK ^PR-
+
+ # Nmero mximo de sugestes
+! #MAXNGRAMSUGS 12
+
+***************
+*** 44,46 ****
+
+! WORDCHARS -
+
+--- 62,64 ----
+
+! #WORDCHARS -
+
diff --git a/runtime/spell/pt/pt_PT.diff b/runtime/spell/pt/pt_PT.diff
new file mode 100644
index 0000000..88411a1
--- /dev/null
+++ b/runtime/spell/pt/pt_PT.diff
@@ -0,0 +1,45 @@
+*** pt_PT.orig.aff 2010-08-11 22:50:30.000000000 +0200
+--- pt_PT.aff 2010-08-11 22:50:30.000000000 +0200
+***************
+*** 1,6 ****
+ SET UTF-8
+! LANG pt_PT
+! TRY aerisontcdmlupvgbfzáhçqjíxãóéêâúõACMPSBTELGRIFVDkHJONôywUKXZWQÁYÍÉàÓèÂÚ
+! KEY qwertyuiop|asdfghjkl|zxcvbnm
+! WORDCHARS -
+
+--- 1,10 ----
+ SET UTF-8
+! #LANG pt_PT
+! #TRY aerisontcdmlupvgbfzáhçqjíxãóéêâúõACMPSBTELGRIFVDkHJONôywUKXZWQÁYÍÉàÓèÂÚ
+! #KEY qwertyuiop|asdfghjkl|zxcvbnm
+! #WORDCHARS -
+!
+! FOL ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
+! LOW ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
+! UPP ßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞÿ
+
+***************
+*** 1300,1312 ****
+
+! MAP 11
+! MAP aá
+! MAP aã
+! MAP aâ
+! MAP eé
+! MAP eê
+! MAP ií
+ MAP cç
+! MAP oó
+! MAP oô
+! MAP oõ
+! MAP uú
+--- 1304,1311 ----
+
+! MAP 6
+! MAP aáãâAÁÃÂ
+! MAP eéêEÉÊ
+! MAP iíIÍ
+ MAP cç
+! MAP oóõôOÓÕÔ
+! MAP uúüUÚÜ
diff --git a/runtime/spell/ro/main.aap b/runtime/spell/ro/main.aap
new file mode 100644
index 0000000..8f2379d
--- /dev/null
+++ b/runtime/spell/ro/main.aap
@@ -0,0 +1,101 @@
+# Aap recipe for Romanian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = ro_RO.aff ro_RO.dic
+
+all: $SPELLDIR/ro.utf-8.spl \
+ $SPELLDIR/ro.iso-8859-2.spl \
+ $SPELLDIR/ro.cp1250.spl \
+ ../README_ro.txt
+
+$SPELLDIR/ro.utf-8.spl : $FILES
+ :sys env LANG=ro_RO.utf8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/ro ro_RO" -c q
+
+# Note: this generates conversion errors, because not all characters can be
+# represented in iso-8859-2.
+$SPELLDIR/ro.iso-8859-2.spl : $FILES
+ :sys env LANG=ro_RO.iso88592 $VIM -u NONE -e -c "mkspell! $SPELLDIR/ro ro_RO" -c q
+
+# Note: this generates conversion errors, because not all characters can be
+# represented in cp1250.
+$SPELLDIR/ro.cp1250.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=cp1250" -c "mkspell! $SPELLDIR/ro ro_RO" -c q
+
+../README_ro.txt: README
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+#OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+OODIR = http://sourceforge.net/projects/rospell/files/Romanian%20dictionaries/dict-3.3.10
+ZIPFILE = ro_RO.3.3.10.zip
+:attr {fetch = $OODIR/%file%} $ZIPFILE
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+ro_RO.aff ro_RO.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch $ZIPFILE
+ :sys $UNZIP $ZIPFILE
+ :delete $ZIPFILE
+ @if not os.path.exists('ro_RO.orig.aff'):
+ :copy ro_RO.aff ro_RO.orig.aff
+ @if not os.path.exists('ro_RO.orig.dic'):
+ :copy ro_RO.dic ro_RO.orig.dic
+ @if os.path.exists('ro_RO.diff'):
+ :sys patch <ro_RO.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 ro_RO.orig.aff ro_RO.aff >ro_RO.diff
+ :sys {force} diff -a -C 1 ro_RO.orig.dic ro_RO.dic >>ro_RO.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch $ZIPFILE
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../$ZIPFILE
+ :sys {force} diff ../ro_RO.orig.aff ro_RO.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ro_RO.aff ../ro_RO.new.aff
+ :sys {force} diff ../ro_RO.orig.dic ro_RO.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy ro_RO.dic ../ro_RO.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete $ZIPFILE
+
+# Remove all the downloaded and generated files.
+clean:
+ :delete ro_RO.aff
+ :delete ro_RO.dic
+ :delete ro_RO.orig.aff
+ :delete ro_RO.orig.dic
+ :delete ro_RO-ante1993.aff
+ :delete ro_RO-ante1993.dic
+ :delete COPYING.GPL
+ :delete COPYING.LGPL
+ :delete COPYING.MPL
+ :delete README
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/ro/ro_RO.diff b/runtime/spell/ro/ro_RO.diff
new file mode 100644
index 0000000..2c18228
--- /dev/null
+++ b/runtime/spell/ro/ro_RO.diff
@@ -0,0 +1,34 @@
+*** ro_RO.orig.aff 2014-08-29 16:29:21.162457824 +0200
+--- ro_RO.aff 2014-09-19 15:29:52.354413307 +0200
+***************
+*** 3,5 ****
+ TRY iaăâșțîertolncusmpdbgfzvhjxkwyqACDM
+! KEY qwertyuiop|asdfghjkl|zxcvbnm
+
+--- 3,9 ----
+ TRY iaăâșțîertolncusmpdbgfzvhjxkwyqACDM
+! # KEY qwertyuiop|asdfghjkl|zxcvbnm
+!
+! # ignore extra field (specifies type of word?)
+! IGNOREEXTRA
+!
+
+***************
+*** 1546,1553 ****
+ SFX q 0 ilor . adj. m. pl. dat.
+! SFX q 0 ă
+! SFX q 0 a
+! SFX q 0 ei
+! SFX q 0 e
+! SFX q 0 ele
+! SFX q 0 elor
+ PFX q Y 1
+--- 1550,1557 ----
+ SFX q 0 ilor . adj. m. pl. dat.
+! SFX q 0 ă .
+! SFX q 0 a .
+! SFX q 0 ei .
+! SFX q 0 e .
+! SFX q 0 ele .
+! SFX q 0 elor .
+ PFX q Y 1
diff --git a/runtime/spell/ru/main.aap b/runtime/spell/ru/main.aap
new file mode 100644
index 0000000..e3d37a1
--- /dev/null
+++ b/runtime/spell/ru/main.aap
@@ -0,0 +1,84 @@
+# Aap recipe for Russian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+REGIONS = RU YO
+SPELLDIR = ..
+FILES = ru_$*(REGIONS).aff ru_$*(REGIONS).dic
+
+all: $SPELLDIR/ru.koi8-r.spl $SPELLDIR/ru.utf-8.spl \
+ $SPELLDIR/ru.cp1251.spl ../README_ru.txt
+
+$SPELLDIR/ru.koi8-r.spl : $FILES
+ :sys env LANG=ru_RU.KOI8-R $VIM -u NONE -e -c "mkspell! $SPELLDIR/ru ru_RU ru_YO" -c q
+
+$SPELLDIR/ru.utf-8.spl : $FILES
+ :sys env LANG=ru_RU.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/ru ru_RU ru_YO" -c q
+
+$SPELLDIR/ru.cp1251.spl : $FILES
+ :sys env LANG=ru_RU.CP1251 $VIM -u NONE -e -c "mkspell! $SPELLDIR/ru ru_RU ru_YO" -c q
+
+../README_ru.txt: README_ru_$*(REGIONS).txt
+ :print ru_RU >! $target
+ :cat README_ru_RU.txt >> $target
+ :print =================================================== >>$target
+ :print ru_YO >> $target
+ :cat README_ru_YO.txt >> $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} ru_RU.zip ru_RU_yo.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+ru_RU.aff ru_RU.dic: {buildcheck=}
+ :assertpkg unzip
+ :fetch ru_RU.zip
+ :sys unzip ru_RU.zip
+ :delete ru_RU.zip
+ @if not os.path.exists('ru_RU.orig.aff'):
+ :copy ru_RU.aff ru_RU.orig.aff
+ @if not os.path.exists('ru_RU.orig.dic'):
+ :copy ru_RU.dic ru_RU.orig.dic
+ @if os.path.exists('ru_RU.diff'):
+ :sys patch <ru_RU.diff
+
+ru_YO.aff ru_YO.dic: {buildcheck=}
+ :assertpkg unzip
+ :fetch ru_RU_yo.zip
+ :sys unzip ru_RU_yo.zip
+ :delete ru_RU_yo.zip
+ :move ru_RU_yo.aff ru_YO.aff
+ :move ru_RU_yo.dic ru_YO.dic
+ :move README_ru_RU_yo.txt README_ru_YO.txt
+ @if not os.path.exists('ru_YO.orig.aff'):
+ :copy ru_YO.aff ru_YO.orig.aff
+ @if not os.path.exists('ru_YO.orig.dic'):
+ :copy ru_YO.dic ru_YO.orig.dic
+ @if os.path.exists('ru_YO.diff'):
+ :sys patch <ru_YO.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 ru_RU.orig.aff ru_RU.aff >ru_RU.diff
+ :sys {force} diff -a -C 1 ru_RU.orig.dic ru_RU.dic >>ru_RU.diff
+ :sys {force} diff -a -C 1 ru_YO.orig.aff ru_YO.aff >ru_YO.diff
+ :sys {force} diff -a -C 1 ru_YO.orig.dic ru_YO.dic >>ru_YO.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :print Doesn't work yet.
diff --git a/runtime/spell/ru/ru_RU.diff b/runtime/spell/ru/ru_RU.diff
new file mode 100644
index 0000000..465da3e
--- /dev/null
+++ b/runtime/spell/ru/ru_RU.diff
@@ -0,0 +1,50 @@
+*** ru_RU.orig.aff Sun Aug 28 21:12:27 2005
+--- ru_RU.aff Mon Sep 12 22:10:22 2005
+***************
+*** 3,4 ****
+--- 3,11 ----
+
++ FOL ţ
++ LOW ţ
++ UPP
++
++ SOFOFROM ţ
++ SOFOTO ''
++
+ SFX L Y 52
+*** ru_RU.orig.dic Sun Aug 28 21:12:27 2005
+--- ru_RU.dic Sun Sep 4 17:23:27 2005
+***************
+*** 8767,8769 ****
+ /F
+- /A
+ /AZ
+--- 8767,8768 ----
+***************
+*** 98086,98088 ****
+ /AES
+- /AS
+ /A
+--- 98085,98086 ----
+***************
+*** 115006,115009 ****
+ /A
+! /B
+! /O
+ /L
+--- 115004,115006 ----
+ /A
+! /BO
+ /L
+***************
+*** 119209,119211 ****
+ /ASX
+- /AX
+ /A
+--- 119206,119207 ----
+***************
+*** 120603,120605 ****
+ /ASX
+- /AX
+ /L
+--- 120599,120600 ----
diff --git a/runtime/spell/ru/ru_YO.diff b/runtime/spell/ru/ru_YO.diff
new file mode 100644
index 0000000..741372d
--- /dev/null
+++ b/runtime/spell/ru/ru_YO.diff
@@ -0,0 +1,32 @@
+*** ru_YO.orig.aff Sun Aug 28 21:12:35 2005
+--- ru_YO.aff Mon Sep 12 22:10:32 2005
+***************
+*** 3,4 ****
+--- 3,11 ----
+
++ FOL ţ
++ LOW ţ
++ UPP
++
++ SOFOFROM ţ
++ SOFOTO ''
++
+ SFX L Y 56
+*** ru_YO.orig.dic Sun Aug 28 21:12:35 2005
+--- ru_YO.dic Sun Sep 4 17:24:26 2005
+***************
+*** 86471,86473 ****
+ ԣ/AS
+-
+ /B
+--- 86471,86472 ----
+***************
+*** 115245,115248 ****
+ /A
+! /B
+! /O
+ /L
+--- 115244,115246 ----
+ /A
+! /BO
+ /L
diff --git a/runtime/spell/rw/main.aap b/runtime/spell/rw/main.aap
new file mode 100644
index 0000000..0eda99d
--- /dev/null
+++ b/runtime/spell/rw/main.aap
@@ -0,0 +1,79 @@
+# Aap recipe for Kinyarwanda (Rwanda) Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = rw_RW.aff rw_RW.dic
+
+all: $SPELLDIR/rw.latin1.spl $SPELLDIR/rw.utf-8.spl ../README_rw.txt
+
+# I don't have a Kinyarwanda locale, use the Dutch one instead.
+$SPELLDIR/rw.latin1.spl : $FILES
+ :sys env LANG=nl_NL.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/rw rw_RW" -c q
+
+$SPELLDIR/rw.utf-8.spl : $FILES
+ :sys env LANG=nl_NL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/rw rw_RW" -c q
+
+../README_rw.txt : README_rw_RW.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} rw_RW.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+rw_RW.aff rw_RW.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch rw_RW.zip
+ :sys $UNZIP rw_RW.zip
+ :delete rw_RW.zip
+ @if not os.path.exists('rw_RW.orig.aff'):
+ :copy rw_RW.aff rw_RW.orig.aff
+ @if not os.path.exists('rw_RW.orig.dic'):
+ :copy rw_RW.dic rw_RW.orig.dic
+ @if os.path.exists('rw_RW.diff'):
+ :sys patch <rw_RW.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 rw_RW.orig.aff rw_RW.aff >rw_RW.diff
+ :sys {force} diff -a -C 1 rw_RW.orig.dic rw_RW.dic >>rw_RW.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch rw_RW.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../rw_RW.zip
+ :sys {force} diff ../rw_RW.orig.aff rw_RW.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy rw_RW.aff ../rw_RW.new.aff
+ :sys {force} diff ../rw_RW.orig.dic rw_RW.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy rw_RW.dic ../rw_RW.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete rw_RW.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/rw/rw_RW.diff b/runtime/spell/rw/rw_RW.diff
new file mode 100644
index 0000000..7de37cd
--- /dev/null
+++ b/runtime/spell/rw/rw_RW.diff
@@ -0,0 +1,13 @@
+*** rw_RW.orig.aff Wed Aug 31 16:53:08 2005
+--- rw_RW.aff Wed Aug 31 16:53:46 2005
+***************
+*** 19 ****
+--- 19,26 ----
+ TRY aiuenorbkmygwthszd'cIAjKUvfNMplBGYRPTHSDWCOZELV-JF
++
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
diff --git a/runtime/spell/sk/main.aap b/runtime/spell/sk/main.aap
new file mode 100644
index 0000000..db97355
--- /dev/null
+++ b/runtime/spell/sk/main.aap
@@ -0,0 +1,81 @@
+# Aap recipe for Slovak Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = sk_SK.aff sk_SK.dic
+
+all: $SPELLDIR/sk.iso-8859-2.spl $SPELLDIR/sk.utf-8.spl \
+ $SPELLDIR/sk.cp1250.spl ../README_sk.txt
+
+$SPELLDIR/sk.iso-8859-2.spl : $FILES
+ :sys env LANG=sk_SK.ISO8859-2 $VIM -u NONE -e -c "mkspell! $SPELLDIR/sk sk_SK" -c q
+
+$SPELLDIR/sk.utf-8.spl : $FILES
+ :sys env LANG=sk_SK.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/sk sk_SK" -c q
+
+$SPELLDIR/sk.cp1250.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=cp1250" -c "mkspell! $SPELLDIR/sk sk_SK" -c q
+
+../README_sk.txt: README_sk_SK.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} sk_SK.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+sk_SK.aff sk_SK.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch sk_SK.zip
+ :sys $UNZIP sk_SK.zip
+ :delete sk_SK.zip
+ @if not os.path.exists('sk_SK.orig.aff'):
+ :copy sk_SK.aff sk_SK.orig.aff
+ @if not os.path.exists('sk_SK.orig.dic'):
+ :copy sk_SK.dic sk_SK.orig.dic
+ @if os.path.exists('sk_SK.diff'):
+ :sys patch <sk_SK.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 sk_SK.orig.aff sk_SK.aff >sk_SK.diff
+ :sys {force} diff -a -C 1 sk_SK.orig.dic sk_SK.dic >>sk_SK.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch sk_SK.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../sk_SK.zip
+ :sys {force} diff ../sk_SK.orig.aff sk_SK.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy sk_SK.aff ../sk_SK.new.aff
+ :sys {force} diff ../sk_SK.orig.dic sk_SK.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy sk_SK.dic ../sk_SK.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete sk_SK.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/sk/sk_SK.diff b/runtime/spell/sk/sk_SK.diff
new file mode 100644
index 0000000..d279fd3
--- /dev/null
+++ b/runtime/spell/sk/sk_SK.diff
@@ -0,0 +1,18 @@
+*** sk_SK.orig.aff Sun Aug 14 16:48:21 2005
+--- sk_SK.aff Sun Aug 14 16:50:08 2005
+***************
+*** 4,5 ****
+--- 4,9 ----
+
++ FOL
++ LOW
++ UPP
++
+ PFX N Y 1
+*** sk_SK.orig.dic Sun Aug 14 16:48:21 2005
+--- sk_SK.dic Sun Aug 14 16:52:23 2005
+***************
+*** 166567,166568 ****
+ viaka/NX
+- 166567
+--- 166567 ----
diff --git a/runtime/spell/sl/main.aap b/runtime/spell/sl/main.aap
new file mode 100644
index 0000000..4b142bb
--- /dev/null
+++ b/runtime/spell/sl/main.aap
@@ -0,0 +1,81 @@
+# Aap recipe for Slovenian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = sl_SI.aff sl_SI.dic
+
+all: $SPELLDIR/sl.iso-8859-2.spl $SPELLDIR/sl.utf-8.spl \
+ $SPELLDIR/sl.cp1250.spl ../README_sl.txt
+
+$SPELLDIR/sl.iso-8859-2.spl : $FILES
+ :sys env LANG=sl_SI.ISO8859-2 $VIM -u NONE -e -c "mkspell! $SPELLDIR/sl sl_SI" -c q
+
+$SPELLDIR/sl.utf-8.spl : $FILES
+ :sys env LANG=sl_SI.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/sl sl_SI" -c q
+
+$SPELLDIR/sl.cp1250.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=cp1250" -c "mkspell! $SPELLDIR/sl sl_SI" -c q
+
+../README_sl.txt: README_sl_SI.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} sl_SI.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+sl_SI.aff sl_SI.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch sl_SI.zip
+ :sys $UNZIP sl_SI.zip
+ :delete sl_SI.zip
+ @if not os.path.exists('sl_SI.orig.aff'):
+ :copy sl_SI.aff sl_SI.orig.aff
+ @if not os.path.exists('sl_SI.orig.dic'):
+ :copy sl_SI.dic sl_SI.orig.dic
+ @if os.path.exists('sl_SI.diff'):
+ :sys patch <sl_SI.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 sl_SI.orig.aff sl_SI.aff >sl_SI.diff
+ :sys {force} diff -a -C 1 sl_SI.orig.dic sl_SI.dic >>sl_SI.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch sl_SI.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../sl_SI.zip
+ :sys {force} diff ../sl_SI.orig.aff sl_SI.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy sl_SI.aff ../sl_SI.new.aff
+ :sys {force} diff ../sl_SI.orig.dic sl_SI.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy sl_SI.dic ../sl_SI.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete sl_SI.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/sl/sl_SI.diff b/runtime/spell/sl/sl_SI.diff
new file mode 100644
index 0000000..4ca310b
--- /dev/null
+++ b/runtime/spell/sl/sl_SI.diff
@@ -0,0 +1,11 @@
+*** sl_SI.orig.aff Wed Aug 31 20:54:48 2005
+--- sl_SI.aff Wed Aug 31 20:55:37 2005
+***************
+*** 3,4 ****
+--- 3,8 ----
+
++ FOL
++ LOW
++ UPP
++
+ PFX B Y 1
diff --git a/runtime/spell/spell.vim b/runtime/spell/spell.vim
new file mode 100644
index 0000000..375b088
--- /dev/null
+++ b/runtime/spell/spell.vim
@@ -0,0 +1,4 @@
+" Settings for when generating spellfiles.
+"
+" Assume we have 2 Gbyte RAM available.
+set mkspellmem=1800000,6000,1600
diff --git a/runtime/spell/sr/README_sr.txt b/runtime/spell/sr/README_sr.txt
new file mode 100644
index 0000000..6a3b10a
--- /dev/null
+++ b/runtime/spell/sr/README_sr.txt
@@ -0,0 +1,59 @@
+The location of source files for Serbian spelling dictionary were downloaded
+from https://github.com/LibreOffice/dictionaries/tree/master/sr (Serbian
+Spelling and Hyphenation for LibreOffice).
+
+Here is the content of original README file from the repository:
+
+ "LibreOffice Spelling and Hyphenation
+ extension package for Serbian (Cyrillic and Latin)
+
+ This extension package includes the Hunspell dictionary and Hyphen
+ hyphenation patterns for the Serbian language adapted for usage in
+ LibreOffice.
+
+ Serbian spelling dictionary is developed by Milutin Smiljanic
+ <msmiljanic.gm@gmail.com> and is released under GNU LGPL version 3 or
+ later / MPL version 2 or later / GNU GPL version 3 or later, giving
+ you the choice of one of the three sets of free software licensing
+ terms.
+
+ Serbian hyphenation patterns are derived from the official TeX
+ patterns for Serbocroatian language (Cyrillic and Latin) created by
+ Dejan Muhamedagić, version 2.02 from 22 June 2008 adopted for usage
+ with Hyphen hyphenation library and released under GNU LGPL version
+ 2.1 or later."
+
+
+This dictionary used to create Vim spl file is the result of merging the two
+LibreOffice dictionaries for cyrillic and latin script.
+
+The merge was accomplished by concatenating two .dic and .aff files (appending
+the latin to cyrillic).
+
+The first step was to fix both .aff files by adding a '.' at the end of every
+SFX and PFX directive and removing directives that are not supported by Vim
+(KEY, MIDWORD).
+
+Next, update the flags in latin .dic and .aff files so that the flag sequence
+continues monotonically after the last flag number in cyrillic .aff file.
+
+A couple of words in cyrillic dict used a latin codepoints for 'a' and 'e',
+that was also corrected.
+
+You should be able to reproduce this with these steps:
+ * Save the existing sr.aff and sr.dic files, if you have them, they will be
+ overwritten.
+ * Create a subfolder "new".
+ * Put 4 files downloaded from LibreOffice dictionaries GitHub repository in
+ it: sr.aff, sr-Latn.aff, sr.dic and sr-Latn.dic
+ * Open Vim and cd into "new"
+ * Execute: :so ../convert.vim
+ * The resulting sr.aff and sr.dic are created in the parent spell folder
+ (here).
+ * Now one can generate spl file as usual using the merged dic and aff
+ files:
+ env LANG=sr_RS.UTF-8 vim -u NONE -e -c "set enc=utf-8" -c "mkspell! ../sr sr" -c q
+
+
+Ivan Pešić
+28.06.2022.
diff --git a/runtime/spell/sr/convert.vim b/runtime/spell/sr/convert.vim
new file mode 100644
index 0000000..731986e
--- /dev/null
+++ b/runtime/spell/sr/convert.vim
@@ -0,0 +1,30 @@
+:e sr.aff
+:normal gg
+:normal wgu$
+:3d
+:4d
+:normal G
+:normal o
+:r sr-Latn.aff
+:%s#^\(SFX\|PFX\).*[а-џa-ž]\zs$# .#g
+:normal G
+?SET
+:.,+5d
+:.,$s#^\(SFX\|PFX\) \zs\(\d\+\)#\= eval(submatch(2) .. ' + 1903')#
+:w ../sr.aff
+:bd!
+:e sr.dic
+:%s#a#а#g
+:%s#e#е#g
+:normal G
+:normal o
+:r sr-Latn.dic
+:normal 201dd
+:.,$s#/\zs\(\d\+\)\(,\(\d\+\)\)\?$#\=(submatch(2) == '') ? eval(submatch(1) + '1903') : eval(submatch(1) + '1903') .. ',' .. eval(submatch(3) + '1903')#
+:normal {
+:normal dd
+:normal gg
+:normal C502898
+:w ../sr.dic
+:bd!
+:q!
diff --git a/runtime/spell/sr/main.aap b/runtime/spell/sr/main.aap
new file mode 100644
index 0000000..5b2d95e
--- /dev/null
+++ b/runtime/spell/sr/main.aap
@@ -0,0 +1,23 @@
+# Aap recipe for Serbian Vim spell files.
+# See README_sr.txt for instructions to get the .aff and .dic files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = sr.aff sr.dic
+
+all: $SPELLDIR/sr.utf-8.spl ../README_sr.txt
+
+$SPELLDIR/sr.utf-8.spl : $FILES
+ :sys env LANG=sr_RS.UTF-8
+ $VIM -u NONE -e -c "set enc=utf-8" -c "mkspell! $SPELLDIR/sr sr" -c q
+
+../README_sr.txt : README_sr.txt
+ :copy README_sr.txt $target
+
+
+vim: set sts=4 sw=4 :
diff --git a/runtime/spell/sv/main.aap b/runtime/spell/sv/main.aap
new file mode 100644
index 0000000..536a045
--- /dev/null
+++ b/runtime/spell/sv/main.aap
@@ -0,0 +1,93 @@
+# Aap recipe for Swedish Vim spell files.
+#
+# Maintainer: Mattias Winther <vim@mattias.winthernet.se>
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = sv_SE.aff sv_SE.dic
+
+all: $SPELLDIR/sv.latin1.spl $SPELLDIR/sv.utf-8.spl ../README_sv.txt
+
+$SPELLDIR/sv.latin1.spl : $FILES
+ :sys env LANG=sv_SE.ISO-8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/sv sv_SE" -c q
+
+$SPELLDIR/sv.utf-8.spl : $FILES
+ :sys env LANG=sv_SE.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/sv sv_SE" -c q
+
+../README_sv.txt : README_sv.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://extensions.services.openoffice.org/e-files/1080/7
+:attr {fetch = $OODIR/%file%} ooo_swedish_dict_1.43.oxt
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+sv_SE.aff sv_SE.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch ooo_swedish_dict_1.43.oxt
+ :sys $UNZIP ooo_swedish_dict_1.43.oxt
+ :delete ooo_swedish_dict_1.43.oxt
+ :delete {r} META-INF
+ :copy dictionaries/sv_SE.aff sv_SE.aff
+ :copy dictionaries/sv_SE.dic sv_SE.dic
+ :delete {r} dictionaries dictionaries.xcu description.xml
+ :delete {f} README_sv.txt
+ :sys $VIM README_sv.txt -u NONE -N -e -c "0read LICENSE_en_US.txt" -c "read LICENSE_sv_SE.txt" -c "set ff=unix" -c write -c q
+ :delete LICENSE_en_US.txt LICENSE_sv_SE.txt
+ @if not os.path.exists('sv_SE.orig.aff'):
+ :copy sv_SE.aff sv_SE.orig.aff
+ @if not os.path.exists('sv_SE.orig.dic'):
+ :copy sv_SE.dic sv_SE.orig.dic
+ @if os.path.exists('sv_SE.diff'):
+ :sys patch <sv_SE.diff
+
+# Delete all the generated files, start from scratch
+clean:
+ :delete {f} sv_SE.aff sv_SE.dic
+ :delete {f} sv_SE.aff.orig sv_SE.dic.orig
+ :delete {f} sv_SE.orig.aff sv_SE.orig.dic
+ :delete {f} README_sv.txt
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 sv_SE.orig.aff sv_SE.aff >sv_SE.diff
+ :sys {force} diff -a -C 1 sv_SE.orig.dic sv_SE.dic >>sv_SE.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch ooo_swedish_dict_1.43.oxt
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../ooo_swedish_dict_1.43.oxt
+ :sys {force} diff ../sv_SE.orig.aff sv_SE.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy sv_SE.aff ../sv_SE.new.aff
+ :sys {force} diff ../sv_SE.orig.dic sv_SE.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy sv_SE.dic ../sv_SE.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete ooo_swedish_dict_1.43.oxt
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/sv/sv_SE.diff b/runtime/spell/sv/sv_SE.diff
new file mode 100644
index 0000000..4089a66
--- /dev/null
+++ b/runtime/spell/sv/sv_SE.diff
@@ -0,0 +1,205 @@
+*** sv_SE.orig.aff 2010-07-10 14:45:33.000000000 +0200
+--- sv_SE.aff 2010-07-11 17:42:38.000000000 +0200
+***************
+*** 6,7 ****
+--- 6,21 ----
+ NOSUGGEST !
++ FOL
++ LOW
++ UPP
++
++ MAP 9
++ MAP a
++ MAP e
++ MAP i
++ MAP o
++ MAP u
++ MAP n
++ MAP c
++ MAP y
++ MAP s
+
+***************
+*** 649 ****
+--- 663,763 ----
+ SFX t el la/WXZ el
++
++ # soundslike mapping from Aspell
++ # swedish_phonet.dat - Swedish phonetic transformation rules for aspell
++ # Copyright (C) 2000 Martin Norbck <d95mback@dtek.chalmers.se>
++ # distributed under GNU GPL or the Vim license, at your choice.
++ # version 0.2
++
++ SAL & &
++ SAL @ @
++ SAL ANG(EIY)-^ ANI # frledet an- ska inte bli @-ljud
++ SAL AGNO6 AKNO # agnostiker osv.
++ SAL AG(IE)-6 AK # vokal+g(ie) ger ej j-ljud
++ SAL A A
++ SAL BB-< _
++ SAL B P
++ SAL CCO- K # broccoli, piccolo
++ SAL CC KS # successiv, access, succ
++ SAL CH & # choklad osv.
++ SAL CK K # ck -> k som vanligt
++ SAL C(EIY)-< S # c + mjuk vokal -> s
++ SAL C K # c + annat -> k
++ SAL DJ(U)- I # djungel, djvel, adj
++ SAL DD- _
++ SAL D T
++ SAL EG(IE)-6 EK # vokal+g(ie) ger ej j-ljud
++ SAL E E
++ SAL E
++ SAL FF F
++ SAL F F
++ SAL G(EIY)-3 I # g+mjuk vokal ger j-ljud
++ SAL GG6 K
++ SAL GN @N # ugn, lugn...
++ SAL G K
++ SAL H(AOUEIY)-^ H # h i brjan av ord hrs
++ SAL H(AUOEIY)- _ # annars stumt framfr vokal
++ SAL HJ I # hj->j (hjrta osv.)
++ SAL H H
++ SAL IG(IE)-6 IK # vokal+g(ie) ger ej j-ljud
++ SAL I I
++ SAL J I
++ SAL K(EIY)-^ & # k+mjuk vokal ger sje-ljud
++ SAL KJ & # kjol
++ SAL K K
++ SAL LJU- I # ljuga, ljus
++ SAL LL- _
++ SAL L L
++ SAL MM- _
++ SAL M M
++ SAL NG6 @
++ SAL NN- _
++ SAL N N
++ SAL ORIGI8 ORKI # specialfall
++ SAL OG(IE)-6 OK # vokal+g(ie) ger ej j-ljud
++ SAL O O
++ SAL PROJEKT PRO&EKT # specialfall
++ SAL PSALT< SALT # specialfall
++ SAL PSALM< SALM # specialfall
++ SAL PP- _
++ SAL P P
++ SAL Q K
++ SAL RGI$6 RGI # inget j i slutet
++ SAL RGA$6 RIA # hr r det dremot j (arga,frga)
++ SAL RGE$6 RIE # hr ocks (Norge, verge)
++ SAL RGS$ RIS # rgs i slutet
++ SAL RG$ RI # rg i slutet
++ SAL RD T # "bltt" d
++ SAL RN N # "bltt" n
++ SAL RT T # "bltt" t
++ SAL RLD T # vrld
++ SAL RL L # "bltt" l
++ SAL RS & # sje-ljud (fars, grsgrd)
++ SAL RR- _
++ SAL R R
++ SAL SS- _
++ SAL SCHIZ6 SKITS # specialfall
++ SAL SCH6 &
++ SAL SKJ & # skjorta, skjuta
++ SAL SJ & # sje-ljud
++ SAL S S
++ SAL TION9^ TION # tionde
++ SAL TION6 &ON # station osv.
++ SAL TT- _
++ SAL T T
++ SAL UG(IE)-6 UK # vokal+g(ie) ger ej j-ljud
++ SAL U U
++ SAL V F
++ SAL W F
++ SAL X9 KS
++ SAL YG(IE)-6 YK # vokal+g(ie) ger ej j-ljud
++ SAL Y I
++ SAL ZZ TS
++ SAL Z S
++ SAL TTIO9 OTIO # specialfall (ej sje-ljud)
++ SAL RTION9 ORTION # specialfall (r hrs)
++ SAL G(IE)-6 OK # vokal+g(ie) ger ej j-ljud
++ SAL O
++ SAL G(IE)-6 EK # vokal+g(ie) ger ej j-ljud
++ SAL E
++ SAL G(IE)-6 K # vokal+g(ie) ger ej j-ljud
++ SAL
+*** sv_SE.orig.dic 2010-07-10 14:45:33.000000000 +0200
+--- sv_SE.dic 2010-07-10 14:45:33.000000000 +0200
+***************
+*** 11786,11788 ****
+ DVD
+! dvs
+ dvljas
+--- 11786,11788 ----
+ DVD
+! #dvs Removed by Stefan.
+ dvljas
+***************
+*** 31959,31960 ****
+--- 31959,32024 ----
+ korsning/ADGvY
++
++ # Additions by Stefan:
++ SEK
++ adr.
++ anm.
++ art.
++ aug.
++ bl.a.
++ d.v.s.
++ dec.
++ dr
++ dvs.
++ e.Kr.
++ e.d.
++ enl.
++ etc.
++ f.Kr.
++ f.d.
++ f.n.
++ f..
++ febr.
++ fig.
++ fil.kand.
++ fil.lic.
++ forts.
++ fr.o.m.
++ fre.
++ jan.
++ jfr
++ kap.
++ kl.
++ lr.
++ m.fl.
++ m.m.
++ max.
++ min.
++ mn.
++ ngn
++ ngt
++ nov.
++ nr.
++ o.s.v.
++ obs.
++ okt.
++ ons.
++ osv.
++ p.g.a.
++ resp.
++ s.k.
++ sept.
++ sn.
++ t.ex.
++ t.o.m.
++ tab.
++ tis.
++ tors.
++ u.a.
++ uppl.
++ utg.
++ v.g.
++ v.g.v.
++ vard.
++ vd
++ vol.
+ korsningsfri/OY
diff --git a/runtime/spell/sw/main.aap b/runtime/spell/sw/main.aap
new file mode 100644
index 0000000..ef47585
--- /dev/null
+++ b/runtime/spell/sw/main.aap
@@ -0,0 +1,79 @@
+# Aap recipe for Kiswahili Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = sw_KE.aff sw_KE.dic
+
+all: $SPELLDIR/sw.latin1.spl $SPELLDIR/sw.utf-8.spl ../README_sw.txt
+
+# I don't have a Kiswahili locale, use the Dutch one instead.
+$SPELLDIR/sw.latin1.spl : $FILES
+ :sys env LANG=nl_NL.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/sw sw_KE" -c q
+
+$SPELLDIR/sw.utf-8.spl : $FILES
+ :sys env LANG=nl_NL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/sw sw_KE" -c q
+
+../README_sw.txt : README_sw_KE.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} sw_KE.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+sw_KE.aff sw_KE.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch sw_KE.zip
+ :sys $UNZIP sw_KE.zip
+ :delete sw_KE.zip
+ @if not os.path.exists('sw_KE.orig.aff'):
+ :copy sw_KE.aff sw_KE.orig.aff
+ @if not os.path.exists('sw_KE.orig.dic'):
+ :copy sw_KE.dic sw_KE.orig.dic
+ @if os.path.exists('sw_KE.diff'):
+ :sys patch <sw_KE.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 sw_KE.orig.aff sw_KE.aff >sw_KE.diff
+ :sys {force} diff -a -C 1 sw_KE.orig.dic sw_KE.dic >>sw_KE.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch sw_KE.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../sw_KE.zip
+ :sys {force} diff ../sw_KE.orig.aff sw_KE.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy sw_KE.aff ../sw_KE.new.aff
+ :sys {force} diff ../sw_KE.orig.dic sw_KE.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy sw_KE.dic ../sw_KE.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete sw_KE.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/sw/sw_KE.diff b/runtime/spell/sw/sw_KE.diff
new file mode 100644
index 0000000..b084db6
--- /dev/null
+++ b/runtime/spell/sw/sw_KE.diff
@@ -0,0 +1,13 @@
+*** sw_KE.orig.aff Wed Aug 31 16:57:00 2005
+--- sw_KE.aff Wed Aug 31 16:57:28 2005
+***************
+*** 21 ****
+--- 21,28 ----
+ TRY aiunkemohwtlsgybzpdrfjcv'KMSAWTLBNEYDUGHPFIROZJC-V
++
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
diff --git a/runtime/spell/tet/main.aap b/runtime/spell/tet/main.aap
new file mode 100644
index 0000000..a56531c
--- /dev/null
+++ b/runtime/spell/tet/main.aap
@@ -0,0 +1,79 @@
+# Aap recipe for Tetum Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = tet_ID.aff tet_ID.dic
+
+# I don't have a Tetum locale, use the Dutch one instead.
+all: $SPELLDIR/tet.latin1.spl $SPELLDIR/tet.utf-8.spl ../README_tet.txt
+
+$SPELLDIR/tet.latin1.spl : $FILES
+ :sys env LANG=nl_NL.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/tet tet_ID" -c q
+
+$SPELLDIR/tet.utf-8.spl : $FILES
+ :sys env LANG=nl_NL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/tet tet_ID" -c q
+
+../README_tet.txt : README_tet_ID.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} tet_ID.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+tet_ID.aff tet_ID.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch tet_ID.zip
+ :sys $UNZIP tet_ID.zip
+ :delete tet_ID.zip
+ @if not os.path.exists('tet_ID.orig.aff'):
+ :copy tet_ID.aff tet_ID.orig.aff
+ @if not os.path.exists('tet_ID.orig.dic'):
+ :copy tet_ID.dic tet_ID.orig.dic
+ @if os.path.exists('tet_ID.diff'):
+ :sys patch <tet_ID.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 tet_ID.orig.aff tet_ID.aff >tet_ID.diff
+ :sys {force} diff -a -C 1 tet_ID.orig.dic tet_ID.dic >>tet_ID.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch tet_ID.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../tet_ID.zip
+ :sys {force} diff ../tet_ID.orig.aff tet_ID.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy tet_ID.aff ../tet_ID.new.aff
+ :sys {force} diff ../tet_ID.orig.dic tet_ID.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy tet_ID.dic ../tet_ID.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete tet_ID.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/tet/tet_ID.diff b/runtime/spell/tet/tet_ID.diff
new file mode 100644
index 0000000..941121c
--- /dev/null
+++ b/runtime/spell/tet/tet_ID.diff
@@ -0,0 +1,26 @@
+*** tet_ID.orig.aff Wed Aug 31 21:14:37 2005
+--- tet_ID.aff Wed Aug 31 21:15:15 2005
+***************
+*** 19 ****
+--- 19,39 ----
+ TRY aineousrthlkmdbp'fTvgzLAINjSPEMD-KHFRUBGJOcwxCWXVqZQy
++
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
++ MIDWORD '-
++
++ MAP 9
++ MAP a
++ MAP e
++ MAP i
++ MAP o
++ MAP u
++ MAP n
++ MAP c
++ MAP y
++ MAP s
diff --git a/runtime/spell/th/main.aap b/runtime/spell/th/main.aap
new file mode 100644
index 0000000..e2ec660
--- /dev/null
+++ b/runtime/spell/th/main.aap
@@ -0,0 +1,66 @@
+# Aap recipe for Thai Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = th.aff th.dic
+
+all: $SPELLDIR/th.utf-8.spl ../README_th.txt
+
+$SPELLDIR/th.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "mkspell! $SPELLDIR/th th" -c q
+
+../README_th.txt: README_th.txt
+ :copy $source $target
+
+#
+# Fetching the files from http://sesrc.th.net
+#
+HTTPDIR = http://seasrc.th.net/dict
+ZIPNAME = th_18057.zip
+FNAME = TH_18057.TXT
+
+:attr {fetch = $HTTPDIR/%file%} $ZIPNAME
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+#
+# We get a plain list of Thai words and make the .dic file from that. The .aff
+# file is made from scratch.
+th.aff th.dic: {buildcheck=}
+ :assertpkg unzip iconv
+ :fetch $ZIPNAME
+ :sys unzip $ZIPNAME
+ :sys {force} iconv -c -f TIS-620 -t UTF-8 <$FNAME >th.dic
+ :delete $ZIPNAME $FNAME
+
+ :delete {force} th.aff
+ :touch {force} th.aff
+ @if not os.path.exists('th.orig.aff'):
+ :touch {force} th.orig.aff
+ @if not os.path.exists('th.orig.dic'):
+ :copy th.dic th.orig.dic
+ @if os.path.exists('th.diff'):
+ :sys patch <th.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -N -a -C 1 th.orig.aff th.aff >th.diff
+ :sys {force} diff -a -C 1 th.orig.dic th.dic >>th.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :print Sorry, not supported.
diff --git a/runtime/spell/th/th.diff b/runtime/spell/th/th.diff
new file mode 100644
index 0000000..3b750ec
--- /dev/null
+++ b/runtime/spell/th/th.diff
@@ -0,0 +1,247 @@
+*** th.orig.aff Tue Aug 23 22:53:30 2005
+--- th.aff Tue Aug 23 22:53:46 2005
+***************
+*** 0 ****
+--- 1,3 ----
++ SET UTF-8
++
++ NOBREAK
+*** th.orig.dic Tue Aug 23 22:54:10 2005
+--- th.dic Thu Aug 25 15:00:09 2005
+***************
+*** 1 ****
+--- 1,2 ----
++ 99999
+ ก
+***************
+*** 458,460 ****
+ กระต๊อบ
+! กระต่อม { กฺระต่อม }
+ กระต้อยตีวิด
+--- 459,462 ----
+ กระต๊อบ
+! กระต่อม
+! กฺระต่อม
+ กระต้อยตีวิด
+***************
+*** 507,509 ****
+ กระทรวง
+! กระทวย { กฺระทวย }
+ กระทอก
+--- 509,512 ----
+ กระทรวง
+! กระทวย
+! กฺระทวย
+ กระทอก
+***************
+*** 575,577 ****
+ กระบาย
+! กระบาล { กฺระบาน }
+ กระบิ
+--- 578,581 ----
+ กระบาย
+! กระบาล
+! กฺระบาน
+ กระบิ
+***************
+*** 625,627 ****
+ กระเปาะ
+! กระเปี้ย { กฺระเปี้ย }
+ กระแป้
+--- 629,632 ----
+ กระเปาะ
+! กระเปี้ย
+! กฺระเปี้ย
+ กระแป้
+***************
+*** 653,655 ****
+ กระพา
+! กระพาก { กฺระพาก }
+ กระพี้
+--- 658,661 ----
+ กระพา
+! กระพาก
+! กฺระพาก
+ กระพี้
+***************
+*** 784,786 ****
+ กระแสง
+! กระแสะ { กฺระแสะ }
+ กระโสง
+--- 790,793 ----
+ กระแสง
+! กระแสะ
+! กฺระแสะ
+ กระโสง
+***************
+*** 824,826 ****
+ กระหัด
+! กระหาง { กฺระหาง }
+ กระหาย
+--- 831,834 ----
+ กระหัด
+! กระหาง
+! กฺระหาง
+ กระหาย
+***************
+*** 16104,16262 ****
+ ห้อม
+- หอม0
+-
+-
+- Q
+- `
+- q
+- w
+-
+-
+-
+-
+- ช
+-
+-
+- ั
+-
+- ใ
+-
+- ๔
+-
+- 
+-
+- &
+-
+- <
+-
+- X
+- f
+-
+- {
+-
+-
+-
+- ฏ
+-
+-
+- ฯ
+- ๅ
+-
+-
+-
+-
+- 
+-
+-
+- 8
+-
+-
+- W
+-
+- k
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- ะ
+-
+-
+- ๓
+-
+-
+-
+-
+-
+- 9
+- A
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- ธ
+-
+-
+-
+-
+-
+-
+- 
+- #
+-
+-
+-
+-
+-
+- l
+-
+-
+-
+-
+-
+-
+-
+- ฟ
+-
+-
+- ๎
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- ธ
+-
+-
+-
+- ้
+- ๚
+-
+-
+- "
+-
+-
+-
+-
+-
+- j
+-
+-
+-
+-
+-
+-
+-
+-
+-
+-
+- 
+- "
+- 0
+-
+- J
+-
+-
+- t
+-
+-
+-
+-
+-
+ เหมันต์
+--- 16112,16113 ----
diff --git a/runtime/spell/tl/main.aap b/runtime/spell/tl/main.aap
new file mode 100644
index 0000000..49d86ac
--- /dev/null
+++ b/runtime/spell/tl/main.aap
@@ -0,0 +1,77 @@
+# Aap recipe for Tagalog Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = tl_PH.aff tl_PH.dic
+
+all: $SPELLDIR/tl.latin1.spl $SPELLDIR/tl.utf-8.spl ../README_tl.txt
+
+$SPELLDIR/tl.latin1.spl : $FILES
+ :sys env LANG=tl_PH.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/tl tl_PH" -c q
+
+$SPELLDIR/tl.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8" -c "mkspell! $SPELLDIR/tl tl_PH" -c q
+
+../README_tl.txt : README_tl_PH.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} tl_PH.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+tl_PH.aff tl_PH.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch tl_PH.zip
+ :sys $UNZIP tl_PH.zip
+ :delete tl_PH.zip
+ @if not os.path.exists('tl_PH.orig.aff'):
+ :copy tl_PH.aff tl_PH.orig.aff
+ @if not os.path.exists('tl_PH.orig.dic'):
+ :copy tl_PH.dic tl_PH.orig.dic
+ @if os.path.exists('tl_PH.diff'):
+ :sys patch <tl_PH.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 tl_PH.orig.aff tl_PH.aff >tl_PH.diff
+ :sys {force} diff -a -C 1 tl_PH.orig.dic tl_PH.dic >>tl_PH.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch tl_PH.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../tl_PH.zip
+ :sys {force} diff ../tl_PH.orig.aff tl_PH.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy tl_PH.aff ../tl_PH.new.aff
+ :sys {force} diff ../tl_PH.orig.dic tl_PH.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy tl_PH.dic ../tl_PH.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete tl_PH.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/tl/tl_PH.diff b/runtime/spell/tl/tl_PH.diff
new file mode 100644
index 0000000..70208e7
--- /dev/null
+++ b/runtime/spell/tl/tl_PH.diff
@@ -0,0 +1,18 @@
+*** tl_PH.orig.aff Wed Aug 31 21:12:20 2005
+--- tl_PH.aff Wed Aug 31 21:13:16 2005
+***************
+*** 19 ****
+--- 19,31 ----
+ TRY angisotmklypubrhdewAP-SKMINDTHB'LEJGUvWCcORfjYzqFxVQZ
++
++ FOL
++ LOW
++ UPP
++
++ SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
++ SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
++
++ MIDWORD '-
++
++ MAP 1
++ MAP n
diff --git a/runtime/spell/tn/main.aap b/runtime/spell/tn/main.aap
new file mode 100644
index 0000000..61af161
--- /dev/null
+++ b/runtime/spell/tn/main.aap
@@ -0,0 +1,82 @@
+# Aap recipe for Setswana Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = tn_ZA.aff tn_ZA.dic
+
+# I don't have a Setswana locale, use Romanian instead.
+all: $SPELLDIR/tn.iso-8859-2.spl $SPELLDIR/tn.utf-8.spl \
+ $SPELLDIR/tn.cp1250.spl ../README_tn.txt
+
+$SPELLDIR/tn.iso-8859-2.spl : $FILES
+ :sys env LANG=ro_RO.ISO8859-2 $VIM -u NONE -e -c "mkspell! $SPELLDIR/tn tn_ZA" -c q
+
+$SPELLDIR/tn.utf-8.spl : $FILES
+ :sys env LANG=ro_RO.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/tn tn_ZA" -c q
+
+$SPELLDIR/tn.cp1250.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=cp1250" -c "mkspell! $SPELLDIR/tn tn_ZA" -c q
+
+../README_tn.txt: README_tn_ZA.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} tn_ZA.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+tn_ZA.aff tn_ZA.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch tn_ZA.zip
+ :sys $UNZIP tn_ZA.zip
+ :delete tn_ZA.zip
+ @if not os.path.exists('tn_ZA.orig.aff'):
+ :copy tn_ZA.aff tn_ZA.orig.aff
+ @if not os.path.exists('tn_ZA.orig.dic'):
+ :copy tn_ZA.dic tn_ZA.orig.dic
+ @if os.path.exists('tn_ZA.diff'):
+ :sys patch <tn_ZA.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 tn_ZA.orig.aff tn_ZA.aff >tn_ZA.diff
+ :sys {force} diff -a -C 1 tn_ZA.orig.dic tn_ZA.dic >>tn_ZA.diff
+
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch tn_ZA.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../tn_ZA.zip
+ :sys {force} diff ../tn_ZA.orig.aff tn_ZA.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy tn_ZA.aff ../tn_ZA.new.aff
+ :sys {force} diff ../tn_ZA.orig.dic tn_ZA.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy tn_ZA.dic ../tn_ZA.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete tn_ZA.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/tn/tn_ZA.diff b/runtime/spell/tn/tn_ZA.diff
new file mode 100644
index 0000000..dace0d4
--- /dev/null
+++ b/runtime/spell/tn/tn_ZA.diff
@@ -0,0 +1,10 @@
+*** tn_ZA.orig.aff Wed Aug 31 20:46:24 2005
+--- tn_ZA.aff Wed Aug 31 20:47:01 2005
+***************
+*** 21 ****
+--- 21,25 ----
+ TRY aeoltinsghkmbdwrpufyMjSDBKPTL-AJREGNcIvFCUWYáz
++
++ FOL
++ LOW
++ UPP
diff --git a/runtime/spell/tr/main.aap b/runtime/spell/tr/main.aap
new file mode 100644
index 0000000..073cf2a
--- /dev/null
+++ b/runtime/spell/tr/main.aap
@@ -0,0 +1,68 @@
+# Aap recipe for Turkish Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = tr_TR.aff tr_TR.dic
+
+all: $SPELLDIR/tr.utf-8.spl
+
+$SPELLDIR/tr.utf-8.spl : $FILES
+ :sys env LANG=tr_TR.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/tr tr_TR" -c q
+
+# Fetching LibreOffice spell files
+FILE = https://github.com/bitigchi/bitigchi.github.io/raw/master/vim-tr-spell/tr_TR.zip
+:attr {fetch = $FILE} tr_TR.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+tr_TR.aff tr_TR.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch tr_TR.zip
+ :sys $UNZIP tr_TR.zip
+ :delete tr_TR.zip
+ @if not os.path.exists('tr_TR.orig.aff'):
+ :copy tr_TR.aff tr_TR.orig.aff
+ @if not os.path.exists('tr_TR.orig.dic'):
+ :copy tr_TR.dic tr_TR.orig.dic
+ @if os.path.exists('tr_TR.diff'):
+ :sys patch <tr_TR.diff
+
+# Generate diff files
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 tr_TR.orig.aff tr_TR.aff >tr_TR.diff
+ :sys {force} diff -a -C 1 tr_TR.orig.dic tr_TR.dic >>tr_TR.diff
+
+# Check for updated LibreOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+check:
+ :assertpkg unzip diff
+ :fetch tr_TR.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../tr_TR.zip
+ :sys {force} diff ../tr_TR.orig.aff tr_TR.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy tr_TR.aff ../tr_TR.new.aff
+ :sys {force} diff ../tr_TR.orig.dic tr_TR.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy tr_TR.dic ../tr_TR.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete tr_TR.zip
+
+# Remove all the downloaded and generated files.
+clean:
+ :delete tr_TR.aff
+ :delete tr_TR.dic
+ :delete tr_TR.orig.aff
+ :delete tr_TR.orig.dic
diff --git a/runtime/spell/uk/main.aap b/runtime/spell/uk/main.aap
new file mode 100644
index 0000000..3a0fe6d
--- /dev/null
+++ b/runtime/spell/uk/main.aap
@@ -0,0 +1,57 @@
+# Aap recipe for Ukrainian Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = uk_UA.aff uk_UA.dic
+
+all: $SPELLDIR/uk.koi8-u.spl $SPELLDIR/uk.utf-8.spl \
+ ../README_uk.txt
+
+$SPELLDIR/uk.koi8-u.spl : $FILES
+ :sys env LANG=uk_UA.KOI8-U $VIM -u NONE -e -c "mkspell! $SPELLDIR/uk uk_UA" -c q
+
+$SPELLDIR/uk.utf-8.spl : $FILES
+ :sys env LANG=uk_UA.UTF-8 $VIM -u NONE -e -c "mkspell! $SPELLDIR/uk uk_UA" -c q
+
+../README_uk.txt: README_uk_UA.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} uk_UA.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+# This is a bit tricky, since the file name includes the date.
+uk_UA.aff uk_UA.dic: {buildcheck=}
+ :assertpkg unzip
+ :fetch uk_UA.zip
+ :sys unzip uk_UA.zip
+ :delete uk_UA.zip
+ @if not os.path.exists('uk_UA.orig.aff'):
+ :copy uk_UA.aff uk_UA.orig.aff
+ @if not os.path.exists('uk_UA.orig.dic'):
+ :copy uk_UA.dic uk_UA.orig.dic
+ @if os.path.exists('uk_UA.diff'):
+ :sys patch <uk_UA.diff
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 uk_UA.orig.aff uk_UA.aff >uk_UA.diff
+ :sys {force} diff -a -C 1 uk_UA.orig.dic uk_UA.dic >>uk_UA.diff
+
+# Check for updated spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :print Doesn't work yet.
diff --git a/runtime/spell/uk/uk_UA.diff b/runtime/spell/uk/uk_UA.diff
new file mode 100644
index 0000000..8e23dc2
--- /dev/null
+++ b/runtime/spell/uk/uk_UA.diff
@@ -0,0 +1,17 @@
+*** uk_UA.orig.aff Wed Aug 31 21:28:03 2005
+--- uk_UA.aff Wed Aug 31 21:29:53 2005
+***************
+*** 2,5 ****
+ TRY ɦ֧ۤݭ'
+! LOWER ĭŤɦ'
+! UPPER 鶷'
+
+--- 2,9 ----
+ TRY ɦ֧ۤݭ'
+!
+! FOL ĭŤɦ'
+! LOW ĭŤɦ'
+! UPP 鶷'
+!
+! MIDWORD '-
+
diff --git a/runtime/spell/yi.vim b/runtime/spell/yi.vim
new file mode 100644
index 0000000..c08cf8c
--- /dev/null
+++ b/runtime/spell/yi.vim
@@ -0,0 +1,10 @@
+" For Yiddish capitals should not be checked. But only change the
+" 'spellcapcheck' option when it is not at its default value.
+let s:spc = &l:spc
+setlocal spc&
+if s:spc == &l:spc
+ setlocal spc=
+else
+ let &l:spc = s:spc
+endif
+unlet s:spc
diff --git a/runtime/spell/yi/README.txt b/runtime/spell/yi/README.txt
new file mode 100644
index 0000000..09af739
--- /dev/null
+++ b/runtime/spell/yi/README.txt
@@ -0,0 +1,9 @@
+README file for the Yiddish spell file.
+
+The word list was provided by Raphael Finkel. It is the same one that is used
+by uspell.
+
+There also is a romanized (transliterated) word list. This is used for
+latin1. To use this list when 'encoding' is utf-8 use ":set spelllang=yi-tr".
+
+Copyright Raphael Finkel. Included with permission in Vim.
diff --git a/runtime/spell/yi/main.aap b/runtime/spell/yi/main.aap
new file mode 100644
index 0000000..8a98ce0
--- /dev/null
+++ b/runtime/spell/yi/main.aap
@@ -0,0 +1,65 @@
+# Aap recipe for Yiddish Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = yi.dic yi.aff
+WORDFILE = wordlist.utf8.txt
+FILES_TR = yi_tr.dic yi_tr.aff
+WORDFILE_TR = wordlist.txt
+
+all: $SPELLDIR/yi.utf-8.spl $SPELLDIR/yi-tr.utf-8.spl \
+ $SPELLDIR/yi.latin1.spl ../README_yi.txt
+
+$SPELLDIR/yi.utf-8.spl : $FILES
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "mkspell! $SPELLDIR/yi yi" -c q
+
+$SPELLDIR/yi-tr.utf-8.spl : $FILES_TR
+ :sys $VIM -u NONE -e -c "set enc=utf-8"
+ -c "mkspell! $SPELLDIR/yi-tr yi_tr" -c q
+
+$SPELLDIR/yi.latin1.spl : $FILES_TR
+ :sys $VIM -u NONE -e -c "set enc=latin1"
+ -c "mkspell! $SPELLDIR/yi yi_tr" -c q
+
+../README_yi.txt : README.txt
+ :copy $source $target
+
+#
+# Fetch the word list when needed.
+#
+URLDIR = http://www.cs.uky.edu/~raphael/yiddish
+:attr {fetch = $URLDIR/%file%} $WORDFILE $WORDFILE_TR
+
+# We use the word list as a .dic file, so that we can use an affix file to
+# define a few extra things.
+$FILES: {buildcheck=}
+ :assertpkg patch
+ :fetch $WORDFILE
+ :copy $WORDFILE yi.dic
+ :touch {force} yi.aff
+ @if os.path.exists('yi.diff'):
+ :sys patch < yi.diff
+
+$FILES_TR: {buildcheck=}
+ :assertpkg patch
+ :fetch $WORDFILE_TR
+ :copy $WORDFILE_TR yi_tr.dic
+ :touch {force} yi_tr.aff
+ @if os.path.exists('yi_tr.diff'):
+ :sys patch < yi_tr.diff
+
+diff {virtual}:
+ :assertpkg diff
+ # Using a context of two lines to work around a bug in FreeBSD patch.
+ :sys {force} diff -a -C 2 $WORDFILE yi.dic > yi.diff
+ :sys {force} diff -a -N -C 1 /dev/null yi.aff >> yi.diff
+ :sys {force} diff -a -C 2 $WORDFILE_TR yi_tr.dic > yi_tr.diff
+ :sys {force} diff -a -N -C 1 /dev/null yi_tr.aff >> yi_tr.diff
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/yi/yi.diff b/runtime/spell/yi/yi.diff
new file mode 100644
index 0000000..1153b5c
--- /dev/null
+++ b/runtime/spell/yi/yi.diff
@@ -0,0 +1,19 @@
+*** wordlist.utf8.txt Thu Aug 11 19:49:22 2005
+--- yi.dic Thu Aug 11 19:49:23 2005
+***************
+*** 1,2 ****
+--- 1,3 ----
++ 999999
+ גרונטעלעמענט
+ דזשאָבענדיקס
+*** /dev/null Wed Mar 8 22:11:00 2006
+--- yi.aff Mon Aug 15 23:06:00 2005
+***************
+*** 0 ****
+--- 1,6 ----
++ SET UTF-8
++
++ REP 3
++ REP וו װ
++ REP יי ײ
++ REP וי ױ
diff --git a/runtime/spell/yi/yi_tr.diff b/runtime/spell/yi/yi_tr.diff
new file mode 100644
index 0000000..dcc1706
--- /dev/null
+++ b/runtime/spell/yi/yi_tr.diff
@@ -0,0 +1,18 @@
+*** wordlist.txt Tue Aug 16 10:46:26 2005
+--- yi_tr.dic Tue Aug 16 10:46:42 2005
+***************
+*** 1,2 ****
+--- 1,3 ----
++ 84608
+ gruntelement
+ dzhobendiks
+*** /dev/null Wed Mar 8 22:11:00 2006
+--- yi_tr.aff Tue Aug 16 10:48:01 2005
+***************
+*** 0 ****
+--- 1,5 ----
++ SET ISO8859-1
++
++ FOL
++ LOW
++ UPP
diff --git a/runtime/spell/zu/main.aap b/runtime/spell/zu/main.aap
new file mode 100644
index 0000000..7805d76
--- /dev/null
+++ b/runtime/spell/zu/main.aap
@@ -0,0 +1,83 @@
+# Aap recipe for Zulu Vim spell files.
+
+# Use a freshly compiled Vim if it exists.
+@if os.path.exists('../../../src/vim'):
+ VIM = ../../../src/vim
+@else:
+ :progsearch VIM vim
+
+SPELLDIR = ..
+FILES = zu_ZA.aff zu_ZA.dic
+
+# There is no Zulu locale, use the Dutch one instead.
+all: $SPELLDIR/zu.latin1.spl $SPELLDIR/zu.utf-8.spl \
+ $SPELLDIR/zu.ascii.spl ../README_zu.txt
+
+$SPELLDIR/zu.latin1.spl : $FILES
+ :sys env LANG=nl_NL.ISO8859-1
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/zu zu_ZA" -c q
+
+$SPELLDIR/zu.utf-8.spl : $FILES
+ :sys env LANG=nl_NL.UTF-8
+ $VIM -u NONE -e -c "mkspell! $SPELLDIR/zu zu_ZA" -c q
+
+$SPELLDIR/zu.ascii.spl : $FILES
+ :sys $VIM -u NONE -e -c "mkspell! -ascii $SPELLDIR/zu zu_ZA" -c q
+
+../README_zu.txt : README_zu_ZA.txt
+ :copy $source $target
+
+#
+# Fetching the files from OpenOffice.org.
+#
+OODIR = http://ftp.services.openoffice.org/pub/OpenOffice.org/contrib/dictionaries
+:attr {fetch = $OODIR/%file%} zu_ZA.zip
+
+# The files don't depend on the .zip file so that we can delete it.
+# Only download the zip file if the targets don't exist.
+zu_ZA.aff zu_ZA.dic: {buildcheck=}
+ :assertpkg unzip patch
+ :fetch zu_ZA.zip
+ :sys $UNZIP zu_ZA.zip
+ :delete zu_ZA.zip
+ @if not os.path.exists('zu_ZA.orig.aff'):
+ :copy zu_ZA.aff zu_ZA.orig.aff
+ @if not os.path.exists('zu_ZA.orig.dic'):
+ :copy zu_ZA.dic zu_ZA.orig.dic
+ @if os.path.exists('zu_ZA.diff'):
+ :sys patch <zu_ZA.diff
+
+
+# Generate diff files, so that others can get the OpenOffice files and apply
+# the diffs to get the Vim versions.
+
+diff:
+ :assertpkg diff
+ :sys {force} diff -a -C 1 zu_ZA.orig.aff zu_ZA.aff >zu_ZA.diff
+ :sys {force} diff -a -C 1 zu_ZA.orig.dic zu_ZA.dic >>zu_ZA.diff
+
+
+# Check for updated OpenOffice spell files. When there are changes the
+# ".new.aff" and ".new.dic" files are left behind for manual inspection.
+
+check:
+ :assertpkg unzip diff
+ :fetch zu_ZA.zip
+ :mkdir tmp
+ :cd tmp
+ @try:
+ @import stat
+ :sys $UNZIP ../zu_ZA.zip
+ :sys {force} diff ../zu_ZA.orig.aff zu_ZA.aff >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy zu_ZA.aff ../zu_ZA.new.aff
+ :sys {force} diff ../zu_ZA.orig.dic zu_ZA.dic >d
+ @if os.stat('d')[stat.ST_SIZE] > 0:
+ :copy zu_ZA.dic ../zu_ZA.new.dic
+ @finally:
+ :cd ..
+ :delete {r}{f}{q} tmp
+ :delete zu_ZA.zip
+
+
+# vim: set sts=4 sw=4 :
diff --git a/runtime/spell/zu/zu_ZA.diff b/runtime/spell/zu/zu_ZA.diff
new file mode 100644
index 0000000..d44d029
--- /dev/null
+++ b/runtime/spell/zu/zu_ZA.diff
@@ -0,0 +1,8 @@
+*** zu_ZA.orig.aff Wed Aug 31 21:49:18 2005
+--- zu_ZA.aff Wed Aug 31 21:49:52 2005
+***************
+*** 21 ****
+--- 21,23 ----
+ TRY eanuolkihmgwzbtsypdqfcjvxr
++
++ MIDWORD -
diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim
new file mode 100644
index 0000000..9d7da7d
--- /dev/null
+++ b/runtime/synmenu.vim
@@ -0,0 +1,666 @@
+" Vim support file to define the syntax selection menu
+" This file is normally sourced from menu.vim.
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Oct 04
+
+" Define the SetSyn function, used for the Syntax menu entries.
+" Set 'filetype' and also 'syntax' if it is manually selected.
+def SetSyn(name: string)
+ var filetype = name
+ if name == "fvwm1" || name == "fvwm2"
+ g:use_fvwm_1 = name == "fvwm1"
+ g:use_fvwm_2 = name == "fvwm2"
+ filetype = "fvwm"
+ endif
+ if name == "whitespace"
+ # do not replace the filetype but add whitespace on top
+ filetype = &ft .. ".whitespace"
+ endif
+ if !exists("s:syntax_menu_synonly")
+ exe "set ft=" .. filetype
+ if exists("g:syntax_manual")
+ exe "set syn=" .. filetype
+ endif
+ else
+ exe "set syn=" .. filetype
+ endif
+enddef
+
+" <> notation is used here, remove '<' from 'cpoptions'
+let s:cpo_save = &cpo
+set cpo&vim
+
+" The following menu items are generated by makemenu.vim.
+" The Start Of The Syntax Menu
+
+an 50.10.100 &Syntax.AB.A2ps\ config :cal SetSyn("a2ps")<CR>
+an 50.10.110 &Syntax.AB.Aap :cal SetSyn("aap")<CR>
+an 50.10.120 &Syntax.AB.ABAP/4 :cal SetSyn("abap")<CR>
+an 50.10.130 &Syntax.AB.Abaqus :cal SetSyn("abaqus")<CR>
+an 50.10.140 &Syntax.AB.ABC\ music\ notation :cal SetSyn("abc")<CR>
+an 50.10.150 &Syntax.AB.ABEL :cal SetSyn("abel")<CR>
+an 50.10.160 &Syntax.AB.AceDB\ model :cal SetSyn("acedb")<CR>
+an 50.10.170 &Syntax.AB.Ada :cal SetSyn("ada")<CR>
+an 50.10.180 &Syntax.AB.AfLex :cal SetSyn("aflex")<CR>
+an 50.10.190 &Syntax.AB.ALSA\ config :cal SetSyn("alsaconf")<CR>
+an 50.10.200 &Syntax.AB.Altera\ AHDL :cal SetSyn("ahdl")<CR>
+an 50.10.210 &Syntax.AB.Amiga\ DOS :cal SetSyn("amiga")<CR>
+an 50.10.220 &Syntax.AB.AMPL :cal SetSyn("ampl")<CR>
+an 50.10.230 &Syntax.AB.Ant\ build\ file :cal SetSyn("ant")<CR>
+an 50.10.240 &Syntax.AB.ANTLR :cal SetSyn("antlr")<CR>
+an 50.10.250 &Syntax.AB.Apache\ config :cal SetSyn("apache")<CR>
+an 50.10.260 &Syntax.AB.Apache-style\ config :cal SetSyn("apachestyle")<CR>
+an 50.10.270 &Syntax.AB.Applix\ ELF :cal SetSyn("elf")<CR>
+an 50.10.280 &Syntax.AB.APT\ config :cal SetSyn("aptconf")<CR>
+an 50.10.290 &Syntax.AB.Arc\ Macro\ Language :cal SetSyn("aml")<CR>
+an 50.10.300 &Syntax.AB.Arch\ inventory :cal SetSyn("arch")<CR>
+an 50.10.310 &Syntax.AB.Arduino :cal SetSyn("arduino")<CR>
+an 50.10.320 &Syntax.AB.ART :cal SetSyn("art")<CR>
+an 50.10.330 &Syntax.AB.Ascii\ Doc :cal SetSyn("asciidoc")<CR>
+an 50.10.340 &Syntax.AB.ASP\ with\ VBScript :cal SetSyn("aspvbs")<CR>
+an 50.10.350 &Syntax.AB.ASP\ with\ Perl :cal SetSyn("aspperl")<CR>
+an 50.10.360 &Syntax.AB.Assembly.680x0 :cal SetSyn("asm68k")<CR>
+an 50.10.370 &Syntax.AB.Assembly.AVR :cal SetSyn("avra")<CR>
+an 50.10.380 &Syntax.AB.Assembly.Flat :cal SetSyn("fasm")<CR>
+an 50.10.390 &Syntax.AB.Assembly.GNU :cal SetSyn("asm")<CR>
+an 50.10.400 &Syntax.AB.Assembly.GNU\ H-8300 :cal SetSyn("asmh8300")<CR>
+an 50.10.410 &Syntax.AB.Assembly.Intel\ IA-64 :cal SetSyn("ia64")<CR>
+an 50.10.420 &Syntax.AB.Assembly.Microsoft :cal SetSyn("masm")<CR>
+an 50.10.430 &Syntax.AB.Assembly.Netwide :cal SetSyn("nasm")<CR>
+an 50.10.440 &Syntax.AB.Assembly.PIC :cal SetSyn("pic")<CR>
+an 50.10.450 &Syntax.AB.Assembly.Turbo :cal SetSyn("tasm")<CR>
+an 50.10.460 &Syntax.AB.Assembly.VAX\ Macro\ Assembly :cal SetSyn("vmasm")<CR>
+an 50.10.470 &Syntax.AB.Assembly.Z-80 :cal SetSyn("z8a")<CR>
+an 50.10.480 &Syntax.AB.Assembly.xa\ 6502\ cross\ assember :cal SetSyn("a65")<CR>
+an 50.10.490 &Syntax.AB.ASN\.1 :cal SetSyn("asn")<CR>
+an 50.10.500 &Syntax.AB.Asterisk\ config :cal SetSyn("asterisk")<CR>
+an 50.10.510 &Syntax.AB.Asterisk\ voicemail\ config :cal SetSyn("asteriskvm")<CR>
+an 50.10.520 &Syntax.AB.Atlas :cal SetSyn("atlas")<CR>
+an 50.10.530 &Syntax.AB.Autodoc :cal SetSyn("autodoc")<CR>
+an 50.10.540 &Syntax.AB.AutoHotKey :cal SetSyn("autohotkey")<CR>
+an 50.10.550 &Syntax.AB.AutoIt :cal SetSyn("autoit")<CR>
+an 50.10.560 &Syntax.AB.Automake :cal SetSyn("automake")<CR>
+an 50.10.570 &Syntax.AB.Avenue :cal SetSyn("ave")<CR>
+an 50.10.580 &Syntax.AB.Awk :cal SetSyn("awk")<CR>
+an 50.10.590 &Syntax.AB.AYacc :cal SetSyn("ayacc")<CR>
+an 50.10.610 &Syntax.AB.B :cal SetSyn("b")<CR>
+an 50.10.620 &Syntax.AB.Baan :cal SetSyn("baan")<CR>
+an 50.10.630 &Syntax.AB.Bash :cal SetSyn("bash")<CR>
+an 50.10.640 &Syntax.AB.Basic.FreeBasic :cal SetSyn("freebasic")<CR>
+an 50.10.650 &Syntax.AB.Basic.IBasic :cal SetSyn("ibasic")<CR>
+an 50.10.660 &Syntax.AB.Basic.QBasic :cal SetSyn("basic")<CR>
+an 50.10.670 &Syntax.AB.Basic.Visual\ Basic :cal SetSyn("vb")<CR>
+an 50.10.680 &Syntax.AB.Bazaar\ commit\ file :cal SetSyn("bzr")<CR>
+an 50.10.690 &Syntax.AB.Bazel :cal SetSyn("bzl")<CR>
+an 50.10.700 &Syntax.AB.BC\ calculator :cal SetSyn("bc")<CR>
+an 50.10.710 &Syntax.AB.BDF\ font :cal SetSyn("bdf")<CR>
+an 50.10.720 &Syntax.AB.BibTeX.Bibliography\ database :cal SetSyn("bib")<CR>
+an 50.10.730 &Syntax.AB.BibTeX.Bibliography\ Style :cal SetSyn("bst")<CR>
+an 50.10.740 &Syntax.AB.BIND.BIND\ config :cal SetSyn("named")<CR>
+an 50.10.750 &Syntax.AB.BIND.BIND\ zone :cal SetSyn("bindzone")<CR>
+an 50.10.760 &Syntax.AB.Blank :cal SetSyn("blank")<CR>
+an 50.20.100 &Syntax.C.C :cal SetSyn("c")<CR>
+an 50.20.110 &Syntax.C.C++ :cal SetSyn("cpp")<CR>
+an 50.20.120 &Syntax.C.C# :cal SetSyn("cs")<CR>
+an 50.20.130 &Syntax.C.Cabal\ Haskell\ build\ file :cal SetSyn("cabal")<CR>
+an 50.20.140 &Syntax.C.Calendar :cal SetSyn("calendar")<CR>
+an 50.20.150 &Syntax.C.Cascading\ Style\ Sheets :cal SetSyn("css")<CR>
+an 50.20.160 &Syntax.C.CDL :cal SetSyn("cdl")<CR>
+an 50.20.170 &Syntax.C.Cdrdao\ TOC :cal SetSyn("cdrtoc")<CR>
+an 50.20.180 &Syntax.C.Cdrdao\ config :cal SetSyn("cdrdaoconf")<CR>
+an 50.20.190 &Syntax.C.Century\ Term :cal SetSyn("cterm")<CR>
+an 50.20.200 &Syntax.C.CH\ script :cal SetSyn("ch")<CR>
+an 50.20.210 &Syntax.C.ChaiScript :cal SetSyn("chaiscript")<CR>
+an 50.20.220 &Syntax.C.ChangeLog :cal SetSyn("changelog")<CR>
+an 50.20.230 &Syntax.C.CHILL :cal SetSyn("chill")<CR>
+an 50.20.240 &Syntax.C.Cheetah\ template :cal SetSyn("cheetah")<CR>
+an 50.20.250 &Syntax.C.Chicken :cal SetSyn("chicken")<CR>
+an 50.20.260 &Syntax.C.ChordPro :cal SetSyn("chordpro")<CR>
+an 50.20.270 &Syntax.C.Clean :cal SetSyn("clean")<CR>
+an 50.20.280 &Syntax.C.Clever :cal SetSyn("cl")<CR>
+an 50.20.290 &Syntax.C.Clipper :cal SetSyn("clipper")<CR>
+an 50.20.300 &Syntax.C.Clojure :cal SetSyn("clojure")<CR>
+an 50.20.310 &Syntax.C.Cmake :cal SetSyn("cmake")<CR>
+an 50.20.320 &Syntax.C.Cmod :cal SetSyn("cmod")<CR>
+an 50.20.330 &Syntax.C.Cmusrc :cal SetSyn("cmusrc")<CR>
+an 50.20.340 &Syntax.C.Cobol :cal SetSyn("cobol")<CR>
+an 50.20.350 &Syntax.C.Coco/R :cal SetSyn("coco")<CR>
+an 50.20.360 &Syntax.C.Cold\ Fusion :cal SetSyn("cf")<CR>
+an 50.20.370 &Syntax.C.Conary\ Recipe :cal SetSyn("conaryrecipe")<CR>
+an 50.20.380 &Syntax.C.Config.Cfg\ Config\ file :cal SetSyn("cfg")<CR>
+an 50.20.390 &Syntax.C.Config.Configure\.in :cal SetSyn("config")<CR>
+an 50.20.400 &Syntax.C.Config.Generic\ Config\ file :cal SetSyn("conf")<CR>
+an 50.20.410 &Syntax.C.CRM114 :cal SetSyn("crm")<CR>
+an 50.20.420 &Syntax.C.Crontab :cal SetSyn("crontab")<CR>
+an 50.20.430 &Syntax.C.CSDL :cal SetSyn("csdl")<CR>
+an 50.20.440 &Syntax.C.CSP :cal SetSyn("csp")<CR>
+an 50.20.450 &Syntax.C.Ctrl-H :cal SetSyn("ctrlh")<CR>
+an 50.20.460 &Syntax.C.Cucumber :cal SetSyn("cucumber")<CR>
+an 50.20.470 &Syntax.C.CUDA :cal SetSyn("cuda")<CR>
+an 50.20.480 &Syntax.C.CUPL.CUPL :cal SetSyn("cupl")<CR>
+an 50.20.490 &Syntax.C.CUPL.Simulation :cal SetSyn("cuplsim")<CR>
+an 50.20.500 &Syntax.C.CVS.commit\ file :cal SetSyn("cvs")<CR>
+an 50.20.510 &Syntax.C.CVS.cvsrc :cal SetSyn("cvsrc")<CR>
+an 50.20.520 &Syntax.C.Cyn++ :cal SetSyn("cynpp")<CR>
+an 50.20.530 &Syntax.C.Cynlib :cal SetSyn("cynlib")<CR>
+an 50.30.100 &Syntax.DE.D :cal SetSyn("d")<CR>
+an 50.30.110 &Syntax.DE.Dart :cal SetSyn("dart")<CR>
+an 50.30.120 &Syntax.DE.Datascript :cal SetSyn("datascript")<CR>
+an 50.30.130 &Syntax.DE.Debian.Debian\ ChangeLog :cal SetSyn("debchangelog")<CR>
+an 50.30.140 &Syntax.DE.Debian.Debian\ Control :cal SetSyn("debcontrol")<CR>
+an 50.30.150 &Syntax.DE.Debian.Debian\ Copyright :cal SetSyn("debcopyright")<CR>
+an 50.30.160 &Syntax.DE.Debian.Debian\ Sources\.list :cal SetSyn("debsources")<CR>
+an 50.30.170 &Syntax.DE.Denyhosts :cal SetSyn("denyhosts")<CR>
+an 50.30.180 &Syntax.DE.Desktop :cal SetSyn("desktop")<CR>
+an 50.30.190 &Syntax.DE.Dict\ config :cal SetSyn("dictconf")<CR>
+an 50.30.200 &Syntax.DE.Dictd\ config :cal SetSyn("dictdconf")<CR>
+an 50.30.210 &Syntax.DE.Diff :cal SetSyn("diff")<CR>
+an 50.30.220 &Syntax.DE.Digital\ Command\ Lang :cal SetSyn("dcl")<CR>
+an 50.30.230 &Syntax.DE.Dircolors :cal SetSyn("dircolors")<CR>
+an 50.30.240 &Syntax.DE.Dirpager :cal SetSyn("dirpager")<CR>
+an 50.30.250 &Syntax.DE.Django\ template :cal SetSyn("django")<CR>
+an 50.30.260 &Syntax.DE.DNS/BIND\ zone :cal SetSyn("bindzone")<CR>
+an 50.30.270 &Syntax.DE.Dnsmasq\ config :cal SetSyn("dnsmasq")<CR>
+an 50.30.280 &Syntax.DE.DocBook.auto-detect :cal SetSyn("docbk")<CR>
+an 50.30.290 &Syntax.DE.DocBook.SGML :cal SetSyn("docbksgml")<CR>
+an 50.30.300 &Syntax.DE.DocBook.XML :cal SetSyn("docbkxml")<CR>
+an 50.30.310 &Syntax.DE.Dockerfile :cal SetSyn("dockerfile")<CR>
+an 50.30.320 &Syntax.DE.Dot :cal SetSyn("dot")<CR>
+an 50.30.330 &Syntax.DE.Doxygen.C\ with\ doxygen :cal SetSyn("c.doxygen")<CR>
+an 50.30.340 &Syntax.DE.Doxygen.C++\ with\ doxygen :cal SetSyn("cpp.doxygen")<CR>
+an 50.30.350 &Syntax.DE.Doxygen.IDL\ with\ doxygen :cal SetSyn("idl.doxygen")<CR>
+an 50.30.360 &Syntax.DE.Doxygen.Java\ with\ doxygen :cal SetSyn("java.doxygen")<CR>
+an 50.30.370 &Syntax.DE.Doxygen.DataScript\ with\ doxygen :cal SetSyn("datascript.doxygen")<CR>
+an 50.30.380 &Syntax.DE.Dracula :cal SetSyn("dracula")<CR>
+an 50.30.390 &Syntax.DE.DSSSL :cal SetSyn("dsl")<CR>
+an 50.30.400 &Syntax.DE.DTD :cal SetSyn("dtd")<CR>
+an 50.30.410 &Syntax.DE.DTML\ (Zope) :cal SetSyn("dtml")<CR>
+an 50.30.420 &Syntax.DE.DTrace :cal SetSyn("dtrace")<CR>
+an 50.30.430 &Syntax.DE.Dts/dtsi :cal SetSyn("dts")<CR>
+an 50.30.440 &Syntax.DE.Dune :cal SetSyn("dune")<CR>
+an 50.30.450 &Syntax.DE.Dylan.Dylan :cal SetSyn("dylan")<CR>
+an 50.30.460 &Syntax.DE.Dylan.Dylan\ interface :cal SetSyn("dylanintr")<CR>
+an 50.30.470 &Syntax.DE.Dylan.Dylan\ lid :cal SetSyn("dylanlid")<CR>
+an 50.30.490 &Syntax.DE.EDIF :cal SetSyn("edif")<CR>
+an 50.30.500 &Syntax.DE.Eiffel :cal SetSyn("eiffel")<CR>
+an 50.30.510 &Syntax.DE.Eight :cal SetSyn("8th")<CR>
+an 50.30.520 &Syntax.DE.Elinks\ config :cal SetSyn("elinks")<CR>
+an 50.30.530 &Syntax.DE.Elm\ filter\ rules :cal SetSyn("elmfilt")<CR>
+an 50.30.540 &Syntax.DE.Embedix\ Component\ Description :cal SetSyn("ecd")<CR>
+an 50.30.550 &Syntax.DE.ERicsson\ LANGuage :cal SetSyn("erlang")<CR>
+an 50.30.560 &Syntax.DE.ESMTP\ rc :cal SetSyn("esmtprc")<CR>
+an 50.30.570 &Syntax.DE.ESQL-C :cal SetSyn("esqlc")<CR>
+an 50.30.580 &Syntax.DE.Essbase\ script :cal SetSyn("csc")<CR>
+an 50.30.590 &Syntax.DE.Esterel :cal SetSyn("esterel")<CR>
+an 50.30.600 &Syntax.DE.Eterm\ config :cal SetSyn("eterm")<CR>
+an 50.30.610 &Syntax.DE.Euphoria\ 3 :cal SetSyn("euphoria3")<CR>
+an 50.30.620 &Syntax.DE.Euphoria\ 4 :cal SetSyn("euphoria4")<CR>
+an 50.30.630 &Syntax.DE.Eviews :cal SetSyn("eviews")<CR>
+an 50.30.640 &Syntax.DE.Exim\ conf :cal SetSyn("exim")<CR>
+an 50.30.650 &Syntax.DE.Expect :cal SetSyn("expect")<CR>
+an 50.30.660 &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>
+an 50.40.130 &Syntax.FG.FlexWiki :cal SetSyn("flexwiki")<CR>
+an 50.40.140 &Syntax.FG.Focus\ Executable :cal SetSyn("focexec")<CR>
+an 50.40.150 &Syntax.FG.Focus\ Master :cal SetSyn("master")<CR>
+an 50.40.160 &Syntax.FG.FORM :cal SetSyn("form")<CR>
+an 50.40.170 &Syntax.FG.Forth :cal SetSyn("forth")<CR>
+an 50.40.180 &Syntax.FG.Fortran :cal SetSyn("fortran")<CR>
+an 50.40.190 &Syntax.FG.FoxPro :cal SetSyn("foxpro")<CR>
+an 50.40.200 &Syntax.FG.FrameScript :cal SetSyn("framescript")<CR>
+an 50.40.210 &Syntax.FG.Fstab :cal SetSyn("fstab")<CR>
+an 50.40.220 &Syntax.FG.Fvwm.Fvwm\ configuration :cal SetSyn("fvwm1")<CR>
+an 50.40.230 &Syntax.FG.Fvwm.Fvwm2\ configuration :cal SetSyn("fvwm2")<CR>
+an 50.40.240 &Syntax.FG.Fvwm.Fvwm2\ configuration\ with\ M4 :cal SetSyn("fvwm2m4")<CR>
+an 50.40.260 &Syntax.FG.GDB\ command\ file :cal SetSyn("gdb")<CR>
+an 50.40.270 &Syntax.FG.GDMO :cal SetSyn("gdmo")<CR>
+an 50.40.280 &Syntax.FG.Gedcom :cal SetSyn("gedcom")<CR>
+an 50.40.290 &Syntax.FG.Git.Output :cal SetSyn("git")<CR>
+an 50.40.300 &Syntax.FG.Git.Commit :cal SetSyn("gitcommit")<CR>
+an 50.40.310 &Syntax.FG.Git.Config :cal SetSyn("gitconfig")<CR>
+an 50.40.320 &Syntax.FG.Git.Rebase :cal SetSyn("gitrebase")<CR>
+an 50.40.330 &Syntax.FG.Git.Send\ Email :cal SetSyn("gitsendemail")<CR>
+an 50.40.340 &Syntax.FG.Gitolite :cal SetSyn("gitolite")<CR>
+an 50.40.350 &Syntax.FG.Gkrellmrc :cal SetSyn("gkrellmrc")<CR>
+an 50.40.360 &Syntax.FG.Gnash :cal SetSyn("gnash")<CR>
+an 50.40.370 &Syntax.FG.Go :cal SetSyn("go")<CR>
+an 50.40.380 &Syntax.FG.Godoc :cal SetSyn("godoc")<CR>
+an 50.40.390 &Syntax.FG.GP :cal SetSyn("gp")<CR>
+an 50.40.400 &Syntax.FG.GPG :cal SetSyn("gpg")<CR>
+an 50.40.410 &Syntax.FG.Grof :cal SetSyn("gprof")<CR>
+an 50.40.420 &Syntax.FG.Group\ file :cal SetSyn("group")<CR>
+an 50.40.430 &Syntax.FG.Grub :cal SetSyn("grub")<CR>
+an 50.40.440 &Syntax.FG.GNU\ Server\ Pages :cal SetSyn("gsp")<CR>
+an 50.40.450 &Syntax.FG.GNUplot :cal SetSyn("gnuplot")<CR>
+an 50.40.460 &Syntax.FG.GrADS\ scripts :cal SetSyn("grads")<CR>
+an 50.40.470 &Syntax.FG.Gretl :cal SetSyn("gretl")<CR>
+an 50.40.480 &Syntax.FG.Groff :cal SetSyn("groff")<CR>
+an 50.40.490 &Syntax.FG.Groovy :cal SetSyn("groovy")<CR>
+an 50.40.500 &Syntax.FG.GTKrc :cal SetSyn("gtkrc")<CR>
+an 50.50.100 &Syntax.HIJK.Haml :cal SetSyn("haml")<CR>
+an 50.50.110 &Syntax.HIJK.Hamster :cal SetSyn("hamster")<CR>
+an 50.50.120 &Syntax.HIJK.Haskell.Haskell :cal SetSyn("haskell")<CR>
+an 50.50.130 &Syntax.HIJK.Haskell.Haskell-c2hs :cal SetSyn("chaskell")<CR>
+an 50.50.140 &Syntax.HIJK.Haskell.Haskell-literate :cal SetSyn("lhaskell")<CR>
+an 50.50.150 &Syntax.HIJK.HASTE :cal SetSyn("haste")<CR>
+an 50.50.160 &Syntax.HIJK.HASTE\ preproc :cal SetSyn("hastepreproc")<CR>
+an 50.50.170 &Syntax.HIJK.Hercules :cal SetSyn("hercules")<CR>
+an 50.50.180 &Syntax.HIJK.Hex\ dump.XXD :cal SetSyn("xxd")<CR>
+an 50.50.190 &Syntax.HIJK.Hex\ dump.Intel\ MCS51 :cal SetSyn("hex")<CR>
+an 50.50.200 &Syntax.HIJK.Hg\ commit :cal SetSyn("hgcommit")<CR>
+an 50.50.210 &Syntax.HIJK.Hollywood :cal SetSyn("hollywood")<CR>
+an 50.50.220 &Syntax.HIJK.HTML.HTML :cal SetSyn("html")<CR>
+an 50.50.230 &Syntax.HIJK.HTML.HTML\ with\ M4 :cal SetSyn("htmlm4")<CR>
+an 50.50.240 &Syntax.HIJK.HTML.HTML\ with\ Ruby\ (eRuby) :cal SetSyn("eruby")<CR>
+an 50.50.250 &Syntax.HIJK.HTML.Cheetah\ HTML\ template :cal SetSyn("htmlcheetah")<CR>
+an 50.50.260 &Syntax.HIJK.HTML.Django\ HTML\ template :cal SetSyn("htmldjango")<CR>
+an 50.50.270 &Syntax.HIJK.HTML.Vue.js\ HTML\ template :cal SetSyn("vuejs")<CR>
+an 50.50.280 &Syntax.HIJK.HTML.HTML/OS :cal SetSyn("htmlos")<CR>
+an 50.50.290 &Syntax.HIJK.HTML.XHTML :cal SetSyn("xhtml")<CR>
+an 50.50.300 &Syntax.HIJK.Host\.conf :cal SetSyn("hostconf")<CR>
+an 50.50.310 &Syntax.HIJK.Hosts\ access :cal SetSyn("hostsaccess")<CR>
+an 50.50.320 &Syntax.HIJK.Hyper\ Builder :cal SetSyn("hb")<CR>
+an 50.50.340 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu")<CR>
+an 50.50.350 &Syntax.HIJK.Icon :cal SetSyn("icon")<CR>
+an 50.50.360 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl")<CR>
+an 50.50.370 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl")<CR>
+an 50.50.380 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent")<CR>
+an 50.50.390 &Syntax.HIJK.Inform :cal SetSyn("inform")<CR>
+an 50.50.400 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl")<CR>
+an 50.50.410 &Syntax.HIJK.Initng :cal SetSyn("initng")<CR>
+an 50.50.420 &Syntax.HIJK.Inittab :cal SetSyn("inittab")<CR>
+an 50.50.430 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss")<CR>
+an 50.50.440 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat")<CR>
+an 50.50.450 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog")<CR>
+an 50.50.460 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt")<CR>
+an 50.50.470 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog")<CR>
+an 50.50.480 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog")<CR>
+an 50.50.490 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog")<CR>
+an 50.50.500 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd")<CR>
+an 50.50.510 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang")<CR>
+an 50.50.520 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter")<CR>
+an 50.50.540 &Syntax.HIJK.J :cal SetSyn("j")<CR>
+an 50.50.550 &Syntax.HIJK.JAL :cal SetSyn("jal")<CR>
+an 50.50.560 &Syntax.HIJK.JAM :cal SetSyn("jam")<CR>
+an 50.50.570 &Syntax.HIJK.Jargon :cal SetSyn("jargon")<CR>
+an 50.50.580 &Syntax.HIJK.Java.Java :cal SetSyn("java")<CR>
+an 50.50.590 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc")<CR>
+an 50.50.600 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp")<CR>
+an 50.50.610 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties")<CR>
+an 50.50.620 &Syntax.HIJK.JavaScript :cal SetSyn("javascript")<CR>
+an 50.50.630 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact")<CR>
+an 50.50.640 &Syntax.HIJK.Jess :cal SetSyn("jess")<CR>
+an 50.50.650 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph")<CR>
+an 50.50.660 &Syntax.HIJK.Jovial :cal SetSyn("jovial")<CR>
+an 50.50.670 &Syntax.HIJK.JSON :cal SetSyn("json")<CR>
+an 50.50.690 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig")<CR>
+an 50.50.700 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript")<CR>
+an 50.50.710 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt")<CR>
+an 50.50.720 &Syntax.HIJK.Kivy :cal SetSyn("kivy")<CR>
+an 50.50.730 &Syntax.HIJK.KixTart :cal SetSyn("kix")<CR>
+an 50.60.100 &Syntax.L.Lace :cal SetSyn("lace")<CR>
+an 50.60.110 &Syntax.L.LamdaProlog :cal SetSyn("lprolog")<CR>
+an 50.60.120 &Syntax.L.Latte :cal SetSyn("latte")<CR>
+an 50.60.130 &Syntax.L.Ld\ script :cal SetSyn("ld")<CR>
+an 50.60.140 &Syntax.L.LDAP.LDIF :cal SetSyn("ldif")<CR>
+an 50.60.150 &Syntax.L.LDAP.Configuration :cal SetSyn("ldapconf")<CR>
+an 50.60.160 &Syntax.L.Less :cal SetSyn("less")<CR>
+an 50.60.170 &Syntax.L.Lex :cal SetSyn("lex")<CR>
+an 50.60.180 &Syntax.L.LFTP\ config :cal SetSyn("lftp")<CR>
+an 50.60.190 &Syntax.L.Libao :cal SetSyn("libao")<CR>
+an 50.60.200 &Syntax.L.LifeLines\ script :cal SetSyn("lifelines")<CR>
+an 50.60.210 &Syntax.L.Lilo :cal SetSyn("lilo")<CR>
+an 50.60.220 &Syntax.L.Limits\ config :cal SetSyn("limits")<CR>
+an 50.60.230 &Syntax.L.Linden\ scripting :cal SetSyn("lsl")<CR>
+an 50.60.240 &Syntax.L.Liquid :cal SetSyn("liquid")<CR>
+an 50.60.250 &Syntax.L.Lisp :cal SetSyn("lisp")<CR>
+an 50.60.260 &Syntax.L.Lite :cal SetSyn("lite")<CR>
+an 50.60.270 &Syntax.L.LiteStep\ RC :cal SetSyn("litestep")<CR>
+an 50.60.280 &Syntax.L.Locale\ Input :cal SetSyn("fdcc")<CR>
+an 50.60.290 &Syntax.L.Login\.access :cal SetSyn("loginaccess")<CR>
+an 50.60.300 &Syntax.L.Login\.defs :cal SetSyn("logindefs")<CR>
+an 50.60.310 &Syntax.L.Logtalk :cal SetSyn("logtalk")<CR>
+an 50.60.320 &Syntax.L.LOTOS :cal SetSyn("lotos")<CR>
+an 50.60.330 &Syntax.L.LotusScript :cal SetSyn("lscript")<CR>
+an 50.60.340 &Syntax.L.Lout :cal SetSyn("lout")<CR>
+an 50.60.350 &Syntax.L.LPC :cal SetSyn("lpc")<CR>
+an 50.60.360 &Syntax.L.Lua :cal SetSyn("lua")<CR>
+an 50.60.370 &Syntax.L.Lynx\ Style :cal SetSyn("lss")<CR>
+an 50.60.380 &Syntax.L.Lynx\ config :cal SetSyn("lynx")<CR>
+an 50.70.100 &Syntax.M.M4 :cal SetSyn("m4")<CR>
+an 50.70.110 &Syntax.M.MaGic\ Point :cal SetSyn("mgp")<CR>
+an 50.70.120 &Syntax.M.Mail :cal SetSyn("mail")<CR>
+an 50.70.130 &Syntax.M.Mail\ aliases :cal SetSyn("mailaliases")<CR>
+an 50.70.140 &Syntax.M.Mailcap :cal SetSyn("mailcap")<CR>
+an 50.70.150 &Syntax.M.Mallard :cal SetSyn("mallard")<CR>
+an 50.70.160 &Syntax.M.Makefile :cal SetSyn("make")<CR>
+an 50.70.170 &Syntax.M.MakeIndex :cal SetSyn("ist")<CR>
+an 50.70.180 &Syntax.M.Man\ page :cal SetSyn("man")<CR>
+an 50.70.190 &Syntax.M.Man\.conf :cal SetSyn("manconf")<CR>
+an 50.70.200 &Syntax.M.Maple\ V :cal SetSyn("maple")<CR>
+an 50.70.210 &Syntax.M.Markdown :cal SetSyn("markdown")<CR>
+an 50.70.220 &Syntax.M.Markdown\ with\ R\ statements :cal SetSyn("rmd")<CR>
+an 50.70.230 &Syntax.M.Mason :cal SetSyn("mason")<CR>
+an 50.70.240 &Syntax.M.Mathematica :cal SetSyn("mma")<CR>
+an 50.70.250 &Syntax.M.Matlab :cal SetSyn("matlab")<CR>
+an 50.70.260 &Syntax.M.Maxima :cal SetSyn("maxima")<CR>
+an 50.70.270 &Syntax.M.MEL\ (for\ Maya) :cal SetSyn("mel")<CR>
+an 50.70.280 &Syntax.M.Meson :cal SetSyn("meson")<CR>
+an 50.70.290 &Syntax.M.Messages\ (/var/log) :cal SetSyn("messages")<CR>
+an 50.70.300 &Syntax.M.Metafont :cal SetSyn("mf")<CR>
+an 50.70.310 &Syntax.M.MetaPost :cal SetSyn("mp")<CR>
+an 50.70.320 &Syntax.M.MGL :cal SetSyn("mgl")<CR>
+an 50.70.330 &Syntax.M.MIX :cal SetSyn("mix")<CR>
+an 50.70.340 &Syntax.M.MMIX :cal SetSyn("mmix")<CR>
+an 50.70.350 &Syntax.M.Modconf :cal SetSyn("modconf")<CR>
+an 50.70.360 &Syntax.M.Model :cal SetSyn("model")<CR>
+an 50.70.370 &Syntax.M.Modsim\ III :cal SetSyn("modsim3")<CR>
+an 50.70.380 &Syntax.M.Modula\ 2 :cal SetSyn("modula2")<CR>
+an 50.70.390 &Syntax.M.Modula\ 3 :cal SetSyn("modula3")<CR>
+an 50.70.400 &Syntax.M.Monk :cal SetSyn("monk")<CR>
+an 50.70.410 &Syntax.M.Motorola\ S-Record :cal SetSyn("srec")<CR>
+an 50.70.420 &Syntax.M.Mplayer\ config :cal SetSyn("mplayerconf")<CR>
+an 50.70.430 &Syntax.M.MOO :cal SetSyn("moo")<CR>
+an 50.70.440 &Syntax.M.Mrxvtrc :cal SetSyn("mrxvtrc")<CR>
+an 50.70.450 &Syntax.M.MS-DOS/Windows.4DOS\ \.bat\ file :cal SetSyn("btm")<CR>
+an 50.70.460 &Syntax.M.MS-DOS/Windows.\.bat\/\.cmd\ file :cal SetSyn("dosbatch")<CR>
+an 50.70.470 &Syntax.M.MS-DOS/Windows.\.ini\ file :cal SetSyn("dosini")<CR>
+an 50.70.480 &Syntax.M.MS-DOS/Windows.Message\ text :cal SetSyn("msmessages")<CR>
+an 50.70.490 &Syntax.M.MS-DOS/Windows.Module\ Definition :cal SetSyn("def")<CR>
+an 50.70.500 &Syntax.M.MS-DOS/Windows.Registry :cal SetSyn("registry")<CR>
+an 50.70.510 &Syntax.M.MS-DOS/Windows.Resource\ file :cal SetSyn("rc")<CR>
+an 50.70.520 &Syntax.M.Msql :cal SetSyn("msql")<CR>
+an 50.70.530 &Syntax.M.MuPAD :cal SetSyn("mupad")<CR>
+an 50.70.540 &Syntax.M.Murphi :cal SetSyn("murphi")<CR>
+an 50.70.550 &Syntax.M.MUSHcode :cal SetSyn("mush")<CR>
+an 50.70.560 &Syntax.M.Muttrc :cal SetSyn("muttrc")<CR>
+an 50.80.100 &Syntax.NO.N1QL :cal SetSyn("n1ql")<CR>
+an 50.80.110 &Syntax.NO.Nanorc :cal SetSyn("nanorc")<CR>
+an 50.80.120 &Syntax.NO.Nastran\ input/DMAP :cal SetSyn("nastran")<CR>
+an 50.80.130 &Syntax.NO.Natural :cal SetSyn("natural")<CR>
+an 50.80.140 &Syntax.NO.NeoMutt\ setup\ files :cal SetSyn("neomuttrc")<CR>
+an 50.80.150 &Syntax.NO.Netrc :cal SetSyn("netrc")<CR>
+an 50.80.160 &Syntax.NO.Ninja :cal SetSyn("ninja")<CR>
+an 50.80.170 &Syntax.NO.Novell\ NCF\ batch :cal SetSyn("ncf")<CR>
+an 50.80.180 &Syntax.NO.Not\ Quite\ C\ (LEGO) :cal SetSyn("nqc")<CR>
+an 50.80.190 &Syntax.NO.Nroff :cal SetSyn("nroff")<CR>
+an 50.80.200 &Syntax.NO.NSIS\ script :cal SetSyn("nsis")<CR>
+an 50.80.220 &Syntax.NO.Obj\ 3D\ wavefront :cal SetSyn("obj")<CR>
+an 50.80.230 &Syntax.NO.Objective\ C :cal SetSyn("objc")<CR>
+an 50.80.240 &Syntax.NO.Objective\ C++ :cal SetSyn("objcpp")<CR>
+an 50.80.250 &Syntax.NO.OCAML :cal SetSyn("ocaml")<CR>
+an 50.80.260 &Syntax.NO.Occam :cal SetSyn("occam")<CR>
+an 50.80.270 &Syntax.NO.Omnimark :cal SetSyn("omnimark")<CR>
+an 50.80.280 &Syntax.NO.OpenROAD :cal SetSyn("openroad")<CR>
+an 50.80.290 &Syntax.NO.Open\ Psion\ Lang :cal SetSyn("opl")<CR>
+an 50.80.300 &Syntax.NO.Oracle\ config :cal SetSyn("ora")<CR>
+an 50.90.100 &Syntax.PQ.Packet\ filter\ conf :cal SetSyn("pf")<CR>
+an 50.90.110 &Syntax.PQ.Palm\ resource\ compiler :cal SetSyn("pilrc")<CR>
+an 50.90.120 &Syntax.PQ.Pam\ config :cal SetSyn("pamconf")<CR>
+an 50.90.130 &Syntax.PQ.PApp :cal SetSyn("papp")<CR>
+an 50.90.140 &Syntax.PQ.Pascal :cal SetSyn("pascal")<CR>
+an 50.90.150 &Syntax.PQ.Password\ file :cal SetSyn("passwd")<CR>
+an 50.90.160 &Syntax.PQ.PCCTS :cal SetSyn("pccts")<CR>
+an 50.90.170 &Syntax.PQ.PDF :cal SetSyn("pdf")<CR>
+an 50.90.180 &Syntax.PQ.Perl.Perl :cal SetSyn("perl")<CR>
+an 50.90.190 &Syntax.PQ.Perl.Perl\ 6 :cal SetSyn("perl6")<CR>
+an 50.90.200 &Syntax.PQ.Perl.Perl\ POD :cal SetSyn("pod")<CR>
+an 50.90.210 &Syntax.PQ.Perl.Perl\ XS :cal SetSyn("xs")<CR>
+an 50.90.220 &Syntax.PQ.Perl.Template\ toolkit :cal SetSyn("tt2")<CR>
+an 50.90.230 &Syntax.PQ.Perl.Template\ toolkit\ Html :cal SetSyn("tt2html")<CR>
+an 50.90.240 &Syntax.PQ.Perl.Template\ toolkit\ JS :cal SetSyn("tt2js")<CR>
+an 50.90.250 &Syntax.PQ.PHP.PHP\ 3-4 :cal SetSyn("php")<CR>
+an 50.90.260 &Syntax.PQ.PHP.Phtml\ (PHP\ 2) :cal SetSyn("phtml")<CR>
+an 50.90.270 &Syntax.PQ.Pike :cal SetSyn("pike")<CR>
+an 50.90.280 &Syntax.PQ.Pine\ RC :cal SetSyn("pine")<CR>
+an 50.90.290 &Syntax.PQ.Pinfo\ RC :cal SetSyn("pinfo")<CR>
+an 50.90.300 &Syntax.PQ.PL/M :cal SetSyn("plm")<CR>
+an 50.90.310 &Syntax.PQ.PL/SQL :cal SetSyn("plsql")<CR>
+an 50.90.320 &Syntax.PQ.Pli :cal SetSyn("pli")<CR>
+an 50.90.330 &Syntax.PQ.PLP :cal SetSyn("plp")<CR>
+an 50.90.340 &Syntax.PQ.PO\ (GNU\ gettext) :cal SetSyn("po")<CR>
+an 50.90.350 &Syntax.PQ.Postfix\ main\ config :cal SetSyn("pfmain")<CR>
+an 50.90.360 &Syntax.PQ.PostScript.PostScript :cal SetSyn("postscr")<CR>
+an 50.90.370 &Syntax.PQ.PostScript.PostScript\ Printer\ Description :cal SetSyn("ppd")<CR>
+an 50.90.380 &Syntax.PQ.Povray.Povray\ scene\ descr :cal SetSyn("pov")<CR>
+an 50.90.390 &Syntax.PQ.Povray.Povray\ configuration :cal SetSyn("povini")<CR>
+an 50.90.400 &Syntax.PQ.PPWizard :cal SetSyn("ppwiz")<CR>
+an 50.90.410 &Syntax.PQ.Prescribe\ (Kyocera) :cal SetSyn("prescribe")<CR>
+an 50.90.420 &Syntax.PQ.Printcap :cal SetSyn("pcap")<CR>
+an 50.90.430 &Syntax.PQ.Privoxy :cal SetSyn("privoxy")<CR>
+an 50.90.440 &Syntax.PQ.Procmail :cal SetSyn("procmail")<CR>
+an 50.90.450 &Syntax.PQ.Product\ Spec\ File :cal SetSyn("psf")<CR>
+an 50.90.460 &Syntax.PQ.Progress :cal SetSyn("progress")<CR>
+an 50.90.470 &Syntax.PQ.Prolog :cal SetSyn("prolog")<CR>
+an 50.90.480 &Syntax.PQ.ProMeLa :cal SetSyn("promela")<CR>
+an 50.90.490 &Syntax.PQ.Proto :cal SetSyn("proto")<CR>
+an 50.90.500 &Syntax.PQ.Protocols :cal SetSyn("protocols")<CR>
+an 50.90.510 &Syntax.PQ.Purify\ log :cal SetSyn("purifylog")<CR>
+an 50.90.520 &Syntax.PQ.Pyrex :cal SetSyn("pyrex")<CR>
+an 50.90.530 &Syntax.PQ.Python :cal SetSyn("python")<CR>
+an 50.90.550 &Syntax.PQ.Quake :cal SetSyn("quake")<CR>
+an 50.90.560 &Syntax.PQ.Quickfix\ window :cal SetSyn("qf")<CR>
+an 50.100.100 &Syntax.R.R.R :cal SetSyn("r")<CR>
+an 50.100.110 &Syntax.R.R.R\ help :cal SetSyn("rhelp")<CR>
+an 50.100.120 &Syntax.R.R.R\ noweb :cal SetSyn("rnoweb")<CR>
+an 50.100.130 &Syntax.R.Racc\ input :cal SetSyn("racc")<CR>
+an 50.100.140 &Syntax.R.Radiance :cal SetSyn("radiance")<CR>
+an 50.100.150 &Syntax.R.Raml :cal SetSyn("raml")<CR>
+an 50.100.160 &Syntax.R.Ratpoison :cal SetSyn("ratpoison")<CR>
+an 50.100.170 &Syntax.R.RCS.RCS\ log\ output :cal SetSyn("rcslog")<CR>
+an 50.100.180 &Syntax.R.RCS.RCS\ file :cal SetSyn("rcs")<CR>
+an 50.100.190 &Syntax.R.Readline\ config :cal SetSyn("readline")<CR>
+an 50.100.200 &Syntax.R.Rebol :cal SetSyn("rebol")<CR>
+an 50.100.210 &Syntax.R.ReDIF :cal SetSyn("redif")<CR>
+an 50.100.220 &Syntax.R.Rego :cal SetSyn("rego")<CR>
+an 50.100.230 &Syntax.R.Relax\ NG :cal SetSyn("rng")<CR>
+an 50.100.240 &Syntax.R.Remind :cal SetSyn("remind")<CR>
+an 50.100.250 &Syntax.R.Relax\ NG\ compact :cal SetSyn("rnc")<CR>
+an 50.100.260 &Syntax.R.Renderman.Renderman\ Shader\ Lang :cal SetSyn("sl")<CR>
+an 50.100.270 &Syntax.R.Renderman.Renderman\ Interface\ Bytestream :cal SetSyn("rib")<CR>
+an 50.100.280 &Syntax.R.Resolv\.conf :cal SetSyn("resolv")<CR>
+an 50.100.290 &Syntax.R.Reva\ Forth :cal SetSyn("reva")<CR>
+an 50.100.300 &Syntax.R.Rexx :cal SetSyn("rexx")<CR>
+an 50.100.310 &Syntax.R.Robots\.txt :cal SetSyn("robots")<CR>
+an 50.100.320 &Syntax.R.RockLinux\ package\ desc\. :cal SetSyn("desc")<CR>
+an 50.100.330 &Syntax.R.Rpcgen :cal SetSyn("rpcgen")<CR>
+an 50.100.340 &Syntax.R.RPL/2 :cal SetSyn("rpl")<CR>
+an 50.100.350 &Syntax.R.ReStructuredText :cal SetSyn("rst")<CR>
+an 50.110.100 &Syntax.M.ReStructuredText\ with\ R\ statements :cal SetSyn("rrst")<CR>
+an 50.120.100 &Syntax.R.RTF :cal SetSyn("rtf")<CR>
+an 50.120.110 &Syntax.R.Ruby :cal SetSyn("ruby")<CR>
+an 50.120.120 &Syntax.R.Rust :cal SetSyn("rust")<CR>
+an 50.130.100 &Syntax.S-Sm.S-Lang :cal SetSyn("slang")<CR>
+an 50.130.110 &Syntax.S-Sm.Samba\ config :cal SetSyn("samba")<CR>
+an 50.130.120 &Syntax.S-Sm.SAS :cal SetSyn("sas")<CR>
+an 50.130.130 &Syntax.S-Sm.Sass :cal SetSyn("sass")<CR>
+an 50.130.140 &Syntax.S-Sm.Sather :cal SetSyn("sather")<CR>
+an 50.130.150 &Syntax.S-Sm.Sbt :cal SetSyn("sbt")<CR>
+an 50.130.160 &Syntax.S-Sm.Scala :cal SetSyn("scala")<CR>
+an 50.130.170 &Syntax.S-Sm.Scheme :cal SetSyn("scheme")<CR>
+an 50.130.180 &Syntax.S-Sm.Scilab :cal SetSyn("scilab")<CR>
+an 50.130.190 &Syntax.S-Sm.Screen\ RC :cal SetSyn("screen")<CR>
+an 50.130.200 &Syntax.S-Sm.SCSS :cal SetSyn("scss")<CR>
+an 50.130.210 &Syntax.S-Sm.SDC\ Synopsys\ Design\ Constraints :cal SetSyn("sdc")<CR>
+an 50.130.220 &Syntax.S-Sm.SDL :cal SetSyn("sdl")<CR>
+an 50.130.230 &Syntax.S-Sm.Sed :cal SetSyn("sed")<CR>
+an 50.130.240 &Syntax.S-Sm.Sendmail\.cf :cal SetSyn("sm")<CR>
+an 50.130.250 &Syntax.S-Sm.Send-pr :cal SetSyn("sendpr")<CR>
+an 50.130.260 &Syntax.S-Sm.Sensors\.conf :cal SetSyn("sensors")<CR>
+an 50.130.270 &Syntax.S-Sm.Service\ Location\ config :cal SetSyn("slpconf")<CR>
+an 50.130.280 &Syntax.S-Sm.Service\ Location\ registration :cal SetSyn("slpreg")<CR>
+an 50.130.290 &Syntax.S-Sm.Service\ Location\ SPI :cal SetSyn("slpspi")<CR>
+an 50.130.300 &Syntax.S-Sm.Services :cal SetSyn("services")<CR>
+an 50.130.310 &Syntax.S-Sm.Setserial\ config :cal SetSyn("setserial")<CR>
+an 50.130.320 &Syntax.S-Sm.SGML.SGML\ catalog :cal SetSyn("catalog")<CR>
+an 50.130.330 &Syntax.S-Sm.SGML.SGML\ DTD :cal SetSyn("sgml")<CR>
+an 50.130.340 &Syntax.S-Sm.SGML.SGML\ Declaration :cal SetSyn("sgmldecl")<CR>
+an 50.130.350 &Syntax.S-Sm.SGML.SGML-linuxdoc :cal SetSyn("sgmllnx")<CR>
+an 50.130.360 &Syntax.S-Sm.Shell\ script.sh\ and\ ksh :cal SetSyn("sh")<CR>
+an 50.130.370 &Syntax.S-Sm.Shell\ script.csh :cal SetSyn("csh")<CR>
+an 50.130.380 &Syntax.S-Sm.Shell\ script.tcsh :cal SetSyn("tcsh")<CR>
+an 50.130.390 &Syntax.S-Sm.Shell\ script.zsh :cal SetSyn("zsh")<CR>
+an 50.130.400 &Syntax.S-Sm.SiCAD :cal SetSyn("sicad")<CR>
+an 50.130.410 &Syntax.S-Sm.Sieve :cal SetSyn("sieve")<CR>
+an 50.130.420 &Syntax.S-Sm.Simula :cal SetSyn("simula")<CR>
+an 50.130.430 &Syntax.S-Sm.Sinda.Sinda\ compare :cal SetSyn("sindacmp")<CR>
+an 50.130.440 &Syntax.S-Sm.Sinda.Sinda\ input :cal SetSyn("sinda")<CR>
+an 50.130.450 &Syntax.S-Sm.Sinda.Sinda\ output :cal SetSyn("sindaout")<CR>
+an 50.130.460 &Syntax.S-Sm.SiSU :cal SetSyn("sisu")<CR>
+an 50.130.470 &Syntax.S-Sm.SKILL.SKILL :cal SetSyn("skill")<CR>
+an 50.130.480 &Syntax.S-Sm.SKILL.SKILL\ for\ Diva :cal SetSyn("diva")<CR>
+an 50.130.490 &Syntax.S-Sm.Slice :cal SetSyn("slice")<CR>
+an 50.130.500 &Syntax.S-Sm.SLRN.Slrn\ rc :cal SetSyn("slrnrc")<CR>
+an 50.130.510 &Syntax.S-Sm.SLRN.Slrn\ score :cal SetSyn("slrnsc")<CR>
+an 50.130.520 &Syntax.S-Sm.SmallTalk :cal SetSyn("st")<CR>
+an 50.130.530 &Syntax.S-Sm.Smarty\ Templates :cal SetSyn("smarty")<CR>
+an 50.130.540 &Syntax.S-Sm.SMIL :cal SetSyn("smil")<CR>
+an 50.130.550 &Syntax.S-Sm.SMITH :cal SetSyn("smith")<CR>
+an 50.140.100 &Syntax.Sn-Sy.SNMP\ MIB :cal SetSyn("mib")<CR>
+an 50.140.110 &Syntax.Sn-Sy.SNNS.SNNS\ network :cal SetSyn("snnsnet")<CR>
+an 50.140.120 &Syntax.Sn-Sy.SNNS.SNNS\ pattern :cal SetSyn("snnspat")<CR>
+an 50.140.130 &Syntax.Sn-Sy.SNNS.SNNS\ result :cal SetSyn("snnsres")<CR>
+an 50.140.140 &Syntax.Sn-Sy.Snobol4 :cal SetSyn("snobol4")<CR>
+an 50.140.150 &Syntax.Sn-Sy.Snort\ Configuration :cal SetSyn("hog")<CR>
+an 50.140.160 &Syntax.Sn-Sy.SPEC\ (Linux\ RPM) :cal SetSyn("spec")<CR>
+an 50.140.170 &Syntax.Sn-Sy.Specman :cal SetSyn("specman")<CR>
+an 50.140.180 &Syntax.Sn-Sy.Spice :cal SetSyn("spice")<CR>
+an 50.140.190 &Syntax.Sn-Sy.Spyce :cal SetSyn("spyce")<CR>
+an 50.140.200 &Syntax.Sn-Sy.Speedup :cal SetSyn("spup")<CR>
+an 50.140.210 &Syntax.Sn-Sy.Splint :cal SetSyn("splint")<CR>
+an 50.140.220 &Syntax.Sn-Sy.Squid\ config :cal SetSyn("squid")<CR>
+an 50.140.230 &Syntax.Sn-Sy.SQL.SAP\ HANA :cal SetSyn("sqlhana")<CR>
+an 50.140.240 &Syntax.Sn-Sy.SQL.ESQL-C :cal SetSyn("esqlc")<CR>
+an 50.140.250 &Syntax.Sn-Sy.SQL.MySQL :cal SetSyn("mysql")<CR>
+an 50.140.260 &Syntax.Sn-Sy.SQL.PL/SQL :cal SetSyn("plsql")<CR>
+an 50.140.270 &Syntax.Sn-Sy.SQL.SQL\ Anywhere :cal SetSyn("sqlanywhere")<CR>
+an 50.140.280 &Syntax.Sn-Sy.SQL.SQL\ (automatic) :cal SetSyn("sql")<CR>
+an 50.140.290 &Syntax.Sn-Sy.SQL.SQL\ (Oracle) :cal SetSyn("sqloracle")<CR>
+an 50.140.300 &Syntax.Sn-Sy.SQL.SQL\ Forms :cal SetSyn("sqlforms")<CR>
+an 50.140.310 &Syntax.Sn-Sy.SQL.SQLJ :cal SetSyn("sqlj")<CR>
+an 50.140.320 &Syntax.Sn-Sy.SQL.SQL-Informix :cal SetSyn("sqlinformix")<CR>
+an 50.140.330 &Syntax.Sn-Sy.SQR :cal SetSyn("sqr")<CR>
+an 50.140.340 &Syntax.Sn-Sy.Ssh.ssh_config :cal SetSyn("sshconfig")<CR>
+an 50.140.350 &Syntax.Sn-Sy.Ssh.sshd_config :cal SetSyn("sshdconfig")<CR>
+an 50.140.360 &Syntax.Sn-Sy.Standard\ ML :cal SetSyn("sml")<CR>
+an 50.140.370 &Syntax.Sn-Sy.Stata.SMCL :cal SetSyn("smcl")<CR>
+an 50.140.380 &Syntax.Sn-Sy.Stata.Stata :cal SetSyn("stata")<CR>
+an 50.140.390 &Syntax.Sn-Sy.Stored\ Procedures :cal SetSyn("stp")<CR>
+an 50.140.400 &Syntax.Sn-Sy.Strace :cal SetSyn("strace")<CR>
+an 50.140.410 &Syntax.Sn-Sy.Streaming\ descriptor\ file :cal SetSyn("sd")<CR>
+an 50.140.420 &Syntax.Sn-Sy.Subversion\ commit :cal SetSyn("svn")<CR>
+an 50.140.430 &Syntax.Sn-Sy.Sudoers :cal SetSyn("sudoers")<CR>
+an 50.140.440 &Syntax.Sn-Sy.SVG :cal SetSyn("svg")<CR>
+an 50.140.450 &Syntax.Sn-Sy.Symbian\ meta-makefile :cal SetSyn("mmp")<CR>
+an 50.140.460 &Syntax.Sn-Sy.Sysctl\.conf :cal SetSyn("sysctl")<CR>
+an 50.140.470 &Syntax.Sn-Sy.Systemd :cal SetSyn("systemd")<CR>
+an 50.140.480 &Syntax.Sn-Sy.SystemVerilog :cal SetSyn("systemverilog")<CR>
+an 50.150.100 &Syntax.T.TADS :cal SetSyn("tads")<CR>
+an 50.150.110 &Syntax.T.Tags :cal SetSyn("tags")<CR>
+an 50.150.120 &Syntax.T.TAK.TAK\ compare :cal SetSyn("takcmp")<CR>
+an 50.150.130 &Syntax.T.TAK.TAK\ input :cal SetSyn("tak")<CR>
+an 50.150.140 &Syntax.T.TAK.TAK\ output :cal SetSyn("takout")<CR>
+an 50.150.150 &Syntax.T.Tar\ listing :cal SetSyn("tar")<CR>
+an 50.150.160 &Syntax.T.Task\ data :cal SetSyn("taskdata")<CR>
+an 50.150.170 &Syntax.T.Task\ 42\ edit :cal SetSyn("taskedit")<CR>
+an 50.150.180 &Syntax.T.Tcl/Tk :cal SetSyn("tcl")<CR>
+an 50.150.190 &Syntax.T.TealInfo :cal SetSyn("tli")<CR>
+an 50.150.200 &Syntax.T.Telix\ Salt :cal SetSyn("tsalt")<CR>
+an 50.150.210 &Syntax.T.Termcap/Printcap :cal SetSyn("ptcap")<CR>
+an 50.150.220 &Syntax.T.Terminfo :cal SetSyn("terminfo")<CR>
+an 50.150.230 &Syntax.T.Tera\ Term :cal SetSyn("teraterm")<CR>
+an 50.150.240 &Syntax.T.TeX.TeX/LaTeX :cal SetSyn("tex")<CR>
+an 50.150.250 &Syntax.T.TeX.plain\ TeX :cal SetSyn("plaintex")<CR>
+an 50.150.260 &Syntax.T.TeX.Initex :cal SetSyn("initex")<CR>
+an 50.150.270 &Syntax.T.TeX.ConTeXt :cal SetSyn("context")<CR>
+an 50.150.280 &Syntax.T.TeX.TeX\ configuration :cal SetSyn("texmf")<CR>
+an 50.150.290 &Syntax.T.TeX.Texinfo :cal SetSyn("texinfo")<CR>
+an 50.150.300 &Syntax.T.TF\ mud\ client :cal SetSyn("tf")<CR>
+an 50.150.310 &Syntax.T.Tidy\ configuration :cal SetSyn("tidy")<CR>
+an 50.150.320 &Syntax.T.Tilde :cal SetSyn("tilde")<CR>
+an 50.150.330 &Syntax.T.Tmux\ configuration :cal SetSyn("tmux")<CR>
+an 50.150.340 &Syntax.T.TPP :cal SetSyn("tpp")<CR>
+an 50.150.350 &Syntax.T.Trasys\ input :cal SetSyn("trasys")<CR>
+an 50.150.360 &Syntax.T.Treetop :cal SetSyn("treetop")<CR>
+an 50.150.370 &Syntax.T.Trustees :cal SetSyn("trustees")<CR>
+an 50.150.380 &Syntax.T.TSS.Command\ Line :cal SetSyn("tsscl")<CR>
+an 50.150.390 &Syntax.T.TSS.Geometry :cal SetSyn("tssgm")<CR>
+an 50.150.400 &Syntax.T.TSS.Optics :cal SetSyn("tssop")<CR>
+an 50.150.410 &Syntax.T.Typescript :cal SetSyn("typescript")<CR>
+an 50.150.420 &Syntax.T.TypescriptReact :cal SetSyn("typescriptreact")<CR>
+an 50.160.100 &Syntax.UV.Udev\ config :cal SetSyn("udevconf")<CR>
+an 50.160.110 &Syntax.UV.Udev\ permissions :cal SetSyn("udevperm")<CR>
+an 50.160.120 &Syntax.UV.Udev\ rules :cal SetSyn("udevrules")<CR>
+an 50.160.130 &Syntax.UV.UIT/UIL :cal SetSyn("uil")<CR>
+an 50.160.140 &Syntax.UV.UnrealScript :cal SetSyn("uc")<CR>
+an 50.160.150 &Syntax.UV.Updatedb\.conf :cal SetSyn("updatedb")<CR>
+an 50.160.160 &Syntax.UV.Upstart :cal SetSyn("upstart")<CR>
+an 50.160.180 &Syntax.UV.Valgrind :cal SetSyn("valgrind")<CR>
+an 50.160.190 &Syntax.UV.Vera :cal SetSyn("vera")<CR>
+an 50.160.200 &Syntax.UV.Verbose\ TAP\ Output :cal SetSyn("tap")<CR>
+an 50.160.210 &Syntax.UV.Verilog-AMS\ HDL :cal SetSyn("verilogams")<CR>
+an 50.160.220 &Syntax.UV.Verilog\ HDL :cal SetSyn("verilog")<CR>
+an 50.160.230 &Syntax.UV.Vgrindefs :cal SetSyn("vgrindefs")<CR>
+an 50.160.240 &Syntax.UV.VHDL :cal SetSyn("vhdl")<CR>
+an 50.160.250 &Syntax.UV.Vim.Vim\ help\ file :cal SetSyn("help")<CR>
+an 50.160.260 &Syntax.UV.Vim.Vim\ script :cal SetSyn("vim")<CR>
+an 50.160.270 &Syntax.UV.Vim.Viminfo\ file :cal SetSyn("viminfo")<CR>
+an 50.160.280 &Syntax.UV.Virata\ config :cal SetSyn("virata")<CR>
+an 50.160.290 &Syntax.UV.Visual\ Basic :cal SetSyn("vb")<CR>
+an 50.160.300 &Syntax.UV.VOS\ CM\ macro :cal SetSyn("voscm")<CR>
+an 50.160.310 &Syntax.UV.VRML :cal SetSyn("vrml")<CR>
+an 50.160.320 &Syntax.UV.Vroom :cal SetSyn("vroom")<CR>
+an 50.160.330 &Syntax.UV.VSE\ JCL :cal SetSyn("vsejcl")<CR>
+an 50.170.100 &Syntax.WXYZ.WEB.CWEB :cal SetSyn("cweb")<CR>
+an 50.170.110 &Syntax.WXYZ.WEB.WEB :cal SetSyn("web")<CR>
+an 50.170.120 &Syntax.WXYZ.WEB.WEB\ Changes :cal SetSyn("change")<CR>
+an 50.170.130 &Syntax.WXYZ.WebAssembly :cal SetSyn("wast")<CR>
+an 50.170.140 &Syntax.WXYZ.Webmacro :cal SetSyn("webmacro")<CR>
+an 50.170.150 &Syntax.WXYZ.Website\ MetaLanguage :cal SetSyn("wml")<CR>
+an 50.170.170 &Syntax.WXYZ.wDiff :cal SetSyn("wdiff")<CR>
+an 50.170.190 &Syntax.WXYZ.Wget\ config :cal SetSyn("wget")<CR>
+an 50.170.200 &Syntax.WXYZ.Whitespace\ (add) :cal SetSyn("whitespace")<CR>
+an 50.170.210 &Syntax.WXYZ.WildPackets\ EtherPeek\ Decoder :cal SetSyn("dcd")<CR>
+an 50.170.220 &Syntax.WXYZ.WinBatch/Webbatch :cal SetSyn("winbatch")<CR>
+an 50.170.230 &Syntax.WXYZ.Windows\ Scripting\ Host :cal SetSyn("wsh")<CR>
+an 50.170.240 &Syntax.WXYZ.WSML :cal SetSyn("wsml")<CR>
+an 50.170.250 &Syntax.WXYZ.WvDial :cal SetSyn("wvdial")<CR>
+an 50.170.270 &Syntax.WXYZ.X\ Keyboard\ Extension :cal SetSyn("xkb")<CR>
+an 50.170.280 &Syntax.WXYZ.X\ Pixmap :cal SetSyn("xpm")<CR>
+an 50.170.290 &Syntax.WXYZ.X\ Pixmap\ (2) :cal SetSyn("xpm2")<CR>
+an 50.170.300 &Syntax.WXYZ.X\ resources :cal SetSyn("xdefaults")<CR>
+an 50.170.310 &Syntax.WXYZ.XBL :cal SetSyn("xbl")<CR>
+an 50.170.320 &Syntax.WXYZ.Xinetd\.conf :cal SetSyn("xinetd")<CR>
+an 50.170.330 &Syntax.WXYZ.Xmodmap :cal SetSyn("xmodmap")<CR>
+an 50.170.340 &Syntax.WXYZ.Xmath :cal SetSyn("xmath")<CR>
+an 50.170.350 &Syntax.WXYZ.XML :cal SetSyn("xml")<CR>
+an 50.170.360 &Syntax.WXYZ.XML\ Schema\ (XSD) :cal SetSyn("xsd")<CR>
+an 50.170.370 &Syntax.WXYZ.XQuery :cal SetSyn("xquery")<CR>
+an 50.170.380 &Syntax.WXYZ.Xslt :cal SetSyn("xslt")<CR>
+an 50.170.390 &Syntax.WXYZ.XFree86\ Config :cal SetSyn("xf86conf")<CR>
+an 50.170.410 &Syntax.WXYZ.YAML :cal SetSyn("yaml")<CR>
+an 50.170.420 &Syntax.WXYZ.Yacc :cal SetSyn("yacc")<CR>
+an 50.170.440 &Syntax.WXYZ.Zimbu :cal SetSyn("zimbu")<CR>
+
+" The End Of The Syntax Menu
+
+
+an 50.195 &Syntax.-SEP1- <Nop>
+
+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>
+fun s:Nosynonly()
+ if exists("s:syntax_menu_synonly")
+ unlet s:syntax_menu_synonly
+ endif
+endfun
+
+" Restore 'cpoptions'
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/2html.vim b/runtime/syntax/2html.vim
new file mode 100644
index 0000000..69780cf
--- /dev/null
+++ b/runtime/syntax/2html.vim
@@ -0,0 +1,1995 @@
+" Vim syntax support file
+" Maintainer: Ben Fritz <fritzophrenic@gmail.com>
+" Last Change: 2023 Jan 01
+"
+" Additional contributors:
+"
+" Original by Bram Moolenaar <Bram@vim.org>
+" Modified by David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" XHTML support by Panagiotis Issaris <takis@lumumba.luc.ac.be>
+" Made w3 compliant by Edd Barrett <vext01@gmail.com>
+" Added html_font. Edd Barrett <vext01@gmail.com>
+" Progress bar based off code from "progressbar widget" plugin by
+" Andreas Politz, heavily modified:
+" http://www.vim.org/scripts/script.php?script_id=2006
+"
+" See Mercurial change logs for more!
+
+" Transform a file into HTML, using the current syntax highlighting.
+
+" this file uses line continuations
+let s:cpo_sav = &cpo
+let s:ls = &ls
+let s:ei_sav = &eventignore
+set cpo&vim
+
+" HTML filetype can take a while to load/highlight if the destination file
+" already exists.
+set eventignore+=FileType
+
+let s:end=line('$')
+
+" Font
+if exists("g:html_font")
+ if type(g:html_font) == type([])
+ let s:htmlfont = "'". join(g:html_font,"','") . "', monospace"
+ else
+ let s:htmlfont = "'". g:html_font . "', monospace"
+ endif
+else
+ let s:htmlfont = "monospace"
+endif
+
+let s:settings = tohtml#GetUserSettings()
+
+if s:settings.use_xhtml
+ let s:html5 = 0
+elseif s:settings.use_css && !s:settings.no_pre
+ let s:html5 = 1
+else
+ let s:html5 = 0
+endif
+
+if !exists('s:FOLDED_ID')
+ let s:FOLDED_ID = hlID("Folded") | lockvar s:FOLDED_ID
+ let s:FOLD_C_ID = hlID("FoldColumn") | lockvar s:FOLD_C_ID
+ let s:LINENR_ID = hlID('LineNr') | lockvar s:LINENR_ID
+ let s:DIFF_D_ID = hlID("DiffDelete") | lockvar s:DIFF_D_ID
+ let s:DIFF_A_ID = hlID("DiffAdd") | lockvar s:DIFF_A_ID
+ let s:DIFF_C_ID = hlID("DiffChange") | lockvar s:DIFF_C_ID
+ let s:DIFF_T_ID = hlID("DiffText") | lockvar s:DIFF_T_ID
+ let s:CONCEAL_ID = hlID('Conceal') | lockvar s:CONCEAL_ID
+endif
+
+" Whitespace
+if s:settings.pre_wrap
+ let s:whitespace = "white-space: pre-wrap; "
+else
+ let s:whitespace = ""
+endif
+
+if !empty(s:settings.prevent_copy)
+ if s:settings.no_invalid
+ " User has decided they don't want invalid markup. Still works in
+ " OpenOffice, and for text editors, but when pasting into Microsoft Word the
+ " input elements get pasted too and they cannot be deleted (at least not
+ " easily).
+ let s:unselInputType = ""
+ else
+ " Prevent from copy-pasting the input elements into Microsoft Word where
+ " they cannot be deleted easily by deliberately inserting invalid markup.
+ let s:unselInputType = " type='invalid_input_type'"
+ endif
+endif
+
+" When gui colors are not supported, we can only guess the colors.
+" TODO - is this true anymore? Is there a way to ask the terminal what colors
+" each number means or read them from some file?
+if &termguicolors || has("gui_running")
+ let s:whatterm = "gui"
+else
+ let s:whatterm = "cterm"
+ if &t_Co == 8
+ let s:cterm_color = {
+ \ 0: "#808080", 1: "#ff6060", 2: "#00ff00", 3: "#ffff00",
+ \ 4: "#8080ff", 5: "#ff40ff", 6: "#00ffff", 7: "#ffffff"
+ \ }
+ else
+ let s:cterm_color = {
+ \ 0: "#000000", 1: "#c00000", 2: "#008000", 3: "#804000",
+ \ 4: "#0000c0", 5: "#c000c0", 6: "#008080", 7: "#c0c0c0",
+ \ 8: "#808080", 9: "#ff6060", 10: "#00ff00", 11: "#ffff00",
+ \ 12: "#8080ff", 13: "#ff40ff", 14: "#00ffff", 15: "#ffffff"
+ \ }
+
+ " Colors for 88 and 256 come from xterm.
+ if &t_Co == 88
+ call extend(s:cterm_color, {
+ \ 16: "#000000", 17: "#00008b", 18: "#0000cd", 19: "#0000ff",
+ \ 20: "#008b00", 21: "#008b8b", 22: "#008bcd", 23: "#008bff",
+ \ 24: "#00cd00", 25: "#00cd8b", 26: "#00cdcd", 27: "#00cdff",
+ \ 28: "#00ff00", 29: "#00ff8b", 30: "#00ffcd", 31: "#00ffff",
+ \ 32: "#8b0000", 33: "#8b008b", 34: "#8b00cd", 35: "#8b00ff",
+ \ 36: "#8b8b00", 37: "#8b8b8b", 38: "#8b8bcd", 39: "#8b8bff",
+ \ 40: "#8bcd00", 41: "#8bcd8b", 42: "#8bcdcd", 43: "#8bcdff",
+ \ 44: "#8bff00", 45: "#8bff8b", 46: "#8bffcd", 47: "#8bffff",
+ \ 48: "#cd0000", 49: "#cd008b", 50: "#cd00cd", 51: "#cd00ff",
+ \ 52: "#cd8b00", 53: "#cd8b8b", 54: "#cd8bcd", 55: "#cd8bff",
+ \ 56: "#cdcd00", 57: "#cdcd8b", 58: "#cdcdcd", 59: "#cdcdff",
+ \ 60: "#cdff00", 61: "#cdff8b", 62: "#cdffcd", 63: "#cdffff",
+ \ 64: "#ff0000"
+ \ })
+ call extend(s:cterm_color, {
+ \ 65: "#ff008b", 66: "#ff00cd", 67: "#ff00ff", 68: "#ff8b00",
+ \ 69: "#ff8b8b", 70: "#ff8bcd", 71: "#ff8bff", 72: "#ffcd00",
+ \ 73: "#ffcd8b", 74: "#ffcdcd", 75: "#ffcdff", 76: "#ffff00",
+ \ 77: "#ffff8b", 78: "#ffffcd", 79: "#ffffff", 80: "#2e2e2e",
+ \ 81: "#5c5c5c", 82: "#737373", 83: "#8b8b8b", 84: "#a2a2a2",
+ \ 85: "#b9b9b9", 86: "#d0d0d0", 87: "#e7e7e7"
+ \ })
+ elseif &t_Co == 256
+ call extend(s:cterm_color, {
+ \ 16: "#000000", 17: "#00005f", 18: "#000087", 19: "#0000af",
+ \ 20: "#0000d7", 21: "#0000ff", 22: "#005f00", 23: "#005f5f",
+ \ 24: "#005f87", 25: "#005faf", 26: "#005fd7", 27: "#005fff",
+ \ 28: "#008700", 29: "#00875f", 30: "#008787", 31: "#0087af",
+ \ 32: "#0087d7", 33: "#0087ff", 34: "#00af00", 35: "#00af5f",
+ \ 36: "#00af87", 37: "#00afaf", 38: "#00afd7", 39: "#00afff",
+ \ 40: "#00d700", 41: "#00d75f", 42: "#00d787", 43: "#00d7af",
+ \ 44: "#00d7d7", 45: "#00d7ff", 46: "#00ff00", 47: "#00ff5f",
+ \ 48: "#00ff87", 49: "#00ffaf", 50: "#00ffd7", 51: "#00ffff",
+ \ 52: "#5f0000", 53: "#5f005f", 54: "#5f0087", 55: "#5f00af",
+ \ 56: "#5f00d7", 57: "#5f00ff", 58: "#5f5f00", 59: "#5f5f5f",
+ \ 60: "#5f5f87", 61: "#5f5faf", 62: "#5f5fd7", 63: "#5f5fff",
+ \ 64: "#5f8700"
+ \ })
+ call extend(s:cterm_color, {
+ \ 65: "#5f875f", 66: "#5f8787", 67: "#5f87af", 68: "#5f87d7",
+ \ 69: "#5f87ff", 70: "#5faf00", 71: "#5faf5f", 72: "#5faf87",
+ \ 73: "#5fafaf", 74: "#5fafd7", 75: "#5fafff", 76: "#5fd700",
+ \ 77: "#5fd75f", 78: "#5fd787", 79: "#5fd7af", 80: "#5fd7d7",
+ \ 81: "#5fd7ff", 82: "#5fff00", 83: "#5fff5f", 84: "#5fff87",
+ \ 85: "#5fffaf", 86: "#5fffd7", 87: "#5fffff", 88: "#870000",
+ \ 89: "#87005f", 90: "#870087", 91: "#8700af", 92: "#8700d7",
+ \ 93: "#8700ff", 94: "#875f00", 95: "#875f5f", 96: "#875f87",
+ \ 97: "#875faf", 98: "#875fd7", 99: "#875fff", 100: "#878700",
+ \ 101: "#87875f", 102: "#878787", 103: "#8787af", 104: "#8787d7",
+ \ 105: "#8787ff", 106: "#87af00", 107: "#87af5f", 108: "#87af87",
+ \ 109: "#87afaf", 110: "#87afd7", 111: "#87afff", 112: "#87d700"
+ \ })
+ call extend(s:cterm_color, {
+ \ 113: "#87d75f", 114: "#87d787", 115: "#87d7af", 116: "#87d7d7",
+ \ 117: "#87d7ff", 118: "#87ff00", 119: "#87ff5f", 120: "#87ff87",
+ \ 121: "#87ffaf", 122: "#87ffd7", 123: "#87ffff", 124: "#af0000",
+ \ 125: "#af005f", 126: "#af0087", 127: "#af00af", 128: "#af00d7",
+ \ 129: "#af00ff", 130: "#af5f00", 131: "#af5f5f", 132: "#af5f87",
+ \ 133: "#af5faf", 134: "#af5fd7", 135: "#af5fff", 136: "#af8700",
+ \ 137: "#af875f", 138: "#af8787", 139: "#af87af", 140: "#af87d7",
+ \ 141: "#af87ff", 142: "#afaf00", 143: "#afaf5f", 144: "#afaf87",
+ \ 145: "#afafaf", 146: "#afafd7", 147: "#afafff", 148: "#afd700",
+ \ 149: "#afd75f", 150: "#afd787", 151: "#afd7af", 152: "#afd7d7",
+ \ 153: "#afd7ff", 154: "#afff00", 155: "#afff5f", 156: "#afff87",
+ \ 157: "#afffaf", 158: "#afffd7"
+ \ })
+ call extend(s:cterm_color, {
+ \ 159: "#afffff", 160: "#d70000", 161: "#d7005f", 162: "#d70087",
+ \ 163: "#d700af", 164: "#d700d7", 165: "#d700ff", 166: "#d75f00",
+ \ 167: "#d75f5f", 168: "#d75f87", 169: "#d75faf", 170: "#d75fd7",
+ \ 171: "#d75fff", 172: "#d78700", 173: "#d7875f", 174: "#d78787",
+ \ 175: "#d787af", 176: "#d787d7", 177: "#d787ff", 178: "#d7af00",
+ \ 179: "#d7af5f", 180: "#d7af87", 181: "#d7afaf", 182: "#d7afd7",
+ \ 183: "#d7afff", 184: "#d7d700", 185: "#d7d75f", 186: "#d7d787",
+ \ 187: "#d7d7af", 188: "#d7d7d7", 189: "#d7d7ff", 190: "#d7ff00",
+ \ 191: "#d7ff5f", 192: "#d7ff87", 193: "#d7ffaf", 194: "#d7ffd7",
+ \ 195: "#d7ffff", 196: "#ff0000", 197: "#ff005f", 198: "#ff0087",
+ \ 199: "#ff00af", 200: "#ff00d7", 201: "#ff00ff", 202: "#ff5f00",
+ \ 203: "#ff5f5f", 204: "#ff5f87"
+ \ })
+ call extend(s:cterm_color, {
+ \ 205: "#ff5faf", 206: "#ff5fd7", 207: "#ff5fff", 208: "#ff8700",
+ \ 209: "#ff875f", 210: "#ff8787", 211: "#ff87af", 212: "#ff87d7",
+ \ 213: "#ff87ff", 214: "#ffaf00", 215: "#ffaf5f", 216: "#ffaf87",
+ \ 217: "#ffafaf", 218: "#ffafd7", 219: "#ffafff", 220: "#ffd700",
+ \ 221: "#ffd75f", 222: "#ffd787", 223: "#ffd7af", 224: "#ffd7d7",
+ \ 225: "#ffd7ff", 226: "#ffff00", 227: "#ffff5f", 228: "#ffff87",
+ \ 229: "#ffffaf", 230: "#ffffd7", 231: "#ffffff", 232: "#080808",
+ \ 233: "#121212", 234: "#1c1c1c", 235: "#262626", 236: "#303030",
+ \ 237: "#3a3a3a", 238: "#444444", 239: "#4e4e4e", 240: "#585858",
+ \ 241: "#626262", 242: "#6c6c6c", 243: "#767676", 244: "#808080",
+ \ 245: "#8a8a8a", 246: "#949494", 247: "#9e9e9e", 248: "#a8a8a8",
+ \ 249: "#b2b2b2", 250: "#bcbcbc", 251: "#c6c6c6", 252: "#d0d0d0",
+ \ 253: "#dadada", 254: "#e4e4e4", 255: "#eeeeee"
+ \ })
+ endif
+ endif
+endif
+
+" Return good color specification: in GUI no transformation is done, in
+" terminal return RGB values of known colors and empty string for unknown
+if s:whatterm == "gui"
+ function! s:HtmlColor(color)
+ return a:color
+ endfun
+else
+ function! s:HtmlColor(color)
+ if has_key(s:cterm_color, a:color)
+ return s:cterm_color[a:color]
+ else
+ return ""
+ endif
+ endfun
+endif
+
+" Find out the background and foreground color for use later
+let s:fgc = s:HtmlColor(synIDattr(hlID("Normal"), "fg#", s:whatterm))
+let s:bgc = s:HtmlColor(synIDattr(hlID("Normal"), "bg#", s:whatterm))
+if s:fgc == ""
+ let s:fgc = ( &background == "dark" ? "#ffffff" : "#000000" )
+endif
+if s:bgc == ""
+ let s:bgc = ( &background == "dark" ? "#000000" : "#ffffff" )
+endif
+
+if !s:settings.use_css
+ " Return opening HTML tag for given highlight id
+ function! s:HtmlOpening(id, extra_attrs)
+ let a = ""
+ if synIDattr(a:id, "inverse")
+ " For inverse, we always must set both colors (and exchange them)
+ let x = s:HtmlColor(synIDattr(a:id, "fg#", s:whatterm))
+ let a = a . '<span '.a:extra_attrs.'style="background-color: ' . ( x != "" ? x : s:fgc ) . '">'
+ let x = s:HtmlColor(synIDattr(a:id, "bg#", s:whatterm))
+ let a = a . '<font color="' . ( x != "" ? x : s:bgc ) . '">'
+ else
+ let x = s:HtmlColor(synIDattr(a:id, "bg#", s:whatterm))
+ if x != ""
+ let a = a . '<span '.a:extra_attrs.'style="background-color: ' . x . '">'
+ elseif !empty(a:extra_attrs)
+ let a = a . '<span '.a:extra_attrs.'>'
+ endif
+ let x = s:HtmlColor(synIDattr(a:id, "fg#", s:whatterm))
+ if x != "" | let a = a . '<font color="' . x . '">' | endif
+ endif
+ if synIDattr(a:id, "bold") | let a = a . "<b>" | endif
+ if synIDattr(a:id, "italic") | let a = a . "<i>" | endif
+ if synIDattr(a:id, "underline") | let a = a . "<u>" | endif
+ return a
+ endfun
+
+ " Return closing HTML tag for given highlight id
+ function! s:HtmlClosing(id, has_extra_attrs)
+ let a = ""
+ if synIDattr(a:id, "underline") | let a = a . "</u>" | endif
+ if synIDattr(a:id, "italic") | let a = a . "</i>" | endif
+ if synIDattr(a:id, "bold") | let a = a . "</b>" | endif
+ if synIDattr(a:id, "inverse")
+ let a = a . '</font></span>'
+ else
+ let x = s:HtmlColor(synIDattr(a:id, "fg#", s:whatterm))
+ if x != "" | let a = a . '</font>' | endif
+ let x = s:HtmlColor(synIDattr(a:id, "bg#", s:whatterm))
+ if x != "" || a:has_extra_attrs | let a = a . '</span>' | endif
+ endif
+ return a
+ endfun
+endif
+
+" Use a different function for formatting based on user options. This way we
+" can avoid a lot of logic during the actual execution.
+"
+" Build the function line by line containing only what is needed for the options
+" in use for maximum code sharing with minimal branch logic for greater speed.
+"
+" Note, 'exec' commands do not recognize line continuations, so must concatenate
+" lines rather than continue them.
+if s:settings.use_css
+ " save CSS to a list of rules to add to the output at the end of processing
+
+ " first, get the style names we need
+ let wrapperfunc_lines = [
+ \ 'function! s:BuildStyleWrapper(style_id, diff_style_id, extra_attrs, text, make_unselectable, unformatted)',
+ \ '',
+ \ ' let l:style_name = synIDattr(a:style_id, "name", s:whatterm)'
+ \ ]
+ if &diff
+ let wrapperfunc_lines += [
+ \ ' let l:diff_style_name = synIDattr(a:diff_style_id, "name", s:whatterm)']
+
+ " Add normal groups and diff groups to separate lists so we can order them to
+ " allow diff highlight to override normal highlight
+
+ " if primary style IS a diff style, grab it from the diff cache instead
+ " (always succeeds because we pre-populate it)
+ let wrapperfunc_lines += [
+ \ '',
+ \ ' if a:style_id == s:DIFF_D_ID || a:style_id == s:DIFF_A_ID ||'.
+ \ ' a:style_id == s:DIFF_C_ID || a:style_id == s:DIFF_T_ID',
+ \ ' let l:saved_style = get(s:diffstylelist,a:style_id)',
+ \ ' else'
+ \ ]
+ endif
+
+ " get primary style info from cache or build it on the fly if not found
+ let wrapperfunc_lines += [
+ \ ' let l:saved_style = get(s:stylelist,a:style_id)',
+ \ ' if type(l:saved_style) == type(0)',
+ \ ' unlet l:saved_style',
+ \ ' let l:saved_style = s:CSS1(a:style_id)',
+ \ ' if l:saved_style != ""',
+ \ ' let l:saved_style = "." . l:style_name . " { " . l:saved_style . "}"',
+ \ ' endif',
+ \ ' let s:stylelist[a:style_id]= l:saved_style',
+ \ ' endif'
+ \ ]
+ if &diff
+ let wrapperfunc_lines += [ ' endif' ]
+ endif
+
+ " Build the wrapper tags around the text. It turns out that caching these
+ " gives pretty much zero performance gain and adds a lot of logic.
+
+ let wrapperfunc_lines += [
+ \ '',
+ \ ' if l:saved_style == "" && empty(a:extra_attrs)'
+ \ ]
+ if &diff
+ let wrapperfunc_lines += [
+ \ ' if a:diff_style_id <= 0'
+ \ ]
+ endif
+ " no surroundings if neither primary nor diff style has any info
+ let wrapperfunc_lines += [
+ \ ' return a:text'
+ \ ]
+ if &diff
+ " no primary style, but diff style
+ let wrapperfunc_lines += [
+ \ ' else',
+ \ ' return "<span class=\"" .l:diff_style_name . "\">".a:text."</span>"',
+ \ ' endif'
+ \ ]
+ endif
+ " open tag for non-empty primary style
+ let wrapperfunc_lines += [
+ \ ' else']
+ " non-empty primary style. handle either empty or non-empty diff style.
+ "
+ " separate the two classes by a space to apply them both if there is a diff
+ " style name, unless the primary style is empty, then just use the diff style
+ " name
+ let diffstyle =
+ \ (&diff ? '(a:diff_style_id <= 0 ? "" : " ". l:diff_style_name) .'
+ \ : "")
+ if s:settings.prevent_copy == ""
+ let wrapperfunc_lines += [
+ \ ' return "<span ".a:extra_attrs."class=\"" . l:style_name .'.diffstyle.'"\">".a:text."</span>"'
+ \ ]
+ else
+
+ " New method: use generated content in the CSS. The only thing needed here
+ " is a span with no content, with an attribute holding the desired text.
+ "
+ " Old method: use an <input> element when text is unsectable. This is still
+ " used in conditional comments for Internet Explorer, where the new method
+ " doesn't work.
+ "
+ " Wrap the <input> in a <span> to allow fixing the stupid bug in some fonts
+ " which cause browsers to display a 1px gap between lines when these
+ " <input>s have a background color (maybe not really a bug, this isn't
+ " well-defined)
+ "
+ " use strwidth, because we care only about how many character boxes are
+ " needed to size the input, we don't care how many characters (including
+ " separately counted composing chars, from strchars()) or bytes (from
+ " len())the string contains. strdisplaywidth() is not needed because none of
+ " the unselectable groups can contain tab characters (fold column, fold
+ " text, line number).
+ "
+ " Note, if maxlength property needs to be added in the future, it will need
+ " to use strchars(), because HTML specifies that the maxlength parameter
+ " uses the number of unique codepoints for its limit.
+ let wrapperfunc_lines += [
+ \ ' if a:make_unselectable',
+ \ ' return "<span ".a:extra_attrs."class=\"" . l:style_name .'.diffstyle.'"\"'
+ \ ]
+ if s:settings.use_input_for_pc !=# 'all'
+ let wrapperfunc_lines[-1] .= ' " . "data-" . l:style_name . "-content=\"".a:text."\"'
+ endif
+ let wrapperfunc_lines[-1] .= '>'
+ if s:settings.use_input_for_pc !=# 'none'
+ let wrapperfunc_lines[-1] .=
+ \ '<input'.s:unselInputType.' class=\"" . l:style_name .'.diffstyle.'"\"'.
+ \ ' value=\"".substitute(a:unformatted,''\s\+$'',"","")."\"'.
+ \ ' onselect=''this.blur(); return false;'''.
+ \ ' onmousedown=''this.blur(); return false;'''.
+ \ ' onclick=''this.blur(); return false;'''.
+ \ ' readonly=''readonly'''.
+ \ ' size=\"".strwidth(a:unformatted)."\"'.
+ \ (s:settings.use_xhtml ? '/' : '').'>'
+ endif
+ let wrapperfunc_lines[-1] .= '</span>"'
+ let wrapperfunc_lines += [
+ \ ' else',
+ \ ' return "<span ".a:extra_attrs."class=\"" . l:style_name .'. diffstyle .'"\">".a:text."</span>"'
+ \ ]
+ endif
+ let wrapperfunc_lines += [
+ \ ' endif',
+ \ 'endfun'
+ \ ]
+else
+ " Non-CSS method just needs the wrapper.
+ "
+ " Functions used to get opening/closing automatically return null strings if
+ " no styles exist.
+ if &diff
+ let wrapperfunc_lines = [
+ \ 'function! s:BuildStyleWrapper(style_id, diff_style_id, extra_attrs, text, unusedarg, unusedarg2)',
+ \ ' return s:HtmlOpening(a:style_id, a:extra_attrs).(a:diff_style_id <= 0 ? "" :'.
+ \ 's:HtmlOpening(a:diff_style_id, "")).a:text.'.
+ \ '(a:diff_style_id <= 0 ? "" : s:HtmlClosing(a:diff_style_id, 0)).s:HtmlClosing(a:style_id, !empty(a:extra_attrs))',
+ \ 'endfun'
+ \ ]
+ else
+ let wrapperfunc_lines = [
+ \ 'function! s:BuildStyleWrapper(style_id, diff_style_id, extra_attrs, text, unusedarg, unusedarg2)',
+ \ ' return s:HtmlOpening(a:style_id, a:extra_attrs).a:text.s:HtmlClosing(a:style_id, !empty(a:extra_attrs))',
+ \ 'endfun'
+ \ ]
+ endif
+endif
+
+" create the function we built line by line above
+exec join(wrapperfunc_lines, "\n")
+
+let s:diff_mode = &diff
+
+" Return HTML valid characters enclosed in a span of class style_name with
+" unprintable characters expanded and double spaces replaced as necessary.
+"
+" TODO: eliminate unneeded logic like done for BuildStyleWrapper
+function! s:HtmlFormat(text, style_id, diff_style_id, extra_attrs, make_unselectable)
+ " Replace unprintable characters
+ let unformatted = strtrans(a:text)
+
+ let formatted = unformatted
+
+ " Replace the reserved html characters
+ let formatted = substitute(formatted, '&', '\&amp;', 'g')
+ let formatted = substitute(formatted, '<', '\&lt;', 'g')
+ let formatted = substitute(formatted, '>', '\&gt;', 'g')
+ let formatted = substitute(formatted, '"', '\&quot;', 'g')
+ " &apos; is not valid in HTML but it is in XHTML, so just use the numeric
+ " reference for it instead. Needed because it could appear in quotes
+ " especially if unselectable regions is turned on.
+ let formatted = substitute(formatted, '"', '\&#0039;', 'g')
+
+ " Replace a "form feed" character with HTML to do a page break
+ " TODO: need to prevent this in unselectable areas? Probably it should never
+ " BE in an unselectable area...
+ let formatted = substitute(formatted, "\x0c", '<hr class="PAGE-BREAK">', 'g')
+
+ " Replace double spaces, leading spaces, and trailing spaces if needed
+ if ' ' != s:HtmlSpace
+ let formatted = substitute(formatted, ' ', s:HtmlSpace . s:HtmlSpace, 'g')
+ let formatted = substitute(formatted, '^ ', s:HtmlSpace, 'g')
+ let formatted = substitute(formatted, ' \+$', s:HtmlSpace, 'g')
+ endif
+
+ " Enclose in the correct format
+ return s:BuildStyleWrapper(a:style_id, a:diff_style_id, a:extra_attrs, formatted, a:make_unselectable, unformatted)
+endfun
+
+" set up functions to call HtmlFormat in certain ways based on whether the
+" element is supposed to be unselectable or not
+if s:settings.prevent_copy =~# 'n'
+ if s:settings.number_lines
+ if s:settings.line_ids
+ function! s:HtmlFormat_n(text, style_id, diff_style_id, lnr)
+ if a:lnr > 0
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 'id="'.(exists('g:html_diff_win_num') ? 'W'.g:html_diff_win_num : "").'L'.a:lnr.s:settings.id_suffix.'" ', 1)
+ else
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, "", 1)
+ endif
+ endfun
+ else
+ function! s:HtmlFormat_n(text, style_id, diff_style_id, lnr)
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, "", 1)
+ endfun
+ endif
+ elseif s:settings.line_ids
+ " if lines are not being numbered the only reason this function gets called
+ " is to put the line IDs on each line; "text" will be empty but lnr will
+ " always be non-zero, however we don't want to use the <input> because that
+ " won't work as nice for empty text
+ function! s:HtmlFormat_n(text, style_id, diff_style_id, lnr)
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 'id="'.(exists('g:html_diff_win_num') ? 'W'.g:html_diff_win_num : "").'L'.a:lnr.s:settings.id_suffix.'" ', 0)
+ endfun
+ endif
+else
+ if s:settings.line_ids
+ function! s:HtmlFormat_n(text, style_id, diff_style_id, lnr)
+ if a:lnr > 0
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 'id="'.(exists('g:html_diff_win_num') ? 'W'.g:html_diff_win_num : "").'L'.a:lnr.s:settings.id_suffix.'" ', 0)
+ else
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, "", 0)
+ endif
+ endfun
+ else
+ function! s:HtmlFormat_n(text, style_id, diff_style_id, lnr)
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, "", 0)
+ endfun
+ endif
+endif
+if s:settings.prevent_copy =~# 'd'
+ function! s:HtmlFormat_d(text, style_id, diff_style_id)
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, "", 1)
+ endfun
+else
+ function! s:HtmlFormat_d(text, style_id, diff_style_id)
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, "", 0)
+ endfun
+endif
+if s:settings.prevent_copy =~# 'f'
+ if s:settings.use_input_for_pc ==# 'none'
+ " Simply space-pad to the desired width inside the generated content (note
+ " that the FoldColumn definition includes a whitespace:pre rule)
+ function! s:FoldColumn_build(char, len, numfill, char2, class, click)
+ return "<a href='#' class='".a:class."' onclick='".a:click."' data-FoldColumn-content='".
+ \ repeat(a:char, a:len).a:char2.repeat(' ', a:numfill).
+ \ "'></a>"
+ endfun
+ function! s:FoldColumn_fill()
+ return s:HtmlFormat(repeat(' ', s:foldcolumn), s:FOLD_C_ID, 0, "", 1)
+ endfun
+ else
+ " Note the <input> elements for fill spaces will have a single space for
+ " content, to allow active cursor CSS selection to work.
+ "
+ " Wrap the whole thing in a span for the 1px padding workaround for gaps.
+ "
+ " Build the function line by line containing only what is needed for the
+ " options in use for maximum code sharing with minimal branch logic for
+ " greater speed.
+ "
+ " Note, 'exec' commands do not recognize line continuations, so must
+ " concatenate lines rather than continue them.
+ let build_fun_lines = [
+ \ 'function! s:FoldColumn_build(char, len, numfill, char2, class, click)',
+ \ ' let l:input_open = "<input readonly=''readonly''".s:unselInputType.'.
+ \ ' " onselect=''this.blur(); return false;''".'.
+ \ ' " onmousedown=''this.blur(); ".a:click." return false;''".'.
+ \ ' " onclick=''return false;'' size=''".'.
+ \ ' string(a:len + (empty(a:char2) ? 0 : 1) + a:numfill) .'.
+ \ ' "'' "',
+ \ ' let l:common_attrs = "class=''FoldColumn'' value=''"',
+ \ ' let l:input_close = (s:settings.use_xhtml ? "'' />" : "''>")'
+ \ ]
+ if s:settings.use_input_for_pc ==# 'fallback'
+ let build_fun_lines += [
+ \ ' let l:gen_content_link ='.
+ \ ' "<a href=''#'' class=''FoldColumn'' onclick=''".a:click."'' data-FoldColumn-content=''".'.
+ \ ' repeat(a:char, a:len).a:char2.repeat('' '', a:numfill).'.
+ \ ' "''></a>"'
+ \ ]
+ endif
+ let build_fun_lines += [
+ \ ' return "<span class=''".a:class."''>".'.
+ \ ' l:input_open.l:common_attrs.repeat(a:char, a:len).(a:char2).'.
+ \ ' l:input_close.'.
+ \ (s:settings.use_input_for_pc ==# 'fallback' ? 'l:gen_content_link.' : "").
+ \ ' "</span>"',
+ \ 'endfun'
+ \ ]
+ " create the function we built line by line above
+ exec join(build_fun_lines, "\n")
+
+ function! s:FoldColumn_fill()
+ return s:FoldColumn_build(' ', s:foldcolumn, 0, '', 'FoldColumn', '')
+ endfun
+ endif
+else
+ " For normal fold columns, simply space-pad to the desired width (note that
+ " the FoldColumn definition includes a whitespace:pre rule)
+ function! s:FoldColumn_build(char, len, numfill, char2, class, click)
+ return "<a href='#' class='".a:class."' onclick='".a:click."'>".
+ \ repeat(a:char, a:len).a:char2.repeat(' ', a:numfill).
+ \ "</a>"
+ endfun
+ function! s:FoldColumn_fill()
+ return s:HtmlFormat(repeat(' ', s:foldcolumn), s:FOLD_C_ID, 0, "", 0)
+ endfun
+endif
+if s:settings.prevent_copy =~# 't'
+ " put an extra empty span at the end for dynamic folds, so the linebreak can
+ " be surrounded. Otherwise do it as normal.
+ "
+ " TODO: isn't there a better way to do this, than placing it here and using a
+ " substitute later?
+ if s:settings.dynamic_folds
+ function! s:HtmlFormat_t(text, style_id, diff_style_id)
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, "", 1) .
+ \ s:HtmlFormat("", a:style_id, 0, "", 0)
+ endfun
+ else
+ function! s:HtmlFormat_t(text, style_id, diff_style_id)
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, "", 1)
+ endfun
+ endif
+else
+ function! s:HtmlFormat_t(text, style_id, diff_style_id)
+ return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, "", 0)
+ endfun
+endif
+
+" Return CSS style describing given highlight id (can be empty)
+function! s:CSS1(id)
+ let a = ""
+ if synIDattr(a:id, "inverse")
+ " For inverse, we always must set both colors (and exchange them)
+ let x = s:HtmlColor(synIDattr(a:id, "bg#", s:whatterm))
+ let a = a . "color: " . ( x != "" ? x : s:bgc ) . "; "
+ let x = s:HtmlColor(synIDattr(a:id, "fg#", s:whatterm))
+ let a = a . "background-color: " . ( x != "" ? x : s:fgc ) . "; "
+ else
+ let x = s:HtmlColor(synIDattr(a:id, "fg#", s:whatterm))
+ if x != "" | let a = a . "color: " . x . "; " | endif
+ let x = s:HtmlColor(synIDattr(a:id, "bg#", s:whatterm))
+ if x != ""
+ let a = a . "background-color: " . x . "; "
+ " stupid hack because almost every browser seems to have at least one font
+ " which shows 1px gaps between lines which have background
+ let a = a . "padding-bottom: 1px; "
+ elseif (a:id == s:FOLDED_ID || a:id == s:LINENR_ID || a:id == s:FOLD_C_ID) && !empty(s:settings.prevent_copy)
+ " input elements default to a different color than the rest of the page
+ let a = a . "background-color: " . s:bgc . "; "
+ endif
+ endif
+ if synIDattr(a:id, "bold") | let a = a . "font-weight: bold; " | endif
+ if synIDattr(a:id, "italic") | let a = a . "font-style: italic; " | endif
+ if synIDattr(a:id, "underline") | let a = a . "text-decoration: underline; " | endif
+ return a
+endfun
+
+if s:settings.dynamic_folds
+ " compares two folds as stored in our list of folds
+ " A fold is "less" than another if it starts at an earlier line number,
+ " or ends at a later line number, ties broken by fold level
+ function! s:FoldCompare(f1, f2)
+ if a:f1.firstline != a:f2.firstline
+ " put it before if it starts earlier
+ return a:f1.firstline - a:f2.firstline
+ elseif a:f1.lastline != a:f2.lastline
+ " put it before if it ends later
+ return a:f2.lastline - a:f1.lastline
+ else
+ " if folds begin and end on the same lines, put lowest fold level first
+ return a:f1.level - a:f2.level
+ endif
+ endfunction
+
+endif
+
+
+" Set some options to make it work faster.
+" Don't report changes for :substitute, there will be many of them.
+" Don't change other windows; turn off scroll bind temporarily
+let s:old_title = &title
+let s:old_icon = &icon
+let s:old_et = &l:et
+let s:old_bind = &l:scrollbind
+let s:old_report = &report
+let s:old_search = @/
+let s:old_more = &more
+set notitle noicon
+setlocal et
+set nomore
+set report=1000000
+setlocal noscrollbind
+
+if exists(':ownsyntax') && exists('w:current_syntax')
+ let s:current_syntax = w:current_syntax
+elseif exists('b:current_syntax')
+ let s:current_syntax = b:current_syntax
+else
+ let s:current_syntax = 'none'
+endif
+
+if s:current_syntax == ''
+ let s:current_syntax = 'none'
+endif
+
+" If the user is sourcing this script directly then the plugin version isn't
+" known because the main plugin script didn't load. In the usual case where the
+" user still has the full Vim runtime installed, or has this full plugin
+" installed in a package or something, then we can extract the version from the
+" main plugin file at it's usual spot relative to this file. Otherwise the user
+" is assembling their runtime piecemeal and we have no idea what versions of
+" other files may be present so don't even try to make a guess or assume the
+" presence of other specific files with specific meaning.
+"
+" We don't want to actually source the main plugin file here because the user
+" may have a good reason not to (e.g. they define their own TOhtml command or
+" something).
+"
+" If this seems way too complicated and convoluted, it is. Probably I should
+" have put the version information in the autoload file from the start. But the
+" version has been in the global variable for so long that changing it could
+" break a lot of user scripts.
+if exists("g:loaded_2html_plugin")
+ let s:pluginversion = g:loaded_2html_plugin
+else
+ if !exists("g:unloaded_tohtml_plugin")
+ let s:main_plugin_path = expand("<sfile>:p:h:h")."/plugin/tohtml.vim"
+ if filereadable(s:main_plugin_path)
+ let s:lines = readfile(s:main_plugin_path, "", 20)
+ call filter(s:lines, 'v:val =~ "loaded_2html_plugin = "')
+ if empty(s:lines)
+ let g:unloaded_tohtml_plugin = "unknown"
+ else
+ let g:unloaded_tohtml_plugin = substitute(s:lines[0], '.*loaded_2html_plugin = \([''"]\)\(\%(\1\@!.\)\+\)\1', '\2', '')
+ endif
+ unlet s:lines
+ else
+ let g:unloaded_tohtml_plugin = "unknown"
+ endif
+ unlet s:main_plugin_path
+ endif
+ let s:pluginversion = g:unloaded_tohtml_plugin
+endif
+
+" Split window to create a buffer with the HTML file.
+let s:orgbufnr = winbufnr(0)
+let s:origwin_stl = &l:stl
+if expand("%") == ""
+ if exists('g:html_diff_win_num')
+ exec 'new Untitled_win'.g:html_diff_win_num.'.'.(s:settings.use_xhtml ? 'x' : '').'html'
+ else
+ exec 'new Untitled.'.(s:settings.use_xhtml ? 'x' : '').'html'
+ endif
+else
+ exec 'new %.'.(s:settings.use_xhtml ? 'x' : '').'html'
+endif
+
+" Resize the new window to very small in order to make it draw faster
+let s:old_winheight = winheight(0)
+let s:old_winfixheight = &l:winfixheight
+if s:old_winheight > 2
+ resize 1 " leave enough room to view one line at a time
+ norm! G
+ norm! zt
+endif
+setlocal winfixheight
+
+let s:newwin_stl = &l:stl
+
+" on the new window, set the least time-consuming fold method
+let s:old_fen = &foldenable
+setlocal foldmethod=manual
+setlocal nofoldenable
+
+let s:newwin = winnr()
+let s:orgwin = bufwinnr(s:orgbufnr)
+
+setlocal modifiable
+%d
+let s:old_paste = &paste
+set paste
+let s:old_magic = &magic
+set magic
+
+" set the fileencoding to match the charset we'll be using
+let &l:fileencoding=s:settings.vim_encoding
+
+" According to http://www.w3.org/TR/html4/charset.html#doc-char-set, the byte
+" order mark is highly recommend on the web when using multibyte encodings. But,
+" it is not a good idea to include it on UTF-8 files. Otherwise, let Vim
+" determine when it is actually inserted.
+if s:settings.vim_encoding == 'utf-8'
+ setlocal nobomb
+else
+ setlocal bomb
+endif
+
+let s:lines = []
+
+if s:settings.use_xhtml
+ if s:settings.encoding != ""
+ call add(s:lines, "<?xml version=\"1.0\" encoding=\"" . s:settings.encoding . "\"?>")
+ else
+ call add(s:lines, "<?xml version=\"1.0\"?>")
+ endif
+ let s:tag_close = ' />'
+else
+ let s:tag_close = '>'
+endif
+
+let s:HtmlSpace = ' '
+let s:LeadingSpace = ' '
+let s:HtmlEndline = ''
+if s:settings.no_pre
+ let s:HtmlEndline = '<br' . s:tag_close
+ let s:LeadingSpace = s:settings.use_xhtml ? '&#160;' : '&nbsp;'
+ let s:HtmlSpace = '\' . s:LeadingSpace
+endif
+
+" HTML header, with the title and generator ;-). Left free space for the CSS,
+" to be filled at the end.
+if !s:settings.no_doc
+ call extend(s:lines, [
+ \ "<html>",
+ \ "<head>"])
+ " include encoding as close to the top as possible, but only if not already
+ " contained in XML information (to avoid haggling over content type)
+ if s:settings.encoding != "" && !s:settings.use_xhtml
+ if s:html5
+ call add(s:lines, '<meta charset="' . s:settings.encoding . '"' . s:tag_close)
+ else
+ call add(s:lines, "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . s:settings.encoding . '"' . s:tag_close)
+ endif
+ endif
+ call extend(s:lines, [
+ \ ("<title>".expand("%:p:~")."</title>"),
+ \ ("<meta name=\"Generator\" content=\"Vim/".v:version/100.".".v:version%100.'"'.s:tag_close),
+ \ ("<meta name=\"plugin-version\" content=\"".s:pluginversion.'"'.s:tag_close)
+ \ ])
+ call add(s:lines, '<meta name="syntax" content="'.s:current_syntax.'"'.s:tag_close)
+ call add(s:lines, '<meta name="settings" content="'.
+ \ join(filter(keys(s:settings),'s:settings[v:val]'),',').
+ \ ',prevent_copy='.s:settings.prevent_copy.
+ \ ',use_input_for_pc='.s:settings.use_input_for_pc.
+ \ '"'.s:tag_close)
+ call add(s:lines, '<meta name="colorscheme" content="'.
+ \ (exists('g:colors_name')
+ \ ? g:colors_name
+ \ : 'none'). '"'.s:tag_close)
+
+ if s:settings.use_css
+ call extend(s:lines, [
+ \ "<style" . (s:html5 ? "" : " type=\"text/css\"") . ">",
+ \ s:settings.use_xhtml ? "" : "<!--"])
+ let s:ieonly = []
+ if s:settings.dynamic_folds
+ if s:settings.hover_unfold
+ " if we are doing hover_unfold, use css 2 with css 1 fallback for IE6
+ call extend(s:lines, [
+ \ ".FoldColumn { text-decoration: none; white-space: pre; }",
+ \ "",
+ \ "body * { margin: 0; padding: 0; }", "",
+ \ ".open-fold > span.Folded { display: none; }",
+ \ ".open-fold > .fulltext { display: inline; }",
+ \ ".closed-fold > .fulltext { display: none; }",
+ \ ".closed-fold > span.Folded { display: inline; }",
+ \ "",
+ \ ".open-fold > .toggle-open { display: none; }",
+ \ ".open-fold > .toggle-closed { display: inline; }",
+ \ ".closed-fold > .toggle-open { display: inline; }",
+ \ ".closed-fold > .toggle-closed { display: none; }",
+ \ "", "",
+ \ '/* opening a fold while hovering won''t be supported by IE6 and other',
+ \ "similar browsers, but it should fail gracefully. */",
+ \ ".closed-fold:hover > .fulltext { display: inline; }",
+ \ ".closed-fold:hover > .toggle-filler { display: none; }",
+ \ ".closed-fold:hover > .Folded { display: none; }"])
+ " TODO: IE6 is REALLY old and I can't even test it anymore. Maybe we
+ " should remove this? Leave it in for now, it was working at one point,
+ " and doesn't affect any modern browsers. Even newer IE versions should
+ " support the above code and ignore the following.
+ let s:ieonly = [
+ \ "<!--[if lt IE 7]><style type=\"text/css\">",
+ \ ".open-fold .fulltext { display: inline; }",
+ \ ".open-fold span.Folded { display: none; }",
+ \ ".open-fold .toggle-open { display: none; }",
+ \ ".open-fold .toggle-closed { display: inline; }",
+ \ "",
+ \ ".closed-fold .fulltext { display: none; }",
+ \ ".closed-fold span.Folded { display: inline; }",
+ \ ".closed-fold .toggle-open { display: inline; }",
+ \ ".closed-fold .toggle-closed { display: none; }",
+ \ "</style>",
+ \ "<![endif]-->",
+ \]
+ else
+ " if we aren't doing hover_unfold, use CSS 1 only
+ call extend(s:lines, [
+ \ ".FoldColumn { text-decoration: none; white-space: pre; }",
+ \ ".open-fold .fulltext { display: inline; }",
+ \ ".open-fold span.Folded { display: none; }",
+ \ ".open-fold .toggle-open { display: none; }",
+ \ ".open-fold .toggle-closed { display: inline; }",
+ \ "",
+ \ ".closed-fold .fulltext { display: none; }",
+ \ ".closed-fold span.Folded { display: inline; }",
+ \ ".closed-fold .toggle-open { display: inline; }",
+ \ ".closed-fold .toggle-closed { display: none; }",
+ \])
+ endif
+ endif
+ " else we aren't doing any dynamic folding, no need for any special rules
+
+ call extend(s:lines, [
+ \ s:settings.use_xhtml ? "" : '-->',
+ \ "</style>",
+ \])
+ call extend(s:lines, s:ieonly)
+ unlet s:ieonly
+ endif
+
+ let s:uses_script = s:settings.dynamic_folds || s:settings.line_ids
+
+ " insert script tag if needed
+ if s:uses_script
+ call extend(s:lines, [
+ \ "",
+ \ "<script" . (s:html5 ? "" : " type='text/javascript'") . ">",
+ \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
+ endif
+
+ " insert javascript to toggle folds open and closed
+ if s:settings.dynamic_folds
+ call extend(s:lines, [
+ \ "",
+ \ "function toggleFold(objID)",
+ \ "{",
+ \ " var fold;",
+ \ " fold = document.getElementById(objID);",
+ \ " if (fold.className == 'closed-fold')",
+ \ " {",
+ \ " fold.className = 'open-fold';",
+ \ " }",
+ \ " else if (fold.className == 'open-fold')",
+ \ " {",
+ \ " fold.className = 'closed-fold';",
+ \ " }",
+ \ "}"
+ \ ])
+ endif
+
+ if s:settings.line_ids
+ " insert javascript to get IDs from line numbers, and to open a fold before
+ " jumping to any lines contained therein
+ call extend(s:lines, [
+ \ "",
+ \ "/* function to open any folds containing a jumped-to line before jumping to it */",
+ \ "function JumpToLine()",
+ \ "{",
+ \ " var lineNum;",
+ \ " lineNum = window.location.hash;",
+ \ " lineNum = lineNum.substr(1); /* strip off '#' */",
+ \ "",
+ \ " if (lineNum.indexOf('L') == -1) {",
+ \ " lineNum = 'L'+lineNum;",
+ \ " }",
+ \ " var lineElem = document.getElementById(lineNum);"
+ \ ])
+
+ if s:settings.dynamic_folds
+ call extend(s:lines, [
+ \ "",
+ \ " /* navigate upwards in the DOM tree to open all folds containing the line */",
+ \ " var node = lineElem;",
+ \ " while (node && node.id != 'vimCodeElement".s:settings.id_suffix."')",
+ \ " {",
+ \ " if (node.className == 'closed-fold')",
+ \ " {",
+ \ " node.className = 'open-fold';",
+ \ " }",
+ \ " node = node.parentNode;",
+ \ " }",
+ \ ])
+ endif
+ call extend(s:lines, [
+ \ " /* Always jump to new location even if the line was hidden inside a fold, or",
+ \ " * we corrected the raw number to a line ID.",
+ \ " */",
+ \ " if (lineElem) {",
+ \ " lineElem.scrollIntoView(true);",
+ \ " }",
+ \ " return true;",
+ \ "}",
+ \ "if ('onhashchange' in window) {",
+ \ " window.onhashchange = JumpToLine;",
+ \ "}"
+ \ ])
+ endif
+
+ " insert script closing tag if needed
+ if s:uses_script
+ call extend(s:lines, [
+ \ '',
+ \ s:settings.use_xhtml ? '//]]>' : '-->',
+ \ "</script>"
+ \ ])
+ endif
+
+ call extend(s:lines, ["</head>",
+ \ "<body".(s:settings.line_ids ? " onload='JumpToLine();'" : "").">"])
+endif
+
+if s:settings.no_pre
+ " if we're not using CSS we use a font tag which can't have a div inside
+ if s:settings.use_css
+ call extend(s:lines, ["<div id='vimCodeElement" .. s:settings.id_suffix .. "'>"])
+ endif
+else
+ call extend(s:lines, ["<pre id='vimCodeElement" .. s:settings.id_suffix .. "'>"])
+endif
+
+exe s:orgwin . "wincmd w"
+
+" caches of style data
+" initialize to include line numbers if using them
+if s:settings.number_lines
+ let s:stylelist = { s:LINENR_ID : ".LineNr { " . s:CSS1( s:LINENR_ID ) . "}" }
+else
+ let s:stylelist = {}
+endif
+let s:diffstylelist = {
+ \ s:DIFF_A_ID : ".DiffAdd { " . s:CSS1( s:DIFF_A_ID ) . "}",
+ \ s:DIFF_C_ID : ".DiffChange { " . s:CSS1( s:DIFF_C_ID ) . "}",
+ \ s:DIFF_D_ID : ".DiffDelete { " . s:CSS1( s:DIFF_D_ID ) . "}",
+ \ s:DIFF_T_ID : ".DiffText { " . s:CSS1( s:DIFF_T_ID ) . "}"
+ \ }
+
+" set up progress bar in the status line
+if !s:settings.no_progress
+ " ProgressBar Indicator
+ let s:progressbar={}
+
+ " Progressbar specific functions
+
+ func! s:SetProgbarColor()
+ if hlID("TOhtmlProgress") != 0
+ hi! link TOhtmlProgress_auto TOhtmlProgress
+ elseif hlID("TOhtmlProgress_auto")==0 ||
+ \ !exists("s:last_colors_name") || !exists("g:colors_name") ||
+ \ g:colors_name != s:last_colors_name
+ let s:last_colors_name = exists("g:colors_name") ? g:colors_name : "none"
+
+ let l:diffatr = synIDattr(hlID("DiffDelete"), "reverse", s:whatterm) ? "fg#" : "bg#"
+ let l:stlatr = synIDattr(hlID("StatusLine"), "reverse", s:whatterm) ? "fg#" : "bg#"
+
+ let l:progbar_color = synIDattr(hlID("DiffDelete"), l:diffatr, s:whatterm)
+ let l:stl_color = synIDattr(hlID("StatusLine"), l:stlatr, s:whatterm)
+
+ if "" == l:progbar_color
+ let l:progbar_color = synIDattr(hlID("DiffDelete"), "reverse", s:whatterm) ? s:fgc : s:bgc
+ endif
+ if "" == l:stl_color
+ let l:stl_color = synIDattr(hlID("StatusLine"), "reverse", s:whatterm) ? s:fgc : s:bgc
+ endif
+
+ if l:progbar_color == l:stl_color
+ if s:whatterm == 'cterm'
+ if l:progbar_color >= (&t_Co/2)
+ let l:progbar_color-=1
+ else
+ let l:progbar_color+=1
+ endif
+ else
+ let l:rgb = map(matchlist(l:progbar_color, '#\zs\x\x\ze\(\x\x\)\(\x\x\)')[:2], 'str2nr(v:val, 16)')
+ let l:avg = (l:rgb[0] + l:rgb[1] + l:rgb[2])/3
+ if l:avg >= 128
+ let l:avg_new = l:avg
+ while l:avg - l:avg_new < 0x15
+ let l:rgb = map(l:rgb, 'v:val * 3 / 4')
+ let l:avg_new = (l:rgb[0] + l:rgb[1] + l:rgb[2])/3
+ endwhile
+ else
+ let l:avg_new = l:avg
+ while l:avg_new - l:avg < 0x15
+ let l:rgb = map(l:rgb, 'min([max([v:val, 4]) * 5 / 4, 255])')
+ let l:avg_new = (l:rgb[0] + l:rgb[1] + l:rgb[2])/3
+ endwhile
+ endif
+ let l:progbar_color = printf("#%02x%02x%02x", l:rgb[0], l:rgb[1], l:rgb[2])
+ endif
+ echomsg "diff detected progbar color set to" l:progbar_color
+ endif
+ exe "hi TOhtmlProgress_auto" s:whatterm."bg=".l:progbar_color
+ endif
+ endfun
+
+ func! s:ProgressBar(title, max_value, winnr)
+ let pgb=copy(s:progressbar)
+ let pgb.title = a:title.' '
+ let pgb.max_value = a:max_value
+ let pgb.winnr = a:winnr
+ let pgb.cur_value = 0
+
+ let pgb.items = { 'title' : { 'color' : 'Statusline' },
+ \'bar' : { 'color' : 'Statusline' , 'fillcolor' : 'TOhtmlProgress_auto' , 'bg' : 'Statusline' } ,
+ \'counter' : { 'color' : 'Statusline' } }
+ let pgb.last_value = 0
+ let pgb.needs_redraw = 0
+ " Note that you must use len(split) instead of len() if you want to use
+ " unicode in title.
+ "
+ " Subtract 3 for spacing around the title.
+ " Subtract 4 for the percentage display.
+ " Subtract 2 for spacing before this.
+ " Subtract 2 more for the '|' on either side of the progress bar
+ let pgb.subtractedlen=len(split(pgb.title, '\zs'))+3+4+2+2
+ let pgb.max_len = 0
+ set laststatus=2
+ return pgb
+ endfun
+
+ " Function: progressbar.calculate_ticks() {{{1
+ func! s:progressbar.calculate_ticks(pb_len)
+ if a:pb_len<=0
+ let pb_len = 100
+ else
+ let pb_len = a:pb_len
+ endif
+ let self.progress_ticks = map(range(pb_len+1), "v:val * self.max_value / pb_len")
+ endfun
+
+ "Function: progressbar.paint()
+ func! s:progressbar.paint()
+ " Recalculate widths.
+ let max_len = winwidth(self.winnr)
+ let pb_len = 0
+ " always true on first call because of initial value of self.max_len
+ if max_len != self.max_len
+ let self.max_len = max_len
+
+ " Progressbar length
+ let pb_len = max_len - self.subtractedlen
+
+ call self.calculate_ticks(pb_len)
+
+ let self.needs_redraw = 1
+ let cur_value = 0
+ let self.pb_len = pb_len
+ else
+ " start searching at the last found index to make the search for the
+ " appropriate tick value normally take 0 or 1 comparisons
+ let cur_value = self.last_value
+ let pb_len = self.pb_len
+ endif
+
+ let cur_val_max = pb_len > 0 ? pb_len : 100
+
+ " find the current progress bar position based on precalculated thresholds
+ while cur_value < cur_val_max && self.cur_value > self.progress_ticks[cur_value]
+ let cur_value += 1
+ endwhile
+
+ " update progress bar
+ if self.last_value != cur_value || self.needs_redraw || self.cur_value == self.max_value
+ let self.needs_redraw = 1
+ let self.last_value = cur_value
+
+ let t_color = self.items.title.color
+ let b_fcolor = self.items.bar.fillcolor
+ let b_color = self.items.bar.color
+ let c_color = self.items.counter.color
+
+ let stl = "%#".t_color."#%-( ".self.title." %)".
+ \"%#".b_color."#".
+ \(pb_len>0 ?
+ \ ('|%#'.b_fcolor."#%-(".repeat(" ",cur_value)."%)".
+ \ '%#'.b_color."#".repeat(" ",pb_len-cur_value)."|"):
+ \ ('')).
+ \"%=%#".c_color."#%( ".printf("%3.d ",100*self.cur_value/self.max_value)."%% %)"
+ call setwinvar(self.winnr, '&stl', stl)
+ endif
+ endfun
+
+ func! s:progressbar.incr( ... )
+ let self.cur_value += (a:0 ? a:1 : 1)
+ " if we were making a general-purpose progress bar, we'd need to limit to a
+ " lower limit as well, but since we always increment with a positive value
+ " in this script, we only need limit the upper value
+ let self.cur_value = (self.cur_value > self.max_value ? self.max_value : self.cur_value)
+ call self.paint()
+ endfun
+ " }}}
+ if s:settings.dynamic_folds
+ " to process folds we make two passes through each line
+ let s:pgb = s:ProgressBar("Processing folds:", line('$')*2, s:orgwin)
+ endif
+
+ call s:SetProgbarColor()
+endif
+
+" First do some preprocessing for dynamic folding. Do this for the entire file
+" so we don't accidentally start within a closed fold or something.
+let s:allfolds = []
+
+if s:settings.dynamic_folds
+ let s:lnum = 1
+ let s:end = line('$')
+ " save the fold text and set it to the default so we can find fold levels
+ let s:foldtext_save = &foldtext
+ setlocal foldtext&
+
+ " we will set the foldcolumn in the html to the greater of the maximum fold
+ " level and the current foldcolumn setting
+ let s:foldcolumn = &foldcolumn
+
+ " get all info needed to describe currently closed folds
+ while s:lnum <= s:end
+ if foldclosed(s:lnum) == s:lnum
+ " default fold text has '+-' and then a number of dashes equal to fold
+ " level, so subtract 2 from index of first non-dash after the dashes
+ " in order to get the fold level of the current fold
+ let s:level = match(foldtextresult(s:lnum), '+-*\zs[^-]') - 2
+ " store fold info for later use
+ let s:newfold = {'firstline': s:lnum, 'lastline': foldclosedend(s:lnum), 'level': s:level,'type': "closed-fold"}
+ call add(s:allfolds, s:newfold)
+ " open the fold so we can find any contained folds
+ execute s:lnum."foldopen"
+ else
+ if !s:settings.no_progress
+ call s:pgb.incr()
+ if s:pgb.needs_redraw
+ redrawstatus
+ let s:pgb.needs_redraw = 0
+ endif
+ endif
+ let s:lnum = s:lnum + 1
+ endif
+ endwhile
+
+ " close all folds to get info for originally open folds
+ silent! %foldclose!
+ let s:lnum = 1
+
+ " the originally open folds will be all folds we encounter that aren't
+ " already in the list of closed folds
+ while s:lnum <= s:end
+ if foldclosed(s:lnum) == s:lnum
+ " default fold text has '+-' and then a number of dashes equal to fold
+ " level, so subtract 2 from index of first non-dash after the dashes
+ " in order to get the fold level of the current fold
+ let s:level = match(foldtextresult(s:lnum), '+-*\zs[^-]') - 2
+ let s:newfold = {'firstline': s:lnum, 'lastline': foldclosedend(s:lnum), 'level': s:level,'type': "closed-fold"}
+ " only add the fold if we don't already have it
+ if empty(s:allfolds) || index(s:allfolds, s:newfold) == -1
+ let s:newfold.type = "open-fold"
+ call add(s:allfolds, s:newfold)
+ endif
+ " open the fold so we can find any contained folds
+ execute s:lnum."foldopen"
+ else
+ if !s:settings.no_progress
+ call s:pgb.incr()
+ if s:pgb.needs_redraw
+ redrawstatus
+ let s:pgb.needs_redraw = 0
+ endif
+ endif
+ let s:lnum = s:lnum + 1
+ endif
+ endwhile
+
+ " sort the folds so that we only ever need to look at the first item in the
+ " list of folds
+ call sort(s:allfolds, "s:FoldCompare")
+
+ let &l:foldtext = s:foldtext_save
+ unlet s:foldtext_save
+
+ " close all folds again so we can get the fold text as we go
+ silent! %foldclose!
+
+ " Go through and remove folds we don't need to (or cannot) process in the
+ " current conversion range
+ "
+ " If a fold is removed which contains other folds, which are included, we need
+ " to adjust the level of the included folds as used by the conversion logic
+ " (avoiding special cases is good)
+ "
+ " Note any time we remove a fold, either all of the included folds are in it,
+ " or none of them, because we only remove a fold if neither its start nor its
+ " end are within the conversion range.
+ let leveladjust = 0
+ for afold in s:allfolds
+ let removed = 0
+ if exists("g:html_start_line") && exists("g:html_end_line")
+ if afold.firstline < g:html_start_line
+ if afold.lastline <= g:html_end_line && afold.lastline >= g:html_start_line
+ " if a fold starts before the range to convert but stops within the
+ " range, we need to include it. Make it start on the first converted
+ " line.
+ let afold.firstline = g:html_start_line
+ else
+ " if the fold lies outside the range or the start and stop enclose
+ " the entire range, don't bother parsing it
+ call remove(s:allfolds, index(s:allfolds, afold))
+ let removed = 1
+ if afold.lastline > g:html_end_line
+ let leveladjust += 1
+ endif
+ endif
+ elseif afold.firstline > g:html_end_line
+ " If the entire fold lies outside the range we need to remove it.
+ call remove(s:allfolds, index(s:allfolds, afold))
+ let removed = 1
+ endif
+ elseif exists("g:html_start_line")
+ if afold.firstline < g:html_start_line
+ " if there is no last line, but there is a first line, the end of the
+ " fold will always lie within the region of interest, so keep it
+ let afold.firstline = g:html_start_line
+ endif
+ elseif exists("g:html_end_line")
+ " if there is no first line we default to the first line in the buffer so
+ " the fold start will always be included if the fold itself is included.
+ " If however the entire fold lies outside the range we need to remove it.
+ if afold.firstline > g:html_end_line
+ call remove(s:allfolds, index(s:allfolds, afold))
+ let removed = 1
+ endif
+ endif
+ if !removed
+ let afold.level -= leveladjust
+ if afold.level+1 > s:foldcolumn
+ let s:foldcolumn = afold.level+1
+ endif
+ endif
+ endfor
+
+ " if we've removed folds containing the conversion range from processing,
+ " getting foldtext as we go won't know to open the removed folds, so the
+ " foldtext would be wrong; open them now.
+ "
+ " Note that only when a start and an end line is specified will a fold
+ " containing the current range ever be removed.
+ while leveladjust > 0
+ exe g:html_start_line."foldopen"
+ let leveladjust -= 1
+ endwhile
+endif
+
+" Now loop over all lines in the original text to convert to html.
+" Use html_start_line and html_end_line if they are set.
+if exists("g:html_start_line")
+ let s:lnum = html_start_line
+ if s:lnum < 1 || s:lnum > line("$")
+ let s:lnum = 1
+ endif
+else
+ let s:lnum = 1
+endif
+if exists("g:html_end_line")
+ let s:end = html_end_line
+ if s:end < s:lnum || s:end > line("$")
+ let s:end = line("$")
+ endif
+else
+ let s:end = line("$")
+endif
+
+" stack to keep track of all the folds containing the current line
+let s:foldstack = []
+
+if !s:settings.no_progress
+ let s:pgb = s:ProgressBar("Processing lines:", s:end - s:lnum + 1, s:orgwin)
+endif
+
+if s:settings.number_lines
+ let s:margin = strlen(s:end) + 1
+else
+ let s:margin = 0
+endif
+
+if has('folding') && !s:settings.ignore_folding
+ let s:foldfillchar = &fillchars[matchend(&fillchars, 'fold:')]
+ if s:foldfillchar == ''
+ let s:foldfillchar = '-'
+ endif
+endif
+let s:difffillchar = &fillchars[matchend(&fillchars, 'diff:')]
+if s:difffillchar == ''
+ let s:difffillchar = '-'
+endif
+
+let s:foldId = 0
+
+if !s:settings.expand_tabs
+ " If keeping tabs, add them to printable characters so we keep them when
+ " formatting text (strtrans() doesn't replace printable chars)
+ let s:old_isprint = &isprint
+ setlocal isprint+=9
+endif
+
+while s:lnum <= s:end
+
+ " If there are filler lines for diff mode, show these above the line.
+ let s:filler = diff_filler(s:lnum)
+ if s:filler > 0
+ let s:n = s:filler
+ while s:n > 0
+ let s:new = repeat(s:difffillchar, 3)
+
+ if s:n > 2 && s:n < s:filler && !s:settings.whole_filler
+ let s:new = s:new . " " . s:filler . " inserted lines "
+ let s:n = 2
+ endif
+
+ if !s:settings.no_pre
+ " HTML line wrapping is off--go ahead and fill to the margin
+ " TODO: what about when CSS wrapping is turned on?
+ let s:new = s:new . repeat(s:difffillchar, &columns - strlen(s:new) - s:margin)
+ else
+ let s:new = s:new . repeat(s:difffillchar, 3)
+ endif
+
+ let s:new = s:HtmlFormat_d(s:new, s:DIFF_D_ID, 0)
+ if s:settings.number_lines
+ " Indent if line numbering is on. Indent gets style of line number
+ " column.
+ let s:new = s:HtmlFormat_n(repeat(' ', s:margin), s:LINENR_ID, 0, 0) . s:new
+ endif
+ if s:settings.dynamic_folds && !s:settings.no_foldcolumn && s:foldcolumn > 0
+ " Indent for foldcolumn if there is one. Assume it's empty, there should
+ " not be a fold for deleted lines in diff mode.
+ let s:new = s:FoldColumn_fill() . s:new
+ endif
+ call add(s:lines, s:new.s:HtmlEndline)
+
+ let s:n = s:n - 1
+ endwhile
+ unlet s:n
+ endif
+ unlet s:filler
+
+ " Start the line with the line number.
+ if s:settings.number_lines
+ let s:numcol = repeat(' ', s:margin - 1 - strlen(s:lnum)) . s:lnum . ' '
+ endif
+
+ let s:new = ""
+
+ if has('folding') && !s:settings.ignore_folding && foldclosed(s:lnum) > -1 && !s:settings.dynamic_folds
+ "
+ " This is the beginning of a folded block (with no dynamic folding)
+ let s:new = foldtextresult(s:lnum)
+ if !s:settings.no_pre
+ " HTML line wrapping is off--go ahead and fill to the margin
+ let s:new = s:new . repeat(s:foldfillchar, &columns - strlen(s:new))
+ endif
+
+ " put numcol in a separate group for sake of unselectable text
+ let s:new = (s:settings.number_lines ? s:HtmlFormat_n(s:numcol, s:FOLDED_ID, 0, s:lnum): "") . s:HtmlFormat_t(s:new, s:FOLDED_ID, 0)
+
+ " Skip to the end of the fold
+ let s:new_lnum = foldclosedend(s:lnum)
+
+ if !s:settings.no_progress
+ call s:pgb.incr(s:new_lnum - s:lnum)
+ endif
+
+ let s:lnum = s:new_lnum
+
+ else
+ "
+ " A line that is not folded, or doing dynamic folding.
+ "
+ let s:line = getline(s:lnum)
+ let s:len = strlen(s:line)
+
+ if s:settings.dynamic_folds
+ " First insert a closing for any open folds that end on this line
+ while !empty(s:foldstack) && get(s:foldstack,0).lastline == s:lnum-1
+ let s:new = s:new."</span></span>"
+ call remove(s:foldstack, 0)
+ endwhile
+
+ " Now insert an opening for any new folds that start on this line
+ let s:firstfold = 1
+ while !empty(s:allfolds) && get(s:allfolds,0).firstline == s:lnum
+ let s:foldId = s:foldId + 1
+ let s:new .= "<span id='"
+ let s:new .= (exists('g:html_diff_win_num') ? "win".g:html_diff_win_num : "")
+ let s:new .= "fold".s:foldId.s:settings.id_suffix."' class='".s:allfolds[0].type."'>"
+
+
+ " Unless disabled, add a fold column for the opening line of a fold.
+ "
+ " Note that dynamic folds require using css so we just use css to take
+ " care of the leading spaces rather than using &nbsp; in the case of
+ " html_no_pre to make it easier
+ if !s:settings.no_foldcolumn
+ " add fold column that can open the new fold
+ if s:allfolds[0].level > 1 && s:firstfold
+ let s:new = s:new . s:FoldColumn_build('|', s:allfolds[0].level - 1, 0, "",
+ \ 'toggle-open FoldColumn','javascript:toggleFold("fold'.s:foldstack[0].id.s:settings.id_suffix.'");')
+ endif
+ " add the filler spaces separately from the '+' char so that it can be
+ " shown/hidden separately during a hover unfold
+ let s:new = s:new . s:FoldColumn_build("+", 1, 0, "",
+ \ 'toggle-open FoldColumn', 'javascript:toggleFold("fold'.s:foldId.s:settings.id_suffix.'");')
+ " If this is not the last fold we're opening on this line, we need
+ " to keep the filler spaces hidden if the fold is opened by mouse
+ " hover. If it is the last fold to open in the line, we shouldn't hide
+ " them, so don't apply the toggle-filler class.
+ let s:new = s:new . s:FoldColumn_build(" ", 1, s:foldcolumn - s:allfolds[0].level - 1, "",
+ \ 'toggle-open FoldColumn'. (get(s:allfolds, 1, {'firstline': 0}).firstline == s:lnum ?" toggle-filler" :""),
+ \ 'javascript:toggleFold("fold'.s:foldId.s:settings.id_suffix.'");')
+
+ " add fold column that can close the new fold
+ " only add extra blank space if we aren't opening another fold on the
+ " same line
+ if get(s:allfolds, 1, {'firstline': 0}).firstline != s:lnum
+ let s:extra_space = s:foldcolumn - s:allfolds[0].level
+ else
+ let s:extra_space = 0
+ endif
+ if s:firstfold
+ " the first fold in a line has '|' characters from folds opened in
+ " previous lines, before the '-' for this fold
+ let s:new .= s:FoldColumn_build('|', s:allfolds[0].level - 1, s:extra_space, '-',
+ \ 'toggle-closed FoldColumn', 'javascript:toggleFold("fold'.s:foldId.s:settings.id_suffix.'");')
+ else
+ " any subsequent folds in the line only add a single '-'
+ let s:new = s:new . s:FoldColumn_build("-", 1, s:extra_space, "",
+ \ 'toggle-closed FoldColumn', 'javascript:toggleFold("fold'.s:foldId.s:settings.id_suffix.'");')
+ endif
+ let s:firstfold = 0
+ endif
+
+ " Add fold text, moving the span ending to the next line so collapsing
+ " of folds works correctly.
+ " Put numcol in a separate group for sake of unselectable text.
+ let s:new = s:new . (s:settings.number_lines ? s:HtmlFormat_n(s:numcol, s:FOLDED_ID, 0, 0) : "") . substitute(s:HtmlFormat_t(foldtextresult(s:lnum), s:FOLDED_ID, 0), '</span>', s:HtmlEndline.'\n\0', '')
+ let s:new = s:new . "<span class='fulltext'>"
+
+ " open the fold now that we have the fold text to allow retrieval of
+ " fold text for subsequent folds
+ execute s:lnum."foldopen"
+ call insert(s:foldstack, remove(s:allfolds,0))
+ let s:foldstack[0].id = s:foldId
+ endwhile
+
+ " Unless disabled, add a fold column for other lines.
+ "
+ " Note that dynamic folds require using css so we just use css to take
+ " care of the leading spaces rather than using &nbsp; in the case of
+ " html_no_pre to make it easier
+ if !s:settings.no_foldcolumn
+ if empty(s:foldstack)
+ " add the empty foldcolumn for unfolded lines if there is a fold
+ " column at all
+ if s:foldcolumn > 0
+ let s:new = s:new . s:FoldColumn_fill()
+ endif
+ else
+ " add the fold column for folds not on the opening line
+ if get(s:foldstack, 0).firstline < s:lnum
+ let s:new = s:new . s:FoldColumn_build('|', s:foldstack[0].level, s:foldcolumn - s:foldstack[0].level, "",
+ \ 'FoldColumn', 'javascript:toggleFold("fold'.s:foldstack[0].id.s:settings.id_suffix.'");')
+ endif
+ endif
+ endif
+ endif
+
+ " Now continue with the unfolded line text
+ if s:settings.number_lines
+ let s:new = s:new . s:HtmlFormat_n(s:numcol, s:LINENR_ID, 0, s:lnum)
+ elseif s:settings.line_ids
+ let s:new = s:new . s:HtmlFormat_n("", s:LINENR_ID, 0, s:lnum)
+ endif
+
+ " Get the diff attribute, if any.
+ let s:diffattr = diff_hlID(s:lnum, 1)
+
+ " initialize conceal info to act like not concealed, just in case
+ let s:concealinfo = [0, '']
+
+ " Loop over each character in the line
+ let s:col = 1
+
+ " most of the time we won't use the diff_id, initialize to zero
+ let s:diff_id = 0
+
+ while s:col <= s:len || (s:col == 1 && s:diffattr)
+ let s:startcol = s:col " The start column for processing text
+ if !s:settings.ignore_conceal && has('conceal')
+ let s:concealinfo = synconcealed(s:lnum, s:col)
+ endif
+ if !s:settings.ignore_conceal && s:concealinfo[0]
+ let s:col = s:col + 1
+ " Speed loop (it's small - that's the trick)
+ " Go along till we find a change in the match sequence number (ending
+ " the specific concealed region) or until there are no more concealed
+ " characters.
+ while s:col <= s:len && s:concealinfo == synconcealed(s:lnum, s:col) | let s:col = s:col + 1 | endwhile
+ elseif s:diffattr
+ let s:diff_id = diff_hlID(s:lnum, s:col)
+ let s:id = synID(s:lnum, s:col, 1)
+ let s:col = s:col + 1
+ " Speed loop (it's small - that's the trick)
+ " Go along till we find a change in hlID
+ while s:col <= s:len && s:id == synID(s:lnum, s:col, 1)
+ \ && s:diff_id == diff_hlID(s:lnum, s:col) |
+ \ let s:col = s:col + 1 |
+ \ endwhile
+ if s:len < &columns && !s:settings.no_pre
+ " Add spaces at the end of the raw text line to extend the changed
+ " line to the full width.
+ let s:line = s:line . repeat(' ', &columns - virtcol([s:lnum, s:len]) - s:margin)
+ let s:len = &columns
+ endif
+ else
+ let s:id = synID(s:lnum, s:col, 1)
+ let s:col = s:col + 1
+ " Speed loop (it's small - that's the trick)
+ " Go along till we find a change in synID
+ while s:col <= s:len && s:id == synID(s:lnum, s:col, 1) | let s:col = s:col + 1 | endwhile
+ endif
+
+ if s:settings.ignore_conceal || !s:concealinfo[0]
+ " Expand tabs if needed
+ let s:expandedtab = strpart(s:line, s:startcol - 1, s:col - s:startcol)
+ if s:settings.expand_tabs
+ let s:offset = 0
+ let s:idx = stridx(s:expandedtab, "\t")
+ let s:tablist = split(&vts,',')
+ if empty(s:tablist)
+ let s:tablist = [ &ts ]
+ endif
+ let s:tabidx = 0
+ let s:tabwidth = 0
+ while s:idx >= 0
+ if s:startcol + s:idx == 1
+ let s:i = s:tablist[0]
+ else
+ " Get the character, which could be multiple bytes, which falls
+ " immediately before the found tab. Extract it by matching a
+ " character just prior to the column where the tab matches.
+ " We'll use this to get the byte index of the character
+ " immediately preceding the tab, so we can then look up the
+ " virtual column that character appears in, to determine how
+ " much of the current tabstop has been used up.
+ if s:idx == 0
+ " if the found tab is the first character in the text being
+ " processed, we need to get the character prior to the text,
+ " given by startcol.
+ let s:prevc = matchstr(s:line, '.\%' . (s:startcol + s:offset) . 'c')
+ else
+ " Otherwise, the byte index of the tab into s:expandedtab is
+ " given by s:idx.
+ let s:prevc = matchstr(s:expandedtab, '.\%' . (s:idx + 1) . 'c')
+ endif
+ let s:vcol = virtcol([s:lnum, s:startcol + s:idx + s:offset - len(s:prevc)])
+
+ " find the tabstop interval to use for the tab we just found. Keep
+ " adding tabstops (which could be variable) until we would exceed
+ " the virtual screen position of the start of the found tab.
+ while s:vcol >= s:tabwidth + s:tablist[s:tabidx]
+ let s:tabwidth += s:tablist[s:tabidx]
+ if s:tabidx < len(s:tablist)-1
+ let s:tabidx = s:tabidx+1
+ endif
+ endwhile
+ let s:i = s:tablist[s:tabidx] - (s:vcol - s:tabwidth)
+ endif
+ " update offset to keep the index within the line corresponding to
+ " actual tab characters instead of replaced spaces; s:idx reflects
+ " replaced spaces in s:expandedtab, s:offset cancels out all but
+ " the tab character itself.
+ let s:offset -= s:i - 1
+ let s:expandedtab = substitute(s:expandedtab, '\t', repeat(' ', s:i), '')
+ let s:idx = stridx(s:expandedtab, "\t")
+ endwhile
+ end
+
+ " get the highlight group name to use
+ let s:id = synIDtrans(s:id)
+ else
+ " use Conceal highlighting for concealed text
+ let s:id = s:CONCEAL_ID
+ let s:expandedtab = s:concealinfo[1]
+ endif
+
+ " Output the text with the same synID, with class set to the highlight ID
+ " name, unless it has been concealed completely.
+ if strlen(s:expandedtab) > 0
+ let s:new = s:new . s:HtmlFormat(s:expandedtab, s:id, s:diff_id, "", 0)
+ endif
+ endwhile
+ endif
+
+ call extend(s:lines, split(s:new.s:HtmlEndline, '\n', 1))
+ if !s:settings.no_progress && s:pgb.needs_redraw
+ redrawstatus
+ let s:pgb.needs_redraw = 0
+ endif
+ let s:lnum = s:lnum + 1
+
+ if !s:settings.no_progress
+ call s:pgb.incr()
+ endif
+endwhile
+
+if s:settings.dynamic_folds
+ " finish off any open folds
+ while !empty(s:foldstack)
+ let s:lines[-1].="</span></span>"
+ call remove(s:foldstack, 0)
+ endwhile
+
+ " add fold column to the style list if not already there
+ let s:id = s:FOLD_C_ID
+ if !has_key(s:stylelist, s:id)
+ let s:stylelist[s:id] = '.FoldColumn { ' . s:CSS1(s:id) . '}'
+ endif
+endif
+
+if s:settings.no_pre
+ if !s:settings.use_css
+ " Close off the font tag that encapsulates the whole <body>
+ call extend(s:lines, ["</font>"])
+ else
+ call extend(s:lines, ["</div>"])
+ endif
+else
+ call extend(s:lines, ["</pre>"])
+endif
+if !s:settings.no_doc
+ call extend(s:lines, ["</body>", "</html>"])
+endif
+
+exe s:newwin . "wincmd w"
+call setline(1, s:lines)
+unlet s:lines
+
+" Mangle modelines so Vim doesn't try to use HTML text as a modeline if editing
+" this file in the future; need to do this after generating all the text in case
+" the modeline text has different highlight groups which all turn out to be
+" stripped from the final output.
+%s!\v(%(^|\s+)%([Vv]i%(m%([<=>]?\d+)?)?|ex)):!\1\&#0058;!ge
+
+" The generated HTML is admittedly ugly and takes a LONG time to fold.
+" Make sure the user doesn't do syntax folding when loading a generated file,
+" using a modeline.
+if !s:settings.no_modeline
+ call append(line('$'), "<!-- vim: set foldmethod=manual : -->")
+endif
+
+" Now, when we finally know which, we define the colors and styles
+if s:settings.use_css && !s:settings.no_doc
+ 1;/<style\>/+1
+
+ " Normal/global attributes
+ if s:settings.no_pre
+ call append('.', "body { color: " . s:fgc . "; background-color: " . s:bgc . "; font-family: ". s:htmlfont ."; }")
+ +
+ else
+ call append('.', "pre { " . s:whitespace . "font-family: ". s:htmlfont ."; color: " . s:fgc . "; background-color: " . s:bgc . "; }")
+ +
+ yank
+ put
+ execute "normal! ^cwbody\e"
+ " body should not have the wrap formatting, only the pre section
+ if s:whitespace != ''
+ exec 's#'.s:whitespace
+ endif
+ endif
+ " fix browser inconsistencies (sometimes within the same browser) of different
+ " default font size for different elements
+ call append('.', '* { font-size: 1em; }')
+ +
+ " if we use any input elements for unselectable content, make sure they look
+ " like normal text
+ if !empty(s:settings.prevent_copy)
+ if s:settings.use_input_for_pc !=# "none"
+ call append('.', 'input { border: none; margin: 0; padding: 0; font-family: '.s:htmlfont.'; }')
+ +
+ " ch units for browsers which support them, em units for a somewhat
+ " reasonable fallback.
+ for w in range(1, 20, 1)
+ call append('.', [
+ \ "input[size='".w."'] { width: ".w."em; width: ".w."ch; }"
+ \ ])
+ +
+ endfor
+ endif
+
+ if s:settings.use_input_for_pc !=# 'all'
+ let s:unselectable_styles = []
+ if s:settings.prevent_copy =~# 'f'
+ call add(s:unselectable_styles, 'FoldColumn')
+ endif
+ if s:settings.prevent_copy =~# 'n'
+ call add(s:unselectable_styles, 'LineNr')
+ endif
+ if s:settings.prevent_copy =~# 't' && !s:settings.ignore_folding
+ call add(s:unselectable_styles, 'Folded')
+ endif
+ if s:settings.prevent_copy =~# 'd'
+ call add(s:unselectable_styles, 'DiffDelete')
+ endif
+ if s:settings.use_input_for_pc !=# 'none'
+ call append('.', [
+ \ '/* Note: IE does not support @supports conditionals, but also does not fully support',
+ \ ' "content:" with custom content, so we *want* the check to fail */',
+ \ '@supports ( content: attr(data-custom-content) ) {'
+ \ ])
+ +3
+ endif
+ " The line number column inside the foldtext is styled just like the fold
+ " text in Vim, but it should use the prevent_copy settings of line number
+ " rather than fold text. Apply the prevent_copy styles to foldtext
+ " specifically for line numbers, which always come after the fold column,
+ " or at the beginning of the line.
+ if s:settings.prevent_copy =~# 'n' && !s:settings.ignore_folding
+ call append('.', [
+ \ ' .FoldColumn + .Folded, .Folded:first-child { user-select: none; }',
+ \ ' .FoldColumn + [data-Folded-content]::before, [data-Folded-content]:first-child::before { content: attr(data-Folded-content); }',
+ \ ' .FoldColumn + [data-Folded-content]::before, [data-Folded-content]:first-child::before { padding-bottom: 1px; display: inline-block; /* match the 1-px padding of standard items with background */ }',
+ \ ' .FoldColumn + span[data-Folded-content]::before, [data-Folded-content]:first-child::before { cursor: default; }',
+ \ ])
+ +4
+ endif
+ for s:style_name in s:unselectable_styles
+ call append('.', [
+ \ ' .'.s:style_name.' { user-select: none; }',
+ \ ' [data-'.s:style_name.'-content]::before { content: attr(data-'.s:style_name.'-content); }',
+ \ ' [data-'.s:style_name.'-content]::before { padding-bottom: 1px; display: inline-block; /* match the 1-px padding of standard items with background */ }',
+ \ ' span[data-'.s:style_name.'-content]::before { cursor: default; }',
+ \ ])
+ +4
+ endfor
+ if s:settings.use_input_for_pc !=# 'none'
+ call append('.', [
+ \ ' input { display: none; }',
+ \ '}'
+ \ ])
+ +2
+ endif
+ unlet s:unselectable_styles
+ endif
+
+ " Fix mouse cursor shape for the fallback <input> method of uncopyable text
+ if s:settings.use_input_for_pc !=# 'none'
+ if s:settings.prevent_copy =~# 'f'
+ " Make the cursor show active fold columns as active areas, and empty fold
+ " columns as not interactive.
+ call append('.', ['input.FoldColumn { cursor: pointer; }',
+ \ 'input.FoldColumn[value="'.repeat(' ', s:foldcolumn).'"] { cursor: default; }'
+ \ ])
+ +2
+ if s:settings.use_input_for_pc !=# 'all'
+ call append('.', [
+ \ 'a[data-FoldColumn-content="'.repeat(' ', s:foldcolumn).'"] { cursor: default; }'
+ \ ])
+ +1
+ end
+ endif
+ " make line number column show as non-interactive if not selectable
+ if s:settings.prevent_copy =~# 'n'
+ call append('.', 'input.LineNr { cursor: default; }')
+ +
+ endif
+ " make fold text and line number column within fold text show as
+ " non-interactive if not selectable
+ if (s:settings.prevent_copy =~# 'n' || s:settings.prevent_copy =~# 't') && !s:settings.ignore_folding
+ call append('.', 'input.Folded { cursor: default; }')
+ +
+ endif
+ " make diff filler show as non-interactive if not selectable
+ if s:settings.prevent_copy =~# 'd'
+ call append('.', 'input.DiffDelete { cursor: default; }')
+ +
+ endif
+ endif
+ endif
+endif
+
+if !s:settings.use_css && !s:settings.no_doc
+ " For Netscape 4, set <body> attributes too, though, strictly speaking, it's
+ " incorrect.
+ execute '%s:<body\([^>]*\):<body bgcolor="' . s:bgc . '" text="' . s:fgc . '"\1>\r<font face="'. s:htmlfont .'"'
+endif
+
+" Gather attributes for all other classes. Do diff first so that normal
+" highlight groups are inserted before it.
+if s:settings.use_css && !s:settings.no_doc
+ if s:diff_mode
+ call append('.', filter(map(keys(s:diffstylelist), "s:diffstylelist[v:val]"), 'v:val != ""'))
+ endif
+ if !empty(s:stylelist)
+ call append('.', filter(map(keys(s:stylelist), "s:stylelist[v:val]"), 'v:val != ""'))
+ endif
+endif
+
+" Add hyperlinks
+if !s:settings.no_links
+ %s+\(https\=://\S\{-}\)\(\([.,;:}]\=\(\s\|$\)\)\|[\\"'<>]\|&gt;\|&lt;\|&quot;\)+<a href="\1">\1</a>\2+ge
+endif
+
+" The DTD
+if !s:settings.no_doc
+ if s:settings.use_xhtml
+ exe "normal! gg$a\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
+ elseif s:html5
+ exe "normal! gg0i<!DOCTYPE html>\n"
+ else
+ exe "normal! gg0i<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n"
+ endif
+endif
+
+if s:settings.use_xhtml && !s:settings.no_doc
+ exe "normal! gg/<html/e\na xmlns=\"http://www.w3.org/1999/xhtml\"\e"
+endif
+
+" Cleanup
+%s:\s\+$::e
+
+" Restore old settings (new window first)
+"
+" Don't bother restoring foldmethod in case it was syntax because the markup is
+" so weirdly formatted it can take a LONG time.
+let &l:foldenable = s:old_fen
+let &report = s:old_report
+let &title = s:old_title
+let &icon = s:old_icon
+let &paste = s:old_paste
+let &magic = s:old_magic
+let @/ = s:old_search
+let &more = s:old_more
+
+" switch to original window to restore those settings
+exe s:orgwin . "wincmd w"
+
+if !s:settings.expand_tabs
+ let &l:isprint = s:old_isprint
+endif
+let &l:stl = s:origwin_stl
+let &l:et = s:old_et
+let &l:scrollbind = s:old_bind
+
+" and back to the new window again to end there
+exe s:newwin . "wincmd w"
+
+let &l:stl = s:newwin_stl
+exec 'resize' s:old_winheight
+let &l:winfixheight = s:old_winfixheight
+
+let &ls=s:ls
+let &eventignore=s:ei_sav
+
+" Save a little bit of memory (worth doing?)
+unlet s:htmlfont s:whitespace
+unlet s:old_et s:old_paste s:old_icon s:old_report s:old_title s:old_search
+unlet s:old_magic s:old_more s:old_fen s:old_winheight
+unlet! s:old_isprint
+unlet s:whatterm s:stylelist s:diffstylelist s:lnum s:end s:margin s:fgc s:bgc s:old_winfixheight
+unlet! s:col s:id s:attr s:len s:line s:new s:expandedtab s:concealinfo s:diff_mode
+unlet! s:orgwin s:newwin s:orgbufnr s:idx s:i s:offset s:ls s:ei_sav s:origwin_stl
+unlet! s:newwin_stl s:current_syntax
+if !v:profiling
+ delfunc s:HtmlColor
+ delfunc s:HtmlFormat
+ delfunc s:CSS1
+ delfunc s:BuildStyleWrapper
+ if !s:settings.use_css
+ delfunc s:HtmlOpening
+ delfunc s:HtmlClosing
+ endif
+ if s:settings.dynamic_folds
+ delfunc s:FoldCompare
+ endif
+
+ if !s:settings.no_progress
+ delfunc s:ProgressBar
+ delfunc s:progressbar.paint
+ delfunc s:progressbar.incr
+ unlet s:pgb s:progressbar
+ endif
+endif
+
+unlet! s:new_lnum s:diffattr s:difffillchar s:foldfillchar s:HtmlSpace
+unlet! s:LeadingSpace s:HtmlEndline s:firstfold s:numcol s:foldcolumn
+unlet s:foldstack s:allfolds s:foldId s:settings
+
+let &cpo = s:cpo_sav
+unlet! s:cpo_sav
+
+" Make sure any patches will probably use consistent indent
+" vim: ts=8 sw=2 sts=2 noet
diff --git a/runtime/syntax/8th.vim b/runtime/syntax/8th.vim
new file mode 100644
index 0000000..ce27d10
--- /dev/null
+++ b/runtime/syntax/8th.vim
@@ -0,0 +1,404 @@
+" Vim syntax file
+" Language: 8th
+" Version: 21.08
+" Last Change: 2021 Sep 20
+" Maintainer: Ron Aaron <ron@aaron-tech.com>
+" URL: https://8th-dev.com/
+" Filetypes: *.8th
+" NOTE: You should also have the ftplugin/8th.vim file to set 'isk'
+
+if version < 600
+ syntax clear
+ finish
+elseif exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+syn clear
+" Synchronization method
+syn sync ccomment
+syn sync maxlines=100
+syn case match
+syn match eighthColonName "\S\+" contained
+syn match eighthColonDef ":\s\+\S\+" contains=eighthColonName
+
+" new words
+syn match eighthClasses "\<\S\+:" contained
+syn match eighthClassWord "\<\S\+:.\+" contains=eighthClasses
+
+syn keyword eighthEndOfColonDef ; i;
+syn keyword eighthDefine var var,
+
+" Built in words:
+com! -nargs=+ Builtin syn keyword eighthBuiltin <args>
+
+Builtin args #:args b #:b dhm #:dhm exec# #:exec# id2ns #:id2ns id? #:id? idd #:idd key #:key oa #:oa
+Builtin oid #:oid okey #:okey with #:with with! #:with! zip #:zip gen-secret 2fa:gen-secret gen-url 2fa:gen-url
+Builtin validate-code 2fa:validate-code ! G:! #! G:#! ## G:## #> G:#> #if G:#if ' G:' ( G:( (* G:(*
+Builtin (:) G:(:) (code) G:(code) (defer) G:(defer) (dump) G:(dump) (getc) G:(getc) (gets) G:(gets)
+Builtin (interp) G:(interp) (log) G:(log) (needs) G:(needs) (parseln) G:(parseln) (putc) G:(putc) (puts) G:(puts)
+Builtin (putslim) G:(putslim) (stat) G:(stat) (with) G:(with) ) G:) +hook G:+hook +listener G:+listener
+Builtin +ref G:+ref ,# G:,# -- G:-- -----BEGIN G:-----BEGIN -Inf G:-Inf -Inf? G:-Inf? -hook G:-hook
+Builtin -listener G:-listener -ref G:-ref -rot G:-rot . G:. .# G:.# .hook G:.hook .needs G:.needs .r G:.r
+Builtin .s G:.s .s-truncate G:.s-truncate .stats G:.stats .ver G:.ver .with G:.with 0; G:0; 2dip G:2dip
+Builtin 2drop G:2drop 2dup G:2dup 2over G:2over 2swap G:2swap 3drop G:3drop 3rev G:3rev 4drop G:4drop
+Builtin 8thdt? G:8thdt? 8thsku G:8thsku 8thver? G:8thver? 8thvernum? G:8thvernum? : G:: ; G:; ;; G:;;
+Builtin ;;; G:;;; ;with G:;with <# G:<# <#> G:<#> >clip G:>clip >json G:>json >kind G:>kind >n G:>n
+Builtin >r G:>r >s G:>s ?: G:?: @ G:@ BITMAP: G:BITMAP: ENUM: G:ENUM: FLAG: G:FLAG: Inf G:Inf Inf? G:Inf?
+Builtin NaN G:NaN NaN? G:NaN? SED-CHECK G:SED-CHECK SED: G:SED: SED: G:SED: \ G:\ _dup G:_dup _swap G:_swap
+Builtin actor: G:actor: again G:again ahead G:ahead and G:and appname G:appname apropos G:apropos argc G:argc
+Builtin args G:args array? G:array? assert G:assert base G:base bi G:bi bits G:bits break G:break break? G:break?
+Builtin breakif G:breakif build? G:build? buildver? G:buildver? bye G:bye c# G:c# c/does G:c/does case: G:case:
+Builtin catch G:catch chdir G:chdir clip> G:clip> clone G:clone clone-shallow G:clone-shallow cold G:cold
+Builtin compile G:compile compile? G:compile? compiling? G:compiling? conflict G:conflict const G:const
+Builtin container? G:container? counting-allocations G:counting-allocations cr G:cr curlang G:curlang
+Builtin curry G:curry curry: G:curry: decimal G:decimal default: G:default: defer: G:defer: deferred: G:deferred:
+Builtin deg>rad G:deg>rad depth G:depth die G:die dip G:dip drop G:drop dstack G:dstack dump G:dump
+Builtin dup G:dup dup>r G:dup>r dup? G:dup? e# G:e# enum: G:enum: error? G:error? eval G:eval eval! G:eval!
+Builtin eval0 G:eval0 execnull G:execnull expect G:expect extra! G:extra! extra@ G:extra@ false G:false
+Builtin fnv G:fnv fourth G:fourth free G:free func: G:func: getc G:getc getcwd G:getcwd getenv G:getenv
+Builtin gets G:gets handler G:handler header G:header help G:help hex G:hex i: G:i: i; G:i; isa? G:isa?
+Builtin items-used G:items-used jcall G:jcall jclass G:jclass jmethod G:jmethod json! G:json! json-8th> G:json-8th>
+Builtin json-nesting G:json-nesting json-pretty G:json-pretty json-throw G:json-throw json> G:json>
+Builtin json@ G:json@ k32 G:k32 keep G:keep l: G:l: last G:last lib G:lib libbin G:libbin libc G:libc
+Builtin listener@ G:listener@ literal G:literal locals: G:locals: lock G:lock lock-to G:lock-to locked? G:locked?
+Builtin log G:log log-syslog G:log-syslog log-task G:log-task log-time G:log-time log-time-local G:log-time-local
+Builtin long-days G:long-days long-months G:long-months longjmp G:longjmp lookup G:lookup loop G:loop
+Builtin loop- G:loop- map? G:map? mark G:mark mark? G:mark? memfree G:memfree mobile? G:mobile? n# G:n#
+Builtin name>os G:name>os name>sem G:name>sem ndrop G:ndrop needs G:needs new G:new next-arg G:next-arg
+Builtin nip G:nip noop G:noop not G:not nothrow G:nothrow ns G:ns ns: G:ns: ns>ls G:ns>ls ns>s G:ns>s
+Builtin ns? G:ns? null G:null null; G:null; null? G:null? number? G:number? of: G:of: off G:off on G:on
+Builtin onexit G:onexit only G:only op! G:op! or G:or os G:os os-names G:os-names os>long-name G:os>long-name
+Builtin os>name G:os>name over G:over p: G:p: pack G:pack parse G:parse parse-csv G:parse-csv parsech G:parsech
+Builtin parseln G:parseln parsews G:parsews pick G:pick poke G:poke pool-clear G:pool-clear pool-clear-all G:pool-clear-all
+Builtin prior G:prior private G:private process-args G:process-args process-args-fancy G:process-args-fancy
+Builtin process-args-help G:process-args-help process-args-vars G:process-args-vars prompt G:prompt
+Builtin public G:public putc G:putc puts G:puts putslim G:putslim quote G:quote r! G:r! r> G:r> r@ G:r@
+Builtin rad>deg G:rad>deg rand-jit G:rand-jit rand-jsf G:rand-jsf rand-native G:rand-native rand-normal G:rand-normal
+Builtin rand-pcg G:rand-pcg rand-pcg-seed G:rand-pcg-seed rand-range G:rand-range rand-select G:rand-select
+Builtin randbuf-pcg G:randbuf-pcg random G:random rdrop G:rdrop recurse G:recurse recurse-stack G:recurse-stack
+Builtin ref@ G:ref@ reg! G:reg! reg@ G:reg@ regbin@ G:regbin@ remaining-args G:remaining-args repeat G:repeat
+Builtin required? G:required? requires G:requires reset G:reset roll G:roll rop! G:rop! rot G:rot rpick G:rpick
+Builtin rroll G:rroll rstack G:rstack rswap G:rswap rusage G:rusage s>ns G:s>ns same? G:same? scriptdir G:scriptdir
+Builtin scriptfile G:scriptfile sem G:sem sem-post G:sem-post sem-rm G:sem-rm sem-wait G:sem-wait sem-wait? G:sem-wait?
+Builtin sem>name G:sem>name semi-throw G:semi-throw set-wipe G:set-wipe setenv G:setenv setjmp G:setjmp
+Builtin settings! G:settings! settings![] G:settings![] settings@ G:settings@ settings@? G:settings@?
+Builtin settings@[] G:settings@[] sh G:sh sh$ G:sh$ short-days G:short-days short-months G:short-months
+Builtin sleep G:sleep sleep-until G:sleep-until slog G:slog space G:space stack-check G:stack-check
+Builtin stack-size G:stack-size step G:step sthrow G:sthrow string? G:string? struct: G:struct: swap G:swap
+Builtin tab-hook G:tab-hook tell-conflict G:tell-conflict tempdir G:tempdir tempfilename G:tempfilename
+Builtin third G:third throw G:throw thrownull G:thrownull times G:times tlog G:tlog tri G:tri true G:true
+Builtin tuck G:tuck type-check G:type-check typeassert G:typeassert uid G:uid uname G:uname unlock G:unlock
+Builtin unpack G:unpack until G:until until! G:until! while G:while while! G:while! with: G:with: word? G:word?
+Builtin words G:words words-like G:words-like words/ G:words/ xchg G:xchg xor G:xor >auth HTTP:>auth
+Builtin (curry) I:(curry) notimpl I:notimpl sh I:sh trace-word I:trace-word call JSONRPC:call auth-string OAuth:auth-string
+Builtin gen-nonce OAuth:gen-nonce params OAuth:params call SOAP:call ! a:! + a:+ - a:- / a:/ 2each a:2each
+Builtin 2map a:2map 2map+ a:2map+ 2map= a:2map= = a:= @ a:@ @? a:@? _@ a:_@ all a:all any a:any bsearch a:bsearch
+Builtin centroid a:centroid clear a:clear close a:close diff a:diff dot a:dot each a:each each! a:each!
+Builtin each-slice a:each-slice exists? a:exists? filter a:filter generate a:generate group a:group
+Builtin indexof a:indexof insert a:insert intersect a:intersect join a:join len a:len map a:map map+ a:map+
+Builtin map= a:map= mean a:mean mean&variance a:mean&variance merge a:merge new a:new op! a:op! open a:open
+Builtin pop a:pop push a:push qsort a:qsort randeach a:randeach reduce a:reduce reduce+ a:reduce+ remove a:remove
+Builtin rev a:rev shift a:shift shuffle a:shuffle slice a:slice slice+ a:slice+ slide a:slide smear a:smear
+Builtin sort a:sort union a:union x a:x x-each a:x-each xchg a:xchg y a:y zip a:zip 8thdir app:8thdir
+Builtin asset app:asset atrun app:atrun atrun app:atrun atrun app:atrun basedir app:basedir current app:current
+Builtin datadir app:datadir exename app:exename lowmem app:lowmem main app:main name app:name oncrash app:oncrash
+Builtin opts! app:opts! opts@ app:opts@ orientation app:orientation orientation! app:orientation! pid app:pid
+Builtin post-main app:post-main pre-main app:pre-main raise app:raise request-perm app:request-perm
+Builtin restart app:restart resumed app:resumed signal app:signal standalone app:standalone subdir app:subdir
+Builtin suspended app:suspended sysquit app:sysquit terminated app:terminated trap app:trap (here) asm:(here)
+Builtin >n asm:>n avail asm:avail c, asm:c, here! asm:here! n> asm:n> used asm:used w, asm:w, ! b:!
+Builtin + b:+ / b:/ 1+ b:1+ 1- b:1- = b:= >base16 b:>base16 >base32 b:>base32 >base64 b:>base64 >base85 b:>base85
+Builtin >hex b:>hex >mpack b:>mpack @ b:@ append b:append base16> b:base16> base32> b:base32> base64> b:base64>
+Builtin base85> b:base85> bit! b:bit! bit@ b:bit@ clear b:clear compress b:compress conv b:conv each b:each
+Builtin each! b:each! each-slice b:each-slice expand b:expand fill b:fill getb b:getb hex> b:hex> len b:len
+Builtin mem> b:mem> move b:move mpack-compat b:mpack-compat mpack-date b:mpack-date mpack-ignore b:mpack-ignore
+Builtin mpack> b:mpack> n! b:n! n+ b:n+ n@ b:n@ new b:new op b:op pad b:pad rev b:rev search b:search
+Builtin shmem b:shmem slice b:slice splice b:splice ungetb b:ungetb unpad b:unpad writable b:writable
+Builtin xor b:xor +block bc:+block .blocks bc:.blocks add-block bc:add-block block-hash bc:block-hash
+Builtin block@ bc:block@ first-block bc:first-block hash bc:hash last-block bc:last-block load bc:load
+Builtin new bc:new save bc:save set-sql bc:set-sql validate bc:validate validate-block bc:validate-block
+Builtin add bloom:add filter bloom:filter in? bloom:in? accept bt:accept ch! bt:ch! ch@ bt:ch@ connect bt:connect
+Builtin disconnect bt:disconnect init bt:init leconnect bt:leconnect lescan bt:lescan listen bt:listen
+Builtin on? bt:on? read bt:read scan bt:scan service? bt:service? services? bt:services? write bt:write
+Builtin * c:* * c:* + c:+ + c:+ = c:= = c:= >ri c:>ri >ri c:>ri abs c:abs abs c:abs arg c:arg arg c:arg
+Builtin conj c:conj conj c:conj im c:im n> c:n> new c:new new c:new re c:re >redir con:>redir accept con:accept
+Builtin accept-pwd con:accept-pwd ansi? con:ansi? black con:black blue con:blue clreol con:clreol cls con:cls
+Builtin cyan con:cyan down con:down free con:free getxy con:getxy gotoxy con:gotoxy green con:green
+Builtin key con:key key? con:key? left con:left load-history con:load-history magenta con:magenta onBlack con:onBlack
+Builtin onBlue con:onBlue onCyan con:onCyan onGreen con:onGreen onMagenta con:onMagenta onRed con:onRed
+Builtin onWhite con:onWhite onYellow con:onYellow print con:print red con:red redir> con:redir> redir? con:redir?
+Builtin right con:right save-history con:save-history size? con:size? up con:up white con:white yellow con:yellow
+Builtin >aes128gcm cr:>aes128gcm >aes256gcm cr:>aes256gcm >cp cr:>cp >cpe cr:>cpe >decrypt cr:>decrypt
+Builtin >edbox cr:>edbox >encrypt cr:>encrypt >nbuf cr:>nbuf >rsabox cr:>rsabox >uuid cr:>uuid CBC cr:CBC
+Builtin CFB cr:CFB CTR cr:CTR ECB cr:ECB GCM cr:GCM OFB cr:OFB aad? cr:aad? aes128box-sig cr:aes128box-sig
+Builtin aes128gcm> cr:aes128gcm> aes256box-sig cr:aes256box-sig aes256gcm> cr:aes256gcm> aesgcm cr:aesgcm
+Builtin blakehash cr:blakehash chacha20box-sig cr:chacha20box-sig chachapoly cr:chachapoly cipher! cr:cipher!
+Builtin cipher@ cr:cipher@ cp> cr:cp> cpe> cr:cpe> decrypt cr:decrypt decrypt+ cr:decrypt+ decrypt> cr:decrypt>
+Builtin dh-genkey cr:dh-genkey dh-secret cr:dh-secret dh-sign cr:dh-sign dh-verify cr:dh-verify ebox-sig cr:ebox-sig
+Builtin ecc-genkey cr:ecc-genkey ecc-secret cr:ecc-secret ecc-sign cr:ecc-sign ecc-verify cr:ecc-verify
+Builtin edbox-sig cr:edbox-sig edbox> cr:edbox> encrypt cr:encrypt encrypt+ cr:encrypt+ encrypt> cr:encrypt>
+Builtin ensurekey cr:ensurekey gcm-tag-size cr:gcm-tag-size genkey cr:genkey hash cr:hash hash! cr:hash!
+Builtin hash+ cr:hash+ hash>b cr:hash>b hash>s cr:hash>s hash@ cr:hash@ hmac cr:hmac hotp cr:hotp iv? cr:iv?
+Builtin mode cr:mode mode@ cr:mode@ rand cr:rand randbuf cr:randbuf randkey cr:randkey restore cr:restore
+Builtin root-certs cr:root-certs rsa_decrypt cr:rsa_decrypt rsa_encrypt cr:rsa_encrypt rsa_sign cr:rsa_sign
+Builtin rsa_verify cr:rsa_verify rsabox-sig cr:rsabox-sig rsabox> cr:rsabox> rsagenkey cr:rsagenkey
+Builtin save cr:save sbox-sig cr:sbox-sig sha1-hmac cr:sha1-hmac shard cr:shard tag? cr:tag? totp cr:totp
+Builtin totp-epoch cr:totp-epoch totp-time-step cr:totp-time-step unshard cr:unshard uuid cr:uuid uuid> cr:uuid>
+Builtin validate-pgp-sig cr:validate-pgp-sig (.hebrew) d:(.hebrew) (.islamic) d:(.islamic) + d:+ +day d:+day
+Builtin +hour d:+hour +min d:+min +msec d:+msec - d:- .hebrew d:.hebrew .islamic d:.islamic .time d:.time
+Builtin / d:/ = d:= >fixed d:>fixed >hebepoch d:>hebepoch >jdn d:>jdn >msec d:>msec >unix d:>unix >ymd d:>ymd
+Builtin ?= d:?= Adar d:Adar Adar2 d:Adar2 Adar2 d:Adar2 Av d:Av Elul d:Elul Fri d:Fri Heshvan d:Heshvan
+Builtin Iyar d:Iyar Kislev d:Kislev Mon d:Mon Nissan d:Nissan Sat d:Sat Shevat d:Shevat Sivan d:Sivan
+Builtin Sun d:Sun Tammuz d:Tammuz Tevet d:Tevet Thu d:Thu Tishrei d:Tishrei Tue d:Tue Wed d:Wed adjust-dst d:adjust-dst
+Builtin approx! d:approx! approx? d:approx? approximates! d:approximates! between d:between d. d:d.
+Builtin dawn d:dawn days-in-hebrew-year d:days-in-hebrew-year displaying-hebrew d:displaying-hebrew
+Builtin do-dawn d:do-dawn do-dusk d:do-dusk do-rise d:do-rise doy d:doy dst? d:dst? dstquery d:dstquery
+Builtin dstzones? d:dstzones? dusk d:dusk elapsed-timer d:elapsed-timer elapsed-timer-seconds d:elapsed-timer-seconds
+Builtin first-dow d:first-dow fixed> d:fixed> fixed>dow d:fixed>dow fixed>hebrew d:fixed>hebrew fixed>islamic d:fixed>islamic
+Builtin format d:format hanukkah d:hanukkah hebrew-epoch d:hebrew-epoch hebrew>fixed d:hebrew>fixed
+Builtin hebrewtoday d:hebrewtoday hmonth-name d:hmonth-name islamic.epoch d:islamic.epoch islamic>fixed d:islamic>fixed
+Builtin islamictoday d:islamictoday jdn> d:jdn> join d:join last-day-of-hebrew-month d:last-day-of-hebrew-month
+Builtin last-dow d:last-dow last-month d:last-month last-week d:last-week last-year d:last-year latitude d:latitude
+Builtin longitude d:longitude longitude d:longitude msec d:msec msec> d:msec> new d:new next-dow d:next-dow
+Builtin next-month d:next-month next-week d:next-week next-year d:next-year number>hebrew d:number>hebrew
+Builtin omer d:omer parse d:parse parse-approx d:parse-approx parse-range d:parse-range pesach d:pesach
+Builtin prev-dow d:prev-dow purim d:purim rosh-chodesh? d:rosh-chodesh? rosh-hashanah d:rosh-hashanah
+Builtin shavuot d:shavuot start-timer d:start-timer sunrise d:sunrise taanit-esther d:taanit-esther
+Builtin ticks d:ticks ticks/sec d:ticks/sec timer d:timer timer-ctrl d:timer-ctrl tisha-beav d:tisha-beav
+Builtin tzadjust d:tzadjust unix> d:unix> unknown d:unknown unknown? d:unknown? updatetz d:updatetz
+Builtin year@ d:year@ ymd d:ymd ymd> d:ymd> yom-haatsmaut d:yom-haatsmaut yom-kippur d:yom-kippur add-func db:add-func
+Builtin aes! db:aes! begin db:begin bind db:bind bind-exec db:bind-exec bind-exec[] db:bind-exec[]
+Builtin close db:close col db:col col[] db:col[] col{} db:col{} commit db:commit each db:each exec db:exec
+Builtin exec-cb db:exec-cb exec-name db:exec-name get db:get get-sub db:get-sub key db:key kind? db:kind?
+Builtin last-rowid db:last-rowid mysql? db:mysql? odbc? db:odbc? open db:open open? db:open? prep-name db:prep-name
+Builtin prepare db:prepare query db:query query-all db:query-all rekey db:rekey rollback db:rollback
+Builtin set db:set set-sub db:set-sub sql@ db:sql@ bp dbg:bp except-task@ dbg:except-task@ go dbg:go
+Builtin line-info dbg:line-info prompt dbg:prompt stop dbg:stop trace dbg:trace trace-enter dbg:trace-enter
+Builtin trace-leave dbg:trace-leave / f:/ abspath f:abspath absrel f:absrel append f:append associate f:associate
+Builtin atime f:atime canwrite? f:canwrite? chmod f:chmod close f:close copy f:copy copydir f:copydir
+Builtin create f:create ctime f:ctime dir? f:dir? dname f:dname eachbuf f:eachbuf eachline f:eachline
+Builtin enssep f:enssep eof? f:eof? exists? f:exists? flush f:flush fname f:fname getb f:getb getc f:getc
+Builtin getline f:getline getmod f:getmod glob f:glob glob-nocase f:glob-nocase homedir f:homedir homedir! f:homedir!
+Builtin include f:include ioctl f:ioctl join f:join launch f:launch link f:link link> f:link> link? f:link?
+Builtin mkdir f:mkdir mmap f:mmap mmap-range f:mmap-range mmap-range? f:mmap-range? mtime f:mtime mv f:mv
+Builtin name@ f:name@ open f:open open-ro f:open-ro popen f:popen print f:print read f:read read? f:read?
+Builtin relpath f:relpath rglob f:rglob rm f:rm rmdir f:rmdir seek f:seek sep f:sep size f:size slurp f:slurp
+Builtin sparse? f:sparse? spit f:spit stderr f:stderr stdin f:stdin stdout f:stdout tell f:tell times f:times
+Builtin tmpspit f:tmpspit trash f:trash truncate f:truncate ungetb f:ungetb ungetc f:ungetc unzip f:unzip
+Builtin unzip-entry f:unzip-entry watch f:watch write f:write writen f:writen zip+ f:zip+ zip@ f:zip@
+Builtin zipentry f:zipentry zipnew f:zipnew zipopen f:zipopen zipsave f:zipsave atlas! font:atlas!
+Builtin atlas@ font:atlas@ default-size font:default-size info font:info ls font:ls measure font:measure
+Builtin new font:new oversample font:oversample pixels font:pixels pixels? font:pixels? +edge gr:+edge
+Builtin +edge+w gr:+edge+w +node gr:+node connect gr:connect edges gr:edges edges! gr:edges! m! gr:m!
+Builtin m@ gr:m@ neighbors gr:neighbors new gr:new node-edges gr:node-edges nodes gr:nodes traverse gr:traverse
+Builtin weight! gr:weight! + h:+ clear h:clear cmp! h:cmp! len h:len max! h:max! new h:new peek h:peek
+Builtin pop h:pop push h:push unique h:unique arm? hw:arm? camera hw:camera camera-img hw:camera-img
+Builtin camera-limits hw:camera-limits camera? hw:camera? cpu? hw:cpu? device? hw:device? displays? hw:displays?
+Builtin displaysize? hw:displaysize? finger-match hw:finger-match finger-support hw:finger-support
+Builtin gpio hw:gpio gpio! hw:gpio! gpio-mmap hw:gpio-mmap gpio@ hw:gpio@ i2c hw:i2c i2c! hw:i2c! i2c!reg hw:i2c!reg
+Builtin i2c@ hw:i2c@ i2c@reg hw:i2c@reg isround? hw:isround? iswatch? hw:iswatch? mac? hw:mac? mem? hw:mem?
+Builtin model? hw:model? poll hw:poll sensor hw:sensor start hw:start stop hw:stop uid? hw:uid? fetch-full imap:fetch-full
+Builtin fetch-uid-mail imap:fetch-uid-mail login imap:login logout imap:logout new imap:new search imap:search
+Builtin select-inbox imap:select-inbox >file img:>file >fmt img:>fmt copy img:copy crop img:crop data img:data
+Builtin desat img:desat fill img:fill fillrect img:fillrect filter img:filter flip img:flip from-svg img:from-svg
+Builtin new img:new pix! img:pix! pix@ img:pix@ qr-gen img:qr-gen qr-parse img:qr-parse rotate img:rotate
+Builtin scale img:scale scroll img:scroll size img:size countries iso:countries find loc:find sort loc:sort
+Builtin ! m:! !? m:!? + m:+ +? m:+? - m:- >arr m:>arr @ m:@ @? m:@? _! m:_! _@ m:_@ arr> m:arr> bitmap m:bitmap
+Builtin clear m:clear data m:data each m:each exists? m:exists? filter m:filter iter m:iter iter-all m:iter-all
+Builtin keys m:keys len m:len map m:map merge m:merge new m:new op! m:op! open m:open slice m:slice
+Builtin vals m:vals xchg m:xchg zip m:zip ! mat:! * mat:* + mat:+ = mat:= @ mat:@ affine mat:affine
+Builtin col mat:col data mat:data det mat:det dim? mat:dim? get-n mat:get-n ident mat:ident inv mat:inv
+Builtin m. mat:m. minor mat:minor n* mat:n* new mat:new new-minor mat:new-minor rotate mat:rotate row mat:row
+Builtin same-size? mat:same-size? scale mat:scale shear mat:shear trans mat:trans translate mat:translate
+Builtin xform mat:xform 2console md:2console 2html md:2html 2nk md:2nk bounds meta:bounds color meta:color
+Builtin console meta:console end meta:end ffi meta:ffi ! n:! * n:* */ n:*/ + n:+ +! n:+! - n:- / n:/
+Builtin /mod n:/mod 1+ n:1+ 1- n:1- < n:< = n:= > n:> BIGE n:BIGE BIGPI n:BIGPI E n:E PI n:PI ^ n:^
+Builtin _mod n:_mod abs n:abs acos n:acos acos n:acos asin n:asin asin n:asin atan n:atan atan n:atan
+Builtin atan2 n:atan2 band n:band between n:between bfloat n:bfloat bic n:bic bint n:bint binv n:binv
+Builtin bnot n:bnot bor n:bor bxor n:bxor cast n:cast ceil n:ceil clamp n:clamp cmp n:cmp comb n:comb
+Builtin cos n:cos cosd n:cosd emod n:emod exp n:exp expm1 n:expm1 expmod n:expmod float n:float floor n:floor
+Builtin fmod n:fmod frac n:frac gcd n:gcd int n:int invmod n:invmod kind? n:kind? lcm n:lcm ln n:ln
+Builtin ln1p n:ln1p max n:max median n:median min n:min mod n:mod neg n:neg odd? n:odd? perm n:perm
+Builtin prime? n:prime? quantize n:quantize quantize! n:quantize! r+ n:r+ range n:range rot32l n:rot32l
+Builtin rot32r n:rot32r round n:round round2 n:round2 rounding n:rounding running-variance n:running-variance
+Builtin running-variance-finalize n:running-variance-finalize sgn n:sgn shl n:shl shr n:shr sin n:sin
+Builtin sind n:sind sqr n:sqr sqrt n:sqrt tan n:tan tand n:tand trunc n:trunc ~= n:~= ! net:! !? net:!?
+Builtin - net:- >url net:>url @ net:@ @? net:@? DGRAM net:DGRAM INET4 net:INET4 INET6 net:INET6 PROTO_TCP net:PROTO_TCP
+Builtin PROTO_UDP net:PROTO_UDP STREAM net:STREAM accept net:accept addrinfo>o net:addrinfo>o again? net:again?
+Builtin alloc-and-read net:alloc-and-read alloc-buf net:alloc-buf bind net:bind close net:close closed? net:closed?
+Builtin connect net:connect debug? net:debug? delete net:delete get net:get getaddrinfo net:getaddrinfo
+Builtin getpeername net:getpeername head net:head ifaces? net:ifaces? listen net:listen map>url net:map>url
+Builtin net-socket net:net-socket opts net:opts port-is-ssl? net:port-is-ssl? post net:post proxy! net:proxy!
+Builtin put net:put read net:read read-all net:read-all recvfrom net:recvfrom s>url net:s>url sendto net:sendto
+Builtin server net:server setsockopt net:setsockopt socket net:socket tlshello net:tlshello url> net:url>
+Builtin user-agent net:user-agent wait net:wait write net:write (begin) nk:(begin) (chart-begin) nk:(chart-begin)
+Builtin (chart-begin-colored) nk:(chart-begin-colored) (chart-end) nk:(chart-end) (end) nk:(end) (group-begin) nk:(group-begin)
+Builtin (group-end) nk:(group-end) (property) nk:(property) >img nk:>img addfont nk:addfont anti-alias nk:anti-alias
+Builtin any-clicked? nk:any-clicked? bounds nk:bounds bounds! nk:bounds! button nk:button button-color nk:button-color
+Builtin button-label nk:button-label button-set-behavior nk:button-set-behavior button-symbol nk:button-symbol
+Builtin button-symbol-label nk:button-symbol-label chart-add-slot nk:chart-add-slot chart-add-slot-colored nk:chart-add-slot-colored
+Builtin chart-push nk:chart-push chart-push-slot nk:chart-push-slot checkbox nk:checkbox clicked? nk:clicked?
+Builtin close-this! nk:close-this! close-this? nk:close-this? close? nk:close? color-picker nk:color-picker
+Builtin combo nk:combo combo-begin-color nk:combo-begin-color combo-begin-label nk:combo-begin-label
+Builtin combo-cb nk:combo-cb combo-end nk:combo-end contextual-begin nk:contextual-begin contextual-close nk:contextual-close
+Builtin contextual-end nk:contextual-end contextual-item-image-text nk:contextual-item-image-text contextual-item-symbol-text nk:contextual-item-symbol-text
+Builtin contextual-item-text nk:contextual-item-text cp! nk:cp! cp@ nk:cp@ display-info nk:display-info
+Builtin display@ nk:display@ do nk:do down? nk:down? draw-image nk:draw-image draw-image-at nk:draw-image-at
+Builtin draw-image-centered nk:draw-image-centered draw-sub-image nk:draw-sub-image draw-text nk:draw-text
+Builtin draw-text-high nk:draw-text-high draw-text-wrap nk:draw-text-wrap edit-focus nk:edit-focus
+Builtin edit-string nk:edit-string event nk:event event-boost nk:event-boost event-msec nk:event-msec
+Builtin event-wait nk:event-wait fill-arc nk:fill-arc fill-circle nk:fill-circle fill-poly nk:fill-poly
+Builtin fill-rect nk:fill-rect fill-rect-color nk:fill-rect-color fill-triangle nk:fill-triangle flags! nk:flags!
+Builtin flags@ nk:flags@ fullscreen nk:fullscreen get nk:get get-row-height nk:get-row-height getfont nk:getfont
+Builtin getmap nk:getmap gl? nk:gl? grid nk:grid grid-push nk:grid-push group-scroll-ofs nk:group-scroll-ofs
+Builtin group-scroll-ofs! nk:group-scroll-ofs! hovered? nk:hovered? image nk:image init nk:init input-button nk:input-button
+Builtin input-key nk:input-key input-motion nk:input-motion input-scroll nk:input-scroll input-string nk:input-string
+Builtin key-down? nk:key-down? key-pressed? nk:key-pressed? key-released? nk:key-released? label nk:label
+Builtin label-colored nk:label-colored label-wrap nk:label-wrap label-wrap-colored nk:label-wrap-colored
+Builtin layout-bounds nk:layout-bounds layout-grid-begin nk:layout-grid-begin layout-grid-end nk:layout-grid-end
+Builtin layout-push-dynamic nk:layout-push-dynamic layout-push-static nk:layout-push-static layout-push-variable nk:layout-push-variable
+Builtin layout-ratio-from-pixel nk:layout-ratio-from-pixel layout-reset-row-height nk:layout-reset-row-height
+Builtin layout-row nk:layout-row layout-row-begin nk:layout-row-begin layout-row-dynamic nk:layout-row-dynamic
+Builtin layout-row-end nk:layout-row-end layout-row-height nk:layout-row-height layout-row-push nk:layout-row-push
+Builtin layout-row-static nk:layout-row-static layout-row-template-begin nk:layout-row-template-begin
+Builtin layout-row-template-end nk:layout-row-template-end layout-space-begin nk:layout-space-begin
+Builtin layout-space-end nk:layout-space-end layout-space-push nk:layout-space-push layout-widget-bounds nk:layout-widget-bounds
+Builtin list-begin nk:list-begin list-end nk:list-end list-new nk:list-new list-range nk:list-range
+Builtin m! nk:m! m@ nk:m@ make-style nk:make-style max-vertex-element nk:max-vertex-element measure nk:measure
+Builtin measure-font nk:measure-font menu-begin nk:menu-begin menu-close nk:menu-close menu-end nk:menu-end
+Builtin menu-item-image nk:menu-item-image menu-item-label nk:menu-item-label menu-item-symbol nk:menu-item-symbol
+Builtin menubar-begin nk:menubar-begin menubar-end nk:menubar-end mouse-pos nk:mouse-pos msgdlg nk:msgdlg
+Builtin option nk:option plot nk:plot plot-fn nk:plot-fn pop-font nk:pop-font popup-begin nk:popup-begin
+Builtin popup-close nk:popup-close popup-end nk:popup-end popup-scroll-ofs nk:popup-scroll-ofs popup-scroll-ofs! nk:popup-scroll-ofs!
+Builtin progress nk:progress prop-int nk:prop-int pt>local nk:pt>local pt>screen nk:pt>screen pts>rect nk:pts>rect
+Builtin push-font nk:push-font rect-center nk:rect-center rect-intersect nk:rect-intersect rect-ofs nk:rect-ofs
+Builtin rect-pad nk:rect-pad rect-shrink nk:rect-shrink rect-union nk:rect-union rect/high nk:rect/high
+Builtin rect/wide nk:rect/wide rect>center nk:rect>center rect>local nk:rect>local rect>pos nk:rect>pos
+Builtin rect>pts nk:rect>pts rect>screen nk:rect>screen rect>size nk:rect>size released? nk:released?
+Builtin render nk:render restore nk:restore rotate nk:rotate save nk:save scale nk:scale scancode? nk:scancode?
+Builtin screen-saver nk:screen-saver screen-size nk:screen-size screen-win-close nk:screen-win-close
+Builtin selectable nk:selectable set nk:set set-font nk:set-font set-num-vertices nk:set-num-vertices
+Builtin setpos nk:setpos setwin nk:setwin slider nk:slider slider-int nk:slider-int space nk:space
+Builtin spacing nk:spacing stroke-arc nk:stroke-arc stroke-circle nk:stroke-circle stroke-curve nk:stroke-curve
+Builtin stroke-line nk:stroke-line stroke-polygon nk:stroke-polygon stroke-polyline nk:stroke-polyline
+Builtin stroke-rect nk:stroke-rect stroke-tri nk:stroke-tri style-from-table nk:style-from-table sw-gl nk:sw-gl
+Builtin text? nk:text? tooltip nk:tooltip translate nk:translate tree-pop nk:tree-pop tree-state-push nk:tree-state-push
+Builtin use-style nk:use-style vsync nk:vsync widget nk:widget widget-bounds nk:widget-bounds widget-fitting nk:widget-fitting
+Builtin widget-high nk:widget-high widget-hovered? nk:widget-hovered? widget-mouse-click-down? nk:widget-mouse-click-down?
+Builtin widget-mouse-clicked? nk:widget-mouse-clicked? widget-pos nk:widget-pos widget-size nk:widget-size
+Builtin widget-wide nk:widget-wide win nk:win win-bounds nk:win-bounds win-bounds! nk:win-bounds! win-close nk:win-close
+Builtin win-closed? nk:win-closed? win-collapse nk:win-collapse win-collapsed? nk:win-collapsed? win-content-bounds nk:win-content-bounds
+Builtin win-focus nk:win-focus win-focused? nk:win-focused? win-hidden? nk:win-hidden? win-high nk:win-high
+Builtin win-hovered? nk:win-hovered? win-pos nk:win-pos win-scroll-ofs nk:win-scroll-ofs win-scroll-ofs! nk:win-scroll-ofs!
+Builtin win-show nk:win-show win-size nk:win-size win-wide nk:win-wide win? nk:win? MAX ns:MAX ! o:!
+Builtin + o:+ +? o:+? ??? o:??? @ o:@ class o:class exec o:exec isa o:isa method o:method mutate o:mutate
+Builtin new o:new super o:super devname os:devname env os:env lang os:lang mem-arenas os:mem-arenas
+Builtin notify os:notify region os:region cast ptr:cast len ptr:len null? ptr:null? pack ptr:pack unpack ptr:unpack
+Builtin unpack_orig ptr:unpack_orig publish pubsub:publish qsize pubsub:qsize subscribe pubsub:subscribe
+Builtin + q:+ clear q:clear len q:len new q:new notify q:notify overwrite q:overwrite peek q:peek pick q:pick
+Builtin pop q:pop push q:push remove q:remove shift q:shift size q:size slide q:slide throwing q:throwing
+Builtin wait q:wait ++match r:++match +/ r:+/ +match r:+match / r:/ @ r:@ len r:len match r:match new r:new
+Builtin rx r:rx str r:str * rat:* + rat:+ - rat:- / rat:/ >n rat:>n >s rat:>s new rat:new proper rat:proper
+Builtin ! s:! * s:* + s:+ - s:- / s:/ /scripts s:/scripts <+ s:<+ = s:= =ic s:=ic >base64 s:>base64
+Builtin >ucs2 s:>ucs2 @ s:@ append s:append base64> s:base64> clear s:clear cmp s:cmp cmpi s:cmpi compress s:compress
+Builtin days! s:days! dist s:dist each s:each each! s:each! eachline s:eachline escape s:escape expand s:expand
+Builtin fill s:fill fmt s:fmt fold s:fold gershayim s:gershayim globmatch s:globmatch hexupr s:hexupr
+Builtin insert s:insert intl s:intl intl! s:intl! lang s:lang lc s:lc lc? s:lc? len s:len lsub s:lsub
+Builtin ltrim s:ltrim map s:map months! s:months! new s:new norm s:norm reduce s:reduce repinsert s:repinsert
+Builtin replace s:replace replace! s:replace! rev s:rev rsearch s:rsearch rsub s:rsub rtrim s:rtrim
+Builtin script? s:script? search s:search size s:size slice s:slice soundex s:soundex strfmap s:strfmap
+Builtin strfmt s:strfmt text-wrap s:text-wrap trim s:trim tsub s:tsub uc s:uc uc? s:uc? ucs2> s:ucs2>
+Builtin utf8? s:utf8? zt s:zt close sio:close enum sio:enum open sio:open opts! sio:opts! opts@ sio:opts@
+Builtin read sio:read write sio:write @ slv:@ auto slv:auto build slv:build constraint slv:constraint
+Builtin dump slv:dump edit slv:edit named-variable slv:named-variable new slv:new relation slv:relation
+Builtin reset slv:reset suggest slv:suggest term slv:term update slv:update v[] slv:v[] variable slv:variable
+Builtin v{} slv:v{} new smtp:new send smtp:send apply-filter snd:apply-filter devices? snd:devices?
+Builtin end-record snd:end-record filter snd:filter formats? snd:formats? freq snd:freq gain snd:gain
+Builtin gain? snd:gain? init snd:init len snd:len loop snd:loop loop? snd:loop? mix snd:mix new snd:new
+Builtin pause snd:pause play snd:play played snd:played rate snd:rate ready? snd:ready? record snd:record
+Builtin resume snd:resume seek snd:seek stop snd:stop stopall snd:stopall volume snd:volume volume? snd:volume?
+Builtin + st:+ . st:. clear st:clear len st:len ndrop st:ndrop new st:new op! st:op! peek st:peek pick st:pick
+Builtin pop st:pop push st:push roll st:roll shift st:shift size st:size slide st:slide swap st:swap
+Builtin throwing st:throwing >buf struct:>buf arr> struct:arr> buf struct:buf buf> struct:buf> byte struct:byte
+Builtin double struct:double field! struct:field! field@ struct:field@ float struct:float ignore struct:ignore
+Builtin int struct:int long struct:long struct; struct:struct; word struct:word ! t:! @ t:@ by-name t:by-name
+Builtin cor t:cor cor-drop t:cor-drop curtask t:curtask def-queue t:def-queue def-stack t:def-stack
+Builtin done? t:done? err! t:err! err? t:err? errno? t:errno? getq t:getq handler t:handler handler@ t:handler@
+Builtin kill t:kill list t:list main t:main max-exceptions t:max-exceptions name! t:name! name@ t:name@
+Builtin notify t:notify parent t:parent pop t:pop priority t:priority push t:push q-notify t:q-notify
+Builtin q-wait t:q-wait qlen t:qlen result t:result set-affinity t:set-affinity setq t:setq start t:start
+Builtin task t:task task-n t:task-n task-stop t:task-stop wait t:wait yield t:yield yield! t:yield!
+Builtin add tree:add binary tree:binary bk tree:bk btree tree:btree cmp! tree:cmp! data tree:data del tree:del
+Builtin find tree:find iter tree:iter next tree:next nodes tree:nodes parent tree:parent parse tree:parse
+Builtin prev tree:prev root tree:root search tree:search trie tree:trie ! w:! (is) w:(is) @ w:@ alias: w:alias:
+Builtin cb w:cb deprecate w:deprecate dlcall w:dlcall dlopen w:dlopen dlsym w:dlsym exec w:exec exec? w:exec?
+Builtin ffifail w:ffifail find w:find forget w:forget is w:is name w:name undo w:undo >s xml:>s >txt xml:>txt
+Builtin md-init xml:md-init md-parse xml:md-parse parse xml:parse parse-html xml:parse-html parse-stream xml:parse-stream
+Builtin getmsg[] zmq:getmsg[] sendmsg[] zmq:sendmsg[]
+
+" numbers
+syn keyword eighthMath decimal hex base@ base!
+syn match eighthInteger '\<-\=[0-9.]*[0-9.]\+\>'
+
+" recognize hex and binary numbers, the '$' and '%' notation is for eighth
+syn match eighthInteger '\<\$\x*\x\+\>' " *1* --- dont't mess
+syn match eighthInteger '\<\x*\d\x*\>' " *2* --- this order!
+syn match eighthInteger '\<%[0-1]*[0-1]\+\>'
+syn match eighthInteger "\<'.\>"
+
+" Strings
+syn region eighthString start=+\.\?\"+ skip=+"+ end=+$+
+syn keyword jsonNull null
+syn keyword jsonBool /\(true\|false\)/
+syn region eighthString start=/\<"/ end=/"\>/
+syn match jsonObjEntry /"\"[^"]\+\"\ze\s*:/
+
+" Include files
+syn region eighthComment start="\zs\\" end="$" contains=eighthTodo
+
+" Define the default highlighting.
+if !exists("did_eighth_syntax_inits")
+ let did_eighth_syntax_inits=1
+
+ " The default methods for highlighting. Can be overriden later.
+ hi def link eighthTodo Todo
+ hi def link eighthOperators Operator
+ hi def link eighthMath Number
+ hi def link eighthInteger Number
+ hi def link eighthStack Special
+ hi def link eighthFStack Special
+ hi def link eighthSP Special
+ hi def link eighthColonDef Define
+ hi def link eighthColonName Operator
+ hi def link eighthEndOfColonDef Define
+ hi def link eighthDefine Define
+ hi def link eighthDebug Debug
+ hi def link eighthCharOps Character
+ hi def link eighthConversion String
+ hi def link eighthForth Statement
+ hi def link eighthVocs Statement
+ hi def link eighthString String
+ hi def link eighthComment Comment
+ hi def link eighthClassDef Define
+ hi def link eighthEndOfClassDef Define
+ hi def link eighthObjectDef Define
+ hi def link eighthEndOfObjectDef Define
+ hi def link eighthInclude Include
+ hi def link eighthBuiltin Define
+ hi def link eighthClasses Define
+ hi def link eighthClassWord Keyword
+ hi def link jsonObject Delimiter
+ hi def link jsonObjEntry Label
+ hi def link jsonArray Special
+ hi def link jsonNull Function
+ hi def link jsonBool Boolean
+endif
+
+let b:current_syntax = "8th"
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ft=vim:ts=8:sw=4:nocindent:smartindent:
diff --git a/runtime/syntax/README.txt b/runtime/syntax/README.txt
new file mode 100644
index 0000000..d6a86e5
--- /dev/null
+++ b/runtime/syntax/README.txt
@@ -0,0 +1,41 @@
+This directory contains Vim scripts for syntax highlighting.
+
+These scripts are not for a language, but are used by Vim itself:
+
+syntax.vim Used for the ":syntax on" command. Uses synload.vim.
+
+manual.vim Used for the ":syntax manual" command. Uses synload.vim.
+
+synload.vim Contains autocommands to load a language file when a certain
+ file name (extension) is used. And sets up the Syntax menu
+ for the GUI.
+
+nosyntax.vim Used for the ":syntax off" command. Undo the loading of
+ synload.vim.
+
+The "shared" directory contains generated files and what is used by more than
+one syntax.
+
+
+A few special files:
+
+2html.vim Converts any highlighted file to HTML (GUI only).
+colortest.vim Check for color names and actual color on screen.
+hitest.vim View the current highlight settings.
+whitespace.vim View Tabs and Spaces.
+
+
+If you want to write a syntax file, read the docs at ":help usr_44.txt".
+
+If you make a new syntax file which would be useful for others, please send it
+to Bram@vim.org. Include instructions for detecting the file type for this
+language, by file name extension or by checking a few lines in the file.
+And please write the file in a portable way, see ":help 44.12".
+
+If you have remarks about an existing file, send them to the maintainer of
+that file. Only when you get no response send a message to Bram@vim.org.
+
+If you are the maintainer of a syntax file and make improvements, send the new
+version to Bram@vim.org.
+
+For further info see ":help syntax" in Vim.
diff --git a/runtime/syntax/a2ps.vim b/runtime/syntax/a2ps.vim
new file mode 100644
index 0000000..afe3af1
--- /dev/null
+++ b/runtime/syntax/a2ps.vim
@@ -0,0 +1,71 @@
+" Vim syntax file
+" Language: a2ps(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword a2psPreProc Include
+ \ nextgroup=a2psKeywordColon
+
+syn keyword a2psMacro UserOption
+ \ nextgroup=a2psKeywordColon
+
+syn keyword a2psKeyword LibraryPath AppendLibraryPath PrependLibraryPath
+ \ Options Medium Printer UnknownPrinter
+ \ DefaultPrinter OutputFirstLine
+ \ PageLabelFormat Delegation FileCommand
+ \ nextgroup=a2psKeywordColon
+
+syn match a2psKeywordColon contained display ':'
+
+syn keyword a2psKeyword Variable nextgroup=a2psVariableColon
+
+syn match a2psVariableColon contained display ':'
+ \ nextgroup=a2psVariable skipwhite
+
+syn match a2psVariable contained display '[^ \t:(){}]\+'
+ \ contains=a2psVarPrefix
+
+syn match a2psVarPrefix contained display
+ \ '\<\%(del\|pro\|ps\|pl\|toc\|user\|\)\ze\.'
+
+syn match a2psLineCont display '\\$'
+
+syn match a2psSubst display '$\%(-\=.\=\d\+\)\=\h\d\='
+syn match a2psSubst display '#[?!]\=\w\d\='
+syn match a2psSubst display '#{[^}]\+}'
+
+syn region a2psString display oneline start=+'+ end=+'+
+ \ contains=a2psSubst
+
+syn region a2psString display oneline start=+"+ end=+"+
+ \ contains=a2psSubst
+
+syn keyword a2psTodo contained TODO FIXME XXX NOTE
+
+syn region a2psComment display oneline start='^\s*#' end='$'
+ \ contains=a2psTodo,@Spell
+
+hi def link a2psTodo Todo
+hi def link a2psComment Comment
+hi def link a2psPreProc PreProc
+hi def link a2psMacro Macro
+hi def link a2psKeyword Keyword
+hi def link a2psKeywordColon Delimiter
+hi def link a2psVariableColon Delimiter
+hi def link a2psVariable Identifier
+hi def link a2psVarPrefix Type
+hi def link a2psLineCont Special
+hi def link a2psSubst PreProc
+hi def link a2psString String
+
+let b:current_syntax = "a2ps"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/a65.vim b/runtime/syntax/a65.vim
new file mode 100644
index 0000000..b232e82
--- /dev/null
+++ b/runtime/syntax/a65.vim
@@ -0,0 +1,153 @@
+" Vim syntax file
+" Language: xa 6502 cross assembler
+" Maintainer: Clemens Kirchgatterer <clemens@1541.org>
+" Last Change: 2016 Aug 31
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Opcodes
+syn match a65Opcode "\<PHP\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<PLA\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<PLX\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<PLY\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<SEC\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<CLD\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<SED\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<CLI\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BVC\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BVS\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BCS\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BCC\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<DEY\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<DEC\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<CMP\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<CPX\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BIT\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<ROL\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<ROR\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<ASL\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<TXA\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<TYA\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<TSX\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<TXS\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<LDA\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<LDX\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<LDY\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<STA\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<PLP\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BRK\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<RTI\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<NOP\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<SEI\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<CLV\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<PHA\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<PHX\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BRA\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<JMP\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<JSR\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<RTS\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<CPY\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BNE\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BEQ\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BMI\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<LSR\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<INX\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<INY\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<INC\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<ADC\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<SBC\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<AND\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<ORA\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<STX\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<STY\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<STZ\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<EOR\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<DEX\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BPL\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<CLC\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<PHY\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<TRB\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BBR\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<BBS\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<RMB\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<SMB\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<TAY\($\|\s\)" nextgroup=a65Address
+syn match a65Opcode "\<TAX\($\|\s\)" nextgroup=a65Address
+
+" Addresses
+syn match a65Address "\s*!\=$[0-9A-F]\{2}\($\|\s\)"
+syn match a65Address "\s*!\=$[0-9A-F]\{4}\($\|\s\)"
+syn match a65Address "\s*!\=$[0-9A-F]\{2},X\($\|\s\)"
+syn match a65Address "\s*!\=$[0-9A-F]\{4},X\($\|\s\)"
+syn match a65Address "\s*!\=$[0-9A-F]\{2},Y\($\|\s\)"
+syn match a65Address "\s*!\=$[0-9A-F]\{4},Y\($\|\s\)"
+syn match a65Address "\s*($[0-9A-F]\{2})\($\|\s\)"
+syn match a65Address "\s*($[0-9A-F]\{4})\($\|\s\)"
+syn match a65Address "\s*($[0-9A-F]\{2},X)\($\|\s\)"
+syn match a65Address "\s*($[0-9A-F]\{2}),Y\($\|\s\)"
+
+" Numbers
+syn match a65Number "#\=[0-9]*\>"
+syn match a65Number "#\=$[0-9A-F]*\>"
+syn match a65Number "#\=&[0-7]*\>"
+syn match a65Number "#\=%[01]*\>"
+
+syn case match
+
+" Types
+syn match a65Type "\(^\|\s\)\.byt\($\|\s\)"
+syn match a65Type "\(^\|\s\)\.word\($\|\s\)"
+syn match a65Type "\(^\|\s\)\.asc\($\|\s\)"
+syn match a65Type "\(^\|\s\)\.dsb\($\|\s\)"
+syn match a65Type "\(^\|\s\)\.fopt\($\|\s\)"
+syn match a65Type "\(^\|\s\)\.text\($\|\s\)"
+syn match a65Type "\(^\|\s\)\.data\($\|\s\)"
+syn match a65Type "\(^\|\s\)\.bss\($\|\s\)"
+syn match a65Type "\(^\|\s\)\.zero\($\|\s\)"
+syn match a65Type "\(^\|\s\)\.align\($\|\s\)"
+
+" Blocks
+syn match a65Section "\(^\|\s\)\.(\($\|\s\)"
+syn match a65Section "\(^\|\s\)\.)\($\|\s\)"
+
+" Strings
+syn match a65String "\".*\""
+
+" Programm Counter
+syn region a65PC start="\*=" end="\>" keepend
+
+" HI/LO Byte
+syn region a65HiLo start="#[<>]" end="$\|\s" contains=a65Comment keepend
+
+" Comments
+syn keyword a65Todo TODO XXX FIXME BUG contained
+syn match a65Comment ";.*"hs=s+1 contains=a65Todo
+syn region a65Comment start="/\*" end="\*/" contains=a65Todo,a65Comment
+
+" Preprocessor
+syn region a65PreProc start="^#" end="$" contains=a65Comment,a65Continue
+syn match a65End excludenl /end$/ contained
+syn match a65Continue "\\$" contained
+
+" Define the default highlighting.
+" 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/aap.vim b/runtime/syntax/aap.vim
new file mode 100644
index 0000000..8399a4d
--- /dev/null
+++ b/runtime/syntax/aap.vim
@@ -0,0 +1,158 @@
+" Vim syntax file
+" Language: A-A-P recipe
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2004 Jun 13
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn include @aapPythonScript syntax/python.vim
+
+syn match aapVariable /$[-+?*="'\\!]*[a-zA-Z0-9_.]*/
+syn match aapVariable /$[-+?*="'\\!]*([a-zA-Z0-9_.]*)/
+syn keyword aapTodo contained TODO Todo
+syn match aapString +'[^']\{-}'+
+syn match aapString +"[^"]\{-}"+
+
+syn match aapCommand '^\s*:action\>'
+syn match aapCommand '^\s*:add\>'
+syn match aapCommand '^\s*:addall\>'
+syn match aapCommand '^\s*:asroot\>'
+syn match aapCommand '^\s*:assertpkg\>'
+syn match aapCommand '^\s*:attr\>'
+syn match aapCommand '^\s*:attribute\>'
+syn match aapCommand '^\s*:autodepend\>'
+syn match aapCommand '^\s*:buildcheck\>'
+syn match aapCommand '^\s*:cd\>'
+syn match aapCommand '^\s*:chdir\>'
+syn match aapCommand '^\s*:checkin\>'
+syn match aapCommand '^\s*:checkout\>'
+syn match aapCommand '^\s*:child\>'
+syn match aapCommand '^\s*:chmod\>'
+syn match aapCommand '^\s*:commit\>'
+syn match aapCommand '^\s*:commitall\>'
+syn match aapCommand '^\s*:conf\>'
+syn match aapCommand '^\s*:copy\>'
+syn match aapCommand '^\s*:del\>'
+syn match aapCommand '^\s*:deldir\>'
+syn match aapCommand '^\s*:delete\>'
+syn match aapCommand '^\s*:delrule\>'
+syn match aapCommand '^\s*:dll\>'
+syn match aapCommand '^\s*:do\>'
+syn match aapCommand '^\s*:error\>'
+syn match aapCommand '^\s*:execute\>'
+syn match aapCommand '^\s*:exit\>'
+syn match aapCommand '^\s*:export\>'
+syn match aapCommand '^\s*:fetch\>'
+syn match aapCommand '^\s*:fetchall\>'
+syn match aapCommand '^\s*:filetype\>'
+syn match aapCommand '^\s*:finish\>'
+syn match aapCommand '^\s*:global\>'
+syn match aapCommand '^\s*:import\>'
+syn match aapCommand '^\s*:include\>'
+syn match aapCommand '^\s*:installpkg\>'
+syn match aapCommand '^\s*:lib\>'
+syn match aapCommand '^\s*:local\>'
+syn match aapCommand '^\s*:log\>'
+syn match aapCommand '^\s*:ltlib\>'
+syn match aapCommand '^\s*:mkdir\>'
+syn match aapCommand '^\s*:mkdownload\>'
+syn match aapCommand '^\s*:move\>'
+syn match aapCommand '^\s*:pass\>'
+syn match aapCommand '^\s*:popdir\>'
+syn match aapCommand '^\s*:produce\>'
+syn match aapCommand '^\s*:program\>'
+syn match aapCommand '^\s*:progsearch\>'
+syn match aapCommand '^\s*:publish\>'
+syn match aapCommand '^\s*:publishall\>'
+syn match aapCommand '^\s*:pushdir\>'
+syn match aapCommand '^\s*:quit\>'
+syn match aapCommand '^\s*:recipe\>'
+syn match aapCommand '^\s*:refresh\>'
+syn match aapCommand '^\s*:remove\>'
+syn match aapCommand '^\s*:removeall\>'
+syn match aapCommand '^\s*:require\>'
+syn match aapCommand '^\s*:revise\>'
+syn match aapCommand '^\s*:reviseall\>'
+syn match aapCommand '^\s*:route\>'
+syn match aapCommand '^\s*:rule\>'
+syn match aapCommand '^\s*:start\>'
+syn match aapCommand '^\s*:symlink\>'
+syn match aapCommand '^\s*:sys\>'
+syn match aapCommand '^\s*:sysdepend\>'
+syn match aapCommand '^\s*:syspath\>'
+syn match aapCommand '^\s*:system\>'
+syn match aapCommand '^\s*:tag\>'
+syn match aapCommand '^\s*:tagall\>'
+syn match aapCommand '^\s*:toolsearch\>'
+syn match aapCommand '^\s*:totype\>'
+syn match aapCommand '^\s*:touch\>'
+syn match aapCommand '^\s*:tree\>'
+syn match aapCommand '^\s*:unlock\>'
+syn match aapCommand '^\s*:update\>'
+syn match aapCommand '^\s*:usetool\>'
+syn match aapCommand '^\s*:variant\>'
+syn match aapCommand '^\s*:verscont\>'
+
+syn match aapCommand '^\s*:print\>' nextgroup=aapPipeEnd
+syn match aapPipeCmd '\s*:print\>' nextgroup=aapPipeEnd contained
+syn match aapCommand '^\s*:cat\>' nextgroup=aapPipeEnd
+syn match aapPipeCmd '\s*:cat\>' nextgroup=aapPipeEnd contained
+syn match aapCommand '^\s*:syseval\>' nextgroup=aapPipeEnd
+syn match aapPipeCmd '\s*:syseval\>' nextgroup=aapPipeEnd contained
+syn match aapPipeCmd '\s*:assign\>' contained
+syn match aapCommand '^\s*:eval\>' nextgroup=aapPipeEnd
+syn match aapPipeCmd '\s*:eval\>' nextgroup=aapPipeEndPy contained
+syn match aapPipeCmd '\s*:tee\>' nextgroup=aapPipeEnd contained
+syn match aapPipeCmd '\s*:log\>' nextgroup=aapPipeEnd contained
+syn match aapPipeEnd '[^|]*|' nextgroup=aapPipeCmd contained skipnl
+syn match aapPipeEndPy '[^|]*|' nextgroup=aapPipeCmd contained skipnl contains=@aapPythonScript
+syn match aapPipeStart '^\s*|' nextgroup=aapPipeCmd
+
+"
+" A Python line starts with @. Can be continued with a trailing backslash.
+syn region aapPythonRegion start="\s*@" skip='\\$' end=+$+ contains=@aapPythonScript keepend
+"
+" A Python block starts with ":python" and continues so long as the indent is
+" bigger.
+syn region aapPythonRegion matchgroup=aapCommand start="\z(\s*\):python" skip='\n\z1\s\|\n\s*\n' end=+$+ contains=@aapPythonScript
+
+" A Python expression is enclosed in backticks.
+syn region aapPythonRegion start="`" skip="``" end="`" contains=@aapPythonScript
+
+" TODO: There is something wrong with line continuation.
+syn match aapComment '#.*' contains=aapTodo
+syn match aapComment '#.*\(\\\n.*\)' contains=aapTodo
+
+syn match aapSpecial '$#'
+syn match aapSpecial '$\$'
+syn match aapSpecial '$(.)'
+
+" A heredoc assignment.
+syn region aapHeredoc start="^\s*\k\+\s*$\=+\=?\=<<\s*\z(\S*\)"hs=e+1 end="^\s*\z1\s*$"he=s-1
+
+" Syncing is needed for ":python" and "VAR << EOF". Don't use Python syncing
+syn sync clear
+syn sync fromstart
+
+" The default highlighting.
+hi def link aapTodo Todo
+hi def link aapString String
+hi def link aapComment Comment
+hi def link aapSpecial Special
+hi def link aapVariable Identifier
+hi def link aapPipeCmd aapCommand
+hi def link aapCommand Statement
+hi def link aapHeredoc Constant
+
+let b:current_syntax = "aap"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/abap.vim b/runtime/syntax/abap.vim
new file mode 100644
index 0000000..e48dfc3
--- /dev/null
+++ b/runtime/syntax/abap.vim
@@ -0,0 +1,196 @@
+" Vim ABAP syntax file
+" Language: SAP - ABAP/R4
+" Maintainer: Marius Piedallu van Wyk <lailoken@gmail.com>
+" Last Change: 2021 Jan 02
+" Comment: Thanks to EPI-USE Labs for all your assistance. :)
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Always ignore case
+syn case ignore
+
+" Symbol Operators (space delimited)
+syn match abapSymbolOperator "\W+\W"
+syn match abapSymbolOperator "\W-\W"
+syn match abapSymbolOperator "\W/\W"
+syn match abapSymbolOperator "\W%\W"
+syn match abapSymbolOperator "\W=\W"
+syn match abapSymbolOperator "\W<\W"
+syn match abapSymbolOperator "\W>\W"
+syn match abapSymbolOperator "\W\*\W"
+syn match abapSymbolOperator "\W[<>]=\W"
+syn match abapSymbolOperator "\W<>\W"
+syn match abapSymbolOperator "\W\*\*\W"
+syn match abapSymbolOperator "\[\]"
+syn match abapSymbolOperator "->\*\?"
+syn match abapSymbolOperator "=>"
+syn match abapSymbolOperator "[()~:,\.&$]"
+
+" Literals
+syn region abapCharString matchgroup=abapCharString start="'" end="'" contains=abapCharStringEscape
+syn match abapCharStringEscape contained "''"
+
+syn region abapString matchgroup=abapString start="`" end="`" contains=abapStringEscape
+syn match abapStringEscape contained "``"
+
+syn match abapNumber "\-\=\<\d\+\>"
+syn region abapHex matchgroup=abapHex start="X'" end="'"
+
+setlocal iskeyword=48-57,_,A-Z,a-z,/
+
+syn match abapNamespace "\</\w\+/"
+
+" multi-word statements
+syn match abapComplexStatement "\<\(WITH\W\+\(HEADER\W\+LINE\|FRAME\|KEY\)\|WITH\)\>"
+syn match abapComplexStatement "\<NO\W\+STANDARD\W\+PAGE\W\+HEADING\>"
+syn match abapComplexStatement "\<\(EXIT\W\+FROM\W\+STEP\W\+LOOP\|EXIT\)\>"
+syn match abapComplexStatement "\<\(BEGIN\W\+OF\W\+\(BLOCK\|LINE\)\|BEGIN\W\+OF\)\>"
+syn match abapComplexStatement "\<\(END\W\+OF\W\+\(BLOCK\|LINE\)\|END\W\+OF\)\>"
+syn match abapComplexStatement "\<NO\W\+INTERVALS\>"
+syn match abapComplexStatement "\<RESPECTING\W\+BLANKS\>"
+syn match abapComplexStatement "\<SEPARATED\W\+BY\>"
+syn match abapComplexStatement "\<USING\(\W\+EDIT\W\+MASK\)\?\>"
+syn match abapComplexStatement "\<WHERE\(\W\+LINE\)\?\>"
+syn match abapComplexStatement "\<GET\W\+\(TIME\(\W\+STAMP\)\?\(\W\+FIELD\)\?\|PF-STATUS\|BADI\|BIT\|CONNECTION\|CURSOR\|REFERENCE\W\+OF\)\>"
+syn match abapComplexStatement "\<RADIOBUTTON\W\+GROUP\>"
+syn match abapComplexStatement "\<REF\W\+TO\>"
+syn match abapComplexStatement "\<\(PUBLIC\|PRIVATE\|PROTECTED\)\(\W\+SECTION\)\?\>"
+syn match abapComplexStatement "\<DELETING\W\+\(TRAILING\|LEADING\)\>"
+syn match abapComplexStatement "\<\(ALL\W\+OCCURRENCES\)\|\(\(FIRST\|LAST\)\W\+OCCURRENCE\)\>"
+syn match abapComplexStatement "\<INHERITING\W\+FROM\>"
+syn match abapComplexStatement "\<\(UP\W\+\)\?TO\>"
+
+" hyphenated-word statements
+syn match abapComplexStatement "\<LINE-COUNT\>"
+syn match abapComplexStatement "\<ADD-CORRESPONDING\>"
+syn match abapComplexStatement "\<AUTHORITY-CHECK\>"
+syn match abapComplexStatement "\<BREAK-POINT\>"
+syn match abapComplexStatement "\<CLASS-DATA\>"
+syn match abapComplexStatement "\<CLASS-METHODS\>"
+syn match abapComplexStatement "\<CLASS-METHOD\>"
+syn match abapComplexStatement "\<DIVIDE-CORRESPONDING\>"
+syn match abapComplexStatement "\<EDITOR-CALL\>"
+syn match abapComplexStatement "\<END-OF-DEFINITION\>"
+syn match abapComplexStatement "\<END-OF-PAGE\>"
+syn match abapComplexStatement "\<END-OF-SELECTION\>"
+syn match abapComplexStatement "\<FIELD-GROUPS\>"
+syn match abapComplexStatement "\<FIELD-SYMBOLS\>"
+syn match abapComplexStatement "\<FUNCTION-POOL\>"
+syn match abapComplexStatement "\<IS\W\+\(NOT\W\+\)\?\(ASSIGNED\|BOUND\|INITIAL\|SUPPLIED\)\>"
+syn match abapComplexStatement "\<MOVE-CORRESPONDING\>"
+syn match abapComplexStatement "\<MULTIPLY-CORRESPONDING\>"
+syn match abapComplexStatement "\<NEW-LINE\>"
+syn match abapComplexStatement "\<NEW-PAGE\>"
+syn match abapComplexStatement "\<NEW-SECTION\>"
+syn match abapComplexStatement "\<PRINT-CONTROL\>"
+syn match abapComplexStatement "\<RP-PROVIDE-FROM-LAST\>"
+syn match abapComplexStatement "\<SELECT-OPTIONS\>"
+syn match abapComplexStatement "\<SELECTION-SCREEN\>"
+syn match abapComplexStatement "\<START-OF-SELECTION\>"
+syn match abapComplexStatement "\<SUBTRACT-CORRESPONDING\>"
+syn match abapComplexStatement "\<SYNTAX-CHECK\>"
+syn match abapComplexStatement "\<SYNTAX-TRACE\>"
+syn match abapComplexStatement "\<TOP-OF-PAGE\>"
+syn match abapComplexStatement "\<TYPE-POOL\>"
+syn match abapComplexStatement "\<TYPE-POOLS\>"
+syn match abapComplexStatement "\<LINE-SIZE\>"
+syn match abapComplexStatement "\<LINE-COUNT\>"
+syn match abapComplexStatement "\<MESSAGE-ID\>"
+syn match abapComplexStatement "\<DISPLAY-MODE\>"
+syn match abapComplexStatement "\<READ\(-ONLY\)\?\>"
+
+" ABAP statements
+syn keyword abapStatement ADD ALIAS ALIASES ASSERT ASSIGN ASSIGNING AT
+syn keyword abapStatement BACK
+syn keyword abapStatement CALL CASE CATCH CHECK CLASS CLEAR CLOSE CNT COLLECT COMMIT COMMUNICATION COMPUTE CONCATENATE CONDENSE CONSTANTS CONTINUE CONTROLS CONVERT CREATE CURRENCY
+syn keyword abapStatement DATA DEFINE DEFINITION DEFERRED DELETE DESCRIBE DETAIL DIVIDE DO
+syn keyword abapStatement ELSE ELSEIF ENDAT ENDCASE ENDCLASS ENDDO ENDEXEC ENDFORM ENDFUNCTION ENDIF ENDIFEND ENDINTERFACE ENDLOOP ENDMETHOD ENDMODULE ENDON ENDPROVIDE ENDSELECT ENDTRY ENDWHILE EVENT EVENTS EXEC EXIT EXPORT EXPORTING EXTRACT
+syn keyword abapStatement FETCH FIELDS FORM FORMAT FREE FROM FUNCTION
+syn keyword abapStatement GENERATE
+syn keyword abapStatement HIDE
+syn keyword abapStatement IF IMPORT IMPORTING INDEX INFOTYPES INITIALIZATION INTERFACE INTERFACES INPUT INSERT IMPLEMENTATION
+syn keyword abapStatement LEAVE LIKE LINE LOAD LOCAL LOOP
+syn keyword abapStatement MESSAGE METHOD METHODS MODIFY MODULE MOVE MULTIPLY
+syn keyword abapStatement ON OVERLAY OPTIONAL OTHERS
+syn keyword abapStatement PACK PARAMETERS PERFORM POSITION PROGRAM PROVIDE PUT
+syn keyword abapStatement RAISE RANGES RECEIVE RECEIVING REDEFINITION REFERENCE REFRESH REJECT REPLACE REPORT RESERVE RESTORE RETURNING ROLLBACK
+syn keyword abapStatement SCAN SCROLL SEARCH SELECT SET SHIFT SKIP SORT SORTED SPLIT STANDARD STATICS STEP STOP SUBMIT SUBTRACT SUM SUMMARY SUPPRESS
+syn keyword abapStatement TABLES TIMES TRANSFER TRANSLATE TRY TYPE TYPES
+syn keyword abapStatement UNASSIGN ULINE UNPACK UPDATE
+syn keyword abapStatement WHEN WHILE WINDOW WRITE
+
+" More statemets
+syn keyword abapStatement LINES
+syn keyword abapStatement INTO GROUP BY HAVING ORDER BY SINGLE
+syn keyword abapStatement APPENDING CORRESPONDING FIELDS OF TABLE
+syn keyword abapStatement LEFT RIGHT OUTER INNER JOIN AS CLIENT SPECIFIED BYPASSING BUFFER ROWS CONNECTING
+syn keyword abapStatement OCCURS STRUCTURE OBJECT PROPERTY
+syn keyword abapStatement CASTING APPEND RAISING VALUE COLOR
+syn keyword abapStatement CHANGING EXCEPTION EXCEPTIONS DEFAULT CHECKBOX COMMENT
+syn keyword abapStatement ID NUMBER FOR TITLE OUTPUT
+
+" Special ABAP specific tables:
+syn match abapSpecialTables "\<\(sy\|\(hrp\|p\|pa\)\d\d\d\d\|t\d\d\d.\|innnn\)-"me=e-1 contained
+syn match abapStructure "\<\w\+-[^\>]"me=e-2 contains=abapSpecialTables,abapStatement,abapComplexStatement
+syn match abapField "-\w\+"ms=s+1
+
+" Pointer
+syn match abapSpecial "<\w\+>"
+
+" Abap common constants:
+syn keyword abapSpecial TRUE FALSE NULL SPACE
+
+" Includes
+syn region abapInclude start="include" end="." contains=abapComment
+
+" Types
+syn keyword abapTypes c n i int8 p f d t x string xstring decfloat16 decfloat34
+
+" Atritmitic operators
+syn keyword abapOperator abs sign ceil floor trunc frac acos asin atan cos sin tan
+syn keyword abapOperator cosh sinh tanh exp log log10 sqrt
+
+" String operators
+syn keyword abapStatement strlen xstrlen charlen numofchar dbmaxlen
+
+syn keyword abapOperator EQ NE LT LE GT GE NOT AND OR XOR IN LIKE BETWEEN
+
+" An error? Not strictly... but cannot think of reason this is intended.
+syn match abapError "\.\."
+
+" Comments
+syn region abapComment start="^\*" end="$" contains=abapTodo
+syn match abapComment "\".*" contains=abapTodo
+syn keyword abapTodo contained TODO NOTE
+syn match abapTodo "\#EC\W\+\w\+"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/abaqus.vim b/runtime/syntax/abaqus.vim
new file mode 100644
index 0000000..e6f025d
--- /dev/null
+++ b/runtime/syntax/abaqus.vim
@@ -0,0 +1,34 @@
+" Vim syntax file
+" Language: Abaqus finite element input file (www.hks.com)
+" Maintainer: Carl Osterwisch <costerwi@gmail.com>
+" Last Change: 2002 Feb 24
+" Remark: Huge improvement in folding performance--see filetype plugin
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Abaqus comment lines
+syn match abaqusComment "^\*\*.*$"
+
+" Abaqus keyword lines
+syn match abaqusKeywordLine "^\*\h.*" contains=abaqusKeyword,abaqusParameter,abaqusValue display
+syn match abaqusKeyword "^\*\h[^,]*" contained display
+syn match abaqusParameter ",[^,=]\+"lc=1 contained display
+syn match abaqusValue "=\s*[^,]*"lc=1 contained display
+
+" Illegal syntax
+syn match abaqusBadLine "^\s\+\*.*" display
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..1a7b3bf
--- /dev/null
+++ b/runtime/syntax/abc.vim
@@ -0,0 +1,51 @@
+" Vim syntax file
+" Language: abc music notation language
+" Maintainer: James Allwright <J.R.Allwright@westminster.ac.uk>
+" URL: http://perun.hscs.wmin.ac.uk/~jra/vim/syntax/abc.vim
+" Last Change: 27th April 2001
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" tags
+syn region abcGuitarChord start=+"[A-G]+ end=+"+ contained
+syn match abcNote "z[1-9]*[0-9]*" contained
+syn match abcNote "z[1-9]*[0-9]*/[248]\=" contained
+syn match abcNote "[=_\^]\{,2}[A-G],*[1-9]*[0-9]*" contained
+syn match abcNote "[=_\^]\{,2}[A-G],*[1-9]*[0-9]*/[248]\=" contained
+syn match abcNote "[=_\^]\{,2}[a-g]'*[1-9]*[0-9]*" contained
+syn match abcNote "[=_\^]\{,2}[a-g]'*[1-9]*[0-9]*/[248]\=" contained
+syn match abcBar "|" contained
+syn match abcBar "[:|][:|]" contained
+syn match abcBar ":|2" contained
+syn match abcBar "|1" contained
+syn match abcBar "\[[12]" contained
+syn match abcTuple "([1-9]\+:\=[0-9]*:\=[0-9]*" contained
+syn match abcBroken "<\|<<\|<<<\|>\|>>\|>>>" contained
+syn match abcTie "-"
+syn match abcHeadField "^[A-EGHIK-TVWXZ]:.*$" contained
+syn match abcBodyField "^[KLMPQWVw]:.*$" contained
+syn region abcHeader start="^X:" end="^K:.*$" contained contains=abcHeadField,abcComment keepend
+syn region abcTune start="^X:" end="^ *$" contains=abcHeader,abcComment,abcBar,abcNote,abcBodyField,abcGuitarChord,abcTuple,abcBroken,abcTie
+syn match abcComment "%.*$"
+
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "abc"
+
+" vim: ts=4
diff --git a/runtime/syntax/abel.vim b/runtime/syntax/abel.vim
new file mode 100644
index 0000000..dbed541
--- /dev/null
+++ b/runtime/syntax/abel.vim
@@ -0,0 +1,161 @@
+" Vim syntax file
+" Language: ABEL
+" Maintainer: John Cook <johncook3@gmail.com>
+" Last Change: 2011 Dec 27
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" this language is oblivious to case
+syn case ignore
+
+" A bunch of keywords
+syn keyword abelHeader module title device options
+syn keyword abelSection declarations equations test_vectors end
+syn keyword abelDeclaration state truth_table state_diagram property
+syn keyword abelType pin node attribute constant macro library
+
+syn keyword abelTypeId com reg neg pos buffer dc reg_d reg_t contained
+syn keyword abelTypeId reg_sr reg_jk reg_g retain xor invert contained
+
+syn keyword abelStatement when then else if with endwith case endcase
+syn keyword abelStatement fuses expr trace
+
+" option to omit obsolete statements
+if exists("abel_obsolete_ok")
+ syn keyword abelStatement enable flag in
+else
+ syn keyword abelError enable flag in
+endif
+
+" directives
+syn match abelDirective "@alternate"
+syn match abelDirective "@standard"
+syn match abelDirective "@const"
+syn match abelDirective "@dcset"
+syn match abelDirective "@include"
+syn match abelDirective "@page"
+syn match abelDirective "@radix"
+syn match abelDirective "@repeat"
+syn match abelDirective "@irp"
+syn match abelDirective "@expr"
+syn match abelDirective "@if"
+syn match abelDirective "@ifb"
+syn match abelDirective "@ifnb"
+syn match abelDirective "@ifdef"
+syn match abelDirective "@ifndef"
+syn match abelDirective "@ifiden"
+syn match abelDirective "@ifniden"
+
+syn keyword abelTodo contained TODO XXX FIXME
+
+" wrap up type identifiers to differentiate them from normal strings
+syn region abelSpecifier start='istype' end=';' contains=abelTypeIdChar,abelTypeId,abelTypeIdEnd keepend
+syn match abelTypeIdChar "[,']" contained
+syn match abelTypeIdEnd ";" contained
+
+" string constants and special characters within them
+syn match abelSpecial contained "\\['\\]"
+syn region abelString start=+'+ skip=+\\"+ end=+'+ contains=abelSpecial
+
+" valid integer number formats (decimal, binary, octal, hex)
+syn match abelNumber "\<[-+]\=[0-9]\+\>"
+syn match abelNumber "\^d[0-9]\+\>"
+syn match abelNumber "\^b[01]\+\>"
+syn match abelNumber "\^o[0-7]\+\>"
+syn match abelNumber "\^h[0-9a-f]\+\>"
+
+" special characters
+" (define these after abelOperator so ?= overrides ?)
+syn match abelSpecialChar "[\[\](){},;:?]"
+
+" operators
+syn match abelLogicalOperator "[!#&$]"
+syn match abelRangeOperator "\.\."
+syn match abelAlternateOperator "[/*+]"
+syn match abelAlternateOperator ":[+*]:"
+syn match abelArithmeticOperator "[-%]"
+syn match abelArithmeticOperator "<<"
+syn match abelArithmeticOperator ">>"
+syn match abelRelationalOperator "[<>!=]="
+syn match abelRelationalOperator "[<>]"
+syn match abelAssignmentOperator "[:?]\=="
+syn match abelAssignmentOperator "?:="
+syn match abelTruthTableOperator "->"
+
+" signal extensions
+syn match abelExtension "\.aclr\>"
+syn match abelExtension "\.aset\>"
+syn match abelExtension "\.clk\>"
+syn match abelExtension "\.clr\>"
+syn match abelExtension "\.com\>"
+syn match abelExtension "\.fb\>"
+syn match abelExtension "\.[co]e\>"
+syn match abelExtension "\.l[eh]\>"
+syn match abelExtension "\.fc\>"
+syn match abelExtension "\.pin\>"
+syn match abelExtension "\.set\>"
+syn match abelExtension "\.[djksrtq]\>"
+syn match abelExtension "\.pr\>"
+syn match abelExtension "\.re\>"
+syn match abelExtension "\.a[pr]\>"
+syn match abelExtension "\.s[pr]\>"
+
+" special constants
+syn match abelConstant "\.[ckudfpxz]\."
+syn match abelConstant "\.sv[2-9]\."
+
+" one-line comments
+syn region abelComment start=+"+ end=+"\|$+ contains=abelNumber,abelTodo
+" option to prevent C++ style comments
+if !exists("abel_cpp_comments_illegal")
+ syn region abelComment start=+//+ end=+$+ contains=abelNumber,abelTodo
+endif
+
+syn sync minlines=1
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:ts=8
diff --git a/runtime/syntax/acedb.vim b/runtime/syntax/acedb.vim
new file mode 100644
index 0000000..2c2cd70
--- /dev/null
+++ b/runtime/syntax/acedb.vim
@@ -0,0 +1,110 @@
+" Vim syntax file
+" Language: AceDB model files
+" Maintainer: Stewart Morris (Stewart.Morris@ed.ac.uk)
+" Last change: Thu Apr 26 10:38:01 BST 2001
+" URL: http://www.ed.ac.uk/~swmorris/vim/acedb.vim
+
+" Syntax file to handle all $ACEDB/wspec/*.wrm files, primarily models.wrm
+" AceDB software is available from http://www.acedb.org
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword acedbXref XREF
+syn keyword acedbModifier UNIQUE REPEAT
+
+syn case ignore
+syn keyword acedbModifier Constraints
+syn keyword acedbType DateType Int Text Float
+
+" Magic tags from: http://genome.cornell.edu/acedocs/magic/summary.html
+syn keyword acedbMagic pick_me_to_call No_cache Non_graphic Title
+syn keyword acedbMagic Flipped Centre Extent View Default_view
+syn keyword acedbMagic From_map Minimal_view Main_Marker Map Includes
+syn keyword acedbMagic Mapping_data More_data Position Ends Left Right
+syn keyword acedbMagic Multi_Position Multi_Ends With Error Relative
+syn keyword acedbMagic Min Anchor Gmap Grid_map Grid Submenus Cambridge
+syn keyword acedbMagic No_buttons Columns Colour Surround_colour Tag
+syn keyword acedbMagic Scale_unit Cursor Cursor_on Cursor_unit
+syn keyword acedbMagic Locator Magnification Projection_lines_on
+syn keyword acedbMagic Marker_points Marker_intervals Contigs
+syn keyword acedbMagic Physical_genes Two_point Multi_point Likelihood
+syn keyword acedbMagic Point_query Point_yellow Point_width
+syn keyword acedbMagic Point_pne Point_pe Point_nne Point_ne
+syn keyword acedbMagic Derived_tags DT_query DT_width DT_no_duplicates
+syn keyword acedbMagic RH_data RH_query RH_spacing RH_show_all
+syn keyword acedbMagic Names_on Width Symbol Colours Pne Pe Nne pMap
+syn keyword acedbMagic Sequence Gridded FingerPrint In_Situ Cosmid_grid
+syn keyword acedbMagic Layout Lines_at Space_at No_stagger A1_labelling
+syn keyword acedbMagic DNA Structure From Source Source_Exons
+syn keyword acedbMagic Coding CDS Transcript Assembly_tags Allele
+syn keyword acedbMagic Display Colour Frame_sensitive Strand_sensitive
+syn keyword acedbMagic Score_bounds Percent Bumpable Width Symbol
+syn keyword acedbMagic Blixem_N Address E_mail Paper Reference Title
+syn keyword acedbMagic Point_1 Point_2 Calculation Full One_recombinant
+syn keyword acedbMagic Tested Selected_trans Backcross Back_one
+syn keyword acedbMagic Dom_semi Dom_let Direct Complex_mixed Calc
+syn keyword acedbMagic Calc_upper_conf Item_1 Item_2 Results A_non_B
+syn keyword acedbMagic Score Score_by_offset Score_by_width
+syn keyword acedbMagic Right_priority Blastn Blixem Blixem_X
+syn keyword acedbMagic Journal Year Volume Page Author
+syn keyword acedbMagic Selected One_all Recs_all One_let
+syn keyword acedbMagic Sex_full Sex_one Sex_cis Dom_one Dom_selected
+syn keyword acedbMagic Calc_distance Calc_lower_conf Canon_for_cosmid
+syn keyword acedbMagic Reversed_physical Points Positive Negative
+syn keyword acedbMagic Point_error_scale Point_segregate_ordered
+syn keyword acedbMagic Point_symbol Interval_JTM Interval_RD
+syn keyword acedbMagic EMBL_feature Homol Feature
+syn keyword acedbMagic DT_tag Spacer Spacer_colour Spacer_width
+syn keyword acedbMagic RH_positive RH_negative RH_contradictory Query
+syn keyword acedbMagic Clone Y_remark PCR_remark Hybridizes_to
+syn keyword acedbMagic Row Virtual_row Mixed In_pool Subpool B_non_A
+syn keyword acedbMagic Interval_SRK Point_show_marginal Subsequence
+syn keyword acedbMagic Visible Properties Transposon
+
+syn match acedbClass "^?\w\+\|^#\w\+"
+syn match acedbComment "//.*"
+syn region acedbComment start="/\*" end="\*/"
+syn match acedbComment "^#\W.*"
+syn match acedbHelp "^\*\*\w\+$"
+syn match acedbTag "[^^]?\w\+\|[^^]#\w\+"
+syn match acedbBlock "//#.\+#$"
+syn match acedbOption "^_[DVH]\S\+"
+syn match acedbFlag "\s\+-\h\+"
+syn match acedbSubclass "^Class"
+syn match acedbSubtag "^Visible\|^Is_a_subclass_of\|^Filter\|^Hidden"
+syn match acedbNumber "\<\d\+\>"
+syn match acedbNumber "\<\d\+\.\d\+\>"
+syn match acedbHyb "\<Positive_\w\+\>\|\<Negative\w\+\>"
+syn region acedbString start=/"/ end=/"/ skip=/\\"/ oneline
+
+" Rest of syntax highlighting rules start here
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "acedb"
+
+" The structure of the model.wrm file is sensitive to mixed tab and space
+" indentation and assumes tabs are 8 so...
+se ts=8
diff --git a/runtime/syntax/ada.vim b/runtime/syntax/ada.vim
new file mode 100644
index 0000000..415c952
--- /dev/null
+++ b/runtime/syntax/ada.vim
@@ -0,0 +1,368 @@
+"----------------------------------------------------------------------------
+" Description: Vim Ada syntax file
+" Language: Ada (2005)
+" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $
+" Copyright: Copyright (C) 2006 Martin Krischik
+" Maintainer: Martin Krischik
+" David A. Wheeler <dwheeler@dwheeler.com>
+" Simon Bradley <simon.bradley@pitechnology.com>
+" Contributors: Preben Randhol.
+" $Author: krischik $
+" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" Version: 4.6
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $
+" http://www.dwheeler.com/vim
+" History: 24.05.2006 MK Unified Headers
+" 26.05.2006 MK ' should not be in iskeyword.
+" 16.07.2006 MK Ada-Mode as vim-ball
+" 02.10.2006 MK Better folding.
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 05.11.2006 MK Spell check for comments and strings only
+" 05.11.2006 MK Bram suggested to save on spaces
+" Help Page: help ft-ada-syntax
+"------------------------------------------------------------------------------
+" The formal spec of Ada 2005 (ARM) is the "Ada 2005 Reference Manual".
+" For more Ada 2005 info, see http://www.gnuada.org and http://www.adapower.com.
+"
+" This vim syntax file works on vim 7.0 only and makes use of most of Voim 7.0
+" advanced features.
+"------------------------------------------------------------------------------
+
+if exists("b:current_syntax") || version < 700
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+let b:current_syntax = "ada"
+
+" Section: Ada is entirely case-insensitive. {{{1
+"
+syntax case ignore
+
+" Section: Highlighting commands {{{1
+"
+" There are 72 reserved words in total in Ada2005. Some keywords are
+" used in more than one way. For example:
+" 1. "end" is a general keyword, but "end if" ends a Conditional.
+" 2. "then" is a conditional, but "and then" is an operator.
+"
+for b:Item in g:ada#Keywords
+ " Standard Exceptions (including I/O).
+ " We'll highlight the standard exceptions, similar to vim's Python mode.
+ " It's possible to redefine the standard exceptions as something else,
+ " but doing so is very bad practice, so simply highlighting them makes sense.
+ if b:Item['kind'] == "x"
+ execute "syntax keyword adaException " . b:Item['word']
+ endif
+ if b:Item['kind'] == "a"
+ execute 'syntax match adaAttribute "\V' . b:Item['word'] . '"'
+ endif
+ " We don't normally highlight types in package Standard
+ " (Integer, Character, Float, etc.). I don't think it looks good
+ " with the other type keywords, and many Ada programs define
+ " so many of their own types that it looks inconsistent.
+ " However, if you want this highlighting, turn on "ada_standard_types".
+ " For package Standard's definition, see ARM section A.1.
+ if b:Item['kind'] == "t" && exists ("g:ada_standard_types")
+ execute "syntax keyword adaBuiltinType " . b:Item['word']
+ endif
+endfor
+
+" Section: others {{{1
+"
+syntax keyword adaLabel others
+
+" Section: Operatoren {{{1
+"
+syntax keyword adaOperator abs mod not rem xor
+syntax match adaOperator "\<and\>"
+syntax match adaOperator "\<and\s\+then\>"
+syntax match adaOperator "\<or\>"
+syntax match adaOperator "\<or\s\+else\>"
+syntax match adaOperator "[-+*/<>&]"
+syntax keyword adaOperator **
+syntax match adaOperator "[/<>]="
+syntax keyword adaOperator =>
+syntax match adaOperator "\.\."
+syntax match adaOperator "="
+
+" Section: <> {{{1
+"
+" Handle the box, <>, specially:
+"
+syntax keyword adaSpecial <>
+
+" Section: rainbow color {{{1
+"
+if exists("g:ada_rainbow_color")
+ syntax match adaSpecial "[:;.,]"
+ call rainbow_parenthsis#LoadRound ()
+ call rainbow_parenthsis#Activate ()
+else
+ syntax match adaSpecial "[:;().,]"
+endif
+
+" Section: := {{{1
+"
+" We won't map "adaAssignment" by default, but we need to map ":=" to
+" something or the "=" inside it will be mislabelled as an operator.
+" Note that in Ada, assignment (:=) is not considered an operator.
+"
+syntax match adaAssignment ":="
+
+" Section: Numbers, including floating point, exponents, and alternate bases. {{{1
+"
+syntax match adaNumber "\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>"
+syntax match adaNumber "\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\="
+
+" Section: Identify leading numeric signs {{{1
+"
+" In "A-5" the "-" is an operator, " but in "A:=-5" the "-" is a sign. This
+" handles "A3+-5" (etc.) correctly. " This assumes that if you put a
+" don't put a space after +/- when it's used " as an operator, you won't
+" put a space before it either -- which is true " in code I've seen.
+"
+syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1
+
+" Section: Labels for the goto statement. {{{1
+"
+syntax region adaLabel start="<<" end=">>"
+
+" Section: Boolean Constants {{{1
+" Boolean Constants.
+syntax keyword adaBoolean true false
+
+" Section: Warn C/C++ {{{1
+"
+" Warn people who try to use C/C++ notation erroneously:
+"
+syntax match adaError "//"
+syntax match adaError "/\*"
+syntax match adaError "=="
+
+
+" Section: Space Errors {{{1
+"
+if exists("g:ada_space_errors")
+ if !exists("g:ada_no_trail_space_error")
+ syntax match adaSpaceError excludenl "\s\+$"
+ endif
+ if !exists("g:ada_no_tab_space_error")
+ syntax match adaSpaceError " \+\t"me=e-1
+ endif
+ if !exists("g:ada_all_tab_usage")
+ syntax match adaSpecial "\t"
+ endif
+endif
+
+" Section: end {{{1
+" Unless special ("end loop", "end if", etc.), "end" marks the end of a
+" begin, package, task etc. Assigning it to adaEnd.
+syntax match adaEnd /\<end\>/
+
+syntax keyword adaPreproc pragma
+
+syntax keyword adaRepeat exit for loop reverse while
+syntax match adaRepeat "\<end\s\+loop\>"
+
+syntax keyword adaStatement accept delay goto raise requeue return
+syntax keyword adaStatement terminate
+syntax match adaStatement "\<abort\>"
+
+" Section: Handle Ada's record keywords. {{{1
+"
+" 'record' usually starts a structure, but "with null record;" does not,
+" and 'end record;' ends a structure. The ordering here is critical -
+" 'record;' matches a "with null record", so make it a keyword (this can
+" match when the 'with' or 'null' is on a previous line).
+" We see the "end" in "end record" before the word record, so we match that
+" pattern as adaStructure (and it won't match the "record;" pattern).
+"
+syntax match adaStructure "\<record\>" contains=adaRecord
+syntax match adaStructure "\<end\s\+record\>" contains=adaRecord
+syntax match adaKeyword "\<record;"me=e-1
+
+" Section: type classes {{{1
+"
+syntax keyword adaStorageClass abstract access aliased array at constant delta
+syntax keyword adaStorageClass digits limited of private range tagged
+syntax keyword adaStorageClass interface synchronized
+syntax keyword adaTypedef subtype type
+
+" Section: Conditionals {{{1
+"
+" "abort" after "then" is a conditional of its own.
+"
+syntax match adaConditional "\<then\>"
+syntax match adaConditional "\<then\s\+abort\>"
+syntax match adaConditional "\<else\>"
+syntax match adaConditional "\<end\s\+if\>"
+syntax match adaConditional "\<end\s\+case\>"
+syntax match adaConditional "\<end\s\+select\>"
+syntax keyword adaConditional if case select
+syntax keyword adaConditional elsif when
+
+" Section: other keywords {{{1
+syntax match adaKeyword "\<is\>" contains=adaRecord
+syntax keyword adaKeyword all do exception in new null out
+syntax keyword adaKeyword separate until overriding
+
+" Section: begin keywords {{{1
+"
+" These keywords begin various constructs, and you _might_ want to
+" highlight them differently.
+"
+syntax keyword adaBegin begin body declare entry generic
+syntax keyword adaBegin protected renames task
+
+syntax match adaBegin "\<function\>" contains=adaFunction
+syntax match adaBegin "\<procedure\>" contains=adaProcedure
+syntax match adaBegin "\<package\>" contains=adaPackage
+
+if exists("ada_with_gnat_project_files")
+ syntax keyword adaBegin project
+endif
+
+" Section: with, use {{{1
+"
+if exists("ada_withuse_ordinary")
+ " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases.
+ syntax keyword adaKeyword with use
+else
+ " Highlight "with" and "use" clauses like C's "#include" when they're used
+ " to reference other compilation units; otherwise they're ordinary keywords.
+ " If we have vim 6.0 or later, we'll use its advanced pattern-matching
+ " capabilities so that we won't match leading spaces.
+ syntax match adaKeyword "\<with\>"
+ syntax match adaKeyword "\<use\>"
+ syntax match adaBeginWith "^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
+ syntax match adaSemiWith ";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
+ syntax match adaInc "\<with\>" contained contains=NONE
+ syntax match adaInc "\<with\s\+type\>" contained contains=NONE
+ syntax match adaInc "\<use\>" contained contains=NONE
+ " Recognize "with null record" as a keyword (even the "record").
+ syntax match adaKeyword "\<with\s\+null\s\+record\>"
+ " Consider generic formal parameters of subprograms and packages as keywords.
+ syntax match adaKeyword ";\s*\zswith\s\+\(function\|procedure\|package\)\>"
+ syntax match adaKeyword "^\s*\zswith\s\+\(function\|procedure\|package\)\>"
+endif
+
+" Section: String and character constants. {{{1
+"
+syntax region adaString contains=@Spell start=+"+ skip=+""+ end=+"+
+syntax match adaCharacter "'.'"
+
+" Section: Todo (only highlighted in comments) {{{1
+"
+syntax keyword adaTodo contained TODO FIXME XXX NOTE
+
+" Section: Comments. {{{1
+"
+syntax region adaComment
+ \ oneline
+ \ contains=adaTodo,adaLineError,@Spell
+ \ start="--"
+ \ end="$"
+
+" Section: line errors {{{1
+"
+" Note: Line errors have become quite slow with Vim 7.0
+"
+if exists("g:ada_line_errors")
+ syntax match adaLineError "\(^.\{79}\)\@<=." contains=ALL containedin=ALL
+endif
+
+" Section: syntax folding {{{1
+"
+" Syntax folding is very tricky - for now I still suggest to use
+" indent folding
+"
+if exists("g:ada_folding") && g:ada_folding[0] == 's'
+ if stridx (g:ada_folding, 'p') >= 0
+ syntax region adaPackage
+ \ start="\(\<package\s\+body\>\|\<package\>\)\s*\z(\k*\)"
+ \ end="end\s\+\z1\s*;"
+ \ keepend extend transparent fold contains=ALL
+ endif
+ if stridx (g:ada_folding, 'f') >= 0
+ syntax region adaProcedure
+ \ start="\<procedure\>\s*\z(\k*\)"
+ \ end="\<end\>\s\+\z1\s*;"
+ \ keepend extend transparent fold contains=ALL
+ syntax region adaFunction
+ \ start="\<procedure\>\s*\z(\k*\)"
+ \ end="end\s\+\z1\s*;"
+ \ keepend extend transparent fold contains=ALL
+ endif
+ if stridx (g:ada_folding, 'f') >= 0
+ syntax region adaRecord
+ \ start="\<is\s\+record\>"
+ \ end="\<end\s\+record\>"
+ \ keepend extend transparent fold contains=ALL
+ endif
+endif
+
+" Section: The default methods for highlighting. Can be overridden later. {{{1
+"
+highlight def link adaCharacter Character
+highlight def link adaComment Comment
+highlight def link adaConditional Conditional
+highlight def link adaKeyword Keyword
+highlight def link adaLabel Label
+highlight def link adaNumber Number
+highlight def link adaSign Number
+highlight def link adaOperator Operator
+highlight def link adaPreproc PreProc
+highlight def link adaRepeat Repeat
+highlight def link adaSpecial Special
+highlight def link adaStatement Statement
+highlight def link adaString String
+highlight def link adaStructure Structure
+highlight def link adaTodo Todo
+highlight def link adaType Type
+highlight def link adaTypedef Typedef
+highlight def link adaStorageClass StorageClass
+highlight def link adaBoolean Boolean
+highlight def link adaException Exception
+highlight def link adaAttribute Tag
+highlight def link adaInc Include
+highlight def link adaError Error
+highlight def link adaSpaceError Error
+highlight def link adaLineError Error
+highlight def link adaBuiltinType Type
+highlight def link adaAssignment Special
+
+" Subsection: Begin, End {{{2
+"
+if exists ("ada_begin_preproc")
+ " This is the old default display:
+ highlight def link adaBegin PreProc
+ highlight def link adaEnd PreProc
+else
+ " This is the new default display:
+ highlight def link adaBegin Keyword
+ highlight def link adaEnd Keyword
+endif
+
+
+
+" Section: sync {{{1
+"
+" We don't need to look backwards to highlight correctly;
+" this speeds things up greatly.
+syntax sync minlines=1 maxlines=1
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+"vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+"vim: foldmethod=marker
diff --git a/runtime/syntax/aflex.vim b/runtime/syntax/aflex.vim
new file mode 100644
index 0000000..aa8b5f8
--- /dev/null
+++ b/runtime/syntax/aflex.vim
@@ -0,0 +1,82 @@
+
+" Vim syntax file
+" Language: AfLex (from Lex syntax file)
+" Maintainer: Mathieu Clabaut <mathieu.clabaut@free.fr>
+" LastChange: 02 May 2001
+" Original: Lex, maintained by Dr. Charles E. Campbell, Jr.
+" Comment: Replaced sourcing c.vim file by ada.vim and rename lex*
+" in aflex*
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the Ada syntax to start with
+runtime! syntax/ada.vim
+unlet b:current_syntax
+
+
+" --- AfLex stuff ---
+
+"I'd prefer to use aflex.* , but it doesn't handle forward definitions yet
+syn cluster aflexListGroup contains=aflexAbbrvBlock,aflexAbbrv,aflexAbbrv,aflexAbbrvRegExp,aflexInclude,aflexPatBlock,aflexPat,aflexBrace,aflexPatString,aflexPatTag,aflexPatTag,aflexPatComment,aflexPatCodeLine,aflexMorePat,aflexPatSep,aflexSlashQuote,aflexPatCode,cInParen,cUserLabel,cOctalZero,cCppSkip,cErrInBracket,cErrInParen,cOctalError,cCppOut2
+syn cluster aflexListPatCodeGroup contains=aflexAbbrvBlock,aflexAbbrv,aflexAbbrv,aflexAbbrvRegExp,aflexInclude,aflexPatBlock,aflexPat,aflexBrace,aflexPatTag,aflexPatTag,aflexPatComment,aflexPatCodeLine,aflexMorePat,aflexPatSep,aflexSlashQuote,cInParen,cUserLabel,cOctalZero,cCppSkip,cErrInBracket,cErrInParen,cOctalError,cCppOut2
+
+" Abbreviations Section
+syn region aflexAbbrvBlock start="^\([a-zA-Z_]\+\t\|%{\)" end="^%%$"me=e-2 skipnl nextgroup=aflexPatBlock contains=aflexAbbrv,aflexInclude,aflexAbbrvComment
+syn match aflexAbbrv "^\I\i*\s"me=e-1 skipwhite contained nextgroup=aflexAbbrvRegExp
+syn match aflexAbbrv "^%[sx]" contained
+syn match aflexAbbrvRegExp "\s\S.*$"lc=1 contained nextgroup=aflexAbbrv,aflexInclude
+syn region aflexInclude matchgroup=aflexSep start="^%{" end="%}" contained contains=ALLBUT,@aflexListGroup
+syn region aflexAbbrvComment start="^\s\+/\*" end="\*/"
+
+"%% : Patterns {Actions}
+syn region aflexPatBlock matchgroup=Todo start="^%%$" matchgroup=Todo end="^%%$" skipnl skipwhite contains=aflexPat,aflexPatTag,aflexPatComment
+syn region aflexPat start=+\S+ skip="\\\\\|\\." end="\s"me=e-1 contained nextgroup=aflexMorePat,aflexPatSep contains=aflexPatString,aflexSlashQuote,aflexBrace
+syn region aflexBrace start="\[" skip=+\\\\\|\\+ end="]" contained
+syn region aflexPatString matchgroup=String start=+"+ skip=+\\\\\|\\"+ matchgroup=String end=+"+ contained
+syn match aflexPatTag "^<\I\i*\(,\I\i*\)*>*" contained nextgroup=aflexPat,aflexPatTag,aflexMorePat,aflexPatSep
+syn match aflexPatTag +^<\I\i*\(,\I\i*\)*>*\(\\\\\)*\\"+ contained nextgroup=aflexPat,aflexPatTag,aflexMorePat,aflexPatSep
+syn region aflexPatComment start="^\s*/\*" end="\*/" skipnl contained contains=cTodo nextgroup=aflexPatComment,aflexPat,aflexPatString,aflexPatTag
+syn match aflexPatCodeLine ".*$" contained contains=ALLBUT,@aflexListGroup
+syn match aflexMorePat "\s*|\s*$" skipnl contained nextgroup=aflexPat,aflexPatTag,aflexPatComment
+syn match aflexPatSep "\s\+" contained nextgroup=aflexMorePat,aflexPatCode,aflexPatCodeLine
+syn match aflexSlashQuote +\(\\\\\)*\\"+ contained
+syn region aflexPatCode matchgroup=Delimiter start="{" matchgroup=Delimiter end="}" skipnl contained contains=ALLBUT,@aflexListPatCodeGroup
+
+syn keyword aflexCFunctions BEGIN input unput woutput yyleng yylook yytext
+syn keyword aflexCFunctions ECHO output winput wunput yyless yymore yywrap
+
+" <c.vim> includes several ALLBUTs; these have to be treated so as to exclude aflex* groups
+syn cluster cParenGroup add=aflex.*
+syn cluster cDefineGroup add=aflex.*
+syn cluster cPreProcGroup add=aflex.*
+syn cluster cMultiGroup add=aflex.*
+
+" Synchronization
+syn sync clear
+syn sync minlines=300
+syn sync match aflexSyncPat grouphere aflexPatBlock "^%[a-zA-Z]"
+syn sync match aflexSyncPat groupthere aflexPatBlock "^<$"
+syn sync match aflexSyncPat groupthere aflexPatBlock "^%%$"
+
+" Define the default highlighting.
+" 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"
+
+" vim:ts=10
diff --git a/runtime/syntax/ahdl.vim b/runtime/syntax/ahdl.vim
new file mode 100644
index 0000000..3a40dcf
--- /dev/null
+++ b/runtime/syntax/ahdl.vim
@@ -0,0 +1,81 @@
+" Vim syn file
+" Language: Altera AHDL
+" Maintainer: John Cook <john.cook@kla-tencor.com>
+" Last Change: 2001 Apr 25
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+"this language is oblivious to case.
+syn case ignore
+
+" a bunch of keywords
+syn keyword ahdlKeyword assert begin bidir bits buried case clique
+syn keyword ahdlKeyword connected_pins constant defaults define design
+syn keyword ahdlKeyword device else elsif end for function generate
+syn keyword ahdlKeyword gnd help_id if in include input is machine
+syn keyword ahdlKeyword node of options others output parameters
+syn keyword ahdlKeyword returns states subdesign table then title to
+syn keyword ahdlKeyword tri_state_node variable vcc when with
+
+" a bunch of types
+syn keyword ahdlIdentifier carry cascade dffe dff exp global
+syn keyword ahdlIdentifier jkffe jkff latch lcell mcell memory opendrn
+syn keyword ahdlIdentifier soft srffe srff tffe tff tri wire x
+
+syn keyword ahdlMegafunction lpm_and lpm_bustri lpm_clshift lpm_constant
+syn keyword ahdlMegafunction lpm_decode lpm_inv lpm_mux lpm_or lpm_xor
+syn keyword ahdlMegafunction busmux mux
+
+syn keyword ahdlMegafunction divide lpm_abs lpm_add_sub lpm_compare
+syn keyword ahdlMegafunction lpm_counter lpm_mult
+
+syn keyword ahdlMegafunction altdpram csfifo dcfifo scfifo csdpram lpm_ff
+syn keyword ahdlMegafunction lpm_latch lpm_shiftreg lpm_ram_dq lpm_ram_io
+syn keyword ahdlMegafunction lpm_rom lpm_dff lpm_tff clklock pll ntsc
+
+syn keyword ahdlTodo contained TODO
+
+" String constants
+syn region ahdlString start=+"+ skip=+\\"+ end=+"+
+
+" valid integer number formats (decimal, binary, octal, hex)
+syn match ahdlNumber '\<\d\+\>'
+syn match ahdlNumber '\<b"\(0\|1\|x\)\+"'
+syn match ahdlNumber '\<\(o\|q\)"\o\+"'
+syn match ahdlNumber '\<\(h\|x\)"\x\+"'
+
+" operators
+syn match ahdlOperator "[!&#$+\-<>=?:\^]"
+syn keyword ahdlOperator not and nand or nor xor xnor
+syn keyword ahdlOperator mod div log2 used ceil floor
+
+" one line and multi-line comments
+" (define these after ahdlOperator so -- overrides -)
+syn match ahdlComment "--.*" contains=ahdlNumber,ahdlTodo
+syn region ahdlComment start="%" end="%" contains=ahdlNumber,ahdlTodo
+
+" other special characters
+syn match ahdlSpecialChar "[\[\]().,;]"
+
+syn sync minlines=1
+
+" Define the default highlighting.
+" 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/aidl.vim b/runtime/syntax/aidl.vim
new file mode 100644
index 0000000..3a79433
--- /dev/null
+++ b/runtime/syntax/aidl.vim
@@ -0,0 +1,23 @@
+" Vim syntax file
+" Language: aidl (Android Interface Definition Language)
+" https://developer.android.com/guide/components/aidl
+" Maintainer: Dominique Pelle <dominique.pelle@tomtom.com>
+" LastChange: 2020/12/03
+
+" Quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+
+source <sfile>:p:h/java.vim
+
+syn keyword aidlParamDir in out inout
+syn keyword aidlKeyword const oneway parcelable
+
+" Needed for the 'in', 'out', 'inout' keywords to be highlighted.
+syn cluster javaTop add=aidlParamDir
+
+hi def link aidlParamDir StorageClass
+hi def link aidlKeyword Keyword
+
+let b:current_syntax = "aidl"
diff --git a/runtime/syntax/alsaconf.vim b/runtime/syntax/alsaconf.vim
new file mode 100644
index 0000000..143fcc0
--- /dev/null
+++ b/runtime/syntax/alsaconf.vim
@@ -0,0 +1,49 @@
+" Vim syntax file
+" Language: alsaconf(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword alsoconfTodo contained FIXME TODO XXX NOTE
+
+syn region alsaconfComment display oneline
+ \ start='#' end='$'
+ \ contains=alsaconfTodo,@Spell
+
+syn match alsaconfSpecialChar contained display '\\[ntvbrf]'
+syn match alsaconfSpecialChar contained display '\\\o\+'
+
+syn region alsaconfString start=+"+ skip=+\\$+ end=+"\|$+
+ \ contains=alsaconfSpecialChar
+
+syn match alsaconfSpecial contained display 'confdir:'
+
+syn region alsaconfPreProc start='<' end='>' contains=alsaconfSpecial
+
+syn match alsaconfMode display '[+?!-]'
+
+syn keyword alsaconfKeyword card default device errors files func strings
+syn keyword alsaconfKeyword subdevice type vars
+
+syn match alsaconfVariables display '@\(hooks\|func\|args\)'
+
+hi def link alsoconfTodo Todo
+hi def link alsaconfComment Comment
+hi def link alsaconfSpecialChar SpecialChar
+hi def link alsaconfString String
+hi def link alsaconfSpecial Special
+hi def link alsaconfPreProc PreProc
+hi def link alsaconfMode Special
+hi def link alsaconfKeyword Keyword
+hi def link alsaconfVariables Identifier
+
+let b:current_syntax = "alsaconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/amiga.vim b/runtime/syntax/amiga.vim
new file mode 100644
index 0000000..5a664c4
--- /dev/null
+++ b/runtime/syntax/amiga.vim
@@ -0,0 +1,88 @@
+" Vim syntax file
+" Language: AmigaDos
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Aug 31, 2016
+" Version: 10
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_AMIGA
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Amiga Devices
+syn match amiDev "\(par\|ser\|prt\|con\|nil\):"
+
+" Amiga aliases and paths
+syn match amiAlias "\<[a-zA-Z][a-zA-Z0-9]\+:"
+syn match amiAlias "\<[a-zA-Z][a-zA-Z0-9]\+:[a-zA-Z0-9/]*/"
+
+" strings
+syn region amiString start=+"+ end=+"+ oneline contains=@Spell
+
+" numbers
+syn match amiNumber "\<\d\+\>"
+
+" Logic flow
+syn region amiFlow matchgroup=Statement start="if" matchgroup=Statement end="endif" contains=ALL
+syn keyword amiFlow skip endskip
+syn match amiError "else\|endif"
+syn keyword amiElse contained else
+
+syn keyword amiTest contained not warn error fail eq gt ge val exists
+
+" echo exception
+syn region amiEcho matchgroup=Statement start="\<echo\>" end="$" oneline contains=amiComment
+syn region amiEcho matchgroup=Statement start="^\.[bB][rR][aA]" end="$" oneline
+syn region amiEcho matchgroup=Statement start="^\.[kK][eE][tT]" end="$" oneline
+
+" commands
+syn keyword amiKey addbuffers copy fault join pointer setdate
+syn keyword amiKey addmonitor cpu filenote keyshow printer setenv
+syn keyword amiKey alias date fixfonts lab printergfx setfont
+syn keyword amiKey ask delete fkey list printfiles setmap
+syn keyword amiKey assign dir font loadwb prompt setpatch
+syn keyword amiKey autopoint diskchange format lock protect sort
+syn keyword amiKey avail diskcopy get magtape quit stack
+syn keyword amiKey binddrivers diskdoctor getenv makedir relabel status
+syn keyword amiKey bindmonitor display graphicdump makelink remrad time
+syn keyword amiKey blanker iconedit more rename type
+syn keyword amiKey break ed icontrol mount resident unalias
+syn keyword amiKey calculator edit iconx newcli run unset
+syn keyword amiKey cd endcli ihelp newshell say unsetenv
+syn keyword amiKey changetaskpri endshell info nocapslock screenmode version
+syn keyword amiKey clock eval initprinter nofastmem search wait
+syn keyword amiKey cmd exchange input overscan serial wbpattern
+syn keyword amiKey colors execute install palette set which
+syn keyword amiKey conclip failat iprefs path setclock why
+
+" comments
+syn cluster amiCommentGroup contains=amiTodo,@Spell
+syn case ignore
+syn keyword amiTodo contained todo
+syn case match
+syn match amiComment ";.*$" contains=amiCommentGroup
+
+" sync
+syn sync lines=50
+
+" Define the default highlighting.
+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
new file mode 100644
index 0000000..46621ed
--- /dev/null
+++ b/runtime/syntax/aml.vim
@@ -0,0 +1,144 @@
+" Vim syntax file
+" Language: AML (ARC/INFO Arc Macro Language)
+" Written By: Nikki Knuit <Nikki.Knuit@gems3.gov.bc.ca>
+" Maintainer: Todd Glover <todd.glover@gems9.gov.bc.ca>
+" Last Change: 2001 May 10
+
+" FUTURE CODING: Bold application commands after &sys, &tty
+" Only highlight aml Functions at the beginning
+" of [], in order to avoid -read highlighted,
+" or [quote] strings highlighted
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" ARC, ARCEDIT, ARCPLOT, LIBRARIAN, GRID, SCHEMAEDIT reserved words,
+" defined as keywords.
+
+syn keyword amlArcCmd contained 2button abb abb[reviations] abs ac acos acosh add addc[ogoatt] addcogoatt addf[eatureclass] addh[istory] addi addim[age] addindexatt addit[em] additem addressb[uild] addressc[reate] addresse[rrors] addressedit addressm[atch] addressp[arse] addresst[est] addro[utemeasure] addroutemeasure addte[xt] addto[stack] addw[orktable] addx[y] adj[ust] adm[inlicense] adr[ggrid] ads adsa[rc] ae af ag[gregate] ai ai[request] airequest al alia[s] alig[n] alt[erarchive] am[sarc] and annoa[lignment] annoadd annocapture annocl[ip] annoco[verage] annocurve annoe[dit] annoedit annof annofeature annofit annoitem annola[yer] annole[vel] annolevel annoline annooffset annop[osition] annoplace annos[ize] annoselectfeatur annoset annosum annosymbol annot annot[ext] annotext annotype ao ap apm[ode] app[end] arc arcad[s] arcar[rows] arcc[ogo] arcdf[ad] arcdi[me] arcdl[g] arcdx[f] arced[it] arcedit arcen[dtext] arcf[ont] arcigd[s] arcige[s] arcla[bel] arcli[nes] arcma[rkers] arcmo[ss]
+syn keyword amlArcCmd contained arcpl[ot] arcplot arcpo[int] arcr[oute] arcs arcsc[itex] arcse[ction] arcsh[ape] arcsl[f] arcsn[ap] arcsp[ot] arcte[xt] arctig[er] arctin arcto[ols] arctools arcty[pe] area areaq[uery] arm arrow arrows[ize] arrowt[ype] as asc asciig[rid] asciih[elp] asciihelp asco[nnect] asconnect asd asda[tabase] asdi[sconnect] asdisconnect asel[ect] asex[ecute] asf asin asinh asp[ect] asr[eadlocks] ast[race] at atan atan2 atanh atusage aud[ittrail] autoi[ncrement] autol[ink] axis axish[atch] axisl[abels] axisr[uler] axist[ext] bac[klocksymbol] backcoverage backenvironment backnodeangleite backsymbolitem backtextitem base[select] basi[n] bat[ch] bc be be[lls] blackout blockmaj[ority] blockmax blockmea[n] blockmed[ian] blockmin blockmino[rity] blockr[ange] blockst[d] blocksu[m] blockv[ariety] bnai bou[ndaryclean] box br[ief] bsi bti buf[fer] bug[form] bugform build builds[ta] buildv[at] calco[mp] calcomp calcu[late] cali[brateroutes] calibrateroutes can[d] cartr[ead] cartread
+syn keyword amlArcCmd contained cartw[rite] cartwrite cei[l] cel[lvalue] cen[troidlabels] cgm cgme[scape] cha[nge] checkin checkinrel checkout checkoutrel chm[od] chown chownt[ransaction] chowntran chowntransaction ci ci[rcle] cir class classp[rob] classs[ig] classsample clean clear clears[elect] clip clipg[raphextent] clipm[apextent] clo[sedatabase] cntvrt co cod[efind] cog[oinverse] cogocom cogoenv cogomenu coll[ocate] color color2b[lue] color2g[reen] color2h[ue] color2r[ed] color2s[at] color2v[al] colorchart coloredit colorh[cbs] colorhcbs colu[mns] comb[ine] comm[ands] commands con connect connectu[ser] cons[ist] conto[ur] contr[olpoints] convertd[oc] convertdoc converti[mage] convertla[yer] convertli[brary] convertr[emap] convertw[orkspace] coo[rdinate] coordinate coordinates copy copyf[eatures] copyi[nfo] copyl[ayer] copyo copyo[ut] copyout copys[tack] copyw[orkspace] copyworkspace cor corr[idor] correlation cos cosh costa[llocation] costb[acklink] costd[istance] costp[ath] cou[ntvertices]
+syn keyword amlArcCmd contained countvertices cpw cr create create2[dindex] createa[ttributes] createca[talog] createco[go] createcogo createf[eature] createind[ex] createinf[otable] createlab[els] createlay[er] createli[brary] createn[etindex] creater[emap] creates[ystables] createta[blespace] createti[n] createw[orkspace] createworkspace cs culdesac curs[or] curv[ature] curve3pt cut[fill] cutoff cw cx[or] da dar[cyflow] dat[aset] dba[seinfo] dbmsc dbmsc[ursor] dbmscursor dbmse[xecute] dbmsi[nfo] dbmss[et] de delete deletea[rrows] deletet[ic] deletew[orkspace] deleteworkspace demg[rid] deml[attice] dend[rogram] densify densifya[rc] describe describea[rchive] describel[attice] describeti[n] describetr[ans] describetrans dev df[adarc] dg dif[f] digi[tizer] digt[est] dim[earc] dir dir[ectory] directory disa[blepanzoom] disconnect disconnectu[ser] disp disp[lay] display dissolve dissolvee[vents] dissolveevents dista[nce] distr[ibutebuild] div dl[garc] do doce[ll] docu[ment] document dogroup drag
+syn keyword amlArcCmd contained draw drawenvironment draworder draws[ig] drawselect drawt[raverses] drawz[oneshape] drop2[dindex] dropa[rchive] dropfeaturec[lass] dropfeatures dropfr[omstack] dropgroup droph[istory] dropind[ex] dropinf[otable] dropit[em] dropla[yer] droplib[rary] droplin[e] dropline dropn[etindex] dropt[ablespace] dropw[orktable] ds dt[edgrid] dtrans du[plicate] duplicatearcs dw dxf dxfa[rc] dxfi[nfo] dynamicpan dynpan ebe ec ed edg[esnap] edgematch editboundaryerro edit[coverage] editdistance editf editfeature editp[lot] editplot edits[ig] editsymbol ef el[iminate] em[f] en[d] envrst envsav ep[s] eq equ[alto] er[ase] es et et[akarc] euca[llocation] eucdir[ection] eucdis[tance] eval eventa[rc] evente[nds] eventh[atch] eventi[nfo] eventlinee[ndtext] eventlines eventlinet[ext] eventlis[t] eventma[rkers] eventme[nu] eventmenu eventpoint eventpointt[ext] eventse[ction] eventso[urce] eventt[ransform] eventtransform exi[t] exp exp1[0] exp2 expa[nd] expo[rt] exten[d] external externala[ll]
+syn keyword amlArcCmd contained fd[convert] featuregroup fg fie[lddata] file fill filt[er] fix[ownership] flip flipa[ngle] float floatg[rid] floo[r] flowa[ccumulation] flowd[irection] flowl[ength] fm[od] focalf[low] focalmaj[ority] focalmax focalmea[n] focalmed[ian] focalmin focalmino[rity] focalr[ange] focalst[d] focalsu[m] focalv[ariety] fonta[rc] fontco[py] fontcr[eate] fontd[elete] fontdump fontl[oad] fontload forc[e] form[edit] formedit forms fr[equency] ge geary general[ize] generat[e] gerbera[rc] gerberr[ead] gerberread gerberw[rite] gerberwrite get getz[factor] gi gi[rasarc] gnds grai[n] graphb[ar] graphe[xtent] graphi[cs] graphicimage graphicview graphlim[its] graphlin[e] graphp[oint] graphs[hade] gray[shade] gre[aterthan] grid grida[scii] gridcl[ip] gridclip gridco[mposite] griddesk[ew] griddesp[eckle] griddi[rection] gride[dit] gridfli[p] gridflo[at] gridim[age] gridin[sert] gridl[ine] gridma[jority] gridmi[rror] gridmo[ss] gridn[et] gridnodatasymbol gridpa[int] gridpoi[nt] gridpol[y]
+syn keyword amlArcCmd contained gridq[uery] gridr[otate] gridshad[es] gridshap[e] gridshi[ft] gridw[arp] group groupb[y] gt gv gv[tolerance] ha[rdcopy] he[lp] help hid[densymbol] hig[hlow] hil[lshade] his[togram] historicalview ho[ldadjust] hpgl hpgl2 hsv2b[lue] hsv2g[reen] hsv2r[ed] ht[ml] hview ia ided[it] identif[y] identit[y] idw if igdsa[rc] igdsi[nfo] ige[sarc] il[lustrator] illustrator image imageg[rid] imagep[lot] imageplot imageview imp[ort] in index indexi[tem] info infodba[se] infodbm[s] infof[ile] init90[00] init9100 init9100b init91[00] init95[00] int intersect intersectarcs intersecte[rr] isn[ull] iso[cluster] it[ems] iview j[oinitem] join keeps keepselect keyan[gle] keyar[ea] keyb[ox] keyf[orms] keyl[ine] keym keym[arker] keymap keyp[osition] keyse[paration] keysh[ade] keyspot kill killm[ap] kr[iging] la labela[ngle] labele[rrors] labelm[arkers] labels labelsc[ale] labelsp[ot] labelt[ext] lal latticecl[ip] latticeco[ntour] latticed[em] latticem[erge] latticemarkers latticeo[perate]
+syn keyword amlArcCmd contained latticep[oly] latticerep[lace] latticeres[ample] lattices[pot] latticet[in] latticetext layer layera[nno] layerca[lculate] layerco[lumns] layerde[lete] layerdo[ts] layerdr[aw] layere[xport] layerf[ilter] layerid[entify] layerim[port] layerio[mode] layerli[st] layerloc[k] layerlog[file] layerq[uery] layerse[arch] layersp[ot] layert[ext] lc ldbmst le leadera[rrows] leaders leadersy[mbol] leadert[olerance] len[gth] les[sthan] lf lg lh li lib librari[an] library limitadjust limitautolink line line2pt linea[djustment] linecl[osureangle] linecolor linecolorr[amp] linecopy linecopyl[ayer] linedelete linedeletel[ayer] lineden[sity] linedir[ection] linedis[t] lineedit lineg[rid] lineh[ollow] lineinf[o] lineint[erval] linel[ayer] linelist linem[iterangle] lineo[ffset] linepa[ttern] linepe[n] linepu[t] linesa[ve] linesc[ale] linese[t] linesi[ze] linest[ats] linesy[mbol] linete[mplate]
+syn keyword amlArcCmd contained linety[pe] link[s] linkfeatures list listarchives listatt listc[overages] listcoverages listdbmstables listg[rids] listgrids listhistory listi[mages] listimages listinfotables listlayers listlibraries listo[utput] listse[lect] listst[acks] liststacks listtablespaces listti[ns] listtins listtr[averses] listtran listtransactions listw[orkspaces] listworkspaces lit ll ll[sfit] lla lm ln load loada[djacent] loadcolormap locko[nly] locks[ymbol] log log1[0] log2 logf[ile] logg[ing] loo[kup] lot[area] lp[os] lstk lt lts lw madditem majority majorityf[ilter] makere[gion] makero[ute] makese[ction] makest[ack] mal[ign] map mapa[ngle] mape[xtent] mapextent mapi[nfo] mapj[oin] mapl[imits] mappo[sition] mappr[ojection] mapsc[ale] mapsh[ift] mapu[nits] mapw[arp] mapz[oom] marker markera[ngle] markercolor markercolorr[amp] markercopy markercopyl[ayer] markerdelete markerdeletel[aye] markeredit markerf[ont] markeri[nfo] markerl[ayer] markerlist markerm[ask] markero[ffset]
+syn keyword amlArcCmd contained markerpa[ttern] markerpe[n] markerpu[t] markersa[ve] markersc[ale] markerse[t] markersi[ze] markersy[mbol] mas[elect] matchc[over] matchn[ode] max mb[egin] mc[opy] md[elete] me mean measure measurer[oute] measureroute med mend menu[cover] menuedit menv[ironment] merge mergeh[istory] mergev[at] mfi[t] mfr[esh] mg[roup] miadsa[rc] miadsr[ead] miadsread min minf[o] mino[rity] mir[ror] mitems mjoin ml[classify] mma[sk] mmo[ve] mn[select] mod mor[der] moran mosa[ic] mossa[rc] mossg[rid] move movee[nd] movei[tem] mp[osition] mr mr[otate] msc[ale] mse[lect] mselect mt[olerance] mu[nselect] multcurve multinv multipleadditem multipleitems multiplejoin multipleselect multprop mw[ho] nai ne near neatline neatlineg[rid] neatlineh[atch] neatlinel[abels] neatlinet[ics] new next ni[bble] nodeangleitem nodec[olor] nodee[rrors] nodem[arkers] nodep[oint] nodes nodesi[ze] nodesn[ap] nodesp[ot] nodet[ext] nor[mal] not ns[elect] oe ogrid ogridt[ool] oldwindow oo[ps] op[endatabase] or
+syn keyword amlArcCmd contained osymbol over overflow overflowa[rea] overflowp[osition] overflows[eparati] overl[ayevents] overlapsymbol overlayevents overp[ost] pagee[xtent] pages[ize] pageu[nits] pal[info] pan panview par[ticletrack] patc[h] path[distance] pe[nsize] pi[ck] pli[st] plot plotcopy plotg[erber] ploti[con] plotmany plotpanel plotsc[itex] plotsi[f] pointde[nsity] pointdist pointdista[nce] pointdo[ts] pointg[rid] pointi[nterp] pointm[arkers] pointn[ode] points pointsp[ot] pointst[ats] pointt[ext] polygonb[ordertex] polygond[ots] polygone[vents] polygonevents polygonl[ines] polygons polygonsh[ades] polygonsi[zelimit] polygonsp[ot] polygont[ext] polygr[id] polyr[egion] pop[ularity] por[ouspuff] pos pos[tscript] positions postscript pow prec[ision] prep[are] princ[omp] print product producti[nfo] project projectcom[pare] projectcop[y] projectd[efine] pul[litems] pur[gehistory] put pv q q[uit] quit rand rang[e] rank rb rc re readg[raphic] reads[elect] reb[ox] recl[ass] recoverdb rect[ify]
+syn keyword amlArcCmd contained red[o] refreshview regionb[uffer] regioncla[ss] regioncle[an] regiondi[ssolve] regiondo[ts] regione[rrors] regiong[roup] regionj[oin] regionl[ines] regionpoly regionpolyc[ount] regionpolycount regionpolyl[ist] regionpolylist regionq[uery] regions regionse[lect] regionsh[ades] regionsp[ot] regiont[ext] regionxa[rea] regionxarea regionxt[ab] regionxtab register registerd[bms] regr[ession] reindex rej[ects] rela[te] rele[ase] rem remapgrid reme[asure] remo[vescalar] remove removeback removecover removeedit removesnap removetransfer rename renamew[orkspace] renameworkspace reno[de] rep[lace] reposition resa[mple] resel[ect] reset resh[ape] restore restorearce[dit] restorearch[ive] resu[me] rgb2h[ue] rgb2s[at] rgb2v[al] rotate rotatep[lot] routea[rc] routeends routeendt[ext] routeer[rors] routeev[entspot] routeh[atch] routel[ines] routes routesp[ot] routest[ats] routet[ext] rp rs rt rt[l] rtl rv rw sa sai sample samples[ig] sav[e] savecolormap sc scal[ar] scat[tergram]
+syn keyword amlArcCmd contained scenefog sceneformat scenehaze sceneoversample sceneroll scenesave scenesize scenesky scitexl[ine] scitexpoi[nt] scitexpol[y] scitexr[ead] scitexread scitexw[rite] scitexwrite sco screenr[estore] screens[ave] sd sds sdtse[xport] sdtsim[port] sdtsin[fo] sdtsl[ist] se sea[rchtolerance] sectiona[rc] sectionends sectionendt[ext] sectionh[atch] sectionl[ines] sections sectionsn[ap] sectionsp[ot] sectiont[ext] sel select selectb[ox] selectc[ircle] selectg[et] selectm[ask] selectmode selectpoi[nt] selectpol[ygon] selectpu[t] selectt[ype] selectw[ithin] semivariogram sep[arator] separator ser[verstatus] setan[gle] setar[row] setce[ll] setcoa[lesce] setcon[nectinfo] setd[bmscheckin] setdrawsymbol sete[ditmode] setincrement setm[ask] setn[ull] setools setreference setsymbol setturn setw[indow] sext sf sfmt sfo sha shade shadea[ngle] shadeb[ackcolor] shadecolor shadecolorr[amp] shadecopy shadecopyl[ayer] shadedelete shadedeletel[ayer] shadeedit shadegrid shadei[nfo] shadela[yer]
+syn keyword amlArcCmd contained shadeli[nepattern] shadelist shadeo[ffset] shadepa[ttern] shadepe[n] shadepu[t] shadesa[ve] shadesc[ale] shadesep[aration] shadeset shadesi[ze] shadesy[mbol] shadet[ype] shapea[rc] shapef[ile] shapeg[rid] shi[ft] show showconstants showe[ditmode] shr[ink] si sin sinfo sing[leuser] sinh sink sit[e] sl slf[arc] sli[ce] slo[pe] sm smartanno snap snapc[over] snapcover snapcoverage snapenvironment snapfeatures snapitems snapo[rder] snappi[ng] snappo[ur] so[rt] sobs sos spi[der] spiraltrans spline splinem[ethod] split spot spoto[ffset] spots[ize] sproj sqr sqrt sra sre srl ss ssc ssh ssi ssky ssz sta stackh[istogram] stackprofile stacksc[attergram] stackshade stackst[ats] stati[stics] statu[s] statuscogo std stra[ighten] streamline streamlink streamo[rder] stri[pmap] subm[it] subs[elect] sum surface surfaceabbrev surfacecontours surfacedefaults surfacedrape surfaceextent surfaceinfo surfacel[ength] surfacelimits surfacemarker surfacemenu surfaceobserver surfaceprofile
+syn keyword amlArcCmd contained surfaceprojectio surfacerange surfaceresolutio surfacesave surfacescene surfaceshade surfacesighting surfacetarget surfacevalue surfaceviewfield surfaceviewshed surfacevisibility surfacexsection surfacezoom surfacezscale sv svfd svs sxs symboldump symboli[tem] symbolsa[ve] symbolsc[ale] symbolse[t] symbolset sz tab[les] tal[ly] tan tanh tc te tes[t] text textal[ignment] textan[gle] textcolor textcolorr[amp] textcop[y] textde[lete] textdi[rection] textedit textfil[e] textfit textfo[nt] textin[fo] textit[em] textj[ustificatio] textlist textm[ask] texto[ffset] textpe[n] textpr[ecision] textpu[t] textq[uality] textsa[ve] textsc[ale] textse[t] textset textsi[ze] textsl[ant] textspa[cing] textspl[ine] textst[yle] textsy[mbol] tf th thie[ssen] thin ti tics tict[ext] tigera[rc] tigert[ool] tigertool til[es] timped tin tina[rc] tinc[ontour] tinerrors tinhull tinl[attice] tinlines tinmarkers tins[pot] tinshades tintext tinv[rml] tl tm tol[erance] top[ogrid] topogridtool
+syn keyword amlArcCmd contained transa[ction] transfe[r] transfercoverage transferfeature transferitems transfersymbol transfo[rm] travrst travsav tre[nd] ts tsy tt tur[ntable] turnimpedance tut[orial] una[ry] unde[lete] undo ungenerate ungeneratet[in] unio[n] unit[s] unr[egisterdbms] unse[lect] unsp[lit] update updatei[nfoschema] updatel[abels] upo[s] us[age] v va[riety] vcgl vcgl2 veri[fy] vers[ion] vertex viewrst viewsav vip visd[ecode] visdecode vise[ncode] visencode visi[bility] vo[lume] vpfe[xport] vpfi[mport] vpfl[ist] vpft[ile] w war[p] wat[ershed] weedd[raw] weedo[perator] weedt[olerance] weedtolerance whe[re] whi[le] who wi[ndows] wm[f] wo[rkspace] workspace writec[andidates] writeg[raphic] writes[elect] wt x[or] ze[ta] zeta zi zo zonala[rea] zonalc[entroid] zonalf[ill] zonalg[eometry] zonalmaj[ority] zonalmax zonalmea[n] zonalmed[ian] zonalmin zonalmino[rity] zonalp[erimeter] zonalr[ange] zonalsta[ts] zonalstd zonalsu[m] zonalt[hickness] zonalv[ariety] zoomview zv
+
+" FORMEDIT reserved words, defined as keywords.
+
+syn keyword amlFormedCmd contained button choice display help input slider text
+
+" TABLES reserved words, defined as keywords.
+
+syn keyword amlTabCmd contained add additem alter asciihelp aselect at calc calculate change commands commit copy define directory dropindex dropitem erase external get help indexitem items kill list move nselect purge quit redefine rename reselect rollback save select show sort statistics unload update usagecontained
+
+" INFO reserved words, defined as keywords.
+
+syn keyword amlInfoCmd contained accept add adir alter dialog alter alt directory aret arithmetic expressions aselect automatic return calculate cchr change options change comi cominput commands list como comoutput compile concatenate controlling defaults copy cursor data delete data entry data manipulate data retrieval data update date format datafile create datafile management decode define delimiter dfmt directory management directory display do doend documentation done end environment erase execute exiting expand export external fc files first format forms control get goto help import input form ipf internal item types items label lchar list logical expressions log merge modify options modify move next nselect output password prif print programming program protect purge query quit recase redefine relate relate release notes remark rename report options reporting report reselect reserved words restrictions run save security select set sleep sort special form spool stop items system variables take terminal types terminal time topics list type update upf
+
+" VTRACE reserved words, defined as keywords.
+
+syn keyword amlVtrCmd contained add al arcscan arrowlength arrowwidth as aw backtrack branch bt cj clearjunction commands cs dash endofline endofsession eol eos fan fg foreground gap generalizetolerance gtol help hole js junctionsensitivity linesymbol linevariation linewidth ls lv lw markersymbol mode ms raster regionofinterest reset restore retrace roi save searchradius skip sr sta status stc std str straightenangle straightencorner straightendistance straightenrange vt vtrace
+
+" The AML reserved words, defined as keywords.
+
+syn keyword amlFunction contained abs access acos after angrad asin atan before calc close copy cos cover coverage cvtdistance date delete dignum dir directory entryname exist[s] exp extract file filelist format formatdate full getchar getchoice getcover getdatabase getdeflayers getfile getgrid getimage getitem getlayercols getlibrary getstack getsymbol gettin getunique iacclose iacconnect iacdisconnect iacopen iacrequest index indexed info invangle invdistance iteminfo joinfile keyword length listfile listitem listunique locase log max menu min mod noecho null okangle okdistance open pathname prefix query quote quoteexists r radang random read rename response round scratchname search show sin sort sqrt subst substr suffix tan task token translate trim truncate type unquote upcase username value variable verify write
+
+syn keyword amlDir contained abbreviations above all aml amlpath append arc args atool brief by call canvas cc center cl codepage commands conv_watch_to_aml coordinates cr create current cursor cwta dalines data date_format delete delvar describe dfmt digitizer display do doend dv echo else enable encode encrypt end error expansion fail file flushpoints force form format frame fullscreen function getlastpoint getpoint goto iacreturn if ignore info inform key keypad label lc left lf lg list listchar listfiles listglobal listheader listlocal listprogram listvar ll lp lr lv map matrix menu menupath menutype mess message[s] modal mouse nopaging off on others page pause pinaction popup position pt pulldown push pushpoint r repeat return right routine run runwatch rw screen seconds select self setchar severity show sidebar single size staggered station stop stripe sys system tablet tb terminal test then thread to top translate tty ty type uc ul until ur usage w warning watch when while window workspace
+
+syn keyword amlDir2 contained delvar dv s set setvar sv
+
+syn keyword amlOutput contained inform warning error pause stop tty ty type
+
+
+" AML Directives:
+syn match amlDirSym "&"
+syn match amlDirective "&[a-zA-Z]*" contains=amlDir,amlDir2,amlDirSym
+
+" AML Functions
+syn region amlFunc start="\[ *[a-zA-Z]*" end="\]" contains=amlFunction,amlVar
+syn match amlFunc2 "\[.*\[.*\].*\]" contains=amlFunction,amlVar
+
+" Numbers:
+"syn match amlNumber "-\=\<[0-9]*\.\=[0-9_]\>"
+
+" Quoted Strings:
+syn region amlQuote start=+"+ skip=+\\"+ end=+"+ contains=amlVar
+syn region amlQuote start=+'+ skip=+\\'+ end=+'+
+
+" ARC Application Commands only selected at the beginning of the line,
+" or after a one line &if &then statement
+syn match amlAppCmd "^ *[a-zA-Z]*" contains=amlArcCmd,amlInfoCmd,amlTabCmd,amlVtrCmd,amlFormedCmd
+syn region amlAppCmd start="&then" end="$" contains=amlArcCmd,amlFormedCmd,amlInfoCmd,amlTabCmd,amlVtrCmd,amlFunction,amlDirective,amlVar2,amlSkip,amlVar,amlComment
+
+" Variables
+syn region amlVar start="%" end="%"
+syn region amlVar start="%" end="%" contained
+syn match amlVar2 "&s [a-zA-Z_.0-9]*" contains=amlDir2,amlDirSym
+syn match amlVar2 "&sv [a-zA-Z_.0-9]*" contains=amlDir2,amlDirSym
+syn match amlVar2 "&set [a-zA-Z_.0-9]*" contains=amlDir2,amlDirSym
+syn match amlVar2 "&setvar [a-zA-Z_.0-9]*" contains=amlDir2,amlDirSym
+syn match amlVar2 "&dv [a-zA-Z_.0-9]*" contains=amlDir2,amlDirSym
+syn match amlVar2 "&delvar [a-zA-Z_.0-9]*" contains=amlDir2,amlDirSym
+
+" Formedit 2 word commands
+syn match amlFormed "^ *check box"
+syn match amlFormed "^ *data list"
+syn match amlFormed "^ *symbol list"
+
+" Tables 2 word commands
+syn match amlTab "^ *q stop"
+syn match amlTab "^ *quit stop"
+
+" Comments:
+syn match amlComment "/\*.*"
+
+" Regions for skipping over (not highlighting) program output strings:
+syn region amlSkip matchgroup=amlOutput start="&call" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&routine" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&inform" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&return &inform" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&return &warning" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&return &error" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&pause" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&stop" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&tty" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&ty" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&typ" end="$" contains=amlVar
+syn region amlSkip matchgroup=amlOutput start="&type" end="$" contains=amlVar
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..ad78f7d
--- /dev/null
+++ b/runtime/syntax/ampl.vim
@@ -0,0 +1,140 @@
+" Language: ampl (A Mathematical Programming Language)
+" Maintainer: Krief David <david.krief@etu.enseeiht.fr> or <david_krief@hotmail.com>
+" Last Change: 2003 May 11
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+
+"--
+syn match amplEntityKeyword "\(subject to\)\|\(subj to\)\|\(s\.t\.\)"
+syn keyword amplEntityKeyword minimize maximize objective
+
+syn keyword amplEntityKeyword coeff coef cover obj default
+syn keyword amplEntityKeyword from to to_come net_in net_out
+syn keyword amplEntityKeyword dimen dimension
+
+
+
+"--
+syn keyword amplType integer binary set param var
+syn keyword amplType node ordered circular reversed symbolic
+syn keyword amplType arc
+
+
+
+"--
+syn keyword amplStatement check close \display drop include
+syn keyword amplStatement print printf quit reset restore
+syn keyword amplStatement solve update write shell model
+syn keyword amplStatement data option let solution fix
+syn keyword amplStatement unfix end function pipe format
+
+
+
+"--
+syn keyword amplConditional if then else and or
+syn keyword amplConditional exists forall in not within
+
+
+
+"--
+syn keyword amplRepeat while repeat for
+
+
+
+"--
+syn keyword amplOperators union diff difference symdiff sum
+syn keyword amplOperators inter intersect intersection cross setof
+syn keyword amplOperators by less mod div product
+"syn keyword amplOperators min max
+"conflict between functions max, min and operators max, min
+
+syn match amplBasicOperators "||\|<=\|==\|\^\|<\|=\|!\|-\|\.\.\|:="
+syn match amplBasicOperators "&&\|>=\|!=\|\*\|>\|:\|/\|+\|\*\*"
+
+
+
+
+"--
+syn match amplComment "\#.*"
+syn region amplComment start=+\/\*+ end=+\*\/+
+
+syn region amplStrings start=+\'+ skip=+\\'+ end=+\'+
+syn region amplStrings start=+\"+ skip=+\\"+ end=+\"+
+
+syn match amplNumerics "[+-]\=\<\d\+\(\.\d\+\)\=\([dDeE][-+]\=\d\+\)\=\>"
+syn match amplNumerics "[+-]\=Infinity"
+
+
+"--
+syn keyword amplSetFunction card next nextw prev prevw
+syn keyword amplSetFunction first last member ord ord0
+
+syn keyword amplBuiltInFunction abs acos acosh alias asin
+syn keyword amplBuiltInFunction asinh atan atan2 atanh ceil
+syn keyword amplBuiltInFunction cos exp floor log log10
+syn keyword amplBuiltInFunction max min precision round sin
+syn keyword amplBuiltInFunction sinh sqrt tan tanh trunc
+
+syn keyword amplRandomGenerator Beta Cauchy Exponential Gamma Irand224
+syn keyword amplRandomGenerator Normal Poisson Uniform Uniform01
+
+
+
+"-- to highlight the 'dot-suffixes'
+syn match amplDotSuffix "\h\w*\.\(lb\|ub\)"hs=e-2
+syn match amplDotSuffix "\h\w*\.\(lb0\|lb1\|lb2\|lrc\|ub0\)"hs=e-3
+syn match amplDotSuffix "\h\w*\.\(ub1\|ub2\|urc\|val\|lbs\|ubs\)"hs=e-3
+syn match amplDotSuffix "\h\w*\.\(init\|body\|dinit\|dual\)"hs=e-4
+syn match amplDotSuffix "\h\w*\.\(init0\|ldual\|slack\|udual\)"hs=e-5
+syn match amplDotSuffix "\h\w*\.\(lslack\|uslack\|dinit0\)"hs=e-6
+
+
+
+"--
+syn match amplPiecewise "<<\|>>"
+
+
+
+"-- Todo.
+syn keyword amplTodo contained TODO FIXME XXX
+
+
+
+
+
+
+
+
+
+
+
+" 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
+
+
+let b:current_syntax = "ampl"
+
+" vim: ts=8
+
+
diff --git a/runtime/syntax/ant.vim b/runtime/syntax/ant.vim
new file mode 100644
index 0000000..6696f96
--- /dev/null
+++ b/runtime/syntax/ant.vim
@@ -0,0 +1,97 @@
+" Vim syntax file
+" Language: ANT build file (xml)
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Tue Apr 27 13:05:59 CEST 2004
+" Filenames: build.xml
+" $Id: ant.vim,v 1.1 2004/06/13 18:13:18 vimboss Exp $
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:ant_cpo_save = &cpo
+set cpo&vim
+
+runtime! syntax/xml.vim
+
+syn case ignore
+
+if !exists('*AntSyntaxScript')
+ fun AntSyntaxScript(tagname, synfilename)
+ unlet b:current_syntax
+ let s:include = expand("<sfile>:p:h").'/'.a:synfilename
+ if filereadable(s:include)
+ exe 'syn include @ant'.a:tagname.' '.s:include
+ else
+ exe 'syn include @ant'.a:tagname." $VIMRUNTIME/syntax/".a:synfilename
+ endif
+
+ exe 'syn region ant'.a:tagname
+ \." start=#<script[^>]\\{-}language\\s*=\\s*['\"]".a:tagname."['\"]\\(>\\|[^>]*[^/>]>\\)#"
+ \.' end=#</script>#'
+ \.' fold'
+ \.' contains=@ant'.a:tagname.',xmlCdataStart,xmlCdataEnd,xmlTag,xmlEndTag'
+ \.' keepend'
+ exe 'syn cluster xmlRegionHook add=ant'.a:tagname
+ endfun
+endif
+
+" TODO: add more script languages here ?
+call AntSyntaxScript('javascript', 'javascript.vim')
+call AntSyntaxScript('jpython', 'python.vim')
+
+
+syn cluster xmlTagHook add=antElement
+
+syn keyword antElement display WsdlToDotnet addfiles and ant antcall antstructure apply archives arg argument
+syn keyword antElement display assertions attrib attribute available basename bcc blgenclient bootclasspath
+syn keyword antElement display borland bottom buildnumber buildpath buildpathelement bunzip2 bzip2 cab
+syn keyword antElement display catalogpath cc cccheckin cccheckout cclock ccmcheckin ccmcheckintask ccmcheckout
+syn keyword antElement display ccmcreatetask ccmkattr ccmkbl ccmkdir ccmkelem ccmklabel ccmklbtype
+syn keyword antElement display ccmreconfigure ccrmtype ccuncheckout ccunlock ccupdate checksum chgrp chmod
+syn keyword antElement display chown classconstants classes classfileset classpath commandline comment
+syn keyword antElement display compilerarg compilerclasspath concat concatfilter condition copy copydir
+syn keyword antElement display copyfile coveragepath csc custom cvs cvschangelog cvspass cvstagdiff cvsversion
+syn keyword antElement display daemons date defaultexcludes define delete deletecharacters deltree depend
+syn keyword antElement display depends dependset depth description different dirname dirset disable dname
+syn keyword antElement display doclet doctitle dtd ear echo echoproperties ejbjar element enable entity entry
+syn keyword antElement display env equals escapeunicode exclude excludepackage excludesfile exec execon
+syn keyword antElement display existing expandproperties extdirs extension extensionSet extensionset factory
+syn keyword antElement display fail filelist filename filepath fileset filesmatch filetokenizer filter
+syn keyword antElement display filterchain filterreader filters filterset filtersfile fixcrlf footer format
+syn keyword antElement display from ftp generic genkey get gjdoc grant group gunzip gzip header headfilter http
+syn keyword antElement display ignoreblank ilasm ildasm import importtypelib include includesfile input iplanet
+syn keyword antElement display iplanet-ejbc isfalse isreference isset istrue jar jarlib-available
+syn keyword antElement display jarlib-manifest jarlib-resolve java javac javacc javadoc javadoc2 jboss jdepend
+syn keyword antElement display jjdoc jjtree jlink jonas jpcoverage jpcovmerge jpcovreport jsharpc jspc
+syn keyword antElement display junitreport jvmarg lib libfileset linetokenizer link loadfile loadproperties
+syn keyword antElement display location macrodef mail majority manifest map mapper marker mergefiles message
+syn keyword antElement display metainf method mimemail mkdir mmetrics modified move mparse none not options or
+syn keyword antElement display os outputproperty package packageset parallel param patch path pathconvert
+syn keyword antElement display pathelement patternset permissions prefixlines present presetdef project
+syn keyword antElement display property propertyfile propertyref propertyset pvcs pvcsproject record reference
+syn keyword antElement display regexp rename renameext replace replacefilter replaceregex replaceregexp
+syn keyword antElement display replacestring replacetoken replacetokens replacevalue replyto report resource
+syn keyword antElement display revoke rmic root rootfileset rpm scp section selector sequential serverdeploy
+syn keyword antElement display setproxy signjar size sleep socket soscheckin soscheckout sosget soslabel source
+syn keyword antElement display sourcepath sql src srcfile srcfilelist srcfiles srcfileset sshexec stcheckin
+syn keyword antElement display stcheckout stlabel stlist stringtokenizer stripjavacomments striplinebreaks
+syn keyword antElement display striplinecomments style subant substitution support symlink sync sysproperty
+syn keyword antElement display syspropertyset tabstospaces tag taglet tailfilter tar tarfileset target
+syn keyword antElement display targetfile targetfilelist targetfileset taskdef tempfile test testlet text title
+syn keyword antElement display to token tokenfilter touch transaction translate triggers trim tstamp type
+syn keyword antElement display typedef unjar untar unwar unzip uptodate url user vbc vssadd vsscheckin
+syn keyword antElement display vsscheckout vsscp vsscreate vssget vsshistory vsslabel waitfor war wasclasspath
+syn keyword antElement display webapp webinf weblogic weblogictoplink websphere whichresource wlclasspath
+syn keyword antElement display wljspc wsdltodotnet xmlcatalog xmlproperty xmlvalidate xslt zip zipfileset
+syn keyword antElement display zipgroupfileset
+
+hi def link antElement Statement
+
+let b:current_syntax = "ant"
+
+let &cpo = s:ant_cpo_save
+unlet s:ant_cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/antlr.vim b/runtime/syntax/antlr.vim
new file mode 100644
index 0000000..9b0b061
--- /dev/null
+++ b/runtime/syntax/antlr.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" Antlr: ANTLR, Another Tool For Language Recognition <www.antlr.org>
+" Maintainer: Mathieu Clabaut <mathieu.clabaut@free.fr>
+" LastChange: 02 May 2001
+" Original: Comes from JavaCC.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" This syntac file is a first attempt. It is far from perfect...
+
+" Uses java.vim, and adds a few special things for JavaCC Parser files.
+" Those files usually have the extension *.jj
+
+" source the java.vim file
+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)
+syn match javaParen "--"
+syn match javaParenError "--"
+syn match javaInParen "--"
+syn match javaError2 "--"
+syn clear javaParen
+syn clear javaParenError
+syn clear javaInParen
+syn clear javaError2
+
+" remove function definitions (they look different) (first define in
+" in case it was not defined in java.vim)
+"syn match javaFuncDef "--"
+"syn clear javaFuncDef
+"syn match javaFuncDef "[a-zA-Z][a-zA-Z0-9_. \[\]]*([^-+*/()]*)[ \t]*:" contains=javaType
+" syn region javaFuncDef start=+t[a-zA-Z][a-zA-Z0-9_. \[\]]*([^-+*/()]*,[ ]*+ end=+)[ \t]*:+
+
+syn keyword antlrPackages options language buildAST
+syn match antlrPackages "PARSER_END([^)]*)"
+syn match antlrPackages "PARSER_BEGIN([^)]*)"
+syn match antlrSpecToken "<EOF>"
+" the dot is necessary as otherwise it will be matched as a keyword.
+syn match antlrSpecToken ".LOOKAHEAD("ms=s+1,me=e-1
+syn match antlrSep "[|:]\|\.\."
+syn keyword antlrActionToken TOKEN SKIP MORE SPECIAL_TOKEN
+syn keyword antlrError DEBUG IGNORE_IN_BNF
+
+hi def link antlrSep Statement
+hi def link antlrPackages Statement
+
+let b:current_syntax = "antlr"
+
+" vim: ts=8
diff --git a/runtime/syntax/apache.vim b/runtime/syntax/apache.vim
new file mode 100644
index 0000000..e73045e
--- /dev/null
+++ b/runtime/syntax/apache.vim
@@ -0,0 +1,204 @@
+" Vim syntax file
+" Language: Apache configuration (httpd.conf, srm.conf, access.conf, .htaccess)
+" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz>
+" License: This file can be redistribued and/or modified under the same terms
+" as Vim itself.
+" Last Change: 2022 Apr 25
+" Notes: Last synced with apache-2.2.3, version 1.x is no longer supported
+" TODO: see particular FIXME's scattered through the file
+" make it really linewise?
+" + add `display' where appropriate
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Base constructs
+syn match apacheComment "^\s*#.*$" contains=apacheFixme
+syn match apacheUserID "#-\?\d\+\>"
+syn case match
+syn keyword apacheFixme FIXME TODO XXX NOT
+syn case ignore
+syn match apacheAnything "\s[^>]*" contained
+syn match apacheError "\w\+" contained
+syn region apacheString start=+"+ end=+"+ skip=+\\\\\|\\\"+ oneline
+
+" Following is to prevent escaped quotes from being parsed as strings.
+syn match apacheSkipQuote +\\"+
+
+" Core and mpm
+syn keyword apacheDeclaration AccessFileName AddDefaultCharset AllowOverride AuthName AuthType ContentDigest DefaultType DocumentRoot ErrorDocument ErrorLog HostNameLookups IdentityCheck Include KeepAlive KeepAliveTimeout LimitRequestBody LimitRequestFields LimitRequestFieldsize LimitRequestLine LogLevel MaxKeepAliveRequests NameVirtualHost Options Require RLimitCPU RLimitMEM RLimitNPROC Satisfy ScriptInterpreterSource ServerAdmin ServerAlias ServerName ServerPath ServerRoot ServerSignature ServerTokens TimeOut UseCanonicalName
+syn keyword apacheDeclaration AcceptPathInfo CGIMapExtension EnableMMAP FileETag ForceType LimitXMLRequestBody SetHandler SetInputFilter SetOutputFilter
+syn keyword apacheDeclaration AcceptFilter AllowEncodedSlashes EnableSendfile LimitInternalRecursion TraceEnable
+syn keyword apacheOption INode MTime Size
+syn keyword apacheOption Any All On Off Double EMail DNS Min Minimal OS Prod ProductOnly Full
+syn keyword apacheOption emerg alert crit error warn notice info debug
+syn keyword apacheOption registry script inetd standalone
+syn match apacheOptionOption "[+-]\?\<\(ExecCGI\|FollowSymLinks\|Includes\|IncludesNoExec\|Indexes\|MultiViews\|SymLinksIfOwnerMatch\)\>"
+syn keyword apacheOption user group
+syn match apacheOption "\<valid-user\>"
+syn case match
+syn keyword apacheMethodOption GET POST PUT DELETE CONNECT OPTIONS TRACE PATCH PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK contained
+" Added as suggested by Mikko Koivunalho
+syn keyword apacheMethodOption BASELINE-CONTROL CHECKIN CHECKOUT LABEL MERGE MKACTIVITY MKWORKSPACE REPORT UNCHECKOUT UPDATE VERSION-CONTROL contained
+syn case ignore
+syn match apacheSection "<\/\=\(Directory\|DirectoryMatch\|Files\|FilesMatch\|IfModule\|IfDefine\|Location\|LocationMatch\|VirtualHost\)[^>]*>" contains=apacheAnything
+syn match apacheSection "<\/\=\(RequireAll\|RequireAny\|RequireNone\)>" contains=apacheAnything
+syn match apacheLimitSection "<\/\=\(Limit\|LimitExcept\)[^>]*>" contains=apacheLimitSectionKeyword,apacheMethodOption,apacheError
+syn keyword apacheLimitSectionKeyword Limit LimitExcept contained
+syn match apacheAuthType "AuthType\s.*$" contains=apacheAuthTypeValue
+syn keyword apacheAuthTypeValue Basic Digest
+syn match apacheAllowOverride "AllowOverride\s.*$" contains=apacheAllowOverrideValue,apacheComment
+syn keyword apacheAllowOverrideValue AuthConfig FileInfo Indexes Limit Options contained
+syn keyword apacheDeclaration CoreDumpDirectory EnableExceptionHook GracefulShutdownTimeout Group Listen ListenBacklog LockFile MaxClients MaxMemFree MaxRequestsPerChild MaxSpareThreads MaxSpareThreadsPerChild MinSpareThreads NumServers PidFile ScoreBoardFile SendBufferSize ServerLimit StartServers StartThreads ThreadLimit ThreadsPerChild User
+syn keyword apacheDeclaration MaxThreads ThreadStackSize
+syn keyword apacheDeclaration Win32DisableAcceptEx
+syn keyword apacheDeclaration AssignUserId ChildPerUserId
+syn keyword apacheDeclaration AcceptMutex MaxSpareServers MinSpareServers
+syn keyword apacheOption flock fcntl sysvsem pthread
+
+" Modules
+syn keyword apacheDeclaration Action Script
+syn keyword apacheDeclaration Alias AliasMatch Redirect RedirectMatch RedirectTemp RedirectPermanent ScriptAlias ScriptAliasMatch
+syn keyword apacheOption permanent temp seeother gone
+syn keyword apacheDeclaration AuthAuthoritative AuthGroupFile AuthUserFile
+syn keyword apacheDeclaration AuthBasicAuthoritative AuthBasicProvider
+syn keyword apacheDeclaration AuthDigestAlgorithm AuthDigestDomain AuthDigestNcCheck AuthDigestNonceFormat AuthDigestNonceLifetime AuthDigestProvider AuthDigestQop AuthDigestShmemSize
+syn keyword apacheOption none auth auth-int MD5 MD5-sess
+syn match apacheSection "<\/\=\(<AuthnProviderAlias\)[^>]*>" contains=apacheAnything
+syn keyword apacheDeclaration Anonymous Anonymous_Authoritative Anonymous_LogEmail Anonymous_MustGiveEmail Anonymous_NoUserID Anonymous_VerifyEmail
+syn keyword apacheDeclaration AuthDBDUserPWQuery AuthDBDUserRealmQuery
+syn keyword apacheDeclaration AuthDBMGroupFile AuthDBMAuthoritative
+syn keyword apacheDeclaration AuthDBM TypeAuthDBMUserFile
+syn keyword apacheOption default SDBM GDBM NDBM DB
+syn keyword apacheDeclaration AuthDefaultAuthoritative
+syn keyword apacheDeclaration AuthUserFile
+syn keyword apacheDeclaration AuthLDAPBindON AuthLDAPEnabled AuthLDAPFrontPageHack AuthLDAPStartTLS
+syn keyword apacheDeclaration AuthLDAPBindDN AuthLDAPBindPassword AuthLDAPCharsetConfig AuthLDAPCompareDNOnServer AuthLDAPDereferenceAliases AuthLDAPGroupAttribute AuthLDAPGroupAttributeIsDN AuthLDAPRemoteUserIsDN AuthLDAPUrl AuthzLDAPAuthoritative
+syn keyword apacheOption always never searching finding
+syn keyword apacheOption ldap-user ldap-group ldap-dn ldap-attribute ldap-filter
+syn keyword apacheDeclaration AuthDBMGroupFile AuthzDBMAuthoritative AuthzDBMType
+syn keyword apacheDeclaration AuthzDefaultAuthoritative
+syn keyword apacheDeclaration AuthGroupFile AuthzGroupFileAuthoritative
+syn match apacheAllowDeny "Allow\s\+from.*$" contains=apacheAllowDenyValue,apacheComment
+syn match apacheAllowDeny "Deny\s\+from.*$" contains=apacheAllowDenyValue,apacheComment
+syn keyword apacheAllowDenyValue All None contained
+syn match apacheOrder "^\s*Order\s.*$" contains=apacheOrderValue,apacheComment
+syn keyword apacheOrderValue Deny Allow contained
+syn keyword apacheDeclaration AuthzOwnerAuthoritative
+syn keyword apacheDeclaration AuthzUserAuthoritative
+syn keyword apacheDeclaration AddAlt AddAltByEncoding AddAltByType AddDescription AddIcon AddIconByEncoding AddIconByType DefaultIcon HeaderName IndexIgnore IndexOptions IndexOrderDefault ReadmeName
+syn keyword apacheDeclaration IndexStyleSheet
+syn keyword apacheOption DescriptionWidth FancyIndexing FoldersFirst IconHeight IconsAreLinks IconWidth NameWidth ScanHTMLTitles SuppressColumnSorting SuppressDescription SuppressHTMLPreamble SuppressLastModified SuppressSize TrackModified
+syn keyword apacheOption Ascending Descending Name Date Size Description
+syn keyword apacheOption HTMLTable SuppressIcon SuppressRules VersionSort XHTML
+syn keyword apacheOption IgnoreClient IgnoreCase ShowForbidden SuppresRules
+syn keyword apacheDeclaration CacheForceCompletion CacheMaxStreamingBuffer
+syn keyword apacheDeclaration CacheDefaultExpire CacheDisable CacheEnable CacheIgnoreCacheControl CacheIgnoreHeaders CacheIgnoreNoLastMod CacheLastModifiedFactor CacheMaxExpire CacheStoreNoStore CacheStorePrivate
+syn keyword apacheDeclaration MetaFiles MetaDir MetaSuffix
+syn keyword apacheDeclaration ScriptLog ScriptLogLength ScriptLogBuffer
+syn keyword apacheDeclaration ScriptStock
+syn keyword apacheDeclaration CharsetDefault CharsetOptions CharsetSourceEnc
+syn keyword apacheOption DebugLevel ImplicitAdd NoImplicitAdd
+syn keyword apacheDeclaration Dav DavDepthInfinity DavMinTimeout
+syn keyword apacheDeclaration DavLockDB
+syn keyword apacheDeclaration DavGenericLockDB
+syn keyword apacheDeclaration DBDExptime DBDKeep DBDMax DBDMin DBDParams DBDPersist DBDPrepareSQL DBDriver
+syn keyword apacheDeclaration DeflateCompressionLevel DeflateBufferSize DeflateFilterNote DeflateMemLevel DeflateWindowSize
+syn keyword apacheDeclaration DirectoryIndex DirectorySlash
+syn keyword apacheDeclaration CacheExpiryCheck CacheGcClean CacheGcDaily CacheGcInterval CacheGcMemUsage CacheGcUnused CacheSize CacheTimeMargin
+syn keyword apacheDeclaration CacheDirLength CacheDirLevels CacheMaxFileSize CacheMinFileSize CacheRoot
+syn keyword apacheDeclaration DumpIOInput DumpIOOutput
+syn keyword apacheDeclaration ProtocolEcho
+syn keyword apacheDeclaration PassEnv SetEnv UnsetEnv
+syn keyword apacheDeclaration Example
+syn keyword apacheDeclaration ExpiresActive ExpiresByType ExpiresDefault
+syn keyword apacheDeclaration ExtFilterDefine ExtFilterOptions
+syn keyword apacheOption PreservesContentLength DebugLevel LogStderr NoLogStderr
+syn match apacheOption "\<\(cmd\|mode\|intype\|outtype\|ftype\|disableenv\|enableenv\)\ze="
+syn keyword apacheDeclaration CacheFile MMapFile
+syn keyword apacheDeclaration FilterChain FilterDeclare FilterProtocol FilterProvider FilterTrace
+syn keyword apacheDeclaration Header
+syn keyword apacheDeclaration RequestHeader
+syn keyword apacheOption set unset append add
+syn keyword apacheDeclaration IdentityCheck IdentityCheckTimeout
+syn keyword apacheDeclaration ImapMenu ImapDefault ImapBase
+syn keyword apacheOption none formatted semiformatted unformatted
+syn keyword apacheOption nocontent referer error map
+syn keyword apacheDeclaration SSIEndTag SSIErrorMsg SSIStartTag SSITimeFormat SSIUndefinedEcho XBitHack
+syn keyword apacheOption on off full
+syn keyword apacheDeclaration AddModuleInfo
+syn keyword apacheDeclaration ISAPIReadAheadBuffer ISAPILogNotSupported ISAPIAppendLogToErrors ISAPIAppendLogToQuery
+syn keyword apacheDeclaration ISAPICacheFile ISAIPFakeAsync
+syn keyword apacheDeclaration LDAPCertDBPath
+syn keyword apacheDeclaration LDAPCacheEntries LDAPCacheTTL LDAPConnectionTimeout LDAPOpCacheEntries LDAPOpCacheTTL LDAPSharedCacheFile LDAPSharedCacheSize LDAPTrustedClientCert LDAPTrustedGlobalCert LDAPTrustedMode LDAPVerifyServerCert
+syn keyword apacheOption CA_DER CA_BASE64 CA_CERT7_DB CA_SECMOD CERT_DER CERT_BASE64 CERT_KEY3_DB CERT_NICKNAME CERT_PFX KEY_DER KEY_BASE64 KEY_PFX
+syn keyword apacheDeclaration BufferedLogs CookieLog CustomLog LogFormat TransferLog
+syn keyword apacheDeclaration ForensicLog
+syn keyword apacheDeclaration MCacheMaxObjectCount MCacheMaxObjectSize MCacheMaxStreamingBuffer MCacheMinObjectSize MCacheRemovalAlgorithm MCacheSize
+syn keyword apacheDeclaration AddCharset AddEncoding AddHandler AddLanguage AddType DefaultLanguage RemoveEncoding RemoveHandler RemoveType TypesConfig
+syn keyword apacheDeclaration AddInputFilter AddOutputFilter ModMimeUsePathInfo MultiviewsMatch RemoveInputFilter RemoveOutputFilter RemoveCharset
+syn keyword apacheOption NegotiatedOnly Filters Handlers
+syn keyword apacheDeclaration MimeMagicFile
+syn keyword apacheDeclaration MMapFile
+syn keyword apacheDeclaration CacheNegotiatedDocs LanguagePriority ForceLanguagePriority
+syn keyword apacheDeclaration NWSSLTrustedCerts NWSSLUpgradeable SecureListen
+syn keyword apacheDeclaration PerlModule PerlRequire PerlTaintCheck PerlWarn
+syn keyword apacheDeclaration PerlSetVar PerlSetEnv PerlPassEnv PerlSetupEnv
+syn keyword apacheDeclaration PerlInitHandler PerlPostReadRequestHandler PerlHeaderParserHandler
+syn keyword apacheDeclaration PerlTransHandler PerlAccessHandler PerlAuthenHandler PerlAuthzHandler
+syn keyword apacheDeclaration PerlTypeHandler PerlFixupHandler PerlHandler PerlLogHandler
+syn keyword apacheDeclaration PerlCleanupHandler PerlChildInitHandler PerlChildExitHandler
+syn keyword apacheDeclaration PerlRestartHandler PerlDispatchHandler
+syn keyword apacheDeclaration PerlFreshRestart PerlSendHeader
+syn keyword apacheDeclaration php_value php_flag php_admin_value php_admin_flag
+syn match apacheSection "<\/\=\(Proxy\|ProxyMatch\)[^>]*>" contains=apacheAnything
+syn keyword apacheDeclaration AllowCONNECT NoProxy ProxyBadHeader ProxyBlock ProxyDomain ProxyErrorOverride ProxyIOBufferSize ProxyMaxForwards ProxyPass ProxyPassMatch ProxyPassReverse ProxyPassReverseCookieDomain ProxyPassReverseCookiePath ProxyPreserveHost ProxyReceiveBufferSize ProxyRemote ProxyRemoteMatch ProxyRequests ProxyTimeout ProxyVia
+syn keyword apacheDeclaration RewriteBase RewriteCond RewriteEngine RewriteLock RewriteLog RewriteLogLevel RewriteMap RewriteOptions RewriteRule
+syn keyword apacheOption inherit
+syn keyword apacheDeclaration BrowserMatch BrowserMatchNoCase SetEnvIf SetEnvIfNoCase
+syn keyword apacheDeclaration LoadFile LoadModule
+syn keyword apacheDeclaration CheckSpelling CheckCaseOnly
+syn keyword apacheDeclaration SSLCACertificateFile SSLCACertificatePath SSLCADNRequestFile SSLCADNRequestPath SSLCARevocationFile SSLCARevocationPath SSLCertificateChainFile SSLCertificateFile SSLCertificateKeyFile SSLCipherSuite SSLCompression SSLCryptoDevice SSLEngine SSLFIPS SSLHonorCipherOrder SSLInsecureRenegotiation SSLMutex SSLOptions SSLPassPhraseDialog SSLProtocol SSLProxyCACertificateFile SSLProxyCACertificatePath SSLProxyCARevocationFile SSLProxyCARevocationPath SSLProxyCheckPeerCN SSLProxyCheckPeerExpire SSLProxyCipherSuite SSLProxyEngine SSLProxyMachineCertificateChainFile SSLProxyMachineCertificateFile SSLProxyMachineCertificatePath SSLProxyProtocol SSLProxyVerify SSLProxyVerifyDepth SSLRandomSeed SSLRenegBufferSize SSLRequire SSLRequireSSL SSLSessionCache SSLSessionCacheTimeout SSLSessionTicketKeyFile SSLSessionTickets SSLStrictSNIVHostCheck SSLUserName SSLVerifyClient SSLVerifyDepth
+syn match apacheOption "[+-]\?\<\(StdEnvVars\|CompatEnvVars\|ExportCertData\|FakeBasicAuth\|StrictRequire\|OptRenegotiate\)\>"
+syn keyword apacheOption builtin sem
+syn match apacheOption "\(file\|exec\|egd\|dbm\|shm\):"
+syn match apacheOption "[+-]\?\<\(SSLv2\|SSLv3\|TLSv1\|kRSA\|kHDr\|kDHd\|kEDH\|aNULL\|aRSA\|aDSS\|aRH\|eNULL\|DES\|3DES\|RC2\|RC4\|IDEA\|MD5\|SHA1\|SHA\|EXP\|EXPORT40\|EXPORT56\|LOW\|MEDIUM\|HIGH\|RSA\|DH\|EDH\|ADH\|DSS\|NULL\)\>"
+syn keyword apacheOption optional optional_no_ca
+syn keyword apacheDeclaration ExtendedStatus
+syn keyword apacheDeclaration SuexecUserGroup
+syn keyword apacheDeclaration UserDir
+syn keyword apacheDeclaration CookieDomain CookieExpires CookieName CookieStyle CookieTracking
+syn keyword apacheOption Netscape Cookie Cookie2 RFC2109 RFC2965
+syn match apacheSection "<\/\=\(<IfVersion\)[^>]*>" contains=apacheAnything
+syn keyword apacheDeclaration VirtualDocumentRoot VirtualDocumentRootIP VirtualScriptAlias VirtualScriptAliasIP
+
+" Define the default highlighting
+
+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
+
+
+let b:current_syntax = "apache"
diff --git a/runtime/syntax/apachestyle.vim b/runtime/syntax/apachestyle.vim
new file mode 100644
index 0000000..bd5c89d
--- /dev/null
+++ b/runtime/syntax/apachestyle.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" Language: Apache-Style configuration files (proftpd.conf/apache.conf/..)
+" 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
+" initial release
+
+" The following formats are recognised:
+" Apache-style .conf
+" # Comment
+" Option value
+" Option value1 value2
+" Option = value1 value2 #not apache but also allowed
+" <Section Name?>
+" Option value
+" <SubSection Name?>
+" </SubSection>
+" </Section>
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn match apOption /^\s*[^ \t#<=]*/
+syn match apComment /^\s*#.*$/
+"syn match apLastValue /[^ \t<=#]*$/ contains=apComment ugly
+
+" tags
+syn region apTag start=/</ end=/>/ contains=apTagOption,apTagError
+" the following should originally be " [^<>]+" but this didn't work :(
+syn match apTagOption contained / [-\/_\.:*a-zA-Z0-9]\+/ms=s+1
+syn match apTagError contained /[^>]</ms=s+1
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "apachestyle"
+" vim: ts=8
diff --git a/runtime/syntax/aptconf.vim b/runtime/syntax/aptconf.vim
new file mode 100644
index 0000000..d51e7bd
--- /dev/null
+++ b/runtime/syntax/aptconf.vim
@@ -0,0 +1,577 @@
+" Vim syntax file
+" Language: APT config file
+" Maintainer: Yann Amar <quidame@poivron.org>
+" Last Change: 2021 Jul 12
+
+" quit when a syntax file was already loaded
+if !exists("main_syntax")
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'aptconf'
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Errors:
+" Catch all that is not overridden by next rules/items:
+syn match aptconfError display '[^[:blank:]]'
+syn match aptconfError display '^[^[:blank:]][^:{]*'
+
+" Options:
+" Define a general regular expression for the options that are not defined
+" later as keywords. Following apt.conf(5), we know that options are case
+" insensitive, and can contain alphanumeric characters and '/-:._+'; we
+" assume that there can not be consecutive colons (::) which is used as
+" syntax operator; we also assume that an option name can not start or end
+" by a colon.
+syn case ignore
+syn match aptconfRegexpOpt '[-[:alnum:]/.+_]\+\(:[-[:alnum:]/.+_]\+\)*' contained display
+
+" Keywords:
+setlocal iskeyword+=/,-,.,_,+
+"setlocal iskeyword+=: is problematic, because of the '::' separator
+
+" Incomplete keywords will be treated differently than completely bad strings:
+syn keyword aptconfGroupIncomplete
+ \ a[cquire] a[dequate] a[ptitude] a[ptlistbugs] d[ebtags] d[ebug]
+ \ d[ir] d[pkg] d[select] o[rderlist] p[ackagemanager] p[kgcachegen]
+ \ q[uiet] r[pm] s[ynaptic] u[nattended-upgrade] w[hatmaps]
+
+" Only the following keywords can be used at toplevel (to begin an option):
+syn keyword aptconfGroup
+ \ acquire adequate apt aptitude aptlistbugs debtags debug
+ \ dir dpkg dselect orderlist packagemanager pkgcachegen
+ \ quiet rpm synaptic unattended-upgrade whatmaps
+
+" Possible options for each group:
+" Acquire: {{{
+syn keyword aptconfAcquire contained
+ \ cdrom Check-Valid-Until CompressionTypes ForceHash ForceIPv4
+ \ ForceIPv6 ftp gpgv GzipIndexes http https Languages Max-ValidTime
+ \ Min-ValidTime PDiffs Queue-Mode Retries Source-Symlinks
+
+syn keyword aptconfAcquireCDROM contained
+ \ AutoDetect CdromOnly Mount UMount
+
+syn keyword aptconfAcquireCompressionTypes contained
+ \ bz2 lzma gz Order
+
+syn keyword aptconfAcquireFTP contained
+ \ ForceExtended Passive Proxy ProxyLogin Timeout
+
+syn keyword aptconfAcquireHTTP contained
+ \ AllowRedirect Dl-Limit Max-Age No-Cache No-Store Pipeline-Depth
+ \ Proxy ProxyAutoDetect Proxy-Auto-Detect Timeout User-Agent
+
+syn keyword aptconfAcquireHTTPS contained
+ \ AllowRedirect CaInfo CaPath CrlFile Dl-Limit IssuerCert Max-Age
+ \ No-Cache No-Store Proxy SslCert SslForceVersion SslKey Timeout
+ \ Verify-Host Verify-Peer
+
+syn keyword aptconfAcquireMaxValidTime contained
+ \ Debian Debian-Security
+
+syn keyword aptconfAcquirePDiffs contained
+ \ FileLimit SizeLimit
+
+syn cluster aptconfAcquire_ contains=aptconfAcquire,
+ \ aptconfAcquireCDROM,aptconfAcquireCompressionTypes,aptconfAcquireFTP,
+ \ aptconfAcquireHTTP,aptconfAcquireHTTPS,aptconfAcquireMaxValidTime,
+ \ aptconfAcquirePDiffs
+" }}}
+" Adequate: {{{
+syn keyword aptconfAdequate contained
+ \ Enabled
+
+syn cluster aptconfAdequate_ contains=aptconfAdequate
+" }}}
+" Apt: {{{
+syn keyword aptconfApt contained
+ \ Architecture Architectures Archive Authentication AutoRemove
+ \ Build-Essential Build-Profiles Cache Cache-Grow Cache-Limit
+ \ Cache-Start CDROM Changelogs Clean-Installed Compressor
+ \ Default-Release Force-LoopBreak Get Ignore-Hold Immediate-Configure
+ \ Install-Recommends Install-Suggests Keep-Fds List-Cleanup
+ \ Move-Autobit-Sections NeverAutoRemove Never-MarkAuto-Sections
+ \ Periodic Status-Fd Update VersionedKernelPackages
+
+syn keyword aptconfAptAuthentication contained
+ \ TrustCDROM
+
+syn keyword aptconfAptAutoRemove contained
+ \ RecommendsImportant SuggestsImportant
+
+syn keyword aptconfAptCache contained
+ \ AllNames AllVersions Generate GivenOnly Important Installed NamesOnly
+ \ RecurseDepends ShowFull
+
+syn keyword aptconfAptCDROM contained
+ \ Fast NoAct NoMount Rename
+
+syn keyword aptconfAptChangelogs contained
+ \ Server
+
+syn keyword aptconfAptCompressor contained
+ \ bzip2 gzip lzma xz
+
+syn keyword aptconfAptCompressorAll contained
+ \ Binary CompressArg Cost Extension Name UncompressArg
+
+syn keyword aptconfAptGet contained
+ \ AllowUnauthenticated Arch-Only Assume-No Assume-Yes AutomaticRemove
+ \ Build-Dep-Automatic Compile Diff-Only Download Download-Only Dsc-Only
+ \ Fix-Broken Fix-Missing Force-Yes HideAutoRemove Host-Architecture
+ \ List-Cleanup Only-Source Print-URIs Purge ReInstall Remove
+ \ Show-Upgraded Show-User-Simulation-Note Show-Versions Simulate
+ \ Tar-Only Trivial-Only Upgrade
+
+syn keyword aptconfAptPeriodic contained
+ \ AutocleanInterval BackupArchiveInterval BackupLevel
+ \ Download-Upgradeable-Packages Download-Upgradeable-Packages-Debdelta
+ \ Enable MaxAge MaxSize MinAge Unattended-Upgrade Update-Package-Lists
+ \ Verbose
+
+syn keyword aptconfAptUpdate contained
+ \ List-Refresh Pre-Invoke Post-Invoke Post-Invoke-Success
+
+syn cluster aptconfApt_ contains=aptconfApt,
+ \ aptconfAptAuthentication,aptconfAptAutoRemove,aptconfAptCache,
+ \ aptconfAptCDROM,aptconfAptChangelogs,aptconfAptCompressor,
+ \ aptconfAptCompressorAll,aptconfAptGet,aptconfAptPeriodic,
+ \ aptconfAptUpdate
+" }}}
+" Aptitude: {{{
+syn keyword aptconfAptitude contained
+ \ Allow-Null-Upgrade Always-Use-Safe-Resolver Autoclean-After-Update
+ \ Auto-Install Auto-Fix-Broken Cmdline Debtags-Binary
+ \ Debtags-Update-Options Delete-Unused Delete-Unused-Pattern
+ \ Display-Planned-Action Forget-New-On-Install Forget-New-On-Update
+ \ Get-Root-Command Ignore-Old-Tmp Ignore-Recommends-Important
+ \ Keep-Recommends Keep-Suggests Keep-Unused-Pattern LockFile Log
+ \ Logging Parse-Description-Bullets Pkg-Display-Limit ProblemResolver
+ \ Purge-Unused Recommends-Important Safe-Resolver Screenshot Sections
+ \ Simulate Spin-Interval Suggests-Important Suppress-Read-Only-Warning
+ \ Theme Track-Dselect-State UI Warn-Not-Root
+
+syn keyword aptconfAptitudeCmdline contained
+ \ Always-Prompt Assume-Yes Disable-Columns Download-Only Fix-Broken
+ \ Ignore-Trust-Violations Package-Display-Format Package-Display-Width
+ \ Progress Request-Strictness Resolver-Debug Resolver-Dump
+ \ Resolver-Show-Steps Safe-Upgrade Show-Deps Show-Size-Changes
+ \ Show-Versions Show-Why Simulate Verbose Version-Display-Format
+ \ Versions-Group-By Versions-Show-Package-Names Visual-Preview
+ \ Why-Display-Mode
+
+syn keyword aptconfAptitudeCmdlineProgress contained
+ \ Percent-On-Right Retain-Completed
+
+syn keyword aptconfAptitudeCmdlineSafeUpgrade contained
+ \ No-New-Installs
+
+syn keyword aptconfAptitudeLogging contained
+ \ File Levels
+
+syn keyword aptconfAptitudeProblemResolver contained
+ \ Allow-Break-Holds BreakHoldScore Break-Hold-Level BrokenScore
+ \ DefaultResolutionScore Discard-Null-Solution
+ \ EssentialRemoveScore ExtraScore FullReplacementScore FutureHorizon
+ \ Hints ImportantScore Infinity InstallScore Keep-All-Level KeepScore
+ \ NonDefaultScore Non-Default-Level OptionalScore PreserveAutoScore
+ \ PreserveManualScore RemoveScore Remove-Essential-Level Remove-Level
+ \ RequiredScore ResolutionScore Safe-Level SolutionCost StandardScore
+ \ StepLimit StepScore Trace-Directory Trace-File
+ \ UndoFullReplacementScore UnfixedSoftScore UpgradeScore
+
+syn keyword aptconfAptitudeSafeResolver contained
+ \ No-New-Installs No-New-Upgrades Show-Resolver-Actions
+
+syn keyword aptconfAptitudeScreenshot contained
+ \ Cache-Max IncrementalLoadLimit
+
+syn keyword aptconfAptitudeSections contained
+ \ Descriptions Top-Sections
+
+syn keyword aptconfAptitudeUI contained
+ \ Advance-On-Action Auto-Show-Reasons Default-Grouping
+ \ Default-Package-View Default-Preview-Grouping Default-Sorting
+ \ Description-Visible-By-Default Exit-On-Last-Close Fill-Text
+ \ Flat-View-As-First-View HelpBar Incremental-Search InfoAreaTabs
+ \ KeyBindings MenuBar-Autohide Minibuf-Download-Bar Minibuf-Prompts
+ \ New-package-Commands Package-Display-Format Package-Header-Format
+ \ Package-Status-Format Pause-After-Download Preview-Limit
+ \ Prompt-On-Exit Styles ViewTabs
+
+syn keyword aptconfAptitudeUIKeyBindings contained
+ \ ApplySolution Begin BugReport Cancel Changelog ChangePkgTreeGrouping
+ \ ChangePkgTreeLimit ChangePkgTreeSorting ClearAuto CollapseAll
+ \ CollapseTree Commit Confirm Cycle CycleNext CycleOrder CyclePrev
+ \ DelBOL DelBack DelEOL DelForward Dependencies DescriptionCycle
+ \ DescriptionDown DescriptionUp DoInstallRun Down DpkgReconfigure
+ \ DumpResolver EditHier End ExamineSolution ExpandAll ExpandTree
+ \ FirstSolution ForbidUpgrade ForgetNewPackages Help HistoryNext
+ \ HistoryPrev Hold Install InstallSingle Keep LastSolution Left
+ \ LevelDown LevelUp MarkUpgradable MineFlagSquare MineLoadGame
+ \ MineSaveGame MineSweepSquare MineUncoverSquare MineUncoverSweepSquare
+ \ NextPage NextSolution No Parent PrevPage PrevSolution Purge
+ \ PushButton Quit QuitProgram RejectBreakHolds Refresh Remove
+ \ ReInstall RepeatSearchBack ReSearch ReverseDependencies Right
+ \ SaveHier Search SearchBack SearchBroken SetAuto ShowHideDescription
+ \ SolutionActionApprove SolutionActionReject ToggleExpanded
+ \ ToggleMenuActive Undo Up UpdatePackageList Versions Yes
+
+syn keyword aptconfAptitudeUIStyles contained
+ \ Bullet ChangeLogNewerVersion Default DepBroken DisabledMenuEntry
+ \ DownloadHit DownloadProgress EditLine Error Header HighlightedMenuBar
+ \ HighlightedMenuEntry MediaChange MenuBar MenuBorder MenuEntry
+ \ MineBomb MineBorder MineFlag MineNumber1 MineNumber2 MineNumber3
+ \ MineNumber4 MineNumber5 MineNumber6 MineNumber7 MineNumber8
+ \ MultiplexTab MultiplexTabHighlighted PkgBroken PkgBrokenHighlighted
+ \ PkgIsInstalled PkgIsInstalledHighlighted PkgNotInstalled
+ \ PkgNotInstalledHighlighted PkgToDowngrade PkgToDowngradeHighlighted
+ \ PkgToHold PkgToHoldHighlighted PkgToInstall PkgToInstallHighlighted
+ \ PkgToRemove PkgToRemoveHighlighted PkgToUpgrade
+ \ PkgToUpgradeHighlighted Progress SolutionActionApproved
+ \ SolutionActionRejected Status TreeBackground TrustWarning
+
+syn keyword aptconfAptitudeUIStylesElements contained
+ \ bg clear fg flip set
+
+syn cluster aptconfAptitude_ contains=aptconfAptitude,
+ \ aptconfAptitudeCmdline,aptconfAptitudeCmdlineProgress,
+ \ aptconfAptitudeCmdlineSafeUpgrade,aptconfAptitudeLogging,
+ \ aptconfAptitudeProblemResolver,aptconfAptitudeSafeResolver,
+ \ aptconfAptitudeScreenshot,aptconfAptitudeSections,aptconfAptitudeUI,
+ \ aptconfAptitudeUIKeyBindings,aptconfAptitudeUIStyles,
+ \ aptconfAptitudeUIStylesElements
+" }}}
+" AptListbugs: {{{
+syn keyword aptconfAptListbugs contained
+ \ IgnoreRegexp Severities
+
+syn cluster aptconfAptListbugs_ contains=aptconfAptListbugs
+" }}}
+" DebTags: {{{
+syn keyword aptconfDebTags contained
+ \ Vocabulary
+
+syn cluster aptconfDebTags_ contains=aptconfDebTags
+" }}}
+" Debug: {{{
+syn keyword aptconfDebug contained
+ \ Acquire aptcdrom BuildDeps Hashes IdentCdrom Nolocking
+ \ pkgAcquire pkgAutoRemove pkgCacheGen pkgDepCache pkgDPkgPM
+ \ pkgDPkgProgressReporting pkgInitialize pkgOrderList
+ \ pkgPackageManager pkgPolicy pkgProblemResolver RunScripts
+ \ sourceList
+
+syn keyword aptconfDebugAcquire contained
+ \ cdrom Ftp gpgv Http Https netrc
+
+syn keyword aptconfDebugPkgAcquire contained
+ \ Auth Diffs RRed Worker
+
+syn keyword aptconfDebugPkgDepCache contained
+ \ AutoInstall Marker
+
+syn keyword aptconfDebugPkgProblemResolver contained
+ \ ShowScores
+
+syn cluster aptconfDebug_ contains=aptconfDebug,
+ \ aptconfDebugAcquire,aptconfDebugPkgAcquire,aptconfDebugPkgDepCache,
+ \ aptconfDebugPkgProblemResolver
+" }}}
+" Dir: {{{
+syn keyword aptconfDir contained
+ \ Aptitude Bin Cache Etc Ignore-Files-Silently Log Media Parts RootDir
+ \ State
+
+syn keyword aptconfDirAptitude contained
+ \ state
+
+syn keyword aptconfDirBin contained
+ \ apt-get apt-cache dpkg dpkg-buildpackage dpkg-source gpg gzip Methods
+ \ solvers
+
+syn keyword aptconfDirCache contained
+ \ Archives Backup pkgcache srcpkgcache
+
+syn keyword aptconfDirEtc contained
+ \ Main Netrc Parts Preferences PreferencesParts SourceList SourceParts
+ \ VendorList VendorParts Trusted TrustedParts
+
+syn keyword aptconfDirLog contained
+ \ History Terminal
+
+syn keyword aptconfDirMedia contained
+ \ MountPath
+
+syn keyword aptconfDirState contained
+ \ cdroms extended_states Lists mirrors preferences status
+
+syn cluster aptconfDir_ contains=aptconfDir,
+ \ aptconfDirAptitude,aptconfDirBin,aptconfDirCache,aptconfDirEtc,
+ \ aptconfDirLog,aptconfDirMedia,aptconfDirState
+" }}}
+" DPkg: {{{
+syn keyword aptconfDPkg contained
+ \ Build-Options Chroot-Directory ConfigurePending FlushSTDIN
+ \ MaxArgBytes MaxArgs MaxBytes NoTriggers options
+ \ Pre-Install-Pkgs Pre-Invoke Post-Invoke
+ \ Run-Directory StopOnError Tools TriggersPending
+
+syn keyword aptconfDPkgTools contained
+ \ adequate InfoFD Options Version
+
+syn cluster aptconfDPkg_ contains=aptconfDPkg,
+ \ aptconfDPkgTools
+" }}}
+" DSelect: {{{
+syn keyword aptconfDSelect contained
+ \ CheckDir Clean Options PromptAfterUpdate UpdateOptions
+
+syn cluster aptconfDSelect_ contains=aptconfDSelect
+" }}}
+" OrderList: {{{
+syn keyword aptconfOrderList contained
+ \ Score
+
+syn keyword aptconfOrderListScore contained
+ \ Delete Essential Immediate PreDepends
+
+syn cluster aptconfOrderList_ contains=aptconfOrderList,
+ \ aptconfOrderListScore
+" }}}
+" PackageManager: {{{
+syn keyword aptconfPackageManager contained
+ \ Configure
+
+syn cluster aptconfPackageManager_ contains=aptconfPackageManager
+" }}}
+" PkgCacheGen: {{{
+syn keyword aptconfPkgCacheGen contained
+ \ Essential
+
+syn cluster aptconfPkgCacheGen_ contains=aptconfPkgCacheGen
+" }}}
+" Quiet: {{{
+syn keyword aptconfQuiet contained
+ \ NoUpdate
+
+syn cluster aptconfQuiet_ contains=aptconfQuiet
+" }}}
+" Rpm: {{{
+syn keyword aptconfRpm contained
+ \ Post-Invoke Pre-Invoke
+
+syn cluster aptconfRpm_ contains=aptconfRpm
+" }}}
+" Synaptic: {{{
+syn keyword aptconfSynaptic contained
+ \ AskQuitOnProceed AskRelated AutoCleanCache CleanCache DefaultDistro
+ \ delAction delHistory Download-Only ftpProxy ftpProxyPort httpProxy
+ \ httpProxyPort Install-Recommends LastSearchType Maximized noProxy
+ \ OneClickOnStatusActions ShowAllPkgInfoInMain showWelcomeDialog
+ \ ToolbarState undoStackSize update upgradeType useProxy UseStatusColors
+ \ UseTerminal useUserFont useUserTerminalFont ViewMode
+ \ availVerColumnPos availVerColumnVisible componentColumnPos
+ \ componentColumnVisible descrColumnPos descrColumnVisible
+ \ downloadSizeColumnPos downloadSizeColumnVisible hpanedPos
+ \ instVerColumnPos instVerColumnVisible instSizeColumnPos
+ \ instSizeColumnVisible nameColumnPos nameColumnVisible
+ \ sectionColumnPos sectionColumnVisible statusColumnPos
+ \ statusColumnVisible supportedColumnPos supportedColumnVisible
+ \ vpanedPos windowWidth windowHeight windowX windowY closeZvt
+ \ color-available color-available-locked color-broken color-downgrade
+ \ color-install color-installed-locked color-installed-outdated
+ \ color-installed-updated color-new color-purge color-reinstall
+ \ color-remove color-upgrade
+
+syn keyword aptconfSynapticUpdate contained
+ \ last type
+
+syn cluster aptconfSynaptic_ contains=aptconfSynaptic,
+ \ aptconfSynapticUpdate
+" }}}
+" Unattended Upgrade: {{{
+syn keyword aptconfUnattendedUpgrade contained
+ \ Allow-APT-Mark-Fallback Allow-downgrade AutoFixInterruptedDpkg
+ \ Automatic-Reboot Automatic-Reboot-Time Automatic-Reboot-WithUsers
+ \ Debug InstallOnShutdown Mail MailOnlyOnError MailReport MinimalSteps
+ \ OnlyOnACPower Origins-Pattern Package-Blacklist
+ \ Remove-New-Unused-Dependencies Remove-Unused-Dependencies
+ \ Remove-Unused-Kernel-Packages Skip-Updates-On-Metered-Connections
+ \ SyslogEnable SyslogFacility Verbose
+
+syn cluster aptconfUnattendedUpgrade_ contains=aptconfUnattendedUpgrade
+" }}}
+" Whatmaps: {{{
+syn keyword aptconfWhatmaps contained
+ \ Enable-Restart Security-Update-Origins
+
+syn cluster aptconfWhatmaps_ contains=aptconfWhatmaps
+" }}}
+
+syn case match
+
+" Now put all the keywords (and 'valid' options) in a single cluster:
+syn cluster aptconfOptions contains=aptconfRegexpOpt,
+ \ @aptconfAcquire_,@aptconfAdequate_,@aptconfApt_,@aptconfAptitude_,
+ \ @aptconfAptListbugs_,@aptconfDebTags_,@aptconfDebug_,@aptconfDir_,
+ \ @aptconfDPkg_,@aptconfDSelect_,@aptconfOrderList_,
+ \ @aptconfPackageManager_,@aptconfPkgCacheGen_,@aptconfQuiet_,
+ \ @aptconfRpm_,@aptconfSynaptic_,@aptconfUnattendedUpgrade_,
+ \ @aptconfWhatmaps_
+
+" Syntax:
+syn match aptconfSemiColon ';'
+syn match aptconfDoubleColon '::'
+syn match aptconfCurlyBraces '[{}]'
+syn region aptconfValue start='"' end='"' oneline display
+syn region aptconfInclude matchgroup=aptconfOperator start='{' end='}' contains=ALLBUT,aptconfGroup,aptconfGroupIncomplete,@aptconfCommentSpecial
+syn region aptconfInclude matchgroup=aptconfOperator start='::' end='{'me=s-1 contains=@aptconfOptions,aptconfError display
+syn region aptconfInclude matchgroup=aptconfOperator start='::' end='::\|\s'me=s-1 oneline contains=@aptconfOptions,aptconfError display
+
+" Basic Syntax Errors: XXX avoid to generate false positives !!!
+"
+" * Undocumented inline comment. Since it is currently largely used, and does
+" not seem to cause trouble ('apt-config dump' never complains when # is used
+" the same way than //) it has been moved to aptconfComment group. But it
+" still needs to be defined here (i.e. before #clear and #include directives)
+syn match aptconfComment '#.*' contains=@aptconfCommentSpecial
+"
+" * When a semicolon is missing after a double-quoted string:
+" There are some cases (for example in the Dir group of options, but not only)
+" where this syntax is valid. So we don't treat it as a strict error.
+syn match aptconfAsError display '"[^"]*"[^;]'me=e-1
+syn match aptconfAsError display '"[^"]*"$'
+"
+" * When double quotes are missing around a value (before a semicolon):
+" This omission has no effect if the value is a single string (without blank
+" characters). But apt.conf(5) says that quotes are required, and this item
+" avoids to match unquoted keywords.
+syn match aptconfAsError display '\s[^"[:blank:]]*[^}"];'me=e-1
+"
+" * When only one double quote is missing around a value (before a semicolon):
+" No comment for that: it must be highly visible.
+syn match aptconfError display '\(\s\|;\)"[^"[:blank:]]\+;'me=e-1
+syn match aptconfError display '\(\s\|;\)[^"[:blank:]]\+";'me=e-1
+"
+" * When space is missing between option and (quoted) value:
+" TODO (partially implemented)
+syn match aptconfError display '::[^[:blank:]]*"'
+
+" Special Actions:
+syn match aptconfAction '^#\(clear\|include\)\>'
+syn region aptconfAction matchgroup=aptconfAction start='^#clear\>' end=';'me=s-1 oneline contains=aptconfGroup,aptconfDoubleColon,@aptconfOptions
+syn region aptconfAction matchgroup=aptconfAction start='^#include\>' end=';'me=s-1 oneline contains=aptconfRegexpOpt
+
+" Comments:
+syn keyword aptconfTodo TODO FIXME NOTE XXX contained
+syn cluster aptconfCommentSpecial contains=@Spell,aptconfTodo
+syn match aptconfComment '//.*' contains=@aptconfCommentSpecial
+syn region aptconfComment start='/\*' end='\*/' contains=@aptconfCommentSpecial
+
+" Highlight Definitions:
+hi def link aptconfTodo Todo
+hi def link aptconfError Error
+hi def link aptconfComment Comment
+hi def link aptconfOperator Operator
+
+hi def link aptconfAction PreProc
+hi def link aptconfOption Type
+hi def link aptconfValue String
+hi def link aptconfRegexpOpt Normal
+hi def link aptconfAsError Special
+
+hi def link aptconfSemiColon aptconfOperator
+hi def link aptconfDoubleColon aptconfOperator
+hi def link aptconfCurlyBraces aptconfOperator
+
+hi def link aptconfGroupIncomplete Special
+hi def link aptconfGroup aptconfOption
+
+hi def link aptconfAcquire aptconfOption
+hi def link aptconfAcquireCDROM aptconfOption
+hi def link aptconfAcquireCompressionTypes aptconfOption
+hi def link aptconfAcquireFTP aptconfOption
+hi def link aptconfAcquireHTTP aptconfOption
+hi def link aptconfAcquireHTTPS aptconfOption
+hi def link aptconfAcquireMaxValidTime aptconfOption
+hi def link aptconfAcquirePDiffs aptconfOption
+
+hi def link aptconfAdequate aptconfOption
+
+hi def link aptconfApt aptconfOption
+hi def link aptconfAptAuthentication aptconfOption
+hi def link aptconfAptAutoRemove aptconfOption
+hi def link aptconfAptCache aptconfOption
+hi def link aptconfAptCDROM aptconfOption
+hi def link aptconfAptChangelogs aptconfOption
+hi def link aptconfAptCompressor aptconfOption
+hi def link aptconfAptCompressorAll aptconfOption
+hi def link aptconfAptGet aptconfOption
+hi def link aptconfAptPeriodic aptconfOption
+hi def link aptconfAptUpdate aptconfOption
+
+hi def link aptconfAptitude aptconfOption
+hi def link aptconfAptitudeCmdline aptconfOption
+hi def link aptconfAptitudeCmdlineProgress aptconfOption
+hi def link aptconfAptitudeCmdlineSafeUpgrade aptconfOption
+hi def link aptconfAptitudeLogging aptconfOption
+hi def link aptconfAptitudeProblemResolver aptconfOption
+hi def link aptconfAptitudeSafeResolver aptconfOption
+hi def link aptconfAptitudeScreenshot aptconfOption
+hi def link aptconfAptitudeSections aptconfOption
+hi def link aptconfAptitudeUI aptconfOption
+hi def link aptconfAptitudeUIKeyBindings aptconfOption
+hi def link aptconfAptitudeUIStyles aptconfOption
+hi def link aptconfAptitudeUIStylesElements aptconfOption
+
+hi def link aptconfAptListbugs aptconfOption
+
+hi def link aptconfDebTags aptconfOption
+
+hi def link aptconfDebug aptconfOption
+hi def link aptconfDebugAcquire aptconfOption
+hi def link aptconfDebugPkgAcquire aptconfOption
+hi def link aptconfDebugPkgDepCache aptconfOption
+hi def link aptconfDebugPkgProblemResolver aptconfOption
+
+hi def link aptconfDir aptconfOption
+hi def link aptconfDirAptitude aptconfOption
+hi def link aptconfDirBin aptconfOption
+hi def link aptconfDirCache aptconfOption
+hi def link aptconfDirEtc aptconfOption
+hi def link aptconfDirLog aptconfOption
+hi def link aptconfDirMedia aptconfOption
+hi def link aptconfDirState aptconfOption
+
+hi def link aptconfDPkg aptconfOption
+hi def link aptconfDPkgTools aptconfOption
+
+hi def link aptconfDSelect aptconfOption
+
+hi def link aptconfOrderList aptconfOption
+hi def link aptconfOrderListScore aptconfOption
+
+hi def link aptconfPackageManager aptconfOption
+
+hi def link aptconfPkgCacheGen aptconfOption
+
+hi def link aptconfQuiet aptconfOption
+
+hi def link aptconfRpm aptconfOption
+
+hi def link aptconfSynaptic aptconfOption
+hi def link aptconfSynapticUpdate aptconfOption
+
+hi def link aptconfUnattendedUpgrade aptconfOption
+
+hi def link aptconfWhatmaps aptconfOption
+
+let b:current_syntax = "aptconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/arch.vim b/runtime/syntax/arch.vim
new file mode 100644
index 0000000..f9d095e
--- /dev/null
+++ b/runtime/syntax/arch.vim
@@ -0,0 +1,41 @@
+" Vim syntax file
+" Language: GNU Arch inventory file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-
+
+syn keyword archTodo TODO FIXME XXX NOTE
+
+syn region archComment display start='^\%(#\|\s\)' end='$'
+ \ contains=archTodo,@Spell
+
+syn match archBegin display '^' nextgroup=archKeyword,archComment
+
+syn keyword archKeyword contained implicit tagline explicit names
+syn keyword archKeyword contained untagged-source
+ \ nextgroup=archTMethod skipwhite
+syn keyword archKeyword contained exclude junk backup precious unrecognized
+ \ source nextgroup=archRegex skipwhite
+
+syn keyword archTMethod contained source precious backup junk unrecognized
+
+syn match archRegex contained '\s*\zs.*'
+
+hi def link archTodo Todo
+hi def link archComment Comment
+hi def link archKeyword Keyword
+hi def link archTMethod Type
+hi def link archRegex String
+
+let b:current_syntax = "arch"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/arduino.vim b/runtime/syntax/arduino.vim
new file mode 100644
index 0000000..2f06eb6
--- /dev/null
+++ b/runtime/syntax/arduino.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: Arduino
+" Maintainer: Johannes Hoff <johannes@johanneshoff.com>
+" Last Change: 21 October 2021
+" License: VIM license (:help license, replace vim by arduino.vim)
+
+" Syntax highlighting like in the Arduino IDE
+" Automatically generated by the script available at
+" https://github.com/johshoff/arduino-vim-syntax
+" Using keywords from <arduino>/build/shared/lib/keywords.txt
+" From version: 1.8.16
+
+" Thanks to Rik, Erik Nomitch, Adam Obeng, Graeme Cross and Niall Parker
+" 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")
+ finish
+endif
+
+" Read the C syntax to start with
+if version < 600
+ so <sfile>:p:h/cpp.vim
+else
+ runtime! syntax/cpp.vim
+endif
+
+syn keyword arduinoConstant BIN CHANGE DEC DEFAULT EXTERNAL FALLING HALF_PI HEX
+syn keyword arduinoConstant HIGH INPUT INPUT_PULLUP INTERNAL INTERNAL1V1
+syn keyword arduinoConstant INTERNAL2V56 LED_BUILTIN LED_BUILTIN_RX
+syn keyword arduinoConstant LED_BUILTIN_TX LOW LSBFIRST MSBFIRST OCT OUTPUT PI
+syn keyword arduinoConstant RISING TWO_PI
+
+syn keyword arduinoFunc analogRead analogReadResolution analogReference
+syn keyword arduinoFunc analogWrite analogWriteResolution attachInterrupt
+syn keyword arduinoFunc bit bitClear bitRead bitSet bitWrite delay
+syn keyword arduinoFunc delayMicroseconds detachInterrupt
+syn keyword arduinoFunc digitalPinToInterrupt digitalRead digitalWrite
+syn keyword arduinoFunc highByte interrupts lowByte micros millis
+syn keyword arduinoFunc noInterrupts noTone pinMode pulseIn pulseInLong
+syn keyword arduinoFunc shiftIn shiftOut tone yield
+
+syn keyword arduinoMethod available availableForWrite begin charAt compareTo
+syn keyword arduinoMethod concat end endsWith equals equalsIgnoreCase export
+syn keyword arduinoMethod final find findUntil flush getBytes indexOf
+syn keyword arduinoMethod lastIndexOf length loop override parseFloat
+syn keyword arduinoMethod parseInt peek print println read readBytes
+syn keyword arduinoMethod readBytesUntil readString readStringUntil replace
+syn keyword arduinoMethod setCharAt setTimeout setup startsWith Stream
+syn keyword arduinoMethod substring toCharArray toInt toLowerCase toUpperCase
+syn keyword arduinoMethod trim
+
+syn keyword arduinoModule Keyboard Mouse Serial Serial1 Serial2 Serial3
+syn keyword arduinoModule SerialUSB
+
+syn keyword arduinoStdFunc abs accept acos acosf asin asinf atan atan2 atan2f
+syn keyword arduinoStdFunc atanf cbrt cbrtf ceil ceilf click constrain
+syn keyword arduinoStdFunc copysign copysignf cos cosf cosh coshf degrees exp
+syn keyword arduinoStdFunc expf fabs fabsf fdim fdimf floor floorf fma fmaf
+syn keyword arduinoStdFunc fmax fmaxf fmin fminf fmod fmodf hypot hypotf
+syn keyword arduinoStdFunc isfinite isinf isnan isPressed ldexp ldexpf log
+syn keyword arduinoStdFunc log10 log10f logf lrint lrintf lround lroundf map
+syn keyword arduinoStdFunc max min move pow powf press radians random
+syn keyword arduinoStdFunc randomSeed release releaseAll round roundf signbit
+syn keyword arduinoStdFunc sin sinf sinh sinhf sq sqrt sqrtf tan tanf tanh
+syn keyword arduinoStdFunc tanhf trunc truncf
+
+syn keyword arduinoType _Bool _Complex _Imaginary array atomic_bool
+syn keyword arduinoType atomic_char atomic_int atomic_llong atomic_long
+syn keyword arduinoType atomic_schar atomic_short atomic_uchar atomic_uint
+syn keyword arduinoType atomic_ullong atomic_ulong atomic_ushort boolean
+syn keyword arduinoType byte char16_t char32_t complex NULL null PROGMEM
+syn keyword arduinoType String word
+
+hi def link arduinoType Type
+hi def link arduinoConstant Constant
+hi def link arduinoStdFunc Function
+hi def link arduinoFunc Function
+hi def link arduinoMethod Function
+hi def link arduinoModule Identifier
diff --git a/runtime/syntax/art.vim b/runtime/syntax/art.vim
new file mode 100644
index 0000000..8551198
--- /dev/null
+++ b/runtime/syntax/art.vim
@@ -0,0 +1,50 @@
+" Vim syntax file
+" Language: ART-IM and ART*Enterprise
+" Maintainer: Dorai Sitaram <ds26@gte.com>
+" URL: http://www.ccs.neu.edu/~dorai/vimplugins/vimplugins.html
+" Last Change: 2011 Dec 28 by Thilo Six
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case ignore
+
+syn keyword artspform => and assert bind
+syn keyword artspform declare def-art-fun deffacts defglobal defrule defschema do
+syn keyword artspform else for if in$ not or
+syn keyword artspform progn retract salience schema test then while
+
+syn match artvariable "?[^ \t";()|&~]\+"
+
+syn match artglobalvar "?\*[^ \t";()|&~]\+\*"
+
+syn match artinstance "![^ \t";()|&~]\+"
+
+syn match delimiter "[()|&~]"
+
+syn region string start=/"/ skip=/\\[\\"]/ end=/"/
+
+syn match number "\<[-+]\=\([0-9]\+\(\.[0-9]*\)\=\|\.[0-9]\+\)\>"
+
+syn match comment ";.*$"
+
+syn match comment "#+:\=ignore" nextgroup=artignore skipwhite skipnl
+
+syn region artignore start="(" end=")" contained contains=artignore,comment
+
+syn region artignore start=/"/ skip=/\\[\\"]/ end=/"/ contained
+
+hi def link artinstance type
+hi def link artglobalvar preproc
+hi def link artignore comment
+hi def link artspform statement
+hi def link artvariable function
+
+let b:current_syntax = "art"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/asciidoc.vim b/runtime/syntax/asciidoc.vim
new file mode 100644
index 0000000..29451f9
--- /dev/null
+++ b/runtime/syntax/asciidoc.vim
@@ -0,0 +1,185 @@
+" Vim syntax file
+" Language: AsciiDoc
+" Maintainer: @aerostitch on GitHub (tag me in your issue in the
+" github/vim/vim repository and I'll answer when available)
+" Original author: Stuart Rackham <srackham@gmail.com> (inspired by Felix
+" Obenhuber's original asciidoc.vim script).
+" URL: http://asciidoc.org/
+" Licence: GPL (http://www.gnu.org)
+" Remarks: Vim 6 or greater
+" Last Update: 2020 May 03 (see Issue 240)
+" Limitations:
+"
+" - Nested quoted text formatting is highlighted according to the outer
+" format.
+" - If a closing Example Block delimiter may be mistaken for a title
+" underline. A workaround is to insert a blank line before the closing
+" delimiter.
+" - Lines within a paragraph starting with equals characters are
+" highlighted as single-line titles.
+" - Lines within a paragraph beginning with a period are highlighted as
+" block titles.
+
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" Use the default syntax syncing.
+
+" Run :help syn-priority to review syntax matching priority.
+syn keyword asciidocToDo TODO FIXME CHECK TEST XXX ZZZ DEPRECATED
+syn match asciidocBackslash /\\/
+syn region asciidocIdMarker start=/^\$Id:\s/ end=/\s\$$/
+syn match asciidocCallout /\\\@<!<\d\{1,2}>/
+syn match asciidocOpenBlockDelimiter /^--$/
+syn match asciidocLineBreak /[ \t]+$/ containedin=asciidocList
+syn match asciidocRuler /^'\{3,}$/
+syn match asciidocPagebreak /^<\{3,}$/
+syn match asciidocEntityRef /\\\@<!&[#a-zA-Z]\S\{-};/
+syn region asciidocLiteralParagraph start=/\(\%^\|\_^\s*\n\)\@<=\s\+\S\+/ end=/\(^\(+\|--\)\?\s*$\)\@=/ contains=asciidocToDo
+syn match asciidocURL /\\\@<!\<\(http\|https\|ftp\|file\|irc\):\/\/[^| \t]*\(\w\|\/\)/
+syn match asciidocEmail /[\\.:]\@<!\(\<\|<\)\w\(\w\|[.-]\)*@\(\w\|[.-]\)*\w>\?[0-9A-Za-z_]\@!/
+syn match asciidocAttributeRef /\\\@<!{\w\(\w\|[-,+]\)*\([=!@#$%?:].*\)\?}/
+
+" As a damage control measure quoted patterns always terminate at a blank
+" line (see 'Limitations' above).
+syn match asciidocQuotedAttributeList /\\\@<!\[[a-zA-Z0-9_-][a-zA-Z0-9 _-]*\][+_'`#*]\@=/
+syn match asciidocQuotedSubscript /\\\@<!\~\S\_.\{-}\(\~\|\n\s*\n\)/ contains=asciidocEntityRef
+syn match asciidocQuotedSuperscript /\\\@<!\^\S\_.\{-}\(\^\|\n\s*\n\)/ contains=asciidocEntityRef
+
+syn match asciidocQuotedMonospaced /\(^\|[| \t([.,=\]]\)\@<=+\([+ \n\t]\)\@!\(.\|\n\(\s*\n\)\@!\)\{-}\S\(+\([| \t)[\],.?!;:=]\|$\)\@=\)/ contains=asciidocEntityRef
+syn match asciidocQuotedMonospaced2 /\(^\|[| \t([.,=\]]\)\@<=`\([` \n\t]\)\@!\(.\|\n\(\s*\n\)\@!\)\{-}\S\(`\([| \t)[\],.?!;:=]\|$\)\@=\)/
+syn match asciidocQuotedUnconstrainedMonospaced /[\\+]\@<!++\S\_.\{-}\(++\|\n\s*\n\)/ contains=asciidocEntityRef
+
+syn match asciidocQuotedEmphasized /\(^\|[| \t([.,=\]]\)\@<=_\([_ \n\t]\)\@!\(.\|\n\(\s*\n\)\@!\)\{-}\S\(_\([| \t)[\],.?!;:=]\|$\)\@=\)/ contains=asciidocEntityRef
+syn match asciidocQuotedEmphasized2 /\(^\|[| \t([.,=\]]\)\@<='\([' \n\t]\)\@!\(.\|\n\(\s*\n\)\@!\)\{-}\S\('\([| \t)[\],.?!;:=]\|$\)\@=\)/ contains=asciidocEntityRef
+syn match asciidocQuotedUnconstrainedEmphasized /\\\@<!__\S\_.\{-}\(__\|\n\s*\n\)/ contains=asciidocEntityRef
+
+syn match asciidocQuotedBold /\(^\|[| \t([.,=\]]\)\@<=\*\([* \n\t]\)\@!\(.\|\n\(\s*\n\)\@!\)\{-}\S\(\*\([| \t)[\],.?!;:=]\|$\)\@=\)/ contains=asciidocEntityRef
+syn match asciidocQuotedUnconstrainedBold /\\\@<!\*\*\S\_.\{-}\(\*\*\|\n\s*\n\)/ contains=asciidocEntityRef
+
+" Don't allow ` in single quoted (a kludge to stop confusion with `monospaced`).
+syn match asciidocQuotedSingleQuoted /\(^\|[| \t([.,=\]]\)\@<=`\([` \n\t]\)\@!\([^`]\|\n\(\s*\n\)\@!\)\{-}[^` \t]\('\([| \t)[\],.?!;:=]\|$\)\@=\)/ contains=asciidocEntityRef
+
+syn match asciidocQuotedDoubleQuoted /\(^\|[| \t([.,=\]]\)\@<=``\([` \n\t]\)\@!\(.\|\n\(\s*\n\)\@!\)\{-}\S\(''\([| \t)[\],.?!;:=]\|$\)\@=\)/ contains=asciidocEntityRef
+
+syn match asciidocDoubleDollarPassthrough /\\\@<!\(^\|[^0-9a-zA-Z$]\)\@<=\$\$..\{-}\(\$\$\([^0-9a-zA-Z$]\|$\)\@=\|^$\)/
+syn match asciidocTriplePlusPassthrough /\\\@<!\(^\|[^0-9a-zA-Z$]\)\@<=+++..\{-}\(+++\([^0-9a-zA-Z$]\|$\)\@=\|^$\)/
+
+syn match asciidocAdmonition /^\u\{3,15}:\(\s\+.*\)\@=/
+
+syn region asciidocTable_OLD start=/^\([`.']\d*[-~_]*\)\+[-~_]\+\d*$/ end=/^$/
+syn match asciidocBlockTitle /^\.[^. \t].*[^-~_]$/ contains=asciidocQuoted.*,asciidocAttributeRef
+syn match asciidocTitleUnderline /[-=~^+]\{2,}$/ transparent contained contains=NONE
+syn match asciidocOneLineTitle /^=\{1,5}\s\+\S.*$/ contains=asciidocQuoted.*,asciidocMacroAttributes,asciidocAttributeRef,asciidocEntityRef,asciidocEmail,asciidocURL,asciidocBackslash
+syn match asciidocTwoLineTitle /^[^. +/].*[^.]\n[-=~^+]\{3,}$/ contains=asciidocQuoted.*,asciidocMacroAttributes,asciidocAttributeRef,asciidocEntityRef,asciidocEmail,asciidocURL,asciidocBackslash,asciidocTitleUnderline
+
+syn match asciidocAttributeList /^\[[^[ \t].*\]$/
+syn match asciidocQuoteBlockDelimiter /^_\{4,}$/
+syn match asciidocExampleBlockDelimiter /^=\{4,}$/
+syn match asciidocSidebarDelimiter /^*\{4,}$/
+
+" See http://vimdoc.sourceforge.net/htmldoc/usr_44.html for excluding region
+" contents from highlighting.
+syn match asciidocTablePrefix /\(\S\@<!\(\([0-9.]\+\)\([*+]\)\)\?\([<\^>.]\{,3}\)\?\([a-z]\)\?\)\?|/ containedin=asciidocTableBlock contained
+syn region asciidocTableBlock matchgroup=asciidocTableDelimiter start=/^|=\{3,}$/ end=/^|=\{3,}$/ keepend contains=ALL
+syn match asciidocTablePrefix /\(\S\@<!\(\([0-9.]\+\)\([*+]\)\)\?\([<\^>.]\{,3}\)\?\([a-z]\)\?\)\?!/ containedin=asciidocTableBlock contained
+syn region asciidocTableBlock2 matchgroup=asciidocTableDelimiter2 start=/^!=\{3,}$/ end=/^!=\{3,}$/ keepend contains=ALL
+
+syn match asciidocListContinuation /^+$/
+syn region asciidocLiteralBlock start=/^\.\{4,}$/ end=/^\.\{4,}$/ contains=asciidocCallout,asciidocToDo keepend
+syn region asciidocListingBlock start=/^-\{4,}$/ end=/^-\{4,}$/ contains=asciidocCallout,asciidocToDo keepend
+syn region asciidocCommentBlock start="^/\{4,}$" end="^/\{4,}$" contains=asciidocToDo
+syn region asciidocPassthroughBlock start="^+\{4,}$" end="^+\{4,}$"
+
+" Allowing leading \w characters in the filter delimiter is to accomodate
+" the pre version 8.2.7 syntax and may be removed in future releases.
+syn region asciidocFilterBlock start=/^\w*\~\{4,}$/ end=/^\w*\~\{4,}$/
+
+syn region asciidocMacroAttributes matchgroup=asciidocRefMacro start=/\\\@<!<<"\{-}\(\w\|-\|_\|:\|\.\)\+"\?,\?/ end=/\(>>\)\|^$/ contains=asciidocQuoted.* keepend
+syn region asciidocMacroAttributes matchgroup=asciidocAnchorMacro start=/\\\@<!\[\{2}\(\w\|-\|_\|:\|\.\)\+,\?/ end=/\]\{2}/ keepend
+syn region asciidocMacroAttributes matchgroup=asciidocAnchorMacro start=/\\\@<!\[\{3}\(\w\|-\|_\|:\|\.\)\+/ end=/\]\{3}/ keepend
+syn region asciidocMacroAttributes matchgroup=asciidocMacro start=/[\\0-9a-zA-Z]\@<!\w\(\w\|-\)*:\S\{-}\[/ skip=/\\\]/ end=/\]\|^$/ contains=asciidocQuoted.*,asciidocAttributeRef,asciidocEntityRef keepend
+" Highlight macro that starts with an attribute reference (a common idiom).
+syn region asciidocMacroAttributes matchgroup=asciidocMacro start=/\(\\\@<!{\w\(\w\|[-,+]\)*\([=!@#$%?:].*\)\?}\)\@<=\S\{-}\[/ skip=/\\\]/ end=/\]\|^$/ contains=asciidocQuoted.*,asciidocAttributeRef keepend
+syn region asciidocMacroAttributes matchgroup=asciidocIndexTerm start=/\\\@<!(\{2,3}/ end=/)\{2,3}/ contains=asciidocQuoted.*,asciidocAttributeRef keepend
+
+syn match asciidocCommentLine "^//\([^/].*\|\)$" contains=asciidocToDo
+
+syn region asciidocAttributeEntry start=/^:\w/ end=/:\(\s\|$\)/ oneline
+
+" Lists.
+syn match asciidocListBullet /^\s*\zs\(-\|\*\{1,5}\)\ze\s/
+syn match asciidocListNumber /^\s*\zs\(\(\d\+\.\)\|\.\{1,5}\|\(\a\.\)\|\([ivxIVX]\+)\)\)\ze\s\+/
+syn region asciidocListLabel start=/^\s*/ end=/\(:\{2,4}\|;;\)$/ oneline contains=asciidocQuoted.*,asciidocMacroAttributes,asciidocAttributeRef,asciidocEntityRef,asciidocEmail,asciidocURL,asciidocBackslash,asciidocToDo keepend
+" DEPRECATED: Horizontal label.
+syn region asciidocHLabel start=/^\s*/ end=/\(::\|;;\)\(\s\+\|\\$\)/ oneline contains=asciidocQuoted.*,asciidocMacroAttributes keepend
+" Starts with any of the above.
+syn region asciidocList start=/^\s*\(-\|\*\{1,5}\)\s/ start=/^\s*\(\(\d\+\.\)\|\.\{1,5}\|\(\a\.\)\|\([ivxIVX]\+)\)\)\s\+/ start=/.\+\(:\{2,4}\|;;\)$/ end=/\(^[=*]\{4,}$\)\@=/ end=/\(^\(+\|--\)\?\s*$\)\@=/ contains=asciidocList.\+,asciidocQuoted.*,asciidocMacroAttributes,asciidocAttributeRef,asciidocEntityRef,asciidocEmail,asciidocURL,asciidocBackslash,asciidocCommentLine,asciidocAttributeList,asciidocToDo
+
+hi def link asciidocAdmonition Special
+hi def link asciidocAnchorMacro Macro
+hi def link asciidocAttributeEntry Special
+hi def link asciidocAttributeList Special
+hi def link asciidocAttributeMacro Macro
+hi def link asciidocAttributeRef Special
+hi def link asciidocBackslash Special
+hi def link asciidocBlockTitle Title
+hi def link asciidocCallout Label
+hi def link asciidocCommentBlock Comment
+hi def link asciidocCommentLine Comment
+hi def link asciidocDoubleDollarPassthrough Special
+hi def link asciidocEmail Macro
+hi def link asciidocEntityRef Special
+hi def link asciidocExampleBlockDelimiter Type
+hi def link asciidocFilterBlock Type
+hi def link asciidocHLabel Label
+hi def link asciidocIdMarker Special
+hi def link asciidocIndexTerm Macro
+hi def link asciidocLineBreak Special
+hi def link asciidocOpenBlockDelimiter Label
+hi def link asciidocListBullet Label
+hi def link asciidocListContinuation Label
+hi def link asciidocListingBlock Identifier
+hi def link asciidocListLabel Label
+hi def link asciidocListNumber Label
+hi def link asciidocLiteralBlock Identifier
+hi def link asciidocLiteralParagraph Identifier
+hi def link asciidocMacroAttributes Label
+hi def link asciidocMacro Macro
+hi def link asciidocOneLineTitle Title
+hi def link asciidocPagebreak Type
+hi def link asciidocPassthroughBlock Identifier
+hi def link asciidocQuoteBlockDelimiter Type
+hi def link asciidocQuotedAttributeList Special
+hi def link asciidocQuotedBold Special
+hi def link asciidocQuotedDoubleQuoted Label
+hi def link asciidocQuotedEmphasized2 Type
+hi asciidocQuotedEmphasizedItalic term=italic cterm=italic gui=italic
+hi def link asciidocQuotedEmphasized asciidocQuotedEmphasizedItalic
+hi def link asciidocQuotedMonospaced2 Identifier
+hi def link asciidocQuotedMonospaced Identifier
+hi def link asciidocQuotedSingleQuoted Label
+hi def link asciidocQuotedSubscript Type
+hi def link asciidocQuotedSuperscript Type
+hi def link asciidocQuotedUnconstrainedBold Special
+hi def link asciidocQuotedUnconstrainedEmphasized Type
+hi def link asciidocQuotedUnconstrainedMonospaced Identifier
+hi def link asciidocRefMacro Macro
+hi def link asciidocRuler Type
+hi def link asciidocSidebarDelimiter Type
+hi def link asciidocTableBlock2 NONE
+hi def link asciidocTableBlock NONE
+hi def link asciidocTableDelimiter2 Label
+hi def link asciidocTableDelimiter Label
+hi def link asciidocTable_OLD Type
+hi def link asciidocTablePrefix2 Label
+hi def link asciidocTablePrefix Label
+hi def link asciidocToDo Todo
+hi def link asciidocTriplePlusPassthrough Special
+hi def link asciidocTwoLineTitle Title
+hi def link asciidocURL Macro
+let b:current_syntax = "asciidoc"
+
+" vim: wrap et sw=2 sts=2:
diff --git a/runtime/syntax/asm.vim b/runtime/syntax/asm.vim
new file mode 100644
index 0000000..73f283a
--- /dev/null
+++ b/runtime/syntax/asm.vim
@@ -0,0 +1,164 @@
+" Vim syntax file
+" Language: GNU Assembler
+" Maintainer: Doug Kearns dougkearns@gmail.com
+" Previous Maintainers: Erik Wognsen <erik.wognsen@gmail.com>
+" Kevin Dahlhausen <kdahlhaus@yahoo.com>
+" Contributors: Ori Avtalion, Lakshay Garg
+" Last Change: 2020 Oct 31
+
+" 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
+
+" storage types
+syn match asmType "\.long"
+syn match asmType "\.ascii"
+syn match asmType "\.asciz"
+syn match asmType "\.byte"
+syn match asmType "\.double"
+syn match asmType "\.float"
+syn match asmType "\.hword"
+syn match asmType "\.int"
+syn match asmType "\.octa"
+syn match asmType "\.quad"
+syn match asmType "\.short"
+syn match asmType "\.single"
+syn match asmType "\.space"
+syn match asmType "\.string"
+syn match asmType "\.word"
+
+syn match asmIdentifier "[a-z_][a-z0-9_]*"
+syn match asmLabel "[a-z_][a-z0-9_]*:"he=e-1
+
+" Various #'s as defined by GAS ref manual sec 3.6.2.1
+" Technically, the first asmDecimal def is actually octal,
+" since the value of 0-7 octal is the same as 0-7 decimal,
+" I (Kevin) prefer to map it as decimal:
+syn match asmDecimal "\<0\+[1-7]\=\>" display
+syn match asmDecimal "\<[1-9]\d*\>" display
+syn match asmOctal "\<0[0-7][0-7]\+\>" display
+syn match asmHexadecimal "\<0[xX][0-9a-fA-F]\+\>" display
+syn match asmBinary "\<0[bB][0-1]\+\>" display
+
+syn match asmFloat "\<\d\+\.\d*\%(e[+-]\=\d\+\)\=\>" display
+syn match asmFloat "\.\d\+\%(e[+-]\=\d\+\)\=\>" display
+syn match asmFloat "\<\d\%(e[+-]\=\d\+\)\>" display
+syn match asmFloat "[+-]\=Inf\>\|\<NaN\>" display
+
+syn match asmFloat "\%(0[edfghprs]\)[+-]\=\d*\%(\.\d\+\)\%(e[+-]\=\d\+\)\=" display
+syn match asmFloat "\%(0[edfghprs]\)[+-]\=\d\+\%(\.\d\+\)\=\%(e[+-]\=\d\+\)\=" display
+" Avoid fighting the hexadecimal match for unicorn-like '0x' prefixed floats
+syn match asmFloat "\%(0x\)[+-]\=\d*\%(\.\d\+\)\%(e[+-]\=\d\+\)\=" display
+
+" Allow all characters to be escaped (and in strings) as these vary across
+" architectures [See sec 3.6.1.1 Strings]
+syn match asmCharacterEscape "\\." contained
+syn match asmCharacter "'\\\=." contains=asmCharacterEscape
+
+syn match asmStringEscape "\\\_." contained
+syn match asmStringEscape "\\\%(\o\{3}\|00[89]\)" contained display
+syn match asmStringEscape "\\x\x\+" contained display
+
+syn region asmString start="\"" end="\"" skip="\\\\\|\\\"" contains=asmStringEscape
+
+syn keyword asmTodo contained TODO FIXME XXX NOTE
+
+" GAS supports one type of multi line comments:
+syn region asmComment start="/\*" end="\*/" contains=asmTodo,@Spell
+
+" GAS (undocumentedly?) supports C++ style comments. Unlike in C/C++ however,
+" a backslash ending a C++ style comment does not extend the comment to the
+" next line (hence the syntax region does not define 'skip="\\$"')
+syn region asmComment start="//" end="$" keepend contains=asmTodo,@Spell
+
+" Line comment characters depend on the target architecture and command line
+" options and some comments may double as logical line number directives or
+" preprocessor commands. This situation is described at
+" http://sourceware.org/binutils/docs-2.22/as/Comments.html
+" Some line comment characters have other meanings for other targets. For
+" example, .type directives may use the `@' character which is also an ARM
+" comment marker.
+" As a compromise to accommodate what I arbitrarily assume to be the most
+" frequently used features of the most popular architectures (and also the
+" non-GNU assembly languages that use this syntax file because their asm files
+" are also named *.asm), the following are used as line comment characters:
+syn match asmComment "[#;!|].*" contains=asmTodo,@Spell
+
+" Side effects of this include:
+" - When `;' is used to separate statements on the same line (many targets
+" support this), all statements except the first get highlighted as
+" comments. As a remedy, remove `;' from the above.
+" - ARM comments are not highlighted correctly. For ARM, uncomment the
+" following two lines and comment the one above.
+"syn match asmComment "@.*" contains=asmTodo
+"syn match asmComment "^#.*" contains=asmTodo
+
+" Advanced users of specific architectures will probably want to change the
+" comment highlighting or use a specific, more comprehensive syntax file.
+
+syn match asmInclude "\.include"
+syn match asmCond "\.if"
+syn match asmCond "\.else"
+syn match asmCond "\.endif"
+syn match asmMacro "\.macro"
+syn match asmMacro "\.endm"
+
+" Assembler directives start with a '.' and may contain upper case (e.g.,
+" .ABORT), numbers (e.g., .p2align), dash (e.g., .app-file) and underscore in
+" CFI directives (e.g., .cfi_startproc). This will also match labels starting
+" with '.', including the GCC auto-generated '.L' labels.
+syn match asmDirective "\.[A-Za-z][0-9A-Za-z-_]*"
+
+syn case match
+
+" Define the default highlighting.
+" 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
+
+if exists('g:asm_legacy_syntax_groups')
+ hi def link hexNumber Number
+ hi def link decNumber Number
+ hi def link octNumber Number
+ hi def link binNumber Number
+ hi def link asmHexadecimal hexNumber
+ hi def link asmDecimal decNumber
+ hi def link asmOctal octNumber
+ hi def link asmBinary binNumber
+else
+ hi def link asmHexadecimal Number
+ hi def link asmDecimal Number
+ hi def link asmOctal Number
+ hi def link asmBinary Number
+endif
+hi def link asmFloat Float
+
+hi def link asmString String
+hi def link asmStringEscape Special
+hi def link asmCharacter Character
+hi def link asmCharacterEscape Special
+
+hi def link asmIdentifier Identifier
+hi def link asmType Type
+
+let b:current_syntax = "asm"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet
diff --git a/runtime/syntax/asm68k.vim b/runtime/syntax/asm68k.vim
new file mode 100644
index 0000000..e13dfe6
--- /dev/null
+++ b/runtime/syntax/asm68k.vim
@@ -0,0 +1,378 @@
+" Vim syntax file
+" Language: Motorola 68000 Assembler
+" Maintainer: Steve Wall
+" Last change: 2001 May 01
+"
+" This is incomplete. In particular, support for 68020 and
+" up and 68851/68881 co-processors is partial or non-existant.
+" Feel free to contribute...
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Partial list of register symbols
+syn keyword asm68kReg a0 a1 a2 a3 a4 a5 a6 a7 d0 d1 d2 d3 d4 d5 d6 d7
+syn keyword asm68kReg pc sr ccr sp usp ssp
+
+" MC68010
+syn keyword asm68kReg vbr sfc sfcr dfc dfcr
+
+" MC68020
+syn keyword asm68kReg msp isp zpc cacr caar
+syn keyword asm68kReg za0 za1 za2 za3 za4 za5 za6 za7
+syn keyword asm68kReg zd0 zd1 zd2 zd3 zd4 zd5 zd6 zd7
+
+" MC68030
+syn keyword asm68kReg crp srp tc ac0 ac1 acusr tt0 tt1 mmusr
+
+" MC68040
+syn keyword asm68kReg dtt0 dtt1 itt0 itt1 urp
+
+" MC68851 registers
+syn keyword asm68kReg cal val scc crp srp drp tc ac psr pcsr
+syn keyword asm68kReg bac0 bac1 bac2 bac3 bac4 bac5 bac6 bac7
+syn keyword asm68kReg bad0 bad1 bad2 bad3 bad4 bad5 bad6 bad7
+
+" MC68881/82 registers
+syn keyword asm68kReg fp0 fp1 fp2 fp3 fp4 fp5 fp6 fp7
+syn keyword asm68kReg control status iaddr fpcr fpsr fpiar
+
+" M68000 opcodes - order is important!
+syn match asm68kOpcode "\<abcd\(\.b\)\=\s"
+syn match asm68kOpcode "\<adda\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<addi\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<addq\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<addx\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<add\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<andi\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<and\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<as[lr]\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<b[vc][cs]\(\.[bwls]\)\=\s"
+syn match asm68kOpcode "\<beq\(\.[bwls]\)\=\s"
+syn match asm68kOpcode "\<bg[et]\(\.[bwls]\)\=\s"
+syn match asm68kOpcode "\<b[hm]i\(\.[bwls]\)\=\s"
+syn match asm68kOpcode "\<bl[est]\(\.[bwls]\)\=\s"
+syn match asm68kOpcode "\<bne\(\.[bwls]\)\=\s"
+syn match asm68kOpcode "\<bpl\(\.[bwls]\)\=\s"
+syn match asm68kOpcode "\<bchg\(\.[bl]\)\=\s"
+syn match asm68kOpcode "\<bclr\(\.[bl]\)\=\s"
+syn match asm68kOpcode "\<bfchg\s"
+syn match asm68kOpcode "\<bfclr\s"
+syn match asm68kOpcode "\<bfexts\s"
+syn match asm68kOpcode "\<bfextu\s"
+syn match asm68kOpcode "\<bfffo\s"
+syn match asm68kOpcode "\<bfins\s"
+syn match asm68kOpcode "\<bfset\s"
+syn match asm68kOpcode "\<bftst\s"
+syn match asm68kOpcode "\<bkpt\s"
+syn match asm68kOpcode "\<bra\(\.[bwls]\)\=\s"
+syn match asm68kOpcode "\<bset\(\.[bl]\)\=\s"
+syn match asm68kOpcode "\<bsr\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<btst\(\.[bl]\)\=\s"
+syn match asm68kOpcode "\<callm\s"
+syn match asm68kOpcode "\<cas2\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<cas\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<chk2\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<chk\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<clr\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<cmpa\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<cmpi\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<cmpm\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<cmp2\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<cmp\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<db[cv][cs]\(\.w\)\=\s"
+syn match asm68kOpcode "\<dbeq\(\.w\)\=\s"
+syn match asm68kOpcode "\<db[ft]\(\.w\)\=\s"
+syn match asm68kOpcode "\<dbg[et]\(\.w\)\=\s"
+syn match asm68kOpcode "\<db[hm]i\(\.w\)\=\s"
+syn match asm68kOpcode "\<dbl[est]\(\.w\)\=\s"
+syn match asm68kOpcode "\<dbne\(\.w\)\=\s"
+syn match asm68kOpcode "\<dbpl\(\.w\)\=\s"
+syn match asm68kOpcode "\<dbra\(\.w\)\=\s"
+syn match asm68kOpcode "\<div[su]\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<div[su]l\(\.l\)\=\s"
+syn match asm68kOpcode "\<eori\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<eor\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<exg\(\.l\)\=\s"
+syn match asm68kOpcode "\<extb\(\.l\)\=\s"
+syn match asm68kOpcode "\<ext\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<illegal\>"
+syn match asm68kOpcode "\<jmp\(\.[ls]\)\=\s"
+syn match asm68kOpcode "\<jsr\(\.[ls]\)\=\s"
+syn match asm68kOpcode "\<lea\(\.l\)\=\s"
+syn match asm68kOpcode "\<link\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<ls[lr]\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<movea\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<movec\(\.l\)\=\s"
+syn match asm68kOpcode "\<movem\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<movep\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<moveq\(\.l\)\=\s"
+syn match asm68kOpcode "\<moves\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<move\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<mul[su]\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<nbcd\(\.b\)\=\s"
+syn match asm68kOpcode "\<negx\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<neg\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<nop\>"
+syn match asm68kOpcode "\<not\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<ori\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<or\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<pack\s"
+syn match asm68kOpcode "\<pea\(\.l\)\=\s"
+syn match asm68kOpcode "\<reset\>"
+syn match asm68kOpcode "\<ro[lr]\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<rox[lr]\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<rt[dm]\s"
+syn match asm68kOpcode "\<rt[ers]\>"
+syn match asm68kOpcode "\<sbcd\(\.b\)\=\s"
+syn match asm68kOpcode "\<s[cv][cs]\(\.b\)\=\s"
+syn match asm68kOpcode "\<seq\(\.b\)\=\s"
+syn match asm68kOpcode "\<s[ft]\(\.b\)\=\s"
+syn match asm68kOpcode "\<sg[et]\(\.b\)\=\s"
+syn match asm68kOpcode "\<s[hm]i\(\.b\)\=\s"
+syn match asm68kOpcode "\<sl[est]\(\.b\)\=\s"
+syn match asm68kOpcode "\<sne\(\.b\)\=\s"
+syn match asm68kOpcode "\<spl\(\.b\)\=\s"
+syn match asm68kOpcode "\<suba\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<subi\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<subq\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<subx\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<sub\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<swap\(\.w\)\=\s"
+syn match asm68kOpcode "\<tas\(\.b\)\=\s"
+syn match asm68kOpcode "\<tdiv[su]\(\.l\)\=\s"
+syn match asm68kOpcode "\<t\(rap\)\=[cv][cs]\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<t\(rap\)\=eq\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<t\(rap\)\=[ft]\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<t\(rap\)\=g[et]\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<t\(rap\)\=[hm]i\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<t\(rap\)\=l[est]\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<t\(rap\)\=ne\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<t\(rap\)\=pl\(\.[wl]\)\=\s"
+syn match asm68kOpcode "\<t\(rap\)\=v\>"
+syn match asm68kOpcode "\<t\(rap\)\=[cv][cs]\>"
+syn match asm68kOpcode "\<t\(rap\)\=eq\>"
+syn match asm68kOpcode "\<t\(rap\)\=[ft]\>"
+syn match asm68kOpcode "\<t\(rap\)\=g[et]\>"
+syn match asm68kOpcode "\<t\(rap\)\=[hm]i\>"
+syn match asm68kOpcode "\<t\(rap\)\=l[est]\>"
+syn match asm68kOpcode "\<t\(rap\)\=ne\>"
+syn match asm68kOpcode "\<t\(rap\)\=pl\>"
+syn match asm68kOpcode "\<trap\s"
+syn match asm68kOpcode "\<tst\(\.[bwl]\)\=\s"
+syn match asm68kOpcode "\<unlk\s"
+syn match asm68kOpcode "\<unpk\s"
+
+" Valid labels
+syn match asm68kLabel "^[a-z_?.][a-z0-9_?.$]*$"
+syn match asm68kLabel "^[a-z_?.][a-z0-9_?.$]*\s"he=e-1
+syn match asm68kLabel "^\s*[a-z_?.][a-z0-9_?.$]*:"he=e-1
+
+" Various number formats
+syn match hexNumber "\$[0-9a-fA-F]\+\>"
+syn match hexNumber "\<[0-9][0-9a-fA-F]*H\>"
+syn match octNumber "@[0-7]\+\>"
+syn match octNumber "\<[0-7]\+[QO]\>"
+syn match binNumber "%[01]\+\>"
+syn match binNumber "\<[01]\+B\>"
+syn match decNumber "\<[0-9]\+D\=\>"
+syn match floatE "_*E_*" contained
+syn match floatExponent "_*E_*[-+]\=[0-9]\+" contained contains=floatE
+syn match floatNumber "[-+]\=[0-9]\+_*E_*[-+]\=[0-9]\+" contains=floatExponent
+syn match floatNumber "[-+]\=[0-9]\+\.[0-9]\+\(E[-+]\=[0-9]\+\)\=" contains=floatExponent
+syn match floatNumber ":\([0-9a-f]\+_*\)\+"
+
+" Character string constants
+syn match asm68kStringError "'[ -~]*'"
+syn match asm68kStringError "'[ -~]*$"
+syn region asm68kString start="'" skip="''" end="'" oneline contains=asm68kCharError
+syn match asm68kCharError "[^ -~]" contained
+
+" Immediate data
+syn match asm68kImmediate "#\$[0-9a-fA-F]\+" contains=hexNumber
+syn match asm68kImmediate "#[0-9][0-9a-fA-F]*H" contains=hexNumber
+syn match asm68kImmediate "#@[0-7]\+" contains=octNumber
+syn match asm68kImmediate "#[0-7]\+[QO]" contains=octNumber
+syn match asm68kImmediate "#%[01]\+" contains=binNumber
+syn match asm68kImmediate "#[01]\+B" contains=binNumber
+syn match asm68kImmediate "#[0-9]\+D\=" contains=decNumber
+syn match asm68kSymbol "[a-z_?.][a-z0-9_?.$]*" contained
+syn match asm68kImmediate "#[a-z_?.][a-z0-9_?.]*" contains=asm68kSymbol
+
+" Special items for comments
+syn keyword asm68kTodo contained TODO
+
+" Operators
+syn match asm68kOperator "[-+*/]" " Must occur before Comments
+syn match asm68kOperator "\.SIZEOF\."
+syn match asm68kOperator "\.STARTOF\."
+syn match asm68kOperator "<<" " shift left
+syn match asm68kOperator ">>" " shift right
+syn match asm68kOperator "&" " bit-wise logical and
+syn match asm68kOperator "!" " bit-wise logical or
+syn match asm68kOperator "!!" " exclusive or
+syn match asm68kOperator "<>" " inequality
+syn match asm68kOperator "=" " must be before other ops containing '='
+syn match asm68kOperator ">="
+syn match asm68kOperator "<="
+syn match asm68kOperator "==" " operand existance - used in macro definitions
+
+" Condition code style operators
+syn match asm68kOperator "<[CV][CS]>"
+syn match asm68kOperator "<EQ>"
+syn match asm68kOperator "<G[TE]>"
+syn match asm68kOperator "<[HM]I>"
+syn match asm68kOperator "<L[SET]>"
+syn match asm68kOperator "<NE>"
+syn match asm68kOperator "<PL>"
+
+" Comments
+syn match asm68kComment ";.*" contains=asm68kTodo
+syn match asm68kComment "\s!.*"ms=s+1 contains=asm68kTodo
+syn match asm68kComment "^\s*[*!].*" contains=asm68kTodo
+
+" Include
+syn match asm68kInclude "\<INCLUDE\s"
+
+" Standard macros
+syn match asm68kCond "\<IF\(\.[BWL]\)\=\s"
+syn match asm68kCond "\<THEN\(\.[SL]\)\=\>"
+syn match asm68kCond "\<ELSE\(\.[SL]\)\=\>"
+syn match asm68kCond "\<ENDI\>"
+syn match asm68kCond "\<BREAK\(\.[SL]\)\=\>"
+syn match asm68kRepeat "\<FOR\(\.[BWL]\)\=\s"
+syn match asm68kRepeat "\<DOWNTO\s"
+syn match asm68kRepeat "\<TO\s"
+syn match asm68kRepeat "\<BY\s"
+syn match asm68kRepeat "\<DO\(\.[SL]\)\=\>"
+syn match asm68kRepeat "\<ENDF\>"
+syn match asm68kRepeat "\<NEXT\(\.[SL]\)\=\>"
+syn match asm68kRepeat "\<REPEAT\>"
+syn match asm68kRepeat "\<UNTIL\(\.[BWL]\)\=\s"
+syn match asm68kRepeat "\<WHILE\(\.[BWL]\)\=\s"
+syn match asm68kRepeat "\<ENDW\>"
+
+" Macro definition
+syn match asm68kMacro "\<MACRO\>"
+syn match asm68kMacro "\<LOCAL\s"
+syn match asm68kMacro "\<MEXIT\>"
+syn match asm68kMacro "\<ENDM\>"
+syn match asm68kMacroParam "\\[0-9]"
+
+" Conditional assembly
+syn match asm68kPreCond "\<IFC\s"
+syn match asm68kPreCond "\<IFDEF\s"
+syn match asm68kPreCond "\<IFEQ\s"
+syn match asm68kPreCond "\<IFGE\s"
+syn match asm68kPreCond "\<IFGT\s"
+syn match asm68kPreCond "\<IFLE\s"
+syn match asm68kPreCond "\<IFLT\s"
+syn match asm68kPreCond "\<IFNC\>"
+syn match asm68kPreCond "\<IFNDEF\s"
+syn match asm68kPreCond "\<IFNE\s"
+syn match asm68kPreCond "\<ELSEC\>"
+syn match asm68kPreCond "\<ENDC\>"
+
+" Loop control
+syn match asm68kPreCond "\<REPT\s"
+syn match asm68kPreCond "\<IRP\s"
+syn match asm68kPreCond "\<IRPC\s"
+syn match asm68kPreCond "\<ENDR\>"
+
+" Directives
+syn match asm68kDirective "\<ALIGN\s"
+syn match asm68kDirective "\<CHIP\s"
+syn match asm68kDirective "\<COMLINE\s"
+syn match asm68kDirective "\<COMMON\(\.S\)\=\s"
+syn match asm68kDirective "\<DC\(\.[BWLSDXP]\)\=\s"
+syn match asm68kDirective "\<DC\.\\[0-9]\s"me=e-3 " Special use in a macro def
+syn match asm68kDirective "\<DCB\(\.[BWLSDXP]\)\=\s"
+syn match asm68kDirective "\<DS\(\.[BWLSDXP]\)\=\s"
+syn match asm68kDirective "\<END\>"
+syn match asm68kDirective "\<EQU\s"
+syn match asm68kDirective "\<FEQU\(\.[SDXP]\)\=\s"
+syn match asm68kDirective "\<FAIL\>"
+syn match asm68kDirective "\<FOPT\s"
+syn match asm68kDirective "\<\(NO\)\=FORMAT\>"
+syn match asm68kDirective "\<IDNT\>"
+syn match asm68kDirective "\<\(NO\)\=LIST\>"
+syn match asm68kDirective "\<LLEN\s"
+syn match asm68kDirective "\<MASK2\>"
+syn match asm68kDirective "\<NAME\s"
+syn match asm68kDirective "\<NOOBJ\>"
+syn match asm68kDirective "\<OFFSET\s"
+syn match asm68kDirective "\<OPT\>"
+syn match asm68kDirective "\<ORG\(\.[SL]\)\=\>"
+syn match asm68kDirective "\<\(NO\)\=PAGE\>"
+syn match asm68kDirective "\<PLEN\s"
+syn match asm68kDirective "\<REG\s"
+syn match asm68kDirective "\<RESTORE\>"
+syn match asm68kDirective "\<SAVE\>"
+syn match asm68kDirective "\<SECT\(\.S\)\=\s"
+syn match asm68kDirective "\<SECTION\(\.S\)\=\s"
+syn match asm68kDirective "\<SET\s"
+syn match asm68kDirective "\<SPC\s"
+syn match asm68kDirective "\<TTL\s"
+syn match asm68kDirective "\<XCOM\s"
+syn match asm68kDirective "\<XDEF\s"
+syn match asm68kDirective "\<XREF\(\.S\)\=\s"
+
+syn case match
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/asmh8300.vim b/runtime/syntax/asmh8300.vim
new file mode 100644
index 0000000..2eabb7e
--- /dev/null
+++ b/runtime/syntax/asmh8300.vim
@@ -0,0 +1,58 @@
+" Vim syntax file
+" Language: Hitachi H-8300h specific syntax for GNU Assembler
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Kevin Dahlhausen <kdahlhaus@yahoo.com>
+" Last Change: 2020 Oct 31
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/asm.vim
+
+syn case ignore
+
+syn match asmDirective "\.h8300[hs]n\="
+
+"h8300[h] registers
+syn match asmRegister "e\=r\o[lh]\="
+
+"h8300[h] opcodes - order is important!
+syn match asmOpcode "add\.[lbw]"
+syn match asmOpcode "add[sx :]"
+syn match asmOpcode "and\.[lbw]"
+syn match asmOpcode "bl[deots]"
+syn match asmOpcode "cmp\.[lbw]"
+syn match asmOpcode "dec\.[lbw]"
+syn match asmOpcode "divx[us].[bw]"
+syn match asmOpcode "ext[su]\.[lw]"
+syn match asmOpcode "inc\.[lw]"
+syn match asmOpcode "mov\.[lbw]"
+syn match asmOpcode "mulx[su]\.[bw]"
+syn match asmOpcode "neg\.[lbw]"
+syn match asmOpcode "not\.[lbw]"
+syn match asmOpcode "or\.[lbw]"
+syn match asmOpcode "pop\.[wl]"
+syn match asmOpcode "push\.[wl]"
+syn match asmOpcode "rotx\=[lr]\.[lbw]"
+syn match asmOpcode "sha[lr]\.[lbw]"
+syn match asmOpcode "shl[lr]\.[lbw]"
+syn match asmOpcode "sub\.[lbw]"
+syn match asmOpcode "xor\.[lbw]"
+
+syn keyword asmOpcode andc band bcc bclr bcs beq bf bge bgt
+syn keyword asmOpcode bhi bhs biand bild bior bist bixor bmi
+syn keyword asmOpcode bne bnot bnp bor bpl bpt bra brn bset
+syn keyword asmOpcode bsr btst bst bt bvc bvs bxor cmp daa
+syn keyword asmOpcode das eepmov eepmovw inc jmp jsr ldc movfpe
+syn keyword asmOpcode movtpe mov nop orc rte rts sleep stc
+syn keyword asmOpcode sub trapa xorc
+
+syn case match
+
+hi def link asmOpcode Statement
+hi def link asmRegister Identifier
+
+let b:current_syntax = "asmh8300"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet
diff --git a/runtime/syntax/asn.vim b/runtime/syntax/asn.vim
new file mode 100644
index 0000000..e90c7e0
--- /dev/null
+++ b/runtime/syntax/asn.vim
@@ -0,0 +1,73 @@
+" Vim syntax file
+" Language: ASN.1
+" Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" URL: http://www.fleiner.com/vim/syntax/asn.vim
+" Last Change: 2012 Oct 05
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" keyword definitions
+syn keyword asnExternal DEFINITIONS BEGIN END IMPORTS EXPORTS FROM
+syn match asnExternal "\<IMPLICIT\s\+TAGS\>"
+syn match asnExternal "\<EXPLICIT\s\+TAGS\>"
+syn keyword asnFieldOption DEFAULT OPTIONAL
+syn keyword asnTagModifier IMPLICIT EXPLICIT
+syn keyword asnTypeInfo ABSENT PRESENT SIZE UNIVERSAL APPLICATION PRIVATE
+syn keyword asnBoolValue TRUE FALSE
+syn keyword asnNumber MIN MAX
+syn match asnNumber "\<PLUS-INFINITY\>"
+syn match asnNumber "\<MINUS-INFINITY\>"
+syn keyword asnType INTEGER REAL STRING BIT BOOLEAN OCTET NULL EMBEDDED PDV
+syn keyword asnType BMPString IA5String TeletexString GeneralString GraphicString ISO646String NumericString PrintableString T61String UniversalString VideotexString VisibleString
+syn keyword asnType ANY DEFINED
+syn match asnType "\.\.\."
+syn match asnType "OBJECT\s\+IDENTIFIER"
+syn match asnType "TYPE-IDENTIFIER"
+syn keyword asnType UTF8String
+syn keyword asnStructure CHOICE SEQUENCE SET OF ENUMERATED CONSTRAINED BY WITH COMPONENTS CLASS
+
+" Strings and constants
+syn match asnSpecial contained "\\\d\d\d\|\\."
+syn region asnString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=asnSpecial
+syn match asnCharacter "'[^\\]'"
+syn match asnSpecialCharacter "'\\.'"
+syn match asnNumber "-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>"
+syn match asnLineComment "--.*"
+syn match asnLineComment "--.*--"
+
+syn match asnDefinition "^\s*[a-zA-Z][-a-zA-Z0-9_.\[\] \t{}]* *::="me=e-3 contains=asnType
+syn match asnBraces "[{}]"
+
+syn sync ccomment asnComment
+
+" Define the default highlighting.
+" 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
+let b:current_syntax = "asn"
+
+" vim: ts=8
diff --git a/runtime/syntax/aspperl.vim b/runtime/syntax/aspperl.vim
new file mode 100644
index 0000000..5a9abed
--- /dev/null
+++ b/runtime/syntax/aspperl.vim
@@ -0,0 +1,25 @@
+" Vim syntax file
+" Language: Active State's PerlScript (ASP)
+" Maintainer: Aaron Hope <edh@brioforge.com>
+" URL: http://nim.dhs.org/~edh/aspperl.vim
+" Last Change: 2001 May 09
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'perlscript'
+endif
+
+runtime! syntax/html.vim
+unlet b:current_syntax
+syn include @AspPerlScript syntax/perl.vim
+
+syn cluster htmlPreproc add=AspPerlScriptInsideHtmlTags
+
+syn region AspPerlScriptInsideHtmlTags keepend matchgroup=Delimiter start=+<%=\=+ skip=+".*%>.*"+ end=+%>+ contains=@AspPerlScript
+syn region AspPerlScriptInsideHtmlTags keepend matchgroup=Delimiter start=+<script\s\+language="\=perlscript"\=[^>]*>+ end=+</script>+ contains=@AspPerlScript
+
+let b:current_syntax = "aspperl"
diff --git a/runtime/syntax/aspvbs.vim b/runtime/syntax/aspvbs.vim
new file mode 100644
index 0000000..44909b6
--- /dev/null
+++ b/runtime/syntax/aspvbs.vim
@@ -0,0 +1,182 @@
+" Vim syntax file
+" Language: Microsoft VBScript Web Content (ASP)
+" Maintainer: Devin Weaver <ktohg@tritarget.com> (non-functional)
+" URL: http://tritarget.com/pub/vim/syntax/aspvbs.vim (broken)
+" Last Change: 2006 Jun 19
+" by Dan Casey
+" Version: $Revision: 1.3 $
+" Thanks to Jay-Jay <vim@jay-jay.net> for a syntax sync hack, hungarian
+" notation, and extra highlighting.
+" Thanks to patrick dehne <patrick@steidle.net> for the folding code.
+" 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 exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'aspvbs'
+endif
+
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+syn cluster htmlPreProc add=AspVBScriptInsideHtmlTags
+
+
+" Colored variable names, if written in hungarian notation
+hi def AspVBSVariableSimple term=standout ctermfg=3 guifg=#99ee99
+hi def AspVBSVariableComplex term=standout ctermfg=3 guifg=#ee9900
+syn match AspVBSVariableSimple contained "\<\(bln\|byt\|dtm\=\|dbl\|int\|str\)\u\w*"
+syn match AspVBSVariableComplex contained "\<\(arr\|ary\|obj\)\u\w*"
+
+
+" Functions and methods that are in VB but will cause errors in an ASP page
+" This is helpful if your porting VB code to ASP
+" I removed (Count, Item) because these are common variable names in AspVBScript
+syn keyword AspVBSError contained Val Str CVar CVDate DoEvents GoSub Return GoTo
+syn keyword AspVBSError contained Stop LinkExecute Add Type LinkPoke
+syn keyword AspVBSError contained LinkRequest LinkSend Declare Optional Sleep
+syn keyword AspVBSError contained ParamArray Static Erl TypeOf Like LSet RSet Mid StrConv
+" It may seem that most of these can fit into a keyword clause but keyword takes
+" priority over all so I can't get the multi-word matches
+syn match AspVBSError contained "\<Def[a-zA-Z0-9_]\+\>"
+syn match AspVBSError contained "^\s*Open\s\+"
+syn match AspVBSError contained "Debug\.[a-zA-Z0-9_]*"
+syn match AspVBSError contained "^\s*[a-zA-Z0-9_]\+:"
+syn match AspVBSError contained "[a-zA-Z0-9_]\+![a-zA-Z0-9_]\+"
+syn match AspVBSError contained "^\s*#.*$"
+syn match AspVBSError contained "\<As\s\+[a-zA-Z0-9_]*"
+syn match AspVBSError contained "\<End\>\|\<Exit\>"
+syn match AspVBSError contained "\<On\s\+Error\>\|\<On\>\|\<Error\>\|\<Resume\s\+Next\>\|\<Resume\>"
+syn match AspVBSError contained "\<Option\s\+\(Base\|Compare\|Private\s\+Module\)\>"
+" This one I want 'cause I always seem to mis-spell it.
+syn match AspVBSError contained "Respon\?ce\.\S*"
+syn match AspVBSError contained "Respose\.\S*"
+" When I looked up the VBScript syntax it mentioned that Property Get/Set/Let
+" statements are illegal, however, I have received reports that they do work.
+" So I commented it out for now.
+" syn match AspVBSError contained "\<Property\s\+\(Get\|Let\|Set\)\>"
+
+" AspVBScript Reserved Words.
+syn match AspVBSStatement contained "\<On\s\+Error\s\+\(Resume\s\+Next\|goto\s\+0\)\>\|\<Next\>"
+syn match AspVBSStatement contained "\<End\s\+\(If\|For\|Select\|Class\|Function\|Sub\|With\|Property\)\>"
+syn match AspVBSStatement contained "\<Exit\s\+\(Do\|For\|Sub\|Function\)\>"
+syn match AspVBSStatement contained "\<Exit\s\+\(Do\|For\|Sub\|Function\|Property\)\>"
+syn match AspVBSStatement contained "\<Option\s\+Explicit\>"
+syn match AspVBSStatement contained "\<For\s\+Each\>\|\<For\>"
+syn match AspVBSStatement contained "\<Set\>"
+syn keyword AspVBSStatement contained Call Class Const Default Dim Do Loop Erase And
+syn keyword AspVBSStatement contained Function If Then Else ElseIf Or
+syn keyword AspVBSStatement contained Private Public Randomize ReDim
+syn keyword AspVBSStatement contained Select Case Sub While With Wend Not
+
+" AspVBScript Functions
+syn keyword AspVBSFunction contained Abs Array Asc Atn CBool CByte CCur CDate CDbl
+syn keyword AspVBSFunction contained Chr CInt CLng Cos CreateObject CSng CStr Date
+syn keyword AspVBSFunction contained DateAdd DateDiff DatePart DateSerial DateValue
+syn keyword AspVBSFunction contained Date Day Exp Filter Fix FormatCurrency
+syn keyword AspVBSFunction contained FormatDateTime FormatNumber FormatPercent
+syn keyword AspVBSFunction contained GetObject Hex Hour InputBox InStr InStrRev Int
+syn keyword AspVBSFunction contained IsArray IsDate IsEmpty IsNull IsNumeric
+syn keyword AspVBSFunction contained IsObject Join LBound LCase Left Len LoadPicture
+syn keyword AspVBSFunction contained Log LTrim Mid Minute Month MonthName MsgBox Now
+syn keyword AspVBSFunction contained Oct Replace RGB Right Rnd Round RTrim
+syn keyword AspVBSFunction contained ScriptEngine ScriptEngineBuildVersion
+syn keyword AspVBSFunction contained ScriptEngineMajorVersion
+syn keyword AspVBSFunction contained ScriptEngineMinorVersion Second Sgn Sin Space
+syn keyword AspVBSFunction contained Split Sqr StrComp StrReverse String Tan Time Timer
+syn keyword AspVBSFunction contained TimeSerial TimeValue Trim TypeName UBound UCase
+syn keyword AspVBSFunction contained VarType Weekday WeekdayName Year
+
+" AspVBScript Methods
+syn keyword AspVBSMethods contained Add AddFolders BuildPath Clear Close Copy
+syn keyword AspVBSMethods contained CopyFile CopyFolder CreateFolder CreateTextFile
+syn keyword AspVBSMethods contained Delete DeleteFile DeleteFolder DriveExists
+syn keyword AspVBSMethods contained Exists FileExists FolderExists
+syn keyword AspVBSMethods contained GetAbsolutePathName GetBaseName GetDrive
+syn keyword AspVBSMethods contained GetDriveName GetExtensionName GetFile
+syn keyword AspVBSMethods contained GetFileName GetFolder GetParentFolderName
+syn keyword AspVBSMethods contained GetSpecialFolder GetTempName Items Keys Move
+syn keyword AspVBSMethods contained MoveFile MoveFolder OpenAsTextStream
+syn keyword AspVBSMethods contained OpenTextFile Raise Read ReadAll ReadLine Remove
+syn keyword AspVBSMethods contained RemoveAll Skip SkipLine Write WriteBlankLines
+syn keyword AspVBSMethods contained WriteLine
+syn match AspVBSMethods contained "Response\.\w*"
+" Colorize boolean constants:
+syn keyword AspVBSMethods contained true false
+
+" AspVBScript Number Constants
+" Integer number, or floating point number without a dot.
+syn match AspVBSNumber contained "\<\d\+\>"
+" Floating point number, with dot
+syn match AspVBSNumber contained "\<\d\+\.\d*\>"
+" Floating point number, starting with a dot
+syn match AspVBSNumber contained "\.\d\+\>"
+
+" String and Character Constants
+" removed (skip=+\\\\\|\\"+) because VB doesn't have backslash escaping in
+" strings (or does it?)
+syn region AspVBSString contained start=+"+ end=+"+ keepend
+
+" AspVBScript Comments
+syn region AspVBSComment contained start="^REM\s\|\sREM\s" end="$" contains=AspVBSTodo keepend
+syn region AspVBSComment contained start="^'\|\s'" end="$" contains=AspVBSTodo keepend
+" misc. Commenting Stuff
+syn keyword AspVBSTodo contained TODO FIXME
+
+" Cosmetic syntax errors commanly found in VB but not in AspVBScript
+" AspVBScript doesn't use line numbers
+syn region AspVBSError contained start="^\d" end="\s" keepend
+" AspVBScript also doesn't have type defining variables
+syn match AspVBSError contained "[a-zA-Z0-9_][\$&!#]"ms=s+1
+" Since 'a%' is a VB variable with a type and in AspVBScript you can have 'a%>'
+" I have to make a special case so 'a%>' won't show as an error.
+syn match AspVBSError contained "[a-zA-Z0-9_]%\($\|[^>]\)"ms=s+1
+
+" Top Cluster
+syn cluster AspVBScriptTop contains=AspVBSStatement,AspVBSFunction,AspVBSMethods,AspVBSNumber,AspVBSString,AspVBSComment,AspVBSError,AspVBSVariableSimple,AspVBSVariableComplex
+
+" Folding
+syn region AspVBSFold start="^\s*\(class\)\s\+.*$" end="^\s*end\s\+\(class\)\>.*$" fold contained transparent keepend
+syn region AspVBSFold start="^\s*\(private\|public\)\=\(\s\+default\)\=\s\+\(sub\|function\)\s\+.*$" end="^\s*end\s\+\(function\|sub\)\>.*$" fold contained transparent keepend
+
+" Define AspVBScript delimiters
+" <%= func("string_with_%>_in_it") %> This is illegal in ASP syntax.
+syn region AspVBScriptInsideHtmlTags keepend matchgroup=Delimiter start=+<%=\=+ end=+%>+ contains=@AspVBScriptTop, AspVBSFold
+syn region AspVBScriptInsideHtmlTags keepend matchgroup=Delimiter start=+<script\s\+language="\=vbscript"\=[^>]*\s\+runatserver[^>]*>+ end=+</script>+ contains=@AspVBScriptTop
+
+
+" Synchronization
+" syn sync match AspVBSSyncGroup grouphere AspVBScriptInsideHtmlTags "<%"
+" This is a kludge so the HTML will sync properly
+syn sync match htmlHighlight grouphere htmlTag "%>"
+
+
+
+" Define the default highlighting.
+" 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"
+
+if main_syntax == 'aspvbs'
+ unlet main_syntax
+endif
+
+" vim: ts=8:sw=2:sts=0:noet
diff --git a/runtime/syntax/asterisk.vim b/runtime/syntax/asterisk.vim
new file mode 100644
index 0000000..4b3d246
--- /dev/null
+++ b/runtime/syntax/asterisk.vim
@@ -0,0 +1,88 @@
+" Vim syntax file
+" Language: Asterisk config file
+" Maintainer: Jean Aunis <jean.aunis@yahoo.fr>
+" Previous Maintainer: brc007
+" Updated for 1.2 by Tilghman Lesher (Corydon76)
+" Last Change: 2015 Feb 27
+" version 0.4
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn sync clear
+syn sync fromstart
+
+syn keyword asteriskTodo TODO contained
+syn match asteriskComment ";.*" contains=asteriskTodo
+syn match asteriskContext "\[.\{-}\]"
+syn match asteriskExten "^\s*\zsexten\s*=>\?\s*[^,]\+\ze," contains=asteriskPattern nextgroup=asteriskPriority
+syn match asteriskExten "^\s*\zssame\s*=>\?\s*\ze" nextgroup=asteriskPriority
+syn match asteriskExten "^\s*\(register\|channel\|ignorepat\|include\|l\?e\?switch\|\(no\)\?load\)\s*=>\?"
+syn match asteriskPattern "_\(\[[[:alnum:]#*\-]\+\]\|[[:alnum:]#*]\)*\.\?" contained
+syn match asteriskPattern "[^A-Za-z0-9,]\zs[[:alnum:]#*]\+\ze" contained
+syn match asteriskApp ",\zs[a-zA-Z]\+\ze$"
+syn match asteriskApp ",\zs[a-zA-Z]\+\ze("
+" Digits plus oldlabel (newlabel)
+syn match asteriskPriority "\zs[[:digit:]]\+\(+[[:alpha:]][[:alnum:]_]*\)\?\(([[:alpha:]][[:alnum:]_]*)\)\?\ze," contains=asteriskLabel
+" oldlabel plus digits (newlabel)
+syn match asteriskPriority "\zs[[:alpha:]][[:alnum:]_]*+[[:digit:]]\+\(([[:alpha:]][[:alnum:]_]*)\)\?\ze," contains=asteriskLabel
+" s or n plus digits (newlabel)
+syn match asteriskPriority "\zs[sn]\(+[[:digit:]]\+\)\?\(([[:alpha:]][[:alnum:]_]*)\)\?\ze," contains=asteriskLabel
+syn match asteriskLabel "(\zs[[:alpha:]][[:alnum:]]*\ze)" contained
+syn match asteriskError "^\s*#\s*[[:alnum:]]*"
+syn match asteriskInclude "^\s*#\s*\(include\|exec\)\s.*"
+syn match asteriskVar "\${_\{0,2}[[:alpha:]][[:alnum:]_]*\(:-\?[[:digit:]]\+\(:[[:digit:]]\+\)\?\)\?}"
+syn match asteriskVar "_\{0,2}[[:alpha:]][[:alnum:]_]*\ze="
+syn match asteriskVarLen "\${_\{0,2}[[:alpha:]][[:alnum:]_]*(.*)}" contains=asteriskVar,asteriskVarLen,asteriskExp
+syn match asteriskVarLen "(\zs[[:alpha:]][[:alnum:]_]*(.\{-})\ze=" contains=asteriskVar,asteriskVarLen,asteriskExp
+syn match asteriskExp "\$\[.\{-}\]" contains=asteriskVar,asteriskVarLen,asteriskExp
+syn match asteriskCodecsPermit "^\s*\(allow\|disallow\)\s*=\s*.*$" contains=asteriskCodecs
+syn match asteriskCodecs "\(vp9\|vp8\|h264\|h263p\|h263\|h261\|jpeg\|opus\|g722\|g723\|gsm\|ulaw\|alaw\|g719\|g726\|g726aal2\|siren7\|siren14\|adpcm\|slin\|lpc10\|g729\|speex\|ilbc\|wav\|all\s*$\)"
+syn match asteriskError "^\(type\|auth\|permit\|deny\|bindaddr\|host\)\s*=.*$"
+syn match asteriskType "^\zstype=\ze\<\(peer\|user\|friend\)\>$" contains=asteriskTypeType
+syn match asteriskTypeType "\<\(peer\|user\|friend\)\>" contained
+syn match asteriskAuth "^\zsauth\s*=\ze\s*\<\(md5\|rsa\|plaintext\)\>$" contains=asteriskAuthType
+syn match asteriskAuthType "\<\(md5\|rsa\|plaintext\)\>"
+syn match asteriskAuth "^\zs\(secret\|inkeys\|outkey\)\s*=\ze.*$"
+syn match asteriskAuth "^\(permit\|deny\)\s*=\s*\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\s*$" contains=asteriskIPRange
+syn match asteriskIPRange "\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}" contained
+syn match asteriskIP "\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}" contained
+syn match asteriskHostname "[[:alnum:]][[:alnum:]\-\.]*\.[[:alpha:]]{2,10}" contained
+syn match asteriskPort "\d\{1,5}" contained
+syn match asteriskSetting "^bindaddr\s*=\s*\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}$" contains=asteriskIP
+syn match asteriskSetting "^port\s*=\s*\d\{1,5}\s*$" contains=asteriskPort
+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.
+" 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
+
+let b:current_syntax = "asterisk"
+" vim: ts=8 sw=2
+
diff --git a/runtime/syntax/asteriskvm.vim b/runtime/syntax/asteriskvm.vim
new file mode 100644
index 0000000..fa55af5
--- /dev/null
+++ b/runtime/syntax/asteriskvm.vim
@@ -0,0 +1,51 @@
+" Vim syntax file
+" Language: Asterisk voicemail config file
+" Maintainer: Tilghman Lesher (Corydon76)
+" Last Change: 2006 Mar 21
+" version 0.2
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn sync clear
+syn sync fromstart
+
+
+syn keyword asteriskvmTodo TODO contained
+syn match asteriskvmComment ";.*" contains=asteriskvmTodo
+syn match asteriskvmContext "\[.\{-}\]"
+
+" ZoneMessages
+syn match asteriskvmZone "^[[:alnum:]]\+\s*=>\?\s*[[:alnum:]/_]\+|.*$" contains=zoneName,zoneDef
+syn match zoneName "=\zs[[:alnum:]/_]\+\ze" contained
+syn match zoneDef "|\zs.*\ze$" contained
+
+syn match asteriskvmSetting "\<\(format\|serveremail\|minmessage\|maxmessage\|maxgreet\|skipms\|maxsilence\|silencethreshold\|maxlogins\)="
+syn match asteriskvmSetting "\<\(externnotify\|externpass\|directoryintro\|charset\|adsi\(fdn\|sec\|ver\)\|\(pager\)\?fromstring\|email\(subject\|body\|cmd\)\|tz\|cidinternalcontexts\|saydurationm\|dialout\|callback\)="
+syn match asteriskvmSettingBool "\<\(attach\|pbxskip\|usedirectory\|saycid\|sayduration\|sendvoicemail\|review\|operator\|envelope\|delete\|nextaftercmd\|forcename\|forcegreeting\)=\(yes\|no\|1\|0\|true\|false\|t\|f\)"
+
+" Individual mailbox definitions
+syn match asteriskvmMailbox "^[[:digit:]]\+\s*=>\?\s*[[:digit:]]\+\(,[^,]*\(,[^,]*\(,[^,]*\(,[^,]*\)\?\)\?\)\?\)\?" contains=mailboxEmail,asteriskvmSetting,asteriskvmSettingBool,comma
+syn match mailboxEmail ",\zs[^@=,]*@[[:alnum:]\-\.]\+\.[[:alpha:]]\{2,10}\ze" contains=comma
+syn match comma "[,|]" contained
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
+
diff --git a/runtime/syntax/atlas.vim b/runtime/syntax/atlas.vim
new file mode 100644
index 0000000..1cdceab
--- /dev/null
+++ b/runtime/syntax/atlas.vim
@@ -0,0 +1,85 @@
+" Vim syntax file
+" Language: ATLAS
+" Maintainer: Inaki Saez <jisaez@sfe.indra.es>
+" Last Change: 2001 May 09
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn keyword atlasStatement begin terminate
+syn keyword atlasStatement fill calculate compare
+syn keyword atlasStatement setup connect close open disconnect reset
+syn keyword atlasStatement initiate read fetch
+syn keyword atlasStatement apply measure verify remove
+syn keyword atlasStatement perform leave finish output delay
+syn keyword atlasStatement prepare execute
+syn keyword atlasStatement do
+syn match atlasStatement "\<go[ ]\+to\>"
+syn match atlasStatement "\<wait[ ]\+for\>"
+
+syn keyword atlasInclude include
+syn keyword atlasDefine define require declare identify
+
+"syn keyword atlasReserved true false go nogo hi lo via
+syn keyword atlasReserved true false
+
+syn keyword atlasStorageClass external global
+
+syn keyword atlasConditional if then else end
+syn keyword atlasRepeat while for thru
+
+" Flags BEF and statement number
+syn match atlasSpecial "^[BE ][ 0-9]\{,6}\>"
+
+" Number formats
+syn match atlasHexNumber "\<X'[0-9A-F]\+'"
+syn match atlasOctalNumber "\<O'[0-7]\+'"
+syn match atlasBinNumber "\<B'[01]\+'"
+syn match atlasNumber "\<\d\+\>"
+"Floating point number part only
+syn match atlasDecimalNumber "\.\d\+\([eE][-+]\=\d\)\=\>"
+
+syn region atlasFormatString start=+((+ end=+\())\)\|\()[ ]*\$\)+me=e-1
+syn region atlasString start=+\<C'+ end=+'+ oneline
+
+syn region atlasComment start=+^C+ end=+\$+
+syn region atlasComment2 start=+\$.\++ms=s+1 end=+$+ oneline
+
+syn match atlasIdentifier "'[A-Za-z0-9 ._-]\+'"
+
+"Synchronization with Statement terminator $
+syn sync match atlasTerminator grouphere atlasComment "^C"
+syn sync match atlasTerminator groupthere NONE "\$"
+syn sync maxlines=100
+
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/autodoc.vim b/runtime/syntax/autodoc.vim
new file mode 100644
index 0000000..67a627e
--- /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
new file mode 100644
index 0000000..a888394
--- /dev/null
+++ b/runtime/syntax/autohotkey.vim
@@ -0,0 +1,325 @@
+" Vim syntax file
+" Language: AutoHotkey script file
+" Maintainer: Michael Wong
+" https://github.com/mmikeww/autohotkey.vim
+" Latest Revision: 2022-07-25
+" Previous Maintainers: SungHyun Nam <goweol@gmail.com>
+" Nikolai Weibull <now@bitwi.se>
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case ignore
+
+syn keyword autohotkeyTodo
+ \ contained
+ \ TODO FIXME XXX NOTE
+
+" only these chars are valid as escape sequences: ,%`;nrbtvaf
+" https://autohotkey.com/docs/commands/_EscapeChar.htm
+syn match autohotkeyEscape
+ \ display
+ \ '`[,%`;nrbtvaf]'
+
+syn region autohotkeyString
+ \ display
+ \ oneline
+ \ matchgroup=autohotkeyStringDelimiter
+ \ start=+"+
+ \ end=+"+
+ \ contains=autohotkeyEscape,autohotkeyMatchClass
+
+syn match autohotkeyVariable
+ \ display
+ \ oneline
+ \ contains=autohotkeyBuiltinVariable
+ \ keepend
+ \ '%\S\{-}%'
+
+syn keyword autohotkeyBuiltinVariable
+ \ A_Space A_Tab
+ \ 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_IsPaused A_IsCritical A_BatchLines A_TitleMatchMode A_TitleMatchModeSpeed
+ \ A_DetectHiddenWindows A_DetectHiddenText A_AutoTrim A_StringCaseSense
+ \ A_FileEncoding A_FormatInteger A_FormatFloat A_WinDelay A_ControlDelay
+ \ A_SendMode A_SendLevel A_StoreCapsLockMode A_KeyDelay A_KeyDuration
+ \ A_KeyDelayPlay A_KeyDurationPlay 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_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_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_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
+ \ A_TimeIdleKeyboard A_TimeIdleMouse A_ListLines A_ComSpec A_LoopFilePath A_Args
+
+syn match autohotkeyBuiltinVariable
+ \ contained
+ \ display
+ \ '%\d\+%'
+
+syn keyword autohotkeyCommand
+ \ ClipWait EnvGet EnvSet EnvUpdate
+ \ Drive DriveGet DriveSpaceFree FileAppend FileCopy FileCopyDir
+ \ FileCreateDir FileCreateShortcut FileDelete FileGetAttrib FileEncoding
+ \ FileGetShortcut FileGetSize FileGetTime FileGetVersion FileInstall
+ \ FileMove FileMoveDir FileReadLine FileRead FileRecycle FileRecycleEmpty
+ \ FileRemoveDir FileSelectFolder FileSelectFile FileSetAttrib FileSetTime
+ \ IniDelete IniRead IniWrite SetWorkingDir
+ \ SplitPath
+ \ Gui GuiControl GuiControlGet IfMsgBox InputBox MsgBox Progress
+ \ SplashImage SplashTextOn SplashTextOff ToolTip TrayTip
+ \ Hotkey ListHotkeys BlockInput ControlSend ControlSendRaw GetKeyState
+ \ KeyHistory KeyWait Input Send SendRaw SendInput SendPlay SendEvent
+ \ SendMode SetKeyDelay SetNumScrollCapsLockState SetStoreCapslockMode
+ \ EnvAdd EnvDiv EnvMult EnvSub Random SetFormat Transform
+ \ AutoTrim BlockInput CoordMode Critical Edit ImageSearch
+ \ ListLines ListVars Menu OutputDebug PixelGetColor PixelSearch
+ \ SetBatchLines SetEnv SetTimer SysGet Thread Transform URLDownloadToFile
+ \ Click ControlClick MouseClick MouseClickDrag MouseGetPos MouseMove
+ \ SetDefaultMouseSpeed SetMouseDelay
+ \ Process Run RunWait RunAs Shutdown Sleep
+ \ RegDelete RegRead RegWrite
+ \ SoundBeep SoundGet SoundGetWaveVolume SoundPlay SoundSet
+ \ SoundSetWaveVolume
+ \ FormatTime IfInString IfNotInString Sort StringCaseSense StringGetPos
+ \ StringLeft StringRight StringLower StringUpper StringMid StringReplace
+ \ StringSplit StringTrimLeft StringTrimRight StringLen
+ \ StrSplit StrReplace Throw
+ \ Control ControlClick ControlFocus ControlGet ControlGetFocus
+ \ ControlGetPos ControlGetText ControlMove ControlSend ControlSendRaw
+ \ ControlSetText Menu PostMessage SendMessage SetControlDelay
+ \ WinMenuSelectItem GroupActivate GroupAdd GroupClose GroupDeactivate
+ \ DetectHiddenText DetectHiddenWindows SetTitleMatchMode SetWinDelay
+ \ StatusBarGetText StatusBarWait WinActivate WinActivateBottom WinClose
+ \ WinGet WinGetActiveStats WinGetActiveTitle WinGetClass WinGetPos
+ \ WinGetText WinGetTitle WinHide WinKill WinMaximize WinMinimize
+ \ WinMinimizeAll WinMinimizeAllUndo WinMove WinRestore WinSet
+ \ WinSetTitle WinShow WinWait WinWaitActive WinWaitNotActive WinWaitClose
+ \ SetCapsLockState SetNumLockState SetScrollLockState
+ \ Hotstring LoadPicture MenuGetHandle MenuGetName OnError OnClipboardChange
+
+syn keyword autohotkeyFunction
+ \ 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 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 Ord InputHook
+
+syn keyword autohotkeyStatement
+ \ Break Continue Exit ExitApp Gosub Goto OnExit Pause Return
+ \ Suspend Reload new class extends
+
+syn keyword autohotkeyRepeat
+ \ Loop
+
+syn keyword autohotkeyConditional
+ \ IfExist IfNotExist If IfEqual IfLess IfGreater Else
+ \ IfWinExist IfWinNotExist IfWinActive IfWinNotActive
+ \ IfNotEqual IfLessOrEqual IfGreaterOrEqual
+ \ while until for in try catch finally not
+ \ switch case default
+
+syn match autohotkeyPreProcStart
+ \ nextgroup=
+ \ autohotkeyInclude,
+ \ autohotkeyPreProc
+ \ skipwhite
+ \ display
+ \ '^\s*\zs#'
+
+syn keyword autohotkeyInclude
+ \ contained
+ \ Include
+ \ IncludeAgain
+
+syn keyword autohotkeyPreProc
+ \ contained
+ \ HotkeyInterval HotKeyModifierTimeout
+ \ Hotstring
+ \ IfWinActive IfWinNotActive IfWinExist IfWinNotExist
+ \ If IfTimeout
+ \ MaxHotkeysPerInterval MaxThreads MaxThreadsBuffer MaxThreadsPerHotkey
+ \ UseHook InstallKeybdHook InstallMouseHook
+ \ KeyHistory
+ \ NoTrayIcon SingleInstance
+ \ WinActivateForce
+ \ AllowSameLineComments
+ \ ClipboardTimeout
+ \ CommentFlag
+ \ ErrorStdOut
+ \ EscapeChar
+ \ MaxMem
+ \ NoEnv
+ \ Persistent
+ \ LTrim
+ \ InputLevel
+ \ MenuMaskKey
+ \ Warn
+
+syn keyword autohotkeyMatchClass
+ \ ahk_group ahk_class ahk_id ahk_pid ahk_exe
+
+syn match autohotkeyNumbers
+ \ display
+ \ transparent
+ \ contains=
+ \ autohotkeyInteger,
+ \ autohotkeyFloat
+ \ '\<\d\|\.\d'
+
+syn match autohotkeyInteger
+ \ contained
+ \ display
+ \ '\d\+\>'
+
+syn match autohotkeyInteger
+ \ contained
+ \ display
+ \ '0x\x\+\>'
+
+syn match autohotkeyFloat
+ \ contained
+ \ display
+ \ '\d\+\.\d*\|\.\d\+\>'
+
+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")
+ let b:autohotkey_syntax_sync_minlines = g:autohotkey_syntax_sync_minlines
+else
+ let b:autohotkey_syntax_sync_minlines = 50
+endif
+exec "syn sync ccomment autohotkeyComment minlines=" . b:autohotkey_syntax_sync_minlines
+
+hi def link autohotkeyTodo Todo
+hi def link autohotkeyComment Comment
+hi def link autohotkeyCommentStart autohotkeyComment
+hi def link autohotkeyEscape Special
+hi def link autohotkeyHotkey Type
+hi def link autohotkeyKey Type
+hi def link autohotkeyDelimiter Delimiter
+hi def link autohotkeyHotstringDefinition Type
+hi def link autohotkeyHotstring Type
+hi def link autohotkeyHotstringDelimiter autohotkeyDelimiter
+hi def link autohotkeyHotstringOptions Special
+hi def link autohotkeyString String
+hi def link autohotkeyStringDelimiter autohotkeyString
+hi def link autohotkeyVariable Identifier
+hi def link autohotkeyVariableDelimiter autohotkeyVariable
+hi def link autohotkeyBuiltinVariable Macro
+hi def link autohotkeyCommand Keyword
+hi def link autohotkeyFunction Function
+hi def link autohotkeyStatement autohotkeyCommand
+hi def link autohotkeyRepeat Repeat
+hi def link autohotkeyConditional Conditional
+hi def link autohotkeyPreProcStart PreProc
+hi def link autohotkeyInclude Include
+hi def link autohotkeyPreProc PreProc
+hi def link autohotkeyMatchClass Typedef
+hi def link autohotkeyNumber Number
+hi def link autohotkeyInteger autohotkeyNumber
+hi def link autohotkeyFloat autohotkeyNumber
+hi def link autohotkeyType Type
+hi def link autohotkeyBoolean Boolean
+
+let b:current_syntax = "autohotkey"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/autoit.vim b/runtime/syntax/autoit.vim
new file mode 100644
index 0000000..6b6048a
--- /dev/null
+++ b/runtime/syntax/autoit.vim
@@ -0,0 +1,1125 @@
+" Vim syntax file
+"
+" Language: AutoIt v3 (http://www.autoitscript.com/autoit3/)
+" Maintainer: Jared Breland <jbreland@legroom.net>
+" Authored By: Riccardo Casini <ric@libero.it>
+" Script URL: http://www.vim.org/scripts/script.php?script_id=1239
+" ChangeLog: Please visit the script URL for detailed change information
+" Included change from #970.
+
+" Quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+let b:current_syntax = "autoit"
+
+" AutoIt is not case dependent
+syn case ignore
+
+" Definitions for AutoIt reserved keywords
+syn keyword autoitKeyword Default False True
+syn keyword autoitKeyword Const Dim Global Local ReDim
+syn keyword autoitKeyword If Else ElseIf Then EndIf
+syn keyword autoitKeyword Select Switch Case EndSelect EndSwitch
+syn keyword autoitKeyword Enum For In To Step Next
+syn keyword autoitKeyword With While EndWith Wend Do Until
+syn keyword autoitKeyword ContinueCase ContinueLoop ExitLoop Exit
+
+" inside script inclusion and global options
+syn match autoitIncluded display contained "<[^>]*>"
+syn match autoitInclude display "^\s*#\s*include\>\s*["<]"
+ \ contains=autoitIncluded,autoitString
+syn match autoitInclude "^\s*#include-once\>"
+syn match autoitInclude "^\s*#NoTrayIcon\>"
+syn match autoitInclude "^\s*#RequireAdmin\>"
+
+" user-defined functions
+syn keyword autoitKeyword Func ByRef EndFunc Return OnAutoItStart OnAutoItExit
+
+" built-in functions
+" environment management
+syn keyword autoitFunction ClipGet ClipPut EnvGet EnvSet EnvUpdate MemGetStats
+" file, directory, and disk management
+syn keyword autoitFunction ConsoleRead ConsoleWrite ConsoleWriteError
+syn keyword autoitFunction DirCopy DirCreate DirGetSize DirMove DirRemove
+syn keyword autoitFunction DriveGetDrive DriveGetFileSystem DriveGetLabel
+ \ DriveGetSerial DriveGetType DriveMapAdd DriveMapDel DriveMapGet
+ \ DriveSetLabel DriveSpaceFree DriveSpaceTotal DriveStatus
+syn keyword autoitFunction FileChangeDir FileClose FileCopy FileCreateNTFSLink
+ \ FileCreateShortcut FileDelete FileExists FileFindFirstFile
+ \ FileFindNextFile FileGetAttrib FileGetLongName FileGetShortcut
+ \ FileGetShortName FileGetSize FileGetTime FileGetVersion FileInstall
+ \ FileMove FileOpen FileOpenDialog FileRead FileReadLine FileRecycle
+ \ FileRecycleEmpty FileSaveDialog FileSelectFolder FileSetAttrib
+ \ FileSetTime FileWrite FileWriteLine
+syn keyword autoitFunction IniDelete IniRead IniReadSection IniReadSectionNames
+ \ IniRenameSection IniWrite IniWriteSection
+syn keyword autoitFunction StderrRead StdinWrite StdoutRead
+" graphic and sound
+syn keyword autoitFunction Beep PixelChecksum PixelGetColor PixelSearch
+ \ SoundPlay SoundSetWaveVolume
+" gui reference
+syn keyword autoitFunction GUICreate GUIDelete GUICtrlGetHandle GUICtrlGetState
+ \ GUICtrlRead GUICtrlRecvMsg GUICtrlSendMsg GUICtrlSendToDummy
+ \ GUIGetCursorInfo GUIGetMsg GUIRegisterMsg GUIStartGroup GUISwitch
+syn keyword autoitFunction GUICtrlCreateAvi GUICtrlCreateButton
+ \ GUICtrlCreateCheckbox GUICtrlCreateCombo GUICtrlCreateContextMenu
+ \ GUICtrlCreateDate GUICtrlCreateDummy GUICtrlCreateEdit
+ \ GUICtrlCreateGraphic GUICtrlCreateGroup GUICtrlCreateIcon
+ \ GUICtrlCreateInput GUICtrlCreateLabel GUICtrlCreateList
+ \ GUICtrlCreateListView GUICtrlCreateListViewItem GUICtrlCreateMenu
+ \ GUICtrlCreateMenuItem GUICtrlCreateMonthCal GUICtrlCreateObj
+ \ GUICtrlCreatePic GUICtrlCreateProgress GUICtrlCreateRadio
+ \ GUICtrlCreateSlider GUICtrlCreateTab GUICtrlCreateTabItem
+ \ GUICtrlCreateTreeView GUICtrlCreateTreeViewItem
+ \ GUICtrlCreateUpDown GUICtrlDelete
+syn keyword autoitFunction GUICtrlRegisterListViewSort GUICtrlSetBkColor
+ \ GUICtrlSetColor GUICtrlSetCursor GUICtrlSetData GUICtrlSetFont
+ \ GUICtrlSetGraphic GUICtrlSetImage GUICtrlSetLimit GUICtrlSetOnEvent
+ \ GUICtrlSetPos GUICtrlSetResizing GUICtrlSetState GUICtrlSetStyle
+ \ GUICtrlSetTip
+syn keyword autoitFunction GUISetBkColor GUISetCoord GUISetCursor GUISetFont
+ \ GUISetHelp GUISetIcon GUISetOnEvent GUISetState
+" keyboard control
+syn keyword autoitFunction HotKeySet Send
+" math
+syn keyword autoitFunction Abs ACos ASin ATan BitAND BitNOT BitOR BitRotate
+ \ BitShift BitXOR Cos Ceiling Exp Floor Log Mod Random Round Sin Sqrt
+ \ SRandom Tan
+" message boxes and dialogs
+syn keyword autoitFunction InputBox MsgBox ProgressOff ProgressOn ProgressSet
+ \ SplashImageOn SplashOff SplashTextOn ToolTip
+" miscellaneous
+syn keyword autoitFunction AdlibDisable AdlibEnable AutoItSetOption
+ \ AutoItWinGetTitle AutoItWinSetTitle BlockInput Break Call CDTray
+ \ Execute Opt SetError SetExtended
+" mouse control
+syn keyword autoitFunction MouseClick MouseClickDrag MouseDown MouseGetCursor
+ \ MouseGetPos MouseMove MouseUp MouseWheel
+" network
+syn keyword autoitFunction FtpSetProxy HttpSetProxy InetGet InetGetSize Ping
+ \ TCPAccept TCPCloseSocket TCPConnect TCPListen TCPNameToIp TCPRecv
+ \ TCPSend TCPShutDown TCPStartup UDPBind UDPCloseSocket UDPOpen UDPRecv
+ \ UDPSend UDPShutdown UDPStartup
+" obj/com reference
+syn keyword autoitFunction ObjCreate ObjEvent ObjGet ObjName
+" process management
+syn keyword autoitFunction DllCall DllClose DllOpen DllStructCreate
+ \ DllStructGetData DllStructGetPtr DllStructGetSize DllStructSetData
+ \ ProcessClose ProcessExists ProcessSetPriority ProcessList ProcessWait
+ \ ProcessWaitClose Run RunAsSet RunWait ShellExecute ShellExecuteWait
+ \ Shutdown
+ " removed from 3.2.0 docs - PluginClose PluginOpen
+" registry management
+syn keyword autoitFunction RegDelete RegEnumKey RegEnumVal RegRead RegWrite
+" string management
+syn keyword autoitFunction StringAddCR StringFormat StringInStr StringIsAlNum
+ \ StringIsAlpha StringIsASCII StringIsDigit StringIsFloat StringIsInt
+ \ StringIsLower StringIsSpace StringIsUpper StringIsXDigit StringLeft
+ \ StringLen StringLower StringMid StringRegExp StringRegExpReplace
+ \ StringReplace StringRight StringSplit StringStripCR StringStripWS
+ \ StringTrimLeft StringTrimRight StringUpper
+" timer and delay
+syn keyword autoitFunction Sleep TimerInit TimerDiff
+" tray
+syn keyword autoitFunction TrayCreateItem TrayCreateMenu TrayItemDelete
+ \ TrayItemGetHandle TrayItemGetState TrayItemGetText TrayItemSetOnEvent
+ \ TrayItemSetState TrayItemSetText TrayGetMsg TraySetClick TraySetIcon
+ \ TraySetOnEvent TraySetPauseIcon TraySetState TraySetToolTip TrayTip
+" variables and conversions
+syn keyword autoitFunction Asc Assign Binary Chr Dec Eval Hex HWnd Int IsAdmin
+ \ IsArray IsBinaryString IsBool IsDeclared IsDllStruct IsFloat IsHWnd
+ \ IsInt IsKeyword IsNumber IsObj IsString Number String UBound
+" window management
+syn keyword autoitFunction WinActivate WinActive WinClose WinExists WinFlash
+ \ WinGetCaretPos WinGetClassList WinGetClientSize WinGetHandle WinGetPos
+ \ WinGetProcess WinGetState WinGetText WinGetTitle WinKill WinList
+ \ WinMenuSelectItem WinMinimizeAll WinMinimizeAllUndo WinMove
+ \ WinSetOnTop WinSetState WinSetTitle WinSetTrans WinWait WinWaitActive
+ \ WinWaitClose WinWaitNotActive
+syn keyword autoitFunction ControlClick ControlCommand ControlDisable
+ \ ControlEnable ControlFocus ControlGetFocus ControlGetHandle
+ \ ControlGetPos ControlGetText ControlHide ControlListView ControlMove
+ \ ControlSend ControlSetText ControlShow StatusBarGetText
+
+" user defined functions
+" array
+syn keyword autoitFunction _ArrayAdd _ArrayBinarySearch _ArrayCreate
+ \ _ArrayDelete _ArrayDisplay _ArrayInsert _ArrayMax _ArrayMaxIndex
+ \ _ArrayMin _ArrayMinIndex _ArrayPop _ArrayPush _ArrayReverse
+ \ _ArraySearch _ArraySort _ArraySwap _ArrayToClip _ArrayToString
+ \ _ArrayTrim
+" color
+syn keyword autoitFunction _ColorgetBlue _ColorGetGreen _ColorGetRed
+" date
+syn keyword autoitFunction _DateAdd _DateDayOfWeek _DateDaysInMonth _DateDiff
+ \ _DateIsLeapYear _DateIsValid _DateTimeFormat _DateTimeSplit
+ \ _DateToDayOfWeek _ToDayOfWeekISO _DateToDayValue _DayValueToDate _Now
+ \ _NowCalc _NowCalcDate _NowDate _NowTime _SetDate _SetTime _TicksToTime
+ \ _TimeToTicks _WeekNumberISO
+" file
+syn keyword autoitFunction _FileCountLines _FileCreate _FileListToArray
+ \ _FilePrint _FileReadToArray _FileWriteFromArray _FileWriteLog
+ \ _FileWriteToLine _PathFull _PathMake _PathSplit _ReplaceStringInFile
+ \ _TempFile
+" guicombo
+syn keyword autoitFunction _GUICtrlComboAddDir _GUICtrlComboAddString
+ \ _GUICtrlComboAutoComplete _GUICtrlComboDeleteString
+ \ _GUICtrlComboFindString _GUICtrlComboGetCount _GUICtrlComboGetCurSel
+ \ _GUICtrlComboGetDroppedControlRect _GUICtrlComboGetDroppedState
+ \ _GUICtrlComboGetDroppedWidth _GUICtrlComboGetEditSel
+ \ _GUICtrlComboGetExtendedUI _GUICtrlComboGetHorizontalExtent
+ \ _GUICtrlComboGetItemHeight _GUICtrlComboGetLBText
+ \ _GUICtrlComboGetLBTextLen _GUICtrlComboGetList _GUICtrlComboGetLocale
+ \ _GUICtrlComboGetMinVisible _GUICtrlComboGetTopIndex
+ \ _GUICtrlComboInitStorage _GUICtrlComboInsertString
+ \ _GUICtrlComboLimitText _GUICtrlComboResetContent
+ \ _GUICtrlComboSelectString _GUICtrlComboSetCurSel
+ \ _GUICtrlComboSetDroppedWidth _GUICtrlComboSetEditSel
+ \ _GUICtrlComboSetExtendedUI _GUICtrlComboSetHorizontalExtent
+ \ _GUICtrlComboSetItemHeight _GUICtrlComboSetMinVisible
+ \ _GUICtrlComboSetTopIndex _GUICtrlComboShowDropDown
+" guiedit
+syn keyword autoitFunction _GUICtrlEditCanUndo _GUICtrlEditEmptyUndoBuffer
+ \ _GuiCtrlEditFind _GUICtrlEditGetFirstVisibleLine _GUICtrlEditGetLine
+ \ _GUICtrlEditGetLineCount _GUICtrlEditGetModify _GUICtrlEditGetRect
+ \ _GUICtrlEditGetSel _GUICtrlEditLineFromChar _GUICtrlEditLineIndex
+ \ _GUICtrlEditLineLength _GUICtrlEditLineScroll _GUICtrlEditReplaceSel
+ \ _GUICtrlEditScroll _GUICtrlEditSetModify _GUICtrlEditSetRect
+ \ _GUICtrlEditSetSel _GUICtrlEditUndo
+" guiipaddress
+syn keyword autoitFunction _GUICtrlIpAddressClear _GUICtrlIpAddressCreate
+ \ _GUICtrlIpAddressDelete _GUICtrlIpAddressGet _GUICtrlIpAddressIsBlank
+ \ _GUICtrlIpAddressSet _GUICtrlIpAddressSetFocus
+ \ _GUICtrlIpAddressSetFont
+ \ _GUICtrlIpAddressSetRange _GUICtrlIpAddressShowHide
+" guilist
+syn keyword autoitFunction _GUICtrlListAddDir _GUICtrlListAddItem
+ \ _GUICtrlListClear
+ \ _GUICtrlListCount _GUICtrlListDeleteItem _GUICtrlListFindString
+ \ _GUICtrlListGetAnchorIndex _GUICtrlListGetCaretIndex
+ \ _GUICtrlListGetHorizontalExtent _GUICtrlListGetInfo
+ \ _GUICtrlListGetItemRect _GUICtrlListGetLocale _GUICtrlListGetSelCount
+ \ _GUICtrlListGetSelItems _GUICtrlListGetSelItemsText
+ \ _GUICtrlListGetSelState _GUICtrlListGetText _GUICtrlListGetTextLen
+ \ _GUICtrlListGetTopIndex _GUICtrlListInsertItem
+ \ _GUICtrlListReplaceString _GUICtrlListSelectedIndex
+ \ _GUICtrlListSelectIndex _GUICtrlListSelectString
+ \ _GUICtrlListSelItemRange _GUICtrlListSelItemRangeEx
+ \ _GUICtrlListSetAnchorIndex _GUICtrlListSetCaretIndex
+ \ _GUICtrlListSetHorizontalExtent _GUICtrlListSetLocale
+ \ _GUICtrlListSetSel _GUICtrlListSetTopIndex _GUICtrlListSort
+ \ _GUICtrlListSwapString
+" guilistview
+syn keyword autoitFunction _GUICtrlListViewCopyItems
+ \ _GUICtrlListViewDeleteAllItems _GUICtrlListViewDeleteColumn
+ \ _GUICtrlListViewDeleteItem _GUICtrlListViewDeleteItemsSelected
+ \ _GUICtrlListViewEnsureVisible _GUICtrlListViewFindItem
+ \ _GUICtrlListViewGetBackColor _GUICtrlListViewGetCallBackMask
+ \ _GUICtrlListViewGetCheckedState _GUICtrlListViewGetColumnOrder
+ \ _GUICtrlListViewGetColumnWidth _GUICtrlListViewGetCounterPage
+ \ _GUICtrlListViewGetCurSel _GUICtrlListViewGetExtendedListViewStyle
+ \ _GUICtrlListViewGetHeader _GUICtrlListViewGetHotCursor
+ \ _GUICtrlListViewGetHotItem _GUICtrlListViewGetHoverTime
+ \ _GUICtrlListViewGetItemCount _GUICtrlListViewGetItemText
+ \ _GUICtrlListViewGetItemTextArray _GUICtrlListViewGetNextItem
+ \ _GUICtrlListViewGetSelectedCount _GUICtrlListViewGetSelectedIndices
+ \ _GUICtrlListViewGetSubItemsCount _GUICtrlListViewGetTopIndex
+ \ _GUICtrlListViewGetUnicodeFormat _GUICtrlListViewHideColumn
+ \ _GUICtrlListViewInsertColumn _GUICtrlListViewInsertItem
+ \ _GUICtrlListViewJustifyColumn _GUICtrlListViewScroll
+ \ _GUICtrlListViewSetCheckState _GUICtrlListViewSetColumnHeaderText
+ \ _GUICtrlListViewSetColumnOrder _GUICtrlListViewSetColumnWidth
+ \ _GUICtrlListViewSetHotItem _GUICtrlListViewSetHoverTime
+ \ _GUICtrlListViewSetItemCount _GUICtrlListViewSetItemSelState
+ \ _GUICtrlListViewSetItemText _GUICtrlListViewSort
+" guimonthcal
+syn keyword autoitFunction _GUICtrlMonthCalGet1stDOW _GUICtrlMonthCalGetColor
+ \ _GUICtrlMonthCalGetDelta _GUICtrlMonthCalGetMaxSelCount
+ \ _GUICtrlMonthCalGetMaxTodayWidth _GUICtrlMonthCalGetMinReqRect
+ \ _GUICtrlMonthCalSet1stDOW _GUICtrlMonthCalSetColor
+ \ _GUICtrlMonthCalSetDelta _GUICtrlMonthCalSetMaxSelCount
+" guislider
+syn keyword autoitFunction _GUICtrlSliderClearTics _GUICtrlSliderGetLineSize
+ \ _GUICtrlSliderGetNumTics _GUICtrlSliderGetPageSize
+ \ _GUICtrlSliderGetPos _GUICtrlSliderGetRangeMax
+ \ _GUICtrlSliderGetRangeMin _GUICtrlSliderSetLineSize
+ \ _GUICtrlSliderSetPageSize _GUICtrlSliderSetPos
+ \ _GUICtrlSliderSetTicFreq
+" guistatusbar
+syn keyword autoitFunction _GuiCtrlStatusBarCreate
+ \ _GUICtrlStatusBarCreateProgress _GUICtrlStatusBarDelete
+ \ _GuiCtrlStatusBarGetBorders _GuiCtrlStatusBarGetIcon
+ \ _GuiCtrlStatusBarGetParts _GuiCtrlStatusBarGetRect
+ \ _GuiCtrlStatusBarGetText _GuiCtrlStatusBarGetTextLength
+ \ _GuiCtrlStatusBarGetTip _GuiCtrlStatusBarGetUnicode
+ \ _GUICtrlStatusBarIsSimple _GuiCtrlStatusBarResize
+ \ _GuiCtrlStatusBarSetBKColor _GuiCtrlStatusBarSetIcon
+ \ _GuiCtrlStatusBarSetMinHeight _GUICtrlStatusBarSetParts
+ \ _GuiCtrlStatusBarSetSimple _GuiCtrlStatusBarSetText
+ \ _GuiCtrlStatusBarSetTip _GuiCtrlStatusBarSetUnicode
+ \ _GUICtrlStatusBarShowHide
+" guitab
+syn keyword autoitFunction _GUICtrlTabDeleteAllItems _GUICtrlTabDeleteItem
+ \ _GUICtrlTabDeselectAll _GUICtrlTabGetCurFocus _GUICtrlTabGetCurSel
+ \ _GUICtrlTabGetExtendedStyle _GUICtrlTabGetItemCount
+ \ _GUICtrlTabGetItemRect _GUICtrlTabGetRowCount
+ \ _GUICtrlTabGetUnicodeFormat _GUICtrlTabHighlightItem
+ \ _GUICtrlTabSetCurFocus _GUICtrlTabSetCurSel
+ \ _GUICtrlTabSetMinTabWidth _GUICtrlTabSetUnicodeFormat
+" guitreeview
+syn keyword autoitFunction _GUICtrlTreeViewDeleteAllItems
+ \ _GUICtrlTreeViewDeleteItem _GUICtrlTreeViewExpand
+ \ _GUICtrlTreeViewGetBkColor _GUICtrlTreeViewGetCount
+ \ _GUICtrlTreeViewGetIndent _GUICtrlTreeViewGetLineColor
+ \ _GUICtrlTreeViewGetParentHandle _GUICtrlTreeViewGetParentID
+ \ _GUICtrlTreeViewGetState _GUICtrlTreeViewGetText
+ \ _GUICtrlTreeViewGetTextColor _GUICtrlTreeViewItemGetTree
+ \ _GUICtrlTreeViewInsertItem _GUICtrlTreeViewSetBkColor
+ \ _GUICtrlTreeViewSetIcon _GUICtrlTreeViewSetIndent
+ \ _GUICtrlTreeViewSetLineColor GUICtrlTreeViewSetState
+ \ _GUICtrlTreeViewSetText _GUICtrlTreeViewSetTextColor
+ \ _GUICtrlTreeViewSort
+" ie
+syn keyword autoitFunction _IE_Example _IE_Introduction _IE_VersionInfo
+ \ _IEAction _IEAttach _IEBodyReadHTML _IEBodyReadText _IEBodyWriteHTML
+ \ _IECreate _IECreateEmbedded _IEDocGetObj _IEDocInsertHTML
+ \ _IEDocInsertText _IEDocReadHTML _IEDocWriteHTML
+ \ _IEErrorHandlerDeRegister _IEErrorHandlerRegister _IEErrorNotify
+ \ _IEFormElementCheckboxSelect _IEFormElementGetCollection
+ \ _IEFormElementGetObjByName _IEFormElementGetValue
+ \ _IEFormElementOptionSelect _IEFormElementRadioSelect
+ \ _IEFormElementSetValue _IEFormGetCollection _IEFormGetObjByName
+ \ _IEFormImageClick _IEFormReset _IEFormSubmit _IEFrameGetCollection
+ \ _IEFrameGetObjByName _IEGetObjByName _IEHeadInsertEventScript
+ \ _IEImgClick _IEImgGetCollection _IEIsFrameSet _IELinkClickByIndex
+ \ _IELinkClickByText _IELinkGetCollection _IELoadWait _IELoadWaitTimeout
+ \ _IENavigate _IEPropertyGet _IEPropertySet _IEQuit
+ \ _IETableGetCollection _IETableWriteToArray _IETagNameAllGetCollection
+ \ _IETagNameGetCollection
+" inet
+syn keyword autoitFunction _GetIP _INetExplorerCapable _INetGetSource _INetMail
+ \ _INetSmtpMail _TCPIpToName
+" math
+syn keyword autoitFunction _Degree _MathCheckDiv _Max _Min _Radian
+" miscellaneous
+syn keyword autoitFunction _ChooseColor _ChooseFont _ClipPutFile _Iif
+ \ _IsPressed _MouseTrap _SendMessage _Singleton
+" process
+syn keyword autoitFunction _ProcessGetName _ProcessGetPriority _RunDOS
+" sound
+syn keyword autoitFunction _SoundClose _SoundLength _SoundOpen _SoundPause
+ \ _SoundPlay _SoundPos _SoundResume _SoundSeek _SoundStatus _SoundStop
+" sqlite
+syn keyword autoitFunction _SQLite_Changes _SQLite_Close
+ \ _SQLite_Display2DResult _SQLite_Encode _SQLite_ErrCode _SQLite_ErrMsg
+ \ _SQLite_Escape _SQLite_Exec _SQLite_FetchData _SQLite_FetchNames
+ \ _SQLite_GetTable _SQLite_GetTable2D _SQLite_LastInsertRowID
+ \ _SQLite_LibVersion _SQLite_Open _SQLite_Query _SQLite_QueryFinalize
+ \ _SQLite_QueryReset _SQLite_QuerySingleRow _SQLite_SaveMode
+ \ _SQLite_SetTimeout _SQLite_Shutdown _SQLite_SQLiteExe _SQLite_Startup
+ \ _SQLite_TotalChanges
+" string
+syn keyword autoitFunction _HexToString _StringAddComma _StringBetween
+ \ _StringEncrypt _StringInsert _StringProper _StringRepeat
+ \ _StringReverse _StringToHex
+" visa
+syn keyword autoitFunction _viClose _viExecCommand _viFindGpib _viGpibBusReset
+ \ _viGTL _viOpen _viSetAttribute _viSetTimeout
+
+" read-only macros
+syn match autoitBuiltin "@AppData\(Common\)\=Dir"
+syn match autoitBuiltin "@AutoItExe"
+syn match autoitBuiltin "@AutoItPID"
+syn match autoitBuiltin "@AutoItVersion"
+syn match autoitBuiltin "@COM_EventObj"
+syn match autoitBuiltin "@CommonFilesDir"
+syn match autoitBuiltin "@Compiled"
+syn match autoitBuiltin "@ComputerName"
+syn match autoitBuiltin "@ComSpec"
+syn match autoitBuiltin "@CR\(LF\)\="
+syn match autoitBuiltin "@Desktop\(Common\)\=Dir"
+syn match autoitBuiltin "@DesktopDepth"
+syn match autoitBuiltin "@DesktopHeight"
+syn match autoitBuiltin "@DesktopRefresh"
+syn match autoitBuiltin "@DesktopWidth"
+syn match autoitBuiltin "@DocumentsCommonDir"
+syn match autoitBuiltin "@Error"
+syn match autoitBuiltin "@ExitCode"
+syn match autoitBuiltin "@ExitMethod"
+syn match autoitBuiltin "@Extended"
+syn match autoitBuiltin "@Favorites\(Common\)\=Dir"
+syn match autoitBuiltin "@GUI_CtrlId"
+syn match autoitBuiltin "@GUI_CtrlHandle"
+syn match autoitBuiltin "@GUI_DragId"
+syn match autoitBuiltin "@GUI_DragFile"
+syn match autoitBuiltin "@GUI_DropId"
+syn match autoitBuiltin "@GUI_WinHandle"
+syn match autoitBuiltin "@HomeDrive"
+syn match autoitBuiltin "@HomePath"
+syn match autoitBuiltin "@HomeShare"
+syn match autoitBuiltin "@HOUR"
+syn match autoitBuiltin "@HotKeyPressed"
+syn match autoitBuiltin "@InetGetActive"
+syn match autoitBuiltin "@InetGetBytesRead"
+syn match autoitBuiltin "@IPAddress[1234]"
+syn match autoitBuiltin "@KBLayout"
+syn match autoitBuiltin "@LF"
+syn match autoitBuiltin "@Logon\(DNS\)\=Domain"
+syn match autoitBuiltin "@LogonServer"
+syn match autoitBuiltin "@MDAY"
+syn match autoitBuiltin "@MIN"
+syn match autoitBuiltin "@MON"
+syn match autoitBuiltin "@MyDocumentsDir"
+syn match autoitBuiltin "@NumParams"
+syn match autoitBuiltin "@OSBuild"
+syn match autoitBuiltin "@OSLang"
+syn match autoitBuiltin "@OSServicePack"
+syn match autoitBuiltin "@OSTYPE"
+syn match autoitBuiltin "@OSVersion"
+syn match autoitBuiltin "@ProcessorArch"
+syn match autoitBuiltin "@ProgramFilesDir"
+syn match autoitBuiltin "@Programs\(Common\)\=Dir"
+syn match autoitBuiltin "@ScriptDir"
+syn match autoitBuiltin "@ScriptFullPath"
+syn match autoitBuiltin "@ScriptLineNumber"
+syn match autoitBuiltin "@ScriptName"
+syn match autoitBuiltin "@SEC"
+syn match autoitBuiltin "@StartMenu\(Common\)\=Dir"
+syn match autoitBuiltin "@Startup\(Common\)\=Dir"
+syn match autoitBuiltin "@SW_DISABLE"
+syn match autoitBuiltin "@SW_ENABLE"
+syn match autoitBuiltin "@SW_HIDE"
+syn match autoitBuiltin "@SW_LOCK"
+syn match autoitBuiltin "@SW_MAXIMIZE"
+syn match autoitBuiltin "@SW_MINIMIZE"
+syn match autoitBuiltin "@SW_RESTORE"
+syn match autoitBuiltin "@SW_SHOW"
+syn match autoitBuiltin "@SW_SHOWDEFAULT"
+syn match autoitBuiltin "@SW_SHOWMAXIMIZED"
+syn match autoitBuiltin "@SW_SHOWMINIMIZED"
+syn match autoitBuiltin "@SW_SHOWMINNOACTIVE"
+syn match autoitBuiltin "@SW_SHOWNA"
+syn match autoitBuiltin "@SW_SHOWNOACTIVATE"
+syn match autoitBuiltin "@SW_SHOWNORMAL"
+syn match autoitBuiltin "@SW_UNLOCK"
+syn match autoitBuiltin "@SystemDir"
+syn match autoitBuiltin "@TAB"
+syn match autoitBuiltin "@TempDir"
+syn match autoitBuiltin "@TRAY_ID"
+syn match autoitBuiltin "@TrayIconFlashing"
+syn match autoitBuiltin "@TrayIconVisible"
+syn match autoitBuiltin "@UserProfileDir"
+syn match autoitBuiltin "@UserName"
+syn match autoitBuiltin "@WDAY"
+syn match autoitBuiltin "@WindowsDir"
+syn match autoitBuiltin "@WorkingDir"
+syn match autoitBuiltin "@YDAY"
+syn match autoitBuiltin "@YEAR"
+
+"comments and commenting-out
+syn match autoitComment ";.*"
+"in this way also #ce alone will be highlighted
+syn match autoitCommDelimiter "^\s*#comments-start\>"
+syn match autoitCommDelimiter "^\s*#cs\>"
+syn match autoitCommDelimiter "^\s*#comments-end\>"
+syn match autoitCommDelimiter "^\s*#ce\>"
+syn region autoitComment
+ \ matchgroup=autoitCommDelimiter
+ \ start="^\s*#comments-start\>" start="^\s*#cs\>"
+ \ end="^\s*#comments-end\>" end="^\s*#ce\>"
+
+"one character operators
+syn match autoitOperator "[-+*/&^=<>][^-+*/&^=<>]"me=e-1
+"two characters operators
+syn match autoitOperator "==[^=]"me=e-1
+syn match autoitOperator "<>"
+syn match autoitOperator "<="
+syn match autoitOperator ">="
+syn match autoitOperator "+="
+syn match autoitOperator "-="
+syn match autoitOperator "*="
+syn match autoitOperator "/="
+syn match autoitOperator "&="
+syn keyword autoitOperator NOT AND OR
+
+syn match autoitParen "(\|)"
+syn match autoitBracket "\[\|\]"
+syn match autoitComma ","
+
+"numbers must come after operator '-'
+"decimal numbers without a dot
+syn match autoitNumber "-\=\<\d\+\>"
+"hexadecimal numbers without a dot
+syn match autoitNumber "-\=\<0x\x\+\>"
+"floating point number with dot (inside or at end)
+
+syn match autoitNumber "-\=\<\d\+\.\d*\>"
+"floating point number, starting with a dot
+syn match autoitNumber "-\=\<\.\d\+\>"
+"scientific notation numbers without dots
+syn match autoitNumber "-\=\<\d\+e[-+]\=\d\+\>"
+"scientific notation numbers with dots
+syn match autoitNumber "-\=\<\(\(\d\+\.\d*\)\|\(\.\d\+\)\)\(e[-+]\=\d\+\)\=\>"
+
+"string constants
+"we want the escaped quotes marked in red
+syn match autoitDoubledSingles +''+ contained
+syn match autoitDoubledDoubles +""+ contained
+"we want the continuation character marked in red
+"(also at the top level, not just contained)
+syn match autoitCont "_$"
+
+" send key list - must be defined before autoitStrings
+syn match autoitSend "{!}" contained
+syn match autoitSend "{#}" contained
+syn match autoitSend "{+}" contained
+syn match autoitSend "{^}" contained
+syn match autoitSend "{{}" contained
+syn match autoitSend "{}}" contained
+syn match autoitSend "{SPACE}" contained
+syn match autoitSend "{ENTER}" contained
+syn match autoitSend "{ALT}" contained
+syn match autoitSend "{BACKSPACE}" contained
+syn match autoitSend "{BS}" contained
+syn match autoitSend "{DELETE}" contained
+syn match autoitSend "{DEL}" contained
+syn match autoitSend "{UP}" contained
+syn match autoitSend "{DOWN}" contained
+syn match autoitSend "{LEFT}" contained
+syn match autoitSend "{RIGHT}" contained
+syn match autoitSend "{HOME}" contained
+syn match autoitSend "{END}" contained
+syn match autoitSend "{ESCAPE}" contained
+syn match autoitSend "{ESC}" contained
+syn match autoitSend "{INSERT}" contained
+syn match autoitSend "{INS}" contained
+syn match autoitSend "{PGUP}" contained
+syn match autoitSend "{PGDN}" contained
+syn match autoitSend "{F1}" contained
+syn match autoitSend "{F2}" contained
+syn match autoitSend "{F3}" contained
+syn match autoitSend "{F4}" contained
+syn match autoitSend "{F5}" contained
+syn match autoitSend "{F6}" contained
+syn match autoitSend "{F7}" contained
+syn match autoitSend "{F8}" contained
+syn match autoitSend "{F9}" contained
+syn match autoitSend "{F10}" contained
+syn match autoitSend "{F11}" contained
+syn match autoitSend "{F12}" contained
+syn match autoitSend "{TAB}" contained
+syn match autoitSend "{PRINTSCREEN}" contained
+syn match autoitSend "{LWIN}" contained
+syn match autoitSend "{RWIN}" contained
+syn match autoitSend "{NUMLOCK}" contained
+syn match autoitSend "{CTRLBREAK}" contained
+syn match autoitSend "{PAUSE}" contained
+syn match autoitSend "{CAPSLOCK}" contained
+syn match autoitSend "{NUMPAD0}" contained
+syn match autoitSend "{NUMPAD1}" contained
+syn match autoitSend "{NUMPAD2}" contained
+syn match autoitSend "{NUMPAD3}" contained
+syn match autoitSend "{NUMPAD4}" contained
+syn match autoitSend "{NUMPAD5}" contained
+syn match autoitSend "{NUMPAD6}" contained
+syn match autoitSend "{NUMPAD7}" contained
+syn match autoitSend "{NUMPAD8}" contained
+syn match autoitSend "{NUMPAD9}" contained
+syn match autoitSend "{NUMPADMULT}" contained
+syn match autoitSend "{NUMPADADD}" contained
+syn match autoitSend "{NUMPADSUB}" contained
+syn match autoitSend "{NUMPADDIV}" contained
+syn match autoitSend "{NUMPADDOT}" contained
+syn match autoitSend "{NUMPADENTER}" contained
+syn match autoitSend "{APPSKEY}" contained
+syn match autoitSend "{LALT}" contained
+syn match autoitSend "{RALT}" contained
+syn match autoitSend "{LCTRL}" contained
+syn match autoitSend "{RCTRL}" contained
+syn match autoitSend "{LSHIFT}" contained
+syn match autoitSend "{RSHIFT}" contained
+syn match autoitSend "{SLEEP}" contained
+syn match autoitSend "{ALTDOWN}" contained
+syn match autoitSend "{SHIFTDOWN}" contained
+syn match autoitSend "{CTRLDOWN}" contained
+syn match autoitSend "{LWINDOWN}" contained
+syn match autoitSend "{RWINDOWN}" contained
+syn match autoitSend "{ASC \d\d\d\d}" contained
+syn match autoitSend "{BROWSER_BACK}" contained
+syn match autoitSend "{BROWSER_FORWARD}" contained
+syn match autoitSend "{BROWSER_REFRESH}" contained
+syn match autoitSend "{BROWSER_STOP}" contained
+syn match autoitSend "{BROWSER_SEARCH}" contained
+syn match autoitSend "{BROWSER_FAVORITES}" contained
+syn match autoitSend "{BROWSER_HOME}" contained
+syn match autoitSend "{VOLUME_MUTE}" contained
+syn match autoitSend "{VOLUME_DOWN}" contained
+syn match autoitSend "{VOLUME_UP}" contained
+syn match autoitSend "{MEDIA_NEXT}" contained
+syn match autoitSend "{MEDIA_PREV}" contained
+syn match autoitSend "{MEDIA_STOP}" contained
+syn match autoitSend "{MEDIA_PLAY_PAUSE}" contained
+syn match autoitSend "{LAUNCH_MAIL}" contained
+syn match autoitSend "{LAUNCH_MEDIA}" contained
+syn match autoitSend "{LAUNCH_APP1}" contained
+syn match autoitSend "{LAUNCH_APP2}" contained
+
+"this was tricky!
+"we use an oneline region, instead of a match, in order to use skip=
+"matchgroup= so start and end quotes are not considered as au3Doubled
+"contained
+syn region autoitString oneline contains=autoitSend matchgroup=autoitQuote start=+"+
+ \ end=+"+ end=+_\n\{1}.*"+
+ \ contains=autoitCont,autoitDoubledDoubles skip=+""+
+syn region autoitString oneline matchgroup=autoitQuote start=+'+
+ \ end=+'+ end=+_\n\{1}.*'+
+ \ contains=autoitCont,autoitDoubledSingles skip=+''+
+
+syn match autoitVarSelector "\$" contained display
+syn match autoitVariable "$\w\+" contains=autoitVarSelector
+
+" options - must be defined after autoitStrings
+syn match autoitOption "\([\"\']\)CaretCoordMode\1"
+syn match autoitOption "\([\"\']\)ColorMode\1"
+syn match autoitOption "\([\"\']\)ExpandEnvStrings\1"
+syn match autoitOption "\([\"\']\)ExpandVarStrings\1"
+syn match autoitOption "\([\"\']\)FtpBinaryMode\1"
+syn match autoitOption "\([\"\']\)GUICloseOnEsc\1"
+syn match autoitOption "\([\"\']\)GUICoordMode\1"
+syn match autoitOption "\([\"\']\)GUIDataSeparatorChar\1"
+syn match autoitOption "\([\"\']\)GUIOnEventMode\1"
+syn match autoitOption "\([\"\']\)GUIResizeMode\1"
+syn match autoitOption "\([\"\']\)GUIEventCompatibilityMode\1"
+syn match autoitOption "\([\"\']\)MouseClickDelay\1"
+syn match autoitOption "\([\"\']\)MouseClickDownDelay\1"
+syn match autoitOption "\([\"\']\)MouseClickDragDelay\1"
+syn match autoitOption "\([\"\']\)MouseCoordMode\1"
+syn match autoitOption "\([\"\']\)MustDeclareVars\1"
+syn match autoitOption "\([\"\']\)OnExitFunc\1"
+syn match autoitOption "\([\"\']\)PixelCoordMode\1"
+syn match autoitOption "\([\"\']\)RunErrorsFatal\1"
+syn match autoitOption "\([\"\']\)SendAttachMode\1"
+syn match autoitOption "\([\"\']\)SendCapslockMode\1"
+syn match autoitOption "\([\"\']\)SendKeyDelay\1"
+syn match autoitOption "\([\"\']\)SendKeyDownDelay\1"
+syn match autoitOption "\([\"\']\)TCPTimeout\1"
+syn match autoitOption "\([\"\']\)TrayAutoPause\1"
+syn match autoitOption "\([\"\']\)TrayIconDebug\1"
+syn match autoitOption "\([\"\']\)TrayIconHide\1"
+syn match autoitOption "\([\"\']\)TrayMenuMode\1"
+syn match autoitOption "\([\"\']\)TrayOnEventMode\1"
+syn match autoitOption "\([\"\']\)WinDetectHiddenText\1"
+syn match autoitOption "\([\"\']\)WinSearchChildren\1"
+syn match autoitOption "\([\"\']\)WinTextMatchMode\1"
+syn match autoitOption "\([\"\']\)WinTitleMatchMode\1"
+syn match autoitOption "\([\"\']\)WinWaitDelay\1"
+
+" styles - must be defined after autoitVariable
+" common
+syn match autoitStyle "\$WS_BORDER"
+syn match autoitStyle "\$WS_POPUP"
+syn match autoitStyle "\$WS_CAPTION"
+syn match autoitStyle "\$WS_CLIPCHILDREN"
+syn match autoitStyle "\$WS_CLIPSIBLINGS"
+syn match autoitStyle "\$WS_DISABLED"
+syn match autoitStyle "\$WS_DLGFRAME"
+syn match autoitStyle "\$WS_HSCROLL"
+syn match autoitStyle "\$WS_MAXIMIZE"
+syn match autoitStyle "\$WS_MAXIMIZEBOX"
+syn match autoitStyle "\$WS_MINIMIZE"
+syn match autoitStyle "\$WS_MINIMIZEBOX"
+syn match autoitStyle "\$WS_OVERLAPPED"
+syn match autoitStyle "\$WS_OVERLAPPEDWINDOW"
+syn match autoitStyle "\$WS_POPUPWINDOW"
+syn match autoitStyle "\$WS_SIZEBOX"
+syn match autoitStyle "\$WS_SYSMENU"
+syn match autoitStyle "\$WS_THICKFRAME"
+syn match autoitStyle "\$WS_VSCROLL"
+syn match autoitStyle "\$WS_VISIBLE"
+syn match autoitStyle "\$WS_CHILD"
+syn match autoitStyle "\$WS_GROUP"
+syn match autoitStyle "\$WS_TABSTOP"
+syn match autoitStyle "\$DS_MODALFRAME"
+syn match autoitStyle "\$DS_SETFOREGROUND"
+syn match autoitStyle "\$DS_CONTEXTHELP"
+" common extended
+syn match autoitStyle "\$WS_EX_ACCEPTFILES"
+syn match autoitStyle "\$WS_EX_APPWINDOW"
+syn match autoitStyle "\$WS_EX_CLIENTEDGE"
+syn match autoitStyle "\$WS_EX_CONTEXTHELP"
+syn match autoitStyle "\$WS_EX_DLGMODALFRAME"
+syn match autoitStyle "\$WS_EX_MDICHILD"
+syn match autoitStyle "\$WS_EX_OVERLAPPEDWINDOW"
+syn match autoitStyle "\$WS_EX_STATICEDGE"
+syn match autoitStyle "\$WS_EX_TOPMOST"
+syn match autoitStyle "\$WS_EX_TRANSPARENT"
+syn match autoitStyle "\$WS_EX_TOOLWINDOW"
+syn match autoitStyle "\$WS_EX_WINDOWEDGE"
+syn match autoitStyle "\$WS_EX_LAYERED"
+syn match autoitStyle "\$GUI_WS_EX_PARENTDRAG"
+" checkbox
+syn match autoitStyle "\$BS_3STATE"
+syn match autoitStyle "\$BS_AUTO3STATE"
+syn match autoitStyle "\$BS_AUTOCHECKBOX"
+syn match autoitStyle "\$BS_CHECKBOX"
+syn match autoitStyle "\$BS_LEFT"
+syn match autoitStyle "\$BS_PUSHLIKE"
+syn match autoitStyle "\$BS_RIGHT"
+syn match autoitStyle "\$BS_RIGHTBUTTON"
+syn match autoitStyle "\$BS_GROUPBOX"
+syn match autoitStyle "\$BS_AUTORADIOBUTTON"
+" push button
+syn match autoitStyle "\$BS_BOTTOM"
+syn match autoitStyle "\$BS_CENTER"
+syn match autoitStyle "\$BS_DEFPUSHBUTTON"
+syn match autoitStyle "\$BS_MULTILINE"
+syn match autoitStyle "\$BS_TOP"
+syn match autoitStyle "\$BS_VCENTER"
+syn match autoitStyle "\$BS_ICON"
+syn match autoitStyle "\$BS_BITMAP"
+syn match autoitStyle "\$BS_FLAT"
+" combo
+syn match autoitStyle "\$CBS_AUTOHSCROLL"
+syn match autoitStyle "\$CBS_DISABLENOSCROLL"
+syn match autoitStyle "\$CBS_DROPDOWN"
+syn match autoitStyle "\$CBS_DROPDOWNLIST"
+syn match autoitStyle "\$CBS_LOWERCASE"
+syn match autoitStyle "\$CBS_NOINTEGRALHEIGHT"
+syn match autoitStyle "\$CBS_OEMCONVERT"
+syn match autoitStyle "\$CBS_SIMPLE"
+syn match autoitStyle "\$CBS_SORT"
+syn match autoitStyle "\$CBS_UPPERCASE"
+" list
+syn match autoitStyle "\$LBS_DISABLENOSCROLL"
+syn match autoitStyle "\$LBS_NOINTEGRALHEIGHT"
+syn match autoitStyle "\$LBS_NOSEL"
+syn match autoitStyle "\$LBS_NOTIFY"
+syn match autoitStyle "\$LBS_SORT"
+syn match autoitStyle "\$LBS_STANDARD"
+syn match autoitStyle "\$LBS_USETABSTOPS"
+" edit/input
+syn match autoitStyle "\$ES_AUTOHSCROLL"
+syn match autoitStyle "\$ES_AUTOVSCROLL"
+syn match autoitStyle "\$ES_CENTER"
+syn match autoitStyle "\$ES_LOWERCASE"
+syn match autoitStyle "\$ES_NOHIDESEL"
+syn match autoitStyle "\$ES_NUMBER"
+syn match autoitStyle "\$ES_OEMCONVERT"
+syn match autoitStyle "\$ES_MULTILINE"
+syn match autoitStyle "\$ES_PASSWORD"
+syn match autoitStyle "\$ES_READONLY"
+syn match autoitStyle "\$ES_RIGHT"
+syn match autoitStyle "\$ES_UPPERCASE"
+syn match autoitStyle "\$ES_WANTRETURN"
+" progress bar
+syn match autoitStyle "\$PBS_SMOOTH"
+syn match autoitStyle "\$PBS_VERTICAL"
+" up-down
+syn match autoitStyle "\$UDS_ALIGNLEFT"
+syn match autoitStyle "\$UDS_ALIGNRIGHT"
+syn match autoitStyle "\$UDS_ARROWKEYS"
+syn match autoitStyle "\$UDS_HORZ"
+syn match autoitStyle "\$UDS_NOTHOUSANDS"
+syn match autoitStyle "\$UDS_WRAP"
+" label/static
+syn match autoitStyle "\$SS_BLACKFRAME"
+syn match autoitStyle "\$SS_BLACKRECT"
+syn match autoitStyle "\$SS_CENTER"
+syn match autoitStyle "\$SS_CENTERIMAGE"
+syn match autoitStyle "\$SS_ETCHEDFRAME"
+syn match autoitStyle "\$SS_ETCHEDHORZ"
+syn match autoitStyle "\$SS_ETCHEDVERT"
+syn match autoitStyle "\$SS_GRAYFRAME"
+syn match autoitStyle "\$SS_GRAYRECT"
+syn match autoitStyle "\$SS_LEFT"
+syn match autoitStyle "\$SS_LEFTNOWORDWRAP"
+syn match autoitStyle "\$SS_NOPREFIX"
+syn match autoitStyle "\$SS_NOTIFY"
+syn match autoitStyle "\$SS_RIGHT"
+syn match autoitStyle "\$SS_RIGHTJUST"
+syn match autoitStyle "\$SS_SIMPLE"
+syn match autoitStyle "\$SS_SUNKEN"
+syn match autoitStyle "\$SS_WHITEFRAME"
+syn match autoitStyle "\$SS_WHITERECT"
+" tab
+syn match autoitStyle "\$TCS_SCROLLOPPOSITE"
+syn match autoitStyle "\$TCS_BOTTOM"
+syn match autoitStyle "\$TCS_RIGHT"
+syn match autoitStyle "\$TCS_MULTISELECT"
+syn match autoitStyle "\$TCS_FLATBUTTONS"
+syn match autoitStyle "\$TCS_FORCEICONLEFT"
+syn match autoitStyle "\$TCS_FORCELABELLEFT"
+syn match autoitStyle "\$TCS_HOTTRACK"
+syn match autoitStyle "\$TCS_VERTICAL"
+syn match autoitStyle "\$TCS_TABS"
+syn match autoitStyle "\$TCS_BUTTONS"
+syn match autoitStyle "\$TCS_SINGLELINE"
+syn match autoitStyle "\$TCS_MULTILINE"
+syn match autoitStyle "\$TCS_RIGHTJUSTIFY"
+syn match autoitStyle "\$TCS_FIXEDWIDTH"
+syn match autoitStyle "\$TCS_RAGGEDRIGHT"
+syn match autoitStyle "\$TCS_FOCUSONBUTTONDOWN"
+syn match autoitStyle "\$TCS_OWNERDRAWFIXED"
+syn match autoitStyle "\$TCS_TOOLTIPS"
+syn match autoitStyle "\$TCS_FOCUSNEVER"
+" avi clip
+syn match autoitStyle "\$ACS_AUTOPLAY"
+syn match autoitStyle "\$ACS_CENTER"
+syn match autoitStyle "\$ACS_TRANSPARENT"
+syn match autoitStyle "\$ACS_NONTRANSPARENT"
+" date
+syn match autoitStyle "\$DTS_UPDOWN"
+syn match autoitStyle "\$DTS_SHOWNONE"
+syn match autoitStyle "\$DTS_LONGDATEFORMAT"
+syn match autoitStyle "\$DTS_TIMEFORMAT"
+syn match autoitStyle "\$DTS_RIGHTALIGN"
+syn match autoitStyle "\$DTS_SHORTDATEFORMAT"
+" monthcal
+syn match autoitStyle "\$MCS_NOTODAY"
+syn match autoitStyle "\$MCS_NOTODAYCIRCLE"
+syn match autoitStyle "\$MCS_WEEKNUMBERS"
+" treeview
+syn match autoitStyle "\$TVS_HASBUTTONS"
+syn match autoitStyle "\$TVS_HASLINES"
+syn match autoitStyle "\$TVS_LINESATROOT"
+syn match autoitStyle "\$TVS_DISABLEDRAGDROP"
+syn match autoitStyle "\$TVS_SHOWSELALWAYS"
+syn match autoitStyle "\$TVS_RTLREADING"
+syn match autoitStyle "\$TVS_NOTOOLTIPS"
+syn match autoitStyle "\$TVS_CHECKBOXES"
+syn match autoitStyle "\$TVS_TRACKSELECT"
+syn match autoitStyle "\$TVS_SINGLEEXPAND"
+syn match autoitStyle "\$TVS_FULLROWSELECT"
+syn match autoitStyle "\$TVS_NOSCROLL"
+syn match autoitStyle "\$TVS_NONEVENHEIGHT"
+" slider
+syn match autoitStyle "\$TBS_AUTOTICKS"
+syn match autoitStyle "\$TBS_BOTH"
+syn match autoitStyle "\$TBS_BOTTOM"
+syn match autoitStyle "\$TBS_HORZ"
+syn match autoitStyle "\$TBS_VERT"
+syn match autoitStyle "\$TBS_NOTHUMB"
+syn match autoitStyle "\$TBS_NOTICKS"
+syn match autoitStyle "\$TBS_LEFT"
+syn match autoitStyle "\$TBS_RIGHT"
+syn match autoitStyle "\$TBS_TOP"
+" listview
+syn match autoitStyle "\$LVS_ICON"
+syn match autoitStyle "\$LVS_REPORT"
+syn match autoitStyle "\$LVS_SMALLICON"
+syn match autoitStyle "\$LVS_LIST"
+syn match autoitStyle "\$LVS_EDITLABELS"
+syn match autoitStyle "\$LVS_NOCOLUMNHEADER"
+syn match autoitStyle "\$LVS_NOSORTHEADER"
+syn match autoitStyle "\$LVS_SINGLESEL"
+syn match autoitStyle "\$LVS_SHOWSELALWAYS"
+syn match autoitStyle "\$LVS_SORTASCENDING"
+syn match autoitStyle "\$LVS_SORTDESCENDING"
+" listview extended
+syn match autoitStyle "\$LVS_EX_FULLROWSELECT"
+syn match autoitStyle "\$LVS_EX_GRIDLINES"
+syn match autoitStyle "\$LVS_EX_HEADERDRAGDROP"
+syn match autoitStyle "\$LVS_EX_TRACKSELECT"
+syn match autoitStyle "\$LVS_EX_CHECKBOXES"
+syn match autoitStyle "\$LVS_EX_BORDERSELECT"
+syn match autoitStyle "\$LVS_EX_DOUBLEBUFFER"
+syn match autoitStyle "\$LVS_EX_FLATSB"
+syn match autoitStyle "\$LVS_EX_MULTIWORKAREAS"
+syn match autoitStyle "\$LVS_EX_SNAPTOGRID"
+syn match autoitStyle "\$LVS_EX_SUBITEMIMAGES"
+
+" constants - must be defined after autoitVariable - excludes styles
+" constants - autoit options
+syn match autoitConst "\$OPT_COORDSRELATIVE"
+syn match autoitConst "\$OPT_COORDSABSOLUTE"
+syn match autoitConst "\$OPT_COORDSCLIENT"
+syn match autoitConst "\$OPT_ERRORSILENT"
+syn match autoitConst "\$OPT_ERRORFATAL"
+syn match autoitConst "\$OPT_CAPSNOSTORE"
+syn match autoitConst "\$OPT_CAPSSTORE"
+syn match autoitConst "\$OPT_MATCHSTART"
+syn match autoitConst "\$OPT_MATCHANY"
+syn match autoitConst "\$OPT_MATCHEXACT"
+syn match autoitConst "\$OPT_MATCHADVANCED"
+" constants - file
+syn match autoitConst "\$FC_NOOVERWRITE"
+syn match autoitConst "\$FC_OVERWRITE"
+syn match autoitConst "\$FT_MODIFIED"
+syn match autoitConst "\$FT_CREATED"
+syn match autoitConst "\$FT_ACCESSED"
+syn match autoitConst "\$FO_READ"
+syn match autoitConst "\$FO_APPEND"
+syn match autoitConst "\$FO_OVERWRITE"
+syn match autoitConst "\$EOF"
+syn match autoitConst "\$FD_FILEMUSTEXIST"
+syn match autoitConst "\$FD_PATHMUSTEXIST"
+syn match autoitConst "\$FD_MULTISELECT"
+syn match autoitConst "\$FD_PROMPTCREATENEW"
+syn match autoitConst "\$FD_PROMPTOVERWRITE"
+" constants - keyboard
+syn match autoitConst "\$KB_SENDSPECIAL"
+syn match autoitConst "\$KB_SENDRAW"
+syn match autoitConst "\$KB_CAPSOFF"
+syn match autoitConst "\$KB_CAPSON"
+" constants - message box
+syn match autoitConst "\$MB_OK"
+syn match autoitConst "\$MB_OKCANCEL"
+syn match autoitConst "\$MB_ABORTRETRYIGNORE"
+syn match autoitConst "\$MB_YESNOCANCEL"
+syn match autoitConst "\$MB_YESNO"
+syn match autoitConst "\$MB_RETRYCANCEL"
+syn match autoitConst "\$MB_ICONHAND"
+syn match autoitConst "\$MB_ICONQUESTION"
+syn match autoitConst "\$MB_ICONEXCLAMATION"
+syn match autoitConst "\$MB_ICONASTERISK"
+syn match autoitConst "\$MB_DEFBUTTON1"
+syn match autoitConst "\$MB_DEFBUTTON2"
+syn match autoitConst "\$MB_DEFBUTTON3"
+syn match autoitConst "\$MB_APPLMODAL"
+syn match autoitConst "\$MB_SYSTEMMODAL"
+syn match autoitConst "\$MB_TASKMODAL"
+syn match autoitConst "\$MB_TOPMOST"
+syn match autoitConst "\$MB_RIGHTJUSTIFIED"
+syn match autoitConst "\$IDTIMEOUT"
+syn match autoitConst "\$IDOK"
+syn match autoitConst "\$IDCANCEL"
+syn match autoitConst "\$IDABORT"
+syn match autoitConst "\$IDRETRY"
+syn match autoitConst "\$IDIGNORE"
+syn match autoitConst "\$IDYES"
+syn match autoitConst "\$IDNO"
+syn match autoitConst "\$IDTRYAGAIN"
+syn match autoitConst "\$IDCONTINUE"
+" constants - progress and splash
+syn match autoitConst "\$DLG_NOTITLE"
+syn match autoitConst "\$DLG_NOTONTOP"
+syn match autoitConst "\$DLG_TEXTLEFT"
+syn match autoitConst "\$DLG_TEXTRIGHT"
+syn match autoitConst "\$DLG_MOVEABLE"
+syn match autoitConst "\$DLG_TEXTVCENTER"
+" constants - tray tip
+syn match autoitConst "\$TIP_ICONNONE"
+syn match autoitConst "\$TIP_ICONASTERISK"
+syn match autoitConst "\$TIP_ICONEXCLAMATION"
+syn match autoitConst "\$TIP_ICONHAND"
+syn match autoitConst "\$TIP_NOSOUND"
+" constants - mouse
+syn match autoitConst "\$IDC_UNKNOWN"
+syn match autoitConst "\$IDC_APPSTARTING"
+syn match autoitConst "\$IDC_ARROW"
+syn match autoitConst "\$IDC_CROSS"
+syn match autoitConst "\$IDC_HELP"
+syn match autoitConst "\$IDC_IBEAM"
+syn match autoitConst "\$IDC_ICON"
+syn match autoitConst "\$IDC_NO"
+syn match autoitConst "\$IDC_SIZE"
+syn match autoitConst "\$IDC_SIZEALL"
+syn match autoitConst "\$IDC_SIZENESW"
+syn match autoitConst "\$IDC_SIZENS"
+syn match autoitConst "\$IDC_SIZENWSE"
+syn match autoitConst "\$IDC_SIZEWE"
+syn match autoitConst "\$IDC_UPARROW"
+syn match autoitConst "\$IDC_WAIT"
+" constants - process
+syn match autoitConst "\$SD_LOGOFF"
+syn match autoitConst "\$SD_SHUTDOWN"
+syn match autoitConst "\$SD_REBOOT"
+syn match autoitConst "\$SD_FORCE"
+syn match autoitConst "\$SD_POWERDOWN"
+" constants - string
+syn match autoitConst "\$STR_NOCASESENSE"
+syn match autoitConst "\$STR_CASESENSE"
+syn match autoitConst "\$STR_STRIPLEADING"
+syn match autoitConst "\$STR_STRIPTRAILING"
+syn match autoitConst "\$STR_STRIPSPACES"
+syn match autoitConst "\$STR_STRIPALL"
+" constants - tray
+syn match autoitConst "\$TRAY_ITEM_EXIT"
+syn match autoitConst "\$TRAY_ITEM_PAUSE"
+syn match autoitConst "\$TRAY_ITEM_FIRST"
+syn match autoitConst "\$TRAY_CHECKED"
+syn match autoitConst "\$TRAY_UNCHECKED"
+syn match autoitConst "\$TRAY_ENABLE"
+syn match autoitConst "\$TRAY_DISABLE"
+syn match autoitConst "\$TRAY_FOCUS"
+syn match autoitConst "\$TRAY_DEFAULT"
+syn match autoitConst "\$TRAY_EVENT_SHOWICON"
+syn match autoitConst "\$TRAY_EVENT_HIDEICON"
+syn match autoitConst "\$TRAY_EVENT_FLASHICON"
+syn match autoitConst "\$TRAY_EVENT_NOFLASHICON"
+syn match autoitConst "\$TRAY_EVENT_PRIMARYDOWN"
+syn match autoitConst "\$TRAY_EVENT_PRIMARYUP"
+syn match autoitConst "\$TRAY_EVENT_SECONDARYDOWN"
+syn match autoitConst "\$TRAY_EVENT_SECONDARYUP"
+syn match autoitConst "\$TRAY_EVENT_MOUSEOVER"
+syn match autoitConst "\$TRAY_EVENT_MOUSEOUT"
+syn match autoitConst "\$TRAY_EVENT_PRIMARYDOUBLE"
+syn match autoitConst "\$TRAY_EVENT_SECONDARYDOUBLE"
+" constants - stdio
+syn match autoitConst "\$STDIN_CHILD"
+syn match autoitConst "\$STDOUT_CHILD"
+syn match autoitConst "\$STDERR_CHILD"
+" constants - color
+syn match autoitConst "\$COLOR_BLACK"
+syn match autoitConst "\$COLOR_SILVER"
+syn match autoitConst "\$COLOR_GRAY"
+syn match autoitConst "\$COLOR_WHITE"
+syn match autoitConst "\$COLOR_MAROON"
+syn match autoitConst "\$COLOR_RED"
+syn match autoitConst "\$COLOR_PURPLE"
+syn match autoitConst "\$COLOR_FUCHSIA"
+syn match autoitConst "\$COLOR_GREEN"
+syn match autoitConst "\$COLOR_LIME"
+syn match autoitConst "\$COLOR_OLIVE"
+syn match autoitConst "\$COLOR_YELLOW"
+syn match autoitConst "\$COLOR_NAVY"
+syn match autoitConst "\$COLOR_BLUE"
+syn match autoitConst "\$COLOR_TEAL"
+syn match autoitConst "\$COLOR_AQUA"
+" constants - reg value type
+syn match autoitConst "\$REG_NONE"
+syn match autoitConst "\$REG_SZ"
+syn match autoitConst "\$REG_EXPAND_SZ"
+syn match autoitConst "\$REG_BINARY"
+syn match autoitConst "\$REG_DWORD"
+syn match autoitConst "\$REG_DWORD_BIG_ENDIAN"
+syn match autoitConst "\$REG_LINK"
+syn match autoitConst "\$REG_MULTI_SZ"
+syn match autoitConst "\$REG_RESOURCE_LIST"
+syn match autoitConst "\$REG_FULL_RESOURCE_DESCRIPTOR"
+syn match autoitConst "\$REG_RESOURCE_REQUIREMENTS_LIST"
+" guiconstants - events and messages
+syn match autoitConst "\$GUI_EVENT_CLOSE"
+syn match autoitConst "\$GUI_EVENT_MINIMIZE"
+syn match autoitConst "\$GUI_EVENT_RESTORE"
+syn match autoitConst "\$GUI_EVENT_MAXIMIZE"
+syn match autoitConst "\$GUI_EVENT_PRIMARYDOWN"
+syn match autoitConst "\$GUI_EVENT_PRIMARYUP"
+syn match autoitConst "\$GUI_EVENT_SECONDARYDOWN"
+syn match autoitConst "\$GUI_EVENT_SECONDARYUP"
+syn match autoitConst "\$GUI_EVENT_MOUSEMOVE"
+syn match autoitConst "\$GUI_EVENT_RESIZED"
+syn match autoitConst "\$GUI_EVENT_DROPPED"
+syn match autoitConst "\$GUI_RUNDEFMSG"
+" guiconstants - state
+syn match autoitConst "\$GUI_AVISTOP"
+syn match autoitConst "\$GUI_AVISTART"
+syn match autoitConst "\$GUI_AVICLOSE"
+syn match autoitConst "\$GUI_CHECKED"
+syn match autoitConst "\$GUI_INDETERMINATE"
+syn match autoitConst "\$GUI_UNCHECKED"
+syn match autoitConst "\$GUI_DROPACCEPTED"
+syn match autoitConst "\$GUI_DROPNOTACCEPTED"
+syn match autoitConst "\$GUI_ACCEPTFILES"
+syn match autoitConst "\$GUI_SHOW"
+syn match autoitConst "\$GUI_HIDE"
+syn match autoitConst "\$GUI_ENABLE"
+syn match autoitConst "\$GUI_DISABLE"
+syn match autoitConst "\$GUI_FOCUS"
+syn match autoitConst "\$GUI_NOFOCUS"
+syn match autoitConst "\$GUI_DEFBUTTON"
+syn match autoitConst "\$GUI_EXPAND"
+syn match autoitConst "\$GUI_ONTOP"
+" guiconstants - font
+syn match autoitConst "\$GUI_FONTITALIC"
+syn match autoitConst "\$GUI_FONTUNDER"
+syn match autoitConst "\$GUI_FONTSTRIKE"
+" guiconstants - resizing
+syn match autoitConst "\$GUI_DOCKAUTO"
+syn match autoitConst "\$GUI_DOCKLEFT"
+syn match autoitConst "\$GUI_DOCKRIGHT"
+syn match autoitConst "\$GUI_DOCKHCENTER"
+syn match autoitConst "\$GUI_DOCKTOP"
+syn match autoitConst "\$GUI_DOCKBOTTOM"
+syn match autoitConst "\$GUI_DOCKVCENTER"
+syn match autoitConst "\$GUI_DOCKWIDTH"
+syn match autoitConst "\$GUI_DOCKHEIGHT"
+syn match autoitConst "\$GUI_DOCKSIZE"
+syn match autoitConst "\$GUI_DOCKMENUBAR"
+syn match autoitConst "\$GUI_DOCKSTATEBAR"
+syn match autoitConst "\$GUI_DOCKALL"
+syn match autoitConst "\$GUI_DOCKBORDERS"
+" guiconstants - graphic
+syn match autoitConst "\$GUI_GR_CLOSE"
+syn match autoitConst "\$GUI_GR_LINE"
+syn match autoitConst "\$GUI_GR_BEZIER"
+syn match autoitConst "\$GUI_GR_MOVE"
+syn match autoitConst "\$GUI_GR_COLOR"
+syn match autoitConst "\$GUI_GR_RECT"
+syn match autoitConst "\$GUI_GR_ELLIPSE"
+syn match autoitConst "\$GUI_GR_PIE"
+syn match autoitConst "\$GUI_GR_DOT"
+syn match autoitConst "\$GUI_GR_PIXEL"
+syn match autoitConst "\$GUI_GR_HINT"
+syn match autoitConst "\$GUI_GR_REFRESH"
+syn match autoitConst "\$GUI_GR_PENSIZE"
+syn match autoitConst "\$GUI_GR_NOBKCOLOR"
+" guiconstants - control default styles
+syn match autoitConst "\$GUI_SS_DEFAULT_AVI"
+syn match autoitConst "\$GUI_SS_DEFAULT_BUTTON"
+syn match autoitConst "\$GUI_SS_DEFAULT_CHECKBOX"
+syn match autoitConst "\$GUI_SS_DEFAULT_COMBO"
+syn match autoitConst "\$GUI_SS_DEFAULT_DATE"
+syn match autoitConst "\$GUI_SS_DEFAULT_EDIT"
+syn match autoitConst "\$GUI_SS_DEFAULT_GRAPHIC"
+syn match autoitConst "\$GUI_SS_DEFAULT_GROUP"
+syn match autoitConst "\$GUI_SS_DEFAULT_ICON"
+syn match autoitConst "\$GUI_SS_DEFAULT_INPUT"
+syn match autoitConst "\$GUI_SS_DEFAULT_LABEL"
+syn match autoitConst "\$GUI_SS_DEFAULT_LIST"
+syn match autoitConst "\$GUI_SS_DEFAULT_LISTVIEW"
+syn match autoitConst "\$GUI_SS_DEFAULT_MONTHCAL"
+syn match autoitConst "\$GUI_SS_DEFAULT_PIC"
+syn match autoitConst "\$GUI_SS_DEFAULT_PROGRESS"
+syn match autoitConst "\$GUI_SS_DEFAULT_RADIO"
+syn match autoitConst "\$GUI_SS_DEFAULT_SLIDER"
+syn match autoitConst "\$GUI_SS_DEFAULT_TAB"
+syn match autoitConst "\$GUI_SS_DEFAULT_TREEVIEW"
+syn match autoitConst "\$GUI_SS_DEFAULT_UPDOWN"
+syn match autoitConst "\$GUI_SS_DEFAULT_GUI"
+" guiconstants - background color special flags
+syn match autoitConst "\$GUI_BKCOLOR_DEFAULT"
+syn match autoitConst "\$GUI_BKCOLOR_LV_ALTERNATE"
+syn match autoitConst "\$GUI_BKCOLOR_TRANSPARENT"
+
+" registry constants
+syn match autoitConst "\([\"\']\)REG_BINARY\1"
+syn match autoitConst "\([\"\']\)REG_SZ\1"
+syn match autoitConst "\([\"\']\)REG_MULTI_SZ\1"
+syn match autoitConst "\([\"\']\)REG_EXPAND_SZ\1"
+syn match autoitConst "\([\"\']\)REG_DWORD\1"
+
+" Define the default highlighting.
+" Unused colors: Underlined, Ignore, Error, Todo
+hi def link autoitFunction Statement " yellow/yellow
+hi def link autoitKeyword Statement
+hi def link autoitOperator Operator
+hi def link autoitVarSelector Operator
+hi def link autoitComment Comment " cyan/blue
+hi def link autoitParen Comment
+hi def link autoitComma Comment
+hi def link autoitBracket Comment
+hi def link autoitNumber Constant " magenta/red
+hi def link autoitString Constant
+hi def link autoitQuote Constant
+hi def link autoitIncluded Constant
+hi def link autoitCont Special " red/orange
+hi def link autoitDoubledSingles Special
+hi def link autoitDoubledDoubles Special
+hi def link autoitCommDelimiter PreProc " blue/magenta
+hi def link autoitInclude PreProc
+hi def link autoitVariable Identifier " cyan/cyan
+hi def link autoitBuiltin Type " green/green
+hi def link autoitOption Type
+hi def link autoitStyle Type
+hi def link autoitConst Type
+hi def link autoitSend Type
+
+syn sync minlines=50
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/syntax/automake.vim b/runtime/syntax/automake.vim
new file mode 100644
index 0000000..2f1ad98
--- /dev/null
+++ b/runtime/syntax/automake.vim
@@ -0,0 +1,77 @@
+" Vim syntax file
+" Language: automake Makefile.am
+" Maintainer: Debian Vim Maintainers
+" Former Maintainer: John Williams <jrw@pobox.com>
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/automake.vim
+"
+" XXX This file is in need of a new maintainer, Debian VIM Maintainers maintain
+" it only because patches have been submitted for it by Debian users and the
+" former maintainer was MIA (Missing In Action), taking over its
+" maintenance was thus the only way to include those patches.
+" If you care about this file, and have time to maintain it please do so!
+"
+" This script adds support for automake's Makefile.am format. It highlights
+" Makefile variables significant to automake as well as highlighting
+" autoconf-style @variable@ substitutions . Subsitutions are marked as errors
+" when they are used in an inappropriate place, such as in defining
+" EXTRA_SOURCES.
+
+" Standard syntax initialization
+if exists('b:current_syntax')
+ finish
+endif
+
+" Read the Makefile syntax to start with
+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
+syn match automakeSecondary "^\w\+\(_SOURCES\|_LIBADD\|_LDADD\|_LDFLAGS\|_DEPENDENCIES\|_AR\|_CCASFLAGS\|_CFLAGS\|_CPPFLAGS\|_CXXFLAGS\|_FCFLAGS\|_FFLAGS\|_GCJFLAGS\|_LFLAGS\|_LIBTOOLFLAGS\|OBJCFLAGS\|RFLAGS\|UPCFLAGS\|YFLAGS\)\s*\ze+\=="
+syn match automakeSecondary "^\(LDADD\|ARFLAGS\|OMIT_DEPENDENCIES\|AM_MAKEFLAGS\|\(AM_\)\=\(MAKEINFOFLAGS\|RUNTESTDEFAULTFLAGS\|ETAGSFLAGS\|CTAGSFLAGS\|JAVACFLAGS\)\)\s*\ze+\=="
+syn match automakeExtra "^EXTRA_\w\+\s*\ze+\=="
+syn match automakeOptions "^\(ACLOCAL_AMFLAGS\|AUTOMAKE_OPTIONS\|DISTCHECK_CONFIGURE_FLAGS\|ETAGS_ARGS\|TAGS_DEPENDENCIES\)\s*\ze+\=="
+syn match automakeClean "^\(MOSTLY\|DIST\|MAINTAINER\)\=CLEANFILES\s*\ze+\=="
+syn match automakeSubdirs "^\(DIST_\)\=SUBDIRS\s*\ze+\=="
+syn match automakeConditional "^\(if\s*!\=\w\+\|else\|endif\)\s*$"
+
+syn match automakeSubst "@\w\+@"
+syn match automakeSubst "^\s*@\w\+@"
+syn match automakeComment1 "#.*$" contains=automakeSubst,@Spell
+syn match automakeComment2 "##.*$" contains=@Spell
+
+syn match automakeMakeError "$[{(][^})]*[^a-zA-Z0-9_})][^})]*[})]" " GNU make function call
+syn match automakeMakeError "^AM_LDADD\s*\ze+\==" " Common mistake
+
+syn region automakeNoSubst start="^EXTRA_\w*\s*+\==" end="$" contains=ALLBUT,automakeNoSubst transparent
+syn region automakeNoSubst start="^DIST_SUBDIRS\s*+\==" end="$" contains=ALLBUT,automakeNoSubst transparent
+syn region automakeNoSubst start="^\w*_SOURCES\s*+\==" end="$" contains=ALLBUT,automakeNoSubst transparent
+syn match automakeBadSubst "@\(\w*@\=\)\=" contained
+
+syn region automakeMakeDString start=+"+ skip=+\\"+ end=+"+ contains=makeIdent,automakeSubstitution
+syn region automakeMakeSString start=+'+ skip=+\\'+ end=+'+ contains=makeIdent,automakeSubstitution
+syn region automakeMakeBString start=+`+ skip=+\\`+ end=+`+ contains=makeIdent,makeSString,makeDString,makeNextLine,automakeSubstitution
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = 'automake'
+
+" vi: ts=8 sw=4 sts=4
diff --git a/runtime/syntax/ave.vim b/runtime/syntax/ave.vim
new file mode 100644
index 0000000..e63e7d2
--- /dev/null
+++ b/runtime/syntax/ave.vim
@@ -0,0 +1,79 @@
+" Vim syntax file
+" Copyright by Jan-Oliver Wagner
+" Language: avenue
+" Maintainer: Jan-Oliver Wagner <Jan-Oliver.Wagner@intevation.de>
+" Last change: 2001 May 10
+
+" Avenue is the ArcView built-in language. ArcView is
+" a desktop GIS by ESRI. Though it is a built-in language
+" and a built-in editor is provided, the use of VIM increases
+" development speed.
+" I use some technologies to automatically load avenue scripts
+" into ArcView.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Avenue is entirely case-insensitive.
+syn case ignore
+
+" The keywords
+
+syn keyword aveStatement if then elseif else end break exit return
+syn keyword aveStatement for each in continue while
+
+" String
+
+syn region aveString start=+"+ end=+"+
+
+" Integer number
+syn match aveNumber "[+-]\=\<[0-9]\+\>"
+
+" Operator
+
+syn keyword aveOperator or and max min xor mod by
+" '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]"
+
+" Variables
+
+syn keyword aveFixVariables av nil self false true nl tab cr tab
+syn match globalVariables "_[a-zA-Z][a-zA-Z0-9]*"
+syn match aveVariables "[a-zA-Z][a-zA-Z0-9_]*"
+syn match aveConst "#[A-Z][A-Z_]+"
+
+" Comments
+
+syn match aveComment "'.*"
+
+" Typical Typos
+
+" for C programmers:
+syn match aveTypos "=="
+syn match aveTypos "!="
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting+yet
+
+hi def link aveStatement Statement
+
+hi def link aveString String
+hi def link aveNumber Number
+
+hi def link aveFixVariables Special
+hi def link aveVariables Identifier
+hi def link globalVariables Special
+hi def link aveConst Special
+
+hi def link aveClassMethods Function
+
+hi def link aveOperator Operator
+hi def link aveComment Comment
+
+hi def link aveTypos Error
+
+
+let b:current_syntax = "ave"
diff --git a/runtime/syntax/avra.vim b/runtime/syntax/avra.vim
new file mode 100644
index 0000000..0e02bd8
--- /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
new file mode 100644
index 0000000..3082c1c
--- /dev/null
+++ b/runtime/syntax/awk.vim
@@ -0,0 +1,217 @@
+" Vim syntax file
+" Language: awk, nawk, gawk, mawk
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Antonio Colombo <azc100@gmail.com>
+" Last Change: 2020 Aug 18
+
+" 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
+" (up-to-date version available 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)
+" definition of the AWK language which contains a few features
+" not described in the AWK book, and mawk provides a small number of extensions.
+
+" TODO:
+" Dig into the commented out syntax expressions below.
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn iskeyword @,48-57,_,192-255,@-@
+
+" A bunch of useful Awk keywords
+" AWK ref. p. 188
+syn keyword awkStatement break continue delete exit
+syn keyword awkStatement function getline next
+syn keyword awkStatement print printf return
+" GAWK ref. Chapter 7-9
+syn keyword awkStatement case default switch nextfile
+syn keyword awkStatement func
+" GAWK ref. Chapter 2.7, Including Other Files into Your Program
+" GAWK ref. Chapter 2.8, Loading Dynamic Extensions into Your Program
+" GAWK ref. Chapter 15, Namespaces
+" Directives
+syn keyword awkStatement @include @load @namespace
+"
+" GAWK ref. Chapter 9, Functions
+" Numeric Functions
+syn keyword awkFunction atan2 cos exp int log rand sin sqrt srand
+" String Manipulation Functions
+syn keyword awkFunction asort asorti gensub gsub index length match
+syn keyword awkFunction patsplit split sprintf strtonum sub substr
+syn keyword awkFunction tolower toupper
+" Input Output Functions
+syn keyword awkFunction close fflush system
+" Time Functions
+syn keyword awkFunction mktime strftime systime
+" Bit Manipulation Functions
+syn keyword awkFunction and compl lshift or rshift xor
+" Getting Type Information 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 do
+
+syn keyword awkTodo contained TODO
+
+syn keyword awkPatterns BEGIN END BEGINFILE ENDFILE
+
+" GAWK ref. Chapter 7
+" Built-in Variables That Control awk
+syn keyword awkVariables BINMODE CONVFMT FIELDWIDTHS FPAT FS
+syn keyword awkVariables IGNORECASE LINT OFMT OFS ORS PREC
+syn keyword awkVariables ROUNDMODE RS SUBSEP TEXTDOMAIN
+" Built-in Variables That Convey Information
+syn keyword awkVariables ARGC ARGV ARGIND ENVIRON ERRNO FILENAME
+syn keyword awkVariables FNR NF FUNCTAB NR PROCINFO RLENGTH RSTART
+syn keyword awkVariables RT SYMTAB
+
+" 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\}"
+" 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,awkComment
+syn match awkParenError display ")"
+"syn match awkInParen display contained "[{}]"
+
+" 64 lines for complex &&'s, and ||'s in a big "if"
+syn sync ccomment awkParen maxlines=64
+
+" Search strings & Regular Expressions therein.
+syn region awkSearch oneline start="^[ \t]*/"ms=e start="\(,\|!\=\~\)[ \t]*/"ms=e skip="\\\\\|\\/" end="/" contains=awkBrackets,awkRegExp,awkSpecialCharacter
+syn region awkBrackets contained start="\[\^\]\="ms=s+2 start="\[[^\^]"ms=s+1 end="\]"me=e-1 contains=awkBrktRegExp,awkCharClass
+syn region awkSearch oneline start="[ \t]*/"hs=e skip="\\\\\|\\/" end="/" contains=awkBrackets,awkRegExp,awkSpecialCharacter
+
+syn match awkCharClass contained "\[:[^:\]]*:\]"
+syn match awkBrktRegExp contained "\\.\|.\-[^]]"
+syn match awkRegExp contained "/\^"ms=s+1
+syn match awkRegExp contained "\$/"me=e-1
+syn match awkRegExp contained "[?.*{}|+]"
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn region awkString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell,awkSpecialCharacter,awkSpecialPrintf
+syn match awkSpecialCharacter contained "\\."
+
+" Some of these combinations may seem weird, but they work.
+syn match awkSpecialPrintf contained "%[-+ #]*\d*\.\=\d*[cdefgiosuxEGX%]"
+
+" Numbers, allowing signs (both -, and +)
+" Integer number.
+syn match awkNumber display "[+-]\=\<\d\+\>"
+" Floating point number.
+syn match awkFloat display "[+-]\=\<\d\+\.\d+\>"
+" Floating point number, starting with a dot.
+syn match awkFloat display "[+-]\=\<.\d+\>"
+syn case ignore
+"floating point number, with dot, optional exponent
+syn match awkFloat display "\<\d\+\.\d*\(e[-+]\=\d\+\)\=\>"
+"floating point number, starting with a dot, optional exponent
+syn match awkFloat display "\.\d\+\(e[-+]\=\d\+\)\=\>"
+"floating point number, without dot, with exponent
+syn match awkFloat display "\<\d\+e[-+]\=\d\+\>"
+syn case match
+
+"syn match awkIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>"
+
+" Comparison expressions.
+syn match awkExpression "==\|>=\|=>\|<=\|=<\|\!="
+syn match awkExpression "\~\|\!\~"
+syn match awkExpression "?\|:"
+syn keyword awkExpression in
+
+" Boolean Logic (OR, AND, NOT)
+syn match awkBoolLogic "||\|&&\|\!"
+
+" This is overridden by less-than & greater-than.
+" Put this above those to override them.
+" Put this in a 'match "\<printf\=\>.*;\="' to make it not override
+" less/greater than (most of the time), but it won't work yet because
+" keywords always have precedence over match & region.
+" File I/O: (print foo, bar > "filename") & for nawk (getline < "filename")
+"syn match awkFileIO contained ">"
+"syn match awkFileIO contained "<"
+
+" Expression separators: ';' and ','
+syn match awkSemicolon ";"
+syn match awkComma ","
+
+syn match awkComment "#.*" contains=@Spell,awkTodo
+
+syn match awkLineSkip "\\$"
+
+" Highlight array element's (recursive arrays allowed).
+" Keeps nested array names' separate from normal array elements.
+" Keeps numbers separate from normal array elements (variables).
+syn match awkArrayArray contained "[^][, \t]\+\["me=e-1
+syn match awkArrayElement contained "[^][, \t]\+"
+syn region awkArray transparent start="\[" end="\]" contains=awkArray,awkArrayElement,awkArrayArray,awkNumber,awkFloat
+
+" 10 should be enough.
+" (for the few instances where it would be more than "oneline")
+syn sync ccomment awkArray maxlines=10
+
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/ayacc.vim b/runtime/syntax/ayacc.vim
new file mode 100644
index 0000000..6fb6aec
--- /dev/null
+++ b/runtime/syntax/ayacc.vim
@@ -0,0 +1,75 @@
+" Vim syntax file
+" Language: AYacc
+" Maintainer: Mathieu Clabaut <mathieu.clabaut@free.fr>
+" LastChange: 2011 Dec 25
+" Original: Yacc, maintained by Dr. Charles E. Campbell, Jr.
+" Comment: Replaced sourcing c.vim file by ada.vim and rename yacc*
+" in ayacc*
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the Ada syntax to start with
+runtime! syntax/ada.vim
+unlet b:current_syntax
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Clusters
+syn cluster ayaccActionGroup contains=ayaccDelim,cInParen,cTodo,cIncluded,ayaccDelim,ayaccCurlyError,ayaccUnionCurly,ayaccUnion,cUserLabel,cOctalZero,cCppOut2,cCppSkip,cErrInBracket,cErrInParen,cOctalError
+syn cluster ayaccUnionGroup contains=ayaccKey,cComment,ayaccCurly,cType,cStructure,cStorageClass,ayaccUnionCurly
+
+" Yacc stuff
+syn match ayaccDelim "^[ \t]*[:|;]"
+syn match ayaccOper "@\d\+"
+
+syn match ayaccKey "^[ \t]*%\(token\|type\|left\|right\|start\|ident\)\>"
+syn match ayaccKey "[ \t]%\(prec\|expect\|nonassoc\)\>"
+syn match ayaccKey "\$\(<[a-zA-Z_][a-zA-Z_0-9]*>\)\=[\$0-9]\+"
+syn keyword ayaccKeyActn yyerrok yyclearin
+
+syn match ayaccUnionStart "^%union" skipwhite skipnl nextgroup=ayaccUnion
+syn region ayaccUnion contained matchgroup=ayaccCurly start="{" matchgroup=ayaccCurly end="}" contains=@ayaccUnionGroup
+syn region ayaccUnionCurly contained matchgroup=ayaccCurly start="{" matchgroup=ayaccCurly end="}" contains=@ayaccUnionGroup
+syn match ayaccBrkt contained "[<>]"
+syn match ayaccType "<[a-zA-Z_][a-zA-Z0-9_]*>" contains=ayaccBrkt
+syn match ayaccDefinition "^[A-Za-z][A-Za-z0-9_]*[ \t]*:"
+
+" special Yacc separators
+syn match ayaccSectionSep "^[ \t]*%%"
+syn match ayaccSep "^[ \t]*%{"
+syn match ayaccSep "^[ \t]*%}"
+
+" I'd really like to highlight just the outer {}. Any suggestions???
+syn match ayaccCurlyError "[{}]"
+syn region ayaccAction matchgroup=ayaccCurly start="{" end="}" contains=ALLBUT,@ayaccActionGroup
+
+
+" 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
+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 :|
+hi def link Delimiter Type
+
+let b:current_syntax = "ayacc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=15
diff --git a/runtime/syntax/b.vim b/runtime/syntax/b.vim
new file mode 100644
index 0000000..01532be
--- /dev/null
+++ b/runtime/syntax/b.vim
@@ -0,0 +1,114 @@
+" Vim syntax file
+" Language: B (A Formal Method with refinement and mathematical proof)
+" Maintainer: Mathieu Clabaut <mathieu.clabaut@gmail.com>
+" Contributor: Csaba Hoch
+" LastChange: 8 Dec 2007
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+" A bunch of useful B keywords
+syn keyword bStatement MACHINE MODEL SEES OPERATIONS INCLUDES DEFINITIONS CONSTRAINTS CONSTANTS VARIABLES CONCRETE_CONSTANTS CONCRETE_VARIABLES ABSTRACT_CONSTANTS ABSTRACT_VARIABLES HIDDEN_CONSTANTS HIDDEN_VARIABLES ASSERT ASSERTIONS EXTENDS IMPLEMENTATION REFINEMENT IMPORTS USES INITIALISATION INVARIANT PROMOTES PROPERTIES REFINES SETS VALUES VARIANT VISIBLE_CONSTANTS VISIBLE_VARIABLES THEORY XLS THEOREMS LOCAL_OPERATIONS
+syn keyword bLabel CASE IN EITHER OR CHOICE DO OF
+syn keyword bConditional IF ELSE SELECT ELSIF THEN WHEN
+syn keyword bRepeat WHILE FOR
+syn keyword bOps bool card conc closure closure1 dom first fnc front not or id inter iseq iseq1 iterate last max min mod perm pred prj1 prj2 ran rel rev seq seq1 size skip succ tail union
+syn keyword bKeywords LET VAR BE IN BEGIN END POW POW1 FIN FIN1 PRE SIGMA STRING UNION IS ANY WHERE
+
+syn keyword bBoolean TRUE FALSE bfalse btrue
+syn keyword bConstant PI MAXINT MININT User_Pass PatchProver PatchProverH0 PatchProverB0 FLAT ARI DED SUB RES
+syn keyword bGuard binhyp band bnot bguard bsearch bflat bfresh bguardi bget bgethyp barith bgetresult bresult bgoal bmatch bmodr bnewv bnum btest bpattern bprintf bwritef bsubfrm bvrb blvar bcall bappend bclose
+
+syn keyword bLogic or not
+syn match bLogic "\(!\|#\|%\|&\|+->>\|+->\|-->>\|->>\|-->\|->\|/:\|/<:\|/<<:\|/=\|/\\\|/|\\\|::\|:\|;:\|<+\|<->\|<--\|<-\|<:\|<<:\|<<|\|<=>\|<|\|==\|=>\|>+>>\|>->\|>+>\|||\||->\)"
+syn match bNothing /:=/
+
+syn keyword cTodo contained TODO FIXME XXX
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match bSpecial contained "\\[0-7][0-7][0-7]\=\|\\."
+syn region bString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=bSpecial
+syn match bCharacter "'[^\\]'"
+syn match bSpecialCharacter "'\\.'"
+syn match bSpecialCharacter "'\\[0-7][0-7]'"
+syn match bSpecialCharacter "'\\[0-7][0-7][0-7]'"
+
+"catch errors caused by wrong parenthesis
+syn region bParen transparent start='(' end=')' contains=ALLBUT,bParenError,bIncluded,bSpecial,bTodo,bUserLabel,bBitField
+syn match bParenError ")"
+syn match bInParen contained "[{}]"
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match bNumber "\<[0-9]\+\>"
+"syn match bIdentifier "\<[a-z_][a-z0-9_]*\>"
+syn case match
+
+ syn region bComment start="/\*" end="\*/" contains=bTodo
+ syn match bComment "//.*" contains=bTodo
+syntax match bCommentError "\*/"
+
+syn keyword bType INT INTEGER BOOL NAT NATURAL NAT1 NATURAL1
+
+syn region bPreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=bComment,bString,bCharacter,bNumber,bCommentError
+syn region bIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match bIncluded contained "<[^>]*>"
+syn match bInclude "^\s*#\s*include\>\s*["<]" contains=bIncluded
+
+syn region bDefine start="^\s*#\s*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,bPreCondit,bIncluded,bInclude,bDefine,bInParen
+syn region bPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,bPreCondit,bIncluded,bInclude,bDefine,bInParen
+
+syn sync ccomment bComment minlines=10
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/baan.vim b/runtime/syntax/baan.vim
new file mode 100644
index 0000000..9a42a43
--- /dev/null
+++ b/runtime/syntax/baan.vim
@@ -0,0 +1,1917 @@
+" Vim syntax file"
+" Language: Baan
+" Maintainer: Erik Remmelzwaal (erik.remmelzwaal 0x40 ssaglobal.com)
+" Originally owned by: Erwin Smit / Her van de Vliert
+" Last change: v1.17 2006/04/26 10:40:18
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+"********************************** Lexical setting ***************************"
+syn case ignore
+setlocal iskeyword+=.
+"setlocal ignorecase "This is not a local yet ;-(
+" Identifier
+syn match baanIdentifier "\<\k\+\>"
+
+"************************************* 3GL ************************************"
+syn match baan3glpre "#ident\>"
+syn match baan3glpre "#include\>"
+syn region baan3glpre start="#define\>" end="^[^^|]"me=s-1 contains=baanString,baanConstant,baanNumber,baanComment,baansql
+syn match baan3glpre "#undef\>"
+syn match baan3glpre "#pragma\>"
+syn match baan3glpre "#if\>"
+syn match baan3glpre "#ifdef\>"
+syn match baan3glpre "#ifndef\>"
+syn match baan3glpre "#elif\>"
+syn match baan3glpre "#else\>"
+syn match baan3glpre "#endif\>"
+
+" Some keywords are only defined when no foldinat based break bset call continue default
+syn keyword baan3gl empty fixed ge global goto gt le lt mb
+syn keyword baan3gl multibyte ne ofr prompt repeat static step stop
+syn keyword baan3gl until void wherebind ref reference break continue
+syn keyword baan3gl and or to not in
+syn keyword baan3gl eq input end return at print
+syn keyword baanType domain double long string table boolean common
+syn keyword baanType bset void xmlNode
+syn keyword baanStorageClass dim base based extern global fixed MB const
+syn keyword baanConstant pi true false
+
+" Folding settings
+if exists("baan_fold") && baan_fold
+ syn region baanFunctionFold matchgroup=baan3gl start="^\z(\s*\)\<function\>" matchgroup=NONE end="^\z1}" transparent fold keepend
+else
+ syn keyword baan3gl function
+endif
+if exists("baan_fold") && baan_fold && exists("baan_fold_block") && baan_fold_block
+ syn region baanCondFold matchgroup=baanConditional start="^\z(\s*\)\(if\>\|else\>\)" end="^\z1endif\>" end="^\z1else\>"me=s-1 transparent fold keepend extend
+ syn region baanCondFold matchgroup=baanConditional start="^\z(\s*\)for\>" end="^\z1endfor\>" transparent fold keepend extend
+ syn region baanCondFold matchgroup=baanConditional start="^\z(\s*\)while\>" end="^\z1endwhile\>" transparent fold keepend extend
+ syn region baanDLLUsage matchgroup=baan3gl start="^\z(\s*\)dllusage\>" end="^\z1enddllusage\>" fold contains=baanNumber,baanConstant,baanType
+ syn region baanFunUsage matchgroup=baan3gl start="^\z(\s*\)functionusage\>" end="^\z1endfunctionusage\>" fold contains=baanNumber,baanConstant,baanType
+ syn region baanCondFold matchgroup=baanConditional start="^\z(\s*\)\(case\>\|default\>\)\>" end="^\z1endcase\>" end="^\z1\(case\>\|default\>\)"me=s-1 transparent fold keepend extend
+ syn keyword baanConditional then else endif while endwhile endfor case endcase
+ syn match baanConditional "\<on case\>"
+else
+ syn match baanConditional "\<for\>" contains=baansql
+ syn match baanConditional "\<on case\>"
+ syn keyword baanConditional if then else endif while endwhile endfor case endcase default
+ syn region baanDLLUsage matchgroup=baan3gl start="\<dllusage\>" end="\<enddllusage\>" contains=baanNumber,baanConstant,baanType
+ syn region baanFunUsage matchgroup=baan3gl start="\<functionusage\>" end="\<endfunctionusage\>" contains=baanNumber,baanConstant,baanType
+endif
+
+"************************************* SQL ************************************"
+syn keyword baansql from selectbind
+syn keyword baansql where wherebind whereused exsists
+syn keyword baansql between inrange having
+syn keyword baansql hint ordered asc desc
+syn match baansql "\<as set with \d\+ rows\>"
+syn match baansql "\<as prepared set\>"
+syn match baansql "\<as prepared set with \d\+ rows\>"
+syn match baansql "\<with retry\>"
+syn match baansql "\<with retry repeat last row\>"
+syn match baansql "\<for update\>"
+syn match baansql "\<order by\>"
+syn match baansql "\<group by\>"
+syn match baansql "\<union all\>"
+" references
+syn keyword path reference
+syn match baansql "\<refers to\>"
+syn match baansql "\<unref clear\>"
+syn match baansql "\<unref setunref\>"
+syn match baansql "\<unref clearunref\>"
+syn match baansql "\<unref skip\>"
+" hints
+syn keyword baansql hint and ordered asc desc
+syn match baansql "\<use index \d\+ on\>"
+syn match baansql "\<array fetching\>"
+syn match baansql "\<no array fetching\>"
+syn match baansql "\<array size \d\+\>"
+syn match baansql "\<all rows\>"
+syn match baansql "\<first rows\>"
+syn match baansql "\<buffer \d\+ rows\>"
+syn match baansql "\<no hints\>"
+" update
+syn keyword baansql set
+
+if exists("baan_fold") && baan_fold && exists("baan_fold_sql") && baan_fold_sql
+ syn region baanSQLFold matchgroup=baansql start="^\z(\s*\)\(select\>\|selectdo\>\|selectempty\>\|selecterror\>\|selecteos\>\)" end="^\z1endselect\>" end="^\z1\(selectdo\>\|selectempty\>\|selecterror\>\|selecteos\>\)"me=s-1 transparent fold keepend extend
+ "syn region baanSQLFold matchgroup=baansql start="^\z(\s*\)\(update\>\|updateempty\>\|updateerror\>\|selecteos\>\)" end="^\z1endupdate\>" end="^\z1\(updateempty\>\|updateerror\>\|selecteos\>\)"me=s-1 transparent fold keepend extend
+ syn region baanSQLFold matchgroup=baansql start="^\z(\s*\)\(update\>\|updateempty\>\|updateerror\>\)" end="^\z1endupdate\>" end="^\z1\(updateempty\>\|updateerror\>\)"me=s-1 transparent fold keepend extend
+ syn region baanSQLFold matchgroup=baansql start="^\z(\s*\)\(delete\s\+from\>\|deleteempty\>\|deleteerror\>\)" end="^\z1enddelete\>" end="^\z1\(deleteempty\>\|deleteerror\>\)"me=s-1 transparent fold keepend extend
+else
+ syn keyword baansql select selectdo selectempty selecterror selecteos endselect
+ " delete
+ syn match baansql "\<delete from\>"
+ syn keyword baansql deleteempty deleteerror deleteeos enddelete
+ " update
+ syn keyword baansql update updateempty updateerror updateeos endupdate
+endif
+
+setlocal foldmethod=syntax
+"syn sync fromstart
+syn sync minlines=100
+
+
+"These are bshell functions
+if exists("baan_obsolete")
+syn match baansql "commit\.transaction()"
+syn match baansql "abort\.transaction()"
+syn match baansql "db\.columns\.to\.record"
+syn match baansql "db\.record\.to\.columns"
+syn match baansql "db\.bind"
+syn match baansql "db\.change\.order"
+syn match baansql "db\.set\.to\.default"
+syn match baansql "DB\.RETRY"
+syn match baansql "db\.delayed\.lock"
+syn match baansql "db\.retry\.point()"
+syn match baansql "db\.retry\.hit()"
+syn match baansql "db\.return\.dupl"
+syn match baansql "db\.skip\.dupl"
+syn match baansql "db\.row\.length"
+endif
+
+" Constants
+syn keyword baanConstant __function__
+syn keyword baanConstant __object__
+syn keyword baanConstant __file__
+syn keyword baanConstant __line__
+
+syn keyword baanConstant ABORT.PROGRAM
+syn keyword baanConstant ADD.SET
+syn keyword baanConstant ALL_ENUMS_EXCEPT
+syn keyword baanConstant APPL.EXCL
+syn keyword baanConstant APPL.READ
+syn keyword baanConstant APPL.WAIT
+syn keyword baanConstant APPL.WIDE
+syn keyword baanConstant APPL.WRITE
+syn keyword baanConstant ASK.HELPINFO
+syn keyword baanConstant AUTG_PRINT
+syn keyword baanConstant AUTG_DISPLAY
+syn keyword baanConstant AUTG_MODIFY
+syn keyword baanConstant AUTG_INSERT
+syn keyword baanConstant AUTG_DELETE
+syn keyword baanConstant AUTG_ALL
+syn keyword baanConstant BMS
+syn keyword baanConstant CALCULATOR
+syn keyword baanConstant CALENDAR
+syn keyword baanConstant CHANGE.ORDER
+syn keyword baanConstant CMD.OPTIONS
+syn keyword baanConstant CMD.WHATS.THIS
+syn keyword baanConstant CMF.MESSAGE
+syn keyword baanConstant CMF.TASK
+syn keyword baanConstant CMF.APPOINTMENT
+syn match baanConstant "\<COMPANY\$"
+syn keyword baanConstant COMPNR
+syn keyword baanConstant CONT.PROCESS
+syn keyword baanConstant CREATE.JOB
+syn keyword baanConstant DALNOOBJSET
+syn keyword baanConstant DALNOMETHOD
+syn keyword baanConstant DALNOOBJSETID
+syn keyword baanConstant DALNOOBJECTID
+syn keyword baanConstant DALNOPROP
+syn keyword baanConstant DALNOLOCMODE
+syn keyword baanConstant DALNOGETPOS
+syn keyword baanConstant DALNOSETPERM
+syn keyword baanConstant DALNOOBJPERM
+syn keyword baanConstant DALDBERROR
+syn keyword baanConstant DALHOOKERROR
+syn keyword baanConstant DALNOQUERYID
+syn keyword baanConstant DAL_DESTROY
+syn keyword baanConstant DAL_FIND
+syn keyword baanConstant DAL_GET_CURR
+syn keyword baanConstant DAL_GET_FIRST
+syn keyword baanConstant DAL_GET_LAST
+syn keyword baanConstant DAL_GET_NEXT
+syn keyword baanConstant DAL_GET_PREV
+syn keyword baanConstant DAL_GET_SPECIFIED
+syn keyword baanConstant DAL_NEW
+syn keyword baanConstant DAL_UPDATE
+syn keyword baanConstant DB.ARRAY
+syn keyword baanConstant DB.BASED
+syn keyword baanConstant DB.BITSET
+syn keyword baanConstant DB.BYTE
+syn keyword baanConstant DB.CHECK.IGNORED.REF
+syn keyword baanConstant DB.CHILD
+syn keyword baanConstant DB.CLEAR.NO.ROLLBACK
+syn keyword baanConstant DB.CLEAR.WITH.ROLLBACK
+syn keyword baanConstant DB.COMBINED
+syn keyword baanConstant DB.DATE
+syn keyword baanConstant DB.DELAYED.LOCK
+syn keyword baanConstant DB.DOUBLE
+syn keyword baanConstant DB.ENUM
+syn keyword baanConstant DB.EXIT.ON.DUPL
+syn keyword baanConstant DB.EXIT.ON.NOREC
+syn keyword baanConstant DB.EXIT.ON.ROWCHANGED
+syn keyword baanConstant DB.FILLED
+syn keyword baanConstant DB.FIXED
+syn keyword baanConstant DB.FL.LOCK
+syn keyword baanConstant DB.FLOAT
+syn keyword baanConstant DB.IGNORE.ALL.REFS
+syn keyword baanConstant DB.INTEGER
+syn keyword baanConstant DB.IS.REF.TO
+syn keyword baanConstant DB.LOCK
+syn keyword baanConstant DB.LONG
+syn keyword baanConstant DB.MAIL
+syn keyword baanConstant DB.MULTIBYTE
+syn keyword baanConstant DB.NOT.ACTIV
+syn keyword baanConstant DB.PAR.IS.REF.TO
+syn keyword baanConstant DB.REF.CASCADE
+syn keyword baanConstant DB.REF.CHK.RUNTIME
+syn keyword baanConstant DB.REF.DELETE
+syn keyword baanConstant DB.REF.NOP
+syn keyword baanConstant DB.REF.NULLIFY
+syn keyword baanConstant DB.REF.RESTRICTED
+syn keyword baanConstant DB.REF.UPDATE
+syn keyword baanConstant DB.RETRY
+syn keyword baanConstant DB.RETURN.DUPL
+syn keyword baanConstant DB.RETURN.ERROR
+syn keyword baanConstant DB.RETURN.NOREC
+syn keyword baanConstant DB.RETURN.REF.EXISTS
+syn keyword baanConstant DB.RETURN.REF.NOT.EXISTS
+syn keyword baanConstant DB.RETURN.ROWCHANGED
+syn keyword baanConstant DB.RPOINT
+syn keyword baanConstant DB.SKIP.DUPL
+syn keyword baanConstant DB.SKIP.NOREC
+syn keyword baanConstant DB.SKIP.ROWCHANGED
+syn keyword baanConstant DB.STRING
+syn keyword baanConstant DB.TEXT
+syn keyword baanConstant DB.TIME
+syn keyword baanConstant DBG_BDB_ACTIONS
+syn keyword baanConstant DBG_BDB_DELAY_LOCK
+syn keyword baanConstant DBG_BDB_REFER
+syn keyword baanConstant DBG_BDB_SERVER_TYPE
+syn keyword baanConstant DBG_DATA_SIZE
+syn keyword baanConstant DBG_DEBUG_MESG
+syn keyword baanConstant DBG_DEBUG_TSS
+syn keyword baanConstant DBG_FILE
+syn keyword baanConstant DBG_FILEDEV
+syn keyword baanConstant DBG_FUN_DEBUG
+syn keyword baanConstant DBG_GET_PUT_VAR
+syn keyword baanConstant DBG_INSTR_DEBUG
+syn keyword baanConstant DBG_MUL_ACTION
+syn keyword baanConstant DBG_OBJ_SIZE
+syn keyword baanConstant DBG_PRINT_ENUMS
+syn keyword baanConstant DBG_REF_PATH
+syn keyword baanConstant DBG_RESOURCE_DBG
+syn keyword baanConstant DBG_SCHED_DEBUG
+syn keyword baanConstant DBG_SHOW_FLOW
+syn keyword baanConstant DBG_SHOW_TRACE
+syn keyword baanConstant DBG_SRDD_USAGE
+syn keyword baanConstant DEBUG
+syn keyword baanConstant DEF.FIND
+syn keyword baanConstant DISPLAY.SET
+syn keyword baanConstant DIS.RESTARTED
+syn keyword baanConstant DLL_OVERLOAD
+syn keyword baanConstant DLL_OVERLOAD_ALL
+syn keyword baanConstant DLL_SILENT_ERR
+syn keyword baanConstant DSTerminationCreateProcess
+syn keyword baanConstant DSTerminationCreateThread
+syn keyword baanConstant DSTerminationNormalExit
+syn keyword baanConstant DSTerminationOpenStderr
+syn keyword baanConstant DSTerminationOpenStdin
+syn keyword baanConstant DSTerminationOpenStdout
+syn keyword baanConstant DSTerminationSetDir
+syn keyword baanConstant DUPL.OCCUR
+syn keyword baanConstant E2BIG
+syn keyword baanConstant EABORT
+syn keyword baanConstant EACCES
+syn keyword baanConstant EAGAIN
+syn keyword baanConstant EAUDIT
+syn keyword baanConstant EBADADRS
+syn keyword baanConstant EBADARG
+syn keyword baanConstant EBADCOLL
+syn keyword baanConstant EBADCURSOR
+syn keyword baanConstant EBADF
+syn keyword baanConstant EBADFILE
+syn keyword baanConstant EBADFLD
+syn keyword baanConstant EBADKEY
+syn keyword baanConstant EBADLOG
+syn keyword baanConstant EBADMEM
+syn keyword baanConstant EBDBNOTON
+syn keyword baanConstant EBDBON
+syn keyword baanConstant EBUSY
+syn keyword baanConstant ECHILD
+syn keyword baanConstant EDDCORRUPT
+syn keyword baanConstant EDOM
+syn keyword baanConstant EDUPL
+syn keyword baanConstant EENDFILE
+syn keyword baanConstant EEXIST
+syn keyword baanConstant EFAULT
+syn keyword baanConstant EFBIG
+syn keyword baanConstant EFLOCKED
+syn keyword baanConstant EFNAME
+syn keyword baanConstant EINTR
+syn keyword baanConstant EINVAL
+syn keyword baanConstant EIO
+syn keyword baanConstant EISDIR
+syn keyword baanConstant EISREADONLY
+syn keyword baanConstant EKEXISTS
+syn keyword baanConstant ELOCKED
+syn keyword baanConstant ELOGOPEN
+syn keyword baanConstant ELOGREAD
+syn keyword baanConstant ELOGWRIT
+syn keyword baanConstant EMEMORY
+syn keyword baanConstant EMFILE
+syn keyword baanConstant EMLINK
+syn keyword baanConstant EMLOCKED
+syn keyword baanConstant END.PROGRAM
+syn keyword baanConstant ENFILE
+syn keyword baanConstant ENOBEGIN
+syn keyword baanConstant ENOCURR
+syn keyword baanConstant ENODD
+syn keyword baanConstant ENODELAYEDLOCK
+syn keyword baanConstant ENODEV
+syn keyword baanConstant ENOENT
+syn keyword baanConstant ENOEXEC
+syn keyword baanConstant ENOLOK
+syn keyword baanConstant ENOMEM
+syn keyword baanConstant ENONFS
+syn keyword baanConstant ENOREC
+syn keyword baanConstant ENOSERVER
+syn keyword baanConstant ENOSHMEM
+syn keyword baanConstant ENOSPC
+syn keyword baanConstant ENOTABLE
+syn keyword baanConstant ENOTBLK
+syn keyword baanConstant ENOTDIR
+syn keyword baanConstant ENOTEXCL
+syn keyword baanConstant ENOTINRANGE
+syn keyword baanConstant ENOTLOCKED
+syn keyword baanConstant ENOTOPEN
+syn keyword baanConstant ENOTRANS
+syn keyword baanConstant ENOTTY
+syn keyword baanConstant ENXIO
+syn keyword baanConstant ENUMMASK.INITIAL
+syn keyword baanConstant ENUMMASK.GENERAL
+syn keyword baanConstant EPERM
+syn keyword baanConstant EPIPE
+syn keyword baanConstant EPRIMKEY
+syn keyword baanConstant ERANGE
+syn keyword baanConstant EREFERENCE
+syn keyword baanConstant EREFEXISTS
+syn keyword baanConstant EREFLOCKED
+syn keyword baanConstant EREFNOTEXISTS
+syn keyword baanConstant EREFUNDEFINED
+syn keyword baanConstant EREFUPDATE
+syn keyword baanConstant EROFS
+syn keyword baanConstant EROWCHANGED
+syn keyword baanConstant ESPIPE
+syn keyword baanConstant ESQLCARDINALITYVIOLATION
+syn keyword baanConstant ESQLDIVBYZERO
+syn keyword baanConstant ESQLFILEIO
+syn keyword baanConstant ESQLINDEXOUTOFDIMS
+syn keyword baanConstant ESQLINVALIDPARAMETERTYPE
+syn keyword baanConstant ESQLQUERY
+syn keyword baanConstant ESQLREFER
+syn keyword baanConstant ESQLSTRINGTRUNCATION
+syn keyword baanConstant ESQLSUBSTRINGERROR
+syn keyword baanConstant ESQLSYNTAX
+syn keyword baanConstant ESRCH
+syn keyword baanConstant ETABLEEXIST
+syn keyword baanConstant ETOOMANY
+syn keyword baanConstant ETRANSACTIONON
+syn keyword baanConstant ETXTBSY
+syn keyword baanConstant EUNALLOWEDCOMPNR
+syn keyword baanConstant EVTALLEVENTMASK
+syn keyword baanConstant EVTARMBUTTON
+syn keyword baanConstant EVTARMBUTTONMASK
+syn keyword baanConstant EVTBUCKETMESSAGE
+syn keyword baanConstant EVTBUTTON1
+syn keyword baanConstant EVTBUTTON1MASK
+syn keyword baanConstant EVTBUTTON2
+syn keyword baanConstant EVTBUTTON2MASK
+syn keyword baanConstant EVTBUTTON3
+syn keyword baanConstant EVTBUTTON3MASK
+syn keyword baanConstant EVTBUTTON4
+syn keyword baanConstant EVTBUTTON4MASK
+syn keyword baanConstant EVTBUTTON5
+syn keyword baanConstant EVTBUTTON5MASK
+syn keyword baanConstant EVTBUTTONCHECKED
+syn keyword baanConstant EVTBUTTONDPRESS
+syn keyword baanConstant EVTBUTTONDPRESSMASK
+syn keyword baanConstant EVTBUTTONMOTION
+syn keyword baanConstant EVTBUTTONMOTIONMASK
+syn keyword baanConstant EVTBUTTONPRESS
+syn keyword baanConstant EVTBUTTONPRESSMASK
+syn keyword baanConstant EVTBUTTONRELEASE
+syn keyword baanConstant EVTBUTTONRELEASEMASK
+syn keyword baanConstant EVTBUTTONSELECT
+syn keyword baanConstant EVTBUTTONSELECTMASK
+syn keyword baanConstant EVTBUTTONUNCHECKED
+syn keyword baanConstant EVTBUTTONUNDEFINED
+syn keyword baanConstant EVTCHANGEFOCUS
+syn keyword baanConstant EVTCHANGEFOCUSMASK
+syn keyword baanConstant EVTCHANNELEVENT
+syn keyword baanConstant EVTCHECKBOXMASK
+syn keyword baanConstant EVTCHECKBOXSELECT
+syn keyword baanConstant EVTCLIENTMESSAGE
+syn keyword baanConstant EVTCONNECTREQUEST
+syn keyword baanConstant EVTCONTROLMASK
+syn keyword baanConstant EVTDEATHCHILD
+syn keyword baanConstant EVTDEATHCHILDMASK
+syn keyword baanConstant EVTDISARMBUTTON
+syn keyword baanConstant EVTDISARMBUTTONMASK
+syn keyword baanConstant EVTDLLEVENT
+syn keyword baanConstant EVTDLLEVENTMASK
+syn keyword baanConstant EVTENTERNOTIFY
+syn keyword baanConstant EVTENTERNOTIFYMASK
+syn keyword baanConstant EVTFIELDSELECT
+syn keyword baanConstant EVTFIELDSELECTMASK
+syn keyword baanConstant EVTGRIDACTIVATE
+syn keyword baanConstant EVTGRIDBUTTONPRESS
+syn keyword baanConstant EVTGRIDCHANGEDATA
+syn keyword baanConstant EVTGRIDCHANGEFOCUS
+syn keyword baanConstant EVTGRIDEVENT
+syn keyword baanConstant EVTGRIDEVENTMASK
+syn keyword baanConstant EVTGRIDFOCUSCHANGEDBYMOUSE
+syn keyword baanConstant EVTGRIDLISTBOXCHANGE
+syn keyword baanConstant EVTGRIDMARKCELL
+syn keyword baanConstant EVTGRIDMARKCOLUMN
+syn keyword baanConstant EVTGRIDMARKRANGE
+syn keyword baanConstant EVTGRIDMARKROW
+syn keyword baanConstant EVTGRIDMOVECOLUMN
+syn keyword baanConstant EVTGRIDMOVEROW
+syn keyword baanConstant EVTGRIDRESETSELECTION
+syn keyword baanConstant EVTGRIDRESIZECOLUMN
+syn keyword baanConstant EVTGRIDRESIZEROW
+syn keyword baanConstant EVTHELPCOMMAND
+syn keyword baanConstant EVTHELPCONTEXT
+syn keyword baanConstant EVTHELPEVENT
+syn keyword baanConstant EVTHELPEVENTMASK
+syn keyword baanConstant EVTIOEVENT
+syn keyword baanConstant EVTIOEVENTMASK
+syn keyword baanConstant EVTKEYPRESS
+syn keyword baanConstant EVTKEYPRESSMASK
+syn keyword baanConstant EVTKILLEVENT
+syn keyword baanConstant EVTLEAVENOTIFY
+syn keyword baanConstant EVTLEAVENOTIFYMASK
+syn keyword baanConstant EVTLISTBOXREASONACTIVATE
+syn keyword baanConstant EVTLISTBOXREASONSELECTION
+syn keyword baanConstant EVTLISTBOXREASONTEXT
+syn keyword baanConstant EVTLISTBOXSELECT
+syn keyword baanConstant EVTLISTBOXSELECTMASK
+syn keyword baanConstant EVTLOCKMASK
+syn keyword baanConstant EVTMAXSIZE
+syn keyword baanConstant EVTMENUSELECT
+syn keyword baanConstant EVTMENUSELECTMASK
+syn keyword baanConstant EVTMOD1MASK
+syn keyword baanConstant EVTMOVEWINDOW
+syn keyword baanConstant EVTMOVEWINDOWMASK
+syn keyword baanConstant EVTNAVIGATOREVENT
+syn keyword baanConstant EVTNAVIGATOREVENTMASK
+syn keyword baanConstant EVTNOEVENTMASK
+syn keyword baanConstant EVTOLEAUTOMATION
+syn keyword baanConstant EVTOLECLOSE
+syn keyword baanConstant EVTOLECREATEINSTANCE
+syn keyword baanConstant EVTOLEDATACHANGED
+syn keyword baanConstant EVTOLEEVENT
+syn keyword baanConstant EVTOLEEVENTMASK
+syn keyword baanConstant EVTOLEHIDEWINDOW
+syn keyword baanConstant EVTOLELOADDATA
+syn keyword baanConstant EVTOLELOCKSERVER
+syn keyword baanConstant EVTOLEOBJECTWINDOWINVISIBLE
+syn keyword baanConstant EVTOLEOBJECTWINDOWVISIBLE
+syn keyword baanConstant EVTOLERELEASED
+syn keyword baanConstant EVTOLESAVEDATA
+syn keyword baanConstant EVTOLESETHOSTNAMES
+syn keyword baanConstant EVTOLESHOWOBJECT
+syn keyword baanConstant EVTOLESHOWWINDOW
+syn keyword baanConstant EVTOLEUNLOCKSERVER
+syn keyword baanConstant EVTOPTIONSELECT
+syn keyword baanConstant EVTPROCESSEVENT
+syn keyword baanConstant EVTPUSHBUTTON
+syn keyword baanConstant EVTRADIOBOXMASK
+syn keyword baanConstant EVTRADIOBOXSELECT
+syn keyword baanConstant EVTRESIZEWINDOW
+syn keyword baanConstant EVTRESIZEWINDOWMASK
+syn keyword baanConstant EVTRUNPROGEXIT
+syn keyword baanConstant EVTSCROLLBARSELECT
+syn keyword baanConstant EVTSCROLLBARSELECTMASK
+syn keyword baanConstant EVTSETFOCUS
+syn keyword baanConstant EVTSETFOCUSMASK
+syn keyword baanConstant EVTSHIFTMASK
+syn keyword baanConstant EVTSLIDERSELECT
+syn keyword baanConstant EVTSLIDERSELECTMASK
+syn keyword baanConstant EVTSOCKHASDATA
+syn keyword baanConstant EVTSOCKIOERROR
+syn keyword baanConstant EVTTABSELECT
+syn keyword baanConstant EVTTABSELECTMASK
+syn keyword baanConstant EVTTERMINATION
+syn keyword baanConstant EVTTERMINATIONMASK
+syn keyword baanConstant EVTTIMEREVENT
+syn keyword baanConstant EVTTIMEREVENTMASK
+syn keyword baanConstant EVTTREEREASONACTIVATE
+syn keyword baanConstant EVTTREEREASONACTIVATEMASK
+syn keyword baanConstant EVTTREEREASONCOLLAPSE
+syn keyword baanConstant EVTTREEREASONCOLLAPSEMASK
+syn keyword baanConstant EVTTREEREASONEXPAND
+syn keyword baanConstant EVTTREEREASONEXPANDMASK
+syn keyword baanConstant EVTTREEREASONSELECT
+syn keyword baanConstant EVTTREEREASONSELECTMASK
+syn keyword baanConstant EVTTREESELECT
+syn keyword baanConstant EVTTREESELECTMASK
+syn keyword baanConstant EXDEV
+syn keyword baanConstant EXPLICIT.MODELESS
+syn keyword baanConstant EXTEND_APPEND
+syn keyword baanConstant EXTEND_OVERWRITE
+syn keyword baanConstant F.ASK.HELPINFO
+syn keyword baanConstant F.BACKTAB
+syn keyword baanConstant F.BMS
+syn keyword baanConstant F.HELP.INDEX
+syn keyword baanConstant F.NEXT.FLD
+syn keyword baanConstant F.NEXT.OBJ
+syn keyword baanConstant F.NEXT.OCC
+syn keyword baanConstant F.PREV.FLD
+syn keyword baanConstant F.PREV.OBJ
+syn keyword baanConstant F.PREV.OCC
+syn keyword baanConstant F.RESIZE
+syn keyword baanConstant F.RETURN
+syn keyword baanConstant F.SCROLL
+syn keyword baanConstant F.SELECT.FIELD
+syn keyword baanConstant F.SELECT.OPTION
+syn keyword baanConstant F.TAB
+syn keyword baanConstant F.TO.CHOICE
+syn keyword baanConstant F.TO.FIELD
+syn keyword baanConstant F.TO.FORM
+syn keyword baanConstant F.ZOOM
+syn keyword baanConstant FALSE
+syn keyword baanConstant FC.CURR.FIELD
+syn keyword baanConstant FC.FIRST.FIELD
+syn keyword baanConstant FC.FIRST.FORM
+syn keyword baanConstant FC.FRM.WINDOW
+syn keyword baanConstant FC.GET.HEIGHT.FORM
+syn keyword baanConstant FC.GET.SELECTED.FIELD
+syn keyword baanConstant FC.GET.SELECTED.OCC
+syn keyword baanConstant FC.GET.WIDTH.FORM
+syn keyword baanConstant FC.GOTO.FIELD
+syn keyword baanConstant FC.GOTO.FIRST.FLD
+syn keyword baanConstant FC.GOTO.FIRST.FORM
+syn keyword baanConstant FC.GOTO.FORM
+syn keyword baanConstant FC.GOTO.NEXT.FLD
+syn keyword baanConstant FC.GOTO.NEXT.FORM
+syn keyword baanConstant FC.GRA.WINDOW
+syn keyword baanConstant FC.KYS.WINDOW
+syn keyword baanConstant FC.LAST.FIELD
+syn keyword baanConstant FC.LAST.FORM
+syn keyword baanConstant FC.MAKE.FLD.CURR
+syn keyword baanConstant FC.MOVE.FORM
+syn keyword baanConstant FC.NEXT.FIELD
+syn keyword baanConstant FC.NEXT.FORM
+syn keyword baanConstant FC.OPT.WINDOW
+syn keyword baanConstant FC.PREV.FIELD
+syn keyword baanConstant FC.PREV.FORM
+syn keyword baanConstant FC.RESIZE.FORM
+syn keyword baanConstant FC.REST.FRM.ST
+syn keyword baanConstant FC.RPT.WINDOW
+syn keyword baanConstant FC.SAVE.FRM.ST
+syn keyword baanConstant FC.SAVE.SELECT
+syn keyword baanConstant FC.SEL.FIELD
+syn keyword baanConstant FC.SEL.FORM
+syn keyword baanConstant FC.SWITCH.ORDER.OFF
+syn keyword baanConstant FC.SWITCH.ORDER.ON
+syn keyword baanConstant FC.TEXT.MAIL.WINDOW
+syn keyword baanConstant FIND.DATA
+syn keyword baanConstant FIRST.FRM
+syn keyword baanConstant FIRST.SET
+syn keyword baanConstant FIRST.VIEW
+syn keyword baanConstant FLDCHANGED
+syn keyword baanConstant FLDKEYPRESS
+syn keyword baanConstant FORM.TAB.CHANGE
+syn keyword baanConstant GET.DEFAULTS
+syn keyword baanConstant GETS_ALL_CHARS
+syn keyword baanConstant GETS_NORMAL
+syn keyword baanConstant GETS_SKIP_ALL
+syn keyword baanConstant GLOBAL.COPY
+syn keyword baanConstant GLOBAL.DELETE
+syn keyword baanConstant HELP_ABOUT
+syn keyword baanConstant HELP_ARG_LEN
+syn keyword baanConstant HELP_BITMAP
+syn keyword baanConstant HELP_BLOCK
+syn keyword baanConstant HELP_CHOICE
+syn keyword baanConstant HELP_CLIENT_IMAGE_NOTLOADED
+syn keyword baanConstant HELP_CLIENT_IMAGE_READY
+syn keyword baanConstant HELP_CLIENT_NEW_ARGS
+syn keyword baanConstant HELP_CLIENT_NEW_INFO
+syn keyword baanConstant HELP_COMMANDS
+syn keyword baanConstant HELP_DOMAIN
+syn keyword baanConstant HELP_ENUM
+syn keyword baanConstant HELP_EXTERNAL
+syn keyword baanConstant HELP_FORM
+syn keyword baanConstant HELP_FORMFIELD
+syn keyword baanConstant HELP_FROM_INDEX
+syn keyword baanConstant HELP_GEM
+syn keyword baanConstant HELP_GIF
+syn keyword baanConstant HELP_GLOSSARY
+syn keyword baanConstant HELP_GOTO
+syn keyword baanConstant HELP_GOTOBLOCK
+syn keyword baanConstant HELP_GO_SYS_DEPENDANT
+syn keyword baanConstant HELP_HPGL
+syn keyword baanConstant HELP_IFUNCTION
+syn keyword baanConstant HELP_IFUNCTION2
+syn keyword baanConstant HELP_IFUNCTION3
+syn keyword baanConstant HELP_INDEX
+syn keyword baanConstant HELP_LABEL
+syn keyword baanConstant HELP_LABELHELP
+syn keyword baanConstant HELP_MARK
+syn keyword baanConstant HELP_MAXTYPE
+syn keyword baanConstant HELP_MAX_ARGS
+syn keyword baanConstant HELP_MAX_HIST
+syn keyword baanConstant HELP_MAX_IMAGE
+syn keyword baanConstant HELP_MENU
+syn keyword baanConstant HELP_MESSAGE
+syn keyword baanConstant HELP_ORGANIZER
+syn keyword baanConstant HELP_POPUP_TYPE
+syn keyword baanConstant HELP_POSTSCRIPT
+syn keyword baanConstant HELP_QUESTION
+syn keyword baanConstant HELP_REFERENCE
+syn keyword baanConstant HELP_RELATION
+syn keyword baanConstant HELP_RELATION2
+syn keyword baanConstant HELP_RELATION_DIAGRAM
+syn keyword baanConstant HELP_REPORT
+syn keyword baanConstant HELP_SESSION
+syn keyword baanConstant HELP_STARTSESSION
+syn keyword baanConstant HELP_STARTSHELL
+syn keyword baanConstant HELP_SUBFUNCTION
+syn keyword baanConstant HELP_SYSTEM_DEPENDANT
+syn keyword baanConstant HELP_TABLE
+syn keyword baanConstant HELP_TABLEFIELD
+syn keyword baanConstant HELP_USING
+syn keyword baanConstant HOOK_IS_APPLICABLE
+syn keyword baanConstant HOOK_IS_DERIVED
+syn keyword baanConstant HOOK_IS_MANDATORY
+syn keyword baanConstant HOOK_IS_READONLY
+syn keyword baanConstant HOOK_IS_VALID
+syn keyword baanConstant HOOK_UPDATE
+syn keyword baanConstant INCLUDE_ENUMS
+syn keyword baanConstant INTERRUPT
+syn keyword baanConstant LAST.FRM
+syn keyword baanConstant LAST.SET
+syn keyword baanConstant LAST.VIEW
+syn keyword baanConstant MARK.ABORT
+syn keyword baanConstant MARK.DELETE
+syn keyword baanConstant MARK.GOTO.NEXT
+syn keyword baanConstant MARK.GOTO.PREV
+syn keyword baanConstant MARK.OCCUR
+syn keyword baanConstant MARK.SHOW.OPT
+syn keyword baanConstant MARK.TAG
+syn keyword baanConstant MARK.TAG.ALL
+syn keyword baanConstant MARK.TO.CHOICE
+syn keyword baanConstant MARK.UNTAG
+syn keyword baanConstant MARK.UNTAG.ALL
+syn keyword baanConstant MARKONE.ACCEPT
+syn keyword baanConstant MSG.ALL
+syn keyword baanConstant MSG.ERROR
+syn keyword baanConstant MSG.INFO
+syn keyword baanConstant MSG.WARNING
+syn keyword baanConstant MSG.SUCCESS
+syn keyword baanConstant MODAL
+syn keyword baanConstant MODAL_OVERVIEW
+syn keyword baanConstant MODELESS
+syn keyword baanConstant MODELESS_ALWAYS
+syn keyword baanConstant MODIFY.SET
+syn keyword baanConstant MULTI_OCC
+syn keyword baanConstant NEXT.FRM
+syn keyword baanConstant NEXT.SET
+syn keyword baanConstant NEXT.VIEW
+syn keyword baanConstant NO.PERM.DEFINED
+syn keyword baanConstant NO.PERMISSION
+syn keyword baanConstant NO.RESTRICTION
+syn keyword baanConstant NO.ROLLBACK
+syn keyword baanConstant OLESVR.INIT
+syn keyword baanConstant OLESVR.OBJECT.CREATED
+syn keyword baanConstant OLESVR.OBJECT.DESTROYED
+syn keyword baanConstant OS_OS400
+syn keyword baanConstant OS_UNIX
+syn keyword baanConstant OS_WINDOWS_95
+syn keyword baanConstant OS_WINDOWS_NT
+syn keyword baanConstant PERM.DELETE
+syn keyword baanConstant PERM.MODIFY
+syn keyword baanConstant PERM.READ
+syn keyword baanConstant PERM.UNKNOWN
+syn keyword baanConstant PERM.WRITE
+syn keyword baanConstant PI
+syn keyword baanConstant PREV.FRM
+syn keyword baanConstant PREV.SET
+syn keyword baanConstant PREV.VIEW
+syn keyword baanConstant PRINT.DATA
+syn keyword baanConstant PROGRESS.BAR
+syn keyword baanConstant PROGRESS.CANCEL
+syn keyword baanConstant PROGRESS.NOAUTODESTROY
+syn keyword baanConstant PROGRESS.RESIZEABLE
+syn keyword baanConstant PROGRESS.STOP
+syn keyword baanConstant PROGRESS.TIMER
+syn keyword baanConstant PRTCL
+syn keyword baanConstant PRTCL.END.TRACE
+syn keyword baanConstant PRTCL.EXECUTE
+syn keyword baanConstant PRTCL.FIELD.OPTION
+syn keyword baanConstant PRTCL.GET.DATA
+syn keyword baanConstant PRTCL.GET.DATA.ANSWER
+syn keyword baanConstant PRTCL.MASK
+syn keyword baanConstant PRTCL.PUT.DATA
+syn keyword baanConstant PRTCL.START.TRACE
+syn keyword baanConstant PRTCL.UNKNOWN
+syn keyword baanConstant PSMAXSIZE
+syn keyword baanConstant QSS.EQLE
+syn keyword baanConstant QSS.EQUAL
+syn keyword baanConstant QSS.FIRST
+syn keyword baanConstant QSS.GT
+syn keyword baanConstant QSS.GTEQ
+syn keyword baanConstant QSS.LAST
+syn keyword baanConstant QSS.LESS
+syn keyword baanConstant QSS.LOOKUP.FOR.STRUCT
+syn keyword baanConstant QSS.NE
+syn keyword baanConstant QSS.SRC.DUPL.ALLOWED
+syn keyword baanConstant QSS.SRC.IS.SORTED
+syn keyword baanConstant RDI.CENTER
+syn keyword baanConstant RDI.LEFT
+syn keyword baanConstant RDI.LOWER
+syn keyword baanConstant RDI.NONE
+syn keyword baanConstant RDI.RIGHT
+syn keyword baanConstant RDI.UPPER
+syn keyword baanConstant RECOVER.SET
+syn keyword baanConstant RESIZE.FRM
+syn keyword baanConstant RESTART.INPUT
+syn keyword baanConstant ROTATE.CURR
+syn keyword baanConstant RP_IPCINFO_FLAG
+syn keyword baanConstant RP_INPROC
+syn keyword baanConstant RP_NOWAIT
+syn keyword baanConstant RP_NOWAIT_WITH_EVENT
+syn keyword baanConstant RP_WAIT
+syn keyword baanConstant RUN.JOB
+syn keyword baanConstant SAVE.DEFAULTS
+syn keyword baanConstant SBADJUST
+syn keyword baanConstant SBCONFIRM
+syn keyword baanConstant SBDOWN
+syn keyword baanConstant SBEND
+syn keyword baanConstant SBHOME
+syn keyword baanConstant SBMOVE
+syn keyword baanConstant SBPGDOWN
+syn keyword baanConstant SBPGUP
+syn keyword baanConstant SBPRESS
+syn keyword baanConstant SBRELEASE
+syn keyword baanConstant SBUP
+syn keyword baanConstant SEQ_F_R_LCK
+syn keyword baanConstant SEQ_F_W_LCK
+syn keyword baanConstant SEQ_R_LCK
+syn keyword baanConstant SEQ_W_LCK
+syn keyword baanConstant SESSION_NO_PERMISSION
+syn keyword baanConstant SESSION_DELETE_PERMISSION
+syn keyword baanConstant SESSION_INSERT_PERMISSION
+syn keyword baanConstant SESSION_MODIFY_PERMISSION
+syn keyword baanConstant SESSION_DISPLAY_PERMISSION
+syn keyword baanConstant SESSION_PRINT_PERMISSION
+syn keyword baanConstant SINGLE_OCC
+syn keyword baanConstant ST.ADD.SET
+syn keyword baanConstant ST.BITSET
+syn keyword baanConstant ST.BITSET.ZOOM
+syn keyword baanConstant ST.BRP.RUN
+syn keyword baanConstant ST.BRP.SEND
+syn keyword baanConstant ST.DEF.FIND
+syn keyword baanConstant ST.DOUBLE
+syn keyword baanConstant ST.DOUBLE.ZOOM
+syn keyword baanConstant ST.DUPL.OCCUR
+syn keyword baanConstant ST.ENUM
+syn keyword baanConstant ST.ENUM.ZOOM
+syn keyword baanConstant ST.FIND.DATA
+syn keyword baanConstant ST.FIRST.SET
+syn keyword baanConstant ST.LAST.SET
+syn keyword baanConstant ST.MARK.DELETE
+syn keyword baanConstant ST.MARK.OCCUR
+syn keyword baanConstant ST.MB
+syn keyword baanConstant ST.MB.ZOOM
+syn keyword baanConstant ST.MODIFY.SET
+syn keyword baanConstant ST.MULTI.2
+syn keyword baanConstant ST.MULTI.3
+syn keyword baanConstant ST.NUM.ZOOM
+syn keyword baanConstant ST.NUMERIC
+syn keyword baanConstant ST.PROG.BUSY
+syn keyword baanConstant ST.SINGLE.1
+syn keyword baanConstant ST.SINGLE.3
+syn keyword baanConstant ST.SINGLE.4
+syn keyword baanConstant ST.SORT
+syn keyword baanConstant ST.STRING
+syn keyword baanConstant ST.STRING.ZOOM
+syn keyword baanConstant ST.TEXT
+syn keyword baanConstant ST.TEXT.ZOOM
+syn keyword baanConstant ST.TIME
+syn keyword baanConstant ST.TIME.ZOOM
+syn keyword baanConstant ST.UPDATE.DB
+syn keyword baanConstant ST.ZOOM
+syn keyword baanConstant START.CHART
+syn keyword baanConstant START.QUERY
+syn keyword baanConstant START.SET
+syn keyword baanConstant STAT_EXECUTABLE
+syn keyword baanConstant STAT_READABLE
+syn keyword baanConstant STAT_WRITEABLE
+syn keyword baanConstant SUBDAL
+syn keyword baanConstant TDIR
+syn keyword baanConstant TEXT.MANAGER
+syn keyword baanConstant TFILE
+syn keyword baanConstant TRUE
+syn keyword baanConstant UPDATE.DB
+syn keyword baanConstant USER.0
+syn keyword baanConstant USER.1
+syn keyword baanConstant USER.2
+syn keyword baanConstant USER.3
+syn keyword baanConstant USER.4
+syn keyword baanConstant USER.5
+syn keyword baanConstant USER.6
+syn keyword baanConstant USER.7
+syn keyword baanConstant USER.8
+syn keyword baanConstant USER.9
+syn keyword baanConstant WINDOW.DIALOG
+syn keyword baanConstant WINDOW.LIST
+syn keyword baanConstant WINDOW.MMTCONTROLLER
+syn keyword baanConstant WINDOW.MMTSATELLITE
+syn keyword baanConstant WINDOW.MODAL.MENU
+syn keyword baanConstant WINDOW.MODELESS.MENU
+syn keyword baanConstant WINDOW.NONE
+syn keyword baanConstant WINDOW.PARAMETER
+syn keyword baanConstant WINDOW.SYNCHRONIZED
+syn keyword baanConstant WINDOW.WIZARD
+syn keyword baanConstant WITH.ROLLBACK
+syn keyword baanConstant WU.DLL
+syn keyword baanConstant WU.DOMA
+syn keyword baanConstant WU.FLDN
+syn keyword baanConstant WU.LANGOPT
+syn keyword baanConstant WU.MESS
+syn keyword baanConstant WU.QUES
+syn keyword baanConstant WU.SESS
+syn keyword baanConstant WU.TABL
+syn keyword baanConstant XML_DATA
+syn keyword baanConstant XML_DTD
+syn keyword baanConstant XML_ELEMENT
+syn keyword baanConstant XML_PI
+syn keyword baanConstant Z.AUTOACCEPT
+syn keyword baanConstant Z.AUTOZOOM
+syn keyword baanConstant Z.MENU
+syn keyword baanConstant Z.SESSION
+syn keyword baanConstant ZOOM
+
+
+"************************************* 4GL ************************************"
+" Program section
+syn match baan4glh "declaration:"
+syn match baan4glh "functions:"
+syn match baan4glh "before\.program:"
+syn match baan4glh "on\.error:"
+syn match baan4glh "after\.program:"
+syn match baan4glh "after\.update.db.commit:"
+syn match baan4glh "before\.display\.object:"
+
+" Form section
+syn match baan4glh "form\.\d\+:"
+syn match baan4glh "form\.all:"
+syn match baan4glh "form\.other:"
+syn match baan4gl "init\.form:"
+syn match baan4gl "before\.form:"
+syn match baan4gl "after\.form:"
+
+" Choice section
+syn match baan4glh "choice\.start\.set:"
+syn match baan4glh "choice\.first\.view:"
+syn match baan4glh "choice\.next\.view:"
+syn match baan4glh "choice\.prev\.view:"
+syn match baan4glh "choice\.last\.view:"
+syn match baan4glh "choice\.def\.find:"
+syn match baan4glh "choice\.find\.data:"
+syn match baan4glh "choice\.first\.set:"
+syn match baan4glh "choice\.next\.set:"
+syn match baan4glh "choice\.display\.set:"
+syn match baan4glh "choice\.prev\.set:"
+syn match baan4glh "choice\.rotate\.curr:"
+syn match baan4glh "choice\.last\.set:"
+syn match baan4glh "choice\.add\.set:"
+syn match baan4glh "choice\.update\.db:"
+syn match baan4glh "choice\.dupl\.occur:"
+syn match baan4glh "choice\.recover\.set:"
+syn match baan4glh "choice\.mark\.delete:"
+syn match baan4glh "choice\.mark\.occur:"
+syn match baan4glh "choice\.change\.order:"
+syn match baan4glh "choice\.modify\.set:"
+syn match baan4glh "choice\.restart\.input:"
+syn match baan4glh "choice\.print\.data:"
+syn match baan4glh "choice\.create\.job:"
+syn match baan4glh "choice\.form\.tab\.change:"
+syn match baan4glh "choice\.first\.frm:"
+syn match baan4glh "choice\.next\.frm:"
+syn match baan4glh "choice\.prev\.frm:"
+syn match baan4glh "choice\.last\.frm:"
+syn match baan4glh "choice\.resize\.frm:"
+syn match baan4glh "choice\.cmd\.options:"
+syn match baan4glh "choice\.zoom:"
+syn match baan4glh "choice\.interrupt:"
+syn match baan4glh "choice\.end\.program:"
+syn match baan4glh "choice\.abort\.program:"
+syn match baan4glh "choice\.cont\.process:"
+syn match baan4glh "choice\.text\.manager:"
+syn match baan4glh "choice\.run\.job:"
+syn match baan4glh "choice\.global\.delete:"
+syn match baan4glh "choice\.global\.copy:"
+syn match baan4glh "choice\.save\.defaults"
+syn match baan4glh "choice\.get\.defaults:"
+syn match baan4glh "choice\.start\.chart:"
+syn match baan4glh "choice\.start\.query:"
+syn match baan4glh "choice\.user\.\d:"
+syn match baan4glh "choice\.ask\.helpinfo:"
+syn match baan4glh "choice\.calculator:"
+syn match baan4glh "choice\.calendar:"
+syn match baan4glh "choice\.bms:"
+syn match baan4glh "choice\.cmd\.whats\.this:"
+syn match baan4glh "choice\.help\.index:"
+syn match baan4gl "before\.choice:"
+syn match baan4gl "on\.choice:"
+syn match baan4gl "after\.choice:"
+
+" Field section
+syn match baan4glh "field\.\l\{5}\d\{3}\.\l\{4,8}\.\=c\=:"
+syn match baan4glh "field\.e\..\+:"
+syn match baan4glh "field\.all:"
+syn match baan4glh "field\.other:"
+syn match baan4gl "init\.field:"
+syn match baan4gl "before\.field:"
+syn match baan4gl "before\.input:"
+syn match baan4gl "before\.display:"
+syn match baan4gl "selection\.filter:"
+syn match baan4gl "before\.zoom:"
+syn match baan4gl "before\.checks:"
+syn match baan4gl "domain\.error:"
+syn match baan4gl "ref\.input:"
+syn match baan4gl "ref\.display:"
+syn match baan4gl "check\.input:"
+syn match baan4gl "on\.input:"
+syn match baan4gl "when\.field\.changes:"
+syn match baan4gl "after\.zoom:"
+syn match baan4gl "after\.input:"
+syn match baan4gl "after\.display:"
+syn match baan4gl "after\.field:"
+
+" Group section
+syn match baan4glh "group\.\d\+:"
+syn match baan4gl "init\.group:"
+syn match baan4gl "before\.group:"
+syn match baan4gl "after\.group:"
+
+" Zoom section
+syn match baan4glh "zoom\.from\..\+:"
+syn match baan4gl "on\.entry:"
+syn match baan4gl "on\.exit:"
+
+" Main table section
+syn match baan4glh "main\.table\.io:"
+syn match baan4gl "before\.read:"
+syn match baan4gl "after\.read:"
+syn match baan4gl "before\.write:"
+syn match baan4gl "after\.write:"
+syn match baan4gl "after\.skip\.write:"
+syn match baan4gl "before\.rewrite:"
+syn match baan4gl "after\.rewrite:"
+syn match baan4gl "after\.skip\.rewrite:"
+syn match baan4gl "before\.delete:"
+syn match baan4gl "after\.delete:"
+syn match baan4gl "after\.skip\.delete:"
+syn match baan4gl "read\.view:"
+
+"**************************** Dal Hooks ********************************
+syn keyword baanDalHook after.abort.transaction after.commit.transaction after.destroy.object
+syn keyword baanDalHook after.change.object after.get.object after.new.object after.save.object before.change.object
+syn keyword baanDalHook before.destroy.object before.get.object before.new.object before.open.object.set before.save.object
+syn keyword baanDalHook method.is.allowed set.object.defaults
+
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\.check"
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\.is.valid"
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\.is.applicable"
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\.is.never.applicable"
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\.is.derived"
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\.is.readonly"
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\.is.mandatory"
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\.make.valid"
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\.update"
+syn match baanDalHook "\l\{5}\d\{3}\.\l\{4,8}\..*\.is.applicable"
+
+
+"number without a dot."
+syn match baanNumber "\<\-\=\d\+\>"
+"number with dot"
+syn match baanNumber "\<\-\=\d\+\.\d*\>"
+"number starting with a dot"
+syn match baanNumber "\<\-\=\.\d\+\>"
+
+" String Error does not work correct with vim 6.0
+syn match baanOpenStringError +^[^^"]+ display contained excludenl
+syn region baanString start=+"+ skip=+""+ end=+"+ end=+^[^^]+ contains=baanOpenStringError keepend
+
+" Comment"
+syn match baanComment "|$"
+syn match baanComment "|.$"
+syn match baanComment "|[^ ]"
+syn match baanComment "|[^#].*[^ ]"
+syn match baanCommenth "^|#lra.*$"
+syn match baanCommenth "^|#mdm.*$"
+syn match baanCommenth "^|#[0-9][0-9][0-9][0-9][0-9].*$"
+syn match baanCommenth "^|#N\=o\=Include.*$"
+" Oldcode"
+syn match baanUncommented "^|[^*#].*[^ ]"
+" DLL section
+" SpaceError"
+syn match baanSpaces " "
+syn match baanSpaceError "\s*$"
+syn match baanSpaceError " "
+
+" Baan error"
+
+if exists("baan_code_stds") && baan_code_stds
+syn match BaanError "^\s*i\..*=\s*\(\k\|\"\)*\s*$" "assignment of an input var"
+syn match BaanError "^\s*ref.*\s[ilse]\..*$" " ref variable defined with i, l, e and s"
+syn match BaanError "^\s*const.*\s[olse]\..*$" " const variable defined with o, l, e and s"
+syn match BaanError "^\s*static.*\s\(i\|g\|l\|o\|io\)\..*$" " static defined without s."
+syn match BaanError "^\s*\(domain\s\|long\s\|string\s\).*\so\.\k*[,)]" " ref variable without ref"
+syn match BaanError "^\s*\(domain\s\|long\s\|string\s\).*\se\.\k*[,)]" " 'e.' variable without extern"
+syn match BaanError "^\s*i\..*,\s*|\s*ref.*$" "
+endif
+
+"**************************** bshell functions ********************************
+syn match baanBshell "\<shiftl\$"
+syn match baanBshell "\<shiftr\$"
+syn match baanBshell "\<shiftc\$"
+syn match baanBshell "\<strip\$"
+syn match baanBshell "\<tolower\$"
+syn match baanBshell "\<toupper\$"
+syn keyword baanBshell isdigit
+syn keyword baanBshell isspace
+syn match baanBshell "\<chr\$"
+syn keyword baanBshell len.in.bytes
+syn keyword baanBshell rpos
+syn match baanBshell "\<sprintf\$"
+syn match baanBshell "\<vsprintf\$"
+syn match baanBshell "\<concat\$"
+syn keyword baanBshell gregdate
+syn match baanBshell "\<w.to.dat\$"
+syn keyword baanBshell ttyname
+syn match baanBshell "\<ttyname\$"
+syn match baanBshell "\<creat.tmp.file\$"
+syn match baanBshell "\<string.set\$"
+syn keyword baanBshell string.scan
+syn keyword baanBshell not.fixed
+syn keyword baanBshell dummy
+syn keyword baanBshell alloc.mem
+syn keyword baanBshell free.mem
+syn keyword baanBshell copy.mem
+syn keyword baanBshell cmp.mem
+syn keyword baanBshell set.mem
+syn keyword baanBshell num.to.date
+syn keyword baanBshell date.to.num
+syn keyword baanBshell num.to.week
+syn keyword baanBshell week.to.num
+syn match baanBshell "\<num.to.date\$"
+syn keyword baanBshell expr.compile
+syn keyword baanBshell l.expr
+syn keyword baanBshell d.expr
+syn match baanBshell "\<s.expr\$"
+syn keyword baanBshell expr.free
+syn keyword baanBshell compnr.check
+syn match baanBshell "\<bse.dir\$"
+syn match baanBshell "\<bse.tmp.dir\$"
+syn match baanBshell "\<bse.release\$"
+syn match baanBshell "\<bse.portset\$"
+syn match baanBshell "\<getenv\$"
+syn keyword baanBshell base.extern
+syn keyword baanBshell at.base
+syn keyword baanBshell get.compnr
+syn keyword baanBshell base.next
+syn keyword baanBshell get.argc
+syn keyword baanBshell get.long.arg
+syn keyword baanBshell get.double.arg
+syn keyword baanBshell get.string.arg
+syn keyword baanBshell get.arg.type
+syn keyword baanBshell put.long.arg
+syn keyword baanBshell put.double.arg
+syn keyword baanBshell put.string.arg
+syn keyword baanBshell setenv
+syn keyword baanBshell cmp.password
+syn match baanBshell "\<crypt.password\$"
+syn keyword baanBshell is.password.ok
+syn keyword baanBshell block.cipher.encrypt
+syn keyword baanBshell block.cipher.decrypt
+syn keyword baanBshell encrypt.user.password
+syn keyword baanBshell verify.user.password
+syn keyword baanBshell asm.put.instance.id
+syn match baanBshell "\<date.to.inputstr\$"
+syn keyword baanBshell inputstr.to.date
+syn match baanBshell "\<hostname\$"
+syn keyword baanBshell base64.encode
+syn keyword baanBshell base64.decode
+syn keyword baanBshell sha.create
+syn keyword baanBshell sha.initialize
+syn keyword baanBshell sha.add.data
+syn keyword baanBshell sha.compute.output
+syn keyword baanBshell sha.destroy
+syn match baanBshell "\<uuid.generate\$"
+syn match baanBshell "\<uuid.format\$"
+syn keyword baanBshell resolve.labels.by.lookupkey
+syn keyword baanBshell resolve.labels.by.codepair
+syn keyword baanBshell lookupkey.hash
+syn keyword baanBshell lookupkey.unhash
+syn match baanBshell "\<mb.long.to.str\$"
+syn keyword baanBshell mb.width
+syn match baanBshell "\<mb.localename\$"
+syn match baanBshell "\<mb.tss.clean\$"
+syn match baanBshell "\<mb.ext.clean\$"
+syn match baanBshell "\<mb.import\$"
+syn match baanBshell "\<mb.export\$"
+syn keyword baanBshell mb.import.raw
+syn keyword baanBshell mb.export.raw
+syn keyword baanBshell uni.import
+syn keyword baanBshell uni.export
+syn keyword baanBshell utf8.import
+syn keyword baanBshell utf8.export
+syn keyword baanBshell mb.strpos
+syn keyword baanBshell mb.scrpos
+syn keyword baanBshell mb.char
+syn keyword baanBshell mb.type
+syn match baanBshell "\<mb.cast\$"
+syn match baanBshell "\<mb.cast.to.str\$"
+syn keyword baanBshell mb.display
+syn keyword baanBshell mb.isbidi
+syn keyword baanBshell mb.isbidi.language
+syn match baanBshell "\<mb.rev\$"
+syn keyword baanBshell mb.hasbidi
+syn keyword baanBshell mb.kb.lang
+syn keyword baanBshell mb.locale.info
+syn keyword baanBshell mb.locale.enumerate
+syn keyword baanBshell mb.nsets
+syn keyword baanBshell mb.set.info
+syn keyword baanBshell mb.char.info
+syn keyword baanBshell key.compare
+syn keyword baanBshell set.fields.default
+syn keyword baanBshell table.round
+syn keyword baanBshell halfadj
+syn keyword baanBshell round
+syn keyword baanBshell format.round
+syn match baanBshell "\<edit\$"
+syn match baanBshell "\<str\$"
+syn keyword baanBshell lval
+syn keyword baanBshell acos
+syn keyword baanBshell asin
+syn keyword baanBshell atan
+syn keyword baanBshell atan2
+syn keyword baanBshell cosh
+syn keyword baanBshell sinh
+syn keyword baanBshell tanh
+syn keyword baanBshell log10
+syn keyword baanBshell sqrt
+syn keyword baanBshell lpow
+syn keyword baanBshell random
+syn keyword baanBshell srand
+syn keyword baanBshell rnd.init
+syn keyword baanBshell rnd.i
+syn keyword baanBshell rnd.d
+syn keyword baanBshell double.cmp
+syn match baanBshell "\<tab\$"
+syn keyword baanBshell aux.open
+syn keyword baanBshell aux.print
+syn keyword baanBshell aux.close
+syn keyword baanBshell refresh
+syn keyword baanBshell cl.screen
+syn match baanBshell "\<delch\$"
+syn match baanBshell "\<deleteln\$"
+syn match baanBshell "\<insch\$"
+syn match baanBshell "\<insertln\$"
+syn keyword baanBshell change.window
+syn keyword baanBshell data.input
+syn keyword baanBshell del.window
+syn keyword baanBshell frame.window
+syn keyword baanBshell new.window
+syn keyword baanBshell window.size
+syn keyword baanBshell move.window
+syn keyword baanBshell resize.window
+syn keyword baanBshell get.row
+syn keyword baanBshell get.col
+syn keyword baanBshell get.cp
+syn keyword baanBshell map.window
+syn keyword baanBshell unmap.window
+syn keyword baanBshell set.bg.color
+syn keyword baanBshell set.fg.color
+syn keyword baanBshell no.scroll
+syn keyword baanBshell scroll
+syn keyword baanBshell cursor.on
+syn keyword baanBshell cursor.off
+syn keyword baanBshell sub.window
+syn keyword baanBshell current.window
+syn match baanBshell "\<keyin\$"
+syn keyword baanBshell dump.screen
+syn keyword baanBshell first.window
+syn keyword baanBshell last.window
+syn keyword baanBshell free.window
+syn keyword baanBshell #input
+syn keyword baanBshell #output
+syn keyword baanBshell wrebuild
+syn keyword baanBshell select.event.input
+syn keyword baanBshell next.event
+syn keyword baanBshell peek.event
+syn keyword baanBshell pending.events
+syn keyword baanBshell send.event
+syn keyword baanBshell send.signal
+syn keyword baanBshell get.display.data
+syn keyword baanBshell open.display
+syn keyword baanBshell link.display
+syn keyword baanBshell link.keyboard
+syn keyword baanBshell unlink.keyboard
+syn keyword baanBshell close.display
+syn keyword baanBshell current.display
+syn keyword baanBshell change.display
+syn keyword baanBshell sync.display.server
+syn match baanBshell "\<get.class.name\$"
+syn keyword baanBshell create.mwindow
+syn keyword baanBshell current.mwindow
+syn keyword baanBshell change.mwindow
+syn keyword baanBshell set.mwindow.title
+syn keyword baanBshell set.mwindow.size
+syn keyword baanBshell set.mwindow.mode
+syn keyword baanBshell get.mwindow.mode
+syn keyword baanBshell destroy.mwindow
+syn keyword baanBshell dialog
+syn keyword baanBshell get.mwindow.size
+syn keyword baanBshell create.bar
+syn keyword baanBshell current.bar
+syn keyword baanBshell change.bar
+syn keyword baanBshell change.bar.attr
+syn keyword baanBshell destroy.bar
+syn keyword baanBshell create.bar.button
+syn keyword baanBshell change.bar.item.attr
+syn keyword baanBshell destroy.bar.item
+syn keyword baanBshell create.object
+syn keyword baanBshell change.object
+syn keyword baanBshell get.object
+syn keyword baanBshell query.object
+syn keyword baanBshell destroy.object
+syn keyword baanBshell get.event.attribute
+syn keyword baanBshell create.sub.object
+syn keyword baanBshell create.sub.object.by.id
+syn keyword baanBshell change.sub.object
+syn keyword baanBshell get.sub.object
+syn keyword baanBshell query.sub.object
+syn keyword baanBshell destroy.sub.object
+syn keyword baanBshell create.arglist
+syn keyword baanBshell add.arg
+syn keyword baanBshell add.ref.arg
+syn keyword baanBshell delete.arg
+syn keyword baanBshell print.arglist
+syn keyword baanBshell destroy.arglist
+syn keyword baanBshell get.object.class.list
+syn keyword baanBshell get.object.class
+syn keyword baanBshell get.sub.object.class
+syn keyword baanBshell get.resource.class
+syn keyword baanBshell get.event.class
+syn keyword baanBshell get.pixmap.info
+syn keyword baanBshell compress.pixmap
+syn keyword baanBshell decompress.pixmap
+syn keyword baanBshell get.window.attrs
+syn keyword baanBshell get.mwindow.attrs
+syn keyword baanBshell create.gc
+syn keyword baanBshell change.gc
+syn keyword baanBshell get.gc
+syn keyword baanBshell destroy.gc
+syn keyword baanBshell load.font
+syn keyword baanBshell query.font
+syn keyword baanBshell free.font
+syn keyword baanBshell get.typeface
+syn keyword baanBshell list.fonts
+syn keyword baanBshell text.extends
+syn keyword baanBshell inherit.object
+syn keyword baanBshell create.gtext
+syn keyword baanBshell create.line
+syn keyword baanBshell create.polyline
+syn keyword baanBshell create.polygon
+syn keyword baanBshell create.rectangle
+syn keyword baanBshell create.arc
+syn keyword baanBshell create.pie
+syn keyword baanBshell create.composite
+syn keyword baanBshell create.image
+syn keyword baanBshell change.gtext
+syn keyword baanBshell change.gtext.label
+syn keyword baanBshell change.line
+syn keyword baanBshell change.polyline
+syn keyword baanBshell change.polygon
+syn keyword baanBshell change.rectangle
+syn keyword baanBshell change.arc
+syn keyword baanBshell change.pie
+syn keyword baanBshell get.gtext
+syn keyword baanBshell get.gtext.label
+syn keyword baanBshell get.line
+syn keyword baanBshell get.polyline
+syn keyword baanBshell get.polygon
+syn keyword baanBshell get.rectangle
+syn keyword baanBshell get.arc
+syn keyword baanBshell get.pie
+syn keyword baanBshell get.composite
+syn keyword baanBshell get.image
+syn keyword baanBshell move.gpart
+syn keyword baanBshell shift.gpart
+syn keyword baanBshell which.gpart
+syn keyword baanBshell which.gparts
+syn keyword baanBshell change.gpart.gc
+syn keyword baanBshell get.gpart.gc
+syn keyword baanBshell destroy.gpart
+syn keyword baanBshell destroy.composite
+syn keyword baanBshell first.gpart
+syn keyword baanBshell last.gpart
+syn keyword baanBshell next.gpart
+syn keyword baanBshell prev.gpart
+syn keyword baanBshell change.gpart.attr
+syn keyword baanBshell get.gpart.attr
+syn keyword baanBshell get.gpart
+syn keyword baanBshell get.gpart.box
+syn keyword baanBshell resize.gpart.box
+syn keyword baanBshell move.gpart.box
+syn keyword baanBshell activate
+syn keyword baanBshell reactivate
+syn keyword baanBshell act.and.sleep
+syn keyword baanBshell sleep
+syn match baanBshell "\<receive.bucket\$"
+syn keyword baanBshell send.bucket
+syn keyword baanBshell send.wait
+syn keyword baanBshell bms.send
+syn match baanBshell "\<bms.receive\$"
+syn keyword baanBshell bms.receive.buffer
+syn keyword baanBshell bms.add.mask
+syn keyword baanBshell bms.delete.mask
+syn keyword baanBshell bms.init
+syn keyword baanBshell wait.and.activate
+syn keyword baanBshell abort
+syn keyword baanBshell kill
+syn keyword baanBshell shell
+syn match baanBshell "\<argv\$"
+syn keyword baanBshell argc
+syn keyword baanBshell get.var
+syn keyword baanBshell put.var
+syn keyword baanBshell get.ref.var
+syn keyword baanBshell put.ref.var
+syn keyword baanBshell get.indexed.var
+syn keyword baanBshell put.indexed.var
+syn keyword baanBshell on.change.check
+syn keyword baanBshell off.change.check
+syn keyword baanBshell changed
+syn keyword baanBshell not.curr
+syn keyword baanBshell handle.report.pool
+syn keyword baanBshell get.symbol
+syn keyword baanBshell suspend
+syn keyword baanBshell set.timer
+syn keyword baanBshell set.alarm
+syn keyword baanBshell kill.timer
+syn keyword baanBshell pstat
+syn keyword baanBshell oipstat
+syn keyword baanBshell obj_in_core
+syn keyword baanBshell renice
+syn keyword baanBshell kill.pgrp
+syn keyword baanBshell set.pgrp
+syn keyword baanBshell get.pgrp
+syn keyword baanBshell grab.mwindow
+syn keyword baanBshell signal
+syn keyword baanBshell ptrace
+syn keyword baanBshell link.on.stack
+syn match baanBshell "\<zoom.to\$"
+syn keyword baanBshell retry.point
+syn keyword baanBshell jump.retry.point
+syn keyword baanBshell retry.level
+syn keyword baanBshell get.bw.hostname
+syn keyword baanBshell exit
+syn match baanBshell "\<dte\$"
+syn keyword baanBshell times.on
+syn keyword baanBshell times.off
+syn keyword baanBshell times.close
+syn keyword baanBshell times.total
+syn keyword baanBshell times.lines
+syn keyword baanBshell date.num
+syn keyword baanBshell time.num
+syn keyword baanBshell date.time.utc
+syn keyword baanBshell utc.to.local
+syn keyword baanBshell local.to.utc
+syn keyword baanBshell input.field
+syn keyword baanBshell output.field
+syn keyword baanBshell key.to.option
+syn keyword baanBshell option.to.key
+syn keyword baanBshell get.choice.data
+syn keyword baanBshell reset.zoom.info
+syn keyword baanBshell next.field
+syn keyword baanBshell print.form
+syn keyword baanBshell set.field.blank
+syn keyword baanBshell read.form
+syn keyword baanBshell read.fast.form
+syn keyword baanBshell change.form.field
+syn keyword baanBshell copy.form.field
+syn keyword baanBshell delete.form.field
+syn keyword baanBshell iget.field.attr
+syn keyword baanBshell sget.field.attr
+syn keyword baanBshell menu.control
+syn keyword baanBshell wait
+syn match baanBshell "\<bms.peek\$"
+syn keyword baanBshell create.menu
+syn keyword baanBshell refresh.bar.menu
+syn keyword baanBshell load.menu
+syn keyword baanBshell current.menu
+syn keyword baanBshell change.menu
+syn keyword baanBshell popup.menu
+syn keyword baanBshell set.menu
+syn keyword baanBshell change.menu.attr
+syn keyword baanBshell destroy.menu
+syn keyword baanBshell create.menu.button
+syn keyword baanBshell create.cascade.button
+syn keyword baanBshell change.menu.item.name
+syn keyword baanBshell change.cascade.menu
+syn keyword baanBshell change.menu.item.attr
+syn keyword baanBshell get.cascade.menu
+syn keyword baanBshell destroy.menu.item
+syn keyword baanBshell form.control
+syn match baanBshell "\<form.text\$"
+syn keyword baanBshell status.on
+syn keyword baanBshell status.off
+syn keyword baanBshell status.mess
+syn keyword baanBshell status.field
+syn match baanBshell "\<enum.descr\$"
+syn keyword baanBshell mark.occurrence
+syn keyword baanBshell start.mark
+syn keyword baanBshell end.mark
+syn keyword baanBshell get.attrs
+syn keyword baanBshell put.attrs
+syn keyword baanBshell act.zoom
+syn keyword baanBshell init.first
+syn keyword baanBshell init.last
+syn keyword baanBshell init.next
+syn keyword baanBshell init.prev
+syn keyword baanBshell set.max
+syn keyword baanBshell set.min
+syn keyword baanBshell set.fmax
+syn keyword baanBshell set.fmin
+syn keyword baanBshell print.const
+syn keyword baanBshell is.option.on
+syn keyword baanBshell brp.build
+syn keyword baanBshell brp.field
+syn keyword baanBshell pathname
+syn keyword baanBshell file.stat
+syn keyword baanBshell file.cp
+syn keyword baanBshell file.mv
+syn keyword baanBshell file.rm
+syn keyword baanBshell file.chown
+syn keyword baanBshell file.chmod
+syn keyword baanBshell stat.info
+syn keyword baanBshell disk.info
+syn keyword baanBshell mkdir
+syn keyword baanBshell rmdir
+syn keyword baanBshell open.message
+syn keyword baanBshell send.message
+syn keyword baanBshell recv.message
+syn keyword baanBshell close.message
+syn keyword baanBshell store.byte
+syn keyword baanBshell store.short
+syn keyword baanBshell store.long
+syn keyword baanBshell store.float
+syn keyword baanBshell store.double
+syn keyword baanBshell load.byte
+syn keyword baanBshell load.short
+syn keyword baanBshell load.long
+syn keyword baanBshell load.float
+syn keyword baanBshell load.double
+syn keyword baanBshell bit.and
+syn keyword baanBshell bit.or
+syn keyword baanBshell bit.exor
+syn keyword baanBshell bit.inv
+syn keyword baanBshell bit.in
+syn keyword baanBshell bit.shiftl
+syn keyword baanBshell bit.shiftr
+syn keyword baanBshell check.domain
+syn keyword baanBshell check.all.domain
+syn keyword baanBshell seq.clearerr
+syn keyword baanBshell seq.eof
+syn keyword baanBshell seq.error
+syn keyword baanBshell seq.open
+syn keyword baanBshell seq.close
+syn keyword baanBshell seq.flush
+syn keyword baanBshell seq.rewind
+syn keyword baanBshell seq.tell
+syn keyword baanBshell seq.read
+syn keyword baanBshell seq.write
+syn match baanBshell "\<seq.getc\$"
+syn match baanBshell "\<seq.putc\$"
+syn match baanBshell "\<seq.ungetc\$"
+syn keyword baanBshell seq.skip
+syn keyword baanBshell seq.seek
+syn keyword baanBshell seq.gets
+syn keyword baanBshell seq.puts
+syn keyword baanBshell seq.unlink
+syn keyword baanBshell seq.spool.line
+syn keyword baanBshell seq.r.long
+syn keyword baanBshell seq.w.long
+syn keyword baanBshell seq.r.short
+syn keyword baanBshell seq.w.short
+syn keyword baanBshell seq.lock
+syn keyword baanBshell seq.unlock
+syn keyword baanBshell seq.islocked
+syn keyword baanBshell pipe.open
+syn keyword baanBshell pipe.close
+syn keyword baanBshell pipe.flush
+syn keyword baanBshell pipe.gets
+syn keyword baanBshell pipe.puts
+syn keyword baanBshell pipe.read
+syn keyword baanBshell pipe.write
+syn keyword baanBshell pipe.clearerr
+syn keyword baanBshell pipe.eof
+syn keyword baanBshell pipe.error
+syn keyword baanBshell sock.connect
+syn keyword baanBshell sock.listen
+syn keyword baanBshell sock.accept
+syn keyword baanBshell sock.recv
+syn keyword baanBshell sock.send
+syn keyword baanBshell sock.flush
+syn keyword baanBshell sock.close
+syn keyword baanBshell sock.inherit
+syn keyword baanBshell sock.clearerr
+syn keyword baanBshell sock.eof
+syn keyword baanBshell sock.error
+syn keyword baanBshell get.system.info
+syn keyword baanBshell get.db.count
+syn keyword baanBshell get.db.system.info
+syn keyword baanBshell path.is.absolute
+syn keyword baanBshell make.path.absolute
+syn keyword baanBshell fstat.info
+syn keyword baanBshell dir.open
+syn keyword baanBshell dir.open.tree
+syn keyword baanBshell dir.close
+syn keyword baanBshell dir.entry
+syn keyword baanBshell dir.rewind
+syn keyword baanBshell ims.clearerr
+syn keyword baanBshell ims.eof
+syn keyword baanBshell ims.error
+syn keyword baanBshell ims.close
+syn keyword baanBshell ims.flush
+syn keyword baanBshell ims.rewind
+syn keyword baanBshell ims.tell
+syn keyword baanBshell ims.read
+syn keyword baanBshell ims.write
+syn match baanBshell "\<ims.getc\$"
+syn match baanBshell "\<ims.putc\$"
+syn keyword baanBshell ims.skip
+syn keyword baanBshell ims.seek
+syn keyword baanBshell ims.gets
+syn keyword baanBshell ims.puts
+syn keyword baanBshell ims.spool.line
+syn keyword baanBshell ims.r.long
+syn keyword baanBshell ims.w.long
+syn keyword baanBshell ims.r.short
+syn keyword baanBshell ims.w.short
+syn keyword baanBshell ims.openfba
+syn keyword baanBshell ims.openvba
+syn keyword baanBshell ims.getproperties
+syn keyword baanBshell ims.setvbaproperties
+syn keyword baanBshell db.get.physical.compnr
+syn keyword baanBshell db.bind
+syn keyword baanBshell db.unbind
+syn keyword baanBshell db.error
+syn keyword baanBshell db.error.message
+syn keyword baanBshell db.detail.error
+syn keyword baanBshell db.first
+syn keyword baanBshell db.last
+syn keyword baanBshell db.next
+syn keyword baanBshell db.prev
+syn keyword baanBshell db.gt
+syn keyword baanBshell db.ge
+syn keyword baanBshell db.eq
+syn keyword baanBshell db.curr
+syn keyword baanBshell db.lt
+syn keyword baanBshell db.le
+syn keyword baanBshell db.delete
+syn keyword baanBshell db.insert
+syn keyword baanBshell db.update
+syn keyword baanBshell db.check.row.changed
+syn keyword baanBshell db.check.row.domains
+syn keyword baanBshell db.check.restricted
+syn keyword baanBshell db.ref.handle.mode
+syn keyword baanBshell db.set.to.default
+syn keyword baanBshell db.create.index
+syn keyword baanBshell db.drop.index
+syn keyword baanBshell db.change.order
+syn keyword baanBshell db.create.table
+syn keyword baanBshell db.clear.table
+syn keyword baanBshell db.drop.table
+syn keyword baanBshell db.lock.table
+syn keyword baanBshell db.table.begin.import
+syn keyword baanBshell db.table.end.import
+syn keyword baanBshell db.table.update.statistics
+syn keyword baanBshell db.indexinfo
+syn keyword baanBshell db.nr.indices
+syn keyword baanBshell db.nr.rows
+syn keyword baanBshell db.row.length
+syn keyword baanBshell db.transaction.is.on
+syn keyword baanBshell commit.transaction
+syn keyword baanBshell set.transaction.readonly
+syn keyword baanBshell abort.transaction
+syn keyword baanBshell db.record.to.columns
+syn keyword baanBshell db.columns.to.record
+syn keyword baanBshell db.schedule
+syn keyword baanBshell db.permission
+syn keyword baanBshell db.set.notransaction
+syn keyword baanBshell db.set.transaction
+syn keyword baanBshell db.set.child.transaction
+syn keyword baanBshell get.db.permission
+syn keyword baanBshell get.session.permission
+syn keyword baanBshell ams.control
+syn keyword baanBshell db.get.old.row
+syn keyword baanBshell db.max.retry
+syn keyword baanBshell sql.parse
+syn keyword baanBshell sql.select.bind
+syn keyword baanBshell sql.where.bind
+syn keyword baanBshell sql.bind.input
+syn keyword baanBshell sql.exec
+syn keyword baanBshell sql.fetch
+syn keyword baanBshell sql.break
+syn keyword baanBshell sql.close
+syn keyword baanBshell sql.error
+syn keyword baanBshell sql.set.rds.full
+syn keyword baanBshell rdi.table
+syn keyword baanBshell rdi.index
+syn keyword baanBshell rdi.column
+syn keyword baanBshell rdi.table.column
+syn keyword baanBshell rdi.reference
+syn keyword baanBshell rdi.column.combined
+syn keyword baanBshell rdi.domain
+syn keyword baanBshell rdi.domain.long
+syn keyword baanBshell rdi.domain.double
+syn keyword baanBshell rdi.domain.string
+syn keyword baanBshell rdi.domain.raw
+syn keyword baanBshell rdi.domain.enum
+syn keyword baanBshell rdi.domain.enum.value
+syn keyword baanBshell rdi.domain.combined
+syn keyword baanBshell rdi.session.info
+syn keyword baanBshell rdi.session.dlls
+syn keyword baanBshell rdi.ref.route
+syn keyword baanBshell rdi.session.subject.info
+syn keyword baanBshell rdi.session.subject
+syn keyword baanBshell rdi.session.key
+syn keyword baanBshell rdi.session.form
+syn keyword baanBshell rdi.session.textfield
+syn keyword baanBshell rdi.first.day.of.week
+syn match baanBshell "\<rdi.date.input.format\$"
+syn keyword baanBshell rdi.format.digits
+syn keyword baanBshell rdi.permission
+syn keyword baanBshell rdi.option.info
+syn keyword baanBshell rdi.option.short
+syn keyword baanBshell rdi.vrc.path
+syn keyword baanBshell rdi.audit.hosts
+syn keyword baanBshell rdi.table.sequence
+syn keyword baanBshell iget.fld.attr
+syn keyword baanBshell sget.fld.attr
+syn keyword baanBshell iget.frm.attr
+syn keyword baanBshell sget.frm.attr
+syn keyword baanBshell iput.fld.attr
+syn keyword baanBshell sput.fld.attr
+syn keyword baanBshell iput.frm.attr
+syn keyword baanBshell put.var.to.field
+syn keyword baanBshell get.var.from.field
+syn match baanBshell "\<rdi.etoc\$"
+syn keyword baanBshell rdi.ctoe
+syn keyword baanBshell get.cust.code
+syn keyword baanBshell get.lic.no
+syn keyword baanBshell get.cust.name
+syn keyword baanBshell get.mach.id
+syn keyword baanBshell fsum
+syn match baanBshell "\<get.resource\$"
+syn keyword baanBshell qss.sort
+syn keyword baanBshell qss.search
+syn keyword baanBshell load_dll
+syn keyword baanBshell exec_dll_function
+syn keyword baanBshell get_function
+syn keyword baanBshell exec_function
+syn keyword baanBshell parse_and_exec_function
+syn keyword baanBshell pty.open
+syn keyword baanBshell pty.close
+syn keyword baanBshell pty.read
+syn keyword baanBshell pty.write
+syn keyword baanBshell pty.winsize
+syn keyword baanBshell pty.winsize.ok
+syn keyword baanBshell pty.ok
+syn keyword baanBshell user.exists
+syn keyword baanBshell group.exists
+syn keyword baanBshell is.administrator
+syn keyword baanBshell mtime
+syn keyword baanBshell getcwd
+syn keyword baanBshell set.strip.mode
+syn keyword baanBshell set.symbol.strip.mode
+syn keyword baanBshell nullify.symbol
+syn keyword baanBshell bshell.pid
+syn keyword baanBshell create.new.symbol
+syn keyword baanBshell push.by.name
+syn keyword baanBshell array.info
+syn keyword baanBshell array.to.string
+syn keyword baanBshell many.to.string
+syn keyword baanBshell ostype
+syn keyword baanBshell utc.num
+syn keyword baanBshell set.time.zone
+syn keyword baanBshell get.time.zone
+syn keyword baanBshell run.prog
+syn keyword baanBshell run.baan.prog
+syn keyword baanBshell get.status.text
+syn keyword baanBshell dir.is.available
+syn keyword baanBshell dir.set.server
+syn keyword baanBshell dir.get.last.error
+syn keyword baanBshell dir.init.object
+syn keyword baanBshell dir.free.object
+syn keyword baanBshell dir.clear.object
+syn keyword baanBshell dir.create.object
+syn keyword baanBshell dir.get.object
+syn keyword baanBshell dir.remove.object
+syn keyword baanBshell dir.update.object
+syn keyword baanBshell dir.init.search
+syn keyword baanBshell dir.free.search
+syn keyword baanBshell dir.execute.search
+syn keyword baanBshell dir.abandon.search
+syn keyword baanBshell dir.get.first.row
+syn keyword baanBshell dir.get.next.row
+syn keyword baanBshell dir.get.prev.row
+syn keyword baanBshell dir.get.element.count
+syn keyword baanBshell dir.get.element.name
+syn keyword baanBshell dir.get.element.type
+syn keyword baanBshell dir.get.value.count
+syn keyword baanBshell dir.add.element
+syn keyword baanBshell dir.add.element.int
+syn keyword baanBshell dir.add.element.str
+syn keyword baanBshell dir.add.element.time
+syn keyword baanBshell dir.get.value.int
+syn keyword baanBshell dir.get.value.str
+syn keyword baanBshell dir.get.value.time
+syn keyword baanBshell dir.get.value.named.str
+syn keyword baanBshell dir.set.value.int
+syn keyword baanBshell dir.set.value.str
+syn keyword baanBshell dir.set.value.time
+syn keyword baanBshell dir.set.value.named.str
+syn keyword baanBshell dir.remove.element
+syn keyword baanBshell dir.find.element
+syn keyword baanBshell utc.add
+syn keyword baanBshell type.define
+syn keyword baanBshell type.free
+syn keyword baanBshell type.get.fieldnumber
+syn keyword baanBshell container.create
+syn keyword baanBshell container.clear
+syn keyword baanBshell container.resize
+syn keyword baanBshell container.set.nfields
+syn keyword baanBshell container.set.ifields
+syn keyword baanBshell container.set.fields
+syn keyword baanBshell container.get.nfields
+syn keyword baanBshell container.get.ifields
+syn keyword baanBshell container.get.fields
+syn keyword baanBshell container.actual.size
+syn keyword baanBshell container.get.actual.size
+syn keyword baanBshell container.set.actual.size
+syn keyword baanBshell container.size
+syn keyword baanBshell container.free
+syn keyword baanBshell xma.process_next_event
+syn keyword baanBshell xma.init_instance
+syn keyword baanBshell fini.service
+syn keyword baanBshell corba.boa.process_next_event
+syn keyword baanBshell corba.boa.set_impl
+syn keyword baanBshell corba.available
+syn keyword baanBshell corba.orb.string_to_object
+syn keyword baanBshell corba.orb.release
+syn keyword baanBshell corba.request.invoke
+syn keyword baanBshell corba.request.send
+syn keyword baanBshell corba.request.get_response
+syn keyword baanBshell corba.request.object
+syn keyword baanBshell corba.request.delete
+syn keyword baanBshell set.debug.cpu.opts
+syn keyword baanBshell get.debug.cpu.opts
+syn match baanBshell "\<bsh.mesg\$"
+syn keyword baanBshell toggle.cpu
+syn keyword baanBshell cpu.is.debug
+syn keyword baanBshell set.profprint
+syn keyword baanBshell art.init
+syn keyword baanBshell art.define.transaction.class
+syn keyword baanBshell art.begin.transaction
+syn keyword baanBshell art.update.transaction
+syn keyword baanBshell art.end.transaction
+syn keyword baanBshell java.new.queue
+syn keyword baanBshell java.destroy.queue
+syn keyword baanBshell java.install.listener
+syn keyword baanBshell java.uninstall.listener
+syn keyword baanBshell java.put.bucket
+syn keyword baanBshell java.get.bucket
+syn keyword baanBshell java.lookup.queue
+syn keyword baanBshell java.execute.static.method
+syn keyword baanBshell java.execute.static.method.sync
+syn keyword baanBshell java.execute.static.method.async
+syn keyword baanBshell xml.write
+syn keyword baanBshell xml.read
+syn keyword baanBshell xml.newnode
+syn keyword baanBshell xml.unlinknode
+syn keyword baanBshell xml.deletenode
+syn keyword baanBshell xml.appendchildnode
+syn keyword baanBshell xml.addnode
+syn keyword baanBshell xml.insertnode
+syn keyword baanBshell xml.duplicatenode
+syn keyword baanBshell xml.setnodeproperties
+syn keyword baanBshell xml.getnodeproperties
+syn keyword baanBshell xml.deletenodeproperties
+syn keyword baanBshell xml.findfirstnode
+syn keyword baanBshell xml.findnodes
+syn keyword baanBshell xml.findsetofsiblingnodes
+syn keyword baanBshell xmlcontainsvalidcharactersonly
+syn keyword baanBshell xmlwrite
+syn keyword baanBshell xmlwritepretty
+syn keyword baanBshell xmlwritetostring
+syn keyword baanBshell xmlwriteprettytostring
+syn keyword baanBshell xmlread
+syn keyword baanBshell xmlreadfromstring
+syn keyword baanBshell xmlnewnode
+syn keyword baanBshell xmlnewdataelement
+syn keyword baanBshell xmlrewritedataelement
+syn keyword baanBshell xmlgetdataelement
+syn keyword baanBshell xmlsetname
+syn keyword baanBshell xmlsetdata
+syn keyword baanBshell xmlsetattribute
+syn keyword baanBshell xmldeleteattribute
+syn keyword baanBshell xmlgetname
+syn keyword baanBshell xmlgetdata
+syn keyword baanBshell xmlgettype
+syn keyword baanBshell xmlgetparent
+syn keyword baanBshell xmlgetfirstchild
+syn keyword baanBshell xmlgetlastchild
+syn keyword baanBshell xmlgetrightsibling
+syn keyword baanBshell xmlgetleftsibling
+syn keyword baanBshell xmlgetnumattributes
+syn keyword baanBshell xmlgetnumsiblings
+syn keyword baanBshell xmlgetnumleftsiblings
+syn keyword baanBshell xmlgetnumrightsiblings
+syn keyword baanBshell xmlgetnumchilds
+syn keyword baanBshell xmlgetattribute
+syn keyword baanBshell xmlgetattributename
+syn keyword baanBshell xmldelete
+syn keyword baanBshell xmlunlink
+syn keyword baanBshell xmlinsert
+syn keyword baanBshell xmladd
+syn keyword baanBshell xmlappend
+syn keyword baanBshell xmlinsertinchilds
+syn keyword baanBshell xmlappendtochilds
+syn keyword baanBshell xmlduplicate
+syn keyword baanBshell xmlduplicateandinsert
+syn keyword baanBshell xmlduplicateandadd
+syn keyword baanBshell xmlduplicateandappend
+syn keyword baanBshell xmlduplicateandinsertinchilds
+syn keyword baanBshell xmlduplicateandappendtochilds
+syn keyword baanBshell xmlduplicatetoprocess
+syn keyword baanBshell xmlfindfirst
+syn keyword baanBshell xmlfindfirstmatch
+syn keyword baanBshell xmlfindmatch
+syn keyword baanBshell xmlfindnodes
+syn keyword baanBshell xmlfindsetofsiblingnodes
+syn keyword baanBshell xmlexecutesql
+syn keyword baanBshell xmlexecutedllmethod
+syn keyword baanBshell xmldllsignature
+syn keyword baanBshell xmlnodetosymbol
+syn keyword baanBshell xmlputstringtolog
+syn keyword baanBshell xmlgetlog
+syn keyword baanBshell xmlcleanuplog
+syn keyword baanBshell xmlinstallloglistener
+syn keyword baanBshell xmldeinstallloglistener
+syn keyword baanBshell xmlinitsql
+syn keyword baanBshell xmlrefreshsqlcache
+syn keyword baanBshell xmlstatisticssqlcache
+syn keyword baanBshell bclm.dump
+syn keyword baanBshell bclm.init
+syn keyword baanBshell bclm.requestlicense
+syn keyword baanBshell bclm.confirmlicense
+syn keyword baanBshell bclm.releaselicense
+syn keyword baanBshell bclm.customerdata
+syn keyword baanBshell bclm.enabledemoperiod
+syn keyword baanBshell bclm.productidlicensed
+syn keyword baanBshell bclm.set.desktop
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "baan"
+
+" vim: ts=8
diff --git a/runtime/syntax/bash.vim b/runtime/syntax/bash.vim
new file mode 100644
index 0000000..75ab999
--- /dev/null
+++ b/runtime/syntax/bash.vim
@@ -0,0 +1,20 @@
+" Vim syntax file
+" Language: bash
+" Maintainer: Bram
+" Last Change: 2019 Sep 27
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" The actual syntax is in sh.vim and controlled by buffer-local variables.
+unlet! b:is_sh
+unlet! b:is_kornshell
+let b:is_bash = 1
+
+runtime! syntax/sh.vim
+
+let b:current_syntax = 'bash'
+
+" vim: ts=8
diff --git a/runtime/syntax/basic.vim b/runtime/syntax/basic.vim
new file mode 100644
index 0000000..b6bf23a
--- /dev/null
+++ b/runtime/syntax/basic.vim
@@ -0,0 +1,380 @@
+" Vim syntax file
+" Language: BASIC (QuickBASIC 4.5)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Allan Kelly <allan@fruitloaf.co.uk>
+" Contributors: Thilo Six
+" Last Change: 2022 Jun 22
+
+" First version based on Micro$soft QBASIC circa 1989, as documented in
+" 'Learn BASIC Now' by Halvorson&Rygmyr. Microsoft Press 1989.
+"
+" Second version attempts to match Microsoft QuickBASIC 4.5 while keeping FreeBASIC
+" (-lang qb) and QB64 (excluding extensions) in mind. -- DJK
+
+" Prelude {{{1
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn iskeyword @,48-57,.,!,#,%,&,$
+syn case ignore
+
+" Whitespace Errors {{{1
+if exists("basic_space_errors")
+ if !exists("basic_no_trail_space_error")
+ syn match basicSpaceError display excludenl "\s\+$"
+ endif
+ if !exists("basic_no_tab_space_error")
+ syn match basicSpaceError display " \+\t"me=e-1
+ endif
+endif
+
+" Comment Errors {{{1
+if !exists("basic_no_comment_errors")
+ syn match basicCommentError "\<REM\>.*"
+endif
+
+" Not Top Cluster {{{1
+syn cluster basicNotTop contains=@basicLineIdentifier,basicDataString,basicDataSeparator,basicTodo
+
+" Statements {{{1
+
+syn cluster basicStatements contains=basicStatement,basicDataStatement,basicMetaRemStatement,basicPutStatement,basicRemStatement
+
+let s:statements =<< trim EOL " {{{2
+ beep
+ bload
+ bsave
+ call
+ calls
+ case
+ chain
+ chdir
+ circle
+ clear
+ close
+ cls
+ color
+ com
+ common
+ const
+ declare
+ def
+ def\s\+seg
+ defdbl
+ defint
+ deflng
+ defsng
+ defstr
+ dim
+ do
+ draw
+ elseif
+ end
+ end\s\+\%(def\|function\|if\|select\|sub\|type\)
+ environ
+ erase
+ error
+ exit\s\+\%(def\|do\|for\|function\|sub\)
+ field
+ files
+ for
+ function
+ get
+ gosub
+ goto
+ if
+ input
+ ioctl
+ key
+ kill
+ let
+ line
+ line\s\+input
+ locate
+ lock
+ loop
+ lprint
+ lset
+ mkdir
+ name
+ next
+ on
+ on\s\+error
+ on\s\+uevent
+ open
+ open\s\+com
+ option
+ out
+ paint
+ palette
+ palette\s\+using
+ pcopy
+ pen
+ pmap
+ poke
+ preset
+ print
+ pset
+ randomize
+ read
+ redim
+ reset
+ restore
+ resume
+ return
+ rmdir
+ rset
+ run
+ select\s\+case
+ shared
+ shell
+ sleep
+ sound
+ static
+ stop
+ strig
+ sub
+ swap
+ system
+ troff
+ tron
+ type
+ uevent
+ unlock
+ using
+ view
+ view\s\+print
+ wait
+ wend
+ while
+ width
+ window
+ write
+EOL
+" }}}
+
+for s in s:statements
+ exe 'syn match basicStatement "\<' .. s .. '\>" contained'
+endfor
+
+syn match basicStatement "\<\%(then\|else\)\>" nextgroup=@basicStatements skipwhite
+
+" DATA Statement
+syn match basicDataSeparator "," contained
+syn region basicDataStatement matchgroup=basicStatement start="\<data\>" matchgroup=basicStatementSeparator end=":\|$" contained contains=basicDataSeparator,basicDataString,basicNumber,basicFloat,basicString
+
+if !exists("basic_no_data_fold")
+ syn region basicMultilineData start="^\s*\<data\>.*\n\%(^\s*\<data\>\)\@=" end="^\s*\<data\>.*\n\%(^\s*\<data\>\)\@!" contains=basicDataStatement transparent fold keepend
+endif
+
+" PUT File I/O and Graphics statements - needs special handling for graphics
+" action verbs
+syn match basicPutAction "\<\%(pset\|preset\|and\|or\|xor\)\>" contained
+syn region basicPutStatement matchgroup=basicStatement start="\<put\>" matchgroup=basicStatementSeparator end=":\|$" contained contains=basicKeyword,basicPutAction,basicFilenumber
+
+" Keywords {{{1
+let s:keywords =<< trim EOL " {{{2
+ absolute
+ access
+ alias
+ append
+ as
+ base
+ binary
+ byval
+ cdecl
+ com
+ def
+ do
+ for
+ function
+ gosub
+ goto
+ input
+ int86old
+ int86xold
+ interrupt
+ interruptx
+ is
+ key
+ len
+ list
+ local
+ lock
+ lprint
+ next
+ off
+ on
+ output
+ pen
+ play
+ random
+ read
+ resume
+ screen
+ seg
+ shared
+ signal
+ static
+ step
+ stop
+ strig
+ sub
+ timer
+ to
+ until
+ using
+ while
+ write
+EOL
+" }}}
+
+for k in s:keywords
+ exe 'syn match basicKeyword "\<' .. k .. '\>"'
+endfor
+
+" Functions {{{1
+syn keyword basicFunction abs asc atn cdbl chr$ cint clng command$ cos csng
+syn keyword basicFunction csrlin cvd cvdmbf cvi cvl cvs cvsmbf environ$ eof
+syn keyword basicFunction erdev erdev$ erl err exp fileattr fix fre freefile
+syn keyword basicFunction hex$ inkey$ inp input$ instr int ioctl$ left$ lbound
+syn keyword basicFunction lcase$ len loc lof log lpos ltrim$ mkd$ mkdmbf$ mki$
+syn keyword basicFunction mkl$ mks$ mksmbf$ oct$ peek pen point pos right$ rnd
+syn keyword basicFunction rtrim$ sadd setmem sgn sin space$ spc sqr stick str$
+syn keyword basicFunction strig string$ tab tan ubound ucase$ val valptr
+syn keyword basicFunction valseg varptr varptr$ varseg
+
+" Functions and statements (same name) {{{1
+syn match basicStatement "\<\%(date\$\|mid\$\|play\|screen\|seek\|time\$\|timer\)\>" contained
+syn match basicFunction "\<\%(date\$\|mid\$\|play\|screen\|seek\|time\$\|timer\)\>"
+
+" Types {{{1
+syn keyword basicType integer long single double string any
+
+" Strings {{{1
+
+" Unquoted DATA strings - anything except [:,] and leading or trailing whitespace
+" Needs lower priority than numbers
+syn match basicDataString "[^[:space:],:]\+\%(\s\+[^[:space:],:]\+\)*" contained
+
+syn region basicString start=+"+ end=+"+ oneline
+
+" Booleans {{{1
+if exists("basic_booleans")
+ syn keyword basicBoolean true false
+endif
+
+" Numbers {{{1
+
+" Integers
+syn match basicNumber "-\=&o\=\o\+[%&]\=\>"
+syn match basicNumber "-\=&h\x\+[%&]\=\>"
+syn match basicNumber "-\=\<\d\+[%&]\=\>"
+
+" Floats
+syn match basicFloat "-\=\<\d\+\.\=\d*\%(\%([ed][+-]\=\d*\)\|[!#]\)\=\>"
+syn match basicFloat "-\=\<\.\d\+\%(\%([ed][+-]\=\d*\)\|[!#]\)\=\>"
+
+" Statement anchors {{{1
+syn match basicLineStart "^" nextgroup=@basicStatements,@basicLineIdentifier skipwhite
+syn match basicStatementSeparator ":" nextgroup=@basicStatements skipwhite
+
+" Line numbers and labels {{{1
+
+" QuickBASIC limits these to 65,529 and 40 chars respectively
+syn match basicLineNumber "\d\+" nextgroup=@basicStatements skipwhite contained
+syn match basicLineLabel "\a[[:alnum:]]*\ze\s*:" nextgroup=@basicStatements skipwhite contained
+
+syn cluster basicLineIdentifier contains=basicLineNumber,basicLineLabel
+
+" Line Continuation {{{1
+syn match basicLineContinuation "\s*\zs_\ze\s*$"
+
+" Type suffixes {{{1
+if exists("basic_type_suffixes")
+ syn match basicTypeSuffix "\a[[:alnum:].]*\zs[$%&!#]"
+endif
+
+" File numbers {{{1
+syn match basicFilenumber "#\d\+"
+syn match basicFilenumber "#\a[[:alnum:].]*[%&!#]\="
+
+" Operators {{{1
+if exists("basic_operators")
+ syn match basicArithmeticOperator "[-+*/\\^]"
+ syn match basicRelationalOperator "<>\|<=\|>=\|[><=]"
+endif
+syn match basicLogicalOperator "\<\%(not\|and\|or\|xor\|eqv\|imp\)\>"
+syn match basicArithmeticOperator "\<mod\>"
+
+" Metacommands {{{1
+" Note: No trailing word boundaries. Text may be freely mixed however there
+" must be only leading whitespace prior to the first metacommand
+syn match basicMetacommand "$INCLUDE\s*:\s*'[^']\+'" contained containedin=@basicMetaComments
+syn match basicMetacommand "$\%(DYNAMIC\|STATIC\)" contained containedin=@basicMetaComments
+
+" Comments {{{1
+syn keyword basicTodo TODO FIXME XXX NOTE contained
+
+syn region basicRemStatement matchgroup=basicStatement start="REM\>" end="$" contains=basicTodo,@Spell contained
+syn region basicComment start="'" end="$" contains=basicTodo,@Spell
+
+if !exists("basic_no_comment_fold")
+ syn region basicMultilineComment start="^\s*'.*\n\%(\s*'\)\@=" end="^\s*'.*\n\%(\s*'\)\@!" contains=@basicComments transparent fold keepend
+endif
+
+" Metacommands
+syn region basicMetaRemStatement matchgroup=basicStatement start="REM\>\s*\$\@=" end="$" contains=basicTodo contained
+syn region basicMetaComment start="'\s*\$\@=" end="$" contains=basicTodo
+
+syn cluster basicMetaComments contains=basicMetaComment,basicMetaRemStatement
+syn cluster basicComments contains=basicComment,basicMetaComment
+
+"syn sync ccomment basicComment
+
+" Default Highlighting {{{1
+hi def link basicArithmeticOperator basicOperator
+hi def link basicBoolean Boolean
+hi def link basicComment Comment
+hi def link basicCommentError Error
+hi def link basicDataString basicString
+hi def link basicFilenumber basicTypeSuffix " TODO: better group
+hi def link basicFloat Float
+hi def link basicFunction Function
+hi def link basicKeyword Keyword
+hi def link basicLineIdentifier LineNr
+hi def link basicLineContinuation Special
+hi def link basicLineLabel basicLineIdentifier
+hi def link basicLineNumber basicLineIdentifier
+hi def link basicLogicalOperator basicOperator
+hi def link basicMetacommand SpecialComment
+hi def link basicMetaComment Comment
+hi def link basicMetaRemStatement Comment
+hi def link basicNumber Number
+hi def link basicOperator Operator
+hi def link basicPutAction Keyword
+hi def link basicRelationalOperator basicOperator
+hi def link basicRemStatement Comment
+hi def link basicSpaceError Error
+hi def link basicStatementSeparator Special
+hi def link basicStatement Statement
+hi def link basicString String
+hi def link basicTodo Todo
+hi def link basicType Type
+hi def link basicTypeSuffix Special
+if exists("basic_legacy_syntax_groups")
+ hi def link basicTypeSpecifier Type
+ hi def link basicTypeSuffix basicTypeSpecifier
+endif
+
+" Postscript {{{1
+let b:current_syntax = "basic"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/syntax/bc.vim b/runtime/syntax/bc.vim
new file mode 100644
index 0000000..4cd9d63
--- /dev/null
+++ b/runtime/syntax/bc.vim
@@ -0,0 +1,66 @@
+" Vim syntax file
+" Language: bc - An arbitrary precision calculator language
+" Maintainer: Vladimir Scholtz <vlado@gjh.sk>
+" Last change: 2012 Jun 01
+" (Dominique Pelle added @Spell)
+" Available on: www.gjh.sk/~vlado/bc.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Keywords
+syn keyword bcKeyword if else while for break continue return limits halt quit
+syn keyword bcKeyword define
+syn keyword bcKeyword length read sqrt print
+
+" Variable
+syn keyword bcType auto
+
+" Constant
+syn keyword bcConstant scale ibase obase last
+syn keyword bcConstant BC_BASE_MAX BC_DIM_MAX BC_SCALE_MAX BC_STRING_MAX
+syn keyword bcConstant BC_ENV_ARGS BC_LINE_LENGTH
+
+" Any other stuff
+syn match bcIdentifier "[a-z_][a-z0-9_]*"
+
+" String
+ syn match bcString "\"[^"]*\"" contains=@Spell
+
+" Number
+syn match bcNumber "[0-9]\+"
+
+" Comment
+syn match bcComment "\#.*" contains=@Spell
+syn region bcComment start="/\*" end="\*/" contains=@Spell
+
+" Parent ()
+syn cluster bcAll contains=bcList,bcIdentifier,bcNumber,bcKeyword,bcType,bcConstant,bcString,bcParentError
+syn region bcList matchgroup=Delimiter start="(" skip="|.\{-}|" matchgroup=Delimiter end=")" contains=@bcAll
+syn region bcList matchgroup=Delimiter start="\[" skip="|.\{-}|" matchgroup=Delimiter end="\]" contains=@bcAll
+syn match bcParenError "]"
+syn match bcParenError ")"
+
+
+
+syn case match
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..cc1a337
--- /dev/null
+++ b/runtime/syntax/bdf.vim
@@ -0,0 +1,97 @@
+" Vim syntax file
+" Language: BDF font definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn region bdfFontDefinition transparent matchgroup=bdfKeyword
+ \ start='^STARTFONT\>' end='^ENDFONT\>'
+ \ contains=bdfComment,bdfFont,bdfSize,
+ \ bdfBoundingBox,bdfProperties,bdfChars,bdfChar
+
+syn match bdfNumber contained display
+ \ '\<\%(\x\+\|[+-]\=\d\+\%(\.\d\+\)*\)'
+
+syn keyword bdfTodo contained FIXME TODO XXX NOTE
+
+syn region bdfComment contained start='^COMMENT\>' end='$'
+ \ contains=bdfTodo,@Spell
+
+syn region bdfFont contained matchgroup=bdfKeyword
+ \ start='^FONT\>' end='$'
+
+syn region bdfSize contained transparent matchgroup=bdfKeyword
+ \ start='^SIZE\>' end='$' contains=bdfNumber
+
+syn region bdfBoundingBox contained transparent matchgroup=bdfKeyword
+ \ start='^FONTBOUNDINGBOX' end='$'
+ \ contains=bdfNumber
+
+syn region bdfProperties contained transparent matchgroup=bdfKeyword
+ \ start='^STARTPROPERTIES' end='^ENDPROPERTIES'
+ \ contains=bdfNumber,bdfString,bdfProperty,
+ \ bdfXProperty
+
+syn keyword bdfProperty contained FONT_ASCENT FONT_DESCENT DEFAULT_CHAR
+syn match bdfProperty contained '^\S\+'
+
+syn keyword bdfXProperty contained FONT_ASCENT FONT_DESCENT DEFAULT_CHAR
+ \ FONTNAME_REGISTRY FOUNDRY FAMILY_NAME
+ \ WEIGHT_NAME SLANT SETWIDTH_NAME PIXEL_SIZE
+ \ POINT_SIZE RESOLUTION_X RESOLUTION_Y SPACING
+ \ CHARSET_REGISTRY CHARSET_ENCODING COPYRIGHT
+ \ ADD_STYLE_NAME WEIGHT RESOLUTION X_HEIGHT
+ \ QUAD_WIDTH FONT AVERAGE_WIDTH
+
+syn region bdfString contained start=+"+ skip=+""+ end=+"+
+
+syn region bdfChars contained display transparent
+ \ matchgroup=bdfKeyword start='^CHARS' end='$'
+ \ contains=bdfNumber
+
+syn region bdfChar transparent matchgroup=bdfKeyword
+ \ start='^STARTCHAR' end='^ENDCHAR'
+ \ contains=bdfEncoding,bdfWidth,bdfAttributes,
+ \ bdfBitmap
+
+syn region bdfEncoding contained transparent matchgroup=bdfKeyword
+ \ start='^ENCODING' end='$' contains=bdfNumber
+
+syn region bdfWidth contained transparent matchgroup=bdfKeyword
+ \ start='^SWIDTH\|DWIDTH\|BBX' end='$'
+ \ contains=bdfNumber
+
+syn region bdfAttributes contained transparent matchgroup=bdfKeyword
+ \ start='^ATTRIBUTES' end='$'
+
+syn keyword bdfBitmap contained BITMAP
+
+if exists("bdf_minlines")
+ let b:bdf_minlines = bdf_minlines
+else
+ let b:bdf_minlines = 30
+endif
+exec "syn sync ccomment bdfChar minlines=" . b:bdf_minlines
+
+
+hi def link bdfKeyword Keyword
+hi def link bdfNumber Number
+hi def link bdfTodo Todo
+hi def link bdfComment Comment
+hi def link bdfFont String
+hi def link bdfProperty Identifier
+hi def link bdfXProperty Identifier
+hi def link bdfString String
+hi def link bdfChars Keyword
+hi def link bdfBitmap Keyword
+
+let b:current_syntax = "bdf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/bib.vim b/runtime/syntax/bib.vim
new file mode 100644
index 0000000..ac8dcda
--- /dev/null
+++ b/runtime/syntax/bib.vim
@@ -0,0 +1,121 @@
+" Vim syntax file
+" Language: BibTeX (bibliographic database format for (La)TeX)
+" Maintainer: Bernd Feige <Bernd.Feige@gmx.net>
+" Filenames: *.bib
+" Last Change: 2017 Sep 29
+
+" Thanks to those who pointed out problems with this file or supplied fixes!
+
+" Initialization
+" ==============
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Ignore case
+syn case ignore
+
+" Keywords
+" ========
+syn keyword bibType contained article book booklet conference inbook
+syn keyword bibType contained incollection inproceedings manual
+syn keyword bibType contained mastersthesis misc phdthesis
+syn keyword bibType contained proceedings techreport unpublished
+syn keyword bibType contained string preamble
+
+syn keyword bibEntryKw contained address annote author booktitle chapter
+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:
+" AMS mref http://www.ams.org/mref
+syn keyword bibNSEntryKw contained mrclass mrnumber mrreviewer fjournal coden
+
+" Clusters
+" ========
+syn cluster bibVarContents contains=bibUnescapedSpecial,bibBrace,bibParen,bibMath
+" This cluster is empty but things can be added externally:
+"syn cluster bibCommentContents
+
+" Matches
+" =======
+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,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:
+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
+" ===============
+syn sync match All grouphere bibEntry /^\s*@/
+syn sync maxlines=200
+syn sync minlines=50
+
+" Highlighting defaults
+" =====================
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/bindzone.vim b/runtime/syntax/bindzone.vim
new file mode 100644
index 0000000..bb790bb
--- /dev/null
+++ b/runtime/syntax/bindzone.vim
@@ -0,0 +1,97 @@
+" Vim syntax file
+" Language: BIND zone files (RFC 1035)
+" Maintainer: Julian Mehnle <julian@mehnle.net>
+" URL: http://www.mehnle.net/source/odds+ends/vim/syntax/
+" Last Change: Thu 2011-07-16 20:42:00 UTC
+"
+" Based on an earlier version by Вячеслав Горбанев (Slava Gorbanev), with
+" heavy modifications.
+"
+" $Id: bindzone.vim 12 2011-07-16 21:09:57Z julian $
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" Directives
+syn region zoneRRecord start=/^/ end=/$/ contains=zoneOwnerName,zoneSpecial,zoneTTL,zoneClass,zoneRRType,zoneComment,zoneUnknown
+
+syn match zoneDirective /^\$ORIGIN\s\+/ nextgroup=zoneOrigin,zoneUnknown
+syn match zoneDirective /^\$TTL\s\+/ nextgroup=zoneTTL,zoneUnknown
+syn match zoneDirective /^\$INCLUDE\s\+/ nextgroup=zoneText,zoneUnknown
+syn match zoneDirective /^\$GENERATE\s/
+
+syn match zoneUnknown contained /\S\+/
+
+syn match zoneOwnerName contained /^[^[:space:]!"#$%&'()*+,\/:;<=>?@[\]\^`{|}~]\+\(\s\|;\)\@=/ nextgroup=zoneTTL,zoneClass,zoneRRType skipwhite
+syn match zoneOrigin contained /[^[:space:]!"#$%&'()*+,\/:;<=>?@[\]\^`{|}~]\+\(\s\|;\|$\)\@=/
+syn match zoneDomain contained /[^[:space:]!"#$%&'()*+,\/:;<=>?@[\]\^`{|}~]\+\(\s\|;\|$\)\@=/
+
+syn match zoneSpecial contained /^[@*.]\s/
+syn match zoneTTL contained /\s\@<=\d[0-9WwDdHhMmSs]*\(\s\|$\)\@=/ nextgroup=zoneClass,zoneRRType skipwhite
+syn keyword zoneClass contained IN CHAOS CH HS HESIOD nextgroup=zoneRRType,zoneTTL skipwhite
+syn keyword zoneRRType contained A AAAA CERT CNAME DNAME DNSKEY DS HINFO LOC MX NAPTR NS NSEC NSEC3 NSEC3PARAM PTR RP RRSIG SSHFP SOA SPF SRV TLSA TXT nextgroup=zoneRData skipwhite
+syn match zoneRData contained /[^;]*/ contains=zoneDomain,zoneIPAddr,zoneIP6Addr,zoneText,zoneNumber,zoneParen,zoneUnknown
+
+syn match zoneIPAddr contained /\<[0-9]\{1,3}\(\.[0-9]\{1,3}\)\{,3}\>/
+
+" Plain IPv6 address IPv6-embedded-IPv4 address
+" 1111:2:3:4:5:6:7:8 1111:2:3:4:5:6:127.0.0.1
+syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{6}\(\x\{1,4}:\x\{1,4}\|\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/
+" ::[...:]8 ::[...:]127.0.0.1
+syn match zoneIP6Addr contained /\s\@<=::\(\(\x\{1,4}:\)\{,6}\x\{1,4}\|\(\x\{1,4}:\)\{,5}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/
+" 1111::[...:]8 1111::[...:]127.0.0.1
+syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{1}:\(\(\x\{1,4}:\)\{,5}\x\{1,4}\|\(\x\{1,4}:\)\{,4}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/
+" 1111:2::[...:]8 1111:2::[...:]127.0.0.1
+syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{2}:\(\(\x\{1,4}:\)\{,4}\x\{1,4}\|\(\x\{1,4}:\)\{,3}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/
+" 1111:2:3::[...:]8 1111:2:3::[...:]127.0.0.1
+syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{3}:\(\(\x\{1,4}:\)\{,3}\x\{1,4}\|\(\x\{1,4}:\)\{,2}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/
+" 1111:2:3:4::[...:]8 1111:2:3:4::[...:]127.0.0.1
+syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{4}:\(\(\x\{1,4}:\)\{,2}\x\{1,4}\|\(\x\{1,4}:\)\{,1}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/
+" 1111:2:3:4:5::[...:]8 1111:2:3:4:5::127.0.0.1
+syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{5}:\(\(\x\{1,4}:\)\{,1}\x\{1,4}\|\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\>/
+" 1111:2:3:4:5:6::8 -
+syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{6}:\x\{1,4}\>/
+" 1111[:...]:: -
+syn match zoneIP6Addr contained /\<\(\x\{1,4}:\)\{1,7}:\(\s\|;\|$\)\@=/
+
+syn match zoneText contained /"\([^"\\]\|\\.\)*"\(\s\|;\|$\)\@=/
+syn match zoneNumber contained /\<[0-9]\+\(\s\|;\|$\)\@=/
+syn match zoneSerial contained /\<[0-9]\{9,10}\(\s\|;\|$\)\@=/
+
+syn match zoneErrParen /)/
+syn region zoneParen contained start="(" end=")" contains=zoneSerial,zoneTTL,zoneNumber,zoneComment
+syn match zoneComment /;.*/
+
+" Define the default highlighting.
+" 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"
+
+" vim:sts=2 sw=2
diff --git a/runtime/syntax/bitbake.vim b/runtime/syntax/bitbake.vim
new file mode 100644
index 0000000..30f3447
--- /dev/null
+++ b/runtime/syntax/bitbake.vim
@@ -0,0 +1,126 @@
+" Vim syntax file
+" Language: BitBake bb/bbclasses/inc
+" Author: Chris Larson <kergoth@handhelds.org>
+" Ricardo Salveti <rsalveti@rsalveti.net>
+" Copyright: Copyright (C) 2004 Chris Larson <kergoth@handhelds.org>
+" Copyright (C) 2008 Ricardo Salveti <rsalveti@rsalveti.net>
+"
+" This file is licensed under the MIT license, see COPYING.MIT in
+" this source distribution for the terms.
+"
+" Syntax highlighting for bb, bbclasses and inc files.
+"
+" It's an entirely new type, just has specific syntax in shell and python code
+
+if v:version < 600
+ finish
+endif
+if exists("b:current_syntax")
+ finish
+endif
+
+syn include @python syntax/python.vim
+unlet! b:current_syntax
+
+" BitBake syntax
+
+" Matching case
+syn case match
+
+" Indicates the error when nothing is matched
+syn match bbUnmatched "."
+
+" Comments
+syn cluster bbCommentGroup contains=bbTodo,@Spell
+syn keyword bbTodo COMBAK FIXME TODO XXX contained
+syn match bbComment "#.*$" contains=@bbCommentGroup
+
+" String helpers
+syn match bbQuote +['"]+ contained
+syn match bbDelimiter "[(){}=]" contained
+syn match bbArrayBrackets "[\[\]]" contained
+
+" BitBake strings
+syn match bbContinue "\\$"
+syn region bbString matchgroup=bbQuote start=+"+ skip=+\\$+ end=+"+ contained contains=bbTodo,bbContinue,bbVarDeref,bbVarPyValue,@Spell
+syn region bbString matchgroup=bbQuote start=+'+ skip=+\\$+ end=+'+ contained contains=bbTodo,bbContinue,bbVarDeref,bbVarPyValue,@Spell
+
+" Vars definition
+syn match bbExport "^export" nextgroup=bbIdentifier skipwhite
+syn keyword bbExportFlag export contained nextgroup=bbIdentifier skipwhite
+syn match bbIdentifier "[a-zA-Z0-9\-_\.\/\+]\+" display contained
+syn match bbVarDeref "${[a-zA-Z0-9\-_:\.\/\+]\+}" contained
+syn match bbVarEq "\(:=\|+=\|=+\|\.=\|=\.\|?=\|??=\|=\)" contained nextgroup=bbVarValue
+syn match bbVarDef "^\(export\s*\)\?\([a-zA-Z0-9\-_\.\/\+][${}a-zA-Z0-9\-_:\.\/\+]*\)\s*\(:=\|+=\|=+\|\.=\|=\.\|?=\|??=\|=\)\@=" contains=bbExportFlag,bbIdentifier,bbOverrideOperator,bbVarDeref nextgroup=bbVarEq
+syn match bbVarValue ".*$" contained contains=bbString,bbVarDeref,bbVarPyValue
+syn region bbVarPyValue start=+${@+ skip=+\\$+ end=+}+ contained contains=@python
+
+" Vars metadata flags
+syn match bbVarFlagDef "^\([a-zA-Z0-9\-_\.]\+\)\(\[[a-zA-Z0-9\-_\.+]\+\]\)\@=" contains=bbIdentifier nextgroup=bbVarFlagFlag
+syn region bbVarFlagFlag matchgroup=bbArrayBrackets start="\[" end="\]\s*\(:=\|=\|.=\|=.|+=\|=+\|?=\)\@=" contained contains=bbIdentifier nextgroup=bbVarEq
+
+" Includes and requires
+syn keyword bbInclude inherit include require contained
+syn match bbIncludeRest ".*$" contained contains=bbString,bbVarDeref
+syn match bbIncludeLine "^\(inherit\|include\|require\)\s\+" contains=bbInclude nextgroup=bbIncludeRest
+
+" Add taks and similar
+syn keyword bbStatement addtask deltask addhandler after before EXPORT_FUNCTIONS contained
+syn match bbStatementRest ".*$" skipwhite contained contains=bbStatement
+syn match bbStatementLine "^\(addtask\|deltask\|addhandler\|after\|before\|EXPORT_FUNCTIONS\)\s\+" contains=bbStatement nextgroup=bbStatementRest
+
+" OE Important Functions
+syn keyword bbOEFunctions do_fetch do_unpack do_patch do_configure do_compile do_stage do_install do_package contained
+
+" Generic Functions
+syn match bbFunction "\h[0-9A-Za-z_\-\.]*" display contained contains=bbOEFunctions
+
+syn keyword bbOverrideOperator append prepend remove contained
+
+" BitBake shell metadata
+syn include @shell syntax/sh.vim
+unlet! b:current_syntax
+
+syn keyword bbShFakeRootFlag fakeroot contained
+syn match bbShFuncDef "^\(fakeroot\s*\)\?\([\.0-9A-Za-z_:${}\-\.]\+\)\(python\)\@<!\(\s*()\s*\)\({\)\@=" contains=bbShFakeRootFlag,bbFunction,bbOverrideOperator,bbVarDeref,bbDelimiter nextgroup=bbShFuncRegion skipwhite
+syn region bbShFuncRegion matchgroup=bbDelimiter start="{\s*$" end="^}\s*$" contained contains=@shell
+
+" Python value inside shell functions
+syn region shDeref start=+${@+ skip=+\\$+ excludenl end=+}+ contained contains=@python
+
+" BitBake python metadata
+syn keyword bbPyFlag python contained
+syn match bbPyFuncDef "^\(fakeroot\s*\)\?\(python\)\(\s\+[0-9A-Za-z_:${}\-\.]\+\)\?\(\s*()\s*\)\({\)\@=" contains=bbShFakeRootFlag,bbPyFlag,bbFunction,bbOverrideOperator,bbVarDeref,bbDelimiter nextgroup=bbPyFuncRegion skipwhite
+syn region bbPyFuncRegion matchgroup=bbDelimiter start="{\s*$" end="^}\s*$" contained contains=@python
+
+" BitBake 'def'd python functions
+syn keyword bbPyDef def contained
+syn region bbPyDefRegion start='^\(def\s\+\)\([0-9A-Za-z_-]\+\)\(\s*(.*)\s*\):\s*$' end='^\(\s\|$\)\@!' contains=@python
+
+" Highlighting Definitions
+hi def link bbUnmatched Error
+hi def link bbInclude Include
+hi def link bbTodo Todo
+hi def link bbComment Comment
+hi def link bbQuote String
+hi def link bbString String
+hi def link bbDelimiter Keyword
+hi def link bbArrayBrackets Statement
+hi def link bbContinue Special
+hi def link bbExport Type
+hi def link bbExportFlag Type
+hi def link bbIdentifier Identifier
+hi def link bbVarDeref PreProc
+hi def link bbVarDef Identifier
+hi def link bbVarValue String
+hi def link bbShFakeRootFlag Type
+hi def link bbFunction Function
+hi def link bbPyFlag Type
+hi def link bbPyDef Statement
+hi def link bbStatement Statement
+hi def link bbStatementRest Identifier
+hi def link bbOEFunctions Special
+hi def link bbVarPyValue PreProc
+hi def link bbOverrideOperator Operator
+
+let b:current_syntax = "bitbake"
diff --git a/runtime/syntax/blank.vim b/runtime/syntax/blank.vim
new file mode 100644
index 0000000..6d2e3fd
--- /dev/null
+++ b/runtime/syntax/blank.vim
@@ -0,0 +1,39 @@
+" Vim syntax file
+" Language: Blank 1.4.1
+" Maintainer: Rafal M. Sulejman <unefunge@friko2.onet.pl>
+" Last change: 2011 Dec 28 by Thilo Six
+
+" 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
+
+" Blank instructions
+syn match blankInstruction "{[:;,\.+\-*$#@/\\`'"!\|><{}\[\]()?xspo\^&\~=_%]}"
+
+" Common strings
+syn match blankString "\~[^}]"
+
+" Numbers
+syn match blankNumber "\[[0-9]\+\]"
+
+syn case match
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/bsdl.vim b/runtime/syntax/bsdl.vim
new file mode 100644
index 0000000..75c6955
--- /dev/null
+++ b/runtime/syntax/bsdl.vim
@@ -0,0 +1,17 @@
+" Vim syntax file
+" Language: Boundary Scan Description Language (BSDL)
+" Maintainer: Daniel Kho <daniel.kho@logik.haus>
+" Last Changed: 2020 Mar 19 by Daniel Kho
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read in VHDL syntax files
+runtime! syntax/vhdl.vim
+unlet b:current_syntax
+
+let b:current_syntax = "bsdl"
+
+" vim: ts=8
diff --git a/runtime/syntax/bst.vim b/runtime/syntax/bst.vim
new file mode 100644
index 0000000..5ebef16
--- /dev/null
+++ b/runtime/syntax/bst.vim
@@ -0,0 +1,70 @@
+" Vim syntax file
+" Language: BibTeX Bibliography Style
+" Maintainer: Tim Pope <vimNOSPAM@tpope.info>
+" Filenames: *.bst
+" $Id: bst.vim,v 1.2 2007/05/05 18:24:42 vimboss Exp $
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=48-57,#,$,',.,A-Z,a-z
+
+syn case ignore
+
+syn match bstString +"[^"]*\%("\|$\)+ contains=bstField,bstType,bstError
+" Highlight the last character of an unclosed string, but only when the cursor
+" is not beyond it (i.e., it is still being edited). Imperfect.
+syn match bstError '[^"]\%#\@!$' contained
+
+syn match bstNumber "#-\=\d\+\>"
+syn keyword bstNumber entry.max$ global.max$
+syn match bstComment "%.*"
+
+syn keyword bstCommand ENTRY FUNCTION INTEGERS MACRO STRINGS
+syn keyword bstCommand READ EXECUTE ITERATE REVERSE SORT
+syn match bstBuiltIn "\s[-<>=+*]\|\s:="
+syn keyword bstBuiltIn add.period$
+syn keyword bstBuiltIn call.type$ change.case$ chr.to.int$ cite$
+syn keyword bstBuiltIn duplicate$ empty$ format.name$
+syn keyword bstBuiltIn if$ int.to.chr$ int.to.str$
+syn keyword bstBuiltIn missing$
+syn keyword bstBuiltIn newline$ num.names$
+syn keyword bstBuiltIn pop$ preamble$ purify$ quote$
+syn keyword bstBuiltIn skip$ stack$ substring$ swap$
+syn keyword bstBuiltIn text.length$ text.prefix$ top$ type$
+syn keyword bstBuiltIn warning$ while$ width$ write$
+syn match bstIdentifier "'\k*"
+syn keyword bstType article book booklet conference
+syn keyword bstType inbook incollection inproceedings
+syn keyword bstType manual mastersthesis misc
+syn keyword bstType phdthesis proceedings
+syn keyword bstType techreport unpublished
+syn keyword bstField abbr address annote author
+syn keyword bstField booktitle chapter crossref comment
+syn keyword bstField edition editor
+syn keyword bstField howpublished institution journal key month
+syn keyword bstField note number
+syn keyword bstField organization
+syn keyword bstField pages publisher
+syn keyword bstField school series
+syn keyword bstField title type
+syn keyword bstField volume year
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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"
+
+" vim:set ft=vim sts=4 sw=4:
diff --git a/runtime/syntax/btm.vim b/runtime/syntax/btm.vim
new file mode 100644
index 0000000..4f9253f
--- /dev/null
+++ b/runtime/syntax/btm.vim
@@ -0,0 +1,216 @@
+" Vim syntax file
+" Language: 4Dos batch file
+" Maintainer: John Leo Spetz <jls11@po.cwru.edu>
+" Last Change: 2001 May 09
+
+"//Issues to resolve:
+"//- Boolean operators surrounded by period are recognized but the
+"// periods are not highlighted. The only way to do that would
+"// be separate synmatches for each possibility otherwise a more
+"// general \.\i\+\. will highlight anything delimited by dots.
+"//- After unary operators like "defined" can assume token type.
+"// Should there be more of these?
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn keyword btmStatement call off
+syn keyword btmConditional if iff endiff then else elseiff not errorlevel
+syn keyword btmConditional gt lt eq ne ge le
+syn match btmConditional transparent "\.\i\+\." contains=btmDotBoolOp
+syn keyword btmDotBoolOp contained and or xor
+syn match btmConditional "=="
+syn match btmConditional "!="
+syn keyword btmConditional defined errorlevel exist isalias
+syn keyword btmConditional isdir direxist isinternal islabel
+syn keyword btmRepeat for in do enddo
+
+syn keyword btmTodo contained TODO
+
+" String
+syn cluster btmVars contains=btmVariable,btmArgument,btmBIFMatch
+syn region btmString start=+"+ end=+"+ contains=@btmVars
+syn match btmNumber "\<\d\+\>"
+
+"syn match btmIdentifier "\<\h\w*\>"
+
+" If you don't like tabs
+"syn match btmShowTab "\t"
+"syn match btmShowTabc "\t"
+"syn match btmComment "^\ *rem.*$" contains=btmTodo,btmShowTabc
+
+" Some people use this as a comment line
+" In fact this is a Label
+"syn match btmComment "^\ *:\ \+.*$" contains=btmTodo
+
+syn match btmComment "^\ *rem.*$" contains=btmTodo
+syn match btmComment "^\ *::.*$" contains=btmTodo
+
+syn match btmLabelMark "^\ *:[0-9a-zA-Z_\-]\+\>"
+syn match btmLabelMark "goto [0-9a-zA-Z_\-]\+\>"lc=5
+syn match btmLabelMark "gosub [0-9a-zA-Z_\-]\+\>"lc=6
+
+" syn match btmCmdDivider ">[>&][>&]\="
+syn match btmCmdDivider ">[>&]*"
+syn match btmCmdDivider ">>&>"
+syn match btmCmdDivider "|&\="
+syn match btmCmdDivider "%+"
+syn match btmCmdDivider "\^"
+
+syn region btmEcho start="echo" skip="echo" matchgroup=btmCmdDivider end="%+" end="$" end="|&\=" end="\^" end=">[>&]*" contains=@btmEchos oneline
+syn cluster btmEchos contains=@btmVars,btmEchoCommand,btmEchoParam
+syn keyword btmEchoCommand contained echo echoerr echos echoserr
+syn keyword btmEchoParam contained on off
+
+" this is also a valid Label. I don't use it.
+"syn match btmLabelMark "^\ *:\ \+[0-9a-zA-Z_\-]\+\>"
+
+" //Environment variable can be expanded using notation %var in 4DOS
+syn match btmVariable "%[0-9a-z_\-]\+" contains=@btmSpecialVars
+" //Environment variable can be expanded using notation %var%
+syn match btmVariable "%[0-9a-z_\-]*%" contains=@btmSpecialVars
+" //The following are special variable in 4DOS
+syn match btmVariable "%[=#]" contains=@btmSpecialVars
+syn match btmVariable "%??\=" contains=@btmSpecialVars
+" //Environment variable can be expanded using notation %[var] in 4DOS
+syn match btmVariable "%\[[0-9a-z_\-]*\]"
+" //After some keywords next word should be an environment variable
+syn match btmVariable "defined\s\i\+"lc=8
+syn match btmVariable "set\s\i\+"lc=4
+" //Parameters to batchfiles take the format %<digit>
+syn match btmArgument "%\d\>"
+" //4DOS allows format %<digit>& meaning batchfile parameters digit and up
+syn match btmArgument "%\d\>&"
+" //Variable used by FOR loops sometimes use %%<letter> in batchfiles
+syn match btmArgument "%%\a\>"
+
+" //Show 4DOS built-in functions specially
+syn match btmBIFMatch "%@\w\+\["he=e-1 contains=btmBuiltInFunc
+syn keyword btmBuiltInFunc contained alias ascii attrib cdrom
+syn keyword btmBuiltInFunc contained char clip comma convert
+syn keyword btmBuiltInFunc contained date day dec descript
+syn keyword btmBuiltInFunc contained device diskfree disktotal
+syn keyword btmBuiltInFunc contained diskused dosmem dow dowi
+syn keyword btmBuiltInFunc contained doy ems eval exec execstr
+syn keyword btmBuiltInFunc contained expand ext extended
+syn keyword btmBuiltInFunc contained fileage fileclose filedate
+syn keyword btmBuiltInFunc contained filename fileopen fileread
+syn keyword btmBuiltInFunc contained files fileseek fileseekl
+syn keyword btmBuiltInFunc contained filesize filetime filewrite
+syn keyword btmBuiltInFunc contained filewriteb findclose
+syn keyword btmBuiltInFunc contained findfirst findnext format
+syn keyword btmBuiltInFunc contained full if inc index insert
+syn keyword btmBuiltInFunc contained instr int label left len
+syn keyword btmBuiltInFunc contained lfn line lines lower lpt
+syn keyword btmBuiltInFunc contained makeage makedate maketime
+syn keyword btmBuiltInFunc contained master month name numeric
+syn keyword btmBuiltInFunc contained path random readscr ready
+syn keyword btmBuiltInFunc contained remote removable repeat
+syn keyword btmBuiltInFunc contained replace right search
+syn keyword btmBuiltInFunc contained select sfn strip substr
+syn keyword btmBuiltInFunc contained time timer trim truename
+syn keyword btmBuiltInFunc contained unique upper wild word
+syn keyword btmBuiltInFunc contained words xms year
+
+syn cluster btmSpecialVars contains=btmBuiltInVar,btmSpecialVar
+
+" //Show specialized variables specially
+" syn match btmSpecialVar contained "+"
+syn match btmSpecialVar contained "="
+syn match btmSpecialVar contained "#"
+syn match btmSpecialVar contained "??\="
+syn keyword btmSpecialVar contained cmdline colordir comspec
+syn keyword btmSpecialVar contained copycmd dircmd temp temp4dos
+syn keyword btmSpecialVar contained filecompletion path prompt
+
+" //Show 4DOS built-in variables specially specially
+syn keyword btmBuiltInVar contained _4ver _alias _ansi
+syn keyword btmBuiltInVar contained _apbatt _aplife _apmac _batch
+syn keyword btmBuiltInVar contained _batchline _batchname _bg
+syn keyword btmBuiltInVar contained _boot _ci _cmdproc _co
+syn keyword btmBuiltInVar contained _codepage _column _columns
+syn keyword btmBuiltInVar contained _country _cpu _cwd _cwds _cwp
+syn keyword btmBuiltInVar contained _cwps _date _day _disk _dname
+syn keyword btmBuiltInVar contained _dos _dosver _dow _dowi _doy
+syn keyword btmBuiltInVar contained _dpmi _dv _env _fg _hlogfile
+syn keyword btmBuiltInVar contained _hour _kbhit _kstack _lastdisk
+syn keyword btmBuiltInVar contained _logfile _minute _monitor
+syn keyword btmBuiltInVar contained _month _mouse _ndp _row _rows
+syn keyword btmBuiltInVar contained _second _shell _swapping
+syn keyword btmBuiltInVar contained _syserr _time _transient
+syn keyword btmBuiltInVar contained _video _win _wintitle _year
+
+" //Commands in 4DOS and/or DOS
+syn match btmCommand "\s?"
+syn match btmCommand "^?"
+syn keyword btmCommand alias append assign attrib
+syn keyword btmCommand backup beep break cancel case
+syn keyword btmCommand cd cdd cdpath chcp chdir
+syn keyword btmCommand chkdsk cls color comp copy
+syn keyword btmCommand ctty date debug default defrag
+syn keyword btmCommand del delay describe dir
+syn keyword btmCommand dirhistory dirs diskcomp
+syn keyword btmCommand diskcopy doskey dosshell
+syn keyword btmCommand drawbox drawhline drawvline
+"syn keyword btmCommand echo echoerr echos echoserr
+syn keyword btmCommand edit edlin emm386 endlocal
+syn keyword btmCommand endswitch erase eset except
+syn keyword btmCommand exe2bin exit expand fastopen
+syn keyword btmCommand fc fdisk ffind find format
+syn keyword btmCommand free global gosub goto
+syn keyword btmCommand graftabl graphics help history
+syn keyword btmCommand inkey input join keyb keybd
+syn keyword btmCommand keystack label lh list loadbtm
+syn keyword btmCommand loadhigh lock log md mem
+syn keyword btmCommand memory mirror mkdir mode more
+syn keyword btmCommand move nlsfunc on option path
+syn keyword btmCommand pause popd print prompt pushd
+syn keyword btmCommand quit rd reboot recover ren
+syn keyword btmCommand rename replace restore return
+syn keyword btmCommand rmdir scandisk screen scrput
+syn keyword btmCommand select set setdos setlocal
+syn keyword btmCommand setver share shift sort subst
+syn keyword btmCommand swapping switch sys tee text
+syn keyword btmCommand time timer touch tree truename
+syn keyword btmCommand type unalias undelete unformat
+syn keyword btmCommand unlock unset ver verify vol
+syn keyword btmCommand vscrput y
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/bzl.vim b/runtime/syntax/bzl.vim
new file mode 100644
index 0000000..b0ee945
--- /dev/null
+++ b/runtime/syntax/bzl.vim
@@ -0,0 +1,16 @@
+" Vim syntax file
+" Language: Bazel (http://bazel.io)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-bzl)
+" Last Change: 2015 Aug 11
+
+if exists('b:current_syntax')
+ finish
+endif
+
+
+runtime! syntax/python.vim
+
+let b:current_syntax = 'bzl'
+
+syn region bzlRule start='^\w\+($' end='^)\n*' transparent fold
+syn region bzlList start='\[' end='\]' transparent fold
diff --git a/runtime/syntax/bzr.vim b/runtime/syntax/bzr.vim
new file mode 100644
index 0000000..43178b8
--- /dev/null
+++ b/runtime/syntax/bzr.vim
@@ -0,0 +1,50 @@
+" Vim syntax file
+" Language: Bazaar (bzr) commit file
+" Maintainer: Dmitry Vasiliev <dima at hlabs dot org>
+" URL: https://github.com/hdima/vim-scripts/blob/master/syntax/bzr.vim
+" Last Change: 2012-02-11
+" Filenames: bzr_log.*
+" Version: 1.2.2
+"
+" Thanks:
+"
+" Gioele Barabucci
+" for idea of diff highlighting
+
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+
+if exists("bzr_highlight_diff")
+ syn include @Diff syntax/diff.vim
+endif
+
+syn match bzrRemoved "^removed:$" contained
+syn match bzrAdded "^added:$" contained
+syn match bzrRenamed "^renamed:$" contained
+syn match bzrModified "^modified:$" contained
+syn match bzrUnchanged "^unchanged:$" contained
+syn match bzrUnknown "^unknown:$" contained
+syn cluster Statuses contains=bzrRemoved,bzrAdded,bzrRenamed,bzrModified,bzrUnchanged,bzrUnknown
+if exists("bzr_highlight_diff")
+ syn cluster Statuses add=@Diff
+endif
+syn region bzrRegion start="^-\{14} This line and the following will be ignored -\{14}$" end="\%$" contains=@NoSpell,@Statuses
+
+" Synchronization.
+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.
+" 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
new file mode 100644
index 0000000..50878a7
--- /dev/null
+++ b/runtime/syntax/c.vim
@@ -0,0 +1,519 @@
+" Vim syntax file
+" Language: C
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Oct 05
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let s:ft = matchstr(&ft, '^\%([^.]\)\+')
+
+" check if this was included from cpp.vim
+let s:in_cpp_family = exists("b:filetype_in_cpp_family")
+
+" 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
+syn keyword cConditional if else switch
+syn keyword cRepeat while for do
+
+syn keyword cTodo contained TODO FIXME XXX
+
+" 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 cBadContinuation contained "\\\s\+$"
+
+" cCommentGroup allows adding matches for special things in comments
+syn cluster cCommentGroup contains=cTodo,cBadContinuation
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match cSpecial display contained "\\\%(x\x\+\|\o\{1,3}\|.\|$\)"
+if !exists("c_no_utf")
+ syn match cSpecial display contained "\\\%(u\x\{4}\|U\x\{8}\)"
+endif
+
+if !exists("c_no_cformat")
+ " Highlight % items in strings.
+ if !exists("c_no_c99") " ISO C99
+ syn match cFormat display "%\%(\d\+\$\)\=[-+' #0*]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlLjzt]\|ll\|hh\)\=\%([aAbdiuoxXDOUfFeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
+ else
+ syn match cFormat display "%\%(\d\+\$\)\=[-+' #0*]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlL]\|ll\)\=\%([bdiuoxXDOUfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
+ endif
+ syn match cFormat display "%%" contained
+endif
+
+" cCppString: same as cString, but ends at end of line
+if s:in_cpp_family && !exists("cpp_no_cpp11") && !exists("c_no_cformat")
+ " ISO C++11
+ syn region cString start=+\%(L\|u\|u8\|U\|R\|LR\|u8R\|uR\|UR\)\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend
+ syn region cCppString start=+\%(L\|u\|u8\|U\|R\|LR\|u8R\|uR\|UR\)\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell
+elseif s:ft ==# "c" && !exists("c_no_c11") && !exists("c_no_cformat")
+ " ISO C99
+ syn region cString start=+\%(L\|U\|u8\)\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend
+ syn region cCppString start=+\%(L\|U\|u8\)\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell
+else
+ " older C or C++
+ syn match cFormat display "%%" contained
+ syn region cString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend
+ syn region cCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial,cFormat,@Spell
+endif
+
+syn region cCppSkip contained start="^\s*\%(%:\|#\)\s*\%(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\%(%:\|#\)\s*endif\>" contains=cSpaceError,cCppSkip
+
+syn cluster cStringGroup contains=cCppString,cCppSkip
+
+syn match cCharacter "L\='[^\\]'"
+syn match cCharacter "L'[^']*'" contains=cSpecial
+if exists("c_gnu")
+ syn match cSpecialError "L\='\\[^'\"?\\abefnrtv]'"
+ syn match cSpecialCharacter "L\='\\['\"?\\abefnrtv]'"
+else
+ syn match cSpecialError "L\='\\[^'\"?\\abfnrtv]'"
+ syn match cSpecialCharacter "L\='\\['\"?\\abfnrtv]'"
+endif
+syn match cSpecialCharacter display "L\='\\\o\{1,3}'"
+syn match cSpecialCharacter display "'\\x\x\{1,2}'"
+syn match cSpecialCharacter display "L'\\x\x\+'"
+
+if (s:ft ==# "c" && !exists("c_no_c11")) || (s:in_cpp_family && !exists("cpp_no_cpp11"))
+ " ISO C11 or ISO C++ 11
+ if exists("c_no_cformat")
+ syn region cString start=+\%(U\|u8\=\)"+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,@Spell extend
+ else
+ syn region cString start=+\%(U\|u8\=\)"+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat,@Spell extend
+ endif
+ syn match cCharacter "[Uu]'[^\\]'"
+ syn match cCharacter "[Uu]'[^']*'" contains=cSpecial
+ if exists("c_gnu")
+ syn match cSpecialError "[Uu]'\\[^'\"?\\abefnrtv]'"
+ syn match cSpecialCharacter "[Uu]'\\['\"?\\abefnrtv]'"
+ else
+ syn match cSpecialError "[Uu]'\\[^'\"?\\abfnrtv]'"
+ syn match cSpecialCharacter "[Uu]'\\['\"?\\abfnrtv]'"
+ endif
+ syn match cSpecialCharacter display "[Uu]'\\\o\{1,3}'"
+ syn match cSpecialCharacter display "[Uu]'\\x\x\+'"
+endif
+
+"when wanted, highlight trailing white space
+if exists("c_space_errors")
+ if !exists("c_no_trail_space_error")
+ syn match cSpaceError display excludenl "\s\+$"
+ endif
+ if !exists("c_no_tab_space_error")
+ syn match cSpaceError display " \+\t"me=e-1
+ endif
+endif
+
+" This should be before cErrInParen to avoid problems with #define ({ xxx })
+if exists("c_curly_error")
+ syn match cCurlyError "}"
+ syn region cBlock start="{" end="}" contains=ALLBUT,cBadBlock,cCurlyError,@cParenGroup,cErrInParen,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell fold
+else
+ syn region cBlock start="{" end="}" transparent fold
+endif
+
+" Catch errors caused by wrong parenthesis and brackets.
+" Also accept <% for {, %> for }, <: for [ and :> for ] (C99)
+" But avoid matching <::.
+syn cluster cParenGroup contains=cParenError,cIncluded,cSpecial,cCommentSkip,cCommentString,cComment2String,@cCommentGroup,cCommentStartError,cUserLabel,cBitField,cOctalZero,@cCppOutInGroup,cFormat,cNumber,cFloat,cOctal,cOctalError,cNumbersCom
+if exists("c_no_curly_error")
+ if s:in_cpp_family && !exists("cpp_no_cpp11")
+ syn region cParen transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,@cStringGroup,@Spell
+ " cCppParen: same as cParen but ends at end-of-line; used in cDefine
+ syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
+ syn match cParenError display ")"
+ syn match cErrInParen display contained "^^<%\|^%>"
+ else
+ syn region cParen transparent start='(' end=')' contains=ALLBUT,cBlock,@cParenGroup,cCppParen,@cStringGroup,@Spell
+ " cCppParen: same as cParen but ends at end-of-line; used in cDefine
+ syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
+ syn match cParenError display ")"
+ syn match cErrInParen display contained "^[{}]\|^<%\|^%>"
+ endif
+elseif exists("c_no_bracket_error")
+ if s:in_cpp_family && !exists("cpp_no_cpp11")
+ syn region cParen transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,@cStringGroup,@Spell
+ " cCppParen: same as cParen but ends at end-of-line; used in cDefine
+ syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
+ syn match cParenError display ")"
+ syn match cErrInParen display contained "<%\|%>"
+ else
+ syn region cParen transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,@cStringGroup,@Spell
+ " cCppParen: same as cParen but ends at end-of-line; used in cDefine
+ syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cParen,cString,@Spell
+ syn match cParenError display ")"
+ syn match cErrInParen display contained "[{}]\|<%\|%>"
+ endif
+else
+ if s:in_cpp_family && !exists("cpp_no_cpp11")
+ syn region cParen transparent start='(' end=')' contains=ALLBUT,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell
+ " cCppParen: same as cParen but ends at end-of-line; used in cDefine
+ syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cErrInBracket,cParen,cBracket,cString,@Spell
+ syn match cParenError display "[\])]"
+ syn match cErrInParen display contained "<%\|%>"
+ syn region cBracket transparent start='\[\|<::\@!' end=']\|:>' contains=ALLBUT,@cParenGroup,cErrInParen,cCppParen,cCppBracket,@cStringGroup,@Spell
+ else
+ syn region cParen transparent start='(' end=')' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cCppParen,cErrInBracket,cCppBracket,@cStringGroup,@Spell
+ " cCppParen: same as cParen but ends at end-of-line; used in cDefine
+ syn region cCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@cParenGroup,cErrInBracket,cParen,cBracket,cString,@Spell
+ syn match cParenError display "[\])]"
+ syn match cErrInParen display contained "[\]{}]\|<%\|%>"
+ syn region cBracket transparent start='\[\|<::\@!' end=']\|:>' end='}'me=s-1 contains=ALLBUT,cBlock,@cParenGroup,cErrInParen,cCppParen,cCppBracket,@cStringGroup,@Spell
+ endif
+ " cCppBracket: same as cParen but ends at end-of-line; used in cDefine
+ syn region cCppBracket transparent start='\[\|<::\@!' skip='\\$' excludenl end=']\|:>' end='$' contained contains=ALLBUT,@cParenGroup,cErrInParen,cParen,cBracket,cString,@Spell
+ syn match cErrInBracket display contained "[);{}]\|<%\|%>"
+endif
+
+if s:ft ==# 'c' || exists("cpp_no_cpp11")
+ syn region cBadBlock keepend start="{" end="}" contained containedin=cParen,cBracket,cBadBlock transparent fold
+endif
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match cNumbers display transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctalError,cOctal
+" Same, but without octal error (for comments)
+syn match cNumbersCom display contained transparent "\<\d\|\.\d" contains=cNumber,cFloat,cOctal
+syn match cNumber display contained "\d\+\%(u\=l\{0,2}\|ll\=u\)\>"
+"hex number
+syn match cNumber display contained "0x\x\+\%(u\=l\{0,2}\|ll\=u\)\>"
+" Flag the first zero of an octal number as something special
+syn match cOctal display contained "0\o\+\%(u\=l\{0,2}\|ll\=u\)\>" contains=cOctalZero
+syn match cOctalZero display contained "\<0"
+"floating point number, with dot, optional exponent
+syn match cFloat display contained "\d\+\.\d*\%(e[-+]\=\d\+\)\=[fl]\="
+"floating point number, starting with a dot, optional exponent
+syn match cFloat display contained "\.\d\+\%(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match cFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>"
+if !exists("c_no_c99")
+ "hexadecimal floating point number, optional leading digits, with dot, with exponent
+ syn match cFloat display contained "0x\x*\.\x\+p[-+]\=\d\+[fl]\=\>"
+ "hexadecimal floating point number, with leading digits, optional dot, with exponent
+ syn match cFloat display contained "0x\x\+\.\=p[-+]\=\d\+[fl]\=\>"
+endif
+
+" flag an octal number with wrong digits
+syn match cOctalError display contained "0\o*[89]\d*"
+syn case match
+
+if exists("c_comment_strings")
+ " A comment can contain cString, cCharacter and cNumber.
+ " But a "*/" inside a cString in a cComment DOES end the comment! So we
+ " need to use a special type of cString: cCommentString, 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 :-(
+ 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,cWrongComTail,@Spell
+ if exists("c_no_comment_fold")
+ " Use "extend" here to have preprocessor lines not terminate halfway a
+ " comment.
+ syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell extend
+ else
+ syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cCommentString,cCharacter,cNumbersCom,cSpaceError,@Spell fold extend
+ endif
+else
+ syn region cCommentL start="//" skip="\\$" end="$" keepend contains=@cCommentGroup,cSpaceError,@Spell
+ if exists("c_no_comment_fold")
+ syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell extend
+ else
+ syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=@cCommentGroup,cCommentStartError,cSpaceError,@Spell fold extend
+ endif
+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")
+ syn keyword cType __label__ __complex__
+ syn keyword cStatement __asm__
+ syn keyword cOperator __alignof__
+ syn keyword cOperator typeof __typeof__
+ syn keyword cOperator __real__ __imag__
+ syn keyword cStorageClass __attribute__ __const__ __extension__
+ syn keyword cStorageClass inline __inline__
+ syn keyword cStorageClass __restrict__ __volatile__ __noreturn__
+endif
+syn keyword cType int long short char void
+syn keyword cType signed unsigned float double
+if !exists("c_no_ansi") || exists("c_ansi_typedefs")
+ syn keyword cType size_t ssize_t off_t wchar_t ptrdiff_t sig_atomic_t fpos_t
+ syn keyword cType clock_t time_t va_list jmp_buf FILE DIR div_t ldiv_t
+ syn keyword cType mbstate_t wctrans_t wint_t wctype_t
+endif
+if !exists("c_no_c99") " ISO C99
+ syn keyword cType _Bool bool _Complex complex _Imaginary imaginary
+ syn keyword cType int8_t int16_t int32_t int64_t
+ syn keyword cType uint8_t uint16_t uint32_t uint64_t
+ if !exists("c_no_bsd")
+ " These are BSD specific.
+ syn keyword cType u_int8_t u_int16_t u_int32_t u_int64_t
+ endif
+ syn keyword cType int_least8_t int_least16_t int_least32_t int_least64_t
+ syn keyword cType uint_least8_t uint_least16_t uint_least32_t uint_least64_t
+ syn keyword cType int_fast8_t int_fast16_t int_fast32_t int_fast64_t
+ syn keyword cType uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
+ syn keyword cType intptr_t uintptr_t
+ syn keyword cType intmax_t uintmax_t
+endif
+
+syn keyword cTypedef typedef
+syn keyword cStructure struct union enum
+syn keyword cStorageClass static register auto volatile extern const
+if !exists("c_no_c99") && !s:in_cpp_family
+ syn keyword cStorageClass inline restrict
+endif
+if !exists("c_no_c11")
+ syn keyword cStorageClass _Alignas alignas
+ syn keyword cOperator _Alignof alignof
+ syn keyword cStorageClass _Atomic
+ syn keyword cOperator _Generic
+ syn keyword cStorageClass _Noreturn noreturn
+ syn keyword cOperator _Static_assert static_assert
+ syn keyword cStorageClass _Thread_local thread_local
+ syn keyword cType char16_t char32_t
+ syn keyword cType max_align_t
+ " C11 atomics (take down the shield wall!)
+ syn keyword cType atomic_bool atomic_char atomic_schar atomic_uchar
+ syn keyword Ctype atomic_short atomic_ushort atomic_int atomic_uint
+ syn keyword cType atomic_long atomic_ulong atomic_llong atomic_ullong
+ syn keyword cType atomic_char16_t atomic_char32_t atomic_wchar_t
+ syn keyword cType atomic_int_least8_t atomic_uint_least8_t
+ syn keyword cType atomic_int_least16_t atomic_uint_least16_t
+ syn keyword cType atomic_int_least32_t atomic_uint_least32_t
+ syn keyword cType atomic_int_least64_t atomic_uint_least64_t
+ syn keyword cType atomic_int_fast8_t atomic_uint_fast8_t
+ syn keyword cType atomic_int_fast16_t atomic_uint_fast16_t
+ syn keyword cType atomic_int_fast32_t atomic_uint_fast32_t
+ syn keyword cType atomic_int_fast64_t atomic_uint_fast64_t
+ syn keyword cType atomic_intptr_t atomic_uintptr_t
+ syn keyword cType atomic_size_t atomic_ptrdiff_t
+ syn keyword cType atomic_intmax_t atomic_uintmax_t
+endif
+
+if !exists("c_no_ansi") || exists("c_ansi_constants") || exists("c_gnu")
+ if exists("c_gnu")
+ syn keyword cConstant __GNUC__ __FUNCTION__ __PRETTY_FUNCTION__ __func__
+ endif
+ syn keyword cConstant __LINE__ __FILE__ __DATE__ __TIME__ __STDC__ __STDC_VERSION__ __STDC_HOSTED__
+ syn keyword cConstant CHAR_BIT MB_LEN_MAX MB_CUR_MAX
+ syn keyword cConstant UCHAR_MAX UINT_MAX ULONG_MAX USHRT_MAX
+ syn keyword cConstant CHAR_MIN INT_MIN LONG_MIN SHRT_MIN
+ syn keyword cConstant CHAR_MAX INT_MAX LONG_MAX SHRT_MAX
+ 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__ __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
+ syn keyword cConstant UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX
+ syn keyword cConstant INT_LEAST8_MIN INT_LEAST16_MIN INT_LEAST32_MIN INT_LEAST64_MIN
+ syn keyword cConstant INT_LEAST8_MAX INT_LEAST16_MAX INT_LEAST32_MAX INT_LEAST64_MAX
+ syn keyword cConstant UINT_LEAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX
+ syn keyword cConstant INT_FAST8_MIN INT_FAST16_MIN INT_FAST32_MIN INT_FAST64_MIN
+ syn keyword cConstant INT_FAST8_MAX INT_FAST16_MAX INT_FAST32_MAX INT_FAST64_MAX
+ syn keyword cConstant UINT_FAST8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX
+ syn keyword cConstant INTPTR_MIN INTPTR_MAX UINTPTR_MAX
+ syn keyword cConstant INTMAX_MIN INTMAX_MAX UINTMAX_MAX
+ 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 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 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
+ " used in assert.h
+ syn keyword cConstant NDEBUG
+ " POSIX 2001
+ syn keyword cConstant SIGBUS SIGPOLL SIGPROF SIGSYS SIGURG SIGVTALRM SIGXCPU SIGXFSZ
+ " non-POSIX signals
+ syn keyword cConstant SIGWINCH SIGINFO
+ " 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 ENOTBLK 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
+endif
+if !exists("c_no_c99") " ISO C99
+ syn keyword cConstant true false
+endif
+
+" Accept %: for # (C99)
+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*\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
+ else
+ 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*\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
+ else
+ syn region cCppInElse contained start="^\s*\%(%:\|#\)\s*\%(else\>\|elif\s\+\%(0*[1-9]\d*\s*\%($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2
+ endif
+ syn region cCppInElse2 contained matchgroup=cCppInWrapper start="^\s*\%(%:\|#\)\s*\%(else\|elif\)\%([^/]\|/[^/*]\)*" end="^\s*\%(%:\|#\)\s*endif\>"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell
+ syn region cCppOutSkip contained start="^\s*\%(%:\|#\)\s*\%(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\%(%:\|#\)\s*endif\>" contains=cSpaceError,cCppOutSkip
+ syn region cCppInSkip contained matchgroup=cCppInWrapper start="^\s*\%(%:\|#\)\s*\%(if\s\+\%(\d\+\s*\%($\|//\|/\*\||\|&\)\)\@!\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\%(%:\|#\)\s*endif\>" containedin=cCppOutElse,cCppInIf,cCppInSkip contains=TOP,cPreProc
+endif
+syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match cIncluded display contained "<[^>]*>"
+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*\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
+
+" be able to fold #pragma regions
+syn region cPragma start="^\s*#pragma\s\+region\>" end="^\s*#pragma\s\+endregion\>" transparent keepend extend fold
+
+" 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
+if s:ft ==# 'c' || exists("cpp_no_cpp11")
+ syn region cMulti transparent start='?' skip='::' end=':' contains=ALLBUT,@cMultiGroup,@Spell,@cStringGroup
+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*\zs\I\i*\s*:$" contains=@cLabelGroup
+syn match cUserCont display ";\s*\zs\I\i*\s*:$" contains=@cLabelGroup
+if s:in_cpp_family
+ 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*\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*\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
+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
+if exists("c_curly_error")
+ syn sync fromstart
+else
+ exec "syn sync ccomment cComment minlines=" . b:c_minlines
+endif
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet
+hi def link cFormat cSpecial
+hi def link cCppString cString
+hi def link cCommentL cComment
+hi def link cCommentStart cComment
+hi def link cLabel Label
+hi def link cUserLabel Label
+hi def link cConditional Conditional
+hi def link cRepeat Repeat
+hi def link cCharacter Character
+hi def link cSpecialCharacter cSpecial
+hi def link cNumber Number
+hi def link cOctal Number
+hi def link cOctalZero PreProc " link this to Error if you want
+hi def link cFloat Float
+hi def link cOctalError cError
+hi def link cParenError cError
+hi def link cErrInParen cError
+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
+hi def link cStructure Structure
+hi def link cTypedef Structure
+hi def link cStorageClass StorageClass
+hi def link cInclude Include
+hi def link cPreProc PreProc
+hi def link cDefine Macro
+hi def link cIncluded cString
+hi def link cError Error
+hi def link cStatement Statement
+hi def link cCppInWrapper cCppOutWrapper
+hi def link cCppOutWrapper cPreCondit
+hi def link cPreConditMatch cPreCondit
+hi def link cPreCondit PreCondit
+hi def link cType Type
+hi def link cConstant Constant
+hi def link cCommentString cString
+hi def link cComment2String cString
+hi def link cCommentSkip cComment
+hi def link cString String
+hi def link cComment Comment
+hi def link cSpecial SpecialChar
+hi def link cTodo Todo
+hi def link cBadContinuation Error
+hi def link cCppOutSkip cCppOutIf2
+hi def link cCppInElse2 cCppOutIf2
+hi def link cCppOutIf2 cCppOut
+hi def link cCppOut Comment
+
+let b:current_syntax = "c"
+
+unlet s:ft
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/cabal.vim b/runtime/syntax/cabal.vim
new file mode 100644
index 0000000..74cda51
--- /dev/null
+++ b/runtime/syntax/cabal.vim
@@ -0,0 +1,278 @@
+" Vim syntax file
+" 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: 22 Oct 2022
+" v1.6: Added support for foreign-libraries
+" Added highlighting for various fields
+" 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.
+" Cabal known compiler are highlighted too.
+"
+" V1.2: Added cpp-options which was missing. Feature implemented
+" by GHC, found with a GHC warning, but undocumented.
+" Whatever...
+"
+" v1.1: Fixed operator problems and added ftdetect file
+" (thanks to Sebastian Schwarz)
+"
+" v1.0: Cabal syntax in vimball format
+" (thanks to Magnus Therning)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" 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
+ \ foreign-library
+ \ custom-setup
+ \ common
+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\|foreign-library\|custom-setup\|common\)\+\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
+ \ autogen-includes
+ \ autogen-modules
+ \ asm-sources
+ \ asm-options
+ \ branch
+ \ bug-reports
+ \ build-depends
+ \ build-tools
+ \ build-tool-depends
+ \ build-type
+ \ buildable
+ \ c-sources
+ \ cabal-version
+ \ category
+ \ cc-options
+ \ copyright
+ \ cmm-sources
+ \ cmm-options
+ \ cpp-options
+ \ cxx-options
+ \ cxx-sources
+ \ data-dir
+ \ data-files
+ \ default
+ \ default-extensions
+ \ description
+ \ executable
+ \ exposed-modules
+ \ exposed
+ \ extensions
+ \ extra-bundled-libraries
+ \ extra-doc-files
+ \ extra-dynamic-library-flavours
+ \ extra-framework-dirs
+ \ extra-ghci-libraries
+ \ extra-lib-dirs
+ \ extra-lib-dirs-static
+ \ extra-libraries
+ \ extra-libraries-static
+ \ extra-library-flavours
+ \ extra-source-files
+ \ extra-tmp-files
+ \ for example
+ \ frameworks
+ \ ghc-options
+ \ ghc-prof-options
+ \ ghc-shared-options
+ \ ghcjs-options
+ \ ghcjs-prof-options
+ \ ghcjs-shared-options
+ \ homepage
+ \ hs-source-dir
+ \ hs-source-dirs
+ \ hugs-options
+ \ import
+ \ include-dirs
+ \ includes
+ \ install-includes
+ \ js-sources
+ \ ld-options
+ \ lib-version-info
+ \ lib-version-linux
+ \ license
+ \ license-file
+ \ location
+ \ main-is
+ \ maintainer
+ \ manual
+ \ mixins
+ \ module
+ \ mod-def-file
+ \ name
+ \ nhc98-options
+ \ options
+ \ other-extensions
+ \ other-language
+ \ other-languages
+ \ other-modules
+ \ package-url
+ \ pkgconfig-depends
+ \ scope
+ \ setup-depends
+ \ signatures
+ \ stability
+ \ subdir
+ \ synopsis
+ \ reexported-modules
+ \ tag
+ \ tested-with
+ \ test-module
+ \ 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.
+" 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/cabalconfig.vim b/runtime/syntax/cabalconfig.vim
new file mode 100644
index 0000000..0165725
--- /dev/null
+++ b/runtime/syntax/cabalconfig.vim
@@ -0,0 +1,30 @@
+" Vim syntax file
+" Language: Cabal Config
+" Maintainer: profunctor@pm.me
+" Last Change: Marcin Szamotulski
+" Original Author: Marcin Szamotulski
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match CabalConfigSection /^\S[[:alpha:]]\+\%(-[[:alpha:]]\+\)*[^:]*$/
+syn region CabalConfigRegion matchgroup=CabalConfigKey start=/^\s*[[:alpha:]]\+\%(-[[:alpha:]]\+\)*:/ matchgroup=NONE end=/$/ contains=CabalConfigSeparator,CabalConfigKeyword,CabalConfigPath keepend
+syn match CabalConfigComment /^\s*--.*$/
+syn match CabalConfigValue /.*$/ contained
+syn match CabalConfigKey /[[:alpha:]]\+\%(-[[:alpha:]]\+\)*\ze:/
+syn keyword CabalConfigSeparator : contained
+syn match CabalConfigVariable /\$[[:alpha:]]\+/
+syn keyword CabalConfigKeyword True False ghc
+syn match CabalConfigPath /\%([[:alpha:]]\+:\)\?\%(\/[[:print:]]\+\)\+/
+
+hi def link CabalConfigComment Comment
+hi def link CabalConfigSection Title
+hi def link CabalConfigKey Statement
+hi def link CabalConfigSeparator NonText
+hi def link CabalConfigValue Normal
+hi def link CabalConfigVariable Identifier
+hi def link CabalConfigKeyword Keyword
+hi def link CabalConfigPath Directory
+
+let b:current_syntax = "cabal.config"
diff --git a/runtime/syntax/cabalproject.vim b/runtime/syntax/cabalproject.vim
new file mode 100644
index 0000000..12143b9
--- /dev/null
+++ b/runtime/syntax/cabalproject.vim
@@ -0,0 +1,28 @@
+" Vim syntax file
+" Language: Cabal Project
+" Maintainer: profunctor@pm.me
+" Last Change: Marcin Szamotulski
+" Original Author: Marcin Szamotulski
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match CabalProjectComment /^\s*--.*/ contains=@Spell
+syn match CabalProjectField /^\w\%(\w\|-\)\+/ contains=@NoSpell
+
+syn keyword CabalProjectBoolean true false True False
+syn keyword CabalProjectCompiler ghc ghcjs jhc lhc uhc haskell-suite
+syn match CabalProjectNat /\<\d\+\>/
+syn keyword CabalProjectJobs $ncpus
+syn keyword CabalProjectProfilingLevel default none exported-functions toplevel-functions all-functions
+
+hi def link CabalProjectComment Comment
+hi def link CabalProjectField Statement
+hi def link CabalProjectBoolean Boolean
+hi def link CabalProjectCompiler Identifier
+hi def link CabalProjectNat Number
+hi def link CabalProjectJobs Number
+hi def link CabalProjectProfilingLevel Statement
+
+let b:current_syntax = "cabal.project"
diff --git a/runtime/syntax/calendar.vim b/runtime/syntax/calendar.vim
new file mode 100644
index 0000000..4250109
--- /dev/null
+++ b/runtime/syntax/calendar.vim
@@ -0,0 +1,110 @@
+" Vim syntax file
+" Language: calendar(1) input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword calendarTodo contained TODO FIXME XXX NOTE
+
+syn region calendarComment start='/\*' end='\*/'
+ \ contains=calendarTodo,@Spell
+
+syn region calendarCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl
+ \ end=+"+ end='$' contains=calendarSpecial
+syn match calendarSpecial display contained '\\\%(x\x\+\|\o\{1,3}\|.\|$\)'
+syn match calendarSpecial display contained "\\\(u\x\{4}\|U\x\{8}\)"
+
+syn region calendarPreCondit start='^\s*#\s*\%(if\|ifdef\|ifndef\|elif\)\>'
+ \ skip='\\$' end='$'
+ \ contains=calendarComment,calendarCppString
+syn match calendarPreCondit display '^\s*#\s*\%(else\|endif\)\>'
+syn region calendarCppOut start='^\s*#\s*if\s\+0\+' end='.\@=\|$'
+ \ contains=calendarCppOut2
+syn region calendarCppOut2 contained start='0'
+ \ end='^\s*#\s*\%(endif\|else\|elif\)\>'
+ \ contains=calendarSpaceError,calendarCppSkip
+syn region calendarCppSkip contained
+ \ start='^\s*#\s*\%(if\|ifdef\|ifndef\)\>'
+ \ skip='\\$' end='^\s*#\s*endif\>'
+ \ contains=calendarSpaceError,calendarCppSkip
+syn region calendarIncluded display contained start=+"+ skip=+\\\\\|\\"+
+ \ end=+"+
+syn match calendarIncluded display contained '<[^>]*>'
+syn match calendarInclude display '^\s*#\s*include\>\s*["<]'
+ \ contains=calendarIncluded
+syn cluster calendarPreProcGroup contains=calendarPreCondit,calendarIncluded,
+ \ calendarInclude,calendarDefine,
+ \ calendarCppOut,calendarCppOut2,
+ \ calendarCppSkip,calendarString,
+ \ calendarSpecial,calendarTodo
+syn region calendarDefine start='^\s*#\s*\%(define\|undef\)\>'
+ \ skip='\\$' end='$'
+ \ contains=ALLBUT,@calendarPreProcGroup
+syn region calendarPreProc start='^\s*#\s*\%(pragma\|line\|warning\|warn\|error\)\>'
+ \ skip='\\$' end='$' keepend
+ \ contains=ALLBUT,@calendarPreProcGroup
+
+syn keyword calendarKeyword CHARSET BODUN LANG
+syn case ignore
+syn keyword calendarKeyword Easter Pashka
+syn case match
+
+syn case ignore
+syn match calendarNumber display '\<\d\+\>'
+syn keyword calendarMonth Jan[uary] Feb[ruary] Mar[ch] Apr[il] May
+ \ Jun[e] Jul[y] Aug[ust] Sep[tember]
+ \ Oct[ober] Nov[ember] Dec[ember]
+syn match calendarMonth display '\<\%(Jan\|Feb\|Mar\|Apr\|May\|Jun\|Jul\|Aug\|Sep\|Oct\|Nov\|Dec\)\.'
+syn keyword calendarWeekday Mon[day] Tue[sday] Wed[nesday] Thu[rsday]
+syn keyword calendarWeekday Fri[day] Sat[urday] Sun[day]
+syn match calendarWeekday display '\<\%(Mon\|Tue\|Wed\|Thu\|Fri\|Sat\|Sun\)\.'
+ \ nextgroup=calendarWeekdayMod
+syn match calendarWeekdayMod display '[+-]\d\+\>'
+syn case match
+
+syn match calendarTime display '\<\%([01]\=\d\|2[0-3]\):[0-5]\d\%(:[0-5]\d\)\='
+syn match calendarTime display '\<\%(0\=[1-9]\|1[0-2]\):[0-5]\d\%(:[0-5]\d\)\=\s*[AaPp][Mm]'
+
+syn match calendarVariable '\*'
+
+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 calendarComment minlines=" . b:c_minlines
+
+hi def link calendarTodo Todo
+hi def link calendarComment Comment
+hi def link calendarCppString String
+hi def link calendarSpecial SpecialChar
+hi def link calendarPreCondit PreCondit
+hi def link calendarCppOut Comment
+hi def link calendarCppOut2 calendarCppOut
+hi def link calendarCppSkip calendarCppOut
+hi def link calendarIncluded String
+hi def link calendarInclude Include
+hi def link calendarDefine Macro
+hi def link calendarPreProc PreProc
+hi def link calendarKeyword Keyword
+hi def link calendarNumber Number
+hi def link calendarMonth String
+hi def link calendarWeekday String
+hi def link calendarWeekdayMod Special
+hi def link calendarTime Number
+hi def link calendarVariable Identifier
+
+let b:current_syntax = "calendar"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/catalog.vim b/runtime/syntax/catalog.vim
new file mode 100644
index 0000000..0a1d511
--- /dev/null
+++ b/runtime/syntax/catalog.vim
@@ -0,0 +1,30 @@
+" Vim syntax file
+" Language: sgml catalog file
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Fr, 04 Nov 2005 12:46:45 CET
+" Filenames: /etc/sgml.catalog
+" $Id: catalog.vim,v 1.2 2005/11/23 21:11:10 vimboss Exp $
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" strings
+syn region catalogString start=+"+ skip=+\\\\\|\\"+ end=+"+ keepend
+syn region catalogString start=+'+ skip=+\\\\\|\\'+ end=+'+ keepend
+
+syn region catalogComment start=+--+ end=+--+ contains=catalogTodo
+syn keyword catalogTodo TODO FIXME XXX NOTE contained
+syn keyword catalogKeyword DOCTYPE OVERRIDE PUBLIC DTDDECL ENTITY CATALOG
+
+
+" The default highlighting.
+hi def link catalogString String
+hi def link catalogComment Comment
+hi def link catalogTodo Todo
+hi def link catalogKeyword Statement
+
+let b:current_syntax = "catalog"
diff --git a/runtime/syntax/cdl.vim b/runtime/syntax/cdl.vim
new file mode 100644
index 0000000..2a458d4
--- /dev/null
+++ b/runtime/syntax/cdl.vim
@@ -0,0 +1,78 @@
+" Vim syntax file
+" Language: Comshare Dimension Definition Language
+" Maintainer: Raul Segura Acevedo <raulseguraaceved@netscape.net>
+" Last change: 2016 Sep 20
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+sy case ignore
+sy sync fromstart
+sy keyword cdlStatement dimension hierarchy group grouphierarchy schedule class
+sy keyword cdlType add update file category main altername removeall required notrequired
+sy keyword cdlConditional if then elseif else endif and or not cons rpt xlt
+sy keyword cdlFunction ChildOf IChildOf LeafChildOf DescendantOf IDescendantOf LeafDescendantOf MemberIs CountOf
+
+sy keyword cdlIdentifier contained id name desc description xlttype precision symbol curr_ name group_name rate_name
+sy keyword cdlIdentifier contained xcheck endbal accounttype natsign consolidate formula pctown usage periodicity
+sy match cdlIdentifier contained 'child\s*name'
+sy match cdlIdentifier contained 'parent\s*name'
+sy match cdlIdentifier contained 'grp\s*description'
+sy match cdlIdentifier contained 'grpchild\s*name'
+sy match cdlIdentifier contained 'grpparent\s*name'
+sy match cdlIdentifier contained 'preceding\s*member'
+sy match cdlIdentifier contained 'unit\s*name'
+sy match cdlIdentifier contained 'unit\s*id'
+sy match cdlIdentifier contained 'schedule\s*name'
+sy match cdlIdentifier contained 'schedule\s*id'
+
+sy match cdlString /\[[^]]*]/ contains=cdlRestricted,cdlNotSupported
+sy match cdlRestricted contained /[&*,_]/
+" not supported
+sy match cdlNotSupported contained /[:"!']/
+
+sy keyword cdlTodo contained TODO FIXME XXX
+sy cluster cdlCommentGroup contains=cdlTodo
+sy match cdlComment '//.*' contains=@cdlCommentGroup
+sy region cdlComment start="/\*" end="\*/" contains=@cdlCommentGroup fold
+sy match cdlCommentE "\*/"
+
+sy region cdlParen transparent start='(' end=')' contains=ALLBUT,cdlParenE,cdlRestricted,cdlNotSupported
+"sy region cdlParen transparent start='(' end=')' contains=cdlIdentifier,cdlComment,cdlParenWordE
+sy match cdlParenE ")"
+"sy match cdlParenWordE contained "\k\+"
+
+sy keyword cdlFxType allocation downfoot expr xltgain
+"sy keyword cdlFxType contained allocation downfoot expr xltgain
+"sy region cdlFx transparent start='\k\+(' end=')' contains=cdlConditional,cdlFunction,cdlString,cdlComment,cdlFxType
+
+set foldmethod=expr
+set foldexpr=(getline(v:lnum+1)=~'{'\|\|getline(v:lnum)=~'//\\s\\*\\{5}.*table')?'>1':1
+%foldo!
+set foldmethod=manual
+let b:match_words='\<if\>:\<then\>:\<elseif\>:\<else\>:\<endif\>'
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link cdlStatement Statement
+hi def link cdlType Type
+hi def link cdlFxType Type
+hi def link cdlIdentifier Identifier
+hi def link cdlString String
+hi def link cdlRestricted WarningMsg
+hi def link cdlNotSupported ErrorMsg
+hi def link cdlTodo Todo
+hi def link cdlComment Comment
+hi def link cdlCommentE ErrorMsg
+hi def link cdlParenE ErrorMsg
+hi def link cdlParenWordE ErrorMsg
+hi def link cdlFunction Function
+hi def link cdlConditional Conditional
+
+
+let b:current_syntax = "cdl"
+
+" vim: ts=8
diff --git a/runtime/syntax/cdrdaoconf.vim b/runtime/syntax/cdrdaoconf.vim
new file mode 100644
index 0000000..0fa6510
--- /dev/null
+++ b/runtime/syntax/cdrdaoconf.vim
@@ -0,0 +1,139 @@
+" Vim syntax file
+" Language: cdrdao(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-09-02
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword cdrdaoconfTodo
+ \ TODO FIXME XXX NOTE
+
+syn match cdrdaoconfBegin
+ \ display
+ \ nextgroup=@cdrdaoconfKeyword,cdrdaoconfComment
+ \ '^'
+
+syn cluster cdrdaoconfKeyword
+ \ contains=cdrdaoconfIntegerKeyword,
+ \ cdrdaoconfDriverKeyword,
+ \ cdrdaoconfDeviceKeyword,
+ \ cdrdaoconfPathKeyword
+
+syn keyword cdrdaoconfIntegerKeyword
+ \ contained
+ \ nextgroup=cdrdaoconfIntegerDelimiter
+ \ write_speed
+ \ write_buffers
+ \ user_capacity
+ \ full_burn
+ \ read_speed
+ \ cddb_timeout
+
+syn keyword cdrdaoconfIntegerKeyword
+ \ contained
+ \ nextgroup=cdrdaoconfParanoiaModeDelimiter
+ \ read_paranoia_mode
+
+syn keyword cdrdaoconfDriverKeyword
+ \ contained
+ \ nextgroup=cdrdaoconfDriverDelimiter
+ \ write_driver
+ \ read_driver
+
+syn keyword cdrdaoconfDeviceKeyword
+ \ contained
+ \ nextgroup=cdrdaoconfDeviceDelimiter
+ \ write_device
+ \ read_device
+
+syn keyword cdrdaoconfPathKeyword
+ \ contained
+ \ nextgroup=cdrdaoconfPathDelimiter
+ \ cddb_directory
+ \ tmp_file_dir
+
+syn match cdrdaoconfIntegerDelimiter
+ \ contained
+ \ nextgroup=cdrdaoconfInteger
+ \ skipwhite
+ \ ':'
+
+syn match cdrdaoconfParanoiaModeDelimiter
+ \ contained
+ \ nextgroup=cdrdaoconfParanoiaMode
+ \ skipwhite
+ \ ':'
+
+syn match cdrdaoconfDriverDelimiter
+ \ contained
+ \ nextgroup=cdrdaoconfDriver
+ \ skipwhite
+ \ ':'
+
+syn match cdrdaoconfDeviceDelimiter
+ \ contained
+ \ nextgroup=cdrdaoconfDevice
+ \ skipwhite
+ \ ':'
+
+syn match cdrdaoconfPathDelimiter
+ \ contained
+ \ nextgroup=cdrdaoconfPath
+ \ skipwhite
+ \ ':'
+
+syn match cdrdaoconfInteger
+ \ contained
+ \ '\<\d\+\>'
+
+syn match cdrdaoParanoiaMode
+ \ contained
+ \ '[0123]'
+
+syn match cdrdaoconfDriver
+ \ contained
+ \ '\<\(cdd2600\|generic-mmc\%(-raw\)\=\|plextor\%(-scan\)\|ricoh-mp6200\|sony-cdu9\%(20\|48\)\|taiyo-yuden\|teac-cdr55\|toshiba\|yamaha-cdr10x\)\>'
+
+syn region cdrdaoconfDevice
+ \ contained
+ \ matchgroup=cdrdaoconfDevice
+ \ start=+"+
+ \ end=+"+
+
+syn region cdrdaoconfPath
+ \ contained
+ \ matchgroup=cdrdaoconfPath
+ \ start=+"+
+ \ end=+"+
+
+syn match cdrdaoconfComment
+ \ contains=cdrdaoconfTodo,@Spell
+ \ '^.*#.*$'
+
+hi def link cdrdaoconfTodo Todo
+hi def link cdrdaoconfComment Comment
+hi def link cdrdaoconfKeyword Keyword
+hi def link cdrdaoconfIntegerKeyword cdrdaoconfKeyword
+hi def link cdrdaoconfDriverKeyword cdrdaoconfKeyword
+hi def link cdrdaoconfDeviceKeyword cdrdaoconfKeyword
+hi def link cdrdaoconfPathKeyword cdrdaoconfKeyword
+hi def link cdrdaoconfDelimiter Delimiter
+hi def link cdrdaoconfIntegerDelimiter cdrdaoconfDelimiter
+hi def link cdrdaoconfDriverDelimiter cdrdaoconfDelimiter
+hi def link cdrdaoconfDeviceDelimiter cdrdaoconfDelimiter
+hi def link cdrdaoconfPathDelimiter cdrdaoconfDelimiter
+hi def link cdrdaoconfInteger Number
+hi def link cdrdaoconfParanoiaMode Number
+hi def link cdrdaoconfDriver Identifier
+hi def link cdrdaoconfDevice cdrdaoconfPath
+hi def link cdrdaoconfPath String
+
+let b:current_syntax = "cdrdaoconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/cdrtoc.vim b/runtime/syntax/cdrtoc.vim
new file mode 100644
index 0000000..866784d
--- /dev/null
+++ b/runtime/syntax/cdrtoc.vim
@@ -0,0 +1,537 @@
+" Vim syntax file
+" Language: cdrdao(1) TOC file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-05-10
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword cdrtocTodo
+ \ contained
+ \ TODO
+ \ FIXME
+ \ XXX
+ \ NOTE
+
+syn cluster cdrtocCommentContents
+ \ contains=
+ \ cdrtocTodo,
+ \ @Spell
+
+syn cluster cdrtocHeaderFollowsInitial
+ \ contains=
+ \ cdrtocHeaderCommentInitial,
+ \ cdrtocHeaderCatalog,
+ \ cdrtocHeaderTOCType,
+ \ cdrtocHeaderCDText,
+ \ cdrtocTrack
+
+syn match cdrtocHeaderBegin
+ \ nextgroup=@cdrtocHeaderFollowsInitial
+ \ skipwhite skipempty
+ \ '\%^'
+
+let s:mmssff_pattern = '\%([0-5]\d\|\d\):\%([0-5]\d\|\d\):\%([0-6]\d\|7[0-5]\|\d\)\>'
+let s:byte_pattern = '\<\%([01]\=\d\{1,2}\|2\%([0-4]\d\|5[0-5]\)\)\>'
+let s:length_pattern = '\%(\%([0-5]\d\|\d\):\%([0-5]\d\|\d\):\%([0-6]\d\|7[0-5]\|\d\)\|\d\+\)\>'
+
+function s:def_comment(name, nextgroup)
+ execute 'syn match' a:name
+ \ 'nextgroup=' . a:nextgroup . ',' . a:name
+ \ 'skipwhite skipempty'
+ \ 'contains=@cdrtocCommentContents'
+ \ 'contained'
+ \ "'//.*$'"
+ execute 'hi def link' a:name 'cdrtocComment'
+endfunction
+
+function s:def_keywords(name, nextgroup, keywords)
+ let comment_group = a:name . 'FollowComment'
+ execute 'syn keyword' a:name
+ \ 'nextgroup=' . a:nextgroup . ',' . comment_group
+ \ 'skipwhite skipempty'
+ \ 'contained'
+ \ join(a:keywords)
+
+ call s:def_comment(comment_group, a:nextgroup)
+endfunction
+
+function s:def_keyword(name, nextgroup, keyword)
+ call s:def_keywords(a:name, a:nextgroup, [a:keyword])
+endfunction
+
+" NOTE: Pattern needs to escape any “@”s.
+function s:def_match(name, nextgroup, pattern)
+ let comment_group = a:name . 'FollowComment'
+ execute 'syn match' a:name
+ \ 'nextgroup=' . a:nextgroup . ',' . comment_group
+ \ 'skipwhite skipempty'
+ \ 'contained'
+ \ '@' . a:pattern . '@'
+
+ call s:def_comment(comment_group, a:nextgroup)
+endfunction
+
+function s:def_region(name, nextgroup, start, skip, end, matchgroup, contains)
+ let comment_group = a:name . 'FollowComment'
+ execute 'syn region' a:name
+ \ 'nextgroup=' . a:nextgroup . ',' . comment_group
+ \ 'skipwhite skipempty'
+ \ 'contained'
+ \ 'matchgroup=' . a:matchgroup
+ \ 'contains=' . a:contains
+ \ 'start=@' . a:start . '@'
+ \ (a:skip != "" ? ('skip=@' . a:skip . '@') : "")
+ \ 'end=@' . a:end . '@'
+
+ call s:def_comment(comment_group, a:nextgroup)
+endfunction
+
+call s:def_comment('cdrtocHeaderCommentInitial', '@cdrtocHeaderFollowsInitial')
+
+call s:def_keyword('cdrtocHeaderCatalog', 'cdrtocHeaderCatalogNumber', 'CATALOG')
+
+call s:def_match('cdrtocHeaderCatalogNumber', '@cdrtocHeaderFollowsInitial', '"\d\{13\}"')
+
+call s:def_keywords('cdrtocHeaderTOCType', '@cdrtocHeaderFollowsInitial', ['CD_DA', 'CD_ROM', 'CD_ROM_XA'])
+
+call s:def_keyword('cdrtocHeaderCDText', 'cdrtocHeaderCDTextStart', 'CD_TEXT')
+
+" TODO: Actually, language maps aren’t required by TocParser.g, but let’s keep
+" things simple (and in agreement with what the manual page says).
+call s:def_match('cdrtocHeaderCDTextStart', 'cdrtocHeaderCDTextLanguageMap', '{')
+
+call s:def_keyword('cdrtocHeaderCDTextLanguageMap', 'cdrtocHeaderLanguageMapStart', 'LANGUAGE_MAP')
+
+call s:def_match('cdrtocHeaderLanguageMapStart', 'cdrtocHeaderLanguageMapLanguageNumber', '{')
+
+call s:def_match('cdrtocHeaderLanguageMapLanguageNumber', 'cdrtocHeaderLanguageMapColon', '\<[0-7]\>')
+
+call s:def_match('cdrtocHeaderLanguageMapColon', 'cdrtocHeaderLanguageMapCountryCode,cdrtocHeaderLanguageMapCountryCodeName', ':')
+
+syn cluster cdrtocHeaderLanguageMapCountryCodeFollow
+ \ contains=
+ \ cdrtocHeaderLanguageMapLanguageNumber,
+ \ cdrtocHeaderLanguageMapEnd
+
+call s:def_match('cdrtocHeaderLanguageMapCountryCode',
+ \ '@cdrtocHeaderLanguageMapCountryCodeFollow',
+ \ s:byte_pattern)
+
+call s:def_keyword('cdrtocHeaderLanguageMapCountryCodeName',
+ \ '@cdrtocHeaderLanguageMapCountryCodeFollow',
+ \ 'EN')
+
+call s:def_match('cdrtocHeaderLanguageMapEnd',
+ \ 'cdrtocHeaderLanguage,cdrtocHeaderCDTextEnd',
+ \ '}')
+
+call s:def_keyword('cdrtocHeaderLanguage', 'cdrtocHeaderLanguageNumber', 'LANGUAGE')
+
+call s:def_match('cdrtocHeaderLanguageNumber', 'cdrtocHeaderLanguageStart', '\<[0-7]\>')
+
+call s:def_match('cdrtocHeaderLanguageStart',
+ \ 'cdrtocHeaderCDTextItem,cdrtocHeaderLanguageEnd',
+ \ '{')
+
+syn cluster cdrtocHeaderCDTextData
+ \ contains=
+ \ cdrtocHeaderCDTextDataString,
+ \ cdrtocHeaderCDTextDataBinaryStart
+
+call s:def_keywords('cdrtocHeaderCDTextItem',
+ \ '@cdrtocHeaderCDTextData',
+ \ ['TITLE', 'PERFORMER', 'SONGWRITER', 'COMPOSER',
+ \ 'ARRANGER', 'MESSAGE', 'DISC_ID', 'GENRE', 'TOC_INFO1',
+ \ 'TOC_INFO2', 'UPC_EAN', 'ISRC', 'SIZE_INFO'])
+
+call s:def_region('cdrtocHeaderCDTextDataString',
+ \ 'cdrtocHeaderCDTextItem,cdrtocHeaderLanguageEnd',
+ \ '"',
+ \ '\\\\\|\\"',
+ \ '"',
+ \ 'cdrtocHeaderCDTextDataStringDelimiters',
+ \ 'cdrtocHeaderCDTextDataStringSpecialChar')
+
+syn match cdrtocHeaderCDTextDataStringSpecialChar
+ \ contained
+ \ display
+ \ '\\\%(\o\o\o\|["\\]\)'
+
+call s:def_match('cdrtocHeaderCDTextDataBinaryStart',
+ \ 'cdrtocHeaderCDTextDataBinaryInteger',
+ \ '{')
+
+call s:def_match('cdrtocHeaderCDTextDataBinaryInteger',
+ \ 'cdrtocHeaderCDTextDataBinarySeparator,cdrtocHeaderCDTextDataBinaryEnd',
+ \ s:byte_pattern)
+
+call s:def_match('cdrtocHeaderCDTextDataBinarySeparator',
+ \ 'cdrtocHeaderCDTextDataBinaryInteger',
+ \ ',')
+
+call s:def_match('cdrtocHeaderCDTextDataBinaryEnd',
+ \ 'cdrtocHeaderCDTextItem,cdrtocHeaderLanguageEnd',
+ \ '}')
+
+call s:def_match('cdrtocHeaderLanguageEnd',
+ \ 'cdrtocHeaderLanguage,cdrtocHeaderCDTextEnd',
+ \ '}')
+
+call s:def_match('cdrtocHeaderCDTextEnd',
+ \ 'cdrtocTrack',
+ \ '}')
+
+syn cluster cdrtocTrackFollow
+ \ contains=
+ \ @cdrtocTrackFlags,
+ \ cdrtocTrackCDText,
+ \ cdrtocTrackPregap,
+ \ @cdrtocTrackContents
+
+call s:def_keyword('cdrtocTrack', 'cdrtocTrackMode', 'TRACK')
+
+call s:def_keywords('cdrtocTrackMode',
+ \ 'cdrtocTrackSubChannelMode,@cdrtocTrackFollow',
+ \ ['AUDIO', 'MODE1', 'MODE1_RAW', 'MODE2', 'MODE2_FORM1',
+ \ 'MODE2_FORM2', 'MODE2_FORM_MIX', 'MODE2_RAW'])
+
+call s:def_keywords('cdrtocTrackSubChannelMode',
+ \ '@cdrtocTrackFollow',
+ \ ['RW', 'RW_RAW'])
+
+syn cluster cdrtocTrackFlags
+ \ contains=
+ \ cdrtocTrackFlagNo,
+ \ cdrtocTrackFlagCopy,
+ \ cdrtocTrackFlagPreEmphasis,
+ \ cdrtocTrackFlag
+
+call s:def_keyword('cdrtocTrackFlagNo',
+ \ 'cdrtocTrackFlagCopy,cdrtocTrackFlagPreEmphasis',
+ \ 'NO')
+
+call s:def_keyword('cdrtocTrackFlagCopy', '@cdrtocTrackFollow', 'COPY')
+
+call s:def_keyword('cdrtocTrackFlagPreEmphasis', '@cdrtocTrackFollow', 'PRE_EMPHASIS')
+
+call s:def_keywords('cdrtocTrackFlag',
+ \ '@cdrtocTrackFollow',
+ \ ['TWO_CHANNEL_AUDIO', 'FOUR_CHANNEL_AUDIO'])
+
+call s:def_keyword('cdrtocTrackFlag', 'cdrtocTrackISRC', 'ISRC')
+
+call s:def_match('cdrtocTrackISRC',
+ \ '@cdrtocTrackFollow',
+ \ '"[[:upper:][:digit:]]\{5}\d\{7}"')
+
+call s:def_keyword('cdrtocTrackCDText', 'cdrtocTrackCDTextStart', 'CD_TEXT')
+
+call s:def_match('cdrtocTrackCDTextStart', 'cdrtocTrackCDTextLanguage', '{')
+
+call s:def_keyword('cdrtocTrackCDTextLanguage', 'cdrtocTrackCDTextLanguageNumber', 'LANGUAGE')
+
+call s:def_match('cdrtocTrackCDTextLanguageNumber', 'cdrtocTrackCDTextLanguageStart', '\<[0-7]\>')
+
+call s:def_match('cdrtocTrackCDTextLanguageStart',
+ \ 'cdrtocTrackCDTextItem,cdrtocTrackCDTextLanguageEnd',
+ \ '{')
+
+syn cluster cdrtocTrackCDTextData
+ \ contains=
+ \ cdrtocTrackCDTextDataString,
+ \ cdrtocTrackCDTextDataBinaryStart
+
+call s:def_keywords('cdrtocTrackCDTextItem',
+ \ '@cdrtocTrackCDTextData',
+ \ ['TITLE', 'PERFORMER', 'SONGWRITER', 'COMPOSER', 'ARRANGER',
+ \ 'MESSAGE', 'ISRC'])
+
+call s:def_region('cdrtocTrackCDTextDataString',
+ \ 'cdrtocTrackCDTextItem,cdrtocTrackCDTextLanguageEnd',
+ \ '"',
+ \ '\\\\\|\\"',
+ \ '"',
+ \ 'cdrtocTrackCDTextDataStringDelimiters',
+ \ 'cdrtocTrackCDTextDataStringSpecialChar')
+
+syn match cdrtocTrackCDTextDataStringSpecialChar
+ \ contained
+ \ display
+ \ '\\\%(\o\o\o\|["\\]\)'
+
+call s:def_match('cdrtocTrackCDTextDataBinaryStart',
+ \ 'cdrtocTrackCDTextDataBinaryInteger',
+ \ '{')
+
+call s:def_match('cdrtocTrackCDTextDataBinaryInteger',
+ \ 'cdrtocTrackCDTextDataBinarySeparator,cdrtocTrackCDTextDataBinaryEnd',
+ \ s:byte_pattern)
+
+call s:def_match('cdrtocTrackCDTextDataBinarySeparator',
+ \ 'cdrtocTrackCDTextDataBinaryInteger',
+ \ ',')
+
+call s:def_match('cdrtocTrackCDTextDataBinaryEnd',
+ \ 'cdrtocTrackCDTextItem,cdrtocTrackCDTextLanguageEnd',
+ \ '}')
+
+call s:def_match('cdrtocTrackCDTextLanguageEnd',
+ \ 'cdrtocTrackCDTextLanguage,cdrtocTrackCDTextEnd',
+ \ '}')
+
+call s:def_match('cdrtocTrackCDTextEnd',
+ \ 'cdrtocTrackPregap,@cdrtocTrackContents',
+ \ '}')
+
+call s:def_keyword('cdrtocTrackPregap', 'cdrtocTrackPregapMMSSFF', 'PREGAP')
+
+call s:def_match('cdrtocTrackPregapMMSSFF',
+ \ '@cdrtocTrackContents',
+ \ s:mmssff_pattern)
+
+syn cluster cdrtocTrackContents
+ \ contains=
+ \ cdrtocTrackSubTrack,
+ \ cdrtocTrackMarker
+
+syn cluster cdrtocTrackContentsFollow
+ \ contains=
+ \ @cdrtocTrackContents,
+ \ cdrtocTrackIndex,
+ \ cdrtocTrack
+
+call s:def_keywords('cdrtocTrackSubTrack',
+ \ 'cdrtocTrackSubTrackFileFilename',
+ \ ['FILE', 'AUDIOFILE'])
+
+call s:def_region('cdrtocTrackSubTrackFileFilename',
+ \ 'cdrtocTrackSubTrackFileStart',
+ \ '"',
+ \ '\\\\\|\\"',
+ \ '"',
+ \ 'cdrtocTrackSubTrackFileFilenameDelimiters',
+ \ 'cdrtocTrackSubTrackFileFilenameSpecialChar')
+
+syn match cdrtocTrackSubTrackFileFilenameSpecialChar
+ \ contained
+ \ display
+ \ '\\\%(\o\o\o\|["\\]\)'
+
+call s:def_match('cdrtocTrackSubTrackFileStart',
+ \ 'cdrtocTrackSubTrackFileLength,@cdrtocTrackContentsFollow',
+ \ s:length_pattern)
+
+call s:def_match('cdrtocTrackSubTrackFileLength',
+ \ '@cdrtocTrackContentsFollow',
+ \ s:length_pattern)
+
+call s:def_keyword('cdrtocTrackSubTrack', 'cdrtocTrackContentDatafileFilename', 'DATAFILE')
+
+call s:def_region('cdrtocTrackSubTrackDatafileFilename',
+ \ 'cdrtocTrackSubTrackDatafileLength',
+ \ '"',
+ \ '\\\\\|\\"',
+ \ '"',
+ \ 'cdrtocTrackSubTrackDatafileFilenameDelimiters',
+ \ 'cdrtocTrackSubTrackDatafileFilenameSpecialChar')
+
+syn match cdrtocTrackSubTrackdatafileFilenameSpecialChar
+ \ contained
+ \ display
+ \ '\\\%(\o\o\o\|["\\]\)'
+
+call s:def_match('cdrtocTrackDatafileLength',
+ \ '@cdrtocTrackContentsFollow',
+ \ s:length_pattern)
+
+call s:def_keyword('cdrtocTrackSubTrack', 'cdrtocTrackContentFifoFilename', 'DATAFILE')
+
+call s:def_region('cdrtocTrackSubTrackFifoFilename',
+ \ 'cdrtocTrackSubTrackFifoLength',
+ \ '"',
+ \ '\\\\\|\\"',
+ \ '"',
+ \ 'cdrtocTrackSubTrackFifoFilenameDelimiters',
+ \ 'cdrtocTrackSubTrackFifoFilenameSpecialChar')
+
+syn match cdrtocTrackSubTrackdatafileFilenameSpecialChar
+ \ contained
+ \ display
+ \ '\\\%(\o\o\o\|["\\]\)'
+
+call s:def_match('cdrtocTrackFifoLength',
+ \ '@cdrtocTrackContentsFollow',
+ \ s:length_pattern)
+
+call s:def_keyword('cdrtocTrackSubTrack', 'cdrtocTrackSilenceLength', 'SILENCE')
+
+call s:def_match('cdrtocTrackSilenceLength',
+ \ '@cdrtocTrackContentsFollow',
+ \ s:length_pattern)
+
+call s:def_keyword('cdrtocTrackSubTrack',
+ \ 'cdrtocTrackSubTrackZeroDataMode,' .
+ \ 'cdrtocTrackSubTrackZeroDataSubChannelMode,' .
+ \ 'cdrtocTrackSubTrackZeroDataLength',
+ \ 'ZERO')
+
+call s:def_keywords('cdrtocTrackSubTrackZeroDataMode',
+ \ 'cdrtocTrackSubTrackZeroSubChannelMode,cdrtocTrackSubTrackZeroDataLength',
+ \ ['AUDIO', 'MODE1', 'MODE1_RAW', 'MODE2', 'MODE2_FORM1',
+ \ 'MODE2_FORM2', 'MODE2_FORM_MIX', 'MODE2_RAW'])
+
+call s:def_keywords('cdrtocTrackSubTrackZeroDataSubChannelMode',
+ \ 'cdrtocTrackSubTrackZeroDataLength',
+ \ ['RW', 'RW_RAW'])
+
+call s:def_match('cdrtocTrackSubTrackZeroDataLength',
+ \ '@cdrtocTrackContentsFollow',
+ \ s:length_pattern)
+
+call s:def_keyword('cdrtocTrackMarker',
+ \ '@cdrtocTrackContentsFollow,cdrtocTrackMarkerStartMMSSFF',
+ \ 'START')
+
+call s:def_match('cdrtocTrackMarkerStartMMSSFF',
+ \ '@cdrtocTrackContentsFollow',
+ \ s:mmssff_pattern)
+
+call s:def_keyword('cdrtocTrackMarker',
+ \ '@cdrtocTrackContentsFollow,cdrtocTrackMarkerEndMMSSFF',
+ \ 'END')
+
+call s:def_match('cdrtocTrackMarkerEndMMSSFF',
+ \ '@cdrtocTrackContentsFollow',
+ \ s:mmssff_pattern)
+
+call s:def_keyword('cdrtocTrackIndex', 'cdrtocTrackIndexMMSSFF', 'INDEX')
+
+call s:def_match('cdrtocTrackIndexMMSSFF',
+ \ 'cdrtocTrackIndex,cdrtocTrack',
+ \ s:mmssff_pattern)
+
+delfunction s:def_region
+delfunction s:def_match
+delfunction s:def_keyword
+delfunction s:def_keywords
+delfunction s:def_comment
+
+syn sync fromstart
+
+hi def link cdrtocKeyword Keyword
+hi def link cdrtocHeaderKeyword cdrtocKeyword
+hi def link cdrtocHeaderCDText cdrtocHeaderKeyword
+hi def link cdrtocDelimiter Delimiter
+hi def link cdrtocCDTextDataBinaryEnd cdrtocDelimiter
+hi def link cdrtocHeaderCDTextDataBinaryEnd cdrtocHeaderCDTextDataBinaryEnd
+hi def link cdrtocNumber Number
+hi def link cdrtocCDTextDataBinaryInteger cdrtocNumber
+hi def link cdrtocHeaderCDTextDataBinaryInteger cdrtocCDTextDataBinaryInteger
+hi def link cdrtocCDTextDataBinarySeparator cdrtocDelimiter
+hi def link cdrtocHeaderCDTextDataBinarySeparator cdrtocCDTextDataBinarySeparator
+hi def link cdrtocCDTextDataBinaryStart cdrtocDelimiter
+hi def link cdrtocHeaderCDTextDataBinaryStart cdrtocCDTextDataBinaryStart
+hi def link cdrtocString String
+hi def link cdrtocCDTextDataString cdrtocString
+hi def link cdrtocHeaderCDTextDataString cdrtocCDTextDataString
+hi def link cdrtocCDTextDataStringDelimiters cdrtocDelimiter
+hi def link cdrtocHeaderCDTextDataStringDelimiters cdrtocCDTextDataStringDelimiters
+hi def link cdrtocCDTextDataStringSpecialChar SpecialChar
+hi def link cdrtocHeaderCDTextDataStringSpecialChar cdrtocCDTextDataStringSpecialChar
+hi def link cdrtocCDTextEnd cdrtocDelimiter
+hi def link cdrtocHeaderCDTextEnd cdrtocCDTextEnd
+hi def link cdrtocType Type
+hi def link cdrtocCDTextItem cdrtocType
+hi def link cdrtocHeaderCDTextItem cdrtocCDTextItem
+hi def link cdrtocHeaderCDTextLanguageMap cdrtocHeaderKeyword
+hi def link cdrtocCDTextStart cdrtocDelimiter
+hi def link cdrtocHeaderCDTextStart cdrtocCDTextStart
+hi def link cdrtocHeaderCatalog cdrtocHeaderKeyword
+hi def link cdrtocHeaderCatalogNumber cdrtocString
+hi def link cdrtocComment Comment
+hi def link cdrtocHeaderCommentInitial cdrtocComment
+hi def link cdrtocHeaderLanguage cdrtocKeyword
+hi def link cdrtocLanguageEnd cdrtocDelimiter
+hi def link cdrtocHeaderLanguageEnd cdrtocLanguageEnd
+hi def link cdrtocHeaderLanguageMapColon cdrtocDelimiter
+hi def link cdrtocIdentifier Identifier
+hi def link cdrtocHeaderLanguageMapCountryCode cdrtocNumber
+hi def link cdrtocHeaderLanguageMapCountryCodeName cdrtocIdentifier
+hi def link cdrtocHeaderLanguageMapEnd cdrtocDelimiter
+hi def link cdrtocHeaderLanguageMapLanguageNumber cdrtocNumber
+hi def link cdrtocHeaderLanguageMapStart cdrtocDelimiter
+hi def link cdrtocLanguageNumber cdrtocNumber
+hi def link cdrtocHeaderLanguageNumber cdrtocLanguageNumber
+hi def link cdrtocLanguageStart cdrtocDelimiter
+hi def link cdrtocHeaderLanguageStart cdrtocLanguageStart
+hi def link cdrtocHeaderTOCType cdrtocType
+hi def link cdrtocTodo Todo
+hi def link cdrtocTrackKeyword cdrtocKeyword
+hi def link cdrtocTrack cdrtocTrackKeyword
+hi def link cdrtocTrackCDText cdrtocTrackKeyword
+hi def link cdrtocTrackCDTextDataBinaryEnd cdrtocHeaderCDTextDataBinaryEnd
+hi def link cdrtocTrackCDTextDataBinaryInteger cdrtocHeaderCDTextDataBinaryInteger
+hi def link cdrtocTrackCDTextDataBinarySeparator cdrtocHeaderCDTextDataBinarySeparator
+hi def link cdrtocTrackCDTextDataBinaryStart cdrtocHeaderCDTextDataBinaryStart
+hi def link cdrtocTrackCDTextDataString cdrtocHeaderCDTextDataString
+hi def link cdrtocTrackCDTextDataStringDelimiters cdrtocCDTextDataStringDelimiters
+hi def link cdrtocTrackCDTextDataStringSpecialChar cdrtocCDTextDataStringSpecialChar
+hi def link cdrtocTrackCDTextEnd cdrtocCDTextEnd
+hi def link cdrtocTrackCDTextItem cdrtocCDTextItem
+hi def link cdrtocTrackCDTextStart cdrtocCDTextStart
+hi def link cdrtocLength cdrtocNumber
+hi def link cdrtocTrackDatafileLength cdrtocLength
+hi def link cdrtocTrackFifoLength cdrtocLength
+hi def link cdrtocPreProc PreProc
+hi def link cdrtocTrackFlag cdrtocPreProc
+hi def link cdrtocTrackFlagCopy cdrtocTrackFlag
+hi def link cdrtocSpecial Special
+hi def link cdrtocTrackFlagNo cdrtocSpecial
+hi def link cdrtocTrackFlagPreEmphasis cdrtocTrackFlag
+hi def link cdrtocTrackISRC cdrtocTrackFlag
+hi def link cdrtocTrackIndex cdrtocTrackKeyword
+hi def link cdrtocMMSSFF cdrtocLength
+hi def link cdrtocTrackIndexMMSSFF cdrtocMMSSFF
+hi def link cdrtocTrackCDTextLanguage cdrtocTrackKeyword
+hi def link cdrtocTrackCDTextLanguageEnd cdrtocLanguageEnd
+hi def link cdrtocTrackCDTextLanguageNumber cdrtocLanguageNumber
+hi def link cdrtocTrackCDTextLanguageStart cdrtocLanguageStart
+hi def link cdrtocTrackContents StorageClass
+hi def link cdrtocTrackMarker cdrtocTrackContents
+hi def link cdrtocTrackMarkerEndMMSSFF cdrtocMMSSFF
+hi def link cdrtocTrackMarkerStartMMSSFF cdrtocMMSSFF
+hi def link cdrtocTrackMode Type
+hi def link cdrtocTrackPregap cdrtocTrackContents
+hi def link cdrtocTrackPregapMMSSFF cdrtocMMSSFF
+hi def link cdrtocTrackSilenceLength cdrtocLength
+hi def link cdrtocTrackSubChannelMode cdrtocPreProc
+hi def link cdrtocTrackSubTrack cdrtocTrackContents
+hi def link cdrtocFilename cdrtocString
+hi def link cdrtocTrackSubTrackDatafileFilename cdrtocFilename
+hi def link cdrtocTrackSubTrackDatafileFilenameDelimiters cdrtocTrackSubTrackDatafileFilename
+hi def link cdrtocSpecialChar SpecialChar
+hi def link cdrtocTrackSubTrackDatafileFilenameSpecialChar cdrtocSpecialChar
+hi def link cdrtocTrackSubTrackDatafileLength cdrtocLength
+hi def link cdrtocTrackSubTrackFifoFilename cdrtocFilename
+hi def link cdrtocTrackSubTrackFifoFilenameDelimiters cdrtocTrackSubTrackFifoFilename
+hi def link cdrtocTrackSubTrackFifoFilenameSpecialChar cdrtocSpecialChar
+hi def link cdrtocTrackSubTrackFifoLength cdrtocLength
+hi def link cdrtocTrackSubTrackFileFilename cdrtocFilename
+hi def link cdrtocTrackSubTrackFileFilenameDelimiters cdrtocTrackSubTrackFileFilename
+hi def link cdrtocTrackSubTrackFileFilenameSpecialChar cdrtocSpecialChar
+hi def link cdrtocTrackSubTrackFileLength cdrtocLength
+hi def link cdrtocTrackSubTrackFileStart cdrtocLength
+hi def link cdrtocTrackSubTrackZeroDataLength cdrtocLength
+hi def link cdrtocTrackSubTrackZeroDataMode Type
+hi def link cdrtocTrackSubTrackZeroDataSubChannelMode cdrtocPreProc
+hi def link cdrtocTrackSubTrackdatafileFilenameSpecialChar cdrtocSpecialChar
+
+let b:current_syntax = "cdrtoc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/cf.vim b/runtime/syntax/cf.vim
new file mode 100644
index 0000000..04f9f59
--- /dev/null
+++ b/runtime/syntax/cf.vim
@@ -0,0 +1,1018 @@
+" Vim syntax file
+"
+" 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
+
+" 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
new file mode 100644
index 0000000..f347b13
--- /dev/null
+++ b/runtime/syntax/cfg.vim
@@ -0,0 +1,48 @@
+" Vim syntax file
+" Language: Good old CFG files
+" Maintainer: Igor N. Prischepoff (igor@tyumbit.ru, pri_igor@mail.ru)
+" Last change: 2012 Aug 11
+
+" quit when a syntax file was already loaded
+if exists ("b:current_syntax")
+ finish
+endif
+
+" case off
+syn case ignore
+syn keyword CfgOnOff ON OFF YES NO TRUE FALSE contained
+syn match UncPath "\\\\\p*" contained
+"Dos Drive:\Path
+syn match CfgDirectory "[a-zA-Z]:\\\p*" contained
+"Parameters
+syn match CfgParams ".\{0}="me=e-1 contains=CfgComment
+"... and their values (don't want to highlight '=' sign)
+syn match CfgValues "=.*"hs=s+1 contains=CfgDirectory,UncPath,CfgComment,CfgString,CfgOnOff
+
+" Sections
+syn match CfgSection "\[.*\]"
+syn match CfgSection "{.*}"
+
+" String
+syn match CfgString "\".*\"" contained
+syn match CfgString "'.*'" contained
+
+" Comments (Everything before '#' or '//' or ';')
+syn match CfgComment "#.*"
+syn match CfgComment ";.*"
+syn match CfgComment "\/\/.*"
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..61f475b
--- /dev/null
+++ b/runtime/syntax/ch.vim
@@ -0,0 +1,38 @@
+" Vim syntax file
+" Language: Ch
+" Maintainer: SoftIntegration, Inc. <info@softintegration.com>
+" URL: http://www.softintegration.com/download/vim/syntax/ch.vim
+" Last change: 2004 Sep 01
+" Created based on cpp.vim
+"
+" Ch is a C/C++ interpreter with many high level extensions
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the C syntax to start with
+runtime! syntax/c.vim
+unlet b:current_syntax
+
+" Ch extentions
+
+syn keyword chStatement new delete this foreach
+syn keyword chAccess public private
+syn keyword chStorageClass __declspec(global) __declspec(local)
+syn keyword chStructure class
+syn keyword chType string_t array
+
+" Default highlighting
+
+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"
+
+" vim: ts=8
diff --git a/runtime/syntax/chaiscript.vim b/runtime/syntax/chaiscript.vim
new file mode 100644
index 0000000..5a64bdb
--- /dev/null
+++ b/runtime/syntax/chaiscript.vim
@@ -0,0 +1,94 @@
+" Vim syntax file
+" Language: ChaiScript
+" Maintainer: Jason Turner <lefticus 'at' gmail com>
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+end
+
+syn case match
+
+" syncing method
+syn sync fromstart
+
+" Strings
+syn region chaiscriptString start=+"+ end=+"+ skip=+\\\\\|\\"+ contains=chaiscriptSpecial,chaiscriptEval,@Spell
+
+" Escape characters
+syn match chaiscriptSpecial contained "\\[\\abfnrtv\'\"]\|\\\d\{,3}"
+
+" String evals
+syn region chaiscriptEval contained start="${" end="}"
+
+" integer number
+syn match chaiscriptNumber "\<\d\+\>"
+
+" floating point number, with dot, optional exponent
+syn match chaiscriptFloat "\<\d\+\.\d*\%(e[-+]\=\d\+\)\=\>"
+
+" floating point number, starting with a dot, optional exponent
+syn match chaiscriptFloat "\.\d\+\%(e[-+]\=\d\+\)\=\>"
+
+" floating point number, without dot, with exponent
+syn match chaiscriptFloat "\<\d\+e[-+]\=\d\+\>"
+
+" Hex strings
+syn match chaiscriptNumber "\<0x\x\+\>"
+
+" Binary strings
+syn match chaiscriptNumber "\<0b[01]\+\>"
+
+" Various language features
+syn keyword chaiscriptCond if else
+syn keyword chaiscriptRepeat while for do
+syn keyword chaiscriptStatement break continue return
+syn keyword chaiscriptExceptions try catch throw
+
+"Keyword
+syn keyword chaiscriptKeyword def true false attr
+
+"Built in types
+syn keyword chaiscriptType fun var
+
+"Built in funcs, keep it simple
+syn keyword chaiscriptFunc eval throw
+
+"Let's treat all backtick operator function lookups as built in too
+syn region chaiscriptFunc matchgroup=chaiscriptFunc start="`" end="`"
+
+" Account for the "[1..10]" syntax, treating it as an operator
+" Intentionally leaving out all of the normal, well known operators
+syn match chaiscriptOperator "\.\."
+
+" Guard seperator as an operator
+syn match chaiscriptOperator ":"
+
+" Comments
+syn match chaiscriptComment "//.*$" contains=@Spell
+syn region chaiscriptComment matchgroup=chaiscriptComment start="/\*" end="\*/" contains=@Spell
+
+
+
+hi def link chaiscriptExceptions Exception
+hi def link chaiscriptKeyword Keyword
+hi def link chaiscriptStatement Statement
+hi def link chaiscriptRepeat Repeat
+hi def link chaiscriptString String
+hi def link chaiscriptNumber Number
+hi def link chaiscriptFloat Float
+hi def link chaiscriptOperator Operator
+hi def link chaiscriptConstant Constant
+hi def link chaiscriptCond Conditional
+hi def link chaiscriptFunction Function
+hi def link chaiscriptComment Comment
+hi def link chaiscriptTodo Todo
+hi def link chaiscriptError Error
+hi def link chaiscriptSpecial SpecialChar
+hi def link chaiscriptFunc Identifier
+hi def link chaiscriptType Type
+hi def link chaiscriptEval Special
+
+let b:current_syntax = "chaiscript"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet
diff --git a/runtime/syntax/change.vim b/runtime/syntax/change.vim
new file mode 100644
index 0000000..a92767e
--- /dev/null
+++ b/runtime/syntax/change.vim
@@ -0,0 +1,29 @@
+" Vim syntax file
+" Language: WEB Changes
+" Maintainer: Andreas Scherer <andreas.scherer@pobox.com>
+" Last Change: April 25, 2001
+
+" Details of the change mechanism of the WEB and CWEB languages can be found
+" in the articles by Donald E. Knuth and Silvio Levy cited in "web.vim" and
+" "cweb.vim" respectively.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" We distinguish two groups of material, (a) stuff between @x..@y, and
+" (b) stuff between @y..@z. WEB/CWEB ignore everything else in a change file.
+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.
+" Only when an item doesn't have highlighting yet
+
+hi def link changeFromMaterial String
+hi def link changeToMaterial Statement
+
+
+let b:current_syntax = "change"
+
+" vim: ts=8
diff --git a/runtime/syntax/changelog.vim b/runtime/syntax/changelog.vim
new file mode 100644
index 0000000..cf9021e
--- /dev/null
+++ b/runtime/syntax/changelog.vim
@@ -0,0 +1,58 @@
+" Vim syntax file
+" Language: generic ChangeLog file
+" Written By: Gediminas Paulauskas <menesis@delfi.lt>
+" Maintainer: Corinna Vinschen <vinschen@redhat.com>
+" Last Change: June 1, 2003
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+if exists('b:changelog_spacing_errors')
+ let s:spacing_errors = b:changelog_spacing_errors
+elseif exists('g:changelog_spacing_errors')
+ let s:spacing_errors = g:changelog_spacing_errors
+else
+ let s:spacing_errors = 1
+endif
+
+if s:spacing_errors
+ syn match changelogError "^ \+"
+endif
+
+syn match changelogText "^\s.*$" contains=changelogMail,changelogNumber,changelogMonth,changelogDay,changelogError
+syn match changelogHeader "^\S.*$" contains=changelogNumber,changelogMonth,changelogDay,changelogMail
+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
+syn keyword changelogDay contained mon tue wed thu fri sat sun
+syn match changelogNumber contained "[.-]*[0-9]\+"
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "changelog"
+
+" vim: ts=8
diff --git a/runtime/syntax/chaskell.vim b/runtime/syntax/chaskell.vim
new file mode 100644
index 0000000..4b1e8c5
--- /dev/null
+++ b/runtime/syntax/chaskell.vim
@@ -0,0 +1,14 @@
+" Vim syntax file
+" Language: Haskell supporting c2hs binding hooks
+" Maintainer: Armin Sander <armin@mindwalker.org>
+" Last Change: 2001 November 1
+"
+" 2001 November 1: Changed commands for sourcing haskell.vim
+
+" Enable binding hooks
+let b:hs_chs=1
+
+" Include standard Haskell highlighting
+runtime! syntax/haskell.vim
+
+" vim: ts=8
diff --git a/runtime/syntax/chatito.vim b/runtime/syntax/chatito.vim
new file mode 100644
index 0000000..d89307c
--- /dev/null
+++ b/runtime/syntax/chatito.vim
@@ -0,0 +1,62 @@
+" Vim syntax file
+" Language: Chatito
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: *.chatito
+" Last Change: 2022 Sep 19
+
+if exists('b:current_syntax')
+ finish
+endif
+
+" Comment
+syn keyword chatitoTodo contained TODO FIXME XXX
+syn match chatitoComment /^#.*/ contains=chatitoTodo,@Spell
+syn match chatitoComment +^//.*+ contains=chatitoTodo,@Spell
+
+" Import
+syn match chatitoImport /^import \+.*$/ transparent contains=chatitoImportKeyword,chatitoImportFile
+syn keyword chatitoImportKeyword import contained nextgroup=chatitoImportFile
+syn match chatitoImportFile /.*$/ contained skipwhite
+
+" Intent
+syn match chatitoIntent /^%\[[^\]?]\+\]\((.\+)\)\=$/ contains=chatitoArgs
+
+" Slot
+syn match chatitoSlot /^@\[[^\]?#]\+\(#[^\]?#]\+\)\=\]\((.\+)\)\=$/ contains=chatitoArgs,chatitoVariation
+syn match chatitoSlot /@\[[^\]?#]\+\(#[^\]?#]\+\)\=?\=\]/ contained contains=chatitoOpt,chatitoVariation
+
+" Alias
+syn match chatitoAlias /^\~\[[^\]?]\+\]\=$/
+syn match chatitoAlias /\~\[[^\]?]\+?\=\]/ contained contains=chatitoOpt
+
+" Probability
+syn match chatitoProbability /\*\[\d\+\(\.\d\+\)\=%\=\]/ contained
+
+" Optional
+syn match chatitoOpt '?' contained
+
+" Arguments
+syn match chatitoArgs /(.\+)/ contained
+
+" Variation
+syn match chatitoVariation /#[^\]?#]\+/ contained
+
+" Value
+syn match chatitoValue /^ \{4\}\zs.\+$/ contains=chatitoProbability,chatitoSlot,chatitoAlias,@Spell
+
+" Errors
+syn match chatitoError /^\t/
+
+hi def link chatitoAlias String
+hi def link chatitoArgs Special
+hi def link chatitoComment Comment
+hi def link chatitoError Error
+hi def link chatitoImportKeyword Include
+hi def link chatitoIntent Statement
+hi def link chatitoOpt SpecialChar
+hi def link chatitoProbability Number
+hi def link chatitoSlot Identifier
+hi def link chatitoTodo Todo
+hi def link chatitoVariation Special
+
+let b:current_syntax = 'chatito'
diff --git a/runtime/syntax/cheetah.vim b/runtime/syntax/cheetah.vim
new file mode 100644
index 0000000..9567ecb
--- /dev/null
+++ b/runtime/syntax/cheetah.vim
@@ -0,0 +1,47 @@
+" Vim syntax file
+" Language: Cheetah template engine
+" Maintainer: Max Ischenko <mfi@ukr.net>
+" Last Change: 2003-05-11
+"
+" Missing features:
+" match invalid syntax, like bad variable ref. or unmatched closing tag
+" PSP-style tags: <% .. %> (obsoleted feature)
+" doc-strings and header comments (rarely used feature)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case match
+
+syn keyword cheetahKeyword contained if else unless elif for in not
+syn keyword cheetahKeyword contained while repeat break continue pass end
+syn keyword cheetahKeyword contained set del attr def global include raw echo
+syn keyword cheetahKeyword contained import from extends implements
+syn keyword cheetahKeyword contained assert raise try catch finally
+syn keyword cheetahKeyword contained errorCatcher breakpoint silent cache filter
+syn match cheetahKeyword contained "\<compiler-settings\>"
+
+" Matches cached placeholders
+syn match cheetahPlaceHolder "$\(\*[0-9.]\+[wdhms]\?\*\|\*\)\?\h\w*\(\.\h\w*\)*" display
+syn match cheetahPlaceHolder "$\(\*[0-9.]\+[wdhms]\?\*\|\*\)\?{\h\w*\(\.\h\w*\)*}" display
+syn match cheetahDirective "^\s*#[^#].*$" contains=cheetahPlaceHolder,cheetahKeyword,cheetahComment display
+
+syn match cheetahContinuation "\\$"
+syn match cheetahComment "##.*$" display
+syn region cheetahMultiLineComment start="#\*" end="\*#"
+
+" Define the default highlighting.
+" 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 0000000..f53d872
--- /dev/null
+++ b/runtime/syntax/chicken.vim
@@ -0,0 +1,94 @@
+" Vim syntax file
+" Language: Scheme (CHICKEN)
+" Last Change: 2021 Oct 01
+" Author: Evan Hanson <evhan@foldling.org>
+" Maintainer: Evan Hanson <evhan@foldling.org>
+" Repository: https://git.foldling.org/vim-scheme.git
+" 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
+
+" SRFI 26
+syn match schemeSyntax /\(([ \t\n]*\)\@<=\(cut\|cute\)\>/
+
+syn keyword schemeSyntax and-let*
+syn keyword schemeSyntax define-record
+syn keyword schemeSyntax set!-values
+syn keyword schemeSyntax fluid-let
+syn keyword schemeSyntax let-optionals
+syn keyword schemeSyntax let-optionals*
+syn keyword schemeSyntax letrec-values
+syn keyword schemeSyntax nth-value
+syn keyword schemeSyntax receive
+
+syn keyword schemeLibrarySyntax declare
+syn keyword schemeLibrarySyntax define-interface
+syn keyword schemeLibrarySyntax functor
+syn keyword schemeLibrarySyntax include-relative
+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 match
+syn keyword schemeExtraSyntax match-lambda
+syn keyword schemeExtraSyntax match-lambda*
+syn keyword schemeExtraSyntax match-let
+syn keyword schemeExtraSyntax match-let*
+syn keyword schemeExtraSyntax match-letrec
+
+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
new file mode 100644
index 0000000..f3c66c2
--- /dev/null
+++ b/runtime/syntax/chill.vim
@@ -0,0 +1,178 @@
+" Vim syntax file
+" Language: CHILL
+" Maintainer: YoungSang Yoon <image@lgic.co.kr>
+" Last change: 2004 Jan 21
+"
+
+" first created by image@lgic.co.kr & modified by paris@lgic.co.kr
+
+" CHILL (CCITT High Level Programming Language) is used for
+" developing software of ATM switch at LGIC (LG Information
+" & Communications LTd.)
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A bunch of useful CHILL keywords
+syn keyword chillStatement goto GOTO return RETURN returns RETURNS
+syn keyword chillLabel CASE case ESAC esac
+syn keyword chillConditional if IF else ELSE elsif ELSIF switch SWITCH THEN then FI fi
+syn keyword chillLogical NOT not
+syn keyword chillRepeat while WHILE for FOR do DO od OD TO to
+syn keyword chillProcess START start STACKSIZE stacksize PRIORITY priority THIS this STOP stop
+syn keyword chillBlock PROC proc PROCESS process
+syn keyword chillSignal RECEIVE receive SEND send NONPERSISTENT nonpersistent PERSISTENT peristent SET set EVER ever
+
+syn keyword chillTodo contained TODO FIXME XXX
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match chillSpecial contained "\\x\x\+\|\\\o\{1,3\}\|\\.\|\\$"
+syn region chillString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=chillSpecial
+syn match chillCharacter "'[^\\]'"
+syn match chillSpecialCharacter "'\\.'"
+syn match chillSpecialCharacter "'\\\o\{1,3\}'"
+
+"when wanted, highlight trailing white space
+if exists("chill_space_errors")
+ syn match chillSpaceError "\s*$"
+ syn match chillSpaceError " \+\t"me=e-1
+endif
+
+"catch errors caused by wrong parenthesis
+syn cluster chillParenGroup contains=chillParenError,chillIncluded,chillSpecial,chillTodo,chillUserCont,chillUserLabel,chillBitField
+syn region chillParen transparent start='(' end=')' contains=ALLBUT,@chillParenGroup
+syn match chillParenError ")"
+syn match chillInParen contained "[{}]"
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match chillNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+"floating point number, with dot, optional exponent
+syn match chillFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, starting with a dot, optional exponent
+syn match chillFloat "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match chillFloat "\<\d\+e[-+]\=\d\+[fl]\=\>"
+"hex number
+syn match chillNumber "\<0x\x\+\(u\=l\=\|lu\)\>"
+"syn match chillIdentifier "\<[a-z_][a-z0-9_]*\>"
+syn case match
+" flag an octal number with wrong digits
+syn match chillOctalError "\<0\o*[89]"
+
+if exists("chill_comment_strings")
+ " A comment can contain chillString, chillCharacter and chillNumber.
+ " But a "*/" inside a chillString in a chillComment DOES end the comment! So we
+ " need to use a special type of chillString: chillCommentString, 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 chillCommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region chillCommentString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=chillSpecial,chillCommentSkip
+ syntax region chillComment2String contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=chillSpecial
+ syntax region chillComment start="/\*" end="\*/" contains=chillTodo,chillCommentString,chillCharacter,chillNumber,chillFloat,chillSpaceError
+ syntax match chillComment "//.*" contains=chillTodo,chillComment2String,chillCharacter,chillNumber,chillSpaceError
+else
+ syn region chillComment start="/\*" end="\*/" contains=chillTodo,chillSpaceError
+ syn match chillComment "//.*" contains=chillTodo,chillSpaceError
+endif
+syntax match chillCommentError "\*/"
+
+syn keyword chillOperator SIZE size
+syn keyword chillType dcl DCL int INT char CHAR bool BOOL REF ref LOC loc INSTANCE instance
+syn keyword chillStructure struct STRUCT enum ENUM newmode NEWMODE synmode SYNMODE
+"syn keyword chillStorageClass
+syn keyword chillBlock PROC proc END end
+syn keyword chillScope GRANT grant SEIZE seize
+syn keyword chillEDML select SELECT delete DELETE update UPDATE in IN seq SEQ WHERE where INSERT insert include INCLUDE exclude EXCLUDE
+syn keyword chillBoolConst true TRUE false FALSE
+
+syn region chillPreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=chillComment,chillString,chillCharacter,chillNumber,chillCommentError,chillSpaceError
+syn region chillIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match chillIncluded contained "<[^>]*>"
+syn match chillInclude "^\s*#\s*include\>\s*["<]" contains=chillIncluded
+"syn match chillLineSkip "\\$"
+syn cluster chillPreProcGroup contains=chillPreCondit,chillIncluded,chillInclude,chillDefine,chillInParen,chillUserLabel
+syn region chillDefine start="^\s*#\s*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,@chillPreProcGroup
+syn region chillPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,@chillPreProcGroup
+
+" Highlight User Labels
+syn cluster chillMultiGroup contains=chillIncluded,chillSpecial,chillTodo,chillUserCont,chillUserLabel,chillBitField
+syn region chillMulti transparent start='?' end=':' contains=ALLBUT,@chillMultiGroup
+" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
+syn match chillUserCont "^\s*\I\i*\s*:$" contains=chillUserLabel
+syn match chillUserCont ";\s*\I\i*\s*:$" contains=chillUserLabel
+syn match chillUserCont "^\s*\I\i*\s*:[^:]"me=e-1 contains=chillUserLabel
+syn match chillUserCont ";\s*\I\i*\s*:[^:]"me=e-1 contains=chillUserLabel
+
+syn match chillUserLabel "\I\i*" contained
+
+" Avoid recognizing most bitfields as labels
+syn match chillBitField "^\s*\I\i*\s*:\s*[1-9]"me=e-1
+syn match chillBitField ";\s*\I\i*\s*:\s*[1-9]"me=e-1
+
+syn match chillBracket contained "[<>]"
+if !exists("chill_minlines")
+ let chill_minlines = 15
+endif
+exec "syn sync ccomment chillComment minlines=" . chill_minlines
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/chordpro.vim b/runtime/syntax/chordpro.vim
new file mode 100644
index 0000000..41a0a1e
--- /dev/null
+++ b/runtime/syntax/chordpro.vim
@@ -0,0 +1,173 @@
+" Vim syntax file
+" Language: ChordPro 6 (https://www.chordpro.org)
+" Maintainer: Niels Bo Andersen <niels@niboan.dk>
+" Last Change: 2022-04-15
+
+" 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
+
+" Include embedded abc syntax
+syn include @Abc syntax/abc.vim
+
+" Lilypond and Pango syntaxes could be embedded as well, but they are not
+" available in the distribution.
+
+" Directives without arguments
+syn keyword chordproDirective contained nextgroup=chordproConditional
+ \ new_song ns
+ \ start_of_chorus soc
+ \ chorus
+ \ start_of_verse sov
+ \ start_of_bridge sob
+ \ start_of_tab sot
+ \ start_of_grid sog
+ \ start_of_abc
+ \ start_of_ly
+ \ end_of_chorus eoc
+ \ end_of_verse eov
+ \ end_of_bridge eob
+ \ end_of_tab eot
+ \ end_of_grid eog
+ \ end_of_abc
+ \ end_of_ly
+ \ new_page np
+ \ new_physical_page npp
+ \ column_break cb
+ \ grid g
+ \ no_grid ng
+ \ transpose
+ \ chordfont cf chordsize cs chordcolour
+ \ footerfont footersize footercolour
+ \ gridfont gridsize gridcolour
+ \ tabfont tabsize tabcolour
+ \ tocfont tocsize toccolour
+ \ textfont tf textsize ts textcolour
+ \ titlefont titlesize titlecolour
+
+" Directives with arguments. Some directives are in both groups, as they can
+" be used both with and without arguments
+syn keyword chordproDirWithArg contained nextgroup=chordproConditional
+ \ title t
+ \ subtitle st
+ \ sorttitle
+ \ artist
+ \ composer
+ \ lyricist
+ \ arranger
+ \ copyright
+ \ album
+ \ year
+ \ key
+ \ time
+ \ tempo
+ \ duration
+ \ capo
+ \ comment c
+ \ highlight
+ \ comment_italic ci
+ \ comment_box cb
+ \ image
+ \ start_of_chorus soc
+ \ chorus
+ \ start_of_verse sov
+ \ start_of_bridge sob
+ \ start_of_tab sot
+ \ start_of_grid sog
+ \ start_of_abc
+ \ start_of_ly
+ \ define
+ \ chord
+ \ transpose
+ \ chordfont cf chordsize cs chordcolour
+ \ footerfont footersize footercolour
+ \ gridfont gridsize gridcolour
+ \ tabfont tabsize tabcolour
+ \ tocfont tocsize toccolour
+ \ textfont tf textsize ts textcolour
+ \ titlefont titlesize titlecolour
+ \ pagetype
+ \ titles
+ \ columns col
+
+syn keyword chordproMetaKeyword contained meta
+syn keyword chordproMetadata contained title sorttitle subtitle artist composer lyricist arranger copyright album year key time tempo duration capo
+syn keyword chordproStandardMetadata contained songindex page pages pagerange today tuning instrument user
+syn match chordproStandardMetadata /instrument\.type/ contained
+syn match chordproStandardMetadata /instrument\.description/ contained
+syn match chordproStandardMetadata /user\.name/ contained
+syn match chordproStandardMetadata /user\.fullname/ contained
+
+syn keyword chordproDefineKeyword contained frets fingers
+syn match chordproDefineKeyword /base-fret/ contained
+
+syn match chordproArgumentsNumber /\d\+/ contained
+
+syn match chordproCustom /x_\w\+/ contained
+
+syn match chordproDirMatch /{\w\+\(-\w\+\)\?}/ contains=chordproDirective contained transparent
+syn match chordproDirArgMatch /{\w\+\(-\w\+\)\?[: ]/ contains=chordproDirWithArg contained transparent
+syn match chordproMetaMatch /{meta\(-\w\+\)\?[: ]\+\w\+/ contains=chordproMetaKeyword,chordproMetadata contained transparent
+syn match chordproCustomMatch /{x_\w\+\(-\w\+\)\?[: ]/ contains=chordproCustom contained transparent
+
+syn match chordproConditional /-\w\+/ contained
+
+syn match chordproMetaDataOperator /[=|]/ contained
+syn match chordproMetaDataValue /%{\w*/ contains=chordproMetaData,chordproStandardMetadata contained transparent
+" Handles nested metadata tags, but the end of the containing chordproTag is
+" not highlighted correctly, if there are more than two levels of nesting
+syn region chordproMetaDataTag start=/%{\w*/ skip=/%{[^}]*}/ end=/}/ contains=chordproMetaDataValue,chordproMetaDataOperator,chordproMetadataTag contained
+
+syn region chordproArguments start=/{\w\+\(-\w\+\)\?[: ]/hs=e+1 skip=/%{[^}]*}/ end=/}/he=s-1 contains=chordproDirArgMatch,chordproArgumentsNumber,chordproMetaDataTag contained
+syn region chordproArguments start=/{\(define\|chord\)\(-\w\+\)\?[: ]/hs=e+1 end=/}/he=s-1 contains=chordproDirArgMatch,chordproDefineKeyword,chordproArgumentsNumber contained
+syn region chordproArguments start=/{meta\(-\w\+\)\?[: ]/hs=e+1 skip=/%{[^}]*}/ end=/}/he=s-1 contains=chordproMetaMatch,chordproMetaDataTag contained
+syn region chordproArguments start=/{x_\w\+\(-\w\+\)\?[: ]/hs=e+1 end=/}/he=s-1 contains=chordproCustomMatch contained
+
+syn region chordproTag start=/{/ skip=/%{[^}]*}/ end=/}/ contains=chordproDirMatch,chordproArguments oneline
+
+syn region chordproChord matchgroup=chordproBracket start=/\[/ end=/]/ oneline
+
+syn region chordproAnnotation matchgroup=chordproBracket start=/\[\*/ end=/]/ oneline
+
+syn region chordproTab start=/{start_of_tab\(-\w\+\)\?\([: ].\+\)\?}\|{sot\(-\w\+\)\?\([: ].\+\)\?}/hs=e+1 end=/{end_of_tab}\|{eot}/me=s-1 contains=chordproTag,chordproComment keepend
+
+syn region chordproChorus start=/{start_of_chorus\(-\w\+\)\?\([: ].\+\)\?}\|{soc\(-\w\+\)\?\([: ].\+\)\?}/hs=e+1 end=/{end_of_chorus}\|{eoc}/me=s-1 contains=chordproTag,chordproChord,chordproAnnotation,chordproComment keepend
+
+syn region chordproBridge start=/{start_of_bridge\(-\w\+\)\?\([: ].\+\)\?}\|{sob\(-\w\+\)\?\([: ].\+\)\?}/hs=e+1 end=/{end_of_bridge}\|{eob}/me=s-1 contains=chordproTag,chordproChord,chordproAnnotation,chordproComment keepend
+
+syn region chordproAbc start=/{start_of_abc\(-\w\+\)\?\([: ].\+\)\?}/hs=e+1 end=/{end_of_abc}/me=s-1 contains=chordproTag,@Abc keepend
+
+syn match chordproComment /^#.*/
+
+" Define the default highlighting.
+hi def link chordproDirective Statement
+hi def link chordproDirWithArg Statement
+hi def link chordproConditional Statement
+hi def link chordproCustom Statement
+hi def link chordproMetaKeyword Statement
+hi def link chordproMetaDataOperator Operator
+hi def link chordproMetaDataTag Function
+hi def link chordproArguments Special
+hi def link chordproArgumentsNumber Number
+hi def link chordproChord Type
+hi def link chordproAnnotation Identifier
+hi def link chordproTag Constant
+hi def link chordproTab PreProc
+hi def link chordproComment Comment
+hi def link chordproBracket Constant
+hi def link chordproDefineKeyword Identifier
+hi def link chordproMetadata Identifier
+hi def link chordproStandardMetadata Identifier
+hi def chordproChorus term=bold cterm=bold gui=bold
+hi def chordproBridge term=italic cterm=italic gui=italic
+
+let b:current_syntax = "chordpro"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/cl.vim b/runtime/syntax/cl.vim
new file mode 100644
index 0000000..b765682
--- /dev/null
+++ b/runtime/syntax/cl.vim
@@ -0,0 +1,98 @@
+" Vim syntax file
+" Language: CL
+" (pronounced alphabetically: "Cee-El".
+" CL stands for Clever Language,
+" but the language is CL, not "Clever".
+" CL was created by Multibase, http://www.mbase.com.au)
+" Filename extensions: *.ent
+" *.eni
+" Maintainer: Philip Uren <philuSPAX@ieee.org> Remove SPAX spam block
+" Version: 6
+" Last Change: Mar 06 2013
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=@,48-57,_,-
+
+syn case ignore
+
+syn sync lines=300
+
+"If/else/elsif/endif and while/wend mismatch errors
+syn match clifError "\<wend\>"
+syn match clifError "\<elsif\>"
+syn match clifError "\<else\>"
+syn match clifError "\<endif\>"
+
+syn match clSpaceError "\s\+$"
+
+" If and while regions
+syn region clLoop transparent matchgroup=clWhile start="\<while\>" matchgroup=clWhile end="\<wend\>" contains=ALLBUT,clBreak,clProcedure
+syn region clIf transparent matchgroup=clConditional start="\<if\>" matchgroup=clConditional end="\<endif\>" contains=ALLBUT,clBreak,clProcedure
+
+" Make those TODO notes and debugging stand out!
+syn keyword clTodo contained TODO BUG DEBUG FIX
+syn match clNeedsWork contained "NEED[S]*\s\s*WORK"
+syn keyword clDebug contained debug
+
+syn match clComment "#.*$" contains=clTodo,clNeedsWork,@Spell
+syn region clProcedure oneline start="^\s*[{}]" end="$"
+syn match clInclude "^\s*include\s.*"
+
+" We don't put "debug" in the clSetOptions;
+" we contain it in clSet so we can make it stand out.
+syn keyword clSetOptions transparent aauto abort align convert E fill fnum goback hangup justify null_exit output rauto rawprint rawdisplay repeat skip tab trim
+syn match clSet "^\s*set\s.*" contains=clSetOptions,clDebug
+
+syn match clPreProc "^\s*#P.*"
+
+syn keyword clConditional else elsif
+syn keyword clWhile continue endloop
+" 'break' needs to be a region so we can sync on it above.
+syn region clBreak oneline start="^\s*break" end="$"
+
+syn match clOperator "[!;|)(:.><+*=-]"
+
+syn match clNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+
+syn region clString matchgroup=clQuote start=+"+ end=+"+ skip=+\\"+ contains=@Spell
+syn region clString matchgroup=clQuote start=+'+ end=+'+ skip=+\\'+ contains=@Spell
+
+syn keyword clReserved ERROR EXIT INTERRUPT LOCKED LREPLY MODE MCOL MLINE MREPLY NULL REPLY V1 V2 V3 V4 V5 V6 V7 V8 V9 ZERO BYPASS GOING_BACK AAUTO ABORT ABORT ALIGN BIGE CONVERT FNUM GOBACK HANGUP JUSTIFY NEXIT OUTPUT RAUTO RAWDISPLAY RAWPRINT REPEAT SKIP TAB TRIM LCOUNT PCOUNT PLINES SLINES SCOLS MATCH LMATCH
+
+syn keyword clFunction asc asize chr name random slen srandom day getarg getcgi getenv lcase scat sconv sdel skey smult srep substr sword trim ucase match
+
+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.
+" 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"
+
+" vim: ts=8 sw=8
diff --git a/runtime/syntax/clean.vim b/runtime/syntax/clean.vim
new file mode 100644
index 0000000..70bf654
--- /dev/null
+++ b/runtime/syntax/clean.vim
@@ -0,0 +1,90 @@
+" Vim syntax file
+" Language: Clean
+" Author: Pieter van Engelen <pietere@sci.kun.nl>
+" Co-Author: Arthur van Leeuwen <arthurvl@sci.kun.nl>
+" Last Change: 2013 Oct 15 by Jurriën Stutterheim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Some Clean-keywords
+syn keyword cleanConditional if case
+syn keyword cleanLabel let! with where in of
+syn keyword cleanSpecial Start
+syn keyword cleanKeyword infixl infixr infix
+syn keyword cleanBasicType Int Real Char Bool String
+syn keyword cleanSpecialType World ProcId Void Files File
+syn keyword cleanModuleSystem module implementation definition system
+syn keyword cleanTypeClass class instance export
+
+" Import highlighting
+syn region cleanIncludeRegion start="^\s*\(from\|import\|\s\+\(as\|qualified\)\)" end="\n" contains=cleanIncludeKeyword keepend
+syn keyword cleanIncludeKeyword contained from import as qualified
+
+" To do some Denotation Highlighting
+syn keyword cleanBoolDenot True False
+syn region cleanStringDenot start=+"+ skip=+\(\(\\\\\)\+\|\\"\)+ end=+"+ display
+syn match cleanCharDenot "'\(\\\\\|\\'\|[^'\\]\)\+'" display
+syn match cleanIntegerDenot "[\~+-]\?\<\(\d\+\|0[0-7]\+\|0x[0-9A-Fa-f]\+\)\>" display
+syn match cleanRealDenot "[\~+-]\?\d\+\.\d\+\(E[\~+-]\?\d\+\)\?" display
+
+" To highlight the use of lists, tuples and arrays
+syn region cleanList start="\[" end="\]" contains=ALL
+syn region cleanRecord start="{" end="}" contains=ALL
+syn region cleanArray start="{:" end=":}" contains=ALL
+syn match cleanTuple "([^=]*,[^=]*)" contains=ALL
+
+" To do some Comment Highlighting
+syn region cleanComment start="/\*" end="\*/" contains=cleanComment,cleanTodo fold
+syn region cleanComment start="//.*" end="$" display contains=cleanTodo
+syn keyword cleanTodo TODO FIXME XXX contained
+
+" Now for some useful type definition recognition
+syn match cleanFuncTypeDef "\([a-zA-Z].*\|(\=[-~@#$%^?!+*<>\/|&=:]\+)\=\)\s*\(infix[lr]\=\)\=\s*\d\=\s*::.*->.*" contains=cleanSpecial,cleanBasicType,cleanSpecialType,cleanKeyword
+
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+ " 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
+
+
+let b:current_syntax = "clean"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=4
diff --git a/runtime/syntax/clipper.vim b/runtime/syntax/clipper.vim
new file mode 100644
index 0000000..203f9f0
--- /dev/null
+++ b/runtime/syntax/clipper.vim
@@ -0,0 +1,135 @@
+" Vim syntax file:
+" Language: Clipper 5.2 & FlagShip
+" Maintainer: C R Zamana <zamana@zip.net>
+" Some things based on c.vim by Bram Moolenaar and pascal.vim by Mario Eusebio
+" Last Change: 2011 Dec 29 by Thilo Six
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Exceptions for my "Very Own" (TM) user variables naming style.
+" If you don't like this, comment it
+syn match clipperUserVariable "\<[a,b,c,d,l,n,o,u,x][A-Z][A-Za-z0-9_]*\>"
+syn match clipperUserVariable "\<[a-z]\>"
+
+" Clipper is case insensitive ( see "exception" above )
+syn case ignore
+
+" Clipper keywords ( in no particular order )
+syn keyword clipperStatement ACCEPT APPEND BLANK FROM AVERAGE CALL CANCEL
+syn keyword clipperStatement CLEAR ALL GETS MEMORY TYPEAHEAD CLOSE
+syn keyword clipperStatement COMMIT CONTINUE SHARED NEW PICT
+syn keyword clipperStatement COPY FILE STRUCTURE STRU EXTE TO COUNT
+syn keyword clipperStatement CREATE FROM NIL
+syn keyword clipperStatement DELETE FILE DIR DISPLAY EJECT ERASE FIND GO
+syn keyword clipperStatement INDEX INPUT VALID WHEN
+syn keyword clipperStatement JOIN KEYBOARD LABEL FORM LIST LOCATE MENU TO
+syn keyword clipperStatement NOTE PACK QUIT READ
+syn keyword clipperStatement RECALL REINDEX RELEASE RENAME REPLACE REPORT
+syn keyword clipperStatement RETURN FORM RESTORE
+syn keyword clipperStatement RUN SAVE SEEK SELECT
+syn keyword clipperStatement SKIP SORT STORE SUM TEXT TOTAL TYPE UNLOCK
+syn keyword clipperStatement UPDATE USE WAIT ZAP
+syn keyword clipperStatement BEGIN SEQUENCE
+syn keyword clipperStatement SET ALTERNATE BELL CENTURY COLOR CONFIRM CONSOLE
+syn keyword clipperStatement CURSOR DATE DECIMALS DEFAULT DELETED DELIMITERS
+syn keyword clipperStatement DEVICE EPOCH ESCAPE EXACT EXCLUSIVE FILTER FIXED
+syn keyword clipperStatement FORMAT FUNCTION INTENSITY KEY MARGIN MESSAGE
+syn keyword clipperStatement ORDER PATH PRINTER PROCEDURE RELATION SCOREBOARD
+syn keyword clipperStatement SOFTSEEK TYPEAHEAD UNIQUE WRAP
+syn keyword clipperStatement BOX CLEAR GET PROMPT SAY ? ??
+syn keyword clipperStatement DELETE TAG GO RTLINKCMD TMP DBLOCKINFO
+syn keyword clipperStatement DBEVALINFO DBFIELDINFO DBFILTERINFO DBFUNCTABLE
+syn keyword clipperStatement DBOPENINFO DBORDERCONDINFO DBORDERCREATEINF
+syn keyword clipperStatement DBORDERINFO DBRELINFO DBSCOPEINFO DBSORTINFO
+syn keyword clipperStatement DBSORTITEM DBTRANSINFO DBTRANSITEM WORKAREA
+
+" Conditionals
+syn keyword clipperConditional CASE OTHERWISE ENDCASE
+syn keyword clipperConditional IF ELSE ENDIF IIF IFDEF IFNDEF
+
+" Loops
+syn keyword clipperRepeat DO WHILE ENDDO
+syn keyword clipperRepeat FOR TO NEXT STEP
+
+" Visibility
+syn keyword clipperStorageClass ANNOUNCE STATIC
+syn keyword clipperStorageClass DECLARE EXTERNAL LOCAL MEMVAR PARAMETERS
+syn keyword clipperStorageClass PRIVATE PROCEDURE PUBLIC REQUEST STATIC
+syn keyword clipperStorageClass FIELD FUNCTION
+syn keyword clipperStorageClass EXIT PROCEDURE INIT PROCEDURE
+
+" Operators
+syn match clipperOperator "$\|%\|&\|+\|-\|->\|!"
+syn match clipperOperator "\.AND\.\|\.NOT\.\|\.OR\."
+syn match clipperOperator ":=\|<\|<=\|<>\|!=\|#\|=\|==\|>\|>=\|@"
+syn match clipperOperator "*"
+
+" Numbers
+syn match clipperNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+
+" Includes
+syn region clipperIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match clipperIncluded contained "<[^>]*>"
+syn match clipperInclude "^\s*#\s*include\>\s*["<]" contains=clipperIncluded
+
+" String and Character constants
+syn region clipperString start=+"+ end=+"+
+syn region clipperString start=+'+ end=+'+
+
+" Delimiters
+syn match ClipperDelimiters "[()]\|[\[\]]\|[{}]\|[||]"
+
+" Special
+syn match clipperLineContinuation ";"
+
+" This is from Bram Moolenaar:
+if exists("c_comment_strings")
+ " A comment can contain cString, cCharacter and cNumber.
+ " But a "*/" inside a cString in a clipperComment DOES end the comment!
+ " So we need to use a special type of cString: clipperCommentString, 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 clipperCommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region clipperCommentString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=clipperCommentSkip
+ syntax region clipperComment2String contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$"
+ syntax region clipperComment start="/\*" end="\*/" contains=clipperCommentString,clipperCharacter,clipperNumber,clipperString
+ syntax match clipperComment "//.*" contains=clipperComment2String,clipperCharacter,clipperNumber
+else
+ syn region clipperComment start="/\*" end="\*/"
+ syn match clipperComment "//.*"
+endif
+syntax match clipperCommentError "\*/"
+
+" Lines beggining with an "*" are comments too
+syntax match clipperComment "^\*.*"
+
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/clojure.vim b/runtime/syntax/clojure.vim
new file mode 100644
index 0000000..0d63728
--- /dev/null
+++ b/runtime/syntax/clojure.vim
@@ -0,0 +1,218 @@
+" Vim indent file
+" Language: Clojure
+" Maintainer: Alex Vear <alex@vear.uk>
+" Former Maintainers: Sung Pae <self@sungpae.com>
+" Meikel Brandmeyer <mb@kotka.de>
+" Toralf Wittner <toralf.wittner@gmail.com>
+" Contributors: Joel Holdbrooks <cjholdbrooks@gmail.com> (Regexp support, bug fixes)
+" URL: https://github.com/clojure-vim/clojure.vim
+" License: Vim (see :h license)
+" Last Change: 2022-03-24
+
+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/clojure-vim/clojure.vim/blob/fd280e33e84c88e97860930557dba3ff80b1a82d/clj/src/vim_clojure_static/generate.clj
+" Clojure version 1.11.0
+let s:clojure_syntax_keywords = {
+ \ 'clojureBoolean': ["false","true"],
+ \ 'clojureCond': ["case","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","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","def","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","deftype*"],
+ \ 'clojureException': ["catch","finally","throw","try"],
+ \ 'clojureFunc': ["*","*'","+","+'","-","-'","->ArrayChunk","->Eduction","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods","/","<","<=","=","==",">",">=","NaN?","PrintWriter-on","StackTraceElement->vec","Throwable->map","abs","accessor","aclone","add-classpath","add-tap","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","ancestors","any?","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","boolean?","booleans","bound-fn*","bound?","bounded-count","butlast","byte","byte-array","bytes","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/NaN?","clojure.core/PrintWriter-on","clojure.core/StackTraceElement->vec","clojure.core/Throwable->map","clojure.core/abs","clojure.core/accessor","clojure.core/aclone","clojure.core/add-classpath","clojure.core/add-tap","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/any?","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/boolean?","clojure.core/booleans","clojure.core/bound-fn*","clojure.core/bound?","clojure.core/bounded-count","clojure.core/butlast","clojure.core/byte","clojure.core/byte-array","clojure.core/bytes","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/double?","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-cause","clojure.core/ex-data","clojure.core/ex-info","clojure.core/ex-message","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/halt-when","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/ident?","clojure.core/identical?","clojure.core/identity","clojure.core/ifn?","clojure.core/in-ns","clojure.core/inc","clojure.core/inc'","clojure.core/indexed?","clojure.core/infinite?","clojure.core/init-proxy","clojure.core/inst-ms","clojure.core/inst-ms*","clojure.core/inst?","clojure.core/instance?","clojure.core/int","clojure.core/int-array","clojure.core/int?","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/iteration","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/nat-int?","clojure.core/neg-int?","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/parse-boolean","clojure.core/parse-double","clojure.core/parse-long","clojure.core/parse-uuid","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-int?","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/qualified-ident?","clojure.core/qualified-keyword?","clojure.core/qualified-symbol?","clojure.core/quot","clojure.core/rand","clojure.core/rand-int","clojure.core/rand-nth","clojure.core/random-sample","clojure.core/random-uuid","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+string","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-tap","clojure.core/remove-watch","clojure.core/repeat","clojure.core/repeatedly","clojure.core/replace","clojure.core/replicate","clojure.core/require","clojure.core/requiring-resolve","clojure.core/reset!","clojure.core/reset-meta!","clojure.core/reset-vals!","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-to-map-for-destructuring","clojure.core/seq?","clojure.core/seqable?","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/simple-ident?","clojure.core/simple-keyword?","clojure.core/simple-symbol?","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/swap-vals!","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/tap>","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-keys","clojure.core/update-proxy","clojure.core/update-vals","clojure.core/uri?","clojure.core/use","clojure.core/uuid?","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","double?","doubles","drop","drop-last","drop-while","eduction","empty","empty?","ensure","ensure-reduced","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-cause","ex-data","ex-info","ex-message","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","halt-when","hash","hash-combine","hash-map","hash-ordered-coll","hash-set","hash-unordered-coll","ident?","identical?","identity","ifn?","in-ns","inc","inc'","indexed?","infinite?","init-proxy","inst-ms","inst-ms*","inst?","instance?","int","int-array","int?","integer?","interleave","intern","interpose","into","into-array","ints","isa?","iterate","iteration","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","nat-int?","neg-int?","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","parse-boolean","parse-double","parse-long","parse-uuid","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop","pop!","pop-thread-bindings","pos-int?","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","qualified-ident?","qualified-keyword?","qualified-symbol?","quot","rand","rand-int","rand-nth","random-sample","random-uuid","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read+string","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-tap","remove-watch","repeat","repeatedly","replace","replicate","require","requiring-resolve","reset!","reset-meta!","reset-vals!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","run!","satisfies?","second","select-keys","send","send-off","send-via","seq","seq-to-map-for-destructuring","seq?","seqable?","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","simple-ident?","simple-keyword?","simple-symbol?","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!","swap-vals!","symbol","symbol?","tagged-literal","tagged-literal?","take","take-last","take-nth","take-while","tap>","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-keys","update-proxy","update-vals","uri?","use","uuid?","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/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","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/loop","clojure.core/while","doseq","dotimes","loop","loop*","recur","while"],
+ \ 'clojureSpecial': ["&",".","clojure.core/fn","clojure.core/import*","clojure.core/let","clojure.core/letfn","do","fn","fn*","let","let*","letfn","letfn*","monitor-enter","monitor-exit","new","quote","reify*","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-namespace-maps*","*print-readably*","*read-eval*","*reader-resolver*","*source-path*","*suppress-read*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","EMPTY-NODE","Inst","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-namespace-maps*","clojure.core/*print-readably*","clojure.core/*read-eval*","clojure.core/*reader-resolver*","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/Inst","clojure.core/char-escape-string","clojure.core/char-name-string","clojure.core/default-data-readers","clojure.core/primitives-classnames","clojure.core/print-dup","clojure.core/print-method","clojure.core/unquote","clojure.core/unquote-splicing","default-data-readers","primitives-classnames","print-dup","print-method","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&&[^/]][^/]*)");
+" But they:
+" * Must not end in a : or /
+" * Must not have two adjacent colons except at the beginning
+" * Must not contain any reader metacharacters except for ' and #
+syntax match clojureKeyword "\v<:{1,2}([^ \n\r\t()\[\]{}";@^`~\\/]+/)*[^ \n\r\t()\[\]{}";@^`~\\/]+:@1<!>"
+
+syntax match clojureStringEscape "\v\\%([\\btnfr"]|u\x{4}|[0-3]\o{2}|\o{1,2})" contained
+
+syntax region clojureString matchgroup=clojureStringDelimiter start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=clojureStringEscape,@Spell
+
+syntax match clojureCharacter "\v\\%(o%([0-3]\o{2}|\o{1,2})|u\x{4}|newline|tab|space|return|backspace|formfeed|.)"
+
+syntax match clojureSymbol "\v%([a-zA-Z!$&*_+=|<.>?-]|[^\x00-\x7F])+%(:?%([a-zA-Z0-9!#$%&*_+=|'<.>/?-]|[^\x00-\x7F]))*[#:]@1<!"
+
+" NB. Correct matching of radix literals was removed for better performance.
+syntax match clojureNumber "\v<[-+]?%(%([2-9]|[12]\d|3[0-6])[rR][[:alnum:]]+|%(0\o*|0x\x+|[1-9]\d*)N?|%(0|[1-9]\d*|%(0|[1-9]\d*)\.\d*)%(M|[eE][-+]?\d+)?|%(0|[1-9]\d*)/%(0|[1-9]\d*))>"
+
+syntax match clojureQuote "\v['`]"
+syntax match clojureUnquote "\v\~\@?"
+syntax match clojureMeta "\^"
+syntax match clojureDeref "@"
+syntax match clojureDispatch "\v#[\^'=<_]?"
+
+" 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
+syntax region clojureRegexpQuoted start=/\\Q/ms=e+1 skip=/\\\\\|\\"/ end=/\\E/me=s-1 end=/"/me=s-1 contained
+syntax region clojureRegexpQuote start=/\\Q/ skip=/\\\\\|\\"/ end=/\\E/ end=/"/me=s-1 contains=clojureRegexpQuoted keepend contained
+
+" -*- CHARACTER PROPERTY CLASSES -*-
+" Generated from https://github.com/clojure-vim/clojure.vim/blob/fd280e33e84c88e97860930557dba3ff80b1a82d/clj/src/vim_clojure_static/generate.clj
+" Java version 17.0.2
+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|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\=)%(k%(its|h%(oj%(ki)?|m%(r|er)|itan_small_script|udawadi|ar%(oshthi)?)|a%(li|n%(a|nada)|takana%(_or_hiragana)?|yah_li|ithi)|nda|thi)|r%(ohg|un%(ic|r)|ejang|jng)|l%(epc%(ha)?|i%(mbu?|n%([ab]|ear_[ab])|su)|y%([dc]i%(an)?)|a%(t%(n|in)|na|oo?))|t%(elu%(gu)?|ha%(i|a%(na)?)|i%(finagh|rh%(uta)?|b%(t|etan))|fng|glg|a%(i_%(le|tham|viet)|g%(alog|b%(anwa)?)|vt|kri?|ng%(ut)?|l[ue]|m%(il|l)))|vaii?|y%(i%(ii)?|ezi%(di)?)|e%(thi%(opic)?|l%(ym%(aic)?|ba%(san)?)|gyp%(tian_hieroglyphs)?)|u%(gar%(itic)?|nknown)|h%(ung|ira%(gana)?|rkt|mn[gp]|a%(n%(i%(fi_rohingya)?|unoo|o|g%(ul)?)?|tr%(an)?)|luw|ebr%(ew)?)|g%(r%(e%(k|ek)|an%(tha)?)|lag%(olitic)?|eor%(gian)?|o%(n[mg]|th%(ic)?)|u%(j%(arati|r)|r%(u|mukhi)|njala_gondi))|m%(lym|a%(n%(d%(aic)?|i%(chaean)?)|saram_gondi|h%(ajani|j)|ka%(sar)?|rc%(hen)?|layalam)|o%(di|ng%(olian)?)|e%(r%(c|o%(itic_%(hieroglyphs|cursive))?)|etei_mayek|nd%(e_kikakui)?|d%(f|efaidrin))|roo?|y%(anmar|mr)|tei|iao|ult%(ani)?)|d%(upl%(oyan)?|srt|i%(ak|ves_akuru)|ogra?|e%(seret|va%(nagari)?))|z%(an%(abazar_square|b)|inh|yyy|zzz)|n%(yiakeng_puachue_hmong|bat|koo?|ew%(_tai_lue|a)|ushu|shu|a%(bataean|rb|nd%(inagari)?))|s%(h%(rd|a%(vian|rada|w))|o%(yo%(mbo)?|g%(d%(ian)?|o)|ra%(_sompeng)?)|i%(n%(d|h%(ala)?)|dd%(ham)?|gnwriting)|a%(ur%(ashtra)?|m%(r|aritan)|rb)|y%(r%(c|iac)|lo%(ti_nagri)?)|und%(anese)?|gnw)|w%(cho|a%(ncho|ra%(ng_citi)?))|c%(y%(priot|r%(l|illic))|h%(er%(okee)?|a%(m|kma)|rs|orasmian)|a%(km|ucasian_albanian|n%(adian_aboriginal|s)|ri%(an)?)|prt|uneiform|o%(pt%(ic)?|mmon))|i%(n%(scriptional_pa%(rthian|hlavi)|herited)|mperial_aramaic|tal)|p%(h%(l[ip]|oenician|ag%(s_pa)?|nx)|a%(lm%(yrene)?|u%(_cin_hau|c)|hawh_hmong)|rti|salter_pahlavi|lrd|erm)|x%(peo|sux)|b%(eng%(ali)?|ra%(i%(lle)?|h%(mi)?)|opo%(mofo)?|u%(gi%(nese)?|h%(d|id))|h%(ks|aiksuki)|a%(ss%(a_vah)?|t%(ak|k)|li%(nese)?|mum?))|java%(nese)?|o%(g%(am|ham)|s%(age|ge|ma%(nya)?)|l%(d_%(hungarian|north_arabian|so%(gdian|uth_arabian)|per%(mic|sian)|italic|turkic)|ck|_chiki)|r%(iya|kh|ya))|a%(r%(ab%(ic)?|m%([ni]|enian))|dl%(m|am)|natolian_hieroglyphs|hom|v%(st|estan)|ghb))\}" contained display
+syntax match clojureRegexpUnicodeCharClass "\v\\[pP]\{\c%(In|blk\=|block\=)%(zanabazar%([ _]square|square)|javanese|h%(a%(lfwidth%( and fullwidth forms|andfullwidthforms|_and_fullwidth_forms)|tran|n%(unoo|gul%(compatibilityjamo|syllables|jamo%(extended\-[ab])?|_%(syllables|jamo%(_extended_[ab])?|compatibility_jamo)| %(syllables|compatibility jamo|jamo%( extended\-[ab])?))|ifi%([_ ]rohingya|rohingya)))|i%(ragana|gh%( %(private use surrogates|surrogates)|_%(private_use_surrogates|surrogates)|surrogates|privateusesurrogates))|ebrew)|i%(pa%([ _]extensions|extensions)|n%(scriptional%(%([ _]pa%(rthian|hlavi))|pa%(rthian|hlavi))|dic%(siyaqnumbers|_siyaq_numbers| siyaq numbers))|deographic%(symbolsandpunctuation|_%(description_characters|symbols_and_punctuation)| %(description characters|symbols and punctuation)|descriptioncharacters)|mperial%(aramaic|[_ ]aramaic))|c%(o%(ntrol%(pictures|[ _]pictures)|ptic%(epactnumbers|_epact_numbers| epact numbers)?|m%(mon%(_indic_number_forms|indicnumberforms| indic number forms)|bining%(halfmarks|_%(diacritical_marks%(_%(supplement|for_symbols|extended))?|marks_for_symbols|half_marks)| %(half marks|diacritical marks%( %(supplement|for symbols|extended))?|marks for symbols)|diacriticalmarks%(supplement|forsymbols|extended)?|marksforsymbols))|unting%( rod numerals|_rod_numerals|rodnumerals))|a%(rian|ucasian%([ _]albanian|albanian))|jk%(unifiedideographs%(extension[dgacfbe])?|s%(ymbolsandpunctuation|trokes)|_%(s%(trokes|ymbols_and_punctuation)|radicals_supplement|unified_ideographs%(_extension_[dgacfbe])?|compatibility%(_%(forms|ideographs%(_supplement)?))?)|compatibility%(forms|ideographs%(supplement)?)?|radicalssupplement| %(compatibility%( %(ideographs%( supplement)?|forms))?|unified ideographs%( extension [dgacfbe])?|radicals supplement|s%(ymbols and punctuation|trokes)))|y%(rillic%(supplement%(ary)?| %(supplement%(ary)?|extended\-[acb])|extended\-[acb]|_%(extended_[acb]|supplement%(ary)?))?|priot%(syllabary|[ _]syllabary))|u%(rrency%([_ ]symbols|symbols)|neiform%(_numbers_and_punctuation|numbersandpunctuation| numbers and punctuation)?)|h%(e%(ss%([_ ]symbols|symbols)|rokee%(supplement|[ _]supplement)?)|a%(m|kma)|orasmian))|g%(othic|u%(njala%(gondi|[_ ]gondi)|jarati|rmukhi)|lagolitic%(supplement|[ _]supplement)?|e%(o%(rgian%(supplement|%([_ ]%(supplement|extended))|extended)?|metric%( shapes%( extended)?|shapes%(extended)?|_shapes%(_extended)?))|neral%([_ ]punctuation|punctuation))|r%(eek%( %(and coptic|extended)|andcoptic|_%(and_coptic|extended)|extended)?|antha))|s%(h%(orthand%( format controls|_format_controls|formatcontrols)|a%(vian|rada))|u%(ndanese%(supplement|[ _]supplement)?|p%(erscripts%(_and_subscripts|andsubscripts| and subscripts)|plementa%(ry%(_private_use_area_[ab]|privateusearea\-[ab]| private use area\-[ab])|l%( %(mathematical operators|symbols and pictographs|punctuation|arrows\-[acb])|symbolsandpictographs|mathematicaloperators|punctuation|arrows\-[acb]|_%(arrows_[acb]|symbols_and_pictographs|mathematical_operators|punctuation))))|tton%(signwriting|[_ ]signwriting))|i%(nhala%( archaic numbers|archaicnumbers|_archaic_numbers)?|ddham)|y%(loti%([_ ]nagri|nagri)|mbols%( %(for legacy computing|and pictographs extended\-a)|forlegacycomputing|andpictographsextended\-a|_%(and_pictographs_extended_a|for_legacy_computing))|riac%(supplement|[ _]supplement)?)|p%(acing%(_modifier_letters| modifier letters|modifierletters)|ecials)|a%(maritan|urashtra)|o%(yombo|gdian|ra%(sompeng|[ _]sompeng))|mall%(kanaextension| %(kana extension|form variants)|_%(kana_extension|form_variants)|formvariants))|y%(i%(syllables|%([_ ]%(syllables|radicals))|radicals|jing%(hexagramsymbols| hexagram symbols|_hexagram_symbols))|ezidi)|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)|a%(hawh%(hmong|[_ ]hmong)|u%(_cin_hau|cinhau| cin hau)|lmyrene)|salter%(pahlavi|[ _]pahlavi))|e%(l%(basan|ymaic)|arly%(_dynastic_cuneiform|dynasticcuneiform| dynastic cuneiform)|moticons|gyptian%(hieroglyph%(formatcontrols|s)| hieroglyph%( format controls|s)|_hieroglyph%(_format_controls|s))|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)?)?)|r%(u%(nic|mi%(numeralsymbols| numeral symbols|_numeral_symbols))|ejang)|d%(o%(gra|mino%([ _]tiles|tiles))|e%(seret|vanagari%([ _]extended|extended)?)|uployan|i%(ngbats|ves%([_ ]akuru|akuru)))|m%(e%(defaidrin|nde%([ _]kikakui|kikakui)|etei%(mayek%(extensions)?|_mayek%(_extensions)?| mayek%( extensions)?)|roitic%(hieroglyphs|%([_ ]%(hieroglyphs|cursive))|cursive))|o%(ngolian%(supplement|[ _]supplement)?|di%(fier%(_tone_letters| tone letters|toneletters))?)|ro|u%(ltani|sical%([_ ]symbols|symbols))|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])))|yanmar%( extended\-[ab]|extended\-[ab]|_extended_[ab])?|a%(h%(ajani|jong%([ _]tiles|tiles))|rchen|n%(daic|ichaean)|yan%([_ ]numerals|numerals)|saram%(gondi|[_ ]gondi)|layalam|thematical%(alphanumericsymbols| %(alphanumeric symbols|operators)|_%(alphanumeric_symbols|operators)|operators)|kasar))|o%(s%(age|manya)|ttoman%(siyaqnumbers|_siyaq_numbers| siyaq numbers)|r%(namental%([ _]dingbats|dingbats)|iya)|ptical%( character recognition|_character_recognition|characterrecognition)|gham|l%([ _]chiki|d%(hungarian| %(hungarian|so%(uth arabian|gdian)|per%(mic|sian)|north arabian|italic|turkic)|per%(mic|sian)|so%(utharabian|gdian)|italic|turkic|_%(hungarian|north_arabian|so%(gdian|uth_arabian)|per%(mic|sian)|italic|turkic)|northarabian)|chiki))|n%(ew%(_tai_lue|a|tailue| tai lue)|ko|yiakeng%( puachue hmong|puachuehmong|_puachue_hmong)|a%(bataean|ndinagari)|u%(shu|mber%(forms|[ _]forms)))|b%(u%(ginese|hid)|a%(s%(sa%([ _]vah|vah)|ic%([ _]latin|latin))|linese|mum%(supplement|[ _]supplement)?|tak)|ra%(hmi|ille%(patterns|[_ ]patterns))|o%(x%([ _]drawing|drawing)|pomofo%([ _]extended|extended)?)|lock%([ _]elements|elements)|haiksuki|yzantine%( musical symbols|musicalsymbols|_musical_symbols)|engali)|l%(i%(mbu|near%(a| %(a|b %(ideograms|syllabary))|b%(ideograms|syllabary)|_%(a|b_%(ideograms|syllabary)))|su%(supplement|[ _]supplement)?)|a%(tin%(extended%(\-[dacbe]|additional)|_%(extended_%([dcbe]|a%(dditional)?)|1_supplement)|\-1%(supplement| supplement)| extended%(\-[dacbe]| additional))|o)|e%(tterlike%([_ ]symbols|symbols)|pcha)|ow%([_ ]surrogates|surrogates)|y[cd]ian)|k%(h%(aroshthi|ojki|mer%([_ ]symbols|symbols)?|udawadi|itan%( small script|smallscript|_small_script))|a%(takana%(_phonetic_extensions|phoneticextensions| phonetic extensions)?|n%(gxi%([_ ]radicals|radicals)|a%(extended\-a|supplement| %(extended\-a|supplement)|_%(supplement|extended_a))|bun|nada)|ithi|yah%([ _]li|li)))|wa%(ncho|rang%(citi|[ _]citi))|t%(elugu|ransport%( and map symbols|_and_map_symbols|andmapsymbols)|i%(rhuta|betan|finagh)|a%(mil%(supplement|[ _]supplement)?|kri|ngut%(supplement|%([ _]%(supplement|components))|components)?|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))|n%(cient%(_%(greek_%(musical_notation|numbers)|symbols)|greek%(numbers|musicalnotation)| %(greek %(numbers|musical notation)|symbols)|symbols)|atolian%([ _]hieroglyphs|hieroglyphs))|dlam|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)|egean%(numbers|[ _]numbers)|vestan|hom)|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\<[[:alpha:]]+\>)" contained display
+
+" Mode modifiers, mode-modified spans, lookaround, regular and atomic
+" grouping, and named-capturing.
+syntax match clojureRegexpMod "\v\(@<=\?:" contained display
+syntax match clojureRegexpMod "\v\(@<=\?[xdsmiuU]*-?[xdsmiuU]+:?" contained display
+syntax match clojureRegexpMod "\v\(@<=\?%(\<?[=!]|\>)" contained display
+syntax match clojureRegexpMod "\v\(@<=\?\<[[:alpha:]]+\>" contained display
+
+syntax region clojureRegexpGroup start="(" skip=/\\\\\|\\)/ end=")" matchgroup=clojureRegexpGroup contained contains=clojureRegexpMod,clojureRegexpQuantifier,clojureRegexpBoundary,clojureRegexpEscape,@clojureRegexpCharClasses
+syntax region clojureRegexp matchgroup=clojureRegexpDelimiter start=/\#"/ skip=/\\\\\|\\"/ end=/"/ contains=@clojureRegexpCharClasses,clojureRegexpEscape,clojureRegexpQuote,clojureRegexpBoundary,clojureRegexpQuantifier,clojureRegexpOr,clojureRegexpBackRef,clojureRegexpGroup keepend
+
+syntax keyword clojureCommentTodo contained FIXME XXX TODO BUG NOTE HACK FIXME: XXX: TODO: BUG: NOTE: HACK:
+
+syntax match clojureComment ";.*$" contains=clojureCommentTodo,@Spell
+syntax match clojureComment "#!.*$"
+syntax match clojureComment ","
+
+" Comment out discarded forms. <https://clojure.org/guides/weird_characters#_discard>
+if exists('g:clojure_discard_macro') && g:clojure_discard_macro
+ syntax region clojureDiscard matchgroup=clojureDiscard start=/#_[ ,\t\n`'~]*/ end=/[, \t\n()\[\]{}";]/me=e-1
+ syntax region clojureDiscard matchgroup=clojureDiscard start=/#_[ ,\t\n`'~]*"/ skip=/\\[\\"]/ end=/"/
+ syntax region clojureDiscard matchgroup=clojureDiscard start=/#_[ ,\t\n`'~]*(/ end=/)/ contains=clojureDiscardForm
+ syntax region clojureDiscard matchgroup=clojureDiscard start=/#_[ ,\t\n`'~]*\[/ end=/\]/ contains=clojureDiscardForm
+ syntax region clojureDiscard matchgroup=clojureDiscard start=/#_[ ,\t\n`'~]*{/ end=/}/ contains=clojureDiscardForm
+
+ syntax region clojureDiscardForm start="(" end=")" contained contains=clojureDiscardForm
+ syntax region clojureDiscardForm start="{" end="}" contained contains=clojureDiscardForm
+ syntax region clojureDiscardForm start="\[" end="\]" contained contains=clojureDiscardForm
+endif
+
+" -*- TOP CLUSTER -*-
+" Generated from https://github.com/clojure-vim/clojure.vim/blob/fd280e33e84c88e97860930557dba3ff80b1a82d/clj/src/vim_clojure_static/generate.clj
+syntax cluster clojureTop contains=@Spell,clojureAnonArg,clojureBoolean,clojureCharacter,clojureComment,clojureCond,clojureConstant,clojureDefine,clojureDeref,clojureDiscard,clojureDispatch,clojureError,clojureException,clojureFunc,clojureKeyword,clojureMacro,clojureMap,clojureMeta,clojureNumber,clojureQuote,clojureRegexp,clojureRepeat,clojureSexp,clojureSpecial,clojureString,clojureSymbol,clojureUnquote,clojureVariable,clojureVector
+
+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 clojureStringDelimiter String
+highlight default link clojureStringEscape Character
+
+highlight default link clojureRegexp Constant
+highlight default link clojureRegexpDelimiter 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 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 clojureDiscard clojureComment
+highlight default link clojureDiscardForm clojureDiscard
+
+highlight default link clojureError Error
+
+highlight default link clojureParen Delimiter
+
+let b:current_syntax = "clojure"
+
+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
new file mode 100644
index 0000000..f7616e4
--- /dev/null
+++ b/runtime/syntax/cmake.vim
@@ -0,0 +1,477 @@
+" Vim syntax file
+" Program: CMake - Cross-Platform Makefile Generator
+" Version: cmake version 3.9.20170830-ge0713
+" Language: CMake
+" 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
+" https://cmake.org/licensing
+" This implies that distribution with Vim is allowed
+
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+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 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
+
+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
+
+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
+
+" vim: set nowrap:
diff --git a/runtime/syntax/cmod.vim b/runtime/syntax/cmod.vim
new file mode 100644
index 0000000..ea37682
--- /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
new file mode 100644
index 0000000..b821aff
--- /dev/null
+++ b/runtime/syntax/cmusrc.vim
@@ -0,0 +1,309 @@
+" Vim syntax file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-
+
+syn keyword cmusrcTodo contained TODO FIXME XXX NOTE
+
+syn match cmusrcComment contained display '^\s*#.*$'
+
+syn match cmusrcBegin display '^'
+ \ nextgroup=cmusrcKeyword,cmusrcComment
+ \ skipwhite
+
+syn keyword cmusrcKeyword contained add
+ \ nextgroup=cmusrcAddSwitches,cmusrcURI
+ \ skipwhite
+
+syn match cmusrcAddSwitches contained display '-[lpqQ]'
+ \ nextgroup=cmusrcURI
+ \ skipwhite
+
+syn match cmusrcURI contained display '.\+'
+
+syn keyword cmusrcKeyword contained bind
+ \ nextgroup=cmusrcBindSwitches,
+ \ cmusrcBindContext
+ \ skipwhite
+
+syn match cmusrcBindSwitches contained display '-[f]'
+ \ nextgroup=cmusrcBindContext
+ \ skipwhite
+
+syn keyword cmusrcBindContext contained common library playlist queue
+ \ browser filters
+ \ nextgroup=cmusrcBindKey
+ \ skipwhite
+
+syn match cmusrcBindKey contained display '\S\+'
+ \ nextgroup=cmusrcKeyword
+ \ skipwhite
+
+syn keyword cmusrcKeyword contained browser-up colorscheme echo factivate
+ \ filter invert player-next player-pause
+ \ player-play player-prev player-stop quit
+ \ refresh run search-next search-prev shuffle
+ \ unmark win-activate win-add-l win-add-p
+ \ win-add-Q win-add-q win-bottom win-down
+ \ win-mv-after win-mv-before win-next
+ \ win-page-down win-page-up win-remove
+ \ win-sel-cur win-toggle win-top win-up
+ \ win-update
+
+syn keyword cmusrcKeyword contained cd
+ \ nextgroup=cmusrcDirectory
+ \ skipwhite
+
+syn match cmusrcDirectory contained display '.\+'
+
+syn keyword cmusrcKeyword contained clear
+ \ nextgroup=cmusrcClearSwitches
+
+syn match cmusrcClearSwitches contained display '-[lpq]'
+
+syn keyword cmusrcKeyword contained fset
+ \ nextgroup=cmusrcFSetName
+ \ skipwhite
+
+syn match cmusrcFSetName contained display '[^=]\+'
+ \ nextgroup=cmusrcFSetEq
+
+syn match cmusrcFSetEq contained display '='
+ \ nextgroup=cmusrcFilterExpr
+
+syn match cmusrcFilterExpr contained display '.\+'
+
+syn keyword cmusrcKeyword contained load
+ \ nextgroup=cmusrcLoadSwitches,cmusrcURI
+ \ skipwhite
+
+syn match cmusrcLoadSwitches contained display '-[lp]'
+ \ nextgroup=cmusrcURI
+ \ skipwhite
+
+syn keyword cmusrcKeyword contained mark
+ \ nextgroup=cmusrcFilterExpr
+
+syn keyword cmusrcKeyword contained save
+ \ nextgroup=cmusrcSaveSwitches,cmusrcFile
+ \ skipwhite
+
+syn match cmusrcSaveSwitches contained display '-[lp]'
+ \ nextgroup=cmusrcFile
+ \ skipwhite
+
+syn match cmusrcFile contained display '.\+'
+
+syn keyword cmusrcKeyword contained seek
+ \ nextgroup=cmusrcSeekOffset
+ \ skipwhite
+
+syn match cmusrcSeekOffset contained display
+ \ '[+-]\=\%(\d\+[mh]\=\|\%(\%(0\=\d\|[1-5]\d\):\)\=\%(0\=\d\|[1-5]\d\):\%(0\=\d\|[1-5]\d\)\)'
+
+syn keyword cmusrcKeyword contained set
+ \ nextgroup=cmusrcOption
+ \ skipwhite
+
+syn keyword cmusrcOption contained auto_reshuffle confirm_run
+ \ continue play_library play_sorted repeat
+ \ show_hidden show_remaining_time shuffle
+ \ nextgroup=cmusrcSetTest,cmusrcOptEqBoolean
+
+syn match cmusrcSetTest contained display '?'
+
+syn match cmusrcOptEqBoolean contained display '='
+ \ nextgroup=cmusrcOptBoolean
+
+syn keyword cmusrcOptBoolean contained true false
+
+syn keyword cmusrcOption contained aaa_mode
+ \ nextgroup=cmusrcOptEqAAA
+
+syn match cmusrcOptEqAAA contained display '='
+ \ nextgroup=cmusrcOptAAA
+
+syn keyword cmusrcOptAAA contained all artist album
+
+syn keyword cmusrcOption contained buffer_seconds
+ \ nextgroup=cmusrcOptEqNumber
+
+syn match cmusrcOptEqNumber contained display '='
+ \ nextgroup=cmusrcOptNumber
+
+syn match cmusrcOptNumber contained display '\d\+'
+
+syn keyword cmusrcOption contained altformat_current altformat_playlist
+ \ altformat_title altformat_trackwin
+ \ format_current format_playlist format_title
+ \ format_trackwin
+ \ nextgroup=cmusrcOptEqFormat
+
+syn match cmusrcOptEqFormat contained display '='
+ \ nextgroup=cmusrcOptFormat
+
+syn match cmusrcOptFormat contained display '.\+'
+ \ contains=cmusrcFormatSpecial
+
+syn match cmusrcFormatSpecial contained display '%[0-]*\d*[alDntgydfF=%]'
+
+syn keyword cmusrcOption contained color_cmdline_bg color_cmdline_fg
+ \ color_error color_info color_separator
+ \ color_statusline_bg color_statusline_fg
+ \ color_titleline_bg color_titleline_fg
+ \ color_win_bg color_win_cur
+ \ color_win_cur_sel_bg color_win_cur_sel_fg
+ \ color_win_dir color_win_fg
+ \ color_win_inactive_cur_sel_bg
+ \ color_win_inactive_cur_sel_fg
+ \ color_win_inactive_sel_bg
+ \ color_win_inactive_sel_fg
+ \ color_win_sel_bg color_win_sel_fg
+ \ color_win_title_bg color_win_title_fg
+ \ nextgroup=cmusrcOptEqColor
+
+syn match cmusrcOptEqColor contained display '='
+ \ nextgroup=@cmusrcOptColor
+
+syn cluster cmusrcOptColor contains=cmusrcOptColorName,cmusrcOptColorValue
+
+syn keyword cmusrcOptColorName contained default black red green yellow blue
+ \ magenta cyan gray darkgray lightred lightred
+ \ lightgreen lightyellow lightblue lightmagenta
+ \ lightcyan white
+
+syn match cmusrcOptColorValue contained display
+ \ '-1\|0*\%(\d\|[1-9]\d\|1\d\d\|2\%([0-4]\d\|5[0-5]\)\)'
+
+syn keyword cmusrcOption contained id3_default_charset output_plugin
+ \ status_display_program
+ \ nextgroup=cmusrcOptEqString
+
+syn match cmusrcOption contained
+ \ '\%(dsp\|mixer\)\.\%(alsa\|oss\|sun\)\.\%(channel\|device\)'
+ \ nextgroup=cmusrcOptEqString
+
+syn match cmusrcOption contained
+ \ 'dsp\.ao\.\%(buffer_size\|driver\|wav_counter\|wav_dir\)'
+ \ nextgroup=cmusrcOptEqString
+
+syn match cmusrcOptEqString contained display '='
+ \ nextgroup=cmusrcOptString
+
+syn match cmusrcOptString contained display '.\+'
+
+syn keyword cmusrcOption contained lib_sort pl_sort
+ \ nextgroup=cmusrcOptEqSortKeys
+
+syn match cmusrcOptEqSortKeys contained display '='
+ \ nextgroup=cmusrcOptSortKeys
+
+syn keyword cmusrcOptSortKeys contained artist album title tracknumber
+ \ discnumber date genre filename
+ \ nextgroup=cmusrcOptSortKeys
+ \ skipwhite
+
+syn keyword cmusrcKeyword contained showbind
+ \ nextgroup=cmusrcSBindContext
+ \ skipwhite
+
+syn keyword cmusrcSBindContext contained common library playlist queue
+ \ browser filters
+ \ nextgroup=cmusrcSBindKey
+ \ skipwhite
+
+syn match cmusrcSBindKey contained display '\S\+'
+
+syn keyword cmusrcKeyword contained toggle
+ \ nextgroup=cmusrcTogglableOpt
+ \ skipwhite
+
+syn keyword cmusrcTogglableOpt contained auto_reshuffle aaa_mode
+ \ confirm_run continue play_library play_sorted
+ \ repeat show_hidden show_remaining_time shuffle
+
+syn keyword cmusrcKeyword contained unbind
+ \ nextgroup=cmusrcUnbindSwitches,
+ \ cmusrcSBindContext
+ \ skipwhite
+
+syn match cmusrcUnbindSwitches contained display '-[f]'
+ \ nextgroup=cmusrcSBindContext
+ \ skipwhite
+
+syn keyword cmusrcKeyword contained view
+ \ nextgroup=cmusrcView
+ \ skipwhite
+
+syn keyword cmusrcView contained library playlist queue browser filters
+syn match cmusrcView contained display '[1-6]'
+
+syn keyword cmusrcKeyword contained vol
+ \ nextgroup=cmusrcVolume1
+ \ skipwhite
+
+syn match cmusrcVolume1 contained display '[+-]\=\d\+%'
+ \ nextgroup=cmusrcVolume2
+ \ skipwhite
+
+syn match cmusrcVolume2 contained display '[+-]\=\d\+%'
+
+hi def link cmusrcTodo Todo
+hi def link cmusrcComment Comment
+hi def link cmusrcKeyword Keyword
+hi def link cmusrcSwitches Special
+hi def link cmusrcAddSwitches cmusrcSwitches
+hi def link cmusrcURI Normal
+hi def link cmusrcBindSwitches cmusrcSwitches
+hi def link cmusrcContext Type
+hi def link cmusrcBindContext cmusrcContext
+hi def link cmusrcKey String
+hi def link cmusrcBindKey cmusrcKey
+hi def link cmusrcDirectory Normal
+hi def link cmusrcClearSwitches cmusrcSwitches
+hi def link cmusrcFSetName PreProc
+hi def link cmusrcEq Normal
+hi def link cmusrcFSetEq cmusrcEq
+hi def link cmusrcFilterExpr Normal
+hi def link cmusrcLoadSwitches cmusrcSwitches
+hi def link cmusrcSaveSwitches cmusrcSwitches
+hi def link cmusrcFile Normal
+hi def link cmusrcSeekOffset Number
+hi def link cmusrcOption PreProc
+hi def link cmusrcSetTest Normal
+hi def link cmusrcOptBoolean Boolean
+hi def link cmusrcOptEqAAA cmusrcEq
+hi def link cmusrcOptAAA Identifier
+hi def link cmusrcOptEqNumber cmusrcEq
+hi def link cmusrcOptNumber Number
+hi def link cmusrcOptEqFormat cmusrcEq
+hi def link cmusrcOptFormat String
+hi def link cmusrcFormatSpecial SpecialChar
+hi def link cmusrcOptEqColor cmusrcEq
+hi def link cmusrcOptColor Normal
+hi def link cmusrcOptColorName cmusrcOptColor
+hi def link cmusrcOptColorValue cmusrcOptColor
+hi def link cmusrcOptEqString cmusrcEq
+hi def link cmusrcOptString Normal
+hi def link cmusrcOptEqSortKeys cmusrcEq
+hi def link cmusrcOptSortKeys Identifier
+hi def link cmusrcSBindContext cmusrcContext
+hi def link cmusrcSBindKey cmusrcKey
+hi def link cmusrcTogglableOpt cmusrcOption
+hi def link cmusrcUnbindSwitches cmusrcSwitches
+hi def link cmusrcView Normal
+hi def link cmusrcVolume1 Number
+hi def link cmusrcVolume2 Number
+
+let b:current_syntax = "cmusrc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/cobol.vim b/runtime/syntax/cobol.vim
new file mode 100644
index 0000000..5d64944
--- /dev/null
+++ b/runtime/syntax/cobol.vim
@@ -0,0 +1,260 @@
+" Vim syntax file
+" Language: COBOL
+" Maintainer: Ankit Jain <ajatkj@yahoo.co.in>
+" (formerly Tim Pope <vimNOSPAM@tpope.info>)
+" (formerly Davyd Ondrejko <vondraco@columbus.rr.com>)
+" (formerly Sitaram Chamarty <sitaram@diac.com> and
+" James Mitchell <james_mitchell@acm.org>)
+" Last Change: 2019 Mar 22
+" Ankit Jain 22.03.2019 Changes & fixes:
+" 1. Include inline comments
+" 2. Use comment highlight for bad lines
+" 3. Change certain 'keywords' to 'matches'
+" for additional highlighting
+" 4. Different highlighting for COPY, GO TO &
+" CALL lines
+" 5. Fix for COMP keyword
+" 6. Fix for PROCEDURE DIVISION highlighting
+" 7. Highlight EXIT PROGRAM like STOP RUN
+" 8. Highlight X & A in PIC clause
+" Tag: #C22032019
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" MOST important - else most of the keywords wont work!
+setlocal isk=@,48-57,-,_
+
+if !exists('g:cobol_inline_comment')
+ let g:cobol_inline_comment=0
+endif
+
+syn case ignore
+
+syn cluster cobolStart contains=cobolAreaA,cobolAreaB,cobolComment,cobolCompiler
+syn cluster cobolAreaA contains=cobolParagraph,cobolSection,cobolDivision
+"syn cluster cobolAreaB contains=
+syn cluster cobolAreaAB contains=cobolLine
+syn cluster cobolLine contains=cobolReserved
+syn match cobolMarker "^\%( \{,5\}[^ ]\)\@=.\{,6}" nextgroup=@cobolStart
+syn match cobolSpace "^ \{6\}" nextgroup=@cobolStart
+syn match cobolAreaA " \{1,4\}" contained nextgroup=@cobolAreaA,@cobolAreaAB
+syn match cobolAreaB " \{5,\}\|- *" contained nextgroup=@cobolAreaB,@cobolAreaAB
+syn match cobolComment "[/*C].*$" contained
+syn match cobolCompiler "$.*$" contained
+syn match cobolLine ".*$" contained contains=cobolReserved,@cobolLine
+
+"#C22032019: Fix for PROCEDURE DIVISION USING highlighting, removed . from the
+"end of the regex
+"syn match cobolDivision \"[A-Z][A-Z0-9-]*[A-Z0-9]\s\+DIVISION\."he=e-1 contained contains=cobolDivisionName
+syn match cobolDivision "[A-Z][A-Z0-9-]*[A-Z0-9]\s\+DIVISION" contained contains=cobolDivisionName
+syn keyword cobolDivisionName contained IDENTIFICATION ENVIRONMENT DATA PROCEDURE
+syn match cobolSection "[A-Z][A-Z0-9-]*[A-Z0-9]\s\+SECTION\."he=e-1 contained contains=cobolSectionName
+syn keyword cobolSectionName contained CONFIGURATION INPUT-OUTPUT FILE WORKING-STORAGE LOCAL-STORAGE LINKAGE
+syn match cobolParagraph "\a[A-Z0-9-]*[A-Z0-9]\.\|\d[A-Z0-9-]*[A-Z]\."he=e-1 contained contains=cobolParagraphName
+syn keyword cobolParagraphName contained PROGRAM-ID SOURCE-COMPUTER OBJECT-COMPUTER SPECIAL-NAMES FILE-CONTROL I-O-CONTROL
+
+
+"syn match cobolKeys "^\a\{1,6\}" contains=cobolReserved
+"#C22032019: Remove BY, REPLACING, PROGRAM, TO, IN from 'keyword' group and add
+"to 'match' group or other 'keyword' group
+syn keyword cobolReserved contained ACCEPT ACCESS ADD ADDRESS ADVANCING AFTER ALPHABET ALPHABETIC
+syn keyword cobolReserved contained ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED ALS
+syn keyword cobolReserved contained ALTERNATE AND ANY ARE AREA AREAS ASCENDING ASSIGN AT AUTHOR BEFORE BINARY
+syn keyword cobolReserved contained BLANK BLOCK BOTTOM CANCEL CBLL CD CF CH CHARACTER CHARACTERS CLASS
+syn keyword cobolReserved contained CLOCK-UNITS CLOSE COBOL CODE CODE-SET COLLATING COLUMN COMMA COMMON
+syn keyword cobolReserved contained COMMUNICATIONS COMPUTATIONAL COMPUTE CONTENT CONTINUE
+syn keyword cobolReserved contained CONTROL CONVERTING CORR CORRESPONDING COUNT CURRENCY DATE DATE-COMPILED
+syn keyword cobolReserved contained DATE-WRITTEN DAY DAY-OF-WEEK DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE
+syn keyword cobolReserved contained DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING DECIMAL-POINT
+syn keyword cobolReserved contained DELARATIVES DELETE DELIMITED DELIMITER DEPENDING DESCENDING DESTINATION
+syn keyword cobolReserved contained DETAIL DISABLE DISPLAY DIVIDE DIVISION DOWN DUPLICATES DYNAMIC EGI ELSE EMI
+syn keyword cobolReserved contained ENABLE END-ADD END-COMPUTE END-DELETE END-DIVIDE END-EVALUATE END-IF
+syn keyword cobolReserved contained END-MULTIPLY END-OF-PAGE END-READ END-RECEIVE END-RETURN
+syn keyword cobolReserved contained END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT END-UNSTRING
+syn keyword cobolReserved contained END-WRITE EQUAL ERROR ESI EVALUATE EVERY EXCEPTION EXIT
+syn keyword cobolReserved contained EXTEND EXTERNAL FALSE FD FILLER FINAL FIRST FOOTING FOR FROM
+syn keyword cobolReserved contained GENERATE GIVING GLOBAL GREATER GROUP HEADING HIGH-VALUE HIGH-VALUES I-O
+syn keyword cobolReserved contained INDEX INDEXED INDICATE INITIAL INITIALIZE
+syn keyword cobolReserved contained INITIATE INPUT INSPECT INSTALLATION INTO IS JUST
+syn keyword cobolReserved contained JUSTIFIED KEY LABEL LAST LEADING LEFT LENGTH LOCK MEMORY
+syn keyword cobolReserved contained MERGE MESSAGE MODE MODULES MOVE MULTIPLE MULTIPLY NATIVE NEGATIVE NEXT NO NOT
+syn keyword cobolReserved contained NUMBER NUMERIC NUMERIC-EDITED OCCURS OF OFF OMITTED ON OPEN
+syn keyword cobolReserved contained OPTIONAL OR ORDER ORGANIZATION OTHER OUTPUT OVERFLOW PACKED-DECIMAL PADDING
+syn keyword cobolReserved contained PAGE PAGE-COUNTER PERFORM PF PH PIC PICTURE PLUS POINTER POSITION POSITIVE
+syn keyword cobolReserved contained PRINTING PROCEDURES PROCEDD PURGE QUEUE QUOTES
+syn keyword cobolReserved contained RANDOM RD READ RECEIVE RECORD RECORDS REDEFINES REEL REFERENCE REFERENCES
+syn keyword cobolReserved contained RELATIVE RELEASE REMAINDER REMOVAL REPLACE REPORT REPORTING
+syn keyword cobolReserved contained REPORTS RERUN RESERVE RESET RETURN RETURNING REVERSED REWIND REWRITE RF RH
+syn keyword cobolReserved contained RIGHT ROUNDED RUN SAME SD SEARCH SECTION SECURITY SEGMENT SEGMENT-LIMITED
+syn keyword cobolReserved contained SELECT SEND SENTENCE SEPARATE SEQUENCE SEQUENTIAL SET SIGN SIZE SORT
+syn keyword cobolReserved contained SORT-MERGE SOURCE STANDARD
+syn keyword cobolReserved contained STANDARD-1 STANDARD-2 START STATUS STOP STRING SUB-QUEUE-1 SUB-QUEUE-2
+syn keyword cobolReserved contained SUB-QUEUE-3 SUBTRACT SUM SUPPRESS SYMBOLIC SYNC SYNCHRONIZED TABLE TALLYING
+syn keyword cobolReserved contained TAPE TERMINAL TERMINATE TEST TEXT THAN THEN THROUGH THRU TIME TIMES TOP
+syn keyword cobolReserved contained TRAILING TRUE TYPE UNIT UNSTRING UNTIL UP UPON USAGE USE USING VALUE VALUES
+syn keyword cobolReserved contained VARYING WHEN WITH WORDS WRITE
+syn match cobolReserved contained "\<CONTAINS\>"
+syn match cobolReserved contained "\<\(IF\|INVALID\|END\|EOP\)\>"
+syn match cobolReserved contained "\<ALL\>"
+" #C22032019: Add BY as match instead of keyword: BY not followed by ==
+syn match cobolReserved contained "\<BY\>\s\+\(==\)\@!"
+syn match cobolReserved contained "\<TO\>"
+
+syn cluster cobolLine add=cobolConstant,cobolNumber,cobolPic
+syn keyword cobolConstant SPACE SPACES NULL ZERO ZEROES ZEROS LOW-VALUE LOW-VALUES
+
+" #C22032019: Fix for many pic clauses
+syn match cobolNumber "\<-\=\d*\.\=\d\+\>" contained
+" syn match cobolPic \"\<S*9\+\>" contained
+syn match cobolPic "\<S*9\+V*9*\>" contained
+syn match cobolPic "\<$*\.\=9\+\>" contained
+syn match cobolPic "\<Z*\.\=9\+\>" contained
+syn match cobolPic "\<V9\+\>" contained
+syn match cobolPic "\<9\+V\>" contained
+" syn match cobolPic \"\<-\+[Z9]\+\>" contained
+syn match cobolPic "\<-*[Z9]\+-*\>" contained
+" #C22032019: Add Z,X and A to cobolPic
+syn match cobolPic "\<[ZXA]\+\>" contained
+syn match cobolTodo "todo" contained containedin=cobolInlineComment,cobolComment
+
+" For MicroFocus or other inline comments, include this line.
+if g:cobol_inline_comment == 1
+ syn region cobolInlineComment start="*>" end="$" contains=cobolTodo,cobolMarker
+ syn cluster cobolLine add=cobolInlineComment
+endif
+
+syn match cobolBadLine "[^ D\*$/-].*" contained
+
+" If comment mark somehow gets into column past Column 7.
+if g:cobol_inline_comment == 1
+ " #C22032019: It is a bad line only if * is not followed by > when inline
+ " comments enabled
+ syn match cobolBadLine "\s\+\*\(>\)\@!.*" contained
+else
+ syn match cobolBadLine "\s\+\*.*" contained
+endif
+syn cluster cobolStart add=cobolBadLine
+
+" #C22032019: Different highlighting for GO TO statements
+" syn keyword cobolGoTo GO GOTO
+syn keyword cobolGoTo GOTO
+syn match cobolGoTo /\<GO\>\s\+\<TO\>/
+syn match cobolGoToPara /\<GO\>\s\+\<TO\>\s\+[A-Z0-9-]\+/ contains=cobolGoTo
+" #C22032019: Highlight copybook name and location in using different group
+" syn keyword cobolCopy COPY
+syn match cobolCopy "\<COPY\>\|\<IN\>"
+syn match cobolCopy "\<REPLACING\>\s\+\(==\)\@="
+syn match cobolCopy "\<BY\>\s\+\(==\)\@="
+syn match cobolCopyName "\<COPY\>\s\+[A-Z0-9]\+\(\s\+\<IN\>\s\+[A-Z0-9]\+\)\?" contains=cobolCopy
+syn cluster cobolLine add=cobolGoToPara,cobolCopyName
+
+" cobolBAD: things that are BAD NEWS!
+syn keyword cobolBAD ALTER ENTER RENAMES
+
+syn cluster cobolLine add=cobolGoTo,cobolCopy,cobolBAD,cobolWatch,cobolEXECs
+
+" cobolWatch: things that are important when trying to understand a program
+syn keyword cobolWatch OCCURS DEPENDING VARYING BINARY COMP REDEFINES
+" #C22032019: Remove REPLACING from cobolWatch 'keyword' group and add to cobolCopy &
+" cobolWatch 'match' group
+" syn keyword cobolWatch REPLACING RUN
+syn keyword cobolWatch RUN PROGRAM
+syn match cobolWatch contained "\<REPLACING\>\s\+\(==\)\@!"
+" #C22032019: Look for word starting with COMP
+" syn match cobolWatch \"COMP-[123456XN]"
+syn match cobolWatch "\<COMP-[123456XN]"
+
+syn keyword cobolEXECs EXEC END-EXEC
+
+
+syn cluster cobolAreaA add=cobolDeclA
+syn cluster cobolAreaAB add=cobolDecl
+syn match cobolDeclA "\(0\=1\|77\|78\) " contained nextgroup=cobolLine
+syn match cobolDecl "[1-4]\d " contained nextgroup=cobolLine
+syn match cobolDecl "0\=[2-9] " contained nextgroup=cobolLine
+syn match cobolDecl "66 " contained nextgroup=cobolLine
+
+syn match cobolWatch "88 " contained nextgroup=cobolLine
+
+"syn match cobolBadID "\k\+-\($\|[^-A-Z0-9]\)" contained
+
+syn cluster cobolLine add=cobolCALLs,cobolString,cobolCondFlow
+" #C22032019: Changes for cobolCALLs group to include thru
+" syn keyword cobolCALLs CALL END-CALL CANCEL GOBACK PERFORM END-PERFORM INVOKE
+syn keyword cobolCALLs END-CALL CANCEL GOBACK PERFORM END-PERFORM INVOKE THRU
+" #C22032019: Highlight called program
+" syn match cobolCALLs \"EXIT \+PROGRAM"
+syn match cobolCALLs "\<CALL\>"
+syn match cobolCALLProg /\<CALL\>\s\+"\{0,1\}[A-Z0-9]\+"\{0,1\}/ contains=cobolCALLs
+syn match cobolExtras /\<VALUE \+\d\+\./hs=s+6,he=e-1
+syn cluster cobolLine add=cobolCALLProg
+
+syn match cobolString /"[^"]*\("\|$\)/
+syn match cobolString /'[^']*\('\|$\)/
+
+"syn region cobolLine start="^.\{6}[ D-]" end="$" contains=ALL
+syn match cobolIndicator "\%7c[D-]" contained
+
+if exists("cobol_legacy_code")
+ syn region cobolCondFlow contains=ALLBUT,cobolLine start="\<\(IF\|INVALID\|END\|EOP\)\>" skip=/\('\|"\)[^"]\{-}\("\|'\|$\)/ end="\." keepend
+endif
+
+" many legacy sources have junk in columns 1-6: must be before others
+" Stuff after column 72 is in error - must be after all other "match" entries
+if exists("cobol_legacy_code")
+ syn match cobolBadLine "\%73c.*" containedin=ALLBUT,cobolComment
+else
+ " #C22032019: Use comment highlighting for bad lines
+ " syn match cobolBadLine \"\%73c.*" containedin=ALL
+ syn match cobolBadLine "\%73c.*" containedin=ALL,cobolInlineComment,cobolComment
+endif
+
+" Define the default highlighting.
+" 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 cobolCALLProg Special
+hi def link cobolComment Comment
+hi def link cobolInlineComment 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 cobolCopyName Special
+hi def link cobolDeclA cobolDecl
+hi def link cobolDecl Type
+hi def link cobolExtras Special
+hi def link cobolGoTo Special
+hi def link cobolGoToPara Function
+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
+hi def link cobolStart Comment
+
+
+let b:current_syntax = "cobol"
+
+" vim: ts=6 nowrap
diff --git a/runtime/syntax/coco.vim b/runtime/syntax/coco.vim
new file mode 100644
index 0000000..dc21314
--- /dev/null
+++ b/runtime/syntax/coco.vim
@@ -0,0 +1,33 @@
+" Vim syntax file
+" Language: Coco/R
+" Maintainer: Ashish Shukla <wahjava@gmail.com>
+" Last Change: 2022 Jun 14
+" Remark: Coco/R syntax partially implemented.
+" License: Vim license
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword cocoKeywords ANY CHARACTERS COMMENTS COMPILER CONTEXT END FROM IF IGNORE IGNORECASE NESTED PRAGMAS PRODUCTIONS SYNC TO TOKENS WEAK
+syn match cocoUnilineComment #//.*$#
+syn match cocoIdentifier /[[:alpha:]][[:alnum:]]*/
+syn region cocoMultilineComment start=#/[*]# end=#[*]/#
+syn region cocoString start=/"/ skip=/\\"\|\\\\/ end=/"/
+syn region cocoCharacter start=/'/ skip=/\\'\|\\\\/ end=/'/
+syn match cocoOperator /+\||\|\.\.\|-\|(\|)\|{\|}\|\[\|\]\|=\|<\|>/
+syn region cocoProductionCode start=/([.]/ end=/[.])/
+syn match cocoPragma /[$][[:alnum:]]*/
+
+hi def link cocoKeywords Keyword
+hi def link cocoUnilineComment Comment
+hi def link cocoMultilineComment Comment
+hi def link cocoIdentifier Identifier
+hi def link cocoString String
+hi def link cocoCharacter Character
+hi def link cocoOperator Operator
+hi def link cocoProductionCode Statement
+hi def link cocoPragma Special
+
+let b:current_syntax = 'coco'
diff --git a/runtime/syntax/colortest.vim b/runtime/syntax/colortest.vim
new file mode 100644
index 0000000..58de7aa
--- /dev/null
+++ b/runtime/syntax/colortest.vim
@@ -0,0 +1,81 @@
+" Vim script for testing colors
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Contributors: Rafael Garcia-Suarez, Charles Campbell
+" Last Change: 2008 Jun 04
+
+" edit this file, then do ":source %", and check if the colors match
+
+" black black_on_white white_on_black
+" black_on_black black_on_black
+" darkred darkred_on_white white_on_darkred
+" darkred_on_black black_on_darkred
+" darkgreen darkgreen_on_white white_on_darkgreen
+" darkgreen_on_black black_on_darkgreen
+" brown brown_on_white white_on_brown
+" brown_on_black black_on_brown
+" darkblue darkblue_on_white white_on_darkblue
+" darkblue_on_black black_on_darkblue
+" darkmagenta darkmagenta_on_white white_on_darkmagenta
+" darkmagenta_on_black black_on_darkmagenta
+" darkcyan darkcyan_on_white white_on_darkcyan
+" darkcyan_on_black black_on_darkcyan
+" lightgray lightgray_on_white white_on_lightgray
+" lightgray_on_black black_on_lightgray
+" darkgray darkgray_on_white white_on_darkgray
+" darkgray_on_black black_on_darkgray
+" red red_on_white white_on_red
+" red_on_black black_on_red
+" green green_on_white white_on_green
+" green_on_black black_on_green
+" yellow yellow_on_white white_on_yellow
+" yellow_on_black black_on_yellow
+" blue blue_on_white white_on_blue
+" blue_on_black black_on_blue
+" magenta magenta_on_white white_on_magenta
+" magenta_on_black black_on_magenta
+" cyan cyan_on_white white_on_cyan
+" cyan_on_black black_on_cyan
+" white white_on_white white_on_white
+" white_on_black black_on_white
+" grey grey_on_white white_on_grey
+" grey_on_black black_on_grey
+" lightred lightred_on_white white_on_lightred
+" lightred_on_black black_on_lightred
+" lightgreen lightgreen_on_white white_on_lightgreen
+" lightgreen_on_black black_on_lightgreen
+" lightyellow lightyellow_on_white white_on_lightyellow
+" lightyellow_on_black black_on_lightyellow
+" lightblue lightblue_on_white white_on_lightblue
+" lightblue_on_black black_on_lightblue
+" lightmagenta lightmagenta_on_white white_on_lightmagenta
+" lightmagenta_on_black black_on_lightmagenta
+" lightcyan lightcyan_on_white white_on_lightcyan
+" lightcyan_on_black black_on_lightcyan
+
+" Open this file in a window if it isn't edited yet.
+" Use the current window if it's empty.
+if expand('%:p') != expand('<sfile>:p')
+ let s:fname = expand('<sfile>')
+ if exists('*fnameescape')
+ let s:fname = fnameescape(s:fname)
+ else
+ let s:fname = escape(s:fname, ' \|')
+ endif
+ if &mod || line('$') != 1 || getline(1) != ''
+ exe "new " . s:fname
+ else
+ exe "edit " . s:fname
+ endif
+ unlet s:fname
+endif
+
+syn clear
+8
+while search("_on_", "W") < 55
+ let col1 = substitute(expand("<cword>"), '\(\a\+\)_on_\a\+', '\1', "")
+ let col2 = substitute(expand("<cword>"), '\a\+_on_\(\a\+\)', '\1', "")
+ exec 'hi col_'.col1.'_'.col2.' ctermfg='.col1.' guifg='.col1.' ctermbg='.col2.' guibg='.col2
+ exec 'syn keyword col_'.col1.'_'.col2.' '.col1.'_on_'.col2
+endwhile
+8,54g/^" \a/exec 'hi col_'.expand("<cword>").' ctermfg='.expand("<cword>").' guifg='.expand("<cword>")| exec 'syn keyword col_'.expand("<cword>")." ".expand("<cword>")
+nohlsearch
diff --git a/runtime/syntax/conaryrecipe.vim b/runtime/syntax/conaryrecipe.vim
new file mode 100644
index 0000000..f94fdd4
--- /dev/null
+++ b/runtime/syntax/conaryrecipe.vim
@@ -0,0 +1,137 @@
+" Vim syntax file
+" Language: Conary Recipe
+" Maintainer: rPath Inc <http://www.rpath.com>
+" Updated: 2007-12-08
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/python.vim
+
+syn keyword conarySFunction mainDir addAction addSource addArchive addPatch
+syn keyword conarySFunction addRedirect addSvnSnapshot addMercurialSnapshot
+syn keyword conarySFunction addCvsSnapshot addGitSnapshot addBzrSnapshot
+
+syn keyword conaryGFunction add addAll addNewGroup addReference createGroup
+syn keyword conaryGFunction addNewGroup startGroup remove removeComponents
+syn keyword conaryGFunction replace setByDefault setDefaultGroup
+syn keyword conaryGFunction setLabelPath addCopy setSearchPath AddAllFlags
+syn keyword conaryGFunction GroupRecipe GroupReference TroveCacheWrapper
+syn keyword conaryGFunction TroveCache buildGroups findTrovesForGroups
+syn keyword conaryGFunction followRedirect processAddAllDirectives
+syn keyword conaryGFunction processOneAddAllDirective removeDifferences
+syn keyword conaryGFunction addTrovesToGroup addCopiedComponents
+syn keyword conaryGFunction findAllWeakTrovesToRemove checkForRedirects
+syn keyword conaryGFunction addPackagesForComponents getResolveSource
+syn keyword conaryGFunction resolveGroupDependencies checkGroupDependencies
+syn keyword conaryGFunction calcSizeAndCheckHashes findSourcesForGroup
+syn keyword conaryGFunction addPostInstallScript addPostRollbackScript
+syn keyword conaryGFunction addPostUpdateScript addPreUpdateScript
+syn keyword conaryGFunction addTrove moveComponents copyComponents
+syn keyword conaryGFunction removeItemsAlsoInNewGroup removeItemsAlsoInGroup
+syn keyword conaryGFunction addResolveSource iterReplaceSpecs
+syn keyword conaryGFunction setCompatibilityClass getLabelPath
+syn keyword conaryGFunction getResolveTroveSpecs getSearchFlavor
+syn keyword conaryGFunction getChildGroups getGroupMap
+
+syn keyword conaryBFunction Run Automake Configure ManualConfigure
+syn keyword conaryBFunction Make MakeParallelSubdir MakeInstall
+syn keyword conaryBFunction MakePathsInstall CompilePython
+syn keyword conaryBFunction Ldconfig Desktopfile Environment SetModes
+syn keyword conaryBFunction Install Copy Move Symlink Link Remove Doc
+syn keyword conaryBFunction Create MakeDirs disableParallelMake
+syn keyword conaryBFunction ConsoleHelper Replace SGMLCatalogEntry
+syn keyword conaryBFunction XInetdService XMLCatalogEntry TestSuite
+syn keyword conaryBFunction PythonSetup CMake Ant JavaCompile ClassPath
+syn keyword conaryBFunction JavaDoc IncludeLicense MakeFIFO
+
+syn keyword conaryPFunction NonBinariesInBindirs FilesInMandir
+syn keyword conaryPFunction ImproperlyShared CheckSonames CheckDestDir
+syn keyword conaryPFunction ComponentSpec PackageSpec
+syn keyword conaryPFunction Config InitScript GconfSchema SharedLibrary
+syn keyword conaryPFunction ParseManifest MakeDevices DanglingSymlinks
+syn keyword conaryPFunction AddModes WarnWriteable IgnoredSetuid
+syn keyword conaryPFunction Ownership ExcludeDirectories
+syn keyword conaryPFunction BadFilenames BadInterpreterPaths ByDefault
+syn keyword conaryPFunction ComponentProvides ComponentRequires Flavor
+syn keyword conaryPFunction EnforceConfigLogBuildRequirements Group
+syn keyword conaryPFunction EnforceSonameBuildRequirements InitialContents
+syn keyword conaryPFunction FilesForDirectories LinkCount
+syn keyword conaryPFunction MakdeDevices NonMultilibComponent ObsoletePaths
+syn keyword conaryPFunction NonMultilibDirectories NonUTF8Filenames TagSpec
+syn keyword conaryPFunction Provides RequireChkconfig Requires TagHandler
+syn keyword conaryPFunction TagDescription Transient User UtilizeGroup
+syn keyword conaryPFunction WorldWritableExecutables UtilizeUser
+syn keyword conaryPFunction WarnWritable Strip CheckDesktopFiles
+syn keyword conaryPFunction FixDirModes LinkType reportMissingBuildRequires
+syn keyword conaryPFunction reportErrors FixupManpagePaths FixObsoletePaths
+syn keyword conaryPFunction NonLSBPaths PythonEggs
+syn keyword conaryPFunction EnforcePythonBuildRequirements
+syn keyword conaryPFunction EnforceJavaBuildRequirements
+syn keyword conaryPFunction EnforceCILBuildRequirements
+syn keyword conaryPFunction EnforcePerlBuildRequirements
+syn keyword conaryPFunction EnforceFlagBuildRequirements
+syn keyword conaryPFunction FixupMultilibPaths ExecutableLibraries
+syn keyword conaryPFunction NormalizeLibrarySymlinks NormalizeCompression
+syn keyword conaryPFunction NormalizeManPages NormalizeInfoPages
+syn keyword conaryPFunction NormalizeInitscriptLocation
+syn keyword conaryPFunction NormalizeInitscriptContents
+syn keyword conaryPFunction NormalizeAppDefaults NormalizeInterpreterPaths
+syn keyword conaryPFunction NormalizePamConfig ReadableDocs
+syn keyword conaryPFunction WorldWriteableExecutables NormalizePkgConfig
+syn keyword conaryPFunction EtcConfig InstallBucket SupplementalGroup
+syn keyword conaryPFunction FixBuilddirSymlink RelativeSymlinks
+
+" Most destdirPolicy aren't called from recipes, except for these
+syn keyword conaryPFunction AutoDoc RemoveNonPackageFiles TestSuiteFiles
+syn keyword conaryPFunction TestSuiteLinks
+
+syn match conaryMacro "%(\w\+)[sd]" contained
+syn match conaryBadMacro "%(\w*)[^sd]" contained " no final marker
+syn keyword conaryArches contained x86 x86_64 alpha ia64 ppc ppc64 s390
+syn keyword conaryArches contained sparc sparc64
+syn keyword conarySubArches contained sse2 3dnow 3dnowext cmov i486 i586
+syn keyword conarySubArches contained i686 mmx mmxext nx sse sse2
+syn keyword conaryBad RPM_BUILD_ROOT EtcConfig InstallBucket subDir
+syn keyword conaryBad RPM_OPT_FLAGS subdir
+syn cluster conaryArchFlags contains=conaryArches,conarySubArches
+syn match conaryArch "Arch\.[a-z0-9A-Z]\+" contains=conaryArches,conarySubArches
+syn match conaryArch "Arch\.[a-z0-9A-Z]\+" contains=conaryArches,conarySubArches
+syn keyword conaryKeywords name buildRequires version clearBuildReqs
+syn keyword conaryUseFlag contained pcre tcpwrappers gcj gnat selinux pam
+syn keyword conaryUseFlag contained bootstrap python perl
+syn keyword conaryUseFlag contained readline gdbm emacs krb builddocs
+syn keyword conaryUseFlag contained alternatives tcl tk X gtk gnome qt
+syn keyword conaryUseFlag contained xfce gd ldap sasl pie desktop ssl kde
+syn keyword conaryUseFlag contained slang netpbm nptl ipv6 buildtests
+syn keyword conaryUseFlag contained ntpl xen dom0 domU
+syn match conaryUse "Use\.[a-z0-9A-Z]\+" contains=conaryUseFlag
+
+" strings
+syn region pythonString matchgroup=Normal start=+[uU]\='+ end=+'+ skip=+\\\\\|\\'+ contains=pythonEscape,conaryMacro,conaryBadMacro
+syn region pythonString matchgroup=Normal start=+[uU]\="+ end=+"+ skip=+\\\\\|\\"+ contains=pythonEscape,conaryMacro,conaryBadMacro
+syn region pythonString matchgroup=Normal start=+[uU]\="""+ end=+"""+ contains=pythonEscape,conaryMacro,conaryBadMacro
+syn region pythonString matchgroup=Normal start=+[uU]\='''+ end=+'''+ contains=pythonEscape,conaryMacro,conaryBadMacro
+syn region pythonRawString matchgroup=Normal start=+[uU]\=[rR]'+ end=+'+ skip=+\\\\\|\\'+ contains=conaryMacro,conaryBadMacro
+syn region pythonRawString matchgroup=Normal start=+[uU]\=[rR]"+ end=+"+ skip=+\\\\\|\\"+ contains=conaryMacro,conaryBadMacro
+syn region pythonRawString matchgroup=Normal start=+[uU]\=[rR]"""+ end=+"""+ contains=conaryMacro,conaryBadMacro
+syn region pythonRawString matchgroup=Normal start=+[uU]\=[rR]'''+ end=+'''+ contains=conaryMacro,conaryBadMacro
+
+hi def link conaryMacro Special
+hi def link conaryrecipeFunction Function
+hi def link conaryError Error
+hi def link conaryBFunction conaryrecipeFunction
+hi def link conaryGFunction conaryrecipeFunction
+hi def link conarySFunction Operator
+hi def link conaryPFunction Typedef
+hi def link conaryFlags PreCondit
+hi def link conaryArches Special
+hi def link conarySubArches Special
+hi def link conaryBad conaryError
+hi def link conaryBadMacro conaryError
+hi def link conaryKeywords Special
+hi def link conaryUseFlag Typedef
+
+let b:current_syntax = "conaryrecipe"
+
diff --git a/runtime/syntax/conf.vim b/runtime/syntax/conf.vim
new file mode 100644
index 0000000..6a78ef8
--- /dev/null
+++ b/runtime/syntax/conf.vim
@@ -0,0 +1,26 @@
+" Vim syntax file
+" Language: generic configure file
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2021 May 01
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword confTodo contained TODO FIXME XXX
+" Avoid matching "text#text", used in /etc/disktab and /etc/gettytab
+syn match confComment "^#.*" contains=confTodo,@Spell
+syn match confComment "\s#.*"ms=s+1 contains=confTodo,@Spell
+syn region confString start=+"+ skip=+\\\\\|\\"+ end=+"+ oneline
+syn region confString start=+'+ skip=+\\\\\|\\'+ end=+'+ oneline
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet
+hi def link confComment Comment
+hi def link confTodo Todo
+hi def link confString String
+
+let b:current_syntax = "conf"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/config.vim b/runtime/syntax/config.vim
new file mode 100644
index 0000000..3636ed4
--- /dev/null
+++ b/runtime/syntax/config.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" Language: configure.in script: M4 with sh
+" 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 !
+" But I missed good highlighting when editing my GNU autoconf/automake
+" script, so I wrote this quick and dirty patch.
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" define the config syntax
+syn match configdelimiter "[()\[\];,]"
+syn match configoperator "[=|&\*\+\<\>]"
+syn match configcomment "\(dnl.*\)\|\(#.*\)" contains=configDnl,@Spell
+syn match configfunction "\<[A-Z_][A-Z0-9_]*\>"
+syn match confignumber "[-+]\=\<\d\+\(\.\d*\)\=\>"
+syn keyword configDnl dnl contained
+syn keyword configkeyword if then else fi test for in do done
+syn keyword configspecial cat rm eval
+
+" This shortens the script, see syn-ext-match..
+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 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.
+" 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
+
+
+let b:current_syntax = "config"
+
+" vim: ts=4
diff --git a/runtime/syntax/confini.vim b/runtime/syntax/confini.vim
new file mode 100644
index 0000000..823d417
--- /dev/null
+++ b/runtime/syntax/confini.vim
@@ -0,0 +1,12 @@
+" Vim syntax file
+" Language: confini
+
+" Quit if a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Use the cfg syntax for now, it's similar.
+runtime! syntax/cfg.vim
+
+let b:current_syntax = 'confini'
diff --git a/runtime/syntax/context.vim b/runtime/syntax/context.vim
new file mode 100644
index 0000000..08ab1f6
--- /dev/null
+++ b/runtime/syntax/context.vim
@@ -0,0 +1,144 @@
+vim9script
+
+# Vim syntax file
+# Language: ConTeXt typesetting engine
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Nikolai Weibull <now@bitwi.se>
+# Latest Revision: 2022 Aug 12
+
+if exists("b:current_syntax")
+ finish
+endif
+
+# Dictionary of (filetype, group) pairs to highlight between \startGROUP \stopGROUP.
+var context_include = get(b:, 'context_include', get(g:, 'context_include', {'xml': 'XML'}))
+
+# Deprecation warning
+if type(context_include) ==# type([])
+ echomsg "[ConTeXt] b:context_include/g:context_include must be Dictionaries."
+ context_include = {'xml': 'XML'}
+endif
+
+syn iskeyword @,48-57,_,!,?,a-z,A-Z,192-255
+
+syn spell toplevel
+
+runtime! syntax/shared/context-data-context.vim
+runtime! syntax/shared/context-data-interfaces.vim
+runtime! syntax/shared/context-data-tex.vim
+
+syn match contextCommand '\\\k\+\>' display contains=@NoSpell
+
+# ConTeXt options, i.e., [...] blocks
+syn region contextOptions matchgroup=contextDelimiter start='\[' end=']\|\ze\\stop' skip='\\\[\|\\\]' contains=TOP,@Spell
+
+# Highlight braces
+syn match contextDelimiter '[{}]'
+
+# Comments
+syn match contextComment '\%(\_^\|[^\\]\)\%(\\\\\)*\zs%.*$' display contains=contextTodo,contextMagicLine
+syn match contextComment '^\s*%[CDM].*$' display contains=contextTodo,contextMagicLine
+syn keyword contextTodo TODO FIXME XXX NOTE contained
+syn match contextMagicLine '^\s*%\s*!TEX.*$' contained
+
+syn match contextBlockDelim '\\\%(start\|stop\)\k\+' 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=contextComment keepend
+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 '\\unexpanded\>' display contains=@NoSpell
+
+# \unprotect... \protect regions
+syn region contextUnprotect matchgroup=contextBuiltin start='\\unprotect' end='\\protect' contains=TOP
+syn match contextSequence '\\[a-zA-Z]*[@_!?]\+[a-zA-Z@_!?]*' contains=@NoSpell contained containedin=contextUnprotect
+
+# Math
+syn match contextMathCmd '\\m\%(ath\%(ematics\)\=\)\=\>'
+syn region contextInlineMath matchgroup=contextMathDelim start='\$' skip='\\\\\|\\\$' end='\$'
+syn region contextDisplayMath matchgroup=contextMathDelim start='\$\$' skip='\\\\\|\\\$' end='\$\$' keepend
+syn region contextDisplayMath matchgroup=contextBlockDelim start='\\startformula' end='\\stopformula' contains=TOP
+
+# MetaFun
+b:mp_metafun = 1
+syn include @mpTop syntax/mp.vim
+unlet b:current_syntax
+
+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,@NoSpell
+
+# Lua
+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=contextComment
+syn region contextBeginEndLua matchgroup=contextSpecial
+ \ start="{" end="}" skip="\\[{}]"
+ \ contained contains=@luaTop,@NoSpell
+
+for synname in keys(context_include)
+ execute 'syn include @' .. synname .. 'Top' 'syntax/' .. synname .. '.vim'
+ unlet b:current_syntax
+ execute 'syn region context' .. context_include[synname] .. 'Code'
+ \ 'matchgroup=contextBlockDelim'
+ \ 'start=+\\start' .. context_include[synname] .. '\w*+'
+ \ 'end=+\\stop' .. context_include[synname] .. '\w*+'
+ \ 'contains=@' .. synname .. 'Top,@NoSpell'
+endfor
+
+syn match contextSectioning '\\\%(start\|stop\)\=\%(\%(sub\)*section\|\%(sub\)*subject\|chapter\|part\|component\|product\|title\)\>' contains=@NoSpell
+
+syn match contextSpecial '\\par\>\|-\{2,3}\||[<>/]\=|' contains=@NoSpell
+syn match contextSpecial /\\[`'"]/
+syn match contextSpecial +\\char\%(\d\{1,3}\|'\o\{1,3}\|"\x\{1,2}\)\>+ contains=@NoSpell
+syn match contextSpecial '\^\^.'
+syn match contextSpecial '`\%(\\.\|\^\^.\|.\)'
+
+syn match contextStyle '\\\%(em\|ss\|hw\|cg\|mf\)\>' contains=@NoSpell
+syn match contextFont '\\\%(CAP\|Cap\|cap\|Caps\|kap\|nocap\)\>' contains=@NoSpell
+syn match contextFont '\\\%(Word\|WORD\|Words\|WORDS\)\>' contains=@NoSpell
+syn match contextFont '\\\%(vi\{1,3}\|ix\|xi\{0,2}\)\>' contains=@NoSpell
+syn match contextFont '\\\%(tf\|b[si]\|s[cl]\|os\)\%(xx\|[xabcd]\)\=\>' contains=@NoSpell
+
+hi def link contextBlockDelim Keyword
+hi def link contextBuiltin Keyword
+hi def link contextCommand Keyword
+hi def link contextComment Comment
+hi def link contextDelimiter Delimiter
+hi def link contextDirectLua Keyword
+hi def link contextEscaped String
+hi def link contextFont contextType
+hi def link contextKeyword Keyword
+hi def link contextInlineMath String
+hi def link contextMagicLine PreProc
+hi def link contextMathCmd Identifier
+hi def link contextMathDelim Delimiter
+hi def link contextOptions Typedef
+hi def link contextPreProc PreProc
+hi def link contextSectioning PreProc
+hi def link contextSequence Identifier
+hi def link contextSpecial Special
+hi def link contextStyle contextType
+hi def link contextTodo Todo
+hi def link contextType Type
+
+b:current_syntax = 'context'
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/syntax/cpp.vim b/runtime/syntax/cpp.vim
new file mode 100644
index 0000000..5437580
--- /dev/null
+++ b/runtime/syntax/cpp.vim
@@ -0,0 +1,129 @@
+" Vim syntax file
+" Language: C++
+" Current Maintainer: vim-jp (https://github.com/vim-jp/vim-cpp)
+" Previous Maintainer: Ken Shan <ccshan@post.harvard.edu>
+" Last Change: 2021 Aug 23
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" inform C syntax that the file was included from cpp.vim
+let b:filetype_in_cpp_family = 1
+
+" Read the C syntax to start with
+runtime! syntax/c.vim
+unlet b:current_syntax
+
+" C++ extensions
+syn keyword cppStatement new delete this friend using
+syn keyword cppAccess public protected private
+syn keyword cppModifier inline virtual explicit export
+syn keyword cppType bool wchar_t
+syn keyword cppExceptions throw try catch
+syn keyword cppOperator operator typeid
+syn keyword cppOperator and bitor or xor compl bitand and_eq or_eq xor_eq not not_eq
+syn match cppCast "\<\(const\|static\|dynamic\|reinterpret\)_cast\s*<"me=e-1
+syn match cppCast "\<\(const\|static\|dynamic\|reinterpret\)_cast\s*$"
+syn keyword cppStorageClass mutable
+syn keyword cppStructure class typename template namespace
+syn keyword cppBoolean true false
+syn keyword cppConstant __cplusplus
+
+" C++ 11 extensions
+if !exists("cpp_no_cpp11")
+ syn keyword cppModifier override final
+ syn keyword cppType nullptr_t auto
+ syn keyword cppExceptions noexcept
+ syn keyword cppStorageClass constexpr decltype thread_local
+ syn keyword cppConstant nullptr
+ syn keyword cppConstant ATOMIC_FLAG_INIT ATOMIC_VAR_INIT
+ syn keyword cppConstant ATOMIC_BOOL_LOCK_FREE ATOMIC_CHAR_LOCK_FREE
+ syn keyword cppConstant ATOMIC_CHAR16_T_LOCK_FREE ATOMIC_CHAR32_T_LOCK_FREE
+ syn keyword cppConstant ATOMIC_WCHAR_T_LOCK_FREE ATOMIC_SHORT_LOCK_FREE
+ syn keyword cppConstant ATOMIC_INT_LOCK_FREE ATOMIC_LONG_LOCK_FREE
+ syn keyword cppConstant ATOMIC_LLONG_LOCK_FREE ATOMIC_POINTER_LOCK_FREE
+ syn region cppRawString matchgroup=cppRawStringDelimiter start=+\%(u8\|[uLU]\)\=R"\z([[:alnum:]_{}[\]#<>%:;.?*\+\-/\^&|~!=,"']\{,16}\)(+ end=+)\z1"\(sv\|s\|_[_a-zA-Z][_a-zA-Z0-9]*\)\=+ contains=@Spell
+ syn match cppCast "\<\(const\|static\|dynamic\)_pointer_cast\s*<"me=e-1
+ syn match cppCast "\<\(const\|static\|dynamic\)_pointer_cast\s*$"
+endif
+
+" C++ 14 extensions
+if !exists("cpp_no_cpp14")
+ syn match cppNumbers display transparent "\<\d\|\.\d" contains=cppNumber,cppFloat
+ syn match cppNumber display contained "\<0\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+ syn match cppNumber display contained "\<[1-9]\('\=\d\+\)*\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+ syn match cppNumber display contained "\<0\o\+\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+ syn match cppNumber display contained "\<0b[01]\('\=[01]\+\)*\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+ syn match cppNumber display contained "\<0x\x\('\=\x\+\)*\([Uu]\=\([Ll]\|LL\|ll\)\|\([Ll]\|LL\|ll\)\=[Uu]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+ syn match cppFloat display contained "\<\d\+\.\d*\(e[-+]\=\d\+\)\=\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+ syn match cppFloat display contained "\<\.\d\+\(e[-+]\=\d\+\)\=\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+ syn match cppFloat display contained "\<\d\+e[-+]\=\d\+\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+ syn region cppString start=+\(L\|u\|u8\|U\)\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"\(sv\|s\|_\i*\)\=+ end='$' contains=cSpecial,cFormat,@Spell
+endif
+
+" C++ 17 extensions
+if !exists("cpp_no_cpp17")
+ syn match cppCast "\<reinterpret_pointer_cast\s*<"me=e-1
+ syn match cppCast "\<reinterpret_pointer_cast\s*$"
+ syn match cppFloat display contained "\<0x\x*\.\x\+p[-+]\=\d\+\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+ syn match cppFloat display contained "\<0x\x\+\.\=p[-+]\=\d\+\([FfLl]\|i[fl]\=\|h\|min\|s\|ms\|us\|ns\|_\i*\)\=\>"
+
+ " TODO: push this up to c.vim if/when supported in C23
+ syn match cppCharacter "u8'[^\\]'"
+ syn match cppCharacter "u8'[^']*'" contains=cSpecial
+ if exists("c_gnu")
+ syn match cppSpecialError "u8'\\[^'\"?\\abefnrtv]'"
+ syn match cppSpecialCharacter "u8'\\['\"?\\abefnrtv]'"
+ else
+ syn match cppSpecialError "u8'\\[^'\"?\\abfnrtv]'"
+ syn match cppSpecialCharacter "u8'\\['\"?\\abfnrtv]'"
+ endif
+ syn match cppSpecialCharacter display "u8'\\\o\{1,3}'"
+ syn match cppSpecialCharacter display "u8'\\x\x\+'"
+
+endif
+
+" C++ 20 extensions
+if !exists("cpp_no_cpp20")
+ syn match cppNumber display contained "\<0\(y\|d\)\>"
+ syn match cppNumber display contained "\<[1-9]\('\=\d\+\)*\(y\|d\)\>"
+ syn match cppNumber display contained "\<0\o\+\(y\|d\)\>"
+ syn match cppNumber display contained "\<0b[01]\('\=[01]\+\)*\(y\|d\)\>"
+ syn match cppNumber display contained "\<0x\x\('\=\x\+\)*\(y\|d\)\>"
+ syn keyword cppStatement co_await co_return co_yield requires
+ syn keyword cppStorageClass consteval constinit
+ syn keyword cppStructure concept
+ syn keyword cppType char8_t
+ syn keyword cppModule import module export
+endif
+
+" The minimum and maximum operators in GNU C++
+syn match cppMinMax "[<>]?"
+
+" Default highlighting
+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 cppCharacter cCharacter
+hi def link cppSpecialCharacter cSpecialCharacter
+hi def link cppSpecialError cSpecialError
+hi def link cppConstant Constant
+hi def link cppRawStringDelimiter Delimiter
+hi def link cppRawString String
+hi def link cppString String
+hi def link cppNumber Number
+hi def link cppFloat Number
+hi def link cppModule Include
+
+let b:current_syntax = "cpp"
+
+" vim: ts=8
diff --git a/runtime/syntax/crm.vim b/runtime/syntax/crm.vim
new file mode 100644
index 0000000..5285de3
--- /dev/null
+++ b/runtime/syntax/crm.vim
@@ -0,0 +1,41 @@
+" Vim syntax file
+" Language: CRM114
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword crmTodo contained TODO FIXME XXX NOTE
+
+syn region crmComment display oneline start='#' end='\\#'
+ \ contains=crmTodo,@Spell
+
+syn match crmVariable display ':[*#@]:[^:]\{-1,}:'
+
+syn match crmSpecial display '\\\%(x\x\x\|o\o\o\o\|[]nrtabvf0>)};/\\]\)'
+
+syn keyword crmStatement insert noop accept alius alter classify eval exit
+syn keyword crmStatement fail fault goto hash intersect isolate input learn
+syn keyword crmStatement liaf match output syscall trap union window
+
+syn region crmRegex start='/' skip='\\/' end='/' contains=crmVariable
+
+syn match crmLabel display '^\s*:[[:graph:]]\+:'
+
+hi def link crmTodo Todo
+hi def link crmComment Comment
+hi def link crmVariable Identifier
+hi def link crmSpecial SpecialChar
+hi def link crmStatement Statement
+hi def link crmRegex String
+hi def link crmLabel Label
+
+let b:current_syntax = "crm"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/crontab.vim b/runtime/syntax/crontab.vim
new file mode 100644
index 0000000..5e38ffa
--- /dev/null
+++ b/runtime/syntax/crontab.vim
@@ -0,0 +1,67 @@
+" Vim syntax file
+" Language: crontab
+" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz>
+" Original Maintainer: John Hoelzel johnh51@users.sourceforge.net
+" License: This file can be redistribued and/or modified under the same terms
+" as Vim itself.
+" Filenames: /tmp/crontab.* used by "crontab -e"
+" Last Change: 2015-01-20
+"
+" crontab line format:
+" Minutes Hours Days Months Days_of_Week Commands # comments
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax match crontabNick "^\s*@\(reboot\|yearly\|annually\|monthly\|weekly\|daily\|midnight\|hourly\)\>" nextgroup=crontabCmd skipwhite
+
+syntax match crontabVar "^\s*\k\w*\s*="me=e-1
+
+syntax case ignore
+
+syntax match crontabMin "^\s*[-0-9/,.*]\+" nextgroup=crontabHr skipwhite
+syntax match crontabHr "\s[-0-9/,.*]\+" nextgroup=crontabDay skipwhite contained
+syntax match crontabDay "\s[-0-9/,.*]\+" nextgroup=crontabMnth skipwhite contained
+
+syntax match crontabMnth "\s[-a-z0-9/,.*]\+" nextgroup=crontabDow skipwhite contained
+syntax keyword crontabMnth12 contained jan feb mar apr may jun jul aug sep oct nov dec
+
+syntax match crontabDow "\s[-a-z0-9/,.*]\+" nextgroup=crontabCmd skipwhite contained
+syntax keyword crontabDow7 contained sun mon tue wed thu fri sat
+
+syntax region crontabCmd start="\S" end="$" skipwhite contained keepend contains=crontabPercent
+syntax match crontabCmnt "^\s*#.*" contains=@Spell
+syntax match crontabPercent "[^\\]%.*"lc=1 contained
+
+" Define the default highlighting.
+" 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.
+hi def link crontabCmd Statement
+
+hi def link crontabCmnt Comment
+
+
+let b:current_syntax = "crontab"
+
+" vim: ts=8
diff --git a/runtime/syntax/cs.vim b/runtime/syntax/cs.vim
new file mode 100644
index 0000000..104470a
--- /dev/null
+++ b/runtime/syntax/cs.vim
@@ -0,0 +1,331 @@
+" Vim syntax file
+" Language: C#
+" Maintainer: Nick Jensen <nickspoon@gmail.com>
+" Former Maintainers: Anduin Withers <awithers@anduin.com>
+" Johannes Zellner <johannes@zellner.org>
+" Last Change: 2022-11-16
+" Filenames: *.cs
+" License: Vim (see :h license)
+" Repository: https://github.com/nickspoons/vim-cs
+"
+" References:
+" - ECMA-334 5th Edition: C# Language Specification
+" https://www.ecma-international.org/publications-and-standards/standards/ecma-334/
+" - C# Language Design: Draft 6th Edition and later proposals
+" https://github.com/dotnet/csharplang
+
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:save_cpo = &cpoptions
+set cpoptions&vim
+
+syn keyword csType bool byte char decimal double float int long object sbyte short string T uint ulong ushort var void dynamic
+syn keyword csType nint nuint " contextual
+
+syn keyword csStorage enum interface namespace struct
+syn match csStorage "\<record\ze\_s\+@\=\h\w*\_s*[<(:{;]"
+syn match csStorage "\%(\<\%(partial\|new\|public\|protected\|internal\|private\|abstract\|sealed\|static\|unsafe\|readonly\)\)\@9<=\_s\+record\>"
+syn match csStorage "\<record\ze\_s\+\%(class\|struct\)"
+syn match csStorage "\<delegate\>"
+syn keyword csRepeat break continue do for foreach goto return while
+syn keyword csConditional else if switch
+syn keyword csLabel case default
+
+syn match csNamespaceAlias "@\=\h\w*\ze\_s*::" display
+syn match csGlobalNamespaceAlias "global\ze\_s*::" display
+syn cluster csNamespaceAlias contains=csGlobalNamespaceAlias,csNamespaceAlias,csNamespaceAliasQualifier
+
+" user labels
+syn match csLabel display +^\s*\I\i*\s*:\%([^:]\)\@=+
+
+" Function pointers
+syn match csType "\<delegate\s*\*" contains=csOpSymbols nextgroup=csManagedModifier skipwhite skipempty
+syn keyword csManagedModifier managed unmanaged contained
+
+" Modifiers
+syn match csUsingModifier "\<global\ze\_s\+using\>"
+syn keyword csAccessModifier internal private protected public
+syn keyword csModifier operator nextgroup=csCheckedModifier skipwhite skipempty
+syn keyword csCheckedModifier checked contained
+
+" TODO: in new out
+syn keyword csModifier abstract const event override readonly sealed static virtual volatile
+syn match csModifier "\<\%(extern\|fixed\|unsafe\)\>"
+syn match csModifier "\<partial\ze\_s\+\%(class\|struct\|interface\|record\|void\)\>"
+
+syn keyword csException try catch finally throw when
+syn keyword csLinq ascending by descending equals from group in into join let on orderby select
+syn match csLinq "\<where\>"
+
+" Type parameter constraint clause
+syn match csStorage "\<where\>\ze\_s\+@\=\h\w*\_s*:"
+
+" Async
+syn keyword csAsyncModifier async
+syn keyword csAsyncOperator await
+
+syn match csStorage "\<extern\ze\s\+alias\>"
+syn match csStorage "\%(\<extern\s\+\)\@16<=alias\>"
+
+syn match csStatement "\<\%(checked\|unchecked\|unsafe\)\ze\_s*{"
+syn match csStatement "\<fixed\ze\_s*("
+syn keyword csStatement lock
+syn match csStatement "\<yield\ze\_s\+\%(return\|break\)\>"
+
+syn match csAccessor "\<\%(get\|set\|init\|add\|remove\)\ze\_s*\%([;{]\|=>\)"
+
+syn keyword csAccess base
+syn match csAccess "\<this\>"
+
+" Extension method parameter modifier
+syn match csModifier "\<this\ze\_s\+@\=\h"
+
+syn keyword csUnspecifiedStatement as in is nameof out params ref sizeof stackalloc using
+syn keyword csUnsupportedStatement value
+syn keyword csUnspecifiedKeyword explicit implicit
+
+" Operators
+syn keyword csTypeOf typeof nextgroup=csTypeOfOperand,csTypeOfError skipwhite skipempty
+syn region csTypeOfOperand matchgroup=csParens start="(" end=")" contained contains=csType
+syn match csTypeOfError "[^([:space:]]" contained
+syn match csKeywordOperator "\<\%(checked\|unchecked\)\ze\_s*("
+
+" Punctuation
+syn match csBraces "[{}[\]]" display
+syn match csParens "[()]" display
+syn match csOpSymbols "+\{1,2}" display
+syn match csOpSymbols "-\{1,2}" display
+syn match csOpSymbols "=\{1,2}" display
+syn match csOpSymbols ">\{1,2}" 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
+syn match csNamespaceAliasQualifier "::" display
+
+" Generics
+syn region csGeneric matchgroup=csGenericBraces start="<" end=">" oneline contains=csType,csGeneric,@csNamespaceAlias,csUserType,csUserIdentifier,csUserInterface,csUserMethod
+
+" Comments
+"
+" PROVIDES: @csCommentHook
+syn keyword csTodo contained TODO FIXME XXX NOTE HACK TBD
+syn region csBlockComment start="/\*" end="\*/" contains=@csCommentHook,csTodo,@Spell
+syn match csLineComment "//.*$" contains=@csCommentHook,csTodo,@Spell
+syn cluster csComment contains=csLineComment,csBlockComment
+
+syn region csSummary start="^\s*/// <summary" end="^\%\(\s*///\)\@!" transparent fold keepend
+
+" xml markup inside '///' and /**...*/ comments
+syn cluster xmlRegionHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle
+syn cluster xmlCdataHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle
+syn cluster xmlStartTagHook add=csXmlLineCommentLeader,csXmlBlockCommentMiddle
+syn cluster xmlTagHook add=csXmlTag
+syn cluster xmlAttribHook add=csXmlAttrib
+
+" https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/xmldoc/recommended-tags
+syn keyword csXmlTag contained summary remarks
+syn keyword csXmlTag contained returns param paramref exception value
+syn keyword csXmlTag contained para list c code example
+syn keyword csXmlTag contained inheritdoc include
+syn keyword csXmlTag contained see seealso
+syn keyword csXmlTag contained typeparam typeparamref
+syn keyword csXmlTag contained b i u br a
+syn keyword csXmlAttrib contained cref href
+
+syn match csXmlLineCommentLeader "///" contained
+syn match csXmlLineComment "///.*$" contains=csXmlLineCommentLeader,@csXml,@Spell keepend
+syn match csXmlBlockCommentMiddle "^\s*\zs\*" contained
+syn region csXmlBlockComment start="/\*\*" end="\*/" contains=@csXml,@Spell,csXmlBlockCommentMiddle keepend
+syn include @csXml syntax/xml.vim
+hi def link xmlRegion Comment
+
+" Since syntax/xml.vim contains `syn spell toplevel`, we need to set it back to `default` here.
+syn spell default
+
+" Pre-processing directives
+syn region csPreProcDeclaration start="^\s*\zs#\s*\%(define\|undef\)\>" end="$" contains=csLineComment keepend
+syn region csPreProcConditional start="^\s*\zs#\s*\%(if\|elif\)\>" end="$" contains=csLineComment keepend
+syn region csPreProcConditional start="^\s*\zs#\s*\%(else\|endif\)\>" end="$" contains=csLineComment keepend
+syn region csPreProcLine start="^\s*\zs#\s*line\>" end="$" contains=csLineComment keepend
+syn region csPreProcDiagnostic start="^\s*\zs#\s*\%(error\|warning\)\>" end="$"
+syn region csPreProcConditionalSection matchgroup=csPreProcRegion start="^\s*#\s*region\>.*" end="^\s*#\s*endregion\>.*" transparent fold contains=TOP
+syn region csPreProcPragma start="^\s*\zs#\s*pragma\>" end="$" contains=csLineComment keepend
+syn region csPreProcNullable start="^\s*\zs#\s*nullable\>" end="$" contains=csLineComment keepend
+
+if expand('%:e') == 'csx' || getline('1') =~ '^#!.*\<dotnet-script\>'
+ syn region csPreProcInclude start="^\s*\zs#\s*\%(load\|r\)\>" end="$" contains=csLineComment keepend
+ syn match csShebang "\%^#!.*" display
+endif
+
+syn cluster csPreProcessor contains=csPreProc.*
+
+syn region csClassType start="\<class\>"hs=s+6 end=">" end="[:{]"me=e-1 contains=csClass
+" csUserType may be defined by user scripts/plugins - it should be contained in csNewType
+syn region csNewType start="\<new\>"hs=s+4 end="[;\n{(<\[]"me=e-1 contains=csNew,@csNamespaceAlias,csUserType
+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
+
+syn keyword csBoolean false true
+syn keyword csNull null
+
+" Strings and constants
+syn match csSpecialError "\\." contained
+syn match csSpecialCharError "[^']" contained
+" Character literals
+syn match csSpecialChar +\\["\\'0abfnrtv]+ contained display
+syn match csUnicodeNumber +\\x\x\{1,4}+ contained contains=csUnicodeSpecifier display
+syn match csUnicodeNumber +\\u\x\{4}+ contained contains=csUnicodeSpecifier display
+syn match csUnicodeNumber +\\U00\x\{6}+ contained contains=csUnicodeSpecifier display
+syn match csUnicodeSpecifier +\\[uUx]+ contained display
+
+syn region csString matchgroup=csQuote start=+"+ end=+"\%(u8\)\=+ end=+$+ extend contains=csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
+syn match csCharacter "'[^']*'" contains=csSpecialChar,csSpecialCharError,csUnicodeNumber display
+syn match csCharacter "'\\''" contains=csSpecialChar display
+syn match csCharacter "'[^\\]'" display
+
+" Numbers
+syn case ignore
+syn match csInteger "\<0b[01_]*[01]\%([lu]\|lu\|ul\)\=\>" display
+syn match csInteger "\<\d\+\%(_\+\d\+\)*\%([lu]\|lu\|ul\)\=\>" display
+syn match csInteger "\<0x[[:xdigit:]_]*\x\%([lu]\|lu\|ul\)\=\>" display
+syn match csReal "\<\d\+\%(_\+\d\+\)*\.\d\+\%(_\+\d\+\)*\%\(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=" display
+syn match csReal "\.\d\+\%(_\+\d\+\)*\%(e[-+]\=\d\+\%(_\+\d\+\)*\)\=[fdm]\=\>" display
+syn match csReal "\<\d\+\%(_\+\d\+\)*e[-+]\=\d\+\%(_\+\d\+\)*[fdm]\=\>" display
+syn match csReal "\<\d\+\%(_\+\d\+\)*[fdm]\>" display
+syn case match
+syn cluster csNumber contains=csInteger,csReal
+
+syn region csInterpolatedString matchgroup=csQuote start=+\$"+ end=+"\%(u8\)\=+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,@Spell
+
+syn region csInterpolation matchgroup=csInterpolationDelimiter start=+{+ end=+}+ keepend contained contains=@csAll,csBraced,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,csBoolean,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=+"\%(u8\)\=+ skip=+""+ extend contains=csVerbatimQuote,@Spell
+syn match csVerbatimQuote +""+ contained
+
+syn region csInterVerbString matchgroup=csQuote start=+$@"+ start=+@$"+ end=+"\%(u8\)\=+ skip=+""+ extend contains=csInterpolation,csEscapedInterpolation,csSpecialChar,csSpecialError,csUnicodeNumber,csVerbatimQuote,@Spell
+
+syn cluster csString contains=csString,csInterpolatedString,csVerbatimString,csInterVerbString
+
+syn cluster csLiteral contains=csBoolean,@csNumber,csCharacter,@csString,csNull
+
+syn region csBracketed matchgroup=csParens start=+(+ end=+)+ extend contained transparent contains=@csAll,csBraced,csBracketed
+syn region csBraced matchgroup=csParens start=+{+ end=+}+ extend contained transparent contains=@csAll,csBraced,csBracketed
+
+syn cluster csAll contains=@csLiteral,csClassType,@csComment,csEndColon,csIsType,csLabel,csLogicSymbols,csNewType,csOpSymbols,csParens,@csPreProcessor,csSummary,@csNamespaceAlias,csType,csUnicodeNumber,csUserType,csUserIdentifier,csUserInterface,csUserMethod
+
+" Keyword identifiers
+syn match csIdentifier "@\h\w*"
+
+" The default highlighting.
+hi def link csUnspecifiedStatement Statement
+hi def link csUnsupportedStatement Statement
+hi def link csUnspecifiedKeyword Keyword
+
+hi def link csGlobalNamespaceAlias Include
+
+hi def link csType Type
+hi def link csClassType Type
+hi def link csIsType Type
+
+hi def link csStorage Structure
+hi def link csClass Structure
+hi def link csNew Statement
+hi def link csIsAs Keyword
+hi def link csAccessor Keyword
+hi def link csAccess Keyword
+
+hi def link csLinq Statement
+
+hi def link csStatement Statement
+hi def link csRepeat Repeat
+hi def link csConditional Conditional
+hi def link csLabel Label
+hi def link csException Exception
+
+hi def link csModifier StorageClass
+hi def link csAccessModifier csModifier
+hi def link csAsyncModifier csModifier
+hi def link csCheckedModifier csModifier
+hi def link csManagedModifier csModifier
+hi def link csUsingModifier csModifier
+
+hi def link csTodo Todo
+hi def link csComment Comment
+hi def link csLineComment csComment
+hi def link csBlockComment csComment
+
+hi def link csKeywordOperator Keyword
+hi def link csAsyncOperator csKeywordOperator
+hi def link csTypeOf csKeywordOperator
+hi def link csTypeOfOperand Typedef
+hi def link csTypeOfError Error
+hi def link csOpSymbols Operator
+hi def link csLogicSymbols Operator
+
+hi def link csSpecialError Error
+hi def link csSpecialCharError Error
+hi def link csString String
+hi def link csQuote String
+hi def link csInterpolatedString String
+hi def link csVerbatimString String
+hi def link csInterVerbString String
+hi def link csVerbatimQuote SpecialChar
+
+hi def link csPreProc PreProc
+hi def link csPreProcDeclaration Define
+hi def link csPreProcConditional PreCondit
+hi def link csPreProcLine csPreProc
+hi def link csPreProcDiagnostic csPreProc
+hi def link csPreProcRegion csPreProc
+hi def link csPreProcPragma csPreProc
+hi def link csPreProcNullable csPreProc
+hi def link csPreProcInclude csPreProc
+hi def link csShebang csPreProc
+
+hi def link csConstant Constant
+hi def link csNull Constant
+hi def link csBoolean Boolean
+hi def link csCharacter Character
+hi def link csSpecialChar SpecialChar
+hi def link csInteger Number
+hi def link csReal Float
+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
+
+hi def link csGenericBraces csBraces
+
+" xml markup
+hi def link csXmlLineCommentLeader Comment
+hi def link csXmlLineComment Comment
+hi def link csXmlBlockComment Comment
+hi def link csXmlBlockCommentMiddle csXmlBlockComment
+hi def link csXmlTag Statement
+hi def link csXmlAttrib Statement
+
+let b:current_syntax = 'cs'
+
+let &cpoptions = s:save_cpo
+unlet s:save_cpo
+
+" vim: vts=16,28
diff --git a/runtime/syntax/csc.vim b/runtime/syntax/csc.vim
new file mode 100644
index 0000000..b1bc4d6
--- /dev/null
+++ b/runtime/syntax/csc.vim
@@ -0,0 +1,191 @@
+" Vim syntax file
+" Language: Essbase script
+" Maintainer: Raul Segura Acevedo <raulseguraaceved@netscape.net>
+" Last change: 2011 Dec 25 by Thilo Six
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" folds: fix/endfix and comments
+sy region EssFold start="\<Fix" end="EndFix" transparent fold
+
+sy keyword cscTodo contained TODO FIXME XXX
+
+" cscCommentGroup allows adding matches for special things in comments
+sy cluster cscCommentGroup contains=cscTodo
+
+" Strings in quotes
+sy match cscError '"'
+sy match cscString '"[^"]*"'
+
+"when wanted, highlight trailing white space
+if exists("csc_space_errors")
+ if !exists("csc_no_trail_space_error")
+ sy match cscSpaceE "\s\+$"
+ endif
+ if !exists("csc_no_tab_space_error")
+ sy match cscSpaceE " \+\t"me=e-1
+ endif
+endif
+
+"catch errors caused by wrong parenthesis and brackets
+sy cluster cscParenGroup contains=cscParenE,@cscCommentGroup,cscUserCont,cscBitField,cscFormat,cscNumber,cscFloat,cscOctal,cscNumbers,cscIfError,cscComW,cscCom,cscFormula,cscBPMacro
+sy region cscParen transparent start='(' end=')' contains=ALLBUT,@cscParenGroup
+sy match cscParenE ")"
+
+"integer number, or floating point number without a dot and with "f".
+sy case ignore
+sy match cscNumbers transparent "\<\d\|\.\d" contains=cscNumber,cscFloat,cscOctal
+sy match cscNumber contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
+"hex number
+sy match cscNumber contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+" Flag the first zero of an octal number as something special
+sy match cscOctal contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>"
+sy match cscFloat contained "\d\+f"
+"floating point number, with dot, optional exponent
+sy match cscFloat contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
+"floating point number, starting with a dot, optional exponent
+sy match cscFloat contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+sy match cscFloat contained "\d\+e[-+]\=\d\+[fl]\=\>"
+
+sy region cscComment start="/\*" end="\*/" contains=@cscCommentGroup,cscSpaceE fold
+sy match cscCommentE "\*/"
+
+sy keyword cscIfError IF ELSE ENDIF ELSEIF
+sy keyword cscCondition contained IF ELSE ENDIF ELSEIF
+sy keyword cscFunction contained VARPER VAR UDA TRUNCATE SYD SUMRANGE SUM
+sy keyword cscFunction contained STDDEVRANGE STDDEV SPARENTVAL SLN SIBLINGS SHIFT
+sy keyword cscFunction contained SANCESTVAL RSIBLINGS ROUND REMAINDER RELATIVE PTD
+sy keyword cscFunction contained PRIOR POWER PARENTVAL NPV NEXT MOD MINRANGE MIN
+sy keyword cscFunction contained MDSHIFT MDPARENTVAL MDANCESTVAL MAXRANGE MAX MATCH
+sy keyword cscFunction contained LSIBLINGS LEVMBRS LEV
+sy keyword cscFunction contained ISUDA ISSIBLING ISSAMELEV ISSAMEGEN ISPARENT ISMBR
+sy keyword cscFunction contained ISLEV ISISIBLING ISIPARENT ISIDESC ISICHILD ISIBLINGS
+sy keyword cscFunction contained ISIANCEST ISGEN ISDESC ISCHILD ISANCEST ISACCTYPE
+sy keyword cscFunction contained IRSIBLINGS IRR INTEREST INT ILSIBLINGS IDESCENDANTS
+sy keyword cscFunction contained ICHILDREN IANCESTORS IALLANCESTORS
+sy keyword cscFunction contained GROWTH GENMBRS GEN FACTORIAL DISCOUNT DESCENDANTS
+sy keyword cscFunction contained DECLINE CHILDREN CURRMBRRANGE CURLEV CURGEN
+sy keyword cscFunction contained COMPOUNDGROWTH COMPOUND AVGRANGE AVG ANCESTVAL
+sy keyword cscFunction contained ANCESTORS ALLANCESTORS ACCUM ABS
+sy keyword cscFunction contained @VARPER @VAR @UDA @TRUNCATE @SYD @SUMRANGE @SUM
+sy keyword cscFunction contained @STDDEVRANGE @STDDEV @SPARENTVAL @SLN @SIBLINGS @SHIFT
+sy keyword cscFunction contained @SANCESTVAL @RSIBLINGS @ROUND @REMAINDER @RELATIVE @PTD
+sy keyword cscFunction contained @PRIOR @POWER @PARENTVAL @NPV @NEXT @MOD @MINRANGE @MIN
+sy keyword cscFunction contained @MDSHIFT @MDPARENTVAL @MDANCESTVAL @MAXRANGE @MAX @MATCH
+sy keyword cscFunction contained @LSIBLINGS @LEVMBRS @LEV
+sy keyword cscFunction contained @ISUDA @ISSIBLING @ISSAMELEV @ISSAMEGEN @ISPARENT @ISMBR
+sy keyword cscFunction contained @ISLEV @ISISIBLING @ISIPARENT @ISIDESC @ISICHILD @ISIBLINGS
+sy keyword cscFunction contained @ISIANCEST @ISGEN @ISDESC @ISCHILD @ISANCEST @ISACCTYPE
+sy keyword cscFunction contained @IRSIBLINGS @IRR @INTEREST @INT @ILSIBLINGS @IDESCENDANTS
+sy keyword cscFunction contained @ICHILDREN @IANCESTORS @IALLANCESTORS
+sy keyword cscFunction contained @GROWTH @GENMBRS @GEN @FACTORIAL @DISCOUNT @DESCENDANTS
+sy keyword cscFunction contained @DECLINE @CHILDREN @CURRMBRRANGE @CURLEV @CURGEN
+sy keyword cscFunction contained @COMPOUNDGROWTH @COMPOUND @AVGRANGE @AVG @ANCESTVAL
+sy keyword cscFunction contained @ANCESTORS @ALLANCESTORS @ACCUM @ABS
+sy match cscFunction contained "@"
+sy match cscError "@\s*\a*" contains=cscFunction
+
+sy match cscStatement "&"
+sy keyword cscStatement AGG ARRAY VAR CCONV CLEARDATA DATACOPY
+
+sy match cscComE contained "^\s*CALC.*"
+sy match cscComE contained "^\s*CLEARBLOCK.*"
+sy match cscComE contained "^\s*SET.*"
+sy match cscComE contained "^\s*FIX"
+sy match cscComE contained "^\s*ENDFIX"
+sy match cscComE contained "^\s*ENDLOOP"
+sy match cscComE contained "^\s*LOOP"
+" sy keyword cscCom FIX ENDFIX LOOP ENDLOOP
+
+sy match cscComW "^\s*CALC.*"
+sy match cscCom "^\s*CALC\s*ALL"
+sy match cscCom "^\s*CALC\s*AVERAGE"
+sy match cscCom "^\s*CALC\s*DIM"
+sy match cscCom "^\s*CALC\s*FIRST"
+sy match cscCom "^\s*CALC\s*LAST"
+sy match cscCom "^\s*CALC\s*TWOPASS"
+
+sy match cscComW "^\s*CLEARBLOCK.*"
+sy match cscCom "^\s*CLEARBLOCK\s\+ALL"
+sy match cscCom "^\s*CLEARBLOCK\s\+UPPER"
+sy match cscCom "^\s*CLEARBLOCK\s\+NONINPUT"
+
+sy match cscComW "^\s*\<SET.*"
+sy match cscCom "^\s*\<SET\s\+Commands"
+sy match cscCom "^\s*\<SET\s\+AGGMISSG"
+sy match cscCom "^\s*\<SET\s\+CACHE"
+sy match cscCom "^\s*\<SET\s\+CALCHASHTBL"
+sy match cscCom "^\s*\<SET\s\+CLEARUPDATESTATUS"
+sy match cscCom "^\s*\<SET\s\+FRMLBOTTOMUP"
+sy match cscCom "^\s*\<SET\s\+LOCKBLOCK"
+sy match cscCom "^\s*\<SET\s\+MSG"
+sy match cscCom "^\s*\<SET\s\+NOTICE"
+sy match cscCom "^\s*\<SET\s\+UPDATECALC"
+sy match cscCom "^\s*\<SET\s\+UPTOLOCAL"
+
+sy keyword cscBPMacro contained !LoopOnAll !LoopOnLevel !LoopOnSelected
+sy keyword cscBPMacro contained !CurrentMember !LoopOnDimensions !CurrentDimension
+sy keyword cscBPMacro contained !CurrentOtherLoopDimension !LoopOnOtherLoopDimensions
+sy keyword cscBPMacro contained !EndLoop !AllMembers !SelectedMembers !If !Else !EndIf
+sy keyword cscBPMacro contained LoopOnAll LoopOnLevel LoopOnSelected
+sy keyword cscBPMacro contained CurrentMember LoopOnDimensions CurrentDimension
+sy keyword cscBPMacro contained CurrentOtherLoopDimension LoopOnOtherLoopDimensions
+sy keyword cscBPMacro contained EndLoop AllMembers SelectedMembers If Else EndIf
+sy match cscBPMacro contained "!"
+sy match cscBPW "!\s*\a*" contains=cscBPmacro
+
+" when wanted, highlighting lhs members or errors in assignments (may lag the editing)
+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
+ sy match cscEq "=="
+endif
+
+if !exists("csc_minlines")
+ let csc_minlines = 50 " mostly for () constructs
+endif
+exec "sy sync ccomment cscComment minlines=" . csc_minlines
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "csc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/csdl.vim b/runtime/syntax/csdl.vim
new file mode 100644
index 0000000..f7d30f1
--- /dev/null
+++ b/runtime/syntax/csdl.vim
@@ -0,0 +1,536 @@
+" Vim syntax file
+" Language: Curated Stream Definition Language (CSDL)
+" Maintainer: Jacek Artymiak
+" Latest Revision: 25 February 2013
+
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=.,@,48-57,_,192-255
+syn case ignore
+
+syn match csdlKeyword "tag "
+syn match csdlKeyword "stream "
+syn match csdlKeyword "return "
+
+syn keyword csdlOperator contains
+syn match csdlOperator "cs contains"
+syn keyword csdlOperator substr
+syn match csdlOperator "cs substr"
+syn keyword csdlOperator contains_any
+syn match csdlOperator "cs contains_any"
+syn keyword csdlOperator any
+syn match csdlOperator "cs any"
+syn keyword csdlOperator contains_near
+syn match csdlOperator "cs contains_near"
+syn keyword csdlOperator exists
+syn keyword csdlOperator in
+syn keyword csdlOperator url_in
+syn match csdlOperator "=="
+syn match csdlOperator "!="
+syn match csdlOperator "cs =="
+syn match csdlOperator "cs !="
+syn match csdlOperator ">"
+syn match csdlOperator ">="
+syn match csdlOperator "<"
+syn match csdlOperator "<="
+syn keyword csdlOperator regex_partial
+syn keyword csdlOperator regex_exact
+syn keyword csdlOperator geo_box
+syn keyword csdlOperator geo_radius
+syn keyword csdlOperator geo_polygon
+
+syn keyword csdlLogicalOperator and
+syn keyword csdlLogicalOperator or
+syn keyword csdlLogicalOperator not
+
+syn match csdlTarget 'reddit\.title'
+syn match csdlTarget 'reddit\.content'
+syn match csdlTarget 'reddit\.contenttype'
+syn match csdlTarget 'reddit\.link'
+syn match csdlTarget 'reddit\.author\.name'
+syn match csdlTarget 'reddit\.author\.link'
+syn match csdlTarget 'reddit\.type'
+syn match csdlTarget 'reddit\.thread'
+syn match csdlTarget 'interaction\.type'
+syn match csdlTarget 'interaction\.title'
+syn match csdlTarget 'interaction\.content'
+syn match csdlTarget 'interaction\.source'
+syn match csdlTarget 'interaction\.geo'
+syn match csdlTarget 'interaction\.link'
+syn match csdlTarget 'interaction\.author\.username'
+syn match csdlTarget 'interaction\.author\.name'
+syn match csdlTarget 'interaction\.author\.id'
+syn match csdlTarget 'interaction\.author\.avatar'
+syn match csdlTarget 'interaction\.author\.link'
+syn match csdlTarget 'interaction\.sample'
+syn match csdlTarget 'links\.title'
+syn match csdlTarget 'links\.url'
+syn keyword csdlTarget links.normalized_url
+syn match csdlTarget 'links\.hops'
+syn match csdlTarget 'links\.code'
+syn match csdlTarget 'links\.domain'
+syn keyword csdlTarget links.retweet_count
+syn match csdlTarget 'links\.age'
+syn keyword csdlTarget links.meta.content_type
+syn match csdlTarget 'links\.meta\.charset'
+syn match csdlTarget 'links\.meta\.lang'
+syn match csdlTarget 'links\.meta\.keywords'
+syn match csdlTarget 'links\.meta\.description'
+syn match csdlTarget 'links\.meta\.newskeywords'
+syn match csdlTarget 'links\.meta\.standout'
+syn match csdlTarget 'links\.meta\.opengraph\.type'
+syn match csdlTarget 'links\.meta\.opengraph\.title'
+syn match csdlTarget 'links\.meta\.opengraph\.image'
+syn match csdlTarget 'links\.meta\.opengraph\.url'
+syn match csdlTarget 'links\.meta\.opengraph\.description'
+syn keyword csdlTarget links.meta.opengraph.site_name
+syn match csdlTarget 'links\.meta\.opengraph\.email'
+syn keyword csdlTarget links.meta.opengraph.phone_number
+syn keyword csdlTarget links.meta.opengraph.fax_number
+syn match csdlTarget 'links\.meta\.opengraph\.geo'
+syn keyword csdlTarget links.meta.opengraph.street_address
+syn match csdlTarget 'links\.meta\.opengraph\.locality'
+syn match csdlTarget 'links\.meta\.opengraph\.region'
+syn keyword csdlTarget links.meta.opengraph.postal_code
+syn match csdlTarget 'links\.meta\.opengraph\.activity'
+syn match csdlTarget 'links\.meta\.opengraph\.sport'
+syn match csdlTarget 'links\.meta\.opengraph\.bar'
+syn match csdlTarget 'links\.meta\.opengraph\.company'
+syn match csdlTarget 'links\.meta\.opengraph\.cafe'
+syn match csdlTarget 'links\.meta\.opengraph\.hotel'
+syn match csdlTarget 'links\.meta\.opengraph\.restaurant'
+syn match csdlTarget 'links\.meta\.opengraph\.cause'
+syn keyword csdlTarget links.meta.opengraph.sports_league
+syn keyword csdlTarget links.meta.opengraph.sports_team
+syn match csdlTarget 'links\.meta\.opengraph\.band'
+syn match csdlTarget 'links\.meta\.opengraph\.government'
+syn keyword csdlTarget links.meta.opengraph.non_profit
+syn match csdlTarget 'links\.meta\.opengraph\.school'
+syn match csdlTarget 'links\.meta\.opengraph\.university'
+syn match csdlTarget 'links\.meta\.opengraph\.actor'
+syn match csdlTarget 'links\.meta\.opengraph\.athlete'
+syn match csdlTarget 'links\.meta\.opengraph\.author'
+syn match csdlTarget 'links\.meta\.opengraph\.director'
+syn match csdlTarget 'links\.meta\.opengraph\.musician'
+syn match csdlTarget 'links\.meta\.opengraph\.politician'
+syn keyword csdlTarget links.meta.opengraph.public_figure
+syn match csdlTarget 'links\.meta\.opengraph\.city'
+syn match csdlTarget 'links\.meta\.opengraph\.country'
+syn match csdlTarget 'links\.meta\.opengraph\.landmark'
+syn keyword csdlTarget links.meta.opengraph.state_province
+syn match csdlTarget 'links\.meta\.opengraph\.album'
+syn match csdlTarget 'links\.meta\.opengraph\.book'
+syn match csdlTarget 'links\.meta\.opengraph\.drink'
+syn match csdlTarget 'links\.meta\.opengraph\.food'
+syn match csdlTarget 'links\.meta\.opengraph\.game'
+syn match csdlTarget 'links\.meta\.opengraph\.movie'
+syn match csdlTarget 'links\.meta\.opengraph\.product'
+syn match csdlTarget 'links\.meta\.opengraph\.song'
+syn keyword csdlTarget links.meta.opengraph.tv_show
+syn match csdlTarget 'links\.meta\.opengraph\.blog'
+syn match csdlTarget 'links\.meta\.opengraph\.website'
+syn match csdlTarget 'links\.meta\.opengraph\.article'
+syn match csdlTarget 'links\.meta\.twitter\.card'
+syn match csdlTarget 'links\.meta\.twitter\.site'
+syn keyword csdlTarget links.meta.twitter.site_id
+syn match csdlTarget 'links\.meta\.twitter\.creator'
+syn keyword csdlTarget links.meta.twitter.creator_id
+syn match csdlTarget 'links\.meta\.twitter\.url'
+syn match csdlTarget 'links\.meta\.twitter\.description'
+syn match csdlTarget 'links\.meta\.twitter\.title'
+syn match csdlTarget 'links\.meta\.twitter\.image'
+syn keyword csdlTarget links.meta.twitter.image_width
+syn keyword csdlTarget links.meta.twitter.image_height
+syn match csdlTarget 'links\.meta\.twitter\.player'
+syn keyword csdlTarget links.meta.twitter.player_width
+syn keyword csdlTarget links.meta.twitter.player_height
+syn keyword csdlTarget links.meta.twitter.player_stream
+syn keyword csdlTarget links.meta.twitter.player_stream_content_type
+syn match csdlTarget 'myspace\.link'
+syn match csdlTarget 'myspace\.content'
+syn match csdlTarget 'myspace\.contenttype'
+syn match csdlTarget 'myspace\.category'
+syn match csdlTarget 'myspace\.author\.username'
+syn match csdlTarget 'myspace\.author\.name'
+syn match csdlTarget 'myspace\.author\.id'
+syn match csdlTarget 'myspace\.author\.link'
+syn match csdlTarget 'myspace\.author\.avatar'
+syn match csdlTarget 'myspace\.geo'
+syn match csdlTarget 'myspace\.verb'
+syn match csdlTarget 'newscred\.type'
+syn match csdlTarget 'newscred\.article\.domain'
+syn match csdlTarget 'newscred\.video\.domain'
+syn match csdlTarget 'newscred\.article\.topics'
+syn match csdlTarget 'newscred\.video\.topics'
+syn match csdlTarget 'newscred\.article\.category'
+syn match csdlTarget 'newscred\.video\.category'
+syn match csdlTarget 'newscred\.article\.title'
+syn match csdlTarget 'newscred\.video\.title'
+syn match csdlTarget 'newscred\.article\.content'
+syn match csdlTarget 'newscred\.article\.fulltext'
+syn match csdlTarget 'newscred\.article\.authors'
+syn match csdlTarget 'newscred\.image\.caption'
+syn match csdlTarget 'newscred\.video\.caption'
+syn match csdlTarget 'newscred\.image\.attribution\.text'
+syn match csdlTarget 'newscred\.image\.attribution\.link'
+syn match csdlTarget 'newscred\.source\.name'
+syn match csdlTarget 'newscred\.source\.link'
+syn match csdlTarget 'newscred\.source\.domain'
+syn keyword csdlTarget newscred.source.media_type
+syn keyword csdlTarget newscred.source.company_type
+syn match csdlTarget 'newscred\.source\.country'
+syn match csdlTarget 'newscred\.source\.circulation'
+syn match csdlTarget 'newscred\.source\.founded'
+syn match csdlTarget 'imdb\.title'
+syn match csdlTarget 'imdb\.content'
+syn match csdlTarget 'imdb\.contenttype'
+syn match csdlTarget 'imdb\.link'
+syn match csdlTarget 'imdb\.author\.name'
+syn match csdlTarget 'imdb\.author\.link'
+syn match csdlTarget 'imdb\.type'
+syn match csdlTarget 'imdb\.thread'
+syn match csdlTarget 'amazon\.title'
+syn match csdlTarget 'amazon\.content'
+syn match csdlTarget 'amazon\.contenttype'
+syn match csdlTarget 'amazon\.link'
+syn match csdlTarget 'amazon\.author\.name'
+syn match csdlTarget 'amazon\.author\.link'
+syn match csdlTarget 'amazon\.type'
+syn match csdlTarget 'amazon\.thread'
+syn match csdlTarget 'salience\.content\.sentiment'
+syn match csdlTarget 'salience\.content\.topics'
+syn match csdlTarget 'salience\.title\.sentiment'
+syn match csdlTarget 'salience\.title\.topics'
+syn match csdlTarget 'salience\.content\.entities\.name'
+syn match csdlTarget 'salience\.content\.entities\.type'
+syn match csdlTarget 'salience\.title\.entities\.name'
+syn match csdlTarget 'salience\.title\.entities\.type'
+syn match csdlTarget 'klout\.score'
+syn match csdlTarget 'klout\.network'
+syn match csdlTarget 'klout\.amplification'
+syn keyword csdlTarget klout.true_reach
+syn match csdlTarget 'klout\.topics'
+syn match csdlTarget 'wikipedia\.author\.talk'
+syn match csdlTarget 'wikipedia\.author\.contributions'
+syn match csdlTarget 'wikipedia\.author\.username'
+syn match csdlTarget 'wikipedia\.body'
+syn match csdlTarget 'wikipedia\.title'
+syn match csdlTarget 'wikipedia\.images'
+syn match csdlTarget 'wikipedia\.categories'
+syn match csdlTarget 'wikipedia\.externallinks'
+syn match csdlTarget 'wikipedia\.ns'
+syn match csdlTarget 'wikipedia\.namespace'
+syn match csdlTarget 'wikipedia\.pageid'
+syn match csdlTarget 'wikipedia\.parentid'
+syn match csdlTarget 'wikipedia\.oldlen'
+syn match csdlTarget 'wikipedia\.newlen'
+syn match csdlTarget 'wikipedia\.changetype'
+syn match csdlTarget 'wikipedia\.diff\.from'
+syn match csdlTarget 'wikipedia\.diff\.to'
+syn match csdlTarget 'wikipedia\.diff\.changes\.added'
+syn match csdlTarget 'wikipedia\.diff\.changes\.removed'
+syn keyword csdlTarget demographic.twitter_activity
+syn match csdlTarget 'demographic\.location\.country'
+syn keyword csdlTarget demographic.location.us_state
+syn match csdlTarget 'demographic\.location\.city'
+syn match csdlTarget 'demographic\.type'
+syn match csdlTarget 'demographic\.sex'
+syn match csdlTarget 'demographic\.status\.relationship'
+syn match csdlTarget 'demographic\.status\.work'
+syn keyword csdlTarget demographic.likes_and_interests
+syn keyword csdlTarget demographic.first_language
+syn match csdlTarget 'demographic\.professions'
+syn match csdlTarget 'demographic\.services'
+syn keyword csdlTarget demographic.large_accounts_followed
+syn keyword csdlTarget demographic.age_range.start
+syn keyword csdlTarget demographic.age_range.end
+syn match csdlTarget 'demographic\.income\.start'
+syn match csdlTarget 'demographic\.income\.end'
+syn keyword csdlTarget demographic.main_street.dressed_by
+syn keyword csdlTarget demographic.main_street.shop_at
+syn keyword csdlTarget demographic.main_street.eat_and_drink_at
+syn match csdlTarget 'demographic\.accounts\.categories'
+syn match csdlTarget 'tumblr\.activity'
+syn match csdlTarget 'tumblr\.source\.blogid'
+syn match csdlTarget 'tumblr\.dest\.blogid'
+syn match csdlTarget 'tumblr\.dest\.postid'
+syn match csdlTarget 'tumblr\.root\.blogid'
+syn match csdlTarget 'tumblr\.root\.postid'
+syn match csdlTarget 'tumblr\.blogid'
+syn keyword csdlTarget tumblr.blog_name
+syn match csdlTarget 'tumblr\.type'
+syn match csdlTarget 'tumblr\.title'
+syn match csdlTarget 'tumblr\.body'
+syn match csdlTarget 'tumblr\.text'
+syn match csdlTarget 'tumblr\.tags'
+syn keyword csdlTarget tumblr.track_name
+syn match csdlTarget 'tumblr\.album'
+syn match csdlTarget 'tumblr\.link'
+syn match csdlTarget 'tumblr\.meta\.url'
+syn match csdlTarget 'tumblr\.meta\.type'
+syn match csdlTarget 'tumblr\.meta\.description'
+syn keyword csdlTarget tumblr.meta.likes_local
+syn keyword csdlTarget tumblr.meta.likes_global
+syn keyword csdlTarget tumblr.meta.reblogged_global
+syn match csdlTarget 'demographic\.gender'
+syn match csdlTarget 'flickr\.title'
+syn match csdlTarget 'flickr\.content'
+syn match csdlTarget 'flickr\.contenttype'
+syn match csdlTarget 'flickr\.link'
+syn match csdlTarget 'flickr\.author\.name'
+syn match csdlTarget 'flickr\.author\.link'
+syn match csdlTarget 'flickr\.author\.username'
+syn match csdlTarget 'flickr\.type'
+syn match csdlTarget 'flickr\.thread'
+syn match csdlTarget 'twitter\.text'
+syn match csdlTarget 'twitter\.source'
+syn match csdlTarget 'twitter\.mentions'
+syn keyword csdlTarget twitter.mention_ids
+syn match csdlTarget 'twitter\.links'
+syn match csdlTarget 'twitter\.domains'
+syn keyword csdlTarget twitter.in_reply_to_screen_name
+syn keyword csdlTarget twitter.in_reply_to_user_id
+syn keyword csdlTarget twitter.in_reply_to_status_id
+syn keyword csdlTarget twitter.filter_level
+syn match csdlTarget 'twitter\.lang'
+syn match csdlTarget 'twitter\.geo'
+syn match csdlTarget 'twitter\.user\.description'
+syn match csdlTarget 'twitter\.user\.location'
+syn keyword csdlTarget twitter.user.statuses_count
+syn keyword csdlTarget twitter.user.followers_count
+syn keyword csdlTarget twitter.user.follower_ratio
+syn keyword csdlTarget twitter.user.profile_age
+syn keyword csdlTarget twitter.user.friends_count
+syn keyword csdlTarget twitter.user.screen_name
+syn match csdlTarget 'twitter\.user\.lang'
+syn keyword csdlTarget twitter.user.time_zone
+syn match csdlTarget 'twitter\.user\.name'
+syn match csdlTarget 'twitter\.user\.id'
+syn keyword csdlTarget twitter.user.listed_count
+syn match csdlTarget 'twitter\.user\.url'
+syn match csdlTarget 'twitter\.user\.verified'
+syn keyword csdlTarget twitter.place.place_type
+syn match csdlTarget 'twitter\.place\.country'
+syn keyword csdlTarget twitter.place.country_code
+syn keyword csdlTarget twitter.place.full_name
+syn match csdlTarget 'twitter\.place\.name'
+syn match csdlTarget 'twitter\.place\.url'
+syn match csdlTarget 'twitter\.place\.attributes\.locality'
+syn match csdlTarget 'twitter\.place\.attributes\.region'
+syn keyword csdlTarget twitter.place.attributes.street_address
+syn match csdlTarget 'twitter\.status'
+syn match csdlTarget 'twitter\.retweet\.text'
+syn match csdlTarget 'twitter\.retweet\.elapsed'
+syn match csdlTarget 'twitter\.retweet\.source'
+syn keyword csdlTarget twitter.retweet.filter_level
+syn match csdlTarget 'twitter\.retweet\.lang'
+syn match csdlTarget 'twitter\.retweet\.user\.description'
+syn match csdlTarget 'twitter\.retweet\.user\.location'
+syn keyword csdlTarget twitter.retweet.user.statuses_count
+syn keyword csdlTarget twitter.retweet.user.followers_count
+syn keyword csdlTarget twitter.retweet.user.follower_ratio
+syn keyword csdlTarget twitter.retweet.user.profile_age
+syn keyword csdlTarget twitter.retweet.user.friends_count
+syn keyword csdlTarget twitter.retweet.user.screen_name
+syn match csdlTarget 'twitter\.retweet\.user\.lang'
+syn keyword csdlTarget twitter.retweet.user.time_zone
+syn match csdlTarget 'twitter\.retweet\.user\.name'
+syn match csdlTarget 'twitter\.retweet\.user\.id'
+syn keyword csdlTarget twitter.retweet.user.listed_count
+syn match csdlTarget 'twitter\.retweet\.user\.url'
+syn match csdlTarget 'twitter\.retweet\.user\.verified'
+syn match csdlTarget 'twitter\.retweeted\.id'
+syn match csdlTarget 'twitter\.retweeted\.source'
+syn keyword csdlTarget twitter.retweeted.in_reply_to_screen_name
+syn keyword csdlTarget twitter.retweeted.in_reply_to_user_id_str
+syn keyword csdlTarget twitter.retweeted.in_reply_to_status_id
+syn match csdlTarget 'twitter\.retweet\.count'
+syn match csdlTarget 'twitter\.retweet\.mentions'
+syn keyword csdlTarget twitter.retweet.mention_ids
+syn match csdlTarget 'twitter\.retweet\.links'
+syn match csdlTarget 'twitter\.retweet\.domains'
+syn match csdlTarget 'twitter\.retweeted\.user\.description'
+syn match csdlTarget 'twitter\.retweeted\.user\.location'
+syn keyword csdlTarget twitter.retweeted.user.statuses_count
+syn keyword csdlTarget twitter.retweeted.user.followers_count
+syn keyword csdlTarget twitter.retweeted.user.follower_ratio
+syn keyword csdlTarget twitter.retweeted.user.profile_age
+syn keyword csdlTarget twitter.retweeted.user.friends_count
+syn keyword csdlTarget twitter.retweeted.user.screen_name
+syn match csdlTarget 'twitter\.retweeted\.user\.lang'
+syn keyword csdlTarget twitter.retweeted.user.time_zone
+syn match csdlTarget 'twitter\.retweeted\.user\.name'
+syn match csdlTarget 'twitter\.retweeted\.user\.id'
+syn keyword csdlTarget twitter.retweeted.user.listed_count
+syn match csdlTarget 'twitter\.retweeted\.user\.url'
+syn match csdlTarget 'twitter\.retweeted\.user\.verified'
+syn match csdlTarget 'twitter\.retweeted\.geo'
+syn keyword csdlTarget twitter.retweeted.place.place_type
+syn match csdlTarget 'twitter\.retweeted\.place\.country'
+syn keyword csdlTarget twitter.retweeted.place.country_code
+syn keyword csdlTarget twitter.retweeted.place.full_name
+syn match csdlTarget 'twitter\.retweeted\.place\.name'
+syn match csdlTarget 'twitter\.retweeted\.place\.url'
+syn match csdlTarget 'twitter\.retweeted\.place\.attributes'
+syn match csdlTarget 'twitter\.hashtags'
+syn match csdlTarget 'twitter\.retweet\.hashtags'
+syn match csdlTarget 'twitter\.media\.type'
+syn keyword csdlTarget twitter.media.media_url
+syn keyword csdlTarget twitter.media.display_url
+syn match csdlTarget 'twitter\.retweet\.media\.type'
+syn keyword csdlTarget twitter.retweet.media.media_url
+syn keyword csdlTarget twitter.retweet.media.display_url
+syn match csdlTarget 'blog\.title'
+syn match csdlTarget 'blog\.content'
+syn match csdlTarget 'blog\.contenttype'
+syn match csdlTarget 'blog\.link'
+syn match csdlTarget 'blog\.domain'
+syn match csdlTarget 'blog\.author\.name'
+syn match csdlTarget 'blog\.author\.link'
+syn match csdlTarget 'blog\.author\.avatar'
+syn match csdlTarget 'blog\.author\.username'
+syn match csdlTarget 'blog\.type'
+syn match csdlTarget 'blog\.post\.link'
+syn match csdlTarget 'blog\.post\.title'
+syn match csdlTarget 'facebook\.author\.name'
+syn match csdlTarget 'facebook\.author\.link'
+syn match csdlTarget 'facebook\.author\.id'
+syn match csdlTarget 'facebook\.author\.avatar'
+syn match csdlTarget 'facebook\.message'
+syn match csdlTarget 'facebook\.description'
+syn match csdlTarget 'facebook\.caption'
+syn match csdlTarget 'facebook\.type'
+syn match csdlTarget 'facebook\.application'
+syn match csdlTarget 'facebook\.source'
+syn match csdlTarget 'facebook\.link'
+syn match csdlTarget 'facebook\.name'
+syn match csdlTarget 'facebook\.to\.names'
+syn match csdlTarget 'facebook\.to\.ids'
+syn match csdlTarget 'facebook\.og\.title'
+syn match csdlTarget 'facebook\.og\.location'
+syn match csdlTarget 'facebook\.og\.photos'
+syn match csdlTarget 'facebook\.og\.by'
+syn match csdlTarget 'facebook\.og\.description'
+syn match csdlTarget 'facebook\.og\.type'
+syn match csdlTarget 'facebook\.og\.length'
+syn match csdlTarget 'facebook\.likes\.count'
+syn match csdlTarget 'facebook\.likes\.names'
+syn match csdlTarget 'facebook\.likes\.ids'
+syn match csdlTarget 'topix\.title'
+syn match csdlTarget 'topix\.content'
+syn match csdlTarget 'topix\.contenttype'
+syn match csdlTarget 'topix\.link'
+syn match csdlTarget 'topix\.author\.name'
+syn match csdlTarget 'topix\.type'
+syn match csdlTarget 'topix\.thread'
+syn match csdlTarget 'topix\.author\.location'
+syn match csdlTarget 'bitly\.user\.agent'
+syn keyword csdlTarget bitly.url_hash
+syn match csdlTarget 'bitly\.share\.hash'
+syn match csdlTarget 'bitly\.cname'
+syn keyword csdlTarget bitly.referring_url
+syn keyword csdlTarget bitly.referring_domain
+syn match csdlTarget 'bitly\.url'
+syn match csdlTarget 'bitly\.domain'
+syn keyword csdlTarget bitly.country_code
+syn keyword csdlTarget bitly.geo_region_code
+syn match csdlTarget 'bitly\.country'
+syn keyword csdlTarget bitly.geo_region
+syn keyword csdlTarget bitly.geo_city
+syn match csdlTarget 'bitly\.geo'
+syn match csdlTarget 'bitly\.timezone'
+syn match csdlTarget 'trends\.type'
+syn match csdlTarget 'trends\.content'
+syn match csdlTarget 'trends\.source'
+syn match csdlTarget 'board\.title'
+syn match csdlTarget 'board\.content'
+syn match csdlTarget 'board\.contenttype'
+syn match csdlTarget 'board\.link'
+syn match csdlTarget 'board\.domain'
+syn match csdlTarget 'board\.author\.name'
+syn match csdlTarget 'board\.author\.link'
+syn match csdlTarget 'board\.author\.avatar'
+syn match csdlTarget 'board\.author\.username'
+syn match csdlTarget 'board\.type'
+syn match csdlTarget 'board\.thread'
+syn match csdlTarget 'board\.author\.location'
+syn match csdlTarget 'board\.author\.signature'
+syn match csdlTarget 'board\.author\.registered'
+syn match csdlTarget 'board\.author\.age'
+syn match csdlTarget 'board\.author\.gender'
+syn match csdlTarget 'video\.title'
+syn match csdlTarget 'video\.content'
+syn match csdlTarget 'video\.contenttype'
+syn match csdlTarget 'video\.domain'
+syn match csdlTarget 'video\.author\.name'
+syn match csdlTarget 'video\.author\.link'
+syn match csdlTarget 'video\.author\.avatar'
+syn match csdlTarget 'video\.author\.username'
+syn match csdlTarget 'video\.type'
+syn match csdlTarget 'video\.videolink'
+syn match csdlTarget 'video\.commentslink'
+syn match csdlTarget 'video\.duration'
+syn match csdlTarget 'video\.thumbnail'
+syn match csdlTarget 'video\.category'
+syn match csdlTarget 'video\.tags'
+syn match csdlTarget '2ch\.title'
+syn match csdlTarget '2ch\.content'
+syn match csdlTarget '2ch\.contenttype'
+syn match csdlTarget '2ch\.link'
+syn match csdlTarget '2ch\.author\.name'
+syn match csdlTarget '2ch\.type'
+syn match csdlTarget '2ch\.thread'
+syn match csdlTarget 'dailymotion\.title'
+syn match csdlTarget 'dailymotion\.content'
+syn match csdlTarget 'dailymotion\.contenttype'
+syn match csdlTarget 'dailymotion\.author\.link'
+syn match csdlTarget 'dailymotion\.author\.username'
+syn match csdlTarget 'dailymotion\.videolink'
+syn match csdlTarget 'dailymotion\.duration'
+syn match csdlTarget 'dailymotion\.thumbnail'
+syn match csdlTarget 'dailymotion\.category'
+syn match csdlTarget 'dailymotion\.tags'
+syn match csdlTarget 'language\.tag'
+syn match csdlTarget 'language\.confidence'
+syn match csdlTarget 'digg\.type'
+syn match csdlTarget 'digg\.user\.name'
+syn match csdlTarget 'digg\.user\.fullname'
+syn match csdlTarget 'digg\.user\.registered'
+syn match csdlTarget 'digg\.user\.profileviews'
+syn match csdlTarget 'digg\.user\.icon'
+syn match csdlTarget 'digg\.user\.links'
+syn match csdlTarget 'digg\.item\.status'
+syn match csdlTarget 'digg\.item\.description'
+syn match csdlTarget 'digg\.item\.title'
+syn match csdlTarget 'digg\.item\.diggs'
+syn match csdlTarget 'digg\.item\.comments'
+syn match csdlTarget 'digg\.item\.topic'
+syn match csdlTarget 'digg\.comment\.buries'
+syn match csdlTarget 'digg\.comment\.diggs'
+syn match csdlTarget 'digg\.comment\.text'
+syn match csdlTarget 'youtube\.title'
+syn match csdlTarget 'youtube\.content'
+syn match csdlTarget 'youtube\.contenttype'
+syn match csdlTarget 'youtube\.author\.name'
+syn match csdlTarget 'youtube\.author\.link'
+syn match csdlTarget 'youtube\.type'
+syn match csdlTarget 'youtube\.videolink'
+syn match csdlTarget 'youtube\.commentslink'
+syn match csdlTarget 'youtube\.duration'
+syn match csdlTarget 'youtube\.thumbnail'
+syn match csdlTarget 'youtube\.category'
+syn match csdlTarget 'youtube\.tags'
+
+syn match csdlComment "^\/\/.*$"
+syn match csdlComment "^\/\*.*$"
+syn match csdlComment "^.*\*\/$"
+
+highlight link csdlKeyword Statement
+highlight link csdlOperator Operator
+highlight link csdlLogicalOperator Operator
+highlight link csdlTarget Constant
+highlight link csdlComment Comment
+"
+let b:current_syntax = "csdl"
diff --git a/runtime/syntax/csh.vim b/runtime/syntax/csh.vim
new file mode 100644
index 0000000..6a056c7
--- /dev/null
+++ b/runtime/syntax/csh.vim
@@ -0,0 +1,143 @@
+" Vim syntax file
+" Language: C-shell (csh)
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Aug 31, 2016
+" Version: 14
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_CSH
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" clusters:
+syn cluster cshQuoteList contains=cshDblQuote,cshSnglQuote,cshBckQuote
+syn cluster cshVarList contains=cshExtVar,cshSelector,cshQtyWord,cshArgv,cshSubst
+
+" Variables which affect the csh itself
+syn match cshSetVariables contained "argv\|histchars\|ignoreeof\|noglob\|prompt\|status"
+syn match cshSetVariables contained "cdpath\|history\|mail\|nonomatch\|savehist\|time"
+syn match cshSetVariables contained "cwd\|home\|noclobber\|path\|shell\|verbose"
+syn match cshSetVariables contained "echo"
+
+syn case ignore
+syn keyword cshTodo contained todo
+syn case match
+
+" Variable Name Expansion Modifiers
+syn match cshModifier contained ":\(h\|t\|r\|q\|x\|gh\|gt\|gr\)"
+
+" Strings and Comments
+syn match cshNoEndlineDQ contained "[^\"]\(\\\\\)*$"
+syn match cshNoEndlineSQ contained "[^\']\(\\\\\)*$"
+syn match cshNoEndlineBQ contained "[^\`]\(\\\\\)*$"
+
+syn region cshDblQuote start=+[^\\]"+lc=1 skip=+\\\\\|\\"+ end=+"+ contains=cshSpecial,cshShellVariables,cshExtVar,cshSelector,cshQtyWord,cshArgv,cshSubst,cshNoEndlineDQ,cshBckQuote,@Spell
+syn region cshSnglQuote start=+[^\\]'+lc=1 skip=+\\\\\|\\'+ end=+'+ contains=cshNoEndlineSQ,@Spell
+syn region cshBckQuote start=+[^\\]`+lc=1 skip=+\\\\\|\\`+ end=+`+ contains=cshNoEndlineBQ,@Spell
+syn region cshDblQuote start=+^"+ skip=+\\\\\|\\"+ end=+"+ contains=cshSpecial,cshExtVar,cshSelector,cshQtyWord,cshArgv,cshSubst,cshNoEndlineDQ,@Spell
+syn region cshSnglQuote start=+^'+ skip=+\\\\\|\\'+ end=+'+ contains=cshNoEndlineSQ,@Spell
+syn region cshBckQuote start=+^`+ skip=+\\\\\|\\`+ end=+`+ contains=cshNoEndlineBQ,@Spell
+syn cluster cshCommentGroup contains=cshTodo,@Spell
+syn match cshComment "#.*$" contains=@cshCommentGroup
+
+" A bunch of useful csh keywords
+syn keyword cshStatement alias end history onintr setenv unalias
+syn keyword cshStatement cd eval kill popd shift unhash
+syn keyword cshStatement chdir exec login pushd source
+syn keyword cshStatement continue exit logout rehash time unsetenv
+syn keyword cshStatement dirs glob nice repeat umask wait
+syn keyword cshStatement echo goto nohup
+
+syn keyword cshConditional break case else endsw switch
+syn keyword cshConditional breaksw default endif
+syn keyword cshRepeat foreach
+
+" Special environment variables
+syn keyword cshShellVariables HOME LOGNAME PATH TERM USER
+
+" Modifiable Variables without {}
+syn match cshExtVar "\$[a-zA-Z_][a-zA-Z0-9_]*\(:h\|:t\|:r\|:q\|:x\|:gh\|:gt\|:gr\)\=" contains=cshModifier
+syn match cshSelector "\$[a-zA-Z_][a-zA-Z0-9_]*\[[a-zA-Z_]\+\]\(:h\|:t\|:r\|:q\|:x\|:gh\|:gt\|:gr\)\=" contains=cshModifier
+syn match cshQtyWord "\$#[a-zA-Z_][a-zA-Z0-9_]*\(:h\|:t\|:r\|:q\|:x\|:gh\|:gt\|:gr\)\=" contains=cshModifier
+syn match cshArgv "\$\d\+\(:h\|:t\|:r\|:q\|:x\|:gh\|:gt\|:gr\)\=" contains=cshModifier
+syn match cshArgv "\$\*\(:h\|:t\|:r\|:q\|:x\|:gh\|:gt\|:gr\)\=" contains=cshModifier
+
+" Modifiable Variables with {}
+syn match cshExtVar "\${[a-zA-Z_][a-zA-Z0-9_]*\(:h\|:t\|:r\|:q\|:x\|:gh\|:gt\|:gr\)\=}" contains=cshModifier
+syn match cshSelector "\${[a-zA-Z_][a-zA-Z0-9_]*\[[a-zA-Z_]\+\]\(:h\|:t\|:r\|:q\|:x\|:gh\|:gt\|:gr\)\=}" contains=cshModifier
+syn match cshQtyWord "\${#[a-zA-Z_][a-zA-Z0-9_]*\(:h\|:t\|:r\|:q\|:x\|:gh\|:gt\|:gr\)\=}" contains=cshModifier
+syn match cshArgv "\${\d\+\(:h\|:t\|:r\|:q\|:x\|:gh\|:gt\|:gr\)\=}" contains=cshModifier
+
+" UnModifiable Substitutions
+syn match cshSubstError "\$?[a-zA-Z_][a-zA-Z0-9_]*:\(h\|t\|r\|q\|x\|gh\|gt\|gr\)"
+syn match cshSubstError "\${?[a-zA-Z_][a-zA-Z0-9_]*:\(h\|t\|r\|q\|x\|gh\|gt\|gr\)}"
+syn match cshSubstError "\$?[0$<]:\(h\|t\|r\|q\|x\|gh\|gt\|gr\)"
+syn match cshSubst "\$?[a-zA-Z_][a-zA-Z0-9_]*"
+syn match cshSubst "\${?[a-zA-Z_][a-zA-Z0-9_]*}"
+syn match cshSubst "\$?[0$<]"
+
+" I/O redirection
+syn match cshRedir ">>&!\|>&!\|>>&\|>>!\|>&\|>!\|>>\|<<\|>\|<"
+
+" Handle set expressions
+syn region cshSetExpr matchgroup=cshSetStmt start="\<set\>\|\<unset\>" end="$\|;" contains=cshComment,cshSetStmt,cshSetVariables,@cshQuoteList
+
+" Operators and Expression-Using constructs
+"syn match cshOperator contained "&&\|!\~\|!=\|<<\|<=\|==\|=\~\|>=\|>>\|\*\|\^\|\~\|||\|!\|\|%\|&\|+\|-\|/\|<\|>\||"
+syn match cshOperator contained "&&\|!\~\|!=\|<<\|<=\|==\|=\~\|>=\|>>\|\*\|\^\|\~\|||\|!\|%\|&\|+\|-\|/\|<\|>\||"
+syn match cshOperator contained "[(){}]"
+syn region cshTest matchgroup=cshStatement start="\<if\>\|\<while\>" skip="\\$" matchgroup=cshStatement end="\<then\>\|$" contains=cshComment,cshOperator,@cshQuoteList,@cshVarLIst
+
+" Highlight special characters (those which have a backslash) differently
+syn match cshSpecial contained "\\\d\d\d\|\\[abcfnrtv\\]"
+syn match cshNumber "-\=\<\d\+\>"
+
+" All other identifiers
+"syn match cshIdentifier "\<[a-zA-Z._][a-zA-Z0-9._]*\>"
+
+" Shell Input Redirection (Here Documents)
+syn region cshHereDoc matchgroup=cshRedir start="<<-\=\s*\**\z(\h\w*\)\**" matchgroup=cshRedir end="^\z1$"
+
+" Define the default highlighting.
+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"
+
+" vim: ts=18
diff --git a/runtime/syntax/csp.vim b/runtime/syntax/csp.vim
new file mode 100644
index 0000000..8001b1f
--- /dev/null
+++ b/runtime/syntax/csp.vim
@@ -0,0 +1,182 @@
+" Vim syntax file
+" Language: CSP (Communication Sequential Processes, using FDR input syntax)
+" Maintainer: Jan Bredereke <brederek@tzi.de>
+" Version: 0.6.0
+" Last change: Mon Mar 25, 2002
+" URL: http://www.tzi.de/~brederek/vim/
+" Copying: You may distribute and use this file freely, in the same
+" way as the vim editor itself.
+"
+" To Do: - Probably I missed some keywords or operators, please
+" fix them and notify me, the maintainer.
+" - Currently, we do lexical highlighting only. It would be
+" nice to have more actual syntax checks, including
+" highlighting of wrong syntax.
+" - The additional syntax for the RT-Tester (pseudo-comments)
+" should be optional.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" case is significant to FDR:
+syn case match
+
+" Block comments in CSP are between {- and -}
+syn region cspComment start="{-" end="-}" contains=cspTodo
+" Single-line comments start with --
+syn region cspComment start="--" end="$" contains=cspTodo,cspOldRttComment,cspSdlRttComment keepend
+
+" Numbers:
+syn match cspNumber "\<\d\+\>"
+
+" Conditionals:
+syn keyword cspConditional if then else
+
+" Operators on processes:
+" -> ? : ! ' ; /\ \ [] |~| [> & [[..<-..]] ||| [|..|] || [..<->..] ; : @ |||
+syn match cspOperator "->"
+syn match cspOperator "/\\"
+syn match cspOperator "[^/]\\"lc=1
+syn match cspOperator "\[\]"
+syn match cspOperator "|\~|"
+syn match cspOperator "\[>"
+syn match cspOperator "\[\["
+syn match cspOperator "\]\]"
+syn match cspOperator "<-"
+syn match cspOperator "|||"
+syn match cspOperator "[^|]||[^|]"lc=1,me=e-1
+syn match cspOperator "[^|{\~]|[^|}\~]"lc=1,me=e-1
+syn match cspOperator "\[|"
+syn match cspOperator "|\]"
+syn match cspOperator "\[[^>]"me=e-1
+syn match cspOperator "\]"
+syn match cspOperator "<->"
+syn match cspOperator "[?:!';@]"
+syn match cspOperator "&"
+syn match cspOperator "\."
+
+" (not on processes:)
+" syn match cspDelimiter "{|"
+" syn match cspDelimiter "|}"
+" syn match cspDelimiter "{[^-|]"me=e-1
+" syn match cspDelimiter "[^-|]}"lc=1
+
+" Keywords:
+syn keyword cspKeyword length null head tail concat elem
+syn keyword cspKeyword union inter diff Union Inter member card
+syn keyword cspKeyword empty set Set Seq
+syn keyword cspKeyword true false and or not within let
+syn keyword cspKeyword nametype datatype diamond normal
+syn keyword cspKeyword sbisim tau_loop_factor model_compress
+syn keyword cspKeyword explicate
+syn match cspKeyword "transparent"
+syn keyword cspKeyword external chase prioritize
+syn keyword cspKeyword channel Events
+syn keyword cspKeyword extensions productions
+syn keyword cspKeyword Bool Int
+
+" Reserved keywords:
+syn keyword cspReserved attribute embed module subtype
+
+" Include:
+syn region cspInclude matchgroup=cspIncludeKeyword start="^include" end="$" keepend contains=cspIncludeArg
+syn region cspIncludeArg start='\s\+\"' end= '\"\s*' contained
+
+" Assertions:
+syn keyword cspAssert assert deterministic divergence free deadlock
+syn keyword cspAssert livelock
+syn match cspAssert "\[T="
+syn match cspAssert "\[F="
+syn match cspAssert "\[FD="
+syn match cspAssert "\[FD\]"
+syn match cspAssert "\[F\]"
+
+" Types and Sets
+" (first char a capital, later at least one lower case, no trailing underscore):
+syn match cspType "\<_*[A-Z][A-Z_0-9]*[a-z]\(\|[A-Za-z_0-9]*[A-Za-z0-9]\)\>"
+
+" Processes (all upper case, no trailing underscore):
+" (For identifiers that could be types or sets, too, this second rule set
+" wins.)
+syn match cspProcess "\<[A-Z_][A-Z_0-9]*[A-Z0-9]\>"
+syn match cspProcess "\<[A-Z_]\>"
+
+" reserved identifiers for tool output (ending in underscore):
+syn match cspReservedIdentifier "\<[A-Za-z_][A-Za-z_0-9]*_\>"
+
+" ToDo markers:
+syn match cspTodo "FIXME" contained
+syn match cspTodo "TODO" contained
+syn match cspTodo "!!!" contained
+
+" RT-Tester pseudo comments:
+" (The now obsolete syntax:)
+syn match cspOldRttComment "^--\$\$AM_UNDEF"lc=2 contained
+syn match cspOldRttComment "^--\$\$AM_ERROR"lc=2 contained
+syn match cspOldRttComment "^--\$\$AM_WARNING"lc=2 contained
+syn match cspOldRttComment "^--\$\$AM_SET_TIMER"lc=2 contained
+syn match cspOldRttComment "^--\$\$AM_RESET_TIMER"lc=2 contained
+syn match cspOldRttComment "^--\$\$AM_ELAPSED_TIMER"lc=2 contained
+syn match cspOldRttComment "^--\$\$AM_OUTPUT"lc=2 contained
+syn match cspOldRttComment "^--\$\$AM_INPUT"lc=2 contained
+" (The current syntax:)
+syn region cspRttPragma matchgroup=cspRttPragmaKeyword start="^pragma\s\+" end="\s*$" oneline keepend contains=cspRttPragmaArg,cspRttPragmaSdl
+syn keyword cspRttPragmaArg AM_ERROR AM_WARNING AM_SET_TIMER contained
+syn keyword cspRttPragmaArg AM_RESET_TIMER AM_ELAPSED_TIMER contained
+syn keyword cspRttPragmaArg AM_OUTPUT AM_INPUT AM_INTERNAL contained
+" the "SDL_MATCH" extension:
+syn region cspRttPragmaSdl matchgroup=cspRttPragmaKeyword start="SDL_MATCH\s\+" end="\s*$" contains=cspRttPragmaSdlArg contained
+syn keyword cspRttPragmaSdlArg TRANSLATE nextgroup=cspRttPragmaSdlTransName contained
+syn keyword cspRttPragmaSdlArg PARAM SKIP OPTIONAL CHOICE ARRAY nextgroup=cspRttPragmaSdlName contained
+syn match cspRttPragmaSdlName "\s*\S\+\s*" nextgroup=cspRttPragmaSdlTail contained
+syn region cspRttPragmaSdlTail start="" end="\s*$" contains=cspRttPragmaSdlTailArg contained
+syn keyword cspRttPragmaSdlTailArg SUBSET_USED DEFAULT_VALUE Present contained
+syn match cspRttPragmaSdlTransName "\s*\w\+\s*" nextgroup=cspRttPragmaSdlTransTail contained
+syn region cspRttPragmaSdlTransTail start="" end="\s*$" contains=cspRttPragmaSdlTransTailArg contained
+syn keyword cspRttPragmaSdlTransTailArg sizeof contained
+syn match cspRttPragmaSdlTransTailArg "\*" contained
+syn match cspRttPragmaSdlTransTailArg "(" contained
+syn match cspRttPragmaSdlTransTailArg ")" contained
+
+" temporary syntax extension for commented-out "pragma SDL_MATCH":
+syn match cspSdlRttComment "pragma\s\+SDL_MATCH\s\+" nextgroup=cspRttPragmaSdlArg contained
+
+syn sync lines=250
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/css.vim b/runtime/syntax/css.vim
new file mode 100644
index 0000000..564dc15
--- /dev/null
+++ b/runtime/syntax/css.vim
@@ -0,0 +1,665 @@
+" Vim syntax file
+" Language: Cascading Style Sheets
+" Previous Contributor List:
+" Jules Wang <w.jq0722@gmail.com>
+" Claudio Fleiner <claudio@fleiner.com>
+" Yeti (Add full CSS2, HTML4 support)
+" Nikolai Weibull (Add CSS2 support)
+" URL: https://github.com/vim-language-dept/css-syntax.vim
+" Maintainer: Jay Sitter <jay@jaysitter.com>
+" Last Change: 2021 Oct 20
+
+" quit when a syntax file was already loaded
+if !exists("main_syntax")
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'css'
+elseif exists("b:current_syntax") && b:current_syntax == "css"
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case ignore
+" Add dash to allowed keyword characters.
+syn iskeyword @,48-57,_,192-255,-
+
+" HTML4 tags
+syn keyword cssTagName abbr address area a b base
+syn keyword cssTagName bdo blockquote body br button
+syn keyword cssTagName caption cite code col colgroup dd del
+syn keyword cssTagName dfn div dl dt em fieldset form
+syn keyword cssTagName h1 h2 h3 h4 h5 h6 head hr html img i
+syn keyword cssTagName iframe input ins isindex kbd label legend li
+syn keyword cssTagName link map menu meta noscript ol optgroup
+syn keyword cssTagName option p param picture pre q s samp script small
+syn keyword cssTagName span strong sub sup tbody td
+syn keyword cssTagName textarea tfoot th thead title tr ul u var
+syn keyword cssTagName object svg
+syn match cssTagName /\<select\>\|\<style\>\|\<table\>/
+
+" 34 HTML5 tags
+syn keyword cssTagName article aside audio bdi canvas command data
+syn keyword cssTagName datalist details dialog embed figcaption figure footer
+syn keyword cssTagName header hgroup keygen main mark menuitem meter nav
+syn keyword cssTagName output progress rt rp ruby section
+syn keyword cssTagName source summary time track video wbr
+
+" Tags not supported in HTML5
+" acronym applet basefont big center dir
+" font frame frameset noframes strike tt
+
+syn match cssTagName "\*"
+
+" selectors
+syn match cssSelectorOp "[,>+~]"
+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 cssClassNameDot contained '\.'
+
+try
+syn match cssIdentifier "#[A-Za-zÀ-ÿ_@][A-Za-zÀ-ÿ0-9_@-]*"
+catch /^.*/
+syn match cssIdentifier "#[A-Za-z_@][A-Za-z0-9_@-]*"
+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\|fr\|vw\|vh\|vmin\|vmax\|ch\)\>" 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
+
+" The 16 basic color names
+syn keyword cssColor contained aqua black blue fuchsia gray green lime maroon navy olive purple red silver teal yellow
+
+" 130 more color names
+syn keyword cssColor contained aliceblue antiquewhite aquamarine azure
+syn keyword cssColor contained beige bisque blanchedalmond blueviolet brown burlywood
+syn keyword cssColor contained cadetblue chartreuse chocolate coral cornflowerblue cornsilk crimson cyan
+syn match cssColor contained /\<dark\(blue\|cyan\|goldenrod\|gray\|green\|grey\|khaki\)\>/
+syn match cssColor contained /\<dark\(magenta\|olivegreen\|orange\|orchid\|red\|salmon\|seagreen\)\>/
+syn match cssColor contained /\<darkslate\(blue\|gray\|grey\)\>/
+syn match cssColor contained /\<dark\(turquoise\|violet\)\>/
+syn keyword cssColor contained deeppink deepskyblue dimgray dimgrey dodgerblue firebrick
+syn keyword cssColor contained floralwhite forestgreen gainsboro ghostwhite gold
+syn keyword cssColor contained goldenrod greenyellow grey honeydew hotpink
+syn keyword cssColor contained indianred indigo ivory khaki lavender lavenderblush lawngreen
+syn keyword cssColor contained lemonchiffon limegreen linen magenta
+syn match cssColor contained /\<light\(blue\|coral\|cyan\|goldenrodyellow\|gray\|green\)\>/
+syn match cssColor contained /\<light\(grey\|pink\|salmon\|seagreen\|skyblue\|yellow\)\>/
+syn match cssColor contained /\<light\(slategray\|slategrey\|steelblue\)\>/
+syn match cssColor contained /\<medium\(aquamarine\|blue\|orchid\|purple\|seagreen\)\>/
+syn match cssColor contained /\<medium\(slateblue\|springgreen\|turquoise\|violetred\)\>/
+syn keyword cssColor contained midnightblue mintcream mistyrose moccasin navajowhite
+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 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
+
+" FIXME: These are actually case-insensitive too, but (a) specs recommend using
+" mixed-case (b) it's hard to highlight the word `Background' correctly in
+" all situations
+syn case match
+syn keyword cssColor contained ActiveBorder ActiveCaption AppWorkspace ButtonFace ButtonHighlight ButtonShadow ButtonText CaptionText GrayText Highlight HighlightText InactiveBorder InactiveCaption InactiveCaptionText InfoBackground InfoText Menu MenuText Scrollbar ThreeDDarkShadow ThreeDFace ThreeDHighlight ThreeDLightShadow ThreeDShadow Window WindowFrame WindowText Background
+syn case ignore
+
+syn match cssImportant contained "!\s*important\>"
+syn match cssCustomProp contained "\<--[a-zA-Z0-9-_]*\>"
+
+syn match cssColor contained "\<transparent\>"
+syn match cssColor contained "\<currentColor\>"
+syn match cssColor contained "\<white\>"
+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="\<\(uri\|url\|local\|format\)\s*(" end=")" contains=cssStringQ,cssStringQQ oneline
+syn region cssMathGroup contained matchgroup=cssMathParens start="(" end=")" containedin=cssFunction,cssMathGroup contains=cssCustomProp,cssValue.*,cssFunction,cssColor,cssStringQ,cssStringQQ oneline
+syn region cssFunction contained matchgroup=cssFunctionName start="\<\(var\|calc\)\s*(" end=")" contains=cssCustomProp,cssValue.*,cssFunction,cssColor,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-\|conic-\)\=\gradient\s*(" end=")" oneline contains=cssColor,cssValueInteger,cssValueNumber,cssValueLength,cssFunction,cssGradientAttr,cssFunctionComma
+syn region cssFunction contained matchgroup=cssFunctionName start="\<\(matrix\(3d\)\=\|scale\(3d\|X\|Y\|Z\)\=\|translate\(3d\|X\|Y\|Z\)\=\|skew\(X\|Y\)\=\|rotate\(3d\|X\|Y\|Z\)\=\|perspective\)\s*(" end=")" oneline contains=cssValueInteger,cssValueNumber,cssValueLength,cssValueAngle,cssFunctionComma
+syn region cssFunction contained matchgroup=cssFunctionName start="\<\(blur\|brightness\|contrast\|drop-shadow\|grayscale\|hue-rotate\|invert\|opacity\|saturate\|sepia\)\s*(" end=")" oneline contains=cssValueInteger,cssValueNumber,cssValueLength,cssValueAngle,cssFunctionComma
+syn keyword cssGradientAttr contained top bottom left right cover center middle ellipse at
+syn match cssFunctionComma contained ","
+
+" Common Prop and Attr
+syn keyword cssCommonAttr contained auto none inherit all default normal
+syn keyword cssCommonAttr contained top bottom center stretch hidden visible
+syn match cssCommonAttr contained "\<\(max-\|min-\|fit-\)content\>"
+"------------------------------------------------
+" CSS Animations
+" http://www.w3.org/TR/css3-animations/
+syn match cssAnimationProp contained "\<animation\(-\(delay\|direction\|duration\|fill-mode\|name\|play-state\|timing-function\|iteration-count\)\)\=\>"
+
+" animation-direction attributes
+syn keyword cssAnimationAttr contained alternate reverse
+syn match cssAnimationAttr contained "\<alternate-reverse\>"
+
+" animation-fill-mode attributes
+syn keyword cssAnimationAttr contained forwards backwards both
+
+" animation-play-state attributes
+syn keyword cssAnimationAttr contained running paused
+
+" animation-iteration-count attributes
+syn keyword cssAnimationAttr contained infinite
+"------------------------------------------------
+" CSS Backgrounds and Borders Module Level 3
+" http://www.w3.org/TR/css3-background/
+syn match cssBackgroundProp contained "\<background\(-\(attachment\|clip\|color\|image\|origin\|position\|repeat\|size\)\)\=\>"
+" background-attachment attributes
+syn keyword cssBackgroundAttr contained scroll fixed local
+
+" background-position attributes
+syn keyword cssBackgroundAttr contained left center right top bottom
+
+" background-repeat attributes
+syn match cssBackgroundAttr contained "\<no-repeat\>"
+syn match cssBackgroundAttr contained "\<repeat\(-[xy]\)\=\>"
+
+" background-size attributes
+syn keyword cssBackgroundAttr contained cover contain
+
+syn match cssBorderProp contained "\<border\(-\(top\|right\|bottom\|left\)\)\=\(-\(width\|color\|style\)\)\=\>"
+syn match cssBorderProp contained "\<border\(-\(top\|bottom\)-\(left\|right\)\)\=-radius\>"
+syn match cssBorderProp contained "\<border-image\(-\(outset\|repeat\|slice\|source\|width\)\)\=\>"
+syn match cssBorderProp contained "\<box-decoration-break\>"
+syn match cssBorderProp contained "\<box-shadow\>"
+
+" border-image attributes
+syn keyword cssBorderAttr contained stretch round fill
+
+" border-style attributes
+syn keyword cssBorderAttr contained dotted dashed solid double groove ridge inset outset
+
+" border-width attributes
+syn keyword cssBorderAttr contained thin thick medium
+
+" box-decoration-break attributes
+syn keyword cssBorderAttr contained clone slice
+"------------------------------------------------
+
+syn match cssBoxProp contained "\<padding\(-\(top\|right\|bottom\|left\)\)\=\>"
+syn match cssBoxProp contained "\<margin\(-\(top\|right\|bottom\|left\)\)\=\>"
+syn match cssBoxProp contained "\<overflow\(-\(x\|y\|style\)\)\=\>"
+syn match cssBoxProp contained "\<rotation\(-point\)\=\>"
+syn keyword cssBoxAttr contained visible hidden scroll auto
+syn match cssBoxAttr contained "\<no-\(display\|content\)\>"
+
+syn keyword cssCascadeProp contained all
+syn keyword cssCascadeAttr contained initial unset revert
+
+syn keyword cssColorProp contained opacity
+syn match cssColorProp contained "\<color-profile\>"
+syn match cssColorProp contained "\<rendering-intent\>"
+
+
+syn match cssDimensionProp contained "\<\(min\|max\)-\(width\|height\)\>"
+syn keyword cssDimensionProp contained height
+syn keyword cssDimensionProp contained width
+
+" 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\|evenly\)\)\=\>"
+
+" CSS Fonts Module Level 3
+" http://www.w3.org/TR/css-fonts-3/
+syn match cssFontProp contained "\<font\(-\(family\|\|feature-settings\|kerning\|language-override\|size\(-adjust\)\=\|stretch\|style\|synthesis\|variant\(-\(alternates\|caps\|east-asian\|ligatures\|numeric\|position\)\)\=\|weight\)\)\=\>"
+
+" font attributes
+syn keyword cssFontAttr contained icon menu 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 keyword cssFontAttr contained sans-serif serif cursive fantasy monospace
+" font-feature-settings attributes
+syn keyword cssFontAttr contained on off
+" font-stretch attributes
+syn match cssFontAttr contained "\<\(\(ultra\|extra\|semi\)-\)\=\(condensed\|expanded\)\>"
+" font-style attributes
+syn keyword cssFontAttr contained italic oblique
+" font-synthesis attributes
+syn keyword cssFontAttr contained weight style
+" font-weight attributes
+syn keyword cssFontAttr contained bold bolder lighter
+" TODO: font-variant-* attributes
+"------------------------------------------------
+
+" Webkit specific property/attributes
+syn match cssFontProp contained "\<font-smooth\>"
+syn match cssFontAttr contained "\<\(subpixel-\)\=\antialiased\>"
+
+
+" CSS Multi-column Layout Module
+" http://www.w3.org/TR/css3-multicol/
+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 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\)\>"
+syn match cssGeneratedContentProp contained "\<move-to\>"
+syn match cssGeneratedContentProp contained "\<page-policy\>"
+syn match cssGeneratedContentAttr contained "\<\(no-\)\=\(open\|close\)-quote\>"
+
+" https://www.w3.org/TR/css-grid-1/
+syn match cssGridProp contained "\<grid\>"
+syn match cssGridProp contained "\<grid-template\(-\(columns\|rows\|areas\)\)\=\>"
+syn match cssGridProp contained "\<grid-\(column\|row\)\(-\(start\|end\|gap\)\)\=\>"
+syn match cssGridProp contained "\<grid-\(area\|gap\)\>"
+syn match cssGridProp contained "\<gap\>"
+syn match cssGridProp contained "\<grid-auto-\(flow\|rows\|columns\)\>"
+
+syn match cssHyerlinkProp contained "\<target\(-\(name\|new\|position\)\)\=\>"
+
+syn match cssListProp contained "\<list-style\(-\(type\|position\|image\)\)\=\>"
+syn match cssListAttr contained "\<\(lower\|upper\)-\(roman\|alpha\|greek\|latin\)\>"
+syn match cssListAttr contained "\<\(hiragana\|katakana\)\(-iroha\)\=\>"
+syn match cssListAttr contained "\<\(decimal\(-leading-zero\)\=\|cjk-ideographic\)\>"
+syn keyword cssListAttr contained disc circle square hebrew armenian georgian
+syn keyword cssListAttr contained inside outside
+
+" object-fit https://www.w3.org/TR/css-images-3/#the-object-fit
+syn match cssObjectProp contained "\<object-\(fit\|position\)\>"
+syn keyword cssObjectAttr contained fill contain cover scale-down
+
+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 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\|grid\|flex\)\)\=\>"
+syn match cssPositioningAttr contained "\<flow\(-root\)\=\>"
+syn keyword cssPositioningAttr contained static relative absolute fixed subgrid sticky
+
+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
+
+
+syn keyword cssTextProp contained color direction hyphens
+syn match cssTextProp "\<\(\(word\|letter\)-spacing\|text\(-\(decoration\|transform\|align\|index\|shadow\)\)\=\|vertical-align\|unicode-bidi\|line-height\)\>"
+syn match cssTextProp contained "\<text-\(justify\|outline\|warp\|align-last\|size-adjust\|rendering\|stroke\|indent\)\>"
+syn match cssTextProp contained "\<\(word\|line\)-break\|\(overflow\|word\)-wrap\>"
+syn match cssTextProp contained "\<white-space\>"
+syn match cssTextProp contained "\<hanging-punctuation\>"
+syn match cssTextProp contained "\<tab-size\>"
+syn match cssTextProp contained "\<punctuation-trim\>"
+syn match cssTextAttr contained "\<line-through\>"
+syn match cssTextAttr contained "\<\(text-\)\=\(top\|bottom\)\>"
+syn keyword cssTextAttr contained ltr rtl embed nowrap
+syn keyword cssTextAttr contained underline overline blink sub super middle
+syn keyword cssTextAttr contained capitalize uppercase lowercase
+syn keyword cssTextAttr contained justify baseline sub super
+syn keyword cssTextAttr contained optimizeLegibility optimizeSpeed geometricPrecision
+syn match cssTextAttr contained "\<pre\(-\(line\|wrap\)\)\=\>"
+syn match cssTextAttr contained "\<\(allow\|force\)-end\>"
+syn keyword cssTextAttr contained start end adjacent
+syn match cssTextAttr contained "\<inter-\(word\|ideographic\|cluster\)\>"
+syn keyword cssTextAttr contained distribute kashida first last
+syn keyword cssTextAttr contained clip ellipsis unrestricted suppress
+syn match cssTextAttr contained "\<break-all\>"
+syn match cssTextAttr contained "\<break-word\>"
+syn keyword cssTextAttr contained manual
+syn match cssTextAttr contained "\<bidi-override\>"
+
+syn match cssTransformProp contained "\<transform\(-\(origin\|style\)\)\=\>"
+syn match cssTransformProp contained "\<perspective\(-origin\)\=\>"
+syn match cssTransformProp contained "\<backface-visibility\>"
+
+" CSS Transitions
+" http://www.w3.org/TR/css3-transitions/
+syn match cssTransitionProp contained "\<transition\(-\(delay\|duration\|property\|timing-function\)\)\=\>"
+
+" transition-time-function attributes
+syn match cssTransitionAttr contained "\<linear\(-gradient\)\@!\>"
+syn match cssTransitionAttr contained "\<ease\(-\(in-out\|out\|in\)\)\=\>"
+syn match cssTransitionAttr contained "\<step\(-start\|-end\)\=\>"
+"------------------------------------------------
+" CSS Basic User Interface Module Level 3 (CSS3 UI)
+" http://www.w3.org/TR/css3-ui/
+syn match cssUIProp contained "\<box-sizing\>"
+syn match cssUIAttr contained "\<\(content\|padding\|border\)\(-box\)\=\>"
+
+syn keyword cssUIProp contained cursor
+syn match cssUIAttr contained "\<\(\([ns]\=[ew]\=\)\|col\|row\|nesw\|nwse\)-resize\>"
+syn keyword cssUIAttr contained crosshair help move pointer alias copy
+syn keyword cssUIAttr contained progress wait text cell move
+syn match cssUIAttr contained "\<context-menu\>"
+syn match cssUIAttr contained "\<no-drop\>"
+syn match cssUIAttr contained "\<not-allowed\>"
+syn match cssUIAttr contained "\<all-scroll\>"
+syn match cssUIAttr contained "\<\(vertical-\)\=text\>"
+syn match cssUIAttr contained "\<zoom\(-in\|-out\)\=\>"
+
+syn match cssUIProp contained "\<ime-mode\>"
+syn keyword cssUIAttr contained active inactive disabled
+
+syn match cssUIProp contained "\<nav-\(down\|index\|left\|right\|up\)\=\>"
+syn match cssUIProp contained "\<outline\(-\(width\|style\|color\|offset\)\)\=\>"
+syn keyword cssUIAttr contained invert
+
+syn keyword cssUIProp contained icon resize
+syn keyword cssUIAttr contained both horizontal vertical
+
+syn match cssUIProp contained "\<text-overflow\>"
+syn keyword cssUIAttr contained clip ellipsis
+
+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\>'
+" IE specific attributes
+syn match cssIEUIAttr contained '\<bicubic\>'
+
+" Webkit/iOS specific properties
+syn match cssUIProp contained '\<\(tap-highlight-color\|user-select\|touch-callout\)\>'
+" IE specific properties
+syn match cssIEUIProp contained '\<\(interpolation-mode\|zoom\|filter\)\>'
+
+" Webkit/Firebox specific properties/attributes
+syn keyword cssUIProp contained appearance
+syn keyword cssUIAttr contained window button field icon document menu
+
+
+syn match cssAuralProp contained "\<\(pause\|cue\)\(-\(before\|after\)\)\=\>"
+syn match cssAuralProp contained "\<\(play-during\|speech-rate\|voice-family\|pitch\(-range\)\=\|speak\(-\(punctuation\|numeral\|header\)\)\=\)\>"
+syn keyword cssAuralProp contained volume during azimuth elevation stress richness
+syn match cssAuralAttr contained "\<\(x-\)\=\(soft\|loud\)\>"
+syn keyword cssAuralAttr contained silent
+syn match cssAuralAttr contained "\<spell-out\>"
+syn keyword cssAuralAttr contained non mix
+syn match cssAuralAttr contained "\<\(left\|right\)-side\>"
+syn match cssAuralAttr contained "\<\(far\|center\)-\(left\|center\|right\)\>"
+syn keyword cssAuralAttr contained leftwards rightwards behind
+syn keyword cssAuralAttr contained below level above lower higher
+syn match cssAuralAttr contained "\<\(x-\)\=\(slow\|fast\|low\|high\)\>"
+syn keyword cssAuralAttr contained faster slower
+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
+syn keyword cssMediaProp contained any-hover any-pointer color-gamut grid hover
+syn keyword cssMediaProp contained overflow-block overflow-inline pointer update
+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 keyword cssMediaAttr contained coarse fast fine hover infinite p3 paged
+syn keyword cssMediaAttr contained rec2020 scroll slow srgb
+syn match cssKeyFrameProp contained /\(\d\+\(\.\d\+\)\?%\|\(\<from\|to\>\)\)/ 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=cssTagName,cssAttributeSelector,cssClassName,cssIdentifier,cssAtRule,cssAttrRegion,css.*Prop,cssComment,cssValue.*,cssColor,cssURL,cssImportant,cssCustomProp,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssVendor,cssDefinition,cssHacks,cssNoise fold
+syn match cssBraceError "}"
+syn match cssAttrComma ","
+
+" Pseudo class
+" https://www.w3.org/TR/selectors-4/
+syn match cssPseudoClass ":[A-Za-z0-9_-]*" contains=cssNoise,cssPseudoClassId,cssUnicodeEscape,cssVendor,cssPseudoClassFn
+syn keyword cssPseudoClassId contained link visited active hover before after left right
+syn keyword cssPseudoClassId contained root empty target enabled disabled checked invalid
+syn match cssPseudoClassId contained "\<first-\(line\|letter\)\>"
+syn match cssPseudoClassId contained "\<\(first\|last\|only\)-\(of-type\|child\)\>"
+syn match cssPseudoClassId contained "\<focus\(-within\|-visible\)\=\>"
+syn region cssPseudoClassFn contained matchgroup=cssFunctionName start="\<\(not\|is\|lang\|\(nth\|nth-last\)-\(of-type\|child\)\)(" end=")" contains=cssStringQ,cssStringQQ,cssTagName,cssAttributeSelector,cssClassName,cssIdentifier
+" ------------------------------------
+" Vendor specific properties
+syn match cssPseudoClassId contained "\<selection\>"
+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 cssNoise contained /\(:\|;\|\/\)/
+
+" Comment
+syn region cssComment start="/\*" end="\*/" contains=@Spell fold
+
+syn match cssUnicodeEscape "\\\x\{1,6}\s\?"
+syn match cssSpecialCharQQ +\\\\\|\\"+ contained
+syn match cssSpecialCharQ +\\\\\|\\'+ contained
+syn region cssStringQQ start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=cssUnicodeEscape,cssSpecialCharQQ
+syn region cssStringQ start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=cssUnicodeEscape,cssSpecialCharQ
+
+" Vendor Prefix
+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
+" with a _ or * to isolate those definitions to particular versions of IE
+" This is purely decorative and therefore we assign to the same highlight
+" group to cssVendor, for more information:
+" http://www.paulirish.com/2009/browser-specific-css-hacks/
+syn match cssHacks contained /\(_\|*\)/
+
+" Attr Enhance
+" Some keywords are both Prop and Attr, so we have to handle them
+" cssPseudoClassId is hidden by cssAttrRegion, so we add it here. see #69
+syn region cssAttrRegion start=/:/ end=/\ze\(;\|)\|}\|{\)/ contained contains=cssPseudoClassId,css.*Attr,cssColor,cssImportant,cssValue.*,cssFunction,cssString.*,cssURL,cssComment,cssUnicodeEscape,cssVendor,cssError,cssAttrComma,cssNoise
+
+" Hack for transition
+" '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\)/
+
+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,cssCustomProp,cssFunctionName 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
+
+" @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.
+" 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 cssCascadeProp 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 cssObjectProp 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 cssObjectAttr 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 cssCascadeAttr 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 cssCustomProp 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"
+
+if main_syntax == 'css'
+ unlet main_syntax
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/cterm.vim b/runtime/syntax/cterm.vim
new file mode 100644
index 0000000..1b6cb28
--- /dev/null
+++ b/runtime/syntax/cterm.vim
@@ -0,0 +1,177 @@
+" Vim syntax file
+" Language: Century Term Command Script
+" Maintainer: Sean M. McKee <mckee@misslink.net>
+" Last Change: 2002 Apr 13
+" Version Info: @(#)cterm.vim 1.7 97/12/15 09:23:14
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+"FUNCTIONS
+syn keyword ctermFunction abort addcr addlf answer at attr batch baud
+syn keyword ctermFunction break call capture cd cdelay charset cls color
+syn keyword ctermFunction combase config commect copy cread
+syn keyword ctermFunction creadint devprefix dialer dialog dimint
+syn keyword ctermFunction dimlog dimstr display dtimeout dwait edit
+syn keyword ctermFunction editor emulate erase escloop fcreate
+syn keyword ctermFunction fflush fillchar flags flush fopen fread
+syn keyword ctermFunction freadln fseek fwrite fwriteln get hangup
+syn keyword ctermFunction help hiwait htime ignore init itime
+syn keyword ctermFunction keyboard lchar ldelay learn lockfile
+syn keyword ctermFunction locktime log login logout lowait
+syn keyword ctermFunction lsend ltime memlist menu mkdir mode
+syn keyword ctermFunction modem netdialog netport noerror pages parity
+syn keyword ctermFunction pause portlist printer protocol quit rcv
+syn keyword ctermFunction read readint readn redial release
+syn keyword ctermFunction remote rename restart retries return
+syn keyword ctermFunction rmdir rtime run runx scrollback send
+syn keyword ctermFunction session set setcap setcolor setkey
+syn keyword ctermFunction setsym setvar startserver status
+syn keyword ctermFunction stime stopbits stopserver tdelay
+syn keyword ctermFunction terminal time trans type usend version
+syn keyword ctermFunction vi vidblink vidcard vidout vidunder wait
+syn keyword ctermFunction wildsize wclose wopen wordlen wru wruchar
+syn keyword ctermFunction xfer xmit xprot
+syn match ctermFunction "?"
+"syn keyword ctermFunction comment remark
+
+"END FUNCTIONS
+"INTEGER FUNCTIONS
+syn keyword ctermIntFunction asc atod eval filedate filemode filesize ftell
+syn keyword ctermIntFunction len termbits opsys pos sum time val mdmstat
+"END INTEGER FUNCTIONS
+
+"STRING FUNCTIONS
+syn keyword ctermStrFunction cdate ctime chr chrdy chrin comin getenv
+syn keyword ctermStrFunction gethomedir left midstr right str tolower
+syn keyword ctermStrFunction toupper uniq comst exists feof hascolor
+
+"END STRING FUNCTIONS
+
+"PREDEFINED TERM VARIABLES R/W
+syn keyword ctermPreVarRW f _escloop _filename _kermiteol _obufsiz
+syn keyword ctermPreVarRW _port _rcvsync _cbaud _reval _turnchar
+syn keyword ctermPreVarRW _txblksiz _txwindow _vmin _vtime _cparity
+syn keyword ctermPreVarRW _cnumber false t true _cwordlen _cstopbits
+syn keyword ctermPreVarRW _cmode _cemulate _cxprot _clogin _clogout
+syn keyword ctermPreVarRW _cstartsrv _cstopsrv _ccmdfile _cwru
+syn keyword ctermPreVarRW _cprotocol _captfile _cremark _combufsiz
+syn keyword ctermPreVarRW logfile
+"END PREDEFINED TERM VARIABLES R/W
+
+"PREDEFINED TERM VARIABLES R/O
+syn keyword ctermPreVarRO _1 _2 _3 _4 _5 _6 _7 _8 _9 _cursess
+syn keyword ctermPreVarRO _lockfile _baud _errno _retval _sernum
+syn keyword ctermPreVarRO _timeout _row _col _version
+"END PREDEFINED TERM VARIABLES R/O
+
+syn keyword ctermOperator not mod eq ne gt le lt ge xor and or shr not shl
+
+"SYMBOLS
+syn match CtermSymbols "|"
+"syn keyword ctermOperators + - * / % = != > < >= <= & | ^ ! << >>
+"END SYMBOLS
+
+"STATEMENT
+syn keyword ctermStatement off
+syn keyword ctermStatement disk overwrite append spool none
+syn keyword ctermStatement echo view wrap
+"END STATEMENT
+
+"TYPE
+"syn keyword ctermType
+"END TYPE
+
+"USERLIB FUNCTIONS
+"syn keyword ctermLibFunc
+"END USERLIB FUNCTIONS
+
+"LABEL
+syn keyword ctermLabel case default
+"END LABEL
+
+"CONDITIONAL
+syn keyword ctermConditional on endon
+syn keyword ctermConditional proc endproc
+syn keyword ctermConditional for in do endfor
+syn keyword ctermConditional if else elseif endif iferror
+syn keyword ctermConditional switch endswitch
+syn keyword ctermConditional repeat until
+"END CONDITIONAL
+
+"REPEAT
+syn keyword ctermRepeat while
+"END REPEAT
+
+" Function arguments (eg $1 $2 $3)
+syn match ctermFuncArg "\$[1-9]"
+
+syn keyword ctermTodo contained TODO
+
+syn match ctermNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+"floating point number, with dot, optional exponent
+syn match ctermNumber "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, starting with a dot, optional exponent
+syn match ctermNumber "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match ctermNumber "\<\d\+e[-+]\=\d\+[fl]\=\>"
+"hex number
+syn match ctermNumber "0x[0-9a-f]\+\(u\=l\=\|lu\)\>"
+
+syn match ctermComment "![^=].*$" contains=ctermTodo
+syn match ctermComment "!$"
+syn match ctermComment "\*.*$" contains=ctermTodo
+syn region ctermComment start="comment" end="$" contains=ctermTodo
+syn region ctermComment start="remark" end="$" contains=ctermTodo
+
+syn region ctermVar start="\$(" end=")"
+
+" String and Character contstants
+" Highlight special characters (those which have a backslash) differently
+syn match ctermSpecial contained "\\\d\d\d\|\\."
+syn match ctermSpecial contained "\^."
+syn region ctermString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=ctermSpecial,ctermVar,ctermSymbols
+syn match ctermCharacter "'[^\\]'"
+syn match ctermSpecialCharacter "'\\.'"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/ctrlh.vim b/runtime/syntax/ctrlh.vim
new file mode 100644
index 0000000..b4bf347
--- /dev/null
+++ b/runtime/syntax/ctrlh.vim
@@ -0,0 +1,23 @@
+" Vim syntax file
+" Language: CTRL-H (e.g., ASCII manpages)
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2005 Jun 20
+
+" Existing syntax is kept, this file can be used as an addition
+
+" Recognize underlined text: _^Hx
+syntax match CtrlHUnderline /_\b./ contains=CtrlHHide
+
+" Recognize bold text: x^Hx
+syntax match CtrlHBold /\(.\)\b\1/ contains=CtrlHHide
+
+" Hide the CTRL-H (backspace)
+syntax match CtrlHHide /.\b/ contained
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet
+hi def link CtrlHHide Ignore
+hi def CtrlHUnderline term=underline cterm=underline gui=underline
+hi def CtrlHBold term=bold cterm=bold gui=bold
+
+" vim: ts=8
diff --git a/runtime/syntax/cucumber.vim b/runtime/syntax/cucumber.vim
new file mode 100644
index 0000000..f1ef299
--- /dev/null
+++ b/runtime/syntax/cucumber.vim
@@ -0,0 +1,142 @@
+" Vim syntax file
+" Language: Cucumber
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Filenames: *.feature
+" Last Change: 2013 May 30
+
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+syn case match
+syn sync minlines=20
+
+let g:cucumber_languages = {
+ \"en": {"and": "And\\>", "background": "Background\\>", "but": "But\\>", "examples": "Scenarios\\>\\|Examples\\>", "feature": "Business Need\\>\\|Feature\\>\\|Ability\\>", "given": "Given\\>", "scenario": "Scenario\\>", "scenario_outline": "Scenario Template\\>\\|Scenario Outline\\>", "then": "Then\\>", "when": "When\\>"},
+ \"ar": {"and": "\\%u0648\\>", "background": "\\%u0627\\%u0644\\%u062e\\%u0644\\%u0641\\%u064a\\%u0629\\>", "but": "\\%u0644\\%u0643\\%u0646\\>", "examples": "\\%u0627\\%u0645\\%u062b\\%u0644\\%u0629\\>", "feature": "\\%u062e\\%u0627\\%u0635\\%u064a\\%u0629\\>", "given": "\\%u0628\\%u0641\\%u0631\\%u0636\\>", "scenario": "\\%u0633\\%u064a\\%u0646\\%u0627\\%u0631\\%u064a\\%u0648\\>", "scenario_outline": "\\%u0633\\%u064a\\%u0646\\%u0627\\%u0631\\%u064a\\%u0648 \\%u0645\\%u062e\\%u0637\\%u0637\\>", "then": "\\%u0627\\%u0630\\%u0627\\%u064b\\>\\|\\%u062b\\%u0645\\>", "when": "\\%u0639\\%u0646\\%u062f\\%u0645\\%u0627\\>\\|\\%u0645\\%u062a\\%u0649\\>"},
+ \"bg": {"and": "\\%u0418\\>", "background": "\\%u041f\\%u0440\\%u0435\\%u0434\\%u0438\\%u0441\\%u0442\\%u043e\\%u0440\\%u0438\\%u044f\\>", "but": "\\%u041d\\%u043e\\>", "examples": "\\%u041f\\%u0440\\%u0438\\%u043c\\%u0435\\%u0440\\%u0438\\>", "feature": "\\%u0424\\%u0443\\%u043d\\%u043a\\%u0446\\%u0438\\%u043e\\%u043d\\%u0430\\%u043b\\%u043d\\%u043e\\%u0441\\%u0442\\>", "given": "\\%u0414\\%u0430\\%u0434\\%u0435\\%u043d\\%u043e\\>", "scenario": "\\%u0421\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u0439\\>", "scenario_outline": "\\%u0420\\%u0430\\%u043c\\%u043a\\%u0430 \\%u043d\\%u0430 \\%u0441\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u0439\\>", "then": "\\%u0422\\%u043e\\>", "when": "\\%u041a\\%u043e\\%u0433\\%u0430\\%u0442\\%u043e\\>"},
+ \"bm": {"and": "Dan\\>", "background": "Latar Belakang\\>", "but": "Tetapi\\>", "examples": "Contoh \\>", "feature": "Fungsi\\>", "given": "Bagi\\>", "scenario": "Senario\\>", "scenario_outline": "Menggariskan Senario \\>", "then": "Kemudian\\>", "when": "Apabila\\>"},
+ \"ca": {"and": "I\\>", "background": "Antecedents\\>\\|Rerefons\\>", "but": "Per\\%u00f2\\>", "examples": "Exemples\\>", "feature": "Caracter\\%u00edstica\\>\\|Funcionalitat\\>", "given": "At\\%u00e8s\\>\\|Donada\\>\\|Donat\\>\\|Atesa\\>", "scenario": "Escenari\\>", "scenario_outline": "Esquema de l'escenari\\>", "then": "Aleshores\\>\\|Cal\\>", "when": "Quan\\>"},
+ \"cs": {"and": "A tak\\%u00e9\\>\\|A\\>", "background": "Pozad\\%u00ed\\>\\|Kontext\\>", "but": "Ale\\>", "examples": "P\\%u0159\\%u00edklady\\>", "feature": "Po\\%u017eadavek\\>", "given": "Za p\\%u0159edpokladu\\>\\|Pokud\\>", "scenario": "Sc\\%u00e9n\\%u00e1\\%u0159\\>", "scenario_outline": "N\\%u00e1\\%u010drt Sc\\%u00e9n\\%u00e1\\%u0159e\\>\\|Osnova sc\\%u00e9n\\%u00e1\\%u0159e\\>", "then": "Pak\\>", "when": "Kdy\\%u017e\\>"},
+ \"cy-GB": {"and": "A\\>", "background": "Cefndir\\>", "but": "Ond\\>", "examples": "Enghreifftiau\\>", "feature": "Arwedd\\>", "given": "Anrhegedig a\\>", "scenario": "Scenario\\>", "scenario_outline": "Scenario Amlinellol\\>", "then": "Yna\\>", "when": "Pryd\\>"},
+ \"da": {"and": "Og\\>", "background": "Baggrund\\>", "but": "Men\\>", "examples": "Eksempler\\>", "feature": "Egenskab\\>", "given": "Givet\\>", "scenario": "Scenarie\\>", "scenario_outline": "Abstrakt Scenario\\>", "then": "S\\%u00e5\\>", "when": "N\\%u00e5r\\>"},
+ \"de": {"and": "Und\\>", "background": "Grundlage\\>", "but": "Aber\\>", "examples": "Beispiele\\>", "feature": "Funktionalit\\%u00e4t\\>", "given": "Gegeben sei\\>\\|Angenommen\\>", "scenario": "Szenario\\>", "scenario_outline": "Szenariogrundriss\\>", "then": "Dann\\>", "when": "Wenn\\>"},
+ \"el": {"and": "\\%u039a\\%u03b1\\%u03b9\\>", "background": "\\%u03a5\\%u03c0\\%u03cc\\%u03b2\\%u03b1\\%u03b8\\%u03c1\\%u03bf\\>", "but": "\\%u0391\\%u03bb\\%u03bb\\%u03ac\\>", "examples": "\\%u03a0\\%u03b1\\%u03c1\\%u03b1\\%u03b4\\%u03b5\\%u03af\\%u03b3\\%u03bc\\%u03b1\\%u03c4\\%u03b1\\>\\|\\%u03a3\\%u03b5\\%u03bd\\%u03ac\\%u03c1\\%u03b9\\%u03b1\\>", "feature": "\\%u0394\\%u03c5\\%u03bd\\%u03b1\\%u03c4\\%u03cc\\%u03c4\\%u03b7\\%u03c4\\%u03b1\\>\\|\\%u039b\\%u03b5\\%u03b9\\%u03c4\\%u03bf\\%u03c5\\%u03c1\\%u03b3\\%u03af\\%u03b1\\>", "given": "\\%u0394\\%u03b5\\%u03b4\\%u03bf\\%u03bc\\%u03ad\\%u03bd\\%u03bf\\%u03c5 \\%u03cc\\%u03c4\\%u03b9\\>\\|\\%u0394\\%u03b5\\%u03b4\\%u03bf\\%u03bc\\%u03ad\\%u03bd\\%u03bf\\%u03c5\\>", "scenario": "\\%u03a3\\%u03b5\\%u03bd\\%u03ac\\%u03c1\\%u03b9\\%u03bf\\>", "scenario_outline": "\\%u03a0\\%u03b5\\%u03c1\\%u03b9\\%u03b3\\%u03c1\\%u03b1\\%u03c6\\%u03ae \\%u03a3\\%u03b5\\%u03bd\\%u03b1\\%u03c1\\%u03af\\%u03bf\\%u03c5\\>", "then": "\\%u03a4\\%u03cc\\%u03c4\\%u03b5\\>", "when": "\\%u038c\\%u03c4\\%u03b1\\%u03bd\\>"},
+ \"en-Scouse": {"and": "An\\>", "background": "Dis is what went down\\>", "but": "Buh\\>", "examples": "Examples\\>", "feature": "Feature\\>", "given": "Youse know when youse got\\>\\|Givun\\>", "scenario": "The thing of it is\\>", "scenario_outline": "Wharrimean is\\>", "then": "Den youse gotta\\>\\|Dun\\>", "when": "Youse know like when\\>\\|Wun\\>"},
+ \"en-au": {"and": "Too right\\>", "background": "First off\\>", "but": "Yeah nah\\>", "examples": "You'll wanna\\>", "feature": "Pretty much\\>", "given": "Y'know\\>", "scenario": "Awww, look mate\\>", "scenario_outline": "Reckon it's like\\>", "then": "But at the end of the day I reckon\\>", "when": "It's just unbelievable\\>"},
+ \"en-lol": {"and": "AN\\>", "background": "B4\\>", "but": "BUT\\>", "examples": "EXAMPLZ\\>", "feature": "OH HAI\\>", "given": "I CAN HAZ\\>", "scenario": "MISHUN\\>", "scenario_outline": "MISHUN SRSLY\\>", "then": "DEN\\>", "when": "WEN\\>"},
+ \"en-old": {"and": "Ond\\>\\|7\\>", "background": "\\%u00c6r\\>\\|Aer\\>", "but": "Ac\\>", "examples": "Se \\%u00f0e\\>\\|Se \\%u00fee\\>\\|Se the\\>", "feature": "Hw\\%u00e6t\\>\\|Hwaet\\>", "given": "\\%u00d0urh\\>\\|\\%u00deurh\\>\\|Thurh\\>", "scenario": "Swa\\>", "scenario_outline": "Swa hw\\%u00e6r swa\\>\\|Swa hwaer swa\\>", "then": "\\%u00d0a \\%u00f0e\\>\\|\\%u00dea \\%u00fee\\>\\|\\%u00dea\\>\\|\\%u00d0a\\>\\|Tha the\\>\\|Tha\\>", "when": "\\%u00d0a\\>\\|\\%u00dea\\>\\|Tha\\>"},
+ \"en-pirate": {"and": "Aye\\>", "background": "Yo-ho-ho\\>", "but": "Avast!\\>", "examples": "Dead men tell no tales\\>", "feature": "Ahoy matey!\\>", "given": "Gangway!\\>", "scenario": "Heave to\\>", "scenario_outline": "Shiver me timbers\\>", "then": "Let go and haul\\>", "when": "Blimey!\\>"},
+ \"en-tx": {"and": "And y'all\\>", "background": "Background\\>", "but": "But y'all\\>", "examples": "Examples\\>", "feature": "Feature\\>", "given": "Given y'all\\>", "scenario": "Scenario\\>", "scenario_outline": "All y'all\\>", "then": "Then y'all\\>", "when": "When y'all\\>"},
+ \"eo": {"and": "Kaj\\>", "background": "Fono\\>", "but": "Sed\\>", "examples": "Ekzemploj\\>", "feature": "Trajto\\>", "given": "Donita\\%u0135o\\>", "scenario": "Scenaro\\>", "scenario_outline": "Konturo de la scenaro\\>", "then": "Do\\>", "when": "Se\\>"},
+ \"es": {"and": "Y\\>", "background": "Antecedentes\\>", "but": "Pero\\>", "examples": "Ejemplos\\>", "feature": "Caracter\\%u00edstica\\>", "given": "Dadas\\>\\|Dados\\>\\|Dada\\>\\|Dado\\>", "scenario": "Escenario\\>", "scenario_outline": "Esquema del escenario\\>", "then": "Entonces\\>", "when": "Cuando\\>"},
+ \"et": {"and": "Ja\\>", "background": "Taust\\>", "but": "Kuid\\>", "examples": "Juhtumid\\>", "feature": "Omadus\\>", "given": "Eeldades\\>", "scenario": "Stsenaarium\\>", "scenario_outline": "Raamstsenaarium\\>", "then": "Siis\\>", "when": "Kui\\>"},
+ \"fa": {"and": "\\%u0648\\>", "background": "\\%u0632\\%u0645\\%u06cc\\%u0646\\%u0647\\>", "but": "\\%u0627\\%u0645\\%u0627\\>", "examples": "\\%u0646\\%u0645\\%u0648\\%u0646\\%u0647 \\%u0647\\%u0627\\>", "feature": "\\%u0648\\%u0650\\%u06cc\\%u0698\\%u06af\\%u06cc\\>", "given": "\\%u0628\\%u0627 \\%u0641\\%u0631\\%u0636\\>", "scenario": "\\%u0633\\%u0646\\%u0627\\%u0631\\%u06cc\\%u0648\\>", "scenario_outline": "\\%u0627\\%u0644\\%u06af\\%u0648\\%u06cc \\%u0633\\%u0646\\%u0627\\%u0631\\%u06cc\\%u0648\\>", "then": "\\%u0622\\%u0646\\%u06af\\%u0627\\%u0647\\>", "when": "\\%u0647\\%u0646\\%u06af\\%u0627\\%u0645\\%u06cc\\>"},
+ \"fi": {"and": "Ja\\>", "background": "Tausta\\>", "but": "Mutta\\>", "examples": "Tapaukset\\>", "feature": "Ominaisuus\\>", "given": "Oletetaan\\>", "scenario": "Tapaus\\>", "scenario_outline": "Tapausaihio\\>", "then": "Niin\\>", "when": "Kun\\>"},
+ \"fr": {"and": "Et\\>", "background": "Contexte\\>", "but": "Mais\\>", "examples": "Exemples\\>", "feature": "Fonctionnalit\\%u00e9\\>", "given": "\\%u00c9tant donn\\%u00e9es\\>\\|\\%u00c9tant donn\\%u00e9s\\>\\|\\%u00c9tant donn\\%u00e9e\\>\\|\\%u00c9tant donn\\%u00e9\\>\\|Etant donn\\%u00e9es\\>\\|Etant donn\\%u00e9s\\>\\|Etant donn\\%u00e9e\\>\\|Etant donn\\%u00e9\\>\\|Soit\\>", "scenario": "Sc\\%u00e9nario\\>", "scenario_outline": "Plan du sc\\%u00e9nario\\>\\|Plan du Sc\\%u00e9nario\\>", "then": "Alors\\>", "when": "Lorsqu'\\|Lorsque\\>\\|Quand\\>"},
+ \"gl": {"and": "E\\>", "background": "Contexto\\>", "but": "Mais\\>\\|Pero\\>", "examples": "Exemplos\\>", "feature": "Caracter\\%u00edstica\\>", "given": "Dadas\\>\\|Dados\\>\\|Dada\\>\\|Dado\\>", "scenario": "Escenario\\>", "scenario_outline": "Esbozo do escenario\\>", "then": "Ent\\%u00f3n\\>\\|Logo\\>", "when": "Cando\\>"},
+ \"he": {"and": "\\%u05d5\\%u05d2\\%u05dd\\>", "background": "\\%u05e8\\%u05e7\\%u05e2\\>", "but": "\\%u05d0\\%u05d1\\%u05dc\\>", "examples": "\\%u05d3\\%u05d5\\%u05d2\\%u05de\\%u05d0\\%u05d5\\%u05ea\\>", "feature": "\\%u05ea\\%u05db\\%u05d5\\%u05e0\\%u05d4\\>", "given": "\\%u05d1\\%u05d4\\%u05d9\\%u05e0\\%u05ea\\%u05df\\>", "scenario": "\\%u05ea\\%u05e8\\%u05d7\\%u05d9\\%u05e9\\>", "scenario_outline": "\\%u05ea\\%u05d1\\%u05e0\\%u05d9\\%u05ea \\%u05ea\\%u05e8\\%u05d7\\%u05d9\\%u05e9\\>", "then": "\\%u05d0\\%u05d6\\%u05d9\\>\\|\\%u05d0\\%u05d6\\>", "when": "\\%u05db\\%u05d0\\%u05e9\\%u05e8\\>"},
+ \"hi": {"and": "\\%u0924\\%u0925\\%u093e\\>\\|\\%u0914\\%u0930\\>", "background": "\\%u092a\\%u0943\\%u0937\\%u094d\\%u0920\\%u092d\\%u0942\\%u092e\\%u093f\\>", "but": "\\%u092a\\%u0930\\>", "examples": "\\%u0909\\%u0926\\%u093e\\%u0939\\%u0930\\%u0923\\>", "feature": "\\%u0930\\%u0942\\%u092a \\%u0932\\%u0947\\%u0916\\>", "given": "\\%u091a\\%u0942\\%u0902\\%u0915\\%u093f\\>\\|\\%u092f\\%u0926\\%u093f\\>\\|\\%u0905\\%u0917\\%u0930\\>", "scenario": "\\%u092a\\%u0930\\%u093f\\%u0926\\%u0943\\%u0936\\%u094d\\%u092f\\>", "scenario_outline": "\\%u092a\\%u0930\\%u093f\\%u0926\\%u0943\\%u0936\\%u094d\\%u092f \\%u0930\\%u0942\\%u092a\\%u0930\\%u0947\\%u0916\\%u093e\\>", "then": "\\%u0924\\%u092c\\>", "when": "\\%u091c\\%u092c\\>"},
+ \"hr": {"and": "I\\>", "background": "Pozadina\\>", "but": "Ali\\>", "examples": "Scenariji\\>\\|Primjeri\\>", "feature": "Mogu\\%u0107nost\\>\\|Mogucnost\\>\\|Osobina\\>", "given": "Zadano\\>\\|Zadani\\>\\|Zadan\\>", "scenario": "Scenarij\\>", "scenario_outline": "Koncept\\>\\|Skica\\>", "then": "Onda\\>", "when": "Kada\\>\\|Kad\\>"},
+ \"hu": {"and": "\\%u00c9s\\>", "background": "H\\%u00e1tt\\%u00e9r\\>", "but": "De\\>", "examples": "P\\%u00e9ld\\%u00e1k\\>", "feature": "Jellemz\\%u0151\\>", "given": "Amennyiben\\>\\|Adott\\>", "scenario": "Forgat\\%u00f3k\\%u00f6nyv\\>", "scenario_outline": "Forgat\\%u00f3k\\%u00f6nyv v\\%u00e1zlat\\>", "then": "Akkor\\>", "when": "Amikor\\>\\|Majd\\>\\|Ha\\>"},
+ \"id": {"and": "Dan\\>", "background": "Dasar\\>", "but": "Tapi\\>", "examples": "Contoh\\>", "feature": "Fitur\\>", "given": "Dengan\\>", "scenario": "Skenario\\>", "scenario_outline": "Skenario konsep\\>", "then": "Maka\\>", "when": "Ketika\\>"},
+ \"is": {"and": "Og\\>", "background": "Bakgrunnur\\>", "but": "En\\>", "examples": "Atbur\\%u00f0ar\\%u00e1sir\\>\\|D\\%u00e6mi\\>", "feature": "Eiginleiki\\>", "given": "Ef\\>", "scenario": "Atbur\\%u00f0ar\\%u00e1s\\>", "scenario_outline": "L\\%u00fdsing Atbur\\%u00f0ar\\%u00e1sar\\>\\|L\\%u00fdsing D\\%u00e6ma\\>", "then": "\\%u00de\\%u00e1\\>", "when": "\\%u00deegar\\>"},
+ \"it": {"and": "E\\>", "background": "Contesto\\>", "but": "Ma\\>", "examples": "Esempi\\>", "feature": "Funzionalit\\%u00e0\\>", "given": "Dato\\>\\|Data\\>\\|Dati\\>\\|Date\\>", "scenario": "Scenario\\>", "scenario_outline": "Schema dello scenario\\>", "then": "Allora\\>", "when": "Quando\\>"},
+ \"ja": {"and": "\\%u304b\\%u3064", "background": "\\%u80cc\\%u666f\\>", "but": "\\%u3057\\%u304b\\%u3057\\|\\%u305f\\%u3060\\%u3057\\|\\%u4f46\\%u3057", "examples": "\\%u30b5\\%u30f3\\%u30d7\\%u30eb\\>\\|\\%u4f8b\\>", "feature": "\\%u30d5\\%u30a3\\%u30fc\\%u30c1\\%u30e3\\>\\|\\%u6a5f\\%u80fd\\>", "given": "\\%u524d\\%u63d0", "scenario": "\\%u30b7\\%u30ca\\%u30ea\\%u30aa\\>", "scenario_outline": "\\%u30b7\\%u30ca\\%u30ea\\%u30aa\\%u30a2\\%u30a6\\%u30c8\\%u30e9\\%u30a4\\%u30f3\\>\\|\\%u30b7\\%u30ca\\%u30ea\\%u30aa\\%u30c6\\%u30f3\\%u30d7\\%u30ec\\%u30fc\\%u30c8\\>\\|\\%u30b7\\%u30ca\\%u30ea\\%u30aa\\%u30c6\\%u30f3\\%u30d7\\%u30ec\\>\\|\\%u30c6\\%u30f3\\%u30d7\\%u30ec\\>", "then": "\\%u306a\\%u3089\\%u3070", "when": "\\%u3082\\%u3057"},
+ \"ko": {"and": "\\%uadf8\\%ub9ac\\%uace0", "background": "\\%ubc30\\%uacbd\\>", "but": "\\%ud558\\%uc9c0\\%ub9cc\\|\\%ub2e8", "examples": "\\%uc608\\>", "feature": "\\%uae30\\%ub2a5\\>", "given": "\\%uc870\\%uac74\\|\\%uba3c\\%uc800", "scenario": "\\%uc2dc\\%ub098\\%ub9ac\\%uc624\\>", "scenario_outline": "\\%uc2dc\\%ub098\\%ub9ac\\%uc624 \\%uac1c\\%uc694\\>", "then": "\\%uadf8\\%ub7ec\\%uba74", "when": "\\%ub9cc\\%uc77c\\|\\%ub9cc\\%uc57d"},
+ \"lt": {"and": "Ir\\>", "background": "Kontekstas\\>", "but": "Bet\\>", "examples": "Pavyzd\\%u017eiai\\>\\|Scenarijai\\>\\|Variantai\\>", "feature": "Savyb\\%u0117\\>", "given": "Duota\\>", "scenario": "Scenarijus\\>", "scenario_outline": "Scenarijaus \\%u0161ablonas\\>", "then": "Tada\\>", "when": "Kai\\>"},
+ \"lu": {"and": "an\\>\\|a\\>", "background": "Hannergrond\\>", "but": "m\\%u00e4\\>\\|awer\\>", "examples": "Beispiller\\>", "feature": "Funktionalit\\%u00e9it\\>", "given": "ugeholl\\>", "scenario": "Szenario\\>", "scenario_outline": "Plang vum Szenario\\>", "then": "dann\\>", "when": "wann\\>"},
+ \"lv": {"and": "Un\\>", "background": "Situ\\%u0101cija\\>\\|Konteksts\\>", "but": "Bet\\>", "examples": "Piem\\%u0113ri\\>\\|Paraugs\\>", "feature": "Funkcionalit\\%u0101te\\>\\|F\\%u012b\\%u010da\\>", "given": "Kad\\>", "scenario": "Scen\\%u0101rijs\\>", "scenario_outline": "Scen\\%u0101rijs p\\%u0113c parauga\\>", "then": "Tad\\>", "when": "Ja\\>"},
+ \"nl": {"and": "En\\>", "background": "Achtergrond\\>", "but": "Maar\\>", "examples": "Voorbeelden\\>", "feature": "Functionaliteit\\>", "given": "Gegeven\\>\\|Stel\\>", "scenario": "Scenario\\>", "scenario_outline": "Abstract Scenario\\>", "then": "Dan\\>", "when": "Als\\>"},
+ \"no": {"and": "Og\\>", "background": "Bakgrunn\\>", "but": "Men\\>", "examples": "Eksempler\\>", "feature": "Egenskap\\>", "given": "Gitt\\>", "scenario": "Scenario\\>", "scenario_outline": "Abstrakt Scenario\\>\\|Scenariomal\\>", "then": "S\\%u00e5\\>", "when": "N\\%u00e5r\\>"},
+ \"pl": {"and": "Oraz\\>\\|I\\>", "background": "Za\\%u0142o\\%u017cenia\\>", "but": "Ale\\>", "examples": "Przyk\\%u0142ady\\>", "feature": "W\\%u0142a\\%u015bciwo\\%u015b\\%u0107\\>\\|Potrzeba biznesowa\\>\\|Funkcja\\>\\|Aspekt\\>", "given": "Zak\\%u0142adaj\\%u0105c\\>\\|Maj\\%u0105c\\>", "scenario": "Scenariusz\\>", "scenario_outline": "Szablon scenariusza\\>", "then": "Wtedy\\>", "when": "Je\\%u017celi\\>\\|Je\\%u015bli\\>\\|Kiedy\\>\\|Gdy\\>"},
+ \"pt": {"and": "E\\>", "background": "Cen\\%u00e1rio de Fundo\\>\\|Cenario de Fundo\\>\\|Contexto\\>\\|Fundo\\>", "but": "Mas\\>", "examples": "Cen\\%u00e1rios\\>\\|Exemplos\\>\\|Cenarios\\>", "feature": "Caracter\\%u00edstica\\>\\|Funcionalidade\\>\\|Caracteristica\\>", "given": "Dadas\\>\\|Dados\\>\\|Dada\\>\\|Dado\\>", "scenario": "Cen\\%u00e1rio\\>\\|Cenario\\>", "scenario_outline": "Delinea\\%u00e7\\%u00e3o do Cen\\%u00e1rio\\>\\|Esquema do Cen\\%u00e1rio\\>\\|Delineacao do Cenario\\>\\|Esquema do Cenario\\>", "then": "Ent\\%u00e3o\\>\\|Entao\\>", "when": "Quando\\>"},
+ \"ro": {"and": "\\%u015ei\\>\\|\\%u0218i\\>\\|Si\\>", "background": "Context\\>", "but": "Dar\\>", "examples": "Exemple\\>", "feature": "Func\\%u0163ionalitate\\>\\|Func\\%u021bionalitate\\>\\|Functionalitate\\>", "given": "Da\\%u0163i fiind\\>\\|Da\\%u021bi fiind\\>\\|Dati fiind\\>\\|Date fiind\\>\\|Dat fiind\\>", "scenario": "Scenariu\\>", "scenario_outline": "Structur\\%u0103 scenariu\\>\\|Structura scenariu\\>", "then": "Atunci\\>", "when": "C\\%u00e2nd\\>\\|Cand\\>"},
+ \"ru": {"and": "\\%u041a \\%u0442\\%u043e\\%u043c\\%u0443 \\%u0436\\%u0435\\>\\|\\%u0422\\%u0430\\%u043a\\%u0436\\%u0435\\>\\|\\%u0418\\>", "background": "\\%u041f\\%u0440\\%u0435\\%u0434\\%u044b\\%u0441\\%u0442\\%u043e\\%u0440\\%u0438\\%u044f\\>\\|\\%u041a\\%u043e\\%u043d\\%u0442\\%u0435\\%u043a\\%u0441\\%u0442\\>", "but": "\\%u041d\\%u043e\\>\\|\\%u0410\\>", "examples": "\\%u041f\\%u0440\\%u0438\\%u043c\\%u0435\\%u0440\\%u044b\\>", "feature": "\\%u0424\\%u0443\\%u043d\\%u043a\\%u0446\\%u0438\\%u043e\\%u043d\\%u0430\\%u043b\\>\\|\\%u0421\\%u0432\\%u043e\\%u0439\\%u0441\\%u0442\\%u0432\\%u043e\\>\\|\\%u0424\\%u0443\\%u043d\\%u043a\\%u0446\\%u0438\\%u044f\\>", "given": "\\%u0414\\%u043e\\%u043f\\%u0443\\%u0441\\%u0442\\%u0438\\%u043c\\>\\|\\%u041f\\%u0443\\%u0441\\%u0442\\%u044c\\>\\|\\%u0414\\%u0430\\%u043d\\%u043e\\>", "scenario": "\\%u0421\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u0439\\>", "scenario_outline": "\\%u0421\\%u0442\\%u0440\\%u0443\\%u043a\\%u0442\\%u0443\\%u0440\\%u0430 \\%u0441\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u044f\\>", "then": "\\%u0422\\%u043e\\%u0433\\%u0434\\%u0430\\>\\|\\%u0422\\%u043e\\>", "when": "\\%u041a\\%u043e\\%u0433\\%u0434\\%u0430\\>\\|\\%u0415\\%u0441\\%u043b\\%u0438\\>"},
+ \"sk": {"and": "A z\\%u00e1rove\\%u0148\\>\\|A taktie\\%u017e\\>\\|A tie\\%u017e\\>\\|A\\>", "background": "Pozadie\\>", "but": "Ale\\>", "examples": "Pr\\%u00edklady\\>", "feature": "Po\\%u017eiadavka\\>\\|Vlastnos\\%u0165\\>\\|Funkcia\\>", "given": "Za predpokladu\\>\\|Pokia\\%u013e\\>", "scenario": "Scen\\%u00e1r\\>", "scenario_outline": "N\\%u00e1\\%u010drt Scen\\%u00e1ru\\>\\|N\\%u00e1\\%u010drt Scen\\%u00e1ra\\>\\|Osnova Scen\\%u00e1ra\\>", "then": "Potom\\>\\|Tak\\>", "when": "Ke\\%u010f\\>\\|Ak\\>"},
+ \"sr-Cyrl": {"and": "\\%u0418\\>", "background": "\\%u041a\\%u043e\\%u043d\\%u0442\\%u0435\\%u043a\\%u0441\\%u0442\\>\\|\\%u041f\\%u043e\\%u0437\\%u0430\\%u0434\\%u0438\\%u043d\\%u0430\\>\\|\\%u041e\\%u0441\\%u043d\\%u043e\\%u0432\\%u0430\\>", "but": "\\%u0410\\%u043b\\%u0438\\>", "examples": "\\%u0421\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u0458\\%u0438\\>\\|\\%u041f\\%u0440\\%u0438\\%u043c\\%u0435\\%u0440\\%u0438\\>", "feature": "\\%u0424\\%u0443\\%u043d\\%u043a\\%u0446\\%u0438\\%u043e\\%u043d\\%u0430\\%u043b\\%u043d\\%u043e\\%u0441\\%u0442\\>\\|\\%u041c\\%u043e\\%u0433\\%u0443\\%u045b\\%u043d\\%u043e\\%u0441\\%u0442\\>\\|\\%u041e\\%u0441\\%u043e\\%u0431\\%u0438\\%u043d\\%u0430\\>", "given": "\\%u0417\\%u0430\\%u0434\\%u0430\\%u0442\\%u043e\\>\\|\\%u0417\\%u0430\\%u0434\\%u0430\\%u0442\\%u0435\\>\\|\\%u0417\\%u0430\\%u0434\\%u0430\\%u0442\\%u0438\\>", "scenario": "\\%u0421\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u043e\\>\\|\\%u041f\\%u0440\\%u0438\\%u043c\\%u0435\\%u0440\\>", "scenario_outline": "\\%u0421\\%u0442\\%u0440\\%u0443\\%u043a\\%u0442\\%u0443\\%u0440\\%u0430 \\%u0441\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u0458\\%u0430\\>\\|\\%u041a\\%u043e\\%u043d\\%u0446\\%u0435\\%u043f\\%u0442\\>\\|\\%u0421\\%u043a\\%u0438\\%u0446\\%u0430\\>", "then": "\\%u041e\\%u043d\\%u0434\\%u0430\\>", "when": "\\%u041a\\%u0430\\%u0434\\%u0430\\>\\|\\%u041a\\%u0430\\%u0434\\>"},
+ \"sr-Latn": {"and": "I\\>", "background": "Kontekst\\>\\|Pozadina\\>\\|Osnova\\>", "but": "Ali\\>", "examples": "Scenariji\\>\\|Primeri\\>", "feature": "Mogu\\%u0107nost\\>\\|Funkcionalnost\\>\\|Mogucnost\\>\\|Osobina\\>", "given": "Zadato\\>\\|Zadate\\>\\|Zatati\\>", "scenario": "Scenario\\>\\|Primer\\>", "scenario_outline": "Struktura scenarija\\>\\|Koncept\\>\\|Skica\\>", "then": "Onda\\>", "when": "Kada\\>\\|Kad\\>"},
+ \"sv": {"and": "Och\\>", "background": "Bakgrund\\>", "but": "Men\\>", "examples": "Exempel\\>", "feature": "Egenskap\\>", "given": "Givet\\>", "scenario": "Scenario\\>", "scenario_outline": "Abstrakt Scenario\\>\\|Scenariomall\\>", "then": "S\\%u00e5\\>", "when": "N\\%u00e4r\\>"},
+ \"th": {"and": "\\%u0e41\\%u0e25\\%u0e30\\>", "background": "\\%u0e41\\%u0e19\\%u0e27\\%u0e04\\%u0e34\\%u0e14\\>", "but": "\\%u0e41\\%u0e15\\%u0e48\\>", "examples": "\\%u0e0a\\%u0e38\\%u0e14\\%u0e02\\%u0e2d\\%u0e07\\%u0e40\\%u0e2b\\%u0e15\\%u0e38\\%u0e01\\%u0e32\\%u0e23\\%u0e13\\%u0e4c\\>\\|\\%u0e0a\\%u0e38\\%u0e14\\%u0e02\\%u0e2d\\%u0e07\\%u0e15\\%u0e31\\%u0e27\\%u0e2d\\%u0e22\\%u0e48\\%u0e32\\%u0e07\\>", "feature": "\\%u0e04\\%u0e27\\%u0e32\\%u0e21\\%u0e15\\%u0e49\\%u0e2d\\%u0e07\\%u0e01\\%u0e32\\%u0e23\\%u0e17\\%u0e32\\%u0e07\\%u0e18\\%u0e38\\%u0e23\\%u0e01\\%u0e34\\%u0e08\\>\\|\\%u0e04\\%u0e27\\%u0e32\\%u0e21\\%u0e2a\\%u0e32\\%u0e21\\%u0e32\\%u0e23\\%u0e16\\>\\|\\%u0e42\\%u0e04\\%u0e23\\%u0e07\\%u0e2b\\%u0e25\\%u0e31\\%u0e01\\>", "given": "\\%u0e01\\%u0e33\\%u0e2b\\%u0e19\\%u0e14\\%u0e43\\%u0e2b\\%u0e49\\>", "scenario": "\\%u0e40\\%u0e2b\\%u0e15\\%u0e38\\%u0e01\\%u0e32\\%u0e23\\%u0e13\\%u0e4c\\>", "scenario_outline": "\\%u0e42\\%u0e04\\%u0e23\\%u0e07\\%u0e2a\\%u0e23\\%u0e49\\%u0e32\\%u0e07\\%u0e02\\%u0e2d\\%u0e07\\%u0e40\\%u0e2b\\%u0e15\\%u0e38\\%u0e01\\%u0e32\\%u0e23\\%u0e13\\%u0e4c\\>\\|\\%u0e2a\\%u0e23\\%u0e38\\%u0e1b\\%u0e40\\%u0e2b\\%u0e15\\%u0e38\\%u0e01\\%u0e32\\%u0e23\\%u0e13\\%u0e4c\\>", "then": "\\%u0e14\\%u0e31\\%u0e07\\%u0e19\\%u0e31\\%u0e49\\%u0e19\\>", "when": "\\%u0e40\\%u0e21\\%u0e37\\%u0e48\\%u0e2d\\>"},
+ \"tl": {"and": "\\%u0c2e\\%u0c30\\%u0c3f\\%u0c2f\\%u0c41\\>", "background": "\\%u0c28\\%u0c47\\%u0c2a\\%u0c25\\%u0c4d\\%u0c2f\\%u0c02\\>", "but": "\\%u0c15\\%u0c3e\\%u0c28\\%u0c3f\\>", "examples": "\\%u0c09\\%u0c26\\%u0c3e\\%u0c39\\%u0c30\\%u0c23\\%u0c32\\%u0c41\\>", "feature": "\\%u0c17\\%u0c41\\%u0c23\\%u0c2e\\%u0c41\\>", "given": "\\%u0c1a\\%u0c46\\%u0c2a\\%u0c4d\\%u0c2a\\%u0c2c\\%u0c21\\%u0c3f\\%u0c28\\%u0c26\\%u0c3f\\>", "scenario": "\\%u0c38\\%u0c28\\%u0c4d\\%u0c28\\%u0c3f\\%u0c35\\%u0c47\\%u0c36\\%u0c02\\>", "scenario_outline": "\\%u0c15\\%u0c25\\%u0c28\\%u0c02\\>", "then": "\\%u0c05\\%u0c2a\\%u0c4d\\%u0c2a\\%u0c41\\%u0c21\\%u0c41\\>", "when": "\\%u0c08 \\%u0c2a\\%u0c30\\%u0c3f\\%u0c38\\%u0c4d\\%u0c25\\%u0c3f\\%u0c24\\%u0c3f\\%u0c32\\%u0c4b\\>"},
+ \"tr": {"and": "Ve\\>", "background": "Ge\\%u00e7mi\\%u015f\\>", "but": "Fakat\\>\\|Ama\\>", "examples": "\\%u00d6rnekler\\>", "feature": "\\%u00d6zellik\\>", "given": "Diyelim ki\\>", "scenario": "Senaryo\\>", "scenario_outline": "Senaryo tasla\\%u011f\\%u0131\\>", "then": "O zaman\\>", "when": "E\\%u011fer ki\\>"},
+ \"tt": {"and": "\\%u04ba\\%u04d9\\%u043c\\>\\|\\%u0412\\%u04d9\\>", "background": "\\%u041a\\%u0435\\%u0440\\%u0435\\%u0448\\>", "but": "\\%u041b\\%u04d9\\%u043a\\%u0438\\%u043d\\>\\|\\%u04d8\\%u043c\\%u043c\\%u0430\\>", "examples": "\\%u04ae\\%u0440\\%u043d\\%u04d9\\%u043a\\%u043b\\%u04d9\\%u0440\\>\\|\\%u041c\\%u0438\\%u0441\\%u0430\\%u043b\\%u043b\\%u0430\\%u0440\\>", "feature": "\\%u04ae\\%u0437\\%u0435\\%u043d\\%u0447\\%u04d9\\%u043b\\%u0435\\%u043a\\%u043b\\%u0435\\%u043b\\%u0435\\%u043a\\>\\|\\%u041c\\%u04e9\\%u043c\\%u043a\\%u0438\\%u043d\\%u043b\\%u0435\\%u043a\\>", "given": "\\%u04d8\\%u0439\\%u0442\\%u0438\\%u043a\\>", "scenario": "\\%u0421\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u0439\\>", "scenario_outline": "\\%u0421\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u0439\\%u043d\\%u044b\\%u04a3 \\%u0442\\%u04e9\\%u0437\\%u0435\\%u043b\\%u0435\\%u0448\\%u0435\\>", "then": "\\%u041d\\%u04d9\\%u0442\\%u0438\\%u0497\\%u04d9\\%u0434\\%u04d9\\>", "when": "\\%u04d8\\%u0433\\%u04d9\\%u0440\\>"},
+ \"uk": {"and": "\\%u0410 \\%u0442\\%u0430\\%u043a\\%u043e\\%u0436\\>\\|\\%u0422\\%u0430\\>\\|\\%u0406\\>", "background": "\\%u041f\\%u0435\\%u0440\\%u0435\\%u0434\\%u0443\\%u043c\\%u043e\\%u0432\\%u0430\\>", "but": "\\%u0410\\%u043b\\%u0435\\>", "examples": "\\%u041f\\%u0440\\%u0438\\%u043a\\%u043b\\%u0430\\%u0434\\%u0438\\>", "feature": "\\%u0424\\%u0443\\%u043d\\%u043a\\%u0446\\%u0456\\%u043e\\%u043d\\%u0430\\%u043b\\>", "given": "\\%u041f\\%u0440\\%u0438\\%u043f\\%u0443\\%u0441\\%u0442\\%u0438\\%u043c\\%u043e, \\%u0449\\%u043e\\>\\|\\%u041f\\%u0440\\%u0438\\%u043f\\%u0443\\%u0441\\%u0442\\%u0438\\%u043c\\%u043e\\>\\|\\%u041d\\%u0435\\%u0445\\%u0430\\%u0439\\>\\|\\%u0414\\%u0430\\%u043d\\%u043e\\>", "scenario": "\\%u0421\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0456\\%u0439\\>", "scenario_outline": "\\%u0421\\%u0442\\%u0440\\%u0443\\%u043a\\%u0442\\%u0443\\%u0440\\%u0430 \\%u0441\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0456\\%u044e\\>", "then": "\\%u0422\\%u043e\\%u0434\\%u0456\\>\\|\\%u0422\\%u043e\\>", "when": "\\%u042f\\%u043a\\%u0449\\%u043e\\>\\|\\%u041a\\%u043e\\%u043b\\%u0438\\>"},
+ \"uz": {"and": "\\%u0412\\%u0430\\>", "background": "\\%u0422\\%u0430\\%u0440\\%u0438\\%u0445\\>", "but": "\\%u041b\\%u0435\\%u043a\\%u0438\\%u043d\\>\\|\\%u0411\\%u0438\\%u0440\\%u043e\\%u043a\\>\\|\\%u0410\\%u043c\\%u043c\\%u043e\\>", "examples": "\\%u041c\\%u0438\\%u0441\\%u043e\\%u043b\\%u043b\\%u0430\\%u0440\\>", "feature": "\\%u0424\\%u0443\\%u043d\\%u043a\\%u0446\\%u0438\\%u043e\\%u043d\\%u0430\\%u043b\\>", "given": "\\%u0410\\%u0433\\%u0430\\%u0440\\>", "scenario": "\\%u0421\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u0439\\>", "scenario_outline": "\\%u0421\\%u0446\\%u0435\\%u043d\\%u0430\\%u0440\\%u0438\\%u0439 \\%u0441\\%u0442\\%u0440\\%u0443\\%u043a\\%u0442\\%u0443\\%u0440\\%u0430\\%u0441\\%u0438\\>", "then": "\\%u0423\\%u043d\\%u0434\\%u0430\\>", "when": "\\%u0410\\%u0433\\%u0430\\%u0440\\>"},
+ \"vi": {"and": "V\\%u00e0\\>", "background": "B\\%u1ed1i c\\%u1ea3nh\\>", "but": "Nh\\%u01b0ng\\>", "examples": "D\\%u1eef li\\%u1ec7u\\>", "feature": "T\\%u00ednh n\\%u0103ng\\>", "given": "Bi\\%u1ebft\\>\\|Cho\\>", "scenario": "T\\%u00ecnh hu\\%u1ed1ng\\>\\|K\\%u1ecbch b\\%u1ea3n\\>", "scenario_outline": "Khung t\\%u00ecnh hu\\%u1ed1ng\\>\\|Khung k\\%u1ecbch b\\%u1ea3n\\>", "then": "Th\\%u00ec\\>", "when": "Khi\\>"},
+ \"zh-CN": {"and": "\\%u800c\\%u4e14\\|\\%u5e76\\%u4e14\\|\\%u540c\\%u65f6", "background": "\\%u80cc\\%u666f\\>", "but": "\\%u4f46\\%u662f", "examples": "\\%u4f8b\\%u5b50\\>", "feature": "\\%u529f\\%u80fd\\>", "given": "\\%u5047\\%u5982\\|\\%u5047\\%u8bbe\\|\\%u5047\\%u5b9a", "scenario": "\\%u573a\\%u666f\\>\\|\\%u5267\\%u672c\\>", "scenario_outline": "\\%u573a\\%u666f\\%u5927\\%u7eb2\\>\\|\\%u5267\\%u672c\\%u5927\\%u7eb2\\>", "then": "\\%u90a3\\%u4e48", "when": "\\%u5f53"},
+ \"zh-TW": {"and": "\\%u800c\\%u4e14\\|\\%u4e26\\%u4e14\\|\\%u540c\\%u6642", "background": "\\%u80cc\\%u666f\\>", "but": "\\%u4f46\\%u662f", "examples": "\\%u4f8b\\%u5b50\\>", "feature": "\\%u529f\\%u80fd\\>", "given": "\\%u5047\\%u5982\\|\\%u5047\\%u8a2d\\|\\%u5047\\%u5b9a", "scenario": "\\%u5834\\%u666f\\>\\|\\%u5287\\%u672c\\>", "scenario_outline": "\\%u5834\\%u666f\\%u5927\\%u7db1\\>\\|\\%u5287\\%u672c\\%u5927\\%u7db1\\>", "then": "\\%u90a3\\%u9ebc", "when": "\\%u7576"}}
+
+function! s:pattern(key)
+ let language = matchstr(getline(1),'#\s*language:\s*\zs\S\+')
+ if &fileencoding == 'latin1' && language == ''
+ let language = 'en'
+ endif
+ if has_key(g:cucumber_languages, language)
+ let languages = [g:cucumber_languages[language]]
+ else
+ let languages = values(g:cucumber_languages)
+ end
+ return '\<\%('.join(map(languages,'get(v:val,a:key,"\\%(a\\&b\\)")'),'\|').'\)'
+endfunction
+
+function! s:Add(name)
+ let next = " skipempty skipwhite nextgroup=".join(map(["Region","AndRegion","ButRegion","Comment","String","Table"],'"cucumber".a:name.v:val'),",")
+ exe "syn region cucumber".a:name.'Region matchgroup=cucumber'.a:name.' start="\%(^\s*\)\@<=\%('.s:pattern(tolower(a:name)).'\)" end="$"'.next
+ exe 'syn region cucumber'.a:name.'AndRegion matchgroup=cucumber'.a:name.'And start="\%(^\s*\)\@<='.s:pattern('and').'" end="$" contained'.next
+ exe 'syn region cucumber'.a:name.'ButRegion matchgroup=cucumber'.a:name.'But start="\%(^\s*\)\@<='.s:pattern('but').'" end="$" contained'.next
+ exe 'syn match cucumber'.a:name.'Comment "\%(^\s*\)\@<=#.*" contained'.next
+ exe 'syn region cucumber'.a:name.'String start=+\%(^\s*\)\@<="""+ end=+"""+ contained'.next
+ exe 'syn match cucumber'.a:name.'Table "\%(^\s*\)\@<=|.*" contained contains=cucumberDelimiter'.next
+ exe 'hi def link cucumber'.a:name.'Comment cucumberComment'
+ exe 'hi def link cucumber'.a:name.'String cucumberString'
+ exe 'hi def link cucumber'.a:name.'But cucumber'.a:name.'And'
+ exe 'hi def link cucumber'.a:name.'And cucumber'.a:name
+ exe 'syn cluster cucumberStepRegions add=cucumber'.a:name.'Region,cucumber'.a:name.'AndRegion,cucumber'.a:name.'ButRegion'
+endfunction
+
+syn match cucumberComment "\%(^\s*\)\@<=#.*"
+syn match cucumberComment "\%(\%^\s*\)\@<=#.*" contains=cucumberLanguage
+syn match cucumberLanguage "\%(#\s*\)\@<=language:" contained
+syn match cucumberUnparsed "\S.*" nextgroup=cucumberUnparsedComment,cucumberUnparsed,cucumberTags,cucumberBackground,cucumberScenario,cucumberScenarioOutline,cucumberExamples skipwhite skipempty contained
+syn match cucumberUnparsedComment "#.*" nextgroup=cucumberUnparsedComment,cucumberUnparsed,cucumberTags,cucumberBackground,cucumberScenario,cucumberScenarioOutline,cucumberExamples skipwhite skipempty contained
+
+exe 'syn match cucumberFeature "\%(^\s*\)\@<='.s:pattern('feature').':" nextgroup=cucumberUnparsedComment,cucumberUnparsed,cucumberBackground,cucumberScenario,cucumberScenarioOutline,cucumberExamples skipwhite skipempty'
+exe 'syn match cucumberBackground "\%(^\s*\)\@<='.s:pattern('background').':"'
+exe 'syn match cucumberScenario "\%(^\s*\)\@<='.s:pattern('scenario').':"'
+exe 'syn match cucumberScenarioOutline "\%(^\s*\)\@<='.s:pattern('scenario_outline').':"'
+exe 'syn match cucumberExamples "\%(^\s*\)\@<='.s:pattern('examples').':" nextgroup=cucumberExampleTable skipempty skipwhite'
+
+syn match cucumberPlaceholder "<[^<>]*>" contained containedin=@cucumberStepRegions
+syn match cucumberExampleTable "\%(^\s*\)\@<=|.*" contains=cucumberDelimiter
+syn match cucumberDelimiter "\\\@<!\%(\\\\\)*\zs|" contained
+syn match cucumberTags "\%(^\s*\)\@<=\%(@[^@[:space:]]\+\s\+\)*@[^@[:space:]]\+\s*$" contains=@NoSpell
+
+call s:Add('Then')
+call s:Add('When')
+call s:Add('Given')
+
+hi def link cucumberUnparsedComment cucumberComment
+hi def link cucumberComment Comment
+hi def link cucumberLanguage SpecialComment
+hi def link cucumberFeature Macro
+hi def link cucumberBackground Define
+hi def link cucumberScenario Define
+hi def link cucumberScenarioOutline Define
+hi def link cucumberExamples Define
+hi def link cucumberPlaceholder Constant
+hi def link cucumberDelimiter Delimiter
+hi def link cucumberTags Tag
+hi def link cucumberString String
+hi def link cucumberGiven Conditional
+hi def link cucumberWhen Function
+hi def link cucumberThen Type
+
+let b:current_syntax = "cucumber"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:set sts=2 sw=2:
diff --git a/runtime/syntax/cuda.vim b/runtime/syntax/cuda.vim
new file mode 100644
index 0000000..13d70e3
--- /dev/null
+++ b/runtime/syntax/cuda.vim
@@ -0,0 +1,65 @@
+" Vim syntax file
+" Language: CUDA (NVIDIA Compute Unified Device Architecture)
+" Maintainer: Timothy B. Terriberry <tterribe@users.sourceforge.net>
+" Last Change: 2018 Feb 06
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the C++ syntax to start with
+runtime! syntax/cpp.vim
+
+" CUDA extentions
+syn keyword cudaStorageClass __device__ __global__ __host__
+syn keyword cudaStorageClass __constant__ __shared__
+syn keyword cudaStorageClass __inline__ __align__ __thread__
+"syn keyword cudaStorageClass __import__ __export__ __location__
+syn keyword cudaStructure template
+syn keyword cudaType char1 char2 char3 char4
+syn keyword cudaType uchar1 uchar2 uchar3 uchar4
+syn keyword cudaType short1 short2 short3 short4
+syn keyword cudaType ushort1 ushort2 ushort3 ushort4
+syn keyword cudaType int1 int2 int3 int4
+syn keyword cudaType uint1 uint2 uint3 uint4
+syn keyword cudaType long1 long2 long3 long4
+syn keyword cudaType ulong1 ulong2 ulong3 ulong4
+syn keyword cudaType float1 float2 float3 float4
+syn keyword cudaType ufloat1 ufloat2 ufloat3 ufloat4
+syn keyword cudaType dim3 texture textureReference
+syn keyword cudaType cudaError_t cudaDeviceProp cudaMemcpyKind
+syn keyword cudaType cudaArray cudaChannelFormatKind
+syn keyword cudaType cudaChannelFormatDesc cudaTextureAddressMode
+syn keyword cudaType cudaTextureFilterMode cudaTextureReadMode
+syn keyword cudaVariable gridDim blockIdx blockDim threadIdx
+syn keyword cudaConstant __DEVICE_EMULATION__
+syn keyword cudaConstant cudaSuccess
+" Many more errors are defined, but only these are listed in the maunal
+syn keyword cudaConstant cudaErrorMemoryAllocation
+syn keyword cudaConstant cudaErrorInvalidDevicePointer
+syn keyword cudaConstant cudaErrorInvalidSymbol
+syn keyword cudaConstant cudaErrorMixedDeviceExecution
+syn keyword cudaConstant cudaMemcpyHostToHost
+syn keyword cudaConstant cudaMemcpyHostToDevice
+syn keyword cudaConstant cudaMemcpyDeviceToHost
+syn keyword cudaConstant cudaMemcpyDeviceToDevice
+syn keyword cudaConstant cudaReadModeElementType
+syn keyword cudaConstant cudaReadModeNormalizedFloat
+syn keyword cudaConstant cudaFilterModePoint
+syn keyword cudaConstant cudaFilterModeLinear
+syn keyword cudaConstant cudaAddressModeClamp
+syn keyword cudaConstant cudaAddressModeWrap
+syn keyword cudaConstant cudaChannelFormatKindSigned
+syn keyword cudaConstant cudaChannelFormatKindUnsigned
+syn keyword cudaConstant cudaChannelFormatKindFloat
+
+hi def link cudaStorageClass StorageClass
+hi def link cudaStructure Structure
+hi def link cudaType Type
+hi def link cudaVariable Identifier
+hi def link cudaConstant Constant
+
+let b:current_syntax = "cuda"
+
+" vim: ts=8
diff --git a/runtime/syntax/cupl.vim b/runtime/syntax/cupl.vim
new file mode 100644
index 0000000..54495f8
--- /dev/null
+++ b/runtime/syntax/cupl.vim
@@ -0,0 +1,124 @@
+" Vim syntax file
+" Language: CUPL
+" Maintainer: John Cook <johncook3@gmail.com>
+" Last Change: 2011 Dec 27
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" this language is oblivious to case.
+syn case ignore
+
+" A bunch of keywords
+syn keyword cuplHeader name partno date revision rev designer company nextgroup=cuplHeaderContents
+syn keyword cuplHeader assembly assy location device nextgroup=cuplHeaderContents
+
+syn keyword cuplTodo contained TODO XXX FIXME
+
+" cuplHeaderContents uses default highlighting except for numbers
+syn match cuplHeaderContents ".\+;"me=e-1 contains=cuplNumber contained
+
+" String constants
+syn region cuplString start=+'+ end=+'+
+syn region cuplString start=+"+ end=+"+
+
+syn keyword cuplStatement append condition
+syn keyword cuplStatement default else
+syn keyword cuplStatement field fld format function fuse
+syn keyword cuplStatement group if jump loc
+syn keyword cuplStatement macro min node out
+syn keyword cuplStatement pin pinnode present table
+syn keyword cuplStatement sequence sequenced sequencejk sequencers sequencet
+
+syn keyword cuplFunction log2 log8 log16 log
+
+" Valid integer number formats (decimal, binary, octal, hex)
+syn match cuplNumber "\<[-+]\=[0-9]\+\>"
+syn match cuplNumber "'d'[0-9]\+\>"
+syn match cuplNumber "'b'[01x]\+\>"
+syn match cuplNumber "'o'[0-7x]\+\>"
+syn match cuplNumber "'h'[0-9a-fx]\+\>"
+
+" operators
+syn match cuplLogicalOperator "[!#&$]"
+syn match cuplArithmeticOperator "[-+*/%]"
+syn match cuplArithmeticOperator "\*\*"
+syn match cuplAssignmentOperator ":\=="
+syn match cuplEqualityOperator ":"
+syn match cuplTruthTableOperator "=>"
+
+" Signal extensions
+syn match cuplExtension "\.[as][pr]\>"
+syn match cuplExtension "\.oe\>"
+syn match cuplExtension "\.oemux\>"
+syn match cuplExtension "\.[dlsrjk]\>"
+syn match cuplExtension "\.ck\>"
+syn match cuplExtension "\.dq\>"
+syn match cuplExtension "\.ckmux\>"
+syn match cuplExtension "\.tec\>"
+syn match cuplExtension "\.cnt\>"
+
+syn match cuplRangeOperator "\.\." contained
+
+" match ranges like memadr:[0000..1FFF]
+" and highlight both the numbers and the .. operator
+syn match cuplNumberRange "\<\x\+\.\.\x\+\>" contains=cuplRangeOperator
+
+" match vectors of type [name3..0] (decimal numbers only)
+" but assign them no special highlighting except for the .. operator
+syn match cuplBitVector "\<\a\+\d\+\.\.\d\+\>" contains=cuplRangeOperator
+
+" other special characters
+syn match cuplSpecialChar "[\[\](){},;]"
+
+" directives
+" (define these after cuplOperator so $xxx overrides $)
+syn match cuplDirective "\$msg"
+syn match cuplDirective "\$macro"
+syn match cuplDirective "\$mend"
+syn match cuplDirective "\$repeat"
+syn match cuplDirective "\$repend"
+syn match cuplDirective "\$define"
+syn match cuplDirective "\$include"
+
+" multi-line comments
+syn region cuplComment start=+/\*+ end=+\*/+ contains=cuplNumber,cuplTodo
+
+syn sync minlines=1
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:ts=8
diff --git a/runtime/syntax/cuplsim.vim b/runtime/syntax/cuplsim.vim
new file mode 100644
index 0000000..36eb4c3
--- /dev/null
+++ b/runtime/syntax/cuplsim.vim
@@ -0,0 +1,63 @@
+" Vim syntax file
+" Language: CUPL simulation
+" Maintainer: John Cook <john.cook@kla-tencor.com>
+" Last Change: 2001 Apr 25
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the CUPL syntax to start with
+runtime! syntax/cupl.vim
+unlet b:current_syntax
+
+" omit definition-specific stuff
+syn clear cuplStatement
+syn clear cuplFunction
+syn clear cuplLogicalOperator
+syn clear cuplArithmeticOperator
+syn clear cuplAssignmentOperator
+syn clear cuplEqualityOperator
+syn clear cuplTruthTableOperator
+syn clear cuplExtension
+
+" simulation order statement
+syn match cuplsimOrder "order:" nextgroup=cuplsimOrderSpec skipempty
+syn region cuplsimOrderSpec start="." end=";"me=e-1 contains=cuplComment,cuplsimOrderFormat,cuplBitVector,cuplSpecialChar,cuplLogicalOperator,cuplCommaOperator contained
+
+" simulation base statement
+syn match cuplsimBase "base:" nextgroup=cuplsimBaseSpec skipempty
+syn region cuplsimBaseSpec start="." end=";"me=e-1 contains=cuplComment,cuplsimBaseType contained
+syn keyword cuplsimBaseType octal decimal hex contained
+
+" simulation vectors statement
+syn match cuplsimVectors "vectors:"
+
+" simulator format control
+syn match cuplsimOrderFormat "%\d\+\>" contained
+
+" simulator control
+syn match cuplsimStimulus "[10ckpx]\+"
+syn match cuplsimStimulus +'\(\x\|x\)\+'+
+syn match cuplsimOutput "[lhznx*]\+"
+syn match cuplsimOutput +"\x\+"+
+
+syn sync minlines=1
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "cuplsim"
+" vim:ts=8
diff --git a/runtime/syntax/cvs.vim b/runtime/syntax/cvs.vim
new file mode 100644
index 0000000..e1e413f
--- /dev/null
+++ b/runtime/syntax/cvs.vim
@@ -0,0 +1,29 @@
+" Vim syntax file
+" Language: CVS commit file
+" Maintainer: Matt Dunford (zenmatic@gmail.com)
+" Last Change: Sat Nov 24 23:25:11 CET 2001
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn region cvsLine start="^CVS: " end="$" contains=cvsFile,cvsCom,cvsFiles,cvsTag
+syn match cvsFile contained " \t\(\(\S\+\) \)\+"
+syn match cvsTag contained " Tag:"
+syn match cvsFiles contained "\(Added\|Modified\|Removed\) Files:"
+syn region cvsCom start="Committing in" end="$" contains=cvsDir contained extend keepend
+syn match cvsDir contained "\S\+$"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "cvs"
diff --git a/runtime/syntax/cvsrc.vim b/runtime/syntax/cvsrc.vim
new file mode 100644
index 0000000..9522de6
--- /dev/null
+++ b/runtime/syntax/cvsrc.vim
@@ -0,0 +1,39 @@
+" Vim syntax file
+" Language: cvs(1) RC file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn region cvsrcString display oneline start=+"+ skip=+\\\\\|\\\\"+ end=+"+
+syn region cvsrcString display oneline start=+'+ skip=+\\\\\|\\\\'+ end=+'+
+
+syn match cvsrcNumber display '\<\d\+\>'
+
+syn match cvsrcBegin display '^' nextgroup=cvsrcCommand skipwhite
+
+syn region cvsrcCommand contained transparent matchgroup=cvsrcCommand
+ \ start='add\|admin\|checkout\|commit\|cvs\|diff'
+ \ start='export\|history\|import\|init\|log'
+ \ start='rdiff\|release\|remove\|rtag\|status\|tag'
+ \ start='update'
+ \ end='$'
+ \ contains=cvsrcOption,cvsrcString,cvsrcNumber
+ \ keepend
+
+syn match cvsrcOption contained display '-\a\+'
+
+hi def link cvsrcString String
+hi def link cvsrcNumber Number
+hi def link cvsrcCommand Keyword
+hi def link cvsrcOption Identifier
+
+let b:current_syntax = "cvsrc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/cweb.vim b/runtime/syntax/cweb.vim
new file mode 100644
index 0000000..4e06b36
--- /dev/null
+++ b/runtime/syntax/cweb.vim
@@ -0,0 +1,68 @@
+" Vim syntax file
+" Language: CWEB
+" Maintainer: Andreas Scherer <andreas.scherer@pobox.com>
+" Last Change: 2011 Dec 25 by Thilo Six
+
+" Details of the CWEB language can be found in the article by Donald E. Knuth
+" and Silvio Levy, "The CWEB System of Structured Documentation", included as
+" file "cwebman.tex" in the standard CWEB distribution, available for
+" anonymous ftp at ftp://labrea.stanford.edu/pub/cweb/.
+
+" TODO: Section names and C/C++ comments should be treated as TeX material.
+" TODO: The current version switches syntax highlighting off for section
+" 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.)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" For starters, read the TeX syntax; TeX syntax items are allowed at the top
+" 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.
+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.
+syntax include @webIncludedC <sfile>:p:h/cpp.vim
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Inner C/C++ context (ICC) should be quite simple as it's comprised of
+" material in "|...|"; however the naive definition for this region would
+" hickup at the innocious "\|" TeX macro. Note: For the time being we expect
+" that an ICC begins either at the start of a line or after some white space.
+syntax region webInnerCcontext start="\(^\|[ \t\~`(]\)|" end="|" contains=@webIncludedC,webSectionName,webRestrictedTeX,webIgnoredStuff
+
+" Genuine C/C++ material. This syntactic region covers both the definition
+" part and the C/C++ part of a CWEB section; it is ended by the TeX part of
+" the next section.
+syntax region webCpart start="@[dfscp<(]" end="@[ \*]" contains=@webIncludedC,webSectionName,webRestrictedTeX,webIgnoredStuff
+
+" Section names contain C/C++ material only in inner context.
+syntax region webSectionName start="@[<(]" end="@>" contains=webInnerCcontext contained
+
+" The contents of "control texts" is not treated as TeX material, because in
+" non-trivial cases this completely clobbers the syntax recognition. Instead,
+" we highlight these elements as "strings".
+syntax region webRestrictedTeX start="@[\^\.:t=q]" end="@>" oneline
+
+" Double-@ means single-@, anywhere in the CWEB source. (This allows e-mail
+" address <someone@@fsf.org> without going into C/C++ mode.)
+syntax match webIgnoredStuff "@@"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link webRestrictedTeX String
+
+
+let b:current_syntax = "cweb"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/cynlib.vim b/runtime/syntax/cynlib.vim
new file mode 100644
index 0000000..24ad2a2
--- /dev/null
+++ b/runtime/syntax/cynlib.vim
@@ -0,0 +1,74 @@
+" Vim syntax file
+" Language: Cynlib(C++)
+" Maintainer: Phil Derrick <phild@forteds.com>
+" Last change: 2001 Sep 02
+" URL http://www.derrickp.freeserve.co.uk/vim/syntax/cynlib.vim
+"
+" Language Information
+"
+" Cynlib is a library of C++ classes to allow hardware
+" modelling in C++. Combined with a simulation kernel,
+" the compiled and linked executable forms a hardware
+" simulation of the described design.
+"
+" Further information can be found from www.forteds.com
+
+
+" Remove any old syntax stuff hanging around
+" 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
+runtime! syntax/cpp.vim
+unlet b:current_syntax
+
+" Cynlib extensions
+
+syn keyword cynlibMacro Default CYNSCON
+syn keyword cynlibMacro Case CaseX EndCaseX
+syn keyword cynlibType CynData CynSignedData CynTime
+syn keyword cynlibType In Out InST OutST
+syn keyword cynlibType Struct
+syn keyword cynlibType Int Uint Const
+syn keyword cynlibType Long Ulong
+syn keyword cynlibType OneHot
+syn keyword cynlibType CynClock Cynclock0
+syn keyword cynlibFunction time configure my_name
+syn keyword cynlibFunction CynModule epilog execute_on
+syn keyword cynlibFunction my_name
+syn keyword cynlibFunction CynBind bind
+syn keyword cynlibFunction CynWait CynEvent
+syn keyword cynlibFunction CynSetName
+syn keyword cynlibFunction CynTick CynRun
+syn keyword cynlibFunction CynFinish
+syn keyword cynlibFunction Cynprintf CynSimTime
+syn keyword cynlibFunction CynVcdFile
+syn keyword cynlibFunction CynVcdAdd CynVcdRemove
+syn keyword cynlibFunction CynVcdOn CynVcdOff
+syn keyword cynlibFunction CynVcdScale
+syn keyword cynlibFunction CynBgnName CynEndName
+syn keyword cynlibFunction CynClock configure time
+syn keyword cynlibFunction CynRedAnd CynRedNand
+syn keyword cynlibFunction CynRedOr CynRedNor
+syn keyword cynlibFunction CynRedXor CynRedXnor
+syn keyword cynlibFunction CynVerify
+
+
+syn match cynlibOperator "<<="
+syn keyword cynlibType In Out InST OutST Int Uint Const Cynclock
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "cynlib"
diff --git a/runtime/syntax/cynpp.vim b/runtime/syntax/cynpp.vim
new file mode 100644
index 0000000..3064b11
--- /dev/null
+++ b/runtime/syntax/cynpp.vim
@@ -0,0 +1,50 @@
+" Vim syntax file
+" Language: Cyn++
+" Maintainer: Phil Derrick <phild@forteds.com>
+" Last change: 2001 Sep 02
+"
+" Language Information
+"
+" Cynpp (Cyn++) is a macro language to ease coding in Cynlib.
+" Cynlib is a library of C++ classes to allow hardware
+" modelling in C++. Combined with a simulation kernel,
+" the compiled and linked executable forms a hardware
+" simulation of the described design.
+"
+" Cyn++ is designed to be HDL-like.
+"
+" Further information can be found from www.forteds.com
+
+
+
+
+
+" 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
+runtime! syntax/cynlib.vim
+unlet b:current_syntax
+
+
+
+" Cyn++ extensions
+
+syn keyword cynppMacro Always EndAlways
+syn keyword cynppMacro Module EndModule
+syn keyword cynppMacro Initial EndInitial
+syn keyword cynppMacro Posedge Negedge Changed
+syn keyword cynppMacro At
+syn keyword cynppMacro Thread EndThread
+syn keyword cynppMacro Instantiate
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link cLabel Label
+hi def link cynppMacro Statement
+
+
+let b:current_syntax = "cynpp"
diff --git a/runtime/syntax/d.vim b/runtime/syntax/d.vim
new file mode 100644
index 0000000..fdac98c
--- /dev/null
+++ b/runtime/syntax/d.vim
@@ -0,0 +1,573 @@
+" Vim syntax file for the D programming language (version 1.076 and 2.069).
+"
+" Language: D
+" Maintainer: Jesse Phillips <Jesse.K.Phillips+D@gmail.com>
+" Last Change: 2016 Feb 2
+" Version: 0.28
+"
+" Contributors:
+" - Jason Mills: original Maintainer
+" - Kirk McDonald
+" - Tim Keating
+" - Frank Benoit
+" - Shougo Matsushita
+" - Ellery Newcomer
+" - Steven N. Oliver
+" - Sohgo Takeuchi
+" - Robert Clipsham
+" - Petar Kirov
+"
+" Please submit bugs/comments/suggestions to the github repo:
+" https://github.com/JesseKPhillips/d.vim
+"
+" Options:
+" d_comment_strings - Set to highlight strings and numbers in comments.
+"
+" d_hl_operator_overload - Set to highlight D's specially named functions
+" that when overloaded implement unary and binary operators (e.g. opCmp).
+"
+" d_hl_object_types - Set to highlight some common types from object.di.
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Support cpoptions
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Set the current syntax to be known as d
+let b:current_syntax = "d"
+
+" Keyword definitions
+"
+syn keyword dExternal contained import module
+syn keyword dAssert assert
+syn keyword dConditional if else switch
+syn keyword dBranch goto break continue
+syn keyword dRepeat while for do foreach foreach_reverse
+syn keyword dBoolean true false
+syn keyword dConstant null
+syn keyword dConstant __FILE__ __LINE__ __EOF__ __VERSION__
+syn keyword dConstant __DATE__ __TIME__ __TIMESTAMP__ __VENDOR__
+syn keyword dConstant __MODULE__ __FUNCTION__ __PRETTY_FUNCTION__
+syn keyword dTypedef alias typedef
+syn keyword dStructure template interface class struct union
+syn keyword dEnum enum
+syn keyword dOperator new delete typeof typeid cast align is
+syn keyword dOperator this super
+if exists("d_hl_operator_overload")
+ syn keyword dOpOverload opNeg opCom opPostInc opPostDec opCast opAdd
+ syn keyword dOpOverload opSub opSub_r opMul opDiv opDiv_r opMod
+ syn keyword dOpOverload opMod_r opAnd opOr opXor opShl opShl_r opShr
+ syn keyword dOpOverload opShr_r opUShr opUShr_r opCat
+ syn keyword dOpOverload opCat_r opEquals opCmp
+ syn keyword dOpOverload opAssign opAddAssign opSubAssign opMulAssign
+ syn keyword dOpOverload opDivAssign opModAssign opAndAssign
+ syn keyword dOpOverload opOrAssign opXorAssign opShlAssign
+ syn keyword dOpOverload opShrAssign opUShrAssign opCatAssign
+ syn keyword dOpOverload opIndex opIndexAssign opIndexOpAssign
+ syn keyword dOpOverload opCall opSlice opSliceAssign opSliceOpAssign
+ syn keyword dOpOverload opPos opAdd_r opMul_r opAnd_r opOr_r opXor_r
+ syn keyword dOpOverload opIn opIn_r opPow opDispatch opStar opDot
+ syn keyword dOpOverload opApply opApplyReverse opDollar
+ syn keyword dOpOverload opUnary opIndexUnary opSliceUnary
+ syn keyword dOpOverload opBinary opBinaryRight
+endif
+
+syn keyword dType byte ubyte short ushort int uint long ulong cent ucent
+syn keyword dType void bool Object
+syn keyword dType float double real
+syn keyword dType ushort int uint long ulong float
+syn keyword dType char wchar dchar string wstring dstring
+syn keyword dType ireal ifloat idouble creal cfloat cdouble
+syn keyword dType size_t ptrdiff_t sizediff_t equals_t hash_t
+if exists("d_hl_object_types")
+ syn keyword dType Object Throwable AssociativeArray Error Exception
+ syn keyword dType Interface OffsetTypeInfo TypeInfo TypeInfo_Typedef
+ syn keyword dType TypeInfo_Enum TypeInfo_Pointer TypeInfo_Array
+ syn keyword dType TypeInfo_StaticArray TypeInfo_AssociativeArray
+ syn keyword dType TypeInfo_Function TypeInfo_Delegate TypeInfo_Class
+ syn keyword dType ClassInfo TypeInfo_Interface TypeInfo_Struct
+ syn keyword dType TypeInfo_Tuple TypeInfo_Const TypeInfo_Invariant
+ syn keyword dType TypeInfo_Shared TypeInfo_Inout MemberInfo
+ syn keyword dType MemberInfo_field MemberInfo_function ModuleInfo
+endif
+syn keyword dDebug deprecated unittest invariant
+syn keyword dExceptions throw try catch finally
+syn keyword dScopeDecl public protected private export package
+syn keyword dStatement debug return with
+syn keyword dStatement function delegate __ctfe mixin macro __simd
+syn keyword dStatement in out body
+syn keyword dStorageClass contained in out scope
+syn keyword dStorageClass inout ref lazy pure nothrow
+syn keyword dStorageClass auto static override final abstract volatile
+syn keyword dStorageClass __gshared __vector
+syn keyword dStorageClass synchronized shared immutable const lazy
+syn keyword dIdentifier _arguments _argptr __vptr __monitor
+syn keyword dIdentifier _ctor _dtor __argTypes __overloadset
+syn keyword dScopeIdentifier contained exit success failure
+syn keyword dTraitsIdentifier contained isAbstractClass isArithmetic
+syn keyword dTraitsIdentifier contained isAssociativeArray isFinalClass
+syn keyword dTraitsIdentifier contained isPOD isNested isFloating
+syn keyword dTraitsIdentifier contained isIntegral isScalar isStaticArray
+syn keyword dTraitsIdentifier contained isUnsigned isVirtualFunction
+syn keyword dTraitsIdentifier contained isVirtualMethod isAbstractFunction
+syn keyword dTraitsIdentifier contained isFinalFunction isStaticFunction
+syn keyword dTraitsIdentifier contained isOverrideFunction isTemplate
+syn keyword dTraitsIdentifier contained isRef isOut isLazy hasMember
+syn keyword dTraitsIdentifier contained identifier getAliasThis
+syn keyword dTraitsIdentifier contained getAttributes getFunctionAttributes getMember
+syn keyword dTraitsIdentifier contained getOverloads getPointerBitmap getProtection
+syn keyword dTraitsIdentifier contained getVirtualFunctions getVirtualIndex
+syn keyword dTraitsIdentifier contained getVirtualMethods getUnitTests
+syn keyword dTraitsIdentifier contained parent classInstanceSize allMembers
+syn keyword dTraitsIdentifier contained derivedMembers isSame compiles
+syn keyword dPragmaIdentifier contained inline lib mangle msg startaddress GNU_asm
+syn keyword dExternIdentifier contained C C++ D Windows Pascal System Objective-C
+syn keyword dAttribute contained safe trusted system
+syn keyword dAttribute contained property disable nogc
+syn keyword dVersionIdentifier contained DigitalMars GNU LDC SDC D_NET
+syn keyword dVersionIdentifier contained X86 X86_64 ARM PPC PPC64 IA64 MIPS MIPS64 Alpha
+syn keyword dVersionIdentifier contained SPARC SPARC64 S390 S390X HPPA HPPA64 SH SH64
+syn keyword dVersionIdentifier contained linux Posix OSX FreeBSD Windows Win32 Win64
+syn keyword dVersionIdentifier contained OpenBSD BSD Solaris AIX SkyOS SysV3 SysV4 Hurd
+syn keyword dVersionIdentifier contained Cygwin MinGW
+syn keyword dVersionIdentifier contained LittleEndian BigEndian
+syn keyword dVersionIdentifier contained D_InlineAsm_X86 D_InlineAsm_X86_64
+syn keyword dVersionIdentifier contained D_Version2 D_Coverage D_Ddoc D_LP64 D_PIC
+syn keyword dVersionIdentifier contained unittest assert none all
+
+syn cluster dComment contains=dNestedComment,dBlockComment,dLineComment
+
+" Highlight the sharpbang
+syn match dSharpBang "\%^#!.*" display
+
+" Attributes/annotations
+syn match dAnnotation "@[_$a-zA-Z][_$a-zA-Z0-9_]*\>" contains=dAttribute
+
+" Version Identifiers
+syn match dVersion "\<version\>"
+syn match dVersion "\<version\s*([_a-zA-Z][_a-zA-Z0-9]*\>"he=s+7 contains=dVersionIdentifier
+
+" Scope Identifiers
+syn match dStatement "\<scope\>"
+syn match dStatement "\<scope\s*([_a-zA-Z][_a-zA-Z0-9]*\>"he=s+5 contains=dScopeIdentifier
+
+" Traits Statement
+syn match dStatement "\<__traits\>"
+syn match dStatement "\<__traits\s*([_a-zA-Z][_a-zA-Z0-9]*\>"he=s+8 contains=dTraitsIdentifier
+
+" Pragma Statement
+syn match dPragma "\<pragma\>"
+syn match dPragma "\<pragma\s*([_a-zA-Z][_a-zA-Z0-9]*\>"he=s+6 contains=dPragmaIdentifier
+
+" Necessary to highlight C++ in extern modifiers.
+syn match dExternIdentifier "C\(++\)\?" contained
+
+" Extern Identifiers
+syn match dExternal "\<extern\>"
+syn match dExtern "\<extern\s*([_a-zA-Z][_a-zA-Z0-9\+]*\>"he=s+6 contains=dExternIdentifier
+
+" Make import a region to prevent highlighting keywords
+syn region dImport start="\<import\_s" end=";" contains=dExternal,@dComment
+
+" Make module a region to prevent highlighting keywords
+syn region dImport start="\<module\_s" end=";" contains=dExternal,@dComment
+
+" dTokens is used by the token string highlighting
+syn cluster dTokens contains=dExternal,dConditional,dBranch,dRepeat,dBoolean
+syn cluster dTokens add=dConstant,dTypedef,dStructure,dOperator,dOpOverload
+syn cluster dTokens add=dType,dDebug,dExceptions,dScopeDecl,dStatement
+syn cluster dTokens add=dStorageClass,dPragma,dAssert,dAnnotation,dEnum
+syn cluster dTokens add=dParenString,dBrackString,dAngleString,dCurlyString
+syn cluster dTokens add=dTokenString,dDelimString,dHereString
+
+" Create a match for parameter lists to identify storage class
+syn region paramlist start="(" end=")" contains=@dTokens
+
+" Labels
+"
+" We contain dScopeDecl so public: private: etc. are not highlighted like labels
+syn match dUserLabel "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=dLabel,dScopeDecl,dEnum
+syn keyword dLabel case default
+
+syn cluster dTokens add=dUserLabel,dLabel
+
+" Comments
+"
+syn match dCommentError display "\*/"
+syn match dNestedCommentError display "+/"
+
+syn keyword dTodo contained TODO FIXME TEMP REFACTOR REVIEW HACK BUG XXX
+syn match dCommentStar contained "^\s*\*[^/]"me=e-1
+syn match dCommentStar contained "^\s*\*$"
+syn match dCommentPlus contained "^\s*+[^/]"me=e-1
+syn match dCommentPlus contained "^\s*+$"
+if exists("d_comment_strings")
+ syn region dBlockCommentString contained start=+"+ end=+"+ end=+\*/+me=s-1,he=s-1 contains=dCommentStar,dUnicode,dEscSequence,@Spell
+ syn region dNestedCommentString contained start=+"+ end=+"+ end="+"me=s-1,he=s-1 contains=dCommentPlus,dUnicode,dEscSequence,@Spell
+ syn region dLineCommentString contained start=+"+ end=+$\|"+ contains=dUnicode,dEscSequence,@Spell
+endif
+
+syn region dBlockComment start="/\*" end="\*/" contains=dBlockCommentString,dTodo,dCommentStartError,@Spell fold
+syn region dNestedComment start="/+" end="+/" contains=dNestedComment,dNestedCommentString,dTodo,@Spell fold
+syn match dLineComment "//.*" contains=dLineCommentString,dTodo,@Spell
+
+hi link dLineCommentString dBlockCommentString
+hi link dBlockCommentString dString
+hi link dNestedCommentString dString
+hi link dCommentStar dBlockComment
+hi link dCommentPlus dNestedComment
+
+syn cluster dTokens add=dBlockComment,dNestedComment,dLineComment
+
+" /+ +/ style comments and strings that span multiple lines can cause
+" problems. To play it safe, set minlines to a large number.
+syn sync minlines=200
+" Use ccomment for /* */ style comments
+syn sync ccomment dBlockComment
+
+" Characters
+"
+syn match dSpecialCharError contained "[^']"
+
+" Escape sequences (oct,specal char,hex,wchar, character entities \&xxx;)
+" These are not contained because they are considered string literals.
+syn match dEscSequence "\\\(\o\{1,3}\|[\"\\'\\?ntbrfva]\|u\x\{4}\|U\x\{8}\|x\x\x\)"
+syn match dEscSequence "\\&[^;& \t]\+;"
+syn match dCharacter "'[^']*'" contains=dEscSequence,dSpecialCharError
+syn match dCharacter "'\\''" contains=dEscSequence
+syn match dCharacter "'[^\\]'"
+
+syn cluster dTokens add=dEscSequence,dCharacter
+
+" Unicode characters
+"
+syn match dUnicode "\\u\d\{4\}"
+
+" String.
+"
+syn match dFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([bdiuoxXDOUfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
+syn match dFormat display "%%" contained
+
+syn region dString start=+"+ end=+"[cwd]\=+ skip=+\\\\\|\\"+ contains=dFormat,dEscSequence,@Spell
+syn region dRawString start=+`+ end=+`[cwd]\=+ contains=@Spell
+syn region dRawString start=+r"+ end=+"[cwd]\=+ contains=@Spell
+syn region dHexString start=+x"+ end=+"[cwd]\=+ contains=@Spell
+syn region dDelimString start=+q"\z(.\)+ end=+\z1"+ contains=@Spell
+syn region dHereString start=+q"\z(\I\i*\)\n+ end=+^\z1"+ contains=@Spell
+
+
+" Nesting delimited string contents
+"
+syn region dNestParenString start=+(+ end=+)+ contained transparent contains=dNestParenString,@Spell
+syn region dNestBrackString start=+\[+ end=+\]+ contained transparent contains=dNestBrackString,@Spell
+syn region dNestAngleString start=+<+ end=+>+ contained transparent contains=dNestAngleString,@Spell
+syn region dNestCurlyString start=+{+ end=+}+ contained transparent contains=dNestCurlyString,@Spell
+
+" Nesting delimited strings
+"
+syn region dParenString matchgroup=dParenString start=+q"(+ end=+)"+ contains=dNestParenString,@Spell
+syn region dBrackString matchgroup=dBrackString start=+q"\[+ end=+\]"+ contains=dNestBrackString,@Spell
+syn region dAngleString matchgroup=dAngleString start=+q"<+ end=+>"+ contains=dNestAngleString,@Spell
+syn region dCurlyString matchgroup=dCurlyString start=+q"{+ end=+}"+ contains=dNestCurlyString,@Spell
+
+hi link dParenString dNestString
+hi link dBrackString dNestString
+hi link dAngleString dNestString
+hi link dCurlyString dNestString
+
+syn cluster dTokens add=dString,dRawString,dHexString,dDelimString,dNestString
+
+" Token strings
+"
+syn region dNestTokenString start=+{+ end=+}+ contained contains=dNestTokenString,@dTokens,dFormat
+syn region dTokenString matchgroup=dTokenStringBrack transparent start=+q{+ end=+}+ contains=dNestTokenString,@dTokens,dFormat
+
+syn cluster dTokens add=dTokenString
+
+" Numbers
+"
+syn case ignore
+
+syn match dDec display "\<\d[0-9_]*\(u\=l\=\|l\=u\=\)\>"
+
+" Hex number
+syn match dHex display "\<0x[0-9a-f_]\+\(u\=l\=\|l\=u\=\)\>"
+
+syn match dOctal display "\<0[0-7_]\+\(u\=l\=\|l\=u\=\)\>"
+" flag an octal number with wrong digits
+syn match dOctalError display "\<0[0-7_]*[89][0-9_]*"
+
+" binary numbers
+syn match dBinary display "\<0b[01_]\+\(u\=l\=\|l\=u\=\)\>"
+
+"floating point without the dot
+syn match dFloat display "\<\d[0-9_]*\(fi\=\|l\=i\)\>"
+"floating point number, with dot, optional exponent
+syn match dFloat display "\<\d[0-9_]*\.[0-9_]*\(e[-+]\=[0-9_]\+\)\=[fl]\=i\="
+"floating point number, starting with a dot, optional exponent
+syn match dFloat display "\(\.[0-9_]\+\)\(e[-+]\=[0-9_]\+\)\=[fl]\=i\=\>"
+"floating point number, without dot, with exponent
+"syn match dFloat display "\<\d\+e[-+]\=\d\+[fl]\=\>"
+syn match dFloat display "\<\d[0-9_]*e[-+]\=[0-9_]\+[fl]\=\>"
+
+"floating point without the dot
+syn match dHexFloat display "\<0x[0-9a-f_]\+\(fi\=\|l\=i\)\>"
+"floating point number, with dot, optional exponent
+syn match dHexFloat display "\<0x[0-9a-f_]\+\.[0-9a-f_]*\(p[-+]\=[0-9_]\+\)\=[fl]\=i\="
+"floating point number, without dot, with exponent
+syn match dHexFloat display "\<0x[0-9a-f_]\+p[-+]\=[0-9_]\+[fl]\=i\=\>"
+
+syn cluster dTokens add=dDec,dHex,dOctal,dOctalError,dBinary,dFloat,dHexFloat
+
+syn case match
+
+" Pragma (preprocessor) support
+" TODO: Highlight following Integer and optional Filespec.
+syn region dPragma start="#\s*\(line\>\)" skip="\\$" end="$"
+
+" Block
+"
+syn region dBlock start="{" end="}" transparent fold
+
+
+" The default highlighting.
+"
+hi def link dBinary Number
+hi def link dDec Number
+hi def link dHex Number
+hi def link dOctal Number
+hi def link dFloat Float
+hi def link dHexFloat Float
+hi def link dDebug Debug
+hi def link dBranch Conditional
+hi def link dConditional Conditional
+hi def link dLabel Label
+hi def link dUserLabel Label
+hi def link dRepeat Repeat
+hi def link dExceptions Exception
+hi def link dAssert Statement
+hi def link dStatement Statement
+hi def link dScopeDecl dStorageClass
+hi def link dStorageClass StorageClass
+hi def link dBoolean Boolean
+hi def link dUnicode Special
+hi def link dTokenStringBrack String
+hi def link dHereString String
+hi def link dNestString String
+hi def link dDelimString String
+hi def link dRawString String
+hi def link dString String
+hi def link dHexString String
+hi def link dCharacter Character
+hi def link dEscSequence SpecialChar
+hi def link dFormat SpecialChar
+hi def link dSpecialCharError Error
+hi def link dOctalError Error
+hi def link dOperator Operator
+hi def link dOpOverload Identifier
+hi def link dConstant Constant
+hi def link dTypedef Typedef
+hi def link dEnum Structure
+hi def link dStructure Structure
+hi def link dTodo Todo
+hi def link dType Type
+hi def link dLineComment Comment
+hi def link dBlockComment Comment
+hi def link dNestedComment Comment
+hi def link dCommentError Error
+hi def link dNestedCommentError Error
+hi def link dCommentStartError Error
+hi def link dExternal Include
+hi def link dAnnotation PreProc
+hi def link dSharpBang PreProc
+hi def link dAttribute StorageClass
+hi def link dIdentifier Identifier
+hi def link dVersion dStatement
+hi def link dVersionIdentifier Identifier
+hi def link dScopeIdentifier Identifier
+hi def link dTraitsIdentifier Identifier
+hi def link dPragma PreProc
+hi def link dPragmaIdentifier Identifier
+hi def link dExtern dExternal
+hi def link dExternIdentifier Identifier
+
+" Marks contents of the asm statment body as special
+
+syn match dAsmStatement "\<asm\>"
+syn region dAsmBody start="asm[\n]*\s*{"hs=e+1 end="}"he=e-1 contains=dAsmStatement,dAsmOpCode,@dComment,DUserLabel
+
+hi def link dAsmBody dUnicode
+hi def link dAsmStatement dStatement
+hi def link dAsmOpCode Identifier
+
+syn keyword dAsmOpCode contained aaa aad aam aas
+syn keyword dAsmOpCode contained add addpd addps addsd
+syn keyword dAsmOpCode contained and andnpd andnps andpd
+syn keyword dAsmOpCode contained arpl bound bsf bsr
+syn keyword dAsmOpCode contained bt btc btr bts
+syn keyword dAsmOpCode contained call bswap andps addss
+syn keyword dAsmOpCode contained cbw cdq clc cld
+syn keyword dAsmOpCode contained cli clts cmc cmova
+syn keyword dAsmOpCode contained cmovb cmovbe cmovc cmove
+syn keyword dAsmOpCode contained cmovge cmovl cmovle cmovna
+syn keyword dAsmOpCode contained cmovnae cmovg cmovae clflush
+syn keyword dAsmOpCode contained cmovnb cmovnbe cmovnc cmovne
+syn keyword dAsmOpCode contained cmovnge cmovnl cmovnle cmovno
+syn keyword dAsmOpCode contained cmovns cmovnz cmovo cmovp
+syn keyword dAsmOpCode contained cmovpo cmovs cmovz cmp
+syn keyword dAsmOpCode contained cmppd cmovpe cmovnp cmovng
+syn keyword dAsmOpCode contained cmpps cmps cmpsb cmpsd
+syn keyword dAsmOpCode contained cmpsw cmpxch8b cmpxchg comisd
+syn keyword dAsmOpCode contained cpuid cvtdq2pd cvtdq2ps cvtpd2dq
+syn keyword dAsmOpCode contained cvtpd2ps cvtpi2pd cvtpi2ps cvtps2dq
+syn keyword dAsmOpCode contained cvtps2pd cvtpd2pi comiss cmpss
+syn keyword dAsmOpCode contained cvtps2pi cvtsd2si cvtsd2ss cvtsi2sd
+syn keyword dAsmOpCode contained cvtss2sd cvtss2si cvttpd2dq cvttpd2pi
+syn keyword dAsmOpCode contained cvttps2pi cvttsd2si cvttss2si cwd
+syn keyword dAsmOpCode contained da daa das db
+syn keyword dAsmOpCode contained dd cwde cvttps2dq cvtsi2ss
+syn keyword dAsmOpCode contained de dec df di
+syn keyword dAsmOpCode contained divpd divps divsd divss
+syn keyword dAsmOpCode contained dq ds dt dw
+syn keyword dAsmOpCode contained enter f2xm1 fabs fadd
+syn keyword dAsmOpCode contained faddp emms dl div
+syn keyword dAsmOpCode contained fbld fbstp fchs fclex
+syn keyword dAsmOpCode contained fcmovbe fcmove fcmovnb fcmovnbe
+syn keyword dAsmOpCode contained fcmovnu fcmovu fcom fcomi
+syn keyword dAsmOpCode contained fcomp fcompp fcos fdecstp
+syn keyword dAsmOpCode contained fdisi fcomip fcmovne fcmovb
+syn keyword dAsmOpCode contained fdiv fdivp fdivr fdivrp
+syn keyword dAsmOpCode contained ffree fiadd ficom ficomp
+syn keyword dAsmOpCode contained fidivr fild fimul fincstp
+syn keyword dAsmOpCode contained fist fistp fisub fisubr
+syn keyword dAsmOpCode contained fld finit fidiv feni
+syn keyword dAsmOpCode contained fld1 fldcw fldenv fldl2e
+syn keyword dAsmOpCode contained fldlg2 fldln2 fldpi fldz
+syn keyword dAsmOpCode contained fmulp fnclex fndisi fneni
+syn keyword dAsmOpCode contained fnop fnsave fnstcw fnstenv
+syn keyword dAsmOpCode contained fnstsw fninit fmul fldl2t
+syn keyword dAsmOpCode contained fpatan fprem fprem1 fptan
+syn keyword dAsmOpCode contained frstor fsave fscale fsetpm
+syn keyword dAsmOpCode contained fsincos fsqrt fst fstcw
+syn keyword dAsmOpCode contained fstp fstsw fsub fsubp
+syn keyword dAsmOpCode contained fsubr fstenv fsin frndint
+syn keyword dAsmOpCode contained fsubrp ftst fucom fucomi
+syn keyword dAsmOpCode contained fucomp fucompp fwait fxam
+syn keyword dAsmOpCode contained fxrstor fxsave fxtract fyl2x
+syn keyword dAsmOpCode contained hlt idiv imul in
+syn keyword dAsmOpCode contained inc fyl2xp1 fxch fucomip
+syn keyword dAsmOpCode contained ins insb insd insw
+syn keyword dAsmOpCode contained into invd invlpg iret
+syn keyword dAsmOpCode contained ja jae jb jbe
+syn keyword dAsmOpCode contained jcxz je jecxz jg
+syn keyword dAsmOpCode contained jge jc iretd int
+syn keyword dAsmOpCode contained jl jle jmp jna
+syn keyword dAsmOpCode contained jnb jnbe jnc jne
+syn keyword dAsmOpCode contained jnge jnl jnle jno
+syn keyword dAsmOpCode contained jns jnz jo jp
+syn keyword dAsmOpCode contained jpe jnp jng jnae
+syn keyword dAsmOpCode contained jpo js jz lahf
+syn keyword dAsmOpCode contained ldmxcsr lds lea leave
+syn keyword dAsmOpCode contained lfence lfs lgdt lgs
+syn keyword dAsmOpCode contained lldt lmsw lock lods
+syn keyword dAsmOpCode contained lodsb lidt les lar
+syn keyword dAsmOpCode contained lodsd lodsw loop loope
+syn keyword dAsmOpCode contained loopnz loopz lsl lss
+syn keyword dAsmOpCode contained maskmovdqu maskmovq maxpd maxps
+syn keyword dAsmOpCode contained maxss mfence minpd minps
+syn keyword dAsmOpCode contained minsd maxsd ltr loopne
+syn keyword dAsmOpCode contained minss mov movapd movaps
+syn keyword dAsmOpCode contained movdq2q movdqa movdqu movhlps
+syn keyword dAsmOpCode contained movhps movlhps movlpd movlps
+syn keyword dAsmOpCode contained movmskps movntdq movnti movntpd
+syn keyword dAsmOpCode contained movntps movmskpd movhpd movd
+syn keyword dAsmOpCode contained movntq movq movq2dq movs
+syn keyword dAsmOpCode contained movsd movss movsw movsx
+syn keyword dAsmOpCode contained movups movzx mul mulpd
+syn keyword dAsmOpCode contained mulsd mulss neg nop
+syn keyword dAsmOpCode contained not mulps movupd movsb
+syn keyword dAsmOpCode contained or orpd orps out
+syn keyword dAsmOpCode contained outsb outsd outsw packssdw
+syn keyword dAsmOpCode contained packuswb paddb paddd paddq
+syn keyword dAsmOpCode contained paddsw paddusb paddusw paddw
+syn keyword dAsmOpCode contained pand paddsb packsswb outs
+syn keyword dAsmOpCode contained pandn pavgb pavgw pcmpeqb
+syn keyword dAsmOpCode contained pcmpeqw pcmpgtb pcmpgtd pcmpgtw
+syn keyword dAsmOpCode contained pinsrw pmaddwd pmaxsw pmaxub
+syn keyword dAsmOpCode contained pminub pmovmskb pmulhuw pmulhw
+syn keyword dAsmOpCode contained pmullw pminsw pextrw pcmpeqd
+syn keyword dAsmOpCode contained pmuludq pop popa popad
+syn keyword dAsmOpCode contained popfd por prefetchnta prefetcht0
+syn keyword dAsmOpCode contained prefetcht2 psadbw pshufd pshufhw
+syn keyword dAsmOpCode contained pshufw pslld pslldq psllq
+syn keyword dAsmOpCode contained psllw pshuflw prefetcht1 popf
+syn keyword dAsmOpCode contained psrad psraw psrld psrldq
+syn keyword dAsmOpCode contained psrlw psubb psubd psubq
+syn keyword dAsmOpCode contained psubsw psubusb psubusw psubw
+syn keyword dAsmOpCode contained punpckhdq punpckhqdq punpckhwd punpcklbw
+syn keyword dAsmOpCode contained punpckldq punpckhbw psubsb psrlq
+syn keyword dAsmOpCode contained punpcklqdq punpcklwd push pusha
+syn keyword dAsmOpCode contained pushf pushfd pxor rcl
+syn keyword dAsmOpCode contained rcpss rcr rdmsr rdpmc
+syn keyword dAsmOpCode contained rep repe repne repnz
+syn keyword dAsmOpCode contained repz rdtsc rcpps pushad
+syn keyword dAsmOpCode contained ret retf rol ror
+syn keyword dAsmOpCode contained rsqrtps rsqrtss sahf sal
+syn keyword dAsmOpCode contained sbb scas scasb scasd
+syn keyword dAsmOpCode contained seta setae setb setbe
+syn keyword dAsmOpCode contained setc scasw sar rsm
+syn keyword dAsmOpCode contained sete setg setge setl
+syn keyword dAsmOpCode contained setna setnae setnb setnbe
+syn keyword dAsmOpCode contained setne setng setnge setnl
+syn keyword dAsmOpCode contained setno setnp setns setnz
+syn keyword dAsmOpCode contained seto setnle setnc setle
+syn keyword dAsmOpCode contained setp setpe setpo sets
+syn keyword dAsmOpCode contained sfence sgdt shl shld
+syn keyword dAsmOpCode contained shrd shufpd shufps sidt
+syn keyword dAsmOpCode contained smsw sqrtpd sqrtps sqrtsd
+syn keyword dAsmOpCode contained sqrtss sldt shr setz
+syn keyword dAsmOpCode contained stc std sti stmxcsr
+syn keyword dAsmOpCode contained stosb stosd stosw str
+syn keyword dAsmOpCode contained subpd subps subsd subss
+syn keyword dAsmOpCode contained sysexit test ucomisd ucomiss
+syn keyword dAsmOpCode contained ud2 sysenter sub stos
+syn keyword dAsmOpCode contained unpckhpd unpckhps unpcklpd unpcklps
+syn keyword dAsmOpCode contained verw wbinvd wrmsr xadd
+syn keyword dAsmOpCode contained xchg xlatb xor xorpd
+syn keyword dAsmOpCode contained xorps pfrcpit1 pfmin movddup
+syn keyword dAsmOpCode contained addsubpd addsubps fisttp haddps
+syn keyword dAsmOpCode contained hsubpd hsubps lddqu monitor
+syn keyword dAsmOpCode contained haddpd xlat wait verr
+syn keyword dAsmOpCode contained movshdup movsldup mwait pfcmpeq
+syn keyword dAsmOpCode contained pavgusb pf2id pfacc pfadd
+syn keyword dAsmOpCode contained pfcmpge pfcmpgt pfmax pfmul
+syn keyword dAsmOpCode contained pfnacc pfpnacc pfrcp pfrcpit1
+syn keyword dAsmOpCode contained pfrsqit1 pfrsqrt pfsub pfsubr
+syn keyword dAsmOpCode contained pmulhrw pswapd syscall sysret
+syn keyword dAsmOpCode contained vpmuldq xgetbv cmpxchg8b cmpxchg16b
+syn keyword dAsmOpCode contained pabsb pabsd pabsw palignr
+syn keyword dAsmOpCode contained phaddd phaddsw phaddw phsubd
+syn keyword dAsmOpCode contained phsubsw phsubw pmaddubsw pmulhrsw
+syn keyword dAsmOpCode contained pshufb psignb psignd psignw
+syn keyword dAsmOpCode contained popfq pushfq blendpd blendps
+syn keyword dAsmOpCode contained blendvpd blendvps extractps insertps
+syn keyword dAsmOpCode contained movntdqa mpsadbw packusdw pblendvb
+syn keyword dAsmOpCode contained pblendw pcmpeqq pextrb pextrd
+syn keyword dAsmOpCode contained pextrq phminposuw pinsrb pinsrd
+syn keyword dAsmOpCode contained pinsrq pmaxsb pmaxsd pmaxud
+syn keyword dAsmOpCode contained pmaxuw pminsb pminsd pminud
+syn keyword dAsmOpCode contained pminuw pmulld ptest roundpd
+syn keyword dAsmOpCode contained roundps roundsd roundss pmuldq
+syn keyword dAsmOpCode contained pmovsxbd pmovsxdq pmovzxbq pmovzxdq
+syn keyword dAsmOpCode contained pmovsxbq pmovsxwd pmovzxbq pmovzxwd
+syn keyword dAsmOpCode contained pmovsxbw pmovsxwq pmovzxbw pmovzxwq
+syn keyword dAsmOpCode contained crc32 pcmpestri pcmpestrm pcmpgtq
+syn keyword dAsmOpCode contained pcmpistri pcmpistrm popcnt pi2fd
+syn keyword dAsmOpCode contained adc
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/dart.vim b/runtime/syntax/dart.vim
new file mode 100644
index 0000000..d1c2bf2
--- /dev/null
+++ b/runtime/syntax/dart.vim
@@ -0,0 +1,90 @@
+" Vim syntax file
+"
+" Language: Dart
+" Maintainer: Eugene 'pr3d4t0r' Ciurana <dart.syntax AT cime.net >
+" Source: https://github.com/pr3d4t0r/dart-vim-syntax
+" Last Update: 2019 Oct 19
+"
+" License: Vim is Charityware. dart.vim syntax is Charityware.
+" (c) Copyright 2019 by Eugene Ciurana / pr3d4t0r. Licensed
+" under the standard VIM LICENSE - Vim command :help uganda.txt
+" for details.
+"
+" Questions, comments: <dart.syntax AT cime.net>
+" https://ciurana.eu/pgp, https://keybase.io/pr3d4t0r
+"
+" vim: set fileencoding=utf-8:
+
+
+" 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 keyword dartCommentTodo contained TODO FIXME XXX TBD
+syn match dartLineComment "//.*" contains=dartTodo,@Spell
+syn match dartCommentSkip "^[ \t]*\*\($\|[ \t]\+\)"
+syn region dartComment start="/\*" end="\*/" contains=@Spell,dartTodo
+syn keyword dartReserved assert async await class const export extends external final hide import implements interface library mixin on show super sync yield
+syn match dartNumber "-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>"
+
+
+syn keyword dartBoolean false true
+syn keyword dartBranch break continue
+syn keyword dartConditional if else switch
+syn keyword dartException catch finally rethrow throw try
+syn keyword dartIdentifier abstract covariant deferred dynamic factory Function operator part static this typedef var
+syn keyword dartLabel case default
+syn keyword dartNull null
+syn keyword dartOperator is new
+syn keyword dartRepeat for do in while
+syn keyword dartStatement return with
+syn keyword dartType bool double enum int String StringBuffer void
+syn keyword dartTodo contained TODO FIXME XXX
+
+
+syn match dartEscape contained "\\\([4-9]\d\|[0-3]\d\d\|[\"\\'ntbrf]\|u\x\{4\}\)"
+syn match dartSpecialError contained "\\."
+syn match dartStrInterpol contained "\${[\x, _]*\}"
+
+syn region dartDQString start=+"+ end=+"+ end=+$+ contains=dartEscape,dartStrInterpol,dartSpecialError,@Spell
+syn region dartSQString start=+'+ end=+'+ end=+$+ contains=dartEscape,dartStrInterpol,dartSpecialError,@Spell
+
+syn match dartBraces "[{}\[\]]"
+syn match dartParens "[()]"
+
+
+syn sync fromstart
+syn sync maxlines=100
+
+
+hi def link dartBoolean Boolean
+hi def link dartBranch Conditional
+hi def link dartComment Comment
+hi def link dartConditional Conditional
+hi def link dartDQString String
+hi def link dartEscape SpecialChar
+hi def link dartException Exception
+hi def link dartIdentifier Identifier
+hi def link dartLabel Label
+hi def link dartLineComment Comment
+hi def link dartNull Keyword
+hi def link dartOperator Operator
+hi def link dartRepeat Repeat
+hi def link dartReserved Keyword
+hi def link dartSQString String
+hi def link dartSpecialError Error
+hi def link dartStatement Statement
+hi def link dartStrInterpol Special
+hi def link dartTodo Todo
+hi def link dartType Type
+
+
+let b:current_syntax = "dart"
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
diff --git a/runtime/syntax/datascript.vim b/runtime/syntax/datascript.vim
new file mode 100644
index 0000000..7b686a1
--- /dev/null
+++ b/runtime/syntax/datascript.vim
@@ -0,0 +1,102 @@
+" Vim syntax file
+" Language: DataScript
+" Maintainer: Dominique Pelle <dominique.pelle@gmail.com>
+" Last Change: 2015 Jul 30
+"
+" DataScript is a formal language for modelling binary datatypes,
+" bitstreams or file formats. For more information, see:
+"
+" http://dstools.sourceforge.net/DataScriptLanguageOverview.html
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+syn keyword dsPackage import package
+syn keyword dsType bit bool string
+syn keyword dsType int int8 int16 int32 int64
+syn keyword dsType uint8 uint16 uint32 uint64
+syn keyword dsType varint16 varint32 varint64
+syn keyword dsType varuint16 varuint32 varuint64
+syn keyword dsType leint16 leint32 leint64
+syn keyword dsType leuint16 leuint32 leuint64
+syn keyword dsEndian little big
+syn keyword dsAlign align
+syn keyword dsLabel case default
+syn keyword dsConditional if condition
+syn keyword dsBoolean true false
+syn keyword dsCompound union choice on enum bitmask subtype explicit
+syn keyword dsKeyword function return
+syn keyword dsOperator sizeof bitsizeof lengthof is sum forall in
+syn keyword dsStorageClass const
+syn keyword dsTodo contained TODO FIXME XXX
+syn keyword dsSql sql sql_table sql_database sql_pragma sql_index
+syn keyword dsSql sql_integer sql_metadata sql_key sql_virtual
+syn keyword dsSql using reference_key foreign_key to
+
+" dsCommentGroup allows adding matches for special things in comments.
+syn cluster dsCommentGroup contains=dsTodo
+
+syn match dsOffset display "^\s*[a-zA-Z_:\.][a-zA-Z0-9_:\.]*\s*:"
+
+syn match dsNumber display "\<\d\+\>"
+syn match dsNumberHex display "\<0[xX]\x\+\>"
+syn match dsNumberBin display "\<[01]\+[bB]\>" contains=dsBinaryB
+syn match dsBinaryB display contained "[bB]\>"
+syn match dsOctal display "\<0\o\+\>" contains=dsOctalZero
+syn match dsOctalZero display contained "\<0"
+
+syn match dsOctalError display "\<0\o*[89]\d*\>"
+
+syn match dsCommentError display "\*/"
+syn match dsCommentStartError display "/\*"me=e-1 contained
+
+syn region dsCommentL
+ \ start="//" skip="\\$" end="$" keepend
+ \ contains=@dsCommentGroup,@Spell
+syn region dsComment
+ \ matchgroup=dsCommentStart start="/\*" end="\*/"
+ \ contains=@dsCommentGroup,dsCommentStartError,@Spell extend
+
+syn region dsString
+ \ start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell
+
+syn sync ccomment dsComment
+
+" Define the default highlighting.
+hi def link dsType Type
+hi def link dsEndian StorageClass
+hi def link dsStorageClass StorageClass
+hi def link dsAlign Label
+hi def link dsLabel Label
+hi def link dsOffset Label
+hi def link dsSql PreProc
+hi def link dsCompound Structure
+hi def link dsConditional Conditional
+hi def link dsBoolean Boolean
+hi def link dsKeyword Statement
+hi def link dsString String
+hi def link dsNumber Number
+hi def link dsNumberBin Number
+hi def link dsBinaryB Special
+hi def link dsOctal Number
+hi def link dsOctalZero Special
+hi def link dsOctalError Error
+hi def link dsNumberHex Number
+hi def link dsTodo Todo
+hi def link dsOperator Operator
+hi def link dsPackage Include
+hi def link dsCommentError Error
+hi def link dsCommentStartError Error
+hi def link dsCommentStart dsComment
+hi def link dsCommentL dsComment
+hi def link cCommentL dsComment
+hi def link dsComment Comment
+
+let b:current_syntax = "datascript"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/syntax/dcd.vim b/runtime/syntax/dcd.vim
new file mode 100644
index 0000000..058d272
--- /dev/null
+++ b/runtime/syntax/dcd.vim
@@ -0,0 +1,51 @@
+" Vim syntax file
+" Language: WildPackets EtherPeek Decoder (.dcd) file
+" Maintainer: Christopher Shinn <christopher@lucent.com>
+" Last Change: 2003 Apr 25
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Keywords
+syn keyword dcdFunction DCod TRTS TNXT CRLF
+syn match dcdFunction display "\(STR\)\#"
+syn keyword dcdLabel LABL
+syn region dcdLabel start="[A-Z]" end=";"
+syn keyword dcdConditional CEQU CNEQ CGTE CLTE CBIT CLSE
+syn keyword dcdConditional LSTS LSTE LSTZ
+syn keyword dcdConditional TYPE TTST TEQU TNEQ TGTE TLTE TBIT TLSE TSUB SKIP
+syn keyword dcdConditional MARK WHOA
+syn keyword dcdConditional SEQU SNEQ SGTE SLTE SBIT
+syn match dcdConditional display "\(CST\)\#" "\(TST\)\#"
+syn keyword dcdDisplay HBIT DBIT BBIT
+syn keyword dcdDisplay HBYT DBYT BBYT
+syn keyword dcdDisplay HWRD DWRD BWRD
+syn keyword dcdDisplay HLNG DLNG BLNG
+syn keyword dcdDisplay D64B
+syn match dcdDisplay display "\(HEX\)\#" "\(CHR\)\#" "\(EBC\)\#"
+syn keyword dcdDisplay HGLB DGLB BGLB
+syn keyword dcdDisplay DUMP
+syn keyword dcdStatement IPLG IPV6 ATLG AT03 AT01 ETHR TRNG PRTO PORT
+syn keyword dcdStatement TIME OSTP PSTR CSTR NBNM DMPE FTPL CKSM FCSC
+syn keyword dcdStatement GBIT GBYT GWRD GLNG
+syn keyword dcdStatement MOVE ANDG ORRG NOTG ADDG SUBG MULG DIVG MODG INCR DECR
+syn keyword dcdSpecial PRV1 PRV2 PRV3 PRV4 PRV5 PRV6 PRV7 PRV8
+
+" Comment
+syn region dcdComment start="\*" end="\;"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "dcd"
diff --git a/runtime/syntax/dcl.vim b/runtime/syntax/dcl.vim
new file mode 100644
index 0000000..530fbdb
--- /dev/null
+++ b/runtime/syntax/dcl.vim
@@ -0,0 +1,152 @@
+" Vim syntax file
+" Language: DCL (Digital Command Language - vms)
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Mar 26, 2019
+" Version: 13
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_DCL
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if (v:version == 704 && has("patch-7.4.1142")) || v:version > 704
+ syn iskeyword $,@,48-57,_
+else
+ setlocal iskeyword=$,@,48-57,_
+endif
+
+syn case ignore
+syn keyword dclInstr accounting del[ete] gen[cat] mou[nt] run
+syn keyword dclInstr all[ocate] dep[osit] gen[eral] ncp run[off]
+syn keyword dclInstr ana[lyze] dia[gnose] gos[ub] ncs sca
+syn keyword dclInstr app[end] dif[ferences] got[o] on sea[rch]
+syn keyword dclInstr ass[ign] dir[ectory] hel[p] ope[n] set
+syn keyword dclInstr att[ach] dis[able] ico[nv] pas[cal] sho[w]
+syn keyword dclInstr aut[horize] dis[connect] if pas[sword] sor[t]
+syn keyword dclInstr aut[ogen] dis[mount] ini[tialize] pat[ch] spa[wn]
+syn keyword dclInstr bac[kup] dpm[l] inq[uire] pca sta[rt]
+syn keyword dclInstr cal[l] dqs ins[tall] pho[ne] sto[p]
+syn keyword dclInstr can[cel] dsr job pri[nt] sub[mit]
+syn keyword dclInstr cc dst[graph] lat[cp] pro[duct] sub[routine]
+syn keyword dclInstr clo[se] dtm lib[rary] psw[rap] swx[cr]
+syn keyword dclInstr cms dum[p] lic[ense] pur[ge] syn[chronize]
+syn keyword dclInstr con[nect] edi[t] lin[k] qde[lete] sys[gen]
+syn keyword dclInstr con[tinue] ena[ble] lmc[p] qse[t] sys[man]
+syn keyword dclInstr con[vert] end[subroutine] loc[ale] qsh[ow] tff
+syn keyword dclInstr cop[y] eod log[in] rea[d] then
+syn keyword dclInstr cre[ate] eoj log[out] rec[all] typ[e]
+syn keyword dclInstr cxx exa[mine] lse[dit] rec[over] uil
+syn keyword dclInstr cxx[l_help] exc[hange] mac[ro] ren[ame] unl[ock]
+syn keyword dclInstr dea[llocate] exi[t] mai[l] rep[ly] ves[t]
+syn keyword dclInstr dea[ssign] fdl mer[ge] req[uest] vie[w]
+syn keyword dclInstr deb[ug] flo[wgraph] mes[sage] ret[urn] wai[t]
+syn keyword dclInstr dec[k] fon[t] mms rms wri[te]
+syn keyword dclInstr def[ine] for[tran]
+
+syn keyword dclLexical f$context f$edit f$getjpi f$message f$setprv
+syn keyword dclLexical f$csid f$element f$getqui f$mode f$string
+syn keyword dclLexical f$cvsi f$environment f$getsyi f$parse f$time
+syn keyword dclLexical f$cvtime f$extract f$identifier f$pid f$trnlnm
+syn keyword dclLexical f$cvui f$fao f$integer f$privilege f$type
+syn keyword dclLexical f$device f$file_attributes f$length f$process f$user
+syn keyword dclLexical f$directory f$getdvi f$locate f$search f$verify
+
+syn match dclMdfy "/\I\i*" nextgroup=dclMdfySet,dclMdfySetString
+syn match dclMdfySet "=[^ \t"]*" contained
+syn region dclMdfySet matchgroup=dclMdfyBrkt start="=\[" matchgroup=dclMdfyBrkt end="]" contains=dclMdfySep
+syn region dclMdfySetString start='="' skip='""' end='"' contained
+syn match dclMdfySep "[:,]" contained
+
+" Numbers
+syn match dclNumber "\d\+"
+
+" Varname (mainly to prevent dclNumbers from being recognized when part of a dclVarname)
+syn match dclVarname "\I\i*"
+
+" Filenames (devices, paths)
+syn match dclDevice "\I\i*\(\$\I\i*\)\=:[^=]"me=e-1 nextgroup=dclDirPath,dclFilename
+syn match dclDirPath "\[\(\I\i*\.\)*\I\i*\]" contains=dclDirSep nextgroup=dclFilename
+syn match dclFilename "\I\i*\$\(\I\i*\)\=\.\(\I\i*\)*\(;\d\+\)\=" contains=dclDirSep
+syn match dclFilename "\I\i*\.\(\I\i*\)\=\(;\d\+\)\=" contains=dclDirSep contained
+syn match dclDirSep "[[\].;]"
+
+" Strings
+syn region dclString start='"' skip='""' end='"' contains=@Spell
+
+" $ stuff and comments
+syn cluster dclCommentGroup contains=dclStart,dclTodo,@Spell
+syn match dclStart "^\$" skipwhite nextgroup=dclExe
+syn match dclContinue "-$"
+syn match dclComment "^\$!.*$" contains=@dclCommentGroup
+syn match dclExe "\I\i*" contained
+syn keyword dclTodo contained COMBAK DEBUG FIXME TODO XXX
+
+" Assignments and Operators
+syn match dclAssign ":==\="
+syn match dclAssign "="
+syn match dclOper "--\|+\|\*\|/"
+syn match dclLogOper "\.[a-zA-Z][a-zA-Z][a-zA-Z]\=\." contains=dclLogical,dclLogSep
+syn keyword dclLogical contained and ge gts lt nes
+syn keyword dclLogical contained eq ges le lts not
+syn keyword dclLogical contained eqs gt les ne or
+syn match dclLogSep "\." contained
+
+" @command procedures
+syn match dclCmdProcStart "@" nextgroup=dclCmdProc
+syn match dclCmdProc "\I\i*\(\.\I\i*\)\=" contained
+syn match dclCmdProc "\I\i*:" contained nextgroup=dclCmdDirPath,dclCmdProc
+syn match dclCmdDirPath "\[\(\I\i*\.\)*\I\i*\]" contained nextgroup=delCmdProc
+
+" labels
+syn match dclGotoLabel "^\$\s*\I\i*:\s*$" contains=dclStart
+
+" parameters
+syn match dclParam "'\I[a-zA-Z0-9_$]*'\="
+
+" () matching (the clusters are commented out until a vim/vms comes out for v5.2+)
+"syn cluster dclNextGroups contains=dclCmdDirPath,dclCmdProc,dclCmdProc,dclDirPath,dclFilename,dclFilename,dclMdfySet,dclMdfySetString,delCmdProc,dclExe,dclTodo
+"syn region dclFuncList matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALLBUT,@dclNextGroups
+syn region dclFuncList matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALLBUT,dclCmdDirPath,dclCmdProc,dclCmdProc,dclDirPath,dclFilename,dclFilename,dclMdfySet,dclMdfySetString,delCmdProc,dclExe,dclTodo
+syn match dclError ")"
+
+" Define the default highlighting.
+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"
+
+" vim: ts=16
diff --git a/runtime/syntax/debchangelog.vim b/runtime/syntax/debchangelog.vim
new file mode 100644
index 0000000..d3c3d39
--- /dev/null
+++ b/runtime/syntax/debchangelog.vim
@@ -0,0 +1,77 @@
+" Vim syntax file
+" Language: Debian changelog files
+" Maintainer: Debian Vim Maintainers
+" Former Maintainers: Gerfried Fuchs <alfie@ist.org>
+" Wichert Akkerman <wakkerma@debian.org>
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/debchangelog.vim
+
+" Standard syntax initialization
+if exists('b:current_syntax')
+ finish
+endif
+
+" Case doesn't matter for us
+syn case ignore
+
+let s:urgency='urgency=\(low\|medium\|high\|emergency\|critical\)\( [^[:space:],][^,]*\)\='
+let s:binNMU='binary-only=yes'
+
+let s:cpo = &cpo
+set cpo-=C
+let s:supported = [
+ \ 'oldstable', 'stable', 'testing', 'unstable', 'experimental', 'sid', 'rc-buggy',
+ \ 'buster', 'bullseye', 'bookworm', 'trixie', 'forky',
+ \
+ \ 'trusty', 'xenial', 'bionic', 'focal', 'jammy', 'kinetic', 'lunar',
+ \ 'devel'
+ \ ]
+let s:unsupported = [
+ \ 'frozen', 'buzz', 'rex', 'bo', 'hamm', 'slink', 'potato',
+ \ 'woody', 'sarge', 'etch', 'lenny', 'squeeze', 'wheezy',
+ \ 'jessie', 'stretch',
+ \
+ \ 'warty', 'hoary', 'breezy', 'dapper', 'edgy', 'feisty',
+ \ 'gutsy', 'hardy', 'intrepid', 'jaunty', 'karmic', 'lucid',
+ \ 'maverick', 'natty', 'oneiric', 'precise', 'quantal', 'raring', 'saucy',
+ \ 'utopic', 'vivid', 'wily', 'yakkety', 'zesty', 'artful', 'cosmic',
+ \ 'disco', 'eoan', 'hirsute', 'impish', 'groovy'
+ \ ]
+let &cpo=s:cpo
+
+" Define some common expressions we can use later on
+syn match debchangelogName contained "^[[:alnum:]][[:alnum:].+-]\+ "
+exe 'syn match debchangelogFirstKV contained "; \('.s:urgency.'\|'.s:binNMU.'\)"'
+exe 'syn match debchangelogOtherKV contained ", \('.s:urgency.'\|'.s:binNMU.'\)"'
+exe 'syn match debchangelogTarget contained "\%( \%('.join(s:supported, '\|').'\)\>[-[:alnum:]]*\)\+"'
+exe 'syn match debchangelogUnsupportedTarget contained "\%( \%('.join(s:unsupported, '\|').'\)\>[-[:alnum:]]*\)\+"'
+syn match debchangelogUnreleased contained / UNRELEASED/
+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\+\)*"
+syn match debchangelogEmail contained "[_=[:alnum:].+-]\+@[[:alnum:]./\-]\+"
+syn match debchangelogEmail contained "<.\{-}>"
+
+" Define the entries that make up the changelog
+syn region debchangelogHeader start="^[^ ]" end="$" contains=debchangelogName,debchangelogFirstKV,debchangelogOtherKV,debchangelogTarget,debchangelogUnsupportedTarget,debchangelogUnreleased,debchangelogVersion,debchangelogBinNMU oneline
+syn region debchangelogFooter start="^ [^ ]" end="$" contains=debchangelogEmail oneline
+syn region debchangelogEntry start="^ " end="$" contains=debchangelogCloses,debchangelogLP oneline
+
+" Associate our matches and regions with pretty colours
+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 debchangelogUnsupportedTarget Identifier
+hi def link debchangelogUnreleased WarningMsg
+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
new file mode 100644
index 0000000..c79b702
--- /dev/null
+++ b/runtime/syntax/debcontrol.vim
@@ -0,0 +1,145 @@
+" Vim syntax file
+" Language: Debian control files
+" Maintainer: Debian Vim Maintainers
+" Former Maintainers: Gerfried Fuchs <alfie@ist.org>
+" Wichert Akkerman <wakkerma@debian.org>
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/debcontrol.vim
+
+" Standard syntax initialization
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpo
+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 ",[ \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
+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
+
+" Keep in sync with https://metadata.ftp-master.org/sections.822
+" curl -q https://metadata.ftp-master.debian.org/sections.822 2>/dev/null| grep-dctrl -n --not -FSection -sSection / -
+let s:sections = [
+ \ 'admin', 'cli-mono', 'comm', 'database', 'debian-installer', 'debug'
+ \, 'devel', 'doc', 'editors', 'education', 'electronics', 'embedded'
+ \, 'fonts', 'games', 'gnome', 'gnu-r', 'gnustep', 'golang', 'graphics'
+ \, 'hamradio', 'haskell', 'httpd', 'interpreters', 'introspection'
+ \, 'java', 'javascript', 'kde', 'kernel', 'libdevel', 'libs', 'lisp'
+ \, 'localization', 'mail', 'math', 'metapackages', 'misc', 'net', 'news'
+ \, 'ocaml', 'oldlibs', 'otherosfs', 'perl', 'php', 'python', 'raku'
+ \, 'ruby', 'rust', 'science', 'shells', 'sound', 'tasks', 'tex', 'text'
+ \, '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 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 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;
+syn match debcontrolHTTPUrl contained "\vhttps?://[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?(:\d+)?(/[^[:space:]]*)?$"
+syn match debcontrolVcsSvn contained "\vsvn%(\+ssh)?://[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?(:\d+)?(/[^[:space:]]*)?$"
+syn match debcontrolVcsCvs contained "\v%(\-d *)?:pserver:[^@]+\@[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?:/[^[:space:]]*%( [^[:space:]]+)?$"
+syn match debcontrolVcsGit contained "\v%(git|https?)://[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?(:\d+)?(/[^[:space:]]*)?%(\s+-b\s+[^ ~^:?*[\\]+)?$"
+
+" An email address
+syn match debcontrolEmail "[_=[:alnum:]\.+-]\+@[[:alnum:]\./\-]\+"
+syn match debcontrolEmail "<.\{-}>"
+
+" #-Comments
+syn match debcontrolComment "^#.*$" contains=@Spell
+
+syn case ignore
+
+" Handle all fields from deb-src-control(5)
+
+" Catch-all for the legal fields
+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
+
+" Fields for which we do strict syntax checking
+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-[-a-zA-Z0-9]\+-\)\=Vcs-\%(Browser\|Arch\|Bzr\|Darcs\|Hg\): *" end="$" contains=debcontrolHTTPUrl oneline keepend
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-[-a-zA-Z0-9]\+-\)\=Vcs-Svn: *" end="$" contains=debcontrolVcsSvn,debcontrolHTTPUrl oneline keepend
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-[-a-zA-Z0-9]\+-\)\=Vcs-Cvs: *" end="$" contains=debcontrolVcsCvs oneline keepend
+syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-[-a-zA-Z0-9]\+-\)\=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
+
+" Associate our matches and regions with pretty colours
+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
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/debcopyright.vim b/runtime/syntax/debcopyright.vim
new file mode 100644
index 0000000..6f76b5c
--- /dev/null
+++ b/runtime/syntax/debcopyright.vim
@@ -0,0 +1,33 @@
+" Vim syntax file
+" Language: Debian copyright file
+" Maintainer: Debian Vim Maintainers
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/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\|Files-Excluded\%(-[-a-zA-Z0-9]\+\)\=\): *"
+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
new file mode 100644
index 0000000..cbb3b36
--- /dev/null
+++ b/runtime/syntax/debsources.vim
@@ -0,0 +1,61 @@
+" Vim syntax file
+" Language: Debian sources.list
+" Maintainer: Debian Vim Maintainers
+" Former Maintainer: Matthijs Mohlmann <matthijs@cacholong.nl>
+" Last Change: 2023 Feb 06
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/debsources.vim
+
+" Standard syntax initialization
+if exists('b:current_syntax')
+ finish
+endif
+
+" case sensitive
+syn case match
+
+" A bunch of useful keywords
+syn match debsourcesType /\(deb-src\|deb\)/
+syn match debsourcesFreeComponent /\(main\|universe\)/
+syn match debsourcesNonFreeComponent /\(contrib\|non-free-firmware\|non-free\|restricted\|multiverse\)/
+
+" Match comments
+syn match debsourcesComment /#.*/ contains=@Spell
+
+let s:cpo = &cpo
+set cpo-=C
+let s:supported = [
+ \ 'oldstable', 'stable', 'testing', 'unstable', 'experimental', 'sid', 'rc-buggy',
+ \ 'buster', 'bullseye', 'bookworm', 'trixie', 'forky',
+ \
+ \ 'trusty', 'xenial', 'bionic', 'focal', 'jammy', 'kinetic', 'lunar',
+ \ 'devel'
+ \ ]
+let s:unsupported = [
+ \ 'buzz', 'rex', 'bo', 'hamm', 'slink', 'potato',
+ \ 'woody', 'sarge', 'etch', 'lenny', 'squeeze', 'wheezy',
+ \ 'jessie', 'stretch',
+ \
+ \ 'warty', 'hoary', 'breezy', 'dapper', 'edgy', 'feisty',
+ \ 'gutsy', 'hardy', 'intrepid', 'jaunty', 'karmic', 'lucid',
+ \ 'maverick', 'natty', 'oneiric', 'precise', 'quantal', 'raring', 'saucy',
+ \ 'utopic', 'vivid', 'wily', 'yakkety', 'zesty', 'artful', 'cosmic',
+ \ 'disco', 'eoan', 'hirsute', 'impish', 'groovy'
+ \ ]
+let &cpo=s:cpo
+
+" Match uri's
+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
+hi def link debsourcesType Statement
+hi def link debsourcesFreeComponent Statement
+hi def link debsourcesNonFreeComponent Statement
+hi def link debsourcesDistrKeyword Type
+hi def link debsourcesUnsupportedDistrKeyword WarningMsg
+hi def link debsourcesComment Comment
+hi def link debsourcesUri Constant
+
+let b:current_syntax = 'debsources'
diff --git a/runtime/syntax/def.vim b/runtime/syntax/def.vim
new file mode 100644
index 0000000..a17714c
--- /dev/null
+++ b/runtime/syntax/def.vim
@@ -0,0 +1,44 @@
+" Vim syntax file
+" Language: Microsoft Module-Definition (.def) File
+" Orig Author: Rob Brady <robb@datatone.com>
+" Maintainer: Wu Yongwei <wuyongwei@gmail.com>
+" Last Change: $Date: 2007/10/02 13:51:24 $
+" $Revision: 1.2 $
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn match defComment ";.*"
+
+syn keyword defKeyword LIBRARY STUB EXETYPE DESCRIPTION CODE WINDOWS DOS
+syn keyword defKeyword RESIDENTNAME PRIVATE EXPORTS IMPORTS SEGMENTS
+syn keyword defKeyword HEAPSIZE DATA
+syn keyword defStorage LOADONCALL MOVEABLE DISCARDABLE SINGLE
+syn keyword defStorage FIXED PRELOAD
+
+syn match defOrdinal "\s\+@\d\+"
+
+syn region defString start=+'+ end=+'+
+
+syn match defNumber "\d+"
+syn match defNumber "0x\x\+"
+
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/denyhosts.vim b/runtime/syntax/denyhosts.vim
new file mode 100644
index 0000000..f32faab
--- /dev/null
+++ b/runtime/syntax/denyhosts.vim
@@ -0,0 +1,289 @@
+" Vim syntax file
+" Language: denyhosts configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-25
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword denyhostsTodo
+ \ contained
+ \ TODO
+ \ FIXME
+ \ XXX
+ \ NOTE
+
+syn case ignore
+
+syn match denyhostsComment
+ \ contained
+ \ display
+ \ '#.*'
+ \ contains=denyhostsTodo,
+ \ @Spell
+
+syn match denyhostsBegin
+ \ display
+ \ '^'
+ \ nextgroup=@denyhostsSetting,
+ \ denyhostsComment
+ \ skipwhite
+
+syn cluster denyhostsSetting
+ \ contains=denyhostsStringSetting,
+ \ denyhostsBooleanSetting,
+ \ denyhostsPathSetting,
+ \ denyhostsNumericSetting,
+ \ denyhostsTimespecSetting,
+ \ denyhostsFormatSetting,
+ \ denyhostsRegexSetting
+
+syn keyword denyhostsStringSetting
+ \ contained
+ \ ADMIN_EMAIL
+ \ SMTP_HOST
+ \ SMTP_USERNAME
+ \ SMTP_PASSWORD
+ \ SMTP_FROM
+ \ SMTP_SUBJECT
+ \ BLOCK_SERVICE
+ \ nextgroup=denyhostsStringDelimiter
+ \ skipwhite
+
+syn keyword denyhostsBooleanSetting
+ \ contained
+ \ SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS
+ \ HOSTNAME_LOOKUP
+ \ SYSLOG_REPORT
+ \ RESET_ON_SUCCESS
+ \ SYNC_UPLOAD
+ \ SYNC_DOWNLOAD
+ \ ALLOWED_HOSTS_HOSTNAME_LOOKUP
+ \ nextgroup=denyhostsBooleanDelimiter
+ \ skipwhite
+
+syn keyword denyhostsPathSetting
+ \ contained
+ \ DAEMON_LOG
+ \ PLUGIN_DENY
+ \ PLUGIN_PURGE
+ \ SECURE_LOG
+ \ LOCK_FILE
+ \ HOSTS_DENY
+ \ WORK_DIR
+ \ nextgroup=denyhostsPathDelimiter
+ \ skipwhite
+
+syn keyword denyhostsNumericSetting
+ \ contained
+ \ SYNC_DOWNLOAD_THRESHOLD
+ \ SMTP_PORT
+ \ PURGE_THRESHOLD
+ \ DENY_THRESHOLD_INVALID
+ \ DENY_THRESHOLD_VALID
+ \ DENY_THRESHOLD_ROOT
+ \ DENY_THRESHOLD_RESTRICTED
+ \ nextgroup=denyhostsNumericDelimiter
+ \ skipwhite
+
+syn keyword denyhostsTimespecSetting
+ \ contained
+ \ DAEMON_SLEEP
+ \ DAEMON_PURGE
+ \ AGE_RESET_INVALID
+ \ AGE_RESET_VALID
+ \ AGE_RESET_ROOT
+ \ AGE_RESET_RESTRICTED
+ \ SYNC_INTERVAL
+ \ SYNC_DOWNLOAD_RESILIENCY
+ \ PURGE_DENY
+ \ nextgroup=denyhostsTimespecDelimiter
+ \ skipwhite
+
+syn keyword denyhostsFormatSetting
+ \ contained
+ \ DAEMON_LOG_TIME_FORMAT
+ \ DAEMON_LOG_MESSAGE_FORMAT
+ \ SMTP_DATE_FORMAT
+ \ nextgroup=denyhostsFormatDelimiter
+ \ skipwhite
+
+syn keyword denyhostsRegexSetting
+ \ contained
+ \ SSHD_FORMAT_REGEX
+ \ FAILED_ENTRY_REGEX
+ \ FAILED_ENTRY_REGEX2
+ \ FAILED_ENTRY_REGEX3
+ \ FAILED_ENTRY_REGEX4
+ \ FAILED_ENTRY_REGEX5
+ \ FAILED_ENTRY_REGEX6
+ \ FAILED_ENTRY_REGEX7
+ \ USERDEF_FAILED_ENTRY_REGEX
+ \ SUCCESSFUL_ENTRY_REGEX
+ \ nextgroup=denyhostsRegexDelimiter
+ \ skipwhite
+
+syn keyword denyhostURLSetting
+ \ contained
+ \ SYNC_SERVER
+ \ nextgroup=denyhostsURLDelimiter
+ \ skipwhite
+
+syn match denyhostsStringDelimiter
+ \ contained
+ \ display
+ \ '[:=]'
+ \ nextgroup=denyhostsString
+ \ skipwhite
+
+syn match denyhostsBooleanDelimiter
+ \ contained
+ \ display
+ \ '[:=]'
+ \ nextgroup=@denyhostsBoolean
+ \ skipwhite
+
+syn match denyhostsPathDelimiter
+ \ contained
+ \ display
+ \ '[:=]'
+ \ nextgroup=denyhostsPath
+ \ skipwhite
+
+syn match denyhostsNumericDelimiter
+ \ contained
+ \ display
+ \ '[:=]'
+ \ nextgroup=denyhostsNumber
+ \ skipwhite
+
+syn match denyhostsTimespecDelimiter
+ \ contained
+ \ display
+ \ '[:=]'
+ \ nextgroup=denyhostsTimespec
+ \ skipwhite
+
+syn match denyhostsFormatDelimiter
+ \ contained
+ \ display
+ \ '[:=]'
+ \ nextgroup=denyhostsFormat
+ \ skipwhite
+
+syn match denyhostsRegexDelimiter
+ \ contained
+ \ display
+ \ '[:=]'
+ \ nextgroup=denyhostsRegex
+ \ skipwhite
+
+syn match denyhostsURLDelimiter
+ \ contained
+ \ display
+ \ '[:=]'
+ \ nextgroup=denyhostsURL
+ \ skipwhite
+
+syn match denyhostsString
+ \ contained
+ \ display
+ \ '.\+'
+
+syn cluster denyhostsBoolean
+ \ contains=denyhostsBooleanTrue,
+ \ denyhostsBooleanFalse
+
+syn match denyhostsBooleanFalse
+ \ contained
+ \ display
+ \ '.\+'
+
+syn match denyhostsBooleanTrue
+ \ contained
+ \ display
+ \ '\s*\%(1\|t\%(rue\)\=\|y\%(es\)\=\)\>\s*$'
+
+syn match denyhostsPath
+ \ contained
+ \ display
+ \ '.\+'
+
+syn match denyhostsNumber
+ \ contained
+ \ display
+ \ '\d\+\>'
+
+syn match denyhostsTimespec
+ \ contained
+ \ display
+ \ '\d\+[mhdwy]\>'
+
+syn match denyhostsFormat
+ \ contained
+ \ display
+ \ '.\+'
+ \ contains=denyhostsFormattingExpandos
+
+syn match denyhostsFormattingExpandos
+ \ contained
+ \ display
+ \ '%.'
+
+syn match denyhostsRegex
+ \ contained
+ \ display
+ \ '.\+'
+
+" TODO: Perhaps come up with a better regex here? There should really be a
+" library for these kinds of generic regexes, that is, URLs, mail addresses, …
+syn match denyhostsURL
+ \ contained
+ \ display
+ \ '.\+'
+
+hi def link denyhostsTodo Todo
+hi def link denyhostsComment Comment
+hi def link denyhostsSetting Keyword
+hi def link denyhostsStringSetting denyhostsSetting
+hi def link denyhostsBooleanSetting denyhostsSetting
+hi def link denyhostsPathSetting denyhostsSetting
+hi def link denyhostsNumericSetting denyhostsSetting
+hi def link denyhostsTimespecSetting denyhostsSetting
+hi def link denyhostsFormatSetting denyhostsSetting
+hi def link denyhostsRegexSetting denyhostsSetting
+hi def link denyhostURLSetting denyhostsSetting
+hi def link denyhostsDelimiter Normal
+hi def link denyhostsStringDelimiter denyhostsDelimiter
+hi def link denyhostsBooleanDelimiter denyhostsDelimiter
+hi def link denyhostsPathDelimiter denyhostsDelimiter
+hi def link denyhostsNumericDelimiter denyhostsDelimiter
+hi def link denyhostsTimespecDelimiter denyhostsDelimiter
+hi def link denyhostsFormatDelimiter denyhostsDelimiter
+hi def link denyhostsRegexDelimiter denyhostsDelimiter
+hi def link denyhostsURLDelimiter denyhostsDelimiter
+hi def link denyhostsString String
+if exists('g:syntax_booleans_simple') || exists('b:syntax_booleans_simple')
+ hi def link denyhostsBoolean Boolean
+ hi def link denyhostsBooleanFalse denyhostsBoolean
+ hi def link denyhostsBooleanTrue denyhostsBoolean
+else
+ hi def denyhostsBooleanTrue term=bold ctermfg=Green guifg=Green
+ hi def denyhostsBooleanFalse ctermfg=Red guifg=Red
+endif
+hi def link denyhostsPath String
+hi def link denyhostsNumber Number
+hi def link denyhostsTimespec Number
+hi def link denyhostsFormat String
+hi def link denyhostsFormattingExpandos Special
+hi def link denyhostsRegex String
+hi def link denyhostsURL String
+
+let b:current_syntax = "denyhosts"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/dep3patch.vim b/runtime/syntax/dep3patch.vim
new file mode 100644
index 0000000..c00bddf
--- /dev/null
+++ b/runtime/syntax/dep3patch.vim
@@ -0,0 +1,57 @@
+" Vim syntax file
+" Language: Debian DEP3 Patch headers
+" Maintainer: Gabriel Filion <gabster@lelutin.ca>
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/dep3patch.vim
+"
+" Specification of the DEP3 patch header format is available at:
+" https://dep-team.pages.debian.net/deps/dep3/
+
+" Standard syntax initialization
+if exists('b:current_syntax')
+ finish
+endif
+
+runtime! syntax/diff.vim
+unlet! b:current_syntax
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn region dep3patchHeaders start="\%^" end="^\%(---\)\@=" contains=dep3patchKey,dep3patchMultiField
+
+syn case ignore
+
+syn region dep3patchMultiField matchgroup=dep3patchKey start="^\%(Description\|Subject\)\ze: *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contained contains=@Spell
+syn region dep3patchMultiField matchgroup=dep3patchKey start="^Origin\ze: *" end="$" contained contains=dep3patchHTTPUrl,dep3patchCommitID,dep3patchOriginCategory oneline keepend
+syn region dep3patchMultiField matchgroup=dep3patchKey start="^Bug\%(-[[:graph:]]\+\)\?\ze: *" end="$" contained contains=dep3patchHTTPUrl oneline keepend
+syn region dep3patchMultiField matchgroup=dep3patchKey start="^Forwarded\ze: *" end="$" contained contains=dep3patchHTTPUrl,dep3patchForwardedShort oneline keepend
+syn region dep3patchMultiField matchgroup=dep3patchKey start="^\%(Author\|From\)\ze: *" end="$" contained contains=dep3patchEmail oneline keepend
+syn region dep3patchMultiField matchgroup=dep3patchKey start="^\%(Reviewed-by\|Acked-by\)\ze: *" end="$" contained contains=dep3patchEmail oneline keepend
+syn region dep3patchMultiField matchgroup=dep3patchKey start="^Last-Update\ze: *" end="$" contained contains=dep3patchISODate oneline keepend
+syn region dep3patchMultiField matchgroup=dep3patchKey start="^Applied-Upstream\ze: *" end="$" contained contains=dep3patchHTTPUrl,dep3patchCommitID oneline keepend
+
+syn match dep3patchHTTPUrl contained "\vhttps?://[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?(:\d+)?(/[^[:space:]]*)?$"
+syn match dep3patchCommitID contained "commit:[[:alnum:]]\+"
+syn match dep3patchOriginCategory contained "\%(upstream\|backport\|vendor\|other\), "
+syn match dep3patchForwardedShort contained "\%(yes\|no\|not-needed\), "
+syn match dep3patchEmail "[_=[:alnum:]\.+-]\+@[[:alnum:]\./\-]\+"
+syn match dep3patchEmail "<.\{-}>"
+syn match dep3patchISODate "[[:digit:]]\{4}-[[:digit:]]\{2}-[[:digit:]]\{2}"
+
+" Associate our matches and regions with pretty colours
+hi def link dep3patchKey Keyword
+hi def link dep3patchOriginCategory Keyword
+hi def link dep3patchForwardedShort Keyword
+hi def link dep3patchMultiField Normal
+hi def link dep3patchHTTPUrl Identifier
+hi def link dep3patchCommitID Identifier
+hi def link dep3patchEmail Identifier
+hi def link dep3patchISODate Identifier
+
+let b:current_syntax = 'dep3patch'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/desc.vim b/runtime/syntax/desc.vim
new file mode 100644
index 0000000..84b9cd0
--- /dev/null
+++ b/runtime/syntax/desc.vim
@@ -0,0 +1,88 @@
+" Vim syntax file
+" Language: T2 / ROCK Linux .desc
+" Maintainer: René Rebe <rene@exactcode.de>, Piotr Esden-Tempski <esden@rocklinux.org>
+" Last Change: 2006 Aug 14
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" syntax definitions
+
+setl iskeyword+=-
+syn keyword descFlag DIETLIBC KAFFE JAIL NOPARALLEL FPIC-QUIRK LIBTOOL-WUIRK NO-LIBTOOL-FIX AUTOMAKE-QUIRK NO-AS-NEEDED NO-SSP KERNEL INIT LIBC CC CXX F77 KCC contained
+syn keyword descLicense Unknown GPL LGPL FDL MIT BSD OpenSource Free-to-use Commercial contained
+
+" tags
+syn match descTag /^\[\(COPY\)\]/
+syn match descTag /^\[\(I\|TITLE\)\]/
+syn match descTag /^\[\(T\|TEXT\)\]/ contained
+syn match descTag /^\[\(U\|URL\)\]/
+syn match descTag /^\[\(A\|AUTHOR\)\]/
+syn match descTag /^\[\(M\|MAINTAINER\)\]/
+syn match descTag /^\[\(C\|CATEGORY\)\]/ contained
+syn match descTag /^\[\(F\|FLAG\)\]/ contained
+syn match descTag /^\[\(E\|DEP\|DEPENDENCY\)\]/
+syn match descTag /^\[\(R\|ARCH\|ARCHITECTURE\)\]/
+syn match descTag /^\[\(L\|LICENSE\)\]/ contained
+syn match descTag /^\[\(S\|STATUS\)\]/
+syn match descTag /^\[\(O\|CONF\)\]/
+syn match descTag /^\[\(V\|VER\|VERSION\)\]/
+syn match descTag /^\[\(P\|PRI\|PRIORITY\)\]/ nextgroup=descInstall skipwhite
+syn match descTag /^\[\(D\|DOWN\|DOWNLOAD\)\]/ nextgroup=descSum skipwhite
+
+" misc
+syn match descUrl /\w\+:\/\/\S\+/
+syn match descCategory /\w\+\/\w\+/ contained
+syn match descEmail /<[\.A-Za-z0-9]\+@[\.A-Za-z0-9]\+>/
+
+" priority tag
+syn match descInstallX /X/ contained
+syn match descInstallO /O/ contained
+syn match descInstall /[OX]/ contained contains=descInstallX,descInstallO nextgroup=descStage skipwhite
+syn match descDash /-/ contained
+syn match descDigit /\d/ contained
+syn match descStage /[\-0][\-1][\-2][\-3][\-4][\-5][\-6][\-7][\-8][\-9]/ contained contains=descDash,descDigit nextgroup=descCompilePriority skipwhite
+syn match descCompilePriority /\d\{3}\.\d\{3}/ contained
+
+" download tag
+syn match descSum /\d\+/ contained nextgroup=descTarball skipwhite
+syn match descTarball /\S\+/ contained nextgroup=descUrl skipwhite
+
+
+" tag regions
+syn region descText start=/^\[\(T\|TEXT\)\]/ end=/$/ contains=descTag,descUrl,descEmail
+
+syn region descTagRegion start=/^\[\(C\|CATEGORY\)\]/ end=/$/ contains=descTag,descCategory
+
+syn region descTagRegion start=/^\[\(F\|FLAG\)\]/ end=/$/ contains=descTag,descFlag
+
+syn region descTagRegion start=/^\[\(L\|LICENSE\)\]/ end=/$/ contains=descTag,descLicense
+
+" 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
new file mode 100644
index 0000000..461ba85
--- /dev/null
+++ b/runtime/syntax/desktop.vim
@@ -0,0 +1,267 @@
+" Vim syntax file
+" Language: XDG desktop entry
+" Filenames: *.desktop, *.directory
+" Maintainer: Eisuke Kawashima ( e.kawaschima+vim AT gmail.com )
+" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
+" Last Change: 2022 Sep 22
+" Version Info: desktop.vim 1.5
+" References:
+" - https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.5.html (2020-04-27)
+" - https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-0.11.html (2006-02-07)
+
+" 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 match
+
+" Variable {{{1
+" This syntax file can be used to all *nix configuration files similar to dos
+" ini format (eg. .xawtv, .radio, kde rc files) - this is default mode.
+" By default strict following of freedesktop.org standard is enforced.
+" To highlight nonstandard extensions that does not begin with X-, set
+" let g:desktop_enable_nonstd = v:true
+" Note that this may cause wrong highlight.
+" To highlight KDE-reserved features, set
+" let g:desktop_enable_kde = v:true
+" g:desktop_enable_kde follows g:desktop_enable_nonstd if not supplied
+
+if exists("g:desktop_enable_nonstd") && g:desktop_enable_nonstd
+ let s:desktop_enable_nonstd = v:true
+else
+ let s:desktop_enable_nonstd = v:false
+endif
+
+if exists("g:desktop_enable_kde") && g:desktop_enable_kde || s:desktop_enable_nonstd
+ let s:desktop_enable_kde = v:true
+else
+ let s:desktop_enable_kde = v:false
+endif
+
+" Comment {{{1
+syn match dtComment /^#.*$/
+
+" Error {{{1
+syn match dtError /\%(^\s.*\|\s\+$\)/
+
+" Group Header {{{1
+" ASCII printable characters except for brackets [ (0x5B) and ] (0x5D)
+syn match dtGroup /^\[[\x20-\x5A\x5C\x5E-\x7E]\+\]$/
+
+" Entries {{{1
+syn match dtDelim /=/ contained
+" lang_territory.codeset@modifier
+syn match dtLocaleSuffix
+ \ /\[\%(C\|POSIX\|[a-z]\{2,4}\%(_[A-Z0-9]\{2,3}\)\?\)\%(\.[A-Za-z0-9_-]\+\)\?\%(@[A-Za-z]\+\)\?\]\ze\s*=/
+ \ contained
+
+" Boolean Value {{{2
+syn match dtBoolean
+ \ /^\%(DBusActivatable\|Hidden\|NoDisplay\|PrefersNonDefaultGPU\|SingleMainWindow\|StartupNotify\|Terminal\)\s*=\s*\%(true\|false\)/
+ \ contains=dtBooleanKey,dtDelim,dtBooleanValue transparent
+syn keyword dtBooleanKey
+ \ DBusActivatable Hidden NoDisplay PrefersNonDefaultGPU SingleMainWindow StartupNotify Terminal
+ \ contained nextgroup=dtDelim
+
+if s:desktop_enable_kde
+ syn match dtBoolean
+ \ /^ReadOnly\s*=\s*\%(true\|false\)/
+ \ contains=dtBooleanKey,dtDelim,dtBooleanValue transparent
+ syn keyword dtBooleanKey
+ \ ReadOnly
+ \ contained nextgroup=dtDelim
+endif
+syn keyword dtBooleanValue true false contained
+
+" Numeric Value {{{2
+" icon theme
+syn match dtNumeric /^\%(MaxSize\|MinSize\|Size\|Threshold\)\s*=\s*\d\+/ contains=dtNumericKey,dtDelim,dtNumericDecimal
+syn keyword dtNumericKey
+ \ MaxSize MinSize Size Threshold
+ \ contained nextgroup=dtDelim
+
+if s:desktop_enable_kde
+ syn match dtNumeric /^InitialPreference\s*=\s*\d\+/ contains=dtNumericKey,dtDelim,dtNumericDecimal
+ syn keyword dtNumericKey
+ \ InitialPreference
+ \ contained nextgroup=dtDelim
+endif
+
+syn match dtNumericDecimal /\<\d\+$/ contained
+
+" String Value {{{2
+syn match dtString
+ \ /^\%(Actions\|Implements\|MimeType\|NotShowIn\|OnlyShowIn\|Path\|StartupWMClass\|URL\)\s*=.*\S/
+ \ contains=dtStringKey,dtDelim transparent
+syn keyword dtStringKey
+ \ Actions Implements MimeType NotShowIn OnlyShowIn Path StartupWMClass URL Version
+ \ contained nextgroup=dtDelim
+
+" icon theme
+syn match dtString
+ \ /^\%(Context\|Directories\|Example\|Inherits\)\s*=.*\S/
+ \ contains=dtStringKey,dtDelim transparent
+syn keyword dtStringKey
+ \ Context Directories Example Inherits
+ \ contained nextgroup=dtDelim
+
+if s:desktop_enable_kde
+ syn match dtString
+ \ /^\%(Dev\|DocPath\|FSType\|MountPoint\|ServiceTypes\)\s*=.*\S/
+ \ contains=dtStringKey,dtDelim transparent
+ syn keyword dtStringKey
+ \ Dev DocPath FSType MountPoint ServiceTypes
+ \ contained nextgroup=dtDelim
+endif
+
+" Categories {{{3
+" https://specifications.freedesktop.org/menu-spec/menu-spec-1.0.html#category-registry
+syn match dtCategories /^Categories\s*=.\+\S/ contains=dtCategoriesKey,dtDelim,dtCategoriesValue transparent
+syn keyword dtCategoriesKey
+ \ Categories
+ \ contained nextgroup=dtDelim
+
+" Main Categories
+syn keyword dtCategoriesValue
+ \ Audio AudioVideo Development Education Game Graphics Network Office
+ \ Settings System Utility Video
+ \ contained
+
+" Additional Categories
+syn keyword dtCategoriesValue
+ \ BoardGame Chat Clock Geoscience Presentation 2DGraphics 3DGraphics
+ \ Accessibility ActionGame AdventureGame Amusement ArcadeGame Archiving
+ \ Art ArtificialIntelligence Astronomy AudioVideoEditing Biology
+ \ BlocksGame BoardGame Building Calculator Calendar CardGame Chart Chat
+ \ Chemistry Clock Compression ComputerScience ConsoleOnly Construction
+ \ ContactManagement Core DataVisualization Database Debugger
+ \ DesktopSettings Dialup Dictionary DiscBurning Documentation Economy
+ \ Electricity Electronics Email Emulator Engineering FileManager
+ \ FileTools FileTransfer Filesystem Finance FlowChart GNOME GTK
+ \ GUIDesigner Geography Geology Geoscience HamRadio HardwareSettings
+ \ History IDE IRCClient ImageProcessing InstantMessaging Java KDE
+ \ KidsGame Languages Literature LogicGame Math MedicalSoftware Midi
+ \ Mixer Monitor Motif Music News NumericalAnalysis OCR P2P PDA
+ \ PackageManager ParallelComputing Photography Physics Player
+ \ Presentation Printing Profiling ProjectManagement Publishing Qt
+ \ RasterGraphics Recorder RemoteAccess RevisionControl Robotics
+ \ RolePlaying Scanning Science Security Sequencer Simulation Sports
+ \ SportsGame Spreadsheet StrategyGame TV Telephony TelephonyTools
+ \ TerminalEmulator TextEditor TextTools Translation Tuner VectorGraphics
+ \ VideoConference Viewer WebBrowser WebDevelopment WordProcessor
+ \ contained
+
+" Reserved Category
+syn keyword dtCategoriesValue
+ \ Applet Screensaver Shell TrayIcon
+ \ contained
+
+" Exec/TryExec {{{3
+syn match dtExec /^\%(Exec\|TryExec\)\s*=.\+\S/ contains=dtExecKey,dtDelim,dtExecParam transparent
+syn keyword dtExecKey
+ \ Exec TryExec
+ \ contained nextgroup=dtDelim
+" code for file(s), URL(s), etc
+syn match dtExecParam /\s\zs%[fFuUick]\ze\%(\W\|$\)/ contained
+
+" Type {{{3
+syn match dtType /^Type\s*=\s*\S\+/ contains=dtTypeKey,dtDelim,dtTypeValue transparent
+syn keyword dtTypeKey
+ \ Type
+ \ contained nextgroup=dtDelim
+syn keyword dtTypeValue
+ \ Application Directory Link
+ \ contained
+
+if s:desktop_enable_kde
+ syn keyword dtTypeValue
+ \ FSDevice Service ServiceType
+ \ contained
+endif
+
+
+" Version {{{3
+syn match dtVersion /^Version\s*=\s*\S\+/ contains=dtVersionKey,dtDelim,dtVersionValue transparent
+syn keyword dtVersionKey
+ \ Version
+ \ contained nextgroup=dtDelim
+syn match dtVersionValue /[0-9]\+\%(\.[0-9]\+\)\{1,2}$/ contained
+
+" Localestring Value {{{2
+syn match dtLocalestring
+ \ /^\%(Comment\|GenericName\|Keywords\|Name\)\%(\[.\{-}\]\)\?\s*=.*\S/
+ \ contains=dtLocalestringKey,dtLocaleSuffix,dtDelim transparent
+syn keyword dtLocalestringKey
+ \ Comment GenericName Keywords Name
+ \ contained nextgroup=dtLocaleSuffix,dtDelim skipwhite
+
+" Iconstring Value {{{2
+syn match dtIconstring
+ \ /^Icon\s*=.*\S/
+ \ contains=dtIconstringKey,dtDelim transparent
+syn keyword dtIconstringKey
+ \ Icon
+ \ contained nextgroup=dtDelim skipwhite
+
+if s:desktop_enable_kde
+ syn match dtIconstring
+ \ /^UnmountIcon\>\%(\[.\{-}\]\)\?\s*=.*\S/
+ \ contains=dtIconstringKey,dtLocaleSuffix,dtDelim transparent
+ syn keyword dtIconstringKey
+ \ UnmountIcon
+ \ contained nextgroup=dtLocaleSuffix,dtDelim skipwhite
+endif
+
+" X-Extension {{{2
+syn match dtXExtension /^X-[0-9A-Za-z-]*\%(\[.\{-}\]\)\?\s*=.*\S/
+ \ contains=dtXExtensionKey,dtLocaleSuffix,dtDelim transparent
+syn match dtXExtensionKey /^X-[0-9A-Za-z-]*/ contained nextgroup=dtLocaleSuffix,dtDelim
+
+" non standard {{{2
+if s:desktop_enable_nonstd
+ syn match dtNonStdLabel /^[0-9A-Za-z-]\+\%(\[.\{-}\]\)\?\s*=.*\S/
+ \ contains=dtNonStdLabelKey,dtLocaleSuffix,dtDelim transparent
+ syn match dtNonStdLabelKey /^[0-9A-Za-z-]\+/ contained nextgroup=dtLocaleSuffix,dtDelim
+endif
+
+" Highlight {{{1
+hi def link dtComment Comment
+hi def link dtError Error
+
+hi def link dtGroup Special
+
+hi def link dtDelim Delimiter
+hi def link dtLocaleSuffix Identifier
+
+hi def link dtBooleanKey Type
+hi def link dtBooleanValue Boolean
+
+hi def link dtNumericKey Type
+hi def link dtNumericDecimal Number
+
+hi def link dtStringKey Type
+hi def link dtCategoriesKey Type
+hi def link dtCategoriesValue Constant
+hi def link dtExecKey Type
+hi def link dtExecParam Special
+hi def link dtTypeKey Type
+hi def link dtTypeValue Constant
+hi def link dtVersionKey Type
+hi def link dtVersionValue Constant
+
+hi def link dtLocalestringKey Type
+
+hi def link dtIconStringKey Type
+
+hi def link dtXExtensionKey Type
+
+hi def link dtNonStdLabelKey Type
+
+" Clean Up {{{1
+let b:current_syntax = "desktop"
+let &cpo = s:cpo_save
+
+" vim:ts=8:sw=2:fdm=marker
diff --git a/runtime/syntax/dictconf.vim b/runtime/syntax/dictconf.vim
new file mode 100644
index 0000000..c762808
--- /dev/null
+++ b/runtime/syntax/dictconf.vim
@@ -0,0 +1,80 @@
+" Vim syntax file
+" Language: dict(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword dictconfTodo contained TODO FIXME XXX NOTE
+
+syn region dictconfComment display oneline start='#' end='$'
+ \ contains=dictconfTodo,@Spell
+
+syn match dictconfBegin display '^'
+ \ nextgroup=dictconfKeyword,dictconfComment
+ \ skipwhite
+
+syn keyword dictconfKeyword contained server
+ \ nextgroup=dictconfServer skipwhite
+
+syn keyword dictconfKeyword contained pager
+ \ nextgroup=dictconfPager
+
+syn match dictconfServer contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+ \ nextgroup=dictconfServerOptG skipwhite
+
+syn region dictconfServer contained display oneline
+ \ start=+"+ skip=+""+ end=+"+
+ \ nextgroup=dictconfServerOptG skipwhite
+
+syn region dictconfServerOptG contained transparent
+ \ matchgroup=dictconfServerOptsD start='{'
+ \ matchgroup=dictconfServerOptsD end='}'
+ \ contains=dictconfServerOpts,dictconfComment
+
+syn keyword dictconfServerOpts contained port
+ \ nextgroup=dictconfNumber skipwhite
+
+syn keyword dictconfServerOpts contained user
+ \ nextgroup=dictconfUsername skipwhite
+
+syn match dictconfUsername contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+ \ nextgroup=dictconfSecret skipwhite
+syn region dictconfUsername contained display oneline
+ \ start=+"+ skip=+""+ end=+"+
+ \ nextgroup=dictconfSecret skipwhite
+
+syn match dictconfSecret contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+syn region dictconfSecret contained display oneline
+ \ start=+"+ skip=+""+ end=+"+
+
+syn match dictconfNumber contained '\<\d\+\>'
+
+syn match dictconfPager contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+syn region dictconfPager contained display oneline
+ \ start=+"+ skip=+""+ end=+"+
+
+hi def link dictconfTodo Todo
+hi def link dictconfComment Comment
+hi def link dictconfKeyword Keyword
+hi def link dictconfServer String
+hi def link dictconfServerOptsD Delimiter
+hi def link dictconfServerOpts Identifier
+hi def link dictconfUsername String
+hi def link dictconfSecret Special
+hi def link dictconfNumber Number
+hi def link dictconfPager String
+
+let b:current_syntax = "dictconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/dictdconf.vim b/runtime/syntax/dictdconf.vim
new file mode 100644
index 0000000..ecf5fd3
--- /dev/null
+++ b/runtime/syntax/dictdconf.vim
@@ -0,0 +1,146 @@
+" Vim syntax file
+" Language: dictd(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword dictdconfTodo contained TODO FIXME XXX NOTE
+
+syn region dictdconfComment display oneline start='#' end='$'
+ \ contains=dictdconfTodo,dictdconfSpecialC,
+ \ @Spell
+
+syn keyword dictdconfSpecialC LASTLINE
+
+syn match dictdconfBegin display '^'
+ \ nextgroup=dictdconfKeyword,dictdconfComment
+ \ skipwhite
+
+syn keyword dictdconfKeyword contained access
+ \ nextgroup=dictdconfAccessG skipwhite
+
+syn region dictdconfAccessG contained transparent
+ \ matchgroup=dictdconfDelimiter start='{'
+ \ matchgroup=dictdconfDelimiter end='}'
+ \ contains=dictdconfAccess,dictdconfComment
+
+syn keyword dictdconfAccess contained allow deny authonly user
+ \ nextgroup=dictdconfString skipwhite
+
+syn keyword dictdconfKeyword contained database
+ \ nextgroup=dictdconfDatabase skipwhite
+
+syn match dictdconfDatabase contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+ \ nextgroup=dictdconfSpecG skipwhite
+syn region dictdconfDatabase contained display oneline
+ \ start=+"+ skip=+""\|\\\\\|\\"+ end=+"+
+ \ nextgroup=dictdconfSpecG skipwhite
+
+syn region dictdconfSpecG contained transparent
+ \ matchgroup=dictdconfDelimiter start='{'
+ \ matchgroup=dictdconfDelimiter end='}'
+ \ contains=dictdconfSpec,dictdconfAccess,
+ \ dictdconfComment
+
+syn keyword dictdconfSpec contained data index index_suffix index_word
+ \ filter prefilter postfilter name info
+ \ disable_strat
+ \ nextgroup=dictdconfString skipwhite
+
+syn keyword dictdconfSpec contained invisible
+
+syn keyword dictdconfKeyword contained database_virtual
+ \ nextgroup=dictdconfVDatabase skipwhite
+
+syn match dictdconfVDatabase contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+ \ nextgroup=dictdconfVSpecG skipwhite
+syn region dictdconfVDatabase contained display oneline
+ \ start=+"+ skip=+""\|\\\\\|\\"+ end=+"+
+ \ nextgroup=dictdconfVSpecG skipwhite
+
+syn region dictdconfVSpecG contained transparent
+ \ matchgroup=dictdconfDelimiter start='{'
+ \ matchgroup=dictdconfDelimiter end='}'
+ \ contains=dictdconfVSpec,dictdconfAccess,
+ \ dictdconfComment
+
+syn keyword dictdconfVSpec contained name info database_list disable_strat
+ \ nextgroup=dictdconfString skipwhite
+
+syn keyword dictdconfVSpec contained invisible
+
+syn keyword dictdconfKeyword contained database_plugin
+ \ nextgroup=dictdconfPDatabase skipwhite
+
+syn match dictdconfPDatabase contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+ \ nextgroup=dictdconfPSpecG skipwhite
+syn region dictdconfPDatabase contained display oneline
+ \ start=+"+ skip=+""\|\\\\\|\\"+ end=+"+
+ \ nextgroup=dictdconfPSpecG skipwhite
+
+syn region dictdconfPSpecG contained transparent
+ \ matchgroup=dictdconfDelimiter start='{'
+ \ matchgroup=dictdconfDelimiter end='}'
+ \ contains=dictdconfPSpec,dictdconfAccess,
+ \ dictdconfComment
+
+syn keyword dictdconfPSpec contained name info plugin data disable_strat
+ \ nextgroup=dictdconfString skipwhite
+
+syn keyword dictdconfPSpec contained invisible
+
+syn keyword dictdconfKeyword contained database_exit
+
+syn keyword dictdconfKeyword contained site
+ \ nextgroup=dictdconfString skipwhite
+
+syn keyword dictdconfKeyword contained user
+ \ nextgroup=dictdconfUsername skipwhite
+
+syn match dictdconfUsername contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+ \ nextgroup=dictdconfSecret skipwhite
+syn region dictdconfUsername contained display oneline
+ \ start=+"+ skip=+""+ end=+"+
+ \ nextgroup=dictdconfSecret skipwhite
+
+syn match dictdconfSecret contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+syn region dictdconfSecret contained display oneline
+ \ start=+"+ skip=+""+ end=+"+
+
+syn match dictdconfString contained display
+ \ '[[:alnum:]_/.*-][[:alnum:]_/.*-]*'
+syn region dictdconfString contained display oneline
+ \ start=+"+ skip=+""\|\\\\\|\\"+ end=+"+
+
+hi def link dictdconfTodo Todo
+hi def link dictdconfComment Comment
+hi def link dictdconfSpecialC Special
+hi def link dictdconfKeyword Keyword
+hi def link dictdconfIdentifier Identifier
+hi def link dictdconfAccess dictdconfIdentifier
+hi def link dictdconfDatabase dictdconfString
+hi def link dictdconfSpec dictdconfIdentifier
+hi def link dictdconfVDatabase dictdconfDatabase
+hi def link dictdconfVSpec dictdconfSpec
+hi def link dictdconfPDatabase dictdconfDatabase
+hi def link dictdconfPSpec dictdconfSpec
+hi def link dictdconfUsername dictdconfString
+hi def link dictdconfSecret Special
+hi def link dictdconfString String
+hi def link dictdconfDelimiter Delimiter
+
+let b:current_syntax = "dictdconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/diff.vim b/runtime/syntax/diff.vim
new file mode 100644
index 0000000..408556a
--- /dev/null
+++ b/runtime/syntax/diff.vim
@@ -0,0 +1,389 @@
+" Vim syntax file
+" Language: Diff (context or unified)
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Translations by Jakson Alves de Aquino.
+" Last Change: 2020 Dec 30
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+scriptencoding utf-8
+
+syn match diffOnly "^Only in .*"
+syn match diffIdentical "^Files .* and .* are identical$"
+syn match diffDiffer "^Files .* and .* differ$"
+syn match diffBDiffer "^Binary files .* and .* differ$"
+syn match diffIsA "^File .* is a .* while file .* is a .*"
+syn match diffNoEOL "^\\ No newline at end of file .*"
+syn match diffCommon "^Common subdirectories: .*"
+
+" Disable the translations by setting diff_translations to zero.
+if !exists("diff_translations") || diff_translations
+
+" ca
+syn match diffOnly "^Només a .*"
+syn match diffIdentical "^Els fitxers .* i .* són idèntics$"
+syn match diffDiffer "^Els fitxers .* i .* difereixen$"
+syn match diffBDiffer "^Els fitxers .* i .* difereixen$"
+syn match diffIsA "^El fitxer .* és un .* mentre que el fitxer .* és un .*"
+syn match diffNoEOL "^\\ No hi ha cap caràcter de salt de línia al final del fitxer"
+syn match diffCommon "^Subdirectoris comuns: .* i .*"
+
+" cs
+syn match diffOnly "^Pouze v .*"
+syn match diffIdentical "^Soubory .* a .* jsou identické$"
+syn match diffDiffer "^Soubory .* a .* jsou různé$"
+syn match diffBDiffer "^Binární soubory .* a .* jsou rozdílné$"
+syn match diffBDiffer "^Soubory .* a .* jsou různé$"
+syn match diffIsA "^Soubor .* je .* pokud soubor .* je .*"
+syn match diffNoEOL "^\\ Chybí znak konce řádku na konci souboru"
+syn match diffCommon "^Společné podadresáře: .* a .*"
+
+" da
+syn match diffOnly "^Kun i .*"
+syn match diffIdentical "^Filerne .* og .* er identiske$"
+syn match diffDiffer "^Filerne .* og .* er forskellige$"
+syn match diffBDiffer "^Binære filer .* og .* er forskellige$"
+syn match diffIsA "^Filen .* er en .* mens filen .* er en .*"
+syn match diffNoEOL "^\\ Intet linjeskift ved filafslutning"
+syn match diffCommon "^Identiske underkataloger: .* og .*"
+
+" de
+syn match diffOnly "^Nur in .*"
+syn match diffIdentical "^Dateien .* und .* sind identisch.$"
+syn match diffDiffer "^Dateien .* und .* sind verschieden.$"
+syn match diffBDiffer "^Binärdateien .* and .* sind verschieden.$"
+syn match diffBDiffer "^Binärdateien .* und .* sind verschieden.$"
+syn match diffIsA "^Datei .* ist ein .* während Datei .* ein .* ist.$"
+syn match diffNoEOL "^\\ Kein Zeilenumbruch am Dateiende."
+syn match diffCommon "^Gemeinsame Unterverzeichnisse: .* und .*.$"
+
+" el
+syn match diffOnly "^Μόνο στο .*"
+syn match diffIdentical "^Τα αρχεία .* καί .* είναι πανομοιότυπα$"
+syn match diffDiffer "^Τα αρχεία .* και .* διαφέρουν$"
+syn match diffBDiffer "^Τα αρχεία .* και .* διαφέρουν$"
+syn match diffIsA "^Το αρχείο .* είναι .* ενώ το αρχείο .* είναι .*"
+syn match diffNoEOL "^\\ Δεν υπάρχει χαρακτήρας νέας γραμμής στο τέλος του αρχείου"
+syn match diffCommon "^Οι υποκατάλογοι .* και .* είναι ταυτόσημοι$"
+
+" eo
+syn match diffOnly "^Nur en .*"
+syn match diffIdentical "^Dosieroj .* kaj .* estas samaj$"
+syn match diffDiffer "^Dosieroj .* kaj .* estas malsamaj$"
+syn match diffBDiffer "^Dosieroj .* kaj .* estas malsamaj$"
+syn match diffIsA "^Dosiero .* estas .*, dum dosiero .* estas .*"
+syn match diffNoEOL "^\\ Mankas linifino ĉe fino de dosiero"
+syn match diffCommon "^Komunaj subdosierujoj: .* kaj .*"
+
+" es
+syn match diffOnly "^Sólo en .*"
+syn match diffIdentical "^Los ficheros .* y .* son idénticos$"
+syn match diffDiffer "^Los ficheros .* y .* son distintos$"
+syn match diffBDiffer "^Los ficheros binarios .* y .* son distintos$"
+syn match diffIsA "^El fichero .* es un .* mientras que el .* es un .*"
+syn match diffNoEOL "^\\ No hay ningún carácter de nueva línea al final del fichero"
+syn match diffCommon "^Subdirectorios comunes: .* y .*"
+
+" fi
+syn match diffOnly "^Vain hakemistossa .*"
+syn match diffIdentical "^Tiedostot .* ja .* ovat identtiset$"
+syn match diffDiffer "^Tiedostot .* ja .* eroavat$"
+syn match diffBDiffer "^Binääritiedostot .* ja .* eroavat$"
+syn match diffIsA "^Tiedosto .* on .*, kun taas tiedosto .* on .*"
+syn match diffNoEOL "^\\ Ei rivinvaihtoa tiedoston lopussa"
+syn match diffCommon "^Yhteiset alihakemistot: .* ja .*"
+
+" fr
+syn match diffOnly "^Seulement dans .*"
+syn match diffIdentical "^Les fichiers .* et .* sont identiques.*"
+syn match diffDiffer "^Les fichiers .* et .* sont différents.*"
+syn match diffBDiffer "^Les fichiers binaires .* et .* sont différents.*"
+syn match diffIsA "^Le fichier .* est un .* alors que le fichier .* est un .*"
+syn match diffNoEOL "^\\ Pas de fin de ligne à la fin du fichier.*"
+syn match diffCommon "^Les sous-répertoires .* et .* sont identiques.*"
+
+" ga
+syn match diffOnly "^I .* amháin: .*"
+syn match diffIdentical "^Is comhionann iad na comhaid .* agus .*"
+syn match diffDiffer "^Tá difríocht idir na comhaid .* agus .*"
+syn match diffBDiffer "^Tá difríocht idir na comhaid .* agus .*"
+syn match diffIsA "^Tá comhad .* ina .* ach tá comhad .* ina .*"
+syn match diffNoEOL "^\\ Gan líne nua ag an chomhadchríoch"
+syn match diffCommon "^Fochomhadlanna i gcoitianta: .* agus .*"
+
+" gl
+syn match diffOnly "^Só en .*"
+syn match diffIdentical "^Os ficheiros .* e .* son idénticos$"
+syn match diffDiffer "^Os ficheiros .* e .* son diferentes$"
+syn match diffBDiffer "^Os ficheiros binarios .* e .* son diferentes$"
+syn match diffIsA "^O ficheiro .* é un .* mentres que o ficheiro .* é un .*"
+syn match diffNoEOL "^\\ Non hai un salto de liña na fin da liña"
+syn match diffCommon "^Subdirectorios comúns: .* e .*"
+
+" he
+" ^.* are expansive patterns for long lines, so disabled unless we can match
+" some specific hebrew chars
+if search('\%u05d5\|\%u05d1', 'nw', '', 100)
+ syn match diffOnly "^.*-ב קר אצמנ .*"
+ syn match diffIdentical "^םיהז םניה .*-ו .* םיצבקה$"
+ syn match diffDiffer "^הזמ הז םינוש `.*'-ו `.*' םיצבקה$"
+ syn match diffBDiffer "^הזמ הז םינוש `.*'-ו `.*' םיירניב םיצבק$"
+ syn match diffIsA "^.* .*-ל .* .* תוושהל ןתינ אל$"
+ syn match diffNoEOL "^\\ ץבוקה ףוסב השד.-הרוש ות רס."
+ syn match diffCommon "^.*-ו .* :תוהז תויקית-תת$"
+endif
+
+" hr
+syn match diffOnly "^Samo u .*"
+syn match diffIdentical "^Datoteke .* i .* su identične$"
+syn match diffDiffer "^Datoteke .* i .* se razlikuju$"
+syn match diffBDiffer "^Binarne datoteke .* i .* se razlikuju$"
+syn match diffIsA "^Datoteka .* je .*, a datoteka .* je .*"
+syn match diffNoEOL "^\\ Nema novog retka na kraju datoteke"
+syn match diffCommon "^Uobičajeni poddirektoriji: .* i .*"
+
+" hu
+syn match diffOnly "^Csak .* -ben: .*"
+syn match diffIdentical "^.* és .* fájlok azonosak$"
+syn match diffDiffer "^A(z) .* és a(z) .* fájlok különböznek$"
+syn match diffBDiffer "^A(z) .* és a(z) .* fájlok különböznek$"
+syn match diffIsA "^A(z) .* fájl egy .*, viszont a(z) .* fájl egy .*"
+syn match diffNoEOL "^\\ Nincs újsor a fájl végén"
+syn match diffCommon "^Közös alkönyvtárak: .* és .*"
+
+" id
+syn match diffOnly "^Hanya dalam .*"
+syn match diffIdentical "^File .* dan .* identik$"
+syn match diffDiffer "^Berkas .* dan .* berbeda$"
+syn match diffBDiffer "^File biner .* dan .* berbeda$"
+syn match diffIsA "^File .* adalah .* sementara file .* adalah .*"
+syn match diffNoEOL "^\\ Tidak ada baris-baru di akhir dari berkas"
+syn match diffCommon "^Subdirektori sama: .* dan .*"
+
+" it
+syn match diffOnly "^Solo in .*"
+syn match diffIdentical "^I file .* e .* sono identici$"
+syn match diffDiffer "^I file .* e .* sono diversi$"
+syn match diffBDiffer "^I file .* e .* sono diversi$"
+syn match diffBDiffer "^I file binari .* e .* sono diversi$"
+syn match diffIsA "^File .* è un .* mentre file .* è un .*"
+syn match diffNoEOL "^\\ Manca newline alla fine del file"
+syn match diffCommon "^Sottodirectory in comune: .* e .*"
+
+" ja
+syn match diffOnly "^.*だけに発見: .*"
+syn match diffIdentical "^ファイル.*と.*は同一$"
+syn match diffDiffer "^ファイル.*と.*は違います$"
+syn match diffBDiffer "^バイナリー・ファイル.*と.*は違います$"
+syn match diffIsA "^ファイル.*は.*、ファイル.*は.*"
+syn match diffNoEOL "^\\ ファイル末尾に改行がありません"
+syn match diffCommon "^共通の下位ディレクトリー: .*と.*"
+
+" ja DiffUtils 3.3
+syn match diffOnly "^.* のみに存在: .*"
+syn match diffIdentical "^ファイル .* と .* は同一です$"
+syn match diffDiffer "^ファイル .* と .* は異なります$"
+syn match diffBDiffer "^バイナリーファイル .* と.* は異なります$"
+syn match diffIsA "^ファイル .* は .* です。一方、ファイル .* は .* です$"
+syn match diffNoEOL "^\\ ファイル末尾に改行がありません"
+syn match diffCommon "^共通のサブディレクトリー: .* と .*"
+
+" lv
+syn match diffOnly "^Tikai iekš .*"
+syn match diffIdentical "^Fails .* un .* ir identiski$"
+syn match diffDiffer "^Faili .* un .* atšķiras$"
+syn match diffBDiffer "^Faili .* un .* atšķiras$"
+syn match diffBDiffer "^Binārie faili .* un .* atšķiras$"
+syn match diffIsA "^Fails .* ir .* kamēr fails .* ir .*"
+syn match diffNoEOL "^\\ Nav jaunu rindu faila beigās"
+syn match diffCommon "^Kopējās apakšdirektorijas: .* un .*"
+
+" ms
+syn match diffOnly "^Hanya dalam .*"
+syn match diffIdentical "^Fail .* dan .* adalah serupa$"
+syn match diffDiffer "^Fail .* dan .* berbeza$"
+syn match diffBDiffer "^Fail .* dan .* berbeza$"
+syn match diffIsA "^Fail .* adalah .* manakala fail .* adalah .*"
+syn match diffNoEOL "^\\ Tiada baris baru pada penghujung fail"
+syn match diffCommon "^Subdirektori umum: .* dan .*"
+
+" nl
+syn match diffOnly "^Alleen in .*"
+syn match diffIdentical "^Bestanden .* en .* zijn identiek$"
+syn match diffDiffer "^Bestanden .* en .* zijn verschillend$"
+syn match diffBDiffer "^Bestanden .* en .* zijn verschillend$"
+syn match diffBDiffer "^Binaire bestanden .* en .* zijn verschillend$"
+syn match diffIsA "^Bestand .* is een .* terwijl bestand .* een .* is$"
+syn match diffNoEOL "^\\ Geen regeleindeteken (LF) aan einde van bestand"
+syn match diffCommon "^Gemeenschappelijke submappen: .* en .*"
+
+" pl
+syn match diffOnly "^Tylko w .*"
+syn match diffIdentical "^Pliki .* i .* są identyczne$"
+syn match diffDiffer "^Pliki .* i .* różnią się$"
+syn match diffBDiffer "^Pliki .* i .* różnią się$"
+syn match diffBDiffer "^Binarne pliki .* i .* różnią się$"
+syn match diffIsA "^Plik .* jest .*, podczas gdy plik .* jest .*"
+syn match diffNoEOL "^\\ Brak znaku nowej linii na końcu pliku"
+syn match diffCommon "^Wspólne podkatalogi: .* i .*"
+
+" pt_BR
+syn match diffOnly "^Somente em .*"
+syn match diffOnly "^Apenas em .*"
+syn match diffIdentical "^Os aquivos .* e .* são idênticos$"
+syn match diffDiffer "^Os arquivos .* e .* são diferentes$"
+syn match diffBDiffer "^Os arquivos binários .* e .* são diferentes$"
+syn match diffIsA "^O arquivo .* é .* enquanto o arquivo .* é .*"
+syn match diffNoEOL "^\\ Falta o caracter nova linha no final do arquivo"
+syn match diffCommon "^Subdiretórios idênticos: .* e .*"
+
+" ro
+syn match diffOnly "^Doar în .*"
+syn match diffIdentical "^Fişierele .* şi .* sunt identice$"
+syn match diffDiffer "^Fişierele .* şi .* diferă$"
+syn match diffBDiffer "^Fişierele binare .* şi .* diferă$"
+syn match diffIsA "^Fişierul .* este un .* pe când fişierul .* este un .*.$"
+syn match diffNoEOL "^\\ Nici un element de linie nouă la sfârşitul fişierului"
+syn match diffCommon "^Subdirectoare comune: .* şi .*.$"
+
+" ru
+syn match diffOnly "^Только в .*"
+syn match diffIdentical "^Файлы .* и .* идентичны$"
+syn match diffDiffer "^Файлы .* и .* различаются$"
+syn match diffBDiffer "^Файлы .* и .* различаются$"
+syn match diffIsA "^Файл .* это .*, тогда как файл .* -- .*"
+syn match diffNoEOL "^\\ В конце файла нет новой строки"
+syn match diffCommon "^Общие подкаталоги: .* и .*"
+
+" sr
+syn match diffOnly "^Само у .*"
+syn match diffIdentical "^Датотеке „.*“ и „.*“ се подударају$"
+syn match diffDiffer "^Датотеке .* и .* различите$"
+syn match diffBDiffer "^Бинарне датотеке .* и .* различите$"
+syn match diffIsA "^Датотека „.*“ је „.*“ док је датотека „.*“ „.*“$"
+syn match diffNoEOL "^\\ Без новог реда на крају датотеке"
+syn match diffCommon "^Заједнички поддиректоријуми: .* и .*"
+
+" sv
+syn match diffOnly "^Endast i .*"
+syn match diffIdentical "^Filerna .* och .* är lika$"
+syn match diffDiffer "^Filerna .* och .* skiljer$"
+syn match diffBDiffer "^Filerna .* och .* skiljer$"
+syn match diffIsA "^Fil .* är en .* medan fil .* är en .*"
+syn match diffBDiffer "^De binära filerna .* och .* skiljer$"
+syn match diffIsA "^Filen .* är .* medan filen .* är .*"
+syn match diffNoEOL "^\\ Ingen nyrad vid filslut"
+syn match diffCommon "^Lika underkataloger: .* och .*"
+
+" tr
+syn match diffOnly "^Yalnızca .*'da: .*"
+syn match diffIdentical "^.* ve .* dosyaları birbirinin aynı$"
+syn match diffDiffer "^.* ve .* dosyaları birbirinden farklı$"
+syn match diffBDiffer "^.* ve .* dosyaları birbirinden farklı$"
+syn match diffBDiffer "^İkili .* ve .* birbirinden farklı$"
+syn match diffIsA "^.* dosyası, bir .*, halbuki .* dosyası bir .*"
+syn match diffNoEOL "^\\ Dosya sonunda yenisatır yok."
+syn match diffCommon "^Ortak alt dizinler: .* ve .*"
+
+" uk
+syn match diffOnly "^Лише у .*"
+syn match diffIdentical "^Файли .* та .* ідентичні$"
+syn match diffDiffer "^Файли .* та .* відрізняються$"
+syn match diffBDiffer "^Файли .* та .* відрізняються$"
+syn match diffBDiffer "^Двійкові файли .* та .* відрізняються$"
+syn match diffIsA "^Файл .* це .*, тоді як файл .* -- .*"
+syn match diffNoEOL "^\\ Наприкінці файлу немає нового рядка"
+syn match diffCommon "^Спільні підкаталоги: .* та .*"
+
+" vi
+syn match diffOnly "^Chỉ trong .*"
+syn match diffIdentical "^Hai tập tin .* và .* là bằng nhau.$"
+syn match diffIdentical "^Cả .* và .* là cùng một tập tin$"
+syn match diffDiffer "^Hai tập tin .* và .* là khác nhau.$"
+syn match diffBDiffer "^Hai tập tin nhị phân .* và .* khác nhau$"
+syn match diffIsA "^Tập tin .* là một .* trong khi tập tin .* là một .*.$"
+syn match diffBDiffer "^Hai tập tin .* và .* là khác nhau.$"
+syn match diffIsA "^Tập tin .* là một .* còn tập tin .* là một .*.$"
+syn match diffNoEOL "^\\ Không có ký tự dòng mới tại kêt thức tập tin."
+syn match diffCommon "^Thư mục con chung: .* và .*"
+
+" zh_CN
+syn match diffOnly "^只在 .* 存在:.*"
+syn match diffIdentical "^檔案 .* 和 .* 相同$"
+syn match diffDiffer "^文件 .* 和 .* 不同$"
+syn match diffBDiffer "^文件 .* 和 .* 不同$"
+syn match diffIsA "^文件 .* 是.*而文件 .* 是.*"
+syn match diffNoEOL "^\\ 文件尾没有 newline 字符"
+syn match diffCommon "^.* 和 .* 有共同的子目录$"
+
+" zh_TW
+syn match diffOnly "^只在 .* 存在:.*"
+syn match diffIdentical "^檔案 .* 和 .* 相同$"
+syn match diffDiffer "^檔案 .* 與 .* 不同$"
+syn match diffBDiffer "^二元碼檔 .* 與 .* 不同$"
+syn match diffIsA "^檔案 .* 是.*而檔案 .* 是.*"
+syn match diffNoEOL "^\\ 檔案末沒有 newline 字元"
+syn match diffCommon "^.* 和 .* 有共同的副目錄$"
+
+endif
+
+
+syn match diffRemoved "^-.*"
+syn match diffRemoved "^<.*"
+syn match diffAdded "^+.*"
+syn match diffAdded "^>.*"
+syn match diffChanged "^! .*"
+
+syn match diffSubname " @@..*"ms=s+3 contained
+syn match diffLine "^@.*" contains=diffSubname
+syn match diffLine "^\<\d\+\>.*"
+syn match diffLine "^\*\*\*\*.*"
+syn match diffLine "^---$"
+
+" 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\>.*"
+syn match diffFile "^Index: .*"
+syn match diffFile "^==== .*"
+
+if search('^@@ -\S\+ +\S\+ @@', 'nw', '', 100)
+ " unified
+ syn match diffOldFile "^--- .*"
+ syn match diffNewFile "^+++ .*"
+else
+ " context / old style
+ syn match diffOldFile "^\*\*\* .*"
+ syn match diffNewFile "^--- .*"
+endif
+
+" 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
+hi def link diffDiffer Constant
+hi def link diffBDiffer Constant
+hi def link diffIsA Constant
+hi def link diffNoEOL Constant
+hi def link diffCommon Constant
+hi def link diffRemoved Special
+hi def link diffChanged PreProc
+hi def link diffAdded Identifier
+hi def link diffLine Statement
+hi def link diffSubname PreProc
+hi def link diffComment Comment
+
+let b:current_syntax = "diff"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/dircolors.vim b/runtime/syntax/dircolors.vim
new file mode 100644
index 0000000..24bc31f
--- /dev/null
+++ b/runtime/syntax/dircolors.vim
@@ -0,0 +1,222 @@
+" Vim syntax file
+" Language: dircolors(1) input file
+" Maintainer: Jan Larres <jan@majutsushi.net>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2018-02-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syntax keyword dircolorsTodo FIXME TODO XXX NOTE contained
+
+syntax region dircolorsComment start='#' end='$' contains=dircolorsTodo,@Spell
+
+syntax keyword dircolorsKeyword TERM LEFT LEFTCODE RIGHT RIGHTCODE END ENDCODE
+
+syntax keyword dircolorsKeyword NORMAL NORM FILE RESET DIR LNK LINK SYMLINK
+ \ MULTIHARDLINK FIFO SOCK DOOR BLK CHR ORPHAN
+ \ MISSING PIPE BLOCK CHR EXEC SETUID SETGID
+ \ CAPABILITY STICKY_OTHER_WRITABLE
+ \ OTHER_WRITABLE STICKY
+
+" Slackware only, ignored by GNU dircolors.
+syntax keyword dircolorsKeyword COLOR OPTIONS EIGHTBIT
+
+syntax match dircolorsExtension '^\s*\zs[.*]\S\+'
+
+syntax match dircolorsEscape '\\[abefnrtv?_\\^#]'
+syntax match dircolorsEscape '\\[0-9]\{3}'
+syntax match dircolorsEscape '\\x[0-9a-f]\{3}'
+
+if !has('gui_running') && &t_Co == ''
+ syntax match dircolorsNumber '\<\d\+\>'
+ highlight default link dircolorsNumber Number
+endif
+
+highlight default link dircolorsTodo Todo
+highlight default link dircolorsComment Comment
+highlight default link dircolorsKeyword Keyword
+highlight default link dircolorsExtension Identifier
+highlight default link dircolorsEscape Special
+
+function! s:set_guicolors() abort
+ let s:termguicolors = {}
+
+ let s:termguicolors[0] = "Black"
+ let s:termguicolors[1] = "DarkRed"
+ let s:termguicolors[2] = "DarkGreen"
+ let s:termguicolors[3] = "DarkYellow"
+ let s:termguicolors[4] = "DarkBlue"
+ let s:termguicolors[5] = "DarkMagenta"
+ let s:termguicolors[6] = "DarkCyan"
+ let s:termguicolors[7] = "Gray"
+ let s:termguicolors[8] = "DarkGray"
+ let s:termguicolors[9] = "Red"
+ let s:termguicolors[10] = "Green"
+ let s:termguicolors[11] = "Yellow"
+ let s:termguicolors[12] = "Blue"
+ let s:termguicolors[13] = "Magenta"
+ let s:termguicolors[14] = "Cyan"
+ let s:termguicolors[15] = "White"
+
+ let xterm_palette = ["00", "5f", "87", "af", "d7", "ff"]
+
+ let cur_col = 16
+
+ for r in xterm_palette
+ for g in xterm_palette
+ for b in xterm_palette
+ let s:termguicolors[cur_col] = '#' . r . g . b
+ let cur_col += 1
+ endfor
+ endfor
+ endfor
+
+ for i in range(24)
+ let g = i * 0xa + 8
+ let s:termguicolors[i + 232] = '#' . g . g . g
+ endfor
+endfunction
+
+function! s:get_hi_str(color, place) abort
+ if a:color >= 0 && a:color <= 255
+ if has('gui_running')
+ return ' gui' . a:place . '=' . s:termguicolors[a:color]
+ elseif a:color <= 7 || &t_Co == 256 || &t_Co == 88
+ return ' cterm' . a:place . '=' . a:color
+ endif
+ endif
+ return ''
+endfunction
+
+function! s:get_256color(colors) abort
+ if len(a:colors) >= 2 " May be fewer while editing
+ let [_five, color] = remove(a:colors, 0, 1)
+ if _five != '5' || color == ''
+ return -1
+ else
+ return str2nr(color)
+ endif
+ else
+ return -1
+ endif
+endfunction
+
+function! s:preview_color(linenr) abort
+ let line = getline(a:linenr)
+ let defline = matchlist(line, '^\v([A-Z_]+|[*.]\S+)\s+([0-9;]+)')
+ if empty(defline)
+ return
+ endif
+
+ let colordef = defline[2]
+
+ let colors = split(colordef, ';')
+
+ let hi_str = ''
+ let hi_attrs = []
+ while len(colors) > 0
+ let item = str2nr(remove(colors, 0))
+ if item == 1
+ call add(hi_attrs, 'bold')
+ elseif item == 3
+ call add(hi_attrs, 'italic')
+ elseif item == 4
+ call add(hi_attrs, 'underline')
+ elseif item == 7
+ call add(hi_attrs, 'inverse')
+ elseif item >= 30 && item <= 37
+ " ANSI SGR foreground color
+ let hi_str .= s:get_hi_str(item - 30, 'fg')
+ 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)
+ if color == -1
+ break
+ endif
+ let hi_str .= s:get_hi_str(color, 'fg')
+ elseif item == 48
+ " Background for terminals with 88/256 color support
+ let color = s:get_256color(colors)
+ if color == -1
+ break
+ endif
+ let hi_str .= s:get_hi_str(color, 'bg')
+ endif
+ endwhile
+
+ if hi_str == '' && empty(hi_attrs)
+ return
+ endif
+
+ " Check whether we have already defined this color
+ redir => s:currentmatch
+ silent! execute 'syntax list'
+ redir END
+
+ if s:currentmatch !~# '\/\\_s\\zs' . colordef . '\\ze\\_s\/'
+ " Append the buffer number to avoid problems with other dircolors
+ " buffers interfering
+ let bufnr = bufnr('%')
+ execute 'syntax match dircolorsColor' . b:dc_next_index . '_' . bufnr .
+ \ ' "\_s\zs' . colordef . '\ze\_s"'
+ let hi_attrs_str = ''
+ if !empty(hi_attrs)
+ if has('gui_running')
+ let hi_attrs_str = ' gui=' . join(hi_attrs, ',')
+ else
+ let hi_attrs_str = ' cterm=' . join(hi_attrs, ',')
+ endif
+ endif
+ execute 'highlight default dircolorsColor' . b:dc_next_index . '_' .
+ \ bufnr . hi_str . hi_attrs_str
+ let b:dc_next_index += 1
+ endif
+endfunction
+
+" Avoid accumulating too many definitions while editing
+function! s:reset_colors() abort
+ if b:dc_next_index > 0
+ let bufnr = bufnr('%')
+ for i in range(b:dc_next_index)
+ execute 'syntax clear dircolorsColor' . i . '_' . bufnr
+ execute 'highlight clear dircolorsColor' . i . '_' . bufnr
+ endfor
+ let b:dc_next_index = 0
+ endif
+
+ for linenr in range(1, line('$'))
+ call s:preview_color(linenr)
+ endfor
+endfunction
+
+let b:dc_next_index = 0
+
+if has('gui_running')
+ call s:set_guicolors()
+endif
+
+if has('gui_running') || &t_Co != ''
+ call s:reset_colors()
+
+ autocmd CursorMoved,CursorMovedI <buffer> call s:preview_color('.')
+ autocmd CursorHold,CursorHoldI <buffer> call s:reset_colors()
+endif
+
+let b:current_syntax = "dircolors"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/dirpager.vim b/runtime/syntax/dirpager.vim
new file mode 100644
index 0000000..dc8b986
--- /dev/null
+++ b/runtime/syntax/dirpager.vim
@@ -0,0 +1,56 @@
+" Vim syntax file
+" Maintainer: Thilo Six
+" Contact: <vim-dev at vim dot org>
+" http://www.vim.org/maillist.php#vim-dev
+"
+" Description: display directory content inside Vim with syntax
+" highlighting
+" File: runtime/syntax/dirpager.vim
+" Last Change: 2022 Jun 14
+" Modeline: vim: ts=8:sw=2:sts=2:
+"
+" Credits: dirpager.vim is derived from Nikolai Weibulls dircolors.vim
+"
+" License: VIM License
+" Vim is Charityware, see ":help Uganda"
+"
+" Usage: $ ls -la | view -c "set ft=dirpager" -
+"
+"
+",----[ ls(1posix) ]--------------------------------------------------
+"
+" The <entry type> character shall describe the type of file, as
+" follows:
+"
+" d Directory.
+" b Block special file.
+" c Character special file.
+" l (ell) Symbolic link.
+" p FIFO.
+" - Regular file.
+"
+
+if exists("b:current_syntax") || &compatible
+ finish
+endif
+
+setlocal nowrap
+
+syn keyword DirPagerTodo contained FIXME TODO XXX NOTE
+
+syn region DirPagerExe start='^...x\|^......x\|^.........x' end='$' contains=DirPagerTodo,@Spell
+syn region DirPagerDir start='^d' end='$' contains=DirPagerTodo,@Spell
+syn region DirPagerLink start='^l' end='$' contains=DirPagerTodo,@Spell
+syn region DirPagerSpecial start='^b' end='$' contains=DirPagerTodo,@Spell
+syn region DirPagerSpecial start='^c' end='$' contains=DirPagerTodo,@Spell
+syn region DirPagerFifo start='^p' end='$' contains=DirPagerTodo,@Spell
+
+hi def link DirPagerTodo Todo
+hi def DirPagerExe ctermfg=Green guifg=Green
+hi def DirPagerDir ctermfg=Blue guifg=Blue
+hi def DirPagerLink ctermfg=Cyan guifg=Cyan
+hi def DirPagerSpecial ctermfg=Yellow guifg=Yellow
+hi def DirPagerFifo ctermfg=Brown guifg=Brown
+
+let b:current_syntax = "dirpager"
+
diff --git a/runtime/syntax/diva.vim b/runtime/syntax/diva.vim
new file mode 100644
index 0000000..127a0b4
--- /dev/null
+++ b/runtime/syntax/diva.vim
@@ -0,0 +1,96 @@
+" Vim syntax file
+" Language: SKILL for Diva
+" Maintainer: Toby Schaffer <jtschaff@eos.ncsu.edu>
+" Last Change: 2001 May 09
+" Comments: SKILL is a Lisp-like programming language for use in EDA
+" tools from Cadence Design Systems. It allows you to have
+" a programming environment within the Cadence environment
+" that gives you access to the complete tool set and design
+" database. These items are for Diva verification rules decks.
+
+" Don't remove any old syntax stuff hanging around! We need stuff
+" from skill.vim.
+if !exists("did_skill_syntax_inits")
+ runtime! syntax/skill.vim
+endif
+
+syn keyword divaDRCKeywords area enc notch ovlp sep width
+syn keyword divaDRCKeywords app diffNet length lengtha lengthb
+syn keyword divaDRCKeywords notParallel only_perp opposite parallel
+syn keyword divaDRCKeywords sameNet shielded with_perp
+syn keyword divaDRCKeywords edge edgea edgeb fig figa figb
+syn keyword divaDRCKeywords normalGrow squareGrow message raw
+syn keyword divaMeasKeywords perimeter length bends_all bends_full
+syn keyword divaMeasKeywords bends_part corners_all corners_full
+syn keyword divaMeasKeywords corners_part angles_all angles_full
+syn keyword divaMeasKeywords angles_part fig_count butting coincident
+syn keyword divaMeasKeywords over not_over outside inside enclosing
+syn keyword divaMeasKeywords figure one_net two_net three_net grounded
+syn keyword divaMeasKeywords polarized limit keep ignore
+syn match divaCtrlFunctions "(ivIf\>"hs=s+1
+syn match divaCtrlFunctions "\<ivIf("he=e-1
+syn match divaCtrlFunctions "(switch\>"hs=s+1
+syn match divaCtrlFunctions "\<switch("he=e-1
+syn match divaCtrlFunctions "(and\>"hs=s+1
+syn match divaCtrlFunctions "\<and("he=e-1
+syn match divaCtrlFunctions "(or\>"hs=s+1
+syn match divaCtrlFunctions "\<or("he=e-1
+syn match divaCtrlFunctions "(null\>"hs=s+1
+syn match divaCtrlFunctions "\<null("he=e-1
+syn match divaExtFunctions "(save\(Interconnect\|Property\|Parameter\|Recognition\)\>"hs=s+1
+syn match divaExtFunctions "\<save\(Interconnect\|Property\|Parameter\|Recognition\)("he=e-1
+syn match divaExtFunctions "(\(save\|measure\|attach\|multiLevel\|calculate\)Parasitic\>"hs=s+1
+syn match divaExtFunctions "\<\(save\|measure\|attach\|multiLevel\|calculate\)Parasitic("he=e-1
+syn match divaExtFunctions "(\(calculate\|measure\)Parameter\>"hs=s+1
+syn match divaExtFunctions "\<\(calculate\|measure\)Parameter("he=e-1
+syn match divaExtFunctions "(measure\(Resistance\|Fringe\)\>"hs=s+1
+syn match divaExtFunctions "\<measure\(Resistance\|Fringe\)("he=e-1
+syn match divaExtFunctions "(extract\(Device\|MOS\)\>"hs=s+1
+syn match divaExtFunctions "\<extract\(Device\|MOS\)("he=e-1
+syn match divaDRCFunctions "(checkAllLayers\>"hs=s+1
+syn match divaDRCFunctions "\<checkAllLayers("he=e-1
+syn match divaDRCFunctions "(checkLayer\>"hs=s+1
+syn match divaDRCFunctions "\<checkLayer("he=e-1
+syn match divaDRCFunctions "(drc\>"hs=s+1
+syn match divaDRCFunctions "\<drc("he=e-1
+syn match divaDRCFunctions "(drcAntenna\>"hs=s+1
+syn match divaDRCFunctions "\<drcAntenna("he=e-1
+syn match divaFunctions "(\(drcExtract\|lvs\)Rules\>"hs=s+1
+syn match divaFunctions "\<\(drcExtract\|lvs\)Rules("he=e-1
+syn match divaLayerFunctions "(saveDerived\>"hs=s+1
+syn match divaLayerFunctions "\<saveDerived("he=e-1
+syn match divaLayerFunctions "(copyGraphics\>"hs=s+1
+syn match divaLayerFunctions "\<copyGraphics("he=e-1
+syn match divaChkFunctions "(dubiousData\>"hs=s+1
+syn match divaChkFunctions "\<dubiousData("he=e-1
+syn match divaChkFunctions "(offGrid\>"hs=s+1
+syn match divaChkFunctions "\<offGrid("he=e-1
+syn match divaLVSFunctions "(compareDeviceProperty\>"hs=s+1
+syn match divaLVSFunctions "\<compareDeviceProperty("he=e-1
+syn match divaLVSFunctions "(ignoreTerminal\>"hs=s+1
+syn match divaLVSFunctions "\<ignoreTerminal("he=e-1
+syn match divaLVSFunctions "(parameterMatchType\>"hs=s+1
+syn match divaLVSFunctions "\<parameterMatchType("he=e-1
+syn match divaLVSFunctions "(\(permute\|prune\|remove\)Device\>"hs=s+1
+syn match divaLVSFunctions "\<\(permute\|prune\|remove\)Device("he=e-1
+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.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "diva"
+
+" vim:ts=4
diff --git a/runtime/syntax/django.vim b/runtime/syntax/django.vim
new file mode 100644
index 0000000..76b47d2
--- /dev/null
+++ b/runtime/syntax/django.vim
@@ -0,0 +1,84 @@
+" Vim syntax file
+" Language: Django template
+" Maintainer: Dave Hodder <dmh@dmh.org.uk>
+" Last Change: 2021 Nov 29
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case match
+
+" Mark illegal characters
+syn match djangoError "%}\|}}\|#}"
+
+" Django template built-in tags and parameters
+" 'comment' doesn't appear here because it gets special treatment
+syn keyword djangoStatement contained autoescape csrf_token empty
+" FIXME ==, !=, <, >, <=, and >= should be djangoStatements:
+" syn keyword djangoStatement contained == != < > <= >=
+syn keyword djangoStatement contained and as block endblock by cycle debug else elif
+syn keyword djangoStatement contained extends filter endfilter firstof for
+syn keyword djangoStatement contained endfor if endif ifchanged endifchanged
+syn keyword djangoStatement contained ifequal endifequal ifnotequal
+syn keyword djangoStatement contained endifnotequal in include load not now or
+syn keyword djangoStatement contained parsed regroup reversed spaceless
+syn keyword djangoStatement contained endspaceless ssi templatetag openblock
+syn keyword djangoStatement contained closeblock openvariable closevariable
+syn keyword djangoStatement contained openbrace closebrace opencomment
+syn keyword djangoStatement contained closecomment widthratio url with endwith
+syn keyword djangoStatement contained get_current_language trans noop blocktrans
+syn keyword djangoStatement contained endblocktrans get_available_languages
+syn keyword djangoStatement contained get_current_language_bidi plural
+syn keyword djangoStatement contained translate blocktranslate endblocktranslate
+
+" Django templete built-in filters
+syn keyword djangoFilter contained add addslashes capfirst center cut date
+syn keyword djangoFilter contained default default_if_none dictsort
+syn keyword djangoFilter contained dictsortreversed divisibleby escape escapejs
+syn keyword djangoFilter contained filesizeformat first fix_ampersands
+syn keyword djangoFilter contained floatformat get_digit join last length length_is
+syn keyword djangoFilter contained linebreaks linebreaksbr linenumbers ljust
+syn keyword djangoFilter contained lower make_list phone2numeric pluralize
+syn keyword djangoFilter contained pprint random removetags rjust slice slugify
+syn keyword djangoFilter contained safe safeseq stringformat striptags
+syn keyword djangoFilter contained time timesince timeuntil title truncatechars
+syn keyword djangoFilter contained truncatewords truncatewords_html unordered_list upper urlencode
+syn keyword djangoFilter contained urlize urlizetrunc wordcount wordwrap yesno
+
+" Keywords to highlight within comments
+syn keyword djangoTodo contained TODO FIXME XXX
+
+" Django template constants (always surrounded by double quotes)
+syn region djangoArgument contained start=/"/ skip=/\\"/ end=/"/
+
+" Mark illegal characters within tag and variables blocks
+syn match djangoTagError contained "#}\|{{\|[^%]}}\|[&#]"
+syn match djangoVarError contained "#}\|{%\|%}\|[<>!&#%]"
+
+" Django template tag and variable blocks
+syn region djangoTagBlock start="{%" end="%}" contains=djangoStatement,djangoFilter,djangoArgument,djangoTagError display
+syn region djangoVarBlock start="{{" end="}}" contains=djangoFilter,djangoArgument,djangoVarError display
+
+" Django template 'comment' tag and comment block
+syn region djangoComment start="{%\s*comment\(\s\+.\{-}\)\?%}" end="{%\s*endcomment\s*%}" contains=djangoTodo
+syn region djangoComBlock start="{#" end="#}" contains=djangoTodo
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "django"
diff --git a/runtime/syntax/dns.vim b/runtime/syntax/dns.vim
new file mode 100644
index 0000000..cc9a3f0
--- /dev/null
+++ b/runtime/syntax/dns.vim
@@ -0,0 +1,5 @@
+" Vim syntax file
+" Language: DNS/BIND Zone File
+
+" This has been replaced by the bindzone syntax
+:runtime! syntax/bindzone.vim
diff --git a/runtime/syntax/dnsmasq.vim b/runtime/syntax/dnsmasq.vim
new file mode 100644
index 0000000..a4cc8b5
--- /dev/null
+++ b/runtime/syntax/dnsmasq.vim
@@ -0,0 +1,242 @@
+" Vim syntax file
+" Maintainer: Thilo Six
+" Contact: vim-foo@xk2c-foo.de
+" :3s+-foo++g
+" Description: highlight dnsmasq configuration files
+" File: runtime/syntax/dnsmasq.vim
+" Version: 2.76
+" Last Change: 2015 Sep 27
+" Modeline: vim: ts=8:sw=2:sts=2:
+"
+" License: VIM License
+" Vim is Charityware, see ":help Uganda"
+"
+" Options: You might want to add this to your vimrc:
+"
+" if &background == "dark"
+" let dnsmasq_backrgound_light = 0
+" else
+" let dnsmasq_backrgound_light = 1
+" endif
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax") || &compatible
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if !exists("b:dnsmasq_backrgound_light")
+ if exists("dnsmasq_backrgound_light")
+ let b:dnsmasq_backrgound_light = dnsmasq_backrgound_light
+ else
+ let b:dnsmasq_backrgound_light = 0
+ endif
+endif
+
+
+" case on
+syn case match
+
+syn match DnsmasqValues "=.*"hs=s+1 contains=DnsmasqComment,DnsmasqSpecial
+syn match DnsmasqSpecial display '=\|@\|,\|!\|:' nextgroup=DnsmasqValues
+syn match DnsmasqSpecial "#"
+
+syn match DnsmasqIPv4 "\<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\>" nextgroup=DnsmasqSubnet2,DnsmasqRange
+syn match DnsmasqSubnet "\<255.\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{2\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\>"
+syn match DnsmasqSubnet2 contained "\/\([0-4]\?[0-9]\)\>"
+syn match DnsmasqRange contained "-"
+syn match DnsmasqMac "\<\(\x\x\?:\)\{5}\x\x\?"
+
+syn match DnsmasqTime "\<\(\d\{1,3}\)[hm]\>"
+
+" String
+syn match DnsmasqString "\".*\"" contains=@Spell
+syn match DnsmasqString "'.*'" contains=@Spell
+
+" Comments
+syn keyword DnsmasqTodo FIXME TODO XXX NOTE contained
+syn match DnsmasqComment "\(^\|\s\+\)#.*$" contains=@Spell,DnsmasqTodo
+
+" highlight trailing spaces
+syn match DnsmasqTrailSpace "[ \t]\+$"
+syn match DnsmasqTrailSpace "[ \t]\+$" containedin=ALL
+
+syn match DnsmasqKeywordSpecial "\<set\>:"me=e-1
+syn match DnsmasqKeywordSpecial "\<tag\>:"me=e-1
+syn match DnsmasqKeywordSpecial ",\<static\>"hs=s+1 contains=DnsmasqSpecial
+syn match DnsmasqKeywordSpecial ",\<infinite\>"hs=s+1 contains=DnsmasqSpecial
+syn match DnsmasqKeywordSpecial "\<encap\>:"me=e-1
+syn match DnsmasqKeywordSpecial "\<interface\>:"me=e-1
+syn match DnsmasqKeywordSpecial "\<vi-encap\>:"me=e-1
+syn match DnsmasqKeywordSpecial "\<net\>:"me=e-1
+syn match DnsmasqKeywordSpecial "\<vendor\>:"me=e-1
+syn match DnsmasqKeywordSpecial "\<opt\>:"me=e-1
+syn match DnsmasqKeywordSpecial "\<option\>:"me=e-1
+syn match DnsmasqKeywordSpecial ",\<ignore\>"hs=s+1 contains=DnsmasqSpecial
+syn match DnsmasqKeywordSpecial "\<id\>:"me=e-1
+
+syn match DnsmasqKeyword "^\s*add-mac\>"
+syn match DnsmasqKeyword "^\s*add-subnet\>"
+syn match DnsmasqKeyword "^\s*addn-hosts\>"
+syn match DnsmasqKeyword "^\s*address\>"
+syn match DnsmasqKeyword "^\s*alias\>"
+syn match DnsmasqKeyword "^\s*all-servers\>"
+syn match DnsmasqKeyword "^\s*auth-zone\>"
+syn match DnsmasqKeyword "^\s*bind-dynamic\>"
+syn match DnsmasqKeyword "^\s*bind-interfaces\>"
+syn match DnsmasqKeyword "^\s*bogus-nxdomain\>"
+syn match DnsmasqKeyword "^\s*bogus-priv\>"
+syn match DnsmasqKeyword "^\s*bootp-dynamic\>"
+syn match DnsmasqKeyword "^\s*bridge-interface\>"
+syn match DnsmasqKeyword "^\s*cache-size\>"
+syn match DnsmasqKeyword "^\s*clear-on-reload\>"
+syn match DnsmasqKeyword "^\s*cname\>"
+syn match DnsmasqKeyword "^\s*conf-dir\>"
+syn match DnsmasqKeyword "^\s*conf-file\>"
+syn match DnsmasqKeyword "^\s*conntrack\>"
+syn match DnsmasqKeyword "^\s*dhcp-alternate-port\>"
+syn match DnsmasqKeyword "^\s*dhcp-authoritative\>"
+syn match DnsmasqKeyword "^\s*dhcp-boot\>"
+syn match DnsmasqKeyword "^\s*dhcp-broadcast\>"
+syn match DnsmasqKeyword "^\s*dhcp-circuitid\>"
+syn match DnsmasqKeyword "^\s*dhcp-client-update\>"
+syn match DnsmasqKeyword "^\s*dhcp-duid\>"
+syn match DnsmasqKeyword "^\s*dhcp-fqdn\>"
+syn match DnsmasqKeyword "^\s*dhcp-generate-names\>"
+syn match DnsmasqKeyword "^\s*dhcp-host\>"
+syn match DnsmasqKeyword "^\s*dhcp-hostsfile\>"
+syn match DnsmasqKeyword "^\s*dhcp-ignore\>"
+syn match DnsmasqKeyword "^\s*dhcp-ignore-names\>"
+syn match DnsmasqKeyword "^\s*dhcp-lease-max\>"
+syn match DnsmasqKeyword "^\s*dhcp-leasefile\>"
+syn match DnsmasqKeyword "^\s*dhcp-luascript\>"
+syn match DnsmasqKeyword "^\s*dhcp-mac\>"
+syn match DnsmasqKeyword "^\s*dhcp-match\>"
+syn match DnsmasqKeyword "^\s*dhcp-no-override\>"
+syn match DnsmasqKeyword "^\s*dhcp-option\>"
+syn match DnsmasqKeyword "^\s*dhcp-option-force\>"
+syn match DnsmasqKeyword "^\s*dhcp-optsfile\>"
+syn match DnsmasqKeyword "^\s*dhcp-proxy\>"
+syn match DnsmasqKeyword "^\s*dhcp-range\>"
+syn match DnsmasqKeyword "^\s*dhcp-relay\>"
+syn match DnsmasqKeyword "^\s*dhcp-remoteid\>"
+syn match DnsmasqKeyword "^\s*dhcp-script\>"
+syn match DnsmasqKeyword "^\s*dhcp-scriptuser\>"
+syn match DnsmasqKeyword "^\s*dhcp-sequential-ip\>"
+syn match DnsmasqKeyword "^\s*dhcp-subscrid\>"
+syn match DnsmasqKeyword "^\s*dhcp-userclass\>"
+syn match DnsmasqKeyword "^\s*dhcp-vendorclass\>"
+syn match DnsmasqKeyword "^\s*dhcp-hostsdir\>"
+syn match DnsmasqKeyword "^\s*dns-rr\>"
+syn match DnsmasqKeyword "^\s*dnssec\>"
+syn match DnsmasqKeyword "^\s*dnssec-check-unsigned\>"
+syn match DnsmasqKeyword "^\s*dnssec-no-timecheck\>"
+syn match DnsmasqKeyword "^\s*dnssec-timestamp\>"
+syn match DnsmasqKeyword "^\s*dns-forward-max\>"
+syn match DnsmasqKeyword "^\s*domain\>"
+syn match DnsmasqKeyword "^\s*domain-needed\>"
+syn match DnsmasqKeyword "^\s*edns-packet-max\>"
+syn match DnsmasqKeyword "^\s*enable-dbus\>"
+syn match DnsmasqKeyword "^\s*enable-ra\>"
+syn match DnsmasqKeyword "^\s*enable-tftp\>"
+syn match DnsmasqKeyword "^\s*except-interface\>"
+syn match DnsmasqKeyword "^\s*expand-hosts\>"
+syn match DnsmasqKeyword "^\s*filterwin2k\>"
+syn match DnsmasqKeyword "^\s*group\>"
+syn match DnsmasqKeyword "^\s*host-record\>"
+syn match DnsmasqKeyword "^\s*interface\>"
+syn match DnsmasqKeyword "^\s*interface-name\>"
+syn match DnsmasqKeyword "^\s*ipset\>"
+syn match DnsmasqKeyword "^\s*ignore-address\>"
+syn match DnsmasqKeyword "^\s*keep-in-foreground\>"
+syn match DnsmasqKeyword "^\s*leasefile-ro\>"
+syn match DnsmasqKeyword "^\s*listen-address\>"
+syn match DnsmasqKeyword "^\s*local\>"
+syn match DnsmasqKeyword "^\s*localmx\>"
+syn match DnsmasqKeyword "^\s*local-ttl\>"
+syn match DnsmasqKeyword "^\s*local-service\>"
+syn match DnsmasqKeyword "^\s*localise-queries\>"
+syn match DnsmasqKeyword "^\s*log-async\>"
+syn match DnsmasqKeyword "^\s*log-dhcp\>"
+syn match DnsmasqKeyword "^\s*log-facility\>"
+syn match DnsmasqKeyword "^\s*log-queries\>"
+syn match DnsmasqKeyword "^\s*max-ttl\>"
+syn match DnsmasqKeyword "^\s*max-cache-ttl\>"
+syn match DnsmasqKeyword "^\s*min-cache-ttl\>"
+syn match DnsmasqKeyword "^\s*min-port\>"
+syn match DnsmasqKeyword "^\s*mx-host\>"
+syn match DnsmasqKeyword "^\s*mx-target\>"
+syn match DnsmasqKeyword "^\s*naptr-record\>"
+syn match DnsmasqKeyword "^\s*neg-ttl\>"
+syn match DnsmasqKeyword "^\s*no-daemon\>"
+syn match DnsmasqKeyword "^\s*no-dhcp-interface\>"
+syn match DnsmasqKeyword "^\s*no-hosts\>"
+syn match DnsmasqKeyword "^\s*no-negcache\>"
+syn match DnsmasqKeyword "^\s*no-ping\>"
+syn match DnsmasqKeyword "^\s*no-poll\>"
+syn match DnsmasqKeyword "^\s*no-resolv\>"
+syn match DnsmasqKeyword "^\s*pid-file\>"
+syn match DnsmasqKeyword "^\s*port\>"
+syn match DnsmasqKeyword "^\s*proxy-dnssec\>"
+syn match DnsmasqKeyword "^\s*ptr-record\>"
+syn match DnsmasqKeyword "^\s*pxe-prompt\>"
+syn match DnsmasqKeyword "^\s*pxe-service\>"
+syn match DnsmasqKeyword "^\s*query-port\>"
+syn match DnsmasqKeyword "^\s*quiet-ra\>"
+syn match DnsmasqKeyword "^\s*quiet-dhcp\>"
+syn match DnsmasqKeyword "^\s*quiet-dhcp6\>"
+syn match DnsmasqKeyword "^\s*ra-param\>"
+syn match DnsmasqKeyword "^\s*read-ethers\>"
+syn match DnsmasqKeyword "^\s*rebind-domain-ok\>"
+syn match DnsmasqKeyword "^\s*rebind-localhost-ok\>"
+syn match DnsmasqKeyword "^\s*resolv-file\>"
+syn match DnsmasqKeyword "^\s*rev-server\>"
+syn match DnsmasqKeyword "^\s*selfmx\>"
+syn match DnsmasqKeyword "^\s*server\>"
+syn match DnsmasqKeyword "^\s*servers-file\>"
+syn match DnsmasqKeyword "^\s*srv-host\>"
+syn match DnsmasqKeyword "^\s*stop-dns-rebind\>"
+syn match DnsmasqKeyword "^\s*strict-order\>"
+syn match DnsmasqKeyword "^\s*synth-domain\>"
+syn match DnsmasqKeyword "^\s*tag-if\>"
+syn match DnsmasqKeyword "^\s*test\>"
+syn match DnsmasqKeyword "^\s*tftp-max\>"
+syn match DnsmasqKeyword "^\s*tftp-lowercase\>"
+syn match DnsmasqKeyword "^\s*tftp-no-blocksize\>"
+syn match DnsmasqKeyword "^\s*tftp-no-fail\>"
+syn match DnsmasqKeyword "^\s*tftp-port-range\>"
+syn match DnsmasqKeyword "^\s*tftp-root\>"
+syn match DnsmasqKeyword "^\s*tftp-secure\>"
+syn match DnsmasqKeyword "^\s*tftp-unique-root\>"
+syn match DnsmasqKeyword "^\s*txt-record\>"
+syn match DnsmasqKeyword "^\s*user\>"
+syn match DnsmasqKeyword "^\s*version\>"
+
+
+if b:dnsmasq_backrgound_light == 1
+ hi def DnsmasqKeyword ctermfg=DarkGreen guifg=DarkGreen
+else
+ hi def link DnsmasqKeyword Keyword
+endif
+hi def link DnsmasqKeywordSpecial Type
+hi def link DnsmasqTodo Todo
+hi def link DnsmasqSpecial Constant
+hi def link DnsmasqIPv4 Identifier
+hi def link DnsmasqSubnet2 DnsmasqSubnet
+hi def link DnsmasqSubnet DnsmasqMac
+hi def link DnsmasqRange DnsmasqMac
+hi def link DnsmasqMac Preproc
+hi def link DnsmasqTime Preproc
+hi def link DnsmasqComment Comment
+hi def link DnsmasqTrailSpace DiffDelete
+hi def link DnsmasqString Constant
+hi def link DnsmasqValues Normal
+
+let b:current_syntax = "dnsmasq"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
diff --git a/runtime/syntax/docbk.vim b/runtime/syntax/docbk.vim
new file mode 100644
index 0000000..809f289
--- /dev/null
+++ b/runtime/syntax/docbk.vim
@@ -0,0 +1,186 @@
+" Vim syntax file
+" Language: DocBook
+" Maintainer: Devin Weaver <vim@tritarget.com>
+" Last Updated By: Shlomi Fish
+" URL: http://tritarget.com/pub/vim/syntax/docbk.vim
+" Last Change: 2012 Nov 28
+" Version: 1.2 (and modified after that)
+" Thanks to Johannes Zellner <johannes@zellner.org> for the default to XML
+" suggestion.
+
+" REFERENCES:
+" http://docbook.org/
+" http://www.open-oasis.org/docbook/
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Auto detect added by Bram Moolenaar
+if !exists('b:docbk_type')
+ if expand('%:e') == "sgml"
+ let b:docbk_type = 'sgml'
+ else
+ let b:docbk_type = 'xml'
+ endif
+endif
+
+if !exists('b:docbk_ver')
+ if exists('docbk_ver')
+ let b:docbk_ver = docbk_ver
+ else
+ let b:docbk_ver = 4
+ endif
+end
+
+if 'xml' == b:docbk_type
+ doau Syntax xml
+ syn cluster xmlTagHook add=docbkKeyword
+ syn cluster xmlRegionHook add=docbkRegion,docbkTitle,docbkRemark,docbkCite
+ syn case match
+elseif 'sgml' == b:docbk_type
+ doau Syntax sgml
+ syn cluster sgmlTagHook add=docbkKeyword
+ syn cluster sgmlRegionHook add=docbkRegion,docbkTitle,docbkRemark,docbkCite
+ syn case ignore
+endif
+
+syn keyword docbkKeyword abbrev abstract accel acronym address contained
+syn keyword docbkKeyword affiliation alt anchor answer appendix contained
+syn keyword docbkKeyword application area areaset areaspec arg contained
+syn keyword docbkKeyword article artpagenums attribution audiodata contained
+syn keyword docbkKeyword audioobject author authorgroup contained
+syn keyword docbkKeyword authorinitials bibliocoverage bibliodiv contained
+syn keyword docbkKeyword biblioentry bibliography biblioid contained
+syn keyword docbkKeyword bibliolist bibliomisc bibliomixed contained
+syn keyword docbkKeyword bibliomset biblioref bibliorelation contained
+syn keyword docbkKeyword biblioset bibliosource blockquote book contained
+syn keyword docbkKeyword bridgehead callout calloutlist caption contained
+syn keyword docbkKeyword caution chapter citation citebiblioid contained
+syn keyword docbkKeyword citerefentry citetitle city classname contained
+syn keyword docbkKeyword classsynopsis classsynopsisinfo cmdsynopsis contained
+syn keyword docbkKeyword co code col colgroup collab colophon contained
+syn keyword docbkKeyword colspec command computeroutput confdates contained
+syn keyword docbkKeyword confgroup confnum confsponsor conftitle contained
+syn keyword docbkKeyword constant constructorsynopsis contractnum contained
+syn keyword docbkKeyword contractsponsor contrib copyright coref contained
+syn keyword docbkKeyword country database date dedication contained
+syn keyword docbkKeyword destructorsynopsis edition editor email contained
+syn keyword docbkKeyword emphasis entry entrytbl envar epigraph contained
+syn keyword docbkKeyword equation errorcode errorname errortext contained
+syn keyword docbkKeyword errortype example exceptionname fax contained
+syn keyword docbkKeyword fieldsynopsis figure filename firstname contained
+syn keyword docbkKeyword firstterm footnote footnoteref contained
+syn keyword docbkKeyword foreignphrase formalpara funcdef funcparams contained
+syn keyword docbkKeyword funcprototype funcsynopsis funcsynopsisinfo contained
+syn keyword docbkKeyword function glossary glossdef glossdiv contained
+syn keyword docbkKeyword glossentry glosslist glosssee glossseealso contained
+syn keyword docbkKeyword glossterm group guibutton guiicon guilabel contained
+syn keyword docbkKeyword guimenu guimenuitem guisubmenu hardware contained
+syn keyword docbkKeyword holder honorific imagedata imageobject contained
+syn keyword docbkKeyword imageobjectco important index indexdiv contained
+syn keyword docbkKeyword indexentry indexterm informalequation contained
+syn keyword docbkKeyword informalexample informalfigure contained
+syn keyword docbkKeyword informaltable initializer inlineequation contained
+syn keyword docbkKeyword inlinemediaobject interfacename issuenum contained
+syn keyword docbkKeyword itemizedlist itermset jobtitle keycap contained
+syn keyword docbkKeyword keycode keycombo keysym keyword keywordset contained
+syn keyword docbkKeyword label legalnotice lineage lineannotation contained
+syn keyword docbkKeyword link listitem literal literallayout contained
+syn keyword docbkKeyword manvolnum markup mathphrase mediaobject contained
+syn keyword docbkKeyword member menuchoice methodname methodparam contained
+syn keyword docbkKeyword methodsynopsis modifier mousebutton msg contained
+syn keyword docbkKeyword msgaud msgentry msgexplan msginfo msglevel contained
+syn keyword docbkKeyword msgmain msgorig msgrel msgset msgsub contained
+syn keyword docbkKeyword msgtext note olink ooclass ooexception contained
+syn keyword docbkKeyword oointerface option optional orderedlist contained
+syn keyword docbkKeyword orgdiv orgname otheraddr othercredit contained
+syn keyword docbkKeyword othername package pagenums para paramdef contained
+syn keyword docbkKeyword parameter part partintro personblurb contained
+syn keyword docbkKeyword personname phone phrase pob postcode contained
+syn keyword docbkKeyword preface primary primaryie printhistory contained
+syn keyword docbkKeyword procedure productname productnumber contained
+syn keyword docbkKeyword programlisting programlistingco prompt contained
+syn keyword docbkKeyword property pubdate publisher publishername contained
+syn keyword docbkKeyword qandadiv qandaentry qandaset question quote contained
+syn keyword docbkKeyword refclass refdescriptor refentry contained
+syn keyword docbkKeyword refentrytitle reference refmeta refmiscinfo contained
+syn keyword docbkKeyword refname refnamediv refpurpose refsect1 contained
+syn keyword docbkKeyword refsect2 refsect3 refsection refsynopsisdiv contained
+syn keyword docbkKeyword releaseinfo remark replaceable returnvalue contained
+syn keyword docbkKeyword revdescription revhistory revision contained
+syn keyword docbkKeyword revnumber revremark row sbr screen screenco contained
+syn keyword docbkKeyword screenshot secondary secondaryie sect1 contained
+syn keyword docbkKeyword sect2 sect3 sect4 sect5 section see seealso contained
+syn keyword docbkKeyword seealsoie seeie seg seglistitem contained
+syn keyword docbkKeyword segmentedlist segtitle seriesvolnums set contained
+syn keyword docbkKeyword setindex shortaffil shortcut sidebar contained
+syn keyword docbkKeyword simpara simplelist simplemsgentry contained
+syn keyword docbkKeyword simplesect spanspec state step contained
+syn keyword docbkKeyword stepalternatives street subject subjectset contained
+syn keyword docbkKeyword subjectterm subscript substeps subtitle contained
+syn keyword docbkKeyword superscript surname symbol synopfragment contained
+syn keyword docbkKeyword synopfragmentref synopsis systemitem table contained
+syn keyword docbkKeyword task taskprerequisites taskrelated contained
+syn keyword docbkKeyword tasksummary tbody td term termdef tertiary contained
+syn keyword docbkKeyword tertiaryie textdata textobject tfoot tgroup contained
+syn keyword docbkKeyword th thead tip title titleabbrev toc tocentry contained
+syn keyword docbkKeyword token tr trademark type uri userinput contained
+syn keyword docbkKeyword varargs variablelist varlistentry varname contained
+syn keyword docbkKeyword videodata videoobject void volumenum contained
+syn keyword docbkKeyword warning wordasword xref year contained
+
+if b:docbk_ver == 4
+ syn keyword docbkKeyword ackno action appendixinfo articleinfo contained
+ syn keyword docbkKeyword authorblurb beginpage bibliographyinfo contained
+ syn keyword docbkKeyword blockinfo bookinfo chapterinfo contained
+ syn keyword docbkKeyword collabname corpauthor corpcredit contained
+ syn keyword docbkKeyword corpname glossaryinfo graphic graphicco contained
+ syn keyword docbkKeyword highlights indexinfo inlinegraphic contained
+ syn keyword docbkKeyword interface invpartnumber isbn issn lot contained
+ syn keyword docbkKeyword lotentry medialabel mediaobjectco contained
+ syn keyword docbkKeyword modespec objectinfo partinfo contained
+ syn keyword docbkKeyword prefaceinfo pubsnumber refentryinfo contained
+ syn keyword docbkKeyword referenceinfo refsect1info refsect2info contained
+ syn keyword docbkKeyword refsect3info refsectioninfo contained
+ syn keyword docbkKeyword refsynopsisdivinfo screeninfo sect1info contained
+ syn keyword docbkKeyword sect2info sect3info sect4info sect5info contained
+ syn keyword docbkKeyword sectioninfo setindexinfo setinfo contained
+ syn keyword docbkKeyword sgmltag sidebarinfo structfield contained
+ syn keyword docbkKeyword structname tocback tocchap tocfront contained
+ syn keyword docbkKeyword toclevel1 toclevel2 toclevel3 toclevel4 contained
+ syn keyword docbkKeyword toclevel5 tocpart ulink contained
+
+else
+ syn keyword docbkKeyword acknowledgements annotation arc contained
+ syn keyword docbkKeyword constraint constraintdef cover contained
+ syn keyword docbkKeyword extendedlink givenname info lhs locator contained
+ syn keyword docbkKeyword multimediaparam nonterminal org person contained
+ syn keyword docbkKeyword production productionrecap contained
+ syn keyword docbkKeyword productionset rhs tag tocdiv topic contained
+
+endif
+
+" Add special emphasis on some regions. Thanks to Rory Hunter <roryh@dcs.ed.ac.uk> for these ideas.
+syn region docbkRegion start="<emphasis>"lc=10 end="</emphasis>"me=e-11 contains=xmlRegion,xmlEntity,sgmlRegion,sgmlEntity keepend
+syn region docbkTitle start="<title>"lc=7 end="</title>"me=e-8 contains=xmlRegion,xmlEntity,sgmlRegion,sgmlEntity keepend
+syn region docbkRemark start="<remark>"lc=8 end="</remark>"me=e-9 contains=xmlRegion,xmlEntity,sgmlRegion,sgmlEntity keepend
+syn region docbkRemark start="<comment>"lc=9 end="</comment>"me=e-10 contains=xmlRegion,xmlEntity,sgmlRegion,sgmlEntity keepend
+syn region docbkCite start="<citation>"lc=10 end="</citation>"me=e-11 contains=xmlRegion,xmlEntity,sgmlRegion,sgmlEntity keepend
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+hi def DocbkBold term=bold cterm=bold gui=bold
+
+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
+
+
+let b:current_syntax = "docbk"
+
+" vim: ts=8
diff --git a/runtime/syntax/docbksgml.vim b/runtime/syntax/docbksgml.vim
new file mode 100644
index 0000000..544f3d2
--- /dev/null
+++ b/runtime/syntax/docbksgml.vim
@@ -0,0 +1,7 @@
+" Vim syntax file
+" Language: DocBook SGML
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Sam, 07 Sep 2002 17:20:46 CEST
+
+let b:docbk_type="sgml"
+runtime syntax/docbk.vim
diff --git a/runtime/syntax/docbkxml.vim b/runtime/syntax/docbkxml.vim
new file mode 100644
index 0000000..181af2c
--- /dev/null
+++ b/runtime/syntax/docbkxml.vim
@@ -0,0 +1,7 @@
+" Vim syntax file
+" Language: DocBook XML
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Sam, 07 Sep 2002 17:20:12 CEST
+
+let b:docbk_type="xml"
+runtime syntax/docbk.vim
diff --git a/runtime/syntax/dockerfile.vim b/runtime/syntax/dockerfile.vim
new file mode 100644
index 0000000..ce52e69
--- /dev/null
+++ b/runtime/syntax/dockerfile.vim
@@ -0,0 +1,45 @@
+" dockerfile.vim - Syntax highlighting for Dockerfiles
+" Maintainer: Honza Pokorny <https://honza.ca>
+" Last Change: 2020 Feb 11
+" License: BSD
+
+" https://docs.docker.com/engine/reference/builder/
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax include @JSON syntax/json.vim
+unlet b:current_syntax
+
+syntax include @Shell syntax/sh.vim
+unlet b:current_syntax
+
+syntax case ignore
+syntax match dockerfileLinePrefix /\v^\s*(ONBUILD\s+)?\ze\S/ contains=dockerfileKeyword nextgroup=dockerfileInstruction skipwhite
+syntax region dockerfileFrom matchgroup=dockerfileKeyword start=/\v^\s*(FROM)\ze(\s|$)/ skip=/\v\\\_./ end=/\v((^|\s)AS(\s|$)|$)/ contains=dockerfileOption
+
+syntax keyword dockerfileKeyword contained ADD ARG CMD COPY ENTRYPOINT ENV EXPOSE HEALTHCHECK LABEL MAINTAINER ONBUILD RUN SHELL STOPSIGNAL USER VOLUME WORKDIR
+syntax match dockerfileOption contained /\v(^|\s)\zs--\S+/
+
+syntax match dockerfileInstruction contained /\v<(\S+)>(\s+--\S+)*/ contains=dockerfileKeyword,dockerfileOption skipwhite nextgroup=dockerfileValue
+syntax match dockerfileInstruction contained /\v<(ADD|COPY)>(\s+--\S+)*/ contains=dockerfileKeyword,dockerfileOption skipwhite nextgroup=dockerfileJSON
+syntax match dockerfileInstruction contained /\v<(HEALTHCHECK)>(\s+--\S+)*/ contains=dockerfileKeyword,dockerfileOption skipwhite nextgroup=dockerfileInstruction
+syntax match dockerfileInstruction contained /\v<(CMD|ENTRYPOINT|RUN)>/ contains=dockerfileKeyword skipwhite nextgroup=dockerfileShell
+syntax match dockerfileInstruction contained /\v<(CMD|ENTRYPOINT|RUN)>\ze\s+\[/ contains=dockerfileKeyword skipwhite nextgroup=dockerfileJSON
+syntax match dockerfileInstruction contained /\v<(SHELL|VOLUME)>/ contains=dockerfileKeyword skipwhite nextgroup=dockerfileJSON
+
+syntax region dockerfileString contained start=/\v"/ skip=/\v\\./ end=/\v"/
+syntax region dockerfileJSON contained keepend start=/\v\[/ skip=/\v\\\_./ end=/\v$/ contains=@JSON
+syntax region dockerfileShell contained keepend start=/\v/ skip=/\v\\\_./ end=/\v$/ contains=@Shell
+syntax region dockerfileValue contained keepend start=/\v/ skip=/\v\\\_./ end=/\v$/ contains=dockerfileString
+
+syntax region dockerfileComment start=/\v^\s*#/ end=/\v$/
+set commentstring=#\ %s
+
+hi def link dockerfileString String
+hi def link dockerfileKeyword Keyword
+hi def link dockerfileComment Comment
+hi def link dockerfileOption Special
+
+let b:current_syntax = "dockerfile"
diff --git a/runtime/syntax/dosbatch.vim b/runtime/syntax/dosbatch.vim
new file mode 100644
index 0000000..a75771b
--- /dev/null
+++ b/runtime/syntax/dosbatch.vim
@@ -0,0 +1,152 @@
+" Vim syntax file
+" Language: MS-DOS/Windows batch file (with NT command extensions)
+" Maintainer: Mike Williams <mrmrdubya@gmail.com>
+" Filenames: *.bat
+" Last Change: 12th February 2023
+"
+" Options Flags:
+" dosbatch_cmdextversion - 1 = Windows NT, 2 = Windows 2000 [default]
+" dosbatch_colons_comment - any value to treat :: as comment line
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Set default highlighting to Win2k
+if !exists("dosbatch_cmdextversion")
+ let dosbatch_cmdextversion = 2
+endif
+
+" DOS bat files are case insensitive but case preserving!
+syn case ignore
+
+syn keyword dosbatchTodo contained TODO
+
+" Dosbat keywords
+syn keyword dosbatchStatement goto call exit
+syn keyword dosbatchConditional if else
+syn keyword dosbatchRepeat for
+
+" Some operators - first lot are case sensitive!
+syn case match
+syn keyword dosbatchOperator EQU NEQ LSS LEQ GTR GEQ
+syn case ignore
+syn match dosbatchOperator "\s[-+\*/%!~]\s"
+syn match dosbatchOperator "="
+syn match dosbatchOperator "[-+\*/%]="
+syn match dosbatchOperator "\s\(&\||\|^\|<<\|>>\)=\=\s"
+syn match dosbatchIfOperator "if\s\+\(\(not\)\=\s\+\)\=\(exist\|defined\|errorlevel\|cmdextversion\)\="lc=2
+
+" String - using "'s is a convenience rather than a requirement outside of FOR
+syn match dosbatchString "\"[^"]*\"" contains=dosbatchVariable,dosBatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell
+syn match dosbatchString "\<echo\([^)>|]\|\^\@<=[)>|]\)*"lc=4 contains=dosbatchVariable,dosbatchArgument,dosbatchSpecialChar,@dosbatchNumber,@Spell
+syn match dosbatchEchoOperator "\<echo\s\+\(on\|off\)\s*$"lc=4
+
+" For embedded commands
+syn match dosbatchCmd "(\s*'[^']*'"lc=1 contains=dosbatchString,dosbatchVariable,dosBatchArgument,@dosbatchNumber,dosbatchImplicit,dosbatchStatement,dosbatchConditional,dosbatchRepeat,dosbatchOperator
+
+" Numbers - surround with ws to not include in dir and filenames
+syn match dosbatchInteger "[[:space:]=(/:,!~-]\d\+"lc=1
+syn match dosbatchHex "[[:space:]=(/:,!~-]0x\x\+"lc=1
+syn match dosbatchBinary "[[:space:]=(/:,!~-]0b[01]\+"lc=1
+syn match dosbatchOctal "[[:space:]=(/:,!~-]0\o\+"lc=1
+syn cluster dosbatchNumber contains=dosbatchInteger,dosbatchHex,dosbatchBinary,dosbatchOctal
+
+" Command line switches
+syn match dosbatchSwitch "/\(\a\+\|?\)"
+
+" Various special escaped char formats
+syn match dosbatchSpecialChar "\^[&|()<>^]"
+syn match dosbatchSpecialChar "\$[a-hl-npqstv_$+]"
+syn match dosbatchSpecialChar "%%"
+
+" Environment variables
+syn match dosbatchIdentifier contained "\s\h\w*\>"
+syn match dosbatchVariable "%\h\w*%"
+syn match dosbatchVariable "%\h\w*:\*\=[^=]*=[^%]*%"
+syn match dosbatchVariable "%\h\w*:\~[-]\=\d\+\(,[-]\=\d\+\)\=%" contains=dosbatchInteger
+syn match dosbatchVariable "!\h\w*!"
+syn match dosbatchVariable "!\h\w*:\*\=[^=]*=[^!]*!"
+syn match dosbatchVariable "!\h\w*:\~[-]\=\d\+\(,[-]\=\d\+\)\=!" contains=dosbatchInteger
+syn match dosbatchSet "\s\h\w*[+-]\==\{-1}" contains=dosbatchIdentifier,dosbatchOperator
+
+" Args to bat files and for loops, etc
+syn match dosbatchArgument "%\(\d\|\*\)"
+syn match dosbatchArgument "%[a-z]\>"
+if dosbatch_cmdextversion == 1
+ syn match dosbatchArgument "%\~[fdpnxs]\+\(\($PATH:\)\=[a-z]\|\d\)\>"
+else
+ syn match dosbatchArgument "%\~[fdpnxsatz]\+\(\($PATH:\)\=[a-z]\|\d\)\>"
+endif
+
+" Line labels
+syn match dosbatchLabel "^\s*:\s*\h\w*\>"
+syn match dosbatchLabel "\<\(goto\|call\)\s\+:\h\w*\>"lc=4
+syn match dosbatchLabel "\<goto\s\+\h\w*\>"lc=4
+syn match dosbatchLabel ":\h\w*\>"
+
+" Comments - usual rem but also two colons as first non-space is an idiom
+syn match dosbatchComment "^rem\($\|\s.*$\)"lc=3 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+syn match dosbatchComment "^@rem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+syn match dosbatchComment "\srem\($\|\s.*$\)"lc=4 contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+syn match dosbatchComment "\s@rem\($\|\s.*$\)"lc=5 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+if exists("dosbatch_colons_comment")
+ syn match dosbatchComment "\s*:\s*:.*$" contains=dosbatchTodo,dosbatchSpecialChar,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+else
+ syn match dosbatchError "\s*:\s*:.*$"
+endif
+
+" Comments in ()'s - still to handle spaces before rem
+syn match dosbatchComment "(rem\([^)]\|\^\@<=)\)*"lc=4 contains=dosbatchTodo,@dosbatchNumber,dosbatchVariable,dosbatchArgument,@Spell
+
+syn keyword dosbatchImplicit append assoc at attrib break cacls cd chcp chdir
+syn keyword dosbatchImplicit chkdsk chkntfs cls cmd color comp compact convert copy
+syn keyword dosbatchImplicit date del dir diskcomp diskcopy doskey echo endlocal
+syn keyword dosbatchImplicit erase fc find findstr format ftype
+syn keyword dosbatchImplicit graftabl help keyb label md mkdir mode more move
+syn keyword dosbatchImplicit path pause popd print prompt pushd rd recover rem
+syn keyword dosbatchImplicit ren rename replace restore rmdir set setlocal shift
+syn keyword dosbatchImplicit sort start subst time title tree type ver verify
+syn keyword dosbatchImplicit vol xcopy
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link dosbatchTodo Todo
+hi def link dosbatchError Error
+
+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"
+
+" vim: ts=8
diff --git a/runtime/syntax/dosini.vim b/runtime/syntax/dosini.vim
new file mode 100644
index 0000000..cf42819
--- /dev/null
+++ b/runtime/syntax/dosini.vim
@@ -0,0 +1,40 @@
+" Vim syntax file
+" Language: Configuration File (ini file) for MSDOS/MS Windows
+" Version: 2.2
+" Original Author: Sean M. McKee <mckee@misslink.net>
+" Previous Maintainer: Nima Talebi <nima@it.net.au>
+" Current Maintainer: Hong Xu <hong@topbug.net>
+" Homepage: http://www.vim.org/scripts/script.php?script_id=3747
+" Repository: https://github.com/xuhdev/syntax-dosini.vim
+" Last Change: 2018 Sep 11
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" shut case off
+syn case ignore
+
+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.
+" 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"
+
+" vim: sts=2 sw=2 et
diff --git a/runtime/syntax/dot.vim b/runtime/syntax/dot.vim
new file mode 100644
index 0000000..68a0f57
--- /dev/null
+++ b/runtime/syntax/dot.vim
@@ -0,0 +1,121 @@
+" Language: Dot
+" Filenames: *.dot
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" URL: http://www.ocaml.info/vim/syntax/dot.vim
+" Last Change: 2021 Mar 24 - better attr + escape string matching, new keywords (Farbod Salamat-Zadeh)
+" 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")
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+" Errors
+syn match dotParErr ")"
+syn match dotBrackErr "]"
+syn match dotBraceErr "}"
+
+" Enclosing delimiters
+syn region dotEncl transparent matchgroup=dotParEncl start="(" matchgroup=dotParEncl end=")" contains=ALLBUT,dotParErr
+syn region dotEncl transparent matchgroup=dotBrackEncl start="\[" matchgroup=dotBrackEncl end="\]" contains=ALLBUT,dotBrackErr
+syn region dotEncl transparent matchgroup=dotBraceEncl start="{" matchgroup=dotBraceEncl end="}" contains=ALLBUT,dotBraceErr
+
+" Comments
+syn region dotComment start="//" end="$" contains=dotComment,dotTodo
+syn region dotComment start="/\*" end="\*/" contains=dotComment,dotTodo
+syn keyword dotTodo contained TODO FIXME XXX
+
+" Strings
+syn region dotString start=+"+ skip=+\\\\\|\\"+ end=+"+
+
+" Escape strings
+syn match dotEscString /\v\\(N|G|E|T|H|L)/ containedin=dotString
+syn match dotEscString /\v\\(n|l|r)/ containedin=dotString
+
+" General keywords
+syn keyword dotKeyword graph digraph subgraph node edge strict
+
+" Node, edge and graph attributes
+syn keyword dotType _background area arrowhead arrowsize arrowtail bb bgcolor
+ \ center charset class clusterrank color colorscheme comment compound
+ \ concentrate constraint Damping decorate defaultdist dim dimen dir
+ \ diredgeconstraints distortion dpi edgehref edgetarget edgetooltip
+ \ edgeURL epsilon esep fillcolor fixedsize fontcolor fontname fontnames
+ \ fontpath fontsize forcelabels gradientangle group head_lp headclip
+ \ headhref headlabel headport headtarget headtooltip headURL height href
+ \ id image imagepath imagepos imagescale inputscale K label label_scheme
+ \ labelangle labeldistance labelfloat labelfontcolor labelfontname
+ \ labelfontsize labelhref labeljust labelloc labeltarget labeltooltip
+ \ labelURL landscape layer layerlistsep layers layerselect layersep
+ \ layout len levels levelsgap lhead lheight lp ltail lwidth margin
+ \ maxiter mclimit mindist minlen mode model mosek newrank nodesep
+ \ nojustify normalize notranslate nslimit nslimit1 ordering orientation
+ \ outputorder overlap overlap_scaling overlap_shrink pack packmode pad
+ \ page pagedir pencolor penwidth peripheries pin pos quadtree quantum
+ \ rank rankdir ranksep ratio rects regular remincross repulsiveforce
+ \ resolution root rotate rotation samehead sametail samplepoints scale
+ \ searchsize sep shape shapefile showboxes sides size skew smoothing
+ \ sortv splines start style stylesheet tail_lp tailclip tailhref
+ \ taillabel tailport tailtarget tailtooltip tailURL target tooltip
+ \ truecolor URL vertices viewport voro_margin weight width xdotversion
+ \ xlabel xlp z
+
+" Special chars
+syn match dotKeyChar "="
+syn match dotKeyChar ";"
+syn match dotKeyChar "->"
+syn match dotKeyChar "--"
+
+" Identifier
+syn match dotIdentifier /\<\w\+\(:\w\+\)\?\>/
+
+" Synchronization
+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 dotEscString Keyword
+ HiLink dotIdentifier Identifier
+
+ delcommand HiLink
+endif
+
+let b:current_syntax = "dot"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: ts=8
diff --git a/runtime/syntax/doxygen.vim b/runtime/syntax/doxygen.vim
new file mode 100644
index 0000000..357c430
--- /dev/null
+++ b/runtime/syntax/doxygen.vim
@@ -0,0 +1,633 @@
+" DoxyGen syntax highlighting extension for c/c++/idl/java
+" Language: doxygen on top of c, cpp, idl, java, php
+" Maintainer: Michael Geddes <vimmer@frog.wheelycreek.net>
+" Author: Michael Geddes
+" Last Change: December 2020
+" Version: 1.30
+"
+" Copyright 2004-2020 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
+" appreciate and welcome any updates, modifications or suggestions.
+
+" NOTE: Comments welcome!
+"
+" There are two variables that control the syntax highlighting produced by this
+" script:
+" doxygen_enhanced_colour - Use the (non-standard) original colours designed
+" for this highlighting.
+" doxygen_my_rendering - Disable the HTML bold/italic/underline rendering.
+"
+" A brief description without '.' or '!' will cause the end comment
+" character to be marked as an error. You can define the colour of this using
+" the highlight doxygenErrorComment.
+" A \link without an \endlink will cause an error highlight on the end-comment.
+" This is defined by doxygenLinkError
+"
+" The variable g:doxygen_codeword_font can be set to the guifont for marking \c
+" words - a 'typewriter' like font normally. Spaces must be escaped. It can
+" also be set to any highlight attribute. Alternatively, a highlight for doxygenCodeWord
+" can be used to override it.
+"
+" By default, highlighting is done assuming you have the JAVADOC_AUTOBRIEF
+" setting turned on in your Doxygen configuration. If you don't, you
+" can set the variable g:doxygen_javadoc_autobrief to 0 to have the
+" highlighting more accurately reflect the way Doxygen will interpret your
+" comments.
+"
+" Support for cpp, c, idl, doxygen and php.
+"
+" Special thanks to: Wu Yongwei, Toby Allsopp
+"
+
+if exists('b:suppress_doxygen')
+ unlet b:suppress_doxygen
+ finish
+endif
+
+if exists('b:current_syntax') && b:current_syntax =~ 'doxygen' && !exists('doxygen_debug_script')
+ finish
+endif
+
+let s:cpo_save = &cpo
+try
+ set cpo&vim
+
+ " Start of Doxygen syntax highlighting:
+ "
+
+ " C/C++ Style line comments
+ 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,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,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,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,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,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 contains=@Spell
+" 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
+
+
+ " Match a '<' for applying a comment to the previous element.
+ 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
+ " then turn the comments back into normal C comments.
+ syn region cComment start="/\*\*\*" end="\*/" contains=@cCommentGroup,cCommentString,cCharacter,cNumbersCom,cSpaceError
+ syn region cCommentL start="////" skip="\\$" end="$" contains=@cCommentGroup,cComment2String,cCharacter,cNumbersCom,cSpaceError
+else
+ syn region cComment start="/\*\*\*" end="\*/" contains=@cCommentGroup,cSpaceError
+ syn region cCommentL start="////" skip="\\$" end="$" contains=@cCommentGroup,cSpaceError
+endif
+
+ " Special commands at the start of the area: starting with '@' or '\'
+ syn region doxygenStartSpecial contained start=+[@\\]\([npcbea]\>\|em\>\|ref\>\|link\>\|f\$\|[$\\&<>#]\)\@!+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=doxygenSpecial nextgroup=doxygenSkipComment skipnl keepend
+ syn match doxygenSkipComment contained +^\s*\*/\@!+ nextgroup=doxygenBrief,doxygenStartSpecial,doxygenFindBriefSpecial,doxygenPage skipwhite
+
+ "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=doxygenContinueCommentWhite,doxygenTODO,doxygenSpecial,doxygenSmallSpecial,doxygenHyperLink,doxygenHashLink,@doxygenHtmlGroup,@Spell
+
+ " These allow the skipping of comment continuation '*' characters.
+ 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.
+ syn match doxygenErrorComment contained +\*/+
+
+
+ " 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 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 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
+
+ " 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_%=+*/!~>|]\@!\|\\[\\<>&.]@\|[.,]\w\@=\|::\|([^)]*)\|&[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=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')
+ call s:DxyCreateSmallSpecial('c', 'Code')
+ call s:DxyCreateSmallSpecial('b', 'Bold')
+ call s:DxyCreateSmallSpecial('e', 'Emphasised')
+ call s:DxyCreateSmallSpecial('em', 'Emphasised')
+ call s:DxyCreateSmallSpecial('a', 'Argument')
+ call s:DxyCreateSmallSpecial('ref', 'Ref')
+ delfun s:DxyCreateSmallSpecial
+
+ syn match doxygenSmallSpecial contained +[@\\]\(\<[npcbea]\>\|\<em\>\|\<ref\>\|\<link\>\|f\$\|[$\\&<>#]\)\@=+ nextgroup=doxygenOtherLink,doxygenHyperLink,doxygenHashLink,doxygenFormula,doxygenSymbol,doxygenSpecial.*Word
+
+ " Now for special characters
+ syn match doxygenSpecial contained +[@\\]\(\<[npcbea]\>\|\<em\>\|\<ref\|\<link\>\>\|\<f\$\|[$\\&<>#]\)\@!+ nextgroup=doxygenParam,doxygenTParam,doxygenRetval,doxygenBriefWord,doxygenBold,doxygenBOther,doxygenOther,doxygenOtherTODO,doxygenOtherWARN,doxygenOtherBUG,doxygenPage,doxygenGroupDefine,doxygenCodeRegion,doxygenVerbatimRegion,doxygenDotRegion
+ " doxygenOtherLink,doxygenSymbol,doxygenFormula,doxygenErrorSpecial,doxygenSpecial.*Word
+ "
+ syn match doxygenGroupDefine contained +@\@<=[{}]+
+ syn match doxygenGroupDefineSpecial contained +@\ze[{}]+
+
+ syn match doxygenErrorSpecial contained +\s+
+
+ " 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 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 throws exception nextgroup=doxygenReturnValue skipwhite
+ syn match doxygenReturnValue contained +\S\++ nextgroup=doxygenSpecialMultilineDesc skipwhite
+
+ " Match one line identifiers.
+ syn keyword doxygenOther contained addindex anchor
+ \ dontinclude endhtmlonly endlatexonly showinitializer hideinitializer
+ \ example htmlonly image include includelineno ingroup latexonly line
+ \ overload relates related relatesalso relatedalso sa skip skipline
+ \ until verbinclude version addtogroup htmlinclude copydoc dotfile
+ \ xmlonly endxmlonly
+ \ nextgroup=doxygenSpecialOnelineDesc copybrief copydetails copyright dir extends
+ \ implements
+
+ 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,doxygenContinueCommentWhite,doxygenErrorComment,@NoSpell
+ syn match doxygenVerbatimRegionSpecial contained +[\\@]\(endverbatim\>\)\@=+
+
+ 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')
+ 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,doxygenContinueCommentWhite,@NoSpell,@Dotx
+ syn match doxygenDotRegionSpecial contained +[\\@]\(enddot\>\)\@=+
+
+ " Match single line identifiers.
+ syn keyword doxygenBOther contained class enum file fn mainpage interface
+ \ namespace struct typedef union var def name
+ \ nextgroup=doxygenSpecialTypeOnelineDesc
+
+ syn keyword doxygenOther contained par nextgroup=doxygenHeaderLine
+ syn region doxygenHeaderLine start=+.+ end=+^+ contained skipwhite nextgroup=doxygenSpecialMultilineDesc
+ " Match the start of other multiline comments.
+ syn keyword doxygenOther contained arg author authors date deprecated li return returns result see invariant note post pre remarks since test internal 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,doxygenContinueCommentWhite,doxygenLinkError,doxygenEndlinkSpecial
+ syn match doxygenEndlinkSpecial contained +[\\@]\zeendlink\>+
+
+ syn match doxygenLinkWord "[_a-zA-Z:#()][_a-z0-9A-Z:#()]*\>" contained skipnl nextgroup=doxygenLinkRest,doxygenContinueLinkComment
+ syn match doxygenLinkRest +[^*@\\]\|\*/\@!\|[@\\]\(endlink\>\)\@!+ contained skipnl nextgroup=doxygenLinkRest,doxygenContinueLinkComment
+ syn match doxygenContinueLinkComment contained +^\s*\*\=[^/]+me=e-1 nextgroup=doxygenLinkRest
+ syn match doxygenLinkError "\*/" contained
+ " #Link highlighting.
+ syn match doxygenHashLink /\(\h\w*\)\?#\(\.\w\@=\|\w\+\|::\|()\)\+/ contained contains=doxygenHashSpecial
+ syn match doxygenHashSpecial /#/ contained
+ syn match doxygenHyperLink /\(\s\|^\s*\*\?\)\@<=\(http\|https\|ftp\):\/\/[-0-9a-zA-Z_?&=+#%/.!':;@~]\+/ contained
+
+ " Handle \page. This does not use doxygenBrief.
+ syn match doxygenPage "[\\@]page\>"me=s+1 contained skipwhite nextgroup=doxygenPagePage
+ syn keyword doxygenPagePage page contained skipwhite nextgroup=doxygenPageIdent
+ syn region doxygenPageDesc start=+.\++ end=+$+ contained skipwhite contains=doxygenSmallSpecial,@doxygenHtmlGroup keepend skipwhite skipnl nextgroup=doxygenBody
+ syn match doxygenPageIdent "\<\w\+\>" contained nextgroup=doxygenPageDesc
+
+ " 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=doxygenContinueCommentWhite
+ syn match doxygenSpecialIdent "\<\w\+\>" contained nextgroup=doxygenSpecialSectionDesc
+
+ " Does the one-line description for the one-line type identifiers.
+ syn region doxygenSpecialTypeOnelineDesc start=+.\++ end=+$+ contained skipwhite contains=doxygenSmallSpecial,@doxygenHtmlGroup keepend
+ syn region doxygenSpecialOnelineDesc start=+.\++ end=+$+ contained skipwhite contains=doxygenSmallSpecial,@doxygenHtmlGroup keepend
+
+ " 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=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
+ syn keyword doxygenBriefWord contained brief nextgroup=doxygenBriefLine skipwhite
+ syn match doxygenSpecialHeading +.\++ contained skipwhite
+ syn keyword doxygenGroup contained group nextgroup=doxygenGroupName skipwhite
+ syn keyword doxygenGroupName contained +\k\++ nextgroup=doxygenSpecialOnelineDesc skipwhite
+
+ " Handle special symbol identifiers @$, @\, @$ etc
+ syn match doxygenSymbol contained +[$\\&<>#n]+
+
+ " Simplistic handling of formula regions
+ syn region doxygenFormula contained matchgroup=doxygenFormulaEnds start=+f\$+ end=+[@\\]f\$+ contains=doxygenFormulaSpecial,doxygenFormulaOperator
+ syn match doxygenFormulaSpecial contained +[@\\]\(f[^$]\|[^f]\)+me=s+1 nextgroup=doxygenFormulaKeyword,doxygenFormulaEscaped
+ syn match doxygenFormulaEscaped contained "."
+ syn match doxygenFormulaKeyword contained "[a-z]\+"
+ syn match doxygenFormulaOperator contained +[_^]+
+
+ syn region doxygenFormula contained matchgroup=doxygenFormulaEnds start=+f\[+ end=+[@\\]f]+ contains=doxygenFormulaSpecial,doxygenFormulaOperator,doxygenAtom
+ syn region doxygenAtom contained transparent matchgroup=doxygenFormulaOperator start=+{+ end=+}+ contains=doxygenAtom,doxygenFormulaSpecial,doxygenFormulaOperator
+
+ " Add TODO highlighting.
+ syn keyword doxygenTODO contained TODO README XXX FIXME
+
+ " 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,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
+ syn match doxygenHtmlExpr contained +"\(\\.\|[^"]\)*"\|'\(\\.\|[^']\)*'+ nextgroup=doxygenHtmlVar skipwhite
+ syn case match
+ syn match doxygenHtmlSpecial contained "&\(copy\|quot\|[AEIOUYaeiouy]uml\|[AEIOUYaeiouy]acute\|[AEIOUaeiouy]grave\|[AEIOUaeiouy]circ\|[ANOano]tilde\|szlig\|[Aa]ring\|nbsp\|gt\|lt\|amp\);"
+
+ syn cluster doxygenHtmlGroup contains=doxygenHtmlCode,doxygenHtmlBold,doxygenHtmlUnderline,doxygenHtmlItalic,doxygenHtmlSpecial,doxygenHtmlTag,doxygenHtmlLink
+
+ 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
+
+ syn region doxygenHtmlBold contained start="\c<b\>" end="\c</b>"me=e-4 contains=@doxygenHtmlTop,doxygenHtmlBoldUnderline,doxygenHtmlBoldItalic,@Spell
+ syn region doxygenHtmlBold contained start="\c<strong\>" end="\c</strong>"me=e-9 contains=@doxygenHtmlTop,doxygenHtmlBoldUnderline,doxygenHtmlBoldItalic,@Spell
+ syn region doxygenHtmlBoldUnderline contained start="\c<u\>" end="\c</u>"me=e-4 contains=@doxygenHtmlTop,doxygenHtmlBoldUnderlineItalic,@Spell
+ syn region doxygenHtmlBoldItalic contained start="\c<i\>" end="\c</i>"me=e-4 contains=@doxygenHtmlTop,doxygenHtmlBoldItalicUnderline,@Spell
+ syn region doxygenHtmlBoldItalic contained start="\c<em\>" end="\c</em>"me=e-5 contains=@doxygenHtmlTop,doxygenHtmlBoldItalicUnderline,@Spell
+ syn region doxygenHtmlBoldUnderlineItalic contained start="\c<i\>" end="\c</i>"me=e-4 contains=@doxygenHtmlTop,@Spell
+ syn region doxygenHtmlBoldUnderlineItalic contained start="\c<em\>" end="\c</em>"me=e-5 contains=@doxygenHtmlTop,@Spell
+ syn region doxygenHtmlBoldItalicUnderline contained start="\c<u\>" end="\c</u>"me=e-4 contains=@doxygenHtmlTop,doxygenHtmlBoldUnderlineItalic,@Spell
+
+ syn region doxygenHtmlUnderline contained start="\c<u\>" end="\c</u>"me=e-4 contains=@doxygenHtmlTop,doxygenHtmlUnderlineBold,doxygenHtmlUnderlineItalic,@Spell
+ syn region doxygenHtmlUnderlineBold contained start="\c<b\>" end="\c</b>"me=e-4 contains=@doxygenHtmlTop,doxygenHtmlUnderlineBoldItalic,@Spell
+ syn region doxygenHtmlUnderlineBold contained start="\c<strong\>" end="\c</strong>"me=e-9 contains=@doxygenHtmlTop,doxygenHtmlUnderlineBoldItalic,@Spell
+ syn region doxygenHtmlUnderlineItalic contained start="\c<i\>" end="\c</i>"me=e-4 contains=@doxygenHtmlTop,htmUnderlineItalicBold,@Spell
+ syn region doxygenHtmlUnderlineItalic contained start="\c<em\>" end="\c</em>"me=e-5 contains=@doxygenHtmlTop,htmUnderlineItalicBold,@Spell
+ syn region doxygenHtmlUnderlineItalicBold contained start="\c<b\>" end="\c</b>"me=e-4 contains=@doxygenHtmlTop,@Spell
+ syn region doxygenHtmlUnderlineItalicBold contained start="\c<strong\>" end="\c</strong>"me=e-9 contains=@doxygenHtmlTop,@Spell
+ syn region doxygenHtmlUnderlineBoldItalic contained start="\c<i\>" end="\c</i>"me=e-4 contains=@doxygenHtmlTop,@Spell
+ syn region doxygenHtmlUnderlineBoldItalic contained start="\c<em\>" end="\c</em>"me=e-5 contains=@doxygenHtmlTop,@Spell
+
+ syn region doxygenHtmlItalic contained start="\c<i\>" end="\c</i>"me=e-4 contains=@doxygenHtmlTop,doxygenHtmlItalicBold,doxygenHtmlItalicUnderline,@Spell
+ syn region doxygenHtmlItalic contained start="\c<em\>" end="\c</em>"me=e-5 contains=@doxygenHtmlTop,@Spell
+ syn region doxygenHtmlItalicBold contained start="\c<b\>" end="\c</b>"me=e-4 contains=@doxygenHtmlTop,doxygenHtmlItalicBoldUnderline,@Spell
+ syn region doxygenHtmlItalicBold contained start="\c<strong\>" end="\c</strong>"me=e-9 contains=@doxygenHtmlTop,doxygenHtmlItalicBoldUnderline,@Spell
+ syn region doxygenHtmlItalicBoldUnderline contained start="\c<u\>" end="\c</u>"me=e-4 contains=@doxygenHtmlTop,@Spell
+ syn region doxygenHtmlItalicUnderline contained start="\c<u\>" end="\c</u>"me=e-4 contains=@doxygenHtmlTop,doxygenHtmlItalicUnderlineBold,@Spell
+ syn region doxygenHtmlItalicUnderlineBold contained start="\c<b\>" end="\c</b>"me=e-4 contains=@doxygenHtmlTop,@Spell
+ syn region doxygenHtmlItalicUnderlineBold contained start="\c<strong\>" end="\c</strong>"me=e-9 contains=@doxygenHtmlTop,@Spell
+
+ syn region doxygenHtmlCode contained start="\c<code\>" end="\c</code>"me=e-7 contains=@doxygenHtmlTop,@NoSpell
+
+ " Prevent the doxygen contained matches from leaking into the c/rc groups.
+ syn cluster cParenGroup add=doxygen.*
+ syn cluster cParenGroup remove=doxygenComment,doxygenCommentL
+ syn cluster cPreProcGroup add=doxygen.*
+ syn cluster cMultiGroup add=doxygen.*
+ syn cluster rcParenGroup add=doxygen.*
+ syn cluster rcParenGroup remove=doxygenComment,doxygenCommentL
+ syn cluster rcGroup add=doxygen.*
+
+ let s:my_syncolor=0
+ if !exists(':SynColor')
+ command -nargs=+ SynColor hi def <args>
+ let s:my_syncolor=1
+ endif
+
+ let s:my_synlink=0
+ if !exists(':SynLink')
+ command -nargs=+ SynLink hi def link <args>
+ let s:my_synlink=1
+ endif
+
+ try
+ "let did_doxygen_syntax_inits = &background
+ hi doxygen_Dummy guifg=black
+
+ fun! s:Doxygen_Hilights_Base()
+ SynLink doxygenHtmlSpecial Special
+ SynLink doxygenHtmlVar Type
+ SynLink doxygenHtmlExpr String
+
+ SynLink doxygenSmallSpecial SpecialChar
+
+ SynLink doxygenSpecialCodeWord doxygenSmallSpecial
+ SynLink doxygenSpecialBoldWord doxygenSmallSpecial
+ SynLink doxygenSpecialEmphasisedWord doxygenSmallSpecial
+ SynLink doxygenSpecialArgumentWord doxygenSmallSpecial
+
+ " SynColor doxygenFormulaKeyword cterm=bold ctermfg=DarkMagenta guifg=DarkMagenta gui=bold
+ SynLink doxygenFormulaKeyword Keyword
+ "SynColor doxygenFormulaEscaped ctermfg=DarkMagenta guifg=DarkMagenta gui=bold
+ SynLink doxygenFormulaEscaped Special
+ SynLink doxygenFormulaOperator Operator
+ SynLink doxygenFormula Statement
+ SynLink doxygenSymbol Constant
+ SynLink doxygenSpecial Special
+ SynLink doxygenFormulaSpecial Special
+ "SynColor doxygenFormulaSpecial ctermfg=DarkBlue guifg=DarkBlue
+ endfun
+ call s:Doxygen_Hilights_Base()
+
+ fun! s:Doxygen_Hilights()
+ " Pick a sensible default for 'codeword'.
+ let font=''
+ if exists('g:doxygen_codeword_font')
+ if g:doxygen_codeword_font !~ '\<\k\+='
+ let font='font='.g:doxygen_codeword_font
+ else
+ let font=g:doxygen_codeword_font
+ endif
+ else
+ " Try and pick a font (only some platforms have been tested).
+ if has('gui_running')
+ if has('gui_gtk2')
+ if &guifont == ''
+ let font="font='FreeSerif 12'"
+ else
+ let font="font='".substitute(&guifont, '^.\{-}\(\d\+\)$', 'FreeSerif \1','')."'"
+ endif
+
+ elseif has('gui_win32') || has('gui_win16') || has('gui_win95')
+
+ if exists('g:doxygen_use_bitsream_vera') && g:doxygen_use_bitsream_vera
+ let font_base='Bitstream_Vera_Sans_Mono'
+ else
+ let font_base='Lucida_Console'
+ endif
+ if &guifont == ''
+ let font='font='.font_base.':h10'
+ else
+ let font='font='.matchstr(substitute(&guifont, '^[^:]*', font_base,''),'[^,]*')
+ endif
+ elseif has('gui_athena') || has('gui_gtk') || &guifont=~'^\(-[^-]\+\)\{14}'
+ if &guifont == ''
+ let font='font=-b&h-lucidatypewriter-medium-r-normal-*-*-140-*-*-m-*-iso8859-1'
+ else
+ " let font='font='.substitute(&guifont,'^\(-[^-]\+\)\{7}-\([0-9]\+\).*', '-b\&h-lucidatypewriter-medium-r-normal-*-*-\2-*-*-m-*-iso8859-1','')
+ " The above line works, but it is hard to expect the combination of
+ " the two fonts will look good.
+ endif
+ elseif has('gui_kde')
+ " let font='font=Bitstream\ Vera\ Sans\ Mono/12/-1/5/50/0/0/0/0/0'
+ endif
+ endif
+ endif
+ if font=='' | let font='gui=bold' | endif
+ exe 'SynColor doxygenCodeWord term=bold cterm=bold '.font
+ if (exists('g:doxygen_enhanced_color') && g:doxygen_enhanced_color) || (exists('g:doxygen_enhanced_colour') && g:doxygen_enhanced_colour)
+ if &background=='light'
+ SynColor doxygenComment ctermfg=DarkRed guifg=DarkRed
+ SynColor doxygenBrief cterm=bold ctermfg=Cyan guifg=DarkBlue gui=bold
+ SynColor doxygenBody ctermfg=DarkBlue guifg=DarkBlue
+ SynColor doxygenSpecialTypeOnelineDesc cterm=bold ctermfg=DarkRed guifg=firebrick3 gui=bold
+ SynColor doxygenBOther cterm=bold ctermfg=DarkMagenta guifg=#aa50aa gui=bold
+ SynColor doxygenParam ctermfg=DarkGray guifg=#aa50aa
+ SynColor doxygenParamName cterm=italic ctermfg=DarkBlue guifg=DeepSkyBlue4 gui=italic,bold
+ SynColor doxygenSpecialOnelineDesc cterm=bold ctermfg=DarkCyan guifg=DodgerBlue3 gui=bold
+ SynColor doxygenSpecialHeading cterm=bold ctermfg=DarkBlue guifg=DeepSkyBlue4 gui=bold
+ SynColor doxygenPrev ctermfg=DarkGreen guifg=DarkGreen
+ else
+ SynColor doxygenComment ctermfg=LightRed guifg=LightRed
+ SynColor doxygenBrief cterm=bold ctermfg=Cyan ctermbg=darkgrey guifg=LightBlue gui=Bold,Italic
+ SynColor doxygenBody ctermfg=Cyan guifg=LightBlue
+ SynColor doxygenSpecialTypeOnelineDesc cterm=bold ctermfg=Red guifg=firebrick3 gui=bold
+ SynColor doxygenBOther cterm=bold ctermfg=Magenta guifg=#aa50aa gui=bold
+ SynColor doxygenParam ctermfg=LightGray guifg=LightGray
+ SynColor doxygenParamName cterm=italic ctermfg=LightBlue guifg=LightBlue gui=italic,bold
+ SynColor doxygenSpecialOnelineDesc cterm=bold ctermfg=LightCyan guifg=LightCyan gui=bold
+ SynColor doxygenSpecialHeading cterm=bold ctermfg=LightBlue guifg=LightBlue gui=bold
+ SynColor doxygenPrev ctermfg=LightGreen guifg=LightGreen
+ endif
+ SynLink doxygenValue doxygenParamName
+ else
+ SynLink doxygenComment SpecialComment
+ SynLink doxygenBrief Statement
+ SynLink doxygenBody Comment
+ SynLink doxygenSpecialTypeOnelineDesc Statement
+ SynLink doxygenBOther Constant
+ SynLink doxygenParam SpecialComment
+ SynLink doxygenParamName Underlined
+ SynLink doxygenSpecialOnelineDesc Statement
+ SynLink doxygenSpecialHeading Statement
+ SynLink doxygenPrev SpecialComment
+ SynLink doxygenValue Constant
+ endif
+ SynLink doxygenTParam doxygenParam
+
+ endfun
+
+ call s:Doxygen_Hilights()
+
+ syn match doxygenLeadingWhite +\(^\s*\*\)\@<=\s*+ contained
+
+ " This is still a proposal, but it is probably fine. However, it doesn't
+ " work when 'syntax' is set in a modeline, catch the security error.
+ try
+ aug doxygengroup
+ au!
+ au Syntax UserColor_reset nested call s:Doxygen_Hilights_Base()
+ au Syntax UserColor_{on,reset,enable} nested call s:Doxygen_Hilights()
+ aug END
+ catch /E12:/
+ endtry
+
+
+ SynLink doxygenBody Comment
+ SynLink doxygenLine doxygenBody
+ SynLink doxygenTODO Todo
+ SynLink doxygenOtherTODO Todo
+ SynLink doxygenOtherWARN Todo
+ SynLink doxygenOtherBUG Todo
+ SynLink doxygenLeadingLWhite doxygenBody
+
+ SynLink doxygenErrorSpecial Error
+ SynLink doxygenErrorEnd Error
+ SynLink doxygenErrorComment Error
+ SynLink doxygenLinkError Error
+ SynLink doxygenBriefSpecial doxygenSpecial
+ SynLink doxygenHashSpecial doxygenSpecial
+ SynLink doxygenGroupDefineSpecial doxygenSpecial
+ SynLink doxygenEndlinkSpecial doxygenSpecial
+ SynLink doxygenCodeRegionSpecial doxygenSpecial
+ SynLink doxygenVerbatimRegionSpecial doxygenSpecial
+ SynLink doxygenDotRegionSpecial doxygenSpecial
+ SynLink doxygenGroupDefine doxygenParam
+
+ SynLink doxygenSpecialMultilineDesc doxygenSpecialOnelineDesc
+ SynLink doxygenFormulaEnds doxygenSpecial
+ SynLink doxygenBold doxygenParam
+ SynLink doxygenBriefWord doxygenParam
+ SynLink doxygenRetval doxygenParam
+ SynLink doxygenOther doxygenParam
+ SynLink doxygenStart doxygenComment
+ SynLink doxygenStart2 doxygenStart
+ SynLink doxygenComment2 doxygenComment
+ SynLink doxygenCommentL doxygenComment
+ SynLink doxygenContinueComment doxygenComment
+ SynLink doxygenSpecialContinueComment doxygenComment
+ SynLink doxygenSkipComment doxygenComment
+ SynLink doxygenEndComment doxygenComment
+ SynLink doxygenStartL doxygenComment
+ SynLink doxygenBriefEndComment doxygenComment
+ SynLink doxygenPrevL doxygenPrev
+ SynLink doxygenBriefL doxygenBrief
+ SynLink doxygenBriefLine doxygenBrief
+ SynLink doxygenHeaderLine doxygenSpecialHeading
+ SynLink doxygenCommentWhite Normal
+ SynLink doxygenCommentWhite2 doxygenCommentWhite
+ SynLink doxygenContinueCommentWhite doxygenCommentWhite
+ SynLink doxygenStartSkipWhite doxygenContinueCommentWhite
+ SynLink doxygenLinkWord doxygenParamName
+ SynLink doxygenLinkRest doxygenSpecialMultilineDesc
+ SynLink doxygenHyperLink doxygenLinkWord
+ SynLink doxygenHashLink doxygenLinkWord
+ SynLink doxygenReturnValue doxygenValue
+
+ SynLink doxygenPage doxygenSpecial
+ SynLink doxygenPagePage doxygenBOther
+ SynLink doxygenPageIdent doxygenParamName
+ SynLink doxygenPageDesc doxygenSpecialTypeOnelineDesc
+
+ SynLink doxygenSpecialIdent doxygenPageIdent
+ SynLink doxygenSpecialSectionDesc doxygenSpecialMultilineDesc
+
+ SynLink doxygenSpecialRefWord doxygenOther
+ SynLink doxygenRefWord doxygenPageIdent
+ SynLink doxygenContinueLinkComment doxygenComment
+
+ SynLink doxygenHtmlCh Function
+ SynLink doxygenHtmlCmd Statement
+ SynLink doxygenHtmlBoldItalicUnderline doxygenHtmlBoldUnderlineItalic
+ SynLink doxygenHtmlUnderlineBold doxygenHtmlBoldUnderline
+ SynLink doxygenHtmlUnderlineItalicBold doxygenHtmlBoldUnderlineItalic
+ SynLink doxygenHtmlUnderlineBoldItalic doxygenHtmlBoldUnderlineItalic
+ SynLink doxygenHtmlItalicUnderline doxygenHtmlUnderlineItalic
+ SynLink doxygenHtmlItalicBold doxygenHtmlBoldItalic
+ SynLink doxygenHtmlItalicBoldUnderline doxygenHtmlBoldUnderlineItalic
+ SynLink doxygenHtmlItalicUnderlineBold doxygenHtmlBoldUnderlineItalic
+ SynLink doxygenHtmlLink Underlined
+
+ SynLink doxygenParamDirection StorageClass
+
+
+ if !exists("doxygen_my_rendering") && !exists("html_my_rendering")
+ SynColor doxygenBoldWord term=bold cterm=bold gui=bold
+ SynColor doxygenEmphasisedWord term=italic cterm=italic gui=italic
+ SynLink doxygenArgumentWord doxygenEmphasisedWord
+ SynLink doxygenHtmlCode doxygenCodeWord
+ SynLink doxygenHtmlBold doxygenBoldWord
+ SynColor doxygenHtmlBoldUnderline term=bold,underline cterm=bold,underline gui=bold,underline
+ SynColor doxygenHtmlBoldItalic term=bold,italic cterm=bold,italic gui=bold,italic
+ SynColor doxygenHtmlBoldUnderlineItalic term=bold,italic,underline cterm=bold,italic,underline gui=bold,italic,underline
+ SynColor doxygenHtmlUnderline term=underline cterm=underline gui=underline
+ SynColor doxygenHtmlUnderlineItalic term=italic,underline cterm=italic,underline gui=italic,underline
+ SynColor doxygenHtmlItalic term=italic cterm=italic gui=italic
+ endif
+
+ finally
+ if s:my_synlink | delcommand SynLink | endif
+ if s:my_syncolor | delcommand SynColor | endif
+ endtry
+
+ if &syntax=='idl'
+ syn cluster idlCommentable add=doxygenComment,doxygenCommentL
+ endif
+
+ "syn sync clear
+ "syn sync maxlines=500
+ "syn sync minlines=50
+ syn sync match doxygenComment groupthere cComment "/\@<!/\*"
+ syn sync match doxygenSyncComment grouphere doxygenComment "/\@<!/\*[*!]"
+ "syn sync match doxygenSyncComment grouphere doxygenComment "/\*[*!]" contains=doxygenStart,doxygenTODO keepend
+ syn sync match doxygenSyncEndComment groupthere NONE "\*/"
+
+ if !exists('b:current_syntax')
+ let b:current_syntax = "doxygen"
+ else
+ let b:current_syntax = b:current_syntax.'.doxygen'
+ endif
+
+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
new file mode 100644
index 0000000..a373dc2
--- /dev/null
+++ b/runtime/syntax/dracula.vim
@@ -0,0 +1,72 @@
+" Vim syntax file
+" Language: Dracula
+" Maintainer: Scott Bordelon <slb@artisan.com>
+" Last change: Wed Apr 25 18:50:01 PDT 2001
+" Extensions: drac.*,*.drac,*.drc,*.lvs,*.lpe
+" Comment: Dracula is an industry-standard language created by CADENCE (a
+" company specializing in Electronics Design Automation), for
+" the purposes of Design Rule Checking, Layout vs. Schematic
+" verification, and Layout Parameter Extraction.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Ignore case
+syn case ignore
+
+" A bunch of useful Dracula keywords
+
+"syn match draculaIdentifier
+
+syn keyword draculaStatement indisk primary outdisk printfile system
+syn keyword draculaStatement mode scale resolution listerror keepdata
+syn keyword draculaStatement datatype by lt gt output label range touch
+syn keyword draculaStatement inside outside within overlap outlib
+syn keyword draculaStatement schematic model unit parset
+syn match draculaStatement "flag-\(non45\|acuteangle\|offgrid\)"
+syn match draculaStatement "text-pri-only"
+syn match draculaStatement "[=&]"
+syn match draculaStatement "\[[^,]*\]"
+syn match draculastatement "^ *\(sel\|width\|ext\|enc\|area\|shrink\|grow\|length\)"
+syn match draculastatement "^ *\(or\|not\|and\|select\|size\|connect\|sconnect\|int\)"
+syn match draculastatement "^ *\(softchk\|stamp\|element\|parasitic cap\|attribute cap\)"
+syn match draculastatement "^ *\(flagnon45\|lextract\|equation\|lpeselect\|lpechk\|attach\)"
+syn match draculaStatement "\(temporary\|connect\)-layer"
+syn match draculaStatement "program-dir"
+syn match draculaStatement "status-command"
+syn match draculaStatement "batch-queue"
+syn match draculaStatement "cnames-csen"
+syn match draculaStatement "filter-lay-opt"
+syn match draculaStatement "filter-sch-opt"
+syn match draculaStatement "power-node"
+syn match draculaStatement "ground-node"
+syn match draculaStatement "subckt-name"
+
+syn match draculaType "\*description"
+syn match draculaType "\*input-layer"
+syn match draculaType "\*operation"
+syn match draculaType "\*end"
+
+syn match draculaComment ";.*"
+
+syn match draculaPreProc "^#.*"
+
+"Modify the following as needed. The trade-off is performance versus
+"functionality.
+syn sync lines=50
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "dracula"
+
+" vim: ts=8
diff --git a/runtime/syntax/dsl.vim b/runtime/syntax/dsl.vim
new file mode 100644
index 0000000..95c7843
--- /dev/null
+++ b/runtime/syntax/dsl.vim
@@ -0,0 +1,38 @@
+" Vim syntax file
+" Language: DSSSL
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Tue, 27 Apr 2004 14:54:59 CEST
+" Filenames: *.dsl
+" $Id: dsl.vim,v 1.1 2004/06/13 19:13:31 vimboss Exp $
+
+if exists("b:current_syntax") | finish | endif
+
+runtime syntax/xml.vim
+syn cluster xmlRegionHook add=dslRegion,dslComment
+syn cluster xmlCommentHook add=dslCond
+
+" EXAMPLE:
+" <![ %output.html; [
+" <!-- some comment -->
+" (define html-manifest #f)
+" ]]>
+"
+" NOTE: 'contains' the same as xmlRegion, except xmlTag / xmlEndTag
+syn region dslCond matchgroup=dslCondDelim start="\[\_[^[]\+\[" end="]]" contains=xmlCdata,@xmlRegionCluster,xmlComment,xmlEntity,xmlProcessing,@xmlRegionHook
+
+" NOTE, that dslRegion and dslComment do both NOT have a 'contained'
+" argument, so this will also work in plain dsssl documents.
+
+syn region dslRegion matchgroup=Delimiter start=+(+ end=+)+ contains=dslRegion,dslString,dslComment
+syn match dslString +"\_[^"]*"+ contained
+syn match dslComment +;.*$+ contains=dslTodo
+syn keyword dslTodo contained TODO FIXME XXX display
+
+" The default highlighting.
+hi def link dslTodo Todo
+hi def link dslString String
+hi def link dslComment Comment
+" compare the following with xmlCdataStart / xmlCdataEnd
+hi def link dslCondDelim Type
+
+let b:current_syntax = "dsl"
diff --git a/runtime/syntax/dtd.vim b/runtime/syntax/dtd.vim
new file mode 100644
index 0000000..58f07c9
--- /dev/null
+++ b/runtime/syntax/dtd.vim
@@ -0,0 +1,161 @@
+" Vim syntax file
+" Language: DTD (Document Type Definition for XML)
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Repository: https://github.com/chrisbra/vim-xml-ftplugin
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Author: Daniel Amyot <damyot@site.uottawa.ca>
+" Last Changed: Sept 24, 2019
+" Filenames: *.dtd
+"
+" REFERENCES:
+" http://www.w3.org/TR/html40/
+" http://www.w3.org/TR/NOTE-html-970421
+"
+" TODO:
+" - improve synchronizing.
+
+if exists("b:current_syntax")
+ finish
+endif
+let s:dtd_cpo_save = &cpo
+set cpo&vim
+
+if !exists("dtd_ignore_case")
+ " I prefer having the case takes into consideration.
+ syn case match
+else
+ syn case ignore
+endif
+
+
+" the following line makes the opening <! and
+" closing > highlighted using 'dtdFunction'.
+"
+" PROVIDES: @dtdTagHook
+"
+syn region dtdTag matchgroup=dtdFunction
+ \ start=+<!+ end=+>+ matchgroup=NONE
+ \ contains=dtdTag,dtdTagName,dtdError,dtdComment,dtdString,dtdAttrType,dtdAttrDef,dtdEnum,dtdParamEntityInst,dtdParamEntityDecl,dtdCard,@dtdTagHook
+
+if !exists("dtd_no_tag_errors")
+ " mark everything as an error which starts with a <!
+ " and is not overridden later. If this is annoying,
+ " it can be switched off by setting the variable
+ " dtd_no_tag_errors.
+ syn region dtdError contained start=+<!+lc=2 end=+>+
+endif
+
+" if this is a html like comment highlight also
+" the opening <! and the closing > as Comment.
+syn region dtdComment start=+<![ \t]*--+ end=+-->+ contains=dtdTodo,@Spell
+
+
+" proper DTD comment
+syn region dtdComment contained start=+--+ end=+--+ contains=dtdTodo,@Spell
+
+
+" Start tags (keywords). This is contained in dtdFunction.
+" Note that everything not contained here will be marked
+" as error.
+syn match dtdTagName contained +<!\(ATTLIST\|DOCTYPE\|ELEMENT\|ENTITY\|NOTATION\|SHORTREF\|USEMAP\|\[\)+lc=2,hs=s+2
+
+
+" wildcards and operators
+syn match dtdCard contained "|"
+syn match dtdCard contained ","
+" evenutally overridden by dtdEntity
+syn match dtdCard contained "&"
+syn match dtdCard contained "?"
+syn match dtdCard contained "\*"
+syn match dtdCard contained "+"
+
+" ...and finally, special cases.
+syn match dtdCard "ANY"
+syn match dtdCard "EMPTY"
+
+if !exists("dtd_no_param_entities")
+
+ " highlight parameter entity declarations
+ " and instances. Note that the closing `;'
+ " is optional.
+
+ " instances
+ syn region dtdParamEntityInst oneline matchgroup=dtdParamEntityPunct
+ \ start="%[-_a-zA-Z0-9.]\+"he=s+1,rs=s+1
+ \ skip=+[-_a-zA-Z0-9.]+
+ \ end=";\|\>"
+ \ matchgroup=NONE contains=dtdParamEntityPunct
+ syn match dtdParamEntityPunct contained "\."
+
+ " declarations
+ " syn region dtdParamEntityDecl oneline matchgroup=dtdParamEntityDPunct start=+<!ENTITY % +lc=8 skip=+[-_a-zA-Z0-9.]+ matchgroup=NONE end="\>" contains=dtdParamEntityDPunct
+ syn match dtdParamEntityDecl +<!ENTITY % [-_a-zA-Z0-9.]*+lc=8 contains=dtdParamEntityDPunct
+ syn match dtdParamEntityDPunct contained "%\|\."
+
+endif
+
+" &entities; compare with xml
+syn match dtdEntity "&[^; \t]*;" contains=dtdEntityPunct
+syn match dtdEntityPunct contained "[&.;]"
+
+" Strings are between quotes
+syn region dtdString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=dtdAttrDef,dtdAttrType,dtdParamEntityInst,dtdEntity,dtdCard
+syn region dtdString start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=dtdAttrDef,dtdAttrType,dtdParamEntityInst,dtdEntity,dtdCard
+
+" Enumeration of elements or data between parenthesis
+"
+" PROVIDES: @dtdEnumHook
+"
+syn region dtdEnum matchgroup=dtdType start="(" end=")" matchgroup=NONE contains=dtdEnum,dtdParamEntityInst,dtdCard,@dtdEnumHook
+
+"Attribute types
+syn keyword dtdAttrType NMTOKEN ENTITIES NMTOKENS ID CDATA
+syn keyword dtdAttrType IDREF IDREFS
+" ENTITY has to treated special for not overriding <!ENTITY
+syn match dtdAttrType +[^!]\<ENTITY+
+
+"Attribute Definitions
+syn match dtdAttrDef "#REQUIRED"
+syn match dtdAttrDef "#IMPLIED"
+syn match dtdAttrDef "#FIXED"
+
+syn case match
+" define some common keywords to mark TODO
+" and important sections inside comments.
+syn keyword dtdTodo contained TODO FIXME XXX
+
+syn sync lines=250
+
+" Define the default highlighting.
+" 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
+
+let b:current_syntax = "dtd"
+
+" vim: ts=8
diff --git a/runtime/syntax/dtml.vim b/runtime/syntax/dtml.vim
new file mode 100644
index 0000000..cb09de8
--- /dev/null
+++ b/runtime/syntax/dtml.vim
@@ -0,0 +1,208 @@
+" DTML syntax file
+" Language: Zope's Dynamic Template Markup Language
+" Maintainer: Jean Jordaan <jean@upfrontsystems.co.za> (njj)
+" Last change: 2001 Sep 02
+
+" These are used with Claudio Fleiner's html.vim in the standard distribution.
+"
+" Still very hackish. The 'dtml attributes' and 'dtml methods' have been
+" hacked out of the Zope Quick Reference in case someone finds something
+" sensible to do with them. I certainly haven't.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" First load the HTML syntax
+runtime! syntax/html.vim
+
+syn case match
+
+" This doesn't have any effect. Does it need to be moved to above/
+" if !exists("main_syntax")
+" let main_syntax = 'dtml'
+" endif
+
+" dtml attributes
+syn keyword dtmlAttribute ac_inherited_permissions access_debug_info contained
+syn keyword dtmlAttribute acquiredRolesAreUsedBy all_meta_types assume_children AUTH_TYPE contained
+syn keyword dtmlAttribute AUTHENTICATED_USER AUTHENTICATION_PATH BASE0 batch-end-index batch-size contained
+syn keyword dtmlAttribute batch-start-index bobobase_modification_time boundary branches contained
+syn keyword dtmlAttribute branches_expr capitalize cb_dataItems cb_dataValid cb_isCopyable contained
+syn keyword dtmlAttribute cb_isMoveable changeClassId classDefinedAndInheritedPermissions contained
+syn keyword dtmlAttribute classDefinedPermissions classInheritedPermissions collapse-all column contained
+syn keyword dtmlAttribute connected connectionIsValid CONTENT_LENGTH CONTENT_TYPE cook cookies contained
+syn keyword dtmlAttribute COPY count- createInObjectManager da_has_single_argument dav__allprop contained
+syn keyword dtmlAttribute dav__init dav__propnames dav__propstat dav__validate default contained
+syn keyword dtmlAttribute delClassAttr DELETE Destination DestinationURL digits discard contained
+syn keyword dtmlAttribute disposition document_src e encode enter etc expand-all expr File contained
+syn keyword dtmlAttribute filtered_manage_options filtered_meta_types first- fmt footer form contained
+syn keyword dtmlAttribute GATEWAY_INTERFACE get_local_roles get_local_roles_for_userid contained
+syn keyword dtmlAttribute get_request_var_or_attr get_size get_size get_valid_userids getAttribute contained
+syn keyword dtmlAttribute getAttributeNode getAttributes getChildNodes getClassAttr getContentType contained
+syn keyword dtmlAttribute getData getDocType getDocumentElement getElementsByTagName getFirstChild contained
+syn keyword dtmlAttribute getImplementation getLastChild getLength getName getNextSibling contained
+syn keyword dtmlAttribute getNodeName getNodeType getNodeValue getOwnerDocument getParentNode contained
+syn keyword dtmlAttribute getPreviousSibling getProperty getPropertyType getSize getSize getSize contained
+syn keyword dtmlAttribute get_size getTagName getUser getUserName getUserNames getUsers contained
+syn keyword dtmlAttribute has_local_roles hasChildNodes hasProperty HEAD header hexdigits HTML contained
+syn keyword dtmlAttribute html_quote HTMLFile id index_html index_objects indexes contained
+syn keyword dtmlAttribute inheritedAttribute items last- leave leave_another leaves letters LOCK contained
+syn keyword dtmlAttribute locked_in_version lower lowercase mailfrom mailhost mailhost_list mailto contained
+syn keyword dtmlAttribute manage manage_ methods manage_access manage_acquiredPermissions contained
+syn keyword dtmlAttribute manage_addConferaTopic manage_addDocument manage_addDTMLDocument contained
+syn keyword dtmlAttribute manage_addDTMLMethod manage_addFile manage_addFolder manage_addImage contained
+syn keyword dtmlAttribute manage_addLocalRoles manage_addMailHost manage_addPermission contained
+syn keyword dtmlAttribute manage_addPrincipiaFactory manage_addProduct manage_addProperty contained
+syn keyword dtmlAttribute manage_addUserFolder manage_addZClass manage_addZGadflyConnection contained
+syn keyword dtmlAttribute manage_addZGadflyConnectionForm manage_advanced manage_afterAdd contained
+syn keyword dtmlAttribute manage_afterClone manage_beforeDelete manage_changePermissions contained
+syn keyword dtmlAttribute manage_changeProperties manage_clone manage_CopyContainerFirstItem contained
+syn keyword dtmlAttribute manage_copyObjects manage_cutObjects manage_defined_roles contained
+syn keyword dtmlAttribute manage_delLocalRoles manage_delObjects manage_delProperties contained
+syn keyword dtmlAttribute manage_distribute manage_edit manage_editedDialog manage_editProperties contained
+syn keyword dtmlAttribute manage_editRoles manage_exportObject manage_FTPget manage_FTPlist contained
+syn keyword dtmlAttribute manage_FTPstat manage_get_product_readme__ manage_getPermissionMapping contained
+syn keyword dtmlAttribute manage_haveProxy manage_help manage_importObject manage_listLocalRoles contained
+syn keyword dtmlAttribute manage_options manage_pasteObjects manage_permission contained
+syn keyword dtmlAttribute manage_propertiesForm manage_proxy manage_renameObject manage_role contained
+syn keyword dtmlAttribute manage_setLocalRoles manage_setPermissionMapping contained
+syn keyword dtmlAttribute manage_subclassableClassNames manage_test manage_testForm contained
+syn keyword dtmlAttribute manage_undo_transactions manage_upload manage_users manage_workspace contained
+syn keyword dtmlAttribute management_interface mapping math max- mean- median- meta_type min- contained
+syn keyword dtmlAttribute MKCOL modified_in_version MOVE multiple name navigate_filter new_version contained
+syn keyword dtmlAttribute newline_to_br next next-batches next-sequence next-sequence-end-index contained
+syn keyword dtmlAttribute next-sequence-size next-sequence-start-index no manage_access None contained
+syn keyword dtmlAttribute nonempty normalize nowrap null Object Manager objectIds objectItems contained
+syn keyword dtmlAttribute objectMap objectValues octdigits only optional OPTIONS orphan overlap contained
+syn keyword dtmlAttribute PARENTS PATH_INFO PATH_TRANSLATED permission_settings contained
+syn keyword dtmlAttribute permissionMappingPossibleValues permissionsOfRole pi port contained
+syn keyword dtmlAttribute possible_permissions previous previous-batches previous-sequence contained
+syn keyword dtmlAttribute previous-sequence-end-index previous-sequence-size contained
+syn keyword dtmlAttribute previous-sequence-start-index PrincipiaFind PrincipiaSearchSource contained
+syn keyword dtmlAttribute propdict propertyIds propertyItems propertyLabel propertyMap propertyMap contained
+syn keyword dtmlAttribute propertyValues PROPFIND PROPPATCH PUT query_day query_month QUERY_STRING contained
+syn keyword dtmlAttribute query_year quoted_input quoted_report raise_standardErrorMessage random contained
+syn keyword dtmlAttribute read read_raw REMOTE_ADDR REMOTE_HOST REMOTE_IDENT REMOTE_USER REQUEST contained
+syn keyword dtmlAttribute REQUESTED_METHOD required RESPONSE reverse rolesOfPermission save schema contained
+syn keyword dtmlAttribute SCRIPT_NAME sequence-end sequence-even sequence-index contained
+syn keyword dtmlAttribute sequence-index-var- sequence-item sequence-key sequence-Letter contained
+syn keyword dtmlAttribute sequence-letter sequence-number sequence-odd sequence-query contained
+syn keyword dtmlAttribute sequence-roman sequence-Roman sequence-start sequence-step-end-index contained
+syn keyword dtmlAttribute sequence-step-size sequence-step-start-index sequence-var- SERVER_NAME contained
+syn keyword dtmlAttribute SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE setClassAttr setName single contained
+syn keyword dtmlAttribute size skip_unauthorized smtphost sort spacify sql_quote SQLConnectionIDs contained
+syn keyword dtmlAttribute standard-deviation- standard-deviation-n- standard_html_footer contained
+syn keyword dtmlAttribute standard_html_header start String string subject SubTemplate superValues contained
+syn keyword dtmlAttribute tabs_path_info tag test_url_ text_content this thousands_commas title contained
+syn keyword dtmlAttribute title_and_id title_or_id total- tpURL tpValues TRACE translate tree-c contained
+syn keyword dtmlAttribute tree-colspan tree-e tree-item-expanded tree-item-url tree-level contained
+syn keyword dtmlAttribute tree-root-url tree-s tree-state type undoable_transactions UNLOCK contained
+syn keyword dtmlAttribute update_data upper uppercase url url_quote URLn user_names contained
+syn keyword dtmlAttribute userdefined_roles valid_property_id valid_roles validate_roles contained
+syn keyword dtmlAttribute validClipData validRoles values variance- variance-n- view_image_or_file contained
+syn keyword dtmlAttribute where whitespace whrandom xml_namespace zclass_candidate_view_actions contained
+syn keyword dtmlAttribute ZClassBaseClassNames ziconImage ZopeFind ZQueryIds contained
+
+syn keyword dtmlMethod abs absolute_url ac_inherited_permissions aCommon contained
+syn keyword dtmlMethod aCommonZ acos acquiredRolesAreUsedBy aDay addPropertySheet aMonth AMPM contained
+syn keyword dtmlMethod ampm AMPMMinutes appendChild appendData appendHeader asin atan atan2 contained
+syn keyword dtmlMethod atof atoi betavariate capatilize capwords catalog_object ceil center contained
+syn keyword dtmlMethod choice chr cloneNode COPY cos cosh count createInObjectManager contained
+syn keyword dtmlMethod createSQLInput cunifvariate Date DateTime Day day dayOfYear dd default contained
+syn keyword dtmlMethod DELETE deleteData delPropertySheet divmod document_id document_title dow contained
+syn keyword dtmlMethod earliestTime enter equalTo exp expireCookie expovariate fabs fCommon contained
+syn keyword dtmlMethod fCommonZ filtered_manage_options filtered_meta_types find float floor contained
+syn keyword dtmlMethod fmod frexp gamma gauss get get_local_roles_for_userid get_size getattr contained
+syn keyword dtmlMethod getAttribute getAttributeNode getClassAttr getDomains contained
+syn keyword dtmlMethod getElementsByTagName getHeader getitem getNamedItem getobject contained
+syn keyword dtmlMethod getObjectsInfo getpath getProperty getRoles getStatus getUser contained
+syn keyword dtmlMethod getUserName greaterThan greaterThanEqualTo h_12 h_24 has_key contained
+syn keyword dtmlMethod has_permission has_role hasattr hasFeature hash hasProperty HEAD hex contained
+syn keyword dtmlMethod hour hypot index index_html inheritedAttribute insertBefore insertData contained
+syn keyword dtmlMethod int isCurrentDay isCurrentHour isCurrentMinute isCurrentMonth contained
+syn keyword dtmlMethod isCurrentYear isFuture isLeadYear isPast item join latestTime ldexp contained
+syn keyword dtmlMethod leave leave_another len lessThan lessThanEqualTo ljust log log10 contained
+syn keyword dtmlMethod lognormvariate lower lstrip maketrans manage manage_access contained
+syn keyword dtmlMethod manage_acquiredPermissions manage_addColumn manage_addDocument contained
+syn keyword dtmlMethod manage_addDTMLDocument manage_addDTMLMethod manage_addFile contained
+syn keyword dtmlMethod manage_addFolder manage_addImage manage_addIndex manage_addLocalRoles contained
+syn keyword dtmlMethod manage_addMailHost manage_addPermission manage_addPrincipiaFactory contained
+syn keyword dtmlMethod manage_addProduct manage_addProperty manage_addPropertySheet contained
+syn keyword dtmlMethod manage_addUserFolder manage_addZCatalog manage_addZClass contained
+syn keyword dtmlMethod manage_addZGadflyConnection manage_addZGadflyConnectionForm contained
+syn keyword dtmlMethod manage_advanced manage_catalogClear manage_catalogFoundItems contained
+syn keyword dtmlMethod manage_catalogObject manage_catalogReindex manage_changePermissions contained
+syn keyword dtmlMethod manage_changeProperties manage_clone manage_CopyContainerFirstItem contained
+syn keyword dtmlMethod manage_copyObjects manage_createEditor manage_createView contained
+syn keyword dtmlMethod manage_cutObjects manage_defined_roles manage_delColumns contained
+syn keyword dtmlMethod manage_delIndexes manage_delLocalRoles manage_delObjects contained
+syn keyword dtmlMethod manage_delProperties manage_Discard__draft__ manage_distribute contained
+syn keyword dtmlMethod manage_edit manage_edit manage_editedDialog manage_editProperties contained
+syn keyword dtmlMethod manage_editRoles manage_exportObject manage_importObject contained
+syn keyword dtmlMethod manage_makeChanges manage_pasteObjects manage_permission contained
+syn keyword dtmlMethod manage_propertiesForm manage_proxy manage_renameObject manage_role contained
+syn keyword dtmlMethod manage_Save__draft__ manage_setLocalRoles manage_setPermissionMapping contained
+syn keyword dtmlMethod manage_test manage_testForm manage_uncatalogObject contained
+syn keyword dtmlMethod manage_undo_transactions manage_upload manage_users manage_workspace contained
+syn keyword dtmlMethod mange_createWizard max min minute MKCOL mm modf month Month MOVE contained
+syn keyword dtmlMethod namespace new_version nextObject normalvariate notEqualTo objectIds contained
+syn keyword dtmlMethod objectItems objectValues oct OPTIONS ord paretovariate parts pCommon contained
+syn keyword dtmlMethod pCommonZ pDay permissionsOfRole pMonth pow PreciseAMPM PreciseTime contained
+syn keyword dtmlMethod previousObject propertyInfo propertyLabel PROPFIND PROPPATCH PUT quit contained
+syn keyword dtmlMethod raise_standardErrorMessage randint random read read_raw redirect contained
+syn keyword dtmlMethod removeAttribute removeAttributeNode removeChild replace replaceChild contained
+syn keyword dtmlMethod replaceData rfc822 rfind rindex rjust rolesOfPermission round rstrip contained
+syn keyword dtmlMethod save searchResults second seed set setAttribute setAttributeNode setBase contained
+syn keyword dtmlMethod setCookie setHeader setStatus sin sinh split splitText sqrt str strip contained
+syn keyword dtmlMethod substringData superValues swapcase tabs_path_info tan tanh Time contained
+syn keyword dtmlMethod TimeMinutes timeTime timezone title title_and_id title_or_id toXML contained
+syn keyword dtmlMethod toZone uncatalog_object undoable_transactions uniform uniqueValuesFor contained
+syn keyword dtmlMethod update_data upper valid_property_id validate_roles vonmisesvariate contained
+syn keyword dtmlMethod weibullvariate year yy zfill ZopeFind contained
+
+" DTML tags
+syn keyword dtmlTagName var if elif else unless in with let call raise try except tag comment tree sqlvar sqltest sqlgroup sendmail mime transparent contained
+
+syn keyword dtmlEndTagName if unless in with let raise try tree sendmail transparent contained
+
+" Own additions
+syn keyword dtmlTODO TODO FIXME contained
+
+syn region dtmlComment start=+<dtml-comment>+ end=+</dtml-comment>+ contains=dtmlTODO
+
+" All dtmlTagNames are contained by dtmlIsTag.
+syn match dtmlIsTag "dtml-[A-Za-z]\+" contains=dtmlTagName
+
+" 'var' tag entity syntax: &dtml-variableName;
+" - with attributes: &dtml.attribute1[.attribute2]...-variableName;
+syn match dtmlSpecialChar "&dtml[.0-9A-Za-z_]\{-}-[0-9A-Za-z_.]\+;"
+
+" Redefine to allow inclusion of DTML within HTML strings.
+syn cluster htmlTop contains=@Spell,htmlTag,htmlEndTag,dtmlSpecialChar,htmlSpecialChar,htmlPreProc,htmlComment,htmlLink,javaScript,@htmlPreproc
+syn region htmlLink start="<a\>[^>]*href\>" end="</a>"me=e-4 contains=@Spell,htmlTag,htmlEndTag,dtmlSpecialChar,htmlSpecialChar,htmlPreProc,htmlComment,javaScript,@htmlPreproc
+syn region htmlHead start="<head\>" end="</head>"me=e-7 end="<body\>"me=e-5 end="<h[1-6]\>"me=e-3 contains=htmlTag,htmlEndTag,dtmlSpecialChar,htmlSpecialChar,htmlPreProc,htmlComment,htmlLink,htmlTitle,javaScript,cssStyle,@htmlPreproc
+syn region htmlTitle start="<title\>" end="</title>"me=e-8 contains=htmlTag,htmlEndTag,dtmlSpecialChar,htmlSpecialChar,htmlPreProc,htmlComment,javaScript,@htmlPreproc
+syn region htmlString contained start=+"+ end=+"+ contains=dtmlSpecialChar,htmlSpecialChar,javaScriptExpression,dtmlIsTag,dtmlAttribute,dtmlMethod,@htmlPreproc
+syn match htmlTagN contained +<\s*[-a-zA-Z0-9]\++hs=s+1 contains=htmlTagName,htmlSpecialTagName,dtmlIsTag,dtmlAttribute,dtmlMethod,@htmlTagNameCluster
+syn match htmlTagN contained +</\s*[-a-zA-Z0-9]\++hs=s+2 contains=htmlTagName,htmlSpecialTagName,dtmlIsTag,dtmlAttribute,dtmlMethod,@htmlTagNameCluster
+
+" Define the default highlighting.
+" 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"
+
+" if main_syntax == 'dtml'
+" unlet main_syntax
+" endif
+
+" vim: ts=4
diff --git a/runtime/syntax/dtrace.vim b/runtime/syntax/dtrace.vim
new file mode 100644
index 0000000..392fa1c
--- /dev/null
+++ b/runtime/syntax/dtrace.vim
@@ -0,0 +1,145 @@
+" DTrace D script syntax file. To avoid confusion with the D programming
+" language, I call this script dtrace.vim instead of d.vim.
+" Language: D script as described in "Solaris Dynamic Tracing Guide",
+" http://docs.sun.com/app/docs/doc/817-6223
+" Version: 1.5
+" Last Change: 2008/04/05
+" Maintainer: Nicolas Weber <nicolasweber@gmx.de>
+
+" dtrace lexer and parser are at
+" 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
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the C syntax to start with
+runtime! syntax/c.vim
+unlet b:current_syntax
+
+syn clear cCommentL " dtrace doesn't support // style comments
+
+" First line may start with #!, also make sure a '-s' flag is somewhere in
+" that line.
+syn match dtraceComment "\%^#!.*-s.*"
+
+" Probe descriptors need explicit matches, so that keywords in probe
+" descriptors don't show up as errors. Note that this regex detects probes
+" as "something with three ':' in it". This works in practice, but it's not
+" really correct. Also add special case code for BEGIN, END and ERROR, since
+" they are common.
+" Be careful not to detect '/*some:::node*/\n/**/' as probe, as it's
+" commented out.
+" XXX: This allows a probe description to end with ',', even if it's not
+" followed by another probe.
+" XXX: This doesn't work if followed by a comment.
+let s:oneProbe = '\%(BEGIN\|END\|ERROR\|\S\{-}:\S\{-}:\S\{-}:\S\{-}\)\_s*'
+exec 'syn match dtraceProbe "'.s:oneProbe.'\%(,\_s*'.s:oneProbe.'\)*\ze\_s\%({\|\/[^*]\|\%$\)"'
+
+" Note: We have to be careful to not make this match /* */ comments.
+" Also be careful not to eat `c = a / b; b = a / 2;`. We use the same
+" technique as the dtrace lexer: a predicate has to be followed by {, ;, or
+" EOF. Also note that dtrace doesn't allow an empty predicate // (we do).
+" This regex doesn't allow a divison operator in the predicate.
+" Make sure that this matches the empty predicate as well.
+" XXX: This doesn't work if followed by a comment.
+syn match dtracePredicate "/\*\@!\_[^/]*/\ze\_s*\%({\|;\|\%$\)"
+ "contains=ALLBUT,dtraceOption " this lets the region contain too much stuff
+
+" Pragmas.
+" dtrace seems not to support whitespace before or after the '='. dtrace
+" supports only one option per #pragma, and no continuations of #pragma over
+" several lines with '\'.
+" Note that dtrace treats units (Hz etc) as case-insenstive, we allow only
+" sane unit capitalization in this script (ie 'ns', 'us', 'ms', 's' have to be
+" small, Hertz can be 'Hz' or 'hz')
+" XXX: "cpu" is always highlighted as builtin var, not as option
+
+" auto or manual: bufresize
+syn match dtraceOption contained "bufresize=\%(auto\|manual\)\s*$"
+
+" scalar: cpu jstackframes jstackstrsize nspec stackframes stackindent ustackframes
+syn match dtraceOption contained "\%(cpu\|jstackframes\|jstackstrsize\|nspec\|stackframes\|stackindent\|ustackframes\)=\d\+\s*$"
+
+" size: aggsize bufsize dynvarsize specsize strsize
+" size defaults to something if no unit is given (ie., having no unit is ok)
+syn match dtraceOption contained "\%(aggsize\|bufsize\|dynvarsize\|specsize\|strsize\)=\d\+\%(k\|m\|g\|t\|K\|M\|G\|T\)\=\s*$"
+
+" time: aggrate cleanrate statusrate switchrate
+" time defaults to hz if no unit is given
+syn match dtraceOption contained "\%(aggrate\|cleanrate\|statusrate\|switchrate\)=\d\+\%(hz\|Hz\|ns\|us\|ms\|s\)\=\s*$"
+
+" No type: defaultargs destructive flowindent grabanon quiet rawbytes
+syn match dtraceOption contained "\%(defaultargs\|destructive\|flowindent\|grabanon\|quiet\|rawbytes\)\s*$"
+
+
+" Turn reserved but unspecified keywords into errors
+syn keyword dtraceReservedKeyword auto break case continue counter default do
+syn keyword dtraceReservedKeyword else for goto if import probe provider
+syn keyword dtraceReservedKeyword register restrict return static switch while
+
+" Add dtrace-specific stuff
+syn keyword dtraceOperator sizeof offsetof stringof xlate
+syn keyword dtraceStatement self inline xlate this translator
+
+" Builtin variables
+syn keyword dtraceIdentifier arg0 arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9
+syn keyword dtraceIdentifier args caller chip cpu curcpu curlwpsinfo curpsinfo
+syn keyword dtraceIdentifier curthread cwd epid errno execname gid id ipl lgrp
+syn keyword dtraceIdentifier pid ppid probefunc probemod probename probeprov
+syn keyword dtraceIdentifier pset root stackdepth tid timestamp uid uregs
+syn keyword dtraceIdentifier vtimestamp walltimestamp
+syn keyword dtraceIdentifier ustackdepth
+
+" Macro Variables
+syn match dtraceConstant "$[0-9]\+"
+syn match dtraceConstant "$\(egid\|euid\|gid\|pgid\|ppid\)"
+syn match dtraceConstant "$\(projid\|sid\|target\|taskid\|uid\)"
+
+" Data Recording Actions
+syn keyword dtraceFunction trace tracemem printf printa stack ustack jstack
+
+" Process Destructive Actions
+syn keyword dtraceFunction stop raise copyout copyoutstr system
+
+" Kernel Destructive Actions
+syn keyword dtraceFunction breakpoint panic chill
+
+" Special Actions
+syn keyword dtraceFunction speculate commit discard exit
+
+" Subroutines
+syn keyword dtraceFunction alloca basename bcopy cleanpath copyin copyinstr
+syn keyword dtraceFunction copyinto dirname msgdsize msgsize mutex_owned
+syn keyword dtraceFunction mutex_owner mutex_type_adaptive progenyof
+syn keyword dtraceFunction rand rw_iswriter rw_write_held speculation
+syn keyword dtraceFunction strjoin strlen
+
+" Aggregating Functions
+syn keyword dtraceAggregatingFunction count sum avg min max lquantize quantize
+
+syn keyword dtraceType int8_t int16_t int32_t int64_t intptr_t
+syn keyword dtraceType uint8_t uint16_t uint32_t uint64_t uintptr_t
+syn keyword dtraceType string
+syn keyword dtraceType pid_t id_t
+
+
+" Define the default highlighting.
+" We use `hi def link` directly, this requires 5.8.
+hi def link dtraceReservedKeyword Error
+hi def link dtracePredicate String
+hi def link dtraceProbe dtraceStatement
+hi def link dtraceStatement Statement
+hi def link dtraceConstant Constant
+hi def link dtraceIdentifier Identifier
+hi def link dtraceAggregatingFunction dtraceFunction
+hi def link dtraceFunction Function
+hi def link dtraceType Type
+hi def link dtraceOperator Operator
+hi def link dtraceComment Comment
+hi def link dtraceNumber Number
+hi def link dtraceOption Identifier
+
+let b:current_syntax = "dtrace"
diff --git a/runtime/syntax/dts.vim b/runtime/syntax/dts.vim
new file mode 100644
index 0000000..be51ab5
--- /dev/null
+++ b/runtime/syntax/dts.vim
@@ -0,0 +1,79 @@
+" Vim syntax file
+" Language: dts/dtsi (device tree files)
+" Maintainer: Daniel Mack <vim@zonque.org>
+" Last Change: 2022 Jun 14
+
+if exists("b:current_syntax")
+ finish
+endif
+let b:current_syntax = 'dts'
+
+syntax region dtsComment start="/\*" end="\*/"
+syntax match dtsReference "&[[:alpha:][:digit:]_]\+"
+syntax region dtsBinaryProperty start="\[" end="\]"
+syntax match dtsStringProperty "\".*\""
+syntax match dtsKeyword "/.\{-1,\}/"
+syntax match dtsLabel "^[[:space:]]*[[:alpha:][:digit:]_]\+:"
+syntax match dtsNode /[[:alpha:][:digit:]-_]\+\(@[0-9a-fA-F]\+\|\)[[:space:]]*{/he=e-1
+syntax region dtsCellProperty start="<" end=">" contains=dtsReference,dtsBinaryProperty,dtsStringProperty,dtsComment
+syntax region dtsCommentInner start="/\*" end="\*/"
+syntax match dtsCommentLine "//.*$"
+
+" Accept %: for # (C99)
+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*\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
+ else
+ 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*\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
+ else
+ syn region cCppInElse contained start="^\s*\(%:\|#\)\s*\(else\>\|elif\s\+\(0*[1-9]\d*\s*\($\|//\|/\*\||\)\)\@!\)" end=".\@=\|$" containedin=cCppInIf contains=cCppInElse2
+ endif
+ syn region cCppInElse2 contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(else\|elif\)\([^/]\|/[^/*]\)*" end="^\s*\(%:\|#\)\s*endif\>"me=s-1 contains=cSpaceError,cCppOutSkip,@Spell
+ syn region cCppOutSkip contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cSpaceError,cCppOutSkip
+ syn region cCppInSkip contained matchgroup=cCppInWrapper start="^\s*\(%:\|#\)\s*\(if\s\+\(\d\+\s*\($\|//\|/\*\||\|&\)\)\@!\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" containedin=cCppOutElse,cCppInIf,cCppInSkip contains=TOP,cPreProc
+endif
+syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match cIncluded display contained "<[^>]*>"
+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*\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
+
+hi def link dtsCellProperty Number
+hi def link dtsBinaryProperty Number
+hi def link dtsStringProperty String
+hi def link dtsKeyword Include
+hi def link dtsLabel Label
+hi def link dtsNode Structure
+hi def link dtsReference Macro
+hi def link dtsComment Comment
+hi def link dtsCommentInner Comment
+hi def link dtsCommentLine Comment
+
+hi def link cInclude Include
+hi def link cPreProc PreProc
+hi def link cDefine Macro
+hi def link cIncluded cString
+hi def link cString String
+
+hi def link cCppInWrapper cCppOutWrapper
+hi def link cCppOutWrapper cPreCondit
+hi def link cPreConditMatch cPreCondit
+hi def link cPreCondit PreCondit
+hi def link cCppOutSkip cCppOutIf2
+
+hi def link cCppInElse2 cCppOutIf2
+hi def link cCppOutIf2 cCppOut
+hi def link cCppOut Comment
diff --git a/runtime/syntax/dune.vim b/runtime/syntax/dune.vim
new file mode 100644
index 0000000..b425405
--- /dev/null
+++ b/runtime/syntax/dune.vim
@@ -0,0 +1,47 @@
+" Vim syntax file
+" Language: Dune buildsystem
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" Anton Kochkov <anton.kochkov@gmail.com>
+" URL: https://github.com/ocaml/vim-ocaml
+" Last Change:
+" 2019 Feb 27 - Add newer keywords to the syntax (Simon Cruanes)
+" 2018 May 8 - Check current_syntax (Kawahara Satoru)
+" 2018 Mar 29 - Extend jbuild syntax with more keywords (Petter A. Urkedal)
+" 2017 Sep 6 - Initial version (Etienne Millon)
+
+if exists("b:current_syntax")
+ finish
+endif
+
+set syntax=lisp
+syn case match
+
+" The syn-iskeyword setting lacks #,? from the iskeyword setting here.
+" Clearing it avoids maintaining keyword characters in multiple places.
+syn iskeyword clear
+
+syn keyword lispDecl jbuild_version library executable executables rule ocamllex ocamlyacc menhir alias install
+
+syn keyword lispKey name public_name synopsis modules libraries wrapped
+syn keyword lispKey preprocess preprocessor_deps optional c_names cxx_names
+syn keyword lispKey install_c_headers modes no_dynlink self_build_stubs_archive
+syn keyword lispKey ppx_runtime_libraries virtual_deps js_of_ocaml link_flags
+syn keyword lispKey javascript_files flags ocamlc_flags ocamlopt_flags pps staged_pps
+syn keyword lispKey library_flags c_flags c_library_flags kind package action
+syn keyword lispKey deps targets locks fallback
+syn keyword lispKey inline_tests tests test names
+
+syn keyword lispAtom true false
+
+syn keyword lispFunc cat chdir copy# diff? echo run setenv
+syn keyword lispFunc ignore-stdout ignore-stderr ignore-outputs
+syn keyword lispFunc with-stdout-to with-stderr-to with-outputs-to
+syn keyword lispFunc write-file system bash
+
+syn cluster lispBaseListCluster add=duneVar
+syn match duneVar '\${[@<^]}' containedin=lispSymbol
+syn match duneVar '\${\k\+\(:\k\+\)\?}' containedin=lispSymbol
+
+hi def link duneVar Identifier
+
+let b:current_syntax = "dune"
diff --git a/runtime/syntax/dylan.vim b/runtime/syntax/dylan.vim
new file mode 100644
index 0000000..345e932
--- /dev/null
+++ b/runtime/syntax/dylan.vim
@@ -0,0 +1,92 @@
+" Vim syntax file
+" Language: Dylan
+" Authors: Justus Pendleton <justus@acm.org>
+" Brent A. Fulgham <bfulgham@debian.org>
+" Last Change: Fri Sep 29 13:45:55 PDT 2000
+"
+" This syntax file is based on the Haskell, Perl, Scheme, and C
+" syntax files.
+
+" Part 1: Syntax definition
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+setlocal lisp
+
+" Highlight special characters (those that have backslashes) differently
+syn match dylanSpecial display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"
+
+" Keywords
+syn keyword dylanBlock afterwards begin block cleanup end
+syn keyword dylanClassMods abstract concrete primary inherited virtual
+syn keyword dylanException exception handler signal
+syn keyword dylanParamDefs method class function library macro interface
+syn keyword dylanSimpleDefs constant variable generic primary
+syn keyword dylanOther above below from by in instance local slot subclass then to
+syn keyword dylanConditional if when select case else elseif unless finally otherwise then
+syn keyword dylanRepeat begin for until while from to
+syn keyword dylanStatement define let
+syn keyword dylanImport use import export exclude rename create
+syn keyword dylanMiscMods open sealed domain singleton sideways inline functional
+
+" Matching rules for special forms
+syn match dylanOperator "\s[-!%&\*\+/=\?@\\^|~:]\+[-#!>%&:\*\+/=\?@\\^|~]*"
+syn match dylanOperator "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./=\?@\\^|~:]*"
+" Numbers
+syn match dylanNumber "\<[0-9]\+\>\|\<0[xX][0-9a-fA-F]\+\>\|\<0[oO][0-7]\+\>"
+syn match dylanNumber "\<[0-9]\+\.[0-9]\+\([eE][-+]\=[0-9]\+\)\=\>"
+" Booleans
+syn match dylanBoolean "#t\|#f"
+" Comments
+syn match dylanComment "//.*"
+syn region dylanComment start="/\*" end="\*/"
+" Strings
+syn region dylanString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=dySpecial
+syn match dylanCharacter "'[^\\]'"
+" Constants, classes, and variables
+syn match dylanConstant "$\<[a-zA-Z0-9\-]\+\>"
+syn match dylanClass "<\<[a-zA-Z0-9\-]\+\>>"
+syn match dylanVariable "\*\<[a-zA-Z0-9\-]\+\>\*"
+" Preconditions
+syn region dylanPrecondit start="^\s*#\s*\(if\>\|else\>\|endif\>\)" skip="\\$" end="$"
+
+" These appear at the top of files (usually). I like to highlight the whole line
+" so that the definition stands out. They should probably really be keywords, but they
+" don't generally appear in the middle of a line of code.
+syn region dylanHeader start="^[Mm]odule:" end="^$"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "dylan"
+
+" vim:ts=8
diff --git a/runtime/syntax/dylanintr.vim b/runtime/syntax/dylanintr.vim
new file mode 100644
index 0000000..692db34
--- /dev/null
+++ b/runtime/syntax/dylanintr.vim
@@ -0,0 +1,39 @@
+" Vim syntax file
+" Language: Dylan
+" Authors: Justus Pendleton <justus@acm.org>
+" Last Change: Fri Sep 29 13:53:27 PDT 2000
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn region dylanintrInfo matchgroup=Statement start="^" end=":" oneline
+syn match dylanintrInterface "define interface"
+syn match dylanintrClass "<.*>"
+syn region dylanintrType start=+"+ skip=+\\\\\|\\"+ end=+"+
+
+syn region dylanintrIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match dylanintrIncluded contained "<[^>]*>"
+syn match dylanintrInclude "^\s*#\s*include\>\s*["<]" contains=intrIncluded
+
+"syn keyword intrMods pointer struct
+
+" Define the default highlighting.
+" 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"
+
+" vim:ts=8
diff --git a/runtime/syntax/dylanlid.vim b/runtime/syntax/dylanlid.vim
new file mode 100644
index 0000000..dae0bf9
--- /dev/null
+++ b/runtime/syntax/dylanlid.vim
@@ -0,0 +1,29 @@
+" Vim syntax file
+" Language: Dylan Library Interface Files
+" Authors: Justus Pendleton <justus@acm.org>
+" Brent Fulgham <bfulgham@debian.org>
+" Last Change: Fri Sep 29 13:50:20 PDT 2000
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn region dylanlidInfo matchgroup=Statement start="^" end=":" oneline
+syn region dylanlidEntry matchgroup=Statement start=":%" end="$" oneline
+
+syn sync lines=50
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link dylanlidInfo Type
+hi def link dylanlidEntry String
+
+
+let b:current_syntax = "dylanlid"
+
+" vim:ts=8
diff --git a/runtime/syntax/ecd.vim b/runtime/syntax/ecd.vim
new file mode 100644
index 0000000..1276f2b
--- /dev/null
+++ b/runtime/syntax/ecd.vim
@@ -0,0 +1,44 @@
+" Vim syntax file
+" Language: ecd (Embedix Component Description) files
+" Maintainer: John Beppu <beppu@opensource.lineo.com>
+" URL: http://opensource.lineo.com/~beppu/prose/ecd_vim.html
+" Last Change: 2001 Sep 27
+
+" An ECD file contains meta-data for packages in the Embedix Linux distro.
+" This syntax file was derived from apachestyle.vim
+" by Christian Hammers <ch@westend.com>
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" specials
+syn match ecdComment "^\s*#.*"
+
+" options and values
+syn match ecdAttr "^\s*[a-zA-Z]\S*\s*[=].*$" contains=ecdAttrN,ecdAttrV
+syn match ecdAttrN contained "^.*="me=e-1
+syn match ecdAttrV contained "=.*$"ms=s+1
+
+" tags
+syn region ecdTag start=+<+ end=+>+ contains=ecdTagN,ecdTagError
+syn match ecdTagN contained +<[/\s]*[-a-zA-Z0-9_]\++ms=s+1
+syn match ecdTagError contained "[^>]<"ms=s+1
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..002c9f8
--- /dev/null
+++ b/runtime/syntax/edif.vim
@@ -0,0 +1,45 @@
+" Vim syntax file
+" Language: EDIF (Electronic Design Interchange Format)
+" Maintainer: Artem Zankovich <z_artem@hotbox.ru>
+" Last Change: Oct 14, 2002
+"
+" Supported standarts are:
+" ANSI/EIA Standard 548-1988 (EDIF Version 2 0 0)
+" 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 exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=48-57,-,+,A-Z,a-z,_,&
+
+syn region edifList matchgroup=Delimiter start="(" end=")" contains=edifList,edifKeyword,edifString,edifNumber
+
+" Strings
+syn match edifInStringError /%/ contained
+syn match edifInString /%\s*\d\+\s*%/ contained
+syn region edifString start=/"/ end=/"/ contains=edifInString,edifInStringError contained
+
+" Numbers
+syn match edifNumber "\<[-+]\=[0-9]\+\>"
+
+" Keywords
+syn match edifKeyword "(\@<=\s*[a-zA-Z&][a-zA-Z_0-9]*\>" contained
+
+syn match edifError ")"
+
+" synchronization
+syntax sync fromstart
+
+" Define the default highlighting.
+
+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/editorconfig.vim b/runtime/syntax/editorconfig.vim
new file mode 100644
index 0000000..6740624
--- /dev/null
+++ b/runtime/syntax/editorconfig.vim
@@ -0,0 +1,21 @@
+" Vim syntax file
+" Language: EditorConfig
+" Maintainer: Gregory Anders <greg@gpanders.com>
+" Last Change: 2023-01-03
+
+if exists('b:current_syntax')
+ finish
+endif
+
+runtime! syntax/dosini.vim
+unlet! b:current_syntax
+
+syntax match editorconfigUnknownProperty "^\s*\zs\w\+\ze\s*="
+
+syntax keyword editorconfigProperty root charset end_of_line indent_style
+syntax keyword editorconfigProperty indent_size tab_width max_line_length
+syntax keyword editorconfigProperty trim_trailing_whitespace insert_final_newline
+
+hi def link editorconfigProperty dosiniLabel
+
+let b:current_syntax = 'editorconfig'
diff --git a/runtime/syntax/eiffel.vim b/runtime/syntax/eiffel.vim
new file mode 100644
index 0000000..c663487
--- /dev/null
+++ b/runtime/syntax/eiffel.vim
@@ -0,0 +1,199 @@
+" Eiffel syntax file
+" Language: Eiffel
+" Maintainer: Jocelyn Fiat <jfiat@eiffel.com>
+" Previous maintainer: Reimer Behrends <behrends@cse.msu.edu>
+" Contributions from: Thilo Six
+"
+" URL: https://github.com/eiffelhub/vim-eiffel
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Option handling
+
+if exists("eiffel_ignore_case")
+ syn case ignore
+else
+ syn case match
+ if exists("eiffel_pedantic") || exists("eiffel_strict")
+ syn keyword eiffelError current void result precursor none
+ syn keyword eiffelError CURRENT VOID RESULT PRECURSOR None
+ syn keyword eiffelError TRUE FALSE
+ endif
+ if exists("eiffel_pedantic")
+ syn keyword eiffelError true false
+ syn match eiffelError "\<[a-z_]\+[A-Z][a-zA_Z_]*\>"
+ syn match eiffelError "\<[A-Z][a-z_]*[A-Z][a-zA-Z_]*\>"
+ endif
+ if exists("eiffel_lower_case_predef")
+ syn keyword eiffelPredefined current void result precursor
+ endif
+endif
+
+if exists("eiffel_hex_constants")
+ syn match eiffelNumber "\d[0-9a-fA-F]*[xX]"
+endif
+
+" Keyword definitions
+
+syn keyword eiffelTopStruct note indexing feature creation inherit
+syn match eiffelTopStruct "\<class\>"
+syn match eiffelKeyword "\<end\>"
+syn match eiffelTopStruct "^end\>\(\s*--\s\+class\s\+\<[A-Z][A-Z0-9_]*\>\)\=" contains=eiffelClassName
+syn match eiffelBrackets "[[\]]"
+syn match eiffelBracketError "\]"
+syn region eiffelGeneric transparent matchgroup=eiffelBrackets start="\[" end="\]" contains=ALLBUT,eiffelBracketError,eiffelGenericDecl,eiffelStringError,eiffelStringEscape,eiffelGenericCreate,eiffelTopStruct
+if exists("eiffel_ise")
+ syn match eiffelAgent "\<agent\>"
+ syn match eiffelConvert "\<convert\>"
+ syn match eiffelCreate "\<create\>"
+ syn match eiffelTopStruct contained "\<create\>"
+ syn match eiffelTopStruct contained "\<convert\>"
+ syn match eiffelGenericCreate contained "\<create\>"
+ syn match eiffelTopStruct "^create\>"
+ syn region eiffelGenericDecl transparent matchgroup=eiffelBrackets contained start="\[" end="\]" contains=ALLBUT,eiffelCreate,eiffelTopStruct,eiffelGeneric,eiffelBracketError,eiffelStringEscape,eiffelStringError,eiffelBrackets
+ syn region eiffelClassHeader start="^class\>" end="$" contains=ALLBUT,eiffelCreate,eiffelGenericCreate,eiffelGeneric,eiffelStringEscape,eiffelStringError,eiffelBrackets
+endif
+syn keyword eiffelDeclaration is do once deferred unique local attribute assign
+syn keyword eiffelDeclaration attached detachable Unique
+syn keyword eiffelProperty expanded obsolete separate frozen
+syn keyword eiffelProperty prefix infix
+syn keyword eiffelInheritClause rename redefine undefine select export as
+syn keyword eiffelAll all
+syn keyword eiffelKeyword external alias some
+syn keyword eiffelStatement if else elseif inspect
+syn keyword eiffelStatement when then
+syn match eiffelAssertion "\<require\(\s\+else\)\=\>"
+syn match eiffelAssertion "\<ensure\(\s\+then\)\=\>"
+syn keyword eiffelAssertion check
+syn keyword eiffelDebug debug
+syn keyword eiffelStatement across from until loop
+syn keyword eiffelAssertion variant
+syn match eiffelAssertion "\<invariant\>"
+syn match eiffelTopStruct "^invariant\>"
+syn keyword eiffelException rescue retry
+
+syn keyword eiffelPredefined Current Void Result Precursor
+
+" Operators
+syn match eiffelOperator "\<and\(\s\+then\)\=\>"
+syn match eiffelOperator "\<or\(\s\+else\)\=\>"
+syn keyword eiffelOperator xor implies not
+syn keyword eiffelOperator strip old
+syn keyword eiffelOperator Strip
+syn match eiffelOperator "\$"
+syn match eiffelCreation "!"
+syn match eiffelExport "[{}]"
+syn match eiffelArray "<<"
+syn match eiffelArray ">>"
+syn match eiffelConstraint "->"
+syn match eiffelOperator "[@#|&][^ \e\t\b%]*"
+
+" Special classes
+syn keyword eiffelAnchored like
+syn keyword eiffelBitType BIT
+
+" Constants
+if !exists("eiffel_pedantic")
+ syn keyword eiffelBool true false
+endif
+syn keyword eiffelBool True False
+syn region eiffelString start=+"+ skip=+%"+ end=+"+ contains=eiffelStringEscape,eiffelStringError
+syn match eiffelStringEscape contained "%[^/]"
+syn match eiffelStringEscape contained "%/\d\+/"
+syn match eiffelStringEscape contained "^[ \t]*%"
+syn match eiffelStringEscape contained "%[ \t]*$"
+syn match eiffelStringError contained "%/[^0-9]"
+syn match eiffelStringError contained "%/\d\+[^0-9/]"
+syn match eiffelBadConstant "'\(%[^/]\|%/\d\+/\|[^'%]\)\+'"
+syn match eiffelBadConstant "''"
+syn match eiffelCharacter "'\(%[^/]\|%/\d\+/\|[^'%]\)'" contains=eiffelStringEscape
+syn match eiffelNumber "-\=\<\d\+\(_\d\+\)*\>"
+syn match eiffelNumber "\<[01]\+[bB]\>"
+syn match eiffelNumber "-\=\<\d\+\(_\d\+\)*\.\(\d\+\(_\d\+\)*\)\=\([eE][-+]\=\d\+\(_\d\+\)*\)\="
+syn match eiffelNumber "-\=\.\d\+\(_\d\+\)*\([eE][-+]\=\d\+\(_\d\+\)*\)\="
+syn match eiffelComment "--.*" contains=eiffelTodo
+
+syn case match
+
+" Case sensitive stuff
+
+syn keyword eiffelTodo contained TODO XXX FIXME
+syn match eiffelClassName "\<[A-Z][A-Z0-9_]*\>"
+
+" Catch mismatched parentheses
+syn match eiffelParenError ")"
+syn region eiffelParen transparent start="(" end=")" contains=ALLBUT,eiffelParenError,eiffelStringError,eiffelStringEscape
+
+if exists("eiffel_fold")
+" setlocal foldmethod=indent
+" syn sync fromstart
+endif
+
+" Should suffice for even very long strings and expressions
+syn sync lines=40
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+hi def link eiffelAgent Statement
+hi def link eiffelConvert Statement
+
+hi def link eiffelTopStruct PreProc
+
+hi def link eiffelAll Special
+hi def link eiffelAnchored Special
+hi def link eiffelBitType Special
+
+
+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
+
+hi def link eiffelStringEscape 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
+
+hi def link eiffelPredefined Constant
+
+hi def link eiffelComment Comment
+
+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
+
+hi def link eiffelTodo Todo
+
+
+let b:current_syntax = "eiffel"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: ts=8
diff --git a/runtime/syntax/elf.vim b/runtime/syntax/elf.vim
new file mode 100644
index 0000000..c8e5a61
--- /dev/null
+++ b/runtime/syntax/elf.vim
@@ -0,0 +1,82 @@
+" Vim syntax file
+" Language: ELF
+" Maintainer: Christian V. J. Brüssow <cvjb@cvjb.de>
+" Last Change: Son 22 Jun 2003 20:43:14 CEST
+" Filenames: *.ab,*.am
+" URL: http://www.cvjb.de/comp/vim/elf.vim
+" $Id: elf.vim,v 1.1 2004/06/13 19:52:27 vimboss Exp $
+"
+" ELF: Extensible Language Facility
+" This is the Applix Inc., Macro and Builder programming language.
+" It has nothing in common with the binary format called ELF.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Case does not matter
+syn case ignore
+
+" Environments
+syn region elfEnvironment transparent matchgroup=Special start="{" matchgroup=Special end="}" contains=ALLBUT,elfBraceError
+
+" Unmatched braces
+syn match elfBraceError "}"
+
+" All macros must have at least one of these definitions
+syn keyword elfSpecial endmacro
+syn region elfSpecial transparent matchgroup=Special start="^\(\(macro\)\|\(set\)\) \S\+$" matchgroup=Special end="^\(\(endmacro\)\|\(endset\)\)$" contains=ALLBUT,elfBraceError
+
+" Preprocessor Commands
+syn keyword elfPPCom define include
+
+" Some keywords
+syn keyword elfKeyword false true null
+syn keyword elfKeyword var format object function endfunction
+
+" Conditionals and loops
+syn keyword elfConditional if else case of endcase for to next while until return goto
+
+" All built-in elf macros end with an '@'
+syn match elfMacro "[0-9_A-Za-z]\+@"
+
+" Strings and characters
+syn region elfString start=+"+ skip=+\\\\\|\\"+ end=+"+
+
+" Numbers
+syn match elfNumber "-\=\<[0-9]*\.\=[0-9_]\>"
+
+" Comments
+syn region elfComment start="/\*" end="\*/"
+syn match elfComment "\'.*$"
+
+syn sync ccomment elfComment
+
+" Parenthesis
+syn match elfParens "[\[\]()]"
+
+" Punctuation
+syn match elfPunct "[,;]"
+
+" Define the default highlighting.
+" 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"
+
+" vim:ts=8:sw=4:nocindent:smartindent:
diff --git a/runtime/syntax/elinks.vim b/runtime/syntax/elinks.vim
new file mode 100644
index 0000000..98252a2
--- /dev/null
+++ b/runtime/syntax/elinks.vim
@@ -0,0 +1,188 @@
+" Vim syntax file
+" Language: elinks(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-
+
+syn keyword elinksTodo contained TODO FIXME XXX NOTE
+
+syn region elinksComment display oneline start='#' end='$'
+ \ contains=elinksTodo,@Spell
+
+syn match elinksNumber '\<\d\+\>'
+
+syn region elinksString start=+"+ skip=+\\\\\|\\"+ end=+"+
+ \ contains=@elinksColor
+
+syn keyword elinksKeyword set bind
+
+syn keyword elinksPrefix bookmarks
+syn keyword elinksOptions file_format
+
+syn keyword elinksPrefix config
+syn keyword elinksOptions comments indentation saving_style i18n
+ \ saving_style_w show_template
+
+syn keyword elinksPrefix connection ssl client_cert
+syn keyword elinksOptions enable file cert_verify async_dns max_connections
+ \ max_connections_to_host receive_timeout retries
+ \ unrestartable_receive_timeout
+
+syn keyword elinksPrefix cookies
+syn keyword elinksOptions accept_policy max_age paranoid_security save resave
+
+syn keyword elinksPrefix document browse accesskey forms images links
+syn keyword elinksPrefix active_link colors search cache codepage colors
+syn keyword elinksPrefix format memory download dump history global html
+syn keyword elinksPrefix plain
+syn keyword elinksOptions auto_follow priority auto_submit confirm_submit
+ \ input_size show_formhist file_tags
+ \ image_link_tagging image_link_prefix
+ \ image_link_suffix show_as_links
+ \ show_any_as_links background text enable_color
+ \ bold invert underline color_dirs numbering
+ \ use_tabindex number_keys_select_link
+ \ wraparound case regex show_hit_top_bottom
+ \ wraparound show_not_found margin_width refresh
+ \ minimum_refresh_time scroll_margin scroll_step
+ \ table_move_order size size cache_redirects
+ \ ignore_cache_control assume force_assumed text
+ \ background link vlink dirs allow_dark_on_black
+ \ ensure_contrast use_document_colors directory
+ \ set_original_time overwrite notify_bell
+ \ codepage width enable max_items display_type
+ \ write_interval keep_unhistory display_frames
+ \ display_tables expand_table_columns display_subs
+ \ display_sups link_display underline_links
+ \ wrap_nbsp display_links compress_empty_lines
+
+syn keyword elinksPrefix mime extension handler mailcap mimetypes type
+syn keyword elinksOptions ask block program enable path ask description
+ \ prioritize enable path default_type
+
+syn keyword elinksPrefix protocol file cgi ftp proxy http bugs proxy
+syn keyword elinksPrefix referer https proxy rewrite dumb smart
+syn keyword elinksOptions path policy allow_special_files show_hidden_files
+ \ try_encoding_extensions host anon_passwd
+ \ use_pasv use_epsv accept_charset allow_blacklist
+ \ broken_302_redirect post_no_keepalive http10
+ \ host user passwd policy fake accept_language
+ \ accept_ui_language trace user_agent host
+ \ enable-dumb enable-smart
+
+syn keyword elinksPrefix terminal
+syn keyword elinksOptions type m11_hack utf_8_io restrict_852 block_cursor
+ \ colors transparency underline charset
+
+syn keyword elinksPrefix ui colors color mainmenu normal selected hotkey
+ \ menu marked hotkey frame dialog generic
+ \ frame scrollbar scrollbar-selected title text
+ \ checkbox checkbox-label button button-selected
+ \ field field-text meter shadow title title-bar
+ \ title-text status status-bar status-text tabs
+ \ unvisited normal loading separator searched mono
+syn keyword elinksOptions text background
+
+syn keyword elinksPrefix ui dialogs leds sessions tabs timer
+syn keyword elinksOptions listbox_min_height shadows underline_hotkeys enable
+ \ auto_save auto_restore auto_save_foldername
+ \ homepage show_bar wraparound confirm_close
+ \ enable duration action language show_status_bar
+ \ show_title_bar startup_goto_dialog
+ \ success_msgbox window_title
+
+syn keyword elinksOptions secure_file_saving
+
+syn cluster elinksColor contains=elinksColorBlack,elinksColorDarkRed,
+ \ elinksColorDarkGreen,elinksColorDarkYellow,
+ \ elinksColorDarkBlue,elinksColorDarkMagenta,
+ \ elinksColorDarkCyan,elinksColorGray,
+ \ elinksColorDarkGray,elinksColorRed,
+ \ elinksColorGreen,elinksColorYellow,
+ \ elinksColorBlue,elinksColorMagenta,
+ \ elinksColorCyan,elinksColorWhite
+
+syn keyword elinksColorBlack contained black
+syn keyword elinksColorDarkRed contained darkred sandybrown maroon crimson
+ \ firebrick
+syn keyword elinksColorDarkGreen contained darkgreen darkolivegreen
+ \ darkseagreen forestgreen
+ \ mediumspringgreen seagreen
+syn keyword elinksColorDarkYellow contained brown blanchedalmond chocolate
+ \ darkorange darkgoldenrod orange rosybrown
+ \ saddlebrown peru olive olivedrab sienna
+syn keyword elinksColorDarkBlue contained darkblue cadetblue cornflowerblue
+ \ darkslateblue deepskyblue midnightblue
+ \ royalblue steelblue navy
+syn keyword elinksColorDarkMagenta contained darkmagenta mediumorchid
+ \ mediumpurple mediumslateblue slateblue
+ \ deeppink hotpink darkorchid orchid purple
+ \ indigo
+syn keyword elinksColorDarkCyan contained darkcyan mediumaquamarine
+ \ mediumturquoise darkturquoise teal
+syn keyword elinksColorGray contained silver dimgray lightslategray
+ \ slategray lightgrey burlywood plum tan
+ \ thistle
+syn keyword elinksColorDarkGray contained gray darkgray darkslategray
+ \ darksalmon
+syn keyword elinksColorRed contained red indianred orangered tomato
+ \ lightsalmon salmon coral lightcoral
+syn keyword elinksColorGreen contained green greenyellow lawngreen
+ \ lightgreen lightseagreen limegreen
+ \ mediumseagreen springgreen yellowgreen
+ \ palegreen lime chartreuse
+syn keyword elinksColorYellow contained yellow beige darkkhaki
+ \ lightgoldenrodyellow palegoldenrod gold
+ \ goldenrod khaki lightyellow
+syn keyword elinksColorBlue contained blue aliceblue aqua aquamarine
+ \ azure dodgerblue lightblue lightskyblue
+ \ lightsteelblue mediumblue
+syn keyword elinksColorMagenta contained magenta darkviolet blueviolet
+ \ lightpink mediumvioletred palevioletred
+ \ violet pink fuchsia
+syn keyword elinksColorCyan contained cyan lightcyan powderblue skyblue
+ \ turquoise paleturquoise
+syn keyword elinksColorWhite contained white antiquewhite floralwhite
+ \ ghostwhite navajowhite whitesmoke linen
+ \ lemonchiffon cornsilk lavender
+ \ lavenderblush seashell mistyrose ivory
+ \ papayawhip bisque gainsboro honeydew
+ \ mintcream moccasin oldlace peachpuff snow
+ \ wheat
+
+hi def link elinksTodo Todo
+hi def link elinksComment Comment
+hi def link elinksNumber Number
+hi def link elinksString String
+hi def link elinksKeyword Keyword
+hi def link elinksPrefix Identifier
+hi def link elinksOptions Identifier
+hi def elinksColorBlack ctermfg=Black guifg=Black
+hi def elinksColorDarkRed ctermfg=DarkRed guifg=DarkRed
+hi def elinksColorDarkGreen ctermfg=DarkGreen guifg=DarkGreen
+hi def elinksColorDarkYellow ctermfg=DarkYellow guifg=DarkYellow
+hi def elinksColorDarkBlue ctermfg=DarkBlue guifg=DarkBlue
+hi def elinksColorDarkMagenta ctermfg=DarkMagenta guifg=DarkMagenta
+hi def elinksColorDarkCyan ctermfg=DarkCyan guifg=DarkCyan
+hi def elinksColorGray ctermfg=Gray guifg=Gray
+hi def elinksColorDarkGray ctermfg=DarkGray guifg=DarkGray
+hi def elinksColorRed ctermfg=Red guifg=Red
+hi def elinksColorGreen ctermfg=Green guifg=Green
+hi def elinksColorYellow ctermfg=Yellow guifg=Yellow
+hi def elinksColorBlue ctermfg=Blue guifg=Blue
+hi def elinksColorMagenta ctermfg=Magenta guifg=Magenta
+hi def elinksColorCyan ctermfg=Cyan guifg=Cyan
+hi def elinksColorWhite ctermfg=White guifg=White
+
+let b:current_syntax = "elinks"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/elm.vim b/runtime/syntax/elm.vim
new file mode 100644
index 0000000..1277827
--- /dev/null
+++ b/runtime/syntax/elm.vim
@@ -0,0 +1,105 @@
+" Vim syntax file
+" Language: Elm
+" Maintainer: Andreas Scharf <as@99n.de>
+" Original Author: Joseph Hager <ajhager@gmail.com>
+" Copyright: Joseph Hager <ajhager@gmail.com>
+" License: BSD3
+" Latest Revision: 2020-05-29
+
+if exists('b:current_syntax')
+ finish
+endif
+
+" Keywords
+syn keyword elmConditional else if of then case
+syn keyword elmAlias alias
+syn keyword elmTypedef contained type port
+syn keyword elmImport exposing as import module where
+
+" Operators
+" elm/core
+syn match elmOperator contained "\(<|\||>\|||\|&&\|==\|/=\|<=\|>=\|++\|::\|+\|-\|*\|/\|//\|^\|<>\|>>\|<<\|<\|>\|%\)"
+" elm/parser
+syn match elmOperator contained "\(|.\||=\)"
+" elm/url
+syn match elmOperator contained "\(</>\|<?>\)"
+
+" Types
+syn match elmType "\<[A-Z][0-9A-Za-z_-]*"
+syn keyword elmNumberType number
+
+" Modules
+syn match elmModule "\<\([A-Z][0-9A-Za-z_'-\.]*\)\+\.[A-Za-z]"me=e-2
+syn match elmModule "^\(module\|import\)\s\+[A-Z][0-9A-Za-z_'-\.]*\(\s\+as\s\+[A-Z][0-9A-Za-z_'-\.]*\)\?\(\s\+exposing\)\?" contains=elmImport
+
+" Delimiters
+syn match elmDelimiter "[,;]"
+syn match elmBraces "[()[\]{}]"
+
+" Functions
+syn match elmTupleFunction "\((,\+)\)"
+
+" Comments
+syn keyword elmTodo TODO FIXME XXX contained
+syn match elmLineComment "--.*" contains=elmTodo,@spell
+syn region elmComment matchgroup=elmComment start="{-|\=" end="-}" contains=elmTodo,elmComment,@spell fold
+
+" Strings
+syn match elmStringEscape "\\u[0-9a-fA-F]\{4}" contained
+syn match elmStringEscape "\\[nrfvbt\\\"]" contained
+syn region elmString start="\"" skip="\\\"" end="\"" contains=elmStringEscape,@spell
+syn region elmTripleString start="\"\"\"" skip="\\\"" end="\"\"\"" contains=elmStringEscape,@spell
+syn match elmChar "'[^'\\]'\|'\\.'\|'\\u[0-9a-fA-F]\{4}'"
+
+" Lambda
+syn region elmLambdaFunc start="\\"hs=s+1 end="->"he=e-2
+
+" Debug
+syn match elmDebug "Debug.\(log\|todo\|toString\)"
+
+" Numbers
+syn match elmInt "-\?\<\d\+\>"
+syn match elmFloat "-\?\(\<\d\+\.\d\+\>\)"
+
+" Identifiers
+syn match elmTopLevelDecl "^\s*[a-zA-Z][a-zA-z0-9_]*\('\)*\s\+:\(\r\n\|\r\|\n\|\s\)\+" contains=elmOperator
+syn match elmFuncName /^\l\w*/
+
+" Folding
+syn region elmTopLevelTypedef start="type" end="\n\(\n\n\)\@=" contains=ALL fold
+syn region elmTopLevelFunction start="^[a-zA-Z].\+\n[a-zA-Z].\+=" end="^\(\n\+\)\@=" contains=ALL fold
+syn region elmCaseBlock matchgroup=elmCaseBlockDefinition start="^\z\(\s\+\)\<case\>" end="^\z1\@!\W\@=" end="\(\n\n\z1\@!\)\@=" end="\n\z1\@!\(\n\n\)\@=" contains=ALL fold
+syn region elmCaseItemBlock start="^\z\(\s\+\).\+->$" end="^\z1\@!\W\@=" end="\(\n\n\z1\@!\)\@=" end="\(\n\z1\S\)\@=" contains=ALL fold
+syn region elmLetBlock matchgroup=elmLetBlockDefinition start="\<let\>" end="\<in\>" contains=ALL fold
+
+hi def link elmFuncName Function
+hi def link elmCaseBlockDefinition Conditional
+hi def link elmCaseBlockItemDefinition Conditional
+hi def link elmLetBlockDefinition TypeDef
+hi def link elmTopLevelDecl Function
+hi def link elmTupleFunction Normal
+hi def link elmTodo Todo
+hi def link elmComment Comment
+hi def link elmLineComment Comment
+hi def link elmString String
+hi def link elmTripleString String
+hi def link elmChar String
+hi def link elmStringEscape Special
+hi def link elmInt Number
+hi def link elmFloat Float
+hi def link elmDelimiter Delimiter
+hi def link elmBraces Delimiter
+hi def link elmTypedef TypeDef
+hi def link elmImport Include
+hi def link elmConditional Conditional
+hi def link elmAlias Delimiter
+hi def link elmOperator Operator
+hi def link elmType Type
+hi def link elmNumberType Identifier
+hi def link elmLambdaFunc Function
+hi def link elmDebug Debug
+hi def link elmModule Type
+
+syn sync minlines=500
+
+let b:current_syntax = 'elm'
diff --git a/runtime/syntax/elmfilt.vim b/runtime/syntax/elmfilt.vim
new file mode 100644
index 0000000..d995853
--- /dev/null
+++ b/runtime/syntax/elmfilt.vim
@@ -0,0 +1,58 @@
+" Vim syntax file
+" Language: Elm Filter rules
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Aug 31, 2016
+" Version: 9
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_ELMFILT
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn cluster elmfiltIfGroup contains=elmfiltCond,elmfiltOper,elmfiltOperKey,,elmfiltNumber,elmfiltOperKey
+
+syn match elmfiltParenError "[()]"
+syn match elmfiltMatchError "/"
+syn region elmfiltIf start="\<if\>" end="\<then\>" contains=elmfiltParen,elmfiltParenError skipnl skipwhite nextgroup=elmfiltAction
+syn region elmfiltParen contained matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=elmfiltParen,@elmfiltIfGroup,elmfiltThenError
+syn region elmfiltMatch contained matchgroup=Delimiter start="/" skip="\\/" matchgroup=Delimiter end="/" skipnl skipwhite nextgroup=elmfiltOper,elmfiltOperKey
+syn match elmfiltThenError "\<then.*$"
+syn match elmfiltComment "^#.*$" contains=@Spell
+
+syn keyword elmfiltAction contained delete execute executec forward forwardc leave save savecopy skipnl skipwhite nextgroup=elmfiltString
+syn match elmfiltArg contained "[^\\]%[&0-9dDhmrsSty&]"lc=1
+
+syn match elmfiltOperKey contained "\<contains\>" skipnl skipwhite nextgroup=elmfiltString
+syn match elmfiltOperKey contained "\<matches\s" nextgroup=elmfiltMatch,elmfiltSpaceError
+syn keyword elmfiltCond contained cc bcc lines always subject sender from to lines received skipnl skipwhite nextgroup=elmfiltString
+syn match elmfiltNumber contained "\d\+"
+syn keyword elmfiltOperKey contained and not skipnl skipwhite nextgroup=elmfiltOper,elmfiltOperKey,elmfiltString
+syn match elmfiltOper contained "\~" skipnl skipwhite nextgroup=elmfiltMatch
+syn match elmfiltOper contained "<=\|>=\|!=\|<\|<\|=" skipnl skipwhite nextgroup=elmfiltString,elmfiltCond,elmfiltOperKey
+syn region elmfiltString contained start='"' skip='"\(\\\\\)*\\["%]' end='"' contains=elmfiltArg skipnl skipwhite nextgroup=elmfiltOper,elmfiltOperKey,@Spell
+syn region elmfiltString contained start="'" skip="'\(\\\\\)*\\['%]" end="'" contains=elmfiltArg skipnl skipwhite nextgroup=elmfiltOper,elmfiltOperKey,@Spell
+syn match elmfiltSpaceError contained "\s.*$"
+
+" Define the default highlighting.
+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
+
+endif
+
+let b:current_syntax = "elmfilt"
+" vim: ts=9
diff --git a/runtime/syntax/erlang.vim b/runtime/syntax/erlang.vim
new file mode 100644
index 0000000..0b25619
--- /dev/null
+++ b/runtime/syntax/erlang.vim
@@ -0,0 +1,266 @@
+" Vim syntax file
+" Language: Erlang (http://www.erlang.org)
+" Maintainer: Csaba Hoch <csaba.hoch@gmail.com>
+" Contributor: Adam Rutkowski <hq@mtod.org>
+" Last Update: 2022-Sep-06
+" License: Vim license
+" 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
+" highlighting style and some code was taken from the Erlang syntax script
+" that is part of vimerl [3], created by Oscar Hellström [4] and improved by
+" Ricardo Catalinas Jiménez [5].
+
+" [1]: Kreąimir Marľić (Kresimir Marzic) <kmarzic@fly.srk.fer.hr>
+" [2]: Csaba Hoch <csaba.hoch@gmail.com>
+" [3]: https://github.com/jimenezrick/vimerl
+" [4]: Oscar Hellström <oscar@oscarh.net> (http://oscar.hellstrom.st)
+" [5]: Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
+
+" Customization:
+"
+" To use the old highlighting style, add this to your .vimrc:
+"
+" let g:erlang_old_style_highlight = 1
+"
+" To highlight further module attributes, add them to
+" ~/.vim/after/syntax/erlang.vim:
+"
+" syn keyword erlangAttribute myattr1 myattr2 contained
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Case sensitive
+syn case match
+
+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\|param\|private\|equiv\|spec\|throws\)' contained
+syn match erlangCommentAnnotation /`[^']*'/ contained
+syn keyword erlangTodo TODO FIXME XXX contained
+
+" Numbers (minimum base is 2, maximum is 36.)
+syn match erlangNumberInteger '\<\d\+\>'
+syn match erlangNumberInteger '\<\%([2-9]\|[12]\d\|3[0-6]\)\+#[[:alnum:]]\+\>'
+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 '\\\%(\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 erlangEqualsBinary '=<<\%(<\)\@!'
+syn keyword erlangOperator div rem or xor bor bxor bsl bsr and band not bnot andalso orelse
+syn match erlangBracket '{\|}\|\[\|]\||\|||'
+syn match erlangPipe '|'
+syn match erlangRightArrow '->'
+
+" Atoms, function calls (order is important)
+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,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, maps
+syn match erlangVariable '\<[A-Z][[:alnum:]_@]*'
+syn match erlangAnonymousVariable '\<_[[:alnum:]_@]*'
+syn match erlangMacro '??\=[[:alnum:]_@]\+'
+syn match erlangMacro '\%(-define(\)\@<=[[:alnum:]_@]\+'
+syn region erlangQuotedMacro start=/??\=\s*'/ end=/'/ contains=erlangQuotedAtomModifier
+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
+
+" Constants and Directives
+syn match erlangUnknownAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\l[[:alnum:]_@]*' contains=erlangComment
+syn match erlangAttribute '^\s*-\%(\s\|\n\|%.*\n\)*\%(behaviou\=r\|compile\|export\(_type\)\=\|file\|import\|module\|author\|copyright\|doc\|vsn\|on_load\|optional_callbacks\|feature\)\>' contains=erlangComment
+syn match erlangInclude '^\s*-\%(\s\|\n\|%.*\n\)*\%(include\|include_lib\)\>' contains=erlangComment
+syn match erlangRecordDef '^\s*-\%(\s\|\n\|%.*\n\)*record\>' contains=erlangComment
+syn match erlangDefine '^\s*-\%(\s\|\n\|%.*\n\)*\%(define\|undef\)\>' contains=erlangComment
+syn match erlangPreCondit '^\s*-\%(\s\|\n\|%.*\n\)*\%(ifdef\|ifndef\|else\|endif\)\>' contains=erlangComment
+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 else
+syn keyword erlangKeyword receive when try maybe
+
+" Build-in-functions (BIFs)
+syn keyword erlangBIF abs alive apply atom_to_binary atom_to_list contained
+syn keyword erlangBIF binary_part binary_to_atom contained
+syn keyword erlangBIF binary_to_existing_atom binary_to_float contained
+syn keyword erlangBIF binary_to_integer bitstring_to_list contained
+syn keyword erlangBIF binary_to_list binary_to_term bit_size contained
+syn keyword erlangBIF byte_size check_old_code check_process_code contained
+syn keyword erlangBIF concat_binary date delete_module demonitor contained
+syn keyword erlangBIF disconnect_node element erase error exit contained
+syn keyword erlangBIF float float_to_binary float_to_list contained
+syn keyword erlangBIF garbage_collect get get_keys group_leader contained
+syn keyword erlangBIF halt hd integer_to_binary integer_to_list contained
+syn keyword erlangBIF iolist_to_binary iolist_size is_alive contained
+syn keyword erlangBIF is_atom is_binary is_bitstring is_boolean contained
+syn keyword erlangBIF is_float is_function is_integer is_list is_map is_map_key contained
+syn keyword erlangBIF is_number is_pid is_port is_process_alive contained
+syn keyword erlangBIF is_record is_reference is_tuple length link contained
+syn keyword erlangBIF list_to_atom list_to_binary contained
+syn keyword erlangBIF list_to_bitstring list_to_existing_atom contained
+syn keyword erlangBIF list_to_float list_to_integer list_to_pid contained
+syn keyword erlangBIF list_to_tuple load_module make_ref map_size max contained
+syn keyword erlangBIF min module_loaded monitor monitor_node node contained
+syn keyword erlangBIF nodes now open_port pid_to_list port_close contained
+syn keyword erlangBIF port_command port_connect pre_loaded contained
+syn keyword erlangBIF process_flag process_flag process_info contained
+syn keyword erlangBIF process purge_module put register registered contained
+syn keyword erlangBIF round self setelement size spawn spawn_link contained
+syn keyword erlangBIF spawn_monitor spawn_opt split_binary contained
+syn keyword erlangBIF statistics term_to_binary throw time tl contained
+syn keyword erlangBIF trunc tuple_size tuple_to_list unlink contained
+syn keyword erlangBIF unregister whereis contained
+
+" Sync at the beginning of functions: if this is not used, multiline string
+" are not always recognized, and the indentation script cannot use the
+" "searchpair" (because it would not always skip strings and comments when
+" looking for keywords and opening parens/brackets).
+syn sync match erlangSync grouphere NONE "^[a-z]\s*("
+let b:erlang_syntax_synced = 1
+
+" Define the default highlighting. See ":help group-name" for the groups and
+" their colors.
+
+let s:old_style = (exists("g:erlang_old_style_highlight") &&
+ \g:erlang_old_style_highlight == 1)
+
+
+" 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 erlangEqualsBinary ErrorMsg
+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 erlangAnonymousVariable erlangVariable
+hi def link erlangMacro Normal
+hi def link erlangQuotedMacro 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 erlangAnonymousVariable erlangVariable
+hi def link erlangMacro Macro
+hi def link erlangQuotedMacro 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
+unlet s:cpo_save
+
+" vim: sw=2 et
diff --git a/runtime/syntax/eruby.vim b/runtime/syntax/eruby.vim
new file mode 100644
index 0000000..3d1bf71
--- /dev/null
+++ b/runtime/syntax/eruby.vim
@@ -0,0 +1,79 @@
+" Vim syntax file
+" Language: eRuby
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Mar 18
+
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'eruby'
+endif
+
+if !exists("g:eruby_default_subtype")
+ let g:eruby_default_subtype = "html"
+endif
+
+if &filetype =~ '^eruby\.'
+ let b:eruby_subtype = matchstr(&filetype,'^eruby\.\zs\w\+')
+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\|\.example\)\+$','',''),'\.\zs\w\+\%(\ze+\w\+\)\=$')
+ endif
+ if b:eruby_subtype == 'rhtml'
+ let b:eruby_subtype = 'html'
+ elseif b:eruby_subtype == 'rb'
+ let b:eruby_subtype = 'ruby'
+ elseif b:eruby_subtype == 'yml'
+ let b:eruby_subtype = 'yaml'
+ elseif b:eruby_subtype == 'js'
+ let b:eruby_subtype = 'javascript'
+ elseif b:eruby_subtype == 'txt'
+ " Conventional; not a real file type
+ let b:eruby_subtype = 'text'
+ elseif b:eruby_subtype == ''
+ let b:eruby_subtype = g:eruby_default_subtype
+ endif
+endif
+
+if !exists("b:eruby_nest_level")
+ if &syntax =~# '\<eruby\.eruby\>'
+ let b:eruby_nest_level = strlen(substitute(substitute(&filetype,'\C\<eruby\>','@','g'),'[^@]','','g'))
+ else
+ let b:eruby_nest_level = strlen(substitute(substitute(substitute(expand("%:t"),'@','','g'),'\c\.\%(erb\|rhtml\)\>','@','g'),'[^@]','','g'))
+ endif
+endif
+if !b:eruby_nest_level
+ let b:eruby_nest_level = 1
+endif
+
+if exists("b:eruby_subtype") && b:eruby_subtype != '' && b:eruby_subtype !=? 'eruby'
+ exe "runtime! syntax/".b:eruby_subtype.".vim"
+ unlet! b:current_syntax
+endif
+syn include @rubyTop syntax/ruby.vim
+
+syn cluster erubyRegions contains=erubyOneLiner,erubyBlock,erubyExpression,erubyComment
+
+exe 'syn region erubyOneLiner matchgroup=erubyDelimiter start="^%\{1,'.b:eruby_nest_level.'\}%\@!" end="$" contains=@rubyTop containedin=ALLBUT,@erubyRegions keepend oneline'
+exe 'syn region erubyBlock matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}%\@!-\=" end="[=-]\=%\@<!%\{1,'.b:eruby_nest_level.'\}>" contains=@rubyTop containedin=ALLBUT,@erubyRegions keepend'
+exe 'syn region erubyExpression matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}=\{1,4}" end="[=-]\=%\@<!%\{1,'.b:eruby_nest_level.'\}>" contains=@rubyTop containedin=ALLBUT,@erubyRegions keepend'
+exe 'syn region erubyComment matchgroup=erubyDelimiter start="<%\{1,'.b:eruby_nest_level.'\}-\=#" end="[=-]\=%\@<!%\{1,'.b:eruby_nest_level.'\}>" contains=rubyTodo,@Spell containedin=ALLBUT,@erubyRegions keepend'
+
+" Define the default highlighting.
+
+hi def link erubyDelimiter PreProc
+hi def link erubyComment Comment
+
+let b:current_syntax = 'eruby'
+
+if main_syntax == 'eruby'
+ unlet main_syntax
+endif
+
+" vim: nowrap sw=2 sts=2 ts=8:
diff --git a/runtime/syntax/esmtprc.vim b/runtime/syntax/esmtprc.vim
new file mode 100644
index 0000000..81f074b
--- /dev/null
+++ b/runtime/syntax/esmtprc.vim
@@ -0,0 +1,31 @@
+" Vim syntax file
+" Language: Esmtp setup file (based on esmtp 0.5.0)
+" Maintainer: Kornel Kielczewski <kornel@gazeta.pl>
+" Last Change: 16 Feb 2005
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+"All options
+syntax keyword esmtprcOptions hostname username password starttls certificate_passphrase preconnect identity mda
+
+"All keywords
+syntax keyword esmtprcIdentifier default enabled disabled required
+
+"We're trying to be smarer than /."*@.*/ :)
+syntax match esmtprcAddress /[a-z0-9_.-]*[a-z0-9]\+@[a-z0-9_.-]*[a-z0-9]\+\.[a-z]\+/
+syntax match esmtprcFulladd /[a-z0-9_.-]*[a-z0-9]\+\.[a-z]\+:[0-9]\+/
+
+"String..
+syntax region esmtprcString start=/"/ end=/"/
+
+
+highlight link esmtprcOptions Label
+highlight link esmtprcString String
+highlight link esmtprcAddress Type
+highlight link esmtprcIdentifier Identifier
+highlight link esmtprcFulladd Include
+
+let b:current_syntax = "esmtprc"
diff --git a/runtime/syntax/esqlc.vim b/runtime/syntax/esqlc.vim
new file mode 100644
index 0000000..792e5d3
--- /dev/null
+++ b/runtime/syntax/esqlc.vim
@@ -0,0 +1,58 @@
+" Vim syntax file
+" Language: ESQL-C
+" Maintainer: Jonathan A. George <jageorge@tel.gte.com>
+" Last Change: 2001 May 09
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the C++ syntax to start with
+runtime! syntax/cpp.vim
+
+" ESQL-C extentions
+
+syntax keyword esqlcPreProc EXEC SQL INCLUDE
+
+syntax case ignore
+
+syntax keyword esqlcPreProc begin end declare section database open execute
+syntax keyword esqlcPreProc prepare fetch goto continue found sqlerror work
+
+syntax keyword esqlcKeyword access add as asc by check cluster column
+syntax keyword esqlcKeyword compress connect current decimal
+syntax keyword esqlcKeyword desc exclusive file from group
+syntax keyword esqlcKeyword having identified immediate increment index
+syntax keyword esqlcKeyword initial into is level maxextents mode modify
+syntax keyword esqlcKeyword nocompress nowait of offline on online start
+syntax keyword esqlcKeyword successful synonym table then to trigger uid
+syntax keyword esqlcKeyword unique user validate values view whenever
+syntax keyword esqlcKeyword where with option order pctfree privileges
+syntax keyword esqlcKeyword public resource row rowlabel rownum rows
+syntax keyword esqlcKeyword session share size smallint
+
+syntax keyword esqlcOperator not and or
+syntax keyword esqlcOperator in any some all between exists
+syntax keyword esqlcOperator like escape
+syntax keyword esqlcOperator intersect minus
+syntax keyword esqlcOperator prior distinct
+syntax keyword esqlcOperator sysdate
+
+syntax keyword esqlcStatement alter analyze audit comment commit create
+syntax keyword esqlcStatement delete drop explain grant insert lock noaudit
+syntax keyword esqlcStatement rename revoke rollback savepoint select set
+syntax keyword esqlcStatement truncate update
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "esqlc"
+
diff --git a/runtime/syntax/esterel.vim b/runtime/syntax/esterel.vim
new file mode 100644
index 0000000..b010521
--- /dev/null
+++ b/runtime/syntax/esterel.vim
@@ -0,0 +1,78 @@
+" Vim syntax file
+" Language: ESTEREL
+" Maintainer: Maurizio Tranchero <maurizio.tranchero@polito.it> - <maurizio.tranchero@gmail.com>
+" Credits: Luca Necchi <luca.necchi@polito.it>, Nikos Andrikos <nick.andrik@gmail.com>
+" First Release: Tue May 17 23:49:39 CEST 2005
+" Last Change: Tue May 6 13:29:56 CEST 2008
+" Version: 0.8
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" case is significant
+syn case ignore
+" Esterel Regions
+syn region esterelModule start=/module/ end=/end module/ contains=ALLBUT,esterelModule
+syn region esterelLoop start=/loop/ end=/end loop/ contains=ALLBUT,esterelModule
+syn region esterelAbort start=/abort/ end=/when/ contains=ALLBUT,esterelModule
+syn region esterelAbort start=/weak abort/ end=/when/ contains=ALLBUT,esterelModule
+syn region esterelEvery start=/every/ end=/end every/ contains=ALLBUT,esterelModule
+syn region esterelIf start=/if/ end=/end if/ contains=ALLBUT,esterelModule
+syn region esterelConcurrent transparent start=/\[/ end=/\]/ contains=ALLBUT,esterelModule
+syn region esterelIfThen start=/if/ end=/then/ oneline
+" Esterel Keywords
+syn keyword esterelIO input output inputoutput constant
+syn keyword esterelBoolean and or not xor xnor nor nand
+syn keyword esterelExpressions mod pre
+syn keyword esterelStatement nothing halt
+syn keyword esterelStatement module signal sensor end
+syn keyword esterelStatement every do loop abort weak
+syn keyword esterelStatement emit present await
+syn keyword esterelStatement pause when immediate
+syn keyword esterelStatement if then else case
+syn keyword esterelStatement var in run suspend
+syn keyword esterelStatement repeat times combine with
+syn keyword esterelStatement assert sustain
+" check what it is the following
+syn keyword esterelStatement relation
+syn keyword esterelFunctions function procedure task
+syn keyword esterelSysCall call trap exit exec
+" Esterel Types
+syn keyword esterelType integer float bolean
+" Esterel Comment
+syn match esterelComment "%.*$"
+" Operators and special characters
+syn match esterelSpecial ":"
+syn match esterelSpecial "<="
+syn match esterelSpecial ">="
+syn match esterelSpecial "+"
+syn match esterelSpecial "-"
+syn match esterelSpecial "="
+syn match esterelSpecial ";"
+syn match esterelSpecial "/"
+syn match esterelSpecial "?"
+syn match esterelOperator "\["
+syn match esterelOperator "\]"
+syn match esterelOperator ":="
+syn match esterelOperator "||"
+syn match esterelStatement "\<\(if\|else\)\>"
+syn match esterelNone "\<else\s\+if\>$"
+syn match esterelNone "\<else\s\+if\>\s"
+
+" Class Linking
+
+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
+
+
+let b:current_syntax = "esterel"
diff --git a/runtime/syntax/eterm.vim b/runtime/syntax/eterm.vim
new file mode 100644
index 0000000..9b43cb2
--- /dev/null
+++ b/runtime/syntax/eterm.vim
@@ -0,0 +1,429 @@
+" Vim syntax file
+" Language: eterm(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-21
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword etermTodo contained TODO FIXME XXX NOTE
+
+syn region etermComment display oneline start='^#' end='$'
+ \ contains=etermTodo,@Spell
+
+syn match etermMagic display '^<Eterm-[0-9.]\+>$'
+
+syn match etermNumber contained display '\<\(\d\+\|0x\x\{1,2}\)\>'
+
+syn region etermString contained display oneline start=+"+
+ \ skip=+\\"+ end=+"+
+
+syn keyword etermBoolean contained on off true false yes no
+
+syn keyword etermPreProc contained appname exec get put random version
+ \ include preproc
+
+syn keyword etermFunctions contained copy exit kill nop paste save
+ \ scroll search spawn
+
+syn cluster etermGeneral contains=etermComment,etermFunction,
+ \ etermPreProc
+
+syn keyword etermKeyMod contained ctrl shift lock mod1 mod2 mod3 mod4
+ \ mod5 alt meta anymod
+syn keyword etermKeyMod contained button1 button2 button3 button4
+ \ button5
+
+syn keyword etermColorOptions contained video nextgroup=etermVideoOptions
+ \ skipwhite
+
+syn keyword etermVideoType contained normal reverse
+
+syn keyword etermColorOptions contained foreground background cursor
+ \ cursor_text pointer
+ \ nextgroup=etermColorType skipwhite
+
+syn keyword etermColorType contained bd ul
+syn match etermColorType contained display '\<\%(\d\|1[0-5]\)'
+
+syn keyword etermColorOptions contained color
+ \ nextgroup=etermColorNumber skipwhite
+
+syn keyword etermColorNumber contained bd ul nextgroup=etermColorSpec
+ \ skipwhite
+syn match etermColorNumber contained display '\<\%(\d\|1[0-5]\)'
+ \ nextgroup=etermColorSpec skipwhite
+
+syn match etermColorSpec contained display '\S\+'
+
+syn region etermColorContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+color\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermColorOptions
+
+syn keyword etermAttrOptions contained geometry nextgroup=etermGeometry
+ \ skipwhite
+
+syn match etermGeometry contained display '\d\+x\d++\d\++\d\+'
+
+syn keyword etermAttrOptions contained scrollbar_type
+ \ nextgroup=etermScrollbarType skipwhite
+
+syn keyword etermScrollbarType contained motif xterm next
+
+syn keyword etermAttrOptions contained font nextgroup=etermFontType
+ \ skipwhite
+
+syn keyword etermFontType contained bold nextgroup=etermFont skipwhite
+syn match etermFontType contained display '[0-5]' nextgroup=etermFont
+ \ skipwhite
+
+syn match etermFont contained display '\S\+'
+
+syn keyword etermFontType contained default nextgroup=etermNumber
+ \ skipwhite
+
+syn keyword etermFontType contained proportional nextgroup=etermBoolean
+ \ skipwhite
+
+syn keyword etermFontType contained fx nextgroup=etermString skipwhite
+
+syn keyword etermAttrOptions contained title name iconname
+ \ nextgroup=etermString skipwhite
+
+syn keyword etermAttrOptions contained scrollbar_width desktop
+ \ nextgroup=etermNumber skipwhite
+
+syn region etermAttrContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+attributes\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermAttrOptions
+
+syn keyword etermIClassOptions contained icon path nextgroup=etermString
+ \ skipwhite
+syn keyword etermIClassOptions contained cache nextgroup=etermNumber
+ \ skipwhite
+syn keyword etermIClassOptions contained anim nextgroup=etermNumber
+ \ skipwhite
+
+syn region etermIClassContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+imageclasses\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermImageContext,
+ \ etermIClassOptions
+
+syn keyword etermImageOptions contained type nextgroup=etermImageType
+ \ skipwhite
+
+syn keyword etermImageTypes contained background trough anchor up_arrow
+ \ left_arrow right_arrow menu menuitem
+ \ submenu button buttonbar down_arrow
+
+syn keyword etermImageOptions contained mode nextgroup=etermImageModes
+ \ skipwhite
+
+syn keyword etermImageModes contained image trans viewport auto solid
+ \ nextgroup=etermImageModesAllow skipwhite
+syn keyword etermImageModesAllow contained allow nextgroup=etermImageModesR
+ \ skipwhite
+syn keyword etermImageModesR contained image trans viewport auto solid
+
+syn keyword etermImageOptions contained state nextgroup=etermImageState
+ \ skipwhite
+
+syn keyword etermImageState contained normal selected clicked disabled
+
+syn keyword etermImageOptions contained color nextgroup=etermImageColorFG
+ \ skipwhite
+
+syn keyword etermImageColorFG contained '\S\+' nextgroup=etermImageColorBG
+ \ skipwhite
+
+syn keyword etermImageColorBG contained '\S\+'
+
+syn keyword etermImageOptions contained file nextgroup=etermString
+ \ skipwhite
+
+syn keyword etermImageOptions contained geom nextgroup=etermImageGeom
+ \ skipwhite
+
+syn match etermImageGeom contained display
+ \ '\s\+\%(\d\+x\d\++\d\++\d\+\)\=:\%(\%(tie\|scale\|hscale\|vscale\|propscale\)d\=\)\='
+
+syn keyword etermImageOptions contained cmod colormod
+ \ nextgroup=etermImageCmod skipwhite
+
+syn keyword etermImageCmod contained image red green blue
+ \ nextgroup=etermImageBrightness skipwhite
+
+syn match etermImageBrightness contained display '\<\(\d\+\|0x\x\{1,2}\)\>'
+ \ nextgroup=etermImageContrast skipwhite
+
+syn match etermImageContrast contained display '\<\(\d\+\|0x\x\{1,2}\)\>'
+ \ nextgroup=etermImageGamma skipwhite
+
+syn match etermImageGamma contained display '\<\(\d\+\|0x\x\{1,2}\)\>'
+ \ nextgroup=etermImageGamma skipwhite
+
+syn region etermImageOptions contained display oneline
+ \ matchgroup=etermImageOptions
+ \ start='border\|bevel\%(\s\+\%(up\|down\)\)\|padding'
+ \ end='$' contains=etermNumber
+
+syn region etermImageContext contained fold transparent
+ \ matchgroup=etermContext
+ \ start='^\s*begin\s\+image\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermImageOptions
+
+syn keyword etermMenuItemOptions contained action
+ \ nextgroup=etermMenuItemAction skipwhite
+
+syn keyword etermMenuItemAction contained string echo submenu script
+ \ nextgroup=etermString skipwhite
+
+syn keyword etermMenuItemAction contained separator
+
+syn keyword etermMenuItemOptions contained text rtext nextgroup=etermString
+ \ skipwhite
+
+syn region etermMenuItemContext contained fold transparent
+ \ matchgroup=etermContext
+ \ start='^\s*begin\s\+menuitem\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermMenuItemOptions
+
+syn keyword etermMenuOptions contained title nextgroup=etermString
+ \ skipwhite
+
+syn keyword etermMenuOptions contained font_name nextgroup=etermFont
+ \ skipwhite
+
+syn match etermMenuOptions contained display '\<sep\>\|-'
+
+syn region etermMenuContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+menu\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermMenuOptions,
+ \ etermMenuItemContext
+
+syn keyword etermBind contained bind nextgroup=etermBindMods
+ \ skipwhite
+
+syn keyword etermBindMods contained ctrl shift lock mod1 mod2 mod3 mod4
+ \ mod5 alt meta anymod
+ \ nextgroup=etermBindMods skipwhite
+
+syn keyword etermBindTo contained to nextgroup=etermBindType
+ \ skipwhite
+
+syn keyword etermBindType contained string echo menu script
+ \ nextgroup=etermBindParam skipwhite
+
+syn match etermBindParam contained display '\S\+'
+
+syn region etermActionsContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+actions\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermActionsOptions
+
+syn keyword etermButtonOptions contained font nextgroup=etermFont skipwhite
+syn keyword etermButtonOptions contained visible nextgroup=etermBoolean
+ \ skipwhite
+syn keyword etermButtonOptions contained dock nextgroup=etermDockOption
+ \ skipwhite
+
+syn keyword etermDockOption contained top bottom no
+
+syn keyword etermButton contained button nextgroup=etermButtonText
+ \ skipwhite
+
+syn region etermButtonText contained display oneline start=+"+
+ \ skip=+\\"+ end=+"+
+ \ nextgroup=etermButtonIcon skipwhite
+
+syn keyword etermButtonIcon contained icon nextgroup=etermButtonIconFile
+ \ skipwhite
+
+syn keyword etermButtonIconFile contained '\S\+' nextgroup=etermButtonAction
+ \ skipwhite
+
+syn keyword etermButtonAction contained action nextgroup=etermBindType
+ \ skipwhite
+
+syn region etermButtonContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+button_bar\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermButtonOptions
+
+syn keyword etermMultiOptions contained encoding nextgroup=etermEncoding
+ \ skipwhite
+
+syn keyword etermEncoding eucj sjis euckr big5 gb
+syn match etermEncoding display 'iso-10646'
+
+syn keyword etermMultiOptions contained font nextgroup=etermFontType
+ \ skipwhite
+
+syn region etermMultiContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+multichar\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermMultiOptions
+
+syn keyword etermXimOptions contained input_method
+ \ nextgroup=etermInputMethod skipwhite
+
+syn match etermInputMethod contained display '\S+'
+
+syn keyword etermXimOptions contained preedit_type
+ \ nextgroup=etermPreeditType skipwhite
+
+syn keyword etermPreeditType contained OverTheSpot OffTheSpot Root
+
+syn region etermXimContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+xim\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermXimOptions
+
+syn keyword etermTogOptions contained map_alert visual_bell login_shell
+ \ scrollbar utmp_logging meta8 iconic
+ \ no_input home_on_output home_on_input
+ \ scrollbar_floating scrollbar_right
+ \ scrollbar_popup borderless double_buffer
+ \ no_cursor pause xterm_select select_line
+ \ select_trailing_spaces report_as_keysyms
+ \ itrans immotile_trans buttonbar
+ \ resize_gravity nextgroup=etermBoolean
+ \ skipwhite
+
+syn region etermTogContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+toggles\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermTogOptions
+
+syn keyword etermKeyboardOptions contained smallfont_key bigfont_key keysym
+ \ nextgroup=etermKeysym skipwhite
+
+syn keyword etermKeysym contained '\S\+' nextgroup=etermString
+ \ skipwhite
+
+syn keyword etermKeyboardOptions contained meta_mod alt_mod numlock_mod
+ \ nextgroup=etermNumber skipwhite
+
+syn keyword etermKeyboardOptions contained greek app_keypad app_cursor
+ \ nextgroup=etermBoolean skipwhite
+
+syn region etermKeyboardContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+keyboard\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermKeyboardOptions
+
+syn keyword etermMiscOptions contained print_pipe cut_chars finished_title
+ \ finished_text term_name exec
+ \ nextgroup=etermString skipwhite
+
+syn keyword etermMiscOptions contained save_lines min_anchor_size
+ \ border_width line_space
+
+syn region etermMiscContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+misc\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermMiscOptions
+
+syn keyword etermEScreenOptions contained url nextgroup=etermURL skipwhite
+
+syn match etermURL contained display
+ \ '\<\%(screen\|twin\)://\%([^@:/]\+\%(@[^:/]\+\%(:[^/]\+\)\=\)\=\)\=/\S\+'
+
+syn keyword etermEScreenOptions contained firewall
+
+syn keyword etermEScreenOptions contained delay nextgroup=etermNumber
+ \ skipwhite
+
+syn keyword etermEScreenOptions contained bbar_font nextgroup=etermFont
+ \ skipwhite
+
+syn keyword etermEScreenOptions contained bbar_dock nextgroup=etermDockOption
+ \ skipwhite
+
+syn region etermEScreenContext fold transparent matchgroup=etermContext
+ \ start='^\s*begin\s\+escreen\>'
+ \ end='^\s*end\>'
+ \ contains=@etermGeneral,etermEScreenOptions
+
+if exists("eterm_minlines")
+ let b:eterm_minlines = eterm_minlines
+else
+ let b:eterm_minlines = 50
+endif
+exec "syn sync minlines=" . b:eterm_minlines
+
+hi def link etermTodo Todo
+hi def link etermComment Comment
+hi def link etermMagic PreProc
+hi def link etermNumber Number
+hi def link etermString String
+hi def link etermBoolean Boolean
+hi def link etermPreProc PreProc
+hi def link etermFunctions Function
+hi def link etermKeyMod Constant
+hi def link etermOption Keyword
+hi def link etermColorOptions etermOption
+hi def link etermColor String
+hi def link etermVideoType Type
+hi def link etermColorType Type
+hi def link etermColorNumber Number
+hi def link etermColorSpec etermColor
+hi def link etermContext Keyword
+hi def link etermAttrOptions etermOption
+hi def link etermGeometry String
+hi def link etermScrollbarType Type
+hi def link etermFontType Type
+hi def link etermIClassOptions etermOption
+hi def link etermImageOptions etermOption
+hi def link etermImageTypes Type
+hi def link etermImageModes Type
+hi def link etermImageModesAllow Keyword
+hi def link etermImageModesR Type
+hi def link etermImageState Keyword
+hi def link etermImageColorFG etermColor
+hi def link etermImageColorBG etermColor
+hi def link etermImageGeom String
+hi def link etermImageCmod etermOption
+hi def link etermImageBrightness Number
+hi def link etermImageContrast Number
+hi def link etermImageGamma Number
+hi def link etermMenuItemOptions etermOption
+hi def link etermMenuItemAction Keyword
+hi def link etermMenuOptions etermOption
+hi def link etermBind Keyword
+hi def link etermBindMods Identifier
+hi def link etermBindTo Keyword
+hi def link etermBindType Type
+hi def link etermBindParam String
+hi def link etermButtonOptions etermOption
+hi def link etermDockOption etermOption
+hi def link etermButtonText String
+hi def link etermButtonIcon String
+hi def link etermButtonIconFile String
+hi def link etermButtonAction Keyword
+hi def link etermMultiOptions etermOption
+hi def link etermEncoding Identifier
+hi def link etermXimOptions etermOption
+hi def link etermInputMethod Identifier
+hi def link etermPreeditType Type
+hi def link etermTogOptions etermOption
+hi def link etermKeyboardOptions etermOption
+hi def link etermKeysym Constant
+hi def link etermMiscOptions etermOption
+hi def link etermEScreenOptions etermOption
+hi def link etermURL Identifier
+
+let b:current_syntax = "eterm"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/euphoria3.vim b/runtime/syntax/euphoria3.vim
new file mode 100644
index 0000000..ece1402
--- /dev/null
+++ b/runtime/syntax/euphoria3.vim
@@ -0,0 +1,133 @@
+" Vim syntax file
+" Language: Euphoria 3.1.1 - supports DOS - (http://www.rapideuphoria.com/)
+" Maintainer: Shian Lee
+" Last Change: 2014 Feb 24 (for Vim 7.4)
+" Remark: Euphoria has two syntax files, euphoria3.vim and euphoria4.vim;
+" For details see :help ft-euphoria-syntax
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Reset compatible-options to Vim default value, just in case:
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Should suffice for very long expressions:
+syn sync lines=40
+
+" Euphoria is a case-sensitive language (with only 4 builtin types):
+syntax case match
+
+" Keywords/Builtins for Debug - from $EUDIR/bin/keywords.e:
+syn keyword euphoria3Debug with without trace profile
+syn keyword euphoria3Debug profile_time warning type_check
+
+" Keywords (Statments) - from $EUDIR/bin/keywords.e:
+syn keyword euphoria3Keyword if end then procedure else for return
+syn keyword euphoria3Keyword do elsif while type constant to and or
+syn keyword euphoria3Keyword exit function global by not include
+syn keyword euphoria3Keyword xor
+
+" Builtins (Identifiers) - from $EUDIR/bin/keywords.e:
+syn keyword euphoria3Builtin length puts integer sequence position object
+syn keyword euphoria3Builtin append prepend print printf
+syn keyword euphoria3Builtin clear_screen floor getc gets get_key
+syn keyword euphoria3Builtin rand repeat atom compare find match
+syn keyword euphoria3Builtin time command_line open close getenv
+syn keyword euphoria3Builtin sqrt sin cos tan log system date remainder
+syn keyword euphoria3Builtin power machine_func machine_proc abort peek poke
+syn keyword euphoria3Builtin call sprintf arctan and_bits or_bits xor_bits
+syn keyword euphoria3Builtin not_bits pixel get_pixel mem_copy mem_set
+syn keyword euphoria3Builtin c_proc c_func routine_id call_proc call_func
+syn keyword euphoria3Builtin poke4 peek4s peek4u equal system_exec
+syn keyword euphoria3Builtin platform task_create task_schedule task_yield
+syn keyword euphoria3Builtin task_self task_suspend task_list
+syn keyword euphoria3Builtin task_status task_clock_stop task_clock_start
+syn keyword euphoria3Builtin find_from match_from
+" Builtins (Identifiers) shortcuts for length() and print():
+syn match euphoria3Builtin "\$"
+syn match euphoria3Builtin "?"
+
+" Library Identifiers (Function) - from $EUDIR/doc/library.doc:
+syn keyword euphoria3Library reverse sort custom_sort lower upper
+syn keyword euphoria3Library wildcard_match wildcard_file arcsin
+syn keyword euphoria3Library arccos PI flush lock_file unlock_file
+syn keyword euphoria3Library pretty_print sprint get_bytes prompt_string
+syn keyword euphoria3Library wait_key get prompt_number value seek where
+syn keyword euphoria3Library current_dir chdir dir walk_dir allow_break
+syn keyword euphoria3Library check_break get_mouse mouse_events mouse_pointer
+syn keyword euphoria3Library tick_rate sleep get_position graphics_mode
+syn keyword euphoria3Library video_config scroll wrap text_color bk_color
+syn keyword euphoria3Library palette all_palette get_all_palette read_bitmap
+syn keyword euphoria3Library save_bitmap get_active_page set_active_page
+syn keyword euphoria3Library get_display_page set_display_page sound
+syn keyword euphoria3Library cursor text_rows get_screen_char put_screen_char
+syn keyword euphoria3Library save_text_image display_text_image draw_line
+syn keyword euphoria3Library polygon ellipse save_screen save_image display_image
+syn keyword euphoria3Library dos_interrupt allocate free allocate_low free_low
+syn keyword euphoria3Library allocate_string register_block unregister_block
+syn keyword euphoria3Library get_vector set_vector lock_memory int_to_bytes
+syn keyword euphoria3Library bytes_to_int int_to_bits bits_to_int atom_to_float64
+syn keyword euphoria3Library atom_to_float32 float64_to_atom float32_to_atom
+syn keyword euphoria3Library set_rand use_vesa crash_file crash_message
+syn keyword euphoria3Library crash_routine open_dll define_c_proc define_c_func
+syn keyword euphoria3Library define_c_var call_back message_box free_console
+syn keyword euphoria3Library instance
+
+" Library Identifiers (Function) - from $EUDIR/doc/database.doc:
+syn keyword euphoria3Library db_create db_open db_select db_close db_create_table
+syn keyword euphoria3Library db_select_table db_rename_table db_delete_table
+syn keyword euphoria3Library db_table_list db_table_size db_find_key db_record_key
+syn keyword euphoria3Library db_record_data db_insert db_delete_record
+syn keyword euphoria3Library db_replace_data db_compress db_dump db_fatal_id
+
+" Linux shell comment (#!...):
+syn match euphoria3Comment "\%^#!.*$"
+" Comment on one line:
+syn region euphoria3Comment start=/--/ end=/$/
+
+" Delimiters and brackets:
+syn match euphoria3Delimit "[([\])]"
+syn match euphoria3Delimit "\.\."
+syn match euphoria3Operator "[{}]"
+
+" Character constant:
+syn region euphoria3Char start=/'/ skip=/\\'\|\\\\/ end=/'/ oneline
+
+" String constant:
+syn region euphoria3String start=/"/ skip=/\\"\|\\\\/ end=/"/ oneline
+
+" Hexadecimal integer:
+syn match euphoria3Number "#[0-9A-F]\+\>"
+
+" Integer/Floating point without a dot:
+syn match euphoria3Number "\<\d\+\>"
+" Floating point with dot:
+syn match euphoria3Number "\<\d\+\.\d*\>"
+" Floating point starting with a dot:
+syn match euphoria3Number "\.\d\+\>"
+" Boolean constants:
+syn keyword euphoria3Boolean true TRUE false FALSE
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet:
+hi def link euphoria3Comment Comment
+hi def link euphoria3String String
+hi def link euphoria3Char Character
+hi def link euphoria3Number Number
+hi def link euphoria3Boolean Boolean
+hi def link euphoria3Builtin Identifier
+hi def link euphoria3Library Function
+hi def link euphoria3Keyword Statement
+hi def link euphoria3Operator Statement
+hi def link euphoria3Debug Debug
+hi def link euphoria3Delimit Delimiter
+
+let b:current_syntax = "euphoria3"
+
+" Restore current compatible-options:
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
diff --git a/runtime/syntax/euphoria4.vim b/runtime/syntax/euphoria4.vim
new file mode 100644
index 0000000..5e668a7
--- /dev/null
+++ b/runtime/syntax/euphoria4.vim
@@ -0,0 +1,245 @@
+" Vim syntax file
+" Language: Euphoria 4.0.5 (http://www.openeuphoria.org/)
+" Maintainer: Shian Lee
+" Last Change: 2014 Feb 26 (for Vim 7.4)
+" Remark: Euphoria has two syntax files, euphoria3.vim and euphoria4.vim;
+" For details see :help ft-euphoria-syntax
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Reset compatible-options to Vim default value, just in case:
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Should suffice for very long strings and expressions:
+syn sync lines=40
+
+" Euphoria is a case-sensitive language (with only 4 builtin types):
+syntax case match
+
+" Some keywords/Builtins for Debug - from $EUDIR/include/euphoria/keywords.e:
+syn keyword euphoria4Debug with without trace profile batch check indirect
+syn keyword euphoria4Debug includes inline warning define
+
+" Keywords for conditional compilation - from $EUDIR/include/euphoria/keywords.e:
+syn keyword euphoria4PreProc elsedef elsifdef ifdef
+
+" Keywords (Statments) - from $EUDIR/include/euphoria/keywords.e:
+syn keyword euphoria4Keyword and as break by case constant continue do else
+syn keyword euphoria4Keyword elsif end entry enum exit export
+syn keyword euphoria4Keyword fallthru for function global goto if include
+syn keyword euphoria4Keyword label loop namespace not or override procedure
+syn keyword euphoria4Keyword public retry return routine switch then to type
+syn keyword euphoria4Keyword until while xor
+
+" Builtins (Identifiers) - from $EUDIR/include/euphoria/keywords.e:
+syn keyword euphoria4Builtin abort and_bits append arctan atom c_func c_proc
+syn keyword euphoria4Builtin call call_func call_proc clear_screen close
+syn keyword euphoria4Builtin command_line compare cos date delete delete_routine
+syn keyword euphoria4Builtin equal find floor get_key getc getenv gets hash
+syn keyword euphoria4Builtin head include_paths insert integer length log
+syn keyword euphoria4Builtin machine_func machine_proc match mem_copy mem_set
+syn keyword euphoria4Builtin not_bits object open option_switches or_bits peek
+syn keyword euphoria4Builtin peek2s peek2u peek4s peek4u peek_string peeks pixel
+syn keyword euphoria4Builtin platform poke poke2 poke4 position power prepend
+syn keyword euphoria4Builtin print printf puts rand remainder remove repeat
+syn keyword euphoria4Builtin replace routine_id sequence sin splice sprintf
+syn keyword euphoria4Builtin sqrt system system_exec tail tan task_clock_start
+syn keyword euphoria4Builtin task_clock_stop task_create task_list task_schedule
+syn keyword euphoria4Builtin task_self task_status task_suspend task_yield time
+syn keyword euphoria4Builtin xor_bits
+" Builtins (Identifiers) shortcuts for length() and print():
+syn match euphoria4Builtin "\$"
+syn match euphoria4Builtin "?"
+
+" Library Identifiers (Function) - grep from $EUDIR/include/*:
+syn keyword euphoria4Library DEP_on SyntaxColor abbreviate_path abs absolute_path
+syn keyword euphoria4Library accept add add_item all_copyrights all_matches
+syn keyword euphoria4Library allocate allocate_code allocate_data allocate_low
+syn keyword euphoria4Library allocate_pointer_array allocate_protect
+syn keyword euphoria4Library allocate_string allocate_string_pointer_array
+syn keyword euphoria4Library allocate_wstring allocations allow_break any_key
+syn keyword euphoria4Library append_lines apply approx arccos arccosh arcsin
+syn keyword euphoria4Library arcsinh arctanh assert at atan2 atom_to_float32
+syn keyword euphoria4Library atom_to_float64 attr_to_colors avedev average
+syn keyword euphoria4Library begins binary_search bind binop_ok bits_to_int
+syn keyword euphoria4Library bk_color breakup build_commandline build_list
+syn keyword euphoria4Library bytes_to_int calc_hash calc_primes call_back
+syn keyword euphoria4Library canon2win canonical canonical_path ceil
+syn keyword euphoria4Library central_moment chance char_test chdir
+syn keyword euphoria4Library check_all_blocks check_break check_free_list
+syn keyword euphoria4Library checksum clear clear_directory cmd_parse
+syn keyword euphoria4Library colors_to_attr columnize combine connect
+syn keyword euphoria4Library console_colors copy copy_file cosh count crash
+syn keyword euphoria4Library crash_file crash_message crash_routine create
+syn keyword euphoria4Library create_directory create_file curdir current_dir
+syn keyword euphoria4Library cursor custom_sort datetime days_in_month
+syn keyword euphoria4Library days_in_year db_cache_clear db_clear_table db_close
+syn keyword euphoria4Library db_compress db_connect db_create db_create_table
+syn keyword euphoria4Library db_current db_current_table db_delete_record
+syn keyword euphoria4Library db_delete_table db_dump db_fetch_record db_find_key
+syn keyword euphoria4Library db_get_errors db_get_recid db_insert db_open
+syn keyword euphoria4Library db_record_data db_record_key db_record_recid
+syn keyword euphoria4Library db_rename_table db_replace_data db_replace_recid
+syn keyword euphoria4Library db_select db_select_table db_set_caching
+syn keyword euphoria4Library db_table_list db_table_size deallocate decanonical
+syn keyword euphoria4Library decode defaulted_value defaultext define_c_func
+syn keyword euphoria4Library define_c_proc define_c_var deg2rad delete_file
+syn keyword euphoria4Library dep_works dequote deserialize diff dir dir_size
+syn keyword euphoria4Library dirname disk_metrics disk_size display
+syn keyword euphoria4Library display_text_image dnsquery driveid dump dup emovavg
+syn keyword euphoria4Library encode ends ensure_in_list ensure_in_range
+syn keyword euphoria4Library error_code error_message error_no error_string
+syn keyword euphoria4Library error_to_string escape euphoria_copyright exec
+syn keyword euphoria4Library exp extract fetch fib file_exists file_length
+syn keyword euphoria4Library file_timestamp file_type filebase fileext filename
+syn keyword euphoria4Library filter find_all find_all_but find_any find_each
+syn keyword euphoria4Library find_nested find_replace find_replace_callback
+syn keyword euphoria4Library find_replace_limit flags_to_string flatten
+syn keyword euphoria4Library float32_to_atom float64_to_atom flush for_each
+syn keyword euphoria4Library format frac free free_code free_console free_low
+syn keyword euphoria4Library free_pointer_array from_date from_unix gcd geomean
+syn keyword euphoria4Library get get_bytes get_charsets get_def_lang
+syn keyword euphoria4Library get_display_page get_dstring get_encoding_properties
+syn keyword euphoria4Library get_integer16 get_integer32 get_lang_path get_lcid
+syn keyword euphoria4Library get_mouse get_option get_ovector_size get_pid
+syn keyword euphoria4Library get_position get_rand get_screen_char get_text
+syn keyword euphoria4Library get_vector getaddrinfo getmxrr getnsrr graphics_mode
+syn keyword euphoria4Library harmean has has_console has_match hex_text
+syn keyword euphoria4Library host_by_addr host_by_name http_get http_post iff
+syn keyword euphoria4Library iif info init_class init_curdir insertion_sort
+syn keyword euphoria4Library instance int_to_bits int_to_bytes intdiv
+syn keyword euphoria4Library is_DEP_supported is_empty is_even is_even_obj
+syn keyword euphoria4Library is_in_list is_in_range is_inetaddr is_leap_year
+syn keyword euphoria4Library is_match is_using_DEP is_win_nt join join_path
+syn keyword euphoria4Library keep_comments keep_newlines key_codes keys keyvalues
+syn keyword euphoria4Library kill kurtosis lang_load larger_of largest last
+syn keyword euphoria4Library listen load load_map locate_file lock_file
+syn keyword euphoria4Library lock_memory log10 lookup lower malloc mapping
+syn keyword euphoria4Library match_all match_any match_replace matches max
+syn keyword euphoria4Library maybe_any_key median memory_used merge message_box
+syn keyword euphoria4Library mid min minsize mod mode money mouse_events
+syn keyword euphoria4Library mouse_pointer movavg move_file nested_get
+syn keyword euphoria4Library nested_put new new_extra new_from_kvpairs
+syn keyword euphoria4Library new_from_string new_time next_prime now now_gmt
+syn keyword euphoria4Library number open_dll optimize option_spec_to_string
+syn keyword euphoria4Library or_all pad_head pad_tail pairs parse
+syn keyword euphoria4Library parse_commandline parse_ip_address parse_querystring
+syn keyword euphoria4Library parse_url patch pathinfo pathname pcre_copyright
+syn keyword euphoria4Library peek_end peek_top peek_wstring pivot platform_name
+syn keyword euphoria4Library poke_string poke_wstring pop powof2 prepare_block
+syn keyword euphoria4Library pretty_print pretty_sprint prime_list process_lines
+syn keyword euphoria4Library product project prompt_number prompt_string proper
+syn keyword euphoria4Library push put put_integer16 put_integer32 put_screen_char
+syn keyword euphoria4Library quote rad2deg rand_range range raw_frequency read
+syn keyword euphoria4Library read_bitmap read_file read_lines receive receive_from
+syn keyword euphoria4Library register_block rehash remove_all remove_directory
+syn keyword euphoria4Library remove_dups remove_item remove_subseq rename_file
+syn keyword euphoria4Library repeat_pattern reset retain_all reverse rfind rmatch
+syn keyword euphoria4Library rnd rnd_1 roll rotate rotate_bits round safe_address
+syn keyword euphoria4Library sample save_bitmap save_map save_text_image scroll
+syn keyword euphoria4Library seek select send send_to serialize series
+syn keyword euphoria4Library service_by_name service_by_port set
+syn keyword euphoria4Library set_accumulate_summary set_charsets set_colors
+syn keyword euphoria4Library set_decimal_mark set_def_lang set_default_charsets
+syn keyword euphoria4Library set_encoding_properties set_keycodes set_lang_path
+syn keyword euphoria4Library set_option set_rand set_test_abort set_test_verbosity
+syn keyword euphoria4Library set_vector set_wait_on_summary setenv shift_bits
+syn keyword euphoria4Library show_block show_help show_tokens shuffle shutdown
+syn keyword euphoria4Library sign sim_index sinh size skewness sleep slice small
+syn keyword euphoria4Library smaller_of smallest sort sort_columns sound split
+syn keyword euphoria4Library split_any split_limit split_path sprint start_time
+syn keyword euphoria4Library statistics stdev store string_numbers subtract sum
+syn keyword euphoria4Library sum_central_moments swap tanh task_delay temp_file
+syn keyword euphoria4Library test_equal test_exec test_fail test_false
+syn keyword euphoria4Library test_not_equal test_pass test_read test_report
+syn keyword euphoria4Library test_true test_write text_color text_rows threshold
+syn keyword euphoria4Library tick_rate to_integer to_number to_string to_unix
+syn keyword euphoria4Library tokenize_file tokenize_string top transform translate
+syn keyword euphoria4Library transmute trim trim_head trim_tail trsprintf trunc
+syn keyword euphoria4Library type_of uname unlock_file unregister_block unsetenv
+syn keyword euphoria4Library upper use_vesa valid valid_index value values version
+syn keyword euphoria4Library version_date version_major version_minor version_node
+syn keyword euphoria4Library version_patch version_revision version_string
+syn keyword euphoria4Library version_string_long version_string_short version_type
+syn keyword euphoria4Library video_config vlookup vslice wait_key walk_dir
+syn keyword euphoria4Library warning_file weeks_day where which_bit wildcard_file
+syn keyword euphoria4Library wildcard_match wrap write write_file write_lines
+syn keyword euphoria4Library writef writefln years_day
+
+" Library Identifiers (Type) - grep from $EUDIR/include/*:
+syn keyword euphoria4Type ascii_string boolean bordered_address byte_range
+syn keyword euphoria4Type case_flagset_type color cstring
+syn keyword euphoria4Type file_number file_position graphics_point
+syn keyword euphoria4Type integer_array lcid lock_type machine_addr map
+syn keyword euphoria4Type mixture number_array option_spec
+syn keyword euphoria4Type page_aligned_address positive_int process regex
+syn keyword euphoria4Type sequence_array socket stack std_library_address
+syn keyword euphoria4Type string t_alnum t_alpha t_ascii t_boolean
+syn keyword euphoria4Type t_bytearray t_cntrl t_consonant t_digit t_display
+syn keyword euphoria4Type t_graph t_identifier t_lower t_print t_punct
+syn keyword euphoria4Type t_space t_specword t_text t_upper t_vowel t_xdigit
+syn keyword euphoria4Type valid_memory_protection_constant valid_wordsize
+
+" Linux shell comment (#!...):
+syn match euphoria4Comment "\%^#!.*$"
+" Single and multilines comments:
+syn region euphoria4Comment start=/--/ end=/$/
+syn region euphoria4Comment start="/\*" end="\*/"
+
+" Delimiters and brackets:
+syn match euphoria4Delimit "[([\])]"
+syn match euphoria4Delimit "\.\."
+syn match euphoria4Delimit ":"
+syn match euphoria4Operator "[{}]"
+
+" Character constant:
+syn region euphoria4Char start=/'/ skip=/\\'\|\\\\/ end=/'/ oneline
+
+" String constant (""" must be *after* "):
+syn region euphoria4String start=/"/ skip=/\\"\|\\\\/ end=/"/ oneline
+syn region euphoria4String start=/b"\|x"/ end=/"/
+syn region euphoria4String start=/`/ end=/`/
+syn region euphoria4String start=/"""/ end=/"""/
+
+" Binary/Octal/Decimal/Hexadecimal integer:
+syn match euphoria4Number "\<0b[01_]\+\>"
+syn match euphoria4Number "\<0t[0-7_]\+\>"
+syn match euphoria4Number "\<0d[0-9_]\+\>"
+syn match euphoria4Number "\<0x[0-9A-Fa-f_]\+\>"
+syn match euphoria4Number "#[0-9A-Fa-f_]\+\>"
+
+" Integer/Floating point without a dot:
+syn match euphoria4Number "\<\d\+\>"
+" Floating point with dot:
+syn match euphoria4Number "\<\d\+\.\d*\>"
+" Floating point starting with a dot:
+syn match euphoria4Number "\.\d\+\>"
+" Boolean constants:
+syn keyword euphoria4Boolean true TRUE false FALSE
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet:
+hi def link euphoria4Comment Comment
+hi def link euphoria4String String
+hi def link euphoria4Char Character
+hi def link euphoria4Number Number
+hi def link euphoria4Boolean Boolean
+hi def link euphoria4Builtin Identifier
+hi def link euphoria4Library Function
+hi def link euphoria4Type Type
+hi def link euphoria4Keyword Statement
+hi def link euphoria4Operator Statement
+hi def link euphoria4Debug Debug
+hi def link euphoria4Delimit Delimiter
+hi def link euphoria4PreProc PreProc
+
+let b:current_syntax = "euphoria4"
+
+" Restore current compatible-options:
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
diff --git a/runtime/syntax/eviews.vim b/runtime/syntax/eviews.vim
new file mode 100644
index 0000000..03cfb25
--- /dev/null
+++ b/runtime/syntax/eviews.vim
@@ -0,0 +1,87 @@
+" Vim syntax file
+" Language: Eviews (http://www.eviews.com)
+" Maintainer: Vaidotas Zemlys <zemlys@gmail.com>
+" Last Change: 2006 Apr 30
+" Filenames: *.prg
+" URL: http://uosis.mif.vu.lt/~zemlys/vim-syntax/eviews.vim
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=@,48-57,_,.
+
+syn case match
+
+" Comment
+syn match eComment /\'.*/
+
+" Constant
+" string enclosed in double quotes
+syn region eString start=/"/ skip=/\\\\\|\\"/ end=/"/
+" number with no fractional part or exponent
+syn match eNumber /\d\+/
+" floating point number with integer and fractional parts and optional exponent
+syn match eFloat /\d\+\.\d*\([Ee][-+]\=\d\+\)\=/
+" floating point number with no integer part and optional exponent
+syn match eFloat /\.\d\+\([Ee][-+]\=\d\+\)\=/
+" floating point number with no fractional part and optional exponent
+syn match eFloat /\d\+[Ee][-+]\=\d\+/
+
+" Identifier
+" identifier with leading letter and optional following keyword characters
+syn match eIdentifier /\a\k*/
+
+" Eviews Programing Language
+syn keyword eProgLang @date else endif @errorcount @evpath exitloop for if @isobject next poff pon return statusline step stop @temppath then @time to @toc wend while include call subroutine endsub and or
+
+" Eviews Objects, Views and Procedures
+syn keyword eOVP alpha coef equation graph group link logl matrix model pool rowvector sample scalar series sspace sym system table text valmap var vector
+
+
+" Standard Eviews Commands
+syn keyword eStdCmd 3sls add addassign addinit addtext align alpha append arch archtest area arlm arma arroots auto axis bar bdstest binary block boxplot boxplotby bplabel cause ccopy cd cdfplot cellipse censored cfetch checkderivs chow clabel cleartext close coef coefcov coint comment control copy cor correl correlsq count cov create cross data datelabel dates db dbcopy dbcreate dbdelete dbopen dbpack dbrebuild dbrename dbrepair decomp define delete derivs describe displayname do draw driconvert drop dtable ec edftest endog eqs equation errbar exclude exit expand fetch fill fiml fit forecast freeze freq frml garch genr gmm grads graph group hconvert hfetch hilo hist hlabel hpf impulse jbera kdensity kerfit label laglen legend line linefit link linkto load logit logl ls makecoint makederivs makeendog makefilter makegarch makegrads makegraph makegroup makelimits makemodel makeregs makeresids makesignals makestates makestats makesystem map matrix means merge metafile ml model msg name nnfit open options ordered output override pageappend pagecontract pagecopy pagecreate pagedelete pageload pagerename pagesave pageselect pagestack pagestruct pageunstack param pcomp pie pool predict print probit program qqplot qstats range read rename representations resample reset residcor residcov resids results rls rndint rndseed rowvector run sample save scalar scale scat scatmat scenario seas seasplot series set setbpelem setcell setcolwidth setconvert setelem setfillcolor setfont setformat setheight setindent setjust setline setlines setmerge settextcolor setwidth sheet show signalgraphs smooth smpl solve solveopt sort spec spike sspace statby statefinal stategraphs stateinit stats statusline stomna store structure sur svar sym system table template testadd testbtw testby testdrop testexog testfit testlags teststat text tic toc trace tramoseats tsls unlink update updatecoefs uroot usage valmap var vars vector wald wfcreate wfopen wfsave wfselect white wls workfile write wtsls x11 x12 xy xyline xypair
+
+" Constant Identifier
+syn match eConstant /\!\k*/
+" String Identifier
+syn match eStringId /%\k*/
+" Command Identifier
+syn match eCommand /@\k*/
+
+" Special
+syn match eDelimiter /[,;:]/
+
+" Error
+syn region eRegion matchgroup=Delimiter start=/(/ matchgroup=Delimiter end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError
+syn region eRegion matchgroup=Delimiter start=/{/ matchgroup=Delimiter end=/}/ transparent contains=ALLBUT,rError,rBraceError,rParenError
+syn region eRegion matchgroup=Delimiter start=/\[/ matchgroup=Delimiter end=/]/ transparent contains=ALLBUT,rError,rCurlyError,rParenError
+syn match eError /[)\]}]/
+syn match eBraceError /[)}]/ contained
+syn match eCurlyError /[)\]]/ contained
+syn match eParenError /[\]}]/ contained
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/exim.vim b/runtime/syntax/exim.vim
new file mode 100644
index 0000000..4edc0d7
--- /dev/null
+++ b/runtime/syntax/exim.vim
@@ -0,0 +1,105 @@
+" Vim syntax file
+" This is a GENERATED FILE. Please always refer to source file at the URI below.
+" Language: Exim configuration file exim.conf
+" Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2002-10-15
+" URL: http://trific.ath.cx/Ftp/vim/syntax/exim.vim
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" Base constructs
+syn match eximComment "^\s*#.*$" contains=eximFixme
+syn match eximComment "\s#.*$" contains=eximFixme
+syn keyword eximFixme FIXME TODO XXX NOT contained
+syn keyword eximConstant true false yes no
+syn match eximNumber "\<\d\+[KM]\?\>"
+syn match eximNumber "\<0[xX]\x\+\>"
+syn match eximNumber "\<\d\+\(\.\d\{,3}\)\?\>"
+syn match eximTime "\<\(\d\+[wdhms]\)\+\>"
+syn match eximSpecialChar "\\[\\nrt]\|\\\o\{1,3}\|\\x\x\{1,2}"
+syn region eximMacroDefinition matchgroup=eximMacroName start="^[A-Z]\i*\s*=" end="$" skip="\\\s*$" transparent
+
+syn match eximDriverName "\<\(aliasfile\|appendfile\|autoreply\|domainlist\|forwardfile\|ipliteral\|iplookup\|lmtp\|localuser\|lookuphost\|pipe\|queryprogram\|smartuser\|smtp\)\>"
+syn match eximTransport "^\s*\i\+:"
+
+" Options
+syn keyword eximEnd end
+syn keyword eximKeyword accept_8bitmime accept_timeout admin_groups allow_mx_to_ip always_bcc auth_always_advertise auth_hosts auth_over_tls_hosts auto_thaw bi_command check_log_inodes check_log_space check_spool_inodes check_spool_space collapse_source_routes daemon_smtp_port daemon_smtp_service debug_level delay_warning delay_warning_condition deliver_load_max deliver_queue_load_max delivery_date_remove dns_again_means_nonexist dns_check_names dns_check_names_pattern dns_retrans dns_ipv4_lookup dns_retry envelope_to_remove errmsg_text errmsg_file errors_address errors_copy errors_reply_to exim_group exim_path exim_user extract_addresses_remove_arguments finduser_retries forbid_domain_literals freeze_tell_mailmaster gecos_name gecos_pattern headers_check_syntax headers_checks_fail headers_sender_verify headers_sender_verify_errmsg helo_accept_junk_hosts helo_strict_syntax helo_verify hold_domains host_accept_relay host_auth_accept_relay host_lookup host_reject host_reject_recipients hosts_treat_as_local ignore_errmsg_errors ignore_errmsg_errors_after ignore_fromline_hosts ignore_fromline_local keep_malformed kill_ip_options ldap_default_servers local_domains local_domains_include_host local_domains_include_host_literals local_from_check local_from_prefix local_from_suffix local_interfaces localhost_number locally_caseless log_all_parents log_arguments log_file_path log_incoming_port log_ip_options log_level log_queue_run_level log_received_recipients log_received_sender log_refused_recipients log_rewrites log_sender_on_delivery log_smtp_confirmation log_smtp_connections log_smtp_syntax_errors log_subject lookup_open_max max_username_length message_body_visible message_filter message_filter_directory_transport message_filter_directory2_transport message_filter_file_transport message_filter_group message_filter_pipe_transport message_filter_reply_transport message_filter_user message_id_header_text message_size_limit message_size_limit_count_recipients move_frozen_messages mysql_servers never_users nobody_group nobody_user percent_hack_domains perl_at_start perl_startup pgsql_servers pid_file_path preserve_message_logs primary_hostname print_topbitchars prod_requires_admin prohibition_message qualify_domain qualify_recipient queue_list_requires_admin queue_only queue_only_file queue_only_load queue_remote_domains queue_run_in_order queue_run_max queue_smtp_domains rbl_domains rbl_hosts rbl_log_headers rbl_log_rcpt_count rbl_reject_recipients rbl_warn_header received_header_text received_headers_max receiver_try_verify receiver_unqualified_hosts receiver_verify receiver_verify_addresses receiver_verify_hosts receiver_verify_senders recipients_max recipients_max_reject recipients_reject_except recipients_reject_except_senders refuse_ip_options relay_domains relay_domains_include_local_mx relay_match_host_or_sender remote_max_parallel remote_sort retry_data_expire retry_interval_max return_path_remove return_size_limit rfc1413_hosts rfc1413_query_timeout security sender_address_relay sender_address_relay_hosts sender_reject sender_reject_recipients sender_try_verify sender_unqualified_hosts sender_verify sender_verify_batch sender_verify_callback_domains sender_verify_callback_timeout sender_verify_fixup sender_verify_hosts sender_verify_hosts_callback sender_verify_max_retry_rate sender_verify_reject smtp_accept_keepalive smtp_accept_max smtp_accept_max_per_host smtp_accept_queue smtp_accept_queue_per_connection smtp_accept_reserve smtp_banner smtp_check_spool_space smtp_connect_backlog smtp_etrn_command smtp_etrn_hosts smtp_etrn_serialize smtp_expn_hosts smtp_load_reserve smtp_receive_timeout smtp_reserve_hosts smtp_verify split_spool_directory spool_directory strip_excess_angle_brackets strip_trailing_dot syslog_timestamp timeout_frozen_after timestamps_utc timezone tls_advertise_hosts tls_certificate tls_dhparam tls_host_accept_relay tls_hosts tls_log_cipher tls_log_peerdn tls_privatekey tls_verify_certificates tls_verify_ciphers tls_verify_hosts trusted_groups trusted_users unknown_login unknown_username untrusted_set_sender uucp_from_pattern uucp_from_sender warnmsg_file
+syn keyword eximKeyword no_accept_8bitmime no_allow_mx_to_ip no_always_bcc no_auth_always_advertise no_collapse_source_routes no_delivery_date_remove no_dns_check_names no_envelope_to_remove no_extract_addresses_remove_arguments no_forbid_domain_literals no_freeze_tell_mailmaster no_headers_check_syntax no_headers_checks_fail no_headers_sender_verify no_headers_sender_verify_errmsg no_helo_strict_syntax no_ignore_errmsg_errors no_ignore_fromline_local no_kill_ip_options no_local_domains_include_host no_local_domains_include_host_literals no_local_from_check no_locally_caseless no_log_all_parents no_log_arguments no_log_incoming_port no_log_ip_options no_log_received_recipients no_log_received_sender no_log_refused_recipients no_log_rewrites no_log_sender_on_delivery no_log_smtp_confirmation no_log_smtp_connections no_log_smtp_syntax_errors no_log_subject no_message_size_limit_count_recipients no_move_frozen_messages no_preserve_message_logs no_print_topbitchars no_prod_requires_admin no_queue_list_requires_admin no_queue_only no_rbl_log_headers no_rbl_log_rcpt_count no_rbl_reject_recipients no_receiver_try_verify no_receiver_verify no_recipients_max_reject no_refuse_ip_options no_relay_domains_include_local_mx no_relay_match_host_or_sender no_return_path_remove no_sender_try_verify no_sender_verify no_sender_verify_batch no_sender_verify_fixup no_sender_verify_reject no_smtp_accept_keepalive no_smtp_check_spool_space no_smtp_etrn_serialize no_smtp_verify no_split_spool_directory no_strip_excess_angle_brackets no_strip_trailing_dot no_syslog_timestamp no_timestamps_utc no_tls_log_cipher no_tls_log_peerdn no_untrusted_set_sender
+syn keyword eximKeyword not_accept_8bitmime not_allow_mx_to_ip not_always_bcc not_auth_always_advertise not_collapse_source_routes not_delivery_date_remove not_dns_check_names not_envelope_to_remove not_extract_addresses_remove_arguments not_forbid_domain_literals not_freeze_tell_mailmaster not_headers_check_syntax not_headers_checks_fail not_headers_sender_verify not_headers_sender_verify_errmsg not_helo_strict_syntax not_ignore_errmsg_errors not_ignore_fromline_local not_kill_ip_options not_local_domains_include_host not_local_domains_include_host_literals not_local_from_check not_locally_caseless not_log_all_parents not_log_arguments not_log_incoming_port not_log_ip_options not_log_received_recipients not_log_received_sender not_log_refused_recipients not_log_rewrites not_log_sender_on_delivery not_log_smtp_confirmation not_log_smtp_connections not_log_smtp_syntax_errors not_log_subject not_message_size_limit_count_recipients not_move_frozen_messages not_preserve_message_logs not_print_topbitchars not_prod_requires_admin not_queue_list_requires_admin not_queue_only not_rbl_log_headers not_rbl_log_rcpt_count not_rbl_reject_recipients not_receiver_try_verify not_receiver_verify not_recipients_max_reject not_refuse_ip_options not_relay_domains_include_local_mx not_relay_match_host_or_sender not_return_path_remove not_sender_try_verify not_sender_verify not_sender_verify_batch not_sender_verify_fixup not_sender_verify_reject not_smtp_accept_keepalive not_smtp_check_spool_space not_smtp_etrn_serialize not_smtp_verify not_split_spool_directory not_strip_excess_angle_brackets not_strip_trailing_dot not_syslog_timestamp not_timestamps_utc not_tls_log_cipher not_tls_log_peerdn not_untrusted_set_sender
+syn keyword eximKeyword body_only debug_print delivery_date_add driver envelope_to_add headers_add headers_only headers_remove headers_rewrite message_size_limit return_path return_path_add shadow_condition shadow_transport transport_filter
+syn keyword eximKeyword no_body_only no_delivery_date_add no_envelope_to_add no_headers_only no_return_path_add
+syn keyword eximKeyword not_body_only not_delivery_date_add not_envelope_to_add not_headers_only not_return_path_add
+syn keyword eximKeyword allow_fifo allow_symlink batch batch_max bsmtp bsmtp_helo check_group check_owner check_string create_directory create_file current_directory directory directory_mode escape_string file file_format file_must_exist from_hack group lock_fcntl_timeout lock_interval lock_retries lockfile_mode lockfile_timeout maildir_format maildir_retries maildir_tag mailstore_format mailstore_prefix mailstore_suffix mbx_format mode mode_fail_narrower notify_comsat prefix quota quota_filecount quota_is_inclusive quota_size_regex quota_warn_message quota_warn_threshold require_lockfile retry_use_local_part suffix use_crlf use_fcntl_lock use_lockfile use_mbx_lock user
+syn keyword eximKeyword no_allow_fifo no_allow_symlink no_bsmtp_helo no_check_group no_check_owner no_create_directory no_file_must_exist no_from_hack no_maildir_format no_mailstore_format no_mbx_format no_mode_fail_narrower no_notify_comsat no_quota_is_inclusive no_require_lockfile no_retry_use_local_part no_use_crlf no_use_fcntl_lock no_use_lockfile no_use_mbx_lock
+syn keyword eximKeyword not_allow_fifo not_allow_symlink not_bsmtp_helo not_check_group not_check_owner not_create_directory not_file_must_exist not_from_hack not_maildir_format not_mailstore_format not_mbx_format not_mode_fail_narrower not_notify_comsat not_quota_is_inclusive not_require_lockfile not_retry_use_local_part not_use_crlf not_use_fcntl_lock not_use_lockfile not_use_mbx_lock
+syn keyword eximKeyword bcc cc file file_expand file_optional from group headers initgroups log mode once once_file_size once_repeat reply_to return_message subject text to user
+syn keyword eximKeyword no_file_expand no_file_optional no_initgroups no_return_message
+syn keyword eximKeyword not_file_expand not_file_optional not_initgroups not_return_message
+syn keyword eximKeyword batch batch_max command group initgroups retry_use_local_part timeout user
+syn keyword eximKeyword no_initgroups
+syn keyword eximKeyword not_initgroups
+syn keyword eximKeyword allow_commands batch batch_max bsmtp bsmtp_helo check_string command current_directory environment escape_string freeze_exec_fail from_hack group home_directory ignore_status initgroups log_defer_output log_fail_output log_output max_output path pipe_as_creator prefix restrict_to_path retry_use_local_part return_fail_output return_output suffix temp_errors timeout umask use_crlf use_shell user
+syn keyword eximKeyword no_bsmtp_helo no_freeze_exec_fail no_from_hack no_ignore_status no_log_defer_output no_log_fail_output no_log_output no_pipe_as_creator no_restrict_to_path no_return_fail_output no_return_output no_use_crlf no_use_shell
+syn keyword eximKeyword not_bsmtp_helo not_freeze_exec_fail not_from_hack not_ignore_status not_log_defer_output not_log_fail_output not_log_output not_pipe_as_creator not_restrict_to_path not_return_fail_output not_return_output not_use_crlf not_use_shell
+syn keyword eximKeyword allow_localhost authenticate_hosts batch_max command_timeout connect_timeout data_timeout delay_after_cutoff dns_qualify_single dns_search_parents fallback_hosts final_timeout gethostbyname helo_data hosts hosts_avoid_tls hosts_require_tls hosts_override hosts_max_try hosts_randomize interface keepalive max_rcpt multi_domain mx_domains port protocol retry_include_ip_address serialize_hosts service size_addition tls_certificate tls_privatekey tls_verify_certificates tls_verify_ciphers
+syn keyword eximKeyword no_allow_localhost no_delay_after_cutoff no_dns_qualify_single no_dns_search_parents no_gethostbyname no_hosts_override no_hosts_randomize no_keepalive no_multi_domain no_retry_include_ip_address
+syn keyword eximKeyword not_allow_localhost not_delay_after_cutoff not_dns_qualify_single not_dns_search_parents not_gethostbyname not_hosts_override not_hosts_randomize not_keepalive not_multi_domain not_retry_include_ip_address
+syn keyword eximKeyword condition debug_print domains driver errors_to fail_verify fail_verify_recipient fail_verify_sender fallback_hosts group headers_add headers_remove initgroups local_parts more require_files senders transport unseen user verify verify_only verify_recipient verify_sender
+syn keyword eximKeyword no_fail_verify no_fail_verify_recipient no_fail_verify_sender no_initgroups no_more no_unseen no_verify no_verify_only no_verify_recipient no_verify_sender
+syn keyword eximKeyword not_fail_verify not_fail_verify_recipient not_fail_verify_sender not_initgroups not_more not_unseen not_verify not_verify_only not_verify_recipient not_verify_sender
+syn keyword eximKeyword current_directory expn home_directory new_director prefix prefix_optional suffix suffix_optional
+syn keyword eximKeyword no_expn no_prefix_optional no_suffix_optional
+syn keyword eximKeyword not_expn not_prefix_optional not_suffix_optional
+syn keyword eximKeyword check_ancestor directory_transport directory2_transport file_transport forbid_file forbid_include forbid_pipe freeze_missing_include hide_child_in_errmsg modemask one_time owners owngroups pipe_transport qualify_preserve_domain rewrite skip_syntax_errors syntax_errors_text syntax_errors_to
+syn keyword eximKeyword no_check_ancestor no_forbid_file no_forbid_include no_forbid_pipe no_freeze_missing_include no_hide_child_in_errmsg no_one_time no_qualify_preserve_domain no_rewrite no_skip_syntax_errors
+syn keyword eximKeyword not_check_ancestor not_forbid_file not_forbid_include not_forbid_pipe not_freeze_missing_include not_hide_child_in_errmsg not_one_time not_qualify_preserve_domain not_rewrite not_skip_syntax_errors
+syn keyword eximKeyword expand file forbid_special include_domain optional queries query search_type
+syn keyword eximKeyword no_expand no_forbid_special no_include_domain no_optional
+syn keyword eximKeyword not_expand not_forbid_special not_include_domain not_optional
+syn keyword eximKeyword allow_system_actions check_group check_local_user data file file_directory filter forbid_filter_existstest forbid_filter_logwrite forbid_filter_lookup forbid_filter_perl forbid_filter_reply ignore_eacces ignore_enotdir match_directory reply_transport seteuid
+syn keyword eximKeyword no_allow_system_actions no_check_local_user no_forbid_filter_reply no_forbid_filter_existstest no_forbid_filter_logwrite no_forbid_filter_lookup no_forbid_filter_perl no_forbid_filter_reply no_ignore_eacces no_ignore_enotdir no_seteuid
+syn keyword eximKeyword not_allow_system_actions not_check_local_user not_forbid_filter_reply not_forbid_filter_existstest not_forbid_filter_logwrite not_forbid_filter_lookup not_forbid_filter_perl not_forbid_filter_reply not_ignore_eacces not_ignore_enotdir not_seteuid
+syn keyword eximKeyword match_directory
+syn keyword eximKeyword directory_transport directory2_transport file_transport forbid_file forbid_pipe hide_child_in_errmsg new_address panic_expansion_fail pipe_transport qualify_preserve_domain rewrite
+syn keyword eximKeyword no_forbid_file no_forbid_pipe no_hide_child_in_errmsg no_panic_expansion_fail no_qualify_preserve_domain no_rewrite
+syn keyword eximKeyword not_forbid_file not_forbid_pipe not_hide_child_in_errmsg not_panic_expansion_fail not_qualify_preserve_domain not_rewrite
+syn keyword eximKeyword ignore_target_hosts pass_on_timeout self translate_ip_address
+syn keyword eximKeyword no_pass_on_timeout
+syn keyword eximKeyword not_pass_on_timeout
+syn keyword eximKeyword host_find_failed hosts_randomize modemask owners owngroups qualify_single route_file route_list route_queries route_query search_parents search_type
+syn keyword eximKeyword no_hosts_randomize no_qualify_single no_search_parents
+syn keyword eximKeyword not_hosts_randomize not_qualify_single not_search_parents
+syn keyword eximKeyword hosts optional port protocol query reroute response_pattern service timeout
+syn keyword eximKeyword no_optional
+syn keyword eximKeyword not_optional
+syn keyword eximKeyword check_secondary_mx gethostbyname mx_domains qualify_single rewrite_headers search_parents widen_domains
+syn keyword eximKeyword no_check_secondary_mx no_gethostbyname no_qualify_single no_search_parents
+syn keyword eximKeyword not_check_secondary_mx not_gethostbyname not_qualify_single not_search_parents
+syn keyword eximKeyword command command_group command_user current_directory timeout
+syn keyword eximKeyword driver public_name server_set_id server_mail_auth_condition
+syn keyword eximKeyword server_prompts server_condition client_send
+syn keyword eximKeyword server_secret client_name client_secret
+
+" Define the default highlighting
+
+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
+
+
+let b:current_syntax = "exim"
diff --git a/runtime/syntax/expect.vim b/runtime/syntax/expect.vim
new file mode 100644
index 0000000..75cbd3e
--- /dev/null
+++ b/runtime/syntax/expect.vim
@@ -0,0 +1,103 @@
+" Vim syntax file
+" Language: Expect
+" Maintainer: Ralph Jennings <knowbudy@oro.net>
+" Last Change: 2012 Jun 01
+" (Dominique Pelle added @Spell)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Reserved Expect variable prefixes.
+syn match expectVariables "\$exp[a-zA-Z0-9_]*\|\$inter[a-zA-Z0-9_]*"
+syn match expectVariables "\$spawn[a-zA-Z0-9_]*\|\$timeout[a-zA-Z0-9_]*"
+
+" Normal Expect variables.
+syn match expectVariables "\$env([^)]*)"
+syn match expectVariables "\$any_spawn_id\|\$argc\|\$argv\d*"
+syn match expectVariables "\$user_spawn_id\|\$spawn_id\|\$timeout"
+
+" Expect variable arrays.
+syn match expectVariables "\$\(expect\|interact\)_out([^)]*)" contains=expectOutVar
+
+" User defined variables.
+syn match expectVariables "\$[a-zA-Z_][a-zA-Z0-9_]*"
+
+" Reserved Expect command prefixes.
+syn match expectCommand "exp_[a-zA-Z0-9_]*"
+
+" Normal Expect commands.
+syn keyword expectStatement close debug disconnect
+syn keyword expectStatement exit exp_continue exp_internal exp_open
+syn keyword expectStatement exp_pid exp_version
+syn keyword expectStatement fork inter_return interpreter
+syn keyword expectStatement log_file log_user match_max overlay
+syn keyword expectStatement parity remove_nulls return
+syn keyword expectStatement send send_error send_log send_user
+syn keyword expectStatement sleep spawn strace stty system
+syn keyword expectStatement timestamp trace trap wait
+
+" Tcl commands recognized and used by Expect.
+syn keyword expectCommand proc
+syn keyword expectConditional if else
+syn keyword expectRepeat while for foreach
+
+" Expect commands with special arguments.
+syn keyword expectStatement expect expect_after expect_background nextgroup=expectExpectOpts
+syn keyword expectStatement expect_before expect_user interact nextgroup=expectExpectOpts
+
+syn match expectSpecial contained "\\."
+
+" Options for "expect", "expect_after", "expect_background",
+" "expect_before", "expect_user", and "interact".
+syn keyword expectExpectOpts default eof full_buffer null return timeout
+
+syn keyword expectOutVar contained spawn_id seconds seconds_total
+syn keyword expectOutVar contained string start end buffer
+
+" Numbers (Tcl style).
+syn case ignore
+ syn match expectNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+ "floating point number, with dot, optional exponent
+ syn match expectNumber "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+ "floating point number, starting with a dot, optional exponent
+ syn match expectNumber "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+ "floating point number, without dot, with exponent
+ syn match expectNumber "\<\d\+e[-+]\=\d\+[fl]\=\>"
+ "hex number
+ syn match expectNumber "0x[0-9a-f]\+\(u\=l\=\|lu\)\>"
+ "syn match expectIdentifier "\<[a-z_][a-z0-9_]*\>"
+syn case match
+
+syn region expectString start=+"+ end=+"+ contains=@Spell,expectVariables,expectSpecial
+
+" Are these really comments in Expect? (I never use it, so I'm just guessing).
+syn keyword expectTodo contained TODO
+syn match expectComment "#.*$" contains=@Spell,expectTodo
+syn match expectSharpBang "\%^#!.*"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/exports.vim b/runtime/syntax/exports.vim
new file mode 100644
index 0000000..05a3f1a
--- /dev/null
+++ b/runtime/syntax/exports.vim
@@ -0,0 +1,58 @@
+" Vim syntax file
+" Language: exports
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Aug 31, 2016
+" Version: 8
+" Notes: This file includes both SysV and BSD 'isms
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_EXPORTS
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Options: -word
+syn keyword exportsKeyOptions contained alldirs nohide ro wsync
+syn keyword exportsKeyOptions contained kerb o rw
+syn match exportsOptError contained "[a-z]\+"
+
+" Settings: word=
+syn keyword exportsKeySettings contained access anon root rw
+syn match exportsSetError contained "[a-z]\+"
+
+" OptSet: -word=
+syn keyword exportsKeyOptSet contained mapall maproot mask network
+syn match exportsOptSetError contained "[a-z]\+"
+
+" options and settings
+syn match exportsSettings "[a-z]\+=" contains=exportsKeySettings,exportsSetError
+syn match exportsOptions "-[a-z]\+" contains=exportsKeyOptions,exportsOptError
+syn match exportsOptSet "-[a-z]\+=" contains=exportsKeyOptSet,exportsOptSetError
+
+" Separators
+syn match exportsSeparator "[,:]"
+
+" comments
+syn match exportsComment "^\s*#.*$" contains=@Spell
+
+" Define the default highlighting.
+if !exists("skip_exports_syntax_inits")
+
+ hi def link exportsKeyOptSet exportsKeySettings
+ hi def link exportsOptSet exportsSettings
+
+ 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
+
+ hi def link exportsOptError Error
+ hi def link exportsOptSetError Error
+ hi def link exportsSetError Error
+
+endif
+
+let b:current_syntax = "exports"
+" vim: ts=10
diff --git a/runtime/syntax/falcon.vim b/runtime/syntax/falcon.vim
new file mode 100644
index 0000000..e022c7a
--- /dev/null
+++ b/runtime/syntax/falcon.vim
@@ -0,0 +1,197 @@
+" Vim syntax file
+" Language: Falcon
+" Maintainer: Steven Oliver <oliver.steven@gmail.com>
+" Website: http://github.com/steveno/vim-files/blob/master/syntax/falcon.vim
+" Credits: Thanks the ruby.vim authors, I borrowed a lot!
+" Thanks to the lisp authors for the rainbow code!
+" -------------------------------------------------------------------------------
+
+" When wanted, highlight the trailing whitespace.
+if exists("c_space_errors")
+ if !exists("c_no_trail_space_error")
+ syn match falconSpaceError "\s\+$"
+ endif
+
+ if !exists("c_no_tab_space_error")
+ syn match falconSpaceError " \+\t"me=e-1
+ endif
+endif
+
+" Symbols
+syn match falconSymbol "\(;\|,\|\.\)"
+syn match falconSymbolOther "\(#\|@\)" display
+
+" Operators
+syn match falconOperator "\(+\|-\|\*\|/\|=\|<\|>\|\*\*\|!=\|\~=\)"
+syn match falconOperator "\(<=\|>=\|=>\|\.\.\|<<\|>>\|\"\)"
+
+" Clusters
+syn region falconSymbol start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=@falconStringSpecial fold
+syn case match
+
+" Keywords
+syn keyword falconKeyword all allp any anyp as attributes brigade cascade catch choice class const
+syn keyword falconKeyword continue def directive do list dropping enum eq eval exit export from function
+syn keyword falconKeyword give global has hasnt in init innerfunc lambda launch launch len List list
+syn keyword falconKeyword load notin object pass print printl provides raise return self sender static to
+syn keyword falconKeyword try xamp
+
+" Error Type Keywords
+syn keyword falconKeyword CloneError CodeError Error InterruprtedError IoError MathError
+syn keyword falconKeyword ParamError RangeError SyntaxError TraceStep TypeError
+
+" Todo
+syn keyword falconTodo DEBUG FIXME NOTE TODO XXX
+
+" Conditionals
+syn keyword falconConditional and case default else end if iff
+syn keyword falconConditional elif or not switch select
+syn match falconConditional "end\s\if"
+
+" Loops
+syn keyword falconRepeat break for loop forfirst forlast formiddle while
+
+" Booleans
+syn keyword falconBool true false
+
+" Constants
+syn keyword falconConst PI E nil
+syn match falconConstant "\%(\%([.@$]\@<!\.\)\@<!\<\|::\)\_s*\zs\u\w*\%(\>\|::\)\@=\%(\s*(\)\@!"
+
+" Comments
+syn match falconCommentSkip contained "^\s*\*\($\|\s\+\)"
+syn region falconComment start="/\*" end="\*/" contains=@falconCommentGroup,falconSpaceError,falconTodo
+syn region falconCommentL start="//" end="$" keepend contains=@falconCommentGroup,falconSpaceError,falconTodo
+syn match falconSharpBang "\%^#!.*" display
+syn sync ccomment falconComment
+
+" Numbers
+syn match falconNumbers transparent "\<[+-]\=\d\|[+-]\=\.\d" contains=falconIntLiteral,falconFloatLiteral,falconHexadecimal,falconOctal
+syn match falconNumbersCom contained transparent "\<[+-]\=\d\|[+-]\=\.\d" contains=falconIntLiteral,falconFloatLiteral,falconHexadecimal,falconOctal
+syn match falconHexadecimal contained "\<0x\x\+\>"
+syn match falconOctal contained "\<0\o\+\>"
+syn match falconIntLiteral contained "[+-]\<d\+\(\d\+\)\?\>"
+syn match falconFloatLiteral contained "[+-]\=\d\+\.\d*"
+syn match falconFloatLiteral contained "[+-]\=\d*\.\d*"
+
+" Includes
+syn keyword falconInclude load import
+
+" Expression Substitution and Backslash Notation
+syn match falconStringEscape "\\\\\|\\[abefnrstv]\|\\\o\{1,3}\|\\x\x\{1,2}" contained display
+syn match falconStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=\S\)" contained display
+syn region falconSymbol start="[]})\"':]\@<!:\"" end="\"" skip="\\\\\|\\\"" contains=falconStringEscape fold
+
+" Normal String and Shell Command Output
+syn region falconString matchgroup=falconStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=falconStringEscape fold
+syn region falconString matchgroup=falconStringDelimiter start="'" end="'" skip="\\\\\|\\'" fold
+syn region falconString matchgroup=falconStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=falconStringEscape fold
+
+" Generalized Single Quoted String, Symbol and Array of Strings
+syn region falconString matchgroup=falconStringDelimiter start="%[qw]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
+syn region falconString matchgroup=falconStringDelimiter start="%[qw]{" end="}" skip="\\\\\|\\}" fold contains=falconDelimEscape
+syn region falconString matchgroup=falconStringDelimiter start="%[qw]<" end=">" skip="\\\\\|\\>" fold contains=falconDelimEscape
+syn region falconString matchgroup=falconStringDelimiter start="%[qw]\[" end="\]" skip="\\\\\|\\\]" fold contains=falconDelimEscape
+syn region falconString matchgroup=falconStringDelimiter start="%[qw](" end=")" skip="\\\\\|\\)" fold contains=falconDelimEscape
+syn region falconSymbol matchgroup=falconSymbolDelimiter start="%[s]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" fold
+syn region falconSymbol matchgroup=falconSymbolDelimiter start="%[s]{" end="}" skip="\\\\\|\\}" fold contains=falconDelimEscape
+syn region falconSymbol matchgroup=falconSymbolDelimiter start="%[s]<" end=">" skip="\\\\\|\\>" fold contains=falconDelimEscape
+syn region falconSymbol matchgroup=falconSymbolDelimiter start="%[s]\[" end="\]" skip="\\\\\|\\\]" fold contains=falconDelimEscape
+syn region falconSymbol matchgroup=falconSymbolDelimiter start="%[s](" end=")" skip="\\\\\|\\)" fold contains=falconDelimEscape
+
+" Generalized Double Quoted String and Array of Strings and Shell Command Output
+syn region falconString matchgroup=falconStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=falconStringEscape fold
+syn region falconString matchgroup=falconStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=falconStringEscape fold
+syn region falconString matchgroup=falconStringDelimiter start="%[QWx]\={" end="}" skip="\\\\\|\\}" contains=falconStringEscape,falconDelimEscape fold
+syn region falconString matchgroup=falconStringDelimiter start="%[QWx]\=<" end=">" skip="\\\\\|\\>" contains=falconStringEscape,falconDelimEscape fold
+syn region falconString matchgroup=falconStringDelimiter start="%[QWx]\=\[" end="\]" skip="\\\\\|\\\]" contains=falconStringEscape,falconDelimEscape fold
+syn region falconString matchgroup=falconStringDelimiter start="%[QWx]\=(" end=")" skip="\\\\\|\\)" contains=falconStringEscape,falconDelimEscape fold
+
+syn region falconString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<\z(\h\w*\)\ze+hs=s+2 matchgroup=falconStringDelimiter end=+^\z1$+ contains=falconStringEscape fold keepend
+syn region falconString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<"\z([^"]*\)"\ze+hs=s+2 matchgroup=falconStringDelimiter end=+^\z1$+ contains=falconStringEscape fold keepend
+syn region falconString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<'\z([^']*\)'\ze+hs=s+2 matchgroup=falconStringDelimiter end=+^\z1$+ fold keepend
+syn region falconString start=+\%(\%(class\s*\|\%([]})"'.]\|::\)\)\_s*\|\w\)\@<!<<`\z([^`]*\)`\ze+hs=s+2 matchgroup=falconStringDelimiter end=+^\z1$+ contains=falconStringEscape fold keepend
+
+syn region falconString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-\z(\h\w*\)\ze+hs=s+3 matchgroup=falconStringDelimiter end=+^\s*\zs\z1$+ contains=falconStringEscape fold keepend
+syn region falconString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-"\z([^"]*\)"\ze+hs=s+3 matchgroup=falconStringDelimiter end=+^\s*\zs\z1$+ contains=falconStringEscape fold keepend
+syn region falconString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-'\z([^']*\)'\ze+hs=s+3 matchgroup=falconStringDelimiter end=+^\s*\zs\z1$+ fold keepend
+syn region falconString start=+\%(\%(class\s*\|\%([]}).]\|::\)\)\_s*\|\w\)\@<!<<-`\z([^`]*\)`\ze+hs=s+3 matchgroup=falconStringDelimiter end=+^\s*\zs\z1$+ contains=falconStringEscape fold keepend
+
+" Falcon rainbox to highlight parens in varying colors
+if exists("g:falcon_rainbow") && g:falcon_rainbow != 0
+ syn region falconParen0 matchgroup=hlLevel0 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen1
+ syn region falconParen1 contained matchgroup=hlLevel1 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen2
+ syn region falconParen2 contained matchgroup=hlLevel2 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen3
+ syn region falconParen3 contained matchgroup=hlLevel3 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen4
+ syn region falconParen4 contained matchgroup=hlLevel4 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen5
+ syn region falconParen5 contained matchgroup=hlLevel5 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen6
+ syn region falconParen6 contained matchgroup=hlLevel6 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen7
+ syn region falconParen7 contained matchgroup=hlLevel7 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen8
+ syn region falconParen8 contained matchgroup=hlLevel8 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen9
+ syn region falconParen9 contained matchgroup=hlLevel9 start="`\=(" end=")" skip="|.\{-}|" contains=@falconListCluster,falconParen0
+endif
+
+" Setup the colors for the rainbox
+if exists("g:falcon_rainbow") && g:falcon_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
+ 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
+ endif
+endif
+
+" Syntax Synchronizing
+syn sync minlines=10 maxlines=100
+
+" Define the default highlighting
+if !exists("did_falcon_syn_inits")
+
+ 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"
+
+" vim: set sw=4 sts=4 et tw=80 :
+
diff --git a/runtime/syntax/fan.vim b/runtime/syntax/fan.vim
new file mode 100644
index 0000000..fc193af
--- /dev/null
+++ b/runtime/syntax/fan.vim
@@ -0,0 +1,132 @@
+" Vim syntax file
+" Language: Fantom
+" Maintainer: Kamil Toman <kamil.toman@gmail.com>
+" Last Change: 2010 May 27
+" Based on Java syntax file by Claudio Fleiner <claudio@fleiner.com>
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" keyword definitions
+syn keyword fanExternal using native
+syn keyword fanError goto void serializable volatile
+syn keyword fanConditional if else switch
+syn keyword fanRepeat do while for foreach each
+syn keyword fanBoolean true false
+syn keyword fanConstant null
+syn keyword fanTypedef this super
+syn keyword fanOperator new is isnot as
+syn keyword fanLongOperator plus minus mult div mod get set slice lshift rshift and or xor inverse negate increment decrement equals compare
+syn keyword fanType Void Bool Int Float Decimal Str Duration Uri Type Range List Map Obj
+syn keyword fanStatement return
+syn keyword fanStorageClass static const final
+syn keyword fanSlot virtual override once
+syn keyword fanField readonly
+syn keyword fanExceptions throw try catch finally
+syn keyword fanAssert assert
+syn keyword fanTypedef class enum mixin
+syn match fanFacet "@[_a-zA-Z][_a-zA-Z0-9_]*\>"
+syn keyword fanBranch break continue
+syn keyword fanScopeDecl public internal protected private abstract
+
+if exists("fan_space_errors")
+ if !exists("fan_no_trail_space_error")
+ syn match fanSpaceError "\s\+$"
+ endif
+ if !exists("fan_no_tab_space_error")
+ syn match fanSpaceError " \+\t"me=e-1
+ endif
+endif
+
+syn region fanLabelRegion transparent matchgroup=fanLabel start="\<case\>" matchgroup=NONE end=":" contains=fanNumber,fanCharacter
+syn keyword fanLabel default
+syn keyword fanLabel case
+
+" The following cluster contains all fan groups except the contained ones
+syn cluster fanTop add=fanExternal,fanError,fanConditional,fanRepeat,fanBoolean,fanConstant,fanTypedef,fanOperator,fanLongOperator,fanType,fanType,fanStatement,fanStorageClass,fanSlot,fanField,fanExceptions,fanAssert,fanClassDecl,fanTypedef,fanFacet,fanBranch,fanScopeDecl,fanLabelRegion,fanLabel
+
+" Comments
+syn keyword fanTodo contained TODO FIXME XXX
+syn region fanComment start="/\*" end="\*/" contains=@fanCommentSpecial,fanTodo,fanComment,@Spell
+syn match fanCommentStar contained "^\s*\*[^/]"me=e-1
+syn match fanCommentStar contained "^\s*\*$"
+syn match fanLineComment "//.*" contains=@fanCommentSpecial2,fanTodo,@Spell
+syn match fanDocComment "\*\*.*" contains=@fanCommentSpecial2,fanTodo,@Spell
+hi def link fanCommentString fanString
+hi def link fanComment2String fanString
+hi def link fanCommentCharacter fanCharacter
+
+syn cluster fanTop add=fanComment,fanLineComment,fanDocComment
+
+" match the special comment /**/
+syn match fanComment "/\*\*/"
+
+" Strings and constants
+syn match fanSpecialError contained "\\."
+syn match fanSpecialCharError contained "[^']"
+syn match fanSpecialChar contained "\\\([4-9]\d\|[0-3]\d\d\|[\"\\'ntbrf]\|u\x\{4\}\|\$\)"
+syn match fanStringSubst contained "\$[A-Za-z][A-Za-z_.]*"
+syn match fanStringSubst contained "\${[^}]*}"
+syn region fanString start=+"+ end=+"+ contains=fanSpecialChar,fanSpecialError,fanStringSubst,@Spell
+syn region fanTripleString start=+"""+ end=+"""+ contains=fanSpecialChar,fanSpecialError,fanStringSubst,@Spell
+syn region fanDSL start=+<|+ end=+|>+
+syn match fanUri "`[^`]*`"
+syn match fanCharacter "'[^']*'" contains=fanSpecialChar,fanSpecialCharError
+syn match fanCharacter "'\\''" contains=fanSpecialChar
+syn match fanCharacter "'[^\\]'"
+syn match fanNumber "\<\(0[0-7]*\|0[xX]\x\+\|\d\+\)[lL]\=\>"
+syn match fanNumber "\(\<\d\+\.\d*\|\.\d\+\)\([eE][-+]\=\d\+\)\=[fFdD]\="
+syn match fanNumber "\<\d\+[eE][-+]\=\d\+[fFdD]\=\>"
+syn match fanNumber "\<\d\+\([eE][-+]\=\d\+\)\=[fFdD]\>"
+
+syn cluster fanTop add=fanString,fanCharacter,fanNumber,fanSpecial,fanStringError
+
+" The default highlighting.
+hi def link fanBranch Conditional
+hi def link fanLabel Label
+hi def link fanUserLabel Label
+hi def link fanConditional Conditional
+hi def link fanRepeat Repeat
+hi def link fanExceptions Exception
+hi def link fanAssert Statement
+hi def link fanStorageClass StorageClass
+hi def link fanSlot StorageClass
+hi def link fanField StorageClass
+hi def link fanScopeDecl StorageClass
+hi def link fanBoolean Boolean
+hi def link fanSpecial Special
+hi def link fanSpecialError Error
+hi def link fanSpecialCharError Error
+hi def link fanTripleString String
+hi def link fanString String
+hi def link fanDSL String
+hi def link fanCharacter String
+hi def link fanStringSubst Identifier
+hi def link fanUri SpecialChar
+hi def link fanSpecialChar SpecialChar
+hi def link fanNumber Number
+hi def link fanError Error
+hi def link fanStringError Error
+hi def link fanStatement Statement
+hi def link fanOperator Operator
+hi def link fanLongOperator Operator
+hi def link fanComment Comment
+hi def link fanDocComment Comment
+hi def link fanLineComment Comment
+hi def link fanConstant Constant
+hi def link fanTypedef Typedef
+hi def link fanTodo Todo
+hi def link fanFacet PreProc
+
+hi def link fanCommentTitle SpecialComment
+hi def link fanCommentStar SpecialComment
+hi def link fanType Identifier
+hi def link fanExternal Include
+
+hi def link fanSpaceError Error
+
+let b:current_syntax = "fan"
+
+" vim: ts=8
diff --git a/runtime/syntax/fasm.vim b/runtime/syntax/fasm.vim
new file mode 100644
index 0000000..172ba7c
--- /dev/null
+++ b/runtime/syntax/fasm.vim
@@ -0,0 +1,151 @@
+" Vim syntax file
+" Language: Flat Assembler (FASM)
+" Maintainer: Ron Aaron <ron@ronware.org>
+" Last Change: 2012/02/13
+" Vim URL: http://www.vim.org/lang.html
+" FASM Home: http://flatassembler.net/
+" FASM Version: 1.56
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword=a-z,A-Z,48-57,.,_
+setlocal isident=a-z,A-Z,48-57,.,_
+syn case ignore
+
+syn keyword fasmRegister ah al ax bh bl bp bx ch cl cr0 cr1 cr2 cr3 cr4 cr5 cr6
+syn keyword fasmRegister cr7 cs cx dh di dl dr0 dr1 dr2 dr3 dr4 dr5 dr6 dr7 ds dx
+syn keyword fasmRegister eax ebp ebx ecx edi edx es esi esp fs gs mm0 mm1 mm2 mm3
+syn keyword fasmRegister mm4 mm5 mm6 mm7 si sp ss st st0 st1 st2 st3 st4 st5 st6
+syn keyword fasmRegister st7 tr0 tr1 tr2 tr3 tr4 tr5 tr6 tr7 xmm0 xmm1 xmm2 xmm3
+syn keyword fasmRegister xmm4 xmm5 xmm6 xmm7
+syn keyword fasmAddressSizes byte dqword dword fword pword qword tword word
+syn keyword fasmDataDirectives db dd df dp dq dt du dw file rb rd rf rp rq rt rw
+syn keyword fasmInstr aaa aad aam aas adc add addpd addps addsd addss addsubpd
+syn keyword fasmInstr addsubps and andnpd andnps andpd andps arpl bound bsf bsr
+syn keyword fasmInstr bswap bt btc btr bts call cbw cdq clc cld clflush cli clts
+syn keyword fasmInstr cmc cmova cmovae cmovb cmovbe cmovc cmove cmovg cmovge cmovl
+syn keyword fasmInstr cmovle cmovna cmovnae cmovnb cmovnbe cmovnc cmovne cmovng
+syn keyword fasmInstr cmovnge cmovnl cmovnle cmovno cmovnp cmovns cmovnz cmovo cmovp
+syn keyword fasmInstr cmovpe cmovpo cmovs cmovz cmp cmpeqpd cmpeqps cmpeqsd cmpeqss
+syn keyword fasmInstr cmplepd cmpleps cmplesd cmpless cmpltpd cmpltps cmpltsd cmpltss
+syn keyword fasmInstr cmpneqpd cmpneqps cmpneqsd cmpneqss cmpnlepd cmpnleps cmpnlesd
+syn keyword fasmInstr cmpnless cmpnltpd cmpnltps cmpnltsd cmpnltss cmpordpd cmpordps
+syn keyword fasmInstr cmpordsd cmpordss cmppd cmpps cmps cmpsb cmpsd cmpss cmpsw
+syn keyword fasmInstr cmpunordpd cmpunordps cmpunordsd cmpunordss cmpxchg cmpxchg8b
+syn keyword fasmInstr comisd comiss cpuid cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps
+syn keyword fasmInstr cvtpi2pd cvtpi2ps cvtps2dq cvtps2pd cvtps2pi cvtsd2si cvtsd2ss
+syn keyword fasmInstr cvtsi2sd cvtsi2ss cvtss2sd cvtss2si cvttpd2dq cvttpd2pi cvttps2dq
+syn keyword fasmInstr cvttps2pi cvttsd2si cvttss2si cwd cwde daa das data dec div
+syn keyword fasmInstr divpd divps divsd divss else emms end enter extrn f2xm1 fabs
+syn keyword fasmInstr fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb
+syn keyword fasmInstr fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp
+syn keyword fasmInstr fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree
+syn keyword fasmInstr ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp
+syn keyword fasmInstr finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv
+syn keyword fasmInstr fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi
+syn keyword fasmInstr fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem
+syn keyword fasmInstr fprem1 fptan frndint frstor frstpm fsave fscale fsetpm fsin
+syn keyword fasmInstr fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr
+syn keyword fasmInstr fsubrp ftst fucom fucomi fucomip fucomp fucompp fwait fxam
+syn keyword fasmInstr fxch fxrstor fxsave fxtract fyl2x fyl2xp1 haddpd haddps heap
+syn keyword fasmInstr hlt hsubpd hsubps idiv if imul in inc ins insb insd insw int
+syn keyword fasmInstr int3 into invd invlpg iret iretd iretw ja jae jb jbe jc jcxz
+syn keyword fasmInstr je jecxz jg jge jl jle jmp jna jnae jnb jnbe jnc jne jng jnge
+syn keyword fasmInstr jnl jnle jno jnp jns jnz jo jp jpe jpo js jz lahf lar lddqu
+syn keyword fasmInstr ldmxcsr lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw
+syn keyword fasmInstr load loadall286 loadall386 lock lods lodsb lodsd lodsw loop
+syn keyword fasmInstr loopd loope looped loopew loopne loopned loopnew loopnz loopnzd
+syn keyword fasmInstr loopnzw loopw loopz loopzd loopzw lsl lss ltr maskmovdqu maskmovq
+syn keyword fasmInstr maxpd maxps maxsd maxss mfence minpd minps minsd minss monitor
+syn keyword fasmInstr mov movapd movaps movd movddup movdq2q movdqa movdqu movhlps
+syn keyword fasmInstr movhpd movhps movlhps movlpd movlps movmskpd movmskps movntdq
+syn keyword fasmInstr movnti movntpd movntps movntq movq movq2dq movs movsb movsd
+syn keyword fasmInstr movshdup movsldup movss movsw movsx movupd movups movzx mul
+syn keyword fasmInstr mulpd mulps mulsd mulss mwait neg nop not or org orpd orps
+syn keyword fasmInstr out outs outsb outsd outsw packssdw packsswb packuswb paddb
+syn keyword fasmInstr paddd paddq paddsb paddsw paddusb paddusw paddw pand pandn
+syn keyword fasmInstr pause pavgb pavgusb pavgw pcmpeqb pcmpeqd pcmpeqw pcmpgtb
+syn keyword fasmInstr pcmpgtd pcmpgtw pextrw pf2id pf2iw pfacc pfadd pfcmpeq pfcmpge
+syn keyword fasmInstr pfcmpgt pfmax pfmin pfmul pfnacc pfpnacc pfrcp pfrcpit1 pfrcpit2
+syn keyword fasmInstr pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pi2fw pinsrw pmaddwd pmaxsw
+syn keyword fasmInstr pmaxub pminsw pminub pmovmskb pmulhrw pmulhuw pmulhw pmullw
+syn keyword fasmInstr pmuludq pop popa popad popaw popd popf popfd popfw popw por
+syn keyword fasmInstr prefetch prefetchnta prefetcht0 prefetcht1 prefetcht2 prefetchw
+syn keyword fasmInstr psadbw pshufd pshufhw pshuflw pshufw pslld pslldq psllq psllw
+syn keyword fasmInstr psrad psraw psrld psrldq psrlq psrlw psubb psubd psubq psubsb
+syn keyword fasmInstr psubsw psubusb psubusw psubw pswapd punpckhbw punpckhdq punpckhqdq
+syn keyword fasmInstr punpckhwd punpcklbw punpckldq punpcklqdq punpcklwd push pusha
+syn keyword fasmInstr pushad pushaw pushd pushf pushfd pushfw pushw pxor rcl rcpps
+syn keyword fasmInstr rcpss rcr rdmsr rdpmc rdtsc rep repe repne repnz repz ret
+syn keyword fasmInstr retd retf retfd retfw retn retnd retnw retw rol ror rsm rsqrtps
+syn keyword fasmInstr rsqrtss sahf sal salc sar sbb scas scasb scasd scasw seta
+syn keyword fasmInstr setae setalc setb setbe setc sete setg setge setl setle setna
+syn keyword fasmInstr setnae setnb setnbe setnc setne setng setnge setnl setnle
+syn keyword fasmInstr setno setnp setns setnz seto setp setpe setpo sets setz sfence
+syn keyword fasmInstr sgdt shl shld shr shrd shufpd shufps sidt sldt smsw sqrtpd
+syn keyword fasmInstr sqrtps sqrtsd sqrtss stc std sti stmxcsr store stos stosb
+syn keyword fasmInstr stosd stosw str sub subpd subps subsd subss sysenter sysexit
+syn keyword fasmInstr test ucomisd ucomiss ud2 unpckhpd unpckhps unpcklpd unpcklps
+syn keyword fasmInstr verr verw wait wbinvd wrmsr xadd xchg xlat xlatb xor xorpd
+syn keyword fasmPreprocess common equ fix forward include local macro purge restore
+syn keyword fasmPreprocess reverse struc
+syn keyword fasmDirective align binary code coff console discardable display dll
+syn keyword fasmDirective elf entry executable export extern far fixups format gui
+syn keyword fasmDirective import label ms mz native near notpageable pe public readable
+syn keyword fasmDirective repeat resource section segment shareable stack times
+syn keyword fasmDirective use16 use32 virtual wdm writable writeable
+syn keyword fasmOperator as at defined eq eqtype from mod on ptr rva used
+
+syn match fasmNumericOperator "[+-/*]"
+syn match fasmLogicalOperator "[=|&~<>]\|<=\|>=\|<>"
+" numbers
+syn match fasmBinaryNumber "\<[01]\+b\>"
+syn match fasmHexNumber "\<\d\x*h\>"
+syn match fasmHexNumber "\<\(0x\|$\)\x*\>"
+syn match fasmFPUNumber "\<\d\+\(\.\d*\)\=\(e[-+]\=\d*\)\=\>"
+syn match fasmOctalNumber "\<\(0\o\+o\=\|\o\+o\)\>"
+syn match fasmDecimalNumber "\<\(0\|[1-9]\d*\)\>"
+syn region fasmComment start=";" end="$"
+syn region fasmString start="\"" end="\"\|$"
+syn region fasmString start="'" end="'\|$"
+syn match fasmSymbol "[()|\[\]:]"
+syn match fasmSpecial "[#?%$,]"
+syn match fasmLabel "^\s*[^; \t]\+:"
+
+hi def link fasmAddressSizes type
+hi def link fasmNumericOperator fasmOperator
+hi def link fasmLogicalOperator fasmOperator
+
+hi def link fasmBinaryNumber fasmNumber
+hi def link fasmHexNumber fasmNumber
+hi def link fasmFPUNumber fasmNumber
+hi def link fasmOctalNumber fasmNumber
+hi def link fasmDecimalNumber fasmNumber
+
+hi def link fasmSymbols fasmRegister
+hi def link fasmPreprocess fasmDirective
+
+" link to standard syn groups so the 'colorschemes' work:
+hi def link fasmOperator operator
+hi def link fasmComment comment
+hi def link fasmDirective preproc
+hi def link fasmRegister type
+hi def link fasmNumber constant
+hi def link fasmSymbol structure
+hi def link fasmString String
+hi def link fasmSpecial special
+hi def link fasmInstr keyword
+hi def link fasmLabel label
+hi def link fasmPrefix preproc
+let b:current_syntax = "fasm"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 sw=8 :
diff --git a/runtime/syntax/fdcc.vim b/runtime/syntax/fdcc.vim
new file mode 100644
index 0000000..f7b296b
--- /dev/null
+++ b/runtime/syntax/fdcc.vim
@@ -0,0 +1,101 @@
+" Vim syntax file
+" Language: fdcc or locale files
+" Maintainer: Dwayne Bailey <dwayne@translate.org.za>
+" Last Change: 2004 May 16
+" Remarks: FDCC (Formal Definitions of Cultural Conventions) see ISO TR 14652
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn sync minlines=150
+setlocal iskeyword+=-
+
+" Numbers
+syn match fdccNumber /[0-9]*/ contained
+
+" Unicode codings and strings
+syn match fdccUnicodeInValid /<[^<]*>/ contained
+syn match fdccUnicodeValid /<U[0-9A-F][0-9A-F][0-9A-F][0-9A-F]>/ contained
+syn region fdccString start=/"/ end=/"/ contains=fdccUnicodeInValid,fdccUnicodeValid
+
+" Valid LC_ Keywords
+syn keyword fdccKeyword escape_char comment_char
+syn keyword fdccKeywordIdentification title source address contact email tel fax language territory revision date category
+syn keyword fdccKeywordCtype copy space translit_start include translit_end outdigit class
+syn keyword fdccKeywordCollate copy script order_start order_end collating-symbol reorder-after reorder-end collating-element symbol-equivalence
+syn keyword fdccKeywordMonetary copy int_curr_symbol currency_symbol mon_decimal_point mon_thousands_sep mon_grouping positive_sign negative_sign int_frac_digits frac_digits p_cs_precedes p_sep_by_space n_cs_precedes n_sep_by_space p_sign_posn n_sign_posn int_p_cs_precedes int_p_sep_by_space int_n_cs_precedes int_n_sep_by_space int_p_sign_posn int_n_sign_posn
+syn keyword fdccKeywordNumeric copy decimal_point thousands_sep grouping
+syn keyword fdccKeywordTime copy abday day abmon mon d_t_fmt d_fmt t_fmt am_pm t_fmt_ampm date_fmt era_d_fmt first_weekday first_workday week cal_direction time_zone era alt_digits era_d_t_fmt
+syn keyword fdccKeywordMessages copy yesexpr noexpr yesstr nostr
+syn keyword fdccKeywordPaper copy height width
+syn keyword fdccKeywordTelephone copy tel_int_fmt int_prefix tel_dom_fmt int_select
+syn keyword fdccKeywordMeasurement copy measurement
+syn keyword fdccKeywordName copy name_fmt name_gen name_mr name_mrs name_miss name_ms
+syn keyword fdccKeywordAddress copy postal_fmt country_name country_post country_ab2 country_ab3 country_num country_car country_isbn lang_name lang_ab lang_term lang_lib
+
+" Comments
+syn keyword fdccTodo TODO FIXME contained
+syn match fdccVariable /%[a-zA-Z]/ contained
+syn match fdccComment /[#%].*/ contains=fdccTodo,fdccVariable
+
+" LC_ Groups
+syn region fdccBlank matchgroup=fdccLCIdentification start=/^LC_IDENTIFICATION$/ end=/^END LC_IDENTIFICATION$/ contains=fdccKeywordIdentification,fdccString,fdccComment
+syn region fdccBlank matchgroup=fdccLCCtype start=/^LC_CTYPE$/ end=/^END LC_CTYPE$/ contains=fdccKeywordCtype,fdccString,fdccComment,fdccUnicodeInValid,fdccUnicodeValid
+syn region fdccBlank matchgroup=fdccLCCollate start=/^LC_COLLATE$/ end=/^END LC_COLLATE$/ contains=fdccKeywordCollate,fdccString,fdccComment,fdccUnicodeInValid,fdccUnicodeValid
+syn region fdccBlank matchgroup=fdccLCMonetary start=/^LC_MONETARY$/ end=/^END LC_MONETARY$/ contains=fdccKeywordMonetary,fdccString,fdccComment,fdccNumber
+syn region fdccBlank matchgroup=fdccLCNumeric start=/^LC_NUMERIC$/ end=/^END LC_NUMERIC$/ contains=fdccKeywordNumeric,fdccString,fdccComment,fdccNumber
+syn region fdccBlank matchgroup=fdccLCTime start=/^LC_TIME$/ end=/^END LC_TIME$/ contains=fdccKeywordTime,fdccString,fdccComment,fdccNumber
+syn region fdccBlank matchgroup=fdccLCMessages start=/^LC_MESSAGES$/ end=/^END LC_MESSAGES$/ contains=fdccKeywordMessages,fdccString,fdccComment
+syn region fdccBlank matchgroup=fdccLCPaper start=/^LC_PAPER$/ end=/^END LC_PAPER$/ contains=fdccKeywordPaper,fdccString,fdccComment,fdccNumber
+syn region fdccBlank matchgroup=fdccLCTelephone start=/^LC_TELEPHONE$/ end=/^END LC_TELEPHONE$/ contains=fdccKeywordTelephone,fdccString,fdccComment
+syn region fdccBlank matchgroup=fdccLCMeasurement start=/^LC_MEASUREMENT$/ end=/^END LC_MEASUREMENT$/ contains=fdccKeywordMeasurement,fdccString,fdccComment,fdccNumber
+syn region fdccBlank matchgroup=fdccLCName start=/^LC_NAME$/ end=/^END LC_NAME$/ contains=fdccKeywordName,fdccString,fdccComment
+syn region fdccBlank matchgroup=fdccLCAddress start=/^LC_ADDRESS$/ end=/^END LC_ADDRESS$/ contains=fdccKeywordAddress,fdccString,fdccComment,fdccNumber
+
+
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/fetchmail.vim b/runtime/syntax/fetchmail.vim
new file mode 100644
index 0000000..50d6b82
--- /dev/null
+++ b/runtime/syntax/fetchmail.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: fetchmail(1) RC File
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2022 Jul 02
+
+" Version 6.4.3
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword fetchmailTodo contained FIXME TODO XXX NOTE
+
+syn region fetchmailComment start='#' end='$' contains=fetchmailTodo,@Spell
+
+syn match fetchmailNumber display '\<\d\+\>'
+
+syn region fetchmailString start=+"+ skip=+\\\\\|\\"+ end=+"+
+ \ contains=fetchmailStringEsc
+syn region fetchmailString start=+'+ skip=+\\\\\|\\'+ end=+'+
+ \ contains=fetchmailStringEsc
+
+syn match fetchmailStringEsc contained '\\\([ntb]\|0\d*\|x\x\+\)'
+
+syn region fetchmailKeyword transparent matchgroup=fetchmailKeyword
+ \ start='\<poll\|skip\|defaults\>'
+ \ end='\<poll\|skip\|defaults\>'
+ \ contains=ALLBUT,fetchmailOptions,fetchmailSet
+
+syn keyword fetchmailServerOpts contained via proto[col] local[domains] port
+ \ service auth[enticate] timeout envelope
+ \ qvirtual aka interface monitor plugin plugout
+ \ dns checkalias uidl interval tracepolls
+ \ principal esmtpname esmtppassword
+" removed in 6.3.0
+syn keyword fetchmailServerOpts contained netsec
+syn match fetchmailServerOpts contained '\<bad-header\>'
+syn match fetchmailServerOpts contained '\<no\_s\+\(envelope\|dns\|checkalias\|uidl\)'
+
+syn keyword fetchmailUserOpts contained user[name] is to pass[word] ssl
+ \ sslcert sslcertck sslcertfile sslcertpath
+ \ sslfingerprint sslkey sslproto folder
+ \ smtphost fetchdomains smtpaddress smtpname
+ \ antispam mda bsmtp preconnect postconnect
+ \ keep flush limitflush fetchall rewrite
+ \ stripcr forcecr pass8bits dropstatus
+ \ dropdelivered mimedecode idle limit warnings
+ \ batchlimit fetchlimit fetchsizelimit
+ \ fastuidl expunge properties
+ \ sslcommonname
+syn match fetchmailUserOpts contained '\<no\_s\+\(sslcertck\|keep\|flush\|fetchall\|rewrite\|stripcr\|forcecr\|pass8bits\|dropstatus\|dropdelivered\|mimedecode\|idle\)'
+
+syn keyword fetchmailSpecial contained here there
+
+syn keyword fetchmailNoise and with has wants options
+syn match fetchmailNoise display '[:;,]'
+
+syn keyword fetchmailSet nextgroup=fetchmailOptions skipwhite skipnl set
+
+syn keyword fetchmailOptions daemon postmaster bouncemail spambounce
+ \ softbounce logfile pidfile idfile syslog properties
+syn match fetchmailOptions '\<no\_s\+\(bouncemail\|spambounce\|softbounce\|syslog\)'
+
+hi def link fetchmailComment Comment
+hi def link fetchmailTodo Todo
+hi def link fetchmailNumber Number
+hi def link fetchmailString String
+hi def link fetchmailStringEsc SpecialChar
+hi def link fetchmailKeyword Keyword
+hi def link fetchmailServerOpts Identifier
+hi def link fetchmailUserOpts Identifier
+hi def link fetchmailSpecial Special
+hi def link fetchmailSet Keyword
+hi def link fetchmailOptions Identifier
+
+let b:current_syntax = "fetchmail"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/fgl.vim b/runtime/syntax/fgl.vim
new file mode 100644
index 0000000..1b75d13
--- /dev/null
+++ b/runtime/syntax/fgl.vim
@@ -0,0 +1,134 @@
+" Vim syntax file
+" Language: Informix 4GL
+" Maintainer: Rafal M. Sulejman <rms@poczta.onet.pl>
+" Update: 26 Sep 2002
+" Changes:
+" - Dynamic 4GL/FourJs/4GL 7.30 pseudo comment directives (Julian Bridle)
+" - Conditionally allow case insensitive keywords (Julian Bridle)
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if exists("fgl_ignore_case")
+ syntax case ignore
+else
+ syntax case match
+endif
+syn keyword fglKeyword ABORT ABS ABSOLUTE ACCEPT ACCESS ACOS ADD AFTER ALL
+syn keyword fglKeyword ALLOCATE ALTER AND ANSI ANY APPEND ARG_VAL ARRAY ARR_COUNT
+syn keyword fglKeyword ARR_CURR AS ASC ASCENDING ASCII ASIN AT ATAN ATAN2 ATTACH
+syn keyword fglKeyword ATTRIBUTE ATTRIBUTES AUDIT AUTHORIZATION AUTO AUTONEXT AVERAGE AVG
+syn keyword fglKeyword BEFORE BEGIN BETWEEN BLACK BLINK BLUE BOLD BORDER BOTH BOTTOM
+syn keyword fglKeyword BREAK BUFFERED BY BYTE
+syn keyword fglKeyword CALL CASCADE CASE CHAR CHARACTER CHARACTER_LENGTH CHAR_LENGTH
+syn keyword fglKeyword CHECK CLASS_ORIGIN CLEAR CLIPPED CLOSE CLUSTER COLOR
+syn keyword fglKeyword COLUMN COLUMNS COMMAND COMMENT COMMENTS COMMIT COMMITTED
+syn keyword fglKeyword COMPOSITES COMPRESS CONCURRENT CONNECT CONNECTION
+syn keyword fglKeyword CONNECTION_ALIAS CONSTRAINED CONSTRAINT CONSTRAINTS CONSTRUCT
+syn keyword fglKeyword CONTINUE CONTROL COS COUNT CREATE CURRENT CURSOR CYAN
+syn keyword fglKeyword DATA DATABASE DATASKIP DATE DATETIME DAY DBA DBINFO DBSERVERNAME
+syn keyword fglKeyword DEALLOCATE DEBUG DEC DECIMAL DECLARE DEFAULT DEFAULTS DEFER
+syn keyword fglKeyword DEFERRED DEFINE DELETE DELIMITER DELIMITERS DESC DESCENDING
+syn keyword fglKeyword DESCRIBE DESCRIPTOR DETACH DIAGNOSTICS DIM DIRTY DISABLED
+syn keyword fglKeyword DISCONNECT DISPLAY DISTINCT DISTRIBUTIONS DO DORMANT DOUBLE
+syn keyword fglKeyword DOWN DOWNSHIFT DROP
+syn keyword fglKeyword EACH ELIF ELSE ENABLED END ENTRY ERROR ERRORLOG ERR_GET
+syn keyword fglKeyword ERR_PRINT ERR_QUIT ESC ESCAPE EVERY EXCEPTION EXCLUSIVE
+syn keyword fglKeyword EXEC EXECUTE EXISTS EXIT EXP EXPLAIN EXPRESSION EXTEND EXTENT
+syn keyword fglKeyword EXTERN EXTERNAL
+syn keyword fglKeyword F1 F10 F11 F12 F13 F14 F15 F16 F17 F18 F19 F2 F20 F21 F22 F23
+syn keyword fglKeyword F24 F25 F26 F27 F28 F29 F3 F30 F31 F32 F33 F34 F35 F36 F37 F38
+syn keyword fglKeyword F39 F4 F40 F41 F42 F43 F44 F45 F46 F47 F48 F49 F5 F50 F51 F52
+syn keyword fglKeyword F53 F54 F55 F56 F57 F58 F59 F6 F60 F61 F62 F63 F64 F7 F8 F9
+syn keyword fglKeyword FALSE FETCH FGL_GETENV FGL_KEYVAL FGL_LASTKEY FIELD FIELD_TOUCHED
+syn keyword fglKeyword FILE FILLFACTOR FILTERING FINISH FIRST FLOAT FLUSH FOR
+syn keyword fglKeyword FOREACH FOREIGN FORM FORMAT FORMONLY FORTRAN FOUND FRACTION
+syn keyword fglKeyword FRAGMENT FREE FROM FUNCTION GET_FLDBUF GLOBAL GLOBALS GO GOTO
+syn keyword fglKeyword GRANT GREEN GROUP HAVING HEADER HELP HEX HIDE HIGH HOLD HOUR
+syn keyword fglKeyword IDATA IF ILENGTH IMMEDIATE IN INCLUDE INDEX INDEXES INDICATOR
+syn keyword fglKeyword INFIELD INIT INITIALIZE INPUT INSERT INSTRUCTIONS INT INTEGER
+syn keyword fglKeyword INTERRUPT INTERVAL INTO INT_FLAG INVISIBLE IS ISAM ISOLATION
+syn keyword fglKeyword ITYPE
+syn keyword fglKeyword KEY LABEL
+syn keyword fglKeyword LANGUAGE LAST LEADING LEFT LENGTH LET LIKE LINE
+syn keyword fglKeyword LINENO LINES LOAD LOCATE LOCK LOG LOG10 LOGN LONG LOW
+syn keyword fglKeyword MAGENTA MAIN MARGIN MATCHES MAX MDY MEDIUM MEMORY MENU MESSAGE
+syn keyword fglKeyword MESSAGE_LENGTH MESSAGE_TEXT MIN MINUTE MOD MODE MODIFY MODULE
+syn keyword fglKeyword MONEY MONTH MORE
+syn keyword fglKeyword NAME NCHAR NEED NEW NEXT NEXTPAGE NO NOCR NOENTRY NONE NORMAL
+syn keyword fglKeyword NOT NOTFOUND NULL NULLABLE NUMBER NUMERIC NUM_ARGS NVARCHAR
+syn keyword fglKeyword OCTET_LENGTH OF OFF OLD ON ONLY OPEN OPTIMIZATION OPTION OPTIONS
+syn keyword fglKeyword OR ORDER OTHERWISE OUTER OUTPUT
+syn keyword fglKeyword PAGE PAGENO PAUSE PDQPRIORITY PERCENT PICTURE PIPE POW PRECISION
+syn keyword fglKeyword PREPARE PREVIOUS PREVPAGE PRIMARY PRINT PRINTER PRIOR PRIVATE
+syn keyword fglKeyword PRIVILEGES PROCEDURE PROGRAM PROMPT PUBLIC PUT
+syn keyword fglKeyword QUIT QUIT_FLAG
+syn keyword fglKeyword RAISE RANGE READ READONLY REAL RECORD RECOVER RED REFERENCES
+syn keyword fglKeyword REFERENCING REGISTER RELATIVE REMAINDER REMOVE RENAME REOPTIMIZATION
+syn keyword fglKeyword REPEATABLE REPORT REQUIRED RESOLUTION RESOURCE RESTRICT
+syn keyword fglKeyword RESUME RETURN RETURNED_SQLSTATE RETURNING REVERSE REVOKE RIGHT
+syn keyword fglKeyword ROBIN ROLE ROLLBACK ROLLFORWARD ROOT ROUND ROW ROWID ROWIDS
+syn keyword fglKeyword ROWS ROW_COUNT RUN
+syn keyword fglKeyword SCALE SCHEMA SCREEN SCROLL SCR_LINE SECOND SECTION SELECT
+syn keyword fglKeyword SERIAL SERIALIZABLE SERVER_NAME SESSION SET SET_COUNT SHARE
+syn keyword fglKeyword SHORT SHOW SITENAME SIZE SIZEOF SKIP SLEEP SMALLFLOAT SMALLINT
+syn keyword fglKeyword SOME SPACE SPACES SQL SQLAWARN SQLCA SQLCODE SQLERRD SQLERRM
+syn keyword fglKeyword SQLERROR SQLERRP SQLSTATE SQLWARNING SQRT STABILITY START
+syn keyword fglKeyword STARTLOG STATIC STATISTICS STATUS STDEV STEP STOP STRING STRUCT
+syn keyword fglKeyword SUBCLASS_ORIGIN SUM SWITCH SYNONYM SYSTEM
+syn keyword fglKeyword SysBlobs SysChecks SysColAuth SysColDepend SysColumns
+syn keyword fglKeyword SysConstraints SysDefaults SysDepend SysDistrib SysFragAuth
+syn keyword fglKeyword SysFragments SysIndexes SysObjState SysOpClstr SysProcAuth
+syn keyword fglKeyword SysProcBody SysProcPlan SysProcedures SysReferences SysRoleAuth
+syn keyword fglKeyword SysSynTable SysSynonyms SysTabAuth SysTables SysTrigBody
+syn keyword fglKeyword SysTriggers SysUsers SysViews SysViolations
+syn keyword fglKeyword TAB TABLE TABLES TAN TEMP TEXT THEN THROUGH THRU TIME TO
+syn keyword fglKeyword TODAY TOP TOTAL TRACE TRAILER TRAILING TRANSACTION TRIGGER
+syn keyword fglKeyword TRIGGERS TRIM TRUE TRUNC TYPE TYPEDEF
+syn keyword fglKeyword UNCOMMITTED UNCONSTRAINED UNDERLINE UNION UNIQUE UNITS UNLOAD
+syn keyword fglKeyword UNLOCK UNSIGNED UP UPDATE UPSHIFT USER USING
+syn keyword fglKeyword VALIDATE VALUE VALUES VARCHAR VARIABLES VARIANCE VARYING
+syn keyword fglKeyword VERIFY VIEW VIOLATIONS
+syn keyword fglKeyword WAIT WAITING WARNING WEEKDAY WHEN WHENEVER WHERE WHILE WHITE
+syn keyword fglKeyword WINDOW WITH WITHOUT WORDWRAP WORK WRAP WRITE
+syn keyword fglKeyword YEAR YELLOW
+syn keyword fglKeyword ZEROFILL
+
+" Strings and characters:
+syn region fglString start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn region fglString start=+'+ skip=+\\\\\|\\"+ end=+'+
+
+" Numbers:
+syn match fglNumber "-\=\<[0-9]*\.\=[0-9_]\>"
+
+" Comments:
+syn region fglComment start="{" end="}"
+syn match fglComment "--.*"
+syn match fglComment "#.*"
+
+" Not a comment even though it looks like one (Dynamic 4GL/FourJs directive)
+syn match fglSpecial "--#"
+syn match fglSpecial "--@"
+
+syn sync ccomment fglComment
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "fgl"
+
+" vim: ts=8
diff --git a/runtime/syntax/fish.vim b/runtime/syntax/fish.vim
new file mode 100644
index 0000000..266878b
--- /dev/null
+++ b/runtime/syntax/fish.vim
@@ -0,0 +1,225 @@
+" Vim syntax file
+" Language: fish
+" Maintainer: Nicholas Boyle (github.com/nickeb96)
+" Repository: https://github.com/nickeb96/fish.vim
+" Last Change: February 1, 2023
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+
+" Statements
+syn cluster fishStatement contains=fishKeywordAndOr,fishNot,fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand,fishVariable
+
+syn keyword fishKeywordAndOr and or nextgroup=fishNot,fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand
+hi def link fishKeywordAndOr fishOperator
+
+syn keyword fishNot not skipwhite nextgroup=fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand
+syn match fishNot /!/ skipwhite nextgroup=fishSelectStatement,fishKeyword,fishKeywordIf,fishCommand
+hi def link fishNot fishOperator
+
+syn keyword fishSelectStatement command builtin skipwhite nextgroup=fishKeyword,fishKeywordIf,fishCommand,fishOption
+hi def link fishSelectStatement fishKeyword
+
+syn keyword fishKeyword end skipwhite nextgroup=@fishTerminator
+
+syn keyword fishKeywordIf if skipwhite nextgroup=@fishStatement
+syn keyword fishKeyword else skipwhite nextgroup=fishKeywordIf,fishSemicolon
+hi def link fishKeywordIf fishKeyword
+
+syn keyword fishKeyword switch skipwhite nextgroup=@fishArgument
+syn keyword fishKeyword case skipwhite nextgroup=@fishArgument
+
+syn keyword fishKeyword while skipwhite nextgroup=@fishStatement
+
+syn keyword fishKeyword for skipwhite nextgroup=fishForVariable
+syn match fishForVariable /[[:alnum:]_]\+/ contained skipwhite nextgroup=fishKeywordIn
+syn keyword fishKeywordIn in contained skipwhite nextgroup=@fishArgument
+hi def link fishForVariable fishParameter
+hi def link fishKeywordIn fishKeyword
+
+syn keyword fishKeyword _ abbr argparse begin bg bind block break breakpoint cd commandline
+ \ complete continue count disown echo emit eval exec exit false fg function functions
+ \ history jobs math printf pwd random read realpath return set set_color source status
+ \ string test time true type ulimit wait
+ \ skipwhite nextgroup=@fishNext
+syn match fishKeyword /\<contains\>/ skipwhite nextgroup=@fishNext
+
+syn match fishCommand /[[:alnum:]_\/[][[:alnum:]+._-]*/ skipwhite nextgroup=@fishNext
+
+
+" Internally Nested Arguments
+
+syn cluster fishSubscriptArgs contains=fishInnerVariable,fishIndexNum,fishIndexRange,fishInnerCommandSub
+
+syn match fishInnerVariable /\$\+[[:alnum:]_]\+/ contained
+syn match fishInnerVariable /\$\+[[:alnum:]_]\+\[/me=e-1,he=e-1 contained nextgroup=fishInnerSubscript
+hi def link fishInnerVariable fishVariable
+
+syn region fishInnerSubscript matchgroup=fishVariable start=/\[/ end=/]/ contained
+ \ keepend contains=@fishSubscriptArgs
+hi def link fishInnerSubscript fishSubscript
+
+syn match fishIndexNum /[+-]?[[:digit:]]\+/ contained
+hi def link fishIndexNum fishParameter
+
+syn match fishIndexRange /\.\./ contained
+hi def link fishIndexRange fishParameter
+
+syn region fishInnerCommandSub matchgroup=fishOperator start=/(/ start=/\$(/ end=/)/ contained
+ \ contains=@fishStatement
+hi def link fishInnerCommandSub fishCommandSub
+
+syn region fishQuotedCommandSub matchgroup=fishOperator start=/\$(/ end=/)/ contained
+ \ contains=@fishStatement
+hi def link fishQuotedCommandSub fishCommandSub
+
+syn match fishBraceExpansionComma /,/ contained
+hi def link fishBraceExpansionComma fishOperator
+
+syn match fishBracedParameter '[[:alnum:]\u5b\u5d@:=+.%/!_-]\+' contained contains=fishInnerPathGlob
+hi def link fishBracedParameter fishParameter
+
+syn region fishBracedQuote start=/'/ skip=/\\'/ end=/'/ contained
+ \ contains=fishEscapedEscape,fishEscapedSQuote
+syn region fishBracedQuote start=/"/ skip=/\\"/ end=/"/ contained
+ \ contains=fishEscapedEscape,fishEscapedDQuote,fishEscapedDollar,fishInnerVariable,fishInnerCommandSub
+hi def link fishBracedQuote fishQuote
+
+
+" Arguments
+
+syn cluster fishArgument contains=fishParameter,fishOption,fishVariable,fishPathGlob,fishBraceExpansion,fishQuote,fishCharacter,fishCommandSub,fishRedirection,fishSelfPid
+
+syn match fishParameter '[[:alnum:]\u5b\u5d@:=+.,%/!_-]\+' contained skipwhite nextgroup=@fishNext
+
+syn match fishOption /-[[:alnum:]=_-]*/ contained skipwhite nextgroup=@fishNext
+
+syn match fishPathGlob /\(\~\|*\|?\)/ contained skipwhite nextgroup=@fishNext
+
+syn region fishBraceExpansion matchgroup=fishOperator start=/{/ end=/}/ contained
+ \ contains=fishBraceExpansionComma,fishInnerVariable,fishInnerCommandSub,fishBracedParameter,fishBracedQuote
+ \ skipwhite nextgroup=@fishNext
+
+syn match fishVariable /\$\+[[:alnum:]_]\+/ skipwhite nextgroup=@fishNext
+syn match fishVariable /\$\+[[:alnum:]_]\+\[/me=e-1,he=e-1 nextgroup=fishSubscript
+
+syn region fishSubscript matchgroup=fishVariable start=/\[/ end=/]/ contained
+ \ keepend contains=@fishSubscriptArgs
+ \ skipwhite nextgroup=@fishNext
+
+syn region fishCommandSub matchgroup=fishOperator start=/(/ start=/\$(/ end=/)/ contained
+ \ contains=@fishStatement
+ \ skipwhite nextgroup=@fishNext
+
+syn region fishQuote start=/'/ skip=/\\'/ end=/'/ contained
+ \ contains=fishEscapedEscape,fishEscapedSQuote
+ \ skipwhite nextgroup=@fishNext
+syn region fishQuote start=/"/ skip=/\\"/ end=/"/ contained
+ \ contains=fishEscapedEscape,fishEscapedDQuote,fishEscapedDollar,fishInnerVariable,fishQuotedCommandSub
+ \ skipwhite nextgroup=@fishNext
+
+syn match fishEscapedEscape /\\\\/ contained
+syn match fishEscapedSQuote /\\'/ contained
+syn match fishEscapedDQuote /\\"/ contained
+syn match fishEscapedDollar /\\\$/ contained
+hi def link fishEscapedEscape fishCharacter
+hi def link fishEscapedSQuote fishCharacter
+hi def link fishEscapedDQuote fishCharacter
+hi def link fishEscapedDollar fishCharacter
+
+syn match fishCharacter /\\[0-7]\{1,3}/ contained skipwhite nextgroup=@fishNext
+syn match fishCharacter /\\u[0-9a-fA-F]\{4}/ contained skipwhite nextgroup=@fishNext
+syn match fishCharacter /\\U[0-9a-fA-F]\{8}/ contained skipwhite nextgroup=@fishNext
+syn match fishCharacter /\\x[0-7][0-9a-fA-F]\|\\x[0-9a-fA-F]/ contained skipwhite nextgroup=@fishNext
+syn match fishCharacter /\\X[0-9a-fA-F]\{1,2}/ contained skipwhite nextgroup=@fishNext
+syn match fishCharacter /\\[abcefnrtv[\](){}<>\\*?~%#$|&;'" ]/ contained skipwhite nextgroup=@fishNext
+
+syn match fishRedirection /</ contained skipwhite nextgroup=fishRedirectionTarget
+syn match fishRedirection /[0-9&]\?>[>?]\?/ contained skipwhite nextgroup=fishRedirectionTarget
+syn match fishRedirection /[0-9&]\?>&[0-9-]/ contained skipwhite nextgroup=@fishNext
+
+syn match fishRedirectionTarget /[[:alnum:]$~*?{,}"'\/._-]\+/ contained contains=fishInnerVariable skipwhite nextgroup=@fishNext
+hi def link fishRedirectionTarget fishRedirection
+
+syn match fishSelfPid /%self\>/ contained nextgroup=@fishNext
+hi def link fishSelfPid fishOperator
+
+
+" Terminators
+
+syn cluster fishTerminator contains=fishPipe,fishBackgroundJob,fishSemicolon,fishSymbolicAndOr
+
+syn match fishPipe /\(1>\|2>\|&\)\?|/ contained skipwhite nextgroup=@fishStatement
+hi def link fishPipe fishEnd
+
+syn match fishBackgroundJob /&$/ contained skipwhite nextgroup=@fishStatement
+syn match fishBackgroundJob /&[^<>&|]/me=s+1,he=s+1 contained skipwhite nextgroup=@fishStatement
+hi def link fishBackgroundJob fishEnd
+
+syn match fishSemicolon /;/ skipwhite nextgroup=@fishStatement
+hi def link fishSemicolon fishEnd
+
+syn match fishSymbolicAndOr /\(&&\|||\)/ contained skipwhite skipempty nextgroup=@fishStatement
+hi def link fishSymbolicAndOr fishOperator
+
+
+" Other
+
+syn cluster fishNext contains=fishEscapedNl,@fishArgument,@fishTerminator
+
+syn match fishEscapedNl /\\$/ skipnl skipwhite contained nextgroup=@fishNext
+
+syn match fishComment /#.*/ contains=fishTodo,@Spell
+
+syn keyword fishTodo TODO contained
+
+
+
+syn sync minlines=200
+syn sync maxlines=300
+
+
+" Intermediate highlight groups matching $fish_color_* variables
+
+hi def link fishCommand fish_color_command
+hi def link fishComment fish_color_comment
+hi def link fishEnd fish_color_end
+hi def link fishCharacter fish_color_escape
+hi def link fishKeyword fish_color_keyword
+hi def link fishEscapedNl fish_color_normal
+hi def link fishOperator fish_color_operator
+hi def link fishVariable fish_color_operator
+hi def link fishInnerVariable fish_color_operator
+hi def link fishPathGlob fish_color_operator
+hi def link fishOption fish_color_option
+hi def link fishParameter fish_color_param
+hi def link fishQuote fish_color_quote
+hi def link fishRedirection fish_color_redirection
+
+
+" Default highlight groups
+
+hi def link fish_color_param Normal
+hi def link fish_color_normal Normal
+hi def link fish_color_option Normal
+hi def link fish_color_command Function
+hi def link fish_color_keyword Keyword
+hi def link fish_color_end Delimiter
+hi def link fish_color_operator Operator
+hi def link fish_color_redirection Type
+hi def link fish_color_quote String
+hi def link fish_color_escape Character
+hi def link fish_color_comment Comment
+
+hi def link fishTodo Todo
+
+
+let b:current_syntax = 'fish'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/flexwiki.vim b/runtime/syntax/flexwiki.vim
new file mode 100644
index 0000000..6b15ab2
--- /dev/null
+++ b/runtime/syntax/flexwiki.vim
@@ -0,0 +1,133 @@
+" Vim syntax file
+" Language: FlexWiki, http://www.flexwiki.com/
+" Maintainer: George V. Reilly <george@reilly.org>
+" Home: http://www.georgevreilly.com/vim/flexwiki/
+" Other Home: http://www.vim.org/scripts/script.php?script_id=1529
+" Author: George V. Reilly
+" Filenames: *.wiki
+" Last Change: Wed Apr 26 11:00 PM 2006 P
+" Version: 0.3
+
+" Note: The horrible regexps were reverse-engineered from
+" FlexWikiCore\EngineSource\Formatter.cs, with help from the Regex Analyzer
+" in The Regulator, http://regulator.sourceforge.net/ .NET uses Perl-style
+" regexes, which use a different syntax than Vim (fewer \s).
+" The primary test case is FlexWiki\FormattingRules.wiki
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A WikiWord (unqualifiedWikiName)
+syntax match flexwikiWord /\%(_\?\([A-Z]\{2,}[a-z0-9]\+[A-Za-z0-9]*\)\|\([A-Z][a-z0-9]\+[A-Za-z0-9]*[A-Z]\+[A-Za-z0-9]*\)\)/
+" A [bracketed wiki word]
+syntax match flexwikiWord /\[[[:alnum:]\s]\+\]/
+
+" text: "this is a link (optional tooltip)":http://www.microsoft.com
+" TODO: check URL syntax against RFC
+syntax match flexwikiLink `\("[^"(]\+\((\([^)]\+\))\)\?":\)\?\(https\?\|ftp\|gopher\|telnet\|file\|notes\|ms-help\):\(\(\(//\)\|\(\\\\\)\)\+[A-Za-z0-9:#@%/;$~_?+-=.&\-\\\\]*\)`
+
+" text: *strong*
+syntax match flexwikiBold /\(^\|\W\)\zs\*\([^ ].\{-}\)\*/
+" '''bold'''
+syntax match flexwikiBold /'''\([^'].\{-}\)'''/
+
+" text: _emphasis_
+syntax match flexwikiItalic /\(^\|\W\)\zs_\([^ ].\{-}\)_/
+" ''italic''
+syntax match flexwikiItalic /''\([^'].\{-}\)''/
+
+" ``deemphasis``
+syntax match flexwikiDeEmphasis /``\([^`].\{-}\)``/
+
+" text: @code@
+syntax match flexwikiCode /\(^\|\s\|(\|\[\)\zs@\([^@]\+\)@/
+
+" text: -deleted text-
+syntax match flexwikiDelText /\(^\|\s\+\)\zs-\([^ <a ]\|[^ <img ]\|[^ -].*\)-/
+
+" text: +inserted text+
+syntax match flexwikiInsText /\(^\|\W\)\zs+\([^ ].\{-}\)+/
+
+" text: ^superscript^
+syntax match flexwikiSuperScript /\(^\|\W\)\zs^\([^ ].\{-}\)^/
+
+" text: ~subscript~
+syntax match flexwikiSubScript /\(^\|\W\)\zs\~\([^ ].\{-}\)\~/
+
+" text: ??citation??
+syntax match flexwikiCitation /\(^\|\W\)\zs??\([^ ].\{-}\)??/
+
+" Emoticons: must come after the Textilisms, as later rules take precedence
+" over earlier ones. This match is an approximation for the ~70 distinct
+" patterns that FlexWiki knows.
+syntax match flexwikiEmoticons /\((.)\|:[()|$@]\|:-[DOPS()\]|$@]\|;)\|:'(\)/
+
+" Aggregate all the regular text highlighting into flexwikiText
+syntax cluster flexwikiText contains=flexwikiItalic,flexwikiBold,flexwikiCode,flexwikiDeEmphasis,flexwikiDelText,flexwikiInsText,flexwikiSuperScript,flexwikiSubScript,flexwikiCitation,flexwikiLink,flexwikiWord,flexwikiEmoticons
+
+" single-line WikiPropertys
+syntax match flexwikiSingleLineProperty /^:\?[A-Z_][_a-zA-Z0-9]\+:/
+
+" TODO: multi-line WikiPropertys
+
+" Header levels, 1-6
+syntax match flexwikiH1 /^!.*$/
+syntax match flexwikiH2 /^!!.*$/
+syntax match flexwikiH3 /^!!!.*$/
+syntax match flexwikiH4 /^!!!!.*$/
+syntax match flexwikiH5 /^!!!!!.*$/
+syntax match flexwikiH6 /^!!!!!!.*$/
+
+" <hr>, horizontal rule
+syntax match flexwikiHR /^----.*$/
+
+" Formatting can be turned off by ""enclosing it in pairs of double quotes""
+syntax match flexwikiEscape /"".\{-}""/
+
+" Tables. Each line starts and ends with '||'; each cell is separated by '||'
+syntax match flexwikiTable /||/
+
+" Bulleted list items start with one or tabs, followed by whitespace, then '*'
+" Numeric list items start with one or tabs, followed by whitespace, then '1.'
+" Eight spaces at the beginning of the line is equivalent to the leading tab.
+syntax match flexwikiList /^\(\t\| \{8}\)\s*\(\*\|1\.\).*$/ contains=@flexwikiText
+
+" Treat all other lines that start with spaces as PRE-formatted text.
+syntax match flexwikiPre /^[ \t]\+[^ \t*1].*$/
+
+
+" Link FlexWiki syntax items to colors
+hi def link flexwikiH1 Title
+hi def link flexwikiH2 flexwikiH1
+hi def link flexwikiH3 flexwikiH2
+hi def link flexwikiH4 flexwikiH3
+hi def link flexwikiH5 flexwikiH4
+hi def link flexwikiH6 flexwikiH5
+hi def link flexwikiHR flexwikiH6
+
+hi def flexwikiBold term=bold cterm=bold gui=bold
+hi def flexwikiItalic term=italic cterm=italic gui=italic
+
+hi def link flexwikiCode Statement
+hi def link flexwikiWord Underlined
+
+hi def link flexwikiEscape Todo
+hi def link flexwikiPre PreProc
+hi def link flexwikiLink Underlined
+hi def link flexwikiList Type
+hi def link flexwikiTable Type
+hi def link flexwikiEmoticons Constant
+hi def link flexwikiDelText Comment
+hi def link flexwikiDeEmphasis Comment
+hi def link flexwikiInsText Constant
+hi def link flexwikiSuperScript Constant
+hi def link flexwikiSubScript Constant
+hi def link flexwikiCitation Constant
+
+hi def link flexwikiSingleLineProperty Identifier
+
+let b:current_syntax="FlexWiki"
+
+" vim:tw=0:
diff --git a/runtime/syntax/focexec.vim b/runtime/syntax/focexec.vim
new file mode 100644
index 0000000..187fd50
--- /dev/null
+++ b/runtime/syntax/focexec.vim
@@ -0,0 +1,88 @@
+" Vim syntax file
+" Language: Focus Executable
+" Maintainer: Rob Brady <robb@datatone.com>
+" Last Change: $Date: 2004/06/13 15:38:04 $
+" URL: http://www.datatone.com/~robb/vim/syntax/focexec.vim
+" $Revision: 1.1 $
+
+" this is a very simple syntax file - I will be improving it
+" one thing is how to do computes
+" I don't like that &vars and FUSE() functions highlight to the same color
+" I think some of these things should get different highlights -
+" should MODIFY commands look different than TABLE?
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" A bunch of useful keywords
+syn keyword focexecTable TABLE SUM BY ACROSS END PRINT HOLD LIST NOPRINT
+syn keyword focexecTable SUBFOOT SUBHEAD HEADING FOOTING PAGE-BREAK AS
+syn keyword focexecTable WHERE AND OR NOSPLIT FORMAT
+syn keyword focexecModify MODIFY DATA ON FIXFORM PROMPT MATCH COMPUTE
+syn keyword focexecModify GOTO CASE ENDCASE TYPE NOMATCH REJECT INCLUDE
+syn keyword focexecModify CONTINUE FROM
+syn keyword focexecNormal CHECK FILE CREATE EX SET IF FILEDEF DEFINE
+syn keyword focexecNormal REBUILD IF RECORDLIMIT FI EQ JOIN
+syn keyword focexecJoin IN TO
+syn keyword focexecFileDef DISK
+syn keyword focexecSet MSG ALL
+syn match focexecDash "-RUN"
+syn match focexecDash "-PROMPT"
+syn match focexecDash "-WINFORM"
+
+" String and Character constants
+syn region focexecString1 start=+"+ end=+"+
+syn region focexecString2 start=+'+ end=+'+
+
+"amper variables
+syn match focexecAmperVar "&&\=[A-Z_]\+"
+
+"fuse functions
+syn keyword focexecFuse GETUSER GETUSR WHOAMI FEXERR ASIS GETTOK UPCASE LOCASE
+syn keyword focexecFuse SUBSTR TODAY TODAYI POSIT HHMMSS BYTVAL EDAUT1 BITVAL
+syn keyword focexecFuse BITSON FGETENV FPUTENV HEXBYT SPAWN YM YMI JULDAT
+syn keyword focexecFuse JULDATI DOWK DOWKI DOWKLI CHGDAT CHGDATI FTOA ATODBL
+syn keyword focexecFuse SOUNDEX RJUST REVERSE PARAG OVRLAY LJUST CTRFLD CTRAN
+syn keyword focexecFuse CHKFMT ARGLEN GREGDT GREGDTI DTYMD DTYMDI DTDMY DTDMYI
+syn keyword focexecFuse DTYDM DTYDMI DTMYD DTMYDI DTDYM DTDYMI DAYMD DAYMDI
+syn keyword focexecFuse DAMDY DAMDYI DADMY DADMYI AYM AYMI AYMD AYMDI CHKPCK
+syn keyword focexecFuse IMOD FMOD DMOD PCKOUT EXP BAR SPELLNM SPELLNUM RTCIVP
+syn keyword focexecFuse PRDUNI PRDNOR RDNORM RDUNIF LCWORD ITOZ RLPHLD IBIPRO
+syn keyword focexecFuse IBIPRW IBIPRC IBIPRU IBIRCP PTHDAT ITOPACK ITONUM
+syn keyword focexecFuse DSMEXEC DSMEVAL DSMERRC MSMEXEC MSMEVAL MSMERRC EXTDXI
+syn keyword focexecFuse BAANHASH EDAYSI DTOG GTOD HSETPT HPART HTIME HNAME
+syn keyword focexecFuse HADD HDIFF HDATE HGETC HCNVRT HDTTM HMIDNT TEMPPATH
+syn keyword focexecFuse DATEADD DATEDIF DATEMOV DATECVT EURHLD EURXCH FINDFOC
+syn keyword focexecFuse FERRMES CNCTUSR CURRPATH USERPATH SYSTEM ASKYN
+syn keyword focexecFuse FUSEMENU POPEDIT POPFILE
+
+syn match focexecNumber "\<\d\+\>"
+syn match focexecNumber "\<\d\+\.\d*\>"
+
+syn match focexecComment "-\*.*"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "focexec"
+
+" vim: ts=8
diff --git a/runtime/syntax/form.vim b/runtime/syntax/form.vim
new file mode 100644
index 0000000..9718480
--- /dev/null
+++ b/runtime/syntax/form.vim
@@ -0,0 +1,145 @@
+" Vim syntax file
+" Language: FORM
+" Version: 2.0
+" Maintainer: Michael M. Tung <michael.tung@uni-mainz.de>
+" Last Change: <Thu Oct 23 13:11:21 CEST 2008>
+" Past Change: <October 2008 Thomas Reiter thomasr@nikhef.nl>
+" Past Change: <Wed, 2005/05/25 09:24:58 arwagner wptx44>
+
+" First public release based on 'Symbolic Manipulation with FORM'
+" by J.A.M. Vermaseren, CAN, Netherlands, 1991.
+" This syntax file is still in development. Please send suggestions
+" to the maintainer.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" a bunch of useful FORM keywords
+syn keyword formType global local
+syn keyword formHeaderStatement symbol symbols cfunction cfunctions
+syn keyword formHeaderStatement function functions vector vectors
+syn keyword formHeaderStatement tensor tensors ctensor ctensors
+syn keyword formHeaderStatement set sets index indices table ctable
+syn keyword formHeaderStatement dimension dimensions unittrace
+syn keyword formConditional if else elseif endif while
+syn keyword formConditional repeat endrepeat label goto
+syn keyword formConditional argument endargument exit
+syn keyword formConditional inexpression inside term
+syn keyword formConditional endinexpression endinside endterm
+syn keyword formStatement abrackets also antibrackets antisymmetrize
+syn keyword formStatement argexplode argimplode apply auto autodeclare
+syn keyword formStatement brackets chainin chainout chisholm cleartable
+syn keyword formStatement collect commuting compress contract
+syn keyword formStatement cyclesymmetrize deallocatetable delete
+syn keyword formStatement dimension discard disorder drop factarg fill
+syn keyword formStatement fillexpression fixindex format funpowers hide
+syn keyword formStatement identify idnew idold ifmatch inparallel
+syn keyword formStatement insidefirst keep load makeinteger many metric
+syn keyword formStatement moduleoption modulus multi multiply ndrop
+syn keyword formStatement nfunctions nhide normalize notinparallel
+syn keyword formStatement nprint nskip ntable ntensors nunhide nwrite
+syn keyword formStatement off on once only polyfun pophide print
+syn keyword formStatement printtable propercount pushhide ratio
+syn keyword formStatement rcyclesymmetrize redefine renumber
+syn keyword formStatement replaceinarg replaceloop save select
+syn keyword formStatement setexitflag skip slavepatchsize sort splitarg
+syn keyword formStatement splitfirstarg splitlastarg sum symmetrize
+syn keyword formStatement tablebase testuse threadbucketsize totensor
+syn keyword formStatement tovector trace4 tracen tryreplace unhide
+syn keyword formStatement unittrace vectors write
+" for compatibility with older FORM versions:
+syn keyword formStatement id bracket count match traceN
+
+" some special functions
+syn keyword formStatement abs_ bernoulli_ binom_ conjg_ count_
+syn keyword formStatement d_ dd_ delta_ deltap_ denom_ distrib_
+syn keyword formStatement dum_ dummy_ dummyten_ e_ exp_ fac_
+syn keyword formStatement factorin_ firstbracket_ g5_ g6_ g7_
+syn keyword formStatement g_ gcd_ gi_ integer_ invfac_ match_
+syn keyword formStatement max_ maxpowerof_ min_ minpowerof_
+syn keyword formStatement mod_ nargs_ nterms_ pattern_ poly_
+syn keyword formStatement polyadd_ polydiv_ polygcd_ polyintfac_
+syn keyword formStatement polymul_ polynorm_ polyrem_ polysub_
+syn keyword formStatement replace_ reverse_ root_ setfun_ sig_
+syn keyword formStatement sign_ sum_ sump_ table_ tbl_ term_
+syn keyword formStatement termsin_ termsinbracket_ theta_ thetap_
+syn keyword formStatement 5_ 6_ 7_
+
+syn keyword formReserved sqrt_ ln_ sin_ cos_ tan_ asin_ acos_
+syn keyword formReserved atan_ atan2_ sinh_ cosh_ tanh_ asinh_
+syn keyword formReserved acosh_ atanh_ li2_ lin_
+
+syn keyword formTodo contained TODO FIXME XXX
+
+syn match formSpecial display contained "\\\(n\|t\|b\|\\\|\"\)"
+syn match formSpecial display contained "%\(%\|e\|E\|s\|f\|\$\)"
+syn match formSpecial "\<N\d\+_[?]"
+
+" pattern matching for keywords
+syn match formComment "^\ *\*.*$" contains=formTodo
+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 formNumber "\<\d\+\>"
+syn match formNumber "\<\d\+\.\d*\>"
+syn match formNumber "\.\d\+\>"
+syn match formNumber "-\d" contains=Number
+syn match formNumber "-\.\d" contains=Number
+syn match formNumber "i_\+\>"
+syn match formNumber "fac_\+\>"
+" pattern matching wildcards
+syn match formNumber "?[a-zA-Z0-9]*"
+" dollar-variables (new in 3.x)
+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 formDirective "^\=\.[a-zA-Z][a-zA-Z0-9]*\>"
+
+" hi User Labels
+syn sync ccomment formComment minlines=10
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/forth.vim b/runtime/syntax/forth.vim
new file mode 100644
index 0000000..fe98634
--- /dev/null
+++ b/runtime/syntax/forth.vim
@@ -0,0 +1,266 @@
+" Vim syntax file
+" Language: FORTH
+" Current Maintainer: Johan Kotlinski <kotlinski@gmail.com>
+" Previous Maintainer: Christian V. J. Br�ssow <cvjb@cvjb.de>
+" Last Change: 2023-01-12
+" Filenames: *.fs,*.ft
+" URL: https://github.com/jkotlinski/forth.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Synchronization method
+syn sync ccomment
+syn sync maxlines=200
+
+" I use gforth, so I set this to case ignore
+syn case ignore
+
+" Some special, non-FORTH keywords
+syn keyword forthTodo contained TODO FIXME XXX
+
+" Characters allowed in keywords
+" I don't know if 128-255 are allowed in ANS-FORTH
+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")
+ if !exists("forth_no_trail_space_error")
+ syn match forthSpaceError display excludenl "\s\+$"
+ endif
+ if !exists("forth_no_tab_space_error")
+ syn match forthSpaceError display " \+\t"me=e-1
+ endif
+endif
+
+" Keywords
+
+" basic mathematical and logical operators
+syn keyword forthOperators + - * / MOD /MOD NEGATE ABS MIN MAX
+syn keyword forthOperators AND OR XOR NOT LSHIFT RSHIFT INVERT 2* 2/ 1+
+syn keyword forthOperators 1- 2+ 2- 8* UNDER+
+syn keyword forthOperators M+ */ */MOD M* UM* M*/ UM/MOD FM/MOD SM/REM
+syn keyword forthOperators D+ D- DNEGATE DABS DMIN DMAX D2* D2/
+syn keyword forthOperators F+ F- F* F/ FNEGATE FABS FMAX FMIN FLOOR FROUND
+syn keyword forthOperators F** FSQRT FEXP FEXPM1 FLN FLNP1 FLOG FALOG FSIN
+syn keyword forthOperators FCOS FSINCOS FTAN FASIN FACOS FATAN FATAN2 FSINH
+syn keyword forthOperators FCOSH FTANH FASINH FACOSH FATANH F2* F2/ 1/F
+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 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
+syn keyword forthStack 2DROP 2NIP 2DUP 2OVER 2TUCK 2SWAP 2ROT 2-ROT
+syn keyword forthStack 3DUP 4DUP 5DUP 3DROP 4DROP 5DROP 8DROP 4SWAP 4ROT
+syn keyword forthStack 4-ROT 4TUCK 8SWAP 8DUP
+syn keyword forthRStack >R R> R@ RDROP 2>R 2R> 2R@ 2RDROP
+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! DEPTH
+
+" address operations
+syn keyword forthMemory @ ! +! C@ C! 2@ 2! F@ F! SF@ SF! DF@ DF!
+syn keyword forthAdrArith CHARS CHAR+ CELLS CELL+ CELL ALIGN ALIGNED FLOATS
+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 UNUSED
+
+" conditionals
+syn keyword forthCond IF ELSE ENDIF THEN CASE OF ENDOF ENDCASE ?DUP-IF
+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 RECURSE
+
+" new words
+syn match forthClassDef '\<:class\s*[^ \t]\+\>'
+syn match forthObjectDef '\<:object\s*[^ \t]\+\>'
+syn match forthColonDef '\<:m\?\s*[^ \t]\+\>'
+syn keyword forthEndOfColonDef ; ;M ;m
+syn keyword forthEndOfClassDef ;class
+syn keyword forthEndOfObjectDef ;object
+syn keyword forthDefine CONSTANT 2CONSTANT FCONSTANT VARIABLE 2VARIABLE
+syn keyword forthDefine FVARIABLE CREATE USER VALUE TO DEFER IS <BUILDS DOES> IMMEDIATE
+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 BUFFER: MARKER
+syn keyword forthDefine , 2, F, C, COMPILE,
+syn match forthDefine "\[DEFINED]"
+syn match forthDefine "\[UNDEFINED]"
+syn match forthDefine "\[IF]"
+syn match forthDefine "\[IFDEF]"
+syn match forthDefine "\[IFUNDEF]"
+syn match forthDefine "\[THEN]"
+syn match forthDefine "\[ENDIF]"
+syn match forthDefine "\[ELSE]"
+syn match forthDefine "\[?DO]"
+syn match forthDefine "\[DO]"
+syn match forthDefine "\[LOOP]"
+syn match forthDefine "\[+LOOP]"
+syn match forthDefine "\[NEXT]"
+syn match forthDefine "\[BEGIN]"
+syn match forthDefine "\[UNTIL]"
+syn match forthDefine "\[AGAIN]"
+syn match forthDefine "\[WHILE]"
+syn match forthDefine "\[REPEAT]"
+syn match forthDefine "\[COMP']"
+syn match forthDefine "'"
+syn match forthDefine '\<\[\>'
+syn match forthDefine "\[']"
+syn match forthDefine '\[COMPILE]'
+syn match forthDefine '\[CHAR]'
+
+" debugging
+syn keyword forthDebug PRINTDEBUGDATA PRINTDEBUGLINE
+syn match forthDebug "\<\~\~\>"
+
+" Assembler
+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 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'
+syn match forthCharOps '\<\[char\]\s\S\s'
+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 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
+syn keyword forthVocs ONLY FORTH ALSO ROOT SEAL VOCS ORDER CONTEXT #VOCS
+syn keyword forthVocs VOCABULARY DEFINITIONS
+
+" File keywords
+syn keyword forthFileMode R/O R/W W/O BIN
+syn keyword forthFileWords OPEN-FILE CREATE-FILE CLOSE-FILE DELETE-FILE
+syn keyword forthFileWords RENAME-FILE READ-FILE READ-LINE KEY-FILE
+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 BLK
+
+" numbers
+syn keyword forthMath DECIMAL HEX BASE
+syn match forthInteger '\<-\=[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* --- don't mess
+syn match forthInteger '\<\x*\d\x*\>' " *2* --- this order!
+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
+" 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
+" XXX
+syn region forthString start=+s\"+ end=+"+ end=+$+ contains=@Spell
+syn region forthString start=+s\\\"+ end=+"+ end=+$+ contains=@Spell
+syn region forthString start=+c\"+ end=+"+ end=+$+ contains=@Spell
+
+" 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
+
+" Include files
+syn match forthInclude '^INCLUDE\s\+\k\+'
+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='^}'
+syn match forthLocals '{ }' " otherwise, at least two spaces between
+syn region forthDeprecated start='locals|' end='|'
+
+" Define the default highlighting.
+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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim:ts=8:sw=4:nocindent:smartindent:
+
diff --git a/runtime/syntax/fortran.vim b/runtime/syntax/fortran.vim
new file mode 100644
index 0000000..b5c9b1e
--- /dev/null
+++ b/runtime/syntax/fortran.vim
@@ -0,0 +1,553 @@
+" Vim syntax file
+" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
+" Version: (v104) 2021 April 06
+" 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 for Fortran 95 was created in April 2000 by Ajit Thakkar from an
+" older Fortran 77 syntax file by Mario Eusebio and Preben Guldberg.
+" Since then, useful suggestions and contributions have been made, in order, by:
+" Andrej Panjkov, Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile,
+" Walter Dieudonne, Alexander Wagner, Roman Bertle, Charles Rendleman,
+" Andrew Griffiths, Joe Krahn, Hendrik Merx, Matt Thompson, Jan Hermann,
+" Stefano Zaghi, Vishnu V. Krishnan, Judicael Grasset, Takuma Yoshida,
+" Eisuke Kawashima, Andre Chalella, and Fritz Reese.
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Choose fortran_dialect using the priority:
+" source file directive > buffer-local value > global value > file extension
+" first try using directive in first three lines of file
+let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3)
+if b:fortran_retype =~? '\<fortran_dialect\s*=\s*F\>'
+ let b:fortran_dialect = "F"
+elseif b:fortran_retype =~? '\<fortran_dialect\s*=\s*f08\>'
+ let b:fortran_dialect = "f08"
+elseif !exists("b:fortran_dialect")
+ if exists("g:fortran_dialect") && g:fortran_dialect =~# '\<F\|f08\>'
+ " try global variable
+ let b:fortran_dialect = g:fortran_dialect
+ else " nothing found, so use default
+ let b:fortran_dialect = "f08"
+ endif
+endif
+unlet! b:fortran_retype
+" make sure buffer-local value is not invalid
+if b:fortran_dialect !~# '\<F\|f08\>'
+ let b:fortran_dialect = "f08"
+endif
+
+" Choose between fixed and free source form if this hasn't been done yet
+if !exists("b:fortran_fixed_source")
+ if b:fortran_dialect == "F"
+ " F requires free source form
+ let b:fortran_fixed_source = 0
+ elseif exists("fortran_free_source")
+ " User guarantees free source form for all fortran files
+ let b:fortran_fixed_source = 0
+ elseif exists("fortran_fixed_source")
+ " User guarantees fixed source form for all fortran files
+ let b:fortran_fixed_source = 1
+ elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$'
+ " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers
+ let b:fortran_fixed_source = 0
+ elseif expand("%:e") =~? '^\%(f\|f77\|for\)$'
+ " Fixed-form file extension defaults
+ let b:fortran_fixed_source = 1
+ else
+ " Modern fortran still allows both free and fixed source form.
+ " Assume fixed source form unless signs of free source form
+ " are detected in the first five columns of the first s:lmax lines.
+ " Detection becomes more accurate and time-consuming if more lines
+ " are checked. Increase the limit below if you keep lots of comments at
+ " the very top of each file and you have a fast computer.
+ let s:lmax = 500
+ if ( s:lmax > line("$") )
+ let s:lmax = line("$")
+ endif
+ let b:fortran_fixed_source = 1
+ let s:ln=1
+ while s:ln <= s:lmax
+ let s:test = strpart(getline(s:ln),0,5)
+ if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
+ let b:fortran_fixed_source = 0
+ break
+ endif
+ let s:ln = s:ln + 1
+ endwhile
+ unlet! s:lmax s:ln s:test
+ endif
+endif
+
+syn case ignore
+
+if b:fortran_fixed_source == 1
+ syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:"
+else
+ syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:"
+endif
+if exists("fortran_more_precise")
+ syn match fortranConstructName "\(\<end\s*do\s\+\)\@11<=\a\w*"
+ syn match fortranConstructName "\(\<end\s*if\s\+\)\@11<=\a\w*"
+ syn match fortranConstructName "\(\<end\s*select\s\+\)\@15<=\a\w*"
+endif
+
+syn match fortranUnitHeader "\<end\>"
+syn match fortranType "\<character\>"
+syn match fortranType "\<complex\>"
+syn match fortranType "\<integer\>"
+syn match fortranType "\<real\>"
+syn match fortranType "\<logical\>"
+syn keyword fortranType intrinsic
+syn match fortranType "\<implicit\>"
+syn keyword fortranStructure dimension
+syn keyword fortranStorageClass parameter save
+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\>"
+syn match fortranConditionalOb "\<if\s*(.*)\s*\d\+\s*,\s*\d\+\s*,\s*\d\+\s*$"
+syn match fortranRepeat "\<do\>"
+
+syn keyword fortranTodo contained todo fixme
+
+"Catch errors caused by too many right parentheses
+syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell
+syn match fortranParenError ")"
+
+syn match fortranOperator "\.\s*n\=eqv\s*\."
+syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\."
+syn match fortranOperator "\(+\|-\|/\|\*\)"
+syn match fortranTypeOb "\<character\s*\*"
+
+syn match fortranBoolean "\.\s*\(true\|false\)\s*\."
+
+syn keyword fortranReadWrite backspace close endfile inquire open print read rewind write
+
+"If tabs are allowed then the left margin checks do not work
+if exists("fortran_have_tabs")
+ syn match fortranTab "\t" transparent
+else
+ syn match fortranTab "\t"
+endif
+
+syn keyword fortranIO access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit
+
+syn keyword fortranIntrinsicR alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl
+
+" Intrinsics provided by some vendors
+syn keyword fortranExtraIntrinsic algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh
+
+syn keyword fortranIntrinsic abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh
+syn match fortranIntrinsic "\<len\s*[(,]"me=s+3
+syn match fortranIntrinsic "\<real\s*("me=s+4
+syn match fortranIntrinsic "\<logical\s*("me=s+7
+syn match fortranType "\<implicit\s\+real\>"
+syn match fortranType "\<implicit\s\+logical\>"
+
+"Numbers of various sorts
+" Integers
+syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>"
+" floating point number, without a decimal point
+syn match fortranFloatIll display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>"
+" floating point number, starting with a decimal point
+syn match fortranFloatIll display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
+" floating point number, no digits after decimal
+syn match fortranFloatIll display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
+" floating point number, D or Q exponents
+syn match fortranFloatIll display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>"
+" floating point number
+syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>"
+" binary number
+syn match fortranBinary display "b["'][01]\+["']"
+" octal number
+syn match fortranOctal display "o["'][0-7]\+["']"
+" hexadecimal number
+syn match fortranHex display "z["'][0-9A-F]\+["']"
+" Numbers in formats
+syn match fortranFormatSpec display "\d*f\d\+\.\d\+"
+syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\="
+syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\="
+syn match fortranFormatSpec display "\d\+x\>"
+" The next match cannot be used because it would pick up identifiers as well
+" syn match fortranFormatSpec display "\<\(a\|i\)\d\+"
+
+" Numbers as labels
+syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1
+syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1
+syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1
+syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1
+syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1
+
+if exists("fortran_more_precise")
+ " Numbers as targets
+ syn match fortranTarget display "\(\<if\s*(.\+)\s*\)\@<=\(\d\+\s*,\s*\)\{2}\d\+\>"
+ syn match fortranTarget display "\(\<do\s\+\)\@11<=\d\+\>"
+ syn match fortranTarget display "\(\<go\s*to\s*(\=\)\@11<=\(\d\+\s*,\s*\)*\d\+\>"
+endif
+
+syn keyword fortranTypeR external
+syn keyword fortranIOR format
+syn match fortranKeywordR "\<continue\>"
+syn match fortranKeyword "^\s*\d\+\s\+continue\>"
+syn match fortranKeyword "\<go\s*to\>"
+syn match fortranKeywordDel "\<go\s*to\ze\s\+.*,\s*(.*$"
+syn match fortranKeywordOb "\<go\s*to\ze\s*(\d\+.*$"
+syn region fortranStringR start=+'+ end=+'+ contains=fortranContinueMark,fortranLeftMargin,fortranSerialNumber
+syn keyword fortranIntrinsicR dim lge lgt lle llt mod
+syn keyword fortranKeywordDel assign pause
+
+syn match fortranType "\<type\>"
+syn keyword fortranType none
+
+syn keyword fortranStructure private public intent optional
+syn keyword fortranStructure pointer target allocatable
+syn keyword fortranStorageClass in out
+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\>"
+syn keyword fortranKeyword allocate deallocate nullify cycle exit
+syn match fortranConditional "\<select\>"
+syn keyword fortranConditional case default where elsewhere
+
+syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)"
+syn match fortranOperator "=>"
+
+syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
+syn keyword fortranIO pad position action delim readwrite
+syn keyword fortranIO eor advance nml
+
+syn keyword fortranIntrinsic adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack precision present product radix random_number random_seed range repeat reshape rrspacing
+syn keyword fortranIntrinsic scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify
+syn match fortranIntrinsic "\<not\>\(\s*\.\)\@!"me=s+3
+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"
+syn match fortranConditional "\<end\s*select"
+syn match fortranType "\<end\s*type"
+syn match fortranType "\<in\s*out"
+
+syn keyword fortranType procedure
+syn match fortranType "\<module\ze\s\+procedure\>"
+syn keyword fortranIOR namelist
+syn keyword fortranConditionalR while
+syn keyword fortranIntrinsicR achar iachar transfer
+
+syn keyword fortranInclude include
+syn keyword fortranStorageClassR sequence
+
+syn match fortranConditional "\<end\s*if"
+syn match fortranIO contains=fortranOperator "\<e\(nd\|rr\)\s*=\s*\d\+"
+syn match fortranConditional "\<else\s*if"
+
+syn keyword fortranUnitHeaderOb entry
+syn match fortranTypeR display "double\s\+precision"
+syn match fortranTypeR display "double\s\+complex"
+syn match fortranUnitHeaderR display "block\s\+data"
+syn keyword fortranStorageClassR common equivalence data
+syn keyword fortranIntrinsicR dble dprod
+syn match fortranOperatorR "\.\s*[gl][et]\s*\."
+syn match fortranOperatorR "\.\s*\(eq\|ne\)\s*\."
+
+syn keyword fortranRepeat forall
+syn match fortranRepeat "\<end\s*forall"
+syn keyword fortranIntrinsic null cpu_time
+syn match fortranType "\<elemental\>"
+syn match fortranType "\<pure\>"
+syn match fortranType "\<impure\>"
+syn match fortranType "\<recursive\>"
+if exists("fortran_more_precise")
+ syn match fortranConstructName "\(\<end\s*forall\s\+\)\@15<=\a\w*\>"
+endif
+
+if b:fortran_dialect == "f08"
+ " F2003
+ syn keyword fortranIntrinsic command_argument_count get_command get_command_argument get_environment_variable is_iostat_end is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_of
+ " ISO_C_binding
+ syn keyword fortranConstant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab
+ syn keyword fortranConstant c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr
+ syn keyword fortranIntrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer
+ syn keyword fortranType c_ptr c_funptr
+ " ISO_Fortran_env
+ syn keyword fortranConstant iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit
+ " IEEE_arithmetic
+ syn keyword fortranIntrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode
+
+ syn keyword fortranReadWrite flush wait
+ syn keyword fortranIO decimal round iomsg
+ 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"
+ syn match fortranType "\<enum\s*,\s*bind\s*(\s*c\s*)"
+ syn match fortranType "\<end\s*enum"
+ syn match fortranConditional "\<select\s*type"
+ syn match fortranConditional "\<type\s*is\>"
+ syn match fortranConditional "\<class\s*is\>"
+ syn match fortranUnitHeader "\<abstract\s*interface\>"
+ syn match fortranOperator "\([\|]\)"
+
+ " F2008
+ syn keyword fortranIntrinsic acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2
+ syn keyword fortranIntrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits
+ 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\>"
+ syn keyword fortranTypeCUDA host global device value
+ syn keyword fortranTypeCUDA shared constant pinned texture
+ syn keyword fortranTypeCUDA dim1 dim2 dim3 dim4
+ syn keyword fortranTypeCUDA cudadeviceprop cuda_count_kind cuda_stream_kind
+ syn keyword fortranTypeCUDA cudaEvent cudaFuncAttributes cudaArrayPtr
+ syn keyword fortranTypeCUDA cudaSymbol cudaChannelFormatDesc cudaPitchedPtr
+ syn keyword fortranTypeCUDA cudaExtent cudaMemcpy3DParms
+ syn keyword fortranTypeCUDA cudaFuncCachePreferNone cudaFuncCachePreferShared
+ syn keyword fortranTypeCUDA cudaFuncCachePreferL1 cudaLimitStackSize
+ syn keyword fortranTypeCUDA cudaLimitPrintfSize cudaLimitMallocHeapSize
+ syn keyword fortranTypeCUDA cudaSharedMemBankSizeDefault cudaSharedMemBankSizeFourByte cudaSharedMemBankSizeEightByte
+ syn keyword fortranTypeCUDA cudaEventDefault cudaEventBlockingSync cudaEventDisableTiming
+ syn keyword fortranTypeCUDA cudaMemcpyHostToDevice cudaMemcpyDeviceToHost
+ syn keyword fortranTypeCUDA cudaMemcpyDeviceToDevice
+ syn keyword fortranTypeCUDA cudaErrorNotReady cudaSuccess cudaErrorInvalidValue
+ syn keyword fortranTypeCUDA c_devptr
+
+ syn match fortranStringCUDA "blockidx%[xyz]"
+ syn match fortranStringCUDA "blockdim%[xyz]"
+ syn match fortranStringCUDA "griddim%[xyz]"
+ syn match fortranStringCUDA "threadidx%[xyz]"
+
+ syn keyword fortranIntrinsicCUDA warpsize syncthreads syncthreads_and syncthreads_count syncthreads_or threadfence threadfence_block threadfence_system gpu_time allthreads anythread ballot
+ syn keyword fortranIntrinsicCUDA atomicadd atomicsub atomicmax atomicmin atomicand atomicor atomicxor atomicexch atomicinc atomicdec atomiccas sizeof __shfl __shfl_up __shfl_down __shfl_xor
+ syn keyword fortranIntrinsicCUDA cudaChooseDevice cudaDeviceGetCacheConfig cudaDeviceGetLimit cudaDeviceGetSharedMemConfig cudaDeviceReset cudaDeviceSetCacheConfig cudaDeviceSetLimit cudaDeviceSetSharedMemConfig cudaDeviceSynchronize cudaGetDevice cudaGetDeviceCount cudaGetDeviceProperties cudaSetDevice cudaSetDeviceFlags cudaSetValidDevices
+ syn keyword fortranIntrinsicCUDA cudaThreadExit cudaThreadSynchronize cudaGetLastError cudaGetErrorString cudaPeekAtLastError cudaStreamCreate cudaStreamDestroy cudaStreamQuery cudaStreamSynchronize cudaStreamWaitEvent cudaEventCreate cudaEventCreateWithFlags cudaEventDestroy cudaEventElapsedTime cudaEventQuery cudaEventRecord cudaEventSynchronize
+ syn keyword fortranIntrinsicCUDA cudaFuncGetAttributes cudaFuncSetCacheConfig cudaFuncSetSharedMemConfig cudaSetDoubleForDevice cudaSetDoubleForHost cudaFree cudaFreeArray cudaFreeHost cudaGetSymbolAddress cudaGetSymbolSize
+ syn keyword fortranIntrinsicCUDA cudaHostAlloc cudaHostGetDevicePointer cudaHostGetFlags cudaHostRegister cudaHostUnregister cudaMalloc cudaMallocArray cudaMallocHost cudaMallocPitch cudaMalloc3D cudaMalloc3DArray
+ syn keyword fortranIntrinsicCUDA cudaMemcpy cudaMemcpyArraytoArray cudaMemcpyAsync cudaMemcpyFromArray cudaMemcpyFromSymbol cudaMemcpyFromSymbolAsync cudaMemcpyPeer cudaMemcpyPeerAsync cudaMemcpyToArray cudaMemcpyToSymbol cudaMemcpyToSymbolAsync cudaMemcpy2D cudaMemcpy2DArrayToArray cudaMemcpy2DAsync cudaMemcpy2DFromArray cudaMemcpy2DToArray cudaMemcpy3D cudaMemcpy3DAsync
+ syn keyword fortranIntrinsicCUDA cudaMemGetInfo cudaMemset cudaMemset2D cudaMemset3D cudaDeviceCanAccessPeer cudaDeviceDisablePeerAccess cudaDeviceEnablePeerAccess cudaPointerGetAttributes cudaDriverGetVersion cudaRuntimeGetVersion
+
+ syn region none matchgroup=fortranType start="<<<" end=">>>" contains=ALLBUT,none
+endif
+
+syn cluster fortranCommentGroup contains=fortranTodo
+
+if (b:fortran_fixed_source == 1)
+ if !exists("fortran_have_tabs")
+ " Fixed format requires a textwidth of 72 for code,
+ " but some vendor extensions allow longer lines
+ if exists("fortran_extended_line_length")
+ syn match fortranSerialNumber excludenl "^.\{133,}$"lc=132
+ elseif exists("fortran_cardimage_line_length")
+ syn match fortranSerialNumber excludenl "^.\{81,}$"lc=80
+ else
+ syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72
+ endif
+ "Flag left margin errors
+ syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab
+ syn match fortranLabelError "^.\{4}\d\S"
+ endif
+ syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell
+ syn match fortranLeftMargin transparent "^ \{5}"
+ syn match fortranContinueMark display "^.\{5}\S"lc=5
+else
+ syn match fortranContinueMark display "&"
+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\)\>.*"
+syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*"
+syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*"
+syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*"
+syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber
+"syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+
+syn match cIncluded contained "<[^>]*>"
+syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded
+
+"Synchronising limits assume that comment and continuation lines are not mixed
+if exists("fortran_fold") || exists("fortran_more_precise")
+ syn sync fromstart
+elseif (b:fortran_fixed_source == 0)
+ syn sync linecont "&" minlines=30
+else
+ syn sync minlines=30
+endif
+
+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 \|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 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 \|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 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")
+ if (b:fortran_fixed_source == 1)
+ 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\|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\|type\)\>" skip="^\s*[!#].*$" end="\<end\s*select\>" contains=ALLBUT,fortranUnitHeader,fortranStructure,fortranStorageClass,fortranType,fortranProgram,fortranModule,fortranSubroutine,fortranFunction,fortranBlockData
+ endif
+ endif
+
+ if exists("fortran_fold_multilinecomments")
+ if (b:fortran_fixed_source == 1)
+ syn match fortranMultiLineComments transparent fold "\(^[!c*].*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
+ else
+ syn match fortranMultiLineComments transparent fold "\(^\s*!.*\(\n\|\%$\)\)\{4,}" contains=ALLBUT,fortranMultiCommentLines
+ endif
+ endif
+endif
+
+" Define the default highlighting.
+" The default highlighting differs for each dialect.
+" Transparent groups:
+" fortranParen, fortranLeftMargin
+" fortranProgram, fortranModule, fortranSubroutine, fortranFunction,
+" fortranBlockData
+" fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase
+" fortranMultiCommentLines
+hi def link fortranKeyword Keyword
+hi def link fortranConstructName Identifier
+hi def link fortranConditional Conditional
+hi def link fortranRepeat Repeat
+hi def link fortranTodo Todo
+hi def link fortranContinueMark Special
+hi def link fortranString String
+hi def link fortranNumber Number
+hi def link fortranBinary Number
+hi def link fortranOctal Number
+hi def link fortranHex Number
+hi def link fortranOperator Operator
+hi def link fortranBoolean Boolean
+hi def link fortranLabelError Error
+hi def link fortranObsolete Todo
+hi def link fortranType Type
+hi def link fortranStructure Type
+hi def link fortranStorageClass StorageClass
+hi def link fortranCall Function
+hi def link fortranUnitHeader fortranPreCondit
+hi def link fortranReadWrite Keyword
+hi def link fortranIO Keyword
+hi def link fortranIntrinsic Function
+hi def link fortranConstant Constant
+
+" To stop deleted & obsolescent features being highlighted as Todo items,
+" comment out the next 5 lines and uncomment the 5 lines after that
+hi def link fortranUnitHeaderOb fortranObsolete
+hi def link fortranKeywordOb fortranObsolete
+hi def link fortranConditionalOb fortranObsolete
+hi def link fortranTypeOb fortranObsolete
+hi def link fortranKeywordDel fortranObsolete
+"hi def link fortranUnitHeaderOb fortranUnitHeader
+"hi def link fortranKeywordOb fortranKeyword
+"hi def link fortranConditionalOb fortranConditional
+"hi def link fortranTypeOb fortranType
+"hi def link fortranKeywordDel fortranKeyword
+
+if b:fortran_dialect == "F"
+ hi! def link fortranIntrinsicR fortranObsolete
+ hi! def link fortranUnitHeaderR fortranObsolete
+ hi! def link fortranTypeR fortranObsolete
+ hi! def link fortranStorageClassR fortranObsolete
+ hi! def link fortranOperatorR fortranObsolete
+ hi! def link fortranInclude fortranObsolete
+ hi! def link fortranLabelNumber fortranObsolete
+ hi! def link fortranTarget fortranObsolete
+ hi! def link fortranFloatIll fortranObsolete
+ hi! def link fortranIOR fortranObsolete
+ hi! def link fortranKeywordR fortranObsolete
+ hi! def link fortranStringR fortranObsolete
+ hi! def link fortranConditionalR fortranObsolete
+else
+ hi! def link fortranIntrinsicR fortranIntrinsic
+ hi! def link fortranUnitHeaderR fortranPreCondit
+ hi! def link fortranTypeR fortranType
+ hi! def link fortranStorageClassR fortranStorageClass
+ hi! def link fortranOperatorR fortranOperator
+ hi! def link fortranInclude Include
+ hi! def link fortranLabelNumber Special
+ hi! def link fortranTarget Special
+ hi! def link fortranFloatIll fortranFloat
+ hi! def link fortranIOR fortranIO
+ hi! def link fortranKeywordR fortranKeyword
+ hi! def link fortranStringR fortranString
+ hi! def link fortranConditionalR fortranConditional
+endif
+
+" CUDA
+hi def link fortranIntrinsicCUDA fortranIntrinsic
+hi def link fortranTypeCUDA fortranType
+hi def link fortranStringCUDA fortranString
+
+hi def link fortranFormatSpec Identifier
+hi def link fortranFloat Float
+hi def link fortranPreCondit PreCondit
+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
+hi def link fortranTab Error
+
+" Uncomment the next line if you use extra intrinsics provided by vendors
+"hi def link fortranExtraIntrinsic Function
+
+let b:current_syntax = "fortran"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8 tw=132
diff --git a/runtime/syntax/foxpro.vim b/runtime/syntax/foxpro.vim
new file mode 100644
index 0000000..795859e
--- /dev/null
+++ b/runtime/syntax/foxpro.vim
@@ -0,0 +1,716 @@
+" Vim syntax file
+" Filename: foxpro.vim
+" Version: 1.0
+" Language: FoxPro for DOS/UNIX v2.6
+" Maintainer: Bill W. Smith, Jr. <donal@brewich.com>
+" Last Change: 15 May 2006
+
+" This file replaces the FoxPro for DOS v2.x syntax file
+" maintained by Powing Tse <powing@mcmug.org>
+"
+" Change Log: added support for FoxPro Codebook highlighting
+" corrected highlighting of comments that do NOT start in col 1
+" corrected highlighting of comments at end of line (&&)
+"
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" FoxPro Codebook Naming Conventions
+syn match foxproCBConst "\<[c][A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBVar "\<[lgrt][acndlmf][A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBField "\<[a-z0-9]*\.[A-Za-z0-9_]*\>"
+" PROPER CodeBook field names start with the data type and do NOT have _
+syn match foxproCBField "\<[A-Za-z0-9]*\.[acndlm][A-Z][A-Za-z0-9]*\>"
+syn match foxproCBWin "\<w[rbcm][A-Z][A-Za-z0-9_]*\>"
+" CodeBook 2.0 defined objects as follows
+" This uses the hotkey from the screen builder as the second character
+syn match foxproCBObject "\<[lgr][bfthnkoli][A-Z][A-Za-z0-9_]*\>"
+" A later version added the following conventions for objects
+syn match foxproCBObject "\<box[A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBObject "\<fld[A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBObject "\<txt[A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBObject "\<phb[A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBObject "\<rdo[A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBObject "\<chk[A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBObject "\<pop[A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBObject "\<lst[A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBObject "\<inv[A-Z][A-Za-z0-9_]*\>"
+syn match foxproCBObject "\<mnu[A-Z][A-Za-z0-9_]*\>"
+
+syntax case ignore
+
+" Highlight special characters
+syn match foxproSpecial "^\s*!"
+syn match foxproSpecial "&"
+syn match foxproSpecial ";\s*$"
+syn match foxproSpecial "^\s*="
+syn match foxproSpecial "^\s*\\"
+syn match foxproSpecial "^\s*\\\\"
+syn match foxproSpecial "^\s*?"
+syn match foxproSpecial "^\s*??"
+syn match foxproSpecial "^\s*???"
+syn match foxproSpecial "\<m\>\."
+
+" @ Statements
+syn match foxproAtSymbol contained "^\s*@"
+syn match foxproAtCmd contained "\<say\>\|\<get\>\|\<edit\>\|\<box\>\|\<clea\%[r]\>\|\<fill\>\|\<menu\>\|\<prom\%[pt]\>\|\<scro\%[ll]\>\|\<to\>"
+syn match foxproAtStart transparent "^\s*@.*" contains=ALL
+
+" preprocessor directives
+syn match foxproPreProc "^\s*#\s*\(\<if\>\|\<elif\>\|\<else\>\|\<endi\%[f]\>\)"
+syn match foxproPreProc "^\s*#\s*\(\<defi\%[ne]\>\|\<unde\%[f]\>\)"
+syn match foxproPreProc "^\s*#\s*\<regi\%[on]\>"
+
+" Functions
+syn match foxproFunc "\<abs\>\s*("me=e-1
+syn match foxproFunc "\<acop\%[y]\>\s*("me=e-1
+syn match foxproFunc "\<acos\>\s*("me=e-1
+syn match foxproFunc "\<adel\>\s*("me=e-1
+syn match foxproFunc "\<adir\>\s*("me=e-1
+syn match foxproFunc "\<aele\%[ment]\>\s*("me=e-1
+syn match foxproFunc "\<afie\%[lds]\>\s*("me=e-1
+syn match foxproFunc "\<afon\%[t]\>\s*("me=e-1
+syn match foxproFunc "\<ains\>\s*("me=e-1
+syn match foxproFunc "\<alen\>\s*("me=e-1
+syn match foxproFunc "\<alia\%[s]\>\s*("me=e-1
+syn match foxproFunc "\<allt\%[rim]\>\s*("me=e-1
+syn match foxproFunc "\<ansi\%[tooem]\>\s*("me=e-1
+syn match foxproFunc "\<asc\>\s*("me=e-1
+syn match foxproFunc "\<asca\%[n]\>\s*("me=e-1
+syn match foxproFunc "\<asin\>\s*("me=e-1
+syn match foxproFunc "\<asor\%[t]\>\s*("me=e-1
+syn match foxproFunc "\<asub\%[script]\>\s*("me=e-1
+syn match foxproFunc "\<at\>\s*("me=e-1
+syn match foxproFunc "\<atan\>\s*("me=e-1
+syn match foxproFunc "\<atc\>\s*("me=e-1
+syn match foxproFunc "\<atcl\%[ine]\>\s*("me=e-1
+syn match foxproFunc "\<atli\%[ne]\>\s*("me=e-1
+syn match foxproFunc "\<atn2\>\s*("me=e-1
+syn match foxproFunc "\<bar\>\s*("me=e-1
+syn match foxproFunc "\<barc\%[ount]\>\s*("me=e-1
+syn match foxproFunc "\<barp\%[rompt]\>\s*("me=e-1
+syn match foxproFunc "\<betw\%[een]\>\s*("me=e-1
+syn match foxproFunc "\<bof\>\s*("me=e-1
+syn match foxproFunc "\<caps\%[lock]\>\s*("me=e-1
+syn match foxproFunc "\<cdow\>\s*("me=e-1
+syn match foxproFunc "\<cdx\>\s*("me=e-1
+syn match foxproFunc "\<ceil\%[ing]\>\s*("me=e-1
+syn match foxproFunc "\<chr\>\s*("me=e-1
+syn match foxproFunc "\<chrs\%[aw]\>\s*("me=e-1
+syn match foxproFunc "\<chrt\%[ran]\>\s*("me=e-1
+syn match foxproFunc "\<cmon\%[th]\>\s*("me=e-1
+syn match foxproFunc "\<cntb\%[ar]\>\s*("me=e-1
+syn match foxproFunc "\<cntp\%[ad]\>\s*("me=e-1
+syn match foxproFunc "\<col\>\s*("me=e-1
+syn match foxproFunc "\<cos\>\s*("me=e-1
+syn match foxproFunc "\<cpco\%[nvert]\>\s*("me=e-1
+syn match foxproFunc "\<cpcu\%[rrent]\>\s*("me=e-1
+syn match foxproFunc "\<cpdb\%[f]\>\s*("me=e-1
+syn match foxproFunc "\<ctod\>\s*("me=e-1
+syn match foxproFunc "\<curd\%[ir]\>\s*("me=e-1
+syn match foxproFunc "\<date\>\s*("me=e-1
+syn match foxproFunc "\<day\>\s*("me=e-1
+syn match foxproFunc "\<dbf\>\s*("me=e-1
+syn match foxproFunc "\<ddea\%[borttrans]\>\s*("me=e-1
+syn match foxproFunc "\<ddea\%[dvise]\>\s*("me=e-1
+syn match foxproFunc "\<ddee\%[nabled]\>\s*("me=e-1
+syn match foxproFunc "\<ddee\%[xecute]\>\s*("me=e-1
+syn match foxproFunc "\<ddei\%[nitiate]\>\s*("me=e-1
+syn match foxproFunc "\<ddel\%[asterror]\>\s*("me=e-1
+syn match foxproFunc "\<ddep\%[oke]\>\s*("me=e-1
+syn match foxproFunc "\<dder\%[equest]\>\s*("me=e-1
+syn match foxproFunc "\<ddes\%[etoption]\>\s*("me=e-1
+syn match foxproFunc "\<ddes\%[etservice]\>\s*("me=e-1
+syn match foxproFunc "\<ddes\%[ettopic]\>\s*("me=e-1
+syn match foxproFunc "\<ddet\%[erminate]\>\s*("me=e-1
+syn match foxproFunc "\<dele\%[ted]\>\s*("me=e-1
+syn match foxproFunc "\<desc\%[ending]\>\s*("me=e-1
+syn match foxproFunc "\<diff\%[erence]\>\s*("me=e-1
+syn match foxproFunc "\<disk\%[space]\>\s*("me=e-1
+syn match foxproFunc "\<dmy\>\s*("me=e-1
+syn match foxproFunc "\<dow\>\s*("me=e-1
+syn match foxproFunc "\<dtoc\>\s*("me=e-1
+syn match foxproFunc "\<dtor\>\s*("me=e-1
+syn match foxproFunc "\<dtos\>\s*("me=e-1
+syn match foxproFunc "\<empt\%[y]\>\s*("me=e-1
+syn match foxproFunc "\<eof\>\s*("me=e-1
+syn match foxproFunc "\<erro\%[r]\>\s*("me=e-1
+syn match foxproFunc "\<eval\%[uate]\>\s*("me=e-1
+syn match foxproFunc "\<exp\>\s*("me=e-1
+syn match foxproFunc "\<fchs\%[ize]\>\s*("me=e-1
+syn match foxproFunc "\<fclo\%[se]\>\s*("me=e-1
+syn match foxproFunc "\<fcou\%[nt]\>\s*("me=e-1
+syn match foxproFunc "\<fcre\%[ate]\>\s*("me=e-1
+syn match foxproFunc "\<fdat\%[e]\>\s*("me=e-1
+syn match foxproFunc "\<feof\>\s*("me=e-1
+syn match foxproFunc "\<ferr\%[or]\>\s*("me=e-1
+syn match foxproFunc "\<fflu\%[sh]\>\s*("me=e-1
+syn match foxproFunc "\<fget\%[s]\>\s*("me=e-1
+syn match foxproFunc "\<fiel\%[d]\>\s*("me=e-1
+syn match foxproFunc "\<file\>\s*("me=e-1
+syn match foxproFunc "\<filt\%[er]\>\s*("me=e-1
+syn match foxproFunc "\<fkla\%[bel]\>\s*("me=e-1
+syn match foxproFunc "\<fkma\%[x]\>\s*("me=e-1
+syn match foxproFunc "\<fldl\%[ist]\>\s*("me=e-1
+syn match foxproFunc "\<floc\%[k]\>\s*("me=e-1
+syn match foxproFunc "\<floo\%[r]\>\s*("me=e-1
+syn match foxproFunc "\<font\%[metric]\>\s*("me=e-1
+syn match foxproFunc "\<fope\%[n]\>\s*("me=e-1
+syn match foxproFunc "\<for\>\s*("me=e-1
+syn match foxproFunc "\<foun\%[d]\>\s*("me=e-1
+syn match foxproFunc "\<fput\%[s]\>\s*("me=e-1
+syn match foxproFunc "\<frea\%[d]\>\s*("me=e-1
+syn match foxproFunc "\<fsee\%[k]\>\s*("me=e-1
+syn match foxproFunc "\<fsiz\%[e]\>\s*("me=e-1
+syn match foxproFunc "\<ftim\%[e]\>\s*("me=e-1
+syn match foxproFunc "\<full\%[path]\>\s*("me=e-1
+syn match foxproFunc "\<fv\>\s*("me=e-1
+syn match foxproFunc "\<fwri\%[te]\>\s*("me=e-1
+syn match foxproFunc "\<getb\%[ar]\>\s*("me=e-1
+syn match foxproFunc "\<getd\%[ir]\>\s*("me=e-1
+syn match foxproFunc "\<gete\%[nv]\>\s*("me=e-1
+syn match foxproFunc "\<getf\%[ile]\>\s*("me=e-1
+syn match foxproFunc "\<getf\%[ont]\>\s*("me=e-1
+syn match foxproFunc "\<getp\%[ad]\>\s*("me=e-1
+syn match foxproFunc "\<gomo\%[nth]\>\s*("me=e-1
+syn match foxproFunc "\<head\%[er]\>\s*("me=e-1
+syn match foxproFunc "\<home\>\s*("me=e-1
+syn match foxproFunc "\<idxc\%[ollate]\>\s*("me=e-1
+syn match foxproFunc "\<iif\>\s*("me=e-1
+syn match foxproFunc "\<inke\%[y]\>\s*("me=e-1
+syn match foxproFunc "\<inli\%[st]\>\s*("me=e-1
+syn match foxproFunc "\<insm\%[ode]\>\s*("me=e-1
+syn match foxproFunc "\<int\>\s*("me=e-1
+syn match foxproFunc "\<isal\%[pha]\>\s*("me=e-1
+syn match foxproFunc "\<isbl\%[ank]\>\s*("me=e-1
+syn match foxproFunc "\<isco\%[lor]\>\s*("me=e-1
+syn match foxproFunc "\<isdi\%[git]\>\s*("me=e-1
+syn match foxproFunc "\<islo\%[wer]\>\s*("me=e-1
+syn match foxproFunc "\<isre\%[adonly]\>\s*("me=e-1
+syn match foxproFunc "\<isup\%[per]\>\s*("me=e-1
+syn match foxproFunc "\<key\>\s*("me=e-1
+syn match foxproFunc "\<keym\%[atch]\>\s*("me=e-1
+syn match foxproFunc "\<last\%[key]\>\s*("me=e-1
+syn match foxproFunc "\<left\>\s*("me=e-1
+syn match foxproFunc "\<len\>\s*("me=e-1
+syn match foxproFunc "\<like\>\s*("me=e-1
+syn match foxproFunc "\<line\%[no]\>\s*("me=e-1
+syn match foxproFunc "\<locf\%[ile]\>\s*("me=e-1
+syn match foxproFunc "\<lock\>\s*("me=e-1
+syn match foxproFunc "\<log\>\s*("me=e-1
+syn match foxproFunc "\<log1\%[0]\>\s*("me=e-1
+syn match foxproFunc "\<look\%[up]\>\s*("me=e-1
+syn match foxproFunc "\<lowe\%[r]\>\s*("me=e-1
+syn match foxproFunc "\<ltri\%[m]\>\s*("me=e-1
+syn match foxproFunc "\<lupd\%[ate]\>\s*("me=e-1
+syn match foxproFunc "\<max\>\s*("me=e-1
+syn match foxproFunc "\<mcol\>\s*("me=e-1
+syn match foxproFunc "\<mdow\%[n]\>\s*("me=e-1
+syn match foxproFunc "\<mdx\>\s*("me=e-1
+syn match foxproFunc "\<mdy\>\s*("me=e-1
+syn match foxproFunc "\<meml\%[ines]\>\s*("me=e-1
+syn match foxproFunc "\<memo\%[ry]\>\s*("me=e-1
+syn match foxproFunc "\<menu\>\s*("me=e-1
+syn match foxproFunc "\<mess\%[age]\>\s*("me=e-1
+syn match foxproFunc "\<min\>\s*("me=e-1
+syn match foxproFunc "\<mlin\%[e]\>\s*("me=e-1
+syn match foxproFunc "\<mod\>\s*("me=e-1
+syn match foxproFunc "\<mont\%[h]\>\s*("me=e-1
+syn match foxproFunc "\<mrkb\%[ar]\>\s*("me=e-1
+syn match foxproFunc "\<mrkp\%[ad]\>\s*("me=e-1
+syn match foxproFunc "\<mrow\>\s*("me=e-1
+syn match foxproFunc "\<mwin\%[dow]\>\s*("me=e-1
+syn match foxproFunc "\<ndx\>\s*("me=e-1
+syn match foxproFunc "\<norm\%[alize]\>\s*("me=e-1
+syn match foxproFunc "\<numl\%[ock]\>\s*("me=e-1
+syn match foxproFunc "\<objn\%[um]\>\s*("me=e-1
+syn match foxproFunc "\<objv\%[ar]\>\s*("me=e-1
+syn match foxproFunc "\<occu\%[rs]\>\s*("me=e-1
+syn match foxproFunc "\<oemt\%[oansi]\>\s*("me=e-1
+syn match foxproFunc "\<on\>\s*("me=e-1
+syn match foxproFunc "\<orde\%[r]\>\s*("me=e-1
+syn match foxproFunc "\<os\>\s*("me=e-1
+syn match foxproFunc "\<pad\>\s*("me=e-1
+syn match foxproFunc "\<padc\>\s*("me=e-1
+syn match foxproFunc "\<padl\>\s*("me=e-1
+syn match foxproFunc "\<padr\>\s*("me=e-1
+syn match foxproFunc "\<para\%[meters]\>\s*("me=e-1
+syn match foxproFunc "\<paym\%[ent]\>\s*("me=e-1
+syn match foxproFunc "\<pcol\>\s*("me=e-1
+syn match foxproFunc "\<pi\>\s*("me=e-1
+syn match foxproFunc "\<popu\%[p]\>\s*("me=e-1
+syn match foxproFunc "\<prin\%[tstatus]\>\s*("me=e-1
+syn match foxproFunc "\<prmb\%[ar]\>\s*("me=e-1
+syn match foxproFunc "\<prmp\%[ad]\>\s*("me=e-1
+syn match foxproFunc "\<prog\%[ram]\>\s*("me=e-1
+syn match foxproFunc "\<prom\%[pt]\>\s*("me=e-1
+syn match foxproFunc "\<prop\%[er]\>\s*("me=e-1
+syn match foxproFunc "\<prow\>\s*("me=e-1
+syn match foxproFunc "\<prti\%[nfo]\>\s*("me=e-1
+syn match foxproFunc "\<putf\%[ile]\>\s*("me=e-1
+syn match foxproFunc "\<pv\>\s*("me=e-1
+syn match foxproFunc "\<rand\>\s*("me=e-1
+syn match foxproFunc "\<rat\>\s*("me=e-1
+syn match foxproFunc "\<ratl\%[ine]\>\s*("me=e-1
+syn match foxproFunc "\<rdle\%[vel]\>\s*("me=e-1
+syn match foxproFunc "\<read\%[key]\>\s*("me=e-1
+syn match foxproFunc "\<recc\%[ount]\>\s*("me=e-1
+syn match foxproFunc "\<recn\%[o]\>\s*("me=e-1
+syn match foxproFunc "\<recs\%[ize]\>\s*("me=e-1
+syn match foxproFunc "\<rela\%[tion]\>\s*("me=e-1
+syn match foxproFunc "\<repl\%[icate]\>\s*("me=e-1
+syn match foxproFunc "\<rgbs\%[cheme]\>\s*("me=e-1
+syn match foxproFunc "\<righ\%[t]\>\s*("me=e-1
+syn match foxproFunc "\<rloc\%[k]\>\s*("me=e-1
+syn match foxproFunc "\<roun\%[d]\>\s*("me=e-1
+syn match foxproFunc "\<row\>\s*("me=e-1
+syn match foxproFunc "\<rtod\>\s*("me=e-1
+syn match foxproFunc "\<rtri\%[m]\>\s*("me=e-1
+syn match foxproFunc "\<sche\%[me]\>\s*("me=e-1
+syn match foxproFunc "\<scol\%[s]\>\s*("me=e-1
+syn match foxproFunc "\<seco\%[nds]\>\s*("me=e-1
+syn match foxproFunc "\<seek\>\s*("me=e-1
+syn match foxproFunc "\<sele\%[ct]\>\s*("me=e-1
+syn match foxproFunc "\<set\>\s*("me=e-1
+syn match foxproFunc "\<sign\>\s*("me=e-1
+syn match foxproFunc "\<sin\>\s*("me=e-1
+syn match foxproFunc "\<skpb\%[ar]\>\s*("me=e-1
+syn match foxproFunc "\<skpp\%[ad]\>\s*("me=e-1
+syn match foxproFunc "\<soun\%[dex]\>\s*("me=e-1
+syn match foxproFunc "\<spac\%[e]\>\s*("me=e-1
+syn match foxproFunc "\<sqrt\>\s*("me=e-1
+syn match foxproFunc "\<srow\%[s]\>\s*("me=e-1
+syn match foxproFunc "\<str\>\s*("me=e-1
+syn match foxproFunc "\<strt\%[ran]\>\s*("me=e-1
+syn match foxproFunc "\<stuf\%[f]\>\s*("me=e-1
+syn match foxproFunc "\<subs\%[tr]\>\s*("me=e-1
+syn match foxproFunc "\<sysm\%[etric]\>\s*("me=e-1
+syn match foxproFunc "\<sys\>\s*("me=e-1
+syn match foxproFunc "\<tag\>\s*("me=e-1
+syn match foxproFunc "\<tagc\%[ount]\>\s*("me=e-1
+syn match foxproFunc "\<tagn\%[o]\>\s*("me=e-1
+syn match foxproFunc "\<tan\>\s*("me=e-1
+syn match foxproFunc "\<targ\%[et]\>\s*("me=e-1
+syn match foxproFunc "\<time\>\s*("me=e-1
+syn match foxproFunc "\<tran\%[sform]\>\s*("me=e-1
+syn match foxproFunc "\<trim\>\s*("me=e-1
+syn match foxproFunc "\<txtw\%[idth]\>\s*("me=e-1
+syn match foxproFunc "\<type\>\s*("me=e-1
+syn match foxproFunc "\<uniq\%[ue]\>\s*("me=e-1
+syn match foxproFunc "\<upda\%[ted]\>\s*("me=e-1
+syn match foxproFunc "\<uppe\%[r]\>\s*("me=e-1
+syn match foxproFunc "\<used\>\s*("me=e-1
+syn match foxproFunc "\<val\>\s*("me=e-1
+syn match foxproFunc "\<varr\%[ead]\>\s*("me=e-1
+syn match foxproFunc "\<vers\%[ion]\>\s*("me=e-1
+syn match foxproFunc "\<wbor\%[der]\>\s*("me=e-1
+syn match foxproFunc "\<wchi\%[ld]\>\s*("me=e-1
+syn match foxproFunc "\<wcol\%[s]\>\s*("me=e-1
+syn match foxproFunc "\<wexi\%[st]\>\s*("me=e-1
+syn match foxproFunc "\<wfon\%[t]\>\s*("me=e-1
+syn match foxproFunc "\<wlas\%[t]\>\s*("me=e-1
+syn match foxproFunc "\<wlco\%[l]\>\s*("me=e-1
+syn match foxproFunc "\<wlro\%[w]\>\s*("me=e-1
+syn match foxproFunc "\<wmax\%[imum]\>\s*("me=e-1
+syn match foxproFunc "\<wmin\%[imum]\>\s*("me=e-1
+syn match foxproFunc "\<wont\%[op]\>\s*("me=e-1
+syn match foxproFunc "\<wout\%[put]\>\s*("me=e-1
+syn match foxproFunc "\<wpar\%[ent]\>\s*("me=e-1
+syn match foxproFunc "\<wrea\%[d]\>\s*("me=e-1
+syn match foxproFunc "\<wrow\%[s]\>\s*("me=e-1
+syn match foxproFunc "\<wtit\%[le]\>\s*("me=e-1
+syn match foxproFunc "\<wvis\%[ible]\>\s*("me=e-1
+syn match foxproFunc "\<year\>\s*("me=e-1
+
+" Commands
+syn match foxproCmd "^\s*\<acce\%[pt]\>"
+syn match foxproCmd "^\s*\<acti\%[vate]\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<acti\%[vate]\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<acti\%[vate]\>\s*\<scre\%[en]\>"
+syn match foxproCmd "^\s*\<acti\%[vate]\>\s*\<wind\%[ow]\>"
+syn match foxproCmd "^\s*\<appe\%[nd]\>"
+syn match foxproCmd "^\s*\<appe\%[nd]\>\s*\<from\>"
+syn match foxproCmd "^\s*\<appe\%[nd]\>\s*\<from\>\s*\<arra\%[y]\>"
+syn match foxproCmd "^\s*\<appe\%[nd]\>\s*\<gene\%[ral]\>"
+syn match foxproCmd "^\s*\<appe\%[nd]\>\s*\<memo\>"
+syn match foxproCmd "^\s*\<assi\%[st]\>"
+syn match foxproCmd "^\s*\<aver\%[age]\>"
+syn match foxproCmd "^\s*\<blan\%[k]\>"
+syn match foxproCmd "^\s*\<brow\%[se]\>"
+syn match foxproCmd "^\s*\<buil\%[d]\>\s*\<app\>"
+syn match foxproCmd "^\s*\<buil\%[d]\>\s*\<exe\>"
+syn match foxproCmd "^\s*\<buil\%[d]\>\s*\<proj\%[ect]\>"
+syn match foxproCmd "^\s*\<calc\%[ulate]\>"
+syn match foxproCmd "^\s*\<call\>"
+syn match foxproCmd "^\s*\<canc\%[el]\>"
+syn match foxproCmd "^\s*\<chan\%[ge]\>"
+syn match foxproCmd "^\s*\<clea\%[r]\>"
+syn match foxproCmd "^\s*\<clos\%[e]\>"
+syn match foxproCmd "^\s*\<clos\%[e]\>\s*\<memo\>"
+syn match foxproCmd "^\s*\<comp\%[ile]\>"
+syn match foxproCmd "^\s*\<cont\%[inue]\>"
+syn match foxproCmd "^\s*\<copy\>\s*\<file\>"
+syn match foxproCmd "^\s*\<copy\>\s*\<inde\%[xes]\>"
+syn match foxproCmd "^\s*\<copy\>\s*\<memo\>"
+syn match foxproCmd "^\s*\<copy\>\s*\<stru\%[cture]\>"
+syn match foxproCmd "^\s*\<copy\>\s*\<stru\%[cture]\>\s*\<exte\%[nded]\>"
+syn match foxproCmd "^\s*\<copy\>\s*\<tag\>"
+syn match foxproCmd "^\s*\<copy\>\s*\<to\>"
+syn match foxproCmd "^\s*\<copy\>\s*\<to\>\s*\<arra\%[y]\>"
+syn match foxproCmd "^\s*\<coun\%[t]\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<colo\%[r]\>\s*\<set\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<curs\%[or]\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<from\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<labe\%[l]\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<proj\%[ect]\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<quer\%[y]\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<repo\%[rt]\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<scre\%[en]\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<tabl\%[e]\>"
+syn match foxproCmd "^\s*\<crea\%[te]\>\s*\<view\>"
+syn match foxproCmd "^\s*\<dde\>"
+syn match foxproCmd "^\s*\<deac\%[tivate]\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<deac\%[tivate]\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<deac\%[tivate]\>\s*\<wind\%[ow]\>"
+syn match foxproCmd "^\s*\<decl\%[are]\>"
+syn match foxproCmd "^\s*\<defi\%[ne]\>\s*\<bar\>"
+syn match foxproCmd "^\s*\<defi\%[ne]\>\s*\<box\>"
+syn match foxproCmd "^\s*\<defi\%[ne]\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<defi\%[ne]\>\s*\<pad\>"
+syn match foxproCmd "^\s*\<defi\%[ne]\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<defi\%[ne]\>\s*\<wind\%[ow]\>"
+syn match foxproCmd "^\s*\<dele\%[te]\>"
+syn match foxproCmd "^\s*\<dele\%[te]\>\s*\<file\>"
+syn match foxproCmd "^\s*\<dele\%[te]\>\s*\<tag\>"
+syn match foxproCmd "^\s*\<dime\%[nsion]\>"
+syn match foxproCmd "^\s*\<dire\%[ctory]\>"
+syn match foxproCmd "^\s*\<disp\%[lay]\>"
+syn match foxproCmd "^\s*\<disp\%[lay]\>\s*\<file\%[s]\>"
+syn match foxproCmd "^\s*\<disp\%[lay]\>\s*\<memo\%[ry]\>"
+syn match foxproCmd "^\s*\<disp\%[lay]\>\s*\<stat\%[us]\>"
+syn match foxproCmd "^\s*\<disp\%[lay]\>\s*\<stru\%[cture]\>"
+syn match foxproCmd "^\s*\<do\>"
+syn match foxproCmd "^\s*\<edit\>"
+syn match foxproCmd "^\s*\<ejec\%[t]\>"
+syn match foxproCmd "^\s*\<ejec\%[t]\>\s*\<page\>"
+syn match foxproCmd "^\s*\<eras\%[e]\>"
+syn match foxproCmd "^\s*\<exit\>"
+syn match foxproCmd "^\s*\<expo\%[rt]\>"
+syn match foxproCmd "^\s*\<exte\%[rnal]\>"
+syn match foxproCmd "^\s*\<file\%[r]\>"
+syn match foxproCmd "^\s*\<find\>"
+syn match foxproCmd "^\s*\<flus\%[h]\>"
+syn match foxproCmd "^\s*\<func\%[tion]\>"
+syn match foxproCmd "^\s*\<gath\%[er]\>"
+syn match foxproCmd "^\s*\<gete\%[xpr]\>"
+syn match foxproCmd "^\s*\<go\>"
+syn match foxproCmd "^\s*\<goto\>"
+syn match foxproCmd "^\s*\<help\>"
+syn match foxproCmd "^\s*\<hide\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<hide\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<hide\>\s*\<wind\%[ow]\>"
+syn match foxproCmd "^\s*\<impo\%[rt]\>"
+syn match foxproCmd "^\s*\<inde\%[x]\>"
+syn match foxproCmd "^\s*\<inpu\%[t]\>"
+syn match foxproCmd "^\s*\<inse\%[rt]\>"
+syn match foxproCmd "^\s*\<join\>"
+syn match foxproCmd "^\s*\<keyb\%[oard]\>"
+syn match foxproCmd "^\s*\<labe\%[l]\>"
+syn match foxproCmd "^\s*\<list\>"
+syn match foxproCmd "^\s*\<load\>"
+syn match foxproCmd "^\s*\<loca\%[te]\>"
+syn match foxproCmd "^\s*\<loop\>"
+syn match foxproCmd "^\s*\<menu\>"
+syn match foxproCmd "^\s*\<menu\>\s*\<to\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<comm\%[and]\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<file\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<gene\%[ral]\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<labe\%[l]\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<memo\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<proj\%[ect]\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<quer\%[y]\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<repo\%[rt]\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<scre\%[en]\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<stru\%[cture]\>"
+syn match foxproCmd "^\s*\<modi\%[fy]\>\s*\<wind\%[ow]\>"
+syn match foxproCmd "^\s*\<move\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<move\>\s*\<wind\%[ow]\>"
+syn match foxproCmd "^\s*\<note\>"
+syn match foxproCmd "^\s*\<on\>\s*\<apla\%[bout]\>"
+syn match foxproCmd "^\s*\<on\>\s*\<bar\>"
+syn match foxproCmd "^\s*\<on\>\s*\<erro\%[r]\>"
+syn match foxproCmd "^\s*\<on\>\s*\<esca\%[pe]\>"
+syn match foxproCmd "^\s*\<on\>\s*\<exit\>\s*\<bar\>"
+syn match foxproCmd "^\s*\<on\>\s*\<exit\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<on\>\s*\<exit\>\s*\<pad\>"
+syn match foxproCmd "^\s*\<on\>\s*\<exit\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<on\>\s*\<key\>"
+syn match foxproCmd "^\s*\<on\>\s*\<key\>\s*\<=\>"
+syn match foxproCmd "^\s*\<on\>\s*\<key\>\s*\<labe\%[l]\>"
+syn match foxproCmd "^\s*\<on\>\s*\<mach\%[elp]\>"
+syn match foxproCmd "^\s*\<on\>\s*\<pad\>"
+syn match foxproCmd "^\s*\<on\>\s*\<page\>"
+syn match foxproCmd "^\s*\<on\>\s*\<read\%[error]\>"
+syn match foxproCmd "^\s*\<on\>\s*\<sele\%[ction]\>\s*\<bar\>"
+syn match foxproCmd "^\s*\<on\>\s*\<sele\%[ction]\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<on\>\s*\<sele\%[ction]\>\s*\<pad\>"
+syn match foxproCmd "^\s*\<on\>\s*\<sele\%[ction]\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<on\>\s*\<shut\%[down]\>"
+syn match foxproCmd "^\s*\<pack\>"
+syn match foxproCmd "^\s*\<para\%[meters]\>"
+syn match foxproCmd "^\s*\<play\>\s*\<macr\%[o]\>"
+syn match foxproCmd "^\s*\<pop\>\s*\<key\>"
+syn match foxproCmd "^\s*\<pop\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<pop\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<priv\%[ate]\>"
+syn match foxproCmd "^\s*\<proc\%[edure]\>"
+syn match foxproCmd "^\s*\<publ\%[ic]\>"
+syn match foxproCmd "^\s*\<push\>\s*\<key\>"
+syn match foxproCmd "^\s*\<push\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<push\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<quit\>"
+syn match foxproCmd "^\s*\<read\>"
+syn match foxproCmd "^\s*\<read\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<reca\%[ll]\>"
+syn match foxproCmd "^\s*\<rein\%[dex]\>"
+syn match foxproCmd "^\s*\<rele\%[ase]\>"
+syn match foxproCmd "^\s*\<rele\%[ase]\>\s*\<modu\%[le]\>"
+syn match foxproCmd "^\s*\<rena\%[me]\>"
+syn match foxproCmd "^\s*\<repl\%[ace]\>"
+syn match foxproCmd "^\s*\<repl\%[ace]\>\s*\<from\>\s*\<arra\%[y]\>"
+syn match foxproCmd "^\s*\<repo\%[rt]\>"
+syn match foxproCmd "^\s*\<rest\%[ore]\>\s*\<from\>"
+syn match foxproCmd "^\s*\<rest\%[ore]\>\s*\<macr\%[os]\>"
+syn match foxproCmd "^\s*\<rest\%[ore]\>\s*\<scre\%[en]\>"
+syn match foxproCmd "^\s*\<rest\%[ore]\>\s*\<wind\%[ow]\>"
+syn match foxproCmd "^\s*\<resu\%[me]\>"
+syn match foxproCmd "^\s*\<retr\%[y]\>"
+syn match foxproCmd "^\s*\<retu\%[rn]\>"
+syn match foxproCmd "^\s*\<run\>"
+syn match foxproCmd "^\s*\<run\>\s*\/n"
+syn match foxproCmd "^\s*\<runs\%[cript]\>"
+syn match foxproCmd "^\s*\<save\>\s*\<macr\%[os]\>"
+syn match foxproCmd "^\s*\<save\>\s*\<scre\%[en]\>"
+syn match foxproCmd "^\s*\<save\>\s*\<to\>"
+syn match foxproCmd "^\s*\<save\>\s*\<wind\%[ows]\>"
+syn match foxproCmd "^\s*\<scat\%[ter]\>"
+syn match foxproCmd "^\s*\<scro\%[ll]\>"
+syn match foxproCmd "^\s*\<seek\>"
+syn match foxproCmd "^\s*\<sele\%[ct]\>"
+syn match foxproCmd "^\s*\<set\>"
+syn match foxproCmd "^\s*\<set\>\s*\<alte\%[rnate]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<ansi\>"
+syn match foxproCmd "^\s*\<set\>\s*\<apla\%[bout]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<auto\%[save]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<bell\>"
+syn match foxproCmd "^\s*\<set\>\s*\<blin\%[k]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<bloc\%[ksize]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<bord\%[er]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<brst\%[atus]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<carr\%[y]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<cent\%[ury]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<clea\%[r]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<cloc\%[k]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<coll\%[ate]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<colo\%[r]\>\s*\<of\>"
+syn match foxproCmd "^\s*\<set\>\s*\<colo\%[r]\>\s*\<of\>\s*\<sche\%[me]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<colo\%[r]\>\s*\<set\>"
+syn match foxproCmd "^\s*\<set\>\s*\<colo\%[r]\>\s*\<to\>"
+syn match foxproCmd "^\s*\<set\>\s*\<comp\%[atible]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<conf\%[irm]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<cons\%[ole]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<curr\%[ency]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<curs\%[or]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<date\>"
+syn match foxproCmd "^\s*\<set\>\s*\<debu\%[g]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<deci\%[mals]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<defa\%[ult]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<dele\%[ted]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<deli\%[miters]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<deve\%[lopment]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<devi\%[ce]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<disp\%[lay]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<dohi\%[story]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<echo\>"
+syn match foxproCmd "^\s*\<set\>\s*\<esca\%[pe]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<exac\%[t]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<excl\%[usive]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<fiel\%[ds]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<filt\%[er]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<fixe\%[d]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<form\%[at]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<full\%[path]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<func\%[tion]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<head\%[ings]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<help\>"
+syn match foxproCmd "^\s*\<set\>\s*\<help\%[filter]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<hour\%[s]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<inde\%[x]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<inte\%[nsity]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<key\>"
+syn match foxproCmd "^\s*\<set\>\s*\<keyc\%[omp]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<libr\%[ary]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<lock\>"
+syn match foxproCmd "^\s*\<set\>\s*\<loge\%[rrors]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<macd\%[esktop]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<mach\%[elp]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<mack\%[ey]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<marg\%[in]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<mark\>\s*\<of\>"
+syn match foxproCmd "^\s*\<set\>\s*\<mark\>\s*\<to\>"
+syn match foxproCmd "^\s*\<set\>\s*\<memo\%[width]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<mess\%[age]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<mous\%[e]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<mult\%[ilocks]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<near\>"
+syn match foxproCmd "^\s*\<set\>\s*\<nocp\%[trans]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<noti\%[fy]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<odom\%[eter]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<opti\%[mize]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<orde\%[r]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<pale\%[tte]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<path\>"
+syn match foxproCmd "^\s*\<set\>\s*\<pdse\%[tup]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<poin\%[t]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<prin\%[ter]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<proc\%[edure]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<read\%[border]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<refr\%[esh]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<rela\%[tion]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<rela\%[tion]\>\s*\<off\>"
+syn match foxproCmd "^\s*\<set\>\s*\<repr\%[ocess]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<reso\%[urce]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<safe\%[ty]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<scor\%[eboard]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<sepa\%[rator]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<shad\%[ows]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<skip\>"
+syn match foxproCmd "^\s*\<set\>\s*\<skip\>\s*\<of\>"
+syn match foxproCmd "^\s*\<set\>\s*\<spac\%[e]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<stat\%[us]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<stat\%[us]\>\s*\<bar\>"
+syn match foxproCmd "^\s*\<set\>\s*\<step\>"
+syn match foxproCmd "^\s*\<set\>\s*\<stic\%[ky]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<sysm\%[enu]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<talk\>"
+syn match foxproCmd "^\s*\<set\>\s*\<text\%[merge]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<text\%[merge]\>\s*\<deli\%[miters]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<topi\%[c]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<trbe\%[tween]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<type\%[ahead]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<udfp\%[arms]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<uniq\%[ue]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<view\>"
+syn match foxproCmd "^\s*\<set\>\s*\<volu\%[me]\>"
+syn match foxproCmd "^\s*\<set\>\s*\<wind\%[ow]\>\s*\<of\>\s*\<memo\>"
+syn match foxproCmd "^\s*\<set\>\s*\<xcmd\%[file]\>"
+syn match foxproCmd "^\s*\<show\>\s*\<get\>"
+syn match foxproCmd "^\s*\<show\>\s*\<gets\>"
+syn match foxproCmd "^\s*\<show\>\s*\<menu\>"
+syn match foxproCmd "^\s*\<show\>\s*\<obje\%[ct]\>"
+syn match foxproCmd "^\s*\<show\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<show\>\s*\<wind\%[ow]\>"
+syn match foxproCmd "^\s*\<size\>\s*\<popu\%[p]\>"
+syn match foxproCmd "^\s*\<skip\>"
+syn match foxproCmd "^\s*\<sort\>"
+syn match foxproCmd "^\s*\<stor\%[e]\>"
+syn match foxproCmd "^\s*\<sum\>"
+syn match foxproCmd "^\s*\<susp\%[end]\>"
+syn match foxproCmd "^\s*\<tota\%[l]\>"
+syn match foxproCmd "^\s*\<type\>"
+syn match foxproCmd "^\s*\<unlo\%[ck]\>"
+syn match foxproCmd "^\s*\<upda\%[te]\>"
+syn match foxproCmd "^\s*\<use\>"
+syn match foxproCmd "^\s*\<wait\>"
+syn match foxproCmd "^\s*\<zap\>"
+syn match foxproCmd "^\s*\<zoom\>\s*\<wind\%[ow]\>"
+
+" Enclosed Block
+syn match foxproEnBlk "^\s*\<do\>\s*\<case\>"
+syn match foxproEnBlk "^\s*\<case\>"
+syn match foxproEnBlk "^\s*\<othe\%[rwise]\>"
+syn match foxproEnBlk "^\s*\<endc\%[ase]\>"
+syn match foxproEnBlk "^\s*\<do\>\s*\<whil\%[e]\>"
+syn match foxproEnBlk "^\s*\<endd\%[o]\>"
+syn match foxproEnBlk "^\s*\<for\>"
+syn match foxproEnBlk "^\s*\<endf\%[or]\>"
+syn match foxproEnBlk "^\s*\<next\>"
+syn match foxproEnBlk "^\s*\<if\>"
+syn match foxproEnBlk "^\s*\<else\>"
+syn match foxproEnBlk "^\s*\<endi\%[f]\>"
+syn match foxproEnBlk "^\s*\<prin\%[tjob]\>"
+syn match foxproEnBlk "^\s*\<endp\%[rintjob]\>"
+syn match foxproEnBlk "^\s*\<scan\>"
+syn match foxproEnBlk "^\s*\<ends\%[can]\>"
+syn match foxproEnBlk "^\s*\<text\>"
+syn match foxproEnBlk "^\s*\<endt\%[ext]\>"
+
+" System Variables
+syn keyword foxproSysVar _alignment _assist _beautify _box _calcmem _calcvalue
+syn keyword foxproSysVar _cliptext _curobj _dblclick _diarydate _dos _foxdoc
+syn keyword foxproSysVar _foxgraph _gengraph _genmenu _genpd _genscrn _genxtab
+syn keyword foxproSysVar _indent _lmargin _mac _mline _padvance _pageno _pbpage
+syn keyword foxproSysVar _pcolno _pcopies _pdriver _pdsetup _pecode _peject _pepage
+syn keyword foxproSysVar _plength _plineno _ploffset _ppitch _pquality _pretext
+syn keyword foxproSysVar _pscode _pspacing _pwait _rmargin _shell _spellchk
+syn keyword foxproSysVar _startup _tabs _tally _text _throttle _transport _unix
+syn keyword foxproSysVar _windows _wrap
+
+" Strings
+syn region foxproString start=+"+ end=+"+ oneline
+syn region foxproString start=+'+ end=+'+ oneline
+syn region foxproString start=+\[+ end=+\]+ oneline
+
+" Constants
+syn match foxproConst "\.t\."
+syn match foxproConst "\.f\."
+
+"integer number, or floating point number without a dot and with "f".
+syn match foxproNumber "\<[0-9]\+\>"
+"floating point number, with dot, optional exponent
+syn match foxproFloat "\<[0-9]\+\.[0-9]*\(e[-+]\=[0-9]\+\)\=\>"
+"floating point number, starting with a dot, optional exponent
+syn match foxproFloat "\.[0-9]\+\(e[-+]\=[0-9]\+\)\=\>"
+"floating point number, without dot, with exponent
+syn match foxproFloat "\<[0-9]\+e[-+]\=[0-9]\+\>"
+
+syn match foxproComment "^\s*\*.*"
+syn match foxproComment "&&.*"
+
+"catch errors caused by wrong parenthesis
+syn region foxproParen transparent start='(' end=')' contains=ALLBUT,foxproParenErr
+syn match foxproParenErr ")"
+
+syn sync minlines=1 maxlines=3
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "foxpro"
diff --git a/runtime/syntax/fpcmake.vim b/runtime/syntax/fpcmake.vim
new file mode 100644
index 0000000..bbc6f1d
--- /dev/null
+++ b/runtime/syntax/fpcmake.vim
@@ -0,0 +1,58 @@
+" Vim syntax file
+" Language: Free Pascal Makefile Definition Files
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Apr 23
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/make.vim
+
+" NOTE: using start-of-line anchored syn-match groups is simpler than other
+" alternatives when interacting with the sourced make.vim syntax groups
+
+" Sections
+syn region fpcmakeSection matchgroup=fpcmakeSectionDelimiter start="^\s*\[" end="]" contains=fpcmakeSectionName
+
+syn keyword fpcmakeSectionName contained clean compiler default dist install
+syn keyword fpcmakeSectionName contained lib package prerules require rules
+syn keyword fpcmakeSectionName contained shared target
+
+" [clean]
+syn match fpcmakeRule "^\s*\(units\|files\)\>"
+" [compiler]
+syn match fpcmakeRule "^\s*\(options\|version\|unitdir\|librarydir\|objectdir\)\>"
+syn match fpcmakeRule "^\s*\(targetdir\|sourcedir\|unittargetdir\|includedir\)\>"
+" [default]
+syn match fpcmakeRule "^\s*\(cpu\|dir\|fpcdir\|rule\|target\)\>"
+" [dist]
+syn match fpcmakeRule "^\s*\(destdir\|zipname\|ziptarget\)\>"
+" [install]
+syn match fpcmakeRule "^\s*\(basedir\|datadir\|fpcpackage\|files\|prefix\)\>"
+syn match fpcmakeRule "^\s*\(units\)\>"
+" [package]
+syn match fpcmakeRule "^\s*\(name\|version\|main\)\>"
+" [requires]
+syn match fpcmakeRule "^\s*\(fpcmake\|packages\|libc\|nortl\|unitdir\)\>"
+syn match fpcmakeRule "^\s*\(packagedir\|tools\)\>"
+" [shared]
+syn match fpcmakeRule "^\s*\(build\|libname\|libversion\|libunits\)\>"
+" [target]
+syn match fpcmakeRule "^\s*\(dirs\|exampledirs\|examples\|loaders\|programs\)\>"
+syn match fpcmakeRule "^\s*\(rsts\|units\)\>"
+
+" Comments
+syn keyword fpcmakeTodo TODO FIXME XXX contained
+syn match fpcmakeComment "#.*" contains=fpcmakeTodo,@Spell
+
+" Default highlighting
+hi def link fpcmakeSectionDelimiter Delimiter
+hi def link fpcmakeSectionName Type
+hi def link fpcmakeComment Comment
+hi def link fpcmakeTodo Todo
+hi def link fpcmakeRule Identifier
+
+let b:current_syntax = "fpcmake"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/syntax/framescript.vim b/runtime/syntax/framescript.vim
new file mode 100644
index 0000000..8b16d04
--- /dev/null
+++ b/runtime/syntax/framescript.vim
@@ -0,0 +1,491 @@
+" Vim syntax file
+" Language: FrameScript v4.0
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-02-22
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match framescriptOperator
+ \ '[+*/%=-]\|[><]=\=\|#[&|]'
+
+syn keyword framescriptTodo
+ \ contained
+ \ TODO FIXME XXX NOTE
+
+syn cluster framescriptCommentGroup
+ \ contains=
+ \ framescriptTodo,
+ \ @Spell
+
+syn match framescriptComment
+ \ display
+ \ contains=@framescriptCommentGroup
+ \ '//.*$'
+
+syn region framescriptComment
+ \ contains=@framescriptCommentGroup
+ \ matchgroup=framescriptCommentStart
+ \ start='/\*'
+ \ end='\*/'
+
+syn case ignore
+
+syn match framescriptInclude
+ \ display
+ \ contains=framescriptIncluded
+ \ "^\s*<#Include\>\s*'"
+
+syn region framescriptIncluded
+ \ contained
+ \ display
+ \ start=+'+
+ \ skip=+\\\\\|\\'+
+ \ end=+'+
+
+syn match framescriptNumbers
+ \ display
+ \ transparent
+ \ contains=
+ \ framescriptInteger,
+ \ framescriptReal,
+ \ framescriptMetric,
+ \ framescriptCharacter
+ \ '\<\d\|\.\d'
+
+syn keyword framescriptBoolean
+ \ True False
+
+syn match framescriptInteger
+ \ contained
+ \ display
+ \ '\d\+\>'
+
+syn match framescriptInteger
+ \ contained
+ \ display
+ \ '\x\+H\>'
+
+syn match framescriptInteger
+ \ contained
+ \ display
+ \ '[01]\+B\>'
+
+syn match framescriptReal
+ \ contained
+ \ display
+ \ '\d\+\.\d*\|\.\d\+\>'
+
+syn match framescriptMetric
+ \ contained
+ \ display
+ \ '\%(\d\+\%(\.\d*\)\=\|\.\d\+\)\%(pts\|in\|"\|cm\|mm\|pica\)\>'
+
+syn match framescriptCharacter
+ \ contained
+ \ display
+ \ '\d\+S\>'
+
+syn region framescriptString
+ \ contains=framescriptStringSpecialChar,@Spell
+ \ start=+'+
+ \ skip=+\\\\\|\\'+
+ \ end=+'+
+
+syn match framescriptStringSpecialChar
+ \ contained
+ \ display
+ \ "\\[\\']"
+
+syn keyword framescriptConstant
+ \ BackSlash
+ \ CharCR
+ \ CharLF
+ \ CharTAB
+ \ ClientDir
+ \ ClientName
+ \ FslVersionMajor
+ \ FslVersionMinor
+ \ InstallName
+ \ InstalledScriptList
+ \ MainScript
+ \ NULL
+ \ ObjEndOffset
+ \ ProductRevision
+ \ Quote
+ \ ThisScript
+
+syn keyword framescriptOperator
+ \ not
+ \ and
+ \ or
+
+syn keyword framescriptSessionVariables
+ \ ErrorCode
+ \ ErrorMsg
+ \ DeclareVarMode
+ \ PlatformEncodingMode
+
+syn keyword framescriptStructure
+ \ Event
+ \ EndEvent
+
+syn keyword framescriptStatement
+ \ Sub
+ \ EndSub
+ \ Run
+ \ Function
+ \ EndFunction
+ \ Set
+ \ Add
+ \ Apply
+ \ CallClient
+ \ Close
+ \ Copy
+ \ Cut
+ \ DialogBox
+ \ Delete
+ \ Demote
+ \ Display
+ \ DocCompare
+ \ Export
+ \ Find
+ \ LeaveLoop
+ \ LeaveScript
+ \ LeaveSub
+ \ LoopNext
+ \ Merge
+ \ MsgBox
+ \ Paste
+ \ PopClipboard
+ \ PushClipboard
+ \ Read
+ \ Replace
+ \ Return
+ \ Sort
+ \ Split
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptApplySubStatement skipwhite skipempty
+ \ Apply
+
+syn keyword framescriptApplySubStatement
+ \ contained
+ \ Pagelayout
+ \ TextProperties
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptClearSubStatement skipwhite skipempty
+ \ Clear
+
+syn keyword framescriptClearSubStatement
+ \ contained
+ \ ChangeBars
+ \ Text
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptCloseSubStatement skipwhite skipempty
+ \ Close
+
+syn keyword framescriptCloseSubStatement
+ \ contained
+ \ Book
+ \ Document
+ \ TextFile
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptExecSubStatement skipwhite skipempty
+ \ Exec
+
+syn keyword framescriptExecSubStatement
+ \ contained
+ \ Compile
+ \ Script
+ \ Wait
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptExecuteSubStatement skipwhite skipempty
+ \ Execute
+
+syn keyword framescriptExecuteSubStatement
+ \ contained
+ \ FrameCommand
+ \ Hypertext
+ \ StartUndoCheckPoint
+ \ EndUndoCheckPoint
+ \ ClearUndoHistory
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptGenerateSubStatement skipwhite skipempty
+ \ Generate
+
+syn keyword framescriptGenerateSubStatement
+ \ contained
+ \ Bookfile
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptGetSubStatement skipwhite skipempty
+ \ Get
+
+syn keyword framescriptGetSubStatement
+ \ contained
+ \ Member
+ \ Object
+ \ String
+ \ TextList
+ \ TextProperties
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptImportSubStatement skipwhite skipempty
+ \ Import
+
+syn keyword framescriptImportSubStatement
+ \ contained
+ \ File
+ \ Formats
+ \ ElementDefs
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptInstallSubStatement skipwhite skipempty
+ \ Install
+ \ Uninstall
+
+syn keyword framescriptInstallSubStatement
+ \ contained
+ \ ChangeBars
+ \ Text
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptNewSubStatement skipwhite skipempty
+ \ New
+
+syn keyword framescriptNewSubStatement
+ \ contained
+ \ AFrame
+ \ Footnote
+ \ Marker
+ \ TiApiClient
+ \ Variable
+ \ XRef
+ \ FormatChangeList
+ \ FormatRule
+ \ FmtRuleClause
+ \ Arc
+ \ Ellipse
+ \ Flow
+ \ Group
+ \ Inset
+ \ Line
+ \ Math
+ \ Polygon
+ \ Polyline
+ \ Rectangle
+ \ RoundRect
+ \ TextFrame
+ \ Textline
+ \ UnanchoredFrame
+ \ Command
+ \ Menu
+ \ MenuItemSeparator
+ \ Book
+ \ CharacterFormat
+ \ Color
+ \ ConditionFormat
+ \ ElementDef
+ \ FormatChangeList
+ \ MarkerType
+ \ MasterPage
+ \ ParagraphFormat
+ \ PgfFmt
+ \ ReferencePAge
+ \ RulingFormat
+ \ TableFormat
+ \ VariableFormat
+ \ XRefFormat
+ \ BodyPage
+ \ BookComponent
+ \ Paragraph
+ \ Element
+ \ Attribute
+ \ AttributeDef
+ \ AttributeList
+ \ AttributeDefList
+ \ ElementLoc
+ \ ElementRange
+ \ Table
+ \ TableRows
+ \ TableCols
+ \ Text
+ \ Integer
+ \ Real
+ \ Metric
+ \ String
+ \ Object
+ \ TextLoc
+ \ TextRange
+ \ IntList
+ \ UIntList
+ \ MetricList
+ \ StringList
+ \ PointList
+ \ TabList
+ \ PropertyList
+ \ LibVar
+ \ ScriptVar
+ \ SubVar
+ \ TextFile
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptOpenSubStatement skipwhite skipempty
+ \ Open
+
+syn keyword framescriptOpenSubStatement
+ \ contained
+ \ Document
+ \ Book
+ \ TextFile
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptPrintSubStatement skipwhite skipempty
+ \ Print
+
+syn keyword framescriptPrintSubStatement
+ \ contained
+ \ Document
+ \ Book
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptQuitSubStatement skipwhite skipempty
+ \ Quit
+
+syn keyword framescriptQuitSubStatement
+ \ contained
+ \ Session
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptRemoveSubStatement skipwhite skipempty
+ \ Remove
+
+syn keyword framescriptRemoveSubStatement
+ \ contained
+ \ Attribute
+ \ CommandObject
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptSaveSubStatement skipwhite skipempty
+ \ Save
+
+syn keyword framescriptSaveSubStatement
+ \ contained
+ \ Document
+ \ Book
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptSelectSubStatement skipwhite skipempty
+ \ Select
+
+syn keyword framescriptSelectSubStatement
+ \ contained
+ \ TableCells
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptStraddleSubStatement skipwhite skipempty
+ \ Straddle
+
+syn keyword framescriptStraddleSubStatement
+ \ contained
+ \ TableCells
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptUpdateSubStatement skipwhite skipempty
+ \ Update
+
+syn keyword framescriptUpdateSubStatement
+ \ contained
+ \ ReDisplay
+ \ Formatting
+ \ Hyphenating
+ \ ResetEquationsSettings
+ \ ResetRefFrames
+ \ RestartPgfNums
+ \ TextInset
+ \ Variables
+ \ XRefs
+ \ Book
+
+syn keyword framescriptStatement
+ \ nextgroup=framescriptWriteSubStatement skipwhite skipempty
+ \ Write
+
+syn keyword framescriptUpdateSubStatement
+ \ contained
+ \ Console
+ \ Display
+
+syn keyword framescriptRepeat
+ \ Loop
+ \ EndLoop
+
+syn keyword framescriptConditional
+ \ If
+ \ ElseIf
+ \ Else
+ \ EndIf
+
+syn keyword framescriptType
+ \ Local
+ \ GlobalVar
+
+let b:framescript_minlines = exists("framescript_minlines")
+ \ ? framescript_minlines : 15
+exec "syn sync ccomment framescriptComment minlines=" . b:framescript_minlines
+
+hi def link framescriptTodo Todo
+hi def link framescriptComment Comment
+hi def link framescriptCommentStart framescriptComment
+hi def link framescriptInclude Include
+hi def link framescriptIncluded String
+hi def link framescriptBoolean Boolean
+hi def link framescriptNumber Number
+hi def link framescriptInteger framescriptNumber
+hi def link framescriptReal framescriptNumber
+hi def link framescriptMetric framescriptNumber
+hi def link framescriptCharacter framescriptNumber
+hi def link framescriptString String
+hi def link framescriptStringSpecialChar SpecialChar
+hi def link framescriptConstant Constant
+hi def link framescriptOperator None
+hi def link framescriptSessionVariables PreProc
+hi def link framescriptStructure Structure
+hi def link framescriptStatement Statement
+hi def link framescriptSubStatement Type
+hi def link framescriptApplySubStatement framescriptSubStatement
+hi def link framescriptClearSubStatement framescriptSubStatement
+hi def link framescriptCloseSubStatement framescriptSubStatement
+hi def link framescriptExecSubStatement framescriptSubStatement
+hi def link framescriptExecuteSubStatement framescriptSubStatement
+hi def link framescriptGenerateSubStatement framescriptSubStatement
+hi def link framescriptGetSubStatement framescriptSubStatement
+hi def link framescriptImportSubStatement framescriptSubStatement
+hi def link framescriptInstallSubStatement framescriptSubStatement
+hi def link framescriptNewSubStatement framescriptSubStatement
+hi def link framescriptOpenSubStatement framescriptSubStatement
+hi def link framescriptPrintSubStatement framescriptSubStatement
+hi def link framescriptQuitSubStatement framescriptSubStatement
+hi def link framescriptRemoveSubStatement framescriptSubStatement
+hi def link framescriptSaveSubStatement framescriptSubStatement
+hi def link framescriptSelectSubStatement framescriptSubStatement
+hi def link framescriptStraddleSubStatement framescriptSubStatement
+hi def link framescriptUpdateSubStatement framescriptSubStatement
+hi def link framescriptRepeat Repeat
+hi def link framescriptConditional Conditional
+hi def link framescriptType Type
+
+let b:current_syntax = "framescript"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/freebasic.vim b/runtime/syntax/freebasic.vim
new file mode 100644
index 0000000..7549d02
--- /dev/null
+++ b/runtime/syntax/freebasic.vim
@@ -0,0 +1,674 @@
+" Vim syntax file
+" Language: FreeBASIC
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Mark Manning <markem@sim1.us>
+" Last Change: 2022 Jun 26
+"
+" Description:
+"
+" Based originally on the work done by Allan Kelly <Allan.Kelly@ed.ac.uk>
+" Updated by Mark Manning <markem@sim1.us>
+" Applied FreeBASIC support to the already excellent support
+" for standard basic syntax (like QB).
+"
+" First version based on Micro$soft QBASIC circa
+" 1989, as documented in 'Learn BASIC Now' by
+" Halvorson&Rygmyr. Microsoft Press 1989. This syntax file
+" not a complete implementation yet. Send suggestions to
+" the maintainer.
+"
+" TODO: split this into separate dialect-based files, possibly with a common base
+"
+" Quit when a (custom) syntax file was already loaded (Taken from c.vim)
+"
+if exists("b:current_syntax")
+ finish
+endif
+"
+" Dialect detection
+"
+let s:lang = freebasic#GetDialect()
+"
+" Whitespace Errors
+"
+if exists("freebasic_space_errors")
+ if !exists("freebasic_no_trail_space_error")
+ syn match freebasicSpaceError display excludenl "\s\+$"
+ endif
+ if !exists("freebasic_no_tab_space_error")
+ syn match freebasicSpaceError display " \+\t"me=e-1
+ endif
+endif
+"
+" Be sure to turn on the "case ignore" since current versions
+" of freebasic support both upper as well as lowercase
+" letters. - MEM 10/1/2006
+"
+syn case ignore
+"
+" Do the Basic variables names first. This is because it
+" is the most inclusive of the tests. Later on we change
+" this so the identifiers are split up into the various
+" types of identifiers like functions, basic commands and
+" such. MEM 9/9/2006
+"
+if s:lang =~# '\<\%(qb\|fblite\)\>'
+ syn iskeyword @,48-57,_,192-255,.
+ syn match freebasicIdentifier "\<\h\%(\w\|\.\)*\>"
+ syn match freebasicGenericFunction "\<\h\%(\w\|\.\)*\>\ze\s*("
+else
+ syn iskeyword @,48-57,_,192-255
+ syn match freebasicIdentifier "\<\h\w*\>"
+ syn match freebasicGenericFunction "\<\h\w*\>\ze\s*("
+endif
+"
+" This list of keywords is taken directly from the FreeBASIC
+" user's guide as presented by the FreeBASIC online site.
+"
+syn keyword freebasicArrays ERASE LBOUND PRESERVE REDIM UBOUND
+
+" array.bi
+syn keyword freebasicArrays ARRAYLEN ARRAYSIZE
+if s:lang == "fb"
+ syn keyword freebasicArrays ArrayConstDescriptorPtr ArrayDescriptorPtr FBARRAY
+endif
+
+if s:lang == "qb"
+ syn keyword freebasicAsm __ASM
+ syn match freebasicAsm "\<end\s\+__asm\>"
+else
+ syn keyword freebasicAsm ASM
+ syn match freebasicAsm "\<end\s\+asm\>"
+endif
+
+if s:lang == "qb"
+ syn keyword freebasicBitManipulation __BIT __BITRESET __BITSET __HIBYTE __HIWORD __LOBYTE __LOWORD
+else
+ syn keyword freebasicBitManipulation BIT BITRESET BITSET HIBYTE HIWORD LOBYTE LOWORD
+endif
+
+if s:lang != "fb"
+ syn keyword freebasicCompilerSwitches DEFDBL DEFINT DEFLNG DEFSNG DEFSTR
+endif
+if s:lang == "qb"
+ syn keyword freebasicCompilerSwitches __DEFBYTE __DEFLONGINT __DEFSHORT __DEFUBYTE __DEFUINT __DEFULONGINT __DEFUSHORT
+elseif s:lang == "fblite" || s:lang == "deprecated"
+ syn keyword freebasicCompilerSwitches DEFBYTE DEFLONGINT DEFSHORT DEFUBYTE DEFUINT DEFUILONGINT DEFUSHORT
+endif
+
+syn match freebasicCompilerSwitches "\<option\s\+\%(BASE\|BYVAL\|DYNAMIC\|ESCAPE\|EXPLICIT\|GOSUB\|NOGOSUB\)\>"
+syn match freebasicCompilerSwitches "\<option\s\+\%(NOKEYWORD\|PRIVATE\|STATIC\)\>"
+
+syn keyword freebasicData DATA READ RESTORE
+
+syn keyword freebasicProgramFlow EXIT GOTO RETURN SLEEP
+syn match freebasicProgramFlow "\<end\>"
+if s:lang == "qb"
+ syn keyword freebasicProgramFlow __SLEEP
+endif
+if s:lang == "fblite" || s:lang == "qb"
+ syn keyword freebasicProgramFlow GOSUB
+endif
+if s:lang == "fb" || s:lang == "deprecated"
+ syn keyword freebasicProgramFlow SCOPE
+ syn match freebasicProgramFlow "\<end\s\+scope\>"
+endif
+
+if s:lang == "fblite" || s:lang == "qb"
+ syn region freebasicConditional matchgroup=freebasicConditional start="\<on\>" end="\<gosub\>" transparent
+ syn region freebasicConditional matchgroup=freebasicConditional start="\<on\>" end="\<goto\>" transparent
+endif
+syn keyword freebasicConditional IF THEN ELSE ELSEIF
+if s:lang == "qb"
+ syn keyword freebasicConditional __IIF __WITH
+ syn match freebasicConditional "\<end\s\+__with\>"
+else
+ syn keyword freebasicConditional IIF WITH
+ syn match freebasicConditional "\<end\s\+with\>"
+endif
+syn match freebasicConditional "\<end\s\+if\>"
+syn match freebasicConditional "\<select\s\+case\>"
+syn match freebasicConditional "\<case\>"
+syn match freebasicConditional "\<case\s\+is\>"
+syn match freebasicConditional "\<end\s\+select\>"
+
+syn keyword freebasicConsole BEEP CLS CSRLIN LOCATE PRINT POS SPC TAB USING VIEW WIDTH
+syn match freebasicConsole "?"
+
+syn keyword freebasicDataTypes SINGLE DOUBLE INTEGER LONG
+syn match freebasicDataTypes "\<string\>"
+syn keyword freebasicDataTypes AS DIM CONST ENUM SHARED TYPE
+syn match freebasicDataTypes "\<end\s\+enum\>"
+syn match freebasicDataTypes "\<end\s\+type\>"
+if s:lang == "qb"
+ syn keyword freebasicDataTypes __BOOLEAN __BYTE __LONGINT __SHORT __UBYTE __UINTEGER __ULONG __ULONGINT __UNSIGNED __USHORT __ZSTRING
+ syn match freebasicDataTypes "\<__WSTRING\>"
+ syn keyword freebasicDataTypes __EXPLICIT __EXTENDS __IMPLEMENTS __OBJECT __POINTER __PTR __SIZEOF __TYPEOF
+ syn keyword freebasicDataTypes __UNION
+ syn match freebasicDataTypes "\<end\s\+__union\>"
+else
+ syn keyword freebasicDataTypes BOOLEAN BYTE LONGINT SHORT UBYTE UINTEGER ULONG ULONGINT UNSIGNED USHORT ZSTRING
+ syn match freebasicDataTypes "\<WSTRING\>"
+ syn keyword freebasicDataTypes EXPLICIT EXTENDS IMPLEMENTS OBJECT POINTER PTR SIZEOF TYPEOF
+ syn keyword freebasicDataTypes UNION
+ syn match freebasicDataTypes "\<end\s\+union\>"
+endif
+if s:lang == "fb"
+ syn keyword freebasicDataTypes BASE CLASS THIS VAR
+endif
+
+if s:lang == "qb"
+ syn match freebasicDateTime "\<\%(date\|time\)\$"
+elseif s:lang == "fblite" || s:lang == "deprecated"
+ syn match freebasicDateTime "\<\%(date\|time\)\>\$\="
+else " fb
+ syn keyword freebasicDateTime DATE TIME
+endif
+syn keyword freebasicDateTime SETDATE SETTIME
+
+" datetime.bi
+syn keyword freebasicDateTime DATEADD DATEDIFF DATEPART DATESERIAL DATEVALUE DAY HOUR ISDATE MINUTE
+syn keyword freebasicDateTime MONTH MONTHNAME NOW SECOND TIMESERIAL TIMEVALUE
+syn keyword freebasicDateTime TIMER YEAR WEEKDAY WEEKDAYNAME
+
+syn keyword freebasicDebug STOP
+if s:lang == "qb"
+ syn keyword freebasicDebug __ASSERT __ASSERTWARN
+else
+ syn keyword freebasicDebug ASSERT ASSERTWARN
+endif
+
+syn keyword freebasicErrorHandling ERR ERL ERROR
+if s:lang == "qb"
+ syn keyword freebasicErrorHandling __ERFN __ERMN
+ syn match freebasicErrorHandling "\<on\s\+error\>"
+else
+ syn keyword freebasicErrorHandling ERFN ERMN
+ syn match freebasicErrorHandling "\<on\s\+\%(local\s\+\)\=error\>"
+endif
+if s:lang != "fb"
+ syn match freebasicErrorHandling "\<resume\%(\s\+next\)\=\>"
+endif
+
+syn match freebasicFiles "\<get\s\+#\>"
+syn match freebasicFiles "\<input\s\+#\>"
+syn match freebasicFiles "\<line\s\+input\s\+#\>"
+syn match freebasicFiles "\<put\s\+#\>"
+syn keyword freebasicFiles ACCESS APPEND BINARY CLOSE EOF FREEFILE INPUT LOC
+syn keyword freebasicFiles LOCK LOF OUTPUT RANDOM RESET SEEK UNLOCK WRITE
+syn match freebasicFiles "\<open\>"
+if s:lang == "qb"
+ syn keyword freebasicFiles __ENCODING
+else
+ syn keyword freebasicFiles ENCODING WINPUT
+ syn match freebasicFiles "\<open\s\+\%(cons\|err\|pipe\|scrn\)\>"
+endif
+
+" file.bi
+syn keyword freebasicFiles FILEATTR FILECOPY FILEDATETIME FILEEXISTS FILEFLUSH FILELEN FILESETEOF
+
+syn keyword freebasicFunctions ALIAS BYREF BYVAL CDECL DECLARE LIB NAKED PASCAL STATIC STDCALL
+syn match freebasicFunctions "\<option\ze\s*("
+
+if s:lang == "qb"
+ syn keyword freebasicFunctions __CVA_ARG __CVA_COPY __CVA_END __CVA_LIST __CVA_START
+ syn keyword freebasicFunctions __VA_ARG __VA_FIRST __VA_NEXT
+else
+ syn keyword freebasicFunctions CVA_ARG CVA_COPY CVA_END CVA_LIST CVA_START
+ syn keyword freebasicFunctions VA_ARG VA_FIRST VA_NEXT
+ syn keyword freebasicFunctions ANY OVERLOAD
+endif
+
+syn keyword freebasicFunctions FUNCTION SUB
+syn match freebasicFunctions "\<end\s\+function\>"
+syn match freebasicFunctions "\<end\s\+sub\>"
+
+if s:lang == "fb"
+ syn keyword freebasicFunctions ABSTRACT OVERRIDE VIRTUAL __THISCALL
+ syn keyword freebasicFunctions CONSTRUCTOR DESTRUCTOR OPERATOR PROPERTY
+ syn match freebasicFunctions "\<end\s\+constructor\>"
+ syn match freebasicFunctions "\<end\s\+destructor\>"
+ syn match freebasicFunctions "\<end\s\+operator\>"
+ syn match freebasicFunctions "\<end\s\+property\>"
+else
+ syn keyword freebasicFunctions CALL
+endif
+
+syn match freebasicGraphics "\<palette\s\+get\>"
+syn keyword freebasicGraphics ADD ALPHA BLOAD BSAVE CIRCLE CLS COLOR DRAW GET
+syn keyword freebasicGraphics LINE PAINT PALETTE PCOPY PMAP POINT
+syn keyword freebasicGraphics PRESET PSET PUT SCREEN
+syn keyword freebasicGraphics TRANS WINDOW
+if s:lang == "qb"
+ syn keyword freebasicGraphics __FLIP __IMAGECONVERTROW __IMAGECREATE __IMAGEDESTROY __IMAGEINFO __POINTCOORD
+ syn keyword freebasicGraphics __RGB __RGBA __SCREENCOPY __SCREENCONTROL __SCREENEVENT __SCREENGLPROC __SCREENINFO
+ syn keyword freebasicGraphics __SCREENLIST __SCREENLOCK __SCREENPTR __SCREENRES __SCREENSET __SCREENSYNC
+ syn keyword freebasicGraphics __SCREENUNLOCK __WINDOWTITLE
+else
+ syn keyword freebasicGraphics CUSTOM
+ syn keyword freebasicGraphics FLIP IMAGECONVERTROW IMAGECREATE IMAGEDESTROY IMAGEINFO POINTCOORD
+ syn keyword freebasicGraphics RGB RGBA SCREENCOPY SCREENCONTROL SCREENEVENT SCREENGLPROC SCREENINFO
+ syn keyword freebasicGraphics SCREENLIST SCREENLOCK SCREENPTR SCREENRES SCREENSET SCREENSYNC
+ syn keyword freebasicGraphics SCREENUNLOCK WINDOWTITLE
+endif
+
+if s:lang != "qb"
+ syn match freebasicHardware "\<open\s\+\%(com\|lpt\)\>"
+endif
+syn keyword freebasicHardware INP OUT WAIT LPOS LPRINT
+
+syn keyword freebasicMath ABS ATN COS EXP FIX FRAC INT LOG MOD RANDOMIZE RND SGN SIN SQR TAN
+
+if s:lang == "qb"
+ syn keyword freebasicMath __ACOS __ASIN __ATAN2
+else
+ syn keyword freebasicMath ACOS ASIN ATAN2
+endif
+
+if s:lang == "qb"
+ syn keyword freebasicMemory __ALLOCATE __CALLOCATE __DEALLOCATE __REALLOCATE
+else
+ syn keyword freebasicMemory ALLOCATE CALLOCATE DEALLOCATE REALLOCATE
+ syn keyword freebasicMemory PEEK POKE CLEAR FB_MEMCOPY FB_MEMCOPYCLEAR FB_MEMMOVE SWAP SADD
+ syn keyword freebasicMemory FIELD FRE
+endif
+
+syn keyword freebasicMisc LET TO
+if s:lang == "qb"
+ syn keyword freebasicMisc __OFFSETOF
+else
+ syn keyword freebasicMisc OFFSETOF
+endif
+
+syn keyword freebasicModularizing CHAIN COMMON
+if s:lang == "fb"
+ syn keyword freebasicModularizing EXTERN
+ syn match freebasicModularizing "\<end\s\+extern\>"
+ syn keyword freebasicModularizing PROTECTED
+endif
+if s:lang == "qb"
+ syn keyword freebasicModularizing __EXPORT __IMPORT __DYLIBFREE __DYLIBLOAD __DYLIBSYMBOL
+else
+ syn keyword freebasicModularizing EXPORT IMPORT DYLIBFREE DYLIBLOAD DYLIBSYMBOL
+ syn keyword freebasicModularizing PRIVATE PUBLIC
+ syn keyword freebasicModularizing NAMESPACE
+ syn match freebasicModularizing "\<end\s\+namespace\>"
+endif
+
+if s:lang != "qb"
+ syn keyword freebasicMultithreading MUTEXCREATE MUTEXDESTROY MUTEXLOCK MUTEXUNLOCK THREADCREATE THREADWAIT
+ syn keyword freebasicMultithreading CONDBROADCAST CONDCREATE CONDDESTROY CONDSIGNAL CONDWAIT
+ syn keyword freebasicMultithreading THREADCALL THREADDETACH THREADSELF
+endif
+
+syn keyword freebasicShell CHDIR KILL NAME MKDIR RMDIR RUN SETENVIRON
+if s:lang == "qb"
+ syn keyword freebasicShell __CURDIR __DIR __EXEC __EXEPATH
+ syn match freebasicString "\<\%(command\|environ\)\$"
+else
+ " fbio.bi
+ syn keyword freebasicShell ISREDIRECTED
+ syn keyword freebasicShell CURDIR DIR EXEC EXEPATH
+ syn match freebasicString "\<\%(command\|environ\)\>\$\="
+endif
+
+syn keyword freebasicEnviron SHELL SYSTEM
+
+syn keyword freebasicLoops FOR LOOP WHILE WEND DO STEP UNTIL NEXT
+if s:lang == "qb"
+ syn keyword freebasicLoops __CONTINUE
+else
+ syn keyword freebasicLoops CONTINUE
+endif
+"
+" File numbers
+"
+syn match freebasicFilenumber "#\d\+"
+syn match freebasicFilenumber "#\a[[:alpha:].]*[%&!#]\="
+
+syn match freebasicMetacommand "$\s*\%(dynamic\|static\)"
+syn match freebasicMetacommand "$\s*include\s*\%(once\)\=\s*:\s*'[^']\+'"
+syn match freebasicMetacommand '$\s*include\s*\%(once\)\=\s*:\s*"[^"]\+"'
+syn match freebasicMetacommand '$\s*lang\s*:\s*"[^"]\+"'
+"
+" Intrinsic defines
+"
+syn keyword freebasicPredefined __DATE__ __DATE_ISO__
+syn keyword freebasicPredefined __FB_64BIT__ __FB_ARGC__ __FB_ARG_COUNT__ __FB_ARG_EXTRACT__ __FB_ARG_LEFTOF__
+syn keyword freebasicPredefined __FB_ARG_RIGHTOF__ __FB_ARGV__ __FB_ARM__ __FB_ASM__ __FB_BACKEND__
+syn keyword freebasicPredefined __FB_BIGENDIAN__ __FB_BUILD_DATE__ __FB_BUILD_DATE_ISO__ __FB_BUILD_SHA1__
+syn keyword freebasicPredefined __FB_CYGWIN__ __FB_DARWIN__ __FB_DEBUG__ __FB_DOS__ __FB_ERR__ __FB_EVAL__
+syn keyword freebasicPredefined __FB_FPMODE__ __FB_FPU__ __FB_FREEBSD__ __FB_GCC__ __FB_GUI__ __FB_JOIN__
+syn keyword freebasicPredefined __FB_LANG__ __FB_LINUX__ __FB_MAIN__ __FB_MIN_VERSION__ __FB_MT__ __FB_NETBSD__
+syn keyword freebasicPredefined __FB_OPENBSD__ __FB_OPTIMIZE__ __FB_OPTION_BYVAL__ __FB_OPTION_DYNAMIC__
+syn keyword freebasicPredefined __FB_OPTION_ESCAPE__ __FB_OPTION_EXPLICIT__ __FB_OPTION_GOSUB__
+syn keyword freebasicPredefined __FB_OPTION_PRIVATE__ __FB_OUT_DLL__ __FB_OUT_EXE__ __FB_OUT_LIB__ __FB_OUT_OBJ__
+syn keyword freebasicPredefined __FB_PCOS__ __FB_PPC__ __FB_QUOTE__ __FB_SIGNATURE__ __FB_SSE__ __FB_UNIQUEID__
+syn keyword freebasicPredefined __FB_UNIQUEID_POP__ __FB_UNIQUEID_PUSH__ __FB_UNIX__ __FB_UNQUOTE__
+syn keyword freebasicPredefined __FB_VECTORIZE__ __FB_VER_MAJOR__ __FB_VER_MINOR__ __FB_VER_PATCH__ __FB_VERSION__
+syn keyword freebasicPredefined __FB_WIN32__ __FB_X86__ __FB_XBOX__
+syn keyword freebasicPredefined __FILE__ __FILE_NQ__ __FUNCTION__ __FUNCTION_NQ__
+syn keyword freebasicPredefined __LINE__ __PATH__ __TIME__
+"
+" Preprocessor directives
+"
+syn match freebasicInclude "#\s*\%(inclib\|include\%(\s\+once\)\=\|libpath\)\>"
+
+syn match freebasicPreProcessor "#\s*assert\>"
+syn match freebasicPreProcessor "#\s*cmdline\>"
+syn match freebasicPreProcessor "#\s*\%(define\|undef\)\>"
+syn match freebasicPreProcessor "#\s*\%(if\|ifdef\|ifndef\|else\|elseif\|endif\)\>"
+syn match freebasicPreProcessor "#\s*\%(macro\|endmacro\)\>"
+syn match freebasicPreProcessor "#\s*error\>"
+syn match freebasicPreProcessor "#\s*lang\>"
+syn match freebasicPreProcessor "#\s*line\>"
+syn match freebasicPreProcessor "#\s*pragma\%(\s\+reserve\)\=\>"
+syn match freebasicPreProcessor "#\s*\%(print\|dynamic\|static\)\>"
+syn keyword freebasicPreProcessor DEFINED
+
+syn keyword freebasicString LEN
+syn keyword freebasicString ASC
+" string.bi
+syn keyword freebasicString FORMAT
+syn keyword freebasicString VAL
+syn keyword freebasicString CVD CVI CVL CVS
+syn keyword freebasicString INSTR
+syn keyword freebasicString LSET RSET
+
+if s:lang == "qb"
+ syn match freebasicString "\<string\$\ze\s*("
+ syn match freebasicString "\<__wstring\ze\s*("
+ syn match freebasicString "\<space\$"
+ syn keyword freebasicString __WSPACE
+ syn match freebasicString "\<chr\$"
+ syn keyword freebasicString __WCHR
+ syn keyword freebasicString __WBIN __WHEX __WOCT __WSTR
+ syn match freebasicString "\<\%(bin\|hex\|oct\|str\)\$"
+ syn keyword freebasicString __VALLNG __VALINT __VALUINT __VALULNG
+ syn match freebasicString "\<\%(mkd\|mki\|mkl\|mks\)\$"
+ syn keyword freebasicString __MKLONGINT __MKSHORT
+ syn keyword freebasicString __CVLONGINT __CVSHORT
+ syn match freebasicString "\<\%(left\|mid\|right\|lcase\|ucase\|ltrim\|rtrim\)\$"
+ syn keyword freebasicString __TRIM
+ syn keyword freebasicString __INSTRREV
+else
+ syn match freebasicString "\<string\$\=\ze\s*("
+ syn match freebasicString "\<wstring\ze\s*("
+ syn match freebasicString "\<space\>\$\="
+ syn keyword freebasicString WSPACE
+ syn match freebasicString "\<chr\>\$\="
+ syn keyword freebasicString WCHR
+ syn keyword freebasicString WBIN WHEX WOCT WSTR
+ syn match freebasicString "\<\%(bin\|hex\|oct\|str\)\>\$\="
+ syn keyword freebasicString VALLNG VALINT VALUINT VALULNG
+ syn match freebasicString "\<\%(mkd\|mki\|mkl\|mks\)\>\$\="
+ syn match freebasicString "\<\%(mklongint\|mkshort\)\>\$\="
+ syn keyword freebasicString CVLONGINT CVSHORT
+ syn match freebasicString "\<\%(left\|mid\|right\|lcase\|ucase\|ltrim\|rtrim\)\>\$\="
+ syn match freebasicString "\<trim\>\$\="
+ syn keyword freebasicString INSTRREV
+endif
+
+syn keyword freebasicTypeCasting CDBL CINT CLNG CSNG
+if s:lang == "qb"
+ syn keyword freebasicTypeCasting __CAST __CBOOL __CBYTE __CLNGINT __CPTR __CSHORT __CSIGN __CYBTE __CUINT __CULNG
+ syn keyword freebasicTypeCasting __CULNGINT __CUNSG __CUSHORT
+else
+ syn keyword freebasicTypeCasting CAST CBOOL CBYTE CLNGINT CPTR CSHORT CSIGN CUBYTE CUINT CULNG CULNGINT CUNSG CUSHORT
+endif
+
+syn match freebasicUserInput "\<line\s\+input\>"
+syn keyword freebasicUserInput INKEY INPUT
+if s:lang == "qb"
+ syn keyword freebasicUserInput __GETJOYSTICK __GETKEY __GETMOUSE __MULTIKEY __SETMOUSE STICK STRIG
+else
+ syn keyword freebasicUserInput GETJOYSTICK GETKEY GETMOUSE MULTIKEY SETMOUSE
+endif
+"
+" Operators
+"
+" TODO: make these context sensitive to remove the overlap of common operators
+" : alpha operators should probably always be highlighted
+" -- DJK 20/11/19
+if s:lang == "qb"
+ syn match freebasicArithmeticOperator "\<\%(MOD\|__SHL\|__SHR\)\>"
+else
+ syn match freebasicArithmeticOperator "\<\%(MOD\|SHL\|SHR\)\>"
+endif
+syn match freebasicBitwiseOperator "\<\%(AND\|EQV\|IMP\|NOT\|OR\|XOR\)\>" " freebaseLogical?
+if s:lang == "qb"
+ syn match freebasicAssignmentOperator "\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|__SHL\|__SHR\)=\@=" " exclude trailing '='
+else
+ syn match freebasicAssignmentOperator "\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|SHL\|SHR\)=\@="
+endif
+syn match freebasicShortcircuitOperator "\<\%(ANDALSO\|ORELSE\)\>"
+if s:lang == "fb"
+ syn match freebasicMemoryOperator '\<\%(new\|delete\)\>'
+endif
+syn keyword freebasicPointerOperator STRPTR VARPTR
+if s:lang == "qb"
+ syn keyword freebasicPointerOperator __PROCPTR
+else
+ syn keyword freebasicPointerOperator PROCPTR
+endif
+syn match freebasicTypeOperator '\<is\>'
+syn match freebasicTypeOperator '\.' nextgroup=freebasicIdentifier skipwhite
+if s:lang == "fb"
+ syn match freebasicTypeOperator '->' nextgroup=freebasicIdentifier skipwhite
+endif
+
+if exists("freebasic_operators")
+ syn match freebasicAssignmentOperator "=>\=\|[-+&/\\*^]="
+ if s:lang == "qb"
+ syn match freebasicAssignmentOperator "\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|__SHL\|__SHR\)=" " include trailing '='
+ else
+ syn match freebasicAssignmentOperator "\<\%(MOD\|AND\|EQV\|IMP\|OR\|XOR\|SHL\|SHR\)="
+ endif
+ syn match freebasicArithmeticOperator "[-+&/\\*^]"
+ " syn match freebasicIndexingOperator "[[\]()]" " FIXME
+ syn match freebasicRelationalOperator "=\|<>\|<=\|<\|>=\|>"
+ syn match freebasicPreprocessorOperator '\%(^\s*\)\@<!\%(##\|#\)\|[$!]"\@='
+ syn match freebasicPointerOperator '[@*]'
+ syn match freebasicTypeOperator '\.' nextgroup=freebasicIdentifier skipwhite
+ if s:lang == "fb"
+ syn match freebasicTypeOperator '->' nextgroup=freebasicIdentifier skipwhite
+ endif
+endif
+
+syn cluster freebasicOperator contains=freebasic.*Operator
+"
+" Catch errors caused by wrong parenthesis
+"
+" syn region freebasicParen transparent start='(' end=')' contains=ALLBUT,@freebasicParenGroup
+" syn match freebasicParenError ")"
+" syn match freebasicInParen contained "[{}]"
+" syn cluster freebasicParenGroup contains=freebasicParenError,freebasicSpecial,freebasicTodo,freebasicUserCont,freebasicUserLabel,freebasicBitField
+"
+" Integer number
+"
+syn match freebasicHexError "&h\w*\>"
+syn match freebasicOctalError "&o\w*\>"
+syn match freebasicBinaryError "&b\w*\>"
+syn match freebasicHex "&h\x\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
+syn match freebasicOctal "&o\o\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
+syn match freebasicBinary "&b[10]\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
+syn match freebasicInteger "\<\d\+\%([%L&U]\|UL\|LL\|ULL\)\=\>"
+"
+" Floating point
+" See: https://www.freebasic.net/forum/viewtopic.php?t=20323
+"
+" Floating point number, with dot, optional exponent, optional suffix
+"
+syn match freebasicFloat "\<\d\+\.\d*\%([de][-+]\=\d*\)\=[f!#]\="
+"
+" Floating point number, starting with a dot, optional exponent, optional suffix
+"
+syn match freebasicFloat "\.\d\+\%([de][-+]\=\d*\)\=[f!#]\="
+"
+" Floating point number, without dot, with optional exponent, optional suffix
+"
+syn match freebasicFloat "\<\d\+\%([de][-+]\=\d*\)[f!#]\="
+"
+" Floating point number, without dot, without exponent, with suffix
+"
+syn match freebasicFloat "\<\d\+[f!#]"
+"
+" Create the clusters
+"
+syn cluster freebasicNumber contains=freebasicHex,freebasicOctal,freebasicBinary,freebasicInteger,freebasicFloat
+syn cluster freebasicNumberError contains=freebasicHexError,freebasicOctalError,freebasicBinaryError
+"
+" Booleans
+"
+if s:lang != "qb"
+ syn keyword freebasicBoolean TRUE FALSE
+endif
+"
+"
+" String and escape sequences
+"
+syn match freebasicSpecial contained "\\."
+syn match freebasicSpecial contained "\\\d\{1,3}"
+syn match freebasicSpecial contained "\\&h\x\{1,2}"
+syn match freebasicSpecial contained "\\&o\o\{1,3}"
+syn match freebasicSpecial contained "\\&b[01]\{1,8}"
+syn match freebasicSpecial contained "\\u\x\{1,4}"
+syn region freebasicString start='"' end='"' " TODO: Toggle contains on Option Escape in fblite and qb? -- DJK 20/11/19
+syn region freebasicString start='!\zs"' end='"' contains=freebasicSpecial
+syn region freebasicString start='$\zs"' end='"'
+"
+" Line labels
+"
+if s:lang =~# '\<\%(qb\|fblite\)\>'
+ syn match freebasicLineLabel "^\s*\zs\h\%(\w\|\.\)*\ze\s*:"
+else
+ syn match freebasicLineLabel "^\s*\zs\h\w*\ze\s*:"
+endif
+syn match freebasicLineNumber "^\s*\zs\d\+"
+"
+" Line continuations
+"
+" syn match freebasicLineContinuation "\<_\>" nextgroup=freebasicComment,freebasicPostLineContinuation skipwhite
+syn keyword freebasicLineContinuation _ nextgroup=freebasicComment,freebasicPostLineContinuation skipwhite
+syn match freebasicPostLineContinuation ".*" contained
+"
+"
+" Type suffixes
+if exists("freebasic_type_suffixes") && s:lang =~# '\<\%(qb\|fblite\)\>'
+ syn match freebasicTypeSuffix "\h\%(\w\|.\)*\zs[$%&!#]"
+endif
+"
+" Comments
+"
+syn keyword freebasicTodo TODO FIXME XXX NOTE contained
+syn region freebasicComment start="\<rem\>" end="$" contains=freebasicTodo,@Spell,freebasicMetacommand
+syn region freebasicComment start="'" end="$" contains=freebasicTodo,@Spell,freebasicMetacommand
+syn region freebasicDoubleComment start="''" end="$" contains=freebasicTodo,@Spell
+
+if !exists("freebasic_no_comment_fold")
+ syn region freebasicMultilineComment start="/'" end="'/" contains=freebasicTodo,@Spell,freeBasicMultilineComment fold keepend extend
+ syn region freebasicMultilineComment2 start="^\s*'.*\n\%(\s*'\)\@=" end="^\s*'.*\n\%(\s*'\)\@!" contains=freebasicComment,freebasicDoubleComment keepend fold
+else
+ syn region freebasicMultilineComment start="/'" end="'/" contains=freebasicTodo,@Spell,freeBasicMultilineComment
+endif
+
+syn case match
+
+syn sync linebreaks=1
+
+"
+" The default methods for highlighting. Can be overridden later
+"
+hi def link freebasicArrays StorageClass
+hi def link freebasicAsm Special
+hi def link freebasicBitManipulation Operator
+hi def link freebasicBoolean Boolean
+if s:lang == "fb"
+ hi def link freebasicCompilerSwitches freebasicUnsupportedError
+else
+ hi def link freebasicCompilerSwitches PreCondit
+endif
+hi def link freebasicConsole Special
+hi def link freebasicData Special
+hi def link freebasicDataTypes Type
+hi def link freebasicDateTime Type
+hi def link freebasicDebug Special
+hi def link freebasicErrorHandling Special
+hi def link freebasicFilenumber Special
+hi def link freebasicFiles Special
+hi def link freebasicFunctions Function
+hi def link freebasicGraphics Function
+hi def link freebasicHardware Special
+hi def link freebasicLoops Repeat
+hi def link freebasicMath Function
+if s:lang == "fb"
+ hi def link freebasicMetacommand freebasicUnsupportedError
+else
+ hi def link freebasicMetacommand SpecialComment
+endif
+hi def link freebasicMemory Function
+hi def link freebasicMisc Special
+hi def link freebasicModularizing Special
+hi def link freebasicMultithreading Special
+hi def link freebasicShell Special
+hi def link freebasicEnviron Special
+hi def link freebasicPointer Special
+hi def link freebasicPredefined PreProc
+hi def link freebasicPreProcessor PreProc
+hi def link freebasicProgramFlow Statement
+hi def link freebasicString String
+hi def link freebasicTypeCasting Type
+hi def link freebasicUserInput Statement
+hi def link freebasicComment Comment
+hi def link freebasicDoubleComment Comment
+hi def link freebasicMultilineComment Comment
+hi def link freebasicConditional Conditional
+hi def link freebasicError Error
+hi def link freebasicIdentifier Identifier
+hi def link freebasicInclude Include
+hi def link freebasicGenericFunction Function
+hi def link freebasicLineContinuation Special
+hi def link freebasicLineLabel LineNr
+if s:lang == "fb"
+ hi def link freebasicLineNumber freebasicUnsupportedError
+else
+ hi def link freebasicLineNumber LineNr
+endif
+hi def link freebasicMathOperator Operator
+
+hi def link freebasicHex Number
+hi def link freebasicOctal Number
+hi def link freebasicBinary Number
+hi def link freebasicInteger Number
+hi def link freebasicFloat Float
+
+hi def link freebasicHexError Error
+hi def link freebasicOctalError Error
+hi def link freebasicBinaryError Error
+
+hi def link freebasicAssignmentOperator Operator
+hi def link freebasicArithmeticOperator Operator
+hi def link freebasicIndexingOperator Operator
+hi def link freebasicRelationalOperator Operator
+hi def link freebasicBitwiseOperator Operator
+hi def link freebasicShortcircuitOperator Operator
+hi def link freebasicPreprocessorOperator Operator
+hi def link freebasicPointerOperator Operator
+if exists("freebasic_operators")
+ hi def link freebasicTypeOperator Operator
+endif
+hi def link freebasicMemoryOperator Operator
+
+hi def link freebasicSpaceError Error
+
+hi def link freebasicSpecial Special
+hi def link freebasicTodo Todo
+
+hi def link freebasicUnsupported freebasicUnsupportedError
+hi def link freebasicUnsupportedError Error
+
+unlet s:lang
+
+let b:current_syntax = "freebasic"
+
+" vim: ts=8 tw=132 fdm=marker
diff --git a/runtime/syntax/fstab.vim b/runtime/syntax/fstab.vim
new file mode 100644
index 0000000..91150bc
--- /dev/null
+++ b/runtime/syntax/fstab.vim
@@ -0,0 +1,494 @@
+" Vim syntax file
+" Language: fstab file
+" Maintainer: Radu Dineiu <radu.dineiu@gmail.com>
+" URL: https://raw.github.com/rid9/vim-fstab/master/syntax/fstab.vim
+" Last Change: 2023 Feb 19
+" Version: 1.6.3
+"
+" Credits:
+" David Necas (Yeti) <yeti@physics.muni.cz>
+" Stefano Zacchiroli <zack@debian.org>
+" Georgi Georgiev <chutz@gg3.net>
+" James Vega <jamessan@debian.org>
+" Elias Probst <mail@eliasprobst.eu>
+
+" Options:
+" let fstab_unknown_fs_errors = 1
+" highlight unknown filesystems as errors
+"
+" let fstab_unknown_device_errors = 0
+" do not highlight unknown devices as errors
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" General
+syn cluster fsGeneralCluster contains=fsComment
+syn match fsComment /\s*#.*/ contains=@Spell
+syn match fsOperator /[,=:#]/
+
+" Device
+syn cluster fsDeviceCluster contains=fsOperator,fsDeviceKeyword,fsDeviceError
+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
+syn cluster fsMountPointCluster contains=fsMountPointKeyword,fsMountPointError
+syn match fsMountPointError /\%([^ \ta-zA-Z0-9_\/#@\.-]\|\s\+\zs\w\{-}\ze\s\)/ contained
+syn keyword fsMountPointKeyword contained none swap
+
+" Type
+syn cluster fsTypeCluster contains=fsTypeKeyword,fsTypeUnknown
+syn match fsTypeUnknown /\s\+\zs\w\+/ contained
+syn keyword fsTypeKeyword contained adfs ados affs anon_inodefs atfs audiofs auto autofs bdev befs bfs btrfs binfmt_misc cd9660 ceph cfs cgroup cifs coda coherent configfs cpuset cramfs debugfs devfs devpts devtmpfs dlmfs e2compr ecryptfs efivarfs efs erofs exfat ext2 ext2fs ext3 ext4 f2fs fdesc ffs filecore fuse fuseblk fusectl gfs2 hfs hfsplus hpfs hugetlbfs iso9660 jffs jffs2 jfs kernfs lfs linprocfs mfs minix mqueue msdos ncpfs nfs nfs4 nfsd nilfs2 none ntfs ntfs3 null nwfs ocfs2 omfs overlay ovlfs pipefs portal proc procfs pstore ptyfs pvfs2 qnx4 qnx6 reiserfs ramfs romfs rpc_pipefs securityfs shm smbfs spufs squashfs sockfs sshfs std subfs swap sysfs sysv tcfs tmpfs ubifs udf ufs umap umsdos union usbfs userfs v9fs vfat virtiofs vs3fs vxfs wrapfs wvfs xenfs xenix xfs zisofs zonefs
+
+" Options
+" -------
+" Options: General
+syn cluster fsOptionsCluster contains=fsOperator,fsOptionsGeneral,fsOptionsKeywords,fsTypeUnknown
+syn match fsOptionsNumber /\d\+/
+syn match fsOptionsNumberSigned /[-+]\?\d\+/
+syn match fsOptionsNumberOctal /[0-8]\+/
+syn match fsOptionsString /[a-zA-Z0-9_-]\+/
+syn keyword fsOptionsTrueFalse true false
+syn keyword fsOptionsYesNo yes no
+syn keyword fsOptionsYN y n
+syn keyword fsOptions01 0 1
+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 managed mand move noatime noauto noclusterr noclusterw nodev nodevmtime nodiratime noexec nomand norelatime nosuid nosymfollow nouser owner pamconsole rbind rdonly relatime remount ro rq rw suid suiddir supermount sw sync union update user users wxallowed xx nofail failok lazytime
+syn match fsOptionsGeneral /_netdev/
+
+syn match fsOptionsKeywords contained /\<x-systemd\.\%(requires\|before\|after\|wanted-by\|required-by\|requires-mounts-for\|idle-timeout\|device-timeout\|mount-timeout\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<x-systemd\.\%(device-bound\|automount\|makefs\|growfs\|rw-only\)/
+syn match fsOptionsKeywords contained /\<x-initrd\.mount/
+
+syn match fsOptionsKeywords contained /\<cache=/ nextgroup=fsOptionsCache
+syn keyword fsOptionsCache yes no none strict loose fscache mmap
+
+syn match fsOptionsKeywords contained /\<dax=/ nextgroup=fsOptionsDax
+syn keyword fsOptionsDax inode never always
+
+syn match fsOptionsKeywords contained /\<errors=/ nextgroup=fsOptionsErrors
+syn keyword fsOptionsErrors contained continue panic withdraw remount-ro recover zone-ro zone-offline repair
+
+syn match fsOptionsKeywords contained /\<\%(sec\)=/ nextgroup=fsOptionsSecurityMode
+syn keyword fsOptionsSecurityMode contained none krb5 krb5i ntlm ntlmi ntlmv2 ntlmv2i ntlmssp ntlmsspi sys lkey lkeyi lkeyp spkm spkmi spkmp
+
+" Options: adfs
+syn match fsOptionsKeywords contained /\<\%([ug]id\|o\%(wn\|th\)mask\)=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<ftsuffix=/ nextgroup=fsOptions01
+
+" Options: affs
+syn match fsOptionsKeywords contained /\<mode=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<\%(set[ug]id\|reserved\)=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<\%(prefix\|volume\|root\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<bs=/ nextgroup=fsOptionsSize
+syn keyword fsOptionsKeywords contained protect usemp verbose nofilenametruncate mufs
+
+" Options: btrfs
+syn match fsOptionsKeywords contained /\<\%(subvol\|subvolid\|subvolrootid\|device\|compress\|compress-force\|check_int_print_mask\|space_cache\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<\%(max_inline\|alloc_start\|thread_pool\|metadata_ratio\|check_int_print_mask\)=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<discard=/ nextgroup=fsOptionsBtrfsDiscard
+syn keyword fsOptionsBtrfsDiscard sync async
+syn match fsOptionsKeywords contained /\<fatal_errors=/ nextgroup=fsOptionsBtrfsFatalErrors
+syn keyword fsOptionsBtrfsFatalErrors bug panic
+syn match fsOptionsKeywords contained /\<fragment=/ nextgroup=fsOptionsBtrfsFragment
+syn keyword fsOptionsBtrfsFragment data metadata all
+syn keyword fsOptionsKeywords contained degraded datasum nodatasum datacow nodatacow barrier nobarrier ssd ssd_spread nossd nossd_spread noacl treelog notreelog flushoncommit noflushoncommit space_cache nospace_cache clear_cache user_subvol_rm_allowed autodefrag noautodefrag inode_cache noinode_cache enospc_debug noenospc_debug recovery check_int check_int_data skip_balance discard nodiscard compress compress-force nologreplay rescan_uuid_tree rescue usebackuproot
+
+" Options: cd9660
+syn keyword fsOptionsKeywords contained extatt gens norrip nostrictjoilet
+
+" Options: ceph
+syn match fsOptionsKeywords contained /\<\%(mon_addr\|fsid\|rasize\|mount_timeout\|caps_max\)=/ nextgroup=fsOptionsString
+syn keyword fsOptionsKeywords contained rbytes norbytes nocrc dcache nodcache noasyncreaddir noquotadf nocopyfrom
+syn match fsOptionsKeywords contained /\<recover_session=/ nextgroup=fsOptionsCephRecoverSession
+syn keyword fsOptionsCephRecoverSession contained no clean
+
+" Options: cifs
+syn match fsOptionsKeywords contained /\<\%(user\|password\|credentials\|servernetbiosname\|servern\|netbiosname\|file_mode\|dir_mode\|ip\|domain\|prefixpath\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<\%(cruid\|backupuid\|backupgid\)=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsKeywords contained forceuid forcegid guest setuids nosetuids perm noperm dynperm strictcache rwpidforward mapchars nomapchars cifsacl nocase ignorecase nobrl sfu serverino noserverino nounix fsc multiuser posixpaths noposixpaths
+
+" Options: devpts
+" -- everything already defined
+
+" Options: ecryptfs
+syn match fsOptionsKeywords contained /\<\%(ecryptfs_\%(sig\|fnek_sig\|cipher\|key_bytes\)\|key\)=/ nextgroup=fsOptionsString
+syn keyword fsOptionsKeywords contained ecryptfs_passthrough no_sig_cache ecryptfs_encrypted_view ecryptfs_xattr
+syn match fsOptionsKeywords contained /\<ecryptfs_enable_filename_crypto=/ nextgroup=fsOptionsYN
+syn match fsOptionsKeywords contained /\<verbosity=/ nextgroup=fsOptions01
+
+" Options: erofs
+syn match fsOptionsKeywords contained /\<cache_strategy=/ nextgroup=fsOptionsEroCacheStrategy
+syn keyword fsOptionsEroCacheStrategy contained disabled readahead readaround
+
+" Options: ext2
+syn match fsOptionsKeywords contained /\<check=*/ nextgroup=@fsOptionsCheckCluster
+syn match fsOptionsKeywords contained /\<\%(res[gu]id\|sb\)=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsExt2Check contained none normal strict
+syn match fsOptionsErrors contained /\<remount-ro\>/
+syn keyword fsOptionsKeywords contained acl bsddf minixdf debug grpid bsdgroups minixdf nocheck nogrpid oldalloc orlov sysvgroups nouid32 nobh user_xattr nouser_xattr
+
+" Options: ext3
+syn match fsOptionsKeywords contained /\<journal=/ nextgroup=fsOptionsExt3Journal
+syn match fsOptionsKeywords contained /\<data=/ nextgroup=fsOptionsExt3Data
+syn match fsOptionsKeywords contained /\<data_err=/ nextgroup=fsOptionsExt3DataErr
+syn match fsOptionsKeywords contained /\<commit=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<jqfmt=/ nextgroup=fsOptionsExt3Jqfmt
+syn match fsOptionsKeywords contained /\<\%(usrjquota\|grpjquota\)=/ nextgroup=fsOptionsString
+syn keyword fsOptionsExt3Journal contained update inum
+syn keyword fsOptionsExt3Data contained journal ordered writeback
+syn keyword fsOptionsExt3DataErr contained ignore abort
+syn keyword fsOptionsExt3Jqfmt contained vfsold vfsv0 vfsv1
+syn keyword fsOptionsKeywords contained noload user_xattr nouser_xattr acl
+
+" Options: ext4
+syn match fsOptionsKeywords contained /\<journal=/ nextgroup=fsOptionsExt4Journal
+syn match fsOptionsKeywords contained /\<data=/ nextgroup=fsOptionsExt4Data
+syn match fsOptionsKeywords contained /\<barrier=/ nextgroup=fsOptions01
+syn match fsOptionsKeywords contained /\<journal_dev=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<resuid=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<resgid=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<sb=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<\%(commit\|inode_readahead_blks\|stripe\|max_batch_time\|min_batch_time\|init_itable\|max_dir_size_kb\)=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<journal_ioprio=/ nextgroup=fsOptionsExt4JournalIoprio
+syn keyword fsOptionsExt4Journal contained update inum
+syn keyword fsOptionsExt4Data contained journal ordered writeback
+syn keyword fsOptionsExt4JournalIoprio contained 0 1 2 3 4 5 6 7
+syn keyword fsOptionsKeywords contained noload extents orlov oldalloc user_xattr nouser_xattr acl noacl reservation noreservation bsddf minixdf check=none nocheck debug grpid nogroupid sysvgroups bsdgroups quota noquota grpquota usrquota bh nobh journal_checksum nojournal_checksum journal_async_commit delalloc nodelalloc auto_da_alloc noauto_da_alloc noinit_itable block_validity noblock_validity dioread_lock dioread_nolock i_version nombcache prjquota
+
+" Options: fat
+syn match fsOptionsKeywords contained /\<blocksize=/ nextgroup=fsOptionsSize
+syn match fsOptionsKeywords contained /\<\%([dfu]mask\|codepage\)=/ nextgroup=fsOptionsNumberOctal
+syn match fsOptionsKeywords contained /\%(cvf_\%(format\|option\)\|iocharset\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<check=/ nextgroup=@fsOptionsCheckCluster
+syn match fsOptionsKeywords contained /\<conv=*/ nextgroup=fsOptionsConv
+syn match fsOptionsKeywords contained /\<fat=/ nextgroup=fsOptionsFatType
+syn match fsOptionsKeywords contained /\<dotsOK=/ nextgroup=fsOptionsYesNo
+syn keyword fsOptionsFatCheck contained r n s relaxed normal strict
+syn keyword fsOptionsConv contained b t a binary text auto
+syn keyword fsOptionsFatType contained 12 16 32
+syn keyword fsOptionsKeywords contained quiet sys_immutable showexec dots nodots
+
+" Options: fuse
+syn match fsOptionsKeywords contained /\<\%(fd\|user_id\|group_id\|blksize\)=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<\%(rootmode\)=/ nextgroup=fsOptionsString
+
+" Options: hfs
+syn match fsOptionsKeywords contained /\<\%(creator\|type\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<\%(dir\|file\|\)_umask=/ nextgroup=fsOptionsNumberOctal
+syn match fsOptionsKeywords contained /\<\%(session\|part\)=/ nextgroup=fsOptionsNumber
+
+" Options: hfsplus
+syn match fsOptionsKeywords contained /\<nls=/ nextgroup=fsOptionsString
+syn keyword fsOptionsKeywords contained decompose nodecompose
+
+" Options: f2fs
+syn match fsOptionsKeywords contained /\<background_gc=/ nextgroup=fsOptionsF2fsBackgroundGc
+syn keyword fsOptionsF2fsBackgroundGc contained on off sync
+syn match fsOptionsKeywords contained /\<active_logs=/ nextgroup=fsOptionsF2fsActiveLogs
+syn keyword fsOptionsF2fsActiveLogs contained 2 4 6
+syn match fsOptionsKeywords contained /\<alloc_mode=/ nextgroup=fsOptionsF2fsAllocMode
+syn keyword fsOptionsF2fsAllocMode contained reuse default
+syn match fsOptionsKeywords contained /\<fsync_mode=/ nextgroup=fsOptionsF2fsFsyncMode
+syn keyword fsOptionsF2fsFsyncMode contained posix strict nobarrier
+syn match fsOptionsKeywords contained /\<compress_mode=/ nextgroup=fsOptionsF2fsCompressMode
+syn keyword fsOptionsF2fsCompressMode contained fs user
+syn match fsOptionsKeywords contained /\<discard_unit=/ nextgroup=fsOptionsF2fsDiscardUnit
+syn keyword fsOptionsF2fsDiscardUnit contained block segment section
+syn match fsOptionsKeywords contained /\<memory=/ nextgroup=fsOptionsF2fsMemory
+syn keyword fsOptionsF2fsMemory contained normal low
+syn match fsOptionsKeywords contained /\<\%(inline_xattr_size\|reserve_root\|fault_injection\|fault_type\|io_bits\|compress_log_size\)=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<\%(prjjquota\|test_dummy_encryption\|checkpoint\|compress_algorithm\|compress_extension\|nocompress_extension\)=/ nextgroup=fsOptionsString
+syn keyword fsOptionsKeyWords contained gc_merge nogc_merge disable_roll_forward no_heap disable_ext_identify inline_xattr noinline_xattr inline_data noinline_data inline_dentry noinline_dentry flush_merge fastboot extent_cache noextent_cache data_flush offusrjquota offgrpjquota offprjjquota test_dummy_encryption checkpoint_merge nocheckpoint_merge compress_chksum compress_cache inlinecrypt atgc
+
+" Options: ffs
+syn keyword fsOptionsKeyWords contained noperm softdep
+
+" Options: gfs2
+syn match fsOptionsKeywords contained /\<\%(lockproto\|locktable\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<\%(quota_quantum\|statfs_quantum\|statfs_percent\)=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<quota=/ nextgroup=fsOptionsGfs2Quota
+syn keyword fsOptionsGfs2Quota contained off account on
+syn keyword fsOptionsKeywords contained localcaching localflocks ignore_local_fs upgrade spectator meta
+
+" Options: hpfs
+syn match fsOptionsKeywords contained /\<case=/ nextgroup=fsOptionsHpfsCase
+syn keyword fsOptionsHpfsCase contained lower asis
+syn match fsOptionsKeywords contained /\<chkdsk=/ nextgroup=fsOptionsHpfsChkdsk
+syn keyword fsOptionsHpfsChkdsk contained no errors always
+syn match fsOptionsKeywords contained /\<eas=/ nextgroup=fsOptionsHpfsEas
+syn keyword fsOptionsHpfsEas contained no ro rw
+syn match fsOptionsKeywords contained /\<timeshift=/ nextgroup=fsOptionsNumberSigned
+
+" Options: iso9660
+syn match fsOptionsKeywords contained /\<map=/ nextgroup=fsOptionsIsoMap
+syn match fsOptionsKeywords contained /\<block=/ nextgroup=fsOptionsSize
+syn match fsOptionsKeywords contained /\<\%(session\|sbsector\|dmode\)=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsIsoMap contained n o a normal off acorn
+syn keyword fsOptionsKeywords contained norock nojoliet hide unhide cruft overriderockperm showassoc
+syn keyword fsOptionsConv contained m mtext
+
+" Options: jfs
+syn keyword fsOptionsKeywords nointegrity integrity
+
+" Options: nfs
+syn match fsOptionsKeywords contained /\<lookupcache=/ nextgroup=fsOptionsNfsLookupCache
+syn keyword fsOptionsNfsLookupCache contained all none pos positive
+syn match fsOptionsKeywords contained /\<local_lock=/ nextgroup=fsOptionsNfsLocalLock
+syn keyword fsOptionsNfsLocalLock contained all flock posix none
+syn match fsOptionsKeywords contained /\<\%(mounthost\|mountprog\|nfsprog\|namelen\|proto\|mountproto\|clientaddr\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<\%(timeo\|retrans\|[rw]size\|acregmin\|acregmax\|acdirmin\|acdirmax\|actimeo\|retry\|port\|mountport\|mountvers\|namlen\|nfsvers\|vers\|minorversion\)=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsKeywords contained bg fg soft hard intr cto ac tcp udp lock nobg nofg nosoft nohard nointr noposix nocto noac notcp noudp nolock sharecache nosharecache resvport noresvport rdirplus nordirplus
+
+" Options: nilfs2
+syn match fsOptionsKeywords contained /\<order=/ nextgroup=fsOptionsNilfs2Order
+syn keyword fsOptionsNilfs2Order contained relaxed strict
+syn match fsOptionsKeywords contained /\<\%([cp]p\)=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsKeywords contained nogc
+
+" Options: ntfs
+syn match fsOptionsKeywords contained /\<mft_zone_multiplier=/ nextgroup=fsOptionsNtfsMftZoneMultiplier
+syn keyword fsOptionsNtfsMftZoneMultiplier contained 1 2 3 4
+syn match fsOptionsKeywords contained /\<\%(posix=*\|uni_xlate=\)/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<\%(sloppy\|show_sys_files\|case_sensitive\|disable_sparse\)=/ nextgroup=fsOptionsTrueFalse
+syn keyword fsOptionsKeywords contained utf8
+
+" Options: ntfs3
+syn keyword fsOptionsKeywords contained noacsrules nohidden sparse showmeta prealloc
+
+" Options: ntfs-3g
+syn match fsOptionsKeywords contained /\<\%(usermapping\|locale\|streams_interface\)=/ nextgroup=fsOptionsString
+syn keyword fsOptionsKeywords contained permissions inherit recover norecover ignore_case remove_hiberfile hide_hid_files hide_dot_files windows_names silent no_def_opts efs_raw compression nocompression no_detach
+
+" Options: ocfs2
+syn match fsOptionsKeywords contained /\<\%(resv_level\|dir_resv_level\)=/ nextgroup=fsOptionsOcfs2ResvLevel
+syn keyword fsOptionsOcfs2ResvLevel contained 0 1 2 3 4 5 6 7 8
+syn match fsOptionsKeywords contained /\<coherency=/ nextgroup=fsOptionsOcfs2Coherency
+syn keyword fsOptionsOcfs2Coherency contained full buffered
+syn match fsOptionsKeywords contained /\<\%(atime_quantum\|preferred_slot\|localalloc\)=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsKeywords contained strictatime inode64
+
+" Options: overlay
+syn match fsOptionsKeywords contained /\<redirect_dir=/ nextgroup=fsOptionsOverlayRedirectDir
+syn keyword fsOptionsOverlayRedirectDir contained on follow off nofollow
+
+" Options: proc
+syn match fsOptionsKeywords contained /\<\%(hidepid\|subset\)=/ nextgroup=fsOptionsString
+
+" Options: qnx4
+syn match fsOptionsKeywords contained /\<bitmap=/ nextgroup=fsOptionsQnx4Bitmap
+syn keyword fsOptionsQnx4Bitmap contained always lazy nonrmv
+syn keyword fsOptionsKeywords contained grown noembed overalloc unbusy
+
+" Options: qnx6
+syn match fsOptionsKeywords contained /\<hold=/ nextgroup=fsOptionsQnx6Hold
+syn keyword fsOptionsQnx6Hold contained allow root deny
+syn match fsOptionsKeywords contained /\<sync=/ nextgroup=fsOptionsQnx6Sync
+syn keyword fsOptionsQnx6Sync contained mandatory optional none
+syn match fsOptionsKeywords contained /\<snapshot=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsKeywords contained alignio
+
+" Options: reiserfs
+syn match fsOptionsKeywords contained /\<hash=/ nextgroup=fsOptionsReiserHash
+syn match fsOptionsKeywords contained /\<resize=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsReiserHash contained rupasov tea r5 detect
+syn keyword fsOptionsKeywords contained hashed_relocation noborder nolog notail no_unhashed_relocation replayonly
+
+" Options: sshfs
+syn match fsOptionsKeywords contained /\<\%(BatchMode\|ChallengeResponseAuthentication\|CheckHostIP\|ClearAllForwardings\|Compression\|EnableSSHKeysign\|ForwardAgent\|ForwardX11\|ForwardX11Trusted\|GatewayPorts\|GSSAPIAuthentication\|GSSAPIDelegateCredentials\|HashKnownHosts\|HostbasedAuthentication\|IdentitiesOnly\|NoHostAuthenticationForLocalhost\|PasswordAuthentication\|PubkeyAuthentication\|RhostsRSAAuthentication\|RSAAuthentication\|TCPKeepAlive\|UsePrivilegedPort\)=/ nextgroup=fsOptionsYesNo
+syn match fsOptionsKeywords contained /\<\%(ControlMaster\|StrictHostKeyChecking\|VerifyHostKeyDNS\)=/ nextgroup=fsOptionsSshYesNoAsk
+syn match fsOptionsKeywords contained /\<\%(AddressFamily\|BindAddress\|Cipher\|Ciphers\|ControlPath\|DynamicForward\|EscapeChar\|GlobalKnownHostsFile\|HostKeyAlgorithms\|HostKeyAlias\|HostName\|IdentityFile\|KbdInteractiveDevices\|LocalForward\|LogLevel\|MACs\|PreferredAuthentications\|Protocol\|ProxyCommand\|RemoteForward\|RhostsAuthentication\|SendEnv\|SmartcardDevice\|User\|UserKnownHostsFile\|XAuthLocation\|comment\|workaround\|idmap\|ssh_command\|sftp_server\|fsname\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<\%(CompressionLevel\|ConnectionAttempts\|ConnectTimeout\|NumberOfPasswordPrompts\|Port\|ServerAliveCountMax\|ServerAliveInterval\|cache_timeout\|cache_X_timeout\|ssh_protocol\|directport\|max_read\|umask\|uid\|gid\|entry_timeout\|negative_timeout\|attr_timeout\)=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsKeywords contained reconnect sshfs_sync no_readahead sshfs_debug transform_symlinks allow_other allow_root nonempty default_permissions large_read hard_remove use_ino readdir_ino direct_io kernel_cache
+syn keyword fsOptionsSshYesNoAsk contained yes no ask
+
+" Options: subfs
+syn match fsOptionsKeywords contained /\<fs=/ nextgroup=fsOptionsString
+syn keyword fsOptionsKeywords contained procuid
+
+" Options: swap
+syn match fsOptionsKeywords contained /\<pri=/ nextgroup=fsOptionsNumber
+
+" Options: ubifs
+syn match fsOptionsKeywords contained /\<\%(compr\|auth_key\|auth_hash_name\)=/ nextgroup=fsOptionsString
+syn keyword fsOptionsKeywords contained bulk_read no_bulk_read chk_data_crc no_chk_data_crc
+
+" Options: tmpfs
+syn match fsOptionsKeywords contained /\<huge=/ nextgroup=fsOptionsTmpfsHuge
+syn keyword fsOptionsTmpfsHuge contained never always within_size advise deny force
+syn match fsOptionsKeywords contained /\<\%(size\|mpol\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<nr_\%(blocks\|inodes\)=/ nextgroup=fsOptionsNumber
+
+" Options: udf
+syn match fsOptionsKeywords contained /\<\%(anchor\|partition\|lastblock\|fileset\|rootdir\)=/ nextgroup=fsOptionsString
+syn keyword fsOptionsKeywords contained unhide undelete strict nostrict novrs adinicb noadinicb shortad longad
+
+" Options: ufs
+syn match fsOptionsKeywords contained /\<ufstype=/ nextgroup=fsOptionsUfsType
+syn match fsOptionsKeywords contained /\<onerror=/ nextgroup=fsOptionsUfsError
+syn keyword fsOptionsUfsType contained old hp 44bsd sun sunx86 nextstep openstep
+syn match fsOptionsUfsType contained /\<nextstep-cd\>/
+syn keyword fsOptionsUfsError contained panic lock umount repair
+
+" Options: usbfs
+syn match fsOptionsKeywords contained /\<\%(dev\|bus\|list\)\%(id\|gid\)=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<\%(dev\|bus\|list\)mode=/ nextgroup=fsOptionsNumberOctal
+
+" Options: v9fs
+syn match fsOptionsKeywords contained /\<\%(trans\)=/ nextgroup=fsOptionsV9Trans
+syn keyword fsOptionsV9Trans unix tcp fd virtio rdma
+syn match fsOptionsKeywords contained /\<debug=/ nextgroup=fsOptionsV9Debug
+syn keyword fsOptionsV9Debug 0x01 0x02 0x04 0x08 0x10 0x20 0x40 0x80 0x100 0x200 0x400 0x800
+syn match fsOptionsKeywords contained /\<version=/ nextgroup=fsOptionsV9Version
+syn keyword fsOptionsV9Version 9p2000 9p2000.u 9p2000.L
+syn match fsOptionsKeywords contained /\<\%([ua]name\|[rw]fdno\|access\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<msize=/ nextgroup=fsOptionsNumber
+syn keyword fsOptionsKeywords contained noextend dfltuid dfltgid afid nodevmap cachetag
+
+" Options: vfat
+syn match fsOptionsKeywords contained /\<shortname=/ nextgroup=fsOptionsVfatShortname
+syn keyword fsOptionsVfatShortname contained lower win95 winnt mixed
+syn match fsOptionsKeywords contained /\<nfs=/ nextgroup=fsOptionsVfatNfs
+syn keyword fsOptionsVfatNfs contained stale_rw nostale_ro
+syn match fsOptionsKeywords contained /\<\%(tz\|dos1xfloppy\)=/ nextgroup=fsOptionsString
+syn match fsOptionsKeywords contained /\<\%(allow_utime\|codepage\)=/ nextgroup=fsOptionsNumber
+syn match fsOptionsKeywords contained /\<time_offset=/ nextgroup=fsOptionsNumberSigned
+syn keyword fsOptionsKeywords contained nonumtail posix utf8 usefree flush rodir
+
+" Options: xfs
+syn match fsOptionsKeywords contained /\<logbufs=/ nextgroup=fsOptionsXfsLogBufs
+syn keyword fsOptionsXfsLogBufs contained 2 3 4 5 6 7 8
+syn match fsOptionsKeywords contained /\%(allocsize\|biosize\|logbsize\|logdev\|rtdev\|sunit\|swidth\)=/ nextgroup=fsOptionsString
+syn keyword fsOptionsKeywords contained dmapi xdsm noalign noatime noquota norecovery osyncisdsync quota usrquota uqnoenforce grpquota gqnoenforce attr2 noattr2 filestreams ikeep noikeep inode32 inode64 largeio nolargeio nouuid uquota qnoenforce gquota pquota pqnoenforce swalloc wsync
+
+" Frequency / Pass No.
+syn cluster fsFreqPassCluster contains=fsFreqPassNumber,fsFreqPassError
+syn match fsFreqPassError /\s\+\zs\%(\D.*\|\S.*\|\d\+\s\+[^012]\)\ze/ contained
+syn match fsFreqPassNumber /\d\+\s\+[012]\s*/ contained
+
+" Groups
+syn match fsDevice /^\s*\zs.\{-1,}\s/me=e-1 nextgroup=fsMountPoint contains=@fsDeviceCluster,@fsGeneralCluster
+syn match fsMountPoint /\s\+.\{-}\s/me=e-1 nextgroup=fsType contains=@fsMountPointCluster,@fsGeneralCluster contained
+syn match fsType /\s\+.\{-}\s/me=e-1 nextgroup=fsOptions contains=@fsTypeCluster,@fsGeneralCluster contained
+syn match fsOptions /\s\+.\{-}\%(\s\|$\)/ nextgroup=fsFreqPass contains=@fsOptionsCluster,@fsGeneralCluster contained
+syn match fsFreqPass /\s\+.\{-}$/ contains=@fsFreqPassCluster,@fsGeneralCluster contained
+
+" Whole line comments
+syn match fsCommentLine /^#.*$/ contains=@Spell
+
+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 fsOptionsBtrfsDiscard String
+hi def link fsOptionsBtrfsFatalErrors String
+hi def link fsOptionsBtrfsFragment String
+hi def link fsOptionsCache String
+hi def link fsOptionsCephRecoverSession String
+hi def link fsOptionsConv String
+hi def link fsOptionsDax String
+hi def link fsOptionsEroCacheStrategy String
+hi def link fsOptionsErrors String
+hi def link fsOptionsExt2Check String
+hi def link fsOptionsExt3Data String
+hi def link fsOptionsExt3DataErr String
+hi def link fsOptionsExt3Journal String
+hi def link fsOptionsExt3Jqfmt String
+hi def link fsOptionsExt4Data String
+hi def link fsOptionsExt4Journal String
+hi def link fsOptionsExt4JournalIoprio Number
+hi def link fsOptionsF2fsActiveLogs Number
+hi def link fsOptionsF2fsAllocMode String
+hi def link fsOptionsF2fsBackgroundGc String
+hi def link fsOptionsF2fsCompressMode String
+hi def link fsOptionsF2fsDiscardUnit String
+hi def link fsOptionsF2fsFsyncMode String
+hi def link fsOptionsF2fsMemory String
+hi def link fsOptionsFatCheck String
+hi def link fsOptionsFatType Number
+hi def link fsOptionsGeneral Type
+hi def link fsOptionsGfs2Quota String
+hi def link fsOptionsHpfsCase String
+hi def link fsOptionsHpfsChkdsk String
+hi def link fsOptionsHpfsEas String
+hi def link fsOptionsIsoMap String
+hi def link fsOptionsKeywords Keyword
+hi def link fsOptionsNfsLocalLock String
+hi def link fsOptionsNfsLookupCache String
+hi def link fsOptionsNilfs2Order String
+hi def link fsOptionsNtfsMftZoneMultiplier Number
+hi def link fsOptionsNumber Number
+hi def link fsOptionsNumberOctal Number
+hi def link fsOptionsNumberSigned Number
+hi def link fsOptionsOcfs2Coherency String
+hi def link fsOptionsOcfs2ResvLevel Number
+hi def link fsOptionsOverlayRedirectDir String
+hi def link fsOptionsQnx4Bitmap String
+hi def link fsOptionsQnx6Hold String
+hi def link fsOptionsQnx6Sync String
+hi def link fsOptionsReiserHash String
+hi def link fsOptionsSecurityMode String
+hi def link fsOptionsSize Number
+hi def link fsOptionsSshYesNoAsk String
+hi def link fsOptionsString String
+hi def link fsOptionsTmpfsHuge String
+hi def link fsOptionsUfsError String
+hi def link fsOptionsUfsType String
+hi def link fsOptionsV9Debug String
+hi def link fsOptionsV9Trans String
+hi def link fsOptionsV9Version String
+hi def link fsOptionsVfatNfs String
+hi def link fsOptionsVfatShortname String
+hi def link fsOptionsXfsLogBufs Number
+
+hi def link fsOptionsTrueFalse Boolean
+hi def link fsOptionsYesNo String
+hi def link fsOptionsYN String
+hi def link fsOptions01 Number
+
+let b:current_syntax = "fstab"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 noet ft=vim
diff --git a/runtime/syntax/fvwm.vim b/runtime/syntax/fvwm.vim
new file mode 100644
index 0000000..2f96bab
--- /dev/null
+++ b/runtime/syntax/fvwm.vim
@@ -0,0 +1,642 @@
+" Vim syntax file for Fvwm-2.5.22
+" Language: Fvwm{1,2} configuration file
+" Maintainer: Gautam Iyer <gi1242@users.sourceforge.net>
+" Previous Maintainer: Haakon Riiser <hakonrk@fys.uio.no>
+" Last Change: Sat 29 Sep 2007 11:08:34 AM PDT
+"
+" Thanks to David Necas (Yeti) for adding Fvwm 2.4 support.
+"
+" 2006-05-09 gi1242: Rewrote fvwm2 syntax completely. Also since fvwm1 is now
+" mostly obsolete, made the syntax file pick fvwm2 syntax by default.
+
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Fvwm configuration files are case insensitive
+syn case ignore
+
+" Identifiers in Fvwm can contain most characters, so we only
+" include the most common ones here.
+setlocal iskeyword=_,-,+,.,a-z,A-Z,48-57
+
+" Syntax items common to fvwm1 and fvwm2 config files
+syn cluster fvwmConstants contains=fvwmEnvVar,fvwmNumber
+syn match fvwmEnvVar "\$\w\+"
+syn match fvwmNumber '\v<(\d+|0x[0-9a-f]+)>'
+
+syn match fvwmModConf nextgroup=fvwmModArg "\v^\s*\*\a+"
+syn region fvwmModArg contained contains=fvwmString,fvwmRGBValue
+ \ start='.' skip='\\$' end='$'
+
+syn region fvwmString contains=fvwmBackslash start='"'
+ \ matchgroup=fvwmBackslash skip='\v\\"' end='"'
+syn region fvwmString contains=fvwmBackslash start='`'
+ \ matchgroup=fvwmBackslash skip='\v\\`' end='`'
+syn region fvwmString contains=fvwmBackslash start="'"
+ \ matchgroup=fvwmBackslash skip="\v\\'" end="'"
+syn match fvwmBackslash contained '\\[^"'`]'
+
+syn match fvwmRGBValue "#\x\{3}"
+syn match fvwmRGBValue "#\x\{6}"
+syn match fvwmRGBValue "#\x\{9}"
+syn match fvwmRGBValue "#\x\{12}"
+syn match fvwmRGBValue "rgb:\x\{1,4}/\x\{1,4}/\x\{1,4}"
+
+syn region fvwmComment contains=@Spell
+ \ start='^\s*#\s' skip='\\$' end='$'
+syn region fvwmComment start="\v^\s*#(\S|$)" skip='\\$' end='$'
+
+if (exists("b:fvwm_version") && b:fvwm_version == 1)
+ \ || (exists("use_fvwm_1") && use_fvwm_1)
+
+ "
+ " Syntax highlighting for Fvwm1 files.
+ "
+
+ " Moved from common syntax items
+ syn match fvwmModule "\<Module\s\+\w\+"he=s+6
+ syn keyword fvwmExec Exec
+ syn match fvwmPath "\<IconPath\s.*$"lc=8 contains=fvwmEnvVar
+ syn match fvwmPath "\<ModulePath\s.*$"lc=10 contains=fvwmEnvVar
+ syn match fvwmPath "\<PixmapPath\s.*$"lc=10 contains=fvwmEnvVar
+ syn match fvwmKey "\<Key\s\+\w\+"he=s+3
+
+ " fvwm1 specific items
+ syn match fvwmEnvVar "\$(\w\+)"
+ syn match fvwmWhitespace contained "\s\+"
+ syn region fvwmStyle oneline keepend
+ \ contains=fvwmString,fvwmKeyword,fvwmWhiteSpace
+ \ matchgroup=fvwmFunction
+ \ start="^\s*Style\>"hs=e-5 end="$"
+
+ syn keyword fvwmFunction AppsBackingStore AutoRaise BackingStore Beep
+ \ BoundaryWidth ButtonStyle CenterOnCirculate
+ \ CirculateDown CirculateHit CirculateSkip
+ \ CirculateSkipIcons CirculateUp ClickTime
+ \ ClickToFocus Close Cursor CursorMove
+ \ DecorateTransients Delete Desk DeskTopScale
+ \ DeskTopSize Destroy DontMoveOff
+ \ EdgeResistance EdgeScroll EndFunction
+ \ EndMenu EndPopup Focus Font Function
+ \ GotoPage HiBackColor HiForeColor Icon
+ \ IconBox IconFont Iconify IconPath Key
+ \ Lenience Lower Maximize MenuBackColor
+ \ MenuForeColor MenuStippleColor Module
+ \ ModulePath Mouse Move MWMBorders MWMButtons
+ \ MWMDecorHints MWMFunctionHints
+ \ MWMHintOverride MWMMenus NoBorder
+ \ NoBoundaryWidth Nop NoPPosition NoTitle
+ \ OpaqueMove OpaqueResize Pager PagerBackColor
+ \ PagerFont PagerForeColor PagingDefault
+ \ PixmapPath Popup Quit Raise RaiseLower
+ \ RandomPlacement Refresh Resize Restart
+ \ SaveUnders Scroll SloppyFocus SmartPlacement
+ \ StartsOnDesk StaysOnTop StdBackColor
+ \ StdForeColor Stick Sticky StickyBackColor
+ \ StickyForeColor StickyIcons
+ \ StubbornIconPlacement StubbornIcons
+ \ StubbornPlacement SuppressIcons Title
+ \ TogglePage Wait Warp WindowFont WindowList
+ \ WindowListSkip WindowsDesk WindowShade
+ \ XORvalue
+
+ " These keywords are only used after the "Style" command. To avoid
+ " name collision with several commands, they are contained.
+ syn keyword fvwmKeyword contained
+ \ BackColor BorderWidth BoundaryWidth Button
+ \ CirculateHit CirculateSkip Color DoubleClick
+ \ ForeColor Handles HandleWidth Icon IconTitle
+ \ NoBorder NoBoundaryWidth NoButton NoHandles
+ \ NoIcon NoIconTitle NoTitle Slippery
+ \ StartIconic StartNormal StartsAnyWhere
+ \ StartsOnDesk StaysOnTop StaysPut Sticky
+ \ Title WindowListHit WindowListSkip
+
+" elseif (exists("b:fvwm_version") && b:fvwm_version == 2)
+" \ || (exists("use_fvwm_2") && use_fvwm_2)
+else
+
+ "
+ " Syntax highlighting for fvwm2 files.
+ "
+ syn match fvwmEnvVar "\${\w\+}"
+ syn match fvwmEnvVar "\$\[[^]]\+\]"
+ syn match fvwmEnvVar "\$[$0-9*]"
+
+ syn match fvwmDef contains=fvwmMenuString,fvwmWhitespace
+ \ '^\s*+\s*".\{-}"'
+ syn region fvwmMenuString contains=fvwmIcon,fvwmShortcutKey
+ \ start='^\s*+\s*\zs"' skip='\v\\\\|\\\"' end='"'
+ syn region fvwmIcon contained start='\v\%\%@!' end='%'
+ syn match fvwmShortcutKey contained "&."
+
+ syn keyword fvwmModuleName FvwmAnimate FvwmAudio FvwmAuto FvwmBacker
+ \ FvwmBanner FvwmButtons FvwmCascade
+ \ FvwmCommandS FvwmConsole FvwmConsoleC
+ \ FvwmCpp FvwmDebug FvwmDragWell FvwmEvent
+ \ FvwmForm FvwmGtkDebug FvwmIconBox
+ \ FvwmIconMan FvwmIdent FvwmM4 FvwmPager
+ \ FvwmPerl FvwmProxy FvwmRearrange FvwmSave
+ \ FvwmSaveDesk FvwmScript FvwmScroll FvwmTabs
+ \ FvwmTalk FvwmTaskBar FvwmTheme FvwmTile
+ \ FvwmWharf FvwmWindowMenu FvwmWinList
+
+ " Obsolete fvwmModuleName: FvwmTheme
+
+ syn keyword fvwmKeyword AddToMenu ChangeMenuStyle CopyMenuStyle
+ \ DestroyMenu DestroyMenuStyle Menu
+ \ Popup TearMenuOff Title BugOpts BusyCursor
+ \ ClickTime ColorLimit ColormapFocus
+ \ DefaultColors DefaultColorset DefaultFont
+ \ DefaultIcon DefaultLayers Deschedule Emulate
+ \ EscapeFunc FakeClick FakeKeypress GlobalOpts
+ \ HilightColor HilightColorset IconFont
+ \ PrintInfo Repeat Schedule State WindowFont
+ \ XSync XSynchronize AnimatedMove
+ \ HideGeometryWindow Layer Lower Move
+ \ MoveToDesk MoveThreshold MoveToPage
+ \ MoveToScreen OpaqueMoveSize PlaceAgain Raise
+ \ RaiseLower ResizeMaximize ResizeMove
+ \ ResizeMoveMaximize RestackTransients
+ \ SetAnimation SnapAttraction SnapGrid
+ \ WindowsDesk XorPixmap XorValue CursorMove
+ \ FlipFocus Focus WarpToWindow Close Delete
+ \ Destroy Iconify Recapture RecaptureWindow
+ \ Refresh RefreshWindow Stick StickAcrossPages
+ \ StickAcrossDesks WindowShade
+ \ WindowShadeAnimate IgnoreModifiers
+ \ EdgeCommand EdgeLeaveCommand GnomeButton
+ \ Stroke StrokeFunc FocusStyle DestroyStyle
+ \ DestroyWindowStyle UpdateStyles AddToDecor
+ \ BorderStyle ChangeDecor DestroyDecor
+ \ UpdateDecor DesktopName DeskTopSize
+ \ EdgeResistance EdgeScroll EdgeThickness
+ \ EwmhBaseStruts EWMHNumberOfDesktops
+ \ GotoDeskAndPage GotoPage Scroll Xinerama
+ \ XineramaPrimaryScreen XineramaSls
+ \ XineramaSlsSize XineramaSlsScreens AddToFunc
+ \ Beep DestroyFunc Echo Exec ExecUseShell
+ \ Function Nop PipeRead Read SetEnv Silent
+ \ UnsetEnv Wait DestroyModuleConfig KillModule
+ \ Module ModuleListenOnly ModuleSynchronous
+ \ ModuleTimeout SendToModule Quit QuitScreen
+ \ QuitSession Restart SaveSession
+ \ SaveQuitSession KeepRc NoWindow Break
+ \ CleanupColorsets EchoFuncDefinition
+
+ " Conditional commands
+ syn keyword fvwmKeyword nextgroup=fvwmCondition skipwhite
+ \ All Any Current Next None Pick PointerWindow
+ \ Prev ThisWindow
+ syn keyword fvwmKeyword nextgroup=fvwmDirection skipwhite
+ \ Direction
+ syn keyword fvwmDirection contained nextgroup=fvwmDirection skipwhite
+ \ FromPointer
+ syn keyword fvwmDirection contained nextgroup=fvwmCondition skipwhite
+ \ North Northeast East Southeast South
+ \ Southwest West Northwest Center
+ syn region fvwmCondition contained contains=fvwmCondNames,fvwmString
+ \ matchgroup=fvwmKeyword start='(' skip=','
+ \ end=')'
+ syn keyword fvwmCondNames contained
+ \ AcceptsFocus AnyScreen CirculateHit
+ \ CirculateHitIcon CirculateHitShaded Closable
+ \ CurrentDesk CurrentGlobalPage
+ \ CurrentGlobalPageAnyDesk CurrentPage
+ \ CurrentPageAnyDesk CurrentScreen FixedSize
+ \ Focused HasHandles HasPointer Iconic
+ \ Iconifiable Maximizable Maximized
+ \ Overlapped PlacedByButton PlacedByButton3
+ \ PlacedByFvwm Raised Shaded Sticky
+ \ StickyAcrossDesks StickyAcrossPages
+ \ Transient Visible StickyIcon
+ \ StickyAcrossPagesIcon StickyAcrossDesksIcon
+
+ syn keyword fvwmCondNames contained skipwhite nextgroup=@fvwmConstants
+ \ State Layer
+
+ " Test
+ syn keyword fvwmKeyword nextgroup=fvwmTCond skipwhite
+ \ Test
+ syn region fvwmTCond contained contains=fvwmTCNames,fvwmString
+ \ matchgroup=fvwmKeyword start='(' end=')'
+ syn keyword fvwmTCNames contained
+ \ Version EnvIsSet EnvMatch EdgeHasPointer
+ \ EdgeIsActive Start Init Restart Exit Quit
+ \ ToRestart True False F R W X I
+
+ " TestRc
+ syn keyword fvwmKeyword nextgroup=fvwmTRCond skipwhite
+ \ TestRc
+ syn region fvwmTRCond contained contains=fvwmTRNames,fvwmNumber
+ \ matchgroup=fvwmKeyword start='(' end=')'
+ syn keyword fvwmTRNames contained NoMatch Match Error Break
+
+ " Colorsets
+ syn keyword fvwmKeyword nextgroup=fvwmCSArgs skipwhite
+ \ ColorSet
+ syn region fvwmCSArgs contained transparent contains=fvwmCSNames,@fvwmConstants,fvwmString,fvwmRGBValue,fvwmGradient
+ \ start='.' skip='\\$' end='$'
+ syn keyword fvwmCSNames contained
+ \ fg Fore Foreground bg Back Background hi
+ \ Hilite Hilight sh Shade Shadow fgsh Pixmap
+ \ TiledPixmap AspectPixmap RootTransparent
+ \ Shape TiledShape AspectShape Tint fgTint
+ \ bgTint Alpha fgAlpha Dither IconTint
+ \ IconAlpha NoShape Plain Translucent
+ syn match fvwmCSNames contained '\v<Transparent>'
+ syn match fvwmGradient contained '\v<[HVDBSCRY]Gradient>'
+
+ " Styles
+ syn keyword fvwmKeyword nextgroup=fvwmStyleArgs skipwhite
+ \ Style WindowStyle
+ syn region fvwmStyleArgs contained transparent contains=fvwmStyleNames,@fvwmConstants,fvwmString,fvwmRGBValue
+ \ start='.' skip='\\$' end='$'
+ syn keyword fvwmStyleNames contained
+ \ BorderWidth HandleWidth NoIcon Icon MiniIcon
+ \ IconBox IconGrid IconFill IconSize NoTitle
+ \ Title TitleAtBottom TitleAtLeft TitleAtRight
+ \ TitleAtTop LeftTitleRotatedCW
+ \ LeftTitleRotatedCCW RightTitleRotatedCCW
+ \ RightTitleRotatedCW TopTitleRotated
+ \ TopTitleNotRotated BottomTitleRotated
+ \ BottomTitleNotRotated UseTitleDecorRotation
+ \ StippledTitle StippledTitleOff
+ \ IndexedWindowName ExactWindowName
+ \ IndexedIconName ExactIconName Borders
+ \ NoHandles Handles WindowListSkip
+ \ WindowListHit CirculateSkip CirculateHit
+ \ CirculateSkipShaded CirculateHitShaded Layer
+ \ StaysOnTop StaysOnBottom StaysPut Sticky
+ \ Slippery StickyAcrossPages StickyAcrossDesks
+ \ StartIconic StartNormal Color ForeColor
+ \ BackColor Colorset HilightFore HilightBack
+ \ HilightColorset BorderColorset
+ \ HilightBorderColorset IconTitleColorset
+ \ HilightIconTitleColorset
+ \ IconBackgroundColorset IconTitleRelief
+ \ IconBackgroundRelief IconBackgroundPadding
+ \ Font IconFont StartsOnDesk StartsOnPage
+ \ StartsAnyWhere StartsOnScreen
+ \ ManualPlacementHonorsStartsOnPage
+ \ ManualPlacementIgnoresStartsOnPage
+ \ CaptureHonorsStartsOnPage
+ \ CaptureIgnoresStartsOnPage
+ \ RecaptureHonorsStartsOnPage
+ \ RecaptureIgnoresStartsOnPage
+ \ StartsOnPageIncludesTransients
+ \ StartsOnPageIgnoresTransients IconTitle
+ \ NoIconTitle MwmButtons FvwmButtons MwmBorder
+ \ FvwmBorder MwmDecor NoDecorHint MwmFunctions
+ \ NoFuncHint HintOverride NoOverride NoButton
+ \ Button ResizeHintOverride NoResizeOverride
+ \ OLDecor NoOLDecor GNOMEUseHints
+ \ GNOMEIgnoreHints StickyIcon SlipperyIcon
+ \ StickyAcrossPagesIcon StickyAcrossDesksIcon
+ \ ManualPlacement CascadePlacement
+ \ MinOverlapPlacement
+ \ MinOverlapPercentPlacement
+ \ TileManualPlacement TileCascadePlacement
+ \ MinOverlapPlacementPenalties
+ \ MinOverlapPercentPlacementPenalties
+ \ DecorateTransient NakedTransient
+ \ DontRaiseTransient RaiseTransient
+ \ DontLowerTransient LowerTransient
+ \ DontStackTransientParent
+ \ StackTransientParent SkipMapping ShowMapping
+ \ ScatterWindowGroups KeepWindowGroupsOnDesk
+ \ UseDecor UseStyle NoPPosition UsePPosition
+ \ NoUSPosition UseUSPosition
+ \ NoTransientPPosition UseTransientPPosition
+ \ NoTransientUSPosition UseTransientUSPosition
+ \ NoIconPosition UseIconPosition Lenience
+ \ NoLenience ClickToFocus SloppyFocus
+ \ MouseFocus FocusFollowsMouse NeverFocus
+ \ ClickToFocusPassesClickOff
+ \ ClickToFocusPassesClick
+ \ ClickToFocusRaisesOff ClickToFocusRaises
+ \ MouseFocusClickRaises
+ \ MouseFocusClickRaisesOff GrabFocus
+ \ GrabFocusOff GrabFocusTransientOff
+ \ GrabFocusTransient FPFocusClickButtons
+ \ FPFocusClickModifiers
+ \ FPSortWindowlistByFocus FPClickRaisesFocused
+ \ FPClickDecorRaisesFocused
+ \ FPClickIconRaisesFocused
+ \ FPClickRaisesUnfocused
+ \ FPClickDecorRaisesUnfocused
+ \ FPClickIconRaisesUnfocused FPClickToFocus
+ \ FPClickDecorToFocus FPClickIconToFocus
+ \ FPEnterToFocus FPLeaveToUnfocus
+ \ FPFocusByProgram FPFocusByFunction
+ \ FPFocusByFunctionWarpPointer FPLenient
+ \ FPPassFocusClick FPPassRaiseClick
+ \ FPIgnoreFocusClickMotion
+ \ FPIgnoreRaiseClickMotion
+ \ FPAllowFocusClickFunction
+ \ FPAllowRaiseClickFunction FPGrabFocus
+ \ FPGrabFocusTransient FPOverrideGrabFocus
+ \ FPReleaseFocus FPReleaseFocusTransient
+ \ FPOverrideReleaseFocus StartsLowered
+ \ StartsRaised IgnoreRestack AllowRestack
+ \ FixedPosition VariablePosition
+ \ FixedUSPosition VariableUSPosition
+ \ FixedPPosition VariablePPosition FixedSize
+ \ VariableSize FixedUSSize VariableUSSize
+ \ FixedPSize VariablePSize Closable
+ \ Iconifiable Maximizable
+ \ AllowMaximizeFixedSize IconOverride
+ \ NoIconOverride NoActiveIconOverride
+ \ DepressableBorder FirmBorder MaxWindowSize
+ \ IconifyWindowGroups IconifyWindowGroupsOff
+ \ ResizeOpaque ResizeOutline BackingStore
+ \ BackingStoreOff BackingStoreWindowDefault
+ \ Opacity ParentalRelativity SaveUnder
+ \ SaveUnderOff WindowShadeShrinks
+ \ WindowShadeScrolls WindowShadeSteps
+ \ WindowShadeAlwaysLazy WindowShadeBusy
+ \ WindowShadeLazy EWMHDonateIcon
+ \ EWMHDontDonateIcon EWMHDonateMiniIcon
+ \ EWMHDontDonateMiniIcon EWMHMiniIconOverride
+ \ EWMHNoMiniIconOverride
+ \ EWMHUseStackingOrderHints
+ \ EWMHIgnoreStackingOrderHints
+ \ EWMHIgnoreStateHints EWMHUseStateHints
+ \ EWMHIgnoreStrutHints EWMHIgnoreWindowType
+ \ EWMHUseStrutHints
+ \ EWMHMaximizeIgnoreWorkingArea
+ \ EWMHMaximizeUseWorkingArea
+ \ EWMHMaximizeUseDynamicWorkingArea
+ \ EWMHPlacementIgnoreWorkingArea
+ \ EWMHPlacementUseWorkingArea
+ \ EWMHPlacementUseDynamicWorkingArea
+ \ MoveByProgramMethod Unmanaged State
+ \ StippledIconTitle StickyStippledTitle
+ \ StickyStippledIconTitle
+ \ PositionPlacement
+ \ UnderMousePlacementHonorsStartsOnPage
+ \ UnderMousePlacementIgnoresStartsOnPage
+ \ MinOverlapPlacementPenalties
+ \ MinOverlapPercentPlacementPenalties
+ \ MinWindowSize StartShaded
+
+ " Cursor styles
+ syn keyword fvwmKeyword nextgroup=fvwmCursorStyle skipwhite
+ \ CursorStyle
+ syn case match
+ syn keyword fvwmCursorStyle contained
+ \ POSITION TITLE DEFAULT SYS MOVE RESIZE WAIT
+ \ MENU SELECT DESTROY TOP RIGHT BOTTOM LEFT
+ \ TOP_LEFT TOP_RIGHT BOTTOM_LEFT BOTTOM_RIGHT
+ \ TOP_EDGE RIGHT_EDGE BOTTOM_EDGE LEFT_EDGE
+ \ ROOT STROKE
+ syn case ignore
+
+ " Menu style
+ syn keyword fvwmKeyword nextgroup=fvwmMStyleArgs skipwhite
+ \ MenuStyle
+ syn region fvwmMStyleArgs contained transparent contains=fvwmMStyleNames,@fvwmConstants,fvwmString,fvwmGradient,fvwmRGBValue
+ \ start='.' skip='\\$' end='$'
+ syn keyword fvwmMStyleNames contained
+ \ Fvwm Mwm Win BorderWidth Foreground
+ \ Background Greyed HilightBack HilightBackOff
+ \ ActiveFore ActiveForeOff MenuColorset
+ \ ActiveColorset GreyedColorset Hilight3DThick
+ \ Hilight3DThin Hilight3DOff
+ \ Hilight3DThickness Animation AnimationOff
+ \ Font MenuFace PopupDelay PopupOffset
+ \ TitleWarp TitleWarpOff TitleUnderlines0
+ \ TitleUnderlines1 TitleUnderlines2
+ \ SeparatorsLong SeparatorsShort
+ \ TrianglesSolid TrianglesRelief
+ \ PopupImmediately PopupDelayed
+ \ PopdownImmediately PopdownDelayed
+ \ PopupActiveArea DoubleClickTime SidePic
+ \ SideColor PopupAsRootMenu PopupAsSubmenu
+ \ PopupIgnore PopupClose RemoveSubmenus
+ \ HoldSubmenus SubmenusRight SubmenusLeft
+ \ SelectOnRelease ItemFormat
+ \ VerticalItemSpacing VerticalTitleSpacing
+ \ AutomaticHotkeys AutomaticHotkeysOff
+ \ TitleFont TitleColorset HilightTitleBack
+
+ " Button style
+ syn keyword fvwmKeyword nextgroup=fvwmBNum skipwhite
+ \ ButtonStyle AddButtonStyle
+ syn match fvwmBNum contained
+ \ nextgroup=fvwmBState,fvwmBStyleArgs skipwhite
+ \ '\v<([0-9]|All|Left|Right|Reset)>'
+ syn keyword fvwmBState contained nextgroup=fvwmBStyleArgs skipwhite
+ \ ActiveUp ActiveDown InactiveUp InactiveDown
+ \ Active Inactive ToggledActiveUp
+ \ ToggledActiveDown ToggledInactiveUp
+ \ ToggledInactiveDown ToggledActive
+ \ ToggledInactive AllNormal AllToggled
+ \ AllActive AllInactive AllUp AllDown
+ syn region fvwmBStyleArgs contained contains=fvwmBStyleFlags,fvwmBStyleNames,fvwmGradient,fvwmRGBValue,@fvwmConstants,fvwmString
+ \ start='\S' skip='\\$' end='$'
+ syn keyword fvwmBStyleNames contained
+ \ Simple Default Solid Colorset Vector Pixmap
+ \ AdjustedPixmap ShrunkPixmap StretchedPixmap
+ \ TiledPixmap MiniIcon
+ syn keyword fvwmBStyleFlags contained
+ \ Raised Sunk Flat UseTitleStyle
+ \ UseBorderStyle
+
+ " Border style
+ syn keyword fvwmKeyword skipwhite nextgroup=fvwmBdState,fvwmBdStyleArgs
+ \ BorderStyle
+ syn keyword fvwmBdState contained skipwhite nextgroup=fvwmBdStyleArgs
+ \ Active Inactive
+ syn region fvwmBdStyleArgs contained contains=fvwmBdStyNames,fvwmBdStyFlags
+ \ start='\S' skip='\\$' end='$'
+ syn keyword fvwmBdStyNames contained
+ \ TiledPixmap Colorset
+ syn keyword fvwmBdStyFlags contained
+ \ HiddenHandles NoInset Raised Sunk Flat
+
+ " Title styles
+ syn keyword fvwmKeyword skipwhite nextgroup=fvwmTState,fvwmTStyleArgs
+ \ TitleStyle AddTitleStyle
+ syn keyword fvwmTState contained skipwhite nextgroup=fvwmTStyleArgs
+ \ ActiveUp ActiveDown InactiveUp InactiveDown
+ \ Active Inactive ToggledActiveUp
+ \ ToggledActiveDown ToggledInactiveUp
+ \ ToggledInactiveDown ToggledActive
+ \ ToggledInactive AllNormal AllToggled
+ \ AllActive AllInactive AllUp AllDown
+ syn region fvwmTStyleArgs contained contains=fvwmBStyleNames,fvwmTStyleNames,fvwmMPmapNames,fvwmTStyleFlags,fvwmGradient,fvwmRGBValue,@fvwmConstants
+ \ start='\S' skip='\\$' end='$'
+ syn keyword fvwmTStyleNames contained
+ \ MultiPixmap
+ syn keyword fvwmTStyleNames contained
+ \ LeftJustified Centered RightJustified Height
+ \ MinHeight
+ syn keyword fvwmMPmapNames contained
+ \ Main LeftMain RightMain UnderText LeftOfText
+ \ RightOfText LeftEnd RightEnd Buttons
+ \ LeftButtons RightButtons
+ syn keyword fvwmTStyleFlags contained
+ \ Raised Flat Sunk
+
+ " Button state
+ syn keyword fvwmKeyword nextgroup=fvwmBStateArgs
+ \ ButtonState
+ syn region fvwmBStateArgs contained contains=fvwmBStateTF,fvwmBStateNames
+ \ start='.' skip='\\$' end='$'
+ syn keyword fvwmBStateNames contained ActiveDown Inactive InactiveDown
+ syn keyword fvwmBStateTF contained True False
+
+ " Paths
+ syn keyword fvwmKeyword nextgroup=fvwmPath skipwhite
+ \ IconPath ImagePath LocalePath PixmapPath
+ \ ModulePath
+ syn match fvwmPath contained contains=fvwmEnvVar '\v.+$'
+
+ " Window list command
+ syn keyword fvwmKeyword nextgroup=fvwmWLArgs skipwhite
+ \ WindowList
+ syn region fvwmWLArgs contained
+ \ contains=fvwmCondition,@fvwmConstants,fvwmString,fvwmWLOpts
+ \ start='.' skip='\\$' end='$'
+ syn keyword fvwmWLOpts contained
+ \ Geometry NoGeometry NoGeometryWithInfo
+ \ NoDeskNum NoNumInDeskTitle
+ \ NoCurrentDeskTitle MaxLabelWidth width
+ \ TitleForAllDesks Function funcname Desk
+ \ desknum CurrentDesk NoIcons Icons OnlyIcons
+ \ NoNormal Normal OnlyNormal NoSticky Sticky
+ \ OnlySticky NoStickyAcrossPages
+ \ StickyAcrossPages OnlyStickyAcrossPages
+ \ NoStickyAcrossDesks StickyAcrossDesks
+ \ OnlyStickyAcrossDesks NoOnTop OnTop
+ \ OnlyOnTop NoOnBottom OnBottom OnlyOnBottom
+ \ Layer UseListSkip OnlyListSkip NoDeskSort
+ \ ReverseOrder CurrentAtEnd IconifiedAtEnd
+ \ UseIconName Alphabetic NotAlphabetic
+ \ SortByResource SortByClass NoHotkeys
+ \ SelectOnRelease
+
+ syn keyword fvwmSpecialFn StartFunction InitFunction RestartFunction
+ \ ExitFunction SessionInitFunction
+ \ SessionRestartFunction SessionExitFunction
+ \ MissingSubmenuFunction WindowListFunc
+
+ syn keyword fvwmKeyword skipwhite nextgroup=fvwmKeyWin,fvwmKeyName
+ \ Key PointerKey
+ syn region fvwmKeyWin contained skipwhite nextgroup=fvwmKeyName
+ \ start='(' end=')'
+ syn case match
+ syn match fvwmKeyName contained skipwhite nextgroup=fvwmKeyContext
+ \ '\v<([a-zA-Z0-9]|F\d+|KP_\d)>'
+ syn keyword fvwmKeyName contained skipwhite nextgroup=fvwmKeyContext
+ \ BackSpace Begin Break Cancel Clear Delete
+ \ Down End Escape Execute Find Help Home
+ \ Insert KP_Add KP_Begin KP_Decimal KP_Delete
+ \ KP_Divide KP_Down KP_End KP_Enter KP_Equal
+ \ KP_Home KP_Insert KP_Left KP_Multiply
+ \ KP_Next KP_Page_Down KP_Page_Up KP_Prior
+ \ KP_Right KP_Separator KP_Space KP_Subtract
+ \ KP_Tab KP_Up Left Linefeed Menu Mode_switch
+ \ Next Num_Lock Page_Down Page_Up Pause Print
+ \ Prior Redo Return Right script_switch
+ \ Scroll_Lock Select Sys_Req Tab Undo Up space
+ \ exclam quotedbl numbersign dollar percent
+ \ ampersand apostrophe quoteright parenleft
+ \ parenright asterisk plus comma minus period
+ \ slash colon semicolon less equal greater
+ \ question at bracketleft backslash
+ \ bracketright asciicircum underscore grave
+ \ quoteleft braceleft bar braceright
+ \ asciitilde
+
+ syn match fvwmKeyContext contained skipwhite nextgroup=fvwmKeyMods
+ \ '\v<[][RWDTS_F<^>vI0-9AM-]+>'
+ syn match fvwmKeyMods contained '\v[NCSMLA1-5]+'
+ syn case ignore
+
+ syn keyword fvwmKeyword skipwhite nextgroup=fvwmMouseWin,fvwmMouseButton
+ \ Mouse
+ syn region fvwmMouseWin contained skipwhite nextgroup=fvwmMouseButton
+ \ start='(' end=')'
+ syn match fvwmMouseButton contained skipwhite nextgroup=fvwmKeyContext
+ \ '[0-5]'
+endif
+
+" Define syntax highlighting groups
+
+"
+" Common highlighting groups
+"
+hi def link fvwmComment Comment
+hi def link fvwmEnvVar Macro
+hi def link fvwmNumber Number
+hi def link fvwmKeyword Keyword
+hi def link fvwmPath Constant
+hi def link fvwmModConf Macro
+hi def link fvwmRGBValue Constant
+hi def link fvwmString String
+hi def link fvwmBackslash SpecialChar
+
+
+"
+" Highlighting groups for fvwm1 specific items
+"
+hi def link fvwmExec fvwmKeyword
+hi def link fvwmKey fvwmKeyword
+hi def link fvwmModule fvwmKeyword
+hi def link fvwmFunction Function
+
+"
+" Highlighting groups for fvwm2 specific items
+"
+hi def link fvwmSpecialFn Type
+hi def link fvwmCursorStyle fvwmStyleNames
+hi def link fvwmStyleNames Identifier
+hi def link fvwmMStyleNames fvwmStyleNames
+hi def link fvwmCSNames fvwmStyleNames
+hi def link fvwmGradient fvwmStyleNames
+hi def link fvwmCondNames fvwmStyleNames
+hi def link fvwmTCNames fvwmStyleNames
+hi def link fvwmTRNames fvwmStyleNames
+hi def link fvwmWLOpts fvwmStyleNames
+
+hi def link fvwmBNum Number
+hi def link fvwmBState Type
+hi def link fvwmBStyleNames fvwmStyleNames
+hi def link fvwmBStyleFlags Special
+
+hi def link fvwmBStateTF Constant
+hi def link fvwmBStateNames fvwmStyleNames
+
+hi def link fvwmBdState fvwmBState
+hi def link fvwmBdStyNames fvwmStyleNames
+hi def link fvwmBdStyFlags fvwmBStyleFlags
+
+hi def link fvwmTState fvwmBState
+hi def link fvwmTStyleNames fvwmStyleNames
+hi def link fvwmMPmapNames fvwmBStyleFlags
+hi def link fvwmTStyleFlags fvwmBStyleFlags
+
+hi def link fvwmDirection fvwmBStyleFlags
+
+hi def link fvwmKeyWin Constant
+hi def link fvwmMouseWin fvwmKeyWin
+hi def link fvwmKeyName Special
+hi def link fvwmKeyContext fvwmKeyName
+hi def link fvwmKeyMods fvwmKeyName
+hi def link fvwmMouseButton fvwmKeyName
+
+hi def link fvwmMenuString String
+hi def link fvwmIcon Type
+hi def link fvwmShortcutKey SpecialChar
+
+hi def link fvwmModuleName Function
+
+let b:current_syntax = "fvwm"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/syntax/fvwm2m4.vim b/runtime/syntax/fvwm2m4.vim
new file mode 100644
index 0000000..e296273
--- /dev/null
+++ b/runtime/syntax/fvwm2m4.vim
@@ -0,0 +1,32 @@
+" Vim syntax file
+" Language: FvwmM4 preprocessed Fvwm2 configuration files
+" Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2002-06-02
+" URI: http://physics.muni.cz/~yeti/download/syntax/fvwmm4.vim
+
+" Setup
+" quit when a syntax file was already loaded
+if exists('b:current_syntax')
+ finish
+endif
+
+" Let included files know they are included
+if !exists('main_syntax')
+ let main_syntax = 'fvwm2m4'
+endif
+
+" Include M4 syntax
+runtime! syntax/m4.vim
+unlet b:current_syntax
+
+" Include Fvwm2 syntax (Fvwm1 doesn't have M4 preprocessor)
+runtime! syntax/fvwm.vim
+unlet b:current_syntax
+
+" That's all!
+let b:current_syntax = 'fvwm2m4'
+
+if main_syntax == 'fvwm2m4'
+ unlet main_syntax
+endif
+
diff --git a/runtime/syntax/gdb.vim b/runtime/syntax/gdb.vim
new file mode 100644
index 0000000..c820ba4
--- /dev/null
+++ b/runtime/syntax/gdb.vim
@@ -0,0 +1,104 @@
+" Vim syntax file
+" Language: GDB command files
+" Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" URL: http://www.fleiner.com/vim/syntax/gdb.vim
+" Last Change: 2021 Nov 15
+" Additional changes by Simon Sobisch
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword gdbInfo contained address architecture args breakpoints catch common copying dcache
+syn keyword gdbInfo contained display files float frame functions handle line
+syn keyword gdbInfo contained locals program registers scope set sharedlibrary signals
+syn keyword gdbInfo contained source sources stack symbol target terminal threads
+syn keyword gdbInfo contained syn keyword tracepoints types udot variables warranty watchpoints
+syn match gdbInfo contained "all-registers"
+
+
+syn keyword gdbStatement contained actions apply attach awatch backtrace break bt call catch cd clear collect commands
+syn keyword gdbStatement contained complete condition continue delete detach directory disable disas[semble] disp[lay] down
+syn keyword gdbStatement contained echo else enable end file finish frame handle hbreak help if ignore
+syn keyword gdbStatement contained inspect jump kill list load maintenance make next nexti ni output overlay
+syn keyword gdbStatement contained passcount path print printf ptype python pwd quit rbreak remote return run rwatch
+syn keyword gdbStatement contained search section set sharedlibrary shell show si signal skip source step stepi stepping
+syn keyword gdbStatement contained stop target tbreak tdump tfind thbreak thread tp trace tstart tstatus tstop
+syn keyword gdbStatement contained tty und[isplay] unset until up watch whatis where while ws x
+syn match gdbFuncDef "\<define\>.*"
+syn match gdbStatmentContainer "^\s*\S\+" contains=gdbStatement,gdbFuncDef
+syn match gdbStatement "^\s*info" nextgroup=gdbInfo skipwhite skipempty
+
+" some commonly used abbreviations
+syn keyword gdbStatement c cont p py
+
+syn region gdbDocument matchgroup=gdbFuncDef start="\<document\>.*$" matchgroup=gdbFuncDef end="^end\s*$"
+
+syn match gdbStatement "\<add-shared-symbol-files\>"
+syn match gdbStatement "\<add-symbol-file\>"
+syn match gdbStatement "\<core-file\>"
+syn match gdbStatement "\<dont-repeat\>"
+syn match gdbStatement "\<down-silently\>"
+syn match gdbStatement "\<exec-file\>"
+syn match gdbStatement "\<forward-search\>"
+syn match gdbStatement "\<reverse-search\>"
+syn match gdbStatement "\<save-tracepoints\>"
+syn match gdbStatement "\<select-frame\>"
+syn match gdbStatement "\<symbol-file\>"
+syn match gdbStatement "\<up-silently\>"
+syn match gdbStatement "\<while-stepping\>"
+
+syn keyword gdbSet annotate architecture args check complaints confirm editing endian
+syn keyword gdbSet environment gnutarget height history language listsize print prompt
+syn keyword gdbSet radix remotebaud remotebreak remotecache remotedebug remotedevice remotelogbase
+syn keyword gdbSet remotelogfile remotetimeout remotewritesize targetdebug variable verbose
+syn keyword gdbSet watchdog width write
+syn match gdbSet "\<auto-solib-add\>"
+syn match gdbSet "\<solib-absolute-prefix\>"
+syn match gdbSet "\<solib-search-path\>"
+syn match gdbSet "\<stop-on-solib-events\>"
+syn match gdbSet "\<symbol-reloading\>"
+syn match gdbSet "\<input-radix\>"
+syn match gdbSet "\<demangle-style\>"
+syn match gdbSet "\<output-radix\>"
+
+syn match gdbComment "^\s*#.*" contains=@Spell
+
+syn match gdbVariable "\$\K\k*"
+
+" Strings and constants
+syn region gdbString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell
+syn match gdbCharacter "'[^']*'" contains=gdbSpecialChar,gdbSpecialCharError
+syn match gdbCharacter "'\\''" contains=gdbSpecialChar
+syn match gdbCharacter "'[^\\]'"
+syn match gdbNumber "\<[0-9_]\+\>"
+syn match gdbNumber "\<0x[0-9a-fA-F_]\+\>"
+
+
+if !exists("gdb_minlines")
+ let gdb_minlines = 10
+endif
+exec "syn sync ccomment gdbComment minlines=" . gdb_minlines
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/gdmo.vim b/runtime/syntax/gdmo.vim
new file mode 100644
index 0000000..009f402
--- /dev/null
+++ b/runtime/syntax/gdmo.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: GDMO
+" (ISO-10165-4; Guidelines for the Definition of Managed Object)
+" Maintainer: Gyuman (Chester) Kim <violkim@gmail.com>
+" URL: http://classicalprogrammer.wikidot.com/local--files/vim-syntax-file-for-gdmo/gdmo.vim
+" Last change: 8th June, 2011
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" keyword definitions
+syn match gdmoCategory "MANAGED\s\+OBJECT\s\+CLASS"
+syn keyword gdmoCategory NOTIFICATION ATTRIBUTE BEHAVIOUR PACKAGE ACTION
+syn match gdmoCategory "NAME\s\+BINDING"
+syn match gdmoRelationship "DERIVED\s\+FROM"
+syn match gdmoRelationship "SUPERIOR\s\+OBJECT\s\+CLASS"
+syn match gdmoRelationship "SUBORDINATE\s\+OBJECT\s\+CLASS"
+syn match gdmoExtension "AND\s\+SUBCLASSES"
+syn match gdmoDefinition "DEFINED\s\+AS"
+syn match gdmoDefinition "REGISTERED\s\+AS"
+syn match gdmoExtension "ORDER\s\+BY"
+syn match gdmoReference "WITH\s\+ATTRIBUTE"
+syn match gdmoReference "WITH\s\+INFORMATION\s\+SYNTAX"
+syn match gdmoReference "WITH\s\+REPLY\s\+SYNTAX"
+syn match gdmoReference "WITH\s\+ATTRIBUTE\s\+SYNTAX"
+syn match gdmoExtension "AND\s\+ATTRIBUTE\s\+IDS"
+syn match gdmoExtension "MATCHES\s\+FOR"
+syn match gdmoReference "CHARACTERIZED\s\+BY"
+syn match gdmoReference "CONDITIONAL\s\+PACKAGES"
+syn match gdmoExtension "PRESENT\s\+IF"
+syn match gdmoExtension "DEFAULT\s\+VALUE"
+syn match gdmoExtension "PERMITTED\s\+VALUES"
+syn match gdmoExtension "REQUIRED\s\+VALUES"
+syn match gdmoExtension "NAMED\s\+BY"
+syn keyword gdmoReference ATTRIBUTES NOTIFICATIONS ACTIONS
+syn keyword gdmoExtension DELETE CREATE
+syn keyword gdmoExtension EQUALITY SUBSTRINGS ORDERING
+syn match gdmoExtension "REPLACE-WITH-DEFAULT"
+syn match gdmoExtension "GET"
+syn match gdmoExtension "GET-REPLACE"
+syn match gdmoExtension "ADD-REMOVE"
+syn match gdmoExtension "WITH-REFERENCE-OBJECT"
+syn match gdmoExtension "WITH-AUTOMATIC-INSTANCE-NAMING"
+syn match gdmoExtension "ONLY-IF-NO-CONTAINED-OBJECTS"
+
+
+" Strings and constants
+syn match gdmoSpecial contained "\\\d\d\d\|\\."
+syn region gdmoString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=gdmoSpecial
+syn match gdmoCharacter "'[^\\]'"
+syn match gdmoSpecialCharacter "'\\.'"
+syn match gdmoNumber "0[xX][0-9a-fA-F]\+\>"
+syn match gdmoLineComment "--.*"
+syn match gdmoLineComment "--.*--"
+
+syn match gdmoDefinition "^\s*[a-zA-Z][-a-zA-Z0-9_.\[\] \t{}]* *::="me=e-3
+syn match gdmoBraces "[{}]"
+
+syn sync ccomment gdmoComment
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "gdmo"
+
+" vim: ts=8
diff --git a/runtime/syntax/gdresource.vim b/runtime/syntax/gdresource.vim
new file mode 100644
index 0000000..7e1a251
--- /dev/null
+++ b/runtime/syntax/gdresource.vim
@@ -0,0 +1,65 @@
+" Vim syntax file for Godot resource (scenes)
+" Language: gdresource
+" Maintainer: Maxim Kim <habamax@gmail.com>
+" Filenames: *.tscn, *.tres
+" Website: https://github.com/habamax/vim-gdscript
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+syn match gdResourceNumber "\<0x\%(_\=\x\)\+\>"
+syn match gdResourceNumber "\<0b\%(_\=[01]\)\+\>"
+syn match gdResourceNumber "\<\d\%(_\=\d\)*\>"
+syn match gdResourceNumber "\<\d\%(_\=\d\)*\%(e[+-]\=\d\%(_\=\d\)*\)\=\>"
+syn match gdResourceNumber "\<\d\%(_\=\d\)*\.\%(e[+-]\=\d\%(_\=\d\)*\)\=\%(\W\|$\)\@="
+syn match gdResourceNumber "\%(^\|\W\)\@1<=\%(\d\%(_\=\d\)*\)\=\.\d\%(_\=\d\)*\%(e[+-]\=\d\%(_\=\d\)*\)\=\>"
+
+syn keyword gdResourceKeyword true false
+
+syn region gdResourceString
+ \ start=+[uU]\="+ end='"' skip='\\\\\|\\"'
+ \ contains=@Spell keepend
+
+" Section
+syn region gdResourceSection matchgroup=gdResourceSectionDelimiter
+ \ start='^\[' end=']\s*$'
+ \ oneline keepend
+ \ contains=gdResourceSectionName,gdResourceSectionAttribute
+
+syn match gdResourceSectionName '\[\@<=\S\+' contained skipwhite
+syn match gdResourceSectionAttribute '\S\+\s*=\s*\S\+'
+ \ skipwhite keepend contained
+ \ contains=gdResourceSectionAttributeName,gdResourceSectionAttributeValue
+syn match gdResourceSectionAttributeName '\S\+\ze\(\s*=\)' skipwhite contained
+syn match gdResourceSectionAttributeValue '\(=\s*\)\zs\S\+\ze' skipwhite
+ \ contained
+ \ contains=gdResourceString,gdResourceNumber,gdResourceKeyword
+
+
+" Section body
+syn match gdResourceAttribute '^\s*\S\+\s*=.*$'
+ \ skipwhite keepend
+ \ contains=gdResourceAttributeName,gdResourceAttributeValue
+
+syn match gdResourceAttributeName '\S\+\ze\(\s*=\)' skipwhite contained
+syn match gdResourceAttributeValue '\(=\s*\)\zs.*$' skipwhite
+ \ contained
+ \ contains=gdResourceString,gdResourceNumber,gdResourceKeyword
+
+
+hi def link gdResourceNumber Constant
+hi def link gdResourceKeyword Constant
+hi def link gdResourceSectionName Statement
+hi def link gdResourceSectionDelimiter Delimiter
+hi def link gdResourceSectionAttributeName Type
+hi def link gdResourceAttributeName Identifier
+hi def link gdResourceString String
+
+let b:current_syntax = "gdresource"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/syntax/gdscript.vim b/runtime/syntax/gdscript.vim
new file mode 100644
index 0000000..48af153
--- /dev/null
+++ b/runtime/syntax/gdscript.vim
@@ -0,0 +1,103 @@
+" Vim syntax file for Godot gdscript
+" Language: gdscript
+" Maintainer: Maxim Kim <habamax@gmail.com>
+" Website: https://github.com/habamax/vim-gdscript
+" Filenames: *.gd
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+syntax sync maxlines=100
+
+syn keyword gdscriptConditional if else elif match
+syn keyword gdscriptRepeat for while break continue
+
+syn keyword gdscriptOperator is as not and or in
+
+syn match gdscriptBlockStart ":\s*$"
+
+syn keyword gdscriptKeyword null self owner parent tool
+syn keyword gdscriptBoolean false true
+
+syn keyword gdscriptStatement remote master puppet remotesync mastersync puppetsync sync
+syn keyword gdscriptStatement return pass
+syn keyword gdscriptStatement static const enum
+syn keyword gdscriptStatement breakpoint assert
+syn keyword gdscriptStatement onready
+syn keyword gdscriptStatement class_name extends
+
+syn keyword gdscriptType void bool int float String contained
+syn match gdscriptType ":\s*\zs\h\w*" contained
+syn match gdscriptType "->\s*\zs\h\w*" contained
+
+syn keyword gdscriptStatement var nextgroup=gdscriptTypeDecl skipwhite
+syn keyword gdscriptStatement const nextgroup=gdscriptTypeDecl skipwhite
+syn match gdscriptTypeDecl "\h\w*\s*:\s*\h\w*" contains=gdscriptType contained skipwhite
+syn match gdscriptTypeDecl "->\s*\h\w*" contains=gdscriptType skipwhite
+
+syn keyword gdscriptStatement export nextgroup=gdscriptExportTypeDecl skipwhite
+syn match gdscriptExportTypeDecl "(.\{-}[,)]" contains=gdscriptOperator,gdscriptType contained skipwhite
+
+syn keyword gdscriptStatement setget nextgroup=gdscriptSetGet,gdscriptSetGetSeparator skipwhite
+syn match gdscriptSetGet "\h\w*" nextgroup=gdscriptSetGetSeparator display contained skipwhite
+syn match gdscriptSetGetSeparator "," nextgroup=gdscriptSetGet display contained skipwhite
+
+syn keyword gdscriptStatement class func signal nextgroup=gdscriptFunctionName skipwhite
+syn match gdscriptFunctionName "\h\w*" nextgroup=gdscriptFunctionParams display contained skipwhite
+syn match gdscriptFunctionParams "(.*)" contains=gdscriptTypeDecl display contained skipwhite
+
+syn match gdscriptNode "\$\h\w*\%(/\h\w*\)*"
+
+syn match gdscriptComment "#.*$" contains=@Spell,gdscriptTodo
+
+syn region gdscriptString matchgroup=gdscriptQuotes
+ \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
+ \ contains=gdscriptEscape,@Spell
+
+syn region gdscriptString matchgroup=gdscriptTripleQuotes
+ \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
+ \ contains=gdscriptEscape,@Spell
+
+syn match gdscriptEscape +\\[abfnrtv'"\\]+ contained
+syn match gdscriptEscape "\\$"
+
+" Numbers
+syn match gdscriptNumber "\<0x\%(_\=\x\)\+\>"
+syn match gdscriptNumber "\<0b\%(_\=[01]\)\+\>"
+syn match gdscriptNumber "\<\d\%(_\=\d\)*\>"
+syn match gdscriptNumber "\<\d\%(_\=\d\)*\%(e[+-]\=\d\%(_\=\d\)*\)\=\>"
+syn match gdscriptNumber "\<\d\%(_\=\d\)*\.\%(e[+-]\=\d\%(_\=\d\)*\)\=\%(\W\|$\)\@="
+syn match gdscriptNumber "\%(^\|\W\)\@1<=\%(\d\%(_\=\d\)*\)\=\.\d\%(_\=\d\)*\%(e[+-]\=\d\%(_\=\d\)*\)\=\>"
+
+" XXX, TODO, etc
+syn keyword gdscriptTodo TODO XXX FIXME HACK NOTE BUG contained
+
+hi def link gdscriptStatement Statement
+hi def link gdscriptKeyword Keyword
+hi def link gdscriptConditional Conditional
+hi def link gdscriptBoolean Boolean
+hi def link gdscriptOperator Operator
+hi def link gdscriptRepeat Repeat
+hi def link gdscriptSetGet Function
+hi def link gdscriptFunctionName Function
+hi def link gdscriptBuiltinStruct Typedef
+hi def link gdscriptComment Comment
+hi def link gdscriptString String
+hi def link gdscriptQuotes String
+hi def link gdscriptTripleQuotes String
+hi def link gdscriptEscape Special
+hi def link gdscriptNode PreProc
+hi def link gdscriptType Type
+hi def link gdscriptNumber Number
+hi def link gdscriptBlockStart Special
+hi def link gdscriptTodo Todo
+
+
+let b:current_syntax = "gdscript"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/syntax/gdshader.vim b/runtime/syntax/gdshader.vim
new file mode 100644
index 0000000..f0d9f7e
--- /dev/null
+++ b/runtime/syntax/gdshader.vim
@@ -0,0 +1,57 @@
+" Vim syntax file for Godot shading language
+" Language: gdshader
+" Maintainer: Maxim Kim <habamax@gmail.com>
+" Filenames: *.gdshader
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword gdshaderConditional if else switch case default
+syn keyword gdshaderRepeat for while do
+syn keyword gdshaderStatement return discard
+syn keyword gdshaderBoolean true false
+
+syn keyword gdshaderKeyword shader_type render_mode
+syn keyword gdshaderKeyword in out inout
+syn keyword gdshaderKeyword lowp mediump highp
+syn keyword gdshaderKeyword uniform varying const
+syn keyword gdshaderKeyword flat smooth
+
+syn keyword gdshaderType float vec2 vec3 vec4
+syn keyword gdshaderType uint uvec2 uvec3 uvec4
+syn keyword gdshaderType int ivec2 ivec3 ivec4
+syn keyword gdshaderType void bool
+syn keyword gdshaderType bvec2 bvec3 bvec4
+syn keyword gdshaderType mat2 mat3 mat4
+syn keyword gdshaderType sampler2D isampler2D usampler2D samplerCube
+
+syn match gdshaderMember "\v<(\.)@<=[a-z_]+\w*>"
+syn match gdshaderBuiltin "\v<[A-Z_]+[A-Z0-9_]*>"
+syn match gdshaderFunction "\v<\w*>(\()@="
+
+syn match gdshaderNumber "\v<\d+(\.)@!>"
+syn match gdshaderFloat "\v<\d*\.\d+(\.)@!>"
+syn match gdshaderFloat "\v<\d*\.=\d+(e-=\d+)@="
+syn match gdshaderExponent "\v(\d*\.=\d+)@<=e-=\d+>"
+
+syn match gdshaderComment "\v//.*$" contains=@Spell
+syn region gdshaderComment start="/\*" end="\*/" contains=@Spell
+syn keyword gdshaderTodo TODO FIXME XXX NOTE BUG HACK OPTIMIZE containedin=gdshaderComment
+
+hi def link gdshaderConditional Conditional
+hi def link gdshaderRepeat Repeat
+hi def link gdshaderStatement Statement
+hi def link gdshaderBoolean Boolean
+hi def link gdshaderKeyword Keyword
+hi def link gdshaderMember Identifier
+hi def link gdshaderBuiltin Identifier
+hi def link gdshaderFunction Function
+hi def link gdshaderType Type
+hi def link gdshaderNumber Number
+hi def link gdshaderFloat Float
+hi def link gdshaderExponent Special
+hi def link gdshaderComment Comment
+hi def link gdshaderTodo Todo
+
+let b:current_syntax = "gdshader"
diff --git a/runtime/syntax/gedcom.vim b/runtime/syntax/gedcom.vim
new file mode 100644
index 0000000..cd09e0f
--- /dev/null
+++ b/runtime/syntax/gedcom.vim
@@ -0,0 +1,53 @@
+" Vim syntax file
+" Language: Gedcom
+" Maintainer: Paul Johnson (pjcj@transeda.com)
+" Version 1.059 - 23rd December 1999
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case match
+
+syntax keyword gedcom_record ABBR ADDR ADOP ADR1 ADR2 AFN AGE AGNC ALIA ANCE
+syntax keyword gedcom_record ANCI ANUL ASSO AUTH BAPL BAPM BARM BASM BIRT BLES
+syntax keyword gedcom_record BLOB BURI CALN CAST CAUS CENS CHAN CHAR CHIL CHR
+syntax keyword gedcom_record CHRA CITY CONC CONF CONL CONT COPR CORP CREM CTRY
+syntax keyword gedcom_record DATA DEAT DESC DESI DEST DIV DIVF DSCR EDUC EMIG
+syntax keyword gedcom_record ENDL ENGA EVEN FAM FAMC FAMF FAMS FCOM FILE FORM
+syntax keyword gedcom_record GEDC GIVN GRAD HEAD HUSB IDNO IMMI INDI LANG MARB
+syntax keyword gedcom_record MARC MARL MARR MARS MEDI NATI NATU NCHI NICK NMR
+syntax keyword gedcom_record NOTE NPFX NSFX OBJE OCCU ORDI ORDN PAGE PEDI PHON
+syntax keyword gedcom_record PLAC POST PROB PROP PUBL QUAY REFN RELA RELI REPO
+syntax keyword gedcom_record RESI RESN RETI RFN RIN ROLE SEX SLGC SLGS SOUR
+syntax keyword gedcom_record SPFX SSN STAE STAT SUBM SUBN SURN TEMP TEXT TIME
+syntax keyword gedcom_record TITL TRLR TYPE VERS WIFE WILL
+syntax keyword gedcom_record DATE nextgroup=gedcom_date
+syntax keyword gedcom_record NAME nextgroup=gedcom_name
+
+syntax case ignore
+
+syntax region gedcom_id start="@" end="@" oneline contains=gedcom_ii, gedcom_in
+syntax match gedcom_ii "\I\+" contained nextgroup=gedcom_in
+syntax match gedcom_in "\d\+" contained
+syntax region gedcom_name start="" end="$" skipwhite oneline contains=gedcom_cname, gedcom_surname contained
+syntax match gedcom_cname "\i\+" contained
+syntax match gedcom_surname "/\(\i\|\s\)*/" contained
+syntax match gedcom_date "\d\{1,2}\s\+\(jan\|feb\|mar\|apr\|may\|jun\|jul\|aug\|sep\|oct\|nov\|dec\)\s\+\d\+"
+syntax match gedcom_date ".*" contained
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "gedcom"
diff --git a/runtime/syntax/gemtext.vim b/runtime/syntax/gemtext.vim
new file mode 100644
index 0000000..8c2bd29
--- /dev/null
+++ b/runtime/syntax/gemtext.vim
@@ -0,0 +1,24 @@
+" Vim syntax file
+" Language: Gemtext markup language
+" Maintainer: Suneel Freimuth <suneelfreimuth1@gmail.com>
+" Latest Revision: 2020-11-21
+" Filenames: *.gmi
+
+if exists('b:current_syntax')
+ finish
+endif
+
+syntax match Heading /^#\{1,3}.\+$/
+syntax match List /^\* /
+syntax match LinkURL /^=>\s*\S\+/
+syntax match Quote /^>.\+/
+syntax region Preformatted start=/^```/ end=/```/
+
+highlight default link Heading Special
+highlight default link List Statement
+highlight default link LinkURL Underlined
+highlight default link Quote Constant
+highlight default link Preformatted Identifier
+
+let b:current_syntax = 'gemtext'
+
diff --git a/runtime/syntax/gift.vim b/runtime/syntax/gift.vim
new file mode 100644
index 0000000..3f8d631
--- /dev/null
+++ b/runtime/syntax/gift.vim
@@ -0,0 +1,216 @@
+" Vim syntax file
+"
+" Language: Moodle GIFT (General Import Format Template)
+" Maintainer: Selim Temizer (http://selimtemizer.com)
+" Creation: November 28, 2020
+" Latest Revision: December 21, 2020
+" Note: The order of entities in this file is important!
+
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+
+setlocal conceallevel=1
+
+"-----------------------------------------------
+" GIFT entities
+
+syn match giftS "\~" contained "GIFT special characters
+syn match giftS "=" contained
+syn match giftS "#" contained
+syn match giftS "{" contained
+syn match giftS "}" contained
+syn match giftS ":" contained
+
+syn match giftES "\\\~" contained conceal cchar=~ "GIFT escaped special characters
+syn match giftES "\\=" contained conceal cchar==
+syn match giftES "\\#" contained conceal cchar=#
+syn match giftES "\\{" contained conceal cchar={
+syn match giftES "\\}" contained conceal cchar=}
+syn match giftES "\\:" contained conceal cchar=:
+
+syn match giftEN "\\n" contained conceal cchar=n "GIFT escaped newline
+
+syn match giftFormat "\[html]" contained "GIFT formats
+syn match giftFormat "\[plain]" contained
+syn match giftFormat "\[moodle]" contained
+syn match giftFormat "\[markdown]" contained
+
+"--------------------------------------------------------
+" HTML entities
+
+syn match giftH "<" contained "HTML characters that might need to be handled/escaped
+syn match giftH ">" contained
+syn match giftH "&" contained
+
+syn match giftEH "&lt;" contained conceal cchar=< "HTML escaped characters
+syn match giftEH "&gt;" contained conceal cchar=>
+syn match giftEH "&amp;" contained conceal cchar=&
+syn match giftEH "&nbsp;" contained conceal cchar=_
+
+"-------------------------------------------------------
+" Answer components: Feedback and general feedback
+
+syn match giftFB "#\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|#\|####\|}\)" contained contains=giftF "Feedback block
+syn match giftF "#\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|#\|####\|}\)" contained contains=@giftCEF "Feedback
+
+syn match giftGFB "####\_.\{-}\(\_^\|[^\\]\)\ze}" contained contains=giftGF "General feedback block
+syn match giftGF "####\zs\_.\{-}\(\_^\|[^\\]\)\ze}" contained contains=@giftCEF "General feedback
+
+"------------------------------------------------------
+" Answer components: Other components
+
+syn keyword giftTF T TRUE F FALSE contained
+
+syn match giftNum1 "[-+]\=[.0-9]\+" contained "Something matching a number
+
+syn match giftNum2 "[-+]\=[.0-9]\+\s*:\s*[-+]\=[.0-9]\+" contained contains=giftNum2D "Number with error margin
+syn match giftNum2D ":" contained "Associated delimiter
+
+syn match giftNum3 "[-+]\=[.0-9]\+\s*\.\.\s*[-+]\=[.0-9]\+" contained contains=giftNum3D "Number as min/max range
+syn match giftNum3D "\.\." contained "Associated delimiter
+
+syn match giftWeightB "%-*[0-9]\{1,2}\.\?[0-9]*%" contained contains=giftWeight "Weight block
+syn match giftWeight "%\zs-*[0-9]\{1,2}\.\?[0-9]*\ze%" contained "Weight
+
+"-----------------------------------------------------
+" Answer choices
+
+syn match giftWrongNum "\~\zs\_.\{-}\(\_^\|[^\\]\)\ze\(####\|}\)" contained contains=@giftCEFF "Wrong numeric choice
+syn match giftRightNum "=\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=@giftCEFFW,@giftNums "Right numeric choice
+
+syn match giftWrong "\~\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=@giftCEFFW "Wrong choice
+syn match giftRight "=\zs\_.\{-}\(\ze->\|\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)\)" contained contains=@giftCEFFW "Right choice
+syn match giftMatchB "->\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=giftMatch "Match choice block
+syn match giftMatch "->\zs\_.\{-}\(\_^\|[^\\]\)\ze\(=\|\~\|####\|}\)" contained contains=@giftCE "Match choice
+
+"----------------------------------------------------
+" Answer
+
+syn match giftAnswer "{\_.\{-}\(\_^\|[^\\]\)}" contained keepend contains=@giftA "General answer
+syn match giftAnswer "{}" contained "Minimal answer
+
+syn match giftAnswerNum "{\_[[:space:]]*#\_[^#]\_.\{-}\(\_^\|[^\\]\)}" contained keepend contains=@giftANum "Numeric answer
+syn match giftAnswerNumD "{\zs\_[[:space:]]*#" contained "Associated delimiter
+
+"---------------------------------------------------
+" Question
+
+" The first pattern matches the last question at the end of the file (in case there is no empty line coming after).
+" However, it slows down parsing (and especially scrolling up), therefore it is commented out.
+
+"syn match giftQuestion "[^{[:space:]]\_.\{-}\%$" keepend contains=@giftCEF,giftAnswer,giftAnswerNum
+ syn match giftQuestion "[^{[:space:]]\_.\{-}\n\(\s*\n\)\+" keepend contains=@giftCEF,giftAnswer,giftAnswerNum
+
+"--------------------------------------------------
+" Question name
+
+syn match giftName "::\_.\{-}::" contains=@giftCE,giftNameD "Question name
+syn match giftNameD "::" contained "Associated delimiter
+
+"-------------------------------------------------
+" Category
+
+syn match giftCategoryB "^\s*\$CATEGORY:.*\n\+" contains=giftCategory "Category block
+syn match giftCategory "^\s*\$CATEGORY:\zs.*\ze\n" contained "Category
+
+"------------------------------------------------
+" Comments (may need to be the last entity)
+
+syn keyword giftTodo FIXME TODO NOTE FIX XXX contained
+
+syn match giftIdB "\[id:\(\\]\|[^][:cntrl:]]\)\+]" contained contains=giftId "Id block
+syn match giftId "\[id:\zs\(\\]\|[^][:cntrl:]]\)\+\ze]" contained "Id
+
+syn match giftTagB "\[tag:\(\\]\|[^]<>`[:cntrl:]]\)\+]" contained contains=giftTag "Tag block
+syn match giftTag "\[tag:\zs\(\\]\|[^]<>`[:cntrl:]]\)\+\ze]" contained "Tag
+
+syn match giftComment "^\s*//.*" contains=giftTodo,giftIdB,giftTagB
+
+"-----------------------------------------------
+" Clusters
+
+"Comments and entities (to be escaped)
+syn cluster giftCE contains=giftComment,giftS,giftES,giftEN,giftH,giftEH
+
+"The above plus format
+syn cluster giftCEF contains=@giftCE,giftFormat
+
+"The above plus feedback block
+syn cluster giftCEFF contains=@giftCEF,giftFB
+
+"The above plus weight block
+syn cluster giftCEFFW contains=@giftCEFF,giftWeightB
+
+"Possible numerical representations
+syn cluster giftNums contains=giftNum1,giftNum2,giftNum3
+
+"Possible contents of answers
+syn cluster giftA contains=giftComment,giftTF,giftWrong,giftRight,giftMatchB,giftFB,giftGFB
+
+"Possible contents of numerical answers
+syn cluster giftANum contains=giftAnswerNumD,giftComment,@giftNums,giftWrongNum,giftRightNum,giftFB,giftGFB
+
+"-----------------------------------------------
+
+let b:current_syntax = "gift"
+
+"-----------------------------------------------
+
+hi Conceal ctermbg=NONE ctermfg=Blue guibg=NONE guifg=Blue
+hi Feedback ctermbg=NONE ctermfg=DarkCyan guibg=NONE guifg=DarkCyan
+hi GFeedback ctermbg=NONE ctermfg=DarkGreen guibg=NONE guifg=DarkGreen
+hi WeightB ctermbg=NONE ctermfg=DarkYellow guibg=NONE guifg=DarkYellow
+
+"-----------------------------------------------
+
+hi def link giftS Error
+hi def link giftES Conceal
+hi def link giftEN Conceal
+hi def link giftFormat LineNr
+
+hi def link giftH Error
+hi def link giftEH Conceal
+
+hi def link giftFB PreProc
+hi def link giftF Feedback
+hi def link giftGFB Title
+hi def link giftGF GFeedback
+
+hi def link giftTF Question
+hi def link giftNum1 Question
+hi def link giftNum2 Question
+hi def link giftNum2D Special
+hi def link giftNum3 Question
+hi def link giftNum3D Special
+hi def link giftWeightB WeightB
+hi def link giftWeight Identifier
+
+hi def link giftWrongNum Constant
+hi def link giftRightNum Question
+hi def link giftWrong Constant
+hi def link giftRight Question
+hi def link giftMatchB ModeMsg
+hi def link giftMatch Constant
+
+hi def link giftAnswer MoreMsg
+hi def link giftAnswerNum MoreMsg
+hi def link giftAnswerNumD Identifier
+
+hi def link giftQuestion Identifier
+
+hi def link giftName PreProc
+hi def link giftNameD Directory
+
+hi def link giftCategoryB LineNr
+hi def link giftCategory Directory
+
+hi def link giftTodo Todo
+hi def link giftIdB LineNr
+hi def link giftId Title
+hi def link giftTagB LineNr
+hi def link giftTag Constant
+hi def link giftComment Comment
diff --git a/runtime/syntax/git.vim b/runtime/syntax/git.vim
new file mode 100644
index 0000000..bf013ce
--- /dev/null
+++ b/runtime/syntax/git.vim
@@ -0,0 +1,111 @@
+" Vim syntax file
+" Language: generic git output
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2022 Jan 05
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+syn sync minlines=50
+
+syn include @gitDiff syntax/diff.vim
+
+syn region gitHead start=/\%^\%(tag \|tree \|object \)\@=/ end=/^$/ contains=@NoSpell
+syn region gitHead start=/\%(^commit\%( \x\{4,\}\)\{1,\}\%(\s*(.*)\)\=$\)\@=/ end=/^$/ contains=@NoSpell
+" git log --oneline
+" minimize false positives by verifying contents of buffer
+if getline(1) =~# '^\x\{7,\} ' && getline('$') =~# '^\x\{7,\} '
+ syn match gitHashAbbrev /^\x\{7,\} \@=/ contains=@NoSpell
+elseif getline(1) =~# '^[|\/\\_ ]\{-\}\*[|\/\\_ ]\{-\} \x\{7,\} '
+ syn match gitHashAbbrev /^[|\/\\_ ]\{-\}\*[|\/\\_ ]\{-\} \zs\x\{7,\} \@=/ contains=@NoSpell
+endif
+" git log --graph
+syn region gitGraph start=/\%(^[|\/\\_ ]*\*[|\/\\_ ]\{-\} commit\%( \x\{4,\}\)\{1,\}\%(\s*(.*)\)\=$\)\@=/ end=/^\%([|\/\\_ ]*$\)\@=/ contains=@NoSpell
+" git blame --porcelain
+syn region gitHead start=/\%(^\x\{40,\} \d\+ \d\+\%( \d\+\)\=$\)\@=/ end=/^\t\@=/ contains=@NoSpell
+" git ls-tree
+syn match gitMode /^\d\{6\}\%( \%(blob\|tree\) \x\{4,\}\t\)\@=/ nextgroup=gitType skipwhite contains=@NoSpell
+" git ls-files --stage
+syn match gitMode /^\d\{6\}\%( \x\{4,\} [0-3]\t\)\@=/ nextgroup=gitHashStage skipwhite contains=@NoSpell
+" .git/HEAD, .git/refs/
+syn match gitKeyword /\%^ref: \@=/ nextgroup=gitReference skipwhite contains=@NoSpell
+syn match gitHash /\%^\x\{40,}\%$/ skipwhite contains=@NoSpell
+" .git/logs/
+syn match gitReflog /^\x\{40,\} \x\{40,\} .\{-\}\d\+\s-\d\{4\}\t.*/ skipwhite contains=@NoSpell,gitReflogOld
+
+syn region gitDiff start=/^\%(diff --git \)\@=/ end=/^\%(diff --\|$\)\@=/ contains=@gitDiff fold
+syn region gitDiff start=/^\%(@@ -\)\@=/ end=/^\%(diff --\%(git\|cc\|combined\) \|$\)\@=/ contains=@gitDiff
+
+syn region gitDiffMerge start=/^\%(diff --\%(cc\|combined\) \)\@=/ end=/^\%(diff --\|$\)\@=/ contains=@gitDiff
+syn region gitDiffMerge start=/^\%(@@@@* -\)\@=/ end=/^\%(diff --\|$\)\@=/ contains=@gitDiff
+syn match gitDiffAdded "^ \++.*" contained containedin=gitDiffMerge
+syn match gitDiffAdded "{+[^}]*+}" contained containedin=gitDiff
+syn match gitDiffRemoved "^ \+-.*" contained containedin=gitDiffMerge
+syn match gitDiffRemoved "\[-[^]]*-\]" contained containedin=gitDiff
+
+syn match gitKeyword /^commit \@=/ contained containedin=gitHead nextgroup=gitHashAbbrev skipwhite contains=@NoSpell
+syn match gitKeyword /^\%(object\|tree\|parent\|encoding\|gpgsig\%(-\w\+\)\=\|previous\) \@=/ contained containedin=gitHead nextgroup=gitHash skipwhite contains=@NoSpell
+syn match gitKeyword /^Merge:/ contained containedin=gitHead nextgroup=gitHashAbbrev skipwhite contains=@NoSpell
+syn match gitIdentityKeyword /^\%(author\|committer\|tagger\) \@=/ contained containedin=gitHead nextgroup=gitIdentity skipwhite contains=@NoSpell
+syn match gitIdentityHeader /^\%(Author\|Commit\|Tagger\):/ contained containedin=gitHead nextgroup=gitIdentity skipwhite contains=@NoSpell
+syn match gitDateHeader /^\%(AuthorDate\|CommitDate\|Date\):/ contained containedin=gitHead nextgroup=gitDate skipwhite contains=@NoSpell
+
+syn match gitKeyword /^[*|\/\\_ ]\+\zscommit \@=/ contained containedin=gitGraph nextgroup=gitHashAbbrev skipwhite contains=@NoSpell
+syn match gitKeyword /^[|\/\\_ ]\+\zs\%(object\|tree\|parent\|encoding\|gpgsig\%(-\w\+\)\=\|previous\) \@=/ contained containedin=gitGraph nextgroup=gitHash skipwhite contains=@NoSpell
+syn match gitKeyword /^[|\/\\_ ]\+\zsMerge:/ contained containedin=gitGraph nextgroup=gitHashAbbrev skipwhite contains=@NoSpell
+syn match gitIdentityKeyword /^[|\/\\_ ]\+\zs\%(author\|committer\|tagger\) \@=/ contained containedin=gitGraph nextgroup=gitIdentity skipwhite contains=@NoSpell
+syn match gitIdentityHeader /^[|\/\\_ ]\+\zs\%(Author\|Commit\|Tagger\):/ contained containedin=gitGraph nextgroup=gitIdentity skipwhite contains=@NoSpell
+syn match gitDateHeader /^[|\/\\_ ]\+\zs\%(AuthorDate\|CommitDate\|Date\):/ contained containedin=gitGraph nextgroup=gitDate skipwhite contains=@NoSpell
+
+syn match gitKeyword /^type \@=/ contained containedin=gitHead nextgroup=gitType skipwhite contains=@NoSpell
+syn match gitKeyword /^\%(summary\|boundary\|filename\|\%(author\|committer\)-\%(time\|tz\)\) \@=/ contained containedin=gitHead skipwhite contains=@NoSpell
+syn match gitKeyword /^tag \@=/ contained containedin=gitHead nextgroup=gitReference skipwhite contains=@NoSpell
+syn match gitIdentityKeyword /^\%(author\|committer\)-mail \@=/ contained containedin=gitHead nextgroup=gitEmail skipwhite contains=@NoSpell
+syn match gitReflogHeader /^Reflog:/ contained containedin=gitHead nextgroup=gitReflogMiddle skipwhite contains=@NoSpell
+syn match gitReflogHeader /^Reflog message:/ contained containedin=gitHead skipwhite contains=@NoSpell
+syn match gitReflogMiddle /\S\+@{\d\+} (/he=e-2 nextgroup=gitIdentity contains=@NoSpell
+
+syn match gitIdentity /\S.\{-\} <[^>]*>/ contained nextgroup=gitDate skipwhite contains=@NoSpell
+syn region gitEmail matchgroup=gitEmailDelimiter start=/</ end=/>/ keepend oneline contained containedin=gitIdentity contains=@NoSpell
+syn match gitDate /\<\u\l\l \u\l\l \d\=\d \d\d:\d\d:\d\d \d\d\d\d [+-]\d\d\d\d/ contained contains=@NoSpell
+syn match gitDate /-\=\d\+ [+-]\d\d\d\d\>/ contained contains=@NoSpell
+syn match gitDate /\<\d\+ \l\+ ago\>/ contained contains=@NoSpell
+syn match gitType /\<\%(tag\|commit\|tree\|blob\)\>/ contained nextgroup=gitHashAbbrev skipwhite contains=@NoSpell
+syn match gitReference /\S\+\S\@!/ contained contains=@NoSpell
+syn match gitHash /\<\x\{40,\}\>/ contained nextgroup=gitIdentity,gitHash skipwhite contains=@NoSpell
+syn match gitReflogOld /^\x\{40,\} \@=/ contained nextgroup=gitReflogNew skipwhite contains=@NoSpell
+syn match gitReflogNew /\<\x\{40,\} \@=/ contained nextgroup=gitIdentity skipwhite contains=@NoSpell
+syn match gitHashAbbrev /\<\x\{4,\}\>/ contained nextgroup=gitHashAbbrev skipwhite contains=@NoSpell
+syn match gitHashAbbrev /\<\x\{4,39\}\.\.\./he=e-3 contained nextgroup=gitHashAbbrev skipwhite contains=@NoSpell
+syn match gitHashStage /\<\x\{4,\}\>/ contained nextgroup=gitStage skipwhite contains=@NoSpell
+syn match gitStage /\<\d\t\@=/ contained contains=@NoSpell
+
+
+syn match gitNotesHeader /^Notes:\ze\n /
+
+hi def link gitDateHeader gitIdentityHeader
+hi def link gitIdentityHeader gitIdentityKeyword
+hi def link gitIdentityKeyword Label
+hi def link gitNotesHeader gitKeyword
+hi def link gitReflogHeader gitKeyword
+hi def link gitKeyword Keyword
+hi def link gitIdentity String
+hi def link gitEmailDelimiter Delimiter
+hi def link gitEmail Special
+hi def link gitDate Number
+hi def link gitMode Number
+hi def link gitHashStage gitHash
+hi def link gitHashAbbrev gitHash
+hi def link gitReflogOld gitHash
+hi def link gitReflogNew gitHash
+hi def link gitHash Identifier
+hi def link gitReflogMiddle gitReference
+hi def link gitReference Function
+hi def link gitStage gitType
+hi def link gitType Type
+hi def link gitDiffAdded diffAdded
+hi def link gitDiffRemoved diffRemoved
+
+let b:current_syntax = "git"
diff --git a/runtime/syntax/gitattributes.vim b/runtime/syntax/gitattributes.vim
new file mode 100644
index 0000000..b6d997f
--- /dev/null
+++ b/runtime/syntax/gitattributes.vim
@@ -0,0 +1,63 @@
+" Vim syntax file
+" Language: git attributes
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: .gitattributes, *.git/info/attributes
+" Last Change: 2022 Sep 09
+
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpoptions
+set cpoptions&vim
+
+" Comment
+syn keyword gitattributesTodo contained TODO FIXME XXX
+syn match gitattributesComment /^\s*#.*/ contains=gitattributesTodo
+
+" Pattern
+syn match gitattributesPattern /^\s*#\@!\(".\+"\|\S\+\)/ skipwhite
+ \ nextgroup=gitattributesAttrPrefixed,gitattributesAttrAssigned skipwhite
+ \ contains=gitattributesGlob,gitattributesRange,gitattributesSeparator
+syn match gitattributesGlob /\\\@1<![?*]/ contained
+syn match gitattributesRange /\\\@1<!\[.\{-}\]/ contained
+syn match gitattributesSeparator '/' contained
+
+" Attribute
+syn match gitattributesAttrPrefixed /[!-]\?[A-Za-z0-9_.][-A-Za-z0-9_.]*/
+ \ transparent contained skipwhite
+ \ nextgroup=gitattributesAttrPrefixed,gitattributesAttrAssigned
+ \ contains=gitattributesPrefix,gitattributesName
+syn match gitattributesAttrAssigned /[A-Za-z0-9_.][-A-Za-z0-9_.]*=\S\+/
+ \ transparent contained skipwhite
+ \ nextgroup=gitattributesAttrPrefixed,gitattributesAttrAssigned
+ \ contains=gitattributesName,gitattributesAssign,gitattributesBoolean,gitattributesString
+syn match gitattributesName /[A-Za-z0-9_.][-A-Za-z0-9_.]*/
+ \ contained nextgroup=gitattributesAssign
+syn match gitattributesPrefix /[!-]/ contained
+ \ nextgroup=gitAttributesName
+syn match gitattributesAssign '=' contained
+ \ nextgroup=gitattributesBoolean,gitattributesString
+syn match gitattributesString /=\@1<=\S\+/ contained
+syn keyword gitattributesBoolean true false contained
+
+" Macro
+syn match gitattributesMacro /^\s*\[attr\]\s*\S\+/
+ \ nextgroup=gitattributesAttribute skipwhite
+
+hi def link gitattributesAssign Operator
+hi def link gitattributesBoolean Boolean
+hi def link gitattributesComment Comment
+hi def link gitattributesGlob Special
+hi def link gitattributesMacro Define
+hi def link gitattributesName Identifier
+hi def link gitattributesPrefix SpecialChar
+hi def link gitattributesRange Special
+hi def link gitattributesSeparator Delimiter
+hi def link gitattributesString String
+hi def link gitattributesTodo Todo
+
+let b:current_syntax = 'gitattributes'
+
+let &cpoptions = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/gitcommit.vim b/runtime/syntax/gitcommit.vim
new file mode 100644
index 0000000..42c8d44
--- /dev/null
+++ b/runtime/syntax/gitcommit.vim
@@ -0,0 +1,107 @@
+" Vim syntax file
+" Language: git commit file
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Filenames: *.git/COMMIT_EDITMSG
+" Last Change: 2022 Jan 05
+
+if exists("b:current_syntax")
+ finish
+endif
+
+scriptencoding utf-8
+
+syn case match
+syn sync minlines=50
+syn sync linebreaks=1
+
+if has("spell")
+ syn spell toplevel
+endif
+
+syn include @gitcommitDiff syntax/diff.vim
+syn region gitcommitDiff start=/\%(^diff --\%(git\|cc\|combined\) \)\@=/ end=/^\%(diff --\|$\|@@\@!\|[^[:alnum:]\ +-]\S\@!\)\@=/ fold contains=@gitcommitDiff
+
+syn match gitcommitSummary "^.*\%<51v." contained containedin=gitcommitFirstLine nextgroup=gitcommitOverflow contains=@Spell
+syn match gitcommitOverflow ".*" contained contains=@Spell
+syn match gitcommitBlank "^.\+" contained contains=@Spell
+syn match gitcommitFirstLine "\%^.*" nextgroup=gitcommitBlank,gitcommitComment skipnl
+
+let s:scissors = 0
+let s:l = search('^[#;@!$%^&|:] -\{24,\} >8 -\{24,\}$', 'cnW', '', 100)
+if s:l == 0
+ let s:l = line('$')
+elseif getline(s:l)[0] !=# getline(s:l - 1)[0]
+ let s:scissors = 1
+endif
+let s:comment = escape((matchstr(getline(s:l), '^[#;@!$%^&|:]\S\@!') . '#')[0], '^$.*[]~\"/')
+
+if s:scissors
+ let s:comment .= ' -\{24,\} >8 -\{24,\}$'
+ exe 'syn region gitcommitComment start="^' . s:comment . '" end="\%$" contains=gitcommitDiff'
+else
+ exe 'syn match gitcommitComment "^' . s:comment . '.*"'
+endif
+exe 'syn match gitcommitTrailers "\n\@<=\n\%([[:alnum:]-]\+\s*:.*\|(cherry picked from commit .*\)\%(\n\s.*\|\n[[:alnum:]-]\+\s*:.*\|\n(cherry picked from commit .*\)*\%(\n\n*\%(' . s:comment . '\)\|\n*\%$\)\@="'
+
+unlet s:l s:comment s:scissors
+
+syn match gitcommitTrailerToken "^[[:alnum:]-]\+\s*:" contained containedin=gitcommitTrailers
+
+syn match gitcommitHash "\<\x\{40,}\>" contains=@NoSpell display
+syn match gitcommitOnBranch "\%(^. \)\@<=On branch" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite
+syn match gitcommitOnBranch "\%(^. \)\@<=Your branch .\{-\} '" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite
+syn match gitcommitBranch "[^ ']\+" contained
+syn match gitcommitNoBranch "\%(^. \)\@<=Not currently on any branch." contained containedin=gitcommitComment
+syn match gitcommitHeader "\%(^. \)\@<=\S.*[::]\%(\n^$\)\@!$" contained containedin=gitcommitComment
+syn region gitcommitAuthor matchgroup=gitCommitHeader start=/\%(^. \)\@<=\%(Author\|Committer\|Date\):/ end=/$/ keepend oneline contained containedin=gitcommitComment transparent
+syn match gitcommitHeader "\%(^. \)\@<=commit\%( \x\{40,\}$\)\@=" contained containedin=gitcommitComment nextgroup=gitcommitHash skipwhite
+syn match gitcommitNoChanges "\%(^. \)\@<=No changes$" contained containedin=gitcommitComment
+
+syn match gitcommitType "\%(^.\t\)\@<=[^[:punct:][:space:]][^/::]*[^[:punct:][:space:]][::]\ze "he=e-1 contained containedin=gitcommitComment nextgroup=gitcommitFile skipwhite
+syn match gitcommitFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitArrow
+syn match gitcommitArrow " -> " contained nextgroup=gitcommitFile
+syn match gitcommitUntrackedFile "\%(^.\t\)\@<=[^::/]*\%(/.*\)\=$" contained containedin=gitcommitComment
+
+syn region gitcommitUntracked start=/^\z(.\) Untracked files:$/ end=/^\z1\=$\|^\z1\@!/ contains=gitcommitHeader containedin=gitcommitComment containedin=gitcommitComment contained transparent fold
+syn region gitcommitDiscarded start=/^\z(.\) Change\%(s not staged for commit\|d but not updated\):$/ end=/^\z1\=$\|^\z1\@!/ contains=gitcommitHeader,gitcommitDiscardedType containedin=gitcommitComment containedin=gitcommitComment contained transparent fold
+syn region gitcommitSelected start=/^\z(.\) Changes to be committed:$/ end=/^\z1$\|^\z1\@!/ contains=gitcommitHeader,gitcommitSelectedType containedin=gitcommitComment containedin=gitcommitComment contained transparent fold
+syn region gitcommitUnmerged start=/^\z(.\) Unmerged paths:$/ end=/^\z1\=$\|^\z1\@!/ contains=gitcommitHeader,gitcommitUnmergedType containedin=gitcommitComment containedin=gitcommitComment contained transparent fold
+
+syn match gitcommitUntrackedFile "\%(^.\t\)\@<=.*" contained containedin=gitcommitUntracked
+
+syn match gitcommitDiscardedType "\%(^.\t\)\@<=[^[:punct:][:space:]][^/::]*[^[:punct:][:space:]][::]\ze "he=e-1 contained nextgroup=gitcommitDiscardedFile skipwhite
+syn match gitcommitSelectedType "\%(^.\t\)\@<=[^[:punct:][:space:]][^/::]*[^[:punct:][:space:]][::]\ze "he=e-1 contained nextgroup=gitcommitSelectedFile skipwhite
+syn match gitcommitUnmergedType "\%(^.\t\)\@<=[^[:punct:][:space:]][^/::]*[^[:punct:][:space:]][::]\ze "he=e-1 contained nextgroup=gitcommitUnmergedFile skipwhite
+syn match gitcommitDiscardedFile "\S.\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitDiscardedArrow
+syn match gitcommitSelectedFile "\S.\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow
+syn match gitcommitUnmergedFile "\S.\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitUnmergedArrow
+syn match gitcommitDiscardedArrow " -> " contained nextgroup=gitcommitDiscardedFile
+syn match gitcommitSelectedArrow " -> " contained nextgroup=gitcommitSelectedFile
+syn match gitcommitUnmergedArrow " -> " contained nextgroup=gitcommitUnmergedFile
+
+hi def link gitcommitSummary Keyword
+hi def link gitcommitTrailerToken Label
+hi def link gitcommitComment Comment
+hi def link gitcommitHash Identifier
+hi def link gitcommitOnBranch Comment
+hi def link gitcommitBranch Special
+hi def link gitcommitNoBranch gitCommitBranch
+hi def link gitcommitDiscardedType gitcommitType
+hi def link gitcommitSelectedType gitcommitType
+hi def link gitcommitUnmergedType gitcommitType
+hi def link gitcommitType Type
+hi def link gitcommitNoChanges gitcommitHeader
+hi def link gitcommitHeader PreProc
+hi def link gitcommitUntrackedFile gitcommitFile
+hi def link gitcommitDiscardedFile gitcommitFile
+hi def link gitcommitSelectedFile gitcommitFile
+hi def link gitcommitUnmergedFile gitcommitFile
+hi def link gitcommitFile Constant
+hi def link gitcommitDiscardedArrow gitcommitArrow
+hi def link gitcommitSelectedArrow gitcommitArrow
+hi def link gitcommitUnmergedArrow gitcommitArrow
+hi def link gitcommitArrow gitcommitComment
+"hi def link gitcommitOverflow Error
+hi def link gitcommitBlank Error
+
+let b:current_syntax = "gitcommit"
diff --git a/runtime/syntax/gitconfig.vim b/runtime/syntax/gitconfig.vim
new file mode 100644
index 0000000..e5eaf10
--- /dev/null
+++ b/runtime/syntax/gitconfig.vim
@@ -0,0 +1,36 @@
+" Vim syntax file
+" Language: git config file
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Filenames: gitconfig, .gitconfig, *.git/config
+" Last Change: 2019 Dec 05
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+syn sync minlines=10
+
+syn match gitconfigComment "[#;].*" contains=@Spell
+syn match gitconfigSection "\%(^\s*\)\@<=\[[a-z0-9.-]\+\]"
+syn match gitconfigSection '\%(^\s*\)\@<=\[[a-z0-9.-]\+ \+\"\%([^\\"]\|\\.\)*"\]'
+syn match gitconfigVariable "\%(^\s*\)\@<=\a[a-z0-9-]*\%(\s*\%([=#;]\|$\)\)\@=" nextgroup=gitconfigAssignment skipwhite
+syn region gitconfigAssignment matchgroup=gitconfigNone start=+=\s*+ skip=+\\+ end=+\s*$+ contained contains=gitconfigBoolean,gitconfigNumber,gitConfigString,gitConfigEscape,gitConfigError,gitconfigComment keepend
+syn keyword gitconfigBoolean true false yes no contained
+syn match gitconfigNumber "\<\d\+\>" contained
+syn region gitconfigString matchgroup=gitconfigDelim start=+"+ skip=+\\+ end=+"+ matchgroup=gitconfigError end=+[^\\"]\%#\@!$+ contained contains=gitconfigEscape,gitconfigEscapeError
+syn match gitconfigError +\\.+ contained
+syn match gitconfigEscape +\\[\\"ntb]+ contained
+syn match gitconfigEscape +\\$+ contained
+
+hi def link gitconfigComment Comment
+hi def link gitconfigSection Keyword
+hi def link gitconfigVariable Identifier
+hi def link gitconfigBoolean Boolean
+hi def link gitconfigNumber Number
+hi def link gitconfigString String
+hi def link gitconfigDelim Delimiter
+hi def link gitconfigEscape Special
+hi def link gitconfigError Error
+
+let b:current_syntax = "gitconfig"
diff --git a/runtime/syntax/gitignore.vim b/runtime/syntax/gitignore.vim
new file mode 100644
index 0000000..8e6d098
--- /dev/null
+++ b/runtime/syntax/gitignore.vim
@@ -0,0 +1,29 @@
+" Vim syntax file
+" Language: git ignore
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: .gitignore, *.git/info/exclude
+" Last Change: 2022 Sep 10
+
+if exists('b:current_syntax')
+ finish
+endif
+
+" Comment
+syn keyword gitignoreTodo contained TODO FIXME XXX
+syn match gitignoreComment /^#.*/ contains=gitignoreTodo
+
+" Pattern
+syn match gitignorePattern /^#\@!.*$/ contains=gitignoreNegation,gitignoreGlob,gitignoreRange,gitignoreSeparator
+syn match gitignoreNegation /^!/ contained
+syn match gitignoreGlob /\\\@1<![?*]/ contained
+syn match gitignoreRange /\\\@1<!\[.\{-}\]/ contained
+syn match gitignoreSeparator '/' contained
+
+hi def link gitignoreComment Comment
+hi def link gitignoreGlob Special
+hi def link gitignoreNegation SpecialChar
+hi def link gitignoreRange Special
+hi def link gitignoreSeparator Delimiter
+hi def link gitignoreTodo Todo
+
+let b:current_syntax = 'gitignore'
diff --git a/runtime/syntax/gitolite.vim b/runtime/syntax/gitolite.vim
new file mode 100644
index 0000000..3a6da26
--- /dev/null
+++ b/runtime/syntax/gitolite.vim
@@ -0,0 +1,94 @@
+" Vim syntax file
+" Language: gitolite configuration
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/gitrebase.vim b/runtime/syntax/gitrebase.vim
new file mode 100644
index 0000000..13f157b
--- /dev/null
+++ b/runtime/syntax/gitrebase.vim
@@ -0,0 +1,62 @@
+" Vim syntax file
+" Language: git rebase --interactive
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Filenames: git-rebase-todo
+" Last Change: 2022 Jan 05
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+let s:c = escape((matchstr(getline('$'), '^[#;@!$%^&|:]\S\@!') . '#')[0], '^$.*[]~\"/')
+
+syn match gitrebaseHash "\v<\x{7,}>" contained contains=@NoSpell
+syn match gitrebaseCommit "\v<\x{7,}>" nextgroup=gitrebaseSummary skipwhite contains=@NoSpell
+syn match gitrebasePick "\v^p%(ick)=>" nextgroup=gitrebaseCommit skipwhite
+syn match gitrebaseReword "\v^r%(eword)=>" nextgroup=gitrebaseCommit skipwhite
+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 gitrebaseBreak "\v^b%(reak)=>"
+syn match gitrebaseDrop "\v^d%(rop)=>" nextgroup=gitrebaseCommit skipwhite
+syn match gitrebaseNoop "\v^noop>"
+syn match gitrebaseMerge "\v^m(erge)=>" nextgroup=gitrebaseMergeOption,gitrebaseName skipwhite
+syn match gitrebaseLabel "\v^l(abel)=>" nextgroup=gitrebaseName skipwhite
+syn match gitrebaseReset "\v^(t|reset)=>" nextgroup=gitrebaseName skipwhite
+syn match gitrebaseSummary ".*" contains=gitrebaseHash contained
+syn match gitrebaseCommand ".*" contained
+exe 'syn match gitrebaseComment " \@<=' . s:c . ' empty$" containedin=gitrebaseSummary contained'
+exe 'syn match gitrebaseComment "^\s*' . s:c . '.*" contains=gitrebaseHash'
+syn match gitrebaseSquashError "\v%^%(s%(quash)=>|f%(ixup)=>)" nextgroup=gitrebaseCommit skipwhite
+syn match gitrebaseMergeOption "\v-[Cc]>" nextgroup=gitrebaseMergeCommit skipwhite contained
+syn match gitrebaseMergeCommit "\v<\x{7,}>" nextgroup=gitrebaseName skipwhite contained
+syn match gitrebaseName "\v[^[:space:].*?i:^~/-]\S+" nextgroup=gitrebaseMergeComment skipwhite contained
+exe 'syn match gitrebaseMergeComment "' . s:c . '" nextgroup=gitrebaseSummary skipwhite contained'
+
+unlet s:c
+
+hi def link gitrebaseCommit gitrebaseHash
+hi def link gitrebaseHash Identifier
+hi def link gitrebasePick Type
+hi def link gitrebaseReword Conditional
+hi def link gitrebaseEdit PreProc
+hi def link gitrebaseSquash Statement
+hi def link gitrebaseFixup Repeat
+hi def link gitrebaseExec Operator
+hi def link gitrebaseBreak Macro
+hi def link gitrebaseDrop Comment
+hi def link gitrebaseNoop Comment
+hi def link gitrebaseMerge Exception
+hi def link gitrebaseLabel Label
+hi def link gitrebaseReset Keyword
+hi def link gitrebaseSummary String
+hi def link gitrebaseComment Comment
+hi def link gitrebaseSquashError Error
+hi def link gitrebaseMergeCommit gitrebaseCommit
+hi def link gitrebaseMergeComment gitrebaseComment
+hi def link gitrebaseName Tag
+
+let b:current_syntax = "gitrebase"
diff --git a/runtime/syntax/gitsendemail.vim b/runtime/syntax/gitsendemail.vim
new file mode 100644
index 0000000..8fdf683
--- /dev/null
+++ b/runtime/syntax/gitsendemail.vim
@@ -0,0 +1,23 @@
+" Vim syntax file
+" Language: git send-email message
+" Maintainer: Tim Pope
+" 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.*#.*"
+syn match gitsendemailComment "^GIT:.*"
+
+hi def link gitsendemailComment Comment
+
+let b:current_syntax = "gitsendemail"
diff --git a/runtime/syntax/gkrellmrc.vim b/runtime/syntax/gkrellmrc.vim
new file mode 100644
index 0000000..f005ca2
--- /dev/null
+++ b/runtime/syntax/gkrellmrc.vim
@@ -0,0 +1,75 @@
+" Vim syntax file
+" This is a GENERATED FILE. Please always refer to source file at the URI below.
+" Language: gkrellm theme files `gkrellmrc'
+" Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2003-04-30
+" URL: http://trific.ath.cx/Ftp/vim/syntax/gkrellmrc.vim
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=_,-,a-z,A-Z,48-57
+
+syn case match
+
+" Base constructs
+syn match gkrellmrcComment "#.*$" contains=gkrellmrcFixme
+syn keyword gkrellmrcFixme FIXME TODO XXX NOT contained
+syn region gkrellmrcString start=+"+ skip=+\\\\\|\\"+ end=+"+ oneline
+syn match gkrellmrcNumber "^-\=\(\d\+\)\=\.\=\d\+"
+syn match gkrellmrcNumber "\W-\=\(\d\+\)\=\.\=\d\+"lc=1
+syn keyword gkrellmrcConstant none
+syn match gkrellmrcRGBColor "#\(\x\{12}\|\x\{9}\|\x\{6}\|\x\{3}\)\>"
+
+" Keywords
+syn keyword gkrellmrcBuiltinExt cpu_nice_color cpu_nice_grid_color krell_depth krell_expand krell_left_margin krell_right_margin krell_x_hot krell_yoff mem_krell_buffers_depth mem_krell_buffers_expand mem_krell_buffers_x_hot mem_krell_buffers_yoff mem_krell_cache_depth mem_krell_cache_expand mem_krell_cache_x_hot mem_krell_cache_yoff sensors_bg_volt timer_bg_timer
+syn keyword gkrellmrcGlobal allow_scaling author chart_width_ref theme_alternatives
+syn keyword gkrellmrcSetCmd set_image_border set_integer set_string
+syn keyword gkrellmrcGlobal bg_slider_meter_border bg_slider_panel_border
+syn keyword gkrellmrcGlobal frame_bottom_height frame_left_width frame_right_width frame_top_height frame_left_chart_overlap frame_right_chart_overlap frame_left_panel_overlap frame_right_panel_overlap frame_left_spacer_overlap frame_right_spacer_overlap spacer_overlap_off cap_images_off
+syn keyword gkrellmrcGlobal frame_bottom_border frame_left_border frame_right_border frame_top_border spacer_top_border spacer_bottom_border frame_left_chart_border frame_right_chart_border frame_left_panel_border frame_right_panel_border
+syn keyword gkrellmrcGlobal chart_in_color chart_in_color_grid chart_out_color chart_out_color_grid
+syn keyword gkrellmrcGlobal bg_separator_height bg_grid_mode
+syn keyword gkrellmrcGlobal rx_led_x rx_led_y tx_led_x tx_led_y
+syn keyword gkrellmrcGlobal decal_mail_frames decal_mail_delay
+syn keyword gkrellmrcGlobal decal_alarm_frames decal_warn_frames
+syn keyword gkrellmrcGlobal krell_slider_depth krell_slider_expand krell_slider_x_hot
+syn keyword gkrellmrcGlobal button_panel_border button_meter_border
+syn keyword gkrellmrcGlobal large_font normal_font small_font
+syn keyword gkrellmrcGlobal spacer_bottom_height spacer_top_height spacer_bottom_height_chart spacer_top_height_chart spacer_bottom_height_meter spacer_top_height_meter
+syn keyword gkrellmrcExpandMode left right bar-mode left-scaled right-scaled bar-mode-scaled
+syn keyword gkrellmrcMeterName apm cal clock fs host mail mem swap timer sensors uptime
+syn keyword gkrellmrcChartName cpu proc disk inet and net
+syn match gkrellmrcSpecialClassName "\*"
+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
+
+hi def link gkrellmrcComment Comment
+hi def link gkrellmrcFixme Todo
+
+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
+
+hi def link gkrellmrcMeterName gkrellmrcClass
+hi def link gkrellmrcChartName gkrellmrcClass
+hi def link gkrellmrcSpecialClassName gkrellmrcClass
+hi def link gkrellmrcClass Type
+
+hi def link gkrellmrcGlobal gkrellmrcItem
+hi def link gkrellmrcBuiltinExt gkrellmrcItem
+hi def link gkrellmrcStyleItem gkrellmrcItem
+hi def link gkrellmrcItem Function
+
+hi def link gkrellmrcSetCmd Special
+hi def link gkrellmrcStyleCmd Statement
+
+
+let b:current_syntax = "gkrellmrc"
diff --git a/runtime/syntax/gnash.vim b/runtime/syntax/gnash.vim
new file mode 100644
index 0000000..cce522d
--- /dev/null
+++ b/runtime/syntax/gnash.vim
@@ -0,0 +1,96 @@
+" Vim syntax file
+" Maintainer: Thilo Six
+" Contact: <vim-dev at vim dot org>
+" http://www.vim.org/maillist.php#vim-dev
+"
+" Description: highlight gnash configuration files
+" http://www.gnu.org/software/gnash/manual/gnashuser.html#gnashrc
+" File: runtime/syntax/gnash.vim
+" Last Change: 2012 May 19
+" Modeline: vim: ts=8:sw=2:sts=2:
+"
+" Credits: derived from Nikolai Weibulls readline.vim
+"
+" License: VIM License
+" Vim is Charityware, see ":help Uganda"
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax") || &compatible
+ finish
+endif
+
+syn case match
+syn keyword GnashTodo contained TODO FIXME XXX NOTE
+
+" Comments
+syn match GnashComment "^#.*$" contains=@Spell,GnashTodo
+syn match GnashComment "\s#.*$" contains=@Spell,GnashTodo
+
+syn match GnashNumber display '\<\d\+\>'
+
+syn case ignore
+syn keyword GnashOn ON YES TRUE
+syn keyword GnashOff OFF NO FALSE
+
+syn match GnashSet '^\s*set\>'
+syn match GnashSet '^\s*append\>'
+
+syn match GnashKeyword '\<CertDir\>'
+syn match GnashKeyword '\<ASCodingErrorsVerbosity\>'
+syn match GnashKeyword '\<CertFile\>'
+syn match GnashKeyword '\<EnableExtensions\>'
+syn match GnashKeyword '\<HWAccel\>'
+syn match GnashKeyword '\<LCShmKey\>'
+syn match GnashKeyword '\<LocalConnection\>'
+syn match GnashKeyword '\<MalformedSWFVerbosity\>'
+syn match GnashKeyword '\<Renderer\>'
+syn match GnashKeyword '\<RootCert\>'
+syn match GnashKeyword '\<SOLReadOnly\>'
+syn match GnashKeyword '\<SOLSafeDir\>'
+syn match GnashKeyword '\<SOLreadonly\>'
+syn match GnashKeyword '\<SOLsafedir\>'
+syn match GnashKeyword '\<StartStopped\>'
+syn match GnashKeyword '\<StreamsTimeout\>'
+syn match GnashKeyword '\<URLOpenerFormat\>'
+syn match GnashKeyword '\<XVideo\>'
+syn match GnashKeyword '\<actionDump\>'
+syn match GnashKeyword '\<blacklist\>'
+syn match GnashKeyword '\<debugger\>'
+syn match GnashKeyword '\<debuglog\>'
+syn match GnashKeyword '\<delay\>'
+syn match GnashKeyword '\<enableExtensions\>'
+syn match GnashKeyword '\<flashSystemManufacturer\>'
+syn match GnashKeyword '\<flashSystemOS\>'
+syn match GnashKeyword '\<flashVersionString\>'
+syn match GnashKeyword '\<ignoreFSCommand\>'
+syn match GnashKeyword '\<ignoreShowMenu\>'
+syn match GnashKeyword '\<insecureSSL\>'
+syn match GnashKeyword '\<localSandboxPath\>'
+syn match GnashKeyword '\<localdomain\>'
+syn match GnashKeyword '\<localhost\>'
+syn match GnashKeyword '\<microphoneDevice\>'
+syn match GnashKeyword '\<parserDump\>'
+syn match GnashKeyword '\<pluginsound\>'
+syn match GnashKeyword '\<quality\>'
+syn match GnashKeyword '\<solLocalDomain\>'
+syn match GnashKeyword '\<sound\>'
+syn match GnashKeyword '\<splashScreen\>'
+syn match GnashKeyword '\<startStopped\>'
+syn match GnashKeyword '\<streamsTimeout\>'
+syn match GnashKeyword '\<urlOpenerFormat\>'
+syn match GnashKeyword '\<verbosity\>'
+syn match GnashKeyword '\<webcamDevice\>'
+syn match GnashKeyword '\<whitelist\>'
+syn match GnashKeyword '\<writelog\>'
+
+hi def link GnashOn Identifier
+hi def link GnashOff Preproc
+hi def link GnashComment Comment
+hi def link GnashTodo Todo
+hi def link GnashNumber Type
+hi def link GnashSet String
+hi def link GnashKeyword Keyword
+
+let b:current_syntax = "gnash"
+
diff --git a/runtime/syntax/gnuplot.vim b/runtime/syntax/gnuplot.vim
new file mode 100644
index 0000000..b5092d7
--- /dev/null
+++ b/runtime/syntax/gnuplot.vim
@@ -0,0 +1,549 @@
+" Vim syntax file
+" Language: gnuplot 4.7.0
+" Maintainer: Josh Wainwright <wainwright DOT ja AT gmail DOT com>
+" Last Maintainer: Andrew Rasmussen andyras@users.sourceforge.net
+" Original Maintainer: John Hoelzel johnh51@users.sourceforge.net
+" Last Change: 2021 Nov 16
+" additional changes from PR #8949
+" Filenames: *.gnu *.plt *.gpi *.gih *.gp *.gnuplot scripts: #!*gnuplot
+" URL: http://www.vim.org/scripts/script.php?script_id=4873
+" Original URL: http://johnh51.get.to/vim/syntax/gnuplot.vim
+
+" thanks to "David Necas (Yeti)" <yeti@physics.muni.cz>
+
+" credit also to Jim Eberle <jim.eberle@fastnlight.com>
+" for the script http://www.vim.org/scripts/script.php?script_id=1737
+
+" some shortened names to make demo files look clean... jeh. 11/2000
+" demos -> 3.8i ... jeh. 5/2003 - a work in progress...
+" added current commands, keywords, variables, todos, macros... amr 2014-02-24
+
+" For vim version 5.x: Clear all syntax items
+" For vim version 6.x: Quit when a syntax file was already loaded
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" ---- Special characters ---- "
+
+" no harm in just matching any \[char] within double quotes, right?
+syn match gnuplotSpecial "\\." contained
+" syn match gnuplotSpecial "\\\o\o\o\|\\x\x\x\|\\c[^"]\|\\[a-z\\]" contained
+
+" measurements in the units in, cm and pt are special
+syn match gnuplotUnit "\d+in"
+syn match gnuplotUnit "\d+cm"
+syn match gnuplotUnit "\d+pt"
+
+" external (shell) commands are special
+syn region gnuplotExternal start="^\s*!" end="$"
+
+" ---- Comments ---- "
+
+syn region gnuplotComment start="#" end="$" contains=gnuplotTodo,@Spell
+
+" ---- Constants ---- "
+
+" strings
+syn region gnuplotString start=+"+ skip=+\\"+ end=+"+ contains=gnuplotSpecial,@Spell
+syn region gnuplotString start="'" end="'" contains=@Spell
+
+" built-in variables
+syn keyword gnuplotNumber GNUTERM GPVAL_TERM GPVAL_TERMOPTIONS GPVAL_SPLOT
+syn keyword gnuplotNumber GPVAL_OUTPUT GPVAL_ENCODING GPVAL_VERSION
+syn keyword gnuplotNumber GPVAL_PATCHLEVEL GPVAL_COMPILE_OPTIONS
+syn keyword gnuplotNumber GPVAL_MULTIPLOT GPVAL_PLOT GPVAL_VIEW_ZSCALE
+syn keyword gnuplotNumber GPVAL_TERMINALS GPVAL_pi GPVAL_NaN
+syn keyword gnuplotNumber GPVAL_ERRNO GPVAL_ERRMSG GPVAL_PWD
+syn keyword gnuplotNumber pi NaN GPVAL_LAST_PLOT GPVAL_TERM_WINDOWID
+syn keyword gnuplotNumber GPVAL_X_MIN GPVAL_X_MAX GPVAL_X_LOG
+syn keyword gnuplotNumber GPVAL_DATA_X_MIN GPVAL_DATA_X_MAX GPVAL_Y_MIN
+syn keyword gnuplotNumber GPVAL_Y_MAX GPVAL_Y_LOG GPVAL_DATA_Y_MIN
+syn keyword gnuplotNumber GPVAL_DATA_Y_MAX GPVAL_X2_MIN GPVAL_X2_MAX
+syn keyword gnuplotNumber GPVAL_X2_LOG GPVAL_DATA_X2_MIN GPVAL_DATA_X2_MAX
+syn keyword gnuplotNumber GPVAL_Y2_MIN GPVAL_Y2_MAX GPVAL_Y2_LOG
+syn keyword gnuplotNumber GPVAL_DATA_Y2_MIN GPVAL_DATA_Y2_MAX GPVAL_Z_MIN
+syn keyword gnuplotNumber GPVAL_Z_MAX GPVAL_Z_LOG GPVAL_DATA_Z_MIN
+syn keyword gnuplotNumber GPVAL_DATA_Z_MAX GPVAL_CB_MIN GPVAL_CB_MAX
+syn keyword gnuplotNumber GPVAL_CB_LOG GPVAL_DATA_CB_MIN GPVAL_DATA_CB_MAX
+syn keyword gnuplotNumber GPVAL_T_MIN GPVAL_T_MAX GPVAL_T_LOG GPVAL_U_MIN
+syn keyword gnuplotNumber GPVAL_U_MAX GPVAL_U_LOG GPVAL_V_MIN GPVAL_V_MAX
+syn keyword gnuplotNumber GPVAL_V_LOG GPVAL_R_MIN GPVAL_R_LOG
+syn keyword gnuplotNumber GPVAL_TERM_XMIN GPVAL_TERM_XMAX GPVAL_TERM_YMIN
+syn keyword gnuplotNumber GPVAL_TERM_YMAX GPVAL_TERM_XSIZE
+syn keyword gnuplotNumber GPVAL_TERM_YSIZE GPVAL_VIEW_MAP GPVAL_VIEW_ROT_X
+syn keyword gnuplotNumber GPVAL_VIEW_ROT_Z GPVAL_VIEW_SCALE
+
+" function name variables
+syn match gnuplotNumber "GPFUN_\h*"
+
+" stats variables
+syn keyword gnuplotNumber STATS_records STATS_outofrange STATS_invalid
+syn keyword gnuplotNumber STATS_blank STATS_blocks STATS_columns STATS_min
+syn keyword gnuplotNumber STATS_max STATS_index_min STATS_index_max
+syn keyword gnuplotNumber STATS_lo_quartile STATS_median STATS_up_quartile
+syn keyword gnuplotNumber STATS_mean STATS_stddev STATS_sum STATS_sumsq
+syn keyword gnuplotNumber STATS_correlation STATS_slope STATS_intercept
+syn keyword gnuplotNumber STATS_sumxy STATS_pos_min_y STATS_pos_max_y
+syn keyword gnuplotNumber STATS_mean STATS_stddev STATS_mean_x STATS_sum_x
+syn keyword gnuplotNumber STATS_stddev_x STATS_sumsq_x STATS_min_x
+syn keyword gnuplotNumber STATS_max_x STATS_median_x STATS_lo_quartile_x
+syn keyword gnuplotNumber STATS_up_quartile_x STATS_index_min_x
+syn keyword gnuplotNumber STATS_index_max_x STATS_mean_y STATS_stddev_y
+syn keyword gnuplotNumber STATS_sum_y STATS_sumsq_y STATS_min_y
+syn keyword gnuplotNumber STATS_max_y STATS_median_y STATS_lo_quartile_y
+syn keyword gnuplotNumber STATS_up_quartile_y STATS_index_min_y
+syn keyword gnuplotNumber STATS_index_max_y STATS_correlation STATS_sumxy
+
+" deprecated fit variables
+syn keyword gnuplotError FIT_LIMIT FIT_MAXITER FIT_START_LAMBDA
+syn keyword gnuplotError FIT_LAMBDA_FACTOR FIT_LOG FIT_SCRIPT
+
+" numbers, from c.vim
+
+" integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match gnuplotNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+
+" floating point number, with dot, optional exponent
+syn match gnuplotFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+
+" floating point number, starting with a dot, optional exponent
+syn match gnuplotFloat "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+
+" floating point number, without dot, with exponent
+syn match gnuplotFloat "\<\d\+e[-+]\=\d\+[fl]\=\>"
+
+" hex number
+syn match gnuplotNumber "\<0x\x\+\(u\=l\=\|lu\)\>"
+syn case match
+
+" flag an octal number with wrong digits by not highlighting
+syn match gnuplotOctalError "\<0\o*[89]"
+
+" ---- Identifiers: Functions ---- "
+
+" numerical functions
+syn keyword gnuplotFunc abs acos acosh airy arg asin asinh atan atan2
+syn keyword gnuplotFunc atanh EllipticK EllipticE EllipticPi besj0 besj1
+syn keyword gnuplotFunc besy0 besy1 ceil cos cosh erf erfc exp expint
+syn keyword gnuplotFunc floor gamma ibeta inverf igamma imag invnorm int
+syn keyword gnuplotFunc lambertw lgamma log log10 norm rand real sgn sin
+syn keyword gnuplotFunc sin sinh sqrt tan tanh voigt
+
+" string functions
+syn keyword gnuplotFunc gprintf sprintf strlen strstrt substr strftime
+syn keyword gnuplotFunc strptime system word words
+
+" other functions
+syn keyword gnuplotFunc column columnhead columnheader defined exists
+syn keyword gnuplotFunc hsv2rgb stringcolumn timecolumn tm_hour tm_mday
+syn keyword gnuplotFunc tm_min tm_mon tm_sec tm_wday tm_yday tm_year
+syn keyword gnuplotFunc time valid value
+
+" ---- Statements ---- "
+
+" common (builtin) variable names
+syn keyword gnuplotKeyword x y t u v z s
+
+" conditionals
+syn keyword gnuplotConditional if else
+
+" repeats
+syn keyword gnuplotRepeat do for while
+
+" operators
+syn match gnuplotOperator "[-+*/^|&?:]"
+syn match gnuplotOperator "\*\*"
+syn match gnuplotOperator "&&"
+syn match gnuplotOperator "||"
+
+" Keywords
+
+" keywords for 'fit' command
+syn keyword gnuplotKeyword via z x:z x:z:s x:y:z:s
+syn keyword gnuplotKeyword x:y:t:z:s x:y:t:u:z:s x:y:t:u:v:z:s
+
+" keywords for 'plot' command
+" 'axes' keyword
+syn keyword gnuplotKeyword axes x1y1 x1y2 x2y1 x2y2
+" 'binary' keyword
+syn keyword gnuplotKeyword binary matrix general array record format endian
+syn keyword gnuplotKeyword filetype avs edf png scan transpose dx dy dz
+syn keyword gnuplotKeyword flipx flipy flipz origin center rotate using
+syn keyword gnuplotKeyword perpendicular skip every
+" datafile keywords
+syn keyword gnuplotKeyword binary nonuniform matrix index every using
+syn keyword gnuplotKeyword smooth volatile noautoscale every index
+" 'smooth' keywords
+syn keyword gnuplotKeyword unique frequency cumulative cnormal kdensity
+syn keyword gnuplotKeyword csplines acsplines bezer sbezier
+" deprecated 'thru' keyword
+syn keyword gnuplotError thru
+" 'using' keyword
+syn keyword gnuplotKeyword using u xticlabels yticlabels zticlabels
+syn keyword gnuplotKeyword x2ticlabels y2ticlabels xtic ytic ztic
+" 'errorbars' keywords
+syn keyword gnuplotKeyword errorbars xerrorbars yerrorbars xyerrorbars
+" 'errorlines' keywords
+syn keyword gnuplotKeyword errorlines xerrorlines yerrorlines xyerrorlines
+" 'title' keywords
+syn keyword gnuplotKeyword title t tit notitle columnheader at beginning
+syn keyword gnuplotKeyword end
+" 'with' keywords
+syn keyword gnuplotKeyword with w linestyle ls linetype lt linewidth
+syn keyword gnuplotKeyword lw linecolor lc pointtype pt pointsize ps
+syn keyword gnuplotKeyword fill fs nohidden3d nocontours nosurface palette
+" styles for 'with'
+syn keyword gnuplotKeyword lines l points p linespoints lp surface dots
+syn keyword gnuplotKeyword impulses labels vectors steps fsteps histeps
+syn keyword gnuplotKeyword errorbars errorlines financebars xerrorbars
+syn keyword gnuplotKeyword xerrorlines xyerrorbars yerrorbars yerrorlines
+syn keyword gnuplotKeyword boxes boxerrorbars boxxyerrorbars boxplot
+syn keyword gnuplotKeyword candlesticks circles ellipses filledcurves
+syn keyword gnuplotKeyword histogram image rgbimage rgbalpha pm3d variable
+
+" keywords for 'save' command
+syn keyword gnuplotKeyword save functions func variables all var terminal
+syn keyword gnuplotKeyword term set
+
+" keywords for 'set/show' command
+" set angles
+syn keyword gnuplotKeyword angles degrees deg radians rad
+" set arrow
+syn keyword gnuplotKeyword arrow from to rto length angle arrowstyle as
+syn keyword gnuplotKeyword nohead head backhead heads size filled empty
+syn keyword gnuplotKeyword nofilled front back linestyle linetype linewidth
+" set autoscale
+" TODO regexp here
+syn keyword gnuplotKeyword autoscale x y z cb x2 y2 zy min max fixmin
+syn keyword gnuplotKeyword fixmax fix keepfix noextend
+" set bars
+syn keyword gnuplotKeyword bars small large fullwidth front back
+" set bind
+syn keyword gnuplotKeyword bind
+" set margins
+" TODO regexp
+syn keyword gnuplotKeyword margin bmargin lmargin rmargin tmargin
+" set border
+syn keyword gnuplotKeyword border front back
+" set boxwidth
+syn keyword gnuplotKeyword boxwidth absolute relative
+" deprecated set clabel
+syn keyword gnuplotError clabel
+" set clip
+syn keyword gnuplotKeyword clip points one two
+" set cntrlabel
+syn keyword gnuplotKeyword cntrlabel format font start interval onecolor
+" set cntrparam
+syn keyword gnuplotKeyword cntrparam linear cubicspline bspline points
+syn keyword gnuplotKeyword order levels auto discrete incremental
+" set colorbox
+syn keyword gnuplotKeyword colorbox vertical horizontal default user origin
+syn keyword gnuplotKeyword size front back noborder bdefault border
+" show colornames
+syn keyword gnuplotKeyword colornames
+" set contour
+syn keyword gnuplotKeyword contour base surface both
+" set datafile
+syn keyword gnuplotKeyword datafile fortran nofpe_trap missing separator
+syn keyword gnuplotKeyword whitespace tab comma commentschars binary
+" set decimalsign
+syn keyword gnuplotKeyword decimalsign locale
+" set dgrid3d
+syn keyword gnuplotKeyword dgrid3d splines qnorm gauss cauchy exp box hann
+syn keyword gnuplotKeyword kdensity
+" set dummy
+syn keyword gnuplotKeyword dummy
+" set encoding
+syn keyword gnuplotKeyword encoding default iso_8859_1 iso_8859_15
+syn keyword gnuplotKeyword iso_8859_2 iso_8859_9 koi8r koi8u cp437 cp850
+syn keyword gnuplotKeyword cp852 cp950 cp1250 cp1251 cp1254 sjis utf8
+" set fit
+syn keyword gnuplotKeyword fit logfile default quiet noquiet results brief
+syn keyword gnuplotKeyword verbose errorvariables noerrorvariables
+syn keyword gnuplotKeyword errorscaling noerrorscaling prescale noprescale
+syn keyword gnuplotKeyword maxiter none limit limit_abs start-lambda script
+syn keyword gnuplotKeyword lambda-factor
+" set fontpath
+syn keyword gnuplotKeyword fontpath
+" set format
+syn keyword gnuplotKeyword format
+" show functions
+syn keyword gnuplotKeyword functions
+" set grid
+syn keyword gnuplotKeyword grid polar layerdefault xtics ytics ztics x2tics
+syn keyword gnuplotKeyword y2tics cbtics mxtics mytics mztics mx2tics
+syn keyword gnuplotKeyword my2tics mcbtics xmtics ymtics zmtics x2mtics
+syn keyword gnuplotKeyword y2mtics cbmtics noxtics noytics noztics nox2tics
+syn keyword gnuplotKeyword noy2tics nocbtics nomxtics nomytics nomztics
+syn keyword gnuplotKeyword nomx2tics nomy2tics nomcbtics
+" set hidden3d
+syn keyword gnuplotKeyword hidden3d offset trianglepattern undefined
+syn keyword gnuplotKeyword altdiagonal noaltdiagonal bentover nobentover
+syn keyword gnuplotKeyword noundefined
+" set historysize
+syn keyword gnuplotKeyword historysize
+" set isosamples
+syn keyword gnuplotKeyword isosamples
+" set key
+syn keyword gnuplotKeyword key on off inside outside at left right center
+syn keyword gnuplotKeyword top bottom vertical horizontal Left Right
+syn keyword gnuplotKeyword opaque noopaque reverse noreverse invert maxrows
+syn keyword gnuplotKeyword noinvert samplen spacing width height autotitle
+syn keyword gnuplotKeyword noautotitle title enhanced noenhanced font
+syn keyword gnuplotKeyword textcolor box nobox linetype linewidth maxcols
+" set label
+syn keyword gnuplotKeyword label left center right rotate norotate by font
+syn keyword gnuplotKeyword front back textcolor point nopoint offset boxed
+syn keyword gnuplotKeyword hypertext
+" set linetype
+syn keyword gnuplotKeyword linetype
+" set link
+syn keyword gnuplotKeyword link via inverse
+" set loadpath
+syn keyword gnuplotKeyword loadpath
+" set locale
+syn keyword gnuplotKeyword locale
+" set logscale
+syn keyword gnuplotKeyword logscale log
+" set macros
+syn keyword gnuplotKeyword macros
+" set mapping
+syn keyword gnuplotKeyword mapping cartesian spherical cylindrical
+" set mouse
+syn keyword gnuplotKeyword mouse doubleclick nodoubleclick zoomcoordinates
+syn keyword gnuplotKeyword nozoomcoordinates ruler noruler at polardistance
+syn keyword gnuplotKeyword nopolardistance deg tan format clipboardformat
+syn keyword gnuplotKeyword mouseformat labels nolabels zoomjump nozoomjump
+syn keyword gnuplotKeyword verbose noverbose
+" set multiplot
+syn keyword gnuplotKeyword multiplot title font layout rowsfirst downwards
+syn keyword gnuplotKeyword downwards upwards scale offset
+" set object
+syn keyword gnuplotKeyword object behind fillcolor fc fs rectangle ellipse
+syn keyword gnuplotKeyword circle polygon at center size units xy xx yy to
+syn keyword gnuplotKeyword from
+" set offsets
+syn keyword gnuplotKeyword offsets
+" set origin
+syn keyword gnuplotKeyword origin
+" set output
+syn keyword gnuplotKeyword output
+" set parametric
+syn keyword gnuplotKeyword parametric
+" show plot
+syn keyword gnuplotKeyword plot add2history
+" set pm3d
+syn keyword gnuplotKeyword hidden3d interpolate scansautomatic scansforward
+syn keyword gnuplotKeyword scansbackward depthorder flush begin center end
+syn keyword gnuplotKeyword ftriangles noftriangles clip1in clip4in mean map
+syn keyword gnuplotKeyword corners2color geomean harmean rms median min max
+syn keyword gnuplotKeyword c1 c2 c3 c4 pm3d at nohidden3d implicit explicit
+" set palette
+syn keyword gnuplotKeyword palette gray color gamma rgbformulae defined
+syn keyword gnuplotKeyword file functions cubehelix start cycles saturation
+syn keyword gnuplotKeyword model RGB HSV CMY YIQ XYZ positive negative
+syn keyword gnuplotKeyword nops_allcF ps_allcF maxcolors float int gradient
+syn keyword gnuplotKeyword fit2rgbformulae rgbformulae
+" set pointintervalbox
+syn keyword gnuplotKeyword pointintervalbox
+" set pointsize
+syn keyword gnuplotKeyword pointsize
+" set polar
+syn keyword gnuplotKeyword polar
+" set print
+syn keyword gnuplotKeyword print append
+" set psdir
+syn keyword gnuplotKeyword psdir
+" set raxis
+syn keyword gnuplotKeyword raxis rrange rtics
+" set samples
+syn keyword gnuplotKeyword samples
+" set size
+syn keyword gnuplotKeyword size square nosquare ratio noratio
+" set style
+syn keyword gnuplotKeyword style arrow auto back border boxplot
+syn keyword gnuplotKeyword candlesticks circle clustered columnstacked data
+syn keyword gnuplotKeyword default ellipse empty fill[ed] financebars
+syn keyword gnuplotKeyword fraction front function gap graph head[s]
+syn keyword gnuplotKeyword histogram increment labels lc line linecolor
+syn keyword gnuplotKeyword linetype linewidth lt lw noborder nofilled
+syn keyword gnuplotKeyword nohead nooutliers nowedge off opaque outliers
+syn keyword gnuplotKeyword palette pattern pi pointinterval pointsize
+syn keyword gnuplotKeyword pointtype ps pt radius range rectangle
+syn keyword gnuplotKeyword rowstacked screen separation size solid sorted
+syn keyword gnuplotKeyword textbox units unsorted userstyles wedge
+syn keyword gnuplotKeyword x x2 xx xy yy
+" set surface
+syn keyword gnuplotKeyword surface implicit explicit
+" set table
+syn keyword gnuplotKeyword table
+" set terminal (list of terminals)
+syn keyword gnuplotKeyword terminal term push pop aed512 aed767 aifm aqua
+syn keyword gnuplotKeyword be cairo cairolatex canvas cgm context corel
+syn keyword gnuplotKeyword debug dumb dxf dxy800a eepic emf emxvga epscairo
+syn keyword gnuplotKeyword epslatex epson_180dpi excl fig ggi gif gpic hpgl
+syn keyword gnuplotKeyword grass hp2623a hp2648 hp500c hpljii hppj imagen
+syn keyword gnuplotKeyword jpeg kyo latex linux lua mf mif mp next openstep
+syn keyword gnuplotKeyword pbm pdf pdfcairo pm png pngcairo postscript
+syn keyword gnuplotKeyword pslatex pstex pstricks qms qt regis sun svg svga
+syn keyword gnuplotKeyword tek40 tek410x texdraw tgif tikz tkcanvas tpic
+syn keyword gnuplotKeyword vgagl vws vx384 windows wx wxt x11 xlib
+" keywords for 'set terminal'
+syn keyword gnuplotKeyword color monochrome dashlength dl eps pdf fontscale
+syn keyword gnuplotKeyword standalone blacktext colortext colourtext header
+syn keyword gnuplotKeyword noheader mono color solid dashed notransparent
+syn keyword gnuplotKeyword crop crop background input rounded butt square
+syn keyword gnuplotKeyword size fsize standalone name jsdir defaultsize
+syn keyword gnuplotKeyword timestamp notimestamp colour mitered beveled
+syn keyword gnuplotKeyword round squared palfuncparam blacktext nec_cp6
+syn keyword gnuplotKeyword mppoints inlineimages externalimages defaultfont
+syn keyword gnuplotKeyword aspect feed nofeed rotate small tiny standalone
+syn keyword gnuplotKeyword oldstyle newstyle level1 leveldefault level3
+syn keyword gnuplotKeyword background nobackground solid clip noclip
+syn keyword gnuplotKeyword colortext colourtext epson_60dpi epson_lx800
+syn keyword gnuplotKeyword okidata starc tandy_60dpi dpu414 nec_cp6 draft
+syn keyword gnuplotKeyword medium large normal landscape portrait big
+syn keyword gnuplotKeyword inches pointsmax textspecial texthidden
+syn keyword gnuplotKeyword thickness depth version acceleration giant
+syn keyword gnuplotKeyword delay loop optimize nooptimize pspoints
+syn keyword gnuplotKeyword FNT9X17 FNT13X25 interlace nointerlace courier
+syn keyword gnuplotKeyword originreset nooriginreset gparrows nogparrows
+syn keyword gnuplotKeyword picenvironment nopicenvironment tightboundingbox
+syn keyword gnuplotKeyword notightboundingbox charsize gppoints nogppoints
+syn keyword gnuplotKeyword fontscale textscale fulldoc nofulldoc standalone
+syn keyword gnuplotKeyword preamble header tikzplot tikzarrows notikzarrows
+syn keyword gnuplotKeyword cmykimages externalimages noexternalimages
+syn keyword gnuplotKeyword polyline vectors magnification psnfss nopsnfss
+syn keyword gnuplotKeyword psnfss-version7 prologues a4paper amstex fname
+syn keyword gnuplotKeyword fsize server persist widelines interlace
+syn keyword gnuplotKeyword truecolor notruecolor defaultplex simplex duplex
+syn keyword gnuplotKeyword nofontfiles adobeglyphnames noadobeglyphnames
+syn keyword gnuplotKeyword nostandalone metric textrigid animate nopspoints
+syn keyword gnuplotKeyword hpdj FNT5X9 roman emtex rgbimages bitmap
+syn keyword gnuplotKeyword nobitmap providevars nointerlace add delete
+syn keyword gnuplotKeyword auxfile hacktext unit raise palfuncparam
+syn keyword gnuplotKeyword noauxfile nohacktext nounit noraise ctrl noctrl
+syn keyword gnuplotKeyword close widget fixed dynamic tek40xx vttek
+syn keyword gnuplotKeyword kc-tek40xx km-tek40xx bitgraph perltk
+syn keyword gnuplotKeyword interactive red green blue interpolate mode
+syn keyword gnuplotKeyword position ctrlq replotonresize position noctrlq
+syn keyword gnuplotKeyword noreplotonresize
+" set termoption
+syn keyword gnuplotKeyword termoption font fontscale solid dashed
+" set tics
+syn keyword gnuplotKeyword tics add axis border mirror nomirror in out
+syn keyword gnuplotKeyword scale rotate norotate by offset nooffset left
+syn keyword gnuplotKeyword autojustify format font textcolor right center
+" deprecated set ticslevel
+syn keyword gnuplotError ticslevel ticscale
+" set timestamp
+syn keyword gnuplotKeyword timestamp top bottom offset font
+" set timefmt
+syn keyword gnuplotKeyword timefmt
+" set title
+syn keyword gnuplotKeyword title offset font textcolor tc
+" set ranges
+syn keyword gnuplotKeyword trange urange vrange
+" show variables
+syn keyword gnuplotKeyword variables
+" show version
+syn keyword gnuplotKeyword version
+" set view
+syn keyword gnuplotKeyword view map equal noequal xy xyz
+" set x2data
+syn keyword gnuplotKeyword xdata ydata zdata x2data y2data cbdata xdtics
+syn keyword gnuplotKeyword ydtics zdtics x2dtics y2dtics cbdtics xzeroaxis
+syn keyword gnuplotKeyword yzeroaxis zzeroaxis x2zeroaxis y2zeroaxis
+syn keyword gnuplotKeyword cbzeroaxis time geographic
+" set label
+syn keyword gnuplotKeyword xlabel ylabel zlabel x2label y2label cblabel
+syn keyword gnuplotKeyword offset font textcolor by parallel
+" set range
+syn keyword gnuplotKeyword xrange yrange zrange x2range y2range cbrange
+" set xyplane
+syn keyword gnuplotKeyword xyplane
+" set zeroaxis
+" set zero
+syn keyword gnuplotKeyword zero
+" set zeroaxis
+syn keyword gnuplotKeyword zeroaxis
+
+" keywords for 'stats' command
+syn keyword gnuplotKeyword nooutput
+
+" keywords for 'test' command
+syn keyword gnuplotKeyword terminal palette rgb rbg grb gbr brg bgr
+
+" The transparent gnuplot keyword cannot use 'syn keyword' as transparent
+" has a special meaning in :syntax commands.
+syn match gnuplotKeyword "\<transparent\>"
+
+" ---- Macros ---- "
+
+syn match gnuplotMacro "@\w*"
+
+" ---- Todos ---- "
+
+syn keyword gnuplotTodo contained TODO FIXME XXX
+
+" ---- Types: gnuplot commands ---- "
+
+" I set the commands as Types to distinguish them visually from keywords for the
+" commands. This comes at the end of the syntax file because some commands
+" are redundant with keywords. It's probably too much trouble to go and
+" create special regions for each redundant keyword/command pair, which means
+" that some keywords (e.g. 'p') will be highlighted as commands.
+
+syn keyword gnuplotStatement cd call clear evaluate exit fit help history
+syn keyword gnuplotStatement load lower pause plot p print pwd quit raise
+syn keyword gnuplotStatement refresh replot rep reread reset save set show
+syn keyword gnuplotStatement shell splot spstats stats system test undefine
+syn keyword gnuplotStatement unset update
+
+" ---- Define the default highlighting ---- "
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/go.vim b/runtime/syntax/go.vim
new file mode 100644
index 0000000..bf967fd
--- /dev/null
+++ b/runtime/syntax/go.vim
@@ -0,0 +1,550 @@
+" Copyright 2009 The Go Authors. All rights reserved.
+" Use of this source code is governed by a BSD-style
+" license that can be found in the LICENSE file.
+"
+" go.vim: Vim syntax file for Go.
+" Language: Go
+" Maintainer: Billie Cleek <bhcleek@gmail.com>
+" Latest Revision: 2023-02-19
+" License: BSD-style. See LICENSE file in source repository.
+" Repository: https://github.com/fatih/vim-go
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+function! s:FoldEnable(...) abort
+ if a:0 > 0
+ return index(s:FoldEnable(), a:1) > -1
+ endif
+ return get(g:, 'go_fold_enable', ['block', 'import', 'varconst', 'package_comment'])
+endfunction
+
+function! s:HighlightArrayWhitespaceError() abort
+ return get(g:, 'go_highlight_array_whitespace_error', 0)
+endfunction
+
+function! s:HighlightChanWhitespaceError() abort
+ return get(g:, 'go_highlight_chan_whitespace_error', 0)
+endfunction
+
+function! s:HighlightExtraTypes() abort
+ return get(g:, 'go_highlight_extra_types', 0)
+endfunction
+
+function! s:HighlightSpaceTabError() abort
+ return get(g:, 'go_highlight_space_tab_error', 0)
+endfunction
+
+function! s:HighlightTrailingWhitespaceError() abort
+ return get(g:, 'go_highlight_trailing_whitespace_error', 0)
+endfunction
+
+function! s:HighlightOperators() abort
+ return get(g:, 'go_highlight_operators', 0)
+endfunction
+
+function! s:HighlightFunctions() abort
+ return get(g:, 'go_highlight_functions', 0)
+endfunction
+
+function! s:HighlightFunctionParameters() abort
+ return get(g:, 'go_highlight_function_parameters', 0)
+endfunction
+
+function! s:HighlightFunctionCalls() abort
+ return get(g:, 'go_highlight_function_calls', 0)
+endfunction
+
+function! s:HighlightFields() abort
+ return get(g:, 'go_highlight_fields', 0)
+endfunction
+
+function! s:HighlightTypes() abort
+ return get(g:, 'go_highlight_types', 0)
+endfunction
+
+function! s:HighlightBuildConstraints() abort
+ return get(g:, 'go_highlight_build_constraints', 0)
+endfunction
+
+function! s:HighlightStringSpellcheck() abort
+ return get(g:, 'go_highlight_string_spellcheck', 1)
+endfunction
+
+function! s:HighlightFormatStrings() abort
+ return get(g:, 'go_highlight_format_strings', 1)
+endfunction
+
+function! s:HighlightGenerateTags() abort
+ return get(g:, 'go_highlight_generate_tags', 0)
+endfunction
+
+function! s:HighlightVariableAssignments() abort
+ return get(g:, 'go_highlight_variable_assignments', 0)
+endfunction
+
+function! s:HighlightVariableDeclarations() abort
+ return get(g:, 'go_highlight_variable_declarations', 0)
+endfunction
+
+syn case match
+
+syn keyword goPackage package
+syn keyword goImport import contained
+syn keyword goVar var contained
+syn keyword goConst const contained
+
+hi def link goPackage Statement
+hi def link goImport Statement
+hi def link goVar Keyword
+hi def link goConst Keyword
+hi def link goDeclaration Keyword
+
+" Keywords within functions
+syn keyword goStatement defer go goto return break continue fallthrough
+syn keyword goConditional if else switch select
+syn keyword goLabel case default
+syn keyword goRepeat for range
+
+hi def link goStatement Statement
+hi def link goConditional Conditional
+hi def link goLabel Label
+hi def link goRepeat Repeat
+
+" Predefined types
+syn keyword goType chan map bool string error any comparable
+syn keyword goSignedInts int int8 int16 int32 int64 rune
+syn keyword goUnsignedInts byte uint uint8 uint16 uint32 uint64 uintptr
+syn keyword goFloats float32 float64
+syn keyword goComplexes complex64 complex128
+
+hi def link goType Type
+hi def link goSignedInts Type
+hi def link goUnsignedInts Type
+hi def link goFloats Type
+hi def link goComplexes Type
+
+" Predefined functions and values
+syn keyword goBuiltins append cap close complex copy delete imag len
+syn keyword goBuiltins make new panic print println real recover
+syn keyword goBoolean true false
+syn keyword goPredefinedIdentifiers nil iota
+
+hi def link goBuiltins Identifier
+hi def link goPredefinedIdentifiers Constant
+" Boolean links to Constant by default by vim: goBoolean and goPredefinedIdentifiers
+" will be highlighted the same, but having the separate groups allows users to
+" have separate highlighting for them if they desire.
+hi def link goBoolean Boolean
+
+" Comments; their contents
+syn keyword goTodo contained TODO FIXME XXX BUG
+syn cluster goCommentGroup contains=goTodo
+
+syn region goComment start="//" end="$" contains=goGenerate,@goCommentGroup,@Spell
+if s:FoldEnable('comment')
+ syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell fold
+ syn match goComment "\v(^\s*//.*\n)+" contains=goGenerate,@goCommentGroup,@Spell fold
+else
+ syn region goComment start="/\*" end="\*/" contains=@goCommentGroup,@Spell
+endif
+
+hi def link goComment Comment
+hi def link goTodo Todo
+
+if s:HighlightGenerateTags()
+ syn match goGenerateVariables contained /\%(\$GOARCH\|\$GOOS\|\$GOFILE\|\$GOLINE\|\$GOPACKAGE\|\$DOLLAR\)\>/
+ syn region goGenerate start="^\s*//go:generate" end="$" contains=goGenerateVariables
+ hi def link goGenerate PreProc
+ hi def link goGenerateVariables Special
+endif
+
+" Go escapes
+syn match goEscapeOctal display contained "\\[0-7]\{3}"
+syn match goEscapeC display contained +\\[abfnrtv\\'"]+
+syn match goEscapeX display contained "\\x\x\{2}"
+syn match goEscapeU display contained "\\u\x\{4}"
+syn match goEscapeBigU display contained "\\U\x\{8}"
+syn match goEscapeError display contained +\\[^0-7xuUabfnrtv\\'"]+
+
+hi def link goEscapeOctal goSpecialString
+hi def link goEscapeC goSpecialString
+hi def link goEscapeX goSpecialString
+hi def link goEscapeU goSpecialString
+hi def link goEscapeBigU goSpecialString
+hi def link goSpecialString Special
+hi def link goEscapeError Error
+
+" Strings and their contents
+syn cluster goStringGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU,goEscapeError
+if s:HighlightStringSpellcheck()
+ syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup,@Spell
+ syn region goRawString start=+`+ end=+`+ contains=@Spell
+else
+ syn region goString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@goStringGroup
+ syn region goRawString start=+`+ end=+`+
+endif
+
+syn match goImportString /^\%(\s\+\|import \)\(\h\w* \)\?\zs"[^"]\+"$/ contained containedin=goImport
+
+if s:HighlightFormatStrings()
+ " [n] notation is valid for specifying explicit argument indexes
+ " 1. Match a literal % not preceded by a %.
+ " 2. Match any number of -, #, 0, space, or +
+ " 3. Match * or [n]* or any number or nothing before a .
+ " 4. Match * or [n]* or any number or nothing after a .
+ " 5. Match [n] or nothing before a verb
+ " 6. Match a formatting verb
+ syn match goFormatSpecifier /\
+ \%([^%]\%(%%\)*\)\
+ \@<=%[-#0 +]*\
+ \%(\%(\%(\[\d\+\]\)\=\*\)\|\d\+\)\=\
+ \%(\.\%(\%(\%(\[\d\+\]\)\=\*\)\|\d\+\)\=\)\=\
+ \%(\[\d\+\]\)\=[vTtbcdoqxXUeEfFgGspw]/ contained containedin=goString,goRawString
+ hi def link goFormatSpecifier goSpecialString
+endif
+
+hi def link goImportString String
+hi def link goString String
+hi def link goRawString String
+
+" Characters; their contents
+syn cluster goCharacterGroup contains=goEscapeOctal,goEscapeC,goEscapeX,goEscapeU,goEscapeBigU
+syn region goCharacter start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@goCharacterGroup
+
+hi def link goCharacter Character
+
+" Regions
+syn region goParen start='(' end=')' transparent
+if s:FoldEnable('block')
+ syn region goBlock start="{" end="}" transparent fold
+else
+ syn region goBlock start="{" end="}" transparent
+endif
+
+" import
+if s:FoldEnable('import')
+ syn region goImport start='import (' end=')' transparent fold contains=goImport,goImportString,goComment
+else
+ syn region goImport start='import (' end=')' transparent contains=goImport,goImportString,goComment
+endif
+
+" var, const
+if s:FoldEnable('varconst')
+ syn region goVar start='var (' end='^\s*)$' transparent fold
+ \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ syn region goConst start='const (' end='^\s*)$' transparent fold
+ \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+else
+ syn region goVar start='var (' end='^\s*)$' transparent
+ \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+ syn region goConst start='const (' end='^\s*)$' transparent
+ \ contains=ALLBUT,goParen,goBlock,goFunction,goTypeName,goReceiverType,goReceiverVar,goParamName,goParamType,goSimpleParams,goPointerOperator
+endif
+
+" Single-line var, const, and import.
+syn match goSingleDecl /\%(import\|var\|const\) [^(]\@=/ contains=goImport,goVar,goConst
+
+" Integers
+syn match goDecimalInt "\<-\=\%(0\|\%(\d\|\d_\d\)\+\)\>"
+syn match goHexadecimalInt "\<-\=0[xX]_\?\%(\x\|\x_\x\)\+\>"
+syn match goOctalInt "\<-\=0[oO]\?_\?\%(\o\|\o_\o\)\+\>"
+syn match goBinaryInt "\<-\=0[bB]_\?\%([01]\|[01]_[01]\)\+\>"
+
+hi def link goDecimalInt Integer
+hi def link goDecimalError Error
+hi def link goHexadecimalInt Integer
+hi def link goHexadecimalError Error
+hi def link goOctalInt Integer
+hi def link goOctalError Error
+hi def link goBinaryInt Integer
+hi def link goBinaryError Error
+hi def link Integer Number
+
+" Floating point
+"float_lit = decimal_float_lit | hex_float_lit .
+"
+"decimal_float_lit = decimal_digits "." [ decimal_digits ] [ decimal_exponent ] |
+" decimal_digits decimal_exponent |
+" "." decimal_digits [ decimal_exponent ] .
+"decimal_exponent = ( "e" | "E" ) [ "+" | "-" ] decimal_digits .
+"
+"hex_float_lit = "0" ( "x" | "X" ) hex_mantissa hex_exponent .
+"hex_mantissa = [ "_" ] hex_digits "." [ hex_digits ] |
+" [ "_" ] hex_digits |
+" "." hex_digits .
+"hex_exponent = ( "p" | "P" ) [ "+" | "-" ] decimal_digits .
+" decimal floats with a decimal point
+syn match goFloat "\<-\=\%(0\|\%(\d\|\d_\d\)\+\)\.\%(\%(\%(\d\|\d_\d\)\+\)\=\%([Ee][-+]\=\%(\d\|\d_\d\)\+\)\=\>\)\="
+syn match goFloat "\s\zs-\=\.\%(\d\|\d_\d\)\+\%(\%([Ee][-+]\=\%(\d\|\d_\d\)\+\)\>\)\="
+" decimal floats without a decimal point
+syn match goFloat "\<-\=\%(0\|\%(\d\|\d_\d\)\+\)[Ee][-+]\=\%(\d\|\d_\d\)\+\>"
+" hexadecimal floats with a decimal point
+syn match goHexadecimalFloat "\<-\=0[xX]\%(_\x\|\x\)\+\.\%(\%(\x\|\x_\x\)\+\)\=\%([Pp][-+]\=\%(\d\|\d_\d\)\+\)\=\>"
+syn match goHexadecimalFloat "\<-\=0[xX]\.\%(\x\|\x_\x\)\+\%([Pp][-+]\=\%(\d\|\d_\d\)\+\)\=\>"
+" hexadecimal floats without a decimal point
+syn match goHexadecimalFloat "\<-\=0[xX]\%(_\x\|\x\)\+[Pp][-+]\=\%(\d\|\d_\d\)\+\>"
+
+hi def link goFloat Float
+hi def link goHexadecimalFloat Float
+
+" Imaginary literals
+syn match goImaginaryDecimal "\<-\=\%(0\|\%(\d\|\d_\d\)\+\)i\>"
+syn match goImaginaryHexadecimal "\<-\=0[xX]_\?\%(\x\|\x_\x\)\+i\>"
+syn match goImaginaryOctal "\<-\=0[oO]\?_\?\%(\o\|\o_\o\)\+i\>"
+syn match goImaginaryBinary "\<-\=0[bB]_\?\%([01]\|[01]_[01]\)\+i\>"
+
+" imaginary decimal floats with a decimal point
+syn match goImaginaryFloat "\<-\=\%(0\|\%(\d\|\d_\d\)\+\)\.\%(\%(\%(\d\|\d_\d\)\+\)\=\%([Ee][-+]\=\%(\d\|\d_\d\)\+\)\=\)\=i\>"
+syn match goImaginaryFloat "\s\zs-\=\.\%(\d\|\d_\d\)\+\%([Ee][-+]\=\%(\d\|\d_\d\)\+\)\=i\>"
+" imaginary decimal floats without a decimal point
+syn match goImaginaryFloat "\<-\=\%(0\|\%(\d\|\d_\d\)\+\)[Ee][-+]\=\%(\d\|\d_\d\)\+i\>"
+" imaginary hexadecimal floats with a decimal point
+syn match goImaginaryHexadecimalFloat "\<-\=0[xX]\%(_\x\|\x\)\+\.\%(\%(\x\|\x_\x\)\+\)\=\%([Pp][-+]\=\%(\d\|\d_\d\)\+\)\=i\>"
+syn match goImaginaryHexadecimalFloat "\<-\=0[xX]\.\%(\x\|\x_\x\)\+\%([Pp][-+]\=\%(\d\|\d_\d\)\+\)\=i\>"
+" imaginary hexadecimal floats without a decimal point
+syn match goImaginaryHexadecimalFloat "\<-\=0[xX]\%(_\x\|\x\)\+[Pp][-+]\=\%(\d\|\d_\d\)\+i\>"
+
+hi def link goImaginaryDecimal Number
+hi def link goImaginaryHexadecimal Number
+hi def link goImaginaryOctal Number
+hi def link goImaginaryBinary Number
+hi def link goImaginaryFloat Float
+hi def link goImaginaryHexadecimalFloat Float
+
+" Spaces after "[]"
+if s:HighlightArrayWhitespaceError()
+ syn match goSpaceError display "\%(\[\]\)\@<=\s\+"
+endif
+
+" Spacing errors around the 'chan' keyword
+if s:HighlightChanWhitespaceError()
+ " receive-only annotation on chan type
+ "
+ " \(\<chan\>\)\@<!<- (only pick arrow when it doesn't come after a chan)
+ " this prevents picking up 'chan<- chan<-' but not '<- chan'
+ syn match goSpaceError display "\%(\%(\<chan\>\)\@<!<-\)\@<=\s\+\%(\<chan\>\)\@="
+
+ " send-only annotation on chan type
+ "
+ " \(<-\)\@<!\<chan\> (only pick chan when it doesn't come after an arrow)
+ " this prevents picking up '<-chan <-chan' but not 'chan <-'
+ syn match goSpaceError display "\%(\%(<-\)\@<!\<chan\>\)\@<=\s\+\%(<-\)\@="
+
+ " value-ignoring receives in a few contexts
+ syn match goSpaceError display "\%(\%(^\|[={(,;]\)\s*<-\)\@<=\s\+"
+endif
+
+" Extra types commonly seen
+if s:HighlightExtraTypes()
+ syn match goExtraType /\<bytes\.\%(Buffer\)\>/
+ syn match goExtraType /\<context\.\%(Context\)\>/
+ syn match goExtraType /\<io\.\%(Reader\|ReadSeeker\|ReadWriter\|ReadCloser\|ReadWriteCloser\|Writer\|WriteCloser\|Seeker\)\>/
+ syn match goExtraType /\<reflect\.\%(Kind\|Type\|Value\)\>/
+ syn match goExtraType /\<unsafe\.Pointer\>/
+endif
+
+" Space-tab error
+if s:HighlightSpaceTabError()
+ syn match goSpaceError display " \+\t"me=e-1
+endif
+
+" Trailing white space error
+if s:HighlightTrailingWhitespaceError()
+ syn match goSpaceError display excludenl "\s\+$"
+endif
+
+hi def link goExtraType Type
+hi def link goSpaceError Error
+
+
+
+" included from: https://github.com/athom/more-colorful.vim/blob/master/after/syntax/go.vim
+"
+" Comments; their contents
+syn keyword goTodo contained NOTE
+hi def link goTodo Todo
+
+syn match goVarArgs /\.\.\./
+
+" Operators;
+if s:HighlightOperators()
+ " match single-char operators: - + % < > ! & | ^ * =
+ " and corresponding two-char operators: -= += %= <= >= != &= |= ^= *= ==
+ syn match goOperator /[-+%<>!&|^*=]=\?/
+ " match / and /=
+ syn match goOperator /\/\%(=\|\ze[^/*]\)/
+ " match two-char operators: << >> &^
+ " and corresponding three-char operators: <<= >>= &^=
+ syn match goOperator /\%(<<\|>>\|&^\)=\?/
+ " match remaining two-char operators: := && || <- ++ --
+ syn match goOperator /:=\|||\|<-\|++\|--/
+ " match ~
+ syn match goOperator /\~/
+ " match ...
+
+ hi def link goPointerOperator goOperator
+ hi def link goVarArgs goOperator
+endif
+hi def link goOperator Operator
+
+" -> type constraint opening bracket
+" |-> start non-counting group
+" || -> any word character
+" || | -> at least one, as many as possible
+" || | | -> start non-counting group
+" || | | | -> match ~
+" || | | | | -> at most once
+" || | | | | | -> allow a slice type
+" || | | | | | | -> any word character
+" || | | | | | | | -> start a non-counting group
+" || | | | | | | | | -> that matches word characters and |
+" || | | | | | | | | | -> close the non-counting group
+" || | | | | | | | | | | -> close the non-counting group
+" || | | | | | | | | | | |-> any number of matches
+" || | | | | | | | | | | || -> start a non-counting group
+" || | | | | | | | | | | || | -> a comma and whitespace
+" || | | | | | | | | | | || | | -> at most once
+" || | | | | | | | | | | || | | | -> close the non-counting group
+" || | | | | | | | | | | || | | | | -> at least one of those non-counting groups, as many as possible
+" || | | | | | -------- | | | | || | | | | | -> type constraint closing bracket
+" || | | | | || | | | | | || | | | | | |
+syn match goTypeParams /\[\%(\w\+\s\+\%(\~\?\%(\[]\)\?\w\%(\w\||\)\)*\%(,\s*\)\?\)\+\]/ nextgroup=goSimpleParams,goDeclType contained
+
+" Functions;
+if s:HighlightFunctions() || s:HighlightFunctionParameters()
+ syn match goDeclaration /\<func\>/ nextgroup=goReceiver,goFunction,goSimpleParams skipwhite skipnl
+ syn match goReceiverDecl /(\s*\zs\%(\%(\w\+\s\+\)\?\*\?\w\+\%(\[\%(\%(\[\]\)\?\w\+\%(,\s*\)\?\)\+\]\)\?\)\ze\s*)/ contained contains=goReceiverVar,goReceiverType,goPointerOperator
+ syn match goReceiverVar /\w\+\ze\s\+\%(\w\|\*\)/ nextgroup=goPointerOperator,goReceiverType skipwhite skipnl contained
+ syn match goPointerOperator /\*/ nextgroup=goReceiverType contained skipwhite skipnl
+ syn match goFunction /\w\+/ nextgroup=goSimpleParams,goTypeParams contained skipwhite skipnl
+ syn match goReceiverType /\w\+\%(\[\%(\%(\[\]\)\?\w\+\%(,\s*\)\?\)\+\]\)\?\ze\s*)/ contained
+ if s:HighlightFunctionParameters()
+ syn match goSimpleParams /(\%(\w\|\_s\|[*\.\[\],\{\}<>-]\)*)/ contained contains=goParamName,goType nextgroup=goFunctionReturn skipwhite skipnl
+ syn match goFunctionReturn /(\%(\w\|\_s\|[*\.\[\],\{\}<>-]\)*)/ contained contains=goParamName,goType skipwhite skipnl
+ syn match goParamName /\w\+\%(\s*,\s*\w\+\)*\ze\s\+\%(\w\|\.\|\*\|\[\)/ contained nextgroup=goParamType skipwhite skipnl
+ syn match goParamType /\%([^,)]\|\_s\)\+,\?/ contained nextgroup=goParamName skipwhite skipnl
+ \ contains=goVarArgs,goType,goSignedInts,goUnsignedInts,goFloats,goComplexes,goDeclType,goBlock
+ hi def link goReceiverVar goParamName
+ hi def link goParamName Identifier
+ endif
+ syn match goReceiver /(\s*\%(\w\+\s\+\)\?\*\?\s*\w\+\%(\[\%(\%(\[\]\)\?\w\+\%(,\s*\)\?\)\+\]\)\?\s*)\ze\s*\w/ contained nextgroup=goFunction contains=goReceiverDecl skipwhite skipnl
+else
+ syn keyword goDeclaration func
+endif
+hi def link goFunction Function
+
+" Function calls;
+if s:HighlightFunctionCalls()
+ syn match goFunctionCall /\w\+\ze\%(\[\%(\%(\[]\)\?\w\+\(,\s*\)\?\)\+\]\)\?(/ contains=goBuiltins,goDeclaration
+endif
+hi def link goFunctionCall Type
+
+" Fields;
+if s:HighlightFields()
+ " 1. Match a sequence of word characters coming after a '.'
+ " 2. Require the following but dont match it: ( \@= see :h E59)
+ " - The symbols: / - + * % OR
+ " - The symbols: [] {} <> ) OR
+ " - The symbols: \n \r space OR
+ " - The symbols: , : .
+ " 3. Have the start of highlight (hs) be the start of matched
+ " pattern (s) offsetted one to the right (+1) (see :h E401)
+ syn match goField /\.\w\+\
+ \%(\%([\/\-\+*%]\)\|\
+ \%([\[\]{}<\>\)]\)\|\
+ \%([\!=\^|&]\)\|\
+ \%([\n\r\ ]\)\|\
+ \%([,\:.]\)\)\@=/hs=s+1
+endif
+hi def link goField Identifier
+
+" Structs & Interfaces;
+if s:HighlightTypes()
+ syn match goTypeConstructor /\<\w\+{\@=/
+ syn match goTypeDecl /\<type\>/ nextgroup=goTypeName skipwhite skipnl
+ syn match goTypeName /\w\+/ contained nextgroup=goDeclType,goTypeParams skipwhite skipnl
+ syn match goDeclType /\<\%(interface\|struct\)\>/ skipwhite skipnl
+ hi def link goReceiverType Type
+else
+ syn keyword goDeclType struct interface
+ syn keyword goDeclaration type
+endif
+hi def link goTypeConstructor Type
+hi def link goTypeName Type
+hi def link goTypeDecl Keyword
+hi def link goDeclType Keyword
+
+" Variable Assignments
+if s:HighlightVariableAssignments()
+ syn match goVarAssign /\v[_.[:alnum:]]+(,\s*[_.[:alnum:]]+)*\ze(\s*([-^+|^\/%&]|\*|\<\<|\>\>|\&\^)?\=[^=])/
+ hi def link goVarAssign Special
+endif
+
+" Variable Declarations
+if s:HighlightVariableDeclarations()
+ syn match goVarDefs /\v\w+(,\s*\w+)*\ze(\s*:\=)/
+ hi def link goVarDefs Special
+endif
+
+" Build Constraints
+if s:HighlightBuildConstraints()
+ syn match goBuildKeyword display contained "+build\|go:build"
+ " Highlight the known values of GOOS, GOARCH, and other +build options.
+ syn keyword goBuildDirectives contained
+ \ android darwin dragonfly freebsd linux nacl netbsd openbsd plan9
+ \ solaris windows 386 amd64 amd64p32 arm armbe arm64 arm64be ppc64
+ \ ppc64le mips mipsle mips64 mips64le mips64p32 mips64p32le ppc
+ \ s390 s390x sparc sparc64 cgo ignore race
+
+ " Other words in the build directive are build tags not listed above, so
+ " avoid highlighting them as comments by using a matchgroup just for the
+ " start of the comment.
+ " The rs=s+2 option lets the \s*+build portion be part of the inner region
+ " instead of the matchgroup so it will be highlighted as a goBuildKeyword.
+ syn region goBuildComment matchgroup=goBuildCommentStart
+ \ start="//\(\s*+build\s\|go:build\)"rs=s+2 end="$"
+ \ contains=goBuildKeyword,goBuildDirectives
+ hi def link goBuildCommentStart Comment
+ hi def link goBuildDirectives Type
+ hi def link goBuildKeyword PreProc
+endif
+
+if s:HighlightBuildConstraints() || s:FoldEnable('package_comment')
+ " One or more line comments that are followed immediately by a "package"
+ " declaration are treated like package documentation, so these must be
+ " matched as comments to avoid looking like working build constraints.
+ " The he, me, and re options let the "package" itself be highlighted by
+ " the usual rules.
+ exe 'syn region goPackageComment start=/\v(\/\/.*\n)+\s*package/'
+ \ . ' end=/\v\n\s*package/he=e-7,me=e-7,re=e-7'
+ \ . ' contains=@goCommentGroup,@Spell'
+ \ . (s:FoldEnable('package_comment') ? ' fold' : '')
+ exe 'syn region goPackageComment start=/\v^\s*\/\*.*\n(.*\n)*\s*\*\/\npackage/'
+ \ . ' end=/\v\*\/\n\s*package/he=e-7,me=e-7,re=e-7'
+ \ . ' contains=@goCommentGroup,@Spell'
+ \ . (s:FoldEnable('package_comment') ? ' fold' : '')
+ hi def link goPackageComment Comment
+endif
+
+" :GoCoverage commands
+hi def link goCoverageNormalText Comment
+
+" Search backwards for a global declaration to start processing the syntax.
+"syn sync match goSync grouphere NONE /^\(const\|var\|type\|func\)\>/
+
+" There's a bug in the implementation of grouphere. For now, use the
+" following as a more expensive/less precise workaround.
+syn sync minlines=500
+
+let b:current_syntax = "go"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: sw=2 sts=2 et
diff --git a/runtime/syntax/godoc.vim b/runtime/syntax/godoc.vim
new file mode 100644
index 0000000..0603f51
--- /dev/null
+++ b/runtime/syntax/godoc.vim
@@ -0,0 +1,19 @@
+" Vim syntax file
+" Language: Godoc (generated documentation for go)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
+" Last Change: 2014 Aug 16
+
+if exists('b:current_syntax')
+ finish
+endif
+
+syn case match
+syn match godocTitle "^\([A-Z][A-Z ]*\)$"
+
+
+hi def link godocTitle Title
+
+
+let b:current_syntax = 'godoc'
+
+" vim: sw=2 sts=2 et
diff --git a/runtime/syntax/gp.vim b/runtime/syntax/gp.vim
new file mode 100644
index 0000000..aecf7df
--- /dev/null
+++ b/runtime/syntax/gp.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: gp (version 2.5)
+" Maintainer: Karim Belabas <Karim.Belabas@math.u-bordeaux.fr>
+" Last change: 2012 Jan 08
+" URL: http://pari.math.u-bordeaux.fr
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" control statements
+syntax keyword gpStatement break return next
+syntax keyword gpConditional if
+syntax keyword gpRepeat until while for fordiv forell forprime
+syntax keyword gpRepeat forsubgroup forstep forvec
+" storage class
+syntax keyword gpScope my local global
+" defaults
+syntax keyword gpInterfaceKey breakloop colors compatible
+syntax keyword gpInterfaceKey datadir debug debugfiles debugmem
+syntax keyword gpInterfaceKey echo factor_add_primes factor_proven format
+syntax keyword gpInterfaceKey graphcolormap graphcolors
+syntax keyword gpInterfaceKey help histfile histsize
+syntax keyword gpInterfaceKey lines linewrap log logfile new_galois_format
+syntax keyword gpInterfaceKey output parisize path prettyprinter primelimit
+syntax keyword gpInterfaceKey prompt prompt_cont psfile
+syntax keyword gpInterfaceKey readline realprecision recover
+syntax keyword gpInterfaceKey secure seriesprecision simplify strictmatch
+syntax keyword gpInterfaceKey TeXstyle timer
+
+syntax match gpInterface "^\s*\\[a-z].*"
+syntax keyword gpInterface default
+syntax keyword gpInput read input
+
+" functions
+syntax match gpFunRegion "^\s*[a-zA-Z][_a-zA-Z0-9]*(.*)\s*=\s*[^ \t=]"me=e-1 contains=gpFunction,gpArgs
+syntax match gpFunRegion "^\s*[a-zA-Z][_a-zA-Z0-9]*(.*)\s*=\s*$" contains=gpFunction,gpArgs
+syntax match gpArgs contained "[a-zA-Z][_a-zA-Z0-9]*"
+syntax match gpFunction contained "^\s*[a-zA-Z][_a-zA-Z0-9]*("me=e-1
+
+" String and Character constants
+" Highlight special (backslash'ed) characters differently
+syntax match gpSpecial contained "\\[ent\\]"
+syntax region gpString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=gpSpecial
+
+"comments
+syntax region gpComment start="/\*" end="\*/" contains=gpTodo
+syntax match gpComment "\\\\.*" contains=gpTodo
+syntax keyword gpTodo contained TODO
+syntax sync ccomment gpComment minlines=10
+
+"catch errors caused by wrong parenthesis
+syntax region gpParen transparent start='(' end=')' contains=ALLBUT,gpParenError,gpTodo,gpFunction,gpArgs,gpSpecial
+syntax match gpParenError ")"
+syntax match gpInParen contained "[{}]"
+
+
+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
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/gpg.vim b/runtime/syntax/gpg.vim
new file mode 100644
index 0000000..57f712b
--- /dev/null
+++ b/runtime/syntax/gpg.vim
@@ -0,0 +1,107 @@
+" Vim syntax file
+" Language: gpg(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-10-14
+" Updated: 2023-01-23 @ObserverOfTime: added a couple of keywords
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-
+
+syn keyword gpgTodo contained FIXME TODO XXX NOTE
+
+syn region gpgComment contained display oneline start='#' end='$'
+ \ contains=gpgTodo,gpgID,@Spell
+
+syn match gpgID contained display '\<\(0x\)\=\x\{8,}\>'
+
+syn match gpgBegin display '^' skipwhite nextgroup=gpgComment,gpgOption,gpgCommand
+
+syn keyword gpgCommand contained skipwhite nextgroup=gpgArg
+ \ check-sigs decrypt decrypt-files delete-key
+ \ delete-secret-and-public-key delete-secret-key
+ \ edit-key encrypt-files export export-all
+ \ export-ownertrust export-secret-keys
+ \ export-secret-subkeys fast-import fingerprint
+ \ gen-prime gen-random import import-ownertrust
+ \ list-keys list-public-keys list-secret-keys
+ \ list-sigs lsign-key nrsign-key print-md print-mds
+ \ recv-keys search-keys send-keys sign-key verify
+ \ verify-files
+syn keyword gpgCommand contained skipwhite nextgroup=gpgArgError
+ \ check-trustdb clearsign desig-revoke detach-sign
+ \ encrypt gen-key gen-revoke help list-packets
+ \ rebuild-keydb-caches sign store symmetric
+ \ update-trustdb version warranty
+
+syn keyword gpgOption contained skipwhite nextgroup=gpgArg
+ \ attribute-fd cert-digest-algo charset cipher-algo
+ \ command-fd comment completes-needed compress
+ \ compress-algo debug default-cert-check-level
+ \ default-key default-preference-list
+ \ default-recipient digest-algo disable-cipher-algo
+ \ disable-pubkey-algo encrypt-to exec-path
+ \ export-options group homedir import-options
+ \ keyring keyserver keyserver-options load-extension
+ \ local-user logger-fd marginals-needed max-cert-depth
+ \ notation-data options output override-session-key
+ \ passphrase-fd personal-cipher-preferences
+ \ personal-compress-preferences
+ \ personal-digest-preferences photo-viewer
+ \ recipient s2k-cipher-algo s2k-digest-algo s2k-mode
+ \ secret-keyring set-filename set-policy-url status-fd
+ \ trusted-key verify-options keyid-format list-options
+ \ default-new-key-algo weak-digest
+syn keyword gpgOption contained skipwhite nextgroup=gpgArgError
+ \ allow-freeform-uid allow-non-selfsigned-uid
+ \ allow-secret-key-import always-trust
+ \ armor ask-cert-expire ask-sig-expire
+ \ auto-check-trustdb batch debug-all default-comment
+ \ default-recipient-self dry-run emit-version
+ \ emulate-md-encode-bug enable-special-filenames
+ \ escape-from-lines expert fast-list-mode
+ \ fixed-list-mode for-your-eyes-only
+ \ force-mdc force-v3-sigs force-v4-certs
+ \ gpg-agent-info ignore-crc-error ignore-mdc-error
+ \ ignore-time-conflict ignore-valid-from interactive
+ \ list-only lock-multiple lock-never lock-once
+ \ merge-only no no-allow-non-selfsigned-uid
+ \ no-armor no-ask-cert-expire no-ask-sig-expire
+ \ no-auto-check-trustdb no-batch no-comment
+ \ no-default-keyring no-default-recipient
+ \ no-encrypt-to no-expensive-trust-checks
+ \ no-expert no-for-your-eyes-only no-force-v3-sigs
+ \ no-force-v4-certs no-greeting no-literal
+ \ no-mdc-warning no-options no-permission-warning
+ \ no-pgp2 no-pgp6 no-pgp7 no-random-seed-file
+ \ no-secmem-warning no-show-notation no-show-photos
+ \ no-show-policy-url no-sig-cache no-sig-create-check
+ \ no-sk-comments no-tty no-utf8-strings no-verbose
+ \ no-version not-dash-escaped openpgp pgp2
+ \ pgp6 pgp7 preserve-permissions quiet rfc1991
+ \ set-filesize show-keyring show-notation show-photos
+ \ show-policy-url show-session-key simple-sk-checksum
+ \ sk-comments skip-verify textmode throw-keyid
+ \ try-all-secrets use-agent use-embedded-filename
+ \ utf8-strings verbose with-colons with-fingerprint
+ \ with-key-data yes
+
+syn match gpgArg contained display '\S\+\(\s\+\S\+\)*' contains=gpgID
+syn match gpgArgError contained display '\S\+\(\s\+\S\+\)*'
+
+hi def link gpgComment Comment
+hi def link gpgTodo Todo
+hi def link gpgID Number
+hi def link gpgOption Keyword
+hi def link gpgCommand Error
+hi def link gpgArgError Error
+
+let b:current_syntax = "gpg"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/gprof.vim b/runtime/syntax/gprof.vim
new file mode 100644
index 0000000..d2c5cb4
--- /dev/null
+++ b/runtime/syntax/gprof.vim
@@ -0,0 +1,70 @@
+" Vim syntax file
+" Language: Syntax for Gprof Output
+" Maintainer: Dominique Pelle <dominique.pelle@gmail.com>
+" Last Change: 2021 Sep 19
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+syn spell notoplevel
+syn case match
+syn sync minlines=100
+
+" Flat profile
+syn match gprofFlatProfileTitle
+ \ "^Flat profile:$"
+syn region gprofFlatProfileHeader
+ \ start="^Each sample counts as.*"
+ \ end="^ time.*name\s*$"
+syn region gprofFlatProfileTrailer
+ \ start="^\s*%\s\+the percentage of the total running time.*"
+ \ end="^\s*the gprof listing if it were to be printed\."
+
+" Call graph
+syn match gprofCallGraphTitle "Call graph (explanation follows)"
+syn region gprofCallGraphHeader
+ \ start="^granularity: each sample hit covers.*"
+ \ end="^\s*index % time\s\+self\s\+children\s\+called\s\+name$"
+syn match gprofCallGraphFunction "\<\(\d\+\.\d\+\s\+\)\{3}\([0-9+]\+\)\?\s\+[a-zA-Z_<].*\ze\["
+syn match gprofCallGraphSeparator "^-\+$"
+syn region gprofCallGraphTrailer
+ \ start="This table describes the call tree of the program"
+ \ end="^\s*the cycle\.$"
+
+" Index
+syn region gprofIndex
+ \ start="^Index by function name$"
+ \ end="\%$"
+
+syn match gprofIndexFunctionTitle "^Index by function name$"
+
+syn match gprofNumbers "^\s*[0-9 ./+]\+"
+syn match gprofFunctionIndex "\[\d\+\]"
+syn match gprofSpecial "<\(spontaneous\|cycle \d\+\)>"
+
+hi def link gprofFlatProfileTitle Title
+hi def link gprofFlatProfileHeader Comment
+hi def link gprofFlatProfileFunction Number
+hi def link gprofFlatProfileTrailer Comment
+
+hi def link gprofCallGraphTitle Title
+hi def link gprofCallGraphHeader Comment
+hi def link gprofFlatProfileFunction Number
+hi def link gprofCallGraphFunction Special
+hi def link gprofCallGraphTrailer Comment
+hi def link gprofCallGraphSeparator Label
+
+hi def link gprofFunctionIndex Label
+hi def link gprofSpecial SpecialKey
+hi def link gprofNumbers Number
+
+hi def link gprofIndexFunctionTitle Title
+
+let b:current_syntax = "gprof"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/syntax/grads.vim b/runtime/syntax/grads.vim
new file mode 100644
index 0000000..50be14b
--- /dev/null
+++ b/runtime/syntax/grads.vim
@@ -0,0 +1,73 @@
+" Vim syntax file
+" Language: grads (GrADS scripts)
+" Maintainer: Stefan Fronzek (sfronzek at gmx dot net)
+" Last change: 13 Feb 2004
+
+" Grid Analysis and Display System (GrADS); http://grads.iges.org/grads
+" This syntax file defines highlighting for only very few features of
+" the GrADS scripting language.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" GrADS is entirely case-insensitive.
+syn case ignore
+
+" The keywords
+
+syn keyword gradsStatement if else endif break exit return
+syn keyword gradsStatement while endwhile say prompt pull function
+syn keyword gradsStatement subwrd sublin substr read write close
+" String
+
+syn region gradsString start=+'+ end=+'+
+
+" Integer number
+syn match gradsNumber "[+-]\=\<[0-9]\+\>"
+
+" Operator
+
+"syn keyword gradsOperator | ! % & != >=
+"syn match gradsOperator "[^\.]not[^a-zA-Z]"
+
+" Variables
+
+syn keyword gradsFixVariables lat lon lev result rec rc
+syn match gradsglobalVariables "_[a-zA-Z][a-zA-Z0-9]*"
+syn match gradsVariables "[a-zA-Z][a-zA-Z0-9]*"
+syn match gradsConst "#[A-Z][A-Z_]+"
+
+" Comments
+
+syn match gradsComment "\*.*"
+
+" Typical Typos
+
+" for C programmers:
+" syn match gradsTypos "=="
+" syn match gradsTypos "!="
+
+" Define the default highlighting.
+" Only when an item doesn't hgs highlighting+yet
+
+hi def link gradsStatement Statement
+
+hi def link gradsString String
+hi def link gradsNumber Number
+
+hi def link gradsFixVariables Special
+hi def link gradsVariables Identifier
+hi def link gradsglobalVariables Special
+hi def link gradsConst Special
+
+hi def link gradsClassMethods Function
+
+hi def link gradsOperator Operator
+hi def link gradsComment Comment
+
+hi def link gradsTypos Error
+
+
+let b:current_syntax = "grads"
diff --git a/runtime/syntax/gretl.vim b/runtime/syntax/gretl.vim
new file mode 100644
index 0000000..671142a
--- /dev/null
+++ b/runtime/syntax/gretl.vim
@@ -0,0 +1,85 @@
+" Vim syntax file
+" Language: gretl (http://gretl.sf.net)
+" Maintainer: Vaidotas Zemlys <zemlys@gmail.com>
+" Last Change: 2006 Apr 30
+" Filenames: *.inp *.gretl
+" URL: http://uosis.mif.vu.lt/~zemlys/vim-syntax/gretl.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=@,48-57,_,.
+
+syn case match
+
+" Constant
+" string enclosed in double quotes
+syn region gString start=/"/ skip=/\\\\\|\\"/ end=/"/
+" number with no fractional part or exponent
+syn match gNumber /\d\+/
+" floating point number with integer and fractional parts and optional exponent
+syn match gFloat /\d\+\.\d*\([Ee][-+]\=\d\+\)\=/
+" floating point number with no integer part and optional exponent
+syn match gFloat /\.\d\+\([Ee][-+]\=\d\+\)\=/
+" floating point number with no fractional part and optional exponent
+syn match gFloat /\d\+[Ee][-+]\=\d\+/
+
+" Gretl commands
+syn keyword gCommands add addobs addto adf append ar arch arma break boxplot chow coeffsum coint coint2 corc corr corrgm criteria critical cusum data delete diff else end endif endloop eqnprint equation estimate fcast fcasterr fit freq function funcerr garch genr gnuplot graph hausman hccm help hilu hsk hurst if import include info kpss label labels lad lags ldiff leverage lmtest logistic logit logs loop mahal meantest mle modeltab mpols multiply nls nulldata ols omit omitfrom open outfile panel pca pergm plot poisson pooled print printf probit pvalue pwe quit remember rename reset restrict rhodiff rmplot run runs scatters sdiff set setobs setmiss shell sim smpl spearman square store summary system tabprint testuhat tobit transpos tsls var varlist vartest vecm vif wls
+
+"Gretl genr functions
+syn keyword gGenrFunc log exp sin cos tan atan diff ldiff sdiff mean sd min max sort int ln coeff abs rho sqrt sum nobs firstobs lastobs normal uniform stderr cum missing ok misszero corr vcv var sst cov median zeromiss pvalue critical obsnum mpow dnorm cnorm gamma lngamma resample hpfilt bkfilt fracdiff varnum isvector islist nelem
+
+" Identifier
+" identifier with leading letter and optional following keyword characters
+syn match gIdentifier /\a\k*/
+
+" Variable with leading $
+syn match gVariable /\$\k*/
+" Arrow
+syn match gArrow /<-/
+
+" Special
+syn match gDelimiter /[,;:]/
+
+" Error
+syn region gRegion matchgroup=Delimiter start=/(/ matchgroup=Delimiter end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError,gBCstart,gBCend
+syn region gRegion matchgroup=Delimiter start=/{/ matchgroup=Delimiter end=/}/ transparent contains=ALLBUT,rError,rBraceError,rParenError
+syn region gRegion matchgroup=Delimiter start=/\[/ matchgroup=Delimiter end=/]/ transparent contains=ALLBUT,rError,rCurlyError,rParenError
+syn match gError /[)\]}]/
+syn match gBraceError /[)}]/ contained
+syn match gCurlyError /[)\]]/ contained
+syn match gParenError /[\]}]/ contained
+
+" Comment
+syn match gComment /#.*/
+syn match gBCstart /(\*/
+syn match gBCend /\*)/
+
+syn region gBlockComment matchgroup=gCommentStart start="(\*" end="\*)"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/groff.vim b/runtime/syntax/groff.vim
new file mode 100644
index 0000000..c076c8d
--- /dev/null
+++ b/runtime/syntax/groff.vim
@@ -0,0 +1,10 @@
+" VIM syntax file
+" Language: groff
+" Maintainer: John Marshall <jmarshall@hey.com>
+" Previous Maintainer: Pedro Alejandro López-Valencia <palopezv@gmail.com>
+" Last Change: 2003-05-08-12:41:13 GMT-5.
+
+" This uses the nroff.vim syntax file.
+let b:main_syntax = "nroff"
+let b:nroff_is_groff = 1
+runtime! syntax/nroff.vim
diff --git a/runtime/syntax/groovy.vim b/runtime/syntax/groovy.vim
new file mode 100644
index 0000000..41495e6
--- /dev/null
+++ b/runtime/syntax/groovy.vim
@@ -0,0 +1,451 @@
+" Vim syntax file
+" Language: Groovy
+" Original Author: Alessio Pace <billy.corgan AT tiscali.it>
+" Maintainer: Tobias Rapp <yahuxo+vim AT mailbox.org>
+" Version: 0.1.18
+" URL: http://www.vim.org/scripts/script.php?script_id=945
+" Last Change: 2021 Feb 03
+
+" THE ORIGINAL AUTHOR'S NOTES:
+"
+" This is my very first vim script, I hope to have
+" done it the right way.
+"
+" I must directly or indirectly thank the author of java.vim and ruby.vim:
+" I copied from them most of the stuff :-)
+"
+" Relies on html.vim
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+"
+" HOWTO USE IT (INSTALL) when not part of the distribution:
+"
+" 1) copy the file in the (global or user's $HOME/.vim/syntax/) syntax folder
+"
+" 2) add this line to recognize groovy files by filename extension:
+"
+" au BufNewFile,BufRead *.groovy setf groovy
+" in the global vim filetype.vim file or inside $HOME/.vim/filetype.vim
+"
+" 3) add this part to recognize by content groovy script (no extension needed :-)
+"
+" if did_filetype()
+" finish
+" endif
+" if getline(1) =~ '^#!.*[/\\]groovy\>'
+" setf groovy
+" endif
+"
+" in the global scripts.vim file or in $HOME/.vim/scripts.vim
+"
+" 4) open/write a .groovy file or a groovy script :-)
+"
+" 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
+if !exists("main_syntax")
+ if exists("b:current_syntax")
+ finish
+ endif
+ " we define it here so that included files can test for it
+ let main_syntax='groovy'
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" ##########################
+" Java stuff taken from java.vim
+" some characters that cannot be in a groovy program (outside a string)
+" syn match groovyError "[\\@`]"
+"syn match groovyError "<<<\|\.\.\|=>\|<>\|||=\|&&=\|[^-]->\|\*\/"
+"syn match groovyOK "\.\.\."
+
+" keyword definitions
+syn keyword groovyExternal native package
+syn match groovyExternal "\<import\>\(\s\+static\>\)\?"
+syn keyword groovyError goto const
+syn keyword groovyConditional if else switch
+syn keyword groovyRepeat while for do
+syn keyword groovyBoolean true false
+syn keyword groovyConstant null
+syn keyword groovyTypedef this super
+syn keyword groovyOperator new instanceof
+syn keyword groovyType boolean char byte short int long float double
+syn keyword groovyType void
+syn keyword groovyType Integer Double Date Boolean Float String Array Vector List
+syn keyword groovyStatement return
+syn keyword groovyStorageClass static synchronized transient volatile final strictfp serializable
+syn keyword groovyExceptions throw try catch finally
+syn keyword groovyAssert assert
+syn keyword groovyMethodDecl synchronized throws
+syn keyword groovyClassDecl extends implements interface
+" to differentiate the keyword class from MyClass.class we use a match here
+syn match groovyTypedef "\.\s*\<class\>"ms=s+1
+syn keyword groovyClassDecl enum
+syn match groovyClassDecl "^class\>"
+syn match groovyClassDecl "[^.]\s*\<class\>"ms=s+1
+syn keyword groovyBranch break continue nextgroup=groovyUserLabelRef skipwhite
+syn match groovyUserLabelRef "\k\+" contained
+syn keyword groovyScopeDecl public protected private abstract
+
+
+if exists("groovy_highlight_groovy_lang_ids") || exists("groovy_highlight_groovy_lang") || exists("groovy_highlight_all")
+ " groovy.lang.*
+ syn keyword groovyLangClass Closure MetaMethod GroovyObject
+
+ syn match groovyJavaLangClass "\<System\>"
+ syn keyword groovyJavaLangClass Cloneable Comparable Runnable Serializable Boolean Byte Class Object
+ syn keyword groovyJavaLangClass Character CharSequence ClassLoader Compiler
+ " syn keyword groovyJavaLangClass Integer Double Float Long
+ syn keyword groovyJavaLangClass InheritableThreadLocal Math Number Object Package Process
+ syn keyword groovyJavaLangClass Runtime RuntimePermission InheritableThreadLocal
+ syn keyword groovyJavaLangClass SecurityManager Short StrictMath StackTraceElement
+ syn keyword groovyJavaLangClass StringBuffer Thread ThreadGroup
+ syn keyword groovyJavaLangClass ThreadLocal Throwable Void ArithmeticException
+ syn keyword groovyJavaLangClass ArrayIndexOutOfBoundsException AssertionError
+ syn keyword groovyJavaLangClass ArrayStoreException ClassCastException
+ syn keyword groovyJavaLangClass ClassNotFoundException
+ syn keyword groovyJavaLangClass CloneNotSupportedException Exception
+ syn keyword groovyJavaLangClass IllegalAccessException
+ syn keyword groovyJavaLangClass IllegalArgumentException
+ syn keyword groovyJavaLangClass IllegalMonitorStateException
+ syn keyword groovyJavaLangClass IllegalStateException
+ syn keyword groovyJavaLangClass IllegalThreadStateException
+ syn keyword groovyJavaLangClass IndexOutOfBoundsException
+ syn keyword groovyJavaLangClass InstantiationException InterruptedException
+ syn keyword groovyJavaLangClass NegativeArraySizeException NoSuchFieldException
+ syn keyword groovyJavaLangClass NoSuchMethodException NullPointerException
+ syn keyword groovyJavaLangClass NumberFormatException RuntimeException
+ syn keyword groovyJavaLangClass SecurityException StringIndexOutOfBoundsException
+ syn keyword groovyJavaLangClass UnsupportedOperationException
+ syn keyword groovyJavaLangClass AbstractMethodError ClassCircularityError
+ syn keyword groovyJavaLangClass ClassFormatError Error ExceptionInInitializerError
+ syn keyword groovyJavaLangClass IllegalAccessError InstantiationError
+ syn keyword groovyJavaLangClass IncompatibleClassChangeError InternalError
+ syn keyword groovyJavaLangClass LinkageError NoClassDefFoundError
+ syn keyword groovyJavaLangClass NoSuchFieldError NoSuchMethodError
+ syn keyword groovyJavaLangClass OutOfMemoryError StackOverflowError
+ syn keyword groovyJavaLangClass ThreadDeath UnknownError UnsatisfiedLinkError
+ syn keyword groovyJavaLangClass UnsupportedClassVersionError VerifyError
+ syn keyword groovyJavaLangClass VirtualMachineError
+
+ syn keyword groovyJavaLangObject clone equals finalize getClass hashCode
+ syn keyword groovyJavaLangObject notify notifyAll toString wait
+
+ 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
+
+
+" Groovy stuff
+syn match groovyOperator "\.\."
+syn match groovyOperator "<\{2,3}"
+syn match groovyOperator ">\{2,3}"
+syn match groovyOperator "->"
+syn match groovyLineComment '^\%1l#!.*' " Shebang line
+syn match groovyExceptions "\<Exception\>\|\<[A-Z]\{1,}[a-zA-Z0-9]*Exception\>"
+
+" Groovy JDK stuff
+syn keyword groovyJDKBuiltin as def in
+syn keyword groovyJDKOperOverl div minus plus abs round power multiply
+syn keyword groovyJDKMethods each call inject sort print println
+syn keyword groovyJDKMethods getAt putAt size push pop toList getText writeLine eachLine readLines
+syn keyword groovyJDKMethods withReader withStream withWriter withPrintWriter write read leftShift
+syn keyword groovyJDKMethods withWriterAppend readBytes splitEachLine
+syn keyword groovyJDKMethods newInputStream newOutputStream newPrintWriter newReader newWriter
+syn keyword groovyJDKMethods compareTo next previous isCase
+syn keyword groovyJDKMethods times step toInteger upto any collect dump every find findAll grep
+syn keyword groovyJDKMethods inspect invokeMethods join
+syn keyword groovyJDKMethods getErr getIn getOut waitForOrKill
+syn keyword groovyJDKMethods count tokenize asList flatten immutable intersect reverse reverseEach
+syn keyword groovyJDKMethods subMap append asWritable eachByte eachLine eachFile
+syn cluster groovyTop add=groovyJDKBuiltin,groovyJDKOperOverl,groovyJDKMethods
+
+" no useful I think, so I comment it..
+"if filereadable(expand("<sfile>:p:h")."/groovyid.vim")
+ " source <sfile>:p:h/groovyid.vim
+"endif
+
+if exists("groovy_space_errors")
+ if !exists("groovy_no_trail_space_error")
+ syn match groovySpaceError "\s\+$"
+ endif
+ if !exists("groovy_no_tab_space_error")
+ syn match groovySpaceError " \+\t"me=e-1
+ endif
+endif
+
+" it is a better case construct than java.vim to match groovy syntax
+syn region groovyLabelRegion transparent matchgroup=groovyLabel start="\<case\>" matchgroup=NONE end=":\|$" contains=groovyNumber,groovyString,groovyLangClass,groovyJavaLangClass
+syn match groovyUserLabel "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=groovyLabel
+syn keyword groovyLabel default
+
+if !exists("groovy_allow_cpp_keywords")
+ syn keyword groovyError auto delete extern friend inline redeclared
+ syn keyword groovyError register signed sizeof struct template typedef union
+ syn keyword groovyError unsigned operator
+endif
+
+" The following cluster contains all groovy groups except the contained ones
+syn cluster groovyTop add=groovyExternal,groovyError,groovyError,groovyBranch,groovyLabelRegion,groovyLabel,groovyConditional,groovyRepeat,groovyBoolean,groovyConstant,groovyTypedef,groovyOperator,groovyType,groovyType,groovyStatement,groovyStorageClass,groovyAssert,groovyExceptions,groovyMethodDecl,groovyClassDecl,groovyClassDecl,groovyClassDecl,groovyScopeDecl,groovyError,groovyError2,groovyUserLabel,groovyLangObject
+
+
+" Comments
+syn keyword groovyTodo contained TODO FIXME XXX
+if exists("groovy_comment_strings")
+ syn region groovyCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=groovySpecial,groovyCommentStar,groovySpecialChar,@Spell
+ syn region groovyComment2String contained start=+"+ end=+$\|"+ contains=groovySpecial,groovySpecialChar,@Spell
+ syn match groovyCommentCharacter contained "'\\[^']\{1,6\}'" contains=groovySpecialChar
+ syn match groovyCommentCharacter contained "'\\''" contains=groovySpecialChar
+ syn match groovyCommentCharacter contained "'[^\\]'"
+ syn cluster groovyCommentSpecial add=groovyCommentString,groovyCommentCharacter,groovyNumber
+ syn cluster groovyCommentSpecial2 add=groovyComment2String,groovyCommentCharacter,groovyNumber
+endif
+syn region groovyComment start="/\*" end="\*/" contains=@groovyCommentSpecial,groovyTodo,@Spell
+syn match groovyCommentStar contained "^\s*\*[^/]"me=e-1
+syn match groovyCommentStar contained "^\s*\*$"
+syn match groovyLineComment "//.*" contains=@groovyCommentSpecial2,groovyTodo,@Spell
+hi def link groovyCommentString groovyString
+hi def link groovyComment2String groovyString
+hi def link groovyCommentCharacter groovyCharacter
+
+syn cluster groovyTop add=groovyComment,groovyLineComment
+
+if !exists("groovy_ignore_groovydoc") && main_syntax != 'jsp'
+ syntax case ignore
+ " syntax coloring for groovydoc comments (HTML)
+ " syntax include @groovyHtml <sfile>:p:h/html.vim
+ syntax include @groovyHtml runtime! syntax/html.vim
+ unlet b:current_syntax
+ syntax spell default " added by Bram
+ syn region groovyDocComment start="/\*\*" end="\*/" keepend contains=groovyCommentTitle,@groovyHtml,groovyDocTags,groovyTodo,@Spell
+ syn region groovyCommentTitle contained matchgroup=groovyDocComment start="/\*\*" matchgroup=groovyCommentTitle keepend end="\.$" end="\.[ \t\r<&]"me=e-1 end="[^{]@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@groovyHtml,groovyCommentStar,groovyTodo,@Spell,groovyDocTags
+
+ syn region groovyDocTags contained start="{@\(link\|linkplain\|inherit[Dd]oc\|doc[rR]oot\|value\)" end="}"
+ syn match groovyDocTags contained "@\(see\|param\|exception\|throws\|since\)\s\+\S\+" contains=groovyDocParam
+ syn match groovyDocParam contained "\s\S\+"
+ syn match groovyDocTags contained "@\(version\|author\|return\|deprecated\|serial\|serialField\|serialData\)\>"
+ syntax case match
+endif
+
+" match the special comment /**/
+syn match groovyComment "/\*\*/"
+
+" Strings and constants
+syn match groovySpecialError contained "\\."
+syn match groovySpecialCharError contained "[^']"
+syn match groovySpecialChar contained "\\\([4-9]\d\|[0-3]\d\d\|[\"\\'ntbrf]\|u\x\{4\}\|\$\)"
+syn match groovyRegexChar contained "\\."
+syn region groovyString start=+"+ end=+"+ end=+$+ contains=groovySpecialChar,groovySpecialError,@Spell,groovyELExpr
+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
+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
+" Fix: force use of the NFA regexp engine (2), see GitHub issue #7280
+syn match groovyELExpr /\%#=2\$[a-zA-Z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\uFFFE_][a-zA-Z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\uFFFE0-9_.]*/ contained
+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
+" hi def link groovyClosureParams Identifier
+
+" next line disabled, it can cause a crash for a long line
+"syn match groovyStringError +"\([^"\\]\|\\.\)*$+
+
+" disabled: in groovy strings or characters are written the same
+" syn match groovyCharacter "'[^']*'" contains=groovySpecialChar,groovySpecialCharError
+" syn match groovyCharacter "'\\''" contains=groovySpecialChar
+" syn match groovyCharacter "'[^\\]'"
+syn match groovyNumber "\<\(0[0-7]*\|0[xX]\x\+\|\d\+\)[lL]\=\>"
+syn match groovyNumber "\(\<\d\+\.\d*\|\.\d\+\)\([eE][-+]\=\d\+\)\=[fFdD]\="
+syn match groovyNumber "\<\d\+[eE][-+]\=\d\+[fFdD]\=\>"
+syn match groovyNumber "\<\d\+\([eE][-+]\=\d\+\)\=[fFdD]\>"
+
+" unicode characters
+syn match groovySpecial "\\u\d\{4\}"
+
+syn cluster groovyTop add=groovyString,groovyCharacter,groovyNumber,groovySpecial,groovyStringError
+
+if exists("groovy_highlight_functions")
+ if groovy_highlight_functions == "indent"
+ syn match groovyFuncDef "^\(\t\| \{8\}\)[_$a-zA-Z][_$a-zA-Z0-9_. \[\]]*([^-+*/()]*)" contains=groovyScopeDecl,groovyType,groovyStorageClass,@groovyClasses
+ syn region groovyFuncDef start=+^\(\t\| \{8\}\)[$_a-zA-Z][$_a-zA-Z0-9_. \[\]]*([^-+*/()]*,\s*+ end=+)+ contains=groovyScopeDecl,groovyType,groovyStorageClass,@groovyClasses
+ syn match groovyFuncDef "^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]]*([^-+*/()]*)" contains=groovyScopeDecl,groovyType,groovyStorageClass,@groovyClasses
+ syn region groovyFuncDef start=+^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]]*([^-+*/()]*,\s*+ end=+)+ contains=groovyScopeDecl,groovyType,groovyStorageClass,@groovyClasses
+ else
+ " This line catches method declarations at any indentation>0, but it assumes
+ " two things:
+ " 1. class names are always capitalized (ie: Button)
+ " 2. method names are never capitalized (except constructors, of course)
+ syn region groovyFuncDef start=+^\s\+\(\(public\|protected\|private\|static\|abstract\|final\|native\|synchronized\)\s\+\)*\(\(void\|boolean\|char\|byte\|short\|int\|long\|float\|double\|\([A-Za-z_][A-Za-z0-9_$]*\.\)*[A-Z][A-Za-z0-9_$]*\)\(<[^>]*>\)\=\(\[\]\)*\s\+[a-z][A-Za-z0-9_$]*\|[A-Z][A-Za-z0-9_$]*\)\s*([^0-9]+ end=+)+ contains=groovyScopeDecl,groovyType,groovyStorageClass,groovyComment,groovyLineComment,@groovyClasses
+ endif
+ syn match groovyBraces "[{}]"
+ syn cluster groovyTop add=groovyFuncDef,groovyBraces
+endif
+
+if exists("groovy_highlight_debug")
+
+ " Strings and constants
+ syn match groovyDebugSpecial contained "\\\d\d\d\|\\."
+ syn region groovyDebugString contained start=+"+ end=+"+ contains=groovyDebugSpecial
+ syn match groovyDebugStringError +"\([^"\\]\|\\.\)*$+
+ syn match groovyDebugCharacter contained "'[^\\]'"
+ syn match groovyDebugSpecialCharacter contained "'\\.'"
+ syn match groovyDebugSpecialCharacter contained "'\\''"
+ syn match groovyDebugNumber contained "\<\(0[0-7]*\|0[xX]\x\+\|\d\+\)[lL]\=\>"
+ syn match groovyDebugNumber contained "\(\<\d\+\.\d*\|\.\d\+\)\([eE][-+]\=\d\+\)\=[fFdD]\="
+ syn match groovyDebugNumber contained "\<\d\+[eE][-+]\=\d\+[fFdD]\=\>"
+ syn match groovyDebugNumber contained "\<\d\+\([eE][-+]\=\d\+\)\=[fFdD]\>"
+ syn keyword groovyDebugBoolean contained true false
+ syn keyword groovyDebugType contained null this super
+ syn region groovyDebugParen start=+(+ end=+)+ contained contains=groovyDebug.*,groovyDebugParen
+
+ " to make this work you must define the highlighting for these groups
+ syn match groovyDebug "\<System\.\(out\|err\)\.print\(ln\)*\s*("me=e-1 contains=groovyDebug.* nextgroup=groovyDebugParen
+ syn match groovyDebug "\<p\s*("me=e-1 contains=groovyDebug.* nextgroup=groovyDebugParen
+ syn match groovyDebug "[A-Za-z][a-zA-Z0-9_]*\.printStackTrace\s*("me=e-1 contains=groovyDebug.* nextgroup=groovyDebugParen
+ syn match groovyDebug "\<trace[SL]\=\s*("me=e-1 contains=groovyDebug.* nextgroup=groovyDebugParen
+
+ syn cluster groovyTop add=groovyDebug
+
+ 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
+syn match groovyExceptions "\<Exception\>\|\<[A-Z]\{1,}[a-zA-Z0-9]*Exception\>"
+
+
+if !exists("groovy_minlines")
+ let groovy_minlines = 10
+endif
+exec "syn sync ccomment groovyComment minlines=" . groovy_minlines
+
+
+" ###################
+" Groovy stuff
+" syn match groovyOperator "|[ ,a-zA-Z0-9_*]\+|"
+
+" All groovy valid tokens
+" syn match groovyTokens ";\|,\|<=>\|<>\|:\|:=\|>\|>=\|=\|==\|<\|<=\|!=\|/\|/=\|\.\.|\.\.\.\|\~=\|\~=="
+" syn match groovyTokens "\*=\|&\|&=\|\*\|->\|\~\|+\|-\|/\|?\|<<<\|>>>\|<<\|>>"
+
+" Must put explicit these ones because groovy.vim mark them as errors otherwise
+" syn match groovyTokens "<=>\|<>\|==\~"
+"syn cluster groovyTop add=groovyTokens
+
+" Mark these as operators
+
+" Hightlight brackets
+" syn match groovyBraces "[{}]"
+" syn match groovyBraces "[\[\]]"
+" syn match groovyBraces "[\|]"
+
+if exists("groovy_mark_braces_in_parens_as_errors")
+ syn match groovyInParen contained "[{}]"
+ hi def link groovyInParen groovyError
+ syn cluster groovyTop add=groovyInParen
+endif
+
+" catch errors caused by wrong parenthesis
+syn region groovyParenT transparent matchgroup=groovyParen start="(" end=")" contains=@groovyTop,groovyParenT1
+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 ")"
+hi def link groovyParenError groovyError
+
+" catch errors caused by wrong square parenthesis
+syn region groovyParenT transparent matchgroup=groovyParen start="\[" end="\]" contains=@groovyTop,groovyParenT1
+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 "\]"
+
+" ###############################
+" java.vim default highlighting
+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"
+if main_syntax == 'groovy'
+ unlet main_syntax
+endif
+
+let b:spell_options="contained"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/group.vim b/runtime/syntax/group.vim
new file mode 100644
index 0000000..f62a4a1
--- /dev/null
+++ b/runtime/syntax/group.vim
@@ -0,0 +1,52 @@
+" Vim syntax file
+" Language: group(5) user group file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2012-08-05
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match groupBegin display '^' nextgroup=groupName
+
+syn match groupName contained display '[^:]\+'
+ \ nextgroup=groupPasswordColon
+
+syn match groupPasswordColon contained display ':'
+ \ nextgroup=groupPassword,groupShadow
+
+syn match groupPassword contained display '[^:]*'
+ \ nextgroup=groupGIDColon
+
+syn match groupShadow contained display '[x*]' nextgroup=groupGIDColon
+
+syn match groupGIDColon contained display ':' nextgroup=groupGID
+
+syn match groupGID contained display '\d*'
+ \ nextgroup=groupUserListColon
+
+syn match groupUserListColon contained display ':' nextgroup=groupUserList
+
+syn match groupUserList contained '[^,]\+'
+ \ nextgroup=groupUserListSep
+
+syn match groupUserListSep contained display ',' nextgroup=groupUserList
+
+hi def link groupDelimiter Normal
+hi def link groupName Identifier
+hi def link groupPasswordColon groupDelimiter
+hi def link groupPassword Number
+hi def link groupShadow Special
+hi def link groupGIDColon groupDelimiter
+hi def link groupGID Number
+hi def link groupUserListColon groupDelimiter
+hi def link groupUserList Identifier
+hi def link groupUserListSep groupDelimiter
+
+let b:current_syntax = "group"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/grub.vim b/runtime/syntax/grub.vim
new file mode 100644
index 0000000..3743ae3
--- /dev/null
+++ b/runtime/syntax/grub.vim
@@ -0,0 +1,93 @@
+" Vim syntax file
+" Language: grub(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword grubTodo contained TODO FIXME XXX NOTE
+
+syn region grubComment display oneline start='^#' end='$'
+ \ contains=grubTodo,@Spell
+
+syn match grubDevice display
+ \ '(\([fh]d\d\|\d\+\|0x\x\+\)\(,\d\+\)\=\(,\l\)\=)'
+
+syn match grubBlock display '\(\d\+\)\=+\d\+\(,\(\d\+\)\=+\d\+\)*'
+
+syn match grubNumbers display '+\=\<\d\+\|0x\x\+\>'
+
+syn match grubBegin display '^'
+ \ nextgroup=@grubCommands,grubComment skipwhite
+
+syn cluster grubCommands contains=grubCommand,grubTitleCommand
+
+syn keyword grubCommand contained default fallback hiddenmenu timeout
+
+syn keyword grubTitleCommand contained title nextgroup=grubTitle skipwhite
+
+syn match grubTitle contained display '.*'
+
+syn keyword grubCommand contained bootp color device dhcp hide ifconfig
+ \ pager partnew parttype password rarp serial setkey
+ \ terminal tftpserver unhide blocklist boot cat
+ \ chainloader cmp configfile debug displayapm
+ \ displaymem embed find fstest geometry halt help
+ \ impsprobe initrd install ioprobe kernel lock
+ \ makeactive map md5crypt module modulenounzip pause
+ \ quit reboot read root rootnoverify savedefault setup
+ \ testload testvbe uppermem vbeprobe
+
+syn keyword grubSpecial saved
+
+syn match grubBlink display 'blink-'
+syn keyword grubBlack black
+syn keyword grubBlue blue
+syn keyword grubGreen green
+syn keyword grubRed red
+syn keyword grubMagenta magenta
+syn keyword grubBrown brown yellow
+syn keyword grubWhite white
+syn match grubLightGray display 'light-gray'
+syn match grubLightBlue display 'light-blue'
+syn match grubLightGreen display 'light-green'
+syn match grubLightCyan display 'light-cyan'
+syn match grubLightRed display 'light-red'
+syn match grubLightMagenta display 'light-magenta'
+syn match grubDarkGray display 'dark-gray'
+
+hi def link grubComment Comment
+hi def link grubTodo Todo
+hi def link grubNumbers Number
+hi def link grubDevice Identifier
+hi def link grubBlock Identifier
+hi def link grubCommand Keyword
+hi def link grubTitleCommand grubCommand
+hi def link grubTitle String
+hi def link grubSpecial Special
+
+hi def grubBlink cterm=inverse
+hi def grubBlack ctermfg=Black ctermbg=White guifg=Black guibg=White
+hi def grubBlue ctermfg=DarkBlue guifg=DarkBlue
+hi def grubGreen ctermfg=DarkGreen guifg=DarkGreen
+hi def grubRed ctermfg=DarkRed guifg=DarkRed
+hi def grubMagenta ctermfg=DarkMagenta guifg=DarkMagenta
+hi def grubBrown ctermfg=Brown guifg=Brown
+hi def grubWhite ctermfg=White ctermbg=Black guifg=White guibg=Black
+hi def grubLightGray ctermfg=LightGray guifg=LightGray
+hi def grubLightBlue ctermfg=LightBlue guifg=LightBlue
+hi def grubLightGreen ctermfg=LightGreen guifg=LightGreen
+hi def grubLightCyan ctermfg=LightCyan guifg=LightCyan
+hi def grubLightRed ctermfg=LightRed guifg=LightRed
+hi def grubLightMagenta ctermfg=LightMagenta guifg=LightMagenta
+hi def grubDarkGray ctermfg=DarkGray guifg=DarkGray
+
+let b:current_syntax = "grub"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/gsp.vim b/runtime/syntax/gsp.vim
new file mode 100644
index 0000000..6270b2a
--- /dev/null
+++ b/runtime/syntax/gsp.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" Language: GSP - GNU Server Pages (v. 0.86)
+" Created By: Nathaniel Harward nharward@yahoo.com
+" Last Changed: 2012 Jan 08 by Thilo Six
+" Filenames: *.gsp
+" URL: http://www.constructicon.com/~nharward/vim/syntax/gsp.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'gsp'
+endif
+
+" Source HTML syntax
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+syn case match
+
+" Include Java syntax
+syn include @gspJava syntax/java.vim
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Add <java> as an HTML tag name along with its args
+syn keyword htmlTagName contained java
+syn keyword htmlArg contained type file page
+
+" Redefine some HTML things to include (and highlight) gspInLine code in
+" places where it's likely to be found
+syn region htmlString contained start=+"+ end=+"+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,gspInLine
+syn region htmlString contained start=+'+ end=+'+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,gspInLine
+syn match htmlValue contained "=[\t ]*[^'" \t>][^ \t>]*"hs=s+1 contains=javaScriptExpression,@htmlPreproc,gspInLine
+syn region htmlEndTag start=+</+ end=+>+ contains=htmlTagN,htmlTagError,gspInLine
+syn region htmlTag start=+<[^/]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster,gspInLine
+syn match htmlTagN contained +<\s*[-a-zA-Z0-9]\++hs=s+1 contains=htmlTagName,htmlSpecialTagName,@htmlTagNameCluster,gspInLine
+syn match htmlTagN contained +</\s*[-a-zA-Z0-9]\++hs=s+2 contains=htmlTagName,htmlSpecialTagName,@htmlTagNameCluster,gspInLine
+
+" Define the GSP java code blocks
+syn region gspJavaBlock start="<java\>[^>]*\>" end="</java>"me=e-7 contains=@gspJava,htmlTag
+syn region gspInLine matchgroup=htmlError start="`" end="`" contains=@gspJava
+
+let b:current_syntax = "gsp"
+
+if main_syntax == 'gsp'
+ unlet main_syntax
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/gtkrc.vim b/runtime/syntax/gtkrc.vim
new file mode 100644
index 0000000..9c1bc2a
--- /dev/null
+++ b/runtime/syntax/gtkrc.vim
@@ -0,0 +1,126 @@
+" Vim syntax file
+" This is a GENERATED FILE. Please always refer to source file at the URI below.
+" Language: Gtk+ theme files `gtkrc'
+" Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2002-10-31
+" URL: http://trific.ath.cx/Ftp/vim/syntax/gtkrc.vim
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=_,-,a-z,A-Z,48-57
+
+syn case match
+
+" Base constructs
+syn match gtkrcComment "#.*$" contains=gtkrcFixme
+syn keyword gtkrcFixme FIXME TODO XXX NOT contained
+syn region gtkrcACString start=+"+ skip=+\\\\\|\\"+ end=+"+ oneline contains=gtkrcWPathSpecial,gtkrcClassName,gtkrcClassNameGnome contained
+syn region gtkrcBString start=+"+ skip=+\\\\\|\\"+ end=+"+ oneline contains=gtkrcKeyMod contained
+syn region gtkrcString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=gtkrcStockName,gtkrcPathSpecial,gtkrcRGBColor
+syn match gtkrcPathSpecial "<parent>" contained
+syn match gtkrcWPathSpecial "[*?.]" contained
+syn match gtkrcNumber "^\(\d\+\)\=\.\=\d\+"
+syn match gtkrcNumber "\W\(\d\+\)\=\.\=\d\+"lc=1
+syn match gtkrcRGBColor "#\(\x\{12}\|\x\{9}\|\x\{6}\|\x\{3}\)" contained
+syn cluster gtkrcPRIVATE add=gtkrcFixme,gtkrcPathSpecial,gtkrcWPathSpecial,gtkrcRGBColor,gtkrcACString
+
+" Keywords
+syn keyword gtkrcInclude include
+syn keyword gtkrcPathSet module_path pixmap_path
+syn keyword gtkrcTop binding style
+syn keyword gtkrcTop widget widget_class nextgroup=gtkrcACString skipwhite
+syn keyword gtkrcTop class nextgroup=gtkrcACString skipwhite
+syn keyword gtkrcBind bind nextgroup=gtkrcBString skipwhite
+syn keyword gtkrcStateName NORMAL INSENSITIVE PRELIGHT ACTIVE SELECTED
+syn keyword gtkrcPriorityName HIGHEST RC APPLICATION GTK LOWEST
+syn keyword gtkrcPriorityName highest rc application gtk lowest
+syn keyword gtkrcTextDirName LTR RTL
+syn keyword gtkrcStyleKeyword fg bg fg_pixmap bg_pixmap bg_text base font font_name fontset stock text
+syn match gtkrcKeyMod "<\(alt\|ctrl\|control\|mod[1-5]\|release\|shft\|shift\)>" contained
+syn cluster gtkrcPRIVATE add=gtkrcKeyMod
+
+" Enums and engine words
+syn keyword gtkrcKeyword engine image
+syn keyword gtkrcImage arrow_direction border detail file gap_border gap_end_border gap_end_file gap_file gap_side gap_side gap_start_border gap_start_file orientation overlay_border overlay_file overlay_stretch recolorable shadow state stretch thickness
+syn keyword gtkrcConstant TRUE FALSE NONE IN OUT LEFT RIGHT TOP BOTTOM UP DOWN VERTICAL HORIZONTAL ETCHED_IN ETCHED_OUT
+syn keyword gtkrcFunction function nextgroup=gtkrcFunctionEq skipwhite
+syn match gtkrcFunctionEq "=" nextgroup=gtkrcFunctionName contained skipwhite
+syn keyword gtkrcFunctionName ARROW BOX BOX_GAP CHECK CROSS DIAMOND EXTENSION FLAT_BOX FOCUS HANDLE HLINE OPTION OVAL POLYGON RAMP SHADOW SHADOW_GAP SLIDER STRING TAB VLINE contained
+syn cluster gtkrcPRIVATE add=gtkrcFunctionName,gtkrcFunctionEq
+
+" Class names
+syn keyword gtkrcClassName GtkAccelLabel GtkAdjustment GtkAlignment GtkArrow GtkAspectFrame GtkBin GtkBox GtkButton GtkButtonBox GtkCList GtkCTree GtkCalendar GtkCheckButton GtkCheckMenuItem GtkColorSelection GtkColorSelectionDialog GtkCombo GtkContainer GtkCurve GtkData GtkDialog GtkDrawingArea GtkEditable GtkEntry GtkEventBox GtkFileSelection GtkFixed GtkFontSelection GtkFontSelectionDialog GtkFrame GtkGammaCurve GtkHBox GtkHButtonBox GtkHPaned GtkHRuler GtkHScale GtkHScrollbar GtkHSeparator GtkHandleBox GtkImage GtkImageMenuItem GtkInputDialog GtkInvisible GtkItem GtkItemFactory GtkLabel GtkLayout GtkList GtkListItem GtkMenu GtkMenuBar GtkMenuItem GtkMenuShell GtkMessageDialog GtkMisc GtkNotebook GtkObject GtkOptionMenu GtkPacker GtkPaned GtkPixmap GtkPlug GtkPreview GtkProgress GtkProgressBar GtkRadioButton GtkRadioMenuItem GtkRange GtkRuler GtkScale GtkScrollbar GtkScrolledWindow GtkSeparatorMenuItem GtkSocket GtkSpinButton GtkStatusbar GtkTable GtkTearoffMenuItem GtkText GtkTextBuffer GtkTextMark GtkTextTag GtkTextView GtkTipsQuery GtkToggleButton GtkToolbar GtkTooltips GtkTree GtkTreeView GtkTreeItem GtkVBox GtkVButtonBox GtkVPaned GtkVRuler GtkVScale GtkVScrollbar GtkVSeparator GtkViewport GtkWidget GtkWindow GtkWindowGroup contained
+syn keyword gtkrcClassName AccelLabel Adjustment Alignment Arrow AspectFrame Bin Box Button ButtonBox CList CTree Calendar CheckButton CheckMenuItem ColorSelection ColorSelectionDialog Combo Container Curve Data Dialog DrawingArea Editable Entry EventBox FileSelection Fixed FontSelection FontSelectionDialog Frame GammaCurve HBox HButtonBox HPaned HRuler HScale HScrollbar HSeparator HandleBox Image ImageMenuItem InputDialog Invisible Item ItemFactory Label Layout List ListItem Menu MenuBar MenuItem MenuShell MessageDialog Misc Notebook Object OptionMenu Packer Paned Pixmap Plug Preview Progress ProgressBar RadioButton RadioMenuItem Range Ruler Scale Scrollbar ScrolledWindow SeparatorMenuItem Socket SpinButton Statusbar Table TearoffMenuItem Text TextBuffer TextMark TextTag TextView TipsQuery ToggleButton Toolbar Tooltips Tree TreeView TreeItem VBox VButtonBox VPaned VRuler VScale VScrollbar VSeparator Viewport Widget Window WindowGroup contained
+syn keyword gtkrcClassNameGnome GnomeAbout GnomeAnimator GnomeApp GnomeAppBar GnomeCalculator GnomeCanvas GnomeCanvasEllipse GnomeCanvasGroup GnomeCanvasImage GnomeCanvasItem GnomeCanvasLine GnomeCanvasPolygon GnomeCanvasRE GnomeCanvasRect GnomeCanvasText GnomeCanvasWidget GnomeClient GnomeColorPicker GnomeDEntryEdit GnomeDateEdit GnomeDialog GnomeDock GnomeDockBand GnomeDockItem GnomeDockLayout GnomeDruid GnomeDruidPage GnomeDruidPageFinish GnomeDruidPageStandard GnomeDruidPageStart GnomeEntry GnomeFileEntry GnomeFontPicker GnomeFontSelector GnomeHRef GnomeIconEntry GnomeIconList GnomeIconSelection GnomeIconTextItem GnomeLess GnomeMDI GnomeMDIChild GnomeMDIGenericChild GnomeMessageBox GnomeNumberEntry GnomePaperSelector GnomePixmap GnomePixmapEntry GnomeProcBar GnomePropertyBox GnomeScores GnomeSpell GnomeStock GtkClock GtkDial GtkPixmapMenuItem GtkTed contained
+syn cluster gtkrcPRIVATE add=gtkrcClassName,gtkrcClassNameGnome
+
+" Stock item names
+syn keyword gtkrcStockName gtk-add gtk-apply gtk-bold gtk-cancel gtk-cdrom gtk-clear gtk-close gtk-convert gtk-copy gtk-cut gtk-delete gtk-dialog-error gtk-dialog-info gtk-dialog-question gtk-dialog-warning gtk-dnd gtk-dnd-multiple gtk-execute gtk-find gtk-find-and-replace gtk-floppy gtk-goto-bottom gtk-goto-first gtk-goto-last gtk-goto-top gtk-go-back gtk-go-down gtk-go-forward gtk-go-up gtk-help gtk-home gtk-index gtk-italic gtk-jump-to gtk-justify-center gtk-justify-fill gtk-justify-left gtk-justify-right gtk-missing-image gtk-new gtk-no gtk-ok gtk-open gtk-paste gtk-preferences gtk-print gtk-print-preview gtk-properties gtk-quit gtk-redo gtk-refresh gtk-remove gtk-revert-to-saved gtk-save gtk-save-as gtk-select-color gtk-select-font gtk-sort-ascending gtk-sort-descending gtk-spell-check gtk-stop gtk-strikethrough gtk-undelete gtk-underline gtk-undo gtk-yes gtk-zoom-100 gtk-zoom-fit gtk-zoom-in gtk-zoom-out contained
+syn cluster gtkrcPRIVATE add=gtkrcStockName
+
+" Gtk Settings
+syn keyword gtkrcSettingsName gtk-double-click-time gtk-cursor-blink gtk-cursor-blink-time gtk-split-cursor gtk-theme-name gtk-key-theme-name gtk-menu-bar-accel gtk-dnd-drag-threshold gtk-font-name gtk-color-palette gtk-entry-select-on-focus gtk-can-change-accels gtk-toolbar-style gtk-toolbar-icon-size
+syn cluster gtkrcPRIVATE add=gtkrcSettingsName
+
+" Catch errors caused by wrong parenthesization
+syn region gtkrcParen start='(' end=')' transparent contains=ALLBUT,gtkrcParenError,@gtkrcPRIVATE
+syn match gtkrcParenError ")"
+syn region gtkrcBrace start='{' end='}' transparent contains=ALLBUT,gtkrcBraceError,@gtkrcPRIVATE
+syn match gtkrcBraceError "}"
+syn region gtkrcBracket start='\[' end=']' transparent contains=ALLBUT,gtkrcBracketError,@gtkrcPRIVATE
+syn match gtkrcBracketError "]"
+
+" Synchronization
+syn sync minlines=50
+syn sync match gtkrcSyncClass groupthere NONE "^\s*class\>"
+
+" Define the default highlighting
+
+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/gvpr.vim b/runtime/syntax/gvpr.vim
new file mode 100644
index 0000000..a737891
--- /dev/null
+++ b/runtime/syntax/gvpr.vim
@@ -0,0 +1,85 @@
+" Vim syntax file
+" Language: Graphviz program
+" Maintainer: Matthew Fernandez <matthew.fernandez@gmail.com>
+" Last Change: Tue, 28 Jul 2020 17:20:44 -0700
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword gvArg ARGC ARGV
+syn keyword gvBeg BEGIN BEG_G N E END END_G
+syn keyword gvFunc
+ \ graph fstsubg isDirect isStrict isSubg nEdges nNodes nxtsubg subg
+ \ degreeOf fstnode indegreeOf isNode isSubnode node nxtnode nxtnode_sg
+ \ outDegreeOf subnode
+ \ edge edge_sg fstedge fstedge_sg fstin fstin_sg fstout fstout_sg isEdge
+ \ isEdge_sg isSubedge nxtedge nxtedge_sg nxtin nxtin_sg nxtout nxtout_sg opp
+ \ subedge
+ \ freadG fwriteG readG write[] writeG
+ \ aget aset clone cloneG compOf copy[] copyA delete[] fstAttr getDflt hasAttr
+ \ induce isAttr isIn kindOf lock[] nxtAttr setDflt
+ \ canon gsub html index ishtml length llOf match[] rindex split[] sprintf
+ \ sscanf strcmp sub substr tokens tolower toupper urOf xOf yOf
+ \ closeF openF print[] printf scanf readL
+ \ atan2 cos exp log MAX MIN pow sin[] sqrt
+ \ in[] unset
+ \ colorx exit[] rand srand system
+syn keyword gvCons
+ \ NULL TV_bfs TV_dfs TV_en TV_flat TV_fwd TV_ne TV_prepostdfs TV_prepostfwd
+ \ TV_prepostrev TV_postdfs TV_postfwd tv_postrev TV_rev
+syn keyword gvType char double float int long unsigned void
+ \ string
+ \ edge_t graph_t node_t obj_t
+syn match gvVar
+ \ "\$\(\(F\|G\|NG\|O\|T\|tgtname\|tvedge\|tvnext\|tvroot\|tvtype\)\>\)\?\(\<\)\@!"
+syn keyword gvWord break continue else for forr if return switch while
+
+" numbers adapted from c.vim's cNumbers and friends
+syn match gvNums transparent "\<\d\|\.\d" contains=gvNumber,gvFloat,gvOctal
+syn match gvNumber contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
+syn match gvNumber contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+syn match gvOctal contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=gvOctalZero
+syn match gvOctalZero contained "\<0"
+syn match gvFloat contained "\d\+f"
+syn match gvFloat contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
+syn match gvFloat contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+syn match gvFloat contained "\d\+e[-+]\=\d\+[fl]\=\>"
+
+syn region gvString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=gvFormat,gvSpecial extend
+syn region gvString start="'" skip="\\\\\|\\'" end="'" contains=gvFormat,gvSpecial extend
+
+" adapted from c.vim's cFormat for c_no_c99
+syn match gvFormat "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([bdiuoxXDOUfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
+
+syn match gvSpecial "\\." contained
+
+syn region gvCComment start="//" skip="\\$" end="$" keepend
+syn region gvCPPComment start="#" skip="\\$" end="$" keepend
+syn region gvCXXComment start="/\*" end="\*/" fold
+
+hi def link gvArg Identifier
+hi def link gvBeg Keyword
+hi def link gvFloat Number
+hi def link gvFunc Identifier
+hi def link gvCons Number
+hi def link gvNumber Number
+hi def link gvType Type
+hi def link gvVar Statement
+hi def link gvWord Keyword
+
+hi def link gvString String
+hi def link gvFormat Special
+hi def link gvSpecial Special
+
+hi def link gvCComment Comment
+hi def link gvCPPComment Comment
+hi def link gvCXXComment Comment
+
+let b:current_syntax = "gvpr"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/gyp.vim b/runtime/syntax/gyp.vim
new file mode 100644
index 0000000..14c07b8
--- /dev/null
+++ b/runtime/syntax/gyp.vim
@@ -0,0 +1,49 @@
+" Vim syntax file
+" Language: GYP
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: *.gyp,*.gypi
+" Last Change: 2022 Sep 27
+
+if !exists('g:main_syntax')
+ if exists('b:current_syntax') && b:current_syntax ==# 'gyp'
+ finish
+ endif
+ let g:main_syntax = 'gyp'
+endif
+
+" Based on JSON syntax
+runtime! syntax/json.vim
+
+" Single quotes are allowed
+syn clear jsonStringSQError
+
+syn match jsonKeywordMatch /'\([^']\|\\\'\)\+'[[:blank:]\r\n]*\:/ contains=jsonKeyword
+if has('conceal') && (!exists('g:vim_json_conceal') || g:vim_json_conceal==1)
+ syn region jsonKeyword matchgroup=jsonQuote start=/'/ end=/'\ze[[:blank:]\r\n]*\:/ concealends contained
+else
+ syn region jsonKeyword matchgroup=jsonQuote start=/'/ end=/'\ze[[:blank:]\r\n]*\:/ contained
+endif
+
+syn match jsonStringMatch /'\([^']\|\\\'\)\+'\ze[[:blank:]\r\n]*[,}\]]/ contains=jsonString
+if has('conceal') && (!exists('g:vim_json_conceal') || g:vim_json_conceal==1)
+ syn region jsonString oneline matchgroup=jsonQuote start=/'/ skip=/\\\\\|\\'/ end=/'/ concealends contains=jsonEscape contained
+else
+ syn region jsonString oneline matchgroup=jsonQuote start=/'/ skip=/\\\\\|\\'/ end=/'/ contains=jsonEscape contained
+endif
+
+" Trailing commas are allowed
+if !exists('g:vim_json_warnings') || g:vim_json_warnings==1
+ syn clear jsonTrailingCommaError
+endif
+
+" Python-style comments are allowed
+syn match jsonComment /#.*$/ contains=jsonTodo,@Spell
+syn keyword jsonTodo FIXME NOTE TODO XXX TBD contained
+
+hi def link jsonComment Comment
+hi def link jsonTodo Todo
+
+let b:current_syntax = 'gyp'
+if g:main_syntax ==# 'gyp'
+ unlet g:main_syntax
+endif
diff --git a/runtime/syntax/haml.vim b/runtime/syntax/haml.vim
new file mode 100644
index 0000000..c14b88f
--- /dev/null
+++ b/runtime/syntax/haml.vim
@@ -0,0 +1,109 @@
+" Vim syntax file
+" Language: Haml
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Filenames: *.haml
+" Last Change: 2019 Dec 05
+
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'haml'
+endif
+let b:ruby_no_expensive = 1
+
+runtime! syntax/html.vim
+unlet! b:current_syntax
+silent! syn include @hamlSassTop syntax/sass.vim
+unlet! b:current_syntax
+syn include @hamlRubyTop syntax/ruby.vim
+
+syn case match
+
+syn region rubyCurlyBlock start="{" end="}" contains=@hamlRubyTop contained
+syn cluster hamlRubyTop add=rubyCurlyBlock
+
+syn cluster hamlComponent contains=hamlAttributes,hamlAttributesHash,hamlClassChar,hamlIdChar,hamlObject,hamlDespacer,hamlSelfCloser,hamlRuby,hamlPlainChar,hamlInterpolatable
+syn cluster hamlEmbeddedRuby contains=hamlAttributesHash,hamlObject,hamlRuby,hamlRubyFilter
+syn cluster hamlTop contains=hamlBegin,hamlPlainFilter,hamlRubyFilter,hamlSassFilter,hamlComment,hamlHtmlComment
+
+syn match hamlBegin "^\s*\%([<>]\|&[^=~ ]\)\@!" nextgroup=hamlTag,hamlClassChar,hamlIdChar,hamlRuby,hamlPlainChar,hamlInterpolatable
+
+syn match hamlTag "%\w\+\%(:\w\+\)\=" contained contains=htmlTagName,htmlSpecialTagName nextgroup=@hamlComponent
+syn region hamlAttributes matchgroup=hamlAttributesDelimiter start="(" end=")" contained contains=htmlArg,hamlAttributeString,hamlAttributeVariable,htmlEvent,htmlCssDefinition nextgroup=@hamlComponent
+syn region hamlAttributesHash matchgroup=hamlAttributesDelimiter start="{" end="}" contained contains=@hamlRubyTop nextgroup=@hamlComponent
+syn region hamlObject matchgroup=hamlObjectDelimiter start="\[" end="\]" contained contains=@hamlRubyTop nextgroup=@hamlComponent
+syn match hamlDespacer "[<>]" contained nextgroup=hamlDespacer,hamlSelfCloser,hamlRuby,hamlPlainChar,hamlInterpolatable
+syn match hamlSelfCloser "/" contained
+syn match hamlClassChar "\." contained nextgroup=hamlClass
+syn match hamlIdChar "#{\@!" contained nextgroup=hamlId
+syn match hamlClass "\%(\w\|-\|\:\)\+" contained nextgroup=@hamlComponent
+syn match hamlId "\%(\w\|-\)\+" contained nextgroup=@hamlComponent
+syn region hamlDocType start="^\s*!!!" end="$"
+
+syn region hamlRuby matchgroup=hamlRubyOutputChar start="[!&]\==\|\~" skip=",\s*$" end="$" contained contains=@hamlRubyTop keepend
+syn region hamlRuby matchgroup=hamlRubyChar start="-" skip=",\s*$" end="$" contained contains=@hamlRubyTop keepend
+syn match hamlPlainChar "\\" contained
+syn region hamlInterpolatable matchgroup=hamlInterpolatableChar start="!\===\|!=\@!" end="$" keepend contained contains=hamlInterpolation,hamlInterpolationEscape,@hamlHtmlTop
+syn region hamlInterpolatable matchgroup=hamlInterpolatableChar start="&==\|&=\@!" end="$" keepend contained contains=hamlInterpolation,hamlInterpolationEscape
+syn region hamlInterpolation matchgroup=hamlInterpolationDelimiter start="#{" end="}" contains=@hamlRubyTop containedin=javascriptStringS,javascriptStringD
+syn match hamlInterpolationEscape "\\\@<!\%(\\\\\)*\\\%(\\\ze#{\|#\ze{\)"
+syn region hamlErbInterpolation matchgroup=hamlInterpolationDelimiter start="<%[=-]\=" end="-\=%>" contained contains=@hamlRubyTop
+
+syn region hamlAttributeString start=+\%(=\s*\)\@<='+ skip=+\%(\\\\\)*\\'+ end=+'+ contains=hamlInterpolation,hamlInterpolationEscape
+syn region hamlAttributeString start=+\%(=\s*\)\@<="+ skip=+\%(\\\\\)*\\"+ end=+"+ contains=hamlInterpolation,hamlInterpolationEscape
+syn match hamlAttributeVariable "\%(=\s*\)\@<=\%(@@\=\|\$\)\=\w\+" contained
+
+syn match hamlHelper "\<action_view?\|\<block_is_haml?\|\<is_haml?\|\.\@<!\<flatten" contained containedin=@hamlEmbeddedRuby,@hamlRubyTop
+syn keyword hamlHelper capture_haml escape_once find_and_preserve haml_concat haml_indent haml_tag html_attrs html_esape init_haml_helpers list_of non_haml precede preserve succeed surround tab_down tab_up page_class contained containedin=@hamlEmbeddedRuby,@hamlRubyTop
+
+syn cluster hamlHtmlTop contains=@htmlTop,htmlBold,htmlItalic,htmlUnderline
+syn region hamlPlainFilter matchgroup=hamlFilter start="^\z(\s*\):\%(plain\|preserve\|redcloth\|textile\|markdown\|maruku\)\s*$" end="^\%(\z1 \| *$\)\@!" contains=@hamlHtmlTop,hamlInterpolation
+syn region hamlEscapedFilter matchgroup=hamlFilter start="^\z(\s*\):\%(escaped\|cdata\)\s*$" end="^\%(\z1 \| *$\)\@!" contains=hamlInterpolation
+syn region hamlErbFilter matchgroup=hamlFilter start="^\z(\s*\):erb\s*$" end="^\%(\z1 \| *$\)\@!" contains=@hamlHtmlTop,hamlErbInterpolation
+syn region hamlRubyFilter matchgroup=hamlFilter start="^\z(\s*\):ruby\s*$" end="^\%(\z1 \| *$\)\@!" contains=@hamlRubyTop
+syn region hamlJavascriptFilter matchgroup=hamlFilter start="^\z(\s*\):javascript\s*$" end="^\%(\z1 \| *$\)\@!" contains=@htmlJavaScript,hamlInterpolation keepend
+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\%((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
+
+syn region hamlComment start="^\z(\s*\)-#" end="^\%(\z1 \| *$\)\@!" contains=rubyTodo
+syn region hamlHtmlComment start="^\z(\s*\)/" end="^\%(\z1 \| *$\)\@!" contains=@hamlTop,rubyTodo
+syn match hamlIEConditional "\%(^\s*/\)\@<=\[if\>[^]]*]" contained containedin=hamlHtmlComment
+
+hi def link hamlSelfCloser Special
+hi def link hamlDespacer Special
+hi def link hamlClassChar Special
+hi def link hamlIdChar Special
+hi def link hamlTag Special
+hi def link hamlClass Type
+hi def link hamlId Identifier
+hi def link hamlPlainChar Special
+hi def link hamlInterpolatableChar hamlRubyChar
+hi def link hamlRubyOutputChar hamlRubyChar
+hi def link hamlRubyChar Special
+hi def link hamlInterpolationDelimiter Delimiter
+hi def link hamlInterpolationEscape Special
+hi def link hamlAttributeString String
+hi def link hamlAttributeVariable Identifier
+hi def link hamlDocType PreProc
+hi def link hamlFilter PreProc
+hi def link hamlAttributesDelimiter Delimiter
+hi def link hamlObjectDelimiter Delimiter
+hi def link hamlHelper Function
+hi def link hamlHtmlComment hamlComment
+hi def link hamlComment Comment
+hi def link hamlIEConditional SpecialComment
+hi def link hamlError Error
+
+let b:current_syntax = "haml"
+
+if main_syntax == "haml"
+ unlet main_syntax
+endif
+
+" vim:set sw=2:
diff --git a/runtime/syntax/hamster.vim b/runtime/syntax/hamster.vim
new file mode 100644
index 0000000..975562d
--- /dev/null
+++ b/runtime/syntax/hamster.vim
@@ -0,0 +1,370 @@
+" Vim syntax file
+" Language: Hamster Scripting Language
+" Maintainer: David Fishburn <fishburn@ianywhere.com>
+" Last Change: Sun Oct 24 2004 7:11:50 PM
+" Version: 2.0.6.0
+
+" Description: Hamster Classic
+" Hamster is a local server for news and mail. It's a windows-32-bit-program.
+" It allows the use of multiple news- and mailserver and combines them to one
+" mail- and newsserver for the news/mail-client. It load faster than a normal
+" newsreader because many threads can run simultaneous. It contains scorefile
+" for news and mail, a built-in script language, the GUI allows translation to
+" other languages, it can be used in a network and that's not all features...
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn keyword hamsterSpecial abs
+syn keyword hamsterSpecial artaddheader
+syn keyword hamsterSpecial artalloc
+syn keyword hamsterSpecial artdelheader
+syn keyword hamsterSpecial artfree
+syn keyword hamsterSpecial artgetbody
+syn keyword hamsterSpecial artgetheader
+syn keyword hamsterSpecial artgetheaders
+syn keyword hamsterSpecial artgettext
+syn keyword hamsterSpecial artheaderexists
+syn keyword hamsterSpecial artload
+syn keyword hamsterSpecial artsave
+syn keyword hamsterSpecial artsetbody
+syn keyword hamsterSpecial artsetheader
+syn keyword hamsterSpecial artsetheaders
+syn keyword hamsterSpecial artsettext
+syn keyword hamsterSpecial assert
+syn keyword hamsterSpecial atadd
+syn keyword hamsterSpecial atclear
+syn keyword hamsterSpecial atcount
+syn keyword hamsterSpecial ateverymins
+syn keyword hamsterSpecial atexecute
+syn keyword hamsterSpecial atfrom
+syn keyword hamsterSpecial atondays
+syn keyword hamsterSpecial atsubfunction
+syn keyword hamsterSpecial atuntil
+syn keyword hamsterSpecial beep
+syn keyword hamsterSpecial break
+syn keyword hamsterSpecial chr
+syn keyword hamsterSpecial clearxcounter
+syn keyword hamsterSpecial clipread
+syn keyword hamsterSpecial clipwrite
+syn keyword hamsterSpecial const
+syn keyword hamsterSpecial constenum
+syn keyword hamsterSpecial continue
+syn keyword hamsterSpecial copy
+syn keyword hamsterSpecial debug
+syn keyword hamsterSpecial dec
+syn keyword hamsterSpecial decodebase64
+syn keyword hamsterSpecial decodeqp
+syn keyword hamsterSpecial decodetime
+syn keyword hamsterSpecial decxcounter
+syn keyword hamsterSpecial delete
+syn keyword hamsterSpecial deletehostsentry
+syn keyword hamsterSpecial digest
+syn keyword hamsterSpecial dirchange
+syn keyword hamsterSpecial dircurrent
+syn keyword hamsterSpecial direxists
+syn keyword hamsterSpecial dirmake
+syn keyword hamsterSpecial dirremove
+syn keyword hamsterSpecial dirsystem
+syn keyword hamsterSpecial dirwindows
+syn keyword hamsterSpecial diskfreekb
+syn keyword hamsterSpecial dllcall
+syn keyword hamsterSpecial dllfree
+syn keyword hamsterSpecial dlllasterror
+syn keyword hamsterSpecial dllload
+syn keyword hamsterSpecial dump
+syn keyword hamsterSpecial encodetime
+syn keyword hamsterSpecial entercontext
+syn keyword hamsterSpecial errcatch
+syn keyword hamsterSpecial errline
+syn keyword hamsterSpecial errlineno
+syn keyword hamsterSpecial errmodule
+syn keyword hamsterSpecial errmsg
+syn keyword hamsterSpecial errnum
+syn keyword hamsterSpecial error
+syn keyword hamsterSpecial errsender
+syn keyword hamsterSpecial eval
+syn keyword hamsterSpecial eventclose
+syn keyword hamsterSpecial eventcreate
+syn keyword hamsterSpecial eventmultiplewait
+syn keyword hamsterSpecial eventpulse
+syn keyword hamsterSpecial eventreset
+syn keyword hamsterSpecial eventset
+syn keyword hamsterSpecial eventwait
+syn keyword hamsterSpecial execute
+syn keyword hamsterSpecial false
+syn keyword hamsterSpecial filecopy
+syn keyword hamsterSpecial filedelete
+syn keyword hamsterSpecial fileexists
+syn keyword hamsterSpecial filemove
+syn keyword hamsterSpecial filerename
+syn keyword hamsterSpecial filesize
+syn keyword hamsterSpecial filetime
+syn keyword hamsterSpecial getenv
+syn keyword hamsterSpecial getprocessidentifier
+syn keyword hamsterSpecial getuptimedays
+syn keyword hamsterSpecial getuptimehours
+syn keyword hamsterSpecial getuptimemins
+syn keyword hamsterSpecial getuptimesecs
+syn keyword hamsterSpecial gosub
+syn keyword hamsterSpecial goto
+syn keyword hamsterSpecial hex
+syn keyword hamsterSpecial icase
+syn keyword hamsterSpecial iif
+syn keyword hamsterSpecial inc
+syn keyword hamsterSpecial incxcounter
+syn keyword hamsterSpecial inidelete
+syn keyword hamsterSpecial inierasesection
+syn keyword hamsterSpecial iniread
+syn keyword hamsterSpecial iniwrite
+syn keyword hamsterSpecial inputbox
+syn keyword hamsterSpecial inputpw
+syn keyword hamsterSpecial int
+syn keyword hamsterSpecial isint
+syn keyword hamsterSpecial isstr
+syn keyword hamsterSpecial leavecontext
+syn keyword hamsterSpecial len
+syn keyword hamsterSpecial listadd
+syn keyword hamsterSpecial listalloc
+syn keyword hamsterSpecial listappend
+syn keyword hamsterSpecial listbox
+syn keyword hamsterSpecial listclear
+syn keyword hamsterSpecial listcount
+syn keyword hamsterSpecial listdelete
+syn keyword hamsterSpecial listdirs
+syn keyword hamsterSpecial listexists
+syn keyword hamsterSpecial listfiles
+syn keyword hamsterSpecial listfiles
+syn keyword hamsterSpecial listfree
+syn keyword hamsterSpecial listget
+syn keyword hamsterSpecial listgetkey
+syn keyword hamsterSpecial listgettag
+syn keyword hamsterSpecial listgettext
+syn keyword hamsterSpecial listindexof
+syn keyword hamsterSpecial listinsert
+syn keyword hamsterSpecial listload
+syn keyword hamsterSpecial listrasentries
+syn keyword hamsterSpecial listsave
+syn keyword hamsterSpecial listset
+syn keyword hamsterSpecial listsetkey
+syn keyword hamsterSpecial listsettag
+syn keyword hamsterSpecial listsettext
+syn keyword hamsterSpecial listsort
+syn keyword hamsterSpecial localhostaddr
+syn keyword hamsterSpecial localhostname
+syn keyword hamsterSpecial lookuphostaddr
+syn keyword hamsterSpecial lookuphostname
+syn keyword hamsterSpecial lowercase
+syn keyword hamsterSpecial memalloc
+syn keyword hamsterSpecial memforget
+syn keyword hamsterSpecial memfree
+syn keyword hamsterSpecial memgetint
+syn keyword hamsterSpecial memgetstr
+syn keyword hamsterSpecial memsetint
+syn keyword hamsterSpecial memsetstr
+syn keyword hamsterSpecial memsize
+syn keyword hamsterSpecial memvarptr
+syn keyword hamsterSpecial msgbox
+syn keyword hamsterSpecial ord
+syn keyword hamsterSpecial paramcount
+syn keyword hamsterSpecial paramstr
+syn keyword hamsterSpecial popupbox
+syn keyword hamsterSpecial pos
+syn keyword hamsterSpecial print
+syn keyword hamsterSpecial quit
+syn keyword hamsterSpecial random
+syn keyword hamsterSpecial randomize
+syn keyword hamsterSpecial rasdial
+syn keyword hamsterSpecial rasgetconnection
+syn keyword hamsterSpecial rasgetip
+syn keyword hamsterSpecial rashangup
+syn keyword hamsterSpecial rasisconnected
+syn keyword hamsterSpecial re_extract
+syn keyword hamsterSpecial re_match
+syn keyword hamsterSpecial re_parse
+syn keyword hamsterSpecial re_split
+syn keyword hamsterSpecial replace
+syn keyword hamsterSpecial return
+syn keyword hamsterSpecial runscript
+syn keyword hamsterSpecial scriptpriority
+syn keyword hamsterSpecial set
+syn keyword hamsterSpecial sethostsentry_byaddr
+syn keyword hamsterSpecial sethostsentry_byname
+syn keyword hamsterSpecial setxcounter
+syn keyword hamsterSpecial sgn
+syn keyword hamsterSpecial shell
+syn keyword hamsterSpecial sleep
+syn keyword hamsterSpecial stopthread
+syn keyword hamsterSpecial str
+syn keyword hamsterSpecial syserrormessage
+syn keyword hamsterSpecial testmailfilterline
+syn keyword hamsterSpecial testnewsfilterline
+syn keyword hamsterSpecial ticks
+syn keyword hamsterSpecial time
+syn keyword hamsterSpecial timegmt
+syn keyword hamsterSpecial trace
+syn keyword hamsterSpecial trim
+syn keyword hamsterSpecial true
+syn keyword hamsterSpecial uppercase
+syn keyword hamsterSpecial utf7toucs16
+syn keyword hamsterSpecial utf8toucs32
+syn keyword hamsterSpecial var
+syn keyword hamsterSpecial varset
+syn keyword hamsterSpecial warning
+syn keyword hamsterSpecial xcounter
+
+" common functions
+syn keyword hamsterFunction addlog
+syn keyword hamsterFunction decodemimeheaderstring
+syn keyword hamsterFunction decodetolocalcharset
+syn keyword hamsterFunction gettasksactive
+syn keyword hamsterFunction gettasksrun
+syn keyword hamsterFunction gettaskswait
+syn keyword hamsterFunction hamaddgroup
+syn keyword hamsterFunction hamaddlog
+syn keyword hamsterFunction hamaddpull
+syn keyword hamsterFunction hamartcount
+syn keyword hamsterFunction hamartdeletemid
+syn keyword hamsterFunction hamartdeletemidingroup
+syn keyword hamsterFunction hamartdeletenringroup
+syn keyword hamsterFunction hamartimport
+syn keyword hamsterFunction hamartlocatemid
+syn keyword hamsterFunction hamartlocatemidingroup
+syn keyword hamsterFunction hamartnomax
+syn keyword hamsterFunction hamartnomin
+syn keyword hamsterFunction hamarttext
+syn keyword hamsterFunction hamarttextexport
+syn keyword hamsterFunction hamchangepassword
+syn keyword hamsterFunction hamcheckpurge
+syn keyword hamsterFunction hamdelgroup
+syn keyword hamsterFunction hamdelpull
+syn keyword hamsterFunction hamdialogaddpull
+syn keyword hamsterFunction hamdialogeditdirs
+syn keyword hamsterFunction hamdialogmailkillfilelog
+syn keyword hamsterFunction hamdialognewskillfilelog
+syn keyword hamsterFunction hamdialogscripts
+syn keyword hamsterFunction hamenvelopefrom
+syn keyword hamsterFunction hamexepath
+syn keyword hamsterFunction hamfetchmail
+syn keyword hamsterFunction hamflush
+syn keyword hamsterFunction hamgetstatus
+syn keyword hamsterFunction hamgroupclose
+syn keyword hamsterFunction hamgroupcount
+syn keyword hamsterFunction hamgroupindex
+syn keyword hamsterFunction hamgroupname
+syn keyword hamsterFunction hamgroupnamebyhandle
+syn keyword hamsterFunction hamgroupopen
+syn keyword hamsterFunction hamgroupspath
+syn keyword hamsterFunction hamhscpath
+syn keyword hamsterFunction hamhsmpath
+syn keyword hamsterFunction hamimapserver
+syn keyword hamsterFunction hamisidle
+syn keyword hamsterFunction hamlogspath
+syn keyword hamsterFunction hammailexchange
+syn keyword hamsterFunction hammailpath
+syn keyword hamsterFunction hammailsoutpath
+syn keyword hamsterFunction hammainfqdn
+syn keyword hamsterFunction hammainwindow
+syn keyword hamsterFunction hammessage
+syn keyword hamsterFunction hammidfqdn
+syn keyword hamsterFunction hamnewmail
+syn keyword hamsterFunction hamnewserrpath
+syn keyword hamsterFunction hamnewsjobsadd
+syn keyword hamsterFunction hamnewsjobscheckactive
+syn keyword hamsterFunction hamnewsjobsclear
+syn keyword hamsterFunction hamnewsjobsdelete
+syn keyword hamsterFunction hamnewsjobsfeed
+syn keyword hamsterFunction hamnewsjobsgetcounter
+syn keyword hamsterFunction hamnewsjobsgetparam
+syn keyword hamsterFunction hamnewsjobsgetpriority
+syn keyword hamsterFunction hamnewsjobsgetserver
+syn keyword hamsterFunction hamnewsjobsgettype
+syn keyword hamsterFunction hamnewsjobspost
+syn keyword hamsterFunction hamnewsjobspostdef
+syn keyword hamsterFunction hamnewsjobspull
+syn keyword hamsterFunction hamnewsjobspulldef
+syn keyword hamsterFunction hamnewsjobssetpriority
+syn keyword hamsterFunction hamnewsjobsstart
+syn keyword hamsterFunction hamnewsoutpath
+syn keyword hamsterFunction hamnewspost
+syn keyword hamsterFunction hamnewspull
+syn keyword hamsterFunction hamnntpserver
+syn keyword hamsterFunction hampassreload
+syn keyword hamsterFunction hampath
+syn keyword hamsterFunction hampop3server
+syn keyword hamsterFunction hampostmaster
+syn keyword hamsterFunction hampurge
+syn keyword hamsterFunction hamrasdial
+syn keyword hamsterFunction hamrashangup
+syn keyword hamsterFunction hamrcpath
+syn keyword hamsterFunction hamrebuildgloballists
+syn keyword hamsterFunction hamrebuildhistory
+syn keyword hamsterFunction hamrecoserver
+syn keyword hamsterFunction hamreloadconfig
+syn keyword hamsterFunction hamreloadipaccess
+syn keyword hamsterFunction hamresetcounters
+syn keyword hamsterFunction hamrotatelog
+syn keyword hamsterFunction hamscorelist
+syn keyword hamsterFunction hamscoretest
+syn keyword hamsterFunction hamsendmail
+syn keyword hamsterFunction hamsendmailauth
+syn keyword hamsterFunction hamserverpath
+syn keyword hamsterFunction hamsetlogin
+syn keyword hamsterFunction hamshutdown
+syn keyword hamsterFunction hamsmtpserver
+syn keyword hamsterFunction hamstopalltasks
+syn keyword hamsterFunction hamthreadcount
+syn keyword hamsterFunction hamtrayicon
+syn keyword hamsterFunction hamusenetacc
+syn keyword hamsterFunction hamversion
+syn keyword hamsterFunction hamwaitidle
+syn keyword hamsterFunction raslasterror
+syn keyword hamsterFunction rfctimezone
+syn keyword hamsterFunction settasklimiter
+
+syn keyword hamsterStatement if
+syn keyword hamsterStatement else
+syn keyword hamsterStatement elseif
+syn keyword hamsterStatement endif
+syn keyword hamsterStatement do
+syn keyword hamsterStatement loop
+syn keyword hamsterStatement while
+syn keyword hamsterStatement endwhile
+syn keyword hamsterStatement repeat
+syn keyword hamsterStatement until
+syn keyword hamsterStatement for
+syn keyword hamsterStatement endfor
+syn keyword hamsterStatement sub
+syn keyword hamsterStatement endsub
+syn keyword hamsterStatement label
+
+
+" Strings and characters:
+syn region hamsterString start=+"+ end=+"+ contains=@Spell
+syn region hamsterString start=+'+ end=+'+ contains=@Spell
+
+" Numbers:
+syn match hamsterNumber "-\=\<\d*\.\=[0-9_]\>"
+
+" Comments:
+syn region hamsterHashComment start=/#/ end=/$/ contains=@Spell
+syn cluster hamsterComment contains=hamsterHashComment
+syn sync ccomment hamsterHashComment
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "hamster"
+
+" vim:sw=4
diff --git a/runtime/syntax/hare.vim b/runtime/syntax/hare.vim
new file mode 100644
index 0000000..07cf33f
--- /dev/null
+++ b/runtime/syntax/hare.vim
@@ -0,0 +1,133 @@
+" PRELUDE {{{1
+" Vim syntax file
+" Language: Hare
+" Maintainer: Amelia Clarke <me@rsaihe.dev>
+" Last Change: 2022-09-21
+
+if exists("b:current_syntax")
+ finish
+endif
+let b:current_syntax = "hare"
+
+" SYNTAX {{{1
+syn case match
+
+" KEYWORDS {{{2
+syn keyword hareConditional if else match switch
+syn keyword hareKeyword break continue return yield
+syn keyword hareKeyword defer
+syn keyword hareKeyword fn
+syn keyword hareKeyword let
+syn keyword hareLabel case
+syn keyword hareOperator as is
+syn keyword hareRepeat for
+syn keyword hareStorageClass const def export nullable static
+syn keyword hareStructure enum struct union
+syn keyword hareTypedef type
+
+" C ABI.
+syn keyword hareKeyword vastart vaarg vaend
+
+" BUILTINS {{{2
+syn keyword hareBuiltin abort
+syn keyword hareBuiltin alloc free
+syn keyword hareBuiltin append delete insert
+syn keyword hareBuiltin assert
+syn keyword hareBuiltin len offset
+
+" TYPES {{{2
+syn keyword hareType bool
+syn keyword hareType char str
+syn keyword hareType f32 f64
+syn keyword hareType u8 u16 u32 u64 i8 i16 i32 i64
+syn keyword hareType uint int
+syn keyword hareType rune
+syn keyword hareType uintptr
+syn keyword hareType void
+
+" C ABI.
+syn keyword hareType valist
+
+" LITERALS {{{2
+syn keyword hareBoolean true false
+syn keyword hareNull null
+
+" Number literals.
+syn match hareNumber "\v(\.@1<!|\.\.)\zs<\d+([Ee][+-]?\d+)?(z|[iu](8|16|32|64)?)?>" display
+syn match hareNumber "\v(\.@1<!|\.\.)\zs<0b[01]+(z|[iu](8|16|32|64)?)?>" display
+syn match hareNumber "\v(\.@1<!|\.\.)\zs<0o\o+(z|[iu](8|16|32|64)?)?>" display
+syn match hareNumber "\v(\.@1<!|\.\.)\zs<0x\x+(z|[iu](8|16|32|64)?)?>" display
+
+" Floating-point number literals.
+syn match hareFloat "\v<\d+\.\d+([Ee][+-]?\d+)?(f32|f64)?>" display
+syn match hareFloat "\v<\d+([Ee][+-]?\d+)?(f32|f64)>" display
+
+" String and rune literals.
+syn match hareEscape "\\[\\'"0abfnrtv]" contained display
+syn match hareEscape "\v\\(x\x{2}|u\x{4}|U\x{8})" contained display
+syn match hareFormat "\v\{\d*(\%\d*|(:[ 0+-]?\d*(\.\d+)?[Xbox]?))?}" contained display
+syn match hareFormat "\({{\|}}\)" contained display
+syn region hareRune start="'" end="'\|$" skip="\\'" contains=hareEscape display extend
+syn region hareString start=+"+ end=+"\|$+ skip=+\\"+ contains=hareEscape,hareFormat display extend
+syn region hareString start="`" end="`\|$" contains=hareFormat display
+
+" MISCELLANEOUS {{{2
+syn keyword hareTodo FIXME TODO XXX contained
+
+" Attributes.
+syn match hareAttribute "@[a-z]*"
+
+" Blocks.
+syn region hareBlock start="{" end="}" fold transparent
+
+" Comments.
+syn region hareComment start="//" end="$" contains=hareCommentDoc,hareTodo,@Spell display keepend
+syn region hareCommentDoc start="\[\[" end="]]\|\ze\_s" contained display
+
+" The size keyword can be either a builtin or a type.
+syn match hareBuiltin "\v<size>\ze(\_s*//.*\_$)*\_s*\(" contains=hareComment
+syn match hareType "\v<size>((\_s*//.*\_$)*\_s*\()@!" contains=hareComment
+
+" Trailing whitespace.
+syn match hareSpaceError "\v\s+$" display excludenl
+syn match hareSpaceError "\v\zs +\ze\t" display
+
+" Use statement.
+syn region hareUse start="\v^\s*\zsuse>" end=";" contains=hareComment display
+
+syn match hareErrorAssertion "\v(^([^/]|//@!)*\)\_s*)@<=!\=@!"
+syn match hareQuestionMark "?"
+
+" DEFAULT HIGHLIGHTING {{{1
+hi def link hareAttribute Keyword
+hi def link hareBoolean Boolean
+hi def link hareBuiltin Function
+hi def link hareComment Comment
+hi def link hareCommentDoc SpecialComment
+hi def link hareConditional Conditional
+hi def link hareEscape SpecialChar
+hi def link hareFloat Float
+hi def link hareFormat SpecialChar
+hi def link hareKeyword Keyword
+hi def link hareLabel Label
+hi def link hareNull Constant
+hi def link hareNumber Number
+hi def link hareOperator Operator
+hi def link hareQuestionMark Special
+hi def link hareRepeat Repeat
+hi def link hareRune Character
+hi def link hareStorageClass StorageClass
+hi def link hareString String
+hi def link hareStructure Structure
+hi def link hareTodo Todo
+hi def link hareType Type
+hi def link hareTypedef Typedef
+hi def link hareUse PreProc
+
+hi def link hareSpaceError Error
+autocmd InsertEnter * hi link hareSpaceError NONE
+autocmd InsertLeave * hi link hareSpaceError Error
+
+hi def hareErrorAssertion ctermfg=red cterm=bold guifg=red gui=bold
+
+" vim: tabstop=8 shiftwidth=2 expandtab
diff --git a/runtime/syntax/haskell.vim b/runtime/syntax/haskell.vim
new file mode 100644
index 0000000..1b70b93
--- /dev/null
+++ b/runtime/syntax/haskell.vim
@@ -0,0 +1,191 @@
+" Vim syntax file
+" Language: Haskell
+" Maintainer: Haskell Cafe mailinglist <haskell-cafe@haskell.org>
+" Last Change: 2020 Oct 4 by Marcin Szamotulski <profunctor@pm.me>
+" Original Author: John Williams <jrw@pobox.com>
+"
+" Thanks to Ryan Crumley for suggestions and John Meacham for
+" pointing out bugs. Also thanks to Ian Lynagh and Donald Bruce Stewart
+" for providing the inspiration for the inclusion of the handling
+" of C preprocessor directives, and for pointing out a bug in the
+" end-of-line comment handling.
+"
+" Options-assign a value to these variables to turn the option on:
+"
+" hs_highlight_delimiters - Highlight delimiter characters--users
+" with a light-colored background will
+" probably want to turn this on.
+" hs_highlight_boolean - Treat True and False as keywords.
+" hs_highlight_types - Treat names of primitive types as keywords.
+" hs_highlight_more_types - Treat names of other common types as keywords.
+" hs_highlight_debug - Highlight names of debugging functions.
+" hs_allow_hash_operator - Don't highlight seemingly incorrect C
+" preprocessor directives but assume them to be
+" operators
+"
+" 2004 Feb 19: Added C preprocessor directive handling, corrected eol comments
+" cleaned away literate haskell support (should be entirely in
+" lhaskell.vim)
+" 2004 Feb 20: Cleaned up C preprocessor directive handling, fixed single \
+" in eol comment character class
+" 2004 Feb 23: Made the leading comments somewhat clearer where it comes
+" to attribution of work.
+" 2008 Dec 15: Added comments as contained element in import statements
+
+" 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_']*\>" 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,
+" others are variables (e.g. functions).
+syn match hsVarSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[-!#$%&\*\+/<=>\?@\\^|~.][-!#$%&\*\+/<=>\?@\\^|~:.]*"
+syn match hsConSym "\(\<[A-Z][a-zA-Z0-9_']*\.\)\=:[-!#$%&\*\+./<=>\?@\\^|~:]*"
+syn match hsVarSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[a-z][a-zA-Z0-9_']*`"
+syn match hsConSym "`\(\<[A-Z][a-zA-Z0-9_']*\.\)\=[A-Z][a-zA-Z0-9_']*`"
+
+" (Non-qualified) identifiers which start with # are labels
+syn match hsLabel "#[a-z][a-zA-Z0-9_']*\>"
+
+" Reserved symbols--cannot be overloaded.
+syn match hsDelimiter "(\|)\|\[\|\]\|,\|;\|{\|}"
+
+" Strings and constants
+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,@NoSpell
+syn match hsCharacter "[^a-zA-Z0-9_']'\([^\\]\|\\[^']\+\|\\'\)'"lc=1 contains=hsSpecialChar,hsSpecialCharError
+syn match hsCharacter "^'\([^\\]\|\\[^']\+\|\\'\)'" contains=hsSpecialChar,hsSpecialCharError
+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.
+syn keyword hsModule module
+syn match hsImportGroup "\<import\>.*" contains=hsImport,hsImportModuleName,hsImportMod,hsLineComment,hsBlockComment,hsImportList,@NoSpell nextgroup=hsImport
+syn keyword hsImport import contained nextgroup=hsImportModuleName
+syn match hsImportModuleName '\<[A-Z][A-Za-z.]*' contained
+syn region hsImportList start='(' skip='([^)]\{-})' end=')' keepend contained contains=ConId,VarId,hsDelimiter,hsBlockComment,hsTypedef,@NoSpell
+
+syn keyword hsImportMod contained as qualified hiding
+syn keyword hsInfix infix infixl infixr
+syn keyword hsStructure class data deriving instance default where
+syn keyword hsTypedef type
+syn keyword hsNewtypedef newtype
+syn keyword hsTypeFam family
+syn keyword hsStatement mdo do case of let in
+syn keyword hsConditional if then else
+
+" Not real keywords, but close.
+if exists("hs_highlight_boolean")
+ " Boolean constants from the standard prelude.
+ syn keyword hsBoolean True False
+endif
+if exists("hs_highlight_types")
+ " Primitive types from the standard prelude and libraries.
+ syn keyword hsType Int Integer Char Bool Float Double IO Void Addr Array String
+endif
+if exists("hs_highlight_more_types")
+ " Types from the standard prelude libraries.
+ syn keyword hsType Maybe Either Ratio Complex Ordering IOError IOResult ExitCode
+ syn keyword hsMaybe Nothing
+ syn keyword hsExitCode ExitSuccess
+ syn keyword hsOrdering GT LT EQ
+endif
+if exists("hs_highlight_debug")
+ " Debugging functions from the standard prelude.
+ syn keyword hsDebug undefined error trace
+endif
+
+
+" Comments
+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
+" First, see whether to flag directive-like lines or not
+if (!exists("hs_allow_hash_operator"))
+ syn match cError display "^\s*\(%:\|#\).*$"
+endif
+" Accept %: for # (C99)
+syn region cPreCondit start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=cComment,cCppString,cCommentError
+syn match cPreCondit display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
+syn region cCppOut start="^\s*\(%:\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=cCppOut2
+syn region cCppOut2 contained start="0" end="^\s*\(%:\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=cCppSkip
+syn region cCppSkip contained start="^\s*\(%:\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(%:\|#\)\s*endif\>" contains=cCppSkip
+syn region cIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match cIncluded display contained "<[^>]*>"
+syn match cInclude display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=cIncluded
+syn cluster cPreProcGroup contains=cPreCondit,cIncluded,cInclude,cDefine,cCppOut,cCppOut2,cCppSkip,cCommentStartError
+syn region cDefine matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$"
+syn region cPreProc matchgroup=cPreCondit start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend
+
+syn region cComment matchgroup=cCommentStart start="/\*" end="\*/" contains=cCommentStartError,cSpaceError contained
+syntax match cCommentError display "\*/" contained
+syntax match cCommentStartError display "/\*"me=e-1 contained
+syn region cCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=cSpecial contained
+
+" Define the default highlighting.
+" 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 hsNewtypedef Typedef
+hi def link hsVarSym hsOperator
+hi def link hsConSym hsOperator
+hi def link hsOperator Operator
+hi def link hsTypeFam Structure
+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 hsLabel Special
+
+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"
+
+" Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim
diff --git a/runtime/syntax/haste.vim b/runtime/syntax/haste.vim
new file mode 100644
index 0000000..79e9f5e
--- /dev/null
+++ b/runtime/syntax/haste.vim
@@ -0,0 +1,142 @@
+" Vim syntax file
+" Language: HASTE - a language for VLSI IC programming
+" Maintainer: M. Tranchero - maurizio.tranchero?gmail.com
+" Credits: some parts have been taken from vhdl, verilog, and C syntax
+" files
+" Version: 0.9
+" Last Change: 0.9 improvement of haste numbers detection
+" Change: 0.8 error matching for wrong hierarchical connections
+" Change: 0.7 added more rules to highlight pre-processor directives
+
+" HASTE
+if exists("b:current_syntax")
+ finish
+endif
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" case is significant
+syn case match
+
+" HASTE keywords
+syn keyword hasteStatement act alias arb array begin bitvec
+syn keyword hasteStatement bitwidth boolvec broad case
+syn keyword hasteStatement cast chan const dataprobe do edge
+syn keyword hasteStatement else end export false ff fi file
+syn keyword hasteStatement fit for forever func if import
+syn keyword hasteStatement inprobe is les main narb narrow
+syn keyword hasteStatement negedge od of or outprobe pas
+syn keyword hasteStatement posedge probe proc ram ramreg
+syn keyword hasteStatement repeat rom romreg sample sel si
+syn keyword hasteStatement sign sizeof skip stop then true
+syn keyword hasteStatement type until var wait wire
+syn keyword hasteFutureExt Z ffe partial
+syn keyword hasteVerilog buf reg while
+
+" Special match for "if", "or", and "else" since "else if"
+" and other "else+if" combination shouldn't be highlighted.
+" The right keyword is "or"
+syn match hasteStatement "\<\(if\|then\|else\|fi\)\>"
+syn match hasteNone "\<else\s\+if\>$"
+syn match hasteNone "\<else\s\+if\>\s"
+syn match hasteNone "\<elseif\>\s"
+syn match hasteNone "\<elsif\>\s"
+syn match hasteStatement "\<\(case\|is\|si\)\>"
+syn match hasteStatement "\<\(repeat\|until\)\>"
+syn match hasteStatement "\<\(forever\|do\|od\)\>"
+syn match hasteStatement "\<\(for\|do\|od\)\>"
+syn match hasteStatement "\<\(do\|or\|od\)\>"
+syn match hasteStatement "\<\(sel\|les\)\>"
+syn match hasteError "\<\d\+[_a-zA-Z]\+\>"
+syn match hasteError "\(\([[:alnum:]]\+\s*(\s\+\|)\s*,\)\)\s*\([[:alnum:]]\+\s*(\)"
+
+" Predifined Haste types
+syn keyword hasteType bool
+
+" Values for standard Haste types
+" syn match hasteVector "\'[0L1HXWZU\-\?]\'"
+
+syn match hasteVector "0b\"[01_]\+\""
+syn match hasteVector "0x\"[0-9a-f_]\+\""
+syn match hasteCharacter "'.'"
+" syn region hasteString start=+"+ end=+"+
+syn match hasteIncluded display contained "<[^>]*>"
+syn match hasteIncluded display contained "<[^"]*>"
+syn region hasteInclude start="^\s*#include\>\s*" end="$" contains=hasteIncluded,hasteString
+
+" integer numbers
+syn match hasteNumber "\d\+\^[[:alnum:]]*[-+]\{0,1\}[[:alnum:]]*"
+syn match hasteNumber "-\=\<\d\+\(\^[+\-]\=\d\+\)\>"
+syn match hasteNumber "-\=\<\d\+\>"
+" syn match hasteNumber "0*2#[01_]\+#\(\^[+\-]\=\d\+\)\="
+" syn match hasteNumber "0*16#[0-9a-f_]\+#\(\^[+\-]\=\d\+\)\="
+" operators
+syn keyword hasteSeparators & , . \|
+syn keyword hasteExecution \|\| ; @
+syn keyword hasteOperator := ? ! :
+syn keyword hasteTypeConstr "[" << >> .. "]" ~
+syn keyword hasteExprOp < <= >= > = # <> + - * == ##
+syn keyword hasteMisc ( ) 0x 0b
+"
+syn match hasteSeparators "[&:\|,.]"
+syn match hasteOperator ":="
+syn match hasteOperator ":"
+syn match hasteOperator "?"
+syn match hasteOperator "!"
+syn match hasteExecution "||"
+syn match hasteExecution ";"
+syn match hasteExecution "@"
+syn match hasteType "\[\["
+syn match hasteType "\]\]"
+syn match hasteType "<<"
+syn match hasteType ">>"
+syn match hasteExprOp "<"
+syn match hasteExprOp "<="
+syn match hasteExprOp ">="
+syn match hasteExprOp ">"
+syn match hasteExprOp "<>"
+syn match hasteExprOp "="
+syn match hasteExprOp "=="
+syn match hasteExprOp "##"
+" syn match hasteExprOp "#"
+syn match hasteExprOp "*"
+syn match hasteExprOp "+"
+
+syn region hasteComment start="/\*" end="\*/" contains=@Spell
+syn region hasteComment start="{" end="}" contains=@Spell
+syn match hasteComment "//.*" contains=@Spell
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+hi def link hasteSpecial Special
+hi def link hasteStatement Statement
+hi def link hasteCharacter String
+hi def link hasteString String
+hi def link hasteVector String
+hi def link hasteBoolean String
+hi def link hasteComment Comment
+hi def link hasteNumber String
+hi def link hasteTime String
+hi def link hasteType Type
+hi def link hasteGlobal Error
+hi def link hasteError Error
+hi def link hasteAttribute Type
+"
+hi def link hasteSeparators Special
+hi def link hasteExecution Special
+hi def link hasteTypeConstr Special
+hi def link hasteOperator Type
+hi def link hasteExprOp Type
+hi def link hasteMisc String
+hi def link hasteFutureExt Error
+hi def link hasteVerilog Error
+hi def link hasteDefine Macro
+hi def link hasteInclude Include
+" hi def link hastePreProc Preproc
+" hi def link hastePreProcVar Special
+
+let b:current_syntax = "haste"
+
+" vim: ts=8
diff --git a/runtime/syntax/hastepreproc.vim b/runtime/syntax/hastepreproc.vim
new file mode 100644
index 0000000..f08bf3f
--- /dev/null
+++ b/runtime/syntax/hastepreproc.vim
@@ -0,0 +1,38 @@
+" Vim syntax file
+" Language: Haste preprocessor files
+" Maintainer: M. Tranchero - maurizio.tranchero@gmail.com
+" Credits: some parts have been taken from vhdl, verilog, and C syntax
+" files
+" Version: 0.5
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+" Read the haste syntax to start with
+runtime! syntax/haste.vim
+unlet b:current_syntax
+
+" case is significant
+syn case match
+
+" C pre-processor directives
+syn match hastepreprocVar display "\$[[:alnum:]_]*"
+syn region hastepreprocVar start="\${" end="}" contains=hastepreprocVar
+"
+"syn region hastepreproc start="#\[\s*tg[:alnum:]*" end="]#" contains=hastepreprocVar,hastepreproc,hastepreprocError,@Spell
+syn region hastepreproc start="#\[\s*\(\|tgfor\|tgif\)" end="$" contains=hastepreprocVar,hastepreproc,@Spell
+syn region hastepreproc start="}\s\(else\)\s{" end="$" contains=hastepreprocVar,hastepreproc,@Spell
+syn region hastepreproc start="^\s*#\s*\(ifndef\|ifdef\|else\|endif\)\>" end="$" contains=@hastepreprocGroup,@Spell
+syn region hastepreproc start="\s*##\s*\(define\|undef\)\>" end="$" contains=@hastepreprocGroup,@Spell
+syn match hastepreproc "}\{0,1}\s*]#"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+hi def link hastepreproc Preproc
+hi def link hastepreprocVar Special
+hi def link hastepreprocError Error
+
+let b:current_syntax = "hastepreproc"
+
+" vim: ts=8
diff --git a/runtime/syntax/hb.vim b/runtime/syntax/hb.vim
new file mode 100644
index 0000000..7bff1df
--- /dev/null
+++ b/runtime/syntax/hb.vim
@@ -0,0 +1,89 @@
+" Vim syntax file
+" Language: Hyper Builder
+" Maintainer: Alejandro Forero Cuervo
+" URL: http://bachue.com/hb/vim/syntax/hb.vim
+" Last Change: 2012 Jan 08 by Thilo Six
+
+" 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 HTML syntax to start with
+"syn include @HTMLStuff <sfile>:p:h/htmlhb.vim
+
+"this would be nice but we are supposed not to do it
+"set mps=<:>
+
+"syn region HBhtmlString contained start=+"+ end=+"+ contains=htmlSpecialChar
+"syn region HBhtmlString contained start=+'+ end=+'+ contains=htmlSpecialChar
+
+"syn match htmlValue contained "=[\t ]*[^'" \t>][^ \t>]*"
+
+syn match htmlSpecialChar "&[^;]*;" contained
+
+syn match HBhtmlTagSk contained "[A-Za-z]*"
+
+syn match HBhtmlTagS contained "<\s*\(hb\s*\.\s*\(sec\|min\|hour\|day\|mon\|year\|input\|html\|time\|getcookie\|streql\|url-enc\)\|wall\s*\.\s*\(show\|info\|id\|new\|rm\|count\)\|auth\s*\.\s*\(chk\|add\|find\|user\)\|math\s*\.\s*exp\)\s*\([^.A-Za-z0-9]\|$\)" contains=HBhtmlTagSk transparent
+
+syn match HBhtmlTagN contained "[A-Za-z0-9\/\-]\+"
+
+syn match HBhtmlTagB contained "<\s*[A-Za-z0-9\/\-]\+\(\s*\.\s*[A-Za-z0-9\/\-]\+\)*" contains=HBhtmlTagS,HBhtmlTagN
+
+syn region HBhtmlTag contained start=+<+ end=+>+ contains=HBhtmlTagB,HBDirectiveError
+
+syn match HBFileName ".*" contained
+
+syn match HBDirectiveKeyword ":\s*\(include\|lib\|set\|out\)\s\+" contained
+
+syn match HBDirectiveError "^:.*$" contained
+
+"syn match HBDirectiveBlockEnd "^:\s*$" contained
+
+"syn match HBDirectiveOutHead "^:\s*out\s\+\S\+.*" contained contains=HBDirectiveKeyword,HBFileName
+
+"syn match HBDirectiveSetHead "^:\s*set\s\+\S\+.*" contained contains=HBDirectiveKeyword,HBFileName
+
+syn match HBInvalidLine "^.*$"
+
+syn match HBDirectiveInclude "^:\s*include\s\+\S\+.*$" contains=HBFileName,HBDirectiveKeyword
+
+syn match HBDirectiveLib "^:\s*lib\s\+\S\+.*$" contains=HBFileName,HBDirectiveKeyword
+
+syn region HBText matchgroup=HBDirectiveKeyword start=/^:\(set\|out\)\s*\S\+.*$/ end=/^:\s*$/ contains=HBDirectiveError,htmlSpecialChar,HBhtmlTag keepend
+
+"syn match HBLine "^:.*$" contains=HBDirectiveInclude,HBDirectiveLib,HBDirectiveError,HBDirectiveSet,HBDirectiveOut
+
+syn match HBComment "^#.*$"
+
+" Define the default highlighting.
+" 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]\+$"
+syn sync match Normal grouphere NONE "^:\s*include\s\+[^ \t]\+$"
+"syn sync match Block grouphere HBDirectiveSet "^#:\s*set\s\+[^ \t]\+"
+"syn sync match Block grouphere HBDirectiveOut "^#:\s*out\s\+[^ \t]\+"
+
+let b:current_syntax = "hb"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/help.vim b/runtime/syntax/help.vim
new file mode 100644
index 0000000..a2fddbb
--- /dev/null
+++ b/runtime/syntax/help.vim
@@ -0,0 +1,229 @@
+" Vim syntax file
+" Language: Vim help file
+" Maintainer: Bram Moolenaar (Bram@vim.org)
+" Last Change: 2022 Nov 13
+
+" 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 match helpHeadline "^[A-Z.][-A-Z0-9 .,()_']*?\=\ze\(\s\+\*\|$\)"
+syn match helpSectionDelim "^===.*===$"
+syn match helpSectionDelim "^---.*--$"
+if has("conceal")
+ syn region helpExample matchgroup=helpIgnore start=" >$" start="^>$" end="^[^ \t]"me=e-1 end="^<" concealends
+else
+ syn region helpExample matchgroup=helpIgnore start=" >$" start="^>$" end="^[^ \t]"me=e-1 end="^<"
+endif
+if has("ebcdic")
+ syn match helpHyperTextJump "\\\@<!|[^"*|]\+|" contains=helpBar
+ syn match helpHyperTextEntry "\*[^"*|]\+\*\s"he=e-1 contains=helpStar
+ syn match helpHyperTextEntry "\*[^"*|]\+\*$" contains=helpStar
+else
+ syn match helpHyperTextJump "\\\@<!|[#-)!+-~]\+|" contains=helpBar
+ syn match helpHyperTextEntry "\*[#-)!+-~]\+\*\s"he=e-1 contains=helpStar
+ syn match helpHyperTextEntry "\*[#-)!+-~]\+\*$" contains=helpStar
+endif
+if has("conceal")
+ syn match helpBar contained "|" conceal
+ syn match helpBacktick contained "`" conceal
+ syn match helpStar contained "\*" conceal
+else
+ syn match helpBar contained "|"
+ syn match helpBacktick contained "`"
+ syn match helpStar contained "\*"
+endif
+syn match helpNormal "|.*====*|"
+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 helpOption "'[a-z]\{2,\}'"
+syn match helpOption "'t_..'"
+syn match helpNormal "'ab'"
+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")
+ syn match helpIgnore "." contained conceal
+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 "\s\[[-a-z^A-Z0-9_]\{2,}]"ms=s+1
+syn match helpSpecial "<[-a-zA-Z0-9_]\+>"
+syn match helpSpecial "<[SCM]-.>"
+syn match helpNormal "<---*>"
+syn match helpSpecial "\[range]"
+syn match helpSpecial "\[line]"
+syn match helpSpecial "\[count]"
+syn match helpSpecial "\[offset]"
+syn match helpSpecial "\[cmd]"
+syn match helpNormal "vim9\[cmd]"
+syn match helpSpecial "\[num]"
+syn match helpSpecial "\[+num]"
+syn match helpSpecial "\[-num]"
+syn match helpSpecial "\[+cmd]"
+syn match helpSpecial "\[++opt]"
+syn match helpSpecial "\[arg]"
+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-SHIFT-."
+syn match helpSpecial "CTRL-Break"
+syn match helpSpecial "CTRL-PageUp"
+syn match helpSpecial "CTRL-PageDown"
+syn match helpSpecial "CTRL-Insert"
+syn match helpSpecial "CTRL-Del"
+syn match helpSpecial "CTRL-{char}"
+syn region helpNotVi start="{Vi[: ]" start="{not" start="{only" end="}" contains=helpLeadBlank,helpHyperTextJump
+syn match helpLeadBlank "^\s\+" contained
+
+" Highlight group items in their own color.
+syn match helpComment "\t[* ]Comment\t\+[a-z].*"
+syn match helpConstant "\t[* ]Constant\t\+[a-z].*"
+syn match helpString "\t[* ]String\t\+[a-z].*"
+syn match helpCharacter "\t[* ]Character\t\+[a-z].*"
+syn match helpNumber "\t[* ]Number\t\+[a-z].*"
+syn match helpBoolean "\t[* ]Boolean\t\+[a-z].*"
+syn match helpFloat "\t[* ]Float\t\+[a-z].*"
+syn match helpIdentifier "\t[* ]Identifier\t\+[a-z].*"
+syn match helpFunction "\t[* ]Function\t\+[a-z].*"
+syn match helpStatement "\t[* ]Statement\t\+[a-z].*"
+syn match helpConditional "\t[* ]Conditional\t\+[a-z].*"
+syn match helpRepeat "\t[* ]Repeat\t\+[a-z].*"
+syn match helpLabel "\t[* ]Label\t\+[a-z].*"
+syn match helpOperator "\t[* ]Operator\t\+["a-z].*"
+syn match helpKeyword "\t[* ]Keyword\t\+[a-z].*"
+syn match helpException "\t[* ]Exception\t\+[a-z].*"
+syn match helpPreProc "\t[* ]PreProc\t\+[a-z].*"
+syn match helpInclude "\t[* ]Include\t\+[a-z].*"
+syn match helpDefine "\t[* ]Define\t\+[a-z].*"
+syn match helpMacro "\t[* ]Macro\t\+[a-z].*"
+syn match helpPreCondit "\t[* ]PreCondit\t\+[a-z].*"
+syn match helpType "\t[* ]Type\t\+[a-z].*"
+syn match helpStorageClass "\t[* ]StorageClass\t\+[a-z].*"
+syn match helpStructure "\t[* ]Structure\t\+[a-z].*"
+syn match helpTypedef "\t[* ]Typedef\t\+[Aa-z].*"
+syn match helpSpecial "\t[* ]Special\t\+[a-z].*"
+syn match helpSpecialChar "\t[* ]SpecialChar\t\+[a-z].*"
+syn match helpTag "\t[* ]Tag\t\+[a-z].*"
+syn match helpDelimiter "\t[* ]Delimiter\t\+[a-z].*"
+syn match helpSpecialComment "\t[* ]SpecialComment\t\+[a-z].*"
+syn match helpDebug "\t[* ]Debug\t\+[a-z].*"
+syn match helpUnderlined "\t[* ]Underlined\t\+[a-z].*"
+syn match helpError "\t[* ]Error\t\+[a-z].*"
+syn match helpTodo "\t[* ]Todo\t\+[a-z].*"
+
+syn match helpURL `\v<(((https?|ftp|gopher)://|(mailto|file|news):)[^' <>"]+|(www|web|w3)[a-z0-9_-]*\.[a-z0-9._-]+\.[^' <>"]+)[a-zA-Z0-9/]`
+
+" Additionally load a language-specific syntax file "help_ab.vim".
+let s:i = match(expand("%"), '\.\a\ax$')
+if s:i > 0
+ exe "runtime syntax/help_" . strpart(expand("%"), s:i + 1, 2) . ".vim"
+endif
+
+" Italian
+if v:lang =~ '\<IT\>' || v:lang =~ '_IT\>' || v:lang =~? "italian"
+ syn keyword helpNote nota Nota NOTA nota: Nota: NOTA: notare Notare NOTARE notare: Notare: NOTARE:
+ syn match helpSpecial "Nma"me=e-2
+ syn match helpSpecial "Nme"me=e-2
+ syn match helpSpecial "Nmi"me=e-2
+ syn match helpSpecial "Nmo"me=e-2
+ syn match helpSpecial "\[interv.]"
+ syn region helpNotVi start="{non" start="{solo" start="{disponibile" end="}" contains=helpLeadBlank,helpHyperTextJump
+endif
+
+syn sync minlines=40
+
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet
+hi def link helpIgnore Ignore
+hi def link helpHyperTextJump Identifier
+hi def link helpBar Ignore
+hi def link helpBacktick Ignore
+hi def link helpStar Ignore
+hi def link helpHyperTextEntry String
+hi def link helpHeadline Statement
+hi def link helpHeader PreProc
+hi def link helpSectionDelim PreProc
+hi def link helpVim Identifier
+hi def link helpCommand Comment
+hi def link helpExample Comment
+hi def link helpOption Type
+hi def link helpNotVi Special
+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
+hi def link helpString String
+hi def link helpCharacter Character
+hi def link helpNumber Number
+hi def link helpBoolean Boolean
+hi def link helpFloat Float
+hi def link helpIdentifier Identifier
+hi def link helpFunction Function
+hi def link helpStatement Statement
+hi def link helpConditional Conditional
+hi def link helpRepeat Repeat
+hi def link helpLabel Label
+hi def link helpOperator Operator
+hi def link helpKeyword Keyword
+hi def link helpException Exception
+hi def link helpPreProc PreProc
+hi def link helpInclude Include
+hi def link helpDefine Define
+hi def link helpMacro Macro
+hi def link helpPreCondit PreCondit
+hi def link helpType Type
+hi def link helpStorageClass StorageClass
+hi def link helpStructure Structure
+hi def link helpTypedef Typedef
+hi def link helpSpecialChar SpecialChar
+hi def link helpTag Tag
+hi def link helpDelimiter Delimiter
+hi def link helpSpecialComment SpecialComment
+hi def link helpDebug Debug
+hi def link helpUnderlined Underlined
+hi def link helpError Error
+hi def link helpTodo Todo
+hi def link helpURL String
+
+if has('textprop') && expand('%:p') =~ '[/\\]doc[/\\]syntax.txt'
+ " highlight groups with their respective color
+ import 'dist/vimhelp.vim'
+ call vimhelp.HighlightGroups()
+endif
+
+let b:current_syntax = "help"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/help_ru.vim b/runtime/syntax/help_ru.vim
new file mode 100644
index 0000000..67df7e1
--- /dev/null
+++ b/runtime/syntax/help_ru.vim
@@ -0,0 +1,65 @@
+" Vim syntax file
+" Language: Russian Vim program help files *.rux
+" Maintainer: Restorer (restorers@users.sourceforge.net DEFUNCT)
+" Last Change: 04 Aprl 2017
+"
+
+" Проверяем язык локали и установки опции 'helplang'
+" Если не русский, то выходим из скрипта.
+if (v:lang !~? 'ru' || v:lang !~? 'russian') && &helplang !~? 'ru'
+ finish
+endif
+
+" Подсветка русских гиперссылок
+syntax match helpHyperTextJump "\\\@<!|[^"*~# |]\+|" contains=helpBar
+syntax match helpHyperTextEntry "\*[^"*|]\+\*\s"he=e-1 contains=helpStar
+syntax match helpHyperTextEntry "\*[^"*|]\+\*$" contains=helpStar
+
+" Заголовок статьи, раздела и т. п.
+syntax match helpHeadline "^[А-ЯЁ]\{2}[ .]\=[-,А-ЯЁA-Z0-9 .()]*"
+
+" Наименование справочника
+" новый заголовок
+" syntax match helpVim "\<СПРАВОЧНИК ПО РЕДАКТОРУ VIM\>"
+"старый заголовок
+syntax match helpVim "\<СПРАВОЧНИК ПО .*"
+" новый заголовок
+"syntax match helpVim "\<РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ РЕДАКТОРОМ VIM\>"
+"syntax match helpVim "\<автор\%[ы:] .*$"
+"старый заголовок
+syntax match helpVim "\<РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ .*"
+" Подсветка примечаний в тексте, начала примеров и т.п.
+syntax keyword helpNote Примечание. Совет. Пример. Примеры:
+syntax keyword helpWarning Внимание!
+" в старой версии документации
+syntax keyword helpNote Замечание:
+" в старой версии документации
+syntax keyword helpWarning ВНИМАНИЕ! Предупреждение:
+" Подсветка Ex-команд в документации Vim
+syntax match helpCommand "\":[A-Za-z!]\+\""hs=s+1,he=e-1
+" Подсветка специальных обозначений
+syntax match helpSpecial "{[-а-яёА-ЯЁ0-9'":%#=[\]<>.,]\+}"
+syntax match helpSpecial "{[-а-яёА-ЯЁ0-9'"*+/:%#=[\]<>.,]\+}"
+syntax match helpSpecial "\s\[[-а-яё^А-ЯЁ0-9_]\{2,}]"ms=s+1
+syntax match helpSpecial "<[-а-яёА-ЯЁ0-9_]\+>"
+syntax match helpSpecial "\[диапазон]"
+syntax match helpSpecial "\[счётчик]"
+syntax match helpSpecial "\[число]"
+syntax match helpSpecial "\[+число]"
+syntax match helpSpecial "\[-число]"
+syntax match helpSpecial "\[кол-во]"
+syntax match helpSpecial "\[строка]"
+syntax match helpSpecial "\[смещение]"
+syntax match helpSpecial "\[параметр]"
+syntax match helpSpecial "\[параметры]"
+syntax match helpSpecial "CTRL-{символ}"
+syntax region helpNotVi start="{Доступно только" start="{В редкторе Vim" start="{В редакторе Vi" end="}" contains=helpLeadBlank,helpHyperTextJump
+" Подсветка примечаний переводчика
+syntax region helpTrnsNote start="\[Прим. перевод." end="]" contains=helpComment
+" Определение группы подсветки Ex-команд в документации Vim
+"hi def link helpCommand vimCommand
+" Определение группы подсветки примечаний переводчика
+hi def link helpTrnsNote Comment
+" hi def link helpTrnsNote Comment
+"
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/hercules.vim b/runtime/syntax/hercules.vim
new file mode 100644
index 0000000..d305707
--- /dev/null
+++ b/runtime/syntax/hercules.vim
@@ -0,0 +1,119 @@
+" Vim syntax file
+" Language: Hercules
+" Maintainer: Dana Edwards <Dana_Edwards@avanticorp.com>
+" Extensions: *.vc,*.ev,*.rs
+" Last change: Nov. 9, 2001
+" Comment: Hercules physical IC design verification software ensures
+" that an IC's physical design matches its logical design and
+" satisfies manufacturing rules.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Ignore case
+syn case ignore
+
+" Hercules runset sections
+syn keyword herculesType header assign_property alias assign
+syn keyword herculesType options preprocess_options
+syn keyword herculesType explode_options technology_options
+syn keyword herculesType drc_options database_options
+syn keyword herculesType text_options lpe_options evaccess_options
+syn keyword herculesType check_point compare_group environment
+syn keyword herculesType grid_check include layer_stats load_group
+syn keyword herculesType restart run_only self_intersect set snap
+syn keyword herculesType system variable waiver
+
+" Hercules commands
+syn keyword herculesStatement attach_property boolean cell_extent
+syn keyword herculesStatement common_hierarchy connection_points
+syn keyword herculesStatement copy data_filter alternate delete
+syn keyword herculesStatement explode explode_all fill_pattern find_net
+syn keyword herculesStatement flatten
+syn keyword herculesStatement level negate polygon_features push
+syn keyword herculesStatement rectangles relocate remove_overlap reverse select
+syn keyword herculesStatement select_cell select_contains select_edge select_net size
+syn keyword herculesStatement text_polygon text_property vertex area cut
+syn keyword herculesStatement density enclose external inside_edge
+syn keyword herculesStatement internal notch vectorize center_to_center
+syn keyword herculesStatement length mask_align moscheck rescheck
+syn keyword herculesStatement analysis buildsub init_lpe_db capacitor
+syn keyword herculesStatement device gendev nmos pmos diode npn pnp
+syn keyword herculesStatement resistor set_param save_property
+syn keyword herculesStatement connect disconnect text text_boolean
+syn keyword herculesStatement replace_text create_ports label graphics
+syn keyword herculesStatement save_netlist_database lpe_stats netlist
+syn keyword herculesStatement spice graphics_property graphics_netlist
+syn keyword herculesStatement write_milkyway multi_rule_enclose
+syn keyword herculesStatement if error_property equate compare
+syn keyword herculesStatement antenna_fix c_thru dev_connect_check
+syn keyword herculesStatement dev_net_count device_count net_filter
+syn keyword herculesStatement net_path_check ratio process_text_opens
+
+" Hercules keywords
+syn keyword herculesStatement black_box_file block compare_dir equivalence
+syn keyword herculesStatement format gdsin_dir group_dir group_dir_usage
+syn keyword herculesStatement inlib layout_path outlib output_format
+syn keyword herculesStatement output_layout_path schematic schematic_format
+syn keyword herculesStatement scheme_file output_block else
+syn keyword herculesStatement and or not xor andoverlap inside outside by to
+syn keyword herculesStatement with connected connected_all texted_with texted
+syn keyword herculesStatement by_property cutting edge_touch enclosing inside
+syn keyword herculesStatement inside_hole interact touching vertex
+
+" Hercules comments
+syn region herculesComment start="/\*" skip="/\*" end="\*/" contains=herculesTodo
+syn match herculesComment "//.*" contains=herculesTodo
+
+" Preprocessor directives
+syn match herculesPreProc "^#.*"
+syn match herculesPreProc "^@.*"
+syn match herculesPreProc "macros"
+
+" Hercules COMMENT option
+syn match herculesCmdCmnt "comment.*=.*"
+
+" Spacings, Resolutions, Ranges, Ratios, etc.
+syn match herculesNumber "-\=\<[0-9]\+L\=\>\|0[xX][0-9]\+\>"
+
+" Parenthesis sanity checker
+syn region herculesZone matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" transparent contains=ALLBUT,herculesError,herculesBraceError,herculesCurlyError
+syn region herculesZone matchgroup=Delimiter start="{" matchgroup=Delimiter end="}" transparent contains=ALLBUT,herculesError,herculesBraceError,herculesParenError
+syn region herculesZone matchgroup=Delimiter start="\[" matchgroup=Delimiter end="]" transparent contains=ALLBUT,herculesError,herculesCurlyError,herculesParenError
+syn match herculesError "[)\]}]"
+syn match herculesBraceError "[)}]" contained
+syn match herculesCurlyError "[)\]]" contained
+syn match herculesParenError "[\]}]" contained
+
+" Hercules output format
+"syn match herculesOutput "([0-9].*)"
+"syn match herculesOutput "([0-9].*\;.*)"
+syn match herculesOutput "perm\s*=.*(.*)"
+syn match herculesOutput "temp\s*=\s*"
+syn match herculesOutput "error\s*=\s*(.*)"
+
+"Modify the following as needed. The trade-off is performance versus functionality.
+syn sync lines=100
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/hex.vim b/runtime/syntax/hex.vim
new file mode 100644
index 0000000..35edf08
--- /dev/null
+++ b/runtime/syntax/hex.vim
@@ -0,0 +1,89 @@
+" Vim syntax file
+" Language: Intel HEX
+" Maintainer: Markus Heidelberg <markus.heidelberg@web.de>
+" Previous version: Sams Ricahrd <sams@ping.at>
+" Last Change: 2015 Feb 24
+
+" Each record (line) is built as follows:
+"
+" field digits states
+"
+" +----------+
+" | start | 1 (':') hexRecStart
+" +----------+
+" | count | 2 hexDataByteCount
+" +----------+
+" | address | 4 hexNoAddress, hexDataAddress, (hexAddressFieldUnknown)
+" +----------+
+" | type | 2 hexRecType, (hexRecTypeUnknown)
+" +----------+
+" | data | 0..510 hexDataOdd, hexDataEven, hexExtendedAddress, hexStartAddress, (hexDataFieldUnknown, hexDataUnexpected)
+" +----------+
+" | checksum | 2 hexChecksum
+" +----------+
+"
+" States in parentheses in the upper format description indicate that they
+" should not appear in a valid file.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match hexRecStart "^:"
+
+syn match hexDataByteCount "^:[0-9a-fA-F]\{2}" contains=hexRecStart nextgroup=hexAddress
+
+syn match hexAddress "[0-9a-fA-F]\{4}" transparent contained nextgroup=hexRecTypeUnknown,hexRecType
+" The address field groups include the record type field in the last 2
+" characters, the proper match for highlighting follows below.
+syn match hexAddressFieldUnknown "^:[0-9a-fA-F]\{8}" contains=hexDataByteCount nextgroup=hexDataFieldUnknown,hexChecksum
+syn match hexDataAddress "^:[0-9a-fA-F]\{6}00" contains=hexDataByteCount nextgroup=hexDataOdd,hexChecksum
+syn match hexNoAddress "^:[0-9a-fA-F]\{6}01" contains=hexDataByteCount nextgroup=hexDataUnexpected,hexChecksum
+syn match hexNoAddress "^:[0-9a-fA-F]\{6}0[24]" contains=hexDataByteCount nextgroup=hexExtendedAddress
+syn match hexNoAddress "^:[0-9a-fA-F]\{6}0[35]" contains=hexDataByteCount nextgroup=hexStartAddress
+
+syn match hexRecTypeUnknown "[0-9a-fA-F]\{2}" contained
+syn match hexRecType "0[0-5]" contained
+
+syn match hexDataFieldUnknown "[0-9a-fA-F]\{2}" contained nextgroup=hexDataFieldUnknown,hexChecksum
+" alternating highlight per byte for easier reading
+syn match hexDataOdd "[0-9a-fA-F]\{2}" contained nextgroup=hexDataEven,hexChecksum
+syn match hexDataEven "[0-9a-fA-F]\{2}" contained nextgroup=hexDataOdd,hexChecksum
+" data bytes which should not exist
+syn match hexDataUnexpected "[0-9a-fA-F]\{2}" contained nextgroup=hexDataUnexpected,hexChecksum
+" Data digit pair regex usage also results in only highlighting the checksum
+" if the number of data characters is even.
+
+" special data fields
+syn match hexExtendedAddress "[0-9a-fA-F]\{4}" contained nextgroup=hexDataUnexpected,hexChecksum
+syn match hexStartAddress "[0-9a-fA-F]\{8}" contained nextgroup=hexDataUnexpected,hexChecksum
+
+syn match hexChecksum "[0-9a-fA-F]\{2}$" contained
+
+" Folding Data Records below an Extended Segment/Linear Address Record
+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.
+" Only when an item doesn't have highlighting yet
+
+" 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
+
+
+let b:current_syntax = "hex"
+
+" vim: ts=8
diff --git a/runtime/syntax/hgcommit.vim b/runtime/syntax/hgcommit.vim
new file mode 100644
index 0000000..e9f31be
--- /dev/null
+++ b/runtime/syntax/hgcommit.vim
@@ -0,0 +1,30 @@
+" Vim syntax file
+" Language: hg/sl (Mercurial / Sapling) commit file
+" Maintainer: Ken Takata <kentkt at csc dot jp>
+" Max Coplan <mchcopl@gmail.com>
+" Last Change: 2022-12-08
+" License: VIM License
+" URL: https://github.com/k-takata/hg-vim
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match hgcommitComment "^\%(SL\|HG\): .*$" contains=@NoSpell
+syn match hgcommitUser "^\%(SL\|HG\): user: \zs.*$" contains=@NoSpell contained containedin=hgcommitComment
+syn match hgcommitBranch "^\%(SL\|HG\): branch \zs.*$" contains=@NoSpell contained containedin=hgcommitComment
+syn match hgcommitAdded "^\%(SL\|HG\): \zsadded .*$" contains=@NoSpell contained containedin=hgcommitComment
+syn match hgcommitChanged "^\%(SL\|HG\): \zschanged .*$" contains=@NoSpell contained containedin=hgcommitComment
+syn match hgcommitRemoved "^\%(SL\|HG\): \zsremoved .*$" contains=@NoSpell contained containedin=hgcommitComment
+
+syn region hgcommitDiff start=/\%(^\(SL\|HG\): diff --\%(git\|cc\|combined\) \)\@=/ end=/^\%(diff --\|$\|@@\@!\|[^[:alnum:]\ +-]\S\@!\)\@=/ fold contains=@hgcommitDiff
+syn include @hgcommitDiff syntax/shared/hgcommitDiff.vim
+
+hi def link hgcommitComment Comment
+hi def link hgcommitUser String
+hi def link hgcommitBranch String
+hi def link hgcommitAdded Identifier
+hi def link hgcommitChanged Special
+hi def link hgcommitRemoved Constant
+
+let b:current_syntax = "hgcommit"
diff --git a/runtime/syntax/hitest.vim b/runtime/syntax/hitest.vim
new file mode 100644
index 0000000..9d60cec
--- /dev/null
+++ b/runtime/syntax/hitest.vim
@@ -0,0 +1,149 @@
+" Vim syntax file
+" Language: none; used to see highlighting
+" Maintainer: Ronald Schild <rs@scutum.de>
+" Last Change: 2019 Jun 06
+" Version: 5.4n.1
+" Additional Changes By: Lifepillar, Bram
+
+" To see your current highlight settings, do
+" :so $VIMRUNTIME/syntax/hitest.vim
+
+" save global options and registers
+let s:hidden = &hidden
+let s:lazyredraw = &lazyredraw
+let s:more = &more
+let s:report = &report
+let s:whichwrap = &whichwrap
+let s:shortmess = &shortmess
+let s:wrapscan = &wrapscan
+let s:register_a = @a
+let s:register_se = @/
+
+" set global options
+set hidden lazyredraw nomore report=99999 shortmess=aoOstTW wrapscan
+set whichwrap&
+
+" print current highlight settings into register a
+redir @a
+silent highlight
+redir END
+
+" Open a new window if the current one isn't empty
+if line("$") != 1 || getline(1) != ""
+ new
+endif
+
+" edit temporary file
+edit Highlight\ test
+
+" set local options
+setlocal autoindent noexpandtab formatoptions=t shiftwidth=18 noswapfile tabstop=18
+let &textwidth=&columns
+
+" insert highlight settings
+% delete
+put a
+
+" remove cleared groups
+silent! g/ cleared$/d
+
+" remove the colored xxx items
+g/xxx /s///e
+
+" remove color settings (not needed here)
+global! /links to/ substitute /\s.*$//e
+
+" Move split 'links to' lines to the same line
+% substitute /^\(\w\+\)\n\s*\(links to.*\)/\1\t\2/e
+
+" move linked groups to the end of file
+global /links to/ move $
+
+" move linked group names to the matching preferred groups
+" TODO: this fails if the group linked to isn't defined
+% substitute /^\(\w\+\)\s*\(links to\)\s*\(\w\+\)$/\3\t\2 \1/e
+silent! global /links to/ normal mz3ElD0#$p'zdd
+
+" delete empty lines
+global /^ *$/ delete
+
+" precede syntax command
+% substitute /^[^ ]*/syn keyword &\t&/
+
+" execute syntax commands
+syntax clear
+% yank a
+@a
+
+" remove syntax commands again
+% substitute /^syn keyword //
+
+" pretty formatting
+global /^/ exe "normal Wi\<CR>\t\eAA\ex"
+global /^\S/ join
+
+" find out first syntax highlighting
+let b:various = &highlight.',:Normal,:Cursor,:,'
+let b:i = 1
+while b:various =~ ':'.substitute(getline(b:i), '\s.*$', ',', '')
+ let b:i = b:i + 1
+ if b:i > line("$") | break | endif
+endwhile
+
+" insert headlines
+call append(0, "Highlighting groups for various occasions")
+call append(1, "-----------------------------------------")
+
+if b:i < line("$")-1
+ let b:synhead = "Syntax highlighting groups"
+ if exists("hitest_filetypes")
+ redir @a
+ let
+ redir END
+ let @a = substitute(@a, 'did_\(\w\+\)_syn\w*_inits\s*#1', ', \1', 'g')
+ let @a = substitute(@a, "\n\\w[^\n]*", '', 'g')
+ let @a = substitute(@a, "\n", '', 'g')
+ let @a = substitute(@a, '^,', '', 'g')
+ if @a != ""
+ let b:synhead = b:synhead." - filetype"
+ if @a =~ ','
+ let b:synhead = b:synhead."s"
+ endif
+ let b:synhead = b:synhead.":".@a
+ endif
+ endif
+ call append(b:i+1, "")
+ call append(b:i+2, b:synhead)
+ call append(b:i+3, substitute(b:synhead, '.', '-', 'g'))
+endif
+
+" remove 'hls' highlighting
+nohlsearch
+normal 0
+
+" we don't want to save this temporary file
+set nomodified
+
+" the following trick avoids the "Press RETURN ..." prompt
+0 append
+.
+
+" restore global options and registers
+let &hidden = s:hidden
+let &lazyredraw = s:lazyredraw
+let &more = s:more
+let &report = s:report
+let &shortmess = s:shortmess
+let &whichwrap = s:whichwrap
+let &wrapscan = s:wrapscan
+let @a = s:register_a
+
+" restore last search pattern
+call histdel("search", -1)
+let @/ = s:register_se
+
+" remove variables
+unlet s:hidden s:lazyredraw s:more s:report s:shortmess
+unlet s:whichwrap s:wrapscan s:register_a s:register_se
+
+" vim: ts=8
diff --git a/runtime/syntax/hlsplaylist.vim b/runtime/syntax/hlsplaylist.vim
new file mode 100644
index 0000000..245eee2
--- /dev/null
+++ b/runtime/syntax/hlsplaylist.vim
@@ -0,0 +1,120 @@
+" Vim syntax file
+" Language: HLS Playlist
+" Maintainer: Benoît Ryder <benoit@ryder.fr>
+" Latest Revision: 2022-09-23
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Comment line
+syn match hlsplaylistComment "^#\(EXT\)\@!.*$"
+" Segment URL
+syn match hlsplaylistUrl "^[^#].*$"
+
+" Unknown tags, assume an attribute list or nothing
+syn match hlsplaylistTagUnknown "^#EXT[^:]*$"
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagUnknown start="^#EXT[^:]*\ze:" end="$" keepend contains=hlsplaylistAttributeList
+
+" Basic Tags
+syn match hlsplaylistTagHeader "^#EXTM3U$"
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagHeader start="^#EXT-X-VERSION\ze:" end="$" keepend contains=hlsplaylistValueInt
+
+" Media or Multivariant Playlist Tags
+syn match hlsplaylistTagHeader "^#EXT-X-INDEPENDENT-SEGMENTS$"
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagDelimiter start="^#EXT-X-START\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-DEFINE\ze:" end="$" keepend contains=hlsplaylistAttributeList
+
+" Media Playlist Tags
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagHeader start="^#EXT-X-TARGETDURATION\ze:" end="$" keepend contains=hlsplaylistValueFloat
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagHeader start="^#EXT-X-MEDIA-SEQUENCE\ze:" end="$" keepend contains=hlsplaylistValueInt
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagHeader start="^#EXT-X-DISCONTINUITY-SEQUENCE\ze:" end="$" keepend contains=hlsplaylistValueInt
+syn match hlsplaylistTagDelimiter "^#EXT-X-ENDLIST$"
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagHeader start="^#EXT-X-PLAYLIST-TYPE\ze:" end="$" keepend contains=hlsplaylistAttributeEnum
+syn match hlsplaylistTagStandard "^#EXT-X-I-FRAME-ONLY$"
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagHeader start="^#EXT-X-PART-INF\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagHeader start="^#EXT-X-SERVER-CONTROL\ze:" end="$" keepend contains=hlsplaylistAttributeList
+
+" Media Segment Tags
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStatement start="^#EXTINF\ze:" end="$" keepend contains=hlsplaylistValueFloat,hlsplaylistExtInfDesc
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-BYTERANGE\ze:" end="$" keepend contains=hlsplaylistValueInt
+syn match hlsplaylistTagDelimiter "^#EXT-X-DISCONTINUITY$"
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-KEY\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-MAP\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-PROGRAM-DATE-TIME\ze:" end="$" keepend contains=hlsplaylistValueDateTime
+syn match hlsplaylistTagDelimiter "^#EXT-X-GAP$"
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-BITRATE\ze:" end="$" keepend contains=hlsplaylistValueFloat
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStatement start="^#EXT-X-PART\ze:" end="$" keepend contains=hlsplaylistAttributeList
+
+" Media Metadata Tags
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-DATERANGE\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-SKIP\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStatement start="^#EXT-X-PRELOAD-HINT\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStatement start="^#EXT-X-RENDITION-REPORT\ze:" end="$" keepend contains=hlsplaylistAttributeList
+
+" Multivariant Playlist Tags
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-MEDIA\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStatement start="^#EXT-X-STREAM-INF\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStatement start="^#EXT-X-I-FRAME-STREAM-INF\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-SESSION-DATA\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-SESSION-KEY\ze:" end="$" keepend contains=hlsplaylistAttributeList
+syn region hlsplaylistTagLine matchgroup=hlsplaylistTagStandard start="^#EXT-X-CONTENT-STEERING\ze:" end="$" keepend contains=hlsplaylistAttributeList
+
+" Attributes
+syn region hlsplaylistAttributeList start=":" end="$" keepend contained
+ \ contains=hlsplaylistAttributeName,hlsplaylistAttributeInt,hlsplaylistAttributeHex,hlsplaylistAttributeFloat,hlsplaylistAttributeString,hlsplaylistAttributeEnum,hlsplaylistAttributeResolution,hlsplaylistAttributeUri
+" Common attributes
+syn match hlsplaylistAttributeName "[A-Za-z-]\+\ze=" contained
+syn match hlsplaylistAttributeEnum "=\zs[A-Za-z][A-Za-z0-9-_]*" contained
+syn match hlsplaylistAttributeString +=\zs"[^"]*"+ contained
+syn match hlsplaylistAttributeInt "=\zs\d\+" contained
+syn match hlsplaylistAttributeFloat "=\zs-\?\d*\.\d*" contained
+syn match hlsplaylistAttributeHex "=\zs0[xX]\d*" contained
+syn match hlsplaylistAttributeResolution "=\zs\d\+x\d\+" contained
+" Allow different highligting for URI attributes
+syn region hlsplaylistAttributeUri matchgroup=hlsplaylistAttributeName start="\zsURI\ze" end="\(,\|$\)" contained contains=hlsplaylistUriQuotes
+syn region hlsplaylistUriQuotes matchgroup=hlsplaylistAttributeString start=+"+ end=+"+ keepend contained contains=hlsplaylistUriValue
+syn match hlsplaylistUriValue /[^" ]\+/ contained
+" Individual values
+syn match hlsplaylistValueInt "[0-9]\+" contained
+syn match hlsplaylistValueFloat "\(\d\+\|\d*\.\d*\)" contained
+syn match hlsplaylistExtInfDesc ",\zs.*$" contained
+syn match hlsplaylistValueDateTime "\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\(\.\d*\)\?\(Z\|\d\d:\?\d\d\)$" contained
+
+
+" Define default highlighting
+
+hi def link hlsplaylistComment Comment
+hi def link hlsplaylistUrl NONE
+
+hi def link hlsplaylistTagHeader Special
+hi def link hlsplaylistTagStandard Define
+hi def link hlsplaylistTagDelimiter Delimiter
+hi def link hlsplaylistTagStatement Statement
+hi def link hlsplaylistTagUnknown Special
+
+hi def link hlsplaylistUriQuotes String
+hi def link hlsplaylistUriValue Underlined
+hi def link hlsplaylistAttributeQuotes String
+hi def link hlsplaylistAttributeName Identifier
+hi def link hlsplaylistAttributeInt Number
+hi def link hlsplaylistAttributeHex Number
+hi def link hlsplaylistAttributeFloat Float
+hi def link hlsplaylistAttributeString String
+hi def link hlsplaylistAttributeEnum Constant
+hi def link hlsplaylistAttributeResolution Constant
+hi def link hlsplaylistValueInt Number
+hi def link hlsplaylistValueFloat Float
+hi def link hlsplaylistExtInfDesc String
+hi def link hlsplaylistValueDateTime Constant
+
+
+let b:current_syntax = "hlsplaylist"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: sts=2 sw=2 et
diff --git a/runtime/syntax/hog.vim b/runtime/syntax/hog.vim
new file mode 100644
index 0000000..24aa203
--- /dev/null
+++ b/runtime/syntax/hog.vim
@@ -0,0 +1,208 @@
+" Vim syntax file
+" Language: hog (Snort.conf + .rules)
+" Maintainer: Victor Roemer, <vroemer@badsec.org>.
+" Last Change: 2019 Sep 22
+" 2012 Oct 24 -> Originalish release
+" 2019 Sep 22 -> included PR 3069
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword-=:
+setlocal iskeyword+=-
+syn case ignore
+
+" Hog ruletype crap
+syn keyword HogRuleType ruletype nextgroup=HogRuleTypeName skipwhite
+syn match HogRuleTypeName "[[:alnum:]_]\+" contained nextgroup=HogRuleTypeBody skipwhite
+syn region HogRuleTypeBody start="{" end="}" contained contains=HogRuleTypeType,HogOutput fold
+syn keyword HogRuleTypeType type contained
+
+" Hog Configurables
+syn keyword HogPreproc preprocessor nextgroup=HogConfigName skipwhite
+syn keyword HogConfig config nextgroup=HogConfigName skipwhite
+syn keyword HogOutput output nextgroup=HogConfigName skipwhite
+syn match HogConfigName "[[:alnum:]_-]\+" contained nextgroup=HogConfigOpts skipwhite
+syn region HogConfigOpts start=":" skip="\\.\{-}$\|^\s*#.\{-}$\|^\s*$" end="$" fold keepend contained contains=HogSpecial,HogNumber,HogIPAddr,HogVar,HogComment
+
+" Event filter's and threshold's
+syn region HogEvFilter start="event_filter\|threshold" skip="\\.\{-}$\|^\s*#.\{-}$\|^\s*$" end="$" fold transparent keepend contains=HogEvFilterKeyword,HogEvFilterOptions,HogComment
+syn keyword HogEvFilterKeyword skipwhite event_filter threshold
+syn keyword HogEvFilterOptions skipwhite type nextgroup=HogEvFilterTypes
+syn keyword HogEvFilterTypes skipwhite limit threshold both contained
+syn keyword HogEvFilterOptions skipwhite track nextgroup=HogEvFilterTrack
+syn keyword HogEvFilterTrack skipwhite by_src by_dst contained
+syn keyword HogEvFilterOptions skipwhite gen_id sig_id count seconds nextgroup=HogNumber
+
+" Suppressions
+syn region HogEvFilter start="suppress" skip="\\.\{-}$\|^\s*#.\{-}$\|^\s*$" end="$" fold transparent keepend contains=HogSuppressKeyword,HogComment
+syn keyword HogSuppressKeyword skipwhite suppress
+syn keyword HogSuppressOptions skipwhite gen_id sig_id nextgroup=HogNumber
+syn keyword HogSuppressOptions skipwhite track nextgroup=HogEvFilterTrack
+syn keyword HogSuppressOptions skipwhite ip nextgroup=HogIPAddr
+
+" Attribute table
+syn keyword HogAttribute attribute_table nextgroup=HogAttributeFile
+syn match HogAttributeFile contained ".*$" contains=HogVar,HogAttributeType,HogComment
+syn keyword HogAttributeType filename
+
+" Hog includes
+syn keyword HogInclude include nextgroup=HogIncludeFile skipwhite
+syn match HogIncludeFile ".*$" contained contains=HogVar,HogComment
+
+" Hog dynamic libraries
+syn keyword HogDylib dynamicpreprocessor dynamicengine dynamicdetection nextgroup=HogDylibFile skipwhite
+syn match HogDylibFile "\s.*$" contained contains=HogVar,HogDylibType,HogComment
+syn keyword HogDylibType directory file contained
+
+" Variable dereferenced with '$'
+syn match HogVar "\$[[:alnum:]_]\+"
+
+", Variables declared with 'var'
+syn keyword HogVarType var nextgroup=HogVarSet skipwhite
+syn match HogVarSet "[[:alnum:]_]\+" display contained nextgroup=HogVarValue skipwhite
+syn match HogVarValue ".*$" contained contains=HogString,HogNumber,HogVar,HogComment
+
+" Variables declared with 'ipvar'
+syn keyword HogIPVarType ipvar nextgroup=HogIPVarSet skipwhite
+syn match HogIPVarSet "[[:alnum:]_]\+" display contained nextgroup=HogIPVarList,HogSpecial skipwhite
+syn region HogIPVarList start="\[" end="]" contains=HogIPVarList,HogIPAddr,HogVar,HogOpNot
+
+" Variables declared with 'portvar'
+syn keyword HogPortVarType portvar nextgroup=HogPortVarSet skipwhite
+syn match HogPortVarSet "[[:alnum:]_]\+" display contained nextgroup=HogPortVarList,HogPort,HogOpRange,HogOpNot,HogSpecial skipwhite
+syn region HogPortVarList start="\[" end="]" contains=HogPortVarList,HogVar,HogOpNot,HogPort,HogOpRange,HogOpNot
+syn match HogPort "\<\%(\d\+\|any\)\>" display contains=HogOpRange nextgroup=HogOpRange
+
+" Generic stuff
+syn match HogIPAddr contained "\<\%(\d\{1,3}\(\.\d\{1,3}\)\{3}\|any\)\>" nextgroup=HogIPCidr
+syn match HogIPAddr contained "\<\d\{1,3}\(\.\d\{1,3}\)\{3}\>" nextgroup=HogIPCidr
+syn match HogIPCidr contained "\/\([0-2][0-9]\=\|3[0-2]\=\)"
+syn region HogHexEsc contained start='|' end='|' oneline
+syn region HogString contained start='"' end='"' extend oneline contains=HogHexEsc
+syn match HogNumber contained display "\<\d\+\>"
+syn match HogNumber contained display "\<\d\+\>"
+syn match HogNumber contained display "0x\x\+\>"
+syn keyword HogSpecial contained true false yes no default all any
+syn keyword HogSpecialAny contained any
+syn match HogOpNot "!" contained
+syn match HogOpRange ":" contained
+
+" Rules
+syn keyword HogRuleAction activate alert drop block dynamic log pass reject sdrop sblock skipwhite nextgroup=HogRuleProto,HogRuleBlock
+syn keyword HogRuleProto ip tcp tcp-pkt tcp-stream udp icmp http ftp tls smb dns dcerpc ssh smtp imap msn modbus dnp3 enip nfs ikev2 ntp skipwhite contained nextgroup=HogRuleSrcIP
+syn match HogRuleSrcIP "\S\+" transparent skipwhite contained contains=HogIPVarList,HogIPAddr,HogVar,HogOpNot nextgroup=HogRuleSrcPort
+syn match HogRuleSrcPort "\S\+" transparent skipwhite contained contains=HogPortVarList,HogVar,HogPort,HogOpRange,HogOpNot nextgroup=HogRuleDir
+syn match HogRuleDir "->\|<>" skipwhite contained nextgroup=HogRuleDstIP
+syn match HogRuleDstIP "\S\+" transparent skipwhite contained contains=HogIPVarList,HogIPAddr,HogVar,HogOpNot nextgroup=HogRuleDstPort
+syn match HogRuleDstPort "\S\+" transparent skipwhite contained contains=HogPortVarList,HogVar,HogPort,HogOpRange,HogOpNot nextgroup=HogRuleBlock
+syn region HogRuleBlock start="(" end=")" transparent skipwhite contained contains=HogRuleOption,HogComment fold
+",HogString,HogComment,HogVar,HogOptNot
+"syn region HogRuleOption start="\<gid\|sid\|rev\|depth\|offset\|distance\|within\>" end="\ze;" skipwhite contained contains=HogNumber
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP msg gid sid rev classtype priority metadata target content nocase rawbytes
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP depth startswith offset distance within http_client_body http_cookie http_raw_cookie http_header
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP http_raw_header http_request_line http_method http_uri http_raw_uri http_protocol http_response_line http_stat_code http_stat_msg
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP http_user_agent http_accept http_accept_enc http_accept_lang http_connection http_content_type http_content_len
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP http_referer http_start http_header_names http_server_body http_host http_raw_host
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP filename fileext filemagic filestore filemd5 filesha1 filesha256 filesize
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP dns_query tls_cert_subject tls_cert_issuer tls_cert_serial tls_cert_fingerprint
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP tls_sni tls_cert_notbefore tls_cert_notafter tls_cert_expired tls_cert_valid
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP tls.version tls.subject tls.issuerdn tls.fingerprint tls.store ja3_hash ja3_string
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP modbus dnp3_func dnp3_ind dnp3_obj dnp3_data enip_command cip_service
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP app-layer-protocol app-layer-event xbits iprep lua luajit
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP fast_pattern prefilter uricontent urilen isdataat pcre pkt_data file_data base64_decode base64_data
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP byte_test byte_jump byte_extract ftpdata_command ftpbounce asn1 cvs dce_iface dce_opnum dce_stub_data
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP sip_method sip_stat_code sip_header sip_body gtp_type gtp_info gtp_version ssl_version
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP ssl_state fragoffset ttl tos id ipopts geoip fragbits dsize flags flow flowbits flowint seq ack window
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP itype icode icmp_id icmp_seq rpc ip_proto sameip stream_reassemble stream_size
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP logto session resp react tag activates activated_by count replace detection_filter
+syn keyword HogRuleOption skipwhite contained nextgroup=HogRuleSROP threshold reference sd_pattern file_type file_group
+
+syn region HogRuleSROP start=':' end=";" transparent keepend contained contains=HogRuleChars,HogString,HogNumber
+syn match HogRuleChars "\%(\k\|\.\|?\|=\|/\|%\|&\)\+" contained
+syn match HogURLChars "\%(\.\|?\|=\)\+" contained
+
+" Hog File Type Rules
+syn match HogFileType /^\s*file.*$/ transparent contains=HogFileTypeOpt,HogFileFROP
+syn keyword HogFileTypeOpt skipwhite contained nextgroup=HogRuleFROP file type ver category id rev content offset msg group
+syn region HogFileFROP start=':' end=";" transparent keepend contained contains=NotASemicoln
+syn match NotASemiColn ".*$" contained
+
+
+" Comments
+syn keyword HogTodo XXX TODO NOTE contained
+syn match HogTodo "Step\s\+#\=\d\+" contained
+syn region HogComment start="#" end="$" contains=HogTodo,@Spell
+
+syn case match
+
+if !exists("hog_minlines")
+ let hog_minlines = 100
+endif
+exec "syn sync minlines=" . hog_minlines
+
+hi link HogRuleType Statement
+hi link HogRuleTypeName Type
+hi link HogRuleTypeType Keyword
+
+hi link HogPreproc Statement
+hi link HogConfig Statement
+hi link HogOutput Statement
+hi link HogConfigName Type
+
+"hi link HogEvFilter
+hi link HogEvFilterKeyword Statement
+hi link HogSuppressKeyword Statement
+hi link HogEvFilterTypes Constant
+hi link HogEvFilterTrack Constant
+
+hi link HogAttribute Statement
+hi link HogAttributeFile String
+hi link HogAttributeType Statement
+
+hi link HogInclude Statement
+hi link HogIncludeFile String
+
+hi link HogDylib Statement
+hi link HogDylibType Statement
+hi link HogDylibFile String
+
+" Variables
+" var
+hi link HogVar Identifier
+hi link HogVarType Keyword
+hi link HogVarSet Identifier
+hi link HogVarValue String
+" ipvar
+hi link HogIPVarType Keyword
+hi link HogIPVarSet Identifier
+" portvar
+hi link HogPortVarType Keyword
+hi link HogPortVarSet Identifier
+hi link HogPort Constant
+
+hi link HogTodo Todo
+hi link HogComment Comment
+hi link HogString String
+hi link HogHexEsc PreProc
+hi link HogNumber Number
+hi link HogSpecial Constant
+hi link HogSpecialAny Constant
+hi link HogIPAddr Constant
+hi link HogIPCidr Constant
+hi link HogOpNot Operator
+hi link HogOpRange Operator
+
+hi link HogRuleAction Statement
+hi link HogRuleProto Identifier
+hi link HogRuleDir Operator
+hi link HogRuleOption Keyword
+hi link HogRuleChars String
+
+hi link HogFileType HogRuleAction
+hi link HogFileTypeOpt HogRuleOption
+hi link NotASemiColn HogRuleChars
+
+let b:current_syntax = "hog"
diff --git a/runtime/syntax/hollywood.vim b/runtime/syntax/hollywood.vim
new file mode 100644
index 0000000..fcd03a6
--- /dev/null
+++ b/runtime/syntax/hollywood.vim
@@ -0,0 +1,180 @@
+" Vim syntax file
+" Language: Hollywood 9.1
+" Maintainer: Ola Sder <rolfkopman@gmail.com>
+" First Author: Tom Crecelius <holly@net-eclipse.net>
+" Last Change: 2022 Nov 09
+" Highlighting Issues:
+" Depending on your colour schema, Strings or Comments might be highlighted in
+" a way, you don't like. If so, try one of the following settings after
+" opening a hollywood script:
+"
+" :hi link hwString MoreMsg
+" :hi link hwString NonText
+" :hi link hwString String
+"
+" and for comments:
+"
+" :hi link hwComment MoreMsg
+" :hi link hwComment NonText
+" :hi link hwComment Comment
+"
+" Remember the setting you like and change the corresponding definition at
+" the bottom of this file.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if !exists("hw_version")
+ let hw_version = 9
+ let hw_subversion = 0
+elseif !exists("hw_subversion")
+ let hw_subversion = 0
+endif
+
+syn case match
+
+" syncing method
+syn sync minlines=100
+
+" catch errors caused by wrong parenthesis and wrong curly brackets or
+" keywords placed outside their respective blocks
+syn region hwParen transparent start='(' end=')' contains=ALLBUT,hwParenError,hwTodo,hwSpecial,hwIfEndIf,hwElseIf,hwElse,hwBlock,hwLoopBlock,hwIn,hwStatement,hwStep,hwFallThrough,hwLineStatement
+syn region hwTableBlock transparent matchgroup=hwTable start="{" end="}" contains=ALLBUT,hwBraceError,hwTodo,hwSpecial,hwIfEndIf,hwElseIf,hwElse,hwBlock,hwLoopBlock,hwIn,hwStatement,hwStep,hwFallThrough,hwLineStatement
+
+syn match hwParenError ")"
+syn match hwBraceError "}"
+syn match hwError "\<\%(If\|End\|Else\|ElseIf\|Then\|Until\|In\|EndIf\|EndSwitch\|FallThrough\|Case\|Default\|Wend\|Until\|Forever\)\>"
+
+" Function ... End
+syn region hwFunctionBlock transparent matchgroup=hwFunction start="\<Function\>" end="\<EndFunction\>" contains=ALLBUT,hwTodo,hwSpecial,hwElseIf,hwElse,hwIn,hwStep,hwFallThrough,hwLineStatement
+
+" If .. Then
+syn region hwIfThen transparent matchgroup=hwCond start="\<If\>" end="\<Then\>\{-}"me=e-4 skipwhite skipempty
+" Then ... Else
+syn region hwThenElse transparent matchgroup=hwCond start="\<Then\>" end="$" end="\<Else\>" contains=ALLBUT,hwTodo,hwSpecial,hwIn,hwStep,hwLineStatement,hwIfEndIf,hwElseEndif,hwIfThen,hwThenElse skipwhite skipempty
+
+" If .. EndIf
+syn region hwIfEndIf transparent matchgroup=hwCond start="\<If\>\(\(.\{-}Then.\{-}\)\@!\)" end="\<EndIf\>" contains=ALLBUT,hwTodo,hwSpecial,hwIn,hwStep,hwLineStatement skipwhite skipempty
+" Else ... EndIf
+syn region hwElseEndIf contained transparent matchgroup=hwCond start="\<Else\>" end="\<EndIf\>"me=e-5 contains=ALLBUT,hwTodo,hwSpecial,hwElseIf,hwElseEndIf,hwIn,hwStep,hwFallThrough,hwLineStatement
+
+" Then
+"syn keyword hwLineStatement Then contained
+" Forever
+syn keyword hwLineStatement Forever contained
+" Do
+syn keyword hwLineStatement Do contained
+" ElseIf
+syn keyword hwElseIf ElseIf contained
+
+
+" Switch ... EndSwitch
+syn region hwSwitchEnd transparent matchgroup=hwCond start="\<Switch\>" end="\<EndSwitch\>" contains=hwCase,hwDefCase skipwhite skipempty
+
+" Case ... :
+syn region hwCase transparent matchgroup=hwCond start="\<Case\>" end="\<EndSwitch\>"me=e-9 end="\<Default\>:"me=e-8 end="\<Case\>"me=e-4 contains=ALLBUT,hwTodo,hwSpecial,hwElseIf,hwElseEndIf,hwLineStatement,hwIn,hwStep skipwhite skipempty
+" Default:
+syn region hwDefCase transparent matchgroup=hwCond start="\<Default\>" end="\<EndSwitch\>"me=e-9 contains=ALLBUT,hwTodo,hwSpecial,hwElseIf,hwElseEndIf,hwIn,hwStep,hwCase,hwDefCase,hwFallThrough,hwLineStatement skipwhite skipempty
+
+syn keyword hwFallThrough contained FallThrough
+
+" Block ... EndBlock
+syn region hwBlock transparent matchgroup=hwStatement start="\<Block\>" end="\<EndBlock\>" contains=ALLBUT,hwTodo,hwSpecial,hwElseIf,hwElse,hwIn,hwStep,hwLineStatement
+
+" Repeat ... Until/Forever
+syn region hwLoopBlock transparent matchgroup=hwRepeat start="\<Repeat\>" end="\<Forever\>" end="\<Until\>" contains=ALLBUT,hwTodo,hwSpecial,hwElseIf,hwElse,hwIn,hwStep,hwLineStatement
+
+" While ... Wend/Do
+syn region hwLoopBlock transparent matchgroup=hwRepeat start="\<While\>" end="\<Do\>" end="\<Wend\>" contains=ALLBUT,hwTodo,hwSpecial,hwElseIf,hwElse,hwIn,hwStep,hwLineStatement skipwhite skipempty
+
+" For .. To
+syn region hwForTo transparent matchgroup=hwRepeat start="\<For\>" end="\<To\>"me=e-2 skipwhite skipempty nextgroup=hwToNext
+
+" To .. Next
+syn region hwToNext transparent matchgroup=hwRepeat start="\<To\>" end="\<Next\>" contains=ALLBUT,hwTodo,hwSpecial,hwElseIf,hwElse,hwIn,hwLineStatement skipwhite skipempty
+
+syn keyword hwStep contained Step
+syn keyword hwIn contained In
+
+" other keywords
+syn keyword hwStatement Return Break Continue
+syn keyword hwStatement Goto Gosub Dim DimStr Const Local Global
+syn match hwLabel "::\I\i*::"
+syn match hwOperator "\%(&\|\*\|+\|-\|\.\||\|//\|/\|:\|<\|=\|>\|<>\|<=\|=>\|\^\|\~\|\\\|\<And\>\|\<Not\>\|\<Or\>\)"
+syn keyword hwConstant Nil
+syn keyword hwConstant True False
+" predefined preprocessing commands
+syn match hwPreProcessor "@\<\%(ANIM\|APPAUTHOR\|APPCOPYRIGHT\|APPDESCRIPTION\|APPICON\|APPIDENTIFIER\|APPTITLE\|APPVERSION\|BACKFILL\|BGPIC\|BRUSH\|CATALOG\|DIRECTORY\|DISPLAY\|ELSE\|ELSEIF\|ENDIF\|ERROR\|FILE\|FONT\|ICON\|IF\|INCLUDE\|LINKER\|MENU\|MUSIC\|OPTIONS\|PALETTE\|REQUIRE\|SAMPLE\|SCREEN\|SPRITE\|VERSION\|VIDEO\|WARNING\)\>"ms=s+1
+" predefined constants
+syn match hwConstant "#\<\%(ACTIVEWINDOW\|ADF_ANIM\|ADF_FX\|ADF_MOVEOBJECT\|ALL\|ALPHABETICAL\|ALPHACHANNEL\|ALPHANUMERICAL\|AMIGAICON_DEVICE\|AMIGAICON_DISK\|AMIGAICON_DRAWER\|AMIGAICON_GARBAGE\|AMIGAICON_HIDE\|AMIGAICON_KICKSTART\|AMIGAICON_NONE\|AMIGAICON_PROJECT\|AMIGAICON_SETPOSITION\|AMIGAICON_SETTITLE\|AMIGAICON_SHOW\|AMIGAICON_TOOL\|ANIM\|ANIMSTREAM\|ANIMTYPE_RASTER\|ANIMTYPE_VECTOR\|ANMFMT_GIF\|ANMFMT_IFF\|ANMFMT_MJPEG\|ANTIALIAS\|AQUA\|ARC\|ASYNCDRAW\|ASYNCOBJ\|ATTRACTIVE\|ATTRADAPTER\|ATTRALPHAINTENSITY\|ATTRBGPIC\|ATTRBITRATE\|ATTRBORDERBOTTOM\|ATTRBORDERLEFT\|ATTRBORDERLESS\|ATTRBORDERPEN\|ATTRBORDERRIGHT\|ATTRBORDERTOP\|ATTRBULLETPEN\|ATTRCANSEEK\|ATTRCLIPREGION\|ATTRCOUNT\|ATTRCURFRAME\|ATTRCURSORX\|ATTRCURSORY\|ATTRCURSUBSONG\|ATTRCYCLE\|ATTRDENSITY\|ATTRDEPTH\|ATTRDISPLAY\|ATTRDITHERMODE\|ATTRDOUBLEBUFFER\|ATTRDRIVER\|ATTRDURATION\|ATTRELAPSE\|ATTRENCODING\|ATTRFIXED\|ATTRFONTAA\|ATTRFONTASCENDER\|ATTRFONTCHARMAP\|ATTRFONTDEPTH\|ATTRFONTDESCENDER\|ATTRFONTENGINE\|ATTRFONTNAME\|ATTRFONTPALETTE\|ATTRFONTSCALABLE\|ATTRFONTSIZE\|ATTRFONTTRANSPARENTPEN\|ATTRFONTTYPE\|ATTRFORMAT\|ATTRFRAMEDELAY\|ATTRFUNCTION\|ATTRGROUP\|ATTRHARDWARE\|ATTRHASALPHA\|ATTRHASMASK\|ATTRHEIGHT\|ATTRHOSTDEPTH\|ATTRHOSTHEIGHT\|ATTRHOSTMONITORS\|ATTRHOSTSCALE\|ATTRHOSTSCALEX\|ATTRHOSTSCALEY\|ATTRHOSTTASKBAR\|ATTRHOSTTITLEBARHEIGHT\|ATTRHOSTWIDTH\|ATTRID\|ATTRIMMERSIVEMODE\|ATTRINTERPOLATE\|ATTRKEYBOARD\|ATTRLAYERID\|ATTRLAYERS\|ATTRLAYERSON\|ATTRLOADER\|ATTRMARGINLEFT\|ATTRMARGINRIGHT\|ATTRMASKMODE\|ATTRMAXHEIGHT\|ATTRMAXIMIZED\|ATTRMAXWIDTH\|ATTRMENU\|ATTRMODE\|ATTRMONITOR\|ATTRNOCLOSE\|ATTRNOHIDE\|ATTRNOMODESWITCH\|ATTRNUMENTRIES\|ATTRNUMFRAMES\|ATTRNUMSUBSONGS\|ATTRONSCREEN\|ATTRORIENTATION\|ATTROUTPUTDEVICE\|ATTRPALETTE\|ATTRPALETTEMODE\|ATTRPAUSED\|ATTRPEN\|ATTRPITCH\|ATTRPLAYING\|ATTRPOINTER\|ATTRPOSITION\|ATTRPUBSCREEN\|ATTRRAWHEIGHT\|ATTRRAWWIDTH\|ATTRRAWXPOS\|ATTRRAWYPOS\|ATTRSCALEHEIGHT\|ATTRSCALEMODE\|ATTRSCALESWITCH\|ATTRSCALEWIDTH\|ATTRSHADOWPEN\|ATTRSIZE\|ATTRSIZEABLE\|ATTRSPRITES\|ATTRSTANDARD\|ATTRSTATE\|ATTRSYSTEMBARS\|ATTRTEXT\|ATTRTITLE\|ATTRTRANSPARENTCOLOR\|ATTRTRANSPARENTPEN\|ATTRTYPE\|ATTRUSERDATA\|ATTRVISIBLE\|ATTRWIDTH\|ATTRXDPI\|ATTRXPOS\|ATTRXSERVER\|ATTRYDPI\|ATTRYPOS\|ATTRZPOS\|BARS\|BAUD_115200\|BAUD_1200\|BAUD_19200\|BAUD_2400\|BAUD_300\|BAUD_38400\|BAUD_460800\|BAUD_4800\|BAUD_57600\|BAUD_600\|BAUD_9600\|BEEPERROR\|BEEPINFORMATION\|BEEPQUESTION\|BEEPSYSTEM\|BEEPWARNING\|BGPIC\|BGPICPART\|BIGENDIAN\|BIGSINE\|BITMAP_DEFAULT\|BLACK\|BLEND\|BLUE\|BOLD\|BOOLEAN\|BORDER\|BOTTOM\|BOTTOMOUT\|BOUNCE\|BOX\|BRUSH\|BRUSH_VS_BOX\|BRUSHPART\|BULLET_ARROW\|BULLET_BOX\|BULLET_CHECKMARK\|BULLET_CIRCLE\|BULLET_CROSS\|BULLET_DASH\|BULLET_DIAMOND\|BULLET_LALPHA\|BULLET_LALPHADOUBLE\|BULLET_LALPHASINGLE\|BULLET_LROMAN\|BULLET_LROMANDOUBLE\|BULLET_LROMANSINGLE\|BULLET_NONE\|BULLET_NUMERIC\|BULLET_NUMERICDOUBLE\|BULLET_NUMERICSINGLE\|BULLET_UALPHA\|BULLET_UALPHADOUBLE\|BULLET_UALPHASINGLE\|BULLET_UROMAN\|BULLET_UROMANDOUBLE\|BULLET_UROMANSINGLE\|BYTE\|CAPBUTT\|CAPROUND\|CAPSQUARE\|CARDBOTTOM\|CARDTOP\|CENTER\|CHARMAP_ADOBECUSTOM\|CHARMAP_ADOBEEXPERT\|CHARMAP_ADOBELATIN1\|CHARMAP_ADOBESTANDARD\|CHARMAP_APPLEROMAN\|CHARMAP_BIG5\|CHARMAP_DEFAULT\|CHARMAP_JOHAB\|CHARMAP_MSSYMBOL\|CHARMAP_OLDLATIN2\|CHARMAP_SJIS\|CHARMAP_UNICODE\|CHARMAP_WANSUNG\|CHIPMEMORY\|CIRCLE\|CLIENT\|CLIPBOARD_EMPTY\|CLIPBOARD_IMAGE\|CLIPBOARD_SOUND\|CLIPBOARD_TEXT\|CLIPBOARD_UNKNOWN\|CLIPREGION\|CLOCKWIPE\|CLOSEWINDOW\|CONICAL\|COPYFILE_FAILED\|COPYFILE_OVERWRITE\|COPYFILE_STATUS\|COPYFILE_UNPROTECT\|COUNTBOTH\|COUNTDIRECTORIES\|COUNTFILES\|COUNTRY_AFGHANISTAN\|COUNTRY_ALANDISLANDS\|COUNTRY_ALBANIA\|COUNTRY_ALGERIA\|COUNTRY_AMERICANSAMOA\|COUNTRY_ANDORRA\|COUNTRY_ANGOLA\|COUNTRY_ANGUILLA\|COUNTRY_ANTARCTICA\|COUNTRY_ANTIGUAANDBARBUDA\|COUNTRY_ARGENTINA\|COUNTRY_ARMENIA\|COUNTRY_ARUBA\|COUNTRY_AUSTRALIA\|COUNTRY_AUSTRIA\|COUNTRY_AZERBAIJAN\|COUNTRY_BAHAMAS\|COUNTRY_BAHRAIN\|COUNTRY_BANGLADESH\|COUNTRY_BARBADOS\|COUNTRY_BELARUS\|COUNTRY_BELGIUM\|COUNTRY_BELIZE\|COUNTRY_BENIN\|COUNTRY_BERMUDA\|COUNTRY_BESISLANDS\|COUNTRY_BHUTAN\|COUNTRY_BOLIVIA\|COUNTRY_BOSNIAANDHERZEGOVINA\|COUNTRY_BOTSWANA\|COUNTRY_BOUVETISLAND\|COUNTRY_BRAZIL\|COUNTRY_BRUNEI\|COUNTRY_BULGARIA\|COUNTRY_BURKINAFASO\|COUNTRY_BURUNDI\|COUNTRY_CAMBODIA\|COUNTRY_CAMEROON\|COUNTRY_CANADA\|COUNTRY_CAPEVERDE\|COUNTRY_CAYMANISLANDS\|COUNTRY_CENTRALAFRICANREPUBLIC\|COUNTRY_CHAD\|COUNTRY_CHILE\|COUNTRY_CHINA\|COUNTRY_CHRISTMASISLAND\|COUNTRY_COCOSISLANDS\|COUNTRY_COLOMBIA\|COUNTRY_COMOROS\|COUNTRY_CONGO\|COUNTRY_COOKISLANDS\|COUNTRY_COSTARICA\|COUNTRY_CROATIA\|COUNTRY_CUBA\|COUNTRY_CURACAO\|COUNTRY_CYPRUS\|COUNTRY_CZECHREPUBLIC\|COUNTRY_DENMARK\|COUNTRY_DJIBOUTI\|COUNTRY_DOMINICA\|COUNTRY_DOMINICANREPUBLIC\|COUNTRY_DRCONGO\|COUNTRY_ECUADOR\|COUNTRY_EGYPT\|COUNTRY_ELSALVADOR\|COUNTRY_EQUATORIALGUINEA\|COUNTRY_ERITREA\|COUNTRY_ESTONIA\|COUNTRY_ETHIOPIA\|COUNTRY_FALKLANDISLANDS\|COUNTRY_FAROEISLANDS\|COUNTRY_FIJI\|COUNTRY_FINLAND\|COUNTRY_FRANCE\|COUNTRY_FRENCHGUIANA\|COUNTRY_FRENCHPOLYNESIA\|COUNTRY_GABON\|COUNTRY_GAMBIA\|COUNTRY_GEORGIA\|COUNTRY_GERMANY\|COUNTRY_GHANA\|COUNTRY_GIBRALTAR\|COUNTRY_GREECE\|COUNTRY_GREENLAND\|COUNTRY_GRENADA\|COUNTRY_GUADELOUPE\|COUNTRY_GUAM\|COUNTRY_GUATEMALA\|COUNTRY_GUERNSEY\|COUNTRY_GUINEA\|COUNTRY_GUINEABISSAU\|COUNTRY_GUYANA\|COUNTRY_HAITI\|COUNTRY_HOLYSEE\|COUNTRY_HONDURAS\|COUNTRY_HONGKONG\|COUNTRY_HUNGARY\|COUNTRY_ICELAND\|COUNTRY_INDIA\|COUNTRY_INDONESIA\|COUNTRY_IRAN\|COUNTRY_IRAQ\|COUNTRY_IRELAND\|COUNTRY_ISLEOFMAN\|COUNTRY_ISRAEL\|COUNTRY_ITALY\|COUNTRY_IVORYCOAST\|COUNTRY_JAMAICA\|COUNTRY_JAPAN\|COUNTRY_JERSEY\|COUNTRY_JORDAN\|COUNTRY_KAZAKHSTAN\|COUNTRY_KENYA\|COUNTRY_KIRIBATI\|COUNTRY_KUWAIT\|COUNTRY_KYRGYZSTAN\|COUNTRY_LAOS\|COUNTRY_LATVIA\|COUNTRY_LEBANON\|COUNTRY_LESOTHO\|COUNTRY_LIBERIA\|COUNTRY_LIBYA\|COUNTRY_LIECHTENSTEIN\|COUNTRY_LITHUANIA\|COUNTRY_LUXEMBOURG\|COUNTRY_MACAO\|COUNTRY_MACEDONIA\|COUNTRY_MADAGASCAR\|COUNTRY_MALAWI\|COUNTRY_MALAYSIA\|COUNTRY_MALDIVES\|COUNTRY_MALI\|COUNTRY_MALTA\|COUNTRY_MARSHALLISLANDS\|COUNTRY_MARTINIQUE\|COUNTRY_MAURITANIA\|COUNTRY_MAURITIUS\|COUNTRY_MAYOTTE\|COUNTRY_MEXICO\|COUNTRY_MICRONESIA\|COUNTRY_MOLDOVA\|COUNTRY_MONACO\|COUNTRY_MONGOLIA\|COUNTRY_MONTENEGRO\|COUNTRY_MONTSERRAT\|COUNTRY_MOROCCO\|COUNTRY_MOZAMBIQUE\|COUNTRY_MYANMAR\|COUNTRY_NAMIBIA\|COUNTRY_NAURU\|COUNTRY_NEPAL\|COUNTRY_NETHERLANDS\|COUNTRY_NEWCALEDONIA\|COUNTRY_NEWZEALAND\|COUNTRY_NICARAGUA\|COUNTRY_NIGER\|COUNTRY_NIGERIA\|COUNTRY_NIUE\|COUNTRY_NORFOLKISLAND\|COUNTRY_NORTHKOREA\|COUNTRY_NORWAY\|COUNTRY_OMAN\|COUNTRY_PAKISTAN\|COUNTRY_PALAU\|COUNTRY_PALESTINE\|COUNTRY_PANAMA\|COUNTRY_PAPUANEWGUINEA\|COUNTRY_PARAGUAY\|COUNTRY_PERU\|COUNTRY_PHILIPPINES\|COUNTRY_PITCAIRN\|COUNTRY_POLAND\|COUNTRY_PORTUGAL\|COUNTRY_PUERTORICO\|COUNTRY_QATAR\|COUNTRY_REUNION\|COUNTRY_ROMANIA\|COUNTRY_RUSSIA\|COUNTRY_RWANDA\|COUNTRY_SAINTBARTHELEMY\|COUNTRY_SAINTHELENA\|COUNTRY_SAINTKITTSANDNEVIS\|COUNTRY_SAINTLUCIA\|COUNTRY_SAINTVINCENT\|COUNTRY_SAMOA\|COUNTRY_SANMARINO\|COUNTRY_SAOTOMEANDPRINCIPE\|COUNTRY_SAUDIARABIA\|COUNTRY_SENEGAL\|COUNTRY_SERBIA\|COUNTRY_SEYCHELLES\|COUNTRY_SIERRALEONE\|COUNTRY_SINGAPORE\|COUNTRY_SLOVAKIA\|COUNTRY_SLOVENIA\|COUNTRY_SOLOMONISLANDS\|COUNTRY_SOMALIA\|COUNTRY_SOUTHAFRICA\|COUNTRY_SOUTHKOREA\|COUNTRY_SOUTHSUDAN\|COUNTRY_SPAIN\|COUNTRY_SRILANKA\|COUNTRY_SUDAN\|COUNTRY_SURINAME\|COUNTRY_SWAZILAND\|COUNTRY_SWEDEN\|COUNTRY_SWITZERLAND\|COUNTRY_SYRIA\|COUNTRY_TAIWAN\|COUNTRY_TAJIKISTAN\|COUNTRY_TANZANIA\|COUNTRY_THAILAND\|COUNTRY_TIMOR\|COUNTRY_TOGO\|COUNTRY_TONGA\|COUNTRY_TRINIDADANDTOBAGO\|COUNTRY_TUNISIA\|COUNTRY_TURKEY\|COUNTRY_TURKMENISTAN\|COUNTRY_TUVALU\|COUNTRY_UAE\|COUNTRY_UGANDA\|COUNTRY_UK\|COUNTRY_UKRAINE\|COUNTRY_UNKNOWN\|COUNTRY_URUGUAY\|COUNTRY_USA\|COUNTRY_UZBEKISTAN\|COUNTRY_VANUATU\|COUNTRY_VENEZUELA\|COUNTRY_VIETNAM\|COUNTRY_YEMEN\|COUNTRY_ZAMBIA\|COUNTSEPARATE\|CR_DEAD\|CR_RUNNING\|CR_SUSPENDED\|CROSSFADE\|CRUSHBOTTOM\|CRUSHLEFT\|CRUSHRIGHT\|CRUSHTOP\|DAMPED\|DATA_5\|DATA_6\|DATA_7\|DATA_8\|DATEDAY\|DATELOCAL\|DATELOCALNATIVE\|DATEMONTH\|DATETIME\|DATEUTC\|DATEYEAR\|DEFAULTICON\|DEFAULTSPEED\|DEINTERLACE_DEFAULT\|DEINTERLACE_DOUBLE\|DELETEFILE_FAILED\|DELETEFILE_STATUS\|DELETEFILE_UNPROTECT\|DENSITY_HIGH\|DENSITY_LOW\|DENSITY_MEDIUM\|DENSITY_NONE\|DIAGONAL\|DIRECTORY\|DIRMONITOR_ADD\|DIRMONITOR_CHANGE\|DIRMONITOR_REMOVE\|DISPLAY\|DISPMODE_ASK\|DISPMODE_FAKEFULLSCREEN\|DISPMODE_FULLSCREEN\|DISPMODE_FULLSCREENSCALE\|DISPMODE_MODEREQUESTER\|DISPMODE_MODESWITCH\|DISPMODE_SYSTEMSCALE\|DISPMODE_WINDOWED\|DISPSTATE_CLOSED\|DISPSTATE_MINIMIZED\|DISPSTATE_OPEN\|DISSOLVE\|DITHERMODE_FLOYDSTEINBERG\|DITHERMODE_NONE\|DOSTYPE_DIRECTORY\|DOSTYPE_FILE\|DOUBLE\|DOUBLEBUFFER\|DOWNLOADFILE_STATUS\|DTR_OFF\|DTR_ON\|DURATION_LONG\|DURATION_SHORT\|EDGE\|ELLIPSE\|ENCODING_AMIGA\|ENCODING_ISO8859_1\|ENCODING_RAW\|ENCODING_UTF8\|EOF\|ERR_8OR16BITONLY\|ERR_ACCELERATOR\|ERR_ADDAPPICON\|ERR_ADDAPPWIN\|ERR_ADDSYSEVENT\|ERR_ADDTASK\|ERR_ADFFREEDISP\|ERR_ADFWRONGDISP\|ERR_AFILEPROP\|ERR_AHI\|ERR_ALLOCALPHA\|ERR_ALLOCCHANNEL\|ERR_ALLOCCHUNKY\|ERR_ALLOCMASK\|ERR_ALRDYDECLRD\|ERR_ALREADYASYNC\|ERR_ALSAPCM\|ERR_AMIGAGUIDE\|ERR_ANIMDISK\|ERR_ANIMFRAME\|ERR_ANTIALIAS\|ERR_APPLET\|ERR_APPLETVERSION\|ERR_APPLICATION\|ERR_ARGS\|ERR_ARRAYDECLA\|ERR_ASSERTFAILED\|ERR_ATSUI\|ERR_AUDIOCONVERTER\|ERR_BACKFILL\|ERR_BAD8SVX\|ERR_BADBASE64\|ERR_BADBYTECODE\|ERR_BADCALLBACKRET\|ERR_BADCONSTANT\|ERR_BADDIMENSIONS\|ERR_BADENCODING\|ERR_BADINTEGER\|ERR_BADIP\|ERR_BADLAYERTYPE\|ERR_BADPLATFORM\|ERR_BADSIGNATURE\|ERR_BADUPVALUES\|ERR_BADURL\|ERR_BADWAVE\|ERR_BADYIELD\|ERR_BEGINREFRESH\|ERR_BGPICBUTTON\|ERR_BGPICPALETTE\|ERR_BGPICTYPE\|ERR_BITMAP\|ERR_BLKWOENDBLK\|ERR_BRACECLOSE\|ERR_BRACEOPEN\|ERR_BRACKETCLOSE\|ERR_BRACKETOPEN\|ERR_BRUSHLINK\|ERR_BRUSHSIZE\|ERR_BRUSHTYPE\|ERR_CACHEERROR\|ERR_CASECST\|ERR_CHANGEDIR\|ERR_CHANNELRANGE\|ERR_CHRCSTEMPTY\|ERR_CHRCSTLEN\|ERR_CLIPFORMAT\|ERR_CLIPOPEN\|ERR_CLIPREAD\|ERR_CLIPWRITE\|ERR_CLOSEDDISPLAY\|ERR_CLOSEFILE\|ERR_CMDASVAR\|ERR_CMPUNSUPPORTED\|ERR_COLORSPACE\|ERR_COMMENTSTRUCT\|ERR_COMMODITY\|ERR_COMPLEXEXPR\|ERR_COMPLEXPATTERN\|ERR_COMPLEXWHILE\|ERR_CONCAT\|ERR_CONFIG\|ERR_CONFIG2\|ERR_CONITEMS\|ERR_CONSOLEARG\|ERR_CONTEXTMENU\|ERR_COORDSRANGE\|ERR_COREFOUNDATION\|ERR_CORETEXT\|ERR_CREATEDIR\|ERR_CREATEDOCKY\|ERR_CREATEEVENT\|ERR_CREATEGC\|ERR_CREATEICON\|ERR_CREATEMENU\|ERR_CREATEPORT\|ERR_CREATESHORTCUT\|ERR_CSTDOUBLEDEF\|ERR_CTRLSTRUCT\|ERR_CYIELD\|ERR_DATATYPEALPHA\|ERR_DATATYPESAVE\|ERR_DATATYPESAVE2\|ERR_DBLENCODING\|ERR_DBPALETTE\|ERR_DBTRANSWIN\|ERR_DBVIDEOLAYER\|ERR_DDAUTOSCALE\|ERR_DDMOBILE\|ERR_DDRECVIDEO\|ERR_DEADRESUME\|ERR_DEFFONT\|ERR_DELETEFILE\|ERR_DEMO\|ERR_DEMO2\|ERR_DEMO3\|ERR_DEPTHMISMATCH\|ERR_DEPTHRANGE\|ERR_DESERIALIZE\|ERR_DIFFDEPTH\|ERR_DIFFENCODING\|ERR_DINPUT\|ERR_DIRECTSHOW\|ERR_DIRLOCK\|ERR_DISPLAYADAPTERSUPPORT\|ERR_DISPLAYDESKTOP\|ERR_DISPLAYDESKTOPPAL\|ERR_DISPLAYSIZE\|ERR_DISPMINIMIZED\|ERR_DLOPEN\|ERR_DOUBLEDECLA\|ERR_DOUBLEMENU\|ERR_DRAWPATH\|ERR_DSOUNDNOTIFY\|ERR_DSOUNDNOTIPOS\|ERR_DSOUNDPLAY\|ERR_ELSEIFAFTERELSE\|ERR_ELSETWICE\|ERR_ELSEWOIF\|ERR_EMPTYMENUTREE\|ERR_EMPTYOBJ\|ERR_EMPTYPATH\|ERR_EMPTYSCRIPT\|ERR_EMPTYTABLE\|ERR_ENDBLKWOBLK\|ERR_ENDDOUBLEBUFFER\|ERR_ENDFUNCWOFUNC\|ERR_ENDIFWOIF\|ERR_ENDSWCHWOSWCH\|ERR_ENDWITHWOWITH\|ERR_EQUALEXPECTED\|ERR_ERRORCALLED\|ERR_ESCREPLACE\|ERR_EVNTEXPCTED\|ERR_EXAMINE\|ERR_EXECUTE\|ERR_EXETYPE\|ERR_FGRABVIDSTATE\|ERR_FIELDINIT\|ERR_FILEEXIST\|ERR_FILEFORMAT\|ERR_FILENOTFOUND\|ERR_FILESIZE\|ERR_FINDACTIVITY\|ERR_FINDANIM\|ERR_FINDANIMSTREAM\|ERR_FINDAPPLICATION\|ERR_FINDARRAY\|ERR_FINDASYNCDRAW\|ERR_FINDASYNCOBJ\|ERR_FINDBGPIC\|ERR_FINDBRUSH\|ERR_FINDBUTTON\|ERR_FINDCLIENT\|ERR_FINDCLIPREGION\|ERR_FINDCST\|ERR_FINDDIR\|ERR_FINDDISPLAY\|ERR_FINDFILE\|ERR_FINDFONT\|ERR_FINDFONT2\|ERR_FINDICON\|ERR_FINDINTERVAL\|ERR_FINDLAYER\|ERR_FINDLAYERDATA\|ERR_FINDMEMBLK\|ERR_FINDMENU\|ERR_FINDMENUITEM\|ERR_FINDMONITOR\|ERR_FINDMOVE\|ERR_FINDMUSIC\|ERR_FINDOBJECTDATA\|ERR_FINDPALETTE\|ERR_FINDPATH\|ERR_FINDPLUGIN\|ERR_FINDPOINTER\|ERR_FINDPORT\|ERR_FINDSAMPLE\|ERR_FINDSELECTOR\|ERR_FINDSERIAL\|ERR_FINDSERVER\|ERR_FINDSPRITE\|ERR_FINDTEXTOBJECT\|ERR_FINDTIMEOUT\|ERR_FINDTIMER\|ERR_FINDUDPOBJECT\|ERR_FINDVIDEO\|ERR_FIRSTPREPROC\|ERR_FONTFORMAT\|ERR_FONTPATH\|ERR_FONTPATH2\|ERR_FORBIDMODAL\|ERR_FOREVERWOREPEAT\|ERR_FORWONEXT\|ERR_FRAMEGRABBER\|ERR_FREEABGPIC\|ERR_FREEADISPLAY\|ERR_FREECURPOINTER\|ERR_FT2\|ERR_FTPAUTH\|ERR_FTPERROR\|ERR_FULLSCREEN\|ERR_FUNCARGS\|ERR_FUNCDECLA\|ERR_FUNCEXPECTED\|ERR_FUNCJMP\|ERR_FUNCREMOVED\|ERR_FUNCTABLEARG\|ERR_FUNCWOENDFUNC\|ERR_GETDISKOBJ\|ERR_GETIFADDRS\|ERR_GETMONITORINFO\|ERR_GETSHORTCUT\|ERR_GRABSCREEN\|ERR_GROUPNAMEUSED\|ERR_GTK\|ERR_GUIGFX\|ERR_HEXPOINT\|ERR_HOSTNAME\|ERR_HTTPERROR\|ERR_HTTPTE\|ERR_HWBMCLOSEDISP\|ERR_HWBRUSH\|ERR_HWBRUSHFUNC\|ERR_HWDBFREEDISP\|ERR_ICONDIMS\|ERR_ICONENTRY\|ERR_ICONPARMS\|ERR_ICONSIZE\|ERR_ICONSTANDARD\|ERR_ICONVECTOR\|ERR_IFWOENDIF\|ERR_IMAGEERROR\|ERR_INCOMPATBRUSH\|ERR_INISYNTAX\|ERR_INITSERIAL\|ERR_INTERNAL\|ERR_INTERNAL1\|ERR_INTEXPECTED\|ERR_INVALIDDATE\|ERR_INVALIDUTF8\|ERR_INVALIDUTF8ARG\|ERR_INVCAPIDX\|ERR_INVINSERT\|ERR_INVNEXTKEY\|ERR_INVPATCAP\|ERR_INVREPLACE\|ERR_JAVA\|ERR_JAVAMETHOD\|ERR_JOYSTICK\|ERR_KEYFILE\|ERR_KEYNOTFOUND\|ERR_KEYWORD\|ERR_KICKSTART\|ERR_LABELDECLA\|ERR_LABELDOUBLE\|ERR_LABINFOR\|ERR_LABINFUNC\|ERR_LABINIF\|ERR_LABINWHILE\|ERR_LABMAINBLK\|ERR_LAYERRANGE\|ERR_LAYERSOFF\|ERR_LAYERSON\|ERR_LAYERSUPPORT\|ERR_LAYERSUPPORT2\|ERR_LAYERSWITCH\|ERR_LEGACYPTMOD\|ERR_LFSYNTAX\|ERR_LINKFONT\|ERR_LINKPLUGIN\|ERR_LOADFRAME\|ERR_LOADICON\|ERR_LOADPICTURE\|ERR_LOADPICTURE2\|ERR_LOADPLUGIN\|ERR_LOADSOUND\|ERR_LOADVIDEO\|ERR_LOCK\|ERR_LOCK2\|ERR_LOCKBMAP\|ERR_LOCKEDOBJ\|ERR_LOOPRANGE\|ERR_LOWFREQ\|ERR_MAGICKEY\|ERR_MALFORMPAT1\|ERR_MALFORMPAT2\|ERR_MASKNALPHA\|ERR_MAXLINES\|ERR_MAXLOCALS\|ERR_MAXPARAMS\|ERR_MAXUPVALS\|ERR_MEDIAFOUNDATION\|ERR_MEM\|ERR_MEMCODE\|ERR_MEMCST\|ERR_MEMRANGE\|ERR_MENUATTACHED\|ERR_MENUCOMPLEXITY\|ERR_MISSINGBRACKET\|ERR_MISSINGFIELD\|ERR_MISSINGOPBRACK\|ERR_MISSINGPARAMTR\|ERR_MISSINGSEPARTR\|ERR_MIXMUSMOD\|ERR_MOBILE\|ERR_MODIFYAANIM\|ERR_MODIFYABG\|ERR_MODIFYABGPIC\|ERR_MODIFYABR\|ERR_MODIFYPSMP\|ERR_MODIFYSPRITE\|ERR_MODIFYSPRITE2\|ERR_MONITORDIR\|ERR_MONITORFULLSCREEN\|ERR_MONITORRANGE\|ERR_MOVEFILE\|ERR_MSGPORT\|ERR_MULDISMOBILE\|ERR_MULTIBGPIC\|ERR_MULTIDISPLAYS\|ERR_MUSFMTSUPPORT\|ERR_MUSNOTPAUSED\|ERR_MUSNOTPLYNG\|ERR_MUSNOTPLYNG2\|ERR_MUSPAUSED\|ERR_MUSPLAYING\|ERR_NAMETOOLONG\|ERR_NAMEUSED\|ERR_NEEDAPPLICATION\|ERR_NEEDCOMPOSITE\|ERR_NEEDMORPHOS2\|ERR_NEEDOS41\|ERR_NEEDPALETTEIMAGE\|ERR_NEGCOORDS\|ERR_NEWHWPLUGIN\|ERR_NEXTWOFOR\|ERR_NOABSPATH\|ERR_NOACCESS\|ERR_NOALPHA\|ERR_NOANMLAYER\|ERR_NOAPPLET\|ERR_NOARGBVISUAL\|ERR_NOBLOCKBREAK\|ERR_NOCALLBACK\|ERR_NOCHANNEL\|ERR_NOCHAR\|ERR_NOCLIPREG\|ERR_NOCOLON\|ERR_NOCOMMA\|ERR_NOCOMPRESS\|ERR_NOCONSTANTS\|ERR_NOCONTEXTMENU\|ERR_NOCOORDCST\|ERR_NODIRPATTERN\|ERR_NODISLAYERS\|ERR_NODISPMODES\|ERR_NODOUBLEBUFFER\|ERR_NOFALLTHROUGH\|ERR_NOFILTERNAME\|ERR_NOFMBHANDLER\|ERR_NOFUNCTION\|ERR_NOHWFUNC\|ERR_NOJOYATPORT\|ERR_NOKEYWORDS\|ERR_NOLAYERS\|ERR_NOLOOP\|ERR_NOLOOPCONT\|ERR_NOMASKBRUSH\|ERR_NOMENU\|ERR_NOMIMEVIEWER\|ERR_NOMUSICCB\|ERR_NONE\|ERR_NONSUSPENDEDRESUME\|ERR_NOPALETTE\|ERR_NOPALETTEIMAGE\|ERR_NOPALETTEMODE\|ERR_NORETVAL\|ERR_NOREXX\|ERR_NOSPRITES\|ERR_NOTADIR\|ERR_NOTENOUGHPIXELS\|ERR_NOTIGER\|ERR_NOTPROTRACKER\|ERR_NOTRANSPARENCY\|ERR_NOTXTLAYER\|ERR_NUMBEREXPECTED\|ERR_NUMCALLBACK\|ERR_NUMCONCAT\|ERR_NUMEXPECTED\|ERR_NUMSTRCMP\|ERR_NUMTABLEARG\|ERR_OLDAPPLET\|ERR_OPENANIM\|ERR_OPENANIM2\|ERR_OPENAUDIO\|ERR_OPENFONT\|ERR_OPENLIB\|ERR_OPENSERIAL\|ERR_OPENSOCKET\|ERR_OPENSOUND\|ERR_OPENSOUND2\|ERR_OUTOFRANGE\|ERR_PAKFORMAT\|ERR_PALETTEFILL\|ERR_PALETTEMODE\|ERR_PALSCREEN\|ERR_PEERNAME\|ERR_PENRANGE\|ERR_PERCENTFORMAT\|ERR_PERCENTFORMATSTR\|ERR_PIPE\|ERR_PIXELFORMAT\|ERR_PIXELRANGE\|ERR_PLAYERCOMP\|ERR_PLAYVIDEO\|ERR_PLUGINARCH\|ERR_PLUGINDOUBLET\|ERR_PLUGINSUPPORT\|ERR_PLUGINSYMBOL\|ERR_PLUGINTYPE\|ERR_PLUGINVER\|ERR_POINTERFORMAT\|ERR_POINTERIMG\|ERR_PORTNOTAVAIL\|ERR_PREPROCSYM\|ERR_PROTMETATABLE\|ERR_PUBSCREEN\|ERR_QUICKTIME\|ERR_RADIOTOGGLEMENU\|ERR_RANDOMIZE\|ERR_READ\|ERR_READFILE\|ERR_READFUNC\|ERR_READONLY\|ERR_READRANGE\|ERR_READTABLE\|ERR_READVIDEOPIXELS\|ERR_RECVCLOSED\|ERR_RECVTIMEOUT\|ERR_RECVUNKNOWN\|ERR_REGCLASS\|ERR_REGISTRYREAD\|ERR_REGISTRYWRITE\|ERR_REMADLAYER\|ERR_RENAME\|ERR_RENDER\|ERR_RENDERADLAYER\|ERR_RENDERCALLBACK\|ERR_RENDERER\|ERR_REPEATWOUNTIL\|ERR_REQAUTH\|ERR_REQUIREFIELD\|ERR_REQUIREPLUGIN\|ERR_REQUIRETAGFMT\|ERR_RETWOGOSUB\|ERR_REVDWORD\|ERR_REWINDDIR\|ERR_REXXERR\|ERR_SATELLITE\|ERR_SATFREEDISP\|ERR_SAVEANIM\|ERR_SAVEICON\|ERR_SAVEIMAGE\|ERR_SAVEPNG\|ERR_SAVERALPHA\|ERR_SAVESAMPLE\|ERR_SCALEBGPIC\|ERR_SCREEN\|ERR_SCREENMODE\|ERR_SCREENSIZE\|ERR_SCRPIXFMT\|ERR_SEEK\|ERR_SEEKFILE\|ERR_SEEKFORMAT\|ERR_SEEKRANGE\|ERR_SELECTALPHACHANNEL\|ERR_SELECTANIM\|ERR_SELECTBG\|ERR_SELECTBGPIC\|ERR_SELECTBGPIC2\|ERR_SELECTBRUSH\|ERR_SELECTMASK\|ERR_SEMAPHORE\|ERR_SENDDATA\|ERR_SENDMESSAGE\|ERR_SENDTIMEOUT\|ERR_SENDUNKNOWN\|ERR_SERIALIO\|ERR_SERIALIZE\|ERR_SERIALIZETYPE\|ERR_SETADAPTER\|ERR_SETENV\|ERR_SETFILEATTR\|ERR_SETFILECOMMENT\|ERR_SETFILEDATE\|ERR_SETMENU\|ERR_SHORTIF\|ERR_SIGNAL\|ERR_SMODEALPHA\|ERR_SMPRANGE\|ERR_SOCKET\|ERR_SOCKNAME\|ERR_SOCKOPT\|ERR_SORTFUNC\|ERR_SPRITELINK\|ERR_SPRITEONSCREEN\|ERR_SPRITEONSCREEN2\|ERR_SQBRACKETCLOSE\|ERR_SQBRACKETOPEN\|ERR_STACK\|ERR_STAT\|ERR_STRCALLBACK\|ERR_STREAMASSAMPLE\|ERR_STREXPECTED\|ERR_STRINGCST\|ERR_STRINGEXPECTED\|ERR_STRORNUM\|ERR_STRTABLEARG\|ERR_STRTOOSHORT\|ERR_SURFACE\|ERR_SWCHWOENDSWCH\|ERR_SYNTAXERROR\|ERR_SYNTAXLEVELS\|ERR_SYSBUTTON\|ERR_SYSIMAGE\|ERR_SYSTOOOLD\|ERR_TABCALLBACK\|ERR_TABEXPECTED\|ERR_TABEXPECTED2\|ERR_TABEXPECTED3\|ERR_TABLEDECLA\|ERR_TABLEINDEX\|ERR_TABLEORNIL\|ERR_TABLEOVERFLOW\|ERR_TAGEXPECTED\|ERR_TASKSETUP\|ERR_TEXTARG\|ERR_TEXTCONVERT\|ERR_TEXTCONVERT2\|ERR_TEXTSYNTAX\|ERR_TEXTURE\|ERR_TFIMAGE\|ERR_TFVANIM\|ERR_TFVBGPICBRUSH\|ERR_TFVBRUSH\|ERR_TFVBRUSHBGPIC\|ERR_THREAD\|ERR_THREADEXPECTED\|ERR_TIMER\|ERR_TOKENEXPECTED\|ERR_TOOMANYARGS\|ERR_TOOMANYCAPTURES\|ERR_TOOSMALL2\|ERR_TRANSBGMOBILE\|ERR_TRANSBRUSH\|ERR_TRAYICON\|ERR_TRIALCOMPILE\|ERR_TRIALINCLUDE\|ERR_TRIALLIMIT\|ERR_TRIALSAVEVID\|ERR_UDEXPECTED\|ERR_UNBALANCEDPAT\|ERR_UNEXPECTEDEOF\|ERR_UNEXPECTEDSYM\|ERR_UNFINISHEDCAPTURE\|ERR_UNIMPLCMD\|ERR_UNKNOWN\|ERR_UNKNOWNANMOUT\|ERR_UNKNOWNATTR\|ERR_UNKNOWNCMD\|ERR_UNKNOWNCOND\|ERR_UNKNOWNFILTER\|ERR_UNKNOWNICNOUT\|ERR_UNKNOWNIMGOUT\|ERR_UNKNOWNMIMETYPE\|ERR_UNKNOWNMUSFMT\|ERR_UNKNOWNPALETTE\|ERR_UNKNOWNSEC\|ERR_UNKNOWNSEQ\|ERR_UNKNOWNSMPOUT\|ERR_UNKNOWNTAG\|ERR_UNKNUMFMT\|ERR_UNKPROTOCOL\|ERR_UNKTEXTFMT\|ERR_UNMPARENTHESES\|ERR_UNSETENV\|ERR_UNSUPPORTEDFEAT\|ERR_UNTERMINTDSTR\|ERR_UNTILWOREPEAT\|ERR_UPDATEICON\|ERR_UPLOADFORBIDDEN\|ERR_USERABORT\|ERR_VALUEEXPECTED\|ERR_VAREXPECTED\|ERR_VARLENGTH\|ERR_VARSYNTAX\|ERR_VECGFXPLUGIN\|ERR_VECTORANIM\|ERR_VECTORBRUSH\|ERR_VERSION\|ERR_VFONT\|ERR_VFONTTYPE\|ERR_VIDATTACHED\|ERR_VIDEOFRAME\|ERR_VIDEOINIT\|ERR_VIDEOLAYER\|ERR_VIDEOLAYERDRV\|ERR_VIDEOSTRATEGY\|ERR_VIDEOTRANS\|ERR_VIDLAYERFUNC\|ERR_VIDNOTPAUSED\|ERR_VIDNOTPLAYING\|ERR_VIDPAUSED\|ERR_VIDPLAYING\|ERR_VIDRECMULTI\|ERR_VIDRECTRANS\|ERR_VIDSTOPPED\|ERR_VISUALINFO\|ERR_VMMISMATCH\|ERR_WARPOS\|ERR_WENDWOWHILE\|ERR_WHILEWOWEND\|ERR_WINDOW\|ERR_WITHWOENDWITH\|ERR_WRITE\|ERR_WRITEFILE\|ERR_WRITEJPEG\|ERR_WRITEONLY\|ERR_WRONGCLIPREG\|ERR_WRONGCMDRECVIDEO\|ERR_WRONGDTYPE\|ERR_WRONGFLOAT\|ERR_WRONGHEX\|ERR_WRONGID\|ERR_WRONGOP\|ERR_WRONGOPCST\|ERR_WRONGSPRITESIZE\|ERR_WRONGUSAGE\|ERR_WRONGVSTRATEGY\|ERR_XCURSOR\|ERR_XDISPLAY\|ERR_XF86VIDMODEEXT\|ERR_XFIXES\|ERR_YIELD\|ERR_ZERODIVISION\|ERR_ZLIBDATA\|ERR_ZLIBIO\|ERR_ZLIBSTREAM\|ERR_ZLIBVERSION\|EVENTHANDLER\|FADE\|FASTMEMORY\|FASTSPEED\|FILE\|FILEATTR_ARCHIVE\|FILEATTR_DELETE_USR\|FILEATTR_EXECUTE_GRP\|FILEATTR_EXECUTE_OTH\|FILEATTR_EXECUTE_USR\|FILEATTR_HIDDEN\|FILEATTR_NORMAL\|FILEATTR_PURE\|FILEATTR_READ_GRP\|FILEATTR_READ_OTH\|FILEATTR_READ_USR\|FILEATTR_READONLY\|FILEATTR_SCRIPT\|FILEATTR_SYSTEM\|FILEATTR_WRITE_GRP\|FILEATTR_WRITE_OTH\|FILEATTR_WRITE_USR\|FILETYPE_ANIM\|FILETYPE_ICON\|FILETYPE_IMAGE\|FILETYPE_SOUND\|FILETYPE_VIDEO\|FILETYPEFLAGS_ALPHA\|FILETYPEFLAGS_FPS\|FILETYPEFLAGS_QUALITY\|FILETYPEFLAGS_SAVE\|FILLCOLOR\|FILLGRADIENT\|FILLNONE\|FILLRULEEVENODD\|FILLRULEWINDING\|FILLTEXTURE\|FLOAT\|FLOW_HARDWARE\|FLOW_OFF\|FLOW_XON_XOFF\|FONT\|FONTENGINE_INBUILT\|FONTENGINE_NATIVE\|FONTSLANT_ITALIC\|FONTSLANT_OBLIQUE\|FONTSLANT_ROMAN\|FONTTYPE_BITMAP\|FONTTYPE_COLOR\|FONTTYPE_VECTOR\|FONTWEIGHT_BLACK\|FONTWEIGHT_BOLD\|FONTWEIGHT_BOOK\|FONTWEIGHT_DEMIBOLD\|FONTWEIGHT_EXTRABLACK\|FONTWEIGHT_EXTRABOLD\|FONTWEIGHT_EXTRALIGHT\|FONTWEIGHT_HEAVY\|FONTWEIGHT_LIGHT\|FONTWEIGHT_MEDIUM\|FONTWEIGHT_NORMAL\|FONTWEIGHT_REGULAR\|FONTWEIGHT_SEMIBOLD\|FONTWEIGHT_THIN\|FONTWEIGHT_ULTRABLACK\|FONTWEIGHT_ULTRABOLD\|FONTWEIGHT_ULTRALIGHT\|FRAMEMODE_FULL\|FRAMEMODE_SINGLE\|FREESPACE\|FTPASCII\|FTPBINARY\|FUCHSIA\|FUNCTION\|GRAY\|GREEN\|HBLINDS128\|HBLINDS16\|HBLINDS32\|HBLINDS64\|HBLINDS8\|HCLOSECURTAIN\|HCLOSEGATE\|HEXNUMERICAL\|HFLIPCOIN\|HFLOWBOTTOM\|HFLOWTOP\|HIDEBRUSH\|HIDELAYER\|HKEY_CLASSES_ROOT\|HKEY_CURRENT_CONFIG\|HKEY_CURRENT_USER\|HKEY_LOCAL_MACHINE\|HKEY_USERS\|HLINES\|HLINES2\|HLOWFLIPCOIN\|HOLLYWOOD\|HOPENCURTAIN\|HOPENGATE\|HSPLIT\|HSTRANGEPUSH\|HSTRETCHCENTER\|HSTRIPES\|HSTRIPES16\|HSTRIPES2\|HSTRIPES32\|HSTRIPES4\|HSTRIPES64\|HSTRIPES8\|HW_64BIT\|HW_AMIGA\|HW_AMIGAOS3\|HW_AMIGAOS4\|HW_ANDROID\|HW_AROS\|HW_IOS\|HW_LINUX\|HW_LITTLE_ENDIAN\|HW_MACOS\|HW_MORPHOS\|HW_REVISION\|HW_VERSION\|HW_WARPOS\|HW_WINDOWS\|ICNFMT_HOLLYWOOD\|ICON\|IMAGETYPE_RASTER\|IMAGETYPE_VECTOR\|IMGFMT_BMP\|IMGFMT_GIF\|IMGFMT_ILBM\|IMGFMT_JPEG\|IMGFMT_NATIVE\|IMGFMT_PLUGIN\|IMGFMT_PNG\|IMGFMT_TIFF\|IMGFMT_UNKNOWN\|IMMERSIVE_LEANBACK\|IMMERSIVE_NONE\|IMMERSIVE_NORMAL\|IMMERSIVE_STICKY\|INACTIVEWINDOW\|INF\|INSERTBRUSH\|INTEGER\|INTERVAL\|IO_BUFFERED\|IO_FAKE64\|IO_LITTLEENDIAN\|IO_SIGNED\|IO_UNBUFFERED\|IO_UNSIGNED\|IPAUTO\|IPUNKNOWN\|IPV4\|IPV6\|ITALIC\|JOINBEVEL\|JOINMITER\|JOINROUND\|JOYDOWN\|JOYDOWNLEFT\|JOYDOWNRIGHT\|JOYLEFT\|JOYNODIR\|JOYRIGHT\|JOYUP\|JOYUPLEFT\|JOYUPRIGHT\|JUSTIFIED\|KEEPASPRAT\|KEEPPOSITION\|LANGUAGE_ABKHAZIAN\|LANGUAGE_AFAR\|LANGUAGE_AFRIKAANS\|LANGUAGE_AKAN\|LANGUAGE_ALBANIAN\|LANGUAGE_AMHARIC\|LANGUAGE_ARABIC\|LANGUAGE_ARAGONESE\|LANGUAGE_ARMENIAN\|LANGUAGE_ASSAMESE\|LANGUAGE_AVARIC\|LANGUAGE_AVESTAN\|LANGUAGE_AYMARA\|LANGUAGE_AZERBAIJANI\|LANGUAGE_BAMBARA\|LANGUAGE_BASHKIR\|LANGUAGE_BASQUE\|LANGUAGE_BELARUSIAN\|LANGUAGE_BENGALI\|LANGUAGE_BIHARI\|LANGUAGE_BISLAMA\|LANGUAGE_BOSNIAN\|LANGUAGE_BRETON\|LANGUAGE_BULGARIAN\|LANGUAGE_BURMESE\|LANGUAGE_CATALAN\|LANGUAGE_CENTRALKHMER\|LANGUAGE_CHAMORRO\|LANGUAGE_CHECHEN\|LANGUAGE_CHICHEWA\|LANGUAGE_CHINESE\|LANGUAGE_CHURCHSLAVIC\|LANGUAGE_CHUVASH\|LANGUAGE_CORNISH\|LANGUAGE_CORSICAN\|LANGUAGE_CREE\|LANGUAGE_CROATIAN\|LANGUAGE_CZECH\|LANGUAGE_DANISH\|LANGUAGE_DIVEHI\|LANGUAGE_DUTCH\|LANGUAGE_DZONGKHA\|LANGUAGE_ENGLISH\|LANGUAGE_ESPERANTO\|LANGUAGE_ESTONIAN\|LANGUAGE_EWE\|LANGUAGE_FAROESE\|LANGUAGE_FIJIAN\|LANGUAGE_FINNISH\|LANGUAGE_FRENCH\|LANGUAGE_FULAH\|LANGUAGE_GAELIC\|LANGUAGE_GALICIAN\|LANGUAGE_GANDA\|LANGUAGE_GEORGIAN\|LANGUAGE_GERMAN\|LANGUAGE_GREEK\|LANGUAGE_GREENLANDIC\|LANGUAGE_GUARANI\|LANGUAGE_GUJARATI\|LANGUAGE_HAITIAN\|LANGUAGE_HAUSA\|LANGUAGE_HEBREW\|LANGUAGE_HERERO\|LANGUAGE_HINDI\|LANGUAGE_HIRIMOTU\|LANGUAGE_HUNGARIAN\|LANGUAGE_ICELANDIC\|LANGUAGE_IDO\|LANGUAGE_IGBO\|LANGUAGE_INDONESIAN\|LANGUAGE_INTERLINGUA\|LANGUAGE_INTERLINGUE\|LANGUAGE_INUKTITUT\|LANGUAGE_INUPIAQ\|LANGUAGE_IRISH\|LANGUAGE_ITALIAN\|LANGUAGE_JAPANESE\|LANGUAGE_JAVANESE\|LANGUAGE_KANNADA\|LANGUAGE_KANURI\|LANGUAGE_KASHMIRI\|LANGUAGE_KAZAKH\|LANGUAGE_KIKUYU\|LANGUAGE_KINYARWANDA\|LANGUAGE_KIRGHIZ\|LANGUAGE_KOMI\|LANGUAGE_KONGO\|LANGUAGE_KOREAN\|LANGUAGE_KUANYAMA\|LANGUAGE_KURDISH\|LANGUAGE_LAO\|LANGUAGE_LATIN\|LANGUAGE_LATVIAN\|LANGUAGE_LIMBURGAN\|LANGUAGE_LINGALA\|LANGUAGE_LITHUANIAN\|LANGUAGE_LUBAKATANGA\|LANGUAGE_LUXEMBOURGISH\|LANGUAGE_MACEDONIAN\|LANGUAGE_MALAGASY\|LANGUAGE_MALAY\|LANGUAGE_MALAYALAM\|LANGUAGE_MALTESE\|LANGUAGE_MANX\|LANGUAGE_MAORI\|LANGUAGE_MARATHI\|LANGUAGE_MARSHALLESE\|LANGUAGE_MONGOLIAN\|LANGUAGE_NAURU\|LANGUAGE_NAVAJO\|LANGUAGE_NDONGA\|LANGUAGE_NEPALI\|LANGUAGE_NORTHERNSAMI\|LANGUAGE_NORTHNDEBELE\|LANGUAGE_NORWEGIAN\|LANGUAGE_NORWEGIANBOKMAL\|LANGUAGE_NORWEGIANNYNORSK\|LANGUAGE_OCCITAN\|LANGUAGE_OJIBWA\|LANGUAGE_ORIYA\|LANGUAGE_OROMO\|LANGUAGE_OSSETIAN\|LANGUAGE_PALI\|LANGUAGE_PANJABI\|LANGUAGE_PASHTO\|LANGUAGE_PERSIAN\|LANGUAGE_POLISH\|LANGUAGE_PORTUGUESE\|LANGUAGE_QUECHUA\|LANGUAGE_ROMANIAN\|LANGUAGE_ROMANSH\|LANGUAGE_RUNDI\|LANGUAGE_RUSSIAN\|LANGUAGE_SAMOAN\|LANGUAGE_SANGO\|LANGUAGE_SANSKRIT\|LANGUAGE_SARDINIAN\|LANGUAGE_SERBIAN\|LANGUAGE_SHONA\|LANGUAGE_SICHUANYI\|LANGUAGE_SINDHI\|LANGUAGE_SINHALA\|LANGUAGE_SLOVAK\|LANGUAGE_SLOVENIAN\|LANGUAGE_SOMALI\|LANGUAGE_SOUTHERNSOTHO\|LANGUAGE_SOUTHNDEBELE\|LANGUAGE_SPANISH\|LANGUAGE_SUNDANESE\|LANGUAGE_SWAHILI\|LANGUAGE_SWATI\|LANGUAGE_SWEDISH\|LANGUAGE_TAGALOG\|LANGUAGE_TAHITIAN\|LANGUAGE_TAJIK\|LANGUAGE_TAMIL\|LANGUAGE_TATAR\|LANGUAGE_TELUGU\|LANGUAGE_THAI\|LANGUAGE_TIBETAN\|LANGUAGE_TIGRINYA\|LANGUAGE_TONGA\|LANGUAGE_TSONGA\|LANGUAGE_TSWANA\|LANGUAGE_TURKISH\|LANGUAGE_TURKMEN\|LANGUAGE_TWI\|LANGUAGE_UIGHUR\|LANGUAGE_UKRAINIAN\|LANGUAGE_UNKNOWN\|LANGUAGE_URDU\|LANGUAGE_UZBEK\|LANGUAGE_VENDA\|LANGUAGE_VIETNAMESE\|LANGUAGE_WALLOON\|LANGUAGE_WELSH\|LANGUAGE_WESTERNFRISIAN\|LANGUAGE_WOLOF\|LANGUAGE_XHOSA\|LANGUAGE_YIDDISH\|LANGUAGE_YORUBA\|LANGUAGE_ZHUANG\|LANGUAGE_ZULU\|LAYER\|LAYER_VS_BOX\|LAYERBUTTON\|LEFT\|LEFTOUT\|LIGHTUSERDATA\|LIME\|LINE\|LINEAR\|LITTLEENDIAN\|LONG\|LOWERCURVE\|MAROON\|MASK\|MASKAND\|MASKINVISIBLE\|MASKOR\|MASKVANILLACOPY\|MASKVISIBLE\|MASKXOR\|MEMORY\|MENU\|MENUITEM_DISABLED\|MENUITEM_RADIO\|MENUITEM_SELECTED\|MENUITEM_TOGGLE\|MILLISECONDS\|MODE_READ\|MODE_READWRITE\|MODE_WRITE\|MODLALT\|MODLCOMMAND\|MODLCONTROL\|MODLSHIFT\|MODRALT\|MODRCOMMAND\|MODRCONTROL\|MODRSHIFT\|MONO16\|MONO8\|MONOSPACE\|MOVEFILE_COPY\|MOVEFILE_COPYFAILED\|MOVEFILE_DELETE\|MOVEFILE_DELETEFAILED\|MOVEFILE_UNPROTECT\|MOVELIST\|MOVEWINDOW\|MUSIC\|NAN\|NATIVE\|NATIVEENDIAN\|NAVY\|NETWORKCONNECTION\|NETWORKSERVER\|NETWORKUDP\|NEXTFRAME\|NEXTFRAME2\|NIL\|NOCOLOR\|NONE\|NOPEN\|NORMAL\|NORMALSPEED\|NOTRANSPARENCY\|NUMBER\|NUMERICAL\|OLIVE\|ONBUTTONCLICK\|ONBUTTONCLICKALL\|ONBUTTONOVER\|ONBUTTONOVERALL\|ONBUTTONRIGHTCLICK\|ONBUTTONRIGHTCLICKALL\|ONKEYDOWN\|ONKEYDOWNALL\|ORIENTATION_LANDSCAPE\|ORIENTATION_LANDSCAPEREV\|ORIENTATION_NONE\|ORIENTATION_PORTRAIT\|ORIENTATION_PORTRAITREV\|PALETTE\|PALETTE_AGA\|PALETTE_CGA\|PALETTE_DEFAULT\|PALETTE_EGA\|PALETTE_GRAY128\|PALETTE_GRAY16\|PALETTE_GRAY256\|PALETTE_GRAY32\|PALETTE_GRAY4\|PALETTE_GRAY64\|PALETTE_GRAY8\|PALETTE_MACINTOSH\|PALETTE_MONOCHROME\|PALETTE_OCS\|PALETTE_WINDOWS\|PALETTE_WORKBENCH\|PALETTEMODE_PEN\|PALETTEMODE_REMAP\|PARITY_EVEN\|PARITY_NONE\|PARITY_ODD\|PERMREQ_READEXTERNAL\|PERMREQ_WRITEEXTERNAL\|PI\|PIXELZOOM1\|PIXELZOOM2\|PLOT\|PLUGINCAPS_ANIM\|PLUGINCAPS_AUDIOADAPTER\|PLUGINCAPS_CONVERT\|PLUGINCAPS_DIRADAPTER\|PLUGINCAPS_DISPLAYADAPTER\|PLUGINCAPS_EXTENSION\|PLUGINCAPS_FILEADAPTER\|PLUGINCAPS_ICON\|PLUGINCAPS_IMAGE\|PLUGINCAPS_IPCADAPTER\|PLUGINCAPS_LIBRARY\|PLUGINCAPS_NETWORKADAPTER\|PLUGINCAPS_REQUESTERADAPTER\|PLUGINCAPS_REQUIRE\|PLUGINCAPS_SAVEANIM\|PLUGINCAPS_SAVEICON\|PLUGINCAPS_SAVEIMAGE\|PLUGINCAPS_SAVESAMPLE\|PLUGINCAPS_SERIALIZE\|PLUGINCAPS_SOUND\|PLUGINCAPS_TIMERADAPTER\|PLUGINCAPS_VECTOR\|PLUGINCAPS_VIDEO\|POINTER\|POLYGON\|PRGTYPE_APPLET\|PRGTYPE_PROGRAM\|PRGTYPE_SCRIPT\|PRINT\|PURPLE\|PUSHBOTTOM\|PUSHLEFT\|PUSHRIGHT\|PUSHTOP\|PUZZLE\|QUADRECT\|QUARTERS\|RADIAL\|RANDOMEFFECT\|RANDOMPARAMETER\|RECEIVEALL\|RECEIVEBYTES\|RECEIVEDATA_PACKET\|RECEIVELINE\|RECTBACKCENTER\|RECTBACKEAST\|RECTBACKNORTH\|RECTBACKNORTHEAST\|RECTBACKNORTHWEST\|RECTBACKSOUTH\|RECTBACKSOUTHEAST\|RECTBACKSOUTHWEST\|RECTBACKWEST\|RECTCENTER\|RECTEAST\|RECTNORTH\|RECTNORTHEAST\|RECTNORTHWEST\|RECTSOUTH\|RECTSOUTHEAST\|RECTSOUTHWEST\|RECTWEST\|RED\|REMOVELAYER\|REQ_CAMERA\|REQ_GALLERY\|REQ_HIDEICONS\|REQ_MULTISELECT\|REQ_NORMAL\|REQ_SAVEMODE\|REQICON_ERROR\|REQICON_INFORMATION\|REQICON_NONE\|REQICON_QUESTION\|REQICON_WARNING\|REVEALBOTTOM\|REVEALLEFT\|REVEALRIGHT\|REVEALTOP\|RIGHT\|RIGHTOUT\|ROLLLEFT\|ROLLTOP\|RTS_OFF\|RTS_ON\|SAMPLE\|SANS\|SCALEMODE_AUTO\|SCALEMODE_LAYER\|SCALEMODE_NONE\|SCROLLBOTTOM\|SCROLLEAST\|SCROLLLEFT\|SCROLLNORTH\|SCROLLNORTHEAST\|SCROLLNORTHWEST\|SCROLLRIGHT\|SCROLLSOUTH\|SCROLLSOUTHEAST\|SCROLLSOUTHWEST\|SCROLLTOP\|SCROLLWEST\|SECONDS\|SEEK_BEGINNING\|SEEK_CURRENT\|SEEK_END\|SELMODE_COMBO\|SELMODE_LAYERS\|SELMODE_NORMAL\|SERIAL\|SERIF\|SERVER\|SHADOW\|SHAPE\|SHDWEAST\|SHDWNORTH\|SHDWNORTHEAST\|SHDWNORTHWEST\|SHDWSOUTH\|SHDWSOUTHEAST\|SHDWSOUTHWEST\|SHDWWEST\|SHORT\|SILVER\|SIMPLEBUTTON\|SINE\|SIZEWINDOW\|SLIDEBOTTOM\|SLIDELEFT\|SLIDERIGHT\|SLIDETOP\|SLOWSPEED\|SMOOTHOUT\|SMPFMT_WAVE\|SNAPDESKTOP\|SNAPDISPLAY\|SNAPWINDOW\|SPIRAL\|SPRITE\|SPRITE_VS_BOX\|SPRITE_VS_BRUSH\|STAR\|STDERR\|STDIN\|STDOUT\|STDPTR_BUSY\|STDPTR_CUSTOM\|STDPTR_SYSTEM\|STEREO16\|STEREO8\|STOP_1\|STOP_2\|STRETCHBOTTOM\|STRETCHLEFT\|STRETCHRIGHT\|STRETCHTOP\|STRING\|STRUDEL\|SUN\|SWISS\|TABLE\|TEAL\|TEXTOBJECT\|TEXTOUT\|THREAD\|TICKS\|TIMEOUT\|TIMER\|TOP\|TOPOUT\|TRUETYPE_DEFAULT\|TURNDOWNBOTTOM\|TURNDOWNLEFT\|TURNDOWNRIGHT\|TURNDOWNTOP\|UDPCLIENT\|UDPNONE\|UDPOBJECT\|UDPSERVER\|UNDERLINED\|UNDO\|UPLOADFILE_RESPONSE\|UPLOADFILE_STATUS\|UPNDOWN\|UPPERCURVE\|USEDSPACE\|USELAYERPOSITION\|USERDATA\|VANILLACOPY\|VBLINDS128\|VBLINDS16\|VBLINDS32\|VBLINDS64\|VBLINDS8\|VCLOSECURTAIN\|VCLOSEGATE\|VECTORPATH\|VFLIPCOIN\|VFLOWLEFT\|VFLOWRIGHT\|VIDDRV_HOLLYWOOD\|VIDDRV_OS\|VIDEO\|VIEWMODE_DATE\|VIEWMODE_ICONS\|VIEWMODE_NAME\|VIEWMODE_NONE\|VIEWMODE_SIZE\|VIEWMODE_TYPE\|VLINES\|VLINES2\|VLOWFLIPCOIN\|VOID\|VOPENCURTAIN\|VOPENGATE\|VSPLIT\|VSTRANGEPUSH\|VSTRETCHCENTER\|VSTRIPES\|VSTRIPES16\|VSTRIPES2\|VSTRIPES32\|VSTRIPES4\|VSTRIPES64\|VSTRIPES8\|WALLPAPERLEFT\|WALLPAPERTOP\|WATER1\|WATER2\|WATER3\|WATER4\|WHITE\|WORD\|YELLOW\|ZOOMCENTER\|ZOOMEAST\|ZOOMIN\|ZOOMNORTH\|ZOOMNORTHEAST\|ZOOMNORTHWEST\|ZOOMOUT\|ZOOMSOUTH\|ZOOMSOUTHEAST\|ZOOMSOUTHWEST\|ZOOMWEST\)\>"
+" Hollywood Functions
+syn keyword hwFunction Abs ACos ARGB ActivateDisplay Add AddArcToPath AddBoxToPath AddCircleToPath AddEllipseToPath AddFontPath AddIconImage AddMove AddStr AddTab AddTextToPath AllocMem AllocMemFromPointer AllocMemFromVirtualFile AppendPath ApplyPatch Arc ArcDistortBrush ArrayToStr Asc ASin Assert AsyncDrawFrame ATan ATan2 BarrelDistortBrush Base64Str Beep BeginAnimStream BeginDoubleBuffer BeginRefresh BGPicToBrush BinStr BitClear BitComplement BitSet BitTest BitXor Blue BlurBrush Box BreakEventHandler BreakWhileMouseOn BrushToBGPic BrushToGray BrushToMonochrome BrushToPenArray BrushToRGBArray ByteAsc ByteChr ByteLen ByteOffset ByteStrStr ByteVal CRC32 CRC32Str CallJavaMethod CancelAsyncDraw CancelAsyncOperation CanonizePath Cast Ceil ChangeApplicationIcon ChangeBrushTransparency ChangeDirectory ChangeDisplayMode ChangeDisplaySize ChangeInterval CharcoalBrush CharOffset CharWidth CheckEvent CheckEvents Chr Circle ClearClipboard ClearEvents ClearInterval ClearMove ClearObjectData ClearPath ClearScreen ClearSerialQueue ClearTimeout CloseAmigaGuide CloseAnim CloseAudio CloseCatalog CloseConnection CloseDirectory CloseDisplay CloseFile CloseFont CloseMusic ClosePath CloseResourceMonitor CloseSerialPort CloseServer CloseUDPObject CloseVideo Cls CollectGarbage Collision ColorRequest CompareDates CompareStr CompressFile Concat ConsolePrint ConsolePrintNR ConsolePrompt ContinueAsyncOperation ContrastBrush ContrastPalette ConvertStr ConvertToBrush CopyAnim CopyBGPic CopyBrush CopyFile CopyLayer CopyMem CopyObjectData CopyPalette CopyPath CopyPens CopySample CopySprite CopyTable CopyTextObject Cos CountDirectoryEntries CountJoysticks CountStr CreateAnim CreateBGPic CreateBorderBrush CreateBrush CreateButton CreateClipRegion CreateCoroutine CreateDisplay CreateGradientBGPic CreateGradientBrush CreateIcon CreateKeyDown CreateLayer CreateList CreateMenu CreateMusic CreatePalette CreatePointer CreatePort CreateRainbowBGPic CreateRexxPort CreateSample CreateServer CreateShadowBrush CreateShortcut CreateSprite CreateTextObject CreateTexturedBGPic CreateTexturedBrush CreateUDPObject CropBrush CtrlCQuit CurveTo CyclePalette DateToTimestamp DateToUTC DebugOutput DebugPrint DebugPrintNR DebugPrompt DebugStr DebugVal DecompressFile DecreasePointer DefineVirtualFile DefineVirtualFileFromString Deg DeleteAlphaChannel DeleteButton DeleteFile DeleteMask DeletePrefs DeselectMenuItem DeserializeTable DirectoryItems DisableButton DisableEvent DisableEventHandler DisableLayers DisableLineHook DisableMenuItem DisablePlugin DisablePrecalculation DisableVWait DisplayAnimFrame DisplayBGPic DisplayBGPicPart DisplayBGPicPartFX DisplayBrush DisplayBrushFX DisplayBrushPart DisplaySprite DisplayTextObject DisplayTextObjectFX DisplayTransitionFX DisplayVideoFrame Div DoMove DownloadFile DrawPath DumpButtons DumpLayers DumpMem DumpVideo DumpVideoTime EdgeBrush Ellipse EmbossBrush EmptyStr EnableButton EnableEventHandler EnableEvent EnableLayers EnableLineHook EnableMenuItem EnablePlugin EnablePrecalculation EnableVWait End EndDoubleBuffer EndianSwap EndRefresh EndSelect EndsWith Eof Error EscapeQuit Eval Execute Exists ExitOnError Exp ExtractPalette FileAttributes FileLength FileLines FilePart FilePos FileRequest FileSize FileToString FillMem FillMusicBuffer FindStr FinishAnimStream FinishAsyncDraw Flip FlipBrush FlipSprite FloodFill Floor FlushFile FlushMusicBuffer FlushSerialPort FontRequest ForcePathUse ForceSound ForceVideoDriver ForceVideoMode ForEach ForEachI FormatStr Frac FreeAnim FreeBGPic FreeBrush FreeClipRegion FreeDisplay FreeEventCache FreeGlyphCache FreeIcon FreeLayers FreeMem FreeMenu FreeModule FreePalette FreePath FreePointer FreeSample FreeSprite FreeTextObject FrExp FullPath GammaBrush GammaPalette GCInfo GetAnimFrame GetApplicationInfo GetApplicationList GetAsset GetAttribute GetAvailableFonts GetBaudRate GetBestPen GetBrushLink GetBrushPen GetBulletColor GetCatalogString GetChannels GetCharMaps GetClipboard GetCommandLine GetConnectionIP GetConnectionPort GetConnectionProtocol GetConstant GetCoroutineStatus GetCountryInfo GetCurrentDirectory GetCurrentPoint GetDash GetDataBits GetDate GetDateNum GetDefaultEncoding GetDirectoryEntry GetDisplayModes GetDTR GetEnv GetErrorName GetEventCode GetFileArgument GetFileAttributes GetFillRule GetFillStyle GetFlowControl GetFontColor GetFontStyle GetFormStyle GetFPSLimit GetFrontScreen GetHostName GetIconProperties GetItem GetKerningPair GetLanguageInfo GetLastError GetLayerAtPos GetLayerPen GetLayerStyle GetLineCap GetLineJoin GetLineWidth GetLocalInterfaces GetLocalIP GetLocalPort GetLocalProtocol GetMACAddress GetMemoryInfo GetMemPointer GetMemString GetMetaTable GetMiterLimit GetMonitors GetObjectData GetObjects GetObjectType GetPalettePen GetParity GetPathExtents GetPatternPosition GetPen GetPlugins GetProgramDirectory GetProgramInfo GetPubScreens GetRandomColor GetRandomFX GetRealColor GetRTS GetSampleData GetShortcutPath GetSongPosition GetStartDirectory GetStopBits GetSystemCountry GetSystemInfo GetSystemLanguage GetTempFileName GetTime GetTimer GetTimestamp GetTimeZone GetType GetVersion GetVideoFrame GetVolumeInfo GetVolumeName GetWeekday Gosub Goto GrabDesktop Green HaveFreeChannel HaveItem HaveObject HaveObjectData HavePlugin HaveVolume HexStr HideDisplay HideKeyboard HideLayer HideLayerFX HidePointer HideScreen Hypot IgnoreCase IIf ImageRequest IncreasePointer InKeyStr InsertItem InsertLayer InsertSample InsertStr InstallEventHandler Intersection Int InvertAlphaChannel InvertBrush InvertMask InvertPalette IPairs IsAbsolutePath IsAlNum IsAlpha IsAnim IsAnimPlaying IsBrushEmpty IsChannelPlaying IsCntrl IsDigit IsDirectory IsFinite IsGraph IsInf IsKeyDown IsLeftMouse IsLower IsMenuItemDisabled IsMenuItemSelected IsMidMouse IsModule IsMusicPlaying IsMusic IsNan IsNil IsOnline IsPathEmpty IsPicture IsPrint IsPunct IsRightMouse IsSamplePlaying IsSample IsSound IsSpace IsTableEmpty IsUnicode IsUpper IsVideo IsVideoPlaying IsXDigit JoyDir JoyFire Label LayerExists LayerToBack LayerToFront Ld LdExp LeftMouseQuit LeftStr LegacyControl Limit Line LineTo ListItems ListRequest Ln LoadAnim LoadAnimFrame LoadBGPic LoadBrush LoadIcon LoadModule LoadPalette LoadPlugin LoadPrefs LoadSample LoadSprite Locate Log LowerStr MakeButton MakeDate MakeDirectory MakeHostPath MatchPattern Max MD5 MD5Str MemToTable MidStr Min MixBrush MixRGB MixSample ModifyAnimFrames ModifyButton ModifyKeyDown ModifyLayerFrames ModulateBrush Mod ModulatePalette MonitorDirectory MouseX MouseY MoveAnim MoveBrush MoveDisplay MoveFile MoveLayer MovePointer MoveSprite MoveTextObject MoveTo Mul NextDirectoryEntry NextFrame NextItem NormalizePath NPrint OilPaintBrush OpenAmigaGuide OpenAnim OpenAudio OpenCatalog OpenConnection OpenDirectory OpenDisplay OpenFile OpenFont OpenMusic OpenResourceMonitor OpenSerialPort OpenURL OpenVideo Pack PadNum Pairs PaletteToGray ParseDate PathItems PathPart PathRequest PathToBrush PatternFindStr PatternFindStrDirect PatternFindStrShort PatternReplaceStr PauseLayer PauseModule PauseMusic PauseTimer PauseVideo PeekClipboard Peek PenArrayToBrush PerformSelector PermissionRequest PerspectiveDistortBrush Pi PixelateBrush PlayAnim PlayAnimDisk PlayLayer PlayModule PlayMusic PlaySample PlaySubsong PlayVideo Plot Poke PolarDistortBrush PollSerialQueue Polygon Pow Print QuantizeBrush Rad RaiseOnError RasterizeBrush RawDiv RawEqual RawGet RawSet ReadBrushPixel ReadByte ReadBytes ReadChr ReadDirectory ReadFloat ReadFunction ReadInt ReadLine ReadMem ReadPen ReadPixel ReadRegistryKey ReadSerialData ReadShort ReadString ReadTable ReceiveData ReceiveUDPData Red ReduceAlphaChannel RefreshDisplay RelCurveTo RelLineTo RelMoveTo RemapBrush RemoveBrushPalette RemoveButton RemoveIconImage RemoveItem RemoveKeyDown RemoveLayer RemoveLayerFX RemoveLayers RemoveSprite RemoveSprites Rename RepeatStr ReplaceColors ReplaceStr ResetKeyStates ResetTabs ResetTimer ResolveHostName ResumeCoroutine ResumeLayer ResumeModule ResumeMusic ResumeTimer ResumeVideo ReverseFindStr ReverseStr RewindDirectory RGB RGBArrayToBrush RightStr Rnd RndF RndStrong Rol Ror RotateBrush RotateLayer RotateTextObject Round Rt Run RunCallback RunRexxScript Sar SaveAnim SaveBrush SaveIcon SavePalette SavePrefs SaveSample SaveSnapshot ScaleAnim ScaleBGPic ScaleBrush ScaleLayer ScaleSprite ScaleTextObject Seek SeekLayer SeekMusic SeekVideo SelectAlphaChannel SelectAnim SelectBGPic SelectBrush SelectDisplay SelectLayer SelectMask SelectMenuItem SelectPalette SendApplicationMessage SendData SendMessage SendRexxCommand SendUDPData SepiaToneBrush SerializeTable SetAlphaIntensity SetAnimFrameDelay SetBaudRate SetBorderPen SetBrushDepth SetBrushPalette SetBrushPen SetBrushTransparency SetBrushTransparentPen SetBulletColor SetBulletPen SetChannelVolume SetClipboard SetClipRegion SetCycleTable SetDash SetDataBits SetDefaultEncoding SetDepth SetDisplayAttributes SetDitherMode SetDrawPen SetDrawTagsDefault SetDTR SetEnv SetEventTimeout SetFileAttributes SetFileEncoding SetFillRule SetFillStyle SetFlowControl SetFont SetFontColor SetFontStyle SetFormStyle SetFPSLimit SetGradientPalette SetIconProperties SetInterval SetIOMode SetLayerAnchor SetLayerBorder SetLayerDepth SetLayerFilter SetLayerLight SetLayerName SetLayerPalette SetLayerPen SetLayerShadow SetLayerStyle SetLayerTint SetLayerTransparency SetLayerTransparentPen SetLayerVolume SetLayerZPos SetLineCap SetLineJoin SetLineWidth SetListItems SetMargins SetMaskMode SetMasterVolume SetMetaTable SetMiterLimit SetMusicVolume SetNetworkProtocol SetNetworkTimeout SetObjectData SetPalette SetPaletteDepth SetPaletteMode SetPalettePen SetPaletteTransparentPen SetPanning SetParity SetPen SetPitch SetPointer SetRTS SetScreenTitle SetShadowPen SetSpriteZPos SetStandardIconImage SetStandardPalette SetStopBits SetSubtitle SetTimeout SetTimerElapse SetTitle SetTransparentPen SetTransparentThreshold SetTrayIcon SetVarType SetVectorEngine SetVideoPosition SetVideoSize SetVideoVolume SetVolume SetWBIcon Sgn SharpenBrush Shl ShowDisplay ShowKeyboard ShowLayer ShowLayerFX ShowNotification ShowPointer ShowRinghioMessage ShowScreen ShowToast Shr Sin SolarizeBrush SolarizePalette Sort SplitStr Sqrt StartPath StartSubPath StartTimer StartsWith StopAnim StopChannel StopLayer StopModule StopMusic StopSample StopTimer StopVideo StringRequest StringToFile StripStr StrLen StrStr StrToArray Sub SwapLayers SwirlBrush SystemRequest TableItems TableToMem Tan TextExtent TextHeight TextOut TextWidth TimerElapsed TimestampToDate TintBrush TintPalette ToHostName ToIP ToNumber ToString ToUserData TransformBrush TransformLayer TranslateLayer TranslatePath TrimBrush TrimStr UndefineVirtualStringFile Undo UndoFX UnleftStr UnmidStr Unpack UnrightStr UnsetEnv UploadFile UpperStr Usage UseCarriageReturn UseFont UTCToDate Val ValidateDate ValidateStr Vibrate VWait Wait WaitAnimEnd WaitEvent WaitKeyDown WaitLeftMouse WaitMidMouse WaitPatternPosition WaitRightMouse WaitSampleEnd WaitSongPosition WaitTimer WaterRippleBrush WhileKeyDown WhileMouseDown WhileMouseOn WhileRightMouseDown Wrap WriteAnimFrame WriteBrushPixel WriteByte WriteBytes WriteChr WriteFloat WriteFunction WriteInt WriteLine WriteMem WritePen WriteRegistryKey WriteSerialData WriteShort WriteString WriteTable YieldCoroutine
+
+" user-defined constants
+syn match hwUserConstant "#\<\u\+\>"
+" user-defined functions
+syn match hwUserFunction "\<p_\w\{-1,}\>("me=e-1
+
+" Comments
+syn keyword hwTodo contained TODO FIXME XXX
+syn match hwComment ";.*$" contains=hwTodo,@Spell
+syn region hwComment matchgroup=hwComment start="/\*" end="\*/" contains=hwTodo,@Spell
+
+
+" Strings
+syn match hwSpecial contained #\\[\\abfnrtvz'"]\|\\x[[:xdigit:]]\{2}\|\\[[:digit:]]\{,3}#
+syn region hwString start=+'+hs=s+1 end=+'+he=e-1 skip=+\\\\\|\\'+ contains=hwSpecial,@Spell
+syn region hwString start=+"+hs=s+1 end=+"+he=e-1 skip=+\\\\\|\\"+ contains=hwSpecial,@Spell
+
+" integer number
+syn match hwNumber "\<\d\+\>"
+" floating point number, with dot, optional exponent
+syn match hwNumber "\<\d\+\.\d*\%([eE][-+]\=\d\+\)\=\>"
+" floating point number, starting with a dot, optional exponent
+syn match hwNumber "\.\d\+\%([eE][-+]\=\d\+\)\=\>"
+" floating point number, without dot, with exponent
+syn match hwNumber "\<\d\+[eE][-+]\=\d\+\>"
+
+" hex numbers
+syn match hwNumber "\<0[xX]\x\+\>"
+syn match hwNumber "\<0[xX][[:xdigit:].]\+\%([pP][-+]\=\d\+\)\=\>"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+hi def link hwPreProcessor PreProc
+hi def link hwStatement Statement
+hi def link hwFallThrough Statement
+hi def link hwRepeat Repeat
+hi def link hwFor Repeat
+hi def link hwString PmenuSel
+hi def link hwNumber Number
+hi def link hwOperator Operator
+hi def link hwStep Operator
+hi def link hwIn Operator
+hi def link hwUserConstant Constant
+hi def link hwConstant Constant
+hi def link hwLineStatement Conditional
+hi def link hwCond Conditional
+hi def link hwElseIf Conditional
+hi def link hwFunction Function
+hi def link hwUserFunction Function
+hi def link hwComment MoreMsg
+hi def link hwTodo Todo
+hi def link hwTable Structure
+hi def link hwError Error
+hi def link hwParenError Error
+hi def link hwBraceError Error
+hi def link hwSpecial SpecialChar
+hi def link hwLabel Label
+
+
+let b:current_syntax = "hollywood"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: et ts=8 sw=2
diff --git a/runtime/syntax/hostconf.vim b/runtime/syntax/hostconf.vim
new file mode 100644
index 0000000..593ed72
--- /dev/null
+++ b/runtime/syntax/hostconf.vim
@@ -0,0 +1,147 @@
+" Vim syntax file
+" Language: host.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-25
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword hostconfTodo
+ \ contained
+ \ TODO
+ \ FIXME
+ \ XXX
+ \ NOTE
+
+syn match hostconfComment
+ \ display
+ \ contained
+ \ '\s*#.*'
+ \ contains=hostconfTodo,
+ \ @Spell
+
+syn match hostconfBegin
+ \ display
+ \ '^'
+ \ nextgroup=hostconfComment,hostconfKeyword
+ \ skipwhite
+
+syn keyword hostconfKeyword
+ \ contained
+ \ order
+ \ nextgroup=hostconfLookupOrder
+ \ skipwhite
+
+let s:orders = ['bind', 'hosts', 'nis']
+
+function s:permute_suffixes(list)
+ if empty(a:list)
+ return []
+ elseif len(a:list) == 1
+ return a:list[0]
+ else
+ let i = 0
+ let n = len(a:list)
+ let sub_permutations = []
+ while i < n
+ let list_copy = copy(a:list)
+ let removed = list_copy[i]
+ call remove(list_copy, i)
+ call add(sub_permutations, [removed, s:permute_suffixes(list_copy)])
+ let i += 1
+ endwhile
+ return sub_permutations
+ endif
+endfunction
+
+function s:generate_suffix_groups(list_of_order_of_orders, context, trailing_context)
+ for order_of_orders in a:list_of_order_of_orders
+ let order = order_of_orders[0]
+ let trailing_context = a:trailing_context . toupper(order[0]) . order[1:]
+ let nextgroup = 'hostconfLookupOrder' . trailing_context
+ let nextgroup_delimiter = nextgroup . 'Delimiter'
+ let group = 'hostconfLookupOrder' . a:context
+ execute 'syn keyword' group 'contained' order 'nextgroup=' . nextgroup_delimiter 'skipwhite'
+ execute 'syn match' nextgroup_delimiter 'contained display "," nextgroup=' . nextgroup 'skipwhite'
+ if a:context != ""
+ execute 'hi def link' group 'hostconfLookupOrder'
+ endif
+ execute 'hi def link' nextgroup_delimiter 'hostconfLookupOrderDelimiter'
+ let context = trailing_context
+ if type(order_of_orders[1]) == type([])
+ call s:generate_suffix_groups(order_of_orders[1], context, trailing_context)
+ else
+ execute 'syn keyword hostconfLookupOrder' . context 'contained' order_of_orders[-1]
+ execute 'hi def link hostconfLookupOrder' . context 'hostconfLookupOrder'
+ endif
+ endfor
+endfunction
+
+call s:generate_suffix_groups(s:permute_suffixes(s:orders), "", "")
+
+delfunction s:generate_suffix_groups
+delfunction s:permute_suffixes
+
+syn keyword hostconfKeyword
+ \ contained
+ \ trim
+ \ nextgroup=hostconfDomain
+ \ skipwhite
+
+syn match hostconfDomain
+ \ contained
+ \ '\.[^:;,[:space:]]\+'
+ \ nextgroup=hostconfDomainDelimiter
+ \ skipwhite
+
+syn match hostconfDomainDelimiter
+ \ contained
+ \ display
+ \ '[:;,]'
+ \ nextgroup=hostconfDomain
+ \ skipwhite
+
+syn keyword hostconfKeyword
+ \ contained
+ \ multi
+ \ nospoof
+ \ spoofalert
+ \ reorder
+ \ nextgroup=hostconfBoolean
+ \ skipwhite
+
+syn keyword hostconfBoolean
+ \ contained
+ \ on
+ \ off
+
+syn keyword hostconfKeyword
+ \ contained
+ \ spoof
+ \ nextgroup=hostconfSpoofValue
+ \ skipwhite
+
+syn keyword hostconfSpoofValue
+ \ contained
+ \ off
+ \ nowarn
+ \ warn
+
+hi def link hostconfTodo Todo
+hi def link hostconfComment Comment
+hi def link hostconfKeyword Keyword
+hi def link hostconfLookupOrder Identifier
+hi def link hostconfLookupOrderDelimiter Delimiter
+hi def link hostconfDomain String
+hi def link hostconfDomainDelimiter Delimiter
+hi def link hostconfBoolean Boolean
+hi def link hostconfSpoofValue hostconfBoolean
+
+let b:current_syntax = "hostconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/hostsaccess.vim b/runtime/syntax/hostsaccess.vim
new file mode 100644
index 0000000..7201816
--- /dev/null
+++ b/runtime/syntax/hostsaccess.vim
@@ -0,0 +1,23 @@
+" Vim syntax file
+" Language: hosts.deny, hosts.allow configuration files
+" Maintainer: Thilo Six <T.Six@gmx.de>
+" Last Change: 2011 May 01
+" Derived From: conf.vim
+" Credits: Bram Moolenaar
+"
+" This file is there to get at least a minimal highlighting.
+" A later version may be improved.
+
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" For a starter we just use conf.vim for highlighting
+runtime! syntax/conf.vim
+unlet b:current_syntax
+
+
+let b:current_syntax = "hostsaccess"
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/html.vim b/runtime/syntax/html.vim
new file mode 100644
index 0000000..82c829a
--- /dev/null
+++ b/runtime/syntax/html.vim
@@ -0,0 +1,359 @@
+" Vim syntax file
+" Language: HTML
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainers: Jorge Maldonado Ventura <jorgesumle@freakspot.net>
+" Claudio Fleiner <claudio@fleiner.com>
+" Last Change: 2023 Feb 20
+
+" Please check :help html.vim for some comments and a description of the options
+
+" quit when a syntax file was already loaded
+if !exists("main_syntax")
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'html'
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syntax spell toplevel
+
+syn include @htmlXml syntax/xml.vim
+unlet b:current_syntax
+
+syn case ignore
+
+" mark illegal characters
+syn match htmlError "[<>&]"
+
+
+" tags
+syn region htmlString contained start=+"+ end=+"+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc
+syn region htmlString contained start=+'+ end=+'+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc
+syn match htmlValue contained "=[\t ]*[^'" \t>][^ \t>]*"hs=s+1 contains=javaScriptExpression,@htmlPreproc
+syn region htmlEndTag start=+</+ end=+>+ contains=htmlTagN,htmlTagError
+syn region htmlTag start=+<[^/]+ end=+>+ fold contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster
+syn match htmlTagN contained +<\s*[-a-zA-Z0-9]\++hs=s+1 contains=htmlTagName,htmlSpecialTagName,@htmlTagNameCluster
+syn match htmlTagN contained +</\s*[-a-zA-Z0-9]\++hs=s+2 contains=htmlTagName,htmlSpecialTagName,@htmlTagNameCluster
+syn match htmlTagError contained "[^>]<"ms=s+1
+
+
+" tag names
+syn keyword htmlTagName contained address applet area a base basefont
+syn keyword htmlTagName contained big blockquote br caption center
+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 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 colgroup
+syn keyword htmlTagName contained del fieldset iframe ins label 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 dialog embed figcaption
+syn keyword htmlTagName contained figure footer header hgroup keygen main
+syn keyword htmlTagName contained mark menuitem meter nav output picture
+syn keyword htmlTagName contained progress rb rp rt rtc ruby section
+syn keyword htmlTagName contained slot source summary template time track
+syn keyword htmlTagName contained video wbr
+
+" svg and math tags
+syn keyword htmlMathTagName contained math
+syn keyword htmlSvgTagName contained svg
+
+syn region htmlMath start="<math>" end="</math>" contains=@htmlXml transparent keepend
+syn region htmlSvg start="<svg>" end="</svg>" contains=@htmlXml transparent keepend
+
+syn cluster xmlTagHook add=htmlMathTagName,htmlSvgTagName
+
+" legal arg names
+syn keyword htmlArg contained action
+syn keyword htmlArg contained align alink alt archive background bgcolor
+syn keyword htmlArg contained border bordercolor cellpadding
+syn keyword htmlArg contained cellspacing checked class clear code codebase color
+syn keyword htmlArg contained cols colspan content coords enctype face
+syn keyword htmlArg contained gutter height hspace id
+syn keyword htmlArg contained link lowsrc marginheight
+syn keyword htmlArg contained marginwidth maxlength method name prompt
+syn keyword htmlArg contained rel rev rows rowspan scrolling selected shape
+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
+exe 'syn match htmlArg contained "\<aria-\%(' . join([
+ \ 'activedescendant', 'atomic', 'autocomplete', 'busy', 'checked', 'colcount',
+ \ 'colindex', 'colspan', 'controls', 'current', 'describedby', 'details',
+ \ 'disabled', 'dropeffect', 'errormessage', 'expanded', 'flowto', 'grabbed',
+ \ 'haspopup', 'hidden', 'invalid', 'keyshortcuts', 'label', 'labelledby', 'level',
+ \ 'live', 'modal', 'multiline', 'multiselectable', 'orientation', 'owns',
+ \ 'placeholder', 'posinset', 'pressed', 'readonly', 'relevant', 'required',
+ \ 'roledescription', 'rowcount', 'rowindex', 'rowspan', 'selected', 'setsize',
+ \ 'sort', 'valuemax', 'valuemin', 'valuenow', '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
+syn keyword htmlArg contained frameborder noresize pagex pagey above below
+syn keyword htmlArg contained left top visibility clip id noshade
+syn match htmlArg contained "\<z-index\>"
+
+" Microsoft extensions
+syn keyword htmlTagName contained marquee
+
+" html 4.0 arg names
+syn match htmlArg contained "\<\%(accept-charset\|label\)\>"
+syn keyword htmlArg contained abbr accept accesskey axis char charoff charset
+syn keyword htmlArg contained cite classid codetype compact data datetime
+syn keyword htmlArg contained declare defer dir disabled for frame
+syn keyword htmlArg contained headers hreflang lang language longdesc
+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 allow autocapitalize as blocking decoding
+syn keyword htmlArg contained enterkeyhint imagesizes imagesrcset inert
+syn keyword htmlArg contained integrity is itemid itemprop itemref itemscope
+syn keyword htmlArg contained itemtype loading nomodule ping playsinline
+syn keyword htmlArg contained referrerpolicy slot allowfullscreen async
+syn keyword htmlArg contained autocomplete autofocus autoplay challenge
+syn keyword htmlArg contained contenteditable contextmenu controls crossorigin
+syn keyword htmlArg contained default dirname download draggable dropzone form
+syn keyword htmlArg contained formaction formenctype formmethod formnovalidate
+syn keyword htmlArg contained formtarget hidden high icon inputmode keytype
+syn keyword htmlArg contained kind list loop low max min minlength muted nonce
+syn keyword htmlArg contained novalidate open optimum pattern placeholder
+syn keyword htmlArg contained poster preload radiogroup required reversed
+syn keyword htmlArg contained sandbox spellcheck sizes srcset srcdoc srclang
+syn keyword htmlArg contained step title translate typemustmatch
+syn match htmlArg contained "\<data-\h\%(\w\|[-.]\)*\%(\_s*=\)\@="
+
+" special characters
+syn match htmlSpecialChar "&#\=[0-9A-Za-z]\{1,8};"
+
+" Comments (the real ones or the old netscape ones)
+if exists("html_wrong_comments")
+ syn region htmlComment start=+<!--+ end=+--\s*>+ contains=@Spell
+else
+ " The HTML 5.2 syntax 8.2.4.41: bogus comment is parser error; browser skips until next &gt
+ syn region htmlComment start=+<!+ end=+>+ contains=htmlCommentError keepend
+ " Idem 8.2.4.42,51: Comment starts with <!-- and ends with -->
+ " Idem 8.2.4.43,44: Except <!--> and <!---> are parser errors
+ " Idem 8.2.4.52: dash-dash-bang (--!>) is error ignored by parser, also closes comment
+ syn region htmlComment matchgroup=htmlComment start=+<!--\%(-\?>\)\@!+ end=+--!\?>+ contains=htmlCommentNested,@htmlPreProc,@Spell keepend
+ " Idem 8.2.4.49: nested comment is parser error, except <!--> is all right
+ syn match htmlCommentNested contained "<!-->\@!"
+ syn match htmlCommentError contained "[^><!]"
+endif
+syn region htmlComment start=+<!DOCTYPE+ end=+>+ keepend
+
+" server-parsed commands
+syn region htmlPreProc start=+<!--#+ end=+-->+ contains=htmlPreStmt,htmlPreError,htmlPreAttr
+syn match htmlPreStmt contained "<!--#\%(config\|echo\|exec\|fsize\|flastmod\|include\|printenv\|set\|if\|elif\|else\|endif\|geoguide\)\>"
+syn match htmlPreError contained "<!--#\S*"ms=s+4
+syn match htmlPreAttr contained "\w\+=[^"]\S\+" contains=htmlPreProcAttrError,htmlPreProcAttrName
+syn region htmlPreAttr contained start=+\w\+="+ skip=+\\\\\|\\"+ end=+"+ contains=htmlPreProcAttrName keepend
+syn match htmlPreProcAttrError contained "\w\+="he=e-1
+syn match htmlPreProcAttrName contained "\%(expr\|errmsg\|sizefmt\|timefmt\|var\|cgi\|cmd\|file\|virtual\|value\)="he=e-1
+
+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\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlStrike start="<s\>" end="</s\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlStrike start="<strike\>" end="</strike\_s*>"me=s-1 contains=@htmlTop
+
+ syn region htmlBold start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop,htmlBoldUnderline,htmlBoldItalic
+ syn region htmlBold start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop,htmlBoldUnderline,htmlBoldItalic
+ syn region htmlBoldUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop,htmlBoldUnderlineItalic
+ syn region htmlBoldItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop,htmlBoldItalicUnderline
+ syn region htmlBoldItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop,htmlBoldItalicUnderline
+ syn region htmlBoldUnderlineItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlBoldUnderlineItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlBoldItalicUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop,htmlBoldUnderlineItalic
+
+ syn region htmlUnderline start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineBold,htmlUnderlineItalic
+ syn region htmlUnderlineBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineBoldItalic
+ syn region htmlUnderlineBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineBoldItalic
+ syn region htmlUnderlineItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineItalicBold
+ syn region htmlUnderlineItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop,htmlUnderlineItalicBold
+ syn region htmlUnderlineItalicBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlUnderlineItalicBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlUnderlineBoldItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlUnderlineBoldItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop
+
+ syn region htmlItalic start="<i\>" end="</i\_s*>"me=s-1 contains=@htmlTop,htmlItalicBold,htmlItalicUnderline
+ syn region htmlItalic start="<em\>" end="</em\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlItalicBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop,htmlItalicBoldUnderline
+ syn region htmlItalicBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop,htmlItalicBoldUnderline
+ syn region htmlItalicBoldUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlItalicUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@htmlTop,htmlItalicUnderlineBold
+ syn region htmlItalicUnderlineBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlItalicUnderlineBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@htmlTop
+
+ syn match htmlLeadingSpace "^\s\+" contained
+ syn region htmlLink start="<a\>\_[^>]*\<href\>" end="</a\_s*>"me=s-1 contains=@Spell,htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,htmlLeadingSpace,javaScript,@htmlPreproc
+ syn region htmlH1 start="<h1\>" end="</h1\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlH2 start="<h2\>" end="</h2\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlH3 start="<h3\>" end="</h3\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlH4 start="<h4\>" end="</h4\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlH5 start="<h5\>" end="</h5\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlH6 start="<h6\>" end="</h6\_s*>"me=s-1 contains=@htmlTop
+ syn region htmlHead start="<head\>" end="</head\_s*>"me=s-1 end="<body\>"me=s-1 end="<h[1-6]\>"me=s-1 contains=htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,htmlLink,htmlTitle,javaScript,cssStyle,@htmlPreproc
+ syn region htmlTitle start="<title\>" end="</title\_s*>"me=s-1 contains=htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,javaScript,@htmlPreproc
+endif
+
+syn keyword htmlTagName contained noscript
+syn keyword htmlSpecialTagName contained script style
+if main_syntax != 'java' || exists("java_javascript")
+ " JAVA SCRIPT
+ syn include @htmlJavaScript syntax/javascript.vim
+ 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
+ hi def link htmlScriptTag htmlTag
+
+ " html events (i.e. arguments that include javascript commands)
+ if exists("html_extended_events")
+ syn region htmlEvent contained start=+\<on\a\+\s*=[\t ]*'+ end=+'+ contains=htmlEventSQ
+ syn region htmlEvent contained start=+\<on\a\+\s*=[\t ]*"+ end=+"+ contains=htmlEventDQ
+ else
+ syn region htmlEvent contained start=+\<on\a\+\s*=[\t ]*'+ end=+'+ keepend contains=htmlEventSQ
+ syn region htmlEvent contained start=+\<on\a\+\s*=[\t ]*"+ end=+"+ keepend contains=htmlEventDQ
+ 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
+ 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
+endif
+
+if main_syntax != 'java' || exists("java_vb")
+ " VB SCRIPT
+ syn include @htmlVbScript syntax/vb.vim
+ unlet b:current_syntax
+ syn region javaScript start=+<script \_[^>]*language *=\_[^>]*vbscript\_[^>]*>+ keepend end=+</script\_[^>]*>+me=s-1 contains=@htmlVbScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc
+endif
+
+syn cluster htmlJavaScript add=@htmlPreproc
+
+if main_syntax != 'java' || exists("java_css")
+ " embedded style sheets
+ syn keyword htmlArg contained media
+ syn include @htmlCss syntax/css.vim
+ unlet b:current_syntax
+ 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
+ hi def link htmlStyleArg htmlString
+endif
+
+if main_syntax == "html"
+ " synchronizing (does not always work if a comment includes legal
+ " html tags, but doing it right would mean to always start
+ " at the first line, which is too slow)
+ syn sync match htmlHighlight groupthere NONE "<[/a-zA-Z]"
+ syn sync match htmlHighlight groupthere javaScript "<script"
+ syn sync match htmlHighlightSkip "^.*['\"].*$"
+ syn sync minlines=10
+endif
+
+" Folding
+" Originally by Ingo Karkat and Marcus Zanona
+if get(g:, "html_syntax_folding", 0)
+ syn region htmlFold start="<\z(\<\%(area\|base\|br\|col\|command\|embed\|hr\|img\|input\|keygen\|link\|meta\|param\|source\|track\|wbr\>\)\@![a-z-]\+\>\)\%(\_s*\_[^/]\?>\|\_s\_[^>]*\_[^>/]>\)" end="</\z1\_s*>" fold transparent keepend extend containedin=htmlHead,htmlH\d
+ " fold comments (the real ones and the old Netscape ones)
+ if exists("html_wrong_comments")
+ syn region htmlComment start=+<!--+ end=+--\s*>\%(\n\s*<!--\)\@!+ contains=@Spell fold
+ endif
+endif
+
+" The default highlighting.
+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 htmlMathTagName htmlTagName
+hi def link htmlSvgTagName htmlTagName
+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
+endif
+
+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 htmlString String
+hi def link htmlStatement Statement
+hi def link htmlComment Comment
+hi def link htmlCommentNested htmlError
+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"
+
+if main_syntax == 'html'
+ unlet main_syntax
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/htmlcheetah.vim b/runtime/syntax/htmlcheetah.vim
new file mode 100644
index 0000000..0721c76
--- /dev/null
+++ b/runtime/syntax/htmlcheetah.vim
@@ -0,0 +1,24 @@
+" Vim syntax file
+" Language: HTML with Cheetah tags
+" Maintainer: Max Ischenko <mfi@ukr.net>
+" Last Change: 2003-05-11
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'html'
+endif
+
+runtime! syntax/cheetah.vim
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+syntax cluster htmlPreproc add=cheetahPlaceHolder
+syntax cluster htmlString add=cheetahPlaceHolder
+
+let b:current_syntax = "htmlcheetah"
+
+
diff --git a/runtime/syntax/htmldjango.vim b/runtime/syntax/htmldjango.vim
new file mode 100644
index 0000000..07b1c37
--- /dev/null
+++ b/runtime/syntax/htmldjango.vim
@@ -0,0 +1,26 @@
+" Vim syntax file
+" Language: Django HTML template
+" Maintainer: Dave Hodder <dmh@dmh.org.uk>
+" Last Change: 2014 Jul 13
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'html'
+endif
+
+runtime! syntax/django.vim
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+syn cluster djangoBlocks add=djangoTagBlock,djangoVarBlock,djangoComment,djangoComBlock
+
+syn region djangoTagBlock start="{%" end="%}" contains=djangoStatement,djangoFilter,djangoArgument,djangoTagError display containedin=ALLBUT,@djangoBlocks
+syn region djangoVarBlock start="{{" end="}}" contains=djangoFilter,djangoArgument,djangoVarError display containedin=ALLBUT,@djangoBlocks
+syn region djangoComment start="{%\s*comment\(\s\+.\{-}\)\?%}" end="{%\s*endcomment\s*%}" contains=djangoTodo containedin=ALLBUT,@djangoBlocks
+syn region djangoComBlock start="{#" end="#}" contains=djangoTodo containedin=ALLBUT,@djangoBlocks
+
+let b:current_syntax = "htmldjango"
diff --git a/runtime/syntax/htmlm4.vim b/runtime/syntax/htmlm4.vim
new file mode 100644
index 0000000..ee1f06e
--- /dev/null
+++ b/runtime/syntax/htmlm4.vim
@@ -0,0 +1,31 @@
+" Vim syntax file
+" Language: HTML and M4
+" Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" URL: http://www.fleiner.com/vim/syntax/htmlm4.vim
+" Last Change: 2001 Apr 30
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" we define it here so that included files can test for it
+if !exists("main_syntax")
+ let main_syntax='htmlm4'
+endif
+
+runtime! syntax/html.vim
+unlet b:current_syntax
+syn case match
+
+runtime! syntax/m4.vim
+
+unlet b:current_syntax
+syn cluster htmlPreproc add=@m4Top
+syn cluster m4StringContents add=htmlTag,htmlEndTag
+
+let b:current_syntax = "htmlm4"
+
+if main_syntax == 'htmlm4'
+ unlet main_syntax
+endif
diff --git a/runtime/syntax/htmlos.vim b/runtime/syntax/htmlos.vim
new file mode 100644
index 0000000..b54ca7a
--- /dev/null
+++ b/runtime/syntax/htmlos.vim
@@ -0,0 +1,149 @@
+" Vim syntax file
+" Language: HTML/OS by Aestiva
+" Maintainer: Jason Rust <jrust@westmont.edu>
+" URL: http://www.rustyparts.com/vim/syntax/htmlos.vim
+" Info: http://www.rustyparts.com/scripts.php
+" Last Change: 2003 May 11
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'htmlos'
+endif
+
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+syn cluster htmlPreproc add=htmlosRegion
+
+syn case ignore
+
+" Function names
+syn keyword htmlosFunctions expand sleep getlink version system ascii getascii syslock sysunlock cr lf clean postprep listtorow split listtocol coltolist rowtolist tabletolist contained
+syn keyword htmlosFunctions cut \display cutall cutx cutallx length reverse lower upper proper repeat left right middle trim trimleft trimright count countx locate locatex replace replacex replaceall replaceallx paste pasteleft pasteleftx pasteleftall pasteleftallx pasteright pasterightall pasterightallx chopleft chopleftx chopright choprightx format concat contained
+syn keyword htmlosFunctions goto exitgoto contained
+syn keyword htmlosFunctions layout cols rows row items getitem putitem switchitems gettable delrow delrows delcol delcols append merge fillcol fillrow filltable pastetable getcol getrow fillindexcol insindexcol dups nodups maxtable mintable maxcol mincol maxrow minrow avetable avecol averow mediantable mediancol medianrow producttable productcol productrow sumtable sumcol sumrow sumsqrtable sumsqrcol sumsqrrow reversecols reverserows switchcols switchrows inscols insrows insfillcol sortcol reversesortcol sortcoln reversesortcoln sortrow sortrown reversesortrow reversesortrown getcoleq getcoleqn getcolnoteq getcolany getcolbegin getcolnotany getcolnotbegin getcolge getcolgt getcolle getcollt getcolgen getcolgtn getcollen getcoltn getcolend getcolnotend getrowend getrownotend getcolin getcolnotin getcolinbegin getcolnotinbegin getcolinend getcolnotinend getrowin getrownotin getrowinbegin getrownotinbegin getrowinend getrownotinend contained
+syn keyword htmlosFunctions dbcreate dbadd dbedit dbdelete dbsearch dbsearchsort dbget dbgetsort dbstatus dbindex dbimport dbfill dbexport dbsort dbgetrec dbremove dbpurge dbfind dbfindsort dbunique dbcopy dbmove dbkill dbtransfer dbpoke dbsearchx dbgetx contained
+syn keyword htmlosFunctions syshtmlosname sysstartname sysfixfile fileinfo filelist fileindex domainname page browser regdomain username usernum getenv httpheader copy file ts row sysls syscp sysmv sysmd sysrd filepush filepushlink dirname contained
+syn keyword htmlosFunctions mail to address subject netmail netmailopen netmailclose mailfilelist netweb netwebresults webpush netsockopen netsockread netsockwrite netsockclose contained
+syn keyword htmlosFunctions today time systime now yesterday tomorrow getday getmonth getyear getminute getweekday getweeknum getyearday getdate gettime getamorpm gethour addhours addminutes adddays timebetween timetill timefrom datetill datefrom mixedtimebetween mixeddatetill mixedtimetill mixedtimefrom mixeddatefrom nextdaybyweekfromdate nextdaybyweekfromtoday nextdaybymonthfromdate nextdaybymonthfromtoday nextdaybyyearfromdate nextdaybyyearfromtoday offsetdaybyweekfromdate offsetdaybyweekfromtoday offsetdaybymonthfromdate offsetdaybymonthfromtoday contained
+syn keyword htmlosFunctions isprivate ispublic isfile isdir isblank iserror iserror iseven isodd istrue isfalse islogical istext istag isnumber isinteger isdate istableeq istableeqx istableeqn isfuture ispast istoday isweekday isweekend issamedate iseq isnoteq isge isle ismod10 isvalidstring contained
+syn keyword htmlosFunctions celtof celtokel ftocel ftokel keltocel keltof cmtoin intocm fttom mtoft fttomile miletoft kmtomile miletokm mtoyd ydtom galtoltr ltrtogal ltrtoqt qttoltr gtooz oztog kgtolb lbtokg mttoton tontomt contained
+syn keyword htmlosFunctions max min abs sign inverse square sqrt cube roundsig round ceiling roundup floor rounddown roundeven rounddowneven roundupeven roundodd roundupodd rounddownodd random factorial summand fibonacci remainder mod radians degrees cos sin tan cotan secant cosecant acos asin atan exp power power10 ln log10 log sinh cosh tanh contained
+syn keyword htmlosFunctions xmldelete xmldeletex xmldeleteattr xmldeleteattrx xmledit xmleditx xmleditvalue xmleditvaluex xmleditattr xmleditattrx xmlinsertbefore xmlinsertbeforex smlinsertafter xmlinsertafterx xmlinsertattr xmlinsertattrx smlget xmlgetx xmlgetvalue xmlgetvaluex xmlgetattrvalue xmlgetattrvaluex xmlgetrec xmlgetrecx xmlgetrecattrvalue xmlgetrecattrvaluex xmlchopleftbefore xmlchopleftbeforex xmlchoprightbefore xmlchoprightbeforex xmlchopleftafter xmlchopleftafterx xmlchoprightafter xmlchoprightafterx xmllocatebefore xmllocatebeforex xmllocateafter xmllocateafterx contained
+
+" Type
+syn keyword htmlosType int str dol flt dat grp contained
+
+" StorageClass
+syn keyword htmlosStorageClass locals contained
+
+" Operator
+syn match htmlosOperator "[-=+/\*!]" contained
+syn match htmlosRelation "[~]" contained
+syn match htmlosRelation "[=~][&!]" contained
+syn match htmlosRelation "[!=<>]=" contained
+syn match htmlosRelation "[<>]" contained
+
+" Comment
+syn region htmlosComment start="#" end="/#" contained
+
+" Conditional
+syn keyword htmlosConditional if then /if to else elif contained
+syn keyword htmlosConditional and or nand nor xor not contained
+" Repeat
+syn keyword htmlosRepeat while do /while for /for contained
+
+" Keyword
+syn keyword htmlosKeyword name value step do rowname colname rownum contained
+
+" Repeat
+syn keyword htmlosLabel case matched /case switch contained
+
+" Statement
+syn keyword htmlosStatement break exit return continue contained
+
+" Identifier
+syn match htmlosIdentifier "\h\w*[\.]*\w*" contained
+
+" Special identifier
+syn match htmlosSpecialIdentifier "[\$@]" contained
+
+" Define
+syn keyword htmlosDefine function overlay contained
+
+" Boolean
+syn keyword htmlosBoolean true false contained
+
+" String
+syn region htmlosStringDouble keepend matchgroup=None start=+"+ end=+"+ contained
+syn region htmlosStringSingle keepend matchgroup=None start=+'+ end=+'+ contained
+
+" Number
+syn match htmlosNumber "-\=\<\d\+\>" contained
+
+" Float
+syn match htmlosFloat "\(-\=\<\d+\|-\=\)\.\d\+\>" contained
+
+" Error
+syn match htmlosError "ERROR" contained
+
+" Parent
+syn match htmlosParent "[({[\]})]" contained
+
+" Todo
+syn keyword htmlosTodo TODO Todo todo contained
+
+syn cluster htmlosInside contains=htmlosComment,htmlosFunctions,htmlosIdentifier,htmlosSpecialIdentifier,htmlosConditional,htmlosRepeat,htmlosLabel,htmlosStatement,htmlosOperator,htmlosRelation,htmlosStringSingle,htmlosStringDouble,htmlosNumber,htmlosFloat,htmlosError,htmlosKeyword,htmlosType,htmlosBoolean,htmlosParent
+
+syn cluster htmlosTop contains=@htmlosInside,htmlosDefine,htmlosError,htmlosStorageClass
+
+syn region htmlosRegion keepend matchgroup=Delimiter start="<<" skip=+".\{-}?>.\{-}"\|'.\{-}?>.\{-}'\|/\*.\{-}?>.\{-}\*/+ end=">>" contains=@htmlosTop
+syn region htmlosRegion keepend matchgroup=Delimiter start="\[\[" skip=+".\{-}?>.\{-}"\|'.\{-}?>.\{-}'\|/\*.\{-}?>.\{-}\*/+ end="\]\]" contains=@htmlosTop
+
+
+" sync
+if exists("htmlos_minlines")
+ exec "syn sync minlines=" . htmlos_minlines
+else
+ syn sync minlines=100
+endif
+
+" Define the default highlighting.
+" 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'
+ unlet main_syntax
+endif
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/i3config.vim b/runtime/syntax/i3config.vim
new file mode 100644
index 0000000..caef244
--- /dev/null
+++ b/runtime/syntax/i3config.vim
@@ -0,0 +1,264 @@
+" Vim syntax file
+" Language: i3 config file
+" Original Author: Mohamed Boughaba <mohamed dot bgb at gmail dot com>
+" Maintainer: Quentin Hibon (github user hiqua)
+" Version: 0.4
+" Last Change: 2022 Jun 05
+
+" References:
+" http://i3wm.org/docs/userguide.html#configuring
+" http://vimdoc.sourceforge.net/htmldoc/syntax.html
+"
+"
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+scriptencoding utf-8
+
+" Error
+syn match i3ConfigError /.*/
+
+" Todo
+syn keyword i3ConfigTodo TODO FIXME XXX contained
+
+" Comment
+" Comments are started with a # and can only be used at the beginning of a line
+syn match i3ConfigComment /^\s*#.*$/ contains=i3ConfigTodo
+
+" Font
+" A FreeType font description is composed by:
+" a font family, a style, a weight, a variant, a stretch and a size.
+syn match i3ConfigFontSeparator /,/ contained
+syn match i3ConfigFontSeparator /:/ contained
+syn keyword i3ConfigFontKeyword font contained
+syn match i3ConfigFontNamespace /\w\+:/ contained contains=i3ConfigFontSeparator
+syn match i3ConfigFontContent /-\?\w\+\(-\+\|\s\+\|,\)/ contained contains=i3ConfigFontNamespace,i3ConfigFontSeparator,i3ConfigFontKeyword
+syn match i3ConfigFontSize /\s\=\d\+\(px\)\?\s\?$/ contained
+syn match i3ConfigFont /^\s*font\s\+.*$/ contains=i3ConfigFontContent,i3ConfigFontSeparator,i3ConfigFontSize,i3ConfigFontNamespace
+syn match i3ConfigFont /^\s*font\s\+.*\(\\\_.*\)\?$/ contains=i3ConfigFontContent,i3ConfigFontSeparator,i3ConfigFontSize,i3ConfigFontNamespace
+syn match i3ConfigFont /^\s*font\s\+.*\(\\\_.*\)\?[^\\]\+$/ contains=i3ConfigFontContent,i3ConfigFontSeparator,i3ConfigFontSize,i3ConfigFontNamespace
+syn match i3ConfigFont /^\s*font\s\+\(\(.*\\\_.*\)\|\(.*[^\\]\+$\)\)/ contains=i3ConfigFontContent,i3ConfigFontSeparator,i3ConfigFontSize,i3ConfigFontNamespace
+
+" variables
+syn match i3ConfigString /\(['"]\)\(.\{-}\)\1/ contained
+syn match i3ConfigColor /#\w\{6}/ contained
+syn match i3ConfigVariableModifier /+/ contained
+syn match i3ConfigVariableAndModifier /+\w\+/ contained contains=i3ConfigVariableModifier
+syn match i3ConfigVariable /\$\w\+\(\(-\w\+\)\+\)\?\(\s\|+\)\?/ contains=i3ConfigVariableModifier,i3ConfigVariableAndModifier
+syn keyword i3ConfigInitializeKeyword set contained
+syn match i3ConfigInitialize /^\s*set\s\+.*$/ contains=i3ConfigVariable,i3ConfigInitializeKeyword,i3ConfigColor,i3ConfigString
+
+" Include
+syn keyword i3ConfigIncludeKeyword include contained
+syn match i3ConfigInclude /^\s*include\s\+.*$/ contains=i3ConfigIncludeKeyword,i3ConfigString,i3ConfigVariable
+
+" Gaps
+syn keyword i3ConfigGapStyleKeyword inner outer horizontal vertical top right bottom left current all set plus minus toggle up down contained
+syn match i3ConfigGapStyle /^\s*\(gaps\)\s\+\(inner\|outer\|horizontal\|vertical\|left\|top\|right\|bottom\)\(\s\+\(current\|all\)\)\?\(\s\+\(set\|plus\|minus\|toggle\)\)\?\(\s\+\(-\?\d\+\|\$.*\)\)$/ contains=i3ConfigGapStyleKeyword,i3ConfigNumber,i3ConfigVariable
+syn keyword i3ConfigSmartGapKeyword on inverse_outer off contained
+syn match i3ConfigSmartGap /^\s*smart_gaps\s\+\(on\|inverse_outer\|off\)\s\?$/ contains=i3ConfigSmartGapKeyword
+syn keyword i3ConfigSmartBorderKeyword on no_gaps contained
+syn match i3ConfigSmartBorder /^\s*smart_borders\s\+\(on\|no_gaps\)\s\?$/ contains=i3ConfigSmartBorderKeyword
+
+" Keyboard bindings
+syn keyword i3ConfigAction toggle fullscreen restart key import kill shrink grow contained
+syn keyword i3ConfigAction focus move grow height width split layout resize restore reload mute unmute exit mode workspace container to contained
+syn match i3ConfigModifier /\w\++\w\+\(\(+\w\+\)\+\)\?/ contained contains=i3ConfigVariableModifier
+syn match i3ConfigNumber /\s\d\+/ contained
+syn match i3ConfigUnit /\sp\(pt\|x\)/ contained
+syn match i3ConfigUnitOr /\sor/ contained
+syn keyword i3ConfigBindKeyword bindsym bindcode exec gaps border contained
+syn match i3ConfigBindArgument /--\w\+\(\(-\w\+\)\+\)\?\s/ contained
+syn match i3ConfigBind /^\s*\(bindsym\|bindcode\)\s\+.*$/ contains=i3ConfigVariable,i3ConfigBindKeyword,i3ConfigVariableAndModifier,i3ConfigNumber,i3ConfigUnit,i3ConfigUnitOr,i3ConfigBindArgument,i3ConfigModifier,i3ConfigAction,i3ConfigString,i3ConfigGapStyleKeyword,i3ConfigBorderStyleKeyword
+
+" Floating
+syn keyword i3ConfigSizeSpecial x contained
+syn match i3ConfigNegativeSize /-/ contained
+syn match i3ConfigSize /-\?\d\+\s\?x\s\?-\?\d\+/ contained contains=i3ConfigSizeSpecial,i3ConfigNumber,i3ConfigNegativeSize
+syn match i3ConfigFloatingModifier /^\s*floating_modifier\s\+\$\w\+\d\?/ contains=i3ConfigVariable
+syn match i3ConfigFloating /^\s*floating_\(maximum\|minimum\)_size\s\+-\?\d\+\s\?x\s\?-\?\d\+/ contains=i3ConfigSize
+
+" Orientation
+syn keyword i3ConfigOrientationKeyword vertical horizontal auto contained
+syn match i3ConfigOrientation /^\s*default_orientation\s\+\(vertical\|horizontal\|auto\)\s\?$/ contains=i3ConfigOrientationKeyword
+
+" Layout
+syn keyword i3ConfigLayoutKeyword default stacking tabbed contained
+syn match i3ConfigLayout /^\s*workspace_layout\s\+\(default\|stacking\|tabbed\)\s\?$/ contains=i3ConfigLayoutKeyword
+
+" Border style
+syn keyword i3ConfigBorderStyleKeyword none normal pixel contained
+syn match i3ConfigBorderStyle /^\s*\(new_window\|new_float\|default_border\|default_floating_border\)\s\+\(none\|\(normal\|pixel\)\(\s\+\d\+\)\?\(\s\+\$\w\+\(\(-\w\+\)\+\)\?\(\s\|+\)\?\)\?\)\s\?$/ contains=i3ConfigBorderStyleKeyword,i3ConfigNumber,i3ConfigVariable
+
+" Hide borders and edges
+syn keyword i3ConfigEdgeKeyword none vertical horizontal both smart smart_no_gaps contained
+syn match i3ConfigEdge /^\s*hide_edge_borders\s\+\(none\|vertical\|horizontal\|both\|smart\|smart_no_gaps\)\s\?$/ contains=i3ConfigEdgeKeyword
+
+" Arbitrary commands for specific windows (for_window)
+syn keyword i3ConfigCommandKeyword for_window contained
+syn region i3ConfigWindowStringSpecial start=+"+ skip=+\\"+ end=+"+ contained contains=i3ConfigString
+syn region i3ConfigWindowCommandSpecial start="\[" end="\]" contained contains=i3ConfigWindowStringSpacial,i3ConfigString
+syn match i3ConfigArbitraryCommand /^\s*for_window\s\+.*$/ contains=i3ConfigWindowCommandSpecial,i3ConfigCommandKeyword,i3ConfigBorderStyleKeyword,i3ConfigLayoutKeyword,i3ConfigOrientationKeyword,Size,i3ConfigNumber
+
+" Disable focus open opening
+syn keyword i3ConfigNoFocusKeyword no_focus contained
+syn match i3ConfigDisableFocus /^\s*no_focus\s\+.*$/ contains=i3ConfigWindowCommandSpecial,i3ConfigNoFocusKeyword
+
+" Move client to specific workspace automatically
+syn keyword i3ConfigAssignKeyword assign contained
+syn match i3ConfigAssignSpecial /→/ contained
+syn match i3ConfigAssign /^\s*assign\s\+.*$/ contains=i3ConfigAssignKeyword,i3ConfigWindowCommandSpecial,i3ConfigAssignSpecial
+
+" X resources
+syn keyword i3ConfigResourceKeyword set_from_resource contained
+syn match i3ConfigResource /^\s*set_from_resource\s\+.*$/ contains=i3ConfigResourceKeyword,i3ConfigWindowCommandSpecial,i3ConfigColor,i3ConfigVariable
+
+" Auto start applications
+syn keyword i3ConfigExecKeyword exec exec_always contained
+syn match i3ConfigNoStartupId /--no-startup-id/ contained " We are not using i3ConfigBindArgument as only no-startup-id is supported here
+syn match i3ConfigExec /^\s*exec\(_always\)\?\s\+.*$/ contains=i3ConfigExecKeyword,i3ConfigNoStartupId,i3ConfigString
+
+" Automatically putting workspaces on specific screens
+syn keyword i3ConfigWorkspaceKeyword workspace contained
+syn keyword i3ConfigOutput output contained
+syn match i3ConfigWorkspace /^\s*workspace\s\+.*$/ contains=i3ConfigWorkspaceKeyword,i3ConfigNumber,i3ConfigString,i3ConfigOutput
+
+" Changing colors
+syn keyword i3ConfigClientColorKeyword client focused focused_inactive unfocused urgent placeholder background contained
+syn match i3ConfigClientColor /^\s*client.\w\+\s\+.*$/ contains=i3ConfigClientColorKeyword,i3ConfigColor,i3ConfigVariable
+
+syn keyword i3ConfigTitleAlignKeyword left center right contained
+syn match i3ConfigTitleAlign /^\s*title_align\s\+.*$/ contains=i3ConfigTitleAlignKeyword
+
+" Interprocess communication
+syn match i3ConfigInterprocessKeyword /ipc-socket/ contained
+syn match i3ConfigInterprocess /^\s*ipc-socket\s\+.*$/ contains=i3ConfigInterprocessKeyword
+
+" Mouse warping
+syn keyword i3ConfigMouseWarpingKeyword mouse_warping contained
+syn keyword i3ConfigMouseWarpingType output none contained
+syn match i3ConfigMouseWarping /^\s*mouse_warping\s\+\(output\|none\)\s\?$/ contains=i3ConfigMouseWarpingKeyword,i3ConfigMouseWarpingType
+
+" Focus follows mouse
+syn keyword i3ConfigFocusFollowsMouseKeyword focus_follows_mouse contained
+syn keyword i3ConfigFocusFollowsMouseType yes no contained
+syn match i3ConfigFocusFollowsMouse /^\s*focus_follows_mouse\s\+\(yes\|no\)\s\?$/ contains=i3ConfigFocusFollowsMouseKeyword,i3ConfigFocusFollowsMouseType
+
+" Popups during fullscreen mode
+syn keyword i3ConfigPopupOnFullscreenKeyword popup_during_fullscreen contained
+syn keyword i3ConfigPopuponFullscreenType smart ignore leave_fullscreen contained
+syn match i3ConfigPopupOnFullscreen /^\s*popup_during_fullscreen\s\+\w\+\s\?$/ contains=i3ConfigPopupOnFullscreenKeyword,i3ConfigPopupOnFullscreenType
+
+" Focus wrapping
+syn keyword i3ConfigFocusWrappingKeyword force_focus_wrapping focus_wrapping contained
+syn keyword i3ConfigFocusWrappingType yes no contained
+syn match i3ConfigFocusWrapping /^\s*\(force_\)\?focus_wrapping\s\+\(yes\|no\)\s\?$/ contains=i3ConfigFocusWrappingType,i3ConfigFocusWrappingKeyword
+
+" Forcing Xinerama
+syn keyword i3ConfigForceXineramaKeyword force_xinerama contained
+syn match i3ConfigForceXinerama /^\s*force_xinerama\s\+\(yes\|no\)\s\?$/ contains=i3ConfigFocusWrappingType,i3ConfigForceXineramaKeyword
+
+" Automatic back-and-forth when switching to the current workspace
+syn keyword i3ConfigAutomaticSwitchKeyword workspace_auto_back_and_forth contained
+syn match i3ConfigAutomaticSwitch /^\s*workspace_auto_back_and_forth\s\+\(yes\|no\)\s\?$/ contains=i3ConfigFocusWrappingType,i3ConfigAutomaticSwitchKeyword
+
+" Delay urgency hint
+syn keyword i3ConfigTimeUnit ms contained
+syn keyword i3ConfigDelayUrgencyKeyword force_display_urgency_hint contained
+syn match i3ConfigDelayUrgency /^\s*force_display_urgency_hint\s\+\d\+\s\+ms\s\?$/ contains=i3ConfigFocusWrappingType,i3ConfigDelayUrgencyKeyword,i3ConfigNumber,i3ConfigTimeUnit
+
+" Focus on window activation
+syn keyword i3ConfigFocusOnActivationKeyword focus_on_window_activation contained
+syn keyword i3ConfigFocusOnActivationType smart urgent focus none contained
+syn match i3ConfigFocusOnActivation /^\s*focus_on_window_activation\s\+\(smart\|urgent\|focus\|none\)\s\?$/ contains=i3ConfigFocusOnActivationKeyword,i3ConfigFocusOnActivationType
+
+" Automatic back-and-forth when switching to the current workspace
+syn keyword i3ConfigDrawingMarksKeyword show_marks contained
+syn match i3ConfigDrawingMarks /^\s*show_marks\s\+\(yes\|no\)\s\?$/ contains=i3ConfigFocusWrappingType,i3ConfigDrawingMarksKeyword
+
+" Group mode/bar
+syn keyword i3ConfigBlockKeyword mode bar colors i3bar_command status_command position exec mode hidden_state modifier id position output background statusline tray_output tray_padding separator separator_symbol workspace_min_width workspace_buttons strip_workspace_numbers binding_mode_indicator focused_workspace active_workspace inactive_workspace urgent_workspace binding_mode contained
+syn region i3ConfigBlock start=+^\s*[^#]*s\?{$+ end=+^\s*[^#]*}$+ contains=i3ConfigBlockKeyword,i3ConfigString,i3ConfigBind,i3ConfigComment,i3ConfigFont,i3ConfigFocusWrappingType,i3ConfigColor,i3ConfigVariable transparent keepend extend
+
+" Line continuation
+syn region i3ConfigLineCont start=/^.*\\$/ end=/^.*$/ contains=i3ConfigBlockKeyword,i3ConfigString,i3ConfigBind,i3ConfigComment,i3ConfigFont,i3ConfigFocusWrappingType,i3ConfigColor,i3ConfigVariable transparent keepend extend
+
+" Define the highlighting.
+hi def link i3ConfigError Error
+hi def link i3ConfigTodo Todo
+hi def link i3ConfigComment Comment
+hi def link i3ConfigFontContent Type
+hi def link i3ConfigFocusOnActivationType Type
+hi def link i3ConfigPopupOnFullscreenType Type
+hi def link i3ConfigOrientationKeyword Type
+hi def link i3ConfigMouseWarpingType Type
+hi def link i3ConfigFocusFollowsMouseType Type
+hi def link i3ConfigGapStyleKeyword Type
+hi def link i3ConfigTitleAlignKeyword Type
+hi def link i3ConfigSmartGapKeyword Type
+hi def link i3ConfigSmartBorderKeyword Type
+hi def link i3ConfigLayoutKeyword Type
+hi def link i3ConfigBorderStyleKeyword Type
+hi def link i3ConfigEdgeKeyword Type
+hi def link i3ConfigAction Type
+hi def link i3ConfigCommand Type
+hi def link i3ConfigOutput Type
+hi def link i3ConfigWindowCommandSpecial Type
+hi def link i3ConfigFocusWrappingType Type
+hi def link i3ConfigUnitOr Type
+hi def link i3ConfigFontSize Constant
+hi def link i3ConfigColor Constant
+hi def link i3ConfigNumber Constant
+hi def link i3ConfigUnit Constant
+hi def link i3ConfigVariableAndModifier Constant
+hi def link i3ConfigTimeUnit Constant
+hi def link i3ConfigModifier Constant
+hi def link i3ConfigString Constant
+hi def link i3ConfigNegativeSize Constant
+hi def link i3ConfigInclude Constant
+hi def link i3ConfigFontSeparator Special
+hi def link i3ConfigVariableModifier Special
+hi def link i3ConfigSizeSpecial Special
+hi def link i3ConfigWindowSpecial Special
+hi def link i3ConfigAssignSpecial Special
+hi def link i3ConfigFontNamespace PreProc
+hi def link i3ConfigBindArgument PreProc
+hi def link i3ConfigNoStartupId PreProc
+hi def link i3ConfigIncludeKeyword Identifier
+hi def link i3ConfigFontKeyword Identifier
+hi def link i3ConfigBindKeyword Identifier
+hi def link i3ConfigOrientation Identifier
+hi def link i3ConfigGapStyle Identifier
+hi def link i3ConfigTitleAlign Identifier
+hi def link i3ConfigSmartGap Identifier
+hi def link i3ConfigSmartBorder Identifier
+hi def link i3ConfigLayout Identifier
+hi def link i3ConfigBorderStyle Identifier
+hi def link i3ConfigEdge Identifier
+hi def link i3ConfigFloating Identifier
+hi def link i3ConfigFloatingModifier Identifier
+hi def link i3ConfigCommandKeyword Identifier
+hi def link i3ConfigNoFocusKeyword Identifier
+hi def link i3ConfigInitializeKeyword Identifier
+hi def link i3ConfigAssignKeyword Identifier
+hi def link i3ConfigResourceKeyword Identifier
+hi def link i3ConfigExecKeyword Identifier
+hi def link i3ConfigWorkspaceKeyword Identifier
+hi def link i3ConfigClientColorKeyword Identifier
+hi def link i3ConfigInterprocessKeyword Identifier
+hi def link i3ConfigMouseWarpingKeyword Identifier
+hi def link i3ConfigFocusFollowsMouseKeyword Identifier
+hi def link i3ConfigPopupOnFullscreenKeyword Identifier
+hi def link i3ConfigFocusWrappingKeyword Identifier
+hi def link i3ConfigForceXineramaKeyword Identifier
+hi def link i3ConfigAutomaticSwitchKeyword Identifier
+hi def link i3ConfigDelayUrgencyKeyword Identifier
+hi def link i3ConfigFocusOnActivationKeyword Identifier
+hi def link i3ConfigDrawingMarksKeyword Identifier
+hi def link i3ConfigBlockKeyword Identifier
+hi def link i3ConfigVariable Statement
+hi def link i3ConfigArbitraryCommand Type
+
+let b:current_syntax = "i3config"
diff --git a/runtime/syntax/ia64.vim b/runtime/syntax/ia64.vim
new file mode 100644
index 0000000..2ff4606
--- /dev/null
+++ b/runtime/syntax/ia64.vim
@@ -0,0 +1,293 @@
+" Vim syntax file
+" Language: IA-64 (Itanium) assembly language
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Parth Malwankar <pmalwankar@yahoo.com>
+" File Version: 0.8
+" Last Change: 2020 Sep 25
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+"ignore case for assembly
+syn case ignore
+
+syn sync minlines=5
+
+" Read the MASM syntax to start with
+" This is needed as both IA-64 as well as IA-32 instructions are supported
+source <sfile>:p:h/masm.vim
+
+" Identifier Keyword characters (defines \k)
+syn iskeyword @,48-57,#,$,.,:,?,@-@,_,~
+
+syn region ia64Comment start="//" end="$" contains=ia64Todo
+syn region ia64Comment start="/\*" end="\*/" contains=ia64Todo
+
+syn match ia64Identifier "[a-zA-Z_$][a-zA-Z0-9_$]*"
+syn match ia64Directive "\.[a-zA-Z_$][a-zA-Z_$.]\+"
+syn match ia64Label "[a-zA-Z_$.][a-zA-Z0-9_$.]*\s\=:\>"he=e-1
+syn match ia64Label "[a-zA-Z_$.][a-zA-Z0-9_$.]*\s\=::\>"he=e-2
+syn match ia64Label "[a-zA-Z_$.][a-zA-Z0-9_$.]*\s\=#\>"he=e-1
+syn region ia64string start=+L\="+ skip=+\\\\\|\\"+ end=+"+
+syn match ia64Octal "0[0-7_]*\>"
+syn match ia64Binary "0[bB][01_]*\>"
+syn match ia64Hex "0[xX][0-9a-fA-F_]*\>"
+syn match ia64Decimal "[1-9_][0-9_]*\>"
+syn match ia64Float "[0-9_]*\.[0-9_]*\([eE][+-]\=[0-9_]*\)\=\>"
+
+"simple instructions
+syn keyword ia64opcode add adds addl addp4 alloc and andcm cover epc
+syn keyword ia64opcode fabs fand fandcm fc flushrs fneg fnegabs for
+syn keyword ia64opcode fpabs fpack fpneg fpnegabs fselect fand fabdcm
+syn keyword ia64opcode fc fwb fxor loadrs movl mux1 mux2 or padd4
+syn keyword ia64opcode pavgsub1 pavgsub2 popcnt psad1 pshl2 pshl4 pshladd2
+syn keyword ia64opcode pshradd2 psub4 rfi rsm rum shl shladd shladdp4
+syn keyword ia64opcode shrp ssm sub sum sync.i tak thash
+syn keyword ia64opcode tpa ttag xor
+
+"put to override these being recognized as floats. They are orignally from masm.vim
+"put here to avoid confusion with float
+syn match ia64Directive "\.186"
+syn match ia64Directive "\.286"
+syn match ia64Directive "\.286c"
+syn match ia64Directive "\.286p"
+syn match ia64Directive "\.287"
+syn match ia64Directive "\.386"
+syn match ia64Directive "\.386c"
+syn match ia64Directive "\.386p"
+syn match ia64Directive "\.387"
+syn match ia64Directive "\.486"
+syn match ia64Directive "\.486c"
+syn match ia64Directive "\.486p"
+syn match ia64Directive "\.8086"
+syn match ia64Directive "\.8087"
+
+
+
+"delimiters
+syn match ia64delimiter ";;"
+
+"operators
+syn match ia64operators "[\[\]()#,]"
+syn match ia64operators "\(+\|-\|=\)"
+
+"TODO
+syn match ia64Todo "\(TODO\|XXX\|FIXME\|NOTE\)"
+
+"What follows is a long list of regular expressions for parsing the
+"ia64 instructions that use many completers
+
+"br
+syn match ia64opcode "br\(\(\.\(cond\|call\|ret\|ia\|cloop\|ctop\|cexit\|wtop\|wexit\)\)\=\(\.\(spnt\|dpnt\|sptk\|dptk\)\)\=\(\.few\|\.many\)\=\(\.clr\)\=\)\=\>"
+"break
+syn match ia64opcode "break\(\.[ibmfx]\)\=\>"
+"brp
+syn match ia64opcode "brp\(\.\(sptk\|dptk\|loop\|exit\)\)\(\.imp\)\=\>"
+syn match ia64opcode "brp\.ret\(\.\(sptk\|dptk\)\)\{1}\(\.imp\)\=\>"
+"bsw
+syn match ia64opcode "bsw\.[01]\>"
+"chk
+syn match ia64opcode "chk\.\(s\(\.[im]\)\=\)\>"
+syn match ia64opcode "chk\.a\.\(clr\|nc\)\>"
+"clrrrb
+syn match ia64opcode "clrrrb\(\.pr\)\=\>"
+"cmp/cmp4
+syn match ia64opcode "cmp4\=\.\(eq\|ne\|l[te]\|g[te]\|[lg]tu\|[lg]eu\)\(\.unc\)\=\>"
+syn match ia64opcode "cmp4\=\.\(eq\|[lgn]e\|[lg]t\)\.\(\(or\(\.andcm\|cm\)\=\)\|\(and\(\(\.or\)\=cm\)\=\)\)\>"
+"cmpxchg
+syn match ia64opcode "cmpxchg[1248]\.\(acq\|rel\)\(\.nt1\|\.nta\)\=\>"
+"czx
+syn match ia64opcode "czx[12]\.[lr]\>"
+"dep
+syn match ia64opcode "dep\(\.z\)\=\>"
+"extr
+syn match ia64opcode "extr\(\.u\)\=\>"
+"fadd
+syn match ia64opcode "fadd\(\.[sd]\)\=\(\.s[0-3]\)\=\>"
+"famax/famin
+syn match ia64opcode "fa\(max\|min\)\(\.s[0-3]\)\=\>"
+"fchkf/fmax/fmin
+syn match ia64opcode "f\(chkf\|max\|min\)\(\.s[0-3]\)\=\>"
+"fclass
+syn match ia64opcode "fclass\(\.n\=m\)\(\.unc\)\=\>"
+"fclrf/fpamax
+syn match ia64opcode "f\(clrf\|pamax\|pamin\)\(\.s[0-3]\)\=\>"
+"fcmp
+syn match ia64opcode "fcmp\.\(n\=[lg][te]\|n\=eq\|\(un\)\=ord\)\(\.unc\)\=\(\.s[0-3]\)\=\>"
+"fcvt/fcvt.xf/fcvt.xuf.pc.sf
+syn match ia64opcode "fcvt\.\(\(fxu\=\(\.trunc\)\=\(\.s[0-3]\)\=\)\|\(xf\|xuf\(\.[sd]\)\=\(\.s[0-3]\)\=\)\)\>"
+"fetchadd
+syn match ia64opcode "fetchadd[48]\.\(acq\|rel\)\(\.nt1\|\.nta\)\=\>"
+"fma/fmpy/fms
+syn match ia64opcode "fm\([as]\|py\)\(\.[sd]\)\=\(\.s[0-3]\)\=\>"
+"fmerge/fpmerge
+syn match ia64opcode "fp\=merge\.\(ns\|se\=\)\>"
+"fmix
+syn match ia64opcode "fmix\.\(lr\|[lr]\)\>"
+"fnma/fnorm/fnmpy
+syn match ia64opcode "fn\(ma\|mpy\|orm\)\(\.[sd]\)\=\(\.s[0-3]\)\=\>"
+"fpcmp
+syn match ia64opcode "fpcmp\.\(n\=[lg][te]\|n\=eq\|\(un\)\=ord\)\(\.s[0-3]\)\=\>"
+"fpcvt
+syn match ia64opcode "fpcvt\.fxu\=\(\(\.trunc\)\=\(\.s[0-3]\)\=\)\>"
+"fpma/fpmax/fpmin/fpmpy/fpms/fpnma/fpnmpy/fprcpa/fpsqrta
+syn match ia64opcode "fp\(max\=\|min\|n\=mpy\|ms\|nma\|rcpa\|sqrta\)\(\.s[0-3]\)\=\>"
+"frcpa/frsqrta
+syn match ia64opcode "fr\(cpa\|sqrta\)\(\.s[0-3]\)\=\>"
+"fsetc/famin/fchkf
+syn match ia64opcode "f\(setc\|amin\|chkf\)\(\.s[0-3]\)\=\>"
+"fsub
+syn match ia64opcode "fsub\(\.[sd]\)\=\(\.s[0-3]\)\=\>"
+"fswap
+syn match ia64opcode "fswap\(\.n[lr]\=\)\=\>"
+"fsxt
+syn match ia64opcode "fsxt\.[lr]\>"
+"getf
+syn match ia64opcode "getf\.\([sd]\|exp\|sig\)\>"
+"invala
+syn match ia64opcode "invala\(\.[ae]\)\=\>"
+"itc/itr
+syn match ia64opcode "it[cr]\.[id]\>"
+"ld
+syn match ia64opcode "ld[1248]\>\|ld[1248]\(\.\(sa\=\|a\|c\.\(nc\|clr\(\.acq\)\=\)\|acq\|bias\)\)\=\(\.nt[1a]\)\=\>"
+syn match ia64opcode "ld8\.fill\(\.nt[1a]\)\=\>"
+"ldf
+syn match ia64opcode "ldf[sde8]\(\(\.\(sa\=\|a\|c\.\(nc\|clr\)\)\)\=\(\.nt[1a]\)\=\)\=\>"
+syn match ia64opcode "ldf\.fill\(\.nt[1a]\)\=\>"
+"ldfp
+syn match ia64opcode "ldfp[sd8]\(\(\.\(sa\=\|a\|c\.\(nc\|clr\)\)\)\=\(\.nt[1a]\)\=\)\=\>"
+"lfetch
+syn match ia64opcode "lfetch\(\.fault\(\.excl\)\=\|\.excl\)\=\(\.nt[12a]\)\=\>"
+"mf
+syn match ia64opcode "mf\(\.a\)\=\>"
+"mix
+syn match ia64opcode "mix[124]\.[lr]\>"
+"mov
+syn match ia64opcode "mov\(\.[im]\)\=\>"
+syn match ia64opcode "mov\(\.ret\)\=\(\(\.sptk\|\.dptk\)\=\(\.imp\)\=\)\=\>"
+"nop
+syn match ia64opcode "nop\(\.[ibmfx]\)\=\>"
+"pack
+syn match ia64opcode "pack\(2\.[su]ss\|4\.sss\)\>"
+"padd //padd4 added to keywords
+syn match ia64opcode "padd[12]\(\.\(sss\|uus\|uuu\)\)\=\>"
+"pavg
+syn match ia64opcode "pavg[12]\(\.raz\)\=\>"
+"pcmp
+syn match ia64opcode "pcmp[124]\.\(eq\|gt\)\>"
+"pmax/pmin
+syn match ia64opcode "pm\(ax\|in\)\(\(1\.u\)\|2\)\>"
+"pmpy
+syn match ia64opcode "pmpy2\.[rl]\>"
+"pmpyshr
+syn match ia64opcode "pmpyshr2\(\.u\)\=\>"
+"probe
+syn match ia64opcode "probe\.[rw]\>"
+syn match ia64opcode "probe\.\(\(r\|w\|rw\)\.fault\)\>"
+"pshr
+syn match ia64opcode "pshr[24]\(\.u\)\=\>"
+"psub
+syn match ia64opcode "psub[12]\(\.\(sss\|uu[su]\)\)\=\>"
+"ptc
+syn match ia64opcode "ptc\.\(l\|e\|ga\=\)\>"
+"ptr
+syn match ia64opcode "ptr\.\(d\|i\)\>"
+"setf
+syn match ia64opcode "setf\.\(s\|d\|exp\|sig\)\>"
+"shr
+syn match ia64opcode "shr\(\.u\)\=\>"
+"srlz
+syn match ia64opcode "srlz\(\.[id]\)\>"
+"st
+syn match ia64opcode "st[1248]\(\.rel\)\=\(\.nta\)\=\>"
+syn match ia64opcode "st8\.spill\(\.nta\)\=\>"
+"stf
+syn match ia64opcode "stf[1248]\(\.nta\)\=\>"
+syn match ia64opcode "stf\.spill\(\.nta\)\=\>"
+"sxt
+syn match ia64opcode "sxt[124]\>"
+"tbit/tnat
+syn match ia64opcode "t\(bit\|nat\)\(\.nz\|\.z\)\=\(\.\(unc\|or\(\.andcm\|cm\)\=\|and\(\.orcm\|cm\)\=\)\)\=\>"
+"unpack
+syn match ia64opcode "unpack[124]\.[lh]\>"
+"xchq
+syn match ia64opcode "xchg[1248]\(\.nt[1a]\)\=\>"
+"xma/xmpy
+syn match ia64opcode "xm\(a\|py\)\.[lh]u\=\>"
+"zxt
+syn match ia64opcode "zxt[124]\>"
+
+
+"The regex for different ia64 registers are given below
+
+"limits the rXXX and fXXX and cr suffix in the range 0-127
+syn match ia64registers "\([fr]\|cr\)\([0-9]\|[1-9][0-9]\|1[0-1][0-9]\|12[0-7]\)\{1}\>"
+"branch ia64registers
+syn match ia64registers "b[0-7]\>"
+"predicate ia64registers
+syn match ia64registers "p\([0-9]\|[1-5][0-9]\|6[0-3]\)\>"
+"application ia64registers
+syn match ia64registers "ar\.\(fpsr\|mat\|unat\|rnat\|pfs\|bsp\|bspstore\|rsc\|lc\|ec\|ccv\|itc\|k[0-7]\)\>"
+"ia32 AR's
+syn match ia64registers "ar\.\(eflag\|fcr\|csd\|ssd\|cflg\|fsr\|fir\|fdr\)\>"
+"sp/gp/pr/pr.rot/rp
+syn keyword ia64registers sp gp pr pr.rot rp ip tp
+"in/out/local
+syn match ia64registers "\(in\|out\|loc\)\([0-9]\|[1-8][0-9]\|9[0-5]\)\>"
+"argument ia64registers
+syn match ia64registers "farg[0-7]\>"
+"return value ia64registers
+syn match ia64registers "fret[0-7]\>"
+"psr
+syn match ia64registers "psr\(\.\(l\|um\)\)\=\>"
+"cr
+syn match ia64registers "cr\.\(dcr\|itm\|iva\|pta\|ipsr\|isr\|ifa\|iip\|itir\|iipa\|ifs\|iim\|iha\|lid\|ivr\|tpr\|eoi\|irr[0-3]\|itv\|pmv\|lrr[01]\|cmcv\)\>"
+"Indirect registers
+syn match ia64registers "\(cpuid\|dbr\|ibr\|pkr\|pmc\|pmd\|rr\|itr\|dtr\)\>"
+"MUX permutations for 8-bit elements
+syn match ia64registers "\(@rev\|@mix\|@shuf\|@alt\|@brcst\)\>"
+"floating point classes
+syn match ia64registers "\(@nat\|@qnan\|@snan\|@pos\|@neg\|@zero\|@unorm\|@norm\|@inf\)\>"
+"link relocation operators
+syn match ia64registers "\(@\(\(\(gp\|sec\|seg\|image\)rel\)\|ltoff\|fptr\|ptloff\|ltv\|section\)\)\>"
+
+"Data allocation syntax
+syn match ia64data "data[1248]\(\(\(\.ua\)\=\(\.msb\|\.lsb\)\=\)\|\(\(\.msb\|\.lsb\)\=\(\.ua\)\=\)\)\=\>"
+syn match ia64data "real\([48]\|1[06]\)\(\(\(\.ua\)\=\(\.msb\|\.lsb\)\=\)\|\(\(\.msb\|\.lsb\)\=\(\.ua\)\=\)\)\=\>"
+syn match ia64data "stringz\=\(\(\(\.ua\)\=\(\.msb\|\.lsb\)\=\)\|\(\(\.msb\|\.lsb\)\=\(\.ua\)\=\)\)\=\>"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+"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
+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
+
+
+let b:current_syntax = "ia64"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/ibasic.vim b/runtime/syntax/ibasic.vim
new file mode 100644
index 0000000..75e5941
--- /dev/null
+++ b/runtime/syntax/ibasic.vim
@@ -0,0 +1,176 @@
+" Vim syntax file
+" Language: ibasic
+" Maintainer: Mark Manning <markem@airmail.net>
+" Originator: Allan Kelly <Allan.Kelly@ed.ac.uk>
+" Created: 10/1/2006
+" Updated: 10/21/2006
+" Description: A vim file to handle the IBasic file format.
+" Notes:
+" Updated by Mark Manning <markem@airmail.net>
+" Applied IBasic support to the already excellent support for standard
+" basic syntax (like QB).
+"
+" First version based on Micro$soft QBASIC circa 1989, as documented in
+" 'Learn BASIC Now' by Halvorson&Rygmyr. Microsoft Press 1989.
+" This syntax file not a complete implementation yet.
+" Send suggestions to the maintainer.
+"
+" This version is based upon the commands found in IBasic (www.pyxia.com).
+" MEM 10/6/2006
+"
+" Quit when a (custom) syntax file was already loaded (Taken from c.vim)
+"
+if exists("b:current_syntax")
+ finish
+endif
+"
+" Be sure to turn on the "case ignore" since current versions of basic
+" support both upper as well as lowercase letters.
+"
+syn case ignore
+"
+" A bunch of useful BASIC keywords
+"
+syn keyword ibasicStatement beep bload bsave call absolute chain chdir circle
+syn keyword ibasicStatement clear close cls color com common const data
+syn keyword ibasicStatement loop draw end environ erase error exit field
+syn keyword ibasicStatement files function get gosub goto
+syn keyword ibasicStatement input input# ioctl key kill let line locate
+syn keyword ibasicStatement lock unlock lprint using lset mkdir name
+syn keyword ibasicStatement on error open option base out paint palette pcopy
+syn keyword ibasicStatement pen play pmap poke preset print print# using pset
+syn keyword ibasicStatement put randomize read redim reset restore resume
+syn keyword ibasicStatement return rmdir rset run seek screen
+syn keyword ibasicStatement shared shell sleep sound static stop strig sub
+syn keyword ibasicStatement swap system timer troff tron type unlock
+syn keyword ibasicStatement view wait width window write
+syn keyword ibasicStatement date$ mid$ time$
+"
+" Do the basic variables names first. This is because it
+" is the most inclusive of the tests. Later on we change
+" this so the identifiers are split up into the various
+" types of identifiers like functions, basic commands and
+" such. MEM 9/9/2006
+"
+syn match ibasicIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>"
+syn match ibasicGenericFunction "\<[a-zA-Z_][a-zA-Z0-9_]*\>\s*("me=e-1,he=e-1
+"
+" Function list
+"
+syn keyword ibasicBuiltInFunction abs asc atn cdbl cint clng cos csng csrlin cvd cvdmbf
+syn keyword ibasicBuiltInFunction cvi cvl cvs cvsmbf eof erdev erl err exp fileattr
+syn keyword ibasicBuiltInFunction fix fre freefile inp instr lbound len loc lof
+syn keyword ibasicBuiltInFunction log lpos mod peek pen point pos rnd sadd screen seek
+syn keyword ibasicBuiltInFunction setmem sgn sin spc sqr stick strig tab tan ubound
+syn keyword ibasicBuiltInFunction val valptr valseg varptr varseg
+syn keyword ibasicBuiltInFunction chr\$ command$ date$ environ$ erdev$ hex$ inkey$
+syn keyword ibasicBuiltInFunction input$ ioctl$ lcases$ laft$ ltrim$ mid$ mkdmbf$ mkd$
+syn keyword ibasicBuiltInFunction mki$ mkl$ mksmbf$ mks$ oct$ right$ rtrim$ space$
+syn keyword ibasicBuiltInFunction str$ string$ time$ ucase$ varptr$
+syn keyword ibasicTodo contained TODO
+syn cluster ibasicFunctionCluster contains=ibasicBuiltInFunction,ibasicGenericFunction
+
+syn keyword Conditional if else then elseif endif select case endselect
+syn keyword Repeat for do while next enddo endwhile wend
+
+syn keyword ibasicTypeSpecifier single double defdbl defsng
+syn keyword ibasicTypeSpecifier int integer uint uinteger int64 uint64 defint deflng
+syn keyword ibasicTypeSpecifier byte char string istring defstr
+syn keyword ibasicDefine dim def declare
+"
+"catch errors caused by wrong parenthesis
+"
+syn cluster ibasicParenGroup contains=ibasicParenError,ibasicIncluded,ibasicSpecial,ibasicTodo,ibasicUserCont,ibasicUserLabel,ibasicBitField
+syn region ibasicParen transparent start='(' end=')' contains=ALLBUT,@bParenGroup
+syn match ibasicParenError ")"
+syn match ibasicInParen contained "[{}]"
+"
+"integer number, or floating point number without a dot and with "f".
+"
+syn region ibasicHex start="&h" end="\W"
+syn region ibasicHexError start="&h\x*[g-zG-Z]" end="\W"
+syn match ibasicInteger "\<\d\+\(u\=l\=\|lu\|f\)\>"
+"
+"floating point number, with dot, optional exponent
+"
+syn match ibasicFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+"
+"floating point number, starting with a dot, optional exponent
+"
+syn match ibasicFloat "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"
+"floating point number, without dot, with exponent
+"
+syn match ibasicFloat "\<\d\+e[-+]\=\d\+[fl]\=\>"
+"
+"hex number
+"
+syn match ibasicIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>"
+syn match ibasicFunction "\<[a-zA-Z_][a-zA-Z0-9_]*\>\s*("me=e-1,he=e-1
+syn case match
+syn match ibasicOctalError "\<0\o*[89]"
+"
+" String and Character contstants
+"
+syn region ibasicString start='"' end='"' contains=ibasicSpecial,ibasicTodo
+syn region ibasicString start="'" end="'" contains=ibasicSpecial,ibasicTodo
+"
+" Comments
+"
+syn match ibasicSpecial contained "\\."
+syn region ibasicComment start="^rem" end="$" contains=ibasicSpecial,ibasicTodo
+syn region ibasicComment start=":\s*rem" end="$" contains=ibasicSpecial,ibasicTodo
+syn region ibasicComment start="\s*'" end="$" contains=ibasicSpecial,ibasicTodo
+syn region ibasicComment start="^'" end="$" contains=ibasicSpecial,ibasicTodo
+"
+" Now do the comments and labels
+"
+syn match ibasicLabel "^\d"
+syn region ibasicLineNumber start="^\d" end="\s"
+"
+" Pre-compiler options : FreeBasic
+"
+syn region ibasicPreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=ibasicString,ibasicCharacter,ibasicNumber,ibasicCommentError,ibasicSpaceError
+syn match ibasicInclude "^\s*#\s*include\s*"
+"
+" Create the clusters
+"
+syn cluster ibasicNumber contains=ibasicHex,ibasicInteger,ibasicFloat
+syn cluster ibasicError contains=ibasicHexError
+"
+" Used with OPEN statement
+"
+syn match ibasicFilenumber "#\d\+"
+"
+"syn sync ccomment ibasicComment
+"
+syn match ibasicMathOperator "[\+\-\=\|\*\/\>\<\%\()[\]]" contains=ibasicParen
+"
+" The default methods for highlighting. Can be overridden later
+"
+hi def link ibasicLabel Label
+hi def link ibasicConditional Conditional
+hi def link ibasicRepeat Repeat
+hi def link ibasicHex Number
+hi def link ibasicInteger Number
+hi def link ibasicFloat Number
+hi def link ibasicError Error
+hi def link ibasicHexError Error
+hi def link ibasicStatement Statement
+hi def link ibasicString String
+hi def link ibasicComment Comment
+hi def link ibasicLineNumber Comment
+hi def link ibasicSpecial Special
+hi def link ibasicTodo Todo
+hi def link ibasicGenericFunction Function
+hi def link ibasicBuiltInFunction Function
+hi def link ibasicTypeSpecifier Type
+hi def link ibasicDefine Type
+hi def link ibasicInclude Include
+hi def link ibasicIdentifier Identifier
+hi def link ibasicFilenumber ibasicTypeSpecifier
+hi def link ibasicMathOperator Operator
+
+let b:current_syntax = "ibasic"
+
+" vim: ts=8
diff --git a/runtime/syntax/icemenu.vim b/runtime/syntax/icemenu.vim
new file mode 100644
index 0000000..6513287
--- /dev/null
+++ b/runtime/syntax/icemenu.vim
@@ -0,0 +1,34 @@
+" Vim syntax file
+" Language: Icewm Menu
+" Maintainer: James Mahler <James.Mahler@gmail.com>
+" Last Change: Fri Apr 1 15:13:48 EST 2005
+" Extensions: ~/.icewm/menu
+" Comment: Icewm is a lightweight window manager. This adds syntax
+" highlighting when editing your user's menu file (~/.icewm/menu).
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" not case sensitive
+syntax case ignore
+
+" icons .xpm .png and .gif
+syntax match _icon /"\=\/.*\.xpm"\=/
+syntax match _icon /"\=\/.*\.png"\=/
+syntax match _icon /"\=\/.*\.gif"\=/
+syntax match _icon /"\-"/
+
+" separator
+syntax keyword _rules separator
+
+" prog and menu
+syntax keyword _ids menu prog
+
+" highlights
+highlight link _rules Underlined
+highlight link _ids Type
+highlight link _icon Special
+
+let b:current_syntax = "IceMenu"
diff --git a/runtime/syntax/icon.vim b/runtime/syntax/icon.vim
new file mode 100644
index 0000000..276bb58
--- /dev/null
+++ b/runtime/syntax/icon.vim
@@ -0,0 +1,211 @@
+" Vim syntax file
+" Language: Icon
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Wendell Turner <wendell@adsi-m4.com> (invalid last known address)
+" Last Change: 2022 Jun 16
+" Contributor: eschen@alumni.princeton.edu 2002.09.18
+
+" Prelude {{{1
+if exists("b:current_syntax")
+ finish
+endif
+
+syn iskeyword @,48-57,_,192-255,&
+
+" Not Top {{{1
+syn cluster iconNotTop contains=iconDocField,iconIncluded,iconStringSpecial,iconTodo,@Spell
+
+" Whitespace errors {{{1
+if exists("icon_space_errors")
+ if !exists("icon_no_trail_space_error")
+ syn match iconSpaceError "\s\+$" display excludenl
+ endif
+ if !exists("icon_no_tab_space_error")
+ syn match iconSpaceError " \+\t"me=e-1 display
+ endif
+endif
+
+" Reserved words {{{1
+syn keyword iconReserved break by case create default do else every fail if
+syn keyword iconReserved initial next not of repeat return suspend then to
+syn keyword iconReserved until while
+
+syn keyword iconStorageClass global static local record invocable
+
+syn keyword iconLink link
+
+" Procedure definitions {{{1
+if exists("icon_no_procedure_fold")
+ syn region iconProcedure matchgroup=iconReserved start="\<procedure\>" end="\<end\>" contains=ALLBUT,@iconNotTop
+else
+ syn region iconProcedure matchgroup=iconReserved start="\<procedure\>" end="\<end\>" contains=ALLBUT,@iconNotTop fold
+endif
+
+" Keywords {{{1
+syn keyword iconKeyword &allocated &ascii &clock &collections &cset &current
+syn keyword iconKeyword &date &dateline &digits &dump &e &error &errornumber
+syn keyword iconKeyword &errortext &errorvalue &errout &fail &features &file
+syn keyword iconKeyword &host &input &lcase &letters &level &line &main &null
+syn keyword iconKeyword &output &phi &pi &pos &progname &random &regions
+syn keyword iconKeyword &source &storage &subject &time &trace &ucase &version
+
+" Graphics keywords
+syn keyword iconKeyword &col &control &interval &ldrag &lpress &lrelease
+syn keyword iconKeyword &mdrag &meta &mpress &mrelease &rdrag &resize &row
+syn keyword iconKeyword &rpress &rrelease &shift &window &x &y
+
+" Functions {{{1
+syn keyword iconFunction abs acos any args asin atan bal callout center char
+syn keyword iconFunction chdir close collect copy cos cset delay delete detab
+syn keyword iconFunction display dtor entab errorclear exit exp find flush
+syn keyword iconFunction function get getch getche getenv iand icom image
+syn keyword iconFunction insert integer ior ishift ixor kbhit key left list
+syn keyword iconFunction loadfunc log many map match member move name numeric
+syn keyword iconFunction open ord pop pos proc pull push put read reads real
+syn keyword iconFunction remove rename repl reverse right rtod runerr save
+syn keyword iconFunction seek self seq serial set sin sort sortf sqrt stop
+syn keyword iconFunction string system tab table tan trim type upto variable
+syn keyword iconFunction where write writes
+
+" Graphics functions
+syn keyword iconFunction Active Alert Bg CenterString Clip Clone Color
+syn keyword iconFunction ColorDialog ColorValue CopyArea Couple DrawArc
+syn keyword iconFunction DrawCircle DrawCurve DrawImage DrawLine DrawPoint
+syn keyword iconFunction DrawPolygon DrawRectangle DrawSegment DrawString
+syn keyword iconFunction Enqueue EraseArea Event Fg FillArc FillCircle
+syn keyword iconFunction FillPolygon FillRectangle Font FreeColor GotoRC
+syn keyword iconFunction GotoXY LeftString Lower NewColor Notice OpenDialog
+syn keyword iconFunction PaletteChars PaletteColor PaletteGrays PaletteKey
+syn keyword iconFunction Pattern Pending Pixel Raise ReadImage RightString
+syn keyword iconFunction SaveDialog SelectDialog Shade TextDialog TextWidth
+syn keyword iconFunction ToggleDialog Uncouple WAttrib WClose WDefault WDelay
+syn keyword iconFunction WDone WFlush WOpen WQuit WRead WReads WriteImage
+syn keyword iconFunction WSync WWrite WWrites
+
+" String and character constants {{{1
+syn match iconStringSpecial "\\x\x\{2}\|\\\o\{3\}\|\\[bdeflnrtv\"\'\\]\|\\^[a-zA-Z0-9]" contained
+syn match iconStringSpecial "\\$" contained
+syn match iconStringSpecial "_\ze\s*$" contained
+
+syn region iconString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=iconStringSpecial
+syn region iconCset start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=iconStringSpecial
+
+" Bracket errors {{{1
+
+if !exists("icon_no_bracket_errors")
+ " catch errors caused by wrong brackets (ACE 2002.09.18)
+ syn cluster iconBracketGroup contains=iconBracketError,iconIncluded
+ syn region iconBracket start='\[' end='\]' contains=ALLBUT,@iconBracketGroup,@iconNotTop transparent
+ syn match iconBracketError "]"
+
+ "catch errors caused by wrong braces (ACE 2002.09.18)
+ syn cluster iconBraceGroup contains=iconBraceError,iconIncluded
+ syn region iconBrace start='{' end='}' contains=ALLBUT,@iconBraceGroup,@iconNotTop transparent
+ syn match iconBraceError "}"
+
+ "catch errors caused by wrong parenthesis
+ syn cluster iconParenGroup contains=iconParenError,iconIncluded
+ syn region iconParen start='(' end=')' contains=ALLBUT,@iconParenGroup,@iconNotTop transparent
+ syn match iconParenError ")"
+end
+
+" Numbers {{{1
+syn case ignore
+
+" integer
+syn match iconInteger "\<\d\+\>"
+syn match iconInteger "\<\d\{1,2}[rR][a-zA-Z0-9]\+\>"
+
+" real with trailing dot
+syn match iconReal "\<\d\+\."
+
+" real, with dot, optional exponent
+syn match iconReal "\<\d\+\.\d*\%(e[-+]\=\d\+\)\=\>"
+
+" real, with leading dot, optional exponent
+syn match iconReal "\.\d\+\%(e[-+]\=\d\+\)\=\>"
+
+" real, without dot, with exponent
+syn match iconReal "\<\d\+e[-+]\=\d\+\>"
+
+syn cluster iconNumber contains=iconInteger,iconReal
+
+syn case match
+
+" Comments {{{1
+syn keyword iconTodo TODO FIXME XXX BUG contained
+syn match iconComment "#.*" contains=iconTodo,iconSpaceError,@Spell
+syn match iconDocField "^#\s\+\zs\%(File\|Subject\|Authors\=\|Date\|Version\|Links\|Requires\|See also\):" contained
+
+if exists("icon_no_comment_fold")
+ syn region iconDocumentation start="\%^#\{2,}\%(\n#\+\%(\s\+.*\)\=\)\+" end="^#\+\n\s*$" contains=iconDocField keepend
+else
+ syn region iconMultilineComment start="^\s*#.*\n\%(^\s*#\)\@=" end="^\s*#.*\n\%(^\s*#\)\@!" contains=iconComment keepend fold transparent
+ syn region iconDocumentation start="\%^#\{2,}\%(\n#\)\+" end="^#\+\n\%([^#]\|$\)" contains=iconDocField keepend fold
+endif
+
+" Preprocessor {{{1
+syn match iconPreInclude '^\s*\zs$\s*include\>\ze\s*"' nextgroup=iconIncluded skipwhite
+syn match iconIncluded '"[^"]\+"' contained
+
+syn region iconPreDefine start="^\s*\zs$\s*\%(define\|undef\)\>" end="$" oneline contains=ALLBUT,@iconPreGroup
+syn region iconPreProc start="^\s*\zs$\s*\%(error\|line\)\>" end="$" oneline contains=ALLBUT,@iconPreGroup
+syn region iconPreConditional start="^\s*\zs$\s*\%(if\|ifdef\|ifndef\|elif\|else\|endif\)\>" end="$" oneline contains=iconComment,iconString,iconCset,iconNumber,iconSpaceError
+
+syn cluster iconPreGroup contains=iconPreCondit,iconPreInclude,iconIncluded,iconPreDefine
+
+syn match iconPreSymbol "_V\d\+"
+syn keyword iconPreSymbol _ACORN _AMIGA _ARM_FUNCTIONS _ASCII _CALLING
+syn keyword iconPreSymbol _CO_EXPRESSIONS _COMPILED _DIRECT_EXECUTION
+syn keyword iconPreSymbol _DOS_FUNCTIONS _EBCDIC _EVENT_MONITOR
+syn keyword iconPreSymbol _EXECUTABLE_IMAGES _EXTERNAL_FUNCTIONS
+syn keyword iconPreSymbol _EXTERNAL_VALUES _INTERPRETED _KEYBOARD_FUNCTIONS
+syn keyword iconPreSymbol _LARGE_INTEGERS _MACINTOSH _MEMORY_MONITOR _MSDOS
+syn keyword iconPreSymbol _MSDOS_386 _MULTIREGION _MULTITASKING _OS2 _PIPES
+syn keyword iconPreSymbol _PORT _PRESENTATION_MGR _RECORD_IO _STRING_INVOKE
+syn keyword iconPreSymbol _SYSTEM_FUNCTION _UNIX _VISUALIZATION _VMS
+syn keyword iconPreSymbol _WINDOW_FUNCTIONS _X_WINDOW_SYSTEM
+
+" Syncing {{{1
+if !exists("icon_minlines")
+ let icon_minlines = 250
+endif
+exec "syn sync ccomment iconComment minlines=" . icon_minlines
+
+" Default Highlighting {{{1
+
+hi def link iconParenError iconError
+hi def link iconBracketError iconError
+hi def link iconBraceError iconError
+hi def link iconSpaceError iconError
+hi def link iconError Error
+
+hi def link iconInteger Number
+hi def link iconReal Float
+hi def link iconString String
+hi def link iconCset String
+hi def link iconStringSpecial SpecialChar
+
+hi def link iconPreProc PreProc
+hi def link iconIncluded iconString
+hi def link iconPreInclude Include
+hi def link iconPreSymbol iconPreProc
+hi def link iconPreDefine Define
+hi def link iconPreConditional PreCondit
+
+hi def link iconStatement Statement
+hi def link iconStorageClass StorageClass
+hi def link iconFunction Function
+hi def link iconReserved Label
+hi def link iconLink Include
+hi def link iconKeyword Keyword
+
+hi def link iconComment Comment
+hi def link iconTodo Todo
+hi def link iconDocField SpecialComment
+hi def link iconDocumentation Comment
+
+" Postscript {{{1
+let b:current_syntax = "icon"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/syntax/idl.vim b/runtime/syntax/idl.vim
new file mode 100644
index 0000000..2f20dec
--- /dev/null
+++ b/runtime/syntax/idl.vim
@@ -0,0 +1,324 @@
+" Vim syntax file
+" Language: IDL (Interface Description Language)
+" Created By: Jody Goldberg
+" Maintainer: Michael Geddes <vim@frog.wheelycreek.net>
+" Last Change: 2012 Jan 11
+
+
+" This is an experiment. IDL's structure is simple enough to permit a full
+" grammar based approach to rather than using a few heuristics. The result
+" is large and somewhat repetitive but seems to work.
+
+" There are some Microsoft extensions to idl files that are here. Some of
+" them are disabled by defining idl_no_ms_extensions.
+"
+" The more complex of the extensions are disabled by defining idl_no_extensions.
+"
+" History:
+" 2.0: Michael's new version
+" 2.1: Support for Vim 7 spell (Anduin Withers)
+"
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+try
+ set cpo&vim
+
+ if exists("idlsyntax_showerror")
+ syn match idlError +\S+ skipwhite skipempty nextgroup=idlError
+ endif
+
+ syn region idlCppQuote start='\<cpp_quote\s*(' end=')' contains=idlString
+
+ " Misc basic
+ syn match idlId contained "[a-zA-Z][a-zA-Z0-9_]*" skipwhite skipempty nextgroup=idlEnumComma,idlEnumNumber
+ syn match idlEnumComma contained ","
+ syn match idlEnumNumber contained "=" skipwhite skipempty nextgroup=idlString,idlLiteral
+ syn match idlSemiColon contained ";"
+ syn match idlCommaArg contained "," skipempty skipwhite nextgroup=idlSimpDecl
+ syn region idlArraySize1 contained start=:\[: end=:\]: skipempty skipwhite nextgroup=idlArraySize1,idlError,idlSemiColon,idlCommaArg contains=idlArraySize1,idlLiteral
+ syn match idlSimpDecl contained "[a-zA-Z][a-zA-Z0-9_]*" skipempty skipwhite nextgroup=idlError,idlSemiColon,idlCommaArg,idlArraySize1
+ syn region idlString contained start=+"+ skip=+\\\(\\\\\)*"+ end=+"+ contains=@Spell
+ syn match idlLiteral contained "[1-9]\d*\(\.\d*\)\="
+ syn match idlLiteral contained "0"
+ syn match idlLiteral contained "\.\d\+"
+ syn match idlLiteral contained "0x[0-9A-Fa-f]\+"
+ syn match idlLiteral contained "0[0-7]\+"
+ syn keyword idlLiteral contained TRUE FALSE
+
+ " Comments
+ syn keyword idlTodo contained TODO FIXME XXX
+ syn region idlComment start="/\*" end="\*/" contains=idlTodo,@Spell
+ syn match idlComment "//.*" contains=idlTodo,@Spell
+ syn match idlCommentError "\*/"
+
+ " C style Preprocessor
+ syn region idlIncluded contained start=+"+ skip=+\\\(\\\\\)*"+ end=+"+
+ syn match idlIncluded contained "<[^>]*>"
+ syn match idlInclude "^[ \t]*#[ \t]*include\>[ \t]*["<]" contains=idlIncluded,idlString
+ syn region idlPreCondit start="^[ \t]*#[ \t]*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=idlComment,idlCommentError
+ syn region idlDefine start="^[ \t]*#[ \t]*\(define\>\|undef\>\)" skip="\\$" end="$" contains=idlLiteral,idlString
+
+ " Constants
+ syn keyword idlConst const skipempty skipwhite nextgroup=idlBaseType,idlBaseTypeInt
+
+ " Attribute
+ syn keyword idlROAttr readonly skipempty skipwhite nextgroup=idlAttr
+ syn keyword idlAttr attribute skipempty skipwhite nextgroup=idlBaseTypeInt,idlBaseType
+
+ " Types
+ syn region idlD4 contained start="<" end=">" skipempty skipwhite nextgroup=idlSimpDecl contains=idlSeqType,idlBaseTypeInt,idlBaseType,idlLiteral
+ syn keyword idlSeqType contained sequence skipempty skipwhite nextgroup=idlD4
+ syn keyword idlBaseType contained float double char boolean octet any skipempty skipwhite nextgroup=idlSimpDecl
+ syn keyword idlBaseTypeInt contained short long skipempty skipwhite nextgroup=idlSimpDecl
+ syn keyword idlBaseType contained unsigned skipempty skipwhite nextgroup=idlBaseTypeInt
+ syn region idlD1 contained start="<" end=">" skipempty skipwhite nextgroup=idlSimpDecl contains=idlString,idlLiteral
+ syn keyword idlBaseType contained string skipempty skipwhite nextgroup=idlD1,idlSimpDecl
+ syn match idlBaseType contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*" skipempty skipwhite nextgroup=idlSimpDecl
+
+ " Modules
+ syn region idlModuleContent contained start="{" end="}" skipempty skipwhite nextgroup=idlError,idlSemiColon contains=idlUnion,idlStruct,idlEnum,idlInterface,idlComment,idlTypedef,idlConst,idlException,idlModule
+ syn match idlModuleName contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlModuleContent,idlError,idlSemiColon
+ syn keyword idlModule module skipempty skipwhite nextgroup=idlModuleName
+
+ " Interfaces
+ syn cluster idlCommentable contains=idlComment
+ syn cluster idlContentCluster contains=idlUnion,idlStruct,idlEnum,idlROAttr,idlAttr,idlOp,idlOneWayOp,idlException,idlConst,idlTypedef,idlAttributes,idlErrorSquareBracket,idlErrorBracket,idlInterfaceSections
+
+ syn region idlInterfaceContent contained start="{" end="}" skipempty skipwhite nextgroup=idlError,idlSemiColon contains=@idlContentCluster,@idlCommentable
+ syn match idlInheritFrom2 contained "," skipempty skipwhite nextgroup=idlInheritFrom
+ syn match idlInheritFrom contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*" skipempty skipwhite nextgroup=idlInheritFrom2,idlInterfaceContent
+ syn match idlInherit contained ":" skipempty skipwhite nextgroup=idlInheritFrom
+ syn match idlInterfaceName contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlInterfaceContent,idlInherit,idlError,idlSemiColon
+ syn keyword idlInterface interface dispinterface skipempty skipwhite nextgroup=idlInterfaceName
+ syn keyword idlInterfaceSections contained properties methods skipempty skipwhite nextgroup=idlSectionColon,idlError
+ syn match idlSectionColon contained ":"
+
+
+ syn match idlLibraryName contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlLibraryContent,idlError,idlSemiColon
+ syn keyword idlLibrary library skipempty skipwhite nextgroup=idlLibraryName
+ syn region idlLibraryContent contained start="{" end="}" skipempty skipwhite nextgroup=idlError,idlSemiColon contains=@idlCommentable,idlAttributes,idlErrorSquareBracket,idlErrorBracket,idlImportlib,idlCoclass,idlTypedef,idlInterface
+
+ syn keyword idlImportlib contained importlib skipempty skipwhite nextgroup=idlStringArg
+ syn region idlStringArg contained start="(" end=")" contains=idlString nextgroup=idlError,idlSemiColon,idlErrorBrace,idlErrorSquareBracket
+
+ syn keyword idlCoclass coclass contained skipempty skipwhite nextgroup=idlCoclassName
+ syn match idlCoclassName "[a-zA-Z0-9_]\+" contained skipempty skipwhite nextgroup=idlCoclassDefinition,idlError,idlSemiColon
+
+ syn region idlCoclassDefinition contained start="{" end="}" contains=idlCoclassAttributes,idlInterface,idlErrorBracket,idlErrorSquareBracket skipempty skipwhite nextgroup=idlError,idlSemiColon
+ syn region idlCoclassAttributes contained start=+\[+ end=+]+ skipempty skipwhite nextgroup=idlInterface contains=idlErrorBracket,idlErrorBrace,idlCoclassAttribute
+ syn keyword idlCoclassAttribute contained default source
+ "syn keyword idlInterface interface skipempty skipwhite nextgroup=idlInterfaceStubName
+
+ syn match idlImportString +"\f\+"+ skipempty skipwhite nextgroup=idlError,idlSemiColon
+ syn keyword idlImport import skipempty skipwhite nextgroup=idlImportString
+
+ syn region idlAttributes start="\[" end="\]" contains=idlAttribute,idlAttributeParam,idlErrorBracket,idlErrorBrace,idlComment
+ syn keyword idlAttribute contained propput propget propputref id helpstring object uuid pointer_default
+ if !exists('idl_no_ms_extensions')
+ syn keyword idlAttribute contained nonextensible dual version aggregatable restricted hidden noncreatable oleautomation
+ endif
+ syn region idlAttributeParam contained start="(" end=")" contains=idlString,idlUuid,idlLiteral,idlErrorBrace,idlErrorSquareBracket
+ " skipwhite nextgroup=idlArraySize,idlParmList contains=idlArraySize,idlLiteral
+ syn match idlErrorBrace contained "}"
+ syn match idlErrorBracket contained ")"
+ syn match idlErrorSquareBracket contained "\]"
+
+ syn match idlUuid contained +[0-9a-zA-Z]\{8}-\([0-9a-zA-Z]\{4}-\)\{3}[0-9a-zA-Z]\{12}+
+
+ " Raises
+ syn keyword idlRaises contained raises skipempty skipwhite nextgroup=idlRaises,idlContext,idlError,idlSemiColon
+
+ " Context
+ syn keyword idlContext contained context skipempty skipwhite nextgroup=idlRaises,idlContext,idlError,idlSemiColon
+
+ " Operation
+ syn match idlParmList contained "," skipempty skipwhite nextgroup=idlOpParms
+ syn region idlArraySize contained start="\[" end="\]" skipempty skipwhite nextgroup=idlArraySize,idlParmList contains=idlArraySize,idlLiteral
+ syn match idlParmName contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlParmList,idlArraySize
+ syn keyword idlParmInt contained short long skipempty skipwhite nextgroup=idlParmName
+ syn keyword idlParmType contained unsigned skipempty skipwhite nextgroup=idlParmInt
+ syn region idlD3 contained start="<" end=">" skipempty skipwhite nextgroup=idlParmName contains=idlString,idlLiteral
+ syn keyword idlParmType contained string skipempty skipwhite nextgroup=idlD3,idlParmName
+ syn keyword idlParmType contained void float double char boolean octet any skipempty skipwhite nextgroup=idlParmName
+ syn match idlParmType contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*" skipempty skipwhite nextgroup=idlParmName
+ syn keyword idlOpParms contained in out inout skipempty skipwhite nextgroup=idlParmType
+
+ if !exists('idl_no_ms_extensions')
+ syn keyword idlOpParms contained retval optional skipempty skipwhite nextgroup=idlParmType
+ syn match idlOpParms contained +\<\(iid_is\|defaultvalue\)\s*([^)]*)+ skipempty skipwhite nextgroup=idlParamType
+
+ syn keyword idlVariantType contained BSTR VARIANT VARIANT_BOOL long short unsigned double CURRENCY DATE
+ syn region idlSafeArray contained matchgroup=idlVariantType start=+SAFEARRAY(\s*+ end=+)+ contains=idlVariantType
+ endif
+
+ syn region idlOpContents contained start="(" end=")" skipempty skipwhite nextgroup=idlRaises,idlContext,idlError,idlSemiColon contains=idlOpParms,idlSafeArray,idlVariantType,@idlCommentable
+ syn match idlOpName contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlOpContents
+ syn keyword idlOpInt contained short long skipempty skipwhite nextgroup=idlOpName
+ syn region idlD2 contained start="<" end=">" skipempty skipwhite nextgroup=idlOpName contains=idlString,idlLiteral
+ syn keyword idlOp contained unsigned skipempty skipwhite nextgroup=idlOpInt
+ syn keyword idlOp contained string skipempty skipwhite nextgroup=idlD2,idlOpName
+ syn keyword idlOp contained void float double char boolean octet any skipempty skipwhite nextgroup=idlOpName
+ syn match idlOp contained "[a-zA-Z0-9_]\+[ \t]*\(::[ \t]*[a-zA-Z0-9_]\+\)*" skipempty skipwhite nextgroup=idlOpName
+ syn keyword idlOp contained void skipempty skipwhite nextgroup=idlOpName
+ syn keyword idlOneWayOp contained oneway skipempty skipwhite nextgroup=idOp
+
+ " Enum
+ syn region idlEnumContents contained start="{" end="}" skipempty skipwhite nextgroup=idlError,idlSemiColon,idlSimpDecl contains=idlId,idlAttributes,@idlCommentable
+ syn match idlEnumName contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlEnumContents
+ syn keyword idlEnum enum skipempty skipwhite nextgroup=idlEnumName,idlEnumContents
+
+ " Typedef
+ syn keyword idlTypedef typedef skipempty skipwhite nextgroup=idlTypedefOtherTypeQualifier,idlDefBaseType,idlDefBaseTypeInt,idlDefSeqType,idlDefv1Enum,idlDefEnum,idlDefOtherType,idlDefAttributes,idlError
+
+ if !exists('idl_no_extensions')
+ syn keyword idlTypedefOtherTypeQualifier contained struct enum interface nextgroup=idlDefBaseType,idlDefBaseTypeInt,idlDefSeqType,idlDefv1Enum,idlDefEnum,idlDefOtherType,idlDefAttributes,idlError skipwhite
+
+ syn region idlDefAttributes contained start="\[" end="\]" contains=idlAttribute,idlAttributeParam,idlErrorBracket,idlErrorBrace skipempty skipwhite nextgroup=idlDefBaseType,idlDefBaseTypeInt,idlDefSeqType,idlDefv1Enum,idlDefEnum,idlDefOtherType,idlError
+
+ syn keyword idlDefBaseType contained float double char boolean octet any skipempty skipwhite nextgroup=idlTypedefDecl,idlError
+ syn keyword idlDefBaseTypeInt contained short long skipempty skipwhite nextgroup=idlTypedefDecl,idlError
+ syn match idlDefOtherType contained +\<\k\+\>+ skipempty nextgroup=idlTypedefDecl,idlError
+ " syn keyword idlDefSeqType contained sequence skipempty skipwhite nextgroup=idlD4
+
+ " Enum typedef
+ syn keyword idlDefEnum contained enum skipempty skipwhite nextgroup=idlDefEnumName,idlDefEnumContents
+ syn match idlDefEnumName contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlDefEnumContents,idlTypedefDecl
+ syn region idlDefEnumContents contained start="{" end="}" skipempty skipwhite nextgroup=idlError,idlTypedefDecl contains=idlId,idlAttributes
+
+ syn match idlTypedefDecl contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlError,idlSemiColon
+ endif
+
+ " Struct
+ syn region idlStructContent contained start="{" end="}" skipempty skipwhite nextgroup=idlError,idlSemiColon,idlSimpDecl contains=idlBaseType,idlBaseTypeInt,idlSeqType,@idlCommentable,idlEnum,idlUnion
+ syn match idlStructName contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlStructContent
+ syn keyword idlStruct struct skipempty skipwhite nextgroup=idlStructName
+
+ " Exception
+ syn keyword idlException exception skipempty skipwhite nextgroup=idlStructName
+
+ " Union
+ syn match idlColon contained ":" skipempty skipwhite nextgroup=idlCase,idlSeqType,idlBaseType,idlBaseTypeInt
+ syn region idlCaseLabel contained start="" skip="::" end=":"me=e-1 skipempty skipwhite nextgroup=idlColon contains=idlLiteral,idlString
+ syn keyword idlCase contained case skipempty skipwhite nextgroup=idlCaseLabel
+ syn keyword idlCase contained default skipempty skipwhite nextgroup=idlColon
+ syn region idlUnionContent contained start="{" end="}" skipempty skipwhite nextgroup=idlError,idlSemiColon,idlSimpDecl contains=idlCase
+ syn region idlSwitchType contained start="(" end=")" skipempty skipwhite nextgroup=idlUnionContent
+ syn keyword idlUnionSwitch contained switch skipempty skipwhite nextgroup=idlSwitchType
+ syn match idlUnionName contained "[a-zA-Z0-9_]\+" skipempty skipwhite nextgroup=idlUnionSwitch
+ syn keyword idlUnion union skipempty skipwhite nextgroup=idlUnionName
+
+ if !exists('idl_no_extensions')
+ syn sync match idlInterfaceSync grouphere idlInterfaceContent "\<\(disp\)\=interface\>\s\+\k\+\s*:\s*\k\+\_s*{" skipempty skipwhite nextgroup=idlError,idlSemiColon contains=@idlContentCluster,@idlCommentable
+ syn sync maxlines=1000 minlines=100
+ else
+ syn sync lines=200
+ endif
+ " syn sync fromstart
+
+ if !exists("did_idl_syntax_inits")
+ let did_idl_syntax_inits = 1
+ " The default methods for highlighting. Can be overridden later
+
+ 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
+ hi def link idlError Error
+ endif
+ endif
+ endif
+
+ let b:current_syntax = "idl"
+finally
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
+endtry
+" vim: sw=2 et
diff --git a/runtime/syntax/idlang.vim b/runtime/syntax/idlang.vim
new file mode 100644
index 0000000..14e976c
--- /dev/null
+++ b/runtime/syntax/idlang.vim
@@ -0,0 +1,240 @@
+" Interactive Data Language syntax file (IDL, too [:-)]
+" Maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
+" Last change: 2011 Apr 11
+" Created by: Hermann Rochholz <Hermann.Rochholz AT gmx.de>
+
+" Remove any old syntax stuff hanging around
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case ignore
+
+syn match idlangStatement "^\s*pro\s"
+syn match idlangStatement "^\s*function\s"
+syn keyword idlangStatement return continue mod do break
+syn keyword idlangStatement compile_opt forward_function goto
+syn keyword idlangStatement begin common end of
+syn keyword idlangStatement inherits on_ioerror begin
+
+syn keyword idlangConditional if else then for while case switch
+syn keyword idlangConditional endcase endelse endfor endswitch
+syn keyword idlangConditional endif endrep endwhile repeat until
+
+syn match idlangOperator "\ and\ "
+syn match idlangOperator "\ eq\ "
+syn match idlangOperator "\ ge\ "
+syn match idlangOperator "\ gt\ "
+syn match idlangOperator "\ le\ "
+syn match idlangOperator "\ lt\ "
+syn match idlangOperator "\ ne\ "
+syn match idlangOperator /\(\ \|(\)not\ /hs=e-3
+syn match idlangOperator "\ or\ "
+syn match idlangOperator "\ xor\ "
+
+syn keyword idlangStop stop pause
+
+syn match idlangStrucvar "\h\w*\(\.\h\w*\)\+"
+syn match idlangStrucvar "[),\]]\(\.\h\w*\)\+"hs=s+1
+
+syn match idlangSystem "\!\a\w*\(\.\w*\)\="
+
+syn match idlangKeyword "\([(,]\s*\(\$\_s*\)\=\)\@<=/\h\w*"
+syn match idlangKeyword "\([(,]\s*\(\$\_s*\)\=\)\@<=\h\w*\s*="
+
+syn keyword idlangTodo contained TODO
+
+syn region idlangString start=+"+ end=+"+
+syn region idlangString start=+'+ end=+'+
+
+syn match idlangPreCondit "^\s*@\w*\(\.\a\{3}\)\="
+
+syn match idlangRealNumber "\<\d\+\(\.\=\d*e[+-]\=\d\+\|\.\d*d\|\.\d*\|d\)"
+syn match idlangRealNumber "\.\d\+\(d\|e[+-]\=\d\+\)\="
+
+syn match idlangNumber "\<\.\@!\d\+\.\@!\(b\|u\|us\|s\|l\|ul\|ll\|ull\)\=\>"
+
+syn match idlangComment "[\;].*$" contains=idlangTodo
+
+syn match idlangContinueLine "\$\s*\($\|;\)"he=s+1 contains=idlangComment
+syn match idlangContinueLine "&\s*\(\h\|;\)"he=s+1 contains=ALL
+
+syn match idlangDblCommaError "\,\s*\,"
+
+" List of standard routines as of IDL version 5.4.
+syn match idlangRoutine "EOS_\a*"
+syn match idlangRoutine "HDF_\a*"
+syn match idlangRoutine "CDF_\a*"
+syn match idlangRoutine "NCDF_\a*"
+syn match idlangRoutine "QUERY_\a*"
+syn match idlangRoutine "\<MAX\s*("he=e-1
+syn match idlangRoutine "\<MIN\s*("he=e-1
+
+syn keyword idlangRoutine A_CORRELATE ABS ACOS ADAPT_HIST_EQUAL ALOG ALOG10
+syn keyword idlangRoutine AMOEBA ANNOTATE ARG_PRESENT ARRAY_EQUAL ARROW
+syn keyword idlangRoutine ASCII_TEMPLATE ASIN ASSOC ATAN AXIS BAR_PLOT
+syn keyword idlangRoutine BESELI BESELJ BESELK BESELY BETA BILINEAR BIN_DATE
+syn keyword idlangRoutine BINARY_TEMPLATE BINDGEN BINOMIAL BLAS_AXPY BLK_CON
+syn keyword idlangRoutine BOX_CURSOR BREAK BREAKPOINT BROYDEN BYTARR BYTE
+syn keyword idlangRoutine BYTEORDER BYTSCL C_CORRELATE CALDAT CALENDAR
+syn keyword idlangRoutine CALL_EXTERNAL CALL_FUNCTION CALL_METHOD
+syn keyword idlangRoutine CALL_PROCEDURE CATCH CD CEIL CHEBYSHEV CHECK_MATH
+syn keyword idlangRoutine CHISQR_CVF CHISQR_PDF CHOLDC CHOLSOL CINDGEN
+syn keyword idlangRoutine CIR_3PNT CLOSE CLUST_WTS CLUSTER COLOR_CONVERT
+syn keyword idlangRoutine COLOR_QUAN COLORMAP_APPLICABLE COMFIT COMMON
+syn keyword idlangRoutine COMPLEX COMPLEXARR COMPLEXROUND
+syn keyword idlangRoutine COMPUTE_MESH_NORMALS COND CONGRID CONJ
+syn keyword idlangRoutine CONSTRAINED_MIN CONTOUR CONVERT_COORD CONVOL
+syn keyword idlangRoutine COORD2TO3 CORRELATE COS COSH CRAMER CREATE_STRUCT
+syn keyword idlangRoutine CREATE_VIEW CROSSP CRVLENGTH CT_LUMINANCE CTI_TEST
+syn keyword idlangRoutine CURSOR CURVEFIT CV_COORD CVTTOBM CW_ANIMATE
+syn keyword idlangRoutine CW_ANIMATE_GETP CW_ANIMATE_LOAD CW_ANIMATE_RUN
+syn keyword idlangRoutine CW_ARCBALL CW_BGROUP CW_CLR_INDEX CW_COLORSEL
+syn keyword idlangRoutine CW_DEFROI CW_FIELD CW_FILESEL CW_FORM CW_FSLIDER
+syn keyword idlangRoutine CW_LIGHT_EDITOR CW_LIGHT_EDITOR_GET
+syn keyword idlangRoutine CW_LIGHT_EDITOR_SET CW_ORIENT CW_PALETTE_EDITOR
+syn keyword idlangRoutine CW_PALETTE_EDITOR_GET CW_PALETTE_EDITOR_SET
+syn keyword idlangRoutine CW_PDMENU CW_RGBSLIDER CW_TMPL CW_ZOOM DBLARR
+syn keyword idlangRoutine DCINDGEN DCOMPLEX DCOMPLEXARR DEFINE_KEY DEFROI
+syn keyword idlangRoutine DEFSYSV DELETE_SYMBOL DELLOG DELVAR DERIV DERIVSIG
+syn keyword idlangRoutine DETERM DEVICE DFPMIN DIALOG_MESSAGE
+syn keyword idlangRoutine DIALOG_PICKFILE DIALOG_PRINTERSETUP
+syn keyword idlangRoutine DIALOG_PRINTJOB DIALOG_READ_IMAGE
+syn keyword idlangRoutine DIALOG_WRITE_IMAGE DIGITAL_FILTER DILATE DINDGEN
+syn keyword idlangRoutine DISSOLVE DIST DLM_LOAD DLM_REGISTER
+syn keyword idlangRoutine DO_APPLE_SCRIPT DOC_LIBRARY DOUBLE DRAW_ROI EFONT
+syn keyword idlangRoutine EIGENQL EIGENVEC ELMHES EMPTY ENABLE_SYSRTN EOF
+syn keyword idlangRoutine ERASE ERODE ERRORF ERRPLOT EXECUTE EXIT EXP EXPAND
+syn keyword idlangRoutine EXPAND_PATH EXPINT EXTRAC EXTRACT_SLICE F_CVF
+syn keyword idlangRoutine F_PDF FACTORIAL FFT FILE_CHMOD FILE_DELETE
+syn keyword idlangRoutine FILE_EXPAND_PATH FILE_MKDIR FILE_TEST FILE_WHICH
+syn keyword idlangRoutine FILEPATH FINDFILE FINDGEN FINITE FIX FLICK FLOAT
+syn keyword idlangRoutine FLOOR FLOW3 FLTARR FLUSH FORMAT_AXIS_VALUES
+syn keyword idlangRoutine FORWARD_FUNCTION FREE_LUN FSTAT FULSTR FUNCT
+syn keyword idlangRoutine FV_TEST FX_ROOT FZ_ROOTS GAMMA GAMMA_CT
+syn keyword idlangRoutine GAUSS_CVF GAUSS_PDF GAUSS2DFIT GAUSSFIT GAUSSINT
+syn keyword idlangRoutine GET_DRIVE_LIST GET_KBRD GET_LUN GET_SCREEN_SIZE
+syn keyword idlangRoutine GET_SYMBOL GETENV GOTO GRID_TPS GRID3 GS_ITER
+syn keyword idlangRoutine H_EQ_CT H_EQ_INT HANNING HEAP_GC HELP HILBERT
+syn keyword idlangRoutine HIST_2D HIST_EQUAL HISTOGRAM HLS HOUGH HQR HSV
+syn keyword idlangRoutine IBETA IDENTITY IDL_Container IDLanROI
+syn keyword idlangRoutine IDLanROIGroup IDLffDICOM IDLffDXF IDLffLanguageCat
+syn keyword idlangRoutine IDLffShape IDLgrAxis IDLgrBuffer IDLgrClipboard
+syn keyword idlangRoutine IDLgrColorbar IDLgrContour IDLgrFont IDLgrImage
+syn keyword idlangRoutine IDLgrLegend IDLgrLight IDLgrModel IDLgrMPEG
+syn keyword idlangRoutine IDLgrPalette IDLgrPattern IDLgrPlot IDLgrPolygon
+syn keyword idlangRoutine IDLgrPolyline IDLgrPrinter IDLgrROI IDLgrROIGroup
+syn keyword idlangRoutine IDLgrScene IDLgrSurface IDLgrSymbol
+syn keyword idlangRoutine IDLgrTessellator IDLgrText IDLgrView
+syn keyword idlangRoutine IDLgrViewgroup IDLgrVolume IDLgrVRML IDLgrWindow
+syn keyword idlangRoutine IGAMMA IMAGE_CONT IMAGE_STATISTICS IMAGINARY
+syn keyword idlangRoutine INDGEN INT_2D INT_3D INT_TABULATED INTARR INTERPOL
+syn keyword idlangRoutine INTERPOLATE INVERT IOCTL ISHFT ISOCONTOUR
+syn keyword idlangRoutine ISOSURFACE JOURNAL JULDAY KEYWORD_SET KRIG2D
+syn keyword idlangRoutine KURTOSIS KW_TEST L64INDGEN LABEL_DATE LABEL_REGION
+syn keyword idlangRoutine LADFIT LAGUERRE LEEFILT LEGENDRE LINBCG LINDGEN
+syn keyword idlangRoutine LINFIT LINKIMAGE LIVE_CONTOUR LIVE_CONTROL
+syn keyword idlangRoutine LIVE_DESTROY LIVE_EXPORT LIVE_IMAGE LIVE_INFO
+syn keyword idlangRoutine LIVE_LINE LIVE_LOAD LIVE_OPLOT LIVE_PLOT
+syn keyword idlangRoutine LIVE_PRINT LIVE_RECT LIVE_STYLE LIVE_SURFACE
+syn keyword idlangRoutine LIVE_TEXT LJLCT LL_ARC_DISTANCE LMFIT LMGR LNGAMMA
+syn keyword idlangRoutine LNP_TEST LOADCT LOCALE_GET LON64ARR LONARR LONG
+syn keyword idlangRoutine LONG64 LSODE LU_COMPLEX LUDC LUMPROVE LUSOL
+syn keyword idlangRoutine M_CORRELATE MACHAR MAKE_ARRAY MAKE_DLL MAP_2POINTS
+syn keyword idlangRoutine MAP_CONTINENTS MAP_GRID MAP_IMAGE MAP_PATCH
+syn keyword idlangRoutine MAP_PROJ_INFO MAP_SET MATRIX_MULTIPLY MD_TEST MEAN
+syn keyword idlangRoutine MEANABSDEV MEDIAN MEMORY MESH_CLIP MESH_DECIMATE
+syn keyword idlangRoutine MESH_ISSOLID MESH_MERGE MESH_NUMTRIANGLES MESH_OBJ
+syn keyword idlangRoutine MESH_SMOOTH MESH_SURFACEAREA MESH_VALIDATE
+syn keyword idlangRoutine MESH_VOLUME MESSAGE MIN_CURVE_SURF MK_HTML_HELP
+syn keyword idlangRoutine MODIFYCT MOMENT MORPH_CLOSE MORPH_DISTANCE
+syn keyword idlangRoutine MORPH_GRADIENT MORPH_HITORMISS MORPH_OPEN
+syn keyword idlangRoutine MORPH_THIN MORPH_TOPHAT MPEG_CLOSE MPEG_OPEN
+syn keyword idlangRoutine MPEG_PUT MPEG_SAVE MSG_CAT_CLOSE MSG_CAT_COMPILE
+syn keyword idlangRoutine MSG_CAT_OPEN MULTI N_ELEMENTS N_PARAMS N_TAGS
+syn keyword idlangRoutine NEWTON NORM OBJ_CLASS OBJ_DESTROY OBJ_ISA OBJ_NEW
+syn keyword idlangRoutine OBJ_VALID OBJARR ON_ERROR ON_IOERROR ONLINE_HELP
+syn keyword idlangRoutine OPEN OPENR OPENW OPLOT OPLOTERR P_CORRELATE
+syn keyword idlangRoutine PARTICLE_TRACE PCOMP PLOT PLOT_3DBOX PLOT_FIELD
+syn keyword idlangRoutine PLOTERR PLOTS PNT_LINE POINT_LUN POLAR_CONTOUR
+syn keyword idlangRoutine POLAR_SURFACE POLY POLY_2D POLY_AREA POLY_FIT
+syn keyword idlangRoutine POLYFILL POLYFILLV POLYSHADE POLYWARP POPD POWELL
+syn keyword idlangRoutine PRIMES PRINT PRINTF PRINTD PROFILE PROFILER
+syn keyword idlangRoutine PROFILES PROJECT_VOL PS_SHOW_FONTS PSAFM PSEUDO
+syn keyword idlangRoutine PTR_FREE PTR_NEW PTR_VALID PTRARR PUSHD QROMB
+syn keyword idlangRoutine QROMO QSIMP R_CORRELATE R_TEST RADON RANDOMN
+syn keyword idlangRoutine RANDOMU RANKS RDPIX READ READF READ_ASCII
+syn keyword idlangRoutine READ_BINARY READ_BMP READ_DICOM READ_IMAGE
+syn keyword idlangRoutine READ_INTERFILE READ_JPEG READ_PICT READ_PNG
+syn keyword idlangRoutine READ_PPM READ_SPR READ_SRF READ_SYLK READ_TIFF
+syn keyword idlangRoutine READ_WAV READ_WAVE READ_X11_BITMAP READ_XWD READS
+syn keyword idlangRoutine READU REBIN RECALL_COMMANDS RECON3 REDUCE_COLORS
+syn keyword idlangRoutine REFORM REGRESS REPLICATE REPLICATE_INPLACE
+syn keyword idlangRoutine RESOLVE_ALL RESOLVE_ROUTINE RESTORE RETALL RETURN
+syn keyword idlangRoutine REVERSE REWIND RK4 ROBERTS ROT ROTATE ROUND
+syn keyword idlangRoutine ROUTINE_INFO RS_TEST S_TEST SAVE SAVGOL SCALE3
+syn keyword idlangRoutine SCALE3D SEARCH2D SEARCH3D SET_PLOT SET_SHADING
+syn keyword idlangRoutine SET_SYMBOL SETENV SETLOG SETUP_KEYS SFIT
+syn keyword idlangRoutine SHADE_SURF SHADE_SURF_IRR SHADE_VOLUME SHIFT SHOW3
+syn keyword idlangRoutine SHOWFONT SIN SINDGEN SINH SIZE SKEWNESS SKIPF
+syn keyword idlangRoutine SLICER3 SLIDE_IMAGE SMOOTH SOBEL SOCKET SORT SPAWN
+syn keyword idlangRoutine SPH_4PNT SPH_SCAT SPHER_HARM SPL_INIT SPL_INTERP
+syn keyword idlangRoutine SPLINE SPLINE_P SPRSAB SPRSAX SPRSIN SPRSTP SQRT
+syn keyword idlangRoutine STANDARDIZE STDDEV STOP STRARR STRCMP STRCOMPRESS
+syn keyword idlangRoutine STREAMLINE STREGEX STRETCH STRING STRJOIN STRLEN
+syn keyword idlangRoutine STRLOWCASE STRMATCH STRMESSAGE STRMID STRPOS
+syn keyword idlangRoutine STRPUT STRSPLIT STRTRIM STRUCT_ASSIGN STRUCT_HIDE
+syn keyword idlangRoutine STRUPCASE SURFACE SURFR SVDC SVDFIT SVSOL
+syn keyword idlangRoutine SWAP_ENDIAN SWITCH SYSTIME T_CVF T_PDF T3D
+syn keyword idlangRoutine TAG_NAMES TAN TANH TAPRD TAPWRT TEK_COLOR
+syn keyword idlangRoutine TEMPORARY TETRA_CLIP TETRA_SURFACE TETRA_VOLUME
+syn keyword idlangRoutine THIN THREED TIME_TEST2 TIMEGEN TM_TEST TOTAL TRACE
+syn keyword idlangRoutine TRANSPOSE TRI_SURF TRIANGULATE TRIGRID TRIQL
+syn keyword idlangRoutine TRIRED TRISOL TRNLOG TS_COEF TS_DIFF TS_FCAST
+syn keyword idlangRoutine TS_SMOOTH TV TVCRS TVLCT TVRD TVSCL UINDGEN UINT
+syn keyword idlangRoutine UINTARR UL64INDGEN ULINDGEN ULON64ARR ULONARR
+syn keyword idlangRoutine ULONG ULONG64 UNIQ USERSYM VALUE_LOCATE VARIANCE
+syn keyword idlangRoutine VAX_FLOAT VECTOR_FIELD VEL VELOVECT VERT_T3D VOIGT
+syn keyword idlangRoutine VORONOI VOXEL_PROJ WAIT WARP_TRI WATERSHED WDELETE
+syn keyword idlangRoutine WEOF WF_DRAW WHERE WIDGET_BASE WIDGET_BUTTON
+syn keyword idlangRoutine WIDGET_CONTROL WIDGET_DRAW WIDGET_DROPLIST
+syn keyword idlangRoutine WIDGET_EVENT WIDGET_INFO WIDGET_LABEL WIDGET_LIST
+syn keyword idlangRoutine WIDGET_SLIDER WIDGET_TABLE WIDGET_TEXT WINDOW
+syn keyword idlangRoutine WRITE_BMP WRITE_IMAGE WRITE_JPEG WRITE_NRIF
+syn keyword idlangRoutine WRITE_PICT WRITE_PNG WRITE_PPM WRITE_SPR WRITE_SRF
+syn keyword idlangRoutine WRITE_SYLK WRITE_TIFF WRITE_WAV WRITE_WAVE WRITEU
+syn keyword idlangRoutine WSET WSHOW WTN WV_APPLET WV_CW_WAVELET WV_CWT
+syn keyword idlangRoutine WV_DENOISE WV_DWT WV_FN_COIFLET WV_FN_DAUBECHIES
+syn keyword idlangRoutine WV_FN_GAUSSIAN WV_FN_HAAR WV_FN_MORLET WV_FN_PAUL
+syn keyword idlangRoutine WV_FN_SYMLET WV_IMPORT_DATA WV_IMPORT_WAVELET
+syn keyword idlangRoutine WV_PLOT3D_WPS WV_PLOT_MULTIRES WV_PWT
+syn keyword idlangRoutine WV_TOOL_DENOISE XBM_EDIT XDISPLAYFILE XDXF XFONT
+syn keyword idlangRoutine XINTERANIMATE XLOADCT XMANAGER XMNG_TMPL XMTOOL
+syn keyword idlangRoutine XOBJVIEW XPALETTE XPCOLOR XPLOT3D XREGISTERED XROI
+syn keyword idlangRoutine XSQ_TEST XSURFACE XVAREDIT XVOLUME XVOLUME_ROTATE
+syn keyword idlangRoutine XVOLUME_WRITE_IMAGE XYOUTS ZOOM ZOOM_24
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "idlang"
+" vim: ts=18
diff --git a/runtime/syntax/indent.vim b/runtime/syntax/indent.vim
new file mode 100644
index 0000000..b2a1a0c
--- /dev/null
+++ b/runtime/syntax/indent.vim
@@ -0,0 +1,153 @@
+" Vim syntax file
+" Language: indent(1) configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Last Change: 2021 Nov 17
+" indent_is_bsd: If exists, will change somewhat to match BSD implementation
+"
+" 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
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-,+
+
+syn match indentError '\S\+'
+
+syn keyword indentTodo contained TODO FIXME XXX NOTE
+
+syn region indentComment start='/\*' end='\*/'
+ \ contains=indentTodo,@Spell
+syn region indentComment start='//' skip='\\$' end='$'
+ \ contains=indentTodo,@Spell
+
+if !exists("indent_is_bsd")
+ syn match indentOptions '-i\|--indent-level\|-il\|--indent-label'
+ \ nextgroup=indentNumber skipwhite skipempty
+endif
+syn match indentOptions '-\%(bli\|c\%([bl]i\|[dip]\)\=\|di\=\|ip\=\|lc\=\|pp\=i\|sbi\|ts\|-\%(brace-indent\|comment-indentation\|case-brace-indentation\|declaration-comment-column\|continuation-indentation\|case-indentation\|else-endif-column\|line-comments-indentation\|declaration-indentation\|indent-level\|parameter-indentation\|line-length\|comment-line-length\|paren-indentation\|preprocessor-indentation\|struct-brace-indentation\|tab-size\)\)'
+ \ nextgroup=indentNumber skipwhite skipempty
+
+syn match indentNumber display contained '\d\+\>'
+
+syn match indentOptions '-T'
+ \ nextgroup=indentIdent skipwhite skipempty
+
+syn match indentIdent display contained '\h\w*\>'
+
+syn keyword indentOptions -bacc --blank-lines-after-ifdefs
+ \ -bad --blank-lines-after-declarations
+ \ -badp --blank-lines-after-procedure-declarations
+ \ -bap --blank-lines-after-procedures
+ \ -bbb --blank-lines-before-block-comments
+ \ -bbo --break-before-boolean-operator
+ \ -bc --blank-lines-after-commas
+ \ -bfda --break-function-decl-args
+ \ -bfde --break-function-decl-args-end
+ \ -bl --braces-after-if-line
+ \ -blf --braces-after-func-def-line
+ \ -bls --braces-after-struct-decl-line
+ \ -br --braces-on-if-line
+ \ -brf --braces-on-func-def-line
+ \ -brs --braces-on-struct-decl-line
+ \ -bs --Bill-Shannon --blank-before-sizeof
+ \ -c++ --c-plus-plus
+ \ -cdb --comment-delimiters-on-blank-lines
+ \ -cdw --cuddle-do-while
+ \ -ce --cuddle-else
+ \ -cs --space-after-cast
+ \ -dj --left-justify-declarations
+ \ -eei --extra-expression-indentation
+ \ -fc1 --format-first-column-comments
+ \ -fca --format-all-comments
+ \ -gnu --gnu-style
+ \ -h --help --usage
+ \ -hnl --honour-newlines
+ \ -kr --k-and-r-style --kernighan-and-ritchie --kernighan-and-ritchie-style
+ \ -lp --continue-at-parentheses
+ \ -lps --leave-preprocessor-space
+ \ -nbacc --no-blank-lines-after-ifdefs
+ \ -nbad --no-blank-lines-after-declarations
+ \ -nbadp --no-blank-lines-after-procedure-declarations
+ \ -nbap --no-blank-lines-after-procedures
+ \ -nbbb --no-blank-lines-before-block-comments
+ \ -nbbo --break-after-boolean-operator
+ \ -nbc --no-blank-lines-after-commas
+ \ -nbfda --dont-break-function-decl-args
+ \ -nbfde --dont-break-function-decl-args-end
+ \ -nbs --no-Bill-Shannon --no-blank-before-sizeof
+ \ -ncdb --no-comment-delimiters-on-blank-lines
+ \ -ncdw --dont-cuddle-do-while
+ \ -nce --dont-cuddle-else
+ \ -ncs --no-space-after-casts
+ \ -ndj --dont-left-justify-declarations
+ \ -neei --no-extra-expression-indentation
+ \ -nfc1 --dont-format-first-column-comments
+ \ -nfca --dont-format-comments
+ \ -nhnl --ignore-newlines
+ \ -nip --dont-indent-parameters --no-parameter-indentation
+ \ -nlp --dont-line-up-parentheses
+ \ -nlps --remove-preprocessor-space
+ \ -npcs --no-space-after-function-call-names
+ \ -npmt
+ \ -npro --ignore-profile
+ \ -nprs --no-space-after-parentheses
+ \ -npsl --dont-break-procedure-type
+ \ -nsaf --no-space-after-for
+ \ -nsai --no-space-after-if
+ \ -nsaw --no-space-after-while
+ \ -nsc --dont-star-comments
+ \ -nsob --leave-optional-blank-lines
+ \ -nss --dont-space-special-semicolon
+ \ -nut --no-tabs
+ \ -nv --no-verbosity
+ \ -o --output
+ \ -o --output-file
+ \ -orig --berkeley --berkeley-style --original --original-style
+ \ -pcs --space-after-procedure-calls
+ \ -pmt --preserve-mtime
+ \ -prs --space-after-parentheses
+ \ -psl --procnames-start-lines
+ \ -saf --space-after-for
+ \ -sai --space-after-if
+ \ -saw --space-after-while
+ \ -sc --start-left-side-of-comments
+ \ -sob --swallow-optional-blank-lines
+ \ -ss --space-special-semicolon
+ \ -st --standard-output
+ \ -ut --use-tabs
+ \ -v --verbose
+ \ -version --version
+ \ -linux --linux-style
+
+if exists("indent_is_bsd")
+ syn keyword indentOptions -ip -ei -nei
+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
+
+hi def link indentError Error
+hi def link indentComment Comment
+hi def link indentTodo Todo
+hi def link indentOptions Keyword
+hi def link indentNumber Number
+hi def link indentIdent Identifier
+
+let b:current_syntax = "indent"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/inform.vim b/runtime/syntax/inform.vim
new file mode 100644
index 0000000..e3e1b3e
--- /dev/null
+++ b/runtime/syntax/inform.vim
@@ -0,0 +1,392 @@
+" Vim syntax file
+" Language: Inform
+" Maintainer: Stephen Thomas (stephen@gowarthomas.com)
+" URL: http://www.gowarthomas.com/informvim
+" Last Change: 2006 April 20
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A bunch of useful Inform keywords. First, case insensitive stuff
+
+syn case ignore
+
+syn keyword informDefine Constant
+
+syn keyword informType Array Attribute Class Nearby
+syn keyword informType Object Property String Routine
+syn match informType "\<Global\>"
+
+syn keyword informInclude Import Include Link Replace System_file
+
+syn keyword informPreCondit End Endif Ifdef Ifndef Iftrue Iffalse Ifv3 Ifv5
+syn keyword informPreCondit Ifnot
+
+syn keyword informPreProc Abbreviate Default Fake_action Lowstring
+syn keyword informPreProc Message Release Serial Statusline Stub Switches
+syn keyword informPreProc Trace Zcharacter
+
+syn region informGlobalRegion matchgroup=informType start="\<Global\>" matchgroup=NONE skip=+!.*$\|".*"\|'.*'+ end=";" contains=ALLBUT,informGramPreProc,informPredicate,informGrammar,informAsm,informAsmObsolete
+
+syn keyword informGramPreProc contained Verb Extend
+
+if !exists("inform_highlight_simple")
+ syn keyword informLibAttrib absent animate clothing concealed container
+ syn keyword informLibAttrib door edible enterable female general light
+ syn keyword informLibAttrib lockable locked male moved neuter on open
+ syn keyword informLibAttrib openable pluralname proper scenery scored
+ syn keyword informLibAttrib static supporter switchable talkable
+ syn keyword informLibAttrib visited workflag worn
+ syn match informLibAttrib "\<transparent\>"
+
+ syn keyword informLibProp e_to se_to s_to sw_to w_to nw_to n_to ne_to
+ syn keyword informLibProp u_to d_to in_to out_to before after life
+ syn keyword informLibProp door_to with_key door_dir invent plural
+ syn keyword informLibProp add_to_scope list_together react_before
+ syn keyword informLibProp react_after grammar orders initial when_open
+ syn keyword informLibProp when_closed when_on when_off description
+ syn keyword informLibProp describe article cant_go found_in time_left
+ syn keyword informLibProp number time_out daemon each_turn capacity
+ syn keyword informLibProp name short_name short_name_indef parse_name
+ syn keyword informLibProp articles inside_description
+ if !exists("inform_highlight_old")
+ syn keyword informLibProp compass_look before_implicit
+ syn keyword informLibProp ext_initialise ext_messages
+ endif
+
+ syn keyword informLibObj e_obj se_obj s_obj sw_obj w_obj nw_obj n_obj
+ syn keyword informLibObj ne_obj u_obj d_obj in_obj out_obj compass
+ syn keyword informLibObj thedark selfobj player location second actor
+ syn keyword informLibObj noun
+ if !exists("inform_highlight_old")
+ syn keyword informLibObj LibraryExtensions
+ endif
+
+ syn keyword informLibRoutine Achieved AfterRoutines AddToScope
+ syn keyword informLibRoutine AllowPushDir Banner ChangeDefault
+ syn keyword informLibRoutine ChangePlayer CommonAncestor DictionaryLookup
+ syn keyword informLibRoutine DisplayStatus DoMenu DrawStatusLine
+ syn keyword informLibRoutine EnglishNumber HasLightSource GetGNAOfObject
+ syn keyword informLibRoutine IndirectlyContains IsSeeThrough Locale
+ syn keyword informLibRoutine LoopOverScope LTI_Insert MoveFloatingObjects
+ syn keyword informLibRoutine NextWord NextWordStopped NounDomain
+ syn keyword informLibRoutine ObjectIsUntouchable OffersLight ParseToken
+ syn keyword informLibRoutine PlaceInScope PlayerTo PrintShortName
+ syn keyword informLibRoutine PronounNotice ScopeWithin SetPronoun SetTime
+ syn keyword informLibRoutine StartDaemon StartTimer StopDaemon StopTimer
+ syn keyword informLibRoutine TestScope TryNumber UnsignedCompare
+ syn keyword informLibRoutine WordAddress WordInProperty WordLength
+ syn keyword informLibRoutine WriteListFrom YesOrNo ZRegion RunRoutines
+ syn keyword informLibRoutine AfterLife AfterPrompt Amusing BeforeParsing
+ syn keyword informLibRoutine ChooseObjects DarkToDark DeathMessage
+ syn keyword informLibRoutine GamePostRoutine GamePreRoutine Initialise
+ syn keyword informLibRoutine InScope LookRoutine NewRoom ParseNoun
+ syn keyword informLibRoutine ParseNumber ParserError PrintRank PrintVerb
+ syn keyword informLibRoutine PrintTaskName TimePasses UnknownVerb
+ if exists("inform_highlight_glulx")
+ syn keyword informLibRoutine IdentifyGlkObject HandleGlkEvent
+ syn keyword informLibRoutine InitGlkWindow
+ endif
+ if !exists("inform_highlight_old")
+ syn keyword informLibRoutine KeyCharPrimitive KeyDelay ClearScreen
+ syn keyword informLibRoutine MoveCursor MainWindow StatusLineHeight
+ syn keyword informLibRoutine ScreenWidth ScreenHeight SetColour
+ syn keyword informLibRoutine DecimalNumber PrintToBuffer Length
+ syn keyword informLibRoutine UpperCase LowerCase PrintCapitalised
+ syn keyword informLibRoutine Cap Centre
+ if exists("inform_highlight_glulx")
+ syn keyword informLibRoutine PrintAnything PrintAnyToArray
+ endif
+ endif
+
+ syn keyword informLibAction Quit Restart Restore Verify Save
+ syn keyword informLibAction ScriptOn ScriptOff Pronouns Score
+ syn keyword informLibAction Fullscore LMode1 LMode2 LMode3
+ syn keyword informLibAction NotifyOn NotifyOff Version Places
+ syn keyword informLibAction Objects TraceOn TraceOff TraceLevel
+ syn keyword informLibAction ActionsOn ActionsOff RoutinesOn
+ syn keyword informLibAction RoutinesOff TimersOn TimersOff
+ syn keyword informLibAction CommandsOn CommandsOff CommandsRead
+ syn keyword informLibAction Predictable XPurloin XAbstract XTree
+ syn keyword informLibAction Scope Goto Gonear Inv InvTall InvWide
+ syn keyword informLibAction Take Drop Remove PutOn Insert Transfer
+ syn keyword informLibAction Empty Enter Exit GetOff Go Goin Look
+ syn keyword informLibAction Examine Search Give Show Unlock Lock
+ syn keyword informLibAction SwitchOn SwitchOff Open Close Disrobe
+ syn keyword informLibAction Wear Eat Yes No Burn Pray Wake
+ syn keyword informLibAction WakeOther Consult Kiss Think Smell
+ syn keyword informLibAction Listen Taste Touch Dig Cut Jump
+ syn keyword informLibAction JumpOver Tie Drink Fill Sorry Strong
+ syn keyword informLibAction Mild Attack Swim Swing Blow Rub Set
+ syn keyword informLibAction SetTo WaveHands Wave Pull Push PushDir
+ syn keyword informLibAction Turn Squeeze LookUnder ThrowAt Tell
+ syn keyword informLibAction Answer Buy Ask AskFor Sing Climb Wait
+ syn keyword informLibAction Sleep LetGo Receive ThrownAt Order
+ syn keyword informLibAction TheSame PluralFound Miscellany Prompt
+ syn keyword informLibAction ChangesOn ChangesOff Showverb Showobj
+ syn keyword informLibAction EmptyT VagueGo
+ if exists("inform_highlight_glulx")
+ syn keyword informLibAction GlkList
+ endif
+
+ syn keyword informLibVariable keep_silent deadflag action special_number
+ syn keyword informLibVariable consult_from consult_words etype verb_num
+ syn keyword informLibVariable verb_word the_time real_location c_style
+ syn keyword informLibVariable parser_one parser_two listing_together wn
+ syn keyword informLibVariable parser_action scope_stage scope_reason
+ syn keyword informLibVariable action_to_be menu_item item_name item_width
+ syn keyword informLibVariable lm_o lm_n inventory_style task_scores
+ syn keyword informLibVariable inventory_stage
+
+ syn keyword informLibConst AMUSING_PROVIDED DEBUG Headline MAX_CARRIED
+ syn keyword informLibConst MAX_SCORE MAX_TIMERS NO_PLACES NUMBER_TASKS
+ syn keyword informLibConst OBJECT_SCORE ROOM_SCORE SACK_OBJECT Story
+ syn keyword informLibConst TASKS_PROVIDED WITHOUT_DIRECTIONS
+ syn keyword informLibConst NEWLINE_BIT INDENT_BIT FULLINV_BIT ENGLISH_BIT
+ syn keyword informLibConst RECURSE_BIT ALWAYS_BIT TERSE_BIT PARTINV_BIT
+ syn keyword informLibConst DEFART_BIT WORKFLAG_BIT ISARE_BIT CONCEAL_BIT
+ syn keyword informLibConst PARSING_REASON TALKING_REASON EACHTURN_REASON
+ syn keyword informLibConst REACT_BEFORE_REASON REACT_AFTER_REASON
+ syn keyword informLibConst TESTSCOPE_REASON LOOPOVERSCOPE_REASON
+ syn keyword informLibConst STUCK_PE UPTO_PE NUMBER_PE CANTSEE_PE TOOLIT_PE
+ syn keyword informLibConst NOTHELD_PE MULTI_PE MMULTI_PE VAGUE_PE EXCEPT_PE
+ syn keyword informLibConst ANIMA_PE VERB_PE SCENERY_PE ITGONE_PE
+ syn keyword informLibConst JUNKAFTER_PE TOOFEW_PE NOTHING_PE ASKSCOPE_PE
+ if !exists("inform_highlight_old")
+ syn keyword informLibConst WORDSIZE TARGET_ZCODE TARGET_GLULX
+ syn keyword informLibConst LIBRARY_PARSER LIBRARY_VERBLIB LIBRARY_GRAMMAR
+ syn keyword informLibConst LIBRARY_ENGLISH NO_SCORE START_MOVE
+ syn keyword informLibConst CLR_DEFAULT CLR_BLACK CLR_RED CLR_GREEN
+ syn keyword informLibConst CLR_YELLOW CLR_BLUE CLR_MAGENTA CLR_CYAN
+ syn keyword informLibConst CLR_WHITE CLR_PURPLE CLR_AZURE
+ syn keyword informLibConst WIN_ALL WIN_MAIN WIN_STATUS
+ endif
+endif
+
+" Now the case sensitive stuff.
+
+syntax case match
+
+syn keyword informSysFunc child children elder indirect parent random
+syn keyword informSysFunc sibling younger youngest metaclass
+if exists("inform_highlight_glulx")
+ syn keyword informSysFunc glk
+endif
+
+syn keyword informSysConst adjectives_table actions_table classes_table
+syn keyword informSysConst identifiers_table preactions_table version_number
+syn keyword informSysConst largest_object strings_offset code_offset
+syn keyword informSysConst dict_par1 dict_par2 dict_par3
+syn keyword informSysConst actual_largest_object static_memory_offset
+syn keyword informSysConst array_names_offset readable_memory_offset
+syn keyword informSysConst cpv__start cpv__end ipv__start ipv__end
+syn keyword informSysConst array__start array__end lowest_attribute_number
+syn keyword informSysConst highest_attribute_number attribute_names_array
+syn keyword informSysConst lowest_property_number highest_property_number
+syn keyword informSysConst property_names_array lowest_action_number
+syn keyword informSysConst highest_action_number action_names_array
+syn keyword informSysConst lowest_fake_action_number highest_fake_action_number
+syn keyword informSysConst fake_action_names_array lowest_routine_number
+syn keyword informSysConst highest_routine_number routines_array
+syn keyword informSysConst routine_names_array routine_flags_array
+syn keyword informSysConst lowest_global_number highest_global_number globals_array
+syn keyword informSysConst global_names_array global_flags_array
+syn keyword informSysConst lowest_array_number highest_array_number arrays_array
+syn keyword informSysConst array_names_array array_flags_array lowest_constant_number
+syn keyword informSysConst highest_constant_number constants_array constant_names_array
+syn keyword informSysConst lowest_class_number highest_class_number class_objects_array
+syn keyword informSysConst lowest_object_number highest_object_number
+if !exists("inform_highlight_old")
+ syn keyword informSysConst sys_statusline_flag
+endif
+
+syn keyword informConditional default else if switch
+
+syn keyword informRepeat break continue do for objectloop until while
+
+syn keyword informStatement box font give inversion jump move new_line
+syn keyword informStatement print print_ret quit read remove restore return
+syn keyword informStatement rfalse rtrue save spaces string style
+
+syn keyword informOperator roman reverse bold underline fixed on off to
+syn keyword informOperator near from
+
+syn keyword informKeyword dictionary symbols objects verbs assembly
+syn keyword informKeyword expressions lines tokens linker on off alias long
+syn keyword informKeyword additive score time string table
+syn keyword informKeyword with private has class error fatalerror
+syn keyword informKeyword warning self
+if !exists("inform_highlight_old")
+ syn keyword informKeyword buffer
+endif
+
+syn keyword informMetaAttrib remaining create destroy recreate copy call
+syn keyword informMetaAttrib print_to_array
+
+syn keyword informPredicate has hasnt in notin ofclass or
+syn keyword informPredicate provides
+
+syn keyword informGrammar contained noun held multi multiheld multiexcept
+syn keyword informGrammar contained multiinside creature special number
+syn keyword informGrammar contained scope topic reverse meta only replace
+syn keyword informGrammar contained first last
+
+syn keyword informKeywordObsolete contained initial data initstr
+
+syn keyword informTodo contained TODO
+
+" Assembly language mnemonics must be preceded by a '@'.
+
+syn match informAsmContainer "@\s*\k*" contains=informAsm,informAsmObsolete
+
+if exists("inform_highlight_glulx")
+ syn keyword informAsm contained nop add sub mul div mod neg bitand bitor
+ syn keyword informAsm contained bitxor bitnot shiftl sshiftr ushiftr jump jz
+ syn keyword informAsm contained jnz jeq jne jlt jge jgt jle jltu jgeu jgtu
+ syn keyword informAsm contained jleu call return catch throw tailcall copy
+ syn keyword informAsm contained copys copyb sexs sexb aload aloads aloadb
+ syn keyword informAsm contained aloadbit astore astores astoreb astorebit
+ syn keyword informAsm contained stkcount stkpeek stkswap stkroll stkcopy
+ syn keyword informAsm contained streamchar streamnum streamstr gestalt
+ syn keyword informAsm contained debugtrap getmemsize setmemsize jumpabs
+ syn keyword informAsm contained random setrandom quit verify restart save
+ syn keyword informAsm contained restore saveundo restoreundo protect glk
+ syn keyword informAsm contained getstringtbl setstringtbl getiosys setiosys
+ syn keyword informAsm contained linearsearch binarysearch linkedsearch
+ syn keyword informAsm contained callf callfi callfii callfiii
+else
+ syn keyword informAsm contained je jl jg dec_chk inc_chk jin test or and
+ syn keyword informAsm contained test_attr set_attr clear_attr store
+ syn keyword informAsm contained insert_obj loadw loadb get_prop
+ syn keyword informAsm contained get_prop_addr get_next_prop add sub mul div
+ syn keyword informAsm contained mod call storew storeb put_prop sread
+ syn keyword informAsm contained print_num random push pull
+ syn keyword informAsm contained split_window set_window output_stream
+ syn keyword informAsm contained input_stream sound_effect jz get_sibling
+ syn keyword informAsm contained get_child get_parent get_prop_len inc dec
+ syn keyword informAsm contained remove_obj print_obj ret jump
+ syn keyword informAsm contained load not rtrue rfalse print
+ syn keyword informAsm contained print_ret nop save restore restart
+ syn keyword informAsm contained ret_popped pop quit new_line show_status
+ syn keyword informAsm contained verify call_2s call_vs aread call_vs2
+ syn keyword informAsm contained erase_window erase_line set_cursor get_cursor
+ syn keyword informAsm contained set_text_style buffer_mode read_char
+ syn keyword informAsm contained scan_table call_1s call_2n set_colour throw
+ syn keyword informAsm contained call_vn call_vn2 tokenise encode_text
+ syn keyword informAsm contained copy_table print_table check_arg_count
+ syn keyword informAsm contained call_1n catch piracy log_shift art_shift
+ syn keyword informAsm contained set_font save_undo restore_undo draw_picture
+ syn keyword informAsm contained picture_data erase_picture set_margins
+ syn keyword informAsm contained move_window window_size window_style
+ syn keyword informAsm contained get_wind_prop scroll_window pop_stack
+ syn keyword informAsm contained read_mouse mouse_window push_stack
+ syn keyword informAsm contained put_wind_prop print_form make_menu
+ syn keyword informAsm contained picture_table
+ if !exists("inform_highlight_old")
+ syn keyword informAsm contained check_unicode print_unicode
+ endif
+ syn keyword informAsmObsolete contained print_paddr print_addr print_char
+endif
+
+" Handling for different versions of VIM.
+
+setlocal iskeyword+=$
+command -nargs=+ SynDisplay syntax <args> display
+
+" Grammar sections.
+
+syn region informGrammarSection matchgroup=informGramPreProc start="\<Verb\|Extend\>" skip=+".*"+ end=";"he=e-1 contains=ALLBUT,informAsm
+
+" Special character forms.
+
+SynDisplay match informBadAccent contained "@[^{[:digit:]]\D"
+SynDisplay match informBadAccent contained "@{[^}]*}"
+SynDisplay match informAccent contained "@:[aouAOUeiyEI]"
+SynDisplay match informAccent contained "@'[aeiouyAEIOUY]"
+SynDisplay match informAccent contained "@`[aeiouAEIOU]"
+SynDisplay match informAccent contained "@\^[aeiouAEIOU]"
+SynDisplay match informAccent contained "@\~[anoANO]"
+SynDisplay match informAccent contained "@/[oO]"
+SynDisplay match informAccent contained "@ss\|@<<\|@>>\|@oa\|@oA\|@ae\|@AE\|@cc\|@cC"
+SynDisplay match informAccent contained "@th\|@et\|@Th\|@Et\|@LL\|@oe\|@OE\|@!!\|@??"
+SynDisplay match informAccent contained "@{\x\{1,4}}"
+SynDisplay match informBadStrUnicode contained "@@\D"
+SynDisplay match informStringUnicode contained "@@\d\+"
+SynDisplay match informStringCode contained "@\d\d"
+
+" String and Character constants. Ordering is important here.
+syn region informString start=+"+ skip=+\\\\+ end=+"+ contains=informAccent,informStringUnicode,informStringCode,informBadAccent,informBadStrUnicode
+syn region informDictString start="'" end="'" contains=informAccent,informBadAccent
+SynDisplay match informBadDictString "''"
+SynDisplay match informDictString "'''"
+
+" Integer numbers: decimal, hexadecimal and binary.
+SynDisplay match informNumber "\<\d\+\>"
+SynDisplay match informNumber "\<\$\x\+\>"
+SynDisplay match informNumber "\<\$\$[01]\+\>"
+
+" Comments
+syn match informComment "!.*" contains=informTodo
+
+" Syncronization
+syn sync match informSyncStringEnd grouphere NONE /"[;,]\s*$/
+syn sync match informSyncRoutineEnd grouphere NONE /][;,]\s*$/
+syn sync match informSyncCommentEnd grouphere NONE /^\s*!.*$/
+syn sync match informSyncRoutine groupthere informGrammarSection "\<Verb\|Extend\>"
+syn sync maxlines=500
+
+delcommand SynDisplay
+
+" The default highlighting.
+
+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"
+
+" vim: ts=8
diff --git a/runtime/syntax/initex.vim b/runtime/syntax/initex.vim
new file mode 100644
index 0000000..564a6e0
--- /dev/null
+++ b/runtime/syntax/initex.vim
@@ -0,0 +1,376 @@
+" Vim syntax file
+" Language: TeX (core definition)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+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
+
+syn keyword initexTodo TODO FIXME XXX NOTE
+
+syn match initexComment display contains=initexTodo
+ \ '\\\@<!\%(\\\\\)*\zs%.*$'
+
+syn match initexDimension display contains=@NoSpell
+ \ '[+-]\=\s*\%(\d\+\%([.,]\d*\)\=\|[.,]\d\+\)\s*\%(true\)\=\s*\%(p[tc]\|in\|bp\|c[mc]\|m[mu]\|dd\|sp\|e[mx]\)\>'
+
+syn cluster initexBox
+ \ contains=initexBoxCommand,initexBoxInternalQuantity,
+ \ initexBoxParameterDimen,initexBoxParameterInteger,
+ \ initexBoxParameterToken
+
+syn cluster initexCharacter
+ \ contains=initexCharacterCommand,initexCharacterInternalQuantity,
+ \ initexCharacterParameterInteger
+
+syn cluster initexDebugging
+ \ contains=initexDebuggingCommand,initexDebuggingParameterInteger,
+ \ initexDebuggingParameterToken
+
+syn cluster initexFileIO
+ \ contains=initexFileIOCommand,initexFileIOInternalQuantity,
+ \ initexFileIOParameterToken
+
+syn cluster initexFonts
+ \ contains=initexFontsCommand,initexFontsInternalQuantity
+
+syn cluster initexGlue
+ \ contains=initexGlueCommand,initexGlueDerivedCommand
+
+syn cluster initexHyphenation
+ \ contains=initexHyphenationCommand,initexHyphenationDerivedCommand,
+ \ initexHyphenationInternalQuantity,initexHyphenationParameterInteger
+
+syn cluster initexInserts
+ \ contains=initexInsertsCommand,initexInsertsParameterDimen,
+ \ initexInsertsParameterGlue,initexInsertsParameterInteger
+
+syn cluster initexJob
+ \ contains=initexJobCommand,initexJobInternalQuantity,
+ \ initexJobParameterInteger
+
+syn cluster initexKern
+ \ contains=initexKernCommand,initexKernInternalQuantity
+
+syn cluster initexLogic
+ \ contains=initexLogicCommand
+
+syn cluster initexMacro
+ \ contains=initexMacroCommand,initexMacroDerivedCommand,
+ \ initexMacroParameterInteger
+
+syn cluster initexMarks
+ \ contains=initexMarksCommand
+
+syn cluster initexMath
+ \ contains=initexMathCommand,initexMathDerivedCommand,
+ \ initexMathInternalQuantity,initexMathParameterDimen,
+ \ initexMathParameterGlue,initexMathParameterInteger,
+ \ initexMathParameterMuglue,initexMathParameterToken
+
+syn cluster initexPage
+ \ contains=initexPageInternalQuantity,initexPageParameterDimen,
+ \ initexPageParameterGlue
+
+syn cluster initexParagraph
+ \ contains=initexParagraphCommand,initexParagraphInternalQuantity,
+ \ initexParagraphParameterDimen,initexParagraphParameterGlue,
+ \ initexParagraphParameterInteger,initexParagraphParameterToken
+
+syn cluster initexPenalties
+ \ contains=initexPenaltiesCommand,initexPenaltiesInternalQuantity,
+ \ initexPenaltiesParameterInteger
+
+syn cluster initexRegisters
+ \ contains=initexRegistersCommand,initexRegistersInternalQuantity
+
+syn cluster initexTables
+ \ contains=initexTablesCommand,initexTablesParameterGlue,
+ \ initexTablesParameterToken
+
+syn cluster initexCommand
+ \ contains=initexBoxCommand,initexCharacterCommand,
+ \ initexDebuggingCommand,initexFileIOCommand,
+ \ initexFontsCommand,initexGlueCommand,
+ \ initexHyphenationCommand,initexInsertsCommand,
+ \ initexJobCommand,initexKernCommand,initexLogicCommand,
+ \ initexMacroCommand,initexMarksCommand,initexMathCommand,
+ \ initexParagraphCommand,initexPenaltiesCommand,initexRegistersCommand,
+ \ initexTablesCommand
+
+syn match initexBoxCommand display contains=@NoSpell
+ \ '\\\%([hv]\=box\|[cx]\=leaders\|copy\|[hv]rule\|lastbox\|setbox\|un[hv]\%(box\|copy\)\|vtop\)\>'
+syn match initexCharacterCommand display contains=@NoSpell
+ \ '\\\%([] ]\|\%(^^M\|accent\|char\|\%(lower\|upper\)case\|number\|romannumeral\|string\)\>\)'
+syn match initexDebuggingCommand display contains=@NoSpell
+ \ '\\\%(\%(batch\|\%(non\|error\)stop\|scroll\)mode\|\%(err\)\=message\|meaning\|show\%(box\%(breadth\|depth\)\=\|lists\|the\)\)\>'
+syn match initexFileIOCommand display contains=@NoSpell
+ \ '\\\%(\%(close\|open\)\%(in\|out\)\|endinput\|immediate\|input\|read\|shipout\|special\|write\)\>'
+syn match initexFontsCommand display contains=@NoSpell
+ \ '\\\%(/\|fontname\)\>'
+syn match initexGlueCommand display contains=@NoSpell
+ \ '\\\%([hv]\|un\)skip\>'
+syn match initexHyphenationCommand display contains=@NoSpell
+ \ '\\\%(discretionary\|hyphenation\|patterns\|setlanguage\)\>'
+syn match initexInsertsCommand display contains=@NoSpell
+ \ '\\\%(insert\|split\%(bot\|first\)mark\|vsplit\)\>'
+syn match initexJobCommand display contains=@NoSpell
+ \ '\\\%(dump\|end\|jobname\)\>'
+syn match initexKernCommand display contains=@NoSpell
+ \ '\\\%(kern\|lower\|move\%(left\|right\)\|raise\|unkern\)\>'
+syn match initexLogicCommand display contains=@NoSpell
+ \ '\\\%(else\|fi\|if[a-zA-Z@]\+\|or\)\>'
+" \ '\\\%(else\|fi\|if\%(case\|cat\|dim\|eof\|false\|[hv]box\|[hmv]mode\|inner\|num\|odd\|true\|void\|x\)\=\|or\)\>'
+syn match initexMacroCommand display contains=@NoSpell
+ \ '\\\%(after\%(assignment\|group\)\|\%(begin\|end\)group\|\%(end\)\=csname\|e\=def\|expandafter\|futurelet\|global\|let\|long\|noexpand\|outer\|relax\|the\)\>'
+syn match initexMarksCommand display contains=@NoSpell
+ \ '\\\%(bot\|first\|top\)\=mark\>'
+syn match initexMathCommand display contains=@NoSpell
+ \ '\\\%(abovewithdelims\|delimiter\|display\%(limits\|style\)\|l\=eqno\|left\|\%(no\)\=limits\|math\%(accent\|bin\|char\|choice\|close\|code\|inner\|op\|open\|ord\|punct\|rel\)\|mkern\|mskip\|muskipdef\|nonscript\|\%(over\|under\)line\|radical\|right\|\%(\%(script\)\{1,2}\|text\)style\|vcenter\)\>'
+syn match initexParagraphCommand display contains=@NoSpell
+ \ '\\\%(ignorespaces\|indent\|no\%(boundary\|indent\)\|par\|vadjust\)\>'
+syn match initexPenaltiesCommand display contains=@NoSpell
+ \ '\\\%(un\)\=penalty\>'
+syn match initexRegistersCommand display contains=@NoSpell
+ \ '\\\%(advance\|\%(count\|dimen\|skip\|toks\)def\|divide\|multiply\)\>'
+syn match initexTablesCommand display contains=@NoSpell
+ \ '\\\%(cr\|crcr\|[hv]align\|noalign\|omit\|span\)\>'
+
+syn cluster initexDerivedCommand
+ \ contains=initexGlueDerivedCommand,initexHyphenationDerivedCommand,
+ \ initexMacroDerivedCommand,initexMathDerivedCommand
+
+syn match initexGlueDerivedCommand display contains=@NoSpell
+ \ '\\\%([hv]fil\%(l\|neg\)\=\|[hv]ss\)\>'
+syn match initexHyphenationDerivedCommand display contains=@NoSpell
+ \ '\\-'
+syn match initexMacroDerivedCommand display contains=@NoSpell
+ \ '\\[gx]def\>'
+syn match initexMathDerivedCommand display contains=@NoSpell
+ \ '\\\%(above\|atop\%(withdelims\)\=\|mathchardef\|over\|overwithdelims\)\>'
+
+syn cluster initexInternalQuantity
+ \ contains=initexBoxInternalQuantity,initexCharacterInternalQuantity,
+ \ initexFileIOInternalQuantity,initexFontsInternalQuantity,
+ \ initexHyphenationInternalQuantity,initexJobInternalQuantity,
+ \ initexKernInternalQuantity,initexMathInternalQuantity,
+ \ initexPageInternalQuantity,initexParagraphInternalQuantity,
+ \ initexPenaltiesInternalQuantity,initexRegistersInternalQuantity
+
+syn match initexBoxInternalQuantity display contains=@NoSpell
+ \ '\\\%(badness\|dp\|ht\|prevdepth\|wd\)\>'
+syn match initexCharacterInternalQuantity display contains=@NoSpell
+ \ '\\\%(catcode\|chardef\|\%([ul]c\|sf\)code\)\>'
+syn match initexFileIOInternalQuantity display contains=@NoSpell
+ \ '\\inputlineno\>'
+syn match initexFontsInternalQuantity display contains=@NoSpell
+ \ '\\\%(font\%(dimen\)\=\|nullfont\)\>'
+syn match initexHyphenationInternalQuantity display contains=@NoSpell
+ \ '\\hyphenchar\>'
+syn match initexJobInternalQuantity display contains=@NoSpell
+ \ '\\deadcycles\>'
+syn match initexKernInternalQuantity display contains=@NoSpell
+ \ '\\lastkern\>'
+syn match initexMathInternalQuantity display contains=@NoSpell
+ \ '\\\%(delcode\|mathcode\|muskip\|\%(\%(script\)\{1,2}\|text\)font\|skewchar\)\>'
+syn match initexPageInternalQuantity display contains=@NoSpell
+ \ '\\page\%(depth\|fil\{1,3}stretch\|goal\|shrink\|stretch\|total\)\>'
+syn match initexParagraphInternalQuantity display contains=@NoSpell
+ \ '\\\%(prevgraf\|spacefactor\)\>'
+syn match initexPenaltiesInternalQuantity display contains=@NoSpell
+ \ '\\lastpenalty\>'
+syn match initexRegistersInternalQuantity display contains=@NoSpell
+ \ '\\\%(count\|dimen\|skip\|toks\)\d\+\>'
+
+syn cluster initexParameterDimen
+ \ contains=initexBoxParameterDimen,initexInsertsParameterDimen,
+ \ initexMathParameterDimen,initexPageParameterDimen,
+ \ initexParagraphParameterDimen
+
+syn match initexBoxParameterDimen display contains=@NoSpell
+ \ '\\\%(boxmaxdepth\|[hv]fuzz\|overfullrule\)\>'
+syn match initexInsertsParameterDimen display contains=@NoSpell
+ \ '\\splitmaxdepth\>'
+syn match initexMathParameterDimen display contains=@NoSpell
+ \ '\\\%(delimitershortfall\|display\%(indent\|width\)\|mathsurround\|nulldelimiterspace\|predisplaysize\|scriptspace\)\>'
+syn match initexPageParameterDimen display contains=@NoSpell
+ \ '\\\%([hv]offset\|maxdepth\|vsize\)\>'
+syn match initexParagraphParameterDimen display contains=@NoSpell
+ \ '\\\%(emergencystretch\|\%(hang\|par\)indent\|hsize\|lineskiplimit\)\>'
+
+syn cluster initexParameterGlue
+ \ contains=initexInsertsParameterGlue,initexMathParameterGlue,
+ \ initexPageParameterGlue,initexParagraphParameterGlue,
+ \ initexTablesParameterGlue
+
+syn match initexInsertsParameterGlue display contains=@NoSpell
+ \ '\\splittopskip\>'
+syn match initexMathParameterGlue display contains=@NoSpell
+ \ '\\\%(above\|below\)display\%(short\)\=skip\>'
+syn match initexPageParameterGlue display contains=@NoSpell
+ \ '\\topskip\>'
+syn match initexParagraphParameterGlue display contains=@NoSpell
+ \ '\\\%(baseline\|left\|line\|par\%(fill\)\=\|right\|x\=space\)skip\>'
+syn match initexTablesParameterGlue display contains=@NoSpell
+ \ '\\tabskip\>'
+
+syn cluster initexParameterInteger
+ \ contains=initexBoxParameterInteger,initexCharacterParameterInteger,
+ \ initexDebuggingParameterInteger,initexHyphenationParameterInteger,
+ \ initexInsertsParameterInteger,initexJobParameterInteger,
+ \ initexMacroParameterInteger,initexMathParameterInteger,
+ \ initexParagraphParameterInteger,initexPenaltiesParameterInteger,
+
+syn match initexBoxParameterInteger display contains=@NoSpell
+ \ '\\[hv]badness\>'
+syn match initexCharacterParameterInteger display contains=@NoSpell
+ \ '\\\%(\%(endline\|escape\|newline\)char\)\>'
+syn match initexDebuggingParameterInteger display contains=@NoSpell
+ \ '\\\%(errorcontextlines\|pausing\|tracing\%(commands\|lostchars\|macros\|online\|output\|pages\|paragraphs\|restores|stats\)\)\>'
+syn match initexHyphenationParameterInteger display contains=@NoSpell
+ \ '\\\%(defaulthyphenchar\|language\|\%(left\|right\)hyphenmin\|uchyph\)\>'
+syn match initexInsertsParameterInteger display contains=@NoSpell
+ \ '\\\%(holdinginserts\)\>'
+syn match initexJobParameterInteger display contains=@NoSpell
+ \ '\\\%(day\|mag\|maxdeadcycles\|month\|time\|year\)\>'
+syn match initexMacroParameterInteger display contains=@NoSpell
+ \ '\\globaldefs\>'
+syn match initexMathParameterInteger display contains=@NoSpell
+ \ '\\\%(binoppenalty\|defaultskewchar\|delimiterfactor\|displaywidowpenalty\|fam\|\%(post\|pre\)displaypenalty\|relpenalty\)\>'
+syn match initexParagraphParameterInteger display contains=@NoSpell
+ \ '\\\%(\%(adj\|\%(double\|final\)hyphen\)demerits\|looseness\|\%(pre\)\=tolerance\)\>'
+syn match initexPenaltiesParameterInteger display contains=@NoSpell
+ \ '\\\%(broken\|club\|exhyphen\|floating\|hyphen\|interline\|line\|output\|widow\)penalty\>'
+
+syn cluster initexParameterMuglue
+ \ contains=initexMathParameterMuglue
+
+syn match initexMathParameterMuglue display contains=@NoSpell
+ \ '\\\%(med\|thick\|thin\)muskip\>'
+
+syn cluster initexParameterDimen
+ \ contains=initexBoxParameterToken,initexDebuggingParameterToken,
+ \ initexFileIOParameterToken,initexMathParameterToken,
+ \ initexParagraphParameterToken,initexTablesParameterToken
+
+syn match initexBoxParameterToken display contains=@NoSpell
+ \ '\\every[hv]box\>'
+syn match initexDebuggingParameterToken display contains=@NoSpell
+ \ '\\errhelp\>'
+syn match initexFileIOParameterToken display contains=@NoSpell
+ \ '\\output\>'
+syn match initexMathParameterToken display contains=@NoSpell
+ \ '\\every\%(display\|math\)\>'
+syn match initexParagraphParameterToken display contains=@NoSpell
+ \ '\\everypar\>'
+syn match initexTablesParameterToken display contains=@NoSpell
+ \ '\\everycr\>'
+
+
+hi def link initexCharacter Character
+hi def link initexNumber Number
+
+hi def link initexIdentifier Identifier
+
+hi def link initexStatement Statement
+hi def link initexConditional Conditional
+
+hi def link initexPreProc PreProc
+hi def link initexMacro Macro
+
+hi def link initexType Type
+
+hi def link initexDebug Debug
+
+hi def link initexTodo Todo
+hi def link initexComment Comment
+hi def link initexDimension initexNumber
+
+hi def link initexCommand initexStatement
+hi def link initexBoxCommand initexCommand
+hi def link initexCharacterCommand initexCharacter
+hi def link initexDebuggingCommand initexDebug
+hi def link initexFileIOCommand initexCommand
+hi def link initexFontsCommand initexType
+hi def link initexGlueCommand initexCommand
+hi def link initexHyphenationCommand initexCommand
+hi def link initexInsertsCommand initexCommand
+hi def link initexJobCommand initexPreProc
+hi def link initexKernCommand initexCommand
+hi def link initexLogicCommand initexConditional
+hi def link initexMacroCommand initexMacro
+hi def link initexMarksCommand initexCommand
+hi def link initexMathCommand initexCommand
+hi def link initexParagraphCommand initexCommand
+hi def link initexPenaltiesCommand initexCommand
+hi def link initexRegistersCommand initexCommand
+hi def link initexTablesCommand initexCommand
+
+hi def link initexDerivedCommand initexStatement
+hi def link initexGlueDerivedCommand initexDerivedCommand
+hi def link initexHyphenationDerivedCommand initexDerivedCommand
+hi def link initexMacroDerivedCommand initexDerivedCommand
+hi def link initexMathDerivedCommand initexDerivedCommand
+
+hi def link initexInternalQuantity initexIdentifier
+hi def link initexBoxInternalQuantity initexInternalQuantity
+hi def link initexCharacterInternalQuantity initexInternalQuantity
+hi def link initexFileIOInternalQuantity initexInternalQuantity
+hi def link initexFontsInternalQuantity initexInternalQuantity
+hi def link initexHyphenationInternalQuantity initexInternalQuantity
+hi def link initexJobInternalQuantity initexInternalQuantity
+hi def link initexKernInternalQuantity initexInternalQuantity
+hi def link initexMathInternalQuantity initexInternalQuantity
+hi def link initexPageInternalQuantity initexInternalQuantity
+hi def link initexParagraphInternalQuantity initexInternalQuantity
+hi def link initexPenaltiesInternalQuantity initexInternalQuantity
+hi def link initexRegistersInternalQuantity initexInternalQuantity
+
+hi def link initexParameterDimen initexNumber
+hi def link initexBoxParameterDimen initexParameterDimen
+hi def link initexInsertsParameterDimen initexParameterDimen
+hi def link initexMathParameterDimen initexParameterDimen
+hi def link initexPageParameterDimen initexParameterDimen
+hi def link initexParagraphParameterDimen initexParameterDimen
+
+hi def link initexParameterGlue initexNumber
+hi def link initexInsertsParameterGlue initexParameterGlue
+hi def link initexMathParameterGlue initexParameterGlue
+hi def link initexPageParameterGlue initexParameterGlue
+hi def link initexParagraphParameterGlue initexParameterGlue
+hi def link initexTablesParameterGlue initexParameterGlue
+
+hi def link initexParameterInteger initexNumber
+hi def link initexBoxParameterInteger initexParameterInteger
+hi def link initexCharacterParameterInteger initexParameterInteger
+hi def link initexDebuggingParameterInteger initexParameterInteger
+hi def link initexHyphenationParameterInteger initexParameterInteger
+hi def link initexInsertsParameterInteger initexParameterInteger
+hi def link initexJobParameterInteger initexParameterInteger
+hi def link initexMacroParameterInteger initexParameterInteger
+hi def link initexMathParameterInteger initexParameterInteger
+hi def link initexParagraphParameterInteger initexParameterInteger
+hi def link initexPenaltiesParameterInteger initexParameterInteger
+
+hi def link initexParameterMuglue initexNumber
+hi def link initexMathParameterMuglue initexParameterMuglue
+
+hi def link initexParameterToken initexIdentifier
+hi def link initexBoxParameterToken initexParameterToken
+hi def link initexDebuggingParameterToken initexParameterToken
+hi def link initexFileIOParameterToken initexParameterToken
+hi def link initexMathParameterToken initexParameterToken
+hi def link initexParagraphParameterToken initexParameterToken
+hi def link initexTablesParameterToken initexParameterToken
+
+let b:current_syntax = "initex"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/initng.vim b/runtime/syntax/initng.vim
new file mode 100644
index 0000000..959c79a
--- /dev/null
+++ b/runtime/syntax/initng.vim
@@ -0,0 +1,90 @@
+" Vim syntax file
+" Language: initng .i files
+" Maintainer: Elan Ruusamäe <glen@pld-linux.org>
+" URL: http://glen.alkohol.ee/pld/initng/
+" License: GPL v2
+" Version: 0.13
+" Last Change: $Date: 2007/05/05 17:17:40 $
+"
+" Syntax highlighting for initng .i files. Inherits from sh.vim and adds
+" in the hiliting to start/stop {} blocks. Requires vim 6.3 or later.
+
+if &compatible || v:version < 603
+ finish
+endif
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+let is_bash = 1
+syn include @shTop syntax/sh.vim
+
+syn region initngService matchgroup=initngServiceHeader start="^\s*\(service\|virtual\|daemon\|class\|cron\)\s\+\(\(\w\|[-/*]\)\+\(\s\+:\s\+\(\w\|[-/*]\)\+\)\?\)\s\+{" end="}" contains=@initngServiceCluster
+syn cluster initngServiceCluster contains=initngComment,initngAction,initngServiceOption,initngServiceHeader,initngDelim,initngVariable
+
+syn region initngAction matchgroup=initngActionHeader start="^\s*\(script start\|script stop\|script run\)\s*=\s*{" end="}" contains=@initngActionCluster
+syn cluster initngActionCluster contains=@shTop
+
+syn match initngDelim /[{}]/ contained
+
+syn region initngString start=/"/ end=/"/ skip=/\\"/
+
+" option = value
+syn match initngServiceOption /.\+\s*=.\+;/ contains=initngServiceKeywords,initngSubstMacro contained
+" option without value
+syn match initngServiceOption /\w\+;/ contains=initngServiceKeywords,initngSubstMacro contained
+
+" options with value
+syn keyword initngServiceKeywords also_stop need use nice setuid contained
+syn keyword initngServiceKeywords delay chdir suid sgid start_pause env_file env_parse pid_file pidfile contained
+syn keyword initngServiceKeywords pid_of up_when_pid_set stdout stderr syncron just_before contained
+syn keyword initngServiceKeywords provide lockfile daemon_stops_badly contained
+syn match initngServiceKeywords /\(script\|exec\(_args\)\?\) \(start\|stop\|daemon\)/ contained
+syn match initngServiceKeywords /env\s\+\w\+/ contained
+
+" rlimits
+syn keyword initngServiceKeywords rlimit_cpu_hard rlimit_core_soft contained
+
+" single options
+syn keyword initngServiceKeywords last respawn network_provider require_network require_file critical forks contained
+" cron options
+syn keyword initngServiceKeywords hourly contained
+syn match initngVariable /\${\?\w\+\}\?/
+
+" Substituted @foo@ macros:
+" ==========
+syn match initngSubstMacro /@[^@]\+@/ contained
+syn cluster initngActionCluster add=initngSubstMacro
+syn cluster shCommandSubList add=initngSubstMacro
+
+" Comments:
+" ==========
+syn cluster initngCommentGroup contains=initngTodo,@Spell
+syn keyword initngTodo TODO FIXME XXX contained
+syn match initngComment /#.*$/ contains=@initngCommentGroup
+
+" install_service #macros
+" TODO: syntax check for ifd-endd pairs
+" ==========
+syn region initngDefine start="^#\(endd\|elsed\|exec\|ifd\|endexec\|endd\)\>" skip="\\$" end="$" end="#"me=s-1
+syn cluster shCommentGroup add=initngDefine
+syn cluster initngCommentGroup add=initngDefine
+
+hi def link initngComment Comment
+hi def link initngTodo Todo
+
+hi def link initngString String
+hi def link initngServiceKeywords Define
+
+hi def link initngServiceHeader Keyword
+hi def link initngActionHeader Type
+hi def link initngDelim Delimiter
+
+hi def link initngVariable PreProc
+hi def link initngSubstMacro Comment
+hi def link initngDefine Macro
+
+let b:current_syntax = "initng"
diff --git a/runtime/syntax/inittab.vim b/runtime/syntax/inittab.vim
new file mode 100644
index 0000000..fc5adfc
--- /dev/null
+++ b/runtime/syntax/inittab.vim
@@ -0,0 +1,62 @@
+" Vim syntax file
+" Language: SysV-compatible init process control file `inittab'
+" Maintainer: Donovan Keohane <donovan.keohane@gmail.com>
+" Previous Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2019-11-19
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" Base constructs
+syn match inittabError "[^:]\+:"me=e-1 contained
+syn match inittabError "[^:]\+$" contained
+syn match inittabComment "^[#:].*$" contains=inittabFixme
+syn match inittabComment "#.*$" contained contains=inittabFixme
+syn keyword inittabFixme FIXME TODO XXX NOT
+
+" Shell
+syn region inittabShString start=+"+ end=+"+ skip=+\\\\\|\\\"+ contained
+syn region inittabShString start=+'+ end=+'+ contained
+syn match inittabShOption "\s[-+][[:alnum:]]\+"ms=s+1 contained
+syn match inittabShOption "\s--[:alnum:][-[:alnum:]]*"ms=s+1 contained
+syn match inittabShCommand "\S\+" contained
+syn cluster inittabSh add=inittabShOption,inittabShString,inittabShCommand
+
+" Keywords
+syn keyword inittabActionName respawn wait once boot bootwait off ondemand sysinit powerwait powerfail powerokwait powerfailnow ctrlaltdel kbrequest initdefault contained
+
+" Line parser
+syn match inittabId "^[[:alnum:]~]\{1,4}" nextgroup=inittabColonRunLevels,inittabError
+syn match inittabColonRunLevels ":" contained nextgroup=inittabRunLevels,inittabColonAction,inittabError
+syn match inittabRunLevels "[0-6A-Ca-cSs]\+" contained nextgroup=inittabColonAction,inittabError
+syn match inittabColonAction ":" contained nextgroup=inittabAction,inittabError
+syn match inittabAction "\w\+" contained nextgroup=inittabColonProcess,inittabError contains=inittabActionName
+syn match inittabColonProcess ":" contained nextgroup=inittabProcessPlus,inittabProcess,inittabError
+syn match inittabProcessPlus "+" contained nextgroup=inittabProcess,inittabError
+syn region inittabProcess start="\S" end="$" transparent oneline contained contains=@inittabSh,inittabComment
+
+" Define the default highlighting
+
+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
+
+hi def link inittabColonProcess inittabColon
+hi def link inittabColonAction inittabColon
+hi def link inittabColonRunLevels inittabColon
+hi def link inittabColon PreProc
+
+hi def link inittabShString String
+hi def link inittabShOption Special
+hi def link inittabShCommand Statement
+
+
+let b:current_syntax = "inittab"
diff --git a/runtime/syntax/ipfilter.vim b/runtime/syntax/ipfilter.vim
new file mode 100644
index 0000000..c007626
--- /dev/null
+++ b/runtime/syntax/ipfilter.vim
@@ -0,0 +1,55 @@
+" ipfilter syntax file
+" Language: ipfilter configuration file
+" Maintainer: Hendrik Scholz <hendrik@scholz.net>
+" Last Change: 2022 Jun 14
+"
+" http://www.wormulon.net/files/misc/ipfilter.vim
+"
+" This will also work for OpenBSD pf but there might be some tags that are
+" not correctly identified.
+" Please send comments to hendrik@scholz.net
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Comment
+syn match IPFComment /#.*$/ contains=ipfTodo
+syn keyword IPFTodo TODO XXX FIXME contained
+
+syn keyword IPFActionBlock block
+syn keyword IPFActionPass pass
+syn keyword IPFProto tcp udp icmp
+syn keyword IPFSpecial quick log first
+" how could we use keyword for words with '-' ?
+syn match IPFSpecial /return-rst/
+syn match IPFSpecial /dup-to/
+"syn match IPFSpecial /icmp-type unreach/
+syn keyword IPFAny all any
+syn match IPFIPv4 /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/
+syn match IPFNetmask /\/\d\+/
+
+" service name constants
+syn keyword IPFService auth bgp domain finger ftp http https ident
+syn keyword IPFService imap irc isakmp kerberos mail nameserver nfs
+syn keyword IPFService nntp ntp pop3 portmap pptp rpcbind rsync smtp
+syn keyword IPFService snmp snmptrap socks ssh sunrpc syslog telnet
+syn keyword IPFService tftp www
+
+" Comment
+hi def link IPFComment Comment
+hi def link IPFTodo Todo
+
+hi def link IPFService Constant
+
+hi def link IPFAction Type
+hi def link ipfActionBlock String
+hi def link ipfActionPass Type
+hi def link IPFSpecial Statement
+hi def link IPFIPv4 Label
+hi def link IPFNetmask String
+hi def link IPFAny Statement
+hi def link IPFProto Identifier
+
+let b:current_syntax = 'ipfilter'
diff --git a/runtime/syntax/ishd.vim b/runtime/syntax/ishd.vim
new file mode 100644
index 0000000..3c468e3
--- /dev/null
+++ b/runtime/syntax/ishd.vim
@@ -0,0 +1,409 @@
+" Vim syntax file
+" Language: InstallShield Script
+" Maintainer: Robert M. Cortopassi <cortopar@mindspring.com>
+" Last Change: 2001 May 09
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword ishdStatement abort begin case default downto else end
+syn keyword ishdStatement endif endfor endwhile endswitch endprogram exit elseif
+syn keyword ishdStatement error for function goto if
+syn keyword ishdStatement program prototype return repeat string step switch
+syn keyword ishdStatement struct then to typedef until while
+
+syn keyword ishdType BOOL BYREF CHAR GDI HWND INT KERNEL LIST LONG
+syn keyword ishdType NUMBER POINTER SHORT STRING USER
+
+syn keyword ishdConstant _MAX_LENGTH _MAX_STRING
+syn keyword ishdConstant AFTER ALLCONTENTS ALLCONTROLS APPEND ASKDESTPATH
+syn keyword ishdConstant ASKOPTIONS ASKPATH ASKTEXT BATCH_INSTALL BACK
+syn keyword ishdConstant BACKBUTTON BACKGROUND BACKGROUNDCAPTION BADPATH
+syn keyword ishdConstant BADTAGFILE BASEMEMORY BEFORE BILLBOARD BINARY
+syn keyword ishdConstant BITMAP256COLORS BITMAPFADE BITMAPICON BK_BLUE BK_GREEN
+syn keyword ishdConstant BK_MAGENTA BK_MAGENTA1 BK_ORANGE BK_PINK BK_RED
+syn keyword ishdConstant BK_SMOOTH BK_SOLIDBLACK BK_SOLIDBLUE BK_SOLIDGREEN
+syn keyword ishdConstant BK_SOLIDMAGENTA BK_SOLIDORANGE BK_SOLIDPINK BK_SOLIDRED
+syn keyword ishdConstant BK_SOLIDWHITE BK_SOLIDYELLOW BK_YELLOW BLACK BLUE
+syn keyword ishdConstant BOOTUPDRIVE BUTTON_CHECKED BUTTON_ENTER BUTTON_UNCHECKED
+syn keyword ishdConstant BUTTON_UNKNOWN CMDLINE COMMONFILES CANCEL CANCELBUTTON
+syn keyword ishdConstant CC_ERR_FILEFORMATERROR CC_ERR_FILEREADERROR
+syn keyword ishdConstant CC_ERR_NOCOMPONENTLIST CC_ERR_OUTOFMEMORY CDROM
+syn keyword ishdConstant CDROM_DRIVE CENTERED CHANGEDIR CHECKBOX CHECKBOX95
+syn keyword ishdConstant CHECKLINE CHECKMARK CMD_CLOSE CMD_MAXIMIZE CMD_MINIMIZE
+syn keyword ishdConstant CMD_PUSHDOWN CMD_RESTORE COLORMODE256 COLORS
+syn keyword ishdConstant COMBOBOX_ENTER COMBOBOX_SELECT COMMAND COMMANDEX
+syn keyword ishdConstant COMMON COMP_DONE COMP_ERR_CREATEDIR
+syn keyword ishdConstant COMP_ERR_DESTCONFLICT COMP_ERR_FILENOTINLIB
+syn keyword ishdConstant COMP_ERR_FILESIZE COMP_ERR_FILETOOLARGE
+syn keyword ishdConstant COMP_ERR_HEADER COMP_ERR_INCOMPATIBLE
+syn keyword ishdConstant COMP_ERR_INTPUTNOTCOMPRESSED COMP_ERR_INVALIDLIST
+syn keyword ishdConstant COMP_ERR_LAUNCHSERVER COMP_ERR_MEMORY
+syn keyword ishdConstant COMP_ERR_NODISKSPACE COMP_ERR_OPENINPUT
+syn keyword ishdConstant COMP_ERR_OPENOUTPUT COMP_ERR_OPTIONS
+syn keyword ishdConstant COMP_ERR_OUTPUTNOTCOMPRESSED COMP_ERR_SPLIT
+syn keyword ishdConstant COMP_ERR_TARGET COMP_ERR_TARGETREADONLY COMP_ERR_WRITE
+syn keyword ishdConstant COMP_INFO_ATTRIBUTE COMP_INFO_COMPSIZE COMP_INFO_DATE
+syn keyword ishdConstant COMP_INFO_INVALIDATEPASSWORD COMP_INFO_ORIGSIZE
+syn keyword ishdConstant COMP_INFO_SETPASSWORD COMP_INFO_TIME
+syn keyword ishdConstant COMP_INFO_VERSIONLS COMP_INFO_VERSIONMS COMP_NORMAL
+syn keyword ishdConstant COMP_UPDATE_DATE COMP_UPDATE_DATE_NEWER
+syn keyword ishdConstant COMP_UPDATE_SAME COMP_UPDATE_VERSION COMPACT
+syn keyword ishdConstant COMPARE_DATE COMPARE_SIZE COMPARE_VERSION
+syn keyword ishdConstant COMPONENT_FIELD_CDROM_FOLDER
+syn keyword ishdConstant COMPONENT_FIELD_DESCRIPTION COMPONENT_FIELD_DESTINATION
+syn keyword ishdConstant COMPONENT_FIELD_DISPLAYNAME COMPONENT_FIELD_FILENEED
+syn keyword ishdConstant COMPONENT_FIELD_FTPLOCATION
+syn keyword ishdConstant COMPONENT_FIELD_HTTPLOCATION COMPONENT_FIELD_MISC
+syn keyword ishdConstant COMPONENT_FIELD_OVERWRITE COMPONENT_FIELD_PASSWORD
+syn keyword ishdConstant COMPONENT_FIELD_SELECTED COMPONENT_FIELD_SIZE
+syn keyword ishdConstant COMPONENT_FIELD_STATUS COMPONENT_FIELD_VISIBLE
+syn keyword ishdConstant COMPONENT_FILEINFO_COMPRESSED
+syn keyword ishdConstant COMPONENT_FILEINFO_COMPRESSENGINE
+syn keyword ishdConstant COMPONENT_FILEINFO_LANGUAGECOMPONENT_FILEINFO_OS
+syn keyword ishdConstant COMPONENT_FILEINFO_POTENTIALLYLOCKED
+syn keyword ishdConstant COMPONENT_FILEINFO_SELFREGISTERING
+syn keyword ishdConstant COMPONENT_FILEINFO_SHARED COMPONENT_INFO_ATTRIBUTE
+syn keyword ishdConstant COMPONENT_INFO_COMPSIZE COMPONENT_INFO_DATE
+syn keyword ishdConstant COMPONENT_INFO_DATE_EX_EX COMPONENT_INFO_LANGUAGE
+syn keyword ishdConstant COMPONENT_INFO_ORIGSIZE COMPONENT_INFO_OS
+syn keyword ishdConstant COMPONENT_INFO_TIME COMPONENT_INFO_VERSIONLS
+syn keyword ishdConstant COMPONENT_INFO_VERSIONMS COMPONENT_INFO_VERSIONSTR
+syn keyword ishdConstant COMPONENT_VALUE_ALWAYSOVERWRITE
+syn keyword ishdConstant COMPONENT_VALUE_CRITICAL
+syn keyword ishdConstant COMPONENT_VALUE_HIGHLYRECOMMENDED
+syn keyword ishdConstant COMPONENT_FILEINFO_LANGUAGE COMPONENT_FILEINFO_OS
+syn keyword ishdConstant COMPONENT_VALUE_NEVEROVERWRITE
+syn keyword ishdConstant COMPONENT_VALUE_NEWERDATE COMPONENT_VALUE_NEWERVERSION
+syn keyword ishdConstant COMPONENT_VALUE_OLDERDATE COMPONENT_VALUE_OLDERVERSION
+syn keyword ishdConstant COMPONENT_VALUE_SAMEORNEWDATE
+syn keyword ishdConstant COMPONENT_VALUE_SAMEORNEWERVERSION
+syn keyword ishdConstant COMPONENT_VALUE_STANDARD COMPONENT_VIEW_CHANGE
+syn keyword ishdConstant COMPONENT_INFO_DATE_EX COMPONENT_VIEW_CHILDVIEW
+syn keyword ishdConstant COMPONENT_VIEW_COMPONENT COMPONENT_VIEW_DESCRIPTION
+syn keyword ishdConstant COMPONENT_VIEW_MEDIA COMPONENT_VIEW_PARENTVIEW
+syn keyword ishdConstant COMPONENT_VIEW_SIZEAVAIL COMPONENT_VIEW_SIZETOTAL
+syn keyword ishdConstant COMPONENT_VIEW_TARGETLOCATION COMPRESSHIGH COMPRESSLOW
+syn keyword ishdConstant COMPRESSMED COMPRESSNONE CONTIGUOUS CONTINUE
+syn keyword ishdConstant COPY_ERR_CREATEDIR COPY_ERR_NODISKSPACE
+syn keyword ishdConstant COPY_ERR_OPENINPUT COPY_ERR_OPENOUTPUT
+syn keyword ishdConstant COPY_ERR_TARGETREADONLY COPY_ERR_MEMORY
+syn keyword ishdConstant CORECOMPONENTHANDLING CPU CUSTOM DATA_COMPONENT
+syn keyword ishdConstant DATA_LIST DATA_NUMBER DATA_STRING DATE DEFAULT
+syn keyword ishdConstant DEFWINDOWMODE DELETE_EOF DIALOG DIALOGCACHE
+syn keyword ishdConstant DIALOGTHINFONT DIR_WRITEABLE DIRECTORY DISABLE DISK
+syn keyword ishdConstant DISK_FREESPACE DISK_TOTALSPACE DISKID DLG_ASK_OPTIONS
+syn keyword ishdConstant DLG_ASK_PATH DLG_ASK_TEXT DLG_ASK_YESNO DLG_CANCEL
+syn keyword ishdConstant DLG_CDIR DLG_CDIR_MSG DLG_CENTERED DLG_CLOSE
+syn keyword ishdConstant DLG_DIR_DIRECTORY DLG_DIR_FILE DLG_ENTER_DISK DLG_ERR
+syn keyword ishdConstant DLG_ERR_ALREADY_EXISTS DLG_ERR_ENDDLG DLG_INFO_ALTIMAGE
+syn keyword ishdConstant DLG_INFO_CHECKMETHOD DLG_INFO_CHECKSELECTION
+syn keyword ishdConstant DLG_INFO_ENABLEIMAGE DLG_INFO_KUNITS
+syn keyword ishdConstant DLG_INFO_USEDECIMAL DLG_INIT DLG_MSG_ALL
+syn keyword ishdConstant DLG_MSG_INFORMATION DLG_MSG_NOT_HAND DLG_MSG_SEVERE
+syn keyword ishdConstant DLG_MSG_STANDARD DLG_MSG_WARNING DLG_OK DLG_STATUS
+syn keyword ishdConstant DLG_USER_CAPTION DRIVE DRIVEOPEN DLG_DIR_DRIVE
+syn keyword ishdConstant EDITBOX_CHANGE EFF_BOXSTRIPE EFF_FADE EFF_HORZREVEAL
+syn keyword ishdConstant EFF_HORZSTRIPE EFF_NONE EFF_REVEAL EFF_VERTSTRIPE
+syn keyword ishdConstant ENABLE END_OF_FILE END_OF_LIST ENHANCED ENTERDISK
+syn keyword ishdConstant ENTERDISK_ERRMSG ENTERDISKBEEP ENVSPACE EQUALS
+syn keyword ishdConstant ERR_BADPATH ERR_BADTAGFILE ERR_BOX_BADPATH
+syn keyword ishdConstant ERR_BOX_BADTAGFILE ERR_BOX_DISKID ERR_BOX_DRIVEOPEN
+syn keyword ishdConstant ERR_BOX_EXIT ERR_BOX_HELP ERR_BOX_NOSPACE ERR_BOX_PAUSE
+syn keyword ishdConstant ERR_BOX_READONLY ERR_DISKID ERR_DRIVEOPEN
+syn keyword ishdConstant EXCLUDE_SUBDIR EXCLUSIVE EXISTS EXIT EXTENDEDMEMORY
+syn keyword ishdConstant EXTENSION_ONLY ERRORFILENAME FADE_IN FADE_OUT
+syn keyword ishdConstant FAILIFEXISTS FALSE FDRIVE_NUM FEEDBACK FEEDBACK_FULL
+syn keyword ishdConstant FEEDBACK_OPERATION FEEDBACK_SPACE FILE_ATTR_ARCHIVED
+syn keyword ishdConstant FILE_ATTR_DIRECTORY FILE_ATTR_HIDDEN FILE_ATTR_NORMAL
+syn keyword ishdConstant FILE_ATTR_READONLY FILE_ATTR_SYSTEM FILE_ATTRIBUTE
+syn keyword ishdConstant FILE_BIN_CUR FILE_BIN_END FILE_BIN_START FILE_DATE
+syn keyword ishdConstant FILE_EXISTS FILE_INSTALLED FILE_INVALID FILE_IS_LOCKED
+syn keyword ishdConstant FILE_LINE_LENGTH FILE_LOCKED FILE_MODE_APPEND
+syn keyword ishdConstant FILE_MODE_BINARY FILE_MODE_BINARYREADONLY
+syn keyword ishdConstant FILE_MODE_NORMAL FILE_NO_VERSION FILE_NOT_FOUND
+syn keyword ishdConstant FILE_RD_ONLY FILE_SIZE FILE_SRC_EQUAL FILE_SRC_OLD
+syn keyword ishdConstant FILE_TIME FILE_WRITEABLE FILENAME FILENAME_ONLY
+syn keyword ishdConstant FINISHBUTTON FIXED_DRIVE FONT_TITLE FREEENVSPACE
+syn keyword ishdConstant FS_CREATEDIR FS_DISKONEREQUIRED FS_DONE FS_FILENOTINLIB
+syn keyword ishdConstant FS_GENERROR FS_INCORRECTDISK FS_LAUNCHPROCESS
+syn keyword ishdConstant FS_OPERROR FS_OUTOFSPACE FS_PACKAGING FS_RESETREQUIRED
+syn keyword ishdConstant FS_TARGETREADONLY FS_TONEXTDISK FULL FULLSCREEN
+syn keyword ishdConstant FULLSCREENSIZE FULLWINDOWMODE FOLDER_DESKTOP
+syn keyword ishdConstant FOLDER_PROGRAMS FOLDER_STARTMENU FOLDER_STARTUP
+syn keyword ishdConstant GREATER_THAN GREEN HELP HKEY_CLASSES_ROOT
+syn keyword ishdConstant HKEY_CURRENT_CONFIG HKEY_CURRENT_USER HKEY_DYN_DATA
+syn keyword ishdConstant HKEY_LOCAL_MACHINE HKEY_PERFORMANCE_DATA HKEY_USERS
+syn keyword ishdConstant HOURGLASS HWND_DESKTOP HWND_INSTALL IGNORE_READONLY
+syn keyword ishdConstant INCLUDE_SUBDIR INDVFILESTATUS INFO INFO_DESCRIPTION
+syn keyword ishdConstant INFO_IMAGE INFO_MISC INFO_SIZE INFO_SUBCOMPONENT
+syn keyword ishdConstant INFO_VISIBLE INFORMATION INVALID_LIST IS_186 IS_286
+syn keyword ishdConstant IS_386 IS_486 IS_8514A IS_86 IS_ALPHA IS_CDROM IS_CGA
+syn keyword ishdConstant IS_DOS IS_EGA IS_FIXED IS_FOLDER IS_ITEM ISLANG_ALL
+syn keyword ishdConstant ISLANG_ARABIC ISLANG_ARABIC_SAUDIARABIA
+syn keyword ishdConstant ISLANG_ARABIC_IRAQ ISLANG_ARABIC_EGYPT
+syn keyword ishdConstant ISLANG_ARABIC_LIBYA ISLANG_ARABIC_ALGERIA
+syn keyword ishdConstant ISLANG_ARABIC_MOROCCO ISLANG_ARABIC_TUNISIA
+syn keyword ishdConstant ISLANG_ARABIC_OMAN ISLANG_ARABIC_YEMEN
+syn keyword ishdConstant ISLANG_ARABIC_SYRIA ISLANG_ARABIC_JORDAN
+syn keyword ishdConstant ISLANG_ARABIC_LEBANON ISLANG_ARABIC_KUWAIT
+syn keyword ishdConstant ISLANG_ARABIC_UAE ISLANG_ARABIC_BAHRAIN
+syn keyword ishdConstant ISLANG_ARABIC_QATAR ISLANG_AFRIKAANS
+syn keyword ishdConstant ISLANG_AFRIKAANS_STANDARD ISLANG_ALBANIAN
+syn keyword ishdConstant ISLANG_ENGLISH_TRINIDAD ISLANG_ALBANIAN_STANDARD
+syn keyword ishdConstant ISLANG_BASQUE ISLANG_BASQUE_STANDARD ISLANG_BULGARIAN
+syn keyword ishdConstant ISLANG_BULGARIAN_STANDARD ISLANG_BELARUSIAN
+syn keyword ishdConstant ISLANG_BELARUSIAN_STANDARD ISLANG_CATALAN
+syn keyword ishdConstant ISLANG_CATALAN_STANDARD ISLANG_CHINESE
+syn keyword ishdConstant ISLANG_CHINESE_TAIWAN ISLANG_CHINESE_PRC
+syn keyword ishdConstant ISLANG_SPANISH_PUERTORICO ISLANG_CHINESE_HONGKONG
+syn keyword ishdConstant ISLANG_CHINESE_SINGAPORE ISLANG_CROATIAN
+syn keyword ishdConstant ISLANG_CROATIAN_STANDARD ISLANG_CZECH
+syn keyword ishdConstant ISLANG_CZECH_STANDARD ISLANG_DANISH
+syn keyword ishdConstant ISLANG_DANISH_STANDARD ISLANG_DUTCH
+syn keyword ishdConstant ISLANG_DUTCH_STANDARD ISLANG_DUTCH_BELGIAN
+syn keyword ishdConstant ISLANG_ENGLISH ISLANG_ENGLISH_BELIZE
+syn keyword ishdConstant ISLANG_ENGLISH_UNITEDSTATES
+syn keyword ishdConstant ISLANG_ENGLISH_UNITEDKINGDOM ISLANG_ENGLISH_AUSTRALIAN
+syn keyword ishdConstant ISLANG_ENGLISH_CANADIAN ISLANG_ENGLISH_NEWZEALAND
+syn keyword ishdConstant ISLANG_ENGLISH_IRELAND ISLANG_ENGLISH_SOUTHAFRICA
+syn keyword ishdConstant ISLANG_ENGLISH_JAMAICA ISLANG_ENGLISH_CARIBBEAN
+syn keyword ishdConstant ISLANG_ESTONIAN ISLANG_ESTONIAN_STANDARD
+syn keyword ishdConstant ISLANG_FAEROESE ISLANG_FAEROESE_STANDARD ISLANG_FARSI
+syn keyword ishdConstant ISLANG_FINNISH ISLANG_FINNISH_STANDARD ISLANG_FRENCH
+syn keyword ishdConstant ISLANG_FRENCH_STANDARD ISLANG_FRENCH_BELGIAN
+syn keyword ishdConstant ISLANG_FRENCH_CANADIAN ISLANG_FRENCH_SWISS
+syn keyword ishdConstant ISLANG_FRENCH_LUXEMBOURG ISLANG_FARSI_STANDARD
+syn keyword ishdConstant ISLANG_GERMAN ISLANG_GERMAN_STANDARD
+syn keyword ishdConstant ISLANG_GERMAN_SWISS ISLANG_GERMAN_AUSTRIAN
+syn keyword ishdConstant ISLANG_GERMAN_LUXEMBOURG ISLANG_GERMAN_LIECHTENSTEIN
+syn keyword ishdConstant ISLANG_GREEK ISLANG_GREEK_STANDARD ISLANG_HEBREW
+syn keyword ishdConstant ISLANG_HEBREW_STANDARD ISLANG_HUNGARIAN
+syn keyword ishdConstant ISLANG_HUNGARIAN_STANDARD ISLANG_ICELANDIC
+syn keyword ishdConstant ISLANG_ICELANDIC_STANDARD ISLANG_INDONESIAN
+syn keyword ishdConstant ISLANG_INDONESIAN_STANDARD ISLANG_ITALIAN
+syn keyword ishdConstant ISLANG_ITALIAN_STANDARD ISLANG_ITALIAN_SWISS
+syn keyword ishdConstant ISLANG_JAPANESE ISLANG_JAPANESE_STANDARD ISLANG_KOREAN
+syn keyword ishdConstant ISLANG_KOREAN_STANDARD ISLANG_KOREAN_JOHAB
+syn keyword ishdConstant ISLANG_LATVIAN ISLANG_LATVIAN_STANDARD
+syn keyword ishdConstant ISLANG_LITHUANIAN ISLANG_LITHUANIAN_STANDARD
+syn keyword ishdConstant ISLANG_NORWEGIAN ISLANG_NORWEGIAN_BOKMAL
+syn keyword ishdConstant ISLANG_NORWEGIAN_NYNORSK ISLANG_POLISH
+syn keyword ishdConstant ISLANG_POLISH_STANDARD ISLANG_PORTUGUESE
+syn keyword ishdConstant ISLANG_PORTUGUESE_BRAZILIAN ISLANG_PORTUGUESE_STANDARD
+syn keyword ishdConstant ISLANG_ROMANIAN ISLANG_ROMANIAN_STANDARD ISLANG_RUSSIAN
+syn keyword ishdConstant ISLANG_RUSSIAN_STANDARD ISLANG_SLOVAK
+syn keyword ishdConstant ISLANG_SLOVAK_STANDARD ISLANG_SLOVENIAN
+syn keyword ishdConstant ISLANG_SLOVENIAN_STANDARD ISLANG_SERBIAN
+syn keyword ishdConstant ISLANG_SERBIAN_LATIN ISLANG_SERBIAN_CYRILLIC
+syn keyword ishdConstant ISLANG_SPANISH ISLANG_SPANISH_ARGENTINA
+syn keyword ishdConstant ISLANG_SPANISH_BOLIVIA ISLANG_SPANISH_CHILE
+syn keyword ishdConstant ISLANG_SPANISH_COLOMBIA ISLANG_SPANISH_COSTARICA
+syn keyword ishdConstant ISLANG_SPANISH_DOMINICANREPUBLIC ISLANG_SPANISH_ECUADOR
+syn keyword ishdConstant ISLANG_SPANISH_ELSALVADOR ISLANG_SPANISH_GUATEMALA
+syn keyword ishdConstant ISLANG_SPANISH_HONDURAS ISLANG_SPANISH_MEXICAN
+syn keyword ishdConstant ISLANG_THAI_STANDARD ISLANG_SPANISH_MODERNSORT
+syn keyword ishdConstant ISLANG_SPANISH_NICARAGUA ISLANG_SPANISH_PANAMA
+syn keyword ishdConstant ISLANG_SPANISH_PARAGUAY ISLANG_SPANISH_PERU
+syn keyword ishdConstant IISLANG_SPANISH_PUERTORICO
+syn keyword ishdConstant ISLANG_SPANISH_TRADITIONALSORT ISLANG_SPANISH_VENEZUELA
+syn keyword ishdConstant ISLANG_SPANISH_URUGUAY ISLANG_SWEDISH
+syn keyword ishdConstant ISLANG_SWEDISH_FINLAND ISLANG_SWEDISH_STANDARD
+syn keyword ishdConstant ISLANG_THAI ISLANG_THA_STANDARDI ISLANG_TURKISH
+syn keyword ishdConstant ISLANG_TURKISH_STANDARD ISLANG_UKRAINIAN
+syn keyword ishdConstant ISLANG_UKRAINIAN_STANDARD ISLANG_VIETNAMESE
+syn keyword ishdConstant ISLANG_VIETNAMESE_STANDARD IS_MIPS IS_MONO IS_OS2
+syn keyword ishdConstant ISOSL_ALL ISOSL_WIN31 ISOSL_WIN95 ISOSL_NT351
+syn keyword ishdConstant ISOSL_NT351_ALPHA ISOSL_NT351_MIPS ISOSL_NT351_PPC
+syn keyword ishdConstant ISOSL_NT40 ISOSL_NT40_ALPHA ISOSL_NT40_MIPS
+syn keyword ishdConstant ISOSL_NT40_PPC IS_PENTIUM IS_POWERPC IS_RAMDRIVE
+syn keyword ishdConstant IS_REMOTE IS_REMOVABLE IS_SVGA IS_UNKNOWN IS_UVGA
+syn keyword ishdConstant IS_VALID_PATH IS_VGA IS_WIN32S IS_WINDOWS IS_WINDOWS95
+syn keyword ishdConstant IS_WINDOWSNT IS_WINOS2 IS_XVGA ISTYPE INFOFILENAME
+syn keyword ishdConstant ISRES ISUSER ISVERSION LANGUAGE LANGUAGE_DRV LESS_THAN
+syn keyword ishdConstant LINE_NUMBER LISTBOX_ENTER LISTBOX_SELECT LISTFIRST
+syn keyword ishdConstant LISTLAST LISTNEXT LISTPREV LOCKEDFILE LOGGING
+syn keyword ishdConstant LOWER_LEFT LOWER_RIGHT LIST_NULL MAGENTA MAINCAPTION
+syn keyword ishdConstant MATH_COPROCESSOR MAX_STRING MENU METAFILE MMEDIA_AVI
+syn keyword ishdConstant MMEDIA_MIDI MMEDIA_PLAYASYNCH MMEDIA_PLAYCONTINUOUS
+syn keyword ishdConstant MMEDIA_PLAYSYNCH MMEDIA_STOP MMEDIA_WAVE MOUSE
+syn keyword ishdConstant MOUSE_DRV MEDIA MODE NETWORK NETWORK_DRV NEXT
+syn keyword ishdConstant NEXTBUTTON NO NO_SUBDIR NO_WRITE_ACCESS NONCONTIGUOUS
+syn keyword ishdConstant NONEXCLUSIVE NORMAL NORMALMODE NOSET NOTEXISTS NOTRESET
+syn keyword ishdConstant NOWAIT NULL NUMBERLIST OFF OK ON ONLYDIR OS OSMAJOR
+syn keyword ishdConstant OSMINOR OTHER_FAILURE OUT_OF_DISK_SPACE PARALLEL
+syn keyword ishdConstant PARTIAL PATH PATH_EXISTS PAUSE PERSONAL PROFSTRING
+syn keyword ishdConstant PROGMAN PROGRAMFILES RAM_DRIVE REAL RECORDMODE RED
+syn keyword ishdConstant REGDB_APPPATH REGDB_APPPATH_DEFAULT REGDB_BINARY
+syn keyword ishdConstant REGDB_ERR_CONNECTIONEXISTS REGDB_ERR_CORRUPTEDREGISTRY
+syn keyword ishdConstant REGDB_ERR_FILECLOSE REGDB_ERR_FILENOTFOUND
+syn keyword ishdConstant REGDB_ERR_FILEOPEN REGDB_ERR_FILEREAD
+syn keyword ishdConstant REGDB_ERR_INITIALIZATION REGDB_ERR_INVALIDFORMAT
+syn keyword ishdConstant REGDB_ERR_INVALIDHANDLE REGDB_ERR_INVALIDNAME
+syn keyword ishdConstant REGDB_ERR_INVALIDPLATFORM REGDB_ERR_OUTOFMEMORY
+syn keyword ishdConstant REGDB_ERR_REGISTRY REGDB_KEYS REGDB_NAMES REGDB_NUMBER
+syn keyword ishdConstant REGDB_STRING REGDB_STRING_EXPAND REGDB_STRING_MULTI
+syn keyword ishdConstant REGDB_UNINSTALL_NAME REGKEY_CLASSES_ROOT
+syn keyword ishdConstant REGKEY_CURRENT_USER REGKEY_LOCAL_MACHINE REGKEY_USERS
+syn keyword ishdConstant REMOTE_DRIVE REMOVE REMOVEABLE_DRIVE REPLACE
+syn keyword ishdConstant REPLACE_ITEM RESET RESTART ROOT ROTATE RUN_MAXIMIZED
+syn keyword ishdConstant RUN_MINIMIZED RUN_SEPARATEMEMORY SELECTFOLDER
+syn keyword ishdConstant SELFREGISTER SELFREGISTERBATCH SELFREGISTRATIONPROCESS
+syn keyword ishdConstant SERIAL SET SETUPTYPE SETUPTYPE_INFO_DESCRIPTION
+syn keyword ishdConstant SETUPTYPE_INFO_DISPLAYNAME SEVERE SHARE SHAREDFILE
+syn keyword ishdConstant SHELL_OBJECT_FOLDER SILENTMODE SPLITCOMPRESS SPLITCOPY
+syn keyword ishdConstant SRCTARGETDIR STANDARD STATUS STATUS95 STATUSBAR
+syn keyword ishdConstant STATUSDLG STATUSEX STATUSOLD STRINGLIST STYLE_BOLD
+syn keyword ishdConstant STYLE_ITALIC STYLE_NORMAL STYLE_SHADOW STYLE_UNDERLINE
+syn keyword ishdConstant SW_HIDE SW_MAXIMIZE SW_MINIMIZE SW_NORMAL SW_RESTORE
+syn keyword ishdConstant SW_SHOW SW_SHOWMAXIMIZED SW_SHOWMINIMIZED
+syn keyword ishdConstant SW_SHOWMINNOACTIVE SW_SHOWNA SW_SHOWNOACTIVATE
+syn keyword ishdConstant SW_SHOWNORMAL SYS_BOOTMACHINE SYS_BOOTWIN
+syn keyword ishdConstant SYS_BOOTWIN_INSTALL SYS_RESTART SYS_SHUTDOWN SYS_TODOS
+syn keyword ishdConstant SELECTED_LANGUAGE SHELL_OBJECT_LANGUAGE SRCDIR SRCDISK
+syn keyword ishdConstant SUPPORTDIR TEXT TILED TIME TRUE TYPICAL TARGETDIR
+syn keyword ishdConstant TARGETDISK UPPER_LEFT UPPER_RIGHT USER_ADMINISTRATOR
+syn keyword ishdConstant UNINST VALID_PATH VARIABLE_LEFT VARIABLE_UNDEFINED
+syn keyword ishdConstant VER_DLL_NOT_FOUND VER_UPDATE_ALWAYS VER_UPDATE_COND
+syn keyword ishdConstant VERSION VIDEO VOLUMELABEL WAIT WARNING WELCOME WHITE
+syn keyword ishdConstant WIN32SINSTALLED WIN32SMAJOR WIN32SMINOR WINDOWS_SHARED
+syn keyword ishdConstant WINMAJOR WINMINOR WINDIR WINDISK WINSYSDIR WINSYSDISK
+syn keyword ishdConstant XCOPY_DATETIME YELLOW YES
+
+syn keyword ishdFunction AskDestPath AskOptions AskPath AskText AskYesNo
+syn keyword ishdFunction AppCommand AddProfString AddFolderIcon BatchAdd
+syn keyword ishdFunction BatchDeleteEx BatchFileLoad BatchFileSave BatchFind
+syn keyword ishdFunction BatchGetFileName BatchMoveEx BatchSetFileName
+syn keyword ishdFunction ComponentDialog ComponentAddItem
+syn keyword ishdFunction ComponentCompareSizeRequired ComponentDialog
+syn keyword ishdFunction ComponentError ComponentFileEnum ComponentFileInfo
+syn keyword ishdFunction ComponentFilterLanguage ComponentFilterOS
+syn keyword ishdFunction ComponentGetData ComponentGetItemSize
+syn keyword ishdFunction ComponentInitialize ComponentIsItemSelected
+syn keyword ishdFunction ComponentListItems ComponentMoveData
+syn keyword ishdFunction ComponentSelectItem ComponentSetData ComponentSetTarget
+syn keyword ishdFunction ComponentSetupTypeEnum ComponentSetupTypeGetData
+syn keyword ishdFunction ComponentSetupTypeSet ComponentTotalSize
+syn keyword ishdFunction ComponentValidate ConfigAdd ConfigDelete ConfigFileLoad
+syn keyword ishdFunction ConfigFileSave ConfigFind ConfigGetFileName
+syn keyword ishdFunction ConfigGetInt ConfigMove ConfigSetFileName ConfigSetInt
+syn keyword ishdFunction CmdGetHwndDlg CtrlClear CtrlDir CtrlGetCurSel
+syn keyword ishdFunction CtrlGetMLEText CtrlGetMultCurSel CtrlGetState
+syn keyword ishdFunction CtrlGetSubCommand CtrlGetText CtrlPGroups
+syn keyword ishdFunction CtrlSelectText CtrlSetCurSel CtrlSetFont CtrlSetList
+syn keyword ishdFunction CtrlSetMLEText CtrlSetMultCurSel CtrlSetState
+syn keyword ishdFunction CtrlSetText CallDLLFx ChangeDirectory CloseFile
+syn keyword ishdFunction CopyFile CreateDir CreateFile CreateRegistrySet
+syn keyword ishdFunction CommitSharedFiles CreateProgramFolder
+syn keyword ishdFunction CreateShellObjects CopyBytes DefineDialog Delay
+syn keyword ishdFunction DeleteDir DeleteFile Do DoInstall DeinstallSetReference
+syn keyword ishdFunction DeinstallStart DialogSetInfo DeleteFolderIcon
+syn keyword ishdFunction DeleteProgramFolder Disable EzBatchAddPath
+syn keyword ishdFunction EzBatchAddString ExBatchReplace EnterDisk
+syn keyword ishdFunction EzConfigAddDriver EzConfigAddString EzConfigGetValue
+syn keyword ishdFunction EzConfigSetValue EndDialog EzDefineDialog ExistsDir
+syn keyword ishdFunction ExistsDisk ExitProgMan Enable EzBatchReplace
+syn keyword ishdFunction FileCompare FileDeleteLine FileGrep FileInsertLine
+syn keyword ishdFunction FindAllDirs FindAllFiles FindFile FindWindow
+syn keyword ishdFunction GetFileInfo GetLine GetFont GetDiskSpace GetEnvVar
+syn keyword ishdFunction GetExtents GetMemFree GetMode GetSystemInfo
+syn keyword ishdFunction GetValidDrivesList GetWindowHandle GetProfInt
+syn keyword ishdFunction GetProfString GetFolderNameList GetGroupNameList
+syn keyword ishdFunction GetItemNameList GetDir GetDisk HIWORD Handler Is
+syn keyword ishdFunction ISCompareServicePack InstallationInfo LOWORD LaunchApp
+syn keyword ishdFunction LaunchAppAndWait ListAddItem ListAddString ListCount
+syn keyword ishdFunction ListCreate ListCurrentItem ListCurrentString
+syn keyword ishdFunction ListDeleteItem ListDeleteString ListDestroy
+syn keyword ishdFunction ListFindItem ListFindString ListGetFirstItem
+syn keyword ishdFunction ListGetFirstString ListGetNextItem ListGetNextString
+syn keyword ishdFunction ListReadFromFile ListSetCurrentItem
+syn keyword ishdFunction ListSetCurrentString ListSetIndex ListWriteToFile
+syn keyword ishdFunction LongPathFromShortPath LongPathToQuote
+syn keyword ishdFunction LongPathToShortPath MessageBox MessageBeep NumToStr
+syn keyword ishdFunction OpenFile OpenFileMode PathAdd PathDelete PathFind
+syn keyword ishdFunction PathGet PathMove PathSet ProgDefGroupType ParsePath
+syn keyword ishdFunction PlaceBitmap PlaceWindow PlayMMedia QueryProgGroup
+syn keyword ishdFunction QueryProgItem QueryShellMgr RebootDialog ReleaseDialog
+syn keyword ishdFunction ReadBytes RenameFile ReplaceProfString ReloadProgGroup
+syn keyword ishdFunction ReplaceFolderIcon RGB RegDBConnectRegistry
+syn keyword ishdFunction RegDBCreateKeyEx RegDBDeleteKey RegDBDeleteValue
+syn keyword ishdFunction RegDBDisConnectRegistry RegDBGetAppInfo RegDBGetItem
+syn keyword ishdFunction RegDBGetKeyValueEx RegDBKeyExist RegDBQueryKey
+syn keyword ishdFunction RegDBSetAppInfo RegDBSetDefaultRoot RegDBSetItem
+syn keyword ishdFunction RegDBSetKeyValueEx SeekBytes SelectDir SetFileInfo
+syn keyword ishdFunction SelectDir SelectFolder SetupType SprintfBox SdSetupType
+syn keyword ishdFunction SdSetupTypeEx SdMakeName SilentReadData SilentWriteData
+syn keyword ishdFunction SendMessage Sprintf System SdAskDestPath SdAskOptions
+syn keyword ishdFunction SdAskOptionsList SdBitmap SdComponentDialog
+syn keyword ishdFunction SdComponentDialog2 SdComponentDialogAdv SdComponentMult
+syn keyword ishdFunction SdConfirmNewDir SdConfirmRegistration SdDisplayTopics
+syn keyword ishdFunction SdFinish SdFinishReboot SdInit SdLicense SdMakeName
+syn keyword ishdFunction SdOptionsButtons SdProductName SdRegisterUser
+syn keyword ishdFunction SdRegisterUserEx SdSelectFolder SdSetupType
+syn keyword ishdFunction SdSetupTypeEx SdShowAnyDialog SdShowDlgEdit1
+syn keyword ishdFunction SdShowDlgEdit2 SdShowDlgEdit3 SdShowFileMods
+syn keyword ishdFunction SdShowInfoList SdShowMsg SdStartCopy SdWelcome
+syn keyword ishdFunction SelectFolder ShowGroup ShowProgamFolder SetColor
+syn keyword ishdFunction SetDialogTitle SetDisplayEffect SetErrorMsg
+syn keyword ishdFunction SetErrorTitle SetFont SetStatusWindow SetTitle
+syn keyword ishdFunction SizeWindow StatusUpdate StrCompare StrFind StrGetTokens
+syn keyword ishdFunction StrLength StrRemoveLastSlash StrSub StrToLower StrToNum
+syn keyword ishdFunction StrToUpper ShowProgramFolder UnUseDLL UseDLL VarRestore
+syn keyword ishdFunction VarSave VerUpdateFile VerCompare VerFindFileVersion
+syn keyword ishdFunction VerGetFileVersion VerSearchAndUpdateFile VerUpdateFile
+syn keyword ishdFunction Welcome WaitOnDialog WriteBytes WriteLine
+syn keyword ishdFunction WriteProfString XCopyFile
+
+syn keyword ishdTodo contained TODO
+
+"integer number, or floating point number without a dot.
+syn match ishdNumber "\<\d\+\>"
+"floating point number, with dot
+syn match ishdNumber "\<\d\+\.\d*\>"
+"floating point number, starting with a dot
+syn match ishdNumber "\.\d\+\>"
+
+" String constants
+syn region ishdString start=+"+ skip=+\\\\\|\\"+ end=+"+
+
+syn region ishdComment start="//" end="$" contains=ishdTodo
+syn region ishdComment start="/\*" end="\*/" contains=ishdTodo
+
+" Pre-processor commands
+syn region ishdPreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=ishdComment,ishdString
+if !exists("ishd_no_if0")
+ syn region ishdHashIf0 start="^\s*#\s*if\s\+0\>" end=".\|$" contains=ishdHashIf0End
+ syn region ishdHashIf0End contained start="0" end="^\s*#\s*\(endif\>\|else\>\|elif\>\)" contains=ishdHashIf0Skip
+ syn region ishdHashIf0Skip contained start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*#\s*endif\>" contains=ishdHashIf0Skip
+endif
+syn region ishdIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match ishdInclude +^\s*#\s*include\>\s*"+ contains=ishdIncluded
+syn cluster ishdPreProcGroup contains=ishdPreCondit,ishdIncluded,ishdInclude,ishdDefine,ishdHashIf0,ishdHashIf0End,ishdHashIf0Skip,ishdNumber
+syn region ishdDefine start="^\s*#\s*\(define\|undef\)\>" end="$" contains=ALLBUT,@ishdPreProcGroup
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "ishd"
+
+" vim: ts=8
diff --git a/runtime/syntax/iss.vim b/runtime/syntax/iss.vim
new file mode 100644
index 0000000..34bb698
--- /dev/null
+++ b/runtime/syntax/iss.vim
@@ -0,0 +1,136 @@
+" Vim syntax file
+" Language: Inno Setup File (iss file) and My InnoSetup extension
+" Maintainer: Jason Mills (jmills@cs.mun.ca)
+" Previous Maintainer: Dominique Stéphan (dominique@mggen.com)
+" Last Change: 2021 Aug 30
+"
+" Todo:
+" - The parameter String: is matched as flag string (because of case ignore).
+" - Pascal scripting syntax is not recognized.
+" - Embedded double quotes confuse string matches. e.g. "asfd""asfa"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" shut case off
+syn case ignore
+
+" Preprocessor
+syn region issPreProc start="^\s*#" end="$"
+
+" Section
+syn region issSection start="\[" end="\]"
+
+" Label in the [Setup] Section
+syn match issDirective "^[^=]\+="
+
+" URL
+syn match issURL "http[s]\=:\/\/.*$"
+
+" Parameters used for any section.
+" syn match issParam"[^: ]\+:"
+syn match issParam "Name:"
+syn match issParam "MinVersion:\|OnlyBelowVersion:\|Languages:"
+syn match issParam "Source:\|DestDir:\|DestName:\|CopyMode:"
+syn match issParam "Attribs:\|Permissions:\|FontInstall:\|Flags:"
+syn match issParam "FileName:\|Parameters:\|WorkingDir:\|HotKey:\|Comment:"
+syn match issParam "IconFilename:\|IconIndex:"
+syn match issParam "Section:\|Key:\|String:"
+syn match issParam "Root:\|SubKey:\|ValueType:\|ValueName:\|ValueData:"
+syn match issParam "RunOnceId:"
+syn match issParam "Type:\|Excludes:"
+syn match issParam "Components:\|Description:\|GroupDescription:\|Types:\|ExtraDiskSpaceRequired:"
+syn match issParam "StatusMsg:\|RunOnceId:\|Tasks:"
+syn match issParam "MessagesFile:\|LicenseFile:\|InfoBeforeFile:\|InfoAfterFile:"
+
+syn match issComment "^\s*;.*$" contains=@Spell
+
+" folder constant
+syn match issFolder "{[^{]*}" contains=@NoSpell
+
+" string
+syn region issString start=+"+ end=+"+ contains=issFolder,@Spell
+
+" [Dirs]
+syn keyword issDirsFlags deleteafterinstall uninsalwaysuninstall uninsneveruninstall
+
+" [Files]
+syn keyword issFilesCopyMode normal onlyifdoesntexist alwaysoverwrite alwaysskipifsameorolder dontcopy
+syn keyword issFilesAttribs readonly hidden system
+syn keyword issFilesPermissions full modify readexec
+syn keyword issFilesFlags allowunsafefiles comparetimestampalso confirmoverwrite deleteafterinstall
+syn keyword issFilesFlags dontcopy dontverifychecksum external fontisnttruetype ignoreversion
+syn keyword issFilesFlags isreadme onlyifdestfileexists onlyifdoesntexist overwritereadonly
+syn keyword issFilesFlags promptifolder recursesubdirs regserver regtypelib restartreplace
+syn keyword issFilesFlags sharedfile skipifsourcedoesntexist sortfilesbyextension touch
+syn keyword issFilesFlags uninsremovereadonly uninsrestartdelete uninsneveruninstall
+syn keyword issFilesFlags replacesameversion nocompression noencryption noregerror
+
+
+" [Icons]
+syn keyword issIconsFlags closeonexit createonlyiffileexists dontcloseonexit
+syn keyword issIconsFlags runmaximized runminimized uninsneveruninstall useapppaths
+
+" [INI]
+syn keyword issINIFlags createkeyifdoesntexist uninsdeleteentry uninsdeletesection uninsdeletesectionifempty
+
+" [Registry]
+syn keyword issRegRootKey HKCR HKCU HKLM HKU HKCC
+syn keyword issRegValueType none string expandsz multisz dword binary
+syn keyword issRegFlags createvalueifdoesntexist deletekey deletevalue dontcreatekey
+syn keyword issRegFlags preservestringtype noerror uninsclearvalue
+syn keyword issRegFlags uninsdeletekey uninsdeletekeyifempty uninsdeletevalue
+
+" [Run] and [UninstallRun]
+syn keyword issRunFlags hidewizard nowait postinstall runhidden runmaximized
+syn keyword issRunFlags runminimized shellexec skipifdoesntexist skipifnotsilent
+syn keyword issRunFlags skipifsilent unchecked waituntilidle
+
+" [Types]
+syn keyword issTypesFlags iscustom
+
+" [Components]
+syn keyword issComponentsFlags dontinheritcheck exclusive fixed restart disablenouninstallwarning
+
+" [UninstallDelete] and [InstallDelete]
+syn keyword issInstallDeleteType files filesandordirs dirifempty
+
+" [Tasks]
+syn keyword issTasksFlags checkedonce dontinheritcheck exclusive restart unchecked
+
+
+" Define the default highlighting.
+" 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"
+
+" vim:ts=8
diff --git a/runtime/syntax/ist.vim b/runtime/syntax/ist.vim
new file mode 100644
index 0000000..e34edac
--- /dev/null
+++ b/runtime/syntax/ist.vim
@@ -0,0 +1,58 @@
+" Vim syntax file
+" Language: Makeindex style file, *.ist
+" Maintainer: Peter Meszaros <pmeszaros@effice.hu>
+" Last Change: 2012 Jan 08 by Thilo Six
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword=$,@,48-57,_
+
+syn case ignore
+syn keyword IstInpSpec actual arg_close arg_open encap escape
+syn keyword IstInpSpec keyword level quote range_close range_open
+syn keyword IstInpSpec page_compositor
+
+syn keyword IstOutSpec preamble postamble setpage_prefix setpage_suffix group_skip
+syn keyword IstOutSpec headings_flag heading_prefix heading_suffix
+syn keyword IstOutSpec lethead_flag lethead_prefix lethead_suffix
+syn keyword IstOutSpec symhead_positive symhead_negative numhead_positive numhead_negative
+syn keyword IstOutSpec item_0 item_1 item_2 item_01
+syn keyword IstOutSpec item_x1 item_12 item_x2
+syn keyword IstOutSpec delim_0 delim_1 delim_2
+syn keyword IstOutSpec delim_n delim_r delim_t
+syn keyword IstOutSpec encap_prefix encap_infix encap_suffix
+syn keyword IstOutSpec line_max indent_space indent_length
+syn keyword IstOutSpec suffix_2p suffix_3p suffix_mp
+
+syn region IstString matchgroup=IstDoubleQuote start=+"+ skip=+\\"+ end=+"+ contains=IstSpecial
+syn match IstCharacter "'.'"
+syn match IstNumber "\d\+"
+syn match IstComment "^[\t ]*%.*$" contains=IstTodo
+syn match IstSpecial "\\\\\|{\|}\|#\|\\n" contained
+syn match IstTodo "DEBUG\|TODO" contained
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "ist"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/j.vim b/runtime/syntax/j.vim
new file mode 100644
index 0000000..a694cb2
--- /dev/null
+++ b/runtime/syntax/j.vim
@@ -0,0 +1,146 @@
+" Vim syntax file
+" Language: J
+" Maintainer: David Bürgin <dbuergin@gluet.ch>
+" URL: https://gitlab.com/glts/vim-j
+" Last Change: 2019-11-12
+
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+syntax case match
+syntax sync minlines=100
+
+syntax cluster jStdlibItems contains=jStdlibNoun,jStdlibAdverb,jStdlibConjunction,jStdlibVerb
+syntax cluster jPrimitiveItems contains=jNoun,jAdverb,jConjunction,jVerb,jCopula
+
+syntax match jControl /\<\%(assert\|break\|case\|catch[dt]\=\|continue\|do\|else\%(if\)\=\|end\|fcase\|for\|if\|return\|select\|throw\|try\|whil\%(e\|st\)\)\./
+syntax match jControl /\<\%(for\|goto\|label\)_\a\k*\./
+
+" Standard library names. A few names need to be defined with ":syntax match"
+" because they would otherwise take precedence over the corresponding jControl
+" and jDefineExpression items.
+syntax keyword jStdlibNoun ARGV BINPATH CR CRLF DEL Debug EAV EMPTY FF FHS IF64 IFBE IFIOS IFJA IFJHS IFJNET IFQT IFRASPI IFUNIX IFWIN IFWINCE IFWINE IFWOW64 JB01 JBOXED JCHAR JCHAR2 JCHAR4 JCMPX JFL JINT JLIB JPTR JSB JSIZES JSTR JSTR2 JSTR4 JTYPES JVERSION LF LF2 LIBFILE TAB UNAME UNXLIB dbhelp libjqt
+syntax keyword jStdlibAdverb define each every fapplylines inv inverse items leaf rows rxapply rxmerge table
+syntax keyword jStdlibConjunction bind cuts def on
+syntax keyword jStdlibVerb AND Endian IFDEF OR XOR abspath anddf android_exec_am android_exec_host android_getdisplaymetrics andunzip apply boxopen boxxopen bx calendar cd cdcb cder cderx cdf charsub chopstring clear coclass cocreate cocurrent codestroy coerase cofind cofindv cofullname coinfo coinsert compare coname conames conew conl conouns conounsx copath copathnl copathnlx coreset costate cut cutLF cutopen cutpara datatype dbctx dbcut dberm dberr dbg dbinto dbjmp dblocals dblxq dblxs dbnxt dbout dbover dbq dbr dbret dbrr dbrrx dbrun dbs dbsig dbsq dbss dbst dbstack dbstk dbstop dbstopme dbstopnext dbstops dbtrace dbview deb debc delstring detab dfh dir dircompare dircompares dirfind dirpath dirss dirssrplc dirtree dirused dlb dltb dltbs dquote drop dropafter dropto dtb dtbs echo empty endian erase evtloop exit expand f2utf8 fappend fappends fboxname fc fcompare fcompares fcopynew fdir ferase fetch fexist fexists fgets file2url fixdotdot fliprgb fmakex foldpara foldtext fpathcreate fpathname fputs fread freadblock freadr freads frename freplace fsize fss fssrplc fstamp fstringreplace ftype fview fwrite fwritenew fwrites getalpha getargs getdate getenv getqtbin hfd hostpathsep ic install iospath isatty isotimestamp isutf16 isutf8 jcwdpath joinstring jpath jpathsep jsystemdefs launch list ljust load loadd mema memf memr memu memw nameclass namelist names nc nl pick quote require rjust rplc rxE rxall rxcomp rxcut rxeq rxerror rxfirst rxfree rxfrom rxhandles rxin rxindex rxinfo rxmatch rxmatches rxrplc rxutf8 script scriptd scripts setalpha setbreak shell show sign sminfo smoutput sort split splitnostring splitstring ss startupandroid stderr stdin stdout stringreplace symdat symget symset take takeafter taketo timespacex timestamp timex tmoutput toCRLF toHOST toJ todate todayno tolist tolower topara toupper tsdiff tsrep tstamp type ucp ucpcount undquote unxlib usleep utf8 uucp valdate wcsize weekday weeknumber weeksinyear winpathsep xedit
+syntax match jStdlibNoun /\<\%(adverb\|conjunction\|dyad\|monad\|noun\|verb\)\>/
+syntax match jStdlibVerb /\<\%(Note\|\%(assert\|break\|do\)\.\@!\)\>/
+
+" Numbers. Matching J numbers is difficult. In fact, the job cannot be done
+" with regular expressions alone. Below is a sketch of the pattern used. It
+" accepts most well-formed numbers and rejects most of the ill-formed ones.
+" See http://www.jsoftware.com/help/dictionary/dcons.htm for reference.
+"
+" "double1" and "double2" patterns:
+" (_?\d+(\.\d*)?|_\.\d+)([eE]_?\d+)?
+" (_?\d+(\.\d*)?|_\.\d+|\.\d+)([eE]_?\d+)?
+"
+" "rational1" and "rational2" patterns:
+" \k<double1>(r\k<double2>)?|__?
+" \k<double2>(r\k<double2>)?|__?
+"
+" "complex1" and "complex2" patterns:
+" \k<rational1>((j|a[dr])\k<rational2>)?
+" \k<rational2>((j|a[dr])\k<rational2>)?
+"
+" "basevalue" pattern:
+" _?[0-9a-z]+(\.[0-9a-z]*)?|_?\.[0-9a-z]+
+"
+" all numbers:
+" \b\k<complex1>([px]\k<complex2>)?(b\k<basevalue>)?(?![0-9A-Za-z_.])
+syntax match jNumber /\<_\.[0-9A-Za-z_.]\@!/
+syntax match jNumber /\<_\=\d\+x[0-9A-Za-z_.]\@!/
+syntax match jNumber /\<\%(__\=r_\=\d\+\|_\=\d\+r__\=\)[0-9A-Za-z_.]\@!/
+syntax match jNumber /\<\%(\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\)\%([eE]_\=\d\+\)\=\%(r\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\)\=\|__\=\)\%(\%(j\|a[dr]\)\%(\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\%(r\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\)\=\|__\=\)\)\=\%([px]\%(\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\%(r\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\)\=\|__\=\)\%(\%(j\|a[dr]\)\%(\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\%(r\%(_\=\d\+\%(\.\d*\)\=\|_\.\d\+\|\.\d\+\)\%([eE]_\=\d\+\)\=\)\=\|__\=\)\)\=\)\=\%(b\%(_\=[0-9a-z]\+\%(\.[0-9a-z]*\)\=\|_\=\.[0-9a-z]\+\)\)\=[0-9A-Za-z_.]\@!/
+
+syntax region jString oneline start=/'/ skip=/''/ end=/'/
+
+syntax keyword jArgument contained x y u v m n
+
+" Primitives. Order is significant both within the patterns and among
+" ":syntax match" statements. Refer to "Parts of speech" in the J dictionary.
+syntax match jNoun /\<a[.:]/
+syntax match jAdverb /[}~]\|[/\\]\.\=\|\<\%([Mbft]\.\|t:\)/
+syntax match jConjunction /"\|`:\=\|[.:@&][.:]\=\|&\.:\|\<\%([dDHT]\.\|[DLS]:\)/
+syntax match jVerb /[=!\]]\|[\^?]\.\=\|[;[]:\=\|{\.\|[_/\\]:\|[<>+*\-%$|,#][.:]\=\|[~}"][.:]\|{\%[::]\|\<\%([ACeEiIjLor]\.\|p\.\.\=\|[ipqsux]:\|0:\|_\=[1-9]:\)/
+syntax match jCopula /=[.:]/
+syntax match jConjunction /;\.\|\^:\|![.:]/
+
+" Explicit noun definition. The difficulty is that the define expression can
+" occur in the middle of a line but the jNounDefine region must only start on
+" the next line. The trick is to split the problem into two regions and link
+" them with "nextgroup=". The fold wrapper provides syntax folding.
+syntax region jNounDefineFold
+ \ matchgroup=NONE start=/\%(\%(\%(^\s*Note\)\|\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\)\>\)\@=/
+ \ keepend matchgroup=NONE end=/^\s*)\s*$/
+ \ contains=jNounDefineStart
+ \ fold
+syntax region jNounDefineStart
+ \ matchgroup=jDefineExpression start=/\%(\%(^\s*Note\)\|\<\%(0\|noun\)\s\+\%(\:\s*0\|def\s\+0\|define\)\)\>/
+ \ keepend matchgroup=NONE end=/$/
+ \ contains=@jStdlibItems,@jPrimitiveItems,jNumber,jString,jParenGroup,jParen,jComment
+ \ contained oneline skipempty nextgroup=jDefineEnd,jNounDefine
+" These two items must have "contained", which allows them to match only after
+" jNounDefineStart thanks to the "nextgroup=" above.
+syntax region jNounDefine
+ \ matchgroup=NONE start=/^/
+ \ matchgroup=jDefineEnd end=/^\s*)\s*$/
+ \ contained
+" This match is necessary in case of an empty noun definition
+syntax match jDefineEnd contained /^\s*)\s*$/
+
+" Explicit verb, adverb, and conjunction definition
+syntax region jDefine
+ \ matchgroup=jDefineExpression start=/\<\%([1-4]\|13\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>/
+ \ matchgroup=jDefineEnd end=/^\s*)\s*$/
+ \ contains=jControl,@jStdlibItems,@jPrimitiveItems,jNumber,jString,jArgument,jParenGroup,jParen,jComment,jDefineMonadDyad
+ \ fold
+syntax match jDefineMonadDyad contained /^\s*:\s*$/
+
+" Paired parentheses. When a jDefineExpression such as "3 : 0" is
+" parenthesised it will erroneously extend jParenGroup to span over the whole
+" definition body. This situation receives a special treatment here.
+syntax match jParen /(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*)\)\@=/
+syntax match jParen contained /\%((\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\s*\)\@<=)/
+syntax region jParenGroup
+ \ matchgroup=jParen start=/(\%(\s*\%([0-4]\|13\|noun\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>\)\@!/
+ \ matchgroup=jParen end=/)/
+ \ oneline transparent
+
+syntax keyword jTodo contained TODO FIXME XXX
+syntax match jComment /\<NB\..*$/ contains=jTodo,@Spell
+
+syntax match jSharpBang /\%^#!.*$/
+
+highlight default link jControl Statement
+highlight default link jStdlibNoun Identifier
+highlight default link jStdlibAdverb Function
+highlight default link jStdlibConjunction Function
+highlight default link jStdlibVerb Function
+highlight default link jString String
+highlight default link jNumber Number
+highlight default link jNoun Constant
+highlight default link jAdverb Normal
+highlight default link jConjunction Normal
+highlight default link jVerb Normal
+highlight default link jCopula Normal
+highlight default link jArgument Identifier
+highlight default link jParen Delimiter
+
+highlight default link jDefineExpression Define
+highlight default link jDefineMonadDyad Delimiter
+highlight default link jDefineEnd Delimiter
+highlight default link jNounDefine Normal
+
+highlight default link jTodo Todo
+highlight default link jComment Comment
+highlight default link jSharpBang PreProc
+
+let b:current_syntax = 'j'
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
diff --git a/runtime/syntax/jal.vim b/runtime/syntax/jal.vim
new file mode 100644
index 0000000..460bc01
--- /dev/null
+++ b/runtime/syntax/jal.vim
@@ -0,0 +1,236 @@
+" Vim syntax file
+" Language: JAL
+" Version: 0.1
+" Last Change: 2003 May 11
+" Maintainer: Mark Gross <mark@thegnar.org>
+" This is a syntax definition for the JAL language.
+" It is based on the Source Forge compiler source code.
+" https://sourceforge.net/projects/jal/
+"
+" TODO test.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+syn sync lines=250
+
+syn keyword picTodo NOTE TODO XXX contained
+
+syn match picIdentifier "[a-z_$][a-z0-9_$]*"
+syn match picLabel "^[A-Z_$][A-Z0-9_$]*"
+syn match picLabel "^[A-Z_$][A-Z0-9_$]*:"me=e-1
+
+syn match picASCII "A\='.'"
+syn match picBinary "B'[0-1]\+'"
+syn match picDecimal "D'\d\+'"
+syn match picDecimal "\d\+"
+syn match picHexadecimal "0x\x\+"
+syn match picHexadecimal "H'\x\+'"
+syn match picHexadecimal "[0-9]\x*h"
+syn match picOctal "O'[0-7]\o*'"
+
+syn match picComment ";.*" contains=picTodo
+
+syn region picString start=+"+ end=+"+
+
+syn keyword picRegister indf tmr0 pcl status fsr port_a port_b port_c port_d port_e x84_eedata x84_eeadr pclath intcon
+syn keyword picRegister f877_tmr1l f877_tmr1h f877_t1con f877_t2con f877_ccpr1l f877_ccpr1h f877_ccp1con
+syn keyword picRegister f877_pir1 f877_pir2 f877_pie1 f877_adcon1 f877_adcon0 f877_pr2 f877_adresl f877_adresh
+syn keyword picRegister f877_eeadr f877_eedath f877_eeadrh f877_eedata f877_eecon1 f877_eecon2 f628_EECON2
+syn keyword picRegister f877_rcsta f877_txsta f877_spbrg f877_txreg f877_rcreg f628_EEDATA f628_EEADR f628_EECON1
+
+" Register --- bits
+" STATUS
+syn keyword picRegisterPart status_c status_dc status_z status_pd
+syn keyword picRegisterPart status_to status_rp0 status_rp1 status_irp
+
+" pins
+syn keyword picRegisterPart pin_a0 pin_a1 pin_a2 pin_a3 pin_a4 pin_a5
+syn keyword picRegisterPart pin_b0 pin_b1 pin_b2 pin_b3 pin_b4 pin_b5 pin_b6 pin_b7
+syn keyword picRegisterPart pin_c0 pin_c1 pin_c2 pin_c3 pin_c4 pin_c5 pin_c6 pin_c7
+syn keyword picRegisterPart pin_d0 pin_d1 pin_d2 pin_d3 pin_d4 pin_d5 pin_d6 pin_d7
+syn keyword picRegisterPart pin_e0 pin_e1 pin_e2
+
+syn keyword picPortDir port_a_direction port_b_direction port_c_direction port_d_direction port_e_direction
+
+syn match picPinDir "pin_a[012345]_direction"
+syn match picPinDir "pin_b[01234567]_direction"
+syn match picPinDir "pin_c[01234567]_direction"
+syn match picPinDir "pin_d[01234567]_direction"
+syn match picPinDir "pin_e[012]_direction"
+
+
+" INTCON
+syn keyword picRegisterPart intcon_gie intcon_eeie intcon_peie intcon_t0ie intcon_inte
+syn keyword picRegisterPart intcon_rbie intcon_t0if intcon_intf intcon_rbif
+
+" TIMER
+syn keyword picRegisterPart t1ckps1 t1ckps0 t1oscen t1sync tmr1cs tmr1on tmr1ie tmr1if
+
+"cpp bits
+syn keyword picRegisterPart ccp1x ccp1y
+
+" adcon bits
+syn keyword picRegisterPart adcon0_go adcon0_ch0 adcon0_ch1 adcon0_ch2
+
+" EECON
+syn keyword picRegisterPart eecon1_rd eecon1_wr eecon1_wren eecon1_wrerr eecon1_eepgd
+syn keyword picRegisterPart f628_eecon1_rd f628_eecon1_wr f628_eecon1_wren f628_eecon1_wrerr
+
+" usart
+syn keyword picRegisterPart tx9 txen sync brgh tx9d
+syn keyword picRegisterPart spen rx9 cren ferr oerr rx9d
+syn keyword picRegisterPart TXIF RCIF
+
+" OpCodes...
+syn keyword picOpcode addlw andlw call clrwdt goto iorlw movlw option retfie retlw return sleep sublw tris
+syn keyword picOpcode xorlw addwf andwf clrf clrw comf decf decfsz incf incfsz retiw iorwf movf movwf nop
+syn keyword picOpcode rlf rrf subwf swapf xorwf bcf bsf btfsc btfss skpz skpnz setz clrz skpc skpnc setc clrc
+syn keyword picOpcode skpdc skpndc setdc clrdc movfw tstf bank page HPAGE mullw mulwf cpfseq cpfsgt cpfslt banka bankb
+
+
+syn keyword jalBoolean true false
+syn keyword jalBoolean off on
+syn keyword jalBit high low
+syn keyword jalConstant Input Output all_input all_output
+syn keyword jalConditional if else then elsif end if
+syn keyword jalLabel goto
+syn keyword jalRepeat for while forever loop
+syn keyword jalStatement procedure function
+syn keyword jalStatement return end volatile const var
+syn keyword jalType bit byte
+
+syn keyword jalModifier interrupt assembler asm put get
+syn keyword jalStatement out in is begin at
+syn keyword jalDirective pragma jump_table target target_clock target_chip name error test assert
+syn keyword jalPredefined hs xt rc lp internal 16c84 16f84 16f877 sx18 sx28 12c509a 12c508
+syn keyword jalPredefined 12ce674 16f628 18f252 18f242 18f442 18f452 12f629 12f675 16f88
+syn keyword jalPredefined 16f876 16f873 sx_12 sx18 sx28 pic_12 pic_14 pic_16
+
+syn keyword jalDirective chip osc clock fuses cpu watchdog powerup protection
+
+syn keyword jalFunction bank_0 bank_1 bank_2 bank_3 bank_4 bank_5 bank_6 bank_7 trisa trisb trisc trisd trise
+syn keyword jalFunction _trisa_flush _trisb_flush _trisc_flush _trisd_flush _trise_flush
+
+syn keyword jalPIC local idle_loop
+
+syn region jalAsm matchgroup=jalAsmKey start="\<assembler\>" end="\<end assembler\>" contains=jalComment,jalPreProc,jalLabel,picIdentifier, picLabel,picASCII,picDecimal,picHexadecimal,picOctal,picComment,picString,picRegister,picRigisterPart,picOpcode,picDirective,jalPIC
+syn region jalAsm matchgroup=jalAsmKey start="\<asm\>" end=/$/ contains=jalComment,jalPreProc,jalLabel,picIdentifier, picLabel,picASCII,picDecimal,picHexadecimal,picOctal,picComment,picString,picRegister,picRigisterPart,picOpcode,picDirective,jalPIC
+
+syn region jalPsudoVars matchgroup=jalPsudoVarsKey start="\<'put\>" end="/<is/>" contains=jalComment
+
+syn match jalStringEscape contained "#[12][0-9]\=[0-9]\="
+syn match jalIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>"
+syn match jalSymbolOperator "[+\-/*=]"
+syn match jalSymbolOperator "!"
+syn match jalSymbolOperator "<"
+syn match jalSymbolOperator ">"
+syn match jalSymbolOperator "<="
+syn match jalSymbolOperator ">="
+syn match jalSymbolOperator "!="
+syn match jalSymbolOperator "=="
+syn match jalSymbolOperator "<<"
+syn match jalSymbolOperator ">>"
+syn match jalSymbolOperator "|"
+syn match jalSymbolOperator "&"
+syn match jalSymbolOperator "%"
+syn match jalSymbolOperator "?"
+syn match jalSymbolOperator "[()]"
+syn match jalSymbolOperator "[\^.]"
+syn match jalLabel "[\^]*:"
+
+syn match jalNumber "-\=\<\d[0-9_]\+\>"
+syn match jalHexNumber "0x[0-9A-Fa-f_]\+\>"
+syn match jalBinNumber "0b[01_]\+\>"
+
+" String
+"wrong strings
+syn region jalStringError matchgroup=jalStringError start=+"+ end=+"+ end=+$+ contains=jalStringEscape
+
+"right strings
+syn region jalString matchgroup=jalString start=+'+ end=+'+ oneline contains=jalStringEscape
+" To see the start and end of strings:
+syn region jalString matchgroup=jalString start=+"+ end=+"+ oneline contains=jalStringEscapeGPC
+
+syn keyword jalTodo contained TODO
+syn region jalComment start=/-- / end=/$/ oneline contains=jalTodo
+syn region jalComment start=/--\t/ end=/$/ oneline contains=jalTodo
+syn match jalComment /--\_$/
+syn region jalPreProc start="include" end=/$/ contains=JalComment,jalToDo
+
+
+if exists("jal_no_tabs")
+ syn match jalShowTab "\t"
+endif
+
+
+" Define the default highlighting.
+" 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
+
+
+
+let b:current_syntax = "jal"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/jam.vim b/runtime/syntax/jam.vim
new file mode 100644
index 0000000..fc7f49d
--- /dev/null
+++ b/runtime/syntax/jam.vim
@@ -0,0 +1,240 @@
+" Vim syntax file
+" Language: JAM
+" Maintainer: Ralf Lemke (ralflemk@t-online.de)
+" Last change: 2012 Jan 08 by Thilo Six
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+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
+syn keyword jamConditional if else
+syn keyword jamRepeat for while next step
+
+syn keyword jamTodo contained TODO FIXME XXX
+syn keyword jamDBState1 alias binary catquery close close_all_connections column_names connection continue continue_bottom continue_down continue_top continue_up
+syn keyword jamDBState2 cursor declare engine execute format occur onentry onerror onexit sql start store unique with
+syn keyword jamSQLState1 all alter and any avg between by count create current data database delete distinct drop exists fetch from grant group
+syn keyword jamSQLState2 having index insert into like load max min of open order revoke rollback runstats select set show stop sum synonym table to union update values view where bundle
+
+syn keyword jamLibFunc1 dm_bin_create_occur dm_bin_delete_occur dm_bin_get_dlength dm_bin_get_occur dm_bin_length dm_bin_max_occur dm_bin_set_dlength dm_convert_empty dm_cursor_connection dm_cursor_consistent dm_cursor_engine dm_dbi_init dm_dbms dm_dbms_noexp dm_disable_styles dm_enable_styles dm_exec_sql dm_expand dm_free_sql_info dm_gen_change_execute_using dm_gen_change_select_from dm_gen_change_select_group_by dm_gen_change_select_having dm_gen_change_select_list dm_gen_change_select_order_by dm_gen_change_select_suffix dm_gen_change_select_where dm_gen_get_tv_alias dm_gen_sql_info
+
+syn keyword jamLibFunc2 dm_get_db_conn_handle dm_get_db_cursor_handle dm_get_driver_option dm_getdbitext dm_init dm_is_connection dm_is_cursor dm_is_engine dm_odb_preserves_cursor dm_reset dm_set_driver_option dm_set_max_fetches dm_set_max_rows_per_fetch dm_set_tm_clear_fast dm_val_relative sm_adjust_area sm_allget sm_amt_format sm_e_amt_format sm_i_amt_format sm_n_amt_format sm_o_amt_format sm_append_bundle_data sm_append_bundle_done sm_append_bundle_item sm_d_at_cur sm_l_at_cur sm_r_at_cur sm_mw_attach_drawing_func sm_mwn_attach_drawing_func sm_mwe_attach_drawing_func sm_xm_attach_drawing_func sm_xmn_attach_drawing_func sm_xme_attach_drawing_func sm_backtab sm_bel sm_bi_comparesm_bi_copy sm_bi_initialize sm_bkrect sm_c_off sm_c_on sm_c_vis sm_calc sm_cancel sm_ckdigit sm_cl_all_mdts sm_cl_unprot sm_clear_array sm_n_clear_array sm_1clear_array sm_n_1clear_array sm_close_window sm_com_load_picture sm_com_QueryInterface sm_com_result sm_com_result_msg sm_com_set_handler sm_copyarray sm_n_copyarray sm_create_bundle
+
+syn keyword jamLibFunc3 sm_d_msg_line sm_dblval sm_e_dblval sm_i_dblval sm_n_dblval sm_o_dblval sm_dd_able sm_dde_client_connect_cold sm_dde_client_connect_hot sm_dde_client_connect_warm sm_dde_client_disconnect sm_dde_client_off sm_dde_client_on sm_dde_client_paste_link_cold sm_dde_client_paste_link_hot sm_dde_client_paste_link_warm sm_dde_client_request sm_dde_execute sm_dde_install_notify sm_dde_poke sm_dde_server_off sm_dde_server_on sm_delay_cursor sm_deselect sm_dicname sm_disp_off sm_dlength sm_e_dlength sm_i_dlength sm_n_dlength sm_o_dlength sm_do_uinstalls sm_i_doccur sm_o_doccur sm_drawingarea sm_xm_drawingarea sm_dtofield sm_e_dtofield sm_i_dtofield sm_n_dtofield sm_o_dtofield sm_femsg sm_ferr_reset sm_fi_path sm_file_copy sm_file_exists sm_file_move sm_file_remove sm_fi_open sm_fi_path sm_filebox sm_filetypes sm_fio_a2f sm_fio_close sm_fio_editor sm_fio_error sm_fio_error_set sm_fio_f2a sm_fio_getc sm_fio_gets sm_fio_handle sm_fio_open sm_fio_putc sm_fio_puts sm_fio_rewind sm_flush sm_d_form sm_l_form
+
+syn keyword jamLibFunc4 sm_r_form sm_formlist sm_fptr sm_e_fptr sm_i_fptr sm_n_fptr sm_o_fptr sm_fqui_msg sm_fquiet_err sm_free_bundle sm_ftog sm_e_ftog sm_i_ftog sm_n_ftog sm_o_ftog sm_fval sm_e_fval sm_i_fval sm_n_fval sm_o_fval sm_i_get_bi_data sm_o_get_bi_data sm_get_bundle_data sm_get_bundle_item_count sm_get_bundle_occur_count sm_get_next_bundle_name sm_i_get_tv_bi_data sm_o_get_tv_bi_data sm_getfield sm_e_getfield sm_i_getfield sm_n_getfield sm_o_getfield sm_getkey sm_gofield sm_e_gofield sm_i_gofield sm_n_gofield sm_o_gofield sm_gtof sm_gval sm_i_gtof sm_n_gval sm_hlp_by_name sm_home sm_inimsg sm_initcrt sm_jinitcrt sm_jxinitcrt sm_input sm_inquire sm_install sm_intval sm_e_intval sm_i_intval sm_n_intval sm_o_intval sm_i_ioccur sm_o_ioccur sm_is_bundle sm_is_no sm_e_is_no sm_i_is_no sm_n_is_no sm_o_is_no sm_is_yes sm_e_is_yes sm_i_is_yes sm_n_is_yes sm_o_is_yes sm_isabort sm_iset sm_issv sm_itofield sm_e_itofield sm_i_itofield sm_n_itofield sm_o_itofield sm_jclose sm_jfilebox sm_jform sm_djplcall sm_jplcall
+
+syn keyword jamLibFunc5 sm_sjplcall sm_jplpublic sm_jplunload sm_jtop sm_jwindow sm_key_integer sm_keyfilter sm_keyhit sm_keyinit sm_n_keyinit sm_keylabel sm_keyoption sm_l_close sm_l_open sm_l_open_syslib sm_last sm_launch sm_h_ldb_fld_get sm_n_ldb_fld_get sm_h_ldb_n_fld_get sm_n_ldb_n_fld_get sm_h_ldb_fld_store sm_n_ldb_fld_store sm_h_ldb_n_fld_store sm_n_ldb_n_fld_store sm_ldb_get_active sm_ldb_get_inactive sm_ldb_get_next_active sm_ldb_get_next_inactive sm_ldb_getfield sm_i_ldb_getfield sm_n_ldb_getfield sm_o_ldb_getfield sm_ldb_h_getfield sm_i_ldb_h_getfield sm_n_ldb_h_getfield sm_o_ldb_h_getfield sm_ldb_handle sm_ldb_init sm_ldb_is_loaded sm_ldb_load sm_ldb_name sm_ldb_next_handle sm_ldb_pop sm_ldb_push sm_ldb_putfield sm_i_ldb_putfield sm_n_ldb_putfield sm_o_ldb_putfield sm_ldb_h_putfield sm_i_ldb_h_putfield sm_n_ldb_h_putfield sm_o_ldb_h_putfield sm_ldb_state_get sm_ldb_h_state_get sm_ldb_state_set sm_ldb_h_state_set sm_ldb_unload sm_ldb_h_unload sm_leave sm_list_objects_count sm_list_objects_end sm_list_objects_next
+
+syn keyword jamLibFunc6 sm_list_objects_start sm_lngval sm_e_lngval sm_i_lngval sm_n_lngval sm_o_lngval sm_load_screen sm_log sm_lstore sm_ltofield sm_e_ltofield sm_i_ltofield sm_n_ltofield sm_o_ltofield sm_m_flush sm_menu_bar_error sm_menu_change sm_menu_create sm_menu_delete sm_menu_get_int sm_menu_get_str sm_menu_install sm_menu_remove sm_message_box sm_mncrinit6 sm_mnitem_change sm_n_mnitem_change sm_mnitem_create sm_n_mnitem_create sm_mnitem_delete sm_n_mnitem_delete sm_mnitem_get_int sm_n_mnitem_get_int sm_mnitem_get_str sm_n_mnitem_get_str sm_mnscript_load sm_mnscript_unload sm_ms_inquire sm_msg sm_msg_del sm_msg_get sm_msg_read sm_d_msg_read sm_n_msg_read sm_msgfind sm_mts_CreateInstance sm_mts_CreateProperty sm_mts_CreatePropertyGroup sm_mts_DisableCommit sm_mts_EnableCommit sm_mts_GetPropertyValue sm_mts_IsCallerInRole sm_mts_IsInTransaction sm_mts_IsSecurityEnabled sm_mts_PutPropertyValue sm_mts_SetAbort sm_mts_SetComplete sm_mus_time sm_mw_get_client_wnd sm_mw_get_cmd_show sm_mw_get_frame_wnd sm_mw_get_instance
+
+syn keyword jamLibFunc7 sm_mw_get_prev_instance sm_mw_PrintScreen sm_next_sync sm_nl sm_null sm_e_null sm_i_null sm_n_null sm_o_null sm_obj_call sm_obj_copy sm_obj_copy_id sm_obj_create sm_obj_delete sm_obj_delete_id sm_obj_get_property sm_obj_onerror sm_obj_set_property sm_obj_sort sm_obj_sort_auto sm_occur_no sm_off_gofield sm_e_off_gofield sm_i_off_gofield sm_n_off_gofield sm_o_off_gofield sm_option sm_optmnu_id sm_pinquire sm_popup_at_cur sm_prop_error sm_prop_get_int sm_prop_get_str sm_prop_get_dbl sm_prop_get_x_int sm_prop_get_x_str sm_prop_get_x_dbl sm_prop_get_m_int sm_prop_get_m_str sm_prop_get_m_dbl sm_prop_id sm_prop_name_to_id sm_prop_set_int sm_prop_set_str sm_prop_set_dbl sm_prop_set_x_int sm_prop_set_x_str sm_prop_set_x_dbl sm_prop_set_m_int sm_prop_set_m_str sm_prop_set_m_dbl sm_pset sm_putfield sm_e_putfield sm_i_putfield sm_n_putfield sm_o_putfield sm_raise_exception sm_receive sm_receive_args sm_rescreen sm_resetcrt sm_jresetcrt sm_jxresetcrt sm_resize sm_restore_data sm_return sm_return_args sm_rmformlist sm_rs_data
+
+syn keyword jamLibFunc8 sm_rw_error_message sm_rw_play_metafile sm_rw_runreport sm_s_val sm_save_data sm_sdtime sm_select sm_send sm_set_help sm_setbkstat sm_setsibling sm_setstatus sm_sh_off sm_shell sm_shrink_to_fit sm_slib_error sm_slib_install sm_slib_load sm_soption sm_strip_amt_ptr sm_e_strip_amt_ptr sm_i_strip_amt_ptr sm_n_strip_amt_ptr sm_o_strip_amt_ptr sm_sv_data sm_sv_free sm_svscreen sm_tab sm_tm_clear sm_tm_clear_model_events sm_tm_command sm_tm_command_emsgset sm_tm_command_errset sm_tm_continuation_validity sm_tm_dbi_checker sm_tm_error sm_tm_errorlog sm_tm_event sm_tm_event_name sm_tm_failure_message sm_tm_handling sm_tm_inquire sm_tm_iset sm_tm_msg_count_error sm_tm_msg_emsg sm_tm_msg_error sm_tm_old_bi_context sm_tm_pcopy sm_tm_pinquire sm_tm_pop_model_event sm_tm_pset sm_tm_push_model_event sm_tmpnam sm_tp_exec sm_tp_free_arg_buf sm_tp_gen_insert sm_tp_gen_sel_return sm_tp_gen_sel_where sm_tp_gen_val_link sm_tp_gen_val_return sm_tp_get_svc_alias sm_tp_get_tux_callid sm_translatecoords sm_tst_all_mdts
+
+syn keyword jamLibFunc9 sm_udtime sm_ungetkey sm_unload_screen sm_unsvscreen sm_upd_select sm_validate sm_n_validate sm_vinit sm_n_vinit sm_wcount sm_wdeselect sm_web_get_cookie sm_web_invoke_url sm_web_log_error sm_web_save_global sm_web_set_cookie sm_web_unsave_all_globals sm_web_unsave_global sm_mw_widget sm_mwe_widget sm_mwn_widget sm_xm_widget sm_xme_widget sm_xmn_widget sm_win_shrink sm_d_window sm_d_at_cur sm_l_window sm_l_at_cur sm_r_window sm_r_at_cur sm_winsize sm_wrotate sm_wselect sm_n_wselect sm_ww_length sm_n_ww_length sm_ww_read sm_n_ww_read sm_ww_write sm_n_ww_write sm_xlate_table sm_xm_get_base_window sm_xm_get_display
+
+syn keyword jamVariable1 SM_SCCS_ID SM_ENTERTERM SM_MALLOC SM_CANCEL SM_BADTERM SM_FNUM SM_DZERO SM_EXPONENT SM_INVDATE SM_MATHERR SM_FRMDATA SM_NOFORM SM_FRMERR SM_BADKEY SM_DUPKEY SM_ERROR SM_SP1 SM_SP2 SM_RENTRY SM_MUSTFILL SM_AFOVRFLW SM_TOO_FEW_DIGITS SM_CKDIGIT SM_HITANY SM_NOHELP SM_MAXHELP SM_OUTRANGE SM_ENTERTERM1 SM_SYSDATE SM_DATFRM SM_DATCLR SM_DATINV SM_KSDATA SM_KSERR SM_KSNONE SM_KSMORE SM_DAYA1 SM_DAYA2 SM_DAYA3 SM_DAYA4 SM_DAYA5 SM_DAYA6 SM_DAYA7 SM_DAYL1 SM_DAYL2 SM_DAYL3 SM_DAYL4 SM_DAYL5 SM_DAYL6 SM_DAYL7 SM_MNSCR_LOAD SM_MENU_INSTALL SM_INSTDEFSCRL SM_INSTSCROLL SM_MOREDATA SM_READY SM_WAIT SM_YES SM_NO SM_NOTEMP SM_FRMHELP SM_FILVER SM_ONLYONE SM_WMSMOVE SM_WMSSIZE SM_WMSOFF SM_LPRINT SM_FMODE SM_NOFILE SM_NOSECTN SM_FFORMAT SM_FREAD SM_RX1 SM_RX2 SM_RX3 SM_TABLOOK SM_MISKET SM_ILLKET SM_ILLBRA SM_MISDBLKET SM_ILLDBLKET SM_ILLDBLBRA SM_ILL_RIGHT SM_ILLELSE SM_NUMBER SM_EOT SM_BREAK SM_NOARGS SM_BIGVAR SM_EXCESS SM_EOL SM_FILEIO SM_FOR SM_RCURLY SM_NONAME SM_1JPL_ERR SM_2JPL_ERR SM_3JPL_ERR
+
+syn keyword jamVariable2 SM_JPLATCH SM_FORMAT SM_DESTINATION SM_ORAND SM_ORATOR SM_ILL_LEFT SM_MISSPARENS SM_ILLCLOSE_COMM SM_FUNCTION SM_EQUALS SM_MISMATCH SM_QUOTE SM_SYNTAX SM_NEXT SM_VERB_UNKNOWN SM_JPLFORM SM_NOT_LOADED SM_GA_FLG SM_GA_CHAR SM_GA_ARG SM_GA_DIG SM_NOFUNC SM_BADPROTO SM_JPLPUBLIC SM_NOCOMPILE SM_NULLEDIT SM_RP_NULL SM_DBI_NOT_INST SM_NOTJY SM_MAXLIB SM_FL_FLLIB SM_TPI_NOT_INST SM_RW_NOT_INST SM_MONA1 SM_MONA2 SM_MONA3 SM_MONA4 SM_MONA5 SM_MONA6 SM_MONA7 SM_MONA8 SM_MONA9 SM_MONA10 SM_MONA11 SM_MONA12 SM_MONL1 SM_MONL2 SM_MONL3 SM_MONL4 SM_MONL5 SM_MONL6 SM_MONL7 SM_MONL8 SM_MONL9 SM_MONL10 SM_MONL11 SM_MONL12 SM_AM SM_PM SM_0DEF_DTIME SM_1DEF_DTIME SM_2DEF_DTIME SM_3DEF_DTIME SM_4DEF_DTIME SM_5DEF_DTIME SM_6DEF_DTIME SM_7DEF_DTIME SM_8DEF_DTIME SM_9DEF_DTIME SM_CALC_DATE SM_BAD_DIGIT SM_BAD_YN SM_BAD_ALPHA SM_BAD_NUM SM_BAD_ALPHNUM SM_DECIMAL SM_1STATS SM_VERNO SM_DIG_ERR SM_YN_ERR SM_LET_ERR SM_NUM_ERR SM_ANUM_ERR SM_REXP_ERR SM_POSN_ERR SM_FBX_OPEN SM_FBX_WINDOW SM_FBX_SIBLING SM_OPENDIR
+
+syn keyword jamVariable3 SM_GETFILES SM_CHDIR SM_GETCWD SM_UNCLOSED_COMM SM_MB_OKLABEL SM_MB_CANCELLABEL SM_MB_YESLABEL SM_MB_NOLABEL SM_MB_RETRYLABEL SM_MB_IGNORELABEL SM_MB_ABORTLABEL SM_MB_HELPLABEL SM_MB_STOP SM_MB_QUESTION SM_MB_WARNING SM_MB_INFORMATION SM_MB_YESALLLABEL SM_0MN_CURRDEF SM_1MN_CURRDEF SM_2MN_CURRDEF SM_0DEF_CURR SM_1DEF_CURR SM_2DEF_CURR SM_3DEF_CURR SM_4DEF_CURR SM_5DEF_CURR SM_6DEF_CURR SM_7DEF_CURR SM_8DEF_CURR SM_9DEF_CURR SM_SEND_SYNTAX SM_SEND_ITEM SM_SEND_INVALID_BUNDLE SM_RECEIVE_SYNTAX SM_RECEIVE_ITEM_NUMBER SM_RECEIVE_OVERFLOW SM_RECEIVE_ITEM SM_SYNCH_RECEIVE SM_EXEC_FAIL SM_DYNA_HELP_NOT_AVAIL SM_DLL_LOAD_ERR SM_DLL_UNRESOLVED SM_DLL_VERSION_ERR SM_DLL_OPTION_ERR SM_DEMOERR SM_MB_OKALLLABEL SM_MB_NOALLLABEL SM_BADPROP SM_BETWEEN SM_ATLEAST SM_ATMOST SM_PR_ERROR SM_PR_OBJID SM_PR_OBJECT SM_PR_ITEM SM_PR_PROP SM_PR_PROP_ITEM SM_PR_PROP_VAL SM_PR_CONVERT SM_PR_OBJ_TYPE SM_PR_RANGE SM_PR_NO_SET SM_PR_BYND_SCRN SM_PR_WW_SCROLL SM_PR_NO_SYNC SM_PR_TOO_BIG SM_PR_BAD_MASK SM_EXEC_MEM_ERR
+
+syn keyword jamVariable4 SM_EXEC_NO_PROG SM_PR_NO_KEYSTRUCT SM_REOPEN_AS_SLIB SM_REOPEN_THE_SLIB SM_ERRLIB SM_WARNLIB SM_LIB_DOWNGRADE SM_OLDER SM_NEWER SM_UPGRADE SM_LIB_READONLY SM_LOPEN_ERR SM_LOPEN_WARN SM_MLOPEN_CREAT SM_MLOPEN_INIT SM_LIB_ERR SM_LIB_ISOLATE SM_LIB_NO_ERR SM_LIB_REC_ERR SM_LIB_FATAL_ERR SM_LIB_LERR_FILE SM_LIB_LERR_NOTLIB SM_LIB_LERR_BADVERS SM_LIB_LERR_FORMAT SM_LIB_LERR_BADCM SM_LIB_LERR_LOCK SM_LIB_LERR_RESERVED SM_LIB_LERR_READONLY SM_LIB_LERR_NOENTRY SM_LIB_LERR_BUSY SM_LIB_LERR_ROVERS SM_LIB_LERR_DEFAULT SM_LIB_BADCM SM_LIB_LERR_NEW SM_STANDALONE_MODE SM_FEATURE_RESTRICT FM_CH_LOST FM_JPL_PROMPT FM_YR4 FM_YR2 FM_MON FM_MON2 FM_DATE FM_DATE2 FM_HOUR FM_HOUR2 FM_MIN FM_MIN2 FM_SEC FM_SEC2 FM_YRDAY FM_AMPM FM_DAYA FM_DAYL FM_MONA FM_MONL FM_0MN_DEF_DT FM_1MN_DEF_DT FM_2MN_DEF_DT FM_DAY JM_QTERMINATE JM_HITSPACE JM_HITACK JM_NOJWIN UT_MEMERR UT_P_OPT UT_V_OPT UT_E_BINOPT UT_NO_INPUT UT_SECLONG UT_1FNAME UT_SLINE UT_FILE UT_ERROR UT_WARNING UT_MISSEQ UT_VOPT UT_M2_DESCR
+
+syn keyword jamVariable5 UT_M2_PROGNAME UT_M2_USAGE UT_M2_O_OPT UT_M2_COM UT_M2_BADTAG UT_M2_MSSQUOT UT_M2_AFTRQUOT UT_M2_DUPSECT UT_M2_BADUCLSS UT_M2_USECPRFX UT_M2_MPTYUSCT UT_M2_DUPMSGTG UT_M2_TOOLONG UT_M2_LONG UT_K2_DESCR UT_K2_PROGNAME UT_K2_USAGE UT_K2_MNEM UT_K2_NKEYDEF UT_K2_DUPKEY UT_K2_NOTFOUND UT_K2_1FNAME UT_K2_VOPT UT_K2_EXCHAR UT_V2_DESCR UT_V2_PROGNAME UT_V2_USAGE UT_V2_SLINE UT_V2_SEQUAL UT_V2_SVARNAME UT_V2_SNAME UT_V2_VOPT UT_V2_1REQ UT_CB_DESCR UT_CB_PROGNAME UT_CB_USAGE UT_CB_VOPT UT_CB_MIEXT UT_CB_AEXT UT_CB_UNKNOWN UT_CB_ISCHEME UT_CB_BKFGS UT_CB_ABGS UT_CB_REC UT_CB_GUI UT_CB_CONT UT_CB_CONTFG UT_CB_AFILE UT_CB_LEFT_QUOTE UT_CB_NO_EQUAL UT_CB_EXTRA_EQ UT_CB_BAD_LHS UT_CB_BAD_RHS UT_CB_BAD_QUOTED UT_CB_FILE UT_CB_FILE_LINE UT_CB_DUP_ALIAS UT_CB_LINE_LOOP UT_CB_BAD_STYLE UT_CB_DUP_STYLE UT_CB_NO_SECT UT_CB_DUP_SCHEME DM_ERROR DM_NODATABASE DM_NOTLOGGEDON DM_ALREADY_ON DM_ARGS_NEEDED DM_LOGON_DENIED DM_BAD_ARGS DM_BAD_CMD DM_NO_MORE_ROWS DM_ABORTED DM_NO_CURSOR DM_MANY_CURSORS DM_KEYWORD
+
+syn keyword jamVariable6 DM_INVALID_DATE DM_COMMIT DM_ROLLBACK DM_PARSE_ERROR DM_BIND_COUNT DM_BIND_VAR DM_DESC_COL DM_FETCH DM_NO_NAME DM_END_OF_PROC DM_NOCONNECTION DM_NOTSUPPORTED DM_TRAN_PEND DM_NO_TRANSACTION DM_ALREADY_INIT DM_INIT_ERROR DM_MAX_DEPTH DM_NO_PARENT DM_NO_CHILD DM_MODALITY_NOT_FOUND DM_NATIVE_NO_SUPPORT DM_NATIVE_CANCEL DM_TM_ALREADY DM_TM_IN_PROGRESS DM_TM_CLOSE_ERROR DM_TM_BAD_MODE DM_TM_BAD_CLOSE_ACTION DM_TM_INTERNAL DM_TM_MODEL_INTERNAL DM_TM_NO_ROOT DM_TM_NO_TRANSACTION DM_TM_INITIAL_MODE DM_TM_PARENT_NAME DM_TM_BAD_MEMBER DM_TM_FLD_NAM_LEN DM_TM_NO_PARENT DM_TM_BAD_REQUEST DM_TM_CANNOT_GEN_SQL DM_TM_CANNOT_EXEC_SQL DM_TM_DBI_ERROR DM_TM_DISCARD_ALL DM_TM_DISCARD_LATEST DM_TM_CALL_ERROR DM_TM_CALL_TYPE DM_TM_HOOK_MODEL DM_TM_ROOT_NAME DM_TM_TV_INVALID DM_TM_COL_NOT_FOUND DM_TM_BAD_LINK DM_TM_HOOK_MODEL_ERROR DM_TM_ONE_ROW DM_TM_SOME_ROWS DM_TM_GENERAL DM_TM_NO_HOOK DM_TM_NOSET DM_TM_TBLNAME DM_TM_PRIMARY_KEY DM_TM_INCOMPLETE_KEY DM_TM_CMD_MODE DM_TM_NO_SUCH_CMD DM_TM_NO_SUCH_SCOPE
+
+syn keyword jamVariable7 DM_TM_NO_SUCH_TV DM_TM_EVENT_LOOP DM_TM_UNSUPPORTED DM_TM_NO_MODEL DM_TM_SYNCH_SV DM_TM_WRONG_FORM DM_TM_VC_FIELD DM_TM_VC_DATE DM_TM_VC_TYPE DM_TM_BAD_CONTINUE DM_JDB_OUT_OF_MEMORY DM_JDB_DUPTABLEALIAS DM_JDB_DUPCURSORNAME DM_JDB_NODB DM_JDB_BINDCOUNT DM_JDB_NO_MORE_ROWS DM_JDB_AMBIGUOUS_COLUMN_REF DM_JDB_UNRESOLVED_COLUMN_REF DM_JDB_TABLE_READ_WRITE_CONFLICT DM_JDB_SYNTAX_ERROR DM_JDB_DUP_COLUMN_ASSIGNMENT DM_JDB_NO_MSG_FILE DM_JDB_NO_MSG DM_JDB_NOT_IMPLEMENTED DM_JDB_AGGREGATE_NOT_ALLOWED DM_JDB_TYPE_MISMATCH DM_JDB_NO_CURRENT_ROW DM_JDB_DB_CORRUPT DM_JDB_BUF_OVERFLOW DM_JDB_FILE_IO_ERR DM_JDB_BAD_HANDLE DM_JDB_DUP_TNAME DM_JDB_INVALID_TABLE_OP DM_JDB_TABLE_NOT_FOUND DM_JDB_CONVERSION_FAILED DM_JDB_INVALID_COLUMN_LIST DM_JDB_TABLE_OPEN DM_JDB_BAD_INPUT DM_JDB_DATATYPE_OVERFLOW DM_JDB_DATABASE_EXISTS DM_JDB_DATABASE_OPEN DM_JDB_DUP_CNAME DM_JDB_TMPDATABASE_ERR DM_JDB_INVALID_VALUES_COUNT DM_JDB_INVALID_COLUMN_COUNT DM_JDB_MAX_RECLEN_EXCEEDED DM_JDB_END_OF_GROUP
+
+syn keyword jamVariable8 TP_EXC_INVALID_CLIENT_COMMAND TP_EXC_INVALID_CLIENT_OPTION TP_EXC_INVALID_COMMAND TP_EXC_INVALID_COMMAND_SYNTAX TP_EXC_INVALID_CONNECTION TP_EXC_INVALID_CONTEXT TP_EXC_INVALID_FORWARD TP_EXC_INVALID_JAM_VARIABLE_REF TP_EXC_INVALID_MONITOR_COMMAND TP_EXC_INVALID_MONITOR_OPTION TP_EXC_INVALID_OPTION TP_EXC_INVALID_OPTION_VALUE TP_EXC_INVALID_SERVER_COMMAND TP_EXC_INVALID_SERVER_OPTION TP_EXC_INVALID_SERVICE TP_EXC_INVALID_TRANSACTION TP_EXC_JIF_ACCESS_FAILED TP_EXC_JIF_LOWER_VERSION TP_EXC_LOGFILE_ERROR TP_EXC_MONITOR_ERROR TP_EXC_NO_OUTSIDE_TRANSACTION TP_EXC_NO_OUTSTANDING_CALLS TP_EXC_NO_OUTSTANDING_MESSAGE TP_EXC_NO_SERVICES_ADVERTISED TP_EXC_NO_SIGNALS TP_EXC_NONTRANSACTIONAL_SERVICE TP_EXC_NONTRANSACTIONAL_ACTION TP_EXC_OUT_OF_MEMORY TP_EXC_POSTING_FAILED TP_EXC_PERMISSION_DENIED TP_EXC_REQUEST_LIMIT TP_EXC_ROLLBACK_COMMITTED TP_EXC_ROLLBACK_FAILED TP_EXC_SERVICE_FAILED TP_EXC_SERVICE_NOT_IN_JIF TP_EXC_SERVICE_PROTOCOL_ERROR TP_EXC_SUBSCRIPTION_LIMIT
+
+syn keyword jamVariable9 TP_EXC_SUBSCRIPTION_MATCH TP_EXC_SVC_ADVERTISE_LIMIT TP_EXC_SVC_WORK_OUTSTANDING TP_EXC_SVCROUTINE_MISSING TP_EXC_SVRINIT_WORK_OUTSTANDING TP_EXC_TIMEOUT TP_EXC_TRANSACTION_LIMIT TP_EXC_UNLOAD_FAILED TP_EXC_UNSUPPORTED_BUFFER TP_EXC_UNSUPPORTED_BUF_W_SUBT TP_EXC_USER_ABORT TP_EXC_WORK_OUTSTANDING TP_EXC_XA_CLOSE_FAILED TP_EXC_XA_OPEN_FAILED TP_EXC_QUEUE_BAD_MSGID TP_EXC_QUEUE_BAD_NAMESPACE TP_EXC_QUEUE_BAD_QUEUE TP_EXC_QUEUE_CANT_START_TRAN TP_EXC_QUEUE_FULL TP_EXC_QUEUE_MSG_IN_USE TP_EXC_QUEUE_NO_MSG TP_EXC_QUEUE_NOT_IN_QSPACE TP_EXC_QUEUE_RSRC_NOT_OPEN TP_EXC_QUEUE_SPACE_NOT_IN_JIF TP_EXC_QUEUE_TRAN_ABORTED TP_EXC_QUEUE_TRAN_ABSENT TP_EXC_QUEUE_UNEXPECTED TP_EXC_DCE_LOGIN_REQUIRED TP_EXC_ENC_CELL_NAME_REQUIRED TP_EXC_ENC_CONN_INFO_DIFFS TP_EXC_ENC_SVC_REGISTRY_ERROR TP_INVALID_START_ROUTINE TP_JIF_NOT_FOUND TP_JIF_OPEN_ERROR TP_NO_JIF TP_NO_MONITORS_ERROR TP_NO_SESSIONS_ERROR TP_NO_START_ROUTINE TP_ADV_SERVICE TP_ADV_SERVICE_IN_GROUP TP_PRE_SVCHDL_WINOPEN_FAILED
+
+syn keyword jamVariable10 PV_YES PV_NO TRUE FALSE TM_TRAN_NAME
+
+" jamCommentGroup allows adding matches for special things in comments
+syn cluster jamCommentGroup contains=jamTodo
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match jamSpecial contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"
+if !exists("c_no_utf")
+ syn match jamSpecial contained "\\\(u\x\{4}\|U\x\{8}\)"
+endif
+if exists("c_no_cformat")
+ syn region jamString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial
+else
+ syn match jamFormat "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([diuoxXfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
+ syn match jamFormat "%%" contained
+ syn region jamString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat
+ hi link jamFormat jamSpecial
+endif
+syn match jamCharacter "L\='[^\\]'"
+syn match jamCharacter "L'[^']*'" contains=jamSpecial
+syn match jamSpecialError "L\='\\[^'\"?\\abfnrtv]'"
+syn match jamSpecialCharacter "L\='\\['\"?\\abfnrtv]'"
+syn match jamSpecialCharacter "L\='\\\o\{1,3}'"
+syn match jamSpecialCharacter "'\\x\x\{1,2}'"
+syn match jamSpecialCharacter "L'\\x\x\+'"
+
+"catch errors caused by wrong parenthesis and brackets
+syn cluster jamParenGroup contains=jamParenError,jamIncluded,jamSpecial,@jamCommentGroup,jamUserCont,jamUserLabel,jamBitField,jamCommentSkip,jamOctalZero,jamCppOut,jamCppOut2,jamCppSkip,jamFormat,jamNumber,jamFloat,jamOctal,jamOctalError,jamNumbersCom
+
+syn region jamParen transparent start='(' end=')' contains=ALLBUT,@jamParenGroup,jamErrInBracket
+syn match jamParenError "[\])]"
+syn match jamErrInParen contained "[\]{}]"
+syn region jamBracket transparent start='\[' end=']' contains=ALLBUT,@jamParenGroup,jamErrInParen
+syn match jamErrInBracket contained "[);{}]"
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match jamNumbers transparent "\<\d\|\,\d" contains=jamNumber,jamFloat,jamOctalError,jamOctal
+" Same, but without octal error (for comments)
+syn match jamNumbersCom contained transparent "\<\d\|\,\d" contains=jamNumber,jamFloat,jamOctal
+syn match jamNumber contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
+"hex number
+syn match jamNumber contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+" Flag the first zero of an octal number as something special
+syn match jamOctal contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=cOctalZero
+syn match jamOctalZero contained "\<0"
+syn match jamFloat contained "\d\+f"
+"floating point number, with dot, optional exponent
+syn match jamFloat contained "\d\+\,\d*\(e[-+]\=\d\+\)\=[fl]\="
+"floating point number, starting with a dot, optional exponent
+syn match jamFloat contained "\,\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match jamFloat contained "\d\+e[-+]\=\d\+[fl]\=\>"
+" flag an octal number with wrong digits
+syn match jamOctalError contained "0\o*[89]\d*"
+syn case match
+
+syntax match jamOperator1 "\#\#"
+syntax match jamOperator6 "/"
+syntax match jamOperator2 "+"
+syntax match jamOperator3 "*"
+syntax match jamOperator4 "-"
+syntax match jamOperator5 "|"
+syntax match jamOperator6 "/"
+syntax match jamOperator7 "&"
+syntax match jamOperator8 ":"
+syntax match jamOperator9 "<"
+syntax match jamOperator10 ">"
+syntax match jamOperator11 "!"
+syntax match jamOperator12 "%"
+syntax match jamOperator13 "^"
+syntax match jamOperator14 "@"
+
+syntax match jamCommentL "//"
+
+if exists("jam_comment_strings")
+ " A comment can contain jamString, jamCharacter and jamNumber.
+ " But a "*/" inside a jamString in a jamComment DOES end the comment! So we
+ " need to use a special type of jamString: jamCommentString, 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 jamCommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region jamCommentString contained start=+L\="+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=jamSpecial,jamCommentSkip
+ syntax region jamComment2String contained start=+L\="+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=jamSpecial
+ syntax region jamCommentL start="//" skip="\\$" end="$" keepend contains=@jamCommentGroup,jamComment2String,jamCharacter,jamNumbersCom,jamSpaceError
+ syntax region jamCommentL2 start="^#\|^\s\+\#" skip="\\$" end="$" keepend contains=@jamCommentGroup,jamComment2String,jamCharacter,jamNumbersCom,jamSpaceError
+ syntax region jamComment start="/\*" end="\*/" contains=@jamCommentGroup,jamCommentString,jamCharacter,jamNumbersCom,jamSpaceError
+else
+ syn region jamCommentL start="//" skip="\\$" end="$" keepend contains=@jamCommentGroup,jamSpaceError
+ syn region jamCommentL2 start="^\#\|^\s\+\#" skip="\\$" end="$" keepend contains=@jamCommentGroup,jamSpaceError
+ syn region jamComment start="/\*" end="\*/" contains=@jamCommentGroup,jamSpaceError
+endif
+
+" keep a // comment separately, it terminates a preproc. conditional
+syntax match jamCommentError "\*/"
+
+syntax match jamOperator3Error "*/"
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/jargon.vim b/runtime/syntax/jargon.vim
new file mode 100644
index 0000000..c4b017d
--- /dev/null
+++ b/runtime/syntax/jargon.vim
@@ -0,0 +1,24 @@
+" Vim syntax file
+" Language: Jargon File
+" Maintainer: Dan Church (https://github.com/h3xx)
+" Last Change: 2020 Mar 16
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn region jargonHeader start="^:" end="$" contains=jargonChaptTitle
+syn match jargonChaptTitle /:[^:]*:/ contained
+syn match jargonEmailAddr /[+._A-Za-z0-9-]\+@[+._A-Za-z0-9-]\+/
+syn match jargonUrl +\(https\?\|ftp\)://[^\t )"]*+
+syn region jargonMark start="{[^\t {}]" end="}"
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..00d6071
--- /dev/null
+++ b/runtime/syntax/java.vim
@@ -0,0 +1,380 @@
+" Vim syntax file
+" Language: Java
+" Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" URL: https://github.com/fleiner/vim/blob/master/runtime/syntax/java.vim
+" Last Change: 2022 Jun 08
+
+" Please check :help java.vim for comments on some of the options available.
+
+" quit when a syntax file was already loaded
+if !exists("main_syntax")
+ if exists("b:current_syntax")
+ finish
+ endif
+ " we define it here so that included files can test for it
+ let main_syntax='java'
+ syn region javaFold start="{" end="}" transparent fold
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" some characters that cannot be in a java program (outside a string)
+syn match javaError "[\\@`]"
+syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
+
+" use separate name so that it can be deleted in javacc.vim
+syn match javaError2 "#\|=<"
+hi def link javaError2 javaError
+
+" keyword definitions
+syn keyword javaExternal native package
+syn match javaExternal "\<import\>\(\s\+static\>\)\?"
+syn keyword javaError goto const
+syn keyword javaConditional if else switch
+syn keyword javaRepeat while for do
+syn keyword javaBoolean true false
+syn keyword javaConstant null
+syn keyword javaTypedef this super
+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
+syn keyword javaStorageClass static synchronized transient volatile final strictfp serializable
+syn keyword javaExceptions throw try catch finally
+syn keyword javaAssert assert
+syn keyword javaMethodDecl synchronized throws
+syn keyword javaClassDecl extends implements interface
+" to differentiate the keyword class from MyClass.class we use a match here
+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 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
+
+function s:isModuleInfoDeclarationCurrentBuffer() abort
+ return fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
+endfunction
+
+" Java Modules(Since Java 9, for "module-info.java" file)
+if s:isModuleInfoDeclarationCurrentBuffer()
+ 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")
+ " java.lang.*
+ "
+ " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
+ " and javaX_JavaLang are sub-grouped according to the Java version
+ " of their introduction, and sub-group keywords (that is, class
+ " names) are arranged in alphabetical order, so that future newer
+ " keywords can be pre-sorted and appended without disturbing
+ " the current keyword placement. The below _match_es follow suit.
+
+ syn keyword javaR_JavaLang ArithmeticException ArrayIndexOutOfBoundsException ArrayStoreException ClassCastException IllegalArgumentException IllegalMonitorStateException IllegalThreadStateException IndexOutOfBoundsException NegativeArraySizeException NullPointerException NumberFormatException RuntimeException SecurityException StringIndexOutOfBoundsException IllegalStateException UnsupportedOperationException EnumConstantNotPresentException TypeNotPresentException IllegalCallerException LayerInstantiationException
+ syn cluster javaTop add=javaR_JavaLang
+ syn cluster javaClasses add=javaR_JavaLang
+ hi def link javaR_JavaLang javaR_Java
+ " Member enumerations:
+ syn match javaC_JavaLang "\%(\<Thread\.\)\@<=\<State\>"
+ syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<UnicodeScript\>"
+ syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@<=\<Type\>"
+ syn match javaC_JavaLang "\%(\<StackWalker\.\)\@<=\<Option\>"
+ syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@<=\<Level\>"
+ " Member classes:
+ syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<Subset\>"
+ syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<UnicodeBlock\>"
+ syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@<=\<Redirect\>"
+ syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@<=\<Controller\>"
+ syn match javaC_JavaLang "\%(\<Runtime\.\)\@<=\<Version\>"
+ syn match javaC_JavaLang "\%(\<System\.\)\@<=\<LoggerFinder\>"
+ syn match javaC_JavaLang "\%(\<Enum\.\)\@<=\<EnumDesc\>"
+ syn keyword javaC_JavaLang Boolean Character Class ClassLoader Compiler Double Float Integer Long Math Number Object Process Runtime SecurityManager String StringBuffer Thread ThreadGroup Byte Short Void InheritableThreadLocal Package RuntimePermission ThreadLocal StrictMath StackTraceElement Enum ProcessBuilder StringBuilder ClassValue Module ModuleLayer StackWalker Record
+ syn match javaC_JavaLang "\<System\>" " See javaDebug.
+ syn cluster javaTop add=javaC_JavaLang
+ syn cluster javaClasses add=javaC_JavaLang
+ hi def link javaC_JavaLang javaC_Java
+ syn keyword javaE_JavaLang AbstractMethodError ClassCircularityError ClassFormatError Error IllegalAccessError IncompatibleClassChangeError InstantiationError InternalError LinkageError NoClassDefFoundError NoSuchFieldError NoSuchMethodError OutOfMemoryError StackOverflowError ThreadDeath UnknownError UnsatisfiedLinkError VerifyError VirtualMachineError ExceptionInInitializerError UnsupportedClassVersionError AssertionError BootstrapMethodError
+ syn cluster javaTop add=javaE_JavaLang
+ syn cluster javaClasses add=javaE_JavaLang
+ hi def link javaE_JavaLang javaE_Java
+ syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
+ syn cluster javaTop add=javaX_JavaLang
+ syn cluster javaClasses add=javaX_JavaLang
+ hi def link javaX_JavaLang javaX_Java
+
+ 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
+ hi def link javaLangObject javaConstant
+ syn cluster javaTop add=javaLangObject
+endif
+
+if filereadable(expand("<sfile>:p:h")."/javaid.vim")
+ source <sfile>:p:h/javaid.vim
+endif
+
+if exists("java_space_errors")
+ if !exists("java_no_trail_space_error")
+ syn match javaSpaceError "\s\+$"
+ endif
+ if !exists("java_no_tab_space_error")
+ syn match javaSpaceError " \+\t"me=e-1
+ endif
+endif
+
+syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" end="->" matchgroup=NONE end=":" contains=javaNumber,javaCharacter,javaString
+syn match javaUserLabel "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=javaLabel
+syn keyword javaLabel default
+
+" highlighting C++ keywords as errors removed, too many people find it
+" annoying. Was: if !exists("java_allow_cpp_keywords")
+
+" The following cluster contains all java groups except the contained ones
+syn cluster javaTop add=javaExternal,javaError,javaBranch,javaLabelRegion,javaLabel,javaConditional,javaRepeat,javaBoolean,javaConstant,javaTypedef,javaOperator,javaType,javaStatement,javaStorageClass,javaAssert,javaExceptions,javaMethodDecl,javaClassDecl,javaScopeDecl,javaError2,javaUserLabel,javaLangObject,javaAnnotation,javaVarArg
+
+
+" Comments
+syn keyword javaTodo contained TODO FIXME XXX
+if exists("java_comment_strings")
+ syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
+ syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
+ syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
+ syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
+ syn match javaCommentCharacter contained "'[^\\]'"
+ syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber
+ syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber
+endif
+syn region javaComment start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,@Spell
+syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
+syn match javaCommentStar contained "^\s*\*$"
+syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,@Spell
+hi def link javaCommentString javaString
+hi def link javaComment2String javaString
+hi def link javaCommentCharacter javaCharacter
+
+syn cluster javaTop add=javaComment,javaLineComment
+
+if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
+ syntax case ignore
+ " syntax coloring for javadoc comments (HTML)
+ syntax include @javaHtml syntax/html.vim
+ unlet b:current_syntax
+ " HTML enables spell checking for all text that is not in a syntax item. This
+ " is wrong for Java (all identifiers would be spell-checked), so it's undone
+ " here.
+ syntax spell default
+
+ syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaTodo,@Spell
+ syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle keepend end="\.$" end="\.[ \t\r<&]"me=e-1 end="[^{]@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,@Spell,javaDocTags,javaDocSeeTag
+
+ syn region javaDocTags contained start="{@\(code\|link\|linkplain\|inherit[Dd]oc\|doc[rR]oot\|value\)" end="}"
+ syn match javaDocTags contained "@\(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
+ syn match javaDocParam contained "\s\S\+"
+ syn match javaDocTags contained "@\(version\|author\|return\|deprecated\|serial\|serialField\|serialData\)\>"
+ syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
+ syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\(\k\|\.\)*\(#\k\+\((\_[^)]\+)\)\=\)\=@ extend
+ syntax case match
+endif
+
+" match the special comment /**/
+syn match javaComment "/\*\*/"
+
+" Strings and constants
+syn match javaSpecialError contained "\\."
+syn match javaSpecialCharError contained "[^']"
+syn match javaSpecialChar contained "\\\([4-9]\d\|[0-3]\d\d\|[\"\\'ntbrf]\|u\x\{4\}\)"
+syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
+" next line disabled, it can cause a crash for a long line
+"syn match javaStringError +"\([^"\\]\|\\.\)*$+
+syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
+syn match javaCharacter "'\\''" contains=javaSpecialChar
+syn match javaCharacter "'[^\\]'"
+syn match javaNumber "\<\(0[bB][0-1]\+\|0[0-7]*\|0[xX]\x\+\|\d\(\d\|_\d\)*\)[lL]\=\>"
+syn match javaNumber "\(\<\d\(\d\|_\d\)*\.\(\d\(\d\|_\d\)*\)\=\|\.\d\(\d\|_\d\)*\)\([eE][-+]\=\d\(\d\|_\d\)*\)\=[fFdD]\="
+syn match javaNumber "\<\d\(\d\|_\d\)*[eE][-+]\=\d\(\d\|_\d\)*[fFdD]\=\>"
+syn match javaNumber "\<\d\(\d\|_\d\)*\([eE][-+]\=\d\(\d\|_\d\)*\)\=[fFdD]\>"
+
+" unicode characters
+syn match javaSpecial "\\u\d\{4\}"
+
+syn cluster javaTop add=javaString,javaCharacter,javaNumber,javaSpecial,javaStringError
+
+if exists("java_highlight_functions")
+ if java_highlight_functions == "indent"
+ syn match javaFuncDef "^\(\t\| \{8\}\)[_$a-zA-Z][_$a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
+ syn region javaFuncDef start=+^\(\t\| \{8\}\)[$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*,\s*+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
+ syn match javaFuncDef "^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
+ syn region javaFuncDef start=+^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*,\s*+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
+ else
+ " This line catches method declarations at any indentation>0, but it assumes
+ " two things:
+ " 1. class names are always capitalized (ie: Button)
+ " 2. method names are never capitalized (except constructors, of course)
+ "syn region javaFuncDef start=+^\s\+\(\(public\|protected\|private\|static\|abstract\|final\|native\|synchronized\)\s\+\)*\(\(void\|boolean\|char\|byte\|short\|int\|long\|float\|double\|\([A-Za-z_][A-Za-z0-9_$]*\.\)*[A-Z][A-Za-z0-9_$]*\)\(<[^>]*>\)\=\(\[\]\)*\s\+[a-z][A-Za-z0-9_$]*\|[A-Z][A-Za-z0-9_$]*\)\s*([^0-9]+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,javaComment,javaLineComment,@javaClasses
+ syn region javaFuncDef start=+^\s\+\(\(public\|protected\|private\|static\|abstract\|final\|native\|synchronized\)\s\+\)*\(<.*>\s\+\)\?\(\(void\|boolean\|char\|byte\|short\|int\|long\|float\|double\|\([A-Za-z_][A-Za-z0-9_$]*\.\)*[A-Z][A-Za-z0-9_$]*\)\(<[^(){}]*>\)\=\(\[\]\)*\s\+[a-z][A-Za-z0-9_$]*\|[A-Z][A-Za-z0-9_$]*\)\s*(+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,javaComment,javaLineComment,@javaClasses,javaAnnotation
+ endif
+ syn match javaLambdaDef "[a-zA-Z_][a-zA-Z0-9_]*\s*->"
+ syn match javaBraces "[{}]"
+ syn cluster javaTop add=javaFuncDef,javaBraces,javaLambdaDef
+endif
+
+if exists("java_highlight_debug")
+
+ " Strings and constants
+ syn match javaDebugSpecial contained "\\\d\d\d\|\\."
+ syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
+ syn match javaDebugStringError +"\([^"\\]\|\\.\)*$+
+ syn match javaDebugCharacter contained "'[^\\]'"
+ syn match javaDebugSpecialCharacter contained "'\\.'"
+ syn match javaDebugSpecialCharacter contained "'\\''"
+ syn match javaDebugNumber contained "\<\(0[0-7]*\|0[xX]\x\+\|\d\+\)[lL]\=\>"
+ syn match javaDebugNumber contained "\(\<\d\+\.\d*\|\.\d\+\)\([eE][-+]\=\d\+\)\=[fFdD]\="
+ syn match javaDebugNumber contained "\<\d\+[eE][-+]\=\d\+[fFdD]\=\>"
+ syn match javaDebugNumber contained "\<\d\+\([eE][-+]\=\d\+\)\=[fFdD]\>"
+ syn keyword javaDebugBoolean contained true false
+ syn keyword javaDebugType contained null this super
+ syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
+
+ " to make this work you must define the highlighting for these groups
+ syn match javaDebug "\<System\.\(out\|err\)\.print\(ln\)*\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
+ syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
+ syn match javaDebug "[A-Za-z][a-zA-Z0-9_]*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
+ syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
+
+ syn cluster javaTop add=javaDebug
+
+ 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 "[{}]"
+ hi def link javaInParen javaError
+ syn cluster javaTop add=javaInParen
+endif
+
+" catch errors caused by wrong parenthesis
+syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaParenT1
+syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaParenT2 contained
+syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaParenT contained
+syn match javaParenError ")"
+" catch errors caused by wrong square parenthesis
+syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
+syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
+syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
+syn match javaParenError "\]"
+
+hi def link javaParenError javaError
+
+if exists("java_highlight_functions")
+ syn match javaLambdaDef "([a-zA-Z0-9_<>\[\], \t]*)\s*->"
+ " needs to be defined after the parenthesis error catcher to work
+endif
+
+if !exists("java_minlines")
+ let java_minlines = 10
+endif
+exec "syn sync ccomment javaComment minlines=" . java_minlines
+
+" The default highlighting.
+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 s:isModuleInfoDeclarationCurrentBuffer()
+ hi def link javaModuleStorageClass StorageClass
+ hi def link javaModuleStmt Statement
+ hi def link javaModuleExternal Include
+endif
+
+let b:current_syntax = "java"
+
+if main_syntax == 'java'
+ unlet main_syntax
+endif
+
+delfunction! s:isModuleInfoDeclarationCurrentBuffer
+let b:spell_options="contained"
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/javacc.vim b/runtime/syntax/javacc.vim
new file mode 100644
index 0000000..a80572d
--- /dev/null
+++ b/runtime/syntax/javacc.vim
@@ -0,0 +1,65 @@
+" Vim syntax file
+" Language: JavaCC, a Java Compiler Compiler written by JavaSoft
+" Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" URL: http://www.fleiner.com/vim/syntax/javacc.vim
+" Last Change: 2012 Oct 05
+
+" Uses java.vim, and adds a few special things for JavaCC Parser files.
+" Those files usually have the extension *.jj
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" source the java.vim file
+runtime! syntax/java.vim
+unlet b:current_syntax
+
+"remove catching errors caused by wrong parenthesis (does not work in javacc
+"files) (first define them in case they have not been defined in java)
+syn match javaParen "--"
+syn match javaParenError "--"
+syn match javaInParen "--"
+syn match javaError2 "--"
+syn clear javaParen
+syn clear javaParenError
+syn clear javaInParen
+syn clear javaError2
+
+" remove function definitions (they look different) (first define in
+" in case it was not defined in java.vim)
+"syn match javaFuncDef "--"
+syn clear javaFuncDef
+syn match javaFuncDef "[$_a-zA-Z][$_a-zA-Z0-9_. \[\]]*([^-+*/()]*)[ \t]*:" contains=javaType
+
+syn keyword javaccPackages options DEBUG_PARSER DEBUG_LOOKAHEAD DEBUG_TOKEN_MANAGER
+syn keyword javaccPackages COMMON_TOKEN_ACTION IGNORE_CASE CHOICE_AMBIGUITY_CHECK
+syn keyword javaccPackages OTHER_AMBIGUITY_CHECK STATIC LOOKAHEAD ERROR_REPORTING
+syn keyword javaccPackages USER_TOKEN_MANAGER USER_CHAR_STREAM JAVA_UNICODE_ESCAPE
+syn keyword javaccPackages UNICODE_INPUT JDK_VERSION
+syn match javaccPackages "PARSER_END([^)]*)"
+syn match javaccPackages "PARSER_BEGIN([^)]*)"
+syn match javaccSpecToken "<EOF>"
+" the dot is necessary as otherwise it will be matched as a keyword.
+syn match javaccSpecToken ".LOOKAHEAD("ms=s+1,me=e-1
+syn match javaccToken "<[^> \t]*>"
+syn keyword javaccActionToken TOKEN SKIP MORE SPECIAL_TOKEN
+syn keyword javaccError DEBUG IGNORE_IN_BNF
+
+" Define the default highlighting.
+" 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
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/javascript.vim b/runtime/syntax/javascript.vim
new file mode 100644
index 0000000..e513137
--- /dev/null
+++ b/runtime/syntax/javascript.vim
@@ -0,0 +1,142 @@
+" Vim syntax file
+" Language: JavaScript
+" Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" Updaters: Scott Shattuck (ss) <ss@technicalpursuit.com>
+" URL: http://www.fleiner.com/vim/syntax/javascript.vim
+" Changes: (ss) added keywords, reserved words, and other identifiers
+" (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: 2022 Jun 09
+" 2013 Jun 12: adjusted javaScriptRegexpString (Kevin Locke)
+" 2018 Apr 14: adjusted javaScriptRegexpString (LongJohnCoder)
+
+" tuning parameters:
+" unlet javaScript_fold
+
+if !exists("main_syntax")
+ " quit when a syntax file was already loaded
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'javascript'
+elseif exists("b:current_syntax") && b:current_syntax == "javascript"
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+
+syn keyword javaScriptCommentTodo TODO FIXME XXX TBD contained
+syn match javaScriptLineComment "\/\/.*" contains=@Spell,javaScriptCommentTodo
+syn match javaScriptCommentSkip "^[ \t]*\*\($\|[ \t]\+\)"
+syn region javaScriptComment start="/\*" end="\*/" contains=@Spell,javaScriptCommentTodo
+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
+
+" number handling by Christopher Leonard chris.j.leonard@gmx.com
+syn match javaScriptSpecialCharacter "'\\.'"
+syn match javaScriptNumber "\<0[bB][0-1]\+\(_[0-1]\+\)*\>"
+syn match javaScriptNumber "\<0[oO][0-7]\+\(_[0-7]\+\)*\>"
+syn match javaScriptNumber "\<0\([0-7]\+\(_[0-7]\+\)*\)\?\>"
+syn match javaScriptNumber "\<0[xX][0-9a-fA-F]\+\(_[0-9a-fA-F]\+\)*\>"
+syn match javaScriptNumber "\<\d\+\(_\d\+\)*[eE][+-]\?\d\+\>"
+syn match javaScriptNumber "\<[1-9]\d*\(_\d\+\)*\(\.\(\d\+\(_\d\+\)*\([eE][+-]\?\d\+\)\?\)\?\)\?\>"
+syn match javaScriptNumber "\<\(\d\+\(_\d\+\)*\)\?\.\d\+\(_\d\+\)*\([eE][+-]\?\d\+\)\?\>"
+syn match javaScriptNumber "\<\d\+\(_\d\+\)*\.\(\d\+\(_\d\+\)*\([eE][+-]\?\d\+\)\?\)\?\>"
+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
+syn keyword javaScriptBranch break continue
+syn keyword javaScriptOperator new delete instanceof typeof
+syn keyword javaScriptType Array Boolean Date Function Number Object String RegExp
+syn keyword javaScriptStatement return with await
+syn keyword javaScriptBoolean true false
+syn keyword javaScriptNull null undefined
+syn keyword javaScriptIdentifier arguments this var let
+syn keyword javaScriptLabel case default
+syn keyword javaScriptException try catch finally throw
+syn keyword javaScriptMessage alert confirm prompt status
+syn keyword javaScriptGlobal self window top parent
+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 async
+
+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
+
+ syn sync match javaScriptSync grouphere javaScriptFunctionFold "\<function\>"
+ syn sync match javaScriptSync grouphere NONE "^}"
+
+ setlocal foldmethod=syntax
+ setlocal foldtext=getline(v:foldstart)
+else
+ syn keyword javaScriptFunction function
+ syn match javaScriptBraces "[{}\[\]]"
+ syn match javaScriptParens "[()]"
+endif
+
+if main_syntax == "javascript"
+ syn sync fromstart
+ syn sync maxlines=100
+
+ syn sync ccomment javaScriptComment
+endif
+
+" Define the default highlighting.
+" 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'
+ unlet main_syntax
+endif
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/javascriptreact.vim b/runtime/syntax/javascriptreact.vim
new file mode 100644
index 0000000..0067a0b
--- /dev/null
+++ b/runtime/syntax/javascriptreact.vim
@@ -0,0 +1,3 @@
+" Placeholder for backwards compatilibity: .jsx used to be associated with the
+" filetpye JavaScript.
+runtime! syntax/javascript.vim
diff --git a/runtime/syntax/jess.vim b/runtime/syntax/jess.vim
new file mode 100644
index 0000000..67d3715
--- /dev/null
+++ b/runtime/syntax/jess.vim
@@ -0,0 +1,144 @@
+" Vim syntax file
+" Language: Jess
+" Maintainer: Paul Baleme <pbaleme@mail.com>
+" Last change: September 14, 2000
+" Based on lisp.vim by : Dr. Charles E. Campbell, Jr.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=42,43,45,47-58,60-62,64-90,97-122,_
+
+" Lists
+syn match jessSymbol ![^()'`,"; \t]\+! contained
+syn match jessBarSymbol !|..\{-}|! contained
+syn region jessList matchgroup=Delimiter start="(" skip="|.\{-}|" matchgroup=Delimiter end=")" contains=jessAtom,jessBQList,jessConcat,jessDeclaration,jessList,jessNumber,jessSymbol,jessSpecial,jessFunc,jessKey,jessAtomMark,jessString,jessComment,jessBarSymbol,jessAtomBarSymbol,jessVar
+syn region jessBQList matchgroup=PreProc start="`(" skip="|.\{-}|" matchgroup=PreProc end=")" contains=jessAtom,jessBQList,jessConcat,jessDeclaration,jessList,jessNumber,jessSpecial,jessSymbol,jessFunc,jessKey,jessVar,jessAtomMark,jessString,jessComment,jessBarSymbol,jessAtomBarSymbol
+
+" Atoms
+syn match jessAtomMark "'"
+syn match jessAtom "'("me=e-1 contains=jessAtomMark nextgroup=jessAtomList
+syn match jessAtom "'[^ \t()]\+" contains=jessAtomMark
+syn match jessAtomBarSymbol !'|..\{-}|! contains=jessAtomMark
+syn region jessAtom start=+'"+ skip=+\\"+ end=+"+
+syn region jessAtomList matchgroup=Special start="(" skip="|.\{-}|" matchgroup=Special end=")" contained contains=jessAtomList,jessAtomNmbr0,jessString,jessComment,jessAtomBarSymbol
+syn match jessAtomNmbr "\<[0-9]\+" contained
+
+" Standard jess Functions and Macros
+syn keyword jessFunc * + ** - / < > <= >= <> =
+syn keyword jessFunc long longp
+syn keyword jessFunc abs agenda and
+syn keyword jessFunc assert assert-string bag
+syn keyword jessFunc batch bind bit-and
+syn keyword jessFunc bit-not bit-or bload
+syn keyword jessFunc bsave build call
+syn keyword jessFunc clear clear-storage close
+syn keyword jessFunc complement$ context count-query-results
+syn keyword jessFunc create$
+syn keyword jessFunc delete$ div
+syn keyword jessFunc do-backward-chaining e
+syn keyword jessFunc engine eq eq*
+syn keyword jessFunc eval evenp exit
+syn keyword jessFunc exp explode$ external-addressp
+syn keyword jessFunc fact-slot-value facts fetch
+syn keyword jessFunc first$ float floatp
+syn keyword jessFunc foreach format gensym*
+syn keyword jessFunc get get-fact-duplication
+syn keyword jessFunc get-member get-multithreaded-io
+syn keyword jessFunc get-reset-globals get-salience-evaluation
+syn keyword jessFunc halt if implode$
+syn keyword jessFunc import insert$ integer
+syn keyword jessFunc integerp intersection$ jess-version-number
+syn keyword jessFunc jess-version-string length$
+syn keyword jessFunc lexemep list-function$ load-facts
+syn keyword jessFunc load-function load-package log
+syn keyword jessFunc log10 lowcase matches
+syn keyword jessFunc max member$ min
+syn keyword jessFunc mod modify multifieldp
+syn keyword jessFunc neq new not
+syn keyword jessFunc nth$ numberp oddp
+syn keyword jessFunc open or pi
+syn keyword jessFunc ppdeffunction ppdefglobal ddpefrule
+syn keyword jessFunc printout random read
+syn keyword jessFunc readline replace$ reset
+syn keyword jessFunc rest$ retract retract-string
+syn keyword jessFunc return round rules
+syn keyword jessFunc run run-query run-until-halt
+syn keyword jessFunc save-facts set set-fact-duplication
+syn keyword jessFunc set-factory set-member set-multithreaded-io
+syn keyword jessFunc set-node-index-hash set-reset-globals
+syn keyword jessFunc set-salience-evaluation set-strategy
+syn keyword jessFunc setgen show-deffacts show-deftemplates
+syn keyword jessFunc show-jess-listeners socket
+syn keyword jessFunc sqrt store str-cat
+syn keyword jessFunc str-compare str-index str-length
+syn keyword jessFunc stringp sub-string subseq$
+syn keyword jessFunc subsetp sym-cat symbolp
+syn keyword jessFunc system throw time
+syn keyword jessFunc try undefadvice undefinstance
+syn keyword jessFunc undefrule union$ unwatch
+syn keyword jessFunc upcase view watch
+syn keyword jessFunc while
+syn match jessFunc "\<c[ad]\+r\>"
+
+" jess Keywords (modifiers)
+syn keyword jessKey defglobal deffunction defrule
+syn keyword jessKey deffacts
+syn keyword jessKey defadvice defclass definstance
+
+" Standard jess Variables
+syn region jessVar start="?" end="[^a-zA-Z0-9]"me=e-1
+
+" Strings
+syn region jessString start=+"+ skip=+\\"+ end=+"+
+
+" Shared with Declarations, Macros, Functions
+"syn keyword jessDeclaration
+
+syn match jessNumber "[0-9]\+"
+
+syn match jessSpecial "\*[a-zA-Z_][a-zA-Z_0-9-]*\*"
+syn match jessSpecial !#|[^()'`,"; \t]\+|#!
+syn match jessSpecial !#x[0-9a-fA-F]\+!
+syn match jessSpecial !#o[0-7]\+!
+syn match jessSpecial !#b[01]\+!
+syn match jessSpecial !#\\[ -\~]!
+syn match jessSpecial !#[':][^()'`,"; \t]\+!
+syn match jessSpecial !#([^()'`,"; \t]\+)!
+
+syn match jessConcat "\s\.\s"
+syntax match jessParenError ")"
+
+" Comments
+syn match jessComment ";.*$"
+
+" synchronization
+syn sync lines=100
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=18
diff --git a/runtime/syntax/jgraph.vim b/runtime/syntax/jgraph.vim
new file mode 100644
index 0000000..a29a21a
--- /dev/null
+++ b/runtime/syntax/jgraph.vim
@@ -0,0 +1,45 @@
+" Vim syntax file
+" Language: jgraph (graph plotting utility)
+" Maintainer: Jonas Munsin jmunsin@iki.fi
+" Last Change: 2003 May 04
+" this syntax file is not yet complete
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" comments
+syn region jgraphComment start="(\* " end=" \*)"
+
+syn keyword jgraphCmd newcurve newgraph marktype
+syn keyword jgraphType xaxis yaxis
+
+syn keyword jgraphType circle box diamond triangle x cross ellipse
+syn keyword jgraphType xbar ybar text postscript eps none general
+
+syn keyword jgraphType solid dotted dashed longdash dotdash dodotdash
+syn keyword jgraphType dotdotdashdash pts
+
+"integer number, or floating point number without a dot. - or no -
+syn match jgraphNumber "\<-\=\d\+\>"
+"floating point number, with dot - or no -
+syn match jgraphNumber "\<-\=\d\+\.\d*\>"
+"floating point number, starting with a dot - or no -
+syn match jgraphNumber "\-\=\.\d\+\>"
+
+
+" Define the default highlighting.
+" 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/jovial.vim b/runtime/syntax/jovial.vim
new file mode 100644
index 0000000..7c63841
--- /dev/null
+++ b/runtime/syntax/jovial.vim
@@ -0,0 +1,110 @@
+" Vim syntax file
+" Language: JOVIAL J73
+" Version: 1.2
+" Maintainer: Paul McGinnis <paulmcg@aol.com>
+" Last Change: 2011/06/17
+" Remark: Based on MIL-STD-1589C for JOVIAL J73 language
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn keyword jovialTodo TODO FIXME XXX contained
+
+" JOVIAL beads - first digit is number of bits, [0-9A-V] is the bit value
+" representing 0-31 (for 5 bits on the bead)
+syn match jovialBitConstant "[1-5]B'[0-9A-V]'"
+
+syn match jovialNumber "\<\d\+\>"
+
+syn match jovialFloat "\d\+E[-+]\=\d\+"
+syn match jovialFloat "\d\+\.\d*\(E[-+]\=\d\+\)\="
+syn match jovialFloat "\.\d\+\(E[-+]\=\d\+\)\="
+
+syn region jovialComment start=/"/ end=/"/ contains=jovialTodo
+syn region jovialComment start=/%/ end=/%/ contains=jovialTodo
+
+" JOVIAL variable names. This rule is to prevent conflicts with strings.
+" Handle special case where ' character can be part of a JOVIAL variable name.
+syn match jovialIdentifier "[A-Z\$][A-Z0-9'\$]\+"
+
+syn region jovialString start="\s*'" skip=/''/ end=/'/ oneline
+
+" JOVIAL compiler directives -- see Section 9 in MIL-STD-1589C
+syn region jovialPreProc start="\s*![A-Z]\+" end=/;/
+
+syn keyword jovialOperator AND OR NOT XOR EQV MOD
+
+" See Section 2.1 in MIL-STD-1589C for data types
+syn keyword jovialType ITEM B C P V
+syn match jovialType "\<S\(,R\|,T\|,Z\)\=\>"
+syn match jovialType "\<U\(,R\|,T\|,Z\)\=\>"
+syn match jovialType "\<F\(,R\|,T\|,Z\)\=\>"
+syn match jovialType "\<A\(,R\|,T\|,Z\)\=\>"
+
+syn keyword jovialStorageClass STATIC CONSTANT PARALLEL BLOCK N M D W
+
+syn keyword jovialStructure TABLE STATUS
+
+syn keyword jovialConstant NULL
+
+syn keyword jovialBoolean FALSE TRUE
+
+syn keyword jovialTypedef TYPE
+
+syn keyword jovialStatement ABORT BEGIN BY BYREF BYRES BYVAL CASE COMPOOL
+syn keyword jovialStatement DEF DEFAULT DEFINE ELSE END EXIT FALLTHRU FOR
+syn keyword jovialStatement GOTO IF INLINE INSTANCE LABEL LIKE OVERLAY POS
+syn keyword jovialStatement PROC PROGRAM REC REF RENT REP RETURN START STOP
+syn keyword jovialStatement TERM THEN WHILE
+
+" JOVIAL extensions, see section 8.2.2 in MIL-STD-1589C
+syn keyword jovialStatement CONDITION ENCAPSULATION EXPORTS FREE HANDLER IN INTERRUPT NEW
+syn keyword jovialStatement PROTECTED READONLY REGISTER SIGNAL TO UPDATE WITH WRITEONLY ZONE
+
+" implementation specific constants and functions, see section 1.4 in MIL-STD-1589C
+syn keyword jovialConstant BITSINBYTE BITSINWORD LOCSINWORD
+syn keyword jovialConstant BYTESINWORD BITSINPOINTER INTPRECISION
+syn keyword jovialConstant FLOATPRECISION FIXEDPRECISION FLOATRADIX
+syn keyword jovialConstant MAXFLOATPRECISION MAXFIXEDPRECISION
+syn keyword jovialConstant MAXINTSIZE MAXBYTES MAXBITS
+syn keyword jovialConstant MAXTABLESIZE MAXSTOP MINSTOP MAXSIGDIGITS
+syn keyword jovialFunction BYTEPOS MAXINT MININT
+syn keyword jovialFunction IMPLFLOATPRECISION IMPLFIXEDPRECISION IMPLINTSIZE
+syn keyword jovialFunction MINSIZE MINFRACTION MINSCALE MINRELPRECISION
+syn keyword jovialFunction MAXFLOAT MINFLOAT FLOATRELPRECISION
+syn keyword jovialFunction FLOATUNDERFLOW MAXFIXED MINFIXED
+
+" JOVIAL built-in functions
+syn keyword jovialFunction LOC NEXT BIT BYTE SHIFTL SHIFTR ABS SGN BITSIZE
+syn keyword jovialFunction BYTESIZE WORDSIZE LBOUND UBOUND NWDSEN FIRST
+syn keyword jovialFunction LAST NENT
+
+" Define the default highlighting.
+hi def link jovialBitConstant Number
+hi def link jovialBoolean Boolean
+hi def link jovialComment Comment
+hi def link jovialConstant Constant
+hi def link jovialFloat Float
+hi def link jovialFunction Function
+" No color highlighting for JOVIAL identifiers. See above,
+" this is to prevent confusion with JOVIAL strings
+"hi def link jovialIdentifier Identifier
+hi def link jovialNumber Number
+hi def link jovialOperator Operator
+hi def link jovialPreProc PreProc
+hi def link jovialStatement Statement
+hi def link jovialStorageClass StorageClass
+hi def link jovialString String
+hi def link jovialStructure Structure
+hi def link jovialTodo Todo
+hi def link jovialType Type
+hi def link jovialTypedef Typedef
+
+
+let b:current_syntax = "jovial"
+
+" vim: ts=8
diff --git a/runtime/syntax/jproperties.vim b/runtime/syntax/jproperties.vim
new file mode 100644
index 0000000..628c030
--- /dev/null
+++ b/runtime/syntax/jproperties.vim
@@ -0,0 +1,135 @@
+" Vim syntax file
+" Language: Java Properties resource file (*.properties[_*])
+" Maintainer: Simon Baldwin <simonb@sco.com>
+" Last change: 26th Mar 2000
+
+" =============================================================================
+
+" Optional and tuning variables:
+
+" jproperties_lines
+" -----------------
+" Set a value for the sync block that we use to find long continuation lines
+" in properties; the value is already large - if you have larger continuation
+" sets you may need to increase it further - if not, and you find editing is
+" slow, reduce the value of jproperties_lines.
+if !exists("jproperties_lines")
+ let jproperties_lines = 256
+endif
+
+" jproperties_strict_syntax
+" -------------------------
+" Most properties files assign values with "id=value" or "id:value". But,
+" strictly, the Java properties parser also allows "id value", "id", and
+" even more bizarrely "=value", ":value", " value", and so on. These latter
+" ones, however, are rarely used, if ever, and handling them in the high-
+" lighting can obscure errors in the more normal forms. So, in practice
+" we take special efforts to pick out only "id=value" and "id:value" forms
+" by default. If you want strict compliance, set jproperties_strict_syntax
+" to non-zero (and good luck).
+if !exists("jproperties_strict_syntax")
+ let jproperties_strict_syntax = 0
+endif
+
+" jproperties_show_messages
+" -------------------------
+" If this properties file contains messages for use with MessageFormat,
+" setting a non-zero value will highlight them. Messages are of the form
+" "{...}". Highlighting doesn't go to the pains of picking apart what is
+" in the format itself - just the basics for now.
+if !exists("jproperties_show_messages")
+ let jproperties_show_messages = 0
+endif
+
+" =============================================================================
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" switch case sensitivity off
+syn case ignore
+
+" set the block
+exec "syn sync lines=" . jproperties_lines
+
+" switch between 'normal' and 'strict' syntax
+if jproperties_strict_syntax != 0
+
+ " an assignment is pretty much any non-empty line at this point,
+ " trying to not think about continuation lines
+ syn match jpropertiesAssignment "^\s*[^[:space:]]\+.*$" contains=jpropertiesIdentifier
+
+ " an identifier is anything not a space character, pretty much; it's
+ " followed by = or :, or space or tab. Or end-of-line.
+ syn match jpropertiesIdentifier "[^=:[:space:]]*" contained nextgroup=jpropertiesDelimiter
+
+ " treat the delimiter specially to get colours right
+ syn match jpropertiesDelimiter "\s*[=:[:space:]]\s*" contained nextgroup=jpropertiesString
+
+ " catch the bizarre case of no identifier; a special case of delimiter
+ syn match jpropertiesEmptyIdentifier "^\s*[=:]\s*" nextgroup=jpropertiesString
+else
+
+ " here an assignment is id=value or id:value, and we conveniently
+ " ignore continuation lines for the present
+ syn match jpropertiesAssignment "^\s*[^=:[:space:]]\+\s*[=:].*$" contains=jpropertiesIdentifier
+
+ " an identifier is anything not a space character, pretty much; it's
+ " always followed by = or :, and we find it in an assignment
+ syn match jpropertiesIdentifier "[^=:[:space:]]\+" contained nextgroup=jpropertiesDelimiter
+
+ " treat the delimiter specially to get colours right; this time the
+ " delimiter must contain = or :
+ syn match jpropertiesDelimiter "\s*[=:]\s*" contained nextgroup=jpropertiesString
+endif
+
+" a definition is all up to the last non-\-terminated line; strictly, Java
+" properties tend to ignore leading whitespace on all lines of a multi-line
+" definition, but we don't look for that here (because it's a major hassle)
+syn region jpropertiesString start="" skip="\\$" end="$" contained contains=jpropertiesSpecialChar,jpropertiesError,jpropertiesSpecial
+
+" {...} is a Java Message formatter - add a minimal recognition of these
+" if required
+if jproperties_show_messages != 0
+ syn match jpropertiesSpecial "{[^}]*}\{-1,\}" contained
+ syn match jpropertiesSpecial "'{" contained
+ syn match jpropertiesSpecial "''" contained
+endif
+
+" \uABCD are unicode special characters
+syn match jpropertiesSpecialChar "\\u\x\{1,4}" contained
+
+" ...and \u not followed by a hex digit is an error, though the properties
+" file parser won't issue an error on it, just set something wacky like zero
+syn match jpropertiesError "\\u\X\{1,4}" contained
+syn match jpropertiesError "\\u$"me=e-1 contained
+
+" other things of note are the \t,r,n,\, and the \ preceding line end
+syn match jpropertiesSpecial "\\[trn\\]" contained
+syn match jpropertiesSpecial "\\\s" contained
+syn match jpropertiesSpecial "\\$" contained
+
+" comments begin with # or !, and persist to end of line; put here since
+" they may have been caught by patterns above us
+syn match jpropertiesComment "^\s*[#!].*$" contains=jpropertiesTODO
+syn keyword jpropertiesTodo TODO FIXME XXX contained
+
+" Define the default highlighting.
+" 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"
+
+" vim:ts=8
diff --git a/runtime/syntax/json.vim b/runtime/syntax/json.vim
new file mode 100644
index 0000000..3f49b0c
--- /dev/null
+++ b/runtime/syntax/json.vim
@@ -0,0 +1,136 @@
+" Vim syntax file
+" Language: JSON
+" Maintainer: vacancy
+" Previous Maintainer: Eli Parra <eli@elzr.com>
+" Last Change: 2019 Sep 17
+" Version: 0.12
+
+if !exists("main_syntax")
+ " quit when a syntax file was already loaded
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'json'
+endif
+
+syntax match jsonNoise /\%(:\|,\)/
+
+" NOTE that for the concealing to work your conceallevel should be set to 2
+
+" Syntax: JSON Keywords
+" Separated into a match and region because a region by itself is always greedy
+syn match jsonKeywordMatch /"\([^"]\|\\\"\)\+"[[:blank:]\r\n]*\:/ contains=jsonKeyword
+if has('conceal') && (!exists("g:vim_json_conceal") || g:vim_json_conceal==1)
+ syn region jsonKeyword matchgroup=jsonQuote start=/"/ end=/"\ze[[:blank:]\r\n]*\:/ concealends contained
+else
+ syn region jsonKeyword matchgroup=jsonQuote start=/"/ end=/"\ze[[:blank:]\r\n]*\:/ contained
+endif
+
+" Syntax: Strings
+" Separated into a match and region because a region by itself is always greedy
+" Needs to come after keywords or else a json encoded string will break the
+" syntax
+syn match jsonStringMatch /"\([^"]\|\\\"\)\+"\ze[[:blank:]\r\n]*[,}\]]/ contains=jsonString
+if has('conceal') && (!exists("g:vim_json_conceal") || g:vim_json_conceal==1)
+ syn region jsonString oneline matchgroup=jsonQuote start=/"/ skip=/\\\\\|\\"/ end=/"/ concealends contains=jsonEscape contained
+else
+ syn region jsonString oneline matchgroup=jsonQuote start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=jsonEscape contained
+endif
+
+" Syntax: JSON does not allow strings with single quotes, unlike JavaScript.
+syn region jsonStringSQError oneline start=+'+ skip=+\\\\\|\\"+ end=+'+
+
+
+" Syntax: Escape sequences
+syn match jsonEscape "\\["\\/bfnrt]" contained
+syn match jsonEscape "\\u\x\{4}" contained
+
+" Syntax: Numbers
+syn match jsonNumber "-\=\<\%(0\|[1-9]\d*\)\%(\.\d\+\)\=\%([eE][-+]\=\d\+\)\=\>\ze[[:blank:]\r\n]*[,}\]]"
+
+" ERROR WARNINGS **********************************************
+if (!exists("g:vim_json_warnings") || g:vim_json_warnings==1)
+ " Syntax: Strings should always be enclosed with quotes.
+ syn match jsonNoQuotesError "\<[[:alpha:]][[:alnum:]]*\>"
+ syn match jsonTripleQuotesError /"""/
+
+ " Syntax: An integer part of 0 followed by other digits is not allowed.
+ syn match jsonNumError "-\=\<0\d\.\d*\>"
+
+ " Syntax: Decimals smaller than one should begin with 0 (so .1 should be 0.1).
+ syn match jsonNumError "\:\@<=[[:blank:]\r\n]*\zs\.\d\+"
+
+ " Syntax: No comments in JSON, see http://stackoverflow.com/questions/244777/can-i-comment-a-json-file
+ syn match jsonCommentError "//.*"
+ syn match jsonCommentError "\(/\*\)\|\(\*/\)"
+
+ " Syntax: No semicolons in JSON
+ syn match jsonSemicolonError ";"
+
+ " Syntax: No trailing comma after the last element of arrays or objects
+ syn match jsonTrailingCommaError ",\_s*[}\]]"
+
+ " Syntax: Watch out for missing commas between elements
+ syn match jsonMissingCommaError /\("\|\]\|\d\)\zs\_s\+\ze"/
+ syn match jsonMissingCommaError /\(\]\|\}\)\_s\+\ze"/ "arrays/objects as values
+ syn match jsonMissingCommaError /}\_s\+\ze{/ "objects as elements in an array
+ syn match jsonMissingCommaError /\(true\|false\)\_s\+\ze"/ "true/false as value
+endif
+
+" ********************************************** END OF ERROR WARNINGS
+" Allowances for JSONP: function call at the beginning of the file,
+" parenthesis and semicolon at the end.
+" Function name validation based on
+" http://stackoverflow.com/questions/2008279/validate-a-javascript-function-name/2008444#2008444
+syn match jsonPadding "\%^[[:blank:]\r\n]*[_$[:alpha:]][_$[:alnum:]]*[[:blank:]\r\n]*("
+syn match jsonPadding ");[[:blank:]\r\n]*\%$"
+
+" Syntax: Boolean
+syn match jsonBoolean /\(true\|false\)\(\_s\+\ze"\)\@!/
+
+" Syntax: Null
+syn keyword jsonNull null
+
+" Syntax: Braces
+syn region jsonFold matchgroup=jsonBraces start="{" end=/}\(\_s\+\ze\("\|{\)\)\@!/ transparent fold
+syn region jsonFold matchgroup=jsonBraces start="\[" end=/]\(\_s\+\ze"\)\@!/ transparent fold
+
+" Define the default highlighting.
+" 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'
+ unlet main_syntax
+endif
+
+" Vim settings
+" vim: ts=8 fdm=marker
+
+" MIT License
+" Copyright (c) 2013, Jeroen Ruigrok van der Werven, Eli Parra
+"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.
+"See https://twitter.com/elzr/status/294964017926119424
diff --git a/runtime/syntax/jsonc.vim b/runtime/syntax/jsonc.vim
new file mode 100644
index 0000000..d0df16b
--- /dev/null
+++ b/runtime/syntax/jsonc.vim
@@ -0,0 +1,44 @@
+" Vim syntax file
+" Language: JSONC (JSON with Comments)
+" Original Author: Izhak Jakov <izhak724@gmail.com>
+" Acknowledgement: Based off of vim-jsonc maintained by Kevin Locke <kevin@kevinlocke.name>
+" https://github.com/kevinoid/vim-jsonc
+" License: MIT
+" Last Change: 2021-07-01
+
+" Ensure syntax is loaded once, unless nested inside another (main) syntax
+" For description of main_syntax, see https://stackoverflow.com/q/16164549
+if !exists('g:main_syntax')
+ if exists('b:current_syntax') && b:current_syntax ==# 'jsonc'
+ finish
+ endif
+ let g:main_syntax = 'jsonc'
+endif
+
+" Based on vim-json syntax
+runtime! syntax/json.vim
+
+" Remove syntax group for comments treated as errors
+if !exists("g:vim_json_warnings") || g:vim_json_warnings
+ syn clear jsonCommentError
+endif
+
+syn match jsonStringMatch /"\([^"]\|\\\"\)\+"\ze\(\_s*\/\/.*\_s*\)*[}\]]/ contains=jsonString
+syn match jsonStringMatch /"\([^"]\|\\\"\)\+"\ze\_s*\/\*\_.*\*\/\_s*[}\]]/ contains=jsonString
+syn match jsonTrailingCommaError /\(,\)\+\ze\(\_s*\/\/.*\_s*\)*[}\]]/
+syn match jsonTrailingCommaError /\(,\)\+\ze\_s*\/\*\_.*\*\/\_s*[}\]]/
+
+" Define syntax matching comments and their contents
+syn keyword jsonCommentTodo FIXME NOTE TBD TODO XXX
+syn region jsonLineComment start=+\/\/+ end=+$+ contains=@Spell,jsonCommentTodo keepend
+syn region jsonComment start='/\*' end='\*/' contains=@Spell,jsonCommentTodo fold
+
+" Link comment syntax comment to highlighting
+hi! def link jsonLineComment Comment
+hi! def link jsonComment Comment
+
+" Set/Unset syntax to avoid duplicate inclusion and correctly handle nesting
+let b:current_syntax = 'jsonc'
+if g:main_syntax ==# 'jsonc'
+ unlet g:main_syntax
+endif
diff --git a/runtime/syntax/jsp.vim b/runtime/syntax/jsp.vim
new file mode 100644
index 0000000..1c3cc35
--- /dev/null
+++ b/runtime/syntax/jsp.vim
@@ -0,0 +1,68 @@
+" Vim syntax file
+" Language: JSP (Java Server Pages)
+" Maintainer: Rafael Garcia-Suarez <rgarciasuarez@free.fr>
+" URL: http://rgarciasuarez.free.fr/vim/syntax/jsp.vim
+" Last change: 2004 Feb 02
+" Credits : Patch by Darren Greaves (recognizes <jsp:...> tags)
+" Patch by Thomas Kimpton (recognizes jspExpr inside HTML tags)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'jsp'
+endif
+
+" Source HTML syntax
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+" Next syntax items are case-sensitive
+syn case match
+
+" Include Java syntax
+syn include @jspJava syntax/java.vim
+
+syn region jspScriptlet matchgroup=jspTag start=/<%/ keepend end=/%>/ contains=@jspJava
+syn region jspComment start=/<%--/ end=/--%>/
+syn region jspDecl matchgroup=jspTag start=/<%!/ keepend end=/%>/ contains=@jspJava
+syn region jspExpr matchgroup=jspTag start=/<%=/ keepend end=/%>/ contains=@jspJava
+syn region jspDirective start=/<%@/ end=/%>/ contains=htmlString,jspDirName,jspDirArg
+
+syn keyword jspDirName contained include page taglib
+syn keyword jspDirArg contained file uri prefix language extends import session buffer autoFlush
+syn keyword jspDirArg contained isThreadSafe info errorPage contentType isErrorPage
+syn region jspCommand start=/<jsp:/ start=/<\/jsp:/ keepend end=/>/ end=/\/>/ contains=htmlString,jspCommandName,jspCommandArg
+syn keyword jspCommandName contained include forward getProperty plugin setProperty useBean param params fallback
+syn keyword jspCommandArg contained id scope class type beanName page flush name value property
+syn keyword jspCommandArg contained code codebase name archive align height
+syn keyword jspCommandArg contained width hspace vspace jreversion nspluginurl iepluginurl
+
+" Redefine htmlTag so that it can contain jspExpr
+syn clear htmlTag
+syn region htmlTag start=+<[^/%]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition,@htmlPreproc,@htmlArgCluster,jspExpr,javaScript
+
+" Define the default highlighting.
+" 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
+endif
+
+let b:current_syntax = "jsp"
+
+" vim: ts=8
diff --git a/runtime/syntax/julia.vim b/runtime/syntax/julia.vim
new file mode 100644
index 0000000..ec7eabf
--- /dev/null
+++ b/runtime/syntax/julia.vim
@@ -0,0 +1,550 @@
+" Vim syntax file
+" Language: julia
+" Maintainer: Carlo Baldassi <carlobaldassi@gmail.com>
+" Homepage: https://github.com/JuliaEditorSupport/julia-vim
+" Last Change: 2021 Aug 04
+
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if version < 704
+ " this is used to disable regex syntax like `\@3<='
+ " on older vim versions
+ function! s:d(x)
+ return ''
+ endfunction
+else
+ function! s:d(x)
+ return string(a:x)
+ endfunction
+endif
+
+scriptencoding utf-8
+
+let s:julia_spellcheck_strings = get(g:, "julia_spellcheck_strings", 0)
+let s:julia_spellcheck_docstrings = get(g:, "julia_spellcheck_docstrings", 1)
+let s:julia_spellcheck_comments = get(g:, "julia_spellcheck_comments", 1)
+
+let s:julia_highlight_operators = get(g:, "julia_highlight_operators", 1)
+
+" List of characters, up to \UFF, which cannot be used in identifiers.
+" (It includes operator characters; we don't consider them identifiers.)
+" This is used mostly in lookbehinds with `\@<=`, e.g. when we need to check
+" that that we're not in the middle of an identifier.
+" It doesn't include a few characters (spaces and all closing parentheses)
+" because those may or may not be valid in the lookbehind on a case-by-case
+" basis.
+let s:nonid_chars = '\U00-\U08' . '\U0A-\U1F'
+ \ . '\U21-\U28' . '\U2A-\U2F' . '\U3A-\U40' . '\U5B-\U5E' . '\U60' . '\U7B\U7C'
+ \ . '\U7E-\UA1' . '\UA7\UA8' . '\UAB-\UAD' . '\UAF\UB1\UB4' . '\UB6-\UB8' . '\UBB\UBF' . '\UD7\UF7'
+
+" The complete list
+let s:nonidS_chars = '[:space:])\U5D}' . s:nonid_chars
+
+
+" List of all valid operator chars up to \UFF (NOTE: they must all be included
+" in s:nonidS_chars, so that if we include that, then this is redundant)
+" It does not include '!' since it can be used in an identifier.
+" The list contains the following characters: '%&*+-/<=>\\^|~¬±×÷'
+let s:op_chars = '\U25\U26\U2A\U2B\U2D\U2F\U3C-\U3E\U5C\U5E\U7C\U7E\UAC\UB1\UD7\UF7'
+
+" List of all valid operator chars above \UFF
+" Written with ranges for performance reasons
+" The list contains the following characters: '…⁝⅋←↑→↓↔↚↛↜↝↞↠↢↣↤↦↩↪↫↬↮↶↷↺↻↼↽⇀⇁⇄⇆⇇⇉⇋⇌⇍⇎⇏⇐⇒⇔⇚⇛⇜⇝⇠⇢⇴⇵⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿∈∉∊∋∌∍∓∔∗∘∙√∛∜∝∤∥∦∧∨∩∪∷∸∺∻∽∾≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊞⊟⊠⊡⊢⊣⊩⊬⊮⊰⊱⊲⊳⊴⊵⊶⊷⊻⊼⊽⋄⋅⋆⋇⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌿▷⟂⟈⟉⟑⟒⟕⟖⟗⟰⟱⟵⟶⟷⟹⟺⟻⟼⟽⟾⟿⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓⤔⤕⤖⤗⤘⤝⤞⤟⤠⥄⥅⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝⥞⥟⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩⥪⥫⥬⥭⥮⥯⥰⦷⦸⦼⦾⦿⧀⧁⧡⧣⧤⧥⧴⧶⧷⧺⧻⨇⨈⨝⨟⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨰⨱⨲⨳⨴⨵⨶⨷⨸⨹⨺⨻⨼⨽⩀⩁⩂⩃⩄⩅⩊⩋⩌⩍⩎⩏⩐⩑⩒⩓⩔⩕⩖⩗⩘⩚⩛⩜⩝⩞⩟⩠⩡⩢⩣⩦⩧⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫛⫷⫸⫹⫺⬰⬱⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭇⭈⭉⭊⭋⭌←↑→↓'
+let s:op_chars_wc = '\U2026\U205D\U214B\U2190-\U2194\U219A-\U219E\U21A0\U21A2-\U21A4\U21A6\U21A9-\U21AC\U21AE\U21B6\U21B7\U21BA-\U21BD\U21C0\U21C1\U21C4\U21C6\U21C7\U21C9\U21CB-\U21D0\U21D2\U21D4\U21DA-\U21DD\U21E0\U21E2\U21F4-\U21FF\U2208-\U220D\U2213\U2214\U2217-\U221D\U2224-\U222A\U2237\U2238\U223A\U223B\U223D\U223E\U2240-\U228B\U228D-\U229C\U229E-\U22A3\U22A9\U22AC\U22AE\U22B0-\U22B7\U22BB-\U22BD\U22C4-\U22C7\U22C9-\U22D3\U22D5-\U22FF\U233F\U25B7\U27C2\U27C8\U27C9\U27D1\U27D2\U27D5-\U27D7\U27F0\U27F1\U27F5-\U27F7\U27F9-\U27FF\U2900-\U2918\U291D-\U2920\U2944-\U2970\U29B7\U29B8\U29BC\U29BE-\U29C1\U29E1\U29E3-\U29E5\U29F4\U29F6\U29F7\U29FA\U29FB\U2A07\U2A08\U2A1D\U2A1F\U2A22-\U2A2E\U2A30-\U2A3D\U2A40-\U2A45\U2A4A-\U2A58\U2A5A-\U2A63\U2A66\U2A67\U2A6A-\U2AD9\U2ADB\U2AF7-\U2AFA\U2B30-\U2B44\U2B47-\U2B4C\UFFE9-\UFFEC'
+
+" Full operators regex
+let s:operators = '\%(' . '\.\%([-+*/^÷%|&⊻]\|//\|\\\|>>\|>>>\?\)\?=' .
+ \ '\|' . '[:<>]=\|||\|&&\||>\|<|\|[<>:]:\|<<\|>>>\?\|//\|[-=]>\|\.\.\.\?' .
+ \ '\|' . '\.\?[!' . s:op_chars . s:op_chars_wc . ']' .
+ \ '\)'
+
+
+" Characters that can be used to start an identifier. Above \UBF we don't
+" bother checking. (If a UTF8 operator is used, it will take precedence anyway.)
+let s:id_charsH = '\%([A-Za-z_\UA2-\UA6\UA9\UAA\UAE\UB0\UB5\UBA]\|[^\U00-\UBF]\)'
+" Characters that can appear in an identifier, starting in 2nd position. Above
+" \UBF we check for operators since we need to stop the identifier if one
+" appears. We don't check for invalid characters though.
+let s:id_charsW = '\%([0-9A-Za-z_!\UA2-\UA6\UA9\UAA\UAE-\UB0\UB2-\UB5\UB8-\UBA\UBC-\UBE]\|[^\U00-\UBF]\@=[^' . s:op_chars_wc . ']\)'
+
+" A valid julia identifier, more or less
+let s:idregex = '\%(' . s:id_charsH . s:id_charsW . '*\)'
+
+
+
+syn case match
+
+syntax cluster juliaExpressions contains=@juliaParItems,@juliaStringItems,@juliaKeywordItems,@juliaBlocksItems,@juliaTypesItems,@juliaConstItems,@juliaMacroItems,@juliaSymbolItems,@juliaOperatorItems,@juliaNumberItems,@juliaCommentItems,@juliaErrorItems,@juliaSyntaxRegions
+syntax cluster juliaExprsPrintf contains=@juliaExpressions,@juliaPrintfItems
+syntax cluster juliaExprsNodot contains=@juliaParItems,@juliaStringItems,@juliaMacroItems,@juliaSymbolItems,@juliaOperatorItems,@juliaCommentItems,juliaIdSymbol
+
+syntax cluster juliaParItems contains=juliaParBlock,juliaSqBraIdxBlock,juliaSqBraBlock,juliaCurBraBlock,juliaQuotedParBlock,juliaQuotedQMarkPar
+syntax cluster juliaKeywordItems contains=juliaKeyword,juliaWhereKeyword,juliaImportLine,juliaInfixKeyword,juliaRepKeyword
+syntax cluster juliaBlocksItems contains=juliaConditionalBlock,juliaWhileBlock,juliaForBlock,juliaBeginBlock,juliaFunctionBlock,juliaMacroBlock,juliaQuoteBlock,juliaTypeBlock,juliaImmutableBlock,juliaExceptionBlock,juliaLetBlock,juliaDoBlock,juliaModuleBlock,juliaStructBlock,juliaMutableStructBlock,juliaAbstractBlock,juliaPrimitiveBlock
+syntax cluster juliaTypesItems contains=juliaBaseTypeBasic,juliaBaseTypeNum,juliaBaseTypeC,juliaBaseTypeError,juliaBaseTypeIter,juliaBaseTypeString,juliaBaseTypeArray,juliaBaseTypeDict,juliaBaseTypeSet,juliaBaseTypeIO,juliaBaseTypeProcess,juliaBaseTypeRange,juliaBaseTypeRegex,juliaBaseTypeFact,juliaBaseTypeFact,juliaBaseTypeSort,juliaBaseTypeRound,juliaBaseTypeSpecial,juliaBaseTypeRandom,juliaBaseTypeDisplay,juliaBaseTypeTime,juliaBaseTypeOther
+
+syntax cluster juliaConstItems contains=juliaConstNum,juliaConstBool,juliaConstEnv,juliaConstMMap,juliaConstC,juliaConstGeneric,juliaConstIO,juliaPossibleEuler
+
+syntax cluster juliaMacroItems contains=juliaPossibleMacro,juliaDollarVar,juliaDollarPar,juliaDollarSqBra
+syntax cluster juliaSymbolItems contains=juliaPossibleSymbol
+syntax cluster juliaNumberItems contains=juliaNumbers
+syntax cluster juliaStringItems contains=juliaChar,juliaString,juliabString,juliasString,juliaShellString,juliaDocString,juliaRegEx
+syntax cluster juliaPrintfItems contains=juliaPrintfParBlock,juliaPrintfString
+syntax cluster juliaOperatorItems contains=juliaOperator,juliaRangeOperator,juliaCTransOperator,juliaTernaryRegion,juliaColon,juliaSemicolon,juliaComma
+syntax cluster juliaCommentItems contains=juliaCommentL,juliaCommentM
+syntax cluster juliaErrorItems contains=juliaErrorPar,juliaErrorEnd,juliaErrorElse,juliaErrorCatch,juliaErrorFinally
+
+syntax cluster juliaSyntaxRegions contains=juliaIdSymbol,juliaTypeOperatorR2,juliaTypeOperatorR3,juliaWhereR,juliaDotted
+
+syntax cluster juliaSpellcheckStrings contains=@spell
+syntax cluster juliaSpellcheckDocStrings contains=@spell
+syntax cluster juliaSpellcheckComments contains=@spell
+
+if !s:julia_spellcheck_docstrings
+ syntax cluster juliaSpellcheckDocStrings remove=@spell
+endif
+if !s:julia_spellcheck_strings
+ syntax cluster juliaSpellcheckStrings remove=@spell
+endif
+if !s:julia_spellcheck_comments
+ syntax cluster juliaSpellcheckComments remove=@spell
+endif
+
+syntax match juliaSemicolon display ";"
+syntax match juliaComma display ","
+syntax match juliaColon display ":"
+
+" A dot can introduce a sort of 'environment' such that words after it are not
+" recognized as keywords. This has low precedence so that it can be overridden
+" by operators
+syntax match juliaDotted transparent "\.\s*[^])}.]" contains=@juliaExprsNodot
+syntax match juliaDottedT contained transparent "\.\s*[^])}.]" contains=@juliaExprsNodot,juliaType
+
+syntax match juliaErrorPar display "[])}]"
+syntax match juliaErrorEnd display "\<end\>"
+syntax match juliaErrorElse display "\<\%(else\|elseif\)\>"
+syntax match juliaErrorCatch display "\<catch\>"
+syntax match juliaErrorFinally display "\<finally\>"
+syntax match juliaErrorSemicol display contained ";"
+
+syntax region juliaParBlock matchgroup=juliaParDelim start="(" end=")" contains=@juliaExpressions,juliaComprehensionFor
+syntax region juliaParBlockInRange matchgroup=juliaParDelim contained start="(" end=")" contains=@juliaExpressions,juliaParBlockInRange,juliaRangeKeyword,juliaComprehensionFor
+syntax region juliaSqBraIdxBlock matchgroup=juliaParDelim start="\[" end="\]" contains=@juliaExpressions,juliaParBlockInRange,juliaRangeKeyword,juliaComprehensionFor,juliaSymbolS,juliaQuotedParBlockS,juliaQuotedQMarkParS
+exec 'syntax region juliaSqBraBlock matchgroup=juliaParDelim start="\%(^\|\s\|' . s:operators . '\)\@'.s:d(3).'<=\[" end="\]" contains=@juliaExpressions,juliaComprehensionFor,juliaSymbolS,juliaQuotedParBlockS,juliaQuotedQMarkParS'
+syntax region juliaCurBraBlock matchgroup=juliaParDelim start="{" end="}" contains=juliaType,juliaDottedT,@juliaExpressions
+
+exec 'syntax match juliaType contained "\%(' . s:idregex . '\.\)*\zs' . s:idregex . '"'
+
+" This is a generic identifier followed by some symbol, either a type
+" operator (<: or >:), or an open parenthesis, or an open curly bracket.
+" It's used to recognize one of the contained regions looking for identifiers
+" only once. Once recognized, those regions no longer need to use the
+" expensive s:idregex.
+exec 'syntax match juliaIdSymbol transparent "' . s:idregex . '\%(\s*[<>]:\|\.\?(\|{\|\"\)\@=" contains=juliaFunctionCall,juliaParamType,juliaStringPrefixed,juliaTypeOperatorR1'
+
+syntax match juliaFunctionCall contained "[^{([:space:]<>\"]\+(\@=" nextgroup=juliaParBlock
+
+exec 'syntax match juliaFunctionDef contained transparent "\%(\<\%(function\|macro\)\)\@'.s:d(8).'<=\s\+\zs' . s:idregex . '\%(\.' . s:idregex . '\)*\ze\s*\%((\|\send\>\|$\)" contains=juliaFunctionName'
+exec 'syntax match juliaFunctionName contained "\%(\<\%(function\|macro\)\s\+\)\@'.s:d(20).'<=\%(' . s:idregex . '\.\)*\zs' . s:idregex . '"'
+
+exec 'syntax match juliaStructR contained transparent "\%(\<\%(\%(mutable\s\+\)\?struct\|\%(abstract\|primitive\)\s\+type\)\s\+\)\@'.s:d(20).'<=\%(' . s:idregex . '\.\)*' . s:idregex . '\>\(\s*(\)\@!" contains=juliaType'
+
+syntax match juliaKeyword display "\<\%(return\|local\|global\|const\)\>"
+syntax match juliaInfixKeyword display "\%(=\s*\)\@<!\<\%(in\|isa\)\>\S\@!\%(\s*=\)\@!"
+
+" The import/export/using keywords introduce a sort of special parsing
+" environment with its own rules
+exec 'syntax region juliaImportLine matchgroup=juliaKeyword excludenl start="\<\%(import\|using\|export\)\>" skip="\%(\%(\<\%(import\|using\|export\)\>\)\|^\)\@'.s:d(6).'<=$" end="$" end="\%([])}]\)\@=" contains=@juliaExpressions,juliaAsKeyword,@juliaContinuationItems,juliaMacroName'
+syntax match juliaAsKeyword display contained "\<as\>"
+
+syntax match juliaRepKeyword display "\<\%(break\|continue\)\>"
+syntax region juliaConditionalBlock matchgroup=juliaConditional start="\<if\>" end="\<end\>" contains=@juliaExpressions,juliaConditionalEIBlock,juliaConditionalEBlock fold
+syntax region juliaConditionalEIBlock matchgroup=juliaConditional transparent contained start="\<elseif\>" end="\<\%(end\|else\|elseif\)\>"me=s-1 contains=@juliaExpressions,juliaConditionalEIBlock,juliaConditionalEBlock
+syntax region juliaConditionalEBlock matchgroup=juliaConditional transparent contained start="\<else\>" end="\<end\>"me=s-1 contains=@juliaExpressions
+syntax region juliaWhileBlock matchgroup=juliaRepeat start="\<while\>" end="\<end\>" contains=@juliaExpressions fold
+syntax region juliaForBlock matchgroup=juliaRepeat start="\<for\>" end="\<end\>" contains=@juliaExpressions,juliaOuter fold
+syntax region juliaBeginBlock matchgroup=juliaBlKeyword start="\<begin\>" end="\<end\>" contains=@juliaExpressions fold
+syntax region juliaFunctionBlock matchgroup=juliaBlKeyword start="\<function\>" end="\<end\>" contains=@juliaExpressions,juliaFunctionDef fold
+syntax region juliaMacroBlock matchgroup=juliaBlKeyword start="\<macro\>" end="\<end\>" contains=@juliaExpressions,juliaFunctionDef fold
+syntax region juliaQuoteBlock matchgroup=juliaBlKeyword start="\<quote\>" end="\<end\>" contains=@juliaExpressions fold
+syntax region juliaStructBlock matchgroup=juliaBlKeyword start="\<struct\>" end="\<end\>" contains=@juliaExpressions,juliaStructR fold
+syntax region juliaMutableStructBlock matchgroup=juliaBlKeyword start="\<mutable\s\+struct\>" end="\<end\>" contains=@juliaExpressions,juliaStructR fold
+syntax region juliaLetBlock matchgroup=juliaBlKeyword start="\<let\>" end="\<end\>" contains=@juliaExpressions fold
+syntax region juliaDoBlock matchgroup=juliaBlKeyword start="\<do\>" end="\<end\>" contains=@juliaExpressions fold
+syntax region juliaModuleBlock matchgroup=juliaBlKeyword start="\<\%(bare\)\?module\>" end="\<end\>" contains=@juliaExpressions fold
+syntax region juliaExceptionBlock matchgroup=juliaException start="\<try\>" end="\<end\>" contains=@juliaExpressions,juliaCatchBlock,juliaFinallyBlock fold
+syntax region juliaCatchBlock matchgroup=juliaException transparent contained start="\<catch\>" end="\<end\>"me=s-1 contains=@juliaExpressions,juliaFinallyBlock
+syntax region juliaFinallyBlock matchgroup=juliaException transparent contained start="\<finally\>" end="\<end\>"me=s-1 contains=@juliaExpressions
+syntax region juliaAbstractBlock matchgroup=juliaBlKeyword start="\<abstract\s\+type\>" end="\<end\>" fold contains=@juliaExpressions,juliaStructR
+syntax region juliaPrimitiveBlock matchgroup=juliaBlKeyword start="\<primitive\s\+type\>" end="\<end\>" fold contains=@juliaExpressions,juliaStructR
+
+exec 'syntax region juliaComprehensionFor matchgroup=juliaComprehensionFor transparent contained start="\%([^[:space:],;:({[]\_s*\)\@'.s:d(80).'<=\<for\>" end="\ze[]);]" contains=@juliaExpressions,juliaComprehensionIf,juliaComprehensionFor'
+syntax match juliaComprehensionIf contained "\<if\>"
+
+exec 'syntax match juliaOuter contained "\<outer\ze\s\+' . s:idregex . '\>"'
+
+syntax match juliaRangeKeyword contained "\<\%(begin\|end\)\>"
+
+syntax match juliaBaseTypeBasic display "\<\%(\%(N\|Named\)\?Tuple\|Symbol\|Function\|Union\%(All\)\?\|Type\%(Name\|Var\)\?\|Any\|ANY\|Vararg\|Ptr\|Exception\|Module\|Expr\|DataType\|\%(LineNumber\|Quote\)Node\|\%(Weak\|Global\)\?Ref\|Method\|Pair\|Val\|Nothing\|Some\|Missing\)\>"
+syntax match juliaBaseTypeNum display "\<\%(U\?Int\%(8\|16\|32\|64\|128\)\?\|Float\%(16\|32\|64\)\|Complex\|Bool\|Char\|Number\|Signed\|Unsigned\|Integer\|AbstractFloat\|Real\|Rational\|\%(Abstract\)\?Irrational\|Enum\|BigInt\|BigFloat\|MathConst\|ComplexF\%(16\|32\|64\)\)\>"
+syntax match juliaBaseTypeC display "\<\%(FileOffset\|C\%(u\?\%(char\|short\|int\|long\(long\)\?\|w\?string\)\|float\|double\|\%(ptrdiff\|s\?size\|wchar\|off\|u\?intmax\)_t\|void\)\)\>"
+syntax match juliaBaseTypeError display "\<\%(\%(Bounds\|Divide\|Domain\|\%(Stack\)\?Overflow\|EOF\|Undef\%(Ref\|Var\)\|System\|Type\|Parse\|Argument\|Key\|Load\|Method\|Inexact\|OutOfMemory\|Init\|Assertion\|ReadOnlyMemory\|StringIndex\)Error\|\%(Interrupt\|Error\|ProcessExited\|Captured\|Composite\|InvalidState\|Missing\|\%(Process\|Task\)Failed\)Exception\|DimensionMismatch\|SegmentationFault\)\>"
+syntax match juliaBaseTypeIter display "\<\%(EachLine\|Enumerate\|Cartesian\%(Index\|Range\)\|LinSpace\|CartesianIndices\)\>"
+syntax match juliaBaseTypeString display "\<\%(DirectIndex\|Sub\|Rep\|Rev\|Abstract\|Substitution\)\?String\>"
+syntax match juliaBaseTypeArray display "\<\%(\%(Sub\)\?Array\|\%(Abstract\|Dense\|Strided\)\?\%(Array\|Matrix\|Vec\%(tor\|OrMat\)\)\|SparseMatrixCSC\|\%(AbstractSparse\|Bit\|Shared\)\%(Array\|Vector\|Matrix\)\|\%\(D\|Bid\|\%(Sym\)\?Trid\)iagonal\|Hermitian\|Symmetric\|UniformScaling\|\%(Lower\|Upper\)Triangular\|\%(Sparse\|Row\)Vector\|VecElement\|Conj\%(Array\|Matrix\|Vector\)\|Index\%(Cartesian\|Linear\|Style\)\|PermutedDimsArray\|Broadcasted\|Adjoint\|Transpose\|LinearIndices\)\>"
+syntax match juliaBaseTypeDict display "\<\%(WeakKey\|Id\|Abstract\)\?Dict\>"
+syntax match juliaBaseTypeSet display "\<\%(\%(Abstract\|Bit\)\?Set\)\>"
+syntax match juliaBaseTypeIO display "\<\%(IO\%(Stream\|Buffer\|Context\)\?\|RawFD\|StatStruct\|FileMonitor\|PollingFileWatcher\|Timer\|Base64\%(Decode\|Encode\)Pipe\|\%(UDP\|TCP\)Socket\|\%(Abstract\)\?Channel\|BufferStream\|ReentrantLock\|GenericIOBuffer\)\>"
+syntax match juliaBaseTypeProcess display "\<\%(Pipe\|Cmd\|PipeBuffer\)\>"
+syntax match juliaBaseTypeRange display "\<\%(Dims\|RangeIndex\|\%(Abstract\|Lin\|Ordinal\|Step\|\%(Abstract\)\?Unit\)Range\|Colon\|ExponentialBackOff\|StepRangeLen\)\>"
+syntax match juliaBaseTypeRegex display "\<Regex\%(Match\)\?\>"
+syntax match juliaBaseTypeFact display "\<\%(Factorization\|BunchKaufman\|\%(Cholesky\|QR\)\%(Pivoted\)\?\|\%(Generalized\)\?\%(Eigen\|SVD\|Schur\)\|Hessenberg\|LDLt\|LQ\|LU\)\>"
+syntax match juliaBaseTypeSort display "\<\%(Insertion\|\(Partial\)\?Quick\|Merge\)Sort\>"
+syntax match juliaBaseTypeRound display "\<Round\%(ingMode\|FromZero\|Down\|Nearest\%(Ties\%(Away\|Up\)\)\?\|ToZero\|Up\)\>"
+syntax match juliaBaseTypeSpecial display "\<\%(LocalProcess\|ClusterManager\)\>"
+syntax match juliaBaseTypeRandom display "\<\%(AbstractRNG\|MersenneTwister\|RandomDevice\)\>"
+syntax match juliaBaseTypeDisplay display "\<\%(Text\(Display\)\?\|\%(Abstract\)\?Display\|MIME\|HTML\)\>"
+syntax match juliaBaseTypeTime display "\<\%(Date\%(Time\)\?\|DateFormat\)\>"
+syntax match juliaBaseTypeOther display "\<\%(RemoteRef\|Task\|Condition\|VersionNumber\|IPv[46]\|SerializationState\|WorkerConfig\|Future\|RemoteChannel\|IPAddr\|Stack\%(Trace\|Frame\)\|\(Caching\|Worker\)Pool\|AbstractSerializer\)\>"
+
+syntax match juliaConstNum display "\%(\<\%(\%(NaN\|Inf\)\%(16\|32\|64\)\?\|pi\|π\)\>\)"
+" Note: recognition of ℯ, which Vim does not consider a valid identifier, is
+" complicated. We detect possible uses by just looking for the character (for
+" performance) and then check that it's actually used by its own.
+" (This also tries to detect preceding number constants; it does so in a crude
+" way.)
+syntax match juliaPossibleEuler "ℯ" contains=juliaEuler
+exec 'syntax match juliaEuler contained "\%(\%(^\|[' . s:nonidS_chars . s:op_chars_wc . ']\)\%(.\?[0-9][.0-9eEf_]*\d\)\?\)\@'.s:d(80).'<=ℯ\ze[' . s:nonidS_chars . s:op_chars_wc . ']"'
+syntax match juliaConstBool display "\<\%(true\|false\)\>"
+syntax match juliaConstEnv display "\<\%(ARGS\|ENV\|ENDIAN_BOM\|LOAD_PATH\|VERSION\|PROGRAM_FILE\|DEPOT_PATH\)\>"
+syntax match juliaConstIO display "\<\%(std\%(out\|in\|err\)\|devnull\)\>"
+syntax match juliaConstC display "\<\%(C_NULL\)\>"
+syntax match juliaConstGeneric display "\<\%(nothing\|Main\|undef\|missing\)\>"
+
+syntax match juliaParamType contained "[^{([:space:]<>\"]\+\ze{" nextgroup=juliaCurBraBlock
+
+syntax match juliaPossibleMacro transparent "@" contains=juliaMacroCall,juliaMacroCallP,juliaPrintfMacro,juliaDocMacro,juliaDocMacroPre
+
+exec 'syntax match juliaMacro contained "@' . s:idregex . '\%(\.' . s:idregex . '\)*"'
+syntax match juliaMacro contained "@[!.~$%^*/\\|<>+-]\ze[^0-9]"
+exec 'syntax region juliaMacroCall contained transparent start="\(@' . s:idregex . '\%(\.' . s:idregex . '\)*\)\@=\1\%([^(]\|$\)" end="\ze\%([])};#]\|$\|\<for\>\|\<end\>\)" contains=@juliaExpressions,juliaMacro,juliaSymbolS,juliaQuotedParBlockS'
+exec 'syntax region juliaMacroCall contained transparent start="\(@.\)\@=\1\%([^(]\|$\)" end="\ze\%([])};#]\|$\|\<for\>\|\<end\>\)" contains=@juliaExpressions,juliaMacro,juliaSymbolS,juliaQuotedParBlockS'
+exec 'syntax region juliaMacroCallP contained transparent start="@' . s:idregex . '\%(\.' . s:idregex . '\)*(" end=")\@'.s:d(1).'<=" contains=juliaMacro,juliaParBlock'
+exec 'syntax region juliaMacroCallP contained transparent start="@.(" end=")\@'.s:d(1).'<=" contains=juliaMacro,juliaParBlock'
+
+exec 'syntax match juliaNumbers transparent "\%(^\|[' . s:nonidS_chars . s:op_chars_wc . ']\)\@'.s:d(1).'<=\d\|\.\d\|im\>" contains=juliaNumber,juliaFloat,juliaComplexUnit'
+
+"integer regexes
+let s:dec_regex = '\d\%(_\?\d\)*\%(\>\|im\>\|\ze\D\)'
+let s:hex_regex = '0x\x\%(_\?\x\)*\%(\>\|im\>\|\ze\X\)'
+let s:bin_regex = '0b[01]\%(_\?[01]\)*\%(\>\|im\>\|\ze[^01]\)'
+let s:oct_regex = '0o\o\%(_\?\o\)*\%(\>\|im\>\|\ze\O\)'
+
+let s:int_regex = '\%(' . s:hex_regex .
+ \ '\|' . s:bin_regex .
+ \ '\|' . s:oct_regex .
+ \ '\|' . s:dec_regex .
+ \ '\)'
+
+"floating point regexes
+" starting with a dot, optional exponent
+let s:float_regex1 = '\.\d\%(_\?\d\)*\%([eEf][-+]\?\d\+\)\?\%(\>\|im\>\|\ze\D\)'
+" with dot, optional exponent
+let s:float_regex2 = '\d\%(_\?\d\)*\.\%(\d\%(_\?\d\)*\)\?\%([eEf][-+]\?\d\+\)\?\%(\>\|im\>\|\ze\D\)'
+" without dot, with exponent
+let s:float_regex3 = '\d\%(_\?\d\)*[eEf][-+]\?\d\+\%(\>\|im\>\|\ze\D\)'
+
+"hex floating point numbers
+" starting with a dot
+let s:hexfloat_regex1 = '0x\.\%\(\x\%(_\?\x\)*\)\?[pP][-+]\?\d\+\%(\>\|im\>\|\ze\X\)'
+" starting with a digit
+let s:hexfloat_regex2 = '0x\x\%(_\?\x\)*\%\(\.\%\(\x\%(_\?\x\)*\)\?\)\?[pP][-+]\?\d\+\%(\>\|im\>\|\ze\X\)'
+
+let s:float_regex = '\%(' . s:float_regex3 .
+ \ '\|' . s:float_regex2 .
+ \ '\|' . s:float_regex1 .
+ \ '\|' . s:hexfloat_regex2 .
+ \ '\|' . s:hexfloat_regex1 .
+ \ '\)'
+
+exec 'syntax match juliaNumber contained "' . s:int_regex . '" contains=juliaComplexUnit'
+exec 'syntax match juliaFloat contained "' . s:float_regex . '" contains=juliaComplexUnit'
+syntax match juliaComplexUnit display contained "\<im\>"
+
+syntax match juliaRangeOperator display ":"
+exec 'syntax match juliaOperator "' . s:operators . '"'
+
+exec 'syntax region juliaTernaryRegion matchgroup=juliaTernaryOperator start="\s\zs?\ze\s" skip="\%(:\(:\|[^:[:space:]'."'".'"({[]\+\s*\ze:\)\|\%(?\s*\)\@'.s:d(6).'<=:(\)" end=":" contains=@juliaExpressions,juliaErrorSemicol'
+
+let s:interp_dollar = '\([' . s:nonidS_chars . s:op_chars_wc . '!]\|^\)\@'.s:d(1).'<=\$'
+
+exec 'syntax match juliaDollarVar display contained "' . s:interp_dollar . s:idregex . '"'
+exec 'syntax region juliaDollarPar matchgroup=juliaDollarVar contained start="' .s:interp_dollar . '(" end=")" contains=@juliaExpressions'
+exec 'syntax region juliaDollarSqBra matchgroup=juliaDollarVar contained start="' .s:interp_dollar . '\[" end="\]" contains=@juliaExpressions,juliaComprehensionFor,juliaSymbolS,juliaQuotedParBlockS'
+
+syntax match juliaChar "'\\\?.'" contains=juliaSpecialChar
+syntax match juliaChar display "'\\\o\{3\}'" contains=juliaOctalEscapeChar
+syntax match juliaChar display "'\\x\x\{2\}'" contains=juliaHexEscapeChar
+syntax match juliaChar display "'\\u\x\{1,4\}'" contains=juliaUniCharSmall
+syntax match juliaChar display "'\\U\x\{1,8\}'" contains=juliaUniCharLarge
+
+exec 'syntax match juliaCTransOperator "[[:space:]}' . s:nonid_chars . s:op_chars_wc . '!]\@'.s:d(1).'<!\.\?' . "'" . 'ᵀ\?"'
+
+" TODO: some of these might be specialized; the rest could be just left to the
+" generic juliaStringPrefixed fallback
+syntax region juliaString matchgroup=juliaStringDelim start=+\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaStringVars,@juliaSpecialChars,@juliaSpellcheckStrings
+syntax region juliaStringPrefixed contained matchgroup=juliaStringDelim start=+[^{([:space:]<>"]\+\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaSpecialCharsRaw
+syntax region juliabString matchgroup=juliaStringDelim start=+\<b\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaSpecialChars
+syntax region juliasString matchgroup=juliaStringDelim start=+\<s\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaSpecialChars
+
+syntax region juliaDocString matchgroup=juliaDocStringDelim fold start=+^"""+ skip=+\%(\\\\\)*\\"+ end=+"""+ contains=@juliaStringVars,@juliaSpecialChars,@juliaSpellcheckDocStrings
+
+exec 'syntax region juliaPrintfMacro contained transparent start="@s\?printf(" end=")\@'.s:d(1).'<=" contains=juliaMacro,juliaPrintfParBlock'
+syntax region juliaPrintfMacro contained transparent start="@s\?printf\s\+" end="\ze\%([])};#]\|$\|\<for\>\)" contains=@juliaExprsPrintf,juliaMacro,juliaSymbolS,juliaQuotedParBlockS
+syntax region juliaPrintfParBlock contained matchgroup=juliaParDelim start="(" end=")" contains=@juliaExprsPrintf
+syntax region juliaPrintfString contained matchgroup=juliaStringDelim start=+"+ skip=+\%(\\\\\)*\\"+ end=+"+ contains=@juliaSpecialChars,@juliaPrintfChars
+
+exec 'syntax region juliaDocMacroPre contained transparent start=+@doc\s\+\%(' . s:idregex . '\%(\.' . s:idregex . '\)*\)\z("\%(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\(\z1\)\@'.s:d(3).'<=+ contains=juliaMacro,juliaDocStringMRaw'
+exec 'syntax region juliaDocMacro contained transparent start=+@doc\s\+\z("\%(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\(\z1\)\@'.s:d(3).'<=+ contains=juliaMacro,juliaDocStringM'
+syntax region juliaDocStringMRaw contained fold matchgroup=juliaDocStringDelim fold start=+\z\("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaSpellcheckDocStrings
+syntax region juliaDocStringM contained fold matchgroup=juliaDocStringDelim fold start=+\z\("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1+ contains=@juliaStringVars,@juliaSpecialChars,@juliaSpellcheckDocStrings
+
+syntax region juliaShellString matchgroup=juliaStringDelim start=+`+ skip=+\%(\\\\\)*\\`+ end=+`+ contains=@juliaStringVars,juliaSpecialChar
+
+syntax cluster juliaStringVars contains=juliaStringVarsPar,juliaStringVarsSqBra,juliaStringVarsCurBra,juliaStringVarsPla
+syntax region juliaStringVarsPar contained matchgroup=juliaStringVarDelim start="$(" end=")" contains=@juliaExpressions
+syntax region juliaStringVarsSqBra contained matchgroup=juliaStringVarDelim start="$\[" end="\]" contains=@juliaExpressions,juliaComprehensionFor,juliaSymbolS,juliaQuotedParBlockS
+syntax region juliaStringVarsCurBra contained matchgroup=juliaStringVarDelim start="${" end="}" contains=@juliaExpressions
+exec 'syntax match juliaStringVarsPla contained "\$' . s:idregex . '"'
+
+" TODO improve RegEx
+syntax region juliaRegEx matchgroup=juliaStringDelim start=+\<r\z("\(""\)\?\)+ skip=+\%(\\\\\)*\\"+ end=+\z1[imsx]*+
+
+syntax cluster juliaSpecialChars contains=juliaSpecialChar,juliaDoubleBackslash,juliaEscapedQuote,juliaOctalEscapeChar,juliaHexEscapeChar,juliaUniCharSmall,juliaUniCharLarge
+syntax match juliaSpecialChar display contained "\\."
+syntax match juliaOctalEscapeChar display contained "\\\o\{3\}"
+syntax match juliaHexEscapeChar display contained "\\x\x\{2\}"
+syntax match juliaUniCharSmall display contained "\\u\x\{1,4\}"
+syntax match juliaUniCharLarge display contained "\\U\x\{1,8\}"
+syntax cluster juliaSpecialCharsRaw contains=juliaDoubleBackslash,juliaEscapedQuote
+syntax match juliaDoubleBackslash contained "\\\\"
+syntax match juliaEscapedQuote contained "\\\""
+
+syntax cluster juliaPrintfChars contains=juliaErrorPrintfFmt,juliaPrintfFmt
+syntax match juliaErrorPrintfFmt display contained "\\\?%."
+syntax match juliaPrintfFmt display contained "%\%(\d\+\$\)\=[-+' #0]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlLjqzt]\|ll\|hh\)\=[aAbdiuoxXDOUfFeEgGcCsSpn]"
+syntax match juliaPrintfFmt display contained "%%"
+syntax match juliaPrintfFmt display contained "\\%\%(\d\+\$\)\=[-+' #0]*\%(\d*\|\*\|\*\d\+\$\)\%(\.\%(\d*\|\*\|\*\d\+\$\)\)\=\%([hlLjqzt]\|ll\|hh\)\=[aAbdiuoxXDOUfFeEgGcCsSpn]"hs=s+1
+syntax match juliaPrintfFmt display contained "\\%%"hs=s+1
+
+" this is used to restrict the search for Symbols to when colons appear at all
+" (for performance reasons)
+syntax match juliaPossibleSymbol transparent ":\ze[^:]" contains=juliaSymbol,juliaQuotedParBlock,juliaQuotedQMarkPar,juliaColon
+
+let s:quotable = '\%(' . s:idregex . '\|' . s:operators . '\|[?.]\|' . s:float_regex . '\|' . s:int_regex . '\)'
+let s:quoting_colon = '\%(\%(^\s*\|\s\{6,\}\|[' . s:nonid_chars . s:op_chars_wc . ']\s*\)\@'.s:d(6).'<=\|\%(\<\%(return\|if\|else\%(if\)\?\|while\|try\|begin\)\s\+\)\@'.s:d(9).'<=\)\zs:'
+let s:quoting_colonS = '\s\@'.s:d(1).'<=:'
+
+" note: juliaSymbolS only works within whitespace-sensitive contexts,
+" such as in macro calls without parentheses, or within square brackets.
+" It is used to override the recognition of expressions like `a :b` as
+" ranges rather than symbols in those contexts.
+" (Note that such `a :b` expressions only allows at most 5 spaces between
+" the identifier and the colon anyway.)
+
+exec 'syntax match juliaSymbol contained "' . s:quoting_colon . s:quotable . '"'
+exec 'syntax match juliaSymbolS contained "' . s:quoting_colonS . s:quotable . '"'
+
+" same as above for quoted expressions such as :(expr)
+exec 'syntax region juliaQuotedParBlock matchgroup=juliaQParDelim start="' . s:quoting_colon . '(" end=")" contains=@juliaExpressions'
+exec 'syntax match juliaQuotedQMarkPar "' . s:quoting_colon . '(\s*?\s*)" contains=juliaQuotedQMark'
+exec 'syntax region juliaQuotedParBlockS matchgroup=juliaQParDelim contained start="' . s:quoting_colonS . '(" end=")" contains=@juliaExpressions'
+
+
+syntax match juliaTypeOperatorR1 contained "[^{([:space:]<>\"]\+\%(\s*[<>]:\)\@="
+
+" force precedence over Symbols
+syntax match juliaTypeOperator contained "[<>:]:"
+exec 'syntax match juliaTypeOperatorR2 transparent "[<>:]:\s*\%(' . s:idregex . '\.\)*' . s:idregex . '" contains=juliaTypeOperator,juliaType,juliaDottedT,@juliaExpressions nextgroup=juliaTypeOperator'
+syntax match juliaIsaKeyword contained "\<isa\>"
+exec 'syntax match juliaTypeOperatorR3 transparent "\<isa\s\+\%(' . s:idregex . '\.\)*' . s:idregex . '" contains=juliaIsaKeyword,juliaType,juliaDottedT,@juliaExpressions nextgroup=juliaIsaKeyword'
+
+syntax match juliaWhereKeyword "\<where\>"
+exec 'syntax match juliaWhereR transparent "\<where\s\+' . s:idregex . '" contains=juliaWhereKeyword,juliaType,juliaDottedT,juliaIdSymbol'
+
+syntax region juliaCommentL matchgroup=juliaCommentDelim excludenl start="#\ze\%([^=]\|$\)" end="$" contains=juliaTodo,@juliaSpellcheckComments
+syntax region juliaCommentM matchgroup=juliaCommentDelim fold start="#=\ze\%([^#]\|$\)" end="=#" contains=juliaTodo,juliaCommentM,@juliaSpellcheckComments
+syntax keyword juliaTodo contained TODO FIXME XXX
+
+" detect an end-of-line with only whitespace or comments before it
+let s:eol = '\s*\%(\%(\%(#=\%(=#\@!\|[^=]\|\n\)\{-}=#\)\s*\)\+\)\?\%(#=\@!.*\)\?\n'
+
+" a trailing comma, or colon, or an empty line in an import/using/export
+" multi-line command. Used to recognize the as keyword, and for indentation
+" (this needs to take precedence over normal commas and colons, and comments)
+syntax cluster juliaContinuationItems contains=juliaContinuationComma,juliaContinuationColon,juliaContinuationNone
+exec 'syntax region juliaContinuationComma matchgroup=juliaComma contained start=",\ze'.s:eol.'" end="\n\+\ze." contains=@juliaCommentItems'
+exec 'syntax region juliaContinuationColon matchgroup=juliaColon contained start=":\ze'.s:eol.'" end="\n\+\ze." contains=@juliaCommentItems'
+exec 'syntax region juliaContinuationNone matchgroup=NONE contained start="\%(\<\%(import\|using\|export\)\>\|^\)\@'.s:d(6).'<=\ze'.s:eol.'" end="\n\+\ze." contains=@juliaCommentItems,juliaAsKeyword'
+exec 'syntax match juliaMacroName contained "@' . s:idregex . '\%(\.' . s:idregex . '\)*"'
+
+" the following are disabled by default, but
+" can be enabled by entering e.g.
+" :hi link juliaParDelim Delimiter
+hi def link juliaParDelim juliaNone
+hi def link juliaSemicolon juliaNone
+hi def link juliaComma juliaNone
+hi def link juliaFunctionCall juliaNone
+
+hi def link juliaColon juliaOperator
+
+hi def link juliaFunctionName juliaFunction
+hi def link juliaFunctionName1 juliaFunction
+hi def link juliaMacroName juliaMacro
+
+
+hi def link juliaKeyword Keyword
+hi def link juliaWhereKeyword Keyword
+hi def link juliaInfixKeyword Keyword
+hi def link juliaIsaKeyword Keyword
+hi def link juliaAsKeyword Keyword
+hi def link juliaRepKeyword Keyword
+hi def link juliaBlKeyword Keyword
+hi def link juliaConditional Conditional
+hi def link juliaRepeat Repeat
+hi def link juliaException Exception
+hi def link juliaOuter Keyword
+hi def link juliaBaseTypeBasic Type
+hi def link juliaBaseTypeNum Type
+hi def link juliaBaseTypeC Type
+hi def link juliaBaseTypeError Type
+hi def link juliaBaseTypeIter Type
+hi def link juliaBaseTypeString Type
+hi def link juliaBaseTypeArray Type
+hi def link juliaBaseTypeDict Type
+hi def link juliaBaseTypeSet Type
+hi def link juliaBaseTypeIO Type
+hi def link juliaBaseTypeProcess Type
+hi def link juliaBaseTypeRange Type
+hi def link juliaBaseTypeRegex Type
+hi def link juliaBaseTypeFact Type
+hi def link juliaBaseTypeSort Type
+hi def link juliaBaseTypeRound Type
+hi def link juliaBaseTypeSpecial Type
+hi def link juliaBaseTypeRandom Type
+hi def link juliaBaseTypeDisplay Type
+hi def link juliaBaseTypeTime Type
+hi def link juliaBaseTypeOther Type
+
+hi def link juliaType Type
+hi def link juliaParamType Type
+hi def link juliaTypeOperatorR1 Type
+
+" NOTE: deprecated constants are not highlighted as such. For once,
+" one can still legitimately use them by importing Base.MathConstants.
+" Plus, one-letter variables like `e` and `γ` can be used with other
+" meanings.
+hi def link juliaConstNum Constant
+hi def link juliaEuler Constant
+
+hi def link juliaConstEnv Constant
+hi def link juliaConstC Constant
+hi def link juliaConstLimits Constant
+hi def link juliaConstGeneric Constant
+hi def link juliaRangeKeyword Constant
+hi def link juliaConstBool Boolean
+hi def link juliaConstIO Boolean
+
+hi def link juliaComprehensionFor Keyword
+hi def link juliaComprehensionIf Keyword
+
+hi def link juliaDollarVar Identifier
+
+hi def link juliaFunction Function
+hi def link juliaMacro Macro
+hi def link juliaSymbol Identifier
+hi def link juliaSymbolS Identifier
+hi def link juliaQParDelim Identifier
+hi def link juliaQuotedQMarkPar Identifier
+hi def link juliaQuotedQMark juliaOperatorHL
+
+hi def link juliaNumber Number
+hi def link juliaFloat Float
+hi def link juliaComplexUnit Constant
+
+hi def link juliaChar Character
+
+hi def link juliaString String
+hi def link juliaStringPrefixed juliaString
+hi def link juliabString juliaString
+hi def link juliasString juliaString
+hi def link juliavString juliaString
+hi def link juliarString juliaString
+hi def link juliaipString juliaString
+hi def link juliabigString juliaString
+hi def link juliaMIMEString juliaString
+hi def link juliarawString juliaString
+hi def link juliatestString juliaString
+hi def link juliahtmlString juliaString
+hi def link juliaint128String juliaString
+hi def link juliaPrintfString juliaString
+hi def link juliaShellString juliaString
+hi def link juliaDocString juliaString
+hi def link juliaDocStringM juliaDocString
+hi def link juliaDocStringMRaw juliaDocString
+hi def link juliaStringDelim juliaString
+hi def link juliaDocStringDelim juliaDocString
+hi def link juliaStringVarsPla Identifier
+hi def link juliaStringVarDelim Identifier
+
+hi def link juliaRegEx String
+
+hi def link juliaSpecialChar SpecialChar
+hi def link juliaOctalEscapeChar SpecialChar
+hi def link juliaHexEscapeChar SpecialChar
+hi def link juliaUniCharSmall SpecialChar
+hi def link juliaUniCharLarge SpecialChar
+hi def link juliaDoubleBackslash SpecialChar
+hi def link juliaEscapedQuote SpecialChar
+
+hi def link juliaPrintfFmt SpecialChar
+
+if s:julia_highlight_operators
+ hi! def link juliaOperatorHL Operator
+else
+ hi! def link juliaOperatorHL juliaNone
+endif
+hi def link juliaOperator juliaOperatorHL
+hi def link juliaRangeOperator juliaOperatorHL
+hi def link juliaCTransOperator juliaOperatorHL
+hi def link juliaTernaryOperator juliaOperatorHL
+hi def link juliaTypeOperator juliaOperatorHL
+
+hi def link juliaCommentL Comment
+hi def link juliaCommentM Comment
+hi def link juliaCommentDelim Comment
+hi def link juliaTodo Todo
+
+hi def link juliaErrorPar juliaError
+hi def link juliaErrorEnd juliaError
+hi def link juliaErrorElse juliaError
+hi def link juliaErrorCatch juliaError
+hi def link juliaErrorFinally juliaError
+hi def link juliaErrorSemicol juliaError
+hi def link juliaErrorPrintfFmt juliaError
+
+hi def link juliaError Error
+
+syntax sync fromstart
+
+let b:current_syntax = "julia"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/kconfig.vim b/runtime/syntax/kconfig.vim
new file mode 100644
index 0000000..c7a305b
--- /dev/null
+++ b/runtime/syntax/kconfig.vim
@@ -0,0 +1,739 @@
+" Vim syntax file
+" 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-kconfig
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if exists("g:kconfig_syntax_heavy")
+
+syn match kconfigBegin '^' nextgroup=kconfigKeyword
+ \ skipwhite
+
+syn keyword kconfigTodo contained TODO FIXME XXX NOTE
+
+syn match kconfigComment display '#.*$' contains=kconfigTodo
+
+syn keyword kconfigKeyword config nextgroup=kconfigSymbol
+ \ skipwhite
+
+syn keyword kconfigKeyword menuconfig nextgroup=kconfigSymbol
+ \ skipwhite
+
+syn keyword kconfigKeyword comment menu mainmenu
+ \ nextgroup=kconfigKeywordPrompt
+ \ skipwhite
+
+syn keyword kconfigKeyword choice
+ \ nextgroup=@kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn keyword kconfigKeyword endmenu endchoice
+
+syn keyword kconfigPreProc source
+ \ nextgroup=kconfigPath
+ \ skipwhite
+
+" TODO: This is a hack. The who .*Expr stuff should really be generated so
+" that we can reuse it for various nextgroups.
+syn keyword kconfigConditional if endif
+ \ nextgroup=@kconfigConfigOptionIfExpr
+ \ skipwhite
+
+syn match kconfigKeywordPrompt '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=@kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigPath '"[^"\\]*\%(\\.[^"\\]*\)*"\|\S\+'
+ \ contained
+
+syn match kconfigSymbol '\<\k\+\>'
+ \ contained
+ \ nextgroup=@kconfigConfigOptions
+ \ skipwhite skipnl
+
+" FIXME: There is – probably – no reason to cluster these instead of just
+" defining them in the same group.
+syn cluster kconfigConfigOptions contains=kconfigTypeDefinition,
+ \ kconfigInputPrompt,
+ \ kconfigDefaultValue,
+ \ kconfigDependencies,
+ \ kconfigReverseDependencies,
+ \ kconfigNumericalRanges,
+ \ kconfigHelpText,
+ \ kconfigDefBool,
+ \ kconfigOptional
+
+syn keyword kconfigTypeDefinition bool boolean tristate string hex int
+ \ contained
+ \ nextgroup=kconfigTypeDefPrompt,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigTypeDefPrompt '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigTypeDefPrompt "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn keyword kconfigInputPrompt prompt
+ \ contained
+ \ nextgroup=kconfigPromptPrompt
+ \ skipwhite
+
+syn match kconfigPromptPrompt '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigPromptPrompt "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn keyword kconfigDefaultValue default
+ \ contained
+ \ nextgroup=@kconfigConfigOptionExpr
+ \ skipwhite
+
+syn match kconfigDependencies 'depends on\|requires'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionIfExpr
+ \ skipwhite
+
+syn keyword kconfigReverseDependencies select
+ \ contained
+ \ nextgroup=@kconfigRevDepSymbol
+ \ skipwhite
+
+syn cluster kconfigRevDepSymbol contains=kconfigRevDepCSymbol,
+ \ kconfigRevDepNCSymbol
+
+syn match kconfigRevDepCSymbol '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigRevDepCSymbol "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigRevDepNCSymbol '\<\k\+\>'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn keyword kconfigNumericalRanges range
+ \ contained
+ \ nextgroup=@kconfigRangeSymbol
+ \ skipwhite
+
+syn cluster kconfigRangeSymbol contains=kconfigRangeCSymbol,
+ \ kconfigRangeNCSymbol
+
+syn match kconfigRangeCSymbol '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=@kconfigRangeSymbol2
+ \ skipwhite skipnl
+
+syn match kconfigRangeCSymbol "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=@kconfigRangeSymbol2
+ \ skipwhite skipnl
+
+syn match kconfigRangeNCSymbol '\<\k\+\>'
+ \ contained
+ \ nextgroup=@kconfigRangeSymbol2
+ \ skipwhite skipnl
+
+syn cluster kconfigRangeSymbol2 contains=kconfigRangeCSymbol2,
+ \ kconfigRangeNCSymbol2
+
+syn match kconfigRangeCSymbol2 "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigRangeNCSymbol2 '\<\k\+\>'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn region kconfigHelpText contained
+ \ matchgroup=kconfigConfigOption
+ \ start='\%(help\|---help---\)\ze\s*\n\z(\s\+\)'
+ \ skip='^$'
+ \ end='^\z1\@!'
+ \ nextgroup=@kconfigConfigOptions
+ \ skipwhite skipnl
+
+" XXX: Undocumented
+syn keyword kconfigDefBool def_bool
+ \ contained
+ \ nextgroup=@kconfigDefBoolSymbol
+ \ skipwhite
+
+syn cluster kconfigDefBoolSymbol contains=kconfigDefBoolCSymbol,
+ \ kconfigDefBoolNCSymbol
+
+syn match kconfigDefBoolCSymbol '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigDefBoolCSymbol "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigDefBoolNCSymbol '\<\k\+\>'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+" XXX: This is actually only a valid option for “choice”, but treating it
+" specially would require a lot of extra groups.
+syn keyword kconfigOptional optional
+ \ contained
+ \ nextgroup=@kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn keyword kconfigConfigOptionIf if
+ \ contained
+ \ nextgroup=@kconfigConfigOptionIfExpr
+ \ skipwhite
+
+syn cluster kconfigConfigOptionIfExpr contains=@kconfigConfOptIfExprSym,
+ \ kconfigConfOptIfExprNeg,
+ \ kconfigConfOptIfExprGroup
+
+syn cluster kconfigConfOptIfExprSym contains=kconfigConfOptIfExprCSym,
+ \ kconfigConfOptIfExprNCSym
+
+syn match kconfigConfOptIfExprCSym '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=@kconfigConfigOptions,
+ \ kconfigConfOptIfExprAnd,
+ \ kconfigConfOptIfExprOr,
+ \ kconfigConfOptIfExprEq,
+ \ kconfigConfOptIfExprNEq
+ \ skipwhite skipnl
+
+syn match kconfigConfOptIfExprCSym "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=@kconfigConfigOptions,
+ \ kconfigConfOptIfExprAnd,
+ \ kconfigConfOptIfExprOr,
+ \ kconfigConfOptIfExprEq,
+ \ kconfigConfOptIfExprNEq
+ \ skipwhite skipnl
+
+syn match kconfigConfOptIfExprNCSym '\<\k\+\>'
+ \ contained
+ \ nextgroup=@kconfigConfigOptions,
+ \ kconfigConfOptIfExprAnd,
+ \ kconfigConfOptIfExprOr,
+ \ kconfigConfOptIfExprEq,
+ \ kconfigConfOptIfExprNEq
+ \ skipwhite skipnl
+
+syn cluster kconfigConfOptIfExprSym2 contains=kconfigConfOptIfExprCSym2,
+ \ kconfigConfOptIfExprNCSym2
+
+syn match kconfigConfOptIfExprEq '='
+ \ contained
+ \ nextgroup=@kconfigConfOptIfExprSym2
+ \ skipwhite
+
+syn match kconfigConfOptIfExprNEq '!='
+ \ contained
+ \ nextgroup=@kconfigConfOptIfExprSym2
+ \ skipwhite
+
+syn match kconfigConfOptIfExprCSym2 "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=@kconfigConfigOptions,
+ \ kconfigConfOptIfExprAnd,
+ \ kconfigConfOptIfExprOr
+ \ skipwhite skipnl
+
+syn match kconfigConfOptIfExprNCSym2 '\<\k\+\>'
+ \ contained
+ \ nextgroup=@kconfigConfigOptions,
+ \ kconfigConfOptIfExprAnd,
+ \ kconfigConfOptIfExprOr
+ \ skipwhite skipnl
+
+syn match kconfigConfOptIfExprNeg '!'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionIfExpr
+ \ skipwhite
+
+syn match kconfigConfOptIfExprAnd '&&'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionIfExpr
+ \ skipwhite
+
+syn match kconfigConfOptIfExprOr '||'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionIfExpr
+ \ skipwhite
+
+syn match kconfigConfOptIfExprGroup '('
+ \ contained
+ \ nextgroup=@kconfigConfigOptionIfGExp
+ \ skipwhite
+
+" TODO: hm, this kind of recursion doesn't work right. We need another set of
+" expressions that have kconfigConfigOPtionIfGExp as nextgroup and a matcher
+" for '(' that sets it all off.
+syn cluster kconfigConfigOptionIfGExp contains=@kconfigConfOptIfGExpSym,
+ \ kconfigConfOptIfGExpNeg,
+ \ kconfigConfOptIfExprGroup
+
+syn cluster kconfigConfOptIfGExpSym contains=kconfigConfOptIfGExpCSym,
+ \ kconfigConfOptIfGExpNCSym
+
+syn match kconfigConfOptIfGExpCSym '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=@kconfigConfigIf,
+ \ kconfigConfOptIfGExpAnd,
+ \ kconfigConfOptIfGExpOr,
+ \ kconfigConfOptIfGExpEq,
+ \ kconfigConfOptIfGExpNEq
+ \ skipwhite skipnl
+
+syn match kconfigConfOptIfGExpCSym "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=@kconfigConfigIf,
+ \ kconfigConfOptIfGExpAnd,
+ \ kconfigConfOptIfGExpOr,
+ \ kconfigConfOptIfGExpEq,
+ \ kconfigConfOptIfGExpNEq
+ \ skipwhite skipnl
+
+syn match kconfigConfOptIfGExpNCSym '\<\k\+\>'
+ \ contained
+ \ nextgroup=kconfigConfOptIfExprGrpE,
+ \ kconfigConfOptIfGExpAnd,
+ \ kconfigConfOptIfGExpOr,
+ \ kconfigConfOptIfGExpEq,
+ \ kconfigConfOptIfGExpNEq
+ \ skipwhite skipnl
+
+syn cluster kconfigConfOptIfGExpSym2 contains=kconfigConfOptIfGExpCSym2,
+ \ kconfigConfOptIfGExpNCSym2
+
+syn match kconfigConfOptIfGExpEq '='
+ \ contained
+ \ nextgroup=@kconfigConfOptIfGExpSym2
+ \ skipwhite
+
+syn match kconfigConfOptIfGExpNEq '!='
+ \ contained
+ \ nextgroup=@kconfigConfOptIfGExpSym2
+ \ skipwhite
+
+syn match kconfigConfOptIfGExpCSym2 '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=kconfigConfOptIfExprGrpE,
+ \ kconfigConfOptIfGExpAnd,
+ \ kconfigConfOptIfGExpOr
+ \ skipwhite skipnl
+
+syn match kconfigConfOptIfGExpCSym2 "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfOptIfExprGrpE,
+ \ kconfigConfOptIfGExpAnd,
+ \ kconfigConfOptIfGExpOr
+ \ skipwhite skipnl
+
+syn match kconfigConfOptIfGExpNCSym2 '\<\k\+\>'
+ \ contained
+ \ nextgroup=kconfigConfOptIfExprGrpE,
+ \ kconfigConfOptIfGExpAnd,
+ \ kconfigConfOptIfGExpOr
+ \ skipwhite skipnl
+
+syn match kconfigConfOptIfGExpNeg '!'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionIfGExp
+ \ skipwhite
+
+syn match kconfigConfOptIfGExpAnd '&&'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionIfGExp
+ \ skipwhite
+
+syn match kconfigConfOptIfGExpOr '||'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionIfGExp
+ \ skipwhite
+
+syn match kconfigConfOptIfExprGrpE ')'
+ \ contained
+ \ nextgroup=@kconfigConfigOptions,
+ \ kconfigConfOptIfExprAnd,
+ \ kconfigConfOptIfExprOr
+ \ skipwhite skipnl
+
+
+syn cluster kconfigConfigOptionExpr contains=@kconfigConfOptExprSym,
+ \ kconfigConfOptExprNeg,
+ \ kconfigConfOptExprGroup
+
+syn cluster kconfigConfOptExprSym contains=kconfigConfOptExprCSym,
+ \ kconfigConfOptExprNCSym
+
+syn match kconfigConfOptExprCSym '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ kconfigConfOptExprAnd,
+ \ kconfigConfOptExprOr,
+ \ kconfigConfOptExprEq,
+ \ kconfigConfOptExprNEq,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigConfOptExprCSym "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ kconfigConfOptExprAnd,
+ \ kconfigConfOptExprOr,
+ \ kconfigConfOptExprEq,
+ \ kconfigConfOptExprNEq,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigConfOptExprNCSym '\<\k\+\>'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ kconfigConfOptExprAnd,
+ \ kconfigConfOptExprOr,
+ \ kconfigConfOptExprEq,
+ \ kconfigConfOptExprNEq,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn cluster kconfigConfOptExprSym2 contains=kconfigConfOptExprCSym2,
+ \ kconfigConfOptExprNCSym2
+
+syn match kconfigConfOptExprEq '='
+ \ contained
+ \ nextgroup=@kconfigConfOptExprSym2
+ \ skipwhite
+
+syn match kconfigConfOptExprNEq '!='
+ \ contained
+ \ nextgroup=@kconfigConfOptExprSym2
+ \ skipwhite
+
+syn match kconfigConfOptExprCSym2 '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ kconfigConfOptExprAnd,
+ \ kconfigConfOptExprOr,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigConfOptExprCSym2 "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ kconfigConfOptExprAnd,
+ \ kconfigConfOptExprOr,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigConfOptExprNCSym2 '\<\k\+\>'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ kconfigConfOptExprAnd,
+ \ kconfigConfOptExprOr,
+ \ @kconfigConfigOptions
+ \ skipwhite skipnl
+
+syn match kconfigConfOptExprNeg '!'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionExpr
+ \ skipwhite
+
+syn match kconfigConfOptExprAnd '&&'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionExpr
+ \ skipwhite
+
+syn match kconfigConfOptExprOr '||'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionExpr
+ \ skipwhite
+
+syn match kconfigConfOptExprGroup '('
+ \ contained
+ \ nextgroup=@kconfigConfigOptionGExp
+ \ skipwhite
+
+syn cluster kconfigConfigOptionGExp contains=@kconfigConfOptGExpSym,
+ \ kconfigConfOptGExpNeg,
+ \ kconfigConfOptGExpGroup
+
+syn cluster kconfigConfOptGExpSym contains=kconfigConfOptGExpCSym,
+ \ kconfigConfOptGExpNCSym
+
+syn match kconfigConfOptGExpCSym '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=kconfigConfOptExprGrpE,
+ \ kconfigConfOptGExpAnd,
+ \ kconfigConfOptGExpOr,
+ \ kconfigConfOptGExpEq,
+ \ kconfigConfOptGExpNEq
+ \ skipwhite skipnl
+
+syn match kconfigConfOptGExpCSym "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfOptExprGrpE,
+ \ kconfigConfOptGExpAnd,
+ \ kconfigConfOptGExpOr,
+ \ kconfigConfOptGExpEq,
+ \ kconfigConfOptGExpNEq
+ \ skipwhite skipnl
+
+syn match kconfigConfOptGExpNCSym '\<\k\+\>'
+ \ contained
+ \ nextgroup=kconfigConfOptExprGrpE,
+ \ kconfigConfOptGExpAnd,
+ \ kconfigConfOptGExpOr,
+ \ kconfigConfOptGExpEq,
+ \ kconfigConfOptGExpNEq
+ \ skipwhite skipnl
+
+syn cluster kconfigConfOptGExpSym2 contains=kconfigConfOptGExpCSym2,
+ \ kconfigConfOptGExpNCSym2
+
+syn match kconfigConfOptGExpEq '='
+ \ contained
+ \ nextgroup=@kconfigConfOptGExpSym2
+ \ skipwhite
+
+syn match kconfigConfOptGExpNEq '!='
+ \ contained
+ \ nextgroup=@kconfigConfOptGExpSym2
+ \ skipwhite
+
+syn match kconfigConfOptGExpCSym2 '"[^"\\]*\%(\\.[^"\\]*\)*"'
+ \ contained
+ \ nextgroup=kconfigConfOptExprGrpE,
+ \ kconfigConfOptGExpAnd,
+ \ kconfigConfOptGExpOr
+ \ skipwhite skipnl
+
+syn match kconfigConfOptGExpCSym2 "'[^'\\]*\%(\\.[^'\\]*\)*'"
+ \ contained
+ \ nextgroup=kconfigConfOptExprGrpE,
+ \ kconfigConfOptGExpAnd,
+ \ kconfigConfOptGExpOr
+ \ skipwhite skipnl
+
+syn match kconfigConfOptGExpNCSym2 '\<\k\+\>'
+ \ contained
+ \ nextgroup=kconfigConfOptExprGrpE,
+ \ kconfigConfOptGExpAnd,
+ \ kconfigConfOptGExpOr
+ \ skipwhite skipnl
+
+syn match kconfigConfOptGExpNeg '!'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionGExp
+ \ skipwhite
+
+syn match kconfigConfOptGExpAnd '&&'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionGExp
+ \ skipwhite
+
+syn match kconfigConfOptGExpOr '||'
+ \ contained
+ \ nextgroup=@kconfigConfigOptionGExp
+ \ skipwhite
+
+syn match kconfigConfOptExprGrpE ')'
+ \ contained
+ \ nextgroup=kconfigConfigOptionIf,
+ \ kconfigConfOptExprAnd,
+ \ kconfigConfOptExprOr
+ \ skipwhite skipnl
+
+syn sync minlines=50
+
+hi def link kconfigTodo Todo
+hi def link kconfigComment Comment
+hi def link kconfigKeyword Keyword
+hi def link kconfigPreProc PreProc
+hi def link kconfigConditional Conditional
+hi def link kconfigPrompt String
+hi def link kconfigKeywordPrompt kconfigPrompt
+hi def link kconfigPath String
+hi def link kconfigSymbol String
+hi def link kconfigConstantSymbol Constant
+hi def link kconfigConfigOption Type
+hi def link kconfigTypeDefinition kconfigConfigOption
+hi def link kconfigTypeDefPrompt kconfigPrompt
+hi def link kconfigInputPrompt kconfigConfigOption
+hi def link kconfigPromptPrompt kconfigPrompt
+hi def link kconfigDefaultValue kconfigConfigOption
+hi def link kconfigDependencies kconfigConfigOption
+hi def link kconfigReverseDependencies kconfigConfigOption
+hi def link kconfigRevDepCSymbol kconfigConstantSymbol
+hi def link kconfigRevDepNCSymbol kconfigSymbol
+hi def link kconfigNumericalRanges kconfigConfigOption
+hi def link kconfigRangeCSymbol kconfigConstantSymbol
+hi def link kconfigRangeNCSymbol kconfigSymbol
+hi def link kconfigRangeCSymbol2 kconfigConstantSymbol
+hi def link kconfigRangeNCSymbol2 kconfigSymbol
+hi def link kconfigHelpText Normal
+hi def link kconfigDefBool kconfigConfigOption
+hi def link kconfigDefBoolCSymbol kconfigConstantSymbol
+hi def link kconfigDefBoolNCSymbol kconfigSymbol
+hi def link kconfigOptional kconfigConfigOption
+hi def link kconfigConfigOptionIf Conditional
+hi def link kconfigConfOptIfExprCSym kconfigConstantSymbol
+hi def link kconfigConfOptIfExprNCSym kconfigSymbol
+hi def link kconfigOperator Operator
+hi def link kconfigConfOptIfExprEq kconfigOperator
+hi def link kconfigConfOptIfExprNEq kconfigOperator
+hi def link kconfigConfOptIfExprCSym2 kconfigConstantSymbol
+hi def link kconfigConfOptIfExprNCSym2 kconfigSymbol
+hi def link kconfigConfOptIfExprNeg kconfigOperator
+hi def link kconfigConfOptIfExprAnd kconfigOperator
+hi def link kconfigConfOptIfExprOr kconfigOperator
+hi def link kconfigDelimiter Delimiter
+hi def link kconfigConfOptIfExprGroup kconfigDelimiter
+hi def link kconfigConfOptIfGExpCSym kconfigConstantSymbol
+hi def link kconfigConfOptIfGExpNCSym kconfigSymbol
+hi def link kconfigConfOptIfGExpEq kconfigOperator
+hi def link kconfigConfOptIfGExpNEq kconfigOperator
+hi def link kconfigConfOptIfGExpCSym2 kconfigConstantSymbol
+hi def link kconfigConfOptIfGExpNCSym2 kconfigSymbol
+hi def link kconfigConfOptIfGExpNeg kconfigOperator
+hi def link kconfigConfOptIfGExpAnd kconfigOperator
+hi def link kconfigConfOptIfGExpOr kconfigOperator
+hi def link kconfigConfOptIfExprGrpE kconfigDelimiter
+hi def link kconfigConfOptExprCSym kconfigConstantSymbol
+hi def link kconfigConfOptExprNCSym kconfigSymbol
+hi def link kconfigConfOptExprEq kconfigOperator
+hi def link kconfigConfOptExprNEq kconfigOperator
+hi def link kconfigConfOptExprCSym2 kconfigConstantSymbol
+hi def link kconfigConfOptExprNCSym2 kconfigSymbol
+hi def link kconfigConfOptExprNeg kconfigOperator
+hi def link kconfigConfOptExprAnd kconfigOperator
+hi def link kconfigConfOptExprOr kconfigOperator
+hi def link kconfigConfOptExprGroup kconfigDelimiter
+hi def link kconfigConfOptGExpCSym kconfigConstantSymbol
+hi def link kconfigConfOptGExpNCSym kconfigSymbol
+hi def link kconfigConfOptGExpEq kconfigOperator
+hi def link kconfigConfOptGExpNEq kconfigOperator
+hi def link kconfigConfOptGExpCSym2 kconfigConstantSymbol
+hi def link kconfigConfOptGExpNCSym2 kconfigSymbol
+hi def link kconfigConfOptGExpNeg kconfigOperator
+hi def link kconfigConfOptGExpAnd kconfigOperator
+hi def link kconfigConfOptGExpOr kconfigOperator
+hi def link kconfigConfOptExprGrpE kconfigConfOptIfExprGroup
+
+else
+
+syn keyword kconfigTodo contained TODO FIXME XXX NOTE
+
+syn match kconfigComment display '#.*$' contains=kconfigTodo
+
+syn keyword kconfigKeyword config menuconfig comment mainmenu
+
+syn keyword kconfigConditional menu endmenu choice endchoice if endif
+
+syn keyword kconfigPreProc source
+ \ nextgroup=kconfigPath
+ \ skipwhite
+
+syn keyword kconfigTriState y m n
+
+syn match kconfigSpecialChar contained '\\.'
+syn match kconfigSpecialChar '\\$'
+
+syn region kconfigPath matchgroup=kconfigPath
+ \ start=+"+ skip=+\\\\\|\\\"+ end=+"+
+ \ contains=kconfigSpecialChar
+
+syn region kconfigPath matchgroup=kconfigPath
+ \ start=+'+ skip=+\\\\\|\\\'+ end=+'+
+ \ contains=kconfigSpecialChar
+
+syn match kconfigPath '\S\+'
+ \ contained
+
+syn region kconfigString matchgroup=kconfigString
+ \ start=+"+ skip=+\\\\\|\\\"+ end=+"+
+ \ contains=kconfigSpecialChar
+
+syn region kconfigString matchgroup=kconfigString
+ \ start=+'+ skip=+\\\\\|\\\'+ end=+'+
+ \ contains=kconfigSpecialChar
+
+syn keyword kconfigType bool boolean tristate string hex int
+
+syn keyword kconfigOption prompt default requires select range
+ \ optional
+syn match kconfigOption 'depends\%( on\)\='
+
+syn keyword kconfigMacro def_bool def_tristate
+
+syn region kconfigHelpText
+ \ matchgroup=kconfigOption
+ \ start='\%(help\|---help---\)\ze\s*\n\z(\s\+\)'
+ \ skip='^$'
+ \ end='^\z1\@!'
+
+syn sync match kconfigSyncHelp grouphere kconfigHelpText 'help\|---help---'
+
+hi def link kconfigTodo Todo
+hi def link kconfigComment Comment
+hi def link kconfigKeyword Keyword
+hi def link kconfigConditional Conditional
+hi def link kconfigPreProc PreProc
+hi def link kconfigTriState Boolean
+hi def link kconfigSpecialChar SpecialChar
+hi def link kconfigPath String
+hi def link kconfigString String
+hi def link kconfigType Type
+hi def link kconfigOption Identifier
+hi def link kconfigHelpText Normal
+hi def link kconfigmacro Macro
+
+endif
+
+let b:current_syntax = "kconfig"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/kivy.vim b/runtime/syntax/kivy.vim
new file mode 100644
index 0000000..b145503
--- /dev/null
+++ b/runtime/syntax/kivy.vim
@@ -0,0 +1,36 @@
+" Vim syntax file
+" Language: Kivy
+" Maintainer: Corey Prophitt <prophitt.corey@gmail.com>
+" Last Change: May 29th, 2014
+" Version: 1
+" URL: http://kivy.org/
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" Load Python syntax first (Python can be used within Kivy)
+syn include @pyth $VIMRUNTIME/syntax/python.vim
+
+" Kivy language rules can be found here
+" http://kivy.org/docs/guide/lang.html
+
+" Define Kivy syntax
+syn match kivyPreProc /#:.*/
+syn match kivyComment /#.*/
+syn match kivyRule /<\I\i*\(,\s*\I\i*\)*>:/
+syn match kivyAttribute /\<\I\i*\>/ nextgroup=kivyValue
+
+syn region kivyValue start=":" end=/$/ contains=@pyth skipwhite
+
+syn region kivyAttribute matchgroup=kivyIdent start=/[\a_][\a\d_]*:/ end=/$/ contains=@pyth skipwhite
+
+hi def link kivyPreproc PreProc
+hi def link kivyComment Comment
+hi def link kivyRule Function
+hi def link kivyIdent Statement
+hi def link kivyAttribute Label
+
+let b:current_syntax = "kivy"
+
+" vim: ts=8
diff --git a/runtime/syntax/kix.vim b/runtime/syntax/kix.vim
new file mode 100644
index 0000000..dd74378
--- /dev/null
+++ b/runtime/syntax/kix.vim
@@ -0,0 +1,170 @@
+" Vim syntax file
+" Language: KixTart 95, Kix2001 Windows script language http://kixtart.org/
+" Maintainer: Richard Howarth <rhowarth@sgb.co.uk>
+" Last Change: 2003 May 11
+" URL: http://www.howsoft.demon.co.uk/
+
+" KixTart files identified by *.kix extension.
+
+" Amendment History:
+" 26 April 2001: RMH
+" Removed development comments from distro version
+" Renamed "Kix*" to "kix*" for consistancy
+" Changes made in preperation for VIM version 5.8/6.00
+
+" TODO:
+" Handle arrays highlighting
+" Handle object highlighting
+" The next two may not be possible:
+" Work out how to error too many "(", i.e. (() should be an error.
+" Similarly, "if" without "endif" and similar constructs should error.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+syn keyword kixTODO TODO FIX XXX contained
+
+" Case insensitive language.
+syn case ignore
+
+" Kix statements
+syn match kixStatement "?"
+syn keyword kixStatement beep big break
+syn keyword kixStatement call cd cls color cookie1 copy
+syn keyword kixStatement del dim display
+syn keyword kixStatement exit
+syn keyword kixStatement flushkb
+syn keyword kixStatement get gets global go gosub goto
+syn keyword kixStatement md
+syn keyword kixStatement password play
+syn keyword kixStatement quit
+syn keyword kixStatement rd return run
+syn keyword kixStatement set setl setm settime shell sleep small
+syn keyword kixStatement use
+
+" Kix2001
+syn keyword kixStatement debug function endfunction redim
+
+" Simple variables
+syn match kixNotVar "\$\$\|@@\|%%" transparent contains=NONE
+syn match kixLocalVar "\$\w\+"
+syn match kixMacro "@\w\+"
+syn match kixEnvVar "%\w\+"
+
+" Destination labels
+syn match kixLabel ":\w\+\>"
+
+" Identify strings, trap unterminated strings
+syn match kixStringError +".*\|'.*+
+syn region kixDoubleString oneline start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=kixLocalVar,kixMacro,kixEnvVar,kixNotVar
+syn region kixSingleString oneline start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=kixLocalVar,kixMacro,kixEnvVar,kixNotVar
+
+" Operators
+syn match kixOperator "+\|-\|\*\|/\|=\|&\||"
+syn keyword kixOperator and or
+" Kix2001
+syn match kixOperator "=="
+syn keyword kixOperator not
+
+" Numeric constants
+syn match kixInteger "-\=\<\d\+\>" contains=NONE
+syn match kixFloat "-\=\.\d\+\>\|-\=\<\d\+\.\d\+\>" contains=NONE
+
+" Hex numeric constants
+syn match kixHex "\&\x\+\>" contains=NONE
+
+" Other contants
+" Kix2001
+syn keyword kixConstant on off
+
+" Comments
+syn match kixComment ";.*$" contains=kixTODO
+
+" Trap unmatched parenthesis
+syn match kixParenCloseError ")"
+syn region kixParen oneline transparent start="(" end=")" contains=ALLBUT,kixParenCloseError
+
+" Functions (Builtin + UDF)
+syn match kixFunction "\w\+("he=e-1,me=e-1 contains=ALL
+
+" Trap unmatched brackets
+syn match kixBrackCloseError "\]"
+syn region kixBrack transparent start="\[" end="\]" contains=ALLBUT,kixBrackCloseError
+
+" Clusters for ALLBUT shorthand
+syn cluster kixIfBut contains=kixIfError,kixSelectOK,kixDoOK,kixWhileOK,kixForEachOK,kixForNextOK
+syn cluster kixSelectBut contains=kixSelectError,kixIfOK,kixDoOK,kixWhileOK,kixForEachOK,kixForNextOK
+syn cluster kixDoBut contains=kixDoError,kixSelectOK,kixIfOK,kixWhileOK,kixForEachOK,kixForNextOK
+syn cluster kixWhileBut contains=kixWhileError,kixSelectOK,kixIfOK,kixDoOK,kixForEachOK,kixForNextOK
+syn cluster kixForEachBut contains=kixForEachError,kixSelectOK,kixIfOK,kixDoOK,kixForNextOK,kixWhileOK
+syn cluster kixForNextBut contains=kixForNextError,kixSelectOK,kixIfOK,kixDoOK,kixForEachOK,kixWhileOK
+" Condtional construct errors.
+syn match kixIfError "\<if\>\|\<else\>\|\<endif\>"
+syn match kixIfOK contained "\<if\>\|\<else\>\|\<endif\>"
+syn region kixIf transparent matchgroup=kixIfOK start="\<if\>" end="\<endif\>" contains=ALLBUT,@kixIfBut
+syn match kixSelectError "\<select\>\|\<case\>\|\<endselect\>"
+syn match kixSelectOK contained "\<select\>\|\<case\>\|\<endselect\>"
+syn region kixSelect transparent matchgroup=kixSelectOK start="\<select\>" end="\<endselect\>" contains=ALLBUT,@kixSelectBut
+
+" Program control constructs.
+syn match kixDoError "\<do\>\|\<until\>"
+syn match kixDoOK contained "\<do\>\|\<until\>"
+syn region kixDo transparent matchgroup=kixDoOK start="\<do\>" end="\<until\>" contains=ALLBUT,@kixDoBut
+syn match kixWhileError "\<while\>\|\<loop\>"
+syn match kixWhileOK contained "\<while\>\|\<loop\>"
+syn region kixWhile transparent matchgroup=kixWhileOK start="\<while\>" end="\<loop\>" contains=ALLBUT,@kixWhileBut
+syn match kixForNextError "\<for\>\|\<to\>\|\<step\>\|\<next\>"
+syn match kixForNextOK contained "\<for\>\|\<to\>\|\<step\>\|\<next\>"
+syn region kixForNext transparent matchgroup=kixForNextOK start="\<for\>" end="\<next\>" contains=ALLBUT,@kixForBut
+syn match kixForEachError "\<for each\>\|\<in\>\|\<next\>"
+syn match kixForEachOK contained "\<for each\>\|\<in\>\|\<next\>"
+syn region kixForEach transparent matchgroup=kixForEachOK start="\<for each\>" end="\<next\>" contains=ALLBUT,@kixForEachBut
+
+" Expressions
+syn match kixExpression "<\|>\|<=\|>=\|<>"
+
+
+" Default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/krl.vim b/runtime/syntax/krl.vim
new file mode 100644
index 0000000..a507908
--- /dev/null
+++ b/runtime/syntax/krl.vim
@@ -0,0 +1,458 @@
+" Vim syntax file
+" Language: Kuka Robot Language
+" Maintainer: Patrick Meiser-Knosowski <knosowski@graeffrobotics.de>
+" Version: 3.0.0
+" Last Change: 18. Apr 2022
+" Credits: Thanks for contributions to this to Michael Jagusch
+" Thanks for beta testing to Thomas Baginski
+"
+" Note to self:
+" for testing perfomance
+" open a 1000 lines file.
+" :syntime on
+" G
+" hold down CTRL-U until reaching top
+" :syntime report
+
+" Init {{{
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+" if colorscheme is tortus(less)? krlGroupName defaults to 1
+if get(g:, 'colors_name', " ") =~ '\<tortus'
+ \&& !exists("g:krlGroupName")
+ let g:krlGroupName=1
+endif
+" krlGroupName defaults to 0 if it's not initialized yet or 0
+if !get(g:, "krlGroupName", 0)
+ let g:krlGroupName = 0
+endif
+
+" krl does ignore case
+syn case ignore
+" take #, $ and & into keyword (syntax only)
+syn iskeyword @,48-57,_,192-255,#,$,&
+" spell checking
+syn spell notoplevel
+" }}} init
+
+" Comment and Folding {{{
+
+" Special Comment
+
+" TODO Comment
+syn keyword krlTodo contained TODO FIXME XXX
+highlight default link krlTodo Todo
+
+" Debug Comment
+syn keyword krlDebug contained DEBUG
+highlight default link krlDebug Debug
+
+" Comment
+" none move fold comment until second ;
+syn match krlFoldComment /\c\v^\s*;\s*%(end)?fold>[^;]*/ containedin=krlFold contains=krlSingleQuoteString,krlInteger,krlFloat,krlMovement,krlDelimiter,krlBoolean
+highlight default link krlFoldComment Comment
+
+" move fold comment until second ;
+syn match krlMoveFoldComment /\c\v^\s*;\s*fold>[^;]*<s?%(ptp|lin|circ|spl)(_rel)?>[^;]*/ containedin=krlFold contains=krlInteger,krlFloat,krlMovement,krlDelimiter
+highlight default link krlMoveFoldComment Comment
+
+" things to highlight in a fold line
+syn keyword krlFoldHighlights CONT IN SYN OUT containedin=krlFoldComment
+syn match krlFoldHighlights /\c\v<(M|F|E|A|t|i|bin|binin|UP|SPSMAKRO)\d+>/ containedin=krlFoldComment
+if g:krlGroupName
+ highlight default link krlFoldHighlights Sysvars
+else
+ " default color for Fold Highlights
+endif
+syn keyword krlVkrcFoldConstants EIN AUS containedin=krlFoldComment
+highlight default link krlVkrcFoldConstants Boolean
+
+" Comment without Fold, also includes endfold lines and fold line part after second ;
+syn match krlComment /\c\v;\s*%(<%(end)?fold>)@!.*$/ containedin=krlFold contains=krlTodo,krlDebug,@Spell
+" Commented out Fold line: "; ;FOLD PTP..."
+syn match krlComment /\c\v^\s*;\s*;.*$/ contains=krlTodo,krlDebug
+highlight default link krlComment Comment
+
+if has("conceal") && get(g:, 'krlConcealFoldTail', 1)
+ syn match krlConcealFoldTail /\c\v(^\s*;\s*fold[^;]*)@250<=;%(--|\s*<fold>|\s*<endfold>)@!.*$/ transparent containedin=krlComment conceal cchar=*
+endif
+" }}} Comment and Folding
+
+" Header {{{
+syn match krlHeader /&\a\w*/
+highlight default link krlHeader PreProc
+" }}} Header
+
+" Operator {{{
+" Boolean operator
+syn keyword krlBoolOperator and or exor not b_and b_or b_exor b_not
+highlight default link krlBoolOperator Operator
+" Arithmetic operator
+syn match krlArithOperator /[+-]/ containedin=krlFloat
+syn match krlArithOperator /[*/]/
+highlight default link krlArithOperator Operator
+" Compare operator
+syn match krlCompOperator /[<>=]/
+highlight default link krlCompOperator Operator
+" Geometric operator
+" Do not move the : operator
+" Must be present befor krlParamdef
+syn match krlGeomOperator /[:]/
+" syn match krlGeomOperator /[:]/ containedin=krlLabel,krlParamdef
+highlight default link krlGeomOperator Operator
+" }}} Operator
+
+" Type, StorageClass and Typedef {{{
+" Simple data types
+syn keyword krlType bool char real int containedin=krlAnyType
+" External program and function
+syn keyword krlType ext extfct extfctp extp containedin=krlAnyType
+" Communication
+syn keyword krlType signal channel containedin=krlAnyType
+highlight default link krlType Type
+" StorageClass
+syn keyword krlStorageClass decl global const struc enum
+highlight default link krlStorageClass StorageClass
+" .dat file public
+syn keyword krlDatStorageClass public
+highlight default link krlDatStorageClass StorageClass
+" Parameter StorageClass
+" Do not move the :in/:out
+" Must be present after krlGeomOperator
+syn match krlParamdef /[:]\s*in\>/
+syn match krlParamdef /[:]\s*out\>/
+highlight default link krlParamdef StorageClass
+" Not a typedef but I like to have those highlighted
+" different then types, structures or strorage classes
+syn keyword krlTypedef DEF DEFFCT ENDFCT DEFDAT ENDDAT
+syn match krlTypedef /^\s*END\>/
+highlight default link krlTypedef Typedef
+" }}} Type, StorageClass and Typedef
+
+" Delimiter {{{
+syn match krlDelimiter /[\[\](),\\]/
+highlight default link krlDelimiter Delimiter
+" }}} Delimiter
+
+" Constant values {{{
+" Boolean
+syn keyword krlBoolean true false containedin=krlStructVal
+highlight default link krlBoolean Boolean
+" Binary integer
+syn match krlBinaryInt /'b[01]\+'/ containedin=krlStructVal
+highlight default link krlBinaryInt Number
+" Hexadecimal integer
+syn match krlHexInt /'h[0-9a-fA-F]\+'/ containedin=krlStructVal
+highlight default link krlHexInt Number
+" Integer
+syn match krlInteger /\W\@1<=[+-]\?\d\+/ containedin=krlStructVal,krlFloat contains=krlArithOperator
+highlight default link krlInteger Number
+" Float
+syn match krlFloat /\v\W@1<=[+-]?\d+\.?\d*%(\s*[eE][+-]?\d+)?/ containedin=krlStructVal
+highlight default link krlFloat Float
+" String
+syn region krlString start=/"/ end=/"/ oneline containedin=krlStructVal contains=@Spell
+highlight default link krlString String
+syn match krlSpecialChar /[|]/ containedin=krlString
+highlight default link krlSpecialChar SpecialChar
+" String within a fold line
+syn region krlSingleQuoteString start=/'/ end=/'/ oneline contained contains=@Spell
+highlight default link krlSingleQuoteString String
+" Enum
+syn match krlEnumVal /#\s*\a\w*/ containedin=krlStructVal
+highlight default link krlEnumVal Constant
+" }}} Constant values
+
+" Predefined Structure and Enum {{{
+" Predefined structures and enums found in
+" /r1/mada/$*.dat, /r1/steu/$*.dat and
+" /r1/system/$config.dat as well as
+" basisTech, gripperTech and spotTech
+"
+" Predefined data types found in krc1
+syn keyword krlStructure servopara keymove powermodul trace techangle tech techfct techcps techfctctrl axis_inc axis_cal date display_var pro_ip con bus
+syn keyword krlEnum ident_state sig_state move_state async_state emt_mode boxmode msg_prm_typ msg_typ cmd_stat asys trace_state trace_mode direction techsys techgeoref techclass techmode hpu_key_val pro_state eax transsys mode_move cosys device rotsys emstop cause_t
+"
+" Predefined data types found in kss functions
+syn keyword krlEnum ediagstate rdc_fs_state ret_c_psync_e var_type cancel_psync_e sys_vars
+syn keyword krlStructure siginf rw_rdc_file rw_mam_file diagpar_t error_t stopmess case_sense_t msgbuf_t e3pos e3axis diagopt_t
+"
+" Predefined structures for movement
+syn keyword krlStructure frame e6pos pos e6axis axis
+syn keyword krlStructure fdat ldat pdat
+syn keyword krlStructure load inertia
+"
+" Predefined structures for shapes
+syn keyword krlStructure axbox cylinder box
+"
+" Predefined structures and enums found in /r1/mada/$machine.dat
+syn keyword krlStructure cp fra acc_car jerk_struc dhart spin trpspin ex_kin et_ax maxtool
+syn keyword krlEnum individual_mames supply_voltage kinclass main_axis wrist_axis sw_onoff
+"
+" Predefined structures and enums found in /r1/mada/$robcor.dat
+" syn keyword krlStructure
+syn keyword krlEnum adap_acc model_type control_parameter eko_mode
+"
+" Predefined structures and enums found in /steu/mada/$custom.dat
+syn keyword krlStructure pro_io_t ser ext_mod_t coop_krc ws_config bin_type coop_update_t ldc_reaction
+syn keyword krlEnum axis_of_coordinates spline_para_variant target_status cp_vel_type cp_statmon
+"
+" Predefined structures and enums found in /steu/mada/$machine.dat
+syn keyword krlStructure emstop_path boxstatesafein boxstatesafeout
+syn keyword krlEnum digincode
+"
+" Predefined structures and enums found in /steu/mada/$option.dat
+syn keyword krlStructure msg_t
+" syn keyword krlEnum
+"
+" Predefined structures and enums found in /r1/system/$config.dat
+" BasisTech
+syn keyword krlStructure dig_out_type ctrl_in_t ctrl_out_t fct_out_t fct_in_t odat basis_sugg_t out_sugg_t md_state machine_def_t machine_tool_t machine_frame_t trigger_para constvel_para condstop_para adat tm_sugg_t tqm_tqdat_t sps_prog_type
+syn keyword krlEnum bas_command out_modetype ipo_m_t apo_mode_t funct_type p00_command timer_actiontype
+"
+" GripperTech
+syn keyword krlStructure grp_typ grp_types grp_sugg_t
+syn keyword krlEnum on_off_typ apo_typ
+"
+" SpotTech
+syn keyword krlStructure spot_type spot_sugg_t
+syn keyword krlEnum s_command s_pair_slct command_retr
+"
+" VW
+syn keyword krlStructure vw_mpara_typ zangentyp zangenbedingung ibszangentyp last_ibs_typ verr_typ verrcheck_t t_fb_state kollisionsdaten state_t modus_t
+syn keyword krlEnum synctype dir_typ subtype ari_typ bool_typ vw_command ibgn_command vw_user_cmd move_types adv_t_type bas_type ibs_mode_typ vw_user_cmd pro_mode mode_op
+"
+" ProgCoop
+syn keyword krlStructure ydat
+" syn keyword krlEnum
+"
+" bas.src
+syn keyword krlStructure cont
+syn keyword krlEnum esys ipo_mode circ_mode circ_type ori_type var_state
+"
+" MsgLib.src
+syn keyword krlStructure KrlMsg_T KrlMsgParType_T KrlMsgPar_T KrlMsgOpt_T KrlMsgDlgSK_T
+syn keyword krlEnum EKrlMsgType
+"
+highlight default link krlStructure Structure
+highlight default link krlEnum Structure
+" }}} Predefined Structure and Enum
+
+" System variable {{{
+syn match krlSysvars /\<\$\a[a-zA-Z0-9_.]*/
+if g:krlGroupName
+ highlight default link krlSysvars Sysvars
+else
+ " default color for Sysvars
+endif
+" }}} System variable
+
+" Statements, keywords et al {{{
+" continue
+syn keyword krlContinue continue
+if g:krlGroupName
+ highlight default link krlContinue Continue
+else
+ highlight default link krlContinue Statement
+endif
+" interrupt
+syn match krlStatement /\v\c%(<global>\s+)?<INTERRUPT>%(\s+<decl>)?/ contains=krlStorageClass
+" keywords
+syn keyword krlStatement wait on off enable disable stop trigger with when distance onstart delay do prio import is minimum maximum confirm on_error_proceed
+syn match krlStatement /\v\c%(<wait\s+)@7<=<sec>/
+syn match krlStatement /\v\c%(<when\s+)@7<=<path>/
+highlight default link krlStatement Statement
+" Conditional
+syn keyword krlConditional if then else endif switch case default endswitch skip endskip
+highlight default link krlConditional Conditional
+" Repeat
+syn keyword krlRepeat for to step endfor while endwhile repeat until loop endloop exit
+highlight default link krlRepeat Repeat
+" Label
+syn keyword krlLabel goto
+syn match krlLabel /^\s*\w\+:\ze\s*\%(;.*\)\?$/
+highlight default link krlLabel Label
+" Keyword
+syn keyword krlKeyword anin anout digin
+highlight default link krlKeyword Keyword
+" Exception
+syn keyword krlException return resume halt
+highlight default link krlException Exception
+" }}} Statements, keywords et al
+
+" special keywords for movement commands {{{
+syn keyword krlMovement PTP PTP_REL LIN LIN_REL CIRC CIRC_REL SPL SPL_REL SPTP SPTP_REL SLIN SLIN_REL SCIRC SCIRC_REL
+syn keyword krlMovement ASYPTP ASYCONT ASYSTOP ASYCANCEL MOVE_EMI
+syn match krlMovement /\v\c^\s*<BRAKE(\s+F)?>/
+if g:krlGroupName
+ highlight default link krlMovement Movement
+else
+ highlight default link krlMovement Special
+endif
+" movement modifiers
+syn match krlMoveBlockInst /\c\v^\s*TIME_BLOCK\s+(START|PART|END)/
+syn match krlMoveBlockInst /\c\v^\s*CONST_VEL\s+(START|END)/
+syn keyword krlMoveBlockInst ptp_spline spline endspline
+highlight default link krlMoveBlockInst Statement
+syn keyword krlMoveMod ca c_ptp c_dis c_vel c_ori c_spl
+if g:krlGroupName
+ highlight default link krlMoveMod Movement
+else
+ highlight default link krlMoveMod Special
+endif
+" }}} special keywords for movement commands
+
+" Structure value {{{
+" avoid coloring structure component names
+syn match krlNames /\.[a-zA-Z_][.a-zA-Z0-9_$]*/
+syn match krlNames contained /[a-zA-Z_][.a-zA-Z0-9_$]*/
+" highlight default link krlNames None
+" Structure value
+syn region krlStructVal start=/{/ end=/}/ oneline containedin=krlStructVal contains=krlNames
+highlight default link krlStructVal Delimiter
+" }}} Structure value
+
+" BuildInFunction {{{
+syn keyword krlBuildInFunction contained Pulse
+syn keyword krlBuildInFunction contained m_comment
+syn keyword krlBuildInFunction contained is_key_pressed
+syn keyword krlBuildInFunction contained set_opt_filter
+syn keyword krlBuildInFunction contained timer_limit
+syn keyword krlBuildInFunction contained tool_adj
+syn keyword krlBuildInFunction contained FRand
+syn keyword krlBuildInFunction contained ExecFunc eb_test EB EK EO LK mbx_rec
+" safe robot
+syn keyword krlbuildinfunction contained get_AxesMask get_BrakeTest_Time
+" math
+syn keyword krlBuildInFunction contained Abs Sin Cos Acos Tan Atan Atan2 Sqrt
+syn keyword krlBuildInFunction contained Forward Inverse inv_pos
+" cFoo sFoo
+syn keyword krlBuildInFunction contained cClose cOpen cRead cWrite sRead sWrite
+" string
+syn keyword krlBuildInFunction contained StrToBool StrToInt StrToReal StrToString StrToFrame StrToPos StrToE3Pos StrToE6Pos StrToAxis StrToE3Axis StrToE6Axis
+syn keyword krlBuildInFunction contained StrAdd StrClear StrCopy StrComp StrFind StrLen StrDeclLen StrToBool StrToInt StrToReal StrToString
+" diag
+syn keyword krlBuildInFunction contained diag_start diag_stop get_DiagState
+" rdc mam pid
+syn keyword krlBuildInFunction contained CheckPidOnRdc check_mam_on_rdc get_rdc_fs_state
+syn keyword krlBuildInFunction contained set_mam_on_hd copy_mam_hd_to_rdc copy_mam_rdc_to_hd
+syn keyword krlBuildInFunction contained PidToHd PidToRdc
+syn keyword krlBuildInFunction contained cal_to_rdc rdc_file_to_hd
+syn keyword krlBuildInFunction contained delete_pid_on_rdc delete_rdc_content
+syn keyword krlBuildInFunction contained create_rdc_archive restore_rdc_archive
+" ioctl
+syn keyword krlBuildInFunction contained IOCtl cIOCtl
+syn keyword krlBuildInFunction contained WSpaceGive WSpaceTake
+" sync
+syn keyword krlBuildInFunction contained Sync SyncCmd CancelProgSync
+" remote
+syn keyword krlBuildInFunction contained RemoteCmd RemoteRead
+" msg/dlg
+syn keyword krlBuildInFunction contained IsMessageSet clear_KrlMsg get_MsgBuffer exists_KrlDlg exists_KrlMsg set_KrlDlg set_KrlDlgAnswer set_KrlMsg
+" robvers
+syn keyword krlBuildInFunction contained maximize_UsedxRobvers set_UsedxRobvers
+" md_foo
+syn keyword krlBuildInFunction contained md_Cmd md_GetState md_SetState md_Asgn
+" emi
+syn keyword krlBuildInFunction contained emi_ActPos emi_EndPos emi_StartPos emi_RecState emi_RecName
+" var
+syn keyword krlBuildInFunction contained cast_from cast_to
+syn keyword krlBuildInFunction contained GetVarsize GetCycDef get_sig_inf get_decl_place VarType VarState
+" sys
+syn keyword krlBuildInFunction contained GetSysState get_system_data set_system_data set_system_data_delayed
+" err
+syn keyword krlBuildInFunction contained err_clear err_raise
+" motion
+syn keyword krlBuildInFunction contained delete_backward_buffer rob_stop rob_stop_release set_brake_delay suppress_repositioning VectorMoveOn VectorMoveOff
+" torque
+syn keyword krlBuildInFunction contained set_torque_limits reset_torque_limits
+" krc1
+syn keyword krlBuildInFunction contained cLcopy cCurpos cNew cClear cRelease cKey
+if g:krlGroupName
+ highlight default link krlBuildInFunction BuildInFunction
+else
+ highlight default link krlBuildInFunction Function
+endif
+" }}} BuildInFunction
+
+" Function {{{
+syn match krlFunction /[a-zA-Z_]\w* *(/me=e-1 contains=krlBuildInFunction
+highlight default link krlFunction Function
+" }}} Function
+
+" Error {{{
+if get(g:, 'krlShowError', 1)
+ " some more or less common typos
+ "
+ " vars or funcs >24 chars are not possible in krl. a234567890123456789012345
+ syn match krlError0 /\w\{25,}/ containedin=krlFunction,krlNames,krlLabel,krlAnyType,krlEnumVal,krlSysvars
+ "
+ " should be interrupt (on|off) \w+
+ syn match krlError1 /\vinterrupt[ \t(]+[_$a-zA-Z0-9]+[_$a-zA-Z0-9.\[\]()+\-*/]*[ \t)]+o%(n|ff)>/
+ "
+ " for bla==5 to 7...
+ " ||
+ syn match krlError3 /\v%(^\s*for%(\(|\s)+[_$a-zA-Z]+[_$a-zA-Z0-9.\[\]()+\-*/ ]*\s*)@<=[:=]\=/
+ "
+ " TODO optimize performance
+ " wait for a=b
+ " |
+ syn match krlError4 /\v%(^\s*%(return|wait\s+for|if|while|until|%(global\s+)?interrupt\s+decl)>[^;]+[^;<>=])@<=\=[^=]/
+ "
+ " wait for a><b
+ " ||
+ syn match krlError5 /\v%(^\s*%(return|wait\s+for|if|while|until|%(global\s+)?interrupt\s+decl)>[^;]+)@<=\>\s*\</
+ "
+ " if (a==5) (b==6) ...
+ " |||
+ syn match krlError6 /\v%(^\s*%(return|wait\s+for|if|while|until|%(global\s+)?interrupt\s+decl)>[^;]+[^;])@<=\)\s*\(/
+ "
+ " TODO optimize performance
+ " a == b + 1
+ " a := b + 1
+ " ||
+ syn match krlError7 /\v%(^\s*%(return|wait\s+for|if|while|until|%(global\s+)?interrupt\s+decl)>[^;]+[^;])@1<!%(^\s*[_$a-zA-Z]+[_$a-zA-Z0-9.\[\],+\-*/]*\s*)@<=[:=]\=/
+ syn match krlError7 /\v\c%(^\s*%(decl\s+)%(global\s+)?%(const\s+)?\w+\s+\w+\s*)@<=[:=]\=/
+ syn match krlError7 /\v\c%(^\s*%(decl\s+)?%(global\s+)?%(const\s+)?%(bool\s+|int\s+|real\s+|char\s+)\w+\s*)@<=[:=]\=/
+ "
+ " this one is tricky. Make sure this does not match trigger instructions; OK, next try, now search for false positives
+ " TODO optimize performance
+ " a = b and c or (int1=int2)
+ " |
+ syn match krlError8 /\v(^\s*[_$a-zA-Z]+[_$a-zA-Z0-9.\[\]()+\-*/]*\s*\=[^;]*[^;<>=])@<=\=\ze[^=]/
+ "
+ " <(distance|delay|prio)> :=
+ " <(distance|delay|prio)> ==
+ " ||
+ syn match krlError9 /\v(^[^;]*<(distance|delay|prio|minimum|maximum)\s*)@<=[:=]\=/
+ "
+ " 'for', 'while' or 'repeat' followed by 'do'
+ syn match krlError10 /\c\v^\s*(until|while|for)>[^;]*<do>/
+ "
+ highlight default link krlError0 Error
+ highlight default link krlError1 Error
+ highlight default link krlError2 Error
+ highlight default link krlError3 Error
+ highlight default link krlError4 Error
+ highlight default link krlError5 Error
+ highlight default link krlError6 Error
+ highlight default link krlError7 Error
+ highlight default link krlError8 Error
+ highlight default link krlError9 Error
+ highlight default link krlError10 Error
+endif
+" }}} Error
+
+" Finish {{{
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+let b:current_syntax = "krl"
+" }}} Finish
+
+" vim:sw=2 sts=2 et fdm=marker
diff --git a/runtime/syntax/kscript.vim b/runtime/syntax/kscript.vim
new file mode 100644
index 0000000..e677620
--- /dev/null
+++ b/runtime/syntax/kscript.vim
@@ -0,0 +1,57 @@
+" Vim syntax file
+" Language: kscript
+" Maintainer: Thomas Capricelli <orzel@yalbi.com>
+" 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 $
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword kscriptPreCondit import from
+
+syn keyword kscriptHardCoded print println connect length arg mid upper lower isEmpty toInt toFloat findApplication
+syn keyword kscriptConditional if else switch
+syn keyword kscriptRepeat while for do foreach
+syn keyword kscriptExceptions emit catch raise try signal
+syn keyword kscriptFunction class struct enum
+syn keyword kscriptConst FALSE TRUE false true
+syn keyword kscriptStatement return delete
+syn keyword kscriptLabel case default
+syn keyword kscriptStorageClass const
+syn keyword kscriptType in out inout var
+
+syn keyword kscriptTodo contained TODO FIXME XXX
+
+syn region kscriptComment start="/\*" end="\*/" contains=kscriptTodo
+syn match kscriptComment "//.*" contains=kscriptTodo
+syn match kscriptComment "#.*$" contains=kscriptTodo
+
+syn region kscriptString start=+'+ end=+'+ skip=+\\\\\|\\'+
+syn region kscriptString start=+"+ end=+"+ skip=+\\\\\|\\"+
+syn region kscriptString start=+"""+ end=+"""+
+syn region kscriptString start=+'''+ end=+'''+
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "kscript"
+
+" vim: ts=8
diff --git a/runtime/syntax/kwt.vim b/runtime/syntax/kwt.vim
new file mode 100644
index 0000000..ecda5bb
--- /dev/null
+++ b/runtime/syntax/kwt.vim
@@ -0,0 +1,70 @@
+" Vim syntax file
+" Language: kimwitu++
+" Maintainer: Michael Piefel <entwurf@piefel.de>
+" Last Change: 2 May 2001
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the C++ syntax to start with
+runtime! syntax/cpp.vim
+unlet b:current_syntax
+
+" kimwitu++ extentions
+
+" Don't stop at eol, messes around with CPP mode, but gives line spanning
+" strings in unparse rules
+syn region cCppString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial,cFormat
+syn keyword cType integer real casestring nocasestring voidptr list
+syn keyword cType uview rview uview_enum rview_enum
+
+" avoid unparsing rule sth:view being scanned as label
+syn clear cUserCont
+syn match cUserCont "^\s*\I\i*\s*:$" contains=cUserLabel contained
+syn match cUserCont ";\s*\I\i*\s*:$" contains=cUserLabel contained
+syn match cUserCont "^\s*\I\i*\s*:[^:]"me=e-1 contains=cUserLabel contained
+syn match cUserCont ";\s*\I\i*\s*:[^:]"me=e-1 contains=cUserLabel contained
+
+" highlight phylum decls
+syn match kwtPhylum "^\I\i*:$"
+syn match kwtPhylum "^\I\i*\s*{\s*\(!\|\I\)\i*\s*}\s*:$"
+
+syn keyword kwtStatement with foreach afterforeach provided
+syn match kwtDecl "%\(uviewvar\|rviewvar\)"
+syn match kwtDecl "^%\(uview\|rview\|ctor\|dtor\|base\|storageclass\|list\|attr\|member\|option\)"
+syn match kwtOption "no-csgio\|no-unparse\|no-rewrite\|no-printdot\|no-hashtables\|smart-pointer\|weak-pointer"
+syn match kwtSep "^%}$"
+syn match kwtSep "^%{\(\s\+\I\i*\)*$"
+syn match kwtCast "\<phylum_cast\s*<"me=e-1
+syn match kwtCast "\<phylum_cast\s*$"
+
+
+" match views, remove paren error in brackets
+syn clear cErrInBracket
+syn match cErrInBracket contained ")"
+syn match kwtViews "\(\[\|<\)\@<=[ [:alnum:]_]\{-}:"
+
+" match rule bodies
+syn region kwtUnpBody transparent keepend extend fold start="->\s*\[" start="^\s*\[" skip="\$\@<!{\_.\{-}\$\@<!}" end="\s]\s\=;\=$" end="^]\s\=;\=$" end="}]\s\=;\=$"
+syn region kwtRewBody transparent keepend extend fold start="->\s*<" start="^\s*<" end="\s>\s\=;\=$" end="^>\s\=;\=$"
+
+" Define the default highlighting.
+" 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
+
+let b:current_syntax = "kwt"
+
+" vim: ts=8
diff --git a/runtime/syntax/lace.vim b/runtime/syntax/lace.vim
new file mode 100644
index 0000000..9a83851
--- /dev/null
+++ b/runtime/syntax/lace.vim
@@ -0,0 +1,122 @@
+" Vim syntax file
+" Language: lace
+" Maintainer: Jocelyn Fiat <utilities@eiffel.com>
+" Last Change: 2001 May 09
+
+" Copyright Interactive Software Engineering, 1998
+" You are free to use this file as you please, but
+" if you make a change or improvement you must send
+" it to the maintainer at <utilities@eiffel.com>
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" LACE is case insensitive, but the style guide lines are not.
+
+if !exists("lace_case_insensitive")
+ syn case match
+else
+ syn case ignore
+endif
+
+" A bunch of useful LACE keywords
+syn keyword laceTopStruct system root default option visible cluster
+syn keyword laceTopStruct external generate end
+syn keyword laceOptionClause collect assertion debug optimize trace
+syn keyword laceOptionClause profile inline precompiled multithreaded
+syn keyword laceOptionClause exception_trace dead_code_removal
+syn keyword laceOptionClause array_optimization
+syn keyword laceOptionClause inlining_size inlining
+syn keyword laceOptionClause console_application dynamic_runtime
+syn keyword laceOptionClause line_generation
+syn keyword laceOptionMark yes no all
+syn keyword laceOptionMark require ensure invariant loop check
+syn keyword laceClusterProp use include exclude
+syn keyword laceAdaptClassName adapt ignore rename as
+syn keyword laceAdaptClassName creation export visible
+syn keyword laceExternal include_path object makefile
+
+" Operators
+syn match laceOperator "\$"
+syn match laceBrackets "[[\]]"
+syn match laceExport "[{}]"
+
+" Constants
+syn keyword laceBool true false
+syn keyword laceBool True False
+syn region laceString start=+"+ skip=+%"+ end=+"+ contains=laceEscape,laceStringError
+syn match laceEscape contained "%[^/]"
+syn match laceEscape contained "%/\d\+/"
+syn match laceEscape contained "^[ \t]*%"
+syn match laceEscape contained "%[ \t]*$"
+syn match laceStringError contained "%/[^0-9]"
+syn match laceStringError contained "%/\d\+[^0-9/]"
+syn match laceStringError "'\(%[^/]\|%/\d\+/\|[^'%]\)\+'"
+syn match laceCharacter "'\(%[^/]\|%/\d\+/\|[^'%]\)'" contains=laceEscape
+syn match laceNumber "-\=\<\d\+\(_\d\+\)*\>"
+syn match laceNumber "\<[01]\+[bB]\>"
+syn match laceNumber "-\=\<\d\+\(_\d\+\)*\.\(\d\+\(_\d\+\)*\)\=\([eE][-+]\=\d\+\(_\d\+\)*\)\="
+syn match laceNumber "-\=\.\d\+\(_\d\+\)*\([eE][-+]\=\d\+\(_\d\+\)*\)\="
+syn match laceComment "--.*" contains=laceTodo
+
+
+syn case match
+
+" Case sensitive stuff
+
+syn keyword laceTodo TODO XXX FIXME
+syn match laceClassName "\<[A-Z][A-Z0-9_]*\>"
+syn match laceCluster "[a-zA-Z][a-zA-Z0-9_]*\s*:"
+syn match laceCluster "[a-zA-Z][a-zA-Z0-9_]*\s*(\s*[a-zA-Z][a-zA-Z0-9_]*\s*)\s*:"
+
+" Catch mismatched parentheses
+syn match laceParenError ")"
+syn match laceBracketError "\]"
+syn region laceGeneric transparent matchgroup=laceBrackets start="\[" end="\]" contains=ALLBUT,laceBracketError
+syn region laceParen transparent start="(" end=")" contains=ALLBUT,laceParenError
+
+" Should suffice for even very long strings and expressions
+syn sync lines=40
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=4
diff --git a/runtime/syntax/latte.vim b/runtime/syntax/latte.vim
new file mode 100644
index 0000000..e30ae42
--- /dev/null
+++ b/runtime/syntax/latte.vim
@@ -0,0 +1,81 @@
+" Vim syntax file
+" Language: Latte
+" Maintainer: Nick Moffitt, <nick@zork.net>
+" Last Change: 14 June, 2000
+"
+" Notes:
+" I based this on the TeX and Scheme syntax files (but mostly scheme).
+" See http://www.latte.org for info on the language.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match latteError "[{}\\]"
+syn match latteOther "\\{"
+syn match latteOther "\\}"
+syn match latteOther "\\\\"
+
+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
+syn region latteString start=+\\"+ skip=+\\\\"+ end=+\\"+
+
+syn region latteGroup matchgroup=Delimiter start="{" skip="\\[{}]" matchgroup=Delimiter end="}" contains=ALLBUT,latteSyntax
+
+syn region latteUnquote matchgroup=Delimiter start="\\,{" skip="\\[{}]" matchgroup=Delimiter end="}" contains=ALLBUT,latteSyntax
+syn region latteSplice matchgroup=Delimiter start="\\,@{" skip="\\[{}]" matchgroup=Delimiter end="}" contains=ALLBUT,latteSyntax
+syn region latteQuote matchgroup=Delimiter start="\\'{" skip="\\[{}]" matchgroup=Delimiter end="}"
+syn region latteQuote matchgroup=Delimiter start="\\`{" skip="\\[{}]" matchgroup=Delimiter end="}" contains=latteUnquote,latteSplice
+
+syn match latteOperator '\\/'
+syn match latteOperator '='
+
+syn match latteComment "\\;.*$"
+
+" This was gathered by slurping in the index.
+
+syn keyword latteSyntax __FILE__ __latte-version__ contained
+syn keyword latteSyntax _bal-tag _pre _tag add and append apply back contained
+syn keyword latteSyntax caar cadr car cdar cddr cdr ceil compose contained
+syn keyword latteSyntax concat cons def defmacro divide downcase contained
+syn keyword latteSyntax empty? equal? error explode file-contents contained
+syn keyword latteSyntax floor foreach front funcall ge? getenv contained
+syn keyword latteSyntax greater-equal? greater? group group? gt? html contained
+syn keyword latteSyntax if include lambda le? length less-equal? contained
+syn keyword latteSyntax less? let lmap load-file load-library lt? macro contained
+syn keyword latteSyntax member? modulo multiply not nth operator? contained
+syn keyword latteSyntax or ordinary quote process-output push-back contained
+syn keyword latteSyntax push-front quasiquote quote random rdc reverse contained
+syn keyword latteSyntax set! snoc splicing unquote strict-html4 contained
+syn keyword latteSyntax string-append string-ge? string-greater-equal? contained
+syn keyword latteSyntax string-greater? string-gt? string-le? contained
+syn keyword latteSyntax string-less-equal? string-less? string-lt? contained
+syn keyword latteSyntax string? subseq substr subtract contained
+syn keyword latteSyntax upcase useless warn while zero? contained
+
+
+" If it's good enough for scheme...
+
+syn sync match matchPlace grouphere NONE "^[^ \t]"
+" ... i.e. synchronize on a line that starts at the left margin
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link latteSyntax Statement
+hi def link latteVar Function
+
+hi def link latteString String
+hi def link latteQuote String
+
+hi def link latteDelimiter Delimiter
+hi def link latteOperator Operator
+
+hi def link latteComment Comment
+hi def link latteError Error
+
+
+let b:current_syntax = "latte"
diff --git a/runtime/syntax/lc.vim b/runtime/syntax/lc.vim
new file mode 100644
index 0000000..a334529
--- /dev/null
+++ b/runtime/syntax/lc.vim
@@ -0,0 +1,31 @@
+" Vim syntax file
+" Language: Elsa
+" Maintainer: Miles Glapa-Grossklag <miles@glapa-grossklag.com>
+" Last Change: 2023-01-29
+
+if exists('b:current_syntax')
+ finish
+endif
+
+" Keywords
+syntax keyword elsaKeyword let eval
+syntax match elsaKeyword "\v:"
+highlight link elsaKeyword Keyword
+
+" Comments
+setlocal commentstring=--%s
+syntax match elsaComment "\v--.*$"
+highlight link elsaComment Comment
+
+" Operators
+syntax match elsaOperator "\v\="
+syntax match elsaOperator "\v\=[abd*~]\>"
+syntax match elsaOperator "\v-\>"
+syntax match elsaOperator "\v\\"
+highlight link elsaOperator Operator
+
+" Definitions
+syntax match elsaConstant "\v[A-Z]+[A-Z_0-9]*"
+highlight link elsaConstant Constant
+
+let b:current_syntax = 'elsa'
diff --git a/runtime/syntax/ld.vim b/runtime/syntax/ld.vim
new file mode 100644
index 0000000..6a117ee
--- /dev/null
+++ b/runtime/syntax/ld.vim
@@ -0,0 +1,81 @@
+" Vim syntax file
+" Language: ld(1) script
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword ldTodo contained TODO FIXME XXX NOTE
+
+syn region ldComment start='/\*' end='\*/' contains=ldTodo,@Spell
+
+syn region ldFileName start=+"+ end=+"+
+
+syn keyword ldPreProc SECTIONS MEMORY OVERLAY PHDRS VERSION INCLUDE
+syn match ldPreProc '\<VERS_\d\+\.\d\+'
+
+syn keyword ldFunction ABSOLUTE ADDR ALIGN BLOCK DATA_SEGMENT_ALIGN
+ \ DATA_SEGMENT_END DATA_SEGMENT_RELRO_END DEFINED
+ \ LOADADDR MAX MIN NEXT SIZEOF SIZEOF_HEADERS
+ \ sizeof_headers
+
+syn keyword ldKeyword ENTRY INPUT GROUP OUTPUT
+ \ SEARCH_DIR STARTUP OUTPUT_FORMAT TARGET
+ \ ASSERT EXTERN FORCE_COMMON_ALLOCATION
+ \ INHIBIT_COMMON_ALLOCATION NOCROSSREFS OUTPUT_ARCH
+ \ PROVIDE EXCLUDE_FILE SORT KEEP FILL
+ \ CREATE_OBJECT_SYMBOLS CONSTRUCTORS SUBALIGN
+ \ FILEHDR AT __asm__ ABSOLUTE
+
+syn keyword ldDataType BYTE SHORT LONG QUAD SQUAD
+syn keyword ldOutputType NOLOAD DSECT COPY INFO OVERLAY
+syn keyword ldPTType PT_NULL PT_LOAD PT_DYNAMIC PT_INTERP
+ \ PT_NOTE PT_SHLIB PT_PHDR
+
+syn keyword ldSpecial COMMON
+syn match ldSpecial '/DISCARD/'
+
+syn keyword ldIdentifier ORIGIN LENGTH
+
+syn match ldSpecSections '\.'
+syn match ldSections '\.\S\+'
+syn match ldSpecSections '\.\%(text\|data\|bss\|symver\)\>'
+
+syn match ldNumber display '\<0[xX]\x\+\>'
+syn match ldNumber display '\d\+[KM]\>' contains=ldNumberMult
+syn match ldNumberMult display '\(\d\+\)\@<=[KM]\>'
+syn match ldOctal contained display '\<0\o\+\>'
+ \ contains=ldOctalZero
+syn match ldOctalZero contained display '\<0'
+syn match ldOctalError contained display '\<0\o*[89]\d*\>'
+
+
+hi def link ldTodo Todo
+hi def link ldComment Comment
+hi def link ldFileName String
+hi def link ldPreProc PreProc
+hi def link ldFunction Identifier
+hi def link ldKeyword Keyword
+hi def link ldType Type
+hi def link ldDataType ldType
+hi def link ldOutputType ldType
+hi def link ldPTType ldType
+hi def link ldSpecial Special
+hi def link ldIdentifier Identifier
+hi def link ldSections Constant
+hi def link ldSpecSections Special
+hi def link ldNumber Number
+hi def link ldNumberMult PreProc
+hi def link ldOctal ldNumber
+hi def link ldOctalZero PreProc
+hi def link ldOctalError Error
+
+let b:current_syntax = "ld"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/ldapconf.vim b/runtime/syntax/ldapconf.vim
new file mode 100644
index 0000000..662ea20
--- /dev/null
+++ b/runtime/syntax/ldapconf.vim
@@ -0,0 +1,338 @@
+" Vim syntax file
+" Language: ldap.conf(5) configuration file.
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-11
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword ldapconfTodo contained TODO FIXME XXX NOTE
+
+syn region ldapconfComment display oneline start='^\s*#' end='$'
+ \ contains=ldapconfTodo,
+ \ @Spell
+
+syn match ldapconfBegin display '^'
+ \ nextgroup=ldapconfOption,
+ \ ldapconfDeprOption,
+ \ ldapconfComment
+
+syn case ignore
+
+syn keyword ldapconfOption contained URI
+ \ nextgroup=ldapconfURI
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ BASE
+ \ BINDDN
+ \ nextgroup=ldapconfDNAttrType
+ \ skipwhite
+
+syn keyword ldapconfDeprOption contained
+ \ HOST
+ \ nextgroup=ldapconfHost
+ \ skipwhite
+
+syn keyword ldapconfDeprOption contained
+ \ PORT
+ \ nextgroup=ldapconfPort
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ REFERRALS
+ \ nextgroup=ldapconfBoolean
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ SIZELIMIT
+ \ TIMELIMIT
+ \ nextgroup=ldapconfInteger
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ DEREF
+ \ nextgroup=ldapconfDerefWhen
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ SASL_MECH
+ \ nextgroup=ldapconfSASLMechanism
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ SASL_REALM
+ \ nextgroup=ldapconfSASLRealm
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ SASL_AUTHCID
+ \ SASL_AUTHZID
+ \ nextgroup=ldapconfSASLAuthID
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ SASL_SECPROPS
+ \ nextgroup=ldapconfSASLSecProps
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ TLS_CACERT
+ \ TLS_CERT
+ \ TLS_KEY
+ \ TLS_RANDFILE
+ \ nextgroup=ldapconfFilename
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ TLS_CACERTDIR
+ \ nextgroup=ldapconfPath
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ TLS_CIPHER_SUITE
+ \ nextgroup=@ldapconfTLSCipher
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ TLS_REQCERT
+ \ nextgroup=ldapconfTLSCertCheck
+ \ skipwhite
+
+syn keyword ldapconfOption contained
+ \ TLS_CRLCHECK
+ \ nextgroup=ldapconfTLSCRLCheck
+ \ skipwhite
+
+syn case match
+
+syn match ldapconfURI contained display
+ \ 'ldaps\=://[^[:space:]:]\+\%(:\d\+\)\='
+ \ nextgroup=ldapconfURI
+ \ skipwhite
+
+" LDAP Distinguished Names are defined in Section 3 of RFC 2253:
+" http://www.ietf.org/rfc/rfc2253.txt.
+syn match ldapconfDNAttrType contained display
+ \ '\a[a-zA-Z0-9-]\+\|\d\+\%(\.\d\+\)*'
+ \ nextgroup=ldapconfDNAttrTypeEq
+
+syn match ldapconfDNAttrTypeEq contained display
+ \ '='
+ \ nextgroup=ldapconfDNAttrValue
+
+syn match ldapconfDNAttrValue contained display
+ \ '\%([^,=+<>#;\\"]\|\\\%([,=+<>#;\\"]\|\x\x\)\)*\|#\%(\x\x\)\+\|"\%([^\\"]\|\\\%([,=+<>#;\\"]\|\x\x\)\)*"'
+ \ nextgroup=ldapconfDNSeparator
+
+syn match ldapconfDNSeparator contained display
+ \ '[+,]'
+ \ nextgroup=ldapconfDNAttrType
+
+syn match ldapconfHost contained display
+ \ '[^[:space:]:]\+\%(:\d\+\)\='
+ \ nextgroup=ldapconfHost
+ \ skipwhite
+
+syn match ldapconfPort contained display
+ \ '\d\+'
+
+syn keyword ldapconfBoolean contained
+ \ on
+ \ true
+ \ yes
+ \ off
+ \ false
+ \ no
+
+syn match ldapconfInteger contained display
+ \ '\d\+'
+
+syn keyword ldapconfDerefWhen contained
+ \ never
+ \ searching
+ \ finding
+ \ always
+
+" Taken from http://www.iana.org/assignments/sasl-mechanisms.
+syn keyword ldapconfSASLMechanism contained
+ \ KERBEROS_V4
+ \ GSSAPI
+ \ SKEY
+ \ EXTERNAL
+ \ ANONYMOUS
+ \ OTP
+ \ PLAIN
+ \ SECURID
+ \ NTLM
+ \ NMAS_LOGIN
+ \ NMAS_AUTHEN
+ \ KERBEROS_V5
+
+syn match ldapconfSASLMechanism contained display
+ \ 'CRAM-MD5\|GSS-SPNEGO\|DIGEST-MD5\|9798-[UM]-\%(RSA-SHA1-ENC\|\%(EC\)\=DSA-SHA1\)\|NMAS-SAMBA-AUTH'
+
+" TODO: I have been unable to find a definition for a SASL realm,
+" authentication identity, and proxy authorization identity.
+syn match ldapconfSASLRealm contained display
+ \ '\S\+'
+
+syn match ldapconfSASLAuthID contained display
+ \ '\S\+'
+
+syn keyword ldapconfSASLSecProps contained
+ \ none
+ \ noplain
+ \ noactive
+ \ nodict
+ \ noanonymous
+ \ forwardsec
+ \ passcred
+ \ nextgroup=ldapconfSASLSecPSep
+
+syn keyword ldapconfSASLSecProps contained
+ \ minssf
+ \ maxssf
+ \ maxbufsize
+ \ nextgroup=ldapconfSASLSecPEq
+
+syn match ldapconfSASLSecPEq contained display
+ \ '='
+ \ nextgroup=ldapconfSASLSecFactor
+
+syn match ldapconfSASLSecFactor contained display
+ \ '\d\+'
+ \ nextgroup=ldapconfSASLSecPSep
+
+syn match ldapconfSASLSecPSep contained display
+ \ ','
+ \ nextgroup=ldapconfSASLSecProps
+
+syn match ldapconfFilename contained display
+ \ '.\+'
+
+syn match ldapconfPath contained display
+ \ '.\+'
+
+" Defined in openssl-ciphers(1).
+" TODO: Should we include the stuff under CIPHER SUITE NAMES?
+syn cluster ldapconfTLSCipher contains=ldapconfTLSCipherOp,
+ \ ldapconfTLSCipherName,
+ \ ldapconfTLSCipherSort
+
+syn match ldapconfTLSCipherOp contained display
+ \ '[+!-]'
+ \ nextgroup=ldapconfTLSCipherName
+
+syn keyword ldapconfTLSCipherName contained
+ \ DEFAULT
+ \ COMPLEMENTOFDEFAULT
+ \ ALL
+ \ COMPLEMENTOFALL
+ \ HIGH
+ \ MEDIUM
+ \ LOW
+ \ EXP
+ \ EXPORT
+ \ EXPORT40
+ \ EXPORT56
+ \ eNULL
+ \ NULL
+ \ aNULL
+ \ kRSA
+ \ RSA
+ \ kEDH
+ \ kDHr
+ \ kDHd
+ \ aRSA
+ \ aDSS
+ \ DSS
+ \ aDH
+ \ kFZA
+ \ aFZA
+ \ eFZA
+ \ FZA
+ \ TLSv1
+ \ SSLv3
+ \ SSLv2
+ \ DH
+ \ ADH
+ \ AES
+ \ 3DES
+ \ DES
+ \ RC4
+ \ RC2
+ \ IDEA
+ \ MD5
+ \ SHA1
+ \ SHA
+ \ Camellia
+ \ nextgroup=ldapconfTLSCipherSep
+
+syn match ldapconfTLSCipherSort contained display
+ \ '@STRENGTH'
+ \ nextgroup=ldapconfTLSCipherSep
+
+syn match ldapconfTLSCipherSep contained display
+ \ '[:, ]'
+ \ nextgroup=@ldapconfTLSCipher
+
+syn keyword ldapconfTLSCertCheck contained
+ \ never
+ \ allow
+ \ try
+ \ demand
+ \ hard
+
+syn keyword ldapconfTLSCRLCheck contained
+ \ none
+ \ peer
+ \ all
+
+hi def link ldapconfTodo Todo
+hi def link ldapconfComment Comment
+hi def link ldapconfOption Keyword
+hi def link ldapconfDeprOption Error
+hi def link ldapconfString String
+hi def link ldapconfURI ldapconfString
+hi def link ldapconfDNAttrType Identifier
+hi def link ldapconfOperator Operator
+hi def link ldapconfEq ldapconfOperator
+hi def link ldapconfDNAttrTypeEq ldapconfEq
+hi def link ldapconfValue ldapconfString
+hi def link ldapconfDNAttrValue ldapconfValue
+hi def link ldapconfSeparator ldapconfOperator
+hi def link ldapconfDNSeparator ldapconfSeparator
+hi def link ldapconfHost ldapconfURI
+hi def link ldapconfNumber Number
+hi def link ldapconfPort ldapconfNumber
+hi def link ldapconfBoolean Boolean
+hi def link ldapconfInteger ldapconfNumber
+hi def link ldapconfType Type
+hi def link ldapconfDerefWhen ldapconfType
+hi def link ldapconfDefine Define
+hi def link ldapconfSASLMechanism ldapconfDefine
+hi def link ldapconfSASLRealm ldapconfURI
+hi def link ldapconfSASLAuthID ldapconfValue
+hi def link ldapconfSASLSecProps ldapconfType
+hi def link ldapconfSASLSecPEq ldapconfEq
+hi def link ldapconfSASLSecFactor ldapconfNumber
+hi def link ldapconfSASLSecPSep ldapconfSeparator
+hi def link ldapconfFilename ldapconfString
+hi def link ldapconfPath ldapconfFilename
+hi def link ldapconfTLSCipherOp ldapconfOperator
+hi def link ldapconfTLSCipherName ldapconfDefine
+hi def link ldapconfSpecial Special
+hi def link ldapconfTLSCipherSort ldapconfSpecial
+hi def link ldapconfTLSCipherSep ldapconfSeparator
+hi def link ldapconfTLSCertCheck ldapconfType
+hi def link ldapconfTLSCRLCheck ldapconfType
+
+let b:current_syntax = "ldapconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/ldif.vim b/runtime/syntax/ldif.vim
new file mode 100644
index 0000000..576e4c0
--- /dev/null
+++ b/runtime/syntax/ldif.vim
@@ -0,0 +1,33 @@
+" Vim syntax file
+" Language: LDAP LDIF
+" Maintainer: Zak Johnson <zakj@nox.cx>
+" Last Change: 2003-12-30
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn sync minlines=10 linebreaks=1
+
+syn match ldifAttribute /^[^ #][^:]*/ contains=ldifOption display
+syn match ldifOption /;[^:]\+/ contained contains=ldifPunctuation display
+syn match ldifPunctuation /;/ contained display
+
+syn region ldifStringValue matchgroup=ldifPunctuation start=/: / end=/\_$/ skip=/\n /
+syn region ldifBase64Value matchgroup=ldifPunctuation start=/:: / end=/\_$/ skip=/\n /
+syn region ldifFileValue matchgroup=ldifPunctuation start=/:< / end=/\_$/ skip=/\n /
+
+syn region ldifComment start=/^#/ end=/\_$/ skip=/\n /
+
+
+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/less.vim b/runtime/syntax/less.vim
new file mode 100644
index 0000000..c44f077
--- /dev/null
+++ b/runtime/syntax/less.vim
@@ -0,0 +1,78 @@
+" Vim syntax file
+" Language: less
+" Maintainer: Alessandro Vioni <jenoma@gmail.com>
+" URL: https://github.com/genoma/vim-less
+" Last Change: 2020 Sep 29
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/css.vim
+
+syn case ignore
+
+syn cluster lessCssProperties contains=cssFontProp,cssFontDescriptorProp,cssColorProp,cssTextProp,cssBoxProp,cssGeneratedContentProp,cssPagingProp,cssUIProp,cssRenderProp,cssAuralProp,cssTableProp
+syn cluster lessCssAttributes contains=css.*Attr,lessEndOfLineComment,lessComment,cssValue.*,cssColor,cssURL,lessDefault,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssRenderProp
+
+syn region lessDefinition matchgroup=cssBraces start="{" end="}" contains=TOP
+
+syn match lessProperty "\%([{};]\s*\|^\)\@<=\%([[:alnum:]-]\|#{[^{}]*}\)\+\s*:" contains=css.*Prop skipwhite nextgroup=lessCssAttribute contained containedin=lessDefinition
+syn match lessProperty "^\s*\zs\s\%(\%([[:alnum:]-]\|#{[^{}]*}\)\+\s*:\|:[[:alnum:]-]\+\)"hs=s+1 contains=css.*Prop skipwhite nextgroup=lessCssAttribute
+syn match lessProperty "^\s*\zs\s\%(:\=[[:alnum:]-]\+\s*=\)"hs=s+1 contains=css.*Prop skipwhite nextgroup=lessCssAttribute
+syn match lessCssAttribute +\%("\%([^"]\|\\"\)*"\|'\%([^']\|\\'\)*'\|#{[^{}]*}\|[^{};]\)*+ contained contains=@lessCssAttributes,lessVariable,lessFunction,lessInterpolation
+syn match lessDefault "!default\>" contained
+
+" less variables and media queries
+syn match lessVariable "@[[:alnum:]_-]\+" nextgroup=lessCssAttribute skipwhite
+syn match lessMedia "@media" nextgroup=lessCssAttribute skipwhite
+
+" Less functions
+syn match lessFunction "\<\%(escape\|e\|unit\)\>(\@=" contained
+syn match lessFunction "\<\%(ceil\|floor\|percentage\|round\|sqrt\|abs\|sin\|asin\|cos\|acos\|tan\|atan\|pi\|pow\|min\|max\)\>(\@=" contained
+syn match lessFunction "\<\%(rgb\|rgba\|argb\|argb\|hsl\|hsla\|hsv\|hsva\)\>(\@=" contained
+syn match lessFunction "\<\%(hue\|saturation\|lightness\|red\|green\|blue\|alpha\|luma\)\>(\@=" contained
+syn match lessFunction "\<\%(saturate\|desaturate\|lighten\|darken\|fadein\|fadeout\|fade\|spin\|mix\|greyscale\|contrast\)\>(\@=" contained
+syn match lessFunction "\<\%(multiply\|screen\|overlay\|softlight\|hardlight\|difference\|exclusion\|average\|negation\)\>(\@=" contained
+
+" Less id class visualization
+syn match lessIdChar "#[[:alnum:]_-]\@=" nextgroup=lessId,lessClassIdCall
+syn match lessId "[[:alnum:]_-]\+" contained
+syn match lessClassIdCall "[[:alnum:]_-]\+()" contained
+
+syn match lessClassChar "\.[[:alnum:]_-]\@=" nextgroup=lessClass,lessClassCall
+syn match lessClass "[[:alnum:]_-]\+" contained
+syn match lessClassCall "[[:alnum:]_-]\+()" contained
+
+syn match lessAmpersand "&" contains=lessIdChar,lessClassChar
+
+syn region lessInclude start="@import" end=";\|$" contains=lessComment,cssURL,cssUnicodeEscape,cssMediaType,cssStringQ,cssStringQQ
+
+syn keyword lessTodo FIXME NOTE TODO OPTIMIZE XXX contained
+syn region lessComment start="^\z(\s*\)//" end="^\%(\z1 \)\@!" contains=lessTodo,@Spell
+syn region lessCssComment start="^\z(\s*\)/\*" end="^\%(\z1 \)\@!" contains=lessTodo,@Spell
+syn match lessEndOfLineComment "//.*" contains=lessComment,lessTodo,@Spell
+
+hi def link lessEndOfLineComment lessComment
+hi def link lessCssComment lessComment
+hi def link lessComment Comment
+hi def link lessDefault cssImportant
+hi def link lessVariable Identifier
+hi def link lessFunction PreProc
+hi def link lessTodo Todo
+hi def link lessInclude Include
+hi def link lessIdChar Special
+hi def link lessClassChar Special
+hi def link lessAmpersand Character
+hi def link lessId Identifier
+hi def link lessClass Type
+hi def link lessCssAttribute PreProc
+hi def link lessClassCall Type
+hi def link lessClassIdCall Type
+hi def link lessTagName cssTagName
+hi def link lessDeprecated cssDeprecated
+hi def link lessMedia cssMedia
+
+let b:current_syntax = "less"
+
+" vim:set sw=2:
diff --git a/runtime/syntax/lex.vim b/runtime/syntax/lex.vim
new file mode 100644
index 0000000..82197ad
--- /dev/null
+++ b/runtime/syntax/lex.vim
@@ -0,0 +1,188 @@
+" Vim syntax file
+" Language: Lex and Flex
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Contributor: Robert A. van Engelen <engelen@acm.org>
+" Last Change: Apr 24, 2020
+" Version: 18
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the C++ syntax to start with
+let s:Cpath= fnameescape(expand("<sfile>:p:h")."/cpp.vim")
+if !filereadable(s:Cpath)
+ for s:Cpath in split(globpath(&rtp,"syntax/cpp.vim"),"\n")
+ if filereadable(fnameescape(s:Cpath))
+ let s:Cpath= fnameescape(s:Cpath)
+ break
+ endif
+ endfor
+endif
+exe "syn include @lexCcode ".s:Cpath
+
+" --- ========= ---
+" --- Lex stuff ---
+" --- ========= ---
+
+" Definitions
+" %%
+" Rules
+" %%
+" User Code
+"
+" --- ======= ---
+" --- Example ---
+" --- ======= ---
+"
+" // this is a valid lex file
+" // indented initial code block
+" #include <stdlib.h>
+" %{
+" // initial code block
+" #include <stdio.h>
+" const char *sep = "";
+" %}
+" %option outfile="scanner.c" noyywrap nodefault
+" %x COMMENT
+" id [A-Za-z_][A-Za-z0-9_]*
+" %%
+" // indented initial action code block
+" printf("BEGIN");
+" {id} printf("%s%s", sep, yytext); sep = "";
+" . |
+" \n { sep = "\n"; }
+" "/*" { BEGIN COMMENT; }
+" "//".* { }
+" <COMMENT>{
+" "*/" { BEGIN INITIAL; }
+" .|\n
+" }
+" <*><<EOF>> { // end of file
+" printf("\nEND\n");
+" yyterminate();
+" }
+" %%
+" void scan()
+" {
+" while (yylex())
+" continue;
+" }
+" /* main program */
+" int main()
+" {
+" scan();
+" }
+
+" Definitions Section with initial code blocks, abbreviations, options, states
+if has("folding")
+ syn region lexAbbrvBlock fold start="^\S" end="^\ze%%" skipnl nextgroup=lexPatBlock contains=lexOptions,lexAbbrv,lexInitialCodeBlock,lexInclude,lexAbbrvComment,lexStartState
+else
+ syn region lexAbbrvBlock start="^\S" end="^\ze%%" skipnl nextgroup=lexPatBlock contains=lexOptions,lexAbbrv,lexInitialCodeBlock,lexInclude,lexAbbrvComment,lexStartState
+endif
+syn match lexOptions "^%\a\+\(\s.*\|[^{]*\)$" contains=lexOptionsEq,lexPatString,lexSlashQuote,lexBrace,lexSlashBrace
+syn match lexOptionsEq "=" skipwhite contained
+syn match lexAbbrv "^\I\i*\s"me=e-1 skipwhite contained nextgroup=lexAbbrvPat
+syn match lexAbbrvPat "\s\S.*$"lc=1 contained contains=lexPatAbbrv,lexPatString,lexSlashQuote,lexBrace,lexSlashBrace nextgroup=lexAbbrv,lexInclude
+syn match lexStartState "^%\(xs\?\|s\)\(t\(a\(t\(e\?\)\?\)\?\)\?\)\?\(\s\+\I\i*\)\+\s*$" contained contains=lexStartStateCmd
+syn match lexStartStateCmd '^%\(xs\?\|s\)\(t\(a\(t\(e\?\)\?\)\?\)\?\)\?' contained
+if has("folding")
+ syn region lexInitialCodeBlock fold start="^\s\+" end="^\S"me=e-1 contains=@lexCcode
+ syn region lexInclude fold matchgroup=lexSep start="^%\a*{" end="^%\?}" contained contains=@lexCcode,lexCFunctions
+ syn region lexAbbrvComment fold start="^\s*//" end="$" contains=@Spell
+ syn region lexAbbrvComment fold start="^\s*/\*" end="\*/" contains=@Spell
+else
+ syn region lexInitialCodeBlock start="^\s\+" end="^\S"me=e-1 contains=@lexCcode
+ syn region lexInclude matchgroup=lexSep start="^%\a*{" end="^%\?}" contained contains=@lexCcode,lexCFunctions
+ syn region lexAbbrvComment start="^\s*//" end="$" contains=@Spell
+ syn region lexAbbrvComment start="^\s*/\*" end="\*/" contains=@Spell
+endif
+
+" Rules Section with patterns and actions
+if has("folding")
+ syn region lexPatBlock fold matchgroup=Todo start="^%%" matchgroup=Todo end="^\ze%%" skipnl skipwhite nextgroup=lexFinalCodeBlock contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
+ syn region lexPat fold start="\S" skip="\\\\\|\\\s" end="\ze\(\s*$\|\s\+\(\h\|{\W\|{$\|[-+*]\|//\|/\*\)\)" skipwhite contained nextgroup=lexMorePat,lexPatSep,lexPatEnd contains=lexPatTag,lexPatString,lexSlashQuote,lexPatAbbrv,lexBrace,lexSlashBrace
+ syn region lexPatInclude fold matchgroup=lexSep start="^%{" end="^%}" contained contains=@lexCcode
+ syn region lexBrace fold matchgroup=Character start="\[" skip="\\.\|\[:\a\+:\]\|\[\.\a\+\.\]\|\[=.=\]" end="\]" contained
+ syn region lexPatString fold matchgroup=String start=+"+ skip=+\\\\\|\\"+ matchgroup=String end=+"+ contained
+else
+ syn region lexPatBlock matchgroup=Todo start="^%%" matchgroup=Todo end="^\ze%%" skipnl skipwhite nextgroup=lexFinalCodeBlock contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
+ syn region lexPat start="\S" skip="\\\\\|\\\s" end="\ze\(\s*$\|\s\+\(\h\|{\W\|{$\|[-+*]\|//\|/\*\)\)" skipwhite contained nextgroup=lexMorePat,lexPatSep,lexPatEnd contains=lexPatTag,lexPatString,lexSlashQuote,lexPatAbbrv,lexBrace,lexSlashBrace
+ syn region lexPatInclude matchgroup=lexSep start="^%{" end="^%}" contained contains=@lexCcode
+ syn region lexBrace matchgroup=Character start="\[" skip="\\.\|\[:\a\+:\]\|\[\.\a\+\.\]\|\[=.=\]" end="\]" contained
+ syn region lexPatString matchgroup=String start=+"+ skip=+\\\\\|\\"+ matchgroup=String end=+"+ contained
+endif
+syn match lexPatAbbrv "{\I\i*}"hs=s+1,he=e-1 contained
+syn match lexPatTag "^<\^\?\(\I\i*\|\*\)\(,\^\?\(\I\i*\|\*\)\)*>" contained nextgroup=lexPat,lexMorePat,lexPatSep,lexPatEnd
+syn match lexPatTagZone "^<\^\?\(\I\i*\|\*\)\(,\^\?\(\I\i*\|\*\)\)*>\s*{$"me=e-1 contained nextgroup=lexPatTagZoneStart
+
+if has("folding")
+ syn region lexPatTagZoneStart fold matchgroup=lexPatTag start='{$' end='^}' skipnl skipwhite contained contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
+ syn region lexPatComment fold start="//" end="$" skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
+ syn region lexPatComment fold start="/\*" end="\*/" skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
+else
+ syn region lexPatTagZoneStart matchgroup=lexPatTag start='{' end='^}' skipnl skipwhite contained contains=lexPatTag,lexPatTagZone,lexPatComment,lexPat,lexPatSep,lexPatInclude
+ syn region lexPatComment start="//" end="$" skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
+ syn region lexPatComment start="/\*" end="\*/" skipnl contained contains=cTodo skipwhite nextgroup=lexPatComment,lexPat,@Spell
+endif
+syn match lexPatEnd "\s*$" skipnl contained
+syn match lexPatCodeLine "[^{\[].*" contained contains=@lexCcode,lexCFunctions
+syn match lexMorePat "\s*|\s*$" skipnl contained nextgroup=lexPat,lexPatTag,lexPatComment
+syn match lexPatSep "\s\+" contained nextgroup=lexMorePat,lexPatCode,lexPatCodeLine
+syn match lexSlashQuote +\(\\\\\)*\\"+ contained
+syn match lexSlashBrace +\(\\\\\)*\\\[+ contained
+if has("folding")
+ syn region lexPatCode fold matchgroup=Delimiter start="{" end="}" skipnl contained contains=@lexCcode,lexCFunctions
+else
+ syn region lexPatCode matchgroup=Delimiter start="{" end="}" skipnl contained contains=@lexCcode,lexCFunctions
+endif
+
+" User Code Section with final code block
+syn region lexFinalCodeBlock matchgroup=Todo start="^%%" end="\%$" contained contains=@lexCcode
+
+" Lex macros which may appear in C/C++ code blocks
+syn keyword lexCFunctions BEGIN ECHO REJECT yytext YYText yyleng YYLeng yymore yyless yywrap yylook
+syn keyword lexCFunctions yyrestart yyterminate yylineno yycolumno yyin yyout
+syn keyword lexCFunctions input unput output winput wunput woutput
+syn keyword lexCFunctions yyinput yyunput yyoutput yywinput yywunput yywoutput
+
+" <c.vim> includes several ALLBUTs; these have to be treated so as to exclude lex* groups
+syn cluster cParenGroup add=lex.*
+syn cluster cDefineGroup add=lex.*
+syn cluster cPreProcGroup add=lex.*
+syn cluster cMultiGroup add=lex.*
+
+" Synchronization
+syn sync clear
+syn sync minlines=500
+syn sync match lexSyncPat grouphere lexPatBlock "^%[a-zA-Z]"
+syn sync match lexSyncPat groupthere lexPatBlock "^<$"
+syn sync match lexSyncPat groupthere lexPatBlock "^%%"
+
+" The default highlighting.
+if !exists("skip_lex_syntax_inits")
+ hi def link lexAbbrvComment lexPatComment
+ hi def link lexAbbrvPat lexPat
+ hi def link lexAbbrv Special
+ hi def link lexBrace lexPat
+ hi def link lexCFunctions PreProc
+ hi def link lexMorePat Special
+ hi def link lexOptions PreProc
+ hi def link lexOptionsEq Operator
+ hi def link lexPatComment Comment
+ hi def link lexPat Function
+ hi def link lexPatString lexPat
+ hi def link lexPatAbbrv Special
+ hi def link lexPatTag Statement
+ hi def link lexPatTagZone lexPatTag
+ hi def link lexSep Delimiter
+ hi def link lexSlashQuote lexPat
+ hi def link lexSlashBrace lexPat
+ hi def link lexStartState lexPatTag
+ hi def link lexStartStateCmd Special
+endif
+
+let b:current_syntax = "lex"
+
+" vim:ts=8
diff --git a/runtime/syntax/lftp.vim b/runtime/syntax/lftp.vim
new file mode 100644
index 0000000..20ddee5
--- /dev/null
+++ b/runtime/syntax/lftp.vim
@@ -0,0 +1,152 @@
+" Vim syntax file
+" Language: lftp(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-
+
+syn region lftpComment display oneline start='#' end='$'
+ \ contains=lftpTodo,@Spell
+
+syn keyword lftpTodo contained TODO FIXME XXX NOTE
+
+syn region lftpString contained display
+ \ start=+"+ skip=+\\$\|\\"+ end=+"+ end=+$+
+
+syn match lftpNumber contained display '\<\d\+\(\.\d\+\)\=\>'
+
+syn keyword lftpBoolean contained yes no on off true false
+
+syn keyword lftpInterval contained infinity inf never forever
+syn match lftpInterval contained '\<\(\d\+\(\.\d\+\)\=[dhms]\)\+\>'
+
+syn keyword lftpKeywords alias anon at bookmark cache cat cd chmod close
+ \ cls command debug du echo exit fg find get
+ \ get1 glob help history jobs kill lcd lftp
+ \ lpwd ls mget mirror mkdir module more mput
+ \ mrm mv nlist open pget put pwd queue quote
+ \ reget recls rels renlist repeat reput rm
+ \ rmdir scache site source suspend user version
+ \ wait zcat zmore
+
+syn region lftpSet matchgroup=lftpKeywords
+ \ start="set" end=";" end="$"
+ \ contains=lftpString,lftpNumber,lftpBoolean,
+ \ lftpInterval,lftpSettingsPrefix,lftpSettings
+syn match lftpSettingsPrefix contained '\<\%(bmk\|cache\|cmd\|color\|dns\):'
+syn match lftpSettingsPrefix contained '\<\%(file\|fish\|ftp\|hftp\):'
+syn match lftpSettingsPrefix contained '\<\%(http\|https\|mirror\|module\):'
+syn match lftpSettingsPrefix contained '\<\%(net\|sftp\|ssl\|xfer\):'
+" bmk:
+syn keyword lftpSettings contained save-p[asswords]
+" cache:
+syn keyword lftpSettings contained cache-em[pty-listings] en[able]
+ \ exp[ire] siz[e]
+" cmd:
+syn keyword lftpSettings contained at[-exit] cls-c[ompletion-default]
+ \ cls-d[efault] cs[h-history]
+ \ default-p[rotocol] default-t[itle]
+syn keyword lftpSettings contained fai[l-exit] in[teractive]
+ \ lo[ng-running] ls[-default] mo[ve-background]
+ \ prom[pt]
+ \ rem[ote-completion]
+ \ save-c[wd-history] save-r[l-history]
+ \ set-t[erm-status] statu[s-interval]
+ \ te[rm-status] verb[ose] verify-h[ost]
+ \ verify-path verify-path[-cached]
+" color:
+syn keyword lftpSettings contained dir[-colors] use-c[olor]
+" dns:
+syn keyword lftpSettings contained S[RV-query] cache-en[able]
+ \ cache-ex[pire] cache-s[ize]
+ \ fat[al-timeout] o[rder] use-fo[rk]
+" file:
+syn keyword lftpSettings contained ch[arset]
+" fish:
+syn keyword lftpSettings contained connect[-program] sh[ell]
+" ftp:
+syn keyword lftpSettings contained acct anon-p[ass] anon-u[ser]
+ \ au[to-sync-mode] b[ind-data-socket]
+ \ ch[arset] cli[ent] dev[ice-prefix]
+ \ fi[x-pasv-address] fxp-f[orce]
+ \ fxp-p[assive-source] h[ome] la[ng]
+ \ list-e[mpty-ok] list-o[ptions]
+ \ nop[-interval] pas[sive-mode]
+ \ port-i[pv4] port-r[ange] prox[y]
+ \ rest-l[ist] rest-s[tor]
+ \ retry-530 retry-530[-anonymous]
+ \ sit[e-group] skey-a[llow]
+ \ skey-f[orce] ssl-allow
+ \ ssl-allow[-anonymous] ssl-au[th]
+ \ ssl-f[orce] ssl-protect-d[ata]
+ \ ssl-protect-l[ist] stat-[interval]
+ \ sy[nc-mode] timez[one] use-a[bor]
+ \ use-fe[at] use-fx[p] use-hf[tp]
+ \ use-mdtm use-mdtm[-overloaded]
+ \ use-ml[sd] use-p[ret] use-q[uit]
+ \ use-site-c[hmod] use-site-i[dle]
+ \ use-site-u[time] use-siz[e]
+ \ use-st[at] use-te[lnet-iac]
+ \ verify-a[ddress] verify-p[ort]
+ \ w[eb-mode]
+" hftp:
+syn keyword lftpSettings contained w[eb-mode] cache prox[y]
+ \ use-au[thorization] use-he[ad] use-ty[pe]
+" http:
+syn keyword lftpSettings contained accept accept-c[harset]
+ \ accept-l[anguage] cache coo[kie]
+ \ pos[t-content-type] prox[y]
+ \ put-c[ontent-type] put-m[ethod] ref[erer]
+ \ set-c[ookies] user[-agent]
+" https:
+syn keyword lftpSettings contained prox[y]
+" mirror:
+syn keyword lftpSettings contained exc[lude-regex] o[rder]
+ \ parallel-d[irectories]
+ \ parallel-t[ransfer-count] use-p[get-n]
+" module:
+syn keyword lftpSettings contained pat[h]
+" net:
+syn keyword lftpSettings contained connection-l[imit]
+ \ connection-t[akeover] id[le] limit-m[ax]
+ \ limit-r[ate] limit-total-m[ax]
+ \ limit-total-r[ate] max-ret[ries] no-[proxy]
+ \ pe[rsist-retries] reconnect-interval-b[ase]
+ \ reconnect-interval-ma[x]
+ \ reconnect-interval-mu[ltiplier]
+ \ socket-bind-ipv4 socket-bind-ipv6
+ \ socket-bu[ffer] socket-m[axseg] timeo[ut]
+" sftp:
+syn keyword lftpSettings contained connect[-program]
+ \ max-p[ackets-in-flight] prot[ocol-version]
+ \ ser[ver-program] size-r[ead] size-w[rite]
+" ssl:
+syn keyword lftpSettings contained ca-f[ile] ca-p[ath] ce[rt-file]
+ \ crl-f[ile] crl-p[ath] k[ey-file]
+ \ verify-c[ertificate]
+" xfer:
+syn keyword lftpSettings contained clo[bber] dis[k-full-fatal]
+ \ eta-p[eriod] eta-t[erse] mak[e-backup]
+ \ max-red[irections] ra[te-period]
+
+hi def link lftpComment Comment
+hi def link lftpTodo Todo
+hi def link lftpString String
+hi def link lftpNumber Number
+hi def link lftpBoolean Boolean
+hi def link lftpInterval Number
+hi def link lftpKeywords Keyword
+hi def link lftpSettingsPrefix PreProc
+hi def link lftpSettings Type
+
+let b:current_syntax = "lftp"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/lhaskell.vim b/runtime/syntax/lhaskell.vim
new file mode 100644
index 0000000..cf1f126
--- /dev/null
+++ b/runtime/syntax/lhaskell.vim
@@ -0,0 +1,134 @@
+" Vim syntax file
+" Language: Haskell with literate comments, Bird style,
+" Markdown style, TeX style and plain text surrounding
+" \begin{code} \end{code} blocks
+" Maintainer: Haskell Cafe mailinglist <haskell-cafe@haskell.org>
+" Original Author: Arthur van Leeuwen <arthurvl@cs.uu.nl>
+" Last Change: 2020 Feb 25
+" Version: 1.05
+"
+" Thanks to Ian Lynagh for thoughtful comments on initial versions and
+" for the inspiration for writing this in the first place.
+"
+" This style guesses as to the type of markup used in a literate haskell
+" file and will highlight (La)TeX markup if it finds any
+" This behaviour can be overridden, both glabally and locally using
+" the lhs_markup variable or b:lhs_markup variable respectively.
+"
+" lhs_markup must be set to either tex or none to indicate that
+" you always want (La)TeX highlighting or no highlighting
+" must not be set to let the highlighting be guessed
+" b:lhs_markup must be set to eiterh tex or none to indicate that
+" you want (La)TeX highlighting or no highlighting for
+" this particular buffer
+" must not be set to let the highlighting be guessed
+"
+"
+" 2004 February 18: New version, based on Ian Lynagh's TeX guessing
+" lhaskell.vim, cweb.vim, tex.vim, sh.vim and fortran.vim
+" 2004 February 20: Cleaned up the guessing and overriding a bit
+" 2004 February 23: Cleaned up syntax highlighting for \begin{code} and
+" \end{code}, added some clarification to the attributions
+" 2008 July 1: Removed % from guess list, as it totally breaks plain
+" text markup guessing
+" 2009 April 29: Fixed highlighting breakage in TeX mode,
+" thanks to Kalman Noel
+"
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" First off, see if we can inherit a user preference for lhs_markup
+if !exists("b:lhs_markup")
+ if exists("lhs_markup")
+ if lhs_markup =~ '\<\%(tex\|md\|none\)\>'
+ let b:lhs_markup = matchstr(lhs_markup,'\<\%(tex\|md\|none\)\>')
+ else
+ echohl WarningMsg | echo "Unknown value of lhs_markup" | echohl None
+ let b:lhs_markup = "unknown"
+ endif
+ else
+ let b:lhs_markup = "unknown"
+ endif
+else
+ if b:lhs_markup !~ '\<\%(tex\|md\|none\)\>'
+ let b:lhs_markup = "unknown"
+ endif
+endif
+
+" Remember where the cursor is, and go to upperleft
+let s:oldline=line(".")
+let s:oldcolumn=col(".")
+call cursor(1,1)
+
+" If no user preference, scan buffer for our guess of the markup to
+" highlight. We only differentiate between TeX and plain markup, where
+" plain is not highlighted. The heuristic for finding TeX markup is if
+" one of the following occurs anywhere in the file:
+" - \documentclass
+" - \begin{env} (for env != code)
+" - \part, \chapter, \section, \subsection, \subsubsection, etc
+if b:lhs_markup == "unknown"
+ if search('\\documentclass\|\\begin{\(code}\)\@!\|\\\(sub\)*section\|\\chapter|\\part','W') != 0
+ let b:lhs_markup = "tex"
+ elseif search('```haskell','W') != 0
+ let b:lhs_markup = "md"
+ else
+ let b:lhs_markup = "plain"
+ endif
+endif
+
+" If user wants us to highlight TeX syntax or guess thinks it's TeX, read it.
+if b:lhs_markup == "tex"
+ 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
+elseif b:lhs_markup == "md"
+ runtime! syntax/markdown.vim
+ unlet b:current_syntax
+ syntax cluster lhsTeXContainer contains=markdown.*
+else
+ syntax cluster lhsTeXContainer contains=.*
+endif
+
+" Literate Haskell is Haskell in between text, so at least read Haskell
+" highlighting
+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
+syntax region lhsHaskellMDBlock start="^```haskell$" matchgroup=NONE end="^```$" keepend contains=@haskellTop,lhsMarkdownCode containedin=@lhsTeXContainer
+
+syntax match lhsBirdTrack "^>" contained
+
+syntax match lhsMarkdownCode "^\(```haskell\|^```\)$" contained
+
+syntax match beginCodeBegin "^\\begin" nextgroup=beginCodeCode contained
+syntax region beginCodeCode matchgroup=texDelimiter start="{" end="}"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link lhsBirdTrack Comment
+
+hi def link lhsMarkdownCode 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
+call cursor (s:oldline, s:oldcolumn)
+
+unlet s:oldline
+unlet s:oldcolumn
+
+let b:current_syntax = "lhaskell"
+
+" vim: ts=8
diff --git a/runtime/syntax/libao.vim b/runtime/syntax/libao.vim
new file mode 100644
index 0000000..1a3bd90
--- /dev/null
+++ b/runtime/syntax/libao.vim
@@ -0,0 +1,27 @@
+" Vim syntax file
+" Language: libao.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword libaoTodo contained TODO FIXME XXX NOTE
+
+syn region libaoComment display oneline start='^\s*#' end='$'
+ \ contains=libaoTodo,@Spell
+
+syn keyword libaoKeyword default_driver
+
+hi def link libaoTodo Todo
+hi def link libaoComment Comment
+hi def link libaoKeyword Keyword
+
+let b:current_syntax = "libao"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/lifelines.vim b/runtime/syntax/lifelines.vim
new file mode 100644
index 0000000..ff46928
--- /dev/null
+++ b/runtime/syntax/lifelines.vim
@@ -0,0 +1,154 @@
+" Vim syntax file
+" Language: LifeLines (v 3.0.62) <http://lifelines.sourceforge.net>
+" Maintainer: Patrick Texier <p.texier@orsennes.com>
+" Location: <http://patrick.texier.free.fr/vim/syntax/lifelines.vim>
+" Last Change: 2010 May 7
+
+" option to highlight error obsolete statements
+" add the following line to your .vimrc file :
+" let lifelines_deprecated = 1
+
+" 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("b:current_syntax")
+ finish
+endif
+
+" A bunch of useful LifeLines keywords 3.0.62
+
+syn keyword lifelinesDecl char_encoding require option include
+syn keyword lifelinesStatement set
+syn keyword lifelinesUser getindi geindiset getfam getint getstr choosechild
+syn keyword lifelinesUser chooseindi choosespouse choosesubset menuchoose
+syn keyword lifelinesUser choosefam
+syn keyword lifelinesProc proc func return call
+syn keyword lifelinesInclude include
+syn keyword lifelinesDef global
+syn keyword lifelinesConditional if else elsif switch
+syn keyword lifelinesRepeat continue break while
+syn keyword lifelinesLogical and or not eq ne lt gt le ge strcmp eqstr nestr
+syn keyword lifelinesArithm add sub mul div mod exp neg incr decr
+syn keyword lifelinesArithm cos sin tan arccos arcsin arctan
+syn keyword lifelinesArithm deg2dms dms2deg spdist
+syn keyword lifelinesIndi name fullname surname givens trimname birth
+syn keyword lifelinesIndi death burial baptism
+syn keyword lifelinesIndi father mother nextsib prevsib sex male female
+syn keyword lifelinesIndi pn nspouses nfamilies parents title key
+syn keyword lifelinesIndi soundex inode root indi firstindi nextindi
+syn keyword lifelinesIndi previndi spouses families forindi indiset
+syn keyword lifelinesIndi addtoset deletefromset union intersect
+syn keyword lifelinesIndi difference parentset childset spouseset siblingset
+syn keyword lifelinesIndi ancestorset descendentset descendantset uniqueset
+syn keyword lifelinesIndi namesort keysort valuesort genindiset getindiset
+syn keyword lifelinesIndi forindiset lastindi writeindi
+syn keyword lifelinesIndi inset
+syn keyword lifelinesFam marriage husband wife nchildren firstchild
+syn keyword lifelinesFam lastchild fnode fam firstfam nextfam lastfam
+syn keyword lifelinesFam prevfam children forfam writefam
+syn keyword lifelinesFam fathers mothers Parents
+syn keyword lifelinesList list empty length enqueue dequeue requeue
+syn keyword lifelinesList push pop setel getel forlist inlist dup clear
+syn keyword lifelinesTable table insert lookup
+syn keyword lifelinesGedcom xref tag value parent child sibling savenode
+syn keyword lifelinesGedcom fornodes traverse createnode addnode
+syn keyword lifelinesGedcom detachnode foreven fornotes forothr forsour
+syn keyword lifelinesGedcom reference dereference getrecord
+syn keyword lifelinesGedcom gengedcomstrong
+syn keyword lifelinesFunct date place year long short gettoday dayformat
+syn keyword lifelinesFunct monthformat dateformat extractdate eraformat
+syn keyword lifelinesFunct complexdate complexformat complexpic datepic
+syn keyword lifelinesFunct extractnames extractplaces extracttokens lower
+syn keyword lifelinesFunct yearformat
+syn keyword lifelinesFunct upper capitalize trim rjustify
+syn keyword lifelinesFunct concat strconcat strlen substring index
+syn keyword lifelinesFunct titlecase gettext
+syn keyword lifelinesFunct d card ord alpha roman strsoundex strtoint
+syn keyword lifelinesFunct atoi linemode pagemod col row pos pageout nl
+syn keyword lifelinesFunct sp qt newfile outfile copyfile print lock unlock test
+syn keyword lifelinesFunct database version system stddate program
+syn keyword lifelinesFunct pvalue pagemode level extractdatestr debug
+syn keyword lifelinesFunct f float int free getcol getproperty heapused
+syn keyword lifelinesFunct sort rsort
+syn keyword lifelinesFunct deleteel
+syn keyword lifelinesFunct bytecode convertcode setlocale
+" New dates functions (since 3.0.51)
+syn keyword lifelinesFunct jd2date date2jd dayofweek setdate
+
+" options to highlight as error obsolete statements
+" please read ll-reportmanual.
+
+if exists("lifelines_deprecated")
+ syn keyword lifelinesError getintmsg getindimsg getstrmsg
+ syn keyword lifelinesError gengedcom gengedcomweak deletenode
+ syn keyword lifelinesError save strsave
+ syn keyword lifelinesError lengthset
+ if version >= 700
+ let g:omni_syntax_group_exclude_lifelines = 'lifelinesError'
+ endif
+else
+ syn keyword lifelinesUser getintmsg getindimsg getstrmsg
+ syn keyword lifelinesGedcom gengedcom gengedcomweak deletenode
+ syn keyword lifelinesFunct save strsave
+ syn keyword lifelinesIndi lengthset
+endif
+
+syn region lifelinesString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=lifelinesSpecial
+
+syn match lifelinesSpecial "\\\(\\\|\(n\|t\)\)" contained
+
+syn keyword lifelinesTodo contained TODO FIXME XXX
+syn region lifelinesComment start="/\*" end="\*/" contains=lifelinesTodo
+
+" integers
+syn match lifelinesNumber "-\=\<\d\+\>"
+"floats, with dot
+syn match lifelinesNumber "-\=\<\d\+\.\d*\>"
+"floats, starting with a dot
+syn match lifelinesNumber "-\=\.\d\+\>"
+
+" folding using {}
+syn region lifelinesFoldBlock start="{" end="}" transparent fold
+
+"catch errors caused by wrong parenthesis
+"adapted from original c.vim written by Bram Moolenaar
+
+syn cluster lifelinesParenGroup contains=lifelinesParenError
+syn region lifelinesParen transparent start='(' end=')' contains=ALLBUT,@lifelinesParenGroup
+syn match lifelinesParenError ")"
+syn match lifelinesErrInParen contained "[{}]"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=4
diff --git a/runtime/syntax/lilo.vim b/runtime/syntax/lilo.vim
new file mode 100644
index 0000000..a87dafb
--- /dev/null
+++ b/runtime/syntax/lilo.vim
@@ -0,0 +1,174 @@
+" Vim syntax file
+" Language: lilo configuration (lilo.conf)
+" Maintainer: Niels Horn <niels.horn@gmail.com>
+" Previous Maintainer: David Necas (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2010-02-03
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=@,48-57,.,-,_
+
+syn case ignore
+
+" Base constructs
+syn match liloError "\S\+"
+syn match liloComment "#.*$"
+syn match liloEnviron "\$\w\+" contained
+syn match liloEnviron "\${[^}]\+}" contained
+syn match liloDecNumber "\d\+" contained
+syn match liloHexNumber "0[xX]\x\+" contained
+syn match liloDecNumberP "\d\+p\=" contained
+syn match liloSpecial contained "\\\(\"\|\\\|$\)"
+syn region liloString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained contains=liloSpecial,liloEnviron
+syn match liloLabel :[^ "]\+: contained contains=liloSpecial,liloEnviron
+syn region liloPath start=+[$/]+ skip=+\\\\\|\\ \|\\$"+ end=+ \|$+ contained contains=liloSpecial,liloEnviron
+syn match liloDecNumberList "\(\d\|,\)\+" contained contains=liloDecNumber
+syn match liloDecNumberPList "\(\d\|[,p]\)\+" contained contains=liloDecNumberP,liloDecNumber
+syn region liloAnything start=+[^[:space:]#]+ skip=+\\\\\|\\ \|\\$+ end=+ \|$+ contained contains=liloSpecial,liloEnviron,liloString
+
+" Path
+syn keyword liloOption backup bitmap boot disktab force-backup keytable map message nextgroup=liloEqPath,liloEqPathComment,liloError skipwhite skipempty
+syn keyword liloKernelOpt initrd root nextgroup=liloEqPath,liloEqPathComment,liloError skipwhite skipempty
+syn keyword liloImageOpt path loader table nextgroup=liloEqPath,liloEqPathComment,liloError skipwhite skipempty
+syn keyword liloDiskOpt partition nextgroup=liloEqPath,liloEqPathComment,liloError skipwhite skipempty
+
+" Other
+syn keyword liloOption menu-scheme raid-extra-boot serial install nextgroup=liloEqAnything,liloEqAnythingComment,liloError skipwhite skipempty
+syn keyword liloOption bios-passes-dl nextgroup=liloEqAnything,liloEqAnythingComment,liloError skipwhite skipempty
+syn keyword liloOption default label alias wmdefault nextgroup=liloEqLabelString,liloEqLabelStringComment,liloError skipwhite skipempty
+syn keyword liloKernelOpt ramdisk nextgroup=liloEqAnything,liloEqAnythingComment,liloError skipwhite skipempty
+syn keyword liloImageOpt password range nextgroup=liloEqAnything,liloEqAnythingComment,liloError skipwhite skipempty
+syn keyword liloDiskOpt set type nextgroup=liloEqAnything,liloEqAnythingComment,liloError skipwhite skipempty
+
+" Symbolic
+syn keyword liloKernelOpt vga nextgroup=liloEqVga,liloEqVgaComment,liloError skipwhite skipempty
+
+" Number
+syn keyword liloOption delay timeout verbose nextgroup=liloEqDecNumber,liloEqDecNumberComment,liloError skipwhite skipempty
+syn keyword liloDiskOpt sectors heads cylinders start nextgroup=liloEqDecNumber,liloEqDecNumberComment,liloError skipwhite skipempty
+
+" String
+syn keyword liloOption menu-title nextgroup=liloEqString,liloEqStringComment,liloError skipwhite skipempty
+syn keyword liloKernelOpt append addappend nextgroup=liloEqString,liloEqStringComment,liloError skipwhite skipempty
+syn keyword liloImageOpt fallback literal nextgroup=liloEqString,liloEqStringComment,liloError skipwhite skipempty
+
+" Hex number
+syn keyword liloImageOpt map-drive to boot-as nextgroup=liloEqHexNumber,liloEqHexNumberComment,liloError skipwhite skipempty
+syn keyword liloDiskOpt bios normal hidden nextgroup=liloEqNumber,liloEqNumberComment,liloError skipwhite skipempty
+
+" Number list
+syn keyword liloOption bmp-colors nextgroup=liloEqNumberList,liloEqNumberListComment,liloError skipwhite skipempty
+
+" Number list, some of the numbers followed by p
+syn keyword liloOption bmp-table bmp-timer nextgroup=liloEqDecNumberPList,liloEqDecNumberPListComment,liloError skipwhite skipempty
+
+" Flag
+syn keyword liloOption compact fix-table geometric ignore-table lba32 linear mandatory nowarn prompt
+syn keyword liloOption bmp-retain el-torito-bootable-CD large-memory suppress-boot-time-BIOS-data
+syn keyword liloKernelOpt read-only read-write
+syn keyword liloImageOpt bypass lock mandatory optional restricted single-key unsafe
+syn keyword liloImageOpt master-boot wmwarn wmdisable
+syn keyword liloDiskOpt change activate deactivate inaccessible reset
+
+" Image
+syn keyword liloImage image other nextgroup=liloEqPath,liloEqPathComment,liloError skipwhite skipempty
+syn keyword liloDisk disk nextgroup=liloEqPath,liloEqPathComment,liloError skipwhite skipempty
+syn keyword liloChRules change-rules
+
+" Vga keywords
+syn keyword liloVgaKeyword ask ext extended normal contained
+
+" Comment followed by equal sign and ...
+syn match liloEqPathComment "#.*$" contained nextgroup=liloEqPath,liloEqPathComment,liloError skipwhite skipempty
+syn match liloEqVgaComment "#.*$" contained nextgroup=liloEqVga,liloEqVgaComment,liloError skipwhite skipempty
+syn match liloEqNumberComment "#.*$" contained nextgroup=liloEqNumber,liloEqNumberComment,liloError skipwhite skipempty
+syn match liloEqDecNumberComment "#.*$" contained nextgroup=liloEqDecNumber,liloEqDecNumberComment,liloError skipwhite skipempty
+syn match liloEqHexNumberComment "#.*$" contained nextgroup=liloEqHexNumber,liloEqHexNumberComment,liloError skipwhite skipempty
+syn match liloEqStringComment "#.*$" contained nextgroup=liloEqString,liloEqStringComment,liloError skipwhite skipempty
+syn match liloEqLabelStringComment "#.*$" contained nextgroup=liloEqLabelString,liloEqLabelStringComment,liloError skipwhite skipempty
+syn match liloEqNumberListComment "#.*$" contained nextgroup=liloEqNumberList,liloEqNumberListComment,liloError skipwhite skipempty
+syn match liloEqDecNumberPListComment "#.*$" contained nextgroup=liloEqDecNumberPList,liloEqDecNumberPListComment,liloError skipwhite skipempty
+syn match liloEqAnythingComment "#.*$" contained nextgroup=liloEqAnything,liloEqAnythingComment,liloError skipwhite skipempty
+
+" Equal sign followed by ...
+syn match liloEqPath "=" contained nextgroup=liloPath,liloPathComment,liloError skipwhite skipempty
+syn match liloEqVga "=" contained nextgroup=liloVgaKeyword,liloHexNumber,liloDecNumber,liloVgaComment,liloError skipwhite skipempty
+syn match liloEqNumber "=" contained nextgroup=liloDecNumber,liloHexNumber,liloNumberComment,liloError skipwhite skipempty
+syn match liloEqDecNumber "=" contained nextgroup=liloDecNumber,liloDecNumberComment,liloError skipwhite skipempty
+syn match liloEqHexNumber "=" contained nextgroup=liloHexNumber,liloHexNumberComment,liloError skipwhite skipempty
+syn match liloEqString "=" contained nextgroup=liloString,liloStringComment,liloError skipwhite skipempty
+syn match liloEqLabelString "=" contained nextgroup=liloString,liloLabel,liloLabelStringComment,liloError skipwhite skipempty
+syn match liloEqNumberList "=" contained nextgroup=liloDecNumberList,liloDecNumberListComment,liloError skipwhite skipempty
+syn match liloEqDecNumberPList "=" contained nextgroup=liloDecNumberPList,liloDecNumberPListComment,liloError skipwhite skipempty
+syn match liloEqAnything "=" contained nextgroup=liloAnything,liloAnythingComment,liloError skipwhite skipempty
+
+" Comment followed by ...
+syn match liloPathComment "#.*$" contained nextgroup=liloPath,liloPathComment,liloError skipwhite skipempty
+syn match liloVgaComment "#.*$" contained nextgroup=liloVgaKeyword,liloHexNumber,liloVgaComment,liloError skipwhite skipempty
+syn match liloNumberComment "#.*$" contained nextgroup=liloDecNumber,liloHexNumber,liloNumberComment,liloError skipwhite skipempty
+syn match liloDecNumberComment "#.*$" contained nextgroup=liloDecNumber,liloDecNumberComment,liloError skipwhite skipempty
+syn match liloHexNumberComment "#.*$" contained nextgroup=liloHexNumber,liloHexNumberComment,liloError skipwhite skipempty
+syn match liloStringComment "#.*$" contained nextgroup=liloString,liloStringComment,liloError skipwhite skipempty
+syn match liloLabelStringComment "#.*$" contained nextgroup=liloString,liloLabel,liloLabelStringComment,liloError skipwhite skipempty
+syn match liloDecNumberListComment "#.*$" contained nextgroup=liloDecNumberList,liloDecNumberListComment,liloError skipwhite skipempty
+syn match liloDecNumberPListComment "#.*$" contained nextgroup=liloDecNumberPList,liloDecNumberPListComment,liloError skipwhite skipempty
+syn match liloAnythingComment "#.*$" contained nextgroup=liloAnything,liloAnythingComment,liloError skipwhite skipempty
+
+" Define the default highlighting
+
+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
new file mode 100644
index 0000000..96bd423
--- /dev/null
+++ b/runtime/syntax/limits.vim
@@ -0,0 +1,44 @@
+" Vim syntax file
+" Language: limits(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword limitsTodo contained TODO FIXME XXX NOTE
+
+syn region limitsComment display oneline start='^\s*#' end='$'
+ \ contains=limitsTodo,@Spell
+
+syn match limitsBegin display '^'
+ \ nextgroup=limitsUser,limitsDefault,limitsComment
+ \ skipwhite
+
+syn match limitsUser contained '[^ \t#*]\+'
+ \ nextgroup=limitsLimit,limitsDeLimit skipwhite
+
+syn match limitsDefault contained '*'
+ \ nextgroup=limitsLimit,limitsDeLimit skipwhite
+
+syn match limitsLimit contained '[ACDFMNRSTUKLP]' nextgroup=limitsNumber
+syn match limitsDeLimit contained '-'
+
+syn match limitsNumber contained '\d\+\>' nextgroup=limitsLimit skipwhite
+
+hi def link limitsTodo Todo
+hi def link limitsComment Comment
+hi def link limitsUser Keyword
+hi def link limitsDefault Macro
+hi def link limitsLimit Identifier
+hi def link limitsDeLimit Special
+hi def link limitsNumber Number
+
+let b:current_syntax = "limits"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/liquid.vim b/runtime/syntax/liquid.vim
new file mode 100644
index 0000000..966b60f
--- /dev/null
+++ b/runtime/syntax/liquid.vim
@@ -0,0 +1,138 @@
+" Vim syntax file
+" Language: Liquid
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Filenames: *.liquid
+" Last Change: 2022 Mar 15
+
+if exists('b:current_syntax')
+ finish
+endif
+
+if !exists('main_syntax')
+ let main_syntax = 'liquid'
+endif
+
+if !exists('g:liquid_default_subtype')
+ let g:liquid_default_subtype = 'html'
+endif
+
+if !exists('b:liquid_subtype') && main_syntax == 'liquid'
+ let s:lines = getline(1)."\n".getline(2)."\n".getline(3)."\n".getline(4)."\n".getline(5)."\n".getline("$")
+ let b:liquid_subtype = matchstr(s:lines,'liquid_subtype=\zs\w\+')
+ if b:liquid_subtype == ''
+ let b:liquid_subtype = matchstr(&filetype,'^liquid\.\zs\w\+')
+ endif
+ if b:liquid_subtype == ''
+ let b:liquid_subtype = matchstr(substitute(expand('%:t'),'\c\%(\.liquid\)\+$','',''),'\.\zs\w\+$')
+ endif
+ if b:liquid_subtype == ''
+ let b:liquid_subtype = g:liquid_default_subtype
+ endif
+endif
+
+if exists('b:liquid_subtype') && b:liquid_subtype != ''
+ exe 'runtime! syntax/'.b:liquid_subtype.'.vim'
+ unlet! b:current_syntax
+endif
+
+syn case match
+
+if exists('b:liquid_subtype') && b:liquid_subtype != 'yaml'
+ " YAML Front Matter
+ syn include @liquidYamlTop syntax/yaml.vim
+ unlet! b:current_syntax
+ syn region liquidYamlHead start="\%^---$" end="^---\s*$" keepend contains=@liquidYamlTop,@Spell
+endif
+
+if !exists('g:liquid_highlight_types')
+ let g:liquid_highlight_types = []
+endif
+
+if !exists('s:subtype')
+ let s:subtype = exists('b:liquid_subtype') ? b:liquid_subtype : ''
+
+ for s:type in map(copy(g:liquid_highlight_types),'matchstr(v:val,"[^=]*$")')
+ if s:type =~ '\.'
+ let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*')
+ endif
+ exe 'syn include @liquidHighlight'.substitute(s:type,'\.','','g').' syntax/'.matchstr(s:type,'[^.]*').'.vim'
+ unlet! b:current_syntax
+ endfor
+ unlet! s:type
+
+ if s:subtype == ''
+ unlet! b:liquid_subtype
+ else
+ let b:liquid_subtype = s:subtype
+ endif
+ unlet s:subtype
+endif
+
+syn region liquidStatement matchgroup=liquidDelimiter start="{%-\=" end="-\=%}" contains=@liquidStatement containedin=ALLBUT,@liquidExempt keepend
+syn region liquidExpression matchgroup=liquidDelimiter start="{{-\=" end="-\=}}" contains=@liquidExpression containedin=ALLBUT,@liquidExempt keepend
+syn region liquidComment matchgroup=liquidDelimiter start="{%-\=\s*comment\s*-\=%}" end="{%-\=\s*endcomment\s*-\=%}" contains=liquidTodo,@Spell containedin=ALLBUT,@liquidExempt keepend
+syn region liquidRaw matchgroup=liquidDelimiter start="{%-\=\s*raw\s*-\=%}" end="{%-\=\s*endraw\s*-\=%}" contains=TOP,@liquidExempt containedin=ALLBUT,@liquidExempt keepend
+
+syn cluster liquidExempt contains=liquidStatement,liquidExpression,liquidComment,liquidRaw,@liquidStatement,liquidYamlHead
+syn cluster liquidStatement contains=liquidConditional,liquidRepeat,liquidKeyword,@liquidExpression
+syn cluster liquidExpression contains=liquidOperator,liquidString,liquidNumber,liquidFloat,liquidBoolean,liquidNull,liquidEmpty,liquidPipe,liquidForloop
+
+syn keyword liquidKeyword highlight nextgroup=liquidTypeHighlight skipwhite contained
+syn keyword liquidKeyword endhighlight contained
+syn region liquidHighlight start="{%-\=\s*highlight\s\+\w\+\s*-\=%}" end="{%-\= endhighlight -\=%}" keepend
+
+for s:type in g:liquid_highlight_types
+ exe 'syn match liquidTypeHighlight "\<'.matchstr(s:type,'[^=]*').'\>" contained'
+ exe 'syn region liquidHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' start="{%-\=\s*highlight\s\+'.matchstr(s:type,'[^=]*').'\s*-\=%}" end="{%-\= endhighlight -\=%}" keepend contains=@liquidHighlight'.substitute(matchstr(s:type,'[^=]*$'),'\.','','g')
+endfor
+unlet! s:type
+
+syn region liquidString matchgroup=liquidQuote start=+"+ end=+"+ contained
+syn region liquidString matchgroup=liquidQuote start=+'+ end=+'+ contained
+syn match liquidNumber "-\=\<\d\+\>" contained
+syn match liquidFloat "-\=\<\d\+\>\.\.\@!\%(\d\+\>\)\=" contained
+syn keyword liquidBoolean true false contained
+syn keyword liquidNull null nil blank contained
+syn match liquidEmpty "\<empty\>" contained
+
+syn keyword liquidOperator and or not contained
+syn match liquidPipe '|' contained skipwhite nextgroup=liquidFilter
+
+syn keyword liquidFilter date capitalize downcase upcase escape escape_once first last join sort size where uniq strip_html strip_newlines newline_to_br replace replace_first remove remove_first slice split strip truncate truncatewords prepend append url_encode url_decode abs at_most at_least ceil divided_by floor minus plus round times modulo contained
+
+syn keyword liquidConditional if elsif else endif unless endunless case when endcase ifchanged endifchanged contained
+syn keyword liquidRepeat for endfor tablerow endtablerow in break continue limit offset reversed contained
+syn match liquidRepeat "\%({%-\=\s*\)\@<=empty\>" contained
+syn keyword liquidKeyword assign capture endcapture increasement decreasement cycle include with render contained
+
+syn keyword liquidForloop forloop nextgroup=liquidForloopDot contained
+syn match liquidForloopDot "\." nextgroup=liquidForloopAttribute contained
+syn keyword liquidForloopAttribute length index index0 rindex rindex0 first last contained
+
+syn keyword liquidTablerowloop tablerowloop nextgroup=liquidTablerowloopDot contained
+syn match liquidTablerowloopDot "\." nextgroup=liquidTableForloopAttribute contained
+syn keyword liquidTablerowloopAttribute length index index0 col col0 index0 rindex rindex0 first last col_first col_last contained
+
+hi def link liquidDelimiter PreProc
+hi def link liquidComment Comment
+hi def link liquidTypeHighlight Type
+hi def link liquidConditional Conditional
+hi def link liquidRepeat Repeat
+hi def link liquidKeyword Keyword
+hi def link liquidOperator Operator
+hi def link liquidString String
+hi def link liquidQuote Delimiter
+hi def link liquidNumber Number
+hi def link liquidFloat Float
+hi def link liquidEmpty liquidNull
+hi def link liquidNull liquidBoolean
+hi def link liquidBoolean Boolean
+hi def link liquidFilter Function
+hi def link liquidForloop Identifier
+hi def link liquidForloopAttribute Identifier
+
+let b:current_syntax = 'liquid'
+
+if exists('main_syntax') && main_syntax == 'liquid'
+ unlet main_syntax
+endif
diff --git a/runtime/syntax/lisp.vim b/runtime/syntax/lisp.vim
new file mode 100644
index 0000000..90513e3
--- /dev/null
+++ b/runtime/syntax/lisp.vim
@@ -0,0 +1,622 @@
+" Vim syntax file
+" Language: Lisp
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Nov 10, 2021
+" Version: 31
+" 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
+
+" ---------------------------------------------------------------------
+" Load Once: {{{1
+if exists("b:current_syntax")
+ finish
+endif
+
+if exists("g:lisp_isk")
+ exe "setl isk=".g:lisp_isk
+elseif (v:version == 704 && has("patch-7.4.1142")) || v:version > 704
+ syn iskeyword 38,42,43,45,47-58,60-62,64-90,97-122,_
+else
+ setl isk=38,42,43,45,47-58,60-62,64-90,97-122,_
+endif
+
+if exists("g:lispsyntax_ignorecase") || exists("g:lispsyntax_clisp")
+ set ignorecase
+endif
+
+" ---------------------------------------------------------------------
+" Clusters: {{{1
+syn cluster lispAtomCluster contains=lispAtomBarSymbol,lispAtomList,lispAtomNmbr0,lispComment,lispDecl,lispFunc,lispLeadWhite
+syn cluster lispBaseListCluster contains=lispAtom,lispAtomBarSymbol,lispAtomMark,lispBQList,lispBarSymbol,lispComment,lispConcat,lispDecl,lispFunc,lispKey,lispList,lispNumber,lispEscapeSpecial,lispSymbol,lispVar,lispLeadWhite
+if exists("g:lisp_instring")
+ syn cluster lispListCluster contains=@lispBaseListCluster,lispString,lispInString,lispInStringString
+else
+ syn cluster lispListCluster contains=@lispBaseListCluster,lispString
+endif
+
+syn case ignore
+
+" ---------------------------------------------------------------------
+" Lists: {{{1
+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
+ syn region lispParen2 contained matchgroup=hlLevel2 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen3
+ syn region lispParen3 contained matchgroup=hlLevel3 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen4
+ syn region lispParen4 contained matchgroup=hlLevel4 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen5
+ syn region lispParen5 contained matchgroup=hlLevel5 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen6
+ syn region lispParen6 contained matchgroup=hlLevel6 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen7
+ syn region lispParen7 contained matchgroup=hlLevel7 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen8
+ syn region lispParen8 contained matchgroup=hlLevel8 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen9
+ syn region lispParen9 contained matchgroup=hlLevel9 start="`\=(" end=")" skip="|.\{-}|" contains=@lispListCluster,lispParen0
+else
+ syn region lispList matchgroup=lispParen start="(" skip="|.\{-}|" matchgroup=lispParen end=")" contains=@lispListCluster
+ syn region lispBQList matchgroup=PreProc start="`(" skip="|.\{-}|" matchgroup=PreProc end=")" contains=@lispListCluster
+endif
+
+" ---------------------------------------------------------------------
+" Atoms: {{{1
+syn match lispAtomMark "'"
+syn match lispAtom "'("me=e-1 contains=lispAtomMark nextgroup=lispAtomList
+syn match lispAtom "'[^ \t()]\+" contains=lispAtomMark
+syn match lispAtomBarSymbol !'|..\{-}|! contains=lispAtomMark
+syn region lispAtom start=+'"+ skip=+\\"+ end=+"+
+syn region lispAtomList contained matchgroup=Special start="(" skip="|.\{-}|" matchgroup=Special end=")" contains=@lispAtomCluster,lispString,lispEscapeSpecial
+syn match lispAtomNmbr contained "\<\d\+"
+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 * 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")
+ " CLISP FFI:
+ syn match lispFunc "\<\(ffi:\)\?with-c-\(place\|var\)\>"
+ syn match lispFunc "\<\(ffi:\)\?with-foreign-\(object\|string\)\>"
+ syn match lispFunc "\<\(ffi:\)\?default-foreign-\(language\|library\)\>"
+ syn match lispFunc "\<\([us]_\?\)\?\(element\|deref\|cast\|slot\|validp\)\>"
+ syn match lispFunc "\<\(ffi:\)\?set-foreign-pointer\>"
+ syn match lispFunc "\<\(ffi:\)\?allocate-\(deep\|shallow\)\>"
+ syn match lispFunc "\<\(ffi:\)\?c-lines\>"
+ syn match lispFunc "\<\(ffi:\)\?foreign-\(value\|free\|variable\|function\|object\)\>"
+ syn match lispFunc "\<\(ffi:\)\?foreign-address\(-null\|unsigned\)\?\>"
+ syn match lispFunc "\<\(ffi:\)\?undigned-foreign-address\>"
+ syn match lispFunc "\<\(ffi:\)\?c-var-\(address\|object\)\>"
+ syn match lispFunc "\<\(ffi:\)\?typeof\>"
+ syn match lispFunc "\<\(ffi:\)\?\(bit\)\?sizeof\>"
+" CLISP Macros, functions et al:
+ syn match lispFunc "\<\(ext:\)\?with-collect\>"
+ syn match lispFunc "\<\(ext:\)\?letf\*\?\>"
+ syn match lispFunc "\<\(ext:\)\?finalize\>\>"
+ syn match lispFunc "\<\(ext:\)\?memoized\>"
+ syn match lispFunc "\<\(ext:\)\?getenv\>"
+ syn match lispFunc "\<\(ext:\)\?convert-string-\(to\|from\)-bytes\>"
+ syn match lispFunc "\<\(ext:\)\?ethe\>"
+ syn match lispFunc "\<\(ext:\)\?with-gensyms\>"
+ syn match lispFunc "\<\(ext:\)\?open-http\>"
+ syn match lispFunc "\<\(ext:\)\?string-concat\>"
+ syn match lispFunc "\<\(ext:\)\?with-http-\(in\|out\)put\>"
+ syn match lispFunc "\<\(ext:\)\?with-html-output\>"
+ syn match lispFunc "\<\(ext:\)\?expand-form\>"
+ syn match lispFunc "\<\(ext:\)\?\(without-\)\?package-lock\>"
+ syn match lispFunc "\<\(ext:\)\?re-export\>"
+ syn match lispFunc "\<\(ext:\)\?saveinitmem\>"
+ syn match lispFunc "\<\(ext:\)\?\(read\|write\)-\(integer\|float\)\>"
+ syn match lispFunc "\<\(ext:\)\?\(read\|write\)-\(char\|byte\)-sequence\>"
+ syn match lispFunc "\<\(custom:\)\?\*system-package-list\*\>"
+ syn match lispFunc "\<\(custom:\)\?\*ansi\*\>"
+endif
+
+" ---------------------------------------------------------------------
+" Lisp Keywords (modifiers): {{{1
+syn keyword lispKey :abort :from-end :overwrite
+syn keyword lispKey :adjustable :gensym :predicate
+syn keyword lispKey :append :host :preserve-whitespace
+syn keyword lispKey :array :if-does-not-exist :pretty
+syn keyword lispKey :base :if-exists :print
+syn keyword lispKey :case :include :print-function
+syn keyword lispKey :circle :index :probe
+syn keyword lispKey :conc-name :inherited :radix
+syn keyword lispKey :constructor :initial-contents :read-only
+syn keyword lispKey :copier :initial-element :rehash-size
+syn keyword lispKey :count :initial-offset :rehash-threshold
+syn keyword lispKey :create :initial-value :rename
+syn keyword lispKey :default :input :rename-and-delete
+syn keyword lispKey :defaults :internal :size
+syn keyword lispKey :device :io :start
+syn keyword lispKey :direction :junk-allowed :start1
+syn keyword lispKey :directory :key :start2
+syn keyword lispKey :displaced-index-offset :length :stream
+syn keyword lispKey :displaced-to :level :supersede
+syn keyword lispKey :element-type :name :test
+syn keyword lispKey :end :named :test-not
+syn keyword lispKey :end1 :new-version :type
+syn keyword lispKey :end2 :nicknames :use
+syn keyword lispKey :error :output :verbose
+syn keyword lispKey :escape :output-file :version
+syn keyword lispKey :external
+" defpackage arguments
+syn keyword lispKey :documentation :shadowing-import-from :modern :export
+syn keyword lispKey :case-sensitive :case-inverted :shadow :import-from :intern
+" lambda list keywords
+syn keyword lispKey &allow-other-keys &aux &body
+syn keyword lispKey &environment &key &optional &rest &whole
+" make-array argument
+syn keyword lispKey :fill-pointer
+" readtable-case values
+syn keyword lispKey :upcase :downcase :preserve :invert
+" eval-when situations
+syn keyword lispKey :load-toplevel :compile-toplevel :execute
+" ANSI Extended LOOP:
+syn keyword lispKey :while :until :for :do :if :then :else :when :unless :in
+syn keyword lispKey :across :finally :collect :nconc :maximize :minimize :sum
+syn keyword lispKey :and :with :initially :append :into :count :end :repeat
+syn keyword lispKey :always :never :thereis :from :to :upto :downto :below
+syn keyword lispKey :above :by :on :being :each :the :hash-key :hash-keys
+syn keyword lispKey :hash-value :hash-values :using :of-type :upfrom :downfrom
+if exists("g:lispsyntax_clisp")
+ " CLISP FFI:
+ syn keyword lispKey :arguments :return-type :library :full :malloc-free
+ syn keyword lispKey :none :alloca :in :out :in-out :stdc-stdcall :stdc :c
+ syn keyword lispKey :language :built-in :typedef :external
+ syn keyword lispKey :fini :init-once :init-always
+endif
+
+" ---------------------------------------------------------------------
+" Standard Lisp Variables: {{{1
+syn keyword lispVar *applyhook* *load-pathname* *print-pprint-dispatch*
+syn keyword lispVar *break-on-signals* *load-print* *print-pprint-dispatch*
+syn keyword lispVar *break-on-signals* *load-truename* *print-pretty*
+syn keyword lispVar *break-on-warnings* *load-verbose* *print-radix*
+syn keyword lispVar *compile-file-pathname* *macroexpand-hook* *print-readably*
+syn keyword lispVar *compile-file-pathname* *modules* *print-right-margin*
+syn keyword lispVar *compile-file-truename* *package* *print-right-margin*
+syn keyword lispVar *compile-file-truename* *print-array* *query-io*
+syn keyword lispVar *compile-print* *print-base* *random-state*
+syn keyword lispVar *compile-verbose* *print-case* *read-base*
+syn keyword lispVar *compile-verbose* *print-circle* *read-default-float-format*
+syn keyword lispVar *debug-io* *print-escape* *read-eval*
+syn keyword lispVar *debugger-hook* *print-gensym* *read-suppress*
+syn keyword lispVar *default-pathname-defaults* *print-length* *readtable*
+syn keyword lispVar *error-output* *print-level* *standard-input*
+syn keyword lispVar *evalhook* *print-lines* *standard-output*
+syn keyword lispVar *features* *print-miser-width* *terminal-io*
+syn keyword lispVar *gensym-counter* *print-miser-width* *trace-output*
+
+" ---------------------------------------------------------------------
+" Strings: {{{1
+syn region lispString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell
+if exists("g:lisp_instring")
+ syn region lispInString keepend matchgroup=Delimiter start=+"(+rs=s+1 skip=+|.\{-}|+ matchgroup=Delimiter end=+)"+ contains=@lispBaseListCluster,lispInStringString
+ syn region lispInStringString start=+\\"+ skip=+\\\\+ end=+\\"+ contained
+endif
+
+" ---------------------------------------------------------------------
+" Shared with Xlisp, Declarations, Macros, Functions: {{{1
+syn keyword lispDecl defmacro do-all-symbols labels
+syn keyword lispDecl defsetf do-external-symbols let
+syn keyword lispDecl deftype do-symbols locally
+syn keyword lispDecl defun dotimes macrolet
+syn keyword lispDecl do* flet multiple-value-bind
+if exists("g:lispsyntax_clisp")
+ " CLISP FFI:
+ syn match lispDecl "\<\(ffi:\)\?def-c-\(var\|const\|enum\|type\|struct\)\>"
+ syn match lispDecl "\<\(ffi:\)\?def-call-\(out\|in\)\>"
+ syn match lispDecl "\<\(ffi:\)\?c-\(function\|struct\|pointer\|string\)\>"
+ syn match lispDecl "\<\(ffi:\)\?c-ptr\(-null\)\?\>"
+ syn match lispDecl "\<\(ffi:\)\?c-array\(-ptr\|-max\)\?\>"
+ syn match lispDecl "\<\(ffi:\)\?[us]\?\(char\|short\|int\|long\)\>"
+ syn match lispDecl "\<\(win32:\|w32\)\?d\?word\>"
+ syn match lispDecl "\<\([us]_\?\)\?int\(8\|16\|32\|64\)\(_t\)\?\>"
+ syn keyword lispDecl size_t off_t time_t handle
+endif
+
+" ---------------------------------------------------------------------
+" Numbers: supporting integers and floating point numbers {{{1
+syn match lispNumber "-\=\(\.\d\+\|\d\+\(\.\d*\)\=\)\([dDeEfFlL][-+]\=\d\+\)\="
+syn match lispNumber "-\=\(\d\+/\d\+\)"
+
+syn match lispEscapeSpecial "\*\w[a-z_0-9-]*\*"
+syn match lispEscapeSpecial !#|[^()'`,"; \t]\+|#!
+syn match lispEscapeSpecial !#x\x\+!
+syn match lispEscapeSpecial !#o\o\+!
+syn match lispEscapeSpecial !#b[01]\+!
+syn match lispEscapeSpecial !#\\[ -}\~]!
+syn match lispEscapeSpecial !#[':][^()'`,"; \t]\+!
+syn match lispEscapeSpecial !#([^()'`,"; \t]\+)!
+syn match lispEscapeSpecial !#\\\%(Space\|Newline\|Tab\|Page\|Rubout\|Linefeed\|Return\|Backspace\)!
+syn match lispEscapeSpecial "\<+[a-zA-Z_][a-zA-Z_0-9-]*+\>"
+
+syn match lispConcat "\s\.\s"
+syn match lispParenError ")"
+
+" ---------------------------------------------------------------------
+" Comments: {{{1
+syn cluster lispCommentGroup contains=lispTodo,@Spell
+syn match lispComment ";.*$" contains=@lispCommentGroup
+syn region lispCommentRegion start="#|" end="|#" contains=lispCommentRegion,@lispCommentGroup
+syn region lispComment start="#+nil" end="\ze)" contains=@lispCommentGroup
+syn match lispComment '^\s*#+nil.*$' contains=@lispCommentGroup
+syn keyword lispTodo contained combak combak: todo todo:
+
+" ---------------------------------------------------------------------
+" Synchronization: {{{1
+syn sync lines=100
+
+" ---------------------------------------------------------------------
+" Define Highlighting: {{{1
+if !exists("skip_lisp_syntax_inits")
+
+ hi def link lispCommentRegion lispComment
+ hi def link lispAtomNmbr lispNumber
+ hi def link lispAtomMark lispMark
+ hi def link lispInStringString lispString
+
+ 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
+ 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
+ endif
+ else
+ hi def link lispParen Delimiter
+ endif
+
+endif
+
+let b:current_syntax = "lisp"
+
+" ---------------------------------------------------------------------
+" vim: ts=8 nowrap fdm=marker
diff --git a/runtime/syntax/lite.vim b/runtime/syntax/lite.vim
new file mode 100644
index 0000000..a8d2689
--- /dev/null
+++ b/runtime/syntax/lite.vim
@@ -0,0 +1,168 @@
+" Vim syntax file
+" Language: lite
+" Maintainer: Lutz Eymers <ixtab@polzin.com>
+" URL: http://www.isp.de/data/lite.vim
+" Email: Subject: send syntax_vim.tgz
+" Last Change: 2001 Mai 01
+"
+" Options lite_sql_query = 1 for SQL syntax highligthing inside strings
+" lite_minlines = x to sync at least x lines backwards
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'lite'
+endif
+
+if main_syntax == 'lite'
+ if exists("lite_sql_query")
+ if lite_sql_query == 1
+ syn include @liteSql <sfile>:p:h/sql.vim
+ unlet b:current_syntax
+ endif
+ endif
+endif
+
+if main_syntax == 'msql'
+ if exists("msql_sql_query")
+ if msql_sql_query == 1
+ syn include @liteSql <sfile>:p:h/sql.vim
+ unlet b:current_syntax
+ endif
+ endif
+endif
+
+syn cluster liteSql remove=sqlString,sqlComment
+
+syn case match
+
+" Internal Variables
+syn keyword liteIntVar ERRMSG contained
+
+" Comment
+syn region liteComment start="/\*" end="\*/" contains=liteTodo
+
+" Function names
+syn keyword liteFunctions echo printf fprintf open close read
+syn keyword liteFunctions readln readtok
+syn keyword liteFunctions split strseg chop tr sub substr
+syn keyword liteFunctions test unlink umask chmod mkdir chdir rmdir
+syn keyword liteFunctions rename truncate link symlink stat
+syn keyword liteFunctions sleep system getpid getppid kill
+syn keyword liteFunctions time ctime time2unixtime unixtime2year
+syn keyword liteFunctions unixtime2year unixtime2month unixtime2day
+syn keyword liteFunctions unixtime2hour unixtime2min unixtime2sec
+syn keyword liteFunctions strftime
+syn keyword liteFunctions getpwnam getpwuid
+syn keyword liteFunctions gethostbyname gethostbyaddress
+syn keyword liteFunctions urlEncode setContentType includeFile
+syn keyword liteFunctions msqlConnect msqlClose msqlSelectDB
+syn keyword liteFunctions msqlQuery msqlStoreResult msqlFreeResult
+syn keyword liteFunctions msqlFetchRow msqlDataSeek msqlListDBs
+syn keyword liteFunctions msqlListTables msqlInitFieldList msqlListField
+syn keyword liteFunctions msqlFieldSeek msqlNumRows msqlEncode
+syn keyword liteFunctions exit fatal typeof
+syn keyword liteFunctions crypt addHttpHeader
+
+" Conditional
+syn keyword liteConditional if else
+
+" Repeat
+syn keyword liteRepeat while
+
+" Operator
+syn keyword liteStatement break return continue
+
+" Operator
+syn match liteOperator "[-+=#*]"
+syn match liteOperator "/[^*]"me=e-1
+syn match liteOperator "\$"
+syn match liteRelation "&&"
+syn match liteRelation "||"
+syn match liteRelation "[!=<>]="
+syn match liteRelation "[<>]"
+
+" Identifier
+syn match liteIdentifier "$\h\w*" contains=liteIntVar,liteOperator
+syn match liteGlobalIdentifier "@\h\w*" contains=liteIntVar
+
+" Include
+syn keyword liteInclude load
+
+" Define
+syn keyword liteDefine funct
+
+" Type
+syn keyword liteType int uint char real
+
+" String
+syn region liteString keepend matchgroup=None start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=liteIdentifier,liteSpecialChar,@liteSql
+
+" Number
+syn match liteNumber "-\=\<\d\+\>"
+
+" Float
+syn match liteFloat "\(-\=\<\d+\|-\=\)\.\d\+\>"
+
+" SpecialChar
+syn match liteSpecialChar "\\[abcfnrtv\\]" contained
+
+syn match liteParentError "[)}\]]"
+
+" Todo
+syn keyword liteTodo TODO Todo todo contained
+
+" dont syn #!...
+syn match liteExec "^#!.*$"
+
+" Parents
+syn cluster liteInside contains=liteComment,liteFunctions,liteIdentifier,liteGlobalIdentifier,liteConditional,liteRepeat,liteStatement,liteOperator,liteRelation,liteType,liteString,liteNumber,liteFloat,liteParent
+
+syn region liteParent matchgroup=Delimiter start="(" end=")" contains=@liteInside
+syn region liteParent matchgroup=Delimiter start="{" end="}" contains=@liteInside
+syn region liteParent matchgroup=Delimiter start="\[" end="\]" contains=@liteInside
+
+" sync
+if main_syntax == 'lite'
+ if exists("lite_minlines")
+ exec "syn sync minlines=" . lite_minlines
+ else
+ syn sync minlines=100
+ endif
+endif
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "lite"
+
+if main_syntax == 'lite'
+ unlet main_syntax
+endif
+
+" vim: ts=8
diff --git a/runtime/syntax/litestep.vim b/runtime/syntax/litestep.vim
new file mode 100644
index 0000000..e3d967f
--- /dev/null
+++ b/runtime/syntax/litestep.vim
@@ -0,0 +1,269 @@
+" Vim syntax file
+" Language: LiteStep RC file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-02-22
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword litestepTodo
+ \ contained
+ \ TODO FIXME XXX NOTE
+
+syn match litestepComment
+ \ contained display contains=litestepTodo,@Spell
+ \ ';.*$'
+
+syn case ignore
+
+syn cluster litestepBeginnings
+ \ contains=
+ \ litestepComment,
+ \ litestepPreProc,
+ \ litestepMultiCommandStart,
+ \ litestepBangCommandStart,
+ \ litestepGenericDirective
+
+syn match litestepGenericDirective
+ \ contained display
+ \ '\<\h\w\+\>'
+
+syn match litestepBeginning
+ \ nextgroup=@litestepBeginnings skipwhite
+ \ '^'
+
+syn keyword litestepPreProc
+ \ contained
+ \ Include
+ \ If
+ \ ElseIf
+ \ Else
+ \ EndIf
+
+syn cluster litestepMultiCommands
+ \ contains=
+ \ litestepMultiCommand
+
+syn match litestepMultiCommandStart
+ \ nextgroup=@litestepMultiCommands
+ \ '\*'
+
+syn match litestepMultiCommand
+ \ contained display
+ \ '\<\h\w\+\>'
+
+syn cluster litestepVariables
+ \ contains=
+ \ litestepBuiltinFolderVariable,
+ \ litestepBuiltinConditionalVariable,
+ \ litestepBuiltinResourceVariable,
+ \ litestepBuiltinGUIDFolderMappingVariable,
+ \ litestepVariable
+
+syn region litestepVariableExpansion
+ \ display oneline transparent
+ \ contains=
+ \ @litestepVariables,
+ \ litestepNumber,
+ \ litestepMathOperator
+ \ matchgroup=litestepVariableExpansion
+ \ start='\$'
+ \ end='\$'
+
+syn match litestepNumber
+ \ display
+ \ '\<\d\+\>'
+
+syn region litestepString
+ \ display oneline contains=litestepVariableExpansion
+ \ start=+"+ end=+"+
+
+" TODO: unsure about this one.
+syn region litestepSubValue
+ \ display oneline contains=litestepVariableExpansion
+ \ start=+'+ end=+'+
+
+syn keyword litestepBoolean
+ \ true
+ \ false
+
+"syn keyword litestepLine
+" \ ?
+
+"syn match litestepColor
+" \ display
+" \ '\<\x\+\>'
+
+syn match litestepRelationalOperator
+ \ display
+ \ '=\|<[>=]\=\|>=\='
+
+syn keyword litestepLogicalOperator
+ \ and
+ \ or
+ \ not
+
+syn match litestepMathOperator
+ \ contained display
+ \ '[+*/-]'
+
+syn keyword litestepBuiltinDirective
+ \ LoadModule
+ \ LSNoStartup
+ \ LSAutoHideModules
+ \ LSNoShellWarning
+ \ LSSetAsShell
+ \ LSUseSystemDDE
+ \ LSDisableTrayService
+ \ LSImageFolder
+ \ ThemeAuthor
+ \ ThemeName
+
+syn keyword litestepDeprecatedBuiltinDirective
+ \ LSLogLevel
+ \ LSLogFile
+
+syn match litestepVariable
+ \ contained display
+ \ '\<\h\w\+\>'
+
+syn keyword litestepBuiltinFolderVariable
+ \ contained
+ \ AdminToolsDir
+ \ CommonAdminToolsDir
+ \ CommonDesktopDir
+ \ CommonFavorites
+ \ CommonPrograms
+ \ CommonStartMenu
+ \ CommonStartup
+ \ Cookies
+ \ Desktop
+ \ DesktopDir
+ \ DocumentsDir
+ \ Favorites
+ \ Fonts
+ \ History
+ \ Internet
+ \ InternetCache
+ \ LitestepDir
+ \ Nethood
+ \ Printhood
+ \ Programs
+ \ QuickLaunch
+ \ Recent
+ \ Sendto
+ \ Startmenu
+ \ Startup
+ \ Templates
+ \ WinDir
+ \ LitestepDir
+
+syn keyword litestepBuiltinConditionalVariable
+ \ contained
+ \ Win2000
+ \ Win95
+ \ Win98
+ \ Win9X
+ \ WinME
+ \ WinNT
+ \ WinNT4
+ \ WinXP
+
+syn keyword litestepBuiltinResourceVariable
+ \ contained
+ \ CompileDate
+ \ ResolutionX
+ \ ResolutionY
+ \ UserName
+
+syn keyword litestepBuiltinGUIDFolderMappingVariable
+ \ contained
+ \ AdminTools
+ \ BitBucket
+ \ Controls
+ \ Dialup
+ \ Documents
+ \ Drives
+ \ Network
+ \ NetworkAndDialup
+ \ Printers
+ \ Scheduled
+
+syn cluster litestepBangs
+ \ contains=
+ \ litestepBuiltinBang,
+ \ litestepBang
+
+syn match litestepBangStart
+ \ nextgroup=@litestepBangs
+ \ '!'
+
+syn match litestepBang
+ \ contained display
+ \ '\<\h\w\+\>'
+
+syn keyword litestepBuiltinBang
+ \ contained
+ \ About
+ \ Alert
+ \ CascadeWindows
+ \ Confirm
+ \ Execute
+ \ Gather
+ \ HideModules
+ \ LogOff
+ \ MinimizeWindows
+ \ None
+ \ Quit
+ \ Recycle
+ \ Refresh
+ \ Reload
+ \ ReloadModule
+ \ RestoreWindows
+ \ Run
+ \ ShowModules
+ \ Shutdown
+ \ Switchuser
+ \ TileWindowsH
+ \ TileWindowsV
+ \ ToggleModules
+ \ UnloadModule
+
+hi def link litestepTodo Todo
+hi def link litestepComment Comment
+hi def link litestepDirective Keyword
+hi def link litestepGenericDirective litestepDirective
+hi def link litestepPreProc PreProc
+hi def link litestepMultiCommandStart litestepPreProc
+hi def link litestepMultiCommand litestepDirective
+hi def link litestepDelimiter Delimiter
+hi def link litestepVariableExpansion litestepDelimiter
+hi def link litestepNumber Number
+hi def link litestepString String
+hi def link litestepSubValue litestepString
+hi def link litestepBoolean Boolean
+"hi def link litestepLine
+"hi def link litestepColor Type
+hi def link litestepOperator Operator
+hi def link litestepRelationalOperator litestepOperator
+hi def link litestepLogicalOperator litestepOperator
+hi def link litestepMathOperator litestepOperator
+hi def link litestepBuiltinDirective litestepDirective
+hi def link litestepDeprecatedBuiltinDirective Error
+hi def link litestepVariable Identifier
+hi def link litestepBuiltinFolderVariable Identifier
+hi def link litestepBuiltinConditionalVariable Identifier
+hi def link litestepBuiltinResourceVariable Identifier
+hi def link litestepBuiltinGUIDFolderMappingVariable Identifier
+hi def link litestepBangStart litestepPreProc
+hi def link litestepBang litestepDirective
+hi def link litestepBuiltinBang litestepBang
+
+let b:current_syntax = "litestep"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/loginaccess.vim b/runtime/syntax/loginaccess.vim
new file mode 100644
index 0000000..650e067
--- /dev/null
+++ b/runtime/syntax/loginaccess.vim
@@ -0,0 +1,96 @@
+" Vim syntax file
+" Language: login.access(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword loginaccessTodo contained TODO FIXME XXX NOTE
+
+syn region loginaccessComment display oneline start='^#' end='$'
+ \ contains=loginaccessTodo,@Spell
+
+syn match loginaccessBegin display '^'
+ \ nextgroup=loginaccessPermission,
+ \ loginaccessComment skipwhite
+
+syn match loginaccessPermission contained display '[^#]'
+ \ contains=loginaccessPermError
+ \ nextgroup=loginaccessUserSep
+
+syn match loginaccessPermError contained display '[^+-]'
+
+syn match loginaccessUserSep contained display ':'
+ \ nextgroup=loginaccessUsers,
+ \ loginaccessAllUsers,
+ \ loginaccessExceptUsers
+
+syn match loginaccessUsers contained display '[^, \t:]\+'
+ \ nextgroup=loginaccessUserIntSep,
+ \ loginaccessOriginSep
+
+syn match loginaccessAllUsers contained display '\<ALL\>'
+ \ nextgroup=loginaccessUserIntSep,
+ \ loginaccessOriginSep
+
+syn match loginaccessLocalUsers contained display '\<LOCAL\>'
+ \ nextgroup=loginaccessUserIntSep,
+ \ loginaccessOriginSep
+
+syn match loginaccessExceptUsers contained display '\<EXCEPT\>'
+ \ nextgroup=loginaccessUserIntSep,
+ \ loginaccessOriginSep
+
+syn match loginaccessUserIntSep contained display '[, \t]'
+ \ nextgroup=loginaccessUsers,
+ \ loginaccessAllUsers,
+ \ loginaccessExceptUsers
+
+syn match loginaccessOriginSep contained display ':'
+ \ nextgroup=loginaccessOrigins,
+ \ loginaccessAllOrigins,
+ \ loginaccessExceptOrigins
+
+syn match loginaccessOrigins contained display '[^, \t]\+'
+ \ nextgroup=loginaccessOriginIntSep
+
+syn match loginaccessAllOrigins contained display '\<ALL\>'
+ \ nextgroup=loginaccessOriginIntSep
+
+syn match loginaccessLocalOrigins contained display '\<LOCAL\>'
+ \ nextgroup=loginaccessOriginIntSep
+
+syn match loginaccessExceptOrigins contained display '\<EXCEPT\>'
+ \ nextgroup=loginaccessOriginIntSep
+
+syn match loginaccessOriginIntSep contained display '[, \t]'
+ \ nextgroup=loginaccessOrigins,
+ \ loginaccessAllOrigins,
+ \ loginaccessExceptOrigins
+
+hi def link loginaccessTodo Todo
+hi def link loginaccessComment Comment
+hi def link loginaccessPermission Type
+hi def link loginaccessPermError Error
+hi def link loginaccessUserSep Delimiter
+hi def link loginaccessUsers Identifier
+hi def link loginaccessAllUsers Macro
+hi def link loginaccessLocalUsers Macro
+hi def link loginaccessExceptUsers Operator
+hi def link loginaccessUserIntSep loginaccessUserSep
+hi def link loginaccessOriginSep loginaccessUserSep
+hi def link loginaccessOrigins Identifier
+hi def link loginaccessAllOrigins Macro
+hi def link loginaccessLocalOrigins Macro
+hi def link loginaccessExceptOrigins loginaccessExceptUsers
+hi def link loginaccessOriginIntSep loginaccessUserSep
+
+let b:current_syntax = "loginaccess"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/logindefs.vim b/runtime/syntax/logindefs.vim
new file mode 100644
index 0000000..8cb4295
--- /dev/null
+++ b/runtime/syntax/logindefs.vim
@@ -0,0 +1,174 @@
+" Vim syntax file
+" Language: login.defs(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-11-29
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match logindefsBegin display '^'
+ \ nextgroup=
+ \ logindefsComment,
+ \ @logindefsKeyword
+ \ skipwhite
+
+syn region logindefsComment display oneline start='^\s*#' end='$'
+ \ contains=logindefsTodo,@Spell
+
+syn keyword logindefsTodo contained TODO FIXME XXX NOTE
+
+syn cluster logindefsKeyword contains=
+ \ logindefsBooleanKeyword,
+ \ logindefsEncryptKeyword,
+ \ logindefsNumberKeyword,
+ \ logindefsPathKeyword,
+ \ logindefsPathsKeyword,
+ \ logindefsStringKeyword
+
+syn keyword logindefsBooleanKeyword contained
+ \ CHFN_AUTH
+ \ CHSH_AUTH
+ \ CREATE_HOME
+ \ DEFAULT_HOME
+ \ FAILLOG_ENAB
+ \ LASTLOG_ENAB
+ \ LOG_OK_LOGINS
+ \ LOG_UNKFAIL_ENAB
+ \ MAIL_CHECK_ENAB
+ \ MD5_CRYPT_ENAB
+ \ OBSCURE_CHECKS_ENAB
+ \ PASS_ALWAYS_WARN
+ \ PORTTIME_CHECKS_ENAB
+ \ QUOTAS_ENAB
+ \ SU_WHEEL_ONLY
+ \ SYSLOG_SG_ENAB
+ \ SYSLOG_SU_ENAB
+ \ USERGROUPS_ENAB
+ \ nextgroup=logindefsBoolean skipwhite
+
+syn keyword logindefsBoolean contained yes no
+
+syn keyword logindefsEncryptKeyword contained
+ \ ENCRYPT_METHOD
+ \ nextgroup=logindefsEncryptMethod skipwhite
+
+syn keyword logindefsEncryptMethod contained
+ \ DES
+ \ MD5
+ \ SHA256
+ \ SHA512
+
+syn keyword logindefsNumberKeyword contained
+ \ ERASECHAR
+ \ FAIL_DELAY
+ \ GID_MAX
+ \ GID_MIN
+ \ KILLCHAR
+ \ LOGIN_RETRIES
+ \ LOGIN_TIMEOUT
+ \ MAX_MEMBERS_PER_GROUP
+ \ PASS_CHANGE_TRIES
+ \ PASS_MAX_DAYS
+ \ PASS_MIN_DAYS
+ \ PASS_WARN_AGE
+ \ PASS_MAX_LEN
+ \ PASS_MIN_LEN
+ \ SHA_CRYPT_MAX_ROUNDS
+ \ SHA_CRYPT_MIN_ROUNDS
+ \ SYS_GID_MAX
+ \ SYS_GID_MIN
+ \ SYS_UID_MAX
+ \ SYS_UID_MIN
+ \ UID_MAX
+ \ UID_MIN
+ \ ULIMIT
+ \ UMASK
+ \ nextgroup=@logindefsNumber skipwhite
+
+syn cluster logindefsNumber contains=
+ \ logindefsDecimal,
+ \ logindefsHex,
+ \ logindefsOctal,
+ \ logindefsOctalError
+
+syn match logindefsDecimal contained '\<\d\+\>'
+
+syn match logindefsHex contained display '\<0x\x\+\>'
+
+syn match logindefsOctal contained display '\<0\o\+\>'
+ \ contains=logindefsOctalZero
+syn match logindefsOctalZero contained display '\<0'
+
+syn match logindefsOctalError contained display '\<0\o*[89]\d*\>'
+
+syn keyword logindefsPathKeyword contained
+ \ ENVIRON_FILE
+ \ FAKE_SHELL
+ \ FTMP_FILE
+ \ HUSHLOGIN_FILE
+ \ ISSUE_FILE
+ \ MAIL_DIR
+ \ MAIL_FILE
+ \ NOLOGINS_FILE
+ \ SULOG_FILE
+ \ TTYTYPE_FILE
+ \ nextgroup=logindefsPath skipwhite
+
+syn match logindefsPath contained '[[:graph:]]\+'
+
+syn keyword logindefsPathsKeyword contained
+ \ CONSOLE
+ \ ENV_PATH
+ \ ENV_SUPATH
+ \ MOTD_FILE
+ \ nextgroup=logindefsPaths skipwhite
+
+syn match logindefsPaths contained '[^:]\+'
+ \ nextgroup=logindefsPathDelim
+
+syn match logindefsPathDelim contained ':' nextgroup=logindefsPaths
+
+syn keyword logindefsStringKeyword contained
+ \ CHFN_RESTRICT
+ \ CONSOLE_GROUPS
+ \ ENV_HZ
+ \ ENV_TZ
+ \ LOGIN_STRING
+ \ SU_NAME
+ \ TTYGROUP
+ \ TTYPERM
+ \ USERDEL_CMD
+ \ nextgroup=logindefsString skipwhite
+
+syn match logindefsString contained '[[:graph:]]\+'
+
+hi def link logindefsComment Comment
+hi def link logindefsTodo Todo
+hi def link logindefsKeyword Keyword
+hi def link logindefsBooleanKeyword logindefsKeyword
+hi def link logindefsEncryptKeyword logindefsKeyword
+hi def link logindefsNumberKeyword logindefsKeyword
+hi def link logindefsPathKeyword logindefsKeyword
+hi def link logindefsPathsKeyword logindefsKeyword
+hi def link logindefsStringKeyword logindefsKeyword
+hi def link logindefsBoolean Boolean
+hi def link logindefsEncryptMethod Type
+hi def link logindefsNumber Number
+hi def link logindefsDecimal logindefsNumber
+hi def link logindefsHex logindefsNumber
+hi def link logindefsOctal logindefsNumber
+hi def link logindefsOctalZero PreProc
+hi def link logindefsOctalError Error
+hi def link logindefsPath String
+hi def link logindefsPaths logindefsPath
+hi def link logindefsPathDelim Delimiter
+hi def link logindefsString String
+
+let b:current_syntax = "logindefs"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/logtalk.vim b/runtime/syntax/logtalk.vim
new file mode 100644
index 0000000..a7fe9ce
--- /dev/null
+++ b/runtime/syntax/logtalk.vim
@@ -0,0 +1,454 @@
+" Vim syntax file
+"
+" Language: Logtalk
+" Maintainer: Paulo Moura <pmoura@logtalk.org>
+" Last Change: August 3, 2018
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Logtalk is case sensitive:
+
+syn case match
+
+
+" Logtalk variables
+
+syn match logtalkVariable "\<\(\u\|_\)\(\w\)*\>"
+
+
+" Logtalk clause functor
+
+syn match logtalkOperator ":-"
+
+
+" Logtalk quoted atoms and strings
+
+syn region logtalkString start=+"+ skip=+\\"+ end=+"+
+syn region logtalkAtom start=+'+ skip=+\\'+ end=+'+ contains=logtalkEscapeSequence
+
+syn match logtalkEscapeSequence contained "\\\([\\abfnrtv\"\']\|\(x[a-fA-F0-9]\+\|[0-7]\+\)\\\)"
+
+
+" Logtalk message sending operators
+
+syn match logtalkOperator "::"
+syn match logtalkOperator ":"
+syn match logtalkOperator "\^\^"
+
+
+" Logtalk external call
+
+syn region logtalkExtCall matchgroup=logtalkExtCallTag start="{" matchgroup=logtalkExtCallTag end="}" contains=ALL
+
+
+" Logtalk opening entity directives
+
+syn region logtalkOpenEntityDir matchgroup=logtalkOpenEntityDirTag start=":- object(" matchgroup=logtalkOpenEntityDirTag end=")\." contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkString,logtalkAtom,logtalkEntityRel,logtalkLineComment
+syn region logtalkOpenEntityDir matchgroup=logtalkOpenEntityDirTag start=":- protocol(" matchgroup=logtalkOpenEntityDirTag end=")\." contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkEntityRel,logtalkLineComment
+syn region logtalkOpenEntityDir matchgroup=logtalkOpenEntityDirTag start=":- category(" matchgroup=logtalkOpenEntityDirTag end=")\." contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkEntityRel,logtalkLineComment
+
+
+" Logtalk closing entity directives
+
+syn match logtalkCloseEntityDir ":- end_object\."
+syn match logtalkCloseEntityDir ":- end_protocol\."
+syn match logtalkCloseEntityDir ":- end_category\."
+
+
+" Logtalk entity relations
+
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="instantiates(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkString,logtalkAtom contained
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="specializes(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkString,logtalkAtom contained
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="extends(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkString,logtalkAtom contained
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="imports(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkString,logtalkAtom contained
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="implements(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkString,logtalkAtom contained
+syn region logtalkEntityRel matchgroup=logtalkEntityRelTag start="complements(" matchgroup=logtalkEntityRelTag end=")" contains=logtalkEntity,logtalkVariable,logtalkNumber,logtalkOperator,logtalkString,logtalkAtom contained
+
+
+" Logtalk directives
+
+syn region logtalkDir matchgroup=logtalkDirTag start=":- if(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- elif(" matchgroup=logtalkDirTag end=")\." contains=ALL
+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=":- 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
+syn region logtalkDir matchgroup=logtalkDirTag start=":- public(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- protected(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- private(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- meta_predicate(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- meta_non_terminal(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- op(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- set_logtalk_flag(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- synchronized(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn match logtalkDirTag ":- synchronized\."
+syn region logtalkDir matchgroup=logtalkDirTag start=":- uses(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn match logtalkDirTag ":- threaded\."
+
+
+" Prolog directives
+
+syn region logtalkDir matchgroup=logtalkDirTag start=":- ensure_loaded(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- include(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- set_prolog_flag(" matchgroup=logtalkDirTag end=")\." contains=ALL
+
+
+" Module directives
+
+syn region logtalkDir matchgroup=logtalkDirTag start=":- module(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- export(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- reexport(" matchgroup=logtalkDirTag end=")\." contains=ALL
+syn region logtalkDir matchgroup=logtalkDirTag start=":- use_module(" matchgroup=logtalkDirTag end=")\." contains=ALL
+
+
+" Logtalk built-in predicates
+
+syn match logtalkBuiltIn "\<\(abolish\|c\(reate\|urrent\)\)_\(object\|protocol\|category\)\ze("
+
+syn match logtalkBuiltIn "\<\(object\|protocol\|category\)_property\ze("
+
+syn match logtalkBuiltIn "\<co\(mplements_object\|nforms_to_protocol\)\ze("
+syn match logtalkBuiltIn "\<extends_\(object\|protocol\|category\)\ze("
+syn match logtalkBuiltIn "\<imp\(orts_category\|lements_protocol\)\ze("
+syn match logtalkBuiltIn "\<\(instantiat\|specializ\)es_class\ze("
+
+syn match logtalkBuiltIn "\<\(abolish\|define\)_events\ze("
+syn match logtalkBuiltIn "\<current_event\ze("
+
+syn match logtalkBuiltIn "\<\(create\|current\|set\)_logtalk_flag\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("
+
+syn match logtalkBuiltInMethod "\<current_predicate\ze("
+syn match logtalkBuiltInMethod "\<predicate_property\ze("
+
+syn match logtalkBuiltInMethod "\<a\(bolish\|ssert\(a\|z\)\)\ze("
+syn match logtalkBuiltInMethod "\<clause\ze("
+syn match logtalkBuiltInMethod "\<retract\(all\)\?\ze("
+
+syn match logtalkBuiltInMethod "\<\(bag\|set\)of\ze("
+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("
+
+
+" Mode operators
+
+syn match logtalkOperator "?"
+syn match logtalkOperator "@"
+
+
+" Control constructs
+
+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 ","
+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 "\\="
+
+
+" Term testing
+
+syn match logtalkKeyword "\<var\ze("
+syn match logtalkKeyword "\<atom\(ic\)\?\ze("
+syn match logtalkKeyword "\<integer\ze("
+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
+
+syn match logtalkKeyword "\<compare\ze("
+syn match logtalkOperator "@=<"
+syn match logtalkOperator "=="
+syn match logtalkOperator "\\=="
+syn match logtalkOperator "@<"
+syn match logtalkOperator "@>"
+syn match logtalkOperator "@>="
+
+
+" Term creation and decomposition
+
+syn match logtalkKeyword "\<functor\ze("
+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\>"
+
+
+" Arithmetic evaluation
+
+syn match logtalkOperator "\<is\>"
+
+
+" Arithmetic comparison
+
+syn match logtalkOperator "=:="
+syn match logtalkOperator "=\\="
+syn match logtalkOperator "<"
+syn match logtalkOperator "=<"
+syn match logtalkOperator ">"
+syn match logtalkOperator ">="
+
+
+" Stream selection and control
+
+syn match logtalkKeyword "\<\(curren\|se\)t_\(in\|out\)put\ze("
+syn match logtalkKeyword "\<open\ze("
+syn match logtalkKeyword "\<close\ze("
+syn match logtalkKeyword "\<flush_output\ze("
+syn match logtalkKeyword "\<flush_output\>"
+syn match logtalkKeyword "\<stream_property\ze("
+syn match logtalkKeyword "\<at_end_of_stream\ze("
+syn match logtalkKeyword "\<at_end_of_stream\>"
+syn match logtalkKeyword "\<set_stream_position\ze("
+
+
+" Character and byte input/output
+
+syn match logtalkKeyword "\<\(get\|p\(eek\|ut\)\)_\(c\(har\|ode\)\|byte\)\ze("
+syn match logtalkKeyword "\<nl\ze("
+syn match logtalkKeyword "\<nl\>"
+
+
+" Term input/output
+
+syn match logtalkKeyword "\<read\(_term\)\?\ze("
+syn match logtalkKeyword "\<write\(q\|_\(canonical\|term\)\)\?\ze("
+syn match logtalkKeyword "\<\(current_\)\?op\ze("
+syn match logtalkKeyword "\<\(current_\)\?char_conversion\ze("
+
+
+" Logic and control
+
+syn match logtalkOperator "\\+"
+syn match logtalkKeyword "\<ignore\ze("
+syn match logtalkKeyword "\<once\ze("
+syn match logtalkKeyword "\<repeat\>"
+
+
+" Atomic term processing
+
+syn match logtalkKeyword "\<atom_\(length\|c\(hars\|o\(ncat\|des\)\)\)\ze("
+syn match logtalkKeyword "\<sub_atom\ze("
+syn match logtalkKeyword "\<char_code\ze("
+syn match logtalkKeyword "\<number_c\(har\|ode\)s\ze("
+
+
+" Implementation defined hooks functions
+
+syn match logtalkKeyword "\<\(curren\|se\)t_prolog_flag\ze("
+syn match logtalkKeyword "\<halt\ze("
+syn match logtalkKeyword "\<halt\>"
+
+
+" Sorting
+
+syn match logtalkKeyword "\<\(key\)\?sort\ze("
+
+
+" Evaluable functors
+
+syn match logtalkOperator "+"
+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 "\<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 "\<t\(an\|runcate\)\ze("
+syn match logtalkKeyword "\<ceiling\ze("
+
+
+" Other arithemtic functors
+
+syn match logtalkOperator "\*\*"
+syn match logtalkKeyword "\<s\(in\|qrt\)\ze("
+syn match logtalkKeyword "\<cos\ze("
+syn match logtalkKeyword "\<a\(cos\|sin\|tan\|tan2\)\ze("
+syn match logtalkKeyword "\<exp\ze("
+syn match logtalkKeyword "\<log\ze("
+
+
+" Bitwise functors
+
+syn match logtalkOperator ">>"
+syn match logtalkOperator "<<"
+syn match logtalkOperator "/\\"
+syn match logtalkOperator "\\/"
+syn match logtalkOperator "\\"
+syn match logtalkKeyword "\<xor\ze("
+
+
+" Logtalk list operator
+
+syn match logtalkOperator "|"
+
+
+" Logtalk existential quantifier operator
+
+syn match logtalkOperator "\^"
+
+
+" Logtalk numbers
+
+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 "\<0b[0-1]\+\>"
+syn match logtalkNumber "\<0o\o\+\>"
+syn match logtalkNumber "\<0x\x\+\>"
+
+
+" Logtalk end-of-clause
+
+syn match logtalkOperator "\."
+
+
+" Logtalk comments
+
+syn region logtalkBlockComment start="/\*" end="\*/" fold
+syn match logtalkLineComment "%.*"
+
+syn cluster logtalkComment contains=logtalkBlockComment,logtalkLineComment
+
+
+" Logtalk conditional compilation folding
+
+syn region logtalkIfContainer transparent keepend extend start=":- if(" end=":- endif\." containedin=ALLBUT,@logtalkComment contains=NONE
+syn region logtalkIf transparent fold keepend start=":- if(" end=":- \(else\.\|elif(\)"ms=s-1,me=s-1 contained containedin=logtalkIfContainer nextgroup=logtalkElseIf,logtalkElse contains=TOP
+syn region logtalkElseIf transparent fold keepend start=":- elif(" end=":- \(else\.\|elif(\)"ms=s-1,me=s-1 contained containedin=logtalkIfContainer nextgroup=logtalkElseIf,logtalkElse contains=TOP
+syn region logtalkElse transparent fold keepend start=":- else\." end=":- endif\." contained containedin=logtalkIfContainer contains=TOP
+
+
+
+" Logtalk entity folding
+
+syn region logtalkEntity transparent fold keepend start=":- object(" end=":- end_object\." contains=ALL
+syn region logtalkEntity transparent fold keepend start=":- protocol(" end=":- end_protocol\." contains=ALL
+syn region logtalkEntity transparent fold keepend start=":- category(" end=":- end_category\." contains=ALL
+
+
+syn sync ccomment logtalkBlockComment maxlines=50
+
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link logtalkBlockComment Comment
+hi def link logtalkLineComment Comment
+
+hi def link logtalkOpenEntityDir Normal
+hi def link logtalkOpenEntityDirTag PreProc
+
+hi def link logtalkIfContainer PreProc
+hi def link logtalkIf PreProc
+hi def link logtalkElseIf PreProc
+hi def link logtalkElse PreProc
+
+hi def link logtalkEntity Normal
+
+hi def link logtalkEntityRel Normal
+hi def link logtalkEntityRelTag PreProc
+
+hi def link logtalkCloseEntityDir PreProc
+
+hi def link logtalkDir Normal
+hi def link logtalkDirTag PreProc
+
+hi def link logtalkAtom String
+hi def link logtalkString String
+hi def link logtalkEscapeSequence SpecialChar
+
+hi def link logtalkNumber Number
+
+hi def link logtalkKeyword Keyword
+
+hi def link logtalkBuiltIn Keyword
+hi def link logtalkBuiltInMethod Keyword
+
+hi def link logtalkOperator Operator
+
+hi def link logtalkExtCall Normal
+hi def link logtalkExtCallTag Operator
+
+hi def link logtalkVariable Identifier
+
+
+
+let b:current_syntax = "logtalk"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/lotos.vim b/runtime/syntax/lotos.vim
new file mode 100644
index 0000000..8262e1d
--- /dev/null
+++ b/runtime/syntax/lotos.vim
@@ -0,0 +1,69 @@
+" Vim syntax file
+" Language: LOTOS (Language Of Temporal Ordering Specifications, IS8807)
+" Maintainer: Daniel Amyot <damyot@csi.uottawa.ca>
+" Last Change: Wed Aug 19 1998
+" URL: http://lotos.csi.uottawa.ca/~damyot/vim/lotos.vim
+" This file is an adaptation of pascal.vim by Mario Eusebio
+" I'm not sure I understand all of the syntax highlight language,
+" but this file seems to do the job for standard LOTOS.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+"Comments in LOTOS are between (* and *)
+syn region lotosComment start="(\*" end="\*)" contains=lotosTodo
+
+"Operators [], [...], >>, ->, |||, |[...]|, ||, ;, !, ?, :, =, ,, :=
+syn match lotosDelimiter "[][]"
+syn match lotosDelimiter ">>"
+syn match lotosDelimiter "->"
+syn match lotosDelimiter "\[>"
+syn match lotosDelimiter "[|;!?:=,]"
+
+"Regular keywords
+syn keyword lotosStatement specification endspec process endproc
+syn keyword lotosStatement where behaviour behavior
+syn keyword lotosStatement any let par accept choice hide of in
+syn keyword lotosStatement i stop exit noexit
+
+"Operators from the Abstract Data Types in IS8807
+syn keyword lotosOperator eq ne succ and or xor implies iff
+syn keyword lotosOperator not true false
+syn keyword lotosOperator Insert Remove IsIn NotIn Union Ints
+syn keyword lotosOperator Minus Includes IsSubsetOf
+syn keyword lotosOperator lt le ge gt 0
+
+"Sorts in IS8807
+syn keyword lotosSort Boolean Bool FBoolean FBool Element
+syn keyword lotosSort Set String NaturalNumber Nat HexString
+syn keyword lotosSort HexDigit DecString DecDigit
+syn keyword lotosSort OctString OctDigit BitString Bit
+syn keyword lotosSort Octet OctetString
+
+"Keywords for ADTs
+syn keyword lotosType type endtype library endlib sorts formalsorts
+syn keyword lotosType eqns formaleqns opns formalopns forall ofsort is
+syn keyword lotosType for renamedby actualizedby sortnames opnnames
+syn keyword lotosType using
+
+syn sync lines=250
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "lotos"
+
+" vim: ts=8
diff --git a/runtime/syntax/lout.vim b/runtime/syntax/lout.vim
new file mode 100644
index 0000000..b26a7bc
--- /dev/null
+++ b/runtime/syntax/lout.vim
@@ -0,0 +1,135 @@
+" Vim syntax file
+" Language: Lout
+" Maintainer: Christian V. J. Brüssow <cvjb@cvjb.de>
+" Last Change: So 12 Feb 2012 15:15:03 CET
+" Filenames: *.lout,*.lt
+" URL: http://www.cvjb.de/comp/vim/lout.vim
+
+" $Id: lout.vim,v 1.4 2012/02/12 15:16:17 bruessow Exp $
+"
+" Lout: Basser Lout document formatting system.
+
+" Many Thanks to...
+"
+" 2012-02-12:
+" 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
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save=&cpo
+set cpo&vim
+
+" Lout is case sensitive
+syn case match
+
+" Synchronization, I know it is a huge number, but normal texts can be
+" _very_ long ;-)
+syn sync lines=1000
+
+" Characters allowed in keywords
+" I don't know if 128-255 are allowed in ANS-FORHT
+setlocal iskeyword=@,48-57,.,@-@,_,192-255
+
+" Some special keywords
+syn keyword loutTodo contained TODO lout Lout LOUT
+syn keyword loutDefine def macro
+
+" Some big structures
+syn keyword loutKeyword @Begin @End @Figure @Tab
+syn keyword loutKeyword @Book @Doc @Document @Report
+syn keyword loutKeyword @Introduction @Abstract @Appendix
+syn keyword loutKeyword @Chapter @Section @BeginSections @EndSections
+
+" All kind of Lout keywords
+syn match loutFunction '\<@[^ \t{}]\+\>'
+
+" Braces -- Don`t edit these lines!
+syn match loutMBraces '[{}]'
+syn match loutIBraces '[{}]'
+syn match loutBBrace '[{}]'
+syn match loutBIBraces '[{}]'
+syn match loutHeads '[{}]'
+
+" Unmatched braces.
+syn match loutBraceError '}'
+
+" End of multi-line definitions, like @Document, @Report and @Book.
+syn match loutEOmlDef '^//$'
+
+" Grouping of parameters and objects.
+syn region loutObject transparent matchgroup=Delimiter start='{' matchgroup=Delimiter end='}' contains=ALLBUT,loutBraceError
+
+" The NULL object has a special meaning
+syn keyword loutNULL {}
+
+" Comments
+syn region loutComment start='\#' end='$' contains=loutTodo
+
+" Double quotes
+syn region loutSpecial start=+"+ skip=+\\\\\|\\"+ end=+"+
+
+" ISO-LATIN-1 characters created with @Char, or Adobe symbols
+" created with @Sym
+syn match loutSymbols '@\(\(Char\)\|\(Sym\)\)\s\+[A-Za-z]\+'
+
+" Include files
+syn match loutInclude '@IncludeGraphic\s\+\k\+'
+syn region loutInclude start='@\(\(SysInclude\)\|\(IncludeGraphic\)\|\(Include\)\)\s*{' end='}'
+
+" Tags
+syn match loutTag '@\(\(Tag\)\|\(PageMark\)\|\(PageOf\)\|\(NumberOf\)\)\s\+\k\+'
+syn region loutTag start='@Tag\s*{' end='}'
+
+" Equations
+syn match loutMath '@Eq\s\+\k\+'
+syn region loutMath matchgroup=loutMBraces start='@Eq\s*{' matchgroup=loutMBraces end='}' contains=ALLBUT,loutBraceError
+"
+" Fonts
+syn match loutItalic '@I\s\+\k\+'
+syn region loutItalic matchgroup=loutIBraces start='@I\s*{' matchgroup=loutIBraces end='}' contains=ALLBUT,loutBraceError
+syn match loutBold '@B\s\+\k\+'
+syn region loutBold matchgroup=loutBBraces start='@B\s*{' matchgroup=loutBBraces end='}' contains=ALLBUT,loutBraceError
+syn match loutBoldItalic '@BI\s\+\k\+'
+syn region loutBoldItalic matchgroup=loutBIBraces start='@BI\s*{' matchgroup=loutBIBraces end='}' contains=ALLBUT,loutBraceError
+syn region loutHeadings matchgroup=loutHeads start='@\(\(Title\)\|\(Caption\)\)\s*{' matchgroup=loutHeads end='}' contains=ALLBUT,loutBraceError
+
+" Define the default highlighting.
+" 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"
+
+let &cpo=s:cpo_save
+unlet s:cpo_save
+
+" vim:ts=8:sw=4:nocindent:smartindent:
diff --git a/runtime/syntax/lpc.vim b/runtime/syntax/lpc.vim
new file mode 100644
index 0000000..7d85fce
--- /dev/null
+++ b/runtime/syntax/lpc.vim
@@ -0,0 +1,447 @@
+" Vim syntax file
+" Language: LPC
+" Maintainer: Shizhu Pan <poet@mudbuilder.net>
+" URL: http://poet.tomud.com/pub/lpc.vim.bz2
+" 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
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Nodule: Keywords {{{1
+
+" LPC keywords
+" keywords should always be highlighted so "contained" is not used.
+syn cluster lpcKeywdGrp contains=lpcConditional,lpcLabel,lpcOperator,lpcRepeat,lpcStatement,lpcModifier,lpcReserved
+
+syn keyword lpcConditional if else switch
+syn keyword lpcLabel case default
+syn keyword lpcOperator catch efun in inherit
+syn keyword lpcRepeat do for foreach while
+syn keyword lpcStatement break continue return
+
+syn match lpcEfunError /efun[^:]/ display
+
+" Illegal to use keyword as function
+" It's not working, maybe in the next version.
+syn keyword lpcKeywdError contained if for foreach return switch while
+
+" These are keywords only because they take lvalue or type as parameter,
+" so these keywords should only be used as function but cannot be names of
+" user-defined functions.
+syn keyword lpcKeywdFunc new parse_command sscanf time_expression
+
+" Nodule: Type and modifiers {{{1
+
+" Type names list.
+
+" Special types
+syn keyword lpcType void mixed unknown
+" Scalar/Value types.
+syn keyword lpcType int float string
+" Pointer types.
+syn keyword lpcType array buffer class function mapping object
+" Other types.
+if exists("lpc_compat_32")
+ syn keyword lpcType closure status funcall
+else
+ syn keyword lpcError closure status
+ syn keyword lpcType multiset
+endif
+
+" Type modifier.
+syn keyword lpcModifier nomask private public
+syn keyword lpcModifier varargs virtual
+
+" sensible modifiers
+if exists("lpc_pre_v22")
+ syn keyword lpcReserved nosave protected ref
+ syn keyword lpcModifier static
+else
+ syn keyword lpcError static
+ syn keyword lpcModifier nosave protected ref
+endif
+
+" Nodule: Applies {{{1
+
+" Match a function declaration or function pointer
+syn match lpcApplyDecl excludenl /->\h\w*(/me=e-1 contains=lpcApplies transparent display
+
+" We should note that in func_spec.c the efun definition syntax is so
+" complicated that I use such a long regular expression to describe.
+syn match lpcLongDecl excludenl /\(\s\|\*\)\h\+\s\h\+(/me=e-1 contains=@lpcEfunGroup,lpcType,@lpcKeywdGrp transparent display
+
+" this is form for all functions
+" ->foo() form had been excluded
+syn match lpcFuncDecl excludenl /\h\w*(/me=e-1 contains=lpcApplies,@lpcEfunGroup,lpcKeywdError transparent display
+
+" The (: :) parenthesis or $() forms a function pointer
+syn match lpcFuncName /(:\s*\h\+\s*:)/me=e-1 contains=lpcApplies,@lpcEfunGroup transparent display contained
+syn match lpcFuncName /(:\s*\h\+,/ contains=lpcApplies,@lpcEfunGroup transparent display contained
+syn match lpcFuncName /\$(\h\+)/ contains=lpcApplies,@lpcEfunGroup transparent display contained
+
+" Applies list.
+" system applies
+syn keyword lpcApplies contained __INIT clean_up create destructor heart_beat id init move_or_destruct reset
+" interactive
+syn keyword lpcApplies contained catch_tell logon net_dead process_input receive_message receive_snoop telnet_suboption terminal_type window_size write_prompt
+" master applies
+syn keyword lpcApplies contained author_file compile_object connect crash creator_file domain_file epilog error_handler flag get_bb_uid get_root_uid get_save_file_name log_error make_path_absolute object_name preload privs_file retrieve_ed_setup save_ed_setup slow_shutdown
+syn keyword lpcApplies contained valid_asm valid_bind valid_compile_to_c valid_database valid_hide valid_link valid_object valid_override valid_read valid_save_binary valid_seteuid valid_shadow valid_socket valid_write
+" parsing
+syn keyword lpcApplies contained inventory_accessible inventory_visible is_living parse_command_adjectiv_id_list parse_command_adjective_id_list parse_command_all_word parse_command_id_list parse_command_plural_id_list parse_command_prepos_list parse_command_users parse_get_environment parse_get_first_inventory parse_get_next_inventory parser_error_message
+
+
+" Nodule: Efuns {{{1
+
+syn cluster lpcEfunGroup contains=lpc_efuns,lpcOldEfuns,lpcNewEfuns,lpcKeywdFunc
+
+" Compat32 efuns
+if exists("lpc_compat_32")
+ syn keyword lpc_efuns contained closurep heart_beat_info m_delete m_values m_indices query_once_interactive strstr
+else
+ syn match lpcErrFunc /#`\h\w*/
+ " Shell compatible first line comment.
+ syn region lpcCommentFunc start=/^#!/ end=/$/
+endif
+
+" pre-v22 efuns which are removed in newer versions.
+syn keyword lpcOldEfuns contained tail dump_socket_status
+
+" new efuns after v22 should be added here!
+syn keyword lpcNewEfuns contained socket_status
+
+" LPC efuns list.
+" DEBUG efuns Not included.
+" New efuns should NOT be added to this list, see v22 efuns above.
+" Efuns list {{{2
+syn keyword lpc_efuns contained acos add_action all_inventory all_previous_objects allocate allocate_buffer allocate_mapping apply arrayp asin atan author_stats
+syn keyword lpc_efuns contained bind break_string bufferp
+syn keyword lpc_efuns contained cache_stats call_other call_out call_out_info call_stack capitalize catch ceil check_memory children classp clear_bit clone_object clonep command commands copy cos cp crc32 crypt ctime
+syn keyword lpc_efuns contained db_close db_commit db_connect db_exec db_fetch db_rollback db_status debug_info debugmalloc debug_message deep_inherit_list deep_inventory destruct disable_commands disable_wizard domain_stats dumpallobj dump_file_descriptors dump_prog
+syn keyword lpc_efuns contained each ed ed_cmd ed_start enable_commands enable_wizard environment error errorp eval_cost evaluate exec exp explode export_uid external_start
+syn keyword lpc_efuns contained fetch_variable file_length file_name file_size filter filter_array filter_mapping find_call_out find_living find_object find_player first_inventory floatp floor flush_messages function_exists function_owner function_profile functionp functions
+syn keyword lpc_efuns contained generate_source get_char get_config get_dir geteuid getuid
+syn keyword lpc_efuns contained heart_beats
+syn keyword lpc_efuns contained id_matrix implode in_edit in_input inherit_list inherits input_to interactive intp
+syn keyword lpc_efuns contained keys
+syn keyword lpc_efuns contained link living livings load_object localtime log log10 lookat_rotate lower_case lpc_info
+syn keyword lpc_efuns contained malloc_check malloc_debug malloc_status map map_array map_delete map_mapping mapp master match_path max_eval_cost member_array memory_info memory_summary message mkdir moncontrol move_object mud_status
+syn keyword lpc_efuns contained named_livings network_stats next_bit next_inventory notify_fail nullp
+syn keyword lpc_efuns contained objectp objects oldcrypt opcprof origin
+syn keyword lpc_efuns contained parse_add_rule parse_add_synonym parse_command parse_dump parse_init parse_my_rules parse_refresh parse_remove parse_sentence pluralize pointerp pow present previous_object printf process_string process_value program_info
+syn keyword lpc_efuns contained query_ed_mode query_heart_beat query_host_name query_idle query_ip_name query_ip_number query_ip_port query_load_average query_notify_fail query_privs query_replaced_program query_shadowing query_snoop query_snooping query_verb
+syn keyword lpc_efuns contained random read_buffer read_bytes read_file receive reclaim_objects refs regexp reg_assoc reload_object remove_action remove_call_out remove_interactive remove_shadow rename repeat_string replace_program replace_string replaceable reset_eval_cost resolve restore_object restore_variable rm rmdir rotate_x rotate_y rotate_z rusage
+syn keyword lpc_efuns contained save_object save_variable say scale set_author set_bit set_eval_limit set_heart_beat set_hide set_light set_living_name set_malloc_mask set_privs set_reset set_this_player set_this_user seteuid shadow shallow_inherit_list shout shutdown sin sizeof snoop socket_accept socket_acquire socket_address socket_bind socket_close socket_connect socket_create socket_error socket_listen socket_release socket_write sort_array sprintf sqrt stat store_variable strcmp stringp strlen strsrch
+syn keyword lpc_efuns contained tan tell_object tell_room terminal_colour test_bit this_interactive this_object this_player this_user throw time to_float to_int trace traceprefix translate typeof
+syn keyword lpc_efuns contained undefinedp unique_array unique_mapping upper_case uptime userp users
+syn keyword lpc_efuns contained values variables virtualp
+syn keyword lpc_efuns contained wizardp write write_buffer write_bytes write_file
+
+" Nodule: Constants {{{1
+
+" LPC Constants.
+" like keywords, constants are always highlighted, be careful to choose only
+" the constants we used to add to this list.
+syn keyword lpcConstant __ARCH__ __COMPILER__ __DIR__ __FILE__ __OPTIMIZATION__ __PORT__ __VERSION__
+" Defines in options.h are all predefined in LPC sources surrounding by
+" two underscores. Do we need to include all of that?
+syn keyword lpcConstant __SAVE_EXTENSION__ __HEARTBEAT_INTERVAL__
+" from the documentation we know that these constants remains only for
+" backward compatibility and should not be used any more.
+syn keyword lpcConstant HAS_ED HAS_PRINTF HAS_RUSAGE HAS_DEBUG_LEVEL
+syn keyword lpcConstant MUD_NAME F__THIS_OBJECT
+
+" Nodule: Todo for this file. {{{1
+
+" TODO : need to check for LPC4 syntax and other series of LPC besides
+" v22, b21 and l32, if you had a good idea, contact me at poet@mudbuilder.net
+" and I will be appreciated about that.
+
+" Notes about some FAQ:
+"
+" About variables : We adopts the same behavior for C because almost all the
+" LPC programmers are also C programmers, so we don't need separate settings
+" for C and LPC. That is the reason why I don't change variables like
+" "c_no_utf"s to "lpc_no_utf"s.
+"
+" Copy : Some of the following seems to be copied from c.vim but not quite
+" the same in details because the syntax for C and LPC is different.
+"
+" Color scheme : this syntax file had been thouroughly tested to work well
+" for all of the dark-backgrounded color schemes Vim has provided officially,
+" and it should be quite Ok for all of the bright-backgrounded color schemes,
+" of course it works best for the color scheme that I am using, download it
+" from http://poet.tomud.com/pub/ps_color.vim.bz2 if you want to try it.
+"
+
+" Nodule: String and Character {{{1
+
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match lpcSpecial display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"
+if !exists("c_no_utf")
+ syn match lpcSpecial display contained "\\\(u\x\{4}\|U\x\{8}\)"
+endif
+
+" LPC version of sprintf() format,
+syn match lpcFormat display "%\(\d\+\)\=[-+ |=#@:.]*\(\d\+\)\=\('\I\+'\|'\I*\\'\I*'\)\=[OsdicoxXf]" contained
+syn match lpcFormat display "%%" contained
+syn region lpcString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=lpcSpecial,lpcFormat
+" lpcCppString: same as lpcString, but ends at end of line
+syn region lpcCppString start=+L\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=lpcSpecial,lpcFormat
+
+" LPC preprocessor for the text formatting short cuts
+" Thanks to Dr. Charles E. Campbell <cec@gryphon.gsfc.nasa.gov>
+" he suggests the best way to do this.
+syn region lpcTextString start=/@\z(\h\w*\)$/ end=/^\z1/ contains=lpcSpecial
+syn region lpcArrayString start=/@@\z(\h\w*\)$/ end=/^\z1/ contains=lpcSpecial
+
+" Character
+syn match lpcCharacter "L\='[^\\]'"
+syn match lpcCharacter "L'[^']*'" contains=lpcSpecial
+syn match lpcSpecialError "L\='\\[^'\"?\\abefnrtv]'"
+syn match lpcSpecialCharacter "L\='\\['\"?\\abefnrtv]'"
+syn match lpcSpecialCharacter display "L\='\\\o\{1,3}'"
+syn match lpcSpecialCharacter display "'\\x\x\{1,2}'"
+syn match lpcSpecialCharacter display "L'\\x\x\+'"
+
+" Nodule: White space {{{1
+
+" when wanted, highlight trailing white space
+if exists("c_space_errors")
+ if !exists("c_no_trail_space_error")
+ syn match lpcSpaceError display excludenl "\s\+$"
+ endif
+ if !exists("c_no_tab_space_error")
+ syn match lpcSpaceError display " \+\t"me=e-1
+ endif
+endif
+
+" Nodule: Parenthesis and brackets {{{1
+
+" catch errors caused by wrong parenthesis and brackets
+syn cluster lpcParenGroup contains=lpcParenError,lpcIncluded,lpcSpecial,lpcCommentSkip,lpcCommentString,lpcComment2String,@lpcCommentGroup,lpcCommentStartError,lpcUserCont,lpcUserLabel,lpcBitField,lpcCommentSkip,lpcOctalZero,lpcCppOut,lpcCppOut2,lpcCppSkip,lpcFormat,lpcNumber,lpcFloat,lpcOctal,lpcOctalError,lpcNumbersCom
+syn region lpcParen transparent start='(' end=')' contains=ALLBUT,@lpcParenGroup,lpcCppParen,lpcErrInBracket,lpcCppBracket,lpcCppString,@lpcEfunGroup,lpcApplies,lpcKeywdError
+" lpcCppParen: same as lpcParen but ends at end-of-line; used in lpcDefine
+syn region lpcCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@lpcParenGroup,lpcErrInBracket,lpcParen,lpcBracket,lpcString,@lpcEfunGroup,lpcApplies,lpcKeywdError
+syn match lpcParenError display ")"
+syn match lpcParenError display "\]"
+" for LPC:
+" Here we should consider the array ({ }) parenthesis and mapping ([ ])
+" parenthesis and multiset (< >) parenthesis.
+syn match lpcErrInParen display contained "[^^]{"ms=s+1
+syn match lpcErrInParen display contained "\(}\|\]\)[^)]"me=e-1
+syn region lpcBracket transparent start='\[' end=']' contains=ALLBUT,@lpcParenGroup,lpcErrInParen,lpcCppParen,lpcCppBracket,lpcCppString,@lpcEfunGroup,lpcApplies,lpcFuncName,lpcKeywdError
+" lpcCppBracket: same as lpcParen but ends at end-of-line; used in lpcDefine
+syn region lpcCppBracket transparent start='\[' skip='\\$' excludenl end=']' end='$' contained contains=ALLBUT,@lpcParenGroup,lpcErrInParen,lpcParen,lpcBracket,lpcString,@lpcEfunGroup,lpcApplies,lpcFuncName,lpcKeywdError
+syn match lpcErrInBracket display contained "[);{}]"
+
+" Nodule: Numbers {{{1
+
+" integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match lpcNumbers display transparent "\<\d\|\.\d" contains=lpcNumber,lpcFloat,lpcOctalError,lpcOctal
+" Same, but without octal error (for comments)
+syn match lpcNumbersCom display contained transparent "\<\d\|\.\d" contains=lpcNumber,lpcFloat,lpcOctal
+syn match lpcNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
+" hex number
+syn match lpcNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+" Flag the first zero of an octal number as something special
+syn match lpcOctal display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=lpcOctalZero
+syn match lpcOctalZero display contained "\<0"
+syn match lpcFloat display contained "\d\+f"
+" floating point number, with dot, optional exponent
+syn match lpcFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
+" floating point number, starting with a dot, optional exponent
+syn match lpcFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+" floating point number, without dot, with exponent
+syn match lpcFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>"
+" flag an octal number with wrong digits
+syn match lpcOctalError display contained "0\o*[89]\d*"
+syn case match
+
+" Nodule: Comment string {{{1
+
+" lpcCommentGroup allows adding matches for special things in comments
+syn keyword lpcTodo contained TODO FIXME XXX
+syn cluster lpcCommentGroup contains=lpcTodo
+
+if exists("c_comment_strings")
+ " A comment can contain lpcString, lpcCharacter and lpcNumber.
+ syntax match lpcCommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region lpcCommentString contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=lpcSpecial,lpcCommentSkip
+ syntax region lpcComment2String contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=lpcSpecial
+ syntax region lpcCommentL start="//" skip="\\$" end="$" keepend contains=@lpcCommentGroup,lpcComment2String,lpcCharacter,lpcNumbersCom,lpcSpaceError
+ syntax region lpcComment matchgroup=lpcCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@lpcCommentGroup,lpcCommentStartError,lpcCommentString,lpcCharacter,lpcNumbersCom,lpcSpaceError
+else
+ syn region lpcCommentL start="//" skip="\\$" end="$" keepend contains=@lpcCommentGroup,lpcSpaceError
+ syn region lpcComment matchgroup=lpcCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@lpcCommentGroup,lpcCommentStartError,lpcSpaceError
+endif
+" keep a // comment separately, it terminates a preproc. conditional
+syntax match lpcCommentError display "\*/"
+syntax match lpcCommentStartError display "/\*"me=e-1 contained
+
+" Nodule: Pre-processor {{{1
+
+syn region lpcPreCondit start="^\s*#\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=lpcComment,lpcCppString,lpcCharacter,lpcCppParen,lpcParenError,lpcNumbers,lpcCommentError,lpcSpaceError
+syn match lpcPreCondit display "^\s*#\s*\(else\|endif\)\>"
+if !exists("c_no_if0")
+ syn region lpcCppOut start="^\s*#\s*if\s\+0\+\>" end=".\|$" contains=lpcCppOut2
+ syn region lpcCppOut2 contained start="0" end="^\s*#\s*\(endif\>\|else\>\|elif\>\)" contains=lpcSpaceError,lpcCppSkip
+ syn region lpcCppSkip contained start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*#\s*endif\>" contains=lpcSpaceError,lpcCppSkip
+endif
+syn region lpcIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match lpcIncluded display contained "<[^>]*>"
+syn match lpcInclude display "^\s*#\s*include\>\s*["<]" contains=lpcIncluded
+syn match lpcLineSkip "\\$"
+syn cluster lpcPreProcGroup contains=lpcPreCondit,lpcIncluded,lpcInclude,lpcDefine,lpcErrInParen,lpcErrInBracket,lpcUserLabel,lpcSpecial,lpcOctalZero,lpcCppOut,lpcCppOut2,lpcCppSkip,lpcFormat,lpcNumber,lpcFloat,lpcOctal,lpcOctalError,lpcNumbersCom,lpcString,lpcCommentSkip,lpcCommentString,lpcComment2String,@lpcCommentGroup,lpcCommentStartError,lpcParen,lpcBracket,lpcMulti,lpcKeywdError
+syn region lpcDefine start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@lpcPreProcGroup
+
+if exists("lpc_pre_v22")
+ syn region lpcPreProc start="^\s*#\s*\(pragma\>\|echo\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@lpcPreProcGroup
+else
+ syn region lpcPreProc start="^\s*#\s*\(pragma\>\|echo\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@lpcPreProcGroup
+endif
+
+" Nodule: User labels {{{1
+
+" Highlight Labels
+" User labels in LPC is not allowed, only "case x" and "default" is supported
+syn cluster lpcMultiGroup contains=lpcIncluded,lpcSpecial,lpcCommentSkip,lpcCommentString,lpcComment2String,@lpcCommentGroup,lpcCommentStartError,lpcUserCont,lpcUserLabel,lpcBitField,lpcOctalZero,lpcCppOut,lpcCppOut2,lpcCppSkip,lpcFormat,lpcNumber,lpcFloat,lpcOctal,lpcOctalError,lpcNumbersCom,lpcCppParen,lpcCppBracket,lpcCppString,lpcKeywdError
+syn region lpcMulti transparent start='\(case\|default\|public\|protected\|private\)' skip='::' end=':' contains=ALLBUT,@lpcMultiGroup
+
+syn cluster lpcLabelGroup contains=lpcUserLabel
+syn match lpcUserCont display "^\s*lpc:$" contains=@lpcLabelGroup
+
+" Don't want to match anything
+syn match lpcUserLabel display "lpc" contained
+
+" Nodule: Initializations {{{1
+
+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 lpcComment minlines=" . b:c_minlines
+
+" Make sure these options take place since we no longer depend on file type
+" plugin for C
+setlocal cindent
+setlocal fo-=t fo+=croql
+setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,://
+
+" Win32 can filter files in the browse dialog
+if has("gui_win32") && !exists("b:browsefilter")
+ let b:browsefilter = "LPC Source Files (*.c *.d *.h)\t*.c;*.d;*.h\n" .
+ \ "LPC Data Files (*.scr *.o *.dat)\t*.scr;*.o;*.dat\n" .
+ \ "Text Documentation (*.txt)\t*.txt\n" .
+ \ "All Files (*.*)\t*.*\n"
+endif
+
+" Nodule: Highlight links {{{1
+
+" Define the default highlighting.
+" 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
+
+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
+
+let b:current_syntax = "lpc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:ts=8:nosta:sw=2:ai:si:
+" vim600:set fdm=marker: }}}1
diff --git a/runtime/syntax/lprolog.vim b/runtime/syntax/lprolog.vim
new file mode 100644
index 0000000..85c3537
--- /dev/null
+++ b/runtime/syntax/lprolog.vim
@@ -0,0 +1,124 @@
+" Vim syntax file
+" Language: LambdaProlog (Teyjus)
+" Filenames: *.mod *.sig
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" URL: http://www.ocaml.info/vim/syntax/lprolog.vim
+" Last Change: 2006 Feb 05
+" 2001 Apr 26 - Upgraded for new Vim version
+" 2000 Jun 5 - Initial release
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Lambda Prolog is case sensitive.
+syn case match
+
+syn match lprologBrackErr "\]"
+syn match lprologParenErr ")"
+
+syn cluster lprologContained contains=lprologTodo,lprologModuleName,lprologTypeNames,lprologTypeName
+
+" Enclosing delimiters
+syn region lprologEncl transparent matchgroup=lprologKeyword start="(" matchgroup=lprologKeyword end=")" contains=ALLBUT,@lprologContained,lprologParenErr
+syn region lprologEncl transparent matchgroup=lprologKeyword start="\[" matchgroup=lprologKeyword end="\]" contains=ALLBUT,@lprologContained,lprologBrackErr
+
+" General identifiers
+syn match lprologIdentifier "\<\(\w\|[-+*/\\^<>=`'~?@#$&!_]\)*\>"
+syn match lprologVariable "\<\(\u\|_\)\(\w\|[-+*/\\^<>=`'~?@#$&!]\)*\>"
+
+syn match lprologOperator "/"
+
+" Comments
+syn region lprologComment start="/\*" end="\*/" contains=lprologComment,lprologTodo
+syn region lprologComment start="%" end="$" contains=lprologTodo
+syn keyword lprologTodo contained TODO FIXME XXX
+
+syn match lprologInteger "\<\d\+\>"
+syn match lprologReal "\<\(\d\+\)\=\.\d+\>"
+syn region lprologString start=+"+ skip=+\\\\\|\\"+ end=+"+
+
+" Clause definitions
+syn region lprologClause start="^\w\+" end=":-\|\."
+
+" Modules
+syn region lprologModule matchgroup=lprologKeyword start="^\<module\>" matchgroup=lprologKeyword end="\."
+
+" Types
+syn match lprologKeyword "^\<type\>" skipwhite nextgroup=lprologTypeNames
+syn region lprologTypeNames matchgroup=lprologBraceErr start="\<\w\+\>" matchgroup=lprologKeyword end="\." contained contains=lprologTypeName,lprologOperator
+syn match lprologTypeName "\<\w\+\>" contained
+
+" Keywords
+syn keyword lprologKeyword end import accumulate accum_sig
+syn keyword lprologKeyword local localkind closed sig
+syn keyword lprologKeyword kind exportdef useonly
+syn keyword lprologKeyword infixl infixr infix prefix
+syn keyword lprologKeyword prefixr postfix postfixl
+
+syn keyword lprologSpecial pi sigma is true fail halt stop not
+
+" Operators
+syn match lprologSpecial ":-"
+syn match lprologSpecial "->"
+syn match lprologSpecial "=>"
+syn match lprologSpecial "\\"
+syn match lprologSpecial "!"
+
+syn match lprologSpecial ","
+syn match lprologSpecial ";"
+syn match lprologSpecial "&"
+
+syn match lprologOperator "+"
+syn match lprologOperator "-"
+syn match lprologOperator "*"
+syn match lprologOperator "\~"
+syn match lprologOperator "\^"
+syn match lprologOperator "<"
+syn match lprologOperator ">"
+syn match lprologOperator "=<"
+syn match lprologOperator ">="
+syn match lprologOperator "::"
+syn match lprologOperator "="
+
+syn match lprologOperator "\."
+syn match lprologOperator ":"
+syn match lprologOperator "|"
+
+syn match lprologCommentErr "\*/"
+
+syn sync minlines=50
+syn sync maxlines=500
+
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/lscript.vim b/runtime/syntax/lscript.vim
new file mode 100644
index 0000000..3c4a0ff
--- /dev/null
+++ b/runtime/syntax/lscript.vim
@@ -0,0 +1,200 @@
+" Vim syntax file
+" Language: LotusScript
+" Maintainer: Taryn East (taryneast@hotmail.com)
+" Last Change: 2003 May 11
+
+" This is a rough amalgamation of the visual basic syntax file, and the UltraEdit
+" and Textpad syntax highlighters.
+" It's not too brilliant given that a) I've never written a syntax.vim file before
+" and b) I'm not so crash hot at LotusScript either. If you see any problems
+" feel free to email me with them.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" LotusScript is case insensitive
+syn case ignore
+
+" These are Notes thingies that had an equivalent in the vb highlighter
+" or I was already familiar with them
+syn keyword lscriptStatement ActivateApp As And Base Beep Call Case ChDir ChDrive Class
+syn keyword lscriptStatement Const Dim Declare DefCur DefDbl DefInt DefLng DefSng DefStr
+syn keyword lscriptStatement DefVar Do Else %Else ElseIf %ElseIf End %End Erase Event Exit
+syn keyword lscriptStatement Explicit FileCopy FALSE For ForAll Function Get GoTo GoSub
+syn keyword lscriptStatement If %If In Is Kill Let List Lock Loop MkDir
+syn keyword lscriptStatement Name Next New NoCase NoPitch Not Nothing NULL
+syn keyword lscriptStatement On Option Or PI Pitch Preserve Private Public
+syn keyword lscriptStatement Property Public Put
+syn keyword lscriptStatement Randomize ReDim Reset Resume Return RmDir
+syn keyword lscriptStatement Select SendKeys SetFileAttr Set Static Sub Then To TRUE
+syn keyword lscriptStatement Type Unlock Until While WEnd With Write XOr
+
+syn keyword lscriptDatatype Array Currency Double Integer Long Single String String$ Variant
+
+syn keyword lscriptNotesType Field Button Navigator
+syn keyword lscriptNotesType NotesACL NotesACLEntry NotesAgent NotesDatabase NotesDateRange
+syn keyword lscriptNotesType NotesDateTime NotesDbDirectory NotesDocument
+syn keyword lscriptNotesType NotesDocumentCollection NotesEmbeddedObject NotesForm
+syn keyword lscriptNotesType NotesInternational NotesItem NotesLog NotesName NotesNewsLetter
+syn keyword lscriptNotesType NotesMIMEEntry NotesOutline NotesOutlineEntry NotesRegistration
+syn keyword lscriptNotesType NotesReplication NotesRichTextItem NotesRichTextParagraphStyle
+syn keyword lscriptNotesType NotesRichTextStyle NotesRichTextTab
+syn keyword lscriptNotesType NotesSession NotesTimer NotesView NotesViewColumn NotesViewEntry
+syn keyword lscriptNotesType NotesViewEntryCollection NotesViewNavigator NotesUIDatabase
+syn keyword lscriptNotesType NotesUIDocument NotesUIView NotesUIWorkspace
+
+syn keyword lscriptNotesConst ACLLEVEL_AUTHOR ACLLEVEL_DEPOSITOR ACLLEVEL_DESIGNER
+syn keyword lscriptNotesConst ACLLEVEL_EDITOR ACLLEVEL_MANAGER ACLLEVEL_NOACCESS
+syn keyword lscriptNotesConst ACLLEVEL_READER ACLTYPE_MIXED_GROUP ACLTYPE_PERSON
+syn keyword lscriptNotesConst ACLTYPE_PERSON_GROUP ACLTYPE_SERVER ACLTYPE_SERVER_GROUP
+syn keyword lscriptNotesConst ACLTYPE_UNSPECIFIED ACTIONCD ALIGN_CENTER
+syn keyword lscriptNotesConst ALIGN_FULL ALIGN_LEFT ALIGN_NOWRAP ALIGN_RIGHT
+syn keyword lscriptNotesConst ASSISTANTINFO ATTACHMENT AUTHORS COLOR_BLACK
+syn keyword lscriptNotesConst COLOR_BLUE COLOR_CYAN COLOR_DARK_BLUE COLOR_DARK_CYAN
+syn keyword lscriptNotesConst COLOR_DARK_GREEN COLOR_DARK_MAGENTA COLOR_DARK_RED
+syn keyword lscriptNotesConst COLOR_DARK_YELLOW COLOR_GRAY COLOR_GREEN COLOR_LIGHT_GRAY
+syn keyword lscriptNotesConst COLOR_MAGENTA COLOR_RED COLOR_WHITE COLOR_YELLOW
+syn keyword lscriptNotesConst DATABASE DATETIMES DB_REPLICATION_PRIORITY_HIGH
+syn keyword lscriptNotesConst DB_REPLICATION_PRIORITY_LOW DB_REPLICATION_PRIORITY_MED
+syn keyword lscriptNotesConst DB_REPLICATION_PRIORITY_NOTSET EFFECTS_EMBOSS
+syn keyword lscriptNotesConst EFFECTS_EXTRUDE EFFECTS_NONE EFFECTS_SHADOW
+syn keyword lscriptNotesConst EFFECTS_SUBSCRIPT EFFECTS_SUPERSCRIPT EMBED_ATTACHMENT
+syn keyword lscriptNotesConst EMBED_OBJECT EMBED_OBJECTLINK EMBEDDEDOBJECT ERRORITEM
+syn keyword lscriptNotesConst EV_ALARM EV_COMM EV_MAIL EV_MISC EV_REPLICA EV_RESOURCE
+syn keyword lscriptNotesConst EV_SECURITY EV_SERVER EV_UNKNOWN EV_UPDATE FONT_COURIER
+syn keyword lscriptNotesConst FONT_HELV FONT_ROMAN FORMULA FT_DATABASE FT_DATE_ASC
+syn keyword lscriptNotesConst FT_DATE_DES FT_FILESYSTEM FT_FUZZY FT_SCORES FT_STEMS
+syn keyword lscriptNotesConst FT_THESAURUS HTML ICON ID_CERTIFIER ID_FLAT
+syn keyword lscriptNotesConst ID_HIERARCHICAL LSOBJECT MIME_PART NAMES NOTESLINKS
+syn keyword lscriptNotesConst NOTEREFS NOTES_DESKTOP_CLIENT NOTES_FULL_CLIENT
+syn keyword lscriptNotesConst NOTES_LIMITED_CLIENT NUMBERS OTHEROBJECT
+syn keyword lscriptNotesConst OUTLINE_CLASS_DATABASE OUTLINE_CLASS_DOCUMENT
+syn keyword lscriptNotesConst OUTLINE_CLASS_FOLDER OUTLINE_CLASS_FORM
+syn keyword lscriptNotesConst OUTLINE_CLASS_FRAMESET OUTLINE_CLASS_NAVIGATOR
+syn keyword lscriptNotesConst OUTLINE_CLASS_PAGE OUTLINE_CLASS_UNKNOWN
+syn keyword lscriptNotesConst OUTLINE_CLASS_VIEW OUTLINE_OTHER_FOLDERS_TYPE
+syn keyword lscriptNotesConst OUTLINE_OTHER_UNKNOWN_TYPE OUTLINE_OTHER_VIEWS_TYPE
+syn keyword lscriptNotesConst OUTLINE_TYPE_ACTION OUTLINE_TYPE_NAMEDELEMENT
+syn keyword lscriptNotesConst OUTLINE_TYPE_NOTELINK OUTLINE_TYPE_URL PAGINATE_BEFORE
+syn keyword lscriptNotesConst PAGINATE_DEFAULT PAGINATE_KEEP_TOGETHER
+syn keyword lscriptNotesConst PAGINATE_KEEP_WITH_NEXT PICKLIST_CUSTOM PICKLIST_NAMES
+syn keyword lscriptNotesConst PICKLIST_RESOURCES PICKLIST_ROOMS PROMPT_OK PROMPT_OKCANCELCOMBO
+syn keyword lscriptNotesConst PROMPT_OKCANCELEDIT PROMPT_OKCANCELEDITCOMBO PROMPT_OKCANCELLIST
+syn keyword lscriptNotesConst PROMPT_OKCANCELLISTMULT PROMPT_PASSWORD PROMPT_YESNO
+syn keyword lscriptNotesConst PROMPT_YESNOCANCEL QUERYCD READERS REPLICA_CANDIDATE
+syn keyword lscriptNotesConst RICHTEXT RULER_ONE_CENTIMETER RULER_ONE_INCH SEV_FAILURE
+syn keyword lscriptNotesConst SEV_FATAL SEV_NORMAL SEV_WARNING1 SEV_WARNING2
+syn keyword lscriptNotesConst SIGNATURE SPACING_DOUBLE SPACING_ONE_POINT_50
+syn keyword lscriptNotesConst SPACING_SINGLE STYLE_NO_CHANGE TAB_CENTER TAB_DECIMAL
+syn keyword lscriptNotesConst TAB_LEFT TAB_RIGHT TARGET_ALL_DOCS TARGET_ALL_DOCS_IN_VIEW
+syn keyword lscriptNotesConst TARGET_NEW_DOCS TARGET_NEW_OR_MODIFIED_DOCS TARGET_NONE
+syn keyword lscriptNotesConst TARGET_RUN_ONCE TARGET_SELECTED_DOCS TARGET_UNREAD_DOCS_IN_VIEW
+syn keyword lscriptNotesConst TEMPLATE TEMPLATE_CANDIDATE TEXT TRIGGER_AFTER_MAIL_DELIVERY
+syn keyword lscriptNotesConst TRIGGER_BEFORE_MAIL_DELIVERY TRIGGER_DOC_PASTED
+syn keyword lscriptNotesConst TRIGGER_DOC_UPDATE TRIGGER_MANUAL TRIGGER_NONE
+syn keyword lscriptNotesConst TRIGGER_SCHEDULED UNAVAILABLE UNKNOWN USERDATA
+syn keyword lscriptNotesConst USERID VC_ALIGN_CENTER VC_ALIGN_LEFT VC_ALIGN_RIGHT
+syn keyword lscriptNotesConst VC_ATTR_PARENS VC_ATTR_PUNCTUATED VC_ATTR_PERCENT
+syn keyword lscriptNotesConst VC_FMT_ALWAYS VC_FMT_CURRENCY VC_FMT_DATE VC_FMT_DATETIME
+syn keyword lscriptNotesConst VC_FMT_FIXED VC_FMT_GENERAL VC_FMT_HM VC_FMT_HMS
+syn keyword lscriptNotesConst VC_FMT_MD VC_FMT_NEVER VC_FMT_SCIENTIFIC
+syn keyword lscriptNotesConst VC_FMT_SOMETIMES VC_FMT_TIME VC_FMT_TODAYTIME VC_FMT_YM
+syn keyword lscriptNotesConst VC_FMT_YMD VC_FMT_Y4M VC_FONT_BOLD VC_FONT_ITALIC
+syn keyword lscriptNotesConst VC_FONT_STRIKEOUT VC_FONT_UNDERLINE VC_SEP_COMMA
+syn keyword lscriptNotesConst VC_SEP_NEWLINE VC_SEP_SEMICOLON VC_SEP_SPACE
+syn keyword lscriptNotesConst VIEWMAPDATA VIEWMAPLAYOUT VW_SPACING_DOUBLE
+syn keyword lscriptNotesConst VW_SPACING_ONE_POINT_25 VW_SPACING_ONE_POINT_50
+syn keyword lscriptNotesConst VW_SPACING_ONE_POINT_75 VW_SPACING_SINGLE
+
+syn keyword lscriptFunction Abs Asc Atn Atn2 ACos ASin
+syn keyword lscriptFunction CCur CDat CDbl Chr Chr$ CInt CLng Command Command$
+syn keyword lscriptFunction Cos CSng CStr
+syn keyword lscriptFunction CurDir CurDir$ CVar Date Date$ DateNumber DateSerial DateValue
+syn keyword lscriptFunction Day Dir Dir$ Environ$ Environ EOF Error Error$ Evaluate Exp
+syn keyword lscriptFunction FileAttr FileDateTime FileLen Fix Format Format$ FreeFile
+syn keyword lscriptFunction GetFileAttr GetThreadInfo Hex Hex$ Hour
+syn keyword lscriptFunction IMESetMode IMEStatus Input Input$ InputB InputB$
+syn keyword lscriptFunction InputBP InputBP$ InputBox InputBox$ InStr InStrB InStrBP InstrC
+syn keyword lscriptFunction IsA IsArray IsDate IsElement IsList IsNumeric
+syn keyword lscriptFunction IsObject IsResponse IsScalar IsUnknown LCase LCase$
+syn keyword lscriptFunction Left Left$ LeftB LeftB$ LeftC
+syn keyword lscriptFunction LeftBP LeftBP$ Len LenB LenBP LenC Loc LOF Log
+syn keyword lscriptFunction LSet LTrim LTrim$ MessageBox Mid Mid$ MidB MidB$ MidC
+syn keyword lscriptFunction Minute Month Now Oct Oct$ Responses Right Right$
+syn keyword lscriptFunction RightB RightB$ RightBP RightBP$ RightC Round Rnd RSet RTrim RTrim$
+syn keyword lscriptFunction Second Seek Sgn Shell Sin Sleep Space Space$ Spc Sqr Str Str$
+syn keyword lscriptFunction StrConv StrLeft StrleftBack StrRight StrRightBack
+syn keyword lscriptFunction StrCompare Tab Tan Time Time$ TimeNumber Timer
+syn keyword lscriptFunction TimeValue Trim Trim$ Today TypeName UCase UCase$
+syn keyword lscriptFunction UniversalID Val Weekday Year
+
+syn keyword lscriptMethods AppendToTextList ArrayAppend ArrayReplace ArrayGetIndex
+syn keyword lscriptMethods Append Bind Close
+"syn keyword lscriptMethods Contains
+syn keyword lscriptMethods CopyToDatabase CopyAllItems Count CurrentDatabase Delete Execute
+syn keyword lscriptMethods GetAllDocumentsByKey GetDatabase GetDocumentByKey
+syn keyword lscriptMethods GetDocumentByUNID GetFirstDocument GetFirstItem
+syn keyword lscriptMethods GetItems GetItemValue GetNthDocument GetView
+syn keyword lscriptMethods IsEmpty IsNull %Include Items
+syn keyword lscriptMethods Line LBound LoadMsgText Open Print
+syn keyword lscriptMethods RaiseEvent ReplaceItemValue Remove RemoveItem Responses
+syn keyword lscriptMethods Save Stop UBound UnprocessedDocuments Write
+
+syn keyword lscriptEvents Compare OnError
+
+"*************************************************************************************
+"These are Notes thingies that I'm not sure how to classify as they had no vb equivalent
+" At a wild guess I'd put them as Functions...
+" if anyone sees something really out of place... tell me!
+
+syn keyword lscriptFunction Access Alias Any Bin Bin$ Binary ByVal
+syn keyword lscriptFunction CodeLock CodeLockCheck CodeUnlock CreateLock
+syn keyword lscriptFunction CurDrive CurDrive$ DataType DestroyLock Eqv
+syn keyword lscriptFunction Erl Err Fraction From FromFunction FullTrim
+syn keyword lscriptFunction Imp Int Lib Like ListTag LMBCS LSServer Me
+syn keyword lscriptFunction Mod MsgDescription MsgText Output Published
+syn keyword lscriptFunction Random Read Shared Step UChr UChr$ Uni Unicode
+syn keyword lscriptFunction Until Use UseLSX UString UString$ Width Yield
+
+
+syn keyword lscriptTodo contained TODO
+
+"integer number, or floating point number without a dot.
+syn match lscriptNumber "\<\d\+\>"
+"floating point number, with dot
+syn match lscriptNumber "\<\d\+\.\d*\>"
+"floating point number, starting with a dot
+syn match lscriptNumber "\.\d\+\>"
+
+" String and Character constants
+syn region lscriptString start=+"+ end=+"+
+syn region lscriptComment start="REM" end="$" contains=lscriptTodo
+syn region lscriptComment start="'" end="$" contains=lscriptTodo
+syn region lscriptLineNumber start="^\d" end="\s"
+syn match lscriptTypeSpecifier "[a-zA-Z0-9][\$%&!#]"ms=s+1
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/lsl.vim b/runtime/syntax/lsl.vim
new file mode 100644
index 0000000..3b2baa0
--- /dev/null
+++ b/runtime/syntax/lsl.vim
@@ -0,0 +1,277 @@
+" Vim syntax file
+" Language: Linden Scripting Language
+" Maintainer: Timo Frenay <timo@frenay.net>
+" Last Change: 2012 Apr 30
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Initializations
+syn case match
+
+" Keywords
+syn keyword lslKeyword default do else for if jump return state while
+
+" Types
+syn keyword lslType float integer key list quaternion rotation string vector
+
+" Labels
+syn match lslLabel +@\h\w*+ display
+
+" Constants
+syn keyword lslConstant
+\ ACTIVE AGENT AGENT_ALWAYS_RUN AGENT_ATTACHMENTS AGENT_AWAY AGENT_BUSY
+\ AGENT_CROUCHING AGENT_FLYING AGENT_IN_AIR AGENT_MOUSELOOK AGENT_ON_OBJECT
+\ AGENT_SCRIPTED AGENT_SITTING AGENT_TYPING AGENT_WALKING ALL_SIDES ANIM_ON
+\ ATTACH_BACK ATTACH_BELLY ATTACH_CHEST ATTACH_CHIN ATTACH_HEAD
+\ ATTACH_HUD_BOTTOM ATTACH_HUD_BOTTOM_LEFT ATTACH_HUD_BOTTOM_RIGHT
+\ ATTACH_HUD_CENTER_1 ATTACH_HUD_CENTER_2 ATTACH_HUD_TOP_CENTER
+\ ATTACH_HUD_TOP_LEFT ATTACH_HUD_TOP_RIGHT ATTACH_LEAR ATTACH_LEYE ATTACH_LFOOT
+\ ATTACH_LHAND ATTACH_LHIP ATTACH_LLARM ATTACH_LLLEG ATTACH_LPEC
+\ ATTACH_LSHOULDER ATTACH_LUARM ATTACH_LULEG ATTACH_MOUTH ATTACH_NOSE
+\ ATTACH_PELVIS ATTACH_REAR ATTACH_REYE ATTACH_RFOOT ATTACH_RHAND ATTACH_RHIP
+\ ATTACH_RLARM ATTACH_RLLEG ATTACH_RPEC ATTACH_RSHOULDER ATTACH_RUARM
+\ ATTACH_RULEG CAMERA_ACTIVE CAMERA_BEHINDNESS_ANGLE CAMERA_BEHINDNESS_LAG
+\ CAMERA_DISTANCE CAMERA_FOCUS CAMERA_FOCUS_LAG CAMERA_FOCUS_LOCKED
+\ CAMERA_FOCUS_OFFSET CAMERA_FOCUS_THRESHOLD CAMERA_PITCH CAMERA_POSITION
+\ CAMERA_POSITION_LAG CAMERA_POSITION_LOCKED CAMERA_POSITION_THRESHOLD
+\ CHANGED_ALLOWED_DROP CHANGED_COLOR CHANGED_INVENTORY CHANGED_LINK
+\ CHANGED_OWNER CHANGED_REGION CHANGED_SCALE CHANGED_SHAPE CHANGED_TELEPORT
+\ CHANGED_TEXTURE CLICK_ACTION_BUY CLICK_ACTION_NONE CLICK_ACTION_OPEN
+\ CLICK_ACTION_OPEN_MEDIA CLICK_ACTION_PAY CLICK_ACTION_PLAY CLICK_ACTION_SIT
+\ CLICK_ACTION_TOUCH CONTROL_BACK CONTROL_DOWN CONTROL_FWD CONTROL_LBUTTON
+\ CONTROL_LEFT CONTROL_ML_LBUTTON CONTROL_RIGHT CONTROL_ROT_LEFT
+\ CONTROL_ROT_RIGHT CONTROL_UP DATA_BORN DATA_NAME DATA_ONLINE DATA_PAYINFO
+\ DATA_RATING DATA_SIM_POS DATA_SIM_RATING DATA_SIM_STATUS DEBUG_CHANNEL
+\ DEG_TO_RAD EOF FALSE HTTP_BODY_MAXLENGTH HTTP_BODY_TRUNCATED HTTP_METHOD
+\ HTTP_MIMETYPE HTTP_VERIFY_CERT INVENTORY_ALL INVENTORY_ANIMATION
+\ INVENTORY_BODYPART INVENTORY_CLOTHING INVENTORY_GESTURE INVENTORY_LANDMARK
+\ INVENTORY_NONE INVENTORY_NOTECARD INVENTORY_OBJECT INVENTORY_SCRIPT
+\ INVENTORY_SOUND INVENTORY_TEXTURE LAND_LARGE_BRUSH LAND_LEVEL LAND_LOWER
+\ LAND_MEDIUM_BRUSH LAND_NOISE LAND_RAISE LAND_REVERT LAND_SMALL_BRUSH
+\ LAND_SMOOTH LINK_ALL_CHILDREN LINK_ALL_OTHERS LINK_ROOT LINK_SET LINK_THIS
+\ LIST_STAT_GEOMETRIC_MEAN LIST_STAT_MAX LIST_STAT_MEAN LIST_STAT_MEDIAN
+\ LIST_STAT_MIN LIST_STAT_NUM_COUNT LIST_STAT_RANGE LIST_STAT_STD_DEV
+\ LIST_STAT_SUM LIST_STAT_SUM_SQUARES LOOP MASK_BASE MASK_EVERYONE MASK_GROUP
+\ MASK_NEXT MASK_OWNER NULL_KEY OBJECT_CREATOR OBJECT_DESC OBJECT_GROUP
+\ OBJECT_NAME OBJECT_OWNER OBJECT_POS OBJECT_ROT OBJECT_UNKNOWN_DETAIL
+\ OBJECT_VELOCITY PARCEL_COUNT_GROUP PARCEL_COUNT_OTHER PARCEL_COUNT_OWNER
+\ PARCEL_COUNT_SELECTED PARCEL_COUNT_TEMP PARCEL_COUNT_TOTAL PARCEL_DETAILS_AREA
+\ PARCEL_DETAILS_DESC PARCEL_DETAILS_GROUP PARCEL_DETAILS_NAME
+\ PARCEL_DETAILS_OWNER PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY
+\ PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS PARCEL_FLAG_ALLOW_CREATE_OBJECTS
+\ PARCEL_FLAG_ALLOW_DAMAGE PARCEL_FLAG_ALLOW_FLY
+\ PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY PARCEL_FLAG_ALLOW_GROUP_SCRIPTS
+\ PARCEL_FLAG_ALLOW_LANDMARK PARCEL_FLAG_ALLOW_SCRIPTS
+\ PARCEL_FLAG_ALLOW_TERRAFORM PARCEL_FLAG_LOCAL_SOUND_ONLY
+\ PARCEL_FLAG_RESTRICT_PUSHOBJECT PARCEL_FLAG_USE_ACCESS_GROUP
+\ PARCEL_FLAG_USE_ACCESS_LIST PARCEL_FLAG_USE_BAN_LIST
+\ PARCEL_FLAG_USE_LAND_PASS_LIST PARCEL_MEDIA_COMMAND_AGENT
+\ PARCEL_MEDIA_COMMAND_AUTO_ALIGN PARCEL_MEDIA_COMMAND_DESC
+\ PARCEL_MEDIA_COMMAND_LOOP PARCEL_MEDIA_COMMAND_LOOP_SET
+\ PARCEL_MEDIA_COMMAND_PAUSE PARCEL_MEDIA_COMMAND_PLAY PARCEL_MEDIA_COMMAND_SIZE
+\ PARCEL_MEDIA_COMMAND_STOP PARCEL_MEDIA_COMMAND_TEXTURE
+\ PARCEL_MEDIA_COMMAND_TIME PARCEL_MEDIA_COMMAND_TYPE
+\ PARCEL_MEDIA_COMMAND_UNLOAD PARCEL_MEDIA_COMMAND_URL PASSIVE
+\ PAYMENT_INFO_ON_FILE PAYMENT_INFO_USED PAY_DEFAULT PAY_HIDE PERM_ALL PERM_COPY
+\ PERM_MODIFY PERM_MOVE PERM_TRANSFER PERMISSION_ATTACH PERMISSION_CHANGE_LINKS
+\ PERMISSION_CONTROL_CAMERA PERMISSION_DEBIT PERMISSION_TAKE_CONTROLS
+\ PERMISSION_TRACK_CAMERA PERMISSION_TRIGGER_ANIMATION PI PI_BY_TWO PING_PONG
+\ PRIM_BUMP_BARK PRIM_BUMP_BLOBS PRIM_BUMP_BRICKS PRIM_BUMP_BRIGHT
+\ PRIM_BUMP_CHECKER PRIM_BUMP_CONCRETE PRIM_BUMP_DARK PRIM_BUMP_DISKS
+\ PRIM_BUMP_GRAVEL PRIM_BUMP_LARGETILE PRIM_BUMP_NONE PRIM_BUMP_SHINY
+\ PRIM_BUMP_SIDING PRIM_BUMP_STONE PRIM_BUMP_STUCCO PRIM_BUMP_SUCTION
+\ PRIM_BUMP_TILE PRIM_BUMP_WEAVE PRIM_BUMP_WOOD PRIM_CAST_SHADOWS PRIM_COLOR
+\ PRIM_FLEXIBLE PRIM_FULLBRIGHT PRIM_HOLE_CIRCLE PRIM_HOLE_DEFAULT
+\ PRIM_HOLE_SQUARE PRIM_HOLE_TRIANGLE PRIM_MATERIAL PRIM_MATERIAL_FLESH
+\ PRIM_MATERIAL_GLASS PRIM_MATERIAL_LIGHT PRIM_MATERIAL_METAL
+\ PRIM_MATERIAL_PLASTIC PRIM_MATERIAL_RUBBER PRIM_MATERIAL_STONE
+\ PRIM_MATERIAL_WOOD PRIM_PHANTOM PRIM_PHYSICS PRIM_POINT_LIGHT PRIM_POSITION
+\ PRIM_ROTATION PRIM_SCULPT_TYPE_CYLINDER PRIM_SCULPT_TYPE_PLANE
+\ PRIM_SCULPT_TYPE_SPHERE PRIM_SCULPT_TYPE_TORUS PRIM_SHINY_HIGH PRIM_SHINY_LOW
+\ PRIM_SHINY_MEDIUM PRIM_SHINY_NONE PRIM_SIZE PRIM_TEMP_ON_REZ PRIM_TEXGEN
+\ PRIM_TEXGEN_DEFAULT PRIM_TEXGEN_PLANAR PRIM_TEXTURE PRIM_TYPE PRIM_TYPE_BOX
+\ PRIM_TYPE_BOX PRIM_TYPE_CYLINDER PRIM_TYPE_CYLINDER PRIM_TYPE_LEGACY
+\ PRIM_TYPE_PRISM PRIM_TYPE_PRISM PRIM_TYPE_RING PRIM_TYPE_SCULPT
+\ PRIM_TYPE_SPHERE PRIM_TYPE_SPHERE PRIM_TYPE_TORUS PRIM_TYPE_TORUS
+\ PRIM_TYPE_TUBE PRIM_TYPE_TUBE PSYS_PART_BEAM_MASK PSYS_PART_BOUNCE_MASK
+\ PSYS_PART_DEAD_MASK PSYS_PART_EMISSIVE_MASK PSYS_PART_END_ALPHA
+\ PSYS_PART_END_COLOR PSYS_PART_END_SCALE PSYS_PART_FLAGS
+\ PSYS_PART_FOLLOW_SRC_MASK PSYS_PART_FOLLOW_VELOCITY_MASK
+\ PSYS_PART_INTERP_COLOR_MASK PSYS_PART_INTERP_SCALE_MASK PSYS_PART_MAX_AGE
+\ PSYS_PART_RANDOM_ACCEL_MASK PSYS_PART_RANDOM_VEL_MASK PSYS_PART_START_ALPHA
+\ PSYS_PART_START_COLOR PSYS_PART_START_SCALE PSYS_PART_TARGET_LINEAR_MASK
+\ PSYS_PART_TARGET_POS_MASK PSYS_PART_TRAIL_MASK PSYS_PART_WIND_MASK
+\ PSYS_SRC_ACCEL PSYS_SRC_ANGLE_BEGIN PSYS_SRC_ANGLE_END
+\ PSYS_SRC_BURST_PART_COUNT PSYS_SRC_BURST_RADIUS PSYS_SRC_BURST_RATE
+\ PSYS_SRC_BURST_SPEED_MAX PSYS_SRC_BURST_SPEED_MIN PSYS_SRC_INNERANGLE
+\ PSYS_SRC_MAX_AGE PSYS_SRC_OMEGA PSYS_SRC_OUTERANGLE PSYS_SRC_PATTERN
+\ PSYS_SRC_PATTERN_ANGLE PSYS_SRC_PATTERN_ANGLE_CONE
+\ PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY PSYS_SRC_PATTERN_DROP
+\ PSYS_SRC_PATTERN_EXPLODE PSYS_SRC_TARGET_KEY PSYS_SRC_TEXTURE PUBLIC_CHANNEL
+\ RAD_TO_DEG REGION_FLAG_ALLOW_DAMAGE REGION_FLAG_ALLOW_DIRECT_TELEPORT
+\ REGION_FLAG_BLOCK_FLY REGION_FLAG_BLOCK_TERRAFORM
+\ REGION_FLAG_DISABLE_COLLISIONS REGION_FLAG_DISABLE_PHYSICS
+\ REGION_FLAG_FIXED_SUN REGION_FLAG_RESTRICT_PUSHOBJECT REGION_FLAG_SANDBOX
+\ REMOTE_DATA_CHANNEL REMOTE_DATA_REPLY REMOTE_DATA_REQUEST REVERSE ROTATE SCALE
+\ SCRIPTED SMOOTH SQRT2 STATUS_BLOCK_GRAB STATUS_CAST_SHADOWS STATUS_DIE_AT_EDGE
+\ STATUS_PHANTOM STATUS_PHYSICS STATUS_RETURN_AT_EDGE STATUS_ROTATE_X
+\ STATUS_ROTATE_Y STATUS_ROTATE_Z STATUS_SANDBOX STRING_TRIM STRING_TRIM_HEAD
+\ STRING_TRIM_TAIL TRUE TWO_PI TYPE_FLOAT TYPE_INTEGER TYPE_INVALID TYPE_KEY
+\ TYPE_ROTATION TYPE_STRING TYPE_VECTOR VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY
+\ VEHICLE_ANGULAR_DEFLECTION_TIMESCALE VEHICLE_ANGULAR_FRICTION_TIMESCALE
+\ VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE VEHICLE_ANGULAR_MOTOR_DIRECTION
+\ VEHICLE_ANGULAR_MOTOR_TIMESCALE VEHICLE_BANKING_EFFICIENCY VEHICLE_BANKING_MIX
+\ VEHICLE_BANKING_TIMESCALE VEHICLE_BUOYANCY VEHICLE_FLAG_CAMERA_DECOUPLED
+\ VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT VEHICLE_FLAG_HOVER_TERRAIN_ONLY
+\ VEHICLE_FLAG_HOVER_UP_ONLY VEHICLE_FLAG_HOVER_WATER_ONLY
+\ VEHICLE_FLAG_LIMIT_MOTOR_UP VEHICLE_FLAG_LIMIT_ROLL_ONLY
+\ VEHICLE_FLAG_MOUSELOOK_BANK VEHICLE_FLAG_MOUSELOOK_STEER
+\ VEHICLE_FLAG_NO_DEFLECTION_UP VEHICLE_HOVER_EFFICIENCY VEHICLE_HOVER_HEIGHT
+\ VEHICLE_HOVER_TIMESCALE VEHICLE_LINEAR_DEFLECTION_EFFICIENCY
+\ VEHICLE_LINEAR_DEFLECTION_TIMESCALE VEHICLE_LINEAR_FRICTION_TIMESCALE
+\ VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE VEHICLE_LINEAR_MOTOR_TIMESCALE
+\ VEHICLE_LINEAR_MOTOR_DIRECTION VEHICLE_LINEAR_MOTOR_OFFSET
+\ VEHICLE_REFERENCE_FRAME VEHICLE_TYPE_AIRPLANE VEHICLE_TYPE_BALLOON
+\ VEHICLE_TYPE_BOAT VEHICLE_TYPE_CAR VEHICLE_TYPE_NONE VEHICLE_TYPE_SLED
+\ VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY VEHICLE_VERTICAL_ATTRACTION_TIMESCALE
+\ ZERO_ROTATION ZERO_VECTOR
+
+" Events
+syn keyword lslEvent
+\ attach at_rot_target at_target changed collision collision_end collision_start
+\ control dataserver email http_response land_collision land_collision_end
+\ land_collision_start link_message listen money moving_end moving_start
+\ not_at_rot_target no_sensor object_rez on_rez remote_data run_time_permissions
+\ sensor state_entry state_exit timer touch touch_end touch_start not_at_target
+
+" Functions
+syn keyword lslFunction
+\ llAbs llAcos llAddToLandBanList llAddToLandPassList llAdjustSoundVolume
+\ llAllowInventoryDrop llAngleBetween llApplyImpulse llApplyRotationalImpulse
+\ llAsin llAtan2 llAttachToAvatar llAvatarOnSitTarget llAxes2Rot llAxisAngle2Rot
+\ llBase64ToInteger llBase64ToString llBreakAllLinks llBreakLink llCSV2List
+\ llCeil llClearCameraParams llCloseRemoteDataChannel llCloud llCollisionFilter
+\ llCollisionSound llCollisionSprite llCos llCreateLink llDeleteSubList
+\ llDeleteSubString llDetachFromAvatar llDetectedGrab llDetectedGroup
+\ llDetectedKey llDetectedLinkNumber llDetectedName llDetectedOwner
+\ llDetectedPos llDetectedRot llDetectedType llDetectedVel llDialog llDie
+\ llDumpList2String llEdgeOfWorld llEjectFromLand llEmail llEscapeURL
+\ llEuler2Rot llFabs llFloor llForceMouselook llFrand llGetAccel llGetAgentInfo
+\ llGetAgentSize llGetAlpha llGetAndResetTime llGetAnimation llGetAnimationList
+\ llGetAttached llGetBoundingBox llGetCameraPos llGetCameraRot llGetCenterOfMass
+\ llGetColor llGetCreator llGetDate llGetEnergy llGetForce llGetFreeMemory
+\ llGetGMTclock llGetGeometricCenter llGetInventoryCreator llGetInventoryKey
+\ llGetInventoryName llGetInventoryNumber llGetInventoryPermMask
+\ llGetInventoryType llGetKey llGetLandOwnerAt llGetLinkKey llGetLinkName
+\ llGetLinkNumber llGetListEntryType llGetListLength llGetLocalPos llGetLocalRot
+\ llGetMass llGetNextEmail llGetNotecardLine llGetNumberOfNotecardLines
+\ llGetNumberOfPrims llGetNumberOfSides llGetObjectDesc llGetObjectDetails
+\ llGetObjectMass llGetObjectName llGetObjectPermMask llGetObjectPrimCount
+\ llGetOmega llGetOwner llGetOwnerKey llGetParcelDetails llGetParcelFlags
+\ llGetParcelMaxPrims llGetParcelPrimCount llGetParcelPrimOwners
+\ llGetPermissions llGetPermissionsKey llGetPos llGetPrimitiveParams
+\ llGetRegionCorner llGetRegionFPS llGetRegionFlags llGetRegionName
+\ llGetRegionTimeDilation llGetRootPosition llGetRootRotation llGetRot
+\ llGetScale llGetScriptName llGetScriptState llGetSimulatorHostname
+\ llGetStartParameter llGetStatus llGetSubString llGetSunDirection llGetTexture
+\ llGetTextureOffset llGetTextureRot llGetTextureScale llGetTime llGetTimeOfDay
+\ llGetTimestamp llGetTorque llGetUnixTime llGetVel llGetWallclock
+\ llGiveInventory llGiveInventoryList llGiveMoney llGodLikeRezObject llGround
+\ llGroundContour llGroundNormal llGroundRepel llGroundSlope llHTTPRequest
+\ llInsertString llInstantMessage llIntegerToBase64 llKey2Name llList2CSV
+\ llList2Float llList2Integer llList2Key llList2List llList2ListStrided
+\ llList2Rot llList2String llList2Vector llListFindList llListInsertList
+\ llListRandomize llListReplaceList llListSort llListStatistics llListen
+\ llListenControl llListenRemove llLoadURL llLog llLog10 llLookAt llLoopSound
+\ llLoopSoundMaster llLoopSoundSlave llMD5String llMakeExplosion llMakeFire
+\ llMakeFountain llMakeSmoke llMapDestination llMessageLinked llMinEventDelay
+\ llModPow llModifyLand llMoveToTarget llOffsetTexture llOpenRemoteDataChannel
+\ llOverMyLand llOwnerSay llParcelMediaCommandList llParcelMediaQuery
+\ llParseString2List llParseStringKeepNulls llParticleSystem llPassCollisions
+\ llPassTouches llPlaySound llPlaySoundSlave llPointAt llPow llPreloadSound
+\ llPushObject llRefreshPrimURL llRegionSay llReleaseCamera llReleaseControls
+\ llRemoteDataReply llRemoteDataSetRegion llRemoteLoadScript
+\ llRemoteLoadScriptPin llRemoveFromLandBanList llRemoveFromLandPassList
+\ llRemoveInventory llRemoveVehicleFlags llRequestAgentData
+\ llRequestInventoryData llRequestPermissions llRequestSimulatorData
+\ llResetLandBanList llResetLandPassList llResetOtherScript llResetScript
+\ llResetTime llRezAtRoot llRezObject llRot2Angle llRot2Axis llRot2Euler
+\ llRot2Fwd llRot2Left llRot2Up llRotBetween llRotLookAt llRotTarget
+\ llRotTargetRemove llRotateTexture llRound llSameGroup llSay llScaleTexture
+\ llScriptDanger llSendRemoteData llSensor llSensorRemove llSensorRepeat
+\ llSetAlpha llSetBuoyancy llSetCameraAtOffset llSetCameraEyeOffset
+\ llSetCameraParams llSetClickAction llSetColor llSetDamage llSetForce
+\ llSetForceAndTorque llSetHoverHeight llSetInventoryPermMask llSetLinkAlpha
+\ llSetLinkColor llSetLinkPrimitiveParams llSetLinkTexture llSetLocalRot
+\ llSetObjectDesc llSetObjectName llSetObjectPermMask llSetParcelMusicURL
+\ llSetPayPrice llSetPos llSetPrimURL llSetPrimitiveParams
+\ llSetRemoteScriptAccessPin llSetRot llSetScale llSetScriptState llSetSitText
+\ llSetSoundQueueing llSetSoundRadius llSetStatus llSetText llSetTexture
+\ llSetTextureAnim llSetTimerEvent llSetTorque llSetTouchText llSetVehicleFlags
+\ llSetVehicleFloatParam llSetVehicleRotationParam llSetVehicleType
+\ llSetVehicleVectorParam llShout llSin llSitTarget llSleep llSound
+\ llSoundPreload llSqrt llStartAnimation llStopAnimation llStopHover
+\ llStopLookAt llStopMoveToTarget llStopPointAt llStopSound llStringLength
+\ llStringToBase64 llStringTrim llSubStringIndex llTakeCamera llTakeControls
+\ llTan llTarget llTargetOmega llTargetRemove llTeleportAgentHome llToLower
+\ llToUpper llTriggerSound llTriggerSoundLimited llUnSit llUnescapeURL llVecDist
+\ llVecMag llVecNorm llVolumeDetect llWater llWhisper llWind llXorBase64Strings
+\ llXorBase64StringsCorrect
+
+" Operators
+syn match lslOperator +[-!%&*+/<=>^|~]+ display
+
+" Numbers
+syn match lslNumber +-\=\%(\<\d\+\|\%(\<\d\+\)\=\.\d\+\)\%([Ee][-+]\=\d\+\)\=\>\|\<0x\x\+\>+ display
+
+" Vectors and rotations
+syn match lslVectorRot +<[-\t +.0-9A-Za-z_]\+\%(,[-\t +.0-9A-Za-z_]\+\)\{2,3}>+ contains=lslNumber display
+
+" Vector and rotation properties
+syn match lslProperty +\.\@<=[sxyz]\>+ display
+
+" Strings
+syn region lslString start=+"+ skip=+\\.+ end=+"+ contains=lslSpecialChar,@Spell
+syn match lslSpecialChar +\\.+ contained display
+
+" Keys
+syn match lslKey +"\x\{8}-\x\{4}-\x\{4}-\x\{4}-\x\{12}"+ display
+
+" Parentheses, braces and brackets
+syn match lslBlock +[][(){}]+ display
+
+" Typecast operators
+syn match lslTypecast +(\%(float\|integer\|key\|list\|quaternion\|rotation\|string\|vector\))+ contains=lslType display
+
+" Comments
+syn match lslComment +//.*+ contains=@Spell
+
+" Define the default highlighting.
+hi def link lslKeyword Keyword
+hi def link lslType Type
+hi def link lslLabel Label
+hi def link lslConstant Constant
+hi def link lslEvent PreProc
+hi def link lslFunction Function
+hi def link lslOperator Operator
+hi def link lslNumber Number
+hi def link lslVectorRot Special
+hi def link lslProperty Identifier
+hi def link lslString String
+hi def link lslSpecialChar SpecialChar
+hi def link lslKey Special
+hi def link lslBlock Special
+hi def link lslTypecast Operator
+hi def link lslComment Comment
+
+let b:current_syntax = "lsl"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: ts=8
diff --git a/runtime/syntax/lss.vim b/runtime/syntax/lss.vim
new file mode 100644
index 0000000..6ee717b
--- /dev/null
+++ b/runtime/syntax/lss.vim
@@ -0,0 +1,123 @@
+" Vim syntax file
+" Language: Lynx 2.7.1 style file
+" Maintainer: Scott Bigham <dsb@killerbunnies.org>
+" Last Change: 2004 Oct 06
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" This setup is probably atypical for a syntax highlighting file, because
+" most of it is not really intended to be overrideable. Instead, the
+" highlighting is supposed to correspond to the highlighting specified by
+" the .lss file entries themselves; ie. the "bold" keyword should be bold,
+" the "red" keyword should be red, and so forth. The exceptions to this
+" are comments, of course, and the initial keyword identifying the affected
+" element, which will inherit the usual Identifier highlighting.
+
+syn match lssElement "^[^:]\+" nextgroup=lssMono
+
+syn match lssMono ":[^:]\+" contained nextgroup=lssFgColor contains=lssReverse,lssUnderline,lssBold,lssStandout
+
+syn keyword lssBold bold contained
+syn keyword lssReverse reverse contained
+syn keyword lssUnderline underline contained
+syn keyword lssStandout standout contained
+
+syn match lssFgColor ":[^:]\+" contained nextgroup=lssBgColor contains=lssRedFg,lssBlueFg,lssGreenFg,lssBrownFg,lssMagentaFg,lssCyanFg,lssLightgrayFg,lssGrayFg,lssBrightredFg,lssBrightgreenFg,lssYellowFg,lssBrightblueFg,lssBrightmagentaFg,lssBrightcyanFg
+
+syn case ignore
+syn keyword lssRedFg red contained
+syn keyword lssBlueFg blue contained
+syn keyword lssGreenFg green contained
+syn keyword lssBrownFg brown contained
+syn keyword lssMagentaFg magenta contained
+syn keyword lssCyanFg cyan contained
+syn keyword lssLightgrayFg lightgray contained
+syn keyword lssGrayFg gray contained
+syn keyword lssBrightredFg brightred contained
+syn keyword lssBrightgreenFg brightgreen contained
+syn keyword lssYellowFg yellow contained
+syn keyword lssBrightblueFg brightblue contained
+syn keyword lssBrightmagentaFg brightmagenta contained
+syn keyword lssBrightcyanFg brightcyan contained
+syn case match
+
+syn match lssBgColor ":[^:]\+" contained contains=lssRedBg,lssBlueBg,lssGreenBg,lssBrownBg,lssMagentaBg,lssCyanBg,lssLightgrayBg,lssGrayBg,lssBrightredBg,lssBrightgreenBg,lssYellowBg,lssBrightblueBg,lssBrightmagentaBg,lssBrightcyanBg,lssWhiteBg
+
+syn case ignore
+syn keyword lssRedBg red contained
+syn keyword lssBlueBg blue contained
+syn keyword lssGreenBg green contained
+syn keyword lssBrownBg brown contained
+syn keyword lssMagentaBg magenta contained
+syn keyword lssCyanBg cyan contained
+syn keyword lssLightgrayBg lightgray contained
+syn keyword lssGrayBg gray contained
+syn keyword lssBrightredBg brightred contained
+syn keyword lssBrightgreenBg brightgreen contained
+syn keyword lssYellowBg yellow contained
+syn keyword lssBrightblueBg brightblue contained
+syn keyword lssBrightmagentaBg brightmagenta contained
+syn keyword lssBrightcyanBg brightcyan contained
+syn keyword lssWhiteBg white contained
+syn case match
+
+syn match lssComment "#.*$"
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..9c5a490
--- /dev/null
+++ b/runtime/syntax/lua.vim
@@ -0,0 +1,442 @@
+" Vim syntax file
+" Language: Lua 4.0, Lua 5.0, Lua 5.1, Lua 5.2 and Lua 5.3
+" Maintainer: Marcus Aurelius Farias <masserahguard-lua 'at' yahoo com>
+" First Author: Carlos Augusto Teixeira Mendes <cmendes 'at' inf puc-rio br>
+" Last Change: 2022 Sep 07
+" Options: lua_version = 4 or 5
+" lua_subversion = 0 (for 4.0 or 5.0)
+" or 1, 2, 3 (for 5.1, 5.2 or 5.3)
+" the default is 5.3
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if !exists("lua_version")
+ " Default is lua 5.3
+ let lua_version = 5
+ let lua_subversion = 3
+elseif !exists("lua_subversion")
+ " lua_version exists, but lua_subversion doesn't. In this case set it to 0
+ let lua_subversion = 0
+endif
+
+syn case match
+
+" syncing method
+syn sync minlines=1000
+
+if lua_version >= 5
+ syn keyword luaMetaMethod __add __sub __mul __div __pow __unm __concat
+ syn keyword luaMetaMethod __eq __lt __le
+ syn keyword luaMetaMethod __index __newindex __call
+ syn keyword luaMetaMethod __metatable __mode __gc __tostring
+endif
+
+if lua_version > 5 || (lua_version == 5 && lua_subversion >= 1)
+ syn keyword luaMetaMethod __mod __len
+endif
+
+if lua_version > 5 || (lua_version == 5 && lua_subversion >= 2)
+ syn keyword luaMetaMethod __pairs
+endif
+
+if lua_version > 5 || (lua_version == 5 && lua_subversion >= 3)
+ syn keyword luaMetaMethod __idiv __name
+ syn keyword luaMetaMethod __band __bor __bxor __bnot __shl __shr
+endif
+
+if lua_version > 5 || (lua_version == 5 && lua_subversion >= 4)
+ syn keyword luaMetaMethod __close
+endif
+
+" catch errors caused by wrong parenthesis and wrong curly brackets or
+" keywords placed outside their respective blocks
+
+syn region luaParen transparent start='(' end=')' contains=TOP,luaParenError
+syn match luaParenError ")"
+syn match luaError "}"
+syn match luaError "\<\%(end\|else\|elseif\|then\|until\|in\)\>"
+
+" Function declaration
+syn region luaFunctionBlock transparent matchgroup=luaFunction start="\<function\>" end="\<end\>" contains=TOP
+
+" else
+syn keyword luaCondElse matchgroup=luaCond contained containedin=luaCondEnd else
+
+" then ... end
+syn region luaCondEnd contained transparent matchgroup=luaCond start="\<then\>" end="\<end\>" contains=TOP
+
+" elseif ... then
+syn region luaCondElseif contained containedin=luaCondEnd transparent matchgroup=luaCond start="\<elseif\>" end="\<then\>" contains=TOP
+
+" if ... then
+syn region luaCondStart transparent matchgroup=luaCond start="\<if\>" end="\<then\>"me=e-4 contains=TOP nextgroup=luaCondEnd skipwhite skipempty
+
+" do ... end
+syn region luaBlock transparent matchgroup=luaStatement start="\<do\>" end="\<end\>" contains=TOP
+" repeat ... until
+syn region luaRepeatBlock transparent matchgroup=luaRepeat start="\<repeat\>" end="\<until\>" contains=TOP
+
+" while ... do
+syn region luaWhile transparent matchgroup=luaRepeat start="\<while\>" end="\<do\>"me=e-2 contains=TOP nextgroup=luaBlock skipwhite skipempty
+
+" for ... do and for ... in ... do
+syn region luaFor transparent matchgroup=luaRepeat start="\<for\>" end="\<do\>"me=e-2 contains=TOP nextgroup=luaBlock skipwhite skipempty
+
+syn keyword luaFor contained containedin=luaFor in
+
+" other keywords
+syn keyword luaStatement return local break
+if lua_version > 5 || (lua_version == 5 && lua_subversion >= 2)
+ syn keyword luaStatement goto
+ syn match luaLabel "::\I\i*::"
+endif
+
+" operators
+syn keyword luaOperator and or not
+
+if (lua_version == 5 && lua_subversion >= 3) || lua_version > 5
+ syn match luaSymbolOperator "[#<>=~^&|*/%+-]\|\.\{2,3}"
+elseif lua_version == 5 && (lua_subversion == 1 || lua_subversion == 2)
+ syn match luaSymbolOperator "[#<>=~^*/%+-]\|\.\{2,3}"
+else
+ syn match luaSymbolOperator "[<>=~^*/+-]\|\.\{2,3}"
+endif
+
+" comments
+syn keyword luaTodo contained TODO FIXME XXX
+syn match luaComment "--.*$" contains=luaTodo,@Spell
+if lua_version == 5 && lua_subversion == 0
+ syn region luaComment matchgroup=luaCommentDelimiter start="--\[\[" end="\]\]" contains=luaTodo,luaInnerComment,@Spell
+ syn region luaInnerComment contained transparent start="\[\[" end="\]\]"
+elseif lua_version > 5 || (lua_version == 5 && lua_subversion >= 1)
+ " Comments in Lua 5.1: --[[ ... ]], [=[ ... ]=], [===[ ... ]===], etc.
+ syn region luaComment matchgroup=luaCommentDelimiter start="--\[\z(=*\)\[" end="\]\z1\]" contains=luaTodo,@Spell
+endif
+
+" first line may start with #!
+syn match luaComment "\%^#!.*"
+
+syn keyword luaConstant nil
+if lua_version > 4
+ syn keyword luaConstant true false
+endif
+
+" strings
+syn match luaSpecial contained #\\[\\abfnrtv'"[\]]\|\\[[:digit:]]\{,3}#
+if lua_version == 5
+ if lua_subversion == 0
+ syn region luaString2 matchgroup=luaStringDelimiter start=+\[\[+ end=+\]\]+ contains=luaString2,@Spell
+ else
+ if lua_subversion >= 2
+ syn match luaSpecial contained #\\z\|\\x[[:xdigit:]]\{2}#
+ endif
+ if lua_subversion >= 3
+ syn match luaSpecial contained #\\u{[[:xdigit:]]\+}#
+ endif
+ syn region luaString2 matchgroup=luaStringDelimiter start="\[\z(=*\)\[" end="\]\z1\]" contains=@Spell
+ endif
+endif
+syn region luaString matchgroup=luaStringDelimiter start=+'+ end=+'+ skip=+\\\\\|\\'+ contains=luaSpecial,@Spell
+syn region luaString matchgroup=luaStringDelimiter start=+"+ end=+"+ skip=+\\\\\|\\"+ contains=luaSpecial,@Spell
+
+" integer number
+syn match luaNumber "\<\d\+\>"
+" floating point number, with dot, optional exponent
+syn match luaNumber "\<\d\+\.\d*\%([eE][-+]\=\d\+\)\="
+" floating point number, starting with a dot, optional exponent
+syn match luaNumber "\.\d\+\%([eE][-+]\=\d\+\)\=\>"
+" floating point number, without dot, with exponent
+syn match luaNumber "\<\d\+[eE][-+]\=\d\+\>"
+
+" hex numbers
+if lua_version >= 5
+ if lua_subversion == 1
+ syn match luaNumber "\<0[xX]\x\+\>"
+ elseif lua_subversion >= 2
+ syn match luaNumber "\<0[xX][[:xdigit:].]\+\%([pP][-+]\=\d\+\)\=\>"
+ endif
+endif
+
+" tables
+syn region luaTableBlock transparent matchgroup=luaTable start="{" end="}" contains=TOP,luaStatement
+
+" methods
+syntax match luaFunc ":\@<=\k\+"
+
+" built-in functions
+syn keyword luaFunc assert collectgarbage dofile error next
+syn keyword luaFunc print rawget rawset self tonumber tostring type _VERSION
+
+if lua_version == 4
+ syn keyword luaFunc _ALERT _ERRORMESSAGE gcinfo
+ syn keyword luaFunc call copytagmethods dostring
+ syn keyword luaFunc foreach foreachi getglobal getn
+ syn keyword luaFunc gettagmethod globals newtag
+ syn keyword luaFunc setglobal settag settagmethod sort
+ syn keyword luaFunc tag tinsert tremove
+ syn keyword luaFunc _INPUT _OUTPUT _STDIN _STDOUT _STDERR
+ syn keyword luaFunc openfile closefile flush seek
+ syn keyword luaFunc setlocale execute remove rename tmpname
+ syn keyword luaFunc getenv date clock exit
+ syn keyword luaFunc readfrom writeto appendto read write
+ syn keyword luaFunc PI abs sin cos tan asin
+ syn keyword luaFunc acos atan atan2 ceil floor
+ syn keyword luaFunc mod frexp ldexp sqrt min max log
+ syn keyword luaFunc log10 exp deg rad random
+ syn keyword luaFunc randomseed strlen strsub strlower strupper
+ syn keyword luaFunc strchar strrep ascii strbyte
+ syn keyword luaFunc format strfind gsub
+ syn keyword luaFunc getinfo getlocal setlocal setcallhook setlinehook
+elseif lua_version == 5
+ syn keyword luaFunc getmetatable setmetatable
+ syn keyword luaFunc ipairs pairs
+ syn keyword luaFunc pcall xpcall
+ syn keyword luaFunc _G loadfile rawequal require
+ if lua_subversion == 0
+ syn keyword luaFunc getfenv setfenv
+ syn keyword luaFunc loadstring unpack
+ syn keyword luaFunc gcinfo loadlib LUA_PATH _LOADED _REQUIREDNAME
+ else
+ syn keyword luaFunc load select
+ syn match luaFunc /\<package\.cpath\>/
+ syn match luaFunc /\<package\.loaded\>/
+ syn match luaFunc /\<package\.loadlib\>/
+ syn match luaFunc /\<package\.path\>/
+ syn match luaFunc /\<package\.preload\>/
+ if lua_subversion == 1
+ syn keyword luaFunc getfenv setfenv
+ syn keyword luaFunc loadstring module unpack
+ syn match luaFunc /\<package\.loaders\>/
+ syn match luaFunc /\<package\.seeall\>/
+ elseif lua_subversion >= 2
+ syn keyword luaFunc _ENV rawlen
+ syn match luaFunc /\<package\.config\>/
+ syn match luaFunc /\<package\.preload\>/
+ syn match luaFunc /\<package\.searchers\>/
+ syn match luaFunc /\<package\.searchpath\>/
+ endif
+
+ if lua_subversion >= 3
+ syn match luaFunc /\<coroutine\.isyieldable\>/
+ endif
+ if lua_subversion >= 4
+ syn keyword luaFunc warn
+ syn match luaFunc /\<coroutine\.close\>/
+ endif
+ syn match luaFunc /\<coroutine\.running\>/
+ endif
+ syn match luaFunc /\<coroutine\.create\>/
+ syn match luaFunc /\<coroutine\.resume\>/
+ syn match luaFunc /\<coroutine\.status\>/
+ syn match luaFunc /\<coroutine\.wrap\>/
+ syn match luaFunc /\<coroutine\.yield\>/
+
+ syn match luaFunc /\<string\.byte\>/
+ syn match luaFunc /\<string\.char\>/
+ syn match luaFunc /\<string\.dump\>/
+ syn match luaFunc /\<string\.find\>/
+ syn match luaFunc /\<string\.format\>/
+ syn match luaFunc /\<string\.gsub\>/
+ syn match luaFunc /\<string\.len\>/
+ syn match luaFunc /\<string\.lower\>/
+ syn match luaFunc /\<string\.rep\>/
+ syn match luaFunc /\<string\.sub\>/
+ syn match luaFunc /\<string\.upper\>/
+ if lua_subversion == 0
+ syn match luaFunc /\<string\.gfind\>/
+ else
+ syn match luaFunc /\<string\.gmatch\>/
+ syn match luaFunc /\<string\.match\>/
+ syn match luaFunc /\<string\.reverse\>/
+ endif
+ if lua_subversion >= 3
+ syn match luaFunc /\<string\.pack\>/
+ syn match luaFunc /\<string\.packsize\>/
+ syn match luaFunc /\<string\.unpack\>/
+ syn match luaFunc /\<utf8\.char\>/
+ syn match luaFunc /\<utf8\.charpattern\>/
+ syn match luaFunc /\<utf8\.codes\>/
+ syn match luaFunc /\<utf8\.codepoint\>/
+ syn match luaFunc /\<utf8\.len\>/
+ syn match luaFunc /\<utf8\.offset\>/
+ endif
+
+ if lua_subversion == 0
+ syn match luaFunc /\<table\.getn\>/
+ syn match luaFunc /\<table\.setn\>/
+ syn match luaFunc /\<table\.foreach\>/
+ syn match luaFunc /\<table\.foreachi\>/
+ elseif lua_subversion == 1
+ syn match luaFunc /\<table\.maxn\>/
+ elseif lua_subversion >= 2
+ syn match luaFunc /\<table\.pack\>/
+ syn match luaFunc /\<table\.unpack\>/
+ if lua_subversion >= 3
+ syn match luaFunc /\<table\.move\>/
+ endif
+ endif
+ syn match luaFunc /\<table\.concat\>/
+ syn match luaFunc /\<table\.insert\>/
+ syn match luaFunc /\<table\.sort\>/
+ syn match luaFunc /\<table\.remove\>/
+
+ if lua_subversion == 2
+ syn match luaFunc /\<bit32\.arshift\>/
+ syn match luaFunc /\<bit32\.band\>/
+ syn match luaFunc /\<bit32\.bnot\>/
+ syn match luaFunc /\<bit32\.bor\>/
+ syn match luaFunc /\<bit32\.btest\>/
+ syn match luaFunc /\<bit32\.bxor\>/
+ syn match luaFunc /\<bit32\.extract\>/
+ syn match luaFunc /\<bit32\.lrotate\>/
+ syn match luaFunc /\<bit32\.lshift\>/
+ syn match luaFunc /\<bit32\.replace\>/
+ syn match luaFunc /\<bit32\.rrotate\>/
+ syn match luaFunc /\<bit32\.rshift\>/
+ endif
+
+ syn match luaFunc /\<math\.abs\>/
+ syn match luaFunc /\<math\.acos\>/
+ syn match luaFunc /\<math\.asin\>/
+ syn match luaFunc /\<math\.atan\>/
+ if lua_subversion < 3
+ syn match luaFunc /\<math\.atan2\>/
+ endif
+ syn match luaFunc /\<math\.ceil\>/
+ syn match luaFunc /\<math\.sin\>/
+ syn match luaFunc /\<math\.cos\>/
+ syn match luaFunc /\<math\.tan\>/
+ syn match luaFunc /\<math\.deg\>/
+ syn match luaFunc /\<math\.exp\>/
+ syn match luaFunc /\<math\.floor\>/
+ syn match luaFunc /\<math\.log\>/
+ syn match luaFunc /\<math\.max\>/
+ syn match luaFunc /\<math\.min\>/
+ if lua_subversion == 0
+ syn match luaFunc /\<math\.mod\>/
+ syn match luaFunc /\<math\.log10\>/
+ elseif lua_subversion == 1
+ syn match luaFunc /\<math\.log10\>/
+ endif
+ if lua_subversion >= 1
+ syn match luaFunc /\<math\.huge\>/
+ syn match luaFunc /\<math\.fmod\>/
+ syn match luaFunc /\<math\.modf\>/
+ if lua_subversion == 1 || lua_subversion == 2
+ syn match luaFunc /\<math\.cosh\>/
+ syn match luaFunc /\<math\.sinh\>/
+ syn match luaFunc /\<math\.tanh\>/
+ endif
+ endif
+ syn match luaFunc /\<math\.rad\>/
+ syn match luaFunc /\<math\.sqrt\>/
+ if lua_subversion < 3
+ syn match luaFunc /\<math\.pow\>/
+ syn match luaFunc /\<math\.frexp\>/
+ syn match luaFunc /\<math\.ldexp\>/
+ else
+ syn match luaFunc /\<math\.maxinteger\>/
+ syn match luaFunc /\<math\.mininteger\>/
+ syn match luaFunc /\<math\.tointeger\>/
+ syn match luaFunc /\<math\.type\>/
+ syn match luaFunc /\<math\.ult\>/
+ endif
+ syn match luaFunc /\<math\.random\>/
+ syn match luaFunc /\<math\.randomseed\>/
+ syn match luaFunc /\<math\.pi\>/
+
+ syn match luaFunc /\<io\.close\>/
+ syn match luaFunc /\<io\.flush\>/
+ syn match luaFunc /\<io\.input\>/
+ syn match luaFunc /\<io\.lines\>/
+ syn match luaFunc /\<io\.open\>/
+ syn match luaFunc /\<io\.output\>/
+ syn match luaFunc /\<io\.popen\>/
+ syn match luaFunc /\<io\.read\>/
+ syn match luaFunc /\<io\.stderr\>/
+ syn match luaFunc /\<io\.stdin\>/
+ syn match luaFunc /\<io\.stdout\>/
+ syn match luaFunc /\<io\.tmpfile\>/
+ syn match luaFunc /\<io\.type\>/
+ syn match luaFunc /\<io\.write\>/
+
+ syn match luaFunc /\<os\.clock\>/
+ syn match luaFunc /\<os\.date\>/
+ syn match luaFunc /\<os\.difftime\>/
+ syn match luaFunc /\<os\.execute\>/
+ syn match luaFunc /\<os\.exit\>/
+ syn match luaFunc /\<os\.getenv\>/
+ syn match luaFunc /\<os\.remove\>/
+ syn match luaFunc /\<os\.rename\>/
+ syn match luaFunc /\<os\.setlocale\>/
+ syn match luaFunc /\<os\.time\>/
+ syn match luaFunc /\<os\.tmpname\>/
+
+ syn match luaFunc /\<debug\.debug\>/
+ syn match luaFunc /\<debug\.gethook\>/
+ syn match luaFunc /\<debug\.getinfo\>/
+ syn match luaFunc /\<debug\.getlocal\>/
+ syn match luaFunc /\<debug\.getupvalue\>/
+ syn match luaFunc /\<debug\.setlocal\>/
+ syn match luaFunc /\<debug\.setupvalue\>/
+ syn match luaFunc /\<debug\.sethook\>/
+ syn match luaFunc /\<debug\.traceback\>/
+ if lua_subversion == 1
+ syn match luaFunc /\<debug\.getfenv\>/
+ syn match luaFunc /\<debug\.setfenv\>/
+ endif
+ if lua_subversion >= 1
+ syn match luaFunc /\<debug\.getmetatable\>/
+ syn match luaFunc /\<debug\.setmetatable\>/
+ syn match luaFunc /\<debug\.getregistry\>/
+ if lua_subversion >= 2
+ syn match luaFunc /\<debug\.getuservalue\>/
+ syn match luaFunc /\<debug\.setuservalue\>/
+ syn match luaFunc /\<debug\.upvalueid\>/
+ syn match luaFunc /\<debug\.upvaluejoin\>/
+ endif
+ if lua_subversion >= 4
+ syn match luaFunc /\<debug.setcstacklimit\>/
+ endif
+ endif
+endif
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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 luaStringDelimiter luaString
+hi def link luaNumber Number
+hi def link luaOperator Operator
+hi def link luaSymbolOperator luaOperator
+hi def link luaConstant Constant
+hi def link luaCond Conditional
+hi def link luaCondElse Conditional
+hi def link luaFunction Function
+hi def link luaMetaMethod Function
+hi def link luaComment Comment
+hi def link luaCommentDelimiter luaComment
+hi def link luaTodo Todo
+hi def link luaTable Structure
+hi def link luaError Error
+hi def link luaParenError Error
+hi def link luaSpecial SpecialChar
+hi def link luaFunc Identifier
+hi def link luaLabel Label
+
+
+let b:current_syntax = "lua"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: et ts=8 sw=2
diff --git a/runtime/syntax/lynx.vim b/runtime/syntax/lynx.vim
new file mode 100644
index 0000000..fa7c26f
--- /dev/null
+++ b/runtime/syntax/lynx.vim
@@ -0,0 +1,140 @@
+" Vim syntax file
+" Language: Lynx configuration file (lynx.cfg)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2013 Jun 20
+
+" Lynx 2.8.7
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match lynxStart "^" transparent skipwhite nextgroup=lynxOption
+
+syn match lynxComment "\(^\|\s\+\)#.*$" contains=lynxTodo
+
+syn keyword lynxTodo TODO NOTE FIXME XXX contained
+
+syn match lynxDelimiter ":" skipwhite nextgroup=lynxBoolean,lynxNumber,lynxNone,lynxRCOption
+
+syn case ignore
+syn keyword lynxBoolean TRUE FALSE ON OFF contained
+syn keyword lynxNone NONE contained
+syn case match
+
+syn match lynxNumber "-\=\<\d\+\>" contained
+
+"{{{ Options
+syn case ignore
+syn keyword lynxOption ACCEPT_ALL_COOKIES ALERTSECS ALWAYS_RESUBMIT_POSTS
+ \ ALWAYS_TRUSTED_EXEC ANONFTP_PASSWORD ASSUMED_COLOR
+ \ ASSUMED_DOC_CHARSET_CHOICE ASSUME_CHARSET ASSUME_LOCAL_CHARSET
+ \ ASSUME_UNREC_CHARSET AUTO_SESSION AUTO_UNCACHE_DIRLISTS BAD_HTML
+ \ BIBP_BIBHOST BIBP_GLOBAL_SERVER BLOCK_MULTI_BOOKMARKS BOLD_H1
+ \ BOLD_HEADERS BOLD_NAME_ANCHORS BOOKMARK_FILE BROKEN_FTP_EPSV
+ \ BROKEN_FTP_RETR BZIP2_PATH CASE_SENSITIVE_ALWAYS_ON
+ \ CASE_SENSITIVE_SEARCHING CHARACTER_SET CHARSETS_DIRECTORY
+ \ CHARSET_SWITCH_RULES CHECKMAIL CHMOD_PATH COLLAPSE_BR_TAGS COLOR
+ \ COLOR_STYLE COMPRESS_PATH CONNECT_TIMEOUT COOKIE_ACCEPT_DOMAINS
+ \ COOKIE_FILE COOKIE_LOOSE_INVALID_DOMAINS
+ \ COOKIE_QUERY_INVALID_DOMAINS COOKIE_REJECT_DOMAINS COOKIE_SAVE_FILE
+ \ COOKIE_STRICT_INVALID_DOMAINS COPY_PATH CSO_PROXY CSWING_PATH
+ \ DEBUGSECS DEFAULT_BOOKMARK_FILE DEFAULT_CACHE_SIZE DEFAULT_COLORS
+ \ DEFAULT_EDITOR DEFAULT_INDEX_FILE DEFAULT_KEYPAD_MODE
+ \ DEFAULT_KEYPAD_MODE_IS_NUMBERS_AS_ARROWS DEFAULT_USER_MODE
+ \ DEFAULT_VIRTUAL_MEMORY_SIZE DELAYSECS DIRED_MENU DIR_LIST_ORDER
+ \ DIR_LIST_STYLE DISPLAY DISPLAY_CHARSET_CHOICE DOWNLOADER EMACS_KEYS
+ \ EMACS_KEYS_ALWAYS_ON ENABLE_LYNXRC ENABLE_SCROLLBACK EXTERNAL
+ \ FILE_EDITOR FILE_SORTING_METHOD FINGER_PROXY FOCUS_WINDOW
+ \ FORCE_8BIT_TOUPPER FORCE_COOKIE_PROMPT FORCE_EMPTY_HREFLESS_A
+ \ FORCE_SSL_COOKIES_SECURE FORCE_SSL_PROMPT FORMS_OPTIONS FTP_FORMAT
+ \ FTP_PASSIVE FTP_PROXY GLOBAL_EXTENSION_MAP GLOBAL_MAILCAP
+ \ GOPHER_PROXY GOTOBUFFER GZIP_PATH HELPFILE HIDDEN_LINK_MARKER
+ \ HISTORICAL_COMMENTS HTMLSRC_ATTRNAME_XFORM HTMLSRC_TAGNAME_XFORM
+ \ HTTPS_PROXY HTTP_PROXY INCLUDE INFLATE_PATH INFOSECS INSTALL_PATH
+ \ JUMPBUFFER JUMPFILE JUMP_PROMPT JUSTIFY JUSTIFY_MAX_VOID_PERCENT
+ \ KBLAYOUT KEYBOARD_LAYOUT KEYMAP KEYPAD_MODE
+ \ LEFTARROW_IN_TEXTFIELD_PROMPT LINEEDIT_MODE LIST_FORMAT
+ \ LIST_NEWS_DATES LIST_NEWS_NUMBERS LOCALE_CHARSET LOCALHOST_ALIAS
+ \ LOCAL_DOMAIN LOCAL_EXECUTION_LINKS_ALWAYS_ON
+ \ LOCAL_EXECUTION_LINKS_ON_BUT_NOT_REMOTE LYNXCGI_DOCUMENT_ROOT
+ \ LYNXCGI_ENVIRONMENT LYNX_HOST_NAME LYNX_SIG_FILE MAIL_ADRS
+ \ MAIL_SYSTEM_ERROR_LOGGING MAKE_LINKS_FOR_ALL_IMAGES
+ \ MAKE_PSEUDO_ALTS_FOR_INLINES MAX_COOKIES_BUFFER MAX_COOKIES_DOMAIN
+ \ MAX_COOKIES_GLOBAL MESSAGESECS MINIMAL_COMMENTS MKDIR_PATH
+ \ MULTI_BOOKMARK MULTI_BOOKMARK_SUPPORT MV_PATH NCR_IN_BOOKMARKS
+ \ NESTED_TABLES NEWSPOST_PROXY NEWSREPLY_PROXY NEWS_CHUNK_SIZE
+ \ NEWS_MAX_CHUNK NEWS_POSTING NEWS_PROXY NNTPSERVER NNTP_PROXY
+ \ NONRESTARTING_SIGWINCH NO_DOT_FILES NO_FILE_REFERER
+ \ NO_FORCED_CORE_DUMP NO_FROM_HEADER NO_ISMAP_IF_USEMAP NO_MARGINS
+ \ NO_PAUSE NO_PROXY NO_REFERER_HEADER NO_TABLE_CENTER NO_TITLE
+ \ NUMBER_FIELDS_ON_LEFT NUMBER_LINKS_ON_LEFT OUTGOING_MAIL_CHARSET
+ \ PARTIAL PARTIAL_THRES PERSISTENT_COOKIES PERSONAL_EXTENSION_MAP
+ \ PERSONAL_MAILCAP PERSONAL_MAIL_ADDRESS POSITIONABLE_EDITOR
+ \ PREFERRED_CHARSET PREFERRED_ENCODING PREFERRED_LANGUAGE
+ \ PREFERRED_MEDIA_TYPES PREPEND_BASE_TO_SOURCE
+ \ PREPEND_CHARSET_TO_SOURCE PRETTYSRC PRETTYSRC_SPEC
+ \ PRETTYSRC_VIEW_NO_ANCHOR_NUMBERING PRINTER QUIT_DEFAULT_YES RAW_MODE
+ \ READ_TIMEOUT REFERER_WITH_QUERY REPLAYSECS REUSE_TEMPFILES
+ \ RLOGIN_PATH RM_PATH RMDIR_PATH RULE RULESFILE
+ \ RUN_ALL_EXECUTION_LINKS RUN_EXECUTION_LINKS_LOCAL SAVE_SPACE
+ \ SCAN_FOR_BURIED_NEWS_REFS SCREEN_SIZE SCROLLBAR SCROLLBAR_ARROW
+ \ SEEK_FRAG_AREA_IN_CUR SEEK_FRAG_MAP_IN_CUR SELECT_POPUPS
+ \ SEND_USERAGENT SESSION_FILE SESSION_LIMIT SET_COOKIES SETFONT_PATH
+ \ SHOW_COLOR SHOW_CURSOR SHOW_DOTFILES SHOW_KB_NAME SHOW_KB_RATE
+ \ SNEWSPOST_PROXY SNEWSREPLY_PROXY SNEWS_PROXY SOFT_DQUOTES
+ \ SOURCE_CACHE SOURCE_CACHE_FOR_ABORTED SSL_CERT_FILE STARTFILE
+ \ STATUS_BUFFER_SIZE STRIP_DOTDOT_URLS SUBSTITUTE_UNDERSCORES
+ \ SUB_BOOKMARKS SUFFIX SUFFIX_ORDER SYSLOG_REQUESTED_URLS SYSLOG_TEXT
+ \ SYSTEM_EDITOR SYSTEM_MAIL SYSTEM_MAIL_FLAGS TAGSOUP TAR_PATH
+ \ TELNET_PATH TEXTFIELDS_NEED_ACTIVATION TIMEOUT TN3270_PATH
+ \ TOUCH_PATH TRIM_INPUT_FIELDS TRUSTED_EXEC TRUSTED_LYNXCGI
+ \ UNCOMPRESS_PATH UNDERLINE_LINKS UNZIP_PATH UPLOADER
+ \ URL_DOMAIN_PREFIXES URL_DOMAIN_SUFFIXES USERAGENT USER_MODE
+ \ USE_FIXED_RECORDS USE_MOUSE USE_SELECT_POPUPS UUDECODE_PATH
+ \ VERBOSE_IMAGES VIEWER VISITED_LINKS VI_KEYS VI_KEYS_ALWAYS_ON
+ \ WAIS_PROXY XHTML_PARSING XLOADIMAGE_COMMAND ZCAT_PATH ZIP_PATH
+ \ contained nextgroup=lynxDelimiter
+syn keyword lynxRCOption accept_all_cookies assume_charset auto_session
+ \ bookmark_file case_sensitive_searching character_set
+ \ cookie_accept_domains cookie_file cookie_loose_invalid_domains
+ \ cookie_query_invalid_domains cookie_reject_domains
+ \ cookie_strict_invalid_domains dir_list_style display emacs_keys
+ \ file_editor file_sorting_method force_cookie_prompt force_ssl_prompt
+ \ ftp_passive kblayout keypad_mode lineedit_mode locale_charset
+ \ make_links_for_all_images make_pseudo_alts_for_inlines
+ \ multi_bookmark no_pause personal_mail_address preferred_charset
+ \ preferred_encoding preferred_language preferred_media_types raw_mode
+ \ run_all_execution_links run_execution_links_on_local_files scrollbar
+ \ select_popups send_useragent session_file set_cookies show_color
+ \ show_cursor show_dotfiles show_kb_rate sub_bookmarks tagsoup
+ \ underline_links user_mode useragent verbose_images vi_keys
+ \ visited_links
+ \ contained nextgroup=lynxDelimiter
+syn case match
+" }}}
+
+" cfg2html.pl formatting directives
+syn match lynxFormatDir "^\.h\d\s.*$"
+syn match lynxFormatDir "^\.\(ex\|nf\)\(\s\+\d\+\)\=$"
+syn match lynxFormatDir "^\.fi$"
+
+hi def link lynxBoolean Boolean
+hi def link lynxComment Comment
+hi def link lynxDelimiter Special
+hi def link lynxFormatDir Special
+hi def link lynxNone Constant
+hi def link lynxNumber Number
+hi def link lynxOption Identifier
+hi def link lynxRCOption lynxOption
+hi def link lynxTodo Todo
+
+let b:current_syntax = "lynx"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 fdm=marker:
diff --git a/runtime/syntax/lyrics.vim b/runtime/syntax/lyrics.vim
new file mode 100644
index 0000000..42a288b
--- /dev/null
+++ b/runtime/syntax/lyrics.vim
@@ -0,0 +1,43 @@
+" Vim syntax file
+" Language: LyRiCs
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: *.lrc
+" Last Change: 2022 Sep 18
+
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpoptions
+set cpoptions&vim
+
+syn case ignore
+
+" Errors
+syn match lrcError /^.\+$/
+
+" ID tags
+syn match lrcTag /^\s*\[\a\+:.\+\]\s*$/ contains=lrcTagName,lrcTagValue
+syn match lrcTagName contained nextgroup=lrcTagValue
+ \ /\[\zs\(al\|ar\|au\|by\|encoding\|la\|id\|length\|offset\|re\|ti\|ve\)\ze:/
+syn match lrcTagValue /:\zs.\+\ze\]/ contained
+
+" Lyrics
+syn match lrcLyricTime /^\s*\[\d\d:\d\d\.\d\d\]/
+ \ contains=lrcNumber nextgroup=lrcLyricLine
+syn match lrcLyricLine /.*$/ contained contains=lrcWordTime,@Spell
+syn match lrcWordTime /<\d\d:\d\d\.\d\d>/ contained contains=lrcNumber,@NoSpell
+syn match lrcNumber /[+-]\=\d\+/ contained
+
+hi def link lrcLyricTime Label
+hi def link lrcNumber Number
+hi def link lrcTag PreProc
+hi def link lrcTagName Identifier
+hi def link lrcTagValue String
+hi def link lrcWordTime Special
+hi def link lrcError Error
+
+let b:current_syntax = 'lyrics'
+
+let &cpoptions = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/m3build.vim b/runtime/syntax/m3build.vim
new file mode 100644
index 0000000..1a378e8
--- /dev/null
+++ b/runtime/syntax/m3build.vim
@@ -0,0 +1,177 @@
+" Vim syntax file
+" Language: Modula-3 Makefile
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 April 15
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/m3quake.vim
+
+" Identifiers
+syn match m3buildPredefinedVariable "\<\%(TARGET\|OS_TYPE\|BUILD_DIR\|PKG_USE\|WDROOT\)\>"
+
+" Build Procedures {{{1
+" Generated from cm3/m3-sys/cm3/src/M3Build.m3
+syn keyword m3buildProcedure HasCBackend
+
+" (* packages & locations *)
+syn keyword m3buildProcedure Pkg
+syn keyword m3buildProcedure override
+syn keyword m3buildProcedure path_of
+syn keyword m3buildProcedure pkg_subdir
+
+" (* names *)
+syn keyword m3buildProcedure program_name
+syn keyword m3buildProcedure library_name
+
+" (* calls in the generated .M3EXPORT files *)
+syn keyword m3buildProcedure _define_lib
+syn keyword m3buildProcedure _define_pgm
+syn keyword m3buildProcedure _import_template
+syn keyword m3buildProcedure _import_m3lib
+syn keyword m3buildProcedure _import_otherlib
+syn keyword m3buildProcedure _map_add_interface
+syn keyword m3buildProcedure _map_add_generic_interface
+syn keyword m3buildProcedure _map_add_module
+syn keyword m3buildProcedure _map_add_generic_module
+syn keyword m3buildProcedure _map_add_c
+syn keyword m3buildProcedure _map_add_h
+syn keyword m3buildProcedure _map_add_s
+
+" (* compiler options *)
+syn keyword m3buildProcedure m3_debug
+syn keyword m3buildProcedure m3_optimize
+syn keyword m3buildProcedure build_shared
+syn keyword m3buildProcedure build_standalone
+
+" (* derived files *)
+syn keyword m3buildProcedure m3_compile_only
+syn keyword m3buildProcedure m3_finish_up
+
+" (* predefined system libraries *)
+syn keyword m3buildProcedure import_sys_lib
+
+" (* options *)
+syn keyword m3buildProcedure m3_option
+syn keyword m3buildProcedure remove_m3_option
+
+" (* deleting *)
+syn keyword m3buildProcedure deriveds
+
+" (* imports *)
+syn keyword m3buildProcedure include_dir
+syn keyword m3buildProcedure include_pkg
+syn keyword m3buildProcedure import
+syn keyword m3buildProcedure import_version
+syn keyword m3buildProcedure import_obj
+syn keyword m3buildProcedure import_lib
+
+" (* objects *)
+syn keyword m3buildProcedure pgm_object
+
+" (* sources *)
+syn keyword m3buildProcedure source
+syn keyword m3buildProcedure pgm_source
+syn keyword m3buildProcedure interface
+syn keyword m3buildProcedure Interface
+syn keyword m3buildProcedure implementation
+syn keyword m3buildProcedure module
+syn keyword m3buildProcedure Module
+syn keyword m3buildProcedure h_source
+syn keyword m3buildProcedure c_source
+syn keyword m3buildProcedure s_source
+syn keyword m3buildProcedure ship_source
+
+" (* generics *)
+syn keyword m3buildProcedure generic_interface
+syn keyword m3buildProcedure Generic_interface
+syn keyword m3buildProcedure generic_implementation
+syn keyword m3buildProcedure Generic_implementation
+syn keyword m3buildProcedure generic_module
+syn keyword m3buildProcedure Generic_module
+syn keyword m3buildProcedure build_generic_intf
+syn keyword m3buildProcedure build_generic_impl
+
+" (* derived sources *)
+syn keyword m3buildProcedure derived_interface
+syn keyword m3buildProcedure derived_implementation
+syn keyword m3buildProcedure derived_c
+syn keyword m3buildProcedure derived_h
+
+" (* hiding/exporting *)
+syn keyword m3buildProcedure hide_interface
+syn keyword m3buildProcedure hide_generic_interface
+syn keyword m3buildProcedure hide_generic_implementation
+syn keyword m3buildProcedure export_interface
+syn keyword m3buildProcedure export_generic_interface
+syn keyword m3buildProcedure export_generic_implementation
+
+" (* templates *)
+syn keyword m3buildProcedure template
+
+" (* library building *)
+syn keyword m3buildProcedure library
+syn keyword m3buildProcedure Library
+
+" (* program building *)
+syn keyword m3buildProcedure program
+syn keyword m3buildProcedure Program
+syn keyword m3buildProcedure c_program
+syn keyword m3buildProcedure C_program
+
+" (* man pages *)
+syn keyword m3buildProcedure manPage
+syn keyword m3buildProcedure ManPage
+
+" (* emacs *)
+syn keyword m3buildProcedure Gnuemacs
+syn keyword m3buildProcedure CompiledGnuemacs
+
+" (* "-find" support *)
+syn keyword m3buildProcedure find_unit
+syn keyword m3buildProcedure enum_units
+
+" (* export functions *)
+syn keyword m3buildProcedure install_sources
+syn keyword m3buildProcedure install_derived
+syn keyword m3buildProcedure install_derived_link
+syn keyword m3buildProcedure install_derived_symbolic_link
+syn keyword m3buildProcedure install_derived_hard_link
+syn keyword m3buildProcedure install_link_to_derived
+syn keyword m3buildProcedure install_symbolic_link_to_derived
+syn keyword m3buildProcedure install_hard_link_to_derived
+syn keyword m3buildProcedure install_symbolic_link
+syn keyword m3buildProcedure install_file
+
+" (* installation functions *)
+syn keyword m3buildProcedure BindExport
+syn keyword m3buildProcedure BinExport
+syn keyword m3buildProcedure LibdExport
+syn keyword m3buildProcedure LibExport
+syn keyword m3buildProcedure EmacsdExport
+syn keyword m3buildProcedure EmacsExport
+syn keyword m3buildProcedure DocdExport
+syn keyword m3buildProcedure DocExport
+syn keyword m3buildProcedure MandExport
+syn keyword m3buildProcedure ManExport
+syn keyword m3buildProcedure HtmlExport
+syn keyword m3buildProcedure RootExport
+syn keyword m3buildProcedure RootdExport
+
+" (* misc *)
+syn keyword m3buildProcedure gen_m3exports
+syn keyword m3buildProcedure generate_tfile
+syn keyword m3buildProcedure delete_file
+syn keyword m3buildProcedure link_file
+syn keyword m3buildProcedure symbolic_link_file
+syn keyword m3buildProcedure hard_link_file
+" }}}
+
+hi def link m3buildPredefinedVariable Identifier
+hi def link m3buildProcedure Function
+
+let b:current_syntax = "m3build"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/syntax/m3quake.vim b/runtime/syntax/m3quake.vim
new file mode 100644
index 0000000..c202d90
--- /dev/null
+++ b/runtime/syntax/m3quake.vim
@@ -0,0 +1,74 @@
+" Vim syntax file
+" Language: Modula-3 Quake
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 April 15
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" Keywords
+syn keyword m3quakeKeyword else end foreach if in is local or proc readonly
+syn keyword m3quakeKeyword return
+
+" Builtin procedures {{{
+" Generated from m3-sys/m3quake/src/QMachine.m3
+syn keyword m3quakeProcedure arglist cp_if defined empty equal error escape
+syn keyword m3quakeProcedure exec cm3_exec file format include make_dir
+syn keyword m3quakeProcedure normalize path stale try_exec try_cm3_exec
+syn keyword m3quakeProcedure unlink_file write datetime date datestamp
+syn keyword m3quakeProcedure TRACE_INSTR eval_func hostname
+
+syn keyword m3quakeProcedure pushd popd cd getwd
+
+syn keyword m3quakeProcedure quake
+
+syn keyword m3quakeProcedure q_exec q_exec_put q_exec_get
+
+syn keyword m3quakeProcedure fs_exists fs_readable fs_writable fs_executable
+syn keyword m3quakeProcedure fs_isdir fs_isfile fs_contents fs_putfile
+syn keyword m3quakeProcedure fs_mkdir fs_touch fs_lsdirs fs_lsfiles fs_rmdir
+syn keyword m3quakeProcedure fs_rmfile fs_rmrec fs_cp
+
+syn keyword m3quakeProcedure pn_valid pn_decompose pn_compose pn_absolute
+syn keyword m3quakeProcedure pn_prefix pn_last pn_base pn_lastbase pn_lastext
+syn keyword m3quakeProcedure pn_join pn_join2 pn_replace_ext pn_parent
+syn keyword m3quakeProcedure pn_current
+
+syn keyword m3quakeProcedure len
+
+syn keyword m3quakeProcedure split sub skipl skipr squeeze compress pos
+syn keyword m3quakeProcedure tcontains bool encode decode subst_chars
+syn keyword m3quakeProcedure del_chars subst subst_env add_prefix add_suffix
+" }}}
+
+" Identifiers
+syn match m3quakeEnvVariable "$\h\w\+"
+
+" Operators
+syn match m3quakeOperator "&"
+syn match m3quakeOperator "\<\%(contains\|not\|and\|or\)\>"
+
+" Strings
+syn match m3quakeEscape "\\[\\nrtbf"]" contained display
+syn region m3quakeString start=+"+ end=+"+ contains=m3quakeEscape
+
+" Comments
+syn keyword m3quakeTodo TODO FIXME XXX contained
+syn region m3quakeComment start="%" end="$" contains=m3quakeTodo,@Spell
+syn region m3quakeComment start="/\*" end="\*/" contains=m3quakeTodo,@Spell
+
+" Default highlighting
+hi def link m3quakeCommand Statement
+hi def link m3quakeComment Comment
+hi def link m3quakeEnvVariable Identifier
+hi def link m3quakeEscape Special
+hi def link m3quakeKeyword Keyword
+hi def link m3quakeOperator Operator
+hi def link m3quakeProcedure Function
+hi def link m3quakeString String
+hi def link m3quakeTodo Todo
+
+let b:current_syntax = "m3quake"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/syntax/m4.vim b/runtime/syntax/m4.vim
new file mode 100644
index 0000000..f90197a
--- /dev/null
+++ b/runtime/syntax/m4.vim
@@ -0,0 +1,62 @@
+" Vim syntax file
+" Language: M4
+" Maintainer: Claudio Fleiner (claudio@fleiner.com)
+" URL: http://www.fleiner.com/vim/syntax/m4.vim
+" (outdated)
+" Last Change: 2022 Jun 12
+
+" This file will highlight user function calls if they use only
+" capital letters and have at least one argument (i.e. the '('
+" must be there). Let me know if this is a problem.
+
+" quit when a syntax file was already loaded
+if !exists("main_syntax")
+ if exists("b:current_syntax")
+ finish
+ endif
+ " we define it here so that included files can test for it
+ let main_syntax='m4'
+endif
+
+" define the m4 syntax
+syn match m4Variable contained "\$\d\+"
+syn match m4Special contained "$[@*#]"
+syn match m4Comment "\<\(m4_\)\=dnl\>.*" contains=SpellErrors
+syn match m4Comment "#.*" contains=SpellErrors
+syn match m4Constants "\<\(m4_\)\=__file__"
+syn match m4Constants "\<\(m4_\)\=__line__"
+syn keyword m4Constants divnum sysval m4_divnum m4_sysval
+syn region m4Paren matchgroup=m4Delimiter start="(" end=")" contained contains=@m4Top
+syn region m4Command matchgroup=m4Function start="\<\(m4_\)\=\(define\|defn\|pushdef\)(" end=")" contains=@m4Top
+syn region m4Command matchgroup=m4Preproc start="\<\(m4_\)\=\(include\|sinclude\)("he=e-1 end=")" contains=@m4Top
+syn region m4Command matchgroup=m4Statement start="\<\(m4_\)\=\(syscmd\|esyscmd\|ifdef\|ifelse\|indir\|builtin\|shift\|errprint\|m4exit\|changecom\|changequote\|changeword\|m4wrap\|debugfile\|divert\|undivert\)("he=e-1 end=")" contains=@m4Top
+syn region m4Command matchgroup=m4builtin start="\<\(m4_\)\=\(len\|index\|regexp\|substr\|translit\|patsubst\|format\|incr\|decr\|eval\|maketemp\)("he=e-1 end=")" contains=@m4Top
+syn keyword m4Statement divert undivert
+syn region m4Command matchgroup=m4Type start="\<\(m4_\)\=\(undefine\|popdef\)("he=e-1 end=")" contains=@m4Top
+syn region m4Function matchgroup=m4Type start="\<[_A-Z][_A-Z0-9]*("he=e-1 end=")" contains=@m4Top
+syn region m4String start="`" end="'" contains=SpellErrors
+syn cluster m4Top contains=m4Comment,m4Constants,m4Special,m4Variable,m4String,m4Paren,m4Command,m4Statement,m4Function
+
+" Define the default highlighting.
+" 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"
+
+if main_syntax == 'm4'
+ unlet main_syntax
+endif
+
+" vim: ts=4
diff --git a/runtime/syntax/mail.vim b/runtime/syntax/mail.vim
new file mode 100644
index 0000000..0cd48fc
--- /dev/null
+++ b/runtime/syntax/mail.vim
@@ -0,0 +1,112 @@
+" Vim syntax file
+" Language: Mail file
+" Previous Maintainer: Felix von Leitner <leitner@math.fu-berlin.de>
+" Maintainer: GI <a@b.c>, where a='gi1242+vim', b='gmail', c='com'
+" Last Change: Wed 14 Aug 2013 08:24:52 AM PDT
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" The mail header is recognized starting with a "keyword:" line and ending
+" with an empty line or other line that can't be in the header. All lines of
+" the header are highlighted. Headers of quoted messages (quoted with >) are
+" also highlighted.
+
+" Syntax clusters
+syn cluster mailHeaderFields contains=mailHeaderKey,mailSubject,mailHeaderEmail,@mailLinks
+syn cluster mailLinks contains=mailURL,mailEmail
+syn cluster mailQuoteExps contains=mailQuoteExp1,mailQuoteExp2,mailQuoteExp3,mailQuoteExp4,mailQuoteExp5,mailQuoteExp6
+
+syn case match
+" For "From " matching case is required. The "From " is not matched in quoted
+" emails
+" According to RFC 2822 any printable ASCII character can appear in a field
+" name, except ':'.
+syn region mailHeader contains=@mailHeaderFields,@NoSpell start="^From .*\d\d\d\d$" skip="^\s" end="\v^[!-9;-~]*([^!-~]|$)"me=s-1 fold
+syn match mailHeaderKey contained contains=mailEmail,@NoSpell "^From\s.*\d\d\d\d$"
+
+" Nothing else depends on case.
+syn case ignore
+
+" Headers in properly quoted (with "> " or ">") emails are matched
+syn region mailHeader keepend contains=@mailHeaderFields,@mailQuoteExps,@NoSpell start="^\z(\(> \?\)*\)\v(newsgroups|x-([a-z\-])*|path|xref|message-id|from|((in-)?reply-)?to|b?cc|subject|return-path|received|date|replied):" skip="^\z1\s" end="\v^\z1[!-9;-~]*([^!-~]|$)"me=s-1 end="\v^\z1@!"me=s-1 end="\v^\z1(\> ?)+"me=s-1 fold
+
+" Usenet headers
+syn match mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(Newsgroups|Followup-To|Message-ID|Supersedes|Control):.*$"
+
+
+syn region mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@mailQuoteExps,@NoSpell start="\v(^(\> ?)*)@<=(to|b?cc):" skip=",$" end="$"
+syn match mailHeaderKey contained contains=mailHeaderEmail,mailEmail,@NoSpell "\v(^(\> ?)*)@<=(from|reply-to):.*$" fold
+syn match mailHeaderKey contained contains=@NoSpell "\v(^(\> ?)*)@<=date:"
+syn match mailSubject contained "\v^subject:.*$" fold
+syn match mailSubject contained contains=@NoSpell "\v(^(\> ?)+)@<=subject:.*$"
+
+" Anything in the header between < and > is an email address
+syn match mailHeaderEmail contained contains=@NoSpell "<.\{-}>"
+
+" Mail Signatures. (Begin with "-- ", end with change in quote level)
+syn region mailSignature keepend contains=@mailLinks,@mailQuoteExps start="^--\s$" end="^$" end="^\(> \?\)\+"me=s-1 fold
+syn region mailSignature keepend contains=@mailLinks,@mailQuoteExps,@NoSpell start="^\z(\(> \?\)\+\)--\s$" end="^\z1$" end="^\z1\@!"me=s-1 end="^\z1\(> \?\)\+"me=s-1 fold
+
+" Treat verbatim Text special.
+syn region mailVerbatim contains=@NoSpell keepend start="^#v+$" end="^#v-$" fold
+syn region mailVerbatim contains=@mailQuoteExps,@NoSpell keepend start="^\z(\(> \?\)\+\)#v+$" end="\z1#v-$" fold
+
+" URLs start with a known protocol or www,web,w3.
+syn match mailURL contains=@NoSpell `\v<(((https?|ftp|gopher)://|(mailto|file|news):)[^' <>"]+|(www|web|w3)[a-z0-9_-]*\.[a-z0-9._-]+\.[^' <>"]+)[a-z0-9/]`
+syn match mailEmail contains=@NoSpell "\v[_=a-z\./+0-9-]+\@[a-z0-9._-]+\a{2}"
+
+" Make sure quote markers in regions (header / signature) have correct color
+syn match mailQuoteExp1 contained "\v^(\> ?)"
+syn match mailQuoteExp2 contained "\v^(\> ?){2}"
+syn match mailQuoteExp3 contained "\v^(\> ?){3}"
+syn match mailQuoteExp4 contained "\v^(\> ?){4}"
+syn match mailQuoteExp5 contained "\v^(\> ?){5}"
+syn match mailQuoteExp6 contained "\v^(\> ?){6}"
+
+" Even and odd quoted lines. Order is important here!
+syn region mailQuoted6 keepend contains=mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{5}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
+syn region mailQuoted5 keepend contains=mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{4}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
+syn region mailQuoted4 keepend contains=mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{3}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
+syn region mailQuoted3 keepend contains=mailQuoted4,mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{2}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
+syn region mailQuoted2 keepend contains=mailQuoted3,mailQuoted4,mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z(\(\([a-z]\+>\|[]|}>]\)[ \t]*\)\{1}\([a-z]\+>\|[]|}>]\)\)" end="^\z1\@!" fold
+syn region mailQuoted1 keepend contains=mailQuoted2,mailQuoted3,mailQuoted4,mailQuoted5,mailQuoted6,mailVerbatim,mailHeader,@mailLinks,mailSignature,@NoSpell start="^\z([a-z]\+>\|[]|}>]\)" end="^\z1\@!" fold
+
+" Need to sync on the header. Assume we can do that within 100 lines
+if exists("mail_minlines")
+ exec "syn sync minlines=" . mail_minlines
+else
+ syn sync minlines=100
+endif
+
+" Define the default highlighting.
+hi def link mailVerbatim Special
+hi def link mailHeader Statement
+hi def link mailHeaderKey Type
+hi def link mailSignature PreProc
+hi def link mailHeaderEmail mailEmail
+hi def link mailEmail Special
+hi def link mailURL String
+hi def link mailSubject Title
+hi def link mailQuoted1 Comment
+hi def link mailQuoted3 mailQuoted1
+hi def link mailQuoted5 mailQuoted1
+hi def link mailQuoted2 Identifier
+hi def link mailQuoted4 mailQuoted2
+hi def link mailQuoted6 mailQuoted2
+hi def link mailQuoteExp1 mailQuoted1
+hi def link mailQuoteExp2 mailQuoted2
+hi def link mailQuoteExp3 mailQuoted3
+hi def link mailQuoteExp4 mailQuoted4
+hi def link mailQuoteExp5 mailQuoted5
+hi def link mailQuoteExp6 mailQuoted6
+
+let b:current_syntax = "mail"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/mailaliases.vim b/runtime/syntax/mailaliases.vim
new file mode 100644
index 0000000..a5282aa
--- /dev/null
+++ b/runtime/syntax/mailaliases.vim
@@ -0,0 +1,71 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword mailaliasesTodo contained TODO FIXME XXX NOTE
+
+syn region mailaliasesComment display oneline start='^\s*#' end='$'
+ \ contains=mailaliasesTodo,@Spell
+
+syn match mailaliasesBegin display '^'
+ \ nextgroup=mailaliasesName,
+ \ mailaliasesComment
+
+syn match mailaliasesName contained '[[:alnum:]\._-]\+'
+ \ nextgroup=mailaliasesColon
+
+syn region mailaliasesName contained oneline start=+"+
+ \ skip=+\\\\\|\\"+ end=+"+
+ \ nextgroup=mailaliasesColon
+
+syn match mailaliasesColon contained ':'
+ \ nextgroup=@mailaliasesValue
+ \ skipwhite skipnl
+
+syn cluster mailaliasesValue contains=mailaliasesValueAddress,
+ \ mailaliasesValueFile,
+ \ mailaliasesValueCommand,
+ \ mailaliasesValueInclude
+
+syn match mailaliasesValueAddress contained '[^ \t/|,]\+'
+ \ nextgroup=mailaliasesValueSep
+ \ skipwhite skipnl
+
+syn match mailaliasesValueFile contained '/[^,]*'
+ \ nextgroup=mailaliasesValueSep
+ \ skipwhite skipnl
+
+syn match mailaliasesValueCommand contained '|[^,]*'
+ \ nextgroup=mailaliasesValueSep
+ \ skipwhite skipnl
+
+syn match mailaliasesValueInclude contained ':include:[^,]*'
+ \ nextgroup=mailaliasesValueSep
+ \ skipwhite skipnl
+
+syn match mailaliasesValueSep contained ','
+ \ nextgroup=@mailaliasesValue
+ \ skipwhite skipnl
+
+hi def link mailaliasesTodo Todo
+hi def link mailaliasesComment Comment
+hi def link mailaliasesName Identifier
+hi def link mailaliasesColon Delimiter
+hi def link mailaliasesValueAddress String
+hi def link mailaliasesValueFile String
+hi def link mailaliasesValueCommand String
+hi def link mailaliasesValueInclude PreProc
+hi def link mailaliasesValueSep Delimiter
+
+let b:current_syntax = "mailaliases"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/mailcap.vim b/runtime/syntax/mailcap.vim
new file mode 100644
index 0000000..bd23040
--- /dev/null
+++ b/runtime/syntax/mailcap.vim
@@ -0,0 +1,35 @@
+" Vim syntax file
+" Language: Mailcap configuration file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2013 Jun 01
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match mailcapComment "^#.*"
+
+syn region mailcapString start=+"+ end=+"+ contains=mailcapSpecial oneline
+
+syn match mailcapDelimiter "\\\@<!;"
+
+syn match mailcapSpecial "\\\@<!%[nstF]"
+syn match mailcapSpecial "\\\@<!%{[^}]*}"
+
+syn case ignore
+syn match mailcapFlag "\(=\s*\)\@<!\<\(needsterminal\|copiousoutput\|x-\w\+\)\>"
+syn match mailcapFieldname "\<\(compose\|composetyped\|print\|edit\|test\|x11-bitmap\|nametemplate\|textualnewlines\|description\|x-\w+\)\>\ze\s*="
+syn match mailcapTypeField "^\(text\|image\|audio\|video\|application\|message\|multipart\|model\|x-[[:graph:]]\+\)\(/\(\*\|[[:graph:]]\+\)\)\=\ze\s*;"
+syn case match
+
+hi def link mailcapComment Comment
+hi def link mailcapDelimiter Delimiter
+hi def link mailcapFlag Statement
+hi def link mailcapFieldname Statement
+hi def link mailcapSpecial Identifier
+hi def link mailcapTypeField Type
+hi def link mailcapString String
+
+let b:current_syntax = "mailcap"
+
+" vim: ts=8
diff --git a/runtime/syntax/make.vim b/runtime/syntax/make.vim
new file mode 100644
index 0000000..b457304
--- /dev/null
+++ b/runtime/syntax/make.vim
@@ -0,0 +1,144 @@
+" Vim syntax file
+" Language: Makefile
+" Maintainer: Roland Hieber <rohieb+vim-iR0jGdkV@rohieb.name>, <https://github.com/rohieb>
+" Previous Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" URL: https://github.com/vim/vim/blob/master/runtime/syntax/make.vim
+" Last Change: 2022 Nov 06
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" some special characters
+syn match makeSpecial "^\s*[@+-]\+"
+syn match makeNextLine "\\\n\s*"
+
+" catch unmatched define/endef keywords. endef only matches it is by itself on a line, possibly followed by a commend
+syn region makeDefine start="^\s*define\s" end="^\s*endef\s*\(#.*\)\?$"
+ \ contains=makeStatement,makeIdent,makePreCondit,makeDefine
+
+" Microsoft Makefile specials
+syn case ignore
+syn match makeInclude "^!\s*include\s.*$"
+syn match makePreCondit "^!\s*\(cmdswitches\|error\|message\|include\|if\|ifdef\|ifndef\|else\|else\s*if\|else\s*ifdef\|else\s*ifndef\|endif\|undef\)\>"
+syn case match
+
+" identifiers
+syn region makeIdent start="\$(" skip="\\)\|\\\\" end=")" contains=makeStatement,makeIdent
+syn region makeIdent start="\${" skip="\\}\|\\\\" end="}" contains=makeStatement,makeIdent
+syn match makeIdent "\$\$\w*"
+syn match makeIdent "\$[^({]"
+syn match makeIdent "^ *[^:#= \t]*\s*[:+?!*]="me=e-2
+syn match makeIdent "^ *[^:#= \t]*\s*::="me=e-3
+syn match makeIdent "^ *[^:#= \t]*\s*="me=e-1
+syn match makeIdent "%"
+
+" Makefile.in variables
+syn match makeConfig "@[A-Za-z0-9_]\+@"
+
+" make targets
+syn match makeImplicit "^\.[A-Za-z0-9_./\t -]\+\s*:$"me=e-1
+syn match makeImplicit "^\.[A-Za-z0-9_./\t -]\+\s*:[^=]"me=e-2
+
+syn region makeTarget transparent matchgroup=makeTarget
+ \ start="^[~A-Za-z0-9_./$(){}%-][A-Za-z0-9_./\t ${}()%-]*&\?:\?:\{1,2}[^:=]"rs=e-1
+ \ end="[^\\]$"
+ \ keepend contains=makeIdent,makeSpecTarget,makeNextLine,makeComment,makeDString
+ \ skipnl nextGroup=makeCommands
+syn match makeTarget "^[~A-Za-z0-9_./$(){}%*@-][A-Za-z0-9_./\t $(){}%*@-]*&\?::\=\s*$"
+ \ contains=makeIdent,makeSpecTarget,makeComment
+ \ skipnl nextgroup=makeCommands,makeCommandError
+
+syn region makeSpecTarget transparent matchgroup=makeSpecTarget
+ \ start="^\.\(SUFFIXES\|PHONY\|DEFAULT\|PRECIOUS\|IGNORE\|SILENT\|EXPORT_ALL_VARIABLES\|KEEP_STATE\|LIBPATTERNS\|NOTPARALLEL\|DELETE_ON_ERROR\|INTERMEDIATE\|POSIX\|SECONDARY\|ONESHELL\)\>\s*:\{1,2}[^:=]"rs=e-1
+ \ end="[^\\]$" keepend
+ \ contains=makeIdent,makeSpecTarget,makeNextLine,makeComment skipnl nextGroup=makeCommands
+syn match makeSpecTarget "^\.\(SUFFIXES\|PHONY\|DEFAULT\|PRECIOUS\|IGNORE\|SILENT\|EXPORT_ALL_VARIABLES\|KEEP_STATE\|LIBPATTERNS\|NOTPARALLEL\|DELETE_ON_ERROR\|INTERMEDIATE\|POSIX\|SECONDARY\|ONESHELL\)\>\s*::\=\s*$"
+ \ contains=makeIdent,makeComment
+ \ skipnl nextgroup=makeCommands,makeCommandError
+
+syn match makeCommandError "^\s\+\S.*" contained
+syn region makeCommands contained start=";"hs=s+1 start="^\t"
+ \ end="^[^\t#]"me=e-1,re=e-1 end="^$"
+ \ contains=makeCmdNextLine,makeSpecial,makeComment,makeIdent,makePreCondit,makeDefine,makeDString,makeSString
+ \ nextgroup=makeCommandError
+syn match makeCmdNextLine "\\\n."he=e-1 contained
+
+" some directives
+syn match makePreCondit "^ *\(ifn\=\(eq\|def\)\>\|else\(\s\+ifn\=\(eq\|def\)\)\=\>\|endif\>\)"
+syn match makeInclude "^ *[-s]\=include\s.*$"
+syn match makeStatement "^ *vpath"
+syn match makeExport "^ *\(export\|unexport\)\>"
+syn match makeOverride "^ *override\>"
+" Statements / Functions (GNU make)
+syn match makeStatement contained "(\(abspath\|addprefix\|addsuffix\|and\|basename\|call\|dir\|error\|eval\|file\|filter-out\|filter\|findstring\|firstword\|flavor\|foreach\|guile\|if\|info\|join\|lastword\|notdir\|or\|origin\|patsubst\|realpath\|shell\|sort\|strip\|subst\|suffix\|value\|warning\|wildcard\|word\|wordlist\|words\)\>"ms=s+1
+
+" Comment
+if exists("make_microsoft")
+ syn match makeComment "#.*" contains=@Spell,makeTodo
+elseif !exists("make_no_comments")
+ syn region makeComment start="#" end="^$" end="[^\\]$" keepend contains=@Spell,makeTodo
+ syn match makeComment "#$" contains=@Spell
+endif
+syn keyword makeTodo TODO FIXME XXX contained
+
+" match escaped quotes and any other escaped character
+" except for $, as a backslash in front of a $ does
+" not make it a standard character, but instead it will
+" still act as the beginning of a variable
+" The escaped char is not highlightet currently
+syn match makeEscapedChar "\\[^$]"
+
+
+syn region makeDString start=+\(\\\)\@<!"+ skip=+\\.+ end=+"+ contained contains=makeIdent
+syn region makeSString start=+\(\\\)\@<!'+ skip=+\\.+ end=+'+ contained contains=makeIdent
+syn region makeBString start=+\(\\\)\@<!`+ skip=+\\.+ end=+`+ contains=makeIdent,makeSString,makeDString,makeNextLine
+
+" Syncing
+syn sync minlines=20 maxlines=200
+
+" Sync on Make command block region: When searching backwards hits a line that
+" can't be a command or a comment, use makeCommands if it looks like a target,
+" NONE otherwise.
+syn sync match makeCommandSync groupthere NONE "^[^\t#]"
+syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}[^:=]"
+syn sync match makeCommandSync groupthere makeCommands "^[A-Za-z0-9_./$()%-][A-Za-z0-9_./\t $()%-]*:\{1,2}\s*$"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link makeNextLine makeSpecial
+hi def link makeCmdNextLine makeSpecial
+hi link makeOverride makeStatement
+hi link makeExport makeStatement
+
+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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/mallard.vim b/runtime/syntax/mallard.vim
new file mode 100644
index 0000000..b2a77b0
--- /dev/null
+++ b/runtime/syntax/mallard.vim
@@ -0,0 +1,37 @@
+" Vim syntax file
+" Language: Mallard
+" Maintainer: Jaromir Hradilek <jhradilek@gmail.com>
+" URL: https://github.com/jhradilek/vim-syntax
+" Last Change: 11 February 2013
+" Description: A syntax file for the Mallard markup language according to
+" Mallard 1.0 DRAFT as of 2013-02-11.
+
+if exists("b:current_syntax")
+ finish
+endif
+
+do Syntax xml
+syn cluster xmlTagHook add=mallardTagName
+syn spell toplevel
+syn case match
+
+syn keyword mallardTagName app cite cmd code col colgroup comment contained
+syn keyword mallardTagName credit desc em email example figure contained
+syn keyword mallardTagName file gui guiseq info input item key contained
+syn keyword mallardTagName keyseq license link links list listing contained
+syn keyword mallardTagName media name note output p page quote contained
+syn keyword mallardTagName revision screen section span steps contained
+syn keyword mallardTagName subtitle synopsis sys table tbody td contained
+syn keyword mallardTagName terms tfoot thead title tr tree var contained
+syn keyword mallardTagName years contained
+
+syn region mallardComment start="<comment\>" end="</comment>"me=e-10 contains=xmlTag,xmlNamespace,xmlTagName,xmlEndTag,xmlRegion,xmlEntity,@Spell keepend
+syn region mallardEmphasis start="<em\>" end="</em>"me=e-5 contains=xmlTag,xmlNamespace,xmlTagName,xmlEndTag,xmlRegion,xmlEntity,@Spell keepend
+syn region mallardTitle start="<title\>" end="</title>"me=e-8 contains=xmlTag,xmlNamespace,xmlTagName,xmlEndTag,xmlRegion,xmlEntity,@Spell keepend
+
+hi def link mallardComment Comment
+hi def link mallardTagName Statement
+hi def link mallardTitle Title
+hi def mallardEmphasis term=italic cterm=italic gui=italic
+
+let b:current_syntax = "mallard"
diff --git a/runtime/syntax/man.vim b/runtime/syntax/man.vim
new file mode 100644
index 0000000..4e08cd7
--- /dev/null
+++ b/runtime/syntax/man.vim
@@ -0,0 +1,56 @@
+" Vim syntax file
+" Language: Man page
+" Maintainer: Jason Franklin <vim@justemail.net>
+" Previous Maintainer: SungHyun Nam <goweol@gmail.com>
+" Previous Maintainer: Gautam H. Mudunuri <gmudunur@informatica.com>
+" Version Info:
+" Last Change: 2020 Sep 19
+
+" Additional highlighting by Johannes Tanzler <johannes.tanzler@aon.at>:
+" * manSubHeading
+" * manSynopsis (only for sections 2 and 3)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Get the CTRL-H syntax to handle backspaced text
+runtime! syntax/ctrlh.vim
+
+syn case ignore
+
+syn match manReference "\f\+([1-9][a-z]\=)"
+syn match manSectionHeading "^\a.*$"
+syn match manSubHeading "^\s\{3\}\a.*$"
+syn match manOptionDesc "^\s*[+-][a-z0-9]\S*"
+syn match manLongOptionDesc "^\s*--[a-z0-9-]\S*"
+" syn match manHistory "^[a-z].*last change.*$"
+
+syn match manHeader '\%1l.*'
+exe 'syn match manFooter ''\%' . line('$') . 'l.*'''
+
+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
+endif
+
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link manHeader Title
+hi def link manFooter PreProc
+
+hi def link manSectionHeading Statement
+hi def link manOptionDesc Constant
+hi def link manLongOptionDesc Constant
+hi def link manReference PreProc
+hi def link manSubHeading Function
+hi def link manCFuncDefinition Function
+
+
+let b:current_syntax = "man"
+
+" vim:ts=8 sts=2 sw=2:
diff --git a/runtime/syntax/manconf.vim b/runtime/syntax/manconf.vim
new file mode 100644
index 0000000..2c17568
--- /dev/null
+++ b/runtime/syntax/manconf.vim
@@ -0,0 +1,117 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword manconfTodo contained TODO FIXME XXX NOTE
+
+syn region manconfComment display oneline start='^#' end='$'
+ \ contains=manconfTodo,@Spell
+
+if !has("win32") && $OSTYPE =~ 'bsd'
+ syn match manconfBegin display '^'
+ \ nextgroup=manconfKeyword,manconfSection,
+ \ manconfComment skipwhite
+
+ syn keyword manconfKeyword contained _build _crunch
+ \ nextgroup=manconfExtCmd skipwhite
+
+ syn keyword manconfKeyword contained _suffix
+ \ nextgroup=manconfExt skipwhite
+
+ syn keyword manconfKeyword contained _crunch
+
+ syn keyword manconfKeyword contained _subdir _version _whatdb
+ \ nextgroup=manconfPaths skipwhite
+
+ syn match manconfExtCmd contained display '\.\S\+'
+ \ nextgroup=manconfPaths skipwhite
+
+ syn match manconfSection contained '[^#_ \t]\S*'
+ \ nextgroup=manconfPaths skipwhite
+
+ syn keyword manconfSection contained _default
+ \ nextgroup=manconfPaths skipwhite
+
+ syn match manconfPaths contained display '\S\+'
+ \ nextgroup=manconfPaths skipwhite
+
+ syn match manconfExt contained display '\.\S\+'
+
+ hi def link manconfExtCmd Type
+ hi def link manconfSection Identifier
+ hi def link manconfPaths String
+else
+ syn match manconfBegin display '^'
+ \ nextgroup=manconfBoolean,manconfKeyword,
+ \ manconfDecompress,manconfComment skipwhite
+
+ syn keyword manconfBoolean contained FSSTND FHS NOAUTOPATH NOCACHE
+
+ syn keyword manconfKeyword contained MANBIN
+ \ nextgroup=manconfPath skipwhite
+
+ syn keyword manconfKeyword contained MANPATH MANPATH_MAP
+ \ nextgroup=manconfFirstPath skipwhite
+
+ syn keyword manconfKeyword contained APROPOS WHATIS TROFF NROFF JNROFF EQN
+ \ NEQN JNEQN TBL COL REFER PIC VGRIND GRAP
+ \ PAGER BROWSER HTMLPAGER CMP CAT COMPRESS
+ \ DECOMPRESS MANDEFOPTIONS
+ \ nextgroup=manconfCommand skipwhite
+
+ syn keyword manconfKeyword contained COMPRESS_EXT
+ \ nextgroup=manconfExt skipwhite
+
+ syn keyword manconfKeyword contained MANSECT
+ \ nextgroup=manconfManSect skipwhite
+
+ syn match manconfPath contained display '\S\+'
+
+ syn match manconfFirstPath contained display '\S\+'
+ \ nextgroup=manconfSecondPath skipwhite
+
+ syn match manconfSecondPath contained display '\S\+'
+
+ syn match manconfCommand contained display '\%(/[^/ \t]\+\)\+'
+ \ nextgroup=manconfCommandOpt skipwhite
+
+ syn match manconfCommandOpt contained display '\S\+'
+ \ nextgroup=manconfCommandOpt skipwhite
+
+ syn match manconfExt contained display '\.\S\+'
+
+ syn match manconfManSect contained '[^:]\+' nextgroup=manconfManSectSep
+
+ syn match manconfManSectSep contained ':' nextgroup=manconfManSect
+
+ syn match manconfDecompress contained '\.\S\+'
+ \ nextgroup=manconfCommand skipwhite
+
+ hi def link manconfBoolean Boolean
+ hi def link manconfPath String
+ hi def link manconfFirstPath manconfPath
+ hi def link manconfSecondPath manconfPath
+ hi def link manconfCommand String
+ hi def link manconfCommandOpt Special
+ hi def link manconfManSect Identifier
+ hi def link manconfManSectSep Delimiter
+ hi def link manconfDecompress Type
+endif
+
+hi def link manconfTodo Todo
+hi def link manconfComment Comment
+hi def link manconfKeyword Keyword
+hi def link manconfExt Type
+
+let b:current_syntax = "manconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/manual.vim b/runtime/syntax/manual.vim
new file mode 100644
index 0000000..c0e53fa
--- /dev/null
+++ b/runtime/syntax/manual.vim
@@ -0,0 +1,29 @@
+" Vim syntax support file
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2016 Feb 01
+
+" This file is used for ":syntax manual".
+" It installs the Syntax autocommands, but no the FileType autocommands.
+
+if !has("syntax")
+ finish
+endif
+
+" Load the Syntax autocommands and set the default methods for highlighting.
+if !exists("syntax_on")
+ so <sfile>:p:h/synload.vim
+endif
+
+let syntax_manual = 1
+
+" Overrule the connection between FileType and Syntax autocommands. This sets
+" the syntax when the file type is detected, without changing the value.
+augroup syntaxset
+ au! FileType * exe "set syntax=" . &syntax
+augroup END
+
+" If the GUI is already running, may still need to install the FileType menu.
+" Don't do it when the 'M' flag is included in 'guioptions'.
+if has("menu") && has("gui_running") && !exists("did_install_syntax_menu") && &guioptions !~# 'M'
+ source $VIMRUNTIME/menu.vim
+endif
diff --git a/runtime/syntax/maple.vim b/runtime/syntax/maple.vim
new file mode 100644
index 0000000..78f2b4e
--- /dev/null
+++ b/runtime/syntax/maple.vim
@@ -0,0 +1,622 @@
+" Vim syntax file
+" Language: Maple V (based on release 4)
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Mar 26, 2019
+" Version: 17
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_MAPLE
+"
+" Package Function Selection: {{{1
+" Because there are a lot of packages, and because of the potential for namespace
+" clashes, this version of <maple.vim> needs the user to select which, if any,
+" package functions should be highlighted. Select your packages and put into your
+" <.vimrc> none or more of the lines following let ...=1 lines:
+"
+" if exists("mvpkg_all")
+" ...
+" endif
+"
+" *OR* let mvpkg_all=1
+
+" This syntax file contains all the keywords and top-level packages of Maple 9.5
+" but only the contents of packages of Maple V Release 4, and the top-level
+" routines of Release 4. <Jacques Carette - carette@mcmaster.ca>
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Iskeyword Effects: {{{1
+if (v:version == 704 && has("patch-7.4.1142")) || v:version > 704
+ syn iskeyword $,48-57,_,a-z,@-Z
+else
+ setl isk=$,48-57,_,a-z,@-Z
+endif
+
+" Package Selection: {{{1
+" allow user to simply select all packages for highlighting
+if exists("mvpkg_all")
+ let mv_DEtools = 1
+ let mv_Galois = 1
+ let mv_GaussInt = 1
+ let mv_LREtools = 1
+ let mv_combinat = 1
+ let mv_combstruct = 1
+ let mv_difforms = 1
+ let mv_finance = 1
+ let mv_genfunc = 1
+ let mv_geometry = 1
+ let mv_grobner = 1
+ let mv_group = 1
+ let mv_inttrans = 1
+ let mv_liesymm = 1
+ let mv_linalg = 1
+ let mv_logic = 1
+ let mv_networks = 1
+ let mv_numapprox = 1
+ let mv_numtheory = 1
+ let mv_orthopoly = 1
+ let mv_padic = 1
+ let mv_plots = 1
+ let mv_plottools = 1
+ let mv_powseries = 1
+ let mv_process = 1
+ let mv_simplex = 1
+ let mv_stats = 1
+ let mv_student = 1
+ let mv_sumtools = 1
+ let mv_tensor = 1
+ let mv_totorder = 1
+endif
+
+" Parenthesis/curly/brace sanity checker: {{{1
+syn case match
+
+" parenthesis/curly/brace sanity checker
+syn region mvZone matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" transparent contains=ALLBUT,mvError,mvBraceError,mvCurlyError
+syn region mvZone matchgroup=Delimiter start="{" matchgroup=Delimiter end="}" transparent contains=ALLBUT,mvError,mvBraceError,mvParenError
+syn region mvZone matchgroup=Delimiter start="\[" matchgroup=Delimiter end="]" transparent contains=ALLBUT,mvError,mvCurlyError,mvParenError
+syn match mvError "[)\]}]"
+syn match mvBraceError "[)}]" contained
+syn match mvCurlyError "[)\]]" contained
+syn match mvParenError "[\]}]" contained
+syn match mvComma "[,;:]"
+syn match mvSemiError "[;:]" contained
+syn match mvDcolon "::"
+
+" Maple Packages, updated for Maple 9.5
+syn keyword mvPackage algcurves ArrayTools Cache codegen
+syn keyword mvPackage CodeGeneration CodeTools combinat combstruct
+syn keyword mvPackage ContextMenu CurveFitting DEtools diffalg
+syn keyword mvPackage difforms DiscreteTransforms Domains ExternalCalling
+syn keyword mvPackage FileTools finance GaussInt genfunc
+syn keyword mvPackage geom3d geometry gfun Groebner
+syn keyword mvPackage group hashmset IntegerRelations inttrans
+syn keyword mvPackage LargeExpressions LibraryTools liesymm linalg
+syn keyword mvPackage LinearAlgebra LinearFunctionalSystems LinearOperators
+syn keyword mvPackage ListTools Logic LREtools Maplets
+syn keyword mvPackage MathematicalFunctions MathML Matlab
+syn keyword mvPackage MatrixPolynomialAlgebra MmaTranslator networks
+syn keyword mvPackage numapprox numtheory Optimization OreTools
+syn keyword mvPackage Ore_algebra OrthogonalSeries orthopoly padic
+syn keyword mvPackage PDEtools plots plottools PolynomialIdeals
+syn keyword mvPackage PolynomialTools powseries process QDifferenceEquations
+syn keyword mvPackage RandomTools RationalNormalForms RealDomain RootFinding
+syn keyword mvPackage ScientificConstants ScientificErrorAnalysis simplex
+syn keyword mvPackage Slode SNAP Sockets SoftwareMetrics
+syn keyword mvPackage SolveTools Spread stats StringTools
+syn keyword mvPackage Student student sumtools SumTools
+syn keyword mvPackage tensor TypeTools Units VariationalCalculus
+syn keyword mvPackage VectorCalculus Worksheet XMLTools
+
+" Language Support: {{{1
+syn keyword mvTodo contained COMBAK FIXME TODO XXX
+if exists("g:mapleversion") && g:mapleversion < 9
+ syn region mvString start=+`+ skip=+``+ end=+`+ keepend contains=mvTodo,@Spell
+ syn region mvString start=+"+ skip=+""+ end=+"+ keepend contains=@Spell
+ syn region mvDelayEval start=+'+ end=+'+ keepend contains=ALLBUT,mvError,mvBraceError,mvCurlyError,mvParenError,mvSemiError
+ syn match mvVarAssign "[a-zA-Z_][a-zA-Z_0-9]*[ \t]*:=" contains=mvAssign
+ syn match mvAssign ":=" contained
+else
+ syn region mvName start=+`+ skip=+``+ end=+`+ keepend contains=mvTodo
+ syn region mvString start=+"+ skip=+""+ end=+"+ keepend contains=@Spell
+ syn region mvDelayEval start=+'+ end=+'+ keepend contains=ALLBUT,mvError,mvBraceError,mvCurlyError,mvParenError
+ syn match mvDelim "[;:]" display
+ syn match mvAssign ":="
+endif
+
+" Lower-Priority Operators: {{{1
+syn match mvOper "\."
+
+" Number handling: {{{1
+syn match mvNumber "\<\d\+" " integer
+ syn match mvNumber "[-+]\=\.\d\+" " . integer
+syn match mvNumber "\<\d\+\.\d\+" " integer . integer
+syn match mvNumber "\<\d\+\." " integer .
+syn match mvNumber "\<\d\+\.\." contains=mvRange " integer ..
+
+syn match mvNumber "\<\d\+e[-+]\=\d\+" " integer e [-+] integer
+syn match mvNumber "[-+]\=\.\d\+e[-+]\=\d\+" " . integer e [-+] integer
+syn match mvNumber "\<\d\+\.\d*e[-+]\=\d\+" " integer . [integer] e [-+] integer
+
+syn match mvNumber "[-+]\d\+" " integer
+syn match mvNumber "[-+]\d\+\.\d\+" " integer . integer
+syn match mvNumber "[-+]\d\+\." " integer .
+syn match mvNumber "[-+]\d\+\.\." contains=mvRange " integer ..
+
+syn match mvNumber "[-+]\d\+e[-+]\=\d\+" " integer e [-+] integer
+syn match mvNumber "[-+]\d\+\.\d*e[-+]\=\d\+" " integer . [integer] e [-+] integer
+
+syn match mvRange "\.\."
+
+" Operators: {{{1
+syn keyword mvOper and not or xor implies union intersect subset minus mod
+syn match mvOper "<>\|[<>]=\|[<>]\|="
+syn match mvOper "&+\|&-\|&\*\|&\/\|&"
+syn match mvError "\.\.\."
+
+" MapleV Statements: ? statement {{{1
+
+" MapleV Statements: ? statement
+" Split into booleans, conditionals, operators, repeat-logic, etc
+syn keyword mvBool true false FAIL
+syn keyword mvCond elif else fi if then
+syn match mvCond "end\s\+if"
+
+syn keyword mvRepeat by for in to
+syn keyword mvRepeat do from od while
+syn match mvRepeat "end\s\+do"
+
+syn keyword mvSpecial NULL
+syn match mvSpecial "\[\]\|{}"
+
+if exists("g:mapleversion") && g:mapleversion < 9
+ syn keyword mvStatement Order fail options read save
+ syn keyword mvStatement break local point remember stop
+ syn keyword mvStatement done mod proc restart with
+ syn keyword mvStatement end mods quit return
+ syn keyword mvStatement error next
+else
+ syn keyword mvStatement option options read save
+ syn keyword mvStatement break local remember stop
+ syn keyword mvStatement done mod proc restart
+ syn keyword mvStatement end mods quit return
+ syn keyword mvStatement error next try catch
+ syn keyword mvStatement finally assuming global export
+ syn keyword mvStatement module description use
+endif
+
+" Builtin Constants: ? constants {{{1
+syn keyword mvConstant Catalan I gamma infinity
+syn keyword mvConstant Pi
+
+" Comments: DEBUG, if in a comment, is specially highlighted. {{{1
+syn keyword mvDebug contained DEBUG
+syn cluster mvCommentGroup contains=mvTodo,mvDebug,@Spell
+syn match mvComment "#.*$" contains=@mvCommentGroup
+
+" Basic Library Functions: ? index[function]
+syn keyword mvLibrary $ @ @@ ERROR
+syn keyword mvLibrary AFactor KelvinHer arctan factor log rhs
+syn keyword mvLibrary AFactors KelvinKei arctanh factors log10 root
+syn keyword mvLibrary AiryAi KelvinKer argument fclose lprint roots
+syn keyword mvLibrary AiryBi LambertW array feof map round
+syn keyword mvLibrary AngerJ Lcm assign fflush map2 rsolve
+syn keyword mvLibrary Berlekamp LegendreE assigned filepos match savelib
+syn keyword mvLibrary BesselI LegendreEc asspar fixdiv matrix scanf
+syn keyword mvLibrary BesselJ LegendreEc1 assume float max searchtext
+syn keyword mvLibrary BesselK LegendreF asubs floor maximize sec
+syn keyword mvLibrary BesselY LegendreKc asympt fnormal maxnorm sech
+syn keyword mvLibrary Beta LegendreKc1 attribute fopen maxorder select
+syn keyword mvLibrary C LegendrePi bernstein forget member seq
+syn keyword mvLibrary Chi LegendrePic branches fortran min series
+syn keyword mvLibrary Ci LegendrePic1 bspline fprintf minimize setattribute
+syn keyword mvLibrary CompSeq Li cat frac minpoly shake
+syn keyword mvLibrary Content Linsolve ceil freeze modp showprofile
+syn keyword mvLibrary D MOLS chrem fremove modp1 showtime
+syn keyword mvLibrary DESol Maple_floats close frontend modp2 sign
+syn keyword mvLibrary Det MeijerG close fscanf modpol signum
+syn keyword mvLibrary Diff Norm coeff fsolve mods simplify
+syn keyword mvLibrary Dirac Normal coeffs galois msolve sin
+syn keyword mvLibrary DistDeg Nullspace coeftayl gc mtaylor singular
+syn keyword mvLibrary Divide Power collect gcd mul sinh
+syn keyword mvLibrary Ei Powmod combine gcdex nextprime sinterp
+syn keyword mvLibrary Eigenvals Prem commutat genpoly nops solve
+syn keyword mvLibrary EllipticCE Primfield comparray harmonic norm sort
+syn keyword mvLibrary EllipticCK Primitive compoly has normal sparse
+syn keyword mvLibrary EllipticCPi Primpart conjugate hasfun numboccur spline
+syn keyword mvLibrary EllipticE ProbSplit content hasoption numer split
+syn keyword mvLibrary EllipticF Product convergs hastype op splits
+syn keyword mvLibrary EllipticK Psi convert heap open sprem
+syn keyword mvLibrary EllipticModulus Quo coords history optimize sprintf
+syn keyword mvLibrary EllipticNome RESol copy hypergeom order sqrfree
+syn keyword mvLibrary EllipticPi Randpoly cos iFFT parse sqrt
+syn keyword mvLibrary Eval Randprime cosh icontent pclose sscanf
+syn keyword mvLibrary Expand Ratrecon cost identity pclose ssystem
+syn keyword mvLibrary FFT Re cot igcd pdesolve stack
+syn keyword mvLibrary Factor Rem coth igcdex piecewise sturm
+syn keyword mvLibrary Factors Resultant csc ilcm plot sturmseq
+syn keyword mvLibrary FresnelC RootOf csch ilog plot3d subs
+syn keyword mvLibrary FresnelS Roots csgn ilog10 plotsetup subsop
+syn keyword mvLibrary Fresnelf SPrem dawson implicitdiff pochhammer substring
+syn keyword mvLibrary Fresnelg Searchtext define indets pointto sum
+syn keyword mvLibrary Frobenius Shi degree index poisson surd
+syn keyword mvLibrary GAMMA Si denom indexed polar symmdiff
+syn keyword mvLibrary GaussAGM Smith depends indices polylog symmetric
+syn keyword mvLibrary Gaussejord Sqrfree diagonal inifcn polynom system
+syn keyword mvLibrary Gausselim Ssi diff ininame powmod table
+syn keyword mvLibrary Gcd StruveH dilog initialize prem tan
+syn keyword mvLibrary Gcdex StruveL dinterp insert prevprime tanh
+syn keyword mvLibrary HankelH1 Sum disassemble int primpart testeq
+syn keyword mvLibrary HankelH2 Svd discont interface print testfloat
+syn keyword mvLibrary Heaviside TEXT discrim interp printf thaw
+syn keyword mvLibrary Hermite Trace dismantle invfunc procbody thiele
+syn keyword mvLibrary Im WeberE divide invztrans procmake time
+syn keyword mvLibrary Indep WeierstrassP dsolve iostatus product translate
+syn keyword mvLibrary Interp WeierstrassPPrime eliminate iperfpow proot traperror
+syn keyword mvLibrary Inverse WeierstrassSigma ellipsoid iquo property trigsubs
+syn keyword mvLibrary Irreduc WeierstrassZeta entries iratrecon protect trunc
+syn keyword mvLibrary Issimilar Zeta eqn irem psqrt type
+syn keyword mvLibrary JacobiAM abs erf iroot quo typematch
+syn keyword mvLibrary JacobiCD add erfc irreduc radnormal unames
+syn keyword mvLibrary JacobiCN addcoords eulermac iscont radsimp unapply
+syn keyword mvLibrary JacobiCS addressof eval isdifferentiable rand unassign
+syn keyword mvLibrary JacobiDC algebraic evala isolate randomize unload
+syn keyword mvLibrary JacobiDN algsubs evalapply ispoly randpoly unprotect
+syn keyword mvLibrary JacobiDS alias evalb isqrfree range updatesR4
+syn keyword mvLibrary JacobiNC allvalues evalc isqrt rationalize userinfo
+syn keyword mvLibrary JacobiND anames evalf issqr ratrecon value
+syn keyword mvLibrary JacobiNS antisymm evalfint latex readbytes vector
+syn keyword mvLibrary JacobiSC applyop evalgf lattice readdata verify
+syn keyword mvLibrary JacobiSD arccos evalhf lcm readlib whattype
+syn keyword mvLibrary JacobiSN arccosh evalm lcoeff readline with
+syn keyword mvLibrary JacobiTheta1 arccot evaln leadterm readstat writebytes
+syn keyword mvLibrary JacobiTheta2 arccoth evalr length realroot writedata
+syn keyword mvLibrary JacobiTheta3 arccsc exp lexorder recipoly writeline
+syn keyword mvLibrary JacobiTheta4 arccsch expand lhs rem writestat
+syn keyword mvLibrary JacobiZeta arcsec expandoff limit remove writeto
+syn keyword mvLibrary KelvinBei arcsech expandon ln residue zip
+syn keyword mvLibrary KelvinBer arcsin extract lnGAMMA resultant ztrans
+syn keyword mvLibrary KelvinHei arcsinh
+
+
+" == PACKAGES ======================================================= {{{1
+" Note: highlighting of package functions is now user-selectable by package.
+
+" Package: DEtools differential equations tools {{{2
+if exists("mv_DEtools")
+ syn keyword mvPkg_DEtools DEnormal Dchangevar autonomous dfieldplot reduceOrder untranslate
+ syn keyword mvPkg_DEtools DEplot PDEchangecoords convertAlg indicialeq regularsp varparam
+ syn keyword mvPkg_DEtools DEplot3d PDEplot convertsys phaseportrait translate
+endif
+
+" Package: Domains: create domains of computation {{{2
+if exists("mv_Domains")
+endif
+
+" Package: GF: Galois Fields {{{2
+if exists("mv_GF")
+ syn keyword mvPkg_Galois galois
+endif
+
+" Package: GaussInt: Gaussian Integers {{{2
+if exists("mv_GaussInt")
+ syn keyword mvPkg_GaussInt GIbasis GIfactor GIissqr GInorm GIquadres GIsmith
+ syn keyword mvPkg_GaussInt GIchrem GIfactors GIlcm GInormal GIquo GIsqrfree
+ syn keyword mvPkg_GaussInt GIdivisor GIgcd GImcmbine GIorder GIrem GIsqrt
+ syn keyword mvPkg_GaussInt GIfacpoly GIgcdex GInearest GIphi GIroots GIunitnormal
+ syn keyword mvPkg_GaussInt GIfacset GIhermite GInodiv GIprime GIsieve
+endif
+
+" Package: LREtools: manipulate linear recurrence relations {{{2
+if exists("mv_LREtools")
+ syn keyword mvPkg_LREtools REcontent REprimpart REtodelta delta hypergeomsols ratpolysols
+ syn keyword mvPkg_LREtools REcreate REreduceorder REtoproc dispersion polysols shift
+ syn keyword mvPkg_LREtools REplot REtoDE constcoeffsol
+endif
+
+" Package: combinat: combinatorial functions {{{2
+if exists("mv_combinat")
+ syn keyword mvPkg_combinat Chi composition graycode numbcomb permute randperm
+ syn keyword mvPkg_combinat bell conjpart inttovec numbcomp powerset stirling1
+ syn keyword mvPkg_combinat binomial decodepart lastpart numbpart prevpart stirling2
+ syn keyword mvPkg_combinat cartprod encodepart multinomial numbperm randcomb subsets
+ syn keyword mvPkg_combinat character fibonacci nextpart partition randpart vectoint
+ syn keyword mvPkg_combinat choose firstpart
+endif
+
+" Package: combstruct: combinatorial structures {{{2
+if exists("mv_combstruct")
+ syn keyword mvPkg_combstruct allstructs draw iterstructs options specification structures
+ syn keyword mvPkg_combstruct count finished nextstruct
+endif
+
+" Package: difforms: differential forms {{{2
+if exists("mv_difforms")
+ syn keyword mvPkg_difforms const defform formpart parity scalarpart wdegree
+ syn keyword mvPkg_difforms d form mixpar scalar simpform wedge
+endif
+
+" Package: finance: financial mathematics {{{2
+if exists("mv_finance")
+ syn keyword mvPkg_finance amortization cashflows futurevalue growingperpetuity mv_finance presentvalue
+ syn keyword mvPkg_finance annuity effectiverate growingannuity levelcoupon perpetuity yieldtomaturity
+ syn keyword mvPkg_finance blackscholes
+endif
+
+" Package: genfunc: rational generating functions {{{2
+if exists("mv_genfunc")
+ syn keyword mvPkg_genfunc rgf_charseq rgf_expand rgf_hybrid rgf_pfrac rgf_sequence rgf_term
+ syn keyword mvPkg_genfunc rgf_encode rgf_findrecur rgf_norm rgf_relate rgf_simp termscale
+endif
+
+" Package: geometry: Euclidean geometry {{{2
+if exists("mv_geometry")
+ syn keyword mvPkg_geometry circle dsegment hyperbola parabola segment triangle
+ syn keyword mvPkg_geometry conic ellipse line point square
+endif
+
+" Package: grobner: Grobner bases {{{2
+if exists("mv_grobner")
+ syn keyword mvPkg_grobner finduni gbasis leadmon normalf solvable spoly
+ syn keyword mvPkg_grobner finite gsolve
+endif
+
+" Package: group: permutation and finitely-presented groups {{{2
+if exists("mv_group")
+ syn keyword mvPkg_group DerivedS areconjugate cosets grouporder issubgroup permrep
+ syn keyword mvPkg_group LCS center cosrep inter mulperms pres
+ syn keyword mvPkg_group NormalClosure centralizer derived invperm normalizer subgrel
+ syn keyword mvPkg_group RandElement convert grelgroup isabelian orbit type
+ syn keyword mvPkg_group Sylow core groupmember isnormal permgroup
+endif
+
+" Package: inttrans: integral transforms {{{2
+if exists("mv_inttrans")
+ syn keyword mvPkg_inttrans addtable fouriercos hankel invfourier invlaplace mellin
+ syn keyword mvPkg_inttrans fourier fouriersin hilbert invhilbert laplace
+endif
+
+" Package: liesymm: Lie symmetries {{{2
+if exists("mv_liesymm")
+ syn keyword mvPkg_liesymm &^ TD depvars getform mixpar vfix
+ syn keyword mvPkg_liesymm &mod annul determine hasclosure prolong wcollect
+ syn keyword mvPkg_liesymm Eta autosimp dvalue hook reduce wdegree
+ syn keyword mvPkg_liesymm Lie close extvars indepvars setup wedgeset
+ syn keyword mvPkg_liesymm Lrank d getcoeff makeforms translate wsubs
+endif
+
+" Package: linalg: Linear algebra {{{2
+if exists("mv_linalg")
+ syn keyword mvPkg_linalg GramSchmidt coldim equal indexfunc mulcol singval
+ syn keyword mvPkg_linalg JordanBlock colspace exponential innerprod multiply smith
+ syn keyword mvPkg_linalg LUdecomp colspan extend intbasis norm stack
+ syn keyword mvPkg_linalg QRdecomp companion ffgausselim inverse normalize submatrix
+ syn keyword mvPkg_linalg addcol cond fibonacci ismith orthog subvector
+ syn keyword mvPkg_linalg addrow copyinto forwardsub issimilar permanent sumbasis
+ syn keyword mvPkg_linalg adjoint crossprod frobenius iszero pivot swapcol
+ syn keyword mvPkg_linalg angle curl gausselim jacobian potential swaprow
+ syn keyword mvPkg_linalg augment definite gaussjord jordan randmatrix sylvester
+ syn keyword mvPkg_linalg backsub delcols geneqns kernel randvector toeplitz
+ syn keyword mvPkg_linalg band delrows genmatrix laplacian rank trace
+ syn keyword mvPkg_linalg basis det grad leastsqrs references transpose
+ syn keyword mvPkg_linalg bezout diag hadamard linsolve row vandermonde
+ syn keyword mvPkg_linalg blockmatrix diverge hermite matadd rowdim vecpotent
+ syn keyword mvPkg_linalg charmat dotprod hessian matrix rowspace vectdim
+ syn keyword mvPkg_linalg charpoly eigenval hilbert minor rowspan vector
+ syn keyword mvPkg_linalg cholesky eigenvect htranspose minpoly scalarmul wronskian
+ syn keyword mvPkg_linalg col entermatrix ihermite
+endif
+
+" Package: logic: Boolean logic {{{2
+if exists("mv_logic")
+ syn keyword mvPkg_logic MOD2 bsimp distrib environ randbool tautology
+ syn keyword mvPkg_logic bequal canon dual frominert satisfy toinert
+endif
+
+" Package: networks: graph networks {{{2
+if exists("mv_networks")
+ syn keyword mvPkg_networks acycpoly connect dinic graph mincut show
+ syn keyword mvPkg_networks addedge connectivity djspantree graphical mindegree shrink
+ syn keyword mvPkg_networks addvertex contract dodecahedron gsimp neighbors span
+ syn keyword mvPkg_networks adjacency countcuts draw gunion new spanpoly
+ syn keyword mvPkg_networks allpairs counttrees duplicate head octahedron spantree
+ syn keyword mvPkg_networks ancestor cube edges icosahedron outdegree tail
+ syn keyword mvPkg_networks arrivals cycle ends incidence path tetrahedron
+ syn keyword mvPkg_networks bicomponents cyclebase eweight incident petersen tuttepoly
+ syn keyword mvPkg_networks charpoly daughter flow indegree random vdegree
+ syn keyword mvPkg_networks chrompoly degreeseq flowpoly induce rank vertices
+ syn keyword mvPkg_networks complement delete fundcyc isplanar rankpoly void
+ syn keyword mvPkg_networks complete departures getlabel maxdegree shortpathtree vweight
+ syn keyword mvPkg_networks components diameter girth
+endif
+
+" Package: numapprox: numerical approximation {{{2
+if exists("mv_numapprox")
+ syn keyword mvPkg_numapprox chebdeg chebsort fnorm laurent minimax remez
+ syn keyword mvPkg_numapprox chebmult chebyshev hornerform laurent pade taylor
+ syn keyword mvPkg_numapprox chebpade confracform infnorm minimax
+endif
+
+" Package: numtheory: number theory {{{2
+if exists("mv_numtheory")
+ syn keyword mvPkg_numtheory B cyclotomic invcfrac mcombine nthconver primroot
+ syn keyword mvPkg_numtheory F divisors invphi mersenne nthdenom quadres
+ syn keyword mvPkg_numtheory GIgcd euler isolve minkowski nthnumer rootsunity
+ syn keyword mvPkg_numtheory J factorEQ isprime mipolys nthpow safeprime
+ syn keyword mvPkg_numtheory L factorset issqrfree mlog order sigma
+ syn keyword mvPkg_numtheory M fermat ithprime mobius pdexpand sq2factor
+ syn keyword mvPkg_numtheory bernoulli ifactor jacobi mroot phi sum2sqr
+ syn keyword mvPkg_numtheory bigomega ifactors kronecker msqrt pprimroot tau
+ syn keyword mvPkg_numtheory cfrac imagunit lambda nearestp prevprime thue
+ syn keyword mvPkg_numtheory cfracpol index legendre nextprime
+endif
+
+" Package: orthopoly: orthogonal polynomials {{{2
+if exists("mv_orthopoly")
+ syn keyword mvPkg_orthopoly G H L P T U
+endif
+
+" Package: padic: p-adic numbers {{{2
+if exists("mv_padic")
+ syn keyword mvPkg_padic evalp function orderp ratvaluep rootp valuep
+ syn keyword mvPkg_padic expansion lcoeffp ordp
+endif
+
+" Package: plots: graphics package {{{2
+if exists("mv_plots")
+ syn keyword mvPkg_plots animate coordplot3d gradplot3d listplot3d polarplot setoptions3d
+ syn keyword mvPkg_plots animate3d cylinderplot implicitplot loglogplot polygonplot spacecurve
+ syn keyword mvPkg_plots changecoords densityplot implicitplot3d logplot polygonplot3d sparsematrixplot
+ syn keyword mvPkg_plots complexplot display inequal matrixplot polyhedraplot sphereplot
+ syn keyword mvPkg_plots complexplot3d display3d listcontplot odeplot replot surfdata
+ syn keyword mvPkg_plots conformal fieldplot listcontplot3d pareto rootlocus textplot
+ syn keyword mvPkg_plots contourplot fieldplot3d listdensityplot pointplot semilogplot textplot3d
+ syn keyword mvPkg_plots contourplot3d gradplot listplot pointplot3d setoptions tubeplot
+ syn keyword mvPkg_plots coordplot
+endif
+
+" Package: plottools: basic graphical objects {{{2
+if exists("mv_plottools")
+ syn keyword mvPkg_plottools arc curve dodecahedron hyperbola pieslice semitorus
+ syn keyword mvPkg_plottools arrow cutin ellipse icosahedron point sphere
+ syn keyword mvPkg_plottools circle cutout ellipticArc line polygon tetrahedron
+ syn keyword mvPkg_plottools cone cylinder hemisphere octahedron rectangle torus
+ syn keyword mvPkg_plottools cuboid disk hexahedron
+endif
+
+" Package: powseries: formal power series {{{2
+if exists("mv_powseries")
+ syn keyword mvPkg_powseries compose multiply powcreate powlog powsolve reversion
+ syn keyword mvPkg_powseries evalpow negative powdiff powpoly powsqrt subtract
+ syn keyword mvPkg_powseries inverse powadd powexp powseries quotient tpsform
+ syn keyword mvPkg_powseries multconst powcos powint powsin
+endif
+
+" Package: process: (Unix)-multi-processing {{{2
+if exists("mv_process")
+ syn keyword mvPkg_process block fork pclose pipe popen wait
+ syn keyword mvPkg_process exec kill
+endif
+
+" Package: simplex: linear optimization {{{2
+if exists("mv_simplex")
+ syn keyword mvPkg_simplex NONNEGATIVE cterm dual maximize pivoteqn setup
+ syn keyword mvPkg_simplex basis define_zero equality minimize pivotvar standardize
+ syn keyword mvPkg_simplex convexhull display feasible pivot ratio
+endif
+
+" Package: stats: statistics {{{2
+if exists("mv_stats")
+ syn keyword mvPkg_stats anova describe fit random statevalf statplots
+endif
+
+" Package: student: student calculus {{{2
+if exists("mv_student")
+ syn keyword mvPkg_student D Product distance isolate middlesum rightsum
+ syn keyword mvPkg_student Diff Sum equate leftbox midpoint showtangent
+ syn keyword mvPkg_student Doubleint Tripleint extrema leftsum minimize simpson
+ syn keyword mvPkg_student Int changevar integrand makeproc minimize slope
+ syn keyword mvPkg_student Limit combine intercept maximize powsubs trapezoid
+ syn keyword mvPkg_student Lineint completesquare intparts middlebox rightbox value
+ syn keyword mvPkg_student Point
+endif
+
+" Package: sumtools: indefinite and definite sums {{{2
+if exists("mv_sumtools")
+ syn keyword mvPkg_sumtools Hypersum extended_gosper hyperrecursion hyperterm sumrecursion sumtohyper
+ syn keyword mvPkg_sumtools Sumtohyper gosper hypersum simpcomb
+endif
+
+" Package: tensor: tensor computations and General Relativity {{{2
+if exists("mv_tensor")
+ syn keyword mvPkg_tensor Christoffel1 Riemann connexF display_allGR get_compts partial_diff
+ syn keyword mvPkg_tensor Christoffel2 RiemannF contract dual get_rank permute_indices
+ syn keyword mvPkg_tensor Einstein Weyl convertNP entermetric invars petrov
+ syn keyword mvPkg_tensor Jacobian act cov_diff exterior_diff invert prod
+ syn keyword mvPkg_tensor Killing_eqns antisymmetrize create exterior_prod lin_com raise
+ syn keyword mvPkg_tensor Levi_Civita change_basis d1metric frame lower symmetrize
+ syn keyword mvPkg_tensor Lie_diff commutator d2metric geodesic_eqns npcurve tensorsGR
+ syn keyword mvPkg_tensor Ricci compare directional_diff get_char npspin transform
+ syn keyword mvPkg_tensor Ricciscalar conj displayGR
+endif
+
+" Package: totorder: total orders on names {{{2
+if exists("mv_totorder")
+ syn keyword mvPkg_totorder forget init ordering tassume tis
+endif
+" =====================================================================
+
+" Highlighting: Define the default highlighting. {{{1
+" Only when an item doesn't have highlighting yet
+if !exists("skip_maplev_syntax_inits")
+
+ " Maple->Maple Links {{{2
+ 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
+ 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
+let b:current_syntax = "maple"
+" vim: ts=20 fdm=marker
diff --git a/runtime/syntax/markdown.vim b/runtime/syntax/markdown.vim
new file mode 100644
index 0000000..44187ff
--- /dev/null
+++ b/runtime/syntax/markdown.vim
@@ -0,0 +1,200 @@
+" Vim syntax file
+" Language: Markdown
+" Maintainer: Tim Pope <https://github.com/tpope/vim-markdown>
+" Filenames: *.markdown
+" Last Change: 2022 Oct 13
+
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists('main_syntax')
+ let main_syntax = 'markdown'
+endif
+
+if has('folding')
+ let s:foldmethod = &l:foldmethod
+ let s:foldtext = &l:foldtext
+endif
+let s:iskeyword = &l:iskeyword
+
+runtime! syntax/html.vim
+unlet! b:current_syntax
+
+if !exists('g:markdown_fenced_languages')
+ let g:markdown_fenced_languages = []
+endif
+let s:done_include = {}
+for s:type in map(copy(g:markdown_fenced_languages),'matchstr(v:val,"[^=]*$")')
+ if has_key(s:done_include, matchstr(s:type,'[^.]*'))
+ continue
+ endif
+ if s:type =~ '\.'
+ let b:{matchstr(s:type,'[^.]*')}_subtype = matchstr(s:type,'\.\zs.*')
+ endif
+ syn case match
+ exe 'syn include @markdownHighlight_'.tr(s:type,'.','_').' syntax/'.matchstr(s:type,'[^.]*').'.vim'
+ unlet! b:current_syntax
+ let s:done_include[matchstr(s:type,'[^.]*')] = 1
+endfor
+unlet! s:type
+unlet! s:done_include
+
+syn spell toplevel
+if exists('s:foldmethod') && s:foldmethod !=# &l:foldmethod
+ let &l:foldmethod = s:foldmethod
+ unlet s:foldmethod
+endif
+if exists('s:foldtext') && s:foldtext !=# &l:foldtext
+ let &l:foldtext = s:foldtext
+ unlet s:foldtext
+endif
+if s:iskeyword !=# &l:iskeyword
+ let &l:iskeyword = s:iskeyword
+endif
+unlet s:iskeyword
+
+if !exists('g:markdown_minlines')
+ let g:markdown_minlines = 50
+endif
+execute 'syn sync minlines=' . g:markdown_minlines
+syn sync linebreaks=1
+syn case ignore
+
+syn match markdownValid '[<>]\c[a-z/$!]\@!' transparent contains=NONE
+syn match markdownValid '&\%(#\=\w*;\)\@!' transparent contains=NONE
+
+syn match markdownLineStart "^[<@]\@!" nextgroup=@markdownBlock,htmlSpecialChar
+
+syn cluster markdownBlock contains=markdownH1,markdownH2,markdownH3,markdownH4,markdownH5,markdownH6,markdownBlockquote,markdownListMarker,markdownOrderedListMarker,markdownCodeBlock,markdownRule
+syn cluster markdownInline contains=markdownLineBreak,markdownLinkText,markdownItalic,markdownBold,markdownCode,markdownEscape,@htmlTop,markdownError,markdownValid
+
+syn match markdownH1 "^.\+\n=\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
+syn match markdownH2 "^.\+\n-\+$" contained contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink
+
+syn match markdownHeadingRule "^[=-]\+$" contained
+
+syn region markdownH1 matchgroup=markdownH1Delimiter start=" \{,3}#\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
+syn region markdownH2 matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
+syn region markdownH3 matchgroup=markdownH3Delimiter start=" \{,3}###\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
+syn region markdownH4 matchgroup=markdownH4Delimiter start=" \{,3}####\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
+syn region markdownH5 matchgroup=markdownH5Delimiter start=" \{,3}#####\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
+syn region markdownH6 matchgroup=markdownH6Delimiter start=" \{,3}######\s" end="#*\s*$" keepend oneline contains=@markdownInline,markdownAutomaticLink contained
+
+syn match markdownBlockquote ">\%(\s\|$\)" contained nextgroup=@markdownBlock
+
+syn region markdownCodeBlock start="^\n\( \{4,}\|\t\)" end="^\ze \{,3}\S.*$" keepend
+
+" TODO: real nesting
+syn match markdownListMarker "\%(\t\| \{0,4\}\)[-*+]\%(\s\+\S\)\@=" contained
+syn match markdownOrderedListMarker "\%(\t\| \{0,4}\)\<\d\+\.\%(\s\+\S\)\@=" contained
+
+syn match markdownRule "\* *\* *\*[ *]*$" contained
+syn match markdownRule "- *- *-[ -]*$" contained
+
+syn match markdownLineBreak " \{2,\}$"
+
+syn region markdownIdDeclaration matchgroup=markdownLinkDelimiter start="^ \{0,3\}!\=\[" end="\]:" oneline keepend nextgroup=markdownUrl skipwhite
+syn match markdownUrl "\S\+" nextgroup=markdownUrlTitle skipwhite contained
+syn region markdownUrl matchgroup=markdownUrlDelimiter start="<" end=">" oneline keepend nextgroup=markdownUrlTitle skipwhite contained
+syn region markdownUrlTitle matchgroup=markdownUrlTitleDelimiter start=+"+ end=+"+ keepend contained
+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="\]\%( \=[[(]\)\@=" 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
+
+let s:concealends = ''
+if has('conceal') && get(g:, 'markdown_syntax_conceal', 1) == 1
+ let s:concealends = ' concealends'
+endif
+exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\*\S\@=" end="\S\@<=\*\|^$" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends
+exe 'syn region markdownItalic matchgroup=markdownItalicDelimiter start="\w\@<!_\S\@=" end="\S\@<=_\w\@!\|^$" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends
+exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\*\*\S\@=" end="\S\@<=\*\*\|^$" skip="\\\*" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends
+exe 'syn region markdownBold matchgroup=markdownBoldDelimiter start="\w\@<!__\S\@=" end="\S\@<=__\w\@!\|^$" skip="\\_" contains=markdownLineStart,markdownItalic,@Spell' . s:concealends
+exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\*\*\*\S\@=" end="\S\@<=\*\*\*\|^$" skip="\\\*" contains=markdownLineStart,@Spell' . s:concealends
+exe 'syn region markdownBoldItalic matchgroup=markdownBoldItalicDelimiter start="\w\@<!___\S\@=" end="\S\@<=___\w\@!\|^$" skip="\\_" contains=markdownLineStart,@Spell' . s:concealends
+exe 'syn region markdownStrike matchgroup=markdownStrikeDelimiter start="\~\~\S\@=" end="\S\@<=\~\~\|^$" contains=markdownLineStart,@Spell' . s:concealends
+
+syn region markdownCode matchgroup=markdownCodeDelimiter start="`" end="`" keepend contains=markdownLineStart
+syn region markdownCode matchgroup=markdownCodeDelimiter start="`` \=" end=" \=``" keepend contains=markdownLineStart
+syn region markdownCodeBlock matchgroup=markdownCodeDelimiter start="^\s*\z(`\{3,\}\).*$" end="^\s*\z1\ze\s*$" keepend
+syn region markdownCodeBlock matchgroup=markdownCodeDelimiter start="^\s*\z(\~\{3,\}\).*$" end="^\s*\z1\ze\s*$" keepend
+
+syn match markdownFootnote "\[^[^\]]\+\]"
+syn match markdownFootnoteDefinition "^\[^[^\]]\+\]:"
+
+let s:done_include = {}
+for s:type in g:markdown_fenced_languages
+ if has_key(s:done_include, matchstr(s:type,'[^.]*'))
+ continue
+ endif
+ exe 'syn region markdownHighlight_'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*\z(`\{3,\}\)\s*\%({.\{-}\.\)\='.matchstr(s:type,'[^=]*').'}\=\S\@!.*$" end="^\s*\z1\ze\s*$" keepend contains=@markdownHighlight_'.tr(matchstr(s:type,'[^=]*$'),'.','_') . s:concealends
+ exe 'syn region markdownHighlight_'.substitute(matchstr(s:type,'[^=]*$'),'\..*','','').' matchgroup=markdownCodeDelimiter start="^\s*\z(\~\{3,\}\)\s*\%({.\{-}\.\)\='.matchstr(s:type,'[^=]*').'}\=\S\@!.*$" end="^\s*\z1\ze\s*$" keepend contains=@markdownHighlight_'.tr(matchstr(s:type,'[^=]*$'),'.','_') . s:concealends
+ let s:done_include[matchstr(s:type,'[^.]*')] = 1
+endfor
+unlet! s:type
+unlet! s:done_include
+
+if get(b:, 'markdown_yaml_head', get(g:, 'markdown_yaml_head', main_syntax ==# 'markdown'))
+ syn include @markdownYamlTop syntax/yaml.vim
+ unlet! b:current_syntax
+ syn region markdownYamlHead start="\%^---$" end="^\%(---\|\.\.\.\)\s*$" keepend contains=@markdownYamlTop,@Spell
+endif
+
+syn match markdownEscape "\\[][\\`*_{}()<>#+.!-]"
+syn match markdownError "\w\@<=_\w\@="
+
+hi def link markdownH1 htmlH1
+hi def link markdownH2 htmlH2
+hi def link markdownH3 htmlH3
+hi def link markdownH4 htmlH4
+hi def link markdownH5 htmlH5
+hi def link markdownH6 htmlH6
+hi def link markdownHeadingRule markdownRule
+hi def link markdownH1Delimiter markdownHeadingDelimiter
+hi def link markdownH2Delimiter markdownHeadingDelimiter
+hi def link markdownH3Delimiter markdownHeadingDelimiter
+hi def link markdownH4Delimiter markdownHeadingDelimiter
+hi def link markdownH5Delimiter markdownHeadingDelimiter
+hi def link markdownH6Delimiter markdownHeadingDelimiter
+hi def link markdownHeadingDelimiter Delimiter
+hi def link markdownOrderedListMarker markdownListMarker
+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
+hi def link markdownAutomaticLink markdownUrl
+hi def link markdownUrl Float
+hi def link markdownUrlTitle String
+hi def link markdownIdDelimiter markdownLinkDelimiter
+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 markdownStrike htmlStrike
+hi def link markdownStrikeDelimiter markdownStrike
+hi def link markdownCodeDelimiter Delimiter
+
+hi def link markdownEscape Special
+hi def link markdownError Error
+
+let b:current_syntax = "markdown"
+if main_syntax ==# 'markdown'
+ unlet main_syntax
+endif
+
+" vim:set sw=2:
diff --git a/runtime/syntax/masm.vim b/runtime/syntax/masm.vim
new file mode 100644
index 0000000..3be0fd4
--- /dev/null
+++ b/runtime/syntax/masm.vim
@@ -0,0 +1,377 @@
+" Vim syntax file
+" Language: Microsoft Macro Assembler (80x86)
+" Orig Author: Rob Brady <robb@datatone.com>
+" Maintainer: Wu Yongwei <wuyongwei@gmail.com>
+" Last Change: 2022-04-24 20:07:04 +0800
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn iskeyword @,48-57,_,36,60,62,63,@-@
+
+syn case ignore
+
+
+syn match masmIdentifier "[@a-z_$?][@a-z0-9_$?<>]*"
+syn match masmLabel "^\s*[@a-z_$?][@a-z0-9_$?]*:"he=e-1
+
+syn match masmDecimal "[-+]\?\d\+[dt]\?"
+syn match masmBinary "[-+]\?[0-1]\+[by]" "put this before hex or 0bfh dies!
+syn match masmOctal "[-+]\?[0-7]\+[oq]"
+syn match masmHexadecimal "[-+]\?[0-9]\x*h"
+syn match masmFloatRaw "[-+]\?[0-9]\x*r"
+syn match masmFloat "[-+]\?\d\+\.\(\d*\(E[-+]\?\d\+\)\?\)\?"
+
+syn match masmComment ";.*" contains=@Spell
+syn region masmComment start=+COMMENT\s*\z(\S\)+ end=+\z1.*+ contains=@Spell
+syn region masmString start=+'+ end=+'+ oneline contains=@Spell
+syn region masmString start=+"+ end=+"+ oneline contains=@Spell
+
+syn region masmTitleArea start=+\<TITLE\s+lc=5 start=+\<SUBTITLE\s+lc=8 start=+\<SUBTTL\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmTitle
+syn region masmTextArea start=+\<NAME\s+lc=4 start=+\<INCLUDE\s+lc=7 start=+\<INCLUDELIB\s+lc=10 end=+$+ end=+;+me=e-1 contains=masmText
+syn match masmTitle "[^\t ;]\([^;]*[^\t ;]\)\?" contained contains=@Spell
+syn match masmText "[^\t ;]\([^;]*[^\t ;]\)\?" contained
+
+syn region masmOptionOpt start=+\<OPTION\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmOption
+syn region masmContextOpt start=+\<PUSHCONTEXT\s+lc=11 start=+\<POPCONTEXT\s+lc=10 end=+$+ end=+;+me=e-1 contains=masmOption
+syn region masmModelOpt start=+\.MODEL\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmOption,masmType
+syn region masmSegmentOpt start=+\<SEGMENT\s+lc=7 end=+$+ end=+;+me=e-1 contains=masmOption,masmString
+syn region masmProcOpt start=+\<PROC\s+lc=4 end=+$+ end=+;+me=e-1 contains=masmOption,masmType,masmRegister,masmIdentifier
+syn region masmAssumeOpt start=+\<ASSUME\s+lc=6 end=+$+ end=+;+me=e-1 contains=masmOption,masmOperator,masmType,masmRegister,masmIdentifier
+syn region masmExpression start=+\.IF\s+lc=3 start=+\.WHILE\s+lc=6 start=+\.UNTIL\s+lc=6 start=+\<IF\s+lc=2 start=+\<IF2\s+lc=3 start=+\<ELSEIF\s+lc=6 start=+\<ELSEIF2\s+lc=7 start=+\<REPEAT\s+lc=6 start=+\<WHILE\s+lc=5 end=+$+ end=+;+me=e-1 contains=masmType,masmOperator,masmRegister,masmIdentifier,masmDecimal,masmBinary,masmHexadecimal,masmFloatRaw,masmString
+
+syn keyword masmOption TINY SMALL COMPACT MEDIUM LARGE HUGE contained
+syn keyword masmOption NEARSTACK FARSTACK contained
+syn keyword masmOption PUBLIC PRIVATE STACK COMMON MEMORY AT contained
+syn keyword masmOption BYTE WORD DWORD PARA PAGE contained
+syn keyword masmOption USE16 USE32 FLAT contained
+syn keyword masmOption INFO READ WRITE EXECUTE SHARED contained
+syn keyword masmOption NOPAGE NOCACHE DISCARD contained
+syn keyword masmOption READONLY USES FRAME contained
+syn keyword masmOption CASEMAP DOTNAME NODOTNAME EMULATOR contained
+syn keyword masmOption NOEMULATOR EPILOGUE EXPR16 EXPR32 contained
+syn keyword masmOption LANGUAGE LJMP NOLJMP M510 NOM510 contained
+syn keyword masmOption NOKEYWORD NOSIGNEXTEND OFFSET contained
+syn keyword masmOption OLDMACROS NOOLDMACROS OLDSTRUCTS contained
+syn keyword masmOption NOOLDSTRUCTS PROC PROLOGUE READONLY contained
+syn keyword masmOption NOREADONLY SCOPED NOSCOPED SEGMENT contained
+syn keyword masmOption SETIF2 contained
+syn keyword masmOption ABS ALL ASSUMES CPU ERROR EXPORT contained
+syn keyword masmOption FORCEFRAME LISTING LOADDS NONE contained
+syn keyword masmOption NONUNIQUE NOTHING OS_DOS RADIX REQ contained
+syn keyword masmType STDCALL SYSCALL C BASIC FORTRAN PASCAL
+syn keyword masmType PTR NEAR FAR NEAR16 FAR16 NEAR32 FAR32
+syn keyword masmType REAL4 REAL8 REAL10 BYTE SBYTE TBYTE
+syn keyword masmType WORD DWORD QWORD FWORD SWORD SDWORD
+syn keyword masmType SQWORD OWORD MMWORD XMMWORD YMMWORD
+syn keyword masmOperator AND NOT OR SHL SHR XOR MOD DUP
+syn keyword masmOperator EQ GE GT LE LT NE
+syn keyword masmOperator LROFFSET SEG LENGTH LENGTHOF SIZE SIZEOF
+syn keyword masmOperator CODEPTR DATAPTR FAR NEAR SHORT THIS TYPE
+syn keyword masmOperator HIGH HIGHWORD LOW LOWWORD OPATTR MASK WIDTH
+syn match masmOperator "OFFSET\(\sFLAT:\)\?"
+syn match masmOperator ".TYPE\>"
+syn match masmOperator "CARRY?"
+syn match masmOperator "OVERFLOW?"
+syn match masmOperator "PARITY?"
+syn match masmOperator "SIGN?"
+syn match masmOperator "ZERO?"
+syn keyword masmDirective ALIAS ASSUME CATSTR COMM DB DD DF DOSSEG DQ DT
+syn keyword masmDirective DW ECHO ELSE ELSEIF ELSEIF1 ELSEIF2 ELSEIFB
+syn keyword masmDirective ELSEIFDEF ELSEIFDIF ELSEIFDIFI ELSEIFE
+syn keyword masmDirective ELSEIFIDN ELSEIFIDNI ELSEIFNB ELSEIFNDEF END
+syn keyword masmDirective ENDIF ENDM ENDP ENDS EQU EVEN EXITM EXTERN
+syn keyword masmDirective EXTERNDEF EXTRN FOR FORC GOTO GROUP IF IF1 IF2
+syn keyword masmDirective IFB IFDEF IFDIF IFDIFI IFE IFIDN IFIDNI IFNB
+syn keyword masmDirective IFNDEF INCLUDE INCLUDELIB INSTR INVOKE IRP
+syn keyword masmDirective IRPC LABEL LOCAL MACRO NAME OPTION ORG PAGE
+syn keyword masmDirective POPCONTEXT PROC PROTO PUBLIC PURGE PUSHCONTEXT
+syn keyword masmDirective RECORD REPEAT REPT SEGMENT SIZESTR STRUC
+syn keyword masmDirective STRUCT SUBSTR SUBTITLE SUBTTL TEXTEQU TITLE
+syn keyword masmDirective TYPEDEF UNION WHILE
+syn match masmDirective "\.8086\>"
+syn match masmDirective "\.8087\>"
+syn match masmDirective "\.NO87\>"
+syn match masmDirective "\.186\>"
+syn match masmDirective "\.286\>"
+syn match masmDirective "\.286C\>"
+syn match masmDirective "\.286P\>"
+syn match masmDirective "\.287\>"
+syn match masmDirective "\.386\>"
+syn match masmDirective "\.386C\>"
+syn match masmDirective "\.386P\>"
+syn match masmDirective "\.387\>"
+syn match masmDirective "\.486\>"
+syn match masmDirective "\.486P\>"
+syn match masmDirective "\.586\>"
+syn match masmDirective "\.586P\>"
+syn match masmDirective "\.686\>"
+syn match masmDirective "\.686P\>"
+syn match masmDirective "\.K3D\>"
+syn match masmDirective "\.MMX\>"
+syn match masmDirective "\.XMM\>"
+syn match masmDirective "\.ALPHA\>"
+syn match masmDirective "\.DOSSEG\>"
+syn match masmDirective "\.SEQ\>"
+syn match masmDirective "\.CODE\>"
+syn match masmDirective "\.CONST\>"
+syn match masmDirective "\.DATA\>"
+syn match masmDirective "\.DATA?"
+syn match masmDirective "\.EXIT\>"
+syn match masmDirective "\.FARDATA\>"
+syn match masmDirective "\.FARDATA?"
+syn match masmDirective "\.MODEL\>"
+syn match masmDirective "\.STACK\>"
+syn match masmDirective "\.STARTUP\>"
+syn match masmDirective "\.IF\>"
+syn match masmDirective "\.ELSE\>"
+syn match masmDirective "\.ELSEIF\>"
+syn match masmDirective "\.ENDIF\>"
+syn match masmDirective "\.REPEAT\>"
+syn match masmDirective "\.UNTIL\>"
+syn match masmDirective "\.UNTILCXZ\>"
+syn match masmDirective "\.WHILE\>"
+syn match masmDirective "\.ENDW\>"
+syn match masmDirective "\.BREAK\>"
+syn match masmDirective "\.CONTINUE\>"
+syn match masmDirective "\.ERR\>"
+syn match masmDirective "\.ERR1\>"
+syn match masmDirective "\.ERR2\>"
+syn match masmDirective "\.ERRB\>"
+syn match masmDirective "\.ERRDEF\>"
+syn match masmDirective "\.ERRDIF\>"
+syn match masmDirective "\.ERRDIFI\>"
+syn match masmDirective "\.ERRE\>"
+syn match masmDirective "\.ERRIDN\>"
+syn match masmDirective "\.ERRIDNI\>"
+syn match masmDirective "\.ERRNB\>"
+syn match masmDirective "\.ERRNDEF\>"
+syn match masmDirective "\.ERRNZ\>"
+syn match masmDirective "\.LALL\>"
+syn match masmDirective "\.SALL\>"
+syn match masmDirective "\.XALL\>"
+syn match masmDirective "\.LFCOND\>"
+syn match masmDirective "\.SFCOND\>"
+syn match masmDirective "\.TFCOND\>"
+syn match masmDirective "\.CREF\>"
+syn match masmDirective "\.NOCREF\>"
+syn match masmDirective "\.XCREF\>"
+syn match masmDirective "\.LIST\>"
+syn match masmDirective "\.NOLIST\>"
+syn match masmDirective "\.XLIST\>"
+syn match masmDirective "\.LISTALL\>"
+syn match masmDirective "\.LISTIF\>"
+syn match masmDirective "\.NOLISTIF\>"
+syn match masmDirective "\.LISTMACRO\>"
+syn match masmDirective "\.NOLISTMACRO\>"
+syn match masmDirective "\.LISTMACROALL\>"
+syn match masmDirective "\.FPO\>"
+syn match masmDirective "\.RADIX\>"
+syn match masmDirective "\.SAFESEH\>"
+syn match masmDirective "%OUT\>"
+syn match masmDirective "ALIGN\>"
+syn match masmOption "ALIGN([0-9]\+)"
+
+syn keyword masmRegister AX BX CX DX SI DI BP SP
+syn keyword masmRegister CS DS SS ES FS GS
+syn keyword masmRegister AH BH CH DH AL BL CL DL
+syn keyword masmRegister EAX EBX ECX EDX ESI EDI EBP ESP
+syn keyword masmRegister CR0 CR2 CR3 CR4
+syn keyword masmRegister DR0 DR1 DR2 DR3 DR6 DR7
+syn keyword masmRegister TR3 TR4 TR5 TR6 TR7
+syn match masmRegister "ST([0-7])"
+
+" x86-64 registers
+syn keyword masmRegister RAX RBX RCX RDX RSI RDI RBP RSP
+syn keyword masmRegister R8 R9 R10 R11 R12 R13 R14 R15
+syn keyword masmRegister R8D R9D R10D R11D R12D R13D R14D R15D
+syn keyword masmRegister R8W R9W R10W R11W R12W R13W R14W R15W
+syn keyword masmRegister R8B R9B R10B R11B R12B R13B R14B R15B
+
+" SSE/AVX registers
+syn match masmRegister "\(X\|Y\)MM[0-9]\>"
+syn match masmRegister "\(X\|Y\)MM1[0-5]\>"
+
+" Instruction prefixes
+syn keyword masmOpcode LOCK REP REPE REPNE REPNZ REPZ
+
+" 8086/8088 opcodes
+syn keyword masmOpcode AAA AAD AAM AAS ADC ADD AND CALL CBW CLC CLD
+syn keyword masmOpcode CLI CMC CMP CMPS CMPSB CMPSW CWD DAA DAS DEC
+syn keyword masmOpcode DIV ESC HLT IDIV IMUL IN INC INT INTO IRET
+syn keyword masmOpcode JCXZ JMP LAHF LDS LEA LES LODS LODSB LODSW
+syn keyword masmOpcode LOOP LOOPE LOOPEW LOOPNE LOOPNEW LOOPNZ
+syn keyword masmOpcode LOOPNZW LOOPW LOOPZ LOOPZW MOV MOVS MOVSB
+syn keyword masmOpcode MOVSW MUL NEG NOP NOT OR OUT POP POPF PUSH
+syn keyword masmOpcode PUSHF RCL RCR RET RETF RETN ROL ROR SAHF SAL
+syn keyword masmOpcode SAR SBB SCAS SCASB SCASW SHL SHR STC STD STI
+syn keyword masmOpcode STOS STOSB STOSW SUB TEST WAIT XCHG XLAT XLATB
+syn keyword masmOpcode XOR
+syn match masmOpcode "J\(P[EO]\|\(N\?\([ABGL]E\?\|[CEOPSZ]\)\)\)\>"
+
+" 80186 opcodes
+syn keyword masmOpcode BOUND ENTER INS INSB INSW LEAVE OUTS OUTSB
+syn keyword masmOpcode OUTSW POPA PUSHA PUSHW
+
+" 80286 opcodes
+syn keyword masmOpcode ARPL LAR LSL SGDT SIDT SLDT SMSW STR VERR VERW
+
+" 80286/80386 privileged opcodes
+syn keyword masmOpcode CLTS LGDT LIDT LLDT LMSW LTR
+
+" 80386 opcodes
+syn keyword masmOpcode BSF BSR BT BTC BTR BTS CDQ CMPSD CWDE INSD
+syn keyword masmOpcode IRETD IRETDF IRETF JECXZ LFS LGS LODSD LOOPD
+syn keyword masmOpcode LOOPED LOOPNED LOOPNZD LOOPZD LSS MOVSD MOVSX
+syn keyword masmOpcode MOVZX OUTSD POPAD POPFD PUSHAD PUSHD PUSHFD
+syn keyword masmOpcode SCASD SHLD SHRD STOSD
+syn match masmOpcode "SET\(P[EO]\|\(N\?\([ABGL]E\?\|[CEOPSZ]\)\)\)\>"
+
+" 80486 opcodes
+syn keyword masmOpcode BSWAP CMPXCHG INVD INVLPG WBINVD XADD
+
+" Floating-point opcodes as of 487
+syn keyword masmOpFloat F2XM1 FABS FADD FADDP FBLD FBSTP FCHS FCLEX
+syn keyword masmOpFloat FNCLEX FCOM FCOMP FCOMPP FCOS FDECSTP FDISI
+syn keyword masmOpFloat FNDISI FDIV FDIVP FDIVR FDIVRP FENI FNENI
+syn keyword masmOpFloat FFREE FIADD FICOM FICOMP FIDIV FIDIVR FILD
+syn keyword masmOpFloat FIMUL FINCSTP FINIT FNINIT FIST FISTP FISUB
+syn keyword masmOpFloat FISUBR FLD FLDCW FLDENV FLDLG2 FLDLN2 FLDL2E
+syn keyword masmOpFloat FLDL2T FLDPI FLDZ FLD1 FMUL FMULP FNOP FPATAN
+syn keyword masmOpFloat FPREM FPREM1 FPTAN FRNDINT FRSTOR FSAVE FNSAVE
+syn keyword masmOpFloat FSCALE FSETPM FSIN FSINCOS FSQRT FST FSTCW
+syn keyword masmOpFloat FNSTCW FSTENV FNSTENV FSTP FSTSW FNSTSW FSUB
+syn keyword masmOpFloat FSUBP FSUBR FSUBRP FTST FUCOM FUCOMP FUCOMPP
+syn keyword masmOpFloat FWAIT FXAM FXCH FXTRACT FYL2X FYL2XP1
+
+" Floating-point opcodes in Pentium and later processors
+syn keyword masmOpFloat FCMOVE FCMOVNE FCMOVB FCMOVBE FCMOVNB FCMOVNBE
+syn keyword masmOpFloat FCMOVU FCMOVNU FCOMI FUCOMI FCOMIP FUCOMIP
+syn keyword masmOpFloat FXSAVE FXRSTOR
+
+" MMX opcodes (Pentium w/ MMX, Pentium II, and later)
+syn keyword masmOpcode MOVD MOVQ PACKSSWB PACKSSDW PACKUSWB
+syn keyword masmOpcode PUNPCKHBW PUNPCKHWD PUNPCKHDQ
+syn keyword masmOpcode PUNPCKLBW PUNPCKLWD PUNPCKLDQ
+syn keyword masmOpcode PADDB PADDW PADDD PADDSB PADDSW PADDUSB PADDUSW
+syn keyword masmOpcode PSUBB PSUBW PSUBD PSUBSB PSUBSW PSUBUSB PSUBUSW
+syn keyword masmOpcode PMULHW PMULLW PMADDWD
+syn keyword masmOpcode PCMPEQB PCMPEQW PCMPEQD PCMPGTB PCMPGTW PCMPGTD
+syn keyword masmOpcode PAND PANDN POR PXOR
+syn keyword masmOpcode PSLLW PSLLD PSLLQ PSRLW PSRLD PSRLQ PSRAW PSRAD
+syn keyword masmOpcode EMMS
+
+" SSE opcodes (Pentium III and later)
+syn keyword masmOpcode MOVAPS MOVUPS MOVHPS MOVHLPS MOVLPS MOVLHPS
+syn keyword masmOpcode MOVMSKPS MOVSS
+syn keyword masmOpcode ADDPS ADDSS SUBPS SUBSS MULPS MULSS DIVPS DIVSS
+syn keyword masmOpcode RCPPS RCPSS SQRTPS SQRTSS RSQRTPS RSQRTSS
+syn keyword masmOpcode MAXPS MAXSS MINPS MINSS
+syn keyword masmOpcode CMPPS CMPSS COMISS UCOMISS
+syn keyword masmOpcode ANDPS ANDNPS ORPS XORPS
+syn keyword masmOpcode SHUFPS UNPCKHPS UNPCKLPS
+syn keyword masmOpcode CVTPI2PS CVTSI2SS CVTPS2PI CVTTPS2PI
+syn keyword masmOpcode CVTSS2SI CVTTSS2SI
+syn keyword masmOpcode LDMXCSR STMXCSR
+syn keyword masmOpcode PAVGB PAVGW PEXTRW PINSRW PMAXUB PMAXSW
+syn keyword masmOpcode PMINUB PMINSW PMOVMSKB PMULHUW PSADBW PSHUFW
+syn keyword masmOpcode MASKMOVQ MOVNTQ MOVNTPS SFENCE
+syn keyword masmOpcode PREFETCHT0 PREFETCHT1 PREFETCHT2 PREFETCHNTA
+
+" SSE2 opcodes (Pentium 4 and later)
+syn keyword masmOpcode MOVAPD MOVUPD MOVHPD MOVLPD MOVMSKPD MOVSD
+syn keyword masmOpcode ADDPD ADDSD SUBPD SUBSD MULPD MULSD DIVPD DIVSD
+syn keyword masmOpcode SQRTPD SQRTSD MAXPD MAXSD MINPD MINSD
+syn keyword masmOpcode ANDPD ANDNPD ORPD XORPD
+syn keyword masmOpcode CMPPD CMPSD COMISD UCOMISD
+syn keyword masmOpcode SHUFPD UNPCKHPD UNPCKLPD
+syn keyword masmOpcode CVTPD2PI CVTTPD2PI CVTPI2PD CVTPD2DQ
+syn keyword masmOpcode CVTTPD2DQ CVTDQ2PD CVTPS2PD CVTPD2PS
+syn keyword masmOpcode CVTSS2SD CVTSD2SS CVTSD2SI CVTTSD2SI CVTSI2SD
+syn keyword masmOpcode CVTDQ2PS CVTPS2DQ CVTTPS2DQ
+syn keyword masmOpcode MOVDQA MOVDQU MOVQ2DQ MOVDQ2Q PMULUDQ
+syn keyword masmOpcode PADDQ PSUBQ PSHUFLW PSHUFHW PSHUFD
+syn keyword masmOpcode PSLLDQ PSRLDQ PUNPCKHQDQ PUNPCKLQDQ
+syn keyword masmOpcode CLFLUSH LFENCE MFENCE PAUSE MASKMOVDQU
+syn keyword masmOpcode MOVNTPD MOVNTDQ MOVNTI
+
+" SSE3 opcodes (Pentium 4 w/ Hyper-Threading and later)
+syn keyword masmOpcode FISTTP LDDQU ADDSUBPS ADDSUBPD
+syn keyword masmOpcode HADDPS HSUBPS HADDPD HSUBPD
+syn keyword masmOpcode MOVSHDUP MOVSLDUP MOVDDUP MONITOR MWAIT
+
+" SSSE3 opcodes (Core and later)
+syn keyword masmOpcode PSIGNB PSIGNW PSIGND PABSB PABSW PABSD
+syn keyword masmOpcode PALIGNR PSHUFB PMULHRSW PMADDUBSW
+syn keyword masmOpcode PHSUBW PHSUBD PHSUBSW PHADDW PHADDD PHADDSW
+
+" SSE 4.1 opcodes (Penryn and later)
+syn keyword masmOpcode MPSADBW PHMINPOSUW PMULDQ PMULLD DPPS DPPD
+syn keyword masmOpcode BLENDPS BLENDPD BLENDVPS BLENDVPD
+syn keyword masmOpcode PBLENDVB PBLENDW
+syn keyword masmOpcode PMINSB PMAXSB PMINSD PMAXSD
+syn keyword masmOpcode PMINUW PMAXUW PMINUD PMAXUD
+syn keyword masmOpcode ROUNDPS ROUNDSS ROUNDPD ROUNDSD
+syn keyword masmOpcode INSERTPS PINSRB PINSRD PINSRQ
+syn keyword masmOpcode EXTRACTPS PEXTRB PEXTRD PEXTRQ
+syn keyword masmOpcode PMOVSXBW PMOVZXBW PMOVSXBD PMOVZXBD
+syn keyword masmOpcode PMOVSXBQ PMOVZXBQ PMOVSXWD PMOVZXWD
+syn keyword masmOpcode PMOVSXWQ PMOVZXWQ PMOVSXDQ PMOVZXDQ
+syn keyword masmOpcode PTEST PCMPEQQ PACKUSDW MOVNTDQA
+
+" SSE 4.2 opcodes (Nehalem and later)
+syn keyword masmOpcode PCMPESTRI PCMPESTRM PCMPISTRI PCMPISTRM PCMPGTQ
+syn keyword masmOpcode CRC32 POPCNT LZCNT
+
+" AES-NI (Westmere (2010) and later)
+syn keyword masmOpcode AESENC AESENCLAST AESDEC AESDECLAST
+syn keyword masmOpcode AESKEYGENASSIST AESIMC PCLMULQDQ
+
+" AVX (Sandy Bridge (2011) and later)
+syn keyword masmOpcode VBROADCASTSS VBROADCASTSD VBROADCASTF128
+syn keyword masmOpcode VINSERTF128 VEXTRACTF128 VMASKMOVPS VMASKMOVPD
+syn keyword masmOpcode VPERMILPS VPERMILPD VPERM2F128
+syn keyword masmOpcode VZEROALL VZEROUPPER
+
+" Other opcodes in Pentium and later processors
+syn keyword masmOpcode CMPXCHG8B CPUID UD2
+syn keyword masmOpcode RSM RDMSR WRMSR RDPMC RDTSC SYSENTER SYSEXIT
+syn match masmOpcode "CMOV\(P[EO]\|\(N\?\([ABGL]E\?\|[CEOPSZ]\)\)\)\>"
+
+
+" The default highlighting
+hi def link masmLabel PreProc
+hi def link masmComment Comment
+hi def link masmDirective Statement
+hi def link masmType Type
+hi def link masmOperator Type
+hi def link masmOption Special
+hi def link masmRegister Special
+hi def link masmString String
+hi def link masmText String
+hi def link masmTitle Title
+hi def link masmOpcode Statement
+hi def link masmOpFloat Statement
+
+hi def link masmHexadecimal Number
+hi def link masmDecimal Number
+hi def link masmOctal Number
+hi def link masmBinary Number
+hi def link masmFloatRaw Number
+hi def link masmFloat Number
+
+hi def link masmIdentifier Identifier
+
+syntax sync minlines=50
+
+let b:current_syntax = "masm"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/mason.vim b/runtime/syntax/mason.vim
new file mode 100644
index 0000000..e1638ec
--- /dev/null
+++ b/runtime/syntax/mason.vim
@@ -0,0 +1,85 @@
+" Vim syntax file
+" Language: Mason (Perl embedded in HTML)
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2021 Oct 10
+" Contributors: Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
+" Andrew Smith <andrewdsmith@yahoo.com>
+"
+" TODO:
+" - Fix <%text> blocks to show HTML tags but ignore Mason tags.
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" The HTML syntax file included below uses this variable.
+"
+if !exists("main_syntax")
+ let main_syntax = 'mason'
+endif
+
+" First pull in the HTML syntax.
+"
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+syn cluster htmlPreproc add=@masonTop
+
+" Now pull in the Perl syntax.
+"
+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 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=masonPod,@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\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=masonPod,@perlTop
+syn region masonAttr matchgroup=Delimiter start="<%attr>" end="</%attr>" contains=masonPod,@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>"
+
+syn cluster masonTop contains=masonLine,masonExpr,masonPerl,masonComp,masonArgs,masonInit,masonCleanup,masonOnce,masonShared,masonDef,masonMethod,masonFlags,masonAttr,masonFilter,masonDoc,masonText
+
+" Set up default highlighting. Almost all of this is done in the included
+" syntax files.
+hi def link masonDoc Comment
+hi def link masonPod Comment
+hi def link podOrdinary masonPod
+hi def link masonPerlComment perlComment
+
+let b:current_syntax = "mason"
+
+if main_syntax == 'mason'
+ unlet main_syntax
+endif
diff --git a/runtime/syntax/master.vim b/runtime/syntax/master.vim
new file mode 100644
index 0000000..f89c5b2
--- /dev/null
+++ b/runtime/syntax/master.vim
@@ -0,0 +1,37 @@
+" Vim syntax file
+" Language: Focus Master File
+" Maintainer: Rob Brady <robb@datatone.com>
+" Last Change: $Date: 2004/06/13 15:54:03 $
+" URL: http://www.datatone.com/~robb/vim/syntax/master.vim
+" $Revision: 1.1 $
+
+" this is a very simple syntax file - I will be improving it
+" add entire DEFINE syntax
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" A bunch of useful keywords
+syn keyword masterKeyword FILENAME SUFFIX SEGNAME SEGTYPE PARENT FIELDNAME
+syn keyword masterKeyword FIELD ALIAS USAGE INDEX MISSING ON
+syn keyword masterKeyword FORMAT CRFILE CRKEY
+syn keyword masterDefine DEFINE DECODE EDIT
+syn region masterString start=+"+ end=+"+
+syn region masterString start=+'+ end=+'+
+syn match masterComment "\$.*"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/matlab.vim b/runtime/syntax/matlab.vim
new file mode 100644
index 0000000..5202809
--- /dev/null
+++ b/runtime/syntax/matlab.vim
@@ -0,0 +1,119 @@
+" Vim syntax file
+" Language: Matlab
+" 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: June 10 2019
+" added highlight rule for double-quoted string literals
+" Change History:
+" - double-quoted string literals added
+" - now highlights cell-mode separator comments
+" - 'global' and 'persistent' keyword are now recognized
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword matlabStatement return
+syn keyword matlabLabel case switch
+syn keyword matlabConditional else elseif end if otherwise
+syn keyword matlabRepeat do for while
+" MT_ADDON - added exception-specific keywords
+syn keyword matlabExceptions try catch
+syn keyword matlabOO classdef properties events methods
+
+syn keyword matlabTodo contained TODO
+syn keyword matlabScope global persistent
+
+" If you do not want these operators lit, uncommment them and the "hi link" below
+syn match matlabArithmeticOperator "[-+]"
+syn match matlabArithmeticOperator "\.\=[*/\\^]"
+syn match matlabRelationalOperator "[=~]="
+syn match matlabRelationalOperator "[<>]=\="
+syn match matlabLogicalOperator "[&|~]"
+
+syn match matlabLineContinuation "\.\{3}"
+
+"syn match matlabIdentifier "\<\a\w*\>"
+
+" String
+" MT_ADDON - added 'skip' in order to deal with 'tic' escaping sequence
+syn region matlabString start=+'+ end=+'+ oneline skip=+''+
+syn region matlabStringArray start=+"+ end=+"+ oneline skip=+""+
+
+" If you don't like tabs
+syn match matlabTab "\t"
+
+" Standard numbers
+syn match matlabNumber "\<\d\+[ij]\=\>"
+" floating point number, with dot, optional exponent
+syn match matlabFloat "\<\d\+\(\.\d*\)\=\([edED][-+]\=\d\+\)\=[ij]\=\>"
+" floating point number, starting with a dot, optional exponent
+syn match matlabFloat "\.\d\+\([edED][-+]\=\d\+\)\=[ij]\=\>"
+
+" Transpose character and delimiters: Either use just [...] or (...) aswell
+syn match matlabDelimiter "[][]"
+"syn match matlabDelimiter "[][()]"
+syn match matlabTransposeOperator "[])a-zA-Z0-9.]'"lc=1
+
+syn match matlabSemicolon ";"
+
+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
+
+syn keyword matlabFunction error eval function
+
+syn keyword matlabImplicit abs acos atan asin cos cosh exp log prod sum
+syn keyword matlabImplicit log10 max min sign sin sinh sqrt tan reshape
+
+syn match matlabError "-\=\<\d\+\.\d\+\.[^*/\\^]"
+syn match matlabError "-\=\<\d\+\.\d\+[eEdD][-+]\=\d\+\.\([^*/\\^]\)"
+
+" Define the default highlighting.
+" 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 matlabStringArray 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
+"hi def link matlabIdentifier Identifier
+"hi def link matlabTab Error
+
+
+let b:current_syntax = "matlab"
+
+"EOF vim: ts=8 noet tw=100 sw=8 sts=0
diff --git a/runtime/syntax/maxima.vim b/runtime/syntax/maxima.vim
new file mode 100644
index 0000000..46e1e4f
--- /dev/null
+++ b/runtime/syntax/maxima.vim
@@ -0,0 +1,261 @@
+" Vim syntax file
+" Language: Maxima (symbolic algebra program)
+" Maintainer: Robert Dodier (robert.dodier@gmail.com)
+" Last Change: April 6, 2006
+" Version: 1
+" Adapted mostly from xmath.vim
+" Number formats adapted from r.vim
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn sync lines=1000
+
+" parenthesis sanity checker
+syn region maximaZone matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" transparent contains=ALLBUT,maximaError,maximaBraceError,maximaCurlyError
+syn region maximaZone matchgroup=Delimiter start="{" matchgroup=Delimiter end="}" transparent contains=ALLBUT,maximaError,maximaBraceError,maximaParenError
+syn region maximaZone matchgroup=Delimiter start="\[" matchgroup=Delimiter end="]" transparent contains=ALLBUT,maximaError,maximaCurlyError,maximaParenError
+syn match maximaError "[)\]}]"
+syn match maximaBraceError "[)}]" contained
+syn match maximaCurlyError "[)\]]" contained
+syn match maximaParenError "[\]}]" contained
+syn match maximaComma "[\[\](),;]"
+syn match maximaComma "\.\.\.$"
+
+" A bunch of useful maxima keywords
+syn keyword maximaConditional if then else elseif and or not
+syn keyword maximaRepeat do for thru
+
+" ---------------------- BEGIN LIST OF ALL FUNCTIONS (EXCEPT KEYWORDS) ----------------------
+syn keyword maximaFunc abasep abs absboxchar absint acos acosh acot acoth acsc
+syn keyword maximaFunc acsch activate activecontexts addcol additive addrow adim
+syn keyword maximaFunc adjoint af aform airy algebraic algepsilon algexact algsys
+syn keyword maximaFunc alg_type alias aliases allbut all_dotsimp_denoms allroots allsym
+syn keyword maximaFunc alphabetic antid antidiff antisymmetric append appendfile
+syn keyword maximaFunc apply apply1 apply2 applyb1 apropos args array arrayapply
+syn keyword maximaFunc arrayinfo arraymake arrays asec asech asin asinh askexp
+syn keyword maximaFunc askinteger asksign assoc assoc_legendre_p assoc_legendre_q assume
+syn keyword maximaFunc assume_pos assume_pos_pred assumescalar asymbol asympa at atan
+syn keyword maximaFunc atan2 atanh atensimp atom atomgrad atrig1 atvalue augcoefmatrix
+syn keyword maximaFunc av backsubst backtrace bashindices batch batchload bc2 bdvac
+syn keyword maximaFunc berlefact bern bernpoly bessel besselexpand bessel_i bessel_j
+syn keyword maximaFunc bessel_k bessel_y beta bezout bffac bfhzeta bfloat bfloatp
+syn keyword maximaFunc bfpsi bfpsi0 bftorat bftrunc bfzeta bimetric binomial block
+syn keyword maximaFunc bothcoef box boxchar break breakup bug_report build_info buildq
+syn keyword maximaFunc burn cabs canform canten carg cartan catch cauchysum cbffac
+syn keyword maximaFunc cdisplay cf cfdisrep cfexpand cflength cframe_flag cgeodesic
+syn keyword maximaFunc changename changevar charpoly checkdiv check_overlaps christof
+syn keyword maximaFunc clear_rules closefile closeps cmetric cnonmet_flag coeff
+syn keyword maximaFunc coefmatrix cograd col collapse columnvector combine commutative
+syn keyword maximaFunc comp2pui compfile compile compile_file components concan concat
+syn keyword maximaFunc conj conjugate conmetderiv cons constant constantp cont2part
+syn keyword maximaFunc content context contexts contortion contract contragrad coord
+syn keyword maximaFunc copylist copymatrix cos cosh cosnpiflag cot coth covdiff
+syn keyword maximaFunc covect create_list csc csch csetup ctaylor ctaypov ctaypt
+syn keyword maximaFunc ctayswitch ctayvar ct_coords ct_coordsys ctorsion_flag ctransform
+syn keyword maximaFunc ctrgsimp current_let_rule_package dblint deactivate debugmode
+syn keyword maximaFunc declare declare_translated declare_weight decsym
+syn keyword maximaFunc default_let_rule_package defcon define define_variable defint
+syn keyword maximaFunc defmatch defrule deftaylor del delete deleten delta demo
+syn keyword maximaFunc demoivre denom dependencies depends derivabbrev derivdegree
+syn keyword maximaFunc derivlist derivsubst describe desolve determinant detout
+syn keyword maximaFunc diagmatrix diagmatrixp diagmetric diff dim dimension direct
+syn keyword maximaFunc disolate disp dispcon dispflag dispform dispfun display
+syn keyword maximaFunc display2d display_format_internal disprule dispterms distrib
+syn keyword maximaFunc divide divsum doallmxops domain domxexpt domxmxops domxnctimes
+syn keyword maximaFunc dontfactor doscmxops doscmxplus dot0nscsimp dot0simp dot1simp
+syn keyword maximaFunc dotassoc dotconstrules dotdistrib dotexptsimp dotident dotscrules
+syn keyword maximaFunc dotsimp dpart dscalar %e echelon %edispflag eigenvalues
+syn keyword maximaFunc eigenvectors eighth einstein eivals eivects ele2comp
+syn keyword maximaFunc ele2polynome ele2pui elem eliminate elliptic_e elliptic_ec
+syn keyword maximaFunc elliptic_eu elliptic_f elliptic_kc elliptic_pi ematrix %emode
+syn keyword maximaFunc endcons entermatrix entertensor entier %enumer equal equalp erf
+syn keyword maximaFunc erfflag errcatch error errormsg error_size error_syms
+syn keyword maximaFunc %e_to_numlog euler ev eval evenp every evflag evfun evundiff
+syn keyword maximaFunc example exp expand expandwrt expandwrt_denom expandwrt_factored
+syn keyword maximaFunc explose expon exponentialize expop express expt exptdispflag
+syn keyword maximaFunc exptisolate exptsubst extdiff extract_linear_equations ezgcd
+syn keyword maximaFunc facexpand factcomb factlim factor factorflag factorial factorout
+syn keyword maximaFunc factorsum facts false fast_central_elements fast_linsolve
+syn keyword maximaFunc fasttimes fb feature featurep features fft fib fibtophi fifth
+syn keyword maximaFunc filename_merge file_search file_search_demo file_search_lisp
+syn keyword maximaFunc file_search_maxima file_type fillarray findde first fix flatten
+syn keyword maximaFunc flipflag float float2bf floatnump flush flush1deriv flushd
+syn keyword maximaFunc flushnd forget fortindent fortran fortspaces fourcos fourexpand
+syn keyword maximaFunc fourier fourint fourintcos fourintsin foursimp foursin fourth
+syn keyword maximaFunc fpprec fpprintprec frame_bracket freeof fullmap fullmapl
+syn keyword maximaFunc fullratsimp fullratsubst funcsolve functions fundef funmake funp
+syn keyword maximaFunc gamma %gamma gammalim gauss gcd gcdex gcfactor gdet genfact
+syn keyword maximaFunc genindex genmatrix gensumnum get getchar gfactor gfactorsum
+syn keyword maximaFunc globalsolve go gradef gradefs gramschmidt grind grobner_basis
+syn keyword maximaFunc gschmit hach halfangles hermite hipow hodge horner i0 i1
+syn keyword maximaFunc *read-base* ic1 ic2 icc1 icc2 ic_convert ichr1 ichr2 icounter
+syn keyword maximaFunc icurvature ident idiff idim idummy idummyx ieqn ieqnprint ifb
+syn keyword maximaFunc ifc1 ifc2 ifg ifgi ifr iframe_bracket_form iframes ifri ift
+syn keyword maximaFunc igeodesic_coords igeowedge_flag ikt1 ikt2 ilt imagpart imetric
+syn keyword maximaFunc inchar indexed_tensor indices inf %inf infeval infinity infix
+syn keyword maximaFunc inflag infolists init_atensor init_ctensor inm inmc1 inmc2
+syn keyword maximaFunc innerproduct in_netmath inpart inprod inrt integerp integrate
+syn keyword maximaFunc integrate_use_rootsof integration_constant_counter interpolate
+syn keyword maximaFunc intfaclim intopois intosum intpolabs intpolerror intpolrel
+syn keyword maximaFunc invariant1 invariant2 inverse_jacobi_cd inverse_jacobi_cn
+syn keyword maximaFunc inverse_jacobi_cs inverse_jacobi_dc inverse_jacobi_dn
+syn keyword maximaFunc inverse_jacobi_ds inverse_jacobi_nc inverse_jacobi_nd
+syn keyword maximaFunc inverse_jacobi_ns inverse_jacobi_sc inverse_jacobi_sd
+syn keyword maximaFunc inverse_jacobi_sn invert is ishow isolate isolate_wrt_times
+syn keyword maximaFunc isqrt itr j0 j1 jacobi jacobi_cd jacobi_cn jacobi_cs jacobi_dc
+syn keyword maximaFunc jacobi_dn jacobi_ds jacobi_nc jacobi_nd jacobi_ns jacobi_sc
+syn keyword maximaFunc jacobi_sd jacobi_sn jn kdels kdelta keepfloat kill killcontext
+syn keyword maximaFunc kinvariant kostka kt labels lambda laplace lassociative last
+syn keyword maximaFunc lc2kdt lc_l lcm lc_u ldefint ldisp ldisplay leinstein length
+syn keyword maximaFunc let letrat let_rule_packages letrules letsimp levi_civita lfg
+syn keyword maximaFunc lfreeof lg lgtreillis lhospitallim lhs liediff limit limsubst
+syn keyword maximaFunc linear linechar linel linenum linsolve linsolve_params
+syn keyword maximaFunc linsolvewarn listarith listarray listconstvars listdummyvars
+syn keyword maximaFunc list_nc_monomials listoftens listofvars listp lmxchar load
+syn keyword maximaFunc loadfile loadprint local log logabs logarc logconcoeffp
+syn keyword maximaFunc logcontract logexpand lognegint lognumer logsimp lopow
+syn keyword maximaFunc lorentz_gauge lpart lratsubst lriem lriemann lsum ltreillis
+syn keyword maximaFunc m1pbranch macroexpansion mainvar make_array makebox makefact
+syn keyword maximaFunc makegamma makelist make_random_state make_transform map mapatom
+syn keyword maximaFunc maperror maplist matchdeclare matchfix matrix matrix_element_add
+syn keyword maximaFunc matrix_element_mult matrix_element_transpose matrixmap matrixp
+syn keyword maximaFunc mattrace max maxapplydepth maxapplyheight maxnegex maxposex
+syn keyword maximaFunc maxtayorder member min %minf minfactorial minor mod
+syn keyword maximaFunc mode_check_errorp mode_checkp mode_check_warnp mode_declare
+syn keyword maximaFunc mode_identity modulus mon2schur mono monomial_dimensions
+syn keyword maximaFunc multi_elem multinomial multi_orbit multiplicative multiplicities
+syn keyword maximaFunc multi_pui multsym multthru myoptions nc_degree ncexpt ncharpoly
+syn keyword maximaFunc negdistrib negsumdispflag newcontext newdet newton niceindices
+syn keyword maximaFunc niceindicespref ninth nm nmc noeval nolabels nonmetricity
+syn keyword maximaFunc nonscalar nonscalarp noun noundisp nounify nouns np npi
+syn keyword maximaFunc nptetrad nroots nterms ntermst nthroot ntrig num numberp numer
+syn keyword maximaFunc numerval numfactor nusum obase oddp ode2 op openplot_curves
+syn keyword maximaFunc operatorp opproperties opsubst optimize optimprefix optionset
+syn keyword maximaFunc orbit ordergreat ordergreatp orderless orderlessp outative
+syn keyword maximaFunc outchar outermap outofpois packagefile pade part part2cont
+syn keyword maximaFunc partfrac partition partpol partswitch permanent permut petrov
+syn keyword maximaFunc pfeformat pi pickapart piece playback plog plot2d plot2d_ps
+syn keyword maximaFunc plot3d plot_options poisdiff poisexpt poisint poislim poismap
+syn keyword maximaFunc poisplus poissimp poisson poissubst poistimes poistrim polarform
+syn keyword maximaFunc polartorect polynome2ele posfun potential powerdisp powers
+syn keyword maximaFunc powerseries pred prederror primep print printpois printprops
+syn keyword maximaFunc prodhack prodrac product programmode prompt properties props
+syn keyword maximaFunc propvars pscom psdraw_curve psexpand psi pui pui2comp pui2ele
+syn keyword maximaFunc pui2polynome pui_direct puireduc put qput qq quad_qag quad_qagi
+syn keyword maximaFunc quad_qags quad_qawc quad_qawf quad_qawo quad_qaws quanc8 quit
+syn keyword maximaFunc qunit quotient radcan radexpand radsubstflag random rank
+syn keyword maximaFunc rassociative rat ratalgdenom ratchristof ratcoef ratdenom
+syn keyword maximaFunc ratdenomdivide ratdiff ratdisrep rateinstein ratepsilon ratexpand
+syn keyword maximaFunc ratfac ratmx ratnumer ratnump ratp ratprint ratriemann ratsimp
+syn keyword maximaFunc ratsimpexpons ratsubst ratvars ratweight ratweights ratweyl
+syn keyword maximaFunc ratwtlvl read readonly realonly realpart realroots rearray
+syn keyword maximaFunc rectform recttopolar rediff refcheck rem remainder remarray
+syn keyword maximaFunc rembox remcomps remcon remcoord remfun remfunction remlet
+syn keyword maximaFunc remove remrule remsym remvalue rename reset residue resolvante
+syn keyword maximaFunc resolvante_alternee1 resolvante_bipartite resolvante_diedrale
+syn keyword maximaFunc resolvante_klein resolvante_klein3 resolvante_produit_sym
+syn keyword maximaFunc resolvante_unitaire resolvante_vierer rest resultant return
+syn keyword maximaFunc reveal reverse revert revert2 rhs ric ricci riem riemann
+syn keyword maximaFunc rinvariant risch rmxchar rncombine %rnum_list romberg rombergabs
+syn keyword maximaFunc rombergit rombergmin rombergtol room rootsconmode rootscontract
+syn keyword maximaFunc rootsepsilon round row run_testsuite save savedef savefactors
+syn keyword maximaFunc scalarmatrixp scalarp scalefactors scanmap schur2comp sconcat
+syn keyword maximaFunc scsimp scurvature sec sech second setcheck setcheckbreak
+syn keyword maximaFunc setelmx set_plot_option set_random_state setup_autoload
+syn keyword maximaFunc set_up_dot_simplifications setval seventh sf show showcomps
+syn keyword maximaFunc showratvars showtime sign signum similaritytransform simpsum
+syn keyword maximaFunc simtran sin sinh sinnpiflag sixth solve solvedecomposes
+syn keyword maximaFunc solveexplicit solvefactors solve_inconsistent_error solvenullwarn
+syn keyword maximaFunc solveradcan solvetrigwarn somrac sort sparse spherical_bessel_j
+syn keyword maximaFunc spherical_bessel_y spherical_hankel1 spherical_hankel2
+syn keyword maximaFunc spherical_harmonic splice sqfr sqrt sqrtdispflag sstatus
+syn keyword maximaFunc stardisp status string stringout sublis sublis_apply_lambda
+syn keyword maximaFunc sublist submatrix subst substinpart substpart subvarp sum
+syn keyword maximaFunc sumcontract sumexpand sumhack sumsplitfact supcontext symbolp
+syn keyword maximaFunc symmetric symmetricp system tan tanh taylor taylordepth
+syn keyword maximaFunc taylorinfo taylor_logexpand taylor_order_coefficients taylorp
+syn keyword maximaFunc taylor_simplifier taylor_truncate_polynomials taytorat tcl_output
+syn keyword maximaFunc tcontract tellrat tellsimp tellsimpafter tensorkill tentex tenth
+syn keyword maximaFunc tex %th third throw time timer timer_devalue timer_info
+syn keyword maximaFunc tldefint tlimit tlimswitch todd_coxeter to_lisp totaldisrep
+syn keyword maximaFunc totalfourier totient tpartpol tr trace trace_options
+syn keyword maximaFunc transcompile translate translate_file transpose transrun
+syn keyword maximaFunc tr_array_as_ref tr_bound_function_applyp treillis treinat
+syn keyword maximaFunc tr_file_tty_messagesp tr_float_can_branch_complex
+syn keyword maximaFunc tr_function_call_default triangularize trigexpand trigexpandplus
+syn keyword maximaFunc trigexpandtimes triginverses trigrat trigreduce trigsign trigsimp
+syn keyword maximaFunc tr_numer tr_optimize_max_loop tr_semicompile tr_state_vars true
+syn keyword maximaFunc trunc truncate tr_warn_bad_function_calls tr_warn_fexpr
+syn keyword maximaFunc tr_warnings_get tr_warn_meval tr_warn_mode tr_warn_undeclared
+syn keyword maximaFunc tr_warn_undefined_variable tr_windy ttyoff ueivects ufg ug
+syn keyword maximaFunc ultraspherical undiff uniteigenvectors unitvector unknown unorder
+syn keyword maximaFunc unsum untellrat untimer untrace uric uricci uriem uriemann
+syn keyword maximaFunc use_fast_arrays uvect values vect_cross vectorpotential
+syn keyword maximaFunc vectorsimp verb verbify verbose weyl with_stdout writefile
+syn keyword maximaFunc xgraph_curves xthru zerobern zeroequiv zeromatrix zeta zeta%pi
+syn match maximaOp "[\*\/\+\-\#\!\~\^\=\:\<\>\@]"
+" ---------------------- END LIST OF ALL FUNCTIONS (EXCEPT KEYWORDS) ----------------------
+
+
+syn case match
+
+" Labels (supports maxima's goto)
+syn match maximaLabel "^\s*<[a-zA-Z_][a-zA-Z0-9%_]*>"
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match maximaSpecial contained "\\\d\d\d\|\\."
+syn region maximaString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=maximaSpecial
+syn match maximaCharacter "'[^\\]'"
+syn match maximaSpecialChar "'\\.'"
+
+" number with no fractional part or exponent
+syn match maximaNumber /\<\d\+\>/
+" floating point number with integer and fractional parts and optional exponent
+syn match maximaFloat /\<\d\+\.\d*\([BbDdEeSs][-+]\=\d\+\)\=\>/
+" floating point number with no integer part and optional exponent
+syn match maximaFloat /\<\.\d\+\([BbDdEeSs][-+]\=\d\+\)\=\>/
+" floating point number with no fractional part and optional exponent
+syn match maximaFloat /\<\d\+[BbDdEeSs][-+]\=\d\+\>/
+
+" Comments:
+" maxima supports /* ... */ (like C)
+syn keyword maximaTodo contained TODO Todo DEBUG
+syn region maximaCommentBlock start="/\*" end="\*/" contains=maximaString,maximaTodo,maximaCommentBlock
+
+" synchronizing
+syn sync match maximaSyncComment grouphere maximaCommentBlock "/*"
+syn sync match maximaSyncComment groupthere NONE "*/"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+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
+
+
+let b:current_syntax = "maxima"
diff --git a/runtime/syntax/mel.vim b/runtime/syntax/mel.vim
new file mode 100644
index 0000000..f0f1bca
--- /dev/null
+++ b/runtime/syntax/mel.vim
@@ -0,0 +1,108 @@
+" Vim syntax file
+" Language: MEL (Maya Extension Language)
+" Maintainer: Robert Minsk <egbert@centropolisfx.com>
+" Last Change: May 27 1999
+" Based on: Bram Moolenaar <Bram@vim.org> C syntax file
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" when wanted, highlight trailing white space and spaces before tabs
+if exists("mel_space_errors")
+ sy match melSpaceError "\s\+$"
+ sy match melSpaceError " \+\t"me=e-1
+endif
+
+" A bunch of usefull MEL keyworks
+sy keyword melBoolean true false yes no on off
+
+sy keyword melFunction proc
+sy match melIdentifier "\$\(\a\|_\)\w*"
+
+sy keyword melStatement break continue return
+sy keyword melConditional if else switch
+sy keyword melRepeat while for do in
+sy keyword melLabel case default
+sy keyword melOperator size eval env exists whatIs
+sy keyword melKeyword alias
+sy keyword melException catch error warning
+
+sy keyword melInclude source
+
+sy keyword melType int float string vector matrix
+sy keyword melStorageClass global
+
+sy keyword melDebug trace
+
+sy keyword melTodo contained TODO FIXME XXX
+
+" MEL data types
+sy match melCharSpecial contained "\\[ntr\\"]"
+sy match melCharError contained "\\[^ntr\\"]"
+
+sy region melString start=+"+ skip=+\\"+ end=+"+ contains=melCharSpecial,melCharError
+
+sy case ignore
+sy match melInteger "\<\d\+\(e[-+]\=\d\+\)\=\>"
+sy match melFloat "\<\d\+\(e[-+]\=\d\+\)\=f\>"
+sy match melFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=f\=\>"
+sy match melFloat "\.\d\+\(e[-+]\=\d\+\)\=f\=\>"
+sy case match
+
+sy match melCommaSemi contained "[,;]"
+sy region melMatrixVector start=/<</ end=/>>/ contains=melInteger,melFloat,melIdentifier,melCommaSemi
+
+sy cluster melGroup contains=melFunction,melStatement,melConditional,melLabel,melKeyword,melStorageClass,melTODO,melCharSpecial,melCharError,melCommaSemi
+
+" catch errors caused by wrong parenthesis
+sy region melParen transparent start='(' end=')' contains=ALLBUT,@melGroup,melParenError,melInParen
+sy match melParenError ")"
+sy match melInParen contained "[{}]"
+
+" comments
+sy region melComment start="/\*" end="\*/" contains=melTodo,melSpaceError
+sy match melComment "//.*" contains=melTodo,melSpaceError
+sy match melCommentError "\*/"
+
+sy region melQuestionColon matchgroup=melConditional transparent start='?' end=':' contains=ALLBUT,@melGroup
+
+if !exists("mel_minlines")
+ let mel_minlines=15
+endif
+exec "sy sync ccomment melComment minlines=" . mel_minlines
+
+" Define the default highlighting.
+" 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/mermaid.vim b/runtime/syntax/mermaid.vim
new file mode 100644
index 0000000..afdbcc3
--- /dev/null
+++ b/runtime/syntax/mermaid.vim
@@ -0,0 +1,155 @@
+" Vim syntax file
+" Language: Mermaid
+" Maintainer: Craig MacEahern <https://github.com/craigmac/vim-mermaid>
+" Filenames: *.mmd
+" Last Change: 2022 Nov 22
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syntax iskeyword @,48-57,192-255,$,_,-,:
+syntax keyword mermaidKeyword
+ \ _blank
+ \ _self
+ \ _parent
+ \ _top
+ \ ::icon
+ \ accDescr
+ \ accTitle
+ \ actor
+ \ activate
+ \ alt
+ \ and
+ \ as
+ \ autonumber
+ \ branch
+ \ break
+ \ callback
+ \ checkout
+ \ class
+ \ classDef
+ \ classDiagram
+ \ click
+ \ commit
+ \ commitgitGraph
+ \ critical
+ \ dataFormat
+ \ dateFormat
+ \ deactivate
+ \ direction
+ \ element
+ \ else
+ \ end
+ \ erDiagram
+ \ flowchart
+ \ gantt
+ \ gitGraph
+ \ graph
+ \ journey
+ \ link
+ \ LR
+ \ TD
+ \ TB
+ \ RL
+ \ loop
+ \ merge
+ \ mindmap root
+ \ Note
+ \ Note right of
+ \ Note left of
+ \ Note over
+ \ note
+ \ note right of
+ \ note left of
+ \ note over
+ \ opt
+ \ option
+ \ par
+ \ participant
+ \ pie
+ \ rect
+ \ requirement
+ \ rgb
+ \ section
+ \ sequenceDiagram
+ \ state
+ \ stateDiagram
+ \ stateDiagram-v2
+ \ style
+ \ subgraph
+ \ title
+highlight link mermaidKeyword Keyword
+
+syntax match mermaidStatement "|"
+syntax match mermaidStatement "--\?[>x)]>\?+\?-\?"
+syntax match mermaidStatement "\~\~\~"
+syntax match mermaidStatement "--"
+syntax match mermaidStatement "---"
+syntax match mermaidStatement "-->"
+syntax match mermaidStatement "-\."
+syntax match mermaidStatement "\.->"
+syntax match mermaidStatement "-\.-"
+syntax match mermaidStatement "-\.\.-"
+syntax match mermaidStatement "-\.\.\.-"
+syntax match mermaidStatement "=="
+syntax match mermaidStatement "==>"
+syntax match mermaidStatement "===>"
+syntax match mermaidStatement "====>"
+syntax match mermaidStatement "&"
+syntax match mermaidStatement "--o"
+syntax match mermaidStatement "--x"
+syntax match mermaidStatement "x--x"
+syntax match mermaidStatement "-----"
+syntax match mermaidStatement "---->"
+syntax match mermaidStatement "==="
+syntax match mermaidStatement "===="
+syntax match mermaidStatement "====="
+syntax match mermaidStatement ":::"
+syntax match mermaidStatement "<|--"
+syntax match mermaidStatement "\*--"
+syntax match mermaidStatement "o--"
+syntax match mermaidStatement "o--o"
+syntax match mermaidStatement "<--"
+syntax match mermaidStatement "<-->"
+syntax match mermaidStatement "\.\."
+syntax match mermaidStatement "<\.\."
+syntax match mermaidStatement "<|\.\."
+syntax match mermaidStatement "--|>"
+syntax match mermaidStatement "--\*"
+syntax match mermaidStatement "--o"
+syntax match mermaidStatement "\.\.>"
+syntax match mermaidStatement "\.\.|>"
+syntax match mermaidStatement "<|--|>"
+syntax match mermaidStatement "||--o{"
+highlight link mermaidStatement Statement
+
+syntax match mermaidIdentifier "[\+-]\?\w\+(.*)[\$\*]\?"
+highlight link mermaidIdentifier Identifier
+
+syntax match mermaidType "[\+-\#\~]\?\cint\>"
+syntax match mermaidType "[\+-\#\~]\?\cString\>"
+syntax match mermaidType "[\+-\#\~]\?\cbool\>"
+syntax match mermaidType "[\+-\#\~]\?\cBigDecimal\>"
+syntax match mermaidType "[\+-\#\~]\?\cList\~.\+\~"
+syntax match mermaidType "<<\w\+>>"
+highlight link mermaidType Type
+
+syntax match mermaidComment "%%.*$"
+highlight link mermaidComment Comment
+
+syntax region mermaidDirective start="%%{" end="\}%%"
+highlight link mermaidDirective PreProc
+
+syntax region mermaidString start=/"/ skip=/\\"/ end=/"/
+highlight link mermaidString String
+
+let b:current_syntax = "mermaid"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2:
diff --git a/runtime/syntax/meson.vim b/runtime/syntax/meson.vim
new file mode 100644
index 0000000..0af0d77
--- /dev/null
+++ b/runtime/syntax/meson.vim
@@ -0,0 +1,158 @@
+" Vim syntax file
+" Language: Meson
+" License: VIM License
+" Maintainer: Nirbheek Chauhan <nirbheek.chauhan@gmail.com>
+" Liam Beguin <liambeguin@gmail.com>
+" Last Change: 2021 Aug 16
+" Credits: Zvezdan Petkovic <zpetkovic@acm.org>
+" Neil Schemenauer <nas@meson.ca>
+" Dmitry Vasiliev
+"
+" This version is copied and edited from python.vim
+" It's very basic, and doesn't do many things I'd like it to
+" For instance, it should show errors for syntax that is valid in
+" Python but not in Meson.
+"
+" Optional highlighting can be controlled using these variables.
+"
+" let meson_space_error_highlight = 1
+"
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" We need nocompatible mode in order to continue lines with backslashes.
+" Original setting will be restored.
+let s:cpo_save = &cpo
+set cpo&vim
+
+" http://mesonbuild.com/Syntax.html
+syn keyword mesonConditional elif else if endif
+syn keyword mesonRepeat foreach endforeach
+syn keyword mesonOperator and not or in
+syn keyword mesonStatement continue break
+
+syn match mesonComment "#.*$" contains=mesonTodo,@Spell
+syn keyword mesonTodo FIXME NOTE NOTES TODO XXX contained
+
+" Strings can either be single quoted or triple counted across multiple lines,
+" but always with a '
+syn region mesonString
+ \ start="\z('\)" end="\z1" skip="\\\\\|\\\z1"
+ \ contains=mesonEscape,@Spell
+syn region mesonString
+ \ start="\z('''\)" end="\z1" keepend
+ \ contains=mesonEscape,mesonSpaceError,@Spell
+
+syn match mesonEscape "\\[abfnrtv'\\]" contained
+syn match mesonEscape "\\\o\{1,3}" contained
+syn match mesonEscape "\\x\x\{2}" contained
+syn match mesonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained
+" Meson allows case-insensitive Unicode IDs: http://www.unicode.org/charts/
+syn match mesonEscape "\\N{\a\+\%(\s\a\+\)*}" contained
+syn match mesonEscape "\\$"
+
+" Meson only supports integer numbers
+" http://mesonbuild.com/Syntax.html#numbers
+syn match mesonNumber "\<\d\+\>"
+syn match mesonNumber "\<0x\x\+\>"
+syn match mesonNumber "\<0o\o\+\>"
+
+" booleans
+syn keyword mesonBoolean false true
+
+" Built-in functions
+syn keyword mesonBuiltin
+ \ add_global_arguments
+ \ add_global_link_arguments
+ \ add_languages
+ \ add_project_arguments
+ \ add_project_link_arguments
+ \ add_test_setup
+ \ alias_target
+ \ assert
+ \ benchmark
+ \ both_libraries
+ \ build_machine
+ \ build_target
+ \ configuration_data
+ \ configure_file
+ \ custom_target
+ \ declare_dependency
+ \ dependency
+ \ disabler
+ \ environment
+ \ error
+ \ executable
+ \ files
+ \ find_library
+ \ find_program
+ \ generator
+ \ get_option
+ \ get_variable
+ \ gettext
+ \ host_machine
+ \ import
+ \ include_directories
+ \ install_data
+ \ install_headers
+ \ install_man
+ \ install_subdir
+ \ install_emptydir
+ \ is_disabler
+ \ is_variable
+ \ jar
+ \ join_paths
+ \ library
+ \ meson
+ \ message
+ \ option
+ \ project
+ \ run_command
+ \ run_target
+ \ set_variable
+ \ shared_library
+ \ shared_module
+ \ static_library
+ \ subdir
+ \ subdir_done
+ \ subproject
+ \ summary
+ \ target_machine
+ \ test
+ \ unset_variable
+ \ vcs_tag
+ \ warning
+ \ range
+
+if exists("meson_space_error_highlight")
+ " trailing whitespace
+ syn match mesonSpaceError display excludenl "\s\+$"
+ " mixed tabs and spaces
+ syn match mesonSpaceError display " \+\t"
+ syn match mesonSpaceError display "\t\+ "
+endif
+
+" The default highlight links. Can be overridden later.
+hi def link mesonStatement Statement
+hi def link mesonConditional Conditional
+hi def link mesonRepeat Repeat
+hi def link mesonOperator Operator
+hi def link mesonComment Comment
+hi def link mesonTodo Todo
+hi def link mesonString String
+hi def link mesonEscape Special
+hi def link mesonNumber Number
+hi def link mesonBuiltin Function
+hi def link mesonBoolean Boolean
+if exists("meson_space_error_higlight")
+ hi def link mesonSpaceError Error
+endif
+
+let b:current_syntax = "meson"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2 ts=8 noet:
diff --git a/runtime/syntax/messages.vim b/runtime/syntax/messages.vim
new file mode 100644
index 0000000..8b970aa
--- /dev/null
+++ b/runtime/syntax/messages.vim
@@ -0,0 +1,74 @@
+" Vim syntax file
+" Language: /var/log/messages file
+" Maintainer: Yakov Lerner <iler.ml@gmail.com>
+" Latest Revision: 2008-06-29
+" Changes: 2008-06-29 support for RFC3339 tuimestamps James Vega
+" 2016 Jan 19: messagesDate changed by Bram
+" 2021 Jan 27: messagesHourRFC3339 changed from #946
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match messagesBegin display '^' nextgroup=messagesDate,messagesDateRFC3339
+
+syn match messagesDate contained display '[[:lower:][:upper:]][[:lower:][:upper:]][[:lower:][:upper:]] [ 0-9]\d *'
+ \ nextgroup=messagesHour
+
+syn match messagesHour contained display '\d\d:\d\d:\d\d\s*'
+ \ nextgroup=messagesHost
+
+syn match messagesDateRFC3339 contained display '\d\{4}-\d\d-\d\d'
+ \ nextgroup=messagesRFC3339T
+
+syn match messagesRFC3339T contained display '\cT'
+ \ nextgroup=messagesHourRFC3339
+
+syn match messagesHourRFC3339 contained display '\c\d\d:\d\d:\d\d\(\.\d\+\)\=\([+-]\d\d:\d\d\|Z\)\s*'
+ \ nextgroup=messagesHost
+
+syn match messagesHost contained display '\S*\s*'
+ \ nextgroup=messagesLabel
+
+syn match messagesLabel contained display '\s*[^:]*:\s*'
+ \ nextgroup=messagesText contains=messagesKernel,messagesPID
+
+syn match messagesPID contained display '\[\zs\d\+\ze\]'
+
+syn match messagesKernel contained display 'kernel:'
+
+
+syn match messagesIP '\d\+\.\d\+\.\d\+\.\d\+'
+
+syn match messagesURL '\w\+://\S\+'
+
+syn match messagesText contained display '.*'
+ \ contains=messagesNumber,messagesIP,messagesURL,messagesError
+
+syn match messagesNumber contained '0x[0-9a-fA-F]*\|\[<[0-9a-f]\+>\]\|\<\d[0-9a-fA-F]*'
+
+syn match messagesError contained '\c.*\<\(FATAL\|ERROR\|ERRORS\|FAILED\|FAILURE\).*'
+
+
+hi def link messagesDate Constant
+hi def link messagesHour Type
+hi def link messagesDateRFC3339 Constant
+hi def link messagesHourRFC3339 Type
+hi def link messagesRFC3339T Normal
+hi def link messagesHost Identifier
+hi def link messagesLabel Operator
+hi def link messagesPID Constant
+hi def link messagesKernel Special
+hi def link messagesError ErrorMsg
+hi def link messagesIP Constant
+hi def link messagesURL Underlined
+hi def link messagesText Normal
+hi def link messagesNumber Number
+
+let b:current_syntax = "messages"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/mf.vim b/runtime/syntax/mf.vim
new file mode 100644
index 0000000..d1faa19
--- /dev/null
+++ b/runtime/syntax/mf.vim
@@ -0,0 +1,308 @@
+vim9script
+
+# Vim syntax file
+# Language: METAFONT
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Andreas Scherer <andreas.scherer@pobox.com>
+# Latest Revision: 2022 Aug 12
+
+if exists("b:current_syntax")
+ finish
+endif
+
+# Deprecation warnings: to be removed eventually
+if exists("g:plain_mf_macros")
+ echomsg "[mf] g:plain_mf_macros is deprecated: use g:mf_plain_macros instead."
+endif
+if exists("g:plain_mf_modes")
+ echomsg "[mf] g:plain_mf_modes is deprecated: use g:mf_plain_modes instead."
+endif
+if exists("g:other_mf_macros")
+ echomsg "[mf] g:other_mf_macros is deprecated: use g:mf_other_macros instead."
+endif
+
+syn iskeyword @,_
+
+# METAFONT 'primitives' as defined in chapter 25 of 'The METAFONTbook'
+# Page 210: 'boolean expressions'
+syn keyword mfBoolExp and charexists false known not odd or true unknown
+
+# Page 210: 'numeric expression'
+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 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 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 atleast controls curl cycle makepath reverse
+syn keyword mfPathExp subpath tension
+
+# Page 214: 'pen expressions'
+syn keyword mfPenExp makepen nullpen pencircle
+
+# Page 214: 'picture expressions'
+syn keyword mfPicExp nullpicture
+
+# Page 214: 'string expressions'
+syn keyword mfStringExp char decimal readstring str substring
+
+# Page 217: 'commands and statements'
+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
+syn keyword mfType transform
+
+# Page 155: 'grouping'
+syn keyword mfStatement begingroup endgroup
+
+# Page 165: 'definitions'
+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 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 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 get(g:, "mf_plain_macros", 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
+
+# By default, METAFONT loads modes.mf, too
+if get(g:, "plain_mf_modes", get(g:, "mf_plain_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 get(g:, "mf_other_macros", 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\+"
+
+# 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 match mfOpenString /"[^"]*/
+syn region mfString oneline keepend start=+"+ end=+"+
+
+# Comments:
+syn keyword mfTodoComment contained TODO FIXME XXX DEBUG NOTE
+syn match mfComment "%.*$" contains=mfTodoComment,@Spell
+
+# synchronizing
+syn sync maxlines=100
+
+# Define the default highlighting
+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
+
+b:current_syntax = "mf"
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/syntax/mgl.vim b/runtime/syntax/mgl.vim
new file mode 100644
index 0000000..f7bc617
--- /dev/null
+++ b/runtime/syntax/mgl.vim
@@ -0,0 +1,117 @@
+" Vim syntax file
+" Language: MGL
+" Version: 1.0
+" Last Change: 2006 Feb 21
+" Maintainer: Gero Kuhlmann <gero@gkminix.han.de>
+"
+" $Id: mgl.vim,v 1.1 2006/02/21 22:08:20 vimboss Exp $
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+syn sync lines=250
+
+syn keyword mglBoolean true false
+syn keyword mglConditional if else then
+syn keyword mglConstant nil
+syn keyword mglPredefined maxint
+syn keyword mglLabel case goto label
+syn keyword mglOperator to downto in of with
+syn keyword mglOperator and not or xor div mod
+syn keyword mglRepeat do for repeat while to until
+syn keyword mglStatement procedure function break continue return restart
+syn keyword mglStatement program begin end const var type
+syn keyword mglStruct record
+syn keyword mglType integer string char boolean char ipaddr array
+
+
+" String
+if !exists("mgl_one_line_string")
+ syn region mglString matchgroup=mglString start=+'+ end=+'+ contains=mglStringEscape
+ syn region mglString matchgroup=mglString start=+"+ end=+"+ contains=mglStringEscapeGPC
+else
+ "wrong strings
+ syn region mglStringError matchgroup=mglStringError start=+'+ end=+'+ end=+$+ contains=mglStringEscape
+ syn region mglStringError matchgroup=mglStringError start=+"+ end=+"+ end=+$+ contains=mglStringEscapeGPC
+ "right strings
+ syn region mglString matchgroup=mglString start=+'+ end=+'+ oneline contains=mglStringEscape
+ syn region mglString matchgroup=mglString start=+"+ end=+"+ oneline contains=mglStringEscapeGPC
+end
+syn match mglStringEscape contained "''"
+syn match mglStringEscapeGPC contained '""'
+
+
+if exists("mgl_symbol_operator")
+ syn match mglSymbolOperator "[+\-/*=\%]"
+ syn match mglSymbolOperator "[<>]=\="
+ syn match mglSymbolOperator "<>"
+ syn match mglSymbolOperator ":="
+ syn match mglSymbolOperator "[()]"
+ syn match mglSymbolOperator "\.\."
+ syn match mglMatrixDelimiter "(."
+ syn match mglMatrixDelimiter ".)"
+ syn match mglMatrixDelimiter "[][]"
+endif
+
+syn match mglNumber "-\=\<\d\+\>"
+syn match mglHexNumber "\$[0-9a-fA-F]\+\>"
+syn match mglCharacter "\#[0-9]\+\>"
+syn match mglIpAddr "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\>"
+
+syn region mglComment start="(\*" end="\*)"
+syn region mglComment start="{" end="}"
+syn region mglComment start="//" end="$"
+
+if !exists("mgl_no_functions")
+ syn keyword mglFunction dispose new
+ syn keyword mglFunction get load print select
+ syn keyword mglFunction odd pred succ
+ syn keyword mglFunction chr ord abs sqr
+ syn keyword mglFunction exit
+ syn keyword mglOperator at timeout
+endif
+
+
+syn region mglPreProc start="(\*\$" end="\*)"
+syn region mglPreProc start="{\$" end="}"
+
+syn keyword mglException try except raise
+syn keyword mglPredefined exception
+
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/mgp.vim b/runtime/syntax/mgp.vim
new file mode 100644
index 0000000..7227804
--- /dev/null
+++ b/runtime/syntax/mgp.vim
@@ -0,0 +1,69 @@
+" Vim syntax file
+" Language: mgp - MaGic Point
+" Maintainer: Gerfried Fuchs <alfie@ist.org>
+" Filenames: *.mgp
+" Last Change: 25 Apr 2001
+" URL: http://alfie.ist.org/vim/syntax/mgp.vim
+"
+" Comments are very welcome - but please make sure that you are commenting on
+" the latest version of this file.
+" SPAM is _NOT_ welcome - be ready to be reported!
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+syn match mgpLineSkip "\\$"
+
+" all the commands that are currently recognized
+syn keyword mgpCommand contained size fore back bgrad left leftfill center
+syn keyword mgpCommand contained right shrink lcutin rcutin cont xfont vfont
+syn keyword mgpCommand contained tfont tmfont tfont0 bar image newimage
+syn keyword mgpCommand contained prefix icon bimage default tab vgap hgap
+syn keyword mgpCommand contained pause mark again system filter endfilter
+syn keyword mgpCommand contained vfcap tfdir deffont font embed endembed
+syn keyword mgpCommand contained noop pcache include
+
+" charset is not yet supported :-)
+" syn keyword mgpCommand contained charset
+
+syn region mgpFile contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match mgpValue contained "\d\+"
+syn match mgpSize contained "\d\+x\d\+"
+syn match mgpLine +^%.*$+ contains=mgpCommand,mgpFile,mgpSize,mgpValue
+
+" Comments
+syn match mgpPercent +^%%.*$+
+syn match mgpHash +^#.*$+
+
+" these only work alone
+syn match mgpPage +^%page$+
+syn match mgpNoDefault +^%nodefault$+
+
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link mgpLineSkip Special
+
+hi def link mgpHash mgpComment
+hi def link mgpPercent mgpComment
+hi def link mgpComment Comment
+
+hi def link mgpCommand Identifier
+
+hi def link mgpLine Type
+
+hi def link mgpFile String
+hi def link mgpSize Number
+hi def link mgpValue Number
+
+hi def link mgpPage mgpDefine
+hi def link mgpNoDefault mgpDefine
+hi def link mgpDefine Define
+
+
+let b:current_syntax = "mgp"
diff --git a/runtime/syntax/mib.vim b/runtime/syntax/mib.vim
new file mode 100644
index 0000000..6062d50
--- /dev/null
+++ b/runtime/syntax/mib.vim
@@ -0,0 +1,57 @@
+" Vim syntax file
+" Language: Vim syntax file for SNMPv1 and SNMPv2 MIB and SMI files
+" Maintainer: Martin Smat <msmat@post.cz>
+" Original Author: David Pascoe <pascoedj@spamcop.net>
+" Written: Wed Jan 28 14:37:23 GMT--8:00 1998
+" Last Changed: Mon Mar 23 2010
+
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=@,48-57,_,128-167,224-235,-
+
+syn keyword mibImplicit ACCESS ANY AUGMENTS BEGIN BIT BITS BOOLEAN CHOICE
+syn keyword mibImplicit COMPONENTS CONTACT-INFO DEFINITIONS DEFVAL
+syn keyword mibImplicit DESCRIPTION DISPLAY-HINT END ENTERPRISE EXTERNAL FALSE
+syn keyword mibImplicit FROM GROUP IMPLICIT IMPLIED IMPORTS INDEX
+syn keyword mibImplicit LAST-UPDATED MANDATORY-GROUPS MAX-ACCESS
+syn keyword mibImplicit MIN-ACCESS MODULE MODULE-COMPLIANCE MODULE-IDENTITY
+syn keyword mibImplicit NOTIFICATION-GROUP NOTIFICATION-TYPE NOTIFICATIONS
+syn keyword mibImplicit NULL OBJECT-GROUP OBJECT-IDENTITY OBJECT-TYPE
+syn keyword mibImplicit OBJECTS OF OPTIONAL ORGANIZATION REFERENCE
+syn keyword mibImplicit REVISION SEQUENCE SET SIZE STATUS SYNTAX
+syn keyword mibImplicit TEXTUAL-CONVENTION TRAP-TYPE TRUE UNITS VARIABLES
+syn keyword mibImplicit WRITE-SYNTAX
+syn keyword mibValue accessible-for-notify current DisplayString
+syn keyword mibValue deprecated mandatory not-accessible obsolete optional
+syn keyword mibValue read-create read-only read-write write-only INTEGER
+syn keyword mibValue Counter Gauge IpAddress OCTET STRING experimental mib-2
+syn keyword mibValue TimeTicks RowStatus TruthValue UInteger32 snmpModules
+syn keyword mibValue Integer32 Counter32 TestAndIncr TimeStamp InstancePointer
+syn keyword mibValue OBJECT IDENTIFIER Gauge32 AutonomousType Counter64
+syn keyword mibValue PhysAddress TimeInterval MacAddress StorageType RowPointer
+syn keyword mibValue TDomain TAddress ifIndex
+
+" Epilogue SMI extensions
+syn keyword mibEpilogue FORCE-INCLUDE EXCLUDE cookie get-function set-function
+syn keyword mibEpilogue test-function get-function-async set-function-async
+syn keyword mibEpilogue test-function-async next-function next-function-async
+syn keyword mibEpilogue leaf-name
+syn keyword mibEpilogue DEFAULT contained
+
+syn match mibOperator "::="
+syn match mibComment "\ *--.\{-}\(--\|$\)"
+syn match mibNumber "\<['0-9a-fA-FhH]*\>"
+syn region mibDescription start="\"" end="\"" contains=DEFAULT
+
+hi def link mibImplicit Statement
+hi def link mibOperator Statement
+hi def link mibComment Comment
+hi def link mibConstants String
+hi def link mibNumber Number
+hi def link mibDescription Identifier
+hi def link mibEpilogue SpecialChar
+hi def link mibValue Structure
+
+let b:current_syntax = "mib"
diff --git a/runtime/syntax/mix.vim b/runtime/syntax/mix.vim
new file mode 100644
index 0000000..564d344
--- /dev/null
+++ b/runtime/syntax/mix.vim
@@ -0,0 +1,84 @@
+" Vim syntax file
+" Language: MIX (Donald Knuth's assembly language used in TAOCP)
+" Maintainer: Wu Yongwei <wuyongwei@gmail.com>
+" Filenames: *.mixal *.mix
+" Last Change: 2017-11-26 15:21:36 +0800
+
+" 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
+
+" Special processing of ALF directive: implementations vary whether quotation
+" marks are needed
+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
+
+" Comment at the line end
+syn match mixEndComment ".*" contains=mixRegister contained
+
+" Identifier; must go before literals
+syn match mixIdentifier "[a-z0-9_]\+" contained
+
+" Literals
+syn match mixSpecial "[-+*/:=]" contained
+syn match mixNumber "[0-9]\+\>" contained
+syn region mixString start=+"+ skip=+\\"+ end=+"+ contained
+
+" Labels
+syn match mixLabel "^[a-z0-9_]\{,10\}\s\+" nextgroup=mixAlfSpecial,mixOpcode,mixDirective
+syn match mixLabel "[0-9][BF]" contained
+
+" Comments
+syn match mixComment "^\*.*" contains=mixRegister
+
+" Directives
+syn keyword mixDirective ORIG EQU CON END nextgroup=mixParam contained skipwhite
+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
+syn match mixOpcode "EN[TN][AX1-6]\>" nextgroup=mixParam contained skipwhite
+syn match mixOpcode "INC[AX1-6]\>" nextgroup=mixParam contained skipwhite
+syn match mixOpcode "DEC[AX1-6]\>" nextgroup=mixParam contained skipwhite
+syn match mixOpcode "CMP[AX1-6]\>" nextgroup=mixParam contained skipwhite
+syn match mixOpcode "J[AX1-6]N\?[NZP]\>" nextgroup=mixParam contained skipwhite
+
+" Switch back to being case sensitive
+syn case match
+
+" Registers (only to be used in comments now)
+syn keyword mixRegister rA rX rI1 rI2 rI3 rI4 rI5 rI6 rJ contained
+
+" The default highlighting
+hi def link mixRegister Special
+hi def link mixLabel Define
+hi def link mixComment Comment
+hi def link mixEndComment Comment
+hi def link mixDirective Keyword
+hi def link mixOpcode Keyword
+
+hi def link mixSpecial Special
+hi def link mixNumber Number
+hi def link mixString String
+hi def link mixAlfParam String
+hi def link mixIdentifier Identifier
+
+let b:current_syntax = "mix"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/mma.vim b/runtime/syntax/mma.vim
new file mode 100644
index 0000000..d2f22e9
--- /dev/null
+++ b/runtime/syntax/mma.vim
@@ -0,0 +1,321 @@
+" Vim syntax file
+" Language: Mathematica
+" Maintainer: steve layland <layland@wolfram.com>
+" Last Change: 2012 Feb 03 by Thilo Six
+" Source: http://members.wri.com/layland/vim/syntax/mma.vim
+" http://vim.sourceforge.net/scripts/script.php?script_id=1273
+" Id: $Id: mma.vim,v 1.4 2006/04/14 20:40:38 vimboss Exp $
+" NOTE:
+"
+" Empty .m files will automatically be presumed as Matlab files
+" unless you have the following in your .vimrc:
+"
+" let filetype_m="mma"
+"
+" I also recommend setting the default 'Comment' highlighting to something
+" other than the color used for 'Function', since both are plentiful in
+" most mathematica files, and they are often the same color (when using
+" background=dark).
+"
+" Credits:
+" o Original Mathematica syntax version written by
+" Wolfgang Waltenberger <wwalten@ben.tuwien.ac.at>
+" o Some ideas like the CommentStar,CommentTitle were adapted
+" from the Java vim syntax file by Claudio Fleiner. Thanks!
+" o Everything else written by steve <layland@wolfram.com>
+"
+" Bugs:
+" o Vim 6.1 didn't really have support for character classes
+" of other named character classes. For example, [\a\d]
+" didn't work. Therefore, a lot of this code uses explicit
+" character classes instead: [0-9a-zA-Z]
+"
+" TODO:
+" folding
+" fix nesting
+" finish populating popular symbols
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Group Definitions:
+syntax cluster mmaNotes contains=mmaTodo,mmaFixme
+syntax cluster mmaComments contains=mmaComment,mmaFunctionComment,mmaItem,mmaFunctionTitle,mmaCommentStar
+syntax cluster mmaCommentStrings contains=mmaLooseQuote,mmaCommentString,mmaUnicode
+syntax cluster mmaStrings contains=@mmaCommentStrings,mmaString
+syntax cluster mmaTop contains=mmaOperator,mmaGenericFunction,mmaPureFunction,mmaVariable
+
+" Predefined Constants:
+" to list all predefined Symbols would be too insane...
+" it's probably smarter to define a select few, and get the rest from
+" context if absolutely necessary.
+" TODO - populate this with other often used Symbols
+
+" standard fixed symbols:
+syntax keyword mmaVariable True False None Automatic All Null C General
+
+" mathematical constants:
+syntax keyword mmaVariable Pi I E Infinity ComplexInfinity Indeterminate GoldenRatio EulerGamma Degree Catalan Khinchin Glaisher
+
+" stream data / atomic heads:
+syntax keyword mmaVariable Byte Character Expression Number Real String Word EndOfFile Integer Symbol
+
+" sets:
+syntax keyword mmaVariable Integers Complexes Reals Booleans Rationals
+
+" character classes:
+syntax keyword mmaPattern DigitCharacter LetterCharacter WhitespaceCharacter WordCharacter EndOfString StartOfString EndOfLine StartOfLine WordBoundary
+
+" SelectionMove directions/units:
+syntax keyword mmaVariable Next Previous After Before Character Word Expression TextLine CellContents Cell CellGroup EvaluationCell ButtonCell GeneratedCell Notebook
+syntax keyword mmaVariable CellTags CellStyle CellLabel
+
+" TableForm positions:
+syntax keyword mmaVariable Above Below Left Right
+
+" colors:
+syntax keyword mmaVariable Black Blue Brown Cyan Gray Green Magenta Orange Pink Purple Red White Yellow
+
+" function attributes
+syntax keyword mmaVariable Protected Listable OneIdentity Orderless Flat Constant NumericFunction Locked ReadProtected HoldFirst HoldRest HoldAll HoldAllComplete SequenceHold NHoldFirst NHoldRest NHoldAll Temporary Stub
+
+" Comment Sections:
+" this:
+" :that:
+syntax match mmaItem "\%(^[( |*\t]*\)\@<=\%(:\+\|\w\)\w\+\%( \w\+\)\{0,3}:" contained contains=@mmaNotes
+
+" Comment Keywords:
+syntax keyword mmaTodo TODO NOTE HEY contained
+syntax match mmaTodo "X\{3,}" contained
+syntax keyword mmaFixme FIX[ME] FIXTHIS BROKEN contained
+syntax match mmaFixme "BUG\%( *\#\=[0-9]\+\)\=" contained
+" yay pirates...
+syntax match mmaFixme "\%(Y\=A\+R\+G\+\|GRR\+\|CR\+A\+P\+\)\%(!\+\)\=" contained
+
+" EmPHAsis:
+" this unnecessary, but whatever :)
+syntax match mmaemPHAsis "\%(^\|\s\)\([_/]\)[a-zA-Z0-9]\+\%([- \t':]\+[a-zA-Z0-9]\+\)*\1\%(\s\|$\)" contained contains=mmaemPHAsis
+syntax match mmaemPHAsis "\%(^\|\s\)(\@<!\*[a-zA-Z0-9]\+\%([- \t':]\+[a-zA-Z0-9]\+\)*)\@!\*\%(\s\|$\)" contained contains=mmaemPHAsis
+
+" Regular Comments:
+" (* *)
+" allow nesting (* (* *) *) even though the frontend
+" won't always like it.
+syntax region mmaComment start=+(\*+ end=+\*)+ skipempty contains=@mmaNotes,mmaItem,@mmaCommentStrings,mmaemPHAsis,mmaComment
+
+" Function Comments:
+" just like a normal comment except the first sentence is Special ala Java
+" (** *)
+" TODO - fix this for nesting, or not...
+syntax region mmaFunctionComment start="(\*\*\+" end="\*\+)" contains=@mmaNotes,mmaItem,mmaFunctionTitle,@mmaCommentStrings,mmaemPHAsis,mmaComment
+syntax region mmaFunctionTitle contained matchgroup=mmaFunctionComment start="\%((\*\*[ *]*\)" matchgroup=mmaFunctionTitle keepend end=".[.!-]\=\s*$" end="[.!-][ \t\r<&]"me=e-1 end="\%(\*\+)\)\@=" contained contains=@mmaNotes,mmaItem,mmaCommentStar
+
+" catch remaining (**********)'s
+syntax match mmaComment "(\*\*\+)"
+" catch preceding *
+syntax match mmaCommentStar "^\s*\*\+" contained
+
+" Variables:
+" Dollar sign variables
+syntax match mmaVariable "\$\a\+[0-9a-zA-Z$]*"
+
+" Preceding and Following Contexts
+syntax match mmaVariable "`[a-zA-Z$]\+[0-9a-zA-Z$]*" contains=mmaVariable
+syntax match mmaVariable "[a-zA-Z$]\+[0-9a-zA-Z$]*`" contains=mmaVariable
+
+" Strings:
+" "string"
+" 'string' is not accepted (until literal strings are supported!)
+syntax region mmaString start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+
+syntax region mmaCommentString oneline start=+\\\@<!"+ skip=+\\\@<!\\\%(\\\\\)*"+ end=+"+ contained
+
+
+" Patterns:
+" Each pattern marker below can be Blank[] (_), BlankSequence[] (__)
+" or BlankNullSequence[] (___). Most examples below can also be
+" combined, for example Pattern tests with Default values.
+"
+" _Head Anonymous patterns
+" name_Head
+" name:(_Head|_Head2) Named patterns
+"
+" _Head : val
+" name:_Head:val Default values
+"
+" _Head?testQ,
+" _Head?(test[#]&) Pattern tests
+"
+" name_Head/;test[name] Conditionals
+"
+" _Head:. Predefined Default
+"
+" .. ... Pattern Repeat
+
+syntax match mmaPatternError "\%(_\{4,}\|)\s*&\s*)\@!\)" contained
+
+"pattern name:
+syntax match mmaPattern "[A-Za-z0-9`]\+\s*:\+[=>]\@!" contains=mmaOperator
+"pattern default:
+syntax match mmaPattern ": *[^ ,]\+[\], ]\@=" contains=@mmaCommentStrings,@mmaTop,mmaOperator
+"pattern head/test:
+syntax match mmaPattern "[A-Za-z0-9`]*_\+\%(\a\+\)\=\%(?([^)]\+)\|?[^\]},]\+\)\=" contains=@mmaTop,@mmaCommentStrings,mmaPatternError
+
+" Operators:
+" /: ^= ^:= UpValue
+" /; Conditional
+" := = DownValue
+" == === ||
+" != =!= && Logic
+" >= <= < >
+" += -= *=
+" /= ++ -- Math
+" ^*
+" -> :> Rules
+" @@ @@@ Apply
+" /@ //@ Map
+" /. //. Replace
+" // @ Function application
+" <> ~~ String/Pattern join
+" ~ infix operator
+" . : Pattern operators
+syntax match mmaOperator "\%(@\{1,3}\|//[.@]\=\)"
+syntax match mmaOperator "\%(/[;:@.]\=\|\^\=:\==\)"
+syntax match mmaOperator "\%([-:=]\=>\|<=\=\)"
+"syntax match mmaOperator "\%(++\=\|--\=\|[/+-*]=\|[^*]\)"
+syntax match mmaOperator "[*+=^.:?-]"
+syntax match mmaOperator "\%(\~\~\=\)"
+syntax match mmaOperator "\%(=\{2,3}\|=\=!=\|||\=\|&&\|!\)" contains=ALLBUT,mmaPureFunction
+
+" Symbol Tags:
+" "SymbolName::item"
+"syntax match mmaSymbol "`\=[a-zA-Z$]\+[0-9a-zA-Z$]*\%(`\%([a-zA-Z$]\+[0-9a-zA-Z$]*\)\=\)*" contained
+syntax match mmaMessage "`\=\([a-zA-Z$]\+[0-9a-zA-Z$]*\)\%(`\%([a-zA-Z$]\+[0-9a-zA-Z$]*\)\=\)*::\a\+" contains=mmaMessageType
+syntax match mmaMessageType "::\a\+"hs=s+2 contained
+
+" Pure Functions:
+syntax match mmaPureFunction "#\%(#\|\d\+\)\="
+syntax match mmaPureFunction "&"
+
+" Named Functions:
+" Since everything is pretty much a function, get this straight
+" from context
+syntax match mmaGenericFunction "[A-Za-z0-9`]\+\s*\%([@[]\|/:\|/\=/@\)\@=" contains=mmaOperator
+syntax match mmaGenericFunction "\~\s*[^~]\+\s*\~"hs=s+1,he=e-1 contains=mmaOperator,mmaBoring
+syntax match mmaGenericFunction "//\s*[A-Za-z0-9`]\+"hs=s+2 contains=mmaOperator
+
+" Numbers:
+syntax match mmaNumber "\<\%(\d\+\.\=\d*\|\d*\.\=\d\+\)\>"
+syntax match mmaNumber "`\d\+\%(\d\@!\.\|\>\)"
+
+" Special Characters:
+" \[Name] named character
+" \ooo octal
+" \.xx 2 digit hex
+" \:xxxx 4 digit hex (multibyte unicode)
+syntax match mmaUnicode "\\\[\w\+\d*\]"
+syntax match mmaUnicode "\\\%(\x\{3}\|\.\x\{2}\|:\x\{4}\)"
+
+" Syntax Errors:
+syntax match mmaError "\*)" containedin=ALLBUT,@mmaComments,@mmaStrings
+syntax match mmaError "\%([/]{3,}\|[&:|+*?~-]\{3,}\|[.=]\{4,}\|_\@<=\.\{2,}\|`\{2,}\)" containedin=ALLBUT,@mmaComments,@mmaStrings
+
+" Punctuation:
+" things that shouldn't really be highlighted, or highlighted
+" in they're own group if you _really_ want. :)
+" ( ) { }
+" TODO - use Delimiter group?
+syntax match mmaBoring "[(){}]" contained
+
+" ------------------------------------
+" future explorations...
+" ------------------------------------
+" Function Arguments:
+" anything between brackets []
+" (fold)
+"syntax region mmaArgument start="\[" end="\]" containedin=ALLBUT,@mmaComments,@mmaStrings transparent fold
+
+" Lists:
+" (fold)
+"syntax region mmaLists start="{" end="}" containedin=ALLBUT,@mmaComments,@mmaStrings transparent fold
+
+" Regions:
+" (fold)
+"syntax region mmaRegion start="(\*\+[^<]*<!--[^>]*\*\+)" end="--> \*)" containedin=ALLBUT,@mmaStrings transparent fold keepend
+
+" show fold text
+set commentstring='(*%s*)'
+"set foldtext=MmaFoldText()
+
+"function MmaFoldText()
+" let line = getline(v:foldstart)
+"
+" let lines = v:foldend-v:foldstart+1
+"
+" let sub = substitute(line, '(\*\+|\*\+)|[-*_]\+', '', 'g')
+"
+" if match(line, '(\*') != -1
+" let lines = lines.' line comment'
+" else
+" let lines = lines.' lines'
+" endif
+"
+" return v:folddashes.' '.lines.' '.sub
+"endf
+
+"this is slow for computing folds, but it does so accurately
+syntax sync fromstart
+
+" but this seems to do alright for non fold syntax coloring.
+" for folding, however, it doesn't get the nesting right.
+" TODO - find sync group for multiline modules? ick...
+
+" sync multi line comments
+"syntax sync match syncComments groupthere NONE "\*)"
+"syntax sync match syncComments groupthere mmaComment "(\*"
+
+"set foldmethod=syntax
+"set foldnestmax=1
+"set foldminlines=15
+
+
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/mmix.vim b/runtime/syntax/mmix.vim
new file mode 100644
index 0000000..0590767
--- /dev/null
+++ b/runtime/syntax/mmix.vim
@@ -0,0 +1,152 @@
+" Vim syntax file
+" Language: MMIX
+" Maintainer: Dirk Hüsken, <huesken@informatik.uni-tuebingen.de>
+" Last Change: 2012 Jun 01
+" (Dominique Pelle added @Spell)
+" Filenames: *.mms
+" URL: http://homepages.uni-tuebingen.de/student/dirk.huesken/vim/syntax/mmix.vim
+
+" Limitations: Comments must start with either % or //
+" (preferably %, Knuth-Style)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" MMIX data types
+syn keyword mmixType byte wyde tetra octa
+
+" different literals...
+syn match decNumber "[0-9]*"
+syn match octNumber "0[0-7][0-7]\+"
+syn match hexNumber "#[0-9a-fA-F]\+"
+syn region mmixString start=+"+ skip=+\\"+ end=+"+ contains=@Spell
+syn match mmixChar "'.'"
+
+" ...and more special MMIX stuff
+syn match mmixAt "@"
+syn keyword mmixSegments Data_Segment Pool_Segment Stack_Segment
+
+syn match mmixIdentifier "[a-z_][a-z0-9_]*"
+
+" labels (for branches etc)
+syn match mmixLabel "^[a-z0-9_:][a-z0-9_]*"
+syn match mmixLabel "[0-9][HBF]"
+
+" pseudo-operations
+syn keyword mmixPseudo is loc greg
+
+" comments
+syn match mmixComment "%.*" contains=@Spell
+syn match mmixComment "//.*" contains=@Spell
+syn match mmixComment "^\*.*" contains=@Spell
+
+
+syn keyword mmixOpcode trap fcmp fun feql fadd fix fsub fixu
+syn keyword mmixOpcode fmul fcmpe fune feqle fdiv fsqrt frem fint
+
+syn keyword mmixOpcode floti flotui sfloti sflotui i
+syn keyword mmixOpcode muli mului divi divui
+syn keyword mmixOpcode addi addui subi subui
+syn keyword mmixOpcode 2addui 4addui 8addui 16addui
+syn keyword mmixOpcode cmpi cmpui negi negui
+syn keyword mmixOpcode sli slui sri srui
+syn keyword mmixOpcode bnb bzb bpb bodb
+syn keyword mmixOpcode bnnb bnzb bnpb bevb
+syn keyword mmixOpcode pbnb pbzb pbpb pbodb
+syn keyword mmixOpcode pbnnb pbnzb pbnpb pbevb
+syn keyword mmixOpcode csni cszi cspi csodi
+syn keyword mmixOpcode csnni csnzi csnpi csevi
+syn keyword mmixOpcode zsni zszi zspi zsodi
+syn keyword mmixOpcode zsnni zsnzi zsnpi zsevi
+syn keyword mmixOpcode ldbi ldbui ldwi ldwui
+syn keyword mmixOpcode ldti ldtui ldoi ldoui
+syn keyword mmixOpcode ldsfi ldhti cswapi ldunci
+syn keyword mmixOpcode ldvtsi preldi pregoi goi
+syn keyword mmixOpcode stbi stbui stwi stwui
+syn keyword mmixOpcode stti sttui stoi stoui
+syn keyword mmixOpcode stsfi sthti stcoi stunci
+syn keyword mmixOpcode syncdi presti syncidi pushgoi
+syn keyword mmixOpcode ori orni nori xori
+syn keyword mmixOpcode andi andni nandi nxori
+syn keyword mmixOpcode bdifi wdifi tdifi odifi
+syn keyword mmixOpcode muxi saddi mori mxori
+syn keyword mmixOpcode muli mului divi divui
+
+syn keyword mmixOpcode flot flotu sflot sflotu
+syn keyword mmixOpcode mul mulu div divu
+syn keyword mmixOpcode add addu sub subu
+syn keyword mmixOpcode 2addu 4addu 8addu 16addu
+syn keyword mmixOpcode cmp cmpu neg negu
+syn keyword mmixOpcode sl slu sr sru
+syn keyword mmixOpcode bn bz bp bod
+syn keyword mmixOpcode bnn bnz bnp bev
+syn keyword mmixOpcode pbn pbz pbp pbod
+syn keyword mmixOpcode pbnn pbnz pbnp pbev
+syn keyword mmixOpcode csn csz csp csod
+syn keyword mmixOpcode csnn csnz csnp csev
+syn keyword mmixOpcode zsn zsz zsp zsod
+syn keyword mmixOpcode zsnn zsnz zsnp zsev
+syn keyword mmixOpcode ldb ldbu ldw ldwu
+syn keyword mmixOpcode ldt ldtu ldo ldou
+syn keyword mmixOpcode ldsf ldht cswap ldunc
+syn keyword mmixOpcode ldvts preld prego go
+syn keyword mmixOpcode stb stbu stw stwu
+syn keyword mmixOpcode stt sttu sto stou
+syn keyword mmixOpcode stsf stht stco stunc
+syn keyword mmixOpcode syncd prest syncid pushgo
+syn keyword mmixOpcode or orn nor xor
+syn keyword mmixOpcode and andn nand nxor
+syn keyword mmixOpcode bdif wdif tdif odif
+syn keyword mmixOpcode mux sadd mor mxor
+
+syn keyword mmixOpcode seth setmh setml setl inch incmh incml incl
+syn keyword mmixOpcode orh ormh orml orl andh andmh andml andnl
+syn keyword mmixOpcode jmp pushj geta put
+syn keyword mmixOpcode pop resume save unsave sync swym get trip
+syn keyword mmixOpcode set lda
+
+" switch back to being case sensitive
+syn case match
+
+" general-purpose and special-purpose registers
+syn match mmixRegister "$[0-9]*"
+syn match mmixRegister "r[A-Z]"
+syn keyword mmixRegister rBB rTT rWW rXX rYY rZZ
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/mmp.vim b/runtime/syntax/mmp.vim
new file mode 100644
index 0000000..d0b9f7c
--- /dev/null
+++ b/runtime/syntax/mmp.vim
@@ -0,0 +1,49 @@
+" Vim syntax file
+" Language: Symbian meta-makefile definition (MMP)
+" Maintainer: Ron Aaron <ron@ronware.org>
+" Last Change: 2007/11/07
+" URL: http://ronware.org/wiki/vim/mmp
+" Filetypes: *.mmp
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn match mmpComment "//.*"
+syn region mmpComment start="/\*" end="\*\/"
+
+syn keyword mmpKeyword aif asspabi assplibrary aaspexports baseaddress
+syn keyword mmpKeyword debuglibrary deffile document epocheapsize
+syn keyword mmpKeyword epocprocesspriority epocstacksize exportunfrozen
+syn keyword mmpStorage lang library linkas macro nostrictdef option
+syn keyword mmpStorage resource source sourcepath srcdbg startbitmap
+syn keyword mmpStorage start end staticlibrary strictdepend systeminclude
+syn keyword mmpStorage systemresource target targettype targetpath uid
+syn keyword mmpStorage userinclude win32_library
+
+syn match mmpIfdef "\#\(include\|ifdef\|ifndef\|if\|endif\|else\|elif\)"
+
+syn match mmpNumber "\d+"
+syn match mmpNumber "0x\x\+"
+
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+if !exists("did_mmp_syntax_inits")
+ let did_mmp_syntax_inits=1
+
+ hi def link mmpComment Comment
+ hi def link mmpKeyword Keyword
+ hi def link mmpStorage StorageClass
+ hi def link mmpString String
+ hi def link mmpNumber Number
+ hi def link mmpOrdinal Operator
+ hi def link mmpIfdef PreCondit
+endif
+
+let b:current_syntax = "mmp"
+
+" vim: ts=8
diff --git a/runtime/syntax/modconf.vim b/runtime/syntax/modconf.vim
new file mode 100644
index 0000000..76b36ed
--- /dev/null
+++ b/runtime/syntax/modconf.vim
@@ -0,0 +1,44 @@
+" Vim syntax file
+" Language: modules.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-10-25
+
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword+=-
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword modconfTodo FIXME TODO XXX NOTE
+
+syn region modconfComment start='#' skip='\\$' end='$'
+ \ contains=modconfTodo,@Spell
+
+syn keyword modconfConditional if else elseif endif
+
+syn keyword modconfPreProc alias define include keep prune
+ \ post-install post-remove pre-install
+ \ pre-remove persistdir blacklist
+
+syn keyword modconfKeyword add above below install options probe probeall
+ \ remove
+
+syn keyword modconfIdentifier depfile insmod_opt path generic_stringfile
+ \ pcimapfile isapnpmapfile usbmapfile
+ \ parportmapfile ieee1394mapfile pnpbiosmapfile
+syn match modconfIdentifier 'path\[[^]]\+\]'
+
+hi def link modconfTodo Todo
+hi def link modconfComment Comment
+hi def link modconfConditional Conditional
+hi def link modconfPreProc PreProc
+hi def link modconfKeyword Keyword
+hi def link modconfIdentifier Identifier
+
+let b:current_syntax = "modconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/model.vim b/runtime/syntax/model.vim
new file mode 100644
index 0000000..5f3b7f8
--- /dev/null
+++ b/runtime/syntax/model.vim
@@ -0,0 +1,44 @@
+" Vim syntax file
+" Language: Model
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2005 Jun 20
+
+" very basic things only (based on the vgrindefs file).
+" If you use this language, please improve it, and send me the patches!
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A bunch of keywords
+syn keyword modelKeyword abs and array boolean by case cdnl char copied dispose
+syn keyword modelKeyword div do dynamic else elsif end entry external FALSE false
+syn keyword modelKeyword fi file for formal fortran global if iff ift in integer include
+syn keyword modelKeyword inline is lbnd max min mod new NIL nil noresult not notin od of
+syn keyword modelKeyword or procedure public read readln readonly record recursive rem rep
+syn keyword modelKeyword repeat res result return set space string subscript such then TRUE
+syn keyword modelKeyword true type ubnd union until varies while width
+
+" Special keywords
+syn keyword modelBlock beginproc endproc
+
+" Comments
+syn region modelComment start="\$" end="\$" end="$"
+
+" Strings
+syn region modelString start=+"+ end=+"+
+
+" Character constant (is this right?)
+syn match modelString "'."
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet
+hi def link modelKeyword Statement
+hi def link modelBlock PreProc
+hi def link modelComment Comment
+hi def link modelString String
+
+let b:current_syntax = "model"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/modsim3.vim b/runtime/syntax/modsim3.vim
new file mode 100644
index 0000000..ce35033
--- /dev/null
+++ b/runtime/syntax/modsim3.vim
@@ -0,0 +1,97 @@
+" Vim syntax file
+" Language: Modsim III, by compuware corporation (www.compuware.com)
+" Maintainer: Philipp Jocham <flip@sbox.tu-graz.ac.at>
+" Extension: *.mod
+" Last Change: 2001 May 10
+"
+" 2001 March 24:
+" - Modsim III is a registered trademark from compuware corporation
+" - made compatible with Vim 6.0
+"
+" 1999 Apr 22 : Changed modsim3Literal from region to match
+"
+" very basic things only (based on the modula2 and c files).
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+" syn case match " case sensitiv match is default
+
+" A bunch of keywords
+syn keyword modsim3Keyword ACTID ALL AND AS ASK
+syn keyword modsim3Keyword BY CALL CASE CLASS CONST DIV
+syn keyword modsim3Keyword DOWNTO DURATION ELSE ELSIF EXIT FALSE FIXED FOR
+syn keyword modsim3Keyword FOREACH FORWARD IF IN INHERITED INOUT
+syn keyword modsim3Keyword INTERRUPT LOOP
+syn keyword modsim3Keyword MOD MONITOR NEWVALUE
+syn keyword modsim3Keyword NONMODSIM NOT OBJECT OF ON OR ORIGINAL OTHERWISE OUT
+syn keyword modsim3Keyword OVERRIDE PRIVATE PROTO REPEAT
+syn keyword modsim3Keyword RETURN REVERSED SELF STRERR TELL
+syn keyword modsim3Keyword TERMINATE THISMETHOD TO TRUE TYPE UNTIL VALUE VAR
+syn keyword modsim3Keyword WAIT WAITFOR WHEN WHILE WITH
+
+" Builtin functions and procedures
+syn keyword modsim3Builtin ABS ACTIVATE ADDMONITOR CAP CHARTOSTR CHR CLONE
+syn keyword modsim3Builtin DEACTIVATE DEC DISPOSE FLOAT GETMONITOR HIGH INC
+syn keyword modsim3Builtin INPUT INSERT INTTOSTR ISANCESTOR LOW LOWER MAX MAXOF
+syn keyword modsim3Builtin MIN MINOF NEW OBJTYPEID OBJTYPENAME OBJVARID ODD
+syn keyword modsim3Builtin ONERROR ONEXIT ORD OUTPUT POSITION PRINT REALTOSTR
+syn keyword modsim3Builtin REPLACE REMOVEMONITOR ROUND SCHAR SIZEOF SPRINT
+syn keyword modsim3Builtin STRLEN STRTOCHAR STRTOINT STRTOREAL SUBSTR TRUNC
+syn keyword modsim3Builtin UPDATEVALUE UPPER VAL
+
+syn keyword modsim3BuiltinNoParen HALT TRACE
+
+" Special keywords
+syn keyword modsim3Block PROCEDURE METHOD MODULE MAIN DEFINITION IMPLEMENTATION
+syn keyword modsim3Block BEGIN END
+
+syn keyword modsim3Include IMPORT FROM
+
+syn keyword modsim3Type ANYARRAY ANYOBJ ANYREC ARRAY BOOLEAN CHAR INTEGER
+syn keyword modsim3Type LMONITORED LRMONITORED NILARRAY NILOBJ NILREC REAL
+syn keyword modsim3Type RECORD RMONITOR RMONITORED STRING
+
+" catch errros cause by wrong parenthesis
+" slight problem with "( *)" or "(* )". Hints?
+syn region modsim3Paren transparent start='(' end=')' contains=ALLBUT,modsim3ParenError
+syn match modsim3ParenError ")"
+
+" Comments
+syn region modsim3Comment1 start="{" end="}" contains=modsim3Comment1,modsim3Comment2
+syn region modsim3Comment2 start="(\*" end="\*)" contains=modsim3Comment1,modsim3Comment2
+" highlighting is wrong for constructs like "{ (* } *)",
+" which are allowed in Modsim III, but
+" I think something like that shouldn't be used anyway.
+
+" Strings
+syn region modsim3String start=+"+ end=+"+
+
+" Literals
+"syn region modsim3Literal start=+'+ end=+'+
+syn match modsim3Literal "'[^']'\|''''"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
+
diff --git a/runtime/syntax/modula2.vim b/runtime/syntax/modula2.vim
new file mode 100644
index 0000000..4a14cf1
--- /dev/null
+++ b/runtime/syntax/modula2.vim
@@ -0,0 +1,73 @@
+" Vim syntax file
+" Language: Modula 2
+" Maintainer: pf@artcom0.north.de (Peter Funk)
+" based on original work of Bram Moolenaar <Bram@vim.org>
+" Last Change: 2001 May 09
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Don't ignore case (Modula-2 is case significant). This is the default in vim
+
+" Especially emphasize headers of procedures and modules:
+syn region modula2Header matchgroup=modula2Header start="PROCEDURE " end="(" contains=modula2Ident oneline
+syn region modula2Header matchgroup=modula2Header start="MODULE " end=";" contains=modula2Ident oneline
+syn region modula2Header matchgroup=modula2Header start="BEGIN (\*" end="\*)" contains=modula2Ident oneline
+syn region modula2Header matchgroup=modula2Header start="END " end=";" contains=modula2Ident oneline
+syn region modula2Keyword start="END" end=";" contains=ALLBUT,modula2Ident oneline
+
+" Some very important keywords which should be emphasized more than others:
+syn keyword modula2AttKeyword CONST EXIT HALT RETURN TYPE VAR
+" All other keywords in alphabetical order:
+syn keyword modula2Keyword AND ARRAY BY CASE DEFINITION DIV DO ELSE
+syn keyword modula2Keyword ELSIF EXPORT FOR FROM IF IMPLEMENTATION IMPORT
+syn keyword modula2Keyword IN LOOP MOD NOT OF OR POINTER QUALIFIED RECORD
+syn keyword modula2Keyword SET THEN TO UNTIL WHILE WITH
+
+syn keyword modula2Type ADDRESS BITSET BOOLEAN CARDINAL CHAR INTEGER REAL WORD
+syn keyword modula2StdFunc ABS CAP CHR DEC EXCL INC INCL ORD SIZE TSIZE VAL
+syn keyword modula2StdConst FALSE NIL TRUE
+" The following may be discussed, since NEW and DISPOSE are some kind of
+" special builtin macro functions:
+syn keyword modula2StdFunc NEW DISPOSE
+" The following types are added later on and may be missing from older
+" Modula-2 Compilers (they are at least missing from the original report
+" by N.Wirth from March 1980 ;-) Highlighting should apply nevertheless:
+syn keyword modula2Type BYTE LONGCARD LONGINT LONGREAL PROC SHORTCARD SHORTINT
+" same note applies to min and max, which were also added later to m2:
+syn keyword modula2StdFunc MAX MIN
+" The underscore was originally disallowed in m2 ids, it was also added later:
+syn match modula2Ident " [A-Z,a-z][A-Z,a-z,0-9,_]*" contained
+
+" Comments may be nested in Modula-2:
+syn region modula2Comment start="(\*" end="\*)" contains=modula2Comment,modula2Todo
+syn keyword modula2Todo contained TODO FIXME XXX
+
+" Strings
+syn region modula2String start=+"+ end=+"+
+syn region modula2String start="'" end="'"
+syn region modula2Set start="{" end="}"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "modula2"
+
+" vim: ts=8
diff --git a/runtime/syntax/modula3.vim b/runtime/syntax/modula3.vim
new file mode 100644
index 0000000..67243db
--- /dev/null
+++ b/runtime/syntax/modula3.vim
@@ -0,0 +1,145 @@
+" Vim syntax file
+" Language: Modula-3
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Timo Pedersen <dat97tpe@ludat.lth.se>
+" Last Change: 2022 Oct 31
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" Whitespace errors {{{1
+if exists("modula3_space_errors")
+ if !exists("modula3_no_trail_space_error")
+ syn match modula3SpaceError display excludenl "\s\+$"
+ endif
+ if !exists("modula3_no_tab_space_error")
+ syn match modula3SpaceError display " \+\t"me=e-1
+ endif
+endif
+
+" Keywords {{{1
+syn keyword modula3Keyword ANY ARRAY AS BITS BRANDED BY CASE CONST
+syn keyword modula3Keyword DEFINITION EVAL EXIT EXCEPT EXCEPTION EXIT
+syn keyword modula3Keyword EXPORTS FINALLY FROM GENERIC IMPORT LOCK METHOD
+syn keyword modula3Keyword OF RAISE RAISES READONLY RECORD REF
+syn keyword modula3Keyword RETURN SET TRY TYPE TYPECASE UNSAFE
+syn keyword modula3Keyword VALUE VAR WITH
+
+syn match modula3keyword "\<UNTRACED\>"
+
+" Special keywords, block delimiters etc
+syn keyword modula3Block PROCEDURE FUNCTION MODULE INTERFACE REPEAT THEN
+syn keyword modula3Block BEGIN END OBJECT METHODS OVERRIDES RECORD REVEAL
+syn keyword modula3Block WHILE UNTIL DO TO IF FOR ELSIF ELSE LOOP
+
+" Reserved identifiers {{{1
+syn keyword modula3Identifier ABS ADR ADRSIZE BITSIZE BYTESIZE CEILING DEC
+syn keyword modula3Identifier DISPOSE FIRST FLOAT FLOOR INC ISTYPE LAST
+syn keyword modula3Identifier LOOPHOLE MAX MIN NARROW NEW NUMBER ORD ROUND
+syn keyword modula3Identifier SUBARRAY TRUNC TYPECODE VAL
+
+" Predefined types {{{1
+syn keyword modula3Type ADDRESS BOOLEAN CARDINAL CHAR EXTENDED INTEGER
+syn keyword modula3Type LONGCARD LONGINT LONGREAL MUTEX NULL REAL REFANY TEXT
+syn keyword modula3Type WIDECHAR
+
+syn match modula3Type "\<\%(UNTRACED\s\+\)\=ROOT\>"
+
+" Operators {{{1
+syn keyword modula3Operator DIV MOD
+syn keyword modula3Operator IN
+syn keyword modula3Operator NOT AND OR
+
+" TODO: exclude = from declarations
+if exists("modula3_operators")
+ syn match modula3Operator "\^"
+ syn match modula3Operator "[-+/*]"
+ syn match modula3Operator "&"
+ syn match modula3Operator "<=\|<:\@!\|>=\|>"
+ syn match modula3Operator ":\@<!=\|#"
+endif
+
+" Literals {{{1
+
+" Booleans
+syn keyword modula3Boolean TRUE FALSE
+
+" Nil
+syn keyword modula3Nil NIL
+
+" Numbers {{{2
+
+" NOTE: Negated numbers are constant expressions not literals
+
+syn case ignore
+
+ " Integers
+
+ syn match modula3Integer "\<\d\+L\=\>"
+
+ if exists("modula3_number_errors")
+ syn match modula3IntegerError "\<\d\d\=_\x\+L\=\>"
+ endif
+
+ let s:digits = "0123456789ABCDEF"
+ for s:radix in range(2, 16)
+ exe $'syn match modula3Integer "\<{s:radix}_[{s:digits[:s:radix - 1]}]\+L\=\>"'
+ endfor
+ unlet s:digits s:radix
+
+ " Reals
+ syn match modula3Real "\<\d\+\.\d\+\%([EDX][+-]\=\d\+\)\=\>"
+
+syn case match
+
+" Strings and characters {{{2
+
+" String escape sequences
+syn match modula3Escape "\\['"ntrf]" contained display
+" TODO: limit to <= 377 (255)
+syn match modula3Escape "\\\o\{3}" contained display
+syn match modula3Escape "\\\\" contained display
+
+" Characters
+syn match modula3Character "'\%([^']\|\\.\|\\\o\{3}\)'" contains=modula3Escape
+
+" Strings
+syn region modula3String start=+"+ end=+"+ contains=modula3Escape
+
+" Pragmas {{{1
+" EXTERNAL INLINE ASSERT TRACE FATAL UNUSED OBSOLETE CALLBACK EXPORTED PRAGMA NOWARN LINE LL LL.sup SPEC
+" Documented: INLINE ASSERT TRACE FATAL UNUSED OBSOLETE NOWARN
+syn region modula3Pragma start="<\*" end="\*>"
+
+" Comments {{{1
+if !exists("modula3_no_comment_fold")
+ syn region modula3Comment start="(\*" end="\*)" contains=modula3Comment,@Spell fold
+ syn region modula3LineCommentBlock start="^\s*(\*.*\*)\s*\n\%(^\s*(\*.*\*)\s*$\)\@=" end="^\s*(\*.*\*)\s*\n\%(^\s*(\*.*\*)\s*$\)\@!" contains=modula3Comment transparent fold keepend
+else
+ syn region modula3Comment start="(\*" end="\*)" contains=modula3Comment,@Spell
+endif
+
+" Syncing "{{{1
+syn sync minlines=100
+
+" Default highlighting {{{1
+hi def link modula3Block Statement
+hi def link modula3Boolean Boolean
+hi def link modula3Character Character
+hi def link modula3Comment Comment
+hi def link modula3Escape Special
+hi def link modula3Identifier Keyword
+hi def link modula3Integer Number
+hi def link modula3Keyword Statement
+hi def link modula3Nil Constant
+hi def link modula3IntegerError Error
+hi def link modula3Operator Operator
+hi def link modula3Pragma PreProc
+hi def link modula3Real Float
+hi def link modula3String String
+hi def link modula3Type Type "}}}
+
+let b:current_syntax = "modula3"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/syntax/monk.vim b/runtime/syntax/monk.vim
new file mode 100644
index 0000000..3af8101
--- /dev/null
+++ b/runtime/syntax/monk.vim
@@ -0,0 +1,217 @@
+" Vim syntax file
+" Language: Monk (See-Beyond Technologies)
+" Maintainer: Mike Litherland <litherm@ccf.org>
+" Last Change: 2012 Feb 03 by Thilo Six
+
+" This syntax file is good enough for my needs, but others
+" may desire more features. Suggestions and bug reports
+" are solicited by the author (above).
+
+" Originally based on the Scheme syntax file by:
+
+" Maintainer: Dirk van Deun <dvandeun@poboxes.com>
+" Last Change: April 30, 1998
+
+" In fact it's almost identical. :)
+
+" The original author's notes:
+" 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.
+
+" Initializing:
+
+" 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
+
+" Fascist highlighting: everything that doesn't fit the rules is an error...
+
+syn match monkError oneline ![^ \t()";]*!
+syn match monkError oneline ")"
+
+" Quoted and backquoted stuff
+
+syn region monkQuoted matchgroup=Delimiter start="['`]" end=![ \t()";]!me=e-1 contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+
+syn region monkQuoted matchgroup=Delimiter start="['`](" matchgroup=Delimiter end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+syn region monkQuoted matchgroup=Delimiter start="['`]#(" matchgroup=Delimiter end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+
+syn region monkStrucRestricted matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+syn region monkStrucRestricted matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+
+syn region monkUnquote matchgroup=Delimiter start="," end=![ \t()";]!me=e-1 contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+syn region monkUnquote matchgroup=Delimiter start=",@" end=![ \t()";]!me=e-1 contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+
+syn region monkUnquote matchgroup=Delimiter start=",(" end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+syn region monkUnquote matchgroup=Delimiter start=",@(" end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+
+syn region monkUnquote matchgroup=Delimiter start=",#(" end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+syn region monkUnquote matchgroup=Delimiter start=",@#(" end=")" contains=ALLBUT,monkStruc,monkSyntax,monkFunc
+
+" R5RS Scheme Functions and Syntax:
+
+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 =>
+syn keyword monkSyntax quote quasiquote unquote unquote-splicing
+syn keyword monkSyntax define-syntax let-syntax letrec-syntax syntax-rules
+
+syn keyword monkFunc not boolean? eq? eqv? equal? pair? cons car cdr set-car!
+syn keyword monkFunc set-cdr! caar cadr cdar cddr caaar caadr cadar caddr
+syn keyword monkFunc cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr
+syn keyword monkFunc cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr
+syn keyword monkFunc cddaar cddadr cdddar cddddr null? list? list length
+syn keyword monkFunc append reverse list-ref memq memv member assq assv assoc
+syn keyword monkFunc symbol? symbol->string string->symbol number? complex?
+syn keyword monkFunc real? rational? integer? exact? inexact? = < > <= >=
+syn keyword monkFunc zero? positive? negative? odd? even? max min + * - / abs
+syn keyword monkFunc quotient remainder modulo gcd lcm numerator denominator
+syn keyword monkFunc floor ceiling truncate round rationalize exp log sin cos
+syn keyword monkFunc tan asin acos atan sqrt expt make-rectangular make-polar
+syn keyword monkFunc real-part imag-part magnitude angle exact->inexact
+syn keyword monkFunc inexact->exact number->string string->number char=?
+syn keyword monkFunc char-ci=? char<? char-ci<? char>? char-ci>? char<=?
+syn keyword monkFunc char-ci<=? char>=? char-ci>=? char-alphabetic? char?
+syn keyword monkFunc char-numeric? char-whitespace? char-upper-case?
+syn keyword monkFunc char-lower-case?
+syn keyword monkFunc char->integer integer->char char-upcase char-downcase
+syn keyword monkFunc string? make-string string string-length string-ref
+syn keyword monkFunc string-set! string=? string-ci=? string<? string-ci<?
+syn keyword monkFunc string>? string-ci>? string<=? string-ci<=? string>=?
+syn keyword monkFunc string-ci>=? substring string-append vector? make-vector
+syn keyword monkFunc vector vector-length vector-ref vector-set! procedure?
+syn keyword monkFunc apply map for-each call-with-current-continuation
+syn keyword monkFunc call-with-input-file call-with-output-file input-port?
+syn keyword monkFunc output-port? current-input-port current-output-port
+syn keyword monkFunc open-input-file open-output-file close-input-port
+syn keyword monkFunc close-output-port eof-object? read read-char peek-char
+syn keyword monkFunc write display newline write-char call/cc
+syn keyword monkFunc list-tail string->list list->string string-copy
+syn keyword monkFunc string-fill! vector->list list->vector vector-fill!
+syn keyword monkFunc force with-input-from-file with-output-to-file
+syn keyword monkFunc char-ready? load transcript-on transcript-off eval
+syn keyword monkFunc dynamic-wind port? values call-with-values
+syn keyword monkFunc monk-report-environment null-environment
+syn keyword monkFunc interaction-environment
+
+" Keywords specific to STC's implementation
+
+syn keyword monkFunc $event-clear $event-parse $event->string $make-event-map
+syn keyword monkFunc $resolve-event-definition change-pattern copy copy-strip
+syn keyword monkFunc count-data-children count-map-children count-rep data-map
+syn keyword monkFunc duplicate duplicate-strip file-check file-lookup get
+syn keyword monkFunc insert list-lookup node-has-data? not-verify path?
+syn keyword monkFunc path-defined-as-repeating? path-nodeclear path-nodedepth
+syn keyword monkFunc path-nodename path-nodeparentname path->string path-valid?
+syn keyword monkFunc regex string->path timestamp uniqueid verify
+
+" Keywords from the Monk function library (from e*Gate 4.1 programmers ref)
+syn keyword monkFunc allcap? capitalize char-punctuation? char-substitute
+syn keyword monkFunc char-to-char conv count-used-children degc->degf
+syn keyword monkFunc diff-two-dates display-error empty-string? fail_id
+syn keyword monkFunc fail_id_if fail_translation fail_translation_if
+syn keyword monkFunc find-get-after find-get-before get-timestamp julian-date?
+syn keyword monkFunc julian->standard leap-year? map-string not-empty-string?
+syn keyword monkFunc standard-date? standard->julian string-begins-with?
+syn keyword monkFunc string-contains? string-ends-with? string-search-from-left
+syn keyword monkFunc string-search-from-right string->ssn strip-punct
+syn keyword monkFunc strip-string substring=? symbol-table-get symbol-table-put
+syn keyword monkFunc trim-string-left trim-string-right valid-decimal?
+syn keyword monkFunc valid-integer? verify-type
+
+" Writing out the complete description of Scheme numerals without
+" using variables is a day's work for a trained secretary...
+" This is a useful lax approximation:
+
+syn match monkNumber oneline "[-#+0-9.][-#+/0-9a-f@i.boxesfdl]*"
+syn match monkError oneline ![-#+0-9.][-#+/0-9a-f@i.boxesfdl]*[^-#+/0-9a-f@i.boxesfdl \t()";][^ \t()";]*!
+
+syn match monkOther oneline ![+-][ \t()";]!me=e-1
+syn match monkOther oneline ![+-]$!
+" ... so that a single + or -, inside a quoted context, would not be
+" interpreted as a number (outside such contexts, it's a monkFunc)
+
+syn match monkDelimiter oneline !\.[ \t()";]!me=e-1
+syn match monkDelimiter oneline !\.$!
+" ... and a single dot is not a number but a delimiter
+
+" Simple literals:
+
+syn match monkBoolean oneline "#[tf]"
+syn match monkError oneline !#[tf][^ \t()";]\+!
+
+syn match monkChar oneline "#\\"
+syn match monkChar oneline "#\\."
+syn match monkError oneline !#\\.[^ \t()";]\+!
+syn match monkChar oneline "#\\space"
+syn match monkError oneline !#\\space[^ \t()";]\+!
+syn match monkChar oneline "#\\newline"
+syn match monkError oneline !#\\newline[^ \t()";]\+!
+
+" This keeps all other stuff unhighlighted, except *stuff* and <stuff>:
+
+syn match monkOther oneline ,[a-z!$%&*/:<=>?^_~][-a-z!$%&*/:<=>?^_~0-9+.@]*,
+syn match monkError oneline ,[a-z!$%&*/:<=>?^_~][-a-z!$%&*/:<=>?^_~0-9+.@]*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t()";]\+[^ \t()";]*,
+
+syn match monkOther oneline "\.\.\."
+syn match monkError oneline !\.\.\.[^ \t()";]\+!
+" ... a special identifier
+
+syn match monkConstant oneline ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[ \t()";],me=e-1
+syn match monkConstant oneline ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*$,
+syn match monkError oneline ,\*[-a-z!$%&*/:<=>?^_~0-9+.@]*\*[^-a-z!$%&*/:<=>?^_~0-9+.@ \t()";]\+[^ \t()";]*,
+
+syn match monkConstant oneline ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[ \t()";],me=e-1
+syn match monkConstant oneline ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>$,
+syn match monkError oneline ,<[-a-z!$%&*/:<=>?^_~0-9+.@]*>[^-a-z!$%&*/:<=>?^_~0-9+.@ \t()";]\+[^ \t()";]*,
+
+" Monk input and output structures
+syn match monkSyntax oneline "\(\~input\|\[I\]->\)[^ \t]*"
+syn match monkFunc oneline "\(\~output\|\[O\]->\)[^ \t]*"
+
+" Non-quoted lists, and strings:
+
+syn region monkStruc matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" contains=ALL
+syn region monkStruc matchgroup=Delimiter start="#(" matchgroup=Delimiter end=")" contains=ALL
+
+syn region monkString start=+"+ skip=+\\[\\"]+ end=+"+
+
+" Comments:
+
+syn match monkComment ";.*$"
+
+" 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.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/moo.vim b/runtime/syntax/moo.vim
new file mode 100644
index 0000000..6f2dd59
--- /dev/null
+++ b/runtime/syntax/moo.vim
@@ -0,0 +1,173 @@
+" Vim syntax file
+" Language: MOO
+" Maintainer: Timo Frenay <timo@frenay.net>
+" Last Change: 2020 Oct 19
+" Note: Requires Vim 6.0 or above
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Initializations
+syn case ignore
+
+" C-style comments
+syn match mooUncommentedError display ~\*/~
+syn match mooCStyleCommentError display ~/\ze\*~ contained
+syn region mooCStyleComment matchgroup=mooComment start=~/\*~ end=~\*/~ contains=mooCStyleCommentError
+
+" Statements
+if exists("moo_extended_cstyle_comments")
+ syn match mooIdentifier display ~\%(\%(/\*.\{-}\*/\s*\)*\)\@>\<\h\w*\>~ contained transparent contains=mooCStyleComment,@mooKeyword,mooType,mooVariable
+else
+ syn match mooIdentifier display ~\<\h\w*\>~ contained transparent contains=@mooKeyword,mooType,mooVariable
+endif
+syn keyword mooStatement break continue else elseif endfor endfork endif endtry endwhile finally for if try
+syn keyword mooStatement except fork while nextgroup=mooIdentifier skipwhite
+syn keyword mooStatement return nextgroup=mooString skipwhite
+
+" Operators
+syn keyword mooOperatorIn in
+
+" Error constants
+syn keyword mooAny ANY
+syn keyword mooErrorConstant E_ARGS E_INVARG E_DIV E_FLOAT E_INVIND E_MAXREC E_NACC E_NONE E_PERM E_PROPNF E_QUOTA E_RANGE E_RECMOVE E_TYPE E_VARNF E_VERBNF
+
+" Builtin variables
+syn match mooType display ~\<\%(ERR\|FLOAT\|INT\|LIST\|NUM\|OBJ\|STR\)\>~
+syn match mooVariable display ~\<\%(args\%(tr\)\=\|caller\|dobj\%(str\)\=\|iobj\%(str\)\=\|player\|prepstr\|this\|verb\)\>~
+
+" Strings
+syn match mooStringError display ~[^\t -[\]-~]~ contained
+syn match mooStringSpecialChar display ~\\["\\]~ contained
+if !exists("moo_no_regexp")
+ " Regular expressions
+ syn match mooRegexp display ~%%~ contained containedin=mooString,mooRegexpParentheses transparent contains=NONE
+ syn region mooRegexpParentheses display matchgroup=mooRegexpOr start=~%(~ skip=~%%~ end=~%)~ contained containedin=mooString,mooRegexpParentheses transparent oneline
+ syn match mooRegexpOr display ~%|~ contained containedin=mooString,mooRegexpParentheses
+endif
+if !exists("moo_no_pronoun_sub")
+ " Pronoun substitutions
+ syn match mooPronounSub display ~%%~ contained containedin=mooString transparent contains=NONE
+ syn match mooPronounSub display ~%[#dilnopqrst]~ contained containedin=mooString
+ syn match mooPronounSub display ~%\[#[dilnt]\]~ contained containedin=mooString
+ syn match mooPronounSub display ~%(\h\w*)~ contained containedin=mooString
+ syn match mooPronounSub display ~%\[[dilnt]\h\w*\]~ contained containedin=mooString
+ syn match mooPronounSub display ~%<\%([dilnt]:\)\=\a\+>~ contained containedin=mooString
+endif
+if exists("moo_unmatched_quotes")
+ syn region mooString matchgroup=mooStringError start=~"~ end=~$~ contains=@mooStringContents keepend
+ syn region mooString start=~"~ skip=~\\.~ end=~"~ contains=@mooStringContents oneline keepend
+else
+ syn region mooString start=~"~ skip=~\\.~ end=~"\|$~ contains=@mooStringContents keepend
+endif
+
+" Numbers and object numbers
+syn match mooNumber display ~\%(\%(\<\d\+\)\=\.\d\+\|\<\d\+\)\%(e[+\-]\=\d\+\)\=\>~
+syn match mooObject display ~#-\=\d\+\>~
+
+" Properties and verbs
+if exists("moo_builtin_properties")
+ "Builtin properties
+ syn keyword mooBuiltinProperty contents f location name owner programmer r w wizard contained containedin=mooPropRef
+endif
+if exists("moo_extended_cstyle_comments")
+ syn match mooPropRef display ~\.\s*\%(\%(/\*.\{-}\*/\s*\)*\)\@>\h\w*\>~ transparent contains=mooCStyleComment,@mooKeyword
+ syn match mooVerbRef display ~:\s*\%(\%(/\*.\{-}\*/\s*\)*\)\@>\h\w*\>~ transparent contains=mooCStyleComment,@mooKeyword
+else
+ syn match mooPropRef display ~\.\s*\h\w*\>~ transparent contains=@mooKeyword
+ syn match mooVerbRef display ~:\s*\h\w*\>~ transparent contains=@mooKeyword
+endif
+
+" Builtin functions, core properties and core verbs
+if exists("moo_extended_cstyle_comments")
+ syn match mooBuiltinFunction display ~\<\h\w*\s*\%(\%(/\*.\{-}\*/\s*\)*\)\@>\ze(~ contains=mooCStyleComment
+ syn match mooCorePropOrVerb display ~\$\s*\%(\%(/\*.\{-}\*/\s*\)*\)\@>\%(in\>\)\@!\h\w*\>~ contains=mooCStyleComment,@mooKeyword
+else
+ syn match mooBuiltinFunction display ~\<\h\w*\s*\ze(~ contains=NONE
+ syn match mooCorePropOrVerb display ~\$\s*\%(in\>\)\@!\h\w*\>~ contains=@mooKeyword
+endif
+if exists("moo_unknown_builtin_functions")
+ syn match mooUnknownBuiltinFunction ~\<\h\w*\>~ contained containedin=mooBuiltinFunction contains=mooKnownBuiltinFunction
+ " Known builtin functions as of version 1.8.1 of the server
+ " Add your own extensions to this group if you like
+ syn keyword mooKnownBuiltinFunction abs acos add_property add_verb asin atan binary_hash boot_player buffered_output_length callers caller_perms call_function ceil children chparent clear_property connected_players connected_seconds connection_name connection_option connection_options cos cosh create crypt ctime db_disk_size decode_binary delete_property delete_verb disassemble dump_database encode_binary equal eval exp floatstr floor flush_input force_input function_info idle_seconds index is_clear_property is_member is_player kill_task length listappend listdelete listen listeners listinsert listset log log10 match max max_object memory_usage min move notify object_bytes open_network_connection output_delimiters parent pass players properties property_info queued_tasks queue_info raise random read recycle renumber reset_max_object resume rindex rmatch seconds_left server_log server_version setadd setremove set_connection_option set_player_flag set_property_info set_task_perms set_verb_args set_verb_code set_verb_info shutdown sin sinh sqrt strcmp string_hash strsub substitute suspend tan tanh task_id task_stack ticks_left time tofloat toint toliteral tonum toobj tostr trunc typeof unlisten valid value_bytes value_hash verbs verb_args verb_code verb_info contained
+endif
+
+" Enclosed expressions
+syn match mooUnenclosedError display ~[')\]|}]~
+syn match mooParenthesesError display ~[';\]|}]~ contained
+syn region mooParentheses start=~(~ end=~)~ transparent contains=@mooEnclosedContents,mooParenthesesError
+syn match mooBracketsError display ~[');|}]~ contained
+syn region mooBrackets start=~\[~ end=~\]~ transparent contains=@mooEnclosedContents,mooBracketsError
+syn match mooBracesError display ~[');\]|]~ contained
+syn region mooBraces start=~{~ end=~}~ transparent contains=@mooEnclosedContents,mooBracesError
+syn match mooQuestionError display ~[');\]}]~ contained
+syn region mooQuestion start=~?~ end=~|~ transparent contains=@mooEnclosedContents,mooQuestionError
+syn match mooCatchError display ~[);\]|}]~ contained
+syn region mooCatch matchgroup=mooExclamation start=~`~ end=~'~ transparent contains=@mooEnclosedContents,mooCatchError,mooExclamation
+if exists("moo_extended_cstyle_comments")
+ syn match mooExclamation display ~[\t !%&(*+,\-/<=>?@[^`{|]\@<!\s*\%(\%(/\*.\{-}\*/\s*\)*\)\@>!=\@!~ contained contains=mooCStyleComment
+else
+ syn match mooExclamation display ~[\t !%&(*+,\-/<=>?@[^`{|]\@<!\s*!=\@!~ contained
+endif
+
+" Comments
+syn match mooCommentSpecialChar display ~\\["\\]~ contained transparent contains=NONE
+syn match mooComment ~[\t !%&*+,\-/<=>?@^|]\@<!\s*"\([^\"]\|\\.\)*"\s*;~ contains=mooStringError,mooCommentSpecialChar
+
+" Non-code
+syn region mooNonCode start=~^\s*@\<~ end=~$~
+syn match mooNonCode display ~^\.$~
+syn match mooNonCode display ~^\s*\d\+:~he=e-1
+
+" Overriding matches
+syn match mooRangeOperator display ~\.\.~ transparent contains=NONE
+syn match mooOrOperator display ~||~ transparent contains=NONE
+if exists("moo_extended_cstyle_comments")
+ syn match mooScattering ~[,{]\@<=\s*\%(\%(/\*.\{-}\*/\s*\)*\)\@>?~ transparent contains=mooCStyleComment
+else
+ syn match mooScattering ~[,{]\@<=\s*?~ transparent contains=NONE
+endif
+
+" Clusters
+syn cluster mooKeyword contains=mooStatement,mooOperatorIn,mooAny,mooErrorConstant
+syn cluster mooStringContents contains=mooStringError,mooStringSpecialChar
+syn cluster mooEnclosedContents contains=TOP,mooUnenclosedError,mooComment,mooNonCode
+
+" Define the default highlighting.
+hi def link mooUncommentedError Error
+hi def link mooCStyleCommentError Error
+hi def link mooCStyleComment Comment
+hi def link mooStatement Statement
+hi def link mooOperatorIn Operator
+hi def link mooAny Constant " link this to Keyword if you want
+hi def link mooErrorConstant Constant
+hi def link mooType Type
+hi def link mooVariable Type
+hi def link mooStringError Error
+hi def link mooStringSpecialChar SpecialChar
+hi def link mooRegexpOr SpecialChar
+hi def link mooPronounSub SpecialChar
+hi def link mooString String
+hi def link mooNumber Number
+hi def link mooObject Number
+hi def link mooBuiltinProperty Type
+hi def link mooBuiltinFunction Function
+hi def link mooUnknownBuiltinFunction Error
+hi def link mooKnownBuiltinFunction Function
+hi def link mooCorePropOrVerb Identifier
+hi def link mooUnenclosedError Error
+hi def link mooParenthesesError Error
+hi def link mooBracketsError Error
+hi def link mooBracesError Error
+hi def link mooQuestionError Error
+hi def link mooCatchError Error
+hi def link mooExclamation Exception
+hi def link mooComment Comment
+hi def link mooNonCode PreProc
+
+let b:current_syntax = "moo"
+
+" vim: ts=8
diff --git a/runtime/syntax/mp.vim b/runtime/syntax/mp.vim
new file mode 100644
index 0000000..36c07e6
--- /dev/null
+++ b/runtime/syntax/mp.vim
@@ -0,0 +1,273 @@
+vim9script
+
+# Vim syntax file
+# Language: MetaPost
+# Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com>
+# Former Maintainers: Andreas Scherer <andreas.scherer@pobox.com>
+# Latest Revision: 2022 Aug 12
+
+if exists("b:current_syntax")
+ finish
+endif
+
+# Deprecation warnings: to be removed eventually
+if exists("g:plain_mp_macros")
+ echomsg "[mp] g:plain_mp_macros is deprecated: use g:mp_plain_macros instead."
+endif
+if exists("mfplain_mp_macros")
+ echomsg "[mp] g:mfplain_mp_macros is deprecated: use g:mp_mfplain_macros instead."
+endif
+if exists("other_mp_macros")
+ echomsg "[mp] g:other_mp_macros is deprecated: use g:mp_other_macros instead."
+endif
+
+# Store the current values of METAFONT global options
+const mf_plain_macros = get(g:, "mf_plain_macros", get(g:, "plain_mf_macros", -1))
+const mf_plain_modes = get(g:, "mf_plain_modes", get(g:, "plain_mf_modes", -1))
+const mf_other_macros = get(g:, "mf_other_macros", get(g:, "other_mf_macros", -1))
+
+g:mf_plain_macros = 0 # plain.mf has no special meaning for MetaPost
+g:mf_plain_modes = 0 # No METAFONT modes
+g:mf_other_macros = 0 # cmbase.mf, logo.mf, ... neither
+
+# 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 mf_plain_macros == -1
+ unlet g:mf_plain_macros
+else
+ g:plain_mf_macros = mf_plain_macros
+endif
+if mf_plain_modes == -1
+ unlet g:mf_plain_modes
+else
+ g:mf_plain_modes = mf_plain_modes
+endif
+if mf_other_macros == -1
+ unlet g:mf_other_macros
+else
+ g:mf_other_macros = mf_other_macros
+endif
+
+# 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 matchgroup=mpTeXdelim start=/\<verbatimtex\>\|\<btex\>/ end=/\<etex\>/ keepend contains=@MPTeX,mpTeXdelim
+
+# 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 @,_
+
+# 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
+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 get(g:, "mp_plain_macros", get(g:, "plain_mp_macros", 1)) || get(b:, "mp_metafun", get(g:, "mp_metafun", 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 keyword mpVariable laboff labxf labyf laboff labxf labyf
+ syn match mpVariable /\.\%(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 get(g:, "mp_mfplain_macros", 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 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 all base macro packages:
+# - (r)boxes.mp
+# - format.mp
+# - graph.mp
+# - marith.mp
+# - sarith.mp
+# - string.mp
+# - TEX.mp
+if get(g:, "mp_other_macros", 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
+
+if get(b:, "mp_metafun", get(g:, "mp_metafun", 0))
+ # MetaFun additions to MetaPost base file
+ syn keyword mpConstant cyan magenta yellow
+ syn keyword mpConstant penspec
+ syn keyword mpNumExp graypart greycolor graycolor
+
+ # Highlight TeX keywords (for MetaPost embedded in ConTeXt documents)
+ syn match mpTeXKeyword '\\[a-zA-Z@]\+'
+
+ syn keyword mpPrimitive runscript
+
+ runtime! syntax/shared/context-data-metafun.vim
+
+ hi def link metafunCommands Statement
+ hi def link metafunInternals Identifier
+endif
+
+# Define the default highlighting
+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
+
+b:current_syntax = "mp"
+
+# vim: sw=2 fdm=marker
diff --git a/runtime/syntax/mplayerconf.vim b/runtime/syntax/mplayerconf.vim
new file mode 100644
index 0000000..84ad2da
--- /dev/null
+++ b/runtime/syntax/mplayerconf.vim
@@ -0,0 +1,128 @@
+" Vim syntax file
+" Language: mplayer(1) configuration file
+" Maintainer: Dmitri Vereshchagin <dmitri.vereshchagin@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2015-01-24
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-
+
+syn keyword mplayerconfTodo contained TODO FIXME XXX NOTE
+
+syn region mplayerconfComment display oneline start='#' end='$'
+ \ contains=mplayerconfTodo,@Spell
+
+syn keyword mplayerconfPreProc include
+
+syn keyword mplayerconfBoolean yes no true false
+
+syn match mplayerconfNumber '\<\d\+\>'
+
+syn keyword mplayerconfOption hardframedrop nomouseinput bandwidth dumpstream
+ \ rtsp-stream-over-tcp tv overlapsub
+ \ sub-bg-alpha subfont-outline unicode format
+ \ vo edl cookies fps zrfd af-adv nosound
+ \ audio-density passlogfile vobsuboutindex autoq
+ \ autosync benchmark colorkey nocolorkey edlout
+ \ enqueue fixed-vo framedrop h identify input
+ \ lircconf list-options loop menu menu-cfg
+ \ menu-root nojoystick nolirc nortc playlist
+ \ quiet really-quiet shuffle skin slave
+ \ softsleep speed sstep use-stdin aid alang
+ \ audio-demuxer audiofile audiofile-cache
+ \ cdrom-device cache cdda channels chapter
+ \ cookies-file demuxer dumpaudio dumpfile
+ \ dumpvideo dvbin dvd-device dvdangle forceidx
+ \ frames hr-mp3-seek idx ipv4-only-proxy
+ \ loadidx mc mf ni nobps noextbased
+ \ passwd prefer-ipv4 prefer-ipv6 rawaudio
+ \ rawvideo saveidx sb srate ss tskeepbroken
+ \ tsprog tsprobe user user-agent vid vivo
+ \ dumpjacosub dumpmicrodvdsub dumpmpsub dumpsami
+ \ dumpsrtsub dumpsub ffactor flip-hebrew font
+ \ forcedsubsonly fribidi-charset ifo noautosub
+ \ osdlevel sid slang spuaa spualign spugauss
+ \ sub sub-bg-color sub-demuxer sub-fuzziness
+ \ sub-no-text-pp subalign subcc subcp subdelay
+ \ subfile subfont-autoscale subfont-blur
+ \ subfont-encoding subfont-osd-scale
+ \ subfont-text-scale subfps subpos subwidth
+ \ utf8 vobsub vobsubid abs ao aofile aop delay
+ \ mixer nowaveheader aa bpp brightness contrast
+ \ dfbopts display double dr dxr2 fb fbmode
+ \ fbmodeconfig forcexv fs fsmode-dontuse fstype
+ \ geometry guiwid hue jpeg monitor-dotclock
+ \ monitor-hfreq monitor-vfreq monitoraspect
+ \ nograbpointer nokeepaspect noxv ontop panscan
+ \ rootwin saturation screenw stop-xscreensaver
+ \ vm vsync wid xineramascreen z zrbw zrcrop
+ \ zrdev zrhelp zrnorm zrquality zrvdec zrxdoff
+ \ ac af afm aspect flip lavdopts noaspect
+ \ noslices novideo oldpp pp pphelp ssf stereo
+ \ sws vc vfm x xvidopts xy y zoom vf vop
+ \ audio-delay audio-preload endpos ffourcc
+ \ include info noautoexpand noskip o oac of
+ \ ofps ovc skiplimit v vobsubout vobsuboutid
+ \ lameopts lavcopts nuvopts xvidencopts a52drc
+ \ adapter af-add af-clr af-del af-pre
+ \ allow-dangerous-playlist-parsing ass
+ \ ass-border-color ass-bottom-margin ass-color
+ \ ass-font-scale ass-force-style ass-hinting
+ \ ass-line-spacing ass-styles ass-top-margin
+ \ ass-use-margins ausid bluray-angle
+ \ bluray-device border border-pos-x border-pos-y
+ \ cache-min cache-seek-min capture codecpath
+ \ codecs-file correct-pts crash-debug
+ \ doubleclick-time dvd-speed edl-backward-delay
+ \ edl-start-pts embeddedfonts fafmttag
+ \ field-dominance fontconfig force-avi-aspect
+ \ force-key-frames frameno-file fullscreen gamma
+ \ gui gui-include gui-wid heartbeat-cmd
+ \ heartbeat-interval hr-edl-seek
+ \ http-header-fields idle ignore-start
+ \ key-fifo-size list-properties menu-chroot
+ \ menu-keepdir menu-startup mixer-channel
+ \ monitor-orientation monitorpixelaspect
+ \ mouse-movements msgcharset msgcolor msglevel
+ \ msgmodule name noar nocache noconfig
+ \ noconsolecontrols nocorrect-pts nodouble
+ \ noedl-start-pts noencodedups
+ \ noflip-hebrew-commas nogui noidx noodml
+ \ nostop-xscreensaver nosub noterm-osd
+ \ osd-duration osd-fractions panscanrange
+ \ pausing playing-msg priority profile
+ \ progbar-align psprobe pvr radio referrer
+ \ refreshrate reuse-socket rtc rtc-device
+ \ rtsp-destination rtsp-port
+ \ rtsp-stream-over-http screenh show-profile
+ \ softvol softvol-max sub-paths subfont
+ \ term-osd-esc title tvscan udp-ip udp-master
+ \ udp-port udp-seek-threshold udp-slave
+ \ unrarexec use-filedir-conf use-filename-title
+ \ vf-add vf-clr vf-del vf-pre volstep volume
+ \ zrhdec zrydoff
+
+syn region mplayerconfString display oneline start=+"+ end=+"+
+syn region mplayerconfString display oneline start=+'+ end=+'+
+
+syn region mplayerconfProfile display oneline start='^\s*\[' end='\]'
+
+hi def link mplayerconfTodo Todo
+hi def link mplayerconfComment Comment
+hi def link mplayerconfPreProc PreProc
+hi def link mplayerconfBoolean Boolean
+hi def link mplayerconfNumber Number
+hi def link mplayerconfOption Keyword
+hi def link mplayerconfString String
+hi def link mplayerconfProfile Special
+
+let b:current_syntax = "mplayerconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/mrxvtrc.vim b/runtime/syntax/mrxvtrc.vim
new file mode 100644
index 0000000..2ef434d
--- /dev/null
+++ b/runtime/syntax/mrxvtrc.vim
@@ -0,0 +1,282 @@
+" Description : Vim syntax file for mrxvtrc (for mrxvt-0.5.0 and up)
+" Created : Wed 26 Apr 2006 01:20:53 AM CDT
+" Modified : Thu 02 Feb 2012 08:37:45 PM EST
+" Maintainer : GI <a@b.c>, where a='gi1242+vim', b='gmail', c='com'
+
+" 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 match
+
+" Errors
+syn match mrxvtrcError contained '\v\S+'
+
+" Comments
+syn match mrxvtrcComment contains=@Spell '^\s*[!#].*$'
+syn match mrxvtrcComment '\v^\s*[#!]\s*\w+[.*]\w+.*:.*'
+
+"
+" Options.
+"
+syn match mrxvtrcClass '\v^\s*\w+[.*]'
+ \ nextgroup=mrxvtrcOptions,mrxvtrcProfile,@mrxvtrcPOpts,mrxvtrcError
+
+" Boolean options
+syn keyword mrxvtrcOptions contained nextgroup=mrxvtrcBColon,mrxvtrcError
+ \ highlightTabOnBell syncTabTitle hideTabbar
+ \ autohideTabbar bottomTabbar hideButtons
+ \ syncTabIcon veryBoldFont maximized
+ \ fullscreen reverseVideo loginShell
+ \ jumpScroll scrollBar scrollbarRight
+ \ scrollbarFloating scrollTtyOutputInhibit
+ \ scrollTtyKeypress transparentForce
+ \ transparentScrollbar transparentMenubar
+ \ transparentTabbar tabUsePixmap utmpInhibit
+ \ visualBell mapAlert meta8
+ \ mouseWheelScrollPage multibyte_cursor
+ \ tripleclickwords showMenu xft xftNomFont
+ \ xftSlowOutput xftAntialias xftHinting
+ \ xftAutoHint xftGlobalAdvance cmdAllTabs
+ \ protectSecondary thai borderLess
+ \ overrideRedirect broadcast smartResize
+ \ pointerBlank cursorBlink noSysConfig
+ \ disableMacros linuxHomeEndKey sessionMgt
+ \ boldColors smoothResize useFifo veryBright
+syn match mrxvtrcOptions contained nextgroup=mrxvtrcBColon,mrxvtrcError
+ \ '\v<transparent>'
+syn match mrxvtrcBColon contained skipwhite
+ \ nextgroup=mrxvtrcBoolVal,mrxvtrcError ':'
+syn case ignore
+syn keyword mrxvtrcBoolVal contained skipwhite nextgroup=mrxvtrcError
+ \ 0 1 yes no on off true false
+syn case match
+
+" Color options
+syn keyword mrxvtrcOptions contained nextgroup=mrxvtrcCColon,mrxvtrcError
+ \ ufBackground textShadow tabForeground
+ \ itabForeground tabBackground itabBackground
+ \ scrollColor troughColor highlightColor
+ \ cursorColor cursorColor2 pointerColor
+ \ borderColor tintColor
+syn match mrxvtrcOptions contained nextgroup=mrxvtrcCColon,mrxvtrcError
+ \ '\v<color([0-9]|1[0-5]|BD|UL|RV)>'
+syn match mrxvtrcCColon contained skipwhite
+ \ nextgroup=mrxvtrcColorVal ':'
+syn match mrxvtrcColorVal contained skipwhite nextgroup=mrxvtrcError
+ \ '\v#[0-9a-fA-F]{6}'
+
+" Numeric options
+syn keyword mrxvtrcOptions contained nextgroup=mrxvtrcNColon,mrxvtrcError
+ \ maxTabWidth minVisibleTabs
+ \ scrollbarThickness xftmSize xftSize desktop
+ \ externalBorder internalBorder lineSpace
+ \ pointerBlankDelay cursorBlinkInterval
+ \ shading backgroundFade bgRefreshInterval
+ \ fading opacity opacityDegree xftPSize
+syn match mrxvtrcNColon contained skipwhite
+ \ nextgroup=mrxvtrcNumVal,mrxvtrcError ':'
+syn match mrxvtrcNumVal contained skipwhite nextgroup=mrxvtrcError
+ \ '\v[+-]?<(0[0-7]+|\d+|0x[0-9a-f]+)>'
+
+" String options
+syn keyword mrxvtrcOptions contained nextgroup=mrxvtrcSColon,mrxvtrcError
+ \ tabTitle termName title clientName iconName
+ \ bellCommand backspaceKey deleteKey
+ \ printPipe cutChars answerbackString
+ \ smClientID geometry path boldFont xftFont
+ \ xftmFont xftPFont inputMethod
+ \ greektoggle_key menu menubarPixmap
+ \ scrollbarPixmap tabbarPixmap appIcon
+ \ multichar_encoding initProfileList
+syn match mrxvtrcOptions contained nextgroup=mrxvtrcSColon,mrxvtrcError
+ \ '\v<m?font[1-5]?>'
+syn match mrxvtrcSColon contained skipwhite nextgroup=mrxvtrcStrVal ':'
+syn match mrxvtrcStrVal contained '\v\S.*'
+
+" Profile options
+syn cluster mrxvtrcPOpts contains=mrxvtrcPSOpts,mrxvtrcPCOpts,mrxvtrcPNOpts
+syn match mrxvtrcProfile contained nextgroup=@mrxvtrcPOpts,mrxvtrcError
+ \ '\vprofile\d+\.'
+syn keyword mrxvtrcPSOpts contained nextgroup=mrxvtrcSColon,mrxvtrcError
+ \ tabTitle command holdExitText holdExitTitle
+ \ Pixmap workingDirectory titleFormat
+ \ winTitleFormat
+syn keyword mrxvtrcPCOpts contained nextgroup=mrxvtrcCColon,mrxvtrcError
+ \ background foreground
+syn keyword mrxvtrcPNOpts contained nextgroup=mrxvtrcNColon,mrxvtrcError
+ \ holdExit saveLines
+
+" scrollbarStyle
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcSBstyle,mrxvtrcError
+ \ '\v<scrollbarStyle:'
+syn keyword mrxvtrcSBstyle contained skipwhite nextgroup=mrxvtrcError
+ \ plain xterm rxvt next sgi
+
+" scrollbarAlign
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcSBalign,mrxvtrcError
+ \ '\v<scrollbarAlign:'
+syn keyword mrxvtrcSBalign contained skipwhite nextgroup=mrxvtrcError
+ \ top bottom
+
+" textShadowMode
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcTSmode,mrxvtrcError
+ \ '\v<textShadowMode:'
+syn keyword mrxvtrcTSmode contained skipwhite nextgroup=mrxvtrcError
+ \ none top bottom left right topleft topright
+ \ botleft botright
+
+" greek_keyboard
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcGrkKbd,mrxvtrcError
+ \ '\v<greek_keyboard:'
+syn keyword mrxvtrcGrkKbd contained skipwhite nextgroup=mrxvtrcError
+ \ iso ibm
+
+" xftWeight
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcXftWt,mrxvtrcError
+ \ '\v<(xftWeight|xftBoldWeight):'
+syn keyword mrxvtrcXftWt contained skipwhite nextgroup=mrxvtrcError
+ \ light medium demibold bold black
+
+" xftSlant
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcXftSl,mrxvtrcError
+ \ '\v<xftSlant:'
+syn keyword mrxvtrcXftSl contained skipwhite nextgroup=mrxvtrcError
+ \ roman italic oblique
+
+" xftWidth
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcXftWd,mrxvtrcError
+ \ '\v<xftWidth:'
+syn keyword mrxvtrcXftWd contained skipwhite nextgroup=mrxvtrcError
+ \ ultracondensed ultraexpanded
+ \ condensed expanded normal
+
+" xftRGBA
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcXftHt,mrxvtrcError
+ \ '\v<xftRGBA:'
+syn keyword mrxvtrcXftHt contained skipwhite nextgroup=mrxvtrcError
+ \ rgb bgr vrgb vbgr none
+
+" preeditType
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcPedit,mrxvtrcError
+ \ '\v<preeditType:'
+syn keyword mrxvtrcPedit contained skipwhite nextgroup=mrxvtrcError
+ \ OverTheSpot OffTheSpot Root
+
+" modifier
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcMod,mrxvtrcError
+ \ '\v<modifier:'
+syn keyword mrxvtrcMod contained skipwhite nextgroup=mrxvtrcError
+ \ alt meta hyper super mod1 mod2 mod3 mod4 mod5
+
+" selectStyle
+syn match mrxvtrcOptions contained skipwhite
+ \ nextgroup=mrxvtrcSelSty,mrxvtrcError
+ \ '\v<selectStyle:'
+syn keyword mrxvtrcSelSty contained skipwhite nextgroup=mrxvtrcError
+ \ old oldword
+
+
+"
+" Macros
+"
+syn keyword mrxvtrcOptions contained nextgroup=mrxvtrcKey,mrxvtrcError
+ \ macro
+syn case ignore
+syn match mrxvtrcKey contained skipwhite
+ \ nextgroup=mrxvtrcMacro,mrxvtrcError
+ \ '\v\.((primary|add|ctrl|alt|meta|shift)\+)*\w+:'
+syn case match
+
+" Macros without arguments
+syn keyword mrxvtrcMacro contained skipwhite nextgroup=mrxvtrcError
+ \ Dummy Copy Paste ToggleVeryBold
+ \ ToggleTransparency ToggleBroadcast
+ \ ToggleHold SetTitle ToggleMacros
+ \ ToggleFullscreen Raise
+
+" Macros with a string argument
+syn keyword mrxvtrcMacro contained skipwhite nextgroup=mrxvtrcStrVal
+ \ Esc Str Exec Scroll PrintScreen SaveConfig
+
+" Macros with a numeric argument
+syn keyword mrxvtrcMacro contained skipwhite
+ \ nextgroup=mrxvtrcNumVal,mrxvtrcError
+ \ Close GotoTab MoveTab ResizeFont UseFifo
+
+" NewTab macro
+syn keyword mrxvtrcMacro contained skipwhite
+ \ nextgroup=mrxvtrcTitle,mrxvtrcShell,mrxvtrcCmd
+ \ NewTab
+syn region mrxvtrcTitle contained oneline skipwhite
+ \ nextgroup=mrxvtrcShell,mrxvtrcCmd
+ \ start='"' end='"'
+syn match mrxvtrcShell contained nextgroup=mrxvtrcCmd '!'
+syn match mrxvtrcCmd contained '\v[^!" \t].*'
+
+" ToggleSubwin macro
+syn keyword mrxvtrcMacro contained skipwhite
+ \ nextgroup=mrxvtrcSubwin,mrxvtrcError
+ \ ToggleSubwin
+syn match mrxvtrcSubwin contained skipwhite nextgroup=mrxvtrcError
+ \ '\v[-+]?[bmst]>'
+
+"
+" Highlighting groups
+"
+hi def link mrxvtrcError Error
+hi def link mrxvtrcComment Comment
+
+hi def link mrxvtrcClass Statement
+hi def link mrxvtrcOptions mrxvtrcClass
+hi def link mrxvtrcBColon mrxvtrcClass
+hi def link mrxvtrcCColon mrxvtrcClass
+hi def link mrxvtrcNColon mrxvtrcClass
+hi def link mrxvtrcSColon mrxvtrcClass
+hi def link mrxvtrcProfile mrxvtrcClass
+hi def link mrxvtrcPSOpts mrxvtrcClass
+hi def link mrxvtrcPCOpts mrxvtrcClass
+hi def link mrxvtrcPNOpts mrxvtrcClass
+
+hi def link mrxvtrcBoolVal Boolean
+hi def link mrxvtrcStrVal String
+hi def link mrxvtrcColorVal Constant
+hi def link mrxvtrcNumVal Number
+
+hi def link mrxvtrcSBstyle mrxvtrcStrVal
+hi def link mrxvtrcSBalign mrxvtrcStrVal
+hi def link mrxvtrcTSmode mrxvtrcStrVal
+hi def link mrxvtrcGrkKbd mrxvtrcStrVal
+hi def link mrxvtrcXftWt mrxvtrcStrVal
+hi def link mrxvtrcXftSl mrxvtrcStrVal
+hi def link mrxvtrcXftWd mrxvtrcStrVal
+hi def link mrxvtrcXftHt mrxvtrcStrVal
+hi def link mrxvtrcPedit mrxvtrcStrVal
+hi def link mrxvtrcMod mrxvtrcStrVal
+hi def link mrxvtrcSelSty mrxvtrcStrVal
+
+hi def link mrxvtrcMacro Identifier
+hi def link mrxvtrcKey mrxvtrcClass
+hi def link mrxvtrcTitle mrxvtrcStrVal
+hi def link mrxvtrcShell Special
+hi def link mrxvtrcCmd PreProc
+hi def link mrxvtrcSubwin mrxvtrcStrVal
+
+let b:current_syntax = "mrxvtrc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/msidl.vim b/runtime/syntax/msidl.vim
new file mode 100644
index 0000000..57eaeca
--- /dev/null
+++ b/runtime/syntax/msidl.vim
@@ -0,0 +1,84 @@
+" Vim syntax file
+" Language: MS IDL (Microsoft dialect of Interface Description Language)
+" Maintainer: Vadim Zeitlin <vadim@wxwindows.org>
+" Last Change: 2012 Feb 12 by Thilo Six
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Misc basic
+syn match msidlId "[a-zA-Z][a-zA-Z0-9_]*"
+syn match msidlUUID "{\?[[:xdigit:]]\{8}-\([[:xdigit:]]\{4}-\)\{3}[[:xdigit:]]\{12}}\?"
+syn region msidlString start=/"/ skip=/\\\(\\\\\)*"/ end=/"/
+syn match msidlLiteral "\d\+\(\.\d*\)\="
+syn match msidlLiteral "\.\d\+"
+syn match msidlSpecial contained "[]\[{}:]"
+
+" Comments
+syn keyword msidlTodo contained TODO FIXME XXX
+syn region msidlComment start="/\*" end="\*/" contains=msidlTodo
+syn match msidlComment "//.*" contains=msidlTodo
+syn match msidlCommentError "\*/"
+
+" C style Preprocessor
+syn region msidlIncluded contained start=+"+ skip=+\\\(\\\\\)*"+ end=+"+
+syn match msidlIncluded contained "<[^>]*>"
+syn match msidlInclude "^[ \t]*#[ \t]*include\>[ \t]*["<]" contains=msidlIncluded,msidlString
+syn region msidlPreCondit start="^[ \t]*#[ \t]*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=msidlComment,msidlCommentError
+syn region msidlDefine start="^[ \t]*#[ \t]*\(define\>\|undef\>\)" skip="\\$" end="$" contains=msidlLiteral, msidlString
+
+" Attributes
+syn keyword msidlAttribute contained in out propget propput propputref retval
+syn keyword msidlAttribute contained aggregatable appobject binadable coclass control custom default defaultbind defaultcollelem defaultvalue defaultvtable dispinterface displaybind dual entry helpcontext helpfile helpstring helpstringdll hidden id immediatebind lcid library licensed nonbrowsable noncreatable nonextensible oleautomation optional object public readonly requestedit restricted source string uidefault usesgetlasterror vararg version
+syn match msidlAttribute /uuid(.*)/he=s+4 contains=msidlUUID
+syn match msidlAttribute /helpstring(.*)/he=s+10 contains=msidlString
+syn region msidlAttributes start="\[" end="]" keepend contains=msidlSpecial,msidlString,msidlAttribute,msidlComment,msidlCommentError
+
+" Keywords
+syn keyword msidlEnum enum
+syn keyword msidlImport import importlib
+syn keyword msidlStruct interface library coclass
+syn keyword msidlTypedef typedef
+
+" Types
+syn keyword msidlStandardType byte char double float hyper int long short void wchar_t
+syn keyword msidlStandardType BOOL BSTR HRESULT VARIANT VARIANT_BOOL
+syn region msidlSafeArray start="SAFEARRAY(" end=")" contains=msidlStandardType
+
+syn sync lines=50
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vi: set ts=8 sw=4:
diff --git a/runtime/syntax/msmessages.vim b/runtime/syntax/msmessages.vim
new file mode 100644
index 0000000..5faee97
--- /dev/null
+++ b/runtime/syntax/msmessages.vim
@@ -0,0 +1,132 @@
+" Vim syntax file
+" Language: MS Message Text files (*.mc)
+" Maintainer: Kevin Locke <kwl7@cornell.edu>
+" Last Change: 2008 April 09
+" Location: http://kevinlocke.name/programs/vim/syntax/msmessages.vim
+
+" See format description at <http://msdn2.microsoft.com/en-us/library/aa385646.aspx>
+" This file is based on the rc.vim and c.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Common MS Messages keywords
+syn case ignore
+syn keyword msmessagesIdentifier MessageIdTypedef
+syn keyword msmessagesIdentifier SeverityNames
+syn keyword msmessagesIdentifier FacilityNames
+syn keyword msmessagesIdentifier LanguageNames
+syn keyword msmessagesIdentifier OutputBase
+
+syn keyword msmessagesIdentifier MessageId
+syn keyword msmessagesIdentifier Severity
+syn keyword msmessagesIdentifier Facility
+syn keyword msmessagesIdentifier OutputBase
+
+syn match msmessagesIdentifier /\<SymbolicName\>/ nextgroup=msmessagesIdentEq skipwhite
+syn match msmessagesIdentEq transparent /=/ nextgroup=msmessagesIdentDef skipwhite contained
+syn match msmessagesIdentDef display /\w\+/ contained
+" Note: The Language keyword is highlighted as part of an msmessagesLangEntry
+
+" Set value
+syn case match
+syn region msmessagesSet start="(" end=")" transparent fold contains=msmessagesName keepend
+syn match msmessagesName /\w\+/ nextgroup=msmessagesSetEquals skipwhite contained
+syn match msmessagesSetEquals /=/ display transparent nextgroup=msmessagesNumVal skipwhite contained
+syn match msmessagesNumVal display transparent "\<\d\|\.\d" contains=msmessagesNumber,msmessagesFloat,msmessagesOctalError,msmessagesOctal nextgroup=msmessagesValSep
+syn match msmessagesValSep /:/ display nextgroup=msmessagesNameDef contained
+syn match msmessagesNameDef /\w\+/ display contained
+
+
+" Comments are converted to C source (by removing leading ;)
+" So we highlight the comments as C
+syn include @msmessagesC syntax/c.vim
+unlet b:current_syntax
+syn region msmessagesCComment matchgroup=msmessagesComment start=/;/ end=/$/ contains=@msmessagesC keepend
+
+" String and Character constants
+" Highlight special characters (those which have a escape) differently
+syn case ignore
+syn region msmessagesLangEntry start=/\<Language\>\s*=\s*\S\+\s*$/hs=e+1 end=/^\./ contains=msmessagesFormat,msmessagesLangEntryEnd,msmessagesLanguage keepend
+syn match msmessagesLanguage /\<Language\(\s*=\)\@=/ contained
+syn match msmessagesLangEntryEnd display /^\./ contained
+syn case match
+syn match msmessagesFormat display /%[1-9]\d\?\(![-+0 #]*\d*\(\.\d\+\)\?\(h\|l\|ll\|I\|I32\|I64\)\?[aAcCdeEfgGinopsSuxX]!\)\?/ contained
+syn match msmessagesFormat display /%[0.%\\br]/ contained
+syn match msmessagesFormat display /%!\(\s\)\@=/ contained
+
+" Integer number, or floating point number without a dot and with "f".
+" Copied from c.vim
+syn case ignore
+"(long) integer
+syn match msmessagesNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
+"hex number
+syn match msmessagesNumber display contained "\<0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+" Flag the first zero of an octal number as something special
+syn match msmessagesOctal display contained "\<0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=msmessagesOctalZero
+syn match msmessagesOctalZero display contained "\<0"
+" flag an octal number with wrong digits
+syn match msmessagesOctalError display contained "\<0\o*[89]\d*"
+syn match msmessagesFloat display contained "\d\+f"
+"floating point number, with dot, optional exponent
+syn match msmessagesFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
+"floating point number, starting with a dot, optional exponent
+syn match msmessagesFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match msmessagesFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>"
+"hexadecimal floating point number, optional leading digits, with dot, with exponent
+syn match msmessagesFloat display contained "0x\x*\.\x\+p[-+]\=\d\+[fl]\=\>"
+"hexadecimal floating point number, with leading digits, optional dot, with exponent
+syn match msmessagesFloat display contained "0x\x\+\.\=p[-+]\=\d\+[fl]\=\>"
+
+" Types (used in MessageIdTypedef statement)
+syn case match
+syn keyword msmessagesType int long short char
+syn keyword msmessagesType signed unsigned
+syn keyword msmessagesType size_t ssize_t sig_atomic_t
+syn keyword msmessagesType int8_t int16_t int32_t int64_t
+syn keyword msmessagesType uint8_t uint16_t uint32_t uint64_t
+syn keyword msmessagesType int_least8_t int_least16_t int_least32_t int_least64_t
+syn keyword msmessagesType uint_least8_t uint_least16_t uint_least32_t uint_least64_t
+syn keyword msmessagesType int_fast8_t int_fast16_t int_fast32_t int_fast64_t
+syn keyword msmessagesType uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
+syn keyword msmessagesType intptr_t uintptr_t
+syn keyword msmessagesType intmax_t uintmax_t
+" Add some Windows datatypes that will be common in msmessages files
+syn keyword msmessagesType BYTE CHAR SHORT SIZE_T SSIZE_T TBYTE TCHAR UCHAR USHORT
+syn keyword msmessagesType DWORD DWORDLONG DWORD32 DWORD64
+syn keyword msmessagesType INT INT32 INT64 UINT UINT32 UINT64
+syn keyword msmessagesType LONG LONGLONG LONG32 LONG64
+syn keyword msmessagesType ULONG ULONGLONG ULONG32 ULONG64
+
+" Sync to language entries, since they should be most common
+syn sync match msmessagesLangSync grouphere msmessagesLangEntry "\<Language\s*="
+syn sync match msmessagesLangEndSync grouphere NONE "^\."
+
+" Define the default highlighting.
+hi def link msmessagesNumber Number
+hi def link msmessagesOctal Number
+hi def link msmessagesFloat Float
+hi def link msmessagesOctalError msmessagesError
+hi def link msmessagesSetError msmessagesError
+hi def link msmessagesError Error
+hi def link msmessagesLangEntry String
+hi def link msmessagesLangEntryEnd Special
+hi def link msmessagesComment Comment
+hi def link msmessagesFormat msmessagesSpecial
+hi def link msmessagesSpecial SpecialChar
+
+hi def link msmessagesType Type
+hi def link msmessagesIdentifier Identifier
+hi def link msmessagesLanguage msmessagesIdentifier
+hi def link msmessagesName msmessagesIdentifier
+hi def link msmessagesNameDef Macro
+hi def link msmessagesIdentDef Macro
+hi def link msmessagesValSep Special
+hi def link msmessagesNameErr Error
+
+let b:current_syntax = "msmessages"
+
+" vim: ts=8
diff --git a/runtime/syntax/msql.vim b/runtime/syntax/msql.vim
new file mode 100644
index 0000000..60e75a7
--- /dev/null
+++ b/runtime/syntax/msql.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: msql
+" Maintainer: Lutz Eymers <ixtab@polzin.com>
+" URL: http://www.isp.de/data/msql.vim
+" Email: Subject: send syntax_vim.tgz
+" Last Change: 2001 May 10
+"
+" Options msql_sql_query = 1 for SQL syntax highligthing inside strings
+" msql_minlines = x to sync at least x lines backwards
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'msql'
+endif
+
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+syn cluster htmlPreproc add=msqlRegion
+
+syn case match
+
+" Internal Variables
+syn keyword msqlIntVar ERRMSG contained
+
+" Env Variables
+syn keyword msqlEnvVar SERVER_SOFTWARE SERVER_NAME SERVER_URL GATEWAY_INTERFACE contained
+syn keyword msqlEnvVar SERVER_PROTOCOL SERVER_PORT REQUEST_METHOD PATH_INFO contained
+syn keyword msqlEnvVar PATH_TRANSLATED SCRIPT_NAME QUERY_STRING REMOTE_HOST contained
+syn keyword msqlEnvVar REMOTE_ADDR AUTH_TYPE REMOTE_USER CONTEN_TYPE contained
+syn keyword msqlEnvVar CONTENT_LENGTH HTTPS HTTPS_KEYSIZE HTTPS_SECRETKEYSIZE contained
+syn keyword msqlEnvVar HTTP_ACCECT HTTP_USER_AGENT HTTP_IF_MODIFIED_SINCE contained
+syn keyword msqlEnvVar HTTP_FROM HTTP_REFERER contained
+
+" Inlclude lLite
+syn include @msqlLite <sfile>:p:h/lite.vim
+
+" Msql Region
+syn region msqlRegion matchgroup=Delimiter start="<!$" start="<![^!->D]" end=">" contains=@msqlLite,msql.*
+
+" sync
+if exists("msql_minlines")
+ exec "syn sync minlines=" . msql_minlines
+else
+ syn sync minlines=100
+endif
+
+" Define the default highlighting.
+" 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"
+
+if main_syntax == 'msql'
+ unlet main_syntax
+endif
+
+" vim: ts=8
diff --git a/runtime/syntax/mupad.vim b/runtime/syntax/mupad.vim
new file mode 100644
index 0000000..df87ad1
--- /dev/null
+++ b/runtime/syntax/mupad.vim
@@ -0,0 +1,284 @@
+" Vim syntax file
+" Language: MuPAD source
+" Maintainer: Dave Silvia <dsilvia@mchsi.com>
+" Filenames: *.mu
+" Date: 6/30/2004
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Set default highlighting to Win2k
+if !exists("mupad_cmdextversion")
+ let mupad_cmdextversion = 2
+endif
+
+syn case match
+
+syn match mupadComment "//\p*$"
+syn region mupadComment start="/\*" end="\*/"
+
+syn region mupadString start="\"" skip=/\\"/ end="\""
+
+syn match mupadOperator "(\|)\|:=\|::\|:\|;"
+" boolean
+syn keyword mupadOperator and or not xor
+syn match mupadOperator "==>\|\<=\>"
+
+" Informational
+syn keyword mupadSpecial FILEPATH NOTEBOOKFILE NOTEBOOKPATH
+" Set-able, e.g., DIGITS:=10
+syn keyword mupadSpecial DIGITS HISTORY LEVEL
+syn keyword mupadSpecial MAXLEVEL MAXDEPTH ORDER
+syn keyword mupadSpecial TEXTWIDTH
+" Set-able, e.g., PRETTYPRINT:=TRUE
+syn keyword mupadSpecial PRETTYPRINT
+" Set-able, e.g., LIBPATH:="C:\\MuPAD Pro\\mylibdir" or LIBPATH:="/usr/MuPAD Pro/mylibdir"
+syn keyword mupadSpecial LIBPATH PACKAGEPATH
+syn keyword mupadSpecial READPATH TESTPATH WRITEPATH
+" Symbols and Constants
+syn keyword mupadDefine FAIL NIL
+syn keyword mupadDefine TRUE FALSE UNKNOWN
+syn keyword mupadDefine complexInfinity infinity
+syn keyword mupadDefine C_ CATALAN E EULER I PI Q_ R_
+syn keyword mupadDefine RD_INF RD_NINF undefined unit universe Z_
+" print() directives
+syn keyword mupadDefine Unquoted NoNL KeepOrder Typeset
+" domain specifics
+syn keyword mupadStatement domain begin end_domain end
+syn keyword mupadIdentifier inherits category axiom info doc interface
+" basic programming statements
+syn keyword mupadStatement proc begin end_proc
+syn keyword mupadUnderlined name local option save
+syn keyword mupadConditional if then elif else end_if
+syn keyword mupadConditional case of do break end_case
+syn keyword mupadRepeat for do next break end_for
+syn keyword mupadRepeat while do next break end_while
+syn keyword mupadRepeat repeat next break until end_repeat
+" domain packages/libraries
+syn keyword mupadType detools import linalg numeric numlib plot polylib
+syn match mupadType '\<DOM_\w*\>'
+
+"syn keyword mupadFunction contains
+" Functions dealing with prime numbers
+syn keyword mupadFunction phi invphi mersenne nextprime numprimedivisors
+syn keyword mupadFunction pollard prevprime primedivisors
+" Functions operating on Lists, Matrices, Sets, ...
+syn keyword mupadFunction array _index
+" Evaluation
+syn keyword mupadFunction float contains
+" stdlib
+syn keyword mupadFunction _exprseq _invert _lazy_and _lazy_or _negate
+syn keyword mupadFunction _stmtseq _invert intersect minus union
+syn keyword mupadFunction Ci D Ei O Re Im RootOf Si
+syn keyword mupadFunction Simplify
+syn keyword mupadFunction abs airyAi airyBi alias unalias anames append
+syn keyword mupadFunction arcsin arccos arctan arccsc arcsec arccot
+syn keyword mupadFunction arcsinh arccosh arctanh arccsch arcsech arccoth
+syn keyword mupadFunction arg args array assert assign assignElements
+syn keyword mupadFunction assume assuming asympt bernoulli
+syn keyword mupadFunction besselI besselJ besselK besselY beta binomial bool
+syn keyword mupadFunction bytes card
+syn keyword mupadFunction ceil floor round trunc
+syn keyword mupadFunction coeff coerce collect combine copyClosure
+syn keyword mupadFunction conjugate content context contfrac
+syn keyword mupadFunction debug degree degreevec delete _delete denom
+syn keyword mupadFunction densematrix diff dilog dirac discont div _div
+syn keyword mupadFunction divide domtype doprint erf erfc error eval evalassign
+syn keyword mupadFunction evalp exp expand export unexport expose expr
+syn keyword mupadFunction expr2text external extnops extop extsubsop
+syn keyword mupadFunction fact fact2 factor fclose finput fname fopen fprint
+syn keyword mupadFunction fread ftextinput readbitmap readdata pathname
+syn keyword mupadFunction protocol read readbytes write writebytes
+syn keyword mupadFunction float frac frame _frame frandom freeze unfreeze
+syn keyword mupadFunction funcenv gamma gcd gcdex genident genpoly
+syn keyword mupadFunction getpid getprop ground has hastype heaviside help
+syn keyword mupadFunction history hold hull hypergeom icontent id
+syn keyword mupadFunction ifactor igamma igcd igcdex ilcm in _in
+syn keyword mupadFunction indets indexval info input int int2text
+syn keyword mupadFunction interpolate interval irreducible is
+syn keyword mupadFunction isprime isqrt iszero ithprime kummerU lambertW
+syn keyword mupadFunction last lasterror lcm lcoeff ldegree length
+syn keyword mupadFunction level lhs rhs limit linsolve lllint
+syn keyword mupadFunction lmonomial ln loadmod loadproc log lterm
+syn keyword mupadFunction match map mapcoeffs maprat matrix max min
+syn keyword mupadFunction mod modp mods monomials multcoeffs new
+syn keyword mupadFunction newDomain _next nextprime nops
+syn keyword mupadFunction norm normal nterms nthcoeff nthmonomial nthterm
+syn keyword mupadFunction null numer ode op operator package
+syn keyword mupadFunction pade partfrac patchlevel pdivide
+syn keyword mupadFunction piecewise plot plotfunc2d plotfunc3d
+syn keyword mupadFunction poly poly2list polylog powermod print
+syn keyword mupadFunction product protect psi quit _quit radsimp random rationalize
+syn keyword mupadFunction rec rectform register reset return revert
+syn keyword mupadFunction rewrite select series setuserinfo share sign signIm
+syn keyword mupadFunction simplify
+syn keyword mupadFunction sin cos tan csc sec cot
+syn keyword mupadFunction sinh cosh tanh csch sech coth
+syn keyword mupadFunction slot solve
+syn keyword mupadFunction pdesolve matlinsolve matlinsolveLU toeplitzSolve
+syn keyword mupadFunction vandermondeSolve fsolve odesolve odesolve2
+syn keyword mupadFunction polyroots polysysroots odesolveGeometric
+syn keyword mupadFunction realroot realroots mroots lincongruence
+syn keyword mupadFunction msqrts
+syn keyword mupadFunction sort split sqrt strmatch strprint
+syn keyword mupadFunction subs subset subsex subsop substring sum
+syn keyword mupadFunction surd sysname sysorder system table taylor tbl2text
+syn keyword mupadFunction tcoeff testargs testeq testtype text2expr
+syn keyword mupadFunction text2int text2list text2tbl rtime time
+syn keyword mupadFunction traperror type unassume unit universe
+syn keyword mupadFunction unloadmod unprotect userinfo val version
+syn keyword mupadFunction warning whittakerM whittakerW zeta zip
+
+" graphics plot::
+syn keyword mupadFunction getDefault setDefault copy modify Arc2d Arrow2d
+syn keyword mupadFunction Arrow3d Bars2d Bars3d Box Boxplot Circle2d Circle3d
+syn keyword mupadFunction Cone Conformal Curve2d Curve3d Cylinder Cylindrical
+syn keyword mupadFunction Density Ellipse2d Function2d Function3d Hatch
+syn keyword mupadFunction Histogram2d HOrbital Implicit2d Implicit3d
+syn keyword mupadFunction Inequality Iteration Line2d Line3d Lsys Matrixplot
+syn keyword mupadFunction MuPADCube Ode2d Ode3d Parallelogram2d Parallelogram3d
+syn keyword mupadFunction Piechart2d Piechart3d Point2d Point3d Polar
+syn keyword mupadFunction Polygon2d Polygon3d Raster Rectangle Sphere
+syn keyword mupadFunction Ellipsoid Spherical Sum Surface SurfaceSet
+syn keyword mupadFunction SurfaceSTL Tetrahedron Hexahedron Octahedron
+syn keyword mupadFunction Dodecahedron Icosahedron Text2d Text3d Tube Turtle
+syn keyword mupadFunction VectorField2d XRotate ZRotate Canvas CoordinateSystem2d
+syn keyword mupadFunction CoordinateSystem3d Group2d Group3d Scene2d Scene3d ClippingBox
+syn keyword mupadFunction Rotate2d Rotate3d Scale2d Scale3d Transform2d
+syn keyword mupadFunction Transform3d Translate2d Translate3d AmbientLight
+syn keyword mupadFunction Camera DistantLight PointLight SpotLight
+
+" graphics Attributes
+" graphics Output Attributes
+syn keyword mupadIdentifier OutputFile OutputOptions
+" graphics Defining Attributes
+syn keyword mupadIdentifier Angle AngleRange AngleBegin AngleEnd
+syn keyword mupadIdentifier Area Axis AxisX AxisY AxisZ Base Top
+syn keyword mupadIdentifier BaseX TopX BaseY TopY BaseZ TopZ
+syn keyword mupadIdentifier BaseRadius TopRadius Cells
+syn keyword mupadIdentifier Center CenterX CenterY CenterZ
+syn keyword mupadIdentifier Closed ColorData CommandList Contours CoordinateType
+syn keyword mupadIdentifier Data DensityData DensityFunction From To
+syn keyword mupadIdentifier FromX ToX FromY ToY FromZ ToZ
+syn keyword mupadIdentifier Function FunctionX FunctionY FunctionZ
+syn keyword mupadIdentifier Function1 Function2 Baseline
+syn keyword mupadIdentifier Generations RotationAngle IterationRules StartRule StepLength
+syn keyword mupadIdentifier TurtleRules Ground Heights Moves Inequalities
+syn keyword mupadIdentifier InputFile Iterations StartingPoint
+syn keyword mupadIdentifier LineColorFunction FillColorFunction
+syn keyword mupadIdentifier Matrix2d Matrix3d
+syn keyword mupadIdentifier MeshList MeshListType MeshListNormals
+syn keyword mupadIdentifier MagneticQuantumNumber MomentumQuantumNumber PrincipalQuantumNumber
+syn keyword mupadIdentifier Name Normal NormalX NormalY NormalZ
+syn keyword mupadIdentifier ParameterName ParameterBegin ParameterEnd ParameterRange
+syn keyword mupadIdentifier Points2d Points3d Radius RadiusFunction
+syn keyword mupadIdentifier Position PositionX PositionY PositionZ
+syn keyword mupadIdentifier Scale ScaleX ScaleY ScaleZ Shift ShiftX ShiftY ShiftZ
+syn keyword mupadIdentifier SemiAxes SemiAxisX SemiAxisY SemiAxisZ
+syn keyword mupadIdentifier Tangent1 Tangent1X Tangent1Y Tangent1Z
+syn keyword mupadIdentifier Tangent2 Tangent2X Tangent2Y Tangent2Z
+syn keyword mupadIdentifier Text TextOrientation TextRotation
+syn keyword mupadIdentifier UName URange UMin UMax VName VRange VMin VMax
+syn keyword mupadIdentifier XName XRange XMin XMax YName YRange YMin YMax
+syn keyword mupadIdentifier ZName ZRange ZMin ZMax ViewingBox
+syn keyword mupadIdentifier ViewingBoxXMin ViewingBoxXMax ViewingBoxXRange
+syn keyword mupadIdentifier ViewingBoxYMin ViewingBoxYMax ViewingBoxYRange
+syn keyword mupadIdentifier ViewingBoxZMin ViewingBoxZMax ViewingBoxZRange
+syn keyword mupadIdentifier Visible
+" graphics Axis Attributes
+syn keyword mupadIdentifier Axes AxesInFront AxesLineColor AxesLineWidth
+syn keyword mupadIdentifier AxesOrigin AxesOriginX AxesOriginY AxesOriginZ
+syn keyword mupadIdentifier AxesTips AxesTitleAlignment
+syn keyword mupadIdentifier AxesTitleAlignmentX AxesTitleAlignmentY AxesTitleAlignmentZ
+syn keyword mupadIdentifier AxesTitles XAxisTitle YAxisTitle ZAxisTitle
+syn keyword mupadIdentifier AxesVisible XAxisVisible YAxisVisible ZAxisVisible
+syn keyword mupadIdentifier YAxisTitleOrientation
+" graphics Tick Marks Attributes
+syn keyword mupadIdentifier TicksAnchor XTicksAnchor YTicksAnchor ZTicksAnchor
+syn keyword mupadIdentifier TicksAt XTicksAt YTicksAt ZTicksAt
+syn keyword mupadIdentifier TicksBetween XTicksBetween YTicksBetween ZTicksBetween
+syn keyword mupadIdentifier TicksDistance XTicksDistance YTicksDistance ZTicksDistance
+syn keyword mupadIdentifier TicksNumber XTicksNumber YTicksNumber ZTicksNumber
+syn keyword mupadIdentifier TicksVisible XTicksVisible YTicksVisible ZTicksVisible
+syn keyword mupadIdentifier TicksLength TicksLabelStyle
+syn keyword mupadIdentifier XTicksLabelStyle YTicksLabelStyle ZTicksLabelStyle
+syn keyword mupadIdentifier TicksLabelsVisible
+syn keyword mupadIdentifier XTicksLabelsVisible YTicksLabelsVisible ZTicksLabelsVisible
+" graphics Grid Lines Attributes
+syn keyword mupadIdentifier GridInFront GridLineColor SubgridLineColor
+syn keyword mupadIdentifier GridLineStyle SubgridLineStyle GridLineWidth SubgridLineWidth
+syn keyword mupadIdentifier GridVisible XGridVisible YGridVisible ZGridVisible
+syn keyword mupadIdentifier SubgridVisible XSubgridVisible YSubgridVisible ZSubgridVisible
+" graphics Animation Attributes
+syn keyword mupadIdentifier Frames TimeRange TimeBegin TimeEnd
+syn keyword mupadIdentifier VisibleAfter VisibleBefore VisibleFromTo
+syn keyword mupadIdentifier VisibleAfterEnd VisibleBeforeBegin
+" graphics Annotation Attributes
+syn keyword mupadIdentifier Footer Header FooterAlignment HeaderAlignment
+syn keyword mupadIdentifier HorizontalAlignment TitleAlignment VerticalAlignment
+syn keyword mupadIdentifier Legend LegendEntry LegendText
+syn keyword mupadIdentifier LegendAlignment LegendPlacement LegendVisible
+syn keyword mupadIdentifier Title Titles
+syn keyword mupadIdentifier TitlePosition TitlePositionX TitlePositionY TitlePositionZ
+" graphics Layout Attributes
+syn keyword mupadIdentifier Bottom Left Height Width Layout Rows Columns
+syn keyword mupadIdentifier Margin BottomMargin TopMargin LeftMargin RightMargin
+syn keyword mupadIdentifier OutputUnits Spacing
+" graphics Calculation Attributes
+syn keyword mupadIdentifier AdaptiveMesh DiscontinuitySearch Mesh SubMesh
+syn keyword mupadIdentifier UMesh USubMesh VMesh VSubMesh
+syn keyword mupadIdentifier XMesh XSubMesh YMesh YSubMesh Zmesh
+" graphics Camera and Lights Attributes
+syn keyword mupadIdentifier CameraCoordinates CameraDirection
+syn keyword mupadIdentifier CameraDirectionX CameraDirectionY CameraDirectionZ
+syn keyword mupadIdentifier FocalPoint FocalPointX FocalPointY FocalPointZ
+syn keyword mupadIdentifier LightColor Lighting LightIntensity OrthogonalProjection
+syn keyword mupadIdentifier SpotAngle ViewingAngle
+syn keyword mupadIdentifier Target TargetX TargetY TargetZ
+" graphics Presentation Style and Fonts Attributes
+syn keyword mupadIdentifier ArrowLength
+syn keyword mupadIdentifier AxesTitleFont FooterFont HeaderFont LegendFont
+syn keyword mupadIdentifier TextFont TicksLabelFont TitleFont
+syn keyword mupadIdentifier BackgroundColor BackgroundColor2 BackgroundStyle
+syn keyword mupadIdentifier BackgroundTransparent Billboarding BorderColor BorderWidth
+syn keyword mupadIdentifier BoxCenters BoxWidths DrawMode Gap XGap YGap
+syn keyword mupadIdentifier Notched NotchWidth Scaling YXRatio ZXRatio
+syn keyword mupadIdentifier VerticalAsymptotesVisible VerticalAsymptotesStyle
+syn keyword mupadIdentifier VerticalAsymptotesColor VerticalAsymptotesWidth
+" graphics Line Style Attributes
+syn keyword mupadIdentifier LineColor LineColor2 LineColorType LineStyle
+syn keyword mupadIdentifier LinesVisible ULinesVisible VLinesVisible XLinesVisible
+syn keyword mupadIdentifier YLinesVisible LineWidth MeshVisible
+" graphics Point Style Attributes
+syn keyword mupadIdentifier PointColor PointSize PointStyle PointsVisible
+" graphics Surface Style Attributes
+syn keyword mupadIdentifier BarStyle Shadows Color Colors FillColor FillColor2
+syn keyword mupadIdentifier FillColorTrue FillColorFalse FillColorUnknown FillColorType
+syn keyword mupadIdentifier Filled FillPattern FillPatterns FillStyle
+syn keyword mupadIdentifier InterpolationStyle Shading UseNormals
+" graphics Arrow Style Attributes
+syn keyword mupadIdentifier TipAngle TipLength TipStyle TubeDiameter
+syn keyword mupadIdentifier Tubular
+" graphics meta-documentation Attributes
+syn keyword mupadIdentifier objectGroupsListed
+
+
+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
+
+let b:current_syntax = 'mupad'
+
+" TODO More comprehensive listing.
diff --git a/runtime/syntax/murphi.vim b/runtime/syntax/murphi.vim
new file mode 100644
index 0000000..347e17f
--- /dev/null
+++ b/runtime/syntax/murphi.vim
@@ -0,0 +1,126 @@
+" Vim syntax file
+" Language: Murphi model checking language
+" Maintainer: Matthew Fernandez <matthew.fernandez@gmail.com>
+" Last Change: 2019 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 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
new file mode 100644
index 0000000..efaae50
--- /dev/null
+++ b/runtime/syntax/mush.vim
@@ -0,0 +1,215 @@
+" MUSHcode syntax file
+" Maintainer: Rick Bird <nveid@nveid.com>
+" Based on vim Syntax file by: Bek Oberin <gossamer@tertius.net.au>
+" Last Updated: Fri Nov 04 20:28:15 2005
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+" regular mush functions
+
+syntax keyword mushFunction contained @@ abs accent accname acos add after align
+syntax keyword mushFunction contained allof alphamax alphamin and andflags
+syntax keyword mushFunction contained andlflags andlpowers andpowers ansi aposs art
+syntax keyword mushFunction contained asin atan atan2 atrlock attrcnt band baseconv
+syntax keyword mushFunction contained beep before blank2tilde bnand bnot bor bound
+syntax keyword mushFunction contained brackets break bxor cand cansee capstr case
+syntax keyword mushFunction contained caseall cat ceil center checkpass children
+syntax keyword mushFunction contained chr clone cmds cnetpost comp con config conn
+syntax keyword mushFunction contained controls convsecs convtime convutcsecs cor
+syntax keyword mushFunction contained cos create ctime ctu dec decrypt default
+syntax keyword mushFunction contained delete die dig digest dist2d dist3d div
+syntax keyword mushFunction contained division divscope doing downdiv dynhelp e
+syntax keyword mushFunction contained edefault edit element elements elist elock
+syntax keyword mushFunction contained emit empire empower encrypt endtag entrances
+syntax keyword mushFunction contained eq escape etimefmt eval exit exp extract fdiv
+syntax keyword mushFunction contained filter filterbool findable first firstof
+syntax keyword mushFunction contained flags flip floor floordiv fmod fold
+syntax keyword mushFunction contained folderstats followers following foreach
+syntax keyword mushFunction contained fraction fullname functions get get_eval grab
+syntax keyword mushFunction contained graball grep grepi gt gte hasattr hasattrp
+syntax keyword mushFunction contained hasattrpval hasattrval hasdivpower hasflag
+syntax keyword mushFunction contained haspower haspowergroup hastype height hidden
+syntax keyword mushFunction contained home host hostname html idle idlesecs
+syntax keyword mushFunction contained idle_average idle_times idle_total if ifelse
+syntax keyword mushFunction contained ilev iname inc index indiv indivall insert
+syntax keyword mushFunction contained inum ipaddr isdaylight isdbref isint isnum
+syntax keyword mushFunction contained isword itemize items iter itext last lattr
+syntax keyword mushFunction contained lcon lcstr ldelete ldivisions left lemit
+syntax keyword mushFunction contained level lexits lflags link list lit ljust lmath
+syntax keyword mushFunction contained ln lnum loc localize locate lock loctree log
+syntax keyword mushFunction contained lparent lplayers lports lpos lsearch lsearchr
+syntax keyword mushFunction contained lstats lt lte lthings lvcon lvexits lvplayers
+syntax keyword mushFunction contained lvthings lwho mail maildstats mailfrom
+syntax keyword mushFunction contained mailfstats mailstats mailstatus mailsubject
+syntax keyword mushFunction contained mailtime map match matchall max mean median
+syntax keyword mushFunction contained member merge mid min mix mod modulo modulus
+syntax keyword mushFunction contained money mtime mudname mul munge mwho name nand
+syntax keyword mushFunction contained nattr ncon nearby neq nexits next nor not
+syntax keyword mushFunction contained nplayers nsemit nslemit nsoemit nspemit
+syntax keyword mushFunction contained nsremit nszemit nthings null num nvcon
+syntax keyword mushFunction contained nvexits nvplayers nvthings obj objeval objid
+syntax keyword mushFunction contained objmem oemit ooref open or ord orflags
+syntax keyword mushFunction contained orlflags orlpowers orpowers owner parent
+syntax keyword mushFunction contained parse pcreate pemit pi pickrand playermem
+syntax keyword mushFunction contained pmatch poll ports pos poss power powergroups
+syntax keyword mushFunction contained powers powover program prompt pueblo quitprog
+syntax keyword mushFunction contained quota r rand randword recv regedit regeditall
+syntax keyword mushFunction contained regeditalli regediti regmatch regmatchi
+syntax keyword mushFunction contained regrab regraball regraballi regrabi regrep
+syntax keyword mushFunction contained regrepi remainder remit remove repeat replace
+syntax keyword mushFunction contained rest restarts restarttime reswitch
+syntax keyword mushFunction contained reswitchall reswitchalli reswitchi reverse
+syntax keyword mushFunction contained revwords right rjust rloc rnum room root
+syntax keyword mushFunction contained round s scan scramble search secs secure sent
+syntax keyword mushFunction contained set setdiff setinter setq setr setunion sha0
+syntax keyword mushFunction contained shl shr shuffle sign signal sin sort sortby
+syntax keyword mushFunction contained soundex soundlike soundslike space spellnum
+syntax keyword mushFunction contained splice sql sqlescape sqrt squish ssl
+syntax keyword mushFunction contained starttime stats stddev step strcat strinsert
+syntax keyword mushFunction contained stripaccents stripansi strlen strmatch
+syntax keyword mushFunction contained strreplace sub subj switch switchall t table
+syntax keyword mushFunction contained tag tagwrap tan tel terminfo textfile
+syntax keyword mushFunction contained tilde2blank time timefmt timestring tr
+syntax keyword mushFunction contained trigger trim trimpenn trimtiny trunc type u
+syntax keyword mushFunction contained ucstr udefault ufun uldefault ulocal updiv
+syntax keyword mushFunction contained utctime v vadd val valid vcross vdim vdot
+syntax keyword mushFunction contained version visible vmag vmax vmin vmul vsub
+syntax keyword mushFunction contained vtattr vtcount vtcreate vtdestroy vtlcon
+syntax keyword mushFunction contained vtloc vtlocate vtmaster vtname vtref vttel
+syntax keyword mushFunction contained vunit wait where width wipe wordpos words
+syntax keyword mushFunction contained wrap xcon xexits xget xor xplayers xthings
+syntax keyword mushFunction contained xvcon xvexits xvplayers xvthings zemit zfun
+syntax keyword mushFunction contained zmwho zone zwho
+
+" only highligh functions when they have an in-bracket immediately after
+syntax match mushFunctionBrackets "\i*(" contains=mushFunction
+"
+" regular mush commands
+syntax keyword mushAtCommandList contained @ALLHALT @ALLQUOTA @ASSERT @ATRCHOWN @ATRLOCK @ATTRIBUTE @BOOT
+syntax keyword mushAtCommandList contained @BREAK @CEMIT @CHANNEL @CHAT @CHOWN @CHOWNALL @CHZONE @CHZONEALL
+syntax keyword mushAtCommandList contained @CLOCK @CLONE @COBJ @COMMAND @CONFIG @CPATTR @CREATE @CRPLOG @DBCK
+syntax keyword mushAtCommandList contained @DECOMPILE @DESTROY @DIG @DISABLE @DIVISION @DOING @DOLIST @DRAIN
+syntax keyword mushAtCommandList contained @DUMP @EDIT @ELOCK @EMIT @EMPOWER @ENABLE @ENTRANCES @EUNLOCK @FIND
+syntax keyword mushAtCommandList contained @FIRSTEXIT @FLAG @FORCE @FUNCTION @EDIT @GREP @HALT @HIDE @HOOK @KICK
+syntax keyword mushAtCommandList contained @LEMIT @LEVEL @LINK @LIST @LISTMOTD @LOCK @LOG @LOGWIPE @LSET @MAIL @MALIAS
+syntax keyword mushAtCommandList contained @MAP @MOTD @MVATTR @NAME @NEWPASSWORD @NOTIFY @NSCEMIT @NSEMIT @NSLEMIT
+syntax keyword mushAtCommandList contained @NSOEMIT @NSPEMIT @NSPEMIT @NSREMIT @NSZEMIT @NUKE @OEMIT @OPEN @PARENT @PASSWORD
+syntax keyword mushAtCommandList contained @PCREATE @PEMIT @POLL @POOR @POWERLEVEL @PROGRAM @PROMPT @PS @PURGE @QUOTA
+syntax keyword mushAtCommandList contained @READCACHE @RECYCLE @REJECTMOTD @REMIT @RESTART @SCAN @SEARCH @SELECT @SET
+syntax keyword mushAtCommandList contained @SHUTDOWN @SITELOCK @SNOOP @SQL @SQUOTA @STATS @SWITCH @SWEEP @SWITCH @TELEPORT
+syntax keyword mushAtCommandList contained @TRIGGER @ULOCK @UNDESTROY @UNLINK @UNLOCK @UNRECYCLE @UPTIME @UUNLOCK @VERB
+syntax keyword mushAtCommandList contained @VERSION @WAIT @WALL @WARNINGS @WCHECK @WHEREIS @WIPE @ZCLONE @ZEMIT
+syntax match mushCommand "@\i\I*" contains=mushAtCommandList
+
+
+syntax keyword mushCommand AHELP ANEWS ATTRIB_SET BRIEF BRIEF BUY CHANGES DESERT
+syntax keyword mushCommand DISMISS DROP EMPTY ENTER EXAMINE FOLLOW GET GIVE GOTO
+syntax keyword mushCommand HELP HUH_COMMAND INVENTORY INVENTORY LOOK LEAVE LOOK
+syntax keyword mushCommand GOTO NEWS PAGE PAGE POSE RULES SAY SCORE SEMIPOSE
+syntax keyword mushCommand SPECIALNEWS TAKE TEACH THINK UNFOLLOW USE WHISPER WHISPER
+syntax keyword mushCommand WARN_ON_MISSING WHISPER WITH
+
+syntax match mushSpecial "\*\|!\|=\|-\|\\\|+"
+syntax match mushSpecial2 contained "\*"
+
+syn region mushString start=+L\="+ skip=+\\\\\|\\"+ end=+"+ contains=mushSpecial,mushSpecial2,@Spell
+
+
+syntax match mushIdentifier "&[^ ]\+"
+
+syntax match mushVariable "%r\|%t\|%cr\|%[A-Za-z0-9]\+\|%#\|##\|here"
+
+" numbers
+syntax match mushNumber +[0-9]\++
+
+" A comment line starts with a or # or " at the start of the line
+" or an @@
+syntax keyword mushTodo contained TODO FIXME XXX
+syntax cluster mushCommentGroup contains=mushTodo
+syntax match mushComment "^\s*@@.*$" contains=mushTodo
+syntax match mushComment "^#[^define|^ifdef|^else|^pragma|^ifndef|^echo|^elif|^undef|^warning].*$" contains=mushTodo
+syntax match mushComment "^#$" contains=mushTodo
+syntax region mushComment matchgroup=mushCommentStart start="/@@" end="@@/" contains=@mushCommentGroup,mushCommentStartError,mushCommentString,@Spell
+syntax region mushCommentString contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+@@/+me=s-1 contains=mushCommentSkip
+syntax match mushCommentSkip contained "^\s*@@\($\|\s\+\)"
+
+
+syntax match mushCommentStartError display "/@@"me=e-1 contained
+
+" syntax match mushComment +^".*$+ contains=mushTodo
+" Work on this one
+" syntax match mushComment +^#.*$+ contains=mushTodo
+
+syn region mushPreCondit start="^\s*\(%:\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=mushComment
+syn match mushPreCondit display "^\s*\(%:\|#\)\s*\(else\|endif\)\>"
+
+syn cluster mushPreProcGroup contains=mushPreCondit,mushIncluded,mushInclude,mushDefine,mushSpecial,mushString,mushCommentSkip,mushCommentString,@mushCommentGroup,mushCommentStartError
+
+syn region mushIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match mushIncluded display contained "<[^>]*>"
+syn match mushInclude display "^\s*\(%:\|#\)\s*include\>\s*["<]" contains=mushIncluded
+syn region mushDefine start="^\s*\(%:\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@mushPreProcGroup,@Spell
+syn region mushPreProc start="^\s*\(%:\|#\)\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@mushPreProcGroup
+
+
+syntax region mushFuncBoundaries start="\[" end="\]" contains=mushFunction,mushFlag,mushAttributes,mushNumber,mushCommand,mushVariable,mushSpecial2
+
+" FLAGS
+syntax keyword mushFlag PLAYER ABODE BUILDER CHOWN_OK DARK FLOATING
+syntax keyword mushFlag GOING HAVEN INHERIT JUMP_OK KEY LINK_OK MONITOR
+syntax keyword mushFlag NOSPOOF OPAQUE QUIET STICKY TRACE UNFINDABLE VISUAL
+syntax keyword mushFlag WIZARD PARENT_OK ZONE AUDIBLE CONNECTED DESTROY_OK
+syntax keyword mushFlag ENTER_OK HALTED IMMORTAL LIGHT MYOPIC PUPPET TERSE
+syntax keyword mushFlag ROBOT SAFE TRANSPARENT VERBOSE CONTROL_OK COMMANDS
+
+syntax keyword mushAttribute aahear aclone aconnect adesc adfail adisconnect
+syntax keyword mushAttribute adrop aefail aenter afail agfail ahear akill
+syntax keyword mushAttribute aleave alfail alias amhear amove apay arfail
+syntax keyword mushAttribute asucc atfail atport aufail ause away charges
+syntax keyword mushAttribute cost desc dfail drop ealias efail enter fail
+syntax keyword mushAttribute filter forwardlist gfail idesc idle infilter
+syntax keyword mushAttribute inprefix kill lalias last lastsite leave lfail
+syntax keyword mushAttribute listen move odesc odfail odrop oefail oenter
+syntax keyword mushAttribute ofail ogfail okill oleave olfail omove opay
+syntax keyword mushAttribute orfail osucc otfail otport oufail ouse oxenter
+syntax keyword mushAttribute oxleave oxtport pay prefix reject rfail runout
+syntax keyword mushAttribute semaphore sex startup succ tfail tport ufail
+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
+
+
+
+" 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
+hi def link mushCommentStart mushComment
+hi def link mushComment Comment
+hi def link mushCommentString mushString
+
+
+
+let b:current_syntax = "mush"
+
+" mush: ts=17
diff --git a/runtime/syntax/muttrc.vim b/runtime/syntax/muttrc.vim
new file mode 100644
index 0000000..830664e
--- /dev/null
+++ b/runtime/syntax/muttrc.vim
@@ -0,0 +1,821 @@
+" Vim syntax file
+" Language: Mutt setup files
+" Original: Preben 'Peppe' Guldberg <peppe-vim@wielders.org>
+" Maintainer: Kyle Wheeler <kyle-muttrc.vim@memoryhole.net>
+" Last Change: 21 May 2018
+
+" This file covers mutt version 1.10.0
+
+" 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
+if !exists("use_mutt_sidebar")
+ let use_mutt_sidebar=0
+endif
+
+syn match muttrcComment "^# .*$" contains=@Spell
+syn match muttrcComment "^#[^ ].*$"
+syn match muttrcComment "^#$"
+syn match muttrcComment "[^\\]#.*$"lc=1
+
+" Escape sequences (back-tick and pipe goes here too)
+syn match muttrcEscape +\\[#tnr"'Cc ]+
+syn match muttrcEscape +[`|]+
+syn match muttrcEscape +\\$+
+
+" The variables takes the following arguments
+"syn match muttrcString contained "=\s*[^ #"'`]\+"lc=1 contains=muttrcEscape
+syn region muttrcString contained keepend start=+"+ms=e skip=+\\"+ end=+"+ contains=muttrcEscape,muttrcCommand,muttrcAction,muttrcShellString
+syn region muttrcString contained keepend start=+'+ms=e skip=+\\'+ end=+'+ contains=muttrcEscape,muttrcCommand,muttrcAction
+syn match muttrcStringNL contained skipwhite skipnl "\s*\\$" nextgroup=muttrcString,muttrcStringNL
+
+syn region muttrcShellString matchgroup=muttrcEscape keepend start=+`+ skip=+\\`+ end=+`+ contains=muttrcVarStr,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcCommand
+
+syn match muttrcRXChars contained /[^\\][][.*?+]\+/hs=s+1
+syn match muttrcRXChars contained /[][|()][.*?+]*/
+syn match muttrcRXChars contained /['"]^/ms=s+1
+syn match muttrcRXChars contained /$['"]/me=e-1
+syn match muttrcRXChars contained /\\/
+" Why does muttrcRXString2 work with one \ when muttrcRXString requires two?
+syn region muttrcRXString contained skipwhite start=+'+ skip=+\\'+ end=+'+ contains=muttrcRXChars
+syn region muttrcRXString contained skipwhite start=+"+ skip=+\\"+ end=+"+ contains=muttrcRXChars
+syn region muttrcRXString contained skipwhite start=+[^ "'^]+ skip=+\\\s+ end=+\s+re=e-1 contains=muttrcRXChars
+" For some reason, skip refuses to match backslashes here...
+syn region muttrcRXString contained matchgroup=muttrcRXChars skipwhite start=+\^+ end=+[^\\]\s+re=e-1 contains=muttrcRXChars
+syn region muttrcRXString contained matchgroup=muttrcRXChars skipwhite start=+\^+ end=+$\s+ contains=muttrcRXChars
+syn region muttrcRXString2 contained skipwhite start=+'+ skip=+\'+ end=+'+ contains=muttrcRXChars
+syn region muttrcRXString2 contained skipwhite start=+"+ skip=+\"+ end=+"+ contains=muttrcRXChars
+
+" these must be kept synchronized with muttrcRXString, but are intended for
+" muttrcRXHooks
+syn region muttrcRXHookString contained keepend skipwhite start=+'+ skip=+\\'+ end=+'+ contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syn region muttrcRXHookString contained keepend skipwhite start=+"+ skip=+\\"+ end=+"+ contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syn region muttrcRXHookString contained keepend skipwhite start=+[^ "'^]+ skip=+\\\s+ end=+\s+re=e-1 contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syn region muttrcRXHookString contained keepend skipwhite start=+\^+ end=+[^\\]\s+re=e-1 contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syn region muttrcRXHookString contained keepend matchgroup=muttrcRXChars skipwhite start=+\^+ end=+$\s+ contains=muttrcRXString nextgroup=muttrcString,muttrcStringNL
+syn match muttrcRXHookStringNL contained skipwhite skipnl "\s*\\$" nextgroup=muttrcRXHookString,muttrcRXHookStringNL
+
+" these are exclusively for args lists (e.g. -rx pat pat pat ...)
+syn region muttrcRXPat contained keepend skipwhite start=+'+ skip=+\\'+ end=+'\s*+ contains=muttrcRXString nextgroup=muttrcRXPat
+syn region muttrcRXPat contained keepend skipwhite start=+"+ skip=+\\"+ end=+"\s*+ contains=muttrcRXString nextgroup=muttrcRXPat
+syn match muttrcRXPat contained /[^-'"#!]\S\+/ skipwhite contains=muttrcRXChars nextgroup=muttrcRXPat
+syn match muttrcRXDef contained "-rx\s\+" skipwhite nextgroup=muttrcRXPat
+
+syn match muttrcSpecial +\(['"]\)!\1+
+
+syn match muttrcSetStrAssignment contained skipwhite /=\s*\%(\\\?\$\)\?[0-9A-Za-z_-]\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcVariable,muttrcEscapedVariable
+syn region muttrcSetStrAssignment contained skipwhite keepend start=+=\s*"+hs=s+1 end=+"+ skip=+\\"+ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcString
+syn region muttrcSetStrAssignment contained skipwhite keepend start=+=\s*'+hs=s+1 end=+'+ skip=+\\'+ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcString
+syn match muttrcSetBoolAssignment contained skipwhite /=\s*\\\?\$\w\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcVariable,muttrcEscapedVariable
+syn match muttrcSetBoolAssignment contained skipwhite /=\s*\%(yes\|no\)/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn match muttrcSetBoolAssignment contained skipwhite /=\s*"\%(yes\|no\)"/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn match muttrcSetBoolAssignment contained skipwhite /=\s*'\%(yes\|no\)'/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn match muttrcSetQuadAssignment contained skipwhite /=\s*\\\?\$\w\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcVariable,muttrcEscapedVariable
+syn match muttrcSetQuadAssignment contained skipwhite /=\s*\%(ask-\)\?\%(yes\|no\)/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn match muttrcSetQuadAssignment contained skipwhite /=\s*"\%(ask-\)\?\%(yes\|no\)"/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn match muttrcSetQuadAssignment contained skipwhite /=\s*'\%(ask-\)\?\%(yes\|no\)'/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn match muttrcSetNumAssignment contained skipwhite /=\s*\\\?\$\w\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcVariable,muttrcEscapedVariable
+syn match muttrcSetNumAssignment contained skipwhite /=\s*\d\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn match muttrcSetNumAssignment contained skipwhite /=\s*"\d\+"/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn match muttrcSetNumAssignment contained skipwhite /=\s*'\d\+'/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+" 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 "\<\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
+syn region muttrcKey contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=muttrcKeySpecial,muttrcKeyName
+syn region muttrcKey contained start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=muttrcKeySpecial,muttrcKeyName
+syn match muttrcKeyName contained "\<f\%(\d\|10\)\>"
+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 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 /%./
+
+syn match muttrcStrftimeEscapes contained /%[AaBbCcDdeFGgHhIjklMmnpRrSsTtUuVvWwXxYyZz+%]/
+syn match muttrcStrftimeEscapes contained /%E[cCxXyY]/
+syn match muttrcStrftimeEscapes contained /%O[BdeHImMSuUVwWy]/
+
+syn region muttrcIndexFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcIndexFormatEscapes,muttrcIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcIndexFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcIndexFormatEscapes,muttrcIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcQueryFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcQueryFormatEscapes,muttrcQueryFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcAliasFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcAliasFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcAliasFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcAliasFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcAttachFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcAttachFormatEscapes,muttrcAttachFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcAttachFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcAttachFormatEscapes,muttrcAttachFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcComposeFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcComposeFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcComposeFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcComposeFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcFolderFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcFolderFormatEscapes,muttrcFolderFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcFolderFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcFolderFormatEscapes,muttrcFolderFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcMixFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcMixFormatEscapes,muttrcMixFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcMixFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcMixFormatEscapes,muttrcMixFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcPGPFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPGPFormatEscapes,muttrcPGPFormatConditionals,muttrcFormatErrors,muttrcPGPTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcPGPFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPGPFormatEscapes,muttrcPGPFormatConditionals,muttrcFormatErrors,muttrcPGPTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcPGPCmdFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPGPCmdFormatEscapes,muttrcPGPCmdFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcPGPCmdFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPGPCmdFormatEscapes,muttrcPGPCmdFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcStatusFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcStatusFormatEscapes,muttrcStatusFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcStatusFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcStatusFormatEscapes,muttrcStatusFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcPGPGetKeysFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPGPGetKeysFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcPGPGetKeysFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPGPGetKeysFormatEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcSmimeFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcSmimeFormatEscapes,muttrcSmimeFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcSmimeFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcSmimeFormatEscapes,muttrcSmimeFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcStrftimeFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcStrftimeEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn region muttrcStrftimeFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcStrftimeEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+" The following info was pulled from hdr_format_str in hdrline.c
+syn match muttrcIndexFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[aAbBcCdDeEfFHilLmMnNOPsStTuvXyYZ%]/
+syn match muttrcIndexFormatEscapes contained /%[>|*]./
+syn match muttrcIndexFormatConditionals contained /%?[EFHlLMNOXyY]?/ nextgroup=muttrcFormatConditionals2
+" The following info was pulled from alias_format_str in addrbook.c
+syn match muttrcAliasFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[afnrt%]/
+" The following info was pulled from query_format_str in query.c
+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]\+\)\?\)\?[:_]\?[CcDdeFfImMnQstTuX%]/
+syn match muttrcAttachFormatEscapes contained /%[>|*]./
+syn match muttrcAttachFormatConditionals contained /%?[CcdDefInmMQstTuX]?/ nextgroup=muttrcFormatConditionals2
+syn match muttrcFormatConditionals2 contained /[^?]*?/
+" The following info was pulled from compose_format_str in compose.c
+syn match muttrcComposeFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[ahlv%]/
+syn match muttrcComposeFormatEscapes contained /%[>|*]./
+" The following info was pulled from folder_format_str in browser.c
+syn match muttrcFolderFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[CDdfFglNstu%]/
+syn match muttrcFolderFormatEscapes contained /%[>|*]./
+syn match muttrcFolderFormatConditionals contained /%?[N]?/
+" The following info was pulled from mix_entry_fmt in remailer.c
+syn match muttrcMixFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[ncsa%]/
+syn match muttrcMixFormatConditionals contained /%?[ncsa]?/
+" The following info was pulled from crypt_entry_fmt in crypt-gpgme.c
+" and pgp_entry_fmt in pgpkey.c (note that crypt_entry_fmt supports
+" 'p', but pgp_entry_fmt does not).
+syn match muttrcPGPFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[nkualfctp%]/
+syn match muttrcPGPFormatConditionals contained /%?[nkualfct]?/
+" The following info was pulled from _mutt_fmt_pgp_command in
+" pgpinvoke.c
+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]\+\)\?\)\?[:_]\?[bdfFhlLmMnopPRrsStuvV%]/
+syn match muttrcStatusFormatEscapes contained /%[>|*]./
+syn match muttrcStatusFormatConditionals contained /%?[bdFlLmMnoptuV]?/ nextgroup=muttrcFormatConditionals2
+" This matches the documentation, but directly contradicts the code
+" (according to the code, this should be identical to the
+" muttrcPGPCmdFormatEscapes
+syn match muttrcPGPGetKeysFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[r%]/
+" The following info was pulled from _mutt_fmt_smime_command in
+" smime.c
+syn match muttrcSmimeFormatEscapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?[Cciskaf%]/
+syn match muttrcSmimeFormatConditionals contained /%?[Cciskaf]?/ nextgroup=muttrcFormatConditionals2
+
+syn region muttrcTimeEscapes contained start=+%{+ end=+}+ contains=muttrcStrftimeEscapes
+syn region muttrcTimeEscapes contained start=+%\[+ end=+\]+ contains=muttrcStrftimeEscapes
+syn region muttrcTimeEscapes contained start=+%(+ end=+)+ contains=muttrcStrftimeEscapes
+syn region muttrcTimeEscapes contained start=+%<+ end=+>+ contains=muttrcStrftimeEscapes
+syn region muttrcPGPTimeEscapes contained start=+%\[+ end=+\]+ contains=muttrcStrftimeEscapes
+
+syn keyword muttrcVarStr contained skipwhite attribution index_format message_format pager_format nextgroup=muttrcVarEqualsIdxFmt
+syn match muttrcVarEqualsIdxFmt contained skipwhite "=" nextgroup=muttrcIndexFormatStr
+syn keyword muttrcVarStr contained skipwhite alias_format nextgroup=muttrcVarEqualsAliasFmt
+syn match muttrcVarEqualsAliasFmt contained skipwhite "=" nextgroup=muttrcAliasFormatStr
+syn keyword muttrcVarStr contained skipwhite attach_format nextgroup=muttrcVarEqualsAttachFmt
+syn match muttrcVarEqualsAttachFmt contained skipwhite "=" nextgroup=muttrcAttachFormatStr
+syn keyword muttrcVarStr contained skipwhite compose_format nextgroup=muttrcVarEqualsComposeFmt
+syn match muttrcVarEqualsComposeFmt contained skipwhite "=" nextgroup=muttrcComposeFormatStr
+syn keyword muttrcVarStr contained skipwhite folder_format nextgroup=muttrcVarEqualsFolderFmt
+syn match muttrcVarEqualsFolderFmt contained skipwhite "=" nextgroup=muttrcFolderFormatStr
+syn keyword muttrcVarStr contained skipwhite mix_entry_format nextgroup=muttrcVarEqualsMixFmt
+syn match muttrcVarEqualsMixFmt contained skipwhite "=" nextgroup=muttrcMixFormatStr
+syn keyword muttrcVarStr contained skipwhite pgp_entry_format nextgroup=muttrcVarEqualsPGPFmt
+syn match muttrcVarEqualsPGPFmt contained skipwhite "=" nextgroup=muttrcPGPFormatStr
+syn keyword muttrcVarStr contained skipwhite query_format nextgroup=muttrcVarEqualsQueryFmt
+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 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
+syn keyword muttrcVarStr contained skipwhite smime_decrypt_command smime_verify_command smime_verify_opaque_command smime_sign_command smime_sign_opaque_command smime_encrypt_command smime_pk7out_command smime_get_cert_command smime_get_signer_cert_command smime_import_cert_command smime_get_cert_email_command nextgroup=muttrcVarEqualsSmimeFmt
+syn match muttrcVarEqualsSmimeFmt contained skipwhite "=" nextgroup=muttrcSmimeFormatStr
+syn keyword muttrcVarStr contained skipwhite date_format nextgroup=muttrcVarEqualsStrftimeFmt
+syn match muttrcVarEqualsStrftimeFmt contained skipwhite "=" nextgroup=muttrcStrftimeFormatStr
+
+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
+ \ 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
+"syn keyword muttrcVarQuad contained pgp_create_traditional nopgp_create_traditional invpgp_create_traditional
+syn keyword muttrcVarStr contained skipwhite alternates nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+syn keyword muttrcMenu contained alias attach browser compose editor index pager postpone pgp mix query generic
+syn match muttrcMenuList "\S\+" contained contains=muttrcMenu
+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 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
+
+syn keyword muttrcCommand skipwhite spam nextgroup=muttrcSpamPattern
+syn region muttrcSpamPattern contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPattern nextgroup=muttrcString,muttrcStringNL
+syn region muttrcSpamPattern contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPattern nextgroup=muttrcString,muttrcStringNL
+
+syn keyword muttrcCommand skipwhite nospam nextgroup=muttrcNoSpamPattern
+syn region muttrcNoSpamPattern contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPattern
+syn region muttrcNoSpamPattern contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPattern
+
+syn match muttrcAttachmentsMimeType contained "[*a-z0-9_-]\+/[*a-z0-9._-]\+\s*" skipwhite nextgroup=muttrcAttachmentsMimeType
+syn match muttrcAttachmentsFlag contained "[+-]\%([AI]\|inline\|attachment\)\s\+" skipwhite nextgroup=muttrcAttachmentsMimeType
+syn match muttrcAttachmentsLine "^\s*\%(un\)\?attachments\s\+" skipwhite nextgroup=muttrcAttachmentsFlag
+
+syn match muttrcUnHighlightSpace contained "\%(\s\+\|\\$\)"
+
+syn keyword muttrcAsterisk contained *
+syn keyword muttrcListsKeyword lists skipwhite nextgroup=muttrcGroupDef,muttrcComment
+syn keyword muttrcListsKeyword unlists skipwhite nextgroup=muttrcAsterisk,muttrcComment
+
+syn keyword muttrcSubscribeKeyword subscribe nextgroup=muttrcGroupDef,muttrcComment
+syn keyword muttrcSubscribeKeyword unsubscribe nextgroup=muttrcAsterisk,muttrcComment
+
+syn keyword muttrcAlternateKeyword contained alternates unalternates
+syn 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.
+syn match muttrcVariable contained "\\\@<![a-zA-Z_-]*\$[a-zA-Z_-]\+" contains=muttrcVariableInner
+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\|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\>"
+syn match muttrcFunction contained "\<\%(delete\|filter\|first\|last\|next\|pipe\|previous\|print\|save\|select\|tag\|undelete\)-entry\>"
+syn match muttrcFunction contained "\<attach-\%(file\|key\)\>"
+syn match muttrcFunction contained "\<change-\%(dir\|folder\|folder-readonly\)\>"
+syn match muttrcFunction contained "\<check-\%(new\|traditional-pgp\)\>"
+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 "\<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\|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\)\>"
+syn match muttrcFunction contained "\<search\%(-\%(next\|opposite\|reverse\|toggle\)\)\?\>"
+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
+syn match muttrcAction contained "<[^>]\{-}>" contains=muttrcBadAction,muttrcFunction,muttrcKeyName
+
+syn keyword muttrcCommand set skipwhite nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn keyword muttrcCommand unset skipwhite nextgroup=muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn keyword muttrcCommand reset skipwhite nextgroup=muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syn keyword muttrcCommand toggle skipwhite nextgroup=muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+" First, functions that take regular expressions:
+syn match muttrcRXHookNot contained /!\s*/ skipwhite nextgroup=muttrcRXHookString,muttrcRXHookStringNL
+syn match muttrcRXHooks /\<\%(account\|folder\)-hook\>/ skipwhite nextgroup=muttrcRXHookNot,muttrcRXHookString,muttrcRXHookStringNL
+
+" Now, functions that take patterns
+syn match muttrcPatHookNot contained /!\s*/ skipwhite nextgroup=muttrcPattern
+syn match muttrcPatHooks /\<\%(mbox\|crypt\)-hook\>/ skipwhite nextgroup=muttrcPatHookNot,muttrcPattern
+syn match muttrcPatHooks /\<\%(message\|reply\|send\|send2\|save\|\|fcc\%(-save\)\?\)-hook\>/ skipwhite nextgroup=muttrcPatHookNot,muttrcOptPattern
+
+syn match muttrcBindFunction contained /\S\+\>/ skipwhite contains=muttrcFunction
+syn match muttrcBindFunctionNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcBindFunction,muttrcBindFunctionNL
+syn match muttrcBindKey contained /\S\+/ skipwhite contains=muttrcKey nextgroup=muttrcBindFunction,muttrcBindFunctionNL
+syn match muttrcBindKeyNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcBindKey,muttrcBindKeyNL
+syn match muttrcBindMenuList contained /\S\+/ skipwhite contains=muttrcMenu,muttrcMenuCommas nextgroup=muttrcBindKey,muttrcBindKeyNL
+syn match muttrcBindMenuListNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcBindMenuList,muttrcBindMenuListNL
+syn keyword muttrcCommand skipwhite bind nextgroup=muttrcBindMenuList,muttrcBindMenuListNL
+
+syn region muttrcMacroDescr contained keepend skipwhite start=+\s*\S+ms=e skip=+\\ + end=+ \|$+me=s
+syn region muttrcMacroDescr contained keepend skipwhite start=+'+ms=e skip=+\\'+ end=+'+me=s
+syn region muttrcMacroDescr contained keepend skipwhite start=+"+ms=e skip=+\\"+ end=+"+me=s
+syn match muttrcMacroDescrNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcMacroDescr,muttrcMacroDescrNL
+syn region muttrcMacroBody contained skipwhite start="\S" skip='\\ \|\\$' end=' \|$' contains=muttrcEscape,muttrcSet,muttrcUnset,muttrcReset,muttrcToggle,muttrcCommand,muttrcAction nextgroup=muttrcMacroDescr,muttrcMacroDescrNL
+syn 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
+syn 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
+syn match muttrcMacroBodyNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcMacroBody,muttrcMacroBodyNL
+syn match muttrcMacroKey contained /\S\+/ skipwhite contains=muttrcKey nextgroup=muttrcMacroBody,muttrcMacroBodyNL
+syn match muttrcMacroKeyNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcMacroKey,muttrcMacroKeyNL
+syn match muttrcMacroMenuList contained /\S\+/ skipwhite contains=muttrcMenu,muttrcMenuCommas nextgroup=muttrcMacroKey,muttrcMacroKeyNL
+syn match muttrcMacroMenuListNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcMacroMenuList,muttrcMacroMenuListNL
+syn keyword muttrcCommand skipwhite macro nextgroup=muttrcMacroMenuList,muttrcMacroMenuListNL
+
+syn match muttrcAddrContent contained "[a-zA-Z0-9._-]\+@[a-zA-Z0-9./-]\+\s*" skipwhite contains=muttrcEmail nextgroup=muttrcAddrContent
+syn region muttrcAddrContent contained start=+'+ end=+'\s*+ skip=+\\'+ skipwhite contains=muttrcEmail nextgroup=muttrcAddrContent
+syn region muttrcAddrContent contained start=+"+ end=+"\s*+ skip=+\\"+ skipwhite contains=muttrcEmail nextgroup=muttrcAddrContent
+syn match muttrcAddrDef contained "-addr\s\+" skipwhite nextgroup=muttrcAddrContent
+
+syn match muttrcGroupFlag contained "-group"
+syn region muttrcGroupDef contained start="-group\s\+" skip="\\$" end="\s" skipwhite keepend contains=muttrcGroupFlag,muttrcUnHighlightSpace
+
+syn keyword muttrcGroupKeyword contained group ungroup
+syn region muttrcGroupLine keepend start=+^\s*\%(un\)\?group\s+ skip=+\\$+ end=+$+ contains=muttrcGroupKeyword,muttrcGroupDef,muttrcAddrDef,muttrcRXDef,muttrcUnHighlightSpace,muttrcComment
+
+syn match muttrcAliasGroupName contained /\w\+/ skipwhite nextgroup=muttrcAliasGroupDef,muttrcAliasKey,muttrcAliasNL
+syn match muttrcAliasGroupDefNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasGroupName,muttrcAliasGroupDefNL
+syn match muttrcAliasGroupDef contained /\s*-group/ skipwhite nextgroup=muttrcAliasGroupName,muttrcAliasGroupDefNL contains=muttrcGroupFlag
+syn match muttrcAliasComma contained /,/ skipwhite nextgroup=muttrcAliasEmail,muttrcAliasEncEmail,muttrcAliasNameNoParens,muttrcAliasENNL
+syn match muttrcAliasEmail contained /\S\+@\S\+/ contains=muttrcEmail nextgroup=muttrcAliasName,muttrcAliasNameNL skipwhite
+syn match muttrcAliasEncEmail contained /<[^>]\+>/ contains=muttrcEmail nextgroup=muttrcAliasComma
+syn match muttrcAliasEncEmailNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasEncEmail,muttrcAliasEncEmailNL
+syn match muttrcAliasNameNoParens contained /[^<(@]\+\s\+/ nextgroup=muttrcAliasEncEmail,muttrcAliasEncEmailNL
+syn region muttrcAliasName contained matchgroup=Type start=/(/ end=/)/ skipwhite
+syn match muttrcAliasNameNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasName,muttrcAliasNameNL
+syn match muttrcAliasENNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasEmail,muttrcAliasEncEmail,muttrcAliasNameNoParens,muttrcAliasENNL
+syn match muttrcAliasKey contained /\s*[^- \t]\S\+/ skipwhite nextgroup=muttrcAliasEmail,muttrcAliasEncEmail,muttrcAliasNameNoParens,muttrcAliasENNL
+syn match muttrcAliasNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcAliasGroupDef,muttrcAliasKey,muttrcAliasNL
+syn keyword muttrcCommand skipwhite alias nextgroup=muttrcAliasGroupDef,muttrcAliasKey,muttrcAliasNL
+
+syn match muttrcUnAliasKey contained "\s*\w\+\s*" skipwhite nextgroup=muttrcUnAliasKey,muttrcUnAliasNL
+syn match muttrcUnAliasNL contained /\s*\\$/ skipwhite skipnl nextgroup=muttrcUnAliasKey,muttrcUnAliasNL
+syn keyword muttrcCommand skipwhite unalias nextgroup=muttrcUnAliasKey,muttrcUnAliasNL
+
+syn match muttrcSimplePat contained "!\?\^\?[~][ADEFgGklNOpPQRSTuUvV=$]"
+syn match muttrcSimplePat contained "!\?\^\?[~][mnXz]\s*\%([<>-][0-9]\+[kM]\?\|[0-9]\+[kM]\?[-]\%([0-9]\+[kM]\?\)\?\)"
+syn 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
+syn match muttrcSimplePat contained "!\?\^\?[~][bBcCefhHiLstxy]\s*" nextgroup=muttrcSimplePatRXContainer
+syn match muttrcSimplePat contained "!\?\^\?[%][bBcCefhHiLstxy]\s*" nextgroup=muttrcSimplePatString
+syn match muttrcSimplePat contained "!\?\^\?[=][bcCefhHiLstxy]\s*" nextgroup=muttrcSimplePatString
+syn region muttrcSimplePat contained keepend start=+!\?\^\?[~](+ end=+)+ contains=muttrcSimplePat
+"syn match muttrcSimplePat contained /'[^~=%][^']*/ contains=muttrcRXString
+syn region muttrcSimplePatString contained keepend start=+"+ end=+"+ skip=+\\"+
+syn region muttrcSimplePatString contained keepend start=+'+ end=+'+ skip=+\\'+
+syn region muttrcSimplePatString contained keepend start=+[^ "']+ skip=+\\ + end=+\s+re=e-1
+syn region muttrcSimplePatRXContainer contained keepend start=+"+ end=+"+ skip=+\\"+ contains=muttrcRXString
+syn region muttrcSimplePatRXContainer contained keepend start=+'+ end=+'+ skip=+\\'+ contains=muttrcRXString
+syn region muttrcSimplePatRXContainer contained keepend start=+[^ "']+ skip=+\\ + end=+\s+re=e-1 contains=muttrcRXString
+syn match muttrcSimplePatMetas contained /[(|)]/
+
+syn match muttrcOptSimplePat contained skipwhite /[~=%!(^].*/ contains=muttrcSimplePat,muttrcSimplePatMetas
+syn match muttrcOptSimplePat contained skipwhite /[^~=%!(^].*/ contains=muttrcRXString
+syn region muttrcOptPattern contained matchgroup=Type keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcOptSimplePat,muttrcUnHighlightSpace nextgroup=muttrcString,muttrcStringNL
+syn region muttrcOptPattern contained matchgroup=Type keepend skipwhite start=+'+ skip=+\\'+ end=+'+ contains=muttrcOptSimplePat,muttrcUnHighlightSpace nextgroup=muttrcString,muttrcStringNL
+syn region muttrcOptPattern contained keepend skipwhite start=+[~](+ end=+)+ skip=+\\)+ contains=muttrcSimplePat nextgroup=muttrcString,muttrcStringNL
+syn match muttrcOptPattern contained skipwhite /[~][A-Za-z]/ contains=muttrcSimplePat nextgroup=muttrcString,muttrcStringNL
+syn match muttrcOptPattern contained skipwhite /[.]/ nextgroup=muttrcString,muttrcStringNL
+" Keep muttrcPattern and muttrcOptPattern synchronized
+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
+syn 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).
+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 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
+endif
+syn keyword muttrcColor contained black blue cyan default green magenta red white yellow
+syn keyword muttrcColor contained brightblack brightblue brightcyan brightdefault brightgreen brightmagenta brightred brightwhite brightyellow
+syn match muttrcColor contained "\<\%(bright\)\=color\d\{1,3}\>"
+" Now for the structure of the color line
+syn match muttrcColorRXNL contained skipnl "\s*\\$" nextgroup=muttrcColorRXPat,muttrcColorRXNL
+syn match muttrcColorBG contained /\s*[$]\?\w\+/ contains=muttrcColor,muttrcVariable,muttrcUnHighlightSpace nextgroup=muttrcColorRXPat,muttrcColorRXNL
+syn match muttrcColorBGNL contained skipnl "\s*\\$" nextgroup=muttrcColorBG,muttrcColorBGNL
+syn match muttrcColorFG contained /\s*[$]\?\w\+/ contains=muttrcColor,muttrcVariable,muttrcUnHighlightSpace nextgroup=muttrcColorBG,muttrcColorBGNL
+syn match muttrcColorFGNL contained skipnl "\s*\\$" nextgroup=muttrcColorFG,muttrcColorFGNL
+syn match muttrcColorContext contained /\s*[$]\?\w\+/ contains=muttrcColorField,muttrcVariable,muttrcUnHighlightSpace nextgroup=muttrcColorFG,muttrcColorFGNL
+syn match muttrcColorNL contained skipnl "\s*\\$" nextgroup=muttrcColorContext,muttrcColorNL
+syn match muttrcColorKeyword contained /^\s*color\s\+/ nextgroup=muttrcColorContext,muttrcColorNL
+syn region muttrcColorLine keepend start=/^\s*color\s\+\%(index\|header\)\@!/ skip=+\\$+ end=+$+ contains=muttrcColorKeyword,muttrcComment,muttrcUnHighlightSpace
+" Now for the structure of the color index line
+syn match muttrcPatternNL contained skipnl "\s*\\$" nextgroup=muttrcPattern,muttrcPatternNL
+syn match muttrcColorBGI contained /\s*[$]\?\w\+\s*/ contains=muttrcColor,muttrcVariable,muttrcUnHighlightSpace nextgroup=muttrcPattern,muttrcPatternNL
+syn match muttrcColorBGNLI contained skipnl "\s*\\$" nextgroup=muttrcColorBGI,muttrcColorBGNLI
+syn match muttrcColorFGI contained /\s*[$]\?\w\+/ contains=muttrcColor,muttrcVariable,muttrcUnHighlightSpace nextgroup=muttrcColorBGI,muttrcColorBGNLI
+syn match muttrcColorFGNLI contained skipnl "\s*\\$" nextgroup=muttrcColorFGI,muttrcColorFGNLI
+syn match muttrcColorContextI contained /\s*\<index\>/ contains=muttrcUnHighlightSpace nextgroup=muttrcColorFGI,muttrcColorFGNLI
+syn match muttrcColorNLI contained skipnl "\s*\\$" nextgroup=muttrcColorContextI,muttrcColorNLI
+syn match muttrcColorKeywordI contained skipwhite /\<color\>/ nextgroup=muttrcColorContextI,muttrcColorNLI
+syn region muttrcColorLine keepend skipwhite start=/\<color\s\+index\>/ skip=+\\$+ end=+$+ contains=muttrcColorKeywordI,muttrcComment,muttrcUnHighlightSpace
+" Now for the structure of the color header line
+syn match muttrcRXPatternNL contained skipnl "\s*\\$" nextgroup=muttrcRXString,muttrcRXPatternNL
+syn match muttrcColorBGH contained /\s*[$]\?\w\+\s*/ contains=muttrcColor,muttrcVariable,muttrcUnHighlightSpace nextgroup=muttrcRXString,muttrcRXPatternNL
+syn match muttrcColorBGNLH contained skipnl "\s*\\$" nextgroup=muttrcColorBGH,muttrcColorBGNLH
+syn match muttrcColorFGH contained /\s*[$]\?\w\+/ contains=muttrcColor,muttrcVariable,muttrcUnHighlightSpace nextgroup=muttrcColorBGH,muttrcColorBGNLH
+syn match muttrcColorFGNLH contained skipnl "\s*\\$" nextgroup=muttrcColorFGH,muttrcColorFGNLH
+syn match muttrcColorContextH contained /\s*\<header\>/ contains=muttrcUnHighlightSpace nextgroup=muttrcColorFGH,muttrcColorFGNLH
+syn match muttrcColorNLH contained skipnl "\s*\\$" nextgroup=muttrcColorContextH,muttrcColorNLH
+syn match muttrcColorKeywordH contained skipwhite /\<color\>/ nextgroup=muttrcColorContextH,muttrcColorNLH
+syn region muttrcColorLine keepend skipwhite start=/\<color\s\+header\>/ skip=+\\$+ end=+$+ contains=muttrcColorKeywordH,muttrcComment,muttrcUnHighlightSpace
+" And now color's brother:
+syn region muttrcUnColorPatterns contained skipwhite start=+\s*'+ end=+'+ skip=+\\'+ contains=muttrcPattern nextgroup=muttrcUnColorPatterns,muttrcUnColorPatNL
+syn region muttrcUnColorPatterns contained skipwhite start=+\s*"+ end=+"+ skip=+\\"+ contains=muttrcPattern nextgroup=muttrcUnColorPatterns,muttrcUnColorPatNL
+syn match muttrcUnColorPatterns contained skipwhite /\s*[^'"\s]\S\*/ contains=muttrcPattern nextgroup=muttrcUnColorPatterns,muttrcUnColorPatNL
+syn match muttrcUnColorPatNL contained skipwhite skipnl /\s*\\$/ nextgroup=muttrcUnColorPatterns,muttrcUnColorPatNL
+syn match muttrcUnColorAll contained skipwhite /[*]/
+syn match muttrcUnColorAPNL contained skipwhite skipnl /\s*\\$/ nextgroup=muttrcUnColorPatterns,muttrcUnColorAll,muttrcUnColorAPNL
+syn match muttrcUnColorIndex contained skipwhite /\s*index\s\+/ nextgroup=muttrcUnColorPatterns,muttrcUnColorAll,muttrcUnColorAPNL
+syn match muttrcUnColorIndexNL contained skipwhite skipnl /\s*\\$/ nextgroup=muttrcUnColorIndex,muttrcUnColorIndexNL
+syn match muttrcUnColorKeyword contained skipwhite /^\s*uncolor\s\+/ nextgroup=muttrcUnColorIndex,muttrcUnColorIndexNL
+syn region muttrcUnColorLine keepend start=+^\s*uncolor\s+ skip=+\\$+ end=+$+ contains=muttrcUnColorKeyword,muttrcComment,muttrcUnHighlightSpace
+
+" Mono are almost like color (ojects inherited from color)
+syn keyword muttrcMonoAttrib contained bold none normal reverse standout underline
+syn keyword muttrcMono contained mono skipwhite nextgroup=muttrcColorField
+syn match muttrcMonoLine "^\s*mono\s\+\S\+" skipwhite nextgroup=muttrcMonoAttrib contains=muttrcMono
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+"EOF vim: ts=8 noet tw=100 sw=8 sts=0 ft=vim
diff --git a/runtime/syntax/mysql.vim b/runtime/syntax/mysql.vim
new file mode 100644
index 0000000..8bd7b64
--- /dev/null
+++ b/runtime/syntax/mysql.vim
@@ -0,0 +1,288 @@
+" Vim syntax file
+" Language: mysql
+" Maintainer: Kenneth J. Pronovici <pronovic@ieee.org>
+" Last Change: $LastChangedDate: 2016-04-11 10:31:04 -0500 (Mon, 11 Apr 2016) $
+" Filenames: *.mysql
+" 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
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Always ignore case
+syn case ignore
+
+" General keywords which don't fall into other categories
+syn keyword mysqlKeyword action add after aggregate all alter as asc auto_increment avg_row_length
+syn keyword mysqlKeyword both by
+syn keyword mysqlKeyword cascade change character check checksum column columns comment constraint create cross
+syn keyword mysqlKeyword current_date current_time current_timestamp
+syn keyword mysqlKeyword data database databases day day_hour day_minute day_second
+syn keyword mysqlKeyword default delayed delay_key_write delete desc describe distinct distinctrow drop
+syn keyword mysqlKeyword enclosed escape escaped explain
+syn keyword mysqlKeyword fields file first flush for foreign from full function
+syn keyword mysqlKeyword global grant grants group
+syn keyword mysqlKeyword having heap high_priority hosts hour hour_minute hour_second
+syn keyword mysqlKeyword identified ignore index infile inner insert insert_id into isam
+syn keyword mysqlKeyword join
+syn keyword mysqlKeyword key keys kill last_insert_id leading left limit lines load local lock logs long
+syn keyword mysqlKeyword low_priority
+syn keyword mysqlKeyword match max_rows middleint min_rows minute minute_second modify month myisam
+syn keyword mysqlKeyword natural no
+syn keyword mysqlKeyword on optimize option optionally order outer outfile
+syn keyword mysqlKeyword pack_keys partial password primary privileges procedure process processlist
+syn keyword mysqlKeyword read references reload rename replace restrict returns revoke right row rows
+syn keyword mysqlKeyword second select show shutdown soname sql_big_result sql_big_selects sql_big_tables sql_log_off
+syn keyword mysqlKeyword sql_log_update sql_low_priority_updates sql_select_limit sql_small_result sql_warnings starting
+syn keyword mysqlKeyword status straight_join string
+syn keyword mysqlKeyword table tables temporary terminated to trailing type
+syn keyword mysqlKeyword unique unlock unsigned update usage use using
+syn keyword mysqlKeyword values varbinary variables varying
+syn keyword mysqlKeyword where with write
+syn keyword mysqlKeyword year_month
+syn keyword mysqlKeyword zerofill
+
+" Special values
+syn keyword mysqlSpecial false null true
+
+" Strings (single- and double-quote)
+syn region mysqlString start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn region mysqlString start=+'+ skip=+\\\\\|\\'+ end=+'+
+
+" Numbers and hexidecimal values
+syn match mysqlNumber "-\=\<[0-9]*\>"
+syn match mysqlNumber "-\=\<[0-9]*\.[0-9]*\>"
+syn match mysqlNumber "-\=\<[0-9][0-9]*e[+-]\=[0-9]*\>"
+syn match mysqlNumber "-\=\<[0-9]*\.[0-9]*e[+-]\=[0-9]*\>"
+syn match mysqlNumber "\<0x[abcdefABCDEF0-9]*\>"
+
+" User variables
+syn match mysqlVariable "@\a*[A-Za-z0-9]*\([._]*[A-Za-z0-9]\)*"
+
+" Escaped column names
+syn match mysqlEscaped "`[^`]*`"
+
+" Comments (c-style, mysql-style and modified sql-style)
+syn region mysqlComment start="/\*" end="\*/"
+syn match mysqlComment "#.*"
+syn match mysqlComment "--\_s.*"
+syn sync ccomment mysqlComment
+
+" Column types
+"
+" This gets a bit ugly. There are two different problems we have to
+" deal with.
+"
+" The first problem is that some keywords like 'float' can be used
+" both with and without specifiers, i.e. 'float', 'float(1)' and
+" 'float(@var)' are all valid. We have to account for this and we
+" also have to make sure that garbage like floatn or float_(1) is not
+" highlighted.
+"
+" The second problem is that some of these keywords are included in
+" function names. For instance, year() is part of the name of the
+" dayofyear() function, and the dec keyword (no parenthesis) is part of
+" the name of the decode() function.
+
+syn keyword mysqlType tinyint smallint mediumint int integer bigint
+syn keyword mysqlType date datetime time bit bool
+syn keyword mysqlType tinytext mediumtext longtext text
+syn keyword mysqlType tinyblob mediumblob longblob blob
+syn region mysqlType start="float\W" end="."me=s-1
+syn region mysqlType start="float$" end="."me=s-1
+syn region mysqlType start="float(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="double\W" end="."me=s-1
+syn region mysqlType start="double$" end="."me=s-1
+syn region mysqlType start="double(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="double precision\W" end="."me=s-1
+syn region mysqlType start="double precision$" end="."me=s-1
+syn region mysqlType start="double precision(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="real\W" end="."me=s-1
+syn region mysqlType start="real$" end="."me=s-1
+syn region mysqlType start="real(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="numeric(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="dec\W" end="."me=s-1
+syn region mysqlType start="dec$" end="."me=s-1
+syn region mysqlType start="dec(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="decimal\W" end="."me=s-1
+syn region mysqlType start="decimal$" end="."me=s-1
+syn region mysqlType start="decimal(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="\Wtimestamp\W" end="."me=s-1
+syn region mysqlType start="\Wtimestamp$" end="."me=s-1
+syn region mysqlType start="\Wtimestamp(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="^timestamp\W" end="."me=s-1
+syn region mysqlType start="^timestamp$" end="."me=s-1
+syn region mysqlType start="^timestamp(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="\Wyear(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="^year(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="char(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="varchar(" end=")" contains=mysqlNumber,mysqlVariable
+syn region mysqlType start="enum(" end=")" contains=mysqlString,mysqlVariable
+syn region mysqlType start="\Wset(" end=")" contains=mysqlString,mysqlVariable
+syn region mysqlType start="^set(" end=")" contains=mysqlString,mysqlVariable
+
+" Logical, string and numeric operators
+syn keyword mysqlOperator between not and or is in like regexp rlike binary exists
+syn region mysqlOperator start="isnull(" end=")" contains=ALL
+syn region mysqlOperator start="coalesce(" end=")" contains=ALL
+syn region mysqlOperator start="interval(" end=")" contains=ALL
+
+" Control flow functions
+syn keyword mysqlFlow case when then else end
+syn region mysqlFlow start="ifnull(" end=")" contains=ALL
+syn region mysqlFlow start="nullif(" end=")" contains=ALL
+syn region mysqlFlow start="if(" end=")" contains=ALL
+
+" General Functions
+"
+" I'm leery of just defining keywords for functions, since according to the MySQL manual:
+"
+" Function names do not clash with table or column names. For example, ABS is a
+" valid column name. The only restriction is that for a function call, no spaces
+" are allowed between the function name and the `(' that follows it.
+"
+" This means that if I want to highlight function names properly, I have to use a
+" region to define them, not just a keyword. This will probably cause the syntax file
+" to load more slowly, but at least it will be 'correct'.
+
+syn region mysqlFunction start="abs(" end=")" contains=ALL
+syn region mysqlFunction start="acos(" end=")" contains=ALL
+syn region mysqlFunction start="adddate(" end=")" contains=ALL
+syn region mysqlFunction start="ascii(" end=")" contains=ALL
+syn region mysqlFunction start="asin(" end=")" contains=ALL
+syn region mysqlFunction start="atan(" end=")" contains=ALL
+syn region mysqlFunction start="atan2(" end=")" contains=ALL
+syn region mysqlFunction start="avg(" end=")" contains=ALL
+syn region mysqlFunction start="benchmark(" end=")" contains=ALL
+syn region mysqlFunction start="bin(" end=")" contains=ALL
+syn region mysqlFunction start="bit_and(" end=")" contains=ALL
+syn region mysqlFunction start="bit_count(" end=")" contains=ALL
+syn region mysqlFunction start="bit_or(" end=")" contains=ALL
+syn region mysqlFunction start="ceiling(" end=")" contains=ALL
+syn region mysqlFunction start="character_length(" end=")" contains=ALL
+syn region mysqlFunction start="char_length(" end=")" contains=ALL
+syn region mysqlFunction start="concat(" end=")" contains=ALL
+syn region mysqlFunction start="concat_ws(" end=")" contains=ALL
+syn region mysqlFunction start="connection_id(" end=")" contains=ALL
+syn region mysqlFunction start="conv(" end=")" contains=ALL
+syn region mysqlFunction start="cos(" end=")" contains=ALL
+syn region mysqlFunction start="cot(" end=")" contains=ALL
+syn region mysqlFunction start="count(" end=")" contains=ALL
+syn region mysqlFunction start="curdate(" end=")" contains=ALL
+syn region mysqlFunction start="curtime(" end=")" contains=ALL
+syn region mysqlFunction start="date_add(" end=")" contains=ALL
+syn region mysqlFunction start="date_format(" end=")" contains=ALL
+syn region mysqlFunction start="date_sub(" end=")" contains=ALL
+syn region mysqlFunction start="dayname(" end=")" contains=ALL
+syn region mysqlFunction start="dayofmonth(" end=")" contains=ALL
+syn region mysqlFunction start="dayofweek(" end=")" contains=ALL
+syn region mysqlFunction start="dayofyear(" end=")" contains=ALL
+syn region mysqlFunction start="decode(" end=")" contains=ALL
+syn region mysqlFunction start="degrees(" end=")" contains=ALL
+syn region mysqlFunction start="elt(" end=")" contains=ALL
+syn region mysqlFunction start="encode(" end=")" contains=ALL
+syn region mysqlFunction start="encrypt(" end=")" contains=ALL
+syn region mysqlFunction start="exp(" end=")" contains=ALL
+syn region mysqlFunction start="export_set(" end=")" contains=ALL
+syn region mysqlFunction start="extract(" end=")" contains=ALL
+syn region mysqlFunction start="field(" end=")" contains=ALL
+syn region mysqlFunction start="find_in_set(" end=")" contains=ALL
+syn region mysqlFunction start="floor(" end=")" contains=ALL
+syn region mysqlFunction start="format(" end=")" contains=ALL
+syn region mysqlFunction start="from_days(" end=")" contains=ALL
+syn region mysqlFunction start="from_unixtime(" end=")" contains=ALL
+syn region mysqlFunction start="get_lock(" end=")" contains=ALL
+syn region mysqlFunction start="greatest(" end=")" contains=ALL
+syn region mysqlFunction start="group_unique_users(" end=")" contains=ALL
+syn region mysqlFunction start="hex(" end=")" contains=ALL
+syn region mysqlFunction start="inet_aton(" end=")" contains=ALL
+syn region mysqlFunction start="inet_ntoa(" end=")" contains=ALL
+syn region mysqlFunction start="instr(" end=")" contains=ALL
+syn region mysqlFunction start="lcase(" end=")" contains=ALL
+syn region mysqlFunction start="least(" end=")" contains=ALL
+syn region mysqlFunction start="length(" end=")" contains=ALL
+syn region mysqlFunction start="load_file(" end=")" contains=ALL
+syn region mysqlFunction start="locate(" end=")" contains=ALL
+syn region mysqlFunction start="log(" end=")" contains=ALL
+syn region mysqlFunction start="log10(" end=")" contains=ALL
+syn region mysqlFunction start="lower(" end=")" contains=ALL
+syn region mysqlFunction start="lpad(" end=")" contains=ALL
+syn region mysqlFunction start="ltrim(" end=")" contains=ALL
+syn region mysqlFunction start="make_set(" end=")" contains=ALL
+syn region mysqlFunction start="master_pos_wait(" end=")" contains=ALL
+syn region mysqlFunction start="max(" end=")" contains=ALL
+syn region mysqlFunction start="md5(" end=")" contains=ALL
+syn region mysqlFunction start="mid(" end=")" contains=ALL
+syn region mysqlFunction start="min(" end=")" contains=ALL
+syn region mysqlFunction start="mod(" end=")" contains=ALL
+syn region mysqlFunction start="monthname(" end=")" contains=ALL
+syn region mysqlFunction start="now(" end=")" contains=ALL
+syn region mysqlFunction start="oct(" end=")" contains=ALL
+syn region mysqlFunction start="octet_length(" end=")" contains=ALL
+syn region mysqlFunction start="ord(" end=")" contains=ALL
+syn region mysqlFunction start="period_add(" end=")" contains=ALL
+syn region mysqlFunction start="period_diff(" end=")" contains=ALL
+syn region mysqlFunction start="pi(" end=")" contains=ALL
+syn region mysqlFunction start="position(" end=")" contains=ALL
+syn region mysqlFunction start="pow(" end=")" contains=ALL
+syn region mysqlFunction start="power(" end=")" contains=ALL
+syn region mysqlFunction start="quarter(" end=")" contains=ALL
+syn region mysqlFunction start="radians(" end=")" contains=ALL
+syn region mysqlFunction start="rand(" end=")" contains=ALL
+syn region mysqlFunction start="release_lock(" end=")" contains=ALL
+syn region mysqlFunction start="repeat(" end=")" contains=ALL
+syn region mysqlFunction start="reverse(" end=")" contains=ALL
+syn region mysqlFunction start="round(" end=")" contains=ALL
+syn region mysqlFunction start="rpad(" end=")" contains=ALL
+syn region mysqlFunction start="rtrim(" end=")" contains=ALL
+syn region mysqlFunction start="sec_to_time(" end=")" contains=ALL
+syn region mysqlFunction start="session_user(" end=")" contains=ALL
+syn region mysqlFunction start="sign(" end=")" contains=ALL
+syn region mysqlFunction start="sin(" end=")" contains=ALL
+syn region mysqlFunction start="soundex(" end=")" contains=ALL
+syn region mysqlFunction start="space(" end=")" contains=ALL
+syn region mysqlFunction start="sqrt(" end=")" contains=ALL
+syn region mysqlFunction start="std(" end=")" contains=ALL
+syn region mysqlFunction start="stddev(" end=")" contains=ALL
+syn region mysqlFunction start="strcmp(" end=")" contains=ALL
+syn region mysqlFunction start="subdate(" end=")" contains=ALL
+syn region mysqlFunction start="substring(" end=")" contains=ALL
+syn region mysqlFunction start="substring_index(" end=")" contains=ALL
+syn region mysqlFunction start="subtime(" end=")" contains=ALL
+syn region mysqlFunction start="sum(" end=")" contains=ALL
+syn region mysqlFunction start="sysdate(" end=")" contains=ALL
+syn region mysqlFunction start="system_user(" end=")" contains=ALL
+syn region mysqlFunction start="tan(" end=")" contains=ALL
+syn region mysqlFunction start="time_format(" end=")" contains=ALL
+syn region mysqlFunction start="time_to_sec(" end=")" contains=ALL
+syn region mysqlFunction start="to_days(" end=")" contains=ALL
+syn region mysqlFunction start="trim(" end=")" contains=ALL
+syn region mysqlFunction start="ucase(" end=")" contains=ALL
+syn region mysqlFunction start="unique_users(" end=")" contains=ALL
+syn region mysqlFunction start="unix_timestamp(" end=")" contains=ALL
+syn region mysqlFunction start="upper(" end=")" contains=ALL
+syn region mysqlFunction start="user(" end=")" contains=ALL
+syn region mysqlFunction start="version(" end=")" contains=ALL
+syn region mysqlFunction start="week(" end=")" contains=ALL
+syn region mysqlFunction start="weekday(" end=")" contains=ALL
+syn region mysqlFunction start="yearweek(" end=")" contains=ALL
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "mysql"
+
diff --git a/runtime/syntax/n1ql.vim b/runtime/syntax/n1ql.vim
new file mode 100644
index 0000000..bef65d8
--- /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
new file mode 100644
index 0000000..292d1b2
--- /dev/null
+++ b/runtime/syntax/named.vim
@@ -0,0 +1,229 @@
+" Vim syntax file
+" Language: BIND configuration file
+" Maintainer: Nick Hibma <nick@van-laarhoven.org>
+" Last Change: 2019 Oct 08
+" Filenames: named.conf, rndc.conf
+" Location: http://www.van-laarhoven.org/vim/syntax/named.vim
+"
+" Previously maintained by glory hump <rnd@web-drive.ru> and updated by Marcin
+" Dalecki.
+"
+" This file could do with a lot of improvements, so comments are welcome.
+" Please submit the named.conf (segment) with any comments.
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+setlocal iskeyword=.,-,48-58,A-Z,a-z,_
+
+syn sync match namedSync grouphere NONE "^(zone|controls|acl|key)"
+
+let s:save_cpo = &cpo
+set cpo-=C
+
+" BIND configuration file
+
+syn match namedComment "//.*"
+syn match namedComment "#.*"
+syn region namedComment start="/\*" end="\*/"
+syn region namedString start=/"/ end=/"/ contained
+" --- omitted trailing semicolon
+syn match namedError /[^;{#]$/
+
+" --- top-level keywords
+
+syn keyword namedInclude include nextgroup=namedString skipwhite
+syn keyword namedKeyword acl key nextgroup=namedIntIdent skipwhite
+syn keyword namedKeyword server nextgroup=namedIdentifier skipwhite
+syn keyword namedKeyword controls nextgroup=namedSection skipwhite
+syn keyword namedKeyword trusted-keys nextgroup=namedIntSection skipwhite
+syn keyword namedKeyword logging nextgroup=namedLogSection skipwhite
+syn keyword namedKeyword options nextgroup=namedOptSection skipwhite
+syn keyword namedKeyword zone nextgroup=namedZoneString skipwhite
+
+" --- Identifier: name of following { ... } Section
+syn match namedIdentifier contained /\k\+/ nextgroup=namedSection skipwhite
+" --- IntIdent: name of following IntSection
+syn match namedIntIdent contained /"\=\k\+"\=/ nextgroup=namedIntSection skipwhite
+
+" --- Section: { ... } clause
+syn region namedSection contained start=+{+ end=+};+ contains=namedSection,namedIntKeyword
+
+" --- IntSection: section that does not contain other sections
+syn region namedIntSection contained start=+{+ end=+}+ contains=namedIntKeyword,namedError,namedComment
+
+" --- IntKeyword: keywords contained within `{ ... }' sections only
+" + these keywords are contained within `key' and `acl' sections
+syn keyword namedIntKeyword contained key algorithm
+syn keyword namedIntKeyword contained secret nextgroup=namedString skipwhite
+
+" + these keywords are contained within `server' section only
+syn keyword namedIntKeyword contained bogus support-ixfr nextgroup=namedBool,namedNotBool skipwhite
+syn keyword namedIntKeyword contained transfers nextgroup=namedNumber,namedNotNumber skipwhite
+syn keyword namedIntKeyword contained transfer-format
+syn keyword namedIntKeyword contained keys nextgroup=namedIntSection skipwhite
+
+" + these keywords are contained within `controls' section only
+syn keyword namedIntKeyword contained inet nextgroup=namedIPaddr,namedIPerror skipwhite
+syn keyword namedIntKeyword contained unix nextgroup=namedString skipwhite
+syn keyword namedIntKeyword contained port perm owner group nextgroup=namedNumber,namedNotNumber skipwhite
+syn keyword namedIntKeyword contained allow nextgroup=namedIntSection skipwhite
+
+" + these keywords are contained within `update-policy' section only
+syn keyword namedIntKeyword contained grant nextgroup=namedString skipwhite
+syn keyword namedIntKeyword contained name self subdomain wildcard nextgroup=namedString skipwhite
+syn keyword namedIntKeyword TXT A PTR NS SOA A6 CNAME MX ANY skipwhite
+
+" --- options
+syn region namedOptSection contained start=+{+ end=+};+ contains=namedOption,namedCNOption,namedComment,namedParenError
+
+syn keyword namedOption contained version directory
+\ nextgroup=namedString skipwhite
+syn keyword namedOption contained named-xfer dump-file pid-file
+\ nextgroup=namedString skipwhite
+syn keyword namedOption contained mem-statistics-file statistics-file
+\ nextgroup=namedString skipwhite
+syn keyword namedOption contained auth-nxdomain deallocate-on-exit
+\ nextgroup=namedBool,namedNotBool skipwhite
+syn keyword namedOption contained dialup fake-iquery fetch-glue
+\ nextgroup=namedBool,namedNotBool skipwhite
+syn keyword namedOption contained has-old-clients host-statistics
+\ nextgroup=namedBool,namedNotBool skipwhite
+syn keyword namedOption contained maintain-ixfr-base multiple-cnames
+\ nextgroup=namedBool,namedNotBool skipwhite
+syn keyword namedOption contained notify recursion rfc2308-type1
+\ nextgroup=namedBool,namedNotBool skipwhite
+syn keyword namedOption contained use-id-pool treat-cr-as-space
+\ nextgroup=namedBool,namedNotBool skipwhite
+syn keyword namedOption contained also-notify forwarders
+\ nextgroup=namedIPlist skipwhite
+syn keyword namedOption contained forward check-names
+syn keyword namedOption contained allow-query allow-transfer allow-recursion
+\ nextgroup=namedAML skipwhite
+syn keyword namedOption contained blackhole listen-on
+\ nextgroup=namedIntSection skipwhite
+syn keyword namedOption contained lame-ttl max-transfer-time-in
+\ nextgroup=namedNumber,namedNotNumber skipwhite
+syn keyword namedOption contained max-ncache-ttl min-roots
+\ nextgroup=namedNumber,namedNotNumber skipwhite
+syn keyword namedOption contained serial-queries transfers-in
+\ nextgroup=namedNumber,namedNotNumber skipwhite
+syn keyword namedOption contained transfers-out transfers-per-ns
+syn keyword namedOption contained transfer-format
+syn keyword namedOption contained transfer-source
+\ nextgroup=namedIPaddr,namedIPerror skipwhite
+syn keyword namedOption contained max-ixfr-log-size
+\ nextgroup=namedNumber,namedNotNumber skipwhite
+syn keyword namedOption contained coresize datasize files stacksize
+syn keyword namedOption contained cleaning-interval interface-interval statistics-interval heartbeat-interval
+\ nextgroup=namedNumber,namedNotNumber skipwhite
+syn keyword namedOption contained topology sortlist rrset-order
+\ nextgroup=namedIntSection skipwhite
+
+syn match namedOption contained /\<query-source\s\+.*;/he=s+12 contains=namedQSKeywords
+syn keyword namedQSKeywords contained address port
+syn match namedCNOption contained /\<check-names\s\+.*;/he=s+11 contains=namedCNKeywords
+syn keyword namedCNKeywords contained fail warn ignore master slave response
+
+" --- logging facilities
+syn region namedLogSection contained start=+{+ end=+};+ contains=namedLogOption
+syn keyword namedLogOption contained channel nextgroup=namedIntIdent skipwhite
+syn keyword namedLogOption contained category nextgroup=namedIntIdent skipwhite
+syn keyword namedIntKeyword contained syslog null versions size severity
+syn keyword namedIntKeyword contained file nextgroup=namedString skipwhite
+syn keyword namedIntKeyword contained print-category print-severity print-time nextgroup=namedBool,namedNotBool skipwhite
+
+" --- zone section
+syn region namedZoneString contained oneline start=+"+ end=+"+ skipwhite
+\ contains=namedDomain,namedIllegalDom
+\ nextgroup=namedZoneClass,namedZoneSection
+syn keyword namedZoneClass contained in hs hesiod chaos
+\ IN HS HESIOD CHAOS
+\ nextgroup=namedZoneSection skipwhite
+
+syn region namedZoneSection contained start=+{+ end=+};+ contains=namedZoneOpt,namedCNOption,namedComment,namedMasters,namedParenError
+syn keyword namedZoneOpt contained file ixfr-base
+\ nextgroup=namedString skipwhite
+syn keyword namedZoneOpt contained notify dialup
+\ nextgroup=namedBool,namedNotBool skipwhite
+syn keyword namedZoneOpt contained pubkey forward
+syn keyword namedZoneOpt contained max-transfer-time-in
+\ nextgroup=namedNumber,namedNotNumber skipwhite
+syn keyword namedZoneOpt contained type nextgroup=namedZoneType skipwhite
+syn keyword namedZoneType contained master slave stub forward hint
+
+syn keyword namedZoneOpt contained masters forwarders
+\ nextgroup=namedIPlist skipwhite
+syn region namedIPlist contained start=+{+ end=+};+ contains=namedIPaddr,namedIPerror,namedParenError,namedComment
+syn keyword namedZoneOpt contained allow-update allow-query allow-transfer
+\ nextgroup=namedAML skipwhite
+syn keyword namedZoneOpt contained update-policy
+\ nextgroup=namedIntSection skipwhite
+
+" --- boolean parameter
+syn match namedNotBool contained "[^ ;]\+"
+syn keyword namedBool contained yes no true false 1 0
+
+" --- number parameter
+syn match namedNotNumber contained "[^ 0-9;]\+"
+syn match namedNumber contained "\d\+"
+
+" --- address match list
+syn region namedAML contained start=+{+ end=+};+ contains=namedParenError,namedComment,namedString
+
+" --- IPs & Domains
+syn match namedIPaddr contained /\<[0-9]\{1,3}\(\.[0-9]\{1,3}\)\{3};/he=e-1
+syn match namedDomain contained /\<[0-9A-Za-z][-0-9A-Za-z.]\+\>/ nextgroup=namedSpareDot
+syn match namedDomain contained /"\."/ms=s+1,me=e-1
+syn match namedSpareDot contained /\./
+
+" --- syntax errors
+syn match namedIllegalDom contained /"\S*[^-A-Za-z0-9.[:space:]]\S*"/ms=s+1,me=e-1
+syn match namedIPerror contained /\<\S*[^0-9.[:space:];]\S*/
+syn match namedEParenError contained +{+
+syn match namedParenError +}\([^;]\|$\)+
+
+" Define the default highlighting.
+" 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
+
+let b:current_syntax = "named"
+
+" vim: ts=17
diff --git a/runtime/syntax/nanorc.vim b/runtime/syntax/nanorc.vim
new file mode 100644
index 0000000..606ac7f
--- /dev/null
+++ b/runtime/syntax/nanorc.vim
@@ -0,0 +1,243 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword nanorcTodo contained TODO FIXME XXX NOTE
+
+syn region nanorcComment display oneline start='^\s*#' end='$'
+ \ contains=nanorcTodo,@Spell
+
+syn match nanorcBegin display '^'
+ \ nextgroup=nanorcKeyword,nanorcComment
+ \ skipwhite
+
+syn keyword nanorcKeyword contained set unset
+ \ nextgroup=nanorcBoolOption,
+ \ nanorcStringOption,nanorcNumberOption
+ \ skipwhite
+
+syn keyword nanorcKeyword contained syntax
+ \ nextgroup=nanorcSynGroupName skipwhite
+
+syn keyword nanorcKeyword contained color
+ \ nextgroup=@nanorcFGColor skipwhite
+
+syn keyword nanorcBoolOption contained autoindent backup const cut
+ \ historylog morespace mouse multibuffer
+ \ noconvert nofollow nohelp nowrap preserve
+ \ rebinddelete regexp smarthome smooth suspend
+ \ tempfile view
+
+syn keyword nanorcStringOption contained backupdir brackets operatingdir
+ \ punct quotestr speller whitespace
+ \ nextgroup=nanorcString skipwhite
+
+syn keyword nanorcNumberOption contained fill tabsize
+ \ nextgroup=nanorcNumber skipwhite
+
+syn region nanorcSynGroupName contained display oneline start=+"+
+ \ end=+"\ze\%([[:blank:]]\|$\)+
+ \ nextgroup=nanorcRegexes skipwhite
+
+syn match nanorcString contained display '".*"'
+
+syn region nanorcRegexes contained display oneline start=+"+
+ \ end=+"\ze\%([[:blank:]]\|$\)+
+ \ nextgroup=nanorcRegexes skipwhite
+
+syn match nanorcNumber contained display '[+-]\=\<\d\+\>'
+
+syn cluster nanorcFGColor contains=nanorcFGWhite,nanorcFGBlack,
+ \ nanorcFGRed,nanorcFGBlue,nanorcFGGreen,
+ \ nanorcFGYellow,nanorcFGMagenta,nanorcFGCyan,
+ \ nanorcFGBWhite,nanorcFGBBlack,nanorcFGBRed,
+ \ nanorcFGBBlue,nanorcFGBGreen,nanorcFGBYellow,
+ \ nanorcFGBMagenta,nanorcFGBCyan
+
+syn keyword nanorcFGWhite contained white
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBlack contained black
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGRed contained red
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBlue contained blue
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGGreen contained green
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGYellow contained yellow
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGMagenta contained magenta
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGCyan contained cyan
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBWhite contained brightwhite
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBBlack contained brightblack
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBRed contained brightred
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBBlue contained brightblue
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBGreen contained brightgreen
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBYellow contained brightyellow
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBMagenta contained brightmagenta
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn keyword nanorcFGBCyan contained brightcyan
+ \ nextgroup=@nanorcFGSpec skipwhite
+
+syn cluster nanorcBGColor contains=nanorcBGWhite,nanorcBGBlack,
+ \ nanorcBGRed,nanorcBGBlue,nanorcBGGreen,
+ \ nanorcBGYellow,nanorcBGMagenta,nanorcBGCyan,
+ \ nanorcBGBWhite,nanorcBGBBlack,nanorcBGBRed,
+ \ nanorcBGBBlue,nanorcBGBGreen,nanorcBGBYellow,
+ \ nanorcBGBMagenta,nanorcBGBCyan
+
+syn keyword nanorcBGWhite contained white
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBlack contained black
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGRed contained red
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBlue contained blue
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGGreen contained green
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGYellow contained yellow
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGMagenta contained magenta
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGCyan contained cyan
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBWhite contained brightwhite
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBBlack contained brightblack
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBRed contained brightred
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBBlue contained brightblue
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBGreen contained brightgreen
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBYellow contained brightyellow
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBMagenta contained brightmagenta
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn keyword nanorcBGBCyan contained brightcyan
+ \ nextgroup=@nanorcBGSpec skipwhite
+
+syn match nanorcBGColorSep contained ',' nextgroup=@nanorcBGColor
+
+syn cluster nanorcFGSpec contains=nanorcBGColorSep,nanorcRegexes,
+ \ nanorcStartRegion
+
+syn cluster nanorcBGSpec contains=nanorcRegexes,nanorcStartRegion
+
+syn keyword nanorcStartRegion contained start nextgroup=nanorcStartRegionEq
+
+syn match nanorcStartRegionEq contained '=' nextgroup=nanorcRegion
+
+syn region nanorcRegion contained display oneline start=+"+
+ \ end=+"\ze\%([[:blank:]]\|$\)+
+ \ nextgroup=nanorcEndRegion skipwhite
+
+syn keyword nanorcEndRegion contained end nextgroup=nanorcStartRegionEq
+
+syn match nanorcEndRegionEq contained '=' nextgroup=nanorcRegex
+
+syn region nanorcRegex contained display oneline start=+"+
+ \ end=+"\ze\%([[:blank:]]\|$\)+
+
+hi def link nanorcTodo Todo
+hi def link nanorcComment Comment
+hi def link nanorcKeyword Keyword
+hi def link nanorcBoolOption Identifier
+hi def link nanorcStringOption Identifier
+hi def link nanorcNumberOption Identifier
+hi def link nanorcSynGroupName String
+hi def link nanorcString String
+hi def link nanorcRegexes nanorcString
+hi def link nanorcNumber Number
+hi def nanorcFGWhite ctermfg=Gray guifg=Gray
+hi def nanorcFGBlack ctermfg=Black guifg=Black
+hi def nanorcFGRed ctermfg=DarkRed guifg=DarkRed
+hi def nanorcFGBlue ctermfg=DarkBlue guifg=DarkBlue
+hi def nanorcFGGreen ctermfg=DarkGreen guifg=DarkGreen
+hi def nanorcFGYellow ctermfg=Brown guifg=Brown
+hi def nanorcFGMagenta ctermfg=DarkMagenta guifg=DarkMagenta
+hi def nanorcFGCyan ctermfg=DarkCyan guifg=DarkCyan
+hi def nanorcFGBWhite ctermfg=White guifg=White
+hi def nanorcFGBBlack ctermfg=DarkGray guifg=DarkGray
+hi def nanorcFGBRed ctermfg=Red guifg=Red
+hi def nanorcFGBBlue ctermfg=Blue guifg=Blue
+hi def nanorcFGBGreen ctermfg=Green guifg=Green
+hi def nanorcFGBYellow ctermfg=Yellow guifg=Yellow
+hi def nanorcFGBMagenta ctermfg=Magenta guifg=Magenta
+hi def nanorcFGBCyan ctermfg=Cyan guifg=Cyan
+hi def link nanorcBGColorSep Normal
+hi def nanorcBGWhite ctermbg=Gray guibg=Gray
+hi def nanorcBGBlack ctermbg=Black guibg=Black
+hi def nanorcBGRed ctermbg=DarkRed guibg=DarkRed
+hi def nanorcBGBlue ctermbg=DarkBlue guibg=DarkBlue
+hi def nanorcBGGreen ctermbg=DarkGreen guibg=DarkGreen
+hi def nanorcBGYellow ctermbg=Brown guibg=Brown
+hi def nanorcBGMagenta ctermbg=DarkMagenta guibg=DarkMagenta
+hi def nanorcBGCyan ctermbg=DarkCyan guibg=DarkCyan
+hi def nanorcBGBWhite ctermbg=White guibg=White
+hi def nanorcBGBBlack ctermbg=DarkGray guibg=DarkGray
+hi def nanorcBGBRed ctermbg=Red guibg=Red
+hi def nanorcBGBBlue ctermbg=Blue guibg=Blue
+hi def nanorcBGBGreen ctermbg=Green guibg=Green
+hi def nanorcBGBYellow ctermbg=Yellow guibg=Yellow
+hi def nanorcBGBMagenta ctermbg=Magenta guibg=Magenta
+hi def nanorcBGBCyan ctermbg=Cyan guibg=Cyan
+hi def link nanorcStartRegion Type
+hi def link nanorcStartRegionEq Operator
+hi def link nanorcRegion nanorcString
+hi def link nanorcEndRegion Type
+hi def link nanorcEndRegionEq Operator
+hi def link nanorcRegex nanoRegexes
+
+let b:current_syntax = "nanorc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/nasm.vim b/runtime/syntax/nasm.vim
new file mode 100644
index 0000000..d763033
--- /dev/null
+++ b/runtime/syntax/nasm.vim
@@ -0,0 +1,527 @@
+" Vim syntax file
+" Language: NASM - The Netwide Assembler (v0.98)
+" 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>
+" Contributors: Leonard König <leonard.r.koenig@gmail.com> (C string highlighting), Peter Stanhope <dev.rptr@gmail.com> (Add missing 64-bit mode registers)
+" Last Change: 2017 Jan 23
+" NASM Home: http://www.nasm.us/
+
+
+
+" Setup Syntax:
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+" Assembler syntax is case insensetive
+syn case ignore
+
+
+
+" Vim search and movement commands on identifers
+" 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:
+syn region nasmComment start=";" keepend end="$" contains=@nasmGrpInComments
+syn region nasmSpecialComment start=";\*\*\*" keepend end="$"
+syn keyword nasmInCommentTodo contained TODO FIXME XXX[XXXXX]
+syn cluster nasmGrpInComments contains=nasmInCommentTodo
+syn cluster nasmGrpComments contains=@nasmGrpInComments,nasmComment,nasmSpecialComment
+
+
+
+" Label Identifiers:
+" in NASM: 'Everything is a Label'
+" Definition Label = label defined by %[i]define or %[i]assign
+" Identifier Label = label defined as first non-keyword on a line or %[i]macro
+syn match nasmLabelError "$\=\(\d\+\K\|[#.@]\|\$\$\k\)\k*\>"
+syn match nasmLabel "\<\(\h\|[?@]\)\k*\>"
+syn match nasmLabel "[\$\~]\(\h\|[?@]\)\k*\>"lc=1
+" Labels starting with one or two '.' are special
+syn match nasmLocalLabel "\<\.\(\w\|[#$?@~]\)\k*\>"
+syn match nasmLocalLabel "\<\$\.\(\w\|[#$?@~]\)\k*\>"ms=s+1
+if !exists("nasm_no_warn")
+ syn match nasmLabelWarn "\<\~\=\$\=[_.][_.\~]*\>"
+endif
+if exists("nasm_loose_syntax")
+ syn match nasmSpecialLabel "\<\.\.@\k\+\>"
+ syn match nasmSpecialLabel "\<\$\.\.@\k\+\>"ms=s+1
+ if !exists("nasm_no_warn")
+ syn match nasmLabelWarn "\<\$\=\.\.@\(\d\|[#$\.~]\)\k*\>"
+ endif
+ " disallow use of nasm internal label format
+ syn match nasmLabelError "\<\$\=\.\.@\d\+\.\k*\>"
+else
+ syn match nasmSpecialLabel "\<\.\.@\(\h\|[?@]\)\k*\>"
+ syn match nasmSpecialLabel "\<\$\.\.@\(\h\|[?@]\)\k*\>"ms=s+1
+endif
+" Labels can be dereferenced with '$' to destinguish them from reserved words
+syn match nasmLabelError "\<\$\K\k*\s*:"
+syn match nasmLabelError "^\s*\$\K\k*\>"
+syn match nasmLabelError "\<\~\s*\(\k*\s*:\|\$\=\.\k*\)"
+
+
+
+" Constants:
+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\>"
+syn match nasmOctNumber "\<\~\o\+q\>"lc=1
+syn match nasmDecNumber "\<\d\+\>"
+syn match nasmDecNumber "\<\~\d\+\>"lc=1
+syn match nasmHexNumber "\<\(\d\x*h\|0x\x\+\|\$\d\x*\)\>"
+syn match nasmHexNumber "\<\~\(\d\x*h\|0x\x\+\|\$\d\x*\)\>"lc=1
+syn match nasmFltNumber "\<\d\+\.\d*\(e[+-]\=\d\+\)\=\>"
+syn keyword nasmFltNumber Inf Infinity Indefinite NaN SNaN QNaN
+syn match nasmNumberError "\<\~\s*\d\+\.\d*\(e[+-]\=\d\+\)\=\>"
+
+
+" Netwide Assembler Storage Directives:
+" Storage types
+syn keyword nasmTypeError DF EXTRN FWORD RESF TBYTE
+syn keyword nasmType FAR NEAR SHORT
+syn keyword nasmType BYTE WORD DWORD QWORD DQWORD HWORD DHWORD TWORD
+syn keyword nasmType CDECL FASTCALL NONE PASCAL STDCALL
+syn keyword nasmStorage DB DW DD DQ DDQ DT
+syn keyword nasmStorage RESB RESW RESD RESQ RESDQ REST
+syn keyword nasmStorage EXTERN GLOBAL COMMON
+" Structured storage types
+syn match nasmTypeError "\<\(AT\|I\=\(END\)\=\(STRUCT\=\|UNION\)\|I\=END\)\>"
+syn match nasmStructureLabel contained "\<\(AT\|I\=\(END\)\=\(STRUCT\=\|UNION\)\|I\=END\)\>"
+" structures cannot be nested (yet) -> use: 'keepend' and 're='
+syn cluster nasmGrpCntnStruc contains=ALLBUT,@nasmGrpInComments,nasmMacroDef,@nasmGrpInMacros,@nasmGrpInPreCondits,nasmStructureDef,@nasmGrpInStrucs
+syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="^\s*STRUCT\>"hs=e-5 end="^\s*ENDSTRUCT\>"re=e-9 contains=@nasmGrpCntnStruc
+syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="^\s*STRUC\>"hs=e-4 end="^\s*ENDSTRUC\>"re=e-8 contains=@nasmGrpCntnStruc
+syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="\<ISTRUCT\=\>" end="\<IEND\(STRUCT\=\)\=\>" contains=@nasmGrpCntnStruc,nasmInStructure
+" union types are not part of nasm (yet)
+"syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="^\s*UNION\>"hs=e-4 end="^\s*ENDUNION\>"re=e-8 contains=@nasmGrpCntnStruc
+"syn region nasmStructureDef transparent matchgroup=nasmStructure keepend start="\<IUNION\>" end="\<IEND\(UNION\)\=\>" contains=@nasmGrpCntnStruc,nasmInStructure
+syn match nasmInStructure contained "^\s*AT\>"hs=e-1
+syn cluster nasmGrpInStrucs contains=nasmStructure,nasmInStructure,nasmStructureLabel
+
+
+
+" PreProcessor Instructions:
+" NAsm PreProcs start with %, but % is not a character
+syn match nasmPreProcError "%{\=\(%\=\k\+\|%%\+\k*\|[+-]\=\d\+\)}\="
+if exists("nasm_loose_syntax")
+ syn cluster nasmGrpNxtCtx contains=nasmStructureLabel,nasmLabel,nasmLocalLabel,nasmSpecialLabel,nasmLabelError,nasmPreProcError
+else
+ syn cluster nasmGrpNxtCtx contains=nasmStructureLabel,nasmLabel,nasmLabelError,nasmPreProcError
+endif
+
+" Multi-line macro
+syn cluster nasmGrpCntnMacro contains=ALLBUT,@nasmGrpInComments,nasmStructureDef,@nasmGrpInStrucs,nasmMacroDef,@nasmGrpPreCondits,nasmMemReference,nasmInMacPreCondit,nasmInMacStrucDef
+syn region nasmMacroDef matchgroup=nasmMacro keepend start="^\s*%macro\>"hs=e-5 start="^\s*%imacro\>"hs=e-6 end="^\s*%endmacro\>"re=e-9 contains=@nasmGrpCntnMacro,nasmInMacStrucDef
+if exists("nasm_loose_syntax")
+ syn match nasmInMacLabel contained "%\(%\k\+\>\|{%\k\+}\)"
+ syn match nasmInMacLabel contained "%\($\+\(\w\|[#\.?@~]\)\k*\>\|{$\+\(\w\|[#\.?@~]\)\k*}\)"
+ syn match nasmInMacPreProc contained "^\s*%\(push\|repl\)\>"hs=e-4 skipwhite nextgroup=nasmStructureLabel,nasmLabel,nasmInMacParam,nasmLocalLabel,nasmSpecialLabel,nasmLabelError,nasmPreProcError
+ if !exists("nasm_no_warn")
+ syn match nasmInMacLblWarn contained "%\(%[$\.]\k*\>\|{%[$\.]\k*}\)"
+ syn match nasmInMacLblWarn contained "%\($\+\(\d\|[#\.@~]\)\k*\|{\$\+\(\d\|[#\.@~]\)\k*}\)"
+ hi link nasmInMacCatLabel nasmInMacLblWarn
+ else
+ hi link nasmInMacCatLabel nasmInMacLabel
+ endif
+else
+ syn match nasmInMacLabel contained "%\(%\(\w\|[#?@~]\)\k*\>\|{%\(\w\|[#?@~]\)\k*}\)"
+ syn match nasmInMacLabel contained "%\($\+\(\h\|[?@]\)\k*\>\|{$\+\(\h\|[?@]\)\k*}\)"
+ hi link nasmInMacCatLabel nasmLabelError
+endif
+syn match nasmInMacCatLabel contained "\d\K\k*"lc=1
+syn match nasmInMacLabel contained "\d}\k\+"lc=2
+if !exists("nasm_no_warn")
+ syn match nasmInMacLblWarn contained "%\(\($\+\|%\)[_~][._~]*\>\|{\($\+\|%\)[_~][._~]*}\)"
+endif
+syn match nasmInMacPreProc contained "^\s*%pop\>"hs=e-3
+syn match nasmInMacPreProc contained "^\s*%\(push\|repl\)\>"hs=e-4 skipwhite nextgroup=@nasmGrpNxtCtx
+" structures cannot be nested (yet) -> use: 'keepend' and 're='
+syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="^\s*STRUCT\>"hs=e-5 end="^\s*ENDSTRUCT\>"re=e-9 contains=@nasmGrpCntnMacro
+syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="^\s*STRUC\>"hs=e-4 end="^\s*ENDSTRUC\>"re=e-8 contains=@nasmGrpCntnMacro
+syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="\<ISTRUCT\=\>" end="\<IEND\(STRUCT\=\)\=\>" contains=@nasmGrpCntnMacro,nasmInStructure
+" union types are not part of nasm (yet)
+"syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="^\s*UNION\>"hs=e-4 end="^\s*ENDUNION\>"re=e-8 contains=@nasmGrpCntnMacro
+"syn region nasmInMacStrucDef contained transparent matchgroup=nasmStructure keepend start="\<IUNION\>" end="\<IEND\(UNION\)\=\>" contains=@nasmGrpCntnMacro,nasmInStructure
+syn region nasmInMacPreConDef contained transparent matchgroup=nasmInMacPreCondit start="^\s*%ifnidni\>"hs=e-7 start="^\s*%if\(idni\|n\(ctx\|def\|idn\|num\|str\)\)\>"hs=e-6 start="^\s*%if\(ctx\|def\|idn\|nid\|num\|str\)\>"hs=e-5 start="^\s*%ifid\>"hs=e-4 start="^\s*%if\>"hs=e-2 end="%endif\>" contains=@nasmGrpCntnMacro,nasmInMacPreCondit,nasmInPreCondit
+" Todo: allow STRUC/ISTRUC to be used inside preprocessor conditional block
+syn match nasmInMacPreCondit contained transparent "ctx\s"lc=3 skipwhite nextgroup=@nasmGrpNxtCtx
+syn match nasmInMacPreCondit contained "^\s*%elifctx\>"hs=e-7 skipwhite nextgroup=@nasmGrpNxtCtx
+syn match nasmInMacPreCondit contained "^\s*%elifnctx\>"hs=e-8 skipwhite nextgroup=@nasmGrpNxtCtx
+syn match nasmInMacParamNum contained "\<\d\+\.list\>"me=e-5
+syn match nasmInMacParamNum contained "\<\d\+\.nolist\>"me=e-7
+syn match nasmInMacDirective contained "\.\(no\)\=list\>"
+syn match nasmInMacMacro contained transparent "macro\s"lc=5 skipwhite nextgroup=nasmStructureLabel
+syn match nasmInMacMacro contained "^\s*%rotate\>"hs=e-6
+syn match nasmInMacParam contained "%\([+-]\=\d\+\|{[+-]\=\d\+}\)"
+" nasm conditional macro operands/arguments
+" Todo: check feasebility; add too nasmGrpInMacros, etc.
+"syn match nasmInMacCond contained "\<\(N\=\([ABGL]E\=\|[CEOSZ]\)\|P[EO]\=\)\>"
+syn cluster nasmGrpInMacros contains=nasmMacro,nasmInMacMacro,nasmInMacParam,nasmInMacParamNum,nasmInMacDirective,nasmInMacLabel,nasmInMacLblWarn,nasmInMacMemRef,nasmInMacPreConDef,nasmInMacPreCondit,nasmInMacPreProc,nasmInMacStrucDef
+
+" Context pre-procs that are better used inside a macro
+if exists("nasm_ctx_outside_macro")
+ syn region nasmPreConditDef transparent matchgroup=nasmCtxPreCondit start="^\s*%ifnctx\>"hs=e-6 start="^\s*%ifctx\>"hs=e-5 end="%endif\>" contains=@nasmGrpCntnPreCon
+ syn match nasmCtxPreProc "^\s*%pop\>"hs=e-3
+ if exists("nasm_loose_syntax")
+ syn match nasmCtxLocLabel "%$\+\(\w\|[#.?@~]\)\k*\>"
+ else
+ syn match nasmCtxLocLabel "%$\+\(\h\|[?@]\)\k*\>"
+ endif
+ syn match nasmCtxPreProc "^\s*%\(push\|repl\)\>"hs=e-4 skipwhite nextgroup=@nasmGrpNxtCtx
+ syn match nasmCtxPreCondit contained transparent "ctx\s"lc=3 skipwhite nextgroup=@nasmGrpNxtCtx
+ syn match nasmCtxPreCondit contained "^\s*%elifctx\>"hs=e-7 skipwhite nextgroup=@nasmGrpNxtCtx
+ syn match nasmCtxPreCondit contained "^\s*%elifnctx\>"hs=e-8 skipwhite nextgroup=@nasmGrpNxtCtx
+ if exists("nasm_no_warn")
+ hi link nasmCtxPreCondit nasmPreCondit
+ hi link nasmCtxPreProc nasmPreProc
+ hi link nasmCtxLocLabel nasmLocalLabel
+ else
+ hi link nasmCtxPreCondit nasmPreProcWarn
+ hi link nasmCtxPreProc nasmPreProcWarn
+ hi link nasmCtxLocLabel nasmLabelWarn
+ endif
+endif
+
+" Conditional assembly
+syn cluster nasmGrpCntnPreCon contains=ALLBUT,@nasmGrpInComments,@nasmGrpInMacros,@nasmGrpInStrucs
+syn region nasmPreConditDef transparent matchgroup=nasmPreCondit start="^\s*%ifnidni\>"hs=e-7 start="^\s*%if\(idni\|n\(def\|idn\|num\|str\)\)\>"hs=e-6 start="^\s*%if\(def\|idn\|nid\|num\|str\)\>"hs=e-5 start="^\s*%ifid\>"hs=e-4 start="^\s*%if\>"hs=e-2 end="%endif\>" contains=@nasmGrpCntnPreCon
+syn match nasmInPreCondit contained "^\s*%el\(if\|se\)\>"hs=e-4
+syn match nasmInPreCondit contained "^\s*%elifid\>"hs=e-6
+syn match nasmInPreCondit contained "^\s*%elif\(def\|idn\|nid\|num\|str\)\>"hs=e-7
+syn match nasmInPreCondit contained "^\s*%elif\(n\(def\|idn\|num\|str\)\|idni\)\>"hs=e-8
+syn match nasmInPreCondit contained "^\s*%elifnidni\>"hs=e-9
+syn cluster nasmGrpInPreCondits contains=nasmPreCondit,nasmInPreCondit,nasmCtxPreCondit
+syn cluster nasmGrpPreCondits contains=nasmPreConditDef,@nasmGrpInPreCondits,nasmCtxPreProc,nasmCtxLocLabel
+
+" Other pre-processor statements
+syn match nasmPreProc "^\s*%\(rep\|use\)\>"hs=e-3
+syn match nasmPreProc "^\s*%line\>"hs=e-4
+syn match nasmPreProc "^\s*%\(clear\|error\|fatal\)\>"hs=e-5
+syn match nasmPreProc "^\s*%\(endrep\|strlen\|substr\)\>"hs=e-6
+syn match nasmPreProc "^\s*%\(exitrep\|warning\)\>"hs=e-7
+syn match nasmDefine "^\s*%undef\>"hs=e-5
+syn match nasmDefine "^\s*%\(assign\|define\)\>"hs=e-6
+syn match nasmDefine "^\s*%i\(assign\|define\)\>"hs=e-7
+syn match nasmDefine "^\s*%unmacro\>"hs=e-7
+syn match nasmInclude "^\s*%include\>"hs=e-7
+" Todo: Treat the line tail after %fatal, %error, %warning as text
+
+" Multiple pre-processor instructions on single line detection (obsolete)
+"syn match nasmPreProcError +^\s*\([^\t "%';][^"%';]*\|[^\t "';][^"%';]\+\)%\a\+\>+
+syn cluster nasmGrpPreProcs contains=nasmMacroDef,@nasmGrpInMacros,@nasmGrpPreCondits,nasmPreProc,nasmDefine,nasmInclude,nasmPreProcWarn,nasmPreProcError
+
+
+
+" Register Identifiers:
+" Register operands:
+syn match nasmGen08Register "\<[A-D][HL]\>"
+syn match nasmGen16Register "\<\([A-D]X\|[DS]I\|[BS]P\)\>"
+syn match nasmGen32Register "\<E\([A-D]X\|[DS]I\|[BS]P\)\>"
+syn match nasmGen64Register "\<R\([A-D]X\|[DS]I\|[BS]P\|[89]\|1[0-5]\|[89][WDB]\|1[0-5][WDB]\)\>"
+syn match nasmExtRegister "\<\([SB]PL\|[SD]IL\)\>"
+syn match nasmSegRegister "\<[C-GS]S\>"
+syn match nasmSpcRegister "\<E\=IP\>"
+syn match nasmFpuRegister "\<ST\o\>"
+syn match nasmMmxRegister "\<MM\o\>"
+syn match nasmSseRegister "\<XMM\o\>"
+syn match nasmCtrlRegister "\<CR\o\>"
+syn match nasmDebugRegister "\<DR\o\>"
+syn match nasmTestRegister "\<TR\o\>"
+syn match nasmRegisterError "\<\(CR[15-9]\|DR[4-58-9]\|TR[0-28-9]\)\>"
+syn match nasmRegisterError "\<X\=MM[8-9]\>"
+syn match nasmRegisterError "\<ST\((\d)\|[8-9]\>\)"
+syn match nasmRegisterError "\<E\([A-D][HL]\|[C-GS]S\)\>"
+" Memory reference operand (address):
+syn match nasmMemRefError "[[\]]"
+syn cluster nasmGrpCntnMemRef contains=ALLBUT,@nasmGrpComments,@nasmGrpPreProcs,@nasmGrpInStrucs,nasmMemReference,nasmMemRefError
+syn match nasmInMacMemRef contained "\[[^;[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmInMacLabel,nasmInMacLblWarn,nasmInMacParam
+syn match nasmMemReference "\[[^;[\]]\{-}\]" contains=@nasmGrpCntnMemRef,nasmPreProcError,nasmCtxLocLabel
+
+
+
+" Netwide Assembler Directives:
+" Compilation constants
+syn keyword nasmConstant __BITS__ __DATE__ __FILE__ __FORMAT__ __LINE__
+syn keyword nasmConstant __NASM_MAJOR__ __NASM_MINOR__ __NASM_VERSION__
+syn keyword nasmConstant __TIME__
+" Instruction modifiers
+syn match nasmInstructnError "\<TO\>"
+syn match nasmInstrModifier "\(^\|:\)\s*[C-GS]S\>"ms=e-1
+syn keyword nasmInstrModifier A16 A32 O16 O32
+syn match nasmInstrModifier "\<F\(ADD\|MUL\|\(DIV\|SUB\)R\=\)\s\+TO\>"lc=5,ms=e-1
+" the 'to' keyword is not allowed for fpu-pop instructions (yet)
+"syn match nasmInstrModifier "\<F\(ADD\|MUL\|\(DIV\|SUB\)R\=\)P\s\+TO\>"lc=6,ms=e-1
+" NAsm directives
+syn keyword nasmRepeat TIMES
+syn keyword nasmDirective ALIGN[B] INCBIN EQU NOSPLIT SPLIT
+syn keyword nasmDirective ABSOLUTE BITS SECTION SEGMENT
+syn keyword nasmDirective ENDSECTION ENDSEGMENT
+syn keyword nasmDirective __SECT__
+" Macro created standard directives: (requires %include)
+syn case match
+syn keyword nasmStdDirective ENDPROC EPILOGUE LOCALS PROC PROLOGUE USES
+syn keyword nasmStdDirective ENDIF ELSE ELIF ELSIF IF
+"syn keyword nasmStdDirective BREAK CASE DEFAULT ENDSWITCH SWITCH
+"syn keyword nasmStdDirective CASE OF ENDCASE
+syn keyword nasmStdDirective DO ENDFOR ENDWHILE FOR REPEAT UNTIL WHILE EXIT
+syn case ignore
+" Format specific directives: (all formats)
+" (excluded: extension directives to section, global, common and extern)
+syn keyword nasmFmtDirective ORG
+syn keyword nasmFmtDirective EXPORT IMPORT GROUP UPPERCASE SEG WRT
+syn keyword nasmFmtDirective LIBRARY
+syn case match
+syn keyword nasmFmtDirective _GLOBAL_OFFSET_TABLE_ __GLOBAL_OFFSET_TABLE_
+syn keyword nasmFmtDirective ..start ..got ..gotoff ..gotpc ..plt ..sym
+syn case ignore
+
+
+
+" Standard Instructions:
+syn match nasmInstructnError "\<\(F\=CMOV\|SET\)N\=\a\{0,2}\>"
+syn keyword nasmInstructnError CMPS MOVS LCS LODS STOS XLAT
+syn match nasmStdInstruction "\<MOV\>"
+syn match nasmInstructnError "\<MOV\s[^,;[]*\<CS\>\s*[^:]"he=e-1
+syn match nasmStdInstruction "\<\(CMOV\|J\|SET\)\(N\=\([ABGL]E\=\|[CEOSZ]\)\|P[EO]\=\)\>"
+syn match nasmStdInstruction "\<POP\>"
+syn keyword nasmStdInstruction AAA AAD AAM AAS ADC ADD AND
+syn keyword nasmStdInstruction BOUND BSF BSR BSWAP BT[C] BTR BTS
+syn keyword nasmStdInstruction CALL CBW CDQ CLC CLD CMC CMP CMPSB CMPSD CMPSW CMPSQ
+syn keyword nasmStdInstruction CMPXCHG CMPXCHG8B CPUID CWD[E] CQO
+syn keyword nasmStdInstruction DAA DAS DEC DIV ENTER
+syn keyword nasmStdInstruction IDIV IMUL INC INT[O] IRET[D] IRETW IRETQ
+syn keyword nasmStdInstruction JCXZ JECXZ JMP
+syn keyword nasmStdInstruction LAHF LDS LEA LEAVE LES LFS LGS LODSB LODSD LODSQ
+syn keyword nasmStdInstruction LODSW LOOP[E] LOOPNE LOOPNZ LOOPZ LSS
+syn keyword nasmStdInstruction MOVSB MOVSD MOVSW MOVSX MOVSQ MOVZX MUL NEG NOP NOT
+syn keyword nasmStdInstruction OR POPA[D] POPAW POPF[D] POPFW POPFQ
+syn keyword nasmStdInstruction PUSH[AD] PUSHAW PUSHF[D] PUSHFW PUSHFQ
+syn keyword nasmStdInstruction RCL RCR RETF RET[N] ROL ROR
+syn keyword nasmStdInstruction SAHF SAL SAR SBB SCASB SCASD SCASW
+syn keyword nasmStdInstruction SHL[D] SHR[D] STC STD STOSB STOSD STOSW STOSQ SUB
+syn keyword nasmStdInstruction TEST XADD XCHG XLATB XOR
+syn keyword nasmStdInstruction LFENCE MFENCE SFENCE
+
+
+" System Instructions: (usually privileged)
+" Verification of pointer parameters
+syn keyword nasmSysInstruction ARPL LAR LSL VERR VERW
+" Addressing descriptor tables
+syn keyword nasmSysInstruction LLDT SLDT LGDT SGDT
+" Multitasking
+syn keyword nasmSysInstruction LTR STR
+" Coprocessing and Multiprocessing (requires fpu and multiple cpu's resp.)
+syn keyword nasmSysInstruction CLTS LOCK WAIT
+" Input and Output
+syn keyword nasmInstructnError INS OUTS
+syn keyword nasmSysInstruction IN INSB INSW INSD OUT OUTSB OUTSB OUTSW OUTSD
+" Interrupt control
+syn keyword nasmSysInstruction CLI STI LIDT SIDT
+" System control
+syn match nasmSysInstruction "\<MOV\s[^;]\{-}\<CR\o\>"me=s+3
+syn keyword nasmSysInstruction HLT INVD LMSW
+syn keyword nasmSseInstruction PREFETCHT0 PREFETCHT1 PREFETCHT2 PREFETCHNTA
+syn keyword nasmSseInstruction RSM SFENCE SMSW SYSENTER SYSEXIT UD2 WBINVD
+" TLB (Translation Lookahead Buffer) testing
+syn match nasmSysInstruction "\<MOV\s[^;]\{-}\<TR\o\>"me=s+3
+syn keyword nasmSysInstruction INVLPG
+
+" Debugging Instructions: (privileged)
+syn match nasmDbgInstruction "\<MOV\s[^;]\{-}\<DR\o\>"me=s+3
+syn keyword nasmDbgInstruction INT1 INT3 RDMSR RDTSC RDPMC WRMSR
+
+
+" Floating Point Instructions: (requires FPU)
+syn match nasmFpuInstruction "\<FCMOVN\=\([AB]E\=\|[CEPUZ]\)\>"
+syn keyword nasmFpuInstruction F2XM1 FABS FADD[P] FBLD FBSTP
+syn keyword nasmFpuInstruction FCHS FCLEX FCOM[IP] FCOMP[P] FCOS
+syn keyword nasmFpuInstruction FDECSTP FDISI FDIV[P] FDIVR[P] FENI FFREE
+syn keyword nasmFpuInstruction FIADD FICOM[P] FIDIV[R] FILD
+syn keyword nasmFpuInstruction FIMUL FINCSTP FINIT FIST[P] FISUB[R]
+syn keyword nasmFpuInstruction FLD[1] FLDCW FLDENV FLDL2E FLDL2T FLDLG2
+syn keyword nasmFpuInstruction FLDLN2 FLDPI FLDZ FMUL[P]
+syn keyword nasmFpuInstruction FNCLEX FNDISI FNENI FNINIT FNOP FNSAVE
+syn keyword nasmFpuInstruction FNSTCW FNSTENV FNSTSW FNSTSW
+syn keyword nasmFpuInstruction FPATAN FPREM[1] FPTAN FRNDINT FRSTOR
+syn keyword nasmFpuInstruction FSAVE FSCALE FSETPM FSIN FSINCOS FSQRT
+syn keyword nasmFpuInstruction FSTCW FSTENV FST[P] FSTSW FSUB[P] FSUBR[P]
+syn keyword nasmFpuInstruction FTST FUCOM[IP] FUCOMP[P]
+syn keyword nasmFpuInstruction FXAM FXCH FXTRACT FYL2X FYL2XP1
+
+
+" Multi Media Xtension Packed Instructions: (requires MMX unit)
+" Standard MMX instructions: (requires MMX1 unit)
+syn match nasmInstructnError "\<P\(ADD\|SUB\)U\=S\=[DQ]\=\>"
+syn match nasmInstructnError "\<PCMP\a\{0,2}[BDWQ]\=\>"
+syn keyword nasmMmxInstruction EMMS MOVD MOVQ
+syn keyword nasmMmxInstruction PACKSSDW PACKSSWB PACKUSWB PADDB PADDD PADDW
+syn keyword nasmMmxInstruction PADDSB PADDSW PADDUSB PADDUSW PAND[N]
+syn keyword nasmMmxInstruction PCMPEQB PCMPEQD PCMPEQW PCMPGTB PCMPGTD PCMPGTW
+syn keyword nasmMmxInstruction PMACHRIW PMADDWD PMULHW PMULLW POR
+syn keyword nasmMmxInstruction PSLLD PSLLQ PSLLW PSRAD PSRAW PSRLD PSRLQ PSRLW
+syn keyword nasmMmxInstruction PSUBB PSUBD PSUBW PSUBSB PSUBSW PSUBUSB PSUBUSW
+syn keyword nasmMmxInstruction PUNPCKHBW PUNPCKHDQ PUNPCKHWD
+syn keyword nasmMmxInstruction PUNPCKLBW PUNPCKLDQ PUNPCKLWD PXOR
+" Extended MMX instructions: (requires MMX2/SSE unit)
+syn keyword nasmMmxInstruction MASKMOVQ MOVNTQ
+syn keyword nasmMmxInstruction PAVGB PAVGW PEXTRW PINSRW PMAXSW PMAXUB
+syn keyword nasmMmxInstruction PMINSW PMINUB PMOVMSKB PMULHUW PSADBW PSHUFW
+
+
+" Streaming SIMD Extension Packed Instructions: (requires SSE unit)
+syn match nasmInstructnError "\<CMP\a\{1,5}[PS]S\>"
+syn match nasmSseInstruction "\<CMP\(N\=\(EQ\|L[ET]\)\|\(UN\)\=ORD\)\=[PS]S\>"
+syn keyword nasmSseInstruction ADDPS ADDSS ANDNPS ANDPS
+syn keyword nasmSseInstruction COMISS CVTPI2PS CVTPS2PI
+syn keyword nasmSseInstruction CVTSI2SS CVTSS2SI CVTTPS2PI CVTTSS2SI
+syn keyword nasmSseInstruction DIVPS DIVSS FXRSTOR FXSAVE LDMXCSR
+syn keyword nasmSseInstruction MAXPS MAXSS MINPS MINSS MOVAPS MOVHLPS MOVHPS
+syn keyword nasmSseInstruction MOVLHPS MOVLPS MOVMSKPS MOVNTPS MOVSS MOVUPS
+syn keyword nasmSseInstruction MULPS MULSS
+syn keyword nasmSseInstruction ORPS RCPPS RCPSS RSQRTPS RSQRTSS
+syn keyword nasmSseInstruction SHUFPS SQRTPS SQRTSS STMXCSR SUBPS SUBSS
+syn keyword nasmSseInstruction UCOMISS UNPCKHPS UNPCKLPS XORPS
+
+
+" Three Dimensional Now Packed Instructions: (requires 3DNow! unit)
+syn keyword nasmNowInstruction FEMMS PAVGUSB PF2ID PFACC PFADD PFCMPEQ PFCMPGE
+syn keyword nasmNowInstruction PFCMPGT PFMAX PFMIN PFMUL PFRCP PFRCPIT1
+syn keyword nasmNowInstruction PFRCPIT2 PFRSQIT1 PFRSQRT PFSUB[R] PI2FD
+syn keyword nasmNowInstruction PMULHRWA PREFETCH[W]
+
+
+" Vendor Specific Instructions:
+" Cyrix instructions (requires Cyrix processor)
+syn keyword nasmCrxInstruction PADDSIW PAVEB PDISTIB PMAGW PMULHRW[C] PMULHRIW
+syn keyword nasmCrxInstruction PMVGEZB PMVLZB PMVNZB PMVZB PSUBSIW
+syn keyword nasmCrxInstruction RDSHR RSDC RSLDT SMINT SMINTOLD SVDC SVLDT SVTS
+syn keyword nasmCrxInstruction WRSHR
+" AMD instructions (requires AMD processor)
+syn keyword nasmAmdInstruction SYSCALL SYSRET
+
+
+" Undocumented Instructions:
+syn match nasmUndInstruction "\<POP\s[^;]*\<CS\>"me=s+3
+syn keyword nasmUndInstruction CMPXCHG486 IBTS ICEBP INT01 INT03 LOADALL
+syn keyword nasmUndInstruction LOADALL286 LOADALL386 SALC SMI UD1 UMOV XBTS
+
+
+
+" Synchronize Syntax:
+syn sync clear
+syn sync minlines=50 "for multiple region nesting
+syn sync match nasmSync grouphere nasmMacroDef "^\s*%i\=macro\>"me=s-1
+syn sync match nasmSync grouphere NONE "^\s*%endmacro\>"
+
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "nasm"
+
+" vim:ts=8 sw=4
diff --git a/runtime/syntax/nastran.vim b/runtime/syntax/nastran.vim
new file mode 100644
index 0000000..239fd6e
--- /dev/null
+++ b/runtime/syntax/nastran.vim
@@ -0,0 +1,181 @@
+" Vim syntax file
+" Language: NASTRAN input/DMAP
+" Maintainer: Tom Kowalski <trk@schaefferas.com>
+" Last change: April 27, 2001
+" Thanks to the authors and maintainers of fortran.vim.
+" Since DMAP shares some traits with fortran, this syntax file
+" is based on the fortran.vim syntax file.
+"----------------------------------------------------------------------
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+" DMAP is not case dependent
+syn case ignore
+"
+"--------------------DMAP SYNTAX---------------------------------------
+"
+" -------Executive Modules and Statements
+"
+syn keyword nastranDmapexecmod call dbview delete end equiv equivx exit
+syn keyword nastranDmapexecmod file message purge purgex return subdmap
+syn keyword nastranDmapType type
+syn keyword nastranDmapLabel go to goto
+syn keyword nastranDmapRepeat if else elseif endif then
+syn keyword nastranDmapRepeat do while
+syn region nastranDmapString start=+"+ end=+"+ oneline
+syn region nastranDmapString start=+'+ end=+'+ oneline
+" If you don't like initial tabs in dmap (or at all)
+"syn match nastranDmapIniTab "^\t.*$"
+"syn match nastranDmapTab "\t"
+
+" Any integer
+syn match nastranDmapNumber "-\=\<[0-9]\+\>"
+" floating point number, with dot, optional exponent
+syn match nastranDmapFloat "\<[0-9]\+\.[0-9]*\([edED][-+]\=[0-9]\+\)\=\>"
+" floating point number, starting with a dot, optional exponent
+syn match nastranDmapFloat "\.[0-9]\+\([edED][-+]\=[0-9]\+\)\=\>"
+" floating point number, without dot, with exponent
+syn match nastranDmapFloat "\<[0-9]\+[edED][-+]\=[0-9]\+\>"
+
+syn match nastranDmapLogical "\(true\|false\)"
+
+syn match nastranDmapPreCondit "^#define\>"
+syn match nastranDmapPreCondit "^#include\>"
+"
+" -------Comments may be contained in another line.
+"
+syn match nastranDmapComment "^[\$].*$"
+syn match nastranDmapComment "\$.*$"
+syn match nastranDmapComment "^[\$].*$" contained
+syn match nastranDmapComment "\$.*$" contained
+" Treat all past 72nd column as a comment. Do not work with tabs!
+" Breaks down when 72-73rd column is in another match (eg number or keyword)
+syn match nastranDmapComment "^.\{-72}.*$"lc=72 contained
+
+"
+" -------Utility Modules
+"
+syn keyword nastranDmapUtilmod append copy dbc dbdict dbdir dmin drms1
+syn keyword nastranDmapUtilmod dtiin eltprt ifp ifp1 inputt2 inputt4 lamx
+syn keyword nastranDmapUtilmod matgen matgpr matmod matpch matprn matprt
+syn keyword nastranDmapUtilmod modtrl mtrxin ofp output2 output4 param
+syn keyword nastranDmapUtilmod paraml paramr prtparam pvt scalar
+syn keyword nastranDmapUtilmod seqp setval tabedit tabprt tabpt vec vecplot
+syn keyword nastranDmapUtilmod xsort
+"
+" -------Matrix Modules
+"
+syn keyword nastranDmapMatmod add add5 cead dcmp decomp diagonal fbs merge
+syn keyword nastranDmapMatmod mpyad norm read reigl smpyad solve solvit
+syn keyword nastranDmapMatmod trnsp umerge umerge1 upartn dmiin partn
+syn region nastranDmapMatmod start=+^ *[Dd][Mm][Ii]+ end=+[\/]+
+"
+" -------Implicit Functions
+"
+syn keyword nastranDmapImplicit abs acos acosh andl asin asinh atan atan2
+syn keyword nastranDmapImplicit atanh atanh2 char clen clock cmplx concat1
+syn keyword nastranDmapImplicit concat2 concat3 conjg cos cosh dble diagoff
+syn keyword nastranDmapImplicit diagon dim dlablank dlxblank dprod eqvl exp
+syn keyword nastranDmapImplicit getdiag getsys ichar imag impl index indexstr
+syn keyword nastranDmapImplicit int itol leq lge lgt lle llt lne log log10
+syn keyword nastranDmapImplicit logx ltoi mcgetsys mcputsys max min mod neqvl
+syn keyword nastranDmapImplicit nint noop normal notl numeq numge numgt numle
+syn keyword nastranDmapImplicit numlt numne orl pi precison putdiag putsys
+syn keyword nastranDmapImplicit rand rdiagon real rtimtogo setcore sign sin
+syn keyword nastranDmapImplicit sinh sngl sprod sqrt substrin tan tanh
+syn keyword nastranDmapImplicit timetogo wlen xorl
+"
+"
+"--------------------INPUT FILE SYNTAX---------------------------------------
+"
+"
+" -------Nastran Statement
+"
+syn keyword nastranNastranCard nastran
+"
+" -------The File Management Section (FMS)
+"
+syn region nastranFMSCard start=+^ *[Aa][Cc][Qq][Uu][Ii]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Aa][Ss][Ss][Ii][Gg]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Cc][oO][Nn][Nn][Ee]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Bb][Cc][Ll][Ee]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Bb][Dd][Ii][Cc]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Bb][Dd][Ii][Rr]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Bb][Ff][Ii][Xx]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Bb][Ll][Oo][Aa]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Bb][Ll][Oo][Cc]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Bb][Ss][Ee][Tt]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Bb][Uu][Nn][Ll]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Bb][Uu][Pp][Dd]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Dd][Ee][Ff][Ii][Nn]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Ee][Nn][Dd][Jj][Oo]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Ee][Xx][Pp][Aa][Nn]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Ii][Nn][Cc][Ll][Uu]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Ii][Nn][Ii][Tt]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Pp][Rr][Oo][Jj]+ end=+$+ oneline
+syn region nastranFMSCard start=+^ *[Rr][Ee][Ss][Tt]+ end=+$+ oneline
+syn match nastranDmapUtilmod "^ *[Rr][Ee][Ss][Tt][Aa].*,.*," contains=nastranDmapComment
+"
+" -------Executive Control Section
+"
+syn region nastranECSCard start=+^ *[Aa][Ll][Tt][Ee][Rr]+ end=+$+ oneline
+syn region nastranECSCard start=+^ *[Aa][Pp][Pp]+ end=+$+ oneline
+syn region nastranECSCard start=+^ *[Cc][Oo][Mm][Pp][Ii]+ end=+$+ oneline
+syn region nastranECSCard start=+^ *[Dd][Ii][Aa][Gg] + end=+$+ oneline
+syn region nastranECSCard start=+^ *[Ee][Cc][Hh][Oo]+ end=+$+ oneline
+syn region nastranECSCard start=+^ *[Ee][Nn][Dd][Aa][Ll]+ end=+$+ oneline
+syn region nastranECSCard start=+^ *[Ii][Dd]+ end=+$+ oneline
+syn region nastranECSCard start=+^ *[Ii][Nn][Cc][Ll][Uu]+ end=+$+ oneline
+syn region nastranECSCard start=+^ *[Ll][Ii][Nn][Kk]+ end=+$+ oneline
+syn region nastranECSCard start=+^ *[Mm][Aa][Ll][Tt][Ee]+ end=+$+ oneline
+syn region nastranECSCard start=+^ *[Ss][Oo][Ll] + end=+$+ oneline
+syn region nastranECSCard start=+^ *[Tt][Ii][Mm][Ee]+ end=+$+ oneline
+"
+" -------Delimiters
+"
+syn match nastranDelimiter "[Cc][Ee][Nn][Dd]" contained
+syn match nastranDelimiter "[Bb][Ee][Gg][Ii][Nn]" contained
+syn match nastranDelimiter " *[Bb][Uu][Ll][Kk]" contained
+syn match nastranDelimiter "[Ee][Nn][Dd] *[dD][Aa][Tt][Aa]" contained
+"
+" -------Case Control section
+"
+syn region nastranCC start=+^ *[Cc][Ee][Nn][Dd]+ end=+^ *[Bb][Ee][Gg][Ii][Nn]+ contains=nastranDelimiter,nastranBulkData,nastranDmapComment
+
+"
+" -------Bulk Data section
+"
+syn region nastranBulkData start=+ *[Bb][Uu][Ll][Kk] *$+ end=+^ [Ee][Nn][Dd] *[Dd]+ contains=nastranDelimiter,nastranDmapComment
+"
+" -------The following cards may appear in multiple sections of the file
+"
+syn keyword nastranUtilCard ECHOON ECHOOFF INCLUDE PARAM
+
+
+" 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"
+
+"EOF vim: ts=8 noet tw=120 sw=8 sts=0
diff --git a/runtime/syntax/natural.vim b/runtime/syntax/natural.vim
new file mode 100644
index 0000000..be529f2
--- /dev/null
+++ b/runtime/syntax/natural.vim
@@ -0,0 +1,201 @@
+" Vim syntax file
+"
+" Language: NATURAL
+" Version: 2.1.0.5
+" Maintainer: Marko von Oppen <marko@von-oppen.com>
+" Last Changed: 2012-02-05 18:50:43
+" Support: http://www.von-oppen.com/
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+setlocal iskeyword+=-,*,#,+,_,/
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" NATURAL is case insensitive
+syntax case ignore
+
+" preprocessor
+syn keyword naturalInclude include nextgroup=naturalObjName skipwhite
+
+" define data
+syn keyword naturalKeyword define data end-define
+syn keyword naturalKeyword independent global parameter local redefine view
+syn keyword naturalKeyword const[ant] init initial
+
+" loops
+syn keyword naturalLoop read end-read end-work find end-find histogram end-histogram
+syn keyword naturalLoop end-all sort end-sort sorted descending ascending
+syn keyword naturalRepeat repeat end-repeat while until for step end-for
+syn keyword naturalKeyword in file with field starting from ending at thru by isn where
+syn keyword naturalError on error end-error
+syn keyword naturalKeyword accept reject end-enddata number unique retain as release
+syn keyword naturalKeyword start end-start break end-break physical page top sequence
+syn keyword naturalKeyword end-toppage end-endpage end-endfile before processing
+syn keyword naturalKeyword end-before
+
+" conditionals
+syn keyword naturalConditional if then else end-if end-norec
+syn keyword naturalConditional decide end-decide value when condition none any
+
+" assignment / calculation
+syn keyword naturalKeyword reset assign move left right justified compress to into edited
+syn keyword naturalKeyword add subtract multiply divide compute name
+syn keyword naturalKeyword all giving remainder rounded leaving space numeric
+syn keyword naturalKeyword examine full replace giving separate delimiter modified
+syn keyword naturalKeyword suspend identical suppress
+
+" program flow
+syn keyword naturalFlow callnat fetch return enter escape bottom top stack formatted
+syn keyword naturalFlow command call
+syn keyword naturalflow end-subroutine routine
+
+" file operations
+syn keyword naturalKeyword update store get delete end transaction work once close
+
+" other keywords
+syn keyword naturalKeyword first every of no record[s] found ignore immediate
+syn keyword naturalKeyword set settime key control stop terminate
+
+" in-/output
+syn keyword naturalKeyword write display input reinput notitle nohdr map newpage
+syn keyword naturalKeyword alarm text help eject index window base size
+syn keyword naturalKeyword format printer skip lines
+
+" functions
+syn keyword naturalKeyword abs atn cos exp frac int log sgn sin sqrt tan val old
+syn keyword naturalKeyword pos
+
+" report mode keywords
+syn keyword naturalRMKeyword same loop obtain indexed do doend
+
+" Subroutine name
+syn keyword naturalFlow perform subroutine nextgroup=naturalFunction skipwhite
+syn match naturalFunction "\<[a-z][-_a-z0-9]*\>"
+
+syn keyword naturalFlow using nextgroup=naturalKeyword,naturalObjName skipwhite
+syn match naturalObjName "\<[a-z][-_a-z0-9]\{,7}\>"
+
+" Labels
+syn match naturalLabel "\<[+#a-z][-_#a-z0-9]*\."
+syn match naturalRef "\<[+#a-z][-_#a-z0-9]*\>\.\<[+#a-z][*]\=[-_#a-z0-9]*\>"
+
+" mark keyword special handling
+syn keyword naturalKeyword mark nextgroup=naturalMark skipwhite
+syn match naturalMark "\<\*[a-z][-_#.a-z0-9]*\>"
+
+" System variables
+syn match naturalSysVar "\<\*[a-z][-a-z0-9]*\>"
+
+"integer number, or floating point number without a dot.
+syn match naturalNumber "\<-\=\d\+\>"
+"floating point number, with dot
+syn match naturalNumber "\<-\=\d\+\.\d\+\>"
+"floating point number, starting with a dot
+syn match naturalNumber "\.\d\+"
+
+" Formats in write statement
+syn match naturalFormat "\<\d\+[TX]\>"
+
+" String and Character contstants
+syn match naturalString "H'\x\+'"
+syn region naturalString start=+"+ end=+"+
+syn region naturalString start=+'+ end=+'+
+
+" Type definition
+syn match naturalAttribute "\<[-a-z][a-z]=[-a-z0-9_\.,]\+\>"
+syn match naturalType contained "\<[ABINP]\d\+\(,\d\+\)\=\>"
+syn match naturalType contained "\<[CL]\>"
+
+" "TODO" / other comments
+syn keyword naturalTodo contained todo test
+syn match naturalCommentMark contained "[a-z][^ \t/:|]*\(\s[^ \t/:'"|]\+\)*:\s"he=e-1
+
+" comments
+syn region naturalComment start="/\*" end="$" contains=naturalTodo,naturalLineRef,naturalCommentMark
+syn region naturalComment start="^\*[ *]" end="$" contains=naturalTodo,naturalLineRef,naturalCommentMark
+syn region naturalComment start="^\d\{4} \*[\ \*]"lc=5 end="$" contains=naturalTodo,naturalLineRef,naturalCommentMark
+syn match naturalComment "^\*$"
+syn match naturalComment "^\d\{4} \*$"lc=5
+" /* is legal syntax in parentheses e.g. "#ident(label./*)"
+syn region naturalPComment contained start="/\*\s*[^),]" end="$" contains=naturalTodo,naturalLineRef,naturalCommentMark
+
+" operators
+syn keyword naturalOperator and or not eq ne gt lt ge le mask scan modified
+
+" constants
+syn keyword naturalBoolean true false
+syn match naturalLineNo "^\d\{4}"
+
+" identifiers
+syn match naturalIdent "\<[+#a-z][-_#a-z0-9]*\>[^\.']"me=e-1
+syn match naturalIdent "\<[+#a-z][-_#a-z0-9]*$"
+syn match naturalLegalIdent "[+#a-z][-_#a-z0-9]*/[-_#a-z0-9]*"
+
+" parentheses
+syn region naturalPar matchgroup=naturalParGui start="(" end=")" contains=naturalLabel,naturalRef,naturalOperator,@naturalConstant,naturalType,naturalSysVar,naturalPar,naturalLineNo,naturalPComment
+syn match naturalLineRef "(\d\{4})"
+
+" build syntax groups
+syntax cluster naturalConstant contains=naturalString,naturalNumber,naturalAttribute,naturalBoolean
+
+" folding
+if v:version >= 600
+ set foldignore=*
+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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set ts=8 sw=8 noet ft=vim list:
diff --git a/runtime/syntax/ncf.vim b/runtime/syntax/ncf.vim
new file mode 100644
index 0000000..0027fd4
--- /dev/null
+++ b/runtime/syntax/ncf.vim
@@ -0,0 +1,247 @@
+" Vim syntax file
+" Language: Novell "NCF" Batch File
+" Maintainer: Jonathan J. Miner <miner@doit.wisc.edu>
+" Last Change: Tue, 04 Sep 2001 16:20:33 CDT
+" $Id: ncf.vim,v 1.1 2004/06/13 16:31:58 vimboss Exp $
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn keyword ncfCommands mount load unload
+syn keyword ncfBoolean on off
+syn keyword ncfCommands set nextgroup=ncfSetCommands
+syn keyword ncfTimeTypes Reference Primary Secondary Single
+syn match ncfLoad "\(unl\|l\)oad .*"lc=4 contains=ALLBUT,Error
+syn match ncfMount "mount .*"lc=5 contains=ALLBUT,Error
+
+syn match ncfComment "^\ *rem.*$"
+syn match ncfComment "^\ *;.*$"
+syn match ncfComment "^\ *#.*$"
+
+syn match ncfSearchPath "search \(add\|del\) " nextgroup=ncfPath
+syn match ncfPath "\<[^: ]\+:\([A-Za-z0-9._]\|\\\)*\>"
+syn match ncfServerName "^file server name .*$"
+syn match ncfIPXNet "^ipx internal net"
+
+" String
+syn region ncfString start=+"+ end=+"+
+syn match ncfContString "= \(\(\.\{0,1}\(OU=\|O=\)\{0,1}[A-Z_]\+\)\+;\{0,1}\)\+"lc=2
+
+syn match ncfHexNumber "\<\d\(\d\+\|[A-F]\+\)*\>"
+syn match ncfNumber "\<\d\+\.\{0,1}\d*\>"
+syn match ncfIPAddr "\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}"
+syn match ncfTime "\(+|=\)\{0,1}\d\{1,2}:\d\{1,2}:\d\{1,2}"
+syn match ncfDSTTime "([^ ]\+ [^ ]\+ \(FIRST\|LAST\)\s*\d\{1,2}:\d\{1,2}:\d\{1,2} \(AM\|PM\))"
+syn match ncfTimeZone "[A-Z]\{3}\d[A-Z]\{3}"
+
+syn match ncfLogins "^\([Dd]is\|[Ee]n\)able login[s]*"
+syn match ncfScript "[^ ]*\.ncf"
+
+" SET Commands that take a Number following
+syn match ncfSetCommandsNum "\(Alert Message Nodes\)\s*="
+syn match ncfSetCommandsNum "\(Auto Restart After Abend\)\s*="
+syn match ncfSetCommandsNum "\(Auto Restart After Abend Delay Time\)\s*="
+syn match ncfSetCommandsNum "\(Compression Daily Check Starting Hour\)\s*="
+syn match ncfSetCommandsNum "\(Compression Daily Check Stop Hour\)\s*="
+syn match ncfSetCommandsNum "\(Concurrent Remirror Requests\)\s*="
+syn match ncfSetCommandsNum "\(Convert Compressed to Uncompressed Option\)\s*="
+syn match ncfSetCommandsNum "\(Days Untouched Before Compression\)\s*="
+syn match ncfSetCommandsNum "\(Decompress Free Space Warning Interval\)\s*="
+syn match ncfSetCommandsNum "\(Decompress Percent Disk Space Free to Allow Commit\)\s*="
+syn match ncfSetCommandsNum "\(Deleted Files Compression Option\)\s*="
+syn match ncfSetCommandsNum "\(Directory Cache Allocation Wait Time\)\s*="
+syn match ncfSetCommandsNum "\(Enable IPX Checksums\)\s*="
+syn match ncfSetCommandsNum "\(Garbage Collection Interval\)\s*="
+syn match ncfSetCommandsNum "\(IPX NetBIOS Replication Option\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Concurrent Compressions\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Concurrent Directory Cache Writes\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Concurrent Disk Cache Writes\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Directory Cache Buffers\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Extended Attributes per File or Path\)\s*="
+syn match ncfSetCommandsNum "\(Maximum File Locks\)\s*="
+syn match ncfSetCommandsNum "\(Maximum File Locks Per Connection\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Interrupt Events\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Number of Directory Handles\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Number of Internal Directory Handles\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Outstanding NCP Searches\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Packet Receive Buffers\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Physical Receive Packet Size\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Record Locks\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Record Locks Per Connection\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Service Processes\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Subdirectory Tree Depth\)\s*="
+syn match ncfSetCommandsNum "\(Maximum Transactions\)\s*="
+syn match ncfSetCommandsNum "\(Minimum Compression Percentage Gain\)\s*="
+syn match ncfSetCommandsNum "\(Minimum Directory Cache Buffers\)\s*="
+syn match ncfSetCommandsNum "\(Minimum File Cache Buffers\)\s*="
+syn match ncfSetCommandsNum "\(Minimum File Cache Report Threshold\)\s*="
+syn match ncfSetCommandsNum "\(Minimum Free Memory for Garbage Collection\)\s*="
+syn match ncfSetCommandsNum "\(Minimum Packet Receive Buffers\)\s*="
+syn match ncfSetCommandsNum "\(Minimum Service Processes\)\s*="
+syn match ncfSetCommandsNum "\(NCP Packet Signature Option\)\s*="
+syn match ncfSetCommandsNum "\(NDS Backlink Interval\)\s*="
+syn match ncfSetCommandsNum "\(NDS Client NCP Retries\)\s*="
+syn match ncfSetCommandsNum "\(NDS External Reference Life Span\)\s*="
+syn match ncfSetCommandsNum "\(NDS Inactivity Synchronization Interval\)\s*="
+syn match ncfSetCommandsNum "\(NDS Janitor Interval\)\s*="
+syn match ncfSetCommandsNum "\(New Service Process Wait Time\)\s*="
+syn match ncfSetCommandsNum "\(Number of Frees for Garbage Collection\)\s*="
+syn match ncfSetCommandsNum "\(Number of Watchdog Packets\)\s*="
+syn match ncfSetCommandsNum "\(Pseudo Preemption Count\)\s*="
+syn match ncfSetCommandsNum "\(Read Ahead LRU Sitting Time Threshold\)\s*="
+syn match ncfSetCommandsNum "\(Remirror Block Size\)\s*="
+syn match ncfSetCommandsNum "\(Reserved Buffers Below 16 Meg\)\s*="
+syn match ncfSetCommandsNum "\(Server Log File Overflow Size\)\s*="
+syn match ncfSetCommandsNum "\(Server Log File State\)\s*="
+syn match ncfSetCommandsNum "\(SMP Polling Count\)\s*="
+syn match ncfSetCommandsNum "\(SMP Stack Size\)\s*="
+syn match ncfSetCommandsNum "\(TIMESYNC Polling Count\)\s*="
+syn match ncfSetCommandsNum "\(TIMESYNC Polling Interval\)\s*="
+syn match ncfSetCommandsNum "\(TIMESYNC Synchronization Radius\)\s*="
+syn match ncfSetCommandsNum "\(TIMESYNC Write Value\)\s*="
+syn match ncfSetCommandsNum "\(Volume Log File Overflow Size\)\s*="
+syn match ncfSetCommandsNum "\(Volume Log File State\)\s*="
+syn match ncfSetCommandsNum "\(Volume Low Warning Reset Threshold\)\s*="
+syn match ncfSetCommandsNum "\(Volume Low Warning Threshold\)\s*="
+syn match ncfSetCommandsNum "\(Volume TTS Log File Overflow Size\)\s*="
+syn match ncfSetCommandsNum "\(Volume TTS Log File State\)\s*="
+syn match ncfSetCommandsNum "\(Worker Thread Execute In a Row Count\)\s*="
+
+" SET Commands that take a Boolean (ON/OFF)
+
+syn match ncfSetCommandsBool "\(Alloc Memory Check Flag\)\s*="
+syn match ncfSetCommandsBool "\(Allow Audit Passwords\)\s*="
+syn match ncfSetCommandsBool "\(Allow Change to Client Rights\)\s*="
+syn match ncfSetCommandsBool "\(Allow Deletion of Active Directories\)\s*="
+syn match ncfSetCommandsBool "\(Allow Invalid Pointers\)\s*="
+syn match ncfSetCommandsBool "\(Allow LIP\)\s*="
+syn match ncfSetCommandsBool "\(Allow Unencrypted Passwords\)\s*="
+syn match ncfSetCommandsBool "\(Allow Unowned Files To Be Extended\)\s*="
+syn match ncfSetCommandsBool "\(Auto Register Memory Above 16 Megabytes\)\s*="
+syn match ncfSetCommandsBool "\(Auto TTS Backout Flag\)\s*="
+syn match ncfSetCommandsBool "\(Automatically Repair Bad Volumes\)\s*="
+syn match ncfSetCommandsBool "\(Check Equivalent to Me\)\s*="
+syn match ncfSetCommandsBool "\(Command Line Prompt Default Choice\)\s*="
+syn match ncfSetCommandsBool "\(Console Display Watchdog Logouts\)\s*="
+syn match ncfSetCommandsBool "\(Daylight Savings Time Status\)\s*="
+syn match ncfSetCommandsBool "\(Developer Option\)\s*="
+syn match ncfSetCommandsBool "\(Display Incomplete IPX Packet Alerts\)\s*="
+syn match ncfSetCommandsBool "\(Display Lost Interrupt Alerts\)\s*="
+syn match ncfSetCommandsBool "\(Display NCP Bad Component Warnings\)\s*="
+syn match ncfSetCommandsBool "\(Display NCP Bad Length Warnings\)\s*="
+syn match ncfSetCommandsBool "\(Display Old API Names\)\s*="
+syn match ncfSetCommandsBool "\(Display Relinquish Control Alerts\)\s*="
+syn match ncfSetCommandsBool "\(Display Spurious Interrupt Alerts\)\s*="
+syn match ncfSetCommandsBool "\(Enable Deadlock Detection\)\s*="
+syn match ncfSetCommandsBool "\(Enable Disk Read After Write Verify\)\s*="
+syn match ncfSetCommandsBool "\(Enable File Compression\)\s*="
+syn match ncfSetCommandsBool "\(Enable IO Handicap Attribute\)\s*="
+syn match ncfSetCommandsBool "\(Enable SECURE.NCF\)\s*="
+syn match ncfSetCommandsBool "\(Fast Volume Mounts\)\s*="
+syn match ncfSetCommandsBool "\(Global Pseudo Preemption\)\s*="
+syn match ncfSetCommandsBool "\(Halt System on Invalid Parameters\)\s*="
+syn match ncfSetCommandsBool "\(Ignore Disk Geometry\)\s*="
+syn match ncfSetCommandsBool "\(Immediate Purge of Deleted Files\)\s*="
+syn match ncfSetCommandsBool "\(NCP File Commit\)\s*="
+syn match ncfSetCommandsBool "\(NDS Trace File Length to Zero\)\s*="
+syn match ncfSetCommandsBool "\(NDS Trace to File\)\s*="
+syn match ncfSetCommandsBool "\(NDS Trace to Screen\)\s*="
+syn match ncfSetCommandsBool "\(New Time With Daylight Savings Time Status\)\s*="
+syn match ncfSetCommandsBool "\(Read Ahead Enabled\)\s*="
+syn match ncfSetCommandsBool "\(Read Fault Emulation\)\s*="
+syn match ncfSetCommandsBool "\(Read Fault Notification\)\s*="
+syn match ncfSetCommandsBool "\(Reject NCP Packets with Bad Components\)\s*="
+syn match ncfSetCommandsBool "\(Reject NCP Packets with Bad Lengths\)\s*="
+syn match ncfSetCommandsBool "\(Replace Console Prompt with Server Name\)\s*="
+syn match ncfSetCommandsBool "\(Reply to Get Nearest Server\)\s*="
+syn match ncfSetCommandsBool "\(SMP Developer Option\)\s*="
+syn match ncfSetCommandsBool "\(SMP Flush Processor Cache\)\s*="
+syn match ncfSetCommandsBool "\(SMP Intrusive Abend Mode\)\s*="
+syn match ncfSetCommandsBool "\(SMP Memory Protection\)\s*="
+syn match ncfSetCommandsBool "\(Sound Bell for Alerts\)\s*="
+syn match ncfSetCommandsBool "\(TIMESYNC Configured Sources\)\s*="
+syn match ncfSetCommandsBool "\(TIMESYNC Directory Tree Mode\)\s*="
+syn match ncfSetCommandsBool "\(TIMESYNC Hardware Clock\)\s*="
+syn match ncfSetCommandsBool "\(TIMESYNC RESET\)\s*="
+syn match ncfSetCommandsBool "\(TIMESYNC Restart Flag\)\s*="
+syn match ncfSetCommandsBool "\(TIMESYNC Service Advertising\)\s*="
+syn match ncfSetCommandsBool "\(TIMESYNC Write Parameters\)\s*="
+syn match ncfSetCommandsBool "\(TTS Abort Dump Flag\)\s*="
+syn match ncfSetCommandsBool "\(Upgrade Low Priority Threads\)\s*="
+syn match ncfSetCommandsBool "\(Volume Low Warn All Users\)\s*="
+syn match ncfSetCommandsBool "\(Write Fault Emulation\)\s*="
+syn match ncfSetCommandsBool "\(Write Fault Notification\)\s*="
+
+" Set Commands that take a "string" -- NOT QUOTED
+
+syn match ncfSetCommandsStr "\(Default Time Server Type\)\s*="
+syn match ncfSetCommandsStr "\(SMP NetWare Kernel Mode\)\s*="
+syn match ncfSetCommandsStr "\(Time Zone\)\s*="
+syn match ncfSetCommandsStr "\(TIMESYNC ADD Time Source\)\s*="
+syn match ncfSetCommandsStr "\(TIMESYNC REMOVE Time Source\)\s*="
+syn match ncfSetCommandsStr "\(TIMESYNC Time Source\)\s*="
+syn match ncfSetCommandsStr "\(TIMESYNC Type\)\s*="
+
+" SET Commands that take a "Time"
+
+syn match ncfSetCommandsTime "\(Command Line Prompt Time Out\)\s*="
+syn match ncfSetCommandsTime "\(Delay Before First Watchdog Packet\)\s*="
+syn match ncfSetCommandsTime "\(Delay Between Watchdog Packets\)\s*="
+syn match ncfSetCommandsTime "\(Directory Cache Buffer NonReferenced Delay\)\s*="
+syn match ncfSetCommandsTime "\(Dirty Directory Cache Delay Time\)\s*="
+syn match ncfSetCommandsTime "\(Dirty Disk Cache Delay Time\)\s*="
+syn match ncfSetCommandsTime "\(File Delete Wait Time\)\s*="
+syn match ncfSetCommandsTime "\(Minimum File Delete Wait Time\)\s*="
+syn match ncfSetCommandsTime "\(Mirrored Devices Are Out of Sync Message Frequency\)\s*="
+syn match ncfSetCommandsTime "\(New Packet Receive Buffer Wait Time\)\s*="
+syn match ncfSetCommandsTime "\(TTS Backout File Truncation Wait Time\)\s*="
+syn match ncfSetCommandsTime "\(TTS UnWritten Cache Wait Time\)\s*="
+syn match ncfSetCommandsTime "\(Turbo FAT Re-Use Wait Time\)\s*="
+syn match ncfSetCommandsTime "\(Daylight Savings Time Offset\)\s*="
+
+syn match ncfSetCommandsTimeDate "\(End of Daylight Savings Time\)\s*="
+syn match ncfSetCommandsTimeDate "\(Start of Daylight Savings Time\)\s*="
+
+syn match ncfSetCommandsBindCon "\(Bindery Context\)\s*=" nextgroup=ncfContString
+
+syn cluster ncfSetCommands contains=ncfSetCommandsNum,ncfSetCommandsBool,ncfSetCommandsStr,ncfSetCommandsTime,ncfSetCommandsTimeDate,ncfSetCommandsBindCon
+
+
+if exists("ncf_highlight_unknowns")
+ syn match Error "[^ \t]*" contains=ALL
+endif
+
+
+" 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
+
+
+
+let b:current_syntax = "ncf"
diff --git a/runtime/syntax/neomuttrc.vim b/runtime/syntax/neomuttrc.vim
new file mode 100644
index 0000000..421b11f
--- /dev/null
+++ b/runtime/syntax/neomuttrc.vim
@@ -0,0 +1,880 @@
+" Vim syntax file
+" Language: NeoMutt setup files
+" Maintainer: Richard Russon <rich@flatcap.org>
+" Previous Maintainer: Guillaume Brogi <gui-gui@netcourrier.com>
+" Last Change: 2022-04-08
+" Original version based on syntax/muttrc.vim
+
+" This file covers NeoMutt 2022-04-08
+
+" 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
+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
+
+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 contains=muttrcVariable,muttrcEscapedVariable
+syntax region muttrcSetStrAssignment contained skipwhite keepend start=+=\s*"+hs=s+1 end=+"+ skip=+\\"+ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcString
+syntax region muttrcSetStrAssignment contained skipwhite keepend start=+=\s*'+hs=s+1 end=+'+ skip=+\\'+ nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcString
+syntax match muttrcSetBoolAssignment contained skipwhite /=\s*\\\?\$\w\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcVariable,muttrcEscapedVariable
+syntax match muttrcSetBoolAssignment contained skipwhite /=\s*\%(yes\|no\)/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax match muttrcSetBoolAssignment contained skipwhite /=\s*"\%(yes\|no\)"/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax match muttrcSetBoolAssignment contained skipwhite /=\s*'\%(yes\|no\)'/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax match muttrcSetQuadAssignment contained skipwhite /=\s*\\\?\$\w\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcVariable,muttrcEscapedVariable
+syntax match muttrcSetQuadAssignment contained skipwhite /=\s*\%(ask-\)\?\%(yes\|no\)/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax match muttrcSetQuadAssignment contained skipwhite /=\s*"\%(ask-\)\?\%(yes\|no\)"/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax match muttrcSetQuadAssignment contained skipwhite /=\s*'\%(ask-\)\?\%(yes\|no\)'/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax match muttrcSetNumAssignment contained skipwhite /=\s*\\\?\$\w\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr contains=muttrcVariable,muttrcEscapedVariable
+syntax match muttrcSetNumAssignment contained skipwhite /=\s*\d\+/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax match muttrcSetNumAssignment contained skipwhite /=\s*"\d\+"/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax match muttrcSetNumAssignment contained skipwhite /=\s*'\d\+'/hs=s+1 nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+" 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 muttrcAliasFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcAliasFormatEscapes,muttrcAliasFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcAliasFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcAliasFormatEscapes,muttrcAliasFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcAttachFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcAttachFormatEscapes,muttrcAttachFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcAttachFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcAttachFormatEscapes,muttrcAttachFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcComposeFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcComposeFormatEscapes,muttrcComposeFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcComposeFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcComposeFormatEscapes,muttrcComposeFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcFolderFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcFolderFormatEscapes,muttrcFolderFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcFolderFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcFolderFormatEscapes,muttrcFolderFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcGroupIndexFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcGroupIndexFormatEscapes,muttrcGroupIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcGroupIndexFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcGroupIndexFormatEscapes,muttrcGroupIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcIndexFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcIndexFormatEscapes,muttrcIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcIndexFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcIndexFormatEscapes,muttrcIndexFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcMixFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcMixFormatEscapes,muttrcMixFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcMixFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcMixFormatEscapes,muttrcMixFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcPatternFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPatternFormatEscapes,muttrcPatternFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcPatternFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPatternFormatEscapes,muttrcPatternFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcPGPCmdFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPGPCmdFormatEscapes,muttrcPGPCmdFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcPGPCmdFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPGPCmdFormatEscapes,muttrcPGPCmdFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcPGPFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcPGPFormatEscapes,muttrcPGPFormatConditionals,muttrcFormatErrors,muttrcPGPTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcPGPFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcPGPFormatEscapes,muttrcPGPFormatConditionals,muttrcFormatErrors,muttrcPGPTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcQueryFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcQueryFormatEscapes,muttrcQueryFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcQueryFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcQueryFormatEscapes,muttrcQueryFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcSidebarFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcSidebarFormatEscapes,muttrcSidebarFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcSidebarFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcSidebarFormatEscapes,muttrcSidebarFormatConditionals,muttrcFormatErrors,muttrcTimeEscapes nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcSmimeFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcSmimeFormatEscapes,muttrcSmimeFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcSmimeFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcSmimeFormatEscapes,muttrcSmimeFormatConditionals,muttrcVariable,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcStatusFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcStatusFormatEscapes,muttrcStatusFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcStatusFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcStatusFormatEscapes,muttrcStatusFormatConditionals,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcStrftimeFormatStr contained skipwhite keepend start=+"+ skip=+\\"+ end=+"+ contains=muttrcStrftimeEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax region muttrcStrftimeFormatStr contained skipwhite keepend start=+'+ skip=+\\'+ end=+'+ contains=muttrcStrftimeEscapes,muttrcFormatErrors nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+" Format escapes and conditionals
+syntax match muttrcFormatConditionals2 contained /[^?]*?/
+function! s:escapesConditionals(baseName, sequence, padding, conditional)
+ exec 'syntax match muttrc' . a:baseName . 'Escapes contained /%\%(\%(-\?[0-9]\+\)\?\%(\.[0-9]\+\)\?\)\?[:_]\?\%(' . a:sequence . '\|%\)/'
+ if a:padding
+ exec 'syntax match muttrc' . a:baseName . 'Escapes contained /%[>|*]./'
+ endif
+ if a:conditional
+ 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 2022-04-08
+" Ref: alias_format_str() in alias/dlg_alias.c
+call s:escapesConditionals('AliasFormat', '[acfnrt]', 1, 0)
+" Ref: attach_format_str() in attach/dlg_attach.c
+call s:escapesConditionals('AttachFormat', '[CcDdeFfIMmnQsTtuX]', 1, 1)
+" Ref: compose_format_str() in compose/cbar.c
+call s:escapesConditionals('ComposeFormat', '[ahlv]', 1, 1)
+" Ref: folder_format_str() in browser/browser.c
+call s:escapesConditionals('FolderFormat', '[CDdFfgilmNnstu]', 1, 0)
+" Ref: group_index_format_str() in nntp/browse.c
+call s:escapesConditionals('GroupIndexFormat', '[CdfMNns]', 1, 1)
+" Ref: index_format_str() in hdrline.c
+call s:escapesConditionals('IndexFormat', '[AaBbCDdEefgHIiJKLlMmNnOPqRrSsTtuvWXxYyZ(<[{]\|@\i\+@\|G[a-zA-Z]\+\|Fp\=\|z[cst]\|cr\=', 1, 1)
+" Ref: mix_format_str() in remailer.c
+call s:escapesConditionals('MixFormat', '[acns]', 1, 0)
+" Ref: pattern_format_str() in pattern/dlg_pattern.c
+call s:escapesConditionals('PatternFormat', '[den]', 1, 0)
+" Ref: pgp_command_format_str() in ncrypt/pgpinvoke.c
+call s:escapesConditionals('PGPCmdFormat', '[afprs]', 0, 1)
+" Ref: crypt_format_str() in ncrypt/dlg_gpgme.c
+" Ref: pgp_entry_format_str() in ncrypt/dlg_pgp.c
+" Note: crypt_format_str() supports 'p', but pgp_entry_fmt() does not
+call s:escapesConditionals('PGPFormat', '[AaCcFfKkLlnptu[]', 0, 0)
+" Ref: query_format_str() in alias/dlg_query.c
+call s:escapesConditionals('QueryFormat', '[acent]', 1, 1)
+" Ref: sidebar_format_str() in sidebar/window.c
+call s:escapesConditionals('SidebarFormat', '[!BDdFLNnorStZ]', 1, 1)
+" Ref: smime_command_format_str() in ncrypt/smime.c
+call s:escapesConditionals('SmimeFormat', '[aCcdfiks]', 0, 1)
+" Ref: status_format_str() in status.c
+call s:escapesConditionals('StatusFormat', '[bDdFfhLlMmnoPpRrSsTtuVv]', 1, 1)
+
+syntax region muttrcPGPTimeEscapes 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 muttrcTimeEscapes 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 muttrcVarEqualsPatternFmt contained skipwhite "=" nextgroup=muttrcPatternFormatStr
+syntax match muttrcVarEqualsPGPCmdFmt contained skipwhite "=" nextgroup=muttrcPGPCmdFormatStr
+syntax match muttrcVarEqualsPGPFmt contained skipwhite "=" nextgroup=muttrcPGPFormatStr
+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
+
+" CHECKED 2022-04-08
+" List of the different screens in NeoMutt (see MenuNames in menu/type.c)
+syntax keyword muttrcMenu contained alias attach autocrypt 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
+
+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 skipwhite nextgroup=muttrcGroupDef,muttrcComment
+syntax keyword muttrcSubscribeKeyword unsubscribe skipwhite 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
+
+" CHECKED 2022-04-08
+" First, hooks 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, hooks that take patterns
+syntax match muttrcPatHookNot contained /!\s*/ skipwhite nextgroup=muttrcPattern
+syntax match muttrcPatHooks /\<\%(charset\|iconv\|index-format\)-hook\>/ skipwhite nextgroup=muttrcPatHookNot,muttrcPattern
+syntax match muttrcPatHooks /\<\%(message\|reply\|send\|send2\|save\|fcc\|fcc-save\)-hook\>/ skipwhite nextgroup=muttrcPatHookNot,muttrcOptPattern
+
+" Global hooks that take a command
+syntax keyword muttrcHooks skipwhite shutdown-hook startup-hook timeout-hook nextgroup=muttrcCommand
+
+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
+
+" CHECKED 2022-04-08
+" List of letters in Flags in pattern/flags.c
+" Parameter: none
+syntax match muttrcSimplePat contained "!\?\^\?[~][ADEFGgklNOPpQRSTUuVv#$=]"
+" Parameter: range
+syntax match muttrcSimplePat contained "!\?\^\?[~][mnXz]\s*\%([<>-][0-9]\+[kM]\?\|[0-9]\+[kM]\?[-]\%([0-9]\+[kM]\?\)\?\)"
+" Parameter: date
+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
+" Parameter: regex
+syntax match muttrcSimplePat contained "!\?\^\?[~][BbCcefHhIiLMstwxYy]\s*" nextgroup=muttrcSimplePatRXContainer
+" Parameter: pattern
+syntax match muttrcSimplePat contained "!\?\^\?[%][BbCcefHhiLstxy]\s*" nextgroup=muttrcSimplePatString
+" Parameter: pattern
+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 2022-04-08
+" List of fields in ColorFields in color/commmand.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 options progress prompt quoted
+ \ search sidebar_divider sidebar_flagged sidebar_highlight sidebar_indicator sidebar_new
+ \ sidebar_ordinary sidebar_spoolfile sidebar_unread signature status tilde tree underline
+ \ warning nextgroup=muttrcColor
+
+syntax match muttrcColorField contained "\<quoted\d\=\>"
+
+syntax match muttrcColorCompose skipwhite contained /\s*compose\s*/ nextgroup=muttrcColorComposeField
+
+" CHECKED 2022-04-08
+" List of fields in ComposeColorFields in color/command.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
+ exec 'syntax keyword muttrcVar' . l:type . ' ' . join(a:vars)
+ exec 'syntax keyword muttrcVar' . l:type . ' ' . join(l:novars)
+ exec 'syntax keyword muttrcVar' . l:type . ' ' . join(l:invvars)
+ else
+ let l:type = a:type
+ exec 'syntax keyword muttrcVar' . l:type . ' skipwhite contained ' . join(a:vars) . ' nextgroup=muttrcSet' . l:orig_type . 'Assignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr'
+ exec 'syntax keyword muttrcVar' . l:type . ' skipwhite contained ' . join(l:novars) . ' nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr'
+ exec 'syntax keyword muttrcVar' . l:type . ' skipwhite contained ' . join(l:invvars) . ' nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr'
+ endif
+
+endfunction
+
+" CHECKED 2022-04-08
+" List of DT_BOOL in MuttVars in mutt_config.c
+call s:boolQuadGen('Bool', [
+ \ 'abort_backspace', 'allow_8bit', 'allow_ansi', 'arrow_cursor', 'ascii_chars', 'ask_bcc',
+ \ 'ask_cc', 'ask_follow_up', 'ask_x_comment_to', 'attach_save_without_prompting',
+ \ 'attach_split', 'autocrypt', 'autocrypt_reply', 'auto_edit', 'auto_subscribe', 'auto_tag',
+ \ 'beep', 'beep_new', 'bounce_delivered', 'braille_friendly',
+ \ 'browser_abbreviate_mailboxes', 'change_folder_next', 'check_mbox_size', 'check_new',
+ \ 'collapse_all', 'collapse_flagged', 'collapse_unread', 'compose_show_user_headers',
+ \ 'confirm_append', 'confirm_create', 'copy_decode_weed', 'count_alternatives',
+ \ 'crypt_auto_encrypt', 'crypt_auto_pgp', 'crypt_auto_sign', 'crypt_auto_smime',
+ \ 'crypt_confirm_hook', 'crypt_opportunistic_encrypt',
+ \ 'crypt_opportunistic_encrypt_strong_keys', 'crypt_protected_headers_read',
+ \ 'crypt_protected_headers_save', 'crypt_protected_headers_write', 'crypt_reply_encrypt',
+ \ 'crypt_reply_sign', 'crypt_reply_sign_encrypted', 'crypt_timestamp', 'crypt_use_gpgme',
+ \ 'crypt_use_pka', 'delete_untag', 'digest_collapse', 'duplicate_threads', 'edit_headers',
+ \ 'encode_from', 'fast_reply', 'fcc_before_send', 'fcc_clear', 'flag_safe', 'followup_to',
+ \ 'force_name', 'forward_decode', 'forward_decrypt', 'forward_quote', 'forward_references',
+ \ '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_list_reply_to', 'imap_check_subscribed', 'imap_condstore', 'imap_deflate',
+ \ 'imap_idle', 'imap_list_subscribed', 'imap_passive', 'imap_peek', 'imap_qresync',
+ \ 'imap_rfc5161', 'imap_server_noise', 'implicit_autoview', 'include_encrypted',
+ \ 'include_only_first', 'keep_flagged', 'local_date_header', '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', 'me_too', 'mh_purge', 'mime_forward_decode',
+ \ 'mime_type_query_first', 'narrow_tree', 'nm_query_window_enable', 'nm_record',
+ \ 'nntp_listgroup', 'nntp_load_description', 'pager_stop', 'pgp_auto_decode',
+ \ 'pgp_auto_inline', 'pgp_check_exit', 'pgp_check_gpg_decrypt_status_fd',
+ \ 'pgp_ignore_subkeys', 'pgp_long_ids', 'pgp_reply_inline', 'pgp_retainable_sigs',
+ \ 'pgp_self_encrypt', 'pgp_show_unusable', 'pgp_strict_enc', 'pgp_use_gpg_agent',
+ \ 'pipe_decode', 'pipe_decode_weed', 'pipe_split', 'pop_auth_try_all', 'pop_last',
+ \ 'postpone_encrypt', 'print_decode', 'print_decode_weed', '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_real_name', '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_non_empty_mailbox_only', 'sidebar_on_right', 'sidebar_short_path',
+ \ 'sidebar_visible', 'sig_dashes', 'sig_on_top', 'size_show_bytes', 'size_show_fractions',
+ \ 'size_show_mb', 'size_units_on_left', 'smart_wrap', 'smime_ask_cert_label',
+ \ 'smime_decrypt_use_default_key', 'smime_is_default', 'smime_self_encrypt', 'sort_re',
+ \ 'ssl_force_tls', 'ssl_use_sslv2', 'ssl_use_sslv3', 'ssl_use_system_certs',
+ \ 'ssl_use_tlsv1', 'ssl_use_tlsv1_1', 'ssl_use_tlsv1_2', 'ssl_use_tlsv1_3',
+ \ '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', 'tunnel_is_secure', 'uncollapse_jump', 'uncollapse_new', 'user_agent',
+ \ 'use_8bit_mime', 'use_domain', 'use_envelope_from', 'use_from', 'use_ipv6',
+ \ 'virtual_spool_file', 'wait_key', 'weed', 'wrap_search', 'write_bcc', 'x_comment_to'
+ \ ], 0)
+
+" CHECKED 2022-04-08
+" Deprecated Bools
+" List of DT_SYNONYM or DT_DEPRECATED Bools in MuttVars in mutt_config.c
+call s:boolQuadGen('Bool', [
+ \ 'askbcc', 'askcc', 'autoedit', 'confirmappend', 'confirmcreate', 'crypt_autoencrypt',
+ \ 'crypt_autopgp', 'crypt_autosign', 'crypt_autosmime', 'crypt_confirmhook',
+ \ 'crypt_replyencrypt', 'crypt_replysign', 'crypt_replysignencrypted', 'edit_hdrs',
+ \ 'envelope_from', 'forw_decode', 'forw_decrypt', 'forw_quote', 'header_cache_compress',
+ \ 'ignore_linear_white_space', 'imap_servernoise', 'include_onlyfirst', 'metoo',
+ \ 'mime_subject', 'pgp_autoencrypt', 'pgp_autoinline', 'pgp_autosign',
+ \ 'pgp_auto_traditional', 'pgp_create_traditional', 'pgp_replyencrypt', 'pgp_replyinline',
+ \ 'pgp_replysign', 'pgp_replysignencrypted', 'reverse_realname', 'ssl_usesystemcerts',
+ \ 'use_8bitmime', 'virtual_spoolfile', 'xterm_set_titles'
+ \ ], 1)
+
+" CHECKED 2022-04-08
+" List of DT_QUAD in MuttVars in mutt_config.c
+call s:boolQuadGen('Quad', [
+ \ 'abort_noattach', 'abort_nosubject', 'abort_unmodified', 'bounce', 'catchup_newsgroup',
+ \ 'copy', 'crypt_verify_sig', 'delete', 'fcc_attach', 'followup_to_poster',
+ \ 'forward_attachments', '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 2022-04-08
+" Deprecated Quads
+" List of DT_SYNONYM or DT_DEPRECATED Quads in MuttVars in mutt_config.c
+call s:boolQuadGen('Quad', [
+ \ 'mime_fwd', 'pgp_encrypt_self', 'pgp_verify_sig', 'smime_encrypt_self'
+ \ ], 1)
+
+" CHECKED 2022-04-08
+" List of DT_NUMBER or DT_LONG in MuttVars in mutt_config.c
+syntax keyword muttrcVarNum skipwhite contained
+ \ connect_timeout debug_level header_cache_compress_level history imap_fetch_chunk_size
+ \ 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
+ \ pager_read_delay pager_skip_quoted_context pgp_timeout pop_check_interval read_inc
+ \ reflow_wrap save_history score_threshold_delete score_threshold_flag score_threshold_read
+ \ search_context sendmail_wait sidebar_component_depth sidebar_width sleep_time
+ \ smime_timeout ssl_min_dh_prime_bits timeout time_inc toggle_quoted_show_levels wrap
+ \ wrap_headers write_inc
+ \ nextgroup=muttrcSetNumAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+" CHECKED 2022-04-08
+" Deprecated Numbers
+syntax keyword muttrcVarDeprecatedNum contained skipwhite
+ \ header_cache_pagesize pop_checkinterval skip_quoted_offset
+
+" CHECKED 2022-04-08
+" List of DT_STRING in MuttVars in mutt_config.c
+" 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
+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 forward_format index_format message_format pager_format nextgroup=muttrcVarEqualsIdxFmt
+syntax keyword muttrcVarStr contained skipwhite mix_entry_format nextgroup=muttrcVarEqualsMixFmt
+syntax keyword muttrcVarStr contained skipwhite pattern_format nextgroup=muttrcVarEqualsPatternFmt
+syntax keyword muttrcVarStr contained skipwhite
+ \ pgp_clear_sign_command pgp_decode_command pgp_decrypt_command pgp_encrypt_only_command
+ \ pgp_encrypt_sign_command pgp_export_command pgp_get_keys_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 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 status_format ts_icon_format ts_status_format 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
+ \ abort_key arrow_string assumed_charset attach_charset attach_sep attribution_locale
+ \ autocrypt_acct_format charset config_charset content_type crypt_protected_headers_subject
+ \ default_hook dsn_notify dsn_return empty_subject forward_attribution_intro
+ \ forward_attribution_trailer greeting header_cache_backend header_cache_compress_method
+ \ 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 newsgroups_charset news_server nm_default_url nm_exclude_tags
+ \ nm_flagged_tag nm_query_type nm_query_window_current_search nm_query_window_or_terms
+ \ nm_query_window_timebase nm_record_tags nm_replied_tag 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 preferred_languages
+ \ real_name 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 smtp_user spam_separator
+ \ ssl_ciphers
+ \ nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+" Deprecated strings
+syntax keyword muttrcVarDeprecatedStr
+ \ abort_noattach_regexp attach_keyword escape forw_format hdr_format indent_str msg_format
+ \ nm_default_uri pgp_clearsign_command pgp_getkeys_command pgp_self_encrypt_as
+ \ post_indent_str print_cmd quote_regexp realname reply_regexp smime_self_encrypt_as
+ \ spoolfile visual xterm_icon xterm_title
+
+" CHECKED 2022-04-08
+" List of DT_ADDRESS
+syntax keyword muttrcVarStr contained skipwhite envelope_from_address from nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+" List of DT_ENUM
+syntax keyword muttrcVarStr contained skipwhite mbox_type use_threads nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+" List of DT_MBTABLE
+syntax keyword muttrcVarStr contained skipwhite crypt_chars flag_chars from_chars status_chars to_chars nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+" CHECKED 2022-04-08
+" List of DT_PATH or DT_MAILBOX
+syntax keyword muttrcVarStr contained skipwhite
+ \ alias_file attach_save_dir autocrypt_dir certificate_file debug_file
+ \ entropy_file folder header_cache history_file mbox message_cachedir newsrc
+ \ news_cache_dir postponed record signature smime_ca_location
+ \ smime_certificates smime_keys spool_file ssl_ca_certificates_file ssl_client_cert
+ \ tmpdir trash
+ \ nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+" List of DT_COMMAND (excluding pgp_*_command and smime_*_command)
+syntax keyword muttrcVarStr contained skipwhite
+ \ display_filter editor inews ispell mixmaster new_mail_command pager
+ \ print_command query_command sendmail shell external_search_command
+ \ imap_oauth_refresh_command pop_oauth_refresh_command
+ \ mime_type_query_command smtp_oauth_refresh_command tunnel
+ \ nextgroup=muttrcSetStrAssignment,muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+
+" CHECKED 2022-04-08
+" 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
+" 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
+
+" CHECKED 2022-04-08
+" List of commands in mutt_commands in mutt_commands.c
+" Remember to remove hooks, they have already been dealt with
+syntax keyword muttrcCommand skipwhite alias nextgroup=muttrcAliasGroupDef,muttrcAliasKey,muttrcAliasNL
+syntax keyword muttrcCommand skipwhite bind nextgroup=muttrcBindMenuList,muttrcBindMenuListNL
+syntax keyword muttrcCommand skipwhite exec nextgroup=muttrcFunction
+syntax keyword muttrcCommand skipwhite macro nextgroup=muttrcMacroMenuList,muttrcMacroMenuListNL
+syntax keyword muttrcCommand skipwhite nospam nextgroup=muttrcNoSpamPattern
+syntax keyword muttrcCommand skipwhite set unset reset toggle nextgroup=muttrcVPrefix,muttrcVarBool,muttrcVarQuad,muttrcVarNum,muttrcVarStr
+syntax keyword muttrcCommand skipwhite spam nextgroup=muttrcSpamPattern
+syntax keyword muttrcCommand skipwhite unalias nextgroup=muttrcUnAliasKey,muttrcUnAliasNL
+syntax keyword muttrcCommand skipwhite unhook nextgroup=muttrcHooks
+syntax keyword muttrcCommand skipwhite
+ \ alternative_order attachments auto_view cd echo finish hdr_order ifdef ifndef ignore lua
+ \ lua-source mailboxes mailto_allow mime_lookup my_hdr named-mailboxes push score setenv
+ \ sidebar_whitelist source subjectrx subscribe-to tag-formats tag-transforms
+ \ unalternative_order unattachments unauto_view unbind uncolor unhdr_order unignore unmacro
+ \ unmailboxes unmailto_allow unmime_lookup unmono unmy_hdr unscore unsetenv
+ \ unsidebar_whitelist unsubjectrx unsubscribe-from unvirtual-mailboxes virtual-mailboxes
+
+function! s:genFunctions(functions)
+ for f in a:functions
+ exec 'syntax match muttrcFunction contained "\<' . l:f . '\>"'
+ endfor
+endfunction
+
+" CHECKED 2022-04-08
+" List of functions in functions.c
+" Note: 'noop' is included but is elsewhere in the source
+call s:genFunctions(['noop',
+ \ 'accept', 'alias-dialog', 'append', 'attach-file', 'attach-key', 'attach-message',
+ \ 'attach-news-message', 'autocrypt-acct-menu', 'autocrypt-menu', 'backspace',
+ \ 'backward-char', 'backward-word', 'bol', 'bottom', 'bottom-page', 'bounce-message',
+ \ 'break-thread', 'buffy-cycle', 'buffy-list', 'capitalize-word', 'catchup', 'chain-next',
+ \ 'chain-prev', 'change-dir', 'change-folder', 'change-folder-readonly', 'change-newsgroup',
+ \ 'change-newsgroup-readonly', 'change-vfolder', 'check-new', 'check-stats',
+ \ 'check-traditional-pgp', 'clear-flag', 'collapse-all', 'collapse-parts',
+ \ 'collapse-thread', 'complete', 'complete-query', 'compose-to-sender', 'copy-file',
+ \ 'copy-message', 'create-account', 'create-alias', 'create-mailbox', 'current-bottom',
+ \ 'current-middle', 'current-top', 'decode-copy', 'decode-save', 'decrypt-copy',
+ \ 'decrypt-save', 'delete', 'delete-account', 'delete-char', 'delete-entry',
+ \ 'delete-mailbox', 'delete-message', 'delete-pattern', 'delete-subthread', 'delete-thread',
+ \ 'descend-directory', 'detach-file', 'display-address', 'display-filename',
+ \ 'display-message', 'display-toggle-weed', 'downcase-word', 'edit', 'edit-bcc', 'edit-cc',
+ \ 'edit-content-id', 'edit-description', 'edit-encoding', 'edit-fcc', 'edit-file',
+ \ 'edit-followup-to', 'edit-from', 'edit-headers', 'edit-label', 'edit-language',
+ \ 'edit-message', 'edit-mime', 'edit-newsgroups', 'edit-or-view-raw-message',
+ \ 'edit-raw-message', 'edit-reply-to', 'edit-subject', 'edit-to', 'edit-type',
+ \ 'edit-x-comment-to', 'end-cond', 'enter-command', 'enter-mask', 'entire-thread', 'eol',
+ \ 'error-history', 'exit', 'extract-keys', 'fetch-mail', 'filter-entry', 'first-entry',
+ \ 'flag-message', 'followup-message', 'forget-passphrase', 'forward-char',
+ \ 'forward-message', 'forward-to-group', 'forward-word', 'get-attachment', 'get-children',
+ \ 'get-message', 'get-parent', 'goto-folder', 'goto-parent', 'group-alternatives',
+ \ 'group-chat-reply', 'group-multilingual', 'group-related', 'group-reply', 'half-down',
+ \ 'half-up', 'help', 'history-down', 'history-search', 'history-up', 'imap-fetch-mail',
+ \ 'imap-logout-all', 'insert', 'ispell', 'jump', 'kill-eol', 'kill-eow', 'kill-line',
+ \ 'kill-word', 'last-entry', 'limit', 'limit-current-thread', 'link-threads', 'list-reply',
+ \ 'list-subscribe', 'list-unsubscribe', 'mail', 'mail-key', 'mailbox-cycle', 'mailbox-list',
+ \ 'mark-as-new', 'mark-message', 'middle-page', 'mix', 'modify-labels',
+ \ 'modify-labels-then-hide', 'modify-tags', 'modify-tags-then-hide', 'move-down', 'move-up',
+ \ 'new-mime', 'next-entry', 'next-line', 'next-new', 'next-new-then-unread', 'next-page',
+ \ 'next-subthread', 'next-thread', 'next-undeleted', 'next-unread', 'next-unread-mailbox',
+ \ 'parent-message', 'pgp-menu', 'pipe-entry', 'pipe-message', 'post-message',
+ \ 'postpone-message', 'previous-entry', 'previous-line', 'previous-new',
+ \ 'previous-new-then-unread', 'previous-page', 'previous-subthread', 'previous-thread',
+ \ 'previous-undeleted', 'previous-unread', 'print-entry', 'print-message', 'purge-message',
+ \ 'purge-thread', 'quasi-delete', 'query', 'query-append', 'quit', 'quote-char',
+ \ 'read-subthread', 'read-thread', 'recall-message', 'reconstruct-thread', 'redraw-screen',
+ \ 'refresh', 'reload-active', 'rename-attachment', 'rename-file', 'rename-mailbox', 'reply',
+ \ 'resend-message', 'root-message', 'save-entry', 'save-message', 'search', 'search-next',
+ \ 'search-opposite', 'search-reverse', 'search-toggle', 'select-entry', 'select-new',
+ \ 'send-message', 'set-flag', 'shell-escape', 'show-limit', 'show-log-messages',
+ \ 'show-version', 'sidebar-first', 'sidebar-last', 'sidebar-next', 'sidebar-next-new',
+ \ 'sidebar-open', 'sidebar-page-down', 'sidebar-page-up', 'sidebar-prev',
+ \ 'sidebar-prev-new', 'sidebar-toggle-virtual', 'sidebar-toggle-visible', 'skip-headers',
+ \ 'skip-quoted', 'smime-menu', 'sort', 'sort-alias', 'sort-alias-reverse', 'sort-mailbox',
+ \ 'sort-reverse', 'subscribe', 'subscribe-pattern', 'sync-mailbox', 'tag-entry',
+ \ 'tag-message', 'tag-pattern', 'tag-prefix', 'tag-prefix-cond', 'tag-subthread',
+ \ 'tag-thread', 'toggle-active', 'toggle-disposition', 'toggle-mailboxes', 'toggle-new',
+ \ 'toggle-prefer-encrypt', 'toggle-quoted', 'toggle-read', 'toggle-recode',
+ \ 'toggle-subscribed', 'toggle-unlink', 'toggle-write', 'top', 'top-page',
+ \ 'transpose-chars', 'uncatchup', 'undelete-entry', 'undelete-message', 'undelete-pattern',
+ \ 'undelete-subthread', 'undelete-thread', 'ungroup-attachment', 'unsubscribe',
+ \ 'unsubscribe-pattern', 'untag-pattern', 'upcase-word', 'update-encoding', 'verify-key',
+ \ 'vfolder-from-query', 'vfolder-from-query-readonly', 'vfolder-window-backward',
+ \ 'vfolder-window-forward', 'vfolder-window-reset', 'view-attach', 'view-attachments',
+ \ 'view-file', 'view-mailcap', 'view-name', 'view-pager', 'view-raw-message', 'view-text',
+ \ 'what-key', 'write-fcc'
+ \ ])
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+highlight def link muttrcSetBoolAssignment Boolean
+highlight def link muttrcSetQuadAssignment Boolean
+
+highlight def link muttrcComment Comment
+
+highlight def link muttrcAlternatesLine Error
+highlight def link muttrcBadAction Error
+highlight def link muttrcBindFunction Error
+highlight def link muttrcBindMenuList Error
+highlight def link muttrcColorBG Error
+highlight def link muttrcColorBGH Error
+highlight def link muttrcColorBGI Error
+highlight def link muttrcColorContext Error
+highlight def link muttrcColorFG Error
+highlight def link muttrcColorFGH Error
+highlight def link muttrcColorFGI Error
+highlight def link muttrcColorLine Error
+highlight def link muttrcFormatErrors Error
+highlight def link muttrcGroupLine Error
+highlight def link muttrcListsLine Error
+highlight def link muttrcPattern Error
+highlight def link muttrcSubscribeLine Error
+highlight def link muttrcUnColorLine Error
+highlight def link muttrcVarDeprecatedBool Error
+highlight def link muttrcVarDeprecatedQuad Error
+highlight def link muttrcVarDeprecatedStr Error
+
+highlight def link muttrcAliasEncEmail Identifier
+highlight def link muttrcAliasKey Identifier
+highlight def link muttrcColorCompose Identifier
+highlight def link muttrcColorComposeField Identifier
+highlight def link muttrcColorContextH Identifier
+highlight def link muttrcColorContextI Identifier
+highlight def link muttrcColorField Identifier
+highlight def link muttrcMenu Identifier
+highlight def link muttrcSimplePat Identifier
+highlight def link muttrcUnAliasKey Identifier
+highlight def link muttrcUnColorIndex Identifier
+highlight def link muttrcVarBool Identifier
+highlight def link muttrcVarNum Identifier
+highlight def link muttrcVarQuad Identifier
+highlight def link muttrcVarStr Identifier
+
+highlight def link muttrcCommand Keyword
+
+highlight def link muttrcAction Macro
+highlight def link muttrcAliasGroupName Macro
+highlight def link muttrcFunction Macro
+highlight def link muttrcGroupDef Macro
+highlight def link muttrcSimplePatString Macro
+
+highlight def link muttrcMonoAttrib muttrcColor
+
+highlight def link muttrcAlternateKeyword muttrcCommand
+highlight def link muttrcAttachmentsLine muttrcCommand
+highlight def link muttrcColorKeyword muttrcCommand
+highlight def link muttrcGroupKeyword muttrcCommand
+highlight def link muttrcListsKeyword muttrcCommand
+highlight def link muttrcMono muttrcCommand
+highlight def link muttrcPatHooks muttrcCommand
+highlight def link muttrcRXHooks muttrcCommand
+highlight def link muttrcSubscribeKeyword muttrcCommand
+highlight def link muttrcUnColorKeyword muttrcCommand
+
+highlight def link muttrcAliasFormatEscapes muttrcEscape
+highlight def link muttrcAttachFormatEscapes muttrcEscape
+highlight def link muttrcComposeFormatEscapes muttrcEscape
+highlight def link muttrcFolderFormatEscapes muttrcEscape
+highlight def link muttrcGroupIndexFormatEscapes muttrcEscape
+highlight def link muttrcIndexFormatEscapes muttrcEscape
+highlight def link muttrcMixFormatEscapes muttrcEscape
+highlight def link muttrcPatternFormatEscapes muttrcEscape
+highlight def link muttrcPGPCmdFormatEscapes muttrcEscape
+highlight def link muttrcPGPFormatEscapes muttrcEscape
+highlight def link muttrcPGPTimeEscapes muttrcEscape
+highlight def link muttrcQueryFormatEscapes muttrcEscape
+highlight def link muttrcShellString muttrcEscape
+highlight def link muttrcSidebarFormatEscapes muttrcEscape
+highlight def link muttrcSmimeFormatEscapes muttrcEscape
+highlight def link muttrcStatusFormatEscapes muttrcEscape
+highlight def link muttrcTimeEscapes muttrcEscape
+
+highlight def link muttrcAliasFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcAttachFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcComposeFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcFolderFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcIndexFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcMixFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcPatternFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcPGPCmdFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcPGPFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcSmimeFormatConditionals muttrcFormatConditionals2
+highlight def link muttrcStatusFormatConditionals muttrcFormatConditionals2
+
+highlight def link muttrcAddrDef muttrcGroupFlag
+highlight def link muttrcRXDef muttrcGroupFlag
+
+highlight def link muttrcAliasFormatStr muttrcString
+highlight def link muttrcAttachFormatStr muttrcString
+highlight def link muttrcComposeFormatStr muttrcString
+highlight def link muttrcFolderFormatStr muttrcString
+highlight def link muttrcGroupIndexFormatStr muttrcString
+highlight def link muttrcIndexFormatStr muttrcString
+highlight def link muttrcMixFormatStr muttrcString
+highlight def link muttrcPatternFormatStr muttrcString
+highlight def link muttrcPGPCmdFormatStr muttrcString
+highlight def link muttrcPGPFormatStr muttrcString
+highlight def link muttrcQueryFormatStr muttrcString
+highlight def link muttrcSidebarFormatStr muttrcString
+highlight def link muttrcSmimeFormatStr muttrcString
+highlight def link muttrcStatusFormatStr muttrcString
+highlight def link muttrcStrftimeFormatStr muttrcString
+
+highlight def link muttrcSetNumAssignment Number
+
+highlight def link muttrcEmail Special
+highlight def link muttrcSimplePatMetas Special
+highlight def link muttrcSpecial Special
+highlight def link muttrcVariableInner Special
+
+highlight def link muttrcAliasEncEmailNL SpecialChar
+highlight def link muttrcAliasENNL SpecialChar
+highlight def link muttrcAliasGroupDefNL SpecialChar
+highlight def link muttrcAliasNameNL SpecialChar
+highlight def link muttrcAliasNL SpecialChar
+highlight def link muttrcBindFunctionNL SpecialChar
+highlight def link muttrcBindKeyNL SpecialChar
+highlight def link muttrcBindMenuListNL SpecialChar
+highlight def link muttrcColorBGNL SpecialChar
+highlight def link muttrcColorFGNL SpecialChar
+highlight def link muttrcColorMatchCountNL SpecialChar
+highlight def link muttrcColorNL SpecialChar
+highlight def link muttrcColorRXNL SpecialChar
+highlight def link muttrcEscape SpecialChar
+highlight def link muttrcKeyName SpecialChar
+highlight def link muttrcKeySpecial SpecialChar
+highlight def link muttrcMacroBodyNL SpecialChar
+highlight def link muttrcMacroDescrNL SpecialChar
+highlight def link muttrcMacroKeyNL SpecialChar
+highlight def link muttrcMacroMenuListNL SpecialChar
+highlight def link muttrcPatternNL SpecialChar
+highlight def link muttrcRXChars SpecialChar
+highlight def link muttrcStringNL SpecialChar
+highlight def link muttrcUnAliasNL SpecialChar
+highlight def link muttrcUnColorAPNL SpecialChar
+highlight def link muttrcUnColorIndexNL SpecialChar
+highlight def link muttrcUnColorPatNL SpecialChar
+
+highlight def link muttrcAttachmentsMimeType String
+highlight def link muttrcEscapedVariable String
+highlight def link muttrcMacroDescr String
+highlight def link muttrcRXPat String
+highlight def link muttrcRXString String
+highlight def link muttrcRXString2 String
+highlight def link muttrcSetStrAssignment String
+highlight def link muttrcString String
+
+highlight def link muttrcAliasParens Type
+highlight def link muttrcAttachmentsFlag Type
+highlight def link muttrcColor Type
+highlight def link muttrcFormatConditionals2 Type
+highlight def link muttrcGroupFlag Type
+highlight def link muttrcHeader Type
+highlight def link muttrcHooks Type
+highlight def link muttrcKey Type
+highlight def link muttrcPatHookNot Type
+highlight def link muttrcRXHookNot Type
+highlight def link muttrcStrftimeEscapes Type
+
+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
new file mode 100644
index 0000000..4d068a1
--- /dev/null
+++ b/runtime/syntax/netrc.vim
@@ -0,0 +1,52 @@
+" Vim syntax file
+" Language: netrc(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-01-03
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword netrcKeyword machine nextgroup=netrcMachine skipwhite skipnl
+syn keyword netrcKeyword account
+ \ login
+ \ nextgroup=netrcLogin,netrcSpecial skipwhite skipnl
+syn keyword netrcKeyword password nextgroup=netrcPassword skipwhite skipnl
+syn keyword netrcKeyword default
+syn keyword netrcKeyword macdef
+ \ nextgroup=netrcInit,netrcMacroName skipwhite skipnl
+syn region netrcMacro contained start='.' end='^$'
+
+syn match netrcMachine contained display '\S\+'
+syn match netrcMachine contained display '"[^\\"]*\(\\.[^\\"]*\)*"'
+syn match netrcLogin contained display '\S\+'
+syn match netrcLogin contained display '"[^\\"]*\(\\.[^\\"]*\)*"'
+syn match netrcPassword contained display '\S\+'
+syn match netrcPassword contained display '"[^\\"]*\(\\.[^\\"]*\)*"'
+syn match netrcMacroName contained display '\S\+'
+ \ nextgroup=netrcMacro skipwhite skipnl
+syn match netrcMacroName contained display '"[^\\"]*\(\\.[^\\"]*\)*"'
+ \ nextgroup=netrcMacro skipwhite skipnl
+
+syn keyword netrcSpecial contained anonymous
+syn match netrcInit contained '\<init$'
+ \ nextgroup=netrcMacro skipwhite skipnl
+
+syn sync fromstart
+
+hi def link netrcKeyword Keyword
+hi def link netrcMacro PreProc
+hi def link netrcMachine Identifier
+hi def link netrcLogin String
+hi def link netrcPassword String
+hi def link netrcMacroName String
+hi def link netrcSpecial Special
+hi def link netrcInit Special
+
+let b:current_syntax = "netrc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/netrw.vim b/runtime/syntax/netrw.vim
new file mode 100644
index 0000000..1f02bbe
--- /dev/null
+++ b/runtime/syntax/netrw.vim
@@ -0,0 +1,146 @@
+" Language : Netrw Listing Syntax
+" Maintainer : Charles E. Campbell
+" Last change: Nov 07, 2019
+" Version : 20
+" ---------------------------------------------------------------------
+if exists("b:current_syntax")
+ finish
+endif
+
+" ---------------------------------------------------------------------
+" Directory List Syntax Highlighting: {{{1
+syn cluster NetrwGroup contains=netrwHide,netrwSortBy,netrwSortSeq,netrwQuickHelp,netrwVersion,netrwCopyTgt
+syn cluster NetrwTreeGroup contains=netrwDir,netrwSymLink,netrwExe
+
+syn match netrwPlain "\(\S\+ \)*\S\+" contains=netrwLink,@NoSpell
+syn match netrwSpecial "\%(\S\+ \)*\S\+[*|=]\ze\%(\s\{2,}\|$\)" contains=netrwClassify,@NoSpell
+syn match netrwDir "\.\{1,2}/" contains=netrwClassify,@NoSpell
+syn match netrwDir "\%(\S\+ \)*\S\+/\ze\%(\s\{2,}\|$\)" contains=netrwClassify,@NoSpell
+syn match netrwSizeDate "\<\d\+\s\d\{1,2}/\d\{1,2}/\d\{4}\s" skipwhite contains=netrwDateSep,@NoSpell nextgroup=netrwTime
+syn match netrwSymLink "\%(\S\+ \)*\S\+@\ze\%(\s\{2,}\|$\)" contains=netrwClassify,@NoSpell
+syn match netrwExe "\%(\S\+ \)*\S*[^~]\*\ze\%(\s\{2,}\|$\)" contains=netrwClassify,@NoSpell
+if has("gui_running") && (&enc == 'utf-8' || &enc == 'utf-16' || &enc == 'ucs-4')
+syn match netrwTreeBar "^\%([-+|│] \)\+" contains=netrwTreeBarSpace nextgroup=@netrwTreeGroup
+else
+syn match netrwTreeBar "^\%([-+|] \)\+" contains=netrwTreeBarSpace nextgroup=@netrwTreeGroup
+endif
+syn match netrwTreeBarSpace " " contained
+
+syn match netrwClassify "[*=|@/]\ze\%(\s\{2,}\|$\)" contained
+syn match netrwDateSep "/" contained
+syn match netrwTime "\d\{1,2}:\d\{2}:\d\{2}" contained contains=netrwTimeSep
+syn match netrwTimeSep ":"
+
+syn match netrwComment '".*\%(\t\|$\)' contains=@NetrwGroup,@NoSpell
+syn match netrwHide '^"\s*\(Hid\|Show\)ing:' skipwhite contains=@NoSpell nextgroup=netrwHidePat
+syn match netrwSlash "/" contained
+syn match netrwHidePat "[^,]\+" contained skipwhite contains=@NoSpell nextgroup=netrwHideSep
+syn match netrwHideSep "," contained skipwhite nextgroup=netrwHidePat
+syn match netrwSortBy "Sorted by" contained transparent skipwhite nextgroup=netrwList
+syn match netrwSortSeq "Sort sequence:" contained transparent skipwhite nextgroup=netrwList
+syn match netrwCopyTgt "Copy/Move Tgt:" contained transparent skipwhite nextgroup=netrwList
+syn match netrwList ".*$" contained contains=netrwComma,@NoSpell
+syn match netrwComma "," contained
+syn region netrwQuickHelp matchgroup=Comment start="Quick Help:\s\+" end="$" contains=netrwHelpCmd,netrwQHTopic,@NoSpell keepend contained
+syn match netrwHelpCmd "\S\+\ze:" contained skipwhite contains=@NoSpell nextgroup=netrwCmdSep
+syn match netrwQHTopic "([a-zA-Z &]\+)" contained skipwhite
+syn match netrwCmdSep ":" contained nextgroup=netrwCmdNote
+syn match netrwCmdNote ".\{-}\ze " contained contains=@NoSpell
+syn match netrwVersion "(netrw.*)" contained contains=@NoSpell
+syn match netrwLink "-->" contained skipwhite
+
+" -----------------------------
+" Special filetype highlighting {{{1
+" -----------------------------
+if exists("g:netrw_special_syntax") && g:netrw_special_syntax
+ if exists("+suffixes") && &suffixes != ""
+ let suflist= join(split(&suffixes,','))
+ let suflist= escape(substitute(suflist," ",'\\|','g'),'.~')
+ exe "syn match netrwSpecFile '\\(\\S\\+ \\)*\\S*\\(".suflist."\\)\\>' contains=netrwTreeBar,@NoSpell"
+ endif
+ syn match netrwBak "\(\S\+ \)*\S\+\.bak\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwCompress "\(\S\+ \)*\S\+\.\%(gz\|bz2\|Z\|zip\)\>" contains=netrwTreeBar,@NoSpell
+ if has("unix")
+ syn match netrwCoreDump "\<core\%(\.\d\+\)\=\>" contains=netrwTreeBar,@NoSpell
+ endif
+ syn match netrwLex "\(\S\+ \)*\S\+\.\%(l\|lex\)\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwYacc "\(\S\+ \)*\S\+\.y\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwData "\(\S\+ \)*\S\+\.dat\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwDoc "\(\S\+ \)*\S\+\.\%(doc\|txt\|pdf\|ps\|docx\)\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwHdr "\(\S\+ \)*\S\+\.\%(h\|hpp\)\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwLib "\(\S\+ \)*\S*\.\%(a\|so\|lib\|dll\)\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwMakeFile "\<[mM]akefile\>\|\(\S\+ \)*\S\+\.mak\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwObj "\(\S\+ \)*\S*\.\%(o\|obj\)\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwPix "\c\(\S\+ \)*\S*\.\%(bmp\|fits\=\|gif\|je\=pg\|pcx\|ppc\|pgm\|png\|ppm\|psd\|rgb\|tif\|xbm\|xcf\)\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwTags "\<\(ANmenu\|ANtags\)\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwTags "\<tags\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwTilde "\(\S\+ \)*\S\+\~\*\=\>" contains=netrwTreeBar,@NoSpell
+ syn match netrwTmp "\<tmp\(\S\+ \)*\S\+\>\|\(\S\+ \)*\S*tmp\>" contains=netrwTreeBar,@NoSpell
+endif
+
+" ---------------------------------------------------------------------
+" Highlighting Links: {{{1
+if !exists("did_drchip_netrwlist_syntax")
+ let did_drchip_netrwlist_syntax= 1
+ hi default link netrwClassify Function
+ hi default link netrwCmdSep Delimiter
+ hi default link netrwComment Comment
+ hi default link netrwDir Directory
+ hi default link netrwHelpCmd Function
+ hi default link netrwQHTopic Number
+ hi default link netrwHidePat Statement
+ hi default link netrwHideSep netrwComment
+ hi default link netrwList Statement
+ hi default link netrwVersion Identifier
+ hi default link netrwSymLink Question
+ hi default link netrwExe PreProc
+ hi default link netrwDateSep Delimiter
+
+ hi default link netrwTreeBar Special
+ hi default link netrwTimeSep netrwDateSep
+ hi default link netrwComma netrwComment
+ hi default link netrwHide netrwComment
+ hi default link netrwMarkFile TabLineSel
+ hi default link netrwLink Special
+
+ " special syntax highlighting (see :he g:netrw_special_syntax)
+ hi default link netrwCoreDump WarningMsg
+ hi default link netrwData Folded
+ hi default link netrwHdr netrwPlain
+ hi default link netrwLex netrwPlain
+ hi default link netrwLib DiffChange
+ hi default link netrwMakefile DiffChange
+ hi default link netrwYacc netrwPlain
+ hi default link netrwPix Special
+
+ hi default link netrwBak netrwGray
+ hi default link netrwCompress netrwGray
+ hi default link netrwSpecFile netrwGray
+ hi default link netrwObj netrwGray
+ hi default link netrwTags netrwGray
+ hi default link netrwTilde netrwGray
+ hi default link netrwTmp netrwGray
+endif
+
+ " set up netrwGray to be understated (but not Ignore'd or Conceal'd, as those
+ " can be hard/impossible to read). Users may override this in a colorscheme by
+ " specifying netrwGray highlighting.
+ redir => s:netrwgray
+ sil hi netrwGray
+ redir END
+ if s:netrwgray !~ 'guifg'
+ if has("gui") && has("gui_running")
+ if &bg == "dark"
+ exe "hi netrwGray gui=NONE guifg=gray30"
+ else
+ exe "hi netrwGray gui=NONE guifg=gray70"
+ endif
+ else
+ hi link netrwGray Folded
+ endif
+ endif
+
+" Current Syntax: {{{1
+let b:current_syntax = "netrwlist"
+" ---------------------------------------------------------------------
+" vim: ts=8 fdm=marker
diff --git a/runtime/syntax/nginx.vim b/runtime/syntax/nginx.vim
new file mode 100644
index 0000000..04760e4
--- /dev/null
+++ b/runtime/syntax/nginx.vim
@@ -0,0 +1,2338 @@
+" Vim syntax file
+" Language: nginx.conf
+" Maintainer: Chris Aumann <me@chr4.org>
+" Last Change: Jan 25, 2023
+
+if exists("b:current_syntax")
+ finish
+end
+
+let b:current_syntax = "nginx"
+
+syn match ngxVariable '\$\(\w\+\|{\w\+}\)'
+syn match ngxVariableBlock '\$\(\w\+\|{\w\+}\)' contained
+syn match ngxVariableString '\$\(\w\+\|{\w\+}\)' contained
+syn region ngxBlock start=+^+ end=+{+ skip=+\${\|{{\|{%+ contains=ngxComment,ngxInteger,ngxIPaddr,ngxDirectiveBlock,ngxVariableBlock,ngxString,ngxThirdPartyLuaBlock oneline
+syn region ngxString start=+[^:a-zA-Z>!\\@]\z(["']\)+lc=1 end=+\z1+ skip=+\\\\\|\\\z1+ contains=ngxVariableString,ngxSSLCipherInsecure
+syn match ngxComment ' *#.*$'
+
+" These regular expressions where taken (and adapted) from
+" http://vim.1045645.n5.nabble.com/IPv6-support-for-quot-dns-quot-zonefile-syntax-highlighting-td1197292.html
+syn match ngxInteger '\W\zs\(\d[0-9.]*\|[0-9.]*\d\)\w\?\ze\W'
+syn match ngxIPaddr '\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}'
+syn match ngxIPaddr '\[\(\x\{1,4}:\)\{6}\(\x\{1,4}:\x\{1,4}\|\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\]'
+syn match ngxIPaddr '\[::\(\(\x\{1,4}:\)\{,6}\x\{1,4}\|\(\x\{1,4}:\)\{,5}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\]'
+syn match ngxIPaddr '\[\(\x\{1,4}:\)\{1}:\(\(\x\{1,4}:\)\{,5}\x\{1,4}\|\(\x\{1,4}:\)\{,4}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\]'
+syn match ngxIPaddr '\[\(\x\{1,4}:\)\{2}:\(\(\x\{1,4}:\)\{,4}\x\{1,4}\|\(\x\{1,4}:\)\{,3}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\]'
+syn match ngxIPaddr '\[\(\x\{1,4}:\)\{3}:\(\(\x\{1,4}:\)\{,3}\x\{1,4}\|\(\x\{1,4}:\)\{,2}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\]'
+syn match ngxIPaddr '\[\(\x\{1,4}:\)\{4}:\(\(\x\{1,4}:\)\{,2}\x\{1,4}\|\(\x\{1,4}:\)\{,1}\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\]'
+syn match ngxIPaddr '\[\(\x\{1,4}:\)\{5}:\(\(\x\{1,4}:\)\{,1}\x\{1,4}\|\([0-2]\?\d\{1,2}\.\)\{3}[0-2]\?\d\{1,2}\)\]'
+syn match ngxIPaddr '\[\(\x\{1,4}:\)\{6}:\x\{1,4}\]'
+
+" Highlight wildcard listening signs also as IPaddr
+syn match ngxIPaddr '\s\zs\[::]'
+syn match ngxIPaddr '\s\zs\*'
+
+syn keyword ngxBoolean on
+syn keyword ngxBoolean off
+
+syn keyword ngxDirectiveBlock http contained
+syn keyword ngxDirectiveBlock mail contained
+syn keyword ngxDirectiveBlock events contained
+syn keyword ngxDirectiveBlock server contained
+syn keyword ngxDirectiveBlock match contained
+syn keyword ngxDirectiveBlock types contained
+syn keyword ngxDirectiveBlock location contained
+syn keyword ngxDirectiveBlock upstream contained
+syn keyword ngxDirectiveBlock charset_map contained
+syn keyword ngxDirectiveBlock limit_except contained
+syn keyword ngxDirectiveBlock if contained
+syn keyword ngxDirectiveBlock geo contained
+syn keyword ngxDirectiveBlock map contained
+syn keyword ngxDirectiveBlock split_clients contained
+
+syn keyword ngxDirectiveImportant include
+syn keyword ngxDirectiveImportant root
+syn keyword ngxDirectiveImportant server contained
+syn region ngxDirectiveImportantServer matchgroup=ngxDirectiveImportant start=+^\s*\zsserver\ze\s.*;+ skip=+\\\\\|\\\;+ end=+;+he=e-1 contains=ngxUpstreamServerOptions,ngxString,ngxIPaddr,ngxBoolean,ngxInteger,ngxTemplateVar
+syn keyword ngxDirectiveImportant server_name
+syn keyword ngxDirectiveImportant listen contained
+syn region ngxDirectiveImportantListen matchgroup=ngxDirectiveImportant start=+listen+ skip=+\\\\\|\\\;+ end=+;+he=e-1 contains=ngxListenOptions,ngxString,ngxIPaddr,ngxBoolean,ngxInteger,ngxTemplateVar
+syn keyword ngxDirectiveImportant internal
+syn keyword ngxDirectiveImportant proxy_pass
+syn keyword ngxDirectiveImportant memcached_pass
+syn keyword ngxDirectiveImportant fastcgi_pass
+syn keyword ngxDirectiveImportant scgi_pass
+syn keyword ngxDirectiveImportant uwsgi_pass
+syn keyword ngxDirectiveImportant try_files
+syn keyword ngxDirectiveImportant error_page
+syn keyword ngxDirectiveImportant post_action
+
+syn keyword ngxUpstreamServerOptions weight contained
+syn keyword ngxUpstreamServerOptions max_conns contained
+syn keyword ngxUpstreamServerOptions max_fails contained
+syn keyword ngxUpstreamServerOptions fail_timeout contained
+syn keyword ngxUpstreamServerOptions backup contained
+syn keyword ngxUpstreamServerOptions down contained
+syn keyword ngxUpstreamServerOptions resolve contained
+syn keyword ngxUpstreamServerOptions route contained
+syn keyword ngxUpstreamServerOptions service contained
+syn keyword ngxUpstreamServerOptions default_server contained
+syn keyword ngxUpstreamServerOptions slow_start contained
+
+syn keyword ngxListenOptions default_server contained
+syn keyword ngxListenOptions ssl contained
+syn keyword ngxListenOptions http2 contained
+syn keyword ngxListenOptions spdy contained
+syn keyword ngxListenOptions http3 contained
+syn keyword ngxListenOptions quic contained
+syn keyword ngxListenOptions proxy_protocol contained
+syn keyword ngxListenOptions setfib contained
+syn keyword ngxListenOptions fastopen contained
+syn keyword ngxListenOptions backlog contained
+syn keyword ngxListenOptions rcvbuf contained
+syn keyword ngxListenOptions sndbuf contained
+syn keyword ngxListenOptions accept_filter contained
+syn keyword ngxListenOptions deferred contained
+syn keyword ngxListenOptions bind contained
+syn keyword ngxListenOptions ipv6only contained
+syn keyword ngxListenOptions reuseport contained
+syn keyword ngxListenOptions so_keepalive contained
+syn keyword ngxListenOptions keepidle contained
+
+syn keyword ngxDirectiveControl break
+syn keyword ngxDirectiveControl return
+syn keyword ngxDirectiveControl rewrite
+syn keyword ngxDirectiveControl set
+
+syn keyword ngxDirectiveDeprecated connections
+syn keyword ngxDirectiveDeprecated imap
+syn keyword ngxDirectiveDeprecated limit_zone
+syn keyword ngxDirectiveDeprecated mysql_test
+syn keyword ngxDirectiveDeprecated open_file_cache_retest
+syn keyword ngxDirectiveDeprecated optimize_server_names
+syn keyword ngxDirectiveDeprecated satisfy_any
+syn keyword ngxDirectiveDeprecated so_keepalive
+
+syn keyword ngxDirective absolute_redirect
+syn keyword ngxDirective accept_mutex
+syn keyword ngxDirective accept_mutex_delay
+syn keyword ngxDirective acceptex_read
+syn keyword ngxDirective access_log
+syn keyword ngxDirective add_after_body
+syn keyword ngxDirective add_before_body
+syn keyword ngxDirective add_header
+syn keyword ngxDirective addition_types
+syn keyword ngxDirective aio
+syn keyword ngxDirective aio_write
+syn keyword ngxDirective alias
+syn keyword ngxDirective allow
+syn keyword ngxDirective ancient_browser
+syn keyword ngxDirective ancient_browser_value
+syn keyword ngxDirective auth_basic
+syn keyword ngxDirective auth_basic_user_file
+syn keyword ngxDirective auth_http
+syn keyword ngxDirective auth_http_header
+syn keyword ngxDirective auth_http_pass_client_cert
+syn keyword ngxDirective auth_http_timeout
+syn keyword ngxDirective auth_jwt
+syn keyword ngxDirective auth_jwt_key_file
+syn keyword ngxDirective auth_request
+syn keyword ngxDirective auth_request_set
+syn keyword ngxDirective autoindex
+syn keyword ngxDirective autoindex_exact_size
+syn keyword ngxDirective autoindex_format
+syn keyword ngxDirective autoindex_localtime
+syn keyword ngxDirective charset
+syn keyword ngxDirective charset_map
+syn keyword ngxDirective charset_types
+syn keyword ngxDirective chunked_transfer_encoding
+syn keyword ngxDirective client_body_buffer_size
+syn keyword ngxDirective client_body_in_file_only
+syn keyword ngxDirective client_body_in_single_buffer
+syn keyword ngxDirective client_body_temp_path
+syn keyword ngxDirective client_body_timeout
+syn keyword ngxDirective client_header_buffer_size
+syn keyword ngxDirective client_header_timeout
+syn keyword ngxDirective client_max_body_size
+syn keyword ngxDirective connection_pool_size
+syn keyword ngxDirective create_full_put_path
+syn keyword ngxDirective daemon
+syn keyword ngxDirective dav_access
+syn keyword ngxDirective dav_methods
+syn keyword ngxDirective debug_connection
+syn keyword ngxDirective debug_points
+syn keyword ngxDirective default_type
+syn keyword ngxDirective degradation
+syn keyword ngxDirective degrade
+syn keyword ngxDirective deny
+syn keyword ngxDirective devpoll_changes
+syn keyword ngxDirective devpoll_events
+syn keyword ngxDirective directio
+syn keyword ngxDirective directio_alignment
+syn keyword ngxDirective disable_symlinks
+syn keyword ngxDirective empty_gif
+syn keyword ngxDirective env
+syn keyword ngxDirective epoll_events
+syn keyword ngxDirective error_log
+syn keyword ngxDirective etag
+syn keyword ngxDirective eventport_events
+syn keyword ngxDirective expires
+syn keyword ngxDirective f4f
+syn keyword ngxDirective f4f_buffer_size
+syn keyword ngxDirective fastcgi_bind
+syn keyword ngxDirective fastcgi_buffer_size
+syn keyword ngxDirective fastcgi_buffering
+syn keyword ngxDirective fastcgi_buffers
+syn keyword ngxDirective fastcgi_busy_buffers_size
+syn keyword ngxDirective fastcgi_cache
+syn keyword ngxDirective fastcgi_cache_bypass
+syn keyword ngxDirective fastcgi_cache_key
+syn keyword ngxDirective fastcgi_cache_lock
+syn keyword ngxDirective fastcgi_cache_lock_age
+syn keyword ngxDirective fastcgi_cache_lock_timeout
+syn keyword ngxDirective fastcgi_cache_max_range_offset
+syn keyword ngxDirective fastcgi_cache_methods
+syn keyword ngxDirective fastcgi_cache_min_uses
+syn keyword ngxDirective fastcgi_cache_path
+syn keyword ngxDirective fastcgi_cache_purge
+syn keyword ngxDirective fastcgi_cache_revalidate
+syn keyword ngxDirective fastcgi_cache_use_stale
+syn keyword ngxDirective fastcgi_cache_valid
+syn keyword ngxDirective fastcgi_catch_stderr
+syn keyword ngxDirective fastcgi_connect_timeout
+syn keyword ngxDirective fastcgi_force_ranges
+syn keyword ngxDirective fastcgi_hide_header
+syn keyword ngxDirective fastcgi_ignore_client_abort
+syn keyword ngxDirective fastcgi_ignore_headers
+syn keyword ngxDirective fastcgi_index
+syn keyword ngxDirective fastcgi_intercept_errors
+syn keyword ngxDirective fastcgi_keep_conn
+syn keyword ngxDirective fastcgi_limit_rate
+syn keyword ngxDirective fastcgi_max_temp_file_size
+syn keyword ngxDirective fastcgi_next_upstream
+syn keyword ngxDirective fastcgi_next_upstream_timeout
+syn keyword ngxDirective fastcgi_next_upstream_tries
+syn keyword ngxDirective fastcgi_no_cache
+syn keyword ngxDirective fastcgi_param
+syn keyword ngxDirective fastcgi_pass_header
+syn keyword ngxDirective fastcgi_pass_request_body
+syn keyword ngxDirective fastcgi_pass_request_headers
+syn keyword ngxDirective fastcgi_read_timeout
+syn keyword ngxDirective fastcgi_request_buffering
+syn keyword ngxDirective fastcgi_send_lowat
+syn keyword ngxDirective fastcgi_send_timeout
+syn keyword ngxDirective fastcgi_split_path_info
+syn keyword ngxDirective fastcgi_store
+syn keyword ngxDirective fastcgi_store_access
+syn keyword ngxDirective fastcgi_temp_file_write_size
+syn keyword ngxDirective fastcgi_temp_path
+syn keyword ngxDirective flv
+syn keyword ngxDirective geoip_city
+syn keyword ngxDirective geoip_country
+syn keyword ngxDirective geoip_org
+syn keyword ngxDirective geoip_proxy
+syn keyword ngxDirective geoip_proxy_recursive
+syn keyword ngxDirective google_perftools_profiles
+syn keyword ngxDirective gunzip
+syn keyword ngxDirective gunzip_buffers
+syn keyword ngxDirective gzip nextgroup=ngxGzipOn,ngxGzipOff skipwhite
+syn keyword ngxGzipOn on contained
+syn keyword ngxGzipOff off contained
+syn keyword ngxDirective gzip_buffers
+syn keyword ngxDirective gzip_comp_level
+syn keyword ngxDirective gzip_disable
+syn keyword ngxDirective gzip_hash
+syn keyword ngxDirective gzip_http_version
+syn keyword ngxDirective gzip_min_length
+syn keyword ngxDirective gzip_no_buffer
+syn keyword ngxDirective gzip_proxied
+syn keyword ngxDirective gzip_static
+syn keyword ngxDirective gzip_types
+syn keyword ngxDirective gzip_vary
+syn keyword ngxDirective gzip_window
+syn keyword ngxDirective hash
+syn keyword ngxDirective health_check
+syn keyword ngxDirective health_check_timeout
+syn keyword ngxDirective hls
+syn keyword ngxDirective hls_buffers
+syn keyword ngxDirective hls_forward_args
+syn keyword ngxDirective hls_fragment
+syn keyword ngxDirective hls_mp4_buffer_size
+syn keyword ngxDirective hls_mp4_max_buffer_size
+syn keyword ngxDirective http2_chunk_size
+syn keyword ngxDirective http2_body_preread_size
+syn keyword ngxDirective http2_idle_timeout
+syn keyword ngxDirective http2_max_concurrent_streams
+syn keyword ngxDirective http2_max_field_size
+syn keyword ngxDirective http2_max_header_size
+syn keyword ngxDirective http2_max_requests
+syn keyword ngxDirective http2_push
+syn keyword ngxDirective http2_push_preload
+syn keyword ngxDirective http2_recv_buffer_size
+syn keyword ngxDirective http2_recv_timeout
+syn keyword ngxDirective http3_hq
+syn keyword ngxDirective http3_max_concurrent_pushes
+syn keyword ngxDirective http3_max_concurrent_streams
+syn keyword ngxDirective http3_push
+syn keyword ngxDirective http3_push_preload
+syn keyword ngxDirective http3_stream_buffer_size
+syn keyword ngxDirective if_modified_since
+syn keyword ngxDirective ignore_invalid_headers
+syn keyword ngxDirective image_filter
+syn keyword ngxDirective image_filter_buffer
+syn keyword ngxDirective image_filter_interlace
+syn keyword ngxDirective image_filter_jpeg_quality
+syn keyword ngxDirective image_filter_sharpen
+syn keyword ngxDirective image_filter_transparency
+syn keyword ngxDirective image_filter_webp_quality
+syn keyword ngxDirective imap_auth
+syn keyword ngxDirective imap_capabilities
+syn keyword ngxDirective imap_client_buffer
+syn keyword ngxDirective index
+syn keyword ngxDirective iocp_threads
+syn keyword ngxDirective ip_hash
+syn keyword ngxDirective js_access
+syn keyword ngxDirective js_content
+syn keyword ngxDirective js_filter
+syn keyword ngxDirective js_include
+syn keyword ngxDirective js_preread
+syn keyword ngxDirective js_set
+syn keyword ngxDirective keepalive
+syn keyword ngxDirective keepalive_disable
+syn keyword ngxDirective keepalive_requests
+syn keyword ngxDirective keepalive_timeout
+syn keyword ngxDirective kqueue_changes
+syn keyword ngxDirective kqueue_events
+syn keyword ngxDirective large_client_header_buffers
+syn keyword ngxDirective least_conn
+syn keyword ngxDirective least_time
+syn keyword ngxDirective limit_conn
+syn keyword ngxDirective limit_conn_dry_run
+syn keyword ngxDirective limit_conn_log_level
+syn keyword ngxDirective limit_conn_status
+syn keyword ngxDirective limit_conn_zone
+syn keyword ngxDirective limit_except
+syn keyword ngxDirective limit_rate
+syn keyword ngxDirective limit_rate_after
+syn keyword ngxDirective limit_req
+syn keyword ngxDirective limit_req_dry_run
+syn keyword ngxDirective limit_req_log_level
+syn keyword ngxDirective limit_req_status
+syn keyword ngxDirective limit_req_zone
+syn keyword ngxDirective lingering_close
+syn keyword ngxDirective lingering_time
+syn keyword ngxDirective lingering_timeout
+syn keyword ngxDirective load_module
+syn keyword ngxDirective lock_file
+syn keyword ngxDirective log_format
+syn keyword ngxDirective log_not_found
+syn keyword ngxDirective log_subrequest
+syn keyword ngxDirective map_hash_bucket_size
+syn keyword ngxDirective map_hash_max_size
+syn keyword ngxDirective master_process
+syn keyword ngxDirective max_ranges
+syn keyword ngxDirective memcached_bind
+syn keyword ngxDirective memcached_buffer_size
+syn keyword ngxDirective memcached_connect_timeout
+syn keyword ngxDirective memcached_force_ranges
+syn keyword ngxDirective memcached_gzip_flag
+syn keyword ngxDirective memcached_next_upstream
+syn keyword ngxDirective memcached_next_upstream_timeout
+syn keyword ngxDirective memcached_next_upstream_tries
+syn keyword ngxDirective memcached_read_timeout
+syn keyword ngxDirective memcached_send_timeout
+syn keyword ngxDirective merge_slashes
+syn keyword ngxDirective min_delete_depth
+syn keyword ngxDirective modern_browser
+syn keyword ngxDirective modern_browser_value
+syn keyword ngxDirective mp4
+syn keyword ngxDirective mp4_buffer_size
+syn keyword ngxDirective mp4_max_buffer_size
+syn keyword ngxDirective mp4_limit_rate
+syn keyword ngxDirective mp4_limit_rate_after
+syn keyword ngxDirective msie_padding
+syn keyword ngxDirective msie_refresh
+syn keyword ngxDirective multi_accept
+syn keyword ngxDirective ntlm
+syn keyword ngxDirective open_file_cache
+syn keyword ngxDirective open_file_cache_errors
+syn keyword ngxDirective open_file_cache_events
+syn keyword ngxDirective open_file_cache_min_uses
+syn keyword ngxDirective open_file_cache_valid
+syn keyword ngxDirective open_log_file_cache
+syn keyword ngxDirective output_buffers
+syn keyword ngxDirective override_charset
+syn keyword ngxDirective pcre_jit
+syn keyword ngxDirective perl
+syn keyword ngxDirective perl_modules
+syn keyword ngxDirective perl_require
+syn keyword ngxDirective perl_set
+syn keyword ngxDirective pid
+syn keyword ngxDirective pop3_auth
+syn keyword ngxDirective pop3_capabilities
+syn keyword ngxDirective port_in_redirect
+syn keyword ngxDirective post_acceptex
+syn keyword ngxDirective postpone_gzipping
+syn keyword ngxDirective postpone_output
+syn keyword ngxDirective preread_buffer_size
+syn keyword ngxDirective preread_timeout
+syn keyword ngxDirective protocol nextgroup=ngxMailProtocol skipwhite
+syn keyword ngxMailProtocol imap pop3 smtp contained
+syn keyword ngxDirective proxy
+syn keyword ngxDirective proxy_bind
+syn keyword ngxDirective proxy_buffer
+syn keyword ngxDirective proxy_buffer_size
+syn keyword ngxDirective proxy_buffering
+syn keyword ngxDirective proxy_buffers
+syn keyword ngxDirective proxy_busy_buffers_size
+syn keyword ngxDirective proxy_cache
+syn keyword ngxDirective proxy_cache_bypass
+syn keyword ngxDirective proxy_cache_convert_head
+syn keyword ngxDirective proxy_cache_key
+syn keyword ngxDirective proxy_cache_lock
+syn keyword ngxDirective proxy_cache_lock_age
+syn keyword ngxDirective proxy_cache_lock_timeout
+syn keyword ngxDirective proxy_cache_max_range_offset
+syn keyword ngxDirective proxy_cache_methods
+syn keyword ngxDirective proxy_cache_min_uses
+syn keyword ngxDirective proxy_cache_path
+syn keyword ngxDirective proxy_cache_purge
+syn keyword ngxDirective proxy_cache_revalidate
+syn keyword ngxDirective proxy_cache_use_stale
+syn keyword ngxDirective proxy_cache_valid
+syn keyword ngxDirective proxy_connect_timeout
+syn keyword ngxDirective proxy_cookie_domain
+syn keyword ngxDirective proxy_cookie_path
+syn keyword ngxDirective proxy_download_rate
+syn keyword ngxDirective proxy_force_ranges
+syn keyword ngxDirective proxy_headers_hash_bucket_size
+syn keyword ngxDirective proxy_headers_hash_max_size
+syn keyword ngxDirective proxy_hide_header
+syn keyword ngxDirective proxy_http_version
+syn keyword ngxDirective proxy_ignore_client_abort
+syn keyword ngxDirective proxy_ignore_headers
+syn keyword ngxDirective proxy_intercept_errors
+syn keyword ngxDirective proxy_limit_rate
+syn keyword ngxDirective proxy_max_temp_file_size
+syn keyword ngxDirective proxy_method
+syn keyword ngxDirective proxy_next_upstream contained
+syn region ngxDirectiveProxyNextUpstream matchgroup=ngxDirective start=+^\s*\zsproxy_next_upstream\ze\s.*;+ skip=+\\\\\|\\\;+ end=+;+he=e-1 contains=ngxProxyNextUpstreamOptions,ngxString,ngxTemplateVar
+syn keyword ngxDirective proxy_next_upstream_timeout
+syn keyword ngxDirective proxy_next_upstream_tries
+syn keyword ngxDirective proxy_no_cache
+syn keyword ngxDirective proxy_pass_error_message
+syn keyword ngxDirective proxy_pass_header
+syn keyword ngxDirective proxy_pass_request_body
+syn keyword ngxDirective proxy_pass_request_headers
+syn keyword ngxDirective proxy_protocol
+syn keyword ngxDirective proxy_protocol_timeout
+syn keyword ngxDirective proxy_read_timeout
+syn keyword ngxDirective proxy_redirect
+syn keyword ngxDirective proxy_request_buffering
+syn keyword ngxDirective proxy_responses
+syn keyword ngxDirective proxy_send_lowat
+syn keyword ngxDirective proxy_send_timeout
+syn keyword ngxDirective proxy_set_body
+syn keyword ngxDirective proxy_set_header
+syn keyword ngxDirective proxy_ssl_certificate
+syn keyword ngxDirective proxy_ssl_certificate_key
+syn keyword ngxDirective proxy_ssl_ciphers
+syn keyword ngxDirective proxy_ssl_crl
+syn keyword ngxDirective proxy_ssl_name
+syn keyword ngxDirective proxy_ssl_password_file
+syn keyword ngxDirective proxy_ssl_protocols nextgroup=ngxSSLProtocol skipwhite
+syn keyword ngxDirective proxy_ssl_server_name
+syn keyword ngxDirective proxy_ssl_session_reuse
+syn keyword ngxDirective proxy_ssl_trusted_certificate
+syn keyword ngxDirective proxy_ssl_verify
+syn keyword ngxDirective proxy_ssl_verify_depth
+syn keyword ngxDirective proxy_store
+syn keyword ngxDirective proxy_store_access
+syn keyword ngxDirective proxy_temp_file_write_size
+syn keyword ngxDirective proxy_temp_path
+syn keyword ngxDirective proxy_timeout
+syn keyword ngxDirective proxy_upload_rate
+syn keyword ngxDirective queue
+syn keyword ngxDirective quic_gso
+syn keyword ngxDirective quic_host_key
+syn keyword ngxDirective quic_mtu
+syn keyword ngxDirective quic_retry
+syn keyword ngxDirective random_index
+syn keyword ngxDirective read_ahead
+syn keyword ngxDirective real_ip_header
+syn keyword ngxDirective real_ip_recursive
+syn keyword ngxDirective recursive_error_pages
+syn keyword ngxDirective referer_hash_bucket_size
+syn keyword ngxDirective referer_hash_max_size
+syn keyword ngxDirective request_pool_size
+syn keyword ngxDirective reset_timedout_connection
+syn keyword ngxDirective resolver
+syn keyword ngxDirective resolver_timeout
+syn keyword ngxDirective rewrite_log
+syn keyword ngxDirective rtsig_overflow_events
+syn keyword ngxDirective rtsig_overflow_test
+syn keyword ngxDirective rtsig_overflow_threshold
+syn keyword ngxDirective rtsig_signo
+syn keyword ngxDirective satisfy
+syn keyword ngxDirective scgi_bind
+syn keyword ngxDirective scgi_buffer_size
+syn keyword ngxDirective scgi_buffering
+syn keyword ngxDirective scgi_buffers
+syn keyword ngxDirective scgi_busy_buffers_size
+syn keyword ngxDirective scgi_cache
+syn keyword ngxDirective scgi_cache_bypass
+syn keyword ngxDirective scgi_cache_key
+syn keyword ngxDirective scgi_cache_lock
+syn keyword ngxDirective scgi_cache_lock_age
+syn keyword ngxDirective scgi_cache_lock_timeout
+syn keyword ngxDirective scgi_cache_max_range_offset
+syn keyword ngxDirective scgi_cache_methods
+syn keyword ngxDirective scgi_cache_min_uses
+syn keyword ngxDirective scgi_cache_path
+syn keyword ngxDirective scgi_cache_purge
+syn keyword ngxDirective scgi_cache_revalidate
+syn keyword ngxDirective scgi_cache_use_stale
+syn keyword ngxDirective scgi_cache_valid
+syn keyword ngxDirective scgi_connect_timeout
+syn keyword ngxDirective scgi_force_ranges
+syn keyword ngxDirective scgi_hide_header
+syn keyword ngxDirective scgi_ignore_client_abort
+syn keyword ngxDirective scgi_ignore_headers
+syn keyword ngxDirective scgi_intercept_errors
+syn keyword ngxDirective scgi_limit_rate
+syn keyword ngxDirective scgi_max_temp_file_size
+syn keyword ngxDirective scgi_next_upstream
+syn keyword ngxDirective scgi_next_upstream_timeout
+syn keyword ngxDirective scgi_next_upstream_tries
+syn keyword ngxDirective scgi_no_cache
+syn keyword ngxDirective scgi_param
+syn keyword ngxDirective scgi_pass_header
+syn keyword ngxDirective scgi_pass_request_body
+syn keyword ngxDirective scgi_pass_request_headers
+syn keyword ngxDirective scgi_read_timeout
+syn keyword ngxDirective scgi_request_buffering
+syn keyword ngxDirective scgi_send_timeout
+syn keyword ngxDirective scgi_store
+syn keyword ngxDirective scgi_store_access
+syn keyword ngxDirective scgi_temp_file_write_size
+syn keyword ngxDirective scgi_temp_path
+syn keyword ngxDirective secure_link
+syn keyword ngxDirective secure_link_md5
+syn keyword ngxDirective secure_link_secret
+syn keyword ngxDirective send_lowat
+syn keyword ngxDirective send_timeout
+syn keyword ngxDirective sendfile
+syn keyword ngxDirective sendfile_max_chunk
+syn keyword ngxDirective server_name_in_redirect
+syn keyword ngxDirective server_names_hash_bucket_size
+syn keyword ngxDirective server_names_hash_max_size
+syn keyword ngxDirective server_tokens
+syn keyword ngxDirective session_log
+syn keyword ngxDirective session_log_format
+syn keyword ngxDirective session_log_zone
+syn keyword ngxDirective set_real_ip_from
+syn keyword ngxDirective slice
+syn keyword ngxDirective smtp_auth
+syn keyword ngxDirective smtp_capabilities
+syn keyword ngxDirective smtp_client_buffer
+syn keyword ngxDirective smtp_greeting_delay
+syn keyword ngxDirective source_charset
+syn keyword ngxDirective spdy_chunk_size
+syn keyword ngxDirective spdy_headers_comp
+syn keyword ngxDirective spdy_keepalive_timeout
+syn keyword ngxDirective spdy_max_concurrent_streams
+syn keyword ngxDirective spdy_pool_size
+syn keyword ngxDirective spdy_recv_buffer_size
+syn keyword ngxDirective spdy_recv_timeout
+syn keyword ngxDirective spdy_streams_index_size
+syn keyword ngxDirective ssi
+syn keyword ngxDirective ssi_ignore_recycled_buffers
+syn keyword ngxDirective ssi_last_modified
+syn keyword ngxDirective ssi_min_file_chunk
+syn keyword ngxDirective ssi_silent_errors
+syn keyword ngxDirective ssi_types
+syn keyword ngxDirective ssi_value_length
+syn keyword ngxDirective ssl
+syn keyword ngxDirective ssl_buffer_size
+syn keyword ngxDirective ssl_certificate
+syn keyword ngxDirective ssl_certificate_key
+syn keyword ngxDirective ssl_ciphers
+syn keyword ngxDirective ssl_client_certificate
+syn keyword ngxDirective ssl_conf_command
+syn keyword ngxDirective ssl_crl
+syn keyword ngxDirective ssl_dhparam
+syn keyword ngxDirective ssl_early_data
+syn keyword ngxDirective ssl_ecdh_curve
+syn keyword ngxDirective ssl_engine
+syn keyword ngxDirective ssl_handshake_timeout
+syn keyword ngxDirective ssl_password_file
+syn keyword ngxDirective ssl_prefer_server_ciphers nextgroup=ngxSSLPreferServerCiphersOff,ngxSSLPreferServerCiphersOn skipwhite
+syn keyword ngxSSLPreferServerCiphersOn on contained
+syn keyword ngxSSLPreferServerCiphersOff off contained
+syn keyword ngxDirective ssl_preread
+syn keyword ngxDirective ssl_protocols nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
+syn keyword ngxDirective ssl_reject_handshake
+syn match ngxSSLProtocol 'TLSv1' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
+syn match ngxSSLProtocol 'TLSv1\.1' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
+syn match ngxSSLProtocol 'TLSv1\.2' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
+syn match ngxSSLProtocol 'TLSv1\.3' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
+
+" Do not enable highlighting of insecure protocols if sslecure is loaded
+if !exists('g:loaded_sslsecure')
+ syn keyword ngxSSLProtocolDeprecated SSLv2 SSLv3 contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
+else
+ syn match ngxSSLProtocol 'SSLv2' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
+ syn match ngxSSLProtocol 'SSLv3' contained nextgroup=ngxSSLProtocol,ngxSSLProtocolDeprecated skipwhite
+endif
+
+syn keyword ngxDirective ssl_session_cache
+syn keyword ngxDirective ssl_session_ticket_key
+syn keyword ngxDirective ssl_session_tickets nextgroup=ngxSSLSessionTicketsOn,ngxSSLSessionTicketsOff skipwhite
+syn keyword ngxSSLSessionTicketsOn on contained
+syn keyword ngxSSLSessionTicketsOff off contained
+syn keyword ngxDirective ssl_session_timeout
+syn keyword ngxDirective ssl_stapling
+syn keyword ngxDirective ssl_stapling_file
+syn keyword ngxDirective ssl_stapling_responder
+syn keyword ngxDirective ssl_stapling_verify
+syn keyword ngxDirective ssl_trusted_certificate
+syn keyword ngxDirective ssl_verify_client
+syn keyword ngxDirective ssl_verify_depth
+syn keyword ngxDirective starttls
+syn keyword ngxDirective state
+syn keyword ngxDirective status
+syn keyword ngxDirective status_format
+syn keyword ngxDirective status_zone
+syn keyword ngxDirective sticky contained
+syn keyword ngxDirective sticky_cookie_insert contained
+syn region ngxDirectiveSticky matchgroup=ngxDirective start=+^\s*\zssticky\ze\s.*;+ skip=+\\\\\|\\\;+ end=+;+he=e-1 contains=ngxCookieOptions,ngxString,ngxBoolean,ngxInteger,ngxTemplateVar
+syn keyword ngxDirective stub_status
+syn keyword ngxDirective sub_filter
+syn keyword ngxDirective sub_filter_last_modified
+syn keyword ngxDirective sub_filter_once
+syn keyword ngxDirective sub_filter_types
+syn keyword ngxDirective tcp_nodelay
+syn keyword ngxDirective tcp_nopush
+syn keyword ngxDirective thread_pool
+syn keyword ngxDirective thread_stack_size
+syn keyword ngxDirective timeout
+syn keyword ngxDirective timer_resolution
+syn keyword ngxDirective types_hash_bucket_size
+syn keyword ngxDirective types_hash_max_size
+syn keyword ngxDirective underscores_in_headers
+syn keyword ngxDirective uninitialized_variable_warn
+syn keyword ngxDirective upstream_conf
+syn keyword ngxDirective use
+syn keyword ngxDirective user
+syn keyword ngxDirective userid
+syn keyword ngxDirective userid_domain
+syn keyword ngxDirective userid_expires
+syn keyword ngxDirective userid_mark
+syn keyword ngxDirective userid_name
+syn keyword ngxDirective userid_p3p
+syn keyword ngxDirective userid_path
+syn keyword ngxDirective userid_service
+syn keyword ngxDirective uwsgi_bind
+syn keyword ngxDirective uwsgi_buffer_size
+syn keyword ngxDirective uwsgi_buffering
+syn keyword ngxDirective uwsgi_buffers
+syn keyword ngxDirective uwsgi_busy_buffers_size
+syn keyword ngxDirective uwsgi_cache
+syn keyword ngxDirective uwsgi_cache_background_update
+syn keyword ngxDirective uwsgi_cache_bypass
+syn keyword ngxDirective uwsgi_cache_key
+syn keyword ngxDirective uwsgi_cache_lock
+syn keyword ngxDirective uwsgi_cache_lock_age
+syn keyword ngxDirective uwsgi_cache_lock_timeout
+syn keyword ngxDirective uwsgi_cache_methods
+syn keyword ngxDirective uwsgi_cache_min_uses
+syn keyword ngxDirective uwsgi_cache_path
+syn keyword ngxDirective uwsgi_cache_purge
+syn keyword ngxDirective uwsgi_cache_revalidate
+syn keyword ngxDirective uwsgi_cache_use_stale
+syn keyword ngxDirective uwsgi_cache_valid
+syn keyword ngxDirective uwsgi_connect_timeout
+syn keyword ngxDirective uwsgi_force_ranges
+syn keyword ngxDirective uwsgi_hide_header
+syn keyword ngxDirective uwsgi_ignore_client_abort
+syn keyword ngxDirective uwsgi_ignore_headers
+syn keyword ngxDirective uwsgi_intercept_errors
+syn keyword ngxDirective uwsgi_limit_rate
+syn keyword ngxDirective uwsgi_max_temp_file_size
+syn keyword ngxDirective uwsgi_modifier1
+syn keyword ngxDirective uwsgi_modifier2
+syn keyword ngxDirective uwsgi_next_upstream
+syn keyword ngxDirective uwsgi_next_upstream_timeout
+syn keyword ngxDirective uwsgi_next_upstream_tries
+syn keyword ngxDirective uwsgi_no_cache
+syn keyword ngxDirective uwsgi_param
+syn keyword ngxDirective uwsgi_pass
+syn keyword ngxDirective uwsgi_pass_header
+syn keyword ngxDirective uwsgi_pass_request_body
+syn keyword ngxDirective uwsgi_pass_request_headers
+syn keyword ngxDirective uwsgi_read_timeout
+syn keyword ngxDirective uwsgi_request_buffering
+syn keyword ngxDirective uwsgi_send_timeout
+syn keyword ngxDirective uwsgi_ssl_certificate
+syn keyword ngxDirective uwsgi_ssl_certificate_key
+syn keyword ngxDirective uwsgi_ssl_ciphers
+syn keyword ngxDirective uwsgi_ssl_crl
+syn keyword ngxDirective uwsgi_ssl_name
+syn keyword ngxDirective uwsgi_ssl_password_file
+syn keyword ngxDirective uwsgi_ssl_protocols nextgroup=ngxSSLProtocol skipwhite
+syn keyword ngxDirective uwsgi_ssl_server_name
+syn keyword ngxDirective uwsgi_ssl_session_reuse
+syn keyword ngxDirective uwsgi_ssl_trusted_certificate
+syn keyword ngxDirective uwsgi_ssl_verify
+syn keyword ngxDirective uwsgi_ssl_verify_depth
+syn keyword ngxDirective uwsgi_store
+syn keyword ngxDirective uwsgi_store_access
+syn keyword ngxDirective uwsgi_string
+syn keyword ngxDirective uwsgi_temp_file_write_size
+syn keyword ngxDirective uwsgi_temp_path
+syn keyword ngxDirective valid_referers
+syn keyword ngxDirective variables_hash_bucket_size
+syn keyword ngxDirective variables_hash_max_size
+syn keyword ngxDirective worker_aio_requests
+syn keyword ngxDirective worker_connections
+syn keyword ngxDirective worker_cpu_affinity
+syn keyword ngxDirective worker_priority
+syn keyword ngxDirective worker_processes
+syn keyword ngxDirective worker_rlimit_core
+syn keyword ngxDirective worker_rlimit_nofile
+syn keyword ngxDirective worker_rlimit_sigpending
+syn keyword ngxDirective worker_threads
+syn keyword ngxDirective working_directory
+syn keyword ngxDirective xclient
+syn keyword ngxDirective xml_entities
+syn keyword ngxDirective xslt_last_modified
+syn keyword ngxDirective xslt_param
+syn keyword ngxDirective xslt_string_param
+syn keyword ngxDirective xslt_stylesheet
+syn keyword ngxDirective xslt_types
+syn keyword ngxDirective zone
+
+" Do not enable highlighting of insecure ciphers if sslecure is loaded
+if !exists('g:loaded_sslsecure')
+ " Mark insecure SSL Ciphers (Note: List might not not complete)
+ " Reference: https://www.openssl.org/docs/man1.0.2/apps/ciphers.html
+ syn match ngxSSLCipherInsecure '[^!]\zsSSLv3'
+ syn match ngxSSLCipherInsecure '[^!]\zsSSLv2'
+ syn match ngxSSLCipherInsecure '[^!]\zsHIGH'
+ syn match ngxSSLCipherInsecure '[^!]\zsMEDIUM'
+ syn match ngxSSLCipherInsecure '[^!]\zsLOW'
+ syn match ngxSSLCipherInsecure '[^!]\zsDEFAULT'
+ syn match ngxSSLCipherInsecure '[^!]\zsCOMPLEMENTOFDEFAULT'
+ syn match ngxSSLCipherInsecure '[^!]\zsALL'
+ syn match ngxSSLCipherInsecure '[^!]\zsCOMPLEMENTOFALL'
+
+ " SHA ciphers are only used in HMAC with all known OpenSSL/ LibreSSL cipher suites and MAC
+ " usage is still considered safe
+ " syn match ngxSSLCipherInsecure '[^!]\zsSHA\ze\D' " Match SHA1 without matching SHA256+
+ " syn match ngxSSLCipherInsecure '[^!]\zsSHA1'
+ syn match ngxSSLCipherInsecure '[^!]\zsMD5'
+ syn match ngxSSLCipherInsecure '[^!]\zsRC2'
+ syn match ngxSSLCipherInsecure '[^!]\zsRC4'
+ syn match ngxSSLCipherInsecure '[^!]\zs3DES'
+ syn match ngxSSLCipherInsecure '[^!3]\zsDES'
+ syn match ngxSSLCipherInsecure '[^!]\zsaDSS'
+ syn match ngxSSLCipherInsecure '[^!a]\zsDSS'
+ syn match ngxSSLCipherInsecure '[^!]\zsPSK'
+ syn match ngxSSLCipherInsecure '[^!]\zsIDEA'
+ syn match ngxSSLCipherInsecure '[^!]\zsSEED'
+ syn match ngxSSLCipherInsecure '[^!]\zsEXP\w*' " Match all EXPORT ciphers
+ syn match ngxSSLCipherInsecure '[^!]\zsaGOST\w*' " Match all GOST ciphers
+ syn match ngxSSLCipherInsecure '[^!]\zskGOST\w*'
+ syn match ngxSSLCipherInsecure '[^!ak]\zsGOST\w*'
+ syn match ngxSSLCipherInsecure '[^!]\zs[kae]\?FZA' " Not implemented
+ syn match ngxSSLCipherInsecure '[^!]\zsECB'
+ syn match ngxSSLCipherInsecure '[^!]\zs[aes]NULL'
+
+ " Anonymous cipher suites should never be used
+ syn match ngxSSLCipherInsecure '[^!ECa]\zsDH\ze[^E]' " Try to match DH without DHE, EDH, EECDH, etc.
+ syn match ngxSSLCipherInsecure '[^!EA]\zsECDH\ze[^E]' " Do not match EECDH, ECDHE
+ syn match ngxSSLCipherInsecure '[^!]\zsADH'
+ syn match ngxSSLCipherInsecure '[^!]\zskDHE'
+ syn match ngxSSLCipherInsecure '[^!]\zskEDH'
+ syn match ngxSSLCipherInsecure '[^!]\zskECDHE'
+ syn match ngxSSLCipherInsecure '[^!]\zskEECDH'
+ syn match ngxSSLCipherInsecure '[^!E]\zsAECDH'
+endif
+
+syn keyword ngxProxyNextUpstreamOptions error contained
+syn keyword ngxProxyNextUpstreamOptions timeout contained
+syn keyword ngxProxyNextUpstreamOptions invalid_header contained
+syn keyword ngxProxyNextUpstreamOptions http_500 contained
+syn keyword ngxProxyNextUpstreamOptions http_502 contained
+syn keyword ngxProxyNextUpstreamOptions http_503 contained
+syn keyword ngxProxyNextUpstreamOptions http_504 contained
+syn keyword ngxProxyNextUpstreamOptions http_403 contained
+syn keyword ngxProxyNextUpstreamOptions http_404 contained
+syn keyword ngxProxyNextUpstreamOptions http_429 contained
+syn keyword ngxProxyNextUpstreamOptions non_idempotent contained
+syn keyword ngxProxyNextUpstreamOptions off contained
+
+syn keyword ngxStickyOptions cookie contained
+syn region ngxStickyOptionsCookie matchgroup=ngxStickyOptions start=+^\s*\zssticky\s\s*cookie\ze\s.*;+ skip=+\\\\\|\\\;+ end=+;+he=e-1 contains=ngxCookieOptions,ngxString,ngxBoolean,ngxInteger,ngxTemplateVar
+syn keyword ngxStickyOptions route contained
+syn keyword ngxStickyOptions learn contained
+
+syn keyword ngxCookieOptions expires contained
+syn keyword ngxCookieOptions domain contained
+syn keyword ngxCookieOptions httponly contained
+syn keyword ngxCookieOptions secure contained
+syn keyword ngxCookieOptions path contained
+
+" 3rd party module list:
+" https://www.nginx.com/resources/wiki/modules/
+
+" Accept Language Module <https://www.nginx.com/resources/wiki/modules/accept_language/>
+" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales.
+syn keyword ngxDirectiveThirdParty set_from_accept_language
+
+" Access Key Module (DEPRECATED) <http://wiki.nginx.org/NginxHttpAccessKeyModule>
+" Denies access unless the request URL contains an access key.
+syn keyword ngxDirectiveDeprecated accesskey
+syn keyword ngxDirectiveDeprecated accesskey_arg
+syn keyword ngxDirectiveDeprecated accesskey_hashmethod
+syn keyword ngxDirectiveDeprecated accesskey_signature
+
+" Asynchronous FastCGI Module <https://github.com/rsms/afcgi>
+" Primarily a modified version of the Nginx FastCGI module which implements multiplexing of connections, allowing a single FastCGI server to handle many concurrent requests.
+" syn keyword ngxDirectiveThirdParty fastcgi_bind
+" syn keyword ngxDirectiveThirdParty fastcgi_buffer_size
+" syn keyword ngxDirectiveThirdParty fastcgi_buffers
+" syn keyword ngxDirectiveThirdParty fastcgi_busy_buffers_size
+" syn keyword ngxDirectiveThirdParty fastcgi_cache
+" syn keyword ngxDirectiveThirdParty fastcgi_cache_key
+" syn keyword ngxDirectiveThirdParty fastcgi_cache_methods
+" syn keyword ngxDirectiveThirdParty fastcgi_cache_min_uses
+" syn keyword ngxDirectiveThirdParty fastcgi_cache_path
+" syn keyword ngxDirectiveThirdParty fastcgi_cache_use_stale
+" syn keyword ngxDirectiveThirdParty fastcgi_cache_valid
+" syn keyword ngxDirectiveThirdParty fastcgi_catch_stderr
+" syn keyword ngxDirectiveThirdParty fastcgi_connect_timeout
+" syn keyword ngxDirectiveThirdParty fastcgi_hide_header
+" syn keyword ngxDirectiveThirdParty fastcgi_ignore_client_abort
+" syn keyword ngxDirectiveThirdParty fastcgi_ignore_headers
+" syn keyword ngxDirectiveThirdParty fastcgi_index
+" syn keyword ngxDirectiveThirdParty fastcgi_intercept_errors
+" syn keyword ngxDirectiveThirdParty fastcgi_max_temp_file_size
+" syn keyword ngxDirectiveThirdParty fastcgi_next_upstream
+" syn keyword ngxDirectiveThirdParty fastcgi_param
+" syn keyword ngxDirectiveThirdParty fastcgi_pass
+" syn keyword ngxDirectiveThirdParty fastcgi_pass_header
+" syn keyword ngxDirectiveThirdParty fastcgi_pass_request_body
+" syn keyword ngxDirectiveThirdParty fastcgi_pass_request_headers
+" syn keyword ngxDirectiveThirdParty fastcgi_read_timeout
+" syn keyword ngxDirectiveThirdParty fastcgi_send_lowat
+" syn keyword ngxDirectiveThirdParty fastcgi_send_timeout
+" syn keyword ngxDirectiveThirdParty fastcgi_split_path_info
+" syn keyword ngxDirectiveThirdParty fastcgi_store
+" syn keyword ngxDirectiveThirdParty fastcgi_store_access
+" syn keyword ngxDirectiveThirdParty fastcgi_temp_file_write_size
+" syn keyword ngxDirectiveThirdParty fastcgi_temp_path
+syn keyword ngxDirectiveDeprecated fastcgi_upstream_fail_timeout
+syn keyword ngxDirectiveDeprecated fastcgi_upstream_max_fails
+
+" Akamai G2O Module <https://github.com/kaltura/nginx_mod_akamai_g2o>
+" Nginx Module for Authenticating Akamai G2O requests
+syn keyword ngxDirectiveThirdParty g2o
+syn keyword ngxDirectiveThirdParty g2o_nonce
+syn keyword ngxDirectiveThirdParty g2o_key
+
+" Lua Module <https://github.com/alacner/nginx_lua_module>
+" You can be very simple to execute lua code for nginx
+syn keyword ngxDirectiveThirdParty lua_file
+
+" Array Variable Module <https://github.com/openresty/array-var-nginx-module>
+" Add support for array-typed variables to nginx config files
+syn keyword ngxDirectiveThirdParty array_split
+syn keyword ngxDirectiveThirdParty array_join
+syn keyword ngxDirectiveThirdParty array_map
+syn keyword ngxDirectiveThirdParty array_map_op
+
+" Nginx Audio Track for HTTP Live Streaming <https://github.com/flavioribeiro/nginx-audio-track-for-hls-module>
+" This nginx module generates audio track for hls streams on the fly.
+syn keyword ngxDirectiveThirdParty ngx_hls_audio_track
+syn keyword ngxDirectiveThirdParty ngx_hls_audio_track_rootpath
+syn keyword ngxDirectiveThirdParty ngx_hls_audio_track_output_format
+syn keyword ngxDirectiveThirdParty ngx_hls_audio_track_output_header
+
+" AWS Proxy Module <https://github.com/anomalizer/ngx_aws_auth>
+" Nginx module to proxy to authenticated AWS services
+syn keyword ngxDirectiveThirdParty aws_access_key
+syn keyword ngxDirectiveThirdParty aws_key_scope
+syn keyword ngxDirectiveThirdParty aws_signing_key
+syn keyword ngxDirectiveThirdParty aws_endpoint
+syn keyword ngxDirectiveThirdParty aws_s3_bucket
+syn keyword ngxDirectiveThirdParty aws_sign
+
+" Backtrace module <https://github.com/alibaba/nginx-backtrace>
+" A Nginx module to dump backtrace when a worker process exits abnormally
+syn keyword ngxDirectiveThirdParty backtrace_log
+syn keyword ngxDirectiveThirdParty backtrace_max_stack_size
+
+" Brotli Module <https://github.com/google/ngx_brotli>
+" Nginx module for Brotli compression
+syn keyword ngxDirectiveThirdParty brotli_static
+syn keyword ngxDirectiveThirdParty brotli
+syn keyword ngxDirectiveThirdParty brotli_types
+syn keyword ngxDirectiveThirdParty brotli_buffers
+syn keyword ngxDirectiveThirdParty brotli_comp_level
+syn keyword ngxDirectiveThirdParty brotli_window
+syn keyword ngxDirectiveThirdParty brotli_min_length
+
+" Cache Purge Module <https://github.com/FRiCKLE/ngx_cache_purge>
+" Adds ability to purge content from FastCGI, proxy, SCGI and uWSGI caches.
+syn keyword ngxDirectiveThirdParty fastcgi_cache_purge
+syn keyword ngxDirectiveThirdParty proxy_cache_purge
+" syn keyword ngxDirectiveThirdParty scgi_cache_purge
+" syn keyword ngxDirectiveThirdParty uwsgi_cache_purge
+
+" Chunkin Module (DEPRECATED) <http://wiki.nginx.org/NginxHttpChunkinModule>
+" HTTP 1.1 chunked-encoding request body support for Nginx.
+syn keyword ngxDirectiveDeprecated chunkin
+syn keyword ngxDirectiveDeprecated chunkin_keepalive
+syn keyword ngxDirectiveDeprecated chunkin_max_chunks_per_buf
+syn keyword ngxDirectiveDeprecated chunkin_resume
+
+" Circle GIF Module <https://github.com/evanmiller/nginx_circle_gif>
+" Generates simple circle images with the colors and size specified in the URL.
+syn keyword ngxDirectiveThirdParty circle_gif
+syn keyword ngxDirectiveThirdParty circle_gif_max_radius
+syn keyword ngxDirectiveThirdParty circle_gif_min_radius
+syn keyword ngxDirectiveThirdParty circle_gif_step_radius
+
+" Nginx-Clojure Module <http://nginx-clojure.github.io/index.html>
+" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales.
+syn keyword ngxDirectiveThirdParty jvm_path
+syn keyword ngxDirectiveThirdParty jvm_var
+syn keyword ngxDirectiveThirdParty jvm_classpath
+syn keyword ngxDirectiveThirdParty jvm_classpath_check
+syn keyword ngxDirectiveThirdParty jvm_workers
+syn keyword ngxDirectiveThirdParty jvm_options
+syn keyword ngxDirectiveThirdParty jvm_handler_type
+syn keyword ngxDirectiveThirdParty jvm_init_handler_name
+syn keyword ngxDirectiveThirdParty jvm_init_handler_code
+syn keyword ngxDirectiveThirdParty jvm_exit_handler_name
+syn keyword ngxDirectiveThirdParty jvm_exit_handler_code
+syn keyword ngxDirectiveThirdParty handlers_lazy_init
+syn keyword ngxDirectiveThirdParty auto_upgrade_ws
+syn keyword ngxDirectiveThirdParty content_handler_type
+syn keyword ngxDirectiveThirdParty content_handler_name
+syn keyword ngxDirectiveThirdParty content_handler_code
+syn keyword ngxDirectiveThirdParty rewrite_handler_type
+syn keyword ngxDirectiveThirdParty rewrite_handler_name
+syn keyword ngxDirectiveThirdParty rewrite_handler_code
+syn keyword ngxDirectiveThirdParty access_handler_type
+syn keyword ngxDirectiveThirdParty access_handler_name
+syn keyword ngxDirectiveThirdParty access_handler_code
+syn keyword ngxDirectiveThirdParty header_filter_type
+syn keyword ngxDirectiveThirdParty header_filter_name
+syn keyword ngxDirectiveThirdParty header_filter_code
+syn keyword ngxDirectiveThirdParty content_handler_property
+syn keyword ngxDirectiveThirdParty rewrite_handler_property
+syn keyword ngxDirectiveThirdParty access_handler_property
+syn keyword ngxDirectiveThirdParty header_filter_property
+syn keyword ngxDirectiveThirdParty always_read_body
+syn keyword ngxDirectiveThirdParty shared_map
+syn keyword ngxDirectiveThirdParty write_page_size
+
+" Upstream Consistent Hash <https://www.nginx.com/resources/wiki/modules/consistent_hash/>
+" A load balancer that uses an internal consistent hash ring to select the right backend node.
+syn keyword ngxDirectiveThirdParty consistent_hash
+
+" Nginx Development Kit <https://github.com/simpl/ngx_devel_kit>
+" The NDK is an Nginx module that is designed to extend the core functionality of the excellent Nginx webserver in a way that can be used as a basis of other Nginx modules.
+" NDK_UPSTREAM_LIST
+" This submodule provides a directive that creates a list of upstreams, with optional weighting. This list can then be used by other modules to hash over the upstreams however they choose.
+syn keyword ngxDirectiveThirdParty upstream_list
+
+" Drizzle Module <https://www.nginx.com/resources/wiki/modules/drizzle/>
+" Upstream module for talking to MySQL and Drizzle directly
+syn keyword ngxDirectiveThirdParty drizzle_server
+syn keyword ngxDirectiveThirdParty drizzle_keepalive
+syn keyword ngxDirectiveThirdParty drizzle_query
+syn keyword ngxDirectiveThirdParty drizzle_pass
+syn keyword ngxDirectiveThirdParty drizzle_connect_timeout
+syn keyword ngxDirectiveThirdParty drizzle_send_query_timeout
+syn keyword ngxDirectiveThirdParty drizzle_recv_cols_timeout
+syn keyword ngxDirectiveThirdParty drizzle_recv_rows_timeout
+syn keyword ngxDirectiveThirdParty drizzle_buffer_size
+syn keyword ngxDirectiveThirdParty drizzle_module_header
+syn keyword ngxDirectiveThirdParty drizzle_status
+
+" Dynamic ETags Module <https://github.com/kali/nginx-dynamic-etags>
+" Attempt at handling ETag / If-None-Match on proxied content.
+syn keyword ngxDirectiveThirdParty dynamic_etags
+
+" Echo Module <https://www.nginx.com/resources/wiki/modules/echo/>
+" Bringing the power of "echo", "sleep", "time" and more to Nginx's config file
+syn keyword ngxDirectiveThirdParty echo
+syn keyword ngxDirectiveThirdParty echo_duplicate
+syn keyword ngxDirectiveThirdParty echo_flush
+syn keyword ngxDirectiveThirdParty echo_sleep
+syn keyword ngxDirectiveThirdParty echo_blocking_sleep
+syn keyword ngxDirectiveThirdParty echo_reset_timer
+syn keyword ngxDirectiveThirdParty echo_read_request_body
+syn keyword ngxDirectiveThirdParty echo_location_async
+syn keyword ngxDirectiveThirdParty echo_location
+syn keyword ngxDirectiveThirdParty echo_subrequest_async
+syn keyword ngxDirectiveThirdParty echo_subrequest
+syn keyword ngxDirectiveThirdParty echo_foreach_split
+syn keyword ngxDirectiveThirdParty echo_end
+syn keyword ngxDirectiveThirdParty echo_request_body
+syn keyword ngxDirectiveThirdParty echo_exec
+syn keyword ngxDirectiveThirdParty echo_status
+syn keyword ngxDirectiveThirdParty echo_before_body
+syn keyword ngxDirectiveThirdParty echo_after_body
+
+" Encrypted Session Module <https://github.com/openresty/encrypted-session-nginx-module>
+" Encrypt and decrypt nginx variable values
+syn keyword ngxDirectiveThirdParty encrypted_session_key
+syn keyword ngxDirectiveThirdParty encrypted_session_iv
+syn keyword ngxDirectiveThirdParty encrypted_session_expires
+syn keyword ngxDirectiveThirdParty set_encrypt_session
+syn keyword ngxDirectiveThirdParty set_decrypt_session
+
+" Enhanced Memcached Module <https://github.com/bpaquet/ngx_http_enhanced_memcached_module>
+" This module is based on the standard Nginx Memcached module, with some additonal features
+syn keyword ngxDirectiveThirdParty enhanced_memcached_pass
+syn keyword ngxDirectiveThirdParty enhanced_memcached_hash_keys_with_md5
+syn keyword ngxDirectiveThirdParty enhanced_memcached_allow_put
+syn keyword ngxDirectiveThirdParty enhanced_memcached_allow_delete
+syn keyword ngxDirectiveThirdParty enhanced_memcached_stats
+syn keyword ngxDirectiveThirdParty enhanced_memcached_flush
+syn keyword ngxDirectiveThirdParty enhanced_memcached_flush_namespace
+syn keyword ngxDirectiveThirdParty enhanced_memcached_bind
+syn keyword ngxDirectiveThirdParty enhanced_memcached_connect_timeout
+syn keyword ngxDirectiveThirdParty enhanced_memcached_send_timeout
+syn keyword ngxDirectiveThirdParty enhanced_memcached_buffer_size
+syn keyword ngxDirectiveThirdParty enhanced_memcached_read_timeout
+
+" Events Module (DEPRECATED) <http://docs.dutov.org/nginx_modules_events_en.html>
+" Provides options for start/stop events.
+syn keyword ngxDirectiveDeprecated on_start
+syn keyword ngxDirectiveDeprecated on_stop
+
+" EY Balancer Module <https://github.com/ezmobius/nginx-ey-balancer>
+" Adds a request queue to Nginx that allows the limiting of concurrent requests passed to the upstream.
+syn keyword ngxDirectiveThirdParty max_connections
+syn keyword ngxDirectiveThirdParty max_connections_max_queue_length
+syn keyword ngxDirectiveThirdParty max_connections_queue_timeout
+
+" Upstream Fair Balancer <https://www.nginx.com/resources/wiki/modules/fair_balancer/>
+" Sends an incoming request to the least-busy backend server, rather than distributing requests round-robin.
+syn keyword ngxDirectiveThirdParty fair
+syn keyword ngxDirectiveThirdParty upstream_fair_shm_size
+
+" Fancy Indexes Module <https://github.com/aperezdc/ngx-fancyindex>
+" Like the built-in autoindex module, but fancier.
+syn keyword ngxDirectiveThirdParty fancyindex
+syn keyword ngxDirectiveThirdParty fancyindex_default_sort
+syn keyword ngxDirectiveThirdParty fancyindex_directories_first
+syn keyword ngxDirectiveThirdParty fancyindex_css_href
+syn keyword ngxDirectiveThirdParty fancyindex_exact_size
+syn keyword ngxDirectiveThirdParty fancyindex_name_length
+syn keyword ngxDirectiveThirdParty fancyindex_footer
+syn keyword ngxDirectiveThirdParty fancyindex_header
+syn keyword ngxDirectiveThirdParty fancyindex_show_path
+syn keyword ngxDirectiveThirdParty fancyindex_ignore
+syn keyword ngxDirectiveThirdParty fancyindex_hide_symlinks
+syn keyword ngxDirectiveThirdParty fancyindex_localtime
+syn keyword ngxDirectiveThirdParty fancyindex_time_format
+
+" Form Auth Module <https://github.com/veruu/ngx_form_auth>
+" Provides authentication and authorization with credentials submitted via POST request
+syn keyword ngxDirectiveThirdParty form_auth
+syn keyword ngxDirectiveThirdParty form_auth_pam_service
+syn keyword ngxDirectiveThirdParty form_auth_login
+syn keyword ngxDirectiveThirdParty form_auth_password
+syn keyword ngxDirectiveThirdParty form_auth_remote_user
+
+" Form Input Module <https://github.com/calio/form-input-nginx-module>
+" Reads HTTP POST and PUT request body encoded in "application/x-www-form-urlencoded" and parses the arguments into nginx variables.
+syn keyword ngxDirectiveThirdParty set_form_input
+syn keyword ngxDirectiveThirdParty set_form_input_multi
+
+" GeoIP Module (DEPRECATED) <http://wiki.nginx.org/NginxHttp3rdPartyGeoIPModule>
+" Country code lookups via the MaxMind GeoIP API.
+syn keyword ngxDirectiveDeprecated geoip_country_file
+
+" GeoIP 2 Module <https://github.com/leev/ngx_http_geoip2_module>
+" Creates variables with values from the maxmind geoip2 databases based on the client IP
+syn keyword ngxDirectiveThirdParty geoip2
+
+" GridFS Module <https://github.com/mdirolf/nginx-gridfs>
+" Nginx module for serving files from MongoDB's GridFS
+syn keyword ngxDirectiveThirdParty gridfs
+
+" Headers More Module <https://github.com/openresty/headers-more-nginx-module>
+" Set and clear input and output headers...more than "add"!
+syn keyword ngxDirectiveThirdParty more_clear_headers
+syn keyword ngxDirectiveThirdParty more_clear_input_headers
+syn keyword ngxDirectiveThirdParty more_set_headers
+syn keyword ngxDirectiveThirdParty more_set_input_headers
+
+" Health Checks Upstreams Module <https://www.nginx.com/resources/wiki/modules/healthcheck/>
+" Polls backends and if they respond with HTTP 200 + an optional request body, they are marked good. Otherwise, they are marked bad.
+syn keyword ngxDirectiveThirdParty healthcheck_enabled
+syn keyword ngxDirectiveThirdParty healthcheck_delay
+syn keyword ngxDirectiveThirdParty healthcheck_timeout
+syn keyword ngxDirectiveThirdParty healthcheck_failcount
+syn keyword ngxDirectiveThirdParty healthcheck_send
+syn keyword ngxDirectiveThirdParty healthcheck_expected
+syn keyword ngxDirectiveThirdParty healthcheck_buffer
+syn keyword ngxDirectiveThirdParty healthcheck_status
+
+" HTTP Accounting Module <https://github.com/Lax/ngx_http_accounting_module>
+" Add traffic stat function to nginx. Useful for http accounting based on nginx configuration logic
+syn keyword ngxDirectiveThirdParty http_accounting
+syn keyword ngxDirectiveThirdParty http_accounting_log
+syn keyword ngxDirectiveThirdParty http_accounting_id
+syn keyword ngxDirectiveThirdParty http_accounting_interval
+syn keyword ngxDirectiveThirdParty http_accounting_perturb
+
+" Nginx Digest Authentication module <https://github.com/atomx/nginx-http-auth-digest>
+" Digest Authentication for Nginx
+syn keyword ngxDirectiveThirdParty auth_digest
+syn keyword ngxDirectiveThirdParty auth_digest_user_file
+syn keyword ngxDirectiveThirdParty auth_digest_timeout
+syn keyword ngxDirectiveThirdParty auth_digest_expires
+syn keyword ngxDirectiveThirdParty auth_digest_replays
+syn keyword ngxDirectiveThirdParty auth_digest_shm_size
+
+" Auth PAM Module <https://github.com/sto/ngx_http_auth_pam_module>
+" HTTP Basic Authentication using PAM.
+syn keyword ngxDirectiveThirdParty auth_pam
+syn keyword ngxDirectiveThirdParty auth_pam_service_name
+
+" HTTP Auth Request Module <http://nginx.org/en/docs/http/ngx_http_auth_request_module.html>
+" Implements client authorization based on the result of a subrequest
+" syn keyword ngxDirectiveThirdParty auth_request
+" syn keyword ngxDirectiveThirdParty auth_request_set
+
+" HTTP Concatenation module for Nginx <https://github.com/alibaba/nginx-http-concat>
+" A Nginx module for concatenating files in a given context: CSS and JS files usually
+syn keyword ngxDirectiveThirdParty concat
+syn keyword ngxDirectiveThirdParty concat_types
+syn keyword ngxDirectiveThirdParty concat_unique
+syn keyword ngxDirectiveThirdParty concat_max_files
+syn keyword ngxDirectiveThirdParty concat_delimiter
+syn keyword ngxDirectiveThirdParty concat_ignore_file_error
+
+" HTTP Dynamic Upstream Module <https://github.com/yzprofile/ngx_http_dyups_module>
+" Update upstreams' config by restful interface
+syn keyword ngxDirectiveThirdParty dyups_interface
+syn keyword ngxDirectiveThirdParty dyups_read_msg_timeout
+syn keyword ngxDirectiveThirdParty dyups_shm_zone_size
+syn keyword ngxDirectiveThirdParty dyups_upstream_conf
+syn keyword ngxDirectiveThirdParty dyups_trylock
+
+" HTTP Footer If Filter Module <https://github.com/flygoast/ngx_http_footer_if_filter>
+" The ngx_http_footer_if_filter_module is used to add given content to the end of the response according to the condition specified.
+syn keyword ngxDirectiveThirdParty footer_if
+
+" HTTP Footer Filter Module <https://github.com/alibaba/nginx-http-footer-filter>
+" This module implements a body filter that adds a given string to the page footer.
+syn keyword ngxDirectiveThirdParty footer
+syn keyword ngxDirectiveThirdParty footer_types
+
+" HTTP Internal Redirect Module <https://github.com/flygoast/ngx_http_internal_redirect>
+" Make an internal redirect to the uri specified according to the condition specified.
+syn keyword ngxDirectiveThirdParty internal_redirect_if
+syn keyword ngxDirectiveThirdParty internal_redirect_if_no_postponed
+
+" HTTP JavaScript Module <https://github.com/peter-leonov/ngx_http_js_module>
+" Embedding SpiderMonkey. Nearly full port on Perl module.
+syn keyword ngxDirectiveThirdParty js
+syn keyword ngxDirectiveThirdParty js_filter
+syn keyword ngxDirectiveThirdParty js_filter_types
+syn keyword ngxDirectiveThirdParty js_load
+syn keyword ngxDirectiveThirdParty js_maxmem
+syn keyword ngxDirectiveThirdParty js_require
+syn keyword ngxDirectiveThirdParty js_set
+syn keyword ngxDirectiveThirdParty js_utf8
+
+" HTTP Push Module (DEPRECATED) <http://pushmodule.slact.net/>
+" Turn Nginx into an adept long-polling HTTP Push (Comet) server.
+syn keyword ngxDirectiveDeprecated push_buffer_size
+syn keyword ngxDirectiveDeprecated push_listener
+syn keyword ngxDirectiveDeprecated push_message_timeout
+syn keyword ngxDirectiveDeprecated push_queue_messages
+syn keyword ngxDirectiveDeprecated push_sender
+
+" HTTP Redis Module <https://www.nginx.com/resources/wiki/modules/redis/>
+" Redis <http://code.google.com/p/redis/> support.
+syn keyword ngxDirectiveThirdParty redis_bind
+syn keyword ngxDirectiveThirdParty redis_buffer_size
+syn keyword ngxDirectiveThirdParty redis_connect_timeout
+syn keyword ngxDirectiveThirdParty redis_next_upstream
+syn keyword ngxDirectiveThirdParty redis_pass
+syn keyword ngxDirectiveThirdParty redis_read_timeout
+syn keyword ngxDirectiveThirdParty redis_send_timeout
+
+" Iconv Module <https://github.com/calio/iconv-nginx-module>
+" A character conversion nginx module using libiconv
+syn keyword ngxDirectiveThirdParty set_iconv
+syn keyword ngxDirectiveThirdParty iconv_buffer_size
+syn keyword ngxDirectiveThirdParty iconv_filter
+
+" IP Blocker Module <https://github.com/tmthrgd/nginx-ip-blocker>
+" An efficient shared memory IP blocking system for nginx.
+syn keyword ngxDirectiveThirdParty ip_blocker
+
+" IP2Location Module <https://github.com/chrislim2888/ip2location-nginx>
+" Allows user to lookup for geolocation information using IP2Location database
+syn keyword ngxDirectiveThirdParty ip2location_database
+
+" JS Module <https://github.com/peter-leonov/ngx_http_js_module>
+" Reflect the nginx functionality in JS
+syn keyword ngxDirectiveThirdParty js
+syn keyword ngxDirectiveThirdParty js_access
+syn keyword ngxDirectiveThirdParty js_load
+syn keyword ngxDirectiveThirdParty js_set
+
+" Limit Upload Rate Module <https://github.com/cfsego/limit_upload_rate>
+" Limit client-upload rate when they are sending request bodies to you
+syn keyword ngxDirectiveThirdParty limit_upload_rate
+syn keyword ngxDirectiveThirdParty limit_upload_rate_after
+
+" Limit Upstream Module <https://github.com/cfsego/nginx-limit-upstream>
+" Limit the number of connections to upstream for NGINX
+syn keyword ngxDirectiveThirdParty limit_upstream_zone
+syn keyword ngxDirectiveThirdParty limit_upstream_conn
+syn keyword ngxDirectiveThirdParty limit_upstream_log_level
+
+" Log If Module <https://github.com/cfsego/ngx_log_if>
+" Conditional accesslog for nginx
+syn keyword ngxDirectiveThirdParty access_log_bypass_if
+
+" Log Request Speed (DEPRECATED) <http://wiki.nginx.org/NginxHttpLogRequestSpeed>
+" Log the time it took to process each request.
+syn keyword ngxDirectiveDeprecated log_request_speed_filter
+syn keyword ngxDirectiveDeprecated log_request_speed_filter_timeout
+
+" Log ZeroMQ Module <https://github.com/alticelabs/nginx-log-zmq>
+" ZeroMQ logger module for nginx
+syn keyword ngxDirectiveThirdParty log_zmq_server
+syn keyword ngxDirectiveThirdParty log_zmq_endpoint
+syn keyword ngxDirectiveThirdParty log_zmq_format
+syn keyword ngxDirectiveThirdParty log_zmq_off
+
+" Lower/UpperCase Module <https://github.com/replay/ngx_http_lower_upper_case>
+" This module simply uppercases or lowercases a string and saves it into a new variable.
+syn keyword ngxDirectiveThirdParty lower
+syn keyword ngxDirectiveThirdParty upper
+
+" Lua Upstream Module <https://github.com/openresty/lua-upstream-nginx-module>
+" Nginx C module to expose Lua API to ngx_lua for Nginx upstreams
+
+" Lua Module <https://github.com/openresty/lua-nginx-module>
+" Embed the Power of Lua into NGINX HTTP servers
+syn keyword ngxDirectiveThirdParty lua_use_default_type
+syn keyword ngxDirectiveThirdParty lua_malloc_trim
+syn keyword ngxDirectiveThirdParty lua_code_cache
+syn keyword ngxDirectiveThirdParty lua_regex_cache_max_entries
+syn keyword ngxDirectiveThirdParty lua_regex_match_limit
+syn keyword ngxDirectiveThirdParty lua_package_path
+syn keyword ngxDirectiveThirdParty lua_package_cpath
+syn keyword ngxDirectiveThirdParty init_by_lua
+syn keyword ngxDirectiveThirdParty init_by_lua_file
+syn keyword ngxDirectiveThirdParty init_worker_by_lua
+syn keyword ngxDirectiveThirdParty init_worker_by_lua_file
+syn keyword ngxDirectiveThirdParty set_by_lua
+syn keyword ngxDirectiveThirdParty set_by_lua_file
+syn keyword ngxDirectiveThirdParty content_by_lua
+syn keyword ngxDirectiveThirdParty content_by_lua_file
+syn keyword ngxDirectiveThirdParty rewrite_by_lua
+syn keyword ngxDirectiveThirdParty rewrite_by_lua_file
+syn keyword ngxDirectiveThirdParty access_by_lua
+syn keyword ngxDirectiveThirdParty access_by_lua_file
+syn keyword ngxDirectiveThirdParty header_filter_by_lua
+syn keyword ngxDirectiveThirdParty header_filter_by_lua_file
+syn keyword ngxDirectiveThirdParty body_filter_by_lua
+syn keyword ngxDirectiveThirdParty body_filter_by_lua_file
+syn keyword ngxDirectiveThirdParty log_by_lua
+syn keyword ngxDirectiveThirdParty log_by_lua_file
+syn keyword ngxDirectiveThirdParty balancer_by_lua_file
+syn keyword ngxDirectiveThirdParty lua_need_request_body
+syn keyword ngxDirectiveThirdParty ssl_certificate_by_lua_file
+syn keyword ngxDirectiveThirdParty ssl_session_fetch_by_lua_file
+syn keyword ngxDirectiveThirdParty ssl_session_store_by_lua_file
+syn keyword ngxDirectiveThirdParty lua_shared_dict
+syn keyword ngxDirectiveThirdParty lua_socket_connect_timeout
+syn keyword ngxDirectiveThirdParty lua_socket_send_timeout
+syn keyword ngxDirectiveThirdParty lua_socket_send_lowat
+syn keyword ngxDirectiveThirdParty lua_socket_read_timeout
+syn keyword ngxDirectiveThirdParty lua_socket_buffer_size
+syn keyword ngxDirectiveThirdParty lua_socket_pool_size
+syn keyword ngxDirectiveThirdParty lua_socket_keepalive_timeout
+syn keyword ngxDirectiveThirdParty lua_socket_log_errors
+syn keyword ngxDirectiveThirdParty lua_ssl_ciphers
+syn keyword ngxDirectiveThirdParty lua_ssl_crl
+syn keyword ngxDirectiveThirdParty lua_ssl_protocols
+syn keyword ngxDirectiveThirdParty lua_ssl_trusted_certificate
+syn keyword ngxDirectiveThirdParty lua_ssl_verify_depth
+syn keyword ngxDirectiveThirdParty lua_http10_buffering
+syn keyword ngxDirectiveThirdParty rewrite_by_lua_no_postpone
+syn keyword ngxDirectiveThirdParty access_by_lua_no_postpone
+syn keyword ngxDirectiveThirdParty lua_transform_underscores_in_response_headers
+syn keyword ngxDirectiveThirdParty lua_check_client_abort
+syn keyword ngxDirectiveThirdParty lua_max_pending_timers
+syn keyword ngxDirectiveThirdParty lua_max_running_timers
+
+" MD5 Filter Module <https://github.com/kainswor/nginx_md5_filter>
+" A content filter for nginx, which returns the md5 hash of the content otherwise returned.
+syn keyword ngxDirectiveThirdParty md5_filter
+
+" Memc Module <https://github.com/openresty/memc-nginx-module>
+" An extended version of the standard memcached module that supports set, add, delete, and many more memcached commands.
+syn keyword ngxDirectiveThirdParty memc_buffer_size
+syn keyword ngxDirectiveThirdParty memc_cmds_allowed
+syn keyword ngxDirectiveThirdParty memc_connect_timeout
+syn keyword ngxDirectiveThirdParty memc_flags_to_last_modified
+syn keyword ngxDirectiveThirdParty memc_next_upstream
+syn keyword ngxDirectiveThirdParty memc_pass
+syn keyword ngxDirectiveThirdParty memc_read_timeout
+syn keyword ngxDirectiveThirdParty memc_send_timeout
+syn keyword ngxDirectiveThirdParty memc_upstream_fail_timeout
+syn keyword ngxDirectiveThirdParty memc_upstream_max_fails
+
+" Mod Security Module <https://github.com/SpiderLabs/ModSecurity>
+" ModSecurity is an open source, cross platform web application firewall (WAF) engine
+syn keyword ngxDirectiveThirdParty ModSecurityConfig
+syn keyword ngxDirectiveThirdParty ModSecurityEnabled
+syn keyword ngxDirectiveThirdParty pool_context
+syn keyword ngxDirectiveThirdParty pool_context_hash_size
+
+" Mogilefs Module <http://www.grid.net.ru/nginx/mogilefs.en.html>
+" MogileFS client for nginx web server.
+syn keyword ngxDirectiveThirdParty mogilefs_pass
+syn keyword ngxDirectiveThirdParty mogilefs_methods
+syn keyword ngxDirectiveThirdParty mogilefs_domain
+syn keyword ngxDirectiveThirdParty mogilefs_class
+syn keyword ngxDirectiveThirdParty mogilefs_tracker
+syn keyword ngxDirectiveThirdParty mogilefs_noverify
+syn keyword ngxDirectiveThirdParty mogilefs_connect_timeout
+syn keyword ngxDirectiveThirdParty mogilefs_send_timeout
+syn keyword ngxDirectiveThirdParty mogilefs_read_timeout
+
+" Mongo Module <https://github.com/simpl/ngx_mongo>
+" Upstream module that allows nginx to communicate directly with MongoDB database.
+syn keyword ngxDirectiveThirdParty mongo_auth
+syn keyword ngxDirectiveThirdParty mongo_pass
+syn keyword ngxDirectiveThirdParty mongo_query
+syn keyword ngxDirectiveThirdParty mongo_json
+syn keyword ngxDirectiveThirdParty mongo_bind
+syn keyword ngxDirectiveThirdParty mongo_connect_timeout
+syn keyword ngxDirectiveThirdParty mongo_send_timeout
+syn keyword ngxDirectiveThirdParty mongo_read_timeout
+syn keyword ngxDirectiveThirdParty mongo_buffering
+syn keyword ngxDirectiveThirdParty mongo_buffer_size
+syn keyword ngxDirectiveThirdParty mongo_buffers
+syn keyword ngxDirectiveThirdParty mongo_busy_buffers_size
+syn keyword ngxDirectiveThirdParty mongo_next_upstream
+
+" MP4 Streaming Lite Module <https://www.nginx.com/resources/wiki/modules/mp4_streaming/>
+" Will seek to a certain time within H.264/MP4 files when provided with a 'start' parameter in the URL.
+" syn keyword ngxDirectiveThirdParty mp4
+
+" NAXSI Module <https://github.com/nbs-system/naxsi>
+" NAXSI is an open-source, high performance, low rules maintenance WAF for NGINX
+syn keyword ngxDirectiveThirdParty DeniedUrl denied_url
+syn keyword ngxDirectiveThirdParty LearningMode learning_mode
+syn keyword ngxDirectiveThirdParty SecRulesEnabled rules_enabled
+syn keyword ngxDirectiveThirdParty SecRulesDisabled rules_disabled
+syn keyword ngxDirectiveThirdParty CheckRule check_rule
+syn keyword ngxDirectiveThirdParty BasicRule basic_rule
+syn keyword ngxDirectiveThirdParty MainRule main_rule
+syn keyword ngxDirectiveThirdParty LibInjectionSql libinjection_sql
+syn keyword ngxDirectiveThirdParty LibInjectionXss libinjection_xss
+
+" Nchan Module <https://nchan.slact.net/>
+" Fast, horizontally scalable, multiprocess pub/sub queuing server and proxy for HTTP, long-polling, Websockets and EventSource (SSE)
+syn keyword ngxDirectiveThirdParty nchan_channel_id
+syn keyword ngxDirectiveThirdParty nchan_channel_id_split_delimiter
+syn keyword ngxDirectiveThirdParty nchan_eventsource_event
+syn keyword ngxDirectiveThirdParty nchan_longpoll_multipart_response
+syn keyword ngxDirectiveThirdParty nchan_publisher
+syn keyword ngxDirectiveThirdParty nchan_publisher_channel_id
+syn keyword ngxDirectiveThirdParty nchan_publisher_upstream_request
+syn keyword ngxDirectiveThirdParty nchan_pubsub
+syn keyword ngxDirectiveThirdParty nchan_subscribe_request
+syn keyword ngxDirectiveThirdParty nchan_subscriber
+syn keyword ngxDirectiveThirdParty nchan_subscriber_channel_id
+syn keyword ngxDirectiveThirdParty nchan_subscriber_compound_etag_message_id
+syn keyword ngxDirectiveThirdParty nchan_subscriber_first_message
+syn keyword ngxDirectiveThirdParty nchan_subscriber_http_raw_stream_separator
+syn keyword ngxDirectiveThirdParty nchan_subscriber_last_message_id
+syn keyword ngxDirectiveThirdParty nchan_subscriber_message_id_custom_etag_header
+syn keyword ngxDirectiveThirdParty nchan_subscriber_timeout
+syn keyword ngxDirectiveThirdParty nchan_unsubscribe_request
+syn keyword ngxDirectiveThirdParty nchan_websocket_ping_interval
+syn keyword ngxDirectiveThirdParty nchan_authorize_request
+syn keyword ngxDirectiveThirdParty nchan_max_reserved_memory
+syn keyword ngxDirectiveThirdParty nchan_message_buffer_length
+syn keyword ngxDirectiveThirdParty nchan_message_timeout
+syn keyword ngxDirectiveThirdParty nchan_redis_idle_channel_cache_timeout
+syn keyword ngxDirectiveThirdParty nchan_redis_namespace
+syn keyword ngxDirectiveThirdParty nchan_redis_pass
+syn keyword ngxDirectiveThirdParty nchan_redis_ping_interval
+syn keyword ngxDirectiveThirdParty nchan_redis_server
+syn keyword ngxDirectiveThirdParty nchan_redis_storage_mode
+syn keyword ngxDirectiveThirdParty nchan_redis_url
+syn keyword ngxDirectiveThirdParty nchan_store_messages
+syn keyword ngxDirectiveThirdParty nchan_use_redis
+syn keyword ngxDirectiveThirdParty nchan_access_control_allow_origin
+syn keyword ngxDirectiveThirdParty nchan_channel_group
+syn keyword ngxDirectiveThirdParty nchan_channel_group_accounting
+syn keyword ngxDirectiveThirdParty nchan_group_location
+syn keyword ngxDirectiveThirdParty nchan_group_max_channels
+syn keyword ngxDirectiveThirdParty nchan_group_max_messages
+syn keyword ngxDirectiveThirdParty nchan_group_max_messages_disk
+syn keyword ngxDirectiveThirdParty nchan_group_max_messages_memory
+syn keyword ngxDirectiveThirdParty nchan_group_max_subscribers
+syn keyword ngxDirectiveThirdParty nchan_subscribe_existing_channels_only
+syn keyword ngxDirectiveThirdParty nchan_channel_event_string
+syn keyword ngxDirectiveThirdParty nchan_channel_events_channel_id
+syn keyword ngxDirectiveThirdParty nchan_stub_status
+syn keyword ngxDirectiveThirdParty nchan_max_channel_id_length
+syn keyword ngxDirectiveThirdParty nchan_max_channel_subscribers
+syn keyword ngxDirectiveThirdParty nchan_channel_timeout
+syn keyword ngxDirectiveThirdParty nchan_storage_engine
+
+" Nginx Notice Module <https://github.com/kr/nginx-notice>
+" Serve static file to POST requests.
+syn keyword ngxDirectiveThirdParty notice
+syn keyword ngxDirectiveThirdParty notice_type
+
+" OCSP Proxy Module <https://github.com/kyprizel/nginx_ocsp_proxy-module>
+" Nginx OCSP processing module designed for response caching
+syn keyword ngxDirectiveThirdParty ocsp_proxy
+syn keyword ngxDirectiveThirdParty ocsp_cache_timeout
+
+" Eval Module <https://github.com/openresty/nginx-eval-module>
+" Module for nginx web server evaluates response of proxy or memcached module into variables.
+syn keyword ngxDirectiveThirdParty eval
+syn keyword ngxDirectiveThirdParty eval_escalate
+syn keyword ngxDirectiveThirdParty eval_buffer_size
+syn keyword ngxDirectiveThirdParty eval_override_content_type
+syn keyword ngxDirectiveThirdParty eval_subrequest_in_memory
+
+" OpenSSL Version Module <https://github.com/apcera/nginx-openssl-version>
+" Nginx OpenSSL version check at startup
+syn keyword ngxDirectiveThirdParty openssl_version_minimum
+syn keyword ngxDirectiveThirdParty openssl_builddate_minimum
+
+" Owner Match Module <https://www.nginx.com/resources/wiki/modules/owner_match/>
+" Control access for specific owners and groups of files
+syn keyword ngxDirectiveThirdParty omallow
+syn keyword ngxDirectiveThirdParty omdeny
+
+" Accept Language Module <https://www.nginx.com/resources/wiki/modules/accept_language/>
+" Parses the Accept-Language header and gives the most suitable locale from a list of supported locales.
+syn keyword ngxDirectiveThirdParty pagespeed
+
+" PHP Memcache Standard Balancer Module <https://github.com/replay/ngx_http_php_memcache_standard_balancer>
+" Loadbalancer that is compatible to the standard loadbalancer in the php-memcache module
+syn keyword ngxDirectiveThirdParty hash_key
+
+" PHP Session Module <https://github.com/replay/ngx_http_php_session>
+" Nginx module to parse php sessions
+syn keyword ngxDirectiveThirdParty php_session_parse
+syn keyword ngxDirectiveThirdParty php_session_strip_formatting
+
+" Phusion Passenger Module <https://www.phusionpassenger.com/library/config/nginx/>
+" Passenger is an open source web application server.
+syn keyword ngxDirectiveThirdParty passenger_root
+syn keyword ngxDirectiveThirdParty passenger_enabled
+syn keyword ngxDirectiveThirdParty passenger_base_uri
+syn keyword ngxDirectiveThirdParty passenger_document_root
+syn keyword ngxDirectiveThirdParty passenger_ruby
+syn keyword ngxDirectiveThirdParty passenger_python
+syn keyword ngxDirectiveThirdParty passenger_nodejs
+syn keyword ngxDirectiveThirdParty passenger_meteor_app_settings
+syn keyword ngxDirectiveThirdParty passenger_app_env
+syn keyword ngxDirectiveThirdParty passenger_app_root
+syn keyword ngxDirectiveThirdParty passenger_app_group_name
+syn keyword ngxDirectiveThirdParty passenger_app_type
+syn keyword ngxDirectiveThirdParty passenger_startup_file
+syn keyword ngxDirectiveThirdParty passenger_restart_dir
+syn keyword ngxDirectiveThirdParty passenger_spawn_method
+syn keyword ngxDirectiveThirdParty passenger_env_var
+syn keyword ngxDirectiveThirdParty passenger_load_shell_envvars
+syn keyword ngxDirectiveThirdParty passenger_rolling_restarts
+syn keyword ngxDirectiveThirdParty passenger_resist_deployment_errors
+syn keyword ngxDirectiveThirdParty passenger_user_switching
+syn keyword ngxDirectiveThirdParty passenger_user
+syn keyword ngxDirectiveThirdParty passenger_group
+syn keyword ngxDirectiveThirdParty passenger_default_user
+syn keyword ngxDirectiveThirdParty passenger_default_group
+syn keyword ngxDirectiveThirdParty passenger_show_version_in_header
+syn keyword ngxDirectiveThirdParty passenger_friendly_error_pages
+syn keyword ngxDirectiveThirdParty passenger_disable_security_update_check
+syn keyword ngxDirectiveThirdParty passenger_security_update_check_proxy
+syn keyword ngxDirectiveThirdParty passenger_max_pool_size
+syn keyword ngxDirectiveThirdParty passenger_min_instances
+syn keyword ngxDirectiveThirdParty passenger_max_instances
+syn keyword ngxDirectiveThirdParty passenger_max_instances_per_app
+syn keyword ngxDirectiveThirdParty passenger_pool_idle_time
+syn keyword ngxDirectiveThirdParty passenger_max_preloader_idle_time
+syn keyword ngxDirectiveThirdParty passenger_force_max_concurrent_requests_per_process
+syn keyword ngxDirectiveThirdParty passenger_start_timeout
+syn keyword ngxDirectiveThirdParty passenger_concurrency_model
+syn keyword ngxDirectiveThirdParty passenger_thread_count
+syn keyword ngxDirectiveThirdParty passenger_max_requests
+syn keyword ngxDirectiveThirdParty passenger_max_request_time
+syn keyword ngxDirectiveThirdParty passenger_memory_limit
+syn keyword ngxDirectiveThirdParty passenger_stat_throttle_rate
+syn keyword ngxDirectiveThirdParty passenger_core_file_descriptor_ulimit
+syn keyword ngxDirectiveThirdParty passenger_app_file_descriptor_ulimit
+syn keyword ngxDirectiveThirdParty passenger_pre_start
+syn keyword ngxDirectiveThirdParty passenger_set_header
+syn keyword ngxDirectiveThirdParty passenger_max_request_queue_size
+syn keyword ngxDirectiveThirdParty passenger_request_queue_overflow_status_code
+syn keyword ngxDirectiveThirdParty passenger_sticky_sessions
+syn keyword ngxDirectiveThirdParty passenger_sticky_sessions_cookie_name
+syn keyword ngxDirectiveThirdParty passenger_abort_websockets_on_process_shutdown
+syn keyword ngxDirectiveThirdParty passenger_ignore_client_abort
+syn keyword ngxDirectiveThirdParty passenger_intercept_errors
+syn keyword ngxDirectiveThirdParty passenger_pass_header
+syn keyword ngxDirectiveThirdParty passenger_ignore_headers
+syn keyword ngxDirectiveThirdParty passenger_headers_hash_bucket_size
+syn keyword ngxDirectiveThirdParty passenger_headers_hash_max_size
+syn keyword ngxDirectiveThirdParty passenger_buffer_response
+syn keyword ngxDirectiveThirdParty passenger_response_buffer_high_watermark
+syn keyword ngxDirectiveThirdParty passenger_buffer_size, passenger_buffers, passenger_busy_buffers_size
+syn keyword ngxDirectiveThirdParty passenger_socket_backlog
+syn keyword ngxDirectiveThirdParty passenger_log_level
+syn keyword ngxDirectiveThirdParty passenger_log_file
+syn keyword ngxDirectiveThirdParty passenger_file_descriptor_log_file
+syn keyword ngxDirectiveThirdParty passenger_debugger
+syn keyword ngxDirectiveThirdParty passenger_instance_registry_dir
+syn keyword ngxDirectiveThirdParty passenger_data_buffer_dir
+syn keyword ngxDirectiveThirdParty passenger_fly_with
+syn keyword ngxDirectiveThirdParty union_station_support
+syn keyword ngxDirectiveThirdParty union_station_key
+syn keyword ngxDirectiveThirdParty union_station_proxy_address
+syn keyword ngxDirectiveThirdParty union_station_filter
+syn keyword ngxDirectiveThirdParty union_station_gateway_address
+syn keyword ngxDirectiveThirdParty union_station_gateway_port
+syn keyword ngxDirectiveThirdParty union_station_gateway_cert
+syn keyword ngxDirectiveDeprecated rails_spawn_method
+syn keyword ngxDirectiveDeprecated passenger_debug_log_file
+
+" Postgres Module <http://labs.frickle.com/nginx_ngx_postgres/>
+" Upstream module that allows nginx to communicate directly with PostgreSQL database.
+syn keyword ngxDirectiveThirdParty postgres_server
+syn keyword ngxDirectiveThirdParty postgres_keepalive
+syn keyword ngxDirectiveThirdParty postgres_pass
+syn keyword ngxDirectiveThirdParty postgres_query
+syn keyword ngxDirectiveThirdParty postgres_rewrite
+syn keyword ngxDirectiveThirdParty postgres_output
+syn keyword ngxDirectiveThirdParty postgres_set
+syn keyword ngxDirectiveThirdParty postgres_escape
+syn keyword ngxDirectiveThirdParty postgres_connect_timeout
+syn keyword ngxDirectiveThirdParty postgres_result_timeout
+
+" Pubcookie Module <https://www.vanko.me/book/page/pubcookie-module-nginx>
+" Authorizes users using encrypted cookies
+syn keyword ngxDirectiveThirdParty pubcookie_inactive_expire
+syn keyword ngxDirectiveThirdParty pubcookie_hard_expire
+syn keyword ngxDirectiveThirdParty pubcookie_app_id
+syn keyword ngxDirectiveThirdParty pubcookie_dir_depth
+syn keyword ngxDirectiveThirdParty pubcookie_catenate_app_ids
+syn keyword ngxDirectiveThirdParty pubcookie_app_srv_id
+syn keyword ngxDirectiveThirdParty pubcookie_login
+syn keyword ngxDirectiveThirdParty pubcookie_login_method
+syn keyword ngxDirectiveThirdParty pubcookie_post
+syn keyword ngxDirectiveThirdParty pubcookie_domain
+syn keyword ngxDirectiveThirdParty pubcookie_granting_cert_file
+syn keyword ngxDirectiveThirdParty pubcookie_session_key_file
+syn keyword ngxDirectiveThirdParty pubcookie_session_cert_file
+syn keyword ngxDirectiveThirdParty pubcookie_crypt_key_file
+syn keyword ngxDirectiveThirdParty pubcookie_end_session
+syn keyword ngxDirectiveThirdParty pubcookie_encryption
+syn keyword ngxDirectiveThirdParty pubcookie_session_reauth
+syn keyword ngxDirectiveThirdParty pubcookie_auth_type_names
+syn keyword ngxDirectiveThirdParty pubcookie_no_prompt
+syn keyword ngxDirectiveThirdParty pubcookie_on_demand
+syn keyword ngxDirectiveThirdParty pubcookie_addl_request
+syn keyword ngxDirectiveThirdParty pubcookie_no_obscure_cookies
+syn keyword ngxDirectiveThirdParty pubcookie_no_clean_creds
+syn keyword ngxDirectiveThirdParty pubcookie_egd_device
+syn keyword ngxDirectiveThirdParty pubcookie_no_blank
+syn keyword ngxDirectiveThirdParty pubcookie_super_debug
+syn keyword ngxDirectiveThirdParty pubcookie_set_remote_user
+
+" Push Stream Module <https://github.com/wandenberg/nginx-push-stream-module>
+" A pure stream http push technology for your Nginx setup
+syn keyword ngxDirectiveThirdParty push_stream_channels_statistics
+syn keyword ngxDirectiveThirdParty push_stream_publisher
+syn keyword ngxDirectiveThirdParty push_stream_subscriber
+syn keyword ngxDirectiveThirdParty push_stream_shared_memory_size
+syn keyword ngxDirectiveThirdParty push_stream_channel_deleted_message_text
+syn keyword ngxDirectiveThirdParty push_stream_channel_inactivity_time
+syn keyword ngxDirectiveThirdParty push_stream_ping_message_text
+syn keyword ngxDirectiveThirdParty push_stream_timeout_with_body
+syn keyword ngxDirectiveThirdParty push_stream_message_ttl
+syn keyword ngxDirectiveThirdParty push_stream_max_subscribers_per_channel
+syn keyword ngxDirectiveThirdParty push_stream_max_messages_stored_per_channel
+syn keyword ngxDirectiveThirdParty push_stream_max_channel_id_length
+syn keyword ngxDirectiveThirdParty push_stream_max_number_of_channels
+syn keyword ngxDirectiveThirdParty push_stream_max_number_of_wildcard_channels
+syn keyword ngxDirectiveThirdParty push_stream_wildcard_channel_prefix
+syn keyword ngxDirectiveThirdParty push_stream_events_channel_id
+syn keyword ngxDirectiveThirdParty push_stream_channels_path
+syn keyword ngxDirectiveThirdParty push_stream_store_messages
+syn keyword ngxDirectiveThirdParty push_stream_channel_info_on_publish
+syn keyword ngxDirectiveThirdParty push_stream_authorized_channels_only
+syn keyword ngxDirectiveThirdParty push_stream_header_template_file
+syn keyword ngxDirectiveThirdParty push_stream_header_template
+syn keyword ngxDirectiveThirdParty push_stream_message_template
+syn keyword ngxDirectiveThirdParty push_stream_footer_template
+syn keyword ngxDirectiveThirdParty push_stream_wildcard_channel_max_qtd
+syn keyword ngxDirectiveThirdParty push_stream_ping_message_interval
+syn keyword ngxDirectiveThirdParty push_stream_subscriber_connection_ttl
+syn keyword ngxDirectiveThirdParty push_stream_longpolling_connection_ttl
+syn keyword ngxDirectiveThirdParty push_stream_websocket_allow_publish
+syn keyword ngxDirectiveThirdParty push_stream_last_received_message_time
+syn keyword ngxDirectiveThirdParty push_stream_last_received_message_tag
+syn keyword ngxDirectiveThirdParty push_stream_last_event_id
+syn keyword ngxDirectiveThirdParty push_stream_user_agent
+syn keyword ngxDirectiveThirdParty push_stream_padding_by_user_agent
+syn keyword ngxDirectiveThirdParty push_stream_allowed_origins
+syn keyword ngxDirectiveThirdParty push_stream_allow_connections_to_events_channel
+
+" rDNS Module <https://github.com/flant/nginx-http-rdns>
+" Make a reverse DNS (rDNS) lookup for incoming connection and provides simple access control of incoming hostname by allow/deny rules
+syn keyword ngxDirectiveThirdParty rdns
+syn keyword ngxDirectiveThirdParty rdns_allow
+syn keyword ngxDirectiveThirdParty rdns_deny
+
+" RDS CSV Module <https://github.com/openresty/rds-csv-nginx-module>
+" Nginx output filter module to convert Resty-DBD-Streams (RDS) to Comma-Separated Values (CSV)
+syn keyword ngxDirectiveThirdParty rds_csv
+syn keyword ngxDirectiveThirdParty rds_csv_row_terminator
+syn keyword ngxDirectiveThirdParty rds_csv_field_separator
+syn keyword ngxDirectiveThirdParty rds_csv_field_name_header
+syn keyword ngxDirectiveThirdParty rds_csv_content_type
+syn keyword ngxDirectiveThirdParty rds_csv_buffer_size
+
+" RDS JSON Module <https://github.com/openresty/rds-json-nginx-module>
+" An output filter that formats Resty DBD Streams generated by ngx_drizzle and others to JSON
+syn keyword ngxDirectiveThirdParty rds_json
+syn keyword ngxDirectiveThirdParty rds_json_buffer_size
+syn keyword ngxDirectiveThirdParty rds_json_format
+syn keyword ngxDirectiveThirdParty rds_json_root
+syn keyword ngxDirectiveThirdParty rds_json_success_property
+syn keyword ngxDirectiveThirdParty rds_json_user_property
+syn keyword ngxDirectiveThirdParty rds_json_errcode_key
+syn keyword ngxDirectiveThirdParty rds_json_errstr_key
+syn keyword ngxDirectiveThirdParty rds_json_ret
+syn keyword ngxDirectiveThirdParty rds_json_content_type
+
+" Redis Module <https://www.nginx.com/resources/wiki/modules/redis/>
+" Use this module to perform simple caching
+syn keyword ngxDirectiveThirdParty redis_pass
+syn keyword ngxDirectiveThirdParty redis_bind
+syn keyword ngxDirectiveThirdParty redis_connect_timeout
+syn keyword ngxDirectiveThirdParty redis_read_timeout
+syn keyword ngxDirectiveThirdParty redis_send_timeout
+syn keyword ngxDirectiveThirdParty redis_buffer_size
+syn keyword ngxDirectiveThirdParty redis_next_upstream
+syn keyword ngxDirectiveThirdParty redis_gzip_flag
+
+" Redis 2 Module <https://github.com/openresty/redis2-nginx-module>
+" Nginx upstream module for the Redis 2.0 protocol
+syn keyword ngxDirectiveThirdParty redis2_query
+syn keyword ngxDirectiveThirdParty redis2_raw_query
+syn keyword ngxDirectiveThirdParty redis2_raw_queries
+syn keyword ngxDirectiveThirdParty redis2_literal_raw_query
+syn keyword ngxDirectiveThirdParty redis2_pass
+syn keyword ngxDirectiveThirdParty redis2_connect_timeout
+syn keyword ngxDirectiveThirdParty redis2_send_timeout
+syn keyword ngxDirectiveThirdParty redis2_read_timeout
+syn keyword ngxDirectiveThirdParty redis2_buffer_size
+syn keyword ngxDirectiveThirdParty redis2_next_upstream
+
+" Replace Filter Module <https://github.com/openresty/replace-filter-nginx-module>
+" Streaming regular expression replacement in response bodies
+syn keyword ngxDirectiveThirdParty replace_filter
+syn keyword ngxDirectiveThirdParty replace_filter_types
+syn keyword ngxDirectiveThirdParty replace_filter_max_buffered_size
+syn keyword ngxDirectiveThirdParty replace_filter_last_modified
+syn keyword ngxDirectiveThirdParty replace_filter_skip
+
+" Roboo Module <https://github.com/yuri-gushin/Roboo>
+" HTTP Robot Mitigator
+
+" RRD Graph Module <https://www.nginx.com/resources/wiki/modules/rrd_graph/>
+" This module provides an HTTP interface to RRDtool's graphing facilities.
+syn keyword ngxDirectiveThirdParty rrd_graph
+syn keyword ngxDirectiveThirdParty rrd_graph_root
+
+" RTMP Module <https://github.com/arut/nginx-rtmp-module>
+" NGINX-based Media Streaming Server
+syn keyword ngxDirectiveThirdParty rtmp
+" syn keyword ngxDirectiveThirdParty server
+" syn keyword ngxDirectiveThirdParty listen
+syn keyword ngxDirectiveThirdParty application
+" syn keyword ngxDirectiveThirdParty timeout
+syn keyword ngxDirectiveThirdParty ping
+syn keyword ngxDirectiveThirdParty ping_timeout
+syn keyword ngxDirectiveThirdParty max_streams
+syn keyword ngxDirectiveThirdParty ack_window
+syn keyword ngxDirectiveThirdParty chunk_size
+syn keyword ngxDirectiveThirdParty max_queue
+syn keyword ngxDirectiveThirdParty max_message
+syn keyword ngxDirectiveThirdParty out_queue
+syn keyword ngxDirectiveThirdParty out_cork
+" syn keyword ngxDirectiveThirdParty allow
+" syn keyword ngxDirectiveThirdParty deny
+syn keyword ngxDirectiveThirdParty exec_push
+syn keyword ngxDirectiveThirdParty exec_pull
+syn keyword ngxDirectiveThirdParty exec
+syn keyword ngxDirectiveThirdParty exec_options
+syn keyword ngxDirectiveThirdParty exec_static
+syn keyword ngxDirectiveThirdParty exec_kill_signal
+syn keyword ngxDirectiveThirdParty respawn
+syn keyword ngxDirectiveThirdParty respawn_timeout
+syn keyword ngxDirectiveThirdParty exec_publish
+syn keyword ngxDirectiveThirdParty exec_play
+syn keyword ngxDirectiveThirdParty exec_play_done
+syn keyword ngxDirectiveThirdParty exec_publish_done
+syn keyword ngxDirectiveThirdParty exec_record_done
+syn keyword ngxDirectiveThirdParty live
+syn keyword ngxDirectiveThirdParty meta
+syn keyword ngxDirectiveThirdParty interleave
+syn keyword ngxDirectiveThirdParty wait_key
+syn keyword ngxDirectiveThirdParty wait_video
+syn keyword ngxDirectiveThirdParty publish_notify
+syn keyword ngxDirectiveThirdParty drop_idle_publisher
+syn keyword ngxDirectiveThirdParty sync
+syn keyword ngxDirectiveThirdParty play_restart
+syn keyword ngxDirectiveThirdParty idle_streams
+syn keyword ngxDirectiveThirdParty record
+syn keyword ngxDirectiveThirdParty record_path
+syn keyword ngxDirectiveThirdParty record_suffix
+syn keyword ngxDirectiveThirdParty record_unique
+syn keyword ngxDirectiveThirdParty record_append
+syn keyword ngxDirectiveThirdParty record_lock
+syn keyword ngxDirectiveThirdParty record_max_size
+syn keyword ngxDirectiveThirdParty record_max_frames
+syn keyword ngxDirectiveThirdParty record_interval
+syn keyword ngxDirectiveThirdParty recorder
+syn keyword ngxDirectiveThirdParty record_notify
+syn keyword ngxDirectiveThirdParty play
+syn keyword ngxDirectiveThirdParty play_temp_path
+syn keyword ngxDirectiveThirdParty play_local_path
+syn keyword ngxDirectiveThirdParty pull
+syn keyword ngxDirectiveThirdParty push
+syn keyword ngxDirectiveThirdParty push_reconnect
+syn keyword ngxDirectiveThirdParty session_relay
+syn keyword ngxDirectiveThirdParty on_connect
+syn keyword ngxDirectiveThirdParty on_play
+syn keyword ngxDirectiveThirdParty on_publish
+syn keyword ngxDirectiveThirdParty on_done
+syn keyword ngxDirectiveThirdParty on_play_done
+syn keyword ngxDirectiveThirdParty on_publish_done
+syn keyword ngxDirectiveThirdParty on_record_done
+syn keyword ngxDirectiveThirdParty on_update
+syn keyword ngxDirectiveThirdParty notify_update_timeout
+syn keyword ngxDirectiveThirdParty notify_update_strict
+syn keyword ngxDirectiveThirdParty notify_relay_redirect
+syn keyword ngxDirectiveThirdParty notify_method
+syn keyword ngxDirectiveThirdParty hls
+syn keyword ngxDirectiveThirdParty hls_path
+syn keyword ngxDirectiveThirdParty hls_fragment
+syn keyword ngxDirectiveThirdParty hls_playlist_length
+syn keyword ngxDirectiveThirdParty hls_sync
+syn keyword ngxDirectiveThirdParty hls_continuous
+syn keyword ngxDirectiveThirdParty hls_nested
+syn keyword ngxDirectiveThirdParty hls_base_url
+syn keyword ngxDirectiveThirdParty hls_cleanup
+syn keyword ngxDirectiveThirdParty hls_fragment_naming
+syn keyword ngxDirectiveThirdParty hls_fragment_slicing
+syn keyword ngxDirectiveThirdParty hls_variant
+syn keyword ngxDirectiveThirdParty hls_type
+syn keyword ngxDirectiveThirdParty hls_keys
+syn keyword ngxDirectiveThirdParty hls_key_path
+syn keyword ngxDirectiveThirdParty hls_key_url
+syn keyword ngxDirectiveThirdParty hls_fragments_per_key
+syn keyword ngxDirectiveThirdParty dash
+syn keyword ngxDirectiveThirdParty dash_path
+syn keyword ngxDirectiveThirdParty dash_fragment
+syn keyword ngxDirectiveThirdParty dash_playlist_length
+syn keyword ngxDirectiveThirdParty dash_nested
+syn keyword ngxDirectiveThirdParty dash_cleanup
+" syn keyword ngxDirectiveThirdParty access_log
+" syn keyword ngxDirectiveThirdParty log_format
+syn keyword ngxDirectiveThirdParty max_connections
+syn keyword ngxDirectiveThirdParty rtmp_stat
+syn keyword ngxDirectiveThirdParty rtmp_stat_stylesheet
+syn keyword ngxDirectiveThirdParty rtmp_auto_push
+syn keyword ngxDirectiveThirdParty rtmp_auto_push_reconnect
+syn keyword ngxDirectiveThirdParty rtmp_socket_dir
+syn keyword ngxDirectiveThirdParty rtmp_control
+
+" RTMPT Module <https://github.com/kwojtek/nginx-rtmpt-proxy-module>
+" Module for nginx to proxy rtmp using http protocol
+syn keyword ngxDirectiveThirdParty rtmpt_proxy_target
+syn keyword ngxDirectiveThirdParty rtmpt_proxy_rtmp_timeout
+syn keyword ngxDirectiveThirdParty rtmpt_proxy_http_timeout
+syn keyword ngxDirectiveThirdParty rtmpt_proxy
+syn keyword ngxDirectiveThirdParty rtmpt_proxy_stat
+syn keyword ngxDirectiveThirdParty rtmpt_proxy_stylesheet
+
+" Syntactically Awesome Module <https://github.com/mneudert/sass-nginx-module>
+" Providing on-the-fly compiling of Sass files as an NGINX module.
+syn keyword ngxDirectiveThirdParty sass_compile
+syn keyword ngxDirectiveThirdParty sass_error_log
+syn keyword ngxDirectiveThirdParty sass_include_path
+syn keyword ngxDirectiveThirdParty sass_indent
+syn keyword ngxDirectiveThirdParty sass_is_indented_syntax
+syn keyword ngxDirectiveThirdParty sass_linefeed
+syn keyword ngxDirectiveThirdParty sass_precision
+syn keyword ngxDirectiveThirdParty sass_output_style
+syn keyword ngxDirectiveThirdParty sass_source_comments
+syn keyword ngxDirectiveThirdParty sass_source_map_embed
+
+" Secure Download Module <https://www.nginx.com/resources/wiki/modules/secure_download/>
+" Enables you to create links which are only valid until a certain datetime is reached
+syn keyword ngxDirectiveThirdParty secure_download
+syn keyword ngxDirectiveThirdParty secure_download_secret
+syn keyword ngxDirectiveThirdParty secure_download_path_mode
+
+" Selective Cache Purge Module <https://github.com/wandenberg/nginx-selective-cache-purge-module>
+" A module to purge cache by GLOB patterns. The supported patterns are the same as supported by Redis.
+syn keyword ngxDirectiveThirdParty selective_cache_purge_redis_unix_socket
+syn keyword ngxDirectiveThirdParty selective_cache_purge_redis_host
+syn keyword ngxDirectiveThirdParty selective_cache_purge_redis_port
+syn keyword ngxDirectiveThirdParty selective_cache_purge_redis_database
+syn keyword ngxDirectiveThirdParty selective_cache_purge_query
+
+" Set cconv Module <https://github.com/liseen/set-cconv-nginx-module>
+" Cconv rewrite set commands
+syn keyword ngxDirectiveThirdParty set_cconv_to_simp
+syn keyword ngxDirectiveThirdParty set_cconv_to_trad
+syn keyword ngxDirectiveThirdParty set_pinyin_to_normal
+
+" Set Hash Module <https://github.com/simpl/ngx_http_set_hash>
+" Nginx module that allows the setting of variables to the value of a variety of hashes
+syn keyword ngxDirectiveThirdParty set_md5
+syn keyword ngxDirectiveThirdParty set_md5_upper
+syn keyword ngxDirectiveThirdParty set_murmur2
+syn keyword ngxDirectiveThirdParty set_murmur2_upper
+syn keyword ngxDirectiveThirdParty set_sha1
+syn keyword ngxDirectiveThirdParty set_sha1_upper
+
+" Set Lang Module <https://github.com/simpl/ngx_http_set_lang>
+" Provides a variety of ways for setting a variable denoting the langauge that content should be returned in.
+syn keyword ngxDirectiveThirdParty set_lang
+syn keyword ngxDirectiveThirdParty set_lang_method
+syn keyword ngxDirectiveThirdParty lang_cookie
+syn keyword ngxDirectiveThirdParty lang_get_var
+syn keyword ngxDirectiveThirdParty lang_list
+syn keyword ngxDirectiveThirdParty lang_post_var
+syn keyword ngxDirectiveThirdParty lang_host
+syn keyword ngxDirectiveThirdParty lang_referer
+
+" Set Misc Module <https://github.com/openresty/set-misc-nginx-module>
+" Various set_xxx directives added to nginx's rewrite module
+syn keyword ngxDirectiveThirdParty set_if_empty
+syn keyword ngxDirectiveThirdParty set_quote_sql_str
+syn keyword ngxDirectiveThirdParty set_quote_pgsql_str
+syn keyword ngxDirectiveThirdParty set_quote_json_str
+syn keyword ngxDirectiveThirdParty set_unescape_uri
+syn keyword ngxDirectiveThirdParty set_escape_uri
+syn keyword ngxDirectiveThirdParty set_hashed_upstream
+syn keyword ngxDirectiveThirdParty set_encode_base32
+syn keyword ngxDirectiveThirdParty set_base32_padding
+syn keyword ngxDirectiveThirdParty set_misc_base32_padding
+syn keyword ngxDirectiveThirdParty set_base32_alphabet
+syn keyword ngxDirectiveThirdParty set_decode_base32
+syn keyword ngxDirectiveThirdParty set_encode_base64
+syn keyword ngxDirectiveThirdParty set_decode_base64
+syn keyword ngxDirectiveThirdParty set_encode_hex
+syn keyword ngxDirectiveThirdParty set_decode_hex
+syn keyword ngxDirectiveThirdParty set_sha1
+syn keyword ngxDirectiveThirdParty set_md5
+syn keyword ngxDirectiveThirdParty set_hmac_sha1
+syn keyword ngxDirectiveThirdParty set_random
+syn keyword ngxDirectiveThirdParty set_secure_random_alphanum
+syn keyword ngxDirectiveThirdParty set_secure_random_lcalpha
+syn keyword ngxDirectiveThirdParty set_rotate
+syn keyword ngxDirectiveThirdParty set_local_today
+syn keyword ngxDirectiveThirdParty set_formatted_gmt_time
+syn keyword ngxDirectiveThirdParty set_formatted_local_time
+
+" SFlow Module <https://github.com/sflow/nginx-sflow-module>
+" A binary, random-sampling nginx module designed for: lightweight, centralized, continuous, real-time monitoring of very large and very busy web farms.
+syn keyword ngxDirectiveThirdParty sflow
+
+" Shibboleth Module <https://github.com/nginx-shib/nginx-http-shibboleth>
+" Shibboleth auth request module for nginx
+syn keyword ngxDirectiveThirdParty shib_request
+syn keyword ngxDirectiveThirdParty shib_request_set
+syn keyword ngxDirectiveThirdParty shib_request_use_headers
+
+" Slice Module <https://github.com/alibaba/nginx-http-slice>
+" Nginx module for serving a file in slices (reverse byte-range)
+" syn keyword ngxDirectiveThirdParty slice
+syn keyword ngxDirectiveThirdParty slice_arg_begin
+syn keyword ngxDirectiveThirdParty slice_arg_end
+syn keyword ngxDirectiveThirdParty slice_header
+syn keyword ngxDirectiveThirdParty slice_footer
+syn keyword ngxDirectiveThirdParty slice_header_first
+syn keyword ngxDirectiveThirdParty slice_footer_last
+
+" SlowFS Cache Module <https://github.com/FRiCKLE/ngx_slowfs_cache/>
+" Module adding ability to cache static files.
+syn keyword ngxDirectiveThirdParty slowfs_big_file_size
+syn keyword ngxDirectiveThirdParty slowfs_cache
+syn keyword ngxDirectiveThirdParty slowfs_cache_key
+syn keyword ngxDirectiveThirdParty slowfs_cache_min_uses
+syn keyword ngxDirectiveThirdParty slowfs_cache_path
+syn keyword ngxDirectiveThirdParty slowfs_cache_purge
+syn keyword ngxDirectiveThirdParty slowfs_cache_valid
+syn keyword ngxDirectiveThirdParty slowfs_temp_path
+
+" Small Light Module <https://github.com/cubicdaiya/ngx_small_light>
+" Dynamic Image Transformation Module For nginx.
+syn keyword ngxDirectiveThirdParty small_light
+syn keyword ngxDirectiveThirdParty small_light_getparam_mode
+syn keyword ngxDirectiveThirdParty small_light_material_dir
+syn keyword ngxDirectiveThirdParty small_light_pattern_define
+syn keyword ngxDirectiveThirdParty small_light_radius_max
+syn keyword ngxDirectiveThirdParty small_light_sigma_max
+syn keyword ngxDirectiveThirdParty small_light_imlib2_temp_dir
+syn keyword ngxDirectiveThirdParty small_light_buffer
+
+" Sorted Querystring Filter Module <https://github.com/wandenberg/nginx-sorted-querystring-module>
+" Nginx module to expose querystring parameters sorted in a variable to be used on cache_key as example
+syn keyword ngxDirectiveThirdParty sorted_querystring_filter_parameter
+
+" Sphinx2 Module <https://github.com/reeteshranjan/sphinx2-nginx-module>
+" Nginx upstream module for Sphinx 2.x
+syn keyword ngxDirectiveThirdParty sphinx2_pass
+syn keyword ngxDirectiveThirdParty sphinx2_bind
+syn keyword ngxDirectiveThirdParty sphinx2_connect_timeout
+syn keyword ngxDirectiveThirdParty sphinx2_send_timeout
+syn keyword ngxDirectiveThirdParty sphinx2_buffer_size
+syn keyword ngxDirectiveThirdParty sphinx2_read_timeout
+syn keyword ngxDirectiveThirdParty sphinx2_next_upstream
+
+" HTTP SPNEGO auth Module <https://github.com/stnoonan/spnego-http-auth-nginx-module>
+" This module implements adds SPNEGO support to nginx(http://nginx.org). It currently supports only Kerberos authentication via GSSAPI
+syn keyword ngxDirectiveThirdParty auth_gss
+syn keyword ngxDirectiveThirdParty auth_gss_keytab
+syn keyword ngxDirectiveThirdParty auth_gss_realm
+syn keyword ngxDirectiveThirdParty auth_gss_service_name
+syn keyword ngxDirectiveThirdParty auth_gss_authorized_principal
+syn keyword ngxDirectiveThirdParty auth_gss_allow_basic_fallback
+
+" SR Cache Module <https://github.com/openresty/srcache-nginx-module>
+" Transparent subrequest-based caching layout for arbitrary nginx locations
+syn keyword ngxDirectiveThirdParty srcache_fetch
+syn keyword ngxDirectiveThirdParty srcache_fetch_skip
+syn keyword ngxDirectiveThirdParty srcache_store
+syn keyword ngxDirectiveThirdParty srcache_store_max_size
+syn keyword ngxDirectiveThirdParty srcache_store_skip
+syn keyword ngxDirectiveThirdParty srcache_store_statuses
+syn keyword ngxDirectiveThirdParty srcache_store_ranges
+syn keyword ngxDirectiveThirdParty srcache_header_buffer_size
+syn keyword ngxDirectiveThirdParty srcache_store_hide_header
+syn keyword ngxDirectiveThirdParty srcache_store_pass_header
+syn keyword ngxDirectiveThirdParty srcache_methods
+syn keyword ngxDirectiveThirdParty srcache_ignore_content_encoding
+syn keyword ngxDirectiveThirdParty srcache_request_cache_control
+syn keyword ngxDirectiveThirdParty srcache_response_cache_control
+syn keyword ngxDirectiveThirdParty srcache_store_no_store
+syn keyword ngxDirectiveThirdParty srcache_store_no_cache
+syn keyword ngxDirectiveThirdParty srcache_store_private
+syn keyword ngxDirectiveThirdParty srcache_default_expire
+syn keyword ngxDirectiveThirdParty srcache_max_expire
+
+" SSSD Info Module <https://github.com/veruu/ngx_sssd_info>
+" Retrives additional attributes from SSSD for current authentizated user
+syn keyword ngxDirectiveThirdParty sssd_info
+syn keyword ngxDirectiveThirdParty sssd_info_output_to
+syn keyword ngxDirectiveThirdParty sssd_info_groups
+syn keyword ngxDirectiveThirdParty sssd_info_group
+syn keyword ngxDirectiveThirdParty sssd_info_group_separator
+syn keyword ngxDirectiveThirdParty sssd_info_attributes
+syn keyword ngxDirectiveThirdParty sssd_info_attribute
+syn keyword ngxDirectiveThirdParty sssd_info_attribute_separator
+
+" Static Etags Module <https://github.com/mikewest/nginx-static-etags>
+" Generate etags for static content
+syn keyword ngxDirectiveThirdParty FileETag
+
+" Statsd Module <https://github.com/zebrafishlabs/nginx-statsd>
+" An nginx module for sending statistics to statsd
+syn keyword ngxDirectiveThirdParty statsd_server
+syn keyword ngxDirectiveThirdParty statsd_sample_rate
+syn keyword ngxDirectiveThirdParty statsd_count
+syn keyword ngxDirectiveThirdParty statsd_timing
+
+" Sticky Module <https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng>
+" Add a sticky cookie to be always forwarded to the same upstream server
+" syn keyword ngxDirectiveThirdParty sticky
+
+" Stream Echo Module <https://github.com/openresty/stream-echo-nginx-module>
+" TCP/stream echo module for NGINX (a port of ngx_http_echo_module)
+syn keyword ngxDirectiveThirdParty echo
+syn keyword ngxDirectiveThirdParty echo_duplicate
+syn keyword ngxDirectiveThirdParty echo_flush_wait
+syn keyword ngxDirectiveThirdParty echo_sleep
+syn keyword ngxDirectiveThirdParty echo_send_timeout
+syn keyword ngxDirectiveThirdParty echo_read_bytes
+syn keyword ngxDirectiveThirdParty echo_read_line
+syn keyword ngxDirectiveThirdParty echo_request_data
+syn keyword ngxDirectiveThirdParty echo_discard_request
+syn keyword ngxDirectiveThirdParty echo_read_buffer_size
+syn keyword ngxDirectiveThirdParty echo_read_timeout
+syn keyword ngxDirectiveThirdParty echo_client_error_log_level
+syn keyword ngxDirectiveThirdParty echo_lingering_close
+syn keyword ngxDirectiveThirdParty echo_lingering_time
+syn keyword ngxDirectiveThirdParty echo_lingering_timeout
+
+" Stream Lua Module <https://github.com/openresty/stream-lua-nginx-module>
+" Embed the power of Lua into Nginx stream/TCP Servers.
+syn keyword ngxDirectiveThirdParty lua_resolver
+syn keyword ngxDirectiveThirdParty lua_resolver_timeout
+syn keyword ngxDirectiveThirdParty lua_lingering_close
+syn keyword ngxDirectiveThirdParty lua_lingering_time
+syn keyword ngxDirectiveThirdParty lua_lingering_timeout
+
+" Stream Upsync Module <https://github.com/xiaokai-wang/nginx-stream-upsync-module>
+" Sync upstreams from consul or others, dynamiclly modify backend-servers attribute(weight, max_fails,...), needn't reload nginx.
+syn keyword ngxDirectiveThirdParty upsync
+syn keyword ngxDirectiveThirdParty upsync_dump_path
+syn keyword ngxDirectiveThirdParty upsync_lb
+syn keyword ngxDirectiveThirdParty upsync_show
+
+" Strip Module <https://github.com/evanmiller/mod_strip>
+" Whitespace remover.
+syn keyword ngxDirectiveThirdParty strip
+
+" Subrange Module <https://github.com/Qihoo360/ngx_http_subrange_module>
+" Split one big HTTP/Range request to multiple subrange requesets
+syn keyword ngxDirectiveThirdParty subrange
+
+" Substitutions Module <https://www.nginx.com/resources/wiki/modules/substitutions/>
+" A filter module which can do both regular expression and fixed string substitutions on response bodies.
+syn keyword ngxDirectiveThirdParty subs_filter
+syn keyword ngxDirectiveThirdParty subs_filter_types
+
+" Summarizer Module <https://github.com/reeteshranjan/summarizer-nginx-module>
+" Upstream nginx module to get summaries of documents using the summarizer daemon service
+syn keyword ngxDirectiveThirdParty smrzr_filename
+syn keyword ngxDirectiveThirdParty smrzr_ratio
+
+" Supervisord Module <https://github.com/FRiCKLE/ngx_supervisord/>
+" Module providing nginx with API to communicate with supervisord and manage (start/stop) backends on-demand.
+syn keyword ngxDirectiveThirdParty supervisord
+syn keyword ngxDirectiveThirdParty supervisord_inherit_backend_status
+syn keyword ngxDirectiveThirdParty supervisord_name
+syn keyword ngxDirectiveThirdParty supervisord_start
+syn keyword ngxDirectiveThirdParty supervisord_stop
+
+" Tarantool Upstream Module <https://github.com/tarantool/nginx_upstream_module>
+" Tarantool NginX upstream module (REST, JSON API, websockets, load balancing)
+syn keyword ngxDirectiveThirdParty tnt_pass
+syn keyword ngxDirectiveThirdParty tnt_http_methods
+syn keyword ngxDirectiveThirdParty tnt_http_rest_methods
+syn keyword ngxDirectiveThirdParty tnt_pass_http_request
+syn keyword ngxDirectiveThirdParty tnt_pass_http_request_buffer_size
+syn keyword ngxDirectiveThirdParty tnt_method
+syn keyword ngxDirectiveThirdParty tnt_http_allowed_methods - experemental
+syn keyword ngxDirectiveThirdParty tnt_send_timeout
+syn keyword ngxDirectiveThirdParty tnt_read_timeout
+syn keyword ngxDirectiveThirdParty tnt_buffer_size
+syn keyword ngxDirectiveThirdParty tnt_next_upstream
+syn keyword ngxDirectiveThirdParty tnt_connect_timeout
+syn keyword ngxDirectiveThirdParty tnt_next_upstream
+syn keyword ngxDirectiveThirdParty tnt_next_upstream_tries
+syn keyword ngxDirectiveThirdParty tnt_next_upstream_timeout
+
+" TCP Proxy Module <http://yaoweibin.github.io/nginx_tcp_proxy_module/>
+" Add the feature of tcp proxy with nginx, with health check and status monitor
+syn keyword ngxDirectiveBlock tcp
+" syn keyword ngxDirectiveThirdParty server
+" syn keyword ngxDirectiveThirdParty listen
+" syn keyword ngxDirectiveThirdParty allow
+" syn keyword ngxDirectiveThirdParty deny
+" syn keyword ngxDirectiveThirdParty so_keepalive
+" syn keyword ngxDirectiveThirdParty tcp_nodelay
+" syn keyword ngxDirectiveThirdParty timeout
+" syn keyword ngxDirectiveThirdParty server_name
+" syn keyword ngxDirectiveThirdParty resolver
+" syn keyword ngxDirectiveThirdParty resolver_timeout
+" syn keyword ngxDirectiveThirdParty upstream
+syn keyword ngxDirectiveThirdParty check
+syn keyword ngxDirectiveThirdParty check_http_send
+syn keyword ngxDirectiveThirdParty check_http_expect_alive
+syn keyword ngxDirectiveThirdParty check_smtp_send
+syn keyword ngxDirectiveThirdParty check_smtp_expect_alive
+syn keyword ngxDirectiveThirdParty check_shm_size
+syn keyword ngxDirectiveThirdParty check_status
+" syn keyword ngxDirectiveThirdParty ip_hash
+" syn keyword ngxDirectiveThirdParty proxy_pass
+" syn keyword ngxDirectiveThirdParty proxy_buffer
+" syn keyword ngxDirectiveThirdParty proxy_connect_timeout
+" syn keyword ngxDirectiveThirdParty proxy_read_timeout
+syn keyword ngxDirectiveThirdParty proxy_write_timeout
+
+" Testcookie Module <https://github.com/kyprizel/testcookie-nginx-module>
+" NGINX module for L7 DDoS attack mitigation
+syn keyword ngxDirectiveThirdParty testcookie
+syn keyword ngxDirectiveThirdParty testcookie_name
+syn keyword ngxDirectiveThirdParty testcookie_domain
+syn keyword ngxDirectiveThirdParty testcookie_expires
+syn keyword ngxDirectiveThirdParty testcookie_path
+syn keyword ngxDirectiveThirdParty testcookie_secret
+syn keyword ngxDirectiveThirdParty testcookie_session
+syn keyword ngxDirectiveThirdParty testcookie_arg
+syn keyword ngxDirectiveThirdParty testcookie_max_attempts
+syn keyword ngxDirectiveThirdParty testcookie_p3p
+syn keyword ngxDirectiveThirdParty testcookie_fallback
+syn keyword ngxDirectiveThirdParty testcookie_whitelist
+syn keyword ngxDirectiveThirdParty testcookie_pass
+syn keyword ngxDirectiveThirdParty testcookie_redirect_via_refresh
+syn keyword ngxDirectiveThirdParty testcookie_refresh_template
+syn keyword ngxDirectiveThirdParty testcookie_refresh_status
+syn keyword ngxDirectiveThirdParty testcookie_deny_keepalive
+syn keyword ngxDirectiveThirdParty testcookie_get_only
+syn keyword ngxDirectiveThirdParty testcookie_https_location
+syn keyword ngxDirectiveThirdParty testcookie_refresh_encrypt_cookie
+syn keyword ngxDirectiveThirdParty testcookie_refresh_encrypt_cookie_key
+syn keyword ngxDirectiveThirdParty testcookie_refresh_encrypt_iv
+syn keyword ngxDirectiveThirdParty testcookie_internal
+syn keyword ngxDirectiveThirdParty testcookie_httponly_flag
+syn keyword ngxDirectiveThirdParty testcookie_secure_flag
+
+" Types Filter Module <https://github.com/flygoast/ngx_http_types_filter>
+" Change the `Content-Type` output header depending on an extension variable according to a condition specified in the 'if' clause.
+syn keyword ngxDirectiveThirdParty types_filter
+syn keyword ngxDirectiveThirdParty types_filter_use_default
+
+" Unzip Module <https://github.com/youzee/nginx-unzip-module>
+" Enabling fetching of files that are stored in zipped archives.
+syn keyword ngxDirectiveThirdParty file_in_unzip_archivefile
+syn keyword ngxDirectiveThirdParty file_in_unzip_extract
+syn keyword ngxDirectiveThirdParty file_in_unzip
+
+" Upload Progress Module <https://www.nginx.com/resources/wiki/modules/upload_progress/>
+" An upload progress system, that monitors RFC1867 POST upload as they are transmitted to upstream servers
+syn keyword ngxDirectiveThirdParty upload_progress
+syn keyword ngxDirectiveThirdParty track_uploads
+syn keyword ngxDirectiveThirdParty report_uploads
+syn keyword ngxDirectiveThirdParty upload_progress_content_type
+syn keyword ngxDirectiveThirdParty upload_progress_header
+syn keyword ngxDirectiveThirdParty upload_progress_jsonp_parameter
+syn keyword ngxDirectiveThirdParty upload_progress_json_output
+syn keyword ngxDirectiveThirdParty upload_progress_jsonp_output
+syn keyword ngxDirectiveThirdParty upload_progress_template
+
+" Upload Module <https://www.nginx.com/resources/wiki/modules/upload/>
+" Parses request body storing all files being uploaded to a directory specified by upload_store directive
+syn keyword ngxDirectiveThirdParty upload_pass
+syn keyword ngxDirectiveThirdParty upload_resumable
+syn keyword ngxDirectiveThirdParty upload_store
+syn keyword ngxDirectiveThirdParty upload_state_store
+syn keyword ngxDirectiveThirdParty upload_store_access
+syn keyword ngxDirectiveThirdParty upload_set_form_field
+syn keyword ngxDirectiveThirdParty upload_aggregate_form_field
+syn keyword ngxDirectiveThirdParty upload_pass_form_field
+syn keyword ngxDirectiveThirdParty upload_cleanup
+syn keyword ngxDirectiveThirdParty upload_buffer_size
+syn keyword ngxDirectiveThirdParty upload_max_part_header_len
+syn keyword ngxDirectiveThirdParty upload_max_file_size
+syn keyword ngxDirectiveThirdParty upload_limit_rate
+syn keyword ngxDirectiveThirdParty upload_max_output_body_len
+syn keyword ngxDirectiveThirdParty upload_tame_arrays
+syn keyword ngxDirectiveThirdParty upload_pass_args
+
+" Upstream Fair Module <https://github.com/gnosek/nginx-upstream-fair>
+" The fair load balancer module for nginx http://nginx.localdomain.pl
+syn keyword ngxDirectiveThirdParty fair
+syn keyword ngxDirectiveThirdParty upstream_fair_shm_size
+
+" Upstream Hash Module (DEPRECATED) <http://wiki.nginx.org/NginxHttpUpstreamRequestHashModule>
+" Provides simple upstream load distribution by hashing a configurable variable.
+" syn keyword ngxDirectiveDeprecated hash
+syn keyword ngxDirectiveDeprecated hash_again
+
+" Upstream Domain Resolve Module <https://www.nginx.com/resources/wiki/modules/domain_resolve/>
+" A load-balancer that resolves an upstream domain name asynchronously.
+syn keyword ngxDirectiveThirdParty jdomain
+
+" Upsync Module <https://github.com/weibocom/nginx-upsync-module>
+" Sync upstreams from consul or others, dynamiclly modify backend-servers attribute(weight, max_fails,...), needn't reload nginx
+syn keyword ngxDirectiveThirdParty upsync
+syn keyword ngxDirectiveThirdParty upsync_dump_path
+syn keyword ngxDirectiveThirdParty upsync_lb
+syn keyword ngxDirectiveThirdParty upstream_show
+
+" URL Module <https://github.com/vozlt/nginx-module-url>
+" Nginx url encoding converting module
+syn keyword ngxDirectiveThirdParty url_encoding_convert
+syn keyword ngxDirectiveThirdParty url_encoding_convert_from
+syn keyword ngxDirectiveThirdParty url_encoding_convert_to
+
+" User Agent Module <https://github.com/alibaba/nginx-http-user-agent>
+" Match browsers and crawlers
+syn keyword ngxDirectiveThirdParty user_agent
+
+" Upstrema Ketama Chash Module <https://github.com/flygoast/ngx_http_upstream_ketama_chash>
+" Nginx load-balancer module implementing ketama consistent hashing.
+syn keyword ngxDirectiveThirdParty ketama_chash
+
+" Video Thumbextractor Module <https://github.com/wandenberg/nginx-video-thumbextractor-module>
+" Extract thumbs from a video file
+syn keyword ngxDirectiveThirdParty video_thumbextractor
+syn keyword ngxDirectiveThirdParty video_thumbextractor_video_filename
+syn keyword ngxDirectiveThirdParty video_thumbextractor_video_second
+syn keyword ngxDirectiveThirdParty video_thumbextractor_image_width
+syn keyword ngxDirectiveThirdParty video_thumbextractor_image_height
+syn keyword ngxDirectiveThirdParty video_thumbextractor_only_keyframe
+syn keyword ngxDirectiveThirdParty video_thumbextractor_next_time
+syn keyword ngxDirectiveThirdParty video_thumbextractor_tile_rows
+syn keyword ngxDirectiveThirdParty video_thumbextractor_tile_cols
+syn keyword ngxDirectiveThirdParty video_thumbextractor_tile_max_rows
+syn keyword ngxDirectiveThirdParty video_thumbextractor_tile_max_cols
+syn keyword ngxDirectiveThirdParty video_thumbextractor_tile_sample_interval
+syn keyword ngxDirectiveThirdParty video_thumbextractor_tile_color
+syn keyword ngxDirectiveThirdParty video_thumbextractor_tile_margin
+syn keyword ngxDirectiveThirdParty video_thumbextractor_tile_padding
+syn keyword ngxDirectiveThirdParty video_thumbextractor_threads
+syn keyword ngxDirectiveThirdParty video_thumbextractor_processes_per_worker
+
+" Eval Module <http://www.grid.net.ru/nginx/eval.en.html>
+" Module for nginx web server evaluates response of proxy or memcached module into variables.
+syn keyword ngxDirectiveThirdParty eval
+syn keyword ngxDirectiveThirdParty eval_escalate
+syn keyword ngxDirectiveThirdParty eval_override_content_type
+
+" VTS Module <https://github.com/vozlt/nginx-module-vts>
+" Nginx virtual host traffic status module
+syn keyword ngxDirectiveThirdParty vhost_traffic_status
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_zone
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_display
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_display_format
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_display_jsonp
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_filter
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_filter_by_host
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_filter_by_set_key
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_filter_check_duplicate
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_limit
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_limit_traffic
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_limit_traffic_by_set_key
+syn keyword ngxDirectiveThirdParty vhost_traffic_status_limit_check_duplicate
+
+" XSS Module <https://github.com/openresty/xss-nginx-module>
+" Native support for cross-site scripting (XSS) in an nginx.
+syn keyword ngxDirectiveThirdParty xss_get
+syn keyword ngxDirectiveThirdParty xss_callback_arg
+syn keyword ngxDirectiveThirdParty xss_override_status
+syn keyword ngxDirectiveThirdParty xss_check_status
+syn keyword ngxDirectiveThirdParty xss_input_types
+
+" CT Module <https://github.com/grahamedgecombe/nginx-ct>
+" Certificate Transparency module for nginx
+syn keyword ngxDirectiveThirdParty ssl_ct
+syn keyword ngxDirectiveThirdParty ssl_ct_static_scts
+
+" Dynamic TLS records patch <https://github.com/cloudflare/sslconfig/blob/master/patches/nginx__dynamic_tls_records.patch>
+" TLS Dynamic Record Resizing
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_enable
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_size_hi
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_size_lo
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_threshold
+syn keyword ngxDirectiveThirdParty ssl_dyn_rec_timeout
+
+" ZIP Module <https://www.nginx.com/resources/wiki/modules/zip/>
+" ZIP archiver for nginx
+
+" Contained LUA blocks for embedded syntax highlighting
+syn keyword ngxThirdPartyLuaBlock balancer_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock init_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock init_worker_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock set_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock content_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock rewrite_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock access_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock header_filter_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock body_filter_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock log_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock ssl_certificate_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock ssl_session_fetch_by_lua_block contained
+syn keyword ngxThirdPartyLuaBlock ssl_session_store_by_lua_block contained
+
+
+" Nested syntax in ERB templating statements
+" Subtype needs to be set to '', otherwise recursive errors occur when opening *.nginx files
+let b:eruby_subtype = ''
+unlet b:current_syntax
+syn include @ERB syntax/eruby.vim
+syn region ngxTemplate start=+<%[^\=]+ end=+%>+ oneline contains=@ERB
+syn region ngxTemplateVar start=+<%=+ end=+%>+ oneline
+let b:current_syntax = "nginx"
+
+" Nested syntax in Jinja templating statements
+" This dependend on https://github.com/lepture/vim-jinja
+unlet b:current_syntax
+try
+ syn include @JINJA syntax/jinja.vim
+ syn region ngxTemplate start=+{%+ end=+%}+ oneline contains=@JINJA
+ syn region ngxTemplateVar start=+{{+ end=+}}+ oneline
+catch
+endtry
+let b:current_syntax = "nginx"
+
+" Enable nested LUA syntax highlighting
+unlet b:current_syntax
+syn include @LUA syntax/lua.vim
+syn region ngxLua start=+^\s*\w\+_by_lua_block\s*{+ end=+}+me=s-1 contains=ngxBlock,@LUA
+let b:current_syntax = "nginx"
+
+
+" Highlight
+hi link ngxComment Comment
+hi link ngxVariable Identifier
+hi link ngxVariableBlock Identifier
+hi link ngxVariableString PreProc
+hi link ngxString String
+hi link ngxIPaddr Delimiter
+hi link ngxBoolean Boolean
+hi link ngxInteger Number
+hi link ngxDirectiveBlock Statement
+hi link ngxDirectiveImportant Type
+hi link ngxDirectiveControl Keyword
+hi link ngxDirectiveDeprecated Error
+hi link ngxDirective Function
+hi link ngxDirectiveThirdParty Function
+hi link ngxListenOptions PreProc
+hi link ngxUpstreamServerOptions PreProc
+hi link ngxProxyNextUpstreamOptions PreProc
+hi link ngxMailProtocol Keyword
+hi link ngxSSLProtocol PreProc
+hi link ngxSSLProtocolDeprecated Error
+hi link ngxStickyOptions ngxDirective
+hi link ngxCookieOptions PreProc
+hi link ngxTemplateVar Identifier
+
+hi link ngxSSLSessionTicketsOff ngxBoolean
+hi link ngxSSLSessionTicketsOn Error
+hi link ngxSSLPreferServerCiphersOn ngxBoolean
+hi link ngxSSLPreferServerCiphersOff Error
+hi link ngxGzipOff ngxBoolean
+hi link ngxGzipOn Error
+hi link ngxSSLCipherInsecure Error
+
+hi link ngxThirdPartyLuaBlock Function
diff --git a/runtime/syntax/ninja.vim b/runtime/syntax/ninja.vim
new file mode 100644
index 0000000..a53567e
--- /dev/null
+++ b/runtime/syntax/ninja.vim
@@ -0,0 +1,87 @@
+" ninja build file syntax.
+" Language: ninja build file as described at
+" http://ninja-build.org/manual.html
+" Version: 1.5
+" Last Change: 2018/04/05
+" Maintainer: Nicolas Weber <nicolasweber@gmx.de>
+" 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/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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case match
+
+" 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).
+" lexer.in.cc, ReadToken() and manifest_parser.cc, Parse()
+syn match ninjaKeyword "^build\>"
+syn match ninjaKeyword "^rule\>"
+syn match ninjaKeyword "^pool\>"
+syn match ninjaKeyword "^default\>"
+syn match ninjaKeyword "^include\>"
+syn match ninjaKeyword "^subninja\>"
+
+" Both 'build' and 'rule' begin a variable scope that ends
+" on the first line without indent. 'rule' allows only a
+" limited set of magic variables, 'build' allows general
+" let assignments.
+" manifest_parser.cc, ParseRule()
+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=TOP transparent
+syn keyword ninjaPoolCommand contained containedin=ninjaPool depth
+
+" Strings are parsed as follows:
+" lexer.in.cc, ReadEvalString()
+" simple_varname = [a-zA-Z0-9_-]+;
+" varname = [a-zA-Z0-9_.-]+;
+" $$ -> $
+" $\n -> line continuation
+" '$ ' -> escaped space
+" $simple_varname -> variable
+" ${varname} -> variable
+
+syn match ninjaDollar "\$\$"
+syn match ninjaWrapLineOperator "\$$"
+syn match ninjaSimpleVar "\$[a-zA-Z0-9_-]\+"
+syn match ninjaVar "\${[a-zA-Z0-9_.-]\+}"
+
+" operators are:
+" variable assignment =
+" rule definition :
+" implicit dependency |
+" order-only dependency ||
+syn match ninjaOperator "\(=\|:\||\|||\)\ze\s"
+
+hi def link ninjaComment Comment
+hi def link ninjaKeyword Keyword
+hi def link ninjaRuleCommand Statement
+hi def link ninjaPoolCommand Statement
+hi def link ninjaDollar ninjaOperator
+hi def link ninjaWrapLineOperator ninjaOperator
+hi def link ninjaOperator Operator
+hi def link ninjaSimpleVar ninjaVar
+hi def link ninjaVar Identifier
+
+let b:current_syntax = "ninja"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/nix.vim b/runtime/syntax/nix.vim
new file mode 100644
index 0000000..c07676a
--- /dev/null
+++ b/runtime/syntax/nix.vim
@@ -0,0 +1,210 @@
+" Vim syntax file
+" Language: Nix
+" Maintainer: James Fleming <james@electronic-quill.net>
+" Original Author: Daiderd Jordan <daiderd@gmail.com>
+" Acknowledgement: Based on vim-nix maintained by Daiderd Jordan <daiderd@gmail.com>
+" https://github.com/LnL7/vim-nix
+" License: MIT
+" Last Change: 2022 Dec 06
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword nixBoolean true false
+syn keyword nixNull null
+syn keyword nixRecKeyword rec
+
+syn keyword nixOperator or
+syn match nixOperator '!=\|!'
+syn match nixOperator '<=\?'
+syn match nixOperator '>=\?'
+syn match nixOperator '&&'
+syn match nixOperator '//\='
+syn match nixOperator '=='
+syn match nixOperator '?'
+syn match nixOperator '||'
+syn match nixOperator '++\='
+syn match nixOperator '-'
+syn match nixOperator '\*'
+syn match nixOperator '->'
+
+syn match nixParen '[()]'
+syn match nixInteger '\d\+'
+
+syn keyword nixTodo FIXME NOTE TODO OPTIMIZE XXX HACK contained
+syn match nixComment '#.*' contains=nixTodo,@Spell
+syn region nixComment start=+/\*+ end=+\*/+ contains=nixTodo,@Spell
+
+syn region nixInterpolation matchgroup=nixInterpolationDelimiter start="\${" end="}" contained contains=@nixExpr,nixInterpolationParam
+
+syn match nixSimpleStringSpecial /\\\%([nrt"\\$]\|$\)/ contained
+syn match nixStringSpecial /''['$]/ contained
+syn match nixStringSpecial /\$\$/ contained
+syn match nixStringSpecial /''\\[nrt]/ contained
+
+syn match nixSimpleStringSpecial /\$\$/ contained
+
+syn match nixInvalidSimpleStringEscape /\\[^nrt"\\$]/ contained
+syn match nixInvalidStringEscape /''\\[^nrt]/ contained
+
+syn region nixSimpleString matchgroup=nixStringDelimiter start=+"+ skip=+\\"+ end=+"+ contains=nixInterpolation,nixSimpleStringSpecial,nixInvalidSimpleStringEscape
+syn region nixString matchgroup=nixStringDelimiter start=+''+ skip=+''['$\\]+ end=+''+ contains=nixInterpolation,nixStringSpecial,nixInvalidStringEscape
+
+syn match nixFunctionCall "[a-zA-Z_][a-zA-Z0-9_'-]*"
+
+syn match nixPath "[a-zA-Z0-9._+-]*\%(/[a-zA-Z0-9._+-]\+\)\+"
+syn match nixHomePath "\~\%(/[a-zA-Z0-9._+-]\+\)\+"
+syn match nixSearchPath "[a-zA-Z0-9._+-]\+\%(\/[a-zA-Z0-9._+-]\+\)*" contained
+syn match nixPathDelimiter "[<>]" contained
+syn match nixSearchPathRef "<[a-zA-Z0-9._+-]\+\%(\/[a-zA-Z0-9._+-]\+\)*>" contains=nixSearchPath,nixPathDelimiter
+syn match nixURI "[a-zA-Z][a-zA-Z0-9.+-]*:[a-zA-Z0-9%/?:@&=$,_.!~*'+-]\+"
+
+syn match nixAttributeDot "\." contained
+syn match nixAttribute "[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%([^a-zA-Z0-9_'.-]\|$\)" contained
+syn region nixAttributeAssignment start="=" end="\ze;" contained contains=@nixExpr
+syn region nixAttributeDefinition start=/\ze[a-zA-Z_"$]/ end=";" contained contains=nixComment,nixAttribute,nixInterpolation,nixSimpleString,nixAttributeDot,nixAttributeAssignment
+
+syn region nixInheritAttributeScope start="(" end="\ze)" contained contains=@nixExpr
+syn region nixAttributeDefinition matchgroup=nixInherit start="\<inherit\>" end=";" contained contains=nixComment,nixInheritAttributeScope,nixAttribute
+
+syn region nixAttributeSet start="{" end="}" contains=nixComment,nixAttributeDefinition
+
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn region nixArgumentDefinitionWithDefault matchgroup=nixArgumentDefinition start="[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*?\@=" matchgroup=NONE end="[,}]\@=" transparent contained contains=@nixExpr
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn match nixArgumentDefinition "[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[,}]\@=" contained
+syn match nixArgumentEllipsis "\.\.\." contained
+syn match nixArgumentSeparator "," contained
+
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn match nixArgOperator '@\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[a-zA-Z_][a-zA-Z0-9_'-]*\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*:'he=s+1 contained contains=nixAttribute
+
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn match nixArgOperator '[a-zA-Z_][a-zA-Z0-9_'-]*\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*@'hs=e-1 contains=nixAttribute nextgroup=nixFunctionArgument
+
+" This is a bit more complicated, because function arguments can be passed in a
+" very similar form on how attribute sets are defined and two regions with the
+" same start patterns will shadow each other. Instead of a region we could use a
+" match on {\_.\{-\}}, which unfortunately doesn't take nesting into account.
+"
+" So what we do instead is that we look forward until we are sure that it's a
+" function argument. Unfortunately, we need to catch comments and both vertical
+" and horizontal white space, which the following regex should hopefully do:
+"
+" "\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*"
+"
+" It is also used throught the whole file and is marked with 'v's as well.
+"
+" Fortunately the matching rules for function arguments are much simpler than
+" for real attribute sets, because we can stop when we hit the first ellipsis or
+" default value operator, but we also need to paste the "whitespace & comments
+" eating" regex all over the place (marked with 'v's):
+"
+" Region match 1: { foo ? ... } or { foo, ... } or { ... } (ellipsis)
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv {----- identifier -----}vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn region nixFunctionArgument start="{\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*\%([a-zA-Z_][a-zA-Z0-9_'-]*\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[,?}]\|\.\.\.\)" end="}" contains=nixComment,nixArgumentDefinitionWithDefault,nixArgumentDefinition,nixArgumentEllipsis,nixArgumentSeparator nextgroup=nixArgOperator
+
+" Now it gets more tricky, because we need to look forward for the colon, but
+" there could be something like "{}@foo:", even though it's highly unlikely.
+"
+" Region match 2: {}
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv@vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv{----- identifier -----} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn region nixFunctionArgument start="{\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*}\%(\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*@\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*[a-zA-Z_][a-zA-Z0-9_'-]*\)\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*:" end="}" contains=nixComment nextgroup=nixArgOperator
+
+" vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+syn match nixSimpleFunctionArgument "[a-zA-Z_][a-zA-Z0-9_'-]*\ze\%(\s\|#.\{-\}\n\|\n\|/\*\_.\{-\}\*/\)*:\([\n ]\)\@="
+
+syn region nixList matchgroup=nixListBracket start="\[" end="\]" contains=@nixExpr
+
+syn region nixLetExpr matchgroup=nixLetExprKeyword start="\<let\>" end="\<in\>" contains=nixComment,nixAttributeDefinition
+
+syn keyword nixIfExprKeyword then contained
+syn region nixIfExpr matchgroup=nixIfExprKeyword start="\<if\>" end="\<else\>" contains=@nixExpr,nixIfExprKeyword
+
+syn region nixWithExpr matchgroup=nixWithExprKeyword start="\<with\>" matchgroup=NONE end=";" contains=@nixExpr
+
+syn region nixAssertExpr matchgroup=nixAssertKeyword start="\<assert\>" matchgroup=NONE end=";" contains=@nixExpr
+
+syn cluster nixExpr contains=nixBoolean,nixNull,nixOperator,nixParen,nixInteger,nixRecKeyword,nixConditional,nixBuiltin,nixSimpleBuiltin,nixComment,nixFunctionCall,nixFunctionArgument,nixArgOperator,nixSimpleFunctionArgument,nixPath,nixHomePath,nixSearchPathRef,nixURI,nixAttributeSet,nixList,nixSimpleString,nixString,nixLetExpr,nixIfExpr,nixWithExpr,nixAssertExpr,nixInterpolation
+
+" These definitions override @nixExpr and have to come afterwards:
+
+syn match nixInterpolationParam "[a-zA-Z_][a-zA-Z0-9_'-]*\%(\.[a-zA-Z_][a-zA-Z0-9_'-]*\)*" contained
+
+" Non-namespaced Nix builtins as of version 2.0:
+syn keyword nixSimpleBuiltin
+ \ abort baseNameOf derivation derivationStrict dirOf fetchGit
+ \ fetchMercurial fetchTarball import isNull map mapAttrs placeholder removeAttrs
+ \ scopedImport throw toString
+
+
+" Namespaced and non-namespaced Nix builtins as of version 2.0:
+syn keyword nixNamespacedBuiltin contained
+ \ abort add addErrorContext all any attrNames attrValues baseNameOf
+ \ catAttrs compareVersions concatLists concatStringsSep currentSystem
+ \ currentTime deepSeq derivation derivationStrict dirOf div elem elemAt
+ \ fetchGit fetchMercurial fetchTarball fetchurl filter \ filterSource
+ \ findFile foldl' fromJSON functionArgs genList \ genericClosure getAttr
+ \ getEnv hasAttr hasContext hashString head import intersectAttrs isAttrs
+ \ isBool isFloat isFunction isInt isList isNull isString langVersion
+ \ length lessThan listToAttrs map mapAttrs match mul nixPath nixVersion
+ \ parseDrvName partition path pathExists placeholder readDir readFile
+ \ removeAttrs replaceStrings scopedImport seq sort split splitVersion
+ \ storeDir storePath stringLength sub substring tail throw toFile toJSON
+ \ toPath toString toXML trace tryEval typeOf unsafeDiscardOutputDependency
+ \ unsafeDiscardStringContext unsafeGetAttrPos valueSize fromTOML bitAnd
+ \ bitOr bitXor floor ceil
+
+syn match nixBuiltin "builtins\.[a-zA-Z']\+"he=s+9 contains=nixComment,nixNamespacedBuiltin
+
+hi def link nixArgOperator Operator
+hi def link nixArgumentDefinition Identifier
+hi def link nixArgumentEllipsis Operator
+hi def link nixAssertKeyword Keyword
+hi def link nixAttribute Identifier
+hi def link nixAttributeDot Operator
+hi def link nixBoolean Boolean
+hi def link nixBuiltin Special
+hi def link nixComment Comment
+hi def link nixConditional Conditional
+hi def link nixHomePath Include
+hi def link nixIfExprKeyword Keyword
+hi def link nixInherit Keyword
+hi def link nixInteger Integer
+hi def link nixInterpolation Macro
+hi def link nixInterpolationDelimiter Delimiter
+hi def link nixInterpolationParam Macro
+hi def link nixInvalidSimpleStringEscape Error
+hi def link nixInvalidStringEscape Error
+hi def link nixLetExprKeyword Keyword
+hi def link nixNamespacedBuiltin Special
+hi def link nixNull Constant
+hi def link nixOperator Operator
+hi def link nixPath Include
+hi def link nixPathDelimiter Delimiter
+hi def link nixRecKeyword Keyword
+hi def link nixSearchPath Include
+hi def link nixSimpleBuiltin Keyword
+hi def link nixSimpleFunctionArgument Identifier
+hi def link nixSimpleString String
+hi def link nixSimpleStringSpecial SpecialChar
+hi def link nixString String
+hi def link nixStringDelimiter Delimiter
+hi def link nixStringSpecial Special
+hi def link nixTodo Todo
+hi def link nixURI Include
+hi def link nixWithExprKeyword Keyword
+
+" This could lead up to slow syntax highlighting for large files, but usually
+" large files such as all-packages.nix are one large attribute set, so if we'd
+" use sync patterns we'd have to go back to the start of the file anyway
+syn sync fromstart
+
+let b:current_syntax = "nix"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/nosyntax.vim b/runtime/syntax/nosyntax.vim
new file mode 100644
index 0000000..0ab3412
--- /dev/null
+++ b/runtime/syntax/nosyntax.vim
@@ -0,0 +1,30 @@
+" Vim syntax support file
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2006 Apr 16
+
+" This file is used for ":syntax off".
+" It removes the autocommands and stops highlighting for all buffers.
+
+if !has("syntax")
+ finish
+endif
+
+" Remove all autocommands for the Syntax event. This also avoids that
+" "syntax=foo" in a modeline triggers the SynSet() function of synload.vim.
+au! Syntax
+
+" remove all syntax autocommands and remove the syntax for each buffer
+augroup syntaxset
+ au!
+ au BufEnter * syn clear
+ au BufEnter * if exists("b:current_syntax") | unlet b:current_syntax | endif
+ doautoall syntaxset BufEnter *
+ au!
+augroup END
+
+if exists("syntax_on")
+ unlet syntax_on
+endif
+if exists("syntax_manual")
+ unlet syntax_manual
+endif
diff --git a/runtime/syntax/nqc.vim b/runtime/syntax/nqc.vim
new file mode 100644
index 0000000..d09c106
--- /dev/null
+++ b/runtime/syntax/nqc.vim
@@ -0,0 +1,365 @@
+" Vim syntax file
+" Language: NQC - Not Quite C, for LEGO mindstorms
+" NQC homepage: http://www.enteract.com/~dbaum/nqc/
+" Maintainer: Stefan Scherer <stefan@enotes.de>
+" Last Change: 2001 May 10
+" URL: http://www.enotes.de/twiki/pub/Home/LegoMindstorms/nqc.vim
+" Filenames: .nqc
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Statements
+syn keyword nqcStatement break return continue start stop abs sign
+syn keyword nqcStatement sub task
+syn keyword nqcLabel case default
+syn keyword nqcConditional if else switch
+syn keyword nqcRepeat while for do until repeat
+
+" Scout and RCX2
+syn keyword nqcEvents acquire catch monitor
+
+" types and classes
+syn keyword nqcType int true false void
+syn keyword nqcStorageClass asm const inline
+
+
+
+" Sensors --------------------------------------------
+" Input Sensors
+syn keyword nqcConstant SENSOR_1 SENSOR_2 SENSOR_3
+
+" Types for SetSensorType()
+syn keyword nqcConstant SENSOR_TYPE_TOUCH SENSOR_TYPE_TEMPERATURE
+syn keyword nqcConstant SENSOR_TYPE_LIGHT SENSOR_TYPE_ROTATION
+syn keyword nqcConstant SENSOR_LIGHT SENSOR_TOUCH
+
+" Modes for SetSensorMode()
+syn keyword nqcConstant SENSOR_MODE_RAW SENSOR_MODE_BOOL
+syn keyword nqcConstant SENSOR_MODE_EDGE SENSOR_MODE_PULSE
+syn keyword nqcConstant SENSOR_MODE_PERCENT SENSOR_MODE_CELSIUS
+syn keyword nqcConstant SENSOR_MODE_FAHRENHEIT SENSOR_MODE_ROTATION
+
+" Sensor configurations for SetSensor()
+syn keyword nqcConstant SENSOR_TOUCH SENSOR_LIGHT SENSOR_ROTATION
+syn keyword nqcConstant SENSOR_CELSIUS SENSOR_FAHRENHEIT SENSOR_PULSE
+syn keyword nqcConstant SENSOR_EDGE
+
+" Functions - All
+syn keyword nqcFunction ClearSensor
+syn keyword nqcFunction SensorValue SensorType
+
+" Functions - RCX
+syn keyword nqcFunction SetSensor SetSensorType
+syn keyword nqcFunction SensorValueBool
+
+" Functions - RCX, CyberMaster
+syn keyword nqcFunction SetSensorMode SensorMode
+
+" Functions - RCX, Scout
+syn keyword nqcFunction SensorValueRaw
+
+" Functions - Scout
+syn keyword nqcFunction SetSensorLowerLimit SetSensorUpperLimit
+syn keyword nqcFunction SetSensorHysteresis CalibrateSensor
+
+
+" Outputs --------------------------------------------
+" Outputs for On(), Off(), etc.
+syn keyword nqcConstant OUT_A OUT_B OUT_C
+
+" Modes for SetOutput()
+syn keyword nqcConstant OUT_ON OUT_OFF OUT_FLOAT
+
+" Directions for SetDirection()
+syn keyword nqcConstant OUT_FWD OUT_REV OUT_TOGGLE
+
+" Output power for SetPower()
+syn keyword nqcConstant OUT_LOW OUT_HALF OUT_FULL
+
+" Functions - All
+syn keyword nqcFunction SetOutput SetDirection SetPower OutputStatus
+syn keyword nqcFunction On Off Float Fwd Rev Toggle
+syn keyword nqcFunction OnFwd OnRev OnFor
+
+" Functions - RXC2, Scout
+syn keyword nqcFunction SetGlobalOutput SetGlobalDirection SetMaxPower
+syn keyword nqcFunction GlobalOutputStatus
+
+
+" Sound ----------------------------------------------
+" Sounds for PlaySound()
+syn keyword nqcConstant SOUND_CLICK SOUND_DOUBLE_BEEP SOUND_DOWN
+syn keyword nqcConstant SOUND_UP SOUND_LOW_BEEP SOUND_FAST_UP
+
+" Functions - All
+syn keyword nqcFunction PlaySound PlayTone
+
+" Functions - RCX2, Scout
+syn keyword nqcFunction MuteSound UnmuteSound ClearSound
+syn keyword nqcFunction SelectSounds
+
+
+" LCD ------------------------------------------------
+" Modes for SelectDisplay()
+syn keyword nqcConstant DISPLAY_WATCH DISPLAY_SENSOR_1 DISPLAY_SENSOR_2
+syn keyword nqcConstant DISPLAY_SENSOR_3 DISPLAY_OUT_A DISPLAY_OUT_B
+syn keyword nqcConstant DISPLAY_OUT_C
+" RCX2
+syn keyword nqcConstant DISPLAY_USER
+
+" Functions - RCX
+syn keyword nqcFunction SelectDisplay
+" Functions - RCX2
+syn keyword nqcFunction SetUserDisplay
+
+
+" Communication --------------------------------------
+" Messages - RCX, Scout ------------------------------
+" Tx power level for SetTxPower()
+syn keyword nqcConstant TX_POWER_LO TX_POWER_HI
+
+" Functions - RCX, Scout
+syn keyword nqcFunction Message ClearMessage SendMessage SetTxPower
+
+" Serial - RCX2 --------------------------------------
+" for SetSerialComm()
+syn keyword nqcConstant SERIAL_COMM_DEFAULT SERIAL_COMM_4800
+syn keyword nqcConstant SERIAL_COMM_DUTY25 SERIAL_COMM_76KHZ
+
+" for SetSerialPacket()
+syn keyword nqcConstant SERIAL_PACKET_DEFAULT SERIAL_PACKET_PREAMBLE
+syn keyword nqcConstant SERIAL_PACKET_NEGATED SERIAL_PACKET_CHECKSUM
+syn keyword nqcConstant SERIAL_PACKET_RCX
+
+" Functions - RCX2
+syn keyword nqcFunction SetSerialComm SetSerialPacket SetSerialData
+syn keyword nqcFunction SerialData SendSerial
+
+" VLL - Scout ----------------------------------------
+" Functions - Scout
+syn keyword nqcFunction SendVLL
+
+
+" Timers ---------------------------------------------
+" Functions - All
+syn keyword nqcFunction ClearTimer Timer
+
+" Functions - RCX2
+syn keyword nqcFunction SetTimer FastTimer
+
+
+" Counters -------------------------------------------
+" Functions - RCX2, Scout
+syn keyword nqcFunction ClearCounter IncCounter DecCounter Counter
+
+
+" Access Control -------------------------------------
+syn keyword nqcConstant ACQUIRE_OUT_A ACQUIRE_OUT_B ACQUIRE_OUT_C
+syn keyword nqcConstant ACQUIRE_SOUND
+" RCX2 only
+syn keyword nqcConstant ACQUIRE_USER_1 ACQUIRE_USER_2 ACQUIRE_USER_3
+syn keyword nqcConstant ACQUIRE_USER_4
+
+" Functions - RCX2, Scout
+syn keyword nqcFunction SetPriority
+
+
+" Events ---------------------------------------------
+" RCX2 Events
+syn keyword nqcConstant EVENT_TYPE_PRESSED EVENT_TYPE_RELEASED
+syn keyword nqcConstant EVENT_TYPE_PULSE EVENT_TYPE_EDGE
+syn keyword nqcConstant EVENT_TYPE_FAST_CHANGE EVENT_TYPE_LOW
+syn keyword nqcConstant EVENT_TYPE_NORMAL EVENT_TYPE_HIGH
+syn keyword nqcConstant EVENT_TYPE_CLICK EVENT_TYPE_DOUBLECLICK
+syn keyword nqcConstant EVENT_TYPE_MESSAGE
+
+" Scout Events
+syn keyword nqcConstant EVENT_1_PRESSED EVENT_1_RELEASED
+syn keyword nqcConstant EVENT_2_PRESSED EVENT_2_RELEASED
+syn keyword nqcConstant EVENT_LIGHT_HIGH EVENT_LIGHT_NORMAL
+syn keyword nqcConstant EVENT_LIGHT_LOW EVENT_LIGHT_CLICK
+syn keyword nqcConstant EVENT_LIGHT_DOUBLECLICK EVENT_COUNTER_0
+syn keyword nqcConstant EVENT_COUNTER_1 EVENT_TIMER_0 EVENT_TIMER_1
+syn keyword nqcConstant EVENT_TIMER_2 EVENT_MESSAGE
+
+" Functions - RCX2, Scout
+syn keyword nqcFunction ActiveEvents Event
+
+" Functions - RCX2
+syn keyword nqcFunction CurrentEvents
+syn keyword nqcFunction SetEvent ClearEvent ClearAllEvents EventState
+syn keyword nqcFunction CalibrateEvent SetUpperLimit UpperLimit
+syn keyword nqcFunction SetLowerLimit LowerLimit SetHysteresis
+syn keyword nqcFunction Hysteresis
+syn keyword nqcFunction SetClickTime ClickTime SetClickCounter
+syn keyword nqcFunction ClickCounter
+
+" Functions - Scout
+syn keyword nqcFunction SetSensorClickTime SetCounterLimit
+syn keyword nqcFunction SetTimerLimit
+
+
+" Data Logging ---------------------------------------
+" Functions - RCX
+syn keyword nqcFunction CreateDatalog AddToDatalog
+syn keyword nqcFunction UploadDatalog
+
+
+" General Features -----------------------------------
+" Functions - All
+syn keyword nqcFunction Wait StopAllTasks Random
+syn keyword nqcFunction SetSleepTime SleepNow
+
+" Functions - RCX
+syn keyword nqcFunction Program Watch SetWatch
+
+" Functions - RCX2
+syn keyword nqcFunction SetRandomSeed SelectProgram
+syn keyword nqcFunction BatteryLevel FirmwareVersion
+
+" Functions - Scout
+" Parameters for SetLight()
+syn keyword nqcConstant LIGHT_ON LIGHT_OFF
+syn keyword nqcFunction SetScoutRules ScoutRules SetScoutMode
+syn keyword nqcFunction SetEventFeedback EventFeedback SetLight
+
+" additional CyberMaster defines
+syn keyword nqcConstant OUT_L OUT_R OUT_X
+syn keyword nqcConstant SENSOR_L SENSOR_M SENSOR_R
+" Functions - CyberMaster
+syn keyword nqcFunction Drive OnWait OnWaitDifferent
+syn keyword nqcFunction ClearTachoCounter TachoCount TachoSpeed
+syn keyword nqcFunction ExternalMotorRunning AGC
+
+
+
+" nqcCommentGroup allows adding matches for special things in comments
+syn keyword nqcTodo contained TODO FIXME XXX
+syn cluster nqcCommentGroup contains=nqcTodo
+
+"when wanted, highlight trailing white space
+if exists("nqc_space_errors")
+ if !exists("nqc_no_trail_space_error")
+ syn match nqcSpaceError display excludenl "\s\+$"
+ endif
+ if !exists("nqc_no_tab_space_error")
+ syn match nqcSpaceError display " \+\t"me=e-1
+ endif
+endif
+
+"catch errors caused by wrong parenthesis and brackets
+syn cluster nqcParenGroup contains=nqcParenError,nqcIncluded,nqcCommentSkip,@nqcCommentGroup,nqcCommentStartError,nqcCommentSkip,nqcCppOut,nqcCppOut2,nqcCppSkip,nqcNumber,nqcFloat,nqcNumbers
+if exists("nqc_no_bracket_error")
+ syn region nqcParen transparent start='(' end=')' contains=ALLBUT,@nqcParenGroup,nqcCppParen
+ " nqcCppParen: same as nqcParen but ends at end-of-line; used in nqcDefine
+ syn region nqcCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@nqcParenGroup,nqcParen
+ syn match nqcParenError display ")"
+ syn match nqcErrInParen display contained "[{}]"
+else
+ syn region nqcParen transparent start='(' end=')' contains=ALLBUT,@nqcParenGroup,nqcCppParen,nqcErrInBracket,nqcCppBracket
+ " nqcCppParen: same as nqcParen but ends at end-of-line; used in nqcDefine
+ syn region nqcCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@nqcParenGroup,nqcErrInBracket,nqcParen,nqcBracket
+ syn match nqcParenError display "[\])]"
+ syn match nqcErrInParen display contained "[\]{}]"
+ syn region nqcBracket transparent start='\[' end=']' contains=ALLBUT,@nqcParenGroup,nqcErrInParen,nqcCppParen,nqcCppBracket
+ " nqcCppBracket: same as nqcParen but ends at end-of-line; used in nqcDefine
+ syn region nqcCppBracket transparent start='\[' skip='\\$' excludenl end=']' end='$' contained contains=ALLBUT,@nqcParenGroup,nqcErrInParen,nqcParen,nqcBracket
+ syn match nqcErrInBracket display contained "[);{}]"
+endif
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match nqcNumbers display transparent "\<\d\|\.\d" contains=nqcNumber,nqcFloat
+" Same, but without octal error (for comments)
+syn match nqcNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
+"hex number
+syn match nqcNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+" Flag the first zero of an octal number as something special
+syn match nqcFloat display contained "\d\+f"
+"floating point number, with dot, optional exponent
+syn match nqcFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
+"floating point number, starting with a dot, optional exponent
+syn match nqcFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match nqcFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>"
+" flag an octal number with wrong digits
+syn case match
+
+syn region nqcCommentL start="//" skip="\\$" end="$" keepend contains=@nqcCommentGroup,nqcSpaceError
+syn region nqcComment matchgroup=nqcCommentStart start="/\*" matchgroup=NONE end="\*/" contains=@nqcCommentGroup,nqcCommentStartError,nqcSpaceError
+
+" keep a // comment separately, it terminates a preproc. conditional
+syntax match nqcCommentError display "\*/"
+syntax match nqcCommentStartError display "/\*" contained
+
+
+
+
+
+syn region nqcPreCondit start="^\s*#\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=nqcComment,nqcCharacter,nqcCppParen,nqcParenError,nqcNumbers,nqcCommentError,nqcSpaceError
+syn match nqcPreCondit display "^\s*#\s*\(else\|endif\)\>"
+if !exists("nqc_no_if0")
+ syn region nqcCppOut start="^\s*#\s*if\s\+0\>" end=".\|$" contains=nqcCppOut2
+ syn region nqcCppOut2 contained start="0" end="^\s*#\s*\(endif\>\|else\>\|elif\>\)" contains=nqcSpaceError,nqcCppSkip
+ syn region nqcCppSkip contained start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*#\s*endif\>" contains=nqcSpaceError,nqcCppSkip
+endif
+syn region nqcIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match nqcInclude display "^\s*#\s*include\>\s*["]" contains=nqcIncluded
+"syn match nqcLineSkip "\\$"
+syn cluster nqcPreProcGroup contains=nqcPreCondit,nqcIncluded,nqcInclude,nqcDefine,nqcErrInParen,nqcErrInBracket,nqcCppOut,nqcCppOut2,nqcCppSkip,nqcNumber,nqcFloat,nqcNumbers,nqcCommentSkip,@nqcCommentGroup,nqcCommentStartError,nqcParen,nqcBracket
+syn region nqcDefine start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" contains=ALLBUT,@nqcPreProcGroup
+syn region nqcPreProc start="^\s*#\s*\(pragma\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@nqcPreProcGroup
+
+if !exists("nqc_minlines")
+ if !exists("nqc_no_if0")
+ let nqc_minlines = 50 " #if 0 constructs can be long
+ else
+ let nqc_minlines = 15 " mostly for () constructs
+ endif
+endif
+exec "syn sync ccomment nqcComment minlines=" . nqc_minlines
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "nqc"
+
+" vim: ts=8
diff --git a/runtime/syntax/nroff.vim b/runtime/syntax/nroff.vim
new file mode 100644
index 0000000..5667042
--- /dev/null
+++ b/runtime/syntax/nroff.vim
@@ -0,0 +1,249 @@
+" VIM syntax file
+" Language: nroff/groff
+" Maintainer: John Marshall <jmarshall@hey.com>
+" Previous Maintainer: Pedro Alejandro López-Valencia <palopezv@gmail.com>
+" Previous Maintainer: Jérôme Plût <Jerome.Plut@ens.fr>
+" Last Change: 2021 Mar 28
+"
+" {{{1 Todo
+"
+" TODO:
+"
+" * Write syntax highlighting files for the preprocessors,
+" and integrate with nroff.vim.
+"
+"
+" {{{1 Start syntax highlighting.
+"
+" quit when a syntax file was already loaded
+"
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if exists("nroff_is_groff")
+ let b:nroff_is_groff = 1
+endif
+
+syn spell toplevel
+syn case match
+
+"
+" {{{1 plugin settings...
+"
+" {{{2 enable spacing error highlighting
+"
+if exists("nroff_space_errors")
+ syn match nroffError /\s\+$/
+ syn match nroffSpaceError /[.,:;!?]\s\{2,}/
+endif
+"
+"
+" {{{1 Special file settings
+"
+" {{{2 ms exdented paragraphs are not in the default paragraphs list.
+"
+setlocal paragraphs+=XP
+"
+" {{{2 Activate navigation to preprocessor sections.
+"
+if exists("b:preprocs_as_sections")
+ setlocal sections=EQTSPS[\ G1GS
+endif
+
+" {{{1 Escape sequences
+" ------------------------------------------------------------
+
+syn match nroffEscChar /\\[CN]/ nextgroup=nroffEscCharArg
+syn match nroffEscape /\\[*fgmnYV]/ nextgroup=nroffEscRegPar,nroffEscRegArg
+syn match nroffEscape /\\s[+-]\=/ nextgroup=nroffSize
+syn match nroffEscape /\\[$AbDhlLRvxXZ]/ nextgroup=nroffEscPar,nroffEscArg
+
+syn match nroffEscRegArg /./ contained
+syn match nroffEscRegArg2 /../ contained
+syn match nroffEscRegPar /(/ contained nextgroup=nroffEscRegArg2
+syn match nroffEscArg /./ contained
+syn match nroffEscArg2 /../ contained
+syn match nroffEscPar /(/ contained nextgroup=nroffEscArg2
+syn match nroffSize /\((\d\)\=\d/ contained
+
+syn region nroffEscCharArg start=/'/ end=/'/ contained
+syn region nroffEscArg start=/'/ end=/'/ contained contains=nroffEscape,@nroffSpecial
+
+if exists("b:nroff_is_groff")
+ syn region nroffEscRegArg matchgroup=nroffEscape start=/\[/ end=/\]/ contained oneline
+ syn region nroffSize matchgroup=nroffEscape start=/\[/ end=/\]/ contained
+endif
+
+syn match nroffEscape /\\[adprtu{}]/
+syn match nroffEscape /\\$/
+syn match nroffEscape /\\\$[@*]/
+
+" {{{1 Strings and special characters
+" ------------------------------------------------------------
+
+syn match nroffSpecialChar /\\[\\eE?!-]/
+syn match nroffSpace "\\[&%~|^0)/,]"
+syn match nroffSpecialChar /\\(../
+
+if exists("b:nroff_is_groff")
+ syn match nroffSpecialChar /\\\[[^]]*]/
+ syn region nroffPreserve matchgroup=nroffSpecialChar start=/\\?/ end=/\\?/ oneline
+endif
+
+syn region nroffPreserve matchgroup=nroffSpecialChar start=/\\!/ end=/$/ oneline
+
+syn cluster nroffSpecial contains=nroffSpecialChar,nroffSpace
+
+
+syn region nroffString start=/"/ end=/"/ skip=/\\$/ contains=nroffEscape,@nroffSpecial contained
+syn region nroffString start=/'/ end=/'/ skip=/\\$/ contains=nroffEscape,@nroffSpecial contained
+
+
+" {{{1 Numbers and units
+" ------------------------------------------------------------
+syn match nroffNumBlock /[0-9.]\a\=/ contained contains=nroffNumber
+syn match nroffNumber /\d\+\(\.\d*\)\=/ contained nextgroup=nroffUnit,nroffBadChar
+syn match nroffNumber /\.\d\+)/ contained nextgroup=nroffUnit,nroffBadChar
+syn match nroffBadChar /./ contained
+syn match nroffUnit /[icpPszmnvMu]/ contained
+
+
+" {{{1 Requests
+" ------------------------------------------------------------
+
+" Requests begin with . or ' at the beginning of a line, or
+" after .if or .ie.
+
+syn match nroffReqLeader /^[.']/ nextgroup=nroffReqName skipwhite
+syn match nroffReqLeader /[.']/ contained nextgroup=nroffReqName skipwhite
+
+if exists("b:nroff_is_groff")
+"
+" GNU troff allows long request names
+"
+ syn match nroffReqName /[^\t \\\[?]\+/ contained nextgroup=nroffReqArg
+else
+ syn match nroffReqName /[^\t \\\[?]\{1,2}/ contained nextgroup=nroffReqArg
+endif
+
+syn region nroffReqArg start=/\S/ skip=/\\$/ end=/$/ contained contains=nroffEscape,@nroffSpecial,nroffString,nroffError,nroffSpaceError,nroffNumBlock,nroffComment
+
+" {{{2 Conditional: .if .ie .el
+syn match nroffReqName /\(if\|ie\)/ contained nextgroup=nroffCond skipwhite
+syn match nroffReqName /el/ contained nextgroup=nroffReqLeader skipwhite
+syn match nroffCond /\S\+/ contained nextgroup=nroffReqLeader skipwhite
+
+" {{{2 String definition: .ds .as
+syn match nroffReqname /[da]s/ contained nextgroup=nroffDefIdent skipwhite
+syn match nroffDefIdent /\S\+/ contained nextgroup=nroffDefinition skipwhite
+syn region nroffDefinition matchgroup=nroffSpecialChar start=/"/ matchgroup=NONE end=/\\"/me=e-2 skip=/\\$/ start=/\S/ end=/$/ contained contains=nroffDefSpecial
+syn match nroffDefSpecial /\\$/ contained
+syn match nroffDefSpecial /\\\((.\)\=./ contained
+
+if exists("b:nroff_is_groff")
+ syn match nroffDefSpecial /\\\[[^]]*]/ contained
+endif
+
+" {{{2 Macro definition: .de .am, also diversion: .di
+syn match nroffReqName /\(d[ei]\|am\)/ contained nextgroup=nroffIdent skipwhite
+syn match nroffIdent /[^[?( \t]\+/ contained
+if exists("b:nroff_is_groff")
+ syn match nroffReqName /als/ contained nextgroup=nroffIdent skipwhite
+endif
+
+" {{{2 Register definition: .rn .rr
+syn match nroffReqName /[rn]r/ contained nextgroup=nroffIdent skipwhite
+if exists("b:nroff_is_groff")
+ syn match nroffReqName /\(rnn\|aln\)/ contained nextgroup=nroffIdent skipwhite
+endif
+
+
+" {{{1 eqn/tbl/pic
+" ------------------------------------------------------------
+" <jp>
+" XXX: write proper syntax highlight for eqn / tbl / pic ?
+" <jp />
+
+syn region nroffEquation start=/^\.\s*EQ\>/ end=/^\.\s*EN\>/
+syn region nroffTable start=/^\.\s*TS\>/ end=/^\.\s*TE\>/ contains=@Spell
+syn region nroffPicture start=/^\.\s*PS\>/ end=/^\.\s*PE\>/
+syn region nroffRefer start=/^\.\s*\[\>/ end=/^\.\s*\]\>/ contains=@Spell
+syn region nroffGrap start=/^\.\s*G1\>/ end=/^\.\s*G2\>/
+syn region nroffGremlin start=/^\.\s*GS\>/ end=/^\.\s*GE|GF\>/
+
+" {{{1 Comments
+" ------------------------------------------------------------
+
+syn region nroffIgnore start=/^[.']\s*ig/ end=/^['.]\s*\./
+syn match nroffComment /\(^[.']\s*\)\=\\".*/ contains=nroffTodo,@Spell
+syn match nroffComment /^'''.*/ contains=nroffTodo,@Spell
+
+if exists("b:nroff_is_groff")
+ syn match nroffComment "\\#.*$" contains=nroffTodo,@Spell
+endif
+
+syn keyword nroffTodo TODO XXX FIXME contained
+
+" {{{1 Hilighting
+" ------------------------------------------------------------
+"
+
+"
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+"
+
+hi def link nroffEscChar nroffSpecialChar
+hi def link nroffEscCharArg 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim600: set fdm=marker fdl=2:
diff --git a/runtime/syntax/nsis.vim b/runtime/syntax/nsis.vim
new file mode 100644
index 0000000..49fa17a
--- /dev/null
+++ b/runtime/syntax/nsis.vim
@@ -0,0 +1,730 @@
+" Vim syntax file
+" Language: NSIS script, for version of NSIS 3.08 and later
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/vim-nsis
+" Previous Maintainer: Alex Jakushev <Alex.Jakushev@kemek.lt>
+" Last Change: 2022-11-05
+
+" 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
+
+
+"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,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"
+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 "$\%(USERTEMPLATES\|USERSTARTMENU\|USERSMPROGRAMS\|USERDESKTOP\)"
+syn match nsisSysVar "$\%(COMMONTEMPLATES\|COMMONSTARTMENU\|COMMONSMPROGRAMS\|COMMONDESKTOP\|COMMONPROGRAMDATA\)"
+syn match nsisSysVar "$\\r"
+syn match nsisSysVar "$\\n"
+syn match nsisSysVar "$\\t"
+syn match nsisSysVar "$\$"
+syn match nsisSysVar "$\\["'`]"
+
+"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 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 SectionInstType 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 ManifestLongPathAware nextgroup=nsisManifestLongPathAwareOpt skipwhite
+syn region nsisManifestLongPathAwareOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisManifestLongPathAwareKwd
+syn match nsisManifestLongPathAwareKwd 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 PEAddResource nextgroup=nsisPEAddResourceOpt skipwhite
+syn region nsisPEAddResourceOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisPEAddResourceKwd
+syn match nsisPEAddResourceKwd contained "/\%(OVERWRITE\|REPLACE\)\>"
+
+syn keyword nsisAttribute contained PERemoveResource nextgroup=nsisPERemoveResourceOpt skipwhite
+syn region nsisPERemoveResourceOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisPERemoveResourceKwd
+syn match nsisPERemoveResourceKwd contained "/NOERRORS\>"
+
+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\)\>"
+
+
+"FUNCTIONS - registry & ini (4.9.2)
+syn keyword nsisInstruction contained DeleteINISec DeleteINIStr FlushINI ReadINIStr WriteINIStr
+syn keyword nsisInstruction contained ExpandEnvStrings ReadEnvStr
+
+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\|ifnosubkeys\|ifnovalues\)\>"
+
+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
+
+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\>"
+
+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
+
+"FUNCTIONS - general purpose (4.9.3)
+syn keyword nsisInstruction contained CallInstDLL CreateDirectory GetWinVer
+syn keyword nsisInstruction contained GetFileTime GetFileTimeLocal GetKnownFolderPath
+syn keyword nsisInstruction contained GetTempFileName SearchPath RegDLL UnRegDLL
+
+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\)\>"
+
+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 GetWinVer nextgroup=nsisGetWinVerOpt skipwhite
+syn region nsisGetWinVerOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisGetWinVerKwd
+syn keyword nsisGetWinVerKwd contained Major Minor Build ServicePack
+
+syn keyword nsisInstruction contained GetDLLVersion GetDLLVersionLocal nextgroup=nsisGetDLLVersionOpt skipwhite
+syn region nsisGetDLLVersionOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisGetDLLVersionKwd
+syn match nsisGetDLLVersionKwd contained "/ProductVersion\>"
+
+syn keyword nsisInstruction contained GetFullPathName nextgroup=nsisGetFullPathNameOpt skipwhite
+syn region nsisGetFullPathNameOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisGetFullPathNameKwd
+syn match nsisGetFullPathNameKwd contained "/SHORT\>"
+
+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 - 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 IfShellVarContextAll IfRtlLanguage
+syn keyword nsisInstruction contained IntCmp IntCmpU Int64Cmp Int64CmpU IntPtrCmp IntPtrCmpU
+syn keyword nsisInstruction contained Return Quit SetErrors StrCmp StrCmpS
+
+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 - 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
+
+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 - Uninstaller instructions (4.9.6)
+syn keyword nsisInstruction contained WriteUninstaller
+
+"FUNCTIONS - Misc instructions (4.9.7)
+syn keyword nsisInstruction contained GetErrorLevel GetInstDirError InitPluginsDir Nop
+syn keyword nsisInstruction contained SetErrorLevel Sleep
+
+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 - String manipulation support (4.9.8)
+syn keyword nsisInstruction contained StrCpy StrLen
+
+"FUNCTIONS - Stack support (4.9.9)
+syn keyword nsisInstruction contained Exch Push Pop
+
+"FUNCTIONS - Integer manipulation support (4.9.10)
+syn keyword nsisInstruction contained IntFmt Int64Fmt IntOp IntPtrOp
+
+"FUNCTIONS - Rebooting support (4.9.11)
+syn keyword nsisInstruction contained Reboot SetRebootFlag
+
+"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
+
+"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 LoadAndSetImage nextgroup=nsisLoadAndSetImageOpt skipwhite
+syn region nsisLoadAndSetImageOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisLoadAndSetImageKwd
+syn match nsisLoadAndSetImageKwd contained "/\%(EXERESOURCE\|STRINGID\|RESIZETOFIT\%(WIDTH\|HEIGHT\)\)\>"
+
+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 "\.onInstFailed"
+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 (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"
+
+
+"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 "!uninstfinalize\>"
+syn match nsisSystem contained "!system\>"
+syn match nsisSystem contained "!tempfile\>"
+
+" Add 'P' to avoid conflicts with nsisGetDLLVersionOpt. ('P' for preprocessor.)
+syn match nsisSystem contained "!getdllversion\>" nextgroup=nsisPGetdllversionOpt skipwhite
+syn region nsisPGetdllversionOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisPGetdllversionKwd
+syn match nsisPGetdllversionKwd contained "/\%(noerrors\|packed\|productversion\)\>"
+
+syn match nsisSystem contained "!gettlbversion\>" nextgroup=nsisPGettlbversionOpt skipwhite
+syn region nsisPGettlbversionOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisPGettlbversionKwd
+syn match nsisPGettlbversionKwd contained "/\%(noerrors\|packed\)\>"
+
+syn match nsisSystem contained "!warning\>"
+
+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
+
+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\|file\|intfmt\|math\)\>"
+
+syn match nsisDefine contained "!undef\>" nextgroup=nsisUndefineOpt skipwhite
+syn region nsisUndefineOpt contained start="" end="$" transparent keepend contains=@nsisAnyOpt,nsisUndefineKwd
+syn match nsisUndefineKwd contained "/noerrors\>"
+
+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\>"
+
+
+
+" Define the default highlighting.
+" 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 nsisManifestLongPathAwareKwd Constant
+hi def link nsisManifestSupportedOSKwd Constant
+hi def link nsisPEAddResourceKwd Constant
+hi def link nsisPERemoveResourceKwd 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 nsisGetWinVerKwd Constant
+hi def link nsisGetDLLVersionKwd 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 nsisLoadAndSetImageKwd 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 nsisPGetdllversionKwd Constant
+hi def link nsisPGettlbversionKwd Constant
+hi def link nsisPragmaKwd Constant
+hi def link nsisVerboseKwd Constant
+hi def link nsisDefineKwd Constant
+hi def link nsisUndefineKwd 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
new file mode 100644
index 0000000..df4dbca
--- /dev/null
+++ b/runtime/syntax/obj.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: 3D wavefront's obj file
+" Maintainer: Vincent Berthoux <twinside@gmail.com>
+" File Types: .obj (used in 3D)
+" Last Change: 2010 May 18
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match objError "^\a\+"
+
+syn match objKeywords "^cstype\s"
+syn match objKeywords "^ctech\s"
+syn match objKeywords "^stech\s"
+syn match objKeywords "^deg\s"
+syn match objKeywords "^curv\(2\?\)\s"
+syn match objKeywords "^parm\s"
+syn match objKeywords "^surf\s"
+syn match objKeywords "^end\s"
+syn match objKeywords "^bzp\s"
+syn match objKeywords "^bsp\s"
+syn match objKeywords "^res\s"
+syn match objKeywords "^cdc\s"
+syn match objKeywords "^con\s"
+
+syn match objKeywords "^shadow_obj\s"
+syn match objKeywords "^trace_obj\s"
+syn match objKeywords "^usemap\s"
+syn match objKeywords "^lod\s"
+syn match objKeywords "^maplib\s"
+syn match objKeywords "^d_interp\s"
+syn match objKeywords "^c_interp\s"
+syn match objKeywords "^bevel\s"
+syn match objKeywords "^mg\s"
+syn match objKeywords "^s\s"
+syn match objKeywords "^con\s"
+syn match objKeywords "^trim\s"
+syn match objKeywords "^hole\s"
+syn match objKeywords "^scrv\s"
+syn match objKeywords "^sp\s"
+syn match objKeywords "^step\s"
+syn match objKeywords "^bmat\s"
+syn match objKeywords "^csh\s"
+syn match objKeywords "^call\s"
+
+syn match objComment "^#.*"
+syn match objVertex "^v\s"
+syn match objFace "^f\s"
+syn match objVertice "^vt\s"
+syn match objNormale "^vn\s"
+syn match objGroup "^g\s.*"
+syn match objMaterial "^usemtl\s.*"
+syn match objInclude "^mtllib\s.*"
+
+syn match objFloat "-\?\d\+\.\d\+\(e\(+\|-\)\d\+\)\?"
+syn match objInt "\d\+"
+syn match objIndex "\d\+\/\d*\/\d*"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+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
+
+
+
+let b:current_syntax = "obj"
+
+" vim: ts=8
diff --git a/runtime/syntax/objc.vim b/runtime/syntax/objc.vim
new file mode 100644
index 0000000..7c6e2d5
--- /dev/null
+++ b/runtime/syntax/objc.vim
@@ -0,0 +1,534 @@
+" Vim syntax file
+" Language: Objective-C
+" Maintainer: Kazunobu Kuriyama <kazunobu.kuriyama@gmail.com>
+" Last Change: 2020 Jun 07
+" Last Change By Maintainer: 2015 Dec 14
+
+""" Preparation for loading ObjC stuff
+if exists("b:current_syntax")
+ finish
+endif
+if &filetype != 'objcpp'
+ syn clear
+ runtime! syntax/c.vim
+endif
+let s:cpo_save = &cpo
+set cpo&vim
+
+""" ObjC proper stuff follows...
+
+syn keyword objcPreProcMacro __OBJC__ __OBJC2__ __clang__
+
+" Defined Types
+syn keyword objcPrincipalType id Class SEL IMP BOOL instancetype
+syn keyword objcUsefulTerm nil Nil NO YES
+
+" Preprocessor Directives
+syn region objcImported display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match objcImported display contained "\(<\h[-+a-zA-Z0-9_/]*\.h>\|<[a-z0-9]\+>\)"
+syn match objcImport display "^\s*\(%:\|#\)\s*import\>\s*["<]" contains=objcImported
+
+" ObjC Compiler Directives
+syn match objcObjDef display /@interface\>\|@implementation\>\|@end\>\|@class\>/
+syn match objcProtocol display /@protocol\>\|@optional\>\|@required\>/
+syn match objcProperty display /@property\>\|@synthesize\>\|@dynamic\>/
+syn match objcIvarScope display /@private\>\|@protected\>\|@public\>\|@package\>/
+syn match objcInternalRep display /@selector\>\|@encode\>/
+syn match objcException display /@try\>\|@throw\>\|@catch\|@finally\>/
+syn match objcThread display /@synchronized\>/
+syn match objcPool display /@autoreleasepool\>/
+syn match objcModuleImport display /@import\>/
+
+" ObjC Constant Strings
+syn match objcSpecial display contained "%@"
+syn region objcString start=+\(@"\|"\)+ skip=+\\\\\|\\"+ end=+"+ contains=cFormat,cSpecial,objcSpecial
+
+" ObjC Hidden Arguments
+syn keyword objcHiddenArgument self _cmd super
+
+" ObjC Type Qualifiers for Blocks
+syn keyword objcBlocksQualifier __block
+" ObjC Type Qualifiers for Object Lifetime
+syn keyword objcObjectLifetimeQualifier __strong __weak __unsafe_unretained __autoreleasing
+" ObjC Type Qualifiers for Toll-Free Bridge
+syn keyword objcTollFreeBridgeQualifier __bridge __bridge_retained __bridge_transfer
+
+" ObjC Type Qualifiers for Remote Messaging
+syn match objcRemoteMessagingQualifier display contained /\((\s*oneway\s\+\|(\s*in\s\+\|(\s*out\s\+\|(\s*inout\s\+\|(\s*bycopy\s\+\(in\(out\)\?\|out\)\?\|(\s*byref\s\+\(in\(out\)\?\|out\)\?\)/hs=s+1
+
+" ObjC Storage Classes
+syn keyword objcStorageClass _Nullable _Nonnull _Null_unspecified
+syn keyword objcStorageClass __nullable __nonnull __null_unspecified
+syn keyword objcStorageClass nullable nonnull null_unspecified
+
+" ObjC type specifier
+syn keyword objcTypeSpecifier __kindof __covariant
+
+" ObjC Type Information Parameters
+syn keyword objcTypeInfoParams ObjectType KeyType
+
+" shorthand
+syn cluster objcTypeQualifier contains=objcBlocksQualifier,objcObjectLifetimeQualifier,objcTollFreeBridgeQualifier,objcRemoteMessagingQualifier
+
+" ObjC Fast Enumeration
+syn match objcFastEnumKeyword display /\sin\(\s\|$\)/
+
+" ObjC Literal Syntax
+syn match objcLiteralSyntaxNumber display /@\(YES\>\|NO\>\|\d\|-\|+\)/ contains=cNumber,cFloat,cOctal
+syn match objcLiteralSyntaxSpecialChar display /@'/ contains=cSpecialCharacter
+syn match objcLiteralSyntaxChar display /@'[^\\]'/
+syn match objcLiteralSyntaxOp display /@\((\|\[\|{\)/me=e-1,he=e-1
+
+" ObjC Declared Property Attributes
+syn match objDeclPropAccessorNameAssign display /\s*=\s*/ contained
+syn region objcDeclPropAccessorName display start=/\(getter\|setter\)/ end=/\h\w*/ contains=objDeclPropAccessorNameAssign
+syn keyword objcDeclPropAccessorType readonly readwrite contained
+syn keyword objcDeclPropAssignSemantics assign retain copy contained
+syn keyword objcDeclPropAtomicity nonatomic contained
+syn keyword objcDeclPropARC strong weak contained
+syn match objcDeclPropNullable /\((\|\s\)nullable\(,\|)\)/ms=s+1,hs=s+1,me=e-1,he=e-1 contained
+syn match objcDeclPropNonnull /\((\|\s\)nonnull\(,\|)\)/ms=s+1,hs=s+1,me=e-1,he=e-1 contained
+syn match objcDeclPropNullUnspecified /\((\|\s\)null_unspecified\(,\|)\)/ms=s+1,hs=s+1,me=e-1,he=e-1 contained
+syn keyword objcDeclProcNullResettable null_resettable contained
+syn region objcDeclProp display transparent keepend start=/@property\s*(/ end=/)/ contains=objcProperty,objcDeclPropAccessorName,objcDeclPropAccessorType,objcDeclPropAssignSemantics,objcDeclPropAtomicity,objcDeclPropARC,objcDeclPropNullable,objcDeclPropNonnull,objcDeclPropNullUnspecified,objcDeclProcNullResettable
+
+" To distinguish colons in methods and dictionaries from those in C's labels.
+syn match objcColon display /^\s*\h\w*\s*\:\(\s\|.\)/me=e-1,he=e-1
+
+" To distinguish a protocol list from system header files
+syn match objcProtocolList display /<\h\w*\(\s*,\s*\h\w*\)*>/ contains=objcPrincipalType,cType,Type,objcType,objcTypeInfoParams
+
+" Type info for collection classes
+syn match objcTypeInfo display /<\h\w*\s*<\(\h\w*\s*\**\|\h\w*\)>>/ contains=objcPrincipalType,cType,Type,objcType,objcTypeInfoParams
+
+" shorthand
+syn cluster objcCEntities contains=cType,cStructure,cStorageClass,cString,cCharacter,cSpecialCharacter,cNumbers,cConstant,cOperator,cComment,cCommentL,cStatement,cLabel,cConditional,cRepeat
+syn cluster objcObjCEntities contains=objcHiddenArgument,objcPrincipalType,objcString,objcUsefulTerm,objcProtocol,objcInternalRep,objcException,objcThread,objcPool,objcModuleImport,@objcTypeQualifier,objcLiteralSyntaxNumber,objcLiteralSyntaxOp,objcLiteralSyntaxChar,objcLiteralSyntaxSpecialChar,objcProtocolList,objcColon,objcFastEnumKeyword,objcType,objcClass,objcMacro,objcEnum,objcEnumValue,objcExceptionValue,objcNotificationValue,objcConstVar,objcPreProcMacro,objcTypeInfo
+
+" Objective-C Message Expressions
+syn region objcMethodCall start=/\[/ end=/\]/ contains=objcMethodCall,objcBlocks,@objcObjCEntities,@objcCEntities
+
+" To distinguish class method and instance method
+syn match objcInstanceMethod display /^s*-\s*/
+syn match objcClassMethod display /^s*+\s*/
+
+" ObjC Blocks
+syn region objcBlocks start=/\(\^\s*([^)]\+)\s*{\|\^\s*{\)/ end=/}/ contains=objcBlocks,objcMethodCall,@objcObjCEntities,@objcCEntities
+
+syn cluster cParenGroup add=objcMethodCall
+syn cluster cPreProcGroup add=objcMethodCall
+
+""" Foundation Framework
+syn match objcClass /Protocol\s*\*/me=s+8,he=s+8
+
+"""""""""""""""""
+" NSObjCRuntime.h
+syn keyword objcType NSInteger NSUInteger NSComparator
+syn keyword objcEnum NSComparisonResult
+syn keyword objcEnumValue NSOrderedAscending NSOrderedSame NSOrderedDescending
+syn keyword objcEnum NSEnumerationOptions
+syn keyword objcEnumValue NSEnumerationConcurrent NSEnumerationReverse
+syn keyword objcEnum NSSortOptions
+syn keyword objcEnumValue NSSortConcurrent NSSortStable
+syn keyword objcEnumValue NSNotFound
+syn keyword objcMacro NSIntegerMax NSIntegerMin NSUIntegerMax
+syn keyword objcMacro NS_INLINE NS_BLOCKS_AVAILABLE NS_NONATOMIC_IOSONLY NS_FORMAT_FUNCTION NS_FORMAT_ARGUMENT NS_RETURNS_RETAINED NS_RETURNS_NOT_RETAINED NS_RETURNS_INNER_POINTER NS_AUTOMATED_REFCOUNT_UNAVAILABLE NS_AUTOMATED_REFCOUNT_WEAK_UNAVAILABLE NS_REQUIRES_PROPERTY_DEFINITIONS NS_REPLACES_RECEIVER NS_RELEASES_ARGUMENT NS_VALID_UNTIL_END_OF_SCOPE NS_ROOT_CLASS NS_REQUIRES_SUPER NS_PROTOCOL_REQUIRES_EXPLICIT_IMPLEMENTATION NS_DESIGNATED_INITIALIZER NS_REQUIRES_NIL_TERMINATION
+syn keyword objcEnum NSQualityOfService
+syn keyword objcEnumValue NSQualityOfServiceUserInteractive NSQualityOfServiceUserInitiated NSQualityOfServiceUtility NSQualityOfServiceBackground NSQualityOfServiceDefault
+" NSRange.h
+syn keyword objcType NSRange NSRangePointer
+" NSGeometry.h
+syn keyword objcType NSPoint NSPointPointer NSPointArray NSSize NSSizePointer NSSizeArray NSRect NSRectPointer NSRectArray NSEdgeInsets
+syn keyword objcEnum NSRectEdge
+syn keyword objcEnumValue NSMinXEdge NSMinYEdge NSMaxXEdge NSMaxYEdge
+syn keyword objcEnumValue NSRectEdgeMinX NSRectEdgeMinY NSRectEdgeMaxX NSRectEdgeMaxY
+syn keyword objcConstVar NSZeroPoint NSZeroSize NSZeroRect NSEdgeInsetsZero
+syn keyword cType CGFloat CGPoint CGSize CGRect
+syn keyword objcEnum NSAlignmentOptions
+syn keyword objcEnumValue NSAlignMinXInward NSAlignMinYInward NSAlignMaxXInward NSAlignMaxYInward NSAlignWidthInward NSAlignHeightInward NSAlignMinXOutward NSAlignMinYOutward NSAlignMaxXOutward NSAlignMaxYOutward NSAlignWidthOutward NSAlignHeightOutward NSAlignMinXNearest NSAlignMinYNearest NSAlignMaxXNearest NSAlignMaxYNearest NSAlignWidthNearest NSAlignHeightNearest NSAlignRectFlipped NSAlignAllEdgesInward NSAlignAllEdgesOutward NSAlignAllEdgesNearest
+" NSDecimal.h
+syn keyword objcType NSDecimal
+syn keyword objcEnum NSRoundingMode
+syn keyword objcEnumValue NSRoundPlain NSRoundDown NSRoundUp NSRoundBankers
+syn keyword objcEnum NSCalculationError
+syn keyword objcEnumValue NSCalculationNoError NSCalculationLossOfPrecision NSCalculationUnderflow NSCalculationOverflow NSCalculationDivideByZero
+syn keyword objcConstVar NSDecimalMaxSize NSDecimalNoScale
+" NSDate.h
+syn match objcClass /NSDate\s*\*/me=s+6,he=s+6
+syn keyword objcType NSTimeInterval
+syn keyword objcNotificationValue NSSystemClockDidChangeNotification
+syn keyword objcMacro NSTimeIntervalSince1970
+" NSZone.h
+syn match objcType /NSZone\s*\*/me=s+6,he=s+6
+syn keyword objcEnumValue NSScannedOption NSCollectorDisabledOption
+" NSError.h
+syn match objcClass /NSError\s*\*/me=s+7,he=s+7
+syn keyword objcConstVar NSCocoaErrorDomain NSPOSIXErrorDomain NSOSStatusErrorDomain NSMachErrorDomain NSUnderlyingErrorKey NSLocalizedDescriptionKey NSLocalizedFailureReasonErrorKey NSLocalizedRecoverySuggestionErrorKey NSLocalizedRecoveryOptionsErrorKey NSRecoveryAttempterErrorKey NSHelpAnchorErrorKey NSStringEncodingErrorKey NSURLErrorKey NSFilePathErrorKey
+" NSException.h
+syn match objcClass /NSException\s*\*/me=s+11,he=s+11
+syn match objcClass /NSAssertionHandler\s*\*/me=s+18,he=s+18
+syn keyword objcType NSUncaughtExceptionHandler
+syn keyword objcConstVar NSGenericException NSRangeException NSInvalidArgumentException NSInternalInconsistencyException NSMallocException NSObjectInaccessibleException NSObjectNotAvailableException NSDestinationInvalidException NSPortTimeoutException NSInvalidSendPortException NSInvalidReceivePortException NSPortSendException NSPortReceiveException NSOldStyleException
+" NSNotification.h
+syn match objcClass /NSNotification\s*\*/me=s+14,he=s+14
+syn match objcClass /NSNotificationCenter\s*\*/me=s+20,he=s+20
+" NSDistributedNotificationCenter.h
+syn match objcClass /NSDistributedNotificationCenter\s*\*/me=s+31,he=s+31
+syn keyword objcConstVar NSLocalNotificationCenterType
+syn keyword objcEnum NSNotificationSuspensionBehavior
+syn keyword objcEnumValue NSNotificationSuspensionBehaviorDrop NSNotificationSuspensionBehaviorCoalesce NSNotificationSuspensionBehaviorHold NSNotificationSuspensionBehaviorHold NSNotificationSuspensionBehaviorDeliverImmediately
+syn keyword objcEnumValue NSNotificationDeliverImmediately NSNotificationPostToAllSessions
+syn keyword objcEnum NSDistributedNotificationOptions
+syn keyword objcEnumValue NSDistributedNotificationDeliverImmediately NSDistributedNotificationPostToAllSessions
+" NSNotificationQueue.h
+syn match objcClass /NSNotificationQueue\s*\*/me=s+19,he=s+19
+syn keyword objcEnum NSPostingStyle
+syn keyword objcEnumValue NSPostWhenIdle NSPostASAP NSPostNow
+syn keyword objcEnum NSNotificationCoalescing
+syn keyword objcEnumValue NSNotificationNoCoalescing NSNotificationCoalescingOnName NSNotificationCoalescingOnSender
+" NSEnumerator.h
+syn match objcClass /NSEnumerator\s*\*/me=s+12,he=s+12
+syn match objcClass /NSEnumerator<.*>\s*\*/me=s+12,he=s+12 contains=objcTypeInfoParams
+syn keyword objcType NSFastEnumerationState
+" NSIndexSet.h
+syn match objcClass /NSIndexSet\s*\*/me=s+10,he=s+10
+syn match objcClass /NSMutableIndexSet\s*\*/me=s+17,he=s+17
+" NSCharecterSet.h
+syn match objcClass /NSCharacterSet\s*\*/me=s+14,he=s+14
+syn match objcClass /NSMutableCharacterSet\s*\*/me=s+21,he=s+21
+syn keyword objcConstVar NSOpenStepUnicodeReservedBase
+" NSURL.h
+syn match objcClass /NSURL\s*\*/me=s+5,he=s+5
+syn keyword objcEnum NSURLBookmarkCreationOptions
+syn keyword objcEnumValue NSURLBookmarkCreationPreferFileIDResolution NSURLBookmarkCreationMinimalBookmark NSURLBookmarkCreationSuitableForBookmarkFile NSURLBookmarkCreationWithSecurityScope NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess
+syn keyword objcEnum NSURLBookmarkResolutionOptions
+syn keyword objcEnumValue NSURLBookmarkResolutionWithoutUI NSURLBookmarkResolutionWithoutMounting NSURLBookmarkResolutionWithSecurityScope
+syn keyword objcType NSURLBookmarkFileCreationOptions
+syn keyword objcConstVar NSURLFileScheme NSURLKeysOfUnsetValuesKey
+syn keyword objcConstVar NSURLNameKey NSURLLocalizedNameKey NSURLIsRegularFileKey NSURLIsDirectoryKey NSURLIsSymbolicLinkKey NSURLIsVolumeKey NSURLIsPackageKey NSURLIsApplicationKey NSURLApplicationIsScriptableKey NSURLIsSystemImmutableKey NSURLIsUserImmutableKey NSURLIsHiddenKey NSURLHasHiddenExtensionKey NSURLCreationDateKey NSURLContentAccessDateKey NSURLContentModificationDateKey NSURLAttributeModificationDateKey NSURLLinkCountKey NSURLParentDirectoryURLKey NSURLVolumeURLKey NSURLTypeIdentifierKey NSURLLocalizedTypeDescriptionKey NSURLLabelNumberKey NSURLLabelColorKey NSURLLocalizedLabelKey NSURLEffectiveIconKey NSURLCustomIconKey NSURLFileResourceIdentifierKey NSURLVolumeIdentifierKey NSURLPreferredIOBlockSizeKey NSURLIsReadableKey NSURLIsWritableKey NSURLIsExecutableKey NSURLFileSecurityKey NSURLIsExcludedFromBackupKey NSURLTagNamesKey NSURLPathKey NSURLIsMountTriggerKey NSURLGenerationIdentifierKey NSURLDocumentIdentifierKey NSURLAddedToDirectoryDateKey NSURLQuarantinePropertiesKey NSURLFileResourceTypeKey
+syn keyword objcConstVar NSURLFileResourceTypeNamedPipe NSURLFileResourceTypeCharacterSpecial NSURLFileResourceTypeDirectory NSURLFileResourceTypeBlockSpecial NSURLFileResourceTypeRegular NSURLFileResourceTypeSymbolicLink NSURLFileResourceTypeSocket NSURLFileResourceTypeUnknown NSURLThumbnailDictionaryKey NSURLThumbnailKey NSThumbnail1024x1024SizeKey
+syn keyword objcConstVar NSURLFileSizeKey NSURLFileAllocatedSizeKey NSURLTotalFileSizeKey NSURLTotalFileAllocatedSizeKey NSURLIsAliasFileKey NSURLFileProtectionKey NSURLFileProtectionNone NSURLFileProtectionComplete NSURLFileProtectionCompleteUnlessOpen NSURLFileProtectionCompleteUntilFirstUserAuthentication
+syn keyword objcConstVar NSURLVolumeLocalizedFormatDescriptionKey NSURLVolumeTotalCapacityKey NSURLVolumeAvailableCapacityKey NSURLVolumeResourceCountKey NSURLVolumeSupportsPersistentIDsKey NSURLVolumeSupportsSymbolicLinksKey NSURLVolumeSupportsHardLinksKey NSURLVolumeSupportsJournalingKey NSURLVolumeIsJournalingKey NSURLVolumeSupportsSparseFilesKey NSURLVolumeSupportsZeroRunsKey NSURLVolumeSupportsCaseSensitiveNamesKey NSURLVolumeSupportsCasePreservedNamesKey NSURLVolumeSupportsRootDirectoryDatesKey NSURLVolumeSupportsVolumeSizesKey NSURLVolumeSupportsRenamingKey NSURLVolumeSupportsAdvisoryFileLockingKey NSURLVolumeSupportsExtendedSecurityKey NSURLVolumeIsBrowsableKey NSURLVolumeMaximumFileSizeKey NSURLVolumeIsEjectableKey NSURLVolumeIsRemovableKey NSURLVolumeIsInternalKey NSURLVolumeIsAutomountedKey NSURLVolumeIsLocalKey NSURLVolumeIsReadOnlyKey NSURLVolumeCreationDateKey NSURLVolumeURLForRemountingKey NSURLVolumeUUIDStringKey NSURLVolumeNameKey NSURLVolumeLocalizedNameKey
+syn keyword objcConstVar NSURLIsUbiquitousItemKey NSURLUbiquitousItemHasUnresolvedConflictsKey NSURLUbiquitousItemIsDownloadedKey NSURLUbiquitousItemIsDownloadingKey NSURLUbiquitousItemIsUploadedKey NSURLUbiquitousItemIsUploadingKey NSURLUbiquitousItemPercentDownloadedKey NSURLUbiquitousItemPercentUploadedKey NSURLUbiquitousItemDownloadingStatusKey NSURLUbiquitousItemDownloadingErrorKey NSURLUbiquitousItemUploadingErrorKey NSURLUbiquitousItemDownloadRequestedKey NSURLUbiquitousItemContainerDisplayNameKey NSURLUbiquitousItemDownloadingStatusNotDownloaded NSURLUbiquitousItemDownloadingStatusDownloaded NSURLUbiquitousItemDownloadingStatusCurrent
+""""""""""""
+" NSString.h
+syn match objcClass /NSString\s*\*/me=s+8,he=s+8
+syn match objcClass /NSMutableString\s*\*/me=s+15,he=s+15
+syn keyword objcType unichar
+syn keyword objcExceptionValue NSParseErrorException NSCharacterConversionException
+syn keyword objcMacro NSMaximumStringLength
+syn keyword objcEnum NSStringCompareOptions
+syn keyword objcEnumValue NSCaseInsensitiveSearch NSLiteralSearch NSBackwardsSearch NSAnchoredSearch NSNumericSearch NSDiacriticInsensitiveSearch NSWidthInsensitiveSearch NSForcedOrderingSearch NSRegularExpressionSearch
+syn keyword objcEnum NSStringEncoding
+syn keyword objcEnumValue NSProprietaryStringEncoding
+syn keyword objcEnumValue NSASCIIStringEncoding NSNEXTSTEPStringEncoding NSJapaneseEUCStringEncoding NSUTF8StringEncoding NSISOLatin1StringEncoding NSSymbolStringEncoding NSNonLossyASCIIStringEncoding NSShiftJISStringEncoding NSISOLatin2StringEncoding NSUnicodeStringEncoding NSWindowsCP1251StringEncoding NSWindowsCP1252StringEncoding NSWindowsCP1253StringEncoding NSWindowsCP1254StringEncoding NSWindowsCP1250StringEncoding NSISO2022JPStringEncoding NSMacOSRomanStringEncoding NSUTF16StringEncoding NSUTF16BigEndianStringEncoding NSUTF16LittleEndianStringEncoding NSUTF32StringEncoding NSUTF32BigEndianStringEncoding NSUTF32LittleEndianStringEncoding
+syn keyword objcEnum NSStringEncodingConversionOptions
+syn keyword objcEnumValue NSStringEncodingConversionAllowLossy NSStringEncodingConversionExternalRepresentation
+syn keyword objcEnum NSStringEnumerationOptions
+syn keyword objcEnumValue NSStringEnumerationByLines NSStringEnumerationByParagraphs NSStringEnumerationByComposedCharacterSequences NSStringEnumerationByWords NSStringEnumerationBySentences NSStringEnumerationReverse NSStringEnumerationSubstringNotRequired NSStringEnumerationLocalized
+syn keyword objcConstVar NSStringTransformLatinToKatakana NSStringTransformLatinToHiragana NSStringTransformLatinToHangul NSStringTransformLatinToArabic NSStringTransformLatinToHebrew NSStringTransformLatinToThai NSStringTransformLatinToCyrillic NSStringTransformLatinToGreek NSStringTransformToLatin NSStringTransformMandarinToLatin NSStringTransformHiraganaToKatakana NSStringTransformFullwidthToHalfwidth NSStringTransformToXMLHex NSStringTransformToUnicodeName NSStringTransformStripCombiningMarks NSStringTransformStripDiacritics
+syn keyword objcConstVar NSStringEncodingDetectionSuggestedEncodingsKey NSStringEncodingDetectionDisallowedEncodingsKey NSStringEncodingDetectionUseOnlySuggestedEncodingsKey NSStringEncodingDetectionAllowLossyKey NSStringEncodingDetectionFromWindowsKey NSStringEncodingDetectionLossySubstitutionKey NSStringEncodingDetectionLikelyLanguageKey
+" NSAttributedString.h
+syn match objcClass /NSAttributedString\s*\*/me=s+18,he=s+18
+syn match objcClass /NSMutableAttributedString\s*\*/me=s+25,he=s+25
+syn keyword objcEnum NSAttributedStringEnumerationOptions
+syn keyword objcEnumValue NSAttributedStringEnumerationReverse NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
+" NSValue.h
+syn match objcClass /NSValue\s*\*/me=s+7,he=s+7
+syn match objcClass /NSNumber\s*\*/me=s+8,he=s+8
+" NSDecimalNumber.h
+syn match objcClass /NSDecimalNumber\s*\*/me=s+15,he=s+15
+syn match objcClass /NSDecimalNumberHandler\s*\*/me=s+22,he=s+22
+syn keyword objcExceptionValue NSDecimalNumberExactnessException NSDecimalNumberOverflowException NSDecimalNumberUnderflowException NSDecimalNumberDivideByZeroException
+" NSData.h
+syn match objcClass /NSData\s*\*/me=s+6,he=s+6
+syn match objcClass /NSMutableData\s*\*/me=s+13,he=s+13
+syn keyword objcEnum NSDataReadingOptions
+syn keyword objcEnumValue NSDataReadingMappedIfSafe NSDataReadingUncached NSDataReadingMappedAlways NSDataReadingMapped NSMappedRead NSUncachedRead
+syn keyword objcEnum NSDataWritingOptions
+syn keyword objcEnumValue NSDataWritingAtomic NSDataWritingWithoutOverwriting NSDataWritingFileProtectionNone NSDataWritingFileProtectionComplete NSDataWritingFileProtectionCompleteUnlessOpen NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication NSDataWritingFileProtectionMask NSAtomicWrite
+syn keyword objcEnum NSDataSearchOptions
+syn keyword objcEnumValue NSDataSearchBackwards NSDataSearchAnchored
+syn keyword objcEnum NSDataBase64EncodingOptions NSDataBase64DecodingOptions
+syn keyword objcEnumValue NSDataBase64Encoding64CharacterLineLength NSDataBase64Encoding76CharacterLineLength NSDataBase64EncodingEndLineWithCarriageReturn NSDataBase64EncodingEndLineWithLineFeed NSDataBase64DecodingIgnoreUnknownCharacters
+" NSArray.h
+syn match objcClass /NSArray\s*\*/me=s+7,he=s+7
+syn match objcClass /NSArray<.*>\s*\*/me=s+7,he=s+7 contains=objcTypeInfoParams
+syn match objcClass /NSMutableArray\s*\*/me=s+14,he=s+14
+syn match objcClass /NSMutableArray<.*>\s*\*/me=s+14,he=s+14 contains=objcTypeInfoParams
+syn keyword objcEnum NSBinarySearchingOptions
+syn keyword objcEnumValue NSBinarySearchingFirstEqual NSBinarySearchingLastEqual NSBinarySearchingInsertionIndex
+" NSDictionary.h
+syn match objcClass /NSDictionary\s*\*/me=s+12,he=s+12
+syn match objcClass /NSDictionary<.*>\s*\*/me=s+12,he=s+12 contains=objcTypeInfoParams
+syn match objcClass /NSMutableDictionary\s*\*/me=s+19,he=s+19
+syn match objcClass /NSMutableDictionary<.*>\s*\*/me=s+19,he=s+19 contains=objcTypeInfoParams
+" NSSet.h
+syn match objcClass /NSSet\s*\*/me=s+5,me=s+5
+syn match objcClass /NSSet<.*>\s*\*/me=s+5,me=s+5 contains=objcTypeInfoParams
+syn match objcClass /NSMutableSet\s*\*/me=s+12,me=s+12
+syn match objcClass /NSMutableSet<.*>\s*\*/me=s+12,me=s+12 contains=objcTypeInfoParams
+syn match objcClass /NSCountedSet\s*\*/me=s+12,me=s+12
+syn match objcClass /NSCountedSet<.*>\s*\*/me=s+12,me=s+12 contains=objcTypeInfoParams
+" NSOrderedSet.h
+syn match objcClass /NSOrderedSet\s*\*/me=s+12,me=s+12
+syn match objcClass /NSOrderedSet<.*>\s*\*/me=s+12,me=s+12 contains=objcTypeInfoParams
+syn match objcClass /NSMutableOrderedSet\s*\*/me=s+19,me=s+19
+syn match objcClass /NSMutableOrderedSet<.*>\s*\*/me=s+19,me=s+19
+"""""""""""""""""""
+" NSPathUtilities.h
+syn keyword objcEnum NSSearchPathDirectory
+syn keyword objcEnumValue NSApplicationDirectory NSDemoApplicationDirectory NSDeveloperApplicationDirectory NSAdminApplicationDirectory NSLibraryDirectory NSDeveloperDirectory NSUserDirectory NSDocumentationDirectory NSDocumentDirectory NSCoreServiceDirectory NSAutosavedInformationDirectory NSDesktopDirectory NSCachesDirectory NSApplicationSupportDirectory NSDownloadsDirectory NSInputMethodsDirectory NSMoviesDirectory NSMusicDirectory NSPicturesDirectory NSPrinterDescriptionDirectory NSSharedPublicDirectory NSPreferencePanesDirectory NSApplicationScriptsDirectory NSItemReplacementDirectory NSAllApplicationsDirectory NSAllLibrariesDirectory NSTrashDirectory
+syn keyword objcEnum NSSearchPathDomainMask
+syn keyword objcEnumValue NSUserDomainMask NSLocalDomainMask NSNetworkDomainMask NSSystemDomainMask NSAllDomainsMask
+" NSFileManger.h
+syn match objcClass /NSFileManager\s*\*/me=s+13,he=s+13
+syn match objcClass /NSDirectoryEnumerator\s*\*/me=s+21,he=s+21 contains=objcTypeInfoParams
+syn match objcClass /NSDirectoryEnumerator<.*>\s*\*/me=s+21,he=s+21
+syn keyword objcEnum NSVolumeEnumerationOptions
+syn keyword objcEnumValue NSVolumeEnumerationSkipHiddenVolumes NSVolumeEnumerationProduceFileReferenceURLs
+syn keyword objcEnum NSURLRelationship
+syn keyword objcEnumValue NSURLRelationshipContains NSURLRelationshipSame NSURLRelationshipOther
+syn keyword objcEnum NSFileManagerUnmountOptions
+syn keyword objcEnumValue NSFileManagerUnmountAllPartitionsAndEjectDisk NSFileManagerUnmountWithoutUI
+syn keyword objcConstVar NSFileManagerUnmountDissentingProcessIdentifierErrorKey
+syn keyword objcEnum NSDirectoryEnumerationOptions
+syn keyword objcEnumValue NSDirectoryEnumerationSkipsSubdirectoryDescendants NSDirectoryEnumerationSkipsPackageDescendants NSDirectoryEnumerationSkipsHiddenFiles
+syn keyword objcEnum NSFileManagerItemReplacementOptions
+syn keyword objcEnumValue NSFileManagerItemReplacementUsingNewMetadataOnly NSFileManagerItemReplacementWithoutDeletingBackupItem
+syn keyword objcNotificationValue NSUbiquityIdentityDidChangeNotification
+syn keyword objcConstVar NSFileType NSFileTypeDirectory NSFileTypeRegular NSFileTypeSymbolicLink NSFileTypeSocket NSFileTypeCharacterSpecial NSFileTypeBlockSpecial NSFileTypeUnknown NSFileSize NSFileModificationDate NSFileReferenceCount NSFileDeviceIdentifier NSFileOwnerAccountName NSFileGroupOwnerAccountName NSFilePosixPermissions NSFileSystemNumber NSFileSystemFileNumber NSFileExtensionHidden NSFileHFSCreatorCode NSFileHFSTypeCode NSFileImmutable NSFileAppendOnly NSFileCreationDate NSFileOwnerAccountID NSFileGroupOwnerAccountID NSFileBusy NSFileProtectionKey NSFileProtectionNone NSFileProtectionComplete NSFileProtectionCompleteUnlessOpen NSFileProtectionCompleteUntilFirstUserAuthentication NSFileSystemSize NSFileSystemFreeSize NSFileSystemNodes NSFileSystemFreeNodes
+" NSFileHandle.h
+syn match objcClass /NSFileHandle\s*\*/me=s+12,he=s+12
+syn keyword objcExceptionValue NSFileHandleOperationException
+syn keyword objcNotificationValue NSFileHandleReadCompletionNotification NSFileHandleReadToEndOfFileCompletionNotification NSFileHandleConnectionAcceptedNotification NSFileHandleDataAvailableNotification NSFileHandleNotificationDataItem NSFileHandleNotificationFileHandleItem NSFileHandleNotificationMonitorModes
+syn match objcClass /NSPipe\s*\*/me=s+6,he=s+6
+""""""""""""
+" NSLocale.h
+syn match objcClass /NSLocale\s*\*/me=s+8,he=s+8
+syn keyword objcEnum NSLocaleLanguageDirection
+syn keyword objcEnumValue NSLocaleLanguageDirectionUnknown NSLocaleLanguageDirectionLeftToRight NSLocaleLanguageDirectionRightToLeft NSLocaleLanguageDirectionTopToBottom NSLocaleLanguageDirectionBottomToTop
+syn keyword objcNotificationValue NSCurrentLocaleDidChangeNotification
+syn keyword objcConstVar NSLocaleIdentifier NSLocaleLanguageCode NSLocaleCountryCode NSLocaleScriptCode NSLocaleVariantCode NSLocaleExemplarCharacterSet NSLocaleCalendar NSLocaleCollationIdentifier NSLocaleUsesMetricSystem NSLocaleMeasurementSystem NSLocaleDecimalSeparator NSLocaleGroupingSeparator NSLocaleCurrencySymbol NSLocaleCurrencyCode NSLocaleCollatorIdentifier NSLocaleQuotationBeginDelimiterKey NSLocaleQuotationEndDelimiterKey NSLocaleAlternateQuotationBeginDelimiterKey NSLocaleAlternateQuotationEndDelimiterKey NSGregorianCalendar NSBuddhistCalendar NSChineseCalendar NSHebrewCalendar NSIslamicCalendar NSIslamicCivilCalendar NSJapaneseCalendar NSRepublicOfChinaCalendar NSPersianCalendar NSIndianCalendar NSISO8601Calendar
+" NSFormatter.h
+syn match objcClass /NSFormatter\s*\*/me=s+11,he=s+11
+syn keyword objcEnum NSFormattingContext NSFormattingUnitStyle
+syn keyword objcEnumValue NSFormattingContextUnknown NSFormattingContextDynamic NSFormattingContextStandalone NSFormattingContextListItem NSFormattingContextBeginningOfSentence NSFormattingContextMiddleOfSentence NSFormattingUnitStyleShort NSFormattingUnitStyleMedium NSFormattingUnitStyleLong
+" NSNumberFormatter.h
+syn match objcClass /NSNumberFormatter\s*\*/me=s+17,he=s+17
+syn keyword objcEnum NSNumberFormatterStyle
+syn keyword objcEnumValue NSNumberFormatterNoStyle NSNumberFormatterDecimalStyle NSNumberFormatterCurrencyStyle NSNumberFormatterPercentStyle NSNumberFormatterScientificStyle NSNumberFormatterSpellOutStyle NSNumberFormatterOrdinalStyle NSNumberFormatterCurrencyISOCodeStyle NSNumberFormatterCurrencyPluralStyle NSNumberFormatterCurrencyAccountingStyle
+syn keyword objcEnum NSNumberFormatterBehavior
+syn keyword objcEnumValue NSNumberFormatterBehaviorDefault NSNumberFormatterBehavior10_0 NSNumberFormatterBehavior10_4
+syn keyword objcEnum NSNumberFormatterPadPosition
+syn keyword objcEnumValue NSNumberFormatterPadBeforePrefix NSNumberFormatterPadAfterPrefix NSNumberFormatterPadBeforeSuffix NSNumberFormatterPadAfterSuffix
+syn keyword objcEnum NSNumberFormatterRoundingMode
+syn keyword objcEnumValue NSNumberFormatterRoundCeiling NSNumberFormatterRoundFloor NSNumberFormatterRoundDown NSNumberFormatterRoundUp NSNumberFormatterRoundHalfEven NSNumberFormatterRoundHalfDown NSNumberFormatterRoundHalfUp
+" NSDateFormatter.h
+syn match objcClass /NSDateFormatter\s*\*/me=s+15,he=s+15
+syn keyword objcEnum NSDateFormatterStyle
+syn keyword objcEnumValue NSDateFormatterNoStyle NSDateFormatterShortStyle NSDateFormatterMediumStyle NSDateFormatterLongStyle NSDateFormatterFullStyle
+syn keyword objcEnum NSDateFormatterBehavior
+syn keyword objcEnumValue NSDateFormatterBehaviorDefault NSDateFormatterBehavior10_0 NSDateFormatterBehavior10_4
+" NSCalendar.h
+syn match objcClass /NSCalendar\s*\*/me=s+10,he=s+10
+syn keyword objcConstVar NSCalendarIdentifierGregorian NSCalendarIdentifierBuddhist NSCalendarIdentifierChinese NSCalendarIdentifierCoptic NSCalendarIdentifierEthiopicAmeteMihret NSCalendarIdentifierEthiopicAmeteAlem NSCalendarIdentifierHebrew NSCalendarIdentifierISO8601 NSCalendarIdentifierIndian NSCalendarIdentifierIslamic NSCalendarIdentifierIslamicCivil NSCalendarIdentifierJapanese NSCalendarIdentifierPersian NSCalendarIdentifierRepublicOfChina NSCalendarIdentifierIslamicTabular NSCalendarIdentifierIslamicUmmAlQura
+syn keyword objcEnum NSCalendarUnit
+syn keyword objcEnumValue NSCalendarUnitEra NSCalendarUnitYear NSCalendarUnitMonth NSCalendarUnitDay NSCalendarUnitHour NSCalendarUnitMinute NSCalendarUnitSecond NSCalendarUnitWeekday NSCalendarUnitWeekdayOrdinal NSCalendarUnitQuarter NSCalendarUnitWeekOfMonth NSCalendarUnitWeekOfYear NSCalendarUnitYearForWeekOfYear NSCalendarUnitNanosecond NSCalendarUnitCalendar NSCalendarUnitTimeZone
+syn keyword objcEnumValue NSEraCalendarUnit NSYearCalendarUnit NSMonthCalendarUnit NSDayCalendarUnit NSHourCalendarUnit NSMinuteCalendarUnit NSSecondCalendarUnit NSWeekCalendarUnit NSWeekdayCalendarUnit NSWeekdayOrdinalCalendarUnit NSQuarterCalendarUnit NSWeekOfMonthCalendarUnit NSWeekOfYearCalendarUnit NSYearForWeekOfYearCalendarUnit NSCalendarCalendarUnit NSTimeZoneCalendarUnit
+syn keyword objcEnumValue NSWrapCalendarComponents NSUndefinedDateComponent NSDateComponentUndefined
+syn match objcClass /NSDateComponents\s*\*/me=s+16,he=s+16
+syn keyword objcEnum NSCalendarOptions
+syn keyword objcEnumValue NSCalendarWrapComponents NSCalendarMatchStrictly NSCalendarSearchBackwards NSCalendarMatchPreviousTimePreservingSmallerUnits NSCalendarMatchNextTimePreservingSmallerUnits NSCalendarMatchNextTime NSCalendarMatchFirst NSCalendarMatchLast
+syn keyword objcConstVar NSCalendarDayChangedNotification
+" NSTimeZone.h
+syn match objcClass /NSTimeZone\s*\*/me=s+10,he=s+10
+syn keyword objcEnum NSTimeZoneNameStyle
+syn keyword objcEnumValue NSTimeZoneNameStyleStandard NSTimeZoneNameStyleShortStandard NSTimeZoneNameStyleDaylightSaving NSTimeZoneNameStyleShortDaylightSaving NSTimeZoneNameStyleGeneric NSTimeZoneNameStyleShortGeneric
+syn keyword objcNotificationValue NSSystemTimeZoneDidChangeNotification
+"""""""""""
+" NSCoder.h
+syn match objcClass /NSCoder\s*\*/me=s+7,he=s+7
+" NSArchiver.h
+syn match objcClass /NSArchiver\s*\*/me=s+10,he=s+10
+syn match objcClass /NSUnarchiver\s*\*/me=s+12,he=s+12
+syn keyword objcExceptionValue NSInconsistentArchiveException
+" NSKeyedArchiver.h
+syn match objcClass /NSKeyedArchiver\s*\*/me=s+15,he=s+15
+syn match objcClass /NSKeyedUnarchiver\s*\*/me=s+17,he=s+17
+syn keyword objcExceptionValue NSInvalidArchiveOperationException NSInvalidUnarchiveOperationException
+syn keyword objcConstVar NSKeyedArchiveRootObjectKey
+""""""""""""""""""
+" NSPropertyList.h
+syn keyword objcEnum NSPropertyListMutabilityOptions
+syn keyword objcEnumValue NSPropertyListImmutable NSPropertyListMutableContainers NSPropertyListMutableContainersAndLeaves
+syn keyword objcEnum NSPropertyListFormat
+syn keyword objcEnumValue NSPropertyListOpenStepFormat NSPropertyListXMLFormat_v1_0 NSPropertyListBinaryFormat_v1_0
+syn keyword objcType NSPropertyListReadOptions NSPropertyListWriteOptions
+" NSUserDefaults.h
+syn match objcClass /NSUserDefaults\s*\*/me=s+14,he=s+14
+syn keyword objcConstVar NSGlobalDomain NSArgumentDomain NSRegistrationDomain
+syn keyword objcNotificationValue NSUserDefaultsDidChangeNotification
+" NSBundle.h
+syn match objcClass /NSBundle\s*\*/me=s+8,he=s+8
+syn keyword objcEnumValue NSBundleExecutableArchitectureI386 NSBundleExecutableArchitecturePPC NSBundleExecutableArchitectureX86_64 NSBundleExecutableArchitecturePPC64
+syn keyword objcNotificationValue NSBundleDidLoadNotification NSLoadedClasses NSBundleResourceRequestLowDiskSpaceNotification
+syn keyword objcConstVar NSBundleResourceRequestLoadingPriorityUrgent
+"""""""""""""""""
+" NSProcessInfo.h
+syn match objcClass /NSProcessInfo\s*\*/me=s+13,he=s+13
+syn keyword objcEnumValue NSWindowsNTOperatingSystem NSWindows95OperatingSystem NSSolarisOperatingSystem NSHPUXOperatingSystem NSMACHOperatingSystem NSSunOSOperatingSystem NSOSF1OperatingSystem
+syn keyword objcType NSOperatingSystemVersion
+syn keyword objcEnum NSActivityOptions NSProcessInfoThermalState
+syn keyword objcEnumValue NSActivityIdleDisplaySleepDisabled NSActivityIdleSystemSleepDisabled NSActivitySuddenTerminationDisabled NSActivityAutomaticTerminationDisabled NSActivityUserInitiated NSActivityUserInitiatedAllowingIdleSystemSleep NSActivityBackground NSActivityLatencyCritical NSProcessInfoThermalStateNominal NSProcessInfoThermalStateFair NSProcessInfoThermalStateSerious NSProcessInfoThermalStateCritical
+syn keyword objcNotificationValue NSProcessInfoThermalStateDidChangeNotification NSProcessInfoPowerStateDidChangeNotification
+" NSTask.h
+syn match objcClass /NSTask\s*\*/me=s+6,he=s+6
+syn keyword objcEnum NSTaskTerminationReason
+syn keyword objcEnumValue NSTaskTerminationReasonExit NSTaskTerminationReasonUncaughtSignal
+syn keyword objcNotificationValue NSTaskDidTerminateNotification
+" NSThread.h
+syn match objcClass /NSThread\s*\*/me=s+8,he=s+8
+syn keyword objcNotificationValue NSWillBecomeMultiThreadedNotification NSDidBecomeSingleThreadedNotification NSThreadWillExitNotification
+" NSLock.h
+syn match objcClass /NSLock\s*\*/me=s+6,he=s+6
+syn match objcClass /NSConditionLock\s*\*/me=s+15,he=s+15
+syn match objcClass /NSRecursiveLock\s*\*/me=s+15,he=s+15
+" NSDictributedLock
+syn match objcClass /NSDistributedLock\s*\*/me=s+17,he=s+17
+" NSOperation.h
+""""""""""""""""
+syn match objcClass /NSOperation\s*\*/me=s+11,he=s+11
+syn keyword objcEnum NSOperationQueuePriority
+syn keyword objcEnumValue NSOperationQueuePriorityVeryLow NSOperationQueuePriorityLow NSOperationQueuePriorityNormal NSOperationQueuePriorityHigh NSOperationQueuePriorityVeryHigh
+syn match objcClass /NSBlockOperation\s*\*/me=s+16,he=s+16
+syn match objcClass /NSInvocationOperation\s*\*/me=s+21,he=s+21
+syn keyword objcExceptionValue NSInvocationOperationVoidResultException NSInvocationOperationCancelledException
+syn match objcClass /NSOperationQueue\s*\*/me=s+16,he=s+16
+syn keyword objcEnumValue NSOperationQueueDefaultMaxConcurrentOperationCount
+" NSConnection.h
+syn match objcClass /NSConnection\s*\*/me=s+12,he=s+12
+syn keyword objcConstVar NSConnectionReplyMode
+syn keyword objcNotificationValue NSConnectionDidDieNotification NSConnectionDidInitializeNotification
+syn keyword objcExceptionValue NSFailedAuthenticationException
+" NSPort.h
+syn match objcClass /NSPort\s*\*/me=s+6,he=s+6
+syn keyword objcType NSSocketNativeHandle
+syn keyword objcNotificationValue NSPortDidBecomeInvalidNotification
+syn match objcClass /NSMachPort\s*\*/me=s+10,he=s+10
+syn keyword objcEnum NSMachPortOptions
+syn keyword objcEnumValue NSMachPortDeallocateNone NSMachPortDeallocateSendRight NSMachPortDeallocateReceiveRight
+syn match objcClass /NSMessagePort\s*\*/me=s+13,he=s+13
+syn match objcClass /NSSocketPort\s*\*/me=s+12,he=s+12
+" NSPortMessage.h
+syn match objcClass /NSPortMessage\s*\*/me=s+13,he=s+13
+" NSDistantObject.h
+syn match objcClass /NSDistantObject\s*\*/me=s+15,he=s+15
+" NSPortNameServer.h
+syn match objcClass /NSPortNameServer\s*\*/me=s+16,he=s+16
+syn match objcClass /NSMessagePortNameServer\s*\*/me=s+23,he=s+23
+syn match objcClass /NSSocketPortNameServer\s*\*/me=s+22,he=s+22
+" NSHost.h
+syn match objcClass /NSHost\s*\*/me=s+6,he=s+6
+" NSInvocation.h
+syn match objcClass /NSInvocation\s*\*/me=s+12,he=s+12
+" NSMethodSignature.h
+syn match objcClass /NSMethodSignature\s*\*/me=s+17,he=s+17
+"""""
+" NSScanner.h
+syn match objcClass /NSScanner\s*\*/me=s+9,he=s+9
+" NSTimer.h
+syn match objcClass /NSTimer\s*\*/me=s+7,he=s+7
+" NSAutoreleasePool.h
+syn match objcClass /NSAutoreleasePool\s*\*/me=s+17,he=s+17
+" NSRunLoop.h
+syn match objcClass /NSRunLoop\s*\*/me=s+9,he=s+9
+syn keyword objcConstVar NSDefaultRunLoopMode NSRunLoopCommonModes
+" NSNull.h
+syn match objcClass /NSNull\s*\*/me=s+6,he=s+6
+" NSProxy.h
+syn match objcClass /NSProxy\s*\*/me=s+7,he=s+7
+" NSObject.h
+syn match objcClass /NSObject\s*\*/me=s+8,he=s+8
+
+
+" NSCache.h
+syn match objcClass /NSCache\s*\*/me=s+7,he=s+7
+syn match objcClass /NSCache<.*>\s*\*/me=s+7,he=s+7 contains=objcTypeInfoParams
+" NSHashTable.h
+syn match objcClass /NSHashTable\s*\*/me=s+11,he=s+11
+syn match objcClass /NSHashTable<.*>\s*\*/me=s+11,he=s+11 contains=objcTypeInfoParams
+syn keyword objcConstVar NSHashTableStrongMemory NSHashTableZeroingWeakMemory NSHashTableCopyIn NSHashTableObjectPointerPersonality NSHashTableWeakMemory
+syn keyword objcType NSHashTableOptions NSHashEnumerator NSHashTableCallBacks
+syn keyword objcConstVar NSIntegerHashCallBacks NSNonOwnedPointerHashCallBacks NSNonRetainedObjectHashCallBacks NSObjectHashCallBacks NSOwnedObjectIdentityHashCallBacks NSOwnedPointerHashCallBacks NSPointerToStructHashCallBacks NSOwnedObjectIdentityHashCallBacks NSOwnedObjectIdentityHashCallBacks NSIntHashCallBacks
+" NSMapTable.h
+syn match objcClass /NSMapTable\s*\*/me=s+10,he=s+10
+syn match objcClass /NSMapTable<.*>\s*\*/me=s+10,he=s+10 contains=objcTypeInfoParams
+syn keyword objcConstVar NSPointerToStructHashCallBacks NSPointerToStructHashCallBacks NSPointerToStructHashCallBacks NSPointerToStructHashCallBacks NSPointerToStructHashCallBacks
+syn keyword objcConstVar NSMapTableStrongMemory NSMapTableZeroingWeakMemory NSMapTableCopyIn NSMapTableObjectPointerPersonality NSMapTableWeakMemory
+syn keyword objcType NSMapTableOptions NSMapEnumerator NSMapTableKeyCallBacks NSMapTableValueCallBacks
+syn keyword objcMacro NSNotAnIntMapKey NSNotAnIntegerMapKey NSNotAPointerMapKey
+syn keyword objcConstVar NSIntegerMapKeyCallBacks NSNonOwnedPointerMapKeyCallBacks NSNonOwnedPointerOrNullMapKeyCallBacks NSNonRetainedObjectMapKeyCallBacks NSObjectMapKeyCallBacks NSOwnedPointerMapKeyCallBacks NSIntMapKeyCallBacks NSIntegerMapValueCallBacks NSNonOwnedPointerMapValueCallBacks NSObjectMapValueCallBacks NSNonRetainedObjectMapValueCallBacks NSOwnedPointerMapValueCallBacks NSIntMapValueCallBacks
+
+" NSPointerFunctions.h
+syn match objcClass /NSPointerFunctions\s*\*/me=s+18,he=s+18
+syn keyword objcEnum NSPointerFunctionsOptions
+syn keyword objcEnumValue NSPointerFunctionsStrongMemory NSPointerFunctionsZeroingWeakMemory NSPointerFunctionsOpaqueMemory NSPointerFunctionsMallocMemory NSPointerFunctionsMachVirtualMemory NSPointerFunctionsWeakMemory NSPointerFunctionsObjectPersonality NSPointerFunctionsOpaquePersonality NSPointerFunctionsObjectPointerPersonality NSPointerFunctionsCStringPersonality NSPointerFunctionsStructPersonality NSPointerFunctionsIntegerPersonality NSPointerFunctionsCopyIn
+
+
+""" Default Highlighting
+hi def link objcPreProcMacro cConstant
+hi def link objcPrincipalType cType
+hi def link objcUsefulTerm cConstant
+hi def link objcImport cInclude
+hi def link objcImported cString
+hi def link objcObjDef cOperator
+hi def link objcProtocol cOperator
+hi def link objcProperty cOperator
+hi def link objcIvarScope cOperator
+hi def link objcInternalRep cOperator
+hi def link objcException cOperator
+hi def link objcThread cOperator
+hi def link objcPool cOperator
+hi def link objcModuleImport cOperator
+hi def link objcSpecial cSpecial
+hi def link objcString cString
+hi def link objcHiddenArgument cStatement
+hi def link objcBlocksQualifier cStorageClass
+hi def link objcObjectLifetimeQualifier cStorageClass
+hi def link objcTollFreeBridgeQualifier cStorageClass
+hi def link objcRemoteMessagingQualifier cStorageClass
+hi def link objcStorageClass cStorageClass
+hi def link objcFastEnumKeyword cStatement
+hi def link objcLiteralSyntaxNumber cNumber
+hi def link objcLiteralSyntaxChar cCharacter
+hi def link objcLiteralSyntaxSpecialChar cCharacter
+hi def link objcLiteralSyntaxOp cOperator
+hi def link objcDeclPropAccessorName cConstant
+hi def link objcDeclPropAccessorType cConstant
+hi def link objcDeclPropAssignSemantics cConstant
+hi def link objcDeclPropAtomicity cConstant
+hi def link objcDeclPropARC cConstant
+hi def link objcDeclPropNullable cConstant
+hi def link objcDeclPropNonnull cConstant
+hi def link objcDeclPropNullUnspecified cConstant
+hi def link objcDeclProcNullResettable cConstant
+hi def link objcInstanceMethod Function
+hi def link objcClassMethod Function
+hi def link objcType cType
+hi def link objcClass cType
+hi def link objcTypeSpecifier cType
+hi def link objcMacro cConstant
+hi def link objcEnum cType
+hi def link objcEnumValue cConstant
+hi def link objcExceptionValue cConstant
+hi def link objcNotificationValue cConstant
+hi def link objcConstVar cConstant
+hi def link objcTypeInfoParams Identifier
+
+""" Final step
+let b:current_syntax = "objc"
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 sw=2 sts=2
diff --git a/runtime/syntax/objcpp.vim b/runtime/syntax/objcpp.vim
new file mode 100644
index 0000000..f11e307
--- /dev/null
+++ b/runtime/syntax/objcpp.vim
@@ -0,0 +1,20 @@
+" Vim syntax file
+" Language: Objective C++
+" Maintainer: Kazunobu Kuriyama <kazunobu.kuriyama@nifty.com>
+" Ex-Maintainer: Anthony Hodsdon <ahodsdon@fastmail.fm>
+" Last Change: 2007 Oct 29
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read in C++ and ObjC syntax files
+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
+
+let b:current_syntax = "objcpp"
diff --git a/runtime/syntax/obse.vim b/runtime/syntax/obse.vim
new file mode 100644
index 0000000..4ff0428
--- /dev/null
+++ b/runtime/syntax/obse.vim
@@ -0,0 +1,3360 @@
+" Vim syntax file
+" Language: Oblivion Language (obl)
+" Original Creator: Ulthar Seramis
+" Maintainer: Kat <katisntgood@gmail.com>
+" Latest Revision: 13 November 2022
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" obse is case insensitive
+syntax case ignore
+
+" Statements {{{
+syn keyword obseStatement set let to skipwhite
+" the second part needs to be separate as to not mess up the next group
+syn match obseStatementTwo ":="
+" }}}
+
+" Regex matched objects {{{
+" these are matched with regex and thus must be set first
+syn match obseNames '\w\+'
+syn match obseScriptNameRegion '\i\+' contained
+syn match obseVariable '\w*\S' contained
+syn match obseReference '\zs\w\+\>\ze\.'
+" }}}
+
+" Operators {{{
+syn match obseOperator "\v\*"
+syn match obseOperator "\v\-"
+syn match obseOperator "\v\+"
+syn match obseOperator "\v\/"
+syn match obseOperator "\v\^"
+syn match obseOperator "\v\="
+syn match obseOperator "\v\>"
+syn match obseOperator "\v\<"
+syn match obseOperator "\v\!"
+syn match obseOperator "\v\&"
+syn match obseOperator "\v\|"
+" }}}
+
+" Numbers {{{
+syn match obseInt '\d\+'
+syn match obseInt '[-+]\d\+'
+syn match obseFloat '\d\+\.\d*'
+syn match obseFloat '[-+]\d\+\.\d*'
+" }}}
+
+" Comments and strings {{{
+syn region obseComment start=";" end="$" keepend fold contains=obseToDo
+syn region obseString start=/"/ end=/"/ keepend fold contains=obseStringFormatting
+syn match obseStringFormatting "%%" contained
+syn match obseStringFormatting "%a" contained
+syn match obseStringFormatting "%B" contained
+syn match obseStringFormatting "%b" contained
+syn match obseStringFormatting "%c" contained
+syn match obseStringFormatting "%e" contained
+syn match obseStringFormatting "%g" contained
+syn match obseStringFormatting "%i" contained
+syn match obseStringFormatting "%k" contained
+syn match obseStringFormatting "%n" contained
+syn match obseStringFormatting "%p" contained
+syn match obseStringFormatting "%ps" contained
+syn match obseStringFormatting "%pp" contained
+syn match obseStringFormatting "%po" contained
+syn match obseStringFormatting "%q" contained
+syn match obseStringFormatting "%r" contained
+syn match obseStringFormatting "%v" contained
+syn match obseStringFormatting "%x" contained
+syn match obseStringFormatting "%z" contained
+syn match obseStringFormatting "%{" contained
+syn match obseStringFormatting "%}" contained
+syn match obseStringFormatting "%\d*.\d*f" contained
+syn match obseStringFormatting "% \d*.\d*f" contained
+syn match obseStringFormatting "%-\d*.\d*f" contained
+syn match obseStringFormatting "%+\d*.\d*f" contained
+syn match obseStringFormatting "%\d*.\d*e" contained
+syn match obseStringFormatting "%-\d*.\d*e" contained
+syn match obseStringFormatting "% \d*.\d*e" contained
+syn match obseStringFormatting "%+\d*.\d*e" contained
+syn keyword obseToDo contained TODO todo Todo ToDo FIXME fixme NOTE note
+" }}}
+
+
+" Conditionals {{{
+syn match obseCondition "If"
+syn match obseCondition "Eval"
+syn match obseCondition "Return"
+syn match obseCondition "EndIf"
+syn match obseCondition "ElseIf"
+syn match obseCondition "Else"
+" }}}
+
+" Repeat loops {{{
+syn match obseRepeat "Label"
+syn match obseRepeat "GoTo"
+syn match obseRepeat "While"
+syn match obseRepeat "Loop"
+syn match obseRepeat "ForEach"
+syn match obseRepeat "Break"
+syn match obseRepeat "Continue"
+" }}}
+
+" Basic Types {{{
+syn keyword obseTypes array_var float int long ref reference short string_var nextgroup=obseNames skipwhite
+syn keyword obseOtherKey Player player playerRef playerREF PlayerRef PlayerREF
+syn keyword obseScriptName ScriptName scriptname Scriptname scn nextgroup=obseScriptNameRegion skipwhite
+syn keyword obseBlock Begin End
+" }}}
+
+" Fold {{{
+setlocal foldmethod=syntax
+syn cluster obseNoFold contains=obseComment,obseString
+syn region obseFoldIfContainer
+ \ start="^\s*\<if\>"
+ \ end="^\s*\<endif\>"
+ \ keepend extend
+ \ containedin=ALLBUT,@obseNoFold
+ \ contains=ALLBUT,obseScriptName,obseScriptNameRegion
+syn region obseFoldIf
+ \ start="^\s*\<if\>"
+ \ end="^\s*\<endif\>"
+ \ fold
+ \ keepend
+ \ contained containedin=obseFoldIfContainer
+ \ nextgroup=obseFoldElseIf,obseFoldElse
+ \ contains=TOP,NONE
+syn region obseFoldElseIf
+ \ start="^\s*\<elseif\>"
+ \ end="^\s*\<endif\>"
+ \ fold
+ \ keepend
+ \ contained containedin=obseFoldIfContainer
+ \ nextgroup=obseFoldElseIf,obseFoldElse
+ \ contains=TOP
+syn region obseFoldElse
+ \ start="^\s*\<else\>"
+ \ end="^\s*\<endif\>"
+ \ fold
+ \ keepend
+ \ contained containedin=obseFoldIfContainer
+ \ contains=TOP
+syn region obseFoldWhile
+ \ start="^\s*\<while\>"
+ \ end="^\s*\<loop\>"
+ \ fold
+ \ keepend extend
+ \ contains=TOP
+ \ containedin=ALLBUT,@obseNoFold
+" fold for loops
+syn region obseFoldFor
+ \ start="^\s*\<foreach\>"
+ \ end="^\s*\<loop\>"
+ \ fold
+ \ keepend extend
+ \ contains=TOP
+ \ containedin=ALLBUT,@obseNoFold
+ \ nextgroup=obseVariable
+" }}}
+
+" Skills and Attributes {{{
+syn keyword skillAttribute
+ \ Strength
+ \ Willpower
+ \ Speed
+ \ Personality
+ \ Intelligence
+ \ Agility
+ \ Endurance
+ \ Luck
+ \ Armorer
+ \ Athletics
+ \ Blade
+ \ Block
+ \ Blunt
+ \ HandToHand
+ \ HeavyArmor
+ \ Alchemy
+ \ Alteration
+ \ Conjuration
+ \ Destruction
+ \ Illusion
+ \ Mysticism
+ \ Restoration
+ \ Acrobatics
+ \ LightArmor
+ \ Marksman
+ \ Mercantile
+ \ Security
+ \ Sneak
+ \ Speechcraft
+" }}}
+
+" Block Types {{{
+syn keyword obseBlockType
+ \ ExitGame
+ \ ExitToMainMenu
+ \ Function
+ \ GameMode
+ \ LoadGame
+ \ MenuMode
+ \ OnActivate
+ \ OnActorDrop
+ \ OnActorEquip
+ \ OnActorUnequip
+ \ OnAdd
+ \ OnAlarm
+ \ OnAlarmTrespass
+ \ OnAlarmVictim
+ \ OnAttack
+ \ OnBlock
+ \ OnBowAttack
+ \ OnClick
+ \ OnClose
+ \ OnCreatePotion
+ \ OnCreateSpell
+ \ OnDeath
+ \ OnDodge
+ \ OnDrinkPotion
+ \ OnDrop
+ \ OnEatIngredient
+ \ OnEnchant
+ \ OnEquip
+ \ OnFallImpact
+ \ OnHealthDamage
+ \ OnHit
+ \ OnHitWith
+ \ OnKnockout
+ \ OnLoad
+ \ OnMagicApply
+ \ OnMagicCast
+ \ OnMagicEffectHit
+ \ OnMagicEffectHit2
+ \ OnMapMarkerAdd
+ \ OnMouseover
+ \ OnMurder
+ \ OnNewGame
+ \ OnOpen
+ \ OnPackageChange
+ \ OnPackageDone
+ \ OnPackageStart
+ \ OnQuestComplete
+ \ OnRecoil
+ \ OnRelease
+ \ OnReset
+ \ OnSaveIni
+ \ OnScriptedSkillUp
+ \ OnScrollCast
+ \ OnSell
+ \ OnSkillUp
+ \ OnSoulTrap
+ \ OnSpellCast
+ \ OnStagger
+ \ OnStartCombat
+ \ OnTrigger
+ \ OnTriggerActor
+ \ OnTriggerMob
+ \ OnUnequip
+ \ OnVampireFeed
+ \ OnWaterDive
+ \ OnWaterSurface
+ \ PostLoadGame
+ \ QQQ
+ \ SaveGame
+ \ ScriptEffectFinish
+ \ ScriptEffectStart
+ \ ScriptEffectUpdate
+" }}}
+
+" Functions {{{
+" CS functions {{{
+syn keyword csFunction
+ \ Activate
+ \ AddAchievement
+ \ AddFlames
+ \ AddItem
+ \ AddScriptPackage
+ \ AddSpell
+ \ AddTopic
+ \ AdvSkill
+ \ AdvancePCLevel
+ \ AdvancePCSkill
+ \ Autosave
+ \ CanHaveFlames
+ \ CanPayCrimeGold
+ \ Cast
+ \ ClearOwnership
+ \ CloseCurrentOblivionGate
+ \ CloseOblivionGate
+ \ CompleteQuest
+ \ CreateFullActorCopy
+ \ DeleteFullActorCopy
+ \ Disable
+ \ DisableLinkedPathPoints
+ \ DisablePlayerControls
+ \ Dispel
+ \ DispelAllSpells
+ \ Drop
+ \ DropMe
+ \ DuplicateAllItems
+ \ DuplicateNPCStats
+ \ Enable
+ \ EnableFastTravel
+ \ EnableLinkedPathPoints
+ \ EnablePlayerControls
+ \ EquipItem
+ \ EssentialDeathReload
+ \ EvaluatePackage
+ \ ForceAV
+ \ ForceActorValue
+ \ ForceCloseOblivionGate
+ \ ForceFlee
+ \ ForceTakeCover
+ \ ForceWeather
+ \ GetAV
+ \ GetActionRef
+ \ GetActorValue
+ \ GetAlarmed
+ \ GetAmountSoldStolen
+ \ GetAngle
+ \ GetArmorRating
+ \ GetArmorRatingUpperBody
+ \ GetAttacked
+ \ GetBarterGold
+ \ GetBaseAV
+ \ GetBaseActorValue
+ \ GetButtonPressed
+ \ GetClassDefaultMatch
+ \ GetClothingValue
+ \ GetContainer
+ \ GetCrime
+ \ GetCrimeGold
+ \ GetCrimeKnown
+ \ GetCurrentAIPackage
+ \ GetCurrentAIProcedure
+ \ GetCurrentTime
+ \ GetCurrentWeatherPercent
+ \ GetDayOfWeek
+ \ GetDead
+ \ GetDeadCount
+ \ GetDestroyed
+ \ GetDetected
+ \ GetDetectionLevel
+ \ GetDisabled
+ \ GetDisposition
+ \ GetDistance
+ \ GetDoorDefaultOpen
+ \ GetEquipped
+ \ GetFactionRank
+ \ GetFactionRankDifference
+ \ GetFactionReaction
+ \ GetFatiguePercentage
+ \ GetForceRun
+ \ GetForceSneak
+ \ GetFriendHit
+ \ GetFurnitureMarkerID
+ \ GetGS
+ \ GetGameSetting
+ \ GetGlobalValue
+ \ GetGold
+ \ GetHeadingAngle
+ \ GetIdleDoneOnce
+ \ GetIgnoreFriendlyHits
+ \ GetInCell
+ \ GetInCellParam
+ \ GetInFaction
+ \ GetInSameCell
+ \ GetInWorldspace
+ \ GetInvestmentGold
+ \ GetIsAlerted
+ \ GetIsClass
+ \ GetIsClassDefault
+ \ GetIsCreature
+ \ GetIsCurrentPackage
+ \ GetIsCurrentWeather
+ \ GetIsGhost
+ \ GetIsID
+ \ GetIsPlayableRace
+ \ GetIsPlayerBirthsign
+ \ GetIsRace
+ \ GetIsReference
+ \ GetIsSex
+ \ GetIsUsedItem
+ \ GetIsUsedItemType
+ \ GetItemCount
+ \ GetKnockedState
+ \ GetLOS
+ \ GetLevel
+ \ GetLockLevel
+ \ GetLocked
+ \ GetMenuHasTrait
+ \ GetName
+ \ GetNoRumors
+ \ GetOffersServicesNow
+ \ GetOpenState
+ \ GetPCExpelled
+ \ GetPCFactionAttack
+ \ GetPCFactionMurder
+ \ GetPCFactionSteal
+ \ GetPCFactionSubmitAuthority
+ \ GetPCFame
+ \ GetPCInFaction
+ \ GetPCInfamy
+ \ GetPCIsClass
+ \ GetPCIsRace
+ \ GetPCIsSex
+ \ GetPCMiscStat
+ \ GetPCSleepHours
+ \ GetPackageTarget
+ \ GetParentRef
+ \ GetPersuasionNumber
+ \ GetPlayerControlsDisabled
+ \ GetPlayerHasLastRiddenHorse
+ \ GetPlayerInSEWorld
+ \ GetPos
+ \ GetQuestRunning
+ \ GetQuestVariable
+ \ GetRandomPercent
+ \ GetRestrained
+ \ GetScale
+ \ GetScriptVariable
+ \ GetSecondsPassed
+ \ GetSelf
+ \ GetShouldAttack
+ \ GetSitting
+ \ GetSleeping
+ \ GetStage
+ \ GetStageDone
+ \ GetStartingAngle
+ \ GetStartingPos
+ \ GetTalkedToPC
+ \ GetTalkedToPCParam
+ \ GetTimeDead
+ \ GetTotalPersuasionNumber
+ \ GetTrespassWarningLevel
+ \ GetUnconscious
+ \ GetUsedItemActivate
+ \ GetUsedItemLevel
+ \ GetVampire
+ \ GetWalkSpeed
+ \ GetWeaponAnimType
+ \ GetWeaponSkillType
+ \ GetWindSpeed
+ \ GoToJail
+ \ HasFlames
+ \ HasMagicEffect
+ \ HasVampireFed
+ \ IsActionRef
+ \ IsActor
+ \ IsActorAVictim
+ \ IsActorDetected
+ \ IsActorEvil
+ \ IsActorUsingATorch
+ \ IsActorsAIOff
+ \ IsAnimPlayer
+ \ IsCellOwner
+ \ IsCloudy
+ \ IsContinuingPackagePCNear
+ \ IsCurrentFurnitureObj
+ \ IsCurrentFurnitureRef
+ \ IsEssential
+ \ IsFacingUp
+ \ IsGuard
+ \ IsHorseStolen
+ \ IsIdlePlaying
+ \ IsInCombat
+ \ IsInDangerousWater
+ \ IsInInterior
+ \ IsInMyOwnedCell
+ \ IsLeftUp
+ \ IsOwner
+ \ IsPCAMurderer
+ \ IsPCSleeping
+ \ IsPlayerInJail
+ \ IsPlayerMovingIntoNewSpace
+ \ IsPlayersLastRiddenHorse
+ \ IsPleasant
+ \ IsRaining
+ \ IsRidingHorse
+ \ IsRunning
+ \ IsShieldOut
+ \ IsSneaking
+ \ IsSnowing
+ \ IsSpellTarget
+ \ IsSwimming
+ \ IsTalking
+ \ IsTimePassing
+ \ IsTorchOut
+ \ IsTrespassing
+ \ IsTurnArrest
+ \ IsWaiting
+ \ IsWeaponOut
+ \ IsXBox
+ \ IsYielding
+ \ Kill
+ \ KillActor
+ \ KillAllActors
+ \ Lock
+ \ Look
+ \ LoopGroup
+ \ Message
+ \ MessageBox
+ \ ModAV
+ \ ModActorValue
+ \ ModAmountSoldStolen
+ \ ModBarterGold
+ \ ModCrimeGold
+ \ ModDisposition
+ \ ModFactionRank
+ \ ModFactionReaction
+ \ ModPCAttribute
+ \ ModPCA
+ \ ModPCFame
+ \ ModPCInfamy
+ \ ModPCMiscStat
+ \ ModPCSkill
+ \ ModPCS
+ \ ModScale
+ \ MoveTo
+ \ MoveToMarker
+ \ PCB
+ \ PayFine
+ \ PayFineThief
+ \ PickIdle
+ \ PlaceAtMe
+ \ PlayBink
+ \ PlayGroup
+ \ PlayMagicEffectVisuals
+ \ PlayMagicShaderVisuals
+ \ PlaySound
+ \ PlaySound3D
+ \ PositionCell
+ \ PositionWorld
+ \ PreloadMagicEffect
+ \ PurgeCellBuffers
+ \ PushActorAway
+ \ RefreshTopicList
+ \ ReleaseWeatherOverride
+ \ RemoveAllItems
+ \ RemoveFlames
+ \ RemoveItem
+ \ RemoveMe
+ \ RemoveScriptPackage
+ \ RemoveSpell
+ \ Reset3DState
+ \ ResetFallDamageTimer
+ \ ResetHealth
+ \ ResetInterior
+ \ Resurrect
+ \ Rotate
+ \ SCAOnActor
+ \ SameFaction
+ \ SameFactionAsPC
+ \ SameRace
+ \ SameRaceAsPC
+ \ SameSex
+ \ SameSexAsPC
+ \ Say
+ \ SayTo
+ \ ScriptEffectElapsedSeconds
+ \ SelectPlayerSpell
+ \ SendTrespassAlarm
+ \ SetAV
+ \ SetActorAlpha
+ \ SetActorFullName
+ \ SetActorRefraction
+ \ SetActorValue
+ \ SetActorsAI
+ \ SetAlert
+ \ SetAllReachable
+ \ SetAllVisible
+ \ SetAngle
+ \ SetAtStart
+ \ SetBarterGold
+ \ SetCellFullName
+ \ SetCellOwnership
+ \ SetCellPublicFlag
+ \ SetClass
+ \ SetCrimeGold
+ \ SetDestroyed
+ \ SetDoorDefaultOpen
+ \ SetEssential
+ \ SetFactionRank
+ \ SetFactionReaction
+ \ SetForceRun
+ \ SetForceSneak
+ \ SetGhost
+ \ SetIgnoreFriendlyHits
+ \ SetInCharGen
+ \ SetInvestmentGold
+ \ SetItemValue
+ \ SetLevel
+ \ SetNoAvoidance
+ \ SetNoRumors
+ \ SetOpenState
+ \ SetOwnership
+ \ SetPCExpelled
+ \ SetPCFactionAttack
+ \ SetPCFactionMurder
+ \ SetPCFactionSteal
+ \ SetPCFactionSubmitAuthority
+ \ SetPCFame
+ \ SetPCInfamy
+ \ SetPCSleepHours
+ \ SetPackDuration
+ \ SetPlayerBirthsign
+ \ SetPlayerInSEWorld
+ \ SetPos
+ \ SetQuestObject
+ \ SetRestrained
+ \ SetRigidBodyMass
+ \ SetScale
+ \ SetSceneIsComplex
+ \ SetShowQuestItems
+ \ SetSize
+ \ SetStage
+ \ SetUnconscious
+ \ SetWeather
+ \ ShowBirthsignMenu
+ \ ShowClassMenu
+ \ ShowDialogSubtitles
+ \ ShowEnchantment
+ \ ShowMap
+ \ ShowRaceMenu
+ \ ShowSpellMaking
+ \ SkipAnim
+ \ StartCombat
+ \ StartConversation
+ \ StartQuest
+ \ StopCombat
+ \ StopCombatAlarmOnActor
+ \ StopLook
+ \ StopMagicEffectVisuals
+ \ StopMagicShaderVisuals
+ \ StopQuest
+ \ StopWaiting
+ \ StreamMusic
+ \ This
+ \ ToggleActorsAI
+ \ TrapUpdate
+ \ TriggerHitShader
+ \ UnequipItem
+ \ Unlock
+ \ VampireFeed
+ \ Wait
+ \ WakeUpPC
+ \ WhichServiceMenu
+ \ Yield
+ \ evp
+ \ pms
+ \ saa
+ \ sms
+" }}}
+
+" OBSE Functions {{{
+syn keyword obseFunction
+ \ abs
+ \ acos
+ \ activate2
+ \ actorvaluetocode
+ \ actorvaluetostring
+ \ actorvaluetostringc
+ \ addeffectitem
+ \ addeffectitemc
+ \ addfulleffectitem
+ \ addfulleffectitemc
+ \ additemns
+ \ addmagiceffectcounter
+ \ addmagiceffectcounterc
+ \ addmecounter
+ \ addmecounterc
+ \ addspellns
+ \ addtoleveledlist
+ \ ahammerkey
+ \ animpathincludes
+ \ appendtoname
+ \ asciitochar
+ \ asin
+ \ atan
+ \ atan2
+ \ avstring
+ \ calcleveleditem
+ \ calclevitemnr
+ \ calclevitems
+ \ cancastpower
+ \ cancorpsecheck
+ \ canfasttravelfromworld
+ \ cantraveltomapmarker
+ \ ceil
+ \ chartoascii
+ \ clearactivequest
+ \ clearhotkey
+ \ clearleveledlist
+ \ clearownershipt
+ \ clearplayerslastriddenhorse
+ \ clickmenubutton
+ \ cloneform
+ \ closeallmenus
+ \ closetextinput
+ \ colvec
+ \ comparefemalebipedpath
+ \ comparefemalegroundpath
+ \ comparefemaleiconpath
+ \ compareiconpath
+ \ comparemalebipedpath
+ \ comparemalegroundpath
+ \ comparemaleiconpath
+ \ comparemodelpath
+ \ comparename
+ \ comparenames
+ \ comparescripts
+ \ con_cal
+ \ con_getinisetting
+ \ con_hairtint
+ \ con_loadgame
+ \ con_modwatershader
+ \ con_playerspellbook
+ \ con_quitgame
+ \ con_refreshini
+ \ con_runmemorypass
+ \ con_save
+ \ con_saveini
+ \ con_setcamerafov
+ \ con_setclipdist
+ \ con_setfog
+ \ con_setgamesetting
+ \ con_setgamma
+ \ con_sethdrparam
+ \ con_setimagespaceglow
+ \ con_setinisetting
+ \ con_setskyparam
+ \ con_settargetrefraction
+ \ con_settargetrefractionfire
+ \ con_sexchange
+ \ con_tcl
+ \ con_tfc
+ \ con_tgm
+ \ con_toggleai
+ \ con_togglecombatai
+ \ con_toggledetection
+ \ con_togglemapmarkers
+ \ con_togglemenus
+ \ con_waterdeepcolor
+ \ con_waterreflectioncolor
+ \ con_watershallowcolor
+ \ copyalleffectitems
+ \ copyeyes
+ \ copyfemalebipedpath
+ \ copyfemalegroundpath
+ \ copyfemaleiconpath
+ \ copyhair
+ \ copyiconpath
+ \ copyir
+ \ copymalebipedpath
+ \ copymalegroundpath
+ \ copymaleiconpath
+ \ copymodelpath
+ \ copyname
+ \ copyntheffectitem
+ \ copyrace
+ \ cos
+ \ cosh
+ \ createtempref
+ \ creaturehasnohead
+ \ creaturehasnoleftarm
+ \ creaturehasnomovement
+ \ creaturehasnorightarm
+ \ creaturenocombatinwater
+ \ creatureusesweaponandshield
+ \ dacos
+ \ dasin
+ \ datan
+ \ datan2
+ \ dcos
+ \ dcosh
+ \ debugprint
+ \ deletefrominputtext
+ \ deletereference
+ \ disablecontrol
+ \ disablekey
+ \ disablemouse
+ \ dispatchevent
+ \ dispelnthactiveeffect
+ \ dispelnthae
+ \ dsin
+ \ dsinh
+ \ dtan
+ \ dtanh
+ \ enablecontrol
+ \ enablekey
+ \ enablemouse
+ \ equipitem2
+ \ equipitem2ns
+ \ equipitemns
+ \ equipitemsilent
+ \ equipme
+ \ eval
+ \ evaluatepackage
+ \ eventhandlerexist
+ \ exp
+ \ factionhasspecialcombat
+ \ fileexists
+ \ floor
+ \ fmod
+ \ forcecolumnvector
+ \ forcerowvector
+ \ generateidentitymatrix
+ \ generaterotationmatrix
+ \ generatezeromatrix
+ \ getactiveeffectcasters
+ \ getactiveeffectcodes
+ \ getactiveeffectcount
+ \ getactivemenucomponentid
+ \ getactivemenufilter
+ \ getactivemenumode
+ \ getactivemenuobject
+ \ getactivemenuref
+ \ getactivemenuselection
+ \ getactivequest
+ \ getactiveuicomponentfullname
+ \ getactiveuicomponentid
+ \ getactiveuicomponentname
+ \ getactoralpha
+ \ getactorbaselevel
+ \ getactorlightamount
+ \ getactormaxlevel
+ \ getactormaxswimbreath
+ \ getactorminlevel
+ \ getactorpackages
+ \ getactorsoullevel
+ \ getactorvaluec
+ \ getalchmenuapparatus
+ \ getalchmenuingredient
+ \ getalchmenuingredientcount
+ \ getallies
+ \ getallmodlocaldata
+ \ getaltcontrol2
+ \ getapbowench
+ \ getapench
+ \ getapparatustype
+ \ getappoison
+ \ getarmorar
+ \ getarmortype
+ \ getarrayvariable
+ \ getarrowprojectilebowenchantment
+ \ getarrowprojectileenchantment
+ \ getarrowprojectilepoison
+ \ getattackdamage
+ \ getavc
+ \ getavforbaseactor
+ \ getavforbaseactorc
+ \ getavmod
+ \ getavmodc
+ \ getavskillmastery
+ \ getavskillmasteryc
+ \ getbarteritem
+ \ getbarteritemquantity
+ \ getbaseactorvaluec
+ \ getbaseav2
+ \ getbaseav2c
+ \ getbaseav3
+ \ getbaseav3c
+ \ getbaseitems
+ \ getbaseobject
+ \ getbipediconpath
+ \ getbipedmodelpath
+ \ getbipedslotmask
+ \ getbirthsignspells
+ \ getbookcantbetaken
+ \ getbookisscroll
+ \ getbooklength
+ \ getbookskilltaught
+ \ getbooktext
+ \ getboundingbox
+ \ getboundingradius
+ \ getcalcalllevels
+ \ getcalceachincount
+ \ getcallingscript
+ \ getcellbehavesasexterior
+ \ getcellchanged
+ \ getcellclimate
+ \ getcelldetachtime
+ \ getcellfactionrank
+ \ getcelllighting
+ \ getcellmusictype
+ \ getcellnorthrotation
+ \ getcellresethours
+ \ getcellwatertype
+ \ getchancenone
+ \ getclass
+ \ getclassattribute
+ \ getclassmenuhighlightedclass
+ \ getclassmenuselectedclass
+ \ getclassskill
+ \ getclassskills
+ \ getclassspecialization
+ \ getclimatehasmasser
+ \ getclimatehassecunda
+ \ getclimatemoonphaselength
+ \ getclimatesunrisebegin
+ \ getclimatesunriseend
+ \ getclimatesunsetbegin
+ \ getclimatesunsetend
+ \ getclimatevolatility
+ \ getclosesound
+ \ getcloudspeedlower
+ \ getcloudspeedupper
+ \ getcombatspells
+ \ getcombatstyle
+ \ getcombatstyleacrobaticsdodgechance
+ \ getcombatstyleattackchance
+ \ getcombatstyleattackduringblockmult
+ \ getcombatstyleattacknotunderattackmult
+ \ getcombatstyleattackskillmodbase
+ \ getcombatstyleattackskillmodmult
+ \ getcombatstyleattackunderattackmult
+ \ getcombatstyleblockchance
+ \ getcombatstyleblocknotunderattackmult
+ \ getcombatstyleblockskillmodbase
+ \ getcombatstyleblockskillmodmult
+ \ getcombatstyleblockunderattackmult
+ \ getcombatstylebuffstandoffdist
+ \ getcombatstyledodgebacknotunderattackmult
+ \ getcombatstyledodgebacktimermax
+ \ getcombatstyledodgebacktimermin
+ \ getcombatstyledodgebackunderattackmult
+ \ getcombatstyledodgechance
+ \ getcombatstyledodgefatiguemodbase
+ \ getcombatstyledodgefatiguemodmult
+ \ getcombatstyledodgefwattackingmult
+ \ getcombatstyledodgefwnotattackingmult
+ \ getcombatstyledodgefwtimermax
+ \ getcombatstyledodgefwtimermin
+ \ getcombatstyledodgelrchance
+ \ getcombatstyledodgelrtimermax
+ \ getcombatstyledodgelrtimermin
+ \ getcombatstyledodgenotunderattackmult
+ \ getcombatstyledodgeunderattackmult
+ \ getcombatstyleencumberedspeedmodbase
+ \ getcombatstyleencumberedspeedmodmult
+ \ getcombatstylefleeingdisabled
+ \ getcombatstylegroupstandoffdist
+ \ getcombatstyleh2hbonustoattack
+ \ getcombatstyleholdtimermax
+ \ getcombatstyleholdtimermin
+ \ getcombatstyleidletimermax
+ \ getcombatstyleidletimermin
+ \ getcombatstyleignorealliesinarea
+ \ getcombatstylekobonustoattack
+ \ getcombatstylekobonustopowerattack
+ \ getcombatstylemeleealertok
+ \ getcombatstylepowerattackchance
+ \ getcombatstylepowerattackfatiguemodbase
+ \ getcombatstylepowerattackfatiguemodmult
+ \ getcombatstyleprefersranged
+ \ getcombatstylerangedstandoffdist
+ \ getcombatstylerangemaxmult
+ \ getcombatstylerangeoptimalmult
+ \ getcombatstylerejectsyields
+ \ getcombatstylerushattackchance
+ \ getcombatstylerushattackdistmult
+ \ getcombatstylestaggerbonustoattack
+ \ getcombatstylestaggerbonustopowerattack
+ \ getcombatstyleswitchdistmelee
+ \ getcombatstyleswitchdistranged
+ \ getcombatstylewillyield
+ \ getcombattarget
+ \ getcompletedquests
+ \ getcontainermenuview
+ \ getcontainerrespawns
+ \ getcontrol
+ \ getcreaturebasescale
+ \ getcreaturecombatskill
+ \ getcreatureflies
+ \ getcreaturemagicskill
+ \ getcreaturemodelpaths
+ \ getcreaturereach
+ \ getcreaturesoullevel
+ \ getcreaturesound
+ \ getcreaturesoundbase
+ \ getcreaturestealthskill
+ \ getcreatureswims
+ \ getcreaturetype
+ \ getcreaturewalks
+ \ getcrosshairref
+ \ getcurrentcharge
+ \ getcurrentclimateid
+ \ getcurrenteditorpackage
+ \ getcurrenteventname
+ \ getcurrenthealth
+ \ getcurrentpackage
+ \ getcurrentpackageprocedure
+ \ getcurrentquests
+ \ getcurrentregion
+ \ getcurrentregions
+ \ getcurrentscript
+ \ getcurrentsoullevel
+ \ getcurrentweatherid
+ \ getcursorpos
+ \ getdebugselection
+ \ getdescription
+ \ getdoorteleportrot
+ \ getdoorteleportx
+ \ getdoorteleporty
+ \ getdoorteleportz
+ \ geteditorid
+ \ geteditorsize
+ \ getenchantment
+ \ getenchantmentcharge
+ \ getenchantmentcost
+ \ getenchantmenttype
+ \ getenchmenubaseitem
+ \ getenchmenuenchitem
+ \ getenchmenusoulgem
+ \ getequipmentslot
+ \ getequipmentslotmask
+ \ getequippedcurrentcharge
+ \ getequippedcurrenthealth
+ \ getequippeditems
+ \ getequippedobject
+ \ getequippedtorchtimeleft
+ \ getequippedweaponpoison
+ \ geteyes
+ \ getfactions
+ \ getfalltimer
+ \ getfirstref
+ \ getfirstrefincell
+ \ getfogdayfar
+ \ getfogdaynear
+ \ getfognightfar
+ \ getfognightnear
+ \ getfollowers
+ \ getformfrommod
+ \ getformidstring
+ \ getfps
+ \ getfullgoldvalue
+ \ getgamedifficulty
+ \ getgameloaded
+ \ getgamerestarted
+ \ getgodmode
+ \ getgoldvalue
+ \ getgridstoload
+ \ getgroundsurfacematerial
+ \ gethair
+ \ gethaircolor
+ \ gethdrvalue
+ \ gethidesamulet
+ \ gethidesrings
+ \ gethighactors
+ \ gethorse
+ \ gethotkeyitem
+ \ geticonpath
+ \ getignoresresistance
+ \ getingredient
+ \ getingredientchance
+ \ getinputtext
+ \ getinventoryobject
+ \ getinvrefsforitem
+ \ getitems
+ \ getkeyname
+ \ getkeypress
+ \ getlastcreatedpotion
+ \ getlastcreatedspell
+ \ getlastenchanteditem
+ \ getlastsigilstonecreateditem
+ \ getlastsigilstoneenchanteditem
+ \ getlastss
+ \ getlastsscreated
+ \ getlastssitem
+ \ getlasttransactionitem
+ \ getlasttransactionquantity
+ \ getlastuniquecreatedpotion
+ \ getlastusedsigilstone
+ \ getlevcreaturetemplate
+ \ getleveledspells
+ \ getlevitembylevel
+ \ getlevitemindexbyform
+ \ getlevitemindexbylevel
+ \ getlightduration
+ \ getlightningfrequency
+ \ getlightradius
+ \ getlightrgb
+ \ getlinkeddoor
+ \ getloadedtypearray
+ \ getlocalgravity
+ \ getloopsound
+ \ getlowactors
+ \ getluckmodifiedskill
+ \ getmagiceffectareasound
+ \ getmagiceffectareasoundc
+ \ getmagiceffectbarterfactor
+ \ getmagiceffectbarterfactorc
+ \ getmagiceffectbasecost
+ \ getmagiceffectbasecostc
+ \ getmagiceffectboltsound
+ \ getmagiceffectboltsoundc
+ \ getmagiceffectcastingsound
+ \ getmagiceffectcastingsoundc
+ \ getmagiceffectchars
+ \ getmagiceffectcharsc
+ \ getmagiceffectcode
+ \ getmagiceffectcounters
+ \ getmagiceffectcountersc
+ \ getmagiceffectenchantfactor
+ \ getmagiceffectenchantfactorc
+ \ getmagiceffectenchantshader
+ \ getmagiceffectenchantshaderc
+ \ getmagiceffecthitshader
+ \ getmagiceffecthitshaderc
+ \ getmagiceffecthitsound
+ \ getmagiceffecthitsoundc
+ \ getmagiceffecticon
+ \ getmagiceffecticonc
+ \ getmagiceffectlight
+ \ getmagiceffectlightc
+ \ getmagiceffectmodel
+ \ getmagiceffectmodelc
+ \ getmagiceffectname
+ \ getmagiceffectnamec
+ \ getmagiceffectnumcounters
+ \ getmagiceffectnumcountersc
+ \ getmagiceffectotheractorvalue
+ \ getmagiceffectotheractorvaluec
+ \ getmagiceffectprojectilespeed
+ \ getmagiceffectprojectilespeedc
+ \ getmagiceffectresistvalue
+ \ getmagiceffectresistvaluec
+ \ getmagiceffectschool
+ \ getmagiceffectschoolc
+ \ getmagiceffectusedobject
+ \ getmagiceffectusedobjectc
+ \ getmagicitemeffectcount
+ \ getmagicitemtype
+ \ getmagicprojectilespell
+ \ getmapmarkers
+ \ getmapmarkertype
+ \ getmapmenumarkername
+ \ getmapmenumarkerref
+ \ getmaxav
+ \ getmaxavc
+ \ getmaxlevel
+ \ getmeareasound
+ \ getmeareasoundc
+ \ getmebarterc
+ \ getmebasecost
+ \ getmebasecostc
+ \ getmeboltsound
+ \ getmeboltsoundc
+ \ getmecastingsound
+ \ getmecastingsoundc
+ \ getmecounters
+ \ getmecountersc
+ \ getmeebarter
+ \ getmeebarterc
+ \ getmeenchant
+ \ getmeenchantc
+ \ getmeenchantshader
+ \ getmeenchantshaderc
+ \ getmehitshader
+ \ getmehitshaderc
+ \ getmehitsound
+ \ getmehitsoundc
+ \ getmeicon
+ \ getmeiconc
+ \ getmelight
+ \ getmelightc
+ \ getmemodel
+ \ getmemodelc
+ \ getmename
+ \ getmenamec
+ \ getmenufloatvalue
+ \ getmenumcounters
+ \ getmenumcountersc
+ \ getmenustringvalue
+ \ getmeotheractorvalue
+ \ getmeotheractorvaluec
+ \ getmeprojspeed
+ \ getmeprojspeedc
+ \ getmerchantcontainer
+ \ getmeresistvalue
+ \ getmeresistvaluec
+ \ getmeschool
+ \ getmeschoolc
+ \ getmessageboxtype
+ \ getmeusedobject
+ \ getmeusedobjectc
+ \ getmiddlehighactors
+ \ getmieffectcount
+ \ getminlevel
+ \ getmitype
+ \ getmodelpath
+ \ getmodindex
+ \ getmodlocaldata
+ \ getmousebuttonpress
+ \ getmousebuttonsswapped
+ \ getmpspell
+ \ getnextref
+ \ getnthacitveeffectmagnitude
+ \ getnthactiveeffectactorvalue
+ \ getnthactiveeffectbounditem
+ \ getnthactiveeffectcaster
+ \ getnthactiveeffectcode
+ \ getnthactiveeffectdata
+ \ getnthactiveeffectduration
+ \ getnthactiveeffectenchantobject
+ \ getnthactiveeffectmagicenchantobject
+ \ getnthactiveeffectmagicitem
+ \ getnthactiveeffectmagicitemindex
+ \ getnthactiveeffectmagnitude
+ \ getnthactiveeffectsummonref
+ \ getnthactiveeffecttimeelapsed
+ \ getnthaeav
+ \ getnthaebounditem
+ \ getnthaecaster
+ \ getnthaecode
+ \ getnthaedata
+ \ getnthaeduration
+ \ getnthaeindex
+ \ getnthaemagicenchantobject
+ \ getnthaemagicitem
+ \ getnthaemagnitude
+ \ getnthaesummonref
+ \ getnthaetime
+ \ getnthchildref
+ \ getnthdetectedactor
+ \ getntheffectitem
+ \ getntheffectitemactorvalue
+ \ getntheffectitemarea
+ \ getntheffectitemcode
+ \ getntheffectitemduration
+ \ getntheffectitemmagnitude
+ \ getntheffectitemname
+ \ getntheffectitemrange
+ \ getntheffectitemscript
+ \ getntheffectitemscriptname
+ \ getntheffectitemscriptschool
+ \ getntheffectitemscriptvisualeffect
+ \ getntheiarea
+ \ getntheiav
+ \ getntheicode
+ \ getntheiduration
+ \ getntheimagnitude
+ \ getntheiname
+ \ getntheirange
+ \ getntheiscript
+ \ getntheisschool
+ \ getntheisvisualeffect
+ \ getnthexplicitref
+ \ getnthfaction
+ \ getnthfactionrankname
+ \ getnthfollower
+ \ getnthlevitem
+ \ getnthlevitemcount
+ \ getnthlevitemlevel
+ \ getnthmagiceffectcounter
+ \ getnthmagiceffectcounterc
+ \ getnthmecounter
+ \ getnthmecounterc
+ \ getnthmodname
+ \ getnthpackage
+ \ getnthplayerspell
+ \ getnthracebonusskill
+ \ getnthracespell
+ \ getnthspell
+ \ getnumchildrefs
+ \ getnumdetectedactors
+ \ getnumericinisetting
+ \ getnumexplicitrefs
+ \ getnumfactions
+ \ getnumfollowers
+ \ getnumitems
+ \ getnumkeyspressed
+ \ getnumlevitems
+ \ getnumloadedmods
+ \ getnumloadedplugins
+ \ getnummousebuttonspressed
+ \ getnumpackages
+ \ getnumranks
+ \ getnumrefs
+ \ getnumrefsincell
+ \ getobjectcharge
+ \ getobjecthealth
+ \ getobjecttype
+ \ getobliviondirectory
+ \ getoblrevision
+ \ getoblversion
+ \ getopenkey
+ \ getopensound
+ \ getowner
+ \ getowningfactionrank
+ \ getowningfactionrequiredrank
+ \ getpackageallowfalls
+ \ getpackageallowswimming
+ \ getpackagealwaysrun
+ \ getpackagealwayssneak
+ \ getpackagearmorunequipped
+ \ getpackagecontinueifpcnear
+ \ getpackagedata
+ \ getpackagedefensivecombat
+ \ getpackagelocationdata
+ \ getpackagelockdoorsatend
+ \ getpackagelockdoorsatlocation
+ \ getpackagelockdoorsatstart
+ \ getpackagemustcomplete
+ \ getpackagemustreachlocation
+ \ getpackagenoidleanims
+ \ getpackageoffersservices
+ \ getpackageonceperday
+ \ getpackagescheduledata
+ \ getpackageskipfalloutbehavior
+ \ getpackagetargetdata
+ \ getpackageunlockdoorsatend
+ \ getpackageunlockdoorsatlocation
+ \ getpackageunlockdoorsatstart
+ \ getpackageusehorse
+ \ getpackageweaponsunequipped
+ \ getparentcell
+ \ getparentcellowner
+ \ getparentcellowningfactionrank
+ \ getparentcellowningfactionrequiredrank
+ \ getparentcellwaterheight
+ \ getparentworldspace
+ \ getpathnodelinkedref
+ \ getpathnodepos
+ \ getpathnodesinradius
+ \ getpathnodesinrect
+ \ getpcattributebonus
+ \ getpcattributebonusc
+ \ getpclastdroppeditem
+ \ getpclastdroppeditemref
+ \ getpclasthorse
+ \ getpclastloaddoor
+ \ getpcmajorskillups
+ \ getpcmovementspeedmodifier
+ \ getpcspelleffectivenessmodifier
+ \ getpctrainingsessionsused
+ \ getplayerbirthsign
+ \ getplayerskilladvances
+ \ getplayerskilladvancesc
+ \ getplayerskilluse
+ \ getplayerskillusec
+ \ getplayerslastactivatedloaddoor
+ \ getplayerslastriddenhorse
+ \ getplayerspell
+ \ getplayerspellcount
+ \ getpluginversion
+ \ getplyerspellcount
+ \ getprocesslevel
+ \ getprojectile
+ \ getprojectiledistancetraveled
+ \ getprojectilelifetime
+ \ getprojectilesource
+ \ getprojectilespeed
+ \ getprojectiletype
+ \ getqmcurrent
+ \ getqmitem
+ \ getqmmaximum
+ \ getqr
+ \ getquality
+ \ getquantitymenucurrentquantity
+ \ getquantitymenuitem
+ \ getquantitymenumaximumquantity
+ \ getrace
+ \ getraceattribute
+ \ getraceattributec
+ \ getracedefaulthair
+ \ getraceeyes
+ \ getracehairs
+ \ getracereaction
+ \ getracescale
+ \ getraceskillbonus
+ \ getraceskillbonusc
+ \ getracespellcount
+ \ getracevoice
+ \ getraceweight
+ \ getrawformidstring
+ \ getrefcount
+ \ getrefvariable
+ \ getrequiredskillexp
+ \ getrequiredskillexpc
+ \ getrider
+ \ getscript
+ \ getscriptactiveeffectindex
+ \ getselectedspells
+ \ getservicesmask
+ \ getsigilstoneuses
+ \ getskillgoverningattribute
+ \ getskillgoverningattributec
+ \ getskillspecialization
+ \ getskillspecializationc
+ \ getskilluseincrement
+ \ getskilluseincrementc
+ \ getsoulgemcapacity
+ \ getsoullevel
+ \ getsoundattenuation
+ \ getsoundplaying
+ \ getsourcemodindex
+ \ getspecialanims
+ \ getspellareaeffectignoreslos
+ \ getspellcount
+ \ getspelldisallowabsorbreflect
+ \ getspelleffectiveness
+ \ getspellexplodeswithnotarget
+ \ getspellhostile
+ \ getspellimmunetosilence
+ \ getspellmagickacost
+ \ getspellmasterylevel
+ \ getspellpcstart
+ \ getspells
+ \ getspellschool
+ \ getspellscripteffectalwaysapplies
+ \ getspelltype
+ \ getstageentries
+ \ getstageids
+ \ getstringgamesetting
+ \ getstringinisetting
+ \ getsundamage
+ \ getsunglare
+ \ gettailmodelpath
+ \ gettargets
+ \ gettelekinesisref
+ \ getteleportcell
+ \ getteleportcellname
+ \ getterrainheight
+ \ gettextinputcontrolpressed
+ \ gettextinputcursorpos
+ \ gettexturepath
+ \ gettilechildren
+ \ gettiletraits
+ \ gettimeleft
+ \ gettotalactiveeffectmagnitude
+ \ gettotalactiveeffectmagnitudec
+ \ gettotalaeabilitymagnitude
+ \ gettotalaeabilitymagnitudec
+ \ gettotalaealchemymagnitude
+ \ gettotalaealchemymagnitudec
+ \ gettotalaeallspellsmagnitude
+ \ gettotalaeallspellsmagnitudec
+ \ gettotalaediseasemagnitude
+ \ gettotalaediseasemagnitudec
+ \ gettotalaeenchantmentmagnitude
+ \ gettotalaeenchantmentmagnitudec
+ \ gettotalaelesserpowermagnitude
+ \ gettotalaelesserpowermagnitudec
+ \ gettotalaemagnitude
+ \ gettotalaemagnitudec
+ \ gettotalaenonabilitymagnitude
+ \ gettotalaenonabilitymagnitudec
+ \ gettotalaepowermagnitude
+ \ gettotalaepowermagnitudec
+ \ gettotalaespellmagnitude
+ \ gettotalaespellmagnitudec
+ \ gettotalpcattributebonus
+ \ gettrainerlevel
+ \ gettrainerskill
+ \ gettransactioninfo
+ \ gettransdelta
+ \ gettravelhorse
+ \ getusedpowers
+ \ getusertime
+ \ getvariable
+ \ getvelocity
+ \ getverticalvelocity
+ \ getwaterheight
+ \ getwatershader
+ \ getweahtercloudspeedupper
+ \ getweaponreach
+ \ getweaponspeed
+ \ getweapontype
+ \ getweatherclassification
+ \ getweathercloudspeedlower
+ \ getweathercloudspeedupper
+ \ getweathercolor
+ \ getweatherfogdayfar
+ \ getweatherfogdaynear
+ \ getweatherfognightfar
+ \ getweatherfognightnear
+ \ getweatherhdrvalue
+ \ getweatherlightningfrequency
+ \ getweatheroverride
+ \ getweathersundamage
+ \ getweathersunglare
+ \ getweathertransdelta
+ \ getweatherwindspeed
+ \ getweight
+ \ getworldparentworld
+ \ getworldspaceparentworldspace
+ \ globalvariableexists
+ \ hammerkey
+ \ hasbeenpickedup
+ \ haseffectshader
+ \ haslowlevelprocessing
+ \ hasmodel
+ \ hasname
+ \ hasnopersuasion
+ \ hasspell
+ \ hastail
+ \ hasvariable
+ \ haswater
+ \ holdkey
+ \ iconpathincludes
+ \ identitymat
+ \ incrementplayerskilluse
+ \ incrementplayerskillusec
+ \ ininvertfasttravel
+ \ insertininputtext
+ \ isactivatable
+ \ isactivator
+ \ isactorrespawning
+ \ isalchemyitem
+ \ isammo
+ \ isanimgroupplaying
+ \ isanimplaying
+ \ isapparatus
+ \ isarmor
+ \ isattacking
+ \ isautomaticdoor
+ \ isbartermenuactive
+ \ isbipediconpathvalid
+ \ isbipedmodelpathvalid
+ \ isblocking
+ \ isbook
+ \ iscantwait
+ \ iscasting
+ \ iscellpublic
+ \ isclassattribute
+ \ isclassattributec
+ \ isclassskill
+ \ isclassskillc
+ \ isclonedform
+ \ isclothing
+ \ isconsoleopen
+ \ iscontainer
+ \ iscontrol
+ \ iscontroldisabled
+ \ iscontrolpressed
+ \ iscreature
+ \ iscreaturebiped
+ \ isdigit
+ \ isdiseased
+ \ isdodging
+ \ isdoor
+ \ isequipped
+ \ isfactionevil
+ \ isfactionhidden
+ \ isfemale
+ \ isflora
+ \ isflying
+ \ isfood
+ \ isformvalid
+ \ isfurniture
+ \ isgamemessagebox
+ \ isglobalcollisiondisabled
+ \ isharvested
+ \ ishiddendoor
+ \ isiconpathvalid
+ \ isinair
+ \ isingredient
+ \ isinoblivion
+ \ isjumping
+ \ iskey
+ \ iskeydisabled
+ \ iskeypressed
+ \ iskeypressed2
+ \ iskeypressed3
+ \ isletter
+ \ islight
+ \ islightcarriable
+ \ isloaddoor
+ \ ismagiceffectcanrecover
+ \ ismagiceffectcanrecoverc
+ \ ismagiceffectdetrimental
+ \ ismagiceffectdetrimentalc
+ \ ismagiceffectforenchanting
+ \ ismagiceffectforenchantingc
+ \ ismagiceffectforspellmaking
+ \ ismagiceffectforspellmakingc
+ \ ismagiceffecthostile
+ \ ismagiceffecthostilec
+ \ ismagiceffectmagnitudepercent
+ \ ismagiceffectmagnitudepercentc
+ \ ismagiceffectonselfallowed
+ \ ismagiceffectonselfallowedc
+ \ ismagiceffectontargetallowed
+ \ ismagiceffectontargetallowedc
+ \ ismagiceffectontouchallowed
+ \ ismagiceffectontouchallowedc
+ \ ismagicitemautocalc
+ \ ismajor
+ \ ismajorc
+ \ ismajorref
+ \ ismapmarkervisible
+ \ ismecanrecover
+ \ ismecanrecoverc
+ \ ismedetrimental
+ \ ismedetrimentalc
+ \ ismeforenchanting
+ \ ismeforenchantingc
+ \ ismeforspellmaking
+ \ ismeforspellmakingc
+ \ ismehostile
+ \ ismehostilec
+ \ ismemagnitudepercent
+ \ ismemagnitudepercentc
+ \ ismeonselfallowed
+ \ ismeonselfallowedc
+ \ ismeontargetallowed
+ \ ismeontargetallowedc
+ \ ismeontouchallowed
+ \ ismeontouchallowedc
+ \ isminimalusedoor
+ \ ismiscitem
+ \ ismodelpathvalid
+ \ ismodloaded
+ \ ismovingbackward
+ \ ismovingforward
+ \ ismovingleft
+ \ ismovingright
+ \ isnaked
+ \ isnthactiveeffectapplied
+ \ isntheffectitemscripted
+ \ isntheffectitemscripthostile
+ \ isntheishostile
+ \ isobliviongate
+ \ isoblivioninterior
+ \ isoblivionworld
+ \ isofflimits
+ \ isonground
+ \ ispathnodedisabled
+ \ ispcleveloffset
+ \ ispersistent
+ \ isplayable
+ \ isplayable2
+ \ isplugininstalled
+ \ ispoison
+ \ ispotion
+ \ ispowerattacking
+ \ isprintable
+ \ ispunctuation
+ \ isquestcomplete
+ \ isquestitem
+ \ isracebonusskill
+ \ isracebonusskillc
+ \ israceplayable
+ \ isrecoiling
+ \ isrefdeleted
+ \ isreference
+ \ isrefessential
+ \ isscripted
+ \ issigilstone
+ \ issoulgem
+ \ isspellhostile
+ \ isstaggered
+ \ issummonable
+ \ istaken
+ \ istextinputinuse
+ \ isthirdperson
+ \ isturningleft
+ \ isturningright
+ \ isunderwater
+ \ isunsaferespawns
+ \ isuppercase
+ \ isweapon
+ \ leftshift
+ \ linktodoor
+ \ loadgameex
+ \ log
+ \ log10
+ \ logicaland
+ \ logicalnot
+ \ logicalor
+ \ logicalxor
+ \ magiceffectcodefromchars
+ \ magiceffectfromchars
+ \ magiceffectfromcode
+ \ magiceffectfxpersists
+ \ magiceffectfxpersistsc
+ \ magiceffecthasnoarea
+ \ magiceffecthasnoareac
+ \ magiceffecthasnoduration
+ \ magiceffecthasnodurationc
+ \ magiceffecthasnohiteffect
+ \ magiceffecthasnohiteffectc
+ \ magiceffecthasnoingredient
+ \ magiceffecthasnoingredientc
+ \ magiceffecthasnomagnitude
+ \ magiceffecthasnomagnitudec
+ \ magiceffectusesarmor
+ \ magiceffectusesarmorc
+ \ magiceffectusesattribute
+ \ magiceffectusesattributec
+ \ magiceffectusescreature
+ \ magiceffectusescreaturec
+ \ magiceffectusesotheractorvalue
+ \ magiceffectusesotheractorvaluec
+ \ magiceffectusesskill
+ \ magiceffectusesskillc
+ \ magiceffectusesweapon
+ \ magiceffectusesweaponc
+ \ magichaseffect
+ \ magichaseffectc
+ \ magicitemhaseffect
+ \ magicitemhaseffectcode
+ \ magicitemhaseffectcount
+ \ magicitemhaseffectcountc
+ \ magicitemhaseffectcountcode
+ \ magicitemhaseffectitemscript
+ \ matadd
+ \ matchpotion
+ \ matinv
+ \ matmult
+ \ matrixadd
+ \ matrixdeterminant
+ \ matrixinvert
+ \ matrixmultiply
+ \ matrixrref
+ \ matrixscale
+ \ matrixsubtract
+ \ matrixtrace
+ \ matrixtranspose
+ \ matscale
+ \ matsubtract
+ \ mecodefromchars
+ \ mefxpersists
+ \ mefxpersistsc
+ \ mehasnoarea
+ \ mehasnoareac
+ \ mehasnoduration
+ \ mehasnodurationc
+ \ mehasnohiteffect
+ \ mehasnohiteffectc
+ \ mehasnoingredient
+ \ mehasnoingredientc
+ \ mehasnomagnitude
+ \ mehasnomagnitudec
+ \ menuholdkey
+ \ menumode
+ \ menureleasekey
+ \ menutapkey
+ \ messageboxex
+ \ messageex
+ \ meusesarmor
+ \ meusesarmorc
+ \ meusesattribute
+ \ meusesattributec
+ \ meusescreature
+ \ meusescreaturec
+ \ meusesotheractorvalue
+ \ meusesotheractorvaluec
+ \ meusesskill
+ \ meusesskillc
+ \ meusesweapon
+ \ meusesweaponc
+ \ modactorvalue2
+ \ modactorvaluec
+ \ modarmorar
+ \ modattackdamage
+ \ modav2
+ \ modavc
+ \ modavmod
+ \ modavmodc
+ \ modcurrentcharge
+ \ modelpathincludes
+ \ modenchantmentcharge
+ \ modenchantmentcost
+ \ modequippedcurrentcharge
+ \ modequippedcurrenthealth
+ \ modfemalebipedpath
+ \ modfemalegroundpath
+ \ modfemaleiconpath
+ \ modgoldvalue
+ \ modiconpath
+ \ modlocaldataexists
+ \ modmalebipedpath
+ \ modmalegroundpath
+ \ modmaleiconpath
+ \ modmodelpath
+ \ modname
+ \ modnthactiveeffectmagnitude
+ \ modnthaemagnitude
+ \ modntheffectitemarea
+ \ modntheffectitemduration
+ \ modntheffectitemmagnitude
+ \ modntheffectitemscriptname
+ \ modntheiarea
+ \ modntheiduration
+ \ modntheimagnitude
+ \ modntheisname
+ \ modobjectcharge
+ \ modobjecthealth
+ \ modpcmovementspeed
+ \ modpcspelleffectiveness
+ \ modplayerskillexp
+ \ modplayerskillexpc
+ \ modquality
+ \ modsigilstoneuses
+ \ modspellmagickacost
+ \ modweaponreach
+ \ modweaponspeed
+ \ modweight
+ \ movemousex
+ \ movemousey
+ \ movetextinputcursor
+ \ nameincludes
+ \ numtohex
+ \ offersapparatus
+ \ offersarmor
+ \ offersbooks
+ \ offersclothing
+ \ offersingredients
+ \ offerslights
+ \ offersmagicitems
+ \ offersmiscitems
+ \ offerspotions
+ \ offersrecharging
+ \ offersrepair
+ \ offersservicesc
+ \ offersspells
+ \ offerstraining
+ \ offersweapons
+ \ oncontroldown
+ \ onkeydown
+ \ opentextinput
+ \ outputlocalmappicturesoverride
+ \ overrideactorswimbreath
+ \ parentcellhaswater
+ \ pathedgeexists
+ \ playidle
+ \ pow
+ \ print
+ \ printactivetileinfo
+ \ printc
+ \ printd
+ \ printtileinfo
+ \ printtoconsole
+ \ questexists
+ \ racos
+ \ rand
+ \ rasin
+ \ ratan
+ \ ratan2
+ \ rcos
+ \ rcosh
+ \ refreshcurrentclimate
+ \ releasekey
+ \ removealleffectitems
+ \ removebasespell
+ \ removeenchantment
+ \ removeequippedweaponpoison
+ \ removeeventhandler
+ \ removefromleveledlist
+ \ removeitemns
+ \ removelevitembylevel
+ \ removemeir
+ \ removemodlocaldata
+ \ removentheffect
+ \ removentheffectitem
+ \ removenthlevitem
+ \ removenthmagiceffectcounter
+ \ removenthmagiceffectcounterc
+ \ removenthmecounter
+ \ removenthmecounterc
+ \ removescript
+ \ removescr
+ \ removespellns
+ \ resetallvariables
+ \ resetfalrior
+ \ resolvemodindex
+ \ rightshift
+ \ rotmat
+ \ rowvec
+ \ rsin
+ \ rsinh
+ \ rtan
+ \ rtanh
+ \ runbatchscript
+ \ runscriptline
+ \ saespassalarm
+ \ setactivequest
+ \ setactrfullname
+ \ setactormaxswimbreath
+ \ setactorrespawns
+ \ setactorswimbreath
+ \ setactorvaluec
+ \ setalvisible
+ \ setaltcontrol2
+ \ setapparatustype
+ \ setarmorar
+ \ setarmortype
+ \ setarrowprojectilebowenchantment
+ \ setarrowprojectileenchantment
+ \ setarrowprojectilepoison
+ \ setattackdamage
+ \ setavc
+ \ setavmod
+ \ setavmodc
+ \ setbaseform
+ \ setbipediconpathex
+ \ setbipedmodelpathex
+ \ setbipedslotmask
+ \ setbookcantbetaken
+ \ setbookisscroll
+ \ setbookskilltaught
+ \ setbuttonpressed
+ \ setcalcalllevels
+ \ setcamerafov2
+ \ setcancastpower
+ \ setcancorpsecheck
+ \ setcanfasttravelfromworld
+ \ setcantraveltomapmarker
+ \ setcantwait
+ \ setcellbehavesasexterior
+ \ setcellclimate
+ \ setcellhaswater
+ \ setcellispublic
+ \ setcelllighting
+ \ setcellmusictype
+ \ setcellublicflag
+ \ setcellresethours
+ \ setcellwaterheight
+ \ setcellwatertype
+ \ setchancenone
+ \ setclassattribute
+ \ setclassattributec
+ \ setclassskills
+ \ setclassskills2
+ \ setclassspecialization
+ \ setclimatehasmasser
+ \ setclimatehasmassser
+ \ setclimatehassecunda
+ \ setclimatemoonphaselength
+ \ setclimatesunrisebegin
+ \ setclimatesunriseend
+ \ setclimatesunsetbegin
+ \ setclimatesunsetend
+ \ setclimatevolatility
+ \ setclosesound
+ \ setcloudspeedlower
+ \ setcloudspeedupper
+ \ setcombatstyle
+ \ setcombatstyleacrobaticsdodgechance
+ \ setcombatstyleattackchance
+ \ setcombatstyleattackduringblockmult
+ \ setcombatstyleattacknotunderattackmult
+ \ setcombatstyleattackskillmodbase
+ \ setcombatstyleattackskillmodmult
+ \ setcombatstyleattackunderattackmult
+ \ setcombatstyleblockchance
+ \ setcombatstyleblocknotunderattackmult
+ \ setcombatstyleblockskillmodbase
+ \ setcombatstyleblockskillmodmult
+ \ setcombatstyleblockunderattackmult
+ \ setcombatstylebuffstandoffdist
+ \ setcombatstyledodgebacknotunderattackmult
+ \ setcombatstyledodgebacktimermax
+ \ setcombatstyledodgebacktimermin
+ \ setcombatstyledodgebackunderattackmult
+ \ setcombatstyledodgechance
+ \ setcombatstyledodgefatiguemodbase
+ \ setcombatstyledodgefatiguemodmult
+ \ setcombatstyledodgefwattackingmult
+ \ setcombatstyledodgefwnotattackingmult
+ \ setcombatstyledodgefwtimermax
+ \ setcombatstyledodgefwtimermin
+ \ setcombatstyledodgelrchance
+ \ setcombatstyledodgelrtimermax
+ \ setcombatstyledodgelrtimermin
+ \ setcombatstyledodgenotunderattackmult
+ \ setcombatstyledodgeunderattackmult
+ \ setcombatstyleencumberedspeedmodbase
+ \ setcombatstyleencumberedspeedmodmult
+ \ setcombatstylefleeingdisabled
+ \ setcombatstylegroupstandoffdist
+ \ setcombatstyleh2hbonustoattack
+ \ setcombatstyleholdtimermax
+ \ setcombatstyleholdtimermin
+ \ setcombatstyleidletimermax
+ \ setcombatstyleidletimermin
+ \ setcombatstyleignorealliesinarea
+ \ setcombatstylekobonustoattack
+ \ setcombatstylekobonustopowerattack
+ \ setcombatstylemeleealertok
+ \ setcombatstylepowerattackchance
+ \ setcombatstylepowerattackfatiguemodbase
+ \ setcombatstylepowerattackfatiguemodmult
+ \ setcombatstyleprefersranged
+ \ setcombatstylerangedstandoffdist
+ \ setcombatstylerangemaxmult
+ \ setcombatstylerangeoptimalmult
+ \ setcombatstylerejectsyields
+ \ setcombatstylerushattackchance
+ \ setcombatstylerushattackdistmult
+ \ setcombatstylestaggerbonustoattack
+ \ setcombatstylestaggerbonustopowerattack
+ \ setcombatstyleswitchdistmelee
+ \ setcombatstyleswitchdistranged
+ \ setcombatstylewillyield
+ \ setcontainerrespawns
+ \ setcontrol
+ \ setcreatureskill
+ \ setcreaturesoundbase
+ \ setcreaturetype
+ \ setcurrentcharge
+ \ setcurrenthealth
+ \ setcurrentsoullevel
+ \ setdebugmode
+ \ setdescription
+ \ setdetectionstate
+ \ setdisableglobalcollision
+ \ setdoorteleport
+ \ setenchantment
+ \ setenchantmentcharge
+ \ setenchantmentcost
+ \ setenchantmenttype
+ \ setequipmentslot
+ \ setequippedcurrentcharge
+ \ setequippedcurrenthealth
+ \ setequippedweaponpoison
+ \ seteventhandler
+ \ seteyes
+ \ setfactionevil
+ \ setfactionhasspecialcombat
+ \ setfactionhidden
+ \ setfactonreaction
+ \ setfactionspecialcombat
+ \ setfemale
+ \ setfemalebipedpath
+ \ setfemalegroundpath
+ \ setfemaleiconpath
+ \ setflycameraspeedmult
+ \ setfogdayfar
+ \ setfogdaynear
+ \ setfognightfar
+ \ setfognightnear
+ \ setforcsneak
+ \ setfunctionvalue
+ \ setgamedifficulty
+ \ setgoldvalue
+ \ setgoldvalue_t
+ \ setgoldvaluet
+ \ sethair
+ \ setharvested
+ \ sethasbeenpickedup
+ \ sethdrvalue
+ \ sethidesamulet
+ \ sethidesrings
+ \ sethotkeyitem
+ \ seticonpath
+ \ setignoresresistance
+ \ setingredient
+ \ setingredientchance
+ \ setinputtext
+ \ setinvertfasttravel
+ \ setisautomaticdoor
+ \ setiscontrol
+ \ setisfood
+ \ setishiddendoor
+ \ setisminimalusedoor
+ \ setisobliviongate
+ \ setisplayable
+ \ setlevcreaturetemplate
+ \ setlightduration
+ \ setlightningfrequency
+ \ setlightradius
+ \ setlightrgb
+ \ setlocalgravity
+ \ setlocalgravityvector
+ \ setloopsound
+ \ setlowlevelprocessing
+ \ setmaagiceffectuseactorvalue
+ \ setmagiceffectareasound
+ \ setmagiceffectareasoundc
+ \ setmagiceffectbarterfactor
+ \ setmagiceffectbarterfactorc
+ \ setmagiceffectbasecost
+ \ setmagiceffectbasecostc
+ \ setmagiceffectboltsound
+ \ setmagiceffectboltsoundc
+ \ setmagiceffectcanrecover
+ \ setmagiceffectcanrecoverc
+ \ setmagiceffectcastingsound
+ \ setmagiceffectcastingsoundc
+ \ setmagiceffectcounters
+ \ setmagiceffectcountersc
+ \ setmagiceffectenchantfactor
+ \ setmagiceffectenchantfactorc
+ \ setmagiceffectenchantshader
+ \ setmagiceffectenchantshaderc
+ \ setmagiceffectforenchanting
+ \ setmagiceffectforenchantingc
+ \ setmagiceffectforspellmaking
+ \ setmagiceffectforspellmakingc
+ \ setmagiceffectfxpersists
+ \ setmagiceffectfxpersistsc
+ \ setmagiceffecthitshader
+ \ setmagiceffecthitshaderc
+ \ setmagiceffecthitsound
+ \ setmagiceffecthitsoundc
+ \ setmagiceffecticon
+ \ setmagiceffecticonc
+ \ setmagiceffectisdetrimental
+ \ setmagiceffectisdetrimentalc
+ \ setmagiceffectishostile
+ \ setmagiceffectishostilec
+ \ setmagiceffectlight
+ \ setmagiceffectlightc
+ \ setmagiceffectmagnitudepercent
+ \ setmagiceffectmagnitudepercentc
+ \ setmagiceffectmodel
+ \ setmagiceffectmodelc
+ \ setmagiceffectname
+ \ setmagiceffectnamec
+ \ setmagiceffectnoarea
+ \ setmagiceffectnoareac
+ \ setmagiceffectnoduration
+ \ setmagiceffectnodurationc
+ \ setmagiceffectnohiteffect
+ \ setmagiceffectnohiteffectc
+ \ setmagiceffectnoingredient
+ \ setmagiceffectnoingredientc
+ \ setmagiceffectnomagnitude
+ \ setmagiceffectnomagnitudec
+ \ setmagiceffectonselfallowed
+ \ setmagiceffectonselfallowedc
+ \ setmagiceffectontargetallowed
+ \ setmagiceffectontargetallowedc
+ \ setmagiceffectontouchallowed
+ \ setmagiceffectontouchallowedc
+ \ setmagiceffectotheractorvalue
+ \ setmagiceffectotheractorvaluec
+ \ setmagiceffectprojectilespeed
+ \ setmagiceffectprojectilespeedc
+ \ setmagiceffectresistvalue
+ \ setmagiceffectresistvaluec
+ \ setmagiceffectschool
+ \ setmagiceffectschoolc
+ \ setmagiceffectuseactorvaluec
+ \ setmagiceffectusedobject
+ \ setmagiceffectusedobjectc
+ \ setmagiceffectusesactorvalue
+ \ setmagiceffectusesactorvaluec
+ \ setmagiceffectusesarmor
+ \ setmagiceffectusesarmorc
+ \ setmagiceffectusesattribute
+ \ setmagiceffectusesattributec
+ \ setmagiceffectusescreature
+ \ setmagiceffectusescreaturec
+ \ setmagiceffectusesskill
+ \ setmagiceffectusesskillc
+ \ setmagiceffectusesweapon
+ \ setmagiceffectusesweaponc
+ \ setmagicitemautocalc
+ \ setmagicprojectilespell
+ \ setmalebipedpath
+ \ setmalegroundpath
+ \ setmaleiconpath
+ \ setmapmarkertype
+ \ setmapmarkervisible
+ \ setmeareasound
+ \ setmeareasoundc
+ \ setmebarterfactor
+ \ setmebarterfactorc
+ \ setmebasecost
+ \ setmebasecostc
+ \ setmeboltsound
+ \ setmeboltsoundc
+ \ setmecanrecover
+ \ setmecanrecoverc
+ \ setmecastingsound
+ \ setmecastingsoundc
+ \ setmeenchantfactor
+ \ setmeenchantfactorc
+ \ setmeenchantshader
+ \ setmeenchantshaderc
+ \ setmeforenchanting
+ \ setmeforenchantingc
+ \ setmeforspellmaking
+ \ setmeforspellmakingc
+ \ setmefxpersists
+ \ setmefxpersistsc
+ \ setmehitshader
+ \ setmehitshaderc
+ \ setmehitsound
+ \ setmehitsoundc
+ \ setmeicon
+ \ setmeiconc
+ \ setmeisdetrimental
+ \ setmeisdetrimentalc
+ \ setmeishostile
+ \ setmeishostilec
+ \ setmelight
+ \ setmelightc
+ \ setmemagnitudepercent
+ \ setmemagnitudepercentc
+ \ setmemodel
+ \ setmemodelc
+ \ setmename
+ \ setmenamec
+ \ setmenoarea
+ \ setmenoareac
+ \ setmenoduration
+ \ setmenodurationc
+ \ setmenohiteffect
+ \ setmenohiteffectc
+ \ setmenoingredient
+ \ setmenoingredientc
+ \ setmenomagnitude
+ \ setmenomagnitudec
+ \ setmenufloatvalue
+ \ setmenustringvalue
+ \ setmeonselfallowed
+ \ setmeonselfallowedc
+ \ setmeontargetallowed
+ \ setmeontargetallowedc
+ \ setmeontouchallowed
+ \ setmeontouchallowedc
+ \ setmeotheractorvalue
+ \ setmeotheractorvaluec
+ \ setmeprojectilespeed
+ \ setmeprojectilespeedc
+ \ setmerchantcontainer
+ \ setmeresistvalue
+ \ setmeresistvaluec
+ \ setmeschool
+ \ setmeschoolc
+ \ setmessageicon
+ \ setmessagesound
+ \ setmeuseactorvalue
+ \ setmeuseactorvaluec
+ \ setmeusedobject
+ \ setmeusedobjectc
+ \ setmeusesarmor
+ \ setmeusesarmorc
+ \ setmeusesattribute
+ \ setmeusesattributec
+ \ setmeusescreature
+ \ setmeusescreaturec
+ \ setmeusesskill
+ \ setmeusesskillc
+ \ setmeusesweapon
+ \ setmeusesweaponc
+ \ setmodelpath
+ \ setmodlocaldata
+ \ setmousespeedx
+ \ setmousespeedy
+ \ setmpspell
+ \ setname
+ \ setnameex
+ \ setnopersuasion
+ \ setnthactiveeffectmagnitude
+ \ setnthaemagnitude
+ \ setntheffectitemactorvalue
+ \ setntheffectitemactorvaluec
+ \ setntheffectitemarea
+ \ setntheffectitemduration
+ \ setntheffectitemmagnitude
+ \ setntheffectitemrange
+ \ setntheffectitemscript
+ \ setntheffectitemscripthostile
+ \ setntheffectitemscriptname
+ \ setntheffectitemscriptnameex
+ \ setntheffectitemscriptschool
+ \ setntheffectitemscriptvisualeffect
+ \ setntheffectitemscriptvisualeffectc
+ \ setntheiarea
+ \ setntheiav
+ \ setntheiavc
+ \ setntheiduration
+ \ setntheimagnitude
+ \ setntheirange
+ \ setntheiscript
+ \ setntheishostile
+ \ setntheisname
+ \ setntheisschool
+ \ setntheisvisualeffect
+ \ setntheisvisualeffectc
+ \ setnthfactionranknameex
+ \ setnumericgamesetting
+ \ setnumericinisetting
+ \ setobjectcharge
+ \ setobjecthealth
+ \ setoffersapparatus
+ \ setoffersarmor
+ \ setoffersbooks
+ \ setoffersclothing
+ \ setoffersingredients
+ \ setofferslights
+ \ setoffersmagicitems
+ \ setoffersmiscitems
+ \ setofferspotions
+ \ setoffersrecharging
+ \ setoffersrepair
+ \ setoffersservicesc
+ \ setoffersspells
+ \ setofferstraining
+ \ setoffersweapons
+ \ setolmpgrids
+ \ setopenkey
+ \ setopensound
+ \ setopenstip
+ \ setownership_t
+ \ setowningrequiredrank
+ \ setpackageallowfalls
+ \ setpackageallowswimming
+ \ setpackagealwaysrun
+ \ setpackagealwayssneak
+ \ setpackagearmorunequipped
+ \ setpackagecontinueifpcnear
+ \ setpackagedata
+ \ setpackagedefensivecombat
+ \ setpackagelocationdata
+ \ setpackagelockdoorsatend
+ \ setpackagelockdoorsatlocation
+ \ setpackagelockdoorsatstart
+ \ setpackagemustcomplete
+ \ setpackagemustreachlocation
+ \ setpackagenoidleanims
+ \ setpackageoffersservices
+ \ setpackageonceperday
+ \ setpackagescheduledata
+ \ setpackageskipfalloutbehavior
+ \ setpackagetarget
+ \ setpackagetargetdata
+ \ setpackageunlockdoorsatend
+ \ setpackageunlockdoorsatlocation
+ \ setpackageunlockdoorsatstart
+ \ setpackageusehorse
+ \ setpackageweaponsunequipped
+ \ setparentcellowningfactionrequiredrank
+ \ setpathnodedisabled
+ \ setpcamurderer
+ \ setpcattributebonus
+ \ setpcattributebonusc
+ \ setpcexpy
+ \ setpcleveloffset
+ \ setpcmajorskillups
+ \ setpctrainingsessionsused
+ \ setplayerbseworld
+ \ setplayerprojectile
+ \ setplayerskeletonpath
+ \ setplayerskilladvances
+ \ setplayerskilladvancesc
+ \ setplayerslastriddenhorse
+ \ setpos_t
+ \ setpowertimer
+ \ setprojectilesource
+ \ setprojectilespeed
+ \ setquality
+ \ setquestitem
+ \ setracealias
+ \ setraceplayable
+ \ setracescale
+ \ setracevoice
+ \ setraceweight
+ \ setrefcount
+ \ setrefessential
+ \ setreale
+ \ setscaleex
+ \ setscript
+ \ setsigilstoneuses
+ \ setskillgoverningattribute
+ \ setskillgoverningattributec
+ \ setskillspecialization
+ \ setskillspecializationc
+ \ setskilluseincrement
+ \ setskilluseincrementc
+ \ setsoulgemcapacity
+ \ setsoullevel
+ \ setsoundattenuation
+ \ setspellareaeffectignoreslos
+ \ setspelldisallowabsorbreflect
+ \ setspellexplodeswithnotarget
+ \ setspellhostile
+ \ setspellimmunetosilence
+ \ setspellmagickacost
+ \ setspellmasterylevel
+ \ setspellpcstart
+ \ setspellscripteffectalwaysapplies
+ \ setspelltype
+ \ setstagedate
+ \ setstagetext
+ \ setstringgamesettingex
+ \ setstringinisetting
+ \ setsummonable
+ \ setsundamage
+ \ setsunglare
+ \ settaken
+ \ settextinputcontrolhandler
+ \ settextinputdefaultcontrolsdisabled
+ \ settextinputhandler
+ \ settexturepath
+ \ settimeleft
+ \ settrainerlevel
+ \ settrainerskill
+ \ settransdelta
+ \ settravelhorse
+ \ setunsafecontainer
+ \ setvelocity
+ \ setverticalvelocity
+ \ setweaponreach
+ \ setweaponspeed
+ \ setweapontype
+ \ setweathercloudspeedlower
+ \ setweathercloudspeedupper
+ \ setweathercolor
+ \ setweatherfogdayfar
+ \ setweatherfogdaynear
+ \ setweatherfognightfar
+ \ setweatherfognightnear
+ \ setweatherhdrvalue
+ \ setweatherlightningfrequency
+ \ setweathersundamage
+ \ setweathersunglare
+ \ setweathertransdelta
+ \ setweatherwindspeed
+ \ setweight
+ \ setwindspeed
+ \ showellmaking
+ \ sin
+ \ sinh
+ \ skipansqrt
+ \ squareroot
+ \ startcc
+ \ stringtoactorvalue
+ \ tan
+ \ tanh
+ \ tapcontrol
+ \ tapkey
+ \ testexpr
+ \ thiactorsai
+ \ togglecreaturemodel
+ \ togglefirstperson
+ \ toggleskillperk
+ \ togglespecialanim
+ \ tolower
+ \ tonumber
+ \ tostring
+ \ toupper
+ \ trapuphitshader
+ \ triggerplayerskilluse
+ \ triggerplayerskillusec
+ \ typeof
+ \ uncompletequest
+ \ unequipitemns
+ \ unequipitemsilent
+ \ unequipme
+ \ unhammerkey
+ \ unsetstagetext
+ \ update3d
+ \ updatecontainermenu
+ \ updatespellpurchasemenu
+ \ updatetextinput
+ \ vecmag
+ \ vecnorm
+ \ vectorcross
+ \ vectordot
+ \ vectormagnitude
+ \ vectornormalize
+ \ zeromat
+" }}}
+
+" Array Functions {{{
+syn keyword obseArrayFunction
+ \ ar_Append
+ \ ar_BadNumericIndex
+ \ ar_BadStringIndex
+ \ ar_Construct
+ \ ar_Copy
+ \ ar_CustomSort
+ \ ar_DeepCopy
+ \ ar_Dump
+ \ ar_DumpID
+ \ ar_Erase
+ \ ar_Find
+ \ ar_First
+ \ ar_HasKey
+ \ ar_Insert
+ \ ar_InsertRange
+ \ ar_Keys
+ \ ar_Last
+ \ ar_List
+ \ ar_Map
+ \ ar_Next
+ \ ar_Null
+ \ ar_Prev
+ \ ar_Range
+ \ ar_Resize
+ \ ar_Size
+ \ ar_Sort
+ \ ar_SortAlpha
+" }}}
+
+" String Functions {{{
+syn keyword obseStringFunction
+ \ sv_ToLower
+ \ sv_ToUpper
+ \ sv_Compare
+ \ sv_Construct
+ \ sv_Count
+ \ sv_Destruct
+ \ sv_Erase
+ \ sv_Find
+ \ sv_Insert
+ \ sv_Length
+ \ sv_Percentify
+ \ sv_Replace
+ \ sv_Split
+ \ sv_ToNumeric
+" }}}
+
+" Pluggy Functions {{{
+syn keyword pluggyFunction
+ \ ArrayCmp
+ \ ArrayCount
+ \ ArrayEsp
+ \ ArrayProtect
+ \ ArraySize
+ \ AutoSclHudS
+ \ AutoSclHudT
+ \ CopyArray
+ \ CopyString
+ \ CreateArray
+ \ CreateEspBook
+ \ CreateString
+ \ DelAllHudSs
+ \ DelAllHudTs
+ \ DelFile
+ \ DelHudS
+ \ DelHudT
+ \ DelTxtFile
+ \ DestroyAllArrays
+ \ DestroyAllStrings
+ \ DestroyArray
+ \ DestroyString
+ \ DupArray
+ \ EspToString
+ \ FileToString
+ \ FindFirstFile
+ \ FindFloatInArray
+ \ FindInArray
+ \ FindNextFile
+ \ FindRefInArray
+ \ FirstFreeInArray
+ \ FirstInArray
+ \ FixName
+ \ FixNameEx
+ \ FloatToString
+ \ FmtString
+ \ FromOBSEString
+ \ FromTSFC
+ \ GetEsp
+ \ GetFileSize
+ \ GetInArray
+ \ GetRefEsp
+ \ GetTypeInArray
+ \ Halt
+ \ HasFixedName
+ \ HudSEsp
+ \ HudSProtect
+ \ HudS_Align
+ \ HudS_L
+ \ HudS_Opac
+ \ HudS_SclX
+ \ HudS_SclY
+ \ HudS_Show
+ \ HudS_Tex
+ \ HudS_X
+ \ HudS_Y
+ \ HudTEsp
+ \ HudTInfo
+ \ HudTProtect
+ \ HudT_Align
+ \ HudT_Font
+ \ HudT_L
+ \ HudT_Opac
+ \ HudT_SclX
+ \ HudT_SclY
+ \ HudT_Show
+ \ HudT_Text
+ \ HudT_X
+ \ HudT_Y
+ \ HudsInfo
+ \ IniDelKey
+ \ IniGetNthSection
+ \ IniKeyExists
+ \ IniReadFloat
+ \ IniReadInt
+ \ IniReadRef
+ \ IniReadString
+ \ IniSectionsCount
+ \ IniWriteFloat
+ \ IniWriteInt
+ \ IniWriteRef
+ \ IniWriteString
+ \ IntToHex
+ \ IntToString
+ \ IsHUDEnabled
+ \ IsPluggyDataReset
+ \ KillMenu
+ \ LC
+ \ LongToRef
+ \ ModRefEsp
+ \ NewHudS
+ \ NewHudT
+ \ PackArray
+ \ PauseBox
+ \ PlgySpcl
+ \ RefToLong
+ \ RefToString
+ \ RemInArray
+ \ RenFile
+ \ RenTxtFile
+ \ ResetName
+ \ RunBatString
+ \ SanString
+ \ ScreenInfo
+ \ SetFloatInArray
+ \ SetHudT
+ \ SetInArray
+ \ SetRefInArray
+ \ SetString
+ \ StrLC
+ \ StringCat
+ \ StringCmp
+ \ StringEsp
+ \ StringGetName
+ \ StringGetNameEx
+ \ StringIns
+ \ StringLen
+ \ StringMsg
+ \ StringMsgBox
+ \ StringPos
+ \ StringProtect
+ \ StringRep
+ \ StringSetName
+ \ StringSetNameEx
+ \ StringToFloat
+ \ StringToInt
+ \ StringToRef
+ \ StringToTxtFile
+ \ ToOBSE
+ \ ToOBSEString
+ \ ToTSFC
+ \ TxtFileExists
+ \ UserFileExists
+ \ csc
+ \ rcsc
+" }}}
+
+" tfscFunction {{{
+syn keyword tfscFunction
+ \ StrAddNewLine
+ \ StrAppend
+ \ StrAppendCharCode
+ \ StrCat
+ \ StrClear
+ \ StrClearLast
+ \ StrCompare
+ \ StrCopy
+ \ StrDel
+ \ StrDeleteAll
+ \ StrExpr
+ \ StrGetFemaleBipedPath
+ \ StrGetFemaleGroundPath
+ \ StrGetFemaleIconPath
+ \ StrGetMaleBipedPath
+ \ StrGetMaleIconPath
+ \ StrGetModelPath
+ \ StrGetName
+ \ StrGetNthEffectItemScriptName
+ \ StrGetNthFactionRankName
+ \ StrGetRandomName
+ \ StrIDReplace
+ \ StrLength
+ \ StrLoad
+ \ StrMessageBox
+ \ StrNew
+ \ StrPrint
+ \ StrReplace
+ \ StrSave
+ \ StrSet
+ \ StrSetFemaleBipedPath
+ \ StrSetFemaleGroundPath
+ \ StrSetFemaleIconPath
+ \ StrSetMaleBipedPath
+ \ StrSetMaleIconPath
+ \ StrSetModelPath
+ \ StrSetName
+ \ StrSetNthEffectItemScriptName
+" }}}
+
+" Blockhead Functions {{{
+syn keyword blockheadFunction
+ \ GetBodyAssetOverride
+ \ GetFaceGenAge
+ \ GetHeadAssetOverride
+ \ RefreshAnimData
+ \ RegisterEquipmentOverrideHandler
+ \ ResetAgeTextureOverride
+ \ ResetBodyAssetOverride
+ \ ResetHeadAssetOverride
+ \ SetAgeTextureOverride
+ \ SetBodyAssetOverride
+ \ SetFaceGenAge
+ \ SetHeadAssetOverride
+ \ ToggleAnimOverride
+ \ UnregisterEquipmentOverrideHandler
+" }}}
+
+" switchNightEyeShaderFunction {{{
+syn keyword switchNightEyeShaderFunction
+ \ EnumNightEyeShader
+ \ SetNightEyeShader
+" }}}
+
+" Oblivion Reloaded Functions {{{
+syn keyword obseivionReloadedFunction
+ \ cameralookat
+ \ cameralookatposition
+ \ camerareset
+ \ camerarotate
+ \ camerarotatetoposition
+ \ cameratranslate
+ \ cameratranslatetoposition
+ \ getlocationname
+ \ getsetting
+ \ getversion
+ \ getweathername
+ \ isthirdperson
+ \ setcustomconstant
+ \ setextraeffectenabled
+ \ setsetting
+" }}}
+" menuQue Functions {{{
+syn keyword menuQueFunction
+ \ GetAllSkills
+ \ GetAVSkillMasteryLevelC
+ \ GetAVSkillMasteryLevelF
+ \ GetFontLoaded
+ \ GetGenericButtonPressed
+ \ GetLoadedFonts
+ \ GetLocalMapSeen
+ \ GetMenuEventType
+ \ GetMenuFloatValue
+ \ GetMenuStringValue
+ \ GetMouseImage
+ \ GetMousePos
+ \ GetPlayerSkillAdvancesF
+ \ GetPlayerSkillUseF
+ \ GetRequiredSkillExpC
+ \ GetRequiredSkillExpF
+ \ GetSkillCode
+ \ GetSkillForm
+ \ GetSkillGoverningAttributeF
+ \ GetSkillSpecializationC
+ \ GetSkillSpecializationF
+ \ GetSkillUseIncrementF
+ \ GetTextEditBox
+ \ GetTextEditString
+ \ GetTrainingMenuCost
+ \ GetTrainingMenuLevel
+ \ GetTrainingMenuSkill
+ \ GetWorldMapData
+ \ GetWorldMapDoor
+ \ IncrementPlayerSkillUseF
+ \ InsertXML
+ \ InsertXMLTemplate
+ \ IsTextEditInUse
+ \ Kyoma_Test
+ \ ModPlayerSkillExpF
+ \ mqCreateMenuFloatValue
+ \ mqCreateMenuStringValue
+ \ mqGetActiveQuest
+ \ mqGetActiveQuestTargets
+ \ mqGetCompletedQuests
+ \ mqGetCurrentQuests
+ \ mqGetEnchMenuBaseItem
+ \ mqGetHighlightedClass
+ \ mqGetMapMarkers
+ \ mqGetMenuActiveChildIndex
+ \ mqGetMenuActiveFloatValue
+ \ mqGetMenuActiveStringValue
+ \ mqGetMenuChildCount
+ \ mqGetMenuChildFloatValue
+ \ mqGetMenuChildHasTrait
+ \ mqGetMenuChildName
+ \ mqGetMenuChildStringValue
+ \ mqGetMenuGlobalFloatValue
+ \ mqGetMenuGlobalStringValue
+ \ mqGetQuestCompleted
+ \ mqGetSelectedClass
+ \ mqSetActiveQuest
+ \ mqSetMenuActiveFloatValue
+ \ mqSetMenuActiveStringValue
+ \ mqSetMenuChildFloatValue
+ \ mqSetMenuChildStringValue
+ \ mqSetMenuGlobalStringValue
+ \ mqSetMenuGlobalFloatValue
+ \ mqSetMessageBoxSource
+ \ mqUncompleteQuest
+ \ RemoveMenuEventHandler
+ \ SetMenuEventHandler
+ \ SetMouseImage
+ \ SetPlayerSkillAdvancesF
+ \ SetSkillGoverningAttributeF
+ \ SetSkillSpecializationC
+ \ SetSkillSpecializationF
+ \ SetSkillUseIncrementF
+ \ SetTextEditString
+ \ SetTrainerSkillC
+ \ SetWorldMapData
+ \ ShowGenericMenu
+ \ ShowLevelUpMenu
+ \ ShowMagicPopupMenu
+ \ ShowTextEditMenu
+ \ ShowTrainingMenu
+ \ tile_FadeFloat
+ \ tile_GetFloat
+ \ tile_GetInfo
+ \ tile_GetName
+ \ tile_GetString
+ \ tile_GetVar
+ \ tile_HasTrait
+ \ tile_SetFloat
+ \ tile_SetString
+ \ TriggerPlayerSkillUseF
+ \ UpdateLocalMap
+" }}}
+
+" eaxFunction {{{
+syn keyword eaxFunction
+ \ CreateEAXeffect
+ \ DeleteEAXeffect
+ \ DisableEAX
+ \ EAXcopyEffect
+ \ EAXeffectExists
+ \ EAXeffectsAreEqual
+ \ EAXgetActiveEffect
+ \ EAXnumEffects
+ \ EAXpushEffect
+ \ EAXpopEffect
+ \ EAXremoveAllInstances
+ \ EAXremoveFirstInstance
+ \ EAXstackIsEmpty
+ \ EAXstackSize
+ \ EnableEAX
+ \ GetEAXAirAbsorptionHF
+ \ GetEAXDecayHFRatio
+ \ GetEAXDecayTime
+ \ GetEAXEnvironment
+ \ GetEAXEnvironmentSize
+ \ GetEAXEnvironmentDiffusion
+ \ GetEAXReflections
+ \ GetEAXReflectionsDelay
+ \ GetEAXReverb
+ \ GetEAXReverbDelay
+ \ GetEAXRoom
+ \ GetEAXRoomHF
+ \ GetEAXRoomRolloffFactor
+ \ InitializeEAX
+ \ IsEAXEnabled
+ \ IsEAXInitialized
+ \ SetEAXAirAbsorptionHF
+ \ SetEAXallProperties
+ \ SetEAXDecayTime
+ \ SetEAXDecayHFRatio
+ \ SetEAXEnvironment
+ \ SetEAXEnvironmentSize
+ \ SetEAXEnvironmentDiffusion
+ \ SetEAXReflections
+ \ SetEAXReflectionsDelay
+ \ SetEAXReverb
+ \ SetEAXReverbDelay
+ \ SetEAXRoom
+ \ SetEAXRoomHF
+ \ SetEAXRoomRolloffFactor
+" }}}
+
+" networkPipeFunction {{{
+syn keyword networkPipeFunction
+ \ NetworkPipe_CreateClient
+ \ NetworkPipe_GetData
+ \ NetworkPipe_IsNewGame
+ \ NetworkPipe_KillClient
+ \ NetworkPipe_Receive
+ \ NetworkPipe_SetData
+ \ NetworkPipe_Send
+ \ NetworkPipe_StartService
+ \ NetworkPipe_StopService
+" }}}
+
+" nifseFunction {{{
+syn keyword nifseFunction
+ \ BSFurnitureMarkerGetPositionRefs
+ \ BSFurnitureMarkerSetPositionRefs
+ \ GetNifTypeIndex
+ \ NiAVObjectAddProperty
+ \ NiAVObjectClearCollisionObject
+ \ NiAVObjectCopyCollisionObject
+ \ NiAVObjectDeleteProperty
+ \ NiAVObjectGetCollisionMode
+ \ NiAVObjectGetCollisionObject
+ \ NiAVObjectGetLocalRotation
+ \ NiAVObjectGetLocalScale
+ \ NiAVObjectGetLocalTransform
+ \ NiAVObjectGetLocalTranslation
+ \ NiAVObjectGetNumProperties
+ \ NiAVObjectGetProperties
+ \ NiAVObjectGetPropertyByType
+ \ NiAVObjectSetCollisionMode
+ \ NiAVObjectSetLocalRotation
+ \ NiAVObjectSetLocalScale
+ \ NiAVObjectSetLocalTransform
+ \ NiAVObjectSetLocalTranslation
+ \ NiAlphaPropertyGetBlendState
+ \ NiAlphaPropertyGetDestinationBlendFunction
+ \ NiAlphaPropertyGetSourceBlendFunction
+ \ NiAlphaPropertyGetTestFunction
+ \ NiAlphaPropertyGetTestState
+ \ NiAlphaPropertyGetTestThreshold
+ \ NiAlphaPropertyGetTriangleSortMode
+ \ NiAlphaPropertySetBlendState
+ \ NiAlphaPropertySetDestinationBlendFunction
+ \ NiAlphaPropertySetSourceBlendFunction
+ \ NiAlphaPropertySetTestFunction
+ \ NiAlphaPropertySetTestState
+ \ NiAlphaPropertySetTestThreshold
+ \ NiAlphaPropertySetTriangleSortMode
+ \ NiExtraDataGetArray
+ \ NiExtraDataGetName
+ \ NiExtraDataGetNumber
+ \ NiExtraDataGetString
+ \ NiExtraDataSetArray
+ \ NiExtraDataSetName
+ \ NiExtraDataSetNumber
+ \ NiExtraDataSetString
+ \ NiMaterialPropertyGetAmbientColor
+ \ NiMaterialPropertyGetDiffuseColor
+ \ NiMaterialPropertyGetEmissiveColor
+ \ NiMaterialPropertyGetGlossiness
+ \ NiMaterialPropertyGetSpecularColor
+ \ NiMaterialPropertyGetTransparency
+ \ NiMaterialPropertySetAmbientColor
+ \ NiMaterialPropertySetDiffuseColor
+ \ NiMaterialPropertySetEmissiveColor
+ \ NiMaterialPropertySetGlossiness
+ \ NiMaterialPropertySetSpecularColor
+ \ NiMaterialPropertySetTransparency
+ \ NiNodeAddChild
+ \ NiNodeCopyChild
+ \ NiNodeDeleteChild
+ \ NiNodeGetChildByName
+ \ NiNodeGetChildren
+ \ NiNodeGetNumChildren
+ \ NiObjectGetType
+ \ NiObjectGetTypeName
+ \ NiObjectNETAddExtraData
+ \ NiObjectNETDeleteExtraData
+ \ NiObjectNETGetExtraData
+ \ NiObjectNETGetExtraDataByName
+ \ NiObjectNETGetName
+ \ NiObjectNETGetNumExtraData
+ \ NiObjectNETSetName
+ \ NiObjectTypeDerivesFrom
+ \ NiSourceTextureGetFile
+ \ NiSourceTextureIsExternal
+ \ NiSourceTextureSetExternalTexture
+ \ NiStencilPropertyGetFaceDrawMode
+ \ NiStencilPropertyGetFailAction
+ \ NiStencilPropertyGetPassAction
+ \ NiStencilPropertyGetStencilFunction
+ \ NiStencilPropertyGetStencilMask
+ \ NiStencilPropertyGetStencilRef
+ \ NiStencilPropertyGetStencilState
+ \ NiStencilPropertyGetZFailAction
+ \ NiStencilPropertySetFaceDrawMode
+ \ NiStencilPropertySetFailAction
+ \ NiStencilPropertySetPassAction
+ \ NiStencilPropertySetStencilFunction
+ \ NiStencilPropertySetStencilMask
+ \ NiStencilPropertySetStencilRef
+ \ NiStencilPropertySetStencilState
+ \ NiStencilPropertySetZFailAction
+ \ NiTexturingPropertyAddTextureSource
+ \ NiTexturingPropertyDeleteTextureSource
+ \ NiTexturingPropertyGetTextureCenterOffset
+ \ NiTexturingPropertyGetTextureClampMode
+ \ NiTexturingPropertyGetTextureCount
+ \ NiTexturingPropertyGetTextureFilterMode
+ \ NiTexturingPropertyGetTextureFlags
+ \ NiTexturingPropertyGetTextureRotation
+ \ NiTexturingPropertyGetTextureSource
+ \ NiTexturingPropertyGetTextureTiling
+ \ NiTexturingPropertyGetTextureTranslation
+ \ NiTexturingPropertyGetTextureUVSet
+ \ NiTexturingPropertyHasTexture
+ \ NiTexturingPropertySetTextureCenterOffset
+ \ NiTexturingPropertySetTextureClampMode
+ \ NiTexturingPropertySetTextureCount
+ \ NiTexturingPropertySetTextureFilterMode
+ \ NiTexturingPropertySetTextureFlags
+ \ NiTexturingPropertySetTextureHasTransform
+ \ NiTexturingPropertySetTextureRotation
+ \ NiTexturingPropertySetTextureTiling
+ \ NiTexturingPropertySetTextureTranslation
+ \ NiTexturingPropertySetTextureUVSet
+ \ NiTexturingPropertyTextureHasTransform
+ \ NiVertexColorPropertyGetLightingMode
+ \ NiVertexColorPropertyGetVertexMode
+ \ NiVertexColorPropertySetLightingMode
+ \ NiVertexColorPropertySetVertexMode
+ \ NifClose
+ \ NifGetAltGrip
+ \ NifGetBackShield
+ \ NifGetNumBlocks
+ \ NifGetOffHand
+ \ NifGetOriginalPath
+ \ NifGetPath
+ \ NifOpen
+ \ NifWriteToDisk
+" }}}
+
+" reidFunction {{{
+syn keyword reidFunction
+ \ GetRuntimeEditorID
+" }}}
+
+" runtimeDebuggerFunction {{{
+syn keyword runtimeDebuggerFunction
+ \ DebugBreak
+ \ ToggleDebugBreaking
+" }}}
+
+" addActorValuesFunction {{{
+syn keyword addActorValuesFunction
+ \ DumpActorValueC
+ \ DumpActorValueF
+ \ GetActorValueBaseCalcC
+ \ GetActorValueBaseCalcF
+ \ GetActorValueCurrentC
+ \ GetActorValueCurrentF
+ \ GetActorValueMaxC
+ \ GetActorValueMaxF
+ \ GetActorValueModC
+ \ GetActorValueModF
+ \ ModActorValueModC
+ \ ModActorValueModF
+ \ SetActorValueModC
+ \ SetActorValueModF
+ \ DumpAVC
+ \ DumpAVF
+ \ GetAVModC
+ \ GetAVModF
+ \ ModAVModC
+ \ ModAVModF
+ \ SetAVModC
+ \ SetAVModF
+ \ GetAVBaseCalcC
+ \ GetAVBaseCalcF
+ \ GetAVMaxC
+ \ GetAVMaxF
+ \ GetAVCurrentC
+ \ GetAVCurrent
+" }}}
+
+" memoryDumperFunction {{{
+syn keyword memoryDumperFunction
+ \ SetDumpAddr
+ \ SetDumpType
+ \ SetFadeAmount
+ \ SetObjectAddr
+ \ ShowMemoryDump
+" }}}
+
+" algoholFunction {{{
+syn keyword algoholFunction
+ \ QFromAxisAngle
+ \ QFromEuler
+ \ QInterpolate
+ \ QMultQuat
+ \ QMultVector3
+ \ QNormalize
+ \ QToEuler
+ \ V3Crossproduct
+ \ V3Length
+ \ V3Normalize
+" }}}
+
+" soundCommandsFunction {{{
+syn keyword soundCommandsFunction
+ \ FadeMusic
+ \ GetEffectsVolume
+ \ GetFootVolume
+ \ GetMasterVolume
+ \ GetMusicVolume
+ \ GetVoiceVolume
+ \ PlayMusicFile
+ \ SetEffectsVolume
+ \ SetFootVolume
+ \ SetMasterVolume
+ \ SetMusicVolume
+ \ SetVoiceVolume
+" }}}
+
+" emcFunction {{{
+syn keyword emcFunction
+ \ emcAddPathToPlaylist
+ \ emcCreatePlaylist
+ \ emcGetAllPlaylists
+ \ emcGetAfterBattleDelay
+ \ emcGetBattleDelay
+ \ emcGetEffectsVolume
+ \ emcGetFadeTime
+ \ emcGetFootVolume
+ \ emcGetMasterVolume
+ \ emcGetMaxRestoreTime
+ \ emcGetMusicSpeed
+ \ emcGetMusicType
+ \ emcGetMusicVolume
+ \ emcGetPauseTime
+ \ emcGetPlaylist
+ \ emcGetPlaylistTracks
+ \ emcGetTrackName
+ \ emcGetTrackDuration
+ \ emcGetTrackPosition
+ \ emcGetVoiceVolume
+ \ emcIsBattleOverridden
+ \ emcIsMusicOnHold
+ \ emcIsMusicSwitching
+ \ emcIsPlaylistActive
+ \ emcMusicNextTrack
+ \ emcMusicPause
+ \ emcMusicRestart
+ \ emcMusicResume
+ \ emcMusicStop
+ \ emcPlaylistExists
+ \ emcPlayTrack
+ \ emcRestorePlaylist
+ \ emcSetAfterBattleDelay
+ \ emcSetBattleDelay
+ \ emcSetBattleOverride
+ \ emcSetEffectsVolume
+ \ emcSetFadeTime
+ \ emcSetFootVolume
+ \ emcSetMasterVolume
+ \ emcSetMaxRestoreTime
+ \ emcSetMusicHold
+ \ emcSetMusicSpeed
+ \ emcSetMusicVolume
+ \ emcSetPauseTime
+ \ emcSetPlaylist
+ \ emcSetTrackPosition
+ \ emcSetMusicType
+ \ emcSetVoiceVolume
+" }}}
+
+" vipcxjFunction {{{
+syn keyword vipcxjFunction
+ \ vcAddMark
+ \ vcGetFilePath
+ \ vcGetHairColorRGB
+ \ vcGetValueNumeric
+ \ vcGetValueString
+ \ vcIsMarked
+ \ vcPrintIni
+ \ vcSetActorState
+ \ vcSetHairColor
+ \ vcSetHairColorRGB
+ \ vcSetHairColorRGB3P
+" }}}
+
+" cameraCommandsFunction {{{
+syn keyword cameraCommandsFunction
+ \ CameraGetRef
+ \ CameraLookAt
+ \ CameraLookAtPosition
+ \ CameraMove
+ \ CameraMoveToPosition
+ \ CameraReset
+ \ CameraRotate
+ \ CameraRotateToPosition
+ \ CameraSetRef
+ \ CameraStopLook
+" }}}
+
+" obmeFunction {{{
+syn keyword obmeFunction
+ \ ClearNthEIBaseCost
+ \ ClearNthEIEffectName
+ \ ClearNthEIHandlerParam
+ \ ClearNthEIHostility
+ \ ClearNthEIIconPath
+ \ ClearNthEIResistAV
+ \ ClearNthEISchool
+ \ ClearNthEIVFXCode
+ \ CreateMgef
+ \ GetMagicEffectHandlerC
+ \ GetMagicEffectHandlerParamC
+ \ GetMagicEffectHostilityC
+ \ GetNthEIBaseCost
+ \ GetNthEIEffectName
+ \ GetNthEIHandlerParam
+ \ GetNthEIHostility
+ \ GetNthEIIconPath
+ \ GetNthEIResistAV
+ \ GetNthEISchool
+ \ GetNthEIVFXCode
+ \ ResolveMgefCode
+ \ SetMagicEffectHandlerC
+ \ SetMagicEffectHandlerIntParamC
+ \ SetMagicEffectHandlerRefParamC
+ \ SetMagicEffectHostilityC
+ \ SetNthEIBaseCost
+ \ SetNthEIEffectName
+ \ SetNthEIHandlerIntParam
+ \ SetNthEIHandlerRefParam
+ \ SetNthEIHostility
+ \ SetNthEIIconPath
+ \ SetNthEIResistAV
+ \ SetNthEISchool
+ \ SetNthEIVFXCode
+" }}}
+
+" conscribeFunction {{{
+syn keyword conscribeFunction
+ \ DeleteLinesFromLog
+ \ GetLogLineCount
+ \ GetRegisteredLogNames
+ \ ReadFromLog
+ \ RegisterLog
+ \ Scribe
+ \ UnregisterLog
+" }}}
+
+" systemDialogFunction {{{
+syn keyword systemDialogFunction
+ \ Sysdlg_Browser
+ \ Sysdlg_ReadBrowser
+ \ Sysdlg_TextInput
+" }}}
+
+" csiFunction {{{
+syn keyword csiFunction
+ \ ClearSpellIcon
+ \ HasAssignedIcon
+ \ OverwriteSpellIcon
+ \ SetSpellIcon
+" }}}
+
+" haelFunction {{{
+syn keyword haelFunction
+ \ GetHUDActiveEffectLimit
+ \ SetHUDActiveEffectLimit
+" }}}
+
+" lcdFunction {{{
+syn keyword lcdFunction
+ \ lcd_addinttobuffer
+ \ lcd_addtexttobuffer
+ \ lcd_clearrect
+ \ lcd_cleartextbuffer
+ \ lcd_close
+ \ lcd_drawcircle
+ \ lcd_drawgrid
+ \ lcd_drawint
+ \ lcd_drawline
+ \ lcd_drawprogressbarh
+ \ lcd_drawprogressbarv
+ \ lcd_drawprogresscircle
+ \ lcd_drawrect
+ \ lcd_drawtext
+ \ lcd_drawtextbuffer
+ \ lcd_drawtexture
+ \ lcd_flush
+ \ lcd_getbuttonstate
+ \ lcd_getheight
+ \ lcd_getwidth
+ \ lcd_ismulti
+ \ lcd_isopen
+ \ lcd_open
+ \ lcd_refresh
+ \ lcd_savebuttonsnapshot
+ \ lcd_scale
+ \ lcd_setfont
+" }}}
+
+" Deprecated: {{{
+syn keyword obDeprecated
+ \ SetAltControl
+ \ GetAltControl
+ \ RefreshControlMap
+" }}}
+" }}}
+
+if !exists("did_obl_inits")
+
+ let did_obl_inits = 1
+ hi def link obseStatement Statement
+ hi def link obseStatementTwo Statement
+ hi def link obseDescBlock String
+ hi def link obseComment Comment
+ hi def link obseString String
+ hi def link obseStringFormatting Keyword
+ hi def link obseFloat Float
+ hi def link obseInt Number
+ hi def link obseToDo Todo
+ hi def link obseTypes Type
+ hi def link obseCondition Conditional
+ hi def link obseOperator Operator
+ hi def link obseOtherKey Special
+ hi def link obseScriptName Special
+ hi def link obseBlock Conditional
+ hi def link obseBlockType Structure
+ hi def link obseScriptNameRegion Underlined
+ hi def link obseNames Identifier
+ hi def link obseVariable Identifier
+ hi def link obseReference Special
+ hi def link obseRepeat Repeat
+
+ hi def link csFunction Function
+ hi def link obseFunction Function
+ hi def link obseArrayFunction Function
+ hi def link pluggyFunction Function
+ hi def link obseStringFunction Function
+ hi def link obseArrayFunction Function
+ hi def link tsfcFunction Function
+ hi def link blockheadFunction Function
+ hi def link switchNightEyeShaderFunction Function
+ hi def link obseivionReloadedFunction Function
+ hi def link menuQueFunction Function
+ hi def link eaxFunction Function
+ hi def link networkPipeFunction Function
+ hi def link nifseFunction Function
+ hi def link reidFunction Function
+ hi def link runtimeDebuggerFunction Function
+ hi def link addActorValuesFunction Function
+ hi def link memoryDumperFunction Function
+ hi def link algoholFunction Function
+ hi def link soundCommandsFunction Function
+ hi def link emcFunction Function
+ hi def link vipcxjFunction Function
+ hi def link cameraCommands Function
+ hi def link obmeFunction Function
+ hi def link conscribeFunction Function
+ hi def link systemDialogFunction Function
+ hi def link csiFunction Function
+ hi def link haelFunction Function
+ hi def link lcdFunction Function
+ hi def link skillAttribute String
+ hi def link obDeprecated WarningMsg
+
+endif
+
+let b:current_syntax = 'obse'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/ocaml.vim b/runtime/syntax/ocaml.vim
new file mode 100644
index 0000000..af3efd3
--- /dev/null
+++ b/runtime/syntax/ocaml.vim
@@ -0,0 +1,393 @@
+" Vim syntax file
+" Language: OCaml
+" Filenames: *.ml *.mli *.mll *.mly
+" Maintainers: Markus Mottl <markus.mottl@gmail.com>
+" Karl-Heinz Sylla <Karl-Heinz.Sylla@gmd.de>
+" Issac Trotts <ijtrotts@ucdavis.edu>
+" URL: https://github.com/ocaml/vim-ocaml
+" Last Change:
+" 2018 Nov 08 - Improved highlighting of operators (Maëlan)
+" 2018 Apr 22 - Improved support for PPX (Andrey Popp)
+" 2018 Mar 16 - Remove raise, lnot and not from keywords (Étienne Millon, "copy")
+" 2017 Apr 11 - Improved matching of negative numbers (MM)
+" 2016 Mar 11 - Improved support for quoted strings (Glen Mével)
+" 2015 Aug 13 - Allow apostrophes in identifiers (Jonathan Chan, Einar Lielmanis)
+" 2015 Jun 17 - Added new "nonrec" keyword (MM)
+
+" A minor patch was applied to the official version so that object/end
+" can be distinguished from begin/end, which is used for indentation,
+" and folding. (David Baelde)
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax") && b:current_syntax == "ocaml"
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+" ' can be used in OCaml identifiers
+setlocal iskeyword+='
+
+" ` is part of the name of polymorphic variants
+setlocal iskeyword+=`
+
+" OCaml is case sensitive.
+syn case match
+
+" Access to the method of an object
+syn match ocamlMethod "#"
+
+" Script headers highlighted like comments
+syn match ocamlComment "^#!.*" contains=@Spell
+
+" Scripting directives
+syn match ocamlScript "^#\<\(quit\|labels\|warnings\|warn_error\|directory\|remove_directory\|cd\|load\|load_rec\|use\|mod_use\|install_printer\|remove_printer\|require\|list\|ppx\|principal\|predicates\|rectypes\|thread\|trace\|untrace\|untrace_all\|print_depth\|print_length\|camlp4o\|camlp4r\|topfind_log\|topfind_verbose\)\>"
+
+" lowercase identifier - the standard way to match
+syn match ocamlLCIdentifier /\<\(\l\|_\)\(\w\|'\)*\>/
+
+syn match ocamlKeyChar "|"
+
+" Errors
+syn match ocamlBraceErr "}"
+syn match ocamlBrackErr "\]"
+syn match ocamlParenErr ")"
+syn match ocamlArrErr "|]"
+
+syn match ocamlCommentErr "\*)"
+
+syn match ocamlCountErr "\<downto\>"
+syn match ocamlCountErr "\<to\>"
+
+if !exists("ocaml_revised")
+ syn match ocamlDoErr "\<do\>"
+endif
+
+syn match ocamlDoneErr "\<done\>"
+syn match ocamlThenErr "\<then\>"
+
+" Error-highlighting of "end" without synchronization:
+" as keyword or as error (default)
+if exists("ocaml_noend_error")
+ syn match ocamlKeyword "\<end\>"
+else
+ syn match ocamlEndErr "\<end\>"
+endif
+
+" Some convenient clusters
+syn cluster ocamlAllErrs contains=ocamlBraceErr,ocamlBrackErr,ocamlParenErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr
+
+syn cluster ocamlAENoParen contains=ocamlBraceErr,ocamlBrackErr,ocamlCommentErr,ocamlCountErr,ocamlDoErr,ocamlDoneErr,ocamlEndErr,ocamlThenErr
+
+syn cluster ocamlContained contains=ocamlTodo,ocamlPreDef,ocamlModParam,ocamlModParam1,ocamlMPRestr,ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3,ocamlModRHS,ocamlFuncWith,ocamlFuncStruct,ocamlModTypeRestr,ocamlModTRWith,ocamlWith,ocamlWithRest,ocamlModType,ocamlFullMod,ocamlVal
+
+
+" Enclosing delimiters
+syn region ocamlEncl transparent matchgroup=ocamlKeyword start="(" matchgroup=ocamlKeyword end=")" contains=ALLBUT,@ocamlContained,ocamlParenErr
+syn region ocamlEncl transparent matchgroup=ocamlKeyword start="{" matchgroup=ocamlKeyword end="}" contains=ALLBUT,@ocamlContained,ocamlBraceErr
+syn region ocamlEncl transparent matchgroup=ocamlKeyword start="\[" matchgroup=ocamlKeyword end="\]" contains=ALLBUT,@ocamlContained,ocamlBrackErr
+syn region ocamlEncl transparent matchgroup=ocamlKeyword start="\[|" matchgroup=ocamlKeyword end="|\]" contains=ALLBUT,@ocamlContained,ocamlArrErr
+
+
+" Comments
+syn region ocamlComment start="(\*" end="\*)" contains=@Spell,ocamlComment,ocamlTodo
+syn keyword ocamlTodo contained TODO FIXME XXX NOTE
+
+
+" Objects
+syn region ocamlEnd matchgroup=ocamlObject start="\<object\>" matchgroup=ocamlObject end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
+
+
+" Blocks
+if !exists("ocaml_revised")
+ syn region ocamlEnd matchgroup=ocamlKeyword start="\<begin\>" matchgroup=ocamlKeyword end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
+endif
+
+
+" "for"
+syn region ocamlNone matchgroup=ocamlKeyword start="\<for\>" matchgroup=ocamlKeyword end="\<\(to\|downto\)\>" contains=ALLBUT,@ocamlContained,ocamlCountErr
+
+
+" "do"
+if !exists("ocaml_revised")
+ syn region ocamlDo matchgroup=ocamlKeyword start="\<do\>" matchgroup=ocamlKeyword end="\<done\>" contains=ALLBUT,@ocamlContained,ocamlDoneErr
+endif
+
+" "if"
+syn region ocamlNone matchgroup=ocamlKeyword start="\<if\>" matchgroup=ocamlKeyword end="\<then\>" contains=ALLBUT,@ocamlContained,ocamlThenErr
+
+"" PPX nodes
+
+syn match ocamlPpxIdentifier /\(\[@\{1,3\}\)\@<=\w\+\(\.\w\+\)*/
+syn region ocamlPpx matchgroup=ocamlPpxEncl start="\[@\{1,3\}" contains=TOP end="\]"
+
+"" Modules
+
+" "sig"
+syn region ocamlSig matchgroup=ocamlSigEncl start="\<sig\>" matchgroup=ocamlSigEncl end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule
+syn region ocamlModSpec matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contained contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlModTRWith,ocamlMPRestr
+
+" "open"
+syn match ocamlKeyword "\<open\>" skipwhite skipempty nextgroup=ocamlFullMod
+
+" "include"
+syn match ocamlKeyword "\<include\>" skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
+
+" "module" - somewhat complicated stuff ;-)
+syn region ocamlModule matchgroup=ocamlKeyword start="\<module\>" matchgroup=ocamlModule end="\<\u\(\w\|'\)*\>" contains=@ocamlAllErrs,ocamlComment skipwhite skipempty nextgroup=ocamlPreDef
+syn region ocamlPreDef start="."me=e-1 matchgroup=ocamlKeyword end="\l\|=\|)"me=e-1 contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam,ocamlGenMod,ocamlModTypeRestr,ocamlModTRWith nextgroup=ocamlModPreRHS
+syn region ocamlModParam start="([^*]" end=")" contained contains=ocamlGenMod,ocamlModParam1,ocamlSig,ocamlVal
+syn match ocamlModParam1 "\<\u\(\w\|'\)*\>" contained skipwhite skipempty
+syn match ocamlGenMod "()" contained skipwhite skipempty
+
+syn region ocamlMPRestr start=":" end="."me=e-1 contained contains=@ocamlComment skipwhite skipempty nextgroup=ocamlMPRestr1,ocamlMPRestr2,ocamlMPRestr3
+syn region ocamlMPRestr1 matchgroup=ocamlSigEncl start="\ssig\s\=" matchgroup=ocamlSigEncl end="\<end\>" contained contains=ALLBUT,@ocamlContained,ocamlEndErr,ocamlModule
+syn region ocamlMPRestr2 start="\sfunctor\(\s\|(\)\="me=e-1 matchgroup=ocamlKeyword end="->" contained contains=@ocamlAllErrs,ocamlComment,ocamlModParam,ocamlGenMod skipwhite skipempty nextgroup=ocamlFuncWith,ocamlMPRestr2
+syn match ocamlMPRestr3 "\w\(\w\|'\)*\( *\. *\w\(\w\|'\)*\)*" contained
+syn match ocamlModPreRHS "=" contained skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
+syn keyword ocamlKeyword val
+syn region ocamlVal matchgroup=ocamlKeyword start="\<val\>" matchgroup=ocamlLCIdentifier end="\<\l\(\w\|'\)*\>" contains=@ocamlAllErrs,ocamlComment,ocamlFullMod skipwhite skipempty nextgroup=ocamlMPRestr
+syn region ocamlModRHS start="." end=". *\w\|([^*]"me=e-2 contained contains=ocamlComment skipwhite skipempty nextgroup=ocamlModParam,ocamlFullMod
+syn match ocamlFullMod "\<\u\(\w\|'\)*\( *\. *\u\(\w\|'\)*\)*" contained skipwhite skipempty nextgroup=ocamlFuncWith
+
+syn region ocamlFuncWith start="([^*)]"me=e-1 end=")" contained contains=ocamlComment,ocamlWith,ocamlFuncStruct skipwhite skipempty nextgroup=ocamlFuncWith
+syn region ocamlFuncStruct matchgroup=ocamlStructEncl start="[^a-zA-Z]struct\>"hs=s+1 matchgroup=ocamlStructEncl end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
+
+syn match ocamlModTypeRestr "\<\w\(\w\|'\)*\( *\. *\w\(\w\|'\)*\)*\>" contained
+syn region ocamlModTRWith start=":\s*("hs=s+1 end=")" contained contains=@ocamlAENoParen,ocamlWith
+syn match ocamlWith "\<\(\u\(\w\|'\)* *\. *\)*\w\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=ocamlWithRest
+syn region ocamlWithRest start="[^)]" end=")"me=e-1 contained contains=ALLBUT,@ocamlContained
+
+" "struct"
+syn region ocamlStruct matchgroup=ocamlStructEncl start="\<\(module\s\+\)\=struct\>" matchgroup=ocamlStructEncl end="\<end\>" contains=ALLBUT,@ocamlContained,ocamlEndErr
+
+" "module type"
+syn region ocamlKeyword start="\<module\>\s*\<type\>\(\s*\<of\>\)\=" matchgroup=ocamlModule end="\<\w\(\w\|'\)*\>" contains=ocamlComment skipwhite skipempty nextgroup=ocamlMTDef
+syn match ocamlMTDef "=\s*\w\(\w\|'\)*\>"hs=s+1,me=s+1 skipwhite skipempty nextgroup=ocamlFullMod
+
+" Quoted strings
+syn region ocamlString matchgroup=ocamlQuotedStringDelim start="{\z\([a-z_]*\)|" end="|\z1}" contains=@Spell
+
+syn keyword ocamlKeyword and as assert class
+syn keyword ocamlKeyword constraint else
+syn keyword ocamlKeyword exception external fun
+
+syn keyword ocamlKeyword in inherit initializer
+syn keyword ocamlKeyword lazy let match
+syn keyword ocamlKeyword method mutable new nonrec of
+syn keyword ocamlKeyword parser private rec
+syn keyword ocamlKeyword try type
+syn keyword ocamlKeyword virtual when while with
+
+if exists("ocaml_revised")
+ syn keyword ocamlKeyword do value
+ syn keyword ocamlBoolean True False
+else
+ syn keyword ocamlKeyword function
+ syn keyword ocamlBoolean true false
+endif
+
+syn keyword ocamlType array bool char exn float format format4
+syn keyword ocamlType int int32 int64 lazy_t list nativeint option
+syn keyword ocamlType bytes string unit
+
+syn match ocamlConstructor "(\s*)"
+syn match ocamlConstructor "\[\s*\]"
+syn match ocamlConstructor "\[|\s*>|]"
+syn match ocamlConstructor "\[<\s*>\]"
+syn match ocamlConstructor "\u\(\w\|'\)*\>"
+
+" Polymorphic variants
+syn match ocamlConstructor "`\w\(\w\|'\)*\>"
+
+" Module prefix
+syn match ocamlModPath "\u\(\w\|'\)* *\."he=e-1
+
+syn match ocamlCharacter "'\\\d\d\d'\|'\\[\'ntbr]'\|'.'"
+syn match ocamlCharacter "'\\x\x\x'"
+syn match ocamlCharErr "'\\\d\d'\|'\\\d'"
+syn match ocamlCharErr "'\\[^\'ntbr]'"
+syn region ocamlString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell
+
+syn match ocamlTopStop ";;"
+
+syn match ocamlAnyVar "\<_\>"
+syn match ocamlKeyChar "|[^\]]"me=e-1
+syn match ocamlKeyChar ";"
+syn match ocamlKeyChar "\~"
+syn match ocamlKeyChar "?"
+
+"" Operators
+
+" The grammar of operators is found there:
+" https://caml.inria.fr/pub/docs/manual-ocaml/names.html#operator-name
+" https://caml.inria.fr/pub/docs/manual-ocaml/extn.html#s:ext-ops
+" https://caml.inria.fr/pub/docs/manual-ocaml/extn.html#s:index-operators
+" =, *, < and > are both operator names and keywords, we let the user choose how
+" to display them (has to be declared before regular infix operators):
+syn match ocamlEqual "="
+syn match ocamlStar "*"
+syn match ocamlAngle "<"
+syn match ocamlAngle ">"
+" Custom indexing operators:
+syn region ocamlIndexing matchgroup=ocamlIndexingOp
+ \ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*("
+ \ end=")\(\_s*<-\)\?"
+ \ contains=ALLBUT,@ocamlContained,ocamlParenErr
+syn region ocamlIndexing matchgroup=ocamlIndexingOp
+ \ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*\["
+ \ end="]\(\_s*<-\)\?"
+ \ contains=ALLBUT,@ocamlContained,ocamlBrackErr
+syn region ocamlIndexing matchgroup=ocamlIndexingOp
+ \ start="\.[~?!:|&$%=>@^/*+-][~?!.:|&$%<=>@^*/+-]*\_s*{"
+ \ end="}\(\_s*<-\)\?"
+ \ contains=ALLBUT,@ocamlContained,ocamlBraceErr
+" Extension operators (has to be declared before regular infix operators):
+syn match ocamlExtensionOp "#[#~?!.:|&$%<=>@^*/+-]\+"
+" Infix and prefix operators:
+syn match ocamlPrefixOp "![~?!.:|&$%<=>@^*/+-]*"
+syn match ocamlPrefixOp "[~?][~?!.:|&$%<=>@^*/+-]\+"
+syn match ocamlInfixOp "[&$%@^/+-][~?!.:|&$%<=>@^*/+-]*"
+syn match ocamlInfixOp "[|<=>*][~?!.:|&$%<=>@^*/+-]\+"
+syn match ocamlInfixOp "#[~?!.:|&$%<=>@^*/+-]\+#\@!"
+syn match ocamlInfixOp "!=[~?!.:|&$%<=>@^*/+-]\@!"
+syn keyword ocamlInfixOpKeyword asr land lor lsl lsr lxor mod or
+" := is technically an infix operator, but we may want to show it as a keyword
+" (somewhat analogously to = for let‐bindings and <- for assignations):
+syn match ocamlRefAssign ":="
+" :: is technically not an operator, but we may want to show it as such:
+syn match ocamlCons "::"
+" -> and <- are keywords, not operators (but can appear in longer operators):
+syn match ocamlArrow "->[~?!.:|&$%<=>@^*/+-]\@!"
+if exists("ocaml_revised")
+ syn match ocamlErr "<-[~?!.:|&$%<=>@^*/+-]\@!"
+else
+ syn match ocamlKeyChar "<-[~?!.:|&$%<=>@^*/+-]\@!"
+endif
+
+syn match ocamlNumber "-\=\<\d\(_\|\d\)*[l|L|n]\?\>"
+syn match ocamlNumber "-\=\<0[x|X]\(\x\|_\)\+[l|L|n]\?\>"
+syn match ocamlNumber "-\=\<0[o|O]\(\o\|_\)\+[l|L|n]\?\>"
+syn match ocamlNumber "-\=\<0[b|B]\([01]\|_\)\+[l|L|n]\?\>"
+syn match ocamlFloat "-\=\<\d\(_\|\d\)*\.\?\(_\|\d\)*\([eE][-+]\=\d\(_\|\d\)*\)\=\>"
+
+" Labels
+syn match ocamlLabel "\~\(\l\|_\)\(\w\|'\)*"lc=1
+syn match ocamlLabel "?\(\l\|_\)\(\w\|'\)*"lc=1
+syn region ocamlLabel transparent matchgroup=ocamlLabel start="[~?](\(\l\|_\)\(\w\|'\)*"lc=2 end=")"me=e-1 contains=ALLBUT,@ocamlContained,ocamlParenErr
+
+
+" Synchronization
+syn sync minlines=50
+syn sync maxlines=500
+
+if !exists("ocaml_revised")
+ syn sync match ocamlDoSync grouphere ocamlDo "\<do\>"
+ syn sync match ocamlDoSync groupthere ocamlDo "\<done\>"
+endif
+
+if exists("ocaml_revised")
+ syn sync match ocamlEndSync grouphere ocamlEnd "\<\(object\)\>"
+else
+ syn sync match ocamlEndSync grouphere ocamlEnd "\<\(begin\|object\)\>"
+endif
+
+syn sync match ocamlEndSync groupthere ocamlEnd "\<end\>"
+syn sync match ocamlStructSync grouphere ocamlStruct "\<struct\>"
+syn sync match ocamlStructSync groupthere ocamlStruct "\<end\>"
+syn sync match ocamlSigSync grouphere ocamlSig "\<sig\>"
+syn sync match ocamlSigSync groupthere ocamlSig "\<end\>"
+
+" Define the default highlighting.
+
+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 ocamlGenMod Include
+hi def link ocamlModType Include
+hi def link ocamlMPRestr3 Include
+hi def link ocamlFullMod Include
+hi def link ocamlFuncWith Include
+hi def link ocamlModParam Include
+hi def link ocamlModTypeRestr Include
+hi def link ocamlWith Include
+hi def link ocamlMTDef Include
+hi def link ocamlSigEncl ocamlModule
+hi def link ocamlStructEncl ocamlModule
+
+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 ocamlArrow Keyword
+hi def link ocamlKeyChar Keyword
+hi def link ocamlAnyVar Keyword
+hi def link ocamlTopStop Keyword
+
+hi def link ocamlRefAssign ocamlKeyChar
+hi def link ocamlEqual ocamlKeyChar
+hi def link ocamlStar ocamlInfixOp
+hi def link ocamlAngle ocamlInfixOp
+hi def link ocamlCons ocamlInfixOp
+
+hi def link ocamlPrefixOp ocamlOperator
+hi def link ocamlInfixOp ocamlOperator
+hi def link ocamlExtensionOp ocamlOperator
+hi def link ocamlIndexingOp ocamlOperator
+
+if exists("ocaml_highlight_operators")
+ hi def link ocamlInfixOpKeyword ocamlOperator
+ hi def link ocamlOperator Operator
+else
+ hi def link ocamlInfixOpKeyword Keyword
+endif
+
+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 ocamlQuotedStringDelim Identifier
+
+hi def link ocamlLabel Identifier
+
+hi def link ocamlType Type
+
+hi def link ocamlTodo Todo
+
+hi def link ocamlEncl Keyword
+
+hi def link ocamlPpxEncl ocamlEncl
+
+let b:current_syntax = "ocaml"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim: ts=8
diff --git a/runtime/syntax/occam.vim b/runtime/syntax/occam.vim
new file mode 100644
index 0000000..01d139b
--- /dev/null
+++ b/runtime/syntax/occam.vim
@@ -0,0 +1,116 @@
+" Vim syntax file
+" Language: occam
+" Copyright: Fred Barnes <frmb2@kent.ac.uk>, Mario Schweigler <ms44@kent.ac.uk>
+" Maintainer: Mario Schweigler <ms44@kent.ac.uk>
+" Last Change: 24 May 2003
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+"{{{ Settings
+" Set shift width for indent
+setlocal shiftwidth=2
+" Set the tab key size to two spaces
+setlocal softtabstop=2
+" Let tab keys always be expanded to spaces
+setlocal expandtab
+
+" Dots are valid in occam identifiers
+setlocal iskeyword+=.
+"}}}
+
+syn case match
+
+syn keyword occamType BYTE BOOL INT INT16 INT32 INT64 REAL32 REAL64 ANY
+syn keyword occamType CHAN DATA OF TYPE TIMER INITIAL VAL PORT MOBILE PLACED
+syn keyword occamType PROCESSOR PACKED RECORD PROTOCOL SHARED ROUND TRUNC
+
+syn keyword occamStructure SEQ PAR IF ALT PRI FORKING PLACE AT
+
+syn keyword occamKeyword PROC IS TRUE FALSE SIZE RECURSIVE REC
+syn keyword occamKeyword RETYPES RESHAPES STEP FROM FOR RESCHEDULE STOP SKIP FORK
+syn keyword occamKeyword FUNCTION VALOF RESULT ELSE CLONE CLAIM
+syn keyword occamBoolean TRUE FALSE
+syn keyword occamRepeat WHILE
+syn keyword occamConditional CASE
+syn keyword occamConstant MOSTNEG MOSTPOS
+
+syn match occamBrackets /\[\|\]/
+syn match occamParantheses /(\|)/
+
+syn keyword occamOperator AFTER TIMES MINUS PLUS INITIAL REM AND OR XOR NOT
+syn keyword occamOperator BITAND BITOR BITNOT BYTESIN OFFSETOF
+
+syn match occamOperator /::\|:=\|?\|!/
+syn match occamOperator /<\|>\|+\|-\|\*\|\/\|\\\|=\|\~/
+syn match occamOperator /@\|\$\$\|%\|&&\|<&\|&>\|<\]\|\[>\|\^/
+
+syn match occamSpecialChar /\M**\|*'\|*"\|*#\(\[0-9A-F\]\+\)/ contained
+syn match occamChar /\M\L\='\[^*\]'/
+syn match occamChar /L'[^']*'/ contains=occamSpecialChar
+
+syn case ignore
+syn match occamTodo /\<todo\>:\=/ contained
+syn match occamNote /\<note\>:\=/ contained
+syn case match
+syn keyword occamNote NOT contained
+
+syn match occamComment /--.*/ contains=occamCommentTitle,occamTodo,occamNote
+syn match occamCommentTitle /--\s*\u\a*\(\s\+\u\a*\)*:/hs=s+2 contained contains=occamTodo,occamNote
+syn match occamCommentTitle /--\s*KROC-LIBRARY\(\.so\|\.a\)\=\s*$/hs=s+2 contained
+syn match occamCommentTitle /--\s*\(KROC-OPTIONS:\|RUN-PARAMETERS:\)/hs=s+2 contained
+
+syn match occamIdentifier /\<[A-Z.][A-Z.0-9]*\>/
+syn match occamFunction /\<[A-Za-z.][A-Za-z0-9.]*\>/ contained
+
+syn match occamPPIdentifier /##.\{-}\>/
+
+syn region occamString start=/"/ skip=/\M*"/ end=/"/ contains=occamSpecialChar
+syn region occamCharString start=/'/ end=/'/ contains=occamSpecialChar
+
+syn match occamNumber /\<\d\+\(\.\d\+\(E\(+\|-\)\d\+\)\=\)\=/
+syn match occamNumber /-\d\+\(\.\d\+\(E\(+\|-\)\d\+\)\=\)\=/
+syn match occamNumber /#\(\d\|[A-F]\)\+/
+syn match occamNumber /-#\(\d\|[A-F]\)\+/
+
+syn keyword occamCDString SHARED EXTERNAL DEFINED NOALIAS NOUSAGE NOT contained
+syn keyword occamCDString FILE LINE PROCESS.PRIORITY OCCAM2.5 contained
+syn keyword occamCDString USER.DEFINED.OPERATORS INITIAL.DECL MOBILES contained
+syn keyword occamCDString BLOCKING.SYSCALLS VERSION NEED.QUAD.ALIGNMENT contained
+syn keyword occamCDString TARGET.CANONICAL TARGET.CPU TARGET.OS TARGET.VENDOR contained
+syn keyword occamCDString TRUE FALSE AND OR contained
+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
+
+
+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
new file mode 100644
index 0000000..6294945
--- /dev/null
+++ b/runtime/syntax/omnimark.vim
@@ -0,0 +1,106 @@
+" Vim syntax file
+" Language: Omnimark
+" Maintainer: Paul Terray <mailto:terray@4dconcept.fr>
+" Last Change: 11 Oct 2000
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+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
+syn keyword omnimarkKeywords DEACTIVATE DECLARE DECREMENT DEFINE DISCARD DIVIDE DO DOCUMENT-END DOCUMENT-START DONE DTD-START
+syn keyword omnimarkKeywords ELEMENT ELSE ESCAPE EXIT
+syn keyword omnimarkKeywords FAIL FIND FIND-END FIND-START FORMAT
+syn keyword omnimarkKeywords GROUP
+syn keyword omnimarkKeywords HALT HALT-EVERYTHING
+syn keyword omnimarkKeywords IGNORE IMPLIED INCLUDE INCLUDE-END INCLUDE-START INCREMENT INPUT
+syn keyword omnimarkKeywords JOIN
+syn keyword omnimarkKeywords LINE-END LINE-START LOG LOOKAHEAD
+syn keyword omnimarkKeywords MACRO
+syn keyword omnimarkKeywords MACRO-END MARKED-SECTION MARKUP-COMMENT MARKUP-ERROR MARKUP-PARSER MASK MATCH MINUS MODULO
+syn keyword omnimarkKeywords NEW NEWLINE NEXT
+syn keyword omnimarkKeywords OPEN OUTPUT OUTPUT-TO OVER
+syn keyword omnimarkKeywords PROCESS PROCESS-END PROCESS-START PROCESSING-INSTRUCTION PROLOG-END PROLOG-IN-ERROR PUT
+syn keyword omnimarkKeywords REMOVE REOPEN REPEAT RESET RETHROW RETURN
+syn keyword omnimarkKeywords WHEN WHITE-SPACE
+syn keyword omnimarkKeywords SAVE SAVE-CLEAR SCAN SELECT SET SGML SGML-COMMENT SGML-DECLARATION-END SGML-DTD SGML-DTDS SGML-ERROR SGML-IN SGML-OUT SGML-PARSE SGML-PARSER SHIFT SUBMIT SUCCEED SUPPRESS
+syn keyword omnimarkKeywords SYSTEM-CALL
+syn keyword omnimarkKeywords TEST-SYSTEM THROW TO TRANSLATE
+syn keyword omnimarkKeywords UC UL UNLESS UP-TRANSLATE
+syn keyword omnimarkKeywords XML-PARSE
+
+syn keyword omnimarkCommands ACTIVE AFTER ANCESTOR AND ANOTHER ARG AS ATTACHED ATTRIBUTE ATTRIBUTES
+syn keyword omnimarkCommands BASE BEFORE BINARY BINARY-INPUT BINARY-MODE BINARY-OUTPUT BREAK-WIDTH BUFFER BY
+syn keyword omnimarkCommands CASE CHILDREN CLOSED COMPILED-DATE COMPLEMENT CONREF CONTENT CONTEXT-TRANSLATE COUNTER CREATED CREATING CREATOR CURRENT
+syn keyword omnimarkCommands DATA-ATTRIBUTE DATA-ATTRIBUTES DATA-CONTENT DATA-LETTERS DATE DECLARED-CONREF DECLARED-CURRENT DECLARED-DEFAULTED DECLARED-FIXED DECLARED-IMPLIED DECLARED-REQUIRED
+syn keyword omnimarkCommands DEFAULT-ENTITY DEFAULTED DEFAULTING DELIMITER DIFFERENCE DIRECTORY DOCTYPE DOCUMENT DOCUMENT-ELEMENT DOMAIN-FREE DOWN-TRANSLATE DTD DTD-END DTDS
+syn keyword omnimarkCommands ELEMENTS ELSEWHERE EMPTY ENTITIES ENTITY EPILOG-START EQUAL EXCEPT EXISTS EXTERNAL EXTERNAL-DATA-ENTITY EXTERNAL-ENTITY EXTERNAL-FUNCTION EXTERNAL-OUTPUT-FUNCTION
+syn keyword omnimarkCommands EXTERNAL-TEXT-ENTITY
+syn keyword omnimarkCommands FALSE FILE FUNCTION FUNCTION-LIBRARY
+syn keyword omnimarkCommands GENERAL GLOBAL GREATER-EQUAL GREATER-THAN GROUPS
+syn keyword omnimarkCommands HAS HASNT HERALDED-NAMES
+syn keyword omnimarkCommands ID ID-CHECKING IDREF IDREFS IN IN-LIBRARY INCLUSION INITIAL INITIAL-SIZE INSERTION-BREAK INSTANCE INTERNAL INVALID-DATA IS ISNT ITEM
+syn keyword omnimarkCommands KEY KEYED
+syn keyword omnimarkCommands LAST LASTMOST LC LENGTH LESS-EQUAL LESS-THAN LETTERS LIBRARY LITERAL LOCAL
+syn keyword omnimarkCommands MATCHES MIXED MODIFIABLE
+syn keyword omnimarkCommands NAME NAME-LETTERS NAMECASE NAMED NAMES NDATA-ENTITY NEGATE NESTED-REFERENTS NMTOKEN NMTOKENS NO NO-DEFAULT-IO NON-CDATA NON-IMPLIED NON-SDATA NOT NOTATION NUMBER-OF NUMBERS
+syn keyword omnimarkCommands NUTOKEN NUTOKENS
+syn keyword omnimarkCommands OCCURRENCE OF OPAQUE OPTIONAL OR
+syn keyword omnimarkCommands PARAMETER PARENT PAST PATTERN PLUS PREPARENT PREVIOUS PROPER PUBLIC
+syn keyword omnimarkCommands READ-ONLY READABLE REFERENT REFERENTS REFERENTS-ALLOWED REFERENTS-DISPLAYED REFERENTS-NOT-ALLOWED REMAINDER REPEATED REPLACEMENT-BREAK REVERSED
+syn keyword omnimarkCommands SILENT-REFERENT SIZE SKIP SOURCE SPECIFIED STATUS STREAM SUBDOC-ENTITY SUBDOCUMENT SUBDOCUMENTS SUBELEMENT SWITCH SYMBOL SYSTEM
+syn keyword omnimarkCommands TEXT-MODE THIS TIMES TOKEN TRUE
+syn keyword omnimarkCommands UNANCHORED UNATTACHED UNION USEMAP USING
+syn keyword omnimarkCommands VALUE VALUED VARIABLE
+syn keyword omnimarkCommands WITH WRITABLE
+syn keyword omnimarkCommands XML XML-DTD XML-DTDS
+syn keyword omnimarkCommands YES
+syn keyword omnimarkCommands #ADDITIONAL-INFO #APPINFO #CAPACITY #CHARSET #CLASS #COMMAND-LINE-NAMES #CONSOLE #CURRENT-INPUT #CURRENT-OUTPUT #DATA #DOCTYPE #DOCUMENT #DTD #EMPTY #ERROR #ERROR-CODE
+syn keyword omnimarkCommands #FILE-NAME #FIRST #GROUP #IMPLIED #ITEM #LANGUAGE-VERSION #LAST #LIBPATH #LIBRARY #LIBVALUE #LINE-NUMBER #MAIN-INPUT #MAIN-OUTPUT #MARKUP-ERROR-COUNT #MARKUP-ERROR-TOTAL
+syn keyword omnimarkCommands #MARKUP-PARSER #MARKUP-WARNING-COUNT #MARKUP-WARNING-TOTAL #MESSAGE #NONE #OUTPUT #PLATFORM-INFO #PROCESS-INPUT #PROCESS-OUTPUT #RECOVERY-INFO #SGML #SGML-ERROR-COUNT
+syn keyword omnimarkCommands #SGML-ERROR-TOTAL #SGML-WARNING-COUNT #SGML-WARNING-TOTAL #SUPPRESS #SYNTAX #!
+
+syn keyword omnimarkPatterns ANY ANY-TEXT
+syn keyword omnimarkPatterns BLANK
+syn keyword omnimarkPatterns CDATA CDATA-ENTITY CONTENT-END CONTENT-START
+syn keyword omnimarkPatterns DIGIT
+syn keyword omnimarkPatterns LETTER
+syn keyword omnimarkPatterns NUMBER
+syn keyword omnimarkPatterns PCDATA
+syn keyword omnimarkPatterns RCDATA
+syn keyword omnimarkPatterns SDATA SDATA-ENTITY SPACE
+syn keyword omnimarkPatterns TEXT
+syn keyword omnimarkPatterns VALUE-END VALUE-START
+syn keyword omnimarkPatterns WORD-END WORD-START
+
+syn region omnimarkComment start=";" end="$"
+
+" strings
+syn region omnimarkString matchgroup=Normal start=+'+ end=+'+ skip=+%'+ contains=omnimarkEscape
+syn region omnimarkString matchgroup=Normal start=+"+ end=+"+ skip=+%"+ contains=omnimarkEscape
+syn match omnimarkEscape contained +%.+
+syn match omnimarkEscape contained +%[0-9][0-9]#+
+
+"syn sync maxlines=100
+syn sync minlines=2000
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "omnimark"
+
+" vim: ts=8
+
diff --git a/runtime/syntax/opam.vim b/runtime/syntax/opam.vim
new file mode 100644
index 0000000..9ac1d41
--- /dev/null
+++ b/runtime/syntax/opam.vim
@@ -0,0 +1,38 @@
+" Vim syntax file
+" Language: OPAM - OCaml package manager
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" URL: https://github.com/ocaml/vim-ocaml
+" Last Change:
+" 2020 Dec 31 - Added header (Markus Mottl)
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" need %{vars}%
+" env: [[CAML_LD_LIBRARY_PATH = "%{lib}%/stublibs"]]
+syn keyword opamKeyword1 remove depends pin-depends depopts conflicts env packages patches version maintainer tags license homepage authors doc install author available name depexts substs synopsis description
+syn match opamKeyword2 "\v(bug-reports|post-messages|ocaml-version|opam-version|dev-repo|build-test|build-doc|build)"
+
+syn keyword opamTodo FIXME NOTE NOTES TODO XXX contained
+syn match opamComment "#.*$" contains=opamTodo,@Spell
+syn match opamOperator ">\|<\|=\|<=\|>="
+
+syn region opamInterpolate start=/%{/ end=/}%/ contained
+syn region opamString start=/"/ end=/"/ contains=opamInterpolate
+syn region opamSeq start=/\[/ end=/\]/ contains=ALLBUT,opamKeyword1,opamKeyword2
+syn region opamExp start=/{/ end=/}/ contains=ALLBUT,opamKeyword1,opamKeyword2
+
+hi link opamKeyword1 Keyword
+hi link opamKeyword2 Keyword
+
+hi link opamString String
+hi link opamExp Function
+hi link opamSeq Statement
+hi link opamOperator Operator
+hi link opamComment Comment
+hi link opamInterpolate Identifier
+
+let b:current_syntax = "opam"
+
+" vim: ts=2 sw=2
diff --git a/runtime/syntax/openroad.vim b/runtime/syntax/openroad.vim
new file mode 100644
index 0000000..e09f233
--- /dev/null
+++ b/runtime/syntax/openroad.vim
@@ -0,0 +1,252 @@
+" Vim syntax file
+" Language: CA-OpenROAD
+" Maintainer: Luis Moreno <lmoreno@eresmas.net>
+" Last change: 2001 Jun 12
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case ignore
+
+" Keywords
+"
+syntax keyword openroadKeyword ABORT ALL ALTER AND ANY AS ASC AT AVG BEGIN
+syntax keyword openroadKeyword BETWEEN BY BYREF CALL CALLFRAME CALLPROC CASE
+syntax keyword openroadKeyword CLEAR CLOSE COMMIT CONNECT CONTINUE COPY COUNT
+syntax keyword openroadKeyword CREATE CURRENT DBEVENT DECLARE DEFAULT DELETE
+syntax keyword openroadKeyword DELETEROW DESC DIRECT DISCONNECT DISTINCT DO
+syntax keyword openroadKeyword DROP ELSE ELSEIF END ENDCASE ENDDECLARE ENDFOR
+syntax keyword openroadKeyword ENDIF ENDLOOP ENDWHILE ESCAPE EXECUTE EXISTS
+syntax keyword openroadKeyword EXIT FETCH FIELD FOR FROM GOTOFRAME GRANT GROUP
+syntax keyword openroadKeyword HAVING IF IMMEDIATE IN INDEX INITIALISE
+syntax keyword openroadKeyword INITIALIZE INQUIRE_INGRES INQUIRE_SQL INSERT
+syntax keyword openroadKeyword INSERTROW INSTALLATION INTEGRITY INTO KEY LIKE
+syntax keyword openroadKeyword LINK MAX MESSAGE METHOD MIN MODE MODIFY NEXT
+syntax keyword openroadKeyword NOECHO NOT NULL OF ON OPEN OPENFRAME OR ORDER
+syntax keyword openroadKeyword PERMIT PROCEDURE PROMPT QUALIFICATION RAISE
+syntax keyword openroadKeyword REGISTER RELOCATE REMOVE REPEAT REPEATED RESUME
+syntax keyword openroadKeyword RETURN RETURNING REVOKE ROLE ROLLBACK RULE SAVE
+syntax keyword openroadKeyword SAVEPOINT SELECT SET SLEEP SOME SUM SYSTEM TABLE
+syntax keyword openroadKeyword THEN TO TRANSACTION UNION UNIQUE UNTIL UPDATE
+syntax keyword openroadKeyword VALUES VIEW WHERE WHILE WITH WORK
+
+syntax keyword openroadTodo contained TODO
+
+" Catch errors caused by wrong parenthesis
+"
+syntax cluster openroadParenGroup contains=openroadParenError,openroadTodo
+syntax region openroadParen transparent start='(' end=')' contains=ALLBUT,@openroadParenGroup
+syntax match openroadParenError ")"
+highlight link openroadParenError cError
+
+" Numbers
+"
+syntax match openroadNumber "\<[0-9]\+\>"
+
+" String
+"
+syntax region openroadString start=+'+ end=+'+
+
+" Operators, Data Types and Functions
+"
+syntax match openroadOperator /[\+\-\*\/=\<\>;\(\)]/
+
+syntax keyword openroadType ARRAY BYTE CHAR DATE DECIMAL FLOAT FLOAT4
+syntax keyword openroadType FLOAT8 INT1 INT2 INT4 INTEGER INTEGER1
+syntax keyword openroadType INTEGER2 INTEGER4 MONEY OBJECT_KEY
+syntax keyword openroadType SECURITY_LABEL SMALLINT TABLE_KEY VARCHAR
+
+syntax keyword openroadFunc IFNULL
+
+" System Classes
+"
+syntax keyword openroadClass ACTIVEFIELD ANALOGFIELD APPFLAG APPSOURCE
+syntax keyword openroadClass ARRAYOBJECT ATTRIBUTEOBJECT BARFIELD
+syntax keyword openroadClass BITMAPOBJECT BOXTRIM BREAKSPEC BUTTONFIELD
+syntax keyword openroadClass CELLATTRIBUTE CHOICEBITMAP CHOICEDETAIL
+syntax keyword openroadClass CHOICEFIELD CHOICEITEM CHOICELIST CLASS
+syntax keyword openroadClass CLASSSOURCE COLUMNCROSS COLUMNFIELD
+syntax keyword openroadClass COMPOSITEFIELD COMPSOURCE CONTROLBUTTON
+syntax keyword openroadClass CROSSTABLE CURSORBITMAP CURSOROBJECT DATASTREAM
+syntax keyword openroadClass DATEOBJECT DBEVENTOBJECT DBSESSIONOBJECT
+syntax keyword openroadClass DISPLAYFORM DYNEXPR ELLIPSESHAPE ENTRYFIELD
+syntax keyword openroadClass ENUMFIELD EVENT EXTOBJECT EXTOBJFIELD
+syntax keyword openroadClass FIELDOBJECT FLEXIBLEFORM FLOATOBJECT FORMFIELD
+syntax keyword openroadClass FRAMEEXEC FRAMEFORM FRAMESOURCE FREETRIM
+syntax keyword openroadClass GHOSTEXEC GHOSTSOURCE IMAGEFIELD IMAGETRIM
+syntax keyword openroadClass INTEGEROBJECT LISTFIELD LISTVIEWCOLATTR
+syntax keyword openroadClass LISTVIEWFIELD LONGBYTEOBJECT LONGVCHAROBJECT
+syntax keyword openroadClass MATRIXFIELD MENUBAR MENUBUTTON MENUFIELD
+syntax keyword openroadClass MENUGROUP MENUITEM MENULIST MENUSEPARATOR
+syntax keyword openroadClass MENUSTACK MENUTOGGLE METHODEXEC METHODOBJECT
+syntax keyword openroadClass MONEYOBJECT OBJECT OPTIONFIELD OPTIONMENU
+syntax keyword openroadClass PALETTEFIELD POPUPBUTTON PROC4GLSOURCE PROCEXEC
+syntax keyword openroadClass PROCHANDLE QUERYCOL QUERYOBJECT QUERYPARM
+syntax keyword openroadClass QUERYTABLE RADIOFIELD RECTANGLESHAPE ROWCROSS
+syntax keyword openroadClass SCALARFIELD SCOPE SCROLLBARFIELD SEGMENTSHAPE
+syntax keyword openroadClass SESSIONOBJECT SHAPEFIELD SLIDERFIELD SQLSELECT
+syntax keyword openroadClass STACKFIELD STRINGOBJECT SUBFORM TABBAR
+syntax keyword openroadClass TABFIELD TABFOLDER TABLEFIELD TABPAGE
+syntax keyword openroadClass TOGGLEFIELD TREE TREENODE TREEVIEWFIELD
+syntax keyword openroadClass USERCLASSOBJECT USEROBJECT VIEWPORTFIELD
+
+" System Events
+"
+syntax keyword openroadEvent CHILDCLICK CHILDCLICKPOINT CHILDCOLLAPSED
+syntax keyword openroadEvent CHILDDETAILS CHILDDOUBLECLICK CHILDDRAGBOX
+syntax keyword openroadEvent CHILDDRAGSEGMENT CHILDENTRY CHILDEXIT
+syntax keyword openroadEvent CHILDEXPANDED CHILDHEADERCLICK CHILDMOVED
+syntax keyword openroadEvent CHILDPROPERTIES CHILDRESIZED CHILDSCROLL
+syntax keyword openroadEvent CHILDSELECT CHILDSELECTIONCHANGED CHILDSETVALUE
+syntax keyword openroadEvent CHILDUNSELECT CHILDVALIDATE CLICK CLICKPOINT
+syntax keyword openroadEvent COLLAPSED DBEVENT DETAILS DOUBLECLICK DRAGBOX
+syntax keyword openroadEvent DRAGSEGMENT ENTRY EXIT EXPANDED EXTCLASSEVENT
+syntax keyword openroadEvent FRAMEACTIVATE FRAMEDEACTIVATE HEADERCLICK
+syntax keyword openroadEvent INSERTROW LABELCHANGED MOVED PAGEACTIVATED
+syntax keyword openroadEvent PAGECHANGED PAGEDEACTIVATED PROPERTIES RESIZED
+syntax keyword openroadEvent SCROLL SELECT SELECTIONCHANGED SETVALUE
+syntax keyword openroadEvent TERMINATE UNSELECT USEREVENT VALIDATE
+syntax keyword openroadEvent WINDOWCLOSE WINDOWICON WINDOWMOVED WINDOWRESIZED
+syntax keyword openroadEvent WINDOWVISIBLE
+
+" System Constants
+"
+syntax keyword openroadConst BF_BMP BF_GIF BF_SUNRASTER BF_TIFF
+syntax keyword openroadConst BF_WINDOWCURSOR BF_WINDOWICON BF_XBM
+syntax keyword openroadConst CC_BACKGROUND CC_BLACK CC_BLUE CC_BROWN CC_CYAN
+syntax keyword openroadConst CC_DEFAULT_1 CC_DEFAULT_10 CC_DEFAULT_11
+syntax keyword openroadConst CC_DEFAULT_12 CC_DEFAULT_13 CC_DEFAULT_14
+syntax keyword openroadConst CC_DEFAULT_15 CC_DEFAULT_16 CC_DEFAULT_17
+syntax keyword openroadConst CC_DEFAULT_18 CC_DEFAULT_19 CC_DEFAULT_2
+syntax keyword openroadConst CC_DEFAULT_20 CC_DEFAULT_21 CC_DEFAULT_22
+syntax keyword openroadConst CC_DEFAULT_23 CC_DEFAULT_24 CC_DEFAULT_25
+syntax keyword openroadConst CC_DEFAULT_26 CC_DEFAULT_27 CC_DEFAULT_28
+syntax keyword openroadConst CC_DEFAULT_29 CC_DEFAULT_3 CC_DEFAULT_30
+syntax keyword openroadConst CC_DEFAULT_4 CC_DEFAULT_5 CC_DEFAULT_6
+syntax keyword openroadConst CC_DEFAULT_7 CC_DEFAULT_8 CC_DEFAULT_9
+syntax keyword openroadConst CC_FOREGROUND CC_GRAY CC_GREEN CC_LIGHT_BLUE
+syntax keyword openroadConst CC_LIGHT_BROWN CC_LIGHT_CYAN CC_LIGHT_GRAY
+syntax keyword openroadConst CC_LIGHT_GREEN CC_LIGHT_ORANGE CC_LIGHT_PINK
+syntax keyword openroadConst CC_LIGHT_PURPLE CC_LIGHT_RED CC_LIGHT_YELLOW
+syntax keyword openroadConst CC_MAGENTA CC_ORANGE CC_PALE_BLUE CC_PALE_BROWN
+syntax keyword openroadConst CC_PALE_CYAN CC_PALE_GRAY CC_PALE_GREEN
+syntax keyword openroadConst CC_PALE_ORANGE CC_PALE_PINK CC_PALE_PURPLE
+syntax keyword openroadConst CC_PALE_RED CC_PALE_YELLOW CC_PINK CC_PURPLE
+syntax keyword openroadConst CC_RED CC_SYS_ACTIVEBORDER CC_SYS_ACTIVECAPTION
+syntax keyword openroadConst CC_SYS_APPWORKSPACE CC_SYS_BACKGROUND
+syntax keyword openroadConst CC_SYS_BTNFACE CC_SYS_BTNSHADOW CC_SYS_BTNTEXT
+syntax keyword openroadConst CC_SYS_CAPTIONTEXT CC_SYS_GRAYTEXT
+syntax keyword openroadConst CC_SYS_HIGHLIGHT CC_SYS_HIGHLIGHTTEXT
+syntax keyword openroadConst CC_SYS_INACTIVEBORDER CC_SYS_INACTIVECAPTION
+syntax keyword openroadConst CC_SYS_INACTIVECAPTIONTEXT CC_SYS_MENU
+syntax keyword openroadConst CC_SYS_MENUTEXT CC_SYS_SCROLLBAR CC_SYS_SHADOW
+syntax keyword openroadConst CC_SYS_WINDOW CC_SYS_WINDOWFRAME
+syntax keyword openroadConst CC_SYS_WINDOWTEXT CC_WHITE CC_YELLOW
+syntax keyword openroadConst CL_INVALIDVALUE CP_BOTH CP_COLUMNS CP_NONE
+syntax keyword openroadConst CP_ROWS CS_CLOSED CS_CURRENT CS_NOCURRENT
+syntax keyword openroadConst CS_NO_MORE_ROWS CS_OPEN CS_OPEN_CACHED DC_BW
+syntax keyword openroadConst DC_COLOR DP_AUTOSIZE_FIELD DP_CLIP_IMAGE
+syntax keyword openroadConst DP_SCALE_IMAGE_H DP_SCALE_IMAGE_HW
+syntax keyword openroadConst DP_SCALE_IMAGE_W DS_CONNECTED DS_DISABLED
+syntax keyword openroadConst DS_DISCONNECTED DS_INGRES_DBMS DS_NO_DBMS
+syntax keyword openroadConst DS_ORACLE_DBMS DS_SQLSERVER_DBMS DV_NULL
+syntax keyword openroadConst DV_STRING DV_SYSTEM EH_NEXT_HANDLER EH_RESUME
+syntax keyword openroadConst EH_RETRY EP_INTERACTIVE EP_NONE EP_OUTPUT
+syntax keyword openroadConst ER_FAIL ER_NAMEEXISTS ER_OK ER_OUTOFRANGE
+syntax keyword openroadConst ER_ROWNOTFOUND ER_USER1 ER_USER10 ER_USER2
+syntax keyword openroadConst ER_USER3 ER_USER4 ER_USER5 ER_USER6 ER_USER7
+syntax keyword openroadConst ER_USER8 ER_USER9 FALSE FA_BOTTOMCENTER
+syntax keyword openroadConst FA_BOTTOMLEFT FA_BOTTOMRIGHT FA_CENTER
+syntax keyword openroadConst FA_CENTERLEFT FA_CENTERRIGHT FA_DEFAULT FA_NONE
+syntax keyword openroadConst FA_TOPCENTER FA_TOPLEFT FA_TOPRIGHT
+syntax keyword openroadConst FB_CHANGEABLE FB_CLICKPOINT FB_DIMMED FB_DRAGBOX
+syntax keyword openroadConst FB_DRAGSEGMENT FB_FLEXIBLE FB_INVISIBLE
+syntax keyword openroadConst FB_LANDABLE FB_MARKABLE FB_RESIZEABLE
+syntax keyword openroadConst FB_VIEWABLE FB_VISIBLE FC_LOWER FC_NONE FC_UPPER
+syntax keyword openroadConst FM_QUERY FM_READ FM_UPDATE FM_USER1 FM_USER2
+syntax keyword openroadConst FM_USER3 FO_DEFAULT FO_HORIZONTAL FO_VERTICAL
+syntax keyword openroadConst FP_BITMAP FP_CLEAR FP_CROSSHATCH FP_DARKSHADE
+syntax keyword openroadConst FP_DEFAULT FP_HORIZONTAL FP_LIGHTSHADE FP_SHADE
+syntax keyword openroadConst FP_SOLID FP_VERTICAL FT_NOTSETVALUE FT_SETVALUE
+syntax keyword openroadConst FT_TABTO FT_TAKEFOCUS GF_BOTTOM GF_DEFAULT
+syntax keyword openroadConst GF_LEFT GF_RIGHT GF_TOP HC_DOUBLEQUOTE
+syntax keyword openroadConst HC_FORMFEED HC_NEWLINE HC_QUOTE HC_SPACE HC_TAB
+syntax keyword openroadConst HV_CONTENTS HV_CONTEXT HV_HELPONHELP HV_KEY
+syntax keyword openroadConst HV_QUIT LS_3D LS_DASH LS_DASHDOT LS_DASHDOTDOT
+syntax keyword openroadConst LS_DEFAULT LS_DOT LS_SOLID LW_DEFAULT
+syntax keyword openroadConst LW_EXTRATHIN LW_MAXIMUM LW_MIDDLE LW_MINIMUM
+syntax keyword openroadConst LW_NOLINE LW_THICK LW_THIN LW_VERYTHICK
+syntax keyword openroadConst LW_VERYTHIN MB_DISABLED MB_ENABLED MB_INVISIBLE
+syntax keyword openroadConst MB_MOVEABLE MT_ERROR MT_INFO MT_NONE MT_WARNING
+syntax keyword openroadConst OP_APPEND OP_NONE OS3D OS_DEFAULT OS_SHADOW
+syntax keyword openroadConst OS_SOLID PU_CANCEL PU_OK QS_ACTIVE QS_INACTIVE
+syntax keyword openroadConst QS_SETCOL QY_ARRAY QY_CACHE QY_CURSOR QY_DIRECT
+syntax keyword openroadConst RC_CHILDSELECTED RC_DOWN RC_END RC_FIELDFREED
+syntax keyword openroadConst RC_FIELDORPHANED RC_GROUPSELECT RC_HOME RC_LEFT
+syntax keyword openroadConst RC_MODECHANGED RC_MOUSECLICK RC_MOUSEDRAG
+syntax keyword openroadConst RC_NEXT RC_NOTAPPLICABLE RC_PAGEDOWN RC_PAGEUP
+syntax keyword openroadConst RC_PARENTSELECTED RC_PREVIOUS RC_PROGRAM
+syntax keyword openroadConst RC_RESUME RC_RETURN RC_RIGHT RC_ROWDELETED
+syntax keyword openroadConst RC_ROWINSERTED RC_ROWSALLDELETED RC_SELECT
+syntax keyword openroadConst RC_TFSCROLL RC_TOGGLESELECT RC_UP RS_CHANGED
+syntax keyword openroadConst RS_DELETED RS_NEW RS_UNCHANGED RS_UNDEFINED
+syntax keyword openroadConst SK_CLOSE SK_COPY SK_CUT SK_DELETE SK_DETAILS
+syntax keyword openroadConst SK_DUPLICATE SK_FIND SK_GO SK_HELP SK_NEXT
+syntax keyword openroadConst SK_NONE SK_PASTE SK_PROPS SK_QUIT SK_REDO
+syntax keyword openroadConst SK_SAVE SK_TFDELETEALLROWS SK_TFDELETEROW
+syntax keyword openroadConst SK_TFFIND SK_TFINSERTROW SK_UNDO SP_APPSTARTING
+syntax keyword openroadConst SP_ARROW SP_CROSS SP_IBEAM SP_ICON SP_NO
+syntax keyword openroadConst SP_SIZE SP_SIZENESW SP_SIZENS SP_SIZENWSE
+syntax keyword openroadConst SP_SIZEWE SP_UPARROW SP_WAIT SY_NT SY_OS2
+syntax keyword openroadConst SY_UNIX SY_VMS SY_WIN95 TF_COURIER TF_HELVETICA
+syntax keyword openroadConst TF_LUCIDA TF_MENUDEFAULT TF_NEWCENTURY TF_SYSTEM
+syntax keyword openroadConst TF_TIMESROMAN TRUE UE_DATAERROR UE_EXITED
+syntax keyword openroadConst UE_NOTACTIVE UE_PURGED UE_RESUMED UE_UNKNOWN
+syntax keyword openroadConst WI_MOTIF WI_MSWIN32 WI_MSWINDOWS WI_NONE WI_PM
+syntax keyword openroadConst WP_FLOATING WP_INTERACTIVE WP_PARENTCENTERED
+syntax keyword openroadConst WP_PARENTRELATIVE WP_SCREENCENTERED
+syntax keyword openroadConst WP_SCREENRELATIVE WV_ICON WV_INVISIBLE
+syntax keyword openroadConst WV_UNREALIZED WV_VISIBLE
+
+" System Variables
+"
+syntax keyword openroadVar CurFrame CurProcedure CurMethod CurObject
+
+" Identifiers
+"
+syntax match openroadIdent /[a-zA-Z_][a-zA-Z_]*![a-zA-Z_][a-zA-Z_]*/
+
+" Comments
+"
+if exists("openroad_comment_strings")
+ syntax match openroadCommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region openroadCommentString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$"
+ syntax region openroadComment start="/\*" end="\*/" contains=openroadCommentString,openroadCharacter,openroadNumber
+ syntax match openroadComment "//.*" contains=openroadComment2String,openroadCharacter,openroadNumber
+else
+ syn region openroadComment start="/\*" end="\*/"
+ syn match openroadComment "//.*"
+endif
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+"
+
+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
+
+
+let b:current_syntax = "openroad"
diff --git a/runtime/syntax/openscad.vim b/runtime/syntax/openscad.vim
new file mode 100644
index 0000000..1e20c74
--- /dev/null
+++ b/runtime/syntax/openscad.vim
@@ -0,0 +1,129 @@
+" Vim syntax file
+" Language: OpenSCAD
+" Maintainer: Niklas Adam <adam@oddodd.org>
+" Last change: 2022-04-15
+"
+"
+" From salkin-mada/openscad.nvim
+" Building on the work of Sirtaj Singh Kang and others for vim-openscad
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case ignore
+
+setlocal iskeyword=a-z,A-Z,48-57,_
+
+syn match openscadAoperator "{"
+syn match openscadAoperator "}"
+syn match openscadLi "\["
+syn match openscadLi "\]"
+syn match openscadPar "("
+syn match openscadPar ")"
+
+syn match openscadSpecialVariable "\$[a-zA-Z_]\+\>" display
+syn match openscadModifier "^\s*[\*\!\#\%]" display
+
+syn match openscadBinaryoperator "+"
+syn match openscadBinaryoperator "-"
+syn match openscadBinaryoperator "*"
+syn match openscadBinaryoperator "/"
+syn match openscadBinaryoperator "%"
+syn match openscadBinaryoperator "\*\*"
+syn match openscadBinaryoperator "<"
+syn match openscadBinaryoperator "<="
+syn match openscadBinaryoperator ">"
+syn match openscadBinaryoperator ">="
+syn match openscadBinaryoperator "="
+syn match openscadBinaryoperator "=="
+syn match openscadBinaryoperator "==="
+syn match openscadBinaryoperator "!="
+syn match openscadBinaryoperator "!=="
+syn match openscadBinaryoperator "&"
+syn match openscadBinaryoperator "|"
+syn match openscadBinaryoperator "<!"
+syn match openscadBinaryoperator "?"
+syn match openscadBinaryoperator "??"
+syn match openscadBinaryoperator "!?"
+syn match openscadBinaryoperator "!"
+syn match openscadBinaryoperator "#"
+syn match openscadBinaryoperator "_"
+syn match openscadBinaryoperator "\.\."
+syn match openscadBinaryoperator "\.\.\."
+syn match openscadBinaryoperator "`"
+syn match openscadBinaryoperator ":"
+
+syn keyword openscadFunctionDef function nextgroup=openscadFunction skipwhite skipempty
+syn match openscadFunction /\<\h\w*\>/ contained display
+
+syn keyword openscadModuleDef module nextgroup=openscadModule skipwhite skipempty
+syn match openscadModule /\<\h\w*\>/ contained display
+
+syn keyword openscadStatement echo assign let assert
+syn keyword openscadConditional if else
+syn keyword openscadRepeat for intersection_for
+syn keyword openscadInclude include use
+syn keyword openscadCsgKeyword union difference intersection render intersection_for
+syn keyword openscadTransform scale rotate translate resize mirror multmatrix color minkowski hull projection linear_extrude rotate_extrude offset
+syn keyword openscadPrimitiveSolid cube sphere cylinder polyhedron surface
+syn keyword openscadPrimitive2D square circle polygon import_dxf text
+syn keyword openscadPrimitiveImport import child children
+
+syn match openscadNumbers "\<\d\|\.\d" contains=openscadNumber display transparent
+syn match openscadNumber "\d\+" display contained
+syn match openscadNumber "\.\d\+" display contained
+
+syn region openscadString start=/"/ skip=/\\"/ end=/"/
+
+syn keyword openscadBoolean true false
+
+syn keyword openscadCommentTodo TODO FIXME XXX NOTE contained display
+syn match openscadInlineComment ://.*$: contains=openscadCommentTodo
+syn region openscadBlockComment start=:/\*: end=:\*/: fold contains=openscadCommentTodo
+
+syn region openscadBlock start="{" end="}" transparent fold
+syn region openscadVector start="\[" end="\]" transparent fold
+
+syn keyword openscadBuiltin abs acos asin atan atan2 ceil cos exp floor ln log
+syn keyword openscadBuiltin lookup max min pow rands round sign sin sqrt tan
+syn keyword openscadBuiltin str len search version version_num concat chr ord cross norm
+syn keyword openscadBuiltin parent_module
+syn keyword openscadBuiltin dxf_cross dxf_dim
+syn keyword openscadBuiltinSpecial PI undef
+
+"""""""""""""""""""""""""""""""""""""""""
+" linkage
+"""""""""""""""""""""""""""""""""""""""""
+hi def link openscadFunctionDef Structure
+hi def link openscadAoperator Function
+hi def link openscadLi Function
+" hi def link openscadPar Structure
+hi def link openscadBuiltinSpecial Special
+hi def link openscadBinaryoperator Special
+hi def link openscadFunction Function
+hi def link openscadModuleDef Structure
+hi def link openscadModule Function
+hi def link openscadBlockComment Comment
+hi def link openscadBoolean Boolean
+hi def link openscadBuiltin Function
+hi def link openscadConditional Conditional
+hi def link openscadCsgKeyword Structure
+hi def link openscadInclude Include
+hi def link openscadInlineComment Comment
+hi def link openscadModifier Special
+hi def link openscadStatement Statement
+hi def link openscadNumbers Number
+hi def link openscadNumber Number
+hi def link openscadPrimitiveSolid Keyword
+hi def link openscadPrimitive2D Keyword
+hi def link openscadPrimitiveImport Keyword
+hi def link openscadRepeat Repeat
+hi def link openscadSpecialVariable Special
+hi def link openscadString String
+hi def link openscadTransform Statement
+hi def link openscadCommentTodo Todo
+
+let b:current_syntax = 'openscad'
diff --git a/runtime/syntax/openvpn.vim b/runtime/syntax/openvpn.vim
new file mode 100644
index 0000000..02fd24b
--- /dev/null
+++ b/runtime/syntax/openvpn.vim
@@ -0,0 +1,72 @@
+" Vim syntax file
+" Language: OpenVPN
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: *.ovpn
+" Last Change: 2022 Oct 16
+
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpoptions
+set cpoptions&vim
+
+" Options
+syntax match openvpnOption /^[a-z-]\+/
+ \ skipwhite nextgroup=openvpnArgList
+syntax match openvpnArgList /.*$/ transparent contained
+ \ contains=openvpnArgument,openvpnNumber,
+ \ openvpnIPv4Address,openvpnIPv6Address,
+ \ openvpnSignal,openvpnComment
+
+" Arguments
+syntax match openvpnArgument /[^\\"' \t]\+/
+ \ contained contains=openvpnEscape
+syntax region openvpnArgument matchgroup=openvpnQuote
+ \ start=/"/ skip=/\\"/ end=/"/
+ \ oneline contained contains=openvpnEscape
+syntax region openvpnArgument matchgroup=openvpnQuote
+ \ start=/'/ skip=/\\'/ end=/'/
+ \ oneline contained
+syntax match openvpnEscape /\\[\\" \t]/ contained
+
+" Numbers
+syntax match openvpnNumber /\<[1-9][0-9]*\(\.[0-9]\+\)\?\>/ contained
+
+" Signals
+syntax match openvpnSignal /SIG\(HUP\|INT\|TERM\|USER[12]\)/ contained
+
+" IP addresses
+syntax match openvpnIPv4Address /\(\d\{1,3}\.\)\{3}\d\{1,3}/
+ \ contained nextgroup=openvpnSlash
+syntax match openvpnIPv6Address /\([A-F0-9]\{1,4}:\)\{7}\[A-F0-9]\{1,4}/
+ \ contained nextgroup=openvpnSlash
+syntax match openvpnSlash "/" contained
+ \ nextgroup=openvpnIPv4Address,openvpnIPv6Address,openvpnNumber
+
+" Inline files
+syntax region openvpnInline matchgroup=openvpnTag
+ \ start=+^<\z([a-z-]\+\)>+ end=+^</\z1>+
+
+" Comments
+syntax keyword openvpnTodo contained TODO FIXME NOTE XXX
+syntax match openvpnComment /^[;#].*$/ contains=openvpnTodo
+syntax match openvpnComment /\s\+\zs[;#].*$/ contains=openvpnTodo
+
+hi def link openvpnArgument String
+hi def link openvpnComment Comment
+hi def link openvpnEscape SpecialChar
+hi def link openvpnIPv4Address Constant
+hi def link openvpnIPv6Address Constant
+hi def link openvpnNumber Number
+hi def link openvpnOption Keyword
+hi def link openvpnQuote Quote
+hi def link openvpnSignal Special
+hi def link openvpnSlash Delimiter
+hi def link openvpnTag Tag
+hi def link openvpnTodo Todo
+
+let b:current_syntax = 'openvpn'
+
+let &cpoptions = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/opl.vim b/runtime/syntax/opl.vim
new file mode 100644
index 0000000..8b66a5b
--- /dev/null
+++ b/runtime/syntax/opl.vim
@@ -0,0 +1,89 @@
+" Vim syntax file
+" Language: OPL
+" Maintainer: Czo <Olivier.Sirol@lip6.fr>
+" Last Change: 2012 Feb 03 by Thilo Six
+" $Id: opl.vim,v 1.1 2004/06/13 17:34:11 vimboss Exp $
+
+" Open Psion Language... (EPOC16/EPOC32)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" case is not significant
+syn case ignore
+
+" A bunch of useful OPL keywords
+syn keyword OPLStatement proc endp abs acos addr adjustalloc alert alloc app
+syn keyword OPLStatement append appendsprite asc asin at atan back beep
+syn keyword OPLStatement begintrans bookmark break busy byref cache
+syn keyword OPLStatement cachehdr cacherec cachetidy call cancel caption
+syn keyword OPLStatement changesprite chr$ clearflags close closesprite cls
+syn keyword OPLStatement cmd$ committrans compact compress const continue
+syn keyword OPLStatement copy cos count create createsprite cursor
+syn keyword OPLStatement datetosecs datim$ day dayname$ days daystodate
+syn keyword OPLStatement dbuttons dcheckbox dchoice ddate declare dedit
+syn keyword OPLStatement deditmulti defaultwin deg delete dfile dfloat
+syn keyword OPLStatement dialog diaminit diampos dinit dir$ dlong do dow
+syn keyword OPLStatement dposition drawsprite dtext dtime dxinput edit else
+syn keyword OPLStatement elseif enda endif endv endwh entersend entersend0
+syn keyword OPLStatement eof erase err err$ errx$ escape eval exist exp ext
+syn keyword OPLStatement external find findfield findlib first fix$ flags
+syn keyword OPLStatement flt font freealloc gat gborder gbox gbutton
+syn keyword OPLStatement gcircle gclock gclose gcls gcolor gcopy gcreate
+syn keyword OPLStatement gcreatebit gdrawobject gellipse gen$ get get$
+syn keyword OPLStatement getcmd$ getdoc$ getevent getevent32 geteventa32
+syn keyword OPLStatement geteventc getlibh gfill gfont ggmode ggrey gheight
+syn keyword OPLStatement gidentity ginfo ginfo32 ginvert giprint glineby
+syn keyword OPLStatement glineto gloadbit gloadfont global gmove gorder
+syn keyword OPLStatement goriginx goriginy goto gotomark gpatt gpeekline
+syn keyword OPLStatement gpoly gprint gprintb gprintclip grank gsavebit
+syn keyword OPLStatement gscroll gsetpenwidth gsetwin gstyle gtmode gtwidth
+syn keyword OPLStatement gunloadfont gupdate guse gvisible gwidth gx
+syn keyword OPLStatement gxborder gxprint gy hex$ hour iabs icon if include
+syn keyword OPLStatement input insert int intf intrans key key$ keya keyc
+syn keyword OPLStatement killmark kmod last lclose left$ len lenalloc
+syn keyword OPLStatement linklib ln loadlib loadm loc local lock log lopen
+syn keyword OPLStatement lower$ lprint max mcard mcasc mean menu mid$ min
+syn keyword OPLStatement minit minute mkdir modify month month$ mpopup
+syn keyword OPLStatement newobj newobjh next notes num$ odbinfo off onerr
+syn keyword OPLStatement open openr opx os parse$ path pause peek pi
+syn keyword OPLStatement pointerfilter poke pos position possprite print
+syn keyword OPLStatement put rad raise randomize realloc recsize rename
+syn keyword OPLStatement rept$ return right$ rmdir rnd rollback sci$ screen
+syn keyword OPLStatement screeninfo second secstodate send setdoc setflags
+syn keyword OPLStatement setname setpath sin space sqr statuswin
+syn keyword OPLStatement statwininfo std stop style sum tan testevent trap
+syn keyword OPLStatement type uadd unloadlib unloadm until update upper$
+syn keyword OPLStatement use usr usr$ usub val var vector week while year
+" syn keyword OPLStatement rem
+
+
+syn match OPLNumber "\<\d\+\>"
+syn match OPLNumber "\<\d\+\.\d*\>"
+syn match OPLNumber "\.\d\+\>"
+
+syn region OPLString start=+"+ end=+"+
+syn region OPLComment start="REM[\t ]" end="$"
+syn match OPLMathsOperator "-\|=\|[:<>+\*^/\\]"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "opl"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/ora.vim b/runtime/syntax/ora.vim
new file mode 100644
index 0000000..9903479
--- /dev/null
+++ b/runtime/syntax/ora.vim
@@ -0,0 +1,464 @@
+" Vim syntax file
+" Language: Oracle config files (.ora) (Oracle 8i, ver. 8.1.5)
+" Maintainer: Sandor Kopanyi <sandor.kopanyi@mailbox.hu>
+" Url: <->
+" Last Change: 2003 May 11
+
+" * the keywords are listed by file (sqlnet.ora, listener.ora, etc.)
+" * the parathesis-checking is made at the beginning for all keywords
+" * possible values are listed also
+" * there are some overlappings (e.g. METHOD is mentioned both for
+" sqlnet-ora and tnsnames.ora; since will not cause(?) problems
+" is easier to follow separately each file's keywords)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'ora'
+endif
+
+syn case ignore
+
+"comments
+syn match oraComment "\#.*"
+
+" catch errors caused by wrong parenthesis
+syn region oraParen transparent start="(" end=")" contains=@oraAll,oraParen
+syn match oraParenError ")"
+
+" strings
+syn region oraString start=+"+ end=+"+
+
+"common .ora staff
+
+"common protocol parameters
+syn keyword oraKeywordGroup ADDRESS ADDRESS_LIST
+syn keyword oraKeywordGroup DESCRIPTION_LIST DESCRIPTION
+"all protocols
+syn keyword oraKeyword PROTOCOL
+syn keyword oraValue ipc tcp nmp
+"Bequeath
+syn keyword oraKeyword PROGRAM ARGV0 ARGS
+"IPC
+syn keyword oraKeyword KEY
+"Named Pipes
+syn keyword oraKeyword SERVER PIPE
+"LU6.2
+syn keyword oraKeyword LU_NAME LLU LOCAL_LU LLU_NAME LOCAL_LU_NAME
+syn keyword oraKeyword MODE MDN
+syn keyword oraKeyword PLU PARTNER_LU_NAME PLU_LA PARTNER_LU_LOCAL_ALIAS
+syn keyword oraKeyword TP_NAME TPN
+"SPX
+syn keyword oraKeyword SERVICE
+"TCP/IP and TCP/IP with SSL
+syn keyword oraKeyword HOST PORT
+
+"misc. keywords I've met but didn't find in manual (maybe they are deprecated?)
+syn keyword oraKeywordGroup COMMUNITY_LIST
+syn keyword oraKeyword COMMUNITY NAME DEFAULT_ZONE
+syn keyword oraValue tcpcom
+
+"common values
+syn keyword oraValue yes no on off true false null all none ok
+"word 'world' is used a lot...
+syn keyword oraModifier world
+
+"misc. common keywords
+syn keyword oraKeyword TRACE_DIRECTORY TRACE_LEVEL TRACE_FILE
+
+
+"sqlnet.ora
+syn keyword oraKeywordPref NAMES NAMESCTL
+syn keyword oraKeywordPref OSS SOURCE SQLNET TNSPING
+syn keyword oraKeyword AUTOMATIC_IPC BEQUEATH_DETACH DAEMON TRACE_MASK
+syn keyword oraKeyword DISABLE_OOB
+syn keyword oraKeyword LOG_DIRECTORY_CLIENT LOG_DIRECTORY_SERVER
+syn keyword oraKeyword LOG_FILE_CLIENT LOG_FILE_SERVER
+syn keyword oraKeyword DCE PREFIX DEFAULT_DOMAIN DIRECTORY_PATH
+syn keyword oraKeyword INITIAL_RETRY_TIMEOUT MAX_OPEN_CONNECTIONS
+syn keyword oraKeyword MESSAGE_POOL_START_SIZE NIS META_MAP
+syn keyword oraKeyword PASSWORD PREFERRED_SERVERS REQUEST_RETRIES
+syn keyword oraKeyword INTERNAL_ENCRYPT_PASSWORD INTERNAL_USE
+syn keyword oraKeyword NO_INITIAL_SERVER NOCONFIRM
+syn keyword oraKeyword SERVER_PASSWORD TRACE_UNIQUE MY_WALLET
+syn keyword oraKeyword LOCATION DIRECTORY METHOD METHOD_DATA
+syn keyword oraKeyword SQLNET_ADDRESS
+syn keyword oraKeyword AUTHENTICATION_SERVICES
+syn keyword oraKeyword AUTHENTICATION_KERBEROS5_SERVICE
+syn keyword oraKeyword AUTHENTICATION_GSSAPI_SERVICE
+syn keyword oraKeyword CLIENT_REGISTRATION
+syn keyword oraKeyword CRYPTO_CHECKSUM_CLIENT CRYPTO_CHECKSUM_SERVER
+syn keyword oraKeyword CRYPTO_CHECKSUM_TYPES_CLIENT CRYPTO_CHECKSUM_TYPES_SERVER
+syn keyword oraKeyword CRYPTO_SEED
+syn keyword oraKeyword ENCRYPTION_CLIENT ENCRYPTION_SERVER
+syn keyword oraKeyword ENCRYPTION_TYPES_CLIENT ENCRYPTION_TYPES_SERVER
+syn keyword oraKeyword EXPIRE_TIME
+syn keyword oraKeyword IDENTIX_FINGERPRINT_DATABASE IDENTIX_FINGERPRINT_DATABASE_USER
+syn keyword oraKeyword IDENTIX_FINGERPRINT_DATABASE_PASSWORD IDENTIX_FINGERPRINT_METHOD
+syn keyword oraKeyword KERBEROS5_CC_NAME KERBEROS5_CLOCKSKEW KERBEROS5_CONF
+syn keyword oraKeyword KERBEROS5_KEYTAB KERBEROS5_REALMS
+syn keyword oraKeyword RADIUS_ALTERNATE RADIUS_ALTERNATE_PORT RADIUS_ALTERNATE_RETRIES
+syn keyword oraKeyword RADIUS_AUTHENTICATION_TIMEOUT RADIUS_AUTHENTICATION
+syn keyword oraKeyword RADIUS_AUTHENTICATION_INTERFACE RADIUS_AUTHENTICATION_PORT
+syn keyword oraKeyword RADIUS_AUTHENTICATION_RETRIES RADIUS_AUTHENTICATION_TIMEOUT
+syn keyword oraKeyword RADIUS_CHALLENGE_RESPONSE RADIUS_SECRET RADIUS_SEND_ACCOUNTING
+syn keyword oraKeyword SSL_CLIENT_AUTHENTICATION SSL_CIPHER_SUITES SSL_VERSION
+syn keyword oraKeyword TRACE_DIRECTORY_CLIENT TRACE_DIRECTORY_SERVER
+syn keyword oraKeyword TRACE_FILE_CLIENT TRACE_FILE_SERVER
+syn keyword oraKeyword TRACE_LEVEL_CLIENT TRACE_LEVEL_SERVER
+syn keyword oraKeyword TRACE_UNIQUE_CLIENT
+syn keyword oraKeyword USE_CMAN USE_DEDICATED_SERVER
+syn keyword oraValue user admin support
+syn keyword oraValue accept accepted reject rejected requested required
+syn keyword oraValue md5 rc4_40 rc4_56 rc4_128 des des_40
+syn keyword oraValue tnsnames onames hostname dce nis novell
+syn keyword oraValue file oracle
+syn keyword oraValue oss
+syn keyword oraValue beq nds nts kerberos5 securid cybersafe identix dcegssapi radius
+syn keyword oraValue undetermined
+
+"tnsnames.ora
+syn keyword oraKeywordGroup CONNECT_DATA FAILOVER_MODE
+syn keyword oraKeyword FAILOVER LOAD_BALANCE SOURCE_ROUTE TYPE_OF_SERVICE
+syn keyword oraKeyword BACKUP TYPE METHOD GLOBAL_NAME HS
+syn keyword oraKeyword INSTANCE_NAME RDB_DATABASE SDU SERVER
+syn keyword oraKeyword SERVICE_NAME SERVICE_NAMES SID
+syn keyword oraKeyword HANDLER_NAME EXTPROC_CONNECTION_DATA
+syn keyword oraValue session select basic preconnect dedicated shared
+
+"listener.ora
+syn keyword oraKeywordGroup SID_LIST SID_DESC PRESPAWN_LIST PRESPAWN_DESC
+syn match oraKeywordGroup "SID_LIST_\w*"
+syn keyword oraKeyword PROTOCOL_STACK PRESENTATION SESSION
+syn keyword oraKeyword GLOBAL_DBNAME ORACLE_HOME PROGRAM SID_NAME
+syn keyword oraKeyword PRESPAWN_MAX POOL_SIZE TIMEOUT
+syn match oraKeyword "CONNECT_TIMEOUT_\w*"
+syn match oraKeyword "LOG_DIRECTORY_\w*"
+syn match oraKeyword "LOG_FILE_\w*"
+syn match oraKeyword "PASSWORDS_\w*"
+syn match oraKeyword "STARTUP_WAIT_TIME_\w*"
+syn match oraKeyword "STARTUP_WAITTIME_\w*"
+syn match oraKeyword "TRACE_DIRECTORY_\w*"
+syn match oraKeyword "TRACE_FILE_\w*"
+syn match oraKeyword "TRACE_LEVEL_\w*"
+syn match oraKeyword "USE_PLUG_AND_PLAY_\w*"
+syn keyword oraValue ttc giop ns raw
+
+"names.ora
+syn keyword oraKeywordGroup ADDRESSES ADMIN_REGION
+syn keyword oraKeywordGroup DEFAULT_FORWARDERS FORWARDER_LIST FORWARDER
+syn keyword oraKeywordGroup DOMAIN_HINTS HINT_DESC HINT_LIST
+syn keyword oraKeywordGroup DOMAINS DOMAIN_LIST DOMAIN
+syn keyword oraKeywordPref NAMES
+syn keyword oraKeyword EXPIRE REFRESH REGION RETRY USERID VERSION
+syn keyword oraKeyword AUTHORITY_REQUIRED CONNECT_TIMEOUT
+syn keyword oraKeyword AUTO_REFRESH_EXPIRE AUTO_REFRESH_RETRY
+syn keyword oraKeyword CACHE_CHECKPOINT_FILE CACHE_CHECKPOINT_INTERVAL
+syn keyword oraKeyword CONFIG_CHECKPOINT_FILE DEFAULT_FORWARDERS_ONLY
+syn keyword oraKeyword HINT FORWARDING_AVAILABLE FORWARDING_DESIRED
+syn keyword oraKeyword KEEP_DB_OPEN
+syn keyword oraKeyword LOG_DIRECTORY LOG_FILE LOG_STATS_INTERVAL LOG_UNIQUE
+syn keyword oraKeyword MAX_OPEN_CONNECTIONS MAX_REFORWARDS
+syn keyword oraKeyword MESSAGE_POOL_START_SIZE
+syn keyword oraKeyword NO_MODIFY_REQUESTS NO_REGION_DATABASE
+syn keyword oraKeyword PASSWORD REGION_CHECKPOINT_FILE
+syn keyword oraKeyword RESET_STATS_INTERVAL SAVE_CONFIG_ON_STOP
+syn keyword oraKeyword SERVER_NAME TRACE_FUNC TRACE_UNIQUE
+
+"cman.ora
+syn keyword oraKeywordGroup CMAN CMAN_ADMIN CMAN_PROFILE PARAMETER_LIST
+syn keyword oraKeywordGroup CMAN_RULES RULES_LIST RULE
+syn keyword oraKeyword ANSWER_TIMEOUT AUTHENTICATION_LEVEL LOG_LEVEL
+syn keyword oraKeyword MAX_FREELIST_BUFFERS MAXIMUM_CONNECT_DATA MAXIMUM_RELAYS
+syn keyword oraKeyword RELAY_STATISTICS SHOW_TNS_INFO TRACING
+syn keyword oraKeyword USE_ASYNC_CALL SRC DST SRV ACT
+
+"protocol.ora
+syn match oraKeyword "\w*\.EXCLUDED_NODES"
+syn match oraKeyword "\w*\.INVITED_NODES"
+syn match oraKeyword "\w*\.VALIDNODE_CHECKING"
+syn keyword oraKeyword TCP NODELAY
+
+
+
+
+"---------------------------------------
+"init.ora
+
+"common values
+syn keyword oraValue nested_loops merge hash unlimited
+
+"init params
+syn keyword oraKeyword O7_DICTIONARY_ACCESSIBILITY ALWAYS_ANTI_JOIN ALWAYS_SEMI_JOIN
+syn keyword oraKeyword AQ_TM_PROCESSES ARCH_IO_SLAVES AUDIT_FILE_DEST AUDIT_TRAIL
+syn keyword oraKeyword BACKGROUND_CORE_DUMP BACKGROUND_DUMP_DEST
+syn keyword oraKeyword BACKUP_TAPE_IO_SLAVES BITMAP_MERGE_AREA_SIZE
+syn keyword oraKeyword BLANK_TRIMMING BUFFER_POOL_KEEP BUFFER_POOL_RECYCLE
+syn keyword oraKeyword COMMIT_POINT_STRENGTH COMPATIBLE CONTROL_FILE_RECORD_KEEP_TIME
+syn keyword oraKeyword CONTROL_FILES CORE_DUMP_DEST CPU_COUNT
+syn keyword oraKeyword CREATE_BITMAP_AREA_SIZE CURSOR_SPACE_FOR_TIME
+syn keyword oraKeyword DB_BLOCK_BUFFERS DB_BLOCK_CHECKING DB_BLOCK_CHECKSUM
+syn keyword oraKeyword DB_BLOCK_LRU_LATCHES DB_BLOCK_MAX_DIRTY_TARGET
+syn keyword oraKeyword DB_BLOCK_SIZE DB_DOMAIN
+syn keyword oraKeyword DB_FILE_DIRECT_IO_COUNT DB_FILE_MULTIBLOCK_READ_COUNT
+syn keyword oraKeyword DB_FILE_NAME_CONVERT DB_FILE_SIMULTANEOUS_WRITES
+syn keyword oraKeyword DB_FILES DB_NAME DB_WRITER_PROCESSES
+syn keyword oraKeyword DBLINK_ENCRYPT_LOGIN DBWR_IO_SLAVES
+syn keyword oraKeyword DELAYED_LOGGING_BLOCK_CLEANOUTS DISCRETE_TRANSACTIONS_ENABLED
+syn keyword oraKeyword DISK_ASYNCH_IO DISTRIBUTED_TRANSACTIONS
+syn keyword oraKeyword DML_LOCKS ENQUEUE_RESOURCES ENT_DOMAIN_NAME EVENT
+syn keyword oraKeyword FAST_START_IO_TARGET FAST_START_PARALLEL_ROLLBACK
+syn keyword oraKeyword FIXED_DATE FREEZE_DB_FOR_FAST_INSTANCE_RECOVERY
+syn keyword oraKeyword GC_DEFER_TIME GC_FILES_TO_LOCKS GC_RELEASABLE_LOCKS GC_ROLLBACK_LOCKS
+syn keyword oraKeyword GLOBAL_NAMES HASH_AREA_SIZE
+syn keyword oraKeyword HASH_JOIN_ENABLED HASH_MULTIBLOCK_IO_COUNT
+syn keyword oraKeyword HI_SHARED_MEMORY_ADDRESS HS_AUTOREGISTER
+syn keyword oraKeyword IFILE
+syn keyword oraKeyword INSTANCE_GROUPS INSTANCE_NAME INSTANCE_NUMBER
+syn keyword oraKeyword JAVA_POOL_SIZE JOB_QUEUE_INTERVAL JOB_QUEUE_PROCESSES LARGE_POOL_SIZE
+syn keyword oraKeyword LICENSE_MAX_SESSIONS LICENSE_MAX_USERS LICENSE_SESSIONS_WARNING
+syn keyword oraKeyword LM_LOCKS LM_PROCS LM_RESS
+syn keyword oraKeyword LOCAL_LISTENER LOCK_NAME_SPACE LOCK_SGA LOCK_SGA_AREAS
+syn keyword oraKeyword LOG_ARCHIVE_BUFFER_SIZE LOG_ARCHIVE_BUFFERS LOG_ARCHIVE_DEST
+syn match oraKeyword "LOG_ARCHIVE_DEST_\(1\|2\|3\|4\|5\)"
+syn match oraKeyword "LOG_ARCHIVE_DEST_STATE_\(1\|2\|3\|4\|5\)"
+syn keyword oraKeyword LOG_ARCHIVE_DUPLEX_DEST LOG_ARCHIVE_FORMAT LOG_ARCHIVE_MAX_PROCESSES
+syn keyword oraKeyword LOG_ARCHIVE_MIN_SUCCEED_DEST LOG_ARCHIVE_START
+syn keyword oraKeyword LOG_BUFFER LOG_CHECKPOINT_INTERVAL LOG_CHECKPOINT_TIMEOUT
+syn keyword oraKeyword LOG_CHECKPOINTS_TO_ALERT LOG_FILE_NAME_CONVERT
+syn keyword oraKeyword MAX_COMMIT_PROPAGATION_DELAY MAX_DUMP_FILE_SIZE
+syn keyword oraKeyword MAX_ENABLED_ROLES MAX_ROLLBACK_SEGMENTS
+syn keyword oraKeyword MTS_DISPATCHERS MTS_MAX_DISPATCHERS MTS_MAX_SERVERS MTS_SERVERS
+syn keyword oraKeyword NLS_CALENDAR NLS_COMP NLS_CURRENCY NLS_DATE_FORMAT
+syn keyword oraKeyword NLS_DATE_LANGUAGE NLS_DUAL_CURRENCY NLS_ISO_CURRENCY NLS_LANGUAGE
+syn keyword oraKeyword NLS_NUMERIC_CHARACTERS NLS_SORT NLS_TERRITORY
+syn keyword oraKeyword OBJECT_CACHE_MAX_SIZE_PERCENT OBJECT_CACHE_OPTIMAL_SIZE
+syn keyword oraKeyword OPEN_CURSORS OPEN_LINKS OPEN_LINKS_PER_INSTANCE
+syn keyword oraKeyword OPS_ADMINISTRATION_GROUP
+syn keyword oraKeyword OPTIMIZER_FEATURES_ENABLE OPTIMIZER_INDEX_CACHING
+syn keyword oraKeyword OPTIMIZER_INDEX_COST_ADJ OPTIMIZER_MAX_PERMUTATIONS
+syn keyword oraKeyword OPTIMIZER_MODE OPTIMIZER_PERCENT_PARALLEL
+syn keyword oraKeyword OPTIMIZER_SEARCH_LIMIT
+syn keyword oraKeyword ORACLE_TRACE_COLLECTION_NAME ORACLE_TRACE_COLLECTION_PATH
+syn keyword oraKeyword ORACLE_TRACE_COLLECTION_SIZE ORACLE_TRACE_ENABLE
+syn keyword oraKeyword ORACLE_TRACE_FACILITY_NAME ORACLE_TRACE_FACILITY_PATH
+syn keyword oraKeyword OS_AUTHENT_PREFIX OS_ROLES
+syn keyword oraKeyword PARALLEL_ADAPTIVE_MULTI_USER PARALLEL_AUTOMATIC_TUNING
+syn keyword oraKeyword PARALLEL_BROADCAST_ENABLED PARALLEL_EXECUTION_MESSAGE_SIZE
+syn keyword oraKeyword PARALLEL_INSTANCE_GROUP PARALLEL_MAX_SERVERS
+syn keyword oraKeyword PARALLEL_MIN_PERCENT PARALLEL_MIN_SERVERS
+syn keyword oraKeyword PARALLEL_SERVER PARALLEL_SERVER_INSTANCES PARALLEL_THREADS_PER_CPU
+syn keyword oraKeyword PARTITION_VIEW_ENABLED PLSQL_V2_COMPATIBILITY
+syn keyword oraKeyword PRE_PAGE_SGA PROCESSES
+syn keyword oraKeyword QUERY_REWRITE_ENABLED QUERY_REWRITE_INTEGRITY
+syn keyword oraKeyword RDBMS_SERVER_DN READ_ONLY_OPEN_DELAYED RECOVERY_PARALLELISM
+syn keyword oraKeyword REMOTE_DEPENDENCIES_MODE REMOTE_LOGIN_PASSWORDFILE
+syn keyword oraKeyword REMOTE_OS_AUTHENT REMOTE_OS_ROLES
+syn keyword oraKeyword REPLICATION_DEPENDENCY_TRACKING
+syn keyword oraKeyword RESOURCE_LIMIT RESOURCE_MANAGER_PLAN
+syn keyword oraKeyword ROLLBACK_SEGMENTS ROW_LOCKING SERIAL _REUSE SERVICE_NAMES
+syn keyword oraKeyword SESSION_CACHED_CURSORS SESSION_MAX_OPEN_FILES SESSIONS
+syn keyword oraKeyword SHADOW_CORE_DUMP
+syn keyword oraKeyword SHARED_MEMORY_ADDRESS SHARED_POOL_RESERVED_SIZE SHARED_POOL_SIZE
+syn keyword oraKeyword SORT_AREA_RETAINED_SIZE SORT_AREA_SIZE SORT_MULTIBLOCK_READ_COUNT
+syn keyword oraKeyword SQL92_SECURITY SQL_TRACE STANDBY_ARCHIVE_DEST
+syn keyword oraKeyword STAR_TRANSFORMATION_ENABLED TAPE_ASYNCH_IO THREAD
+syn keyword oraKeyword TIMED_OS_STATISTICS TIMED_STATISTICS
+syn keyword oraKeyword TRANSACTION_AUDITING TRANSACTIONS TRANSACTIONS_PER_ROLLBACK_SEGMENT
+syn keyword oraKeyword USE_INDIRECT_DATA_BUFFERS USER_DUMP_DEST
+syn keyword oraKeyword UTL_FILE_DIR
+syn keyword oraKeywordObs ALLOW_PARTIAL_SN_RESULTS B_TREE_BITMAP_PLANS
+syn keyword oraKeywordObs BACKUP_DISK_IO_SLAVES CACHE_SIZE_THRESHOLD
+syn keyword oraKeywordObs CCF_IO_SIZE CLEANUP_ROLLBACK_ENTRIES
+syn keyword oraKeywordObs CLOSE_CACHED_OPEN_CURSORS COMPATIBLE_NO_RECOVERY
+syn keyword oraKeywordObs COMPLEX_VIEW_MERGING
+syn keyword oraKeywordObs DB_BLOCK_CHECKPOINT_BATCH DB_BLOCK_LRU_EXTENDED_STATISTICS
+syn keyword oraKeywordObs DB_BLOCK_LRU_STATISTICS
+syn keyword oraKeywordObs DISTRIBUTED_LOCK_TIMEOUT DISTRIBUTED_RECOVERY_CONNECTION_HOLD_TIME
+syn keyword oraKeywordObs FAST_FULL_SCAN_ENABLED GC_LATCHES GC_LCK_PROCS
+syn keyword oraKeywordObs LARGE_POOL_MIN_ALLOC LGWR_IO_SLAVES
+syn keyword oraKeywordObs LOG_BLOCK_CHECKSUM LOG_FILES
+syn keyword oraKeywordObs LOG_SIMULTANEOUS_COPIES LOG_SMALL_ENTRY_MAX_SIZE
+syn keyword oraKeywordObs MAX_TRANSACTION_BRANCHES
+syn keyword oraKeywordObs MTS_LISTENER_ADDRESS MTS_MULTIPLE_LISTENERS
+syn keyword oraKeywordObs MTS_RATE_LOG_SIZE MTS_RATE_SCALE MTS_SERVICE
+syn keyword oraKeywordObs OGMS_HOME OPS_ADMIN_GROUP
+syn keyword oraKeywordObs PARALLEL_DEFAULT_MAX_INSTANCES PARALLEL_MIN_MESSAGE_POOL
+syn keyword oraKeywordObs PARALLEL_SERVER_IDLE_TIME PARALLEL_TRANSACTION_RESOURCE_TIMEOUT
+syn keyword oraKeywordObs PUSH_JOIN_PREDICATE REDUCE_ALARM ROW_CACHE_CURSORS
+syn keyword oraKeywordObs SEQUENCE_CACHE_ENTRIES SEQUENCE_CACHE_HASH_BUCKETS
+syn keyword oraKeywordObs SHARED_POOL_RESERVED_MIN_ALLOC
+syn keyword oraKeywordObs SORT_DIRECT_WRITES SORT_READ_FAC SORT_SPACEMAP_SIZE
+syn keyword oraKeywordObs SORT_WRITE_BUFFER_SIZE SORT_WRITE_BUFFERS
+syn keyword oraKeywordObs SPIN_COUNT TEMPORARY_TABLE_LOCKS USE_ISM
+syn keyword oraValue db os full partial mandatory optional reopen enable defer
+syn keyword oraValue always default intent disable dml plsql temp_disable
+syn match oravalue "Arabic Hijrah"
+syn match oravalue "English Hijrah"
+syn match oravalue "Gregorian"
+syn match oravalue "Japanese Imperial"
+syn match oravalue "Persian"
+syn match oravalue "ROC Official"
+syn match oravalue "Thai Buddha"
+syn match oravalue "8.0.0"
+syn match oravalue "8.0.3"
+syn match oravalue "8.0.4"
+syn match oravalue "8.1.3"
+syn match oraModifier "archived log"
+syn match oraModifier "backup corruption"
+syn match oraModifier "backup datafile"
+syn match oraModifier "backup piece "
+syn match oraModifier "backup redo log"
+syn match oraModifier "backup set"
+syn match oraModifier "copy corruption"
+syn match oraModifier "datafile copy"
+syn match oraModifier "deleted object"
+syn match oraModifier "loghistory"
+syn match oraModifier "offline range"
+
+"undocumented init params
+"up to 7.2 (inclusive)
+syn keyword oraKeywordUndObs _latch_spin_count _trace_instance_termination
+syn keyword oraKeywordUndObs _wakeup_timeout _lgwr_async_write
+"7.3
+syn keyword oraKeywordUndObs _standby_lock_space_name _enable_dba_locking
+"8.0.5
+syn keyword oraKeywordUnd _NUMA_instance_mapping _NUMA_pool_size
+syn keyword oraKeywordUnd _advanced_dss_features _affinity_on _all_shared_dblinks
+syn keyword oraKeywordUnd _allocate_creation_order _allow_resetlogs_corruption
+syn keyword oraKeywordUnd _always_star_transformation _bump_highwater_mark_count
+syn keyword oraKeywordUnd _column_elimination_off _controlfile_enqueue_timeout
+syn keyword oraKeywordUnd _corrupt_blocks_on_stuck_recovery _corrupted_rollback_segments
+syn keyword oraKeywordUnd _cr_deadtime _cursor_db_buffers_pinned
+syn keyword oraKeywordUnd _db_block_cache_clone _db_block_cache_map _db_block_cache_protect
+syn keyword oraKeywordUnd _db_block_hash_buckets _db_block_hi_priority_batch_size
+syn keyword oraKeywordUnd _db_block_max_cr_dba _db_block_max_scan_cnt
+syn keyword oraKeywordUnd _db_block_med_priority_batch_size _db_block_no_idle_writes
+syn keyword oraKeywordUnd _db_block_write_batch _db_handles _db_handles_cached
+syn keyword oraKeywordUnd _db_large_dirty_queue _db_no_mount_lock
+syn keyword oraKeywordUnd _db_writer_histogram_statistics _db_writer_scan_depth
+syn keyword oraKeywordUnd _db_writer_scan_depth_decrement _db_writer_scan_depth_increment
+syn keyword oraKeywordUnd _disable_incremental_checkpoints
+syn keyword oraKeywordUnd _disable_latch_free_SCN_writes_via_32cas
+syn keyword oraKeywordUnd _disable_latch_free_SCN_writes_via_64cas
+syn keyword oraKeywordUnd _disable_logging _disable_ntlog_events
+syn keyword oraKeywordUnd _dss_cache_flush _dynamic_stats_threshold
+syn keyword oraKeywordUnd _enable_cscn_caching _enable_default_affinity
+syn keyword oraKeywordUnd _enqueue_debug_multi_instance _enqueue_hash
+syn keyword oraKeywordUnd _enqueue_hash_chain_latches _enqueue_locks
+syn keyword oraKeywordUnd _fifth_spare_parameter _first_spare_parameter _fourth_spare_parameter
+syn keyword oraKeywordUnd _gc_class_locks _groupby_nopushdown_cut_ratio
+syn keyword oraKeywordUnd _idl_conventional_index_maintenance _ignore_failed_escalates
+syn keyword oraKeywordUnd _init_sql_file
+syn keyword oraKeywordUnd _io_slaves_disabled _ioslave_batch_count _ioslave_issue_count
+syn keyword oraKeywordUnd _kgl_bucket_count _kgl_latch_count _kgl_multi_instance_invalidation
+syn keyword oraKeywordUnd _kgl_multi_instance_lock _kgl_multi_instance_pin
+syn keyword oraKeywordUnd _latch_miss_stat_sid _latch_recovery_alignment _latch_wait_posting
+syn keyword oraKeywordUnd _lm_ast_option _lm_direct_sends _lm_dlmd_procs _lm_domains _lm_groups
+syn keyword oraKeywordUnd _lm_non_fault_tolerant _lm_send_buffers _lm_statistics _lm_xids
+syn keyword oraKeywordUnd _log_blocks_during_backup _log_buffers_debug _log_checkpoint_recovery_check
+syn keyword oraKeywordUnd _log_debug_multi_instance _log_entry_prebuild_threshold _log_io_size
+syn keyword oraKeywordUnd _log_space_errors
+syn keyword oraKeywordUnd _max_exponential_sleep _max_sleep_holding_latch
+syn keyword oraKeywordUnd _messages _minimum_giga_scn _mts_load_constants _nested_loop_fudge
+syn keyword oraKeywordUnd _no_objects _no_or_expansion
+syn keyword oraKeywordUnd _number_cached_attributes _offline_rollback_segments _open_files_limit
+syn keyword oraKeywordUnd _optimizer_undo_changes
+syn keyword oraKeywordUnd _oracle_trace_events _oracle_trace_facility_version
+syn keyword oraKeywordUnd _ordered_nested_loop _parallel_server_sleep_time
+syn keyword oraKeywordUnd _passwordfile_enqueue_timeout _pdml_slaves_diff_part
+syn keyword oraKeywordUnd _plsql_dump_buffer_events _predicate_elimination_enabled
+syn keyword oraKeywordUnd _project_view_columns
+syn keyword oraKeywordUnd _px_broadcast_fudge_factor _px_broadcast_trace _px_dop_limit_degree
+syn keyword oraKeywordUnd _px_dop_limit_threshold _px_kxfr_granule_allocation _px_kxib_tracing
+syn keyword oraKeywordUnd _release_insert_threshold _reuse_index_loop
+syn keyword oraKeywordUnd _rollback_segment_count _rollback_segment_initial
+syn keyword oraKeywordUnd _row_cache_buffer_size _row_cache_instance_locks
+syn keyword oraKeywordUnd _save_escalates _scn_scheme
+syn keyword oraKeywordUnd _second_spare_parameter _session_idle_bit_latches
+syn keyword oraKeywordUnd _shared_session_sort_fetch_buffer _single_process
+syn keyword oraKeywordUnd _small_table_threshold _sql_connect_capability_override
+syn keyword oraKeywordUnd _sql_connect_capability_table
+syn keyword oraKeywordUnd _test_param_1 _test_param_2 _test_param_3
+syn keyword oraKeywordUnd _third_spare_parameter _tq_dump_period
+syn keyword oraKeywordUnd _trace_archive_dest _trace_archive_start _trace_block_size
+syn keyword oraKeywordUnd _trace_buffers_per_process _trace_enabled _trace_events
+syn keyword oraKeywordUnd _trace_file_size _trace_files_public _trace_flushing _trace_write_batch_size
+syn keyword oraKeywordUnd _upconvert_from_ast _use_vector_post _wait_for_sync _walk_insert_threshold
+"dunno which version; may be 8.1.x, may be obsoleted
+syn keyword oraKeywordUndObs _arch_io_slaves _average_dirties_half_life _b_tree_bitmap_plans
+syn keyword oraKeywordUndObs _backup_disk_io_slaves _backup_io_pool_size
+syn keyword oraKeywordUndObs _cleanup_rollback_entries _close_cached_open_cursors
+syn keyword oraKeywordUndObs _compatible_no_recovery _complex_view_merging
+syn keyword oraKeywordUndObs _cpu_to_io _cr_server
+syn keyword oraKeywordUndObs _db_aging_cool_count _db_aging_freeze_cr _db_aging_hot_criteria
+syn keyword oraKeywordUndObs _db_aging_stay_count _db_aging_touch_time
+syn keyword oraKeywordUndObs _db_percent_hot_default _db_percent_hot_keep _db_percent_hot_recycle
+syn keyword oraKeywordUndObs _db_writer_chunk_writes _db_writer_max_writes
+syn keyword oraKeywordUndObs _dbwr_async_io _dbwr_tracing
+syn keyword oraKeywordUndObs _defer_multiple_waiters _discrete_transaction_enabled
+syn keyword oraKeywordUndObs _distributed_lock_timeout _distributed_recovery _distribited_recovery_
+syn keyword oraKeywordUndObs _domain_index_batch_size _domain_index_dml_batch_size
+syn keyword oraKeywordUndObs _enable_NUMA_optimization _enable_block_level_transaction_recovery
+syn keyword oraKeywordUndObs _enable_list_io _enable_multiple_sampling
+syn keyword oraKeywordUndObs _fairness_treshold _fast_full_scan_enabled _foreground_locks
+syn keyword oraKeywordUndObs _full_pwise_join_enabled _gc_latches _gc_lck_procs
+syn keyword oraKeywordUndObs _high_server_treshold _index_prefetch_factor _kcl_debug
+syn keyword oraKeywordUndObs _kkfi_trace _large_pool_min_alloc _lazy_freelist_close _left_nested_loops_random
+syn keyword oraKeywordUndObs _lgwr_async_io _lgwr_io_slaves _lock_sga_areas
+syn keyword oraKeywordUndObs _log_archive_buffer_size _log_archive_buffers _log_simultaneous_copies
+syn keyword oraKeywordUndObs _low_server_treshold _max_transaction_branches
+syn keyword oraKeywordUndObs _mts_rate_log_size _mts_rate_scale
+syn keyword oraKeywordUndObs _mview_cost_rewrite _mview_rewrite_2
+syn keyword oraKeywordUndObs _ncmb_readahead_enabled _ncmb_readahead_tracing
+syn keyword oraKeywordUndObs _ogms_home
+syn keyword oraKeywordUndObs _parallel_adaptive_max_users _parallel_default_max_instances
+syn keyword oraKeywordUndObs _parallel_execution_message_align _parallel_fake_class_pct
+syn keyword oraKeywordUndObs _parallel_load_bal_unit _parallel_load_balancing
+syn keyword oraKeywordUndObs _parallel_min_message_pool _parallel_recovery_stopat
+syn keyword oraKeywordUndObs _parallel_server_idle_time _parallelism_cost_fudge_factor
+syn keyword oraKeywordUndObs _partial_pwise_join_enabled _pdml_separate_gim _push_join_predicate
+syn keyword oraKeywordUndObs _px_granule_size _px_index_sampling _px_load_publish_interval
+syn keyword oraKeywordUndObs _px_max_granules_per_slave _px_min_granules_per_slave _px_no_stealing
+syn keyword oraKeywordUndObs _row_cache_cursors _serial_direct_read _shared_pool_reserved_min_alloc
+syn keyword oraKeywordUndObs _sort_space_for_write_buffers _spin_count _system_trig_enabled
+syn keyword oraKeywordUndObs _trace_buffer_flushes _trace_cr_buffer_creates _trace_multi_block_reads
+syn keyword oraKeywordUndObs _transaction_recovery_servers _use_ism _yield_check_interval
+
+
+syn cluster oraAll add=oraKeyword,oraKeywordGroup,oraKeywordPref,oraKeywordObs,oraKeywordUnd,oraKeywordUndObs
+syn cluster oraAll add=oraValue,oraModifier,oraString,oraSpecial,oraComment
+
+"==============================================================================
+" highlighting
+
+" 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
+
+
+
+let b:current_syntax = "ora"
+
+if main_syntax == 'ora'
+ unlet main_syntax
+endif
+
+" vim: ts=8
diff --git a/runtime/syntax/pamconf.vim b/runtime/syntax/pamconf.vim
new file mode 100644
index 0000000..2913284
--- /dev/null
+++ b/runtime/syntax/pamconf.vim
@@ -0,0 +1,131 @@
+" Vim syntax file
+" Language: pam(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2020/08/04
+" Changes By: Haochen Tong
+
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let s:has_service_field = exists("b:pamconf_has_service_field")
+ \ ? b:pamconf_has_service_field
+ \ : expand('%:t') == 'pam.conf' ? 1 : 0
+
+syn match pamconfType '-\?[[:alpha:]]\+'
+ \ contains=pamconfTypeKeyword
+ \ nextgroup=pamconfControl,
+ \ pamconfTypeLineCont skipwhite
+
+syn keyword pamconfTypeKeyword contained account auth password session
+
+if s:has_service_field
+ syn match pamconfService '^[[:graph:]]\+'
+ \ nextgroup=pamconfType,
+ \ pamconfServiceLineCont skipwhite
+
+ syn match pamconfServiceLineCont contained '\\$'
+ \ nextgroup=pamconfType,
+ \ pamconfServiceLineCont skipwhite skipnl
+endif
+
+syn keyword pamconfTodo contained TODO FIXME XXX NOTE
+
+syn region pamconfComment display oneline start='#' end='$'
+ \ contains=pamconfTodo,@Spell
+
+syn match pamconfTypeLineCont contained '\\$'
+ \ nextgroup=pamconfControl,
+ \ pamconfTypeLineCont skipwhite skipnl
+
+syn keyword pamconfControl contained requisite required sufficient
+ \ optional include substack
+ \ nextgroup=pamconfMPath,
+ \ pamconfControlLineContH skipwhite
+
+syn match pamconfControlBegin '\[' nextgroup=pamconfControlValues,
+ \ pamconfControlLineCont skipwhite
+
+syn match pamconfControlLineCont contained '\\$'
+ \ nextgroup=pamconfControlValues,
+ \ pamconfControlLineCont skipwhite skipnl
+
+syn keyword pamconfControlValues contained success open_err symbol_err
+ \ service_err system_err buf_err
+ \ perm_denied auth_err cred_insufficient
+ \ authinfo_unavail user_unknown maxtries
+ \ new_authtok_reqd acct_expired session_err
+ \ cred_unavail cred_expired cred_err
+ \ no_module_data conv_err authtok_err
+ \ authtok_recover_err authtok_lock_busy
+ \ authtok_disable_aging try_again ignore
+ \ abort authtok_expired module_unknown
+ \ bad_item and default
+ \ nextgroup=pamconfControlValueEq
+
+syn match pamconfControlValueEq contained '='
+ \ nextgroup=pamconfControlActionN,
+ \ pamconfControlAction
+
+syn match pamconfControlActionN contained '\d\+\>'
+ \ nextgroup=pamconfControlValues,
+ \ pamconfControlLineCont,pamconfControlEnd
+ \ skipwhite
+syn keyword pamconfControlAction contained ignore bad die ok done reset
+ \ nextgroup=pamconfControlValues,
+ \ pamconfControlLineCont,pamconfControlEnd
+ \ skipwhite
+
+syn match pamconfControlEnd contained '\]'
+ \ nextgroup=pamconfMPath,
+ \ pamconfControlLineContH skipwhite
+
+syn match pamconfControlLineContH contained '\\$'
+ \ nextgroup=pamconfMPath,
+ \ pamconfControlLineContH skipwhite skipnl
+
+syn match pamconfMPath contained '\S\+'
+ \ nextgroup=pamconfMPathLineCont,
+ \ pamconfArgs skipwhite
+
+syn match pamconfArgs contained '\S\+'
+ \ nextgroup=pamconfArgsLineCont,
+ \ pamconfArgs skipwhite
+
+syn match pamconfMPathLineCont contained '\\$'
+ \ nextgroup=pamconfMPathLineCont,
+ \ pamconfArgs skipwhite skipnl
+
+syn match pamconfArgsLineCont contained '\\$'
+ \ nextgroup=pamconfArgsLineCont,
+ \ pamconfArgs skipwhite skipnl
+
+hi def link pamconfTodo Todo
+hi def link pamconfComment Comment
+hi def link pamconfService Statement
+hi def link pamconfServiceLineCont Special
+hi def link pamconfType Special
+hi def link pamconfTypeKeyword Type
+hi def link pamconfTypeLineCont pamconfServiceLineCont
+hi def link pamconfControl Macro
+hi def link pamconfControlBegin Delimiter
+hi def link pamconfControlLineContH pamconfServiceLineCont
+hi def link pamconfControlLineCont pamconfServiceLineCont
+hi def link pamconfControlValues Identifier
+hi def link pamconfControlValueEq Operator
+hi def link pamconfControlActionN Number
+hi def link pamconfControlAction Identifier
+hi def link pamconfControlEnd Delimiter
+hi def link pamconfMPath String
+hi def link pamconfMPathLineCont pamconfServiceLineCont
+hi def link pamconfArgs Normal
+hi def link pamconfArgsLineCont pamconfServiceLineCont
+
+let b:current_syntax = "pamconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/pamenv.vim b/runtime/syntax/pamenv.vim
new file mode 100644
index 0000000..90359da
--- /dev/null
+++ b/runtime/syntax/pamenv.vim
@@ -0,0 +1,28 @@
+" Vim syntax file
+" Language: pam_env.conf(5) configuration file
+" Latest Revision: 2020-05-10
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword pamenvTodo contained TODO FIXME XXX NOTE
+syn region pamenvComment start='^#' end='$' display oneline contains=pamenvTodo,@Spells
+
+syn match pamenvVars '^[A-Z_][A-Z_0-9]*' nextgroup=pamenvKeywords skipwhite
+
+syn keyword pamenvKeywords contained DEFAULT OVERRIDE nextgroup=pamenvVarEq
+
+syn match pamenvVarEq contained '=' nextgroup=pamenvValue,pamenvValueWithQuote
+
+syn match pamenvValue contained '[^ \t]*' skipwhite nextgroup=pamenvKeywords
+syn region pamenvValueWithQuote contained start='"' end='"' skipwhite nextgroup=pamenvKeywords
+
+hi def link pamenvTodo Todo
+hi def link pamenvComment Comment
+hi def link pamenvKeywords Keyword
+hi def link pamenvVars Identifier
+hi def link pamenvValue String
+hi def link pamenvValueWithQuote String
+
+let b:current_syntax = "pamenv"
diff --git a/runtime/syntax/papp.vim b/runtime/syntax/papp.vim
new file mode 100644
index 0000000..5b65f05
--- /dev/null
+++ b/runtime/syntax/papp.vim
@@ -0,0 +1,76 @@
+" Vim syntax file for the "papp" file format (_p_erl _app_lication)
+"
+" Language: papp
+" Maintainer: Marc Lehmann <pcg@goof.com>
+" Last Change: 2009 Nov 11
+" Filenames: *.papp *.pxml *.pxsl
+" URL: http://papp.plan9.de/
+
+" You can set the "papp_include_html" variable so that html will be
+" rendered as such inside phtml sections (in case you actually put html
+" there - papp does not require that). Also, rendering html tends to keep
+" the clutter high on the screen - mixing three languages is difficult
+" enough(!). PS: it is also slow.
+
+" pod is, btw, allowed everywhere, which is actually wrong :(
+
+" 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
+runtime! syntax/xml.vim
+unlet b:current_syntax
+
+if exists("papp_include_html")
+ syn include @PAppHtml syntax/html.vim
+ unlet b:current_syntax
+ syntax spell default " added by Bram
+endif
+
+syn include @PAppPerl syntax/perl.vim
+
+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
+syn match papp_prep /^#\s*\(else\|endif\|??\).*$/ contained
+" translation entries
+syn region papp_gettext start=/__"/ end=/"/ contained contains=@papp_perlInterpDQ
+syn cluster PAppHtml add=papp_gettext,papp_prep
+
+" add special, paired xperl, perl and phtml tags
+syn region papp_perl matchgroup=xmlTag start="<perl>" end="</perl>" contains=papp_CDATAp,@PAppPerl keepend
+syn region papp_xperl matchgroup=xmlTag start="<xperl>" end="</xperl>" contains=papp_CDATAp,@PAppPerl keepend
+syn region papp_phtml matchgroup=xmlTag start="<phtml>" end="</phtml>" contains=papp_CDATAh,papp_ph_perl,papp_ph_html,papp_ph_hint,@PAppHtml keepend
+syn region papp_pxml matchgroup=xmlTag start="<pxml>" end="</pxml>" contains=papp_CDATAx,papp_ph_perl,papp_ph_xml,papp_ph_xint keepend
+syn region papp_perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,perlTodo keepend
+
+" cdata sections
+syn region papp_CDATAp matchgroup=xmlCdataDecl start="<!\[CDATA\[" end="\]\]>" contains=@PAppPerl contained keepend
+syn region papp_CDATAh matchgroup=xmlCdataDecl start="<!\[CDATA\[" end="\]\]>" contains=papp_ph_perl,papp_ph_html,papp_ph_hint,@PAppHtml contained keepend
+syn region papp_CDATAx matchgroup=xmlCdataDecl start="<!\[CDATA\[" end="\]\]>" contains=papp_ph_perl,papp_ph_xml,papp_ph_xint contained keepend
+
+syn region papp_ph_perl matchgroup=Delimiter start="<[:?]" end="[:?]>"me=e-2 nextgroup=papp_ph_html contains=@PAppPerl contained keepend
+syn region papp_ph_html matchgroup=Delimiter start=":>" end="<[:?]"me=e-2 nextgroup=papp_ph_perl contains=@PAppHtml contained keepend
+syn region papp_ph_hint matchgroup=Delimiter start="?>" end="<[:?]"me=e-2 nextgroup=papp_ph_perl contains=@perlInterpDQ,@PAppHtml contained keepend
+syn region papp_ph_xml matchgroup=Delimiter start=":>" end="<[:?]"me=e-2 nextgroup=papp_ph_perl contains= contained keepend
+syn region papp_ph_xint matchgroup=Delimiter start="?>" end="<[:?]"me=e-2 nextgroup=papp_ph_perl contains=@perlInterpDQ contained keepend
+
+" synchronization is horrors!
+syn sync clear
+syn sync match pappSync grouphere papp_CDATAh "</\(perl\|xperl\|phtml\|macro\|module\)>"
+syn sync match pappSync grouphere papp_CDATAh "^# *\(if\|elsif\|else\|endif\)"
+syn sync match pappSync grouphere papp_CDATAh "</\(tr\|td\|table\|hr\|h1\|h2\|h3\)>"
+syn sync match pappSync grouphere NONE "</\=\(module\|state\|macro\)>"
+
+syn sync maxlines=300
+syn sync minlines=5
+
+" The default highlighting.
+
+hi def link papp_prep preCondit
+hi def link papp_gettext String
+
+let b:current_syntax = "papp"
diff --git a/runtime/syntax/pascal.vim b/runtime/syntax/pascal.vim
new file mode 100644
index 0000000..206df21
--- /dev/null
+++ b/runtime/syntax/pascal.vim
@@ -0,0 +1,384 @@
+" Vim syntax file
+" Language: Pascal
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainers: Xavier Crégut <xavier.cregut@enseeiht.fr>
+" Mario Eusebio <bio@dq.fct.unl.pt>
+" Last Change: 2021 May 20
+
+" Contributors: Tim Chase <tchase@csc.com>,
+" Stas Grabois <stsi@vtrails.com>,
+" Mazen NEIFER <mazen.neifer.2001@supaero.fr>,
+" Klaus Hast <Klaus.Hast@arcor.net>,
+" Austin Ziegler <austin@halostatue.ca>,
+" Markus Koenig <markus@stber-koenig.de>
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+syn case ignore
+syn sync lines=250
+
+syn keyword pascalBoolean true false
+syn keyword pascalConditional if else then
+syn keyword pascalConstant nil maxint
+syn keyword pascalLabel case goto label
+syn keyword pascalOperator and div downto in mod not of or packed
+syn keyword pascalRepeat do for do repeat while to until
+syn keyword pascalStatement procedure function
+syn keyword pascalStatement program begin end const var type with
+syn keyword pascalStruct record
+syn keyword pascalType array boolean char integer file pointer real set
+syn keyword pascalType string text variant
+
+
+ " 20011222az: Added new items.
+syn keyword pascalTodo contained TODO FIXME XXX DEBUG NOTE
+
+ " 20010723az: When wanted, highlight the trailing whitespace -- this is
+ " based on c_space_errors; to enable, use "pascal_space_errors".
+if exists("pascal_space_errors")
+ if !exists("pascal_no_trail_space_error")
+ syn match pascalSpaceError "\s\+$"
+ endif
+ if !exists("pascal_no_tab_space_error")
+ syn match pascalSpaceError " \+\t"me=e-1
+ endif
+endif
+
+
+
+" String
+if !exists("pascal_one_line_string")
+ syn region pascalString matchgroup=pascalString start=+'+ end=+'+ contains=pascalStringEscape
+ if exists("pascal_gpc")
+ syn region pascalString matchgroup=pascalString start=+"+ end=+"+ contains=pascalStringEscapeGPC
+ else
+ syn region pascalStringError matchgroup=pascalStringError start=+"+ end=+"+ contains=pascalStringEscape
+ endif
+else
+ "wrong strings
+ syn region pascalStringError matchgroup=pascalStringError start=+'+ end=+'+ end=+$+ contains=pascalStringEscape
+ if exists("pascal_gpc")
+ syn region pascalStringError matchgroup=pascalStringError start=+"+ end=+"+ end=+$+ contains=pascalStringEscapeGPC
+ else
+ syn region pascalStringError matchgroup=pascalStringError start=+"+ end=+"+ end=+$+ contains=pascalStringEscape
+ endif
+
+ "right strings
+ syn region pascalString matchgroup=pascalString start=+'+ end=+'+ oneline contains=pascalStringEscape
+ " To see the start and end of strings:
+ " syn region pascalString matchgroup=pascalStringError start=+'+ end=+'+ oneline contains=pascalStringEscape
+ if exists("pascal_gpc")
+ syn region pascalString matchgroup=pascalString start=+"+ end=+"+ oneline contains=pascalStringEscapeGPC
+ else
+ syn region pascalStringError matchgroup=pascalStringError start=+"+ end=+"+ oneline contains=pascalStringEscape
+ endif
+end
+syn match pascalStringEscape contained "''"
+syn match pascalStringEscapeGPC contained '""'
+
+
+" syn match pascalIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>"
+
+
+if exists("pascal_symbol_operator")
+ syn match pascalSymbolOperator "[+\-/*=]"
+ syn match pascalSymbolOperator "[<>]=\="
+ syn match pascalSymbolOperator "<>"
+ syn match pascalSymbolOperator ":="
+ syn match pascalSymbolOperator "[()]"
+ syn match pascalSymbolOperator "\.\."
+ syn match pascalSymbolOperator "[\^.]"
+ syn match pascalMatrixDelimiter "[][]"
+ "if you prefer you can highlight the range
+ "syn match pascalMatrixDelimiter "[\d\+\.\.\d\+]"
+endif
+
+syn match pascalNumber "-\=\<\d\+\>"
+if !exists("pascal_traditional")
+ syn match pascalHexNumber "\$\x\+\>"
+endif
+if exists("pascal_fpc")
+ syn match pascalOctNumber "&\o\+\>"
+ syn match pascalBinNumber "%[01]\+\>"
+endif
+if exists("pascal_gpc")
+ syn match pascalExtendedNumber "\%([2-9]\|[12]\d\|3[0-6]\)#[[:alnum:]]\+\>"
+endif
+
+syn match pascalFloat "-\=\<\d\+\.\d\+\>"
+syn match pascalFloat "-\=\<\d\+\.\d\+[eE]-\=\d\+\>"
+
+if !exists("pascal_traditional")
+ " allow leading zeros
+ syn match pascalControlCharacter "#\%([01]\=\d\=\d\|2[0-4]\d\|25[0-5]\)\>"
+endif
+
+if exists("pascal_no_tabs")
+ syn match pascalShowTab "\t"
+endif
+
+syn region pascalComment start="(\*\|{" end="\*)\|}" contains=pascalTodo,pascalSpaceError
+
+
+if !exists("pascal_no_functions")
+ " array functions
+ syn keyword pascalFunction pack unpack
+
+ " memory function
+ syn keyword pascalFunction Dispose New
+
+ " math functions
+ syn keyword pascalFunction Abs Arctan Cos Exp Ln Sin Sqr Sqrt
+
+ " file functions
+ syn keyword pascalFunction Eof Eoln Write Writeln
+ syn keyword pascalPredefined Input Output
+
+ if exists("pascal_traditional")
+ " These functions do not seem to be defined in Turbo Pascal
+ syn keyword pascalFunction Get Page Put
+ endif
+
+ " ordinal functions
+ syn keyword pascalFunction Odd Pred Succ
+
+ " transfert functions
+ syn keyword pascalFunction Chr Ord Round Trunc
+endif
+
+
+if !exists("pascal_traditional")
+
+ syn keyword pascalStatement constructor destructor implementation inherited
+ syn keyword pascalStatement interface unit uses
+ syn keyword pascalModifier absolute assembler external far forward inline
+ syn keyword pascalModifier interrupt near virtual
+ syn keyword pascalAccess private public strict
+ syn keyword pascalStruct object
+ syn keyword pascalOperator shl shr xor
+
+ syn region pascalPreProc start="(\*\$" end="\*)" contains=pascalTodo
+ syn region pascalPreProc start="{\$" end="}"
+
+ syn region pascalAsm matchgroup=pascalAsmKey start="\<asm\>" end="\<end\>" contains=pascalComment,pascalPreProc
+
+ syn keyword pascalType ShortInt LongInt Byte Word
+ syn keyword pascalType ByteBool WordBool LongBool
+ syn keyword pascalType Cardinal LongWord
+ syn keyword pascalType Single Double Extended Comp
+ syn keyword pascalType PChar
+
+ syn keyword pascalPredefined self
+
+ if !exists ("pascal_fpc")
+ syn keyword pascalPredefined Result
+ endif
+
+ if exists("pascal_fpc")
+ syn region pascalComment start="//" end="$" contains=pascalTodo,pascalSpaceError
+ syn keyword pascalStatement fail otherwise operator
+ syn keyword pascalDirective popstack
+ syn keyword pascalType ShortString AnsiString WideString
+ endif
+
+ if exists("pascal_gpc")
+ syn region pascalComment start="//" end="$" contains=pascalTodo,pascalSpaceError
+ syn keyword pascalType SmallInt
+ syn keyword pascalType AnsiChar
+ syn keyword pascalType PAnsiChar
+ endif
+
+ if exists("pascal_delphi")
+ syn region pascalComment start="//" end="$" contains=pascalTodo,pascalSpaceError
+ syn region pascalDocumentation start="///" end="$" contains=pascalTodo,pascalSpaceError
+ syn region pascalDocumentation start="{!" end="}" contains=pascalTodo,pascalSpaceError
+ syn keyword pascalType SmallInt Int64
+ syn keyword pascalType Real48 Currency
+ syn keyword pascalType AnsiChar WideChar
+ syn keyword pascalType ShortString AnsiString WideString
+ syn keyword pascalType PAnsiChar PWideChar
+ syn match pascalFloat "-\=\<\d\+\.\d\+[dD]-\=\d\+\>"
+ syn match pascalStringEscape contained "#[12][0-9]\=[0-9]\="
+ syn keyword pascalStruct class dispinterface
+ syn keyword pascalException try except raise at on finally
+ syn keyword pascalStatement out
+ syn keyword pascalStatement library package
+ syn keyword pascalStatement initialization finalization uses exports
+ syn keyword pascalStatement property out resourcestring threadvar
+ syn keyword pascalModifier contains
+ syn keyword pascalModifier overridden reintroduce abstract sealed
+ syn keyword pascalModifier override export dynamic name message
+ syn keyword pascalModifier dispid index stored default nodefault readonly
+ syn keyword pascalModifier writeonly implements overload requires resident
+ syn keyword pascalAccess protected published automated
+ syn keyword pascalDirective register pascal cvar cdecl stdcall safecall
+ syn keyword pascalOperator as is
+ endif
+
+ if exists("pascal_no_functions")
+ "syn keyword pascalModifier read write
+ "may confuse with Read and Write functions. Not easy to handle.
+ else
+ " control flow functions
+ syn keyword pascalFunction Break Continue Exit Halt RunError
+
+ " ordinal functions
+ syn keyword pascalFunction Dec Inc High Low
+
+ " math functions
+ syn keyword pascalFunction Frac Int Pi
+
+ " string functions
+ syn keyword pascalFunction Concat Copy Delete Insert Length Pos Str Val
+
+ " memory function
+ syn keyword pascalFunction FreeMem GetMem MaxAvail MemAvail
+
+ " pointer and address functions
+ syn keyword pascalFunction Addr Assigned CSeg DSeg Ofs Ptr Seg SPtr SSeg
+
+ " misc functions
+ syn keyword pascalFunction Exclude FillChar Hi Include Lo Move ParamCount
+ syn keyword pascalFunction ParamStr Random Randomize SizeOf Swap TypeOf
+ syn keyword pascalFunction UpCase
+
+ " predefined variables
+ syn keyword pascalPredefined ErrorAddr ExitCode ExitProc FileMode FreeList
+ syn keyword pascalPredefined FreeZero HeapEnd HeapError HeapOrg HeapPtr
+ syn keyword pascalPredefined InOutRes OvrCodeList OvrDebugPtr OvrDosHandle
+ syn keyword pascalPredefined OvrEmsHandle OvrHeapEnd OvrHeapOrg OvrHeapPtr
+ syn keyword pascalPredefined OvrHeapSize OvrLoadList PrefixSeg RandSeed
+ syn keyword pascalPredefined SaveInt00 SaveInt02 SaveInt1B SaveInt21
+ syn keyword pascalPredefined SaveInt23 SaveInt24 SaveInt34 SaveInt35
+ syn keyword pascalPredefined SaveInt36 SaveInt37 SaveInt38 SaveInt39
+ syn keyword pascalPredefined SaveInt3A SaveInt3B SaveInt3C SaveInt3D
+ syn keyword pascalPredefined SaveInt3E SaveInt3F SaveInt75 SegA000 SegB000
+ syn keyword pascalPredefined SegB800 SelectorInc StackLimit Test8087
+
+ " file functions
+ syn keyword pascalFunction Append Assign BlockRead BlockWrite ChDir Close
+ syn keyword pascalFunction Erase FilePos FileSize Flush GetDir IOResult
+ syn keyword pascalFunction MkDir Read Readln Rename Reset Rewrite RmDir
+ syn keyword pascalFunction Seek SeekEof SeekEoln SetTextBuf Truncate
+
+ " crt unit
+ syn keyword pascalFunction AssignCrt ClrEol ClrScr Delay DelLine GotoXY
+ syn keyword pascalFunction HighVideo InsLine KeyPressed LowVideo NormVideo
+ syn keyword pascalFunction NoSound ReadKey Sound TextBackground TextColor
+ syn keyword pascalFunction TextMode WhereX WhereY Window
+ syn keyword pascalPredefined CheckBreak CheckEOF CheckSnow DirectVideo
+ syn keyword pascalPredefined LastMode TextAttr WindMin WindMax
+ syn keyword pascalFunction BigCursor CursorOff CursorOn
+ syn keyword pascalConstant Black Blue Green Cyan Red Magenta Brown
+ syn keyword pascalConstant LightGray DarkGray LightBlue LightGreen
+ syn keyword pascalConstant LightCyan LightRed LightMagenta Yellow White
+ syn keyword pascalConstant Blink ScreenWidth ScreenHeight bw40
+ syn keyword pascalConstant co40 bw80 co80 mono
+ syn keyword pascalPredefined TextChar
+
+ " DOS unit
+ syn keyword pascalFunction AddDisk DiskFree DiskSize DosExitCode DosVersion
+ syn keyword pascalFunction EnvCount EnvStr Exec Expand FindClose FindFirst
+ syn keyword pascalFunction FindNext FSearch FSplit GetCBreak GetDate
+ syn keyword pascalFunction GetEnv GetFAttr GetFTime GetIntVec GetTime
+ syn keyword pascalFunction GetVerify Intr Keep MSDos PackTime SetCBreak
+ syn keyword pascalFunction SetDate SetFAttr SetFTime SetIntVec SetTime
+ syn keyword pascalFunction SetVerify SwapVectors UnPackTime
+ syn keyword pascalConstant FCarry FParity FAuxiliary FZero FSign FOverflow
+ syn keyword pascalConstant Hidden Sysfile VolumeId Directory Archive
+ syn keyword pascalConstant AnyFile fmClosed fmInput fmOutput fmInout
+ syn keyword pascalConstant TextRecNameLength TextRecBufSize
+ syn keyword pascalType ComStr PathStr DirStr NameStr ExtStr SearchRec
+ syn keyword pascalType FileRec TextBuf TextRec Registers DateTime
+ syn keyword pascalPredefined DosError
+
+ "Graph Unit
+ syn keyword pascalFunction Arc Bar Bar3D Circle ClearDevice ClearViewPort
+ syn keyword pascalFunction CloseGraph DetectGraph DrawPoly Ellipse
+ syn keyword pascalFunction FillEllipse FillPoly FloodFill GetArcCoords
+ syn keyword pascalFunction GetAspectRatio GetBkColor GetColor
+ syn keyword pascalFunction GetDefaultPalette GetDriverName GetFillPattern
+ syn keyword pascalFunction GetFillSettings GetGraphMode GetImage
+ syn keyword pascalFunction GetLineSettings GetMaxColor GetMaxMode GetMaxX
+ syn keyword pascalFunction GetMaxY GetModeName GetModeRange GetPalette
+ syn keyword pascalFunction GetPaletteSize GetPixel GetTextSettings
+ syn keyword pascalFunction GetViewSettings GetX GetY GraphDefaults
+ syn keyword pascalFunction GraphErrorMsg GraphResult ImageSize InitGraph
+ syn keyword pascalFunction InstallUserDriver InstallUserFont Line LineRel
+ syn keyword pascalFunction LineTo MoveRel MoveTo OutText OutTextXY
+ syn keyword pascalFunction PieSlice PutImage PutPixel Rectangle
+ syn keyword pascalFunction RegisterBGIDriver RegisterBGIFont
+ syn keyword pascalFunction RestoreCRTMode Sector SetActivePage
+ syn keyword pascalFunction SetAllPallette SetAspectRatio SetBkColor
+ syn keyword pascalFunction SetColor SetFillPattern SetFillStyle
+ syn keyword pascalFunction SetGraphBufSize SetGraphMode SetLineStyle
+ syn keyword pascalFunction SetPalette SetRGBPalette SetTextJustify
+ syn keyword pascalFunction SetTextStyle SetUserCharSize SetViewPort
+ syn keyword pascalFunction SetVisualPage SetWriteMode TextHeight TextWidth
+ syn keyword pascalType ArcCoordsType FillPatternType FillSettingsType
+ syn keyword pascalType LineSettingsType PaletteType PointType
+ syn keyword pascalType TextSettingsType ViewPortType
+
+ " string functions
+ syn keyword pascalFunction StrAlloc StrBufSize StrCat StrComp StrCopy
+ syn keyword pascalFunction StrDispose StrECopy StrEnd StrFmt StrIComp
+ syn keyword pascalFunction StrLCat StrLComp StrLCopy StrLen StrLFmt
+ syn keyword pascalFunction StrLIComp StrLower StrMove StrNew StrPas
+ syn keyword pascalFunction StrPCopy StrPLCopy StrPos StrRScan StrScan
+ syn keyword pascalFunction StrUpper
+ endif
+
+endif
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link pascalAccess pascalStatement
+hi def link pascalBoolean Boolean
+hi def link pascalComment Comment
+hi def link pascalDocumentation Comment
+hi def link pascalConditional Conditional
+hi def link pascalConstant Constant
+hi def link pascalControlCharacter Character
+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 pascalExtendedNumber Number
+hi def link pascalBinNumber pascalNumber
+hi def link pascalHexNumber pascalNumber
+hi def link pascalOctNumber pascalNumber
+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
+
+
+
+let b:current_syntax = "pascal"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/syntax/passwd.vim b/runtime/syntax/passwd.vim
new file mode 100644
index 0000000..ad90202
--- /dev/null
+++ b/runtime/syntax/passwd.vim
@@ -0,0 +1,71 @@
+" Vim syntax file
+" Language: passwd(5) password file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-10-03
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match passwdBegin display '^' nextgroup=passwdAccount
+
+syn match passwdAccount contained display '[^:]\+'
+ \ nextgroup=passwdPasswordColon
+
+syn match passwdPasswordColon contained display ':'
+ \ nextgroup=passwdPassword,passwdShadow
+
+syn match passwdPassword contained display '[^:]\+'
+ \ nextgroup=passwdUIDColon
+
+syn match passwdShadow contained display '[x*!]'
+ \ nextgroup=passwdUIDColon
+
+syn match passwdUIDColon contained display ':' nextgroup=passwdUID
+
+syn match passwdUID contained display '\d\{0,10}'
+ \ nextgroup=passwdGIDColon
+
+syn match passwdGIDColon contained display ':' nextgroup=passwdGID
+
+syn match passwdGID contained display '\d\{0,10}'
+ \ nextgroup=passwdGecosColon
+
+syn match passwdGecosColon contained display ':' nextgroup=passwdGecos
+
+syn match passwdGecos contained display '[^:]*'
+ \ nextgroup=passwdDirColon
+
+syn match passwdDirColon contained display ':' nextgroup=passwdDir
+
+syn match passwdDir contained display '/[^:]*'
+ \ nextgroup=passwdShellColon
+
+syn match passwdShellColon contained display ':'
+ \ nextgroup=passwdShell
+
+syn match passwdShell contained display '.*'
+
+hi def link passwdColon Normal
+hi def link passwdAccount Identifier
+hi def link passwdPasswordColon passwdColon
+hi def link passwdPassword Number
+hi def link passwdShadow Special
+hi def link passwdUIDColon passwdColon
+hi def link passwdUID Number
+hi def link passwdGIDColon passwdColon
+hi def link passwdGID Number
+hi def link passwdGecosColon passwdColon
+hi def link passwdGecos Comment
+hi def link passwdDirColon passwdColon
+hi def link passwdDir Type
+hi def link passwdShellColon passwdColon
+hi def link passwdShell Operator
+
+let b:current_syntax = "passwd"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/pbtxt.vim b/runtime/syntax/pbtxt.vim
new file mode 100644
index 0000000..92a7556
--- /dev/null
+++ b/runtime/syntax/pbtxt.vim
@@ -0,0 +1,44 @@
+" Vim syntax file
+" Language: Protobuf Text Format
+" Maintainer: Lakshay Garg <lakshayg@outlook.in>
+" Last Change: 2020 Nov 17
+" Homepage: https://github.com/lakshayg/vim-pbtxt
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case ignore
+
+syn keyword pbtxtTodo TODO FIXME contained
+syn keyword pbtxtBool true false contained
+
+syn match pbtxtInt display "\<\(0\|[1-9]\d*\)\>"
+syn match pbtxtHex display "\<0[xX]\x\+\>"
+syn match pbtxtFloat display "\(0\|[1-9]\d*\)\=\.\d*"
+syn match pbtxtMessage display "^\s*\w\+\s*{"me=e-1
+syn match pbtxtField display "^\s*\w\+:"me=e-1
+syn match pbtxtEnum display ":\s*\a\w\+"ms=s+1 contains=pbtxtBool
+syn region pbtxtString start=+"+ skip=+\\"+ end=+"+ contains=@Spell
+syn region pbtxtComment start="#" end="$" keepend contains=pbtxtTodo,@Spell
+
+hi def link pbtxtTodo Todo
+hi def link pbtxtBool Boolean
+hi def link pbtxtInt Number
+hi def link pbtxtHex Number
+hi def link pbtxtFloat Float
+hi def link pbtxtMessage Structure
+hi def link pbtxtField Identifier
+hi def link pbtxtEnum Define
+hi def link pbtxtString String
+hi def link pbtxtComment Comment
+
+let b:current_syntax = "pbtxt"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet
diff --git a/runtime/syntax/pcap.vim b/runtime/syntax/pcap.vim
new file mode 100644
index 0000000..e0eed63
--- /dev/null
+++ b/runtime/syntax/pcap.vim
@@ -0,0 +1,48 @@
+" Vim syntax file
+" Config file: printcap
+" Maintainer: Lennart Schultz <Lennart.Schultz@ecmwf.int> (defunct)
+" Modified by Bram
+" Last Change: 2003 May 11
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+"define keywords
+setlocal isk=@,46-57,_,-,#,=,192-255
+
+"first all the bad guys
+syn match pcapBad '^.\+$' "define any line as bad
+syn match pcapBadword '\k\+' contained "define any sequence of keywords as bad
+syn match pcapBadword ':' contained "define any single : as bad
+syn match pcapBadword '\\' contained "define any single \ as bad
+"then the good boys
+" Boolean keywords
+syn match pcapKeyword contained ':\(fo\|hl\|ic\|rs\|rw\|sb\|sc\|sf\|sh\)'
+" Numeric Keywords
+syn match pcapKeyword contained ':\(br\|du\|fc\|fs\|mx\|pc\|pl\|pw\|px\|py\|xc\|xs\)#\d\+'
+" String Keywords
+syn match pcapKeyword contained ':\(af\|cf\|df\|ff\|gf\|if\|lf\|lo\|lp\|nd\|nf\|of\|rf\|rg\|rm\|rp\|sd\|st\|tf\|tr\|vf\)=\k*'
+" allow continuation
+syn match pcapEnd ':\\$' contained
+"
+syn match pcapDefineLast '^\s.\+$' contains=pcapBadword,pcapKeyword
+syn match pcapDefine '^\s.\+$' contains=pcapBadword,pcapKeyword,pcapEnd
+syn match pcapHeader '^\k[^|]\+\(|\k[^|]\+\)*:\\$'
+syn match pcapComment "#.*$"
+
+syn sync minlines=50
+
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link pcapBad WarningMsg
+hi def link pcapBadword WarningMsg
+hi def link pcapComment Comment
+
+
+let b:current_syntax = "pcap"
+
+" vim: ts=8
diff --git a/runtime/syntax/pccts.vim b/runtime/syntax/pccts.vim
new file mode 100644
index 0000000..7800357
--- /dev/null
+++ b/runtime/syntax/pccts.vim
@@ -0,0 +1,89 @@
+" Vim syntax file
+" Language: PCCTS
+" Maintainer: Scott Bigham <dsb@killerbunnies.org>
+" Last Change: 10 Aug 1999
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the C++ syntax to start with
+syn include @cppTopLevel syntax/cpp.vim
+
+syn region pcctsAction matchgroup=pcctsDelim start="<<" end=">>?\=" contains=@cppTopLevel,pcctsRuleRef
+
+syn region pcctsArgBlock matchgroup=pcctsDelim start="\(>\s*\)\=\[" end="\]" contains=@cppTopLevel,pcctsRuleRef
+
+syn region pcctsString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=pcctsSpecialChar
+syn match pcctsSpecialChar "\\\\\|\\\"" contained
+
+syn region pcctsComment start="/\*" end="\*/" contains=cTodo
+syn match pcctsComment "//.*$" contains=cTodo
+
+syn region pcctsDirective start="^\s*#header\s\+<<" end=">>" contains=pcctsAction keepend
+syn match pcctsDirective "^\s*#parser\>.*$" contains=pcctsString,pcctsComment
+syn match pcctsDirective "^\s*#tokdefs\>.*$" contains=pcctsString,pcctsComment
+syn match pcctsDirective "^\s*#token\>.*$" contains=pcctsString,pcctsAction,pcctsTokenName,pcctsComment
+syn region pcctsDirective start="^\s*#tokclass\s\+[A-Z]\i*\s\+{" end="}" contains=pcctsString,pcctsTokenName
+syn match pcctsDirective "^\s*#lexclass\>.*$" contains=pcctsTokenName
+syn region pcctsDirective start="^\s*#errclass\s\+[^{]\+\s\+{" end="}" contains=pcctsString,pcctsTokenName
+syn match pcctsDirective "^\s*#pred\>.*$" contains=pcctsTokenName,pcctsAction
+
+syn cluster pcctsInRule contains=pcctsString,pcctsRuleName,pcctsTokenName,pcctsAction,pcctsArgBlock,pcctsSubRule,pcctsLabel,pcctsComment
+
+syn region pcctsRule start="\<[a-z][A-Za-z0-9_]*\>\(\s*\[[^]]*\]\)\=\(\s*>\s*\[[^]]*\]\)\=\s*:" end=";" contains=@pcctsInRule
+
+syn region pcctsSubRule matchgroup=pcctsDelim start="(" end=")\(+\|\*\|?\(\s*=>\)\=\)\=" contains=@pcctsInRule contained
+syn region pcctsSubRule matchgroup=pcctsDelim start="{" end="}" contains=@pcctsInRule contained
+
+syn match pcctsRuleName "\<[a-z]\i*\>" contained
+syn match pcctsTokenName "\<[A-Z]\i*\>" contained
+
+syn match pcctsLabel "\<\I\i*:\I\i*" contained contains=pcctsLabelHack,pcctsRuleName,pcctsTokenName
+syn match pcctsLabel "\<\I\i*:\"\([^\\]\|\\.\)*\"" contained contains=pcctsLabelHack,pcctsString
+syn match pcctsLabelHack "\<\I\i*:" contained
+
+syn match pcctsRuleRef "\$\I\i*\>" contained
+syn match pcctsRuleRef "\$\d\+\(\.\d\+\)\>" contained
+
+syn keyword pcctsClass class nextgroup=pcctsClassName skipwhite
+syn match pcctsClassName "\<\I\i*\>" contained nextgroup=pcctsClassBlock skipwhite skipnl
+syn region pcctsClassBlock start="{" end="}" contained contains=pcctsRule,pcctsComment,pcctsDirective,pcctsAction,pcctsException,pcctsExceptionHandler
+
+syn keyword pcctsException exception nextgroup=pcctsExceptionRuleRef skipwhite
+syn match pcctsExceptionRuleRef "\[\I\i*\]" contained contains=pcctsExceptionID
+syn match pcctsExceptionID "\I\i*" contained
+syn keyword pcctsExceptionHandler catch default
+syn keyword pcctsExceptionHandler NoViableAlt NoSemViableAlt
+syn keyword pcctsExceptionHandler MismatchedToken
+
+syn sync clear
+syn sync match pcctsSyncAction grouphere pcctsAction "<<"
+syn sync match pcctsSyncAction "<<\([^>]\|>[^>]\)*>>"
+syn sync match pcctsSyncRule grouphere pcctsRule "\<[a-z][A-Za-z0-9_]*\>\s*\[[^]]*\]\s*:"
+syn sync match pcctsSyncRule grouphere pcctsRule "\<[a-z][A-Za-z0-9_]*\>\(\s*\[[^]]*\]\)\=\s*>\s*\[[^]]*\]\s*:"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/pdf.vim b/runtime/syntax/pdf.vim
new file mode 100644
index 0000000..86d80da
--- /dev/null
+++ b/runtime/syntax/pdf.vim
@@ -0,0 +1,73 @@
+" Vim syntax file
+" Language: PDF
+" Maintainer: Tim Pope <vimNOSPAM@tpope.info>
+" Last Change: 2007 Dec 16
+
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'pdf'
+endif
+
+syn include @pdfXML syntax/xml.vim
+
+syn case match
+
+syn cluster pdfObjects contains=pdfBoolean,pdfConstant,pdfNumber,pdfFloat,pdfName,pdfHexString,pdfString,pdfArray,pdfHash,pdfReference,pdfComment
+syn keyword pdfBoolean true false contained
+syn keyword pdfConstant null contained
+syn match pdfNumber "[+-]\=\<\d\+\>"
+syn match pdfFloat "[+-]\=\<\%(\d\+\.\|\d*\.\d\+\)\>" contained
+
+syn match pdfNameError "#\X\|#\x\X\|#00" contained containedin=pdfName
+syn match pdfSpecialChar "#\x\x" contained containedin=pdfName
+syn match pdfName "/[^[:space:]\[\](){}<>/]*" contained
+syn match pdfHexError "[^[:space:][:xdigit:]<>]" contained
+"syn match pdfHexString "<\s*\x[^<>]*\x\s*>" contained contains=pdfHexError
+"syn match pdfHexString "<\s*\x\=\s*>" contained
+syn region pdfHexString matchgroup=pdfDelimiter start="<<\@!" end=">" contained contains=pdfHexError
+syn match pdfStringError "\\." contained containedin=pdfString
+syn match pdfSpecialChar "\\\%(\o\{1,3\}\|[nrtbf()\\]\)" contained containedin=pdfString
+syn region pdfString matchgroup=pdfDelimiter start="\\\@<!(" end="\\\@<!)" contains=pdfString
+
+syn region pdfArray matchgroup=pdfOperator start="\[" end="\]" contains=@pdfObjects contained
+syn region pdfHash matchgroup=pdfOperator start="<<" end=">>" contains=@pdfObjects contained
+syn match pdfReference "\<\d\+\s\+\d\+\s\+R\>"
+"syn keyword pdfOperator R contained containedin=pdfReference
+
+syn region pdfObject matchgroup=pdfType start="\<obj\>" end="\<endobj\>" contains=@pdfObjects
+syn region pdfObject matchgroup=pdfType start="\<obj\r\=\n" end="\<endobj\>" contains=@pdfObjects fold
+
+" Do these twice. The ones with only newlines are foldable
+syn region pdfStream matchgroup=pdfType start="\<stream\r\=\n" end="endstream\s*\%(\r\|\n\|\r\n\)" contained containedin=pdfObject
+syn region pdfXMLStream matchgroup=pdfType start="\<stream\r\=\n\_s*\%(<?\)\@=" end="endstream\s*\%(\r\|\n\|\r\n\)" contained containedin=pdfObject contains=@pdfXML
+syn region pdfStream matchgroup=pdfType start="\<stream\n" end="endstream\s*\%(\r\|\n\|\r\n\)" contained containedin=pdfObject fold
+syn region pdfXMLStream matchgroup=pdfType start="\<stream\n\_s*\%(<?\)\@=" end="endstream\s*\%(\r\|\n\|\r\n\)" contained containedin=pdfObject contains=@pdfXML fold
+
+syn region pdfPreProc start="\<xref\%(\r\|\n\|\r\n\)" end="^trailer\%(\r\|\n\|\r\n\)" skipwhite skipempty nextgroup=pdfHash contains=pdfNumber fold
+syn keyword pdfPreProc startxref
+syn match pdfComment "%.*\%(\r\|\n\)" contains=pdfPreProc
+syn match pdfPreProc "^%\%(%EOF\|PDF-\d\.\d\)\(\r\|\n\)"
+
+hi def link pdfOperator Operator
+hi def link pdfNumber Number
+hi def link pdfFloat Float
+hi def link pdfBoolean Boolean
+hi def link pdfConstant Constant
+hi def link pdfName Identifier
+hi def link pdfNameError pdfStringError
+hi def link pdfHexString pdfString
+hi def link pdfHexError pdfStringError
+hi def link pdfString String
+hi def link pdfStringError Error
+hi def link pdfSpecialChar SpecialChar
+hi def link pdfDelimiter Delimiter
+hi def link pdfType Type
+hi def link pdfReference Tag
+hi def link pdfStream NonText
+hi def link pdfPreProc PreProc
+hi def link pdfComment Comment
+
+let b:current_syntax = "pdf"
diff --git a/runtime/syntax/perl.vim b/runtime/syntax/perl.vim
new file mode 100644
index 0000000..73f967a
--- /dev/null
+++ b/runtime/syntax/perl.vim
@@ -0,0 +1,662 @@
+" Vim syntax file
+" Language: Perl
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2022 Jun 13
+" Contributors: Andy Lester <andy@petdance.com>
+" Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
+" Lukas Mai <l.mai.web.de>
+" Nick Hibma <nick@van-laarhoven.org>
+" Sonia Heimann <niania@netsurf.org>
+" Rob Hoelz <rob@hoelz.ro>
+" Doug Kearns <dougkearns@gmail.com>
+" and many others.
+"
+" Please download the most recent version first, before mailing
+" any comments.
+"
+" The following parameters are available for tuning the
+" perl syntax highlighting, with defaults given:
+"
+" let perl_include_pod = 1
+" unlet perl_no_scope_in_variables
+" unlet perl_no_extended_vars
+" unlet perl_string_as_statement
+" unlet perl_no_sync_on_sub
+" unlet perl_no_sync_on_global_var
+" let perl_sync_dist = 100
+" unlet perl_fold
+" unlet perl_fold_blocks
+" unlet perl_nofold_packages
+" unlet perl_nofold_subs
+" unlet perl_fold_anonymous_subs
+" unlet perl_no_subprototype_error
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" POD starts with ^=<word> and ends with ^=cut
+
+if get(g:, 'perl_include_pod', 1)
+ " Include a while extra syntax file
+ syn include @Pod syntax/pod.vim
+ unlet b:current_syntax
+ if get(g:, 'perl_fold', 1)
+ syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend fold extend
+ syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend fold extend
+ else
+ syn region perlPOD start="^=[a-z]" end="^=cut" contains=@Pod,@Spell,perlTodo keepend
+ syn region perlPOD start="^=cut" end="^=cut" contains=perlTodo keepend
+ endif
+else
+ " Use only the bare minimum of rules
+ if get(g:, 'perl_fold', 1)
+ syn region perlPOD start="^=[a-z]" end="^=cut" fold
+ else
+ syn region perlPOD start="^=[a-z]" end="^=cut"
+ endif
+endif
+
+
+syn cluster perlTop contains=TOP
+
+syn region perlBraces start="{" end="}" transparent extend
+
+" All keywords
+"
+syn match perlConditional "\<\%(if\|elsif\|unless\|given\|when\|default\)\>"
+syn match perlConditional "\<else\%(\%(\_s\*if\>\)\|\>\)" contains=perlElseIfError skipwhite skipnl skipempty
+syn match perlRepeat "\<\%(while\|for\%(each\)\=\|do\|until\|continue\)\>"
+syn match perlOperator "\<\%(defined\|undef\|eq\|ne\|[gl][et]\|cmp\|not\|and\|or\|xor\|not\|bless\|ref\|do\)\>"
+" for some reason, adding this as the nextgroup for perlControl fixes BEGIN
+" folding issues...
+syn match perlFakeGroup "" contained
+syn match perlControl "\<\%(BEGIN\|CHECK\|INIT\|END\|UNITCHECK\)\>\_s*" nextgroup=perlFakeGroup
+
+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\|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\)\>"
+syn match perlStatementHash "\<\%(delete\|each\|exists\|keys\|values\)\>"
+syn match perlStatementIOfunc "\<\%(syscall\|dbmopen\|dbmclose\)\>"
+syn match perlStatementFiledesc "\<\%(binmode\|close\%(dir\)\=\|eof\|fileno\|getc\|lstat\|printf\=\|read\%(dir\|line\|pipe\)\|rewinddir\|say\|select\|stat\|tell\%(dir\)\=\|write\)\>" nextgroup=perlFiledescStatementNocomma skipwhite
+syn match perlStatementFiledesc "\<\%(fcntl\|flock\|ioctl\|open\%(dir\)\=\|read\|seek\%(dir\)\=\|sys\%(open\|read\|seek\|write\)\|truncate\)\>" nextgroup=perlFiledescStatementComma skipwhite
+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\|evalbytes\)\>"
+syn match perlStatementInclude "\<\%(require\|import\|unimport\)\>"
+syn match perlStatementInclude "\<\%(use\|no\)\s\+\%(\%(attributes\|attrs\|autodie\%(::\%(exception\%(::system\)\=\|hints\|skip\)\)\=\|autouse\|parent\|base\|big\%(int\|num\|rat\)\|blib\|bytes\|charnames\|constant\|deprecate\|diagnostics\|encoding\%(::warnings\)\=\|experimental\|feature\|fields\|filetest\|if\|integer\|less\|lib\|locale\|mro\|ok\|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\)\)\>"
+syn match perlStatementNetwork "\<\%(\%(end\|[gs]et\)\%(host\|net\|proto\|serv\)ent\|get\%(\%(host\|net\)by\%(addr\|name\)\|protoby\%(name\|number\)\|servby\%(name\|port\)\)\)\>"
+syn match perlStatementPword "\<\%(get\%(pw\%(uid\|nam\)\|gr\%(gid\|nam\)\|login\)\)\|\%(end\|[gs]et\)\%(pw\|gr\)ent\>"
+syn match perlStatementTime "\<\%(gmtime\|localtime\|time\)\>"
+
+syn match perlStatementMisc "\<\%(warn\|format\|formline\|reset\|scalar\|prototype\|lock\|tied\=\|untie\)\>"
+
+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="}" transparent extend
+
+syn match perlLabel "^\s*\h\w*\s*::\@!\%(\<v\d\+\s*:\)\@<!"
+
+" Perl Identifiers.
+"
+" Should be cleaned up to better handle identifiers in particular situations
+" (in hash keys for example)
+"
+" Plain identifiers: $foo, @foo, $#foo, %foo, &foo and dereferences $$foo, @$foo, etc.
+" We do not process complex things such as @{${"foo"}}. Too complicated, and
+" too slow. And what is after the -> is *not* considered as part of the
+" variable - there again, too complicated and too slow.
+
+" Special variables first ($^A, ...) and ($|, $', ...)
+syn match perlVarPlain "$^[ACDEFHILMNOPRSTVWX]\="
+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 "$::\@!"
+" These variables are not recognized within matches.
+syn match perlVarNotInMatches "$[|)]"
+" This variable is not recognized within matches delimited by m//.
+syn match perlVarSlash "$/"
+
+" And plain identifiers
+syn match perlPackageRef "[$@#%*&]\%(\%(::\|'\)\=\I\i*\%(\%(::\|'\)\I\i*\)*\)\=\%(::\|'\)\I"ms=s+1,me=e-1 contained
+
+" To not highlight packages in variables as a scope reference - i.e. in
+" $pack::var, pack:: is a scope, just set "perl_no_scope_in_variables"
+" If you don't want complex things like @{${"foo"}} to be processed,
+" just set the variable "perl_no_extended_vars"...
+
+if !get(g:, 'perl_no_scope_in_variables', 0)
+ syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
+ syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
+ syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" contains=perlPackageRef nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
+else
+ syn match perlVarPlain "\%([@$]\|\$#\)\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
+ syn match perlVarPlain2 "%\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
+ syn match perlFunctionName "&\$*\%(\I\i*\)\=\%(\%(::\|'\)\I\i*\)*\%(::\|\i\@<=\)" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref
+endif
+
+syn match perlVarPlain2 "%[-+]"
+
+if !get(g:, 'perl_no_extended_vars', 0)
+ syn cluster perlExpr contains=perlStatementIndirObjWrap,perlStatementScalar,perlStatementRegexp,perlStatementNumeric,perlStatementList,perlStatementHash,perlStatementFiles,perlStatementTime,perlStatementMisc,perlVarPlain,perlVarPlain2,perlVarNotInMatches,perlVarSlash,perlVarBlock,perlVarBlock2,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQ,perlQQ,perlQW,perlQR,perlArrow,perlBraces
+ syn region perlArrow matchgroup=perlArrow start="->\s*(" end=")" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
+ syn region perlArrow matchgroup=perlArrow start="->\s*\[" end="\]" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
+ syn region perlArrow matchgroup=perlArrow start="->\s*{" end="}" contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
+ syn match perlArrow "->\s*{\s*\I\i*\s*}" contains=perlVarSimpleMemberName nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref contained
+ syn region perlVarBlock matchgroup=perlVarPlain start="\%($#\|[$@]\)\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
+ syn region perlVarBlock2 matchgroup=perlVarPlain start="[%&*]\$*{" skip="\\}" end=+}\|\%(\%(<<\%('\|"\)\?\)\@=\)+ contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
+ syn match perlVarPlain2 "[%&*]\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
+ syn match perlVarPlain "\%(\$#\|[@$]\)\$*{\I\i*}" nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
+ syn region perlVarMember matchgroup=perlVarPlain start="\%(->\)\={" skip="\\}" end="}" contained contains=@perlExpr nextgroup=perlVarMember,perlVarSimpleMember,perlPostDeref extend
+ syn match perlVarSimpleMember "\%(->\)\={\s*\I\i*\s*}" nextgroup=perlVarMember,perlVarSimpleMember,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,perlPostDeref extend
+ syn match perlPackageConst "__PACKAGE__" nextgroup=perlPostDeref
+ syn match perlPostDeref "->\%($#\|[$@%&*]\)\*" contained nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref
+ syn region perlPostDeref start="->\%($#\|[$@%&*]\)\[" skip="\\]" end="]" contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,perlPostDeref
+ syn region perlPostDeref matchgroup=perlPostDeref start="->\%($#\|[$@%&*]\){" skip="\\}" end="}" keepend extend contained contains=@perlExpr nextgroup=perlVarSimpleMember,perlVarMember,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 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
+syn match perlSpecialStringU2 "\\." extend contained contains=NONE
+syn match perlSpecialStringU "\\\\" contained
+syn match perlSpecialMatch "\\[1-9]" contained extend
+syn match perlSpecialMatch "\\g\%(\d\+\|{\%(-\=\d\+\|\h\w*\)}\)" contained
+syn match perlSpecialMatch "\\k\%(<\h\w*>\|'\h\w*'\)" contained
+syn match perlSpecialMatch "{\d\+\%(,\%(\d\+\)\=\)\=}" contained
+syn match perlSpecialMatch "\[[]-]\=[^\[\]]*[]-]\=\]" contained extend
+syn match perlSpecialMatch "[+*()?.]" contained
+syn match perlSpecialMatch "(?[#:=!]" contained
+syn match perlSpecialMatch "(?[impsx]*\%(-[imsx]\+\)\=)" contained
+syn match perlSpecialMatch "(?\%([-+]\=\d\+\|R\))" contained
+syn match perlSpecialMatch "(?\%(&\|P[>=]\)\h\w*)" contained
+syn match perlSpecialMatch "(\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\=\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\=\|ACCEPT\))" contained
+
+" Possible errors
+"
+" Highlight lines with only whitespace (only in blank delimited here documents) as errors
+syn match perlNotEmptyLine "^\s\+$" contained
+" Highlight "} else if (...) {", it should be "} else { if (...) { " or "} elsif (...) {"
+syn match perlElseIfError "else\_s*if" containedin=perlConditional
+syn keyword perlElseIfError elseif containedin=perlConditional
+
+" Variable interpolation
+"
+" These items are interpolated inside "" strings and similar constructs.
+syn cluster perlInterpDQ contains=perlSpecialString,perlVarPlain,perlVarNotInMatches,perlVarSlash,perlVarBlock
+" These items are interpolated inside '' strings and similar constructs.
+syn cluster perlInterpSQ contains=perlSpecialStringU,perlSpecialStringU2
+" These items are interpolated inside m// matches and s/// substitutions.
+syn cluster perlInterpSlash contains=perlSpecialString,perlSpecialMatch,perlVarPlain,perlVarBlock
+" These items are interpolated inside m## matches and s### substitutions.
+syn cluster perlInterpMatch contains=@perlInterpSlash,perlVarSlash
+
+" Shell commands
+syn region perlShellCommand matchgroup=perlMatchStartEnd start="`" end="`" contains=@perlInterpDQ keepend
+
+" Constants
+"
+" Numbers
+syn case ignore
+syn match perlNumber "\<\%(0\|[1-9]\%(_\=\d\)*\)\>"
+syn match perlNumber "\<0\%(x\x\%(_\=\x\)*\|b[01]\%(_\=[01]\)*\|o\=\%(_\=\o\)*\)\>"
+syn match perlFloat "\<\d\%(_\=\d\)*e[-+]\=\d\%(_\=\d\)*"
+syn match perlFloat "\<\d\%(_\=\d\)*\.\%(\d\%(_\=\d\)*\)\=\%(e[-+]\=\d\%(_\=\d\)*\)\="
+syn match perlFloat "\.\d\%(_\=\d\)*\%(e[-+]\=\d\%(_\=\d\)*\)\="
+syn match perlFloat "\<0x\x\%(_\=\x\)*p[-+]\=\d\%(_\=\d\)*"
+syn match perlFloat "\<0x\x\%(_\=\x\)*\.\%(\x\%(_\=\x\)*\)\=\%(p[-+]\=\d\%(_\=\d\)*\)\="
+syn match perlFloat "\<0x\.\x\%(_\=\x\)*\%(p[-+]\=\d\%(_\=\d\)*\)\="
+syn case match
+
+syn match perlString "\<\%(v\d\+\%(\.\d\+\)*\|\d\+\%(\.\d\+\)\{2,}\)\>" contains=perlVStringV
+syn match perlVStringV "\<v" contained
+
+
+syn region perlParensSQ start=+(+ end=+)+ extend contained contains=perlParensSQ,@perlInterpSQ keepend
+syn region perlBracketsSQ start=+\[+ end=+\]+ extend contained contains=perlBracketsSQ,@perlInterpSQ keepend
+syn region perlBracesSQ start=+{+ end=+}+ extend contained contains=perlBracesSQ,@perlInterpSQ keepend
+syn region perlAnglesSQ start=+<+ end=+>+ extend contained contains=perlAnglesSQ,@perlInterpSQ keepend
+
+syn region perlParensDQ start=+(+ end=+)+ extend contained contains=perlParensDQ,@perlInterpDQ keepend
+syn region perlBracketsDQ start=+\[+ end=+\]+ extend contained contains=perlBracketsDQ,@perlInterpDQ keepend
+syn region perlBracesDQ start=+{+ end=+}+ extend contained contains=perlBracesDQ,@perlInterpDQ keepend
+syn region perlAnglesDQ start=+<+ end=+>+ extend contained contains=perlAnglesDQ,@perlInterpDQ keepend
+
+
+" Simple version of searches and matches
+syn match perlMatchModifiers "[msixpadluncgo]\+" contained
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+ contains=@perlInterpMatch keepend extend nextgroup=perlMatchModifiers
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m#+ end=+#+ contains=@perlInterpMatch keepend extend nextgroup=perlMatchModifiers
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*'+ end=+'+ contains=@perlInterpSQ keepend extend nextgroup=perlMatchModifiers
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*/+ end=+/+ contains=@perlInterpSlash keepend extend nextgroup=perlMatchModifiers
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ keepend extend nextgroup=perlMatchModifiers
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ extend nextgroup=perlMatchModifiers
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ keepend extend nextgroup=perlMatchModifiers
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!m\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ keepend extend nextgroup=perlMatchModifiers
+
+" 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=+/+ contains=@perlInterpSlash extend nextgroup=perlMatchModifiers
+
+
+" Substitutions
+" perlMatch is the first part, perlSubstitution* is the substitution part
+syn match perlSubstitutionModifiers "[msixpadluncgero]\+" contained
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\>\s*\z([^[:space:]'([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*'+ end=+'+me=e-1 contains=@perlInterpSQ nextgroup=perlSubstitutionSQ keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*/+ end=+/+me=e-1 contains=@perlInterpSlash nextgroup=perlSubstitutionGQQ keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s#+ end=+#+me=e-1 contains=@perlInterpMatch nextgroup=perlSubstitutionGQQ keepend extend
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!s\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ nextgroup=perlSubstitutionGQQ skipwhite skipempty skipnl keepend extend
+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+ keepend contained contains=@perlInterpDQ extend nextgroup=perlSubstitutionModifiers
+syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+(+ end=+)+ contained contains=@perlInterpDQ,perlParensDQ keepend extend nextgroup=perlSubstitutionModifiers
+syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+\[+ end=+\]+ contained contains=@perlInterpDQ,perlBracketsDQ keepend extend nextgroup=perlSubstitutionModifiers
+syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+{+ end=+}+ contained contains=@perlInterpDQ,perlBracesDQ keepend extend extend nextgroup=perlSubstitutionModifiers
+syn region perlSubstitutionGQQ matchgroup=perlMatchStartEnd start=+<+ end=+>+ contained contains=@perlInterpDQ,perlAnglesDQ keepend extend nextgroup=perlSubstitutionModifiers
+syn region perlSubstitutionSQ matchgroup=perlMatchStartEnd start=+'+ end=+'+ contained contains=@perlInterpSQ keepend extend nextgroup=perlSubstitutionModifiers
+
+" Translations
+" perlMatch is the first part, perlTranslation* is the second, translator part.
+syn match perlTranslationModifiers "[cdsr]\+" contained
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\>\s*\z([^[:space:]([{<#]\)+ end=+\z1+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)#+ end=+#+me=e-1 contains=@perlInterpSQ nextgroup=perlTranslationGQ
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
+syn region perlMatch matchgroup=perlMatchStartEnd start=+\<\%(::\|'\|->\)\@<!\%(tr\|y\)\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ nextgroup=perlTranslationGQ skipwhite skipempty skipnl
+syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+\z([^[:space:]([{<]\)+ end=+\z1+ contained nextgroup=perlTranslationModifiers
+syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+(+ end=+)+ contains=perlParensSQ contained nextgroup=perlTranslationModifiers
+syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+\[+ end=+\]+ contains=perlBracketsSQ contained nextgroup=perlTranslationModifiers
+syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+{+ end=+}+ contains=perlBracesSQ contained nextgroup=perlTranslationModifiers
+syn region perlTranslationGQ matchgroup=perlMatchStartEnd start=+<+ end=+>+ contains=perlAnglesSQ contained nextgroup=perlTranslationModifiers
+
+
+" Strings and q, qq, qw and qr expressions
+
+syn region perlStringUnexpanded matchgroup=perlStringStartEnd start="'" end="'" contains=@perlInterpSQ keepend extend
+syn region perlString matchgroup=perlStringStartEnd start=+"+ end=+"+ contains=@perlInterpDQ keepend extend
+syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend
+syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q#+ end=+#+ contains=@perlInterpSQ keepend extend
+syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
+syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
+syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
+syn region perlQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
+
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\>\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpDQ keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]#+ end=+#+ contains=@perlInterpDQ keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*(+ end=+)+ contains=@perlInterpDQ,perlParensDQ keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*\[+ end=+\]+ contains=@perlInterpDQ,perlBracketsDQ keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*{+ end=+}+ contains=@perlInterpDQ,perlBracesDQ keepend extend
+syn region perlQQ matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!q[qx]\s*<+ end=+>+ contains=@perlInterpDQ,perlAnglesDQ keepend extend
+
+syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\z([^[:space:]#([{<]\)+ end=+\z1+ contains=@perlInterpSQ keepend extend
+syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw#+ end=+#+ contains=@perlInterpSQ keepend extend
+syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*(+ end=+)+ contains=@perlInterpSQ,perlParensSQ keepend extend
+syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*\[+ end=+\]+ contains=@perlInterpSQ,perlBracketsSQ keepend extend
+syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*{+ end=+}+ contains=@perlInterpSQ,perlBracesSQ keepend extend
+syn region perlQW matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qw\s*<+ end=+>+ contains=@perlInterpSQ,perlAnglesSQ keepend extend
+
+syn match perlQRModifiers "[msixpadluno]\+" contained
+syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\>\s*\z([^[:space:]#([{<'/]\)+ end=+\z1+ contains=@perlInterpMatch keepend extend nextgroup=perlQRModifiers
+syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*/+ end=+/+ contains=@perlInterpSlash keepend extend nextgroup=perlQRModifiers
+syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr#+ end=+#+ contains=@perlInterpMatch keepend extend nextgroup=perlQRModifiers
+syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*'+ end=+'+ contains=@perlInterpSQ keepend extend nextgroup=perlQRModifiers
+syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*(+ end=+)+ contains=@perlInterpMatch,perlParensDQ keepend extend nextgroup=perlQRModifiers
+
+" A special case for qr{}, qr<> and qr[] which allows for comments and extra whitespace in the pattern
+syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*{+ end=+}+ contains=@perlInterpMatch,perlBracesDQ,perlComment keepend extend nextgroup=perlQRModifiers
+syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*<+ end=+>+ contains=@perlInterpMatch,perlAnglesDQ,perlComment keepend extend nextgroup=perlQRModifiers
+syn region perlQR matchgroup=perlStringStartEnd start=+\<\%(::\|'\|->\)\@<!qr\s*\[+ end=+\]+ contains=@perlInterpMatch,perlBracketsDQ,perlComment keepend extend nextgroup=perlQRModifiers
+
+" 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.
+" XXX Indented heredocs are not perfect - they sometimes seem to take a moment
+" to update if switched from double to single quotes and vice versa.
+"
+" Note: bare delimiters such as << to mean <<"" are not supported. These are a
+" fatal error since 5.28 and, apparently, a rarely used feature.
+
+syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\I\i*+ end=+$+ contains=@perlTop oneline
+syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\\\I\i*+ 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
+syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*`[^\\`]*\%(\\.[^\\`]*\)*`+ 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
+syn region perlHereDocStart matchgroup=perlStringStartEnd start=+<<\~\=\s*``+ end=+$+ contains=@perlTop oneline
+
+if get(g:, 'perl_fold', 0)
+ syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ fold extend
+ syn region perlHereDoc start=+<<\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ 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*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ 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 perlHereDoc start=+<<\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
+else
+ syn region perlHereDoc start=+<<\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
+ syn region perlHereDoc start=+<<\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpSQ
+ 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*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\z1$+ contains=perlHereDocStart,@perlInterpDQ
+ 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 perlHereDoc start=+<<\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
+endif
+
+if get(g:, 'perl_fold', 0)
+ syn region perlIndentedHereDoc start=+<<\~\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend
+ syn region perlIndentedHereDoc start=+<<\~\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpSQ fold extend
+ syn region perlIndentedHereDoc start=+<<\~\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend
+ syn region perlIndentedHereDoc start=+<<\~\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpSQ fold extend
+ syn region perlIndentedHereDoc start=+<<\~\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlIndentedHereDocStart,@perlInterpDQ fold extend
+ syn region perlIndentedHereDoc start=+<<\~\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
+ syn region perlIndentedHereDoc start=+<<\~\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpSQ,perlNotEmptyLine fold extend
+ syn region perlIndentedHereDoc start=+<<\~\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlIndentedHereDocStart,@perlInterpDQ,perlNotEmptyLine fold extend
+else
+ syn region perlIndentedHereDoc start=+<<\~\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ
+ syn region perlIndentedHereDoc start=+<<\~\\\z(\I\i*\)+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpSQ
+ syn region perlIndentedHereDoc start=+<<\~\s*"\z([^\\"]*\%(\\.[^\\"]*\)*\)"+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ
+ syn region perlIndentedHereDoc start=+<<\~\s*'\z([^\\']*\%(\\.[^\\']*\)*\)'+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpSQ
+ syn region perlIndentedHereDoc start=+<<\~\s*`\z([^\\`]*\%(\\.[^\\`]*\)*\)`+ matchgroup=perlStringStartEnd end=+^\s*\z1$+ contains=perlHereDocStart,@perlInterpDQ
+ syn region perlIndentedHereDoc start=+<<\~\s*""+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
+ syn region perlIndentedHereDoc start=+<<\~\s*''+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpSQ,perlNotEmptyLine
+ syn region perlIndentedHereDoc start=+<<\~\s*``+ matchgroup=perlStringStartEnd end=+^$+ contains=perlHereDocStart,@perlInterpDQ,perlNotEmptyLine
+endif
+
+
+" Class declarations
+"
+syn match perlPackageDecl "\<package\s\+\%(\h\|::\)\%(\w\|::\)*" contains=perlStatementPackage
+syn keyword perlStatementPackage package contained
+
+" Functions
+if get(g:, "perl_sub_signatures", 0)
+ syn match perlSubSignature "\s*([^)]*)" contained extend
+else
+ syn match perlSubPrototype "\s*([\\$@%&*\[\];]*)" contained extend
+endif
+syn match perlSubAttribute "\s*:\s*\h\w*\%(([^)]*)\|\)" contained extend
+syn match perlSubName "\%(\h\|::\|'\w\)\%(\w\|::\|'\w\)*\s*" contained extend
+syn region perlSubDeclaration start="" end="[;{]" contains=perlSubName,perlSubPrototype,perlSubAttribute,perlSubSignature,perlComment contained transparent
+syn match perlFunction "\<sub\>\_s*" nextgroup=perlSubDeclaration
+
+" The => operator forces a bareword to the left of it to be interpreted as
+" a string
+syn match perlString "\I\@<!-\?\I\i*\%(\s*=>\)\@="
+
+" All other # are comments, except ^#!
+syn match perlComment "#.*" contains=perlTodo,@Spell extend
+syn match perlSharpBang "^#!.*"
+
+" Formats
+syn region perlFormat matchgroup=perlStatementIOFunc start="^\s*\<format\s\+\k\+\s*=\s*$"rs=s+6 end="^\s*\.\s*$" contains=perlFormatName,perlFormatField,perlVarPlain,perlVarPlain2
+syn match perlFormatName "format\s\+\k\+\s*="lc=7,me=e-1 contained
+syn match perlFormatField "[@^][|<>~]\+\%(\.\.\.\)\=" contained
+syn match perlFormatField "[@^]#[#.]*" contained
+syn match perlFormatField "@\*" contained
+syn match perlFormatField "@[^A-Za-z_|<>~#*]"me=e-1 contained
+syn match perlFormatField "@$" contained
+
+" __END__ and __DATA__ clauses
+
+" Vim excludes empty syn-region end lines from the fold region. This is
+" probably a bug and means a DATA section ending with an empty line does not
+" have that final line included in the fold.
+"
+" As a workaround we exploit an unterminated syntax region here with an end
+" pattern that will (probably) never match. This forces all lines to be
+" included in the fold region. Of course, if it does match then there's
+" nothing to work around as it is a non-empty line.
+"
+" This problem also exists with empty string delimited heredocs but there's no
+" known workaround for that case.
+if get(g:, 'perl_fold', 0)
+ syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="VIM_PERL_EOF\%$" contains=@perlDATA fold
+ syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="VIM_PERL_EOF\%$" contains=@perlDATA fold
+else
+ syntax region perlDATA matchgroup=perlDATAStart start="^__DATA__$" end="\%$" contains=@perlDATA
+ syntax region perlEND matchgroup=perlENDStart start="^__END__$" end="\%$" contains=@perlDATA
+endif
+
+" TODO: generalise this to allow other filetypes
+if get(g:, 'perl_highlight_data', 0)
+ syn cluster perlDATA add=perlPOD
+else
+ syn cluster perlDATA remove=perlPOD
+endif
+
+"
+" Folding
+if get(g:, 'perl_fold', 0)
+ " Note: this bit must come before the actual highlighting of the "package"
+ " keyword, otherwise this will screw up Pod lines that match /^package/
+ if !get(g:, 'perl_nofold_packages', 0)
+ syn region perlPackageFold start="^package \S\+;\s*\%(#.*\)\=$" end="^1;\=\s*\%(#.*\)\=$" end="\n\+package"me=s-1 transparent fold keepend
+ syn region perlPackageFold start="^\z(\s*\)package\s*\S\+\s*{" end="^\z1}" transparent fold keepend
+ endif
+ if !get(g:, 'perl_nofold_subs', 0)
+ if get(g:, "perl_fold_anonymous_subs", 0)
+ " EXPLANATION:
+ " \<sub\> - "sub" keyword
+ " \_[^;{]* - any characters, including new line, but not ";" or "{", zero or more times
+ " \%(([\\$@%&*\[\];]*)\)\= - prototype definition, \$@%&*[]; characters between (), zero or 1 times
+ " \_[^;]* - any characters, including new line, but not ";" or "{", zero or more times
+ " { - start subroutine block
+ syn region perlSubFold start="\<sub\>\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;{]*{" end="}" transparent fold keepend extend
+ else
+ " EXPLANATION:
+ " same, as above, but first non-space character after "sub" keyword must
+ " be [A-Za-z_]
+ syn region perlSubFold start="\<sub\>\s*\h\_[^;{]*\%(([\\$@%&*\[\];]*)\)\=\_[^;]*{" end="}" transparent fold keepend extend
+ endif
+
+ syn region perlSubFold start="\<\%(BEGIN\|END\|CHECK\|INIT\|UNITCHECK\)\>\_s*{" end="}" transparent fold keepend
+ endif
+
+ if get(g:, 'perl_fold_blocks', 0)
+ 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
+
+ " TODO this is works incorrectly
+ syn region perlBlockFold start="^\z(\s*\)\%(do\|else\)\%(\s*{\)\=\s*\%(#.*\)\=$" end="^\z1}\s*while" end="^\z1}\s*;\=\%(#.*\)\=$" transparent fold keepend
+ else
+ if get(g:, 'perl_fold_do_blocks', 0)
+ syn region perlDoBlockDeclaration start="" end="{" contains=perlComment contained transparent
+ syn match perlOperator "\<do\>\_s*" nextgroup=perlDoBlockDeclaration
+
+ syn region perlDoBlockFold start="\<do\>\_[^{]*{" end="}" transparent fold keepend extend
+ endif
+ endif
+
+ syn sync fromstart
+else
+ " fromstart above seems to set minlines even if perl_fold is not set.
+ syn sync minlines=0
+endif
+
+" 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.
+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 perlSubSignature Type
+hi def link perlSubAttribute PreProc
+hi def link perlComment Comment
+hi def link perlTodo Todo
+if get(g:, 'perl_string_as_statement', 0)
+ hi def link perlStringStartEnd perlStatement
+else
+ 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 perlQ perlString
+hi def link perlQQ perlString
+hi def link perlQW perlString
+hi def link perlQR perlString
+hi def link perlMatchModifiers perlMatchStartEnd
+hi def link perlSubstitutionModifiers perlMatchStartEnd
+hi def link perlTranslationModifiers perlMatchStartEnd
+hi def link perlQRModifiers perlStringStartEnd
+hi def link perlHereDoc perlString
+hi def link perlIndentedHereDoc 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
+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 perlEND perlComment
+hi def link perlENDStart perlEND
+hi def link perlDATA perlComment
+hi def link perlDATAStart perlDATA
+
+" 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.
+hi def link perlParensSQ perlString
+hi def link perlBracketsSQ perlString
+hi def link perlBracesSQ perlString
+hi def link perlAnglesSQ perlString
+
+hi def link perlParensDQ perlString
+hi def link perlBracketsDQ perlString
+hi def link perlBracesDQ perlString
+hi def link perlAnglesDQ perlString
+
+hi def link perlSpecialStringU2 perlString
+
+" Possible errors
+hi def link perlNotEmptyLine Error
+hi def link perlElseIfError Error
+
+" Syncing to speed up processing
+"
+if !get(g:, 'perl_no_sync_on_sub', 0)
+ syn sync match perlSync grouphere NONE "^\s*\<package\s"
+ syn sync match perlSync grouphere NONE "^\s*\<sub\>"
+ syn sync match perlSync grouphere NONE "^}"
+endif
+
+if !get(g:, 'perl_no_sync_on_global_var', 0)
+ syn sync match perlSync grouphere NONE "^$\I[[:alnum:]_:]+\s*=\s*{"
+ syn sync match perlSync grouphere NONE "^[@%]\I[[:alnum:]_:]+\s*=\s*("
+endif
+
+if get(g:, 'perl_sync_dist', 0)
+ execute "syn sync maxlines=" . perl_sync_dist
+else
+ syn sync maxlines=100
+endif
+
+syn sync match perlSyncPOD grouphere perlPOD "^=pod"
+syn sync match perlSyncPOD grouphere perlPOD "^=head"
+syn sync match perlSyncPOD grouphere perlPOD "^=item"
+syn sync match perlSyncPOD grouphere NONE "^=cut"
+
+let b:current_syntax = "perl"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" XXX Change to sts=4:sw=4
+" vim:ts=8:sts=2:sw=2:expandtab:ft=vim
diff --git a/runtime/syntax/pf.vim b/runtime/syntax/pf.vim
new file mode 100644
index 0000000..b928dc4
--- /dev/null
+++ b/runtime/syntax/pf.vim
@@ -0,0 +1,333 @@
+" pf syntax file
+" Language: OpenBSD packet filter configuration (pf.conf)
+" Original Author: Camiel Dobbelaar <cd@sentia.nl>
+" Maintainer: Lauri Tirkkonen <lotheac@iki.fi>
+" Last Change: 2018 Jul 16
+
+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 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 any no-route urpf-failed self
+syn match pfComment /#.*$/ contains=pfTodo
+syn match pfCont /\\$/
+syn match pfErrClose /}/
+syn match pfIPv4 /\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/
+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-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=/"/ skip=/\\"/ end=/"/ contains=pfIPv4,pfIPv6,pfNetmask,pfTable,pfVar
+syn region pfString start=/'/ skip=/\\'/ end=/'/ contains=pfIPv4,pfIPv6,pfNetmask,pfTable,pfVar
+
+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
+
+" 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
new file mode 100644
index 0000000..af58da7
--- /dev/null
+++ b/runtime/syntax/pfmain.vim
@@ -0,0 +1,1835 @@
+" Vim syntax file
+" Language: Postfix main.cf configuration
+" Maintainer: KELEMEN Peter <Peter dot Kelemen at cern dot ch>
+" Last Updates: Anton Shestakov, Hong Xu
+" Last Change: 2015 Feb 10
+" Version: 0.40
+" URL: http://cern.ch/fuji/vim/syntax/pfmain.vim
+" Comment: Based on Postfix 2.12/3.0 postconf.5.html.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=@,48-57,_,-
+
+syntax case match
+syntax sync minlines=1
+
+syntax keyword pfmainConf 2bounce_notice_recipient
+syntax keyword pfmainConf access_map_defer_code
+syntax keyword pfmainConf access_map_reject_code
+syntax keyword pfmainConf address_verify_cache_cleanup_interval
+syntax keyword pfmainConf address_verify_default_transport
+syntax keyword pfmainConf address_verify_local_transport
+syntax keyword pfmainConf address_verify_map
+syntax keyword pfmainConf address_verify_negative_cache
+syntax keyword pfmainConf address_verify_negative_expire_time
+syntax keyword pfmainConf address_verify_negative_refresh_time
+syntax keyword pfmainConf address_verify_poll_count
+syntax keyword pfmainConf address_verify_poll_delay
+syntax keyword pfmainConf address_verify_positive_expire_time
+syntax keyword pfmainConf address_verify_positive_refresh_time
+syntax keyword pfmainConf address_verify_relay_transport
+syntax keyword pfmainConf address_verify_relayhost
+syntax keyword pfmainConf address_verify_sender
+syntax keyword pfmainConf address_verify_sender_dependent_default_transport_maps
+syntax keyword pfmainConf address_verify_sender_dependent_relayhost_maps
+syntax keyword pfmainConf address_verify_sender_ttl
+syntax keyword pfmainConf address_verify_service_name
+syntax keyword pfmainConf address_verify_transport_maps
+syntax keyword pfmainConf address_verify_virtual_transport
+syntax keyword pfmainConf alias_database
+syntax keyword pfmainConf alias_maps
+syntax keyword pfmainConf allow_mail_to_commands
+syntax keyword pfmainConf allow_mail_to_files
+syntax keyword pfmainConf allow_min_user
+syntax keyword pfmainConf allow_percent_hack
+syntax keyword pfmainConf allow_untrusted_routing
+syntax keyword pfmainConf alternate_config_directories
+syntax keyword pfmainConf always_add_missing_headers
+syntax keyword pfmainConf always_bcc
+syntax keyword pfmainConf anvil_rate_time_unit
+syntax keyword pfmainConf anvil_status_update_time
+syntax keyword pfmainConf append_at_myorigin
+syntax keyword pfmainConf append_dot_mydomain
+syntax keyword pfmainConf application_event_drain_time
+syntax keyword pfmainConf authorized_flush_users
+syntax keyword pfmainConf authorized_mailq_users
+syntax keyword pfmainConf authorized_submit_users
+syntax keyword pfmainConf authorized_verp_clients
+syntax keyword pfmainConf backwards_bounce_logfile_compatibility
+syntax keyword pfmainConf berkeley_db_create_buffer_size
+syntax keyword pfmainConf berkeley_db_read_buffer_size
+syntax keyword pfmainConf best_mx_transport
+syntax keyword pfmainConf biff
+syntax keyword pfmainConf body_checks
+syntax keyword pfmainConf body_checks_size_limit
+syntax keyword pfmainConf bounce_notice_recipient
+syntax keyword pfmainConf bounce_queue_lifetime
+syntax keyword pfmainConf bounce_service_name
+syntax keyword pfmainConf bounce_size_limit
+syntax keyword pfmainConf bounce_template_file
+syntax keyword pfmainConf broken_sasl_auth_clients
+syntax keyword pfmainConf canonical_classes
+syntax keyword pfmainConf canonical_maps
+syntax keyword pfmainConf cleanup_service_name
+syntax keyword pfmainConf command_directory
+syntax keyword pfmainConf command_execution_directory
+syntax keyword pfmainConf command_expansion_filter
+syntax keyword pfmainConf command_time_limit
+syntax keyword pfmainConf compatibility_level
+syntax keyword pfmainConf config_directory
+syntax keyword pfmainConf confirm_delay_cleared
+syntax keyword pfmainConf connection_cache_protocol_timeout
+syntax keyword pfmainConf connection_cache_service_name
+syntax keyword pfmainConf connection_cache_status_update_time
+syntax keyword pfmainConf connection_cache_ttl_limit
+syntax keyword pfmainConf content_filter
+syntax keyword pfmainConf cyrus_sasl_config_path
+syntax keyword pfmainConf daemon_directory
+syntax keyword pfmainConf daemon_table_open_error_is_fatal
+syntax keyword pfmainConf daemon_timeout
+syntax keyword pfmainConf data_directory
+syntax keyword pfmainConf debug_peer_level
+syntax keyword pfmainConf debug_peer_list
+syntax keyword pfmainConf debugger_command
+syntax keyword pfmainConf default_database_type
+syntax keyword pfmainConf default_delivery_slot_cost
+syntax keyword pfmainConf default_delivery_slot_discount
+syntax keyword pfmainConf default_delivery_slot_loan
+syntax keyword pfmainConf default_delivery_status_filter
+syntax keyword pfmainConf default_destination_concurrency_failed_cohort_limit
+syntax keyword pfmainConf default_destination_concurrency_limit
+syntax keyword pfmainConf default_destination_concurrency_negative_feedback
+syntax keyword pfmainConf default_destination_concurrency_positive_feedback
+syntax keyword pfmainConf default_destination_rate_delay
+syntax keyword pfmainConf default_destination_recipient_limit
+syntax keyword pfmainConf default_extra_recipient_limit
+syntax keyword pfmainConf default_filter_nexthop
+syntax keyword pfmainConf default_minimum_delivery_slots
+syntax keyword pfmainConf default_privs
+syntax keyword pfmainConf default_process_limit
+syntax keyword pfmainConf default_rbl_reply
+syntax keyword pfmainConf default_recipient_limit
+syntax keyword pfmainConf default_recipient_refill_delay
+syntax keyword pfmainConf default_recipient_refill_limit
+syntax keyword pfmainConf default_transport
+syntax keyword pfmainConf default_verp_delimiters
+syntax keyword pfmainConf defer_code
+syntax keyword pfmainConf defer_service_name
+syntax keyword pfmainConf defer_transports
+syntax keyword pfmainConf delay_logging_resolution_limit
+syntax keyword pfmainConf delay_notice_recipient
+syntax keyword pfmainConf delay_warning_time
+syntax keyword pfmainConf deliver_lock_attempts
+syntax keyword pfmainConf deliver_lock_delay
+syntax keyword pfmainConf destination_concurrency_feedback_debug
+syntax keyword pfmainConf detect_8bit_encoding_header
+syntax keyword pfmainConf disable_dns_lookups
+syntax keyword pfmainConf disable_mime_input_processing
+syntax keyword pfmainConf disable_mime_output_conversion
+syntax keyword pfmainConf disable_verp_bounces
+syntax keyword pfmainConf disable_vrfy_command
+syntax keyword pfmainConf dnsblog_reply_delay
+syntax keyword pfmainConf dnsblog_service_name
+syntax keyword pfmainConf dont_remove
+syntax keyword pfmainConf double_bounce_sender
+syntax keyword pfmainConf duplicate_filter_limit
+syntax keyword pfmainConf empty_address_default_transport_maps_lookup_key
+syntax keyword pfmainConf empty_address_recipient
+syntax keyword pfmainConf empty_address_relayhost_maps_lookup_key
+syntax keyword pfmainConf enable_errors_to
+syntax keyword pfmainConf enable_long_queue_ids
+syntax keyword pfmainConf enable_original_recipient
+syntax keyword pfmainConf error_notice_recipient
+syntax keyword pfmainConf error_service_name
+syntax keyword pfmainConf execution_directory_expansion_filter
+syntax keyword pfmainConf expand_owner_alias
+syntax keyword pfmainConf export_environment
+syntax keyword pfmainConf extract_recipient_limit
+syntax keyword pfmainConf fallback_relay
+syntax keyword pfmainConf fallback_transport
+syntax keyword pfmainConf fallback_transport_maps
+syntax keyword pfmainConf fast_flush_domains
+syntax keyword pfmainConf fast_flush_purge_time
+syntax keyword pfmainConf fast_flush_refresh_time
+syntax keyword pfmainConf fault_injection_code
+syntax keyword pfmainConf flush_service_name
+syntax keyword pfmainConf fork_attempts
+syntax keyword pfmainConf fork_delay
+syntax keyword pfmainConf forward_expansion_filter
+syntax keyword pfmainConf forward_path
+syntax keyword pfmainConf frozen_delivered_to
+syntax keyword pfmainConf hash_queue_depth
+syntax keyword pfmainConf hash_queue_names
+syntax keyword pfmainConf header_address_token_limit
+syntax keyword pfmainConf header_checks
+syntax keyword pfmainConf header_size_limit
+syntax keyword pfmainConf helpful_warnings
+syntax keyword pfmainConf home_mailbox
+syntax keyword pfmainConf hopcount_limit
+syntax keyword pfmainConf html_directory
+syntax keyword pfmainConf ignore_mx_lookup_error
+syntax keyword pfmainConf import_environment
+syntax keyword pfmainConf in_flow_delay
+syntax keyword pfmainConf inet_interfaces
+syntax keyword pfmainConf inet_protocols
+syntax keyword pfmainConf initial_destination_concurrency
+syntax keyword pfmainConf internal_mail_filter_classes
+syntax keyword pfmainConf invalid_hostname_reject_code
+syntax keyword pfmainConf ipc_idle
+syntax keyword pfmainConf ipc_timeout
+syntax keyword pfmainConf ipc_ttl
+syntax keyword pfmainConf line_length_limit
+syntax keyword pfmainConf lmdb_map_size
+syntax keyword pfmainConf lmtp_address_preference
+syntax keyword pfmainConf lmtp_address_verify_target
+syntax keyword pfmainConf lmtp_assume_final
+syntax keyword pfmainConf lmtp_bind_address
+syntax keyword pfmainConf lmtp_bind_address6
+syntax keyword pfmainConf lmtp_body_checks
+syntax keyword pfmainConf lmtp_cache_connection
+syntax keyword pfmainConf lmtp_cname_overrides_servername
+syntax keyword pfmainConf lmtp_connect_timeout
+syntax keyword pfmainConf lmtp_connection_cache_destinations
+syntax keyword pfmainConf lmtp_connection_cache_on_demand
+syntax keyword pfmainConf lmtp_connection_cache_time_limit
+syntax keyword pfmainConf lmtp_connection_reuse_count_limit
+syntax keyword pfmainConf lmtp_connection_reuse_time_limit
+syntax keyword pfmainConf lmtp_data_done_timeout
+syntax keyword pfmainConf lmtp_data_init_timeout
+syntax keyword pfmainConf lmtp_data_xfer_timeout
+syntax keyword pfmainConf lmtp_defer_if_no_mx_address_found
+syntax keyword pfmainConf lmtp_delivery_status_filter
+syntax keyword pfmainConf lmtp_destination_concurrency_limit
+syntax keyword pfmainConf lmtp_destination_recipient_limit
+syntax keyword pfmainConf lmtp_discard_lhlo_keyword_address_maps
+syntax keyword pfmainConf lmtp_discard_lhlo_keywords
+syntax keyword pfmainConf lmtp_dns_reply_filter
+syntax keyword pfmainConf lmtp_dns_resolver_options
+syntax keyword pfmainConf lmtp_dns_support_level
+syntax keyword pfmainConf lmtp_enforce_tls
+syntax keyword pfmainConf lmtp_generic_maps
+syntax keyword pfmainConf lmtp_header_checks
+syntax keyword pfmainConf lmtp_host_lookup
+syntax keyword pfmainConf lmtp_lhlo_name
+syntax keyword pfmainConf lmtp_lhlo_timeout
+syntax keyword pfmainConf lmtp_line_length_limit
+syntax keyword pfmainConf lmtp_mail_timeout
+syntax keyword pfmainConf lmtp_mime_header_checks
+syntax keyword pfmainConf lmtp_mx_address_limit
+syntax keyword pfmainConf lmtp_mx_session_limit
+syntax keyword pfmainConf lmtp_nested_header_checks
+syntax keyword pfmainConf lmtp_per_record_deadline
+syntax keyword pfmainConf lmtp_pix_workaround_delay_time
+syntax keyword pfmainConf lmtp_pix_workaround_maps
+syntax keyword pfmainConf lmtp_pix_workaround_threshold_time
+syntax keyword pfmainConf lmtp_pix_workarounds
+syntax keyword pfmainConf lmtp_quit_timeout
+syntax keyword pfmainConf lmtp_quote_rfc821_envelope
+syntax keyword pfmainConf lmtp_randomize_addresses
+syntax keyword pfmainConf lmtp_rcpt_timeout
+syntax keyword pfmainConf lmtp_reply_filter
+syntax keyword pfmainConf lmtp_rset_timeout
+syntax keyword pfmainConf lmtp_sasl_auth_cache_name
+syntax keyword pfmainConf lmtp_sasl_auth_cache_time
+syntax keyword pfmainConf lmtp_sasl_auth_enable
+syntax keyword pfmainConf lmtp_sasl_auth_soft_bounce
+syntax keyword pfmainConf lmtp_sasl_mechanism_filter
+syntax keyword pfmainConf lmtp_sasl_password_maps
+syntax keyword pfmainConf lmtp_sasl_path
+syntax keyword pfmainConf lmtp_sasl_security_options
+syntax keyword pfmainConf lmtp_sasl_tls_security_options
+syntax keyword pfmainConf lmtp_sasl_tls_verified_security_options
+syntax keyword pfmainConf lmtp_sasl_type
+syntax keyword pfmainConf lmtp_send_dummy_mail_auth
+syntax keyword pfmainConf lmtp_send_xforward_command
+syntax keyword pfmainConf lmtp_sender_dependent_authentication
+syntax keyword pfmainConf lmtp_skip_5xx_greeting
+syntax keyword pfmainConf lmtp_skip_quit_response
+syntax keyword pfmainConf lmtp_starttls_timeout
+syntax keyword pfmainConf lmtp_tcp_port
+syntax keyword pfmainConf lmtp_tls_CAfile
+syntax keyword pfmainConf lmtp_tls_CApath
+syntax keyword pfmainConf lmtp_tls_block_early_mail_reply
+syntax keyword pfmainConf lmtp_tls_cert_file
+syntax keyword pfmainConf lmtp_tls_ciphers
+syntax keyword pfmainConf lmtp_tls_dcert_file
+syntax keyword pfmainConf lmtp_tls_dkey_file
+syntax keyword pfmainConf lmtp_tls_eccert_file
+syntax keyword pfmainConf lmtp_tls_eckey_file
+syntax keyword pfmainConf lmtp_tls_enforce_peername
+syntax keyword pfmainConf lmtp_tls_exclude_ciphers
+syntax keyword pfmainConf lmtp_tls_fingerprint_cert_match
+syntax keyword pfmainConf lmtp_tls_fingerprint_digest
+syntax keyword pfmainConf lmtp_tls_force_insecure_host_tlsa_lookup
+syntax keyword pfmainConf lmtp_tls_key_file
+syntax keyword pfmainConf lmtp_tls_loglevel
+syntax keyword pfmainConf lmtp_tls_mandatory_ciphers
+syntax keyword pfmainConf lmtp_tls_mandatory_exclude_ciphers
+syntax keyword pfmainConf lmtp_tls_mandatory_protocols
+syntax keyword pfmainConf lmtp_tls_note_starttls_offer
+syntax keyword pfmainConf lmtp_tls_per_site
+syntax keyword pfmainConf lmtp_tls_policy_maps
+syntax keyword pfmainConf lmtp_tls_protocols
+syntax keyword pfmainConf lmtp_tls_scert_verifydepth
+syntax keyword pfmainConf lmtp_tls_secure_cert_match
+syntax keyword pfmainConf lmtp_tls_security_level
+syntax keyword pfmainConf lmtp_tls_session_cache_database
+syntax keyword pfmainConf lmtp_tls_session_cache_timeout
+syntax keyword pfmainConf lmtp_tls_trust_anchor_file
+syntax keyword pfmainConf lmtp_tls_verify_cert_match
+syntax keyword pfmainConf lmtp_use_tls
+syntax keyword pfmainConf lmtp_xforward_timeout
+syntax keyword pfmainConf local_command_shell
+syntax keyword pfmainConf local_delivery_status_filter
+syntax keyword pfmainConf local_destination_concurrency_limit
+syntax keyword pfmainConf local_destination_recipient_limit
+syntax keyword pfmainConf local_header_rewrite_clients
+syntax keyword pfmainConf local_recipient_maps
+syntax keyword pfmainConf local_transport
+syntax keyword pfmainConf luser_relay
+syntax keyword pfmainConf mail_name
+syntax keyword pfmainConf mail_owner
+syntax keyword pfmainConf mail_release_date
+syntax keyword pfmainConf mail_spool_directory
+syntax keyword pfmainConf mail_version
+syntax keyword pfmainConf mailbox_command
+syntax keyword pfmainConf mailbox_command_maps
+syntax keyword pfmainConf mailbox_delivery_lock
+syntax keyword pfmainConf mailbox_size_limit
+syntax keyword pfmainConf mailbox_transport
+syntax keyword pfmainConf mailbox_transport_maps
+syntax keyword pfmainConf mailq_path
+syntax keyword pfmainConf manpage_directory
+syntax keyword pfmainConf maps_rbl_domains
+syntax keyword pfmainConf maps_rbl_reject_code
+syntax keyword pfmainConf masquerade_classes
+syntax keyword pfmainConf masquerade_domains
+syntax keyword pfmainConf masquerade_exceptions
+syntax keyword pfmainConf master_service_disable
+syntax keyword pfmainConf max_idle
+syntax keyword pfmainConf max_use
+syntax keyword pfmainConf maximal_backoff_time
+syntax keyword pfmainConf maximal_queue_lifetime
+syntax keyword pfmainConf message_drop_headers
+syntax keyword pfmainConf message_reject_characters
+syntax keyword pfmainConf message_size_limit
+syntax keyword pfmainConf message_strip_characters
+syntax keyword pfmainConf meta_directory
+syntax keyword pfmainConf milter_command_timeout
+syntax keyword pfmainConf milter_connect_macros
+syntax keyword pfmainConf milter_connect_timeout
+syntax keyword pfmainConf milter_content_timeout
+syntax keyword pfmainConf milter_data_macros
+syntax keyword pfmainConf milter_default_action
+syntax keyword pfmainConf milter_end_of_data_macros
+syntax keyword pfmainConf milter_end_of_header_macros
+syntax keyword pfmainConf milter_header_checks
+syntax keyword pfmainConf milter_helo_macros
+syntax keyword pfmainConf milter_macro_daemon_name
+syntax keyword pfmainConf milter_macro_v
+syntax keyword pfmainConf milter_mail_macros
+syntax keyword pfmainConf milter_protocol
+syntax keyword pfmainConf milter_rcpt_macros
+syntax keyword pfmainConf milter_unknown_command_macros
+syntax keyword pfmainConf mime_boundary_length_limit
+syntax keyword pfmainConf mime_header_checks
+syntax keyword pfmainConf mime_nesting_limit
+syntax keyword pfmainConf minimal_backoff_time
+syntax keyword pfmainConf multi_instance_directories
+syntax keyword pfmainConf multi_instance_enable
+syntax keyword pfmainConf multi_instance_group
+syntax keyword pfmainConf multi_instance_name
+syntax keyword pfmainConf multi_instance_wrapper
+syntax keyword pfmainConf multi_recipient_bounce_reject_code
+syntax keyword pfmainConf mydestination
+syntax keyword pfmainConf mydomain
+syntax keyword pfmainConf myhostname
+syntax keyword pfmainConf mynetworks
+syntax keyword pfmainConf mynetworks_style
+syntax keyword pfmainConf myorigin
+syntax keyword pfmainConf nested_header_checks
+syntax keyword pfmainConf newaliases_path
+syntax keyword pfmainConf non_fqdn_reject_code
+syntax keyword pfmainConf non_smtpd_milters
+syntax keyword pfmainConf notify_classes
+syntax keyword pfmainConf nullmx_reject_code
+syntax keyword pfmainConf owner_request_special
+syntax keyword pfmainConf parent_domain_matches_subdomains
+syntax keyword pfmainConf permit_mx_backup_networks
+syntax keyword pfmainConf pickup_service_name
+syntax keyword pfmainConf pipe_delivery_status_filter
+syntax keyword pfmainConf plaintext_reject_code
+syntax keyword pfmainConf postmulti_control_commands
+syntax keyword pfmainConf postmulti_start_commands
+syntax keyword pfmainConf postmulti_stop_commands
+syntax keyword pfmainConf postscreen_access_list
+syntax keyword pfmainConf postscreen_bare_newline_action
+syntax keyword pfmainConf postscreen_bare_newline_enable
+syntax keyword pfmainConf postscreen_bare_newline_ttl
+syntax keyword pfmainConf postscreen_blacklist_action
+syntax keyword pfmainConf postscreen_cache_cleanup_interval
+syntax keyword pfmainConf postscreen_cache_map
+syntax keyword pfmainConf postscreen_cache_retention_time
+syntax keyword pfmainConf postscreen_client_connection_count_limit
+syntax keyword pfmainConf postscreen_command_count_limit
+syntax keyword pfmainConf postscreen_command_filter
+syntax keyword pfmainConf postscreen_command_time_limit
+syntax keyword pfmainConf postscreen_disable_vrfy_command
+syntax keyword pfmainConf postscreen_discard_ehlo_keyword_address_maps
+syntax keyword pfmainConf postscreen_discard_ehlo_keywords
+syntax keyword pfmainConf postscreen_dnsbl_action
+syntax keyword pfmainConf postscreen_dnsbl_reply_map
+syntax keyword pfmainConf postscreen_dnsbl_sites
+syntax keyword pfmainConf postscreen_dnsbl_threshold
+syntax keyword pfmainConf postscreen_dnsbl_timeout
+syntax keyword pfmainConf postscreen_dnsbl_ttl
+syntax keyword pfmainConf postscreen_dnsbl_whitelist_threshold
+syntax keyword pfmainConf postscreen_enforce_tls
+syntax keyword pfmainConf postscreen_expansion_filter
+syntax keyword pfmainConf postscreen_forbidden_commands
+syntax keyword pfmainConf postscreen_greet_action
+syntax keyword pfmainConf postscreen_greet_banner
+syntax keyword pfmainConf postscreen_greet_ttl
+syntax keyword pfmainConf postscreen_greet_wait
+syntax keyword pfmainConf postscreen_helo_required
+syntax keyword pfmainConf postscreen_non_smtp_command_action
+syntax keyword pfmainConf postscreen_non_smtp_command_enable
+syntax keyword pfmainConf postscreen_non_smtp_command_ttl
+syntax keyword pfmainConf postscreen_pipelining_action
+syntax keyword pfmainConf postscreen_pipelining_enable
+syntax keyword pfmainConf postscreen_pipelining_ttl
+syntax keyword pfmainConf postscreen_post_queue_limit
+syntax keyword pfmainConf postscreen_pre_queue_limit
+syntax keyword pfmainConf postscreen_reject_footer
+syntax keyword pfmainConf postscreen_tls_security_level
+syntax keyword pfmainConf postscreen_upstream_proxy_protocol
+syntax keyword pfmainConf postscreen_upstream_proxy_timeout
+syntax keyword pfmainConf postscreen_use_tls
+syntax keyword pfmainConf postscreen_watchdog_timeout
+syntax keyword pfmainConf postscreen_whitelist_interfaces
+syntax keyword pfmainConf prepend_delivered_header
+syntax keyword pfmainConf process_id
+syntax keyword pfmainConf process_id_directory
+syntax keyword pfmainConf process_name
+syntax keyword pfmainConf propagate_unmatched_extensions
+syntax keyword pfmainConf proxy_interfaces
+syntax keyword pfmainConf proxy_read_maps
+syntax keyword pfmainConf proxy_write_maps
+syntax keyword pfmainConf proxymap_service_name
+syntax keyword pfmainConf proxywrite_service_name
+syntax keyword pfmainConf qmgr_clog_warn_time
+syntax keyword pfmainConf qmgr_daemon_timeout
+syntax keyword pfmainConf qmgr_fudge_factor
+syntax keyword pfmainConf qmgr_ipc_timeout
+syntax keyword pfmainConf qmgr_message_active_limit
+syntax keyword pfmainConf qmgr_message_recipient_limit
+syntax keyword pfmainConf qmgr_message_recipient_minimum
+syntax keyword pfmainConf qmqpd_authorized_clients
+syntax keyword pfmainConf qmqpd_client_port_logging
+syntax keyword pfmainConf qmqpd_error_delay
+syntax keyword pfmainConf qmqpd_timeout
+syntax keyword pfmainConf queue_directory
+syntax keyword pfmainConf queue_file_attribute_count_limit
+syntax keyword pfmainConf queue_minfree
+syntax keyword pfmainConf queue_run_delay
+syntax keyword pfmainConf queue_service_name
+syntax keyword pfmainConf rbl_reply_maps
+syntax keyword pfmainConf readme_directory
+syntax keyword pfmainConf receive_override_options
+syntax keyword pfmainConf recipient_bcc_maps
+syntax keyword pfmainConf recipient_canonical_classes
+syntax keyword pfmainConf recipient_canonical_maps
+syntax keyword pfmainConf recipient_delimiter
+syntax keyword pfmainConf reject_code
+syntax keyword pfmainConf reject_tempfail_action
+syntax keyword pfmainConf relay_clientcerts
+syntax keyword pfmainConf relay_destination_concurrency_limit
+syntax keyword pfmainConf relay_destination_recipient_limit
+syntax keyword pfmainConf relay_domains
+syntax keyword pfmainConf relay_domains_reject_code
+syntax keyword pfmainConf relay_recipient_maps
+syntax keyword pfmainConf relay_transport
+syntax keyword pfmainConf relayhost
+syntax keyword pfmainConf relocated_maps
+syntax keyword pfmainConf remote_header_rewrite_domain
+syntax keyword pfmainConf require_home_directory
+syntax keyword pfmainConf reset_owner_alias
+syntax keyword pfmainConf resolve_dequoted_address
+syntax keyword pfmainConf resolve_null_domain
+syntax keyword pfmainConf resolve_numeric_domain
+syntax keyword pfmainConf rewrite_service_name
+syntax keyword pfmainConf sample_directory
+syntax keyword pfmainConf send_cyrus_sasl_authzid
+syntax keyword pfmainConf sender_based_routing
+syntax keyword pfmainConf sender_bcc_maps
+syntax keyword pfmainConf sender_canonical_classes
+syntax keyword pfmainConf sender_canonical_maps
+syntax keyword pfmainConf sender_dependent_default_transport_maps
+syntax keyword pfmainConf sender_dependent_relayhost_maps
+syntax keyword pfmainConf sendmail_fix_line_endings
+syntax keyword pfmainConf sendmail_path
+syntax keyword pfmainConf service_throttle_time
+syntax keyword pfmainConf setgid_group
+syntax keyword pfmainConf shlib_directory
+syntax keyword pfmainConf show_user_unknown_table_name
+syntax keyword pfmainConf showq_service_name
+syntax keyword pfmainConf smtp_address_preference
+syntax keyword pfmainConf smtp_address_verify_target
+syntax keyword pfmainConf smtp_always_send_ehlo
+syntax keyword pfmainConf smtp_bind_address
+syntax keyword pfmainConf smtp_bind_address6
+syntax keyword pfmainConf smtp_body_checks
+syntax keyword pfmainConf smtp_cname_overrides_servername
+syntax keyword pfmainConf smtp_connect_timeout
+syntax keyword pfmainConf smtp_connection_cache_destinations
+syntax keyword pfmainConf smtp_connection_cache_on_demand
+syntax keyword pfmainConf smtp_connection_cache_time_limit
+syntax keyword pfmainConf smtp_connection_reuse_count_limit
+syntax keyword pfmainConf smtp_connection_reuse_time_limit
+syntax keyword pfmainConf smtp_data_done_timeout
+syntax keyword pfmainConf smtp_data_init_timeout
+syntax keyword pfmainConf smtp_data_xfer_timeout
+syntax keyword pfmainConf smtp_defer_if_no_mx_address_found
+syntax keyword pfmainConf smtp_delivery_status_filter
+syntax keyword pfmainConf smtp_destination_concurrency_limit
+syntax keyword pfmainConf smtp_destination_recipient_limit
+syntax keyword pfmainConf smtp_discard_ehlo_keyword_address_maps
+syntax keyword pfmainConf smtp_discard_ehlo_keywords
+syntax keyword pfmainConf smtp_dns_reply_filter
+syntax keyword pfmainConf smtp_dns_resolver_options
+syntax keyword pfmainConf smtp_dns_support_level
+syntax keyword pfmainConf smtp_enforce_tls
+syntax keyword pfmainConf smtp_fallback_relay
+syntax keyword pfmainConf smtp_generic_maps
+syntax keyword pfmainConf smtp_header_checks
+syntax keyword pfmainConf smtp_helo_name
+syntax keyword pfmainConf smtp_helo_timeout
+syntax keyword pfmainConf smtp_host_lookup
+syntax keyword pfmainConf smtp_line_length_limit
+syntax keyword pfmainConf smtp_mail_timeout
+syntax keyword pfmainConf smtp_mime_header_checks
+syntax keyword pfmainConf smtp_mx_address_limit
+syntax keyword pfmainConf smtp_mx_session_limit
+syntax keyword pfmainConf smtp_nested_header_checks
+syntax keyword pfmainConf smtp_never_send_ehlo
+syntax keyword pfmainConf smtp_per_record_deadline
+syntax keyword pfmainConf smtp_pix_workaround_delay_time
+syntax keyword pfmainConf smtp_pix_workaround_maps
+syntax keyword pfmainConf smtp_pix_workaround_threshold_time
+syntax keyword pfmainConf smtp_pix_workarounds
+syntax keyword pfmainConf smtp_quit_timeout
+syntax keyword pfmainConf smtp_quote_rfc821_envelope
+syntax keyword pfmainConf smtp_randomize_addresses
+syntax keyword pfmainConf smtp_rcpt_timeout
+syntax keyword pfmainConf smtp_reply_filter
+syntax keyword pfmainConf smtp_rset_timeout
+syntax keyword pfmainConf smtp_sasl_auth_cache_name
+syntax keyword pfmainConf smtp_sasl_auth_cache_time
+syntax keyword pfmainConf smtp_sasl_auth_enable
+syntax keyword pfmainConf smtp_sasl_auth_soft_bounce
+syntax keyword pfmainConf smtp_sasl_mechanism_filter
+syntax keyword pfmainConf smtp_sasl_password_maps
+syntax keyword pfmainConf smtp_sasl_path
+syntax keyword pfmainConf smtp_sasl_security_options
+syntax keyword pfmainConf smtp_sasl_tls_security_options
+syntax keyword pfmainConf smtp_sasl_tls_verified_security_options
+syntax keyword pfmainConf smtp_sasl_type
+syntax keyword pfmainConf smtp_send_dummy_mail_auth
+syntax keyword pfmainConf smtp_send_xforward_command
+syntax keyword pfmainConf smtp_sender_dependent_authentication
+syntax keyword pfmainConf smtp_skip_4xx_greeting
+syntax keyword pfmainConf smtp_skip_5xx_greeting
+syntax keyword pfmainConf smtp_skip_quit_response
+syntax keyword pfmainConf smtp_starttls_timeout
+syntax keyword pfmainConf smtp_tls_CAfile
+syntax keyword pfmainConf smtp_tls_CApath
+syntax keyword pfmainConf smtp_tls_block_early_mail_reply
+syntax keyword pfmainConf smtp_tls_cert_file
+syntax keyword pfmainConf smtp_tls_cipherlist
+syntax keyword pfmainConf smtp_tls_ciphers
+syntax keyword pfmainConf smtp_tls_dcert_file
+syntax keyword pfmainConf smtp_tls_dkey_file
+syntax keyword pfmainConf smtp_tls_eccert_file
+syntax keyword pfmainConf smtp_tls_eckey_file
+syntax keyword pfmainConf smtp_tls_enforce_peername
+syntax keyword pfmainConf smtp_tls_exclude_ciphers
+syntax keyword pfmainConf smtp_tls_fingerprint_cert_match
+syntax keyword pfmainConf smtp_tls_fingerprint_digest
+syntax keyword pfmainConf smtp_tls_force_insecure_host_tlsa_lookup
+syntax keyword pfmainConf smtp_tls_key_file
+syntax keyword pfmainConf smtp_tls_loglevel
+syntax keyword pfmainConf smtp_tls_mandatory_ciphers
+syntax keyword pfmainConf smtp_tls_mandatory_exclude_ciphers
+syntax keyword pfmainConf smtp_tls_mandatory_protocols
+syntax keyword pfmainConf smtp_tls_note_starttls_offer
+syntax keyword pfmainConf smtp_tls_per_site
+syntax keyword pfmainConf smtp_tls_policy_maps
+syntax keyword pfmainConf smtp_tls_protocols
+syntax keyword pfmainConf smtp_tls_scert_verifydepth
+syntax keyword pfmainConf smtp_tls_secure_cert_match
+syntax keyword pfmainConf smtp_tls_security_level
+syntax keyword pfmainConf smtp_tls_session_cache_database
+syntax keyword pfmainConf smtp_tls_session_cache_timeout
+syntax keyword pfmainConf smtp_tls_trust_anchor_file
+syntax keyword pfmainConf smtp_tls_verify_cert_match
+syntax keyword pfmainConf smtp_tls_wrappermode
+syntax keyword pfmainConf smtp_use_tls
+syntax keyword pfmainConf smtp_xforward_timeout
+syntax keyword pfmainConf smtpd_authorized_verp_clients
+syntax keyword pfmainConf smtpd_authorized_xclient_hosts
+syntax keyword pfmainConf smtpd_authorized_xforward_hosts
+syntax keyword pfmainConf smtpd_banner
+syntax keyword pfmainConf smtpd_client_connection_count_limit
+syntax keyword pfmainConf smtpd_client_connection_rate_limit
+syntax keyword pfmainConf smtpd_client_event_limit_exceptions
+syntax keyword pfmainConf smtpd_client_message_rate_limit
+syntax keyword pfmainConf smtpd_client_new_tls_session_rate_limit
+syntax keyword pfmainConf smtpd_client_port_logging
+syntax keyword pfmainConf smtpd_client_recipient_rate_limit
+syntax keyword pfmainConf smtpd_client_restrictions
+syntax keyword pfmainConf smtpd_command_filter
+syntax keyword pfmainConf smtpd_data_restrictions
+syntax keyword pfmainConf smtpd_delay_open_until_valid_rcpt
+syntax keyword pfmainConf smtpd_delay_reject
+syntax keyword pfmainConf smtpd_discard_ehlo_keyword_address_maps
+syntax keyword pfmainConf smtpd_discard_ehlo_keywords
+syntax keyword pfmainConf smtpd_dns_reply_filter
+syntax keyword pfmainConf smtpd_end_of_data_restrictions
+syntax keyword pfmainConf smtpd_enforce_tls
+syntax keyword pfmainConf smtpd_error_sleep_time
+syntax keyword pfmainConf smtpd_etrn_restrictions
+syntax keyword pfmainConf smtpd_expansion_filter
+syntax keyword pfmainConf smtpd_forbidden_commands
+syntax keyword pfmainConf smtpd_hard_error_limit
+syntax keyword pfmainConf smtpd_helo_required
+syntax keyword pfmainConf smtpd_helo_restrictions
+syntax keyword pfmainConf smtpd_history_flush_threshold
+syntax keyword pfmainConf smtpd_junk_command_limit
+syntax keyword pfmainConf smtpd_log_access_permit_actions
+syntax keyword pfmainConf smtpd_milters
+syntax keyword pfmainConf smtpd_noop_commands
+syntax keyword pfmainConf smtpd_null_access_lookup_key
+syntax keyword pfmainConf smtpd_peername_lookup
+syntax keyword pfmainConf smtpd_per_record_deadline
+syntax keyword pfmainConf smtpd_policy_service_default_action
+syntax keyword pfmainConf smtpd_policy_service_max_idle
+syntax keyword pfmainConf smtpd_policy_service_max_ttl
+syntax keyword pfmainConf smtpd_policy_service_request_limit
+syntax keyword pfmainConf smtpd_policy_service_retry_delay
+syntax keyword pfmainConf smtpd_policy_service_timeout
+syntax keyword pfmainConf smtpd_policy_service_try_limit
+syntax keyword pfmainConf smtpd_proxy_ehlo
+syntax keyword pfmainConf smtpd_proxy_filter
+syntax keyword pfmainConf smtpd_proxy_options
+syntax keyword pfmainConf smtpd_proxy_timeout
+syntax keyword pfmainConf smtpd_recipient_limit
+syntax keyword pfmainConf smtpd_recipient_overshoot_limit
+syntax keyword pfmainConf smtpd_recipient_restrictions
+syntax keyword pfmainConf smtpd_reject_footer
+syntax keyword pfmainConf smtpd_reject_unlisted_recipient
+syntax keyword pfmainConf smtpd_reject_unlisted_sender
+syntax keyword pfmainConf smtpd_relay_restrictions
+syntax keyword pfmainConf smtpd_restriction_classes
+syntax keyword pfmainConf smtpd_sasl_application_name
+syntax keyword pfmainConf smtpd_sasl_auth_enable
+syntax keyword pfmainConf smtpd_sasl_authenticated_header
+syntax keyword pfmainConf smtpd_sasl_exceptions_networks
+syntax keyword pfmainConf smtpd_sasl_local_domain
+syntax keyword pfmainConf smtpd_sasl_path
+syntax keyword pfmainConf smtpd_sasl_security_options
+syntax keyword pfmainConf smtpd_sasl_service
+syntax keyword pfmainConf smtpd_sasl_tls_security_options
+syntax keyword pfmainConf smtpd_sasl_type
+syntax keyword pfmainConf smtpd_sender_login_maps
+syntax keyword pfmainConf smtpd_sender_restrictions
+syntax keyword pfmainConf smtpd_service_name
+syntax keyword pfmainConf smtpd_soft_error_limit
+syntax keyword pfmainConf smtpd_starttls_timeout
+syntax keyword pfmainConf smtpd_timeout
+syntax keyword pfmainConf smtpd_tls_CAfile
+syntax keyword pfmainConf smtpd_tls_CApath
+syntax keyword pfmainConf smtpd_tls_always_issue_session_ids
+syntax keyword pfmainConf smtpd_tls_ask_ccert
+syntax keyword pfmainConf smtpd_tls_auth_only
+syntax keyword pfmainConf smtpd_tls_ccert_verifydepth
+syntax keyword pfmainConf smtpd_tls_cert_file
+syntax keyword pfmainConf smtpd_tls_cipherlist
+syntax keyword pfmainConf smtpd_tls_ciphers
+syntax keyword pfmainConf smtpd_tls_dcert_file
+syntax keyword pfmainConf smtpd_tls_dh1024_param_file
+syntax keyword pfmainConf smtpd_tls_dh512_param_file
+syntax keyword pfmainConf smtpd_tls_dkey_file
+syntax keyword pfmainConf smtpd_tls_eccert_file
+syntax keyword pfmainConf smtpd_tls_eckey_file
+syntax keyword pfmainConf smtpd_tls_eecdh_grade
+syntax keyword pfmainConf smtpd_tls_exclude_ciphers
+syntax keyword pfmainConf smtpd_tls_fingerprint_digest
+syntax keyword pfmainConf smtpd_tls_key_file
+syntax keyword pfmainConf smtpd_tls_loglevel
+syntax keyword pfmainConf smtpd_tls_mandatory_ciphers
+syntax keyword pfmainConf smtpd_tls_mandatory_exclude_ciphers
+syntax keyword pfmainConf smtpd_tls_mandatory_protocols
+syntax keyword pfmainConf smtpd_tls_protocols
+syntax keyword pfmainConf smtpd_tls_received_header
+syntax keyword pfmainConf smtpd_tls_req_ccert
+syntax keyword pfmainConf smtpd_tls_security_level
+syntax keyword pfmainConf smtpd_tls_session_cache_database
+syntax keyword pfmainConf smtpd_tls_session_cache_timeout
+syntax keyword pfmainConf smtpd_tls_wrappermode
+syntax keyword pfmainConf smtpd_upstream_proxy_protocol
+syntax keyword pfmainConf smtpd_upstream_proxy_timeout
+syntax keyword pfmainConf smtpd_use_tls
+syntax keyword pfmainConf smtputf8_autodetect_classes
+syntax keyword pfmainConf smtputf8_enable
+syntax keyword pfmainConf soft_bounce
+syntax keyword pfmainConf stale_lock_time
+syntax keyword pfmainConf stress
+syntax keyword pfmainConf strict_7bit_headers
+syntax keyword pfmainConf strict_8bitmime
+syntax keyword pfmainConf strict_8bitmime_body
+syntax keyword pfmainConf strict_mailbox_ownership
+syntax keyword pfmainConf strict_mime_encoding_domain
+syntax keyword pfmainConf strict_rfc821_envelopes
+syntax keyword pfmainConf strict_smtputf8
+syntax keyword pfmainConf sun_mailtool_compatibility
+syntax keyword pfmainConf swap_bangpath
+syntax keyword pfmainConf syslog_facility
+syntax keyword pfmainConf syslog_name
+syntax keyword pfmainConf tcp_windowsize
+syntax keyword pfmainConf tls_append_default_CA
+syntax keyword pfmainConf tls_daemon_random_bytes
+syntax keyword pfmainConf tls_dane_digest_agility
+syntax keyword pfmainConf tls_dane_digests
+syntax keyword pfmainConf tls_dane_trust_anchor_digest_enable
+syntax keyword pfmainConf tls_disable_workarounds
+syntax keyword pfmainConf tls_eecdh_strong_curve
+syntax keyword pfmainConf tls_eecdh_ultra_curve
+syntax keyword pfmainConf tls_export_cipherlist
+syntax keyword pfmainConf tls_high_cipherlist
+syntax keyword pfmainConf tls_legacy_public_key_fingerprints
+syntax keyword pfmainConf tls_low_cipherlist
+syntax keyword pfmainConf tls_medium_cipherlist
+syntax keyword pfmainConf tls_null_cipherlist
+syntax keyword pfmainConf tls_preempt_cipherlist
+syntax keyword pfmainConf tls_random_bytes
+syntax keyword pfmainConf tls_random_exchange_name
+syntax keyword pfmainConf tls_random_prng_update_period
+syntax keyword pfmainConf tls_random_reseed_period
+syntax keyword pfmainConf tls_random_source
+syntax keyword pfmainConf tls_session_ticket_cipher
+syntax keyword pfmainConf tls_ssl_options
+syntax keyword pfmainConf tls_wildcard_matches_multiple_labels
+syntax keyword pfmainConf tlsmgr_service_name
+syntax keyword pfmainConf tlsproxy_enforce_tls
+syntax keyword pfmainConf tlsproxy_service_name
+syntax keyword pfmainConf tlsproxy_tls_CAfile
+syntax keyword pfmainConf tlsproxy_tls_CApath
+syntax keyword pfmainConf tlsproxy_tls_always_issue_session_ids
+syntax keyword pfmainConf tlsproxy_tls_ask_ccert
+syntax keyword pfmainConf tlsproxy_tls_ccert_verifydepth
+syntax keyword pfmainConf tlsproxy_tls_cert_file
+syntax keyword pfmainConf tlsproxy_tls_ciphers
+syntax keyword pfmainConf tlsproxy_tls_dcert_file
+syntax keyword pfmainConf tlsproxy_tls_dh1024_param_file
+syntax keyword pfmainConf tlsproxy_tls_dh512_param_file
+syntax keyword pfmainConf tlsproxy_tls_dkey_file
+syntax keyword pfmainConf tlsproxy_tls_eccert_file
+syntax keyword pfmainConf tlsproxy_tls_eckey_file
+syntax keyword pfmainConf tlsproxy_tls_eecdh_grade
+syntax keyword pfmainConf tlsproxy_tls_exclude_ciphers
+syntax keyword pfmainConf tlsproxy_tls_fingerprint_digest
+syntax keyword pfmainConf tlsproxy_tls_key_file
+syntax keyword pfmainConf tlsproxy_tls_loglevel
+syntax keyword pfmainConf tlsproxy_tls_mandatory_ciphers
+syntax keyword pfmainConf tlsproxy_tls_mandatory_exclude_ciphers
+syntax keyword pfmainConf tlsproxy_tls_mandatory_protocols
+syntax keyword pfmainConf tlsproxy_tls_protocols
+syntax keyword pfmainConf tlsproxy_tls_req_ccert
+syntax keyword pfmainConf tlsproxy_tls_security_level
+syntax keyword pfmainConf tlsproxy_tls_session_cache_timeout
+syntax keyword pfmainConf tlsproxy_use_tls
+syntax keyword pfmainConf tlsproxy_watchdog_timeout
+syntax keyword pfmainConf trace_service_name
+syntax keyword pfmainConf transport_delivery_slot_cost
+syntax keyword pfmainConf transport_delivery_slot_discount
+syntax keyword pfmainConf transport_delivery_slot_loan
+syntax keyword pfmainConf transport_destination_concurrency_failed_cohort_limit
+syntax keyword pfmainConf transport_destination_concurrency_limit
+syntax keyword pfmainConf transport_destination_concurrency_negative_feedback
+syntax keyword pfmainConf transport_destination_concurrency_positive_feedback
+syntax keyword pfmainConf transport_destination_rate_delay
+syntax keyword pfmainConf transport_destination_recipient_limit
+syntax keyword pfmainConf transport_extra_recipient_limit
+syntax keyword pfmainConf transport_initial_destination_concurrency
+syntax keyword pfmainConf transport_maps
+syntax keyword pfmainConf transport_minimum_delivery_slots
+syntax keyword pfmainConf transport_recipient_limit
+syntax keyword pfmainConf transport_recipient_refill_delay
+syntax keyword pfmainConf transport_recipient_refill_limit
+syntax keyword pfmainConf transport_retry_time
+syntax keyword pfmainConf transport_time_limit
+syntax keyword pfmainConf trigger_timeout
+syntax keyword pfmainConf undisclosed_recipients_header
+syntax keyword pfmainConf unknown_address_reject_code
+syntax keyword pfmainConf unknown_address_tempfail_action
+syntax keyword pfmainConf unknown_client_reject_code
+syntax keyword pfmainConf unknown_helo_hostname_tempfail_action
+syntax keyword pfmainConf unknown_hostname_reject_code
+syntax keyword pfmainConf unknown_local_recipient_reject_code
+syntax keyword pfmainConf unknown_relay_recipient_reject_code
+syntax keyword pfmainConf unknown_virtual_alias_reject_code
+syntax keyword pfmainConf unknown_virtual_mailbox_reject_code
+syntax keyword pfmainConf unverified_recipient_defer_code
+syntax keyword pfmainConf unverified_recipient_reject_code
+syntax keyword pfmainConf unverified_recipient_reject_reason
+syntax keyword pfmainConf unverified_recipient_tempfail_action
+syntax keyword pfmainConf unverified_sender_defer_code
+syntax keyword pfmainConf unverified_sender_reject_code
+syntax keyword pfmainConf unverified_sender_reject_reason
+syntax keyword pfmainConf unverified_sender_tempfail_action
+syntax keyword pfmainConf verp_delimiter_filter
+syntax keyword pfmainConf virtual_alias_address_length_limit
+syntax keyword pfmainConf virtual_alias_domains
+syntax keyword pfmainConf virtual_alias_expansion_limit
+syntax keyword pfmainConf virtual_alias_maps
+syntax keyword pfmainConf virtual_alias_recursion_limit
+syntax keyword pfmainConf virtual_delivery_status_filter
+syntax keyword pfmainConf virtual_destination_concurrency_limit
+syntax keyword pfmainConf virtual_destination_recipient_limit
+syntax keyword pfmainConf virtual_gid_maps
+syntax keyword pfmainConf virtual_mailbox_base
+syntax keyword pfmainConf virtual_mailbox_domains
+syntax keyword pfmainConf virtual_mailbox_limit
+syntax keyword pfmainConf virtual_mailbox_lock
+syntax keyword pfmainConf virtual_mailbox_maps
+syntax keyword pfmainConf virtual_maps
+syntax keyword pfmainConf virtual_minimum_uid
+syntax keyword pfmainConf virtual_transport
+syntax keyword pfmainConf virtual_uid_maps
+syntax match pfmainRef "$\<2bounce_notice_recipient\>"
+syntax match pfmainRef "$\<access_map_defer_code\>"
+syntax match pfmainRef "$\<access_map_reject_code\>"
+syntax match pfmainRef "$\<address_verify_cache_cleanup_interval\>"
+syntax match pfmainRef "$\<address_verify_default_transport\>"
+syntax match pfmainRef "$\<address_verify_local_transport\>"
+syntax match pfmainRef "$\<address_verify_map\>"
+syntax match pfmainRef "$\<address_verify_negative_cache\>"
+syntax match pfmainRef "$\<address_verify_negative_expire_time\>"
+syntax match pfmainRef "$\<address_verify_negative_refresh_time\>"
+syntax match pfmainRef "$\<address_verify_poll_count\>"
+syntax match pfmainRef "$\<address_verify_poll_delay\>"
+syntax match pfmainRef "$\<address_verify_positive_expire_time\>"
+syntax match pfmainRef "$\<address_verify_positive_refresh_time\>"
+syntax match pfmainRef "$\<address_verify_relay_transport\>"
+syntax match pfmainRef "$\<address_verify_relayhost\>"
+syntax match pfmainRef "$\<address_verify_sender\>"
+syntax match pfmainRef "$\<address_verify_sender_dependent_default_transport_maps\>"
+syntax match pfmainRef "$\<address_verify_sender_dependent_relayhost_maps\>"
+syntax match pfmainRef "$\<address_verify_sender_ttl\>"
+syntax match pfmainRef "$\<address_verify_service_name\>"
+syntax match pfmainRef "$\<address_verify_transport_maps\>"
+syntax match pfmainRef "$\<address_verify_virtual_transport\>"
+syntax match pfmainRef "$\<alias_database\>"
+syntax match pfmainRef "$\<alias_maps\>"
+syntax match pfmainRef "$\<allow_mail_to_commands\>"
+syntax match pfmainRef "$\<allow_mail_to_files\>"
+syntax match pfmainRef "$\<allow_min_user\>"
+syntax match pfmainRef "$\<allow_percent_hack\>"
+syntax match pfmainRef "$\<allow_untrusted_routing\>"
+syntax match pfmainRef "$\<alternate_config_directories\>"
+syntax match pfmainRef "$\<always_add_missing_headers\>"
+syntax match pfmainRef "$\<always_bcc\>"
+syntax match pfmainRef "$\<anvil_rate_time_unit\>"
+syntax match pfmainRef "$\<anvil_status_update_time\>"
+syntax match pfmainRef "$\<append_at_myorigin\>"
+syntax match pfmainRef "$\<append_dot_mydomain\>"
+syntax match pfmainRef "$\<application_event_drain_time\>"
+syntax match pfmainRef "$\<authorized_flush_users\>"
+syntax match pfmainRef "$\<authorized_mailq_users\>"
+syntax match pfmainRef "$\<authorized_submit_users\>"
+syntax match pfmainRef "$\<authorized_verp_clients\>"
+syntax match pfmainRef "$\<backwards_bounce_logfile_compatibility\>"
+syntax match pfmainRef "$\<berkeley_db_create_buffer_size\>"
+syntax match pfmainRef "$\<berkeley_db_read_buffer_size\>"
+syntax match pfmainRef "$\<best_mx_transport\>"
+syntax match pfmainRef "$\<biff\>"
+syntax match pfmainRef "$\<body_checks\>"
+syntax match pfmainRef "$\<body_checks_size_limit\>"
+syntax match pfmainRef "$\<bounce_notice_recipient\>"
+syntax match pfmainRef "$\<bounce_queue_lifetime\>"
+syntax match pfmainRef "$\<bounce_service_name\>"
+syntax match pfmainRef "$\<bounce_size_limit\>"
+syntax match pfmainRef "$\<bounce_template_file\>"
+syntax match pfmainRef "$\<broken_sasl_auth_clients\>"
+syntax match pfmainRef "$\<canonical_classes\>"
+syntax match pfmainRef "$\<canonical_maps\>"
+syntax match pfmainRef "$\<cleanup_service_name\>"
+syntax match pfmainRef "$\<command_directory\>"
+syntax match pfmainRef "$\<command_execution_directory\>"
+syntax match pfmainRef "$\<command_expansion_filter\>"
+syntax match pfmainRef "$\<command_time_limit\>"
+syntax match pfmainRef "$\<compatibility_level\>"
+syntax match pfmainRef "$\<config_directory\>"
+syntax match pfmainRef "$\<confirm_delay_cleared\>"
+syntax match pfmainRef "$\<connection_cache_protocol_timeout\>"
+syntax match pfmainRef "$\<connection_cache_service_name\>"
+syntax match pfmainRef "$\<connection_cache_status_update_time\>"
+syntax match pfmainRef "$\<connection_cache_ttl_limit\>"
+syntax match pfmainRef "$\<content_filter\>"
+syntax match pfmainRef "$\<cyrus_sasl_config_path\>"
+syntax match pfmainRef "$\<daemon_directory\>"
+syntax match pfmainRef "$\<daemon_table_open_error_is_fatal\>"
+syntax match pfmainRef "$\<daemon_timeout\>"
+syntax match pfmainRef "$\<data_directory\>"
+syntax match pfmainRef "$\<debug_peer_level\>"
+syntax match pfmainRef "$\<debug_peer_list\>"
+syntax match pfmainRef "$\<debugger_command\>"
+syntax match pfmainRef "$\<default_database_type\>"
+syntax match pfmainRef "$\<default_delivery_slot_cost\>"
+syntax match pfmainRef "$\<default_delivery_slot_discount\>"
+syntax match pfmainRef "$\<default_delivery_slot_loan\>"
+syntax match pfmainRef "$\<default_delivery_status_filter\>"
+syntax match pfmainRef "$\<default_destination_concurrency_failed_cohort_limit\>"
+syntax match pfmainRef "$\<default_destination_concurrency_limit\>"
+syntax match pfmainRef "$\<default_destination_concurrency_negative_feedback\>"
+syntax match pfmainRef "$\<default_destination_concurrency_positive_feedback\>"
+syntax match pfmainRef "$\<default_destination_rate_delay\>"
+syntax match pfmainRef "$\<default_destination_recipient_limit\>"
+syntax match pfmainRef "$\<default_extra_recipient_limit\>"
+syntax match pfmainRef "$\<default_filter_nexthop\>"
+syntax match pfmainRef "$\<default_minimum_delivery_slots\>"
+syntax match pfmainRef "$\<default_privs\>"
+syntax match pfmainRef "$\<default_process_limit\>"
+syntax match pfmainRef "$\<default_rbl_reply\>"
+syntax match pfmainRef "$\<default_recipient_limit\>"
+syntax match pfmainRef "$\<default_recipient_refill_delay\>"
+syntax match pfmainRef "$\<default_recipient_refill_limit\>"
+syntax match pfmainRef "$\<default_transport\>"
+syntax match pfmainRef "$\<default_verp_delimiters\>"
+syntax match pfmainRef "$\<defer_code\>"
+syntax match pfmainRef "$\<defer_service_name\>"
+syntax match pfmainRef "$\<defer_transports\>"
+syntax match pfmainRef "$\<delay_logging_resolution_limit\>"
+syntax match pfmainRef "$\<delay_notice_recipient\>"
+syntax match pfmainRef "$\<delay_warning_time\>"
+syntax match pfmainRef "$\<deliver_lock_attempts\>"
+syntax match pfmainRef "$\<deliver_lock_delay\>"
+syntax match pfmainRef "$\<destination_concurrency_feedback_debug\>"
+syntax match pfmainRef "$\<detect_8bit_encoding_header\>"
+syntax match pfmainRef "$\<disable_dns_lookups\>"
+syntax match pfmainRef "$\<disable_mime_input_processing\>"
+syntax match pfmainRef "$\<disable_mime_output_conversion\>"
+syntax match pfmainRef "$\<disable_verp_bounces\>"
+syntax match pfmainRef "$\<disable_vrfy_command\>"
+syntax match pfmainRef "$\<dnsblog_reply_delay\>"
+syntax match pfmainRef "$\<dnsblog_service_name\>"
+syntax match pfmainRef "$\<dont_remove\>"
+syntax match pfmainRef "$\<double_bounce_sender\>"
+syntax match pfmainRef "$\<duplicate_filter_limit\>"
+syntax match pfmainRef "$\<empty_address_default_transport_maps_lookup_key\>"
+syntax match pfmainRef "$\<empty_address_recipient\>"
+syntax match pfmainRef "$\<empty_address_relayhost_maps_lookup_key\>"
+syntax match pfmainRef "$\<enable_errors_to\>"
+syntax match pfmainRef "$\<enable_long_queue_ids\>"
+syntax match pfmainRef "$\<enable_original_recipient\>"
+syntax match pfmainRef "$\<error_notice_recipient\>"
+syntax match pfmainRef "$\<error_service_name\>"
+syntax match pfmainRef "$\<execution_directory_expansion_filter\>"
+syntax match pfmainRef "$\<expand_owner_alias\>"
+syntax match pfmainRef "$\<export_environment\>"
+syntax match pfmainRef "$\<extract_recipient_limit\>"
+syntax match pfmainRef "$\<fallback_relay\>"
+syntax match pfmainRef "$\<fallback_transport\>"
+syntax match pfmainRef "$\<fallback_transport_maps\>"
+syntax match pfmainRef "$\<fast_flush_domains\>"
+syntax match pfmainRef "$\<fast_flush_purge_time\>"
+syntax match pfmainRef "$\<fast_flush_refresh_time\>"
+syntax match pfmainRef "$\<fault_injection_code\>"
+syntax match pfmainRef "$\<flush_service_name\>"
+syntax match pfmainRef "$\<fork_attempts\>"
+syntax match pfmainRef "$\<fork_delay\>"
+syntax match pfmainRef "$\<forward_expansion_filter\>"
+syntax match pfmainRef "$\<forward_path\>"
+syntax match pfmainRef "$\<frozen_delivered_to\>"
+syntax match pfmainRef "$\<hash_queue_depth\>"
+syntax match pfmainRef "$\<hash_queue_names\>"
+syntax match pfmainRef "$\<header_address_token_limit\>"
+syntax match pfmainRef "$\<header_checks\>"
+syntax match pfmainRef "$\<header_size_limit\>"
+syntax match pfmainRef "$\<helpful_warnings\>"
+syntax match pfmainRef "$\<home_mailbox\>"
+syntax match pfmainRef "$\<hopcount_limit\>"
+syntax match pfmainRef "$\<html_directory\>"
+syntax match pfmainRef "$\<ignore_mx_lookup_error\>"
+syntax match pfmainRef "$\<import_environment\>"
+syntax match pfmainRef "$\<in_flow_delay\>"
+syntax match pfmainRef "$\<inet_interfaces\>"
+syntax match pfmainRef "$\<inet_protocols\>"
+syntax match pfmainRef "$\<initial_destination_concurrency\>"
+syntax match pfmainRef "$\<internal_mail_filter_classes\>"
+syntax match pfmainRef "$\<invalid_hostname_reject_code\>"
+syntax match pfmainRef "$\<ipc_idle\>"
+syntax match pfmainRef "$\<ipc_timeout\>"
+syntax match pfmainRef "$\<ipc_ttl\>"
+syntax match pfmainRef "$\<line_length_limit\>"
+syntax match pfmainRef "$\<lmdb_map_size\>"
+syntax match pfmainRef "$\<lmtp_address_preference\>"
+syntax match pfmainRef "$\<lmtp_address_verify_target\>"
+syntax match pfmainRef "$\<lmtp_assume_final\>"
+syntax match pfmainRef "$\<lmtp_bind_address\>"
+syntax match pfmainRef "$\<lmtp_bind_address6\>"
+syntax match pfmainRef "$\<lmtp_body_checks\>"
+syntax match pfmainRef "$\<lmtp_cache_connection\>"
+syntax match pfmainRef "$\<lmtp_cname_overrides_servername\>"
+syntax match pfmainRef "$\<lmtp_connect_timeout\>"
+syntax match pfmainRef "$\<lmtp_connection_cache_destinations\>"
+syntax match pfmainRef "$\<lmtp_connection_cache_on_demand\>"
+syntax match pfmainRef "$\<lmtp_connection_cache_time_limit\>"
+syntax match pfmainRef "$\<lmtp_connection_reuse_count_limit\>"
+syntax match pfmainRef "$\<lmtp_connection_reuse_time_limit\>"
+syntax match pfmainRef "$\<lmtp_data_done_timeout\>"
+syntax match pfmainRef "$\<lmtp_data_init_timeout\>"
+syntax match pfmainRef "$\<lmtp_data_xfer_timeout\>"
+syntax match pfmainRef "$\<lmtp_defer_if_no_mx_address_found\>"
+syntax match pfmainRef "$\<lmtp_delivery_status_filter\>"
+syntax match pfmainRef "$\<lmtp_destination_concurrency_limit\>"
+syntax match pfmainRef "$\<lmtp_destination_recipient_limit\>"
+syntax match pfmainRef "$\<lmtp_discard_lhlo_keyword_address_maps\>"
+syntax match pfmainRef "$\<lmtp_discard_lhlo_keywords\>"
+syntax match pfmainRef "$\<lmtp_dns_reply_filter\>"
+syntax match pfmainRef "$\<lmtp_dns_resolver_options\>"
+syntax match pfmainRef "$\<lmtp_dns_support_level\>"
+syntax match pfmainRef "$\<lmtp_enforce_tls\>"
+syntax match pfmainRef "$\<lmtp_generic_maps\>"
+syntax match pfmainRef "$\<lmtp_header_checks\>"
+syntax match pfmainRef "$\<lmtp_host_lookup\>"
+syntax match pfmainRef "$\<lmtp_lhlo_name\>"
+syntax match pfmainRef "$\<lmtp_lhlo_timeout\>"
+syntax match pfmainRef "$\<lmtp_line_length_limit\>"
+syntax match pfmainRef "$\<lmtp_mail_timeout\>"
+syntax match pfmainRef "$\<lmtp_mime_header_checks\>"
+syntax match pfmainRef "$\<lmtp_mx_address_limit\>"
+syntax match pfmainRef "$\<lmtp_mx_session_limit\>"
+syntax match pfmainRef "$\<lmtp_nested_header_checks\>"
+syntax match pfmainRef "$\<lmtp_per_record_deadline\>"
+syntax match pfmainRef "$\<lmtp_pix_workaround_delay_time\>"
+syntax match pfmainRef "$\<lmtp_pix_workaround_maps\>"
+syntax match pfmainRef "$\<lmtp_pix_workaround_threshold_time\>"
+syntax match pfmainRef "$\<lmtp_pix_workarounds\>"
+syntax match pfmainRef "$\<lmtp_quit_timeout\>"
+syntax match pfmainRef "$\<lmtp_quote_rfc821_envelope\>"
+syntax match pfmainRef "$\<lmtp_randomize_addresses\>"
+syntax match pfmainRef "$\<lmtp_rcpt_timeout\>"
+syntax match pfmainRef "$\<lmtp_reply_filter\>"
+syntax match pfmainRef "$\<lmtp_rset_timeout\>"
+syntax match pfmainRef "$\<lmtp_sasl_auth_cache_name\>"
+syntax match pfmainRef "$\<lmtp_sasl_auth_cache_time\>"
+syntax match pfmainRef "$\<lmtp_sasl_auth_enable\>"
+syntax match pfmainRef "$\<lmtp_sasl_auth_soft_bounce\>"
+syntax match pfmainRef "$\<lmtp_sasl_mechanism_filter\>"
+syntax match pfmainRef "$\<lmtp_sasl_password_maps\>"
+syntax match pfmainRef "$\<lmtp_sasl_path\>"
+syntax match pfmainRef "$\<lmtp_sasl_security_options\>"
+syntax match pfmainRef "$\<lmtp_sasl_tls_security_options\>"
+syntax match pfmainRef "$\<lmtp_sasl_tls_verified_security_options\>"
+syntax match pfmainRef "$\<lmtp_sasl_type\>"
+syntax match pfmainRef "$\<lmtp_send_dummy_mail_auth\>"
+syntax match pfmainRef "$\<lmtp_send_xforward_command\>"
+syntax match pfmainRef "$\<lmtp_sender_dependent_authentication\>"
+syntax match pfmainRef "$\<lmtp_skip_5xx_greeting\>"
+syntax match pfmainRef "$\<lmtp_skip_quit_response\>"
+syntax match pfmainRef "$\<lmtp_starttls_timeout\>"
+syntax match pfmainRef "$\<lmtp_tcp_port\>"
+syntax match pfmainRef "$\<lmtp_tls_CAfile\>"
+syntax match pfmainRef "$\<lmtp_tls_CApath\>"
+syntax match pfmainRef "$\<lmtp_tls_block_early_mail_reply\>"
+syntax match pfmainRef "$\<lmtp_tls_cert_file\>"
+syntax match pfmainRef "$\<lmtp_tls_ciphers\>"
+syntax match pfmainRef "$\<lmtp_tls_dcert_file\>"
+syntax match pfmainRef "$\<lmtp_tls_dkey_file\>"
+syntax match pfmainRef "$\<lmtp_tls_eccert_file\>"
+syntax match pfmainRef "$\<lmtp_tls_eckey_file\>"
+syntax match pfmainRef "$\<lmtp_tls_enforce_peername\>"
+syntax match pfmainRef "$\<lmtp_tls_exclude_ciphers\>"
+syntax match pfmainRef "$\<lmtp_tls_fingerprint_cert_match\>"
+syntax match pfmainRef "$\<lmtp_tls_fingerprint_digest\>"
+syntax match pfmainRef "$\<lmtp_tls_force_insecure_host_tlsa_lookup\>"
+syntax match pfmainRef "$\<lmtp_tls_key_file\>"
+syntax match pfmainRef "$\<lmtp_tls_loglevel\>"
+syntax match pfmainRef "$\<lmtp_tls_mandatory_ciphers\>"
+syntax match pfmainRef "$\<lmtp_tls_mandatory_exclude_ciphers\>"
+syntax match pfmainRef "$\<lmtp_tls_mandatory_protocols\>"
+syntax match pfmainRef "$\<lmtp_tls_note_starttls_offer\>"
+syntax match pfmainRef "$\<lmtp_tls_per_site\>"
+syntax match pfmainRef "$\<lmtp_tls_policy_maps\>"
+syntax match pfmainRef "$\<lmtp_tls_protocols\>"
+syntax match pfmainRef "$\<lmtp_tls_scert_verifydepth\>"
+syntax match pfmainRef "$\<lmtp_tls_secure_cert_match\>"
+syntax match pfmainRef "$\<lmtp_tls_security_level\>"
+syntax match pfmainRef "$\<lmtp_tls_session_cache_database\>"
+syntax match pfmainRef "$\<lmtp_tls_session_cache_timeout\>"
+syntax match pfmainRef "$\<lmtp_tls_trust_anchor_file\>"
+syntax match pfmainRef "$\<lmtp_tls_verify_cert_match\>"
+syntax match pfmainRef "$\<lmtp_use_tls\>"
+syntax match pfmainRef "$\<lmtp_xforward_timeout\>"
+syntax match pfmainRef "$\<local_command_shell\>"
+syntax match pfmainRef "$\<local_delivery_status_filter\>"
+syntax match pfmainRef "$\<local_destination_concurrency_limit\>"
+syntax match pfmainRef "$\<local_destination_recipient_limit\>"
+syntax match pfmainRef "$\<local_header_rewrite_clients\>"
+syntax match pfmainRef "$\<local_recipient_maps\>"
+syntax match pfmainRef "$\<local_transport\>"
+syntax match pfmainRef "$\<luser_relay\>"
+syntax match pfmainRef "$\<mail_name\>"
+syntax match pfmainRef "$\<mail_owner\>"
+syntax match pfmainRef "$\<mail_release_date\>"
+syntax match pfmainRef "$\<mail_spool_directory\>"
+syntax match pfmainRef "$\<mail_version\>"
+syntax match pfmainRef "$\<mailbox_command\>"
+syntax match pfmainRef "$\<mailbox_command_maps\>"
+syntax match pfmainRef "$\<mailbox_delivery_lock\>"
+syntax match pfmainRef "$\<mailbox_size_limit\>"
+syntax match pfmainRef "$\<mailbox_transport\>"
+syntax match pfmainRef "$\<mailbox_transport_maps\>"
+syntax match pfmainRef "$\<mailq_path\>"
+syntax match pfmainRef "$\<manpage_directory\>"
+syntax match pfmainRef "$\<maps_rbl_domains\>"
+syntax match pfmainRef "$\<maps_rbl_reject_code\>"
+syntax match pfmainRef "$\<masquerade_classes\>"
+syntax match pfmainRef "$\<masquerade_domains\>"
+syntax match pfmainRef "$\<masquerade_exceptions\>"
+syntax match pfmainRef "$\<master_service_disable\>"
+syntax match pfmainRef "$\<max_idle\>"
+syntax match pfmainRef "$\<max_use\>"
+syntax match pfmainRef "$\<maximal_backoff_time\>"
+syntax match pfmainRef "$\<maximal_queue_lifetime\>"
+syntax match pfmainRef "$\<message_drop_headers\>"
+syntax match pfmainRef "$\<message_reject_characters\>"
+syntax match pfmainRef "$\<message_size_limit\>"
+syntax match pfmainRef "$\<message_strip_characters\>"
+syntax match pfmainRef "$\<meta_directory\>"
+syntax match pfmainRef "$\<milter_command_timeout\>"
+syntax match pfmainRef "$\<milter_connect_macros\>"
+syntax match pfmainRef "$\<milter_connect_timeout\>"
+syntax match pfmainRef "$\<milter_content_timeout\>"
+syntax match pfmainRef "$\<milter_data_macros\>"
+syntax match pfmainRef "$\<milter_default_action\>"
+syntax match pfmainRef "$\<milter_end_of_data_macros\>"
+syntax match pfmainRef "$\<milter_end_of_header_macros\>"
+syntax match pfmainRef "$\<milter_header_checks\>"
+syntax match pfmainRef "$\<milter_helo_macros\>"
+syntax match pfmainRef "$\<milter_macro_daemon_name\>"
+syntax match pfmainRef "$\<milter_macro_v\>"
+syntax match pfmainRef "$\<milter_mail_macros\>"
+syntax match pfmainRef "$\<milter_protocol\>"
+syntax match pfmainRef "$\<milter_rcpt_macros\>"
+syntax match pfmainRef "$\<milter_unknown_command_macros\>"
+syntax match pfmainRef "$\<mime_boundary_length_limit\>"
+syntax match pfmainRef "$\<mime_header_checks\>"
+syntax match pfmainRef "$\<mime_nesting_limit\>"
+syntax match pfmainRef "$\<minimal_backoff_time\>"
+syntax match pfmainRef "$\<multi_instance_directories\>"
+syntax match pfmainRef "$\<multi_instance_enable\>"
+syntax match pfmainRef "$\<multi_instance_group\>"
+syntax match pfmainRef "$\<multi_instance_name\>"
+syntax match pfmainRef "$\<multi_instance_wrapper\>"
+syntax match pfmainRef "$\<multi_recipient_bounce_reject_code\>"
+syntax match pfmainRef "$\<mydestination\>"
+syntax match pfmainRef "$\<mydomain\>"
+syntax match pfmainRef "$\<myhostname\>"
+syntax match pfmainRef "$\<mynetworks\>"
+syntax match pfmainRef "$\<mynetworks_style\>"
+syntax match pfmainRef "$\<myorigin\>"
+syntax match pfmainRef "$\<nested_header_checks\>"
+syntax match pfmainRef "$\<newaliases_path\>"
+syntax match pfmainRef "$\<non_fqdn_reject_code\>"
+syntax match pfmainRef "$\<non_smtpd_milters\>"
+syntax match pfmainRef "$\<notify_classes\>"
+syntax match pfmainRef "$\<nullmx_reject_code\>"
+syntax match pfmainRef "$\<owner_request_special\>"
+syntax match pfmainRef "$\<parent_domain_matches_subdomains\>"
+syntax match pfmainRef "$\<permit_mx_backup_networks\>"
+syntax match pfmainRef "$\<pickup_service_name\>"
+syntax match pfmainRef "$\<pipe_delivery_status_filter\>"
+syntax match pfmainRef "$\<plaintext_reject_code\>"
+syntax match pfmainRef "$\<postmulti_control_commands\>"
+syntax match pfmainRef "$\<postmulti_start_commands\>"
+syntax match pfmainRef "$\<postmulti_stop_commands\>"
+syntax match pfmainRef "$\<postscreen_access_list\>"
+syntax match pfmainRef "$\<postscreen_bare_newline_action\>"
+syntax match pfmainRef "$\<postscreen_bare_newline_enable\>"
+syntax match pfmainRef "$\<postscreen_bare_newline_ttl\>"
+syntax match pfmainRef "$\<postscreen_blacklist_action\>"
+syntax match pfmainRef "$\<postscreen_cache_cleanup_interval\>"
+syntax match pfmainRef "$\<postscreen_cache_map\>"
+syntax match pfmainRef "$\<postscreen_cache_retention_time\>"
+syntax match pfmainRef "$\<postscreen_client_connection_count_limit\>"
+syntax match pfmainRef "$\<postscreen_command_count_limit\>"
+syntax match pfmainRef "$\<postscreen_command_filter\>"
+syntax match pfmainRef "$\<postscreen_command_time_limit\>"
+syntax match pfmainRef "$\<postscreen_disable_vrfy_command\>"
+syntax match pfmainRef "$\<postscreen_discard_ehlo_keyword_address_maps\>"
+syntax match pfmainRef "$\<postscreen_discard_ehlo_keywords\>"
+syntax match pfmainRef "$\<postscreen_dnsbl_action\>"
+syntax match pfmainRef "$\<postscreen_dnsbl_reply_map\>"
+syntax match pfmainRef "$\<postscreen_dnsbl_sites\>"
+syntax match pfmainRef "$\<postscreen_dnsbl_threshold\>"
+syntax match pfmainRef "$\<postscreen_dnsbl_timeout\>"
+syntax match pfmainRef "$\<postscreen_dnsbl_ttl\>"
+syntax match pfmainRef "$\<postscreen_dnsbl_whitelist_threshold\>"
+syntax match pfmainRef "$\<postscreen_enforce_tls\>"
+syntax match pfmainRef "$\<postscreen_expansion_filter\>"
+syntax match pfmainRef "$\<postscreen_forbidden_commands\>"
+syntax match pfmainRef "$\<postscreen_greet_action\>"
+syntax match pfmainRef "$\<postscreen_greet_banner\>"
+syntax match pfmainRef "$\<postscreen_greet_ttl\>"
+syntax match pfmainRef "$\<postscreen_greet_wait\>"
+syntax match pfmainRef "$\<postscreen_helo_required\>"
+syntax match pfmainRef "$\<postscreen_non_smtp_command_action\>"
+syntax match pfmainRef "$\<postscreen_non_smtp_command_enable\>"
+syntax match pfmainRef "$\<postscreen_non_smtp_command_ttl\>"
+syntax match pfmainRef "$\<postscreen_pipelining_action\>"
+syntax match pfmainRef "$\<postscreen_pipelining_enable\>"
+syntax match pfmainRef "$\<postscreen_pipelining_ttl\>"
+syntax match pfmainRef "$\<postscreen_post_queue_limit\>"
+syntax match pfmainRef "$\<postscreen_pre_queue_limit\>"
+syntax match pfmainRef "$\<postscreen_reject_footer\>"
+syntax match pfmainRef "$\<postscreen_tls_security_level\>"
+syntax match pfmainRef "$\<postscreen_upstream_proxy_protocol\>"
+syntax match pfmainRef "$\<postscreen_upstream_proxy_timeout\>"
+syntax match pfmainRef "$\<postscreen_use_tls\>"
+syntax match pfmainRef "$\<postscreen_watchdog_timeout\>"
+syntax match pfmainRef "$\<postscreen_whitelist_interfaces\>"
+syntax match pfmainRef "$\<prepend_delivered_header\>"
+syntax match pfmainRef "$\<process_id\>"
+syntax match pfmainRef "$\<process_id_directory\>"
+syntax match pfmainRef "$\<process_name\>"
+syntax match pfmainRef "$\<propagate_unmatched_extensions\>"
+syntax match pfmainRef "$\<proxy_interfaces\>"
+syntax match pfmainRef "$\<proxy_read_maps\>"
+syntax match pfmainRef "$\<proxy_write_maps\>"
+syntax match pfmainRef "$\<proxymap_service_name\>"
+syntax match pfmainRef "$\<proxywrite_service_name\>"
+syntax match pfmainRef "$\<qmgr_clog_warn_time\>"
+syntax match pfmainRef "$\<qmgr_daemon_timeout\>"
+syntax match pfmainRef "$\<qmgr_fudge_factor\>"
+syntax match pfmainRef "$\<qmgr_ipc_timeout\>"
+syntax match pfmainRef "$\<qmgr_message_active_limit\>"
+syntax match pfmainRef "$\<qmgr_message_recipient_limit\>"
+syntax match pfmainRef "$\<qmgr_message_recipient_minimum\>"
+syntax match pfmainRef "$\<qmqpd_authorized_clients\>"
+syntax match pfmainRef "$\<qmqpd_client_port_logging\>"
+syntax match pfmainRef "$\<qmqpd_error_delay\>"
+syntax match pfmainRef "$\<qmqpd_timeout\>"
+syntax match pfmainRef "$\<queue_directory\>"
+syntax match pfmainRef "$\<queue_file_attribute_count_limit\>"
+syntax match pfmainRef "$\<queue_minfree\>"
+syntax match pfmainRef "$\<queue_run_delay\>"
+syntax match pfmainRef "$\<queue_service_name\>"
+syntax match pfmainRef "$\<rbl_reply_maps\>"
+syntax match pfmainRef "$\<readme_directory\>"
+syntax match pfmainRef "$\<receive_override_options\>"
+syntax match pfmainRef "$\<recipient_bcc_maps\>"
+syntax match pfmainRef "$\<recipient_canonical_classes\>"
+syntax match pfmainRef "$\<recipient_canonical_maps\>"
+syntax match pfmainRef "$\<recipient_delimiter\>"
+syntax match pfmainRef "$\<reject_code\>"
+syntax match pfmainRef "$\<reject_tempfail_action\>"
+syntax match pfmainRef "$\<relay_clientcerts\>"
+syntax match pfmainRef "$\<relay_destination_concurrency_limit\>"
+syntax match pfmainRef "$\<relay_destination_recipient_limit\>"
+syntax match pfmainRef "$\<relay_domains\>"
+syntax match pfmainRef "$\<relay_domains_reject_code\>"
+syntax match pfmainRef "$\<relay_recipient_maps\>"
+syntax match pfmainRef "$\<relay_transport\>"
+syntax match pfmainRef "$\<relayhost\>"
+syntax match pfmainRef "$\<relocated_maps\>"
+syntax match pfmainRef "$\<remote_header_rewrite_domain\>"
+syntax match pfmainRef "$\<require_home_directory\>"
+syntax match pfmainRef "$\<reset_owner_alias\>"
+syntax match pfmainRef "$\<resolve_dequoted_address\>"
+syntax match pfmainRef "$\<resolve_null_domain\>"
+syntax match pfmainRef "$\<resolve_numeric_domain\>"
+syntax match pfmainRef "$\<rewrite_service_name\>"
+syntax match pfmainRef "$\<sample_directory\>"
+syntax match pfmainRef "$\<send_cyrus_sasl_authzid\>"
+syntax match pfmainRef "$\<sender_based_routing\>"
+syntax match pfmainRef "$\<sender_bcc_maps\>"
+syntax match pfmainRef "$\<sender_canonical_classes\>"
+syntax match pfmainRef "$\<sender_canonical_maps\>"
+syntax match pfmainRef "$\<sender_dependent_default_transport_maps\>"
+syntax match pfmainRef "$\<sender_dependent_relayhost_maps\>"
+syntax match pfmainRef "$\<sendmail_fix_line_endings\>"
+syntax match pfmainRef "$\<sendmail_path\>"
+syntax match pfmainRef "$\<service_throttle_time\>"
+syntax match pfmainRef "$\<setgid_group\>"
+syntax match pfmainRef "$\<shlib_directory\>"
+syntax match pfmainRef "$\<show_user_unknown_table_name\>"
+syntax match pfmainRef "$\<showq_service_name\>"
+syntax match pfmainRef "$\<smtp_address_preference\>"
+syntax match pfmainRef "$\<smtp_address_verify_target\>"
+syntax match pfmainRef "$\<smtp_always_send_ehlo\>"
+syntax match pfmainRef "$\<smtp_bind_address\>"
+syntax match pfmainRef "$\<smtp_bind_address6\>"
+syntax match pfmainRef "$\<smtp_body_checks\>"
+syntax match pfmainRef "$\<smtp_cname_overrides_servername\>"
+syntax match pfmainRef "$\<smtp_connect_timeout\>"
+syntax match pfmainRef "$\<smtp_connection_cache_destinations\>"
+syntax match pfmainRef "$\<smtp_connection_cache_on_demand\>"
+syntax match pfmainRef "$\<smtp_connection_cache_time_limit\>"
+syntax match pfmainRef "$\<smtp_connection_reuse_count_limit\>"
+syntax match pfmainRef "$\<smtp_connection_reuse_time_limit\>"
+syntax match pfmainRef "$\<smtp_data_done_timeout\>"
+syntax match pfmainRef "$\<smtp_data_init_timeout\>"
+syntax match pfmainRef "$\<smtp_data_xfer_timeout\>"
+syntax match pfmainRef "$\<smtp_defer_if_no_mx_address_found\>"
+syntax match pfmainRef "$\<smtp_delivery_status_filter\>"
+syntax match pfmainRef "$\<smtp_destination_concurrency_limit\>"
+syntax match pfmainRef "$\<smtp_destination_recipient_limit\>"
+syntax match pfmainRef "$\<smtp_discard_ehlo_keyword_address_maps\>"
+syntax match pfmainRef "$\<smtp_discard_ehlo_keywords\>"
+syntax match pfmainRef "$\<smtp_dns_reply_filter\>"
+syntax match pfmainRef "$\<smtp_dns_resolver_options\>"
+syntax match pfmainRef "$\<smtp_dns_support_level\>"
+syntax match pfmainRef "$\<smtp_enforce_tls\>"
+syntax match pfmainRef "$\<smtp_fallback_relay\>"
+syntax match pfmainRef "$\<smtp_generic_maps\>"
+syntax match pfmainRef "$\<smtp_header_checks\>"
+syntax match pfmainRef "$\<smtp_helo_name\>"
+syntax match pfmainRef "$\<smtp_helo_timeout\>"
+syntax match pfmainRef "$\<smtp_host_lookup\>"
+syntax match pfmainRef "$\<smtp_line_length_limit\>"
+syntax match pfmainRef "$\<smtp_mail_timeout\>"
+syntax match pfmainRef "$\<smtp_mime_header_checks\>"
+syntax match pfmainRef "$\<smtp_mx_address_limit\>"
+syntax match pfmainRef "$\<smtp_mx_session_limit\>"
+syntax match pfmainRef "$\<smtp_nested_header_checks\>"
+syntax match pfmainRef "$\<smtp_never_send_ehlo\>"
+syntax match pfmainRef "$\<smtp_per_record_deadline\>"
+syntax match pfmainRef "$\<smtp_pix_workaround_delay_time\>"
+syntax match pfmainRef "$\<smtp_pix_workaround_maps\>"
+syntax match pfmainRef "$\<smtp_pix_workaround_threshold_time\>"
+syntax match pfmainRef "$\<smtp_pix_workarounds\>"
+syntax match pfmainRef "$\<smtp_quit_timeout\>"
+syntax match pfmainRef "$\<smtp_quote_rfc821_envelope\>"
+syntax match pfmainRef "$\<smtp_randomize_addresses\>"
+syntax match pfmainRef "$\<smtp_rcpt_timeout\>"
+syntax match pfmainRef "$\<smtp_reply_filter\>"
+syntax match pfmainRef "$\<smtp_rset_timeout\>"
+syntax match pfmainRef "$\<smtp_sasl_auth_cache_name\>"
+syntax match pfmainRef "$\<smtp_sasl_auth_cache_time\>"
+syntax match pfmainRef "$\<smtp_sasl_auth_enable\>"
+syntax match pfmainRef "$\<smtp_sasl_auth_soft_bounce\>"
+syntax match pfmainRef "$\<smtp_sasl_mechanism_filter\>"
+syntax match pfmainRef "$\<smtp_sasl_password_maps\>"
+syntax match pfmainRef "$\<smtp_sasl_path\>"
+syntax match pfmainRef "$\<smtp_sasl_security_options\>"
+syntax match pfmainRef "$\<smtp_sasl_tls_security_options\>"
+syntax match pfmainRef "$\<smtp_sasl_tls_verified_security_options\>"
+syntax match pfmainRef "$\<smtp_sasl_type\>"
+syntax match pfmainRef "$\<smtp_send_dummy_mail_auth\>"
+syntax match pfmainRef "$\<smtp_send_xforward_command\>"
+syntax match pfmainRef "$\<smtp_sender_dependent_authentication\>"
+syntax match pfmainRef "$\<smtp_skip_4xx_greeting\>"
+syntax match pfmainRef "$\<smtp_skip_5xx_greeting\>"
+syntax match pfmainRef "$\<smtp_skip_quit_response\>"
+syntax match pfmainRef "$\<smtp_starttls_timeout\>"
+syntax match pfmainRef "$\<smtp_tls_CAfile\>"
+syntax match pfmainRef "$\<smtp_tls_CApath\>"
+syntax match pfmainRef "$\<smtp_tls_block_early_mail_reply\>"
+syntax match pfmainRef "$\<smtp_tls_cert_file\>"
+syntax match pfmainRef "$\<smtp_tls_cipherlist\>"
+syntax match pfmainRef "$\<smtp_tls_ciphers\>"
+syntax match pfmainRef "$\<smtp_tls_dcert_file\>"
+syntax match pfmainRef "$\<smtp_tls_dkey_file\>"
+syntax match pfmainRef "$\<smtp_tls_eccert_file\>"
+syntax match pfmainRef "$\<smtp_tls_eckey_file\>"
+syntax match pfmainRef "$\<smtp_tls_enforce_peername\>"
+syntax match pfmainRef "$\<smtp_tls_exclude_ciphers\>"
+syntax match pfmainRef "$\<smtp_tls_fingerprint_cert_match\>"
+syntax match pfmainRef "$\<smtp_tls_fingerprint_digest\>"
+syntax match pfmainRef "$\<smtp_tls_force_insecure_host_tlsa_lookup\>"
+syntax match pfmainRef "$\<smtp_tls_key_file\>"
+syntax match pfmainRef "$\<smtp_tls_loglevel\>"
+syntax match pfmainRef "$\<smtp_tls_mandatory_ciphers\>"
+syntax match pfmainRef "$\<smtp_tls_mandatory_exclude_ciphers\>"
+syntax match pfmainRef "$\<smtp_tls_mandatory_protocols\>"
+syntax match pfmainRef "$\<smtp_tls_note_starttls_offer\>"
+syntax match pfmainRef "$\<smtp_tls_per_site\>"
+syntax match pfmainRef "$\<smtp_tls_policy_maps\>"
+syntax match pfmainRef "$\<smtp_tls_protocols\>"
+syntax match pfmainRef "$\<smtp_tls_scert_verifydepth\>"
+syntax match pfmainRef "$\<smtp_tls_secure_cert_match\>"
+syntax match pfmainRef "$\<smtp_tls_security_level\>"
+syntax match pfmainRef "$\<smtp_tls_session_cache_database\>"
+syntax match pfmainRef "$\<smtp_tls_session_cache_timeout\>"
+syntax match pfmainRef "$\<smtp_tls_trust_anchor_file\>"
+syntax match pfmainRef "$\<smtp_tls_verify_cert_match\>"
+syntax match pfmainRef "$\<smtp_tls_wrappermode\>"
+syntax match pfmainRef "$\<smtp_use_tls\>"
+syntax match pfmainRef "$\<smtp_xforward_timeout\>"
+syntax match pfmainRef "$\<smtpd_authorized_verp_clients\>"
+syntax match pfmainRef "$\<smtpd_authorized_xclient_hosts\>"
+syntax match pfmainRef "$\<smtpd_authorized_xforward_hosts\>"
+syntax match pfmainRef "$\<smtpd_banner\>"
+syntax match pfmainRef "$\<smtpd_client_connection_count_limit\>"
+syntax match pfmainRef "$\<smtpd_client_connection_rate_limit\>"
+syntax match pfmainRef "$\<smtpd_client_event_limit_exceptions\>"
+syntax match pfmainRef "$\<smtpd_client_message_rate_limit\>"
+syntax match pfmainRef "$\<smtpd_client_new_tls_session_rate_limit\>"
+syntax match pfmainRef "$\<smtpd_client_port_logging\>"
+syntax match pfmainRef "$\<smtpd_client_recipient_rate_limit\>"
+syntax match pfmainRef "$\<smtpd_client_restrictions\>"
+syntax match pfmainRef "$\<smtpd_command_filter\>"
+syntax match pfmainRef "$\<smtpd_data_restrictions\>"
+syntax match pfmainRef "$\<smtpd_delay_open_until_valid_rcpt\>"
+syntax match pfmainRef "$\<smtpd_delay_reject\>"
+syntax match pfmainRef "$\<smtpd_discard_ehlo_keyword_address_maps\>"
+syntax match pfmainRef "$\<smtpd_discard_ehlo_keywords\>"
+syntax match pfmainRef "$\<smtpd_dns_reply_filter\>"
+syntax match pfmainRef "$\<smtpd_end_of_data_restrictions\>"
+syntax match pfmainRef "$\<smtpd_enforce_tls\>"
+syntax match pfmainRef "$\<smtpd_error_sleep_time\>"
+syntax match pfmainRef "$\<smtpd_etrn_restrictions\>"
+syntax match pfmainRef "$\<smtpd_expansion_filter\>"
+syntax match pfmainRef "$\<smtpd_forbidden_commands\>"
+syntax match pfmainRef "$\<smtpd_hard_error_limit\>"
+syntax match pfmainRef "$\<smtpd_helo_required\>"
+syntax match pfmainRef "$\<smtpd_helo_restrictions\>"
+syntax match pfmainRef "$\<smtpd_history_flush_threshold\>"
+syntax match pfmainRef "$\<smtpd_junk_command_limit\>"
+syntax match pfmainRef "$\<smtpd_log_access_permit_actions\>"
+syntax match pfmainRef "$\<smtpd_milters\>"
+syntax match pfmainRef "$\<smtpd_noop_commands\>"
+syntax match pfmainRef "$\<smtpd_null_access_lookup_key\>"
+syntax match pfmainRef "$\<smtpd_peername_lookup\>"
+syntax match pfmainRef "$\<smtpd_per_record_deadline\>"
+syntax match pfmainRef "$\<smtpd_policy_service_default_action\>"
+syntax match pfmainRef "$\<smtpd_policy_service_max_idle\>"
+syntax match pfmainRef "$\<smtpd_policy_service_max_ttl\>"
+syntax match pfmainRef "$\<smtpd_policy_service_request_limit\>"
+syntax match pfmainRef "$\<smtpd_policy_service_retry_delay\>"
+syntax match pfmainRef "$\<smtpd_policy_service_timeout\>"
+syntax match pfmainRef "$\<smtpd_policy_service_try_limit\>"
+syntax match pfmainRef "$\<smtpd_proxy_ehlo\>"
+syntax match pfmainRef "$\<smtpd_proxy_filter\>"
+syntax match pfmainRef "$\<smtpd_proxy_options\>"
+syntax match pfmainRef "$\<smtpd_proxy_timeout\>"
+syntax match pfmainRef "$\<smtpd_recipient_limit\>"
+syntax match pfmainRef "$\<smtpd_recipient_overshoot_limit\>"
+syntax match pfmainRef "$\<smtpd_recipient_restrictions\>"
+syntax match pfmainRef "$\<smtpd_reject_footer\>"
+syntax match pfmainRef "$\<smtpd_reject_unlisted_recipient\>"
+syntax match pfmainRef "$\<smtpd_reject_unlisted_sender\>"
+syntax match pfmainRef "$\<smtpd_relay_restrictions\>"
+syntax match pfmainRef "$\<smtpd_restriction_classes\>"
+syntax match pfmainRef "$\<smtpd_sasl_application_name\>"
+syntax match pfmainRef "$\<smtpd_sasl_auth_enable\>"
+syntax match pfmainRef "$\<smtpd_sasl_authenticated_header\>"
+syntax match pfmainRef "$\<smtpd_sasl_exceptions_networks\>"
+syntax match pfmainRef "$\<smtpd_sasl_local_domain\>"
+syntax match pfmainRef "$\<smtpd_sasl_path\>"
+syntax match pfmainRef "$\<smtpd_sasl_security_options\>"
+syntax match pfmainRef "$\<smtpd_sasl_service\>"
+syntax match pfmainRef "$\<smtpd_sasl_tls_security_options\>"
+syntax match pfmainRef "$\<smtpd_sasl_type\>"
+syntax match pfmainRef "$\<smtpd_sender_login_maps\>"
+syntax match pfmainRef "$\<smtpd_sender_restrictions\>"
+syntax match pfmainRef "$\<smtpd_service_name\>"
+syntax match pfmainRef "$\<smtpd_soft_error_limit\>"
+syntax match pfmainRef "$\<smtpd_starttls_timeout\>"
+syntax match pfmainRef "$\<smtpd_timeout\>"
+syntax match pfmainRef "$\<smtpd_tls_CAfile\>"
+syntax match pfmainRef "$\<smtpd_tls_CApath\>"
+syntax match pfmainRef "$\<smtpd_tls_always_issue_session_ids\>"
+syntax match pfmainRef "$\<smtpd_tls_ask_ccert\>"
+syntax match pfmainRef "$\<smtpd_tls_auth_only\>"
+syntax match pfmainRef "$\<smtpd_tls_ccert_verifydepth\>"
+syntax match pfmainRef "$\<smtpd_tls_cert_file\>"
+syntax match pfmainRef "$\<smtpd_tls_cipherlist\>"
+syntax match pfmainRef "$\<smtpd_tls_ciphers\>"
+syntax match pfmainRef "$\<smtpd_tls_dcert_file\>"
+syntax match pfmainRef "$\<smtpd_tls_dh1024_param_file\>"
+syntax match pfmainRef "$\<smtpd_tls_dh512_param_file\>"
+syntax match pfmainRef "$\<smtpd_tls_dkey_file\>"
+syntax match pfmainRef "$\<smtpd_tls_eccert_file\>"
+syntax match pfmainRef "$\<smtpd_tls_eckey_file\>"
+syntax match pfmainRef "$\<smtpd_tls_eecdh_grade\>"
+syntax match pfmainRef "$\<smtpd_tls_exclude_ciphers\>"
+syntax match pfmainRef "$\<smtpd_tls_fingerprint_digest\>"
+syntax match pfmainRef "$\<smtpd_tls_key_file\>"
+syntax match pfmainRef "$\<smtpd_tls_loglevel\>"
+syntax match pfmainRef "$\<smtpd_tls_mandatory_ciphers\>"
+syntax match pfmainRef "$\<smtpd_tls_mandatory_exclude_ciphers\>"
+syntax match pfmainRef "$\<smtpd_tls_mandatory_protocols\>"
+syntax match pfmainRef "$\<smtpd_tls_protocols\>"
+syntax match pfmainRef "$\<smtpd_tls_received_header\>"
+syntax match pfmainRef "$\<smtpd_tls_req_ccert\>"
+syntax match pfmainRef "$\<smtpd_tls_security_level\>"
+syntax match pfmainRef "$\<smtpd_tls_session_cache_database\>"
+syntax match pfmainRef "$\<smtpd_tls_session_cache_timeout\>"
+syntax match pfmainRef "$\<smtpd_tls_wrappermode\>"
+syntax match pfmainRef "$\<smtpd_upstream_proxy_protocol\>"
+syntax match pfmainRef "$\<smtpd_upstream_proxy_timeout\>"
+syntax match pfmainRef "$\<smtpd_use_tls\>"
+syntax match pfmainRef "$\<smtputf8_autodetect_classes\>"
+syntax match pfmainRef "$\<smtputf8_enable\>"
+syntax match pfmainRef "$\<soft_bounce\>"
+syntax match pfmainRef "$\<stale_lock_time\>"
+syntax match pfmainRef "$\<stress\>"
+syntax match pfmainRef "$\<strict_7bit_headers\>"
+syntax match pfmainRef "$\<strict_8bitmime\>"
+syntax match pfmainRef "$\<strict_8bitmime_body\>"
+syntax match pfmainRef "$\<strict_mailbox_ownership\>"
+syntax match pfmainRef "$\<strict_mime_encoding_domain\>"
+syntax match pfmainRef "$\<strict_rfc821_envelopes\>"
+syntax match pfmainRef "$\<strict_smtputf8\>"
+syntax match pfmainRef "$\<sun_mailtool_compatibility\>"
+syntax match pfmainRef "$\<swap_bangpath\>"
+syntax match pfmainRef "$\<syslog_facility\>"
+syntax match pfmainRef "$\<syslog_name\>"
+syntax match pfmainRef "$\<tcp_windowsize\>"
+syntax match pfmainRef "$\<tls_append_default_CA\>"
+syntax match pfmainRef "$\<tls_daemon_random_bytes\>"
+syntax match pfmainRef "$\<tls_dane_digest_agility\>"
+syntax match pfmainRef "$\<tls_dane_digests\>"
+syntax match pfmainRef "$\<tls_dane_trust_anchor_digest_enable\>"
+syntax match pfmainRef "$\<tls_disable_workarounds\>"
+syntax match pfmainRef "$\<tls_eecdh_strong_curve\>"
+syntax match pfmainRef "$\<tls_eecdh_ultra_curve\>"
+syntax match pfmainRef "$\<tls_export_cipherlist\>"
+syntax match pfmainRef "$\<tls_high_cipherlist\>"
+syntax match pfmainRef "$\<tls_legacy_public_key_fingerprints\>"
+syntax match pfmainRef "$\<tls_low_cipherlist\>"
+syntax match pfmainRef "$\<tls_medium_cipherlist\>"
+syntax match pfmainRef "$\<tls_null_cipherlist\>"
+syntax match pfmainRef "$\<tls_preempt_cipherlist\>"
+syntax match pfmainRef "$\<tls_random_bytes\>"
+syntax match pfmainRef "$\<tls_random_exchange_name\>"
+syntax match pfmainRef "$\<tls_random_prng_update_period\>"
+syntax match pfmainRef "$\<tls_random_reseed_period\>"
+syntax match pfmainRef "$\<tls_random_source\>"
+syntax match pfmainRef "$\<tls_session_ticket_cipher\>"
+syntax match pfmainRef "$\<tls_ssl_options\>"
+syntax match pfmainRef "$\<tls_wildcard_matches_multiple_labels\>"
+syntax match pfmainRef "$\<tlsmgr_service_name\>"
+syntax match pfmainRef "$\<tlsproxy_enforce_tls\>"
+syntax match pfmainRef "$\<tlsproxy_service_name\>"
+syntax match pfmainRef "$\<tlsproxy_tls_CAfile\>"
+syntax match pfmainRef "$\<tlsproxy_tls_CApath\>"
+syntax match pfmainRef "$\<tlsproxy_tls_always_issue_session_ids\>"
+syntax match pfmainRef "$\<tlsproxy_tls_ask_ccert\>"
+syntax match pfmainRef "$\<tlsproxy_tls_ccert_verifydepth\>"
+syntax match pfmainRef "$\<tlsproxy_tls_cert_file\>"
+syntax match pfmainRef "$\<tlsproxy_tls_ciphers\>"
+syntax match pfmainRef "$\<tlsproxy_tls_dcert_file\>"
+syntax match pfmainRef "$\<tlsproxy_tls_dh1024_param_file\>"
+syntax match pfmainRef "$\<tlsproxy_tls_dh512_param_file\>"
+syntax match pfmainRef "$\<tlsproxy_tls_dkey_file\>"
+syntax match pfmainRef "$\<tlsproxy_tls_eccert_file\>"
+syntax match pfmainRef "$\<tlsproxy_tls_eckey_file\>"
+syntax match pfmainRef "$\<tlsproxy_tls_eecdh_grade\>"
+syntax match pfmainRef "$\<tlsproxy_tls_exclude_ciphers\>"
+syntax match pfmainRef "$\<tlsproxy_tls_fingerprint_digest\>"
+syntax match pfmainRef "$\<tlsproxy_tls_key_file\>"
+syntax match pfmainRef "$\<tlsproxy_tls_loglevel\>"
+syntax match pfmainRef "$\<tlsproxy_tls_mandatory_ciphers\>"
+syntax match pfmainRef "$\<tlsproxy_tls_mandatory_exclude_ciphers\>"
+syntax match pfmainRef "$\<tlsproxy_tls_mandatory_protocols\>"
+syntax match pfmainRef "$\<tlsproxy_tls_protocols\>"
+syntax match pfmainRef "$\<tlsproxy_tls_req_ccert\>"
+syntax match pfmainRef "$\<tlsproxy_tls_security_level\>"
+syntax match pfmainRef "$\<tlsproxy_tls_session_cache_timeout\>"
+syntax match pfmainRef "$\<tlsproxy_use_tls\>"
+syntax match pfmainRef "$\<tlsproxy_watchdog_timeout\>"
+syntax match pfmainRef "$\<trace_service_name\>"
+syntax match pfmainRef "$\<transport_delivery_slot_cost\>"
+syntax match pfmainRef "$\<transport_delivery_slot_discount\>"
+syntax match pfmainRef "$\<transport_delivery_slot_loan\>"
+syntax match pfmainRef "$\<transport_destination_concurrency_failed_cohort_limit\>"
+syntax match pfmainRef "$\<transport_destination_concurrency_limit\>"
+syntax match pfmainRef "$\<transport_destination_concurrency_negative_feedback\>"
+syntax match pfmainRef "$\<transport_destination_concurrency_positive_feedback\>"
+syntax match pfmainRef "$\<transport_destination_rate_delay\>"
+syntax match pfmainRef "$\<transport_destination_recipient_limit\>"
+syntax match pfmainRef "$\<transport_extra_recipient_limit\>"
+syntax match pfmainRef "$\<transport_initial_destination_concurrency\>"
+syntax match pfmainRef "$\<transport_maps\>"
+syntax match pfmainRef "$\<transport_minimum_delivery_slots\>"
+syntax match pfmainRef "$\<transport_recipient_limit\>"
+syntax match pfmainRef "$\<transport_recipient_refill_delay\>"
+syntax match pfmainRef "$\<transport_recipient_refill_limit\>"
+syntax match pfmainRef "$\<transport_retry_time\>"
+syntax match pfmainRef "$\<transport_time_limit\>"
+syntax match pfmainRef "$\<trigger_timeout\>"
+syntax match pfmainRef "$\<undisclosed_recipients_header\>"
+syntax match pfmainRef "$\<unknown_address_reject_code\>"
+syntax match pfmainRef "$\<unknown_address_tempfail_action\>"
+syntax match pfmainRef "$\<unknown_client_reject_code\>"
+syntax match pfmainRef "$\<unknown_helo_hostname_tempfail_action\>"
+syntax match pfmainRef "$\<unknown_hostname_reject_code\>"
+syntax match pfmainRef "$\<unknown_local_recipient_reject_code\>"
+syntax match pfmainRef "$\<unknown_relay_recipient_reject_code\>"
+syntax match pfmainRef "$\<unknown_virtual_alias_reject_code\>"
+syntax match pfmainRef "$\<unknown_virtual_mailbox_reject_code\>"
+syntax match pfmainRef "$\<unverified_recipient_defer_code\>"
+syntax match pfmainRef "$\<unverified_recipient_reject_code\>"
+syntax match pfmainRef "$\<unverified_recipient_reject_reason\>"
+syntax match pfmainRef "$\<unverified_recipient_tempfail_action\>"
+syntax match pfmainRef "$\<unverified_sender_defer_code\>"
+syntax match pfmainRef "$\<unverified_sender_reject_code\>"
+syntax match pfmainRef "$\<unverified_sender_reject_reason\>"
+syntax match pfmainRef "$\<unverified_sender_tempfail_action\>"
+syntax match pfmainRef "$\<verp_delimiter_filter\>"
+syntax match pfmainRef "$\<virtual_alias_address_length_limit\>"
+syntax match pfmainRef "$\<virtual_alias_domains\>"
+syntax match pfmainRef "$\<virtual_alias_expansion_limit\>"
+syntax match pfmainRef "$\<virtual_alias_maps\>"
+syntax match pfmainRef "$\<virtual_alias_recursion_limit\>"
+syntax match pfmainRef "$\<virtual_delivery_status_filter\>"
+syntax match pfmainRef "$\<virtual_destination_concurrency_limit\>"
+syntax match pfmainRef "$\<virtual_destination_recipient_limit\>"
+syntax match pfmainRef "$\<virtual_gid_maps\>"
+syntax match pfmainRef "$\<virtual_mailbox_base\>"
+syntax match pfmainRef "$\<virtual_mailbox_domains\>"
+syntax match pfmainRef "$\<virtual_mailbox_limit\>"
+syntax match pfmainRef "$\<virtual_mailbox_lock\>"
+syntax match pfmainRef "$\<virtual_mailbox_maps\>"
+syntax match pfmainRef "$\<virtual_maps\>"
+syntax match pfmainRef "$\<virtual_minimum_uid\>"
+syntax match pfmainRef "$\<virtual_transport\>"
+syntax match pfmainRef "$\<virtual_uid_maps\>"
+
+syntax keyword pfmainWord accept
+syntax keyword pfmainWord all
+syntax keyword pfmainWord always
+syntax keyword pfmainWord check_address_map
+syntax keyword pfmainWord check_ccert_access
+syntax keyword pfmainWord check_client_a_access
+syntax keyword pfmainWord check_client_access
+syntax keyword pfmainWord check_client_mx_access
+syntax keyword pfmainWord check_client_ns_access
+syntax keyword pfmainWord check_etrn_access
+syntax keyword pfmainWord check_helo_a_access
+syntax keyword pfmainWord check_helo_access
+syntax keyword pfmainWord check_helo_mx_access
+syntax keyword pfmainWord check_helo_ns_access
+syntax keyword pfmainWord check_policy_service
+syntax keyword pfmainWord check_recipient_a_access
+syntax keyword pfmainWord check_recipient_access
+syntax keyword pfmainWord check_recipient_maps
+syntax keyword pfmainWord check_recipient_mx_access
+syntax keyword pfmainWord check_recipient_ns_access
+syntax keyword pfmainWord check_relay_domains
+syntax keyword pfmainWord check_reverse_client_hostname_a_access
+syntax keyword pfmainWord check_reverse_client_hostname_access
+syntax keyword pfmainWord check_reverse_client_hostname_mx_access
+syntax keyword pfmainWord check_reverse_client_hostname_ns_access
+syntax keyword pfmainWord check_sasl_access
+syntax keyword pfmainWord check_sender_a_access
+syntax keyword pfmainWord check_sender_access
+syntax keyword pfmainWord check_sender_mx_access
+syntax keyword pfmainWord check_sender_ns_access
+syntax keyword pfmainWord class
+syntax keyword pfmainWord client_address
+syntax keyword pfmainWord client_port
+syntax keyword pfmainWord dane
+syntax keyword pfmainWord dane-only
+syntax keyword pfmainWord defer
+syntax keyword pfmainWord defer_if_permit
+syntax keyword pfmainWord defer_if_reject
+syntax keyword pfmainWord defer_unauth_destination
+syntax keyword pfmainWord disabled
+syntax keyword pfmainWord dns
+syntax keyword pfmainWord dnssec
+syntax keyword pfmainWord drop
+syntax keyword pfmainWord dunno
+syntax keyword pfmainWord enabled
+syntax keyword pfmainWord encrypt
+syntax keyword pfmainWord enforce
+syntax keyword pfmainWord envelope_recipient
+syntax keyword pfmainWord envelope_sender
+syntax keyword pfmainWord export
+syntax keyword pfmainWord fingerprint
+syntax keyword pfmainWord header_recipient
+syntax keyword pfmainWord header_sender
+syntax keyword pfmainWord high
+syntax keyword pfmainWord host
+syntax keyword pfmainWord ignore
+syntax keyword pfmainWord ipv4
+syntax keyword pfmainWord ipv6
+syntax keyword pfmainWord localtime
+syntax keyword pfmainWord low
+syntax keyword pfmainWord may
+syntax keyword pfmainWord maybe
+syntax keyword pfmainWord medium
+syntax keyword pfmainWord native
+syntax keyword pfmainWord never
+syntax keyword pfmainWord no_address_mappings
+syntax keyword pfmainWord no_header_body_checks
+syntax keyword pfmainWord no_header_reply
+syntax keyword pfmainWord no_milters
+syntax keyword pfmainWord no_unknown_recipient_checks
+syntax keyword pfmainWord none
+syntax keyword pfmainWord null
+syntax keyword pfmainWord off
+syntax keyword pfmainWord on
+syntax keyword pfmainWord permit
+syntax keyword pfmainWord permit_auth_destination
+syntax keyword pfmainWord permit_dnswl_client
+syntax keyword pfmainWord permit_inet_interfaces
+syntax keyword pfmainWord permit_mx_backup
+syntax keyword pfmainWord permit_mynetworks
+syntax keyword pfmainWord permit_naked_ip_address
+syntax keyword pfmainWord permit_rhswl_client
+syntax keyword pfmainWord permit_sasl_authenticated
+syntax keyword pfmainWord permit_tls_all_clientcerts
+syntax keyword pfmainWord permit_tls_clientcerts
+syntax keyword pfmainWord quarantine
+syntax keyword pfmainWord reject
+syntax keyword pfmainWord reject_authenticated_sender_login_mismatch
+syntax keyword pfmainWord reject_invalid_helo_hostname
+syntax keyword pfmainWord reject_invalid_hostname
+syntax keyword pfmainWord reject_known_sender_login_mismatch
+syntax keyword pfmainWord reject_maps_rbl
+syntax keyword pfmainWord reject_multi_recipient_bounce
+syntax keyword pfmainWord reject_non_fqdn_helo_hostname
+syntax keyword pfmainWord reject_non_fqdn_hostname
+syntax keyword pfmainWord reject_non_fqdn_recipient
+syntax keyword pfmainWord reject_non_fqdn_sender
+syntax keyword pfmainWord reject_plaintext_session
+syntax keyword pfmainWord reject_rbl
+syntax keyword pfmainWord reject_rbl_client
+syntax keyword pfmainWord reject_rhsbl_client
+syntax keyword pfmainWord reject_rhsbl_helo
+syntax keyword pfmainWord reject_rhsbl_recipient
+syntax keyword pfmainWord reject_rhsbl_reverse_client
+syntax keyword pfmainWord reject_rhsbl_sender
+syntax keyword pfmainWord reject_sender_login_mismatch
+syntax keyword pfmainWord reject_unauth_destination
+syntax keyword pfmainWord reject_unauth_pipelining
+syntax keyword pfmainWord reject_unauthenticated_sender_login_mismatch
+syntax keyword pfmainWord reject_unknown_address
+syntax keyword pfmainWord reject_unknown_client
+syntax keyword pfmainWord reject_unknown_client_hostname
+syntax keyword pfmainWord reject_unknown_forward_client_hostname
+syntax keyword pfmainWord reject_unknown_helo_hostname
+syntax keyword pfmainWord reject_unknown_hostname
+syntax keyword pfmainWord reject_unknown_recipient_domain
+syntax keyword pfmainWord reject_unknown_reverse_client_hostname
+syntax keyword pfmainWord reject_unknown_sender_domain
+syntax keyword pfmainWord reject_unlisted_recipient
+syntax keyword pfmainWord reject_unlisted_sender
+syntax keyword pfmainWord reject_unverified_recipient
+syntax keyword pfmainWord reject_unverified_sender
+syntax keyword pfmainWord secure
+syntax keyword pfmainWord server_name
+syntax keyword pfmainWord sleep
+syntax keyword pfmainWord smtpd_access_maps
+syntax keyword pfmainWord speed_adjust
+syntax keyword pfmainWord strong
+syntax keyword pfmainWord subnet
+syntax keyword pfmainWord tempfail
+syntax keyword pfmainWord ultra
+syntax keyword pfmainWord warn_if_reject
+syntax keyword pfmainWord CRYPTOPRO_TLSEXT_BUG
+syntax keyword pfmainWord DONT_INSERT_EMPTY_FRAGMENTS
+syntax keyword pfmainWord LEGACY_SERVER_CONNECT
+syntax keyword pfmainWord MICROSOFT_BIG_SSLV3_BUFFER
+syntax keyword pfmainWord MICROSOFT_SESS_ID_BUG
+syntax keyword pfmainWord MSIE_SSLV2_RSA_PADDING
+syntax keyword pfmainWord NETSCAPE_CHALLENGE_BUG
+syntax keyword pfmainWord NETSCAPE_REUSE_CIPHER_CHANGE_BUG
+syntax keyword pfmainWord SSLEAY_080_CLIENT_DH_BUG
+syntax keyword pfmainWord SSLREF2_REUSE_CERT_TYPE_BUG
+syntax keyword pfmainWord TLS_BLOCK_PADDING_BUG
+syntax keyword pfmainWord TLS_D5_BUG
+syntax keyword pfmainWord TLS_ROLLBACK_BUG
+
+syntax keyword pfmainDict btree cidr environ hash nis pcre proxy regexp sdbm static tcp unix
+syntax keyword pfmainQueueDir incoming active deferred corrupt hold
+syntax keyword pfmainTransport smtp lmtp unix local relay uucp virtual
+syntax keyword pfmainLock fcntl flock dotlock
+syntax keyword pfmainAnswer yes no
+
+syntax match pfmainComment "#.*$"
+syntax match pfmainNumber "\<\d\+\>"
+syntax match pfmainTime "\<\d\+[hmsd]\>"
+syntax match pfmainIP "\<\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\>"
+syntax match pfmainVariable "\$\w\+" contains=pfmainRef
+
+syntax match pfmainSpecial "\<alias\>"
+syntax match pfmainSpecial "\<canonical\>"
+syntax match pfmainSpecial "\<forward\>"
+syntax match pfmainSpecial "\<generic\>"
+syntax match pfmainSpecial "\<include\>"
+syntax match pfmainSpecial "\<virtual\>"
+
+syntax match pfmainSpecial "\<delay_dotcrlf\>"
+syntax match pfmainSpecial "\<disable_esmtp\>"
+
+syntax match pfmainSpecial "\<res_defnames\>"
+syntax match pfmainSpecial "\<res_dnsrch\>"
+
+syntax match pfmainSpecial "\<command\>"
+syntax match pfmainSpecial "\<file\>"
+
+syntax match pfmainSpecial "\<forward_secrecy\>"
+syntax match pfmainSpecial "\<mutual_auth\>"
+syntax match pfmainSpecial "\<noactive\>"
+syntax match pfmainSpecial "\<noanonymous\>"
+syntax match pfmainSpecial "\<nodictionary\>"
+syntax match pfmainSpecial "\<noplaintext\>"
+
+syntax match pfmainSpecial "\<bounce\>"
+syntax match pfmainSpecial "\<2bounce\>"
+syntax match pfmainSpecial "\<data\>"
+syntax match pfmainSpecial "\<delay\>"
+syntax match pfmainSpecial "\<policy\>"
+syntax match pfmainSpecial "\<protocol\>"
+syntax match pfmainSpecial "\<resource\>"
+syntax match pfmainSpecial "\<software\>"
+
+syntax match pfmainSpecial "\<cleanup\>"
+syntax match pfmainSpecial "\<cyrus\>"
+syntax match pfmainSpecial "\<error\>"
+syntax match pfmainSpecial "\<flush\>"
+syntax match pfmainSpecial "\<notify\>"
+syntax match pfmainSpecial "\<pickup\>"
+syntax match pfmainSpecial "\<postdrop\>"
+syntax match pfmainSpecial "\<qmgr\>"
+syntax match pfmainSpecial "\<qmqpd\>"
+syntax match pfmainSpecial "\<rewrite\>"
+syntax match pfmainSpecial "\<scache\>"
+syntax match pfmainSpecial "\<sendmail\>"
+syntax match pfmainSpecial "\<showq\>"
+syntax match pfmainSpecial "\<smtpd\>"
+syntax match pfmainSpecial "\<trace\>"
+syntax match pfmainSpecial "\<verify\>"
+
+
+hi def link pfmainConf Statement
+hi def link pfmainRef PreProc
+hi def link pfmainWord identifier
+
+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
+
+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
+
+
+let b:current_syntax = "pfmain"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/php.vim b/runtime/syntax/php.vim
new file mode 100644
index 0000000..80662d6
--- /dev/null
+++ b/runtime/syntax/php.vim
@@ -0,0 +1,978 @@
+" Vim syntax file
+" Language: php PHP 3/4/5/7/8
+" Maintainer: Tyson Andre <tysonandre775@hotmail.com>
+" Last Change: Sep 18, 2021
+" URL: https://github.com/TysonAndre/php-vim-syntax
+" Former Maintainers:
+" Jason Woofenden <jason@jasonwoof.com>
+" 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: This embeds a modified copy of the html.vim with (mostly) different symbols,
+" in order to implement php_htmlInStrings=2 can work as expected and correctly parse
+" `<?php $phpStartTag = '<?php';`.
+"
+" Credits for the original version of html.vim prior to modifications
+"
+" Previous Maintainer Jorge Maldonado Ventura <jorgesumle@freakspot.net>
+" Previous Maintainer Claudio Fleiner <claudio@fleiner.com>
+" Repository https://notabug.org/jorgesumle/vim-html-syntax
+" Last Change 2021 Mar 02
+" Included patch #7900 to fix comments
+" Included patch #7916 to fix a few more things
+"
+" Options:
+" Set to anything to enable:
+" php_sql_query SQL syntax highlighting inside strings
+" php_htmlInStrings HTML syntax highlighting inside strings
+"
+" By setting this to 2, this will use a local copy of
+" HTML syntax highlighting instead of the official
+" HTML syntax highlighting, and properly highlight
+" `<?php $startTag = '<?php';`.
+" This may become the new default in the future.
+"
+" By setting this to 3 (or any unrecognized value),
+" this will use the official installed top level html syntax highlighting rules.
+" 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:
+" Setting php_folding=1 will match a closing } by comparing the indent
+" before the class or function keyword with the indent of a matching }.
+" Setting php_folding=2 will match all of pairs of {,} ( see known
+" bugs ii )
+
+" Known Bugs:
+" - setting php_parent_error_close on and php_parent_error_open off
+" has these two leaks:
+" i) A closing ) or ] inside a string match to the last open ( or [
+" before the string, when the the closing ) or ] is on the same line
+" where the string started. In this case a following ) or ] after
+" the string would be highlighted as an error, what is incorrect.
+" ii) Same problem if you are setting php_folding = 2 with a closing
+" } inside an string on the first line of this string.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'php'
+endif
+
+" Start of copy of html for embedding in strings with {{{
+" This is a clone of https://notabug.org/jorgesumle/vim-html-syntax
+" from 2021 Mar 02 with changed symbols and modifications to rules. See the Note in the file header.
+"
+" The default behavior of php_htmlInStrings causes a bug
+" when you're working with code that contains the string literal `'<?php'`.
+" E.g. code that reads php files or generates the contents of php files or
+" generates snippets to `eval()`.
+"
+" When php_htmlInStrings was set to any value,
+" it would cause the html syntax rules to be embedded inside of the string
+" contents.
+"
+" However, php.vim extends html.vim by allowing the php start tag to be
+" included, meaning that this is parsed as `<?php';`, i.e. the start of a
+" new string literal.
+"
+" Work around that by using a different set of rules that don't allow
+" embedding php in most places (phpInnerHtmlPreProc).
+"
+" The default behavior may be changed to this in the future for constants other
+" than 2 or 3 if there are no issues.
+"
+" Many, but not all syntax rules were changed from html* to phpInnerHtml*
+if exists("php_htmlInStrings") && php_htmlInStrings==2
+ " mark illegal characters
+ syn match phpInnerHtmlError contained "[<>&]"
+
+ " tags
+ syn region phpInnerHtmlString contained start=+"+ end=+"+ contains=phpInnerHtmlSpecialChar,javaScriptExpression,@phpInnerHtmlPreproc
+ syn region phpInnerHtmlString contained start=+'+ end=+'+ contains=phpInnerHtmlSpecialChar,javaScriptExpression,@phpInnerHtmlPreproc
+ syn match phpInnerHtmlValue contained "=[\t ]*[^'" \t>][^ \t>]*"hs=s+1 contains=javaScriptExpression,@phpInnerHtmlPreproc
+ syn region phpInnerHtmlEndTag contained start=+</+ end=+>+ contains=phpInnerHtmlTagN,phpInnerHtmlTagError
+ syn region phpInnerHtmlTag contained start=+<[^/]+ end=+>+ fold contains=phpInnerHtmlTagN,phpInnerHtmlString,htmlArg,phpInnerHtmlValue,phpInnerHtmlTagError,phpInnerHtmlEvent,phpInnerHtmlCssDefinition,@phpInnerHtmlPreproc,@phpInnerHtmlArgCluster
+ syn match phpInnerHtmlTagN contained +<\s*[-a-zA-Z0-9]\++hs=s+1 contains=htmlTagName,htmlSpecialTagName,@phpInnerHtmlTagNameCluster
+ syn match phpInnerHtmlTagN contained +</\s*[-a-zA-Z0-9]\++hs=s+2 contains=htmlTagName,htmlSpecialTagName,@phpInnerHtmlTagNameCluster
+ syn match phpInnerHtmlTagError contained "[^>]<"ms=s+1
+
+
+ " special characters
+ syn match phpInnerHtmlSpecialChar "&#\=[0-9A-Za-z]\{1,8};"
+
+ " Comments (the real ones or the old netscape ones)
+ if exists("html_wrong_comments")
+ syn region phpInnerHtmlComment start=+<!--+ end=+--\s*>+ contains=@Spell
+ else
+ " The HTML 5.2 syntax 8.2.4.41: bogus comment is parser error; browser skips until next &gt
+ syn region phpInnerHtmlComment start=+<!+ end=+>+ contains=phpInnerHtmlCommentError keepend
+ " Idem 8.2.4.42,51: Comment starts with <!-- and ends with -->
+ " Idem 8.2.4.43,44: Except <!--> and <!---> are parser errors
+ " Idem 8.2.4.52: dash-dash-bang (--!>) is error ignored by parser, also closes comment
+ syn region phpInnerHtmlComment matchgroup=phpInnerHtmlComment start=+<!--\%(-\?>\)\@!+ end=+--!\?>+ contains=phpInnerHtmlCommentNested,@phpInnerHtmlPreProc,@Spell keepend
+ " Idem 8.2.4.49: nested comment is parser error, except <!--> is all right
+ syn match phpInnerHtmlCommentNested contained "<!-->\@!"
+ syn match phpInnerHtmlCommentError contained "[^><!]"
+ endif
+ syn region phpInnerHtmlComment start=+<!DOCTYPE+ end=+>+ keepend
+
+ " server-parsed commands
+ syn region phpInnerHtmlPreProc start=+<!--#+ end=+-->+ contains=phpInnerHtmlPreStmt,phpInnerHtmlPreError,phpInnerHtmlPreAttr
+ syn match phpInnerHtmlPreStmt contained "<!--#\(config\|echo\|exec\|fsize\|flastmod\|include\|printenv\|set\|if\|elif\|else\|endif\|geoguide\)\>"
+ syn match phpInnerHtmlPreError contained "<!--#\S*"ms=s+4
+ syn match phpInnerHtmlPreAttr contained "\w\+=[^"]\S\+" contains=phpInnerHtmlPreProcAttrError,phpInnerHtmlPreProcAttrName
+ syn region phpInnerHtmlPreAttr contained start=+\w\+="+ skip=+\\\\\|\\"+ end=+"+ contains=phpInnerHtmlPreProcAttrName keepend
+ syn match phpInnerHtmlPreProcAttrError contained "\w\+="he=e-1
+ syn match phpInnerHtmlPreProcAttrName contained "\(expr\|errmsg\|sizefmt\|timefmt\|var\|cgi\|cmd\|file\|virtual\|value\)="he=e-1
+
+ if !exists("html_no_rendering")
+ " rendering
+ syn cluster phpInnerHtmlTop contains=@Spell,phpInnerHtmlTag,phpInnerHtmlEndTag,phpInnerHtmlSpecialChar,phpInnerHtmlPreProc,phpInnerHtmlComment,phpInnerHtmlLink,javaScript,@phpInnerHtmlPreproc
+
+ syn region phpInnerHtmlStrike start="<del\>" end="</del\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlStrike start="<strike\>" end="</strike\_s*>"me=s-1 contains=@phpInnerHtmlTop
+
+ syn region phpInnerHtmlBold start="<b\>" end="</b\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlBoldUnderline,phpInnerHtmlBoldItalic
+ syn region phpInnerHtmlBold start="<strong\>" end="</strong\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlBoldUnderline,phpInnerHtmlBoldItalic
+ syn region phpInnerHtmlBoldUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlBoldUnderlineItalic
+ syn region phpInnerHtmlBoldItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlBoldItalicUnderline
+ syn region phpInnerHtmlBoldItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlBoldItalicUnderline
+ syn region phpInnerHtmlBoldUnderlineItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlBoldUnderlineItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlBoldItalicUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlBoldUnderlineItalic
+
+ syn region phpInnerHtmlUnderline start="<u\>" end="</u\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlUnderlineBold,phpInnerHtmlUnderlineItalic
+ syn region phpInnerHtmlUnderlineBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlUnderlineBoldItalic
+ syn region phpInnerHtmlUnderlineBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlUnderlineBoldItalic
+ syn region phpInnerHtmlUnderlineItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlUnderlineItalicBold
+ syn region phpInnerHtmlUnderlineItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlUnderlineItalicBold
+ syn region phpInnerHtmlUnderlineItalicBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlUnderlineItalicBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlUnderlineBoldItalic contained start="<i\>" end="</i\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlUnderlineBoldItalic contained start="<em\>" end="</em\_s*>"me=s-1 contains=@phpInnerHtmlTop
+
+ syn region phpInnerHtmlItalic start="<i\>" end="</i\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlItalicBold,phpInnerHtmlItalicUnderline
+ syn region phpInnerHtmlItalic start="<em\>" end="</em\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlItalicBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlItalicBoldUnderline
+ syn region phpInnerHtmlItalicBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlItalicBoldUnderline
+ syn region phpInnerHtmlItalicBoldUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlItalicUnderline contained start="<u\>" end="</u\_s*>"me=s-1 contains=@phpInnerHtmlTop,phpInnerHtmlItalicUnderlineBold
+ syn region phpInnerHtmlItalicUnderlineBold contained start="<b\>" end="</b\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlItalicUnderlineBold contained start="<strong\>" end="</strong\_s*>"me=s-1 contains=@phpInnerHtmlTop
+
+ syn match phpInnerHtmlLeadingSpace "^\s\+" contained
+ syn region phpInnerHtmlLink start="<a\>\_[^>]*\<href\>" end="</a\_s*>"me=s-1 contains=@Spell,phpInnerHtmlTag,phpInnerHtmlEndTag,phpInnerHtmlSpecialChar,phpInnerHtmlPreProc,phpInnerHtmlComment,phpInnerHtmlLeadingSpace,phpInnerJavaScript,@phpInnerHtmlPreproc
+ syn region phpInnerHtmlH1 start="<h1\>" end="</h1\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlH2 start="<h2\>" end="</h2\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlH3 start="<h3\>" end="</h3\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlH4 start="<h4\>" end="</h4\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlH5 start="<h5\>" end="</h5\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlH6 start="<h6\>" end="</h6\_s*>"me=s-1 contains=@phpInnerHtmlTop
+ syn region phpInnerHtmlHead start="<head\>" end="</head\_s*>"me=s-1 end="<body\>"me=s-1 end="<h[1-6]\>"me=s-1 contains=phpInnerHtmlTag,phpInnerHtmlEndTag,phpInnerHtmlSpecialChar,phpInnerHtmlPreProc,phpInnerHtmlComment,phpInnerHtmlLink,phpInnerHtmlTitle,phpInnerJavaScript,phpInnerCssStyle,@phpInnerHtmlPreproc
+ syn region phpInnerHtmlTitle start="<title\>" end="</title\_s*>"me=s-1 contains=phpInnerHtmlTag,phpInnerHtmlEndTag,phpInnerHtmlSpecialChar,phpInnerHtmlPreProc,phpInnerHtmlComment,phpInnerJavaScript,@phpInnerHtmlPreproc
+ endif
+
+ if main_syntax != 'java' || exists("javascript")
+ " JAVA SCRIPT
+ " For example, $phpVar = '<img onload="foo()" />';
+ syn include @phpInnerHtmlJavaScript syntax/javascript.vim
+ unlet b:current_syntax
+ syn region phpInnerHtmlScriptTag contained start=+<script+ end=+>+ fold contains=phpInnerHtmlTagN,phpInnerHtmlString,phpInnerHtmlArg,phpInnerHtmlValue,phpInnerHtmlTagError,phpInnerHtmlEvent
+ hi def link phpInnerHtmlScriptTag phpInnerHtmlTag
+
+ " phpInnerHtml events (i.e. arguments that include phpInnerJavascript commands)
+ if exists("html_extended_events")
+ syn region phpInnerHtmlEvent contained start=+\<on\a\+\s*=[\t ]*'+ end=+'+ contains=phpInnerHtmlEventSQ
+ syn region phpInnerHtmlEvent contained start=+\<on\a\+\s*=[\t ]*"+ end=+"+ contains=phpInnerHtmlEventDQ
+ else
+ syn region phpInnerHtmlEvent contained start=+\<on\a\+\s*=[\t ]*'+ end=+'+ keepend contains=phpInnerHtmlEventSQ
+ syn region phpInnerHtmlEvent contained start=+\<on\a\+\s*=[\t ]*"+ end=+"+ keepend contains=phpInnerHtmlEventDQ
+ endif
+ syn region phpInnerHtmlEventSQ contained start=+'+ms=s+1 end=+'+me=s-1 contains=@phpInnerHtmlJavaScript
+ syn region phpInnerHtmlEventDQ contained start=+"+ms=s+1 end=+"+me=s-1 contains=@phpInnerHtmlJavaScript
+ hi def link phpInnerHtmlEventSQ phpInnerHtmlEvent
+ hi def link phpInnerHtmlEventDQ phpInnerHtmlEvent
+
+ " a phpInnerJavascript expression is used as an arg value
+ " syn region phpInnerJavaScriptExpression contained start=+&{+ keepend end=+};+ contains=@phpInnerHtmlJavaScript,@phpInnerHtmlPreproc
+ endif
+
+ syn cluster phpInnerHtmlJavaScript add=@phpInnerHtmlPreproc
+
+ " The default highlighting.
+ " NOTE: For now, this deliberately copies the definitions from html rather than link
+ " to the corresponding html tag name. If html is refactored to rename any
+ " keywords then html highlighting would unexpectedly be cleared.
+ hi def link phpInnerHtmlTag Function
+ hi def link phpInnerHtmlEndTag Identifier
+ hi def link phpInnerHtmlArg Type
+ hi def link phpInnerHtmlValue String
+ hi def link phpInnerHtmlSpecialChar Special
+
+ if !exists("html_no_rendering")
+ hi def link phpInnerHtmlH1 Title
+ hi def link phpInnerHtmlH2 phpInnerHtmlH1
+ hi def link phpInnerHtmlH3 phpInnerHtmlH2
+ hi def link phpInnerHtmlH4 phpInnerHtmlH3
+ hi def link phpInnerHtmlH5 phpInnerHtmlH4
+ hi def link phpInnerHtmlH6 phpInnerHtmlH5
+ hi def link phpInnerHtmlHead PreProc
+ hi def link phpInnerHtmlTitle Title
+ hi def link phpInnerHtmlBoldItalicUnderline phpInnerHtmlBoldUnderlineItalic
+ hi def link phpInnerHtmlUnderlineBold phpInnerHtmlBoldUnderline
+ hi def link phpInnerHtmlUnderlineItalicBold phpInnerHtmlBoldUnderlineItalic
+ hi def link phpInnerHtmlUnderlineBoldItalic phpInnerHtmlBoldUnderlineItalic
+ hi def link phpInnerHtmlItalicUnderline phpInnerHtmlUnderlineItalic
+ hi def link phpInnerHtmlItalicBold phpInnerHtmlBoldItalic
+ hi def link phpInnerHtmlItalicBoldUnderline phpInnerHtmlBoldUnderlineItalic
+ hi def link phpInnerHtmlItalicUnderlineBold phpInnerHtmlBoldUnderlineItalic
+ hi def link phpInnerHtmlLink Underlined
+ hi def link phpInnerHtmlLeadingSpace None
+ if !exists("html_my_rendering")
+ hi def phpInnerHtmlBold term=bold cterm=bold gui=bold
+ hi def phpInnerHtmlBoldUnderline term=bold,underline cterm=bold,underline gui=bold,underline
+ hi def phpInnerHtmlBoldItalic term=bold,italic cterm=bold,italic gui=bold,italic
+ hi def phpInnerHtmlBoldUnderlineItalic term=bold,italic,underline cterm=bold,italic,underline gui=bold,italic,underline
+ hi def phpInnerHtmlUnderline term=underline cterm=underline gui=underline
+ hi def phpInnerHtmlUnderlineItalic term=italic,underline cterm=italic,underline gui=italic,underline
+ hi def phpInnerHtmlItalic term=italic cterm=italic gui=italic
+ if v:version > 800 || v:version == 800 && has("patch1038")
+ hi def phpInnerHtmlStrike term=strikethrough cterm=strikethrough gui=strikethrough
+ else
+ hi def phpInnerHtmlStrike term=underline cterm=underline gui=underline
+ endif
+ endif
+ endif
+
+ hi def link phpInnerHtmlPreStmt PreProc
+ hi def link phpInnerHtmlPreError Error
+ hi def link phpInnerHtmlPreProc PreProc
+ hi def link phpInnerHtmlPreAttr String
+ hi def link phpInnerHtmlPreProcAttrName PreProc
+ hi def link phpInnerHtmlPreProcAttrError Error
+ hi def link phpInnerHtmlString String
+ hi def link phpInnerHtmlStatement Statement
+ hi def link phpInnerHtmlComment Comment
+ hi def link phpInnerHtmlCommentNested phpInnerHtmlError
+ hi def link phpInnerHtmlCommentError phpInnerHtmlError
+ hi def link phpInnerHtmlTagError phpInnerHtmlError
+ hi def link phpInnerHtmlEvent phpInnerJavaScript
+ hi def link phpInnerHtmlError Error
+
+ hi def link phpInnerJavaScript Special
+ hi def link phpInnerJavaScriptExpression phpInnerJavaScript
+ hi def link phpInnerHtmlCssStyleComment Comment
+ hi def link phpInnerHtmlCssDefinition Special
+endif
+
+
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+" accept old options
+if !exists("php_sync_method")
+ if exists("php_minlines")
+ let php_sync_method=php_minlines
+ else
+ let php_sync_method=-1
+ endif
+endif
+
+if exists("php_parentError") && !exists("php_parent_error_open") && !exists("php_parent_error_close")
+ let php_parent_error_close=1
+ let php_parent_error_open=1
+endif
+
+" End of copy of html syntax for embedding in php strings }}}
+
+syn cluster htmlPreproc add=phpRegion,phpRegionAsp,phpRegionSc
+
+syn include @sqlTop syntax/sql.vim
+syn sync clear
+unlet b:current_syntax
+syn cluster sqlTop remove=sqlString,sqlComment
+if exists( "php_sql_query")
+ syn cluster phpAddStrings contains=@sqlTop
+endif
+
+if exists( "php_htmlInStrings")
+ if php_htmlInStrings==2
+ syn cluster phpAddStrings add=@phpInnerHtmlTop
+ else
+ syn cluster phpAddStrings add=@htmlTop
+ endif
+endif
+
+" make sure we can use \ at the beginning of the line to do a continuation
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case match
+
+" Env Variables
+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
+
+" 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
+
+" Predefined constants
+" Generated by: curl -q https://www.php.net/manual/en/errorfunc.constants.php | grep -oP 'E_\w+' | sort -u
+syn keyword phpCoreConstant E_ALL E_COMPILE_ERROR E_COMPILE_WARNING E_CORE_ERROR E_CORE_WARNING E_DEPRECATED E_ERROR E_NOTICE E_PARSE E_RECOVERABLE_ERROR E_STRICT E_USER_DEPRECATED E_USER_ERROR E_USER_NOTICE E_USER_WARNING E_WARNING contained
+
+syn case ignore
+
+syn keyword phpConstant __LINE__ __FILE__ __FUNCTION__ __METHOD__ __CLASS__ __DIR__ __NAMESPACE__ __TRAIT__ contained
+
+
+" Function and Methods ripped from php_manual_de.tar.gz Jan 2003 and amended later with common bundled extensions
+
+syn keyword phpFunctions apc_cache_info apc_clear_cache apc_store apc_fetch apc_enabled apc_delete apc_add apc_sma_info apc_inc apc_dec apc_cas apc_exists contained
+syn keyword phpFunctions apcu_add apcu_cache_info apcu_cas apcu_clear_cache apcu_dec apcu_delete apcu_enabled apcu_entry apcu_exists apcu_fetch apcu_inc apcu_key_info apcu_sma_info apcu_store 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 curl_copy_handle curl_escape curl_file_create curl_multi_errno curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt_array curl_share_close curl_share_errno curl_share_init curl_share_setopt curl_share_strerror curl_strerror curl_unescape 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 date_add date_create date_create_from_format date_create_immutable date_create_immutable_from_format date_date_set date_default_timezone_get date_default_timezone_set date_diff date_format date_get_last_errors date_interval_create_from_date_string date_interval_format date_isodate_set date_modify date_offset_get date_parse date_parse_from_format date_sub date_sun_info date_sunrise date_sunset date_time_set date_timestamp_get date_timestamp_set date_timezone_get date_timezone_set idate timezone_abbreviations_list timezone_identifiers_list timezone_location_get timezone_name_from_abbr timezone_name_get timezone_offset_get timezone_open timezone_transitions_get timezone_version_get 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 dom_import_simplexml 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 enchant_broker_describe enchant_broker_dict_exists enchant_broker_free enchant_broker_free_dict enchant_broker_get_dict_path enchant_broker_get_error enchant_broker_init enchant_broker_list_dicts enchant_broker_request_dict enchant_broker_request_pwl_dict enchant_broker_set_dict_path enchant_broker_set_ordering enchant_dict_add enchant_dict_add_to_personal enchant_dict_add_to_session enchant_dict_check enchant_dict_describe enchant_dict_get_error enchant_dict_is_added enchant_dict_is_in_session enchant_dict_quick_check enchant_dict_store_replacement enchant_dict_suggest 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 filter_has_var filter_id filter_input filter_input_array filter_list filter_var filter_var_array 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 ftp_append ftp_mlsd 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 gmp_binomial gmp_export gmp_import gmp_kronecker gmp_lcm gmp_nextprime gmp_perfect_power gmp_random_bits gmp_random_range gmp_random_seed gmp_root gmp_rootrem gmp_testbit contained
+syn keyword phpFunctions hash hash_algos hash_copy hash_equals hash_file hash_final hash_hkdf hash_hmac hash_hmac_algos hash_hmac_file hash_init hash_pbkdf2 hash_update hash_update_file hash_update_stream 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 igbinary_serialize igbinary_unserialize 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 exif_tagname imageaffine imageaffinematrixconcat imageaffinematrixget imagebmp imageconvolution imagecreatefrombmp imagecreatefromtga imagecrop imagecropauto imagefilter imageflip imagegetclip imagegetinterpolation imagelayereffect imageopenpolygon imagepalettetotruecolor imageresolution imagescale imagesetclip imagesetinterpolation imagexbm 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 collator_asort collator_compare collator_create collator_get_attribute collator_get_error_code collator_get_error_message collator_get_locale collator_get_sort_key collator_get_strength collator_set_attribute collator_set_strength collator_sort collator_sort_with_sort_keys datefmt_create datefmt_format datefmt_format_object datefmt_get_calendar datefmt_get_calendar_object datefmt_get_datetype datefmt_get_error_code datefmt_get_error_message datefmt_get_locale datefmt_get_pattern datefmt_get_timetype datefmt_get_timezone datefmt_get_timezone_id datefmt_is_lenient datefmt_localtime datefmt_parse datefmt_set_calendar datefmt_set_lenient datefmt_set_pattern datefmt_set_timezone grapheme_extract grapheme_stripos grapheme_stristr grapheme_strlen grapheme_strpos grapheme_strripos grapheme_strrpos grapheme_strstr grapheme_substr idn_to_ascii idn_to_utf8 intl_error_name intl_get_error_code intl_get_error_message intl_is_failure intlcal_add intlcal_after intlcal_before intlcal_clear intlcal_create_instance intlcal_equals intlcal_field_difference intlcal_from_date_time intlcal_get intlcal_get_actual_maximum intlcal_get_actual_minimum intlcal_get_available_locales intlcal_get_day_of_week_type intlcal_get_error_code intlcal_get_error_message intlcal_get_first_day_of_week intlcal_get_greatest_minimum intlcal_get_keyword_values_for_locale intlcal_get_least_maximum intlcal_get_locale intlcal_get_maximum intlcal_get_minimal_days_in_first_week intlcal_get_minimum intlcal_get_now intlcal_get_repeated_wall_time_option intlcal_get_skipped_wall_time_option intlcal_get_time intlcal_get_time_zone intlcal_get_type intlcal_get_weekend_transition intlcal_in_daylight_time intlcal_is_equivalent_to intlcal_is_lenient intlcal_is_set intlcal_is_weekend intlcal_roll intlcal_set intlcal_set_first_day_of_week intlcal_set_lenient intlcal_set_minimal_days_in_first_week intlcal_set_repeated_wall_time_option intlcal_set_skipped_wall_time_option intlcal_set_time intlcal_set_time_zone intlcal_to_date_time intlgregcal_create_instance intlgregcal_get_gregorian_change intlgregcal_is_leap_year intlgregcal_set_gregorian_change intltz_count_equivalent_ids intltz_create_default intltz_create_enumeration intltz_create_time_zone intltz_create_time_zone_id_enumeration intltz_from_date_time_zone intltz_get_canonical_id intltz_get_display_name intltz_get_dst_savings intltz_get_equivalent_id intltz_get_error_code intltz_get_error_message intltz_get_id_for_windows_id intltz_get_windows_id intltz_get_gmt intltz_get_id intltz_get_offset intltz_get_raw_offset intltz_get_region intltz_get_tz_data_version intltz_get_unknown intltz_has_same_rules intltz_to_date_time_zone intltz_use_daylight_time locale_accept_from_http locale_canonicalize locale_compose locale_filter_matches locale_get_all_variants locale_get_default locale_get_display_language locale_get_display_name locale_get_display_region locale_get_display_script locale_get_display_variant locale_get_keywords locale_get_primary_language locale_get_region locale_get_script locale_lookup locale_parse locale_set_default msgfmt_create msgfmt_format msgfmt_format_message msgfmt_get_error_code msgfmt_get_error_message msgfmt_get_locale msgfmt_get_pattern msgfmt_parse msgfmt_parse_message msgfmt_set_pattern normalizer_get_raw_decomposition normalizer_is_normalized normalizer_normalize numfmt_create numfmt_format numfmt_format_currency numfmt_get_attribute numfmt_get_error_code numfmt_get_error_message numfmt_get_locale numfmt_get_pattern numfmt_get_symbol numfmt_get_text_attribute numfmt_parse numfmt_parse_currency numfmt_set_attribute numfmt_set_pattern numfmt_set_symbol numfmt_set_text_attribute resourcebundle_count resourcebundle_create resourcebundle_get resourcebundle_get_error_code resourcebundle_get_error_message resourcebundle_locales transliterator_create transliterator_create_from_rules transliterator_create_inverse transliterator_get_error_code transliterator_get_error_message transliterator_list_ids transliterator_transliterate 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 json_last_error_msg 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 libxml_clear_errors libxml_disable_entity_loader libxml_get_errors libxml_get_last_error libxml_set_external_entity_loader libxml_set_streams_context libxml_use_internal_errors 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 array_key_first array_key_last boolval cli_get_process_title cli_set_process_title convert_uudecode convert_uuencode debug_zval_dump error_clear_last error_get_last forward_static_call forward_static_call_array fputcsv get_headers gethostname getimagesizefromstring header_register_callback header_remove hex2bin hrtime htmlspecialchars_decode http_response_code image_type_to_extension inet_ntop inet_pton intdiv is_countable is_iterable lcfirst lchgrp lchown memory_get_peak_usage net_get_interfaces parse_ini_string password_algos password_get_info password_hash password_needs_rehash password_verify php_ini_loaded_file php_strip_whitespace quoted_printable_encode random_bytes random_int realpath_cache_get realpath_cache_size setrawcookie str_getcsv stream_bucket_append stream_bucket_make_writeable stream_bucket_new stream_bucket_prepend stream_context_get_default stream_context_get_params stream_context_set_default stream_filter_remove stream_is_local stream_isatty stream_resolve_include_path stream_set_chunk_size stream_set_read_buffer stream_socket_enable_crypto stream_socket_pair stream_socket_shutdown stream_supports_lock stream_wrapper_restore stream_wrapper_unregister strpbrk strptime sys_get_temp_dir sys_getloadavg time_nanosleep time_sleep_until vfprintf 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 mb_check_encoding mb_chr mb_encoding_aliases mb_ereg_replace_callback mb_list_encodings mb_ord mb_scrub mb_str_split mb_stripos mb_stristr mb_strrchr mb_strrichr mb_strripos mb_strstr mbereg mbereg_match mbereg_replace mbereg_search mbereg_search_getpos mbereg_search_getregs mbereg_search_init mbereg_search_pos mbereg_search_regs mbereg_search_setpos mberegi mberegi_replace mbregex_encoding mbsplit 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 finfo_buffer finfo_close finfo_file finfo_open finfo_set_flags 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 mysqli_begin_transaction mysqli_connect_errno mysqli_connect_error mysqli_error_list mysqli_escape_string mysqli_fetch_all mysqli_get_charset mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_links_stats mysqli_get_warnings mysqli_more_results mysqli_multi_query mysqli_next_result mysqli_poll mysqli_reap_async_query mysqli_refresh mysqli_release_savepoint mysqli_report mysqli_savepoint mysqli_set_charset mysqli_set_opt mysqli_sqlstate mysqli_stmt_attr_get mysqli_stmt_attr_set mysqli_stmt_bind_param mysqli_stmt_bind_result mysqli_stmt_data_seek mysqli_stmt_error_list mysqli_stmt_execute mysqli_stmt_fetch mysqli_stmt_field_count mysqli_stmt_free_result mysqli_stmt_get_result mysqli_stmt_get_warnings mysqli_stmt_init mysqli_stmt_insert_id mysqli_stmt_more_results mysqli_stmt_next_result mysqli_stmt_num_rows mysqli_stmt_param_count mysqli_stmt_prepare mysqli_stmt_reset mysqli_stmt_result_metadata mysqli_stmt_send_long_data mysqli_stmt_sqlstate 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 opcache_reset opcache_invalidate opcache_compile_file opcache_is_script_cached opcache_get_configuration opcache_get_status contained
+syn keyword phpFunctions openssl_cipher_iv_length openssl_cms_decrypt openssl_cms_encrypt openssl_cms_read openssl_cms_sign openssl_cms_verify 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 openssl_get_curve_names openssl_pkcs7_read openssl_pkey_derive openssl_x509_verify 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 pcntl_alarm pcntl_async_signals pcntl_errno pcntl_get_last_error pcntl_getpriority pcntl_setpriority pcntl_signal_dispatch pcntl_signal_get_handler pcntl_sigprocmask pcntl_sigtimedwait pcntl_sigwaitinfo pcntl_strerror pcntl_unshare pcntl_wait pcntl_wifcontinued contained
+syn keyword phpFunctions preg_filter preg_grep preg_last_error preg_last_error_msg preg_match_all preg_match preg_quote preg_replace_callback preg_replace_callback_array preg_replace preg_split contained
+syn keyword phpFunctions pdo_drivers 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 pg_clientencoding pg_cmdtuples pg_connect_poll pg_consume_input pg_errormessage pg_escape_identifier pg_escape_literal pg_exec pg_execute pg_fetch_all_columns pg_field_table pg_field_type_oid pg_fieldisnull pg_fieldname pg_fieldnum pg_fieldprtlen pg_fieldsize pg_fieldtype pg_flush pg_freeresult pg_getlastoid pg_lo_truncate pg_loclose pg_locreate pg_loexport pg_loimport pg_loopen pg_loread pg_loreadall pg_lounlink pg_lowrite pg_numfields pg_numrows pg_parameter_status pg_prepare pg_query_params pg_result pg_result_error_field pg_send_execute pg_send_prepare pg_send_query_params pg_set_error_verbosity pg_setclientencoding pg_socket pg_transaction_status pg_version 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 posix_access posix_errno posix_initgroups posix_mknod posix_setrlimit 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 pspell_config_data_dir pspell_config_dict_dir 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 readline_callback_handler_install readline_callback_handler_remove readline_callback_read_char readline_on_new_line readline_redisplay 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_queue_exists 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_has_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 session_abort session_commit session_create_id session_gc session_register_shutdown session_reset session_status contained
+syn keyword phpFunctions simplexml_import_dom simplexml_load_file simplexml_load_string 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 is_soap_fault use_soap_error_handler 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 socket_addrinfo_bind socket_addrinfo_connect socket_addrinfo_explain socket_addrinfo_lookup socket_cmsg_space socket_export_stream socket_getopt socket_import_stream socket_setopt contained
+syn keyword phpFunctions class_implements class_parents class_uses iterator_apply iterator_count iterator_to_array spl_autoload spl_autoload_call spl_autoload_extensions spl_autoload_functions spl_autoload_register spl_autoload_unregister spl_classes spl_object_hash spl_object_id 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 fdiv get_debug_type getdir str_contains str_ends_with str_starts_with
+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 tidy_is_xml tidy_get_opt_doc 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_id 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 get_called_class property_exists interface_exists trait_exists class_alias get_mangled_object_vars set_exception_handler restore_exception_handler get_declared_traits get_declared_interfaces get_resources gc_mem_caches gc_collect_cycles gc_enabled gc_enable gc_disable gc_status 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 xmlrpc_is_fault contained
+syn keyword phpFunctions xmlwriter_end_attribute xmlwriter_end_cdata xmlwriter_end_comment xmlwriter_end_document xmlwriter_end_dtd xmlwriter_end_dtd_attlist xmlwriter_end_dtd_element xmlwriter_end_dtd_entity xmlwriter_end_element xmlwriter_end_pi xmlwriter_flush xmlwriter_full_end_element xmlwriter_open_memory xmlwriter_open_uri xmlwriter_output_memory xmlwriter_set_indent xmlwriter_set_indent_string xmlwriter_start_attribute xmlwriter_start_attribute_ns xmlwriter_start_cdata xmlwriter_start_comment xmlwriter_start_document xmlwriter_start_dtd xmlwriter_start_dtd_attlist xmlwriter_start_dtd_element xmlwriter_start_dtd_entity xmlwriter_start_element xmlwriter_start_element_ns xmlwriter_start_pi xmlwriter_text xmlwriter_write_attribute xmlwriter_write_attribute_ns xmlwriter_write_cdata xmlwriter_write_comment xmlwriter_write_dtd xmlwriter_write_dtd_attlist xmlwriter_write_dtd_element xmlwriter_write_dtd_entity xmlwriter_write_element xmlwriter_write_element_ns xmlwriter_write_pi xmlwriter_write_raw 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 gzdecode zlib_encode zlib_decode deflate_init deflate_add inflate_init inflate_add inflate_get_status inflate_get_read_len 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
+endif
+
+" Conditional
+syn keyword phpConditional declare else enddeclare endswitch elseif endif if switch match contained
+
+" Repeat
+syn keyword phpRepeat as do endfor endforeach endwhile for foreach while contained
+
+" Label
+syn keyword phpLabel case default switch contained
+
+" Statement
+syn keyword phpStatement return break continue exit goto yield contained
+
+" Keyword
+syn keyword phpKeyword var const contained
+
+" Type
+syn keyword phpType void bool boolean int integer real double float string array object NULL callable iterable mixed never contained
+
+" Structure
+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 "&&\|\<and\>" contained display
+syn match phpOperator "||\|\<x\=or\>" contained display
+syn match phpRelation "[!=<>]=" contained display
+syn match phpRelation "[<>]" contained display
+syn match phpRelation "<=>" contained display
+" PHP 8.0 adds the nullsafe operator ?-> for property access and method calls.
+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
+
+" Interpolated indentifiers (inside strings)
+ syn match phpBrackets "[][}{]" contained display
+ " errors
+ 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 phpInterpSimpleBracketsInner "\w\+" contained
+ syn match phpInterpSimpleBracketsInner "\$\h\w*" contained
+ syn match phpInterpSimpleBrackets "\[\$\?\h\w*]" contained contains=phpBrackets,phpInterpSimpleBracketsInner
+ " -0x1 and -123 refer to the string offsets '-0x1' and '-123' of array keys
+ " TODO: Support [1_2], [-0b1_10_1], etc (also literal strings).
+ syn match phpInterpSimpleBrackets "\[-\?\d\+]" contained contains=phpBrackets,phpInterpSimpleBracketsInner
+ syn match phpInterpSimpleBrackets "\[-\?0[xX]\x\+]" contained contains=phpBrackets,phpInterpSimpleBracketsInner
+ syn match phpInterpSimpleBrackets "\[-\?0[bB][01]\+]" contained contains=phpBrackets,phpInterpSimpleBracketsInner
+ 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 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
+
+ syn match phpInterpDollarCurley2Helper "{\h\w*?\?->" contains=phpBrackets,phpInterpVarname,phpMemberSelector contained
+
+ syn region phpInterpDollarCurly2 matchgroup=phpParent start="\${\h\w*?\?->"rs=s+1 end="}" contains=phpInterpDollarCurley2Helper,phpInterpMethodName contained
+
+ syn match phpInterpBogusDollarCurley "${\h\w*?\?->}" contained display
+ syn match phpInterpBogusDollarCurley "${\h\w*\[]}" contained display
+
+ syn region phpInterpComplex matchgroup=phpParent start="{\$"rs=e-1 end="}" contains=phpIdentifier,phpMemberSelector,phpVarSelector,phpIdentifierComplexP contained extend
+ syn region phpIdentifierComplexP matchgroup=phpParent start="\[" end="]" contains=@phpClInside contained
+ " define a cluster to get all interpolation syntaxes for double-quoted strings
+ syn cluster phpInterpDouble contains=phpInterpSimple,phpInterpSimpleCurly,phpInterpDollarCurly1,phpInterpDollarCurly2,phpInterpBogusDollarCurley,phpInterpComplex
+
+" Methods
+syn match phpMethodsVar "?\?->\h\w*" contained contains=phpMethods,phpMemberSelector display
+
+" Include
+syn keyword phpInclude include require include_once require_once use contained
+
+" Define
+syn keyword phpDefine new clone contained
+
+" Boolean
+syn keyword phpBoolean true false contained
+
+" Float
+" Refer to: https://www.php.net/manual/en/language.types.float.php
+syn match phpFloat "\%(\w\|\.\)\@<!\%(\d_\?\|\.\)*\d\%(\d\|_\|\.\)*\%([eE][+-]\=\%(\d\|_\|\.\)\+\)\=\%(\w\|\.\)\@!" contained contains=phpFloatError display
+syn match phpFloatError "\%([eE.][0-9._+-]*\.\|__\|_\(\>\|[eE]\)\|\(\>\|[eE]\)_\)" contained display
+
+" Number
+syn match phpNumber "\%(\.\)\@<!\<\%([1-9]\d*\|0\|0[xX]\(\x_\?\)*\x\)\>\%(\.\)\@!" contained display
+syn match phpNumber "\%(\.\)\@<!\<0\d\+\|0[oO]\d\+\>\%(\.\)\@!" contained contains=phpOctalError display
+syn match phpBinaryError "[2-9]" contained display
+syn match phpNumber "\%(\.\)\@<!\<0[bB]\(\d_\?\)*\d\>\%(\.\)\@!" contained contains=phpBinaryError 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
+" additional sequence for double quotes only
+syn match phpBackslashDoubleQuote "\\[\"]" contained display
+" for single quotes only
+syn match phpBackslashSingleQuote "\\[\\']" contained display
+syn case ignore
+
+
+" Error
+syn match phpOctalError "[89]" contained display
+if exists("php_parent_error_close")
+ syn match phpParentError "[)\]}]" contained display
+endif
+
+" Todo
+syn keyword phpTodo todo fixme xxx contained
+
+" Comment
+if exists("php_parent_error_open")
+ syn region phpComment start="/\*" end="\*/" contained contains=phpTodo,@Spell
+else
+ 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,@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,@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
+syn case match
+
+" HereDoc
+syn region phpHereDoc matchgroup=Delimiter start="\(<<<\)\@<=\(\"\=\)\z(\I\i*\)\2$" end="^\s*\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="^\s*\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="^\s*\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="^\s*\z1\>" contained contains=@htmlJavascript,phpIdentifierSimply,phpIdentifier,phpIdentifierComplex,phpBackslashSequences,phpMethodsVar,@Spell keepend extend
+
+" NowDoc
+syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\I\i*\)'$" end="^\s*\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="^\s*\z1\>" contained contains=@htmlTop,@Spell keepend extend
+syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\(\I\i*\)\=\(sql\)\c\(\i*\)\)'$" end="^\s*\z1\>" contained contains=@sqlTop,@Spell keepend extend
+syn region phpNowDoc matchgroup=Delimiter start="\(<<<\)\@<='\z(\(\I\i*\)\=\(javascript\)\c\(\i*\)\)'$" end="^\s*\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
+ if !exists("php_parent_error_close")
+ syn match phpParent "[\])]" contained
+ endif
+else
+ syn match phpParent "[({[\]})]" contained
+ 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 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
+
+" Php Region
+if exists("php_parent_error_open")
+ if exists("php_noShortTags")
+ syn region phpRegion matchgroup=Delimiter start="<?\(php\|=\)" end="?>" contains=@phpClTop
+ else
+ syn region phpRegion matchgroup=Delimiter start="<?\(php\)\=" end="?>" contains=@phpClTop
+ endif
+ 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
+ endif
+else
+ if exists("php_noShortTags")
+ syn region phpRegion matchgroup=Delimiter start="<?\(php\|=\)" end="?>" contains=@phpClTop keepend
+ else
+ 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
+ if exists("php_asp_tags")
+ 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 readonly contained
+ syn keyword phpFCKeyword function contained
+ syn keyword phpDefine fn 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\|enum\)\(\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\|enum\)\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 fn contained
+ syn keyword phpStructure abstract class trait interface enum contained
+ syn keyword phpException catch throw try finally contained
+ syn keyword phpStorageClass final global private protected public static readonly 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
+
+" ================================================================
+" Peter Hodge - June 9, 2006
+" Some of these changes (highlighting isset/unset/echo etc) are not so
+" critical, but they make things more colourful. :-)
+
+" different syntax highlighting for 'echo', 'print', 'switch', 'die' and 'list' keywords
+" to better indicate what they are.
+syntax keyword phpDefine echo print contained
+syntax keyword phpStructure list contained
+syntax keyword phpConditional switch contained
+syntax keyword phpStatement die contained
+
+" Highlighting for PHP'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 __serialize __unserialize
+" Highlighting for __autoload slightly different from line above
+syntax keyword phpSpecialFunction containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle,phpIdentifier,phpMethodsVar
+ \ __autoload
+hi def link phpSpecialFunction phpOperator
+
+" Highlighting for PHP5's built-in classes
+" Note: Some of the names have inconsistent cases.
+" Those are probably the actual name in reflection and should not be changed in
+" this file.
+" (CURLFile and CurlShareHandle, XMLReader and XmlParser, etc)
+syntax keyword phpClasses containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle,phpIdentifier,phpMethodsVar
+ \ stdClass __PHP_Incomplete_Class php_user_filter AssertionError Directory ArrayObject
+ \ Exception ErrorException LogicException BadFunctionCallException BadMethodCallException DomainException
+ \ ArgumentCountError ArithmeticError ClosedGeneratorException Closure CompileError DivisionByZeroError Generator ParseError TypeError WeakReference
+ \ RecursiveIteratorIterator IteratorIterator FilterIterator RecursiveFilterIterator ParentIterator LimitIterator
+ \ CachingIterator RecursiveCachingIterator NoRewindIterator AppendIterator InfiniteIterator EmptyIterator
+ \ ArrayIterator RecursiveArrayIterator DirectoryIterator RecursiveDirectoryIterator
+ \ CallbackFilterIterator FilesystemIterator GlobIterator MultipleIterator RecursiveCallbackFilterIterator
+ \ RecursiveRegexIterator RecursiveTreeIterator RegexIterator SplDoublyLinkedList
+ \ SplFixedArray SplHeap SplMaxHeap SplMinHeap SplPriorityQueue SplQueue SplStack
+ \ InvalidArgumentException LengthException OutOfRangeException RuntimeException OutOfBoundsException
+ \ Attribute InternalIterator Stringable UnhandledMatchError ValueError WeakMap
+ \ OverflowException RangeException UnderflowException UnexpectedValueException
+ \ PDO PDOException PDOStatement PDORow
+ \ Reflection ReflectionFunction ReflectionParameter ReflectionMethod ReflectionClass
+ \ ReflectionObject ReflectionProperty ReflectionExtension ReflectionException
+ \ ReflectionClassConstant ReflectionFunctionAbstract ReflectionGenerator ReflectionNamedType
+ \ ReflectionReference ReflectionType ReflectionZendExtension
+ \ ReflectionAttribute ReflectionUnionType
+ \ SplFileInfo SplFileObject SplTempFileObject SplObjectStorage
+ \ XMLWriter LibXMLError XMLReader SimpleXMLElement SimpleXMLIterator
+ \ XmlParser
+ \ DeflateContext InflateContext
+ \ DOMException DOMStringList DOMNameList DOMDomError DOMErrorHandler
+ \ DOMImplementation DOMImplementationList DOMImplementationSource
+ \ DOMNode DOMNameSpaceNode DOMDocumentFragment DOMDocument DOMNodeList DOMNamedNodeMap
+ \ DOMCharacterData DOMAttr DOMElement DOMText DOMComment DOMTypeinfo DOMUserDataHandler
+ \ DOMLocator DOMConfiguration DOMCdataSection DOMDocumentType DOMNotation DOMEntity
+ \ DOMEntityReference DOMProcessingInstruction DOMStringExtend DOMXPath
+ \ DOMChildNode DOMParentNode
+ \ EnchantBroker EnchantDictionary
+ \ GdImage
+ \ OpenSSLAsymmetricKey OpenSSLCertificate OpenSSLCertificateSigningRequest
+ \ Shmop
+ \ AddressInfo Socket
+ \ SysvMessageQueue SysvSemaphore SysvSharedMemory
+ \ PhpToken
+ \ APCIterator APCuIterator
+ \ CURLFile CurlHandle CurlMultiHandle CurlShareHandle
+ \ DateInterval DatePeriod DateTime DateTimeImmutable DateTimeZone
+ \ finfo
+ \ GMP
+ \ Collator IntlBreakIterator IntlCalendar IntlChar IntlCodePointBreakIterator IntlDateFormatter IntlException IntlGregorianCalendar IntlIterator IntlPartsIterator IntlRuleBasedBreakIterator IntlTimeZone Locale MessageFormatter Normalizer NumberFormatter ResourceBundle Spoofchecker Transliterator UConverter
+ \ FFI CData CType ParserException
+ \ HashContext
+ \ JsonException
+ \ Memcached MemcachedException
+ \ mysqli mysqli_driver mysqli_result mysqli_sql_exception mysqli_stmt mysqli_warning
+ \ SessionHandler
+ \ SoapClient SoapFault SoapHeader SoapParam SoapServer SoapVar
+ \ SQLite3 SQLite3Result SQLite3Stmt
+ \ tidy tidyNode
+ \ XSLTProcessor ZipArchive
+ \ Phar PharData PharException PharFileInfo
+
+hi def link phpClasses phpFunctions
+
+" Highlighting for PHP's built-in interfaces
+syntax keyword phpInterfaces containedin=ALLBUT,phpComment,phpStringDouble,phpStringSingle,phpIdentifier,phpMethodsVar
+ \ Iterator IteratorAggregate RecursiveIterator OuterIterator SeekableIterator
+ \ Traversable ArrayAccess Serializable Countable SplObserver SplSubject Reflector
+ \ Throwable DateTimeInterface JsonSerializable SessionHandlerInterface SessionIdInterface SessionUpdateTimestampHandlerInterface
+
+hi def link phpInterfaces phpConstant
+
+" option defaults:
+if ! exists('php_special_functions')
+ let php_special_functions = 1
+endif
+if ! exists('php_alt_comparisons')
+ let php_alt_comparisons = 1
+endif
+if ! exists('php_alt_assignByReference')
+ 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.
+ " - match(){} is not a function
+ 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
+ hi def link phpAssignByRef Type
+endif
+
+if php_alt_comparisons
+ " highlight comparison operators differently
+ syntax match phpComparison "\v[=!]\=\=?" contained containedin=phpRegion
+ syntax match phpComparison "\v[=<>-]@<![<>]\=?[<>]@!" contained containedin=phpRegion
+ syntax match phpComparison "<=>" contained containedin=phpRegion
+
+ " highlight the 'instanceof' operator as a comparison operator rather than a structure
+ syntax case ignore
+ syntax keyword phpComparison instanceof contained containedin=phpRegion
+
+ hi def link phpComparison Statement
+endif
+
+" ================================================================
+
+" Sync
+if php_sync_method==-1
+ if exists("php_noShortTags")
+ syn sync match phpRegionSync grouphere phpRegion "^\s*<?\(php\|=\)\s*$"
+ else
+ syn sync match phpRegionSync grouphere phpRegion "^\s*<?\(php\)\=\s*$"
+ endif
+ syn sync match phpRegionSync grouphere phpRegionSc +^\s*<script language="php">\s*$+
+ if exists("php_asp_tags")
+ syn sync match phpRegionSync grouphere phpRegionAsp "^\s*<%\(=\)\=\s*$"
+ endif
+ syn sync match phpRegionSync grouphere NONE "^\s*?>\s*$"
+ syn sync match phpRegionSync grouphere NONE "^\s*%>\s*$"
+ syn sync match phpRegionSync grouphere phpRegion "function\s.*(.*\$"
+ "syn sync match phpRegionSync grouphere NONE "/\i*>\s*$"
+elseif php_sync_method>0
+ exec "syn sync minlines=" . php_sync_method
+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\|api\|author\|category\|copyright\|deprecated\|example\|final\|global\|ignore\|internal\|license\|link\|method\|name\|package\|param\|property\(-write\|-read\)\?\|return\|see\|since\|source\|static\|staticvar\|subpackage\|tutorial\|uses\|used-by\|var\|version\|contributor\|modified\|filename\|description\|filesource\|throws\)\(\s\+\)\?" containedin=phpComment
+syntax match phpDocTodo "@\(todo\|fixme\|xxx\)\(\s\+\)\?" containedin=phpComment
+
+" Define the default highlighting.
+" 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 phpBinaryError Error
+hi def link phpFloatError 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'
+ unlet main_syntax
+endif
+
+" put cpoptions back the way we found it
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 sts=2 sw=2 expandtab
diff --git a/runtime/syntax/phtml.vim b/runtime/syntax/phtml.vim
new file mode 100644
index 0000000..646129a
--- /dev/null
+++ b/runtime/syntax/phtml.vim
@@ -0,0 +1,6 @@
+" Vim syntax file
+" PHTML used to be the filetype for PHP 2.0. Now everything is PHP.
+
+if !exists("b:current_syntax")
+ runtime! syntax/php.vim
+endif
diff --git a/runtime/syntax/pic.vim b/runtime/syntax/pic.vim
new file mode 100644
index 0000000..bcb01f4
--- /dev/null
+++ b/runtime/syntax/pic.vim
@@ -0,0 +1,114 @@
+" Vim syntax file
+" Language: PIC16F84 Assembler (Microchip's microcontroller)
+" Maintainer: Aleksandar Veselinovic <aleksa@cs.cmu.com>
+" Last Change: 2003 May 11
+" URL: http://galeb.etf.bg.ac.yu/~alexa/vim/syntax/pic.vim
+" Revision: 1.01
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+syn keyword picTodo NOTE TODO XXX contained
+
+syn case ignore
+
+syn match picIdentifier "[a-z_$][a-z0-9_$]*"
+syn match picLabel "^[A-Z_$][A-Z0-9_$]*"
+syn match picLabel "^[A-Z_$][A-Z0-9_$]*:"me=e-1
+
+syn match picASCII "A\='.'"
+syn match picBinary "B'[0-1]\+'"
+syn match picDecimal "D'\d\+'"
+syn match picDecimal "\d\+"
+syn match picHexadecimal "0x\x\+"
+syn match picHexadecimal "H'\x\+'"
+syn match picHexadecimal "[0-9]\x*h"
+syn match picOctal "O'[0-7]\o*'"
+
+
+syn match picComment ";.*" contains=picTodo
+
+syn region picString start=+"+ end=+"+
+
+syn keyword picRegister INDF TMR0 PCL STATUS FSR PORTA PORTB
+syn keyword picRegister EEDATA EEADR PCLATH INTCON INDF OPTION_REG PCL
+syn keyword picRegister FSR TRISA TRISB EECON1 EECON2 INTCON OPTION
+
+
+" Register --- bits
+
+" STATUS
+syn keyword picRegisterPart IRP RP1 RP0 TO PD Z DC C
+
+" PORTA
+syn keyword picRegisterPart T0CKI
+syn match picRegisterPart "RA[0-4]"
+
+" PORTB
+syn keyword picRegisterPart INT
+syn match picRegisterPart "RB[0-7]"
+
+" INTCON
+syn keyword picRegisterPart GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
+
+" OPTION
+syn keyword picRegisterPart RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
+
+" EECON2
+syn keyword picRegisterPart EEIF WRERR WREN WR RD
+
+" INTCON
+syn keyword picRegisterPart GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
+
+
+" OpCodes...
+syn keyword picOpcode ADDWF ANDWF CLRF CLRW COMF DECF DECFSZ INCF INCFSZ
+syn keyword picOpcode IORWF MOVF MOVWF NOP RLF RRF SUBWF SWAPF XORWF
+syn keyword picOpcode BCF BSF BTFSC BTFSS
+syn keyword picOpcode ADDLW ANDLW CALL CLRWDT GOTO IORLW MOVLW RETFIE
+syn keyword picOpcode RETLW RETURN SLEEP SUBLW XORLW
+syn keyword picOpcode GOTO
+
+
+" Directives
+syn keyword picDirective __BADRAM BANKISEL BANKSEL CBLOCK CODE __CONFIG
+syn keyword picDirective CONSTANT DATA DB DE DT DW ELSE END ENDC
+syn keyword picDirective ENDIF ENDM ENDW EQU ERROR ERRORLEVEL EXITM EXPAND
+syn keyword picDirective EXTERN FILL GLOBAL IDATA __IDLOCS IF IFDEF IFNDEF
+syn keyword picDirective INCLUDE LIST LOCAL MACRO __MAXRAM MESSG NOEXPAND
+syn keyword picDirective NOLIST ORG PAGE PAGESEL PROCESSOR RADIX RES SET
+syn keyword picDirective SPACE SUBTITLE TITLE UDATA UDATA_OVR UDATA_SHR
+syn keyword picDirective VARIABLE WHILE INCLUDE
+syn match picDirective "#\=UNDEFINE"
+syn match picDirective "#\=INCLUDE"
+syn match picDirective "#\=DEFINE"
+
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/pike.vim b/runtime/syntax/pike.vim
new file mode 100644
index 0000000..2c34cb4
--- /dev/null
+++ b/runtime/syntax/pike.vim
@@ -0,0 +1,386 @@
+" Vim syntax file
+" 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
+
+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 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 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 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 display contained "\<\d\+\%(f\|\.[0-9.]\@!\d*\%(e[-+]\=\d\+\)\=[fl]\=\)"
+"floating point number, starting with a dot, optional exponent
+syn match pikeFloat display contained "[0-9.]\@1<!\.\d\+\%(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+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 display contained "\<0\o*[89]\d*"
+syn case match
+
+if exists("c_comment_strings")
+ " A comment can contain pikeString, pikeCharacter and pikeNumber.
+ " But a "*/" inside a pikeString in a pikeComment DOES end the comment! So we
+ " 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 :-(
+ 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 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
+" 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 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 keyword pikeType int void
+syn keyword pikeType float
+syn keyword pikeType bool string array mapping multiset mixed
+syn keyword pikeType object function program auto
+
+syn keyword pikeType this this_object this_program
+syn keyword pikeType sprintf_args sprintf_format sprintf_result
+syn keyword pikeType strict_sprintf_format
+
+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 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
+
+" 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
+ 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
+
+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
new file mode 100644
index 0000000..f0e5f9b
--- /dev/null
+++ b/runtime/syntax/pilrc.vim
@@ -0,0 +1,136 @@
+" Vim syntax file
+" Language: pilrc - a resource compiler for Palm OS development
+" Maintainer: Brian Schau <brian@schau.com>
+" Last change: 2003 May 11
+" Available on: http://www.schau.com/pilrcvim/pilrc.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Notes: TRANSPARENT, FONT and FONT ID are defined in the specials
+" section below. Beware of the order of the specials!
+" Look in the syntax.txt and usr_27.txt files in vim\vim{version}\doc
+" directory for regexps etc.
+
+" Keywords - basic
+syn keyword pilrcKeyword ALERT APPLICATION APPLICATIONICONNAME AREA
+syn keyword pilrcKeyword BITMAP BITMAPCOLOR BITMAPCOLOR16 BITMAPCOLOR16K
+syn keyword pilrcKeyword BITMAPFAMILY BITMAPFAMILYEX BITMAPFAMILYSPECIAL
+syn keyword pilrcKeyword BITMAPGREY BITMAPGREY16 BITMAPSCREENFAMILY
+syn keyword pilrcKeyword BOOTSCREENFAMILY BUTTON BUTTONS BYTELIST
+syn keyword pilrcKeyword CATEGORIES CHECKBOX COUNTRYLOCALISATION
+syn keyword pilrcKeyword DATA
+syn keyword pilrcKeyword FEATURE FIELD FONTINDEX FORM FORMBITMAP
+syn keyword pilrcKeyword GADGET GENERATEHEADER
+syn keyword pilrcKeyword GRAFFITIINPUTAREA GRAFFITISTATEINDICATOR
+syn keyword pilrcKeyword HEX
+syn keyword pilrcKeyword ICON ICONFAMILY ICONFAMILYEX INTEGER
+syn keyword pilrcKeyword KEYBOARD
+syn keyword pilrcKeyword LABEL LAUNCHERCATEGORY LIST LONGWORDLIST
+syn keyword pilrcKeyword MENU MENUITEM MESSAGE MIDI
+syn keyword pilrcKeyword PALETTETABLE POPUPLIST POPUPTRIGGER
+syn keyword pilrcKeyword PULLDOWN PUSHBUTTON
+syn keyword pilrcKeyword REPEATBUTTON RESETAUTOID
+syn keyword pilrcKeyword SCROLLBAR SELECTORTRIGGER SLIDER SMALLICON
+syn keyword pilrcKeyword SMALLICONFAMILY SMALLICONFAMILYEX STRING STRINGTABLE
+syn keyword pilrcKeyword TABLE TITLE TRANSLATION TRAP
+syn keyword pilrcKeyword VERSION
+syn keyword pilrcKeyword WORDLIST
+
+" Types
+syn keyword pilrcType AT AUTOSHIFT
+syn keyword pilrcType BACKGROUNDID BITMAPID BOLDFRAME BPP
+syn keyword pilrcType CHECKED COLORTABLE COLUMNS COLUMNWIDTHS COMPRESS
+syn keyword pilrcType COMPRESSBEST COMPRESSPACKBITS COMPRESSRLE COMPRESSSCANLINE
+syn keyword pilrcType CONFIRMATION COUNTRY CREATOR CURRENCYDECIMALPLACES
+syn keyword pilrcType CURRENCYNAME CURRENCYSYMBOL CURRENCYUNIQUESYMBOL
+syn keyword pilrcType DATEFORMAT DAYLIGHTSAVINGS DEFAULTBTNID DEFAULTBUTTON
+syn keyword pilrcType DENSITY DISABLED DYNAMICSIZE
+syn keyword pilrcType EDITABLE ENTRY ERROR EXTENDED
+syn keyword pilrcType FEEDBACK FILE FONTID FORCECOMPRESS FRAME
+syn keyword pilrcType GRAFFITI GRAPHICAL GROUP
+syn keyword pilrcType HASSCROLLBAR HELPID
+syn keyword pilrcType ID INDEX INFORMATION
+syn keyword pilrcType KEYDOWNCHR KEYDOWNKEYCODE KEYDOWNMODIFIERS
+syn keyword pilrcType LANGUAGE LEFTALIGN LEFTANCHOR LONGDATEFORMAT
+syn keyword pilrcType MAX MAXCHARS MEASUREMENTSYSTEM MENUID MIN LOCALE
+syn keyword pilrcType MINUTESWESTOFGMT MODAL MULTIPLELINES
+syn keyword pilrcType NAME NOCOLORTABLE NOCOMPRESS NOFRAME NONEDITABLE
+syn keyword pilrcType NONEXTENDED NONUSABLE NOSAVEBEHIND NUMBER NUMBERFORMAT
+syn keyword pilrcType NUMERIC
+syn keyword pilrcType PAGESIZE
+syn keyword pilrcType RECTFRAME RIGHTALIGN RIGHTANCHOR ROWS
+syn keyword pilrcType SAVEBEHIND SEARCH SCREEN SELECTEDBITMAPID SINGLELINE
+syn keyword pilrcType THUMBID TRANSPARENTINDEX TIMEFORMAT
+syn keyword pilrcType UNDERLINED USABLE
+syn keyword pilrcType VALUE VERTICAL VISIBLEITEMS
+syn keyword pilrcType WARNING WEEKSTARTDAY
+
+" Country
+syn keyword pilrcCountry Australia Austria Belgium Brazil Canada Denmark
+syn keyword pilrcCountry Finland France Germany HongKong Iceland Indian
+syn keyword pilrcCountry Indonesia Ireland Italy Japan Korea Luxembourg Malaysia
+syn keyword pilrcCountry Mexico Netherlands NewZealand Norway Philippines
+syn keyword pilrcCountry RepChina Singapore Spain Sweden Switzerland Thailand
+syn keyword pilrcCountry Taiwan UnitedKingdom UnitedStates
+
+" Language
+syn keyword pilrcLanguage English French German Italian Japanese Spanish
+
+" String
+syn match pilrcString "\"[^"]*\""
+
+" Number
+syn match pilrcNumber "\<0x\x\+\>"
+syn match pilrcNumber "\<\d\+\>"
+
+" Comment
+syn region pilrcComment start="/\*" end="\*/"
+syn region pilrcComment start="//" end="$"
+
+" Constants
+syn keyword pilrcConstant AUTO AUTOID BOTTOM CENTER PREVBOTTOM PREVHEIGHT
+syn keyword pilrcConstant PREVLEFT PREVRIGHT PREVTOP PREVWIDTH RIGHT
+syn keyword pilrcConstant SEPARATOR
+
+" Identifier
+syn match pilrcIdentifier "\<\h\w*\>"
+
+" Specials
+syn match pilrcType "\<FONT\>"
+syn match pilrcKeyword "\<FONT\>\s*\<ID\>"
+syn match pilrcType "\<TRANSPARENT\>"
+
+" Function
+syn keyword pilrcFunction BEGIN END
+
+" Include
+syn match pilrcInclude "\#include"
+syn match pilrcInclude "\#define"
+syn keyword pilrcInclude equ
+syn keyword pilrcInclude package
+syn region pilrcInclude start="public class" end="}"
+
+syn sync ccomment pilrcComment
+
+
+" 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
new file mode 100644
index 0000000..aadf50b
--- /dev/null
+++ b/runtime/syntax/pine.vim
@@ -0,0 +1,355 @@
+" Vim syntax file
+" Language: Pine (email program) run commands
+" Maintainer: David Pascoe <pascoedj@spamcop.net>
+" Last Change: Thu Feb 27 10:18:48 WST 2003, update for pine 4.53
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=@,48-57,_,128-167,224-235,-
+
+syn keyword pineConfig addrbook-sort-rule
+syn keyword pineConfig address-book
+syn keyword pineConfig addressbook-formats
+syn keyword pineConfig alt-addresses
+syn keyword pineConfig bugs-additional-data
+syn keyword pineConfig bugs-address
+syn keyword pineConfig bugs-fullname
+syn keyword pineConfig character-set
+syn keyword pineConfig color-style
+syn keyword pineConfig compose-mime
+syn keyword pineConfig composer-wrap-column
+syn keyword pineConfig current-indexline-style
+syn keyword pineConfig cursor-style
+syn keyword pineConfig customized-hdrs
+syn keyword pineConfig debug-memory
+syn keyword pineConfig default-composer-hdrs
+syn keyword pineConfig default-fcc
+syn keyword pineConfig default-saved-msg-folder
+syn keyword pineConfig disable-these-authenticators
+syn keyword pineConfig disable-these-drivers
+syn keyword pineConfig display-filters
+syn keyword pineConfig download-command
+syn keyword pineConfig download-command-prefix
+syn keyword pineConfig editor
+syn keyword pineConfig elm-style-save
+syn keyword pineConfig empty-header-message
+syn keyword pineConfig fcc-name-rule
+syn keyword pineConfig feature-level
+syn keyword pineConfig feature-list
+syn keyword pineConfig file-directory
+syn keyword pineConfig folder-collections
+syn keyword pineConfig folder-extension
+syn keyword pineConfig folder-sort-rule
+syn keyword pineConfig font-char-set
+syn keyword pineConfig font-name
+syn keyword pineConfig font-size
+syn keyword pineConfig font-style
+syn keyword pineConfig forced-abook-entry
+syn keyword pineConfig form-letter-folder
+syn keyword pineConfig global-address-book
+syn keyword pineConfig goto-default-rule
+syn keyword pineConfig header-in-reply
+syn keyword pineConfig image-viewer
+syn keyword pineConfig inbox-path
+syn keyword pineConfig incoming-archive-folders
+syn keyword pineConfig incoming-folders
+syn keyword pineConfig incoming-startup-rule
+syn keyword pineConfig index-answered-background-color
+syn keyword pineConfig index-answered-foreground-color
+syn keyword pineConfig index-deleted-background-color
+syn keyword pineConfig index-deleted-foreground-color
+syn keyword pineConfig index-format
+syn keyword pineConfig index-important-background-color
+syn keyword pineConfig index-important-foreground-color
+syn keyword pineConfig index-new-background-color
+syn keyword pineConfig index-new-foreground-color
+syn keyword pineConfig index-recent-background-color
+syn keyword pineConfig index-recent-foreground-color
+syn keyword pineConfig index-to-me-background-color
+syn keyword pineConfig index-to-me-foreground-color
+syn keyword pineConfig index-unseen-background-color
+syn keyword pineConfig index-unseen-foreground-color
+syn keyword pineConfig initial-keystroke-list
+syn keyword pineConfig kblock-passwd-count
+syn keyword pineConfig keylabel-background-color
+syn keyword pineConfig keylabel-foreground-color
+syn keyword pineConfig keyname-background-color
+syn keyword pineConfig keyname-foreground-color
+syn keyword pineConfig last-time-prune-questioned
+syn keyword pineConfig last-version-used
+syn keyword pineConfig ldap-servers
+syn keyword pineConfig literal-signature
+syn keyword pineConfig local-address
+syn keyword pineConfig local-fullname
+syn keyword pineConfig mail-check-interval
+syn keyword pineConfig mail-directory
+syn keyword pineConfig mailcap-search-path
+syn keyword pineConfig mimetype-search-path
+syn keyword pineConfig new-version-threshold
+syn keyword pineConfig news-active-file-path
+syn keyword pineConfig news-collections
+syn keyword pineConfig news-spool-directory
+syn keyword pineConfig newsrc-path
+syn keyword pineConfig nntp-server
+syn keyword pineConfig normal-background-color
+syn keyword pineConfig normal-foreground-color
+syn keyword pineConfig old-style-reply
+syn keyword pineConfig operating-dir
+syn keyword pineConfig patterns
+syn keyword pineConfig patterns-filters
+syn keyword pineConfig patterns-filters2
+syn keyword pineConfig patterns-indexcolors
+syn keyword pineConfig patterns-other
+syn keyword pineConfig patterns-roles
+syn keyword pineConfig patterns-scores
+syn keyword pineConfig patterns-scores2
+syn keyword pineConfig personal-name
+syn keyword pineConfig personal-print-category
+syn keyword pineConfig personal-print-command
+syn keyword pineConfig postponed-folder
+syn keyword pineConfig print-font-char-set
+syn keyword pineConfig print-font-name
+syn keyword pineConfig print-font-size
+syn keyword pineConfig print-font-style
+syn keyword pineConfig printer
+syn keyword pineConfig prompt-background-color
+syn keyword pineConfig prompt-foreground-color
+syn keyword pineConfig pruned-folders
+syn keyword pineConfig pruning-rule
+syn keyword pineConfig quote1-background-color
+syn keyword pineConfig quote1-foreground-color
+syn keyword pineConfig quote2-background-color
+syn keyword pineConfig quote2-foreground-color
+syn keyword pineConfig quote3-background-color
+syn keyword pineConfig quote3-foreground-color
+syn keyword pineConfig read-message-folder
+syn keyword pineConfig remote-abook-history
+syn keyword pineConfig remote-abook-metafile
+syn keyword pineConfig remote-abook-validity
+syn keyword pineConfig reply-indent-string
+syn keyword pineConfig reply-leadin
+syn keyword pineConfig reverse-background-color
+syn keyword pineConfig reverse-foreground-color
+syn keyword pineConfig rsh-command
+syn keyword pineConfig rsh-open-timeout
+syn keyword pineConfig rsh-path
+syn keyword pineConfig save-by-sender
+syn keyword pineConfig saved-msg-name-rule
+syn keyword pineConfig scroll-margin
+syn keyword pineConfig selectable-item-background-color
+syn keyword pineConfig selectable-item-foreground-color
+syn keyword pineConfig sending-filters
+syn keyword pineConfig sendmail-path
+syn keyword pineConfig show-all-characters
+syn keyword pineConfig signature-file
+syn keyword pineConfig smtp-server
+syn keyword pineConfig sort-key
+syn keyword pineConfig speller
+syn keyword pineConfig ssh-command
+syn keyword pineConfig ssh-open-timeout
+syn keyword pineConfig ssh-path
+syn keyword pineConfig standard-printer
+syn keyword pineConfig status-background-color
+syn keyword pineConfig status-foreground-color
+syn keyword pineConfig status-message-delay
+syn keyword pineConfig suggest-address
+syn keyword pineConfig suggest-fullname
+syn keyword pineConfig tcp-open-timeout
+syn keyword pineConfig tcp-query-timeout
+syn keyword pineConfig tcp-read-warning-timeout
+syn keyword pineConfig tcp-write-warning-timeout
+syn keyword pineConfig threading-display-style
+syn keyword pineConfig threading-expanded-character
+syn keyword pineConfig threading-index-style
+syn keyword pineConfig threading-indicator-character
+syn keyword pineConfig threading-lastreply-character
+syn keyword pineConfig title-background-color
+syn keyword pineConfig title-foreground-color
+syn keyword pineConfig titlebar-color-style
+syn keyword pineConfig upload-command
+syn keyword pineConfig upload-command-prefix
+syn keyword pineConfig url-viewers
+syn keyword pineConfig use-only-domain-name
+syn keyword pineConfig user-domain
+syn keyword pineConfig user-id
+syn keyword pineConfig user-id
+syn keyword pineConfig user-input-timeout
+syn keyword pineConfig viewer-hdr-colors
+syn keyword pineConfig viewer-hdrs
+syn keyword pineConfig viewer-overlap
+syn keyword pineConfig window-position
+
+syn keyword pineOption allow-changing-from
+syn keyword pineOption allow-talk
+syn keyword pineOption alternate-compose-menu
+syn keyword pineOption assume-slow-link
+syn keyword pineOption auto-move-read-msgs
+syn keyword pineOption auto-open-next-unread
+syn keyword pineOption auto-unzoom-after-apply
+syn keyword pineOption auto-zoom-after-select
+syn keyword pineOption cache-remote-pinerc
+syn keyword pineOption check-newmail-when-quitting
+syn keyword pineOption combined-addrbook-display
+syn keyword pineOption combined-folder-display
+syn keyword pineOption combined-subdirectory-display
+syn keyword pineOption compose-cut-from-cursor
+syn keyword pineOption compose-maps-delete-key-to-ctrl-d
+syn keyword pineOption compose-rejects-unqualified-addrs
+syn keyword pineOption compose-send-offers-first-filter
+syn keyword pineOption compose-sets-newsgroup-without-confirm
+syn keyword pineOption confirm-role-even-for-default
+syn keyword pineOption continue-tab-without-confirm
+syn keyword pineOption delete-skips-deleted
+syn keyword pineOption disable-2022-jp-conversions
+syn keyword pineOption disable-busy-alarm
+syn keyword pineOption disable-charset-conversions
+syn keyword pineOption disable-config-cmd
+syn keyword pineOption disable-keyboard-lock-cmd
+syn keyword pineOption disable-keymenu
+syn keyword pineOption disable-password-caching
+syn keyword pineOption disable-password-cmd
+syn keyword pineOption disable-pipes-in-sigs
+syn keyword pineOption disable-pipes-in-templates
+syn keyword pineOption disable-roles-setup-cmd
+syn keyword pineOption disable-roles-sig-edit
+syn keyword pineOption disable-roles-template-edit
+syn keyword pineOption disable-sender
+syn keyword pineOption disable-shared-namespaces
+syn keyword pineOption disable-signature-edit-cmd
+syn keyword pineOption disable-take-last-comma-first
+syn keyword pineOption enable-8bit-esmtp-negotiation
+syn keyword pineOption enable-8bit-nntp-posting
+syn keyword pineOption enable-aggregate-command-set
+syn keyword pineOption enable-alternate-editor-cmd
+syn keyword pineOption enable-alternate-editor-implicitly
+syn keyword pineOption enable-arrow-navigation
+syn keyword pineOption enable-arrow-navigation-relaxed
+syn keyword pineOption enable-background-sending
+syn keyword pineOption enable-bounce-cmd
+syn keyword pineOption enable-cruise-mode
+syn keyword pineOption enable-cruise-mode-delete
+syn keyword pineOption enable-delivery-status-notification
+syn keyword pineOption enable-dot-files
+syn keyword pineOption enable-dot-folders
+syn keyword pineOption enable-exit-via-lessthan-command
+syn keyword pineOption enable-fast-recent-test
+syn keyword pineOption enable-flag-cmd
+syn keyword pineOption enable-flag-screen-implicitly
+syn keyword pineOption enable-full-header-and-text
+syn keyword pineOption enable-full-header-cmd
+syn keyword pineOption enable-goto-in-file-browser
+syn keyword pineOption enable-incoming-folders
+syn keyword pineOption enable-jump-shortcut
+syn keyword pineOption enable-lame-list-mode
+syn keyword pineOption enable-mail-check-cue
+syn keyword pineOption enable-mailcap-param-substitution
+syn keyword pineOption enable-mouse-in-xterm
+syn keyword pineOption enable-msg-view-addresses
+syn keyword pineOption enable-msg-view-attachments
+syn keyword pineOption enable-msg-view-forced-arrows
+syn keyword pineOption enable-msg-view-urls
+syn keyword pineOption enable-msg-view-web-hostnames
+syn keyword pineOption enable-newmail-in-xterm-icon
+syn keyword pineOption enable-partial-match-lists
+syn keyword pineOption enable-print-via-y-command
+syn keyword pineOption enable-reply-indent-string-editing
+syn keyword pineOption enable-rules-under-take
+syn keyword pineOption enable-search-and-replace
+syn keyword pineOption enable-sigdashes
+syn keyword pineOption enable-suspend
+syn keyword pineOption enable-tab-completion
+syn keyword pineOption enable-take-export
+syn keyword pineOption enable-tray-icon
+syn keyword pineOption enable-unix-pipe-cmd
+syn keyword pineOption enable-verbose-smtp-posting
+syn keyword pineOption expanded-view-of-addressbooks
+syn keyword pineOption expanded-view-of-distribution-lists
+syn keyword pineOption expanded-view-of-folders
+syn keyword pineOption expose-hidden-config
+syn keyword pineOption expunge-only-manually
+syn keyword pineOption expunge-without-confirm
+syn keyword pineOption expunge-without-confirm-everywhere
+syn keyword pineOption fcc-on-bounce
+syn keyword pineOption fcc-only-without-confirm
+syn keyword pineOption fcc-without-attachments
+syn keyword pineOption include-attachments-in-reply
+syn keyword pineOption include-header-in-reply
+syn keyword pineOption include-text-in-reply
+syn keyword pineOption ldap-result-to-addrbook-add
+syn keyword pineOption mark-fcc-seen
+syn keyword pineOption mark-for-cc
+syn keyword pineOption news-approximates-new-status
+syn keyword pineOption news-deletes-across-groups
+syn keyword pineOption news-offers-catchup-on-close
+syn keyword pineOption news-post-without-validation
+syn keyword pineOption news-read-in-newsrc-order
+syn keyword pineOption next-thread-without-confirm
+syn keyword pineOption old-growth
+syn keyword pineOption pass-control-characters-as-is
+syn keyword pineOption prefer-plain-text
+syn keyword pineOption preserve-start-stop-characters
+syn keyword pineOption print-formfeed-between-messages
+syn keyword pineOption print-includes-from-line
+syn keyword pineOption print-index-enabled
+syn keyword pineOption print-offers-custom-cmd-prompt
+syn keyword pineOption quell-attachment-extra-prompt
+syn keyword pineOption quell-berkeley-format-timezone
+syn keyword pineOption quell-content-id
+syn keyword pineOption quell-dead-letter-on-cancel
+syn keyword pineOption quell-empty-directories
+syn keyword pineOption quell-extra-post-prompt
+syn keyword pineOption quell-folder-internal-msg
+syn keyword pineOption quell-imap-envelope-update
+syn keyword pineOption quell-lock-failure-warnings
+syn keyword pineOption quell-maildomain-warning
+syn keyword pineOption quell-news-envelope-update
+syn keyword pineOption quell-partial-fetching
+syn keyword pineOption quell-ssl-largeblocks
+syn keyword pineOption quell-status-message-beeping
+syn keyword pineOption quell-timezone-comment-when-sending
+syn keyword pineOption quell-user-lookup-in-passwd-file
+syn keyword pineOption quit-without-confirm
+syn keyword pineOption reply-always-uses-reply-to
+syn keyword pineOption save-aggregates-copy-sequence
+syn keyword pineOption save-will-advance
+syn keyword pineOption save-will-not-delete
+syn keyword pineOption save-will-quote-leading-froms
+syn keyword pineOption scramble-message-id
+syn keyword pineOption select-without-confirm
+syn keyword pineOption selectable-item-nobold
+syn keyword pineOption separate-folder-and-directory-entries
+syn keyword pineOption show-cursor
+syn keyword pineOption show-plain-text-internally
+syn keyword pineOption show-selected-in-boldface
+syn keyword pineOption signature-at-bottom
+syn keyword pineOption single-column-folder-list
+syn keyword pineOption slash-collapses-entire-thread
+syn keyword pineOption spell-check-before-sending
+syn keyword pineOption store-window-position-in-config
+syn keyword pineOption strip-from-sigdashes-on-reply
+syn keyword pineOption tab-visits-next-new-message-only
+syn keyword pineOption termdef-takes-precedence
+syn keyword pineOption thread-index-shows-important-color
+syn keyword pineOption try-alternative-authentication-driver-first
+syn keyword pineOption unselect-will-not-advance
+syn keyword pineOption use-current-dir
+syn keyword pineOption use-function-keys
+syn keyword pineOption use-sender-not-x-sender
+syn keyword pineOption use-subshell-for-suspend
+syn keyword pineOption vertical-folder-list
+
+syn match pineComment "^#.*$"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link pineConfig Type
+hi def link pineComment Comment
+hi def link pineOption Macro
+
+let b:current_syntax = "pine"
+
+" vim: ts=8
diff --git a/runtime/syntax/pinfo.vim b/runtime/syntax/pinfo.vim
new file mode 100644
index 0000000..cb9e60e
--- /dev/null
+++ b/runtime/syntax/pinfo.vim
@@ -0,0 +1,110 @@
+" Vim syntax file
+" Language: pinfo(1) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-
+
+syn case ignore
+
+syn keyword pinfoTodo contained FIXME TODO XXX NOTE
+
+syn region pinfoComment start='^#' end='$' contains=pinfoTodo,@Spell
+
+syn keyword pinfoOptions MANUAL CUT-MAN-HEADERS CUT-EMPTY-MAN-LINES
+ \ RAW-FILENAME APROPOS
+ \ DONT-HANDLE-WITHOUT-TAG-TABLE HTTPVIEWER
+ \ FTPVIEWER MAILEDITOR PRINTUTILITY MANLINKS
+ \ INFOPATH MAN-OPTIONS STDERR-REDIRECTION
+ \ LONG-MANUAL-LINKS FILTER-0xB7
+ \ QUIT-CONFIRMATION QUIT-CONFIRM-DEFAULT
+ \ CLEAR-SCREEN-AT-EXIT CALL-READLINE-HISTORY
+ \ HIGHLIGHTREGEXP SAFE-USER SAFE-GROUP
+
+syn keyword pinfoColors COL_NORMAL COL_TOPLINE COL_BOTTOMLINE
+ \ COL_MENU COL_MENUSELECTED COL_NOTE
+ \ COL_NOTESELECTED COL_URL COL_URLSELECTED
+ \ COL_INFOHIGHLIGHT COL_MANUALBOLD
+ \ COL_MANUALITALIC COL_SEARCHHIGHLIGHT
+
+syn keyword pinfoColorDefault COLOR_DEFAULT
+syn keyword pinfoColorBold BOLD
+syn keyword pinfoColorNoBold NO_BOLD
+syn keyword pinfoColorBlink BLINK
+syn keyword pinfoColorNoBlink NO_BLINK
+syn keyword pinfoColorBlack COLOR_BLACK
+syn keyword pinfoColorRed COLOR_RED
+syn keyword pinfoColorGreen COLOR_GREEN
+syn keyword pinfoColorYellow COLOR_YELLOW
+syn keyword pinfoColorBlue COLOR_BLUE
+syn keyword pinfoColorMagenta COLOR_MAGENTA
+syn keyword pinfoColorCyan COLOR_CYAN
+syn keyword pinfoColorWhite COLOR_WHITE
+
+syn keyword pinfoKeys KEY_TOTALSEARCH_1 KEY_TOTALSEARCH_2
+ \ KEY_SEARCH_1 KEY_SEARCH_2
+ \ KEY_SEARCH_AGAIN_1 KEY_SEARCH_AGAIN_2
+ \ KEY_GOTO_1 KEY_GOTO_2 KEY_PREVNODE_1
+ \ KEY_PREVNODE_2 KEY_NEXTNODE_1
+ \ KEY_NEXTNODE_2 KEY_UP_1 KEY_UP_2 KEY_END_1
+ \ KEY_END_2 KEY_PGDN_1 KEY_PGDN_2
+ \ KEY_PGDN_AUTO_1 KEY_PGDN_AUTO_2 KEY_HOME_1
+ \ KEY_HOME_2 KEY_PGUP_1 KEY_PGUP_2
+ \ KEY_PGUP_AUTO_1 KEY_PGUP_AUTO_2 KEY_DOWN_1
+ \ KEY_DOWN_2 KEY_TOP_1 KEY_TOP_2 KEY_BACK_1
+ \ KEY_BACK_2 KEY_FOLLOWLINK_1
+ \ KEY_FOLLOWLINK_2 KEY_REFRESH_1
+ \ KEY_REFRESH_2 KEY_SHELLFEED_1
+ \ KEY_SHELLFEED_2 KEY_QUIT_1 KEY_QUIT_2
+ \ KEY_GOLINE_1 KEY_GOLINE_2 KEY_PRINT_1
+ \ KEY_PRINT_2 KEY_DIRPAGE_1 KEY_DIRPAGE_2
+ \ KEY_TWODOWN_1 KEY_TWODOWN_2 KEY_TWOUP_1
+ \ KEY_TWOUP_2
+
+syn keyword pinfoSpecialKeys KEY_BREAK KEY_DOWN KEY_UP KEY_LEFT KEY_RIGHT
+ \ KEY_DOWN KEY_HOME KEY_BACKSPACE KEY_NPAGE
+ \ KEY_PPAGE KEY_END KEY_IC KEY_DC
+syn region pinfoSpecialKeys matchgroup=pinfoSpecialKeys transparent
+ \ start=+KEY_\%(F\|CTRL\|ALT\)(+ end=+)+
+syn region pinfoSimpleKey start=+'+ skip=+\\'+ end=+'+
+ \ contains=pinfoSimpleKeyEscape
+syn match pinfoSimpleKeyEscape +\\[\\nt']+
+syn match pinfoKeycode '\<\d\+\>'
+
+syn keyword pinfoConstants TRUE FALSE YES NO
+
+hi def link pinfoTodo Todo
+hi def link pinfoComment Comment
+hi def link pinfoOptions Keyword
+hi def link pinfoColors Keyword
+hi def link pinfoColorDefault Normal
+hi def link pinfoSpecialKeys SpecialChar
+hi def link pinfoSimpleKey String
+hi def link pinfoSimpleKeyEscape SpecialChar
+hi def link pinfoKeycode Number
+hi def link pinfoConstants Constant
+hi def link pinfoKeys Keyword
+hi def pinfoColorBold cterm=bold
+hi def pinfoColorNoBold cterm=none
+hi def pinfoColorBlink cterm=inverse
+hi def pinfoColorNoBlink cterm=none
+hi def pinfoColorBlack ctermfg=Black guifg=Black
+hi def pinfoColorRed ctermfg=DarkRed guifg=DarkRed
+hi def pinfoColorGreen ctermfg=DarkGreen guifg=DarkGreen
+hi def pinfoColorYellow ctermfg=DarkYellow guifg=DarkYellow
+hi def pinfoColorBlue ctermfg=DarkBlue guifg=DarkBlue
+hi def pinfoColorMagenta ctermfg=DarkMagenta guifg=DarkMagenta
+hi def pinfoColorCyan ctermfg=DarkCyan guifg=DarkCyan
+hi def pinfoColorWhite ctermfg=LightGray guifg=LightGray
+
+let b:current_syntax = "pinfo"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/plaintex.vim b/runtime/syntax/plaintex.vim
new file mode 100644
index 0000000..5cb49a0
--- /dev/null
+++ b/runtime/syntax/plaintex.vim
@@ -0,0 +1,170 @@
+" Vim syntax file
+" Language: TeX (plain.tex format)
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-10-26
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match plaintexControlSequence display contains=@NoSpell
+ \ '\\[a-zA-Z@]\+'
+
+runtime! syntax/initex.vim
+unlet b:current_syntax
+
+syn match plaintexComment display
+ \ contains=ALLBUT,initexComment,plaintexComment
+ \ '^\s*%[CDM].*$'
+
+if exists("g:plaintex_delimiters")
+ syn match plaintexDelimiter display '[][{}]'
+endif
+
+syn match plaintexRepeat display contains=@NoSpell
+ \ '\\\%(loop\|repeat\)\>'
+
+syn match plaintexCommand display contains=@NoSpell
+ \ '\\\%(plainoutput\|TeX\)\>'
+syn match plaintexBoxCommand display contains=@NoSpell
+ \ '\\\%(null\|strut\)\>'
+syn match plaintexDebuggingCommand display contains=@NoSpell
+ \ '\\\%(showhyphens\|tracingall\|wlog\)\>'
+syn match plaintexFontsCommand display contains=@NoSpell
+ \ '\\\%(bf\|\%(five\|seven\)\%(bf\|i\|rm\|sy\)\|it\|oldstyle\|rm\|sl\|ten\%(bf\|ex\|it\=\|rm\|sl\|sy\|tt\)\|tt\)\>'
+syn match plaintexGlueCommand display contains=@NoSpell
+ \ '\\\%(\%(big\|en\|med\|\%(no\|off\)interline\|small\)skip\|\%(center\|left\|right\)\=line\|\%(dot\|\%(left\|right\)arrow\)fill\|[hv]glue\|[lr]lap\|q\=quad\|space\|topglue\)\>'
+syn match plaintexInsertsCommand display contains=@NoSpell
+ \ '\\\%(\%(end\|top\)insert\|v\=footnote\)\>'
+syn match plaintexJobCommand display contains=@NoSpell
+ \ '\\\%(bye\|fmt\%(name\|version\)\)\>'
+syn match plaintexInsertsCommand display contains=@NoSpell
+ \ '\\\%(mid\|page\)insert\>'
+syn match plaintexKernCommand display contains=@NoSpell
+ \ '\\\%(en\|\%(neg\)\=thin\)space\>'
+syn match plaintexMacroCommand display contains=@NoSpell
+ \ '\\\%(active\|[be]group\|empty\)\>'
+syn match plaintexPageCommand display contains=@NoSpell
+ \ '\\\%(\%(super\)\=eject\|nopagenumbers\|\%(normal\|ragged\)bottom\)\>'
+syn match plaintexParagraphCommand display contains=@NoSpell
+ \ '\\\%(endgraf\|\%(non\)\=frenchspacing\|hang\|item\%(item\)\=\|narrower\|normalbaselines\|obey\%(lines\|spaces\)\|openup\|proclaim\|\%(tt\)\=raggedright\|textindent\)\>'
+syn match plaintexPenaltiesCommand display contains=@NoSpell
+ \ '\\\%(allow\|big\|fil\|good\|med\|no\|small\)\=break\>'
+syn match plaintexRegistersCommand display contains=@NoSpell
+ \ '\\\%(advancepageno\|new\%(box\|count\|dimen\|fam\|help\|if\|insert\|language\|muskip\|read\|skip\|toks\|write\)\)\>'
+syn match plaintexTablesCommand display contains=@NoSpell
+ \ '&\|\\+\|\\\%(cleartabs\|endline\|hidewidth\|ialign\|multispan\|settabs\|tabalign\)\>'
+
+if !exists("g:plaintex_no_math")
+ syn region plaintexMath matchgroup=plaintexMath
+ \ contains=@plaintexMath,@NoSpell
+ \ start='\$' skip='\\\\\|\\\$' end='\$'
+ syn region plaintexMath matchgroup=plaintexMath
+ \ contains=@plaintexMath,@NoSpell keepend
+ \ start='\$\$' skip='\\\\\|\\\$' end='\$\$'
+endif
+
+" Keep this after plaintexMath, as we don’t want math mode started at a \$.
+syn match plaintexCharacterCommand display contains=@NoSpell
+ \ /\\\%(["#$%&'.=^_`~]\|``\|''\|-\{2,3}\|[?!]`\|^^L\|\~\|\%(a[ae]\|A[AE]\|acute\|[cdHoOPStuvijlL]\|copyright\|d\=dag\|folio\|ldotp\|[lr]q\|oe\|OE\|slash\|ss\|underbar\)\>\)/
+
+syn cluster plaintexMath
+ \ contains=plaintexMathCommand,plaintexMathBoxCommand,
+ \ plaintexMathCharacterCommand,plaintexMathDelimiter,
+ \ plaintexMathFontsCommand,plaintexMathLetter,plaintexMathSymbol,
+ \ plaintexMathFunction,plaintexMathOperator,plaintexMathPunctuation,
+ \ plaintexMathRelation
+
+syn match plaintexMathCommand display contains=@NoSpell contained
+ \ '\\\%([!*,;>{}|_^]\|\%([aA]rrowvert\|[bB]ig\%(g[lmr]\=\|r\)\=\|\%(border\|p\)\=matrix\|displaylines\|\%(down\|up\)bracefill\|eqalign\%(no\)\|leqalignno\|[lr]moustache\|mathpalette\|root\|s[bp]\|skew\|sqrt\)\>\)'
+syn match plaintexMathBoxCommand display contains=@NoSpell contained
+ \ '\\\%([hv]\=phantom\|mathstrut\|smash\)\>'
+syn match plaintexMathCharacterCommand display contains=@NoSpell contained
+ \ '\\\%(b\|bar\|breve\|check\|d\=dots\=\|grave\|hat\|[lv]dots\|tilde\|vec\|wide\%(hat\|tilde\)\)\>'
+syn match plaintexMathDelimiter display contains=@NoSpell contained
+ \ '\\\%(brace\%(vert\)\=\|brack\|cases\|choose\|[lr]\%(angle\|brace\|brack\|ceil\|floor\|group\)\|over\%(brace\|\%(left\|right\)arrow\)\|underbrace\)\>'
+syn match plaintexMathFontsCommand display contains=@NoSpell contained
+ \ '\\\%(\%(bf\|it\|sl\|tt\)fam\|cal\|mit\)\>'
+syn match plaintexMathLetter display contains=@NoSpell contained
+ \ '\\\%(aleph\|alpha\|beta\|chi\|[dD]elta\|ell\|epsilon\|eta\|[gG]amma\|[ij]math\|iota\|kappa\|[lL]ambda\|[mn]u\|[oO]mega\|[pP][hs]\=i\|rho\|[sS]igma\|tau\|[tT]heta\|[uU]psilon\|var\%(epsilon\|ph\=i\|rho\|sigma\|theta\)\|[xX]i\|zeta\)\>'
+syn match plaintexMathSymbol display contains=@NoSpell contained
+ \ '\\\%(angle\|backslash\|bot\|clubsuit\|emptyset\|epsilon\|exists\|flat\|forall\|hbar\|heartsuit\|Im\|infty\|int\|lnot\|nabla\|natural\|neg\|pmod\|prime\|Re\|sharp\|smallint\|spadesuit\|surd\|top\|triangle\%(left\|right\)\=\|vdash\|wp\)\>'
+syn match plaintexMathFunction display contains=@NoSpell contained
+ \ '\\\%(arc\%(cos\|sin\|tan\)\|arg\|\%(cos\|sin\|tan\)h\=\|coth\=\|csc\|de[gt]\|dim\|exp\|gcd\|hom\|inf\|ker\|lo\=g\|lim\%(inf\|sup\)\=\|ln\|max\|min\|Pr\|sec\|sup\)\>'
+syn match plaintexMathOperator display contains=@NoSpell contained
+ \ '\\\%(amalg\|ast\|big\%(c[au]p\|circ\|o\%(dot\|plus\|times\|sqcup\)\|triangle\%(down\|up\)\|uplus\|vee\|wedge\|bmod\|bullet\)\|c[au]p\|cdot[ps]\=\|circ\|coprod\|d\=dagger\|diamond\%(suit\)\=\|div\|land\|lor\|mp\|o\%(dot\|int\|minus\|plus\|slash\|times\)pm\|prod\|setminus\|sqc[au]p\|sqsu[bp]seteq\|star\|su[bp]set\%(eq\)\=\|sum\|times\|uplus\|vee\|wedge\|wr\)\>'
+syn match plaintexMathPunctuation display contains=@NoSpell contained
+ \ '\\\%(colon\)\>'
+syn match plaintexMathRelation display contains=@NoSpell contained
+ \ '\\\%(approx\|asymp\|bowtie\|buildrel\|cong\|dashv\|doteq\|[dD]ownarrow\|equiv\|frown\|geq\=\|gets\|gg\|hook\%(left\|right\)arrow\|iff\|in\|leq\=\|[lL]eftarrow\|\%(left\|right\)harpoon\%(down\|up\)\|[lL]eftrightarrow\|ll\|[lL]ongleftrightarrow\|longmapsto\|[lL]ongrightarrow\|mapsto\|mid\|models\|[ns][ew]arrow\|neq\=\|ni\|not\%(in\)\=\|owns\|parallel\|perp\|prec\%(eq\)\=\|propto\|[rR]ightarrow\|rightleftharpoons\|sim\%(eq\)\=\|smile\|succ\%(eq\)\=\|to\|[uU]parrow\|[uU]pdownarrow\|[vV]ert\)\>'
+
+syn match plaintexParameterDimen display contains=@NoSpell
+ \ '\\maxdimen\>'
+syn match plaintexMathParameterDimen display contains=@NoSpell
+ \ '\\jot\>'
+syn match plaintexParagraphParameterGlue display contains=@NoSpell
+ \ '\\\%(\%(big\|med\|small\)skipamount\|normalbaselineskip\|normallineskip\%(limit\)\=\)\>'
+
+syn match plaintexFontParameterInteger display contains=@NoSpell
+ \ '\\magstep\%(half\)\=\>'
+syn match plaintexJobParameterInteger display contains=@NoSpell
+ \ '\\magnification\>'
+syn match plaintexPageParameterInteger display contains=@NoSpell
+ \ '\\pageno\>'
+
+syn match plaintexPageParameterToken display contains=@NoSpell
+ \ '\\\%(foot\|head\)line\>'
+
+hi def link plaintexOperator Operator
+
+hi def link plaintexDelimiter Delimiter
+
+hi def link plaintexControlSequence Identifier
+hi def link plaintexComment Comment
+hi def link plaintexInclude Include
+hi def link plaintexRepeat Repeat
+
+hi def link plaintexCommand initexCommand
+hi def link plaintexBoxCommand plaintexCommand
+hi def link plaintexCharacterCommand initexCharacterCommand
+hi def link plaintexDebuggingCommand initexDebuggingCommand
+hi def link plaintexFontsCommand initexFontsCommand
+hi def link plaintexGlueCommand plaintexCommand
+hi def link plaintexInsertsCommand plaintexCommand
+hi def link plaintexJobCommand initexJobCommand
+hi def link plaintexKernCommand plaintexCommand
+hi def link plaintexMacroCommand initexMacroCommand
+hi def link plaintexPageCommand plaintexCommand
+hi def link plaintexParagraphCommand plaintexCommand
+hi def link plaintexPenaltiesCommand plaintexCommand
+hi def link plaintexRegistersCommand plaintexCommand
+hi def link plaintexTablesCommand plaintexCommand
+
+hi def link plaintexMath String
+hi def link plaintexMathCommand plaintexCommand
+hi def link plaintexMathBoxCommand plaintexBoxCommand
+hi def link plaintexMathCharacterCommand plaintexCharacterCommand
+hi def link plaintexMathDelimiter plaintexDelimiter
+hi def link plaintexMathFontsCommand plaintexFontsCommand
+hi def link plaintexMathLetter plaintexMathCharacterCommand
+hi def link plaintexMathSymbol plaintexMathLetter
+hi def link plaintexMathFunction Function
+hi def link plaintexMathOperator plaintexOperator
+hi def link plaintexMathPunctuation plaintexCharacterCommand
+hi def link plaintexMathRelation plaintexOperator
+
+hi def link plaintexParameterDimen initexParameterDimen
+hi def link plaintexMathParameterDimen initexMathParameterDimen
+hi def link plaintexParagraphParameterGlue initexParagraphParameterGlue
+hi def link plaintexFontParameterInteger initexFontParameterInteger
+hi def link plaintexJobParameterInteger initexJobParameterInteger
+hi def link plaintexPageParameterInteger initexPageParameterInteger
+hi def link plaintexPageParameterToken initexParameterToken
+
+let b:current_syntax = "plaintex"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/pli.vim b/runtime/syntax/pli.vim
new file mode 100644
index 0000000..a274cc4
--- /dev/null
+++ b/runtime/syntax/pli.vim
@@ -0,0 +1,266 @@
+" Vim syntax file
+" Modified from http://plnet.org/files/vim/
+" using keywords from http://www.kednos.com/pli/docs/reference_manual/6291pro_contents.html
+" 2012-11-13 Alan Thompson
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Todo.
+syn keyword pl1Todo TODO FIXME XXX DEBUG NOTE
+
+" pl1CommentGroup allows adding matches for special things in comments
+" 20010723az: Added this so that these could be matched in comments...
+syn cluster pl1CommentGroup contains=pl1Todo
+
+syn match pl1Garbage "[^ \t()]"
+syn match pl1Identifier "[a-z][a-z0-9$_#]*"
+syn match pl1HostIdentifier ":[a-z][a-z0-9$_#]*"
+
+" 20010723az: When wanted, highlight the trailing whitespace -- this is
+" based on c_space_errors
+if exists("c_space_errors")
+ if !exists("c_no_trail_space_error")
+ syn match pl1SpaceError "\s\+$"
+ endif
+ if !exists("c_no_tab_space_error")
+ syn match pl1SpaceError " \+\t"me=e-1
+ endif
+endif
+
+" Symbols.
+syn match pl1Symbol "\(;\|,\|\.\)"
+syn match pl1PreProcSym "%"
+
+" Operators.
+syn match pl1Operator "\(&\|:\|!\|+\|-\|\*\|/\|=\|<\|>\|@\|\*\*\|!=\|\~=\)"
+syn match pl1Operator "\(\^\|\^=\|<=\|>=\|:=\|=>\|\.\.\|||\|<<\|>>\|\"\)"
+
+" Attributes
+syn keyword pl1Attribute BACKWARDS BUFFERED BUF CONNECTED CONN CONSTANT EVENT
+syn keyword pl1Attribute EXCLUSIVE EXCL FORMAT GENERIC IRREDUCIBLE IRRED LOCAL
+syn keyword pl1Attribute REDUCIBLE RED TASK TRANSIENT UNBUFFERED UNBUF ALIGNED ANY
+syn keyword pl1Attribute AREA AUTOMATIC AUTO BASED BUILTIN CONDITION COND CONTROLLED
+syn keyword pl1Attribute CTL DEFINED DEF DIRECT ENVIRONMENT ENV EXTERNAL EXT FILE
+syn keyword pl1Attribute GLOBALDEF GLOBALREF INITIAL INIT INPUT INTERNAL INT KEYED
+syn keyword pl1Attribute LABEL LIKE LIST MEMBER NONVARYING NONVAR OPTIONAL OPTIONS
+syn keyword pl1Attribute OUTPUT PARAMETER PARM PICTURE PIC POSITION POS PRECISION
+syn keyword pl1Attribute PREC PRINT READONLY RECORD REFER RETURNS SEQUENTIAL SEQL
+syn keyword pl1Attribute STATIC STREAM STRUCTURE TRUNCATE UNALIGNED UNAL UNION UPDATE
+syn keyword pl1Attribute VARIABLE VARYING VAR COMPLEX CPLX REAL BINARY BIN BIT
+syn keyword pl1Attribute CHARACTER CHAR DECIMAL DEC DESCRIPTOR DESC DIMENSION DIM
+syn keyword pl1Attribute FIXED FLOAT OFFSET POINTER PTR REFERENCE VALUE VAL
+
+" Functions
+syn keyword pl1Function AFTER ALL ANY BEFORE COMPLETION CPLN CONJG COUNT
+syn keyword pl1Function CURRENTSTORAGE CSTG DATAFIELD DECAT DOT ERF ERFC IMAG
+syn keyword pl1Function ONCOUNT ONFIELD ONLOC POLY PRIORITY REPEAT SAMEKEY STATUS
+syn keyword pl1Function STORAGE STG ABS ACOS ACTUALCOUNT ADD ADDR ADDREL ALLOCATION
+syn keyword pl1Function ALLOCN ASIN ATAN ATAND ATANH BOOL BYTE BYTESIZE CEIL COLLATE
+syn keyword pl1Function COPY COS COSD COSH DATE DATETIME DECODE DISPLAY DIVIDE EMPTY
+syn keyword pl1Function ENCODE ERROR EVERY EXP EXTEND FLOOR FLUSH FREE HBOUND HIGH
+syn keyword pl1Function INDEX INFORM INT LBOUND LENGTH LINE LINENO LOG LOG10 LOG2
+syn keyword pl1Function LOW LTRIM MAX MAXLENGTH MIN MOD MULTIPLY NEXT_VOLUME NULL
+syn keyword pl1Function ONARGSLIST ONCHAR ONCODE ONFILE ONKEY ONSOURCE PAGENO POSINT
+syn keyword pl1Function PRESENT PROD RANK RELEASE RESIGNAL REVERSE REWIND ROUND
+syn keyword pl1Function RTRIM SEARCH SIGN SIN SIND SINH SIZE SOME SPACEBLOCK SQRT
+syn keyword pl1Function STRING SUBSTR SUBTRACT SUM TAN TAND TANH TIME TRANSLATE TRIM
+syn keyword pl1Function TRUNC UNSPEC VALID VARIANT VERIFY WARN
+
+" Other keywords
+syn keyword pl1Other ATTENTION ATTN C CONVERSION CONV DATA NAME NOCONVERSION
+syn keyword pl1Other NOCONV NOFIXEDOVERFLOW NOFOFL NOOVERFLOW NOSIZE
+syn keyword pl1Other NOSTRINGRANGE NOSTRG NOSTRINGSIZE NOSTRZ NOSUBSCRIPTRANGE
+syn keyword pl1Other NOSUBRG NOZERODIVIDE NOZDIV OVERFLOW OFL PENDING RECORD
+syn keyword pl1Other REENTRANT SIZE STRINGRANGE STRG STRINGSIZE STRZ
+syn keyword pl1Other SUBSCRIPTRANGE SUBRG TRANSMIT A ANYCONDITION APPEND B B1 B2
+syn keyword pl1Other B3 B4 BACKUP_DATE BATCH BLOCK_BOUNDARY_FORMAT BLOCK_IO
+syn keyword pl1Other BLOCK_SIZE BUCKET_SIZE BY CANCEL_CONTROL_O
+syn keyword pl1Other CARRIAGE_RETURN_FORMAT COLUMN COL CONTIGUOUS
+syn keyword pl1Other CONTIGUOUS_BEST_TRY CONVERSION CONV CREATION_DATE
+syn keyword pl1Other CURRENT_POSITION DEFAULT_FILE_NAME DEFERRED_WRITE E EDIT
+syn keyword pl1Other ENDFILE ENDPAGE EXPIRATION_DATE EXTENSION_SIZE F FAST_DELETE
+syn keyword pl1Other FILE_ID FILE_ID_TO FILE_SIZE FINISH FIXEDOVERFLOW FOFL
+syn keyword pl1Other FIXED_CONTROL_FROM FIXED_CONTROL_SIZE FIXED_CONTROL_SIZE_TO
+syn keyword pl1Other FIXED_CONTROL_TO FIXED_LENGTH_RECORDS FROM GROUP_PROTECTION
+syn keyword pl1Other IDENT IGNORE_LINE_MARKS IN INDEXED INDEX_NUMBER INITIAL_FILL
+syn keyword pl1Other INTO KEY KEYFROM KEYTO LINESIZE LOCK_ON_READ LOCK_ON_WRITE
+syn keyword pl1Other MAIN MANUAL_UNLOCKING MATCH_GREATER MATCH_GREATER_EQUAL
+syn keyword pl1Other MATCH_NEXT MATCH_NEXT_EQUAL MAXIMUM_RECORD_NUMBER
+syn keyword pl1Other MAXIMUM_RECORD_SIZE MULTIBLOCK_COUNT MULTIBUFFER_COUNT
+syn keyword pl1Other NOLOCK NONEXISTENT_RECORD NONRECURSIVE NO_ECHO NO_FILTER
+syn keyword pl1Other NO_SHARE OVERFLOW OFL OWNER_GROUP OWNER_ID OWNER_MEMBER
+syn keyword pl1Other OWNER_PROTECTION P PAGE PAGESIZE PRINTER_FORMAT PROMPT
+syn keyword pl1Other PURGE_TYPE_AHEAD R READ_AHEAD READ_CHECK READ_REGARDLESS
+syn keyword pl1Other RECORD_ID RECORD_ID_ACCESS RECORD_ID_TO RECURSIVE REPEAT
+syn keyword pl1Other RETRIEVAL_POINTERS REVISION_DATE REWIND_ON_CLOSE
+syn keyword pl1Other REWIND_ON_OPEN SCALARVARYING SET SHARED_READ SHARED_WRITE
+syn keyword pl1Other SKIP SPOOL STORAGE STRINGRANGE STRG SUBSCRIPTRANGE SUBRG
+syn keyword pl1Other SUPERSEDE SYSIN SYSPRINT SYSTEM_PROTECTION TAB TEMPORARY
+syn keyword pl1Other TIMEOUT_PERIOD TITLE TO UNDEFINEDFILE UNDF UNDERFLOW UFL
+syn keyword pl1Other UNTIL USER_OPEN VAXCONDITION WAIT_FOR_RECORD WHILE
+syn keyword pl1Other WORLD_PROTECTION WRITE_BEHIND WRITE_CHECK X ZERODIVIDE ZDIV
+
+" PreProcessor keywords
+syn keyword pl1PreProc ACTIVATE DEACTIVATE DECLARE DCL DICTIONARY DO END ERROR
+syn keyword pl1PreProc FATAL GOTO IF INCLUDE INFORM LIST NOLIST PAGE PROCEDURE PROC
+syn keyword pl1PreProc REPLACE RETURN SBTTL TITLE WARN THEN ELSE
+
+" Statements
+syn keyword pl1Statement CALL SUB ENTRY BY NAME CASE CHECK COPY DEFAULT DFT DELAY
+syn keyword pl1Statement DESCRIPTORS DISPLAY EXIT FETCH HALT IGNORE LIST LOCATE
+syn keyword pl1Statement NOCHECK NOLOCK NONE ORDER RANGE RELEASE REORDER REPLY SNAP
+syn keyword pl1Statement SYSTEM TAB UNLOCK WAIT ALLOCATE ALLOC BEGIN CALL CLOSE
+syn keyword pl1Statement DECLARE DCL DELETE DO ELSE END FORMAT GET GOTO GO TO IF
+syn keyword pl1Statement LEAVE NORESCAN ON OPEN OTHERWISE OTHER PROCEDURE PROC PUT
+syn keyword pl1Statement READ RESCAN RETURN REVERT REWRITE SELECT SIGNAL SNAP
+syn keyword pl1Statement STATEMENT STOP SYSTEM THEN WHEN WRITE
+
+" PL1's own keywords
+" syn match pl1Keyword "\<END\>"
+" syn match pl1Keyword "\.COUNT\>"hs=s+1
+" syn match pl1Keyword "\.EXISTS\>"hs=s+1
+" syn match pl1Keyword "\.FIRST\>"hs=s+1
+" syn match pl1Keyword "\.LAST\>"hs=s+1
+" syn match pl1Keyword "\.DELETE\>"hs=s+1
+" syn match pl1Keyword "\.PREV\>"hs=s+1
+" syn match pl1Keyword "\.NEXT\>"hs=s+1
+
+if exists("pl1_highlight_triggers")
+ syn keyword pl1Trigger INSERTING UPDATING DELETING
+endif
+
+" Conditionals.
+syn keyword pl1Conditional ELSIF ELSE IF
+syn match pl1Conditional "\<END\s\+IF\>"
+
+" Loops.
+syn keyword pl1Repeat FOR LOOP WHILE FORALL
+syn match pl1Repeat "\<END\s\+LOOP\>"
+
+" Various types of comments.
+" 20010723az: Added the ability to treat strings within comments just like
+" C does.
+if exists("c_comment_strings")
+ syntax match pl1CommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region pl1CommentString contained start=+L\="+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=pl1CommentSkip
+ syntax region pl1Comment2String contained start=+L\="+ skip=+\\\\\|\\"+ end=+"+ end="$"
+ syntax region pl1CommentL start="--" skip="\\$" end="$" keepend contains=@pl1CommentGroup,pl1Comment2String,pl1CharLiteral,pl1BooleanLiteral,pl1NumbersCom,pl1SpaceError
+ syntax region pl1Comment start="/\*" end="\*/" contains=@pl1CommentGroup,pl1Comment2String,pl1CharLiteral,pl1BooleanLiteral,pl1NumbersCom,pl1SpaceError
+else
+ syntax region pl1CommentL start="--" skip="\\$" end="$" keepend contains=@pl1CommentGroup,pl1SpaceError
+ syntax region pl1Comment start="/\*" end="\*/" contains=@pl1CommentGroup,pl1SpaceError
+endif
+
+" 20010723az: These are the old comment commands ... commented out.
+" syn match pl1Comment "--.*$" contains=pl1Todo
+" syn region pl1Comment start="/\*" end="\*/" contains=pl1Todo
+syn sync ccomment pl1Comment
+syn sync ccomment pl1CommentL
+
+" To catch unterminated string literals.
+syn match pl1StringError "'.*$"
+
+" Various types of literals.
+" 20010723az: Added stuff for comment matching.
+syn match pl1Numbers transparent "\<[+-]\=\d\|[+-]\=\.\d" contains=pl1IntLiteral,pl1FloatLiteral
+syn match pl1NumbersCom contained transparent "\<[+-]\=\d\|[+-]\=\.\d" contains=pl1IntLiteral,pl1FloatLiteral
+syn match pl1IntLiteral contained "[+-]\=\d\+"
+syn match pl1FloatLiteral contained "[+-]\=\d\+\.\d*"
+syn match pl1FloatLiteral contained "[+-]\=\d*\.\d*"
+"syn match pl1FloatLiteral "[+-]\=\([0-9]*\.[0-9]\+\|[0-9]\+\.[0-9]\+\)\(e[+-]\=[0-9]\+\)\="
+syn match pl1CharLiteral "'[^']'"
+syn match pl1StringLiteral "'\([^']\|''\)*'"
+syn keyword pl1BooleanLiteral TRUE FALSE NULL
+
+" The built-in types.
+syn keyword pl1Storage ANYDATA ANYTYPE BFILE BINARY_INTEGER BLOB BOOLEAN
+syn keyword pl1Storage BYTE CHAR CHARACTER CLOB CURSOR DATE DAY DEC DECIMAL
+syn keyword pl1Storage DOUBLE DSINTERVAL_UNCONSTRAINED FLOAT HOUR
+syn keyword pl1Storage INT INTEGER INTERVAL LOB LONG MINUTE
+syn keyword pl1Storage MLSLABEL MONTH NATURAL NATURALN NCHAR NCHAR_CS NCLOB
+syn keyword pl1Storage NUMBER NUMERIC NVARCHAR PLS_INT PLS_INTEGER
+syn keyword pl1Storage POSITIVE POSITIVEN PRECISION RAW REAL RECORD
+syn keyword pl1Storage SECOND SIGNTYPE SMALLINT STRING SYS_REFCURSOR TABLE TIME
+syn keyword pl1Storage TIMESTAMP TIMESTAMP_UNCONSTRAINED
+syn keyword pl1Storage TIMESTAMP_TZ_UNCONSTRAINED
+syn keyword pl1Storage TIMESTAMP_LTZ_UNCONSTRAINED UROWID VARCHAR
+syn keyword pl1Storage VARCHAR2 YEAR YMINTERVAL_UNCONSTRAINED ZONE
+
+" A type-attribute is really a type.
+" 20020916bp: Removed leading part of pattern to avoid highlighting the
+" object
+syn match pl1TypeAttribute "%\(TYPE\|ROWTYPE\)\>"
+
+" All other attributes.
+syn match pl1Attribute "%\(BULK_EXCEPTIONS\|BULK_ROWCOUNT\|ISOPEN\|FOUND\|NOTFOUND\|ROWCOUNT\)\>"
+
+" Catch errors caused by wrong parentheses and brackets
+" 20010723az: significantly more powerful than the values -- commented out
+" below the replaced values. This adds the C functionality to PL/SQL.
+syn cluster pl1ParenGroup contains=pl1ParenError,@pl1CommentGroup,pl1CommentSkip,pl1IntLiteral,pl1FloatLiteral,pl1NumbersCom
+if exists("c_no_bracket_error")
+ syn region pl1Paren transparent start='(' end=')' contains=ALLBUT,@pl1ParenGroup
+ syn match pl1ParenError ")"
+ syn match pl1ErrInParen contained "[{}]"
+else
+ syn region pl1Paren transparent start='(' end=')' contains=ALLBUT,@pl1ParenGroup,pl1ErrInBracket
+ syn match pl1ParenError "[\])]"
+ syn match pl1ErrInParen contained "[{}]"
+ syn region pl1Bracket transparent start='\[' end=']' contains=ALLBUT,@pl1ParenGroup,pl1ErrInParen
+ syn match pl1ErrInBracket contained "[);{}]"
+endif
+" syn region pl1Paren transparent start='(' end=')' contains=ALLBUT,pl1ParenError
+" syn match pl1ParenError ")"
+
+" Syntax Synchronizing
+syn sync minlines=10 maxlines=100
+
+" Define the default highlighting.
+" Only when and item doesn't have highlighting yet.
+
+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
+
+
+let b:current_syntax = "pl1"
diff --git a/runtime/syntax/plm.vim b/runtime/syntax/plm.vim
new file mode 100644
index 0000000..c6618ad
--- /dev/null
+++ b/runtime/syntax/plm.vim
@@ -0,0 +1,134 @@
+" Vim syntax file
+" Language: PL/M
+" Maintainer: Philippe Coulonges <cphil@cphil.net>
+" Last change: 2003 May 11
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" PL/M is a case insensitive language
+syn case ignore
+
+syn keyword plmTodo contained TODO FIXME XXX
+
+" String
+syn region plmString start=+'+ end=+'+
+
+syn match plmOperator "[@=\+\-\*\/\<\>]"
+
+syn match plmIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>"
+
+syn match plmDelimiter "[();,]"
+
+syn region plmPreProc start="^\s*\$\s*" skip="\\$" end="$"
+
+" FIXME : No Number support for floats, as I'm working on an embedded
+" project that doesn't use any.
+syn match plmNumber "-\=\<\d\+\>"
+syn match plmNumber "\<[0-9a-fA-F]*[hH]*\>"
+
+" If you don't like tabs
+"syn match plmShowTab "\t"
+"syn match plmShowTabc "\t"
+
+"when wanted, highlight trailing white space
+if exists("c_space_errors")
+ syn match plmSpaceError "\s*$"
+ syn match plmSpaceError " \+\t"me=e-1
+endif
+
+"
+ " Use the same control variable as C language for I believe
+ " users will want the same behavior
+if exists("c_comment_strings")
+ " FIXME : don't work fine with c_comment_strings set,
+ " which I don't care as I don't use
+
+ " A comment can contain plmString, plmCharacter and plmNumber.
+ " But a "*/" inside a plmString in a plmComment DOES end the comment! So we
+ " need to use a special type of plmString: plmCommentString, which also ends on
+ " "*/", and sees a "*" at the start of the line as comment again.
+ syntax match plmCommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region plmCommentString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=plmSpecial,plmCommentSkip
+ syntax region plmComment2String contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=plmSpecial
+ syntax region plmComment start="/\*" end="\*/" contains=plmTodo,plmCommentString,plmCharacter,plmNumber,plmFloat,plmSpaceError
+ syntax match plmComment "//.*" contains=plmTodo,plmComment2String,plmCharacter,plmNumber,plmSpaceError
+else
+ syn region plmComment start="/\*" end="\*/" contains=plmTodo,plmSpaceError
+ syn match plmComment "//.*" contains=plmTodo,plmSpaceError
+endif
+
+syntax match plmCommentError "\*/"
+
+syn keyword plmReserved ADDRESS AND AT BASED BY BYTE CALL CASE
+syn keyword plmReserved DATA DECLARE DISABLE DO DWORD
+syn keyword plmReserved ELSE ENABLE END EOF EXTERNAL
+syn keyword plmReserved GO GOTO HALT IF INITIAL INTEGER INTERRUPT
+syn keyword plmReserved LABEL LITERALLY MINUS MOD NOT OR
+syn keyword plmReserved PLUS POINTER PROCEDURE PUBLIC
+syn keyword plmReserved REAL REENTRANT RETURN SELECTOR STRUCTURE
+syn keyword plmReserved THEN TO WHILE WORD XOR
+syn keyword plm386Reserved CHARINT HWORD LONGINT OFFSET QWORD SHORTINT
+
+syn keyword plmBuiltIn ABS ADJUSTRPL BLOCKINPUT BLOCKINWORD BLOCKOUTPUT
+syn keyword plmBuiltIn BLOCKOUTWORD BUILPTR CARRY CAUSEINTERRUPT CMPB
+syn keyword plmBuiltIn CMPW DEC DOUBLE FINDB FINDRB FINDRW FINDW FIX
+syn keyword plmBuiltIn FLAGS FLOAT GETREALERROR HIGH IABS INITREALMATHUNIT
+syn keyword plmBuiltIn INPUT INT INWORD LAST LOCKSET LENGTH LOW MOVB MOVE
+syn keyword plmBuiltIn MOVRB MOVRW MOVW NIL OUTPUT OUTWORD RESTOREREALSTATUS
+syn keyword plmBuiltIn ROL ROR SAL SAVEREALSTATUS SCL SCR SELECTOROF SETB
+syn keyword plmBuiltIn SETREALMODE SETW SHL SHR SIGN SIGNED SIZE SKIPB
+syn keyword plmBuiltIn SKIPRB SKIPRW SKIPW STACKBASE STACKPTR TIME SIZE
+syn keyword plmBuiltIn UNSIGN XLAT ZERO
+syn keyword plm386BuiltIn INTERRUPT SETINTERRUPT
+syn keyword plm286BuiltIn CLEARTASKSWITCHEDFLAG GETACCESSRIGHTS
+syn keyword plm286BuiltIn GETSEGMENTLIMIT LOCALTABLE MACHINESTATUS
+syn keyword plm286BuiltIn OFFSETOF PARITY RESTOREGLOBALTABLE
+syn keyword plm286BuiltIn RESTOREINTERRUPTTABLE SAVEGLOBALTABLE
+syn keyword plm286BuiltIn SAVEINTERRUPTTABLE SEGMENTREADABLE
+syn keyword plm286BuiltIn SEGMENTWRITABLE TASKREGISTER WAITFORINTERRUPT
+syn keyword plm386BuiltIn CONTROLREGISTER DEBUGREGISTER FINDHW
+syn keyword plm386BuiltIn FINDRHW INHWORD MOVBIT MOVRBIT MOVHW MOVRHW
+syn keyword plm386BuiltIn OUTHWORD SCANBIT SCANRBIT SETHW SHLD SHRD
+syn keyword plm386BuiltIn SKIPHW SKIPRHW TESTREGISTER
+syn keyword plm386w16BuiltIn BLOCKINDWORD BLOCKOUTDWORD CMPD FINDD
+syn keyword plm386w16BuiltIn FINDRD INDWORD MOVD MOVRD OUTDWORD
+syn keyword plm386w16BuiltIn SETD SKIPD SKIPRD
+
+syn sync lines=50
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
+
diff --git a/runtime/syntax/plp.vim b/runtime/syntax/plp.vim
new file mode 100644
index 0000000..48dc4b2
--- /dev/null
+++ b/runtime/syntax/plp.vim
@@ -0,0 +1,37 @@
+" Vim syntax file
+" Language: PLP (Perl in HTML)
+" Maintainer: Juerd <juerd@juerd.nl>
+" Last Change: 2003 Apr 25
+" Cloned From: aspperl.vim
+
+" Add to filetype.vim the following line (without quote sign):
+" au BufNewFile,BufRead *.plp setf plp
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'perlscript'
+endif
+
+runtime! syntax/html.vim
+unlet b:current_syntax
+syn include @PLPperl syntax/perl.vim
+
+syn cluster htmlPreproc add=PLPperlblock
+
+syn keyword perlControl PLP_END
+syn keyword perlStatementInclude include Include
+syn keyword perlStatementFiles ReadFile WriteFile Counter
+syn keyword perlStatementScalar Entity AutoURL DecodeURI EncodeURI
+
+syn cluster PLPperlcode contains=perlStatement.*,perlFunction,perlOperator,perlVarPlain,perlVarNotInMatches,perlShellCommand,perlFloat,perlNumber,perlStringUnexpanded,perlString,perlQQ,perlControl,perlConditional,perlRepeat,perlComment,perlPOD,perlHereDoc,perlPackageDecl,perlElseIfError,perlFiledescRead,perlMatch
+
+syn region PLPperlblock keepend matchgroup=Delimiter start=+<:=\=+ end=+:>+ transparent contains=@PLPperlcode
+
+syn region PLPinclude keepend matchgroup=Delimiter start=+<(+ end=+)>+
+
+let b:current_syntax = "plp"
+
diff --git a/runtime/syntax/plsql.vim b/runtime/syntax/plsql.vim
new file mode 100644
index 0000000..9b4df09
--- /dev/null
+++ b/runtime/syntax/plsql.vim
@@ -0,0 +1,863 @@
+" Vim syntax file
+" Language: Oracle Procedural SQL (PL/SQL)
+" Maintainer: Lee Lindley (lee dot lindley at gmail dot com)
+" Previous Maintainer: Jeff Lanzarotta (jefflanzarotta at yahoo dot com)
+" Previous Maintainer: C. Laurence Gonsalves (clgonsal@kami.com)
+" URL: https://github.com/lee-lindley/vim_plsql_syntax
+" Last Change: Sep 19, 2022
+" History Carsten Czarski (carsten dot czarski at oracle com)
+" add handling for typical SQL*Plus commands (rem, start, host, set, etc)
+" add error highlight for non-breaking space
+" Lee Lindley (lee dot lindley at gmail dot com)
+" use get with default 0 instead of exists per Bram suggestion
+" make procedure folding optional
+" updated to 19c keywords. refined quoting.
+" separated reserved, non-reserved keywords and functions
+" revised folding
+" Eugene Lysyonok (lysyonok at inbox ru)
+" Added folding.
+" Geoff Evans & Bill Pribyl (bill at plnet dot org)
+" Added 9i keywords.
+" Austin Ziegler (austin at halostatue dot ca)
+" Added 8i+ features.
+"
+" To put SQL keywords as Function group in legacy style
+" let plsql_legacy_sql_keywords = 1
+"
+" To enable folding (It does setlocal foldmethod=syntax)
+" let plsql_fold = 1
+"
+" To disable folding procedure/functions (recommended if you habitually
+" do not put the method name on the END statement)
+" let plsql_disable_procedure_fold = 1
+"
+" From my vimrc file -- turn syntax and syntax folding on,
+" associate file suffixes as plsql, open all the folds on file open
+" syntax enable
+" let plsql_fold = 1
+" au BufNewFile,BufRead *.sql,*.pls,*.tps,*.tpb,*.pks,*.pkb,*.pkg,*.trg set filetype=plsql
+" au BufNewFile,BufRead *.sql,*.pls,*.tps,*.tpb,*.pks,*.pkb,*.pkg,*.trg syntax on
+" au Syntax plsql normal zR
+" au Syntax plsql set foldcolumn=2 "optional if you want to see choosable folds on the left
+
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" this file uses line continuations
+let s:cpo_sav = &cpo
+set cpo&vim
+
+" Todo.
+syn keyword plsqlTodo TODO FIXME XXX DEBUG NOTE
+syn cluster plsqlCommentGroup contains=plsqlTodo
+
+syn case ignore
+
+syn match plsqlGarbage "[^ \t()]"
+syn match plsqlIdentifier "[a-z][a-z0-9$_#]*"
+syn match plsqlSqlPlusDefine "&&\?[a-z][a-z0-9$_#]*\.\?"
+syn match plsqlHostIdentifier ":[a-z][a-z0-9$_#]*"
+
+" The Non-Breaking is often accidentally typed (Mac User: Opt+Space, after typing the "|", Opt+7);
+" error highlight for these avoids running into annoying compiler errors.
+syn match plsqlIllegalSpace "[\xa0]"
+
+" When wanted, highlight the trailing whitespace.
+if get(g:,"plsql_space_errors",0) == 1
+ if get(g:,"plsql_no_trail_space_error",0) == 0
+ syn match plsqlSpaceError "\s\+$"
+ endif
+
+ if get(g:,"plsql_no_tab_space_error",0) == 0
+ syn match plsqlSpaceError " \+\t"me=e-1
+ endif
+endif
+
+" Symbols.
+syn match plsqlSymbol "[;,.()]"
+
+" Operators. and words that would be something else if not in operator mode
+syn match plsqlOperator "[-+*/=<>@"]"
+syn match plsqlOperator "\(\^=\|<=\|>=\|:=\|=>\|\.\.\|||\|<<\|>>\|\*\*\|!=\|\~=\)"
+syn match plsqlOperator "\<\(NOT\|AND\|OR\|LIKE\|BETWEEN\|IN\)\>"
+syn match plsqlBooleanLiteral "\<NULL\>"
+syn match plsqlOperator "\<IS\\_s\+\(NOT\_s\+\)\?NULL\>"
+"
+" conditional compilation Preprocessor directives and sqlplus define sigil
+syn match plsqlPseudo "$[$a-z][a-z0-9$_#]*"
+
+syn match plsqlReserved "\<\(CREATE\|THEN\|UPDATE\|INSERT\|SET\)\>"
+syn match plsqlKeyword "\<\(REPLACE\|PACKAGE\|FUNCTION\|PROCEDURE\|TYPE|BODY\|WHEN\|MATCHED\)\>"
+syn region plsqlUpdate
+ \ matchgroup=plsqlReserved
+ \ start="\<UPDATE\>"
+ \ end="\<SET\>"
+ \ contains=@plsqlIdentifiers
+syn match plsqlReserved "\<WHEN\_s\+\(NOT\_s\+\)\?MATCHED\_s\+THEN\_s\+\(UPDATE\|INSERT\)\(\_s\+SET\)\?"
+
+"
+" Oracle's non-reserved keywords
+syn keyword plsqlKeyword ABORT ABS ABSENT ACCESS ACCESSED ACCOUNT ACL ACOS ACROSS ACTION ACTIONS
+syn keyword plsqlKeyword ACTIVATE ACTIVE ACTIVE_COMPONENT ACTIVE_DATA ACTIVE_FUNCTION ACTIVE_TAG ACTIVITY
+syn keyword plsqlKeyword ADAPTIVE_PLAN ADD ADD_COLUMN ADD_GROUP ADD_MONTHS ADG_REDIRECT_DML ADG_REDIRECT_PLSQL
+syn keyword plsqlKeyword ADJ_DATE ADMIN ADMINISTER ADMINISTRATOR ADVANCED ADVISE ADVISOR AFD_DISKSTRING
+syn keyword plsqlKeyword AFFINITY AFTER AGGREGATE AGGREGATES ALGORITHM ALIAS ALLOCATE ALLOW ALL_ROWS
+syn keyword plsqlKeyword ALTERNATE ALWAYS ANALYTIC ANALYTIC_VIEW_SQL ANALYZE ANCESTOR ANCILLARY AND_EQUAL
+syn keyword plsqlKeyword ANOMALY ANSI_REARCH ANSWER_QUERY_USING_STATS ANTIJOIN ANYSCHEMA ANY_VALUE
+syn keyword plsqlKeyword APPEND APPENDCHILDXML APPEND_VALUES APPLICATION APPLY APPROX_COUNT APPROX_COUNT_DISTINCT
+syn keyword plsqlKeyword APPROX_COUNT_DISTINCT_AGG APPROX_COUNT_DISTINCT_DETAIL APPROX_MEDIAN APPROX_PERCENTILE
+syn keyword plsqlKeyword APPROX_PERCENTILE_AGG APPROX_PERCENTILE_DETAIL APPROX_RANK APPROX_SUM ARCHIVAL
+syn keyword plsqlKeyword ARCHIVE ARCHIVED ARCHIVELOG ARRAY ARRAYS ASCII ASCIISTR ASIN ASIS ASSEMBLY
+syn keyword plsqlKeyword ASSIGN ASSOCIATE ASYNC ASYNCHRONOUS AS_JSON AT ATAN ATAN2 ATTRIBUTE ATTRIBUTES
+syn keyword plsqlKeyword AUDIT AUTHENTICATED AUTHENTICATION AUTHID AUTHORIZATION AUTO AUTOALLOCATE
+syn keyword plsqlKeyword AUTOEXTEND AUTOMATIC AUTO_LOGIN AUTO_REOPTIMIZE AVAILABILITY AVCACHE_OP AVERAGE_RANK
+syn keyword plsqlKeyword AVG AVMDX_OP AVRO AV_AGGREGATE AV_CACHE AW BACKGROUND BACKINGFILE BACKUP BAND_JOIN
+syn keyword plsqlKeyword BASIC BASICFILE BATCH BATCHSIZE BATCH_TABLE_ACCESS_BY_ROWID BECOME BEFORE
+syn keyword plsqlKeyword BEGINNING BEGIN_OUTLINE_DATA BEHALF BEQUEATH BFILENAME BIGFILE BINARY
+syn keyword plsqlKeyword BINARY_DOUBLE_INFINITY BINARY_DOUBLE_NAN BINARY_FLOAT_INFINITY BINARY_FLOAT_NAN
+syn keyword plsqlKeyword BINDING BIND_AWARE BIN_TO_NUM BITAND BITMAP BITMAPS BITMAP_AND BITMAP_BIT_POSITION
+syn keyword plsqlKeyword BITMAP_BUCKET_NUMBER BITMAP_CONSTRUCT_AGG BITMAP_COUNT BITMAP_OR_AGG BITMAP_TREE
+syn keyword plsqlKeyword BITOR BITS BITXOR BIT_AND_AGG BIT_OR_AGG BIT_XOR_AGG BLOCK BLOCKCHAIN BLOCKING
+syn keyword plsqlKeyword BLOCKS BLOCKSIZE BLOCK_RANGE BOOL BOOTSTRAP BOTH BOUND BRANCH BREADTH
+syn keyword plsqlKeyword BROADCAST BSON BUFFER BUFFER_CACHE BUFFER_POOL BUILD BULK BUSHY_JOIN BYPASS_RECURSIVE_CHECK
+syn keyword plsqlKeyword BYPASS_UJVC CACHE CACHE_CB CACHE_INSTANCES CACHE_TEMP_TABLE CACHING CALCULATED
+syn keyword plsqlKeyword CALL CALLBACK CANCEL CAPACITY CAPTION CAPTURE CARDINALITY CASCADE CAST
+syn keyword plsqlKeyword CATALOG_DBLINK CATEGORY CDB$DEFAULT CDB_HTTP_HANDLER CEIL CELLMEMORY CELL_FLASH_CACHE
+syn keyword plsqlKeyword CERTIFICATE CFILE CHAINED CHANGE CHANGE_DUPKEY_ERROR_INDEX CHARTOROWID CHAR_CS
+syn keyword plsqlKeyword CHECKPOINT CHECKSUM CHECK_ACL_REWRITE CHILD CHOOSE CHR CHUNK CLASS CLASSIFICATION
+syn keyword plsqlKeyword CLASSIFIER CLAUSE CLEAN CLEANUP CLEAR CLIENT CLONE CLOSE CLOSEST CLOSE_CACHED_OPEN_CURSORS
+syn keyword plsqlKeyword CLOUD_IDENTITY CLUSTERING CLUSTERING_FACTOR CLUSTERS CLUSTER_BY_ROWID CLUSTER_DETAILS
+syn keyword plsqlKeyword CLUSTER_DISTANCE CLUSTER_ID CLUSTER_PROBABILITY CLUSTER_SET COALESCE COALESCE_SQ
+syn keyword plsqlKeyword COARSE COLAUTH COLD COLLATE COLLATION COLLECT COLUMN COLUMNAR COLUMNS COLUMN_AUTHORIZATION_INDICATOR
+syn keyword plsqlKeyword COLUMN_AUTH_INDICATOR COLUMN_STATS COLUMN_VALUE COMMENT COMMIT COMMITTED COMMON
+syn keyword plsqlKeyword COMMON_DATA_MAP COMPACT COMPATIBILITY COMPILE COMPLETE COMPLIANCE COMPONENT
+syn keyword plsqlKeyword COMPONENTS COMPOSE COMPOSITE COMPOSITE_LIMIT COMPOUND COMPUTATION COMPUTE
+syn keyword plsqlKeyword CONCAT CONDITION CONDITIONAL CONFIRM CONFORMING CONNECT_BY_CB_WHR_ONLY CONNECT_BY_COMBINE_SW
+syn keyword plsqlKeyword CONNECT_BY_COST_BASED CONNECT_BY_ELIM_DUPS CONNECT_BY_FILTERING CONNECT_BY_ISCYCLE
+syn keyword plsqlKeyword CONNECT_BY_ISLEAF CONNECT_BY_ROOT CONNECT_TIME CONSENSUS CONSIDER CONSISTENT
+syn keyword plsqlKeyword CONST CONSTANT CONSTRAINT CONSTRAINTS CONTAINER CONTAINERS CONTAINERS_DEFAULT
+syn keyword plsqlKeyword CONTAINER_DATA CONTAINER_DATA_ADMIT_NULL CONTAINER_MAP CONTAINER_MAP_OBJECT
+syn keyword plsqlKeyword CONTENT CONTENTS CONTEXT CONTINUE CONTROLFILE CONVERSION CONVERT CON_DBID_TO_ID
+syn keyword plsqlKeyword CON_GUID_TO_ID CON_ID CON_ID_FILTER CON_ID_TO_CON_NAME CON_ID_TO_DBID CON_ID_TO_GUID
+syn keyword plsqlKeyword CON_ID_TO_UID CON_NAME_TO_ID CON_UID_TO_ID COOKIE COPY CORR CORRUPTION CORRUPT_XID
+syn keyword plsqlKeyword CORRUPT_XID_ALL CORR_K CORR_S COS COSH COST COST_XML_QUERY_REWRITE COVAR_POP
+syn match plsqlKeyword "\<COUNT\>"
+syn keyword plsqlKeyword COVAR_SAMP CO_AUTH_IND CPU_COSTING CPU_COUNT CPU_PER_CALL CPU_PER_SESSION
+syn keyword plsqlKeyword CPU_TIME CRASH CREATE_FILE_DEST CREATE_STORED_OUTLINES CREATION CREDENTIAL
+syn keyword plsqlKeyword CREDENTIALS CRITICAL CROSS CROSSEDITION CSCONVERT CUBE CUBE_AJ CUBE_GB CUBE_SJ
+syn keyword plsqlKeyword CUME_DIST CUME_DISTM CURRENT CURRENTV CURRENT_DATE CURRENT_INSTANCE CURRENT_PARTSET_KEY
+syn keyword plsqlKeyword CURRENT_SCHEMA CURRENT_SHARD_KEY CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER
+syn match plsqlKeyword "\<CURSOR\>"
+syn keyword plsqlKeyword CURSOR_SHARING_EXACT CURSOR_SPECIFIC_SEGMENT CV CYCLE DAGG_OPTIM_GSETS
+syn keyword plsqlKeyword DANGLING DATA DATABASE DATABASES DATAFILE DATAFILES DATAMOVEMENT DATAOBJNO
+syn keyword plsqlKeyword DATAOBJ_TO_MAT_PARTITION DATAOBJ_TO_PARTITION DATAPUMP DATASTORE DATA_LINK_DML
+syn keyword plsqlKeyword DATA_SECURITY_REWRITE_LIMIT DATA_VALIDATE DATE_MODE DAYS DBA DBA_RECYCLEBIN
+syn keyword plsqlKeyword DBMS_STATS DBSTR2UTF8 DBTIMEZONE DB_ROLE_CHANGE DB_UNIQUE_NAME DB_VERSION
+syn keyword plsqlKeyword DDL DEALLOCATE DEBUG DEBUGGER DECLARE DECODE DECOMPOSE DECOMPRESS DECORRELATE
+syn keyword plsqlKeyword DECR DECREMENT DECRYPT DEDUPLICATE DEFAULTS DEFAULT_COLLATION DEFAULT_PDB_HINT
+syn keyword plsqlKeyword DEFERRABLE DEFERRED DEFINED DEFINER DEFINITION DEGREE DELAY DELEGATE
+syn keyword plsqlKeyword DELETEXML DELETE_ALL DEMAND DENORM_AV DENSE_RANK DENSE_RANKM DEPENDENT DEPTH
+syn keyword plsqlKeyword DEQUEUE DEREF DEREF_NO_REWRITE DESCENDANT DESCRIPTION DESTROY DETACHED DETERMINED
+syn keyword plsqlKeyword DETERMINES DETERMINISTIC DG_GATHER_STATS DIAGNOSTICS DICTIONARY DIGEST DIMENSION
+syn keyword plsqlKeyword DIMENSIONS DIRECT DIRECTORY DIRECT_LOAD DIRECT_PATH DISABLE DISABLE_ALL DISABLE_CONTAINERS_DEFAULT
+syn keyword plsqlKeyword DISABLE_CONTAINER_MAP DISABLE_PARALLEL_DML DISABLE_PRESET DISABLE_RPKE DISALLOW
+syn keyword plsqlKeyword DISASSOCIATE DISCARD DISCONNECT DISK DISKGROUP DISKS DISMOUNT DISTINGUISHED
+syn keyword plsqlKeyword DISTRIBUTE DISTRIBUTED DIST_AGG_PROLLUP_PUSHDOWN DML DML_UPDATE DOCFIDELITY
+syn keyword plsqlKeyword DOCUMENT DOMAIN_INDEX_FILTER DOMAIN_INDEX_NO_SORT DOMAIN_INDEX_SORT DOWNGRADE
+syn keyword plsqlKeyword DRAIN_TIMEOUT DRIVING_SITE DROP_COLUMN DROP_GROUP DST_UPGRADE_INSERT_CONV
+syn keyword plsqlKeyword DUMP DUPLICATE DUPLICATED DV DYNAMIC DYNAMIC_SAMPLING DYNAMIC_SAMPLING_EST_CDN
+syn keyword plsqlKeyword EACH EDITION EDITIONABLE EDITIONING EDITIONS ELAPSED_TIME ELEMENT ELIMINATE_JOIN
+syn keyword plsqlKeyword ELIMINATE_OBY ELIMINATE_OUTER_JOIN ELIMINATE_SQ ELIM_GROUPBY EM EMPTY EMPTY_BLOB
+syn keyword plsqlKeyword EMPTY_CLOB ENABLE ENABLE_ALL ENABLE_PARALLEL_DML ENABLE_PRESET ENCODE ENCODING
+syn keyword plsqlKeyword ENCRYPT ENCRYPTION
+syn keyword plsqlKeyword END_OUTLINE_DATA ENFORCE ENFORCED ENQUEUE ENTERPRISE
+syn keyword plsqlKeyword ENTITYESCAPING ENTRY EQUIPART EQUIVALENT ERROR ERRORS ERROR_ARGUMENT ERROR_ON_OVERLAP_TIME
+syn keyword plsqlKeyword ESCAPE ESTIMATE EVAL EVALNAME EVALUATE EVALUATION EVEN EVENTS EVERY EXCEPTION
+syn keyword plsqlKeyword EXCEPTIONS EXCHANGE EXCLUDE EXCLUDING EXECUTE EXEMPT EXISTING EXISTSNODE EXP
+syn keyword plsqlKeyword EXPAND EXPAND_GSET_TO_UNION EXPAND_TABLE EXPIRE EXPLAIN EXPLOSION EXPORT EXPRESS
+syn keyword plsqlKeyword EXPR_CORR_CHECK EXTEND EXTENDED EXTENDS EXTENT EXTENTS EXTERNAL EXTERNALLY
+syn keyword plsqlKeyword EXTRA EXTRACT EXTRACTCLOBXML EXTRACTVALUE FACILITY FACT FACTOR FACTORIZE_JOIN
+syn keyword plsqlKeyword FAILED FAILED_LOGIN_ATTEMPTS FAILGROUP FAILOVER FAILURE FAMILY FAR FAST
+syn keyword plsqlKeyword FBTSCAN FEATURE FEATURE_COMPARE FEATURE_DETAILS FEATURE_ID FEATURE_SET FEATURE_VALUE
+syn keyword plsqlKeyword FEDERATION FETCH FILE FILEGROUP FILESTORE FILESYSTEM_LIKE_LOGGING FILE_NAME_CONVERT
+syn keyword plsqlKeyword FILTER FINAL FINE FINISH FIRSTM FIRST_ROWS FIRST_VALUE FIXED_VIEW_DATA
+syn match plsqlKeyword "\<FIRST\>"
+syn keyword plsqlKeyword FLAGGER FLASHBACK FLASH_CACHE FLEX FLOB FLOOR FLUSH FOLDER FOLLOWING FOLLOWS
+syn keyword plsqlKeyword FORCE FORCE_JSON_TABLE_TRANSFORM FORCE_SPATIAL FORCE_XML_QUERY_REWRITE FOREIGN
+syn keyword plsqlKeyword FOREVER FORMAT FORWARD FRAGMENT_NUMBER FREE FREELIST FREELISTS FREEPOOLS FRESH
+syn keyword plsqlKeyword FRESH_MV FROM_TZ FTP FULL FULL_OUTER_JOIN_TO_OUTER FUNCTIONS GATHER_OPTIMIZER_STATISTICS
+syn keyword plsqlKeyword GATHER_PLAN_STATISTICS GBY_CONC_ROLLUP GBY_PUSHDOWN GENERATED GET GLOBAL GLOBALLY
+syn keyword plsqlKeyword GLOBAL_NAME GLOBAL_TOPIC_ENABLED GOLDENGATE GOTO GRANTED GRANULAR GREATEST
+syn keyword plsqlKeyword GROUPING GROUPING_ID GROUPS GROUP_BY GROUP_ID GUARANTEE GUARANTEED GUARD H
+syn keyword plsqlKeyword HALF_YEARS HASH HASHING HASHKEYS HASHSET_BUILD HASH_AJ HASH_SJ HEADER HEAP
+syn keyword plsqlKeyword HELP HEXTORAW HEXTOREF HIDDEN HIDE HIERARCHICAL HIERARCHIES HIERARCHY HIER_ANCESTOR
+syn keyword plsqlKeyword HIER_CAPTION HIER_CHILDREN HIER_CHILD_COUNT HIER_COLUMN HIER_CONDITION HIER_DEPTH
+syn keyword plsqlKeyword HIER_DESCRIPTION HIER_HAS_CHILDREN HIER_LAG HIER_LEAD HIER_LEVEL HIER_MEMBER_NAME
+syn keyword plsqlKeyword HIER_MEMBER_UNIQUE_NAME HIER_ORDER HIER_PARENT HIER_WINDOW HIGH HINTSET_BEGIN
+syn keyword plsqlKeyword HINTSET_END HOT HOUR HOURS HTTP HWM_BROKERED HYBRID ID IDENTIFIER IDENTITY
+syn keyword plsqlKeyword IDGENERATORS IDLE IDLE_TIME IGNORE IGNORE_OPTIM_EMBEDDED_HINTS IGNORE_ROW_ON_DUPKEY_INDEX
+syn keyword plsqlKeyword IGNORE_WHERE_CLAUSE ILM IMMEDIATE IMMUTABLE IMPACT IMPORT INACTIVE INACTIVE_ACCOUNT_TIME
+syn keyword plsqlKeyword INCLUDE INCLUDES INCLUDE_VERSION INCLUDING INCOMING INCR INCREMENT INCREMENTAL
+syn keyword plsqlKeyword INDENT INDEXED INDEXES INDEXING INDEXTYPE INDEXTYPES INDEX_ASC INDEX_COMBINE
+syn keyword plsqlKeyword INDEX_DESC INDEX_FFS INDEX_FILTER INDEX_JOIN INDEX_ROWS INDEX_RRS INDEX_RS
+syn keyword plsqlKeyword INDEX_RS_ASC INDEX_RS_DESC INDEX_SCAN INDEX_SKIP_SCAN INDEX_SS INDEX_SS_ASC
+syn keyword plsqlKeyword INDEX_SS_DESC INDEX_STATS INDICATOR INFINITE INFORMATIONAL INHERIT INITCAP
+syn keyword plsqlKeyword INITIAL INITIALIZED INITIALLY INITRANS INLINE INLINE_XMLTYPE_NT INLINE_XT
+syn keyword plsqlKeyword INMEMORY INMEMORY_PRUNING INNER INPLACE INSENSITIVE INSERTCHILDXML INSERTCHILDXMLAFTER
+syn keyword plsqlKeyword INSERTCHILDXMLBEFORE INSERTXMLAFTER INSERTXMLBEFORE INSTALL INSTANCE INSTANCES
+syn keyword plsqlKeyword INSTANTIABLE INSTANTLY INSTEAD INSTR INSTR2 INSTR4 INSTRB INSTRC INTERLEAVED
+syn keyword plsqlKeyword INTERMEDIATE INTERNAL_CONVERT INTERNAL_USE INTERPRETED INTRA_CDB INVALIDATE
+syn keyword plsqlKeyword INVALIDATION INVISIBLE IN_MEMORY_METADATA IN_XQUERY IOSEEKTIM IOTFRSPEED IO_LOGICAL
+syn keyword plsqlKeyword IO_MEGABYTES IO_REQUESTS ISOLATE ISOLATION ISOLATION_LEVEL ITERATE ITERATION_NUMBER
+syn keyword plsqlKeyword JAVA JOB JOIN JSON JSONGET JSONPARSE JSONTOXML JSON_ARRAY JSON_ARRAYAGG JSON_EQUAL
+syn keyword plsqlKeyword JSON_EQUAL2 JSON_EXISTS JSON_EXISTS2 JSON_HASH JSON_LENGTH JSON_MERGEPATCH
+syn keyword plsqlKeyword JSON_MKMVI JSON_OBJECT JSON_OBJECTAGG JSON_PATCH JSON_QUERY JSON_SCALAR JSON_SERIALIZE
+syn keyword plsqlKeyword JSON_TABLE JSON_TEXTCONTAINS JSON_TEXTCONTAINS2 JSON_TRANSFORM JSON_VALUE
+syn keyword plsqlKeyword KEEP KEEP_DUPLICATES KERBEROS KEY KEYS KEYSIZE KEYSTORE KEY_LENGTH KILL
+syn keyword plsqlKeyword KURTOSIS_POP KURTOSIS_SAMP LABEL LAG LAG_DIFF LAG_DIFF_PERCENT LANGUAGE
+syn match plsqlKeyword "\<LAST\>"
+syn keyword plsqlKeyword LAST_DAY LAST_VALUE LATERAL LAX LAYER LDAP_REGISTRATION LDAP_REGISTRATION_ENABLED
+syn keyword plsqlKeyword LDAP_REG_SYNC_INTERVAL LEAD LEADING LEAD_CDB LEAD_CDB_URI LEAD_DIFF LEAD_DIFF_PERCENT
+syn keyword plsqlKeyword LEAF LEAST LEAVES LEDGER LEFT LENGTH LENGTH2 LENGTH4 LENGTHB LENGTHC LESS
+syn keyword plsqlKeyword LEVEL LEVELS LIBRARY LIFE LIFECYCLE LIFETIME LIKE2 LIKE4 LIKEC LIMIT LINEAR
+syn keyword plsqlKeyword LINK LIST LISTAGG LN LNNVL LOAD LOB LOBNVL LOBS LOB_VALUE LOCALTIME LOCALTIMESTAMP
+syn keyword plsqlKeyword LOCAL_INDEXES LOCATION LOCATOR LOCKDOWN LOCKED LOCKING LOG LOGFILE LOGFILES
+syn keyword plsqlKeyword LOGGING LOGICAL LOGICAL_READS_PER_CALL LOGICAL_READS_PER_SESSION LOGMINING
+syn keyword plsqlKeyword LOGOFF LOGON LOG_READ_ONLY_VIOLATIONS LOST LOW LOWER LPAD LTRIM MAIN MAKE_REF
+syn keyword plsqlKeyword MANAGE MANAGED MANAGEMENT MANAGER MANDATORY MANUAL MAP MAPPER MAPPING MASTER
+syn keyword plsqlKeyword MATCH MATCHES MATCH_NUMBER MATCH_RECOGNIZE MATERIALIZE MATERIALIZED
+syn keyword plsqlKeyword MATRIX MAX MAXARCHLOGS MAXDATAFILES MAXEXTENTS MAXIMIZE MAXINSTANCES MAXLOGFILES
+syn keyword plsqlKeyword MAXLOGHISTORY MAXLOGMEMBERS MAXSIZE MAXTRANS MAXVALUE MAX_AUDIT_SIZE MAX_DIAG_SIZE
+syn keyword plsqlKeyword MAX_PDB_SNAPSHOTS MAX_SHARED_TEMP_SIZE MBRC MEASURE MEASURES MEDIAN MEDIUM
+syn keyword plsqlKeyword MEMBER MEMCOMPRESS MEMOPTIMIZE MEMOPTIMIZE_WRITE MEMORY MERGE MERGE$ACTIONS
+syn keyword plsqlKeyword MERGE_AJ MERGE_CONST_ON MERGE_SJ METADATA METADATA_SOURCE_PDB METHOD MIGRATE
+syn keyword plsqlKeyword MIGRATE_CROSS_CON MIGRATION MIN MINEXTENTS MINIMIZE MINIMUM MINING MINUS_NULL
+syn keyword plsqlKeyword MINUTE MINUTES MINVALUE MIRROR MIRRORCOLD MIRRORHOT MISMATCH MISSING MLE MLSLABEL
+syn keyword plsqlKeyword MOD MODEL MODEL_COMPILE_SUBQUERY MODEL_DONTVERIFY_UNIQUENESS MODEL_DYNAMIC_SUBQUERY
+syn keyword plsqlKeyword MODEL_MIN_ANALYSIS MODEL_NB MODEL_NO_ANALYSIS MODEL_PBY MODEL_PUSH_REF MODEL_SV
+syn keyword plsqlKeyword MODIFICATION MODIFY MODIFY_COLUMN_TYPE MODULE MONITOR MONITORING MONTHS MONTHS_BETWEEN
+syn keyword plsqlKeyword MOUNT MOUNTPATH MOUNTPOINT MOVE MOVEMENT MULTIDIMENSIONAL MULTISET MULTIVALUE
+syn keyword plsqlKeyword MV_MERGE NAME NAMED NAMES NAMESPACE NAN NANVL NATIVE NATIVE_FULL_OUTER_JOIN
+syn keyword plsqlKeyword NATURAL NAV NCHAR_CS NCHR NEEDED NEG NESTED NESTED_ROLLUP_TOP NESTED_TABLE_FAST_INSERT
+syn keyword plsqlKeyword NESTED_TABLE_GET_REFS NESTED_TABLE_ID NESTED_TABLE_SET_REFS NESTED_TABLE_SET_SETID
+syn keyword plsqlKeyword NETWORK NEVER NEW NEW_TIME NEXT_DAY NLJ_BATCHING NLJ_INDEX_FILTER NLJ_INDEX_SCAN
+syn match plsqlKeyword "\<NEXT\>"
+syn keyword plsqlKeyword NLJ_PREFETCH NLSSORT NLS_CALENDAR NLS_CHARACTERSET NLS_CHARSET_DECL_LEN NLS_CHARSET_ID
+syn keyword plsqlKeyword NLS_CHARSET_NAME NLS_COLLATION_ID NLS_COLLATION_NAME NLS_COMP NLS_CURRENCY
+syn keyword plsqlKeyword NLS_DATE_FORMAT NLS_DATE_LANGUAGE NLS_INITCAP NLS_ISO_CURRENCY NLS_LANG NLS_LANGUAGE
+syn keyword plsqlKeyword NLS_LENGTH_SEMANTICS NLS_LOWER NLS_NCHAR_CONV_EXCP NLS_NUMERIC_CHARACTERS
+syn keyword plsqlKeyword NLS_SORT NLS_SPECIAL_CHARS NLS_TERRITORY NLS_UPPER NL_AJ NL_SJ NO NOAPPEND
+syn keyword plsqlKeyword NOARCHIVELOG NOAUDIT NOCACHE NOCOPY NOCPU_COSTING NOCYCLE NODELAY NOENTITYESCAPING
+syn keyword plsqlKeyword NOEXTEND NOFORCE NOGUARANTEE NOKEEP NOLOCAL NOLOGGING NOMAPPING NOMAXVALUE
+syn keyword plsqlKeyword NOMINIMIZE NOMINVALUE NOMONITORING NONBLOCKING NONE NONEDITIONABLE NONPARTITIONED
+syn keyword plsqlKeyword NONSCHEMA NOORDER NOOVERRIDE NOPARALLEL NOPARALLEL_INDEX NORELOCATE NORELY
+syn keyword plsqlKeyword NOREPAIR NOREPLAY NORESETLOGS NOREVERSE NOREWRITE NORMAL NOROWDEPENDENCIES
+syn keyword plsqlKeyword NOSCALE NOSCHEMACHECK NOSEGMENT NOSHARD NOSORT NOSTRICT NOSWITCH NOTHING NOTIFICATION
+syn keyword plsqlKeyword NOVALIDATE NOW NO_ACCESS NO_ADAPTIVE_PLAN NO_ANSI_REARCH NO_ANSWER_QUERY_USING_STATS
+syn keyword plsqlKeyword NO_AUTO_REOPTIMIZE NO_BAND_JOIN NO_BASETABLE_MULTIMV_REWRITE NO_BATCH_TABLE_ACCESS_BY_ROWID
+syn keyword plsqlKeyword NO_BIND_AWARE NO_BUFFER NO_BUSHY_JOIN NO_CARTESIAN NO_CHECK_ACL_REWRITE NO_CLUSTERING
+syn keyword plsqlKeyword NO_CLUSTER_BY_ROWID NO_COALESCE_SQ NO_COMMON_DATA NO_CONNECT_BY_CB_WHR_ONLY
+syn keyword plsqlKeyword NO_CONNECT_BY_COMBINE_SW NO_CONNECT_BY_COST_BASED NO_CONNECT_BY_ELIM_DUPS
+syn keyword plsqlKeyword NO_CONNECT_BY_FILTERING NO_CONTAINERS NO_COST_XML_QUERY_REWRITE NO_CPU_COSTING
+syn keyword plsqlKeyword NO_CROSS_CONTAINER NO_DAGG_OPTIM_GSETS NO_DATA_SECURITY_REWRITE NO_DECORRELATE
+syn keyword plsqlKeyword NO_DIST_AGG_PROLLUP_PUSHDOWN NO_DOMAIN_INDEX_FILTER NO_DST_UPGRADE_INSERT_CONV
+syn keyword plsqlKeyword NO_ELIMINATE_JOIN NO_ELIMINATE_OBY NO_ELIMINATE_OUTER_JOIN NO_ELIMINATE_SQ
+syn keyword plsqlKeyword NO_ELIM_GROUPBY NO_EXPAND NO_EXPAND_GSET_TO_UNION NO_EXPAND_TABLE NO_FACT
+syn keyword plsqlKeyword NO_FACTORIZE_JOIN NO_FILTERING NO_FULL_OUTER_JOIN_TO_OUTER NO_GATHER_OPTIMIZER_STATISTICS
+syn keyword plsqlKeyword NO_GBY_PUSHDOWN NO_INDEX NO_INDEX_FFS NO_INDEX_SS NO_INMEMORY NO_INMEMORY_PRUNING
+syn keyword plsqlKeyword NO_JSON_TABLE_TRANSFORM NO_LOAD NO_MERGE NO_MODEL_PUSH_REF NO_MONITOR NO_MONITORING
+syn keyword plsqlKeyword NO_MULTIMV_REWRITE NO_NATIVE_FULL_OUTER_JOIN NO_NLJ_BATCHING NO_NLJ_PREFETCH
+syn keyword plsqlKeyword NO_OBJECT_LINK NO_OBY_GBYPD_SEPARATE NO_ORDER_ROLLUPS NO_OR_EXPAND NO_OUTER_JOIN_TO_ANTI
+syn keyword plsqlKeyword NO_OUTER_JOIN_TO_INNER NO_PARALLEL NO_PARALLEL_INDEX NO_PARTIAL_COMMIT NO_PARTIAL_JOIN
+syn keyword plsqlKeyword NO_PARTIAL_OSON_UPDATE NO_PARTIAL_ROLLUP_PUSHDOWN NO_PLACE_DISTINCT NO_PLACE_GROUP_BY
+syn keyword plsqlKeyword NO_PQ_CONCURRENT_UNION NO_PQ_EXPAND_TABLE NO_PQ_MAP NO_PQ_NONLEAF_SKEW NO_PQ_REPLICATE
+syn keyword plsqlKeyword NO_PQ_SKEW NO_PRUNE_GSETS NO_PULL_PRED NO_PUSH_HAVING_TO_GBY NO_PUSH_PRED
+syn keyword plsqlKeyword NO_PUSH_SUBQ NO_PX_FAULT_TOLERANCE NO_PX_JOIN_FILTER NO_QKN_BUFF NO_QUERY_TRANSFORMATION
+syn keyword plsqlKeyword NO_REF_CASCADE NO_REORDER_WIF NO_RESULT_CACHE NO_REWRITE NO_ROOT_SW_FOR_LOCAL
+syn keyword plsqlKeyword NO_SEMIJOIN NO_SEMI_TO_INNER NO_SET_GBY_PUSHDOWN NO_SET_TO_JOIN NO_SQL_TRANSLATION
+syn keyword plsqlKeyword NO_SQL_TUNE NO_STAR_TRANSFORMATION NO_STATEMENT_QUEUING NO_STATS_GSETS NO_SUBQUERY_PRUNING
+syn keyword plsqlKeyword NO_SUBSTRB_PAD NO_SWAP_JOIN_INPUTS NO_TABLE_LOOKUP_BY_NL NO_TEMP_TABLE NO_TRANSFORM_DISTINCT_AGG
+syn keyword plsqlKeyword NO_UNNEST NO_USE_CUBE NO_USE_DAGG_UNION_ALL_GSETS NO_USE_HASH NO_USE_HASH_AGGREGATION
+syn keyword plsqlKeyword NO_USE_HASH_GBY_FOR_DAGGPSHD NO_USE_HASH_GBY_FOR_PUSHDOWN NO_USE_INVISIBLE_INDEXES
+syn keyword plsqlKeyword NO_USE_MERGE NO_USE_NL NO_USE_PARTITION_WISE_DISTINCT NO_USE_PARTITION_WISE_GBY
+syn keyword plsqlKeyword NO_USE_PARTITION_WISE_WIF NO_USE_SCALABLE_GBY_INVDIST NO_USE_VECTOR_AGGREGATION
+syn keyword plsqlKeyword NO_VECTOR_TRANSFORM NO_VECTOR_TRANSFORM_DIMS NO_VECTOR_TRANSFORM_FACT NO_XDB_FASTPATH_INSERT
+syn keyword plsqlKeyword NO_XMLINDEX_REWRITE NO_XMLINDEX_REWRITE_IN_SELECT NO_XML_DML_REWRITE NO_XML_QUERY_REWRITE
+syn keyword plsqlKeyword NO_ZONEMAP NTH_VALUE NTILE NULLIF NULLS NUMTODSINTERVAL NUMTOYMINTERVAL NUM_INDEX_KEYS
+syn keyword plsqlKeyword NVL NVL2 OBJECT OBJECT2XML OBJNO OBJNO_REUSE OBJ_ID OBY_GBYPD_SEPARATE OCCURENCES
+syn keyword plsqlKeyword OCCURRENCES ODD OFF OFFLINE OFFSET OID OIDINDEX OLAP OLD OLD_PUSH_PRED OLS
+syn keyword plsqlKeyword OLTP OMIT ONE ONLINE ONLY OPAQUE OPAQUE_TRANSFORM OPAQUE_XCANONICAL OPCODE
+syn keyword plsqlKeyword OPEN OPERATIONS OPERATOR OPTIMAL OPTIMIZE OPTIMIZER_FEATURES_ENABLE OPTIMIZER_GOAL
+syn keyword plsqlKeyword OPT_ESTIMATE OPT_PARAM ORADEBUG ORA_BRANCH ORA_CHECK_ACL ORA_CHECK_PRIVILEGE
+syn keyword plsqlKeyword ORA_CHECK_SYS_PRIVILEGE ORA_CLUSTERING ORA_CONCAT_RWKEY ORA_DM_PARTITION_NAME
+syn keyword plsqlKeyword ORA_DST_AFFECTED ORA_DST_CONVERT ORA_DST_ERROR ORA_GET_ACLIDS ORA_GET_PRIVILEGES
+syn keyword plsqlKeyword ORA_HASH ORA_INVOKING_USER ORA_INVOKING_USERID ORA_INVOKING_XS_USER ORA_INVOKING_XS_USER_GUID
+syn keyword plsqlKeyword ORA_NORMALIZE ORA_PARTITION_VALIDATION ORA_RAWCOMPARE ORA_RAWCONCAT ORA_ROWSCN
+syn keyword plsqlKeyword ORA_ROWSCN_RAW ORA_ROWVERSION ORA_SEARCH_RWKEY ORA_SHARDSPACE_NAME ORA_SHARD_ID
+syn keyword plsqlKeyword ORA_TABVERSION ORA_WRITE_TIME ORDERED ORDERED_PREDICATES ORDER_KEY_VECTOR_USE
+syn keyword plsqlKeyword ORDER_SUBQ ORDINALITY ORGANIZATION OR_EXPAND OR_PREDICATES OSON OSON_DIAG
+syn keyword plsqlKeyword OSON_GET_CONTENT OTHER OTHERS OUTER OUTER_JOIN_TO_ANTI OUTER_JOIN_TO_INNER
+syn keyword plsqlKeyword OUTLINE OUTLINE_LEAF OUT_OF_LINE OVER OVERFLOW OVERFLOW_NOMOVE OVERLAPS OWN
+syn keyword plsqlKeyword OWNER OWNERSHIP PACKAGES PARALLEL PARALLEL_INDEX PARAM PARAMETERS
+syn keyword plsqlKeyword PARENT PARITY PART$NUM$INST PARTIAL PARTIALLY PARTIAL_JOIN PARTIAL_ROLLUP_PUSHDOWN
+syn keyword plsqlKeyword PARTITION PARTITIONING PARTITIONS PARTITIONSET PARTITION_CONTAINED PARTITION_HASH
+syn keyword plsqlKeyword PARTITION_LIST PARTITION_RANGE PASSING PASSIVE PASSWORD PASSWORDFILE_METADATA_CACHE
+syn keyword plsqlKeyword PASSWORD_GRACE_TIME PASSWORD_LIFE_TIME PASSWORD_LOCK_TIME PASSWORD_REUSE_MAX
+syn keyword plsqlKeyword PASSWORD_REUSE_TIME PASSWORD_ROLLOVER_TIME PASSWORD_VERIFY_FUNCTION PAST PATCH
+syn keyword plsqlKeyword PATH PATHS PATH_PREFIX PATTERN PBL_HS_BEGIN PBL_HS_END PCTINCREASE PCTTHRESHOLD
+syn keyword plsqlKeyword PCTUSED PCTVERSION PDB_LOCAL_ONLY PEER PEERS PENDING PER PERCENT PERCENTAGE
+syn keyword plsqlKeyword PERCENTILE_CONT PERCENTILE_DISC PERCENT_RANK PERCENT_RANKM PERFORMANCE PERIOD
+syn keyword plsqlKeyword PERMANENT PERMISSION PERMUTE PERSISTABLE PFILE PHV PHYSICAL PIKEY PIVOT PIV_GB
+syn keyword plsqlKeyword PIV_SSF PLACE_DISTINCT PLACE_GROUP_BY PLAN PLSCOPE_SETTINGS PLSQL_CCFLAGS
+syn keyword plsqlKeyword PLSQL_CODE_TYPE PLSQL_DEBUG PLSQL_OPTIMIZE_LEVEL PLSQL_WARNINGS PLUGGABLE
+syn keyword plsqlKeyword PMEM POINT POLICY POOL_16K POOL_2K POOL_32K POOL_4K POOL_8K PORT POSITION
+syn keyword plsqlKeyword POST_TRANSACTION POWER POWERMULTISET POWERMULTISET_BY_CARDINALITY PQ_CONCURRENT_UNION
+syn keyword plsqlKeyword PQ_DISTRIBUTE PQ_DISTRIBUTE_WINDOW PQ_EXPAND_TABLE PQ_FILTER PQ_MAP PQ_NOMAP
+syn keyword plsqlKeyword PQ_NONLEAF_SKEW PQ_REPLICATE PQ_SKEW PREBUILT PRECEDES PRECEDING PRECOMPUTE_SUBQUERY
+syn keyword plsqlKeyword PREDICATE_REORDERS PREDICTION PREDICTION_BOUNDS PREDICTION_COST PREDICTION_DETAILS
+syn keyword plsqlKeyword PREDICTION_PROBABILITY PREDICTION_SET PRELOAD PREPARE PRESENT PRESENTNNV PRESENTV
+syn keyword plsqlKeyword PRESERVE PRESERVE_OID PRETTY PREVIOUS PRIMARY PRINTBLOBTOCLOB PRIORITY
+syn match plsqlKeyword "\<PREV\>"
+syn keyword plsqlKeyword PRIVATE PRIVATE_SGA PRIVILEGE PRIVILEGED PRIVILEGES PROCEDURAL PROCESS
+syn keyword plsqlKeyword PROFILE PROGRAM PROJECT PROPAGATE PROPAGATION PROPERTY PROTECTED PROTECTION
+syn keyword plsqlKeyword PROTOCOL PROXY PRUNING PULL_PRED PURGE PUSH_HAVING_TO_GBY PUSH_PRED PUSH_SUBQ
+syn keyword plsqlKeyword PX_FAULT_TOLERANCE PX_GRANULE PX_JOIN_FILTER QB_NAME QUALIFY QUARANTINE QUARTERS
+syn keyword plsqlKeyword QUERY QUERY_BLOCK QUEUE QUEUE_CURR QUEUE_ROWP QUIESCE QUORUM QUOTA QUOTAGROUP
+syn keyword plsqlKeyword QUOTES RANDOM RANDOM_LOCAL RANGE RANK RANKM RAPIDLY RATIO_TO_REPORT RAWTOHEX
+syn keyword plsqlKeyword RAWTONHEX RAWTOREF RBA RBO_OUTLINE RDBA READ READS READ_OR_WRITE REALM REBALANCE
+syn keyword plsqlKeyword REBUILD RECONNECT RECORDS_PER_BLOCK RECOVER RECOVERABLE RECOVERY RECYCLE RECYCLEBIN
+syn keyword plsqlKeyword REDACTION REDEFINE REDO REDUCED REDUNDANCY REFERENCE REFERENCED REFERENCES
+syn keyword plsqlKeyword REFERENCING REFRESH REFTOHEX REFTORAW REF_CASCADE_CURSOR REGEXP_COUNT REGEXP_INSTR
+syn keyword plsqlKeyword REGEXP_LIKE REGEXP_REPLACE REGEXP_SUBSTR REGISTER REGR_AVGX REGR_AVGY REGR_COUNT
+syn keyword plsqlKeyword REGR_INTERCEPT REGR_R2 REGR_SLOPE REGR_SXX REGR_SXY REGR_SYY REGULAR REJECT
+syn keyword plsqlKeyword REKEY RELATIONAL RELOCATE RELY REMAINDER REMOTE REMOTE_MAPPED REMOVE REORDER_WIF
+syn keyword plsqlKeyword REPAIR REPEAT REPLICATION REQUIRED RESERVOIR_SAMPLING RESET RESETLOGS
+syn keyword plsqlKeyword RESIZE RESOLVE RESOLVER RESPECT RESTART RESTORE RESTORE_AS_INTERVALS RESTRICT
+syn keyword plsqlKeyword RESTRICTED RESTRICT_ALL_REF_CONS RESULT_CACHE RESUMABLE RESUME RETENTION RETRY_ON_ROW_CHANGE
+syn keyword plsqlKeyword RETURN RETURNING REUSE REVERSE REWRITE REWRITE_OR_ERROR RIGHT RLS_FORCE ROLE
+syn keyword plsqlKeyword ROLES ROLESET ROLLBACK ROLLING ROLLOVER ROLLUP ROOT ROUND ROUND_TIES_TO_EVEN
+syn keyword plsqlKeyword ROW ROWDEPENDENCIES ROWIDTOCHAR ROWIDTONCHAR ROWID_MAPPING_TABLE ROWNUM ROWS
+syn keyword plsqlKeyword ROW_LENGTH ROW_NUMBER RPAD RTRIM RULE RULES RUNNING SALT SAMPLE SAVE SAVEPOINT
+syn keyword plsqlKeyword SAVE_AS_INTERVALS SB4 SCALAR SCALARS SCALE SCALE_ROWS SCAN SCAN_INSTANCES
+syn keyword plsqlKeyword SCHEDULER SCHEMA SCHEMACHECK SCN SCN_ASCENDING SCOPE SCRUB SDO_GEOM_KEY SDO_GEOM_MAX_X
+syn keyword plsqlKeyword SDO_GEOM_MAX_Y SDO_GEOM_MAX_Z SDO_GEOM_MBB SDO_GEOM_MBR SDO_GEOM_MIN_X SDO_GEOM_MIN_Y
+syn keyword plsqlKeyword SDO_GEOM_MIN_Z SDO_TOLERANCE SD_ALL SD_INHIBIT SD_SHOW SEARCH SECONDS SECRET
+syn keyword plsqlKeyword SECUREFILE SECUREFILE_DBA SECURITY SEED SEGMENT SEG_BLOCK SEG_FILE SELECTIVITY
+syn keyword plsqlKeyword SELF SEMIJOIN SEMIJOIN_DRIVER SEMI_TO_INNER SENSITIVE SEQUENCE SEQUENCED SEQUENTIAL
+syn keyword plsqlKeyword SERIAL SERIALIZABLE SERVERERROR SERVICE SERVICES SERVICE_NAME_CONVERT SESSION
+syn keyword plsqlKeyword SESSIONS_PER_USER SESSIONTIMEZONE SESSIONTZNAME SESSION_CACHED_CURSORS SETS
+syn keyword plsqlKeyword SETTINGS SET_GBY_PUSHDOWN SET_TO_JOIN SEVERE SHARD SHARDED SHARDS SHARDSPACE
+syn keyword plsqlKeyword SHARD_CHUNK_ID SHARED SHARED_POOL SHARE_OF SHARING SHD$COL$MAP SHELFLIFE
+syn keyword plsqlKeyword SHRINK SHUTDOWN SIBLING SIBLINGS SID SIGN SIGNAL_COMPONENT SIGNAL_FUNCTION
+syn keyword plsqlKeyword SIGNATURE SIMPLE SIN SINGLE SINGLETASK SINH SITE SKEWNESS_POP SKEWNESS_SAMP
+syn keyword plsqlKeyword SKIP SKIP_EXT_OPTIMIZER SKIP_PROXY SKIP_UNQ_UNUSABLE_IDX SKIP_UNUSABLE_INDEXES
+syn keyword plsqlKeyword SMALLFILE SNAPSHOT SOME SORT SOUNDEX SOURCE SOURCE_FILE_DIRECTORY SOURCE_FILE_NAME_CONVERT
+syn keyword plsqlKeyword SPACE SPATIAL SPECIFICATION SPFILE SPLIT SPREADSHEET SQL SQLLDR SQL_SCOPE
+syn keyword plsqlKeyword SQL_TRACE SQL_TRANSLATION_PROFILE SQRT STALE STANDALONE STANDARD_HASH STANDBY
+syn keyword plsqlKeyword STANDBYS STANDBY_MAX_DATA_DELAY STAR STARTUP STAR_TRANSFORMATION STATE STATEMENT
+syn keyword plsqlKeyword STATEMENTS STATEMENT_ID STATEMENT_QUEUING STATIC STATISTICS STATS_BINOMIAL_TEST
+syn keyword plsqlKeyword STATS_CROSSTAB STATS_F_TEST STATS_KS_TEST STATS_MODE STATS_MW_TEST STATS_ONE_WAY_ANOVA
+syn keyword plsqlKeyword STATS_T_TEST_INDEP STATS_T_TEST_INDEPU STATS_T_TEST_ONE STATS_T_TEST_PAIRED
+syn keyword plsqlKeyword STATS_WSR_TEST STDDEV STDDEV_POP STDDEV_SAMP STOP STORAGE STORAGE_INDEX STORE
+syn keyword plsqlKeyword STREAM STREAMS STRICT STRING STRINGS STRIP STRIPE_COLUMNS STRIPE_WIDTH STRUCTURE
+syn keyword plsqlKeyword SUBMULTISET SUBPARTITION SUBPARTITIONING SUBPARTITIONS SUBPARTITION_REL SUBQUERIES
+syn keyword plsqlKeyword SUBQUERY_PRUNING SUBSCRIBE SUBSET SUBSTITUTABLE SUBSTR SUBSTR2 SUBSTR4 SUBSTRB
+syn keyword plsqlKeyword SUBSTRC SUBTYPE SUCCESS SUCCESSFUL SUM SUMMARY SUPPLEMENTAL SUPPRESS_LOAD
+syn keyword plsqlKeyword SUSPEND SWAP_JOIN_INPUTS SWITCH SWITCHOVER SYNC SYNCHRONOUS SYSASM SYSAUX
+syn keyword plsqlKeyword SYSBACKUP SYSDATE SYSDBA SYSDG SYSGUID SYSKM SYSOBJ SYSOPER SYSRAC SYSTEM
+syn keyword plsqlKeyword SYSTEM_DEFINED SYSTEM_STATS SYSTIMESTAMP SYS_AUDIT SYS_CHECKACL SYS_CHECK_PRIVILEGE
+syn keyword plsqlKeyword SYS_CONNECT_BY_PATH SYS_CONS_ANY_SCALAR SYS_CONTEXT SYS_CTXINFOPK SYS_CTX_CONTAINS2
+syn keyword plsqlKeyword SYS_CTX_MKIVIDX SYS_DBURIGEN SYS_DL_CURSOR SYS_DM_RXFORM_CHR SYS_DM_RXFORM_LAB
+syn keyword plsqlKeyword SYS_DM_RXFORM_NUM SYS_DOM_COMPARE SYS_DST_PRIM2SEC SYS_DST_SEC2PRIM SYS_ET_BFILE_TO_RAW
+syn keyword plsqlKeyword SYS_ET_BLOB_TO_IMAGE SYS_ET_IMAGE_TO_BLOB SYS_ET_RAW_TO_BFILE SYS_EXTPDTXT
+syn keyword plsqlKeyword SYS_EXTRACT_UTC SYS_FBT_INSDEL SYS_FILTER_ACLS SYS_FNMATCHES SYS_FNREPLACE
+syn keyword plsqlKeyword SYS_GETTOKENID SYS_GETXTIVAL SYS_GET_ACLIDS SYS_GET_ANY_SCALAR SYS_GET_COL_ACLIDS
+syn keyword plsqlKeyword SYS_GET_PRIVILEGES SYS_GUID SYS_MAKEXML SYS_MAKE_XMLNODEID SYS_MKXMLATTR SYS_MKXTI
+syn keyword plsqlKeyword SYS_OPTLOBPRBSC SYS_OPTXICMP SYS_OPTXQCASTASNQ SYS_OP_ADT2BIN SYS_OP_ADTCONS
+syn keyword plsqlKeyword SYS_OP_ALSCRVAL SYS_OP_ATG SYS_OP_BIN2ADT SYS_OP_BITVEC SYS_OP_BL2R SYS_OP_BLOOM_FILTER
+syn keyword plsqlKeyword SYS_OP_BLOOM_FILTER_LIST SYS_OP_C2C SYS_OP_CAST SYS_OP_CEG SYS_OP_CL2C SYS_OP_COMBINED_HASH
+syn keyword plsqlKeyword SYS_OP_COMP SYS_OP_CONVERT SYS_OP_COUNTCHG SYS_OP_CSCONV SYS_OP_CSCONVTEST
+syn keyword plsqlKeyword SYS_OP_CSR SYS_OP_CSX_PATCH SYS_OP_CYCLED_SEQ SYS_OP_DECOMP SYS_OP_DESCEND
+syn keyword plsqlKeyword SYS_OP_DISTINCT SYS_OP_DRA SYS_OP_DSB_DESERIALIZE SYS_OP_DSB_SERIALIZE SYS_OP_DUMP
+syn keyword plsqlKeyword SYS_OP_DV_CHECK SYS_OP_ENFORCE_NOT_NULL$ SYS_OP_EXTRACT SYS_OP_GROUPING SYS_OP_GUID
+syn keyword plsqlKeyword SYS_OP_HASH SYS_OP_HCS_TABLE SYS_OP_IIX SYS_OP_INTERVAL_HIGH_BOUND SYS_OP_ITR
+syn keyword plsqlKeyword SYS_OP_KEY_VECTOR_CREATE SYS_OP_KEY_VECTOR_FILTER SYS_OP_KEY_VECTOR_FILTER_LIST
+syn keyword plsqlKeyword SYS_OP_KEY_VECTOR_PAYLOAD SYS_OP_KEY_VECTOR_SUCCEEDED SYS_OP_KEY_VECTOR_USE
+syn keyword plsqlKeyword SYS_OP_LBID SYS_OP_LOBLOC2BLOB SYS_OP_LOBLOC2CLOB SYS_OP_LOBLOC2ID SYS_OP_LOBLOC2NCLOB
+syn keyword plsqlKeyword SYS_OP_LOBLOC2TYP SYS_OP_LSVI SYS_OP_LVL SYS_OP_MAKEOID SYS_OP_MAP_NONNULL
+syn keyword plsqlKeyword SYS_OP_MSR SYS_OP_NICOMBINE SYS_OP_NIEXTRACT SYS_OP_NII SYS_OP_NIX SYS_OP_NOEXPAND
+syn keyword plsqlKeyword SYS_OP_NTCIMG$ SYS_OP_NUMTORAW SYS_OP_OBJ_UPD_IN_TXN SYS_OP_OIDVALUE SYS_OP_OPNSIZE
+syn keyword plsqlKeyword SYS_OP_PAR SYS_OP_PARGID SYS_OP_PARGID_1 SYS_OP_PART_ID SYS_OP_PAR_1 SYS_OP_PIVOT
+syn keyword plsqlKeyword SYS_OP_R2O SYS_OP_RAWTONUM SYS_OP_RDTM SYS_OP_REF SYS_OP_RMTD SYS_OP_ROWIDTOOBJ
+syn keyword plsqlKeyword SYS_OP_RPB SYS_OP_TOSETID SYS_OP_TPR SYS_OP_TRTB SYS_OP_UNDESCEND SYS_OP_VECAND
+syn keyword plsqlKeyword SYS_OP_VECBIT SYS_OP_VECOR SYS_OP_VECTOR_GROUP_BY SYS_OP_VECXOR SYS_OP_VERSION
+syn keyword plsqlKeyword SYS_OP_VREF SYS_OP_VVD SYS_OP_XMLCONS_FOR_CSX SYS_OP_XPTHATG SYS_OP_XPTHIDX
+syn keyword plsqlKeyword SYS_OP_XPTHOP SYS_OP_XTNN SYS_OP_XTXT2SQLT SYS_OP_ZONE_ID SYS_ORDERKEY_DEPTH
+syn keyword plsqlKeyword SYS_ORDERKEY_MAXCHILD SYS_ORDERKEY_PARENT SYS_PARALLEL_TXN SYS_PATHID_IS_ATTR
+syn keyword plsqlKeyword SYS_PATHID_IS_NMSPC SYS_PATHID_LASTNAME SYS_PATHID_LASTNMSPC SYS_PATH_REVERSE
+syn keyword plsqlKeyword SYS_PLSQL_COUNT SYS_PLSQL_CPU SYS_PLSQL_IO SYS_PXQEXTRACT SYS_RAW_TO_XSID
+syn keyword plsqlKeyword SYS_REMAP_XMLTYPE SYS_RID_ORDER SYS_ROW_DELTA SYS_SC_2_XMLT SYS_SYNRCIREDO
+syn keyword plsqlKeyword SYS_TYPEID SYS_UMAKEXML SYS_XMLANALYZE SYS_XMLCONTAINS SYS_XMLCONV SYS_XMLEXNSURI
+syn keyword plsqlKeyword SYS_XMLGEN SYS_XMLINSTR SYS_XMLI_LOC_ISNODE SYS_XMLI_LOC_ISTEXT SYS_XMLLOCATOR_GETSVAL
+syn keyword plsqlKeyword SYS_XMLNODEID SYS_XMLNODEID_GETCID SYS_XMLNODEID_GETLOCATOR SYS_XMLNODEID_GETOKEY
+syn keyword plsqlKeyword SYS_XMLNODEID_GETPATHID SYS_XMLNODEID_GETPTRID SYS_XMLNODEID_GETRID SYS_XMLNODEID_GETSVAL
+syn keyword plsqlKeyword SYS_XMLNODEID_GETTID SYS_XMLTRANSLATE SYS_XMLTYPE2SQL SYS_XMLT_2_SC SYS_XQBASEURI
+syn keyword plsqlKeyword SYS_XQCASTABLEERRH SYS_XQCODEP2STR SYS_XQCODEPEQ SYS_XQCON2SEQ SYS_XQCONCAT
+syn keyword plsqlKeyword SYS_XQDELETE SYS_XQDFLTCOLATION SYS_XQDOC SYS_XQDOCURI SYS_XQDURDIV SYS_XQED4URI
+syn keyword plsqlKeyword SYS_XQENDSWITH SYS_XQERR SYS_XQERRH SYS_XQESHTMLURI SYS_XQEXLOBVAL SYS_XQEXSTWRP
+syn keyword plsqlKeyword SYS_XQEXTRACT SYS_XQEXTRREF SYS_XQEXVAL SYS_XQFB2STR SYS_XQFNBOOL SYS_XQFNCMP
+syn keyword plsqlKeyword SYS_XQFNDATIM SYS_XQFNLNAME SYS_XQFNNM SYS_XQFNNSURI SYS_XQFNPREDTRUTH SYS_XQFNQNM
+syn keyword plsqlKeyword SYS_XQFNROOT SYS_XQFORMATNUM SYS_XQFTCONTAIN SYS_XQFUNCR SYS_XQGETCONTENT
+syn keyword plsqlKeyword SYS_XQINDXOF SYS_XQINSERT SYS_XQINSPFX SYS_XQIRI2URI SYS_XQLANG SYS_XQLLNMFRMQNM
+syn keyword plsqlKeyword SYS_XQMKNODEREF SYS_XQNILLED SYS_XQNODENAME SYS_XQNORMSPACE SYS_XQNORMUCODE
+syn keyword plsqlKeyword SYS_XQNSP4PFX SYS_XQNSPFRMQNM SYS_XQPFXFRMQNM SYS_XQPOLYABS SYS_XQPOLYADD
+syn keyword plsqlKeyword SYS_XQPOLYCEL SYS_XQPOLYCST SYS_XQPOLYCSTBL SYS_XQPOLYDIV SYS_XQPOLYFLR SYS_XQPOLYMOD
+syn keyword plsqlKeyword SYS_XQPOLYMUL SYS_XQPOLYRND SYS_XQPOLYSQRT SYS_XQPOLYSUB SYS_XQPOLYUMUS SYS_XQPOLYUPLS
+syn keyword plsqlKeyword SYS_XQPOLYVEQ SYS_XQPOLYVGE SYS_XQPOLYVGT SYS_XQPOLYVLE SYS_XQPOLYVLT SYS_XQPOLYVNE
+syn keyword plsqlKeyword SYS_XQREF2VAL SYS_XQRENAME SYS_XQREPLACE SYS_XQRESVURI SYS_XQRNDHALF2EVN SYS_XQRSLVQNM
+syn keyword plsqlKeyword SYS_XQRYENVPGET SYS_XQRYVARGET SYS_XQRYWRP SYS_XQSEQ2CON SYS_XQSEQ2CON4XC
+syn keyword plsqlKeyword SYS_XQSEQDEEPEQ SYS_XQSEQINSB SYS_XQSEQRM SYS_XQSEQRVS SYS_XQSEQSUB SYS_XQSEQTYPMATCH
+syn keyword plsqlKeyword SYS_XQSTARTSWITH SYS_XQSTATBURI SYS_XQSTR2CODEP SYS_XQSTRJOIN SYS_XQSUBSTRAFT
+syn keyword plsqlKeyword SYS_XQSUBSTRBEF SYS_XQTOKENIZE SYS_XQTREATAS SYS_XQXFORM SYS_XQ_ASQLCNV SYS_XQ_ATOMCNVCHK
+syn keyword plsqlKeyword SYS_XQ_NRNG SYS_XQ_PKSQL2XML SYS_XQ_UPKXML2SQL SYS_XSID_TO_RAW SYS_ZMAP_FILTER
+syn keyword plsqlKeyword SYS_ZMAP_REFRESH TABAUTH TABLES TABLESPACE TABLESPACE_NO TABLE_LOOKUP_BY_NL
+syn keyword plsqlKeyword TABLE_STATS TABNO TAG TAN TANH TARGET TBL$OR$IDX$PART$NUM TEMP TEMPFILE TEMPLATE
+syn keyword plsqlKeyword TEMPORARY TEMP_TABLE TENANT_ID TEST TEXT THAN THE THREAD THROUGH TIER TIES
+syn keyword plsqlKeyword TIMEOUT TIMES TIMESTAMP_TO_NUMBER TIMEZONE_ABBR TIMEZONE_HOUR TIMEZONE_MINUTE
+syn keyword plsqlKeyword TIMEZONE_OFFSET TIMEZONE_REGION TIME_ZONE TIV_GB TIV_SSF TOKEN TOPLEVEL TO_ACLID
+syn keyword plsqlKeyword TO_APPROX_COUNT_DISTINCT TO_APPROX_PERCENTILE TO_BINARY_DOUBLE TO_BINARY_FLOAT
+syn keyword plsqlKeyword TO_BLOB TO_CHAR TO_CLOB TO_DATE TO_DSINTERVAL TO_ISO_STRING TO_LOB TO_MULTI_BYTE
+syn keyword plsqlKeyword TO_NCHAR TO_NCLOB TO_NUMBER TO_SINGLE_BYTE TO_TIME TO_TIMESTAMP TO_TIMESTAMP_TZ
+syn keyword plsqlKeyword TO_TIME_TZ TO_UTC_TIMESTAMP_TZ TO_YMINTERVAL TRACE TRACING TRACKING TRAILING
+syn keyword plsqlKeyword TRANSACTION TRANSFORM TRANSFORM_DISTINCT_AGG TRANSITION TRANSITIONAL TRANSLATE
+syn keyword plsqlKeyword TRANSLATION TRANSPORTABLE TREAT TRIGGERS TRIM TRUNC TRUNCATE TRUST TRUSTED
+syn keyword plsqlKeyword TUNING TX TYPENAME TYPES TZ_OFFSET UB2 UBA UCS2 UID UNARCHIVED UNBOUND
+syn keyword plsqlKeyword UNBOUNDED UNCONDITIONAL UNDER UNDO UNDROP UNIFORM UNINSTALL UNION_ALL UNISTR
+syn keyword plsqlKeyword UNITE UNIXTIME UNLIMITED UNLOAD UNLOCK UNMATCHED UNNEST UNNEST_INNERJ_DISTINCT_VIEW
+syn keyword plsqlKeyword UNNEST_NOSEMIJ_NODISTINCTVIEW UNNEST_SEMIJ_VIEW UNPACKED UNPIVOT UNPLUG UNPROTECTED
+syn keyword plsqlKeyword UNQUIESCE UNRECOVERABLE UNRESTRICTED UNSUBSCRIBE UNTIL UNUSABLE UNUSED UPDATABLE
+syn keyword plsqlKeyword UPDATED UPDATEXML UPD_INDEXES UPD_JOININDEX UPGRADE UPPER UPSERT USABLE USAGE
+syn keyword plsqlKeyword USE USER USERENV USERGROUP USERS USER_DATA USER_DEFINED USER_RECYCLEBIN USER_TABLESPACES
+syn keyword plsqlKeyword USE_ANTI USE_CONCAT USE_CUBE USE_DAGG_UNION_ALL_GSETS USE_HASH USE_HASH_AGGREGATION
+syn keyword plsqlKeyword USE_HASH_GBY_FOR_DAGGPSHD USE_HASH_GBY_FOR_PUSHDOWN USE_HIDDEN_PARTITIONS
+syn keyword plsqlKeyword USE_INVISIBLE_INDEXES USE_MERGE USE_MERGE_CARTESIAN USE_NL USE_NL_WITH_INDEX
+syn keyword plsqlKeyword USE_PARTITION_WISE_DISTINCT USE_PARTITION_WISE_GBY USE_PARTITION_WISE_WIF
+syn keyword plsqlKeyword USE_PRIVATE_OUTLINES USE_SCALABLE_GBY_INVDIST USE_SEMI USE_STORED_OUTLINES
+syn keyword plsqlKeyword USE_TTT_FOR_GSETS USE_VECTOR_AGGREGATION USE_WEAK_NAME_RESL USING USING_NO_EXPAND
+syn keyword plsqlKeyword UTF16BE UTF16LE UTF32 UTF8 V1 V2 VALIDATE VALIDATE_CONVERSION VALIDATION VALID_TIME_END
+syn keyword plsqlKeyword VALUE VARIANCE VARRAY VARRAYS VAR_POP VAR_SAMP VECTOR VECTOR_ENCODE VECTOR_READ
+syn keyword plsqlKeyword VECTOR_READ_TRACE VECTOR_TRANSFORM VECTOR_TRANSFORM_DIMS VECTOR_TRANSFORM_FACT
+syn keyword plsqlKeyword VERIFIER VERIFY VERSION VERSIONING VERSIONS VERSIONS_ENDSCN VERSIONS_ENDTIME
+syn keyword plsqlKeyword VERSIONS_OPERATION VERSIONS_STARTSCN VERSIONS_STARTTIME VERSIONS_XID VIEWS
+syn keyword plsqlKeyword VIOLATION VIRTUAL VISIBILITY VISIBLE VOLUME VSIZE WAIT WALLET WEEK WEEKS WELLFORMED
+syn keyword plsqlKeyword WHITESPACE WIDTH_BUCKET WINDOW WITHIN WITHOUT WITH_EXPRESSION
+syn keyword plsqlKeyword WITH_PLSQL WORK WRAPPED WRAPPER WRITE XDB_FASTPATH_INSERT XID XML XML2OBJECT
+syn keyword plsqlKeyword XMLATTRIBUTES XMLCAST XMLCDATA XMLCOLATTVAL XMLCOMMENT XMLCONCAT XMLDIFF XMLELEMENT
+syn keyword plsqlKeyword XMLEXISTS XMLEXISTS2 XMLFOREST XMLINDEX_REWRITE XMLINDEX_REWRITE_IN_SELECT
+syn keyword plsqlKeyword XMLINDEX_SEL_IDX_TBL XMLISNODE XMLISVALID XMLNAMESPACES XMLPARSE XMLPATCH
+syn keyword plsqlKeyword XMLPI XMLQUERY XMLQUERYVAL XMLROOT XMLSCHEMA XMLSERIALIZE XMLTABLE XMLTOJSON
+syn keyword plsqlKeyword XMLTOKENSET XMLTRANSFORM XMLTRANSFORMBLOB XMLTSET_DML_ENABLE XML_DIAG XML_DML_RWT_STMT
+syn keyword plsqlKeyword XPATHTABLE XS XS_SYS_CONTEXT X_DYN_PRUNE YEARS YES ZONEMAP
+
+" Some of Oracle's Reserved keywords.
+syn keyword plsqlReserved ACCESSIBLE AGENT ALL ALTER ANY ASC BFILE_BASE BLOB_BASE BY
+"syn match plsqlReserved "\<AS\>"
+syn keyword plsqlReserved C CALLING CHARSET CHARSETFORM CHARSETID CHAR_BASE CHECK CLOB_BASE CLUSTER
+syn keyword plsqlReserved COLLATE COMPILED COMPRESS CONNECT CONNECT_BY_ROOT CONSTRUCTOR CUSTOMDATUM
+syn keyword plsqlReserved DATE_BASE DEFAULT DESC DISTINCT DROP DURATION EXCEPT EXCLUSIVE
+syn match plsqlReserved "\<DELETE\>"
+syn keyword plsqlReserved EXIT FIXED FROM GENERAL GRANT GROUP HAVING IDENTIFIED INDEX
+syn match plsqlReserved "\<EXISTS\>"
+syn keyword plsqlReserved INDICES INTERFACE INTERSECT INTO LARGE LIMITED LOCK MAXLEN
+syn keyword plsqlReserved MINUS MODE NOCOMPRESS NOWAIT NUMBER_BASE OCICOLL OCIDATE OCIDATETIME
+syn keyword plsqlReserved OCIDURATION OCIINTERVAL OCILOBLOCATOR OCINUMBER OCIRAW OCIREF OCIREFCURSOR
+syn keyword plsqlReserved OCIROWID OCISTRING OCITYPE OF ON OPTION ORACLE ORADATA ORDER ORLANY ORLVARY
+syn keyword plsqlReserved OUT OVERRIDING PARALLEL_ENABLE PARAMETER PASCAL PCTFREE PIPE PIPELINED POLYMORPHIC
+syn keyword plsqlReserved PRAGMA PRIOR PUBLIC RAISE RECORD RELIES_ON RENAME RESOURCE RESULT REVOKE ROWID
+syn keyword plsqlReserved SB1 SB2
+syn match plsqlReserved "\<SELECT\>"
+syn keyword plsqlReserved SEPARATE SHARE SHORT SIZE SIZE_T SPARSE SQLCODE SQLDATA
+syn keyword plsqlReserved SQLNAME SQLSTATE STANDARD START STORED STRUCT STYLE SYNONYM TABLE TDO
+syn keyword plsqlReserved TRANSACTIONAL TRIGGER UB1 UB4 UNION UNIQUE UNSIGNED UNTRUSTED VALIST
+syn keyword plsqlReserved VALUES VIEW VOID WHERE WITH
+
+" PL/SQL and SQL functions.
+syn keyword plsqlFunction ABS ACOS ADD_MONTHS APPROX_COUNT APPROX_COUNT_DISTINCT APPROX_COUNT_DISTINCT_AGG
+syn keyword plsqlFunction APPROX_COUNT_DISTINCT_DETAIL APPROX_MEDIAN APPROX_PERCENTILE APPROX_PERCENTILE_AGG
+syn keyword plsqlFunction APPROX_PERCENTILE_DETAIL APPROX_RANK APPROX_SUM ASCII ASCIISTR ASIN ATAN ATAN2
+syn keyword plsqlFunction AVG BFILENAME BIN_TO_NUM BITAND CARDINALITY CAST CEIL CHARTOROWID CHR CLUSTER_DETAILS
+syn keyword plsqlFunction CLUSTER_DISTANCE CLUSTER_ID CLUSTER_PROBABILITY CLUSTER_SET COALESCE COLLATION
+syn keyword plsqlFunction COLLECT COMPOSE CONCAT CONVERT CON_DBID_TO_ID CON_GUID_TO_ID CON_NAME_TO_ID
+syn keyword plsqlFunction CON_UID_TO_ID CORR COS COSH COVAR_POP COVAR_SAMP CUME_DIST CURRENT_DATE
+syn keyword plsqlFunction CURRENT_TIMESTAMP CV DATAOBJ_TO_MAT_PARTITION DATAOBJ_TO_PARTITION DBTIMEZONE
+syn keyword plsqlFunction DECODE DECOMPOSE DENSE_RANK DEPTH DEREF DUMP EMPTY_BLOB EMPTY_CLOB EXISTSNODE
+syn keyword plsqlFunction EXP EXTRACT EXTRACTVALUE FEATURE_COMPARE FEATURE_DETAILS FEATURE_ID FEATURE_SET
+syn keyword plsqlFunction FEATURE_VALUE FIRST_VALUE FLOOR FROM_TZ GREATEST GROUPING GROUPING_ID
+syn keyword plsqlFunction GROUP_ID HEXTORAW INITCAP INSTR ITERATION_NUMBER JSON_ARRAY JSON_ARRAYAGG
+syn keyword plsqlFunction JSON_OBJECT JSON_OBJECTAGG JSON_QUERY JSON_TABLE JSON_VALUE LAG LAST_DAY
+syn keyword plsqlFunction LAST_VALUE LEAD LEAST LENGTH LISTAGG LN LNNVL LOCALTIMESTAMP LOG LOWER LPAD
+syn keyword plsqlFunction LTRIM MAKE_REF MAX MEDIAN MIN MOD MONTHS_BETWEEN NANVL NCHR NEW_TIME NEXT_DAY
+syn keyword plsqlFunction NLSSORT NLS_CHARSET_DECL_LEN NLS_CHARSET_ID NLS_CHARSET_NAME NLS_COLLATION_ID
+syn keyword plsqlFunction NLS_COLLATION_NAME NLS_INITCAP NLS_LOWER NLS_UPPER NTH_VALUE NTILE NULLIF
+syn keyword plsqlFunction NUMTODSINTERVAL NUMTOYMINTERVAL NVL NVL2 ORA_DM_PARTITION_NAME ORA_DST_AFFECTED
+syn keyword plsqlFunction ORA_DST_CONVERT ORA_DST_ERROR ORA_HASH ORA_INVOKING_USER ORA_INVOKING_USERID
+syn keyword plsqlFunction PATH PERCENTILE_CONT PERCENTILE_DISC PERCENT_RANK POWER POWERMULTISET POWERMULTISET_BY_CARDINALITY
+syn keyword plsqlFunction PREDICTION PREDICTION_BOUNDS PREDICTION_COST PREDICTION_DETAILS PREDICTION_PROBABILITY
+syn keyword plsqlFunction PREDICTION_SET PRESENTNNV PRESENTV PREVIOUS RANK RATIO_TO_REPORT RAWTOHEX
+syn keyword plsqlFunction RAWTONHEX REFTOHEX REGEXP_COUNT REGEXP_INSTR REGEXP_REPLACE REGEXP_SUBSTR
+syn keyword plsqlFunction REMAINDER ROUND ROUND ROWIDTOCHAR ROWIDTONCHAR ROW_NUMBER RPAD RTRIM
+syn keyword plsqlFunction SCN_TO_TIMESTAMP SESSIONTIMEZONE SIGN SIN SINH SOUNDEX SQRT STANDARD_HASH
+syn keyword plsqlFunction STATS_BINOMIAL_TEST STATS_CROSSTAB STATS_F_TEST STATS_KS_TEST STATS_MODE STATS_MW_TEST
+syn keyword plsqlFunction STATS_ONE_WAY_ANOVA STATS_WSR_TEST STDDEV STDDEV_POP STDDEV_SAMP SUBSTR SUM
+syn keyword plsqlFunction SYSDATE SYSTIMESTAMP SYS_CONNECT_BY_PATH SYS_CONTEXT SYS_DBURIGEN SYS_EXTRACT_UTC
+syn keyword plsqlFunction SYS_GUID SYS_OP_ZONE_ID SYS_TYPEID SYS_XMLAGG SYS_XMLGEN TAN TANH TIMESTAMP_TO_SCN
+syn keyword plsqlFunction TO_APPROX_COUNT_DISTINCT TO_APPROX_PERCENTILE TO_BINARY_DOUBLE TO_BINARY_FLOAT
+syn keyword plsqlFunction TO_BLOB TO_CHAR TO_CLOB TO_DATE TO_DSINTERVAL TO_LOB TO_MULTI_BYTE TO_NCHAR
+syn keyword plsqlFunction TO_NCLOB TO_NUMBER TO_SINGLE_BYTE TO_TIMESTAMP TO_TIMESTAMP_TZ TO_YMINTERVAL
+syn keyword plsqlFunction TRANSLATE TREAT TRIM TRUNC TZ_OFFSET UID UNISTR UPPER USER USERENV VALIDATE_CONVERSION
+syn keyword plsqlFunction VALUE VARIANCE VAR_POP VAR_SAMP VSIZE WIDTH_BUCKET XMLAGG XMLCAST XMLCDATA
+syn keyword plsqlFunction XMLCOLATTVAL XMLCOMMENT XMLCONCAT XMLDIFF XMLELEMENT XMLEXISTS XMLFOREST XMLISVALID
+syn keyword plsqlFunction XMLPARSE XMLPATCH XMLPI XMLQUERY XMLROOT XMLSEQUENCE XMLSERIALIZE XMLTABLE
+syn keyword plsqlFunction XMLTRANSFORM
+syn keyword plsqlFunction CURRVAL NEXTVAL
+syn match plsqlFunction "\<SYS\$LOB_REPLICATION\>"
+syn match plsqlFunction "\.COUNT\>"hs=s+1
+syn match plsqlFunction "\.EXISTS\>"hs=s+1
+syn match plsqlFunction "\.FIRST\>"hs=s+1
+syn match plsqlFunction "\.LAST\>"hs=s+1
+syn match plsqlFunction "\.DELETE\>"hs=s+1
+syn match plsqlFunction "\.PREV\>"hs=s+1
+syn match plsqlFunction "\.NEXT\>"hs=s+1
+
+if get(g:,"plsql_legacy_sql_keywords",0) == 1
+ " Some of Oracle's SQL keywords.
+ syn keyword plsqlSQLKeyword ABORT ACCESS ACCESSED ADD AFTER ALL ALTER AND ANY
+ syn keyword plsqlSQLKeyword ASC ATTRIBUTE AUDIT AUTHORIZATION AVG BASE_TABLE
+ syn keyword plsqlSQLKeyword BEFORE BETWEEN BY CASCADE CAST CHECK CLUSTER
+ syn keyword plsqlSQLKeyword CLUSTERS COLAUTH COLUMN COMMENT COMPRESS CONNECT
+ syn keyword plsqlSQLKeyword CONSTRAINT CRASH CURRENT DATA DATABASE
+ syn keyword plsqlSQLKeyword DATA_BASE DBA DEFAULT DELAY DELETE DESC DISTINCT
+ syn keyword plsqlSQLKeyword DROP DUAL EXCLUSIVE EXISTS EXTENDS EXTRACT
+ syn keyword plsqlSQLKeyword FILE FORCE FOREIGN FROM GRANT GROUP HAVING HEAP
+ syn keyword plsqlSQLKeyword IDENTIFIED IDENTIFIER IMMEDIATE IN INCLUDING
+ syn keyword plsqlSQLKeyword INCREMENT INDEX INDEXES INITIAL INSERT INSTEAD
+ syn keyword plsqlSQLKeyword INTERSECT INTO INVALIDATE ISOLATION KEY LIBRARY
+ syn keyword plsqlSQLKeyword LIKE LOCK MAXEXTENTS MINUS MODE MODIFY MULTISET
+ syn keyword plsqlSQLKeyword NESTED NOAUDIT NOCOMPRESS NOT NOWAIT OF OFF OFFLINE
+ syn keyword plsqlSQLKeyword ON ONLINE OPERATOR OPTION ORDER ORGANIZATION
+ syn keyword plsqlSQLKeyword PCTFREE PRIMARY PRIOR PRIVATE PRIVILEGES PUBLIC
+ syn keyword plsqlSQLKeyword QUOTA RELEASE RENAME REPLACE RESOURCE REVOKE ROLLBACK
+ syn keyword plsqlSQLKeyword ROW ROWLABEL ROWS SCHEMA
+ syn match plsqlSQLKeyword "\<SELECT\>"
+ syn keyword plsqlSQLKeyword SEPARATE SESSION SET
+ syn keyword plsqlSQLKeyword SHARE SIZE SPACE START STORE SUCCESSFUL SYNONYM
+ syn keyword plsqlSQLKeyword SYSDATE TABLE TABLES TABLESPACE TEMPORARY TO TREAT
+ syn keyword plsqlSQLKeyword TRIGGER TRUNCATE UID UNION UNIQUE UNLIMITED UPDATE
+ syn keyword plsqlSQLKeyword USE USER VALIDATE VALUES VIEW WHENEVER WHERE WITH
+endif
+
+
+" The built-in types.
+syn keyword plsqlStorage CHAR BYTE VARCHAR2 NCHAR NVARCHAR2
+syn keyword plsqlStorage NUMBER FLOAT BINARY_FLOAT BINARY_DOUBLE LONG RAW
+syn keyword plsqlStorage DATE TIMESTAMP INTERVAL LOCAL TIME ZONE TO MONTH SECOND YEAR DAY
+syn keyword plsqlStorage BLOB CLOB NCLOB BFILE UROWID
+syn keyword plsqlStorage CHARACTER VARYING VARCHAR NATIONAL CHARACTER
+syn keyword plsqlStorage NUMERIC DECIMAL DEC INTEGER INT SMALLINT
+syn keyword plsqlStorage FLOAT DOUBLE PRECISION REAL
+syn keyword plsqlStorage SDO_GEOMETRY SDO_TOPO_GEOMETRY SDO_GEORASTER
+syn keyword plsqlStorage REF ANYTYPE ANYDATA ANYDATASET XMLTYPE HTTPURITYPE XDBURITYPE DUBRITYPE
+syn keyword plsqlStorage BOOLEAN PLS_INTEGER BINARY_INTEGER SIMPLE_FLOAT SIMPLE_INTEGER SIMPLE_DOUBLE SYS_REFCURSOR
+"
+" PL/SQL Exceptions
+syn keyword plsqlException ACCESS_INTO_NULL CASE_NOT_FOUND COLLECTION_IS_NULL
+syn keyword plsqlException CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR
+syn keyword plsqlException INVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND
+syn keyword plsqlException NOT_LOGGED_ON PROGRAM_ERROR ROWTYPE_MISMATCH
+syn keyword plsqlException SELF_IS_NULL STORAGE_ERROR SUBSCRIPT_BEYOND_COUNT
+syn keyword plsqlException SUBSCRIPT_OUTSIDE_LIMIT SYS_INVALID_ROWID
+syn keyword plsqlException TIMEOUT_ON_RESOURCE TOO_MANY_ROWS VALUE_ERROR
+syn keyword plsqlException ZERO_DIVIDE
+
+if get(g:,"plsql_highlight_triggers",0) == 1
+ syn keyword plsqlTrigger INSERTING UPDATING DELETING
+endif
+
+" so can not contain it for folding. May no longer be necessary and can change them to plsqlKeyword
+syn match plsqlBEGIN "\<BEGIN\>"
+syn match plsqlEND "\<END\>"
+syn match plsqlISAS "\<\(IS\|AS\)\>"
+
+" Various types of comments.
+syntax region plsqlCommentL start="--" skip="\\$" end="$" keepend extend contains=@plsqlCommentGroup,plsqlSpaceError,plsqlIllegalSpace,plsqlSqlplusDefine
+if get(g:,"plsql_fold",0) == 1
+ syntax region plsqlComment
+ \ start="/\*" end="\*/"
+ \ extend
+ \ contains=@plsqlCommentGroup,plsqlSpaceError,plsqlIllegalSpace,plsqlSqlplusDefine
+ \ fold
+else
+ syntax region plsqlComment
+ \ start="/\*" end="\*/"
+ \ extend
+ \ contains=@plsqlCommentGroup,plsqlSpaceError,plsqlIllegalSpace,plsqlSqlplusDefine
+endif
+syn cluster plsqlCommentAll contains=plsqlCommentL,plsqlComment
+
+syn sync ccomment plsqlComment
+syn sync ccomment plsqlCommentL
+
+" To catch unterminated string literals.
+syn match plsqlStringError "'.*$"
+
+" Various types of literals.
+" the + and - get sucked up as operators. Not sure how to take precedence here. Something to do with word boundaries.
+" most other syntax files do not try to includ +/- in the number token, so leave them as unary operators
+" even though the oracle documentation counts the sign as part of the numeric literal
+syn match plsqlNumbers transparent "\<\d\|\.\d" contains=plsqlIntLiteral,plsqlFloatLiteral
+syn match plsqlNumbersCom contained transparent "\<\d\|\.\d" contains=plsqlIntLiteral,plsqlFloatLiteral
+syn match plsqlIntLiteral contained "\d\+"
+syn match plsqlFloatLiteral contained "\d\+\.\(\d\+\([eE][+-]\?\d\+\)\?\)\?[fd]\?"
+syn match plsqlFloatLiteral contained "\.\(\d\+\([eE][+-]\?\d\+\)\?\)[fd]\?"
+
+" double quoted strings in SQL are database object names. Should be a subgroup of Normal.
+" We will use Character group as a proxy for that so color can be chosen close to Normal
+syn region plsqlQuotedIdentifier matchgroup=plsqlOperator start=+n\?"+ end=+"+ keepend extend
+syn cluster plsqlIdentifiers contains=plsqlIdentifier,plsqlQuotedIdentifier,plsqlSqlPlusDefine
+
+" quoted string literals
+if get(g:,"plsql_fold",0) == 1
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?'+ skip=+''+ end=+'+ contains=plsqlSqlplusDefine fold keepend extend
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'\z([^[(<{]\)+ end=+\z1'+ contains=plsqlSqlplusDefine fold keepend extend
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'<+ end=+>'+ contains=plsqlSqlplusDefine fold keepend extend
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'{+ end=+}'+ contains=plsqlSqlplusDefine fold keepend extend
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'(+ end=+)'+ contains=plsqlSqlplusDefine fold keepend extend
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'\[+ end=+]'+ contains=plsqlSqlplusDefine fold keepend extend
+else
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?'+ skip=+''+ end=+'+ contains=plsqlSqlplusDefine
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'\z([^[(<{]\)+ end=+\z1'+ contains=plsqlSqlplusDefine
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'<+ end=+>'+ contains=plsqlSqlplusDefine
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'{+ end=+}'+ contains=plsqlSqlplusDefine
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'(+ end=+)'+ contains=plsqlSqlplusDefine
+ syn region plsqlStringLiteral matchgroup=plsqlOperator start=+n\?q'\[+ end=+]'+ contains=plsqlSqlplusDefine
+endif
+
+syn keyword plsqlBooleanLiteral TRUE FALSE
+
+" A type-attribute is really a type.
+syn match plsqlTypeAttribute "%\(TYPE\|ROWTYPE\)\>"
+
+" All other attributes.
+syn match plsqlAttribute "%\(BULK_EXCEPTIONS\|BULK_ROWCOUNT\|ISOPEN\|FOUND\|NOTFOUND\|ROWCOUNT\)\>"
+
+" This'll catch mis-matched close-parens.
+syn cluster plsqlParenGroup contains=plsqlParenError,@plsqlCommentGroup,plsqlCommentSkip,plsqlIntLiteral,plsqlFloatLiteral,plsqlNumbersCom
+
+if get(g:,"plsql_bracket_error",0) == 1
+ " I suspect this code was copied from c.vim and never properly considered. Do
+ " we even use braces or brackets in sql or pl/sql?
+ if get(g:,"plsql_fold",0) == 1
+ syn region plsqlParen start='(' end=')' contains=ALLBUT,@plsqlParenGroup,plsqlErrInBracket fold keepend extend transparent
+ else
+ syn region plsqlParen transparent start='(' end=')' contains=ALLBUT,@plsqlParenGroup,plsqlErrInBracket
+ endif
+ syn match plsqlParenError "[\])]"
+ syn match plsqlErrInParen contained "[{}]"
+ syn region plsqlBracket transparent start='\[' end=']' contains=ALLBUT,@plsqlParenGroup,plsqlErrInParen
+ syn match plsqlErrInBracket contained "[);{}]"
+else
+ if get(g:,"plsql_fold",0) == 1
+ syn region plsqlParen start='(' end=')' contains=ALLBUT,@plsqlParenGroup,plsqlErrInParen fold keepend extend transparent
+ else
+ syn region plsqlParen transparent start='(' end=')' contains=ALLBUT,@plsqlParenGroup,plsqlErrInParen
+ endif
+ syn match plsqlParenError ")"
+ " should this not be parens isntead of brackets? I never quite followed what this was doing
+ syn match plsqlErrInParen contained "[{}]"
+endif
+
+syn match plsqlReserved "\<BODY\>"
+syn match plsqlReserved "\<CREATE\_s\+\(OR\_s\+REPLACE\_s\+\)\?"
+" Loops
+syn match plsqlRepeat "\<\(FOR\|WHILE\|LOOP\|FORALL\)\>"
+syn match plsqlRepeat "\<END\_s\+LOOP\>"
+" conditionals
+syn match plsqlConditional "\<\(ELSIF\|IF\|ELSE\)\>"
+syn match plsqlConditional "\<END\>\_s\+\<IF\>"
+syn match plsqlCase "\<END\>\_s\+\<CASE\>"
+syn match plsqlCase "\<CASE\>"
+
+syn region plsqlSqlPlusCommentL start="^\(REM\)\( \|$\)" skip="\\$" end="$" keepend extend contains=@plsqlCommentGroup,plsqlSpaceError,plsqlIllegalSpace
+syn region plsqlSqlPlusCommand start="^\(SET\|DEFINE\|PROMPT\|ACCEPT\|EXEC\|HOST\|SHOW\|VAR\|VARIABLE\|COL\|WHENEVER\|TIMING\)\( \|$\)" skip="\\$" end="$" keepend extend
+syn region plsqlSqlPlusRunFile start="^\(@\|@@\)" skip="\\$" end="$" keepend extend
+
+if get(g:,"plsql_fold",0) == 1
+ setlocal foldmethod=syntax
+ syn sync fromstart
+
+ syn cluster plsqlProcedureGroup contains=plsqlProcedure
+ syn cluster plsqlOnlyGroup contains=@plsqlProcedure,plsqlConditionalBlock,plsqlLoopBlock,plsqlBlock,plsqlCursor
+
+ syntax region plsqlUpdateSet
+ \ start="\(\<update\>\_s\+\(\<set\>\)\@![a-z][a-z0-9$_#]*\_s\+\(\(\<set\>\)\@![a-z][a-z0-9$_#]*\_s\+\)\?\)\|\(\<when\>\_s\+\<matched\>\_s\+\<then\>\_s\+\<update\>\_s\+\)\<set\>"
+ \ end="\(\_s*\(;\|\<from\>\|\<where\>\|\<when\>\)\)\@="
+ \ fold
+ \ keepend
+ \ extend
+ \ transparent
+ \ contains=ALLBUT,@plsqlOnlyGroup,plsqlSelect
+
+ syntax region plsqlSelect
+ \ start="\<select\>"
+ \ end="\(\_s*\<from\>\)\@="
+ \ fold
+ \ keepend
+ \ extend
+ \ transparent
+ \ contains=ALLBUT,@plsqlOnlyGroup,plsqlUpdateSet
+
+ if get(g:,"plsql_disable_procedure_fold",0) == 0
+ " this is brute force and requires you have the procedure/function name in the END
+ " statement. ALthough Oracle makes it optional, we cannot. If you do not
+ " have it, then you can fold the BEGIN/END block of the procedure but not
+ " the specification of it (other than a paren group). You also cannot fold
+ " BEGIN/END blocks in the procedure body. Local procedures will fold as
+ " long as the END statement includes the procedure/function name.
+ " As for why we cannot make it work any other way, I don't know. It is
+ " something to do with both plsqlBlock and plsqlProcedure both consuming BEGIN and END,
+ " even if we use a lookahead for one of them.
+ "
+ " If you habitualy do not put the method name in the END statement,
+ " this can be expensive because it searches to end of file on every
+ " procedure/function declaration
+ "
+ "\ start="\(create\(\_s\+or\_s\+replace\)\?\_s\+\)\?\<\(procedure\|function\)\>\_s\+\z([a-z][a-z0-9$_#]*\)"
+ syntax region plsqlProcedure
+ \ start="\<\(procedure\|function\)\>\_s\+\(\z([a-z][a-z0-9$_#]*\)\)\([^;]\|\n\)\{-}\<\(is\|as\)\>\_.\{-}\(\<end\>\_s\+\2\_s*;\)\@="
+ \ end="\<end\>\_s\+\z1\_s*;"
+ \ fold
+ \ keepend
+ \ extend
+ \ transparent
+ \ contains=ALLBUT,plsqlBlock
+ endif
+
+ syntax region plsqlCursor
+ \ start="\<cursor\>\_s\+[a-z][a-z0-9$_#]*\(\_s*([^)]\+)\)\?\(\_s\+return\_s\+\S\+\)\?\_s\+is"
+ \ end=";"
+ \ fold
+ \ keepend
+ \ extend
+ \ transparent
+ \ contains=ALLBUT,@plsqlOnlyGroup
+
+ syntax region plsqlBlock
+ \ start="\<begin\>"
+ "\ end="\<end\>\_s*\;"
+ \ end="\<end\>\(\_s\+\(if\|loop\|case\)\@![a-z][a-z0-9$_#]*\)\?\_s*;"
+ \ fold
+ \ transparent
+ \ contains=ALLBUT,@plsqlProcedureGroup,plsqlPackage,plsqlErrInBracket,PlsqlProcedureJava
+ \ keepend
+ \ extend
+
+ syn region plsqlCaseBlock
+ \ transparent
+ \ start="\<case\>\(\_s*;\)\@!"
+ \ end="\<end\>\(\_s\+case\_s*;\)\?"
+ \ fold
+ \ contains=ALLBUT,@plsqlProcedureGroup,plsqlPackage,plsqlErrInBracket,PlsqlProcedureJava
+ \ keepend
+ \ extend
+ "\ contained
+
+ syntax region plsqlLoopBlock
+ \ transparent
+ \ start="\<loop\>\(\_s*;\)\@!"
+ \ end="\<end\>\(\_s\+\<loop\>\)\?\_s*;"
+ \ fold
+ \ keepend extend
+ \ contained
+ \ contains=ALLBUT,@plsqlProcedureGroup,plsqlPackage,plsqlErrInBracket,PlsqlProcedureJava
+
+ syn region plsqlConditionalBlock
+ \ transparent
+ \ start="\<if\>\(\_s*;\)\@!"
+ \ end="\<end\>\_s\+\<if\>\_s*;"
+ \ fold
+ \ keepend extend
+ \ contained
+ \ contains=ALLBUT,@plsqlProcedureGroup,plsqlPackage,plsqlErrInBracket,PlsqlProcedureJava
+
+else
+ " Syntax Synchronizing
+ syn sync minlines=1000 maxlines=2000
+endif
+"
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet.
+
+hi def link plsqlAttribute Macro
+hi def link plsqlBlockError Error
+hi def link plsqlBooleanLiteral Boolean
+hi def link plsqlQuotedIdentifier Character
+hi def link plsqlComment Comment
+hi def link plsqlCommentL Comment
+hi def link plsqlConditional Conditional
+hi def link plsqlCase 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 plsqlParenError Error
+hi def link plsqlSpaceError Error
+hi def link plsqlPseudo PreProc
+hi def link plsqlKeyword Keyword
+hi def link plsqlEND Keyword
+hi def link plsqlBEGIN Keyword
+hi def link plsqlISAS Statement
+hi def link plsqlReserved Statement
+hi def link plsqlRepeat Repeat
+hi def link plsqlStorage StorageClass
+hi def link plsqlFunction Function
+hi def link plsqlStringError Error
+hi def link plsqlStringLiteral String
+hi def link plsqlCommentString String
+hi def link plsqlComment2String String
+hi def link plsqlTrigger Function
+hi def link plsqlTypeAttribute StorageClass
+hi def link plsqlTodo Todo
+
+hi def link plsqlIllegalSpace Error
+hi def link plsqlSqlPlusDefine PreProc
+hi def link plsqlSqlPlusCommand PreProc
+hi def link plsqlSqlPlusRunFile Include
+hi def link plsqlSqlPlusCommentL Comment
+
+" to be able to change them after loading, need override whether defined or not
+if get(g:,"plsql_legacy_sql_keywords",0) == 1
+ hi link plsqlSQLKeyword Function
+ hi link plsqlSymbol Normal
+ hi link plsqlParen Normal
+else
+ hi link plsqlSymbol Special
+ hi link plsqlParen Special
+endif
+
+let b:current_syntax = "plsql"
+
+" restore setting from when we entered this file
+let &cpo = s:cpo_sav
+unlet! s:cpo_sav
+
+" vim: ts=4 sw=4
diff --git a/runtime/syntax/po.vim b/runtime/syntax/po.vim
new file mode 100644
index 0000000..15d09b1
--- /dev/null
+++ b/runtime/syntax/po.vim
@@ -0,0 +1,133 @@
+" Vim syntax file
+" Language: po (gettext)
+" Maintainer: Dwayne Bailey <dwayne@translate.org.za>
+" Last Change: 2015 Jun 07
+" Contributors: Dwayne Bailey (Most advanced syntax highlighting)
+" Leonardo Fontenelle (Spell checking)
+" Nam SungHyun <namsh@kldp.org> (Original maintainer)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+syn sync minlines=10
+
+" Identifiers
+syn match poStatementMsgCTxt "^msgctxt"
+syn match poStatementMsgidplural "^msgid_plural" contained
+syn match poPluralCaseN "[0-9]" contained
+syn match poStatementMsgstr "^msgstr\(\[[0-9]\]\)" contains=poPluralCaseN
+
+" Simple HTML and XML highlighting
+syn match poHtml "<\_[^<>]\+>" contains=poHtmlTranslatables,poLineBreak
+syn match poHtmlNot +"<[^<]\+>"+ms=s+1,me=e-1
+syn region poHtmlTranslatables start=+\(abbr\|alt\|content\|summary\|standby\|title\)=\\"+ms=e-1 end=+\\"+ contained contains=@Spell
+syn match poLineBreak +"\n"+ contained
+
+" Translation blocks
+syn region poMsgCTxt matchgroup=poStatementMsgCTxt start=+^msgctxt "+rs=e-1 matchgroup=poStringCTxt end=+^msgid "+me=s-1 contains=poStringCTxt
+syn region poMsgID matchgroup=poStatementMsgid start=+^msgid "+rs=e-1 matchgroup=poStringID end=+^msgstr\(\|\[[\]0\[]\]\) "+me=s-1 contains=poStringID,poStatementMsgidplural,poStatementMsgid
+syn region poMsgSTR matchgroup=poStatementMsgstr start=+^msgstr\(\|\[[\]0\[]\]\) "+rs=e-1 matchgroup=poStringSTR end=+\n\n+me=s-1 contains=poStringSTR,poStatementMsgstr
+syn region poStringCTxt start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn region poStringID start=+"+ skip=+\\\\\|\\"+ end=+"+ contained
+ \ contains=poSpecial,poFormat,poCommentKDE,poPluralKDE,poKDEdesktopFile,poHtml,poAcceleratorId,poHtmlNot,poVariable
+syn region poStringSTR start=+"+ skip=+\\\\\|\\"+ end=+"+ contained
+ \ contains=@Spell,poSpecial,poFormat,poHeaderItem,poCommentKDEError,poHeaderUndefined,poPluralKDEError,poMsguniqError,poKDEdesktopFile,poHtml,poAcceleratorStr,poHtmlNot,poVariable
+
+" Header and Copyright
+syn match poHeaderItem "\(Project-Id-Version\|Report-Msgid-Bugs-To\|POT-Creation-Date\|PO-Revision-Date\|Last-Translator\|Language-Team\|Language\|MIME-Version\|Content-Type\|Content-Transfer-Encoding\|Plural-Forms\|X-Generator\): " contained
+syn match poHeaderUndefined "\(PACKAGE VERSION\|YEAR-MO-DA HO:MI+ZONE\|FULL NAME <EMAIL@ADDRESS>\|LANGUAGE <LL@li.org>\|CHARSET\|ENCODING\|INTEGER\|EXPRESSION\)" contained
+syn match poCopyrightUnset "SOME DESCRIPTIVE TITLE\|FIRST AUTHOR <EMAIL@ADDRESS>, YEAR\|Copyright (C) YEAR Free Software Foundation, Inc\|YEAR THE PACKAGE\'S COPYRIGHT HOLDER\|PACKAGE" contained
+
+" Translation comment block including: translator comment, automatic coments, flags and locations
+syn match poComment "^#.*$"
+syn keyword poFlagFuzzy fuzzy contained
+syn match poCommentTranslator "^# .*$" contains=poCopyrightUnset
+syn match poCommentAutomatic "^#\..*$"
+syn match poCommentSources "^#:.*$"
+syn match poCommentFlags "^#,.*$" contains=poFlagFuzzy
+syn match poDiffOld '\(^#| "[^{]*+}\|{+[^}]*+}\|{+[^}]*\|"$\)' contained
+syn match poDiffNew '\(^#| "[^{]*-}\|{-[^}]*-}\|{-[^}]*\|"$\)' contained
+syn match poCommentDiff "^#|.*$" contains=poDiffOld,poDiffNew
+
+" Translations (also includes header fields as they appear in a translation msgstr)
+syn region poCommentKDE start=+"_: +ms=s+1 end="\\n" end="\"\n^msgstr"me=s-1 contained
+syn region poCommentKDEError start=+"\(\|\s\+\)_:+ms=s+1 end="\\n" end=+"\n\n+me=s-1 contained
+syn match poPluralKDE +"_n: +ms=s+1 contained
+syn region poPluralKDEError start=+"\(\|\s\+\)_n:+ms=s+1 end="\"\n\n"me=s-1 contained
+syn match poSpecial contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"
+syn match poFormat "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([diuoxXfeEgGcCsSpn]\|\[\^\=.[^]]*\]\)" contained
+syn match poFormat "%%" contained
+
+" msguniq and msgcat conflicts
+syn region poMsguniqError matchgroup=poMsguniqErrorMarkers start="#-#-#-#-#" end='#\("\n"\|\)-\("\n"\|\)#\("\n"\|\)-\("\n"\|\)#\("\n"\|\)-\("\n"\|\)#\("\n"\|\)-\("\n"\|\)#\("\n"\|\)\\n' contained
+
+" Obsolete messages
+syn match poObsolete "^#\~.*$"
+
+" KDE Name= handling
+syn match poKDEdesktopFile "\"\(Name\|Comment\|GenericName\|Description\|Keywords\|About\)="ms=s+1,me=e-1
+
+" Accelerator keys - this messes up if the preceding or following char is a multibyte unicode char
+syn match poAcceleratorId contained "[^&_~][&_~]\(\a\|\d\)[^:]"ms=s+1,me=e-1
+syn match poAcceleratorStr contained "[^&_~][&_~]\(\a\|\d\)[^:]"ms=s+1,me=e-1 contains=@Spell
+
+" Variables simple
+syn match poVariable contained "%\d"
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:set ts=8 sts=2 sw=2 noet:
diff --git a/runtime/syntax/pod.vim b/runtime/syntax/pod.vim
new file mode 100644
index 0000000..90c9b99
--- /dev/null
+++ b/runtime/syntax/pod.vim
@@ -0,0 +1,222 @@
+" Vim syntax file
+" Language: Perl POD format
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Previously: Scott Bigham <dsb@killerbunnies.org>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2022 Jun 13
+
+" To add embedded POD documentation highlighting to your syntax file, add
+" the commands:
+"
+" syn include @Pod <sfile>:p:h/pod.vim
+" syn region myPOD start="^=pod" start="^=head" end="^=cut" keepend contained contains=@Pod
+"
+" and add myPod to the contains= list of some existing region, probably a
+" comment. The "keepend" flag is needed because "=cut" is matched as a
+" pattern in its own right.
+
+
+" Remove any old syntax stuff hanging around (this is suppressed
+" automatically by ":syn include" if necessary).
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" TODO: add supported encodings when we can utilize better performing Vim 8 features
+syn match podEncoding "[0-9A-Za-z_-]\+" contained contains=@NoSpell
+
+" Text of a =head1, =head2 or =item command
+syn region podCmdText start="\S.*$" end="^\ze\s*$" end="^\ze=cut\>" contained contains=podFormat,@NoSpell
+
+" Indent amount of =over command
+syn match podOverIndent "\d*\.\=\d\+\>" contained contains=@NoSpell
+
+" Formatter identifier keyword for =for, =begin and =end commands
+syn match podForKeywd "\S\+" contained contains=@NoSpell
+
+" An indented line, to be displayed verbatim
+syn region podVerbatim start="^\s\+\S.*$" end="^\ze\s*$" end="^\ze=cut\>" contains=@NoSpell
+
+syn region podOrdinary start="^\S.*$" end="^\ze\s*$" end="^\ze=cut\>" contains=podFormat,podSpecial,@Spell
+
+" Inline textual items handled specially by POD
+syn match podSpecial "\(\<\|&\)\I\i*\(::\I\i*\)*([^)]*)" contains=@NoSpell
+syn match podSpecial "[$@%]\I\i*\(::\I\i*\)*\>" contains=@NoSpell
+
+" Special formatting sequences
+
+syn cluster podFormat contains=podFormat,podFormatError
+
+syn match podFormatError "[ADGHJKM-RT-WY]<"
+
+syn region podFormat matchgroup=podFormatDelimiter start="[IBSCLFX]<" end=">" contains=@podFormat,@NoSpell
+syn region podFormat matchgroup=podFormatDelimiter start="[IBSCLFX]<<\%(\s\+\|$\)" end="\%(\s\+\|^\)>>" contains=@podFormat,@NoSpell
+
+syn match podFormat "Z<>"
+
+syn region podFormat matchgroup=podFormatDelimiter start="E<" end=">" oneline contains=podEscape,podEscape2,@NoSpell
+
+" HTML entities {{{1
+" Source: Pod/Escapes.pm
+syn keyword podEscape contained lt gt quot amp apos sol verbar lchevron rchevron nbsp iexcl cent pound curren yen brvbar sect uml copy ordf laquo not shy reg macr deg plusmn sup2 sup3 acute micro para middot cedil sup1 ordm raquo frac14 frac12 frac34 iquest Agrave Aacute Acirc Atilde Auml Aring AElig Ccedil Egrave Eacute Ecirc Euml Igrave Iacute Icirc Iuml ETH Ntilde Ograve Oacute Ocirc Otilde Ouml times Oslash Ugrave Uacute Ucirc Uuml Yacute THORN szlig agrave aacute acirc atilde auml aring aelig ccedil egrave eacute ecirc euml igrave iacute icirc iuml eth ntilde ograve oacute ocirc otilde ouml divide oslash ugrave uacute ucirc uuml yacute thorn yuml fnof Alpha Beta Gamma Delta Epsilon Zeta Eta Theta Iota Kappa Lambda Mu Nu Xi Omicron Pi Rho Sigma Tau Upsilon Phi Chi Psi Omega alpha beta gamma delta epsilon zeta eta theta iota kappa lambda mu nu xi omicron pi rho sigmaf sigma tau upsilon phi chi psi omega thetasym upsih piv bull hellip prime Prime oline frasl weierp image real trade alefsym larr uarr rarr darr harr crarr lArr uArr rArr dArr hArr forall part exist empty nabla isin notin ni prod sum minus lowast radic prop infin ang and or cap cup int there4 sim cong asymp ne equiv le ge sub sup nsub sube supe oplus otimes perp sdot lceil rceil lfloor rfloor lang rang loz spades clubs hearts diams OElig oelig Scaron scaron Yuml circ tilde ensp emsp thinsp zwnj zwj lrm rlm ndash mdash lsquo rsquo sbquo ldquo rdquo bdquo dagger Dagger permil lsaquo rsaquo
+" }}}
+
+syn match podEscape2 "\d\+" contained contains=@NoSpell
+syn match podEscape2 "0\=x\x\+" contained contains=@NoSpell
+syn match podEscape2 "0\o\+" contained contains=@NoSpell
+
+
+" POD commands
+syn match podCommand "^=encoding\>" nextgroup=podEncoding skipwhite contains=@NoSpell
+syn match podCommand "^=head[1234]\>" nextgroup=podCmdText skipwhite skipnl contains=@NoSpell
+syn match podCommand "^=item\>" nextgroup=podCmdText skipwhite skipnl contains=@NoSpell
+syn match podCommand "^=over\>" nextgroup=podOverIndent skipwhite contains=@NoSpell
+syn match podCommand "^=back" contains=@NoSpell
+syn match podCommand "^=cut" contains=@NoSpell
+syn match podCommand "^=pod" contains=@NoSpell
+syn match podCommand "^=for" nextgroup=podForKeywd skipwhite contains=@NoSpell
+syn match podCommand "^=begin" nextgroup=podForKeywd skipwhite contains=@NoSpell
+syn match podCommand "^=end" nextgroup=podForKeywd skipwhite contains=@NoSpell
+
+" Comments
+
+syn keyword podForKeywd comment contained nextgroup=podForComment skipwhite skipnl
+
+if exists("perl_pod_no_comment_fold")
+ syn region podBeginComment start="^=begin\s\+comment\s*$" end="^=end\s\+comment\ze\s*$" keepend extend contains=podCommand
+ syn region podForComment start="\S.*$" end="^\ze\s*$" end="^\ze=cut\>" contained contains=@Spell,podTodo
+else
+ syn region podBeginComment start="^=begin\s\+comment\s*$" end="^=end\s\+comment\ze\s*$" keepend extend contains=podCommand,podTodo fold
+ syn region podForComment start="\S.*$" end="^\ze\s*$" end="^\ze=cut\>" contained contains=@Spell,podTodo fold
+endif
+
+syn keyword podTodo contained TODO FIXME XXX
+
+" Plain Pod files
+syn region podNonPod start="\%^\%(=\w\+\>\)\@!" end="^\ze=\a\w*\>"
+syn region podNonPod matchgroup=podCommand start="^=cut\>" end="\%$"
+syn region podNonPod matchgroup=podCommand start="^=cut\>" end="^\ze=\a\w*\>"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link podCommand Statement
+hi def link podBeginComment Comment
+hi def link podForComment Comment
+hi def link podNonPod Comment
+hi def link podTodo Todo
+hi def link podCmdText String
+hi def link podEncoding Constant
+hi def link podOverIndent Number
+hi def link podForKeywd Identifier
+hi def link podVerbatim PreProc
+hi def link podFormat Identifier
+hi def link podFormatDelimiter podFormat
+hi def link podFormatError Error
+hi def link podSpecial Identifier
+hi def link podEscape Constant
+hi def link podEscape2 Number
+
+if exists("perl_pod_spellcheck_headings")
+ " Spell-check headings
+ syn clear podCmdText
+ syn region podCmdText start="\S.*$" end="^\s*$" end="^\ze=cut\>" contained contains=podFormat
+endif
+
+if exists("perl_pod_formatting")
+ " By default, escapes like C<> are not checked for spelling. Remove B<>
+ " and I<> from the list of escapes.
+ syn clear podFormat
+ syn region podFormat start="[CLF]<[^<]"me=e-1 end=">" contains=@podFormat,@NoSpell
+ syn region podFormat start="[CLF]<<\%(\s\+\|$\)" end="\%(\s\+\|^\)>>" contains=@podFormat,@NoSpell
+
+ " Don't spell-check inside E<>, but ensure that the E< itself isn't
+ " marked as a spelling mistake.
+ syn region podFormat start="E<" end=">" oneline contains=podEscape,podEscape2,@NoSpell
+
+ " Z<> is a mock formatting code. Ensure Z<> on its own isn't marked as a
+ " spelling mistake.
+ syn match podFormat "Z<>" contains=podEscape,podEscape2,@NoSpell
+
+ " These are required so that whatever is *within* B<...>, I<...>, etc. is
+ " spell-checked, but not the B, I, ... itself.
+ syn match podBoldOpen "B<" contains=@NoSpell
+ syn match podItalicOpen "I<" contains=@NoSpell
+ syn match podNoSpaceOpen "S<" contains=@NoSpell
+ syn match podIndexOpen "X<" contains=@NoSpell
+
+ " Same as above but for the << >> syntax.
+ syn match podBoldAlternativeDelimOpen "B<<\%(\s\+\|$\)" contains=@NoSpell
+ syn match podItalicAlternativeDelimOpen "I<<\%(\s\+\|$\)" contains=@NoSpell
+ syn match podNoSpaceAlternativeDelimOpen "S<<\%(\s\+\|$\)" contains=@NoSpell
+ syn match podIndexAlternativeDelimOpen "X<<\%(\s\+\|$\)" contains=@NoSpell
+
+ " Add support for spell checking text inside B<>, I<>, S<> and X<>.
+ syn region podBold start="B<[^<]"me=e end=">" contains=podBoldItalic,podBoldOpen
+ syn region podBoldAlternativeDelim start="B<<\%(\s\+\|$\)" end="\%(\s\+\|^\)>>" contains=podBoldAlternativeDelimOpen
+
+ syn region podItalic start="I<[^<]"me=e end=">" contains=podItalicBold,podItalicOpen
+ syn region podItalicAlternativeDelim start="I<<\%(\s\+\|$\)" end="\%(\s\+\|^\)>>" contains=podItalicAlternativeDelimOpen
+
+ " Nested bold/italic and vice-versa
+ syn region podBoldItalic contained start="I<[^<]"me=e end=">"
+ syn region podItalicBold contained start="B<[^<]"me=e end=">"
+
+ syn region podNoSpace start="S<[^<]"ms=s-2 end=">"me=e contains=podNoSpaceOpen
+ syn region podNoSpaceAlternativeDelim start="S<<\%(\s\+\|$\)"ms=s-2 end="\%(\s\+\|^\)>>"me=e contains=podNoSpaceAlternativeDelimOpen
+
+ syn region podIndex start="X<[^<]"ms=s-2 end=">"me=e contains=podIndexOpen
+ syn region podIndexAlternativeDelim start="X<<\%(\s\+\|$\)"ms=s-2 end="\%(\s\+\|^\)>>"me=e contains=podIndexAlternativeDelimOpen
+
+ " Restore this (otherwise B<> is shown as bold inside verbatim)
+ syn region podVerbatim start="^\s\+\S.*$" end="^\ze\s*$" end="^\ze=cut\>" contains=@NoSpell
+
+ " Ensure formatted text can be displayed in headings and items
+ syn clear podCmdText
+
+ if exists("perl_pod_spellcheck_headings")
+ syn match podCmdText ".*$" contained contains=@podFormat,podBold,
+ \podBoldAlternativeDelim,podItalic,podItalicAlternativeDelim,
+ \podBoldOpen,podItalicOpen,podBoldAlternativeDelimOpen,
+ \podItalicAlternativeDelimOpen,podNoSpaceOpen
+ else
+ syn match podCmdText ".*$" contained contains=@podFormat,podBold,
+ \podBoldAlternativeDelim,podItalic,podItalicAlternativeDelim,
+ \@NoSpell
+ endif
+
+ " Specify how to display these
+ hi def podBold term=bold cterm=bold gui=bold
+
+ hi link podBoldAlternativeDelim podBold
+ hi link podBoldAlternativeDelimOpen podBold
+ hi link podBoldOpen podBold
+
+ hi link podNoSpace Identifier
+ hi link podNoSpaceAlternativeDelim Identifier
+
+ hi link podIndex Identifier
+ hi link podIndexAlternativeDelim Identifier
+
+ hi def podItalic term=italic cterm=italic gui=italic
+
+ hi link podItalicAlternativeDelim podItalic
+ hi link podItalicAlternativeDelimOpen podItalic
+ hi link podItalicOpen podItalic
+
+ hi def podBoldItalic term=italic,bold cterm=italic,bold gui=italic,bold
+ hi def podItalicBold term=italic,bold cterm=italic,bold gui=italic,bold
+endif
+
+let b:current_syntax = "pod"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 fdm=marker:
diff --git a/runtime/syntax/poefilter.vim b/runtime/syntax/poefilter.vim
new file mode 100644
index 0000000..6561f7a
--- /dev/null
+++ b/runtime/syntax/poefilter.vim
@@ -0,0 +1,167 @@
+" Vim syntax file
+" Language: PoE item filter
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: *.filter
+" Last Change: 2023 Feb 10
+
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpoptions
+set cpoptions&vim
+
+" Comment
+syn keyword poefilterTodo TODO NOTE XXX contained
+syn match poefilterCommentTag /\[[0-9A-Z\[\]]\+\]/ contained
+syn match poefilterComment /#.*$/ contains=poefilterTodo,poefilterCommentTag,@Spell
+
+" Blocks
+syn keyword poefilterBlock Show Hide Minimal
+
+" Conditions
+syn keyword poefilterCondition
+ \ AlternateQuality
+ \ AnyEnchantment
+ \ BlightedMap
+ \ Corrupted
+ \ ElderItem
+ \ ElderMap
+ \ FracturedItem
+ \ Identified
+ \ Mirrored
+ \ Replica
+ \ Scourged
+ \ ShapedMap
+ \ ShaperItem
+ \ SynthesisedItem
+ \ UberBlightedMap
+ \ skipwhite nextgroup=poefilterBoolean
+syn keyword poefilterCondition
+ \ ArchnemesisMod
+ \ BaseType
+ \ Class
+ \ EnchantmentPassiveNode
+ \ HasEnchantment
+ \ HasExplicitMod
+ \ ItemLevel
+ \ SocketGroup
+ \ Sockets
+ \ skipwhite nextgroup=poefilterOperator,poefilterString
+syn keyword poefilterCondition
+ \ AreaLevel
+ \ BaseArmour
+ \ BaseDefencePercentile
+ \ BaseEnergyShield
+ \ BaseEvasion
+ \ BaseWard
+ \ CorruptedMods
+ \ DropLevel
+ \ EnchantmentPassiveNum
+ \ GemLevel
+ \ HasEaterOfWorldsImplicit
+ \ HasSearingExarchImplicit
+ \ Height
+ \ LinkedSockets
+ \ MapTier
+ \ Quality
+ \ StackSize
+ \ Width
+ \ skipwhite nextgroup=poefilterOperator,poefilterNumber
+syn keyword poefilterCondition
+ \ GemQualityType
+ \ skipwhite nextgroup=poefilterString,poefilterQuality
+syn keyword poefilterCondition
+ \ HasInfluence
+ \ skipwhite nextgroup=poefilterString,poefilterInfluence
+syn keyword poefilterCondition
+ \ Rarity
+ \ skipwhite nextgroup=poefilterString,poefilterRarity
+
+" Actions
+syn keyword poefilterAction
+ \ PlayAlertSound
+ \ PlayAlertSoundPositional
+ \ skipwhite nextgroup=poefilterNumber,poefilterDisable
+syn keyword poefilterAction
+ \ CustomAlertSound
+ \ CustomAlertSoundOptional
+ \ skipwhite nextgroup=poefilterString
+syn keyword poefilterAction
+ \ DisableDropSound
+ \ EnableDropSound
+ \ DisableDropSoundIfAlertSound
+ \ EnableDropSoundIfAlertSound
+ \ skipwhite nextgroup=poefilterBoolean
+syn keyword poefilterAction
+ \ MinimapIcon
+ \ SetBackgroundColor
+ \ SetBorderColor
+ \ SetFontSize
+ \ SetTextColor
+ \ skipwhite nextgroup=poefilterNumber
+syn keyword poefilterAction
+ \ PlayEffect
+ \ skipwhite nextgroup=poefilterColour
+
+" Operators
+syn match poefilterOperator /!\|[<>=]=\?/ contained
+ \ skipwhite nextgroup=poefilterString,poefilterNumber,
+ \ poefilterQuality,poefilterRarity,poefilterInfluence
+
+" Arguments
+syn match poefilterString /[-a-zA-Z0-9:,']/ contained contains=@Spell
+ \ skipwhite nextgroup=poefilterString,poefilterNumber,
+ \ poefilterQuality,poefilterRarity,poefilterInfluence
+syn region poefilterString matchgroup=poefilterQuote keepend
+ \ start=/"/ end=/"/ concealends contained contains=@Spell
+ \ skipwhite nextgroup=poefilterString,poefilterNumber,
+ \ poefilterQuality,poefilterRarity,poefilterInfluence
+syn match poefilterNumber /-1\|0\|[1-9][0-9]*/ contained
+ \ skipwhite nextgroup=poefilterString,poefilterNumber,
+ \ poefilterQuality,poefilterRarity,poefilterInfluence,poefilterColour
+syn keyword poefilterBoolean True False contained
+
+" Special arguments (conditions)
+syn keyword poefilterQuality Superior Divergent Anomalous Phantasmal
+ \ contained skipwhite nextgroup=poefilterString,poefilterQuality
+syn keyword poefilterRarity Normal Magic Rare Unique
+ \ contained skipwhite nextgroup=poefilterString,poefilterRarity
+syn keyword poefilterInfluence Shaper Elder
+ \ Crusader Hunter Redeemer Warlord None
+ \ contained skipwhite nextgroup=poefilterString,poefilterInfluence
+
+" Special arguments (actions)
+syn keyword poefilterColour Red Green Blue Brown
+ \ White Yellow Cyan Grey Orange Pink Purple
+ \ contained skipwhite nextgroup=poefilterShape,poefilterTemp
+syn keyword poefilterShape Circle Diamond Hecagon Square Star Triangle
+ \ Cross Moon Raindrop Kite Pentagon UpsideDownHouse contained
+syn keyword poefilterDisable None contained
+syn keyword poefilterTemp Temp contained
+
+" Colours
+
+hi def link poefilterAction Statement
+hi def link poefilterBlock Structure
+hi def link poefilterBoolean Boolean
+hi def link poefilterColour Special
+hi def link poefilterComment Comment
+hi def link poefilterCommentTag SpecialComment
+hi def link poefilterCondition Conditional
+hi def link poefilterDisable Constant
+hi def link poefilterInfluence Special
+hi def link poefilterNumber Number
+hi def link poefilterOperator Operator
+hi def link poefilterQuality Special
+hi def link poefilterQuote Delimiter
+hi def link poefilterRarity Special
+hi def link poefilterShape Special
+hi def link poefilterString String
+hi def link poefilterTemp StorageClass
+hi def link poefilterTodo Todo
+
+let b:current_syntax = 'poefilter'
+
+let &cpoptions = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/poke.vim b/runtime/syntax/poke.vim
new file mode 100644
index 0000000..4a07a77
--- /dev/null
+++ b/runtime/syntax/poke.vim
@@ -0,0 +1,151 @@
+" Copyright (C) 2021 Matthew T. Ihlenfield.
+"
+" This program is free software: you can redistribute it and/or modify
+" it under the terms of the GNU General Public License as published by
+" the Free Software Foundation, either version 3 of the License, or
+" (at your option) any later version.
+"
+" This program 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 General Public License for more details.
+"
+" You should have received a copy of the GNU General Public License
+" along with this program. If not, see <http://www.gnu.org/licenses/>.
+"
+" Vim syntax file
+" Language: Poke
+" Maintainer: Matt Ihlenfield <mtihlenfield@protonmail.com>
+" Filenames: *.pk
+" Latest Revision: 10 March 2021
+
+if exists('b:current_syntax')
+ finish
+endif
+
+" Poke statement
+syn keyword pokeStatement assert break continue return
+syn keyword pokeStatement type unit fun method nextgroup=pokeFunction skipwhite
+syn keyword pokeStatement var nextgroup=pokeVar skipWhite
+
+" Identifiers
+syn match pokeVar '\h\w*' display contained
+
+" User defined functions
+syn match pokeFunction '\h\w*' display contained
+
+" Poke operators
+syn keyword pokeOperator in sizeof as isa unmap
+
+" Conditionals
+syn keyword pokeConditional if else where
+
+" Structures, unions, etc...
+syn keyword pokeStructure struct union pinned
+
+" Loops
+syn keyword pokeRepeat while for
+
+" Imports
+syn keyword pokeLoad load
+
+" Exceptions
+syn keyword pokeException try catch until raise
+
+" Exception types
+syn keyword pokeExceptionType Exception E_generic E_out_of_bounds
+syn keyword pokeExceptionType E_eof E_elem E_constraint
+syn keyword pokeExceptionType E_conv E_map_bounds E_map
+syn keyword pokeExceptionType E_div_by_zero E_no_ios E_no_return
+syn keyword pokeExceptionType E_io E_io_flags E_assert E_overflow
+
+" Exception codes
+syn keyword pokeExceptionCode EC_generic EC_out_of_bounds
+syn keyword pokeExceptionCode EC_eof EC_elem EC_constraint
+syn keyword pokeExceptionCode EC_conv EC_map_bounds EC_map
+syn keyword pokeExceptionCode EC_div_by_zero EC_no_ios EC_no_return
+syn keyword pokeExceptionCode EC_io EC_io_flags EC_assert EC_overflow
+
+" Poke builtin types
+syn keyword pokeBuiltinType string void int uint bit nibble
+syn keyword pokeBuiltinType byte char ushort short ulong long
+syn keyword pokeBuiltinType uint8 uint16 uint32 uint64
+syn keyword pokeBuiltinType off64 uoff64 offset
+syn keyword pokeBuiltinType Comparator POSIX_Time32 POSIX_Time64
+syn keyword pokeBuiltinType big little any
+
+" Poke constants
+syn keyword pokeConstant ENDIAN_LITTLE ENDIAN_BIG
+syn keyword pokeConstant IOS_F_READ IOS_F_WRITE IOS_F_TRUNCATE IOS_F_CREATE
+syn keyword pokeConstant IOS_M_RDONLY IOS_M_WRONLY IOS_M_RDWR
+syn keyword pokeConstant load_path NULL OFFSET
+
+" Poke std lib
+syn keyword pokeBuiltinFunction print printf catos stoca atoi ltos reverse
+syn keyword pokeBuiltinFunction ltrim rtrim strchr qsort crc32 alignto
+syn keyword pokeBuiltinFunction open close flush get_ios set_ios iosize
+syn keyword pokeBuiltinFunction rand get_endian set_endian strace exit
+syn keyword pokeBuiltinFunction getenv
+
+" Formats
+
+" Special chars
+syn match pokeSpecial "\\\([nt\\]\|\o\{1,3}\)" display contained
+
+" Chars
+syn match pokeChar "'[^']*'" contains=pokeSpecial
+
+" Attributes
+syn match pokeAttribute "\h\w*'\h\w"
+
+" Strings
+syn region pokeString skip=+\\\\\|\\"+ start=+"+ end=+"+ contains=pokeSpecial
+
+" Integer literals
+syn match pokeInteger "\<\d\+_*\d*\([LlHhBbNn]\=[Uu]\=\|[Uu]\=[LlHhBbNn]\=\)\>"
+syn match pokeInteger "\<0[Xx]\x\+_*\x*\([LlHhBbNn]\=[Uu]\=\|[Uu]\=[LlHhBbNn]\=\)\>"
+syn match pokeInteger "\<0[Oo]\o\+_*\o*\([LlHhBbNn]\=[Uu]\=\|[Uu]\=[LlHhBbNn]\=\)\>"
+syn match pokeInteger "\<0[Bb][01]\+_*[01]*\([LlHhBbNn]\=[Uu]\=\|[Uu]\=[LlHhBbNn]\=\)\>"
+
+" Units
+syn keyword pokeBuiltinUnit b M B
+syn keyword pokeBuiltinUnit Kb KB Mb MB Gb GB
+syn keyword pokeBuiltinUnit Kib KiB Mib MiB Gib GiB
+
+" Offsets
+syn match pokeOffset "#\h\w*" contains=pokeBuiltinUnit
+
+" Comments
+syn keyword pokeCommentTodo TODO FIXME XXX TBD contained
+syn match pokeLineComment "\/\/.*" contains=pokeCommentTodo,@Spell extend
+syn region pokeComment start="/\*" end="\*/" contains=pokeCommentTodo,@Spell fold extend
+
+" Allow folding of blocks
+syn region pokeBlock start="{" end="}" transparent fold
+
+" Highlight groups
+hi def link pokeBuiltinFunction Function
+hi def link pokeBuiltinType Type
+hi def link pokeBuiltinUnit Keyword
+hi def link pokeChar Character
+hi def link pokeComment Comment
+hi def link pokeCommentTodo Todo
+hi def link pokeConditional Conditional
+hi def link pokeConstant Constant
+hi def link pokeException Exception
+hi def link pokeExceptionCode Constant
+hi def link pokeExceptionType Type
+hi def link pokeFunction Function
+hi def link pokeInteger Number
+hi def link pokeLineComment Comment
+hi def link pokeLoad Include
+hi def link pokeOffset StorageClass
+hi def link pokeOperator Operator
+hi def link pokeSpecial SpecialChar
+hi def link pokeStatement Statement
+hi def link pokeString String
+hi def link pokeStructure Structure
+hi def link pokeRepeat Repeat
+hi def link pokeVar Identifier
+
+let b:current_syntax = 'poke'
diff --git a/runtime/syntax/postscr.vim b/runtime/syntax/postscr.vim
new file mode 100644
index 0000000..5af57aa
--- /dev/null
+++ b/runtime/syntax/postscr.vim
@@ -0,0 +1,780 @@
+" Vim syntax file
+" Language: PostScript - all Levels, selectable
+" Maintainer: Mike Williams <mrw@eandem.co.uk>
+" Filenames: *.ps,*.eps
+" Last Change: 31st October 2007
+" URL: http://www.eandem.co.uk/mrw/vim
+"
+" Options Flags:
+" postscr_level - language level to use for highlighting (1, 2, or 3)
+" postscr_display - include display PS operators
+" postscr_ghostscript - include GS extensions
+" postscr_fonts - highlight standard font names (a lot for PS 3)
+" postscr_encodings - highlight encoding names (there are a lot)
+" postscr_andornot_binary - highlight and, or, and not as binary operators (not logical)
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" PostScript is case sensitive
+syn case match
+
+" Keyword characters - all 7-bit ASCII bar PS delimiters and ws
+setlocal iskeyword=33-127,^(,^),^<,^>,^[,^],^{,^},^/,^%
+
+" Yer trusty old TODO highlghter!
+syn keyword postscrTodo contained TODO
+
+" Comment
+syn match postscrComment "%.*$" contains=postscrTodo,@Spell
+" DSC comment start line (NB: defines DSC level, not PS level!)
+syn match postscrDSCComment "^%!PS-Adobe-\d\+\.\d\+\s*.*$"
+" DSC comment line (no check on possible comments - another language!)
+syn match postscrDSCComment "^%%\u\+.*$" contains=@postscrString,@postscrNumber,@Spell
+" DSC continuation line (no check that previous line is DSC comment)
+syn match postscrDSCComment "^%%+ *.*$" contains=@postscrString,@postscrNumber,@Spell
+
+" Names
+syn match postscrName "\k\+"
+
+" Identifiers
+syn match postscrIdentifierError "/\{1,2}[[:space:]\[\]{}]"me=e-1
+syn match postscrIdentifier "/\{1,2}\k\+" contains=postscrConstant,postscrBoolean,postscrCustConstant
+
+" Numbers
+syn case ignore
+" In file hex data - usually complete lines
+syn match postscrHex "^[[:xdigit:]][[:xdigit:][:space:]]*$"
+"syn match postscrHex "\<\x\{2,}\>"
+" Integers
+syn match postscrInteger "\<[+-]\=\d\+\>"
+" Radix
+syn match postscrRadix "\d\+#\x\+\>"
+" Reals - upper and lower case e is allowed
+syn match postscrFloat "[+-]\=\d\+\.\>"
+syn match postscrFloat "[+-]\=\d\+\.\d*\(e[+-]\=\d\+\)\=\>"
+syn match postscrFloat "[+-]\=\.\d\+\(e[+-]\=\d\+\)\=\>"
+syn match postscrFloat "[+-]\=\d\+e[+-]\=\d\+\>"
+syn cluster postscrNumber contains=postscrInteger,postscrRadix,postscrFloat
+syn case match
+
+" Escaped characters
+syn match postscrSpecialChar contained "\\[nrtbf\\()]"
+syn match postscrSpecialCharError contained "\\[^nrtbf\\()]"he=e-1
+" Escaped octal characters
+syn match postscrSpecialChar contained "\\\o\{1,3}"
+
+" Strings
+" ASCII strings
+syn region postscrASCIIString start=+(+ end=+)+ skip=+([^)]*)+ contains=postscrSpecialChar,postscrSpecialCharError,@Spell
+syn match postscrASCIIStringError ")"
+" Hex strings
+syn match postscrHexCharError contained "[^<>[:xdigit:][:space:]]"
+syn region postscrHexString start=+<\($\|[^<]\)+ end=+>+ contains=postscrHexCharError
+syn match postscrHexString "<>"
+" ASCII85 strings
+syn match postscrASCII85CharError contained "[^<>\~!-uz[:space:]]"
+syn region postscrASCII85String start=+<\~+ end=+\~>+ contains=postscrASCII85CharError
+syn cluster postscrString contains=postscrASCIIString,postscrHexString,postscrASCII85String
+
+
+" Set default highlighting to level 2 - most common at the moment
+if !exists("postscr_level")
+ let postscr_level = 2
+endif
+
+
+" PS level 1 operators - common to all levels (well ...)
+
+" Stack operators
+syn keyword postscrOperator pop exch dup copy index roll clear count mark cleartomark counttomark
+
+" Math operators
+syn keyword postscrMathOperator add div idiv mod mul sub abs neg ceiling floor round truncate sqrt atan cos
+syn keyword postscrMathOperator sin exp ln log rand srand rrand
+
+" Array operators
+syn match postscrOperator "[\[\]{}]"
+syn keyword postscrOperator array length get put getinterval putinterval astore aload copy
+syn keyword postscrRepeat forall
+
+" Dictionary operators
+syn keyword postscrOperator dict maxlength begin end def load store known where currentdict
+syn keyword postscrOperator countdictstack dictstack cleardictstack internaldict
+syn keyword postscrConstant $error systemdict userdict statusdict errordict
+
+" String operators
+syn keyword postscrOperator string anchorsearch search token
+
+" Logic operators
+syn keyword postscrLogicalOperator eq ne ge gt le lt and not or
+if exists("postscr_andornot_binaryop")
+ syn keyword postscrBinaryOperator and or not
+else
+ syn keyword postscrLogicalOperator and not or
+endif
+syn keyword postscrBinaryOperator xor bitshift
+syn keyword postscrBoolean true false
+
+" PS Type names
+syn keyword postscrConstant arraytype booleantype conditiontype dicttype filetype fonttype gstatetype
+syn keyword postscrConstant integertype locktype marktype nametype nulltype operatortype
+syn keyword postscrConstant packedarraytype realtype savetype stringtype
+
+" Control operators
+syn keyword postscrConditional if ifelse
+syn keyword postscrRepeat for repeat loop
+syn keyword postscrOperator exec exit stop stopped countexecstack execstack quit
+syn keyword postscrProcedure start
+
+" Object operators
+syn keyword postscrOperator type cvlit cvx xcheck executeonly noaccess readonly rcheck wcheck cvi cvn cvr
+syn keyword postscrOperator cvrs cvs
+
+" File operators
+syn keyword postscrOperator file closefile read write readhexstring writehexstring readstring writestring
+syn keyword postscrOperator bytesavailable flush flushfile resetfile status run currentfile print
+syn keyword postscrOperator stack pstack readline deletefile setfileposition fileposition renamefile
+syn keyword postscrRepeat filenameforall
+syn keyword postscrProcedure = ==
+
+" VM operators
+syn keyword postscrOperator save restore
+
+" Misc operators
+syn keyword postscrOperator bind null usertime executive echo realtime
+syn keyword postscrConstant product revision serialnumber version
+syn keyword postscrProcedure prompt
+
+" GState operators
+syn keyword postscrOperator gsave grestore grestoreall initgraphics setlinewidth setlinecap currentgray
+syn keyword postscrOperator currentlinejoin setmiterlimit currentmiterlimit setdash currentdash setgray
+syn keyword postscrOperator sethsbcolor currenthsbcolor setrgbcolor currentrgbcolor currentlinewidth
+syn keyword postscrOperator currentlinecap setlinejoin setcmykcolor currentcmykcolor
+
+" Device gstate operators
+syn keyword postscrOperator setscreen currentscreen settransfer currenttransfer setflat currentflat
+syn keyword postscrOperator currentblackgeneration setblackgeneration setundercolorremoval
+syn keyword postscrOperator setcolorscreen currentcolorscreen setcolortransfer currentcolortransfer
+syn keyword postscrOperator currentundercolorremoval
+
+" Matrix operators
+syn keyword postscrOperator matrix initmatrix identmatrix defaultmatrix currentmatrix setmatrix translate
+syn keyword postscrOperator concat concatmatrix transform dtransform itransform idtransform invertmatrix
+syn keyword postscrOperator scale rotate
+
+" Path operators
+syn keyword postscrOperator newpath currentpoint moveto rmoveto lineto rlineto arc arcn arcto curveto
+syn keyword postscrOperator closepath flattenpath reversepath strokepath charpath clippath pathbbox
+syn keyword postscrOperator initclip clip eoclip rcurveto
+syn keyword postscrRepeat pathforall
+
+" Painting operators
+syn keyword postscrOperator erasepage fill eofill stroke image imagemask colorimage
+
+" Device operators
+syn keyword postscrOperator showpage copypage nulldevice
+
+" Character operators
+syn keyword postscrProcedure findfont
+syn keyword postscrConstant FontDirectory ISOLatin1Encoding StandardEncoding
+syn keyword postscrOperator definefont scalefont makefont setfont currentfont show ashow
+syn keyword postscrOperator stringwidth kshow setcachedevice
+syn keyword postscrOperator setcharwidth widthshow awidthshow findencoding cshow rootfont setcachedevice2
+
+" Interpreter operators
+syn keyword postscrOperator vmstatus cachestatus setcachelimit
+
+" PS constants
+syn keyword postscrConstant contained Gray Red Green Blue All None DeviceGray DeviceRGB
+
+" PS Filters
+syn keyword postscrConstant contained ASCIIHexDecode ASCIIHexEncode ASCII85Decode ASCII85Encode LZWDecode
+syn keyword postscrConstant contained RunLengthDecode RunLengthEncode SubFileDecode NullEncode
+syn keyword postscrConstant contained GIFDecode PNGDecode LZWEncode
+
+" PS JPEG filter dictionary entries
+syn keyword postscrConstant contained DCTEncode DCTDecode Colors HSamples VSamples QuantTables QFactor
+syn keyword postscrConstant contained HuffTables ColorTransform
+
+" PS CCITT filter dictionary entries
+syn keyword postscrConstant contained CCITTFaxEncode CCITTFaxDecode Uncompressed K EndOfLine
+syn keyword postscrConstant contained Columns Rows EndOfBlock Blacks1 DamagedRowsBeforeError
+syn keyword postscrConstant contained EncodedByteAlign
+
+" PS Form dictionary entries
+syn keyword postscrConstant contained FormType XUID BBox Matrix PaintProc Implementation
+
+" PS Errors
+syn keyword postscrProcedure handleerror
+syn keyword postscrConstant contained configurationerror dictfull dictstackunderflow dictstackoverflow
+syn keyword postscrConstant contained execstackoverflow interrupt invalidaccess
+syn keyword postscrConstant contained invalidcontext invalidexit invalidfileaccess invalidfont
+syn keyword postscrConstant contained invalidid invalidrestore ioerror limitcheck nocurrentpoint
+syn keyword postscrConstant contained rangecheck stackoverflow stackunderflow syntaxerror timeout
+syn keyword postscrConstant contained typecheck undefined undefinedfilename undefinedresource
+syn keyword postscrConstant contained undefinedresult unmatchedmark unregistered VMerror
+
+if exists("postscr_fonts")
+" Font names
+ syn keyword postscrConstant contained Symbol Times-Roman Times-Italic Times-Bold Times-BoldItalic
+ syn keyword postscrConstant contained Helvetica Helvetica-Oblique Helvetica-Bold Helvetica-BoldOblique
+ syn keyword postscrConstant contained Courier Courier-Oblique Courier-Bold Courier-BoldOblique
+endif
+
+
+if exists("postscr_display")
+" Display PS only operators
+ syn keyword postscrOperator currentcontext fork join detach lock monitor condition wait notify yield
+ syn keyword postscrOperator viewclip eoviewclip rectviewclip initviewclip viewclippath deviceinfo
+ syn keyword postscrOperator sethalftonephase currenthalftonephase wtranslation defineusername
+endif
+
+" PS Character encoding names
+if exists("postscr_encodings")
+" Common encoding names
+ syn keyword postscrConstant contained .notdef
+
+" Standard and ISO encoding names
+ syn keyword postscrConstant contained space exclam quotedbl numbersign dollar percent ampersand quoteright
+ syn keyword postscrConstant contained parenleft parenright asterisk plus comma hyphen period slash zero
+ syn keyword postscrConstant contained one two three four five six seven eight nine colon semicolon less
+ syn keyword postscrConstant contained equal greater question at
+ syn keyword postscrConstant contained bracketleft backslash bracketright asciicircum underscore quoteleft
+ syn keyword postscrConstant contained braceleft bar braceright asciitilde
+ syn keyword postscrConstant contained exclamdown cent sterling fraction yen florin section currency
+ syn keyword postscrConstant contained quotesingle quotedblleft guillemotleft guilsinglleft guilsinglright
+ syn keyword postscrConstant contained fi fl endash dagger daggerdbl periodcentered paragraph bullet
+ syn keyword postscrConstant contained quotesinglbase quotedblbase quotedblright guillemotright ellipsis
+ syn keyword postscrConstant contained perthousand questiondown grave acute circumflex tilde macron breve
+ syn keyword postscrConstant contained dotaccent dieresis ring cedilla hungarumlaut ogonek caron emdash
+ syn keyword postscrConstant contained AE ordfeminine Lslash Oslash OE ordmasculine ae dotlessi lslash
+ syn keyword postscrConstant contained oslash oe germandbls
+" The following are valid names, but are used as short procedure names in generated PS!
+" 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
+
+" Symbol encoding names
+ syn keyword postscrConstant contained universal existential suchthat asteriskmath minus
+ syn keyword postscrConstant contained congruent Alpha Beta Chi Delta Epsilon Phi Gamma Eta Iota theta1
+ syn keyword postscrConstant contained Kappa Lambda Mu Nu Omicron Pi Theta Rho Sigma Tau Upsilon sigma1
+ syn keyword postscrConstant contained Omega Xi Psi Zeta therefore perpendicular
+ syn keyword postscrConstant contained radicalex alpha beta chi delta epsilon phi gamma eta iota phi1
+ syn keyword postscrConstant contained kappa lambda mu nu omicron pi theta rho sigma tau upsilon omega1
+ syn keyword postscrConstant contained Upsilon1 minute lessequal infinity club diamond heart spade
+ syn keyword postscrConstant contained arrowboth arrowleft arrowup arrowright arrowdown degree plusminus
+ syn keyword postscrConstant contained second greaterequal multiply proportional partialdiff divide
+ syn keyword postscrConstant contained notequal equivalence approxequal arrowvertex arrowhorizex
+ syn keyword postscrConstant contained aleph Ifraktur Rfraktur weierstrass circlemultiply circleplus
+ syn keyword postscrConstant contained emptyset intersection union propersuperset reflexsuperset notsubset
+ syn keyword postscrConstant contained propersubset reflexsubset element notelement angle gradient
+ syn keyword postscrConstant contained registerserif copyrightserif trademarkserif radical dotmath
+ syn keyword postscrConstant contained logicalnot logicaland logicalor arrowdblboth arrowdblleft arrowdblup
+ syn keyword postscrConstant contained arrowdblright arrowdbldown omega xi psi zeta similar carriagereturn
+ syn keyword postscrConstant contained lozenge angleleft registersans copyrightsans trademarksans summation
+ syn keyword postscrConstant contained parenlefttp parenleftex parenleftbt bracketlefttp bracketleftex
+ syn keyword postscrConstant contained bracketleftbt bracelefttp braceleftmid braceleftbt braceex euro
+ syn keyword postscrConstant contained angleright integral integraltp integralex integralbt parenrighttp
+ syn keyword postscrConstant contained parenrightex parenrightbt bracketrighttp bracketrightex
+ syn keyword postscrConstant contained bracketrightbt bracerighttp bracerightmid bracerightbt
+
+" ISO Latin1 encoding names
+ syn keyword postscrConstant contained brokenbar copyright registered twosuperior threesuperior
+ syn keyword postscrConstant contained onesuperior onequarter onehalf threequarters
+ syn keyword postscrConstant contained Agrave Aacute Acircumflex Atilde Adieresis Aring Ccedilla Egrave
+ syn keyword postscrConstant contained Eacute Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis
+ syn keyword postscrConstant contained Eth Ntilde Ograve Oacute Ocircumflex Otilde Odieresis Ugrave Uacute
+ syn keyword postscrConstant contained Ucircumflex Udieresis Yacute Thorn
+ syn keyword postscrConstant contained agrave aacute acircumflex atilde adieresis aring ccedilla egrave
+ syn keyword postscrConstant contained eacute ecircumflex edieresis igrave iacute icircumflex idieresis
+ syn keyword postscrConstant contained eth ntilde ograve oacute ocircumflex otilde odieresis ugrave uacute
+ syn keyword postscrConstant contained ucircumflex udieresis yacute thorn ydieresis
+ syn keyword postscrConstant contained zcaron exclamsmall Hungarumlautsmall dollaroldstyle dollarsuperior
+ syn keyword postscrConstant contained ampersandsmall Acutesmall parenleftsuperior parenrightsuperior
+ syn keyword postscrConstant contained twodotenleader onedotenleader zerooldstyle oneoldstyle twooldstyle
+ syn keyword postscrConstant contained threeoldstyle fouroldstyle fiveoldstyle sixoldstyle sevenoldstyle
+ syn keyword postscrConstant contained eightoldstyle nineoldstyle commasuperior
+ syn keyword postscrConstant contained threequartersemdash periodsuperior questionsmall asuperior bsuperior
+ syn keyword postscrConstant contained centsuperior dsuperior esuperior isuperior lsuperior msuperior
+ syn keyword postscrConstant contained nsuperior osuperior rsuperior ssuperior tsuperior ff ffi ffl
+ syn keyword postscrConstant contained parenleftinferior parenrightinferior Circumflexsmall hyphensuperior
+ syn keyword postscrConstant contained Gravesmall Asmall Bsmall Csmall Dsmall Esmall Fsmall Gsmall Hsmall
+ syn keyword postscrConstant contained Ismall Jsmall Ksmall Lsmall Msmall Nsmall Osmall Psmall Qsmall
+ syn keyword postscrConstant contained Rsmall Ssmall Tsmall Usmall Vsmall Wsmall Xsmall Ysmall Zsmall
+ syn keyword postscrConstant contained colonmonetary onefitted rupiah Tildesmall exclamdownsmall
+ syn keyword postscrConstant contained centoldstyle Lslashsmall Scaronsmall Zcaronsmall Dieresissmall
+ syn keyword postscrConstant contained Brevesmall Caronsmall Dotaccentsmall Macronsmall figuredash
+ syn keyword postscrConstant contained hypheninferior Ogoneksmall Ringsmall Cedillasmall questiondownsmall
+ syn keyword postscrConstant contained oneeighth threeeighths fiveeighths seveneighths onethird twothirds
+ syn keyword postscrConstant contained zerosuperior foursuperior fivesuperior sixsuperior sevensuperior
+ syn keyword postscrConstant contained eightsuperior ninesuperior zeroinferior oneinferior twoinferior
+ syn keyword postscrConstant contained threeinferior fourinferior fiveinferior sixinferior seveninferior
+ syn keyword postscrConstant contained eightinferior nineinferior centinferior dollarinferior periodinferior
+ syn keyword postscrConstant contained commainferior Agravesmall Aacutesmall Acircumflexsmall
+ syn keyword postscrConstant contained Atildesmall Adieresissmall Aringsmall AEsmall Ccedillasmall
+ syn keyword postscrConstant contained Egravesmall Eacutesmall Ecircumflexsmall Edieresissmall Igravesmall
+ syn keyword postscrConstant contained Iacutesmall Icircumflexsmall Idieresissmall Ethsmall Ntildesmall
+ syn keyword postscrConstant contained Ogravesmall Oacutesmall Ocircumflexsmall Otildesmall Odieresissmall
+ syn keyword postscrConstant contained OEsmall Oslashsmall Ugravesmall Uacutesmall Ucircumflexsmall
+ syn keyword postscrConstant contained Udieresissmall Yacutesmall Thornsmall Ydieresissmall Black Bold Book
+ syn keyword postscrConstant contained Light Medium Regular Roman Semibold
+
+" Sundry standard and expert encoding names
+ syn keyword postscrConstant contained trademark Scaron Ydieresis Zcaron scaron softhyphen overscore
+ syn keyword postscrConstant contained graybox Sacute Tcaron Zacute sacute tcaron zacute Aogonek Scedilla
+ syn keyword postscrConstant contained Zdotaccent aogonek scedilla Lcaron lcaron zdotaccent Racute Abreve
+ syn keyword postscrConstant contained Lacute Cacute Ccaron Eogonek Ecaron Dcaron Dcroat Nacute Ncaron
+ syn keyword postscrConstant contained Ohungarumlaut Rcaron Uring Uhungarumlaut Tcommaaccent racute abreve
+ syn keyword postscrConstant contained lacute cacute ccaron eogonek ecaron dcaron dcroat nacute ncaron
+ syn keyword postscrConstant contained ohungarumlaut rcaron uring uhungarumlaut tcommaaccent Gbreve
+ syn keyword postscrConstant contained Idotaccent gbreve blank apple
+endif
+
+
+" By default level 3 includes all level 2 operators
+if postscr_level == 2 || postscr_level == 3
+" Dictionary operators
+ syn match postscrL2Operator "\(<<\|>>\)"
+ syn keyword postscrL2Operator undef
+ syn keyword postscrConstant globaldict shareddict
+
+" Device operators
+ syn keyword postscrL2Operator setpagedevice currentpagedevice
+
+" Path operators
+ syn keyword postscrL2Operator rectclip setbbox uappend ucache upath ustrokepath arct
+
+" Painting operators
+ syn keyword postscrL2Operator rectfill rectstroke ufill ueofill ustroke
+
+" Array operators
+ syn keyword postscrL2Operator currentpacking setpacking packedarray
+
+" Misc operators
+ syn keyword postscrL2Operator languagelevel
+
+" Insideness operators
+ syn keyword postscrL2Operator infill ineofill instroke inufill inueofill inustroke
+
+" GState operators
+ syn keyword postscrL2Operator gstate setgstate currentgstate setcolor
+ syn keyword postscrL2Operator setcolorspace currentcolorspace setstrokeadjust currentstrokeadjust
+ syn keyword postscrL2Operator currentcolor
+
+" Device gstate operators
+ syn keyword postscrL2Operator sethalftone currenthalftone setoverprint currentoverprint
+ syn keyword postscrL2Operator setcolorrendering currentcolorrendering
+
+" Character operators
+ syn keyword postscrL2Constant GlobalFontDirectory SharedFontDirectory
+ syn keyword postscrL2Operator glyphshow selectfont
+ syn keyword postscrL2Operator addglyph undefinefont xshow xyshow yshow
+
+" Pattern operators
+ syn keyword postscrL2Operator makepattern setpattern execform
+
+" Resource operators
+ syn keyword postscrL2Operator defineresource undefineresource findresource resourcestatus
+ syn keyword postscrL2Repeat resourceforall
+
+" File operators
+ syn keyword postscrL2Operator filter printobject writeobject setobjectformat currentobjectformat
+
+" VM operators
+ syn keyword postscrL2Operator currentshared setshared defineuserobject execuserobject undefineuserobject
+ syn keyword postscrL2Operator gcheck scheck startjob currentglobal setglobal
+ syn keyword postscrConstant UserObjects
+
+" Interpreter operators
+ syn keyword postscrL2Operator setucacheparams setvmthreshold ucachestatus setsystemparams
+ syn keyword postscrL2Operator setuserparams currentuserparams setcacheparams currentcacheparams
+ syn keyword postscrL2Operator currentdevparams setdevparams vmreclaim currentsystemparams
+
+" PS2 constants
+ syn keyword postscrConstant contained DeviceCMYK Pattern Indexed Separation Cyan Magenta Yellow Black
+ syn keyword postscrConstant contained CIEBasedA CIEBasedABC CIEBasedDEF CIEBasedDEFG
+
+" PS2 $error dictionary entries
+ syn keyword postscrConstant contained newerror errorname command errorinfo ostack estack dstack
+ syn keyword postscrConstant contained recordstacks binary
+
+" PS2 Category dictionary
+ syn keyword postscrConstant contained DefineResource UndefineResource FindResource ResourceStatus
+ syn keyword postscrConstant contained ResourceForAll Category InstanceType ResourceFileName
+
+" PS2 Category names
+ syn keyword postscrConstant contained Font Encoding Form Pattern ProcSet ColorSpace Halftone
+ syn keyword postscrConstant contained ColorRendering Filter ColorSpaceFamily Emulator IODevice
+ syn keyword postscrConstant contained ColorRenderingType FMapType FontType FormType HalftoneType
+ syn keyword postscrConstant contained ImageType PatternType Category Generic
+
+" PS2 pagedevice dictionary entries
+ syn keyword postscrConstant contained PageSize MediaColor MediaWeight MediaType InputAttributes ManualFeed
+ syn keyword postscrConstant contained OutputType OutputAttributes NumCopies Collate Duplex Tumble
+ syn keyword postscrConstant contained Separations HWResolution Margins NegativePrint MirrorPrint
+ syn keyword postscrConstant contained CutMedia AdvanceMedia AdvanceDistance ImagingBBox
+ syn keyword postscrConstant contained Policies Install BeginPage EndPage PolicyNotFound PolicyReport
+ syn keyword postscrConstant contained ManualSize OutputFaceUp Jog
+ syn keyword postscrConstant contained Bind BindDetails Booklet BookletDetails CollateDetails
+ syn keyword postscrConstant contained DeviceRenderingInfo ExitJamRecovery Fold FoldDetails Laminate
+ syn keyword postscrConstant contained ManualFeedTimeout Orientation OutputPage
+ syn keyword postscrConstant contained PostRenderingEnhance PostRenderingEnhanceDetails
+ syn keyword postscrConstant contained PreRenderingEnhance PreRenderingEnhanceDetails
+ syn keyword postscrConstant contained Signature SlipSheet Staple StapleDetails Trim
+ syn keyword postscrConstant contained ProofSet REValue PrintQuality ValuesPerColorComponent AntiAlias
+
+" PS2 PDL resource entries
+ syn keyword postscrConstant contained Selector LanguageFamily LanguageVersion
+
+" PS2 halftone dictionary entries
+ syn keyword postscrConstant contained HalftoneType HalftoneName
+ syn keyword postscrConstant contained AccurateScreens ActualAngle Xsquare Ysquare AccurateFrequency
+ syn keyword postscrConstant contained Frequency SpotFunction Angle Width Height Thresholds
+ syn keyword postscrConstant contained RedFrequency RedSpotFunction RedAngle RedWidth RedHeight
+ syn keyword postscrConstant contained GreenFrequency GreenSpotFunction GreenAngle GreenWidth GreenHeight
+ syn keyword postscrConstant contained BlueFrequency BlueSpotFunction BlueAngle BlueWidth BlueHeight
+ syn keyword postscrConstant contained GrayFrequency GrayAngle GraySpotFunction GrayWidth GrayHeight
+ syn keyword postscrConstant contained GrayThresholds BlueThresholds GreenThresholds RedThresholds
+ syn keyword postscrConstant contained TransferFunction
+
+" PS2 CSR dictionaries
+ syn keyword postscrConstant contained RangeA DecodeA MatrixA RangeABC DecodeABC MatrixABC BlackPoint
+ syn keyword postscrConstant contained RangeLMN DecodeLMN MatrixLMN WhitePoint RangeDEF DecodeDEF RangeHIJ
+ syn keyword postscrConstant contained RangeDEFG DecodeDEFG RangeHIJK Table
+
+" PS2 CRD dictionaries
+ syn keyword postscrConstant contained ColorRenderingType EncodeLMB EncodeABC RangePQR MatrixPQR
+ syn keyword postscrConstant contained AbsoluteColorimetric RelativeColorimetric Saturation Perceptual
+ syn keyword postscrConstant contained TransformPQR RenderTable
+
+" PS2 Pattern dictionary
+ syn keyword postscrConstant contained PatternType PaintType TilingType XStep YStep
+
+" PS2 Image dictionary
+ syn keyword postscrConstant contained ImageType ImageMatrix MultipleDataSources DataSource
+ syn keyword postscrConstant contained BitsPerComponent Decode Interpolate
+
+" PS2 Font dictionaries
+ syn keyword postscrConstant contained FontType FontMatrix FontName FontInfo LanguageLevel WMode Encoding
+ syn keyword postscrConstant contained UniqueID StrokeWidth Metrics Metrics2 CDevProc CharStrings Private
+ syn keyword postscrConstant contained FullName Notice version ItalicAngle isFixedPitch UnderlinePosition
+ syn keyword postscrConstant contained FMapType Encoding FDepVector PrefEnc EscChar ShiftOut ShiftIn
+ syn keyword postscrConstant contained WeightVector Blend $Blend CIDFontType sfnts CIDSystemInfo CodeMap
+ syn keyword postscrConstant contained CMap CIDFontName CIDSystemInfo UIDBase CIDDevProc CIDCount
+ syn keyword postscrConstant contained CIDMapOffset FDArray FDBytes GDBytes GlyphData GlyphDictionary
+ syn keyword postscrConstant contained SDBytes SubrMapOffset SubrCount BuildGlyph CIDMap FID MIDVector
+ syn keyword postscrConstant contained Ordering Registry Supplement CMapName CMapVersion UIDOffset
+ syn keyword postscrConstant contained SubsVector UnderlineThickness FamilyName FontBBox CurMID
+ syn keyword postscrConstant contained Weight
+
+" PS2 User parameters
+ syn keyword postscrConstant contained MaxFontItem MinFontCompress MaxUPathItem MaxFormItem MaxPatternItem
+ syn keyword postscrConstant contained MaxScreenItem MaxOpStack MaxDictStack MaxExecStack MaxLocalVM
+ syn keyword postscrConstant contained VMReclaim VMThreshold
+
+" PS2 System parameters
+ syn keyword postscrConstant contained SystemParamsPassword StartJobPassword BuildTime ByteOrder RealFormat
+ syn keyword postscrConstant contained MaxFontCache CurFontCache MaxOutlineCache CurOutlineCache
+ syn keyword postscrConstant contained MaxUPathCache CurUPathCache MaxFormCache CurFormCache
+ syn keyword postscrConstant contained MaxPatternCache CurPatternCache MaxScreenStorage CurScreenStorage
+ syn keyword postscrConstant contained MaxDisplayList CurDisplayList
+
+" PS2 LZW Filters
+ syn keyword postscrConstant contained Predictor
+
+" Paper Size operators
+ syn keyword postscrL2Operator letter lettersmall legal ledger 11x17 a4 a3 a4small b5 note
+
+" Paper Tray operators
+ syn keyword postscrL2Operator lettertray legaltray ledgertray a3tray a4tray b5tray 11x17tray
+
+" SCC compatibility operators
+ syn keyword postscrL2Operator sccbatch sccinteractive setsccbatch setsccinteractive
+
+" Page duplexing operators
+ syn keyword postscrL2Operator duplexmode firstside newsheet setduplexmode settumble tumble
+
+" Device compatibility operators
+ syn keyword postscrL2Operator devdismount devformat devmount devstatus
+ syn keyword postscrL2Repeat devforall
+
+" Imagesetter compatibility operators
+ syn keyword postscrL2Operator accuratescreens checkscreen pagemargin pageparams setaccuratescreens setpage
+ syn keyword postscrL2Operator setpagemargin setpageparams
+
+" Misc compatibility operators
+ syn keyword postscrL2Operator appletalktype buildtime byteorder checkpassword defaulttimeouts diskonline
+ syn keyword postscrL2Operator diskstatus manualfeed manualfeedtimeout margins mirrorprint pagecount
+ syn keyword postscrL2Operator pagestackorder printername processcolors sethardwareiomode setjobtimeout
+ syn keyword postscrL2Operator setpagestockorder setprintername setresolution doprinterrors dostartpage
+ syn keyword postscrL2Operator hardwareiomode initializedisk jobname jobtimeout ramsize realformat resolution
+ syn keyword postscrL2Operator setdefaulttimeouts setdoprinterrors setdostartpage setdosysstart
+ syn keyword postscrL2Operator setuserdiskpercent softwareiomode userdiskpercent waittimeout
+ syn keyword postscrL2Operator setsoftwareiomode dosysstart emulate setmargins setmirrorprint
+
+endif " PS2 highlighting
+
+if postscr_level == 3
+" Shading operators
+ syn keyword postscrL3Operator setsmoothness currentsmoothness shfill
+
+" Clip operators
+ syn keyword postscrL3Operator clipsave cliprestore
+
+" Pagedevive operators
+ syn keyword postscrL3Operator setpage setpageparams
+
+" Device gstate operators
+ syn keyword postscrL3Operator findcolorrendering
+
+" Font operators
+ syn keyword postscrL3Operator composefont
+
+" PS LL3 Output device resource entries
+ syn keyword postscrConstant contained DeviceN TrappingDetailsType
+
+" PS LL3 pagdevice dictionary entries
+ syn keyword postscrConstant contained DeferredMediaSelection ImageShift InsertSheet LeadingEdge MaxSeparations
+ syn keyword postscrConstant contained MediaClass MediaPosition OutputDevice PageDeviceName PageOffset ProcessColorModel
+ syn keyword postscrConstant contained RollFedMedia SeparationColorNames SeparationOrder Trapping TrappingDetails
+ syn keyword postscrConstant contained TraySwitch UseCIEColor
+ syn keyword postscrConstant contained ColorantDetails ColorantName ColorantType NeutralDensity TrappingOrder
+ syn keyword postscrConstant contained ColorantSetName
+
+" PS LL3 trapping dictionary entries
+ syn keyword postscrConstant contained BlackColorLimit BlackDensityLimit BlackWidth ColorantZoneDetails
+ syn keyword postscrConstant contained SlidingTrapLimit StepLimit TrapColorScaling TrapSetName TrapWidth
+ syn keyword postscrConstant contained ImageResolution ImageToObjectTrapping ImageTrapPlacement
+ syn keyword postscrConstant contained StepLimit TrapColorScaling Enabled ImageInternalTrapping
+
+" PS LL3 filters and entries
+ syn keyword postscrConstant contained ReusableStreamDecode CloseSource CloseTarget UnitSize LowBitFirst
+ syn keyword postscrConstant contained FlateEncode FlateDecode DecodeParams Intent AsyncRead
+
+" PS LL3 halftone dictionary entries
+ syn keyword postscrConstant contained Height2 Width2
+
+" PS LL3 function dictionary entries
+ syn keyword postscrConstant contained FunctionType Domain Range Order BitsPerSample Encode Size C0 C1 N
+ syn keyword postscrConstant contained Functions Bounds
+
+" PS LL3 image dictionary entries
+ syn keyword postscrConstant contained InterleaveType MaskDict DataDict MaskColor
+
+" PS LL3 Pattern and shading dictionary entries
+ syn keyword postscrConstant contained Shading ShadingType Background ColorSpace Coords Extend Function
+ syn keyword postscrConstant contained VerticesPerRow BitsPerCoordinate BitsPerFlag
+
+" PS LL3 image dictionary entries
+ syn keyword postscrConstant contained XOrigin YOrigin UnpaintedPath PixelCopy
+
+" PS LL3 colorrendering procedures
+ syn keyword postscrProcedure GetHalftoneName GetPageDeviceName GetSubstituteCRD
+
+" PS LL3 CIDInit procedures
+ syn keyword postscrProcedure beginbfchar beginbfrange begincidchar begincidrange begincmap begincodespacerange
+ syn keyword postscrProcedure beginnotdefchar beginnotdefrange beginrearrangedfont beginusematrix
+ syn keyword postscrProcedure endbfchar endbfrange endcidchar endcidrange endcmap endcodespacerange
+ syn keyword postscrProcedure endnotdefchar endnotdefrange endrearrangedfont endusematrix
+ syn keyword postscrProcedure StartData usefont usecmp
+
+" PS LL3 Trapping procedures
+ syn keyword postscrProcedure settrapparams currenttrapparams settrapzone
+
+" PS LL3 BitmapFontInit procedures
+ syn keyword postscrProcedure removeall removeglyphs
+
+" PS LL3 Font names
+ if exists("postscr_fonts")
+ syn keyword postscrConstant contained AlbertusMT AlbertusMT-Italic AlbertusMT-Light Apple-Chancery Apple-ChanceryCE
+ syn keyword postscrConstant contained AntiqueOlive-Roman AntiqueOlive-Italic AntiqueOlive-Bold AntiqueOlive-Compact
+ syn keyword postscrConstant contained AntiqueOliveCE-Roman AntiqueOliveCE-Italic AntiqueOliveCE-Bold AntiqueOliveCE-Compact
+ syn keyword postscrConstant contained ArialMT Arial-ItalicMT Arial-LightMT Arial-BoldMT Arial-BoldItalicMT
+ syn keyword postscrConstant contained ArialCE ArialCE-Italic ArialCE-Light ArialCE-Bold ArialCE-BoldItalic
+ syn keyword postscrConstant contained AvantGarde-Book AvantGarde-BookOblique AvantGarde-Demi AvantGarde-DemiOblique
+ syn keyword postscrConstant contained AvantGardeCE-Book AvantGardeCE-BookOblique AvantGardeCE-Demi AvantGardeCE-DemiOblique
+ syn keyword postscrConstant contained Bodoni Bodoni-Italic Bodoni-Bold Bodoni-BoldItalic Bodoni-Poster Bodoni-PosterCompressed
+ syn keyword postscrConstant contained BodoniCE BodoniCE-Italic BodoniCE-Bold BodoniCE-BoldItalic BodoniCE-Poster BodoniCE-PosterCompressed
+ syn keyword postscrConstant contained Bookman-Light Bookman-LightItalic Bookman-Demi Bookman-DemiItalic
+ syn keyword postscrConstant contained BookmanCE-Light BookmanCE-LightItalic BookmanCE-Demi BookmanCE-DemiItalic
+ syn keyword postscrConstant contained Carta Chicago ChicagoCE Clarendon Clarendon-Light Clarendon-Bold
+ syn keyword postscrConstant contained ClarendonCE ClarendonCE-Light ClarendonCE-Bold CooperBlack CooperBlack-Italic
+ syn keyword postscrConstant contained Copperplate-ThirtyTwoBC CopperPlate-ThirtyThreeBC Coronet-Regular CoronetCE-Regular
+ syn keyword postscrConstant contained CourierCE CourierCE-Oblique CourierCE-Bold CourierCE-BoldOblique
+ syn keyword postscrConstant contained Eurostile Eurostile-Bold Eurostile-ExtendedTwo Eurostile-BoldExtendedTwo
+ syn keyword postscrConstant contained Eurostile EurostileCE-Bold EurostileCE-ExtendedTwo EurostileCE-BoldExtendedTwo
+ syn keyword postscrConstant contained Geneva GenevaCE GillSans GillSans-Italic GillSans-Bold GillSans-BoldItalic GillSans-BoldCondensed
+ syn keyword postscrConstant contained GillSans-Light GillSans-LightItalic GillSans-ExtraBold
+ syn keyword postscrConstant contained GillSansCE-Roman GillSansCE-Italic GillSansCE-Bold GillSansCE-BoldItalic GillSansCE-BoldCondensed
+ syn keyword postscrConstant contained GillSansCE-Light GillSansCE-LightItalic GillSansCE-ExtraBold
+ syn keyword postscrConstant contained Goudy Goudy-Italic Goudy-Bold Goudy-BoldItalic Goudy-ExtraBould
+ syn keyword postscrConstant contained HelveticaCE HelveticaCE-Oblique HelveticaCE-Bold HelveticaCE-BoldOblique
+ syn keyword postscrConstant contained Helvetica-Condensed Helvetica-Condensed-Oblique Helvetica-Condensed-Bold Helvetica-Condensed-BoldObl
+ syn keyword postscrConstant contained HelveticaCE-Condensed HelveticaCE-Condensed-Oblique HelveticaCE-Condensed-Bold
+ syn keyword postscrConstant contained HelveticaCE-Condensed-BoldObl Helvetica-Narrow Helvetica-Narrow-Oblique Helvetica-Narrow-Bold
+ syn keyword postscrConstant contained Helvetica-Narrow-BoldOblique HelveticaCE-Narrow HelveticaCE-Narrow-Oblique HelveticaCE-Narrow-Bold
+ syn keyword postscrConstant contained HelveticaCE-Narrow-BoldOblique HoeflerText-Regular HoeflerText-Italic HoeflerText-Black
+ syn keyword postscrConstant contained HoeflerText-BlackItalic HoeflerText-Ornaments HoeflerTextCE-Regular HoeflerTextCE-Italic
+ syn keyword postscrConstant contained HoeflerTextCE-Black HoeflerTextCE-BlackItalic
+ syn keyword postscrConstant contained JoannaMT JoannaMT-Italic JoannaMT-Bold JoannaMT-BoldItalic
+ syn keyword postscrConstant contained JoannaMTCE JoannaMTCE-Italic JoannaMTCE-Bold JoannaMTCE-BoldItalic
+ syn keyword postscrConstant contained LetterGothic LetterGothic-Slanted LetterGothic-Bold LetterGothic-BoldSlanted
+ syn keyword postscrConstant contained LetterGothicCE LetterGothicCE-Slanted LetterGothicCE-Bold LetterGothicCE-BoldSlanted
+ syn keyword postscrConstant contained LubalinGraph-Book LubalinGraph-BookOblique LubalinGraph-Demi LubalinGraph-DemiOblique
+ syn keyword postscrConstant contained LubalinGraphCE-Book LubalinGraphCE-BookOblique LubalinGraphCE-Demi LubalinGraphCE-DemiOblique
+ syn keyword postscrConstant contained Marigold Monaco MonacoCE MonaLisa-Recut Oxford Symbol Tekton
+ syn keyword postscrConstant contained NewCennturySchlbk-Roman NewCenturySchlbk-Italic NewCenturySchlbk-Bold NewCenturySchlbk-BoldItalic
+ syn keyword postscrConstant contained NewCenturySchlbkCE-Roman NewCenturySchlbkCE-Italic NewCenturySchlbkCE-Bold
+ syn keyword postscrConstant contained NewCenturySchlbkCE-BoldItalic NewYork NewYorkCE
+ syn keyword postscrConstant contained Optima Optima-Italic Optima-Bold Optima-BoldItalic
+ syn keyword postscrConstant contained OptimaCE OptimaCE-Italic OptimaCE-Bold OptimaCE-BoldItalic
+ syn keyword postscrConstant contained Palatino-Roman Palatino-Italic Palatino-Bold Palatino-BoldItalic
+ syn keyword postscrConstant contained PalatinoCE-Roman PalatinoCE-Italic PalatinoCE-Bold PalatinoCE-BoldItalic
+ syn keyword postscrConstant contained StempelGaramond-Roman StempelGaramond-Italic StempelGaramond-Bold StempelGaramond-BoldItalic
+ syn keyword postscrConstant contained StempelGaramondCE-Roman StempelGaramondCE-Italic StempelGaramondCE-Bold StempelGaramondCE-BoldItalic
+ syn keyword postscrConstant contained TimesCE-Roman TimesCE-Italic TimesCE-Bold TimesCE-BoldItalic
+ syn keyword postscrConstant contained TimesNewRomanPSMT TimesNewRomanPS-ItalicMT TimesNewRomanPS-BoldMT TimesNewRomanPS-BoldItalicMT
+ syn keyword postscrConstant contained TimesNewRomanCE TimesNewRomanCE-Italic TimesNewRomanCE-Bold TimesNewRomanCE-BoldItalic
+ syn keyword postscrConstant contained Univers Univers-Oblique Univers-Bold Univers-BoldOblique
+ syn keyword postscrConstant contained UniversCE-Medium UniversCE-Oblique UniversCE-Bold UniversCE-BoldOblique
+ syn keyword postscrConstant contained Univers-Light Univers-LightOblique UniversCE-Light UniversCE-LightOblique
+ syn keyword postscrConstant contained Univers-Condensed Univers-CondensedOblique Univers-CondensedBold Univers-CondensedBoldOblique
+ syn keyword postscrConstant contained UniversCE-Condensed UniversCE-CondensedOblique UniversCE-CondensedBold UniversCE-CondensedBoldOblique
+ syn keyword postscrConstant contained Univers-Extended Univers-ExtendedObl Univers-BoldExt Univers-BoldExtObl
+ syn keyword postscrConstant contained UniversCE-Extended UniversCE-ExtendedObl UniversCE-BoldExt UniversCE-BoldExtObl
+ syn keyword postscrConstant contained Wingdings-Regular ZapfChancery-MediumItalic ZapfChanceryCE-MediumItalic ZapfDingBats
+ endif " Font names
+
+endif " PS LL3 highlighting
+
+
+if exists("postscr_ghostscript")
+ " GS gstate operators
+ syn keyword postscrGSOperator .setaccuratecurves .currentaccuratecurves .setclipoutside
+ syn keyword postscrGSOperator .setdashadapt .currentdashadapt .setdefaultmatrix .setdotlength
+ syn keyword postscrGSOperator .currentdotlength .setfilladjust2 .currentfilladjust2
+ syn keyword postscrGSOperator .currentclipoutside .setcurvejoin .currentcurvejoin
+ syn keyword postscrGSOperator .setblendmode .currentblendmode .setopacityalpha .currentopacityalpha .setshapealpha .currentshapealpha
+ syn keyword postscrGSOperator .setlimitclamp .currentlimitclamp .setoverprintmode .currentoverprintmode
+
+ " GS path operators
+ syn keyword postscrGSOperator .dashpath .rectappend
+
+ " GS painting operators
+ syn keyword postscrGSOperator .setrasterop .currentrasterop .setsourcetransparent
+ syn keyword postscrGSOperator .settexturetransparent .currenttexturetransparent
+ syn keyword postscrGSOperator .currentsourcetransparent
+
+ " GS character operators
+ syn keyword postscrGSOperator .charboxpath .type1execchar %Type1BuildChar %Type1BuildGlyph
+
+ " GS mathematical operators
+ syn keyword postscrGSMathOperator arccos arcsin
+
+ " GS dictionary operators
+ syn keyword postscrGSOperator .dicttomark .forceput .forceundef .knownget .setmaxlength
+
+ " GS byte and string operators
+ syn keyword postscrGSOperator .type1encrypt .type1decrypt
+ syn keyword postscrGSOperator .bytestring .namestring .stringmatch
+
+ " GS relational operators (seem like math ones to me!)
+ syn keyword postscrGSMathOperator max min
+
+ " GS file operators
+ syn keyword postscrGSOperator findlibfile unread writeppmfile
+ syn keyword postscrGSOperator .filename .fileposition .peekstring .unread
+
+ " GS vm operators
+ syn keyword postscrGSOperator .forgetsave
+
+ " GS device operators
+ syn keyword postscrGSOperator copydevice .getdevice makeimagedevice makewordimagedevice copyscanlines
+ syn keyword postscrGSOperator setdevice currentdevice getdeviceprops putdeviceprops flushpage
+ syn keyword postscrGSOperator finddevice findprotodevice .getbitsrect
+
+ " GS misc operators
+ syn keyword postscrGSOperator getenv .makeoperator .setdebug .oserrno .oserror .execn
+
+ " GS rendering stack operators
+ syn keyword postscrGSOperator .begintransparencygroup .discardtransparencygroup .endtransparencygroup
+ syn keyword postscrGSOperator .begintransparencymask .discardtransparencymask .endtransparencymask .inittransparencymask
+ syn keyword postscrGSOperator .settextknockout .currenttextknockout
+
+ " GS filters
+ syn keyword postscrConstant contained BCPEncode BCPDecode eexecEncode eexecDecode PCXDecode
+ syn keyword postscrConstant contained PixelDifferenceEncode PixelDifferenceDecode
+ syn keyword postscrConstant contained PNGPredictorDecode TBCPEncode TBCPDecode zlibEncode
+ syn keyword postscrConstant contained zlibDecode PNGPredictorEncode PFBDecode
+ syn keyword postscrConstant contained MD5Encode
+
+ " GS filter keys
+ syn keyword postscrConstant contained InitialCodeLength FirstBitLowOrder BlockData DecodedByteAlign
+
+ " GS device parameters
+ syn keyword postscrConstant contained BitsPerPixel .HWMargins HWSize Name GrayValues
+ syn keyword postscrConstant contained ColorValues TextAlphaBits GraphicsAlphaBits BufferSpace
+ syn keyword postscrConstant contained OpenOutputFile PageCount BandHeight BandWidth BandBufferSpace
+ syn keyword postscrConstant contained ViewerPreProcess GreenValues BlueValues OutputFile
+ syn keyword postscrConstant contained MaxBitmap RedValues
+
+endif " GhostScript highlighting
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..8595bcb
--- /dev/null
+++ b/runtime/syntax/pov.vim
@@ -0,0 +1,144 @@
+" Vim syntax file
+" Language: PoV-Ray(tm) 3.7 Scene Description Language
+" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2011-04-23
+" Required Vim Version: 6.0
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" Top level stuff
+syn keyword povCommands global_settings
+syn keyword povObjects array atmosphere background bicubic_patch blob box camera component cone cubic cylinder disc fog height_field isosurface julia_fractal lathe light_group light_source mesh mesh2 object ovus parametric pattern photons plane poly polygon polynomial prism quadric quartic rainbow sky_sphere smooth_triangle sor sphere sphere_sweep spline superellipsoid text torus triangle
+syn keyword povCSG clipped_by composite contained_by difference intersection merge union
+syn keyword povAppearance interior material media texture interior_texture texture_list
+syn keyword povGlobalSettings ambient_light assumed_gamma charset hf_gray_16 irid_wavelength max_intersections max_trace_level number_of_waves radiosity noise_generator
+syn keyword povTransform inverse matrix rotate scale translate transform
+
+" Descriptors
+syn keyword povDescriptors finish inside_vector normal pigment uv_mapping uv_vectors vertex_vectors
+syn keyword povDescriptors adc_bailout always_sample brightness count error_bound distance_maximum gray_threshold load_file low_error_factor maximum_reuse max_sample media minimum_reuse mm_per_unit nearest_count normal pretrace_end pretrace_start recursion_limit save_file
+syn keyword povDescriptors color colour rgb rgbt rgbf rgbft srgb srgbf srgbt srgbft
+syn match povDescriptors "\<\(red\|green\|blue\|gray\)\>"
+syn keyword povDescriptors bump_map color_map colour_map image_map material_map pigment_map quick_color quick_colour normal_map texture_map image_pattern pigment_pattern
+syn keyword povDescriptors ambient brilliance conserve_energy crand diffuse fresnel irid metallic phong phong_size refraction reflection reflection_exponent roughness specular subsurface
+syn keyword povDescriptors cylinder fisheye mesh_camera omnimax orthographic panoramic perspective spherical ultra_wide_angle
+syn keyword povDescriptors agate aoi average brick boxed bozo bumps cells checker crackle cylindrical dents facets function gradient granite hexagon julia leopard magnet mandel marble onion pavement planar quilted radial ripples slope spherical spiral1 spiral2 spotted square tiles tile2 tiling toroidal triangular waves wood wrinkles
+syn keyword povDescriptors density_file
+syn keyword povDescriptors area_light shadowless spotlight parallel
+syn keyword povDescriptors absorption confidence density emission intervals ratio samples scattering variance
+syn keyword povDescriptors distance fog_alt fog_offset fog_type turb_depth
+syn keyword povDescriptors b_spline bezier_spline cubic_spline evaluate face_indices form linear_spline max_gradient natural_spline normal_indices normal_vectors quadratic_spline uv_indices
+syn keyword povDescriptors target
+
+" Modifiers
+syn keyword povModifiers caustics dispersion dispersion_samples fade_color fade_colour fade_distance fade_power ior
+syn keyword povModifiers bounded_by double_illuminate hierarchy hollow no_shadow open smooth sturm threshold water_level
+syn keyword povModifiers importance no_radiosity
+syn keyword povModifiers hypercomplex max_iteration precision quaternion slice
+syn keyword povModifiers conic_sweep linear_sweep
+syn keyword povModifiers flatness type u_steps v_steps
+syn keyword povModifiers aa_level aa_threshold adaptive area_illumination falloff jitter looks_like media_attenuation media_interaction method point_at radius tightness
+syn keyword povModifiers angle aperture bokeh blur_samples confidence direction focal_point h_angle location look_at right sky up v_angle variance
+syn keyword povModifiers all bump_size gamma interpolate map_type once premultiplied slope_map use_alpha use_color use_colour use_index
+syn match povModifiers "\<\(filter\|transmit\)\>"
+syn keyword povModifiers black_hole agate_turb brick_size control0 control1 cubic_wave density_map flip frequency interpolate inverse lambda metric mortar octaves offset omega phase poly_wave ramp_wave repeat scallop_wave sine_wave size strength triangle_wave thickness turbulence turb_depth type warp
+syn keyword povModifiers eccentricity extinction
+syn keyword povModifiers arc_angle falloff_angle width
+syn keyword povModifiers accuracy all_intersections altitude autostop circular collect coords cutaway_textures dist_exp expand_thresholds exponent exterior gather global_lights major_radius max_trace no_bump_scale no_image no_reflection orient orientation pass_through precompute projected_through range_divider solid spacing split_union tolerance
+
+" Words not marked `reserved' in documentation, but...
+syn keyword povBMPType alpha exr gif hdr iff jpeg pgm png pot ppm sys tga tiff
+syn keyword povFontType ttf contained
+syn keyword povDensityType df3 contained
+syn keyword povCharset ascii utf8 contained
+
+" Math functions on floats, vectors and strings
+syn keyword povFunctions abs acos acosh asc asin asinh atan atan2 atanh bitwise_and bitwise_or bitwise_xor ceil cos cosh defined degrees dimensions dimension_size div exp file_exists floor inside int internal ln log max min mod pow prod radians rand seed select sin sinh sqrt strcmp strlen sum tan tanh val vdot vlength vstr vturbulence
+syn keyword povFunctions min_extent max_extent trace vcross vrotate vaxis_rotate vnormalize vturbulence
+syn keyword povFunctions chr concat datetime now substr str strupr strlwr
+syn keyword povJuliaFunctions acosh asinh atan cosh cube pwr reciprocal sinh sqr tanh
+
+" Specialities
+syn keyword povConsts clock clock_delta clock_on final_clock final_frame frame_number initial_clock initial_frame input_file_name image_width image_height false no off on pi true version yes
+syn match povConsts "\<[tuvxyz]\>"
+syn match povDotItem "\.\@<=\(blue\|green\|gray\|filter\|red\|transmit\|hf\|t\|u\|v\|x\|y\|z\)\>" display
+
+" Comments
+syn region povComment start="/\*" end="\*/" contains=povTodo,povComment
+syn match povComment "//.*" contains=povTodo
+syn match povCommentError "\*/"
+syn sync ccomment povComment
+syn sync minlines=50
+syn keyword povTodo TODO FIXME XXX NOT contained
+syn cluster povPRIVATE add=povTodo
+
+" Language directives
+syn match povConditionalDir "#\s*\(else\|end\|for\|if\|ifdef\|ifndef\|switch\|while\)\>"
+syn match povLabelDir "#\s*\(break\|case\|default\|range\)\>"
+syn match povDeclareDir "#\s*\(declare\|default\|local\|macro\|undef\|version\)\>" nextgroup=povDeclareOption skipwhite
+syn keyword povDeclareOption deprecated once contained nextgroup=povDeclareOption skipwhite
+syn match povIncludeDir "#\s*include\>"
+syn match povFileDir "#\s*\(fclose\|fopen\|read\|write\)\>"
+syn keyword povFileDataType uint8 sint8 unit16be uint16le sint16be sint16le sint32le sint32be
+syn match povMessageDir "#\s*\(debug\|error\|render\|statistics\|warning\)\>"
+syn region povFileOpen start="#\s*fopen\>" skip=+"[^"]*"+ matchgroup=povOpenType end="\<\(read\|write\|append\)\>" contains=ALLBUT,PovParenError,PovBraceError,@PovPRIVATE transparent keepend
+
+" Literal strings
+syn match povSpecialChar "\\u\x\{4}\|\\\d\d\d\|\\." contained
+syn region povString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=povSpecialChar oneline
+syn cluster povPRIVATE add=povSpecialChar
+
+" Catch errors caused by wrong parenthesization
+syn region povParen start='(' end=')' contains=ALLBUT,povParenError,@povPRIVATE transparent
+syn match povParenError ")"
+syn region povBrace start='{' end='}' contains=ALLBUT,povBraceError,@povPRIVATE transparent
+syn match povBraceError "}"
+
+" Numbers
+syn match povNumber "\(^\|\W\)\@<=[+-]\=\(\d\+\)\=\.\=\d\+\([eE][+-]\=\d\+\)\="
+
+" Define the default highlighting
+hi def link povComment Comment
+hi def link povTodo Todo
+hi def link povNumber Number
+hi def link povString String
+hi def link povFileOpen Constant
+hi def link povConsts Constant
+hi def link povDotItem povSpecial
+hi def link povBMPType povSpecial
+hi def link povCharset povSpecial
+hi def link povDensityType povSpecial
+hi def link povFontType povSpecial
+hi def link povOpenType povSpecial
+hi def link povSpecialChar povSpecial
+hi def link povSpecial Special
+hi def link povConditionalDir PreProc
+hi def link povLabelDir PreProc
+hi def link povDeclareDir Define
+hi def link povDeclareOption Define
+hi def link povIncludeDir Include
+hi def link povFileDir PreProc
+hi def link povFileDataType Special
+hi def link povMessageDir Debug
+hi def link povAppearance povDescriptors
+hi def link povObjects povDescriptors
+hi def link povGlobalSettings povDescriptors
+hi def link povDescriptors Type
+hi def link povJuliaFunctions PovFunctions
+hi def link povModifiers povFunctions
+hi def link povFunctions Function
+hi def link povCommands Operator
+hi def link povTransform Operator
+hi def link povCSG Operator
+hi def link povParenError povError
+hi def link povBraceError povError
+hi def link povCommentError povError
+hi def link povError Error
+
+let b:current_syntax = "pov"
diff --git a/runtime/syntax/povini.vim b/runtime/syntax/povini.vim
new file mode 100644
index 0000000..ac1f878
--- /dev/null
+++ b/runtime/syntax/povini.vim
@@ -0,0 +1,56 @@
+" Vim syntax file
+" Language: PoV-Ray(tm) 3.7 configuration/initialization files
+" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2011-04-24
+" Required Vim Version: 6.0
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Syntax
+syn match poviniInclude "^\s*[^[+-;]\S*\s*$" contains=poviniSection
+syn match poviniLabel "^.\{-1,}\ze=" transparent contains=poviniKeyword nextgroup=poviniBool,poviniNumber
+syn keyword poviniBool On Off True False Yes No
+syn match poviniNumber "\<\d*\.\=\d\+\>"
+syn keyword poviniKeyword Clock Initial_Frame Final_Frame Frame_Final Frame_Step Initial_Clock Final_Clock Subset_Start_Frame Subset_End_Frame Cyclic_Animation Clockless_Animation Real_Time_Raytracing Field_Render Odd_Field Work_Threads
+syn keyword poviniKeyword Width Height Start_Column Start_Row End_Column End_Row Test_Abort Test_Abort_Count Continue_Trace Create_Ini
+syn keyword poviniKeyword Display Video_Mode Palette Display_Gamma Pause_When_Done Verbose Draw_Vistas Preview_Start_Size Preview_End_Size Render_Block_Size Render_Block_Step Render_Pattern Max_Image_Buffer_Memory
+syn keyword poviniKeyword Output_to_File Output_File_Type Output_Alpha Bits_Per_Color Output_File_Name Buffer_Output Buffer_Size Dither Dither_Method File_Gamma
+syn keyword poviniKeyword BSP_Base BSP_Child BSP_Isect BSP_Max BSP_Miss
+syn keyword poviniKeyword Histogram_Type Histogram_Grid_Size Histogram_Name
+syn keyword poviniKeyword Input_File_Name Include_Header Library_Path Version
+syn keyword poviniKeyword Debug_Console Fatal_Console Render_Console Statistic_Console Warning_Console All_Console Debug_File Fatal_File Render_File Statistic_File Warning_File All_File Warning_Level
+syn keyword poviniKeyword Quality Bounding Bounding_Method Bounding_Threshold Light_Buffer Vista_Buffer Remove_Bounds Split_Unions Antialias Sampling_Method Antialias_Threshold Jitter Jitter_Amount Antialias_Depth Antialias_Gamma
+syn keyword poviniKeyword Pre_Scene_Return Pre_Frame_Return Post_Scene_Return Post_Frame_Return User_Abort_Return Fatal_Error_Return
+syn keyword poviniKeyword Radiosity Radiosity_File_Name Radiosity_From_File Radiosity_To_File Radiosity_Vain_Pretrace High_Reproducibility
+syn match poviniShellOut "^\s*\(Pre_Scene_Command\|Pre_Frame_Command\|Post_Scene_Command\|Post_Frame_Command\|User_Abort_Command\|Fatal_Error_Command\)\>" nextgroup=poviniShellOutEq skipwhite
+syn match poviniShellOutEq "=" nextgroup=poviniShellOutRHS skipwhite contained
+syn match poviniShellOutRHS "[^;]\+" skipwhite contained contains=poviniShellOutSpecial
+syn match poviniShellOutSpecial "%[osnkhw%]" contained
+syn keyword poviniDeclare Declare
+syn match poviniComment ";.*$"
+syn match poviniOption "^\s*[+-]\S*"
+syn match poviniIncludeLabel "^\s*Include_INI\s*=" nextgroup=poviniIncludedFile skipwhite
+syn match poviniIncludedFile "[^;]\+" contains=poviniSection contained
+syn region poviniSection start="\[" end="\]"
+
+" Define the default highlighting
+hi def link poviniSection Special
+hi def link poviniComment Comment
+hi def link poviniDeclare poviniKeyword
+hi def link poviniShellOut poviniKeyword
+hi def link poviniIncludeLabel poviniKeyword
+hi def link poviniKeyword Type
+hi def link poviniShellOutSpecial Special
+hi def link poviniIncludedFile poviniInclude
+hi def link poviniInclude Include
+hi def link poviniOption Keyword
+hi def link poviniBool Constant
+hi def link poviniNumber Number
+
+let b:current_syntax = "povini"
diff --git a/runtime/syntax/ppd.vim b/runtime/syntax/ppd.vim
new file mode 100644
index 0000000..da67e1f
--- /dev/null
+++ b/runtime/syntax/ppd.vim
@@ -0,0 +1,35 @@
+" Vim syntax file
+" Language: PPD (PostScript printer description) file
+" Maintainer: Bjoern Jacke <bjacke@suse.de>
+" Last Change: 2001-10-06
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+syn match ppdComment "^\*%.*"
+syn match ppdDef "\*[a-zA-Z0-9]\+"
+syn match ppdDefine "\*[a-zA-Z0-9\-_]\+:"
+syn match ppdUI "\*[a-zA-Z]*\(Open\|Close\)UI"
+syn match ppdUIGroup "\*[a-zA-Z]*\(Open\|Close\)Group"
+syn match ppdGUIText "/.*:"
+syn match ppdContraints "^*UIConstraints:"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/ppwiz.vim b/runtime/syntax/ppwiz.vim
new file mode 100644
index 0000000..514f8f3
--- /dev/null
+++ b/runtime/syntax/ppwiz.vim
@@ -0,0 +1,84 @@
+" Vim syntax file
+" Language: PPWizard (preprocessor by Dennis Bareis)
+" Maintainer: Stefan Schwarzer <s.schwarzer@ndh.net>
+" URL: http://www.ndh.net/home/sschwarzer/download/ppwiz.vim
+" Last Change: 2003 May 11
+" Filename: ppwiz.vim
+
+" Remove old syntax stuff
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+if !exists("ppwiz_highlight_defs")
+ let ppwiz_highlight_defs = 1
+endif
+
+if !exists("ppwiz_with_html")
+ let ppwiz_with_html = 1
+endif
+
+" comments
+syn match ppwizComment "^;.*$"
+syn match ppwizComment ";;.*$"
+" HTML
+if ppwiz_with_html > 0
+ syn region ppwizHTML start="<" end=">" contains=ppwizArg,ppwizMacro
+ syn match ppwizHTML "\&\w\+;"
+endif
+" define, evaluate etc.
+if ppwiz_highlight_defs == 1
+ syn match ppwizDef "^\s*\#\S\+\s\+\S\+" contains=ALL
+ syn match ppwizDef "^\s*\#\(if\|else\|endif\)" contains=ALL
+ syn match ppwizDef "^\s*\#\({\|break\|continue\|}\)" contains=ALL
+" elseif ppwiz_highlight_defs == 2
+" syn region ppwizDef start="^\s*\#" end="[^\\]$" end="^$" keepend contains=ALL
+else
+ syn region ppwizDef start="^\s*\#" end="[^\\]$" end="^$" keepend contains=ppwizCont
+endif
+syn match ppwizError "\s.\\$"
+syn match ppwizCont "\s\([+\-%]\|\)\\$"
+" macros to execute
+syn region ppwizMacro start="<\$" end=">" contains=@ppwizArgVal,ppwizCont
+" macro arguments
+syn region ppwizArg start="{" end="}" contains=ppwizEqual,ppwizString
+syn match ppwizEqual "=" contained
+syn match ppwizOperator "<>\|=\|<\|>" contained
+" standard variables (builtin)
+syn region ppwizStdVar start="<?[^?]" end=">" contains=@ppwizArgVal
+" Rexx variables
+syn region ppwizRexxVar start="<??" end=">" contains=@ppwizArgVal
+" Constants
+syn region ppwizString start=+"+ end=+"+ contained contains=ppwizMacro,ppwizArg,ppwizHTML,ppwizCont,ppwizStdVar,ppwizRexxVar
+syn region ppwizString start=+'+ end=+'+ contained contains=ppwizMacro,ppwizArg,ppwizHTML,ppwizCont,ppwizStdVar,ppwizRexxVar
+syn match ppwizInteger "\d\+" contained
+
+" Clusters
+syn cluster ppwizArgVal add=ppwizString,ppwizInteger
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "ppwiz"
+
+" vim: ts=4
+
diff --git a/runtime/syntax/prescribe.vim b/runtime/syntax/prescribe.vim
new file mode 100644
index 0000000..cd5ddbe
--- /dev/null
+++ b/runtime/syntax/prescribe.vim
@@ -0,0 +1,56 @@
+" Vim syntax file
+" Language: Kyocera PreScribe2e
+" Maintainer: Klaus Muth <klaus@hampft.de>
+" URL: http://www.hampft.de/vim/syntax/prescribe.vim
+" Last Change: 2005 Mar 04
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match prescribeSpecial "!R!"
+
+" all prescribe commands
+syn keyword prescribeStatement ALTF AMCR ARC ASFN ASTK BARC BLK BOX CALL
+syn keyword prescribeStatement CASS CIR CLIP CLPR CLSP COPY CPTH CSET CSTK
+syn keyword prescribeStatement CTXT DAF DAM DAP DELF DELM DPAT DRP DRPA DUPX
+syn keyword prescribeStatement DXPG DXSD DZP ENDD ENDM ENDR EPL EPRM EXIT
+syn keyword prescribeStatement FDIR FILL FLAT FLST FONT FPAT FRPO FSET FTMD
+syn keyword prescribeStatement GPAT ICCD INTL JOG LDFC MAP MCRO MDAT MID
+syn keyword prescribeStatement MLST MRP MRPA MSTK MTYP MZP NEWP PAGE PARC PAT
+syn keyword prescribeStatement PCRP PCZP PDIR RDRP PDZP PELP PIE PMRA PMRP PMZP
+syn keyword prescribeStatement PRBX PRRC PSRC PXPL RDMP RES RSL RGST RPCS RPF
+syn keyword prescribeStatement RPG RPP RPU RTTX RTXT RVCD RVRD SBM SCAP SCCS
+syn keyword prescribeStatement SCF SCG SCP SCPI SCRC SCS SCU SDP SEM SETF SFA
+syn keyword prescribeStatement SFNT SIMG SIR SLJN SLM SLPI SLPP SLS SMLT SPD
+syn keyword prescribeStatement SPL SPLT SPO SPSZ SPW SRM SRO SROP SSTK STAT STRK
+syn keyword prescribeStatement SULP SVCP TATR TEXT TPRS UNIT UOM WIDE WRED XPAT
+syn match prescribeStatement "\<ALTB\s\+[ACDEGRST]\>"
+syn match prescribeStatement "\<CPPY\s\+[DE]\>"
+syn match prescribeStatement "\<EMCR\s\+[DE]\>"
+syn match prescribeStatement "\<FRPO\s\+INIT\>"
+syn match prescribeStatement "\<JOB[DLOPST]\>"
+syn match prescribeStatement "\<LDFC\s\+[CFS]\>"
+syn match prescribeStatement "\<RWER\s\+[DFILRSTW]\>"
+
+syn match prescribeCSETArg "[0-9]\{1,3}[A-Z]"
+syn match prescribeFRPOArg "[A-Z][0-9]\{1,2}"
+syn match prescribeNumber "[0-9]\+"
+syn region prescribeString start=+'+ end=+'+ skip=+\\'+
+syn region prescribeComment start=+CMNT+ end=+;+
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "prescribe"
+
+" vim: ts=8
diff --git a/runtime/syntax/privoxy.vim b/runtime/syntax/privoxy.vim
new file mode 100644
index 0000000..9e6ff1d
--- /dev/null
+++ b/runtime/syntax/privoxy.vim
@@ -0,0 +1,71 @@
+" Vim syntax file
+" Language: Privoxy actions file
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" URL: http://gus.gscit.monash.edu.au/~djkea2/vim/syntax/privoxy.vim
+" Last Change: 2007 Mar 30
+
+" Privoxy 3.0.6
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword=@,48-57,_,-
+
+syn keyword privoxyTodo contained TODO FIXME XXX NOTE
+syn match privoxyComment "#.*" contains=privoxyTodo,@Spell
+
+syn region privoxyActionLine matchgroup=privoxyActionLineDelimiter start="^\s*\zs{" end="}\ze\s*$"
+ \ contains=privoxyEnabledPrefix,privoxyDisabledPrefix
+
+syn match privoxyEnabledPrefix "\%(^\|\s\|{\)\@<=+\l\@=" nextgroup=privoxyAction,privoxyFilterAction contained
+syn match privoxyDisabledPrefix "\%(^\|\s\|{\)\@<=-\l\@=" nextgroup=privoxyAction,privoxyFilterAction contained
+
+syn match privoxyAction "\%(add-header\|block\|content-type-overwrite\|crunch-client-header\|crunch-if-none-match\)\>" contained
+syn match privoxyAction "\%(crunch-incoming-cookies\|crunch-outgoing-cookies\|crunch-server-header\|deanimate-gifs\)\>" contained
+syn match privoxyAction "\%(downgrade-http-version\|fast-redirects\|filter-client-headers\|filter-server-headers\)\>" contained
+syn match privoxyAction "\%(filter\|force-text-mode\|handle-as-empty-document\|handle-as-image\)\>" contained
+syn match privoxyAction "\%(hide-accept-language\|hide-content-disposition\|hide-forwarded-for-headers\)\>" contained
+syn match privoxyAction "\%(hide-from-header\|hide-if-modified-since\|hide-referrer\|hide-user-agent\|inspect-jpegs\)\>" contained
+syn match privoxyAction "\%(kill-popups\|limit-connect\|overwrite-last-modified\|prevent-compression\|redirect\)\>" contained
+syn match privoxyAction "\%(send-vanilla-wafer\|send-wafer\|session-cookies-only\|set-image-blocker\)\>" contained
+syn match privoxyAction "\%(treat-forbidden-connects-like-blocks\)\>"
+
+syn match privoxyFilterAction "filter{[^}]*}" contained contains=privoxyFilterArg,privoxyActionBraces
+syn match privoxyActionBraces "[{}]" contained
+syn keyword privoxyFilterArg js-annoyances js-events html-annoyances content-cookies refresh-tags unsolicited-popups all-popups
+ \ img-reorder banners-by-size banners-by-link webbugs tiny-textforms jumping-windows frameset-borders demoronizer
+ \ shockwave-flash quicktime-kioskmode fun crude-parental ie-exploits site-specifics no-ping google yahoo msn blogspot
+ \ x-httpd-php-to-html html-to-xml xml-to-html hide-tor-exit-notation contained
+
+" Alternative spellings
+syn match privoxyAction "\%(kill-popup\|hide-referer\|prevent-keeping-cookies\)\>" contained
+
+" Pre-3.0 compatibility
+syn match privoxyAction "\%(no-cookie-read\|no-cookie-set\|prevent-reading-cookies\|prevent-setting-cookies\)\>" contained
+syn match privoxyAction "\%(downgrade\|hide-forwarded\|hide-from\|image\|image-blocker\|no-compression\)\>" contained
+syn match privoxyAction "\%(no-cookies-keep\|no-cookies-read\|no-cookies-set\|no-popups\|vanilla-wafer\|wafer\)\>" contained
+
+syn match privoxySetting "\<for-privoxy-version\>"
+
+syn match privoxyHeader "^\s*\zs{{\%(alias\|settings\)}}\ze\s*$"
+
+hi def link privoxyAction Identifier
+hi def link privoxyFilterAction Identifier
+hi def link privoxyActionLineDelimiter Delimiter
+hi def link privoxyDisabledPrefix SpecialChar
+hi def link privoxyEnabledPrefix SpecialChar
+hi def link privoxyHeader PreProc
+hi def link privoxySetting Identifier
+hi def link privoxyFilterArg Constant
+
+hi def link privoxyComment Comment
+hi def link privoxyTodo Todo
+
+let b:current_syntax = "privoxy"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/procmail.vim b/runtime/syntax/procmail.vim
new file mode 100644
index 0000000..93f50fe
--- /dev/null
+++ b/runtime/syntax/procmail.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" Language: Procmail definition file
+" Maintainer: Melchior FRANZ <mfranz@aon.at>
+" Last Change: 2003 Aug 14
+" Author: Sonia Heimann
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match procmailComment "#.*$" contains=procmailTodo
+syn keyword procmailTodo contained Todo TBD
+
+syn region procmailString start=+"+ skip=+\\"+ end=+"+
+syn region procmailString start=+'+ skip=+\\'+ end=+'+
+
+syn region procmailVarDeclRegion start="^\s*[a-zA-Z0-9_]\+\s*="hs=e-1 skip=+\\$+ end=+$+ contains=procmailVar,procmailVarDecl,procmailString
+syn match procmailVarDecl contained "^\s*[a-zA-Z0-9_]\+"
+syn match procmailVar "$[a-zA-Z0-9_]\+"
+
+syn match procmailCondition contained "^\s*\*.*"
+
+syn match procmailActionFolder contained "^\s*[-_a-zA-Z0-9/]\+"
+syn match procmailActionVariable contained "^\s*$[a-zA-Z_]\+"
+syn region procmailActionForward start=+^\s*!+ skip=+\\$+ end=+$+
+syn region procmailActionPipe start=+^\s*|+ skip=+\\$+ end=+$+
+syn region procmailActionNested start=+^\s*{+ end=+^\s*}+ contains=procmailRecipe,procmailComment,procmailVarDeclRegion
+
+syn region procmailRecipe start=+^\s*:.*$+ end=+^\s*\($\|}\)+me=e-1 contains=procmailComment,procmailCondition,procmailActionFolder,procmailActionVariable,procmailActionForward,procmailActionPipe,procmailActionNested,procmailVarDeclRegion
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link procmailComment Comment
+hi def link procmailTodo Todo
+
+hi def link procmailRecipe Statement
+"hi def link procmailCondition Statement
+
+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
+
+hi def link procmailString String
+
+
+let b:current_syntax = "procmail"
+
+" vim: ts=8
diff --git a/runtime/syntax/progress.vim b/runtime/syntax/progress.vim
new file mode 100644
index 0000000..5e7cfef
--- /dev/null
+++ b/runtime/syntax/progress.vim
@@ -0,0 +1,312 @@
+" Vim syntax file
+" Language: Progress 4GL
+" Filename extensions: *.p (collides with Pascal),
+" *.i (collides with assembler)
+" *.w (collides with cweb)
+" Maintainer: Philip Uren <philuSPAXY@ieee.org> Remove SPAXY spam block
+" Contributors: Matthew Stickney <mtstickneySPAXY@gmail.com>
+" Chris Ruprecht <chrisSPAXY@ruprecht.org>
+" Mikhail Kuperblum <mikhailSPAXY@whasup.com>
+" John Florian <jflorianSPAXY@voyager.net>
+" Version: 13
+" Last Change: Nov 11 2012
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword=@,48-57,_,-,!,#,$,%
+
+" The Progress editor doesn't cope with tabs very well.
+set expandtab
+
+syn case ignore
+
+" Progress Blocks of code and mismatched "end." errors.
+syn match ProgressEndError "\<end\>"
+syn region ProgressDoBlock transparent matchgroup=ProgressDo start="\<do\>" matchgroup=ProgressDo end="\<end\>" contains=ALLBUT,ProgressProcedure,ProgressFunction
+syn region ProgressForBlock transparent matchgroup=ProgressFor start="\<for\>" matchgroup=ProgressFor end="\<end\>" contains=ALLBUT,ProgressProcedure,ProgressFunction
+syn region ProgressRepeatBlock transparent matchgroup=ProgressRepeat start="\<repeat\>" matchgroup=ProgressRepeat end="\<end\>" contains=ALLBUT,ProgressProcedure,ProgressFunction
+syn region ProgressCaseBlock transparent matchgroup=ProgressCase start="\<case\>" matchgroup=ProgressCase end="\<end\scase\>\|\<end\>" contains=ALLBUT,ProgressProcedure,ProgressFunction
+
+" These are Progress reserved words,
+" and they could go in ProgressReserved,
+" but I found it more helpful to highlight them in a different color.
+syn keyword ProgressConditional if else then when otherwise
+syn keyword ProgressFor each where
+
+" Make those TODO and debugging notes stand out!
+syn keyword ProgressTodo contained TODO BUG FIX
+syn keyword ProgressDebug contained DEBUG
+syn keyword ProgressDebug debugger
+
+" If you like to highlight the whole line of
+" the start and end of procedures
+" to make the whole block of code stand out:
+syn match ProgressProcedure "^\s*procedure.*"
+syn match ProgressProcedure "^\s*end\s\s*procedure.*"
+syn match ProgressFunction "^\s*function.*"
+syn match ProgressFunction "^\s*end\s\s*function.*"
+" ... otherwise use this:
+" syn keyword ProgressFunction procedure function
+
+syn keyword ProgressReserved accum[ulate] active-form active-window add alias all alter ambig[uous] analyz[e] and any apply as asc[ending]
+syn keyword ProgressReserved assign asynchronous at attr[-space] audit-control audit-policy authorization auto-ret[urn] avail[able] back[ground]
+syn keyword ProgressReserved before-h[ide] begins bell between big-endian blank break buffer-comp[are] buffer-copy by by-pointer by-variant-point[er] call
+syn keyword ProgressReserved can-do can-find case case-sen[sitive] cast center[ed] check chr clear clipboard codebase-locator colon color column-lab[el]
+syn keyword ProgressReserved col[umns] com-self compiler connected control copy-lob count-of cpstream create current current-changed current-lang[uage]
+syn keyword ProgressReserved current-window current_date curs[or] database dataservers dataset dataset-handle db-remote-host dbcodepage dbcollation dbname
+syn keyword ProgressReserved dbparam dbrest[rictions] dbtaskid dbtype dbvers[ion] dde deblank debug-list debugger decimals declare default
+syn keyword ProgressReserved default-noxl[ate] default-window def[ine] delete delimiter desc[ending] dict[ionary] disable discon[nect] disp[lay] distinct do dos
+syn keyword ProgressReserved down drop dynamic-cast dynamic-func[tion] dynamic-new each editing else enable encode end entry error-stat[us] escape
+syn keyword ProgressReserved etime event-procedure except exclusive[-lock] exclusive-web[-user] exists export false fetch field[s] file-info[rmation]
+syn keyword ProgressReserved fill find find-case-sensitive find-global find-next-occurrence find-prev-occurrence find-select find-wrap-around first
+syn keyword ProgressReserved first-of focus font for form[at] fram[e] frame-col frame-db frame-down frame-field frame-file frame-inde[x] frame-line
+syn keyword ProgressReserved frame-name frame-row frame-val[ue] from from-c[hars] from-p[ixels] function-call-type gateway[s] get-attr-call-type get-byte
+syn keyword ProgressReserved get-codepage[s] get-coll[ations] get-column get-error-column get-error-row get-file-name get-file-offse[t] get-key-val[ue]
+syn keyword ProgressReserved get-message-type get-row getbyte global go-on go-pend[ing] grant graphic-e[dge] group having header help hide host-byte-order if
+syn keyword ProgressReserved import in index indicator input input-o[utput] insert into is is-attr[-space] join kblabel key-code key-func[tion] key-label
+syn keyword ProgressReserved keycode keyfunc[tion] keylabel keys keyword label last last-even[t] last-key last-of lastkey ldbname leave library like
+syn keyword ProgressReserved like-sequential line-count[er] listi[ng] little-endian locked log-manager lookup machine-class map member message message-lines mouse
+syn keyword ProgressReserved mpe new next next-prompt no no-attr[-space] no-error no-f[ill] no-help no-hide no-label[s] no-lobs no-lock no-map
+syn keyword ProgressReserved no-mes[sage] no-pause no-prefe[tch] no-return-val[ue] no-undo no-val[idate] no-wait not now null num-ali[ases] num-dbs num-entries
+syn keyword ProgressReserved of off old on open opsys option or os-append os-command os-copy os-create-dir os-delete os-dir os-drive[s] os-error
+syn keyword ProgressReserved os-rename otherwise output overlay page page-bot[tom] page-num[ber] page-top param[eter] password-field pause pdbname
+syn keyword ProgressReserved persist[ent] pixels preproc[ess] privileges proc-ha[ndle] proc-st[atus] procedure-call-type process profiler program-name progress
+syn keyword ProgressReserved prompt[-for] promsgs propath provers[ion] publish put put-byte put-key-val[ue] putbyte query query-tuning quit r-index
+syn keyword ProgressReserved rcode-info[rmation] read-available read-exact-num readkey recid record-len[gth] rect[angle] release repeat reposition retain retry return
+syn keyword ProgressReserved return-val[ue] revert revoke row-created row-deleted row-modified row-unmodified run save sax-comple[te] sax-parser-error
+syn keyword ProgressReserved sax-running sax-uninitialized sax-write-begin sax-write-complete sax-write-content sax-write-element sax-write-error
+syn keyword ProgressReserved sax-write-idle sax-write-tag schema screen screen-io screen-lines scroll sdbname search search-self search-target security-policy
+syn keyword ProgressReserved seek select self session set set-attr-call-type setuser[id] share[-lock] shared show-stat[s] skip some source-procedure
+syn keyword ProgressReserved space status stream stream-handle stream-io string-xref subscribe super system-dialog table table-handle target-procedure
+syn keyword ProgressReserved term[inal] text text-cursor text-seg[-grow] then this-object this-procedure time title to today top-only trans[action] trigger
+syn keyword ProgressReserved triggers trim true underl[ine] undo unform[atted] union unique unix unless-hidden unsubscribe up update use-index use-revvideo
+syn keyword ProgressReserved use-underline user[id] using value values view view-as wait-for web-con[text] when where while window window-delayed-min[imize]
+syn keyword ProgressReserved window-maxim[ized] window-minim[ized] window-normal with work-tab[le] workfile write xcode xcode-session-key xref xref-xml yes
+
+" Strings. Handles embedded quotes.
+" Note that, for some reason, Progress doesn't use the backslash, "\"
+" as the escape character; it uses tilde, "~".
+syn region ProgressString matchgroup=ProgressQuote start=+"+ end=+"+ skip=+\~'\|\~\~\|\~"+ contains=@Spell
+syn region ProgressString matchgroup=ProgressQuote start=+'+ end=+'+ skip=+\~'\|\~\~\|\~"+ contains=@Spell
+
+syn match ProgressIdentifier "\<[a-zA-Z_][a-zA-Z0-9_]*\>()"
+
+" syn match ProgressDelimiter "()"
+
+syn match ProgressMatrixDelimiter "[][]"
+" If you prefer you can highlight the range:
+"syn match ProgressMatrixDelimiter "[\d\+\.\.\d\+]"
+
+syn match ProgressNumber "\<\-\=\d\+\(u\=l\=\|lu\|f\)\>"
+syn match ProgressByte "\$[0-9a-fA-F]\+"
+
+" More values: Logicals, and Progress's unknown value, ?.
+syn match ProgressNumber "?"
+syn keyword ProgressNumber true false yes no
+
+" If you don't like tabs:
+syn match ProgressShowTab "\t"
+
+" If you don't like white space on the end of lines, uncomment this:
+" syn match ProgressSpaceError "\s\+$"
+
+syn region ProgressComment start="/\*" end="\*/" contains=ProgressComment,ProgressTodo,ProgressDebug,@Spell
+syn region ProgressInclude start="^[ ]*[{]" end="[}]" contains=ProgressPreProc,ProgressOperator,ProgressString,ProgressComment
+syn region ProgressPreProc start="&" end="\>" contained
+
+" This next line works reasonably well.
+" syn match ProgressOperator "[!;|)(:.><+*=-]"
+"
+" Progress allows a '-' to be part of an identifier. To be considered
+" the subtraction/negation operation operator it needs a non-word
+" character on either side. Also valid are cases where the minus
+" operation appears at the beginning or end of a line.
+" This next line trips up on "no-undo" etc.
+" syn match ProgressOperator "[!;|)(:.><+*=]\|\W-\W\|^-\W\|\W-$"
+syn match ProgressOperator "[!;|)(:.><+*=]\|\s-\s\|^-\s\|\s-$"
+
+syn keyword ProgressOperator <= <> >=
+syn keyword ProgressOperator abs[olute] accelerator accept-changes accept-row-changes across active actor add-buffer add-calc-col[umn]
+syn keyword ProgressOperator add-columns-from add-events-proc[edure] add-fields-from add-first add-header-entry add-index-field add-interval add-last
+syn keyword ProgressOperator add-like-col[umn] add-like-field add-like-index add-new-field add-new-index add-rel[ation] add-schema-location add-source-buffer
+syn keyword ProgressOperator add-super-proc[edure] adm-data advise after-buffer after-rowid after-table alert-box allow-column-searching allow-replication alternate-key
+syn keyword ProgressOperator always-on-top ansi-only anywhere append append-child appl-alert[-boxes] appl-context-id application apply-callback appserver-info
+syn keyword ProgressOperator appserver-password appserver-userid array-m[essage] ask-overwrite assembly async-request-count async-request-handle attach-data-source
+syn keyword ProgressOperator attached-pairlist attach attribute-names audit-enabled audit-event-context authentication-failed auto-comp[letion] auto-delete
+syn keyword ProgressOperator auto-delete-xml auto-end-key auto-endkey auto-go auto-ind[ent] auto-resize auto-synchronize auto-val[idate] auto-z[ap] automatic
+syn keyword ProgressOperator available-formats ave[rage] avg backward[s] base-ade base-key basic-logging batch[-mode] batch-size before-buffer before-rowid
+syn keyword ProgressOperator before-table begin-event-group bgc[olor] binary bind bind-where blob block-iteration-display border-b[ottom-chars]
+syn keyword ProgressOperator border-bottom-p[ixels] border-l[eft-chars] border-left-p[ixels] border-r[ight-chars] border-right-p[ixels] border-t[op-chars]
+syn keyword ProgressOperator border-top-p[ixels] both bottom box box-select[able] browse buffer buffer-chars buffer-create buffer-delete buffer-field buffer-handle
+syn keyword ProgressOperator buffer-lines buffer-n[ame] buffer-releas[e] buffer-validate buffer-value button[s] by-reference by-value byte bytes-read
+syn keyword ProgressOperator bytes-written cache cache-size call-name call-type can-crea[te] can-dele[te] can-query can-read can-set can-writ[e] cancel-break
+syn keyword ProgressOperator cancel-button cancel-requests cancelled caps careful-paint catch cdecl chained char[acter] character_length charset checked
+syn keyword ProgressOperator child-buffer child-num choose class class-type clear-appl-context clear-log clear-select[ion] clear-sort-arrow[s]
+syn keyword ProgressOperator client-connection-id client-principal client-tty client-type client-workstation clob clone-node close close-log code codepage
+syn keyword ProgressOperator codepage-convert col-of collate colon-align[ed] color-table column-bgc[olor] column-codepage column-dcolor column-fgc[olor]
+syn keyword ProgressOperator column-font column-movable column-of column-pfc[olor] column-read-only column-resizable column-sc[rolling] com-handle combo-box
+syn keyword ProgressOperator command compare[s] compile complete config-name connect constructor contents context context-help context-help-file
+syn keyword ProgressOperator context-help-id context-pop[up] control-box control-fram[e] convert convert-to-offs[et] copy-dataset copy-sax-attributes
+syn keyword ProgressOperator copy-temp-table count cpcase cpcoll cpint[ernal] cplog cpprint cprcodein cprcodeout cpterm crc-val[ue] create-like
+syn keyword ProgressOperator create-like-sequential create-node create-node-namespace create-result-list-entry create-test-file current-column current-env[ironment]
+syn keyword ProgressOperator current-iteration current-query current-result-row current-row-modified current-value cursor-char cursor-line cursor-offset data-b[ind]
+syn keyword ProgressOperator data-entry-ret[urn] data-rel[ation] data-source data-source-complete-map data-source-modified data-source-rowid data-t[ype] date
+syn keyword ProgressOperator date-f[ormat] day db-references dcolor dde-error dde-i[d] dde-item dde-name dde-topic debu[g] debug-alert
+syn keyword ProgressOperator declare-namespace decrypt default-buffer-handle default-but[ton] default-commit default-ex[tension] default-string
+syn keyword ProgressOperator default-value define-user-event-manager defined delete-char delete-current-row delete-header-entry delete-line delete-node
+syn keyword ProgressOperator delete-result-list-entry delete-selected-row delete-selected-rows descript[ion] deselect-focused-row deselect-rows deselect-selected-row
+syn keyword ProgressOperator destructor detach-data-source dialog-box dir directory disable-auto-zap disable-connections disable-dump-triggers
+syn keyword ProgressOperator disable-load-triggers disabled display-message display-timezone display-t[ype] domain-description domain-name domain-type double
+syn keyword ProgressOperator drag-enabled drop-down drop-down-list drop-target dump dump-logging-now dynamic dynamic-current-value dynamic-next-value echo
+syn keyword ProgressOperator edge[-chars] edge-p[ixels] edit-can-paste edit-can-undo edit-clear edit-copy edit-cut edit-paste edit-undo editor empty
+syn keyword ProgressOperator empty-dataset empty-temp-table enable-connections enabled encoding encrypt encrypt-audit-mac-key encryption-salt end-document
+syn keyword ProgressOperator end-element end-event-group end-file-drop end-key end-user-prompt endkey entered entry-types-list eq error error-col[umn]
+syn keyword ProgressOperator error-object-detail error-row error-stack-trace error-string event-group-id event-procedure-context event-t[ype] events exclusive-id
+syn keyword ProgressOperator execute execution-log exp expand expandable expire explicit export-principal extended extent external extract
+syn keyword ProgressOperator fetch-selected-row fgc[olor] file file-create-d[ate] file-create-t[ime] file-mod-d[ate] file-mod-t[ime] file-name file-off[set]
+syn keyword ProgressOperator file-size file-type filename fill-in fill-mode fill-where-string filled filters final finally find-by-rowid find-current
+syn keyword ProgressOperator find-first find-last find-unique finder first-async[-request] first-buffer first-child first-column first-data-source
+syn keyword ProgressOperator first-dataset first-form first-object first-proc[edure] first-query first-serv[er] first-server-socket first-socket
+syn keyword ProgressOperator first-tab-i[tem] fit-last-column fix-codepage fixed-only flat-button float focused-row focused-row-selected font-table force-file
+syn keyword ProgressOperator fore[ground] foreign-key-hidden form-input form-long-input formatte[d] forward-only forward[s] fragmen[t] frame-spa[cing] frame-x
+syn keyword ProgressOperator frame-y frequency from-cur[rent] full-height[-chars] full-height-p[ixels] full-pathn[ame] full-width[-chars]
+syn keyword ProgressOperator full-width-p[ixels] function ge generate-pbe-key generate-pbe-salt generate-random-key generate-uuid get get-attribute get-attribute-node
+syn keyword ProgressOperator get-binary-data get-bits get-blue[-value] get-browse-col[umn] get-buffer-handle get-byte-order get-bytes get-bytes-available
+syn keyword ProgressOperator get-callback-proc-context get-callback-proc-name get-cgi-list get-cgi-long-value get-cgi-value get-changes get-child get-child-rel[ation]
+syn keyword ProgressOperator get-config-value get-curr[ent] get-dataset-buffer get-dir get-document-element get-double get-dropped-file get-dynamic get-file
+syn keyword ProgressOperator get-firs[t] get-float get-green[-value] get-header-entr[y] get-index-by-namespace-name get-index-by-qname get-iteration get-last
+syn keyword ProgressOperator get-localname-by-index get-long get-message get-next get-node get-number get-parent get-pointer-value get-prev get-printers get-property
+syn keyword ProgressOperator get-qname-by-index get-red[-value] get-rel[ation] get-repositioned-row get-rgb[-value] get-selected[-widget] get-serialized get-short
+syn keyword ProgressOperator get-signature get-size get-socket-option get-source-buffer get-string get-tab-item get-text-height[-chars] get-text-height-p[ixels]
+syn keyword ProgressOperator get-text-width[-chars] get-text-width-p[ixels] get-top-buffer get-type-by-index get-type-by-namespace-name get-type-by-qname
+syn keyword ProgressOperator get-unsigned-long get-unsigned-short get-uri-by-index get-value-by-index get-value-by-namespace-name get-value-by-qname
+syn keyword ProgressOperator get-wait[-state] grayed grid-factor-h[orizontal] grid-factor-v[ertical] grid-snap grid-unit-height[-chars] grid-unit-height-p[ixels]
+syn keyword ProgressOperator grid-unit-width[-chars] grid-unit-width-p[ixels] grid-visible group-box gt guid handle handler has-lobs has-records height[-chars]
+syn keyword ProgressOperator height-p[ixels] help-topic hex-decode hex-encode hidden hint hori[zontal] html-charset html-end-of-line html-end-of-page
+syn keyword ProgressOperator html-frame-begin html-frame-end html-header-begin html-header-end html-title-begin html-title-end hwnd icfparam[eter] icon
+syn keyword ProgressOperator ignore-current-mod[ified] image image-down image-insensitive image-size image-size-c[hars] image-size-p[ixels] image-up immediate-display
+syn keyword ProgressOperator implements import-node import-principal in-handle increment-exclusive-id index-hint index-info[rmation] indexed-reposition
+syn keyword ProgressOperator info[rmation] inherit-bgc[olor] inherit-fgc[olor] inherits init[ial] initial-dir initial-filter initialize-document-type initiate
+syn keyword ProgressOperator inner inner-chars inner-lines input-value insert-attribute insert-b[acktab] insert-before insert-file insert-row
+syn keyword ProgressOperator insert-string insert-t[ab] instantiating-procedure int[eger] interface internal-entries interval invoke is-clas[s]
+syn keyword ProgressOperator is-codepage-fixed is-column-codepage is-lead-byte is-open is-parameter-set is-row-selected is-selected is-xml iso-date item
+syn keyword ProgressOperator items-per-row join-by-sqldb keep-connection-open keep-frame-z[-order] keep-messages keep-security-cache keep-tab-order key
+syn keyword ProgressOperator keyword-all label-bgc[olor] label-dc[olor] label-fgc[olor] label-font label-pfc[olor] labels landscape language[s] large
+syn keyword ProgressOperator large-to-small last-async[-request] last-batch last-child last-form last-object last-proce[dure] last-serv[er] last-server-socket
+syn keyword ProgressOperator last-socket last-tab-i[tem] lc le leading left left-align[ed] left-trim length line list-events list-item-pairs list-items
+syn keyword ProgressOperator list-property-names list-query-attrs list-set-attrs list-widgets literal-question load load-domains load-icon load-image load-image-down
+syn keyword ProgressOperator load-image-insensitive load-image-up load-mouse-p[ointer] load-picture load-small-icon lob-dir local-host local-name local-port
+syn keyword ProgressOperator locator-column-number locator-line-number locator-public-id locator-system-id locator-type lock-registration log log-audit-event
+syn keyword ProgressOperator log-entry-types log-threshold logfile-name logging-level logical login-expiration-timestamp login-host login-state logout long[char]
+syn keyword ProgressOperator longchar-to-node-value lookahead lower lt mandatory manual-highlight margin-extra margin-height[-chars] margin-height-p[ixels]
+syn keyword ProgressOperator margin-width[-chars] margin-width-p[ixels] mark-new mark-row-state matches max-button max-chars max-data-guess max-height[-chars]
+syn keyword ProgressOperator max-height-p[ixels] max-rows max-size max-val[ue] max-width[-chars] max-width-p[ixels] maximize max[imum] maximum-level memory memptr
+syn keyword ProgressOperator memptr-to-node-value menu menu-bar menu-item menu-k[ey] menu-m[ouse] menubar merge-by-field merge-changes merge-row-changes message-area
+syn keyword ProgressOperator message-area-font method min-button min-column-width-c[hars] min-column-width-p[ixels] min-height[-chars] min-height-p[ixels]
+syn keyword ProgressOperator min-schema-marshal min-size min-val[ue] min-width[-chars] min-width-p[ixels] min[imum] modified mod[ulo] month mouse-p[ointer] movable
+syn keyword ProgressOperator move-after[-tab-item] move-befor[e-tab-item] move-col[umn] move-to-b[ottom] move-to-eof move-to-t[op] mtime multi-compile multiple
+syn keyword ProgressOperator multiple-key multitasking-interval must-exist must-understand name namespace-prefix namespace-uri native ne needs-appserver-prompt
+syn keyword ProgressOperator needs-prompt nested new-instance new-row next-col[umn] next-rowid next-sibling next-tab-ite[m] next-value no-apply
+syn keyword ProgressOperator no-array-m[essage] no-assign no-attr-l[ist] no-auto-validate no-bind-where no-box no-console no-convert no-current-value no-debug
+syn keyword ProgressOperator no-drag no-echo no-empty-space no-focus no-index-hint no-inherit-bgc[olor] no-inherit-fgc[olor] no-join-by-sqldb no-lookahead
+syn keyword ProgressOperator no-row-markers no-schema-marshal no-scrollbar-v[ertical] no-separate-connection no-separators no-tab[-stop] no-und[erline]
+syn keyword ProgressOperator no-word-wrap node-value node-value-to-longchar node-value-to-memptr nonamespace-schema-location none normalize not-active
+syn keyword ProgressOperator num-buffers num-but[tons] num-child-relations num-children num-col[umns] num-copies num-dropped-files num-fields num-formats
+syn keyword ProgressOperator num-header-entries num-items num-iterations num-lines num-locked-col[umns] num-log-files num-messages num-parameters num-references
+syn keyword ProgressOperator num-relations num-repl[aced] num-results num-selected-rows num-selected[-widgets] num-source-buffers num-tabs num-to-retain
+syn keyword ProgressOperator num-top-buffers num-visible-col[umns] numeric numeric-dec[imal-point] numeric-f[ormat] numeric-sep[arator] object ok ok-cancel
+syn keyword ProgressOperator on-frame[-border] ordered-join ordinal orientation origin-handle origin-rowid os-getenv outer outer-join override owner owner-document
+syn keyword ProgressOperator page-size page-wid[th] paged parent parent-buffer parent-rel[ation] parse-status partial-key pascal pathname
+syn keyword ProgressOperator pbe-hash-alg[orithm] pbe-key-rounds perf[ormance] persistent-cache-disabled persistent-procedure pfc[olor] pixels-per-col[umn]
+syn keyword ProgressOperator pixels-per-row popup-m[enu] popup-o[nly] portrait position precision prefer-dataset prepare-string prepared presel[ect] prev
+syn keyword ProgressOperator prev-col[umn] prev-sibling prev-tab-i[tem] primary printer printer-control-handle printer-hdc printer-name printer-port
+syn keyword ProgressOperator printer-setup private private-d[ata] proce[dure] procedure-name progress-s[ource] property protected proxy proxy-password
+syn keyword ProgressOperator proxy-userid public public-id published-events put-bits put-bytes put-double put-float put-long put-short put-string
+syn keyword ProgressOperator put-unsigned-long put-unsigned-short query-close query-off-end query-open query-prepare question quoter radio-buttons radio-set random
+syn keyword ProgressOperator raw raw-transfer read read-file read-only read-xml read-xmlschema real recursive reference-only refresh
+syn keyword ProgressOperator refresh-audit-policy refreshable register-domain reject-changes reject-row-changes rejected relation-fi[elds] relations-active remote
+syn keyword ProgressOperator remote-host remote-port remove-attribute remove-child remove-events-proc[edure] remove-super-proc[edure] replace replace-child
+syn keyword ProgressOperator replace-selection-text replication-create replication-delete replication-write reposition-back[ward] reposition-forw[ard] reposition-to-row
+syn keyword ProgressOperator reposition-to-rowid request reset resiza[ble] resize restart-row restart-rowid result retain-s[hape] retry-cancel return-ins[erted]
+syn keyword ProgressOperator return-to-start-di[r] return-value-data-type returns reverse-from rgb-v[alue] right right-align[ed] right-trim roles round rounded
+syn keyword ProgressOperator routine-level row row-height[-chars] row-height-p[ixels] row-ma[rkers] row-of row-resizable row-state rowid rule run-proc[edure]
+syn keyword ProgressOperator save-as save-file save-row-changes save-where-string sax-attributes sax-parse sax-parse-first sax-parse-next sax-reader
+syn keyword ProgressOperator sax-writer schema-change schema-location schema-marshal schema-path screen-val[ue] scroll-bars scroll-delta scroll-offset
+syn keyword ProgressOperator scroll-to-current-row scroll-to-i[tem] scroll-to-selected-row scrollable scrollbar-h[orizontal] scrollbar-v[ertical]
+syn keyword ProgressOperator scrolled-row-pos[ition] scrolling seal seal-timestamp section select-all select-focused-row select-next-row select-prev-row select-row
+syn keyword ProgressOperator selectable selected selection-end selection-list selection-start selection-text send sensitive separate-connection
+syn keyword ProgressOperator separator-fgc[olor] separators server server-connection-bo[und] server-connection-bound-re[quest] server-connection-co[ntext]
+syn keyword ProgressOperator server-connection-id server-operating-mode server-socket session-end session-id set-actor set-appl-context set-attribute
+syn keyword ProgressOperator set-attribute-node set-blue[-value] set-break set-buffers set-byte-order set-callback set-callback-procedure set-client set-commit
+syn keyword ProgressOperator set-connect-procedure set-contents set-db-client set-dynamic set-green[-value] set-input-source set-must-understand set-node
+syn keyword ProgressOperator set-numeric-form[at] set-option set-output-destination set-parameter set-pointer-val[ue] set-property set-read-response-procedure
+syn keyword ProgressOperator set-red[-value] set-repositioned-row set-rgb[-value] set-rollback set-selection set-serialized set-size set-socket-option
+syn keyword ProgressOperator set-sort-arrow set-wait[-state] short show-in-task[bar] side-label-h[andle] side-lab[els] silent simple single single-character size
+syn keyword ProgressOperator size-c[hars] size-p[ixels] skip-deleted-rec[ord] slider small-icon small-title smallint soap-fault soap-fault-actor
+syn keyword ProgressOperator soap-fault-code soap-fault-detail soap-fault-string soap-header soap-header-entryref socket sort sort-ascending sort-number source
+syn keyword ProgressOperator sql sqrt ssl-server-name standalone start-document start-element start[ing] startup-parameters state-detail static
+syn keyword ProgressOperator status-area status-area-font stdcall stop stop-parsing stoppe[d] stored-proc[edure] stretch-to-fit strict string string-value
+syn keyword ProgressOperator sub-ave[rage] sub-count sub-max[imum] sub-menu sub-menu-help sub-min[imum] sub-total subst[itute] substr[ing] subtype sum
+syn keyword ProgressOperator super-proc[edures] suppress-namespace-processing suppress-w[arnings] suspend symmetric-encryption-algorithm symmetric-encryption-iv
+syn keyword ProgressOperator symmetric-encryption-key symmetric-support synchronize system-alert[-boxes] system-help system-id tab-position tab-stop table-crc-list
+syn keyword ProgressOperator table-list table-num[ber] target temp-dir[ectory] temp-table temp-table-prepar[e] terminate text-selected three-d through throw
+syn keyword ProgressOperator thru tic-marks time-source timezone title-bgc[olor] title-dc[olor] title-fgc[olor] title-fo[nt] to-rowid toggle-box
+syn keyword ProgressOperator tooltip tooltips top top-nav-query topic total tracking-changes trailing trans-init-proc[edure] transaction-mode
+syn keyword ProgressOperator transpar[ent] trunc[ate] ttcodepage type type-of unbox unbuff[ered] unique-id unique-match unload unsigned-byte unsigned-integer
+syn keyword ProgressOperator unsigned-long unsigned-short update-attribute upper url url-decode url-encode url-password url-userid use use-dic[t-exps]
+syn keyword ProgressOperator use-filename use-text use-widget-pool user-id valid-event valid-handle valid-object validate validate-expressio[n]
+syn keyword ProgressOperator validate-message validate-seal validate-xml validation-enabled var[iable] verb[ose] version vert[ical] view-first-column-on-reopen
+syn keyword ProgressOperator virtual-height[-chars] virtual-height-p[ixels] virtual-width[-chars] virtual-width-p[ixels] visible void wait warning weekday where-string
+syn keyword ProgressOperator widget widget-e[nter] widget-h[andle] widget-id widget-l[eave] widget-pool width[-chars] width-p[ixels] window-name
+syn keyword ProgressOperator window-sta[te] window-sys[tem] word-index word-wrap work-area-height-p[ixels] work-area-width-p[ixels] work-area-x work-area-y
+syn keyword ProgressOperator write-cdata write-characters write-comment write-data-element write-empty-element write-entity-ref write-external-dtd
+syn keyword ProgressOperator write-fragment write-message write-processing-instruction write-status write-xml write-xmlschema x x-document x-noderef x-of
+syn keyword ProgressOperator xml-data-type xml-node-name xml-node-type xml-schema-pat[h] xml-suppress-namespace-processing y y-of year year-offset yes-no
+syn keyword ProgressOperator yes-no-cancel
+
+syn keyword ProgressType char[acter] int[eger] int64 dec[imal] log[ical] da[te] datetime datetime-tz
+
+syn sync lines=800
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+" 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
+
+
+let b:current_syntax = "progress"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 sw=8
diff --git a/runtime/syntax/prolog.vim b/runtime/syntax/prolog.vim
new file mode 100644
index 0000000..93aba4d
--- /dev/null
+++ b/runtime/syntax/prolog.vim
@@ -0,0 +1,118 @@
+" Vim syntax file
+" Language: PROLOG
+" Maintainer: Anton Kochkov <anton.kochkov@gmail.com>
+" Last Change: 2021 Jan 05
+
+" There are two sets of highlighting in here:
+" If the "prolog_highlighting_clean" variable exists, it is rather sparse.
+" Otherwise you get more highlighting.
+"
+" You can also set the "prolog_highlighting_no_keyword" variable. If set,
+" keywords will not be highlighted.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Prolog is case sensitive.
+syn case match
+
+" Very simple highlighting for comments, clause heads and
+" character codes. It respects prolog strings and atoms.
+
+syn region prologCComment start=+/\*+ end=+\*/+ contains=@Spell
+syn match prologComment +%.*+ contains=@Spell
+
+if !exists("prolog_highlighting_no_keyword")
+ syn keyword prologKeyword module meta_predicate multifile dynamic
+endif
+syn match prologCharCode +0'\\\=.+
+syn region prologString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell
+syn region prologAtom start=+'+ skip=+\\\\\|\\'+ end=+'+
+syn region prologClause matchgroup=prologClauseHead start=+^\s*[a-z]\w*+ matchgroup=Normal end=+\.\s\|\.$+ contains=ALLBUT,prologClause contains=@NoSpell
+
+if !exists("prolog_highlighting_clean")
+
+ " some keywords
+ " some common predicates are also highlighted as keywords
+ " is there a better solution?
+ if !exists("prolog_highlighting_no_keyword")
+ syn keyword prologKeyword abolish current_output peek_code
+ syn keyword prologKeyword append current_predicate put_byte
+ syn keyword prologKeyword arg current_prolog_flag put_char
+ syn keyword prologKeyword asserta fail put_code
+ syn keyword prologKeyword assertz findall read
+ syn keyword prologKeyword at_end_of_stream float read_term
+ syn keyword prologKeyword atom flush_output repeat
+ syn keyword prologKeyword atom_chars functor retract
+ syn keyword prologKeyword atom_codes get_byte set_input
+ syn keyword prologKeyword atom_concat get_char set_output
+ syn keyword prologKeyword atom_length get_code set_prolog_flag
+ syn keyword prologKeyword atomic halt set_stream_position
+ syn keyword prologKeyword bagof integer setof
+ syn keyword prologKeyword call is stream_property
+ syn keyword prologKeyword catch nl sub_atom
+ syn keyword prologKeyword char_code nonvar throw
+ syn keyword prologKeyword char_conversion number true
+ syn keyword prologKeyword clause number_chars unify_with_occurs_check
+ syn keyword prologKeyword close number_codes var
+ syn keyword prologKeyword compound once write
+ syn keyword prologKeyword copy_term op write_canonical
+ syn keyword prologKeyword current_char_conversion open write_term
+ syn keyword prologKeyword current_input peek_byte writeq
+ syn keyword prologKeyword current_op peek_char
+ endif
+
+ syn match prologOperator "=\\=\|=:=\|\\==\|=<\|==\|>=\|\\=\|\\+\|=\.\.\|<\|>\|="
+ syn match prologAsIs "===\|\\===\|<=\|=>"
+
+ syn match prologNumber "\<\d*\>'\@!"
+ syn match prologNumber "\<0[xX]\x*\>'\@!"
+ syn match prologCommentError "\*/"
+ syn match prologSpecialCharacter ";"
+ syn match prologSpecialCharacter "!"
+ syn match prologSpecialCharacter ":-"
+ syn match prologSpecialCharacter "-->"
+ syn match prologQuestion "?-.*\." contains=prologNumber
+
+
+endif
+
+syn sync maxlines=50
+
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..add4514
--- /dev/null
+++ b/runtime/syntax/promela.vim
@@ -0,0 +1,53 @@
+" Vim syntax file
+" Language: ProMeLa
+" Maintainer: Maurizio Tranchero <maurizio.tranchero@polito.it> - <maurizio.tranchero@gmail.com>
+" First Release: Mon Oct 16 08:49:46 CEST 2006
+" Last Change: Thu Aug 7 21:22:48 CEST 2008
+" Version: 0.5
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" case is significant
+" syn case ignore
+" ProMeLa Keywords
+syn keyword promelaStatement proctype if else while chan do od fi break goto unless
+syn keyword promelaStatement active assert label atomic
+syn keyword promelaFunctions skip timeout run
+syn keyword promelaTodo contained TODO
+" ProMeLa Types
+syn keyword promelaType bit bool byte short int
+" Operators and special characters
+syn match promelaOperator "!"
+syn match promelaOperator "?"
+syn match promelaOperator "->"
+syn match promelaOperator "="
+syn match promelaOperator "+"
+syn match promelaOperator "*"
+syn match promelaOperator "/"
+syn match promelaOperator "-"
+syn match promelaOperator "<"
+syn match promelaOperator ">"
+syn match promelaOperator "<="
+syn match promelaOperator ">="
+syn match promelaSpecial "\["
+syn match promelaSpecial "\]"
+syn match promelaSpecial ";"
+syn match promelaSpecial "::"
+" ProMeLa Comments
+syn region promelaComment start="/\*" end="\*/" contains=promelaTodo,@Spell
+syn match promelaComment "//.*" contains=promelaTodo,@Spell
+
+" Class Linking
+hi def link promelaStatement Statement
+hi def link promelaType Type
+hi def link promelaComment Comment
+hi def link promelaOperator Type
+hi def link promelaSpecial Special
+hi def link promelaFunctions Special
+hi def link promelaString String
+hi def link promelaTodo Todo
+
+let b:current_syntax = "promela"
diff --git a/runtime/syntax/proto.vim b/runtime/syntax/proto.vim
new file mode 100644
index 0000000..0d2d2f2
--- /dev/null
+++ b/runtime/syntax/proto.vim
@@ -0,0 +1,83 @@
+" Protocol Buffers - Google's data interchange format
+" Copyright 2008 Google Inc. All rights reserved.
+" https://developers.google.com/protocol-buffers/
+"
+" 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 Google 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.
+
+" This is the Vim syntax file for Google Protocol Buffers as found at
+" https://github.com/protocolbuffers/protobuf
+" Last update: 2020 Oct 29
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+syn keyword protoTodo contained TODO FIXME XXX
+syn cluster protoCommentGrp contains=protoTodo
+
+syn keyword protoSyntax syntax import option
+syn keyword protoStructure package message group oneof
+syn keyword protoRepeat optional required repeated
+syn keyword protoDefault default
+syn keyword protoExtend extend extensions to max reserved
+syn keyword protoRPC service rpc returns
+
+syn keyword protoType int32 int64 uint32 uint64 sint32 sint64
+syn keyword protoType fixed32 fixed64 sfixed32 sfixed64
+syn keyword protoType float double bool string bytes
+syn keyword protoTypedef enum
+syn keyword protoBool true false
+
+syn match protoInt /-\?\<\d\+\>/
+syn match protoInt /\<0[xX]\x+\>/
+syn match protoFloat /\<-\?\d*\(\.\d*\)\?/
+syn region protoComment start="\/\*" end="\*\/" contains=@pbCommentGrp,@Spell
+syn region protoComment start="//" skip="\\$" end="$" keepend contains=@pbCommentGrp,@Spell
+syn region protoString start=/"/ skip=/\\./ end=/"/ contains=@Spell
+syn region protoString start=/'/ skip=/\\./ end=/'/ contains=@Spell
+
+hi def link protoTodo Todo
+
+hi def link protoSyntax Include
+hi def link protoStructure Structure
+hi def link protoRepeat Repeat
+hi def link protoDefault Keyword
+hi def link protoExtend Keyword
+hi def link protoRPC Keyword
+hi def link protoType Type
+hi def link protoTypedef Typedef
+hi def link protoBool Boolean
+
+hi def link protoInt Number
+hi def link protoFloat Float
+hi def link protoComment Comment
+hi def link protoString String
+
+let b:current_syntax = "proto"
diff --git a/runtime/syntax/protocols.vim b/runtime/syntax/protocols.vim
new file mode 100644
index 0000000..f31ca5a
--- /dev/null
+++ b/runtime/syntax/protocols.vim
@@ -0,0 +1,44 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match protocolsBegin display '^'
+ \ nextgroup=protocolsName,protocolsComment
+
+syn match protocolsName contained display '[[:graph:]]\+'
+ \ nextgroup=protocolsPort skipwhite
+
+syn match protocolsPort contained display '\d\+'
+ \ nextgroup=protocolsAliases,protocolsComment
+ \ skipwhite
+
+syn match protocolsAliases contained display '\S\+'
+ \ nextgroup=protocolsAliases,protocolsComment
+ \ skipwhite
+
+syn keyword protocolsTodo contained TODO FIXME XXX NOTE
+
+syn region protocolsComment display oneline start='#' end='$'
+ \ contains=protocolsTodo,@Spell
+
+hi def link protocolsTodo Todo
+hi def link protocolsComment Comment
+hi def link protocolsName Identifier
+hi def link protocolsPort Number
+hi def link protocolsPPDiv Delimiter
+hi def link protocolsPPDivDepr Error
+hi def link protocolsProtocol Type
+hi def link protocolsAliases Macro
+
+let b:current_syntax = "protocols"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/ps1.vim b/runtime/syntax/ps1.vim
new file mode 100644
index 0000000..e8f6b2f
--- /dev/null
+++ b/runtime/syntax/ps1.vim
@@ -0,0 +1,182 @@
+" Vim syntax file
+" Language: Windows PowerShell
+" URL: https://github.com/PProvost/vim-ps1
+" Last Change: 2020 Nov 24
+"
+" The following settings are available for tuning syntax highlighting:
+" let ps1_nofold_blocks = 1
+" let ps1_nofold_sig = 1
+" let ps1_nofold_region = 1
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" Operators contain dashes
+setlocal iskeyword+=-
+
+" PowerShell doesn't care about case
+syn case ignore
+
+" Sync-ing method
+syn sync minlines=100
+
+" Certain tokens can't appear at the top level of the document
+syn cluster ps1NotTop contains=@ps1Comment,ps1CDocParam,ps1FunctionDeclaration
+
+" Comments and special comment words
+syn keyword ps1CommentTodo TODO FIXME XXX TBD HACK NOTE contained
+syn match ps1CDocParam /.*/ contained
+syn match ps1CommentDoc /^\s*\zs\.\w\+\>/ nextgroup=ps1CDocParam contained
+syn match ps1CommentDoc /#\s*\zs\.\w\+\>/ nextgroup=ps1CDocParam contained
+syn match ps1Comment /#.*/ contains=ps1CommentTodo,ps1CommentDoc,@Spell
+syn region ps1Comment start="<#" end="#>" contains=ps1CommentTodo,ps1CommentDoc,@Spell
+
+" Language keywords and elements
+syn keyword ps1Conditional if else elseif switch default
+syn keyword ps1Repeat while for do until break continue foreach in
+syn match ps1Repeat /\<foreach\>/ nextgroup=ps1Block skipwhite
+syn match ps1Keyword /\<while\>/ nextgroup=ps1Block skipwhite
+syn match ps1Keyword /\<where\>/ nextgroup=ps1Block skipwhite
+
+syn keyword ps1Exception begin process end exit inlinescript parallel sequence
+syn keyword ps1Keyword try catch finally throw
+syn keyword ps1Keyword return filter in trap param data dynamicparam
+syn keyword ps1Constant $true $false $null
+syn match ps1Constant +\$?+
+syn match ps1Constant +\$_+
+syn match ps1Constant +\$\$+
+syn match ps1Constant +\$^+
+
+" Keywords reserved for future use
+syn keyword ps1Keyword class define from using var
+
+" Function declarations
+syn keyword ps1Keyword function nextgroup=ps1Function skipwhite
+syn keyword ps1Keyword filter nextgroup=ps1Function skipwhite
+syn keyword ps1Keyword workflow nextgroup=ps1Function skipwhite
+syn keyword ps1Keyword configuration nextgroup=ps1Function skipwhite
+syn keyword ps1Keyword class nextgroup=ps1Function skipwhite
+syn keyword ps1Keyword enum nextgroup=ps1Function skipwhite
+
+" Function declarations and invocations
+syn match ps1Cmdlet /\v(add|clear|close|copy|enter|exit|find|format|get|hide|join|lock|move|new|open|optimize|pop|push|redo|remove|rename|reset|search|select|Set|show|skip|split|step|switch|undo|unlock|watch)(-\w+)+/ contained
+syn match ps1Cmdlet /\v(connect|disconnect|read|receive|send|write)(-\w+)+/ contained
+syn match ps1Cmdlet /\v(backup|checkpoint|compare|compress|convert|convertfrom|convertto|dismount|edit|expand|export|group|import|initialize|limit|merge|mount|out|publish|restore|save|sync|unpublish|update)(-\w+)+/ contained
+syn match ps1Cmdlet /\v(debug|measure|ping|repair|resolve|test|trace)(-\w+)+/ contained
+syn match ps1Cmdlet /\v(approve|assert|build|complete|confirm|deny|deploy|disable|enable|install|invoke|register|request|restart|resume|start|stop|submit|suspend|uninstall|unregister|wait)(-\w+)+/ contained
+syn match ps1Cmdlet /\v(block|grant|protect|revoke|unblock|unprotect)(-\w+)+/ contained
+syn match ps1Cmdlet /\v(use)(-\w+)+/ contained
+
+" Other functions
+syn match ps1Function /\w\+\(-\w\+\)\+/ contains=ps1Cmdlet
+
+" Type declarations
+syn match ps1Type /\[[a-z_][a-z0-9_.,\[\]]\+\]/
+
+" Variable references
+syn match ps1ScopeModifier /\(global:\|local:\|private:\|script:\)/ contained
+syn match ps1Variable /\$\w\+\(:\w\+\)\?/ contains=ps1ScopeModifier
+syn match ps1Variable /\${\w\+\(:\?[[:alnum:]_()]\+\)\?}/ contains=ps1ScopeModifier
+
+" Operators
+syn keyword ps1Operator -eq -ne -ge -gt -lt -le -like -notlike -match -notmatch -replace -split -contains -notcontains
+syn keyword ps1Operator -ieq -ine -ige -igt -ile -ilt -ilike -inotlike -imatch -inotmatch -ireplace -isplit -icontains -inotcontains
+syn keyword ps1Operator -ceq -cne -cge -cgt -clt -cle -clike -cnotlike -cmatch -cnotmatch -creplace -csplit -ccontains -cnotcontains
+syn keyword ps1Operator -in -notin
+syn keyword ps1Operator -is -isnot -as -join
+syn keyword ps1Operator -and -or -not -xor -band -bor -bnot -bxor
+syn keyword ps1Operator -f
+syn match ps1Operator /!/
+syn match ps1Operator /=/
+syn match ps1Operator /+=/
+syn match ps1Operator /-=/
+syn match ps1Operator /\*=/
+syn match ps1Operator /\/=/
+syn match ps1Operator /%=/
+syn match ps1Operator /+/
+syn match ps1Operator /-\(\s\|\d\|\.\|\$\|(\)\@=/
+syn match ps1Operator /\*/
+syn match ps1Operator /\//
+syn match ps1Operator /|/
+syn match ps1Operator /%/
+syn match ps1Operator /&/
+syn match ps1Operator /::/
+syn match ps1Operator /,/
+syn match ps1Operator /\(^\|\s\)\@<=\. \@=/
+
+" Regular Strings
+" These aren't precisely correct and could use some work
+syn region ps1String start=/"/ skip=/`"/ end=/"/ contains=@ps1StringSpecial,@Spell
+syn region ps1String start=/'/ skip=/''/ end=/'/
+
+" Here-Strings
+syn region ps1String start=/@"$/ end=/^"@/ contains=@ps1StringSpecial,@Spell
+syn region ps1String start=/@'$/ end=/^'@/
+
+" Interpolation
+syn match ps1Escape /`./
+syn region ps1Interpolation matchgroup=ps1InterpolationDelimiter start="$(" end=")" contained contains=ALLBUT,@ps1NotTop
+syn region ps1NestedParentheses start="(" skip="\\\\\|\\)" matchgroup=ps1Interpolation end=")" transparent contained
+syn cluster ps1StringSpecial contains=ps1Escape,ps1Interpolation,ps1Variable,ps1Boolean,ps1Constant,ps1BuiltIn,@Spell
+
+" Numbers
+syn match ps1Number "\(\<\|-\)\@<=\(0[xX]\x\+\|\d\+\)\([KMGTP][B]\)\=\(\>\|-\)\@="
+syn match ps1Number "\(\(\<\|-\)\@<=\d\+\.\d*\|\.\d\+\)\([eE][-+]\=\d\+\)\=[dD]\="
+syn match ps1Number "\<\d\+[eE][-+]\=\d\+[dD]\=\>"
+syn match ps1Number "\<\d\+\([eE][-+]\=\d\+\)\=[dD]\>"
+
+" Constants
+syn match ps1Boolean "$\%(true\|false\)\>"
+syn match ps1Constant /\$null\>/
+syn match ps1BuiltIn "$^\|$?\|$_\|$\$"
+syn match ps1BuiltIn "$\%(args\|error\|foreach\|home\|input\)\>"
+syn match ps1BuiltIn "$\%(match\(es\)\?\|myinvocation\|host\|lastexitcode\)\>"
+syn match ps1BuiltIn "$\%(ofs\|shellid\|stacktrace\)\>"
+
+" Named Switch
+syn match ps1Label /\s-\w\+/
+
+" Folding blocks
+if !exists('g:ps1_nofold_blocks')
+ syn region ps1Block start=/{/ end=/}/ transparent fold
+endif
+
+if !exists('g:ps1_nofold_region')
+ syn region ps1Region start=/#region/ end=/#endregion/ transparent fold keepend extend
+endif
+
+if !exists('g:ps1_nofold_sig')
+ syn region ps1Signature start=/# SIG # Begin signature block/ end=/# SIG # End signature block/ transparent fold
+endif
+
+" Setup default color highlighting
+hi def link ps1Number Number
+hi def link ps1Block Block
+hi def link ps1Region Region
+hi def link ps1Exception Exception
+hi def link ps1Constant Constant
+hi def link ps1String String
+hi def link ps1Escape SpecialChar
+hi def link ps1InterpolationDelimiter Delimiter
+hi def link ps1Conditional Conditional
+hi def link ps1Cmdlet Function
+hi def link ps1Function Identifier
+hi def link ps1Variable Identifier
+hi def link ps1Boolean Boolean
+hi def link ps1Constant Constant
+hi def link ps1BuiltIn StorageClass
+hi def link ps1Type Type
+hi def link ps1ScopeModifier StorageClass
+hi def link ps1Comment Comment
+hi def link ps1CommentTodo Todo
+hi def link ps1CommentDoc Tag
+hi def link ps1CDocParam Identifier
+hi def link ps1Operator Operator
+hi def link ps1Repeat Repeat
+hi def link ps1RepeatAndCmdlet Repeat
+hi def link ps1Keyword Keyword
+hi def link ps1KeywordAndCmdlet Keyword
+hi def link ps1Label Label
+
+let b:current_syntax = "ps1"
diff --git a/runtime/syntax/ps1xml.vim b/runtime/syntax/ps1xml.vim
new file mode 100644
index 0000000..6ca9ed0
--- /dev/null
+++ b/runtime/syntax/ps1xml.vim
@@ -0,0 +1,51 @@
+" Vim syntax file
+" Language: Windows PowerShell
+" URL: https://github.com/PProvost/vim-ps1
+" Last Change: 2013 Jun 24
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:ps1xml_cpo_save = &cpo
+set cpo&vim
+
+doau syntax xml
+unlet b:current_syntax
+
+syn case ignore
+syn include @ps1xmlScriptBlock <sfile>:p:h/ps1.vim
+unlet b:current_syntax
+
+syn region ps1xmlScriptBlock
+ \ matchgroup=xmlTag start="<Script>"
+ \ matchgroup=xmlEndTag end="</Script>"
+ \ fold
+ \ contains=@ps1xmlScriptBlock
+ \ keepend
+syn region ps1xmlScriptBlock
+ \ matchgroup=xmlTag start="<ScriptBlock>"
+ \ matchgroup=xmlEndTag end="</ScriptBlock>"
+ \ fold
+ \ contains=@ps1xmlScriptBlock
+ \ keepend
+syn region ps1xmlScriptBlock
+ \ matchgroup=xmlTag start="<GetScriptBlock>"
+ \ matchgroup=xmlEndTag end="</GetScriptBlock>"
+ \ fold
+ \ contains=@ps1xmlScriptBlock
+ \ keepend
+syn region ps1xmlScriptBlock
+ \ matchgroup=xmlTag start="<SetScriptBlock>"
+ \ matchgroup=xmlEndTag end="</SetScriptBlock>"
+ \ fold
+ \ contains=@ps1xmlScriptBlock
+ \ keepend
+
+syn cluster xmlRegionHook add=ps1xmlScriptBlock
+
+let b:current_syntax = "ps1xml"
+
+let &cpo = s:ps1xml_cpo_save
+unlet s:ps1xml_cpo_save
+
diff --git a/runtime/syntax/psf.vim b/runtime/syntax/psf.vim
new file mode 100644
index 0000000..0971fe9
--- /dev/null
+++ b/runtime/syntax/psf.vim
@@ -0,0 +1,91 @@
+" Vim syntax file
+" Language: Software Distributor product specification file
+" (POSIX 1387.2-1995).
+" Maintainer: Rex Barzee <rex_barzee@hp.com>
+" Last change: 25 Apr 2001
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Product specification files are case sensitive
+syn case match
+
+syn keyword psfObject bundle category control_file depot distribution
+syn keyword psfObject end file fileset host installed_software media
+syn keyword psfObject product root subproduct vendor
+
+syn match psfUnquotString +[^"# ][^#]*+ contained
+syn region psfQuotString start=+"+ skip=+\\"+ end=+"+ contained
+
+syn match psfObjTag "\<[-_+A-Z0-9a-z]\+\(\.[-_+A-Z0-9a-z]\+\)*" contained
+syn match psfAttAbbrev ",\<\(fa\|fr\|[aclqrv]\)\(<\|>\|<=\|>=\|=\|==\)[^,]\+" contained
+syn match psfObjTags "\<[-_+A-Z0-9a-z]\+\(\.[-_+A-Z0-9a-z]\+\)*\(\s\+\<[-_+A-Z0-9a-z]\+\(\.[-_+A-Z0-9a-z]\+\)*\)*" contained
+
+syn match psfNumber "\<\d\+\>" contained
+syn match psfFloat "\<\d\+\>\(\.\<\d\+\>\)*" contained
+
+syn match psfLongDate "\<\d\d\d\d\d\d\d\d\d\d\d\d\.\d\d\>" contained
+
+syn keyword psfState available configured corrupt installed transient contained
+syn keyword psfPState applied committed superseded contained
+
+syn keyword psfBoolean false true contained
+
+
+"Some of the attributes covered by attUnquotString and attQuotString:
+" architecture category_tag control_directory copyright
+" create_date description directory file_permissions install_source
+" install_type location machine_type mod_date number os_name os_release
+" os_version pose_as_os_name pose_as_os_release readme revision
+" share_link title vendor_tag
+syn region psfAttUnquotString matchgroup=psfAttrib start=~^\s*[^# ]\+\s\+[^#" ]~rs=e-1 contains=psfUnquotString,psfComment end=~$~ keepend oneline
+
+syn region psfAttQuotString matchgroup=psfAttrib start=~^\s*[^# ]\+\s\+"~rs=e-1 contains=psfQuotString,psfComment skip=~\\"~ matchgroup=psfQuotString end=~"~ keepend
+
+
+" These regions are defined in attempt to do syntax checking for some
+" of the attributes.
+syn region psfAttTag matchgroup=psfAttrib start="^\s*tag\s\+" contains=psfObjTag,psfComment end="$" keepend oneline
+
+syn region psfAttSpec matchgroup=psfAttrib start="^\s*\(ancestor\|applied_patches\|applied_to\|contents\|corequisites\|exrequisites\|prerequisites\|software_spec\|supersedes\|superseded_by\)\s\+" contains=psfObjTag,psfAttAbbrev,psfComment end="$" keepend
+
+syn region psfAttTags matchgroup=psfAttrib start="^\s*all_filesets\s\+" contains=psfObjTags,psfComment end="$" keepend
+
+syn region psfAttNumber matchgroup=psfAttrib start="^\s*\(compressed_size\|instance_id\|media_sequence_number\|sequence_number\|size\)\s\+" contains=psfNumber,psfComment end="$" keepend oneline
+
+syn region psfAttTime matchgroup=psfAttrib start="^\s*\(create_time\|ctime\|mod_time\|mtime\|timestamp\)\s\+" contains=psfNumber,psfComment end="$" keepend oneline
+
+syn region psfAttFloat matchgroup=psfAttrib start="^\s*\(data_model_revision\|layout_version\)\s\+" contains=psfFloat,psfComment end="$" keepend oneline
+
+syn region psfAttLongDate matchgroup=psfAttrib start="^\s*install_date\s\+" contains=psfLongDate,psfComment end="$" keepend oneline
+
+syn region psfAttState matchgroup=psfAttrib start="^\s*\(state\)\s\+" contains=psfState,psfComment end="$" keepend oneline
+
+syn region psfAttPState matchgroup=psfAttrib start="^\s*\(patch_state\)\s\+" contains=psfPState,psfComment end="$" keepend oneline
+
+syn region psfAttBoolean matchgroup=psfAttrib start="^\s*\(is_kernel\|is_locatable\|is_patch\|is_protected\|is_reboot\|is_reference\|is_secure\|is_sparse\)\s\+" contains=psfBoolean,psfComment end="$" keepend oneline
+
+syn match psfComment "#.*$"
+
+
+" Define the default highlighting.
+" 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
+" looking for a sync location.
+syn sync lines=100
+
+let b:current_syntax = "psf"
diff --git a/runtime/syntax/psl.vim b/runtime/syntax/psl.vim
new file mode 100644
index 0000000..ff6e833
--- /dev/null
+++ b/runtime/syntax/psl.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: Property Specification Language (PSL)
+" Maintainer: Daniel Kho <daniel.kho@logik.haus>
+" Last Changed: 2021 Apr 17 by Daniel Kho
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read in VHDL syntax files
+runtime! syntax/vhdl.vim
+unlet b:current_syntax
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" case is not significant
+syn case ignore
+
+" Add ! character to keyword recognition.
+setlocal iskeyword+=33
+
+" PSL keywords
+syn keyword pslOperator A AF AG AX
+syn keyword pslOperator E EF EG EX
+syn keyword pslOperator F G U W X X!
+syn keyword pslOperator abort always assert assume async_abort
+syn keyword pslOperator before before! before!_ before_ bit bitvector boolean
+syn keyword pslOperator clock const countones cover
+syn keyword pslOperator default
+syn keyword pslOperator ended eventually!
+syn keyword pslOperator fairness fell for forall
+syn keyword pslOperator hdltype
+syn keyword pslOperator in inf inherit isunknown
+syn keyword pslOperator mutable
+syn keyword pslOperator never next next! next_a next_a! next_e next_e! next_event next_event! next_event_a next_event_a! next_event_e next_event_e! nondet nondet_vector numeric
+syn keyword pslOperator onehot onehot0
+syn keyword pslOperator property prev
+syn keyword pslOperator report restrict restrict! rose
+syn keyword pslOperator sequence stable string strong sync_abort
+syn keyword pslOperator union until until! until!_ until_
+syn keyword pslOperator vmode vpkg vprop vunit
+syn keyword pslOperator within
+"" Common keywords with VHDL
+"syn keyword pslOperator and is not or to
+
+" PSL operators
+syn match pslOperator "=>\||=>"
+syn match pslOperator "<-\|->"
+syn match pslOperator "@"
+
+
+"Modify the following as needed. The trade-off is performance versus functionality.
+syn sync minlines=600
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link pslSpecial Special
+hi def link pslStatement Statement
+hi def link pslCharacter Character
+hi def link pslString String
+hi def link pslVector Number
+hi def link pslBoolean Number
+hi def link pslTodo Todo
+hi def link pslFixme Fixme
+hi def link pslComment Comment
+hi def link pslNumber Number
+hi def link pslTime Number
+hi def link pslType Type
+hi def link pslOperator Operator
+hi def link pslError Error
+hi def link pslAttribute Special
+hi def link pslPreProc PreProc
+
+
+let b:current_syntax = "psl"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/ptcap.vim b/runtime/syntax/ptcap.vim
new file mode 100644
index 0000000..5db7bda
--- /dev/null
+++ b/runtime/syntax/ptcap.vim
@@ -0,0 +1,95 @@
+" Vim syntax file
+" Language: printcap/termcap database
+" Maintainer: Haakon Riiser <hakonrk@fys.uio.no>
+" URL: http://folk.uio.no/hakonrk/vim/syntax/ptcap.vim
+" Last Change: 2001 May 15
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Since I only highlight based on the structure of the databases, not
+" specific keywords, case sensitivity isn't required
+syn case ignore
+
+" Since everything that is not caught by the syntax patterns is assumed
+" to be an error, we start parsing 20 lines up, unless something else
+" is specified
+if exists("ptcap_minlines")
+ exe "syn sync lines=".ptcap_minlines
+else
+ syn sync lines=20
+endif
+
+" Highlight everything that isn't caught by the rules as errors,
+" except blank lines
+syn match ptcapError "^.*\S.*$"
+
+syn match ptcapLeadBlank "^\s\+" contained
+
+" `:' and `|' are delimiters for fields and names, and should not be
+" highlighted. Hence, they are linked to `NONE'
+syn match ptcapDelimiter "[:|]" contained
+
+" Escaped characters receive special highlighting
+syn match ptcapEscapedChar "\\." contained
+syn match ptcapEscapedChar "\^." contained
+syn match ptcapEscapedChar "\\\o\{3}" contained
+
+" A backslash at the end of a line will suppress the newline
+syn match ptcapLineCont "\\$" contained
+
+" A number follows the same rules as an integer in C
+syn match ptcapNumber "#\(+\|-\)\=\d\+"lc=1 contained
+syn match ptcapNumberError "#\d*[^[:digit:]:\\]"lc=1 contained
+syn match ptcapNumber "#0x\x\{1,8}"lc=1 contained
+syn match ptcapNumberError "#0x\X"me=e-1,lc=1 contained
+syn match ptcapNumberError "#0x\x\{9}"lc=1 contained
+syn match ptcapNumberError "#0x\x*[^[:xdigit:]:\\]"lc=1 contained
+
+" The `@' operator clears a flag (i.e., sets it to zero)
+" The `#' operator assigns a following number to the flag
+" The `=' operator assigns a string to the preceding flag
+syn match ptcapOperator "[@#=]" contained
+
+" Some terminal capabilities have special names like `#5' and `@1', and we
+" need special rules to match these properly
+syn match ptcapSpecialCap "\W[#@]\d" contains=ptcapDelimiter contained
+
+" If editing a termcap file, an entry in the database is terminated by
+" a (non-escaped) newline. Otherwise, it is terminated by a line which
+" does not start with a colon (:)
+if exists("b:ptcap_type") && b:ptcap_type[0] == 't'
+ syn region ptcapEntry start="^\s*[^[:space:]:]" end="[^\\]\(\\\\\)*$" end="^$" contains=ptcapNames,ptcapField,ptcapLeadBlank keepend
+else
+ syn region ptcapEntry start="^\s*[^[:space:]:]"me=e-1 end="^\s*[^[:space:]:#]"me=e-1 contains=ptcapNames,ptcapField,ptcapLeadBlank,ptcapComment
+endif
+syn region ptcapNames start="^\s*[^[:space:]:]" skip="[^\\]\(\\\\\)*\\:" end=":"me=e-1 contains=ptcapDelimiter,ptcapEscapedChar,ptcapLineCont,ptcapLeadBlank,ptcapComment keepend contained
+syn region ptcapField start=":" skip="[^\\]\(\\\\\)*\\$" end="[^\\]\(\\\\\)*:"me=e-1 end="$" contains=ptcapDelimiter,ptcapString,ptcapNumber,ptcapNumberError,ptcapOperator,ptcapLineCont,ptcapSpecialCap,ptcapLeadBlank,ptcapComment keepend contained
+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
+
+
+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"
+
+" vim: sts=4 sw=4 ts=8
diff --git a/runtime/syntax/purifylog.vim b/runtime/syntax/purifylog.vim
new file mode 100644
index 0000000..2143d9f
--- /dev/null
+++ b/runtime/syntax/purifylog.vim
@@ -0,0 +1,106 @@
+" Vim syntax file
+" Language: purify log files
+" Maintainer: Gautam H. Mudunuri <gmudunur@informatica.com>
+" Last Change: 2003 May 11
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Purify header
+syn match purifyLogHeader "^\*\*\*\*.*$"
+
+" Informational messages
+syn match purifyLogFIU "^FIU:.*$"
+syn match purifyLogMAF "^MAF:.*$"
+syn match purifyLogMIU "^MIU:.*$"
+syn match purifyLogSIG "^SIG:.*$"
+syn match purifyLogWPF "^WPF:.*$"
+syn match purifyLogWPM "^WPM:.*$"
+syn match purifyLogWPN "^WPN:.*$"
+syn match purifyLogWPR "^WPR:.*$"
+syn match purifyLogWPW "^WPW:.*$"
+syn match purifyLogWPX "^WPX:.*$"
+
+" Warning messages
+syn match purifyLogABR "^ABR:.*$"
+syn match purifyLogBSR "^BSR:.*$"
+syn match purifyLogBSW "^BSW:.*$"
+syn match purifyLogFMR "^FMR:.*$"
+syn match purifyLogMLK "^MLK:.*$"
+syn match purifyLogMSE "^MSE:.*$"
+syn match purifyLogPAR "^PAR:.*$"
+syn match purifyLogPLK "^PLK:.*$"
+syn match purifyLogSBR "^SBR:.*$"
+syn match purifyLogSOF "^SOF:.*$"
+syn match purifyLogUMC "^UMC:.*$"
+syn match purifyLogUMR "^UMR:.*$"
+
+" Corrupting messages
+syn match purifyLogABW "^ABW:.*$"
+syn match purifyLogBRK "^BRK:.*$"
+syn match purifyLogFMW "^FMW:.*$"
+syn match purifyLogFNH "^FNH:.*$"
+syn match purifyLogFUM "^FUM:.*$"
+syn match purifyLogMRE "^MRE:.*$"
+syn match purifyLogSBW "^SBW:.*$"
+
+" Fatal messages
+syn match purifyLogCOR "^COR:.*$"
+syn match purifyLogNPR "^NPR:.*$"
+syn match purifyLogNPW "^NPW:.*$"
+syn match purifyLogZPR "^ZPR:.*$"
+syn match purifyLogZPW "^ZPW:.*$"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+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
+
+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
+
+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
+
+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
+
+
+let b:current_syntax = "purifylog"
+
+" vim:ts=8
diff --git a/runtime/syntax/pyrex.vim b/runtime/syntax/pyrex.vim
new file mode 100644
index 0000000..b860658
--- /dev/null
+++ b/runtime/syntax/pyrex.vim
@@ -0,0 +1,51 @@
+" Vim syntax file
+" Language: Pyrex
+" Maintainer: Marco Barisione <marco.bari@people.it>
+" URL: http://marcobari.altervista.org/pyrex_vim.html
+" Last Change: 2009 Nov 09
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the Python syntax to start with
+runtime! syntax/python.vim
+unlet b:current_syntax
+
+" Pyrex extentions
+syn keyword pyrexStatement cdef typedef ctypedef sizeof
+syn keyword pyrexType int long short float double char object void
+syn keyword pyrexType signed unsigned
+syn keyword pyrexStructure struct union enum
+syn keyword pyrexInclude include cimport
+syn keyword pyrexAccess public private property readonly extern
+" If someome wants Python's built-ins highlighted probably he
+" also wants Pyrex's built-ins highlighted
+if exists("python_highlight_builtins") || exists("pyrex_highlight_builtins")
+ syn keyword pyrexBuiltin NULL
+endif
+
+" This deletes "from" from the keywords and re-adds it as a
+" match with lower priority than pyrexForFrom
+syn clear pythonInclude
+syn keyword pythonInclude import
+syn match pythonInclude "from"
+
+" With "for[^:]*\zsfrom" VIM does not match "for" anymore, so
+" I used the slower "\@<=" form
+syn match pyrexForFrom "\(for[^:]*\)\@<=from"
+
+" Default highlighting
+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
new file mode 100644
index 0000000..ff58325
--- /dev/null
+++ b/runtime/syntax/python.vim
@@ -0,0 +1,340 @@
+" Vim syntax file
+" Language: Python
+" Maintainer: Zvezdan Petkovic <zpetkovic@acm.org>
+" Last Change: 2023 Feb 26
+" Credits: Neil Schemenauer <nas@python.ca>
+" Dmitry Vasiliev
+"
+" This version is a major rewrite by Zvezdan Petkovic.
+"
+" - introduced highlighting of doctests
+" - updated keywords, built-ins, and exceptions
+" - corrected regular expressions for
+"
+" * functions
+" * decorators
+" * strings
+" * escapes
+" * numbers
+" * space error
+"
+" - corrected synchronization
+" - more highlighting is ON by default, except
+" - space error highlighting is OFF by default
+"
+" Optional highlighting can be controlled using these variables.
+"
+" let python_no_builtin_highlight = 1
+" let python_no_doctest_code_highlight = 1
+" let python_no_doctest_highlight = 1
+" let python_no_exception_highlight = 1
+" let python_no_number_highlight = 1
+" let python_space_error_highlight = 1
+"
+" All the options above can be switched on together.
+"
+" let python_highlight_all = 1
+"
+" The use of Python 2 compatible syntax highlighting can be enforced.
+" The straddling code (Python 2 and 3 compatible), up to Python 3.5,
+" will be also supported.
+"
+" let python_use_python2_syntax = 1
+"
+" This option will exclude all modern Python 3.6 or higher features.
+"
+
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+
+" Use of Python 2 and 3.5 or lower requested.
+if exists("python_use_python2_syntax")
+ runtime! syntax/python2.vim
+ finish
+endif
+
+" We need nocompatible mode in order to continue lines with backslashes.
+" Original setting will be restored.
+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/reference/lexical_analysis.html#keywords.
+" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt.
+" Exceptions come last at the end of each group (class and def below).
+"
+" The list can be checked using:
+"
+" python3 -c 'import keyword, pprint; pprint.pprint(keyword.kwlist + keyword.softkwlist, compact=True)'
+"
+syn keyword pythonStatement False None True
+syn keyword pythonStatement as assert break continue del global
+syn keyword pythonStatement lambda nonlocal pass return with yield
+syn keyword pythonStatement class def nextgroup=pythonFunction skipwhite
+syn keyword pythonConditional elif else if
+syn keyword pythonRepeat for while
+syn keyword pythonOperator and in is not or
+syn keyword pythonException except finally raise try
+syn keyword pythonInclude from import
+syn keyword pythonAsync async await
+
+" Soft keywords
+" These keywords do not mean anything unless used in the right context.
+" See https://docs.python.org/3/reference/lexical_analysis.html#soft-keywords
+" for more on this.
+syn match pythonConditional "^\s*\zscase\%(\s\+.*:.*$\)\@="
+syn match pythonConditional "^\s*\zsmatch\%(\s\+.*:\s*\%(#.*\)\=$\)\@="
+
+" Decorators
+" A dot must be allowed because of @MyClass.myfunc decorators.
+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
+
+" Triple-quoted strings can contain doctests.
+syn region pythonString matchgroup=pythonQuotes
+ \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
+ \ contains=pythonEscape,@Spell
+syn region pythonString matchgroup=pythonTripleQuotes
+ \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
+ \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell
+syn region pythonRawString matchgroup=pythonQuotes
+ \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
+ \ contains=@Spell
+syn region pythonRawString matchgroup=pythonTripleQuotes
+ \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend
+ \ contains=pythonSpaceError,pythonDoctest,@Spell
+
+syn match pythonEscape +\\[abfnrtv'"\\]+ contained
+syn match pythonEscape "\\\o\{1,3}" contained
+syn match pythonEscape "\\x\x\{2}" contained
+syn match pythonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained
+" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/
+syn match pythonEscape "\\N{\a\+\%(\s\a\+\)*}" contained
+syn match pythonEscape "\\$"
+
+" 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
+" because of a possible leading or trailing decimal point.
+" The expressions below ensure that all valid number literals are
+" highlighted, and invalid number literals are not. For example,
+"
+" - a decimal point in '4.' at the end of a line is highlighted,
+" - a second dot in 1.0.0 is not highlighted,
+" - 08 is not highlighted,
+" - 08e0 or 08j are highlighted,
+"
+" and so on, as specified in the 'Python Language Reference'.
+" https://docs.python.org/reference/lexical_analysis.html#numeric-literals
+if !exists("python_no_number_highlight")
+ " numbers (including longs and complex)
+ syn match pythonNumber "\<0[oO]\=\o\+[Ll]\=\>"
+ syn match pythonNumber "\<0[xX]\x\+[Ll]\=\>"
+ syn match pythonNumber "\<0[bB][01]\+[Ll]\=\>"
+ syn match pythonNumber "\<\%([1-9]\d*\|0\)[Ll]\=\>"
+ syn match pythonNumber "\<\d\+[jJ]\>"
+ syn match pythonNumber "\<\d\+[eE][+-]\=\d\+[jJ]\=\>"
+ syn match pythonNumber
+ \ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@="
+ syn match pythonNumber
+ \ "\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>"
+endif
+
+" Group the built-ins in the order in the 'Python Library Reference' for
+" easier comparison.
+" https://docs.python.org/library/constants.html
+" http://docs.python.org/library/functions.html
+" Python built-in functions are in alphabetical order.
+"
+" The list can be checked using:
+"
+" python3 -c 'import builtins, pprint; pprint.pprint(dir(builtins), compact=True)'
+"
+" The constants added by the `site` module are not listed below because they
+" should not be used in programs, only in interactive interpreter.
+" Similarly for some other attributes and functions `__`-enclosed from the
+" output of the above command.
+"
+if !exists("python_no_builtin_highlight")
+ " built-in constants
+ " 'False', 'True', and 'None' are also reserved words in Python 3
+ syn keyword pythonBuiltin False True None
+ syn keyword pythonBuiltin NotImplemented Ellipsis __debug__
+ " constants added by the `site` module
+ syn keyword pythonBuiltin quit exit copyright credits license
+ " built-in functions
+ syn keyword pythonBuiltin abs all any ascii bin bool breakpoint bytearray
+ syn keyword pythonBuiltin bytes callable chr classmethod compile complex
+ syn keyword pythonBuiltin delattr dict dir divmod enumerate eval exec
+ syn keyword pythonBuiltin filter float format frozenset getattr globals
+ syn keyword pythonBuiltin hasattr hash help hex id input int isinstance
+ syn keyword pythonBuiltin issubclass iter len list locals map max
+ syn keyword pythonBuiltin memoryview min next object oct open ord pow
+ syn keyword pythonBuiltin print property range repr reversed round set
+ syn keyword pythonBuiltin setattr slice sorted staticmethod str sum super
+ syn keyword pythonBuiltin tuple type vars zip __import__
+ " avoid highlighting attributes as builtins
+ 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.
+" http://docs.python.org/library/exceptions.html
+if !exists("python_no_exception_highlight")
+ " builtin base exceptions (used mostly as base classes for other exceptions)
+ syn keyword pythonExceptions BaseException Exception
+ syn keyword pythonExceptions ArithmeticError BufferError LookupError
+ " builtin exceptions (actually raised)
+ syn keyword pythonExceptions AssertionError AttributeError EOFError
+ syn keyword pythonExceptions FloatingPointError GeneratorExit ImportError
+ syn keyword pythonExceptions IndentationError IndexError KeyError
+ syn keyword pythonExceptions KeyboardInterrupt MemoryError
+ syn keyword pythonExceptions ModuleNotFoundError NameError
+ syn keyword pythonExceptions NotImplementedError OSError OverflowError
+ syn keyword pythonExceptions RecursionError ReferenceError RuntimeError
+ syn keyword pythonExceptions StopAsyncIteration StopIteration SyntaxError
+ syn keyword pythonExceptions SystemError SystemExit TabError TypeError
+ syn keyword pythonExceptions UnboundLocalError UnicodeDecodeError
+ syn keyword pythonExceptions UnicodeEncodeError UnicodeError
+ syn keyword pythonExceptions UnicodeTranslateError ValueError
+ syn keyword pythonExceptions ZeroDivisionError
+ " builtin exception aliases for OSError
+ syn keyword pythonExceptions EnvironmentError IOError WindowsError
+ " builtin OS exceptions in Python 3
+ syn keyword pythonExceptions BlockingIOError BrokenPipeError
+ syn keyword pythonExceptions ChildProcessError ConnectionAbortedError
+ syn keyword pythonExceptions ConnectionError ConnectionRefusedError
+ syn keyword pythonExceptions ConnectionResetError FileExistsError
+ syn keyword pythonExceptions FileNotFoundError InterruptedError
+ syn keyword pythonExceptions IsADirectoryError NotADirectoryError
+ syn keyword pythonExceptions PermissionError ProcessLookupError TimeoutError
+ " builtin warnings
+ syn keyword pythonExceptions BytesWarning DeprecationWarning FutureWarning
+ syn keyword pythonExceptions ImportWarning PendingDeprecationWarning
+ syn keyword pythonExceptions ResourceWarning RuntimeWarning
+ syn keyword pythonExceptions SyntaxWarning UnicodeWarning
+ syn keyword pythonExceptions UserWarning Warning
+endif
+
+if exists("python_space_error_highlight")
+ " trailing whitespace
+ syn match pythonSpaceError display excludenl "\s\+$"
+ " mixed tabs and spaces
+ syn match pythonSpaceError display " \+\t"
+ syn match pythonSpaceError display "\t\+ "
+endif
+
+" Do not spell doctests inside strings.
+" Notice that the end of a string, either ''', or """, will end the contained
+" doctest too. Thus, we do *not* need to have it as an end pattern.
+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,pythonFunction,@Spell
+ syn region pythonDoctestValue
+ \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
+ \ contained
+ else
+ syn region pythonDoctest
+ \ start="^\s*>>>" end="^\s*$"
+ \ contained contains=@NoSpell
+ endif
+endif
+
+" Sync at the beginning of class, function, or method definition.
+syn sync match pythonSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]"
+
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2 ts=8 noet:
diff --git a/runtime/syntax/python2.vim b/runtime/syntax/python2.vim
new file mode 100644
index 0000000..3b30eab
--- /dev/null
+++ b/runtime/syntax/python2.vim
@@ -0,0 +1,345 @@
+" Vim syntax file
+" Language: Python 2
+" Maintainer: Zvezdan Petkovic <zpetkovic@acm.org>
+" Last Change: 2016 Oct 29
+" Credits: Neil Schemenauer <nas@python.ca>
+" Dmitry Vasiliev
+"
+" This version is a major rewrite by Zvezdan Petkovic.
+"
+" - introduced highlighting of doctests
+" - updated keywords, built-ins, and exceptions
+" - corrected regular expressions for
+"
+" * functions
+" * decorators
+" * strings
+" * escapes
+" * numbers
+" * space error
+"
+" - corrected synchronization
+" - more highlighting is ON by default, except
+" - space error highlighting is OFF by default
+"
+" Optional highlighting can be controlled using these variables.
+"
+" let python_no_builtin_highlight = 1
+" let python_no_doctest_code_highlight = 1
+" let python_no_doctest_highlight = 1
+" let python_no_exception_highlight = 1
+" let python_no_number_highlight = 1
+" let python_space_error_highlight = 1
+"
+" All the options above can be switched on together.
+"
+" let python_highlight_all = 1
+"
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" NOTE: This file is a copy of the last commit of runtime/syntax/python.vim
+" that still supported Python 2. There is support for Python 3, up to 3.5,
+" and it was kept in the file as is, because it supports the straddling code
+" (Python 2 and 3 compatible) better.
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+
+" We need nocompatible mode in order to continue lines with backslashes.
+" Original setting will be restored.
+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,
+" https://docs.python.org/3/reference/lexical_analysis.html#keywords.
+" Groups are in the order presented in NAMING CONVENTIONS in syntax.txt.
+" Exceptions come last at the end of each group (class and def below).
+"
+" Keywords 'with' and 'as' are new in Python 2.6
+" (use 'from __future__ import with_statement' in Python 2.5).
+"
+" Some compromises had to be made to support both Python 3 and 2.
+" We include Python 3 features, but when a definition is duplicated,
+" the last definition takes precedence.
+"
+" - 'False', 'None', and 'True' are keywords in Python 3 but they are
+" built-ins in 2 and will be highlighted as built-ins below.
+" - 'exec' is a built-in in Python 3 and will be highlighted as
+" built-in below.
+" - 'nonlocal' is a keyword in Python 3 and will be highlighted.
+" - 'print' is a built-in in Python 3 and will be highlighted as
+" 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 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
+syn keyword pythonConditional elif else if
+syn keyword pythonRepeat for while
+syn keyword pythonOperator and in is not or
+syn keyword pythonException except finally raise try
+syn keyword pythonInclude from import
+syn keyword pythonAsync async await
+
+" Decorators (new in Python 2.4)
+" A dot must be allowed because of @MyClass.myfunc decorators.
+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
+
+" Triple-quoted strings can contain doctests.
+syn region pythonString matchgroup=pythonQuotes
+ \ start=+[uU]\=\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
+ \ contains=pythonEscape,@Spell
+syn region pythonString matchgroup=pythonTripleQuotes
+ \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend
+ \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell
+syn region pythonRawString matchgroup=pythonQuotes
+ \ start=+[uU]\=[rR]\z(['"]\)+ end="\z1" skip="\\\\\|\\\z1"
+ \ contains=@Spell
+syn region pythonRawString matchgroup=pythonTripleQuotes
+ \ start=+[uU]\=[rR]\z('''\|"""\)+ end="\z1" keepend
+ \ contains=pythonSpaceError,pythonDoctest,@Spell
+
+syn match pythonEscape +\\[abfnrtv'"\\]+ contained
+syn match pythonEscape "\\\o\{1,3}" contained
+syn match pythonEscape "\\x\x\{2}" contained
+syn match pythonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained
+" Python allows case-insensitive Unicode IDs: http://www.unicode.org/charts/
+syn match pythonEscape "\\N{\a\+\%(\s\a\+\)*}" contained
+syn match pythonEscape "\\$"
+
+" 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
+" because of a possible leading or trailing decimal point.
+" The expressions below ensure that all valid number literals are
+" highlighted, and invalid number literals are not. For example,
+"
+" - a decimal point in '4.' at the end of a line is highlighted,
+" - a second dot in 1.0.0 is not highlighted,
+" - 08 is not highlighted,
+" - 08e0 or 08j are highlighted,
+"
+" and so on, as specified in the 'Python Language Reference'.
+" https://docs.python.org/2/reference/lexical_analysis.html#numeric-literals
+" https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals
+if !exists("python_no_number_highlight")
+ " numbers (including longs and complex)
+ syn match pythonNumber "\<0[oO]\=\o\+[Ll]\=\>"
+ syn match pythonNumber "\<0[xX]\x\+[Ll]\=\>"
+ syn match pythonNumber "\<0[bB][01]\+[Ll]\=\>"
+ syn match pythonNumber "\<\%([1-9]\d*\|0\)[Ll]\=\>"
+ syn match pythonNumber "\<\d\+[jJ]\>"
+ syn match pythonNumber "\<\d\+[eE][+-]\=\d\+[jJ]\=\>"
+ syn match pythonNumber
+ \ "\<\d\+\.\%([eE][+-]\=\d\+\)\=[jJ]\=\%(\W\|$\)\@="
+ syn match pythonNumber
+ \ "\%(^\|\W\)\zs\d*\.\d\+\%([eE][+-]\=\d\+\)\=[jJ]\=\>"
+endif
+
+" Group the built-ins in the order in the 'Python Library Reference' for
+" easier comparison.
+" https://docs.python.org/2/library/constants.html
+" https://docs.python.org/3/library/constants.html
+" http://docs.python.org/2/library/functions.html
+" http://docs.python.org/3/library/functions.html
+" http://docs.python.org/2/library/functions.html#non-essential-built-in-functions
+" http://docs.python.org/3/library/functions.html#non-essential-built-in-functions
+" Python built-in functions are in alphabetical order.
+if !exists("python_no_builtin_highlight")
+ " built-in constants
+ " 'False', 'True', and 'None' are also reserved words in Python 3
+ syn keyword pythonBuiltin False True None
+ syn keyword pythonBuiltin NotImplemented Ellipsis __debug__
+ " built-in functions
+ syn keyword pythonBuiltin abs all any bin bool bytearray callable chr
+ syn keyword pythonBuiltin classmethod compile complex delattr dict dir
+ syn keyword pythonBuiltin divmod enumerate eval filter float format
+ syn keyword pythonBuiltin frozenset getattr globals hasattr hash
+ syn keyword pythonBuiltin help hex id input int isinstance
+ syn keyword pythonBuiltin issubclass iter len list locals map max
+ syn keyword pythonBuiltin memoryview min next object oct open ord pow
+ syn keyword pythonBuiltin print property range repr reversed round set
+ syn keyword pythonBuiltin setattr slice sorted staticmethod str
+ syn keyword pythonBuiltin sum super tuple type vars zip __import__
+ " Python 2 only
+ syn keyword pythonBuiltin basestring cmp execfile file
+ syn keyword pythonBuiltin long raw_input reduce reload unichr
+ syn keyword pythonBuiltin unicode xrange
+ " Python 3 only
+ syn keyword pythonBuiltin ascii bytes exec
+ " 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,pythonFunction,pythonAsync
+ \ transparent
+endif
+
+" From the 'Python Library Reference' class hierarchy at the bottom.
+" http://docs.python.org/2/library/exceptions.html
+" http://docs.python.org/3/library/exceptions.html
+if !exists("python_no_exception_highlight")
+ " builtin base exceptions (used mostly as base classes for other exceptions)
+ syn keyword pythonExceptions BaseException Exception
+ syn keyword pythonExceptions ArithmeticError BufferError
+ syn keyword pythonExceptions LookupError
+ " builtin base exceptions removed in Python 3
+ syn keyword pythonExceptions EnvironmentError StandardError
+ " builtin exceptions (actually raised)
+ syn keyword pythonExceptions AssertionError AttributeError
+ syn keyword pythonExceptions EOFError FloatingPointError GeneratorExit
+ syn keyword pythonExceptions ImportError IndentationError
+ syn keyword pythonExceptions IndexError KeyError KeyboardInterrupt
+ syn keyword pythonExceptions MemoryError NameError NotImplementedError
+ syn keyword pythonExceptions OSError OverflowError ReferenceError
+ syn keyword pythonExceptions RuntimeError StopIteration SyntaxError
+ syn keyword pythonExceptions SystemError SystemExit TabError TypeError
+ syn keyword pythonExceptions UnboundLocalError UnicodeError
+ syn keyword pythonExceptions UnicodeDecodeError UnicodeEncodeError
+ syn keyword pythonExceptions UnicodeTranslateError ValueError
+ syn keyword pythonExceptions ZeroDivisionError
+ " builtin OS exceptions in Python 3
+ syn keyword pythonExceptions BlockingIOError BrokenPipeError
+ syn keyword pythonExceptions ChildProcessError ConnectionAbortedError
+ syn keyword pythonExceptions ConnectionError ConnectionRefusedError
+ syn keyword pythonExceptions ConnectionResetError FileExistsError
+ syn keyword pythonExceptions FileNotFoundError InterruptedError
+ syn keyword pythonExceptions IsADirectoryError NotADirectoryError
+ syn keyword pythonExceptions PermissionError ProcessLookupError
+ syn keyword pythonExceptions RecursionError StopAsyncIteration
+ syn keyword pythonExceptions TimeoutError
+ " builtin exceptions deprecated/removed in Python 3
+ syn keyword pythonExceptions IOError VMSError WindowsError
+ " builtin warnings
+ syn keyword pythonExceptions BytesWarning DeprecationWarning FutureWarning
+ syn keyword pythonExceptions ImportWarning PendingDeprecationWarning
+ syn keyword pythonExceptions RuntimeWarning SyntaxWarning UnicodeWarning
+ syn keyword pythonExceptions UserWarning Warning
+ " builtin warnings in Python 3
+ syn keyword pythonExceptions ResourceWarning
+endif
+
+if exists("python_space_error_highlight")
+ " trailing whitespace
+ syn match pythonSpaceError display excludenl "\s\+$"
+ " mixed tabs and spaces
+ syn match pythonSpaceError display " \+\t"
+ syn match pythonSpaceError display "\t\+ "
+endif
+
+" Do not spell doctests inside strings.
+" Notice that the end of a string, either ''', or """, will end the contained
+" doctest too. Thus, we do *not* need to have it as an end pattern.
+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,pythonFunction,@Spell
+ syn region pythonDoctestValue
+ \ start=+^\s*\%(>>>\s\|\.\.\.\s\|"""\|'''\)\@!\S\++ end="$"
+ \ contained
+ else
+ syn region pythonDoctest
+ \ start="^\s*>>>" end="^\s*$"
+ \ contained contains=@NoSpell
+ endif
+endif
+
+" Sync at the beginning of class, function, or method definition.
+syn sync match pythonSync grouphere NONE "^\%(def\|class\)\s\+\h\w*\s*[(:]"
+
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2 ts=8 noet:
diff --git a/runtime/syntax/qb64.vim b/runtime/syntax/qb64.vim
new file mode 100644
index 0000000..a777e14
--- /dev/null
+++ b/runtime/syntax/qb64.vim
@@ -0,0 +1,409 @@
+" Vim syntax file
+" Language: QB64
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Jan 21
+
+" Prelude {{{1
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" syn iskeyword set after sourcing of basic.vim
+
+syn case ignore
+
+let s:prefix = search('\c^\s*$NOPREFIX\>', 'n') ? '_\=' : '_'
+
+" Statements {{{1
+
+let s:statements =<< trim EOL " {{{2
+ acceptfiledrop
+ allowfullscreen
+ assert
+ console
+ consolecursor
+ consolefont
+ consoletitle
+ continue
+ copypalette
+ define
+ delay
+ depthbuffer
+ displayorder
+ dontblend
+ echo
+ exit\s\+\%(select\|case\)
+ finishdrop
+ freefont
+ freeimage
+ icon
+ keyclear
+ limit
+ maptriangle
+ memcopy
+ memfill
+ memfree
+ memput
+ mousehide
+ mousemove
+ mouseshow
+ printimage
+ printstring
+ putimage
+ screenclick
+ screenhide
+ screenmove
+ screenprint
+ screenshow
+ setalpha
+ sndbal
+ sndclose
+ sndlimit
+ sndloop
+ sndpause
+ sndplay
+ sndplaycopy
+ sndplayfile
+ sndraw
+ sndrawdone
+ sndsetpos
+ sndstop
+ sndvol
+ title
+EOL
+" }}}
+
+for s in s:statements
+ exe 'syn match qb64Statement "\<' .. s:prefix .. s .. '\>" contained contains=qb64Underscore'
+endfor
+
+" Functions {{{1
+
+let s:functions =<< trim EOL " {{{2
+ acos
+ acosh
+ alpha
+ alpha32
+ arccot
+ arccsc
+ arcsec
+ asin
+ asinh
+ atan2
+ atanh
+ axis
+ backgroundcolor
+ blue
+ blue32
+ button
+ buttonchange
+ ceil
+ cinp
+ commandcount
+ connected
+ connectionaddress
+ connectionaddress$
+ consoleinput
+ copyimage
+ cot
+ coth
+ cosh
+ csc
+ csch
+ cv
+ cwd$
+ d2g
+ d2r
+ defaultcolor
+ deflate$
+ desktopheight
+ desktopwidth
+ device$
+ deviceinput
+ devices
+ dir$
+ direxists
+ droppedfile
+ droppedfile$
+ errorline
+ errormessage$
+ exit
+ fileexists
+ fontheight
+ fontwidth
+ freetimer
+ g2d
+ g2r
+ green
+ green32
+ height
+ hypot
+ inclerrorfile$
+ inclerrorline
+ inflate$
+ instrrev
+ keyhit
+ keydown
+ lastaxis
+ lastbutton
+ lastwheel
+ loadfont
+ loadimage
+ mem
+ memelement
+ memexists
+ memimage
+ memnew
+ memsound
+ mk$
+ mousebutton
+ mouseinput
+ mousemovementx
+ mousemovementy
+ mousepipeopen
+ mousewheel
+ mousex
+ mousey
+ newimage
+ offset
+ openclient
+ os$
+ pi
+ pixelsize
+ printwidth
+ r2d
+ r2g
+ red
+ red32
+ readbit
+ resetbit
+ resizeheight
+ resizewidth
+ rgb
+ rgb32
+ rgba
+ rgba32
+ round
+ sec
+ sech
+ screenexists
+ screenimage
+ screenx
+ screeny
+ setbit
+ shellhide
+ shl
+ shr
+ sinh
+ sndcopy
+ sndgetpos
+ sndlen
+ sndopen
+ sndopenraw
+ sndpaused
+ sndplaying
+ sndrate
+ sndrawlen
+ startdir$
+ strcmp
+ stricmp
+ tanh
+ title$
+ togglebit
+ totaldroppedfiles
+ trim$
+ wheel
+ width
+ windowhandle
+ windowhasfocus
+EOL
+" }}}
+
+for f in s:functions
+ exe 'syn match qb64Function "\<' .. s:prefix .. f .. '\>" contains=qb64Underscore'
+endfor
+
+" Functions and statements (same name) {{{1
+
+let s:common =<< trim EOL " {{{2
+ autodisplay
+ blend
+ blink
+ capslock
+ clearcolor
+ clipboard$
+ clipboardimage
+ controlchr
+ dest
+ display
+ font
+ fullscreen
+ mapunicode
+ memget
+ numlock
+ palettecolor
+ printmode
+ resize
+ screenicon
+ scrolllock
+ source
+EOL
+" }}}
+
+for c in s:common
+ exe 'syn match qb64Statement "\<' .. s:prefix .. c .. '\>" contains=qb64Underscore contained'
+ exe 'syn match qb64Function "\<' .. s:prefix .. c .. '\>" contains=qb64Underscore'
+endfor
+
+" Keywords {{{1
+
+" Non-prefixed keywords {{{2
+" TIMER FREE
+" _DEPTH_BUFFER LOCK
+syn keyword qb64Keyword free lock
+
+let s:keywords =<< trim EOL " {{{2
+ all
+ anticlockwise
+ behind
+ clear
+ clip
+ console
+ dontwait
+ explicit
+ explicitarray
+ fillbackground
+ hardware
+ hardware1
+ hide
+ keepbackground
+ middle
+ none
+ off
+ only
+ onlybackground
+ ontop
+ openconnection
+ openhost
+ preserve
+ seamless
+ smooth
+ smoothshrunk
+ smoothstretched
+ software
+ squarepixels
+ stretch
+ toggle
+EOL
+" }}}
+
+for k in s:keywords
+ exe 'syn match qb64Keyword "\<' .. s:prefix .. k .. '\>" contains=qb64Underscore'
+endfor
+
+syn match qb64Underscore "\<_" contained conceal transparent
+
+" Source QuickBASIC syntax {{{1
+runtime! syntax/basic.vim
+
+" add after the BASIC syntax file is sourced so cluster already exists
+syn cluster basicStatements add=qb64Statement,qb64Metacommand,qb64IfMetacommand
+syn cluster basicLineIdentifier add=qb64LineLabel
+syn cluster qb64NotTop contains=@basicNotTop,qb64Metavariable
+
+syn iskeyword @,48-57,.,_,!,#,$,%,&,`
+
+" Unsupported QuickBASIC features {{{1
+" TODO: add linux only missing features
+syn keyword qb64Unsupported alias any byval calls cdecl erdev erdev$ fileattr
+syn keyword qb64Unsupported fre ioctl ioctl$ pen play setmem signal uevent
+syn keyword qb64Unsupported tron troff
+syn match qb64Unsupported "\<declare\%(\s\+\%(sub\|function\)\>\)\@="
+syn match qb64Unsupported "\<\%(date\|time\)$\ze\s*=" " statements only
+syn match qb64Unsupported "\<def\zs\s\+FN"
+syn match qb64Unsupported "\<\%(exit\|end\)\s\+def\>"
+syn match qb64Unsupported "\<width\s\+lprint\>"
+
+" Types {{{1
+syn keyword qb64Type _BIT _BYTE _FLOAT _INTEGER64 _MEM _OFFSET _UNSIGNED
+
+" Type suffixes {{{1
+if exists("basic_type_suffixes")
+ " TODO: handle leading word boundary and __+ prefix
+ syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=\~\=`\%(\d\+\)\="
+ syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=\~\=\%(%\|%%\|&\|&&\|%&\)"
+ syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=\%(!\|##\|#\)"
+ syn match qb64TypeSuffix "\%(\a[[:alnum:]._]*\)\@<=$\%(\d\+\)\="
+endif
+
+" Numbers {{{1
+
+" Integers
+syn match qb64Number "-\=&b[01]\+&\>\="
+
+syn match qb64Number "-\=\<[01]\~\=`\>"
+syn match qb64Number "-\=\<\d\+`\d\+\>"
+
+syn match qb64Number "-\=\<\d\+\%(%%\|&&\|%&\)\>"
+syn match qb64Number "\<\d\+\~\%(%%\|&&\|%&\)\>"
+
+syn match qb64Number "-\=\<&b[01]\+\%(%%\|&&\|%&\)\>"
+syn match qb64Number "\<&b[01]\+\~\%(%%\|&&\|%&\)\>"
+
+syn match qb64Number "-\=\<&o\=\o\+\%(%%\|&&\|%&\)\>"
+syn match qb64Number "\<&o\=\o\+\~\%(%%\|&&\|%&\)\>"
+
+syn match qb64Number "-\=\<&h\x\+\%(%%\|&&\|%&\)\>"
+syn match qb64Number "\<&h\x\+\~\%(%%\|&&\|%&\)\>"
+
+" Floats
+syn match qb64Float "-\=\<\d\+\.\=\d*##\>"
+syn match qb64Float "-\=\<\.\d\+##\>"
+
+" Line numbers and labels {{{1
+syn match qb64LineLabel "\%(_\{2,}\)\=\a[[:alnum:]._]*[[:alnum:]]\ze\s*:" nextgroup=@basicStatements skipwhite contained
+
+" Metacommands {{{1
+syn match qb64Metacommand contained "$NOPREFIX\>"
+syn match qb64Metacommand contained "$ASSERTS\%(:CONSOLE\)\=\>"
+syn match qb64Metacommand contained "$CHECKING:\%(ON\|OFF\)\>"
+syn match qb64Metacommand contained "$COLOR:\%(0\|32\)\>"
+syn match qb64Metacommand contained "$CONSOLE\%(:ONLY\)\=\>"
+syn match qb64Metacommand contained "$EXEICON\s*:\s*'[^']\+'"
+syn match qb64Metacommand contained "$ERROR\>"
+syn match qb64Metacommand contained "$LET\>"
+syn match qb64Metacommand contained "$RESIZE:\%(ON\|OFF\|STRETCH\|SMOOTH\)\>"
+syn match qb64Metacommand contained "$SCREEN\%(HIDE\|SHOW\)\>"
+syn match qb64Metacommand contained "$VERSIONINFO\s*:.*"
+syn match qb64Metacommand contained "$VIRTUALKEYBOARD:\%(ON\|OFF\)\>"
+
+syn region qb64IfMetacommand contained matchgroup=qb64Metacommand start="$\%(IF\|ELSEIF\)\>" end="\<THEN\>" oneline transparent contains=qb64Metavariable
+syn match qb64Metacommand contained "$\%(ELSE\|END\s*IF\)\>"
+
+syn keyword qb64Metavariable contained defined undefined
+syn keyword qb64Metavariable contained windows win linux mac maxosx
+syn keyword qb64Metavariable contained 32bit 64bit version
+
+" Default Highlighting {{{1
+hi def link qb64Float basicFloat
+hi def link qb64Function Function
+hi def link qb64Keyword Keyword
+hi def link qb64LineLabel basicLineLabel
+hi def link qb64Metacommand PreProc
+hi def link qb64Metavariable Identifier
+hi def link qb64Number basicNumber
+hi def link qb64Statement Statement
+hi def link qb64TypeSuffix basicTypeSuffix
+hi def link qb64Type Type
+hi def link qb64Unsupported Error
+
+" Postscript {{{1
+let b:current_syntax = "qb64"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/syntax/qf.vim b/runtime/syntax/qf.vim
new file mode 100644
index 0000000..5c987a9
--- /dev/null
+++ b/runtime/syntax/qf.vim
@@ -0,0 +1,24 @@
+" Vim syntax file
+" Language: Quickfix window
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last change: 2001 Jan 15
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A bunch of useful C keywords
+syn match qfFileName "^[^|]*" nextgroup=qfSeparator
+syn match qfSeparator "|" nextgroup=qfLineNr contained
+syn match qfLineNr "[^|]*" contained contains=qfError
+syn match qfError "error" contained
+
+" The default highlighting.
+hi def link qfFileName Directory
+hi def link qfLineNr LineNr
+hi def link qfError Error
+
+let b:current_syntax = "qf"
+
+" vim: ts=8
diff --git a/runtime/syntax/quake.vim b/runtime/syntax/quake.vim
new file mode 100644
index 0000000..7db5310
--- /dev/null
+++ b/runtime/syntax/quake.vim
@@ -0,0 +1,170 @@
+" Vim syntax file
+" 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
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-,+
+
+syn keyword quakeTodo contained TODO FIXME XXX NOTE
+
+syn region quakeComment display oneline start='//' end='$' end=';'
+ \ keepend contains=quakeTodo,@Spell
+
+syn region quakeString display oneline start=+"+ skip=+\\\\\|\\"+
+ \ end=+"\|$+ contains=quakeNumbers,
+ \ @quakeCommands,@quake3Colors
+
+syn case ignore
+
+syn match quakeNumbers display transparent '\<-\=\d\|\.\d'
+ \ contains=quakeNumber,quakeFloat,
+ \ quakeOctalError,quakeOctal
+syn match quakeNumber contained display '\d\+\>'
+syn match quakeFloat contained display '\d\+\.\d*'
+syn match quakeFloat contained display '\.\d\+\>'
+
+if exists("quake_is_quake1") || exists("quake_is_quake2")
+ syn match quakeOctal contained display '0\o\+\>'
+ \ contains=quakeOctalZero
+ syn match quakeOctalZero contained display '\<0'
+ syn match quakeOctalError contained display '0\o*[89]\d*'
+endif
+
+syn cluster quakeCommands contains=quakeCommand,quake1Command,
+ \ quake12Command,Quake2Command,Quake23Command,
+ \ Quake3Command
+
+syn keyword quakeCommand +attack +back +forward +left +lookdown +lookup
+syn keyword quakeCommand +mlook +movedown +moveleft +moveright +moveup
+syn keyword quakeCommand +right +speed +strafe -attack -back bind
+syn keyword quakeCommand bindlist centerview clear connect cvarlist dir
+syn keyword quakeCommand disconnect dumpuser echo error exec -forward
+syn keyword quakeCommand god heartbeat joy_advancedupdate kick kill
+syn keyword quakeCommand killserver -left -lookdown -lookup map
+syn keyword quakeCommand messagemode messagemode2 -mlook modellist
+syn keyword quakeCommand -movedown -moveleft -moveright -moveup play
+syn keyword quakeCommand quit rcon reconnect record -right say say_team
+syn keyword quakeCommand screenshot serverinfo serverrecord serverstop
+syn keyword quakeCommand set sizedown sizeup snd_restart soundinfo
+syn keyword quakeCommand soundlist -speed spmap status -strafe stopsound
+syn keyword quakeCommand toggleconsole unbind unbindall userinfo pause
+syn keyword quakeCommand vid_restart viewpos wait weapnext weapprev
+
+if exists("quake_is_quake1")
+ syn keyword quake1Command sv
+endif
+
+if exists("quake_is_quake1") || exists("quake_is_quake2")
+ syn keyword quake12Command +klook alias cd impulse link load save
+ syn keyword quake12Command timerefresh changing info loading
+ syn keyword quake12Command pingservers playerlist players score
+endif
+
+if exists("quake_is_quake2")
+ syn keyword quake2Command cmd demomap +use condump download drop gamemap
+ syn keyword quake2Command give gun_model setmaster sky sv_maplist wave
+ syn keyword quake2Command cmdlist gameversiona gun_next gun_prev invdrop
+ syn keyword quake2Command inven invnext invnextp invnextw invprev
+ syn keyword quake2Command invprevp invprevw invuse menu_addressbook
+ syn keyword quake2Command menu_credits menu_dmoptions menu_game
+ syn keyword quake2Command menu_joinserver menu_keys menu_loadgame
+ syn keyword quake2Command menu_main menu_multiplayer menu_options
+ syn keyword quake2Command menu_playerconfig menu_quit menu_savegame
+ syn keyword quake2Command menu_startserver menu_video
+ syn keyword quake2Command notarget precache prog togglechat vid_front
+ syn keyword quake2Command weaplast
+endif
+
+if exists("quake_is_quake2") || exists("quake_is_quake3")
+ syn keyword quake23Command imagelist modellist path z_stats
+endif
+
+if exists("quake_is_quake3")
+ syn keyword quake3Command +info +scores +zoom addbot arena banClient
+ syn keyword quake3Command banUser callteamvote callvote changeVectors
+ syn keyword quake3Command cinematic clientinfo clientkick cmd cmdlist
+ syn keyword quake3Command condump configstrings crash cvar_restart devmap
+ syn keyword quake3Command fdir follow freeze fs_openedList Fs_pureList
+ syn keyword quake3Command Fs_referencedList gfxinfo globalservers
+ syn keyword quake3Command hunk_stats in_restart -info levelshot
+ syn keyword quake3Command loaddeferred localservers map_restart mem_info
+ syn keyword quake3Command messagemode3 messagemode4 midiinfo model music
+ syn keyword quake3Command modelist net_restart nextframe nextskin noclip
+ syn keyword quake3Command notarget ping prevframe prevskin reset restart
+ syn keyword quake3Command s_disable_a3d s_enable_a3d s_info s_list s_stop
+ syn keyword quake3Command scanservers -scores screenshotJPEG sectorlist
+ syn keyword quake3Command serverstatus seta setenv sets setu setviewpos
+ syn keyword quake3Command shaderlist showip skinlist spdevmap startOribt
+ syn keyword quake3Command stats stopdemo stoprecord systeminfo togglemenu
+ syn keyword quake3Command tcmd team teamtask teamvote tell tell_attacker
+ syn keyword quake3Command tell_target testgun testmodel testshader toggle
+ syn keyword quake3Command touchFile vminfo vmprofile vmtest vosay
+ syn keyword quake3Command vosay_team vote votell vsay vsay_team vstr
+ syn keyword quake3Command vtaunt vtell vtell_attacker vtell_target weapon
+ syn keyword quake3Command writeconfig -zoom
+ syn match quake3Command display "\<[+-]button\(\d\|1[0-4]\)\>"
+endif
+
+if exists("quake_is_quake3")
+ syn cluster quake3Colors contains=quake3Red,quake3Green,quake3Yellow,
+ \ quake3Blue,quake3Cyan,quake3Purple,quake3White,
+ \ quake3Orange,quake3Grey,quake3Black,quake3Shadow
+
+ syn region quake3Red contained start=+\^1+hs=e+1 end=+[$^"\n]+he=e-1
+ syn region quake3Green contained start=+\^2+hs=e+1 end=+[$^"\n]+he=e-1
+ syn region quake3Yellow contained start=+\^3+hs=e+1 end=+[$^"\n]+he=e-1
+ syn region quake3Blue contained start=+\^4+hs=e+1 end=+[$^"\n]+he=e-1
+ syn region quake3Cyan contained start=+\^5+hs=e+1 end=+[$^"\n]+he=e-1
+ syn region quake3Purple contained start=+\^6+hs=e+1 end=+[$^"\n]+he=e-1
+ syn region quake3White contained start=+\^7+hs=e+1 end=+[$^"\n]+he=e-1
+ syn region quake3Orange contained start=+\^8+hs=e+1 end=+[$^\"\n]+he=e-1
+ syn region quake3Grey contained start=+\^9+hs=e+1 end=+[$^"\n]+he=e-1
+ syn region quake3Black contained start=+\^0+hs=e+1 end=+[$^"\n]+he=e-1
+ syn region quake3Shadow contained start=+\^[Xx]+hs=e+1 end=+[$^"\n]+he=e-1
+endif
+
+hi def link quakeComment Comment
+hi def link quakeTodo Todo
+hi def link quakeString String
+hi def link quakeNumber Number
+hi def link quakeOctal Number
+hi def link quakeOctalZero PreProc
+hi def link quakeFloat Number
+hi def link quakeOctalError Error
+hi def link quakeCommand quakeCommands
+hi def link quake1Command quakeCommands
+hi def link quake12Command quakeCommands
+hi def link quake2Command quakeCommands
+hi def link quake23Command quakeCommands
+hi def link quake3Command quakeCommands
+hi def link quakeCommands Keyword
+
+if exists("quake_is_quake3")
+ hi quake3Red ctermfg=Red guifg=Red
+ hi quake3Green ctermfg=Green guifg=Green
+ hi quake3Yellow ctermfg=Yellow guifg=Yellow
+ hi quake3Blue ctermfg=Blue guifg=Blue
+ hi quake3Cyan ctermfg=Cyan guifg=Cyan
+ hi quake3Purple ctermfg=DarkMagenta guifg=Purple
+ hi quake3White ctermfg=White guifg=White
+ hi quake3Black ctermfg=Black guifg=Black
+ hi quake3Orange ctermfg=Brown guifg=Orange
+ hi quake3Grey ctermfg=LightGrey guifg=LightGrey
+ hi quake3Shadow cterm=underline gui=underline
+endif
+
+let b:current_syntax = "quake"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/quarto.vim b/runtime/syntax/quarto.vim
new file mode 100644
index 0000000..d5d4ee2
--- /dev/null
+++ b/runtime/syntax/quarto.vim
@@ -0,0 +1,17 @@
+" Language: Quarto (Markdown with chunks of R, Python and other languages)
+" Provisory Maintainer: Jakson Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Fri Feb 24, 2023 08:26AM
+"
+" The developers of tools for Quarto maintain Vim runtime files in their
+" Github repository and, if required, I will hand over the maintenance of
+" this script for them.
+
+runtime syntax/rmd.vim
+
+syn match quartoShortarg /\S\+/ contained
+syn keyword quartoShortkey var meta env pagebreak video include contained
+syn region quartoShortcode matchgroup=PreProc start='{{< ' end=' >}}' contains=quartoShortkey,quartoShortarg transparent keepend
+
+hi def link quartoShortkey Include
+hi def link quartoShortarg String
diff --git a/runtime/syntax/r.vim b/runtime/syntax/r.vim
new file mode 100644
index 0000000..9b3754a
--- /dev/null
+++ b/runtime/syntax/r.vim
@@ -0,0 +1,390 @@
+" Vim syntax file
+" Language: R (GNU S)
+" Maintainer: Jakson Aquino <jalvesaq@gmail.com>
+" Former Maintainers: Vaidotas Zemlys <zemlys@gmail.com>
+" Tom Payne <tom@tompayne.org>
+" Contributor: Johannes Ranke <jranke@uni-bremen.de>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Thu Nov 17, 2022 10:13PM
+" Filenames: *.R *.r *.Rhistory *.Rt
+"
+" NOTE: The highlighting of R functions might be defined in
+" runtime files created by a filetype plugin, if installed.
+"
+" CONFIGURATION:
+" Syntax folding can be turned on by
+"
+" let r_syntax_folding = 1
+"
+" ROxygen highlighting can be turned off by
+"
+" let r_syntax_hl_roxygen = 0
+"
+" Some lines of code were borrowed from Zhuojun Chen.
+
+if exists("b:current_syntax")
+ finish
+endif
+
+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
+
+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 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 "#.*"
+
+" Roxygen
+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 appears 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.
+
+ syn match rOCommentKey "^\s*#\{1,2}'" contained
+ syn region rOExamples start="^\s*#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOTag fold
+
+ " R6 classes may contain roxygen lines independent of roxygen blocks
+ syn region rOR6Class start=/R6Class(/ end=/)/ transparent contains=ALLBUT,rError,rBraceError,rCurlyError fold
+ syn match rOR6Block "#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained
+ syn match rOR6Block "^\s*#\{1,2}'.*" contains=rOTag,rOExamples,@Spell containedin=rOR6Class contained
+
+ " 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*\n\)\@<=\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag
+
+ " 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*\n\)\@<=\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag
+ syn match rOTitleTag contained "@title"
+
+ " 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*\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*\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*\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*\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
+
+ " rOTag list originally generated from the lists that were available 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 "@eval"
+ syn match rOTag contained "@include"
+ syn match rOTag contained "@includeRmd"
+ syn match rOTag contained "@order"
+endif
+
+
+if &filetype == "rhelp"
+ " string enclosed in double quotes
+ syn region rString contains=rSpecial,@Spell start=/"/ skip=/\\\\\|\\"/ end=/"/
+ " string enclosed in single quotes
+ syn region rString contains=rSpecial,@Spell start=/'/ skip=/\\\\\|\\'/ end=/'/
+else
+ " string enclosed in double quotes
+ syn region rString contains=rSpecial,rStrError,@Spell start=/"/ skip=/\\\\\|\\"/ end=/"/
+ " string enclosed in single quotes
+ syn region rString contains=rSpecial,rStrError,@Spell start=/'/ skip=/\\\\\|\\'/ end=/'/
+endif
+
+syn match rStrError display contained "\\."
+
+
+" New line, carriage return, tab, backspace, bell, feed, vertical tab, backslash
+syn match rSpecial display contained "\\\(n\|r\|t\|b\|a\|f\|v\|'\|\"\)\|\\\\"
+
+" Hexadecimal and Octal digits
+syn match rSpecial display contained "\\\(x\x\{1,2}\|[0-8]\{1,3}\)"
+
+" Unicode characters
+syn match rSpecial display contained "\\u\x\{1,4}"
+syn match rSpecial display contained "\\U\x\{1,8}"
+syn match rSpecial display contained "\\u{\x\{1,4}}"
+syn match rSpecial display contained "\\U{\x\{1,8}}"
+
+" Raw string
+syn region rRawString matchgroup=rRawStrDelim start=/[rR]\z(['"]\)\z(-*\)(/ end=/)\z2\z1/ keepend
+syn region rRawString matchgroup=rRawStrDelim start=/[rR]\z(['"]\)\z(-*\){/ end=/}\z2\z1/ keepend
+syn region rRawString matchgroup=rRawStrDelim start=/[rR]\z(['"]\)\z(-*\)\[/ end=/\]\z2\z1/ keepend
+
+" Statement
+syn keyword rStatement break next return
+syn keyword rConditional if else
+syn keyword rRepeat for in repeat while
+
+" Constant (not really)
+syn keyword rConstant T F LETTERS letters month.abb month.name pi
+syn keyword rConstant R.version.string
+
+syn keyword rNumber NA_integer_ NA_real_ NA_complex_ NA_character_
+
+" Constants
+syn keyword rConstant NULL
+syn keyword rBoolean FALSE TRUE
+syn keyword rNumber NA Inf NaN
+
+" integer
+syn match rInteger "\<\d\+L"
+syn match rInteger "\<0x\([0-9]\|[a-f]\|[A-F]\)\+L"
+syn match rInteger "\<\d\+[Ee]+\=\d\+L"
+
+" number with no fractional part or exponent
+syn match rNumber "\<\d\+\>"
+" hexadecimal number
+syn match rNumber "\<0x\([0-9]\|[a-f]\|[A-F]\)\+"
+
+" floating point number with integer and fractional parts and optional exponent
+syn match rFloat "\<\d\+\.\d*\([Ee][-+]\=\d\+\)\="
+" floating point number with no integer part and optional exponent
+syn match rFloat "\<\.\d\+\([Ee][-+]\=\d\+\)\="
+" floating point number with no fractional part and optional exponent
+syn match rFloat "\<\d\+[Ee][-+]\=\d\+"
+
+" complex number
+syn match rComplex "\<\d\+i"
+syn match rComplex "\<\d\++\d\+i"
+syn match rComplex "\<0x\([0-9]\|[a-f]\|[A-F]\)\+i"
+syn match rComplex "\<\d\+\.\d*\([Ee][-+]\=\d\+\)\=i"
+syn match rComplex "\<\.\d\+\([Ee][-+]\=\d\+\)\=i"
+syn match rComplex "\<\d\+[Ee][-+]\=\d\+i"
+
+syn match rAssign '='
+syn match rOperator "&"
+syn match rOperator '-'
+syn match rOperator '\*'
+syn match rOperator '+'
+if &filetype == "quarto" || &filetype == "rmd" || &filetype == "rrst"
+ syn match rOperator "[|!<>^~`/:]"
+else
+ syn match rOperator "[|!<>^~/:]"
+endif
+syn match rOperator "%\{2}\|%\S\{-}%"
+syn match rOperator '\([!><]\)\@<=='
+syn match rOperator '=='
+syn match rOperator '|>'
+syn match rOpError '\*\{3}'
+syn match rOpError '//'
+syn match rOpError '&&&'
+syn match rOpError '|||'
+syn match rOpError '<<'
+syn match rOpError '>>'
+
+syn match rAssign "<\{1,2}-"
+syn match rAssign "->\{1,2}"
+
+" Special
+syn match rDelimiter "[,;:]"
+
+" Error
+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
+ syn region rRegion matchgroup=Delimiter start=/\[/ matchgroup=Delimiter end=/]/ transparent contains=ALLBUT,rError,rCurlyError,rParenError
+endif
+
+syn match rError "[)\]}]"
+syn match rBraceError "[)}]" contained
+syn match rCurlyError "[)\]]" contained
+syn match rParenError "[\]}]" contained
+
+" 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
+
+" 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
+endif
+
+syn match rDollar display contained "\$"
+syn match rDollar display contained "@"
+
+" List elements will not be highlighted as functions:
+syn match rLstElmt "\$[a-zA-Z0-9\\._]*" contains=rDollar
+syn match rLstElmt "@[a-zA-Z0-9\\._]*" contains=rDollar
+
+" Functions that may add new objects
+syn keyword rPreProc library require attach detach source
+
+if &filetype == "rhelp"
+ syn match rHelpIdent '\\method'
+ syn match rHelpIdent '\\S4method'
+endif
+
+" Type
+syn match rType "\\"
+syn keyword rType array category character complex double function integer list logical matrix numeric vector data.frame
+
+" Name of object with spaces
+if &filetype == "rmd" || &filetype == "rrst" || &filetype == "quarto"
+ syn region rNameWSpace start="`" end="`" contains=rSpaceFun containedin=rmdrChunk
+else
+ syn region rNameWSpace start="`" end="`" contains=rSpaceFun
+endif
+
+if &filetype == "rhelp"
+ syn match rhPreProc "^#ifdef.*"
+ syn match rhPreProc "^#endif.*"
+ syn match rhSection "\\dontrun\>"
+endif
+
+if exists("r_syntax_minlines")
+ exe "syn sync minlines=" . r_syntax_minlines
+else
+ syn sync minlines=40
+endif
+
+" Define the default highlighting.
+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
+hi def link rCurlyError Error
+hi def link rDelimiter Delimiter
+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
+hi def link rInteger Number
+hi def link rLstElmt Normal
+hi def link rNameWSpace Normal
+hi def link rNumber Number
+hi def link rOperator Operator
+hi def link rOpError Error
+hi def link rParenError Error
+hi def link rPreProc PreProc
+hi def link rRawString String
+hi def link rRawStrDelim Delimiter
+hi def link rRepeat Repeat
+hi def link rSpecial SpecialChar
+hi def link rStatement Statement
+hi def link rString String
+hi def link rStrError Error
+hi def link rType Type
+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 rOR6Block 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
new file mode 100644
index 0000000..2d4c176
--- /dev/null
+++ b/runtime/syntax/racc.vim
@@ -0,0 +1,142 @@
+" Vim default file
+" Language: Racc input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-06-22
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword raccTodo contained TODO FIXME XXX NOTE
+
+syn region raccComment start='/\*' end='\*/'
+ \ contains=raccTodo,@Spell
+syn region raccComment display oneline start='#' end='$'
+ \ contains=raccTodo,@Spell
+
+syn region raccClass transparent matchgroup=raccKeyword
+ \ start='\<class\>' end='\<rule\>'he=e-4
+ \ contains=raccComment,raccPrecedence,
+ \ raccTokenDecl,raccExpect,raccOptions,raccConvert,
+ \ raccStart,
+
+syn region raccPrecedence transparent matchgroup=raccKeyword
+ \ start='\<prechigh\>' end='\<preclow\>'
+ \ contains=raccComment,raccPrecSpec
+
+syn keyword raccPrecSpec contained nonassoc left right
+ \ nextgroup=raccPrecToken,raccPrecString skipwhite
+ \ skipnl
+
+syn match raccPrecToken contained '\<\u[A-Z0-9_]*\>'
+ \ nextgroup=raccPrecToken,raccPrecString skipwhite
+ \ skipnl
+
+syn region raccPrecString matchgroup=raccPrecString start=+"+
+ \ skip=+\\\\\|\\"+ end=+"+
+ \ contains=raccSpecial
+ \ nextgroup=raccPrecToken,raccPrecString skipwhite
+ \ skipnl
+syn region raccPrecString matchgroup=raccPrecString start=+'+
+ \ skip=+\\\\\|\\'+ end=+'+ contains=raccSpecial
+ \ nextgroup=raccPrecToken,raccPrecString skipwhite
+ \ skipnl
+
+syn keyword raccTokenDecl contained token
+ \ nextgroup=raccTokenR skipwhite skipnl
+
+syn match raccTokenR contained '\<\u[A-Z0-9_]*\>'
+ \ nextgroup=raccTokenR skipwhite skipnl
+
+syn keyword raccExpect contained expect
+ \ nextgroup=raccNumber skipwhite skipnl
+
+syn match raccNumber contained '\<\d\+\>'
+
+syn keyword raccOptions contained options
+ \ nextgroup=raccOptionsR skipwhite skipnl
+
+syn keyword raccOptionsR contained omit_action_call result_var
+ \ nextgroup=raccOptionsR skipwhite skipnl
+
+syn region raccConvert transparent contained matchgroup=raccKeyword
+ \ start='\<convert\>' end='\<end\>'
+ \ contains=raccComment,raccConvToken skipwhite
+ \ skipnl
+
+syn match raccConvToken contained '\<\u[A-Z0-9_]*\>'
+ \ nextgroup=raccString skipwhite skipnl
+
+syn keyword raccStart contained start
+ \ nextgroup=raccTargetS skipwhite skipnl
+
+syn match raccTargetS contained '\<\l[a-z0-9_]*\>'
+
+syn match raccSpecial contained '\\["'\\]'
+
+syn region raccString start=+"+ skip=+\\\\\|\\"+ end=+"+
+ \ contains=raccSpecial
+syn region raccString start=+'+ skip=+\\\\\|\\'+ end=+'+
+ \ contains=raccSpecial
+
+syn region raccRules transparent matchgroup=raccKeyword start='\<rule\>'
+ \ end='\<end\>' contains=raccComment,raccString,
+ \ raccNumber,raccToken,raccTarget,raccDelimiter,
+ \ raccAction
+
+syn match raccTarget contained '\<\l[a-z0-9_]*\>'
+
+syn match raccDelimiter contained '[:|]'
+
+syn match raccToken contained '\<\u[A-Z0-9_]*\>'
+
+syn include @raccRuby syntax/ruby.vim
+
+syn region raccAction transparent matchgroup=raccDelimiter
+ \ start='{' end='}' contains=@raccRuby
+
+syn region raccHeader transparent matchgroup=raccPreProc
+ \ start='^---- header.*' end='^----'he=e-4
+ \ contains=@raccRuby
+
+syn region raccInner transparent matchgroup=raccPreProc
+ \ start='^---- inner.*' end='^----'he=e-4
+ \ contains=@raccRuby
+
+syn region raccFooter transparent matchgroup=raccPreProc
+ \ start='^---- footer.*' end='^----'he=e-4
+ \ contains=@raccRuby
+
+syn sync match raccSyncHeader grouphere raccHeader '^---- header'
+syn sync match raccSyncInner grouphere raccInner '^---- inner'
+syn sync match raccSyncFooter grouphere raccFooter '^---- footer'
+
+hi def link raccTodo Todo
+hi def link raccComment Comment
+hi def link raccPrecSpec Type
+hi def link raccPrecToken raccToken
+hi def link raccPrecString raccString
+hi def link raccTokenDecl Keyword
+hi def link raccToken Identifier
+hi def link raccTokenR raccToken
+hi def link raccExpect Keyword
+hi def link raccNumber Number
+hi def link raccOptions Keyword
+hi def link raccOptionsR Identifier
+hi def link raccConvToken raccToken
+hi def link raccStart Keyword
+hi def link raccTargetS Type
+hi def link raccSpecial special
+hi def link raccString String
+hi def link raccTarget Type
+hi def link raccDelimiter Delimiter
+hi def link raccPreProc PreProc
+hi def link raccKeyword Keyword
+
+let b:current_syntax = "racc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/racket.vim b/runtime/syntax/racket.vim
new file mode 100644
index 0000000..b1ed2b4
--- /dev/null
+++ b/runtime/syntax/racket.vim
@@ -0,0 +1,656 @@
+" Vim syntax file
+" Language: Racket
+" Maintainer: D. Ben Knoble <ben.knoble+github@gmail.com>
+" Previous Maintainer: Will Langstroth <will@langstroth.com>
+" URL: https://github.com/benknoble/vim-racket
+" Description: Contains all of the keywords in #lang racket
+" Last Change: 2022 Aug 12
+
+" Initializing:
+if exists("b:current_syntax")
+ finish
+endif
+
+" Highlight unmatched parens
+syntax match racketError ,[]})],
+
+if version < 800
+ set iskeyword=33,35-39,42-58,60-90,94,95,97-122,126,_
+else
+ " syntax iskeyword 33,35-39,42-58,60-90,94,95,97-122,126,_
+ " converted from decimal to char
+ " :s/\d\+/\=submatch(0)->str2nr()->nr2char()/g
+ " but corrected to remove duplicate _, move ^ to end
+ syntax iskeyword @,!,#-',*-:,<-Z,a-z,~,_,^
+ " expanded
+ " syntax iskeyword !,#,$,%,&,',*,+,,,-,.,/,0-9,:,<,=,>,?,@,A-Z,_,a-z,~,^
+endif
+
+" Forms in order of appearance at
+" http://docs.racket-lang.org/reference/index.html
+"
+syntax keyword racketSyntax module module* module+ require provide quote
+syntax keyword racketSyntax #%datum #%expression #%top #%variable-reference #%app
+syntax keyword racketSyntax lambda case-lambda let let* letrec
+syntax keyword racketSyntax let-values let*-values let-syntax letrec-syntax
+syntax keyword racketSyntax let-syntaxes letrec-syntaxes letrec-syntaxes+values
+syntax keyword racketSyntax local shared
+syntax keyword racketSyntax if cond and or case define else =>
+syntax keyword racketSyntax define define-values define-syntax define-syntaxes
+syntax keyword racketSyntax define-for-syntax define-require-syntax define-provide-syntax
+syntax keyword racketSyntax define-syntax-rule
+syntax keyword racketSyntax define-record-type
+syntax keyword racketSyntax begin begin0
+syntax keyword racketSyntax begin-for-syntax
+syntax keyword racketSyntax when unless
+syntax keyword racketSyntax set! set!-values
+syntax keyword racketSyntax for for/list for/vector for/hash for/hasheq for/hasheqv
+syntax keyword racketSyntax for/and for/or for/lists for/first
+syntax keyword racketSyntax for/last for/fold
+syntax keyword racketSyntax for* for*/list for*/vector for*/hash for*/hasheq for*/hasheqv
+syntax keyword racketSyntax for*/and for*/or for*/lists for*/first
+syntax keyword racketSyntax for*/last for*/fold
+syntax keyword racketSyntax for/fold/derived for*/fold/derived
+syntax keyword racketSyntax define-sequence-syntax :do-in do
+syntax keyword racketSyntax with-continuation-mark
+syntax keyword racketSyntax quasiquote unquote unquote-splicing quote-syntax
+syntax keyword racketSyntax #%top-interaction
+syntax keyword racketSyntax define-package open-package package-begin
+syntax keyword racketSyntax define* define*-values define*-syntax define*-syntaxes open*-package
+syntax keyword racketSyntax package? package-exported-identifiers package-original-identifiers
+syntax keyword racketSyntax block #%stratified-body
+
+" 8 Contracts
+" 8.2 Function contracts
+syntax keyword racketSyntax -> ->* ->i ->d case-> dynamic->* unconstrained-domain->
+
+" 8.6.1 Nested Contract Boundaries
+syntax keyword racketSyntax with-contract define/contract define-struct/contract
+syntax keyword racketSyntax invariant-assertion current-contract-region
+
+" 9 Pattern Matching
+syntax keyword racketSyntax match match* match/values define/match
+syntax keyword racketSyntax match-lambda match-lambda* match-lambda**
+syntax keyword racketSyntax match-let match-let* match-let-values match-let*-values
+syntax keyword racketSyntax match-letrec match-define match-define-values
+
+" 10.2.3 Handling Exceptions
+syntax keyword racketSyntax with-handlers with-handlers*
+
+" 10.4 Continuations
+syntax keyword racketSyntax let/cc let/ec
+
+" 10.4.1 Additional Control Operators
+syntax keyword racketSyntax % prompt control prompt-at control-at reset shift
+syntax keyword racketSyntax reset-at shift-at prompt0 reset0 control0 shift0
+syntax keyword racketSyntax prompt0-at reset0-at control0-at shift0-at
+syntax keyword racketSyntax set cupto
+
+" 11.3.2 Parameters
+syntax keyword racketSyntax parameterize parameterize*
+
+" 12.5 Writing
+syntax keyword racketSyntax write display displayln print
+syntax keyword racketSyntax fprintf printf eprintf format
+syntax keyword racketSyntax print-pair-curly-braces print-mpair-curly-braces print-unreadable
+syntax keyword racketSyntax print-graph print-struct print-box print-vector-length print-hash-table
+syntax keyword racketSyntax print-boolean-long-form print-reader-abbreviations print-as-expression print-syntax-width
+syntax keyword racketSyntax current-write-relative-directory port-write-handler port-display-handler
+syntax keyword racketSyntax port-print-handler global-port-print-handler
+
+" 13.7 Custodians
+syntax keyword racketSyntax custodian? custodian-memory-accounting-available? custodian-box?
+syntax keyword racketSyntax make-custodian custodian-shutdown-all current-custodian custodian-managed-list
+syntax keyword racketSyntax custodian-require-memory custodian-limit-memory
+syntax keyword racketSyntax make-custodian-box custodian-box-value
+
+" lambda sign
+syntax match racketSyntax /\<[\u03bb]\>/
+
+
+" Functions ==================================================================
+
+syntax keyword racketFunc boolean? not equal? eqv? eq? equal?/recur immutable?
+syntax keyword racketFunc true false symbol=? boolean=? false?
+syntax keyword racketFunc number? complex? real? rational? integer?
+syntax keyword racketFunc exact-integer? exact-nonnegative-integer?
+syntax keyword racketFunc exact-positive-integer? inexact-real?
+syntax keyword racketFunc fixnum? flonum? zero? positive? negative?
+syntax keyword racketFunc even? odd? exact? inexact?
+syntax keyword racketFunc inexact->exact exact->inexact
+
+" 3.2.2 General Arithmetic
+
+" 3.2.2.1 Arithmetic
+syntax keyword racketFunc + - * / quotient remainder quotient/remainder modulo
+syntax keyword racketFunc add1 sub1 abs max min gcd lcm round exact-round floor
+syntax keyword racketFunc ceiling truncate numerator denominator rationalize
+
+" 3.2.2.2 Number Comparison
+syntax keyword racketFunc = < <= > >=
+
+" 3.2.2.3 Powers and Roots
+syntax keyword racketFunc sqrt integer-sqrt integer-sqrt/remainder
+syntax keyword racketFunc expt exp log
+
+" 3.2.2.3 Trigonometric Functions
+syntax keyword racketFunc sin cos tan asin acos atan
+
+" 3.2.2.4 Complex Numbers
+syntax keyword racketFunc make-rectangular make-polar
+syntax keyword racketFunc real-part imag-part magnitude angle
+syntax keyword racketFunc bitwise-ior bitwise-and bitwise-xor bitwise-not
+syntax keyword racketFunc bitwise-bit-set? bitwise-bit-field arithmetic-shift
+syntax keyword racketFunc integer-length
+
+" 3.2.2.5 Random Numbers
+syntax keyword racketFunc random random-seed
+syntax keyword racketFunc make-pseudo-random-generator pseudo-random-generator?
+syntax keyword racketFunc current-pseudo-random-generator pseudo-random-generator->vector
+syntax keyword racketFunc vector->pseudo-random-generator vector->pseudo-random-generator!
+
+" 3.2.2.8 Number-String Conversions
+syntax keyword racketFunc number->string string->number real->decimal-string
+syntax keyword racketFunc integer->integer-bytes
+syntax keyword racketFunc floating-point-bytes->real real->floating-point-bytes
+syntax keyword racketFunc system-big-endian?
+
+" 3.2.2.9 Extra Constants and Functions
+syntax keyword racketFunc pi sqr sgn conjugate sinh cosh tanh order-of-magnitude
+
+" 3.2.3 Flonums
+
+" 3.2.3.1 Flonum Arithmetic
+syntax keyword racketFunc fl+ fl- fl* fl/ flabs
+syntax keyword racketFunc fl= fl< fl> fl<= fl>= flmin flmax
+syntax keyword racketFunc flround flfloor flceiling fltruncate
+syntax keyword racketFunc flsin flcos fltan flasin flacos flatan
+syntax keyword racketFunc fllog flexp flsqrt
+syntax keyword racketFunc ->fl fl->exact-integer make-flrectangular
+syntax keyword racketFunc flreal-part flimag-part
+
+" 3.2.3.2 Flonum Vectors
+syntax keyword racketFunc flvector? flvector make-flvector flvector-length
+syntax keyword racketFunc flvector-ref flvector-set! flvector-copy in-flvector
+syntax keyword racketFunc shared-flvector make-shared-flvector
+syntax keyword racketSyntax for/flvector for*/flvector
+
+" 3.2.4 Fixnums
+syntax keyword racketFunc fx+ fx- fx* fxquotient fxremainder fxmodulo fxabs
+syntax keyword racketFunc fxand fxior fxxor fxnot fxlshift fxrshift
+syntax keyword racketFunc fx= fx< fx> fx<= fx>= fxmin fxmax fx->fl fl->fx
+
+" 3.2.4.2 Fixnum Vectors
+syntax keyword racketFunc fxvector? fxvector make-fxvector fxvector-length
+syntax keyword racketFunc fxvector-ref fxvector-set! fxvector-copy in-fxvector
+syntax keyword racketFunc for/fxvector for*/fxvector
+syntax keyword racketFunc shared-fxvector make-shared-fxvector
+
+" 3.3 Strings
+syntax keyword racketFunc string? make-string string string->immutable-string string-length
+syntax keyword racketFunc string-ref string-set! substring string-copy string-copy!
+syntax keyword racketFunc string-fill! string-append string->list list->string
+syntax keyword racketFunc build-string string=? string<? string<=? string>? string>=?
+syntax keyword racketFunc string-ci=? string-ci<? string-ci<=? string-ci>? string-ci>=?
+syntax keyword racketFunc string-upcase string-downcase string-titlecase string-foldcase
+syntax keyword racketFunc string-normalize-nfd string-normalize-nfc string-normalize-nfkc
+syntax keyword racketFunc string-normalize-spaces string-trim
+syntax keyword racketFunc string-locale=? string-locale>? string-locale<?
+syntax keyword racketFunc string-locale-ci=? string-locale<=?
+syntax keyword racketFunc string-locale-upcase string-locale-downcase
+syntax keyword racketFunc string-append* string-join
+
+" 3.4 Bytestrings
+syntax keyword racketFunc bytes? make-bytes bytes bytes->immutable-bytes byte?
+syntax keyword racketFunc bytes-length bytes-ref bytes-set! subbytes bytes-copy
+syntax keyword racketFunc bytes-copy! bytes-fill! bytes-append bytes->list list->bytes
+syntax keyword racketFunc make-shared-bytes shared-bytes
+syntax keyword racketFunc bytes=? bytes<? bytes>?
+syntax keyword racketFunc bytes->string/utf-8 bytes->string/latin-1
+syntax keyword racketFunc string->bytes/locale string->bytes/latin-1 string->bytes/utf-8
+syntax keyword racketFunc string-utf-8-length bytes-utf8-ref bytes-utf-8-index
+syntax keyword racketFunc bytes-open-converter bytes-close-converter
+syntax keyword racketFunc bytes-convert bytes-convert-end bytes-converter?
+syntax keyword racketFunc locale-string-encoding
+
+" 3.5 Characters
+syntax keyword racketFunc char? char->integer integer->char
+syntax keyword racketFunc char=? char<? char<=? char>? char>=?
+syntax keyword racketFunc char-ci=? char-ci<? char-ci<=? char-ci>? char-ci>=?
+syntax keyword racketFunc char-alphabetic? char-lower-case? char-upper-case? char-title-case?
+syntax keyword racketFunc char-numeric? char-symbolic? char-punctuation? char-graphic?
+syntax keyword racketFunc char-whitespace? char-blank?
+syntax keyword racketFunc char-iso-control? char-general-category
+syntax keyword racketFunc make-known-char-range-list
+syntax keyword racketFunc char-upcase char-downcase char-titlecase char-foldcase
+
+" 3.6 Symbols
+syntax keyword racketFunc symbol? symbol-interned? symbol-unreadable?
+syntax keyword racketFunc symbol->string string->symbol
+syntax keyword racketFunc string->uninterned-symbol string->unreadable-symbol
+syntax keyword racketFunc gensym
+
+" 3.7 Regular Expressions
+syntax keyword racketFunc regexp? pregexp? byte-regexp? byte-pregexp?
+syntax keyword racketFunc regexp pregexp byte-regexp byte-pregexp
+syntax keyword racketFunc regexp-quote regexp-match regexp-match*
+syntax keyword racketFunc regexp-try-match regexp-match-positions
+syntax keyword racketFunc regexp-match-positions* regexp-match?
+syntax keyword racketFunc regexp-match-peek-positions regexp-match-peek-immediate
+syntax keyword racketFunc regexp-match-peek regexp-match-peek-positions*
+syntax keyword racketFunc regexp-match/end regexp-match-positions/end
+syntax keyword racketFunc regexp-match-peek-positions-immediat/end
+syntax keyword racketFunc regexp-split regexp-replace regexp-replace*
+syntax keyword racketFunc regexp-replace-quote
+
+" 3.8 Keywords
+syntax keyword racketFunc keyword? keyword->string string->keyword keyword<?
+
+" 3.9 Pairs and Lists
+syntax keyword racketFunc pair? null? cons car cdr null
+syntax keyword racketFunc list? list list* build-list length
+syntax keyword racketFunc list-ref list-tail append reverse map andmap ormap
+syntax keyword racketFunc for-each foldl foldr filter remove remq remv remove*
+syntax keyword racketFunc remq* remv* sort member memv memq memf
+syntax keyword racketFunc findf assoc assv assq assf
+syntax keyword racketFunc caar cadr cdar cddr caaar caadr cadar caddr cdaar
+syntax keyword racketFunc cddar cdddr caaaar caaadr caadar caaddr cadadr caddar
+syntax keyword racketFunc cadddr cdaaar cdaadr cdadar cddaar cdddar cddddr
+
+" 3.9.7 Additional List Functions and Synonyms
+" (require racket/list)
+syntax keyword racketFunc empty cons? empty? first rest
+syntax keyword racketFunc second third fourth fifth sixth seventh eighth ninth tenth
+syntax keyword racketFunc last last-pair make-list take drop split-at
+syntax keyword racketFunc take-right drop-right split-at-right add-between
+syntax keyword racketFunc append* flatten remove-duplicates filter-map
+syntax keyword racketFunc count partition append-map filter-not shuffle
+syntax keyword racketFunc argmin argmax make-reader-graph placeholder? make-placeholder
+syntax keyword racketFunc placeholder-set! placeholder-get hash-placeholder?
+syntax keyword racketFunc make-hash-placeholder make-hasheq-placeholder
+syntax keyword racketFunc make-hasheqv-placeholder make-immutable-hasheqv
+
+" 3.10 Mutable Pairs and Lists
+syntax keyword racketFunc mpair? mcons mcar mcdr
+
+" 3.11 Vectors
+syntax keyword racketFunc vector? make-vector vector vector-immutable vector-length
+syntax keyword racketFunc vector-ref vector-set! vector->list list->vector
+syntax keyword racketFunc vector->immutable-vector vector-fill! vector-copy!
+syntax keyword racketFunc vector->values build-vector vector-set*! vector-map
+syntax keyword racketFunc vector-map! vector-append vector-take vector-take-right
+syntax keyword racketFunc vector-drop vector-drop-right vector-split-at
+syntax keyword racketFunc vector-split-at-right vector-copy vector-filter
+syntax keyword racketFunc vector-filter-not vector-count vector-argmin vector-argmax
+syntax keyword racketFunc vector-member vector-memv vector-memq
+
+" 3.12 Boxes
+syntax keyword racketFunc box? box box-immutable unbox set-box!
+
+" 3.13 Hash Tables
+syntax keyword racketFunc hash? hash-equal? hash-eqv? hash-eq? hash-weak? hash
+syntax keyword racketFunc hasheq hasheqv
+syntax keyword racketFunc make-hash make-hasheqv make-hasheq make-weak-hash make-weak-hasheqv
+syntax keyword racketFunc make-weak-hasheq make-immutable-hash make-immutable-hasheqv
+syntax keyword racketFunc make-immutable-hasheq
+syntax keyword racketFunc hash-set! hash-set*! hash-set hash-set* hash-ref hash-ref!
+syntax keyword racketFunc hash-has-key? hash-update! hash-update hash-remove!
+syntax keyword racketFunc hash-remove hash-map hash-keys hash-values
+syntax keyword racketFunc hash->list hash-for-each hash-count
+syntax keyword racketFunc hash-iterate-first hash-iterate-next hash-iterate-key
+syntax keyword racketFunc hash-iterate-value hash-copy eq-hash-code eqv-hash-code
+syntax keyword racketFunc equal-hash-code equal-secondary-hash-code
+
+" 3.15 Dictionaries
+syntax keyword racketFunc dict? dict-mutable? dict-can-remove-keys? dict-can-functional-set?
+syntax keyword racketFunc dict-set! dict-set*! dict-set dict-set* dict-has-key? dict-ref
+syntax keyword racketFunc dict-ref! dict-update! dict-update dict-remove! dict-remove
+syntax keyword racketFunc dict-map dict-for-each dict-count dict-iterate-first dict-iterate-next
+syntax keyword racketFunc dict-iterate-key dict-iterate-value in-dict in-dict-keys
+syntax keyword racketFunc in-dict-values in-dict-pairs dict-keys dict-values
+syntax keyword racketFunc dict->list prop: dict prop: dict/contract dict-key-contract
+syntax keyword racketFunc dict-value-contract dict-iter-contract make-custom-hash
+syntax keyword racketFunc make-immutable-custom-hash make-weak-custom-hash
+
+" 3.16 Sets
+syntax keyword racketFunc set seteqv seteq set-empty? set-count set-member?
+syntax keyword racketFunc set-add set-remove set-union set-intersect set-subtract
+syntax keyword racketFunc set-symmetric-difference set=? subset? proper-subset?
+syntax keyword racketFunc set-map set-for-each set? set-equal? set-eqv? set-eq?
+syntax keyword racketFunc set/c in-set for/set for/seteq for/seteqv for*/set
+syntax keyword racketFunc for*/seteq for*/seteqv list->set list->seteq
+syntax keyword racketFunc list->seteqv set->list
+
+" 3.17 Procedures
+syntax keyword racketFunc procedure? apply compose compose1 procedure-rename procedure->method
+syntax keyword racketFunc keyword-apply procedure-arity procedure-arity?
+syntax keyword racketFunc procedure-arity-includes? procedure-reduce-arity
+syntax keyword racketFunc procedure-keywords make-keyword-procedure
+syntax keyword racketFunc procedure-reduce-keyword-arity procedure-struct-type?
+syntax keyword racketFunc procedure-extract-target checked-procedure-check-and-extract
+syntax keyword racketFunc primitive? primitive-closure? primitive-result-arity
+syntax keyword racketFunc identity const thunk thunk* negate curry curryr
+
+" 3.18 Void
+syntax keyword racketFunc void void?
+
+" 4.1 Defining Structure Types
+syntax keyword racketFunc struct struct-field-index define-struct define-struct define-struct/derived
+
+" 4.2 Creating Structure Types
+syntax keyword racketFunc make-struct-type make-struct-field-accessor make-struct-field-mutator
+
+" 4.3 Structure Type Properties
+syntax keyword racketFunc make-struct-type-property struct-type-property? struct-type-property-accessor-procedure?
+
+" 4.4 Copying and Updating Structures
+syntax keyword racketFunc struct-copy
+
+" 4.5 Structure Utilities
+syntax keyword racketFunc struct->vector struct? struct-type?
+syntax keyword racketFunc struct-constructor-procedure? struct-predicate-procedure? struct-accessor-procedure? struct-mutator-procedure?
+syntax keyword racketFunc prefab-struct-key make-prefab-struct prefab-key->struct-type
+
+" 4.6 Structure Type Transformer Binding
+syntax keyword racketFunc struct-info? check-struct-info? make-struct-info extract-struct-info
+syntax keyword racketFunc struct-auto-info? struct-auto-info-lists
+
+" 5.1 Creating Interfaces
+syntax keyword racketFunc interface interface*
+
+" 5.2 Creating Classes
+syntax keyword racketFunc class* class inspect
+syntax keyword racketFunc init init-field field inherit field init-rest
+syntax keyword racketFunc public public* pubment pubment* public-final public-final*
+syntax keyword racketFunc override override* overment overment* override-final override-final*
+syntax keyword racketFunc augride augride* augment augment* augment-final augment-final*
+syntax keyword racketFunc abstract inherit inherit/super inherit/inner
+syntax keyword racketFunc rename-inner rename-super
+syntax keyword racketFunc define/public define/pubment define/public-final
+syntax keyword racketFunc define/override define/overment define/override-final
+syntax keyword racketFunc define/augride define/augment define/augment-final
+syntax keyword racketFunc private* define/private
+
+" 5.2.3 Methods
+syntax keyword racketFunc class/derived
+syntax keyword racketFunc super inner define-local-member-name define-member-name
+syntax keyword racketFunc member-name-key generate-member-key member-name-key?
+syntax keyword racketFunc member-name-key=? member-name-key-hash-code
+
+" 5.3 Creating Objects
+syntax keyword racketFunc make-object instantiate new
+syntax keyword racketFunc super-make-object super-instantiate super-new
+
+"5.4 Field and Method Access
+syntax keyword racketFunc method-id send send/apply send/keyword-apply dynamic-send send*
+syntax keyword racketFunc get-field set-field! field-bound?
+syntax keyword racketFunc class-field-accessor class-field-mutator
+
+"5.4.3 Generics
+syntax keyword racketFunc generic send-generic make-generic
+
+" 8.1 Data-strucure contracts
+syntax keyword racketFunc flat-contract-with-explanation flat-named-contract
+" TODO where do any/c and none/c `value`s go?
+syntax keyword racketFunc or/c first-or/c and/c not/c =/c </c >/c <=/c >=/c
+syntax keyword racketFunc between/c real-in integer-in char-in natural-number/c
+syntax keyword racketFunc string-len/c printable/c one-of/c symbols vectorof
+syntax keyword racketFunc vector-immutableof vector/c box/c box-immutable/c listof
+syntax keyword racketFunc non-empty-listof list*of cons/c cons/dc list/c *list/c
+syntax keyword racketFunc syntax/c struct/c struct/dc parameter/c
+syntax keyword racketFunc procedure-arity-includes/c hash/c hash/dc channel/c
+syntax keyword racketFunc prompt-tag/c continuation-mark-key/c evt/c promise/c
+syntax keyword racketFunc flat-contract flat-contract-predicate suggest/c
+
+" 9.1 Multiple Values
+syntax keyword racketFunc values call-with-values
+
+" 10.2.2 Raising Exceptions
+syntax keyword racketFunc raise error raise-user-error raise-argument-error
+syntax keyword racketFunc raise-result-error raise-argument-error raise-range-error
+syntax keyword racketFunc raise-type-error raise-mismatch-error raise-arity-error
+syntax keyword racketFunc raise-syntax-error
+
+" 10.2.3 Handling Exceptions
+syntax keyword racketFunc call-with-exception-handler uncaught-exception-handler
+
+" 10.2.4 Configuring Default Handlers
+syntax keyword racketFunc error-escape-handler error-display-handler error-print-width
+syntax keyword racketFunc error-print-context-length error-values->string-handler
+syntax keyword racketFunc error-print-source-location
+
+" 10.2.5 Built-in Exception Types
+syntax keyword racketFunc exn exn:fail exn:fail:contract exn:fail:contract:arity
+syntax keyword racketFunc exn:fail:contract:divide-by-zero exn:fail:contract:non-fixnum-result
+syntax keyword racketFunc exn:fail:contract:continuation exn:fail:contract:variable
+syntax keyword racketFunc exn:fail:syntax exn:fail:syntax:unbound exn:fail:syntax:missing-module
+syntax keyword racketFunc exn:fail:read exn:fail:read:eof exn:fail:read:non-char
+syntax keyword racketFunc exn:fail:filesystem exn:fail:filesystem:exists
+syntax keyword racketFunc exn:fail:filesystem:version exn:fail:filesystem:errno
+syntax keyword racketFunc exn:fail:filesystem:missing-module
+syntax keyword racketFunc exn:fail:network exn:fail:network:errno exn:fail:out-of-memory
+syntax keyword racketFunc exn:fail:unsupported exn:fail:user
+syntax keyword racketFunc exn:break exn:break:hang-up exn:break:terminate
+
+" 10.3 Delayed Evaluation
+syntax keyword racketFunc promise? delay lazy force promise-forced? promise-running?
+
+" 10.3.1 Additional Promise Kinds
+syntax keyword racketFunc delay/name promise/name delay/strict delay/sync delay/thread delay/idle
+
+" 10.4 Continuations
+syntax keyword racketFunc call-with-continuation-prompt abort-current-continuation make-continuation-prompt-tag
+syntax keyword racketFunc default-continuation-prompt-tag call-with-current-continuation call/cc
+syntax keyword racketFunc call-with-composable-continuation call-with-escape-continuation call/ec
+syntax keyword racketFunc call-with-continuation-barrier continuation-prompt-available
+syntax keyword racketFunc continuation? continuation-prompt-tag dynamic-wind
+
+" 10.4.1 Additional Control Operators
+syntax keyword racketFunc call/prompt abort/cc call/comp abort fcontrol spawn splitter new-prompt
+
+" 11.3.2 Parameters
+syntax keyword racketFunc make-parameter make-derived-parameter parameter?
+syntax keyword racketFunc parameter-procedure=? current-parameterization
+syntax keyword racketFunc call-with-parameterization parameterization?
+
+" 14.1.1 Manipulating Paths
+syntax keyword racketFunc path? path-string? path-for-some-system? string->path path->string path->bytes
+syntax keyword racketFunc string->path-element bytes->path-element path-element->string path-element->bytes
+syntax keyword racketFunc path-convention-type system-path-convention-type build-type
+syntax keyword racketFunc build-type/convention-type
+syntax keyword racketFunc absolute-path? relative-path? complete-path?
+syntax keyword racketFunc path->complete-path path->directory-path
+syntax keyword racketFunc resolve-path cleanse-path expand-user-path simplify-path normal-case-path split-path
+syntax keyword racketFunc path-replace-suffix path-add-suffix
+
+" 14.1.2 More Path Utilities
+syntax keyword racketFunc explode-path file-name-from-path filename-extension find-relative-path normalize-path
+syntax keyword racketFunc path-element? path-only simple-form-path some-simple-path->string string->some-system-path
+
+" 15.6 Time
+syntax keyword racketFunc current-seconds current-inexact-milliseconds
+syntax keyword racketFunc seconds->date current-milliseconds
+
+
+syntax match racketDelimiter !\<\.\>!
+
+syntax cluster racketTop contains=racketSyntax,racketFunc,racketDelimiter
+
+syntax match racketConstant ,\<\*\k\+\*\>,
+syntax match racketConstant ,\<<\k\+>\>,
+
+" Non-quoted lists, and strings
+syntax region racketStruc matchgroup=racketParen start="("rs=s+1 end=")"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="#("rs=s+2 end=")"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="{"rs=s+1 end="}"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="#{"rs=s+2 end="}"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="\["rs=s+1 end="\]"re=e-1 contains=@racketTop
+syntax region racketStruc matchgroup=racketParen start="#\["rs=s+2 end="\]"re=e-1 contains=@racketTop
+
+for lit in ['hash', 'hasheq', 'hasheqv']
+ execute printf('syntax match racketLit "\<%s\>" nextgroup=@racketParen containedin=ALLBUT,.*String,.*Comment', '#'.lit)
+endfor
+
+for lit in ['rx', 'rx#', 'px', 'px#']
+ execute printf('syntax match racketRe "\<%s\>" nextgroup=@racketString containedin=ALLBUT,.*String,.*Comment,', '#'.lit)
+endfor
+
+unlet lit
+
+" Simple literals
+
+" Strings
+
+syntax match racketStringEscapeError "\\." contained display
+
+syntax match racketStringEscape "\\[abtnvfre'"\\]" contained display
+syntax match racketStringEscape "\\$" contained display
+syntax match racketStringEscape "\\\o\{1,3}\|\\x\x\{1,2}" contained display
+
+syntax match racketUStringEscape "\\u\x\{1,4}\|\\U\x\{1,8}" contained display
+syntax match racketUStringEscape "\\u\x\{4}\\u\x\{4}" contained display
+
+syntax region racketString start=/\%(\\\)\@<!"/ skip=/\\[\\"]/ end=/"/ contains=racketStringEscapeError,racketStringEscape,racketUStringEscape
+syntax region racketString start=/#"/ skip=/\\[\\"]/ end=/"/ contains=racketStringEscapeError,racketStringEscape
+
+if exists("racket_no_string_fold")
+ syn region racketString start=/#<<\z(.*\)$/ end=/^\z1$/
+else
+ syn region racketString start=/#<<\z(.*\)$/ end=/^\z1$/ fold
+endif
+
+
+syntax cluster racketTop add=racketError,racketConstant,racketStruc,racketString
+
+" Numbers
+
+" anything which doesn't match the below rules, but starts with a #d, #b, #o,
+" #x, #i, or #e, is an error
+syntax match racketNumberError "\<#[xdobie]\k*"
+
+syntax match racketContainedNumberError "\<#o\k*[^-+0-7delfinas#./@]\>"
+syntax match racketContainedNumberError "\<#b\k*[^-+01delfinas#./@]\>"
+syntax match racketContainedNumberError "\<#[ei]#[ei]"
+syntax match racketContainedNumberError "\<#[xdob]#[xdob]"
+
+" start with the simpler sorts
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\?\d\+/\d\+\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\?\d\+/\d\+[-+]\d\+\(/\d\+\)\?i\>" contains=racketContainedNumberError
+
+" different possible ways of expressing complex values
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?i\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?[-+]\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?i\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f][-+]\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?i\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?[-+]\(inf\|nan\)\.[0f]i\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?@[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f]@[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[dobie]\)\{0,2}[-+]\?\(\d\+\|\d\+#*\.\|\d*\.\d\+\)#*\(/\d\+#*\)\?\([sdlef][-+]\?\d\+#*\)\?@[-+]\(inf\|nan\)\.[0f]\>" contains=racketContainedNumberError
+
+" hex versions of the above (separate because of the different possible exponent markers)
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?\>"
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\x\+/\x\+\>"
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\x\+/\x\+[-+]\x\+\(/\x\+\)\?i\>"
+
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?i\>"
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?[-+]\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?i\>"
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\(inf\|nan\)\.[0f][-+]\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?i\>"
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?[-+]\(inf\|nan\)\.[0f]i\>"
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?@[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?\>"
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\(inf\|nan\)\.[0f]@[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?\>"
+syntax match racketNumber "\<\(#x\|#[ei]#x\|#x#[ei]\)[-+]\?\(\x\+\|\x\+#*\.\|\x*\.\x\+\)#*\(/\x\+#*\)\?\([sl][-+]\?\x\+#*\)\?@[-+]\(inf\|nan\)\.[0f]\>"
+
+" these work for any radix
+syntax match racketNumber "\<\(#[xdobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f]i\?\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[xdobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f][-+]\(inf\|nan\)\.[0f]i\>" contains=racketContainedNumberError
+syntax match racketNumber "\<\(#[xdobie]\)\{0,2}[-+]\(inf\|nan\)\.[0f]@[-+]\(inf\|nan\)\.[0f]\>" contains=racketContainedNumberError
+
+syntax keyword racketBoolean #t #f #true #false #T #F
+
+syntax match racketError "\<#\\\k*\>"
+
+syntax match racketChar "\<#\\.\w\@!"
+syntax match racketChar "\<#\\space\>"
+syntax match racketChar "\<#\\newline\>"
+syntax match racketChar "\<#\\return\>"
+syntax match racketChar "\<#\\null\?\>"
+syntax match racketChar "\<#\\backspace\>"
+syntax match racketChar "\<#\\tab\>"
+syntax match racketChar "\<#\\linefeed\>"
+syntax match racketChar "\<#\\vtab\>"
+syntax match racketChar "\<#\\page\>"
+syntax match racketChar "\<#\\rubout\>"
+syntax match racketChar "\<#\\\o\{1,3}\>"
+syntax match racketChar "\<#\\x\x\{1,2}\>"
+syntax match racketChar "\<#\\u\x\{1,6}\>"
+
+syntax cluster racketTop add=racketNumber,racketBoolean,racketChar
+
+" Command-line parsing
+syntax keyword racketExtFunc command-line current-command-line-arguments once-any help-labels multi once-each
+
+syntax match racketSyntax "#lang "
+syntax match racketExtSyntax "#:\k\+"
+
+syntax cluster racketTop add=racketExtFunc,racketExtSyntax
+
+" syntax quoting, unquoting and quasiquotation
+syntax match racketQuote "#\?['`]"
+
+syntax match racketUnquote "#,"
+syntax match racketUnquote "#,@"
+syntax match racketUnquote ","
+syntax match racketUnquote ",@"
+
+" Comments
+syntax match racketSharpBang "\%^#![ /].*" display
+syntax match racketComment /;.*$/ contains=racketTodo,racketNote,@Spell
+syntax region racketMultilineComment start=/#|/ end=/|#/ contains=racketMultilineComment,racketTodo,racketNote,@Spell
+syntax match racketFormComment "#;" nextgroup=@racketTop
+
+syntax match racketTodo /\C\<\(FIXME\|TODO\|XXX\)\ze:\?\>/ contained
+syntax match racketNote /\CNOTE\ze:\?/ contained
+
+syntax cluster racketTop add=racketQuote,racketUnquote,racketComment,racketMultilineComment,racketFormComment
+
+" Synchronization and the wrapping up...
+syntax sync match matchPlace grouphere NONE "^[^ \t]"
+" ... i.e. synchronize on a line that starts at the left margin
+
+" Define the default highlighting.
+highlight default link racketSyntax Statement
+highlight default link racketFunc Function
+
+highlight default link racketString String
+highlight default link racketStringEscape Special
+highlight default link racketUStringEscape Special
+highlight default link racketStringEscapeError Error
+highlight default link racketChar Character
+highlight default link racketBoolean Boolean
+
+highlight default link racketNumber Number
+highlight default link racketNumberError Error
+highlight default link racketContainedNumberError Error
+
+highlight default link racketQuote SpecialChar
+highlight default link racketUnquote SpecialChar
+
+highlight default link racketDelimiter Delimiter
+highlight default link racketParen Delimiter
+highlight default link racketConstant Constant
+
+highlight default link racketLit Type
+highlight default link racketRe Type
+
+highlight default link racketComment Comment
+highlight default link racketMultilineComment Comment
+highlight default link racketFormComment SpecialChar
+highlight default link racketSharpBang Comment
+highlight default link racketTodo Todo
+highlight default link racketNote SpecialComment
+highlight default link racketError Error
+
+highlight default link racketExtSyntax Type
+highlight default link racketExtFunc PreProc
+
+let b:current_syntax = "racket"
diff --git a/runtime/syntax/radiance.vim b/runtime/syntax/radiance.vim
new file mode 100644
index 0000000..c49e339
--- /dev/null
+++ b/runtime/syntax/radiance.vim
@@ -0,0 +1,142 @@
+" Vim syntax file
+" Language: Radiance Scene Description
+" Maintainer: Georg Mischler <schorsch@schorsch.com>
+" Last change: 26. April. 2001
+
+" Radiance is a lighting simulation software package written
+" by Gregory Ward-Larson ("the computer artist formerly known
+" as Greg Ward"), then at LBNL.
+"
+" http://radsite.lbl.gov/radiance/HOME.html
+"
+" Of course, there is also information available about it
+" from http://www.schorsch.com/
+
+
+" We take a minimalist approach here, highlighting just the
+" essential properties of each object, its type and ID, as well as
+" comments, external command names and the null-modifier "void".
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" all printing characters except '#' and '!' are valid in names.
+setlocal iskeyword=\",$-~
+
+" The null-modifier
+syn keyword radianceKeyword void
+
+" The different kinds of scene description object types
+" Reference types
+syn keyword radianceExtraType contained alias instance
+" Surface types
+syn keyword radianceSurfType contained ring polygon sphere bubble
+syn keyword radianceSurfType contained cone cup cylinder tube source
+" Emitting material types
+syn keyword radianceLightType contained light glow illum spotlight
+" Material types
+syn keyword radianceMatType contained mirror mist prism1 prism2
+syn keyword radianceMatType contained metal plastic trans
+syn keyword radianceMatType contained metal2 plastic2 trans2
+syn keyword radianceMatType contained metfunc plasfunc transfunc
+syn keyword radianceMatType contained metdata plasdata transdata
+syn keyword radianceMatType contained dielectric interface glass
+syn keyword radianceMatType contained BRTDfunc antimatter
+" Pattern modifier types
+syn keyword radiancePatType contained colorfunc brightfunc
+syn keyword radiancePatType contained colordata colorpict brightdata
+syn keyword radiancePatType contained colortext brighttext
+" Texture modifier types
+syn keyword radianceTexType contained texfunc texdata
+" Mixture types
+syn keyword radianceMixType contained mixfunc mixdata mixpict mixtext
+
+
+" Each type name is followed by an ID.
+" This doesn't work correctly if the id is one of the type names of the
+" same class (which is legal for radiance), in which case the id will get
+" type color as well, and the int count (or alias reference) gets id color.
+
+syn region radianceID start="\<alias\>" end="\<\k*\>" contains=radianceExtraType
+syn region radianceID start="\<instance\>" end="\<\k*\>" contains=radianceExtraType
+
+syn region radianceID start="\<source\>" end="\<\k*\>" contains=radianceSurfType
+syn region radianceID start="\<ring\>" end="\<\k*\>" contains=radianceSurfType
+syn region radianceID start="\<polygon\>" end="\<\k*\>" contains=radianceSurfType
+syn region radianceID start="\<sphere\>" end="\<\k*\>" contains=radianceSurfType
+syn region radianceID start="\<bubble\>" end="\<\k*\>" contains=radianceSurfType
+syn region radianceID start="\<cone\>" end="\<\k*\>" contains=radianceSurfType
+syn region radianceID start="\<cup\>" end="\<\k*\>" contains=radianceSurfType
+syn region radianceID start="\<cylinder\>" end="\<\k*\>" contains=radianceSurfType
+syn region radianceID start="\<tube\>" end="\<\k*\>" contains=radianceSurfType
+
+syn region radianceID start="\<light\>" end="\<\k*\>" contains=radianceLightType
+syn region radianceID start="\<glow\>" end="\<\k*\>" contains=radianceLightType
+syn region radianceID start="\<illum\>" end="\<\k*\>" contains=radianceLightType
+syn region radianceID start="\<spotlight\>" end="\<\k*\>" contains=radianceLightType
+
+syn region radianceID start="\<mirror\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<mist\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<prism1\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<prism2\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<metal\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<plastic\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<trans\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<metal2\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<plastic2\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<trans2\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<metfunc\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<plasfunc\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<transfunc\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<metdata\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<plasdata\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<transdata\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<dielectric\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<interface\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<glass\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<BRTDfunc\>" end="\<\k*\>" contains=radianceMatType
+syn region radianceID start="\<antimatter\>" end="\<\k*\>" contains=radianceMatType
+
+syn region radianceID start="\<colorfunc\>" end="\<\k*\>" contains=radiancePatType
+syn region radianceID start="\<brightfunc\>" end="\<\k*\>" contains=radiancePatType
+syn region radianceID start="\<colordata\>" end="\<\k*\>" contains=radiancePatType
+syn region radianceID start="\<brightdata\>" end="\<\k*\>" contains=radiancePatType
+syn region radianceID start="\<colorpict\>" end="\<\k*\>" contains=radiancePatType
+syn region radianceID start="\<colortext\>" end="\<\k*\>" contains=radiancePatType
+syn region radianceID start="\<brighttext\>" end="\<\k*\>" contains=radiancePatType
+
+syn region radianceID start="\<texfunc\>" end="\<\k*\>" contains=radianceTexType
+syn region radianceID start="\<texdata\>" end="\<\k*\>" contains=radianceTexType
+
+syn region radianceID start="\<mixfunc\>" end="\<\k*\>" contains=radianceMixType
+syn region radianceID start="\<mixdata\>" end="\<\k*\>" contains=radianceMixType
+syn region radianceID start="\<mixtext\>" end="\<\k*\>" contains=radianceMixType
+
+" external commands (generators, xform et al.)
+syn match radianceCommand "^\s*!\s*[^\s]\+\>"
+
+" The usual suspects
+syn keyword radianceTodo contained TODO XXX
+syn match radianceComment "#.*$" contains=radianceTodo
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/raku.vim b/runtime/syntax/raku.vim
new file mode 100644
index 0000000..1bf9b49
--- /dev/null
+++ b/runtime/syntax/raku.vim
@@ -0,0 +1,1971 @@
+" Vim syntax file
+" Language: Raku
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Homepage: https://github.com/Raku/vim-raku
+" Bugs/requests: https://github.com/Raku/vim-raku/issues
+" Last Change: 2021-04-16
+
+" Contributors: Luke Palmer <fibonaci@babylonia.flatirons.org>
+" Moritz Lenz <moritz@faui2k3.org>
+" Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
+"
+" This is a big undertaking.
+"
+" The ftdetect/raku.vim file in this repository takes care of setting the
+" right filetype for Raku files. To set it explicitly you can also add this
+" line near the bottom of your source file:
+" # vim: filetype=raku
+
+" TODO:
+" * Go over the list of keywords/types to see what's deprecated/missing
+" * Add more support for folding (:help syn-fold)
+"
+" If you want to have Pir code inside Q:PIR// strings highlighted, do:
+" let raku_embedded_pir=1
+"
+" The above requires pir.vim, which you can find in Parrot's repository:
+" https://github.com/parrot/parrot/tree/master/editor
+"
+" To highlight Perl 5 regexes (m:P5//):
+" let raku_perl5_regexes=1
+"
+" To enable folding:
+" let raku_fold=1
+
+if version < 704 | throw "raku.vim uses regex syntax which Vim <7.4 doesn't support. Try 'make fix_old_vim' in the vim-perl repository." | 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
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Patterns which will be interpolated by the preprocessor (tools/preproc.pl):
+"
+" @@IDENT_NONDIGIT@@ "[A-Za-z_\xC0-\xFF]"
+" @@IDENT_CHAR@@ "[A-Za-z_\xC0-\xFF0-9]"
+" @@IDENTIFIER@@ "\%(@@IDENT_NONDIGIT@@\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\@=\)*\)"
+" @@IDENTIFIER_START@@ "@@IDENT_CHAR@@\@1<!\%(@@IDENT_NONDIGIT@@[-']\)\@2<!"
+" @@IDENTIFIER_END@@ "\%(@@IDENT_CHAR@@\|[-']@@IDENT_NONDIGIT@@\)\@!"
+" @@METAOP@@ #\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+#
+" @@ADVERBS@@ "\%(\_s*:!\?@@IDENTIFIER@@\%(([^)]*)\)\?\)*"
+"
+" Same but escaped, for use in string eval
+" @@IDENT_NONDIGIT_Q@@ "[A-Za-z_\\xC0-\\xFF]"
+" @@IDENT_CHAR_Q@@ "[A-Za-z_\\xC0-\\xFF0-9]"
+" @@IDENTIFIER_Q@@ "\\%(@@IDENT_NONDIGIT_Q@@\\%(@@IDENT_CHAR_Q@@\\|[-']@@IDENT_NONDIGIT_Q@@\\@=\\)*\\)"
+" @@IDENTIFIER_START_Q@@ "@@IDENT_CHAR_Q@@\\@1<!\\%(@@IDENT_NONDIGIT_Q@@[-']\\)\\@2<!"
+" @@IDENTIFIER_END_Q@@ "\\%(@@IDENT_CHAR_Q@@\\|[-']@@IDENT_NONDIGIT_Q@@\\)\\@!"
+
+" Identifiers (subroutines, methods, constants, classes, roles, etc)
+syn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+
+let s:keywords = {
+ \ "rakuInclude": [
+ \ "use require import unit",
+ \ ],
+ \ "rakuConditional": [
+ \ "if else elsif unless with orwith without once",
+ \ ],
+ \ "rakuVarStorage": [
+ \ "let my our state temp has constant",
+ \ ],
+ \ "rakuRepeat": [
+ \ "for loop repeat while until gather given",
+ \ "supply react race hyper lazy quietly",
+ \ ],
+ \ "rakuFlowControl": [
+ \ "take take-rw do when next last redo return return-rw",
+ \ "start default exit make continue break goto leave",
+ \ "proceed succeed whenever emit done",
+ \ ],
+ \ "rakuClosureTrait": [
+ \ "BEGIN CHECK INIT FIRST ENTER LEAVE KEEP",
+ \ "UNDO NEXT LAST PRE POST END CATCH CONTROL",
+ \ "DOC QUIT CLOSE COMPOSE",
+ \ ],
+ \ "rakuException": [
+ \ "die fail try warn",
+ \ ],
+ \ "rakuPragma": [
+ \ "MONKEY-GUTS MONKEY-SEE-NO-EVAL MONKEY-TYPING MONKEY",
+ \ "experimental fatal isms lib newline nqp precompilation",
+ \ "soft strict trace variables worries",
+ \ ],
+ \ "rakuOperator": [
+ \ "div xx x mod also leg cmp before after eq ne le lt not",
+ \ "gt ge eqv ff fff and andthen or xor orelse lcm gcd o",
+ \ "unicmp notandthen minmax",
+ \ ],
+ \ "rakuType": [
+ \ "int int1 int2 int4 int8 int16 int32 int64",
+ \ "rat rat1 rat2 rat4 rat8 rat16 rat32 rat64",
+ \ "buf buf1 buf2 buf4 buf8 buf16 buf32 buf64",
+ \ "blob blob1 blob2 blob4 blob8 blob16 blob32 blob64",
+ \ "uint uint1 uint2 uint4 uint8 uint16 uint32 bit bool",
+ \ "uint64 utf8 utf16 utf32 bag set mix complex",
+ \ "num num32 num64 long longlong Pointer size_t str void",
+ \ "ulong ulonglong ssize_t atomicint",
+ \ ],
+\ }
+
+" These can be immediately followed by parentheses
+let s:types = [
+ \ "Object Any Cool Junction Whatever Capture Match",
+ \ "Signature Proxy Matcher Package Module Class",
+ \ "Grammar Scalar Array Hash KeyHash KeySet KeyBag",
+ \ "Pair List Seq Range Set Bag Map Mapping Void Undef",
+ \ "Failure Exception Code Block Routine Sub Macro",
+ \ "Method Submethod Regex Str Blob Char Byte Parcel",
+ \ "Codepoint Grapheme StrPos StrLen Version Num",
+ \ "Complex Bit True False Order Same Less More",
+ \ "Increasing Decreasing Ordered Callable AnyChar",
+ \ "Positional Associative Ordering KeyExtractor",
+ \ "Comparator OrderingPair IO KitchenSink Role",
+ \ "Int Rat Buf UInt Abstraction Numeric Real",
+ \ "Nil Mu SeekFromBeginning SeekFromEnd SeekFromCurrent",
+\ ]
+
+" We explicitly enumerate the alphanumeric infix operators allowed after [RSXZ]
+" to avoid matching package names that start with those letters.
+let s:alpha_metaops = [
+ \ "div mod gcd lcm xx x does but cmp leg eq ne gt ge lt le before after eqv",
+ \ "min max not so andthen and or orelse unicmp coll minmax",
+\ ]
+let s:words_space = join(s:alpha_metaops, " ")
+let s:temp = split(s:words_space)
+let s:alpha_metaops_or = join(s:temp, "\\|")
+
+" We don't use "syn keyword" here because that always has higher priority
+" than matches/regions, which would prevent these words from matching as
+" autoquoted strings before "=>".
+syn match rakuKeywordStart display "\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!\)\@=[A-Za-z_\xC0-\xFF0-9]\@1<!\%([A-Za-z_\xC0-\xFF][-']\)\@2<!"
+ \ nextgroup=rakuAttention,rakuVariable,rakuInclude,rakuConditional,rakuVarStorage,rakuRepeat,rakuFlowControl,rakuClosureTrait,rakuException,rakuNumber,rakuPragma,rakuType,rakuOperator,rakuIdentifier
+
+for [s:group, s:words_list] in items(s:keywords)
+ let s:words_space = join(s:words_list, " ")
+ let s:temp = split(s:words_space)
+ let s:words = join(s:temp, "\\|")
+ exec "syn match ". s:group ." display \"[.^]\\@1<!\\%(". s:words . "\\)(\\@!\\%([A-Za-z_\\xC0-\\xFF0-9]\\|[-'][A-Za-z_\\xC0-\\xFF]\\)\\@!\" contained"
+endfor
+
+let s:words_space = join(s:types, " ")
+let s:temp = split(s:words_space)
+let s:words = join(s:temp, "\\|")
+exec "syn match rakuType display \"\\%(". s:words . "\\)\\%([A-Za-z_\\xC0-\\xFF0-9]\\|[-'][A-Za-z_\\xC0-\\xFF]\\)\\@!\" contained"
+unlet s:group s:words_list s:keywords s:types s:words_space s:temp s:words
+
+syn match rakuPreDeclare display "[.^]\@1<!\<\%(multi\|proto\|only\)\>" nextgroup=rakuDeclare,rakuIdentifier skipwhite skipempty
+syn match rakuDeclare display "[.^]\@1<!\<\%(macro\|sub\|submethod\|method\|module\|class\|role\|package\|enum\|grammar\|slang\|subset\)\>" nextgroup=rakuIdentifier skipwhite skipempty
+syn match rakuDeclareRegex display "[.^]\@1<!\<\%(regex\|rule\|token\)\>" nextgroup=rakuRegexName skipwhite skipempty
+
+syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@<!\a\@=\%(does\|as\|but\|trusts\|of\|returns\|handles\|where\|augment\|supersede\)\>"
+syn match rakuTypeConstraint display "\%([.^]\|^\s*\)\@<![A-Za-z_\xC0-\xFF0-9]\@1<!\%([A-Za-z_\xC0-\xFF][-']\)\@2<!is\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuProperty
+syn match rakuProperty display "\a\@=\%(signature\|context\|also\|shape\|prec\|irs\|ofs\|ors\|export\|deep\|binary\|unary\|reparsed\|rw\|parsed\|cached\|readonly\|defequiv\|will\|ref\|copy\|inline\|tighter\|looser\|equiv\|assoc\|required\|DEPRECATED\|raw\|repr\|dynamic\|hidden-from-backtrace\|nodal\|pure\)" contained
+
+" packages, must come after all the keywords
+syn match rakuIdentifier display "\%(::\)\@2<=\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)*"
+syn match rakuIdentifier display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(::\)\@="
+
+" The sigil in ::*Package
+syn match rakuPackageTwigil display "\%(::\)\@2<=\*"
+
+" some standard packages
+syn match rakuType display "\%(::\)\@2<!\%(SeekType\%(::SeekFromBeginning\|::SeekFromCurrent\|::SeekFromEnd\)\|Order\%(::Same\|::More\|::Less\)\?\|Bool\%(::True\|::False\)\?\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!"
+
+" Don't put a "\+" at the end of the character class. That makes it so
+" greedy that the "%" " in "+%foo" won't be allowed to match as a sigil,
+" among other things
+syn match rakuOperator display "[-+/*~?|=^!%&,<>».;\\∈∉∋∌∩∪≼≽⊂⊃⊄⊅⊆⊇⊈⊉⊍⊎⊖∅∘]"
+syn match rakuOperator display "\%(:\@1<!::\@2!\|::=\|\.::\)"
+" these require whitespace on the left side
+syn match rakuOperator display "\%(\s\|^\)\@1<=\%(xx=\)"
+" index overloading
+syn match rakuOperator display "\%(&\.(\@=\|@\.\[\@=\|%\.{\@=\)"
+
+" Reduce metaoperators like [+]
+syn match rakuReduceOp display "\%(^\|\s\|(\)\@1<=!*\%([RSXZ\[]\)*[&RSXZ]\?\[\+(\?\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+)\?]\+"
+syn match rakuSetOp display "R\?(\%([-^.+|&]\|[<>][=+]\?\|cont\|elem\))"
+
+" Reverse, cross, and zip metaoperators
+exec "syn match rakuRSXZOp display \"[RSXZ]:\\@!\\%(\\a\\@=\\%(". s:alpha_metaops_or . "\\)\\>\\|[[:alnum:]]\\@!\\%([.,]\\|[^[,.[:alnum:][:space:]]\\)\\+\\|\\s\\@=\\|$\\)\""
+
+syn match rakuBlockLabel display "^\s*\zs\h\w*\s*::\@!\_s\@="
+
+syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?Inf\|NaN\)"
+syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?\%(\%(\d\|__\@!\)*[._]\@1<!\.\)\?_\@!\%(\d\|_\)\+_\@1<!\%([eE]-\?_\@!\%(\d\|_\)\+\)\?i\?"
+syn match rakuNumber display "[A-Za-z_\xC0-\xFF0-9]\@1<!\%(\%(\_^\|\s\|[^*\a]\)\@1<=[-+]\)\?0[obxd]\@=" nextgroup=rakuOctBase,rakuBinBase,rakuHexBase,rakuDecBase
+syn match rakuOctBase display "o" contained nextgroup=rakuOctNumber
+syn match rakuBinBase display "b" contained nextgroup=rakuBinNumber
+syn match rakuHexBase display "x" contained nextgroup=rakuHexNumber
+syn match rakuDecBase display "d" contained nextgroup=rakuDecNumber
+syn match rakuOctNumber display "[0-7][0-7_]*" contained
+syn match rakuBinNumber display "[01][01_]*" contained
+syn match rakuHexNumber display "\x[[:xdigit:]_]*" contained
+syn match rakuDecNumber display "\d[[:digit:]_]*" contained
+
+syn match rakuVersion display "\<v\d\+\%(\.\%(\*\|\d\+\)\)*+\?"
+
+" Contextualizers
+syn match rakuContext display "\<\%(item\|list\|slice\|hash\)\>"
+syn match rakuContext display "\%(\$\|@\|%\|&\)(\@="
+
+" Quoting
+
+" one cluster for every quote adverb
+syn cluster rakuInterp_scalar
+ \ add=rakuInterpScalar
+
+syn cluster rakuInterp_array
+ \ add=rakuInterpArray
+
+syn cluster rakuInterp_hash
+ \ add=rakuInterpHash
+
+syn cluster rakuInterp_function
+ \ add=rakuInterpFunction
+
+syn cluster rakuInterp_closure
+ \ add=rakuInterpClosure
+
+syn cluster rakuInterp_q
+ \ add=rakuEscQQ
+ \ add=rakuEscBackSlash
+
+syn cluster rakuInterp_backslash
+ \ add=@rakuInterp_q
+ \ add=rakuEscape
+ \ add=rakuEscOpenCurly
+ \ add=rakuEscCodePoint
+ \ add=rakuEscHex
+ \ add=rakuEscOct
+ \ add=rakuEscOctOld
+ \ add=rakuEscNull
+
+syn cluster rakuInterp_qq
+ \ add=@rakuInterp_scalar
+ \ add=@rakuInterp_array
+ \ add=@rakuInterp_hash
+ \ add=@rakuInterp_function
+ \ add=@rakuInterp_closure
+ \ add=@rakuInterp_backslash
+ \ add=rakuMatchVarSigil
+
+syn region rakuInterpScalar
+ \ start="\ze\z(\$\%(\%(\%(\d\+\|!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
+ \ start="\ze\z(\$\%(\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\|\%(\d\+\|!\|/\|¢\)\)\)"
+ \ end="\z1\zs"
+ \ contained keepend
+ \ contains=TOP
+
+syn region rakuInterpScalar
+ \ matchgroup=rakuContext
+ \ start="\$\ze()\@!"
+ \ skip="([^)]*)"
+ \ end=")\zs"
+ \ contained
+ \ contains=TOP
+
+syn region rakuInterpArray
+ \ start="\ze\z(@\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
+ \ end="\z1\zs"
+ \ contained keepend
+ \ contains=TOP
+
+syn region rakuInterpArray
+ \ matchgroup=rakuContext
+ \ start="@\ze()\@!"
+ \ skip="([^)]*)"
+ \ end=")\zs"
+ \ contained
+ \ contains=TOP
+
+syn region rakuInterpHash
+ \ start="\ze\z(%\$*\%(\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
+ \ end="\z1\zs"
+ \ contained keepend
+ \ contains=TOP
+
+syn region rakuInterpHash
+ \ matchgroup=rakuContext
+ \ start="%\ze()\@!"
+ \ skip="([^)]*)"
+ \ end=")\zs"
+ \ contained
+ \ contains=TOP
+
+syn region rakuInterpFunction
+ \ start="\ze\z(&\%(\%(!\|/\|¢\)\|\%(\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=\)\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(\.\^\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\|\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)*\)\.\?\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\)\)"
+ \ end="\z1\zs"
+ \ contained keepend
+ \ contains=TOP
+
+syn region rakuInterpFunction
+ \ matchgroup=rakuContext
+ \ start="&\ze()\@!"
+ \ skip="([^)]*)"
+ \ end=")\zs"
+ \ contained
+ \ contains=TOP
+
+syn region rakuInterpClosure
+ \ start="\\\@1<!{}\@!"
+ \ skip="{[^}]*}"
+ \ end="}"
+ \ contained keepend
+ \ contains=TOP
+
+" generic escape
+syn match rakuEscape display "\\\S" contained
+
+" escaped closing delimiters
+syn match rakuEscQuote display "\\'" contained
+syn match rakuEscDoubleQuote display "\\\"" contained
+syn match rakuEscCloseAngle display "\\>" contained
+syn match rakuEscCloseFrench display "\\»" contained
+syn match rakuEscBackTick display "\\`" contained
+syn match rakuEscForwardSlash display "\\/" contained
+syn match rakuEscVerticalBar display "\\|" contained
+syn match rakuEscExclamation display "\\!" contained
+syn match rakuEscComma display "\\," contained
+syn match rakuEscDollar display "\\\$" contained
+syn match rakuEscCloseCurly display "\\}" contained
+syn match rakuEscCloseBracket display "\\\]" contained
+
+" matches :key, :!key, :$var, :key<var>, etc
+" Since we don't know in advance how the adverb ends, we use a trick.
+" Consume nothing with the start pattern (\ze at the beginning),
+" while capturing the whole adverb into \z1 and then putting it before
+" the match start (\zs) of the end pattern.
+syn region rakuAdverb
+ \ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\|\[[^\]]*]\|<[^>]*>\|«[^»]*»\|{[^}]*}\)\?\)"
+ \ start="\ze\z(:!\?[@$%]\$*\%(::\|\%(\$\@1<=\d\+\|!\|/\|¢\)\|\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\)\|\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\)"
+ \ end="\z1\zs"
+ \ contained keepend
+ \ contains=TOP
+
+" <words>
+" Distinguishing this from the "less than" operator is tricky. For now,
+" it matches if any of the following is true:
+"
+" * There is whitespace missing on either side of the "<", since
+" people tend to put spaces around "less than". We make an exception
+" for " = < ... >" assignments though.
+" * It comes after "enum", "for", "any", "all", or "none"
+" * It's the first or last thing on a line (ignoring whitespace)
+" * It's preceded by "(\s*" or "=\s\+"
+" * It's empty and terminated on the same line (e.g. <> and < >)
+"
+" It never matches when:
+"
+" * Preceded by [<+~=!] (e.g. <<foo>>, =<$foo>, * !< 3)
+" * Followed by [-=] (e.g. <--, <=, <==, <->)
+syn region rakuStringAngle
+ \ matchgroup=rakuQuote
+ \ start="\%(\<\%(enum\|for\|any\|all\|none\)\>\s*(\?\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
+ \ start="\%(\s\|[<+~=!]\)\@<!<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
+ \ start="[<+~=!]\@1<!<\%(\s\|<\|=>\|\%([=-]\{1,2}>\|[=-]\{1,2}\)\)\@!"
+ \ start="\%(^\s*\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
+ \ start="[<+~=!]\@1<!<\%(\s*$\)\@="
+ \ start="\%((\s*\|=\s\+\)\@<=<\%(<\|=>\|\%([=-]\{1,2}>\|[=-]\{2}\)\)\@!"
+ \ start="<\%(\s*>\)\@="
+ \ skip="\\\@1<!\\>"
+ \ end=">"
+ \ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle
+
+syn region rakuStringAngleFixed
+ \ matchgroup=rakuQuote
+ \ start="<"
+ \ skip="\\\@1<!\\>"
+ \ end=">"
+ \ contains=rakuInnerAnglesOne,rakuEscBackSlash,rakuEscCloseAngle
+ \ contained
+
+syn region rakuInnerAnglesOne
+ \ matchgroup=rakuStringAngle
+ \ start="\\\@1<!<"
+ \ skip="\\\@1<!\\>"
+ \ end=">"
+ \ transparent contained
+ \ contains=rakuInnerAnglesOne
+
+" <<words>>
+syn region rakuStringAngles
+ \ matchgroup=rakuQuote
+ \ start="<<=\@!"
+ \ skip="\\\@1<!\\>"
+ \ end=">>"
+ \ contains=rakuInnerAnglesTwo,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseAngle,rakuAdverb,rakuStringSQ,rakuStringDQ
+
+syn region rakuInnerAnglesTwo
+ \ matchgroup=rakuStringAngles
+ \ start="<<"
+ \ skip="\\\@1<!\\>"
+ \ end=">>"
+ \ transparent contained
+ \ contains=rakuInnerAnglesTwo
+
+" «words»
+syn region rakuStringFrench
+ \ matchgroup=rakuQuote
+ \ start="«"
+ \ skip="\\\@1<!\\»"
+ \ end="»"
+ \ contains=rakuInnerFrench,@rakuInterp_qq,rakuComment,rakuBracketComment,rakuEscHash,rakuEscCloseFrench,rakuAdverb,rakuStringSQ,rakuStringDQ
+
+syn region rakuInnerFrench
+ \ matchgroup=rakuStringFrench
+ \ start="\\\@1<!«"
+ \ skip="\\\@1<!\\»"
+ \ end="»"
+ \ transparent contained
+ \ contains=rakuInnerFrench
+
+" Hyperops. They need to come after "<>" and "«»" strings in order to override
+" them, but before other types of strings, to avoid matching those delimiters
+" as parts of hyperops.
+syn match rakuHyperOp display #[^[:digit:][{('",:[:space:]][^[{('",:[:space:]]*\%(«\|<<\)#
+syn match rakuHyperOp display "«\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+[«»]"
+syn match rakuHyperOp display "»\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(«\|»\?\)"
+syn match rakuHyperOp display "<<\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|>>\)"
+syn match rakuHyperOp display ">>\%(\d\|[@%$][.?^=[:alpha:]]\)\@!\%(\.\|[^[{('".[:space:]]\)\+\%(<<\|\%(>>\)\?\)"
+
+" 'string'
+syn region rakuStringSQ
+ \ matchgroup=rakuQuote
+ \ start="'"
+ \ skip="\\\@1<!\\'"
+ \ end="'"
+ \ contains=@rakuInterp_q,rakuEscQuote
+ \ keepend extend
+
+" "string"
+syn region rakuStringDQ
+ \ matchgroup=rakuQuote
+ \ start=+"+
+ \ skip=+\\\@1<!\\"+
+ \ end=+"+
+ \ contains=@rakuInterp_qq,rakuEscDoubleQuote
+ \ keepend extend
+
+" Q// and friends
+
+syn match rakuQuoteQStart display "\%(:\|\%(sub\|role\)\s\)\@5<![Qq]\@=" nextgroup=rakuQuoteQ,rakuQuoteQ_q,rakuQuoteQ_qww,rakuQuoteQ_qq,rakuQuoteQ_to,rakuQuoteQ_qto,rakuQuoteQ_qqto,rakuIdentifier
+syn match rakuQuoteQ display "Q\%(qq\|ww\|[abcfhpsqvwx]\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ skipwhite skipempty contained
+syn match rakuQuoteQ_q display "q[abcfhpsvwx]\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_q skipwhite skipempty contained
+syn match rakuQuoteQ_qww display "qww[A-Za-z(]\@!" nextgroup=rakuPairsQ_qww skipwhite skipempty contained
+syn match rakuQuoteQ_qq display "qq\%([pwx]\|ww\)\?[A-Za-z(]\@!" nextgroup=rakuPairsQ_qq skipwhite skipempty contained
+syn match rakuQuoteQ_to display "Qto[A-Za-z(]\@!" nextgroup=rakuStringQ_to skipwhite skipempty contained
+syn match rakuQuoteQ_qto display "qto[A-Za-z(]\@!" nextgroup=rakuStringQ_qto skipwhite skipempty contained
+syn match rakuQuoteQ_qqto display "qqto[A-Za-z(]\@!" nextgroup=rakuStringQ_qqto skipwhite skipempty contained
+syn match rakuQuoteQ_qto display "q\_s*\%(\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*:\%(to\|heredoc\)\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*(\@!\)\@=" nextgroup=rakuPairsQ_qto skipwhite skipempty contained
+syn match rakuQuoteQ_qqto display "qq\_s*\%(\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*:\%(to\|heredoc\)\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*(\@!\)\@=" nextgroup=rakuPairsQ_qqto skipwhite skipempty contained
+syn match rakuPairsQ "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ
+syn match rakuPairsQ_q "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_q
+syn match rakuPairsQ_qww "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qww
+syn match rakuPairsQ_qq "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qq
+syn match rakuPairsQ_qto "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qto
+syn match rakuPairsQ_qqto "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuStringQ_qqto
+
+
+if exists("raku_embedded_pir") || exists("raku_extended_all")
+ syn include @rakuPIR syntax/pir.vim
+ syn match rakuQuote_QPIR display "Q[A-Za-z(]\@!\%(\_s*:PIR\)\@=" nextgroup=rakuPairsQ_PIR skipwhite skipempty
+ syn match rakuPairs_QPIR contained "\_s*:PIR" transparent skipwhite skipempty nextgroup=rakuStringQ_PIR
+endif
+
+" hardcoded set of delimiters
+let s:plain_delims = [
+ \ ["DQ", "\\\"", "\\\"", "rakuEscDoubleQuote", "\\\\\\@1<!\\\\\\\""],
+ \ ["SQ", "'", "'", "rakuEscQuote", "\\\\\\@1<!\\\\'"],
+ \ ["Slash", "/", "/", "rakuEscForwardSlash", "\\\\\\@1<!\\\\/"],
+ \ ["BackTick", "`", "`", "rakuEscBackTick", "\\\\\\@1<!\\\\`"],
+ \ ["Bar", "|", "|", "rakuEscVerticalBar", "\\\\\\@1<!\\\\|"],
+ \ ["Exclamation", "!", "!", "rakuEscExclamation", "\\\\\\@1<!\\\\!"],
+ \ ["Comma", ",", ",", "rakuEscComma", "\\\\\\@1<!\\\\,"],
+ \ ["Dollar", "\\$", "\\$", "rakuEscDollar", "\\\\\\@1<!\\\\\\$"],
+\ ]
+let s:bracketing_delims = [
+ \ ["Curly", "{", "}", "rakuEscCloseCurly", "\\%(\\\\\\@1<!\\\\}\\|{[^}]*}\\)"],
+ \ ["Angle", "<", ">", "rakuEscCloseAngle", "\\%(\\\\\\@1<!\\\\>\\|<[^>]*>\\)"],
+ \ ["French", "«", "»", "rakuEscCloseFrench", "\\%(\\\\\\@1<!\\\\»\\|«[^»]*»\\)"],
+ \ ["Bracket", "\\\[", "]", "rakuEscCloseBracket", "\\%(\\\\\\@1<!\\\\]\\|\\[^\\]]*]\\)"],
+ \ ["Paren", "\\s\\@1<=(", ")", "rakuEscCloseParen", "\\%(\\\\\\@1<!\\\\)\\|([^)]*)\\)"],
+\ ]
+let s:all_delims = s:plain_delims + s:bracketing_delims
+
+for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:all_delims
+ exec "syn region rakuStringQ matchgroup=rakuQuote start=\"".s:start_delim."\" end=\"".s:end_delim."\" contained"
+ exec "syn region rakuStringQ_q matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuInterp_q,".s:end_group." contained"
+ exec "syn region rakuStringQ_qww matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuInterp_q,rakuStringSQ,rakuStringDQ".s:end_group." contained"
+ exec "syn region rakuStringQ_qq matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuInterp_qq,".s:end_group." contained"
+ exec "syn region rakuStringQ_to matchgroup=rakuQuote start=\"".s:start_delim."\\z([^".s:end_delim."]\\+\\)".s:end_delim."\" end=\"^\\s*\\z1$\" contained"
+ exec "syn region rakuStringQ_qto matchgroup=rakuQuote start=\"".s:start_delim."\\z([^".s:end_delim."]\\+\\)".s:end_delim."\" skip=\"".s:skip."\" end=\"^\\s*\\z1$\" contains=@rakuInterp_q,".s:end_group." contained"
+ exec "syn region rakuStringQ_qqto matchgroup=rakuQuote start=\"".s:start_delim."\\z(\[^".s:end_delim."]\\+\\)".s:end_delim."\" skip=\"".s:skip."\" end=\"^\\s*\\z1$\" contains=@rakuInterp_qq,".s:end_group." contained"
+
+ if exists("raku_embedded_pir") || exists("raku_extended_all")
+ exec "syn region rakuStringQ_PIR matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contains=@rakuPIR,".s:end_group." contained"
+ endif
+endfor
+unlet s:name s:start_delim s:end_delim s:end_group s:skip s:plain_delims s:all_delims
+
+" :key
+syn match rakuOperator display ":\@1<!::\@!!\?" nextgroup=rakuKey,rakuStringAngleFixed,rakuStringAngles,rakuStringFrench
+syn match rakuKey display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" contained nextgroup=rakuStringAngleFixed,rakuStringAngles,rakuStringFrench
+
+" Regexes and grammars
+
+syn match rakuRegexName display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?" nextgroup=rakuRegexBlockCrap skipwhite skipempty contained
+syn match rakuRegexBlockCrap "[^{]*" nextgroup=rakuRegexBlock skipwhite skipempty transparent contained
+
+syn region rakuRegexBlock
+ \ matchgroup=rakuNormal
+ \ start="{"
+ \ end="}"
+ \ contained
+ \ contains=@rakuRegexen,@rakuVariables
+
+" Perl 6 regex bits
+
+syn cluster rakuRegexen
+ \ add=rakuRxMeta
+ \ add=rakuRxEscape
+ \ add=rakuEscCodePoint
+ \ add=rakuEscHex
+ \ add=rakuEscOct
+ \ add=rakuEscNull
+ \ add=rakuRxAnchor
+ \ add=rakuRxCapture
+ \ add=rakuRxGroup
+ \ add=rakuRxAlternation
+ \ add=rakuRxBoundary
+ \ add=rakuRxAdverb
+ \ add=rakuRxAdverbArg
+ \ add=rakuRxStorage
+ \ add=rakuRxAssertion
+ \ add=rakuRxAssertGroup
+ \ add=rakuRxQuoteWords
+ \ add=rakuRxClosure
+ \ add=rakuRxStringSQ
+ \ add=rakuRxStringDQ
+ \ add=rakuComment
+ \ add=rakuBracketComment
+ \ add=rakuMatchVarSigil
+
+syn match rakuRxMeta display contained ".\%([A-Za-z_\xC0-\xFF0-9]\|\s\)\@1<!"
+syn match rakuRxAnchor display contained "[$^]"
+syn match rakuRxEscape display contained "\\\S"
+syn match rakuRxCapture display contained "[()]"
+syn match rakuRxAlternation display contained "|"
+syn match rakuRxRange display contained "\.\."
+
+" misc escapes
+syn match rakuEscOctOld display "\\[1-9]\d\{1,2}" contained
+syn match rakuEscNull display "\\0\d\@!" contained
+syn match rakuEscCodePoint display "\\[cC]" contained nextgroup=rakuCodePoint
+syn match rakuEscHex display "\\[xX]" contained nextgroup=rakuHexSequence
+syn match rakuEscOct display "\\o" contained nextgroup=rakuOctSequence
+syn match rakuEscQQ display "\\qq" contained nextgroup=rakuQQSequence
+syn match rakuEscOpenCurly display "\\{" contained
+syn match rakuEscHash display "\\#" contained
+syn match rakuEscBackSlash display "\\\\" contained
+
+syn region rakuQQSequence
+ \ matchgroup=rakuEscape
+ \ start="\["
+ \ skip="\[[^\]]*]"
+ \ end="]"
+ \ contained transparent
+ \ contains=@rakuInterp_qq
+
+syn match rakuCodePoint display "\%(\d\+\|\S\)" contained
+syn region rakuCodePoint
+ \ matchgroup=rakuEscape
+ \ start="\["
+ \ end="]"
+ \ contained
+
+syn match rakuHexSequence display "\x\+" contained
+syn region rakuHexSequence
+ \ matchgroup=rakuEscape
+ \ start="\["
+ \ end="]"
+ \ contained
+
+syn match rakuOctSequence display "\o\+" contained
+syn region rakuOctSequence
+ \ matchgroup=rakuEscape
+ \ start="\["
+ \ end="]"
+ \ contained
+
+" $<match>, @<match>
+syn region rakuMatchVarSigil
+ \ matchgroup=rakuVariable
+ \ start="[$@]\%(<<\@!\)\@="
+ \ end=">\@1<="
+ \ contains=rakuMatchVar
+
+syn region rakuMatchVar
+ \ matchgroup=rakuTwigil
+ \ start="<"
+ \ end=">"
+ \ contained
+
+syn region rakuRxClosure
+ \ matchgroup=rakuNormal
+ \ start="{"
+ \ end="}"
+ \ contained
+ \ containedin=rakuRxClosure
+ \ contains=TOP
+syn region rakuRxGroup
+ \ matchgroup=rakuStringSpecial2
+ \ start="\["
+ \ end="]"
+ \ contained
+ \ contains=@rakuRegexen,@rakuVariables,rakuMatchVarSigil
+syn region rakuRxAssertion
+ \ matchgroup=rakuStringSpecial2
+ \ start="<\%(?\?\%(before\|after\)\|\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\)\|[+?*]\)\?"
+ \ end=">"
+ \ contained
+ \ contains=@rakuRegexen,rakuIdentifier,@rakuVariables,rakuRxCharClass,rakuRxAssertCall
+syn region rakuRxAssertGroup
+ \ matchgroup=rakuStringSpecial2
+ \ start="<\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)=\["
+ \ skip="\\\@1<!\\]"
+ \ end="]"
+ \ contained
+syn match rakuRxAssertCall display "\%(::\|\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)" contained nextgroup=rakuRxAssertArgs
+syn region rakuRxAssertArgs
+ \ start="("
+ \ end=")"
+ \ contained keepend
+ \ contains=TOP
+syn region rakuRxAssertArgs
+ \ start=":"
+ \ end="\ze>"
+ \ contained keepend
+ \ contains=TOP
+syn match rakuRxBoundary display contained "\%([«»]\|<<\|>>\)"
+syn region rakuRxCharClass
+ \ matchgroup=rakuStringSpecial2
+ \ start="\%(<[-!+?]\?\)\@2<=\["
+ \ skip="\\]"
+ \ end="]"
+ \ contained
+ \ contains=rakuRxRange,rakuRxEscape,rakuEscHex,rakuEscOct,rakuEscCodePoint,rakuEscNull
+syn region rakuRxQuoteWords
+ \ matchgroup=rakuStringSpecial2
+ \ start="<\s"
+ \ end="\s\?>"
+ \ contained
+syn region rakuRxAdverb
+ \ start="\ze\z(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)"
+ \ end="\z1\zs"
+ \ contained keepend
+ \ contains=TOP
+syn region rakuRxAdverbArg
+ \ start="\%(:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\)\@<=("
+ \ skip="([^)]\{-})"
+ \ end=")"
+ \ contained
+ \ keepend
+ \ contains=TOP
+syn region rakuRxStorage
+ \ matchgroup=rakuOperator
+ \ start="\%(^\s*\)\@<=:\%(my\>\|temp\>\)\@="
+ \ end="$"
+ \ contains=TOP
+ \ contained
+ \ keepend
+
+" 'string' inside a regex
+syn region rakuRxStringSQ
+ \ matchgroup=rakuQuote
+ \ start="'"
+ \ skip="\\\@1<!\\'"
+ \ end="'"
+ \ contained
+ \ contains=rakuEscQuote,rakuEscBackSlash
+
+" "string" inside a regex
+syn region rakuRxStringDQ
+ \ matchgroup=rakuQuote
+ \ start=+"+
+ \ skip=+\\\@1<!\\"+
+ \ end=+"+
+ \ contained
+ \ contains=rakuEscDoubleQuote,rakuEscBackSlash,@rakuInterp_qq
+
+" $!, $var, $!var, $::var, $package::var $*::package::var, etc
+" Thus must come after the matches for the "$" regex anchor, but before
+" the match for the $ regex delimiter
+syn cluster rakuVariables
+ \ add=rakuVarSlash
+ \ add=rakuVarExclam
+ \ add=rakuVarMatch
+ \ add=rakuVarNum
+ \ add=rakuVariable
+
+syn match rakuBareSigil display "[@$%&]\%(\s*\%([,)}=]\|where\>\)\)\@="
+syn match rakuVarSlash display "\$/"
+syn match rakuVarExclam display "\$!"
+syn match rakuVarMatch display "\$¢"
+syn match rakuVarNum display "\$\d\+"
+syn match rakuVariable display "self"
+syn match rakuVariable display "[@$%&]\?[@&$%]\$*\%(::\|\%(\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\)\|[A-Za-z_\xC0-\xFF]\)\@=" nextgroup=rakuTwigil,rakuVarName,rakuPackageScope
+syn match rakuVarName display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)" nextgroup=rakuPostHyperOp contained
+syn match rakuClose display "[\])]" transparent nextgroup=rakuPostHyperOp
+syn match rakuPostHyperOp display "\%(»\|>>\)" contained
+syn match rakuTwigil display "\%([.^*?=!~]\|:\@1<!::\@!\)[A-Za-z_\xC0-\xFF]\@=" nextgroup=rakuPackageScope,rakuVarName contained
+syn match rakuPackageScope display "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\?::" nextgroup=rakuPackageScope,rakuVarName contained
+
+" Perl 6 regex regions
+
+syn match rakuMatchStart_m display "\.\@1<!\<\%(mm\?\|rx\)\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_m
+syn match rakuMatchStart_s display "\.\@1<!\<[sS]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_s
+syn match rakuMatchStart_tr display "\.\@1<!\<tr\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\)\@!" skipwhite skipempty nextgroup=rakuMatchAdverbs_tr
+syn match rakuMatchAdverbs_m "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuMatch
+syn match rakuMatchAdverbs_s "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuSubstitution
+syn match rakuMatchAdverbs_tr "\%(\_s*:!\?\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\%(([^)]*)\)\?\)*" contained transparent skipwhite skipempty nextgroup=rakuTransliteration
+
+" /foo/
+syn region rakuMatchBare
+ \ matchgroup=rakuQuote
+ \ start="/\@1<!\%(\%(\_^\|[!\[,=~|&/:({]\|\^\?fff\?\^\?\|=>\|\<\%(if\|unless\|while\|when\|where\|so\)\)\s*\)\@<=/[/=]\@!"
+ \ skip="\\/"
+ \ end="/"
+ \ contains=@rakuRegexen,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum
+
+" m/foo/, m$foo$, m!foo!, etc
+syn region rakuMatch
+ \ matchgroup=rakuQuote
+ \ start=+\z([/!$,|`"]\)+
+ \ skip="\\\z1"
+ \ end="\z1"
+ \ contained
+ \ contains=@rakuRegexen,rakuVariable,rakuVarNum
+
+" m<foo>, m«foo», m{foo}, etc
+for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims
+ exec "syn region rakuMatch matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables"
+endfor
+unlet s:name s:start_delim s:end_delim s:end_group s:skip
+
+" Substitutions
+
+" s/foo//, s$foo$$, s!foo!!, etc
+syn region rakuSubstitution
+ \ matchgroup=rakuQuote
+ \ start=+\z([/!$,|`"]\)+
+ \ skip="\\\z1"
+ \ end="\z1"me=e-1
+ \ contained
+ \ contains=@rakuRegexen,rakuVariable,rakuVarNum
+ \ nextgroup=rakuReplacement
+
+syn region rakuReplacement
+ \ matchgroup=rakuQuote
+ \ start="\z(.\)"
+ \ skip="\\\z1"
+ \ end="\z1"
+ \ contained
+ \ contains=@rakuInterp_qq
+
+" s<foo><bar>, s«foo»«bar», s{foo}{bar}, etc
+for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims
+ exec "syn region rakuSubstitution matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuRegexen,@rakuVariables nextgroup=rakuRepl".s:name
+ exec "syn region rakuRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq"
+endfor
+unlet s:name s:start_delim s:end_delim s:end_group s:skip
+
+" Transliteration
+
+" tr/foo/bar/, tr|foo|bar, etc
+syn region rakuTransliteration
+ \ matchgroup=rakuQuote
+ \ start=+\z([/!$,|`"]\)+
+ \ skip="\\\z1"
+ \ end="\z1"me=e-1
+ \ contained
+ \ contains=rakuRxRange
+ \ nextgroup=rakuTransRepl
+
+syn region rakuTransRepl
+ \ matchgroup=rakuQuote
+ \ start="\z(.\)"
+ \ skip="\\\z1"
+ \ end="\z1"
+ \ contained
+ \ contains=@rakuInterp_qq,rakuRxRange
+
+" tr<foo><bar>, tr«foo»«bar», tr{foo}{bar}, etc
+for [s:name, s:start_delim, s:end_delim, s:end_group, s:skip] in s:bracketing_delims
+ exec "syn region rakuTransliteration matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=rakuRxRange nextgroup=rakuTransRepl".s:name
+ exec "syn region rakuTransRepl".s:name." matchgroup=rakuQuote start=\"".s:start_delim."\" skip=\"".s:skip."\" end=\"".s:end_delim."\" contained keepend contains=@rakuInterp_qq,rakuRxRange"
+endfor
+unlet s:name s:start_delim s:end_delim s:end_group s:skip s:bracketing_delims
+
+if exists("raku_perl5_regexes") || exists("raku_extended_all")
+
+" Perl 5 regex regions
+
+syn cluster rakuRegexP5Base
+ \ add=rakuRxP5Escape
+ \ add=rakuRxP5Oct
+ \ add=rakuRxP5Hex
+ \ add=rakuRxP5EscMeta
+ \ add=rakuRxP5CodePoint
+ \ add=rakuRxP5Prop
+
+" normal regex stuff
+syn cluster rakuRegexP5
+ \ add=@rakuRegexP5Base
+ \ add=rakuRxP5Quantifier
+ \ add=rakuRxP5Meta
+ \ add=rakuRxP5QuoteMeta
+ \ add=rakuRxP5ParenMod
+ \ add=rakuRxP5Verb
+ \ add=rakuRxP5Count
+ \ add=rakuRxP5Named
+ \ add=rakuRxP5ReadRef
+ \ add=rakuRxP5WriteRef
+ \ add=rakuRxP5CharClass
+ \ add=rakuRxP5Anchor
+
+" inside character classes
+syn cluster rakuRegexP5Class
+ \ add=@rakuRegexP5Base
+ \ add=rakuRxP5Posix
+ \ add=rakuRxP5Range
+
+syn match rakuRxP5Escape display contained "\\\S"
+syn match rakuRxP5CodePoint display contained "\\c\S\@=" nextgroup=rakuRxP5CPId
+syn match rakuRxP5CPId display contained "\S"
+syn match rakuRxP5Oct display contained "\\\%(\o\{1,3}\)\@=" nextgroup=rakuRxP5OctSeq
+syn match rakuRxP5OctSeq display contained "\o\{1,3}"
+syn match rakuRxP5Anchor display contained "[\^$]"
+syn match rakuRxP5Hex display contained "\\x\%({\x\+}\|\x\{1,2}\)\@=" nextgroup=rakuRxP5HexSeq
+syn match rakuRxP5HexSeq display contained "\x\{1,2}"
+syn region rakuRxP5HexSeq
+ \ matchgroup=rakuRxP5Escape
+ \ start="{"
+ \ end="}"
+ \ contained
+syn region rakuRxP5Named
+ \ matchgroup=rakuRxP5Escape
+ \ start="\%(\\N\)\@2<={"
+ \ end="}"
+ \ contained
+syn match rakuRxP5Quantifier display contained "\%([+*]\|(\@1<!?\)"
+syn match rakuRxP5ReadRef display contained "\\[1-9]\d\@!"
+syn match rakuRxP5ReadRef display contained "\[A-Za-z_\xC0-\xFF0-9]<\@=" nextgroup=rakuRxP5ReadRefId
+syn region rakuRxP5ReadRefId
+ \ matchgroup=rakuRxP5Escape
+ \ start="<"
+ \ end=">"
+ \ contained
+syn match rakuRxP5WriteRef display contained "\\g\%(\d\|{\)\@=" nextgroup=rakuRxP5WriteRefId
+syn match rakuRxP5WriteRefId display contained "\d\+"
+syn region rakuRxP5WriteRefId
+ \ matchgroup=rakuRxP5Escape
+ \ start="{"
+ \ end="}"
+ \ contained
+syn match rakuRxP5Prop display contained "\\[pP]\%(\a\|{\)\@=" nextgroup=rakuRxP5PropId
+syn match rakuRxP5PropId display contained "\a"
+syn region rakuRxP5PropId
+ \ matchgroup=rakuRxP5Escape
+ \ start="{"
+ \ end="}"
+ \ contained
+syn match rakuRxP5Meta display contained "[(|).]"
+syn match rakuRxP5ParenMod display contained "(\@1<=?\@=" nextgroup=rakuRxP5Mod,rakuRxP5ModName,rakuRxP5Code
+syn match rakuRxP5Mod display contained "?\%(<\?=\|<\?!\|[#:|]\)"
+syn match rakuRxP5Mod display contained "?-\?[impsx]\+"
+syn match rakuRxP5Mod display contained "?\%([-+]\?\d\+\|R\)"
+syn match rakuRxP5Mod display contained "?(DEFINE)"
+syn match rakuRxP5Mod display contained "?\%(&\|P[>=]\)" nextgroup=rakuRxP5ModDef
+syn match rakuRxP5ModDef display contained "\h\w*"
+syn region rakuRxP5ModName
+ \ matchgroup=rakuStringSpecial
+ \ start="?'"
+ \ end="'"
+ \ contained
+syn region rakuRxP5ModName
+ \ matchgroup=rakuStringSpecial
+ \ start="?P\?<"
+ \ end=">"
+ \ contained
+syn region rakuRxP5Code
+ \ matchgroup=rakuStringSpecial
+ \ start="??\?{"
+ \ end="})\@="
+ \ contained
+ \ contains=TOP
+syn match rakuRxP5EscMeta display contained "\\[?*.{}()[\]|\^$]"
+syn match rakuRxP5Count display contained "\%({\d\+\%(,\%(\d\+\)\?\)\?}\)\@=" nextgroup=rakuRxP5CountId
+syn region rakuRxP5CountId
+ \ matchgroup=rakuRxP5Escape
+ \ start="{"
+ \ end="}"
+ \ contained
+syn match rakuRxP5Verb display contained "(\@1<=\*\%(\%(PRUNE\|SKIP\|THEN\)\%(:[^)]*\)\?\|\%(MARK\|\):[^)]*\|COMMIT\|F\%(AIL\)\?\|ACCEPT\)"
+syn region rakuRxP5QuoteMeta
+ \ matchgroup=rakuRxP5Escape
+ \ start="\\Q"
+ \ end="\\E"
+ \ contained
+ \ contains=@rakuVariables,rakuEscBackSlash
+syn region rakuRxP5CharClass
+ \ matchgroup=rakuStringSpecial
+ \ start="\[\^\?"
+ \ skip="\\]"
+ \ end="]"
+ \ contained
+ \ contains=@rakuRegexP5Class
+syn region rakuRxP5Posix
+ \ matchgroup=rakuRxP5Escape
+ \ start="\[:"
+ \ end=":]"
+ \ contained
+syn match rakuRxP5Range display contained "-"
+
+" m:P5//
+syn region rakuMatch
+ \ matchgroup=rakuQuote
+ \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=/"
+ \ skip="\\/"
+ \ end="/"
+ \ contains=@rakuRegexP5,rakuVariable,rakuVarExclam,rakuVarMatch,rakuVarNum
+
+" m:P5!!
+syn region rakuMatch
+ \ matchgroup=rakuQuote
+ \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=!"
+ \ skip="\\!"
+ \ end="!"
+ \ contains=@rakuRegexP5,rakuVariable,rakuVarSlash,rakuVarMatch,rakuVarNum
+
+" m:P5$$, m:P5||, etc
+syn region rakuMatch
+ \ matchgroup=rakuQuote
+ \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=\z([\"'`|,$]\)"
+ \ skip="\\\z1"
+ \ end="\z1"
+ \ contains=@rakuRegexP5,@rakuVariables
+
+" m:P5 ()
+syn region rakuMatch
+ \ matchgroup=rakuQuote
+ \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s\+\)\@<=()\@!"
+ \ skip="\\)"
+ \ end=")"
+ \ contains=@rakuRegexP5,@rakuVariables
+
+" m:P5[]
+syn region rakuMatch
+ \ matchgroup=rakuQuote
+ \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=[]\@!"
+ \ skip="\\]"
+ \ end="]"
+ \ contains=@rakuRegexP5,@rakuVariables
+
+" m:P5{}
+syn region rakuMatch
+ \ matchgroup=rakuQuote
+ \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<={}\@!"
+ \ skip="\\}"
+ \ end="}"
+ \ contains=@rakuRegexP5,rakuVariables
+
+" m:P5<>
+syn region rakuMatch
+ \ matchgroup=rakuQuote
+ \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=<>\@!"
+ \ skip="\\>"
+ \ end=">"
+ \ contains=@rakuRegexP5,rakuVariables
+
+" m:P5«»
+syn region rakuMatch
+ \ matchgroup=rakuQuote
+ \ start="\%(\%(::\|[$@%&][.!^:*?]\?\|\.\)\@2<!\<m\s*:P\%(erl\)\?5\s*\)\@<=«»\@!"
+ \ skip="\\»"
+ \ end="»"
+ \ contains=@rakuRegexP5,rakuVariables
+
+endif
+
+" Comments
+
+syn match rakuAttention display "\<\%(ACHTUNG\|ATTN\|ATTENTION\|FIXME\|NB\|TODO\|TBD\|WTF\|XXX\|NOTE\)" contained
+
+" normal end-of-line comment
+syn match rakuComment display "#.*" contains=rakuAttention
+
+" Multiline comments. Arbitrary numbers of opening brackets are allowed,
+" but we only define regions for 1 to 3
+syn region rakuBracketComment
+ \ start="#[`|=]("
+ \ skip="([^)]*)"
+ \ end=")"
+ \ contains=rakuAttention,rakuBracketComment
+syn region rakuBracketComment
+ \ start="#[`|=]\["
+ \ skip="\[[^\]]*]"
+ \ end="]"
+ \ contains=rakuAttention,rakuBracketComment
+syn region rakuBracketComment
+ \ start="#[`|=]{"
+ \ skip="{[^}]*}"
+ \ end="}"
+ \ contains=rakuAttention,rakuBracketComment
+syn region rakuBracketComment
+ \ start="#[`|=]<"
+ \ skip="<[^>]*>"
+ \ end=">"
+ \ contains=rakuAttention,rakuBracketComment
+syn region rakuBracketComment
+ \ start="#[`|=]«"
+ \ skip="«[^»]*»"
+ \ end="»"
+ \ contains=rakuAttention,rakuBracketComment
+
+" Comments with double and triple delimiters
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=](("
+ \ skip="((\%([^)\|))\@!]\)*))"
+ \ end="))"
+ \ contains=rakuAttention,rakuBracketComment
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=]((("
+ \ skip="(((\%([^)]\|)\%())\)\@!\)*)))"
+ \ end=")))"
+ \ contains=rakuAttention,rakuBracketComment
+
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=]\[\["
+ \ skip="\[\[\%([^\]]\|]]\@!\)*]]"
+ \ end="]]"
+ \ contains=rakuAttention,rakuBracketComment
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=]\[\[\["
+ \ skip="\[\[\[\%([^\]]\|]\%(]]\)\@!\)*]]]"
+ \ end="]]]"
+ \ contains=rakuAttention,rakuBracketComment
+
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=]{{"
+ \ skip="{{\%([^}]\|}}\@!\)*}}"
+ \ end="}}"
+ \ contains=rakuAttention,rakuBracketComment
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=]{{{"
+ \ skip="{{{\%([^}]\|}\%(}}\)\@!\)*}}}"
+ \ end="}}}"
+ \ contains=rakuAttention,rakuBracketComment
+
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=]<<"
+ \ skip="<<\%([^>]\|>>\@!\)*>>"
+ \ end=">>"
+ \ contains=rakuAttention,rakuBracketComment
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=]<<<"
+ \ skip="<<<\%([^>]\|>\%(>>\)\@!\)*>>>"
+ \ end=">>>"
+ \ contains=rakuAttention,rakuBracketComment
+
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=]««"
+ \ skip="««\%([^»]\|»»\@!\)*»»"
+ \ end="»»"
+ \ contains=rakuAttention,rakuBracketComment
+syn region rakuBracketComment
+ \ matchgroup=rakuBracketComment
+ \ start="#[`|=]«««"
+ \ skip="«««\%([^»]\|»\%(»»\)\@!\)*»»»"
+ \ end="»»»"
+ \ contains=rakuAttention,rakuBracketComment
+
+syn match rakuShebang display "\%^#!.*"
+
+" => autoquoting
+syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\%(p5\)\@2<![RSXZ]\@1<!=>"
+syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\ze\s\+=>"
+syn match rakuStringAuto display "\.\@1<!\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)p5\ze=>"
+
+" Pod
+
+" Abbreviated blocks (implicit code forbidden)
+syn region rakuPodAbbrRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^\s*\zs=\ze\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contains=rakuPodAbbrNoCodeType
+ \ keepend
+
+syn region rakuPodAbbrNoCodeType
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=rakuPodName,rakuPodAbbrNoCode
+
+syn match rakuPodName contained ".\+" contains=@rakuPodFormat
+syn match rakuPodComment contained ".\+"
+
+syn region rakuPodAbbrNoCode
+ \ start="^"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=@rakuPodFormat
+
+" Abbreviated blocks (everything is code)
+syn region rakuPodAbbrRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^\s*\zs=\zecode\>"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contains=rakuPodAbbrCodeType
+ \ keepend
+
+syn region rakuPodAbbrCodeType
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=rakuPodName,rakuPodAbbrCode
+
+syn region rakuPodAbbrCode
+ \ start="^"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+
+" Abbreviated blocks (everything is a comment)
+syn region rakuPodAbbrRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^=\zecomment\>"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contains=rakuPodAbbrCommentType
+ \ keepend
+
+syn region rakuPodAbbrCommentType
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=rakuPodComment,rakuPodAbbrNoCode
+
+" Abbreviated blocks (implicit code allowed)
+syn region rakuPodAbbrRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^=\ze\%(pod\|item\|nested\|\u\+\)\>"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contains=rakuPodAbbrType
+ \ keepend
+
+syn region rakuPodAbbrType
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=rakuPodName,rakuPodAbbr
+
+syn region rakuPodAbbr
+ \ start="^"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=@rakuPodFormat,rakuPodImplicitCode
+
+" Abbreviated block to end-of-file
+syn region rakuPodAbbrRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^=\zeEND\>"
+ \ end="\%$"
+ \ contains=rakuPodAbbrEOFType
+ \ keepend
+
+syn region rakuPodAbbrEOFType
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="\%$"
+ \ contained
+ \ contains=rakuPodName,rakuPodAbbrEOF
+
+syn region rakuPodAbbrEOF
+ \ start="^"
+ \ end="\%$"
+ \ contained
+ \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
+
+" Directives
+syn region rakuPodDirectRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^=\%(config\|use\)\>"
+ \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
+ \ contains=rakuPodDirectArgRegion
+ \ keepend
+
+syn region rakuPodDirectArgRegion
+ \ matchgroup=rakuPodType
+ \ start="\S\+"
+ \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
+ \ contained
+ \ contains=rakuPodDirectConfigRegion
+
+syn region rakuPodDirectConfigRegion
+ \ start=""
+ \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
+ \ contained
+ \ contains=@rakuPodConfig
+
+" =encoding is a special directive
+syn region rakuPodDirectRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^=encoding\>"
+ \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
+ \ contains=rakuPodEncodingArgRegion
+ \ keepend
+
+syn region rakuPodEncodingArgRegion
+ \ matchgroup=rakuPodName
+ \ start="\S\+"
+ \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
+ \ contained
+
+" Paragraph blocks (implicit code forbidden)
+syn region rakuPodParaRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^\s*\zs=for\>"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contains=rakuPodParaNoCodeTypeRegion
+ \ keepend extend
+
+syn region rakuPodParaNoCodeTypeRegion
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=rakuPodParaNoCode,rakuPodParaConfigRegion
+
+syn region rakuPodParaConfigRegion
+ \ start=""
+ \ end="^\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\@1<!\)"
+ \ contained
+ \ contains=@rakuPodConfig
+
+syn region rakuPodParaNoCode
+ \ start="^[^=]"
+ \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=@rakuPodFormat
+
+" Paragraph blocks (everything is code)
+syn region rakuPodParaRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^\s*\zs=for\>\ze\s*code\>"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contains=rakuPodParaCodeTypeRegion
+ \ keepend extend
+
+syn region rakuPodParaCodeTypeRegion
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=rakuPodParaCode,rakuPodParaConfigRegion
+
+syn region rakuPodParaCode
+ \ start="^[^=]"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+
+" Paragraph blocks (implicit code allowed)
+syn region rakuPodParaRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^\s*\zs=for\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
+ \ end="^\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contains=rakuPodParaTypeRegion
+ \ keepend extend
+
+syn region rakuPodParaTypeRegion
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=rakuPodPara,rakuPodParaConfigRegion
+
+syn region rakuPodPara
+ \ start="^[^=]"
+ \ end="^\s*\zs\ze\%(\s*$\|=[A-Za-z_\xC0-\xFF]\)"
+ \ contained
+ \ contains=@rakuPodFormat,rakuPodImplicitCode
+
+" Paragraph block to end-of-file
+syn region rakuPodParaRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^=for\>\ze\s\+END\>"
+ \ end="\%$"
+ \ contains=rakuPodParaEOFTypeRegion
+ \ keepend extend
+
+syn region rakuPodParaEOFTypeRegion
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="\%$"
+ \ contained
+ \ contains=rakuPodParaEOF,rakuPodParaConfigRegion
+
+syn region rakuPodParaEOF
+ \ start="^[^=]"
+ \ end="\%$"
+ \ contained
+ \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
+
+" Delimited blocks (implicit code forbidden)
+syn region rakuPodDelimRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^\z(\s*\)\zs=begin\>"
+ \ end="^\z1\zs=end\>"
+ \ contains=rakuPodDelimNoCodeTypeRegion
+ \ keepend extend skipwhite
+ \ nextgroup=rakuPodType
+
+syn region rakuPodDelimNoCodeTypeRegion
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\s*\zs\ze=end\>"
+ \ contained
+ \ contains=rakuPodDelimNoCode,rakuPodDelimConfigRegion
+
+syn region rakuPodDelimConfigRegion
+ \ start=""
+ \ end="^\s*\zs\ze\%([^=]\|=[A-Za-z_\xC0-\xFF]\|\s*$\)"
+ \ contained
+ \ contains=@rakuPodConfig
+
+syn region rakuPodDelimNoCode
+ \ start="^"
+ \ end="^\s*\zs\ze=end\>"
+ \ contained
+ \ contains=@rakuPodNestedBlocks,@rakuPodFormat
+
+" Delimited blocks (everything is code)
+syn region rakuPodDelimRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^\z(\s*\)\zs=begin\>\ze\s*code\>"
+ \ end="^\z1\zs=end\>"
+ \ contains=rakuPodDelimCodeTypeRegion
+ \ keepend extend skipwhite
+ \ nextgroup=rakuPodType
+
+syn region rakuPodDelimCodeTypeRegion
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\s*\zs\ze=end\>"
+ \ contained
+ \ contains=rakuPodDelimCode,rakuPodDelimConfigRegion
+
+syn region rakuPodDelimCode
+ \ start="^"
+ \ end="^\s*\zs\ze=end\>"
+ \ contained
+ \ contains=@rakuPodNestedBlocks
+
+" Delimited blocks (implicit code allowed)
+syn region rakuPodDelimRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^\z(\s*\)\zs=begin\>\ze\s*\%(pod\|item\|nested\|\u\+\)\>"
+ \ end="^\z1\zs=end\>"
+ \ contains=rakuPodDelimTypeRegion
+ \ keepend extend skipwhite
+ \ nextgroup=rakuPodType
+
+syn region rakuPodDelimTypeRegion
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="^\s*\zs\ze=end\>"
+ \ contained
+ \ contains=rakuPodDelim,rakuPodDelimConfigRegion
+
+syn region rakuPodDelim
+ \ start="^"
+ \ end="^\s*\zs\ze=end\>"
+ \ contained
+ \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
+
+" Delimited block to end-of-file
+syn region rakuPodDelimRegion
+ \ matchgroup=rakuPodPrefix
+ \ start="^=begin\>\ze\s\+END\>"
+ \ end="\%$"
+ \ extend
+ \ contains=rakuPodDelimEOFTypeRegion
+
+syn region rakuPodDelimEOFTypeRegion
+ \ matchgroup=rakuPodType
+ \ start="\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+ \ end="\%$"
+ \ contained
+ \ contains=rakuPodDelimEOF,rakuPodDelimConfigRegion
+
+syn region rakuPodDelimEOF
+ \ start="^"
+ \ end="\%$"
+ \ contained
+ \ contains=@rakuPodNestedBlocks,@rakuPodFormat,rakuPodImplicitCode
+
+syn cluster rakuPodConfig
+ \ add=rakuPodConfigOperator
+ \ add=rakuPodExtraConfig
+ \ add=rakuStringAuto
+ \ add=rakuPodAutoQuote
+ \ add=rakuStringSQ
+
+syn region rakuPodParens
+ \ start="("
+ \ end=")"
+ \ contained
+ \ contains=rakuNumber,rakuStringSQ
+
+syn match rakuPodAutoQuote display contained "=>"
+syn match rakuPodConfigOperator display contained ":!\?" nextgroup=rakuPodConfigOption
+syn match rakuPodConfigOption display contained "[^[:space:](<]\+" nextgroup=rakuPodParens,rakuStringAngle
+syn match rakuPodExtraConfig display contained "^="
+syn match rakuPodVerticalBar display contained "|"
+syn match rakuPodColon display contained ":"
+syn match rakuPodSemicolon display contained ";"
+syn match rakuPodComma display contained ","
+syn match rakuPodImplicitCode display contained "^\s.*"
+syn match rakuPodType display contained "\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)"
+
+" These may appear inside delimited blocks
+syn cluster rakuPodNestedBlocks
+ \ add=rakuPodAbbrRegion
+ \ add=rakuPodDirectRegion
+ \ add=rakuPodParaRegion
+ \ add=rakuPodDelimRegion
+
+" Pod formatting codes
+
+syn cluster rakuPodFormat
+ \ add=rakuPodFormatOne
+ \ add=rakuPodFormatTwo
+ \ add=rakuPodFormatThree
+ \ add=rakuPodFormatFrench
+
+" Balanced angles found inside formatting codes. Ensures proper nesting.
+
+syn region rakuPodFormatAnglesOne
+ \ matchgroup=rakuPodFormat
+ \ start="<"
+ \ skip="<[^>]*>"
+ \ end=">"
+ \ transparent contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne
+
+syn region rakuPodFormatAnglesTwo
+ \ matchgroup=rakuPodFormat
+ \ start="<<"
+ \ skip="<<[^>]*>>"
+ \ end=">>"
+ \ transparent contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo
+
+syn region rakuPodFormatAnglesThree
+ \ matchgroup=rakuPodFormat
+ \ start="<<<"
+ \ skip="<<<[^>]*>>>"
+ \ end=">>>"
+ \ transparent contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree
+
+syn region rakuPodFormatAnglesFrench
+ \ matchgroup=rakuPodFormat
+ \ start="«"
+ \ skip="«[^»]*»"
+ \ end="»"
+ \ transparent contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatAnglesOne,rakuPodFormatAnglesTwo,rakuPodFormatAnglesThree
+
+" All formatting codes
+
+syn region rakuPodFormatOne
+ \ matchgroup=rakuPodFormatCode
+ \ start="\u<"
+ \ skip="<[^>]*>"
+ \ end=">"
+ \ contained
+ \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne
+
+syn region rakuPodFormatTwo
+ \ matchgroup=rakuPodFormatCode
+ \ start="\u<<"
+ \ skip="<<[^>]*>>"
+ \ end=">>"
+ \ contained
+ \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo
+
+syn region rakuPodFormatThree
+ \ matchgroup=rakuPodFormatCode
+ \ start="\u<<<"
+ \ skip="<<<[^>]*>>>"
+ \ end=">>>"
+ \ contained
+ \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree
+
+syn region rakuPodFormatFrench
+ \ matchgroup=rakuPodFormatCode
+ \ start="\u«"
+ \ skip="«[^»]*»"
+ \ end="»"
+ \ contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree
+
+" C<> and V<> don't allow nested formatting formatting codes
+
+syn region rakuPodFormatOne
+ \ matchgroup=rakuPodFormatCode
+ \ start="[CV]<"
+ \ skip="<[^>]*>"
+ \ end=">"
+ \ contained
+ \ contains=rakuPodFormatAnglesOne
+
+syn region rakuPodFormatTwo
+ \ matchgroup=rakuPodFormatCode
+ \ start="[CV]<<"
+ \ skip="<<[^>]*>>"
+ \ end=">>"
+ \ contained
+ \ contains=rakuPodFormatAnglesTwo
+
+syn region rakuPodFormatThree
+ \ matchgroup=rakuPodFormatCode
+ \ start="[CV]<<<"
+ \ skip="<<<[^>]*>>>"
+ \ end=">>>"
+ \ contained
+ \ contains=rakuPodFormatAnglesThree
+
+syn region rakuPodFormatFrench
+ \ matchgroup=rakuPodFormatCode
+ \ start="[CV]«"
+ \ skip="«[^»]*»"
+ \ end="»"
+ \ contained
+ \ contains=rakuPodFormatAnglesFrench
+
+" L<> can have a "|" separator
+
+syn region rakuPodFormatOne
+ \ matchgroup=rakuPodFormatCode
+ \ start="L<"
+ \ skip="<[^>]*>"
+ \ end=">"
+ \ contained
+ \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar
+
+syn region rakuPodFormatTwo
+ \ matchgroup=rakuPodFormatCode
+ \ start="L<<"
+ \ skip="<<[^>]*>>"
+ \ end=">>"
+ \ contained
+ \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar
+
+syn region rakuPodFormatThree
+ \ matchgroup=rakuPodFormatCode
+ \ start="L<<<"
+ \ skip="<<<[^>]*>>>"
+ \ end=">>>"
+ \ contained
+ \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar
+
+syn region rakuPodFormatFrench
+ \ matchgroup=rakuPodFormatCode
+ \ start="L«"
+ \ skip="«[^»]*»"
+ \ end="»"
+ \ contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar
+
+" E<> can have a ";" separator
+
+syn region rakuPodFormatOne
+ \ matchgroup=rakuPodFormatCode
+ \ start="E<"
+ \ skip="<[^>]*>"
+ \ end=">"
+ \ contained
+ \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodSemiColon
+
+syn region rakuPodFormatTwo
+ \ matchgroup=rakuPodFormatCode
+ \ start="E<<"
+ \ skip="<<[^>]*>>"
+ \ end=">>"
+ \ contained
+ \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodSemiColon
+
+syn region rakuPodFormatThree
+ \ matchgroup=rakuPodFormatCode
+ \ start="E<<<"
+ \ skip="<<<[^>]*>>>"
+ \ end=">>>"
+ \ contained
+ \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon
+
+syn region rakuPodFormatFrench
+ \ matchgroup=rakuPodFormatCode
+ \ start="E«"
+ \ skip="«[^»]*»"
+ \ end="»"
+ \ contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodSemiColon
+
+" M<> can have a ":" separator
+
+syn region rakuPodFormatOne
+ \ matchgroup=rakuPodFormatCode
+ \ start="M<"
+ \ skip="<[^>]*>"
+ \ end=">"
+ \ contained
+ \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodColon
+
+syn region rakuPodFormatTwo
+ \ matchgroup=rakuPodFormatCode
+ \ start="M<<"
+ \ skip="<<[^>]*>>"
+ \ end=">>"
+ \ contained
+ \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodColon
+
+syn region rakuPodFormatThree
+ \ matchgroup=rakuPodFormatCode
+ \ start="M<<<"
+ \ skip="<<<[^>]*>>>"
+ \ end=">>>"
+ \ contained
+ \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon
+
+syn region rakuPodFormatFrench
+ \ matchgroup=rakuPodFormatCode
+ \ start="M«"
+ \ skip="«[^»]*»"
+ \ end="»"
+ \ contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodColon
+
+" D<> can have "|" and ";" separators
+
+syn region rakuPodFormatOne
+ \ matchgroup=rakuPodFormatCode
+ \ start="D<"
+ \ skip="<[^>]*>"
+ \ end=">"
+ \ contained
+ \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon
+
+syn region rakuPodFormatTwo
+ \ matchgroup=rakuPodFormatCode
+ \ start="D<<"
+ \ skip="<<[^>]*>>"
+ \ end=">>"
+ \ contained
+ \ contains=rakuPodFormatAngleTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon
+
+syn region rakuPodFormatThree
+ \ matchgroup=rakuPodFormatCode
+ \ start="D<<<"
+ \ skip="<<<[^>]*>>>"
+ \ end=">>>"
+ \ contained
+ \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon
+
+syn region rakuPodFormatFrench
+ \ matchgroup=rakuPodFormatCode
+ \ start="D«"
+ \ skip="«[^»]*»"
+ \ end="»"
+ \ contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon
+
+" X<> can have "|", "," and ";" separators
+
+syn region rakuPodFormatOne
+ \ matchgroup=rakuPodFormatCode
+ \ start="X<"
+ \ skip="<[^>]*>"
+ \ end=">"
+ \ contained
+ \ contains=rakuPodFormatAnglesOne,rakuPodFormatFrench,rakuPodFormatOne,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
+
+syn region rakuPodFormatTwo
+ \ matchgroup=rakuPodFormatCode
+ \ start="X<<"
+ \ skip="<<[^>]*>>"
+ \ end=">>"
+ \ contained
+ \ contains=rakuPodFormatAnglesTwo,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
+
+syn region rakuPodFormatThree
+ \ matchgroup=rakuPodFormatCode
+ \ start="X<<<"
+ \ skip="<<<[^>]*>>>"
+ \ end=">>>"
+ \ contained
+ \ contains=rakuPodFormatAnglesThree,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
+
+syn region rakuPodFormatFrench
+ \ matchgroup=rakuPodFormatCode
+ \ start="X«"
+ \ skip="«[^»]*»"
+ \ end="»"
+ \ contained
+ \ contains=rakuPodFormatAnglesFrench,rakuPodFormatFrench,rakuPodFormatOne,rakuPodFormatTwo,rakuPodFormatThree,rakuPodVerticalBar,rakuPodSemiColon,rakuPodComma
+
+" Define the default highlighting.
+" For version 5.7 and earlier: only when not done already
+" For version 5.8 and later: only when an item doesn't have highlighting yet
+if version >= 508 || !exists("did_raku_syntax_inits")
+ if version < 508
+ let did_raku_syntax_inits = 1
+ command -nargs=+ HiLink hi link <args>
+ else
+ command -nargs=+ HiLink hi def link <args>
+ endif
+
+ HiLink rakuEscOctOld rakuError
+ HiLink rakuPackageTwigil rakuTwigil
+ HiLink rakuStringAngle rakuString
+ HiLink rakuStringAngleFixed rakuString
+ HiLink rakuStringFrench rakuString
+ HiLink rakuStringAngles rakuString
+ HiLink rakuStringSQ rakuString
+ HiLink rakuStringDQ rakuString
+ HiLink rakuStringQ rakuString
+ HiLink rakuStringQ_q rakuString
+ HiLink rakuStringQ_qww rakuString
+ HiLink rakuStringQ_qq rakuString
+ HiLink rakuStringQ_to rakuString
+ HiLink rakuStringQ_qto rakuString
+ HiLink rakuStringQ_qqto rakuString
+ HiLink rakuRxStringSQ rakuString
+ HiLink rakuRxStringDQ rakuString
+ HiLink rakuReplacement rakuString
+ HiLink rakuReplCurly rakuString
+ HiLink rakuReplAngle rakuString
+ HiLink rakuReplFrench rakuString
+ HiLink rakuReplBracket rakuString
+ HiLink rakuReplParen rakuString
+ HiLink rakuTransliteration rakuString
+ HiLink rakuTransRepl rakuString
+ HiLink rakuTransReplCurly rakuString
+ HiLink rakuTransReplAngle rakuString
+ HiLink rakuTransReplFrench rakuString
+ HiLink rakuTransReplBracket rakuString
+ HiLink rakuTransReplParen rakuString
+ HiLink rakuStringAuto rakuString
+ HiLink rakuKey rakuString
+ HiLink rakuMatch rakuString
+ HiLink rakuSubstitution rakuString
+ HiLink rakuMatchBare rakuString
+ HiLink rakuRegexBlock rakuString
+ HiLink rakuRxP5CharClass rakuString
+ HiLink rakuRxP5QuoteMeta rakuString
+ HiLink rakuRxCharClass rakuString
+ HiLink rakuRxQuoteWords rakuString
+ HiLink rakuReduceOp rakuOperator
+ HiLink rakuSetOp rakuOperator
+ HiLink rakuRSXZOp rakuOperator
+ HiLink rakuHyperOp rakuOperator
+ HiLink rakuPostHyperOp rakuOperator
+ HiLink rakuQuoteQ rakuQuote
+ HiLink rakuQuoteQ_q rakuQuote
+ HiLink rakuQuoteQ_qww rakuQuote
+ HiLink rakuQuoteQ_qq rakuQuote
+ HiLink rakuQuoteQ_to rakuQuote
+ HiLink rakuQuoteQ_qto rakuQuote
+ HiLink rakuQuoteQ_qqto rakuQuote
+ HiLink rakuQuoteQ_PIR rakuQuote
+ HiLink rakuMatchStart_m rakuQuote
+ HiLink rakuMatchStart_s rakuQuote
+ HiLink rakuMatchStart_tr rakuQuote
+ HiLink rakuBareSigil rakuVariable
+ HiLink rakuRxRange rakuStringSpecial
+ HiLink rakuRxAnchor rakuStringSpecial
+ HiLink rakuRxBoundary rakuStringSpecial
+ HiLink rakuRxP5Anchor rakuStringSpecial
+ HiLink rakuCodePoint rakuStringSpecial
+ HiLink rakuRxMeta rakuStringSpecial
+ HiLink rakuRxP5Range rakuStringSpecial
+ HiLink rakuRxP5CPId rakuStringSpecial
+ HiLink rakuRxP5Posix rakuStringSpecial
+ HiLink rakuRxP5Mod rakuStringSpecial
+ HiLink rakuRxP5HexSeq rakuStringSpecial
+ HiLink rakuRxP5OctSeq rakuStringSpecial
+ HiLink rakuRxP5WriteRefId rakuStringSpecial
+ HiLink rakuHexSequence rakuStringSpecial
+ HiLink rakuOctSequence rakuStringSpecial
+ HiLink rakuRxP5Named rakuStringSpecial
+ HiLink rakuRxP5PropId rakuStringSpecial
+ HiLink rakuRxP5Quantifier rakuStringSpecial
+ HiLink rakuRxP5CountId rakuStringSpecial
+ HiLink rakuRxP5Verb rakuStringSpecial
+ HiLink rakuRxAssertGroup rakuStringSpecial2
+ HiLink rakuEscape rakuStringSpecial2
+ HiLink rakuEscNull rakuStringSpecial2
+ HiLink rakuEscHash rakuStringSpecial2
+ HiLink rakuEscQQ rakuStringSpecial2
+ HiLink rakuEscQuote rakuStringSpecial2
+ HiLink rakuEscDoubleQuote rakuStringSpecial2
+ HiLink rakuEscBackTick rakuStringSpecial2
+ HiLink rakuEscForwardSlash rakuStringSpecial2
+ HiLink rakuEscVerticalBar rakuStringSpecial2
+ HiLink rakuEscExclamation rakuStringSpecial2
+ HiLink rakuEscDollar rakuStringSpecial2
+ HiLink rakuEscOpenCurly rakuStringSpecial2
+ HiLink rakuEscCloseCurly rakuStringSpecial2
+ HiLink rakuEscCloseBracket rakuStringSpecial2
+ HiLink rakuEscCloseAngle rakuStringSpecial2
+ HiLink rakuEscCloseFrench rakuStringSpecial2
+ HiLink rakuEscBackSlash rakuStringSpecial2
+ HiLink rakuEscCodePoint rakuStringSpecial2
+ HiLink rakuEscOct rakuStringSpecial2
+ HiLink rakuEscHex rakuStringSpecial2
+ HiLink rakuRxEscape rakuStringSpecial2
+ HiLink rakuRxCapture rakuStringSpecial2
+ HiLink rakuRxAlternation rakuStringSpecial2
+ HiLink rakuRxP5 rakuStringSpecial2
+ HiLink rakuRxP5ReadRef rakuStringSpecial2
+ HiLink rakuRxP5Oct rakuStringSpecial2
+ HiLink rakuRxP5Hex rakuStringSpecial2
+ HiLink rakuRxP5EscMeta rakuStringSpecial2
+ HiLink rakuRxP5Meta rakuStringSpecial2
+ HiLink rakuRxP5Escape rakuStringSpecial2
+ HiLink rakuRxP5CodePoint rakuStringSpecial2
+ HiLink rakuRxP5WriteRef rakuStringSpecial2
+ HiLink rakuRxP5Prop rakuStringSpecial2
+
+ HiLink rakuProperty Tag
+ HiLink rakuAttention Todo
+ HiLink rakuType Type
+ HiLink rakuError Error
+ HiLink rakuBlockLabel Label
+ HiLink rakuNormal Normal
+ HiLink rakuIdentifier Normal
+ HiLink rakuPackage Normal
+ HiLink rakuPackageScope Normal
+ HiLink rakuNumber Number
+ HiLink rakuOctNumber Number
+ HiLink rakuBinNumber Number
+ HiLink rakuHexNumber Number
+ HiLink rakuDecNumber Number
+ HiLink rakuString String
+ HiLink rakuRepeat Repeat
+ HiLink rakuPragma Keyword
+ HiLink rakuPreDeclare Keyword
+ HiLink rakuDeclare Keyword
+ HiLink rakuDeclareRegex Keyword
+ HiLink rakuVarStorage Special
+ HiLink rakuFlowControl Special
+ HiLink rakuOctBase Special
+ HiLink rakuBinBase Special
+ HiLink rakuHexBase Special
+ HiLink rakuDecBase Special
+ HiLink rakuTwigil Special
+ HiLink rakuStringSpecial2 Special
+ HiLink rakuVersion Special
+ HiLink rakuComment Comment
+ HiLink rakuBracketComment Comment
+ HiLink rakuInclude Include
+ HiLink rakuShebang PreProc
+ HiLink rakuClosureTrait PreProc
+ HiLink rakuOperator Operator
+ HiLink rakuContext Operator
+ HiLink rakuQuote Delimiter
+ HiLink rakuTypeConstraint PreCondit
+ HiLink rakuException Exception
+ HiLink rakuVariable Identifier
+ HiLink rakuVarSlash Identifier
+ HiLink rakuVarNum Identifier
+ HiLink rakuVarExclam Identifier
+ HiLink rakuVarMatch Identifier
+ HiLink rakuVarName Identifier
+ HiLink rakuMatchVar Identifier
+ HiLink rakuRxP5ReadRefId Identifier
+ HiLink rakuRxP5ModDef Identifier
+ HiLink rakuRxP5ModName Identifier
+ HiLink rakuConditional Conditional
+ HiLink rakuStringSpecial SpecialChar
+
+ HiLink rakuPodAbbr rakuPod
+ HiLink rakuPodAbbrEOF rakuPod
+ HiLink rakuPodAbbrNoCode rakuPod
+ HiLink rakuPodAbbrCode rakuPodCode
+ HiLink rakuPodPara rakuPod
+ HiLink rakuPodParaEOF rakuPod
+ HiLink rakuPodParaNoCode rakuPod
+ HiLink rakuPodParaCode rakuPodCode
+ HiLink rakuPodDelim rakuPod
+ HiLink rakuPodDelimEOF rakuPod
+ HiLink rakuPodDelimNoCode rakuPod
+ HiLink rakuPodDelimCode rakuPodCode
+ HiLink rakuPodImplicitCode rakuPodCode
+ HiLink rakuPodExtraConfig rakuPodPrefix
+ HiLink rakuPodVerticalBar rakuPodFormatCode
+ HiLink rakuPodColon rakuPodFormatCode
+ HiLink rakuPodSemicolon rakuPodFormatCode
+ HiLink rakuPodComma rakuPodFormatCode
+ HiLink rakuPodFormatOne rakuPodFormat
+ HiLink rakuPodFormatTwo rakuPodFormat
+ HiLink rakuPodFormatThree rakuPodFormat
+ HiLink rakuPodFormatFrench rakuPodFormat
+
+ HiLink rakuPodType Type
+ HiLink rakuPodConfigOption String
+ HiLink rakuPodCode PreProc
+ HiLink rakuPod Comment
+ HiLink rakuPodComment Comment
+ HiLink rakuPodAutoQuote Operator
+ HiLink rakuPodConfigOperator Operator
+ HiLink rakuPodPrefix Statement
+ HiLink rakuPodName Identifier
+ HiLink rakuPodFormatCode SpecialChar
+ HiLink rakuPodFormat SpecialComment
+
+ delcommand HiLink
+endif
+
+if exists("raku_fold") || exists("raku_extended_all")
+ setl foldmethod=syntax
+ syn region rakuBlockFold
+ \ start="^\z(\s*\)\%(my\|our\|augment\|multi\|proto\|only\)\?\s*\%(\%([A-Za-z_\xC0-\xFF]\%([A-Za-z_\xC0-\xFF0-9]\|[-'][A-Za-z_\xC0-\xFF]\@=\)*\)\s\+\)\?\<\%(CATCH\|try\|ENTER\|LEAVE\|CHECK\|INIT\|BEGIN\|END\|KEEP\|UNDO\|PRE\|POST\|module\|package\|enum\|subset\|class\|sub\%(method\)\?\|multi\|method\|slang\|grammar\|regex\|token\|rule\)\>[^{]\+\%({\s*\%(#.*\)\?\)\?$"
+ \ end="^\z1}"
+ \ transparent fold keepend extend
+endif
+
+let b:current_syntax = "raku"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:ts=8:sts=4:sw=4:expandtab:ft=vim
diff --git a/runtime/syntax/raml.vim b/runtime/syntax/raml.vim
new file mode 100644
index 0000000..062a71c
--- /dev/null
+++ b/runtime/syntax/raml.vim
@@ -0,0 +1,106 @@
+" Vim syntax file
+" Language: RAML (RESTful API Modeling Language)
+" Maintainer: Eric Hopkins <eric.on.tech@gmail.com>
+" URL: https://github.com/in3d/vim-raml
+" License: Same as Vim
+" Last Change: 2018-11-03
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword ramlTodo contained TODO FIXME XXX NOTE
+
+syn region ramlComment display oneline start='\%(^\|\s\)#' end='$'
+ \ contains=ramlTodo,@Spell
+
+syn region ramlVersion display oneline start='#%RAML' end='$'
+
+syn match ramlNodeProperty '!\%(![^\\^% ]\+\|[^!][^:/ ]*\)'
+
+syn match ramlAnchor '&.\+'
+
+syn match ramlAlias '\*.\+'
+
+syn match ramlDelimiter '[-,:]'
+syn match ramlBlock '[\[\]{}>|]'
+syn match ramlOperator '[?+-]'
+syn match ramlKey '\h\+\(?\)\?\ze\s*:'
+syn match ramlKey '\w\+\(\s\+\w\+\)*\(?\)\?\ze\s*:'
+syn match routeKey '\/\w\+\(\s\+\w\+\)*\ze\s*:'
+syn match routeKey 'application\/\w\+\ze\s*:'
+syn match routeParamKey '\/{\w\+}*\ze\s*:'
+
+syn region ramlString matchgroup=ramlStringDelimiter
+ \ start=+\s"+ skip=+\\"+ end=+"+
+ \ contains=ramlEscape
+syn region ramlString matchgroup=ramlStringDelimiter
+ \ start=+\s'+ skip=+''+ end=+'+
+ \ contains=ramlStringEscape
+syn region ramlParameter matchgroup=ramlParameterDelimiter
+ \ start=+<<+ skip=+''+ end=+>>+
+syn match ramlEscape contained display +\\[\\"abefnrtv^0_ NLP]+
+syn match ramlEscape contained display '\\x\x\{2}'
+syn match ramlEscape contained display '\\u\x\{4}'
+syn match ramlEscape contained display '\\U\x\{8}'
+syn match ramlEscape display '\\\%(\r\n\|[\r\n]\)'
+syn match ramlStringEscape contained +''+
+
+syn match ramlNumber display
+ \ '\<[+-]\=\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\='
+syn match ramlNumber display '0\o\+'
+syn match ramlNumber display '0x\x\+'
+syn match ramlNumber display '([+-]\=[iI]nf)'
+syn match ramlNumber display '(NaN)'
+
+syn match ramlConstant '\<[~yn]\>'
+syn keyword ramlConstant true True TRUE false False FALSE
+syn keyword ramlConstant yes Yes on ON no No off OFF
+syn keyword ramlConstant null Null NULL nil Nil NIL
+
+syn keyword httpVerbs get post put delete head patch options
+syn keyword ramlTypes string number integer date boolean file
+
+syn match ramlTimestamp '\d\d\d\d-\%(1[0-2]\|\d\)-\%(3[0-2]\|2\d\|1\d\|\d\)\%( \%([01]\d\|2[0-3]\):[0-5]\d:[0-5]\d.\d\d [+-]\%([01]\d\|2[0-3]\):[0-5]\d\|t\%([01]\d\|2[0-3]\):[0-5]\d:[0-5]\d.\d\d[+-]\%([01]\d\|2[0-3]\):[0-5]\d\|T\%([01]\d\|2[0-3]\):[0-5]\d:[0-5]\d.\dZ\)\='
+
+syn region ramlDocumentHeader start='---' end='$' contains=ramlDirective
+syn match ramlDocumentEnd '\.\.\.'
+
+syn match ramlDirective contained '%[^:]\+:.\+'
+
+hi def link ramlVersion String
+hi def link routeInterpolation String
+hi def link ramlInterpolation Constant
+hi def link ramlTodo Todo
+hi def link ramlComment Comment
+hi def link ramlDocumentHeader PreProc
+hi def link ramlDocumentEnd PreProc
+hi def link ramlDirective Keyword
+hi def link ramlNodeProperty Type
+hi def link ramlAnchor Type
+hi def link ramlAlias Type
+hi def link ramlBlock Operator
+hi def link ramlOperator Operator
+hi def link routeParamKey SpecialChar
+hi def link ramlKey Identifier
+hi def link routeKey SpecialChar
+hi def link ramlParameterDelimiter Type
+hi def link ramlParameter Type
+hi def link ramlString String
+hi def link ramlStringDelimiter ramlString
+hi def link ramlEscape SpecialChar
+hi def link ramlStringEscape SpecialChar
+hi def link ramlNumber Number
+hi def link ramlConstant Constant
+hi def link ramlTimestamp Number
+hi def link httpVerbs Statement
+hi def link ramlTypes Type
+hi def link ramlDelimiter Delimiter
+
+let b:current_syntax = "raml"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/ratpoison.vim b/runtime/syntax/ratpoison.vim
new file mode 100644
index 0000000..2322e85
--- /dev/null
+++ b/runtime/syntax/ratpoison.vim
@@ -0,0 +1,275 @@
+" Vim syntax file
+" Language: Ratpoison configuration/commands file ( /etc/ratpoisonrc ~/.ratpoisonrc )
+" Maintainer: Magnus Woldrich <m@japh.se>
+" URL: http://github.com/trapd00r/vim-syntax-ratpoison
+" Last Change: 2021-04-12 13:46:04
+" Previous Maintainer: Doug Kearns <djkea2@gus.gscit.monash.edu.au>
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match ratpoisonComment "^\s*#.*$" contains=ratpoisonTodo
+
+syn keyword ratpoisonTodo TODO NOTE FIXME XXX contained
+
+syn case ignore
+syn keyword ratpoisonBooleanArg on off contained
+syn case match
+
+syn keyword ratpoisonCommandArg abort addhook alias banish chdir contained
+syn keyword ratpoisonCommandArg clrunmanaged cnext colon compat cother contained
+syn keyword ratpoisonCommandArg cprev curframe dedicate definekey delete contained
+syn keyword ratpoisonCommandArg delkmap describekey echo escape exec contained
+syn keyword ratpoisonCommandArg fdump focus focusdown focuslast focusleft contained
+syn keyword ratpoisonCommandArg focusprev focusright focusup frestore fselect contained
+syn keyword ratpoisonCommandArg gdelete getenv getsel gmerge gmove contained
+syn keyword ratpoisonCommandArg gnew gnewbg gnext gprev gravity contained
+syn keyword ratpoisonCommandArg groups gselect help hsplit inext contained
+syn keyword ratpoisonCommandArg info iother iprev kill lastmsg contained
+syn keyword ratpoisonCommandArg license link listhook meta msgwait contained
+syn keyword ratpoisonCommandArg newkmap newwm next nextscreen number contained
+syn keyword ratpoisonCommandArg only other prev prevscreen prompt contained
+syn keyword ratpoisonCommandArg putsel quit ratclick rathold ratrelwarp contained
+syn keyword ratpoisonCommandArg ratwarp readkey redisplay redo remhook contained
+syn keyword ratpoisonCommandArg remove resize restart rudeness sdump contained
+syn keyword ratpoisonCommandArg select set setenv sfdump shrink contained
+syn keyword ratpoisonCommandArg source sselect startup_message time title contained
+syn keyword ratpoisonCommandArg tmpwm unalias undefinekey undo unmanage contained
+syn keyword ratpoisonCommandArg unsetenv verbexec version vsplit warp contained
+syn keyword ratpoisonCommandArg windows framefmt infofmt contained
+
+syn match ratpoisonGravityArg "\<\(n\|north\)\>" contained
+syn match ratpoisonGravityArg "\<\(nw\|northwest\)\>" contained
+syn match ratpoisonGravityArg "\<\(ne\|northeast\)\>" contained
+syn match ratpoisonGravityArg "\<\(w\|west\)\>" contained
+syn match ratpoisonGravityArg "\<\(c\|center\)\>" contained
+syn match ratpoisonGravityArg "\<\(e\|east\)\>" contained
+syn match ratpoisonGravityArg "\<\(s\|south\)\>" contained
+syn match ratpoisonGravityArg "\<\(sw\|southwest\)\>" contained
+syn match ratpoisonGravityArg "\<\(se\|southeast\)\>" contained
+syn case match
+
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(F[1-9][0-9]\=\|\(\a\|\d\)\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(space\|exclam\|quotedbl\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(numbersign\|dollar\|percent\|ampersand\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(apostrophe\|quoteright\|parenleft\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(parenright\|asterisk\|plus\|comma\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(minus\|period\|slash\|colon\|semicolon\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(less\|equal\|greater\|question\|at\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(bracketleft\|backslash\|bracketright\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(asciicircum\|underscore\|grave\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(quoteleft\|braceleft\|bar\|braceright\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(asciitilde\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(BackSpace\|Tab\|Linefeed\|Clear\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(Return\|Pause\|Scroll_Lock\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(Sys_Req\|Escape\|Delete\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(Home\|Left\|Up\|Right\|Down\|Prior\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(Page_Up\|Next\|Page_Down\|End\|Begin\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(Select\|Print\|Execute\|Insert\|Undo\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(Redo\|Menu\|Find\|Cancel\|Help\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=\(Break\|Mode_switch\|script_switch\|Num_Lock\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=KP_\(Space\|Tab\|Enter\|F[1234]\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=KP_\(Home\|Left\|Up\|Right\|Down\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=KP_\(Prior\|Page_Up\|Next\|Page_Down\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=KP_\(End\|Begin\|Insert\|Delete\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=KP_\(Equal\|Multiply\|Add\|Separator\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+syn match ratpoisonKeySeqArg "\<\([CMASH]\(-[CMASH]\)\{,4}-\)\=KP_\(Subtract\|Decimal\|Divide\|\d\)\>" contained nextgroup=ratpoisonCommandArg skipwhite
+
+syn match ratpoisonHookArg "\<\(key\|switchwin\|switchframe\|switchgroup\|quit\|restart\)\>" contained
+
+syn match ratpoisonNumberArg "\<\d\+\>" contained nextgroup=ratpoisonNumberArg skipwhite
+
+syn keyword ratpoisonSetArg barborder contained nextgroup=ratpoisonNumberArg
+syn keyword ratpoisonSetArg bargravity contained nextgroup=ratpoisonGravityArg
+syn keyword ratpoisonSetArg barpadding contained nextgroup=ratpoisonNumberArg
+syn keyword ratpoisonSetArg bgcolor
+syn keyword ratpoisonSetArg border contained nextgroup=ratpoisonNumberArg
+syn keyword ratpoisonSetArg fgcolor
+syn keyword ratpoisonSetArg framefmt contained nextgroup=ratpoisonWinFmtArg
+syn keyword ratpoisonSetArg fwcolor
+syn keyword ratpoisonSetArg framemsgwait contained nextgroup=ratpoisonNumberArg
+syn keyword ratpoisonSetArg gravity contained nextgroup=ratpoisonGravityArg
+syn keyword ratpoisonSetArg bwcolor
+syn keyword ratpoisonSetArg gravity contained nextgroup=ratpoisonGravityArg
+syn keyword ratpoisonSetArg historysize
+syn keyword ratpoisonSetArg historycompaction
+syn keyword ratpoisonSetArg historyexpansion
+syn keyword ratpoisonSetArg infofmt contained nextgroup=ratpoisonWinFmtArg
+syn keyword ratpoisonSetArg topkmap
+syn keyword ratpoisonSetArg barinpadding
+syn keyword ratpoisonSetArg font
+syn keyword ratpoisonSetArg framesels
+syn keyword ratpoisonSetArg maxundos
+syn keyword ratpoisonSetArg inputwidth contained nextgroup=ratpoisonNumberArg
+syn keyword ratpoisonSetArg maxsizegravity contained nextgroup=ratpoisonGravityArg
+syn keyword ratpoisonSetArg msgwait contained nextgroup=ratpoisonNumberArg
+syn keyword ratpoisonSetArg padding contained nextgroup=ratpoisonNumberArg
+syn keyword ratpoisonSetArg resizeunit contained nextgroup=ratpoisonNumberArg
+syn keyword ratpoisonSetArg startup_message
+syn keyword ratpoisonSetArg transgravity contained nextgroup=ratpoisonGravityArg
+syn keyword ratpoisonSetArg waitcursor contained nextgroup=ratpoisonNumberArg
+syn keyword ratpoisonSetArg winfmt contained nextgroup=ratpoisonWinFmtArg
+syn keyword ratpoisonSetArg wingravity contained nextgroup=ratpoisonGravityArg
+syn keyword ratpoisonSetArg winliststyle contained nextgroup=ratpoisonWinListArg
+syn keyword ratpoisonSetArg winname contained nextgroup=ratpoisonWinNameArg
+
+syn match ratpoisonWinFmtArg "%[nstacil]" contained nextgroup=ratpoisonWinFmtArg skipwhite
+syn match ratpoisonFrameFmtArg "%[nstacil]" contained nextgroup=ratpoisonWinFmtArg skipwhite
+syn match ratpoisonInfoFmtArg "%[nstacil]" contained nextgroup=ratpoisonWinFmtArg skipwhite
+
+syn match ratpoisonWinListArg "\<\(row\|column\)\>" contained
+
+syn match ratpoisonWinNameArg "\<\(name\|title\|class\)\>" contained
+
+syn match ratpoisonDefCommand "^\s*set\s*" nextgroup=ratpoisonSetArg
+syn match ratpoisonDefCommand "^\s*defbarborder\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonDefCommand "^\s*defbargravity\s*" nextgroup=ratpoisonGravityArg
+syn match ratpoisonDefCommand "^\s*defbarpadding\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonDefCommand "^\s*defbgcolor\s*"
+syn match ratpoisonDefCommand "^\s*defborder\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonDefCommand "^\s*deffgcolor\s*"
+syn match ratpoisonDefCommand "^\s*deffont\s*"
+syn match ratpoisonDefCommand "^\s*defframefmt\s*" nextgroup=ratpoisonWinFmtArg
+syn match ratpoisonDefCommand "^\s*defframesels\s*"
+syn match ratpoisonDefCommand "^\s*definputwidth\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonDefCommand "^\s*defmaxsizegravity\s*" nextgroup=ratpoisonGravityArg
+syn match ratpoisonDefCommand "^\s*defpadding\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonDefCommand "^\s*defresizeunit\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonDefCommand "^\s*deftransgravity\s*" nextgroup=ratpoisonGravityArg
+syn match ratpoisonDefCommand "^\s*defwaitcursor\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonDefCommand "^\s*defwinfmt\s*" nextgroup=ratpoisonWinFmtArg
+syn match ratpoisonDefCommand "^\s*defwingravity\s*" nextgroup=ratpoisonGravityArg
+syn match ratpoisonDefCommand "^\s*defwinliststyle\s*" nextgroup=ratpoisonWinListArg
+syn match ratpoisonDefCommand "^\s*defwinname\s*" nextgroup=ratpoisonWinNameArg
+syn match ratpoisonDefCommand "^\s*msgwait\s*" nextgroup=ratpoisonNumberArg
+
+syn match ratpoisonStringCommand "^\s*\zsaddhook\ze\s*" nextgroup=ratpoisonHookArg
+syn match ratpoisonStringCommand "^\s*\zsalias\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsbind\ze\s*" nextgroup=ratpoisonKeySeqArg
+syn match ratpoisonStringCommand "^\s*\zschdir\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zscolon\ze\s*" nextgroup=ratpoisonCommandArg
+syn match ratpoisonStringCommand "^\s*\zsdedicate\ze\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonStringCommand "^\s*\zsdefinekey\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsdelkmap\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsdescribekey\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsecho\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsescape\ze\s*" nextgroup=ratpoisonKeySeqArg
+syn match ratpoisonStringCommand "^\s*\zsexec\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsfdump\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsfrestore\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsgdelete\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsgetenv\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsgravity\ze\s*" nextgroup=ratpoisonGravityArg
+syn match ratpoisonStringCommand "^\s*\zsgselect\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zslink\ze\s*" nextgroup=ratpoisonKeySeqArg
+syn match ratpoisonStringCommand "^\s*\zslisthook\ze\s*" nextgroup=ratpoisonHookArg
+syn match ratpoisonStringCommand "^\s*\zsnewkmap\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsnewwm\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsnumber\ze\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonStringCommand "^\s*\zsprompt\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsratwarp\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsratrelwarp\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsratclick\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsrathold\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsreadkey\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsremhook\ze\s*" nextgroup=ratpoisonHookArg
+syn match ratpoisonStringCommand "^\s*\zsresize\ze\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonStringCommand "^\s*\zsrudeness\ze\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonStringCommand "^\s*\zsselect\ze\s*" nextgroup=ratpoisonNumberArg
+syn match ratpoisonStringCommand "^\s*\zssetenv\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zssource\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zssselect\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsstartup_message\ze\s*" nextgroup=ratpoisonBooleanArg
+syn match ratpoisonStringCommand "^\s*\zstitle\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zstmpwm\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsunalias\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsunbind\ze\s*" nextgroup=ratpoisonKeySeqArg
+syn match ratpoisonStringCommand "^\s*\zsundefinekey\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsunmanage\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsunsetenv\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zsverbexec\ze\s*"
+syn match ratpoisonStringCommand "^\s*\zswarp\ze\s*" nextgroup=ratpoisonBooleanArg
+
+syn match ratpoisonVoidCommand "^\s*\zsabort\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsbanish\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsclrunmanaged\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zscnext\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zscompat\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zscother\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zscprev\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zscurframe\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsdelete\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsfocusdown\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsfocuslast\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsfocusleft\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsfocusprev\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsfocusright\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsfocusup\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsfocus\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsfselect\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsgetsel\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsgmerge\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsgmove\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsgnewbg\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsgnew\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsgnext\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsgprev\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsgroups\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zshelp\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zshsplit\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsinext\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsinfo\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsiother\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsiprev\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zskill\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zslastmsg\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zslicense\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsmeta\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsnextscreen\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsnext\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsonly\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsother\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsprevscreen\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsprev\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsputsel\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsquit\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsredisplay\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsredo\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsremove\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsrestart\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zssdump\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zssfdump\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsshrink\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zssplit\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zstime\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsundo\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsversion\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zsvsplit\ze\s*$"
+syn match ratpoisonVoidCommand "^\s*\zswindows\ze\s*$"
+
+hi def link ratpoisonBooleanArg Boolean
+hi def link ratpoisonCommandArg Keyword
+hi def link ratpoisonComment Comment
+hi def link ratpoisonDefCommand Identifier
+hi def link ratpoisonFrameFmtArg Special
+hi def link ratpoisonGravityArg Constant
+hi def link ratpoisonInfoFmtArg Special
+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
+
+let b:current_syntax = "ratpoison"
+
+" vim: ts=8
diff --git a/runtime/syntax/rc.vim b/runtime/syntax/rc.vim
new file mode 100644
index 0000000..d69edd0
--- /dev/null
+++ b/runtime/syntax/rc.vim
@@ -0,0 +1,191 @@
+" Vim syntax file
+" Language: M$ Resource files (*.rc)
+" Maintainer: Christian Brabandt
+" Last Change: 20220116
+" Repository: https://github.com/chrisbra/vim-rc-syntax
+" License: Vim (see :h license)
+" Previous Maintainer: Heiko Erhardt <Heiko.Erhardt@munich.netsurf.de>
+
+" This file is based on the c.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Common RC keywords
+syn keyword rcLanguage LANGUAGE
+
+syn keyword rcMainObject TEXTINCLUDE VERSIONINFO BITMAP ICON CURSOR CURSOR
+syn keyword rcMainObject MENU ACCELERATORS TOOLBAR DIALOG
+syn keyword rcMainObject STRINGTABLE MESSAGETABLE RCDATA DLGINIT DESIGNINFO
+
+syn keyword rcSubObject POPUP MENUITEM SEPARATOR
+syn keyword rcSubObject CONTROL LTEXT CTEXT RTEXT EDITTEXT
+syn keyword rcSubObject BUTTON PUSHBUTTON DEFPUSHBUTTON GROUPBOX LISTBOX COMBOBOX
+syn keyword rcSubObject FILEVERSION PRODUCTVERSION FILEFLAGSMASK FILEFLAGS FILEOS
+syn keyword rcSubObject FILETYPE FILESUBTYPE
+
+syn keyword rcCaptionParam CAPTION
+syn keyword rcParam CHARACTERISTICS CLASS STYLE EXSTYLE VERSION FONT
+
+syn keyword rcStatement BEGIN END BLOCK VALUE
+
+syn keyword rcCommonAttribute PRELOAD LOADONCALL FIXED MOVEABLE DISCARDABLE PURE IMPURE
+
+syn keyword rcAttribute WS_OVERLAPPED WS_POPUP WS_CHILD WS_MINIMIZE WS_VISIBLE WS_DISABLED WS_CLIPSIBLINGS
+syn keyword rcAttribute WS_CLIPCHILDREN WS_MAXIMIZE WS_CAPTION WS_BORDER WS_DLGFRAME WS_VSCROLL WS_HSCROLL
+syn keyword rcAttribute WS_SYSMENU WS_THICKFRAME WS_GROUP WS_TABSTOP WS_MINIMIZEBOX WS_MAXIMIZEBOX WS_TILED
+syn keyword rcAttribute WS_ICONIC WS_SIZEBOX WS_TILEDWINDOW WS_OVERLAPPEDWINDOW WS_POPUPWINDOW WS_CHILDWINDOW
+syn keyword rcAttribute WS_EX_DLGMODALFRAME WS_EX_NOPARENTNOTIFY WS_EX_TOPMOST WS_EX_ACCEPTFILES
+syn keyword rcAttribute WS_EX_TRANSPARENT WS_EX_MDICHILD WS_EX_TOOLWINDOW WS_EX_WINDOWEDGE WS_EX_CLIENTEDGE
+syn keyword rcAttribute WS_EX_CONTEXTHELP WS_EX_RIGHT WS_EX_LEFT WS_EX_RTLREADING WS_EX_LTRREADING
+syn keyword rcAttribute WS_EX_LEFTSCROLLBAR WS_EX_RIGHTSCROLLBAR WS_EX_CONTROLPARENT WS_EX_STATICEDGE
+syn keyword rcAttribute WS_EX_APPWINDOW WS_EX_OVERLAPPEDWINDOW WS_EX_PALETTEWINDOW
+syn keyword rcAttribute ES_LEFT ES_CENTER ES_RIGHT ES_MULTILINE ES_UPPERCASE ES_LOWERCASE ES_PASSWORD
+syn keyword rcAttribute ES_AUTOVSCROLL ES_AUTOHSCROLL ES_NOHIDESEL ES_OEMCONVERT ES_READONLY ES_WANTRETURN
+syn keyword rcAttribute ES_NUMBER
+syn keyword rcAttribute BS_PUSHBUTTON BS_DEFPUSHBUTTON BS_CHECKBOX BS_AUTOCHECKBOX BS_RADIOBUTTON BS_3STATE
+syn keyword rcAttribute BS_AUTO3STATE BS_GROUPBOX BS_USERBUTTON BS_AUTORADIOBUTTON BS_OWNERDRAW BS_LEFTTEXT
+syn keyword rcAttribute BS_TEXT BS_ICON BS_BITMAP BS_LEFT BS_RIGHT BS_CENTER BS_TOP BS_BOTTOM BS_VCENTER
+syn keyword rcAttribute BS_PUSHLIKE BS_MULTILINE BS_NOTIFY BS_FLAT BS_RIGHTBUTTON
+syn keyword rcAttribute SS_LEFT SS_CENTER SS_RIGHT SS_ICON SS_BLACKRECT SS_GRAYRECT SS_WHITERECT
+syn keyword rcAttribute SS_BLACKFRAME SS_GRAYFRAME SS_WHITEFRAME SS_USERITEM SS_SIMPLE SS_LEFTNOWORDWRAP
+syn keyword rcAttribute SS_OWNERDRAW SS_BITMAP SS_ENHMETAFILE SS_ETCHEDHORZ SS_ETCHEDVERT SS_ETCHEDFRAME
+syn keyword rcAttribute SS_TYPEMASK SS_NOPREFIX SS_NOTIFY SS_CENTERIMAGE SS_RIGHTJUST SS_REALSIZEIMAGE
+syn keyword rcAttribute SS_SUNKEN SS_ENDELLIPSIS SS_PATHELLIPSIS SS_WORDELLIPSIS SS_ELLIPSISMASK
+syn keyword rcAttribute DS_ABSALIGN DS_SYSMODAL DS_LOCALEDIT DS_SETFONT DS_MODALFRAME DS_NOIDLEMSG
+syn keyword rcAttribute DS_SETFOREGROUND DS_3DLOOK DS_FIXEDSYS DS_NOFAILCREATE DS_CONTROL DS_CENTER
+syn keyword rcAttribute DS_CENTERMOUSE DS_CONTEXTHELP
+syn keyword rcAttribute LBS_NOTIFY LBS_SORT LBS_NOREDRAW LBS_MULTIPLESEL LBS_OWNERDRAWFIXED
+syn keyword rcAttribute LBS_OWNERDRAWVARIABLE LBS_HASSTRINGS LBS_USETABSTOPS LBS_NOINTEGRALHEIGHT
+syn keyword rcAttribute LBS_MULTICOLUMN LBS_WANTKEYBOARDINPUT LBS_EXTENDEDSEL LBS_DISABLENOSCROLL
+syn keyword rcAttribute LBS_NODATA LBS_NOSEL LBS_STANDARD
+syn keyword rcAttribute CBS_SIMPLE CBS_DROPDOWN CBS_DROPDOWNLIST CBS_OWNERDRAWFIXED CBS_OWNERDRAWVARIABLE
+syn keyword rcAttribute CBS_AUTOHSCROLL CBS_OEMCONVERT CBS_SORT CBS_HASSTRINGS CBS_NOINTEGRALHEIGHT
+syn keyword rcAttribute CBS_DISABLENOSCROLL CBS_UPPERCASE CBS_LOWERCASE
+syn keyword rcAttribute SBS_HORZ SBS_VERT SBS_TOPALIGN SBS_LEFTALIGN SBS_BOTTOMALIGN SBS_RIGHTALIGN
+syn keyword rcAttribute SBS_SIZEBOXTOPLEFTALIGN SBS_SIZEBOXBOTTOMRIGHTALIGN SBS_SIZEBOX SBS_SIZEGRIP
+syn keyword rcAttribute CCS_TOP CCS_NOMOVEY CCS_BOTTOM CCS_NORESIZE CCS_NOPARENTALIGN CCS_ADJUSTABLE
+syn keyword rcAttribute CCS_NODIVIDER
+syn keyword rcAttribute LVS_ICON LVS_REPORT LVS_SMALLICON LVS_LIST LVS_TYPEMASK LVS_SINGLESEL LVS_SHOWSELALWAYS
+syn keyword rcAttribute LVS_SORTASCENDING LVS_SORTDESCENDING LVS_SHAREIMAGELISTS LVS_NOLABELWRAP
+syn keyword rcAttribute LVS_EDITLABELS LVS_OWNERDATA LVS_NOSCROLL LVS_TYPESTYLEMASK LVS_ALIGNTOP LVS_ALIGNLEFT
+syn keyword rcAttribute LVS_ALIGNMASK LVS_OWNERDRAWFIXED LVS_NOCOLUMNHEADER LVS_NOSORTHEADER LVS_AUTOARRANGE
+syn keyword rcAttribute TVS_HASBUTTONS TVS_HASLINES TVS_LINESATROOT TVS_EDITLABELS TVS_DISABLEDRAGDROP
+syn keyword rcAttribute TVS_SHOWSELALWAYS
+syn keyword rcAttribute TCS_FORCEICONLEFT TCS_FORCELABELLEFT TCS_TABS TCS_BUTTONS TCS_SINGLELINE TCS_MULTILINE
+syn keyword rcAttribute TCS_RIGHTJUSTIFY TCS_FIXEDWIDTH TCS_RAGGEDRIGHT TCS_FOCUSONBUTTONDOWN
+syn keyword rcAttribute TCS_OWNERDRAWFIXED TCS_TOOLTIPS TCS_FOCUSNEVER
+syn keyword rcAttribute ACS_CENTER ACS_TRANSPARENT ACS_AUTOPLAY
+syn keyword rcStdId IDI_APPLICATION IDI_HAND IDI_QUESTION IDI_EXCLAMATION IDI_ASTERISK IDI_WINLOGO IDI_WINLOGO
+syn keyword rcStdId IDI_WARNING IDI_ERROR IDI_INFORMATION
+syn keyword rcStdId IDCANCEL IDABORT IDRETRY IDIGNORE IDYES IDNO IDCLOSE IDHELP IDC_STATIC
+
+" Common RC keywords
+
+" Common RC keywords
+syn keyword rcTodo contained TODO FIXME XXX
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match rcSpecial contained "\\[0-7][0-7][0-7]\=\|\\."
+syn region rcString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rcSpecial
+syn match rcCharacter "'[^\\]'"
+syn match rcSpecialCharacter "'\\.'"
+syn match rcSpecialCharacter "'\\[0-7][0-7]'"
+syn match rcSpecialCharacter "'\\[0-7][0-7][0-7]'"
+
+"catch errors caused by wrong parenthesis
+syn region rcParen transparent start='(' end=')' contains=ALLBUT,rcParenError,rcIncluded,rcSpecial,rcTodo
+syn match rcParenError ")"
+syn match rcInParen contained "[{}]"
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match rcNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+"floating point number, with dot, optional exponent
+syn match rcFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, starting with a dot, optional exponent
+syn match rcFloat "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match rcFloat "\<\d\+e[-+]\=\d\+[fl]\=\>"
+"hex number
+syn match rcNumber "\<0x[0-9a-f]\+\(u\=l\=\|lu\)\>"
+"syn match rcIdentifier "\<[a-z_][a-z0-9_]*\>"
+syn case match
+" flag an octal number with wrong digits
+syn match rcOctalError "\<0[0-7]*[89]"
+
+if exists("rc_comment_strings")
+ " A comment can contain rcString, rcCharacter and rcNumber.
+ " But a "*/" inside a rcString in a rcComment DOES end the comment! So we
+ " need to use a special type of rcString: rcCommentString, 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 rcCommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region rcCommentString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=rcSpecial,rcCommentSkip
+ syntax region rcComment2String contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=rcSpecial
+ syntax region rcComment start="/\*" end="\*/" contains=rcTodo,rcCommentString,rcCharacter,rcNumber,rcFloat
+ syntax match rcComment "//.*" contains=rcTodo,rcComment2String,rcCharacter,rcNumber
+else
+ syn region rcComment start="/\*" end="\*/" contains=rcTodo
+ syn match rcComment "//.*" contains=rcTodo
+endif
+syntax match rcCommentError "\*/"
+
+syn region rcPreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=rcComment,rcString,rcCharacter,rcNumber,rcCommentError
+syn region rcIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match rcIncluded contained "<[^>]*>"
+syn match rcInclude "^\s*#\s*include\>\s*["<]" contains=rcIncluded
+"syn match rcLineSkip "\\$"
+syn region rcDefine start="^\s*#\s*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,rcPreCondit,rcIncluded,rcInclude,rcDefine,rcInParen
+syn region rcPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,rcPreCondit,rcIncluded,rcInclude,rcDefine,rcInParen
+
+syn sync ccomment rcComment minlines=10
+
+" Define the default highlighting.
+" 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
+
+hi def link rcLanguage Constant
+hi def link rcCaptionParam Constant
+hi def link rcCommonAttribute Constant
+
+hi def link rcMainObject Identifier
+hi def link rcSubObject Define
+hi def link rcParam Constant
+hi def link rcStatement Statement
+"
+"hi def link rcIdentifier Identifier
+
+
+
+let b:current_syntax = "rc"
+
+" vim: ts=8
diff --git a/runtime/syntax/rcs.vim b/runtime/syntax/rcs.vim
new file mode 100644
index 0000000..5a34802
--- /dev/null
+++ b/runtime/syntax/rcs.vim
@@ -0,0 +1,63 @@
+" Vim syntax file
+" Language: RCS file
+" Maintainer: Dmitry Vasiliev <dima at hlabs dot org>
+" URL: https://github.com/hdima/vim-scripts/blob/master/syntax/rcs.vim
+" Last Change: 2012-02-11
+" Filenames: *,v
+" Version: 1.12
+
+" Options:
+" rcs_folding = 1 For folding strings
+
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+
+" RCS file must end with a newline.
+syn match rcsEOFError ".\%$" containedin=ALL
+
+" Keywords.
+syn keyword rcsKeyword head branch access symbols locks strict
+syn keyword rcsKeyword comment expand date author state branches
+syn keyword rcsKeyword next desc log
+syn keyword rcsKeyword text nextgroup=rcsTextStr skipwhite skipempty
+
+" Revision numbers and dates.
+syn match rcsNumber "\<[0-9.]\+\>" display
+
+" Strings.
+if exists("rcs_folding") && has("folding")
+ " Folded strings.
+ syn region rcsString matchgroup=rcsString start="@" end="@" skip="@@" fold contains=rcsSpecial
+ syn region rcsTextStr matchgroup=rcsTextStr start="@" end="@" skip="@@" fold contained contains=rcsSpecial,rcsDiffLines
+else
+ syn region rcsString matchgroup=rcsString start="@" end="@" skip="@@" contains=rcsSpecial
+ syn region rcsTextStr matchgroup=rcsTextStr start="@" end="@" skip="@@" contained contains=rcsSpecial,rcsDiffLines
+endif
+syn match rcsSpecial "@@" contained
+syn match rcsDiffLines "[da]\d\+ \d\+$" contained
+
+" Synchronization.
+syn sync clear
+if exists("rcs_folding") && has("folding")
+ syn sync fromstart
+else
+ " We have incorrect folding if following sync patterns is turned on.
+ syn sync match rcsSync grouphere rcsString "[0-9.]\+\(\s\|\n\)\+log\(\s\|\n\)\+@"me=e-1
+ syn sync match rcsSync grouphere rcsTextStr "@\(\s\|\n\)\+text\(\s\|\n\)\+@"me=e-1
+endif
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet.
+
+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
+
+
+let b:current_syntax = "rcs"
diff --git a/runtime/syntax/rcslog.vim b/runtime/syntax/rcslog.vim
new file mode 100644
index 0000000..18f4593
--- /dev/null
+++ b/runtime/syntax/rcslog.vim
@@ -0,0 +1,25 @@
+" Vim syntax file
+" Language: RCS log output
+" Maintainer: Joe Karthauser <joe@freebsd.org>
+" Last Change: 2001 May 09
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match rcslogRevision "^revision.*$"
+syn match rcslogFile "^RCS file:.*"
+syn match rcslogDate "^date: .*$"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link rcslogFile Type
+hi def link rcslogRevision Constant
+hi def link rcslogDate Identifier
+
+
+let b:current_syntax = "rcslog"
+
+" vim: ts=8
diff --git a/runtime/syntax/readline.vim b/runtime/syntax/readline.vim
new file mode 100644
index 0000000..3831ae1
--- /dev/null
+++ b/runtime/syntax/readline.vim
@@ -0,0 +1,411 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-
+
+syn match readlineKey contained
+ \ '\S'
+ \ nextgroup=readlineKeyTerminator
+
+syn match readlineBegin display '^'
+ \ nextgroup=readlineComment,
+ \ readlineConditional,
+ \ readlineInclude,
+ \ readlineKeyName,
+ \ readlineKey,
+ \ readlineKeySeq,
+ \ readlineKeyword
+ \ skipwhite
+
+syn region readlineComment contained display oneline
+ \ start='#'
+ \ end='$'
+ \ contains=readlineTodo,
+ \ @Spell
+
+syn keyword readlineTodo contained
+ \ TODO
+ \ FIXME
+ \ XXX
+ \ NOTE
+
+syn match readlineConditional contained
+ \ '$if\>'
+ \ nextgroup=readlineTest,
+ \ readlineTestApp
+ \ skipwhite
+
+syn keyword readlineTest contained
+ \ mode
+ \ nextgroup=readlineTestModeEq
+
+syn match readlineTestModeEq contained
+ \ '='
+ \ nextgroup=readlineEditingMode
+
+syn keyword readlineTest contained
+ \ term
+ \ nextgroup=readlineTestTermEq
+
+syn match readlineTestTermEq contained
+ \ '='
+ \ nextgroup=readlineTestTerm
+
+syn match readlineTestTerm contained
+ \ '\S\+'
+
+syn match readlineTestApp contained
+ \ '\S\+'
+
+syn match readlineConditional contained display
+ \ '$\%(else\|endif\)\>'
+
+syn match readlineInclude contained display
+ \ '$include\>'
+ \ nextgroup=readlinePath
+
+syn match readlinePath contained display
+ \ '.\+'
+
+syn case ignore
+syn match readlineKeyName contained display
+ \ nextgroup=readlineKeySeparator,
+ \ readlineKeyTerminator
+ \ '\%(Control\|Del\|Esc\|Escape\|LFD\|Meta\|Newline\|Ret\|Return\|Rubout\|Space\|Spc\|Tab\)'
+syn case match
+
+syn match readlineKeySeparator contained
+ \ '-'
+ \ nextgroup=readlineKeyName,
+ \ readlineKey
+
+syn match readlineKeyTerminator contained
+ \ ':'
+ \ nextgroup=readlineFunction
+ \ skipwhite
+
+syn region readlineKeySeq contained display oneline
+ \ start=+"+
+ \ skip=+\\\\\|\\"+
+ \ end=+"+
+ \ contains=readlineKeyEscape
+ \ nextgroup=readlineKeyTerminator
+
+syn match readlineKeyEscape contained display
+ \ +\\\([CM]-\|[e\\"'abdfnrtv]\|\o\{3}\|x\x\{2}\)+
+
+syn keyword readlineKeyword contained
+ \ set
+ \ nextgroup=readlineVariable
+ \ skipwhite
+
+syn keyword readlineVariable contained
+ \ nextgroup=readlineBellStyle
+ \ skipwhite
+ \ bell-style
+
+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
+ \ history-preserve-point
+ \ horizontal-scroll-mode
+ \ input-meta
+ \ meta-flag
+ \ mark-directories
+ \ mark-modified-lines
+ \ mark-symlinked-directories
+ \ match-hidden-files
+ \ menu-complete-display-prefix
+ \ output-meta
+ \ page-completions
+ \ print-completions-horizontally
+ \ revert-all-at-newline
+ \ show-all-if-ambiguous
+ \ show-all-if-unmodified
+ \ show-mode-in-prompt
+ \ skip-completed-text
+ \ visible-stats
+
+syn keyword readlineVariable contained
+ \ nextgroup=readlineString
+ \ skipwhite
+ \ comment-begin
+ \ isearch-terminators
+ \ vi-cmd-mode-string
+ \ vi-ins-mode-string
+ \ emacs-mode-string
+
+syn keyword readlineVariable contained
+ \ nextgroup=readlineNumber
+ \ skipwhite
+ \ completion-display-width
+ \ completion-prefix-display-length
+ \ completion-query-items
+ \ history-size
+ \ keyseq-timeout
+
+syn keyword readlineVariable contained
+ \ nextgroup=readlineEditingMode
+ \ skipwhite
+ \ editing-mode
+
+syn keyword readlineVariable contained
+ \ nextgroup=readlineKeymap
+ \ skipwhite
+ \ keymap
+
+syn keyword readlineBellStyle contained
+ \ audible
+ \ visible
+ \ none
+
+syn case ignore
+syn keyword readlineBoolean contained
+ \ on
+ \ off
+syn case match
+
+syn region readlineString contained display oneline
+ \ matchgroup=readlineStringDelimiter
+ \ start=+"+
+ \ skip=+\\\\\|\\"+
+ \ end=+"+
+
+syn match readlineNumber contained display
+ \ '[+-]\d\+\>'
+
+syn keyword readlineEditingMode contained
+ \ emacs
+ \ vi
+
+syn match readlineKeymap contained display
+ \ 'emacs\%(-\%(standard\|meta\|ctlx\)\)\=\|vi\%(-\%(move\|command\|insert\)\)\='
+
+syn keyword readlineFunction contained
+ \ beginning-of-line
+ \ end-of-line
+ \ forward-char
+ \ backward-char
+ \ forward-word
+ \ backward-word
+ \ clear-screen
+ \ redraw-current-line
+ \
+ \ accept-line
+ \ previous-history
+ \ next-history
+ \ beginning-of-history
+ \ end-of-history
+ \ reverse-search-history
+ \ forward-search-history
+ \ non-incremental-reverse-search-history
+ \ non-incremental-forward-search-history
+ \ history-search-forward
+ \ history-search-backward
+ \ yank-nth-arg
+ \ yank-last-arg
+ \
+ \ delete-char
+ \ backward-delete-char
+ \ forward-backward-delete-char
+ \ quoted-insert
+ \ tab-insert
+ \ self-insert
+ \ transpose-chars
+ \ transpose-words
+ \ upcase-word
+ \ downcase-word
+ \ capitalize-word
+ \ overwrite-mode
+ \
+ \ kill-line
+ \ backward-kill-line
+ \ unix-line-discard
+ \ kill-whole-line
+ \ kill-word
+ \ backward-kill-word
+ \ unix-word-rubout
+ \ unix-filename-rubout
+ \ delete-horizontal-space
+ \ kill-region
+ \ copy-region-as-kill
+ \ copy-backward-word
+ \ copy-forward-word
+ \ yank
+ \ yank-pop
+ \
+ \ digit-argument
+ \ universal-argument
+ \
+ \ complete
+ \ possible-completions
+ \ insert-completions
+ \ menu-complete
+ \ menu-complete-backward
+ \ delete-char-or-list
+ \
+ \ start-kbd-macro
+ \ end-kbd-macro
+ \ call-last-kbd-macro
+ \ print-last-kbd-macro
+ \
+ \ re-read-init-file
+ \ abort
+ \ do-uppercase-version
+ \ prefix-meta
+ \ undo
+ \ revert-line
+ \ tilde-expand
+ \ set-mark
+ \ exchange-point-and-mark
+ \ character-search
+ \ character-search-backward
+ \ skip-csi-sequence
+ \ insert-comment
+ \ dump-functions
+ \ dump-variables
+ \ dump-macros
+ \ emacs-editing-mode
+ \ vi-editing-mode
+ \
+ \ vi-eof-maybe
+ \ vi-movement-mode
+ \ vi-undo
+ \ vi-match
+ \ vi-tilde-expand
+ \ vi-complete
+ \ vi-char-search
+ \ vi-redo
+ \ vi-search
+ \ vi-arg-digit
+ \ vi-append-eol
+ \ vi-prev-word
+ \ vi-change-to
+ \ vi-delete-to
+ \ vi-end-word
+ \ vi-char-search
+ \ vi-fetch-history
+ \ vi-insert-beg
+ \ vi-search-again
+ \ vi-put
+ \ vi-replace
+ \ vi-subst
+ \ vi-char-search
+ \ vi-next-word
+ \ vi-yank-to
+ \ vi-first-print
+ \ vi-yank-arg
+ \ vi-goto-mark
+ \ vi-append-mode
+ \ vi-prev-word
+ \ vi-change-to
+ \ vi-delete-to
+ \ vi-end-word
+ \ vi-char-search
+ \ vi-insert-mode
+ \ vi-set-mark
+ \ vi-search-again
+ \ vi-put
+ \ vi-change-char
+ \ vi-subst
+ \ vi-char-search
+ \ vi-undo
+ \ vi-next-word
+ \ vi-delete
+ \ vi-yank-to
+ \ vi-column
+ \ vi-change-case
+
+if exists("readline_has_bash")
+ syn keyword readlineFunction contained
+ \ shell-forward-word
+ \ shell-backward-word
+ \ shell-expand-line
+ \ history-expand-line
+ \ magic-space
+ \ alias-expand-line
+ \ history-and-alias-expand-line
+ \ 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
+ \ complete-username
+ \ possible-username-completions
+ \ complete-variable
+ \ possible-variable-completions
+ \ complete-hostname
+ \ possible-hostname-completions
+ \ complete-command
+ \ possible-command-completions
+ \ dynamic-complete-history
+ \ dabbrev-expand
+ \ complete-into-braces
+ \ glob-expand-word
+ \ glob-list-expansions
+ \ display-shell-version
+ \ glob-complete-word
+ \ edit-and-execute-command
+endif
+
+hi def link readlineKey readlineKeySeq
+hi def link readlineComment Comment
+hi def link readlineTodo Todo
+hi def link readlineConditional Conditional
+hi def link readlineTest Type
+hi def link readlineDelimiter Delimiter
+hi def link readlineTestModeEq readlineEq
+hi def link readlineTestTermEq readlineEq
+hi def link readlineTestTerm readlineString
+hi def link readlineTestAppEq readlineEq
+hi def link readlineTestApp readlineString
+hi def link readlineInclude Include
+hi def link readlinePath String
+hi def link readlineKeyName SpecialChar
+hi def link readlineKeySeparator readlineKeySeq
+hi def link readlineKeyTerminator readlineDelimiter
+hi def link readlineKeySeq String
+hi def link readlineKeyEscape SpecialChar
+hi def link readlineKeyword Keyword
+hi def link readlineVariable Identifier
+hi def link readlineBellStyle Constant
+hi def link readlineBoolean Boolean
+hi def link readlineString String
+hi def link readlineStringDelimiter readlineString
+hi def link readlineNumber Number
+hi def link readlineEditingMode Constant
+hi def link readlineKeymap Constant
+hi def link readlineFunction Function
+
+let b:current_syntax = 'readline'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/rebol.vim b/runtime/syntax/rebol.vim
new file mode 100644
index 0000000..a5d50c4
--- /dev/null
+++ b/runtime/syntax/rebol.vim
@@ -0,0 +1,199 @@
+" Vim syntax file
+" Language: Rebol
+" Maintainer: Mike Williams <mrw@eandem.co.uk>
+" Filenames: *.r
+" Last Change: 27th June 2002
+" URL: http://www.eandem.co.uk/mrw/vim
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Rebol is case insensitive
+syn case ignore
+
+" As per current users documentation
+setlocal isk=@,48-57,?,!,.,',+,-,*,&,\|,=,_,~
+
+" Yer TODO highlighter
+syn keyword rebolTodo contained TODO
+
+" Comments
+syn match rebolComment ";.*$" contains=rebolTodo
+
+" Words
+syn match rebolWord "\a\k*"
+syn match rebolWordPath "[^[:space:]]/[^[:space]]"ms=s+1,me=e-1
+
+" Booleans
+syn keyword rebolBoolean true false on off yes no
+
+" Values
+" Integers
+syn match rebolInteger "\<[+-]\=\d\+\('\d*\)*\>"
+" Decimals
+syn match rebolDecimal "[+-]\=\(\d\+\('\d*\)*\)\=[,.]\d*\(e[+-]\=\d\+\)\="
+syn match rebolDecimal "[+-]\=\d\+\('\d*\)*\(e[+-]\=\d\+\)\="
+" Time
+syn match rebolTime "[+-]\=\(\d\+\('\d*\)*\:\)\{1,2}\d\+\('\d*\)*\([.,]\d\+\)\=\([AP]M\)\=\>"
+syn match rebolTime "[+-]\=:\d\+\([.,]\d*\)\=\([AP]M\)\=\>"
+" Dates
+" DD-MMM-YY & YYYY format
+syn match rebolDate "\d\{1,2}\([/-]\)\(Jan\|Feb\|Mar\|Apr\|May\|Jun\|Jul\|Aug\|Sep\|Oct\|Nov\|Dec\)\1\(\d\{2}\)\{1,2}\>"
+" DD-month-YY & YYYY format
+syn match rebolDate "\d\{1,2}\([/-]\)\(January\|February\|March\|April\|May\|June\|July\|August\|September\|October\|November\|December\)\1\(\d\{2}\)\{1,2}\>"
+" DD-MM-YY & YY format
+syn match rebolDate "\d\{1,2}\([/-]\)\d\{1,2}\1\(\d\{2}\)\{1,2}\>"
+" YYYY-MM-YY format
+syn match rebolDate "\d\{4}-\d\{1,2}-\d\{1,2}\>"
+" DD.MM.YYYY format
+syn match rebolDate "\d\{1,2}\.\d\{1,2}\.\d\{4}\>"
+" Money
+syn match rebolMoney "\a*\$\d\+\('\d*\)*\([,.]\d\+\)\="
+" Strings
+syn region rebolString oneline start=+"+ skip=+^"+ end=+"+ contains=rebolSpecialCharacter
+syn region rebolString start=+[^#]{+ end=+}+ skip=+{[^}]*}+ contains=rebolSpecialCharacter
+" Binary
+syn region rebolBinary start=+\d*#{+ end=+}+ contains=rebolComment
+" Email
+syn match rebolEmail "\<\k\+@\(\k\+\.\)*\k\+\>"
+" File
+syn match rebolFile "%\(\k\+/\)*\k\+[/]\=" contains=rebolSpecialCharacter
+syn region rebolFile oneline start=+%"+ end=+"+ contains=rebolSpecialCharacter
+" URLs
+syn match rebolURL "http://\k\+\(\.\k\+\)*\(:\d\+\)\=\(/\(\k\+/\)*\(\k\+\)\=\)*"
+syn match rebolURL "file://\k\+\(\.\k\+\)*/\(\k\+/\)*\k\+"
+syn match rebolURL "ftp://\(\k\+:\k\+@\)\=\k\+\(\.\k\+\)*\(:\d\+\)\=/\(\k\+/\)*\k\+"
+syn match rebolURL "mailto:\k\+\(\.\k\+\)*@\k\+\(\.\k\+\)*"
+" Issues
+syn match rebolIssue "#\(\d\+-\)*\d\+"
+" Tuples
+syn match rebolTuple "\(\d\+\.\)\{2,}"
+
+" Characters
+syn match rebolSpecialCharacter contained "\^[^[:space:][]"
+syn match rebolSpecialCharacter contained "%\d\+"
+
+
+" Operators
+" Math operators
+syn match rebolMathOperator "\(\*\{1,2}\|+\|-\|/\{1,2}\)"
+syn keyword rebolMathFunction abs absolute add arccosine arcsine arctangent cosine
+syn keyword rebolMathFunction divide exp log-10 log-2 log-e max maximum min
+syn keyword rebolMathFunction minimum multiply negate power random remainder sine
+syn keyword rebolMathFunction square-root subtract tangent
+" Binary operators
+syn keyword rebolBinaryOperator complement and or xor ~
+" Logic operators
+syn match rebolLogicOperator "[<>=]=\="
+syn match rebolLogicOperator "<>"
+syn keyword rebolLogicOperator not
+syn keyword rebolLogicFunction all any
+syn keyword rebolLogicFunction head? tail?
+syn keyword rebolLogicFunction negative? positive? zero? even? odd?
+syn keyword rebolLogicFunction binary? block? char? date? decimal? email? empty?
+syn keyword rebolLogicFunction file? found? function? integer? issue? logic? money?
+syn keyword rebolLogicFunction native? none? object? paren? path? port? series?
+syn keyword rebolLogicFunction string? time? tuple? url? word?
+syn keyword rebolLogicFunction exists? input? same? value?
+
+" Datatypes
+syn keyword rebolType binary! block! char! date! decimal! email! file!
+syn keyword rebolType function! integer! issue! logic! money! native!
+syn keyword rebolType none! object! paren! path! port! string! time!
+syn keyword rebolType tuple! url! word!
+syn keyword rebolTypeFunction type?
+
+" Control statements
+syn keyword rebolStatement break catch exit halt reduce return shield
+syn keyword rebolConditional if else
+syn keyword rebolRepeat for forall foreach forskip loop repeat while until do
+
+" Series statements
+syn keyword rebolStatement change clear copy fifth find first format fourth free
+syn keyword rebolStatement func function head insert last match next parse past
+syn keyword rebolStatement pick remove second select skip sort tail third trim length?
+
+" Context
+syn keyword rebolStatement alias bind use
+
+" Object
+syn keyword rebolStatement import make make-object rebol info?
+
+" I/O statements
+syn keyword rebolStatement delete echo form format import input load mold prin
+syn keyword rebolStatement print probe read save secure send write
+syn keyword rebolOperator size? modified?
+
+" Debug statement
+syn keyword rebolStatement help probe trace
+
+" Misc statements
+syn keyword rebolStatement func function free
+
+" Constants
+syn keyword rebolConstant none
+
+
+" Define the default highlighting.
+" 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
+
+
+if exists("my_rebol_file")
+ if file_readable(expand(my_rebol_file))
+ execute "source " . my_rebol_file
+ endif
+endif
+
+let b:current_syntax = "rebol"
+
+" vim: ts=8
diff --git a/runtime/syntax/redif.vim b/runtime/syntax/redif.vim
new file mode 100644
index 0000000..3651922
--- /dev/null
+++ b/runtime/syntax/redif.vim
@@ -0,0 +1,970 @@
+" Vim syntax file
+" Language: ReDIF
+" Maintainer: Axel Castellane <axel.castellane@polytechnique.edu>
+" Last Change: 2021 Jul 28
+" Original Author: Axel Castellane
+" Source: http://openlib.org/acmes/root/docu/redif_1.html
+" File Extension: rdf
+" Note: The ReDIF format is used by RePEc.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" ReDIF is case-insensitive
+syntax case ignore
+
+" Structure: Some fields determine what fields can come next. For example:
+" Template-Type
+" *-Name
+" File-URL
+" *-Institution
+" Those fields span a syntax region over several lines so that these regions
+" can only contain their respective items.
+
+" Any line which is not a correct template or part of an argument is an error.
+" This comes at the very beginning, so it has the lowest priority and will
+" only match if nothing else did.
+syntax match redifWrongLine /^.\+/ display
+
+highlight def link redifWrongLine redifError
+
+" Comments must start with # and it must be the first character of the line,
+" otherwise I believe that they are considered as part of an argument.
+syntax match redifComment /^#.*/ containedin=ALL display
+
+" Defines the 9 possible multi-lines regions of Template-Type and the fields
+" they can contain.
+syntax region redifRegionTemplatePaper start=/^Template-Type:\_s*ReDIF-Paper \d\+\.\d\+/ end=/^Template-Type:/me=s-1 contains=redifContainerFieldsPaper,redifWrongLine,redifRegionClusterAuthor,redifRegionClusterFile fold
+syntax region redifRegionTemplateArticle start=/^Template-Type:\_s*ReDIF-Article \d\+\.\d\+/ end=/^Template-Type:/me=s-1 contains=redifContainerFieldsArticle,redifWrongLine,redifRegionClusterAuthor,redifRegionClusterFile fold
+syntax region redifRegionTemplateChapter start=/^Template-Type:\_s*ReDIF-Chapter \d\+\.\d\+/ end=/^Template-Type:/me=s-1 contains=redifContainerFieldsChapter,redifWrongLine,redifRegionClusterAuthor,redifRegionClusterFile,redifRegionClusterProvider,redifRegionClusterPublisher,redifRegionClusterEditor fold
+syntax region redifRegionTemplateBook start=/^Template-Type:\_s*ReDIF-Book \d\+\.\d\+/ end=/^Template-Type:/me=s-1 contains=redifContainerFieldsBook,redifWrongLine,redifRegionClusterAuthor,redifRegionClusterFile,redifRegionClusterProvider,redifRegionClusterPublisher,redifRegionClusterEditor fold
+syntax region redifRegionTemplateSoftware start=/^Template-Type:\_s*ReDIF-Software \d\+\.\d\+/ end=/^Template-Type:/me=s-1 contains=redifContainerFieldsSoftware,redifWrongLine,redifRegionClusterAuthor,redifRegionClusterFile fold
+syntax region redifRegionTemplateArchive start=/^Template-Type:\_s*ReDIF-Archive \d\+\.\d\+/ end=/^Template-Type:/me=s-1 contains=redifContainerFieldsArchive,redifWrongLine fold
+syntax region redifRegionTemplateSeries start=/^Template-Type:\_s*ReDIF-Series \d\+\.\d\+/ end=/^Template-Type:/me=s-1 contains=redifContainerFieldsSeries,redifWrongLine,redifRegionClusterProvider,redifRegionClusterPublisher,redifRegionClusterEditor fold
+syntax region redifRegionTemplateInstitution start=/^Template-Type:\_s*ReDIF-Institution \d\+\.\d\+/ end=/^Template-Type:/me=s-1 contains=redifContainerFieldsInstitution,redifWrongLine,redifRegionClusterPrimary,redifRegionClusterSecondary,redifRegionClusterTertiary,redifRegionClusterQuaternary fold
+syntax region redifRegionTemplatePerson start=/^Template-Type:\_s*ReDIF-Person \d\+\.\d\+/ end=/^Template-Type:/me=s-1 contains=redifContainerFieldsPerson,redifWrongLine,redifRegionClusterWorkplace fold
+
+" All fields are foldable (These come before clusters, so they have lower
+" priority). So they are contained in a foldable syntax region.
+syntax region redifContainerFieldsPaper start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldTitle,redifFieldHandleOfWork,redifFieldLanguage,redifFieldContactEmail,redifFieldAbstract,redifFieldClassificationJEL,redifFieldKeywords,redifFieldNumber,redifFieldCreationDate,redifFieldRevisionDate,redifFieldPublicationStatus,redifFieldNote,redifFieldLength,redifFieldSeries,redifFieldAvailability,redifFieldOrderURL,redifFieldArticleHandle,redifFieldBookHandle,redifFieldChapterHandle,redifFieldPaperHandle,redifFieldSoftwareHandle,redifFieldRestriction,redifFieldPrice,redifFieldNotification,redifFieldPublicationType,redifFieldTemplateType,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsArticle start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldTitle,redifFieldHandleOfWork,redifFieldLanguage,redifFieldContactEmail,redifFieldAbstract,redifFieldClassificationJEL,redifFieldKeywords,redifFieldNumber,redifFieldCreationDate,redifFieldPublicationStatus,redifFieldOrderURL,redifFieldArticleHandle,redifFieldBookHandle,redifFieldChapterHandle,redifFieldPaperHandle,redifFieldSoftwareHandle,redifFieldRestriction,redifFieldPrice,redifFieldNotification,redifFieldPublicationType,redifFieldJournal,redifFieldVolume,redifFieldYear,redifFieldIssue,redifFieldMonth,redifFieldPages,redifFieldNumber,redifFieldArticleHandle,redifFieldBookHandle,redifFieldChapterHandle,redifFieldPaperHandle,redifFieldSoftwareHandle,redifFieldTemplateType,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsChapter start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldHandleOfWork,redifFieldTitle,redifFieldContactEmail,redifFieldAbstract,redifFieldClassificationJEL,redifFieldKeywords,redifFieldBookTitle,redifFieldYear,redifFieldMonth,redifFieldPages,redifFieldChapter,redifFieldVolume,redifFieldEdition,redifFieldSeries,redifFieldISBN,redifFieldPublicationStatus,redifFieldNote,redifFieldInBook,redifFieldOrderURL,redifFieldArticleHandle,redifFieldBookHandle,redifFieldChapterHandle,redifFieldPaperHandle,redifFieldSoftwareHandle,redifFieldTemplateType,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsBook start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldTitle,redifFieldHandleOfWork,redifFieldContactEmail,redifFieldYear,redifFieldMonth,redifFieldVolume,redifFieldEdition,redifFieldSeries,redifFieldISBN,redifFieldPublicationStatus,redifFieldNote,redifFieldAbstract,redifFieldClassificationJEL,redifFieldKeywords,redifFieldHasChapter,redifFieldPrice,redifFieldOrderURL,redifFieldNumber,redifFieldCreationDate,redifFieldPublicationDate,redifFieldArticleHandle,redifFieldBookHandle,redifFieldChapterHandle,redifFieldPaperHandle,redifFieldSoftwareHandle,redifFieldTemplateType,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsSoftware start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldHandleOfWork,redifFieldTitle,redifFieldProgrammingLanguage,redifFieldAbstract,redifFieldNumber,redifFieldVersion,redifFieldClassificationJEL,redifFieldKeywords,redifFieldSize,redifFieldSeries,redifFieldCreationDate,redifFieldRevisionDate,redifFieldNote,redifFieldRequires,redifFieldArticleHandle,redifFieldBookHandle,redifFieldChapterHandle,redifFieldPaperHandle,redifFieldSoftwareHandle,redifFieldTemplateType,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsArchive start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldHandleOfArchive,redifFieldURL,redifFieldMaintainerEmail,redifFieldName,redifFieldMaintainerName,redifFieldMaintainerPhone,redifFieldMaintainerFax,redifFieldClassificationJEL,redifFieldHomepage,redifFieldDescription,redifFieldNotification,redifFieldRestriction,redifFieldTemplateType,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsSeries start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldName,redifFieldHandleOfSeries,redifFieldMaintainerEmail,redifFieldType,redifFieldOrderEmail,redifFieldOrderHomepage,redifFieldOrderPostal,redifFieldPrice,redifFieldRestriction,redifFieldMaintainerPhone,redifFieldMaintainerFax,redifFieldMaintainerName,redifFieldDescription,redifFieldClassificationJEL,redifFieldKeywords,redifFieldNotification,redifFieldISSN,redifFieldFollowup,redifFieldPredecessor,redifFieldTemplateType,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsInstitution start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldHandleOfInstitution,redifFieldPrimaryDefunct,redifFieldSecondaryDefunct,redifFieldTertiaryDefunct,redifFieldTemplateType,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsPerson start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldHandleOfPerson,redifFieldNameFull,redifFieldNameFirst,redifFieldNameLast,redifFieldNamePrefix,redifFieldNameMiddle,redifFieldNameSuffix,redifFieldNameASCII,redifFieldEmail,redifFieldHomepage,redifFieldFax,redifFieldPostal,redifFieldPhone,redifFieldWorkplaceOrganization,redifFieldAuthorPaper,redifFieldAuthorArticle,redifFieldAuthorSoftware,redifFieldAuthorBook,redifFieldAuthorChapter,redifFieldEditorBook,redifFieldEditorSeries,redifFieldClassificationJEL,redifFieldShortId,redifFieldLastLoginDate,redifFieldRegisteredDate,redifWrongLine contained transparent fold
+
+" Defines the 10 possible clusters and what they can contain
+" A field not in the cluster ends the cluster.
+syntax region redifRegionClusterWorkplace start=/^Workplace-Name:/ skip=/^Workplace-\%(Name-English\|Homepage\|Postal\|Location\|Email\|Phone\|Fax\|Institution\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsWorkplace fold
+syntax region redifRegionClusterPrimary start=/^Primary-Name:/ skip=/^Primary-\%(Name-English\|Homepage\|Postal\|Location\|Email\|Phone\|Fax\|Institution\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsPrimary fold
+syntax region redifRegionClusterSecondary start=/^Secondary-Name:/ skip=/^Secondary-\%(Name-English\|Homepage\|Postal\|Location\|Email\|Phone\|Fax\|Institution\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsSecondary fold
+syntax region redifRegionClusterTertiary start=/^Tertiary-Name:/ skip=/^Tertiary-\%(Name-English\|Homepage\|Postal\|Location\|Email\|Phone\|Fax\|Institution\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsTertiary fold
+syntax region redifRegionClusterQuaternary start=/^Quaternary-Name:/ skip=/^Quaternary-\%(Name-English\|Homepage\|Postal\|Location\|Email\|Phone\|Fax\|Institution\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsQuaternary fold
+syntax region redifRegionClusterProvider start=/^Provider-Name:/ skip=/^Provider-\%(Name-English\|Homepage\|Postal\|Location\|Email\|Phone\|Fax\|Institution\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsProvider fold
+syntax region redifRegionClusterPublisher start=/^Publisher-Name:/ skip=/^Publisher-\%(Name-English\|Homepage\|Postal\|Location\|Email\|Phone\|Fax\|Institution\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsPublisher fold
+syntax region redifRegionClusterAuthor start=/^Author-Name:/ skip=/^Author-\%(Name\%(-First\|-Last\)\|Homepage\|Email\|Fax\|Postal\|Phone\|Person\|Workplace-Name\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifRegionClusterAuthorWorkplace,redifContainerFieldsAuthor fold
+syntax region redifRegionClusterEditor start=/^Editor-Name:/ skip=/^Editor-\%(Name\%(-First\|-Last\)\|Homepage\|Email\|Fax\|Postal\|Phone\|Person\|Workplace-Name\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifRegionClusterEditorWorkplace,redifContainerFieldsEditor fold
+syntax region redifRegionClusterFile start=/^File-URL:/ skip=/^File-\%(Format\|Function\|Size\|Restriction\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsFile fold
+
+" The foldable containers of the clusters.
+syntax region redifContainerFieldsWorkplace start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldWorkplaceName,redifFieldWorkplaceHomepage,redifFieldWorkplaceNameEnglish,redifFieldWorkplacePostal,redifFieldWorkplaceLocation,redifFieldWorkplaceEmail,redifFieldWorkplacePhone,redifFieldWorkplaceFax,redifFieldWorkplaceInstitution,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsPrimary start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldPrimaryName,redifFieldPrimaryHomepage,redifFieldPrimaryNameEnglish,redifFieldPrimaryPostal,redifFieldPrimaryLocation,redifFieldPrimaryEmail,redifFieldPrimaryPhone,redifFieldPrimaryFax,redifFieldPrimaryInstitution,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsSecondary start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldSecondaryName,redifFieldSecondaryHomepage,redifFieldSecondaryNameEnglish,redifFieldSecondaryPostal,redifFieldSecondaryLocation,redifFieldSecondaryEmail,redifFieldSecondaryPhone,redifFieldSecondaryFax,redifFieldSecondaryInstitution,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsTertiary start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldTertiaryName,redifFieldTertiaryHomepage,redifFieldTertiaryNameEnglish,redifFieldTertiaryPostal,redifFieldTertiaryLocation,redifFieldTertiaryEmail,redifFieldTertiaryPhone,redifFieldTertiaryFax,redifFieldTertiaryInstitution,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsQuaternary start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldQuaternaryName,redifFieldQuaternaryHomepage,redifFieldQuaternaryNameEnglish,redifFieldQuaternaryPostal,redifFieldQuaternaryLocation,redifFieldQuaternaryEmail,redifFieldQuaternaryPhone,redifFieldQuaternaryFax,redifFieldQuaternaryInstitution,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsProvider start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldProviderName,redifFieldProviderHomepage,redifFieldProviderNameEnglish,redifFieldProviderPostal,redifFieldProviderLocation,redifFieldProviderEmail,redifFieldProviderPhone,redifFieldProviderFax,redifFieldProviderInstitution,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsPublisher start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldPublisherName,redifFieldPublisherHomepage,redifFieldPublisherNameEnglish,redifFieldPublisherPostal,redifFieldPublisherLocation,redifFieldPublisherEmail,redifFieldPublisherPhone,redifFieldPublisherFax,redifFieldPublisherInstitution,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsAuthor start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldAuthorName,redifFieldAuthorNameFirst,redifFieldAuthorNameLast,redifFieldAuthorHomepage,redifFieldAuthorEmail,redifFieldAuthorFax,redifFieldAuthorPostal,redifFieldAuthorPhone,redifFieldAuthorPerson,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsEditor start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldEditorName,redifFieldEditorNameFirst,redifFieldEditorNameLast,redifFieldEditorHomepage,redifFieldEditorEmail,redifFieldEditorFax,redifFieldEditorPostal,redifFieldEditorPhone,redifFieldEditorPerson,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsFile start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldFileURL,redifFieldFileFormat,redifFieldFileFunction,redifFieldFileSize,redifFieldFileRestriction,redifWrongLine contained transparent fold
+
+" The two clusters in cluster (must be presented after to have priority over
+" fields containers)
+syntax region redifRegionClusterAuthorWorkplace start=/^Author-Workplace-Name:/ skip=/^Author-Workplace-\%(Name-English\|Homepage\|Postal\|Location\|Email\|Phone\|Fax\|Institution\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsAuthorWorkplace fold
+syntax region redifRegionClusterEditorWorkplace start=/^Editor-Workplace-Name:/ skip=/^Editor-Workplace-\%(Name-English\|Homepage\|Postal\|Location\|Email\|Phone\|Fax\|Institution\):/ end=/^\S\{-}:/me=s-1 contained contains=redifWrongLine,redifContainerFieldsEditorWorkplace fold
+
+" Their foldable fields containers
+syntax region redifContainerFieldsAuthorWorkplace start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldAuthorWorkplaceName,redifFieldAuthorWorkplaceHomepage,redifFieldAuthorWorkplaceNameEnglish,redifFieldAuthorWorkplacePostal,redifFieldAuthorWorkplaceLocation,redifFieldAuthorWorkplaceEmail,redifFieldAuthorWorkplacePhone,redifFieldAuthorWorkplaceFax,redifFieldAuthorWorkplaceInstitution,redifWrongLine contained transparent fold
+syntax region redifContainerFieldsEditorWorkplace start=/^\S\{-}:/ end=/^\S\{-}:/me=s-1 contains=redifFieldEditorWorkplaceName,redifFieldEditorWorkplaceHomepage,redifFieldEditorWorkplaceNameEnglish,redifFieldEditorWorkplacePostal,redifFieldEditorWorkplaceLocation,redifFieldEditorWorkplaceEmail,redifFieldEditorWorkplacePhone,redifFieldEditorWorkplaceFax,redifFieldEditorWorkplaceInstitution,redifWrongLine contained transparent fold
+
+" All the possible fields
+" Note: The "Handle" field is handled a little bit differently, because it
+" does not have the same meaning depending on the Template-Type. See:
+" /redifFieldHandleOf....
+syntax match redifFieldAbstract /^Abstract:/ skipwhite skipempty nextgroup=redifArgumentAbstract contained
+syntax match redifFieldArticleHandle /^Article-Handle:/ skipwhite skipempty nextgroup=redifArgumentArticleHandle contained
+syntax match redifFieldAuthorArticle /^Author-Article:/ skipwhite skipempty nextgroup=redifArgumentAuthorArticle contained
+syntax match redifFieldAuthorBook /^Author-Book:/ skipwhite skipempty nextgroup=redifArgumentAuthorBook contained
+syntax match redifFieldAuthorChapter /^Author-Chapter:/ skipwhite skipempty nextgroup=redifArgumentAuthorChapter contained
+syntax match redifFieldAuthorEmail /^Author-Email:/ skipwhite skipempty nextgroup=redifArgumentAuthorEmail contained
+syntax match redifFieldAuthorFax /^Author-Fax:/ skipwhite skipempty nextgroup=redifArgumentAuthorFax contained
+syntax match redifFieldAuthorHomepage /^Author-Homepage:/ skipwhite skipempty nextgroup=redifArgumentAuthorHomepage contained
+syntax match redifFieldAuthorName /^Author-Name:/ skipwhite skipempty nextgroup=redifArgumentAuthorName contained
+syntax match redifFieldAuthorNameFirst /^Author-Name-First:/ skipwhite skipempty nextgroup=redifArgumentAuthorNameFirst contained
+syntax match redifFieldAuthorNameLast /^Author-Name-Last:/ skipwhite skipempty nextgroup=redifArgumentAuthorNameLast contained
+syntax match redifFieldAuthorPaper /^Author-Paper:/ skipwhite skipempty nextgroup=redifArgumentAuthorPaper contained
+syntax match redifFieldAuthorPerson /^Author-Person:/ skipwhite skipempty nextgroup=redifArgumentAuthorPerson contained
+syntax match redifFieldAuthorPhone /^Author-Phone:/ skipwhite skipempty nextgroup=redifArgumentAuthorPhone contained
+syntax match redifFieldAuthorPostal /^Author-Postal:/ skipwhite skipempty nextgroup=redifArgumentAuthorPostal contained
+syntax match redifFieldAuthorSoftware /^Author-Software:/ skipwhite skipempty nextgroup=redifArgumentAuthorSoftware contained
+syntax match redifFieldAuthorWorkplaceEmail /^Author-Workplace-Email:/ skipwhite skipempty nextgroup=redifArgumentAuthorWorkplaceEmail contained
+syntax match redifFieldAuthorWorkplaceFax /^Author-Workplace-Fax:/ skipwhite skipempty nextgroup=redifArgumentAuthorWorkplaceFax contained
+syntax match redifFieldAuthorWorkplaceHomepage /^Author-Workplace-Homepage:/ skipwhite skipempty nextgroup=redifArgumentAuthorWorkplaceHomepage contained
+syntax match redifFieldAuthorWorkplaceInstitution /^Author-Workplace-Institution:/ skipwhite skipempty nextgroup=redifArgumentAuthorWorkplaceInstitution contained
+syntax match redifFieldAuthorWorkplaceLocation /^Author-Workplace-Location:/ skipwhite skipempty nextgroup=redifArgumentAuthorWorkplaceLocation contained
+syntax match redifFieldAuthorWorkplaceName /^Author-Workplace-Name:/ skipwhite skipempty nextgroup=redifArgumentAuthorWorkplaceName contained
+syntax match redifFieldAuthorWorkplaceNameEnglish /^Author-Workplace-Name-English:/ skipwhite skipempty nextgroup=redifArgumentAuthorWorkplaceNameEnglish contained
+syntax match redifFieldAuthorWorkplacePhone /^Author-Workplace-Phone:/ skipwhite skipempty nextgroup=redifArgumentAuthorWorkplacePhone contained
+syntax match redifFieldAuthorWorkplacePostal /^Author-Workplace-Postal:/ skipwhite skipempty nextgroup=redifArgumentAuthorWorkplacePostal contained
+syntax match redifFieldAvailability /^Availability:/ skipwhite skipempty nextgroup=redifArgumentAvailability contained
+syntax match redifFieldBookHandle /^Book-Handle:/ skipwhite skipempty nextgroup=redifArgumentBookHandle contained
+syntax match redifFieldBookTitle /^Book-Title:/ skipwhite skipempty nextgroup=redifArgumentBookTitle contained
+syntax match redifFieldChapterHandle /^Chapter-Handle:/ skipwhite skipempty nextgroup=redifArgumentChapterHandle contained
+syntax match redifFieldChapter /^Chapter:/ skipwhite skipempty nextgroup=redifArgumentChapter contained
+syntax match redifFieldClassificationJEL /^Classification-JEL:/ skipwhite skipempty nextgroup=redifArgumentClassificationJEL contained
+syntax match redifFieldContactEmail /^Contact-Email:/ skipwhite skipempty nextgroup=redifArgumentContactEmail contained
+syntax match redifFieldCreationDate /^Creation-Date:/ skipwhite skipempty nextgroup=redifArgumentCreationDate contained
+syntax match redifFieldDescription /^Description:/ skipwhite skipempty nextgroup=redifArgumentDescription contained
+syntax match redifFieldEdition /^Edition:/ skipwhite skipempty nextgroup=redifArgumentEdition contained
+syntax match redifFieldEditorBook /^Editor-Book:/ skipwhite skipempty nextgroup=redifArgumentEditorBook contained
+syntax match redifFieldEditorEmail /^Editor-Email:/ skipwhite skipempty nextgroup=redifArgumentEditorEmail contained
+syntax match redifFieldEditorFax /^Editor-Fax:/ skipwhite skipempty nextgroup=redifArgumentEditorFax contained
+syntax match redifFieldEditorHomepage /^Editor-Homepage:/ skipwhite skipempty nextgroup=redifArgumentEditorHomepage contained
+syntax match redifFieldEditorName /^Editor-Name:/ skipwhite skipempty nextgroup=redifArgumentEditorName contained
+syntax match redifFieldEditorNameFirst /^Editor-Name-First:/ skipwhite skipempty nextgroup=redifArgumentEditorNameFirst contained
+syntax match redifFieldEditorNameLast /^Editor-Name-Last:/ skipwhite skipempty nextgroup=redifArgumentEditorNameLast contained
+syntax match redifFieldEditorPerson /^Editor-Person:/ skipwhite skipempty nextgroup=redifArgumentEditorPerson contained
+syntax match redifFieldEditorPhone /^Editor-Phone:/ skipwhite skipempty nextgroup=redifArgumentEditorPhone contained
+syntax match redifFieldEditorPostal /^Editor-Postal:/ skipwhite skipempty nextgroup=redifArgumentEditorPostal contained
+syntax match redifFieldEditorSeries /^Editor-Series:/ skipwhite skipempty nextgroup=redifArgumentEditorSeries contained
+syntax match redifFieldEditorWorkplaceEmail /^Editor-Workplace-Email:/ skipwhite skipempty nextgroup=redifArgumentEditorWorkplaceEmail contained
+syntax match redifFieldEditorWorkplaceFax /^Editor-Workplace-Fax:/ skipwhite skipempty nextgroup=redifArgumentEditorWorkplaceFax contained
+syntax match redifFieldEditorWorkplaceHomepage /^Editor-Workplace-Homepage:/ skipwhite skipempty nextgroup=redifArgumentEditorWorkplaceHomepage contained
+syntax match redifFieldEditorWorkplaceInstitution /^Editor-Workplace-Institution:/ skipwhite skipempty nextgroup=redifArgumentEditorWorkplaceInstitution contained
+syntax match redifFieldEditorWorkplaceLocation /^Editor-Workplace-Location:/ skipwhite skipempty nextgroup=redifArgumentEditorWorkplaceLocation contained
+syntax match redifFieldEditorWorkplaceName /^Editor-Workplace-Name:/ skipwhite skipempty nextgroup=redifArgumentEditorWorkplaceName contained
+syntax match redifFieldEditorWorkplaceNameEnglish /^Editor-Workplace-Name-English:/ skipwhite skipempty nextgroup=redifArgumentEditorWorkplaceNameEnglish contained
+syntax match redifFieldEditorWorkplacePhone /^Editor-Workplace-Phone:/ skipwhite skipempty nextgroup=redifArgumentEditorWorkplacePhone contained
+syntax match redifFieldEditorWorkplacePostal /^Editor-Workplace-Postal:/ skipwhite skipempty nextgroup=redifArgumentEditorWorkplacePostal contained
+syntax match redifFieldEmail /^Email:/ skipwhite skipempty nextgroup=redifArgumentEmail contained
+syntax match redifFieldFax /^Fax:/ skipwhite skipempty nextgroup=redifArgumentFax contained
+syntax match redifFieldFileFormat /^File-Format:/ skipwhite skipempty nextgroup=redifArgumentFileFormat contained
+syntax match redifFieldFileFunction /^File-Function:/ skipwhite skipempty nextgroup=redifArgumentFileFunction contained
+syntax match redifFieldFileRestriction /^File-Restriction:/ skipwhite skipempty nextgroup=redifArgumentFileRestriction contained
+syntax match redifFieldFileSize /^File-Size:/ skipwhite skipempty nextgroup=redifArgumentFileSize contained
+syntax match redifFieldFileURL /^File-URL:/ skipwhite skipempty nextgroup=redifArgumentFileURL contained
+syntax match redifFieldFollowup /^Followup:/ skipwhite skipempty nextgroup=redifArgumentFollowup contained
+syntax match redifFieldHandleOfArchive /^Handle:/ skipwhite skipempty nextgroup=redifArgumentHandleOfArchive contained
+syntax match redifFieldHandleOfInstitution /^Handle:/ skipwhite skipempty nextgroup=redifArgumentHandleOfInstitution contained
+syntax match redifFieldHandleOfPerson /^Handle:/ skipwhite skipempty nextgroup=redifArgumentHandleOfPerson contained
+syntax match redifFieldHandleOfSeries /^Handle:/ skipwhite skipempty nextgroup=redifArgumentHandleOfSeries contained
+syntax match redifFieldHandleOfWork /^Handle:/ skipwhite skipempty nextgroup=redifArgumentHandleOfWork contained
+syntax match redifFieldHasChapter /^HasChapter:/ skipwhite skipempty nextgroup=redifArgumentHasChapter contained
+syntax match redifFieldHomepage /^Homepage:/ skipwhite skipempty nextgroup=redifArgumentHomepage contained
+syntax match redifFieldInBook /^In-Book:/ skipwhite skipempty nextgroup=redifArgumentInBook contained
+syntax match redifFieldISBN /^ISBN:/ skipwhite skipempty nextgroup=redifArgumentISBN contained
+syntax match redifFieldISSN /^ISSN:/ skipwhite skipempty nextgroup=redifArgumentISSN contained
+syntax match redifFieldIssue /^Issue:/ skipwhite skipempty nextgroup=redifArgumentIssue contained
+syntax match redifFieldJournal /^Journal:/ skipwhite skipempty nextgroup=redifArgumentJournal contained
+syntax match redifFieldKeywords /^Keywords:/ skipwhite skipempty nextgroup=redifArgumentKeywords contained
+syntax match redifFieldKeywords /^Keywords:/ skipwhite skipempty nextgroup=redifArgumentKeywords contained
+syntax match redifFieldLanguage /^Language:/ skipwhite skipempty nextgroup=redifArgumentLanguage contained
+syntax match redifFieldLastLoginDate /^Last-Login-Date:/ skipwhite skipempty nextgroup=redifArgumentLastLoginDate contained
+syntax match redifFieldLength /^Length:/ skipwhite skipempty nextgroup=redifArgumentLength contained
+syntax match redifFieldMaintainerEmail /^Maintainer-Email:/ skipwhite skipempty nextgroup=redifArgumentMaintainerEmail contained
+syntax match redifFieldMaintainerFax /^Maintainer-Fax:/ skipwhite skipempty nextgroup=redifArgumentMaintainerFax contained
+syntax match redifFieldMaintainerName /^Maintainer-Name:/ skipwhite skipempty nextgroup=redifArgumentMaintainerName contained
+syntax match redifFieldMaintainerPhone /^Maintainer-Phone:/ skipwhite skipempty nextgroup=redifArgumentMaintainerPhone contained
+syntax match redifFieldMonth /^Month:/ skipwhite skipempty nextgroup=redifArgumentMonth contained
+syntax match redifFieldNameASCII /^Name-ASCII:/ skipwhite skipempty nextgroup=redifArgumentNameASCII contained
+syntax match redifFieldNameFirst /^Name-First:/ skipwhite skipempty nextgroup=redifArgumentNameFirst contained
+syntax match redifFieldNameFull /^Name-Full:/ skipwhite skipempty nextgroup=redifArgumentNameFull contained
+syntax match redifFieldNameLast /^Name-Last:/ skipwhite skipempty nextgroup=redifArgumentNameLast contained
+syntax match redifFieldNameMiddle /^Name-Middle:/ skipwhite skipempty nextgroup=redifArgumentNameMiddle contained
+syntax match redifFieldNamePrefix /^Name-Prefix:/ skipwhite skipempty nextgroup=redifArgumentNamePrefix contained
+syntax match redifFieldNameSuffix /^Name-Suffix:/ skipwhite skipempty nextgroup=redifArgumentNameSuffix contained
+syntax match redifFieldName /^Name:/ skipwhite skipempty nextgroup=redifArgumentName contained
+syntax match redifFieldNote /^Note:/ skipwhite skipempty nextgroup=redifArgumentNote contained
+syntax match redifFieldNotification /^Notification:/ skipwhite skipempty nextgroup=redifArgumentNotification contained
+syntax match redifFieldNumber /^Number:/ skipwhite skipempty nextgroup=redifArgumentNumber contained
+syntax match redifFieldOrderEmail /^Order-Email:/ skipwhite skipempty nextgroup=redifArgumentOrderEmail contained
+syntax match redifFieldOrderHomepage /^Order-Homepage:/ skipwhite skipempty nextgroup=redifArgumentOrderHomepage contained
+syntax match redifFieldOrderPostal /^Order-Postal:/ skipwhite skipempty nextgroup=redifArgumentOrderPostal contained
+syntax match redifFieldOrderURL /^Order-URL:/ skipwhite skipempty nextgroup=redifArgumentOrderURL contained
+syntax match redifFieldPages /^Pages:/ skipwhite skipempty nextgroup=redifArgumentPages contained
+syntax match redifFieldPaperHandle /^Paper-Handle:/ skipwhite skipempty nextgroup=redifArgumentPaperHandle contained
+syntax match redifFieldPhone /^Phone:/ skipwhite skipempty nextgroup=redifArgumentPhone contained
+syntax match redifFieldPostal /^Postal:/ skipwhite skipempty nextgroup=redifArgumentPostal contained
+syntax match redifFieldPredecessor /^Predecessor:/ skipwhite skipempty nextgroup=redifArgumentPredecessor contained
+syntax match redifFieldPrice /^Price:/ skipwhite skipempty nextgroup=redifArgumentPrice contained
+syntax match redifFieldPrimaryDefunct /^Primary-Defunct:/ skipwhite skipempty nextgroup=redifArgumentPrimaryDefunct contained
+syntax match redifFieldPrimaryEmail /^Primary-Email:/ skipwhite skipempty nextgroup=redifArgumentPrimaryEmail contained
+syntax match redifFieldPrimaryFax /^Primary-Fax:/ skipwhite skipempty nextgroup=redifArgumentPrimaryFax contained
+syntax match redifFieldPrimaryHomepage /^Primary-Homepage:/ skipwhite skipempty nextgroup=redifArgumentPrimaryHomepage contained
+syntax match redifFieldPrimaryInstitution /^Primary-Institution:/ skipwhite skipempty nextgroup=redifArgumentPrimaryInstitution contained
+syntax match redifFieldPrimaryLocation /^Primary-Location:/ skipwhite skipempty nextgroup=redifArgumentPrimaryLocation contained
+syntax match redifFieldPrimaryName /^Primary-Name:/ skipwhite skipempty nextgroup=redifArgumentPrimaryName contained
+syntax match redifFieldPrimaryNameEnglish /^Primary-Name-English:/ skipwhite skipempty nextgroup=redifArgumentPrimaryNameEnglish contained
+syntax match redifFieldPrimaryPhone /^Primary-Phone:/ skipwhite skipempty nextgroup=redifArgumentPrimaryPhone contained
+syntax match redifFieldPrimaryPostal /^Primary-Postal:/ skipwhite skipempty nextgroup=redifArgumentPrimaryPostal contained
+syntax match redifFieldProgrammingLanguage /^Programming-Language:/ skipwhite skipempty nextgroup=redifArgumentProgrammingLanguage contained
+syntax match redifFieldProviderEmail /^Provider-Email:/ skipwhite skipempty nextgroup=redifArgumentProviderEmail contained
+syntax match redifFieldProviderFax /^Provider-Fax:/ skipwhite skipempty nextgroup=redifArgumentProviderFax contained
+syntax match redifFieldProviderHomepage /^Provider-Homepage:/ skipwhite skipempty nextgroup=redifArgumentProviderHomepage contained
+syntax match redifFieldProviderInstitution /^Provider-Institution:/ skipwhite skipempty nextgroup=redifArgumentProviderInstitution contained
+syntax match redifFieldProviderLocation /^Provider-Location:/ skipwhite skipempty nextgroup=redifArgumentProviderLocation contained
+syntax match redifFieldProviderName /^Provider-Name:/ skipwhite skipempty nextgroup=redifArgumentProviderName contained
+syntax match redifFieldProviderNameEnglish /^Provider-Name-English:/ skipwhite skipempty nextgroup=redifArgumentProviderNameEnglish contained
+syntax match redifFieldProviderPhone /^Provider-Phone:/ skipwhite skipempty nextgroup=redifArgumentProviderPhone contained
+syntax match redifFieldProviderPostal /^Provider-Postal:/ skipwhite skipempty nextgroup=redifArgumentProviderPostal contained
+syntax match redifFieldPublicationDate /^Publication-Date:/ skipwhite skipempty nextgroup=redifArgumentPublicationDate contained
+syntax match redifFieldPublicationStatus /^Publication-Status:/ skipwhite skipempty nextgroup=redifArgumentPublicationStatus contained
+syntax match redifFieldPublicationType /^Publication-Type:/ skipwhite skipempty nextgroup=redifArgumentPublicationType contained
+syntax match redifFieldQuaternaryEmail /^Quaternary-Email:/ skipwhite skipempty nextgroup=redifArgumentQuaternaryEmail contained
+syntax match redifFieldQuaternaryFax /^Quaternary-Fax:/ skipwhite skipempty nextgroup=redifArgumentQuaternaryFax contained
+syntax match redifFieldQuaternaryHomepage /^Quaternary-Homepage:/ skipwhite skipempty nextgroup=redifArgumentQuaternaryHomepage contained
+syntax match redifFieldQuaternaryInstitution /^Quaternary-Institution:/ skipwhite skipempty nextgroup=redifArgumentQuaternaryInstitution contained
+syntax match redifFieldQuaternaryLocation /^Quaternary-Location:/ skipwhite skipempty nextgroup=redifArgumentQuaternaryLocation contained
+syntax match redifFieldQuaternaryName /^Quaternary-Name:/ skipwhite skipempty nextgroup=redifArgumentQuaternaryName contained
+syntax match redifFieldQuaternaryNameEnglish /^Quaternary-Name-English:/ skipwhite skipempty nextgroup=redifArgumentQuaternaryNameEnglish contained
+syntax match redifFieldQuaternaryPhone /^Quaternary-Phone:/ skipwhite skipempty nextgroup=redifArgumentQuaternaryPhone contained
+syntax match redifFieldQuaternaryPostal /^Quaternary-Postal:/ skipwhite skipempty nextgroup=redifArgumentQuaternaryPostal contained
+syntax match redifFieldRegisteredDate /^Registered-Date:/ skipwhite skipempty nextgroup=redifArgumentRegisteredDate contained
+syntax match redifFieldRequires /^Requires:/ skipwhite skipempty nextgroup=redifArgumentRequires contained
+syntax match redifFieldRestriction /^Restriction:/ skipwhite skipempty nextgroup=redifArgumentRestriction contained
+syntax match redifFieldRevisionDate /^Revision-Date:/ skipwhite skipempty nextgroup=redifArgumentRevisionDate contained
+syntax match redifFieldSecondaryDefunct /^Secondary-Defunct:/ skipwhite skipempty nextgroup=redifArgumentSecondaryDefunct contained
+syntax match redifFieldSecondaryEmail /^Secondary-Email:/ skipwhite skipempty nextgroup=redifArgumentSecondaryEmail contained
+syntax match redifFieldSecondaryFax /^Secondary-Fax:/ skipwhite skipempty nextgroup=redifArgumentSecondaryFax contained
+syntax match redifFieldSecondaryHomepage /^Secondary-Homepage:/ skipwhite skipempty nextgroup=redifArgumentSecondaryHomepage contained
+syntax match redifFieldSecondaryInstitution /^Secondary-Institution:/ skipwhite skipempty nextgroup=redifArgumentSecondaryInstitution contained
+syntax match redifFieldSecondaryLocation /^Secondary-Location:/ skipwhite skipempty nextgroup=redifArgumentSecondaryLocation contained
+syntax match redifFieldSecondaryName /^Secondary-Name:/ skipwhite skipempty nextgroup=redifArgumentSecondaryName contained
+syntax match redifFieldSecondaryNameEnglish /^Secondary-Name-English:/ skipwhite skipempty nextgroup=redifArgumentSecondaryNameEnglish contained
+syntax match redifFieldSecondaryPhone /^Secondary-Phone:/ skipwhite skipempty nextgroup=redifArgumentSecondaryPhone contained
+syntax match redifFieldSecondaryPostal /^Secondary-Postal:/ skipwhite skipempty nextgroup=redifArgumentSecondaryPostal contained
+syntax match redifFieldSeries /^Series:/ skipwhite skipempty nextgroup=redifArgumentSeries contained
+syntax match redifFieldShortId /^Short-Id:/ skipwhite skipempty nextgroup=redifArgumentShortId contained
+syntax match redifFieldSize /^Size:/ skipwhite skipempty nextgroup=redifArgumentSize contained
+syntax match redifFieldSoftwareHandle /^Software-Handle:/ skipwhite skipempty nextgroup=redifArgumentSoftwareHandle contained
+syntax match redifFieldTemplateType /^Template-Type:/ skipwhite skipempty nextgroup=redifArgumentTemplateType contained
+syntax match redifFieldTertiaryDefunct /^Tertiary-Defunct:/ skipwhite skipempty nextgroup=redifArgumentTertiaryDefunct contained
+syntax match redifFieldTertiaryEmail /^Tertiary-Email:/ skipwhite skipempty nextgroup=redifArgumentTertiaryEmail contained
+syntax match redifFieldTertiaryFax /^Tertiary-Fax:/ skipwhite skipempty nextgroup=redifArgumentTertiaryFax contained
+syntax match redifFieldTertiaryHomepage /^Tertiary-Homepage:/ skipwhite skipempty nextgroup=redifArgumentTertiaryHomepage contained
+syntax match redifFieldTertiaryInstitution /^Tertiary-Institution:/ skipwhite skipempty nextgroup=redifArgumentTertiaryInstitution contained
+syntax match redifFieldTertiaryLocation /^Tertiary-Location:/ skipwhite skipempty nextgroup=redifArgumentTertiaryLocation contained
+syntax match redifFieldTertiaryName /^Tertiary-Name:/ skipwhite skipempty nextgroup=redifArgumentTertiaryName contained
+syntax match redifFieldTertiaryNameEnglish /^Tertiary-Name-English:/ skipwhite skipempty nextgroup=redifArgumentTertiaryNameEnglish contained
+syntax match redifFieldTertiaryPhone /^Tertiary-Phone:/ skipwhite skipempty nextgroup=redifArgumentTertiaryPhone contained
+syntax match redifFieldTertiaryPostal /^Tertiary-Postal:/ skipwhite skipempty nextgroup=redifArgumentTertiaryPostal contained
+syntax match redifFieldTitle /^Title:/ skipwhite skipempty nextgroup=redifArgumentTitle contained
+syntax match redifFieldType /^Type:/ skipwhite skipempty nextgroup=redifArgumentType contained
+syntax match redifFieldURL /^URL:/ skipwhite skipempty nextgroup=redifArgumentURL contained
+syntax match redifFieldVersion /^Version:/ skipwhite skipempty nextgroup=redifArgumentVersion contained
+syntax match redifFieldVolume /^Volume:/ skipwhite skipempty nextgroup=redifArgumentVolume contained
+syntax match redifFieldWorkplaceEmail /^Workplace-Email:/ skipwhite skipempty nextgroup=redifArgumentWorkplaceEmail contained
+syntax match redifFieldWorkplaceFax /^Workplace-Fax:/ skipwhite skipempty nextgroup=redifArgumentWorkplaceFax contained
+syntax match redifFieldWorkplaceHomepage /^Workplace-Homepage:/ skipwhite skipempty nextgroup=redifArgumentWorkplaceHomepage contained
+syntax match redifFieldWorkplaceInstitution /^Workplace-Institution:/ skipwhite skipempty nextgroup=redifArgumentWorkplaceInstitution contained
+syntax match redifFieldWorkplaceLocation /^Workplace-Location:/ skipwhite skipempty nextgroup=redifArgumentWorkplaceLocation contained
+syntax match redifFieldWorkplaceName /^Workplace-Name:/ skipwhite skipempty nextgroup=redifArgumentWorkplaceName contained
+syntax match redifFieldWorkplaceNameEnglish /^Workplace-Name-English:/ skipwhite skipempty nextgroup=redifArgumentWorkplaceNameEnglish contained
+syntax match redifFieldWorkplaceOrganization /^Workplace-Organization:/ skipwhite skipempty nextgroup=redifArgumentWorkplaceOrganization contained
+syntax match redifFieldWorkplacePhone /^Workplace-Phone:/ skipwhite skipempty nextgroup=redifArgumentWorkplacePhone contained
+syntax match redifFieldWorkplacePostal /^Workplace-Postal:/ skipwhite skipempty nextgroup=redifArgumentWorkplacePostal contained
+syntax match redifFieldYear /^Year:/ skipwhite skipempty nextgroup=redifArgumentYear contained
+
+highlight def link redifFieldAbstract redifField
+highlight def link redifFieldArticleHandle redifField
+highlight def link redifFieldAuthorArticle redifField
+highlight def link redifFieldAuthorBook redifField
+highlight def link redifFieldAuthorChapter redifField
+highlight def link redifFieldAuthorEmail redifField
+highlight def link redifFieldAuthorFax redifField
+highlight def link redifFieldAuthorHomepage redifField
+highlight def link redifFieldAuthorName redifField
+highlight def link redifFieldAuthorNameFirst redifField
+highlight def link redifFieldAuthorNameLast redifField
+highlight def link redifFieldAuthorPaper redifField
+highlight def link redifFieldAuthorPerson redifField
+highlight def link redifFieldAuthorPhone redifField
+highlight def link redifFieldAuthorPostal redifField
+highlight def link redifFieldAuthorSoftware redifField
+highlight def link redifFieldAuthorWorkplaceEmail redifField
+highlight def link redifFieldAuthorWorkplaceFax redifField
+highlight def link redifFieldAuthorWorkplaceHomepage redifField
+highlight def link redifFieldAuthorWorkplaceInstitution redifField
+highlight def link redifFieldAuthorWorkplaceLocation redifField
+highlight def link redifFieldAuthorWorkplaceName redifField
+highlight def link redifFieldAuthorWorkplaceNameEnglish redifField
+highlight def link redifFieldAuthorWorkplacePhone redifField
+highlight def link redifFieldAuthorWorkplacePostal redifField
+highlight def link redifFieldAvailability redifField
+highlight def link redifFieldBookHandle redifField
+highlight def link redifFieldBookTitle redifField
+highlight def link redifFieldChapterHandle redifField
+highlight def link redifFieldChapter redifField
+highlight def link redifFieldClassificationJEL redifField
+highlight def link redifFieldContactEmail redifField
+highlight def link redifFieldCreationDate redifField
+highlight def link redifFieldDescription redifField
+highlight def link redifFieldEdition redifField
+highlight def link redifFieldEditorBook redifField
+highlight def link redifFieldEditorEmail redifField
+highlight def link redifFieldEditorFax redifField
+highlight def link redifFieldEditorHomepage redifField
+highlight def link redifFieldEditorName redifField
+highlight def link redifFieldEditorNameFirst redifField
+highlight def link redifFieldEditorNameLast redifField
+highlight def link redifFieldEditorPerson redifField
+highlight def link redifFieldEditorPhone redifField
+highlight def link redifFieldEditorPostal redifField
+highlight def link redifFieldEditorSeries redifField
+highlight def link redifFieldEditorWorkplaceEmail redifField
+highlight def link redifFieldEditorWorkplaceFax redifField
+highlight def link redifFieldEditorWorkplaceHomepage redifField
+highlight def link redifFieldEditorWorkplaceInstitution redifField
+highlight def link redifFieldEditorWorkplaceLocation redifField
+highlight def link redifFieldEditorWorkplaceName redifField
+highlight def link redifFieldEditorWorkplaceNameEnglish redifField
+highlight def link redifFieldEditorWorkplacePhone redifField
+highlight def link redifFieldEditorWorkplacePostal redifField
+highlight def link redifFieldEmail redifField
+highlight def link redifFieldFax redifField
+highlight def link redifFieldFileFormat redifField
+highlight def link redifFieldFileFunction redifField
+highlight def link redifFieldFileRestriction redifField
+highlight def link redifFieldFileSize redifField
+highlight def link redifFieldFileURL redifField
+highlight def link redifFieldFollowup redifField
+highlight def link redifFieldHandleOfArchive redifField
+highlight def link redifFieldHandleOfInstitution redifField
+highlight def link redifFieldHandleOfPerson redifField
+highlight def link redifFieldHandleOfSeries redifField
+highlight def link redifFieldHandleOfWork redifField
+highlight def link redifFieldHasChapter redifField
+highlight def link redifFieldHomepage redifField
+highlight def link redifFieldInBook redifField
+highlight def link redifFieldISBN redifField
+highlight def link redifFieldISSN redifField
+highlight def link redifFieldIssue redifField
+highlight def link redifFieldJournal redifField
+highlight def link redifFieldKeywords redifField
+highlight def link redifFieldKeywords redifField
+highlight def link redifFieldLanguage redifField
+highlight def link redifFieldLastLoginDate redifField
+highlight def link redifFieldLength redifField
+highlight def link redifFieldMaintainerEmail redifField
+highlight def link redifFieldMaintainerFax redifField
+highlight def link redifFieldMaintainerName redifField
+highlight def link redifFieldMaintainerPhone redifField
+highlight def link redifFieldMonth redifField
+highlight def link redifFieldNameASCII redifField
+highlight def link redifFieldNameFirst redifField
+highlight def link redifFieldNameFull redifField
+highlight def link redifFieldNameLast redifField
+highlight def link redifFieldNameMiddle redifField
+highlight def link redifFieldNamePrefix redifField
+highlight def link redifFieldNameSuffix redifField
+highlight def link redifFieldName redifField
+highlight def link redifFieldNote redifField
+highlight def link redifFieldNotification redifField
+highlight def link redifFieldNumber redifField
+highlight def link redifFieldOrderEmail redifField
+highlight def link redifFieldOrderHomepage redifField
+highlight def link redifFieldOrderPostal redifField
+highlight def link redifFieldOrderURL redifField
+highlight def link redifFieldPages redifField
+highlight def link redifFieldPaperHandle redifField
+highlight def link redifFieldPhone redifField
+highlight def link redifFieldPostal redifField
+highlight def link redifFieldPredecessor redifField
+highlight def link redifFieldPrice redifField
+highlight def link redifFieldPrimaryDefunct redifField
+highlight def link redifFieldPrimaryEmail redifField
+highlight def link redifFieldPrimaryFax redifField
+highlight def link redifFieldPrimaryHomepage redifField
+highlight def link redifFieldPrimaryInstitution redifField
+highlight def link redifFieldPrimaryLocation redifField
+highlight def link redifFieldPrimaryName redifField
+highlight def link redifFieldPrimaryNameEnglish redifField
+highlight def link redifFieldPrimaryPhone redifField
+highlight def link redifFieldPrimaryPostal redifField
+highlight def link redifFieldProgrammingLanguage redifField
+highlight def link redifFieldProviderEmail redifField
+highlight def link redifFieldProviderFax redifField
+highlight def link redifFieldProviderHomepage redifField
+highlight def link redifFieldProviderInstitution redifField
+highlight def link redifFieldProviderLocation redifField
+highlight def link redifFieldProviderName redifField
+highlight def link redifFieldProviderNameEnglish redifField
+highlight def link redifFieldProviderPhone redifField
+highlight def link redifFieldProviderPostal redifField
+highlight def link redifFieldPublicationDate redifField
+highlight def link redifFieldPublicationStatus redifField
+highlight def link redifFieldPublicationType redifField
+highlight def link redifFieldQuaternaryEmail redifField
+highlight def link redifFieldQuaternaryFax redifField
+highlight def link redifFieldQuaternaryHomepage redifField
+highlight def link redifFieldQuaternaryInstitution redifField
+highlight def link redifFieldQuaternaryLocation redifField
+highlight def link redifFieldQuaternaryName redifField
+highlight def link redifFieldQuaternaryNameEnglish redifField
+highlight def link redifFieldQuaternaryPhone redifField
+highlight def link redifFieldQuaternaryPostal redifField
+highlight def link redifFieldRegisteredDate redifField
+highlight def link redifFieldRequires redifField
+highlight def link redifFieldRestriction redifField
+highlight def link redifFieldRevisionDate redifField
+highlight def link redifFieldSecondaryDefunct redifField
+highlight def link redifFieldSecondaryEmail redifField
+highlight def link redifFieldSecondaryFax redifField
+highlight def link redifFieldSecondaryHomepage redifField
+highlight def link redifFieldSecondaryInstitution redifField
+highlight def link redifFieldSecondaryLocation redifField
+highlight def link redifFieldSecondaryName redifField
+highlight def link redifFieldSecondaryNameEnglish redifField
+highlight def link redifFieldSecondaryPhone redifField
+highlight def link redifFieldSecondaryPostal redifField
+highlight def link redifFieldSeries redifField
+highlight def link redifFieldShortId redifField
+highlight def link redifFieldSize redifField
+highlight def link redifFieldSoftwareHandle redifField
+highlight def link redifFieldTemplateType redifField
+highlight def link redifFieldTertiaryDefunct redifField
+highlight def link redifFieldTertiaryEmail redifField
+highlight def link redifFieldTertiaryFax redifField
+highlight def link redifFieldTertiaryHomepage redifField
+highlight def link redifFieldTertiaryInstitution redifField
+highlight def link redifFieldTertiaryLocation redifField
+highlight def link redifFieldTertiaryName redifField
+highlight def link redifFieldTertiaryNameEnglish redifField
+highlight def link redifFieldTertiaryPhone redifField
+highlight def link redifFieldTertiaryPostal redifField
+highlight def link redifFieldTitle redifField
+highlight def link redifFieldTitle redifField
+highlight def link redifFieldType redifField
+highlight def link redifFieldURL redifField
+highlight def link redifFieldVersion redifField
+highlight def link redifFieldVolume redifField
+highlight def link redifFieldWorkplaceEmail redifField
+highlight def link redifFieldWorkplaceFax redifField
+highlight def link redifFieldWorkplaceHomepage redifField
+highlight def link redifFieldWorkplaceInstitution redifField
+highlight def link redifFieldWorkplaceLocation redifField
+highlight def link redifFieldWorkplaceName redifField
+highlight def link redifFieldWorkplaceNameEnglish redifField
+highlight def link redifFieldWorkplaceOrganization redifField
+highlight def link redifFieldWorkplacePhone redifField
+highlight def link redifFieldWorkplacePostal redifField
+highlight def link redifFieldYear redifField
+
+" Deprecated
+" same as Provider-*
+" nextgroup=redifArgumentProvider*
+syntax match redifFieldPublisherEmail /^Publisher-Email:/ skipwhite skipempty nextgroup=redifArgumentProviderEmail contained
+syntax match redifFieldPublisherFax /^Publisher-Fax:/ skipwhite skipempty nextgroup=redifArgumentProviderFax contained
+syntax match redifFieldPublisherHomepage /^Publisher-Homepage:/ skipwhite skipempty nextgroup=redifArgumentProviderHomepage contained
+syntax match redifFieldPublisherInstitution /^Publisher-Institution:/ skipwhite skipempty nextgroup=redifArgumentProviderInstitution contained
+syntax match redifFieldPublisherLocation /^Publisher-Location:/ skipwhite skipempty nextgroup=redifArgumentProviderLocation contained
+syntax match redifFieldPublisherName /^Publisher-Name:/ skipwhite skipempty nextgroup=redifArgumentProviderName contained
+syntax match redifFieldPublisherNameEnglish /^Publisher-Name-English:/ skipwhite skipempty nextgroup=redifArgumentProviderNameEnglish contained
+syntax match redifFieldPublisherPhone /^Publisher-Phone:/ skipwhite skipempty nextgroup=redifArgumentProviderPhone contained
+syntax match redifFieldPublisherPostal /^Publisher-Postal:/ skipwhite skipempty nextgroup=redifArgumentProviderPostal contained
+
+highlight def link redifFieldPublisherEmail redifFieldDeprecated
+highlight def link redifFieldPublisherFax redifFieldDeprecated
+highlight def link redifFieldPublisherHomepage redifFieldDeprecated
+highlight def link redifFieldPublisherInstitution redifFieldDeprecated
+highlight def link redifFieldPublisherLocation redifFieldDeprecated
+highlight def link redifFieldPublisherName redifFieldDeprecated
+highlight def link redifFieldPublisherNameEnglish redifFieldDeprecated
+highlight def link redifFieldPublisherPhone redifFieldDeprecated
+highlight def link redifFieldPublisherPostal redifFieldDeprecated
+
+" Standard arguments
+" By default, they contain all the argument until another field is started:
+" start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1
+" For arguments that must not span more than one line, use a match:
+" /\%(^\S\{-}:\)\@!\S.*/
+" AND ADD "display"
+" This is faster.
+"
+" Those arguments are not highlighted so far. They are here for future
+" extensions.
+" TODO Find more RegEx for these arguments
+" TODO Fax, Phone
+" TODO URL, Homepage
+" TODO Keywords
+" TODO Classification-JEL
+" TODO Short-Id, Author-Person, Editor-Person
+"
+" Arguments that may span several lines:
+syntax region redifArgumentAuthorWorkplaceLocation start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorWorkplacePostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorPostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorWorkplacePostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentFileFunction start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentIssue start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentJournal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentOrderPostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPrice start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPrimaryLocation start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPrimaryPostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentProviderLocation start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentProviderPostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentQuaternaryLocation start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentQuaternaryPostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentRequires start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentSecondaryLocation start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentSecondaryPostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentSize start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentTertiaryLocation start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentTertiaryPostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentVersion start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentWorkplaceLocation start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentWorkplacePhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentWorkplacePostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+
+" Arguments that may not span several lines:
+" If you are sure that these arguments cannot span several lines, change
+" them to a match:
+" /\%(^\S\{-}:\)\@!\S.*/
+" AND ADD "display" after "contained"
+" You can use this command on each line that you want to change:
+" :s+\Vregion \(\w\+\) start=/\\%(^\\S\\{-}:\\)\\@!\\S/ end=/^\\S\\{-}:/me=s-1 contained+match \1 /\\%(^\\S\\{-}:\\)\\@!\\S.*/ contained display
+syntax region redifArgumentAuthorFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorNameFirst start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorNameLast start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorPerson start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorPhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorPostal start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorWorkplaceFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorWorkplaceHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorWorkplaceName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorWorkplaceNameEnglish start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentAuthorWorkplacePhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorNameFirst start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorNameLast start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorPerson start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorPhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorWorkplaceFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorWorkplaceHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorWorkplaceLocation start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorWorkplaceName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorWorkplaceNameEnglish start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentEditorWorkplacePhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentFileURL start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentMaintainerFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentMaintainerName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentMaintainerPhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentNameFirst start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentNameFull start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentNameLast start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentNameMiddle start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentNamePrefix start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentNameSuffix start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentNumber start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentOrderHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentOrderURL start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPrimaryFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPrimaryHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPrimaryName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPrimaryNameEnglish start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentPrimaryPhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentProviderFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentProviderHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentProviderName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentProviderNameEnglish start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentProviderPhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentQuaternaryFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentQuaternaryHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentQuaternaryName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentQuaternaryNameEnglish start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentQuaternaryPhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentSecondaryFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentSecondaryHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentSecondaryName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentSecondaryNameEnglish start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentSecondaryPhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentSeries start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentShortId start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentTertiaryFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentTertiaryHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentTertiaryName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentTertiaryNameEnglish start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentTertiaryPhone start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentURL start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentWorkplaceFax start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentWorkplaceHomepage start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentWorkplaceName start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentWorkplaceNameEnglish start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+syntax region redifArgumentWorkplaceOrganization start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contained
+
+" Special arguments
+" Those arguments require special values
+" TODO Improve some RegEx
+" TODO Improve Emails
+" TODO Improve ISBN
+" TODO Improve ISSN
+" TODO Improve spell check (add words from economics.
+" expl=macroeconometrics, Schumpeterian, IS-LM, etc.)
+"
+" Template-Type
+syntax match redifArgumentTemplateType /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectTemplateType contained display
+syntax match redifCorrectTemplateType /ReDIF-\%(Paper\|Article\|Chapter\|Book\|Software\|Archive\|Series\|Institution\|Person\)/ nextgroup=redifTemplateVersionNumberContainer contained display
+syntax match redifTemplateVersionNumberContainer /.\+/ contains=redifTemplateVersionNumber contained display
+syntax match redifTemplateVersionNumber / \d\+\.\d\+/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentTemplateType redifError
+highlight def link redifCorrectTemplateType Constant
+highlight def link redifTemplateVersionNumber Number
+highlight def link redifTemplateVersionNumberContainer redifError
+
+" Handles:
+"
+" Handles of Works:
+syntax match redifArgumentHandleOfWork /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentAuthorArticle /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentAuthorBook /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentAuthorChapter /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentAuthorPaper /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentAuthorSoftware /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentEditorBook /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentEditorSeries /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentInBook /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentHasChapter /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentArticleHandle /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentBookHandle /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentChapterHandle /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentPaperHandle /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifArgumentSoftwareHandle /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfWork contained display
+syntax match redifCorrectHandleOfWork /RePEc:\a\a\a:\%(_\@!\w\)\{6}:\S\+/ contains=redifForbiddenCharactersInHandle,redifBestPracticeInHandle nextgroup=redifWrongLineEnding contained display
+" TODO Are those characters really forbidden???
+syntax match redifForbiddenCharactersInHandle /[\/*?"<>|]/ contained display
+syntax match redifBestPracticeInHandle /\<\%([vi]:[1-9]\d*\|y:[1-9]\d\{3}\|p:[1-9]\d*-[1-9]\d*\|i:\%(jan\|feb\|mar\|apr\|may\|jun\|jul\|aug\|sep\|oct\|nov\|dec\|spr\|sum\|aut\|win\|spe\|Q[1-4]\|\d\d-\d\d\)\|Q:[1-4]\)\>/ contained display
+
+highlight def link redifArgumentHandleOfWork redifError
+highlight def link redifArgumentAuthorArticle redifError
+highlight def link redifArgumentAuthorBook redifError
+highlight def link redifArgumentAuthorChapter redifError
+highlight def link redifArgumentAuthorPaper redifError
+highlight def link redifArgumentAuthorSoftware redifError
+highlight def link redifArgumentEditorBook redifError
+highlight def link redifArgumentEditorSeries redifError
+highlight def link redifArgumentInBook redifError
+highlight def link redifArgumentHasChapter redifError
+highlight def link redifArgumentArticleHandle redifError
+highlight def link redifArgumentBookHandle redifError
+highlight def link redifArgumentChapterHandle redifError
+highlight def link redifArgumentPaperHandle redifError
+highlight def link redifArgumentSoftwareHandle redifError
+highlight def link redifForbiddenCharactersInHandle redifError
+highlight def link redifBestPracticeInHandle redifSpecial
+
+" Handles of Series:
+syntax match redifArgumentHandleOfSeries /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfSeries contained display
+syntax match redifArgumentFollowup /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfSeries contained display
+syntax match redifArgumentPredecessor /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfSeries contained display
+syntax match redifCorrectHandleOfSeries /RePEc:\a\a\a:\%(_\@!\w\)\{6}/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentHandleOfSeries redifError
+highlight def link redifArgumentFollowup redifError
+highlight def link redifArgumentPredecessor redifError
+
+" Handles of Archives:
+syntax match redifArgumentHandleOfArchive /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfArchive contained display
+syntax match redifCorrectHandleOfArchive /RePEc:\a\a\a/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentHandleOfArchive redifError
+
+" Handles of Person:
+syntax match redifArgumentHandleOfPerson /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfPerson contained display
+syntax match redifCorrectHandleOfPerson /\%(\%(:\@!\S\)\{-}:\)\{2}[1-9]\d\{3}\%(-02\%(-[12]\d\|-0[1-9]\)\|-\%(0[469]\|11\)\%(-30\|-[12]\d\|-0[1-9]\)\|-\%(0[13578]\|1[02]\)\%(-3[01]\|-[12]\d\|-0[1-9]\)\):\S\+/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentHandleOfPerson redifError
+
+" Handles of Institution:
+syntax match redifArgumentAuthorWorkplaceInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentEditorWorkplaceInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentPrimaryInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentProviderInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentPublisherInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentQuaternaryInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentSecondaryInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentTertiaryInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentWorkplaceInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentHandleOfInstitution /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentPrimaryDefunct /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentSecondaryDefunct /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+syntax match redifArgumentTertiaryDefunct /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectHandleOfInstitution contained display
+" TODO Are digits authorized? Apparently not.
+" Country codes:
+" http://www.iso.org/iso/country_codes/iso_3166_code_lists/country_names_and_code_elements.htm
+syntax match redifCorrectHandleOfInstitution /RePEc:\a\a\a:\a\{5}\(ea\|af\|ax\|al\|dz\|as\|ad\|ao\|ai\|aq\|ag\|ar\|am\|aw\|au\|at\|az\|bs\|bh\|bd\|bb\|by\|be\|bz\|bj\|bm\|bt\|bo\|bq\|ba\|bw\|bv\|br\|io\|bn\|bg\|bf\|bi\|kh\|cm\|ca\|cv\|ky\|cf\|td\|cl\|cn\|cx\|cc\|co\|km\|cg\|cd\|ck\|cr\|ci\|hr\|cu\|cw\|cy\|cz\|dk\|dj\|dm\|do\|ec\|eg\|sv\|gq\|er\|ee\|et\|fk\|fo\|fj\|fi\|fr\|gf\|pf\|tf\|ga\|gm\|ge\|de\|gh\|gi\|gr\|gl\|gd\|gp\|gu\|gt\|gg\|gn\|gw\|gy\|ht\|hm\|va\|hn\|hk\|hu\|is\|in\|id\|ir\|iq\|ie\|im\|il\|it\|jm\|jp\|je\|jo\|kz\|ke\|ki\|kp\|kr\|kw\|kg\|la\|lv\|lb\|ls\|lr\|ly\|li\|lt\|lu\|mo\|mk\|mg\|mw\|my\|mv\|ml\|mt\|mh\|mq\|mr\|mu\|yt\|mx\|fm\|md\|mc\|mn\|me\|ms\|ma\|mz\|mm\|na\|nr\|np\|nl\|nc\|nz\|ni\|ne\|ng\|nu\|nf\|mp\|no\|om\|pk\|pw\|ps\|pa\|pg\|py\|pe\|ph\|pn\|pl\|pt\|pr\|qa\|re\|ro\|ru\|rw\|bl\|sh\|kn\|lc\|mf\|pm\|vc\|ws\|sm\|st\|sa\|sn\|rs\|sc\|sl\|sg\|sx\|sk\|si\|sb\|so\|za\|gs\|ss\|es\|lk\|sd\|sr\|sj\|sz\|se\|ch\|sy\|tw\|tj\|tz\|th\|tl\|tg\|tk\|to\|tt\|tn\|tr\|tm\|tc\|tv\|ug\|ua\|ae\|gb\|us\|um\|uy\|uz\|vu\|ve\|vn\|vg\|vi\|wf\|eh\|ye\|zm\|zw\)/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentHandleOfInstitution redifError
+highlight def link redifArgumentPrimaryDefunct redifError
+highlight def link redifArgumentSecondaryDefunct redifError
+highlight def link redifArgumentTertiaryDefunct redifError
+
+" Emails:
+syntax match redifArgumentAuthorEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentAuthorWorkplaceEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentContactEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentEditorEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentEditorWorkplaceEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentMaintainerEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentOrderEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentPrimaryEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentProviderEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentPublisherEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentQuaternaryEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentSecondaryEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentTertiaryEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifArgumentWorkplaceEmail /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectEmail contained display
+syntax match redifCorrectEmail /\%(@\@!\S\)\+@\%(@\@!\S\)\+/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentAuthorEmail redifError
+highlight def link redifArgumentAuthorWorkplaceEmail redifError
+highlight def link redifArgumentContactEmail redifError
+highlight def link redifArgumentEditorEmail redifError
+highlight def link redifArgumentEditorWorkplaceEmail redifError
+highlight def link redifArgumentEmail redifError
+highlight def link redifArgumentMaintainerEmail redifError
+highlight def link redifArgumentOrderEmail redifError
+highlight def link redifArgumentPrimaryEmail redifError
+highlight def link redifArgumentProviderEmail redifError
+highlight def link redifArgumentPublisherEmail redifError
+highlight def link redifArgumentQuaternaryEmail redifError
+highlight def link redifArgumentSecondaryEmail redifError
+highlight def link redifArgumentTertiaryEmail redifError
+highlight def link redifArgumentWorkplaceEmail redifError
+
+" Language
+" Source: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+syntax match redifArgumentLanguage /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectLanguage contained display
+syntax match redifCorrectLanguage /\<\(aa\|ab\|af\|ak\|als\|am\|an\|ang\|ar\|arc\|as\|ast\|av\|ay\|az\|ba\|bar\|bat-smg\|bcl\|be\|be-x-old\|bg\|bh\|bi\|bm\|bn\|bo\|bpy\|br\|bs\|bug\|bxr\|ca\|ce\|ceb\|ch\|cho\|chr\|chy\|co\|cr\|cs\|csb\|cu\|cv\|cy\|da\|de\|diq\|dsb\|dv\|dz\|ee\|el\|en\|eo\|es\|et\|eu\|ext\|fa\|ff\|fi\|fiu-vro\|fj\|fo\|fr\|frp\|fur\|fy\|ga\|gd\|gil\|gl\|gn\|got\|gu\|gv\|ha\|haw\|he\|hi\|ho\|hr\|ht\|hu\|hy\|hz\|ia\|id\|ie\|ig\|ii\|ik\|ilo\|io\|is\|it\|iu\|ja\|jbo\|jv\|ka\|kg\|ki\|kj\|kk\|kl\|km\|kn\|khw\|ko\|kr\|ks\|ksh\|ku\|kv\|kw\|ky\|la\|lad\|lan\|lb\|lg\|li\|lij\|lmo\|ln\|lo\|lt\|lv\|map-bms\|mg\|mh\|mi\|mk\|ml\|mn\|mo\|mr\|ms\|mt\|mus\|my\|na\|nah\|nap\|nd\|nds\|nds-nl\|ne\|new\|ng\|nl\|nn\|no\|nr\|nso\|nrm\|nv\|ny\|oc\|oj\|om\|or\|os\|pa\|pag\|pam\|pap\|pdc\|pi\|pih\|pl\|pms\|ps\|pt\|qu\|rm\|rmy\|rn\|ro\|roa-rup\|ru\|rw\|sa\|sc\|scn\|sco\|sd\|se\|sg\|sh\|si\|simple\|sk\|sl\|sm\|sn\|so\|sq\|sr\|ss\|st\|su\|sv\|sw\|ta\|te\|tet\|tg\|th\|ti\|tk\|tl\|tlh\|tn\|to\|tpi\|tr\|ts\|tt\|tum\|tw\|ty\|udm\|ug\|uk\|ur\|uz\|ve\|vi\|vec\|vls\|vo\|wa\|war\|wo\|xal\|xh\|yi\|yo\|za\|zh\|zh-min-nan\|zh-yue\|zu\)\>/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentLanguage redifError
+highlight def link redifCorrectLanguage redifSpecial
+
+" Length
+" Based on the example in the documentation. But apparently any field is
+" possible
+syntax region redifArgumentLength start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=redifGoodLength contained
+syntax match redifGoodLength /1 page\|[1-9]\d*\%( pages\)\=/ contained display
+
+highlight def link redifGoodLength redifSpecial
+
+" Publication-Type
+syntax match redifArgumentPublicationType /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectPublicationType contained display
+syntax match redifCorrectPublicationType /\<\(journal article\|book\|book chapter\|working paper\|conference paper\|report\|other\)\>/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentPublicationType redifError
+highlight def link redifCorrectPublicationType redifSpecial
+
+" Publication-Status
+syntax region redifArgumentPublicationStatus start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=redifSpecialPublicationStatus contained
+syntax match redifSpecialPublicationStatus /published\|forthcoming/ nextgroup=redifCorrectPublicationStatus contained display
+syntax region redifCorrectPublicationStatus start=/./ end=/^\S\{-}:/me=s-1 contained
+
+highlight def link redifArgumentPublicationStatus redifError
+highlight def link redifSpecialPublicationStatus redifSpecial
+
+" Month
+" TODO Are numbers also allowed?
+syntax match redifArgumentMonth /\%(^\S\{-}:\)\@!\S.*/ contains=redifGoodMonth contained display
+syntax match redifGoodMonth /\<\(Jan\%(uary\)\=\|Feb\%(ruary\)\=\|Mar\%(ch\)\=\|Apr\%(il\)\=\|May\|June\=\|July\=\|Aug\%(ust\)\=\|Sep\%(tember\)\=\|Oct\%(ober\)\=\|Nov\%(ember\)\=\|Dec\%(ember\)\=\)\>/ contained display
+
+highlight def link redifGoodMonth redifSpecial
+
+" Integers: Volume, Chapter
+syntax match redifArgumentVolume /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectInteger contained display
+syntax match redifArgumentChapter /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectInteger contained display
+syntax match redifCorrectInteger /[1-9]\d*/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentVolume redifError
+highlight def link redifArgumentChapter redifError
+
+" Year
+syntax match redifArgumentYear /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectYear contained display
+syntax match redifCorrectYear /[1-9]\d\{3}/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentYear redifError
+
+" Edition
+" Based on the example in the documentation.
+syntax match redifArgumentEdition /\%(^\S\{-}:\)\@!\S.*/ contains=redifGoodEdition contained display
+syntax match redifGoodEdition /1st\|2nd\|3rd\|[4-9]th\|[1-9]\d*\%(1st\|2nd\|3rd\|[4-9]th\)\|[1-9]\d*/ contained display
+
+highlight def link redifGoodEdition redifSpecial
+
+" ISBN
+syntax match redifArgumentISBN /\%(^\S\{-}:\)\@!\S.*/ contains=redifGoodISBN contained display
+syntax match redifGoodISBN /\d[0-9-]\{8,15}\d/ contained display
+
+highlight def link redifGoodISBN redifSpecial
+
+" ISSN
+syntax match redifArgumentISSN /\%(^\S\{-}:\)\@!\S.*/ contains=redifGoodISSN contained display
+syntax match redifGoodISSN /\d\{4}-\d\{3}[0-9X]/ contained display
+
+highlight def link redifGoodISSN redifSpecial
+
+" File-Size
+" Based on the example in the documentation.
+syntax region redifArgumentFileSize start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=redifGoodSize contained
+syntax match redifGoodSize /kb\|bytes/ contained display
+
+highlight def link redifGoodSize redifSpecial
+
+" Type
+syntax match redifArgumentType /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectType contained display
+syntax match redifCorrectType /ReDIF-Paper\|ReDIF-Software\|ReDIF-Article\|ReDIF-Chapter\|ReDIF-Book/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentType redifError
+highlight def link redifCorrectType redifSpecial
+
+" Dates: Publication-Date, Creation-Date, Revision-Date,
+" Last-Login-Date, Registration-Date
+syntax match redifArgumentCreationDate /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectDate contained display
+syntax match redifArgumentLastLoginDate /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectDate contained display
+syntax match redifArgumentPublicationDate /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectDate contained display
+syntax match redifArgumentRegisteredDate /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectDate contained display
+syntax match redifArgumentRevisionDate /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectDate contained display
+syntax match redifCorrectDate /[1-9]\d\{3}\%(-02\%(-[12]\d\|-0[1-9]\)\=\|-\%(0[469]\|11\)\%(-30\|-[12]\d\|-0[1-9]\)\=\|-\%(0[13578]\|1[02]\)\%(-3[01]\|-[12]\d\|-0[1-9]\)\=\)\=/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentCreationDate redifError
+highlight def link redifArgumentLastLoginDate redifError
+highlight def link redifArgumentPublicationDate redifError
+highlight def link redifArgumentRegisteredDate redifError
+highlight def link redifArgumentRevisionDate redifError
+
+" Classification-JEL
+syntax match redifArgumentClassificationJEL /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectJEL contained display
+syntax match redifCorrectJEL /\<\%(\u\d\{,2}[,; \t]\s*\)*\u\d\{,2}/ contains=redifSpecialJEL nextgroup=redifWrongLineEnding contained display
+syntax match redifSpecialJEL /\<\u\d\{,2}/ contained display
+
+highlight def link redifArgumentClassificationJEL redifError
+highlight def link redifSpecialJEL redifSpecial
+
+" Pages
+syntax match redifArgumentPages /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectPages contained display
+syntax match redifCorrectPages /[1-9]\d*-[1-9]\d*/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifArgumentPages redifError
+
+" Name-ASCII
+syntax match redifArgumentNameASCII /\%(^\S\{-}:\)\@!\S.*/ contains=redifCorrectNameASCII contained display
+syntax match redifCorrectNameASCII /[ -~]/ contained display
+
+highlight def link redifArgumentNameASCII redifError
+
+" Programming-Language
+syntax match redifArgumentProgrammingLanguage /\%(^\S\{-}:\)\@!\S.*/ contains=redifGoodProgrammingLanguage contained display
+syntax match redifGoodProgrammingLanguage /\<c++\|\<\%(c\|dos executable\|executable\|fortran\|gauss\|gretl\|java\|mathematica\|matlab\|octave\|ox\|perl\|python\|rats\|r\|shazam\|s-plus\|stata\|tsp international\)\>/ nextgroup=redifWrongLineEnding contained display
+
+highlight def link redifGoodProgrammingLanguage redifSpecial
+
+" File-Format
+" TODO The link in the documentation that gives the list of possible formats is broken.
+" ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/media-types
+" These are based on the examples in the documentation.
+syntax match redifArgumentFileFormat /\%(^\S\{-}:\)\@!\S.*/ contains=redifGoodFormat contained display
+syntax match redifGoodFormat "\a\+/[[:alpha:]+-]\+" nextgroup=redifWrongLineEnding contains=redifSpecialFormat contained display
+syntax match redifSpecialFormat "application/atom+xml\|application/ecmascript\|application/EDI-X12\|application/EDIFACT\|application/json\|application/javascript\|application/octet-stream\|application/ogg\|application/pdf\|application/postscript\|application/rdf+xml\|application/rss+xml\|application/soap+xml\|application/font-woff\|application/xhtml+xml\|application/xml\|application/xml-dtd\|application/xop+xml\|application/zip\|application/gzip\|audio/basic\|audio/L24\|audio/mp4\|audio/mpeg\|audio/ogg\|audio/vorbis\|audio/vnd.rn-realaudio\|audio/vnd.wave\|audio/webm\|image/gif\|image/jpeg\|image/pjpeg\|image/png\|image/svg+xml\|image/tiff\|image/vnd.microsoft.icon\|message/http\|message/imdn+xml\|message/partial\|message/rfc822\|model/example\|model/iges\|model/mesh\|model/vrml\|model/x3d+binary\|model/x3d+vrml\|model/x3d+xml\|multipart/mixed\|multipart/alternative\|multipart/related\|multipart/form-data\|multipart/signed\|multipart/encrypted\|text/cmd\|text/css\|text/csv\|text/html\|text/javascript\|text/plain\|text/vcard\|text/xml\|video/mpeg\|video/mp4\|video/ogg\|video/quicktime\|video/webm\|video/x-matroska\|video/x-ms-wmv\|video/x-flv" contained display
+
+highlight def link redifSpecialFormat redifSpecial
+highlight def link redifArgumentFileFormat redifError
+
+" Keywords
+" Spell checked
+syntax match redifArgumentKeywords /\%(^\S\{-}:\)\@!\S.*/ contains=@Spell,redifKeywordsSemicolon contained
+syntax match redifKeywordsSemicolon /;/ contained
+
+highlight def link redifKeywordsSemicolon redifSpecial
+
+" Other spell-checked arguments
+" Very useful when copy-pasting abstracts that may contain hyphens or
+" ligatures.
+syntax region redifArgumentAbstract start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=@Spell contained
+syntax region redifArgumentAvailability start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=@Spell contained
+syntax region redifArgumentBookTitle start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=@Spell contained
+syntax region redifArgumentDescription start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=@Spell contained
+syntax region redifArgumentFileRestriction start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=@Spell contained
+syntax region redifArgumentNote start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=@Spell contained
+syntax region redifArgumentNotification start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=@Spell contained
+syntax region redifArgumentRestriction start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=@Spell contained
+syntax region redifArgumentTitle start=/\%(^\S\{-}:\)\@!\S/ end=/^\S\{-}:/me=s-1 contains=@Spell contained
+
+" Wrong line ending
+syntax match redifWrongLineEnding /.\+/ contained display
+
+highlight def link redifWrongLineEnding redifError
+
+" Final highlight
+highlight def link redifComment Comment
+highlight def link redifError Error
+highlight def link redifField Identifier
+highlight def link redifFieldDeprecated Identifier
+highlight def link redifSpecial Special
+" For deprecated fields:
+highlight redifFieldDeprecated term=undercurl cterm=undercurl gui=undercurl guisp=DarkGrey
+
+" Sync: The template-type (ReDIF-Paper, ReDIF-Archive, etc.) influences which
+" fields can follow. Thus sync must search backwards for it.
+"
+" I would like to simply ask VIM to search backward for the first occurrence of
+" /^Template-Type:/, but it does not seem to be possible, so I have to start
+" from the beginning of the file... This might slow down a lot for files that
+" contain a lot of Template-Type statements.
+syntax sync fromstart
+
+" The problem with syntax sync match (tried below), it is that, for example,
+" it cannot realize when it is inside a Author-Name cluster, which is inside a
+" Template-Type template...
+"
+" TODO Is this linecont pattern really useful? It seems to work anyway...
+"syntax sync linecont /^\(Template-Type:\)\=\s*$/
+" TODO This sync is surprising... It seems to work on several lines even
+" though I replaced \_s* by \s*, even without the linecont pattern...
+"syntax sync match redifSyncForTemplatePaper groupthere redifRegionTemplatePaper /^Template-Type:\s*ReDIF-Paper \d\+\.\d\+/
+"syntax sync match redifSyncForTemplateArticle groupthere redifRegionTemplateArticle /^Template-Type:\s*ReDIF-Article \d\+\.\d\+/
+"syntax sync match redifSyncForTemplateChapter groupthere redifRegionTemplateChapter /^Template-Type:\s*ReDIF-Chapter \d\+\.\d\+/
+"syntax sync match redifSyncForTemplateBook groupthere redifRegionTemplateBook /^Template-Type:\s*ReDIF-Book \d\+\.\d\+/
+"syntax sync match redifSyncForTemplateSoftware groupthere redifRegionTemplateSoftware /^Template-Type:\s*ReDIF-Software \d\+\.\d\+/
+"syntax sync match redifSyncForTemplateArchive groupthere redifRegionTemplateArchive /^Template-Type:\s*ReDIF-Archive \d\+\.\d\+/
+"syntax sync match redifSyncForTemplateSeries groupthere redifRegionTemplateSeries /^Template-Type:\s*ReDIF-Series \d\+\.\d\+/
+"syntax sync match redifSyncForTemplateInstitution groupthere redifRegionTemplateInstitution /^Template-Type:\s*ReDIF-Institution \d\+\.\d\+/
+"syntax sync match redifSyncForTemplatePerson groupthere redifRegionTemplatePerson /^Template-Type:\s*ReDIF-Person \d\+\.\d\+/
+
+" I do not really know how sync linebreaks works, but it helps when making
+" changes on the argument when this argument is not on the same line than its
+" field. I just assume that people won't leave more than one line of
+" whitespace between fields and arguments (which is already very unlikely)
+" hence the value of 2.
+syntax sync linebreaks=2
+
+" Since folding is defined by the syntax, set foldmethod to syntax.
+set foldmethod=syntax
+
+" Set "b:current_syntax" to the name of the syntax at the end:
+let b:current_syntax="redif"
diff --git a/runtime/syntax/registry.vim b/runtime/syntax/registry.vim
new file mode 100644
index 0000000..67b5e49
--- /dev/null
+++ b/runtime/syntax/registry.vim
@@ -0,0 +1,103 @@
+" Vim syntax file
+" Language: Windows Registry export with regedit (*.reg)
+" Maintainer: Dominique Stéphan (dominique@mggen.com)
+" URL: http://www.mggen.com/vim/syntax/registry.zip (doesn't work)
+" Last change: 2014 Oct 31
+" Included patch from Alexander A. Ulitin
+
+" clear any unwanted syntax defs
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" shut case off
+syn case ignore
+
+" Head of regedit .reg files, it's REGEDIT4 on Win9#/NT
+syn match registryHead "^REGEDIT[0-9]*\s*$\|^Windows Registry Editor Version \d*\.\d*\s*$"
+
+" Comment
+syn match registryComment "^;.*$"
+
+" Registry Key constant
+syn keyword registryHKEY HKEY_LOCAL_MACHINE HKEY_CLASSES_ROOT HKEY_CURRENT_USER
+syn keyword registryHKEY HKEY_USERS HKEY_CURRENT_CONFIG HKEY_DYN_DATA
+" Registry Key shortcuts
+syn keyword registryHKEY HKLM HKCR HKCU HKU HKCC HKDD
+
+" Some values often found in the registry
+" GUID (Global Unique IDentifier)
+syn match registryGUID "{[0-9A-Fa-f]\{8}\-[0-9A-Fa-f]\{4}\-[0-9A-Fa-f]\{4}\-[0-9A-Fa-f]\{4}\-[0-9A-Fa-f]\{12}}" contains=registrySpecial
+
+" Disk
+" syn match registryDisk "[a-zA-Z]:\\\\"
+
+" Special and Separator characters
+syn match registrySpecial "\\"
+syn match registrySpecial "\\\\"
+syn match registrySpecial "\\\""
+syn match registrySpecial "\."
+syn match registrySpecial ","
+syn match registrySpecial "\/"
+syn match registrySpecial ":"
+syn match registrySpecial "-"
+
+" String
+syn match registryString "\".*\"" contains=registryGUID,registrySpecial
+
+" Path
+syn region registryPath start="\[" end="\]" contains=registryHKEY,registryGUID,registrySpecial
+
+" Path to remove
+" like preceding path but with a "-" at begin
+syn region registryRemove start="\[\-" end="\]" contains=registryHKEY,registryGUID,registrySpecial
+
+" Subkey
+syn match registrySubKey "^\".*\"="
+" Default value
+syn match registrySubKey "^@="
+
+" Numbers
+
+" Hex or Binary
+" The format can be precised between () :
+" 0 REG_NONE
+" 1 REG_SZ
+" 2 REG_EXPAND_SZ
+" 3 REG_BINARY
+" 4 REG_DWORD, REG_DWORD_LITTLE_ENDIAN
+" 5 REG_DWORD_BIG_ENDIAN
+" 6 REG_LINK
+" 7 REG_MULTI_SZ
+" 8 REG_RESOURCE_LIST
+" 9 REG_FULL_RESOURCE_DESCRIPTOR
+" 10 REG_RESOURCE_REQUIREMENTS_LIST
+" The value can take several lines, if \ ends the line
+" The limit to 999 matches is arbitrary, it avoids Vim crashing on a very long
+" line of hex values that ends in a comma.
+"syn match registryHex "hex\(([0-9]\{0,2})\)\=:\([0-9a-fA-F]\{2},\)\{0,999}\([0-9a-fA-F]\{2}\|\\\)$" contains=registrySpecial
+syn match registryHex "hex\(([0-9]\{0,2})\)\=:\([0-9a-fA-F]\{2},\)*\([0-9a-fA-F]\{2}\|\\\)$" contains=registrySpecial
+syn match registryHex "^\s*\([0-9a-fA-F]\{2},\)\{0,999}\([0-9a-fA-F]\{2}\|\\\)$" contains=registrySpecial
+" Dword (32 bits)
+syn match registryDword "dword:[0-9a-fA-F]\{8}$" contains=registrySpecial
+
+
+" The default methods for highlighting. Can be overridden later
+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"
+
+" vim:ts=8
diff --git a/runtime/syntax/rego.vim b/runtime/syntax/rego.vim
new file mode 100644
index 0000000..bc82030
--- /dev/null
+++ b/runtime/syntax/rego.vim
@@ -0,0 +1,120 @@
+" Vim syntax file
+" Language: rego policy language
+" Maintainer: Matt Dunford (zenmatic@gmail.com)
+" URL: https://github.com/zenmatic/vim-syntax-rego
+" Last Change: 2022 Dec 4
+
+" https://www.openpolicyagent.org/docs/latest/policy-language/
+
+" quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+syn keyword regoDirective package import allow deny
+syn keyword regoKeywords as default else every false if import package not null true with some in print
+
+syn keyword regoFuncAggregates count sum product max min sort all any
+syn match regoFuncArrays "\<array\.\(concat\|slice\|reverse\)\>"
+syn keyword regoFuncSets intersection union
+
+syn keyword regoFuncStrings concat /\<contains\>/ endswith format_int indexof indexof_n lower replace split sprintf startswith substring trim trim_left trim_prefix trim_right trim_suffix trim_space upper
+syn match regoFuncStrings2 "\<strings\.\(replace_n\|reverse\|any_prefix_match\|any_suffix_match\)\>"
+syn match regoFuncStrings3 "\<contains\>"
+
+syn keyword regoFuncRegex re_match
+syn match regoFuncRegex2 "\<regex\.\(is_valid\|split\|globs_match\|template_match\|find_n\|find_all_string_submatch_n\|replace\)\>"
+
+syn match regoFuncUuid "\<uuid.rfc4122\>"
+syn match regoFuncBits "\<bits\.\(or\|and\|negate\|xor\|lsh\|rsh\)\>"
+syn match regoFuncObject "\<object\.\(get\|remove\|subset\|union\|union_n\|filter\)\>"
+syn match regoFuncGlob "\<glob\.\(match\|quote_meta\)\>"
+syn match regoFuncUnits "\<units\.parse\(_bytes\)\=\>"
+syn keyword regoFuncTypes is_number is_string is_boolean is_array is_set is_object is_null type_name
+syn match regoFuncEncoding1 "\<base64\.\(encode\|decode\|is_valid\)\>"
+syn match regoFuncEncoding2 "\<base64url\.\(encode\(_no_pad\)\=\|decode\)\>"
+syn match regoFuncEncoding3 "\<urlquery\.\(encode\|decode\|\(en\|de\)code_object\)\>"
+syn match regoFuncEncoding4 "\<\(json\|yaml\)\.\(is_valid\|marshal\|unmarshal\)\>"
+syn match regoFuncEncoding5 "\<json\.\(filter\|patch\|remove\)\>"
+syn match regoFuncTokenSigning "\<io\.jwt\.\(encode_sign_raw\|encode_sign\)\>"
+syn match regoFuncTokenVerification1 "\<io\.jwt\.\(decode\|decode_verify\)\>"
+syn match regoFuncTokenVerification2 "\<io\.jwt\.verify_\(rs\|ps\|es\|hs\)\(256\|384\|512\)\>"
+syn match regoFuncTime "\<time\.\(now_ns\|parse_ns\|parse_rfc3339_ns\|parse_duration_ns\|date\|clock\|weekday\|diff\|add_date\)\>"
+syn match regoFuncCryptography "\<crypto\.x509\.\(parse_certificates\|parse_certificate_request\|parse_and_verify_certificates\|parse_rsa_private_key\)\>"
+syn match regoFuncCryptography "\<crypto\.\(md5\|sha1\|sha256\)"
+syn match regoFuncCryptography "\<crypto\.hmac\.\(md5\|sha1\|sha256\|sha512\)"
+syn keyword regoFuncGraphs walk
+syn match regoFuncGraphs2 "\<graph\.reachable\(_paths\)\=\>"
+syn match regoFuncGraphQl "\<graphql\.\(\(schema_\)\=is_valid\|parse\(_\(and_verify\|query\|schema\)\)\=\)\>"
+syn match regoFuncHttp "\<http\.send\>"
+syn match regoFuncNet "\<net\.\(cidr_merge\|cidr_contains\|cidr_contains_matches\|cidr_intersects\|cidr_expand\|lookup_ip_addr\|cidr_is_valid\)\>"
+syn match regoFuncRego "\<rego\.\(parse_module\|metadata\.\(rule\|chain\)\)\>"
+syn match regoFuncOpa "\<opa\.runtime\>"
+syn keyword regoFuncDebugging trace
+syn match regoFuncRand "\<rand\.intn\>"
+
+syn match regoFuncNumbers "\<numbers\.\(range\|intn\)\>"
+syn keyword regoFuncNumbers round ceil floor abs
+
+syn match regoFuncSemver "\<semver\.\(is_valid\|compare\)\>"
+syn keyword regoFuncConversions to_number
+syn match regoFuncHex "\<hex\.\(encode\|decode\)\>"
+
+hi def link regoFuncUuid Statement
+hi def link regoFuncBits Statement
+hi def link regoDirective Statement
+hi def link regoKeywords Statement
+hi def link regoFuncAggregates Statement
+hi def link regoFuncArrays Statement
+hi def link regoFuncSets Statement
+hi def link regoFuncStrings Statement
+hi def link regoFuncStrings2 Statement
+hi def link regoFuncStrings3 Statement
+hi def link regoFuncRegex Statement
+hi def link regoFuncRegex2 Statement
+hi def link regoFuncGlob Statement
+hi def link regoFuncUnits Statement
+hi def link regoFuncTypes Statement
+hi def link regoFuncEncoding1 Statement
+hi def link regoFuncEncoding2 Statement
+hi def link regoFuncEncoding3 Statement
+hi def link regoFuncEncoding4 Statement
+hi def link regoFuncEncoding5 Statement
+hi def link regoFuncTokenSigning Statement
+hi def link regoFuncTokenVerification1 Statement
+hi def link regoFuncTokenVerification2 Statement
+hi def link regoFuncTime Statement
+hi def link regoFuncCryptography Statement
+hi def link regoFuncGraphs Statement
+hi def link regoFuncGraphQl Statement
+hi def link regoFuncGraphs2 Statement
+hi def link regoFuncHttp Statement
+hi def link regoFuncNet Statement
+hi def link regoFuncRego Statement
+hi def link regoFuncOpa Statement
+hi def link regoFuncDebugging Statement
+hi def link regoFuncObject Statement
+hi def link regoFuncNumbers Statement
+hi def link regoFuncSemver Statement
+hi def link regoFuncConversions Statement
+hi def link regoFuncHex Statement
+hi def link regoFuncRand Statement
+
+" https://www.openpolicyagent.org/docs/latest/policy-language/#strings
+syn region regoString start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn region regoRawString start=+`+ end=+`+
+
+hi def link regoString String
+hi def link regoRawString String
+
+" Comments; their contents
+syn keyword regoTodo contained TODO FIXME XXX BUG
+syn cluster regoCommentGroup contains=regoTodo
+syn region regoComment start="#" end="$" contains=@regoCommentGroup,@Spell
+
+hi def link regoComment Comment
+hi def link regoTodo Todo
+
+let b:current_syntax = 'rego'
diff --git a/runtime/syntax/remind.vim b/runtime/syntax/remind.vim
new file mode 100644
index 0000000..9e7ff22
--- /dev/null
+++ b/runtime/syntax/remind.vim
@@ -0,0 +1,73 @@
+" Vim syntax file
+" Language: Remind
+" Maintainer: Davide Alberani <da@erlug.linux.it>
+" Last Change: 02 Nov 2015
+" Version: 0.7
+" URL: http://ismito.it/vim/syntax/remind.vim
+"
+" Remind is a sophisticated calendar and alarm program.
+" You can download remind from:
+" https://www.roaringpenguin.com/products/remind
+"
+" Changelog
+" version 0.7: updated email and link
+" version 0.6: added THROUGH keyword (courtesy of Ben Orchard)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" shut case off.
+syn case ignore
+
+syn keyword remindCommands REM OMIT SET FSET UNSET
+syn keyword remindExpiry UNTIL FROM SCANFROM SCAN WARN SCHED THROUGH
+syn keyword remindTag PRIORITY TAG
+syn keyword remindTimed AT DURATION
+syn keyword remindMove ONCE SKIP BEFORE AFTER
+syn keyword remindSpecial INCLUDE INC BANNER PUSH-OMIT-CONTEXT PUSH CLEAR-OMIT-CONTEXT CLEAR POP-OMIT-CONTEXT POP COLOR
+syn keyword remindRun MSG MSF RUN CAL SATISFY SPECIAL PS PSFILE SHADE MOON
+syn keyword remindConditional IF ELSE ENDIF IFTRIG
+syn keyword remindDebug DEBUG DUMPVARS DUMP ERRMSG FLUSH PRESERVE
+syn match remindComment "#.*$"
+syn region remindString start=+'+ end=+'+ skip=+\\\\\|\\'+ oneline
+syn region remindString start=+"+ end=+"+ skip=+\\\\\|\\"+ oneline
+syn match remindVar "\$[_a-zA-Z][_a-zA-Z0-9]*"
+syn match remindSubst "%[^ ]"
+syn match remindAdvanceNumber "\(\*\|+\|-\|++\|--\)[0-9]\+"
+" XXX: use different separators for dates and times?
+syn match remindDateSeparators "[/:@\.-]" contained
+syn match remindTimes "[0-9]\{1,2}[:\.][0-9]\{1,2}" contains=remindDateSeparators
+" XXX: why not match only valid dates? Ok, checking for 'Feb the 30' would
+" be impossible, but at least check for valid months and times.
+syn match remindDates "'[0-9]\{4}[/-][0-9]\{1,2}[/-][0-9]\{1,2}\(@[0-9]\{1,2}[:\.][0-9]\{1,2}\)\?'" contains=remindDateSeparators
+" This will match trailing whitespaces that seem to break rem2ps.
+" Courtesy of Michael Dunn.
+syn match remindWarning display excludenl "\S\s\+$"ms=s+1
+
+
+
+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
+
+
+let b:current_syntax = "remind"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/resolv.vim b/runtime/syntax/resolv.vim
new file mode 100644
index 0000000..9a2dec5
--- /dev/null
+++ b/runtime/syntax/resolv.vim
@@ -0,0 +1,119 @@
+" Vim syntax file
+" Language: resolver configuration file
+" Maintainer: Radu Dineiu <radu.dineiu@gmail.com>
+" URL: https://raw.github.com/rid9/vim-resolv/master/resolv.vim
+" Last Change: 2020 Mar 10
+" Version: 1.4
+"
+" Credits:
+" David Necas (Yeti) <yeti@physics.muni.cz>
+" Stefano Zacchiroli <zack@debian.org>
+" DJ Lucas <dj@linuxfromscratch.org>
+"
+" Changelog:
+" - 1.4: Added IPv6 support for sortlist.
+" - 1.3: Added IPv6 support for IPv4 dot-decimal notation.
+" - 1.2: Added new options.
+" - 1.1: Added IPv6 support.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Errors, comments and operators
+syn match resolvError /./
+syn match resolvComment /\s*[#;].*$/
+syn match resolvOperator /[\/:]/ contained
+
+" IP
+syn cluster resolvIPCluster contains=resolvIPError,resolvIPSpecial
+syn match resolvIPError /\%(\d\{4,}\|25[6-9]\|2[6-9]\d\|[3-9]\d\{2}\)[\.0-9]*/ contained
+syn match resolvIPSpecial /\%(127\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\)/ contained
+
+" General
+syn match resolvIP contained /\%(\d\{1,4}\.\)\{3}\d\{1,4}/ contains=@resolvIPCluster
+syn match resolvIPNetmask contained /\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\%(\%(\d\{1,4}\.\)\{,3}\d\{1,4}\)\)\?/ contains=resolvOperator,@resolvIPCluster
+syn match resolvHostname contained /\w\{-}\.[-0-9A-Za-z_\.]*/
+
+" Nameserver IPv4
+syn match resolvIPNameserver contained /\%(\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\s\|$\)\)\+/ contains=@resolvIPCluster
+
+" Nameserver IPv6
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{6}\%(\x\{1,4}:\x\{1,4}\)\>/
+syn match resolvIPNameserver contained /\s\@<=::\%(\x\{1,4}:\)\{,6}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\s\@<=::\%(\x\{1,4}:\)\{,5}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{1}:\%(\x\{1,4}:\)\{,5}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{1}:\%(\x\{1,4}:\)\{,4}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{2}:\%(\x\{1,4}:\)\{,4}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{2}:\%(\x\{1,4}:\)\{,3}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{3}:\%(\x\{1,4}:\)\{,3}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{3}:\%(\x\{1,4}:\)\{,2}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{4}:\%(\x\{1,4}:\)\{,2}\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{4}:\%(\x\{1,4}:\)\{,1}\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{5}:\%(\d\{1,4}\.\)\{3}\d\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{6}:\x\{1,4}\>/
+syn match resolvIPNameserver contained /\<\%(\x\{1,4}:\)\{1,7}:\%(\s\|;\|$\)\@=/
+
+" Search hostname
+syn match resolvHostnameSearch contained /\%(\%([-0-9A-Za-z_]\+\.\)*[-0-9A-Za-z_]\+\.\?\%(\s\|$\)\)\+/
+
+" Sortlist IPv4
+syn match resolvIPNetmaskSortList contained /\%(\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\%(\%(\d\{1,4}\.\)\{,3}\d\{1,4}\)\)\?\%(\s\|$\)\)\+/ contains=resolvOperator,@resolvIPCluster
+
+" Sortlist IPv6
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{6}\%(\x\{1,4}:\x\{1,4}\)\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\s\@<=::\%(\x\{1,4}:\)\{,6}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\s\@<=::\%(\x\{1,4}:\)\{,5}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{1}:\%(\x\{1,4}:\)\{,5}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{1}:\%(\x\{1,4}:\)\{,4}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{2}:\%(\x\{1,4}:\)\{,4}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{2}:\%(\x\{1,4}:\)\{,3}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{3}:\%(\x\{1,4}:\)\{,3}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{3}:\%(\x\{1,4}:\)\{,2}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{4}:\%(\x\{1,4}:\)\{,2}\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{4}:\%(\x\{1,4}:\)\{,1}\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{5}:\%(\d\{1,4}\.\)\{3}\d\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{6}:\x\{1,4}\%(\/\d\{1,3}\)\?\>/
+syn match resolvIPNetmaskSortList contained /\<\%(\x\{1,4}:\)\{1,7}:\%(\s\|;\|$\)\@=\%(\/\d\{1,3}\)\?/
+
+" Identifiers
+syn match resolvNameserver /^\s*nameserver\>/ nextgroup=resolvIPNameserver skipwhite
+syn match resolvLwserver /^\s*lwserver\>/ nextgroup=resolvIPNameserver skipwhite
+syn match resolvDomain /^\s*domain\>/ nextgroup=resolvHostname skipwhite
+syn match resolvSearch /^\s*search\>/ nextgroup=resolvHostnameSearch skipwhite
+syn match resolvSortList /^\s*sortlist\>/ nextgroup=resolvIPNetmaskSortList skipwhite
+syn match resolvOptions /^\s*options\>/ nextgroup=resolvOption skipwhite
+
+" Options
+syn match resolvOption /\<\%(debug\|no_tld_query\|no-tld-query\|rotate\|no-check-names\|inet6\|ip6-bytestring\|\%(no-\)\?ip6-dotint\|edns0\|single-request\%(-reopen\)\?\|use-vc\)\>/ contained nextgroup=resolvOption skipwhite
+syn match resolvOption /\<\%(ndots\|timeout\|attempts\):\d\+\>/ contained contains=resolvOperator nextgroup=resolvOption skipwhite
+
+" Additional errors
+syn match resolvError /^search .\{257,}/
+
+hi def link resolvIP Number
+hi def link resolvIPNetmask Number
+hi def link resolvHostname String
+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"
+
+" vim: ts=8 ft=vim
diff --git a/runtime/syntax/reva.vim b/runtime/syntax/reva.vim
new file mode 100644
index 0000000..39ad88d
--- /dev/null
+++ b/runtime/syntax/reva.vim
@@ -0,0 +1,191 @@
+" Vim syntax file
+" Language: Reva Forth
+" Version: 2011.2
+" Last Change: 2019 Sep 27
+" Maintainer: Ron Aaron <ron@ronware.org>
+" URL: http://ronware.org/reva/
+" Filetypes: *.rf *.frt
+" NOTE: You should also have the ftplugin/reva.vim file to set 'isk'
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn clear
+
+" Synchronization method
+syn sync ccomment
+syn sync maxlines=100
+
+
+syn case ignore
+" Some special, non-FORTH keywords
+"syn keyword revaTodo contained todo fixme bugbug todo: bugbug: note:
+syn match revaTodo contained '\(todo\|fixme\|bugbug\|note\)[:]*'
+syn match revaTodo contained 'copyright\(\s(c)\)\=\(\s[0-9]\{2,4}\)\='
+
+syn match revaHelpDesc '\S.*' contained
+syn match revaHelpStuff '\<\(def\|stack\|ctx\|ver\|os\|related\):\s.*'
+syn region revaHelpStuff start='\<desc:\>' end='^\S' contains=revaHelpDesc
+syn region revaEOF start='\<|||\>' end='{$}' contains=revaHelpStuff
+
+
+syn case match
+" basic mathematical and logical operators
+syn keyword revaoperators + - * / mod /mod negate abs min max umin umax
+syn keyword revaoperators and or xor not invert 1+ 1-
+syn keyword revaoperators m+ */ */mod m* um* m*/ um/mod fm/mod sm/rem
+syn keyword revaoperators d+ d- dnegate dabs dmin dmax > < = >> << u< <>
+
+
+" stack manipulations
+syn keyword revastack drop nip dup over tuck swap rot -rot ?dup pick roll
+syn keyword revastack 2drop 2nip 2dup 2over 2swap 2rot 3drop
+syn keyword revastack >r r> r@ rdrop
+" syn keyword revastack sp@ sp! rp@ rp!
+
+" address operations
+syn keyword revamemory @ ! +! c@ c! 2@ 2! align aligned allot allocate here free resize
+syn keyword revaadrarith chars char+ cells cell+ cell cell- 2cell+ 2cell- 3cell+ 4cell+
+syn keyword revamemblks move fill
+
+" conditionals
+syn keyword revacond if else then =if >if <if <>if if0 ;; catch throw
+
+" iterations
+syn keyword revaloop while repeat until again
+syn keyword revaloop do loop i j leave unloop skip more
+
+" new words
+syn match revaColonDef '\<noname:\|\<:\s+' contains=revaComment
+syn keyword revaEndOfColonDef ; ;inline
+syn keyword revadefine constant constant, variable create variable,
+syn keyword revadefine user value to +to defer! defer@ defer is does> immediate
+syn keyword revadefine compile literal ' [']
+
+" Built in words
+com! -nargs=+ Builtin syn keyword revaBuiltin <args>
+Builtin execute ahead interp bye >body here pad words make
+Builtin accept close cr creat delete ekey emit fsize ioerr key?
+Builtin mtime open/r open/rw read rename seek space spaces stat
+Builtin tell type type_ write (seek) (argv) (save) 0; 0drop;
+Builtin >class >lz >name >xt alias alias: appname argc asciiz, asciizl,
+Builtin body> clamp depth disassemble findprev fnvhash getenv here,
+Builtin iterate last! last@ later link lz> lzmax os parse/ peek
+Builtin peek-n pop prior push put rp@ rpick save setenv slurp
+Builtin stack-empty? stack-iterate stack-size stack: THROW_BADFUNC
+Builtin THROW_BADLIB THROW_GENERIC used xt>size z,
+Builtin +lplace +place -chop /char /string bounds c+lplace c+place
+Builtin chop cmp cmpi count lc lcount lplace place quote rsplit search split
+Builtin zcount zt \\char
+Builtin chdir g32 k32 u32 getcwd getpid hinst osname stdin stdout
+Builtin (-lib) (bye) (call) (else) (find) (func) (here) (if (lib) (s0) (s^)
+Builtin (to~) (while) >in >rel ?literal appstart cold compiling? context? d0 default_class
+Builtin defer? dict dolstr dostr find-word h0 if) interp isa onexit
+Builtin onstartup pdoes pop>ebx prompt rel> rp0 s0 src srcstr state str0 then,> then> tib
+Builtin tp vector vector! word? xt? .ver revaver revaver# && '' 'constant 'context
+Builtin 'create 'defer 'does 'forth 'inline 'macro 'macront 'notail 'value 'variable
+Builtin (.r) (context) (create) (header) (hide) (inline) (p.r) (words~) (xfind)
+Builtin ++ -- , -2drop -2nip -link -swap . .2x .classes .contexts .funcs .libs .needs .r
+Builtin .rs .x 00; 0do 0if 1, 2, 3, 2* 2/ 2constant 2variable 3dup 4dup ;then >base >defer
+Builtin >rr ? ?do @execute @rem appdir argv as back base base! between chain cleanup-libs
+Builtin cmove> context?? ctrl-c ctx>name data: defer: defer@def dictgone do_cr eleave
+Builtin endcase endof eval exception exec false find func: header heapgone help help/
+Builtin hex# hide inline{ last lastxt lib libdir literal, makeexename mnotail ms ms@
+Builtin newclass noop nosavedict notail nul of off on p: padchar parse parseln
+Builtin parsews rangeof rdepth remains reset reva revaused rol8 rr> scratch setclass sp
+Builtin strof super> temp time&date true turnkey? undo vfunc: w! w@
+Builtin xchg xchg2 xfind xt>name xwords { {{ }} } _+ _1+ _1- pathsep case \||
+" p[ [''] [ [']
+
+
+" debugging
+syn keyword revadebug .s dump see
+
+" basic character operations
+" syn keyword revaCharOps (.) CHAR EXPECT FIND WORD TYPE -TRAILING EMIT KEY
+" syn keyword revaCharOps KEY? TIB CR
+" syn match revaCharOps '\<char\s\S\s'
+" syn match revaCharOps '\<\[char\]\s\S\s'
+" syn region revaCharOps start=+."\s+ skip=+\\"+ end=+"+
+
+" char-number conversion
+syn keyword revaconversion s>d >digit digit> >single >double >number >float
+
+" contexts
+syn keyword revavocs forth macro inline
+syn keyword revavocs context:
+syn match revavocs /\<\~[^~ ]*/
+syn match revavocs /[^~ ]*\~\>/
+
+" numbers
+syn keyword revamath decimal hex base binary octal
+syn match revainteger '\<-\=[0-9.]*[0-9.]\+\>'
+" recognize hex and binary numbers, the '$' and '%' notation is for greva
+syn match revainteger '\<\$\x*\x\+\>' " *1* --- dont't mess
+syn match revainteger '\<\x*\d\x*\>' " *2* --- this order!
+syn match revainteger '\<%[0-1]*[0-1]\+\>'
+syn match revainteger "\<'.\>"
+
+" Strings
+" syn region revaString start=+\.\?\"+ end=+"+ end=+$+
+syn region revaString start=/"/ skip=/\\"/ end=/"/
+
+" Comments
+syn region revaComment start='\\S\s' end='.*' contains=revaTodo
+syn match revaComment '\.(\s[^)]\{-})' contains=revaTodo
+syn region revaComment start='(\s' skip='\\)' end=')' contains=revaTodo
+syn match revaComment '(\s[^\-]*\-\-[^\-]\{-})' contains=revaTodo
+syn match revaComment '\<|\s.*$' contains=revaTodo
+syn match revaColonDef '\<:m\?\s*[^ \t]\+\>' contains=revaComment
+
+" Include files
+syn match revaInclude '\<\(include\|needs\)\s\+\S\+'
+
+
+" Define the default highlighting.
+if !exists("did_reva_syntax_inits")
+ let did_reva_syntax_inits=1
+ " The default methods for highlighting. Can be overridden later.
+ hi def link revaEOF cIf0
+ hi def link revaHelpStuff special
+ hi def link revaHelpDesc Comment
+ hi def link revaTodo Todo
+ hi def link revaOperators Operator
+ hi def link revaMath Number
+ hi def link revaInteger Number
+ hi def link revaStack Special
+ hi def link revaFStack Special
+ hi def link revaSP Special
+ hi def link revaMemory Operator
+ hi def link revaAdrArith Function
+ hi def link revaMemBlks Function
+ hi def link revaCond Conditional
+ hi def link revaLoop Repeat
+ hi def link revaColonDef Define
+ hi def link revaEndOfColonDef Define
+ hi def link revaDefine Define
+ hi def link revaDebug Debug
+ hi def link revaCharOps Character
+ hi def link revaConversion String
+ hi def link revaForth Statement
+ hi def link revaVocs Statement
+ hi def link revaString String
+ hi def link revaComment Comment
+ hi def link revaClassDef Define
+ hi def link revaEndOfClassDef Define
+ hi def link revaObjectDef Define
+ hi def link revaEndOfObjectDef Define
+ hi def link revaInclude Include
+ hi def link revaBuiltin Keyword
+endif
+
+let b:current_syntax = "reva"
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8:sw=4:nocindent:smartindent:
diff --git a/runtime/syntax/rexx.vim b/runtime/syntax/rexx.vim
new file mode 100644
index 0000000..360fc8f
--- /dev/null
+++ b/runtime/syntax/rexx.vim
@@ -0,0 +1,318 @@
+" Vim syntax file
+" Language: Rexx
+" Maintainer: Thomas Geulig <geulig@nentec.de>
+" Last Change: 2012 Sep 14, added support for new ooRexx 4.0 features
+" URL: http://www.geulig.de/vim/rexx.vim
+" Special Thanks to Dan Sharp <dwsharp@hotmail.com> and Rony G. Flatscher
+" <Rony.Flatscher@wu-wien.ac.at> for comments and additions
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" add to valid identifier chars
+setlocal iskeyword+=.
+setlocal iskeyword+=!
+setlocal iskeyword+=?
+
+" ---rgf, position important: must be before comments etc. !
+syn match rexxOperator "[=|\/\\\+\*\[\],;:<>&\~%\-]"
+
+" rgf syn match rexxIdentifier "\<[a-zA-Z\!\?_]\([a-zA-Z0-9._?!]\)*\>"
+syn match rexxIdentifier "\<\K\k*\>"
+syn match rexxEnvironmentSymbol "\<\.\k\+\>"
+
+" A Keyword is the first symbol in a clause. A clause begins at the start
+" of a line or after a semicolon. THEN, ELSE, OTHERWISE, and colons are always
+" followed by an implied semicolon.
+syn match rexxClause "\(^\|;\|:\|then \|else \|when \|otherwise \)\s*\S*" contains=ALLBUT,rexxParse2,rexxRaise2,rexxForward2
+
+" Considered keywords when used together in a phrase and begin a clause
+syn match rexxParse "\<parse\s*\(\(upper\|lower\|caseless\)\s*\)\?\(arg\|linein\|pull\|source\|var\|\<value\>\|version\)\>" containedin=rexxClause contains=rexxParse2
+syn match rexxParse2 "\<with\>" containedin=rexxParse
+
+syn match rexxKeyword contained "\<numeric \(digits\|form \(scientific\|engineering\|value\)\|fuzz\)\>"
+syn match rexxKeyword contained "\<\(address\|trace\)\( value\)\?\>"
+syn match rexxKeyword contained "\<procedure\(\s*expose\)\?\>"
+
+syn match rexxKeyword contained "\<\(do\|loop\)\>\(\s\+label\s\+\k*\)\?\(\s\+forever\)\?\>"
+syn match rexxKeyword contained "\<use\>\s*\(strict\s*\)\?\<arg\>"
+
+" Another keyword phrase, separated to aid highlighting in rexxFunction
+syn match rexxRegularCallSignal contained "\<\(call\|signal\)\s\(\s*on\>\|\s*off\>\)\@!\(\k\+\ze\|\ze(\)\(\s*\|;\|$\|(\)"
+syn region rexxLabel contained start="\<\(call\|signal\)\>\s*\zs\(\k*\|(\)" end="\ze\(\s*\|;\|$\|(\)" containedin=rexxRegularCallSignal
+
+syn match rexxExceptionHandling contained "\<\(call\|signal\)\>\s\+\<\(on\|off\)\>.*\(;\|$\)" contains=rexxComment
+
+" hilite label given after keyword "name"
+syn match rexxLabel "name\s\+\zs\k\+\ze" containedin=rexxExceptionHandling
+" hilite condition name (serves as label)
+syn match rexxLabel "\<\(call\|signal\)\>\s\+\<\(on\|off\)\>\s*\zs\k\+\ze\s*\(;\|$\)" containedin=rexxExceptionHandling
+" user exception handling, hilite user defined name
+syn region rexxLabel contained start="user\s\+\zs\k" end="\ze\(\s\|;\|$\)" containedin=rexxExceptionHandling
+
+" Considered keywords when they begin a clause
+syn match rexxKeywordStatements "\<\(arg\|catch\|do\|drop\|end\|exit\|expose\|finally\|forward\|if\|interpret\|iterate\|leave\|loop\|nop\)\>"
+syn match rexxKeywordStatements "\<\(options\|pull\|push\|queue\|raise\|reply\|return\|say\|select\|trace\)\>"
+
+" Conditional keywords starting a new statement
+syn match rexxConditional "\<\(then\|else\|when\|otherwise\)\(\s*\|;\|\_$\|\)\>" contains=rexxKeywordStatements
+
+" Conditional phrases
+syn match rexxLoopKeywords "\<\(to\|by\|for\|until\|while\|over\)\>" containedin=doLoopSelectLabelRegion
+
+" must be after Conditional phrases!
+syn match doLoopSelectLabelRegion "\<\(do\|loop\|select\)\>\s\+\(label\s\+\)\?\(\s\+\k\+\s\+\zs\<over\>\)\?\k*\(\s\+forever\)\?\(\s\|;\|$\)" contains=doLoopSelectLabelRegion,rexxStartValueAssignment,rexxLoopKeywords
+
+" color label's name
+syn match rexxLabel2 "\<\(do\|loop\|select\)\>\s\+label\s\+\zs\k*\ze" containedin=doLoopSelectLabelRegion
+
+" make sure control variable is normal
+" TODO: re-activate ?
+"rgf syn match rexxControlVariable "\<\(do\|loop\)\>\(\s\+label\s\+\k*\)\?\s\+\zs.*\ze\s\+\<over\>" containedin=doLoopSelectLabelRegion
+
+" make sure control variable assignment is normal
+syn match rexxStartValueAssignment "\<\(do\|loop\)\>\(\s\+label\s\+\k*\)\?\s\+\zs.*\ze\(=.*\)\?\s\+\<to\>" containedin=doLoopSelectLabelRegion
+
+" highlight label name
+syn match endIterateLeaveLabelRegion "\<\(end\|leave\|iterate\)\>\(\s\+\K\k*\)" contains=rexxLabel2
+syn match rexxLabel2 "\<\(end\|leave\|iterate\)\>\s\+\zs\k*\ze" containedin=endIterateLeaveLabelRegion
+
+" Guard statement
+syn match rexxGuard "\(^\|;\|:\)\s*\<guard\>\s\+\<\(on\|off\)\>"
+
+" Trace statement
+syn match rexxTrace "\(^\|;\|:\)\s*\<trace\>\s\+\<\K\k*\>"
+
+" Raise statement
+" syn match rexxRaise "\(^\|;\|:\)\s\+\<raise\>\s*\<\(propagate\|error\|failure\|syntax\|user\)\>\?" contains=rexxRaise2
+syn match rexxRaise "\(^\|;\|:\)\s*\<raise\>\s*\<\(propagate\|error\|failure\|syntax\|user\)\>\?" contains=rexxRaise2
+syn match rexxRaise2 "\<\(additional\|array\|description\|exit\|propagate\|return\)\>" containedin=rexxRaise
+
+" Forward statement
+syn match rexxForward "\(^\|;\|:\)\<forward\>\s*" contains=rexxForward2
+syn match rexxForward2 "\<\(arguments\|array\|continue\|message\|class\|to\)\>" contained
+
+" Functions/Procedures
+syn match rexxFunction "\<\<[a-zA-Z\!\?_]\k*\>("me=e-1
+syn match rexxFunction "[()]"
+
+" String constants
+syn region rexxString start=+"+ skip=+""+ end=+"\(x\|b\)\?+ oneline
+syn region rexxString start=+'+ skip=+''+ end=+'\(x\|b\)\?+ oneline
+
+syn region rexxParen transparent start='(' end=')' contains=ALLBUT,rexxParenError,rexxTodo,rexxLabel,rexxKeyword
+" Catch errors caused by wrong parenthesis
+syn match rexxParenError ")"
+syn match rexxInParen "[\\[\\]{}]"
+
+" Comments
+syn region rexxComment start="/\*" end="\*/" contains=rexxTodo,rexxComment
+syn match rexxCommentError "\*/"
+syn region rexxLineComment start="--" end="\_$" oneline
+
+" Highlight User Labels
+" check for labels between comments, labels stated in a statement in the middle of a line
+syn match rexxLabel "\(\_^\|;\)\s*\(\/\*.*\*\/\)*\s*\k\+\s*\(\/\*.*\*\/\)*\s*:"me=e-1 contains=rexxTodo,rexxComment
+
+syn keyword rexxTodo contained TODO FIXME XXX
+
+" ooRexx messages
+syn region rexxMessageOperator start="\(\~\|\~\~\)" end="\(\S\|\s\)"me=e-1
+syn match rexxMessage "\(\~\|\~\~\)\s*\<\.*[a-zA-Z]\([a-zA-Z0-9._?!]\)*\>" contains=rexxMessageOperator
+
+" line continuations, take care of (line-)comments after it
+syn match rexxLineContinue ",\ze\s*\(--.*\|\/\*.*\)*$"
+
+" the following is necessary, otherwise three consecutive dashes will cause it to highlight the first one
+syn match rexxLineContinue "-\ze-\@!\s*\(--.*\|\s*\/\*.*\)\?$"
+
+" Special Variables
+syn keyword rexxSpecialVariable sigl rc result self super
+syn keyword rexxSpecialVariable .environment .error .input .local .methods .output .rs .stderr .stdin .stdout .stdque
+
+" Constants
+syn keyword rexxConst .true .false .nil .endOfLine .line .context
+
+" Rexx numbers
+" int like number
+syn match rexxNumber '\d\+' contained
+syn match rexxNumber '[-+]\s*\d\+' contained
+
+" Floating point number with decimal
+syn match rexxNumber '\d\+\.\d*' contained
+syn match rexxNumber '[-+]\s*\d\+\.\d*' contained
+
+" Floating point like number with E
+syn match rexxNumber '[-+]\s*\d*[eE][\-+]\d\+' contained
+syn match rexxNumber '\d*[eE][\-+]\d\+' contained
+
+" Floating point like number with E and decimal point (+,-)
+syn match rexxNumber '[-+]\s*\d*\.\d*[eE][\-+]\d\+' contained
+syn match rexxNumber '\d*\.\d*[eE][\-+]\d\+' contained
+
+
+" ooRexx builtin classes (as of version 3.2.0, fall 2007), first define dot to be o.k. in keywords
+syn keyword rexxBuiltinClass .Alarm .ArgUtil .Array .Bag .CaselessColumnComparator
+syn keyword rexxBuiltinClass .CaselessComparator .CaselessDescendingComparator .CircularQueue
+syn keyword rexxBuiltinClass .Class .Collection .ColumnComparator .Comparable .Comparator
+syn keyword rexxBuiltinClass .DateTime .DescendingComparator .Directory .File .InputOutputStream
+syn keyword rexxBuiltinClass .InputStream .InvertingComparator .List .MapCollection
+syn keyword rexxBuiltinClass .Message .Method .Monitor .MutableBuffer .Object
+syn keyword rexxBuiltinClass .OrderedCollection .OutputStream .Package .Properties .Queue
+syn keyword rexxBuiltinClass .RegularExpression .Relation .RexxContext .RexxQueue .Routine
+syn keyword rexxBuiltinClass .Set .SetCollection .Stem .Stream
+syn keyword rexxBuiltinClass .StreamSupplier .String .Supplier .Table .TimeSpan
+
+" Windows-only classes
+syn keyword rexxBuiltinClass .AdvancedControls .AnimatedButton .BaseDialog .ButtonControl
+syn keyword rexxBuiltinClass .CategoryDialog .CheckBox .CheckList .ComboBox .DialogControl
+syn keyword rexxBuiltinClass .DialogExtensions .DlgArea .DlgAreaU .DynamicDialog
+syn keyword rexxBuiltinClass .EditControl .InputBox .IntegerBox .ListBox .ListChoice
+syn keyword rexxBuiltinClass .ListControl .MenuObject .MessageExtensions .MultiInputBox
+syn keyword rexxBuiltinClass .MultiListChoice .OLEObject .OLEVariant
+syn keyword rexxBuiltinClass .PasswordBox .PlainBaseDialog .PlainUserDialog
+syn keyword rexxBuiltinClass .ProgressBar .ProgressIndicator .PropertySheet .RadioButton
+syn keyword rexxBuiltinClass .RcDialog .ResDialog .ScrollBar .SingleSelection .SliderControl
+syn keyword rexxBuiltinClass .StateIndicator .StaticControl .TabControl .TimedMessage
+syn keyword rexxBuiltinClass .TreeControl .UserDialog .VirtualKeyCodes .WindowBase
+syn keyword rexxBuiltinClass .WindowExtensions .WindowObject .WindowsClassesBase .WindowsClipboard
+syn keyword rexxBuiltinClass .WindowsEventLog .WindowsManager .WindowsProgramManager .WindowsRegistry
+
+" BSF4ooRexx classes
+syn keyword rexxBuiltinClass .BSF .bsf.dialog .bsf_proxy
+syn keyword rexxBuiltinClass .UNO .UNO_ENUM .UNO_CONSTANTS .UNO_PROPERTIES
+
+" ooRexx directives, ---rgf location important, otherwise directives in top of file not matched!
+syn region rexxClassDirective start="::\s*class\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
+syn region rexxMethodDirective start="::\s*method\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
+syn region rexxRequiresDirective start="::\s*requires\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
+syn region rexxRoutineDirective start="::\s*routine\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
+syn region rexxAttributeDirective start="::\s*attribute\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
+" rgf, 2012-09-09
+syn region rexxOptionsDirective start="::\s*options\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
+syn region rexxConstantDirective start="::\s*constant\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
+
+syn region rexxDirective start="\(^\|;\)\s*::\s*\w\+" end="\($\|;\)" contains=rexxString,rexxNumber,rexxComment,rexxLineComment,rexxClassDirective,rexxMethodDirective,rexxRoutineDirective,rexxRequiresDirective,rexxAttributeDirective,rexxOptionsDirective,rexxConstantDirective keepend
+
+syn match rexxOptionsDirective2 "\<\(digits\|form\|fuzz\|trace\)\>" containedin = rexxOptionsDirective3
+syn region rexxOptionsDirective3 start="\(^\|;\)\s*::\s*options\s"ms=e+1 end="\($\|;\)" contains=rexxString,rexxNumber,rexxVariable,rexxComment,rexxLineComment containedin = rexxDirective
+
+
+syn region rexxVariable start="\zs\<\(\.\)\@!\K\k\+\>\ze\s*\(=\|,\|)\|%\|\]\|\\\||\|&\|+=\|-=\|<\|>\)" end="\(\_$\|.\)"me=e-1
+syn match rexxVariable "\(=\|,\|)\|%\|\]\|\\\||\|&\|+=\|-=\|<\|>\)\s*\zs\K\k*\ze"
+
+" rgf, 2007-07-22: unfortunately, the entire region is colored (not only the
+" patterns), hence useless (vim 7.0)! (syntax-docs hint that that should work)
+" attempt: just colorize the parenthesis in matching colors, keep content
+" transparent to keep the formatting already done to it!
+" TODO: test on 7.3
+" syn region par1 matchgroup=par1 start="(" matchgroup=par1 end=")" transparent contains=par2
+" syn region par2 matchgroup=par2 start="(" matchgroup=par2 end=")" transparent contains=par3 contained
+" syn region par3 matchgroup=par3 start="(" matchgroup=par3 end=")" transparent contains=par4 contained
+" syn region par4 matchgroup=par4 start="(" matchgroup=par4 end=")" transparent contains=par5 contained
+" syn region par5 matchgroup=par5 start="(" matchgroup=par5 end=")" transparent contains=par1 contained
+
+" this will colorize the entire region, removing any colorizing already done!
+" syn region par1 matchgroup=par1 start="(" end=")" contains=par2
+" syn region par2 matchgroup=par2 start="(" end=")" contains=par3 contained
+" syn region par3 matchgroup=par3 start="(" end=")" contains=par4 contained
+" syn region par4 matchgroup=par4 start="(" end=")" contains=par5 contained
+" syn region par5 matchgroup=par5 start="(" end=")" contains=par1 contained
+
+hi par1 ctermfg=red guifg=red "guibg=grey
+hi par2 ctermfg=blue guifg=blue "guibg=grey
+hi par3 ctermfg=darkgreen guifg=darkgreen "guibg=grey
+hi par4 ctermfg=darkyellow guifg=darkyellow "guibg=grey
+hi par5 ctermfg=darkgrey guifg=darkgrey "guibg=grey
+
+" line continuation (trailing comma or single dash)
+syn sync linecont "\(,\|-\ze-\@!\)\ze\s*\(--.*\|\/\*.*\)*$"
+
+" if !exists("rexx_minlines")
+" let rexx_minlines = 500
+" endif
+" exec "syn sync ccomment rexxComment minlines=" . rexx_minlines
+
+" always scan from start, PCs have long become to be powerful enough for that
+exec "syn sync fromstart"
+
+" Define the default highlighting.
+" 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
+hi def link rexxOptionsDirective rexxFunction
+hi def link rexxOptionsDirective2 rexxOptionsDirective
+hi def link rexxOptionsDirective3 Normal " rexxOptionsDirective
+
+hi def link rexxConstantDirective rexxFunction
+
+hi def link rexxConst Constant
+hi def link rexxTypeSpecifier Type
+hi def link rexxBuiltinClass rexxTypeSpecifier
+
+hi def link rexxEnvironmentSymbol rexxConst
+hi def link rexxMessage rexxFunction
+
+hi def link rexxParse rexxKeyword
+hi def link rexxParse2 rexxParse
+
+hi def link rexxGuard rexxKeyword
+hi def link rexxTrace rexxKeyword
+
+hi def link rexxRaise rexxKeyword
+hi def link rexxRaise2 rexxRaise
+
+hi def link rexxForward rexxKeyword
+hi def link rexxForward2 rexxForward
+
+
+let b:current_syntax = "rexx"
+
+"vim: ts=8
diff --git a/runtime/syntax/rhelp.vim b/runtime/syntax/rhelp.vim
new file mode 100644
index 0000000..8cac585
--- /dev/null
+++ b/runtime/syntax/rhelp.vim
@@ -0,0 +1,274 @@
+" Vim syntax file
+" Language: R Help File
+" Maintainer: Jakson Aquino <jalvesaq@gmail.com>
+" Former Maintainer: Johannes Ranke <jranke@uni-bremen.de>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" 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.
+" - There is no Latex markup in equations
+" - Thanks to Will Gray for finding and fixing a bug
+" - No support for \var tag within quoted string
+
+" Version Clears: {{{1
+if exists("b:current_syntax")
+ finish
+endif
+
+scriptencoding utf-8
+
+syn case match
+
+" R help identifiers {{{1
+syn region rhelpIdentifier matchgroup=rhelpSection start="\\name{" end="}"
+syn region rhelpIdentifier matchgroup=rhelpSection start="\\alias{" end="}"
+syn region rhelpIdentifier matchgroup=rhelpSection start="\\pkg{" end="}" contains=rhelpLink
+syn region rhelpIdentifier matchgroup=rhelpSection start="\\CRANpkg{" end="}" contains=rhelpLink
+syn region rhelpIdentifier matchgroup=rhelpSection start="\\method{" end="}" contained
+syn region rhelpIdentifier matchgroup=rhelpSection start="\\Rdversion{" end="}"
+
+
+" Highlighting of R code using an existing r.vim syntax file if available {{{1
+syn include @R syntax/r.vim
+
+" Strings {{{1
+syn region rhelpString start=/"/ skip=/\\"/ end=/"/ contains=rhelpSpecialChar,rhelpCodeSpecial,rhelpLink contained
+
+" Special characters in R strings
+syn match rhelpCodeSpecial display contained "\\\\\(n\|r\|t\|b\|a\|f\|v\|'\|\"\)\|\\\\"
+
+" Special characters ( \$ \& \% \# \{ \} \_)
+syn match rhelpSpecialChar "\\[$&%#{}_]"
+
+
+" R code {{{1
+syn match rhelpDots "\\dots" containedin=@R
+syn region rhelpRcode matchgroup=Delimiter start="\\examples{" matchgroup=Delimiter transparent end="}" contains=@R,rhelpLink,rhelpIdentifier,rhelpString,rhelpSpecialChar,rhelpSection
+syn region rhelpRcode matchgroup=Delimiter start="\\usage{" matchgroup=Delimiter transparent end="}" contains=@R,rhelpIdentifier,rhelpS4method
+syn region rhelpRcode matchgroup=Delimiter start="\\synopsis{" matchgroup=Delimiter transparent end="}" contains=@R
+syn region rhelpRcode matchgroup=Delimiter start="\\special{" matchgroup=Delimiter transparent end="}" contains=@R
+
+if v:version > 703
+ syn region rhelpRcode matchgroup=Delimiter start="\\code{" skip='\\\@1<!{.\{-}\\\@1<!}' transparent end="}" contains=@R,rhelpDots,rhelpString,rhelpSpecialChar,rhelpLink keepend
+else
+ syn region rhelpRcode matchgroup=Delimiter start="\\code{" skip='\\\@<!{.\{-}\\\@<!}' transparent end="}" contains=@R,rhelpDots,rhelpString,rhelpSpecialChar,rhelpLink keepend
+endif
+syn region rhelpS4method matchgroup=Delimiter start="\\S4method{.*}(" matchgroup=Delimiter transparent end=")" contains=@R,rhelpDots
+syn region rhelpSexpr matchgroup=Delimiter start="\\Sexpr{" matchgroup=Delimiter transparent end="}" contains=@R
+
+" PreProc {{{1
+syn match rhelpPreProc "^#ifdef.*"
+syn match rhelpPreProc "^#endif.*"
+
+" Special Delimiters {{{1
+syn match rhelpDelimiter "\\cr"
+syn match rhelpDelimiter "\\tab "
+
+" Keywords {{{1
+syn match rhelpKeyword "\\R\>"
+syn match rhelpKeyword "\\ldots\>"
+syn match rhelpKeyword "\\sspace\>"
+syn match rhelpKeyword "--"
+syn match rhelpKeyword "---"
+
+" Condition Keywords {{{2
+syn match rhelpKeyword "\\if\>"
+syn match rhelpKeyword "\\ifelse\>"
+syn match rhelpKeyword "\\out\>"
+" Examples of usage:
+" \ifelse{latex}{\eqn{p = 5 + 6 - 7 \times 8}}{\eqn{p = 5 + 6 - 7 * 8}}
+" \ifelse{latex}{\out{$\alpha$}}{\ifelse{html}{\out{&alpha;}}{alpha}}
+
+" Keywords and operators valid only if in math mode {{{2
+syn match rhelpMathOp "<" contained
+syn match rhelpMathOp ">" contained
+syn match rhelpMathOp "+" contained
+syn match rhelpMathOp "-" contained
+syn match rhelpMathOp "=" contained
+
+" Conceal function based on syntax/tex.vim {{{2
+if exists("g:tex_conceal")
+ let s:tex_conceal = g:tex_conceal
+else
+ let s:tex_conceal = 'gm'
+endif
+function s:HideSymbol(pat, cchar, hide)
+ if a:hide
+ exe "syn match rhelpMathSymb '" . a:pat . "' contained conceal cchar=" . a:cchar
+ else
+ exe "syn match rhelpMathSymb '" . a:pat . "' contained"
+ endif
+endfunction
+
+" Math symbols {{{2
+if s:tex_conceal =~ 'm'
+ let s:hd = 1
+else
+ let s:hd = 0
+endif
+call s:HideSymbol('\\infty\>', '∞', s:hd)
+call s:HideSymbol('\\ge\>', '≥', s:hd)
+call s:HideSymbol('\\le\>', '≤', s:hd)
+call s:HideSymbol('\\prod\>', '∏', s:hd)
+call s:HideSymbol('\\sum\>', '∑', s:hd)
+syn match rhelpMathSymb "\\sqrt\>" contained
+
+" Greek letters {{{2
+if s:tex_conceal =~ 'g'
+ let s:hd = 1
+else
+ let s:hd = 0
+endif
+call s:HideSymbol('\\alpha\>', 'α', s:hd)
+call s:HideSymbol('\\beta\>', 'β', s:hd)
+call s:HideSymbol('\\gamma\>', 'γ', s:hd)
+call s:HideSymbol('\\delta\>', 'δ', s:hd)
+call s:HideSymbol('\\epsilon\>', 'ϵ', s:hd)
+call s:HideSymbol('\\zeta\>', 'ζ', s:hd)
+call s:HideSymbol('\\eta\>', 'η', s:hd)
+call s:HideSymbol('\\theta\>', 'θ', s:hd)
+call s:HideSymbol('\\iota\>', 'ι', s:hd)
+call s:HideSymbol('\\kappa\>', 'κ', s:hd)
+call s:HideSymbol('\\lambda\>', 'λ', s:hd)
+call s:HideSymbol('\\mu\>', 'μ', s:hd)
+call s:HideSymbol('\\nu\>', 'ν', s:hd)
+call s:HideSymbol('\\xi\>', 'ξ', s:hd)
+call s:HideSymbol('\\pi\>', 'π', s:hd)
+call s:HideSymbol('\\rho\>', 'ρ', s:hd)
+call s:HideSymbol('\\sigma\>', 'σ', s:hd)
+call s:HideSymbol('\\tau\>', 'τ', s:hd)
+call s:HideSymbol('\\upsilon\>', 'υ', s:hd)
+call s:HideSymbol('\\phi\>', 'ϕ', s:hd)
+call s:HideSymbol('\\chi\>', 'χ', s:hd)
+call s:HideSymbol('\\psi\>', 'ψ', s:hd)
+call s:HideSymbol('\\omega\>', 'ω', s:hd)
+call s:HideSymbol('\\Gamma\>', 'Γ', s:hd)
+call s:HideSymbol('\\Delta\>', 'Δ', s:hd)
+call s:HideSymbol('\\Theta\>', 'Θ', s:hd)
+call s:HideSymbol('\\Lambda\>', 'Λ', s:hd)
+call s:HideSymbol('\\Xi\>', 'Ξ', s:hd)
+call s:HideSymbol('\\Pi\>', 'Π', s:hd)
+call s:HideSymbol('\\Sigma\>', 'Σ', s:hd)
+call s:HideSymbol('\\Upsilon\>', 'Υ', s:hd)
+call s:HideSymbol('\\Phi\>', 'Φ', s:hd)
+call s:HideSymbol('\\Psi\>', 'Ψ', s:hd)
+call s:HideSymbol('\\Omega\>', 'Ω', s:hd)
+delfunction s:HideSymbol
+" Note: The letters 'omicron', 'Alpha', 'Beta', 'Epsilon', 'Zeta', 'Eta',
+" 'Iota', 'Kappa', 'Mu', 'Nu', 'Omicron', 'Rho', 'Tau' and 'Chi' are listed
+" at src/library/tools/R/Rd2txt.R because they are valid in HTML, although
+" they do not make valid LaTeX code (e.g. &Alpha; versus \Alpha).
+
+" Links {{{1
+syn region rhelpLink matchgroup=rhelpType start="\\link{" end="}" contained keepend extend
+syn region rhelpLink matchgroup=rhelpType start="\\link\[.\{-}\]{" end="}" contained keepend extend
+syn region rhelpLink matchgroup=rhelpType start="\\linkS4class{" end="}" contained keepend extend
+syn region rhelpLink matchgroup=rhelpType start="\\url{" end="}" contained keepend extend
+syn region rhelpLink matchgroup=rhelpType start="\\href{" end="}" contained keepend extend
+syn region rhelpLink matchgroup=rhelpType start="\\figure{" end="}" contained keepend extend
+
+" Verbatim like {{{1
+syn region rhelpVerbatim matchgroup=rhelpType start="\\samp{" skip='\\\@1<!{.\{-}\\\@1<!}' end="}" contains=rhelpSpecialChar,rhelpComment
+syn region rhelpVerbatim matchgroup=rhelpType start="\\verb{" skip='\\\@1<!{.\{-}\\\@1<!}' end="}" contains=rhelpSpecialChar,rhelpComment
+
+" Equation {{{1
+syn region rhelpEquation matchgroup=rhelpType start="\\eqn{" skip='\\\@1<!{.\{-}\\\@1<!}' end="}" contains=rhelpMathSymb,rhelpMathOp,rhelpRegion contained keepend extend
+syn region rhelpEquation matchgroup=rhelpType start="\\deqn{" skip='\\\@1<!{.\{-}\\\@1<!}' end="}" contains=rhelpMathSymb,rhelpMathOp,rhelpRegion contained keepend extend
+
+" Type Styles {{{1
+syn match rhelpType "\\emph\>"
+syn match rhelpType "\\strong\>"
+syn match rhelpType "\\bold\>"
+syn match rhelpType "\\sQuote\>"
+syn match rhelpType "\\dQuote\>"
+syn match rhelpType "\\preformatted\>"
+syn match rhelpType "\\kbd\>"
+syn match rhelpType "\\file\>"
+syn match rhelpType "\\email\>"
+syn match rhelpType "\\enc\>"
+syn match rhelpType "\\var\>"
+syn match rhelpType "\\env\>"
+syn match rhelpType "\\option\>"
+syn match rhelpType "\\command\>"
+syn match rhelpType "\\newcommand\>"
+syn match rhelpType "\\renewcommand\>"
+syn match rhelpType "\\dfn\>"
+syn match rhelpType "\\cite\>"
+syn match rhelpType "\\acronym\>"
+syn match rhelpType "\\doi\>"
+
+" rhelp sections {{{1
+syn match rhelpSection "\\encoding\>"
+syn match rhelpSection "\\title\>"
+syn match rhelpSection "\\item\>"
+syn match rhelpSection "\\description\>"
+syn match rhelpSection "\\concept\>"
+syn match rhelpSection "\\arguments\>"
+syn match rhelpSection "\\details\>"
+syn match rhelpSection "\\value\>"
+syn match rhelpSection "\\references\>"
+syn match rhelpSection "\\note\>"
+syn match rhelpSection "\\author\>"
+syn match rhelpSection "\\seealso\>"
+syn match rhelpSection "\\keyword\>"
+syn match rhelpSection "\\docType\>"
+syn match rhelpSection "\\format\>"
+syn match rhelpSection "\\source\>"
+syn match rhelpSection "\\itemize\>"
+syn match rhelpSection "\\describe\>"
+syn match rhelpSection "\\enumerate\>"
+syn match rhelpSection "\\item "
+syn match rhelpSection "\\item$"
+syn match rhelpSection "\\tabular{[lcr]*}"
+syn match rhelpSection "\\dontrun\>"
+syn match rhelpSection "\\dontshow\>"
+syn match rhelpSection "\\testonly\>"
+syn match rhelpSection "\\donttest\>"
+
+" Freely named Sections {{{1
+syn region rhelpFreesec matchgroup=Delimiter start="\\section{" matchgroup=Delimiter transparent end="}"
+syn region rhelpFreesubsec matchgroup=Delimiter start="\\subsection{" matchgroup=Delimiter transparent end="}"
+
+syn match rhelpDelimiter "{\|\[\|(\|)\|\]\|}"
+
+" R help file comments {{{1
+syn match rhelpComment /%.*$/
+
+" Error {{{1
+syn region rhelpRegion matchgroup=Delimiter start=/(/ matchgroup=Delimiter end=/)/ contains=@Spell,rhelpCodeSpecial,rhelpComment,rhelpDelimiter,rhelpDots,rhelpFreesec,rhelpFreesubsec,rhelpIdentifier,rhelpKeyword,rhelpLink,rhelpPreProc,rhelpRComment,rhelpRcode,rhelpRegion,rhelpS4method,rhelpSection,rhelpSexpr,rhelpSpecialChar,rhelpString,rhelpType,rhelpVerbatim,rhelpEquation
+syn region rhelpRegion matchgroup=Delimiter start=/{/ matchgroup=Delimiter end=/}/ contains=@Spell,rhelpCodeSpecial,rhelpComment,rhelpDelimiter,rhelpDots,rhelpFreesec,rhelpFreesubsec,rhelpIdentifier,rhelpKeyword,rhelpLink,rhelpPreProc,rhelpRComment,rhelpRcode,rhelpRegion,rhelpS4method,rhelpSection,rhelpSexpr,rhelpSpecialChar,rhelpString,rhelpType,rhelpVerbatim,rhelpEquation
+syn region rhelpRegion matchgroup=Delimiter start=/\[/ matchgroup=Delimiter end=/]/ contains=@Spell,rhelpCodeSpecial,rhelpComment,rhelpDelimiter,rhelpDots,rhelpFreesec,rhelpFreesubsec,rhelpIdentifier,rhelpKeyword,rhelpLink,rhelpPreProc,rhelpRComment,rhelpRcode,rhelpRegion,rhelpS4method,rhelpSection,rhelpSexpr,rhelpSpecialChar,rhelpString,rhelpType,rhelpVerbatim,rhelpEquation
+syn match rhelpError /[)\]}]/
+syn match rhelpBraceError /[)}]/ contained
+syn match rhelpCurlyError /[)\]]/ contained
+syn match rhelpParenError /[\]}]/ contained
+
+syntax sync match rhelpSyncRcode grouphere rhelpRcode "\\examples{"
+
+" Define the default highlighting {{{1
+hi def link rhelpVerbatim String
+hi def link rhelpDelimiter Delimiter
+hi def link rhelpIdentifier Identifier
+hi def link rhelpString String
+hi def link rhelpCodeSpecial Special
+hi def link rhelpKeyword Keyword
+hi def link rhelpDots Keyword
+hi def link rhelpLink Underlined
+hi def link rhelpType Type
+hi def link rhelpSection PreCondit
+hi def link rhelpError Error
+hi def link rhelpBraceError Error
+hi def link rhelpCurlyError Error
+hi def link rhelpParenError Error
+hi def link rhelpPreProc PreProc
+hi def link rhelpDelimiter Delimiter
+hi def link rhelpComment Comment
+hi def link rhelpRComment Comment
+hi def link rhelpSpecialChar SpecialChar
+hi def link rhelpMathSymb Special
+hi def link rhelpMathOp Operator
+
+let b:current_syntax = "rhelp"
+
+" vim: foldmethod=marker sw=2
diff --git a/runtime/syntax/rib.vim b/runtime/syntax/rib.vim
new file mode 100644
index 0000000..0ee6071
--- /dev/null
+++ b/runtime/syntax/rib.vim
@@ -0,0 +1,62 @@
+" Vim syntax file
+" Language: Renderman Interface Bytestream
+" Maintainer: Andrew Bromage <ajb@spamcop.net>
+" Last Change: 2003 May 11
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" Comments
+syn match ribLineComment "#.*$"
+syn match ribStructureComment "##.*$"
+
+syn case ignore
+syn match ribCommand /[A-Z][a-zA-Z]*/
+syn case match
+
+syn region ribString start=/"/ skip=/\\"/ end=/"/
+
+syn match ribStructure "[A-Z][a-zA-Z]*Begin\>\|[A-Z][a-zA-Z]*End"
+syn region ribSectionFold start="FrameBegin" end="FrameEnd" fold transparent keepend extend
+syn region ribSectionFold start="WorldBegin" end="WorldEnd" fold transparent keepend extend
+syn region ribSectionFold start="TransformBegin" end="TransformEnd" fold transparent keepend extend
+syn region ribSectionFold start="AttributeBegin" end="AttributeEnd" fold transparent keepend extend
+syn region ribSectionFold start="MotionBegin" end="MotionEnd" fold transparent keepend extend
+syn region ribSectionFold start="SolidBegin" end="SolidEnd" fold transparent keepend extend
+syn region ribSectionFold start="ObjectBegin" end="ObjectEnd" fold transparent keepend extend
+
+syn sync fromstart
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match ribNumbers display transparent "[-]\=\<\d\|\.\d" contains=ribNumber,ribFloat
+syn match ribNumber display contained "[-]\=\d\+\>"
+"floating point number, with dot, optional exponent
+syn match ribFloat display contained "[-]\=\d\+\.\d*\(e[-+]\=\d\+\)\="
+"floating point number, starting with a dot, optional exponent
+syn match ribFloat display contained "[-]\=\.\d\+\(e[-+]\=\d\+\)\=\>"
+"floating point number, without dot, with exponent
+syn match ribFloat display contained "[-]\=\d\+e[-+]\d\+\>"
+syn case match
+
+
+hi def link ribStructure Structure
+hi def link ribCommand Statement
+
+hi def link ribStructureComment SpecialComment
+hi def link ribLineComment Comment
+
+hi def link ribString String
+hi def link ribNumber Number
+hi def link ribFloat Float
+
+
+
+let b:current_syntax = "rib"
+
+" Options for vi: ts=8 sw=2 sts=2 nowrap noexpandtab ft=vim
diff --git a/runtime/syntax/rmd.vim b/runtime/syntax/rmd.vim
new file mode 100644
index 0000000..f849af9
--- /dev/null
+++ b/runtime/syntax/rmd.vim
@@ -0,0 +1,177 @@
+" Language: Markdown with chunks of R, Python and other languages
+" Maintainer: Jakson Aquino <jalvesaq@gmail.com>
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Fri Feb 24, 2023 08:28AM
+"
+" 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
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Highlight the header of the chunks as R code
+let g:rmd_syn_hl_chunk = get(g:, 'rmd_syn_hl_chunk', 0)
+
+" Pandoc-syntax has more features, but it is slower.
+" https://github.com/vim-pandoc/vim-pandoc-syntax
+
+" Don't waste time loading syntax that will be discarded:
+let s:save_pandoc_lngs = get(g:, 'pandoc#syntax#codeblocks#embeds#langs', [])
+let g:pandoc#syntax#codeblocks#embeds#langs = []
+
+" Step_1: Source pandoc.vim if it is installed:
+runtime syntax/pandoc.vim
+if exists("b:current_syntax")
+ if hlexists('pandocDelimitedCodeBlock')
+ syn clear pandocDelimitedCodeBlock
+ endif
+
+ if len(s:save_pandoc_lngs) > 0 && !exists('g:rmd_fenced_languages')
+ let g:rmd_fenced_languages = deepcopy(s:save_pandoc_lngs)
+ endif
+
+ " Recognize inline R code
+ syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr containedin=pandocLaTeXRegion,yamlFlowString keepend
+else
+ " Step_2: Source markdown.vim if pandoc.vim is not installed
+
+ " 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)
+
+ " 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') && !exists('g:rmd_fenced_languages')
+ let g:rmd_fenced_languages = deepcopy(g:markdown_fenced_languages)
+ endif
+
+ if exists('g:markdown_fenced_languages') && len(g:markdown_fenced_languages) > 0
+ let s:save_mfl = deepcopy(g:markdown_fenced_languages)
+ endif
+ " Don't waste time loading syntax that will be discarded:
+ let g:markdown_fenced_languages = []
+ runtime syntax/markdown.vim
+ if exists('s:save_mfl') > 0
+ let g:markdown_fenced_languages = deepcopy(s:save_mfl)
+ unlet s:save_mfl
+ endif
+ syn region rmdrInline matchgroup=rmdInlineDelim start="`r " end="`" contains=@Rmdr keepend
+
+ " Step_2a: Add highlighting for both YAML and citations which are pandoc
+ " specific, but also used in Rmd files
+
+ " 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
+ " Basic highlighting of YAML header
+ syn match rmdYamlFieldTtl /^\s*\zs\w\%(-\|\w\)*\ze:/ contained
+ syn match rmdYamlFieldTtl /^\s*-\s*\zs\w\%(-\|\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 match yamlComment /#.*/ contained
+ " A second colon is a syntax error, unles within a string or following !expr
+ syn match yamlColonError /:\s*[^'^"^!]*:/ contained
+ if &filetype == 'quarto'
+ syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^---$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError
+ else
+ syn region pandocYAMLHeader matchgroup=rmdYamlBlockDelim start=/\%(\%^\|\_^\s*\n\)\@<=\_^-\{3}\ze\n.\+/ end=/^\([-.]\)\1\{2}$/ keepend contains=rmdYamlFieldTtl,yamlFlowString,yamlComment,yamlColonError
+ endif
+ hi def link rmdYamlBlockDelim Delimiter
+ hi def link rmdYamlFieldTtl Identifier
+ hi def link yamlFlowString String
+ hi def link yamlComment Comment
+ hi def link yamlColonError Error
+ endif
+
+ " 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
+endif
+
+" Step_3: Highlight code blocks.
+
+syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```\s*{.*}$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend
+syn region rmdCodeBlock matchgroup=rmdCodeDelim start="^\s*```.+$" matchgroup=rmdCodeDelim end="^```$" keepend
+hi link rmdCodeBlock Special
+
+" Now highlight chunks:
+syn region knitrBodyOptions start='^#| ' end='$' contained containedin=rComment,pythonComment contains=knitrBodyVar,knitrBodyValue transparent
+syn match knitrBodyValue ': \zs.*\ze$' keepend contained containedin=knitrBodyOptions
+syn match knitrBodyVar '| \zs\S\{-}\ze:' contained containedin=knitrBodyOptions
+
+let g:rmd_fenced_languages = get(g:, 'rmd_fenced_languages', ['r'])
+for s:type in g:rmd_fenced_languages
+ if s:type =~ '='
+ let s:ft = substitute(s:type, '.*=', '', '')
+ let s:nm = substitute(s:type, '=.*', '', '')
+ else
+ let s:ft = s:type
+ let s:nm = s:type
+ endif
+ unlet! b:current_syntax
+ exe 'syn include @Rmd'.s:nm.' syntax/'.s:ft.'.vim'
+ if g:rmd_syn_hl_chunk
+ exe 'syn match knitrChunkDelim /```\s*{\s*'.s:nm.'/ contained containedin=knitrChunkBrace contains=knitrChunkLabel'
+ exe 'syn match knitrChunkLabelDelim /```\s*{\s*'.s:nm.',\=\s*[-[:alnum:]]\{-1,}[,}]/ contained containedin=knitrChunkBrace'
+ syn match knitrChunkDelim /}\s*$/ contained containedin=knitrChunkBrace
+ exe 'syn match knitrChunkBrace /```\s*{\s*'.s:nm.'.*$/ contained containedin=rmd'.s:nm.'Chunk contains=knitrChunkDelim,knitrChunkLabelDelim,@Rmd'.s:nm
+ exe 'syn region rmd'.s:nm.'Chunk start="^\s*```\s*{\s*=\?'.s:nm.'\>.*$" matchgroup=rmdCodeDelim end="^\s*```\ze\s*$" keepend contains=knitrChunkBrace,@Rmd'.s:nm
+
+ hi link knitrChunkLabel Identifier
+ hi link knitrChunkDelim rmdCodeDelim
+ hi link knitrChunkLabelDelim rmdCodeDelim
+ 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
+endfor
+unlet! s:type
+
+" Step_4: Highlight code recognized by pandoc but not defined in pandoc.vim yet:
+syn match pandocDivBegin '^:::\+ {.\{-}}' contains=pandocHeaderAttr
+syn match pandocDivEnd '^:::\+$'
+
+hi def link knitrBodyVar PreProc
+hi def link knitrBodyValue Constant
+hi def link knitrBodyOptions rComment
+hi def link pandocDivBegin Delimiter
+hi def link pandocDivEnd Delimiter
+hi def link rmdInlineDelim Delimiter
+hi def link rmdCodeDelim Delimiter
+
+if len(s:save_pandoc_lngs)
+ let g:pandoc#syntax#codeblocks#embeds#langs = s:save_pandoc_lngs
+endif
+unlet s:save_pandoc_lngs
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+let b:current_syntax = "rmd"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/rnc.vim b/runtime/syntax/rnc.vim
new file mode 100644
index 0000000..7d3907e
--- /dev/null
+++ b/runtime/syntax/rnc.vim
@@ -0,0 +1,68 @@
+" Vim syntax file
+" Language: Relax NG compact syntax
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-06-17
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword+=-,.
+
+syn keyword rncTodo contained TODO FIXME XXX NOTE
+
+syn region rncComment display oneline start='^\s*#' end='$'
+ \ contains=rncTodo,@Spell
+
+syn match rncOperator display '[-|,&+?*~]'
+syn match rncOperator display '\%(|&\)\=='
+syn match rncOperator display '>>'
+
+syn match rncNamespace display '\<\k\+:'
+
+syn match rncQuoted display '\\\k\+\>'
+
+syn match rncSpecial display '\\x{\x\+}'
+
+syn region rncAnnotation transparent start='\[' end='\]'
+ \ contains=ALLBUT,rncComment,rncTodo
+
+syn region rncLiteral display oneline start=+"+ end=+"+
+ \ contains=rncSpecial
+syn region rncLiteral display oneline start=+'+ end=+'+
+syn region rncLiteral display oneline start=+"""+ end=+"""+
+ \ contains=rncSpecial
+syn region rncLiteral display oneline start=+'''+ end=+'''+
+
+syn match rncDelimiter display '[{},()]'
+
+syn keyword rncKeyword datatypes default div empty external grammar
+syn keyword rncKeyword include inherit list mixed name namespace
+syn keyword rncKeyword notAllowed parent start string text token
+
+syn match rncIdentifier display '\k\+\_s*\%(=\|&=\||=\)\@='
+ \ nextgroup=rncOperator
+syn keyword rncKeyword element attribute
+ \ nextgroup=rncIdName skipwhite skipempty
+syn match rncIdName contained '\k\+'
+
+hi def link rncTodo Todo
+hi def link rncComment Comment
+hi def link rncOperator Operator
+hi def link rncNamespace Identifier
+hi def link rncQuoted Special
+hi def link rncSpecial SpecialChar
+hi def link rncAnnotation Special
+hi def link rncLiteral String
+hi def link rncDelimiter Delimiter
+hi def link rncKeyword Keyword
+hi def link rncIdentifier Identifier
+hi def link rncIdName Identifier
+
+let b:current_syntax = "rnc"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/rng.vim b/runtime/syntax/rng.vim
new file mode 100644
index 0000000..1ef864c
--- /dev/null
+++ b/runtime/syntax/rng.vim
@@ -0,0 +1,25 @@
+" Vim syntax file
+" Language: RELAX NG
+" Maintainer: Jaromir Hradilek <jhradilek@gmail.com>
+" URL: https://github.com/jhradilek/vim-rng
+" Last Change: 25 March 2013
+" Description: A syntax file for RELAX NG, a schema language for XML
+
+if exists('b:current_syntax')
+ finish
+endif
+
+do Syntax xml
+syn spell toplevel
+syn cluster xmlTagHook add=rngTagName
+syn case match
+
+syn keyword rngTagName anyName attribute choice data define div contained
+syn keyword rngTagName element empty except externalRef grammar contained
+syn keyword rngTagName group include interleave list mixed name contained
+syn keyword rngTagName notAllowed nsName oneOrMore optional param contained
+syn keyword rngTagName parentRef ref start text value zeroOrMore contained
+
+hi def link rngTagName Statement
+
+let b:current_syntax = 'rng'
diff --git a/runtime/syntax/rnoweb.vim b/runtime/syntax/rnoweb.vim
new file mode 100644
index 0000000..749860a
--- /dev/null
+++ b/runtime/syntax/rnoweb.vim
@@ -0,0 +1,52 @@
+" Vim syntax file
+" Language: R noweb Files
+" Maintainer: Johannes Ranke <jranke@uni-bremen.de>
+" 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>
+" http://www.ime.usp.br/~feferraz/en/sweavevim.html
+"
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" Extension of Tex clusters {{{1
+runtime syntax/tex.vim
+unlet! b:current_syntax
+
+syn cluster texMatchGroup add=@rnoweb
+syn cluster texMathMatchGroup add=rnowebSexpr
+syn cluster texMathZoneGroup add=rnowebSexpr
+syn cluster texEnvGroup add=@rnoweb
+syn cluster texFoldGroup add=@rnoweb
+syn cluster texDocGroup add=@rnoweb
+syn cluster texPartGroup add=@rnoweb
+syn cluster texChapterGroup add=@rnoweb
+syn cluster texSectionGroup add=@rnoweb
+syn cluster texSubSectionGroup add=@rnoweb
+syn cluster texSubSubSectionGroup add=@rnoweb
+syn cluster texParaGroup add=@rnoweb
+
+" Highlighting of R code using an existing r.vim syntax file if available {{{1
+syn include @rnowebR syntax/r.vim
+syn region rnowebChunk matchgroup=rnowebDelimiter start="^\s*<<.*>>=" matchgroup=rnowebDelimiter end="^@" contains=@rnowebR,rnowebChunkReference,rnowebChunk fold keepend
+syn match rnowebChunkReference "^\s*<<.*>>$" contained
+syn region rnowebSexpr matchgroup=Delimiter start="\\Sexpr{" matchgroup=Delimiter end="}" contains=@rnowebR contained
+
+" Sweave options command {{{1
+syn region rnowebSweaveopts matchgroup=Delimiter start="\\SweaveOpts{" matchgroup=Delimiter end="}"
+
+" rnoweb Cluster {{{1
+syn cluster rnoweb contains=rnowebChunk,rnowebChunkReference,rnowebDelimiter,rnowebSexpr,rnowebSweaveopts
+
+" Highlighting {{{1
+hi def link rnowebDelimiter Delimiter
+hi def link rnowebSweaveOpts Statement
+hi def link rnowebChunkReference Delimiter
+
+let b:current_syntax = "rnoweb"
+" vim: foldmethod=marker:
diff --git a/runtime/syntax/robots.vim b/runtime/syntax/robots.vim
new file mode 100644
index 0000000..fcb9b02
--- /dev/null
+++ b/runtime/syntax/robots.vim
@@ -0,0 +1,57 @@
+" Vim syntax file
+" Language: "Robots.txt" files
+" Robots.txt files indicate to WWW robots which parts of a web site should not be accessed.
+" Maintainer: Dominique Stéphan (dominique@mggen.com)
+" URL: http://www.mggen.com/vim/syntax/robots.zip
+" Last change: 2001 May 09
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+" shut case off
+syn case ignore
+
+" Comment
+syn match robotsComment "#.*$" contains=robotsUrl,robotsMail,robotsString
+
+" Star * (means all spiders)
+syn match robotsStar "\*"
+
+" :
+syn match robotsDelimiter ":"
+
+
+" The keywords
+" User-agent
+syn match robotsAgent "^[Uu][Ss][Ee][Rr]\-[Aa][Gg][Ee][Nn][Tt]"
+" Disallow
+syn match robotsDisallow "^[Dd][Ii][Ss][Aa][Ll][Ll][Oo][Ww]"
+
+" Disallow: or User-Agent: and the rest of the line before an eventual comment
+synt match robotsLine "\(^[Uu][Ss][Ee][Rr]\-[Aa][Gg][Ee][Nn][Tt]\|^[Dd][Ii][Ss][Aa][Ll][Ll][Oo][Ww]\):[^#]*" contains=robotsAgent,robotsDisallow,robotsStar,robotsDelimiter
+
+" Some frequent things in comments
+syn match robotsUrl "http[s]\=://\S*"
+syn match robotsMail "\S*@\S*"
+syn region robotsString start=+L\="+ skip=+\\\\\|\\"+ end=+"+
+
+
+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"
+
+" vim: ts=8 sw=2
+
diff --git a/runtime/syntax/routeros.vim b/runtime/syntax/routeros.vim
new file mode 100644
index 0000000..b6effc9
--- /dev/null
+++ b/runtime/syntax/routeros.vim
@@ -0,0 +1,91 @@
+" Vim syntax file
+" Language: MikroTik RouterOS Script
+" Maintainer: zainin <z@wintr.dev>
+" Original Author: ndbjorne @ MikroTik forums
+" Last Change: 2021 Nov 14
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn iskeyword @,48-57,-
+
+" comments
+syn match routerosComment /^\s*\zs#.*/
+
+" options submenus: /interface ether1 etc
+syn match routerosSubMenu "\([a-z]\)\@<!/[a-zA-Z0-9-]*"
+
+" variables are matched by looking at strings ending with "=", e.g. var=
+syn match routerosVariable "[a-zA-Z0-9-/]*\(=\)\@="
+syn match routerosVariable "$[a-zA-Z0-9-]*"
+
+" colored for clarity
+syn match routerosDelimiter "[,=]"
+" match slash in CIDR notation (1.2.3.4/24, 2001:db8::/48, ::1/128)
+syn match routerosDelimiter "\(\x\|:\)\@<=\/\(\d\)\@="
+" dash in IP ranges
+syn match routerosDelimiter "\(\x\|:\)\@<=-\(\x\|:\)\@="
+
+" match service names after "set", like in original routeros syntax
+syn match routerosService "\(set\)\@<=\s\(api-ssl\|api\|dns\|ftp\|http\|https\|pim\|ntp\|smb\|ssh\|telnet\|winbox\|www\|www-ssl\)"
+
+" colors various interfaces
+syn match routerosInterface "bridge\d\+\|ether\d\+\|wlan\d\+\|pppoe-\(out\|in\)\d\+"
+
+syn keyword routerosBoolean yes no true false
+
+syn keyword routerosConditional if
+
+" operators
+syn match routerosOperator " \zs[-+*<>=!~^&.,]\ze "
+syn match routerosOperator "[<>!]="
+syn match routerosOperator "<<\|>>"
+syn match routerosOperator "[+-]\d\@="
+
+syn keyword routerosOperator and or in
+
+" commands
+syn keyword routerosCommands beep delay put len typeof pick log time set find environment
+syn keyword routerosCommands terminal error parse resolve toarray tobool toid toip toip6
+syn keyword routerosCommands tonum tostr totime add remove enable disable where get print
+syn keyword routerosCommands export edit find append as-value brief detail count-only file
+syn keyword routerosCommands follow follow-only from interval terse value-list without-paging
+syn keyword routerosCommands return
+
+" variable types
+syn keyword routerosType global local
+
+" loop keywords
+syn keyword routerosRepeat do while for foreach
+
+syn match routerosSpecial "[():[\]{|}]"
+
+syn match routerosLineContinuation "\\$"
+
+syn match routerosEscape "\\["\\nrt$?_abfv]" contained display
+syn match routerosEscape "\\\x\x" contained display
+
+syn region routerosString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=routerosEscape,routerosLineContinuation
+
+hi link routerosComment Comment
+hi link routerosSubMenu Function
+hi link routerosVariable Identifier
+hi link routerosDelimiter Operator
+hi link routerosEscape Special
+hi link routerosService Type
+hi link routerosInterface Type
+hi link routerosBoolean Boolean
+hi link routerosConditional Conditional
+hi link routerosOperator Operator
+hi link routerosCommands Operator
+hi link routerosType Type
+hi link routerosRepeat Repeat
+hi link routerosSpecial Delimiter
+hi link routerosString String
+hi link routerosLineContinuation Special
+
+let b:current_syntax = "routeros"
diff --git a/runtime/syntax/rpcgen.vim b/runtime/syntax/rpcgen.vim
new file mode 100644
index 0000000..60c9b8c
--- /dev/null
+++ b/runtime/syntax/rpcgen.vim
@@ -0,0 +1,46 @@
+" Vim syntax file
+" Language: rpcgen
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Aug 31, 2016
+" Version: 13
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_RPCGEN
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the C syntax to start with
+runtime! syntax/c.vim
+
+syn keyword rpcProgram program skipnl skipwhite nextgroup=rpcProgName
+syn match rpcProgName contained "\<\i\I*\>" skipnl skipwhite nextgroup=rpcProgZone
+syn region rpcProgZone contained matchgroup=Delimiter start="{" matchgroup=Delimiter end="}\s*=\s*\(\d\+\|0x[23]\x\{7}\)\s*;"me=e-1 contains=rpcVersion,cComment,rpcProgNmbrErr
+syn keyword rpcVersion contained version skipnl skipwhite nextgroup=rpcVersName
+syn match rpcVersName contained "\<\i\I*\>" skipnl skipwhite nextgroup=rpcVersZone
+syn region rpcVersZone contained matchgroup=Delimiter start="{" matchgroup=Delimiter end="}\s*=\s*\d\+\s*;"me=e-1 contains=cType,cStructure,cStorageClass,rpcDecl,rpcProcNmbr,cComment
+syn keyword rpcDecl contained string
+syn match rpcProcNmbr contained "=\s*\d\+;"me=e-1
+syn match rpcProgNmbrErr contained "=\s*0x[^23]\x*"ms=s+1
+syn match rpcPassThru "^\s*%.*$"
+
+" Define the default highlighting.
+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"
+
+" vim: ts=8
diff --git a/runtime/syntax/rpl.vim b/runtime/syntax/rpl.vim
new file mode 100644
index 0000000..28c250b
--- /dev/null
+++ b/runtime/syntax/rpl.vim
@@ -0,0 +1,483 @@
+" Vim syntax file
+" Language: RPL/2
+" Version: 0.15.15 against RPL/2 version 4.00pre7i
+" Last Change: 2012 Feb 03 by Thilo Six
+" Maintainer: Joël BERTRAND <rpl2@free.fr>
+" URL: http://www.makalis.fr/~bertrand/rpl2/download/vim/indent/rpl.vim
+" Credits: Nothing
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Keyword characters (not used)
+" set iskeyword=33-127
+
+" Case sensitive
+syntax case match
+
+" Constants
+syntax match rplConstant "\(^\|\s\+\)\(e\|i\)\ze\($\|\s\+\)"
+
+" Any binary number
+syntax match rplBinaryError "\(^\|\s\+\)#\s*\S\+b\ze"
+syntax match rplBinary "\(^\|\s\+\)#\s*[01]\+b\ze\($\|\s\+\)"
+syntax match rplOctalError "\(^\|\s\+\)#\s*\S\+o\ze"
+syntax match rplOctal "\(^\|\s\+\)#\s*\o\+o\ze\($\|\s\+\)"
+syntax match rplDecimalError "\(^\|\s\+\)#\s*\S\+d\ze"
+syntax match rplDecimal "\(^\|\s\+\)#\s*\d\+d\ze\($\|\s\+\)"
+syntax match rplHexadecimalError "\(^\|\s\+\)#\s*\S\+h\ze"
+syntax match rplHexadecimal "\(^\|\s\+\)#\s*\x\+h\ze\($\|\s\+\)"
+
+" Case unsensitive
+syntax case ignore
+
+syntax match rplControl "\(^\|\s\+\)abort\ze\($\|\s\+\)"
+syntax match rplControl "\(^\|\s\+\)kill\ze\($\|\s\+\)"
+syntax match rplControl "\(^\|\s\+\)cont\ze\($\|\s\+\)"
+syntax match rplControl "\(^\|\s\+\)halt\ze\($\|\s\+\)"
+syntax match rplControl "\(^\|\s\+\)cmlf\ze\($\|\s\+\)"
+syntax match rplControl "\(^\|\s\+\)sst\ze\($\|\s\+\)"
+
+syntax match rplConstant "\(^\|\s\+\)pi\ze\($\|\s\+\)"
+
+syntax match rplStatement "\(^\|\s\+\)return\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)last\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)syzeval\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)wait\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)type\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)kind\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)eval\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)use\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)remove\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)external\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)dup\([2n]\|\)\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)drop\([2n]\|\)\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)depth\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)roll\(d\|\)\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)pick\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)rot\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)swap\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)over\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)clear\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)warranty\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)copyright\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)convert\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)date\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)time\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)mem\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)clmf\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)->num\ze\($\|\s\+\)"
+syntax match rplStatement "\(^\|\s\+\)help\ze\($\|\s\+\)"
+
+syntax match rplStorage "\(^\|\s\+\)get\(i\|r\|c\|\)\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)put\(i\|r\|c\|\)\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)rcl\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)purge\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)sinv\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)sneg\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)sconj\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)steq\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)rceq\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)vars\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)clusr\ze\($\|\s\+\)"
+syntax match rplStorage "\(^\|\s\+\)sto\([+-/\*]\|\)\ze\($\|\s\+\)"
+
+syntax match rplAlgConditional "\(^\|\s\+\)ift\(e\|\)\ze\($\|\s\+\)"
+
+syntax match rplOperator "\(^\|\s\+\)and\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)\(x\|\)or\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)not\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)same\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)==\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)<=\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)=<\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)=>\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)>=\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)<>\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)>\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)<\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)[+-]\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)[/\*]\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)\^\ze\($\|\s\+\)"
+syntax match rplOperator "\(^\|\s\+\)\*\*\ze\($\|\s\+\)"
+
+syntax match rplBoolean "\(^\|\s\+\)true\ze\($\|\s\+\)"
+syntax match rplBoolean "\(^\|\s\+\)false\ze\($\|\s\+\)"
+
+syntax match rplReadWrite "\(^\|\s\+\)store\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)recall\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)\(\|wf\|un\)lock\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)open\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)close\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)delete\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)create\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)format\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)rewind\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)backspace\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)\(\|re\)write\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)read\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)inquire\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)sync\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)append\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)suppress\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)seek\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)pr\(1\|int\|st\|stc\|lcd\|var\|usr\|md\)\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)paper\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)cr\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)erase\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)disp\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)input\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)prompt\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)key\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)cllcd\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)\(\|re\)draw\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)drax\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)indep\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)depnd\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)res\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)axes\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)label\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)pmin\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)pmax\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)centr\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)persist\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)title\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)\(slice\|auto\|log\|\)scale\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)eyept\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)\(p\|s\)par\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)function\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)polar\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)scatter\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)plotter\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)wireframe\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)parametric\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)slice\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)\*w\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)\*h\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)\*d\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)\*s\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)->lcd\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)lcd->\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)edit\ze\($\|\s\+\)"
+syntax match rplReadWrite "\(^\|\s\+\)visit\ze\($\|\s\+\)"
+
+syntax match rplIntrinsic "\(^\|\s\+\)abs\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)arg\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)conj\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)re\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)im\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)mant\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)xpon\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)ceil\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)fact\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)fp\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)floor\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)inv\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)ip\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)max\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)min\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)mod\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)neg\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)relax\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)sign\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)sq\(\|rt\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)xroot\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)cos\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)sin\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)tan\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)tg\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)a\(\|rc\)cos\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)a\(\|rc\)sin\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)atan\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)arctg\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|a\)cosh\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|a\)sinh\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|a\)tanh\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|arg\)th\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)arg[cst]h\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|a\)log\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)ln\(\|1\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)exp\(\|m\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)trn\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)con\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)idn\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)rdm\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)rsd\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)cnrm\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)cross\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)d[eo]t\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)[cr]swp\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)rci\(j\|\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(in\|de\)cr\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)bessel\ze\($\|\s\+\)"
+
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|g\)egvl\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|g\)\(\|l\|r\)egv\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)rnrm\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(std\|fix\|sci\|eng\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(rad\|deg\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|n\)rand\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)rdz\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|i\)fft\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(dec\|bin\|oct\|hex\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)rclf\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)stof\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)[cs]f\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)chr\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)num\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)pos\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)sub\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)size\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(st\|rc\)ws\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(r\|s\)\(r\|l\)\(\|b\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)as\(r\|l\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(int\|der\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)stos\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|r\)cls\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)drws\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)scls\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)ns\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)tot\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)mean\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|p\)sdev\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|p\)var\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)maxs\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)mins\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|p\)cov\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)cols\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)s\(x\(\|y\|2\)\|y\(\|2\)\)\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(x\|y\)col\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)corr\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)utp[cfnt]\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)comb\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)perm\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)\(\|p\)lu\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)[lu]chol\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)schur\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)%\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)%ch\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)%t\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)hms->\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)->hms\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)hms+\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)hms-\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)d->r\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)r->d\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)b->r\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)r->b\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)c->r\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)r->c\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)r->p\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)p->r\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)str->\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)->str\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)array->\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)->array\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)list->\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)->list\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)s+\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)s-\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)col-\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)col+\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)row-\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)row+\ze\($\|\s\+\)"
+syntax match rplIntrinsic "\(^\|\s\+\)->q\ze\($\|\s\+\)"
+
+syntax match rplObsolete "\(^\|\s\+\)arry->\ze\($\|\s\+\)"hs=e-5
+syntax match rplObsolete "\(^\|\s\+\)->arry\ze\($\|\s\+\)"hs=e-5
+
+" Conditional structures
+syntax match rplConditionalError "\(^\|\s\+\)case\ze\($\|\s\+\)"hs=e-3
+syntax match rplConditionalError "\(^\|\s\+\)then\ze\($\|\s\+\)"hs=e-3
+syntax match rplConditionalError "\(^\|\s\+\)else\ze\($\|\s\+\)"hs=e-3
+syntax match rplConditionalError "\(^\|\s\+\)elseif\ze\($\|\s\+\)"hs=e-5
+syntax match rplConditionalError "\(^\|\s\+\)end\ze\($\|\s\+\)"hs=e-2
+syntax match rplConditionalError "\(^\|\s\+\)\(step\|next\)\ze\($\|\s\+\)"hs=e-3
+syntax match rplConditionalError "\(^\|\s\+\)until\ze\($\|\s\+\)"hs=e-4
+syntax match rplConditionalError "\(^\|\s\+\)repeat\ze\($\|\s\+\)"hs=e-5
+syntax match rplConditionalError "\(^\|\s\+\)default\ze\($\|\s\+\)"hs=e-6
+
+" FOR/(CYCLE)/(EXIT)/NEXT
+" FOR/(CYCLE)/(EXIT)/STEP
+" START/(CYCLE)/(EXIT)/NEXT
+" START/(CYCLE)/(EXIT)/STEP
+syntax match rplCycle "\(^\|\s\+\)\(cycle\|exit\)\ze\($\|\s\+\)"
+syntax region rplForNext matchgroup=rplRepeat start="\(^\|\s\+\)\(for\|start\)\ze\($\|\s\+\)" end="\(^\|\s\+\)\(next\|step\)\ze\($\|\s\+\)" contains=ALL keepend extend
+
+" ELSEIF/END
+syntax region rplElseifEnd matchgroup=rplConditional start="\(^\|\s\+\)elseif\ze\($\|\s\+\)" end="\(^\|\s\+\)end\ze\($\|\s\+\)" contained contains=ALLBUT,rplElseEnd keepend
+
+" ELSE/END
+syntax region rplElseEnd matchgroup=rplConditional start="\(^\|\s\+\)else\ze\($\|\s\+\)" end="\(^\|\s\+\)end\ze\($\|\s\+\)" contained contains=ALLBUT,rplElseEnd,rplThenEnd,rplElseifEnd keepend
+
+" THEN/END
+syntax region rplThenEnd matchgroup=rplConditional start="\(^\|\s\+\)then\ze\($\|\s\+\)" end="\(^\|\s\+\)end\ze\($\|\s\+\)" contained containedin=rplIfEnd contains=ALLBUT,rplThenEnd keepend
+
+" IF/END
+syntax region rplIfEnd matchgroup=rplConditional start="\(^\|\s\+\)if\(err\|\)\ze\($\|\s\+\)" end="\(^\|\s\+\)end\ze\($\|\s\+\)" contains=ALLBUT,rplElseEnd,rplElseifEnd keepend extend
+" if end is accepted !
+" select end too !
+
+" CASE/THEN
+syntax region rplCaseThen matchgroup=rplConditional start="\(^\|\s\+\)case\ze\($\|\s\+\)" end="\(^\|\s\+\)then\ze\($\|\s\+\)" contains=ALLBUT,rplCaseThen,rplCaseEnd,rplThenEnd keepend extend contained containedin=rplCaseEnd
+
+" CASE/END
+syntax region rplCaseEnd matchgroup=rplConditional start="\(^\|\s\+\)case\ze\($\|\s\+\)" end="\(^\|\s\+\)end\ze\($\|\s\+\)" contains=ALLBUT,rplCaseEnd,rplThenEnd,rplElseEnd keepend extend contained containedin=rplSelectEnd
+
+" DEFAULT/END
+syntax region rplDefaultEnd matchgroup=rplConditional start="\(^\|\s\+\)default\ze\($\|\s\+\)" end="\(^\|\s\+\)end\ze\($\|\s\+\)" contains=ALLBUT,rplDefaultEnd keepend contained containedin=rplSelectEnd
+
+" SELECT/END
+syntax region rplSelectEnd matchgroup=rplConditional start="\(^\|\s\+\)select\ze\($\|\s\+\)" end="\(^\|\s\+\)end\ze\($\|\s\+\)" contains=ALLBUT,rplThenEnd keepend extend
+" select end is accepted !
+
+" DO/UNTIL/END
+syntax region rplUntilEnd matchgroup=rplConditional start="\(^\|\s\+\)until\ze\($\|\s\+\)" end="\(^\|\s\+\)\zsend\ze\($\|\s\+\)" contains=ALLBUT,rplUntilEnd contained containedin=rplDoUntil extend keepend
+syntax region rplDoUntil matchgroup=rplConditional start="\(^\|\s\+\)do\ze\($\|\s\+\)" end="\(^\|\s\+\)until\ze\($\|\s\+\)" contains=ALL keepend extend
+
+" WHILE/REPEAT/END
+syntax region rplRepeatEnd matchgroup=rplConditional start="\(^\|\s\+\)repeat\ze\($\|\s\+\)" end="\(^\|\s\+\)\zsend\ze\($\|\s\+\)" contains=ALLBUT,rplRepeatEnd contained containedin=rplWhileRepeat extend keepend
+syntax region rplWhileRepeat matchgroup=rplConditional start="\(^\|\s\+\)while\ze\($\|\s\+\)" end="\(^\|\s\+\)repeat\ze\($\|\s\+\)" contains=ALL keepend extend
+
+" Comments
+syntax match rplCommentError "\*/"
+syntax region rplCommentString contained start=+"+ end=+"+ end=+\*/+me=s-1
+syntax region rplCommentLine start="\(^\|\s\+\)//\ze" skip="\\$" end="$" contains=NONE keepend extend
+syntax region rplComment start="\(^\|\s\+\)/\*\ze" end="\*/" contains=rplCommentString keepend extend
+
+" Catch errors caused by too many right parentheses
+syntax region rplParen transparent start="(" end=")" contains=ALLBUT,rplParenError,rplComplex,rplIncluded keepend extend
+syntax match rplParenError ")"
+
+" Subroutines
+" Catch errors caused by too many right '>>'
+syntax match rplSubError "\(^\|\s\+\)>>\ze\($\|\s\+\)"hs=e-1
+syntax region rplSub matchgroup=rplSubDelimitor start="\(^\|\s\+\)<<\ze\($\|\s\+\)" end="\(^\|\s\+\)>>\ze\($\|\s\+\)" contains=ALLBUT,rplSubError,rplIncluded,rplDefaultEnd,rplStorageSub keepend extend
+
+" Expressions
+syntax region rplExpr start="\(^\|\s\+\)'" end="'\ze\($\|\s\+\)" contains=rplParen,rplParenError
+
+" Local variables
+syntax match rplStorageError "\(^\|\s\+\)->\ze\($\|\s\+\)"hs=e-1
+syntax region rplStorageSub matchgroup=rplStorage start="\(^\|\s\+\)<<\ze\($\|\s\+\)" end="\(^\|\s\+\)>>\ze\($\|\s\+\)" contains=ALLBUT,rplSubError,rplIncluded,rplDefaultEnd,rplStorageExpr contained containedin=rplLocalStorage keepend extend
+syntax region rplStorageExpr matchgroup=rplStorage start="\(^\|\s\+\)'" end="'\ze\($\|\s\+\)" contains=rplParen,rplParenError extend contained containedin=rplLocalStorage
+syntax region rplLocalStorage matchgroup=rplStorage start="\(^\|\s\+\)->\ze\($\|\s\+\)" end="\(^\|\s\+\)\(<<\ze\($\|\s\+\)\|'\)" contains=rplStorageSub,rplStorageExpr,rplComment,rplCommentLine keepend extend
+
+" Catch errors caused by too many right brackets
+syntax match rplArrayError "\]"
+syntax match rplArray "\]" contained containedin=rplArray
+syntax region rplArray matchgroup=rplArray start="\[" end="\]" contains=ALLBUT,rplArrayError keepend extend
+
+" Catch errors caused by too many right '}'
+syntax match rplListError "}"
+syntax match rplList "}" contained containedin=rplList
+syntax region rplList matchgroup=rplList start="{" end="}" contains=ALLBUT,rplListError,rplIncluded keepend extend
+
+" cpp is used by RPL/2
+syntax match rplPreProc "\_^#\s*\(define\|undef\)\>"
+syntax match rplPreProc "\_^#\s*\(warning\|error\)\>"
+syntax match rplPreCondit "\_^#\s*\(if\|ifdef\|ifndef\|elif\|else\|endif\)\>"
+syntax match rplIncluded contained "\<<\s*\S*\s*>\>"
+syntax match rplInclude "\_^#\s*include\>\s*["<]" contains=rplIncluded,rplString
+"syntax match rplExecPath "\%^\_^#!\s*\S*"
+syntax match rplExecPath "\%^\_^#!\p*\_$"
+
+" Any integer
+syntax match rplInteger "\(^\|\s\+\)[-+]\=\d\+\ze\($\|\s\+\)"
+
+" Floating point number
+" [S][ip].[fp]
+syntax match rplFloat "\(^\|\s\+\)[-+]\=\(\d*\)\=[\.,]\(\d*\)\=\ze\($\|\s\+\)" contains=ALLBUT,rplPoint,rplSign
+" [S]ip[.fp]E[S]exp
+syntax match rplFloat "\(^\|\s\+\)[-+]\=\d\+\([\.,]\d*\)\=[eE]\([-+]\)\=\d\+\ze\($\|\s\+\)" contains=ALLBUT,rplPoint,rplSign
+" [S].fpE[S]exp
+syntax match rplFloat "\(^\|\s\+\)[-+]\=\(\d*\)\=[\.,]\d\+[eE]\([-+]\)\=\d\+\ze\($\|\s\+\)" contains=ALLBUT,rplPoint,rplSign
+syntax match rplPoint "\<[\.,]\>"
+syntax match rplSign "\<[+-]\>"
+
+" Complex number
+" (x,y)
+syntax match rplComplex "\(^\|\s\+\)([-+]\=\(\d*\)\=\.\=\d*\([eE][-+]\=\d\+\)\=\s*,\s*[-+]\=\(\d*\)\=\.\=\d*\([eE][-+]\=\d\+\)\=)\ze\($\|\s\+\)"
+" (x.y)
+syntax match rplComplex "\(^\|\s\+\)([-+]\=\(\d*\)\=,\=\d*\([eE][-+]\=\d\+\)\=\s*\.\s*[-+]\=\(\d*\)\=,\=\d*\([eE][-+]\=\d\+\)\=)\ze\($\|\s\+\)"
+
+" Strings
+syntax match rplStringGuilles "\\\""
+syntax match rplStringAntislash "\\\\"
+syntax region rplString start=+\(^\|\s\+\)"+ end=+"\ze\($\|\s\+\)+ contains=rplStringGuilles,rplStringAntislash
+
+syntax match rplTab "\t" transparent
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8 tw=132
diff --git a/runtime/syntax/rrst.vim b/runtime/syntax/rrst.vim
new file mode 100644
index 0000000..3a56342
--- /dev/null
+++ b/runtime/syntax/rrst.vim
@@ -0,0 +1,43 @@
+" reStructured Text with R statements
+" Language: reST with R code chunks
+" Maintainer: Alex Zvoleff, azvoleff@mail.sdsu.edu
+" Homepage: https://github.com/jalvesaq/R-Vim-runtime
+" Last Change: Thu Apr 05, 2018 11:06PM
+"
+" CONFIGURATION:
+" To highlight chunk headers as R code, put in your vimrc:
+" let rrst_syn_hl_chunk = 1
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" load all of the rst info
+runtime syntax/rst.vim
+unlet! b:current_syntax
+
+" load all of the r syntax highlighting rules into @R
+syntax include @R syntax/r.vim
+
+" highlight R chunks
+if exists("g:rrst_syn_hl_chunk")
+ " highlight R code inside chunk header
+ syntax match rrstChunkDelim "^\.\. {r" contained
+ syntax match rrstChunkDelim "}$" contained
+else
+ syntax match rrstChunkDelim "^\.\. {r .*}$" contained
+endif
+syntax match rrstChunkDelim "^\.\. \.\.$" contained
+syntax region rrstChunk start="^\.\. {r.*}$" end="^\.\. \.\.$" contains=@R,rrstChunkDelim keepend transparent fold
+
+" also highlight in-line R code
+syntax match rrstInlineDelim "`" contained
+syntax match rrstInlineDelim ":r:" contained
+syntax region rrstInline start=":r: *`" skip=/\\\\\|\\`/ end="`" contains=@R,rrstInlineDelim keepend
+
+hi def link rrstChunkDelim Special
+hi def link rrstInlineDelim Special
+
+let b:current_syntax = "rrst"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/rst.vim b/runtime/syntax/rst.vim
new file mode 100644
index 0000000..a90c90b
--- /dev/null
+++ b/runtime/syntax/rst.vim
@@ -0,0 +1,290 @@
+" Vim reST syntax file
+" Language: reStructuredText documentation format
+" Maintainer: Marshall Ward <marshall.ward@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Website: https://github.com/marshallward/vim-restructuredtext
+" Latest Revision: 2020-03-31
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case ignore
+
+syn match rstTransition /^[=`:.'"~^_*+#-]\{4,}\s*$/
+
+syn cluster rstCruft contains=rstEmphasis,rstStrongEmphasis,
+ \ rstInterpretedText,rstInlineLiteral,rstSubstitutionReference,
+ \ rstInlineInternalTargets,rstFootnoteReference,rstHyperlinkReference
+
+syn region rstLiteralBlock matchgroup=rstDelimiter
+ \ start='\(^\z(\s*\).*\)\@<=::\n\s*\n' skip='^\s*$' end='^\(\z1\s\+\)\@!'
+ \ contains=@NoSpell
+
+syn region rstQuotedLiteralBlock matchgroup=rstDelimiter
+ \ start="::\_s*\n\ze\z([!\"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]\)"
+ \ end='^\z1\@!' contains=@NoSpell
+
+syn region rstDoctestBlock oneline display matchgroup=rstDelimiter
+ \ start='^>>>\s' end='^$'
+
+syn region rstTable transparent start='^\n\s*+[-=+]\+' end='^$'
+ \ contains=rstTableLines,@rstCruft
+syn match rstTableLines contained display '|\|+\%(=\+\|-\+\)\='
+
+syn region rstSimpleTable transparent
+ \ start='^\n\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
+ \ end='^$'
+ \ contains=rstSimpleTableLines,@rstCruft
+syn match rstSimpleTableLines contained display
+ \ '^\%(\s*\)\@>\%(\%(=\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(=\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
+syn match rstSimpleTableLines contained display
+ \ '^\%(\s*\)\@>\%(\%(-\+\)\@>\%(\s\+\)\@>\)\%(\%(\%(-\+\)\@>\%(\s*\)\@>\)\+\)\@>$'
+
+syn cluster rstDirectives contains=rstFootnote,rstCitation,
+ \ rstHyperlinkTarget,rstExDirective
+
+syn match rstExplicitMarkup '^\s*\.\.\_s'
+ \ nextgroup=@rstDirectives,rstComment,rstSubstitutionDefinition
+
+" "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
+
+execute 'syn region rstComment contained' .
+ \ ' start=/.*/'
+ \ ' skip=+^$+' .
+ \ ' end=/^\s\@!/ contains=rstTodo'
+
+execute 'syn region rstFootnote contained matchgroup=rstDirective' .
+ \ ' start=+\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]\_s+' .
+ \ ' skip=+^$+' .
+ \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
+
+execute 'syn region rstCitation contained matchgroup=rstDirective' .
+ \ ' start=+\[' . s:ReferenceName . '\]\_s+' .
+ \ ' skip=+^$+' .
+ \ ' end=+^\s\@!+ contains=@rstCruft,@NoSpell'
+
+syn region rstHyperlinkTarget contained matchgroup=rstDirective
+ \ start='_\%(_\|[^:\\]*\%(\\.[^:\\]*\)*\):\_s' skip=+^$+ end=+^\s\@!+
+
+syn region rstHyperlinkTarget contained matchgroup=rstDirective
+ \ start='_`[^`\\]*\%(\\.[^`\\]*\)*`:\_s' skip=+^$+ end=+^\s\@!+
+
+syn region rstHyperlinkTarget matchgroup=rstDirective
+ \ start=+^__\_s+ skip=+^$+ end=+^\s\@!+
+
+execute 'syn region rstExDirective contained matchgroup=rstDirective' .
+ \ ' start=+' . s:ReferenceName . '::\_s+' .
+ \ ' skip=+^$+' .
+ \ ' end=+^\s\@!+ contains=@rstCruft,rstLiteralBlock'
+
+execute 'syn match rstSubstitutionDefinition contained' .
+ \ ' /|.*|\_s\+/ nextgroup=@rstDirectives'
+
+function! s:DefineOneInlineMarkup(name, start, middle, end, char_left, char_right)
+ " Only escape the first char of a multichar delimiter (e.g. \* inside **)
+ if a:start[0] == '\'
+ let first = a:start[0:1]
+ else
+ let first = a:start[0]
+ endif
+
+ execute 'syn match rstEscape'.a:name.' +\\\\\|\\'.first.'+'.' contained'
+
+ 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=+' . a:end . '\ze\%($\|\s\|[''"’)\]}>/:.,;!?\\-]\)+' .
+ \ ' contains=rstEscape' . a:name
+
+ execute 'hi def link rstEscape'.a:name.' Special'
+endfunction
+
+function! s:DefineInlineMarkup(name, start, middle, end)
+ let middle = a:middle != "" ?
+ \ (' skip=+\\\\\|\\' . a:middle . '\|\s' . a:middle . '+') :
+ \ ""
+
+ 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, '\[', '\]')
+ 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\|\%ua0\|[/:]\)', '')
+
+ execute 'syn match rst' . a:name .
+ \ ' +\%(^\|\s\|\%ua0\|[''"([{</:]\)\zs' . a:start .
+ \ '[^[:space:]' . a:start[strlen(a:start) - 1] . ']'
+ \ a:end . '\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
+
+ execute 'hi def link rst' . a:name . 'Delimiter' . ' rst' . a:name
+endfunction
+
+call s:DefineInlineMarkup('Emphasis', '\*', '\*', '\*')
+call s:DefineInlineMarkup('StrongEmphasis', '\*\*', '\*', '\*\*')
+call s:DefineInlineMarkup('InterpretedTextOrHyperlinkReference', '`', '`', '`_\{0,2}')
+call s:DefineInlineMarkup('InlineLiteral', '``', "", '``')
+call s:DefineInlineMarkup('SubstitutionReference', '|', '|', '|_\{0,2}')
+call s:DefineInlineMarkup('InlineInternalTargets', '_`', '`', '`')
+
+" 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' .
+ \ ' +\%(\s\|^\)\[\%(\d\+\|#\%(' . s:ReferenceName . '\)\=\|\*\)\]_+'
+
+execute 'syn match rstCitationReference contains=@NoSpell' .
+ \ ' +\%(\s\|^\)\[' . s:ReferenceName . '\]_\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)+'
+
+execute 'syn match rstHyperlinkReference' .
+ \ ' /\<' . s:ReferenceName . '__\=\ze\%($\|\s\|[''")\]}>/:.,;!?\\-]\)/'
+
+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*\(\S*\)\?\s*\n\%(\s*:.*:\s*.*\s*\n\)*\n\ze\z(\s\+\)+
+ \ skip=+^$+
+ \ end=+^\z1\@!+
+ \ contains=@NoSpell
+syn cluster rstDirectives add=rstCodeBlock
+
+if !exists('g:rst_syntax_code_list')
+ " 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 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
+ 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
+ endif
+ unlet! prior_isk
+endfor
+
+" Enable top level spell checking
+syntax spell toplevel
+
+" TODO: Use better syncing.
+syn sync minlines=50 linebreaks=2
+
+hi def link rstTodo Todo
+hi def link rstComment Comment
+hi def link rstSections Title
+hi def link rstTransition rstSections
+hi def link rstLiteralBlock String
+hi def link rstQuotedLiteralBlock String
+hi def link rstDoctestBlock PreProc
+hi def link rstTableLines rstDelimiter
+hi def link rstSimpleTableLines rstTableLines
+hi def link rstExplicitMarkup rstDirective
+hi def link rstDirective Keyword
+hi def link rstFootnote String
+hi def link rstCitation String
+hi def link rstHyperlinkTarget String
+hi def link rstExDirective String
+hi def link rstSubstitutionDefinition rstDirective
+hi def link rstDelimiter Delimiter
+hi def link rstInterpretedTextOrHyperlinkReference Identifier
+hi def link rstInlineLiteral String
+hi def link rstSubstitutionReference PreProc
+hi def link rstInlineInternalTargets Identifier
+hi def link rstFootnoteReference Identifier
+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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/rtf.vim b/runtime/syntax/rtf.vim
new file mode 100644
index 0000000..f8e031b
--- /dev/null
+++ b/runtime/syntax/rtf.vim
@@ -0,0 +1,75 @@
+" Vim syntax file
+" Language: Rich Text Format
+" "*.rtf" files
+"
+" The Rich Text Format (RTF) Specification is a method of encoding formatted
+" text and graphics for easy transfer between applications.
+" .hlp (windows help files) use compiled rtf files
+" rtf documentation at http://night.primate.wisc.edu/software/RTF/
+"
+" Maintainer: Dominique Stéphan (dominique@mggen.com)
+" URL: http://www.mggen.com/vim/syntax/rtf.zip
+" Last change: 2001 Mai 02
+
+" TODO: render underline, italic, bold
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" case on (all controls must be lower case)
+syn case match
+
+" Control Words
+syn match rtfControlWord "\\[a-z]\+[\-]\=[0-9]*"
+
+" New Control Words (not in the 1987 specifications)
+syn match rtfNewControlWord "\\\*\\[a-z]\+[\-]\=[0-9]*"
+
+" Control Symbol : any \ plus a non alpha symbol, *, \, { and } and '
+syn match rtfControlSymbol "\\[^a-zA-Z\*\{\}\\']"
+
+" { } and \ are special characters, to use them
+" we add a backslash \
+syn match rtfCharacter "\\\\"
+syn match rtfCharacter "\\{"
+syn match rtfCharacter "\\}"
+" Escaped characters (for 8 bytes characters upper than 127)
+syn match rtfCharacter "\\'[A-Za-z0-9][A-Za-z0-9]"
+" Unicode
+syn match rtfUnicodeCharacter "\\u[0-9][0-9]*"
+
+" Color values, we will put this value in Red, Green or Blue
+syn match rtfRed "\\red[0-9][0-9]*"
+syn match rtfGreen "\\green[0-9][0-9]*"
+syn match rtfBlue "\\blue[0-9][0-9]*"
+
+" Some stuff for help files
+syn match rtfFootNote "[#$K+]{\\footnote.*}" contains=rtfControlWord,rtfNewControlWord
+
+" Define the default highlighting.
+" 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"
+
+" vim:ts=8
diff --git a/runtime/syntax/ruby.vim b/runtime/syntax/ruby.vim
new file mode 100644
index 0000000..c951fcf
--- /dev/null
+++ b/runtime/syntax/ruby.vim
@@ -0,0 +1,606 @@
+" Vim syntax file
+" Language: Ruby
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" URL: https://github.com/vim-ruby/vim-ruby
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2021 Nov 03
+" ----------------------------------------------------------------------------
+"
+" Previous Maintainer: Mirko Nasato
+" 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
+
+" eRuby Config {{{1
+if exists('main_syntax') && main_syntax == 'eruby'
+ let b:ruby_no_expensive = 1
+endif
+
+" 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, 'NONE') > -1
+ return 0
+ endif
+
+ 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
+
+function! s:run_syntax_fold(args) abort
+ let [_0, _1, groups, cmd; _] = matchlist(a:args, '\(["'']\)\(.\{-}\)\1\s\+\(.*\)')
+ if call('s:foldable', split(groups))
+ let cmd .= ' fold'
+ endif
+ exe cmd
+endfunction
+
+com! -nargs=* SynFold call s:run_syntax_fold(<q-args>)
+
+" Not-Top Cluster {{{1
+syn cluster rubyNotTop contains=@rubyCommentNotTop,@rubyStringNotTop,@rubyRegexpSpecial,@rubyDeclaration,@rubyExceptionHandler,@rubyClassOperator,rubyConditional,rubyModuleName,rubyClassName,rubySymbolDelimiter,rubyDoubleQuoteSymbolDelimiter,rubySingleQuoteSymbolDelimiter,rubyParentheses,@Spell
+
+" Whitespace Errors {{{1
+if exists("ruby_space_errors")
+ if !exists("ruby_no_trail_space_error")
+ syn match rubySpaceError display excludenl "\s\+$"
+ endif
+ if !exists("ruby_no_tab_space_error")
+ syn match rubySpaceError display " \+\t"me=e-1
+ endif
+endif
+
+" Operators {{{1
+
+syn match rubyEnglishBooleanOperator "\<\%(and\|or\|not\)\>"
+
+if exists("ruby_operators") || exists("ruby_pseudo_operators")
+ syn match rubyDotOperator "\.\|&\."
+
+ syn match rubyTernaryOperator "\%(\w\|[^\x00-\x7F]\)\@1<!?\|:"
+ syn match rubyArithmeticOperator "\*\*\|[*/%+]\|->\@!"
+ syn match rubyComparisonOperator "<=>\|<=\|<\|>=\|[-=]\@1<!>"
+ syn match rubyBitwiseOperator "[~^|]\|&\.\@!\|<<\|>>"
+ syn match rubyBooleanOperator "\%(\w\|[^\x00-\x7F]\)\@1<!!\|&&\|||"
+ syn match rubyRangeOperator "\.\.\.\="
+ syn match rubyAssignmentOperator "=>\@!\|-=\|/=\|\*\*=\|\*=\|&&=\|&=\|||=\||=\|%=\|+=\|>>=\|<<=\|\^="
+ syn match rubyAssignmentOperator "=>\@!" contained containedin=rubyBlockParameterList " TODO: this is inelegant
+ syn match rubyEqualityOperator "===\|==\|!=\|!\~\|=\~"
+
+ syn region rubyBracketOperator matchgroup=rubyOperator start="\%(\%(\w\|[^\x00-\x7F]\)[?!]\=\|[]})]\)\@2<=\[" end="]" contains=ALLBUT,@rubyNotTop
+
+ syn match rubyScopeOperator "::"
+ syn match rubySuperClassOperator "<" contained
+ syn match rubyEigenClassOperator "<<" contained
+ syn match rubyLambdaOperator "->"
+ syn match rubySplatOperator "\%([[{(|,=]\_s*\)\@<=\*"
+ syn match rubySplatOperator "\%(^\|\s\)\@1<=\*\%(\h\|[^\x00-\x7F]\|[:$@[]\)\@="
+ syn match rubyDoubleSplatOperator "\%([{(|,]\_s*\)\@<=\*\*"
+ syn match rubyDoubleSplatOperator "\s\@1<=\*\*\%(\h\|[^\x00-\x7F]\|[:$@{]\)\@="
+ syn match rubyProcOperator "\%([[(|,]\_s*\)\@<=&"
+ syn match rubyProcOperator "\s\@1<=&\%(\h\|[^\x00-\x7F]\|[:$@]\|->\)\@="
+
+ syn cluster rubyProperOperator contains=rubyTernaryOperator,rubyArithmeticOperator,rubyComparisonOperator,rubyBitwiseOperator,rubyBooleanOperator,rubyRangeOperator,rubyAssignmentOperator,rubyEqualityOperator,rubyDefinedOperator,rubyEnglishBooleanOperator
+ syn cluster rubyClassOperator contains=rubyEigenClassOperator,rubySuperClassOperator
+ syn cluster rubyPseudoOperator contains=rubyDotOperator,rubyScopeOperator,rubyEigenClassOperator,rubySuperClassOperator,rubyLambdaOperator,rubySplatOperator,rubyDoubleSplatOperator,rubyProcOperator
+ syn cluster rubyOperator contains=ruby.*Operator
+endif
+
+" String Interpolation and Backslash Notation {{{1
+syn region rubyInterpolation matchgroup=rubyInterpolationDelimiter start="#{" end="}" contained contains=ALLBUT,@rubyNotTop
+syn match rubyInterpolation "#\$\%(-\w\|[!$&"'*+,./0:;<>?@\`~_]\|\w\+\)" display contained contains=rubyInterpolationDelimiter,@rubyGlobalVariable
+syn match rubyInterpolation "#@@\=\w\+" display contained contains=rubyInterpolationDelimiter,rubyInstanceVariable,rubyClassVariable
+syn match rubyInterpolationDelimiter "#\ze[$@]" display contained
+
+syn match rubyStringEscape "\\\_." contained display
+syn match rubyStringEscape "\\\o\{1,3}\|\\x\x\{1,2}" contained display
+syn match rubyStringEscape "\\u\%(\x\{4}\|{\x\{1,6}\%(\s\+\x\{1,6}\)*}\)" contained display
+syn match rubyStringEscape "\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\\=.\)" contained display
+
+syn match rubyBackslashEscape "\\\\" contained display
+syn match rubyQuoteEscape "\\'" contained display
+syn match rubySpaceEscape "\\ " contained display
+
+syn match rubyParenthesisEscape "\\[()]" contained display
+syn match rubyCurlyBraceEscape "\\[{}]" contained display
+syn match rubyAngleBracketEscape "\\[<>]" contained display
+syn match rubySquareBracketEscape "\\[[\]]" contained display
+
+syn region rubyNestedParentheses start="(" skip="\\\\\|\\)" end=")" transparent contained
+syn region rubyNestedCurlyBraces start="{" skip="\\\\\|\\}" end="}" transparent contained
+syn region rubyNestedAngleBrackets start="<" skip="\\\\\|\\>" end=">" transparent contained
+syn region rubyNestedSquareBrackets start="\[" skip="\\\\\|\\\]" end="\]" transparent contained
+
+syn cluster rubySingleCharEscape contains=rubyBackslashEscape,rubyQuoteEscape,rubySpaceEscape,rubyParenthesisEscape,rubyCurlyBraceEscape,rubyAngleBracketEscape,rubySquareBracketEscape
+syn cluster rubyNestedBrackets contains=rubyNested.\+
+syn cluster rubyStringSpecial contains=rubyInterpolation,rubyStringEscape
+syn cluster rubyStringNotTop contains=@rubyStringSpecial,@rubyNestedBrackets,@rubySingleCharEscape
+
+" Regular Expression Metacharacters {{{1
+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
+syn region rubyRegexpBrackets matchgroup=rubyRegexpCharClass start="\[\^\=" skip="\\\\\|\\\]" end="\]" contained transparent contains=rubyRegexpBrackets,rubyStringEscape,rubyRegexpEscape,rubyRegexpCharClass,rubyRegexpIntersection oneline
+syn match rubyRegexpCharClass "\\[DdHhRSsWw]" contained display
+syn match rubyRegexpCharClass "\[:\^\=\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|xdigit\):\]" contained
+syn match rubyRegexpCharClass "\\[pP]{^\=.\{-}}" contained display
+syn match rubyRegexpEscape "\\[].*?+^$|\\/(){}[]" contained " see commit e477f10
+syn match rubyRegexpQuantifier "[*?+][?+]\=" contained display
+syn match rubyRegexpQuantifier "{\d\+\%(,\d*\)\=}?\=" contained display
+syn match rubyRegexpAnchor "[$^]\|\\[ABbGZz]" contained display
+syn match rubyRegexpDot "\.\|\\X" contained display
+syn match rubyRegexpIntersection "&&" contained display
+syn match rubyRegexpSpecial "\\K" contained display
+syn match rubyRegexpSpecial "|" contained display
+syn match rubyRegexpSpecial "\\[1-9]\d\=\d\@!" contained display
+syn match rubyRegexpSpecial "\\k<\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\=>" contained display
+syn match rubyRegexpSpecial "\\k'\%([a-z_]\w*\|-\=\d\+\)\%([+-]\d\+\)\='" contained display
+syn match rubyRegexpSpecial "\\g<\%([a-z_]\w*\|-\=\d\+\)>" contained display
+syn match rubyRegexpSpecial "\\g'\%([a-z_]\w*\|-\=\d\+\)'" contained display
+
+syn cluster rubyRegexpSpecial contains=@rubyStringSpecial,rubyRegexpSpecial,rubyRegexpEscape,rubyRegexpBrackets,rubyRegexpCharClass,rubyRegexpDot,rubyRegexpQuantifier,rubyRegexpAnchor,rubyRegexpParens,rubyRegexpComment,rubyRegexpIntersection
+
+" Numbers {{{1
+syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[xX]\x\+\%(_\x\+\)*r\=i\=\>" display
+syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0[dD]\)\=\%(0\|[1-9]\d*\%(_\d\+\)*\)r\=i\=\>" display
+syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[oO]\=\o\+\%(_\o\+\)*r\=i\=\>" display
+syn match rubyInteger "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<0[bB][01]\+\%(_[01]\+\)*r\=i\=\>" display
+syn match rubyFloat "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\.\d\+\%(_\d\+\)*r\=i\=\>" display
+syn match rubyFloat "\%(\%(\w\|[^\x00-\x7F]\|[]})\"']\s*\)\@<!-\)\=\<\%(0\|[1-9]\d*\%(_\d\+\)*\)\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)i\=\>" display
+
+" Identifiers {{{1
+syn match rubyClassName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
+syn match rubyModuleName "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@!" contained
+syn match rubyConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<[[:upper:]]\%(\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 rubyGlobalVariable "$\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\|-.\)"
+syn match rubySymbolDelimiter ":" contained
+syn match rubySymbol "[]})\"':]\@1<!:\%(\^\|\~@\|\~\|<<\|<=>\|<=\|<\|===\|[=!]=\|[=!]\~\|!@\|!\|>>\|>=\|>\||\|-@\|-\|/\|\[]=\|\[]\|\*\*\|\*\|&\|%\|+@\|+\|`\)" contains=rubySymbolDelimiter
+syn match rubySymbol "[]})\"':]\@1<!:\$\%(-.\|[`~<=>_,;:!?/.'"@$*\&+0]\)" contains=rubySymbolDelimiter
+syn match rubySymbol "[]})\"':]\@1<!:\%(\$\|@@\=\)\=\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*" contains=rubySymbolDelimiter
+syn match rubySymbol "[]})\"':]\@1<!:\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\%([?!=]>\@!\)\=" contains=rubySymbolDelimiter
+
+SynFold ':' syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:'" end="'" skip="\\\\\|\\'" contains=rubyQuoteEscape,rubyBackslashEscape
+SynFold ':' syn region rubySymbol matchgroup=rubySymbolDelimiter start="[]})\"':]\@1<!:\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial
+
+syn match rubyCapitalizedMethod "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\u\%(\w\|[^\x00-\x7F]\)*\>\%(\s*(\)\@="
+
+syn region rubyParentheses start="(" end=")" contains=ALLBUT,@rubyNotTop contained containedin=rubyBlockParameterList
+syn region rubyBlockParameterList start="\%(\%(\<do\>\|{\)\_s*\)\@32<=|" end="|" contains=ALLBUT,@rubyNotTop,@rubyProperOperator
+
+if exists('ruby_global_variable_error')
+ syn match rubyGlobalVariableError "$[^A-Za-z_]" display
+ syn match rubyGlobalVariableError "$-[^0FIKWadilpvw]" display
+endif
+
+syn match rubyPredefinedVariable #$[!$&"'*+,./0:;<>?@\`~]#
+syn match rubyPredefinedVariable "$\d\+" display
+syn match rubyPredefinedVariable "$_\>" display
+syn match rubyPredefinedVariable "$-[0FIWadilpvw]\>" display
+syn match rubyPredefinedVariable "$\%(stderr\|stdin\|stdout\)\>" display
+syn match rubyPredefinedVariable "$\%(DEBUG\|FILENAME\|LOADED_FEATURES\|LOAD_PATH\|PROGRAM_NAME\|SAFE\|VERBOSE\)\>" display
+syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(ARGF\|ARGV\|ENV\|DATA\|STDERR\|STDIN\|STDOUT\|TOPLEVEL_BINDING\)\>\%(\s*(\)\@!"
+syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(RUBY_\%(VERSION\|RELEASE_DATE\|PLATFORM\|PATCHLEVEL\|REVISION\|DESCRIPTION\|COPYRIGHT\|ENGINE\)\)\>\%(\s*(\)\@!"
+
+" Deprecated/removed in 1.9
+syn match rubyPredefinedVariable "$="
+syn match rubyPredefinedVariable "$-K\>" display
+syn match rubyPredefinedVariable "$\%(deferr\|defout\)\>" display
+syn match rubyPredefinedVariable "$KCODE\>" display
+" Deprecated/removed in 2.4
+syn match rubyPredefinedConstant "\%(\%(^\|[^.]\)\.\s*\)\@<!\<\%(FALSE\|NIL\|TRUE\)\>\%(\s*(\)\@!"
+
+syn cluster rubyGlobalVariable contains=rubyGlobalVariable,rubyPredefinedVariable,rubyGlobalVariableError
+
+" Normal Regular Expressions {{{1
+SynFold '/' syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(^\|\<\%(and\|or\|while\|until\|unless\|if\|elsif\|when\|not\|then\|else\)\|[;\~=!|&(,{[<>?:*+-]\)\s*\)\@<=/" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial nextgroup=@rubyModifier skipwhite
+SynFold '/' syn region rubyRegexp matchgroup=rubyRegexpDelimiter start="\%(\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\s\+\)\@<=/\%(=\|\_s\)\@!" end="/[iomxneus]*" skip="\\\\\|\\/" contains=@rubyRegexpSpecial nextgroup=@rubyModifier skipwhite
+
+" Generalized Regular Expressions {{{1
+SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial nextgroup=@rubyModifier skipwhite
+SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r{" end="}[iomxneus]*" skip="\\\\\|\\}" contains=@rubyRegexpSpecial
+SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r<" end=">[iomxneus]*" skip="\\\\\|\\>" contains=@rubyRegexpSpecial,rubyNestedAngleBrackets
+SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r\[" end="\][iomxneus]*" skip="\\\\\|\\\]" contains=@rubyRegexpSpecial
+SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r(" end=")[iomxneus]*" skip="\\\\\|\\)" contains=@rubyRegexpSpecial
+SynFold '%' syn region rubyRegexp matchgroup=rubyPercentRegexpDelimiter start="%r\z(\s\)" end="\z1[iomxneus]*" skip="\\\\\|\\\z1" contains=@rubyRegexpSpecial
+
+" Characters {{{1
+syn match rubyCharacter "\%(\w\|[^\x00-\x7F]\|[]})\"'/]\)\@1<!\%(?\%(\\M-\\C-\|\\C-\\M-\|\\M-\\c\|\\c\\M-\|\\c\|\\C-\|\\M-\)\=\%(\\\o\{1,3}\|\\x\x\{1,2}\|\\[[:space:]]\|\\\=[^[:space:]]\)\)"
+syn match rubyCharacter "\%(\w\|[^\x00-\x7F]\|[]})\"'/]\)\@1<!?\\u\%(\x\{4}\|{\x\{1,6}}\)"
+
+" Normal Strings {{{1
+let s:spell_cluster = exists('ruby_spellcheck_strings') ? ',@Spell' : ''
+let s:fold_arg = s:foldable('string') ? ' fold' : ''
+exe 'syn region rubyString matchgroup=rubyStringDelimiter start="\"" end="\"" skip="\\\\\|\\\"" contains=@rubyStringSpecial' . s:spell_cluster . s:fold_arg
+exe 'syn region rubyString matchgroup=rubyStringDelimiter start="''" end="''" skip="\\\\\|\\''" contains=rubyQuoteEscape,rubyBackslashEscape' . s:spell_cluster . s:fold_arg
+unlet s:spell_cluster s:fold_arg
+
+" Shell Command Output {{{1
+SynFold 'string' syn region rubyString matchgroup=rubyStringDelimiter start="`" end="`" skip="\\\\\|\\`" contains=@rubyStringSpecial
+
+" Generalized Single Quoted Strings, Symbols, Array of Strings and Array of Symbols {{{1
+
+" Non-bracket punctuation delimiters {{{2
+let s:names = { '~': 'Tilde', '`': 'BackQuote', '!': 'Bang', '@': 'At', '#': 'Hash', '$': 'Dollar', '%': 'Percent', '^': 'Caret',
+ \ '&': 'Ampersand', '*': 'Asterix', '_': 'Underscore', '-': 'Dash', '+': 'Plus', '=': 'Equals', '|': 'Bar',
+ \ '\': 'Backslash', ':': 'Colon', ';': 'Semicolon', '"': 'DoubleQuote', "'": 'Quote', ',': 'Comma', '.': 'Period',
+ \ '?': 'QuestionMark', '/': 'ForwardSlash' }
+
+for s:delimiter in keys(s:names)
+ let s:group = 'ruby' . s:names[s:delimiter] . 'Escape'
+
+ if s:delimiter =~ '[\"]'
+ let s:delimiter = '\' . s:delimiter
+ endif
+
+ exe 'syn match ' . s:group . ' "\V\\' . s:delimiter . '" contained display'
+ exe 'syn cluster rubySingleCharEscape add=' . s:group
+ exe 'SynFold ''%'' syn region rubyString matchgroup=rubyPercentStringDelimiter start="\V%q' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
+ exe 'SynFold ''%'' syn region rubyString matchgroup=rubyPercentStringDelimiter start="\V%w' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,rubySpaceEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
+ exe 'SynFold ''%'' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="\V%s' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
+ exe 'SynFold ''%'' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="\V%i' . s:delimiter . '" end="\V' . s:delimiter . '" skip="\V\\\\\|\\' . s:delimiter . '" contains=rubyBackslashEscape,rubySpaceEscape,' . s:group . ' nextgroup=@rubyModifier skipwhite'
+ exe 'hi def link ' . s:group . ' rubyStringEscape'
+endfor
+
+unlet s:delimiter s:group s:names
+" }}}2
+
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q{" end="}" skip="\\\\\|\\}" contains=rubyBackslashEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q<" end=">" skip="\\\\\|\\>" contains=rubyBackslashEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q\[" end="\]" skip="\\\\\|\\\]" contains=rubyBackslashEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q(" end=")" skip="\\\\\|\\)" contains=rubyBackslashEscape,rubyParenthesisEscape,rubyNestedParentheses
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%q\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=rubyBackslashEscape,rubySpaceEscape
+
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w{" end="}" skip="\\\\\|\\}" contains=rubyBackslashEscape,rubySpaceEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w<" end=">" skip="\\\\\|\\>" contains=rubyBackslashEscape,rubySpaceEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w\[" end="\]" skip="\\\\\|\\\]" contains=rubyBackslashEscape,rubySpaceEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%w(" end=")" skip="\\\\\|\\)" contains=rubyBackslashEscape,rubySpaceEscape,rubyParenthesisEscape,rubyNestedParentheses
+
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s{" end="}" skip="\\\\\|\\}" contains=rubyBackslashEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s<" end=">" skip="\\\\\|\\>" contains=rubyBackslashEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s\[" end="\]" skip="\\\\\|\\\]" contains=rubyBackslashEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%s(" end=")" skip="\\\\\|\\)" contains=rubyBackslashEscape,rubyParenthesisEscape,rubyNestedParentheses
+SynFold '%' syn region rubyString matchgroup=rubyPercentSymbolDelimiter start="%s\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=rubyBackslashEscape,rubySpaceEscape
+
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i{" end="}" skip="\\\\\|\\}" contains=rubyBackslashEscape,rubySpaceEscape,rubyCurlyBraceEscape,rubyNestedCurlyBraces
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i<" end=">" skip="\\\\\|\\>" contains=rubyBackslashEscape,rubySpaceEscape,rubyAngleBracketEscape,rubyNestedAngleBrackets
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i\[" end="\]" skip="\\\\\|\\\]" contains=rubyBackslashEscape,rubySpaceEscape,rubySquareBracketEscape,rubyNestedSquareBrackets
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%i(" end=")" skip="\\\\\|\\)" contains=rubyBackslashEscape,rubySpaceEscape,rubyParenthesisEscape,rubyNestedParentheses
+
+" Generalized Double Quoted Strings, Array of Strings, Array of Symbols and Shell Command Output {{{1
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="\%(\%(\w\|[^\x00-\x7F]\|]\)\s*\)\@<!%=" end="=" skip="\\\\\|\\=" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%\z([~`!@#$%^&*_\-+|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\={" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\=<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\=\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[QWx]\=(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses
+SynFold '%' syn region rubyString matchgroup=rubyPercentStringDelimiter start="%[Qx]\z(\s\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial
+
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I\z([~`!@#$%^&*_\-+=|\:;"',.?/]\)" end="\z1" skip="\\\\\|\\\z1" contains=@rubyStringSpecial nextgroup=@rubyModifier skipwhite
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I{" end="}" skip="\\\\\|\\}" contains=@rubyStringSpecial,rubyNestedCurlyBraces
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I<" end=">" skip="\\\\\|\\>" contains=@rubyStringSpecial,rubyNestedAngleBrackets
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I\[" end="\]" skip="\\\\\|\\\]" contains=@rubyStringSpecial,rubyNestedSquareBrackets
+SynFold '%' syn region rubySymbol matchgroup=rubyPercentSymbolDelimiter start="%I(" end=")" skip="\\\\\|\\)" contains=@rubyStringSpecial,rubyNestedParentheses
+
+" Here Documents {{{1
+syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs\%(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
+
+syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs"\%([^"]*\)"+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
+syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs'\%([^']*\)'+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
+syn region rubyHeredocStart matchgroup=rubyHeredocDelimiter start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<[-~]\=\zs`\%([^`]*\)`+ end=+$+ oneline contains=ALLBUT,@rubyNotTop
+
+SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyHeredocDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
+SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyHeredocDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
+SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyHeredocDelimiter end=+^\z1$+ contains=rubyHeredocStart keepend
+SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})"'`]\)\s\|\w\)\@<!<<`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+2 matchgroup=rubyHeredocDelimiter end=+^\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
+
+SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]\z(\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
+SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]"\z([^"]*\)"\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
+SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]'\z([^']*\)'\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart keepend
+SynFold '<<' syn region rubyString start=+\%(\%(class\|::\|\.\@1<!\.\)\_s*\|\%([]})]\)\s\|\w\)\@<!<<[-~]`\z([^`]*\)`\ze\%(.*<<[-~]\=['`"]\=\h\)\@!+hs=s+3 matchgroup=rubyHeredocDelimiter end=+^\s*\zs\z1$+ contains=rubyHeredocStart,@rubyStringSpecial keepend
+
+" Module, Class, Method and Alias Declarations {{{1
+syn match rubyAliasDeclaration "[^[:space:];#.()]\+" contained contains=rubySymbol,@rubyGlobalVariable nextgroup=rubyAliasDeclaration2 skipwhite
+syn match rubyAliasDeclaration2 "[^[:space:];#.()]\+" contained contains=rubySymbol,@rubyGlobalVariable
+syn match rubyMethodDeclaration "[^[:space:];#(]\+" contained contains=rubyConstant,rubyBoolean,rubyPseudoVariable,rubyInstanceVariable,rubyClassVariable,rubyGlobalVariable
+syn match rubyClassDeclaration "[^[:space:];#<]\+" contained contains=rubyClassName,rubyScopeOperator nextgroup=rubySuperClassOperator skipwhite
+syn match rubyModuleDeclaration "[^[:space:];#<]\+" contained contains=rubyModuleName,rubyScopeOperator
+
+syn match rubyMethodName "\<\%([_[:alpha:]]\|[^\x00-\x7F]\)\%([_[:alnum:]]\|[^\x00-\x7F]\)*[?!=]\=\%([[:alnum:]_.:?!=]\|[^\x00-\x7F]\)\@!" contained containedin=rubyMethodDeclaration
+syn match rubyMethodName "\%(\s\|^\)\@1<=\%([_[:alpha:]]\|[^\x00-\x7F]\)\%([_[:alnum:]]\|[^\x00-\x7F]\)*[?!=]\=\%(\s\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2
+syn match rubyMethodName "\%([[:space:].]\|^\)\@1<=\%(\[\]=\=\|\*\*\|[-+!~]@\=\|[*/%|&^~]\|<<\|>>\|[<>]=\=\|<=>\|===\|[=!]=\|[=!]\~\|!\|`\)\%([[:space:];#(]\|$\)\@=" contained containedin=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration
+
+syn cluster rubyDeclaration contains=rubyAliasDeclaration,rubyAliasDeclaration2,rubyMethodDeclaration,rubyModuleDeclaration,rubyClassDeclaration,rubyMethodName
+
+" Keywords {{{1
+" TODO: reorganise
+syn match rubyControl "\%#=1\<\%(break\|in\|next\|redo\|retry\|return\)\>"
+syn match rubyKeyword "\%#=1\<\%(super\|yield\)\>"
+syn match rubyBoolean "\%#=1\<\%(true\|false\)\>[?!]\@!"
+syn match rubyPseudoVariable "\%#=1\<\(self\|nil\)\>[?!]\@!"
+syn match rubyPseudoVariable "\%#=1\<__\%(ENCODING\|dir\|FILE\|LINE\|callee\|method\)__\>"
+syn match rubyBeginEnd "\%#=1\<\%(BEGIN\|END\)\>"
+
+" 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
+ syn match rubyDefine "\<undef\>" nextgroup=rubyMethodName skipwhite skipnl
+ syn match rubyClass "\<class\>" nextgroup=rubyClassDeclaration,rubyEigenClassOperator skipwhite skipnl
+ syn match rubyModule "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
+
+ SynFold 'def' syn region rubyMethodBlock start="\<def\>" matchgroup=rubyDefine skip="\<end:\|\%(\<def\_s\+\)\@<=end\>" end="\<end\>" contains=ALLBUT,@rubyNotTop
+ SynFold 'class' syn region rubyClassBlock start="\<class\>" matchgroup=rubyClass skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
+ SynFold 'module' syn region rubyModuleBlock start="\<module\>" matchgroup=rubyModule skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
+
+ " endless def
+ syn match rubyDefine "\<def\s\+\ze[^[:space:];#(]\+\%(\s\+\|\s*(.*)\s*\)=" nextgroup=rubyMethodDeclaration skipwhite
+
+ " modifiers
+ syn match rubyLineContinuation "\\$" nextgroup=@rubyModifier skipwhite skipnl
+ syn match rubyConditionalModifier "\<\%(if\|unless\)\>"
+ syn match rubyRepeatModifier "\<\%(while\|until\)\>"
+ syn match rubyRescueModifier "\<rescue\>"
+
+ syn cluster rubyModifier contains=rubyConditionalModifier,rubyRepeatModifier,rubyRescueModifier
+
+ SynFold 'do' syn region rubyDoBlock matchgroup=rubyControl start="\<do\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
+
+ " curly bracket block or hash literal
+ SynFold '{' syn region rubyCurlyBlock matchgroup=rubyCurlyBlockDelimiter start="{" end="}" contains=ALLBUT,@rubyNotTop
+ SynFold '[' syn region rubyArrayLiteral matchgroup=rubyArrayDelimiter start="\%(\%(\w\|[^\x00-\x7F]\)[?!]\=\|[]})]\)\@2<!\[" end="]" contains=ALLBUT,@rubyNotTop
+
+ " statements without 'do'
+ SynFold 'begin' syn region rubyBlockExpression matchgroup=rubyControl start="\<begin\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
+ SynFold 'case' syn region rubyCaseExpression matchgroup=rubyConditional start="\<case\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
+
+ SynFold 'if' syn region rubyConditionalExpression matchgroup=rubyConditional start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\<then\s\|\%(\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\@<![?!]\)\s*\)\@<=\%(if\|unless\)\>" skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop
+
+ syn match rubyConditional "\<\%(then\|else\|when\)\>" contained containedin=rubyCaseExpression
+ syn match rubyConditional "\<\%(then\|else\|elsif\)\>" contained containedin=rubyConditionalExpression
+
+ syn match rubyExceptionHandler "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>" contained containedin=rubyBlockExpression,rubyDoBlock
+ syn match rubyExceptionHandler2 "\<\%(\%(\%(;\|^\)\s*\)\@<=rescue\|else\|ensure\)\>" contained containedin=rubyModuleBlock,rubyClassBlock,rubyMethodBlock
+ syn cluster rubyExceptionHandler contains=rubyExceptionHandler,rubyExceptionHandler2
+
+ " statements with optional 'do'
+ syn region rubyOptionalDoLine matchgroup=rubyRepeat start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\@<![!?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyOptionalDo end="\<do\>" end="\ze\%(;\|$\)" oneline contains=ALLBUT,@rubyNotTop
+
+ SynFold 'for' syn region rubyRepeatExpression start="\<for\>" start="\%(\%(^\|\.\.\.\=\|[{:,;([<>~\*/%&^|+=-]\|\%(\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*\)\@<![!?]\)\s*\)\@<=\<\%(until\|while\)\>" matchgroup=rubyRepeat skip="\<end:" end="\<end\>" contains=ALLBUT,@rubyNotTop nextgroup=rubyOptionalDoLine
+
+ if !exists("ruby_minlines")
+ let ruby_minlines = 500
+ endif
+ exe "syn sync minlines=" . ruby_minlines
+
+else
+ syn match rubyControl "\<def\>" nextgroup=rubyMethodDeclaration skipwhite skipnl
+ syn match rubyControl "\<class\>" nextgroup=rubyClassDeclaration skipwhite skipnl
+ syn match rubyControl "\<module\>" nextgroup=rubyModuleDeclaration skipwhite skipnl
+ syn match rubyControl "\<\%(case\|begin\|do\|for\|if\|unless\|while\|until\|else\|elsif\|rescue\|ensure\|then\|when\|end\)\>"
+ syn match rubyKeyword "\<\%(alias\|undef\)\>"
+endif
+
+" Special Methods {{{1
+if !exists("ruby_no_special_methods")
+ syn match rubyAccess "\<\%(public\|protected\|private\)\>" " use re=2
+ syn match rubyAccess "\%#=1\<\%(public\|private\)_class_method\>"
+ syn match rubyAccess "\%#=1\<\%(public\|private\)_constant\>"
+ syn match rubyAccess "\%#=1\<module_function\>"
+ syn match rubyAttribute "\%#=1\%(\%(^\|;\)\s*\)\@<=attr\>\(\s*[.=]\)\@!" " attr is a common variable name
+ syn match rubyAttribute "\%#=1\<attr_\%(accessor\|reader\|writer\)\>"
+ syn match rubyControl "\%#=1\<\%(abort\|at_exit\|exit\|fork\|loop\|trap\)\>"
+ syn match rubyEval "\%#=1\<eval\>"
+ syn match rubyEval "\%#=1\<\%(class\|instance\|module\)_eval\>"
+ syn match rubyException "\%#=1\<\%(raise\|fail\|catch\|throw\)\>"
+ syn match rubyInclude "\%#=1\<\%(autoload\|gem\|load\|require\%(_relative\)\=\)\>"
+ syn match rubyKeyword "\%#=1\<\%(callcc\|caller\|lambda\|proc\)\>"
+ syn match rubyMacro "\%#=1\<\%(extend\|include\|prepend\|refine\|using\)\>"
+ syn match rubyMacro "\%#=1\<\%(alias\|define\|define_singleton\|remove\|undef\)_method\>"
+endif
+
+" Comments and Documentation {{{1
+syn match rubySharpBang "\%^#!.*" display
+syn keyword rubyTodo FIXME NOTE TODO OPTIMIZE HACK REVIEW XXX todo contained
+syn match rubyEncoding "[[:alnum:]-_]\+" contained display
+syn match rubyMagicComment "\c\%<3l#\s*\zs\%(coding\|encoding\):" contained nextgroup=rubyEncoding skipwhite
+syn match rubyMagicComment "\c\%<10l#\s*\zs\%(frozen_string_literal\|warn_indent\|warn_past_scope\):" contained nextgroup=rubyBoolean skipwhite
+syn match rubyMagicComment "\c\%<10l#\s*\zs\%(shareable_constant_value\):" contained nextgroup=rubyEncoding skipwhite
+syn match rubyComment "#.*" contains=@rubyCommentSpecial,rubySpaceError,@Spell
+
+syn cluster rubyCommentSpecial contains=rubySharpBang,rubyTodo,rubyMagicComment
+syn cluster rubyCommentNotTop contains=@rubyCommentSpecial,rubyEncoding
+
+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
+
+" {{{1 Useless Line Continuations
+syn match rubyUselessLineContinuation "\%([.:,;{([<>~\*%&^|+=-]\|%(\%(\w\|[^\x00-\x7F]\)\@1<![?!]\)\s*\zs\\$" nextgroup=rubyUselessLineContinuation skipwhite skipempty
+syn match rubyUselessLineContinuation "\\$" nextgroup=rubyUselessLineContinuation skipwhite skipempty contained
+
+" Keyword Nobbling {{{1
+" prevent methods with keyword names being highlighted as keywords when called
+syn match rubyKeywordAsMethod "\%(\%(\.\@1<!\.\)\|&\.\|::\)\_s*\%([_[:lower:]][_[:alnum:]]*\|\%(BEGIN\|END\)\>\)" transparent contains=rubyDotOperator,rubyScopeOperator
+
+" Bang and Predicate Methods and Operators {{{1
+syn match rubyBangPredicateMethod "\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[?!]"
+
+if !exists("ruby_no_special_methods")
+ syn match rubyControl "\%#=1\<exit!" display
+endif
+syn match rubyDefinedOperator "\%#=1\<defined?" display
+
+" 1.9-style Hash Keys and Keyword Parameters {{{1
+syn match rubySymbol "\%(\w\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[?!]\=::\@!"he=e-1 contained containedin=rubyBlockParameterList,rubyCurlyBlock
+syn match rubySymbol "[]})\"':]\@1<!\<\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],;]\@="he=e-1
+syn match rubySymbol "[[:space:],{(]\%(\h\|[^\x00-\x7F]\)\%(\w\|[^\x00-\x7F]\)*[!?]\=:[[:space:],;]\@="hs=s+1,he=e-1
+syn match rubySingleQuoteSymbolDelimiter "'" contained
+syn match rubySymbol "'\%(\\.\|[^']\)*'::\@!"he=e-1 contains=rubyQuoteEscape,rubyBackslashEscape,rubySingleQuoteSymbolDelimiter
+syn match rubyDoubleQuoteSymbolDelimiter "\"" contained
+syn match rubySymbol "\"\%(\\.\|[^\"]\)*\"::\@!"he=e-1 contains=@rubyStringSpecial,rubyDoubleQuoteSymbolDelimiter
+
+" __END__ Directive {{{1
+SynFold '__END__' syn region rubyData matchgroup=rubyDataDirective start="^__END__$" end="\%$"
+
+" Default Highlighting {{{1
+hi def link rubyClass rubyDefine
+hi def link rubyModule rubyDefine
+hi def link rubyExceptionHandler2 rubyDefine
+hi def link rubyDefine Define
+hi def link rubyAccess rubyMacro
+hi def link rubyAttribute rubyMacro
+hi def link rubyMacro Macro
+hi def link rubyMethodName rubyFunction
+hi def link rubyFunction Function
+hi def link rubyConditional Conditional
+hi def link rubyConditionalModifier rubyConditional
+hi def link rubyExceptionHandler rubyConditional
+hi def link rubyRescueModifier rubyExceptionHandler
+hi def link rubyRepeat Repeat
+hi def link rubyRepeatModifier rubyRepeat
+hi def link rubyOptionalDo rubyRepeat
+hi def link rubyControl Statement
+hi def link rubyInclude Include
+hi def link rubyInteger Number
+hi def link rubyCharacter Character
+hi def link rubyFloat Float
+hi def link rubyBoolean Boolean
+hi def link rubyException Exception
+if !exists("ruby_no_identifiers")
+ hi def link rubyIdentifier Identifier
+else
+ hi def link rubyIdentifier NONE
+endif
+hi def link rubyClassVariable rubyIdentifier
+hi def link rubyConstant Type
+hi def link rubyClassName rubyConstant
+hi def link rubyModuleName rubyConstant
+hi def link rubyGlobalVariable rubyIdentifier
+hi def link rubyInstanceVariable rubyIdentifier
+hi def link rubyPredefinedIdentifier rubyIdentifier
+hi def link rubyPredefinedConstant rubyPredefinedIdentifier
+hi def link rubyPredefinedVariable rubyPredefinedIdentifier
+hi def link rubySymbol Constant
+hi def link rubyKeyword Keyword
+
+hi def link rubyOperator Operator
+hi def link rubyDefinedOperator rubyOperator
+hi def link rubyEnglishBooleanOperator rubyOperator
+if exists("ruby_operators")
+ hi def link rubyTernaryOperator rubyOperator
+ hi def link rubyArithmeticOperator rubyOperator
+ hi def link rubyComparisonOperator rubyOperator
+ hi def link rubyBitwiseOperator rubyOperator
+ hi def link rubyBooleanOperator rubyOperator
+ hi def link rubyRangeOperator rubyOperator
+ hi def link rubyAssignmentOperator rubyOperator
+ hi def link rubyEqualityOperator rubyOperator
+endif
+
+if exists("ruby_pseudo_operators")
+ hi def link rubyPseudoOperator Special
+ hi def link rubyDotOperator rubyPseudoOperator
+ hi def link rubyScopeOperator rubyPseudoOperator
+ hi def link rubySuperClassOperator rubyPseudoOperator
+ hi def link rubyEigenClassOperator rubyPseudoOperator
+ hi def link rubyLambdaOperator rubyPseudoOperator
+ hi def link rubyDoubleSplatOperator rubyPseudoOperator
+ hi def link rubySplatOperator rubyPseudoOperator
+ hi def link rubyProcOperator rubyPseudoOperator
+endif
+
+hi def link rubyBeginEnd Statement
+hi def link rubyEval Statement
+hi def link rubyPseudoVariable Constant
+hi def link rubyCapitalizedMethod NONE
+
+hi def link rubyComment Comment
+hi def link rubyEncoding Constant
+hi def link rubyMagicComment SpecialComment
+hi def link rubyData Comment
+hi def link rubyDataDirective Delimiter
+hi def link rubyDocumentation Comment
+hi def link rubyTodo Todo
+
+hi def link rubyBackslashEscape rubyStringEscape
+hi def link rubyQuoteEscape rubyStringEscape
+hi def link rubySpaceEscape rubyStringEscape
+hi def link rubyParenthesisEscape rubyStringEscape
+hi def link rubyCurlyBraceEscape rubyStringEscape
+hi def link rubyAngleBracketEscape rubyStringEscape
+hi def link rubySquareBracketEscape rubyStringEscape
+hi def link rubyStringEscape Special
+
+hi def link rubyInterpolationDelimiter Delimiter
+hi def link rubySharpBang PreProc
+hi def link rubyStringDelimiter Delimiter
+hi def link rubyHeredocDelimiter rubyStringDelimiter
+hi def link rubyPercentRegexpDelimiter rubyRegexpDelimiter
+hi def link rubyPercentStringDelimiter rubyStringDelimiter
+hi def link rubyPercentSymbolDelimiter rubySymbolDelimiter
+hi def link rubyDoubleQuoteSymbolDelimiter rubySymbolDelimiter
+hi def link rubySingleQuoteSymbolDelimiter rubySymbolDelimiter
+hi def link rubyRegexpDelimiter rubyStringDelimiter
+hi def link rubySymbolDelimiter rubySymbol
+hi def link rubyString String
+hi def link rubyRegexpEscape rubyRegexpSpecial
+hi def link rubyRegexpQuantifier rubyRegexpSpecial
+hi def link rubyRegexpAnchor rubyRegexpSpecial
+hi def link rubyRegexpDot rubyRegexpCharClass
+hi def link rubyRegexpCharClass rubyRegexpSpecial
+hi def link rubyRegexpIntersection rubyRegexpSpecial
+hi def link rubyRegexpSpecial Special
+hi def link rubyRegexpComment Comment
+hi def link rubyRegexp rubyString
+
+hi def link rubyError Error
+if exists("ruby_line_continuation_error")
+ hi def link rubyUselessLineContinuation rubyError
+endif
+hi def link rubyGlobalVariableError rubyError
+hi def link rubySpaceError rubyError
+
+" Postscript {{{1
+let b:current_syntax = "ruby"
+
+let &cpo = s:cpo_sav
+unlet! s:cpo_sav
+
+delc SynFold
+
+" 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 0000000..5734330
--- /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
new file mode 100644
index 0000000..e096436
--- /dev/null
+++ b/runtime/syntax/samba.vim
@@ -0,0 +1,118 @@
+" Vim syntax file
+" Language: samba configuration files (smb.conf)
+" Maintainer: Rafael Garcia-Suarez <rgarciasuarez@free.fr>
+" URL: http://rgarciasuarez.free.fr/vim/syntax/samba.vim
+" Last change: 2009 Aug 06
+"
+" New maintainer wanted!
+"
+" Don't forget to run your config file through testparm(1)!
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn match sambaParameter /^[a-zA-Z \t]\+=/ contains=sambaKeyword
+syn match sambaSection /^\s*\[[a-zA-Z0-9_\-.$ ]\+\]/
+syn match sambaMacro /%[SPugUGHvhmLMNpRdaITD]/
+syn match sambaMacro /%$([a-zA-Z0-9_]\+)/
+syn match sambaComment /^\s*[;#].*/
+syn match sambaContinue /\\$/
+syn keyword sambaBoolean true false yes no
+
+" Keywords for Samba 2.0.5a
+syn keyword sambaKeyword contained account acl action add address admin aliases
+syn keyword sambaKeyword contained allow alternate always announce anonymous
+syn keyword sambaKeyword contained archive as auto available bind blocking
+syn keyword sambaKeyword contained bmpx break browsable browse browseable ca
+syn keyword sambaKeyword contained cache case casesignames cert certDir
+syn keyword sambaKeyword contained certFile change char character chars chat
+syn keyword sambaKeyword contained ciphers client clientcert code coding
+syn keyword sambaKeyword contained command comment compatibility config
+syn keyword sambaKeyword contained connections contention controller copy
+syn keyword sambaKeyword contained create deadtime debug debuglevel default
+syn keyword sambaKeyword contained delete deny descend dfree dir directory
+syn keyword sambaKeyword contained disk dns domain domains dont dos dot drive
+syn keyword sambaKeyword contained driver encrypt encrypted equiv exec fake
+syn keyword sambaKeyword contained file files filetime filetimes filter follow
+syn keyword sambaKeyword contained force fstype getwd group groups guest
+syn keyword sambaKeyword contained hidden hide home homedir hosts include
+syn keyword sambaKeyword contained interfaces interval invalid keepalive
+syn keyword sambaKeyword contained kernel key ldap length level level2 limit
+syn keyword sambaKeyword contained links list lm load local location lock
+syn keyword sambaKeyword contained locking locks log logon logons logs lppause
+syn keyword sambaKeyword contained lpq lpresume lprm machine magic mangle
+syn keyword sambaKeyword contained mangled mangling map mask master max mem
+syn keyword sambaKeyword contained message min mode modes mux name names
+syn keyword sambaKeyword contained netbios nis notify nt null offset ok ole
+syn keyword sambaKeyword contained only open oplock oplocks options order os
+syn keyword sambaKeyword contained output packet page panic passwd password
+syn keyword sambaKeyword contained passwords path permissions pipe port ports
+syn keyword sambaKeyword contained postexec postscript prediction preexec
+syn keyword sambaKeyword contained prefered preferred preload preserve print
+syn keyword sambaKeyword contained printable printcap printer printers
+syn keyword sambaKeyword contained printing program protocol proxy public
+syn keyword sambaKeyword contained queuepause queueresume raw read readonly
+syn keyword sambaKeyword contained realname remote require resign resolution
+syn keyword sambaKeyword contained resolve restrict revalidate rhosts root
+syn keyword sambaKeyword contained script security sensitive server servercert
+syn keyword sambaKeyword contained service services set share shared short
+syn keyword sambaKeyword contained size smb smbrun socket space ssl stack stat
+syn keyword sambaKeyword contained status strict string strip suffix support
+syn keyword sambaKeyword contained symlinks sync syslog system time timeout
+syn keyword sambaKeyword contained times timestamp to trusted ttl unix update
+syn keyword sambaKeyword contained use user username users valid version veto
+syn keyword sambaKeyword contained volume wait wide wins workgroup writable
+syn keyword sambaKeyword contained write writeable xmit
+
+" New keywords for Samba 2.0.6
+syn keyword sambaKeyword contained hook hires pid uid close rootpreexec
+
+" New keywords for Samba 2.0.7
+syn keyword sambaKeyword contained utmp wtmp hostname consolidate
+syn keyword sambaKeyword contained inherit source environment
+
+" New keywords for Samba 2.2.0
+syn keyword sambaKeyword contained addprinter auth browsing deleteprinter
+syn keyword sambaKeyword contained enhanced enumports filemode gid host jobs
+syn keyword sambaKeyword contained lanman msdfs object os2 posix processes
+syn keyword sambaKeyword contained scope separator shell show smbd template
+syn keyword sambaKeyword contained total vfs winbind wizard
+
+" New keywords for Samba 2.2.1
+syn keyword sambaKeyword contained large obey pam readwrite restrictions
+syn keyword sambaKeyword contained unreadable
+
+" New keywords for Samba 2.2.2 - 2.2.4
+syn keyword sambaKeyword contained acls allocate bytes count csc devmode
+syn keyword sambaKeyword contained disable dn egd entropy enum extensions mmap
+syn keyword sambaKeyword contained policy spin spoolss
+
+" Since Samba 3.0.2
+syn keyword sambaKeyword contained abort afs algorithmic backend
+syn keyword sambaKeyword contained charset cups defer display
+syn keyword sambaKeyword contained enable idmap kerberos lookups
+syn keyword sambaKeyword contained methods modules nested NIS ntlm NTLMv2
+syn keyword sambaKeyword contained objects paranoid partners passdb
+syn keyword sambaKeyword contained plaintext prefix primary private
+syn keyword sambaKeyword contained profile quota realm replication
+syn keyword sambaKeyword contained reported rid schannel sendfile sharing
+syn keyword sambaKeyword contained shutdown signing special spnego
+syn keyword sambaKeyword contained store unknown unwriteable
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/sas.vim b/runtime/syntax/sas.vim
new file mode 100644
index 0000000..fad6066
--- /dev/null
+++ b/runtime/syntax/sas.vim
@@ -0,0 +1,265 @@
+" Vim syntax file
+" 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
+ syntax clear
+elseif exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case ignore
+
+" 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.
+syn sync fromstart
+
+let b:current_syntax = "sas"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/sass.vim b/runtime/syntax/sass.vim
new file mode 100644
index 0000000..8f41aba
--- /dev/null
+++ b/runtime/syntax/sass.vim
@@ -0,0 +1,106 @@
+" Vim syntax file
+" Language: Sass
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Filenames: *.sass
+" Last Change: 2022 Mar 15
+
+if exists("b:current_syntax")
+ finish
+endif
+
+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,sassEndOfLineComment,scssComment,cssValue.*,cssColor,cssURL,sassDefault,cssImportant,cssError,cssStringQ,cssStringQQ,cssFunction,cssUnicodeEscape,cssRenderProp
+
+syn region sassDefinition matchgroup=cssBraces start="{" end="}" contains=TOP
+
+syn match sassProperty "\%([{};]\s*\|^\)\@<=\%([[:alnum:]-]\|#{[^{}]*}\)\+\s*:" contains=css.*Prop skipwhite nextgroup=sassCssAttribute contained containedin=sassDefinition
+syn match sassProperty "^\s*\zs\s\%(\%([[:alnum:]-]\|#{[^{}]*}\)\+\s*:\|:[[:alnum:]-]\+\)"hs=s+1 contains=css.*Prop skipwhite nextgroup=sassCssAttribute
+syn match sassProperty "^\s*\zs\s\%(:\=[[:alnum:]-]\+\s*=\)"hs=s+1 contains=css.*Prop skipwhite nextgroup=sassCssAttribute
+syn match sassCssAttribute +\%("\%([^"]\|\\"\)*"\|'\%([^']\|\\'\)*'\|#{[^{}]*}\|[^{};]\)*+ contained contains=@sassCssAttributes,sassVariable,sassFunction,sassInterpolation
+syn match sassFlag "!\%(default\|global\|optional\)\>" contained
+syn match sassVariable "$[[:alnum:]_-]\+"
+syn match sassVariableAssignment "\%([!$][[:alnum:]_-]\+\s*\)\@<=\%(||\)\==" nextgroup=sassCssAttribute skipwhite
+syn match sassVariableAssignment "\%([!$][[:alnum:]_-]\+\s*\)\@<=:" nextgroup=sassCssAttribute skipwhite
+
+syn match sassFunction "\<\%(rgb\|rgba\|red\|green\|blue\|mix\)\>(\@=" contained
+syn match sassFunction "\<\%(hsl\|hsla\|hue\|saturation\|lightness\|adjust-hue\|lighten\|darken\|saturate\|desaturate\|grayscale\|complement\)\>(\@=" contained
+syn match sassFunction "\<\%(alpha\|opacity\|rgba\|opacify\|fade-in\|transparentize\|fade-out\)\>(\@=" contained
+syn match sassFunction "\<\%(unquote\|quote\)\>(\@=" contained
+syn match sassFunction "\<\%(percentage\|round\|ceil\|floor\|abs\)\>(\@=" contained
+syn match sassFunction "\<\%(type-of\|unit\|unitless\|comparable\)\>(\@=" contained
+
+syn region sassInterpolation matchgroup=sassInterpolationDelimiter start="#{" end="}" contains=@sassCssAttributes,sassVariable,sassFunction containedin=cssStringQ,cssStringQQ,cssPseudoClass,sassProperty
+
+syn match sassMixinName "[[:alnum:]_-]\+" contained nextgroup=sassCssAttribute
+syn match sassMixin "^=" nextgroup=sassMixinName skipwhite
+syn match sassMixin "\%([{};]\s*\|^\s*\)\@<=@mixin" nextgroup=sassMixinName skipwhite
+syn match sassMixing "^\s\+\zs+" nextgroup=sassMixinName
+syn match sassMixing "\%([{};]\s*\|^\s*\)\@<=@include" nextgroup=sassMixinName skipwhite
+syn match sassExtend "\%([{};]\s*\|^\s*\)\@<=@extend"
+
+syn match sassFunctionName "[[:alnum:]_-]\+" contained nextgroup=sassCssAttribute
+syn match sassFunctionDecl "\%([{};]\s*\|^\s*\)\@<=@function" nextgroup=sassFunctionName skipwhite
+syn match sassReturn "\%([{};]\s*\|^\s*\)\@<=@return"
+
+syn match sassEscape "^\s*\zs\\"
+syn match sassIdChar "#[[:alnum:]_-]\@=" nextgroup=sassId
+syn match sassId "[[:alnum:]_-]\+" contained
+syn match sassClassChar "\.[[:alnum:]_-]\@=" nextgroup=sassClass
+syn match sassPlaceholder "\%([{};]\s*\|^\s*\)\@<=%" nextgroup=sassClass
+syn match sassClass "[[:alnum:]_-]\+" contained
+syn match sassAmpersand "&"
+
+" TODO: Attribute namespaces
+" TODO: Arithmetic (including strings and concatenation)
+
+syn region sassMediaQuery matchgroup=sassMedia start="@media" end="[{};]\@=\|$" contains=sassMediaOperators
+syn region sassKeyframe matchgroup=cssAtKeyword start=/@\(-[a-z]\+-\)\=keyframes\>/ end=";\|$" contains=cssVendor,cssComment nextgroup=cssDefinition
+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
+syn region sassControlLine matchgroup=sassControl start="@\%(if\|else\%(\s\+if\)\=\|while\|for\|each\)\>" end="[{};]\@=\|$" contains=sassFor,@sassCssAttributes,sassVariable,sassFunction
+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 sassFlag cssImportant
+hi def link sassVariable Identifier
+hi def link sassFunction Function
+hi def link sassMixing PreProc
+hi def link sassMixin PreProc
+hi def link sassPlaceholder sassClassChar
+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
+hi def link sassControl PreProc
+hi def link sassFor PreProc
+hi def link sassEscape Special
+hi def link sassIdChar Special
+hi def link sassClassChar Special
+hi def link sassInterpolationDelimiter Delimiter
+hi def link sassAmpersand Character
+hi def link sassId Identifier
+hi def link sassClass Type
+
+let b:current_syntax = "sass"
+
+" vim:set sw=2:
diff --git a/runtime/syntax/sather.vim b/runtime/syntax/sather.vim
new file mode 100644
index 0000000..de8bdad
--- /dev/null
+++ b/runtime/syntax/sather.vim
@@ -0,0 +1,92 @@
+" Vim syntax file
+" Language: Sather/pSather
+" Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" URL: http://www.fleiner.com/vim/syntax/sather.vim
+" Last Change: 2003 May 11
+
+" Sather is a OO-language developped at the International Computer Science
+" Institute (ICSI) in Berkeley, CA. pSather is a parallel extension to Sather.
+" Homepage: http://www.icsi.berkeley.edu/~sather
+" Sather files use .sa as suffix
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" keyword definitions
+syn keyword satherExternal extern
+syn keyword satherBranch break continue
+syn keyword satherLabel when then
+syn keyword satherConditional if else elsif end case typecase assert with
+syn match satherConditional "near$"
+syn match satherConditional "far$"
+syn match satherConditional "near *[^(]"he=e-1
+syn match satherConditional "far *[^(]"he=e-1
+syn keyword satherSynchronize lock guard sync
+syn keyword satherRepeat loop parloop do
+syn match satherRepeat "while!"
+syn match satherRepeat "break!"
+syn match satherRepeat "until!"
+syn keyword satherBoolValue true false
+syn keyword satherValue self here cluster
+syn keyword satherOperator new "== != & ^ | && ||
+syn keyword satherOperator and or not
+syn match satherOperator "[#!]"
+syn match satherOperator ":-"
+syn keyword satherType void attr where
+syn match satherType "near *("he=e-1
+syn match satherType "far *("he=e-1
+syn keyword satherStatement return
+syn keyword satherStorageClass static const
+syn keyword satherExceptions try raise catch
+syn keyword satherMethodDecl is pre post
+syn keyword satherClassDecl abstract value class include
+syn keyword satherScopeDecl public private readonly
+
+
+syn match satherSpecial contained "\\\d\d\d\|\\."
+syn region satherString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=satherSpecial
+syn match satherCharacter "'[^\\]'"
+syn match satherSpecialCharacter "'\\.'"
+syn match satherNumber "-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>"
+syn match satherCommentSkip contained "^\s*\*\($\|\s\+\)"
+syn region satherComment2String contained start=+"+ skip=+\\\\\|\\"+ end=+$\|"+ contains=satherSpecial
+syn match satherComment "--.*" contains=satherComment2String,satherCharacter,satherNumber
+
+
+syn sync ccomment satherComment
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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"
+
+" vim: ts=8
diff --git a/runtime/syntax/sbt.vim b/runtime/syntax/sbt.vim
new file mode 100644
index 0000000..cbf73be
--- /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 0000000..c08e60e
--- /dev/null
+++ b/runtime/syntax/scala.vim
@@ -0,0 +1,233 @@
+" Vim syntax file
+" Language: Scala
+" Maintainer: Derek Wyatt
+" URL: https://github.com/derekwyatt/vim-scala
+" License: Same as Vim
+" Last Change: 23 January 2022
+" ----------------------------------------------------------------------------
+
+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 def 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 def link scalaAkkaSpecialWord PreProc
+
+syn keyword scalatestSpecialWord shouldBe
+syn match scalatestShouldDSLA /^\s\+\zsit should/
+syn match scalatestShouldDSLB /\<should\>/
+hi def link scalatestSpecialWord PreProc
+hi def link scalatestShouldDSLA PreProc
+hi def link scalatestShouldDSLB PreProc
+
+syn match scalaSymbol /'[_A-Za-z0-9$]\+/
+hi def 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 def link scalaChar Character
+hi def link scalaEscapedChar Special
+hi def link scalaUnicodeChar Special
+
+syn match scalaOperator "||"
+syn match scalaOperator "&&"
+syn match scalaOperator "|"
+syn match scalaOperator "&"
+hi def 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 def link scalaNameDefinition Function
+
+syn match scalaInstanceDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaInstanceHash
+syn match scalaInstanceDeclaration /`[^`]\+`/ contained
+syn match scalaInstanceHash /#/ contained nextgroup=scalaInstanceDeclaration
+hi def link scalaInstanceDeclaration Special
+hi def link scalaInstanceHash Type
+
+syn match scalaUnimplemented /???/
+hi def link scalaUnimplemented ERROR
+
+syn match scalaCapitalWord /\<[A-Z][A-Za-z0-9$]*\>/
+hi def 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 contains=scalaTypeOperator nextgroup=scalaTypeTypeDeclaration skipwhite
+syn match scalaTypeTypePostDeclaration /\<[_\.A-Za-z0-9$]\+\>/ contained nextgroup=scalaTypeTypePostExtension skipwhite
+syn match scalaTypeTypePostExtension /\%(⇒\|=>\|<:\|:>\|=:=\|::\)/ contained contains=scalaTypeOperator nextgroup=scalaTypeTypePostDeclaration skipwhite
+hi def link scalaTypeTypeDeclaration Type
+hi def link scalaTypeTypeExtension Keyword
+hi def link scalaTypeTypePostDeclaration Special
+hi def 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 contains=scalaTypeOperator nextgroup=scalaTypeDeclaration skipwhite
+hi def link scalaTypeDeclaration Type
+hi def link scalaTypeExtension Keyword
+hi def 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 clear scalaTypeAnnotation
+
+syn match scalaCaseFollowing /\<[_\.A-Za-z0-9$]\+\>/ contained contains=scalaCapitalWord
+syn match scalaCaseFollowing /`[^`]\+`/ contained contains=scalaCapitalWord
+hi def link scalaCaseFollowing Special
+
+syn keyword scalaKeywordModifier abstract override final lazy implicit private protected sealed null super
+syn keyword scalaSpecialFunction implicitly require
+hi def link scalaKeywordModifier Function
+hi def link scalaSpecialFunction 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 def link scalaSpecial PreProc
+
+syn keyword scalaExternal package import
+hi def link scalaExternal Include
+
+syn match scalaStringEmbeddedQuote /\\"/ contained
+syn region scalaString start=/"/ end=/"/ contains=scalaStringEmbeddedQuote,scalaEscapedChar,scalaUnicodeChar
+hi def link scalaString String
+hi def 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 def link scalaIString String
+hi def link scalaTripleIString String
+
+syn match scalaInterpolation /\$[a-zA-Z0-9_$]\+/ contained
+exe 'syn region scalaInterpolationB matchgroup=scalaInterpolationBoundary start=/\${/ end=/}/ contained contains=' . s:ContainedGroup()
+hi def link scalaInterpolation Function
+hi clear scalaInterpolationB
+
+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 def link scalaFString String
+hi def link scalaFInterpolation Function
+hi clear scalaFInterpolationB
+
+syn region scalaTripleString start=/"""/ end=/"""\%([^"]\|$\)/ contains=scalaEscapedChar,scalaUnicodeChar
+syn region scalaTripleFString matchgroup=scalaInterpolationBrackets start=/f"""/ end=/"""\%([^"]\|$\)/ contains=scalaFInterpolation,scalaFInterpolationB,scalaEscapedChar,scalaUnicodeChar
+hi def link scalaTripleString String
+hi def link scalaTripleFString String
+
+hi def link scalaInterpolationBrackets Special
+hi def 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 def 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 def link scalaSquareBracketsBrackets Type
+hi def link scalaTypeOperator Keyword
+hi def 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 def link scalaShebang Comment
+hi def link scalaMultilineComment Comment
+hi def link scalaDocLinks Function
+hi def link scalaParameterAnnotation Function
+hi def link scalaParamAnnotationValue Keyword
+hi def link scalaCommentAnnotation Function
+hi def link scalaCommentCodeBlock String
+hi def link scalaTodo Todo
+
+syn match scalaAnnotation /@\<[`_A-Za-z0-9$]\+\>/
+hi def link scalaAnnotation PreProc
+
+syn match scalaTrailingComment "//.*$" contains=scalaTodo,@Spell
+hi def 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 def link scalaAkkaFSM PreProc
+hi def 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/scdoc.vim b/runtime/syntax/scdoc.vim
new file mode 100644
index 0000000..0180f35
--- /dev/null
+++ b/runtime/syntax/scdoc.vim
@@ -0,0 +1,63 @@
+" Syntax file for scdoc files
+" Maintainer: Gregory Anders <contact@gpanders.com>
+" Last Updated: 2022-05-09
+" Upstream: https://github.com/gpanders/vim-scdoc
+
+if exists('b:current_syntax')
+ finish
+endif
+let b:current_syntax = 'scdoc'
+
+syntax match scdocFirstLineError "\%^.*$"
+syntax match scdocFirstLineValid "\%^\S\+(\d[0-9A-Za-z]*)\%(\s\+\"[^"]*\"\%(\s\+\"[^"]*\"\)\=\)\=$"
+
+syntax region scdocCommentError start="^;\S" end="$" keepend
+syntax region scdocComment start="^; " end="$" keepend
+
+syntax region scdocHeaderError start="^#\{3,}" end="$" keepend
+syntax region scdocHeader start="^#\{1,2}" end="$" keepend
+
+syntax match scdocIndentError "^[ ]\+"
+
+syntax match scdocLineBreak "++$"
+
+syntax region scdocOrderedListItem matchgroup=scdocOrderedListMarker start="^\z(\s*\)\." skip="^\z1 .*$" end="^" contains=scdocBold,scdocUnderline
+syntax region scdocListItem matchgroup=scdocListMarker start="^\z(\s*\)-" skip="^\z1 .*$" end="^" contains=scdocBold,scdocUnderline
+
+" Tables cannot start with a column
+syntax match scdocTableError "^:"
+
+syntax region scdocTable matchgroup=scdocTableEntry start="^[\[|\]][\[\-\]<=>]" end="^$" contains=scdocTableEntry,scdocTableError,scdocTableContinuation,scdocBold,scdocUnderline,scdocPre
+syntax match scdocTableError "^.*$" contained
+syntax match scdocTableContinuation "^ \+\S\+" contained
+syntax match scdocTableEntry "^[|:][\[\-\]<=> ]" contained
+syntax match scdocTableError "^[|:][\[\-\]<=> ]\S.*$" contained
+
+syntax region scdocBold concealends matchgroup=scdocBoldDelimiter start="\\\@<!\*" end="\\\@<!\*"
+syntax region scdocUnderline concealends matchgroup=scdocUnderlineDelimiter start="\<\\\@<!_" end="\\\@<!_\>"
+syntax region scdocPre matchgroup=scdocPreDelimiter start="^\t*```" end="^\t*```"
+
+syntax sync minlines=50
+
+hi default link scdocFirstLineValid Comment
+hi default link scdocComment Comment
+hi default link scdocHeader Title
+hi default link scdocOrderedListMarker Statement
+hi default link scdocListMarker scdocOrderedListMarker
+hi default link scdocLineBreak Special
+hi default link scdocTableSpecifier Statement
+hi default link scdocTableEntry Statement
+
+hi default link scdocFirstLineError Error
+hi default link scdocCommentError Error
+hi default link scdocHeaderError Error
+hi default link scdocIndentError Error
+hi default link scdocTableError Error
+hi default link scdocTableError Error
+
+hi default link scdocPreDelimiter Delimiter
+
+hi default scdocBold term=bold cterm=bold gui=bold
+hi default scdocUnderline term=underline cterm=underline gui=underline
+hi default link scdocBoldDelimiter scdocBold
+hi default link scdocUnderlineDelimiter scdocUnderline
diff --git a/runtime/syntax/scheme.vim b/runtime/syntax/scheme.vim
new file mode 100644
index 0000000..c4454fc
--- /dev/null
+++ b/runtime/syntax/scheme.vim
@@ -0,0 +1,467 @@
+" Vim syntax file
+" Language: Scheme (R7RS)
+" Last Change: 2021-01-03
+" 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>
+" Repository: https://git.foldling.org/vim-scheme.git
+" URL: https://foldling.org/vim/syntax/scheme.vim
+
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo = &cpo
+set cpo&vim
+
+syn spell notoplevel
+
+syn match schemeParentheses "[^ '`\t\n()\[\]";]\+"
+syn match schemeParentheses "[)\]]"
+
+syn match schemeIdentifier /[^ '`\t\n()\[\]"|;][^ '`\t\n()\[\]"|;]*/
+
+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
+
+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 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 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 schemeString start=/\(\\\)\@<!"/ skip=/\\[\\"]/ end=/"/ contains=@Spell
+syn region schemeSymbol start=/\(\\\)\@<!|/ skip=/\\[\\|]/ end=/|/
+
+syn match schemeNumber /\(#[dbeio]\)*[+\-]*\([0-9]\+\|inf.0\|nan.0\)\(\/\|\.\)\?[0-9+\-@\ilns]*\>/
+syn match schemeNumber /#x[+\-]*[0-9a-fA-F]\+\>/
+
+syn match schemeBoolean /#t\(rue\)\?/
+syn match schemeBoolean /#f\(alse\)\?/
+
+syn match schemeCharacter /#\\.[^ `'\t\n\[\]()]*/
+syn match schemeCharacter /#\\x[0-9a-fA-F]\+/
+
+syn match schemeComment /;.*$/ contains=@Spell
+
+syn region schemeMultilineComment start=/#|/ end=/|#/ contains=schemeMultilineComment,@Spell
+
+syn region schemeForm matchgroup=schemeParentheses start="(" end=")" contains=ALLBUT,schemeUnquote,schemeDatumCommentForm,@schemeImportCluster
+syn region schemeForm matchgroup=schemeParentheses start="\[" end="\]" contains=ALLBUT,schemeUnquote,schemeDatumCommentForm,@schemeImportCluster
+
+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 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
+ syn region schemeImport matchgroup=schemeImport start="\(([ \t\n]*\)\@<=\(import\)\>" end=")"me=e-1 contained contains=schemeImportForm,schemeIdentifier,schemeComment,schemeDatumComment
+endif
+
+syn match schemeImportKeyword "\(([ \t\n]*\)\@<=\(except\|only\|prefix\|rename\)\>"
+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
+
+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
new file mode 100644
index 0000000..03e123b
--- /dev/null
+++ b/runtime/syntax/scilab.vim
@@ -0,0 +1,102 @@
+"
+" Vim syntax file
+" Language : Scilab
+" Maintainer : Benoit Hamelin
+" File type : *.sci (see :help filetype)
+" History
+" 28jan2002 benoith 0.1 Creation. Adapted from matlab.vim.
+" 04feb2002 benoith 0.5 Fixed bugs with constant highlighting.
+"
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+" Reserved words.
+syn keyword scilabStatement abort clear clearglobal end exit global mode predef quit resume
+syn keyword scilabStatement return
+syn keyword scilabFunction function endfunction funptr
+syn keyword scilabPredicate null iserror isglobal
+syn keyword scilabKeyword typename
+syn keyword scilabDebug debug pause what where whereami whereis who whos
+syn keyword scilabRepeat for while break
+syn keyword scilabConditional if then else elseif
+syn keyword scilabMultiplex select case
+
+" Reserved constants.
+syn match scilabConstant "\(%\)[0-9A-Za-z?!#$]\+"
+syn match scilabBoolean "\(%\)[FTft]\>"
+
+" Delimiters and operators.
+syn match scilabDelimiter "[][;,()]"
+syn match scilabComparison "[=~]="
+syn match scilabComparison "[<>]=\="
+syn match scilabComparison "<>"
+syn match scilabLogical "[&|~]"
+syn match scilabAssignment "="
+syn match scilabArithmetic "[+-]"
+syn match scilabArithmetic "\.\=[*/\\]\.\="
+syn match scilabArithmetic "\.\=^"
+syn match scilabRange ":"
+syn match scilabMlistAccess "\."
+
+syn match scilabLineContinuation "\.\{2,}"
+
+syn match scilabTransposition "[])a-zA-Z0-9?!_#$.]'"lc=1
+
+" Comments and tools.
+syn keyword scilabTodo TODO todo FIXME fixme TBD tbd contained
+syn match scilabComment "//.*$" contains=scilabTodo
+
+" Constants.
+syn match scilabNumber "[0-9]\+\(\.[0-9]*\)\=\([DEde][+-]\=[0-9]\+\)\="
+syn match scilabNumber "\.[0-9]\+\([DEde][+-]\=[0-9]\+\)\="
+syn region scilabString start=+'+ skip=+''+ end=+'+ oneline
+syn region scilabString start=+"+ end=+"+ oneline
+
+" Identifiers.
+syn match scilabIdentifier "\<[A-Za-z?!_#$][A-Za-z0-9?!_#$]*\>"
+syn match scilabOverload "%[A-Za-z0-9?!_#$]\+_[A-Za-z0-9?!_#$]\+"
+
+
+" Define the default highlighting.
+" 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"
+
+"EOF vim: ts=4 noet tw=100 sw=4 sts=0
diff --git a/runtime/syntax/screen.vim b/runtime/syntax/screen.vim
new file mode 100644
index 0000000..d576d29
--- /dev/null
+++ b/runtime/syntax/screen.vim
@@ -0,0 +1,260 @@
+" Vim syntax file
+" Language: screen(1) configuration file
+" Maintainer: Dmitri Vereshchagin <dmitri.vereshchagin@gmail.com>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2015-09-24
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match screenEscape '\\.'
+
+syn keyword screenTodo contained TODO FIXME XXX NOTE
+
+syn region screenComment display oneline start='#' end='$'
+ \ contains=screenTodo,@Spell
+
+syn region screenString display oneline start=+"+ skip=+\\"+ end=+"+
+ \ contains=screenVariable,screenSpecial
+
+syn region screenLiteral display oneline start=+'+ skip=+\\'+ end=+'+
+
+syn match screenVariable contained display '$\%(\h\w*\|{\h\w*}\)'
+
+syn keyword screenBoolean on off
+
+syn match screenNumbers display '\<\d\+\>'
+
+syn match screenSpecials contained
+ \ '%\%([%aAdDhlmMstuwWyY?:{]\|[0-9]*n\|0?cC\)'
+
+syn keyword screenCommands
+ \ acladd
+ \ aclchg
+ \ acldel
+ \ aclgrp
+ \ aclumask
+ \ activity
+ \ addacl
+ \ allpartial
+ \ altscreen
+ \ at
+ \ attrcolor
+ \ autodetach
+ \ autonuke
+ \ backtick
+ \ bce
+ \ bd_bc_down
+ \ bd_bc_left
+ \ bd_bc_right
+ \ bd_bc_up
+ \ bd_bell
+ \ bd_braille_table
+ \ bd_eightdot
+ \ bd_info
+ \ bd_link
+ \ bd_lower_left
+ \ bd_lower_right
+ \ bd_ncrc
+ \ bd_port
+ \ bd_scroll
+ \ bd_skip
+ \ bd_start_braille
+ \ bd_type
+ \ bd_upper_left
+ \ bd_upper_right
+ \ bd_width
+ \ bell
+ \ bell_msg
+ \ bind
+ \ bindkey
+ \ blanker
+ \ blankerprg
+ \ break
+ \ breaktype
+ \ bufferfile
+ \ bumpleft
+ \ bumpright
+ \ c1
+ \ caption
+ \ chacl
+ \ charset
+ \ chdir
+ \ cjkwidth
+ \ clear
+ \ collapse
+ \ colon
+ \ command
+ \ compacthist
+ \ console
+ \ copy
+ \ crlf
+ \ debug
+ \ defautonuke
+ \ defbce
+ \ defbreaktype
+ \ defc1
+ \ defcharset
+ \ defencoding
+ \ defescape
+ \ defflow
+ \ defgr
+ \ defhstatus
+ \ defkanji
+ \ deflog
+ \ deflogin
+ \ defmode
+ \ defmonitor
+ \ defmousetrack
+ \ defnonblock
+ \ defobuflimit
+ \ defscrollback
+ \ defshell
+ \ defsilence
+ \ defslowpaste
+ \ defutf8
+ \ defwrap
+ \ defwritelock
+ \ defzombie
+ \ detach
+ \ digraph
+ \ dinfo
+ \ displays
+ \ dumptermcap
+ \ echo
+ \ encoding
+ \ escape
+ \ eval
+ \ exec
+ \ fit
+ \ flow
+ \ focus
+ \ focusminsize
+ \ gr
+ \ group
+ \ hardcopy
+ \ hardcopy_append
+ \ hardcopydir
+ \ hardstatus
+ \ height
+ \ help
+ \ history
+ \ hstatus
+ \ idle
+ \ ignorecase
+ \ info
+ \ kanji
+ \ kill
+ \ lastmsg
+ \ layout
+ \ license
+ \ lockscreen
+ \ log
+ \ logfile
+ \ login
+ \ logtstamp
+ \ mapdefault
+ \ mapnotnext
+ \ maptimeout
+ \ markkeys
+ \ maxwin
+ \ meta
+ \ monitor
+ \ mousetrack
+ \ msgminwait
+ \ msgwait
+ \ multiuser
+ \ nethack
+ \ next
+ \ nonblock
+ \ number
+ \ obuflimit
+ \ only
+ \ other
+ \ partial
+ \ password
+ \ paste
+ \ pastefont
+ \ pow_break
+ \ pow_detach
+ \ pow_detach_msg
+ \ prev
+ \ printcmd
+ \ process
+ \ quit
+ \ readbuf
+ \ readreg
+ \ redisplay
+ \ register
+ \ remove
+ \ removebuf
+ \ rendition
+ \ reset
+ \ resize
+ \ screen
+ \ scrollback
+ \ select
+ \ sessionname
+ \ setenv
+ \ setsid
+ \ shell
+ \ shelltitle
+ \ silence
+ \ silencewait
+ \ sleep
+ \ slowpaste
+ \ sorendition
+ \ sort
+ \ source
+ \ split
+ \ startup_message
+ \ stuff
+ \ su
+ \ suspend
+ \ term
+ \ termcap
+ \ termcapinfo
+ \ terminfo
+ \ time
+ \ title
+ \ umask
+ \ unbindall
+ \ unsetenv
+ \ utf8
+ \ vbell
+ \ vbell_msg
+ \ vbellwait
+ \ verbose
+ \ version
+ \ wall
+ \ width
+ \ windowlist
+ \ windows
+ \ wrap
+ \ writebuf
+ \ writelock
+ \ xoff
+ \ xon
+ \ zmodem
+ \ zombie
+ \ zombie_timeout
+
+hi def link screenEscape Special
+hi def link screenComment Comment
+hi def link screenTodo Todo
+hi def link screenString String
+hi def link screenLiteral String
+hi def link screenVariable Identifier
+hi def link screenBoolean Boolean
+hi def link screenNumbers Number
+hi def link screenSpecials Special
+hi def link screenCommands Keyword
+
+let b:current_syntax = "screen"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/scss.vim b/runtime/syntax/scss.vim
new file mode 100644
index 0000000..9d79dc5
--- /dev/null
+++ b/runtime/syntax/scss.vim
@@ -0,0 +1,25 @@
+" Vim syntax file
+" Language: SCSS
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Filenames: *.scss
+" Last Change: 2019 Dec 05
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/sass.vim
+
+syn clear sassComment
+syn clear sassCssComment
+syn clear sassEndOfLineComment
+
+syn match scssComment "//.*" contains=sassTodo,@Spell
+syn region scssCssComment start="/\*" end="\*/" contains=sassTodo,@Spell
+
+hi def link scssCssComment scssComment
+hi def link scssComment Comment
+
+let b:current_syntax = "scss"
+
+" vim:set sw=2:
diff --git a/runtime/syntax/sd.vim b/runtime/syntax/sd.vim
new file mode 100644
index 0000000..b497ba5
--- /dev/null
+++ b/runtime/syntax/sd.vim
@@ -0,0 +1,71 @@
+" Language: streaming descriptor file
+" Maintainer: Puria Nafisi Azizi (pna) <pna@netstudent.polito.it>
+" License: This file can be redistribued and/or modified under the same terms
+" as Vim itself.
+" URL: http://netstudent.polito.it/vim_syntax/
+" Last Change: 2012 Feb 03 by Thilo Six
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Always ignore case
+syn case ignore
+
+" Comments
+syn match sdComment /\s*[#;].*$/
+
+" IP Adresses
+syn cluster sdIPCluster contains=sdIPError,sdIPSpecial
+syn match sdIPError /\%(\d\{4,}\|25[6-9]\|2[6-9]\d\|[3-9]\d\{2}\)[\.0-9]*/ contained
+syn match sdIPSpecial /\%(127\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\)/ contained
+syn match sdIP contained /\%(\d\{1,4}\.\)\{3}\d\{1,4}/ contains=@sdIPCluster
+
+" Statements
+syn keyword sdStatement AGGREGATE AUDIO_CHANNELS
+syn keyword sdStatement BYTE_PER_PCKT BIT_PER_SAMPLE BITRATE
+syn keyword sdStatement CLOCK_RATE CODING_TYPE CREATOR
+syn match sdStatement /^\s*CODING_TYPE\>/ nextgroup=sdCoding skipwhite
+syn match sdStatement /^\s*ENCODING_NAME\>/ nextgroup=sdEncoding skipwhite
+syn keyword sdStatement FILE_NAME FRAME_LEN FRAME_RATE FORCE_FRAME_RATE
+syn keyword sdStatement LICENSE
+syn match sdStatement /^\s*MEDIA_SOURCE\>/ nextgroup=sdSource skipwhite
+syn match sdStatement /^\s*MULTICAST\>/ nextgroup=sdIP skipwhite
+syn keyword sdStatement PAYLOAD_TYPE PKT_LEN PRIORITY
+syn keyword sdStatement SAMPLE_RATE
+syn keyword sdStatement TITLE TWIN
+syn keyword sdStatement VERIFY
+
+" Known Options
+syn keyword sdEncoding H26L MPV MP2T MP4V-ES
+syn keyword sdCoding FRAME SAMPLE
+syn keyword sdSource STORED LIVE
+
+"Specials
+syn keyword sdSpecial TRUE FALSE NULL
+syn keyword sdDelimiter STREAM STREAM_END
+syn match sdError /^search .\{257,}/
+
+
+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
+
+
+let b:current_syntax = "sd"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/sdc.vim b/runtime/syntax/sdc.vim
new file mode 100644
index 0000000..0ca9bec
--- /dev/null
+++ b/runtime/syntax/sdc.vim
@@ -0,0 +1,41 @@
+" Vim syntax file
+" Language: SDC - Synopsys Design Constraints
+" Maintainer: Maurizio Tranchero - maurizio.tranchero@gmail.com
+" Last Change: Thu Mar 25 17:35:16 CET 2009
+" Credits: based on TCL Vim syntax file
+" Version: 0.3
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the TCL syntax to start with
+runtime! syntax/tcl.vim
+
+" SDC-specific keywords
+syn keyword sdcCollections foreach_in_collection
+syn keyword sdcObjectsQuery get_clocks get_ports
+syn keyword sdcObjectsInfo get_point_info get_node_info get_path_info
+syn keyword sdcObjectsInfo get_timing_paths set_attribute
+syn keyword sdcConstraints set_false_path
+syn keyword sdcNonIdealities set_min_delay set_max_delay
+syn keyword sdcNonIdealities set_input_delay set_output_delay
+syn keyword sdcNonIdealities set_load set_min_capacitance set_max_capacitance
+syn keyword sdcCreateOperations create_clock create_timing_netlist update_timing_netlist
+
+" command flags highlighting
+syn match sdcFlags "[[:space:]]-[[:alpha:]]*\>"
+
+" Define the default highlighting.
+hi def link sdcCollections Repeat
+hi def link sdcObjectsInfo Operator
+hi def link sdcCreateOperations Operator
+hi def link sdcObjectsQuery Operator
+hi def link sdcConstraints Operator
+hi def link sdcNonIdealities Operator
+hi def link sdcFlags Special
+
+let b:current_syntax = "sdc"
+
+" vim: ts=8
diff --git a/runtime/syntax/sdl.vim b/runtime/syntax/sdl.vim
new file mode 100644
index 0000000..7df38d1
--- /dev/null
+++ b/runtime/syntax/sdl.vim
@@ -0,0 +1,153 @@
+" Vim syntax file
+" Language: SDL
+" Maintainer: Michael Piefel <entwurf@piefel.de>
+" Last Change: 2 May 2001
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("sdl_2000")
+ syntax case ignore
+endif
+
+" A bunch of useful SDL keywords
+syn keyword sdlStatement task else nextstate
+syn keyword sdlStatement in out with from interface
+syn keyword sdlStatement to via env and use
+syn keyword sdlStatement process procedure block system service type
+syn keyword sdlStatement endprocess endprocedure endblock endsystem
+syn keyword sdlStatement package endpackage connection endconnection
+syn keyword sdlStatement channel endchannel connect
+syn keyword sdlStatement synonym dcl signal gate timer signallist signalset
+syn keyword sdlStatement create output set reset call
+syn keyword sdlStatement operators literals
+syn keyword sdlStatement active alternative any as atleast constants
+syn keyword sdlStatement default endalternative endmacro endoperator
+syn keyword sdlStatement endselect endsubstructure external
+syn keyword sdlStatement if then fi for import macro macrodefinition
+syn keyword sdlStatement macroid mod nameclass nodelay not operator or
+syn keyword sdlStatement parent provided referenced rem
+syn keyword sdlStatement select spelling substructure xor
+syn keyword sdlNewState state endstate
+syn keyword sdlInput input start stop return none save priority
+syn keyword sdlConditional decision enddecision join
+syn keyword sdlVirtual virtual redefined finalized adding inherits
+syn keyword sdlExported remote exported export
+
+if !exists("sdl_no_96")
+ syn keyword sdlStatement all axioms constant endgenerator endrefinement endservice
+ syn keyword sdlStatement error fpar generator literal map noequality ordering
+ syn keyword sdlStatement refinement returns revealed reverse service signalroute
+ syn keyword sdlStatement view viewed
+ syn keyword sdlExported imported
+endif
+
+if exists("sdl_2000")
+ syn keyword sdlStatement abstract aggregation association break choice composition
+ syn keyword sdlStatement continue endmethod handle method
+ syn keyword sdlStatement ordered private protected public
+ syn keyword sdlException exceptionhandler endexceptionhandler onexception
+ syn keyword sdlException catch new raise
+ " The same in uppercase
+ syn keyword sdlStatement TASK ELSE NEXTSTATE
+ syn keyword sdlStatement IN OUT WITH FROM INTERFACE
+ syn keyword sdlStatement TO VIA ENV AND USE
+ syn keyword sdlStatement PROCESS PROCEDURE BLOCK SYSTEM SERVICE TYPE
+ syn keyword sdlStatement ENDPROCESS ENDPROCEDURE ENDBLOCK ENDSYSTEM
+ syn keyword sdlStatement PACKAGE ENDPACKAGE CONNECTION ENDCONNECTION
+ syn keyword sdlStatement CHANNEL ENDCHANNEL CONNECT
+ syn keyword sdlStatement SYNONYM DCL SIGNAL GATE TIMER SIGNALLIST SIGNALSET
+ syn keyword sdlStatement CREATE OUTPUT SET RESET CALL
+ syn keyword sdlStatement OPERATORS LITERALS
+ syn keyword sdlStatement ACTIVE ALTERNATIVE ANY AS ATLEAST CONSTANTS
+ syn keyword sdlStatement DEFAULT ENDALTERNATIVE ENDMACRO ENDOPERATOR
+ syn keyword sdlStatement ENDSELECT ENDSUBSTRUCTURE EXTERNAL
+ syn keyword sdlStatement IF THEN FI FOR IMPORT MACRO MACRODEFINITION
+ syn keyword sdlStatement MACROID MOD NAMECLASS NODELAY NOT OPERATOR OR
+ syn keyword sdlStatement PARENT PROVIDED REFERENCED REM
+ syn keyword sdlStatement SELECT SPELLING SUBSTRUCTURE XOR
+ syn keyword sdlNewState STATE ENDSTATE
+ syn keyword sdlInput INPUT START STOP RETURN NONE SAVE PRIORITY
+ syn keyword sdlConditional DECISION ENDDECISION JOIN
+ syn keyword sdlVirtual VIRTUAL REDEFINED FINALIZED ADDING INHERITS
+ syn keyword sdlExported REMOTE EXPORTED EXPORT
+
+ syn keyword sdlStatement ABSTRACT AGGREGATION ASSOCIATION BREAK CHOICE COMPOSITION
+ syn keyword sdlStatement CONTINUE ENDMETHOD ENDOBJECT ENDVALUE HANDLE METHOD OBJECT
+ syn keyword sdlStatement ORDERED PRIVATE PROTECTED PUBLIC
+ syn keyword sdlException EXCEPTIONHANDLER ENDEXCEPTIONHANDLER ONEXCEPTION
+ syn keyword sdlException CATCH NEW RAISE
+endif
+
+" String and Character contstants
+" Highlight special characters (those which have a backslash) differently
+syn match sdlSpecial contained "\\\d\d\d\|\\."
+syn region sdlString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=cSpecial
+syn region sdlString start=+'+ skip=+''+ end=+'+
+
+" No, this doesn't happen, I just wanted to scare you. SDL really allows all
+" these characters for identifiers; fortunately, keywords manage without them.
+" set iskeyword=@,48-57,_,192-214,216-246,248-255,-
+
+syn region sdlComment start="/\*" end="\*/"
+syn region sdlComment start="comment" end=";"
+syn region sdlComment start="--" end="--\|$"
+syn match sdlCommentError "\*/"
+
+syn keyword sdlOperator present
+syn keyword sdlType integer real natural duration pid boolean time
+syn keyword sdlType character charstring ia5string
+syn keyword sdlType self now sender offspring
+syn keyword sdlStructure asntype endasntype syntype endsyntype struct
+
+if !exists("sdl_no_96")
+ syn keyword sdlStructure newtype endnewtype
+endif
+
+if exists("sdl_2000")
+ syn keyword sdlStructure object endobject value endvalue
+ " The same in uppercase
+ syn keyword sdlStructure OBJECT ENDOBJECT VALUE ENDVALUE
+ syn keyword sdlOperator PRESENT
+ syn keyword sdlType INTEGER NATURAL DURATION PID BOOLEAN TIME
+ syn keyword sdlType CHARSTRING IA5STRING
+ syn keyword sdlType SELF NOW SENDER OFFSPRING
+ syn keyword sdlStructure ASNTYPE ENDASNTYPE SYNTYPE ENDSYNTYPE STRUCT
+endif
+
+" ASN.1 in SDL
+syn case match
+syn keyword sdlType SET OF BOOLEAN INTEGER REAL BIT OCTET
+syn keyword sdlType SEQUENCE CHOICE
+syn keyword sdlType STRING OBJECT IDENTIFIER NULL
+
+syn sync ccomment sdlComment
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/sed.vim b/runtime/syntax/sed.vim
new file mode 100644
index 0000000..d1f631d
--- /dev/null
+++ b/runtime/syntax/sed.vim
@@ -0,0 +1,123 @@
+" Vim syntax file
+" Language: sed
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Haakon Riiser <hakonrk@fys.uio.no>
+" Contributor: Jack Haden-Enneking
+" Last Change: 2022 Oct 15
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword sedTodo contained TODO FIXME XXX
+
+syn match sedError "\S"
+
+syn match sedWhitespace "\s\+" contained
+syn match sedSemicolon ";"
+syn match sedAddress "[[:digit:]$]"
+syn match sedAddress "\d\+\~\d\+"
+syn region sedAddress matchgroup=Special start="[{,;]\s*/\%(\\/\)\="lc=1 skip="[^\\]\%(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta
+syn region sedAddress matchgroup=Special start="^\s*/\%(\\/\)\=" skip="[^\\]\%(\\\\\)*\\/" end="/I\=" contains=sedTab,sedRegexpMeta
+syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\%($\|;\)" contains=sedSemicolon,sedWhitespace
+if exists("g:sed_dialect") && g:sed_dialect ==? "bsd"
+ syn match sedComment "^\s*#.*$" contains=sedTodo
+else
+ syn match sedFunction "[dDgGhHlnNpPqQx=]\s*\ze#" contains=sedSemicolon,sedWhitespace
+ syn match sedComment "#.*$" contains=sedTodo
+endif
+syn match sedLabel ":[^;]*"
+syn match sedLineCont "^\%(\\\\\)*\\$" contained
+syn match sedLineCont "[^\\]\%(\\\\\)*\\$"ms=e contained
+syn match sedSpecial "[{},!]"
+
+" continue to silently support the old name
+let s:highlight_tabs = v:false
+if exists("g:highlight_sedtabs") || get(g:, "sed_highlight_tabs", 0)
+ let s:highlight_tabs = v:true
+ syn match sedTab "\t" contained
+endif
+
+" Append/Change/Insert
+syn region sedACI matchgroup=sedFunction start="[aci]\\$" matchgroup=NONE end="^.*$" contains=sedLineCont,sedTab
+
+syn region sedBranch matchgroup=sedFunction start="[bt]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace
+syn region sedRW matchgroup=sedFunction start="[rw]" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace
+
+" Substitution/transform with various delimiters
+syn region sedFlagWrite matchgroup=sedFlag start="w" matchgroup=sedSemicolon end=";\|$" contains=sedWhitespace contained
+syn match sedFlag "[[:digit:]gpI]*w\=" contains=sedFlagWrite contained
+syn match sedRegexpMeta "[.*^$]" contained
+syn match sedRegexpMeta "\\." contains=sedTab contained
+syn match sedRegexpMeta "\[.\{-}\]" contains=sedTab contained
+syn match sedRegexpMeta "\\{\d\*,\d*\\}" contained
+syn match sedRegexpMeta "\\%(.\{-}\\)" contains=sedTab contained
+syn match sedReplaceMeta "&\|\\\%($\|.\)" contains=sedTab contained
+
+" Metacharacters: $ * . \ ^ [ ~
+" @ is used as delimiter and treated on its own below
+let s:at = char2nr("@")
+let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64
+if has("ebcdic")
+ let s:last = 255
+else
+ let s:last = 126
+endif
+let s:metacharacters = '$*.\^[~'
+while s:i <= s:last
+ let s:delimiter = escape(nr2char(s:i), s:metacharacters)
+ if s:i != s:at
+ exe 'syn region sedAddress matchgroup=Special start=@\\'.s:delimiter.'\%(\\'.s:delimiter.'\)\=@ skip=@[^\\]\%(\\\\\)*\\'.s:delimiter.'@ end=@'.s:delimiter.'[IM]\=@ contains=sedTab'
+ exe 'syn region sedRegexp'.s:i 'matchgroup=Special start=@'.s:delimiter.'\%(\\\\\|\\'.s:delimiter.'\)*@ skip=@[^\\'.s:delimiter.']\%(\\\\\)*\\'.s:delimiter.'@ end=@'.s:delimiter.'@me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement'.s:i
+ exe 'syn region sedReplacement'.s:i 'matchgroup=Special start=@'.s:delimiter.'\%(\\\\\|\\'.s:delimiter.'\)*@ skip=@[^\\'.s:delimiter.']\%(\\\\\)*\\'.s:delimiter.'@ end=@'.s:delimiter.'@ contains=sedTab,sedReplaceMeta keepend contained nextgroup=@sedFlags'
+ endif
+ let s:i = s:i + 1
+endwhile
+syn region sedAddress matchgroup=Special start=+\\@\%(\\@\)\=+ skip=+[^\\]\%(\\\\\)*\\@+ end=+@I\=+ contains=sedTab,sedRegexpMeta
+syn region sedRegexp64 matchgroup=Special start=+@\%(\\\\\|\\@\)*+ skip=+[^\\@]\%(\\\\\)*\\@+ end=+@+me=e-1 contains=sedTab,sedRegexpMeta keepend contained nextgroup=sedReplacement64
+syn region sedReplacement64 matchgroup=Special start=+@\%(\\\\\|\\@\)*+ skip=+[^\\@]\%(\\\\\)*\\@+ end=+@+ contains=sedTab,sedReplaceMeta keepend contained nextgroup=sedFlag
+
+" Since the syntax for the substitution command is very similar to the
+" syntax for the transform command, I use the same pattern matching
+" for both commands. There is one problem -- the transform command
+" (y) does not allow any flags. To save memory, I ignore this problem.
+syn match sedST "[sy]" nextgroup=sedRegexp\d\+
+
+
+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 sedTodo Todo
+hi def link sedWhitespace NONE
+if s:highlight_tabs
+ hi def link sedTab Todo
+endif
+let s:i = char2nr(" ") " ASCII: 32, EBCDIC: 64
+while s:i <= s:last
+ exe "hi def link sedRegexp".s:i "Macro"
+ exe "hi def link sedReplacement".s:i "NONE"
+ let s:i = s:i + 1
+endwhile
+
+unlet s:i s:last s:delimiter s:metacharacters s:at
+unlet s:highlight_tabs
+
+let b:current_syntax = "sed"
+
+" vim: nowrap sw=2 sts=2 ts=8 noet:
diff --git a/runtime/syntax/sendpr.vim b/runtime/syntax/sendpr.vim
new file mode 100644
index 0000000..2541b95
--- /dev/null
+++ b/runtime/syntax/sendpr.vim
@@ -0,0 +1,37 @@
+" Vim syntax file
+" Language: FreeBSD send-pr file
+" Maintainer: Hendrik Scholz <hendrik@scholz.net>
+" Last Change: 2022 Jun 14
+"
+" http://raisdorf.net/files/misc/send-pr.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match sendprComment /^SEND-PR:/
+" email address
+syn match sendprType /<[a-zA-Z0-9\-\_\.]*@[a-zA-Z0-9\-\_\.]*>/
+" ^> lines
+syn match sendprString /^>[a-zA-Z\-]*:/
+syn region sendprLabel start="\[" end="\]"
+syn match sendprString /^To:/
+syn match sendprString /^From:/
+syn match sendprString /^Reply-To:/
+syn match sendprString /^Cc:/
+syn match sendprString /^X-send-pr-version:/
+syn match sendprString /^X-GNATS-Notify:/
+
+hi def link sendprComment Comment
+hi def link sendprType Type
+hi def link sendprString String
+hi def link sendprLabel Label
+
+let b:current_syntax = 'sendpr'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/sensors.vim b/runtime/syntax/sensors.vim
new file mode 100644
index 0000000..f8bc4c6
--- /dev/null
+++ b/runtime/syntax/sensors.vim
@@ -0,0 +1,52 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword sensorsTodo contained TODO FIXME XXX NOTE
+
+syn region sensorsComment display oneline start='#' end='$'
+ \ contains=sensorsTodo,@Spell
+
+
+syn keyword sensorsKeyword bus chip label compute ignore set
+
+syn region sensorsName display oneline
+ \ start=+"+ skip=+\\\\\|\\"+ end=+"+
+ \ contains=sensorsNameSpecial
+syn match sensorsName display '\w\+'
+
+syn match sensorsNameSpecial display '\\["\\rnt]'
+
+syn match sensorsLineContinue '\\$'
+
+syn match sensorsNumber display '\d*.\d\+\>'
+
+syn match sensorsRealWorld display '@'
+
+syn match sensorsOperator display '[+*/-]'
+
+syn match sensorsDelimiter display '[()]'
+
+hi def link sensorsTodo Todo
+hi def link sensorsComment Comment
+hi def link sensorsKeyword Keyword
+hi def link sensorsName String
+hi def link sensorsNameSpecial SpecialChar
+hi def link sensorsLineContinue Special
+hi def link sensorsNumber Number
+hi def link sensorsRealWorld Identifier
+hi def link sensorsOperator Normal
+hi def link sensorsDelimiter Normal
+
+let b:current_syntax = "sensors"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/services.vim b/runtime/syntax/services.vim
new file mode 100644
index 0000000..94e39ae
--- /dev/null
+++ b/runtime/syntax/services.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match servicesBegin display '^'
+ \ nextgroup=servicesName,servicesComment
+
+syn match servicesName contained display '[[:graph:]]\+'
+ \ nextgroup=servicesPort skipwhite
+
+syn match servicesPort contained display '\d\+'
+ \ nextgroup=servicesPPDiv,servicesPPDivDepr
+ \ skipwhite
+
+syn match servicesPPDiv contained display '/'
+ \ nextgroup=servicesProtocol skipwhite
+
+syn match servicesPPDivDepr contained display ','
+ \ nextgroup=servicesProtocol skipwhite
+
+syn match servicesProtocol contained display '\S\+'
+ \ nextgroup=servicesAliases,servicesComment
+ \ skipwhite
+
+syn match servicesAliases contained display '\S\+'
+ \ nextgroup=servicesAliases,servicesComment
+ \ skipwhite
+
+syn keyword servicesTodo contained TODO FIXME XXX NOTE
+
+syn region servicesComment display oneline start='#' end='$'
+ \ contains=servicesTodo,@Spell
+
+hi def link servicesTodo Todo
+hi def link servicesComment Comment
+hi def link servicesName Identifier
+hi def link servicesPort Number
+hi def link servicesPPDiv Delimiter
+hi def link servicesPPDivDepr Error
+hi def link servicesProtocol Type
+hi def link servicesAliases Macro
+
+let b:current_syntax = "services"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/setserial.vim b/runtime/syntax/setserial.vim
new file mode 100644
index 0000000..967fa5f
--- /dev/null
+++ b/runtime/syntax/setserial.vim
@@ -0,0 +1,120 @@
+" Vim syntax file
+" Language: setserial(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match setserialBegin display '^'
+ \ nextgroup=setserialDevice,setserialComment
+ \ skipwhite
+
+syn match setserialDevice contained display '\%(/[^ \t/]*\)\+'
+ \ nextgroup=setserialParameter skipwhite
+
+syn keyword setserialParameter contained port irq baud_base divisor
+ \ close_delay closing_wait rx_trigger
+ \ tx_trigger flow_off flow_on rx_timeout
+ \ nextgroup=setserialNumber skipwhite
+
+syn keyword setserialParameter contained uart
+ \ nextgroup=setserialUARTType skipwhite
+
+syn keyword setserialParameter contained autoconfig auto_irq skip_test
+ \ spd_hi spd_vhi spd_shi spd_warp spd_cust
+ \ spd_normal sak fourport session_lockout
+ \ pgrp_lockout hup_notify split_termios
+ \ callout_nohup low_latency
+ \ nextgroup=setserialParameter skipwhite
+
+syn match setserialParameter contained display
+ \ '\^\%(auto_irq\|skip_test\|sak\|fourport\)'
+ \ contains=setserialNegation
+ \ nextgroup=setserialParameter skipwhite
+
+syn match setserialParameter contained display
+ \ '\^\%(session_lockout\|pgrp_lockout\)'
+ \ contains=setserialNegation
+ \ nextgroup=setserialParameter skipwhite
+
+syn match setserialParameter contained display
+ \ '\^\%(hup_notify\|split_termios\)'
+ \ contains=setserialNegation
+ \ nextgroup=setserialParameter skipwhite
+
+syn match setserialParameter contained display
+ \ '\^\%(callout_nohup\|low_latency\)'
+ \ contains=setserialNegation
+ \ nextgroup=setserialParameter skipwhite
+
+syn keyword setserialParameter contained set_multiport
+ \ nextgroup=setserialMultiport skipwhite
+
+syn match setserialNumber contained display '\<\d\+\>'
+ \ nextgroup=setserialParameter skipwhite
+syn match setserialNumber contained display '0x\x\+'
+ \ nextgroup=setserialParameter skipwhite
+
+syn keyword setserialUARTType contained none
+
+syn match setserialUARTType contained display
+ \ '8250\|16[4789]50\|16550A\=\|16650\%(V2\)\='
+ \ nextgroup=setserialParameter skipwhite
+
+syn match setserialUARTType contained display '166[59]4'
+ \ nextgroup=setserialParameter skipwhite
+
+syn match setserialNegation contained display '\^'
+
+syn match setserialMultiport contained '\<port\d\+\>'
+ \ nextgroup=setserialPort skipwhite
+
+syn match setserialPort contained display '\<\d\+\>'
+ \ nextgroup=setserialMask skipwhite
+syn match setserialPort contained display '0x\x\+'
+ \ nextgroup=setserialMask skipwhite
+
+syn match setserialMask contained '\<mask\d\+\>'
+ \ nextgroup=setserialBitMask skipwhite
+
+syn match setserialBitMask contained display '\<\d\+\>'
+ \ nextgroup=setserialMatch skipwhite
+syn match setserialBitMask contained display '0x\x\+'
+ \ nextgroup=setserialMatch skipwhite
+
+syn match setserialMatch contained '\<match\d\+\>'
+ \ nextgroup=setserialMatchBits skipwhite
+
+syn match setserialMatchBits contained display '\<\d\+\>'
+ \ nextgroup=setserialMultiport skipwhite
+syn match setserialMatchBits contained display '0x\x\+'
+ \ nextgroup=setserialMultiport skipwhite
+
+syn keyword setserialTodo contained TODO FIXME XXX NOTE
+
+syn region setserialComment display oneline start='^\s*#' end='$'
+ \ contains=setserialTodo,@Spell
+
+hi def link setserialTodo Todo
+hi def link setserialComment Comment
+hi def link setserialDevice Normal
+hi def link setserialParameter Identifier
+hi def link setserialNumber Number
+hi def link setserialUARTType Type
+hi def link setserialNegation Operator
+hi def link setserialMultiport Type
+hi def link setserialPort setserialNumber
+hi def link setserialMask Type
+hi def link setserialBitMask setserialNumber
+hi def link setserialMatch Type
+hi def link setserialMatchBits setserialNumber
+
+let b:current_syntax = "setserial"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/sexplib.vim b/runtime/syntax/sexplib.vim
new file mode 100644
index 0000000..55dd3fb
--- /dev/null
+++ b/runtime/syntax/sexplib.vim
@@ -0,0 +1,88 @@
+" Vim syntax file
+" Language: S-expressions as used in Sexplib
+" Filenames: *.sexp
+" Maintainers: Markus Mottl <markus.mottl@gmail.com>
+" URL: https://github.com/ocaml/vim-ocaml
+" Last Change: 2020 Dec 31 - Updated header for Vim contribution (MM)
+" 2017 Apr 11 - Improved matching of negative numbers (MM)
+" 2012 Jun 20 - Fixed a block comment highlighting bug (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") && b:current_syntax == "sexplib"
+ finish
+endif
+
+" Sexplib is case sensitive.
+syn case match
+
+" Comments
+syn keyword sexplibTodo contained TODO FIXME XXX NOTE
+syn region sexplibBlockComment matchgroup=sexplibComment start="#|" matchgroup=sexplibComment end="|#" contains=ALLBUT,sexplibQuotedAtom,sexplibUnquotedAtom,sexplibEncl,sexplibComment
+syn match sexplibSexpComment "#;" skipwhite skipempty nextgroup=sexplibQuotedAtomComment,sexplibUnquotedAtomComment,sexplibListComment,sexplibComment
+syn region sexplibQuotedAtomComment start=+"+ skip=+\\\\\|\\"+ end=+"+ contained
+syn match sexplibUnquotedAtomComment /\([^;()" \t#|]\|#[^;()" \t|]\||[^;()" \t#]\)[^;()" \t]*/ contained
+syn region sexplibListComment matchgroup=sexplibComment start="(" matchgroup=sexplibComment end=")" contained contains=ALLBUT,sexplibEncl,sexplibString,sexplibQuotedAtom,sexplibUnquotedAtom,sexplibTodo,sexplibNumber,sexplibFloat
+syn match sexplibComment ";.*" contains=sexplibTodo
+
+" Atoms
+syn match sexplibUnquotedAtom /\([^;()" \t#|]\|#[^;()" \t|]\||[^;()" \t#]\)[^;()" \t]*/
+syn region sexplibQuotedAtom start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match sexplibNumber "-\=\<\d\(_\|\d\)*[l|L|n]\?\>"
+syn match sexplibNumber "-\=\<0[x|X]\(\x\|_\)\+[l|L|n]\?\>"
+syn match sexplibNumber "-\=\<0[o|O]\(\o\|_\)\+[l|L|n]\?\>"
+syn match sexplibNumber "-\=\<0[b|B]\([01]\|_\)\+[l|L|n]\?\>"
+syn match sexplibFloat "-\=\<\d\(_\|\d\)*\.\?\(_\|\d\)*\([eE][-+]\=\d\(_\|\d\)*\)\=\>"
+
+" Lists
+syn region sexplibEncl transparent matchgroup=sexplibEncl start="(" matchgroup=sexplibEncl end=")" contains=ALLBUT,sexplibParenErr
+
+" Errors
+syn match sexplibUnquotedAtomErr /\([^;()" \t#|]\|#[^;()" \t|]\||[^;()" \t#]\)[^;()" \t]*\(#|\||#\)[^;()" \t]*/
+syn match sexplibParenErr ")"
+
+" Synchronization
+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_sexplib_syntax_inits")
+ if version < 508
+ let did_sexplib_syntax_inits = 1
+ command -nargs=+ HiLink hi link <args>
+ else
+ command -nargs=+ HiLink hi def link <args>
+ endif
+
+ HiLink sexplibParenErr Error
+ HiLink sexplibUnquotedAtomErr Error
+
+ HiLink sexplibComment Comment
+ HiLink sexplibSexpComment Comment
+ HiLink sexplibQuotedAtomComment Include
+ HiLink sexplibUnquotedAtomComment Comment
+ HiLink sexplibBlockComment Comment
+ HiLink sexplibListComment Comment
+
+ HiLink sexplibBoolean Boolean
+ HiLink sexplibCharacter Character
+ HiLink sexplibNumber Number
+ HiLink sexplibFloat Float
+ HiLink sexplibUnquotedAtom Identifier
+ HiLink sexplibEncl Identifier
+ HiLink sexplibQuotedAtom Keyword
+
+ HiLink sexplibTodo Todo
+
+ HiLink sexplibEncl Keyword
+
+ delcommand HiLink
+endif
+
+let b:current_syntax = "sexplib"
+
+" vim: ts=8
diff --git a/runtime/syntax/sgml.vim b/runtime/syntax/sgml.vim
new file mode 100644
index 0000000..00d58d1
--- /dev/null
+++ b/runtime/syntax/sgml.vim
@@ -0,0 +1,334 @@
+" Vim syntax file
+" Language: SGML
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Tue, 27 Apr 2004 15:05:21 CEST
+" Filenames: *.sgml,*.sgm
+" $Id: sgml.vim,v 1.1 2004/06/13 17:52:57 vimboss Exp $
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:sgml_cpo_save = &cpo
+set cpo&vim
+
+syn case match
+
+" mark illegal characters
+syn match sgmlError "[<&]"
+
+
+" unicode numbers:
+" provide different highlithing for unicode characters
+" inside strings and in plain text (character data).
+"
+" EXAMPLE:
+"
+" \u4e88
+"
+syn match sgmlUnicodeNumberAttr +\\u\x\{4}+ contained contains=sgmlUnicodeSpecifierAttr
+syn match sgmlUnicodeSpecifierAttr +\\u+ contained
+syn match sgmlUnicodeNumberData +\\u\x\{4}+ contained contains=sgmlUnicodeSpecifierData
+syn match sgmlUnicodeSpecifierData +\\u+ contained
+
+
+" strings inside character data or comments
+"
+syn region sgmlString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=sgmlEntity,sgmlUnicodeNumberAttr display
+syn region sgmlString contained start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=sgmlEntity,sgmlUnicodeNumberAttr display
+
+" punctuation (within attributes) e.g. <tag sgml:foo.attribute ...>
+" ^ ^
+syn match sgmlAttribPunct +[:.]+ contained display
+
+
+" no highlighting for sgmlEqual (sgmlEqual has no highlighting group)
+syn match sgmlEqual +=+
+
+
+" attribute, everything before the '='
+"
+" PROVIDES: @sgmlAttribHook
+"
+" EXAMPLE:
+"
+" <tag foo.attribute = "value">
+" ^^^^^^^^^^^^^
+"
+syn match sgmlAttrib
+ \ +[^-'"<]\@<=\<[a-zA-Z0-9.:]\+\>\([^'">]\@=\|$\)+
+ \ contained
+ \ contains=sgmlAttribPunct,@sgmlAttribHook
+ \ display
+
+
+" UNQUOTED value (not including the '=' -- sgmlEqual)
+"
+" PROVIDES: @sgmlValueHook
+"
+" EXAMPLE:
+"
+" <tag foo.attribute = value>
+" ^^^^^
+"
+syn match sgmlValue
+ \ +[^"' =/!?<>][^ =/!?<>]*+
+ \ contained
+ \ contains=sgmlEntity,sgmlUnicodeNumberAttr,@sgmlValueHook
+ \ display
+
+
+" QUOTED value (not including the '=' -- sgmlEqual)
+"
+" PROVIDES: @sgmlValueHook
+"
+" EXAMPLE:
+"
+" <tag foo.attribute = "value">
+" ^^^^^^^
+" <tag foo.attribute = 'value'>
+" ^^^^^^^
+"
+syn region sgmlValue contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+ \ contains=sgmlEntity,sgmlUnicodeNumberAttr,@sgmlValueHook
+syn region sgmlValue contained start=+'+ skip=+\\\\\|\\'+ end=+'+
+ \ contains=sgmlEntity,sgmlUnicodeNumberAttr,@sgmlValueHook
+
+
+" value, everything after (and including) the '='
+" no highlighting!
+"
+" EXAMPLE:
+"
+" <tag foo.attribute = "value">
+" ^^^^^^^^^
+" <tag foo.attribute = value>
+" ^^^^^^^
+"
+syn match sgmlEqualValue
+ \ +=\s*[^ =/!?<>]\++
+ \ contained
+ \ contains=sgmlEqual,sgmlString,sgmlValue
+ \ display
+
+
+" start tag
+" use matchgroup=sgmlTag to skip over the leading '<'
+" see also sgmlEmptyTag below.
+"
+" PROVIDES: @sgmlTagHook
+"
+syn region sgmlTag
+ \ matchgroup=sgmlTag start=+<[^ /!?"']\@=+
+ \ matchgroup=sgmlTag end=+>+
+ \ contained
+ \ contains=sgmlError,sgmlAttrib,sgmlEqualValue,@sgmlTagHook
+
+
+" tag content for empty tags. This is the same as sgmlTag
+" above, except the `matchgroup=sgmlEndTag for highlighting
+" the end '/>' differently.
+"
+" PROVIDES: @sgmlTagHook
+"
+syn region sgmlEmptyTag
+ \ matchgroup=sgmlTag start=+<[^ /!?"']\@=+
+ \ matchgroup=sgmlEndTag end=+/>+
+ \ contained
+ \ contains=sgmlError,sgmlAttrib,sgmlEqualValue,@sgmlTagHook
+
+
+" end tag
+" highlight everything but not the trailing '>' which
+" was already highlighted by the containing sgmlRegion.
+"
+" PROVIDES: @sgmlTagHook
+" (should we provide a separate @sgmlEndTagHook ?)
+"
+syn match sgmlEndTag
+ \ +</[^ /!?>"']\+>+
+ \ contained
+ \ contains=@sgmlTagHook
+
+
+" [-- SGML SPECIFIC --]
+
+" SGML specific
+" tag content for abbreviated regions
+"
+" PROVIDES: @sgmlTagHook
+"
+syn region sgmlAbbrTag
+ \ matchgroup=sgmlTag start=+<[^ /!?"']\@=+
+ \ matchgroup=sgmlTag end=+/+
+ \ contained
+ \ contains=sgmlError,sgmlAttrib,sgmlEqualValue,@sgmlTagHook
+
+
+" SGML specific
+" just highlight the trailing '/'
+syn match sgmlAbbrEndTag +/+
+
+
+" SGML specific
+" abbreviated regions
+"
+" No highlighting, highlighting is done by contained elements.
+"
+" PROVIDES: @sgmlRegionHook
+"
+" EXAMPLE:
+"
+" <bold/Im Anfang war das Wort/
+"
+syn match sgmlAbbrRegion
+ \ +<[^/!?>"']\+/\_[^/]\+/+
+ \ contains=sgmlAbbrTag,sgmlAbbrEndTag,sgmlCdata,sgmlComment,sgmlEntity,sgmlUnicodeNumberData,@sgmlRegionHook
+
+" [-- END OF SGML SPECIFIC --]
+
+
+" real (non-empty) elements. We cannot do syntax folding
+" as in xml, because end tags may be optional in sgml depending
+" on the dtd.
+" No highlighting, highlighting is done by contained elements.
+"
+" PROVIDES: @sgmlRegionHook
+"
+" EXAMPLE:
+"
+" <tag id="whoops">
+" <!-- comment -->
+" <another.tag></another.tag>
+" <another.tag/>
+" some data
+" </tag>
+"
+" SGML specific:
+" compared to xmlRegion:
+" - removed folding
+" - added a single '/'in the start pattern
+"
+syn region sgmlRegion
+ \ start=+<\z([^ /!?>"']\+\)\(\(\_[^/>]*[^/!?]>\)\|>\)+
+ \ end=+</\z1>+
+ \ contains=sgmlTag,sgmlEndTag,sgmlCdata,@sgmlRegionCluster,sgmlComment,sgmlEntity,sgmlUnicodeNumberData,@sgmlRegionHook
+ \ keepend
+ \ extend
+
+
+" empty tags. Just a container, no highlighting.
+" Compare this with sgmlTag.
+"
+" EXAMPLE:
+"
+" <tag id="lola"/>
+"
+" TODO use sgmlEmptyTag instead of sgmlTag
+syn match sgmlEmptyRegion
+ \ +<[^ /!?>"']\(\_[^"'<>]\|"\_[^"]*"\|'\_[^']*'\)*/>+
+ \ contains=sgmlEmptyTag
+
+
+" cluster which contains the above two elements
+syn cluster sgmlRegionCluster contains=sgmlRegion,sgmlEmptyRegion,sgmlAbbrRegion
+
+
+" &entities; compare with dtd
+syn match sgmlEntity "&[^; \t]*;" contains=sgmlEntityPunct
+syn match sgmlEntityPunct contained "[&.;]"
+
+
+" The real comments (this implements the comments as defined by sgml,
+" but not all sgml pages actually conform to it. Errors are flagged.
+syn region sgmlComment start=+<!+ end=+>+ contains=sgmlCommentPart,sgmlString,sgmlCommentError,sgmlTodo
+syn keyword sgmlTodo contained TODO FIXME XXX display
+syn match sgmlCommentError contained "[^><!]"
+syn region sgmlCommentPart contained start=+--+ end=+--+
+
+
+" CData sections
+"
+" PROVIDES: @sgmlCdataHook
+"
+syn region sgmlCdata
+ \ start=+<!\[CDATA\[+
+ \ end=+]]>+
+ \ contains=sgmlCdataStart,sgmlCdataEnd,@sgmlCdataHook
+ \ keepend
+ \ extend
+" using the following line instead leads to corrupt folding at CDATA regions
+" syn match sgmlCdata +<!\[CDATA\[\_.\{-}]]>+ contains=sgmlCdataStart,sgmlCdataEnd,@sgmlCdataHook
+syn match sgmlCdataStart +<!\[CDATA\[+ contained contains=sgmlCdataCdata
+syn keyword sgmlCdataCdata CDATA contained
+syn match sgmlCdataEnd +]]>+ contained
+
+
+" Processing instructions
+" This allows "?>" inside strings -- good idea?
+syn region sgmlProcessing matchgroup=sgmlProcessingDelim start="<?" end="?>" contains=sgmlAttrib,sgmlEqualValue
+
+
+" DTD -- we use dtd.vim here
+syn region sgmlDocType matchgroup=sgmlDocTypeDecl start="\c<!DOCTYPE"he=s+2,rs=s+2 end=">" contains=sgmlDocTypeKeyword,sgmlInlineDTD,sgmlString
+syn keyword sgmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM
+syn region sgmlInlineDTD contained start="\[" end="]" contains=@sgmlDTD
+syn include @sgmlDTD <sfile>:p:h/dtd.vim
+
+
+" synchronizing
+" TODO !!! to be improved !!!
+
+syn sync match sgmlSyncDT grouphere sgmlDocType +\_.\(<!DOCTYPE\)\@=+
+" syn sync match sgmlSyncDT groupthere NONE +]>+
+
+syn sync match sgmlSync grouphere sgmlRegion +\_.\(<[^ /!?>"']\+\)\@=+
+" syn sync match sgmlSync grouphere sgmlRegion "<[^ /!?>"']*>"
+syn sync match sgmlSync groupthere sgmlRegion +</[^ /!?>"']\+>+
+
+syn sync minlines=100
+
+
+" The default highlighting.
+hi def link sgmlTodo Todo
+hi def link sgmlTag Function
+hi def link sgmlEndTag Identifier
+" SGML specifig
+hi def link sgmlAbbrEndTag Identifier
+hi def link sgmlEmptyTag Function
+hi def link sgmlEntity Statement
+hi def link sgmlEntityPunct Type
+
+hi def link sgmlAttribPunct Comment
+hi def link sgmlAttrib Type
+
+hi def link sgmlValue String
+hi def link sgmlString String
+hi def link sgmlComment Comment
+hi def link sgmlCommentPart Comment
+hi def link sgmlCommentError Error
+hi def link sgmlError Error
+
+hi def link sgmlProcessingDelim Comment
+hi def link sgmlProcessing Type
+
+hi def link sgmlCdata String
+hi def link sgmlCdataCdata Statement
+hi def link sgmlCdataStart Type
+hi def link sgmlCdataEnd Type
+
+hi def link sgmlDocTypeDecl Function
+hi def link sgmlDocTypeKeyword Statement
+hi def link sgmlInlineDTD Function
+hi def link sgmlUnicodeNumberAttr Number
+hi def link sgmlUnicodeSpecifierAttr SpecialChar
+hi def link sgmlUnicodeNumberData Number
+hi def link sgmlUnicodeSpecifierData SpecialChar
+
+let b:current_syntax = "sgml"
+
+let &cpo = s:sgml_cpo_save
+unlet s:sgml_cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/sgmldecl.vim b/runtime/syntax/sgmldecl.vim
new file mode 100644
index 0000000..6c1cde1
--- /dev/null
+++ b/runtime/syntax/sgmldecl.vim
@@ -0,0 +1,72 @@
+" Vim syntax file
+" Language: SGML (SGML Declaration <!SGML ...>)
+" Last Change: jueves, 28 de diciembre de 2000, 13:51:44 CLST
+" Maintainer: "Daniel A. Molina W." <sickd@linux-chile.org>
+" You can modify and maintain this file, in other case send comments
+" the maintainer email address.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+syn case ignore
+
+syn region sgmldeclDeclBlock transparent start=+<!SGML+ end=+>+
+syn region sgmldeclTagBlock transparent start=+<+ end=+>+
+ \ contains=ALLBUT,
+ \ @sgmlTagError,@sgmlErrInTag
+syn region sgmldeclComment contained start=+--+ end=+--+
+
+syn keyword sgmldeclDeclKeys SGML CHARSET CAPACITY SCOPE SYNTAX
+ \ FEATURES
+
+syn keyword sgmldeclTypes BASESET DESCSET DOCUMENT NAMING DELIM
+ \ NAMES QUANTITY SHUNCHAR DOCTYPE
+ \ ELEMENT ENTITY ATTLIST NOTATION
+ \ TYPE
+
+syn keyword sgmldeclStatem CONTROLS FUNCTION NAMECASE MINIMIZE
+ \ LINK OTHER APPINFO REF ENTITIES
+
+syn keyword sgmldeclVariables TOTALCAP GRPCAP ENTCAP DATATAG OMITTAG RANK
+ \ SIMPLE IMPLICIT EXPLICIT CONCUR SUBDOC FORMAL ATTCAP
+ \ ATTCHCAP AVGRPCAP ELEMCAP ENTCHCAP IDCAP IDREFCAP
+ \ SHORTTAG
+
+syn match sgmldeclNConst contained +[0-9]\++
+
+syn region sgmldeclString contained start=+"+ end=+"+
+
+syn keyword sgmldeclBool YES NO
+
+syn keyword sgmldeclSpecial SHORTREF SGMLREF UNUSED NONE GENERAL
+ \ SEEALSO ANY
+
+syn sync lines=250
+
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:set tw=78 ts=4:
diff --git a/runtime/syntax/sgmllnx.vim b/runtime/syntax/sgmllnx.vim
new file mode 100644
index 0000000..ccd78f4
--- /dev/null
+++ b/runtime/syntax/sgmllnx.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" Language: SGML-linuxdoc (supported by old sgmltools-1.x)
+" Maintainer: SungHyun Nam <goweol@gmail.com>
+" Last Change: 2013 May 13
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" tags
+syn region sgmllnxEndTag start=+</+ end=+>+ contains=sgmllnxTagN,sgmllnxTagError
+syn region sgmllnxTag start=+<[^/]+ end=+>+ contains=sgmllnxTagN,sgmllnxTagError
+syn match sgmllnxTagN contained +<\s*[-a-zA-Z0-9]\++ms=s+1 contains=sgmllnxTagName
+syn match sgmllnxTagN contained +</\s*[-a-zA-Z0-9]\++ms=s+2 contains=sgmllnxTagName
+
+syn region sgmllnxTag2 start=+<\s*[a-zA-Z]\+/+ keepend end=+/+ contains=sgmllnxTagN2
+syn match sgmllnxTagN2 contained +/.*/+ms=s+1,me=e-1
+
+syn region sgmllnxSpecial oneline start="&" end=";"
+
+" tag names
+syn keyword sgmllnxTagName contained article author date toc title sect verb
+syn keyword sgmllnxTagName contained abstract tscreen p itemize item enum
+syn keyword sgmllnxTagName contained descrip quote htmlurl code ref
+syn keyword sgmllnxTagName contained tt tag bf it url
+syn match sgmllnxTagName contained "sect\d\+"
+
+" Comments
+syn region sgmllnxComment start=+<!--+ end=+-->+
+syn region sgmllnxDocType start=+<!doctype+ end=+>+
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "sgmllnx"
+
+" vim:set tw=78 ts=8 sts=2 sw=2 noet:
diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim
new file mode 100644
index 0000000..f455f19
--- /dev/null
+++ b/runtime/syntax/sh.vim
@@ -0,0 +1,813 @@
+" Vim syntax file
+" Language: shell (sh) Korn shell (ksh) bash (sh)
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Previous Maintainer: Lennart Schultz <Lennart.Schultz@ecmwf.int>
+" Last Change: Feb 11, 2023
+" Version: 207
+" 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) and heredoc fixes from Felipe Contreras
+
+" quit when a syntax file was already loaded {{{1
+if exists("b:current_syntax")
+ finish
+endif
+
+" If the shell script itself specifies which shell to use, use it
+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_dash = 1
+elseif !exists("g:is_kornshell") && !exists("g:is_bash") && !exists("g:is_posix") && !exists("g:is_sh") && !exists("g:is_dash")
+ " user did not specify which shell to use, and
+ " the script itself does not specify which shell to use. FYI: /bin/sh is ambiguous.
+ " Assuming /bin/sh is executable, and if its a link, find out what it links to.
+ 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 =~ '\<ksh\>'
+ let b:is_kornshell= 1
+ elseif s:shell =~ '\<bash\>'
+ let b:is_bash = 1
+ elseif s:shell =~ '\<dash\>'
+ let b:is_dash = 1
+ endif
+ unlet s:shell
+endif
+
+" handling /bin/sh with is_kornshell/is_sh {{{1
+" b:is_sh will be set when "#! /bin/sh" is found;
+" However, it often is just a masquerade by bash (typically Linux)
+" or kornshell (typically workstations with Posix "sh").
+" So, when the user sets "g:is_bash", "g:is_kornshell",
+" or "g:is_posix", a b:is_sh is converted into b:is_bash/b:is_kornshell,
+" respectively.
+if !exists("b:is_kornshell") && !exists("b:is_bash") && !exists("b:is_dash")
+ if exists("g:is_posix") && !exists("g:is_kornshell")
+ let g:is_kornshell= g:is_posix
+ endif
+ if exists("g:is_kornshell")
+ let b:is_kornshell= 1
+ if exists("b:is_sh")
+ unlet b:is_sh
+ endif
+ elseif exists("g:is_bash")
+ let b:is_bash= 1
+ if exists("b:is_sh")
+ unlet b:is_sh
+ endif
+ elseif exists("g:is_dash")
+ let b:is_dash= 1
+ if exists("b:is_sh")
+ unlet b:is_sh
+ endif
+ else
+ let b:is_sh= 1
+ endif
+endif
+
+" if b:is_dash, set b:is_posix too
+if exists("b:is_dash")
+ let b:is_posix= 1
+endif
+
+" set up default g:sh_fold_enabled {{{1
+" ================================
+if !exists("g:sh_fold_enabled")
+ let g:sh_fold_enabled= 0
+elseif g:sh_fold_enabled != 0 && !has("folding")
+ let g:sh_fold_enabled= 0
+ echomsg "Ignoring g:sh_fold_enabled=".g:sh_fold_enabled."; need to re-compile vim for +fold support"
+endif
+let s:sh_fold_functions= and(g:sh_fold_enabled,1)
+let s:sh_fold_heredoc = and(g:sh_fold_enabled,2)
+let s:sh_fold_ifdofor = and(g:sh_fold_enabled,4)
+if g:sh_fold_enabled && &fdm == "manual"
+ " Given that the user provided g:sh_fold_enabled
+ " AND g:sh_fold_enabled is manual (usual default)
+ " implies a desire for syntax-based folding
+ setl fdm=syntax
+endif
+
+" set up the syntax-highlighting for iskeyword
+if (v:version == 704 && has("patch-7.4.1142")) || v:version > 704
+ if !exists("g:sh_syntax_isk") || (exists("g:sh_syntax_isk") && g:sh_syntax_isk)
+ if exists("b:is_bash")
+ exe "syn iskeyword ".&iskeyword.",-,:"
+ else
+ exe "syn iskeyword ".&iskeyword.",-"
+ endif
+ endif
+endif
+
+" Set up folding commands for shell {{{1
+" =================================
+sil! delc ShFoldFunctions
+sil! delc ShFoldHereDoc
+sil! delc ShFoldIfDoFor
+if s:sh_fold_functions
+ com! -nargs=* ShFoldFunctions <args> fold
+else
+ com! -nargs=* ShFoldFunctions <args>
+endif
+if s:sh_fold_heredoc
+ com! -nargs=* ShFoldHereDoc <args> fold
+else
+ com! -nargs=* ShFoldHereDoc <args>
+endif
+if s:sh_fold_ifdofor
+ com! -nargs=* ShFoldIfDoFor <args> fold
+else
+ com! -nargs=* ShFoldIfDoFor <args>
+endif
+
+" sh syntax is case sensitive {{{1
+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") || exists("b:is_bash")
+ syn cluster ErrorList add=shDTestError
+endif
+syn cluster shArithParenList contains=shArithmetic,shArithParen,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,shFunctionKey,shFunctionOne,shFunctionTwo
+syn cluster shArithList contains=@shArithParenList,shParenError
+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,shDblBrace,shDo,shEcho,shExpr,shFor,shHereDoc,shIf,shHereString,shRedir,shSetList,shSource,shStatement,shVariable,shCtrlSeq
+if exists("b:is_kornshell") || exists("b:is_bash")
+ syn cluster shCaseList add=shForPP
+endif
+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
+" COMBAK: removing shEscape from shDblQuoteList fails ksh04:43 -- Jun 09, 2022: I don't see the problem with ksh04, so am reinstating shEscape
+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=shDerefOffset,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,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,shDblBrace,shDblParen,shForPP
+ syn cluster shDerefList add=shCommandSubList,shEchoDeref
+endif
+syn cluster shHereBeginList contains=@shCommandSubList
+syn cluster shHereList contains=shBeginHere,shHerePayload
+syn cluster shHereListDQ contains=shBeginHere,@shDblQuoteList,shHerePayload
+syn cluster shIdList contains=shArithmetic,shCommandSub,shCommandSubBQ,shWrapLineOperator,shSetOption,shComment,shDeref,shDerefSimple,shHereString,shNumber,shOperator,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,shIf,shOption,shSet,shTest,shTestOpr,shTouch
+if exists("b:is_kornshell") || exists("b:is_bash")
+ syn cluster shLoopoList add=shForPP
+endif
+syn cluster shPPSLeftList contains=shAlias,shArithmetic,shCmdParenRegion,shCommandSub,shCtrlSeq,shDeref,shDerefSimple,shDoubleQuote,shEcho,shEscape,shExDoubleQuote,shExpr,shExSingleQuote,shHereDoc,shNumber,shOperator,shOption,shPosnParm,shHereString,shRedir,shSingleQuote,shSpecial,shStatement,shSubSh,shTest,shVariable
+syn cluster shPPSRightList contains=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=shArithmetic,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
+" ====
+" This one is needed INSIDE a CommandSub, so that `echo bla` be correct
+syn region shEcho matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+syn region shEcho matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|()`]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+if exists("b:is_kornshell") || exists("b:is_bash") || exists("b:is_posix")
+ syn region shEchoDeref contained matchgroup=shStatement start="\<echo\>" skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+ syn region shEchoDeref contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" end="[<>;&|()`}]"me=e-1 end="\d[<>]"me=e-2 end="#"me=e-1 contains=@shEchoList skipwhite nextgroup=shQuickComment
+endif
+syn match shEchoQuote contained '\%(\\\\\)*\\["`'()]'
+
+" This must be after the strings, so that ... \" will be correct
+syn region shEmbeddedEcho contained matchgroup=shStatement start="\<print\>" skip="\\$" matchgroup=shEchoDelim end="$" matchgroup=NONE end="[<>;&|`)]"me=e-1 end="\d[<>]"me=e-2 end="\s#"me=e-2 contains=shNumber,shExSingleQuote,shSingleQuote,shDeref,shDerefSimple,shSpecialVar,shOperator,shExDoubleQuote,shDoubleQuote,shCharClass,shCtrlSeq
+
+" Alias: {{{1
+" =====
+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="="
+" 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=shComment contains=shTouchCmd,shDoubleQuote,shSingleQuote,shDeref,shDerefSimple
+ syn match shTouchCmd '\<touch\>' contained
+endif
+
+" Error Codes: {{{1
+" ============
+if !exists("g:sh_no_error")
+ syn match shDoError "\<done\>"
+ syn match shIfError "\<fi\>"
+ syn match shInError "\<in\>"
+ syn match shCaseError ";;"
+ syn match shEsacError "\<esac\>"
+ syn match shCurlyError "}"
+ syn match shParenError ")"
+ syn match shOK '\.\(done\|fi\|in\|esac\)'
+ if exists("b:is_kornshell") || exists("b:is_bash")
+ syn match shDTestError "]]"
+ endif
+ syn match shTestError "]"
+endif
+
+" Options: {{{1
+" ====================
+syn match shOption "\s\zs[-+][-_a-zA-Z#@]\+"
+syn match shOption "\s\zs--[^ \t$=`'"|);]\+"
+
+" File Redirection Highlighted As Operators: {{{1
+"===========================================
+syn match shRedir "\d\=>\(&[-0-9]\)\="
+syn match shRedir "\d\=>>-\="
+syn match shRedir "\d\=<\(&[-0-9]\)\="
+syn match shRedir "\d<<-\="
+
+" Operators: {{{1
+" ==========
+syn match shOperator "<<\|>>" contained
+syn match shOperator "[!&;|]" contained
+syn match shOperator "\[[[^:]\|\]]" contained
+syn match shOperator "[-=/*+%]\==" skipwhite nextgroup=shPattern
+syn match shPattern "\<\S\+\())\)\@=" contained contains=shExSingleQuote,shSingleQuote,shExDoubleQuote,shDoubleQuote,shDeref
+
+" Subshells: {{{1
+" ==========
+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' 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='"' 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,shAstQuote,shNoQuote,shComment
+ syn region shDblParen matchgroup=Delimiter start="((" skip=+\%(\\\\\)*\\$+ end="))" contains=@shTestList,shComment
+endif
+
+" Character Class In Range: {{{1
+" =========================
+syn match shCharClass contained "\[:\(backspace\|escape\|return\|xdigit\|alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|tab\):\]"
+
+" Loops: do, if, while, until {{{1
+" ======
+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
+if exists("b:is_kornshell") || exists("b:is_bash")
+ ShFoldIfDoFor syn region shForPP matchgroup=shLoop start='\<for\>\_s*((' end='))' contains=@shForList
+endif
+
+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="\<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
+endif
+syn region shCurlyIn contained matchgroup=Delimiter start="{" end="}" contains=@shCurlyList
+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
+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
+elseif exists("b:is_kornshell")
+ ShFoldIfDoFor syn region shCase contained skipwhite skipnl matchgroup=shSnglCase start="\%(\\.\|[^#$()'" \t]\)\{-}\zs)" 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") || exists("b:is_kornshell")
+ syn region shCaseExSingleQuote matchgroup=shQuote start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial,shSpecial skipwhite skipnl nextgroup=shCaseBar contained
+elseif !exists("g:sh_no_error")
+ syn region shCaseExSingleQuote matchgroup=Error start=+\$'+ skip=+\\\\\|\\.+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
+endif
+syn region shCaseSingleQuote matchgroup=shQuote start=+'+ end=+'+ contains=shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
+syn region shCaseDoubleQuote matchgroup=shQuote start=+"+ skip=+\\\\\|\\.+ end=+"+ contains=@shDblQuoteList,shStringSpecial skipwhite skipnl nextgroup=shCaseBar contained
+syn region shCaseCommandSub start=+`+ skip=+\\\\\|\\.+ end=+`+ contains=@shCommandSubList skipwhite skipnl nextgroup=shCaseBar contained
+if exists("b:is_bash")
+ syn region shCaseRange matchgroup=Delimiter start=+\[+ skip=+\\\\+ end=+\]+ contained contains=shCharClass
+ syn match shCharClass '\[:\%(alnum\|alpha\|ascii\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|word\|or\|xdigit\):\]' contained
+else
+ syn region shCaseRange matchgroup=Delimiter start=+\[+ skip=+\\\\+ end=+\]+ contained
+endif
+" Misc: {{{1
+"======
+syn match shWrapLineOperator "\\$"
+syn region shCommandSubBQ start="`" skip="\\\\\|\\." end="`" contains=shBQComment,@shCommandSubList
+"COMBAK: see ksh13:50
+"syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shSingleQuote,shDoubleQuote,shComment
+"COMBAK: see sh11:27
+syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.' nextgroup=shComment
+"COMBAK: see ksh13:53
+"syn match shEscape contained '\%(^\)\@!\%(\\\\\)*\\.'
+
+" $() and $(()): {{{1
+" $(..) is not supported by sh (Bourne shell). However, apparently
+" some systems (HP?) have as their /bin/sh a (link to) Korn shell
+" (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") || exists("b:is_posix")
+ syn region shCommandSub matchgroup=shCmdSubRegion start="\$(\ze[^(]" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
+ syn region shArithmetic matchgroup=shArithRegion start="\$((" skip='\\\\\|\\.' end="))" contains=@shArithList
+ syn region shArithmetic matchgroup=shArithRegion start="\$\[" skip='\\\\\|\\.' end="\]" contains=@shArithList
+ syn match shSkipInitWS contained "^\s\+"
+ syn region shArithParen matchgroup=shArithRegion contained start="(" end=")" contains=@shArithParenList
+elseif !exists("g:sh_no_error")
+ syn region shCommandSub matchgroup=Error start="\$(" end=")" contains=@shCommandSubList
+endif
+syn region shCmdParenRegion matchgroup=shCmdSubRegion start="(\ze[^(]" skip='\\\\\|\\.' end=")" contains=@shCommandSubList
+
+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 head 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") || 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
+ syn keyword kshStatement cat chmod clear cp du egrep expr fgrep find grep head killall less ls mkdir mv nice printenv rm rmdir sed sort strip stty tail tput
+ syn keyword kshStatement command setgroups setsenv
+endif
+
+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
+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") || exists("b:is_kornshell")
+ 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 nextgroup=shSpecialStart,shSpecialSQ
+syn region shDoubleQuote matchgroup=shQuote start=+\%(\%(\\\\\)*\\\)\@<!"+ skip=+\\.+ end=+"+ 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 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
+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 "#.*$" contains=@shCommentGroup
+syn match shBQComment contained "#.\{-}\ze`" contains=@shCommentGroup
+
+" Here Documents: {{{1
+" (modified by Felipe Contreras)
+" =========================================
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc01 start="<<\s*\z([^ \t|>]\+\)" matchgroup=shHereDoc01 end="^\z1$" contains=@shDblQuoteList
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc02 start="<<-\s*\z([^ \t|>]\+\)" matchgroup=shHereDoc02 end="^\s*\z1$" contains=@shDblQuoteList
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc03 start="<<\s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc03 end="^\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc04 start="<<-\s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc04 end="^\s*\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc05 start="<<\s*'\z([^']\+\)'" matchgroup=shHereDoc05 end="^\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc06 start="<<-\s*'\z([^']\+\)'" matchgroup=shHereDoc06 end="^\s*\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc07 start="<<\s*\"\z([^"]\+\)\"" matchgroup=shHereDoc07 end="^\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc08 start="<<-\s*\"\z([^"]\+\)\"" matchgroup=shHereDoc08 end="^\s*\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc09 start="<<\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc09 end="^\z1$" contains=@shDblQuoteList
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc10 start="<<-\s*\\\_$\_s*\z([^ \t|>]\+\)" matchgroup=shHereDoc10 end="^\s*\z1$" contains=@shDblQuoteList
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc11 start="<<\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc11 end="^\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc12 start="<<-\s*\\\_$\_s*\\\z([^ \t|>]\+\)" matchgroup=shHereDoc12 end="^\s*\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc13 start="<<\s*\\\_$\_s*'\z([^']\+\)'" matchgroup=shHereDoc13 end="^\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc14 start="<<-\s*\\\_$\_s*'\z([^']\+\)'" matchgroup=shHereDoc14 end="^\s*\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc15 start="<<\s*\\\_$\_s*\"\z([^"]\+\)\"" matchgroup=shHereDoc15 end="^\z1$"
+ShFoldHereDoc syn region shHereDoc matchgroup=shHereDoc16 start="<<-\s*\\\_$\_s*\"\z([^"]\+\)\"" matchgroup=shHereDoc16 end="^\s*\z1$"
+
+
+" 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("b:is_posix"))
+ syn match shHereString "<<<" skipwhite nextgroup=shCmdParenRegion
+endif
+
+" Identifiers: {{{1
+"=============
+syn match shSetOption "\s\zs[-+][a-zA-Z0-9]\+\>" contained
+syn match shVariable "\<\h\w*\ze=" nextgroup=shVarAssign
+syn match shVarAssign "=" contained nextgroup=shCmdParenRegion,shPattern,shDeref,shDerefSimple,shDoubleQuote,shExDoubleQuote,shSingleQuote,shExSingleQuote,shVar
+syn match shVar contained "\h\w*"
+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\|local\|export\)\>\ze[/a-zA-Z_]\@!" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+#\|=" contains=@shIdList
+ syn region shSetList oneline matchgroup=shSet start="\<\%(set\|unset\)\>[/a-zA-Z_]\@!" 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\+$"
+ if exists("b:is_dash")
+ syn region shSetList oneline matchgroup=shSet start="\<\%(local\)\>\ze[/]\@!" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
+ endif
+ syn region shSetList oneline matchgroup=shSet start="\<\(export\)\>\ze[/]\@!" end="$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
+ syn region shSetList oneline matchgroup=shSet start="\<\%(set\|unset\>\)\ze[/a-zA-Z_]\@!" end="\ze[;|#)]\|$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList nextgroup=shComment
+else
+ syn region shSetList oneline matchgroup=shSet start="\<\(set\|export\|unset\)\>\ze[/a-zA-Z_]\@!" end="\ze[;|#)]\|$" matchgroup=shSetListDelim end="\ze[}|);&]" matchgroup=NONE end="\ze\s\+[#=]" contains=@shIdList
+endif
+
+" KornShell namespace: {{{1
+if exists("b:is_kornshell")
+ syn keyword shFunctionKey namespace skipwhite skipnl nextgroup=shFunctionTwo
+endif
+
+" Functions: {{{1
+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*[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="\%(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
+" ========================
+" Note: sh04 failure with following line
+"if !exists("g:sh_no_error") && !(exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix"))
+if !exists("g:sh_no_error")
+ syn match shDerefWordError "[^}$[~]" contained
+endif
+syn match shDerefSimple "\$\%(\h\w*\|\d\)" nextgroup=@shNoZSList
+syn region shDeref matchgroup=PreProc start="\${" end="}" contains=@shDerefList,shDerefVarArray nextgroup=shSpecialStart
+syn match shDerefSimple "\$[-#*@!?]" nextgroup=@shNoZSList
+syn match shDerefSimple "\$\$" nextgroup=@shNoZSList
+syn match shDerefSimple "\${\d}" nextgroup=@shNoZSList nextgroup=shSpecialStart
+if exists("b:is_bash") || exists("b:is_kornshell") || exists("b:is_posix")
+ syn region shDeref matchgroup=PreProc start="\${##\=" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS,shSpecialStart
+ syn region shDeref matchgroup=PreProc start="\${\$\$" end="}" contains=@shDerefList nextgroup=@shSpecialNoZS,shSpecialStart
+endif
+
+" ksh: ${.sh.*} variables: {{{1
+" ========================================
+if exists("b:is_kornshell")
+ syn match shDerefVar contained "\.\+" nextgroup=@shDerefVarList
+endif
+
+" ksh: ${!var[*]} array index list syntax: {{{1
+" ========================================
+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,shDerefOffset
+ syn match shDerefVar contained "{\@<=!\h\w*" nextgroup=@shDerefVarList
+endif
+if exists("b:is_kornshell")
+ syn match shDerefVar contained "{\@<=!\h\w*[[:alnum:]_.]*" nextgroup=@shDerefVarList
+endif
+
+syn match shDerefSpecial contained "{\@<=[-*@?0]" nextgroup=shDerefOp,shDerefOffset,shDerefOpError
+syn match shDerefSpecial contained "\({[#!]\)\@<=[[:alnum:]*@_]\+" nextgroup=@shDerefVarList,shDerefOp
+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
+syn region shDerefVarArray contained matchgroup=shDeref start="\[" end="]" contains=@shCommandSubList nextgroup=shDerefOp,shDerefOpError
+
+" Special ${parameter OPERATOR word} handling: {{{1
+" sh ksh bash : ${parameter:-word} word is default value
+" sh ksh bash : ${parameter:=word} assign word as default value
+" sh ksh bash : ${parameter:?word} display word if parameter is null
+" sh ksh bash : ${parameter:+word} use word if parameter is not null, otherwise nothing
+" ksh bash : ${parameter#pattern} remove small left pattern
+" ksh bash : ${parameter##pattern} remove large left pattern
+" ksh bash : ${parameter%pattern} remove small right pattern
+" ksh bash : ${parameter%%pattern} remove large right pattern
+" bash : ${parameter^pattern} Case modification
+" bash : ${parameter^^pattern} Case modification
+" bash : ${parameter,pattern} Case modification
+" bash : ${parameter,,pattern} Case modification
+" bash : ${@:start:qty} display command line arguments from start to start+qty-1 (inferred)
+" bash : ${parameter@operator} transforms parameter (operator∈[uULqEPARa])
+syn cluster shDerefPatternList contains=shDerefPattern,shDerefString
+if !exists("g:sh_no_error")
+ syn match shDerefOpError contained ":[[:punct:]]"
+endif
+syn match shDerefOp contained ":\=[-=?]" nextgroup=@shDerefPatternList
+syn match shDerefOp contained ":\=+" nextgroup=@shDerefPatternList
+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
+ syn match shDerefOp contained "@[uULQEPAKa]"
+endif
+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") || exists("b:is_kornshell") || exists("b:is_posix")
+ " bash ksh posix : ${parameter:offset}
+ " bash ksh posix : ${parameter:offset:length}
+ syn region shDerefOffset contained start=':[^-=?+]' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
+ syn region shDerefOffset contained start=':\s-' end='\ze:' end='\ze}' contains=shDeref,shDerefSimple,shDerefEscape nextgroup=shDerefLen,shDeref,shDerefSimple
+ syn match shDerefLen contained ":[^}]\+" contains=shDeref,shDerefSimple,shArithmetic
+endif
+
+if exists("b:is_bash")
+ " 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}' end='"' nextgroup=shDerefPPSright contains=@shPPSLeftList
+ syn region shDerefPPSright contained start='.' skip=@\%(\\\\\)\+@ end='\ze}' contains=@shPPSRightList
+
+ " bash : ${parameter/#substring/replacement}
+ 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
+
+" Arithmetic Parenthesized Expressions: {{{1
+"syn region shParen matchgroup=shArithRegion start='[^$]\zs(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
+syn region shParen matchgroup=shArithRegion start='\$\@!(\%(\ze[^(]\|$\)' end=')' contains=@shArithParenList
+
+" 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
+if !exists("g:sh_no_error")
+ syn keyword shCondError elif else then
+endif
+
+" Additional ksh Keywords and Aliases: {{{1
+" ===================================
+if exists("b:is_kornshell") || exists("b:is_posix")
+ syn keyword shStatement bg builtin disown enum export false fg getconf getopts hist jobs let printf sleep true unalias whence
+ syn keyword shStatement typeset skipwhite nextgroup=shSetOption
+ 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
+
+" Additional bash Keywords: {{{1
+" =====================
+elseif exists("b:is_bash")
+ syn keyword shStatement bg builtin disown export false fg getopts jobs let printf sleep true unalias
+ syn keyword shStatement typeset nextgroup=shSetOption
+ syn keyword shStatement fc hash history source suspend times type
+ syn keyword shStatement bind builtin caller compopt declare dirs disown enable export help logout mapfile popd pushd readarray shopt source typeset
+else
+ syn keyword shStatement login newgrp
+endif
+
+" Synchronization: {{{1
+" ================
+if !exists("g:sh_minlines")
+ let s:sh_minlines = 200
+else
+ let s:sh_minlines= g:sh_minlines
+endif
+if !exists("g:sh_maxlines")
+ let s:sh_maxlines = 2*s:sh_minlines
+ if s:sh_maxlines < 25
+ let s:sh_maxlines= 25
+ endif
+else
+ let s:sh_maxlines= g:sh_maxlines
+endif
+exec "syn sync minlines=" . s:sh_minlines . " maxlines=" . s:sh_maxlines
+syn sync match shCaseEsacSync grouphere shCaseEsac "\<case\>"
+syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
+syn sync match shDoSync grouphere shDo "\<do\>"
+syn sync match shDoSync groupthere shDo "\<done\>"
+syn sync match shForSync grouphere shFor "\<for\>"
+syn sync match shForSync groupthere shFor "\<in\>"
+syn sync match shIfSync grouphere shIf "\<if\>"
+syn sync match shIfSync groupthere shIf "\<fi\>"
+syn sync match shUntilSync grouphere shRepeat "\<until\>"
+syn sync match shWhileSync grouphere shRepeat "\<while\>"
+
+" Default Highlighting: {{{1
+" =====================
+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 shCharClass shSpecial
+ hi def link shDerefOffset shDerefOp
+ hi def link shDerefLen shDerefOffset
+ 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 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
+
+ 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
+ hi def link shHereDoc16 shRedir
+endif
+
+" Delete shell folding commands {{{1
+" =============================
+delc ShFoldFunctions
+delc ShFoldHereDoc
+delc ShFoldIfDoFor
+
+" Set Current Syntax: {{{1
+" ===================
+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
+
+" vim: ts=16 fdm=marker
diff --git a/runtime/syntax/shared/README.txt b/runtime/syntax/shared/README.txt
new file mode 100644
index 0000000..fade4b3
--- /dev/null
+++ b/runtime/syntax/shared/README.txt
@@ -0,0 +1,2 @@
+This directory "runtime/syntax/shared" contains Vim script files that are
+generated or used by more than one syntax file.
diff --git a/runtime/syntax/shared/context-data-context.vim b/runtime/syntax/shared/context-data-context.vim
new file mode 100644
index 0000000..82cf41b
--- /dev/null
+++ b/runtime/syntax/shared/context-data-context.vim
@@ -0,0 +1,345 @@
+vim9script
+
+# Vim syntax file
+# Language: ConTeXt
+# Automatically generated by mtx-interface (2022-08-12 10:49)
+
+syn keyword contextConstants zerocount minusone minustwo plusone plustwo contained
+syn keyword contextConstants plusthree plusfour plusfive plussix plusseven contained
+syn keyword contextConstants pluseight plusnine plusten pluseleven plustwelve contained
+syn keyword contextConstants plussixteen plusfifty plushundred plusonehundred plustwohundred contained
+syn keyword contextConstants plusfivehundred plusthousand plustenthousand plustwentythousand medcard contained
+syn keyword contextConstants maxcard maxcardminusone zeropoint onepoint halfapoint contained
+syn keyword contextConstants onebasepoint maxcount maxdimen scaledpoint thousandpoint contained
+syn keyword contextConstants points halfpoint zeroskip centeringskip stretchingskip contained
+syn keyword contextConstants shrinkingskip centeringfillskip stretchingfillskip shrinkingfillskip zeromuskip contained
+syn keyword contextConstants onemuskip pluscxxvii pluscxxviii pluscclv pluscclvi contained
+syn keyword contextConstants normalpagebox binaryshiftedten binaryshiftedtwenty binaryshiftedthirty thickermuskip contained
+syn keyword contextConstants directionlefttoright directionrighttoleft endoflinetoken outputnewlinechar emptytoks contained
+syn keyword contextConstants empty undefined prerollrun voidbox emptybox contained
+syn keyword contextConstants emptyvbox emptyhbox bigskipamount medskipamount smallskipamount contained
+syn keyword contextConstants fmtname fmtversion texengine texenginename texengineversion contained
+syn keyword contextConstants texenginefunctionality luatexengine pdftexengine xetexengine unknownengine contained
+syn keyword contextConstants contextformat contextversion contextlmtxmode contextmark mksuffix contained
+syn keyword contextConstants activecatcode bgroup egroup endline conditionaltrue contained
+syn keyword contextConstants conditionalfalse attributeunsetvalue statuswrite uprotationangle rightrotationangle contained
+syn keyword contextConstants downrotationangle leftrotationangle inicatcodes ctxcatcodes texcatcodes contained
+syn keyword contextConstants notcatcodes txtcatcodes vrbcatcodes prtcatcodes nilcatcodes contained
+syn keyword contextConstants luacatcodes tpacatcodes tpbcatcodes xmlcatcodes ctdcatcodes contained
+syn keyword contextConstants rlncatcodes escapecatcode begingroupcatcode endgroupcatcode mathshiftcatcode contained
+syn keyword contextConstants alignmentcatcode endoflinecatcode parametercatcode superscriptcatcode subscriptcatcode contained
+syn keyword contextConstants ignorecatcode spacecatcode lettercatcode othercatcode activecatcode contained
+syn keyword contextConstants commentcatcode invalidcatcode tabasciicode newlineasciicode formfeedasciicode contained
+syn keyword contextConstants endoflineasciicode endoffileasciicode commaasciicode spaceasciicode periodasciicode contained
+syn keyword contextConstants hashasciicode dollarasciicode commentasciicode ampersandasciicode colonasciicode contained
+syn keyword contextConstants backslashasciicode circumflexasciicode underscoreasciicode leftbraceasciicode barasciicode contained
+syn keyword contextConstants rightbraceasciicode tildeasciicode delasciicode leftparentasciicode rightparentasciicode contained
+syn keyword contextConstants lessthanasciicode morethanasciicode doublecommentsignal atsignasciicode exclamationmarkasciicode contained
+syn keyword contextConstants questionmarkasciicode doublequoteasciicode singlequoteasciicode forwardslashasciicode primeasciicode contained
+syn keyword contextConstants hyphenasciicode percentasciicode leftbracketasciicode rightbracketasciicode hsizefrozenparcode contained
+syn keyword contextConstants skipfrozenparcode hangfrozenparcode indentfrozenparcode parfillfrozenparcode adjustfrozenparcode contained
+syn keyword contextConstants protrudefrozenparcode tolerancefrozenparcode stretchfrozenparcode loosenessfrozenparcode lastlinefrozenparcode contained
+syn keyword contextConstants linepenaltyfrozenparcode clubpenaltyfrozenparcode widowpenaltyfrozenparcode displaypenaltyfrozenparcode brokenpenaltyfrozenparcode contained
+syn keyword contextConstants demeritsfrozenparcode shapefrozenparcode linefrozenparcode hyphenationfrozenparcode shapingpenaltyfrozenparcode contained
+syn keyword contextConstants orphanpenaltyfrozenparcode allfrozenparcode mathpenaltyfrozenparcode activemathcharcode activetabtoken contained
+syn keyword contextConstants activeformfeedtoken activeendoflinetoken batchmodecode nonstopmodecode scrollmodecode contained
+syn keyword contextConstants errorstopmodecode bottomlevelgroupcode simplegroupcode hboxgroupcode adjustedhboxgroupcode contained
+syn keyword contextConstants vboxgroupcode vtopgroupcode aligngroupcode noaligngroupcode outputgroupcode contained
+syn keyword contextConstants mathgroupcode discretionarygroupcode insertgroupcode vadjustgroupcode vcentergroupcode contained
+syn keyword contextConstants mathabovegroupcode mathchoicegroupcode alsosimplegroupcode semisimplegroupcode mathshiftgroupcode contained
+syn keyword contextConstants mathleftgroupcode localboxgroupcode splitoffgroupcode splitkeepgroupcode preamblegroupcode contained
+syn keyword contextConstants alignsetgroupcode finrowgroupcode discretionarygroupcode markautomigrationcode insertautomigrationcode contained
+syn keyword contextConstants adjustautomigrationcode preautomigrationcode postautomigrationcode charnodecode hlistnodecode contained
+syn keyword contextConstants vlistnodecode rulenodecode insertnodecode marknodecode adjustnodecode contained
+syn keyword contextConstants ligaturenodecode discretionarynodecode whatsitnodecode mathnodecode gluenodecode contained
+syn keyword contextConstants kernnodecode penaltynodecode unsetnodecode mathsnodecode charifcode contained
+syn keyword contextConstants catifcode numifcode dimifcode oddifcode vmodeifcode contained
+syn keyword contextConstants hmodeifcode mmodeifcode innerifcode voidifcode hboxifcode contained
+syn keyword contextConstants vboxifcode xifcode eofifcode trueifcode falseifcode contained
+syn keyword contextConstants caseifcode definedifcode csnameifcode fontcharifcode overrulemathcontrolcode contained
+syn keyword contextConstants underrulemathcontrolcode radicalrulemathcontrolcode fractionrulemathcontrolcode accentskewhalfmathcontrolcode accentskewapplymathcontrolcode contained
+syn keyword contextConstants applyordinarykernpairmathcontrolcode applyverticalitalickernmathcontrolcode applyordinaryitalickernmathcontrolcode applycharitalickernmathcontrolcode reboxcharitalickernmathcontrolcode contained
+syn keyword contextConstants applyboxeditalickernmathcontrolcode staircasekernmathcontrolcode applytextitalickernmathcontrolcode applyscriptitalickernmathcontrolcode checkspaceitalickernmathcontrolcode contained
+syn keyword contextConstants checktextitalickernmathcontrolcode analyzescriptnucleuscharmathcontrolcode analyzescriptnucleuslistmathcontrolcode analyzescriptnucleusboxmathcontrolcode noligaturingglyphoptioncode contained
+syn keyword contextConstants nokerningglyphoptioncode noexpansionglyphoptioncode noprotrusionglyphoptioncode noleftkerningglyphoptioncode noleftligaturingglyphoptioncode contained
+syn keyword contextConstants norightkerningglyphoptioncode norightligaturingglyphoptioncode noitaliccorrectionglyphoptioncode normalparcontextcode vmodeparcontextcode contained
+syn keyword contextConstants vboxparcontextcode vtopparcontextcode vcenterparcontextcode vadjustparcontextcode insertparcontextcode contained
+syn keyword contextConstants outputparcontextcode alignparcontextcode noalignparcontextcode spanparcontextcode resetparcontextcode contained
+syn keyword contextConstants leftoriginlistanchorcode leftheightlistanchorcode leftdepthlistanchorcode rightoriginlistanchorcode rightheightlistanchorcode contained
+syn keyword contextConstants rightdepthlistanchorcode centeroriginlistanchorcode centerheightlistanchorcode centerdepthlistanchorcode halfwaytotallistanchorcode contained
+syn keyword contextConstants halfwayheightlistanchorcode halfwaydepthlistanchorcode halfwayleftlistanchorcode halfwayrightlistanchorcode negatexlistsigncode contained
+syn keyword contextConstants negateylistsigncode negatelistsigncode fontslantperpoint fontinterwordspace fontinterwordstretch contained
+syn keyword contextConstants fontinterwordshrink fontexheight fontemwidth fontextraspace slantperpoint contained
+syn keyword contextConstants mathexheight mathemwidth interwordspace interwordstretch interwordshrink contained
+syn keyword contextConstants exheight emwidth extraspace mathaxisheight muquad contained
+syn keyword contextConstants startmode stopmode startnotmode stopnotmode startmodeset contained
+syn keyword contextConstants stopmodeset doifmode doifelsemode doifmodeelse doifnotmode contained
+syn keyword contextConstants startmodeset stopmodeset startallmodes stopallmodes startnotallmodes contained
+syn keyword contextConstants stopnotallmodes doifallmodes doifelseallmodes doifallmodeselse doifnotallmodes contained
+syn keyword contextConstants startenvironment stopenvironment environment startcomponent stopcomponent contained
+syn keyword contextConstants component startproduct stopproduct product startproject contained
+syn keyword contextConstants stopproject project starttext stoptext startnotext contained
+syn keyword contextConstants stopnotext startdocument stopdocument documentvariable unexpandeddocumentvariable contained
+syn keyword contextConstants setupdocument presetdocument doifelsedocumentvariable doifdocumentvariableelse doifdocumentvariable contained
+syn keyword contextConstants doifnotdocumentvariable startmodule stopmodule usemodule usetexmodule contained
+syn keyword contextConstants useluamodule setupmodule currentmoduleparameter moduleparameter everystarttext contained
+syn keyword contextConstants everystoptext startTEXpage stopTEXpage enablemode disablemode contained
+syn keyword contextConstants preventmode definemode globalenablemode globaldisablemode globalpreventmode contained
+syn keyword contextConstants pushmode popmode typescriptone typescripttwo typescriptthree contained
+syn keyword contextConstants mathsizesuffix mathordinarycode mathordcode mathoperatorcode mathopcode contained
+syn keyword contextConstants mathbinarycode mathbincode mathrelationcode mathrelcode mathopencode contained
+syn keyword contextConstants mathclosecode mathpunctuationcode mathpunctcode mathovercode mathundercode contained
+syn keyword contextConstants mathinnercode mathradicalcode mathfractioncode mathmiddlecode mathaccentcode contained
+syn keyword contextConstants mathfencedcode mathghostcode mathvariablecode mathactivecode mathvcentercode contained
+syn keyword contextConstants mathconstructcode mathwrappedcode mathbegincode mathendcode mathexplicitcode contained
+syn keyword contextConstants mathdivisioncode mathfactorialcode mathdimensioncode mathexperimentalcode mathtextpunctuationcode contained
+syn keyword contextConstants mathimaginarycode mathdifferentialcode mathexponentialcode mathellipsiscode mathfunctioncode contained
+syn keyword contextConstants mathdigitcode mathalphacode mathboxcode mathchoicecode mathnothingcode contained
+syn keyword contextConstants mathlimopcode mathnolopcode mathunsetcode mathunspacedcode mathallcode contained
+syn keyword contextConstants mathfakecode mathunarycode constantnumber constantnumberargument constantdimen contained
+syn keyword contextConstants constantdimenargument constantemptyargument luastringsep !!bs !!es contained
+syn keyword contextConstants lefttorightmark righttoleftmark lrm rlm bidilre contained
+syn keyword contextConstants bidirle bidipop bidilro bidirlo breakablethinspace contained
+syn keyword contextConstants nobreakspace nonbreakablespace narrownobreakspace zerowidthnobreakspace ideographicspace contained
+syn keyword contextConstants ideographichalffillspace twoperemspace threeperemspace fourperemspace fiveperemspace contained
+syn keyword contextConstants sixperemspace figurespace punctuationspace hairspace enquad contained
+syn keyword contextConstants emquad zerowidthspace zerowidthnonjoiner zerowidthjoiner zwnj contained
+syn keyword contextConstants zwj optionalspace asciispacechar softhyphen Ux contained
+syn keyword contextConstants eUx Umathaccents parfillleftskip parfillrightskip startlmtxmode contained
+syn keyword contextConstants stoplmtxmode startmkivmode stopmkivmode wildcardsymbol normalhyphenationcode contained
+syn keyword contextConstants automatichyphenationcode explicithyphenationcode syllablehyphenationcode uppercasehyphenationcode collapsehyphenationcode contained
+syn keyword contextConstants compoundhyphenationcode strictstarthyphenationcode strictendhyphenationcode automaticpenaltyhyphenationcode explicitpenaltyhyphenationcode contained
+syn keyword contextConstants permitgluehyphenationcode permitallhyphenationcode permitmathreplacehyphenationcode forcecheckhyphenationcode lazyligatureshyphenationcode contained
+syn keyword contextConstants forcehandlerhyphenationcode feedbackcompoundhyphenationcode ignoreboundshyphenationcode partialhyphenationcode completehyphenationcode contained
+syn keyword contextConstants normalizelinenormalizecode parindentskipnormalizecode swaphangindentnormalizecode swapparsshapenormalizecode breakafterdirnormalizecode contained
+syn keyword contextConstants removemarginkernsnormalizecode clipwidthnormalizecode flattendiscretionariesnormalizecode discardzerotabskipsnormalizecode flattenhleadersnormalizecode contained
+syn keyword contextConstants normalizeparnormalizeparcode flattenvleadersnormalizeparcode nopreslackclassoptioncode nopostslackclassoptioncode lefttopkernclassoptioncode contained
+syn keyword contextConstants righttopkernclassoptioncode leftbottomkernclassoptioncode rightbottomkernclassoptioncode lookaheadforendclassoptioncode noitaliccorrectionclassoptioncode contained
+syn keyword contextConstants defaultmathclassoptions checkligatureclassoptioncode checkitaliccorrectionclassoptioncode checkkernpairclassoptioncode flattenclassoptioncode contained
+syn keyword contextConstants omitpenaltyclassoptioncode unpackclassoptioncode raiseprimeclassoptioncode carryoverlefttopkernclassoptioncode carryoverleftbottomkernclassoptioncode contained
+syn keyword contextConstants carryoverrighttopkernclassoptioncode carryoverrightbottomkernclassoptioncode preferdelimiterdimensionsclassoptioncode noligaturingglyphoptioncode nokerningglyphoptioncode contained
+syn keyword contextConstants noleftligatureglyphoptioncode noleftkernglyphoptioncode norightligatureglyphoptioncode norightkernglyphoptioncode noexpansionglyphoptioncode contained
+syn keyword contextConstants noprotrusionglyphoptioncode noitaliccorrectionglyphoptioncode nokerningcode noligaturingcode frozenflagcode contained
+syn keyword contextConstants tolerantflagcode protectedflagcode primitiveflagcode permanentflagcode noalignedflagcode contained
+syn keyword contextConstants immutableflagcode mutableflagcode globalflagcode overloadedflagcode immediateflagcode contained
+syn keyword contextConstants conditionalflagcode valueflagcode instanceflagcode ordmathflattencode binmathflattencode contained
+syn keyword contextConstants relmathflattencode punctmathflattencode innermathflattencode normalworddiscoptioncode preworddiscoptioncode contained
+syn keyword contextConstants postworddiscoptioncode continueifinputfile continuewhenlmtxmode continuewhenmkivmode contained
+syn keyword contextHelpers startsetups stopsetups startxmlsetups stopxmlsetups startluasetups contained
+syn keyword contextHelpers stopluasetups starttexsetups stoptexsetups startrawsetups stoprawsetups contained
+syn keyword contextHelpers startlocalsetups stoplocalsetups starttexdefinition stoptexdefinition starttexcode contained
+syn keyword contextHelpers stoptexcode startcontextcode stopcontextcode startcontextdefinitioncode stopcontextdefinitioncode contained
+syn keyword contextHelpers texdefinition doifelsesetups doifsetupselse doifsetups doifnotsetups contained
+syn keyword contextHelpers setup setups texsetup xmlsetup luasetup contained
+syn keyword contextHelpers directsetup fastsetup copysetups resetsetups doifelsecommandhandler contained
+syn keyword contextHelpers doifcommandhandlerelse doifnotcommandhandler doifcommandhandler newmode setmode contained
+syn keyword contextHelpers resetmode newsystemmode setsystemmode resetsystemmode pushsystemmode contained
+syn keyword contextHelpers popsystemmode globalsetmode globalresetmode globalsetsystemmode globalresetsystemmode contained
+syn keyword contextHelpers booleanmodevalue newcount newdimen newskip newmuskip contained
+syn keyword contextHelpers newbox newtoks newread newwrite newmarks contained
+syn keyword contextHelpers newinsert newattribute newif newlanguage newfamily contained
+syn keyword contextHelpers newfam newhelp then begcsname autorule contained
+syn keyword contextHelpers strippedcsname checkedstrippedcsname nofarguments firstargumentfalse firstargumenttrue contained
+syn keyword contextHelpers secondargumentfalse secondargumenttrue thirdargumentfalse thirdargumenttrue fourthargumentfalse contained
+syn keyword contextHelpers fourthargumenttrue fifthargumentfalse fifthargumenttrue sixthargumentfalse sixthargumenttrue contained
+syn keyword contextHelpers seventhargumentfalse seventhargumenttrue vkern hkern vpenalty contained
+syn keyword contextHelpers hpenalty doglobal dodoglobal redoglobal resetglobal contained
+syn keyword contextHelpers donothing untraceddonothing dontcomplain moreboxtracing lessboxtracing contained
+syn keyword contextHelpers noboxtracing forgetall donetrue donefalse foundtrue contained
+syn keyword contextHelpers foundfalse inlineordisplaymath indisplaymath forcedisplaymath startforceddisplaymath contained
+syn keyword contextHelpers stopforceddisplaymath startpickupmath stoppickupmath reqno forceinlinemath contained
+syn keyword contextHelpers mathortext thebox htdp unvoidbox hfilll contained
+syn keyword contextHelpers vfilll mathbox mathlimop mathnolop mathnothing contained
+syn keyword contextHelpers mathalpha currentcatcodetable defaultcatcodetable catcodetablename newcatcodetable contained
+syn keyword contextHelpers startcatcodetable stopcatcodetable startextendcatcodetable stopextendcatcodetable pushcatcodetable contained
+syn keyword contextHelpers popcatcodetable restorecatcodes setcatcodetable letcatcodecommand defcatcodecommand contained
+syn keyword contextHelpers uedcatcodecommand hglue vglue hfillneg vfillneg contained
+syn keyword contextHelpers hfilllneg vfilllneg ruledhss ruledhfil ruledhfill contained
+syn keyword contextHelpers ruledhfilll ruledhfilneg ruledhfillneg normalhfillneg normalhfilllneg contained
+syn keyword contextHelpers ruledvss ruledvfil ruledvfill ruledvfilll ruledvfilneg contained
+syn keyword contextHelpers ruledvfillneg normalvfillneg normalvfilllneg ruledhbox ruledvbox contained
+syn keyword contextHelpers ruledvtop ruledvcenter ruledmbox ruledhpack ruledvpack contained
+syn keyword contextHelpers ruledtpack ruledhskip ruledvskip ruledkern ruledmskip contained
+syn keyword contextHelpers ruledmkern ruledhglue ruledvglue normalhglue normalvglue contained
+syn keyword contextHelpers ruledpenalty filledhboxb filledhboxr filledhboxg filledhboxc contained
+syn keyword contextHelpers filledhboxm filledhboxy filledhboxk scratchstring scratchstringone contained
+syn keyword contextHelpers scratchstringtwo tempstring scratchcounter globalscratchcounter privatescratchcounter contained
+syn keyword contextHelpers scratchdimen globalscratchdimen privatescratchdimen scratchskip globalscratchskip contained
+syn keyword contextHelpers privatescratchskip scratchmuskip globalscratchmuskip privatescratchmuskip scratchtoks contained
+syn keyword contextHelpers globalscratchtoks privatescratchtoks scratchbox globalscratchbox privatescratchbox contained
+syn keyword contextHelpers scratchmacro scratchmacroone scratchmacrotwo scratchconditiontrue scratchconditionfalse contained
+syn keyword contextHelpers ifscratchcondition scratchconditiononetrue scratchconditiononefalse ifscratchconditionone scratchconditiontwotrue contained
+syn keyword contextHelpers scratchconditiontwofalse ifscratchconditiontwo globalscratchcounterone globalscratchcountertwo globalscratchcounterthree contained
+syn keyword contextHelpers groupedcommand groupedcommandcs triggergroupedcommand triggergroupedcommandcs simplegroupedcommand contained
+syn keyword contextHelpers simplegroupedcommandcs pickupgroupedcommand pickupgroupedcommandcs mathgroupedcommandcs usedbaselineskip contained
+syn keyword contextHelpers usedlineskip usedlineskiplimit availablehsize localhsize setlocalhsize contained
+syn keyword contextHelpers distributedhsize hsizefraction next nexttoken nextbox contained
+syn keyword contextHelpers dowithnextbox dowithnextboxcs dowithnextboxcontent dowithnextboxcontentcs flushnextbox contained
+syn keyword contextHelpers boxisempty boxtostring contentostring prerolltostring givenwidth contained
+syn keyword contextHelpers givenheight givendepth scangivendimensions scratchwidth scratchheight contained
+syn keyword contextHelpers scratchdepth scratchoffset scratchdistance scratchtotal scratchitalic contained
+syn keyword contextHelpers scratchhsize scratchvsize scratchxoffset scratchyoffset scratchhoffset contained
+syn keyword contextHelpers scratchvoffset scratchxposition scratchyposition scratchtopoffset scratchbottomoffset contained
+syn keyword contextHelpers scratchleftoffset scratchrightoffset scratchcounterone scratchcountertwo scratchcounterthree contained
+syn keyword contextHelpers scratchcounterfour scratchcounterfive scratchcountersix scratchdimenone scratchdimentwo contained
+syn keyword contextHelpers scratchdimenthree scratchdimenfour scratchdimenfive scratchdimensix scratchskipone contained
+syn keyword contextHelpers scratchskiptwo scratchskipthree scratchskipfour scratchskipfive scratchskipsix contained
+syn keyword contextHelpers scratchmuskipone scratchmuskiptwo scratchmuskipthree scratchmuskipfour scratchmuskipfive contained
+syn keyword contextHelpers scratchmuskipsix scratchtoksone scratchtokstwo scratchtoksthree scratchtoksfour contained
+syn keyword contextHelpers scratchtoksfive scratchtokssix scratchboxone scratchboxtwo scratchboxthree contained
+syn keyword contextHelpers scratchboxfour scratchboxfive scratchboxsix scratchnx scratchny contained
+syn keyword contextHelpers scratchmx scratchmy scratchunicode scratchmin scratchmax contained
+syn keyword contextHelpers scratchleftskip scratchrightskip scratchtopskip scratchbottomskip doif contained
+syn keyword contextHelpers doifnot doifelse firstinset doifinset doifnotinset contained
+syn keyword contextHelpers doifelseinset doifinsetelse doifelsenextchar doifnextcharelse doifelsenextcharcs contained
+syn keyword contextHelpers doifnextcharcselse doifelsenextoptional doifnextoptionalelse doifelsenextoptionalcs doifnextoptionalcselse contained
+syn keyword contextHelpers doifelsefastoptionalcheck doiffastoptionalcheckelse doifelsefastoptionalcheckcs doiffastoptionalcheckcselse doifelsenextbgroup contained
+syn keyword contextHelpers doifnextbgroupelse doifelsenextbgroupcs doifnextbgroupcselse doifelsenextparenthesis doifnextparenthesiselse contained
+syn keyword contextHelpers doifelseundefined doifundefinedelse doifelsedefined doifdefinedelse doifundefined contained
+syn keyword contextHelpers doifdefined doifelsevalue doifvalue doifnotvalue doifnothing contained
+syn keyword contextHelpers doifsomething doifelsenothing doifnothingelse doifelsesomething doifsomethingelse contained
+syn keyword contextHelpers doifvaluenothing doifvaluesomething doifelsevaluenothing doifvaluenothingelse doifelsedimension contained
+syn keyword contextHelpers doifdimensionelse doifelsenumber doifnumberelse doifnumber doifnotnumber contained
+syn keyword contextHelpers doifelsecommon doifcommonelse doifcommon doifnotcommon doifinstring contained
+syn keyword contextHelpers doifnotinstring doifelseinstring doifinstringelse doifelseassignment doifassignmentelse contained
+syn keyword contextHelpers docheckassignment doifelseassignmentcs doifassignmentelsecs validassignment novalidassignment contained
+syn keyword contextHelpers doiftext doifelsetext doiftextelse doifnottext quitcondition contained
+syn keyword contextHelpers truecondition falsecondition tracingall tracingnone loggingall contained
+syn keyword contextHelpers tracingcatcodes showluatokens aliasmacro removetoks appendtoks contained
+syn keyword contextHelpers prependtoks appendtotoks prependtotoks to endgraf contained
+syn keyword contextHelpers endpar reseteverypar finishpar empty null contained
+syn keyword contextHelpers space quad enspace emspace charspace contained
+syn keyword contextHelpers nbsp crlf obeyspaces obeylines obeytabs contained
+syn keyword contextHelpers obeypages obeyedspace obeyedline obeyedtab obeyedpage contained
+syn keyword contextHelpers normalspace naturalspace controlspace normalspaces ignoretabs contained
+syn keyword contextHelpers ignorelines ignorepages ignoreeofs setcontrolspaces executeifdefined contained
+syn keyword contextHelpers singleexpandafter doubleexpandafter tripleexpandafter dontleavehmode removelastspace contained
+syn keyword contextHelpers removeunwantedspaces keepunwantedspaces removepunctuation ignoreparskip forcestrutdepth contained
+syn keyword contextHelpers onlynonbreakablespace wait writestatus define defineexpandable contained
+syn keyword contextHelpers redefine setmeasure setemeasure setgmeasure setxmeasure contained
+syn keyword contextHelpers definemeasure freezemeasure measure measured directmeasure contained
+syn keyword contextHelpers setquantity setequantity setgquantity setxquantity definequantity contained
+syn keyword contextHelpers freezequantity quantity quantitied directquantity installcorenamespace contained
+syn keyword contextHelpers getvalue getuvalue setvalue setevalue setgvalue contained
+syn keyword contextHelpers setxvalue letvalue letgvalue resetvalue undefinevalue contained
+syn keyword contextHelpers ignorevalue setuvalue setuevalue setugvalue setuxvalue contained
+syn keyword contextHelpers globallet udef ugdef uedef uxdef contained
+syn keyword contextHelpers checked unique getparameters geteparameters getgparameters contained
+syn keyword contextHelpers getxparameters forgetparameters copyparameters getdummyparameters dummyparameter contained
+syn keyword contextHelpers directdummyparameter setdummyparameter letdummyparameter setexpandeddummyparameter usedummystyleandcolor contained
+syn keyword contextHelpers usedummystyleparameter usedummycolorparameter processcommalist processcommacommand quitcommalist contained
+syn keyword contextHelpers quitprevcommalist processaction processallactions processfirstactioninset processallactionsinset contained
+syn keyword contextHelpers unexpanded expanded startexpanded stopexpanded protect contained
+syn keyword contextHelpers unprotect firstofoneargument firstoftwoarguments secondoftwoarguments firstofthreearguments contained
+syn keyword contextHelpers secondofthreearguments thirdofthreearguments firstoffourarguments secondoffourarguments thirdoffourarguments contained
+syn keyword contextHelpers fourthoffourarguments firstoffivearguments secondoffivearguments thirdoffivearguments fourthoffivearguments contained
+syn keyword contextHelpers fifthoffivearguments firstofsixarguments secondofsixarguments thirdofsixarguments fourthofsixarguments contained
+syn keyword contextHelpers fifthofsixarguments sixthofsixarguments firstofoneunexpanded firstoftwounexpanded secondoftwounexpanded contained
+syn keyword contextHelpers firstofthreeunexpanded secondofthreeunexpanded thirdofthreeunexpanded gobbleoneargument gobbletwoarguments contained
+syn keyword contextHelpers gobblethreearguments gobblefourarguments gobblefivearguments gobblesixarguments gobblesevenarguments contained
+syn keyword contextHelpers gobbleeightarguments gobbleninearguments gobbletenarguments gobbleoneoptional gobbletwooptionals contained
+syn keyword contextHelpers gobblethreeoptionals gobblefouroptionals gobblefiveoptionals dorecurse doloop contained
+syn keyword contextHelpers exitloop dostepwiserecurse recurselevel recursedepth dofastloopcs contained
+syn keyword contextHelpers fastloopindex fastloopfinal dowith doloopovermatch doloopovermatched contained
+syn keyword contextHelpers doloopoverlist newconstant setnewconstant setconstant setconstantvalue contained
+syn keyword contextHelpers newconditional settrue setfalse settruevalue setfalsevalue contained
+syn keyword contextHelpers setconditional newmacro setnewmacro newfraction newsignal contained
+syn keyword contextHelpers newboundary dosingleempty dodoubleempty dotripleempty doquadrupleempty contained
+syn keyword contextHelpers doquintupleempty dosixtupleempty doseventupleempty dosingleargument dodoubleargument contained
+syn keyword contextHelpers dotripleargument doquadrupleargument doquintupleargument dosixtupleargument doseventupleargument contained
+syn keyword contextHelpers dosinglegroupempty dodoublegroupempty dotriplegroupempty doquadruplegroupempty doquintuplegroupempty contained
+syn keyword contextHelpers permitspacesbetweengroups dontpermitspacesbetweengroups nopdfcompression maximumpdfcompression normalpdfcompression contained
+syn keyword contextHelpers onlypdfobjectcompression nopdfobjectcompression modulonumber dividenumber getfirstcharacter contained
+syn keyword contextHelpers doifelsefirstchar doiffirstcharelse mathclassvalue startnointerference stopnointerference contained
+syn keyword contextHelpers twodigits threedigits leftorright offinterlineskip oninterlineskip contained
+syn keyword contextHelpers nointerlineskip strut halfstrut quarterstrut depthstrut contained
+syn keyword contextHelpers halflinestrut noheightstrut setstrut strutbox strutht contained
+syn keyword contextHelpers strutdp strutwd struthtdp strutgap begstrut contained
+syn keyword contextHelpers endstrut lineheight leftboundary rightboundary signalcharacter contained
+syn keyword contextHelpers aligncontentleft aligncontentmiddle aligncontentright shiftbox vpackbox contained
+syn keyword contextHelpers hpackbox vpackedbox hpackedbox ordordspacing ordopspacing contained
+syn keyword contextHelpers ordbinspacing ordrelspacing ordopenspacing ordclosespacing ordpunctspacing contained
+syn keyword contextHelpers ordinnerspacing ordfracspacing ordradspacing ordmiddlespacing ordaccentspacing contained
+syn keyword contextHelpers opordspacing opopspacing opbinspacing oprelspacing opopenspacing contained
+syn keyword contextHelpers opclosespacing oppunctspacing opinnerspacing opfracspacing opradspacing contained
+syn keyword contextHelpers opmiddlespacing opaccentspacing binordspacing binopspacing binbinspacing contained
+syn keyword contextHelpers binrelspacing binopenspacing binclosespacing binpunctspacing bininnerspacing contained
+syn keyword contextHelpers binfracspacing binradspacing binmiddlespacing binaccentspacing relordspacing contained
+syn keyword contextHelpers relopspacing relbinspacing relrelspacing relopenspacing relclosespacing contained
+syn keyword contextHelpers relpunctspacing relinnerspacing relfracspacing relradspacing relmiddlespacing contained
+syn keyword contextHelpers relaccentspacing openordspacing openopspacing openbinspacing openrelspacing contained
+syn keyword contextHelpers openopenspacing openclosespacing openpunctspacing openinnerspacing openfracspacing contained
+syn keyword contextHelpers openradspacing openmiddlespacing openaccentspacing closeordspacing closeopspacing contained
+syn keyword contextHelpers closebinspacing closerelspacing closeopenspacing closeclosespacing closepunctspacing contained
+syn keyword contextHelpers closeinnerspacing closefracspacing closeradspacing closemiddlespacing closeaccentspacing contained
+syn keyword contextHelpers punctordspacing punctopspacing punctbinspacing punctrelspacing punctopenspacing contained
+syn keyword contextHelpers punctclosespacing punctpunctspacing punctinnerspacing punctfracspacing punctradspacing contained
+syn keyword contextHelpers punctmiddlespacing punctaccentspacing innerordspacing inneropspacing innerbinspacing contained
+syn keyword contextHelpers innerrelspacing inneropenspacing innerclosespacing innerpunctspacing innerinnerspacing contained
+syn keyword contextHelpers innerfracspacing innerradspacing innermiddlespacing inneraccentspacing fracordspacing contained
+syn keyword contextHelpers fracopspacing fracbinspacing fracrelspacing fracopenspacing fracclosespacing contained
+syn keyword contextHelpers fracpunctspacing fracinnerspacing fracfracspacing fracradspacing fracmiddlespacing contained
+syn keyword contextHelpers fracaccentspacing radordspacing radopspacing radbinspacing radrelspacing contained
+syn keyword contextHelpers radopenspacing radclosespacing radpunctspacing radinnerspacing radfracspacing contained
+syn keyword contextHelpers radradspacing radmiddlespacing radaccentspacing middleordspacing middleopspacing contained
+syn keyword contextHelpers middlebinspacing middlerelspacing middleopenspacing middleclosespacing middlepunctspacing contained
+syn keyword contextHelpers middleinnerspacing middlefracspacing middleradspacing middlemiddlespacing middleaccentspacing contained
+syn keyword contextHelpers accentordspacing accentopspacing accentbinspacing accentrelspacing accentopenspacing contained
+syn keyword contextHelpers accentclosespacing accentpunctspacing accentinnerspacing accentfracspacing accentradspacing contained
+syn keyword contextHelpers accentmiddlespacing accentaccentspacing normalreqno startimath stopimath contained
+syn keyword contextHelpers normalstartimath normalstopimath startdmath stopdmath normalstartdmath contained
+syn keyword contextHelpers normalstopdmath normalsuperscript normalsubscript normalnosuperscript normalnosubscript contained
+syn keyword contextHelpers normalprimescript superscript subscript nosuperscript nosubscript contained
+syn keyword contextHelpers primescript superprescript subprescript nosuperprescript nosubsprecript contained
+syn keyword contextHelpers uncramped cramped mathstyletrigger triggermathstyle triggeredmathstyle contained
+syn keyword contextHelpers mathstylefont mathsmallstylefont mathstyleface mathsmallstyleface mathstylecommand contained
+syn keyword contextHelpers mathpalette mathstylehbox mathstylevbox mathstylevcenter mathstylevcenteredhbox contained
+syn keyword contextHelpers mathstylevcenteredvbox mathtext setmathsmalltextbox setmathtextbox pushmathstyle contained
+syn keyword contextHelpers popmathstyle triggerdisplaystyle triggertextstyle triggerscriptstyle triggerscriptscriptstyle contained
+syn keyword contextHelpers triggeruncrampedstyle triggercrampedstyle triggersmallstyle triggeruncrampedsmallstyle triggercrampedsmallstyle contained
+syn keyword contextHelpers triggerbigstyle triggeruncrampedbigstyle triggercrampedbigstyle luaexpr expelsedoif contained
+syn keyword contextHelpers expdoif expdoifnot expdoifelsecommon expdoifcommonelse expdoifelseinset contained
+syn keyword contextHelpers expdoifinsetelse ctxdirectlua ctxlatelua ctxsprint ctxwrite contained
+syn keyword contextHelpers ctxcommand ctxdirectcommand ctxlatecommand ctxreport ctxlua contained
+syn keyword contextHelpers luacode lateluacode directluacode registerctxluafile ctxloadluafile contained
+syn keyword contextHelpers luaversion luamajorversion luaminorversion ctxluacode luaconditional contained
+syn keyword contextHelpers luaexpanded ctxluamatch startluaparameterset stopluaparameterset luaparameterset contained
+syn keyword contextHelpers definenamedlua obeylualines obeyluatokens startluacode stopluacode contained
+syn keyword contextHelpers startlua stoplua startctxfunction stopctxfunction ctxfunction contained
+syn keyword contextHelpers startctxfunctiondefinition stopctxfunctiondefinition installctxfunction installprotectedctxfunction installprotectedctxscanner contained
+syn keyword contextHelpers installctxscanner resetctxscanner cldprocessfile cldloadfile cldloadviafile contained
+syn keyword contextHelpers cldcontext cldcommand carryoverpar freezeparagraphproperties defrostparagraphproperties contained
+syn keyword contextHelpers setparagraphfreezing forgetparagraphfreezing updateparagraphproperties updateparagraphpenalties updateparagraphdemerits contained
+syn keyword contextHelpers updateparagraphshapes updateparagraphlines lastlinewidth assumelongusagecs Umathbotaccent contained
+syn keyword contextHelpers Umathtopaccent righttolefthbox lefttorighthbox righttoleftvbox lefttorightvbox contained
+syn keyword contextHelpers righttoleftvtop lefttorightvtop rtlhbox ltrhbox rtlvbox contained
+syn keyword contextHelpers ltrvbox rtlvtop ltrvtop autodirhbox autodirvbox contained
+syn keyword contextHelpers autodirvtop leftorrighthbox leftorrightvbox leftorrightvtop lefttoright contained
+syn keyword contextHelpers righttoleft checkedlefttoright checkedrighttoleft synchronizelayoutdirection synchronizedisplaydirection contained
+syn keyword contextHelpers synchronizeinlinedirection dirlre dirrle dirlro dirrlo contained
+syn keyword contextHelpers rtltext ltrtext lesshyphens morehyphens nohyphens contained
+syn keyword contextHelpers dohyphens dohyphencollapsing nohyphencollapsing compounddiscretionary Ucheckedstartdisplaymath contained
+syn keyword contextHelpers Ucheckedstopdisplaymath break nobreak allowbreak goodbreak contained
+syn keyword contextHelpers nospace nospacing dospacing naturalhbox naturalvbox contained
+syn keyword contextHelpers naturalvtop naturalhpack naturalvpack naturaltpack reversehbox contained
+syn keyword contextHelpers reversevbox reversevtop reversehpack reversevpack reversetpack contained
+syn keyword contextHelpers hcontainer vcontainer tcontainer frule compoundhyphenpenalty contained
+syn keyword contextHelpers start stop unsupportedcs openout closeout contained
+syn keyword contextHelpers write openin closein read readline contained
+syn keyword contextHelpers readfromterminal boxlines boxline setboxline copyboxline contained
+syn keyword contextHelpers boxlinewd boxlineht boxlinedp boxlinenw boxlinenh contained
+syn keyword contextHelpers boxlinend boxlinels boxliners boxlinelh boxlinerh contained
+syn keyword contextHelpers boxlinelp boxlinerp boxlinein boxrangewd boxrangeht contained
+syn keyword contextHelpers boxrangedp bitwiseset bitwiseand bitwiseor bitwisexor contained
+syn keyword contextHelpers bitwisenot bitwisenil ifbitwiseand bitwise bitwiseshift contained
+syn keyword contextHelpers bitwiseflip textdir linedir pardir boxdir contained
+syn keyword contextHelpers prelistbox postlistbox prelistcopy postlistcopy setprelistbox contained
+syn keyword contextHelpers setpostlistbox noligaturing nokerning noexpansion noprotrusion contained
+syn keyword contextHelpers noleftkerning noleftligaturing norightkerning norightligaturing noitaliccorrection contained
+syn keyword contextHelpers futureletnexttoken defbackslashbreak letbackslashbreak pushoverloadmode popoverloadmode contained
+syn keyword contextHelpers pushrunstate poprunstate suggestedalias showboxhere discoptioncodestring contained
+syn keyword contextHelpers flagcodestring frozenparcodestring glyphoptioncodestring groupcodestring hyphenationcodestring contained
+syn keyword contextHelpers mathcontrolcodestring mathflattencodestring normalizecodestring parcontextcodestring newlocalcount contained
+syn keyword contextHelpers newlocaldimen newlocalskip newlocalmuskip newlocaltoks newlocalbox contained
+syn keyword contextHelpers newlocalwrite newlocalread setnewlocalcount setnewlocaldimen setnewlocalskip contained
+syn keyword contextHelpers setnewlocalmuskip setnewlocaltoks setnewlocalbox ifexpression contained
diff --git a/runtime/syntax/shared/context-data-interfaces.vim b/runtime/syntax/shared/context-data-interfaces.vim
new file mode 100644
index 0000000..54af24e
--- /dev/null
+++ b/runtime/syntax/shared/context-data-interfaces.vim
@@ -0,0 +1,1183 @@
+vim9script
+
+# Vim syntax file
+# Language: ConTeXt
+# Automatically generated by mtx-interface (2022-08-12 10:49)
+
+syn keyword contextCommon AEacute AEligature AEmacron AMSTEX Aacute contained
+syn keyword contextCommon Abreve Abreveacute Abrevedotbelow Abrevegrave Abrevehook contained
+syn keyword contextCommon Abrevetilde Acaron Acircumflex Acircumflexacute Acircumflexdotbelow contained
+syn keyword contextCommon Acircumflexgrave Acircumflexhook Acircumflextilde Adiaeresis Adiaeresismacron contained
+syn keyword contextCommon Adotaccent Adotaccentmacron Adotbelow Adoublegrave AfterPar contained
+syn keyword contextCommon Agrave Ahook Ainvertedbreve Alpha Alphabeticnumerals contained
+syn keyword contextCommon AmSTeX Amacron And Angstrom Aogonek contained
+syn keyword contextCommon Aring Aringacute Arrowvert Astroke Atilde contained
+syn keyword contextCommon BeforePar Beta Bhook Big Bigg contained
+syn keyword contextCommon Biggl Biggm Biggr Bigl Bigm contained
+syn keyword contextCommon Bigr Box Bumpeq CONTEXT Cacute contained
+syn keyword contextCommon Cap Caps Ccaron Ccedilla Ccircumflex contained
+syn keyword contextCommon Cdotaccent Character Characters Chi Chook contained
+syn keyword contextCommon ConTeXt Context ConvertConstantAfter ConvertToConstant Cstroke contained
+syn keyword contextCommon Cup DAYLONG DAYSHORT DZcaronligature DZligature contained
+syn keyword contextCommon Dafrican Dcaron Dd Ddownarrow Delta contained
+syn keyword contextCommon Dhook Doteq Downarrow Dstroke Dzcaronligature contained
+syn keyword contextCommon Dzligature ETEX Eacute Ebreve Ecaron contained
+syn keyword contextCommon Ecedilla Ecircumflex Ecircumflexacute Ecircumflexdotbelow Ecircumflexgrave contained
+syn keyword contextCommon Ecircumflexhook Ecircumflextilde Ediaeresis Edotaccent Edotbelow contained
+syn keyword contextCommon Edoublegrave Egrave Ehook Einvertedbreve Emacron contained
+syn keyword contextCommon Eogonek Epsilon Eta Eth Etilde contained
+syn keyword contextCommon Eulerconst EveryLine EveryPar Fhook Finv contained
+syn keyword contextCommon Gacute Game Gamma Gbreve Gcaron contained
+syn keyword contextCommon Gcircumflex Gcommaaccent Gdotaccent GetPar Ghook contained
+syn keyword contextCommon GotoPar Greeknumerals Gstroke Hat Hcaron contained
+syn keyword contextCommon Hcircumflex Hstroke IJligature INRSTEX Iacute contained
+syn keyword contextCommon Ibreve Icaron Icircumflex Idiaeresis Idotaccent contained
+syn keyword contextCommon Idotbelow Idoublegrave Igrave Ihook Iinvertedbreve contained
+syn keyword contextCommon Im Imacron Iogonek Iota Istroke contained
+syn keyword contextCommon Itilde JScode JSpreamble Jcircumflex Join contained
+syn keyword contextCommon Kappa Kcaron Kcommaaccent Khook LAMSTEX contained
+syn keyword contextCommon LATEX LJligature LUA LUAJITTEX LUAMETATEX contained
+syn keyword contextCommon LUATEX LaTeX Lacute LamSTeX Lambda contained
+syn keyword contextCommon Lbar Lcaron Lcommaaccent Ldotmiddle Ldsh contained
+syn keyword contextCommon Leftarrow Leftrightarrow Ljligature Lleftarrow Longleftarrow contained
+syn keyword contextCommon Longleftrightarrow Longmapsfrom Longmapsto Longrightarrow Lsh contained
+syn keyword contextCommon Lstroke Lua LuaMetaTeX LuaTeX LuajitTeX contained
+syn keyword contextCommon METAFONT METAFUN METAPOST MKII MKIV contained
+syn keyword contextCommon MKIX MKLX MKVI MKXI MKXL contained
+syn keyword contextCommon MONTH MONTHLONG MONTHSHORT MP MPII contained
+syn keyword contextCommon MPIV MPLX MPVI MPXL MPanchor contained
+syn keyword contextCommon MPbetex MPc MPclip MPcode MPcolor contained
+syn keyword contextCommon MPcoloronly MPcolumn MPd MPdefinitions MPdrawing contained
+syn keyword contextCommon MPenvironment MPextensions MPfontsizehskip MPgetmultipars MPgetmultishape contained
+syn keyword contextCommon MPgetposboxes MPh MPinclusions MPinitializations MPleftskip contained
+syn keyword contextCommon MPll MPlr MPls MPmenubuttons MPn contained
+syn keyword contextCommon MPoptions MPoverlayanchor MPp MPpage MPpardata contained
+syn keyword contextCommon MPplus MPpos MPpositiongraphic MPpositionmethod MPposset contained
+syn keyword contextCommon MPr MPrawvar MPregion MPrest MPrightskip contained
+syn keyword contextCommon MPrs MPrun MPstring MPtext MPtransparency contained
+syn keyword contextCommon MPul MPur MPv MPvar MPvariable contained
+syn keyword contextCommon MPvv MPw MPwhd MPx MPxy contained
+syn keyword contextCommon MPxywhd MPy Mapsfrom Mapsto MetaFont contained
+syn keyword contextCommon MetaFun MetaPost Mu NJligature Nacute contained
+syn keyword contextCommon Ncaron Ncommaaccent Nearrow Neng Ngrave contained
+syn keyword contextCommon Njligature NormalizeFontHeight NormalizeFontWidth NormalizeTextHeight NormalizeTextWidth contained
+syn keyword contextCommon Ntilde Nu Numbers Nwarrow OEligature contained
+syn keyword contextCommon Oacute Obreve Ocaron Ocircumflex Ocircumflexacute contained
+syn keyword contextCommon Ocircumflexdotbelow Ocircumflexgrave Ocircumflexhook Ocircumflextilde Odiaeresis contained
+syn keyword contextCommon Odiaeresismacron Odotaccent Odotaccentmacron Odotbelow Odoublegrave contained
+syn keyword contextCommon Ograve Ohook Ohorn Ohornacute Ohorndotbelow contained
+syn keyword contextCommon Ohorngrave Ohornhook Ohorntilde Ohungarumlaut Oinvertedbreve contained
+syn keyword contextCommon Omacron Omega Omicron Oogonek Oogonekmacron contained
+syn keyword contextCommon Ostroke Ostrokeacute Otilde Otildemacron P contained
+syn keyword contextCommon PARSEDXML PDFETEX PDFTEX PDFcolor PICTEX contained
+syn keyword contextCommon PPCHTEX PPCHTeX PRAGMA Phi Phook contained
+syn keyword contextCommon Pi PiCTeX Plankconst PointsToBigPoints PointsToReal contained
+syn keyword contextCommon PointsToWholeBigPoints PropertyLine Psi PtToCm Racute contained
+syn keyword contextCommon Rcaron Rcommaaccent Rdoublegrave Rdsh Re contained
+syn keyword contextCommon ReadFile Relbar Rho Rightarrow Rinvertedbreve contained
+syn keyword contextCommon Romannumerals Rrightarrow Rsh S Sacute contained
+syn keyword contextCommon ScaledPointsToBigPoints ScaledPointsToWholeBigPoints Scaron Scedilla Schwa contained
+syn keyword contextCommon Scircumflex Scommaaccent Searrow Sigma Smallcapped contained
+syn keyword contextCommon Subset Supset Swarrow TABLE TABLEbody contained
+syn keyword contextCommon TABLEfoot TABLEhead TABLEnested TABLEnext TC contained
+syn keyword contextCommon TD TDs TEX TEXpage TH contained
+syn keyword contextCommon TN TR TRs TX TY contained
+syn keyword contextCommon TaBlE Tau Tcaron Tcedilla Tcommaaccent contained
+syn keyword contextCommon TeX TheNormalizedFontSize Theta Thook Thorn contained
+syn keyword contextCommon TransparencyHack Tstroke Uacute Ubreve Ucaron contained
+syn keyword contextCommon Ucircumflex Udiaeresis Udiaeresisacute Udiaeresiscaron Udiaeresisgrave contained
+syn keyword contextCommon Udiaeresismacron Udotbelow Udoublegrave Ugrave Uhook contained
+syn keyword contextCommon Uhorn Uhornacute Uhorndotbelow Uhorngrave Uhornhook contained
+syn keyword contextCommon Uhorntilde Uhungarumlaut Uinvertedbreve Umacron Uogonek contained
+syn keyword contextCommon Uparrow Updownarrow Upsilon Uring Utilde contained
+syn keyword contextCommon Uuparrow VDash Vdash VerboseNumber Vert contained
+syn keyword contextCommon Vhook Vvdash WEEKDAY WORD WORDS contained
+syn keyword contextCommon Wcircumflex WidthSpanningText Word Words XETEX contained
+syn keyword contextCommon XML XeTeX Xi Yacute Ycircumflex contained
+syn keyword contextCommon Ydiaeresis Ydotbelow Ygrave Yhook Ymacron contained
+syn keyword contextCommon Ytilde Zacute Zcaron Zdotaccent Zeta contained
+syn keyword contextCommon Zhook Zstroke aacute abbreviation abjadnaivenumerals contained
+syn keyword contextCommon abjadnodotnumerals abjadnumerals about abreve abreveacute contained
+syn keyword contextCommon abrevedotbelow abrevegrave abrevehook abrevetilde acaron contained
+syn keyword contextCommon acircumflex acircumflexacute acircumflexdotbelow acircumflexgrave acircumflexhook contained
+syn keyword contextCommon acircumflextilde activatespacehandler actualday actualmonth actualyear contained
+syn keyword contextCommon actuarial acute acwopencirclearrow adaptcollector adaptfontfeature contained
+syn keyword contextCommon adaptlayout adaptpapersize addfeature addtoJSpreamble addtocommalist contained
+syn keyword contextCommon addvalue adiaeresis adiaeresismacron adotaccent adotaccentmacron contained
+syn keyword contextCommon adotbelow adoublegrave aeacute aeligature aemacron contained
+syn keyword contextCommon afghanicurrency aftersplitstring aftertestandsplitstring agrave ahook contained
+syn keyword contextCommon ainvertedbreve aleph align alignbottom aligned contained
+syn keyword contextCommon alignedbox alignedline alignhere alignment alignmentcharacter contained
+syn keyword contextCommon allinputpaths allmodes alpha alphabeticnumerals alwayscitation contained
+syn keyword contextCommon alwayscite amacron amalg ampersand anchor contained
+syn keyword contextCommon angle aogonek appendetoks appendgvalue appendices contained
+syn keyword contextCommon appendtocommalist appendtoks appendtoksonce appendvalue apply contained
+syn keyword contextCommon applyalternativestyle applyfunction applyprocessor applytocharacters applytofirstcharacter contained
+syn keyword contextCommon applytosplitstringchar applytosplitstringcharspaced applytosplitstringline applytosplitstringlinespaced applytosplitstringword contained
+syn keyword contextCommon applytosplitstringwordspaced applytowords approx approxEq approxeq contained
+syn keyword contextCommon approxnEq arabicakbar arabicalayhe arabicallah arabicallallahou contained
+syn keyword contextCommon arabicasterisk arabicbasmalah arabiccomma arabiccuberoot arabicdateseparator contained
+syn keyword contextCommon arabicdecimals arabicdisputedendofayah arabicendofayah arabicexnumerals arabicfootnotemarker contained
+syn keyword contextCommon arabicfourthroot arabichighain arabichighalayheassallam arabichigheqala arabichighesala contained
+syn keyword contextCommon arabichighfootnotemarker arabichighjeem arabichighlamalef arabichighmadda arabichighmeemlong contained
+syn keyword contextCommon arabichighmeemshort arabichighnisf arabichighnoon arabichighnoonkasra arabichighqaf contained
+syn keyword contextCommon arabichighqif arabichighradiallahouanhu arabichighrahmatullahalayhe arabichighrubc arabichighsad contained
+syn keyword contextCommon arabichighsajda arabichighsakta arabichighsallallahou arabichighseen arabichighsmallsafha contained
+syn keyword contextCommon arabichightah arabichightakhallus arabichighthalatha arabichighwaqf arabichighyeh contained
+syn keyword contextCommon arabichighzain arabicjallajalalouhou arabiclettermark arabiclowmeemlong arabiclownoonkasra contained
+syn keyword contextCommon arabiclowseen arabicmisra arabicmuhammad arabicnumber arabicnumberabove contained
+syn keyword contextCommon arabicnumerals arabicparenleft arabicparenright arabicpercent arabicperiod contained
+syn keyword contextCommon arabicpermille arabicpertenthousand arabicpoeticverse arabicqala arabicquestion contained
+syn keyword contextCommon arabicrasoul arabicray arabicrialsign arabicsafha arabicsajdah contained
+syn keyword contextCommon arabicsalla arabicsamvat arabicsanah arabicsemicolon arabicshighthreedots contained
+syn keyword contextCommon arabicslcm arabicstartofrubc arabictripledot arabicvowelwaw arabicvowelyeh contained
+syn keyword contextCommon arabicwasallam arg aring aringacute arrangedpages contained
+syn keyword contextCommon arrowvert asciimode asciistr aside assignalfadimension contained
+syn keyword contextCommon assigndimen assigndimension assignifempty assigntranslation assignvalue contained
+syn keyword contextCommon assignwidth assumelongusagecs ast astype asymp contained
+syn keyword contextCommon at atilde atleftmargin atpage atrightmargin contained
+syn keyword contextCommon attachment autocap autodirhbox autodirvbox autodirvtop contained
+syn keyword contextCommon autoinsertnextspace autointegral automathematics autoorientation autopagestaterealpage contained
+syn keyword contextCommon autopagestaterealpageorder autorule autosetups availablehsize averagecharwidth contained
+syn keyword contextCommon backepsilon background backgroundimage backgroundimagefill backgroundline contained
+syn keyword contextCommon backmatter backprime backsim backslash bar contained
+syn keyword contextCommon barleftarrow barleftarrowrightarrowbar barovernorthwestarrow barwedge basegrid contained
+syn keyword contextCommon baselinebottom baselineleftbox baselinemiddlebox baselinerightbox bbordermatrix contained
+syn keyword contextCommon bbox because beforesplitstring beforetestandsplitstring beta contained
+syn keyword contextCommon beth between bhook big bigbodyfont contained
+syn keyword contextCommon bigcap bigcirc bigcircle bigcup bigdiamond contained
+syn keyword contextCommon bigg bigger biggl biggm biggr contained
+syn keyword contextCommon bigl bigm bigodot bigoplus bigotimes contained
+syn keyword contextCommon bigr bigskip bigsqcap bigsqcup bigsquare contained
+syn keyword contextCommon bigstar bigtimes bigtriangledown bigtriangleup bigudot contained
+syn keyword contextCommon biguplus bigvee bigwedge binom bitmapimage contained
+syn keyword contextCommon blacklozenge blackrule blackrules blacksquare blacktriangle contained
+syn keyword contextCommon blacktriangledown blacktriangleleft blacktriangleright blank blap contained
+syn keyword contextCommon bleed bleedheight bleedwidth blockligatures blockquote contained
+syn keyword contextCommon blocksynctexfile blockuservariable bodyfontenvironmentlist bodyfontsize bodymatter contained
+syn keyword contextCommon bold boldface bolditalic boldslanted bookmark contained
+syn keyword contextCommon booleanmodevalue bordermatrix bot bottombox bottomleftbox contained
+syn keyword contextCommon bottomrightbox bowtie boxcursor boxdot boxedcolumns contained
+syn keyword contextCommon boxmarker boxminus boxofsize boxplus boxreference contained
+syn keyword contextCommon boxtimes bpos breakablethinspace breakhere breve contained
+syn keyword contextCommon bstroke btxabbreviatedjournal btxaddjournal btxalwayscitation btxauthorfield contained
+syn keyword contextCommon btxdetail btxdirect btxdoif btxdoifcombiinlistelse btxdoifelse contained
+syn keyword contextCommon btxdoifelsecombiinlist btxdoifelsesameasprevious btxdoifelsesameaspreviouschecked btxdoifelseuservariable btxdoifnot contained
+syn keyword contextCommon btxdoifsameaspreviouscheckedelse btxdoifsameaspreviouselse btxdoifuservariableelse btxexpandedjournal btxfield contained
+syn keyword contextCommon btxfieldname btxfieldtype btxfirstofrange btxflush btxflushauthor contained
+syn keyword contextCommon btxflushauthorinverted btxflushauthorinvertedshort btxflushauthorname btxflushauthornormal btxflushauthornormalshort contained
+syn keyword contextCommon btxflushsuffix btxfoundname btxfoundtype btxhiddencitation btxhybridcite contained
+syn keyword contextCommon btxlabellanguage btxlabeltext btxlistcitation btxloadjournalist btxoneorrange contained
+syn keyword contextCommon btxremapauthor btxrenderingdefinitions btxsavejournalist btxsetup btxsingularorplural contained
+syn keyword contextCommon btxsingularplural btxtextcitation buffer buildmathaccent buildtextaccent contained
+syn keyword contextCommon buildtextbottomcomma buildtextbottomdot buildtextcedilla buildtextgrave buildtextmacron contained
+syn keyword contextCommon buildtextognek bullet button cacute calligraphic contained
+syn keyword contextCommon camel cap capital carriagereturn cases contained
+syn keyword contextCommon catcodetable catcodetablename cbox ccaron ccedilla contained
+syn keyword contextCommon ccircumflex ccurl cdot cdotaccent cdotp contained
+syn keyword contextCommon cdots centeraligned centerbox centerdot centeredbox contained
+syn keyword contextCommon centeredlastline centerednextbox centerline cfrac chapter contained
+syn keyword contextCommon character characteralign characters chardescription charwidthlanguage contained
+syn keyword contextCommon check checkcharacteralign checkedblank checkedchar checkedfences contained
+syn keyword contextCommon checkedfiller checkedstrippedcsname checkinjector checkmark checknextindentation contained
+syn keyword contextCommon checknextinjector checkpage checkparameters checkpreviousinjector checksoundtrack contained
+syn keyword contextCommon checktwopassdata checkvariables chem chemical chemicalbottext contained
+syn keyword contextCommon chemicalmidtext chemicalsymbol chemicaltext chemicaltoptext chi contained
+syn keyword contextCommon chineseallnumerals chinesecapnumerals chinesenumerals chook circ contained
+syn keyword contextCommon circeq circlearrowleft circlearrowright circledR circledS contained
+syn keyword contextCommon circledast circledcirc circleddash circledequals circleonrightarrow contained
+syn keyword contextCommon citation cite clap classfont cldcommand contained
+syn keyword contextCommon cldcontext cldloadfile cldprocessfile cleftarrow clip contained
+syn keyword contextCommon clippedoverlayimage clonefield clubsuit collect collectedtext contained
+syn keyword contextCommon collectexpanded collecting colon coloncolonequals colonequals contained
+syn keyword contextCommon color colorbar colorcomponents colored colorintent contained
+syn keyword contextCommon coloronly colorset colorvalue column columnbreak contained
+syn keyword contextCommon columns columnset columnsetspan columnsetspanwidth combination contained
+syn keyword contextCommon combinepages commalistelement commalistsentence commalistsize comment contained
+syn keyword contextCommon comparecolorgroup comparedimension comparedimensioneps comparepalet complement contained
+syn keyword contextCommon completebtxrendering completecontent completeindex completelist completelistofabbreviations contained
+syn keyword contextCommon completelistofchemicals completelistoffigures completelistofgraphics completelistofintermezzi completelistoflogos contained
+syn keyword contextCommon completelistofpublications completelistofsorts completelistofsynonyms completelistoftables completepagenumber contained
+syn keyword contextCommon completeregister complexes complexorsimple complexorsimpleempty component contained
+syn keyword contextCommon composedcollector composedlayer compounddiscretionary compresult cong contained
+syn keyword contextCommon constantdimen constantdimenargument constantemptyargument constantnumber constantnumberargument contained
+syn keyword contextCommon contentreference contextcode contextdefinitioncode continuednumber continueifinputfile contained
+syn keyword contextCommon convertargument convertcommand convertedcounter converteddimen convertedsubcounter contained
+syn keyword contextCommon convertmonth convertnumber convertvalue convertvboxtohbox coprod contained
+syn keyword contextCommon copyboxfromcache copybtxlabeltext copyfield copyheadtext copylabeltext contained
+syn keyword contextCommon copymathlabeltext copyoperatortext copypages copyparameters copyposition contained
+syn keyword contextCommon copyprefixtext copyright copysetups copysuffixtext copytaglabeltext contained
+syn keyword contextCommon copyunittext correctwhitespace countersubs counttoken counttokens contained
+syn keyword contextCommon cramped crampedclap crampedllap crampedrlap crightarrow contained
+syn keyword contextCommon crightoverleftarrow crlf crlfplaceholder cstroke ctop contained
+syn keyword contextCommon ctxcommand ctxdirectcommand ctxdirectlua ctxfunction ctxfunctiondefinition contained
+syn keyword contextCommon ctxlatecommand ctxlatelua ctxloadluafile ctxlua ctxluabuffer contained
+syn keyword contextCommon ctxluacode ctxreport ctxsprint cup curlyeqprec contained
+syn keyword contextCommon curlyeqsucc curlyvee curlywedge currentassignmentlistkey currentassignmentlistvalue contained
+syn keyword contextCommon currentbtxuservariable currentcolor currentcommalistitem currentcomponent currentdate contained
+syn keyword contextCommon currentenvironment currentfeaturetest currentheadnumber currentinterface currentlanguage contained
+syn keyword contextCommon currentlistentrydestinationattribute currentlistentrylimitedtext currentlistentrynumber currentlistentrypagenumber currentlistentryreferenceattribute contained
+syn keyword contextCommon currentlistentrytitle currentlistentrytitlerendered currentlistentrywrapper currentlistsymbol currentmainlanguage contained
+syn keyword contextCommon currentmessagetext currentmoduleparameter currentoutputstream currentproduct currentproject contained
+syn keyword contextCommon currentregime currentregisterpageuserdata currentresponses currenttime currentvalue contained
+syn keyword contextCommon currentxtablecolumn currentxtablerow curvearrowleft curvearrowright cwopencirclearrow contained
+syn keyword contextCommon cyrillicA cyrillicAE cyrillicAbreve cyrillicAdiaeresis cyrillicB contained
+syn keyword contextCommon cyrillicBIGYUS cyrillicBIGYUSiotified cyrillicC cyrillicCH cyrillicCHEDC contained
+syn keyword contextCommon cyrillicCHEDCabkhasian cyrillicCHEabkhasian cyrillicCHEdiaeresis cyrillicCHEkhakassian cyrillicCHEvertstroke contained
+syn keyword contextCommon cyrillicD cyrillicDASIAPNEUMATA cyrillicDJE cyrillicDZE cyrillicDZEabkhasian contained
+syn keyword contextCommon cyrillicDZHE cyrillicE cyrillicELtail cyrillicEMtail cyrillicENDC contained
+syn keyword contextCommon cyrillicENGHE cyrillicENhook cyrillicENtail cyrillicEREV cyrillicERY contained
+syn keyword contextCommon cyrillicERtick cyrillicEbreve cyrillicEdiaeresis cyrillicEgrave cyrillicEiotified contained
+syn keyword contextCommon cyrillicF cyrillicFITA cyrillicG cyrillicGHEmidhook cyrillicGHEstroke contained
+syn keyword contextCommon cyrillicGHEupturn cyrillicGJE cyrillicH cyrillicHA cyrillicHADC contained
+syn keyword contextCommon cyrillicHRDSN cyrillicI cyrillicIE cyrillicII cyrillicISHRT contained
+syn keyword contextCommon cyrillicISHRTtail cyrillicIZHITSA cyrillicIZHITSAdoublegrave cyrillicIdiaeresis cyrillicIgrave contained
+syn keyword contextCommon cyrillicImacron cyrillicJE cyrillicK cyrillicKADC cyrillicKAbashkir contained
+syn keyword contextCommon cyrillicKAhook cyrillicKAstroke cyrillicKAvertstroke cyrillicKJE cyrillicKOPPA contained
+syn keyword contextCommon cyrillicKSI cyrillicL cyrillicLITTLEYUS cyrillicLITTLEYUSiotified cyrillicLJE contained
+syn keyword contextCommon cyrillicM cyrillicN cyrillicNJE cyrillicO cyrillicOMEGA contained
+syn keyword contextCommon cyrillicOMEGAround cyrillicOMEGAtitlo cyrillicOT cyrillicObarred cyrillicObarreddiaeresis contained
+syn keyword contextCommon cyrillicOdiaeresis cyrillicP cyrillicPALATALIZATION cyrillicPALOCHKA cyrillicPEmidhook contained
+syn keyword contextCommon cyrillicPSI cyrillicPSILIPNEUMATA cyrillicR cyrillicS cyrillicSCHWA contained
+syn keyword contextCommon cyrillicSCHWAdiaeresis cyrillicSDSC cyrillicSEMISOFT cyrillicSFTSN cyrillicSH contained
+syn keyword contextCommon cyrillicSHCH cyrillicSHHA cyrillicT cyrillicTEDC cyrillicTETSE contained
+syn keyword contextCommon cyrillicTITLO cyrillicTSHE cyrillicU cyrillicUK cyrillicUSHRT contained
+syn keyword contextCommon cyrillicUdiaeresis cyrillicUdoubleacute cyrillicUmacron cyrillicV cyrillicYA contained
+syn keyword contextCommon cyrillicYAT cyrillicYERUdiaeresis cyrillicYI cyrillicYO cyrillicYU contained
+syn keyword contextCommon cyrillicYstr cyrillicYstrstroke cyrillicZ cyrillicZDSC cyrillicZEdiaeresis contained
+syn keyword contextCommon cyrillicZH cyrillicZHEbreve cyrillicZHEdescender cyrillicZHEdiaeresis cyrillica contained
+syn keyword contextCommon cyrillicabreve cyrillicadiaeresis cyrillicae cyrillicb cyrillicbigyus contained
+syn keyword contextCommon cyrillicbigyusiotified cyrillicc cyrillicch cyrilliccheabkhasian cyrillicchedc contained
+syn keyword contextCommon cyrillicchedcabkhasian cyrillicchediaeresis cyrillicchekhakassian cyrillicchevertstroke cyrillicd contained
+syn keyword contextCommon cyrillicdje cyrillicdze cyrillicdzeabkhasian cyrillicdzhe cyrillice contained
+syn keyword contextCommon cyrillicebreve cyrillicediaeresis cyrillicegrave cyrilliceiotified cyrilliceltail contained
+syn keyword contextCommon cyrillicemtail cyrillicendc cyrillicenghe cyrillicenhook cyrillicentail contained
+syn keyword contextCommon cyrillicerev cyrillicertick cyrillicery cyrillicf cyrillicfita contained
+syn keyword contextCommon cyrillicg cyrillicghemidhook cyrillicghestroke cyrillicgheupturn cyrillicgje contained
+syn keyword contextCommon cyrillich cyrillicha cyrillichadc cyrillichrdsn cyrillici contained
+syn keyword contextCommon cyrillicidiaeresis cyrillicie cyrillicigrave cyrillicii cyrillicimacron contained
+syn keyword contextCommon cyrillicishrt cyrillicishrttail cyrillicizhitsa cyrillicizhitsadoublegrave cyrillicje contained
+syn keyword contextCommon cyrillick cyrillickabashkir cyrillickadc cyrillickahook cyrillickastroke contained
+syn keyword contextCommon cyrillickavertstroke cyrillickje cyrillickoppa cyrillicksi cyrillicl contained
+syn keyword contextCommon cyrilliclittleyus cyrilliclittleyusiotified cyrilliclje cyrillicm cyrillicn contained
+syn keyword contextCommon cyrillicnje cyrillico cyrillicobarred cyrillicobarreddiaeresis cyrillicodiaeresis contained
+syn keyword contextCommon cyrillicomega cyrillicomegaround cyrillicomegatitlo cyrillicot cyrillicp contained
+syn keyword contextCommon cyrillicpemidhook cyrillicpsi cyrillicr cyrillics cyrillicschwa contained
+syn keyword contextCommon cyrillicschwadiaeresis cyrillicsdsc cyrillicsemisoft cyrillicsftsn cyrillicsh contained
+syn keyword contextCommon cyrillicshch cyrillicshha cyrillict cyrillictedc cyrillictetse contained
+syn keyword contextCommon cyrillictshe cyrillicu cyrillicudiaeresis cyrillicudoubleacute cyrillicuk contained
+syn keyword contextCommon cyrillicumacron cyrillicushrt cyrillicv cyrillicya cyrillicyat contained
+syn keyword contextCommon cyrillicyerudiaeresis cyrillicyi cyrillicyo cyrillicystr cyrillicystrstroke contained
+syn keyword contextCommon cyrillicyu cyrillicz cyrilliczdsc cyrilliczediaeresis cyrilliczh contained
+syn keyword contextCommon cyrilliczhebreve cyrilliczhedescender cyrilliczhediaeresis d dag contained
+syn keyword contextCommon dagger daleth dasharrow dashedleftarrow dashedrightarrow contained
+syn keyword contextCommon dashv datasetvariable date daylong dayoftheweek contained
+syn keyword contextCommon dayshort dayspermonth dbinom dcaron dcurl contained
+syn keyword contextCommon dd ddag ddagger dddot ddot contained
+syn keyword contextCommon ddots decrement decrementcounter decrementedcounter decrementpagenumber contained
+syn keyword contextCommon decrementsubpagenumber decrementvalue defaultinterface defaultobjectpage defaultobjectreference contained
+syn keyword contextCommon defcatcodecommand defconvertedargument defconvertedcommand defconvertedvalue define contained
+syn keyword contextCommon defineMPinstance defineTABLEsetup defineaccent defineactivecharacter definealternativestyle contained
+syn keyword contextCommon defineanchor defineattachment defineattribute definebackground definebar contained
+syn keyword contextCommon defineblock definebodyfont definebodyfontenvironment definebodyfontswitch definebreakpoint contained
+syn keyword contextCommon definebreakpoints definebtx definebtxdataset definebtxregister definebtxrendering contained
+syn keyword contextCommon definebuffer definebutton definecapitals definecharacter definecharacterkerning contained
+syn keyword contextCommon definecharacterspacing definechemical definechemicals definechemicalsymbol definecollector contained
+syn keyword contextCommon definecolor definecolorgroup definecolumnbreak definecolumnset definecolumnsetarea contained
+syn keyword contextCommon definecolumnsetspan definecombination definecombinedlist definecommand definecomment contained
+syn keyword contextCommon definecomplexorsimple definecomplexorsimpleempty defineconversion defineconversionset definecounter contained
+syn keyword contextCommon definedataset definedate definedelimitedtext definedeq definedescription contained
+syn keyword contextCommon definedfont definedocument defineeffect defineenumeration defineexpandable contained
+syn keyword contextCommon defineexpansion defineexternalfigure definefacingfloat definefallbackfamily definefield contained
+syn keyword contextCommon definefieldbody definefieldbodyset definefieldcategory definefieldstack definefiguresymbol contained
+syn keyword contextCommon definefileconstant definefilefallback definefilesynonym definefiller definefirstline contained
+syn keyword contextCommon definefittingpage definefloat definefont definefontalternative definefontfallback contained
+syn keyword contextCommon definefontfamily definefontfamilypreset definefontfeature definefontfile definefontsize contained
+syn keyword contextCommon definefontsolution definefontstyle definefontsynonym defineformula defineformulaalternative contained
+syn keyword contextCommon defineformulaframed defineframed defineframedcontent defineframedtable defineframedtext contained
+syn keyword contextCommon definefrozenfont defineglobalcolor definegraphictypesynonym definegridsnapping definehbox contained
+syn keyword contextCommon definehead defineheadalternative definehelp definehigh definehighlight contained
+syn keyword contextCommon definehspace definehyphenationfeatures defineindentedtext defineindenting defineinitial contained
+syn keyword contextCommon defineinsertion defineinteraction defineinteractionbar defineinteractionmenu defineinterfaceconstant contained
+syn keyword contextCommon defineinterfaceelement defineinterfacevariable defineinterlinespace defineintermediatecolor defineitemgroup contained
+syn keyword contextCommon defineitems definelabel definelabelclass definelayer definelayerpreset contained
+syn keyword contextCommon definelayout definelinefiller definelinenote definelinenumbering definelines contained
+syn keyword contextCommon definelist definelistalternative definelistextra definelow definelowhigh contained
+syn keyword contextCommon definelowmidhigh definemakeup definemarginblock definemargindata definemarker contained
+syn keyword contextCommon definemarking definemathaccent definemathalignment definemathcases definemathcommand contained
+syn keyword contextCommon definemathdouble definemathdoubleextensible definemathematics definemathextensible definemathfence contained
+syn keyword contextCommon definemathfraction definemathframed definemathmatrix definemathornament definemathover contained
+syn keyword contextCommon definemathoverextensible definemathovertextextensible definemathradical definemathstackers definemathstyle contained
+syn keyword contextCommon definemathtriplet definemathunder definemathunderextensible definemathundertextextensible definemathunstacked contained
+syn keyword contextCommon definemeasure definemessageconstant definemixedcolumns definemode definemulticolumns contained
+syn keyword contextCommon definemultitonecolor definenamedcolor definenamespace definenarrower definenote contained
+syn keyword contextCommon defineorientation defineornament defineoutputroutine defineoutputroutinecommand defineoverlay contained
+syn keyword contextCommon definepage definepagebreak definepagechecker definepagecolumns definepageinjection contained
+syn keyword contextCommon definepageinjectionalternative definepageshift definepagestate definepairedbox definepalet contained
+syn keyword contextCommon definepapersize defineparagraph defineparagraphs defineparallel defineparbuilder contained
+syn keyword contextCommon defineperiodkerning defineplaceholder defineplacement definepositioning defineprefixset contained
+syn keyword contextCommon defineprocesscolor defineprocessor defineprofile defineprogram definepushbutton contained
+syn keyword contextCommon definepushsymbol definereference definereferenceformat defineregister definerenderingwindow contained
+syn keyword contextCommon defineresetset defineruby definescale definescript definesection contained
+syn keyword contextCommon definesectionblock definesectionlevels defineselector defineseparatorset defineshift contained
+syn keyword contextCommon definesidebar definesort definesorting definespotcolor definestartstop contained
+syn keyword contextCommon definestyle definestyleinstance definesubfield definesubformula definesymbol contained
+syn keyword contextCommon definesynonym definesynonyms definesystemattribute definesystemconstant definesystemvariable contained
+syn keyword contextCommon definetabletemplate definetabulate definetext definetextbackground definetextflow contained
+syn keyword contextCommon definetextnote definetokenlist definetooltip definetransparency definetwopasslist contained
+syn keyword contextCommon definetype definetypeface definetypescriptprefix definetypescriptsynonym definetypesetting contained
+syn keyword contextCommon definetyping defineunit defineuserdata defineuserdataalternative defineviewerlayer contained
+syn keyword contextCommon definevspace definevspacing definevspacingamount definextable defrostparagraphproperties contained
+syn keyword contextCommon delimited delimitedtext delta depthofstring depthonlybox contained
+syn keyword contextCommon depthspanningtext depthstrut determineheadnumber determinelistcharacteristics determinenoflines contained
+syn keyword contextCommon determineregistercharacteristics devanagarinumerals dfrac dhook diameter contained
+syn keyword contextCommon diamond diamondsuit differentialD differentiald digamma contained
+syn keyword contextCommon digits dimensiontocount directboxfromcache directcolor directcolored contained
+syn keyword contextCommon directconvertedcounter directcopyboxfromcache directdummyparameter directgetboxllx directgetboxlly contained
+syn keyword contextCommon directhighlight directlocalframed directluacode directparwrapper directselect contained
+syn keyword contextCommon directsetbar directsetup directsymbol directvspacing dis contained
+syn keyword contextCommon disabledirectives disableexperiments disablemode disableoutputstream disableparpositions contained
+syn keyword contextCommon disableregime disabletrackers displaymath displaymathematics displaymessage contained
+syn keyword contextCommon disposeluatable distributedhsize div dividedsize divideontimes contained
+syn keyword contextCommon divides dmath doadaptleftskip doadaptrightskip doaddfeature contained
+syn keyword contextCommon doassign doassignempty doboundtext docheckassignment docheckedpair contained
+syn keyword contextCommon document documentvariable dodoubleargument dodoubleargumentwithset dodoubleempty contained
+syn keyword contextCommon dodoubleemptywithset dodoublegroupempty doeassign doexpandedrecurse dofastloopcs contained
+syn keyword contextCommon dogetattribute dogetattributeid dogetcommacommandelement dogobbledoubleempty dogobblesingleempty contained
+syn keyword contextCommon dohyphens doif doifMPgraphicelse doifallcommon doifallcommonelse contained
+syn keyword contextCommon doifalldefinedelse doifallmodes doifallmodeselse doifassignmentelse doifassignmentelsecs contained
+syn keyword contextCommon doifblackelse doifbothsides doifbothsidesoverruled doifboxelse doifbufferelse contained
+syn keyword contextCommon doifcheckedpagestate doifcolor doifcolorelse doifcommandhandler doifcommandhandlerelse contained
+syn keyword contextCommon doifcommon doifcommonelse doifcontent doifconversiondefinedelse doifconversionnumberelse contained
+syn keyword contextCommon doifcounter doifcounterelse doifcurrentfonthasfeatureelse doifdefined doifdefinedcounter contained
+syn keyword contextCommon doifdefinedcounterelse doifdefinedelse doifdimensionelse doifdimenstringelse doifdocumentargument contained
+syn keyword contextCommon doifdocumentargumentelse doifdocumentfilename doifdocumentfilenameelse doifdocumentvariable doifdocumentvariableelse contained
+syn keyword contextCommon doifdrawingblackelse doifelse doifelseMPgraphic doifelseallcommon doifelsealldefined contained
+syn keyword contextCommon doifelseallmodes doifelseassignment doifelseassignmentcs doifelseblack doifelsebox contained
+syn keyword contextCommon doifelseboxincache doifelsebuffer doifelsecolor doifelsecommandhandler doifelsecommon contained
+syn keyword contextCommon doifelseconversiondefined doifelseconversionnumber doifelsecounter doifelsecurrentfonthasfeature doifelsecurrentsortingused contained
+syn keyword contextCommon doifelsecurrentsynonymshown doifelsecurrentsynonymused doifelsedefined doifelsedefinedcounter doifelsedimension contained
+syn keyword contextCommon doifelsedimenstring doifelsedocumentargument doifelsedocumentfilename doifelsedocumentvariable doifelsedrawingblack contained
+syn keyword contextCommon doifelseempty doifelseemptyvalue doifelseemptyvariable doifelseenv doifelsefastoptionalcheck contained
+syn keyword contextCommon doifelsefastoptionalcheckcs doifelsefieldbody doifelsefieldcategory doifelsefigure doifelsefile contained
+syn keyword contextCommon doifelsefiledefined doifelsefileexists doifelsefirstchar doifelseflagged doifelsefontchar contained
+syn keyword contextCommon doifelsefontfeature doifelsefontpresent doifelsefontsynonym doifelseframed doifelsehasspace contained
+syn keyword contextCommon doifelsehelp doifelseincsname doifelseindented doifelseinelement doifelseinputfile contained
+syn keyword contextCommon doifelseinsertion doifelseinset doifelseinstring doifelseinsymbolset doifelseintoks contained
+syn keyword contextCommon doifelseintwopassdata doifelseitalic doifelselanguage doifelselayerdata doifelselayoutdefined contained
+syn keyword contextCommon doifelselayoutsomeline doifelselayouttextline doifelseleapyear doifelselist doifelselocation contained
+syn keyword contextCommon doifelselocfile doifelsemainfloatbody doifelsemarkedcontent doifelsemarkedpage doifelsemarking contained
+syn keyword contextCommon doifelsemeaning doifelsemessage doifelsemode doifelsenextbgroup doifelsenextbgroupcs contained
+syn keyword contextCommon doifelsenextchar doifelsenextoptional doifelsenextoptionalcs doifelsenextparenthesis doifelsenonzeropositive contained
+syn keyword contextCommon doifelsenoteonsamepage doifelsenothing doifelsenumber doifelseobjectfound doifelseobjectreferencefound contained
+syn keyword contextCommon doifelseoddpage doifelseoddpagefloat doifelseoldercontext doifelseolderversion doifelseorientation contained
+syn keyword contextCommon doifelseoverlapping doifelseoverlay doifelseparallel doifelseparentfile doifelseparwrapper contained
+syn keyword contextCommon doifelsepath doifelsepathexists doifelsepatterns doifelseposition doifelsepositionaction contained
+syn keyword contextCommon doifelsepositiononpage doifelsepositionsonsamepage doifelsepositionsonthispage doifelsepositionsused doifelsereferencefound contained
+syn keyword contextCommon doifelserightpage doifelserightpagefloat doifelserighttoleftinbox doifelsesamelinereference doifelsesamestring contained
+syn keyword contextCommon doifelsesetups doifelsesomebackground doifelsesomespace doifelsesomething doifelsesometoks contained
+syn keyword contextCommon doifelsestringinstring doifelsestructurelisthasnumber doifelsestructurelisthaspage doifelsesymboldefined doifelsesymbolset contained
+syn keyword contextCommon doifelsetext doifelsetextflow doifelsetextflowcollector doifelsetopofpage doifelsetypingfile contained
+syn keyword contextCommon doifelseundefined doifelseurldefined doifelsevalue doifelsevaluenothing doifelsevariable contained
+syn keyword contextCommon doifempty doifemptyelse doifemptytoks doifemptyvalue doifemptyvalueelse contained
+syn keyword contextCommon doifemptyvariable doifemptyvariableelse doifenv doifenvelse doiffastoptionalcheckcselse contained
+syn keyword contextCommon doiffastoptionalcheckelse doiffieldbodyelse doiffieldcategoryelse doiffigureelse doiffile contained
+syn keyword contextCommon doiffiledefinedelse doiffileelse doiffileexistselse doiffirstcharelse doifflaggedelse contained
+syn keyword contextCommon doiffontcharelse doiffontfeatureelse doiffontpresentelse doiffontsynonymelse doifhasspaceelse contained
+syn keyword contextCommon doifhelpelse doifincsnameelse doifinelementelse doifinputfileelse doifinsertionelse contained
+syn keyword contextCommon doifinset doifinsetelse doifinstring doifinstringelse doifinsymbolset contained
+syn keyword contextCommon doifinsymbolsetelse doifintokselse doifintwopassdataelse doifitalicelse doiflanguageelse contained
+syn keyword contextCommon doiflayerdataelse doiflayoutdefinedelse doiflayoutsomelineelse doiflayouttextlineelse doifleapyearelse contained
+syn keyword contextCommon doiflistelse doiflocationelse doiflocfileelse doifmainfloatbodyelse doifmarkingelse contained
+syn keyword contextCommon doifmeaningelse doifmessageelse doifmode doifmodeelse doifnextbgroupcselse contained
+syn keyword contextCommon doifnextbgroupelse doifnextcharelse doifnextoptionalcselse doifnextoptionalelse doifnextparenthesiselse contained
+syn keyword contextCommon doifnonzeropositiveelse doifnot doifnotallcommon doifnotallmodes doifnotcommandhandler contained
+syn keyword contextCommon doifnotcommon doifnotcounter doifnotdocumentargument doifnotdocumentfilename doifnotdocumentvariable contained
+syn keyword contextCommon doifnotempty doifnotemptyvalue doifnotemptyvariable doifnotenv doifnoteonsamepageelse contained
+syn keyword contextCommon doifnotescollected doifnotfile doifnotflagged doifnothing doifnothingelse contained
+syn keyword contextCommon doifnotinset doifnotinsidesplitfloat doifnotinstring doifnotmode doifnotnumber contained
+syn keyword contextCommon doifnotsamestring doifnotsetups doifnotvalue doifnotvariable doifnumber contained
+syn keyword contextCommon doifnumberelse doifobjectfoundelse doifobjectreferencefoundelse doifoddpageelse doifoddpagefloatelse contained
+syn keyword contextCommon doifoldercontextelse doifolderversionelse doifoutervmode doifoverlappingelse doifoverlayelse contained
+syn keyword contextCommon doifparallelelse doifparentfileelse doifpathelse doifpathexistselse doifpatternselse contained
+syn keyword contextCommon doifposition doifpositionaction doifpositionactionelse doifpositionelse doifpositiononpageelse contained
+syn keyword contextCommon doifpositionsonsamepageelse doifpositionsonthispageelse doifpositionsusedelse doifreferencefoundelse doifrightpageelse contained
+syn keyword contextCommon doifrightpagefloatelse doifrighttoleftinboxelse doifsamelinereferenceelse doifsamestring doifsamestringelse contained
+syn keyword contextCommon doifsetups doifsetupselse doifsomebackground doifsomebackgroundelse doifsomespaceelse contained
+syn keyword contextCommon doifsomething doifsomethingelse doifsometoks doifsometokselse doifstringinstringelse contained
+syn keyword contextCommon doifstructurelisthasnumberelse doifstructurelisthaspageelse doifsymboldefinedelse doifsymbolsetelse doiftext contained
+syn keyword contextCommon doiftextelse doiftextflowcollectorelse doiftextflowelse doiftopofpageelse doiftypingfileelse contained
+syn keyword contextCommon doifundefined doifundefinedcounter doifundefinedelse doifunknownfontfeature doifurldefinedelse contained
+syn keyword contextCommon doifvalue doifvalueelse doifvaluenothing doifvaluenothingelse doifvaluesomething contained
+syn keyword contextCommon doifvariable doifvariableelse doindentation dollar doloop contained
+syn keyword contextCommon doloopoverlist donothing dontconvertfont dontleavehmode dontpermitspacesbetweengroups contained
+syn keyword contextCommon dopositionaction doprocesslocalsetups doquadrupleargument doquadrupleempty doquadruplegroupempty contained
+syn keyword contextCommon doquintupleargument doquintupleempty doquintuplegroupempty dorechecknextindentation dorecurse contained
+syn keyword contextCommon dorepeatwithcommand doreplacefeature doresetandafffeature doresetattribute dorotatebox contained
+syn keyword contextCommon dosetattribute dosetleftskipadaption dosetrightskipadaption dosetupcheckedinterlinespace doseventupleargument contained
+syn keyword contextCommon doseventupleempty dosingleargument dosingleempty dosinglegroupempty dosixtupleargument contained
+syn keyword contextCommon dosixtupleempty dosomebreak dostepwiserecurse dosubtractfeature dot contained
+syn keyword contextCommon doteq doteqdot dotfill dotfskip dotlessI contained
+syn keyword contextCommon dotlessJ dotlessi dotlessj dotlessjstroke dotminus contained
+syn keyword contextCommon dotoks dotplus dotripleargument dotripleargumentwithset dotripleempty contained
+syn keyword contextCommon dotripleemptywithset dotriplegroupempty dots dottedcircle dottedrightarrow contained
+syn keyword contextCommon doublebar doublebond doublebrace doublebracket doublecap contained
+syn keyword contextCommon doublecup doubleparent doubleprime doubleverticalbar dowith contained
+syn keyword contextCommon dowithnextbox dowithnextboxcontent dowithnextboxcontentcs dowithnextboxcs dowithpargument contained
+syn keyword contextCommon dowithrange dowithwargument downarrow downdasharrow downdownarrows contained
+syn keyword contextCommon downharpoonleft downharpoonright downuparrows downwhitearrow downzigzagarrow contained
+syn keyword contextCommon dpofstring dstroke dtail dummydigit dummyparameter contained
+syn keyword contextCommon dzcaronligature dzligature eTeX eacute ebreve contained
+syn keyword contextCommon ecaron ecedilla ecircumflex ecircumflexacute ecircumflexdotbelow contained
+syn keyword contextCommon ecircumflexgrave ecircumflexhook ecircumflextilde edefconvertedargument ediaeresis contained
+syn keyword contextCommon edotaccent edotbelow edoublegrave ee efcmaxheight contained
+syn keyword contextCommon efcmaxwidth efcminheight efcminwidth efcparameter effect contained
+syn keyword contextCommon egrave ehook einvertedbreve elapsedseconds elapsedsteptime contained
+syn keyword contextCommon elapsedtime eleftarrowfill eleftharpoondownfill eleftharpoonupfill eleftrightarrowfill contained
+syn keyword contextCommon element ell em emacron embeddedxtable contained
+syn keyword contextCommon emdash emphasisboldface emphasistypeface emptylines emptyset contained
+syn keyword contextCommon emquad emspace enableasciimode enabledirectives enableexperiments contained
+syn keyword contextCommon enablemode enableoutputstream enableparpositions enableregime enabletrackers contained
+syn keyword contextCommon endash endnote endofline enquad enskip contained
+syn keyword contextCommon enspace env environment envvar eogonek contained
+syn keyword contextCommon eoverbarfill eoverbracefill eoverbracketfill eoverparentfill epos contained
+syn keyword contextCommon epsilon eq eqcirc eqeq eqeqeq contained
+syn keyword contextCommon eqgtr eqless eqsim eqslantgtr eqslantless contained
+syn keyword contextCommon equaldigits equalscolon equiv erightarrowfill erightharpoondownfill contained
+syn keyword contextCommon erightharpoonupfill eta eth ethiopic etilde contained
+syn keyword contextCommon etwoheadrightarrowfill eunderbarfill eunderbracefill eunderbracketfill eunderparentfill contained
+syn keyword contextCommon exceptions exclamdown executeifdefined exists exitloop contained
+syn keyword contextCommon exitloopnow expandcheckedcsname expanded expandedcollect expandeddoif contained
+syn keyword contextCommon expandeddoifelse expandeddoifnot expandfontsynonym expdoif expdoifcommonelse contained
+syn keyword contextCommon expdoifelse expdoifelsecommon expdoifelseinset expdoifinsetelse expdoifnot contained
+syn keyword contextCommon exponentiale extendedcatcodetable externalfigure externalfigurecollection externalfigurecollectionmaxheight contained
+syn keyword contextCommon externalfigurecollectionmaxwidth externalfigurecollectionminheight externalfigurecollectionminwidth externalfigurecollectionparameter facingfloat contained
+syn keyword contextCommon fact fakebox fallingdotseq fastdecrement fastincrement contained
+syn keyword contextCommon fastlocalframed fastloopfinal fastloopindex fastscale fastsetup contained
+syn keyword contextCommon fastsetupwithargument fastsetupwithargumentswapped fastswitchtobodyfont fastsxsy feature contained
+syn keyword contextCommon fence fenced fetchallmarkings fetchallmarks fetchmark contained
+syn keyword contextCommon fetchmarking fetchonemark fetchonemarking fetchruntinecommand fetchtwomarkings contained
+syn keyword contextCommon fetchtwomarks ffiligature ffligature fflligature fhook contained
+syn keyword contextCommon field fieldbody fieldstack fifthoffivearguments fifthofsixarguments contained
+syn keyword contextCommon figure figurefilename figurefilepath figurefiletype figurefullname contained
+syn keyword contextCommon figureheight figurenaturalheight figurenaturalwidth figurespace figuresymbol contained
+syn keyword contextCommon figuretext figurewidth filename filigature filledhboxb contained
+syn keyword contextCommon filledhboxc filledhboxg filledhboxk filledhboxm filledhboxr contained
+syn keyword contextCommon filledhboxy filler fillinline fillinrules fillintext contained
+syn keyword contextCommon fillupto filterfromnext filterfromvalue filterpages filterreference contained
+syn keyword contextCommon findtwopassdata finishregisterentry firstcharacter firstcounter firstcountervalue contained
+syn keyword contextCommon firstinlist firstoffivearguments firstoffourarguments firstofoneargument firstofoneunexpanded contained
+syn keyword contextCommon firstofsixarguments firstofthreearguments firstofthreeunexpanded firstoftwoarguments firstoftwounexpanded contained
+syn keyword contextCommon firstrealpage firstrealpagenumber firstsubcountervalue firstsubpage firstsubpagenumber contained
+syn keyword contextCommon firstuserpage firstuserpagenumber fitfield fitfieldframed fittingpage contained
+syn keyword contextCommon fittopbaselinegrid fiveeighths fivesixths fixed fixedspace contained
+syn keyword contextCommon fixedspaces flag flat flligature floatcombination contained
+syn keyword contextCommon floatuserdataparameter flushbox flushboxregister flushcollector flushedrightlastline contained
+syn keyword contextCommon flushlayer flushlocalfloats flushnextbox flushnotes flushoutputstream contained
+syn keyword contextCommon flushshapebox flushtextflow flushtokens flushtoks font contained
+syn keyword contextCommon fontalternative fontbody fontchar fontcharbyindex fontclass contained
+syn keyword contextCommon fontclassname fontface fontfeaturelist fontsize fontsolution contained
+syn keyword contextCommon fontstyle footnote footnotetext forall forcecharacterstripping contained
+syn keyword contextCommon forcelocalfloats forgeteverypar forgetparagraphfreezing forgetparameters forgetparskip contained
+syn keyword contextCommon forgetparwrapper forgetragged formula formulanumber formulas contained
+syn keyword contextCommon foundbox fourfifths fourperemspace fourthoffivearguments fourthoffourarguments contained
+syn keyword contextCommon fourthofsixarguments frac framed framedcell framedcontent contained
+syn keyword contextCommon frameddimension framedparameter framedrow framedtable framedtext contained
+syn keyword contextCommon freezedimenmacro freezemeasure freezeparagraphproperties frenchspacing from contained
+syn keyword contextCommon fromlinenote frontmatter frown frozenhbox frule contained
+syn keyword contextCommon gacute gamma gbreve gcaron gcircumflex contained
+syn keyword contextCommon gcommaaccent gdefconvertedargument gdefconvertedcommand gdotaccent ge contained
+syn keyword contextCommon geq geqq geqslant getMPdrawing getMPlayer contained
+syn keyword contextCommon getboxfromcache getboxllx getboxlly getbuffer getbufferdata contained
+syn keyword contextCommon getcommacommandsize getcommalistsize getdatavalue getdayoftheweek getdayspermonth contained
+syn keyword contextCommon getdefinedbuffer getdocumentargument getdocumentargumentdefault getdocumentfilename getdummyparameters contained
+syn keyword contextCommon getemptyparameters geteparameters getexpandedparameters getfiguredimensions getfirstcharacter contained
+syn keyword contextCommon getfirsttwopassdata getfromcommacommand getfromcommalist getfromluatable getfromtwopassdata contained
+syn keyword contextCommon getglyphdirect getglyphstyled getgparameters getinlineuserdata getlasttwopassdata contained
+syn keyword contextCommon getlocalfloat getlocalfloats getmarking getmessage getnamedglyphdirect contained
+syn keyword contextCommon getnamedglyphstyled getnamedtwopassdatalist getnaturaldimensions getnoflines getobject contained
+syn keyword contextCommon getobjectdimensions getpaletsize getparameters getparwrapper getprivatechar contained
+syn keyword contextCommon getprivateslot getrandomcount getrandomdimen getrandomfloat getrandomnumber contained
+syn keyword contextCommon getrandomseed getraweparameters getrawgparameters getrawnoflines getrawparameters contained
+syn keyword contextCommon getrawxparameters getreference getreferenceentry getroundednoflines gets contained
+syn keyword contextCommon getsubstring gettokenlist gettwopassdata gettwopassdatalist getuserdata contained
+syn keyword contextCommon getuvalue getvalue getvariable getvariabledefault getxparameters contained
+syn keyword contextCommon gg ggg gggtr gimel globaldisablemode contained
+syn keyword contextCommon globalenablemode globalletempty globalpopbox globalpopmacro globalpreventmode contained
+syn keyword contextCommon globalprocesscommalist globalpushbox globalpushmacro globalswapcounts globalswapdimens contained
+syn keyword contextCommon globalswapmacros globalundefine glyphfontfile gnapprox gneqq contained
+syn keyword contextCommon gnsim gobbledoubleempty gobbleeightarguments gobblefivearguments gobblefiveoptionals contained
+syn keyword contextCommon gobblefourarguments gobblefouroptionals gobbleninearguments gobbleoneargument gobbleoneoptional contained
+syn keyword contextCommon gobblesevenarguments gobblesingleempty gobblesixarguments gobblespacetokens gobbletenarguments contained
+syn keyword contextCommon gobblethreearguments gobblethreeoptionals gobbletwoarguments gobbletwooptionals gobbleuntil contained
+syn keyword contextCommon gobbleuntilrelax godown goto gotobox gotopage contained
+syn keyword contextCommon grabbufferdata grabbufferdatadirect grabuntil graphictext grave contained
+syn keyword contextCommon graycolor grayvalue greedysplitstring greekAlpha greekAlphadasia contained
+syn keyword contextCommon greekAlphadasiaperispomeni greekAlphadasiatonos greekAlphadasiavaria greekAlphaiotasub greekAlphaiotasubdasia contained
+syn keyword contextCommon greekAlphaiotasubdasiaperispomeni greekAlphaiotasubdasiatonos greekAlphaiotasubdasiavaria greekAlphaiotasubpsili greekAlphaiotasubpsiliperispomeni contained
+syn keyword contextCommon greekAlphaiotasubpsilitonos greekAlphaiotasubpsilivaria greekAlphamacron greekAlphapsili greekAlphapsiliperispomeni contained
+syn keyword contextCommon greekAlphapsilitonos greekAlphapsilivaria greekAlphatonos greekAlphavaria greekAlphavrachy contained
+syn keyword contextCommon greekBeta greekChi greekCoronis greekDelta greekEpsilon contained
+syn keyword contextCommon greekEpsilondasia greekEpsilondasiatonos greekEpsilondasiavaria greekEpsilonpsili greekEpsilonpsilitonos contained
+syn keyword contextCommon greekEpsilonpsilivaria greekEpsilontonos greekEpsilonvaria greekEta greekEtadasia contained
+syn keyword contextCommon greekEtadasiaperispomeni greekEtadasiatonos greekEtadasiavaria greekEtaiotasub greekEtaiotasubdasia contained
+syn keyword contextCommon greekEtaiotasubdasiaperispomeni greekEtaiotasubdasiatonos greekEtaiotasubdasiavaria greekEtaiotasubpsili greekEtaiotasubpsiliperispomeni contained
+syn keyword contextCommon greekEtaiotasubpsilitonos greekEtaiotasubpsilivaria greekEtapsili greekEtapsiliperispomeni greekEtapsilitonos contained
+syn keyword contextCommon greekEtapsilivaria greekEtatonos greekEtavaria greekGamma greekIota contained
+syn keyword contextCommon greekIotadasia greekIotadasiaperispomeni greekIotadasiatonos greekIotadasiavaria greekIotadialytika contained
+syn keyword contextCommon greekIotamacron greekIotapsili greekIotapsiliperispomeni greekIotapsilitonos greekIotapsilivaria contained
+syn keyword contextCommon greekIotatonos greekIotavaria greekIotavrachy greekKappa greekLambda contained
+syn keyword contextCommon greekMu greekNu greekOmega greekOmegadasia greekOmegadasiaperispomeni contained
+syn keyword contextCommon greekOmegadasiatonos greekOmegadasiavaria greekOmegaiotasub greekOmegaiotasubdasia greekOmegaiotasubdasiaperispomeni contained
+syn keyword contextCommon greekOmegaiotasubdasiatonos greekOmegaiotasubdasiavaria greekOmegaiotasubpsili greekOmegaiotasubpsiliperispomeni greekOmegaiotasubpsilitonos contained
+syn keyword contextCommon greekOmegaiotasubpsilivaria greekOmegapsili greekOmegapsiliperispomeni greekOmegapsilitonos greekOmegapsilivaria contained
+syn keyword contextCommon greekOmegatonos greekOmegavaria greekOmicron greekOmicrondasia greekOmicrondasiatonos contained
+syn keyword contextCommon greekOmicrondasiavaria greekOmicronpsili greekOmicronpsilitonos greekOmicronpsilivaria greekOmicrontonos contained
+syn keyword contextCommon greekOmicronvaria greekPhi greekPi greekPsi greekRho contained
+syn keyword contextCommon greekRhodasia greekSigma greekSigmalunate greekTau greekTheta contained
+syn keyword contextCommon greekUpsilon greekUpsilondasia greekUpsilondasiaperispomeni greekUpsilondasiatonos greekUpsilondasiavaria contained
+syn keyword contextCommon greekUpsilondialytika greekUpsilonmacron greekUpsilontonos greekUpsilonvaria greekUpsilonvrachy contained
+syn keyword contextCommon greekXi greekZeta greekalpha greekalphadasia greekalphadasiaperispomeni contained
+syn keyword contextCommon greekalphadasiatonos greekalphadasiavaria greekalphaiotasub greekalphaiotasubdasia greekalphaiotasubdasiaperispomeni contained
+syn keyword contextCommon greekalphaiotasubdasiatonos greekalphaiotasubdasiavaria greekalphaiotasubperispomeni greekalphaiotasubpsili greekalphaiotasubpsiliperispomeni contained
+syn keyword contextCommon greekalphaiotasubpsilitonos greekalphaiotasubpsilivaria greekalphaiotasubtonos greekalphaiotasubvaria greekalphamacron contained
+syn keyword contextCommon greekalphaoxia greekalphaperispomeni greekalphapsili greekalphapsiliperispomeni greekalphapsilitonos contained
+syn keyword contextCommon greekalphapsilivaria greekalphatonos greekalphavaria greekalphavrachy greekbeta contained
+syn keyword contextCommon greekbetaalt greekchi greekdasia greekdasiaperispomeni greekdasiavaria contained
+syn keyword contextCommon greekdelta greekdialytikaperispomeni greekdialytikatonos greekdialytikavaria greekdigamma contained
+syn keyword contextCommon greekepsilon greekepsilonalt greekepsilondasia greekepsilondasiatonos greekepsilondasiavaria contained
+syn keyword contextCommon greekepsilonoxia greekepsilonpsili greekepsilonpsilitonos greekepsilonpsilivaria greekepsilontonos contained
+syn keyword contextCommon greekepsilonvaria greeketa greeketadasia greeketadasiaperispomeni greeketadasiatonos contained
+syn keyword contextCommon greeketadasiavaria greeketaiotasub greeketaiotasubdasia greeketaiotasubdasiaperispomeni greeketaiotasubdasiatonos contained
+syn keyword contextCommon greeketaiotasubdasiavaria greeketaiotasubperispomeni greeketaiotasubpsili greeketaiotasubpsiliperispomeni greeketaiotasubpsilitonos contained
+syn keyword contextCommon greeketaiotasubpsilivaria greeketaiotasubtonos greeketaiotasubvaria greeketaoxia greeketaperispomeni contained
+syn keyword contextCommon greeketapsili greeketapsiliperispomeni greeketapsilitonos greeketapsilivaria greeketatonos contained
+syn keyword contextCommon greeketavaria greekfinalsigma greekgamma greekiota greekiotadasia contained
+syn keyword contextCommon greekiotadasiaperispomeni greekiotadasiatonos greekiotadasiavaria greekiotadialytika greekiotadialytikaperispomeni contained
+syn keyword contextCommon greekiotadialytikatonos greekiotadialytikavaria greekiotamacron greekiotaoxia greekiotaperispomeni contained
+syn keyword contextCommon greekiotapsili greekiotapsiliperispomeni greekiotapsilitonos greekiotapsilivaria greekiotatonos contained
+syn keyword contextCommon greekiotavaria greekiotavrachy greekkappa greekkoppa greeklambda contained
+syn keyword contextCommon greekmu greeknu greeknumerals greeknumkoppa greekomega contained
+syn keyword contextCommon greekomegadasia greekomegadasiaperispomeni greekomegadasiatonos greekomegadasiavaria greekomegaiotasub contained
+syn keyword contextCommon greekomegaiotasubdasia greekomegaiotasubdasiaperispomeni greekomegaiotasubdasiatonos greekomegaiotasubdasiavaria greekomegaiotasubperispomeni contained
+syn keyword contextCommon greekomegaiotasubpsili greekomegaiotasubpsiliperispomeni greekomegaiotasubpsilitonos greekomegaiotasubpsilivaria greekomegaiotasubtonos contained
+syn keyword contextCommon greekomegaiotasubvaria greekomegaoxia greekomegaperispomeni greekomegapsili greekomegapsiliperispomeni contained
+syn keyword contextCommon greekomegapsilitonos greekomegapsilivaria greekomegatonos greekomegavaria greekomicron contained
+syn keyword contextCommon greekomicrondasia greekomicrondasiatonos greekomicrondasiavaria greekomicronoxia greekomicronpsili contained
+syn keyword contextCommon greekomicronpsilitonos greekomicronpsilivaria greekomicrontonos greekomicronvaria greekoxia contained
+syn keyword contextCommon greekperispomeni greekphi greekphialt greekpi greekpialt contained
+syn keyword contextCommon greekprosgegrammeni greekpsi greekpsili greekpsiliperispomeni greekpsilivaria contained
+syn keyword contextCommon greekrho greekrhoalt greekrhodasia greekrhopsili greeksampi contained
+syn keyword contextCommon greeksigma greeksigmalunate greekstigma greektau greektheta contained
+syn keyword contextCommon greekthetaalt greektonos greekupsilon greekupsilondasia greekupsilondasiaperispomeni contained
+syn keyword contextCommon greekupsilondasiatonos greekupsilondasiavaria greekupsilondiaeresis greekupsilondialytikaperispomeni greekupsilondialytikatonos contained
+syn keyword contextCommon greekupsilondialytikavaria greekupsilonmacron greekupsilonoxia greekupsilonperispomeni greekupsilonpsili contained
+syn keyword contextCommon greekupsilonpsiliperispomeni greekupsilonpsilitonos greekupsilonpsilivaria greekupsilontonos greekupsilonvaria contained
+syn keyword contextCommon greekupsilonvrachy greekvaria greekxi greekzeta grid contained
+syn keyword contextCommon gridsnapping groupedcommand gsetboxllx gsetboxlly gstroke contained
+syn keyword contextCommon gt gtrapprox gtrdot gtreqless gtreqqless contained
+syn keyword contextCommon gtrless gtrsim guilsingleleft guilsingleright gujaratinumerals contained
+syn keyword contextCommon gurmurkhinumerals hairline hairspace halflinestrut halfstrut contained
+syn keyword contextCommon halfwaybox handletokens handwritten hanging hangul contained
+syn keyword contextCommon hanzi hash hat hbar hbox contained
+syn keyword contextCommon hboxestohbox hboxofvbox hboxreference hboxregister hcaron contained
+syn keyword contextCommon hcircumflex hdofstring head headhbox headlanguage contained
+syn keyword contextCommon headnumber headnumbercontent headnumberdistance headnumberwidth headreferenceattributes contained
+syn keyword contextCommon headsetupspacing headtext headtextcontent headtextdistance headtexts contained
+syn keyword contextCommon headtextwidth headvbox headwidth heartsuit hebrewAlef contained
+syn keyword contextCommon hebrewAyin hebrewBet hebrewDalet hebrewGimel hebrewHe contained
+syn keyword contextCommon hebrewHet hebrewKaf hebrewKaffinal hebrewLamed hebrewMem contained
+syn keyword contextCommon hebrewMemfinal hebrewNun hebrewNunfinal hebrewPe hebrewPefinal contained
+syn keyword contextCommon hebrewQof hebrewResh hebrewSamekh hebrewShin hebrewTav contained
+syn keyword contextCommon hebrewTet hebrewTsadi hebrewTsadifinal hebrewVav hebrewYod contained
+syn keyword contextCommon hebrewZayin hebrewnumerals heightanddepthofstring heightofstring heightspanningtext contained
+syn keyword contextCommon helptext hexnumber hexstringtonumber hglue hiddenbar contained
+syn keyword contextCommon hiddencitation hiddencite hideblocks hiding high contained
+syn keyword contextCommon highlight highordinalstr hilo himilo hl contained
+syn keyword contextCommon hookleftarrow hookrightarrow horizontalgrowingbar horizontalpositionbar hpackbox contained
+syn keyword contextCommon hpackedbox hphantom hpos hsizefraction hslash contained
+syn keyword contextCommon hsmash hsmashbox hsmashed hspace hstroke contained
+syn keyword contextCommon htdpofstring htofstring hyphen hyphenatedcoloredword hyphenatedfile contained
+syn keyword contextCommon hyphenatedfilename hyphenatedhbox hyphenatedpar hyphenatedurl hyphenatedword contained
+syn keyword contextCommon hyphenation iacute ibox ibreve icaron contained
+syn keyword contextCommon icircumflex ideographichalffillspace ideographicspace idiaeresis idotaccent contained
+syn keyword contextCommon idotbelow idoublegrave idxfromluatable ifassignment iff contained
+syn keyword contextCommon ifinobject ifinoutputstream ifparameters iftrialtypesetting ignoreimplicitspaces contained
+syn keyword contextCommon ignoretagsinexport ignorevalue igrave ihook ii contained
+syn keyword contextCommon iiiint iiiintop iiint iiintop iint contained
+syn keyword contextCommon iintop iinvertedbreve ijligature imacron imaginaryi contained
+syn keyword contextCommon imaginaryj imath immediatesavetwopassdata impliedby implies contained
+syn keyword contextCommon imply in includemenu includesvgbuffer includesvgfile contained
+syn keyword contextCommon includeversioninfo increment incrementcounter incrementedcounter incrementpagenumber contained
+syn keyword contextCommon incrementsubpagenumber incrementvalue indentation indentedtext index contained
+syn keyword contextCommon infofont infofontbold inframed infty infull contained
+syn keyword contextCommon inheritparameter inhibitblank ininner ininneredge ininnermargin contained
+syn keyword contextCommon initializeboxstack inleft inleftedge inleftmargin inline contained
+syn keyword contextCommon inlinebuffer inlinedbox inlinemath inlinemathematics inlinemessage contained
+syn keyword contextCommon inlineordisplaymath inlineprettyprintbuffer inlinerange inmargin inmframed contained
+syn keyword contextCommon innerflushshapebox inother inouter inouteredge inoutermargin contained
+syn keyword contextCommon input inputfilebarename inputfilename inputfilerealsuffix inputfilesuffix contained
+syn keyword contextCommon inputgivenfile inright inrightedge inrightmargin insertpages contained
+syn keyword contextCommon inspectluatable installactionhandler installactivecharacter installanddefineactivecharacter installattributestack contained
+syn keyword contextCommon installautocommandhandler installautosetuphandler installbasicautosetuphandler installbasicparameterhandler installbottomframerenderer contained
+syn keyword contextCommon installcommandhandler installcorenamespace installctxfunction installctxscanner installdefinehandler contained
+syn keyword contextCommon installdefinitionset installdefinitionsetmember installdirectcommandhandler installdirectparameterhandler installdirectparametersethandler contained
+syn keyword contextCommon installdirectsetuphandler installdirectstyleandcolorhandler installframedautocommandhandler installframedcommandhandler installglobalmacrostack contained
+syn keyword contextCommon installlanguage installleftframerenderer installmacrostack installnamespace installoutputroutine contained
+syn keyword contextCommon installpagearrangement installparameterhandler installparameterhashhandler installparametersethandler installparentinjector contained
+syn keyword contextCommon installprotectedctxfunction installprotectedctxscanner installrightframerenderer installrootparameterhandler installsetuphandler contained
+syn keyword contextCommon installsetuponlycommandhandler installshipoutmethod installsimplecommandhandler installsimpleframedcommandhandler installstyleandcolorhandler contained
+syn keyword contextCommon installswitchcommandhandler installswitchsetuphandler installtexdirective installtextracker installtopframerenderer contained
+syn keyword contextCommon installunitsseparator installunitsspace installversioninfo int intclockwise contained
+syn keyword contextCommon integerrounding integers interaction interactionbar interactionbuttons contained
+syn keyword contextCommon interactionmenu intercal interface intermezzotext intertext contained
+syn keyword contextCommon interwordspaceafter interwordspacebefore interwordspaces interwordspacesafter interwordspacesbefore contained
+syn keyword contextCommon intop invisiblecomma invisibleplus invisibletimes invokepagehandler contained
+syn keyword contextCommon iogonek iota italic italicbold italiccorrection contained
+syn keyword contextCommon italicface item itemgroup itemgroupcolumns itemize contained
+syn keyword contextCommon items itemtag itilde jcaron jcircumflex contained
+syn keyword contextCommon ji jmath jobfilename jobfilesuffix kap contained
+syn keyword contextCommon kappa kcaron kcommaaccent keepblocks keeplinestogether contained
+syn keyword contextCommon keepunwantedspaces kerncharacters khook kkra knockout contained
+syn keyword contextCommon koreancirclenumerals koreannumerals koreannumeralsc koreannumeralsp koreanparentnumerals contained
+syn keyword contextCommon lVert labellanguage labeltext labeltexts lacute contained
+syn keyword contextCommon lambda lambdabar land langle language contained
+syn keyword contextCommon languageCharacters languagecharacters languagecharwidth laplace lastcounter contained
+syn keyword contextCommon lastcountervalue lastdigit lastlinewidth lastnaturalboxdp lastnaturalboxht contained
+syn keyword contextCommon lastnaturalboxwd lastparwrapper lastpredefinedsymbol lastrealpage lastrealpagenumber contained
+syn keyword contextCommon lastsubcountervalue lastsubpage lastsubpagenumber lasttwodigits lastuserpage contained
+syn keyword contextCommon lastuserpagenumber lateluacode latin layeredtext layerheight contained
+syn keyword contextCommon layerwidth layout lazysavetaggedtwopassdata lazysavetwopassdata lbar contained
+syn keyword contextCommon lbox lbrace lbracket lcaron lceil contained
+syn keyword contextCommon lchexnumber lchexnumbers lcommaaccent lcurl ldotmiddle contained
+syn keyword contextCommon ldotp ldots le leadsto left contained
+syn keyword contextCommon leftaligned leftarrow leftarrowtail leftarrowtriangle leftbottombox contained
+syn keyword contextCommon leftbox leftdasharrow leftguillemot leftharpoondown leftharpoonup contained
+syn keyword contextCommon lefthbox leftheadtext leftlabeltext leftleftarrows leftline contained
+syn keyword contextCommon leftmathlabeltext leftorrighthbox leftorrightvbox leftorrightvtop leftrightarrow contained
+syn keyword contextCommon leftrightarrows leftrightarrowtriangle leftrightharpoons leftrightsquigarrow leftskipadaption contained
+syn keyword contextCommon leftsquigarrow leftsubguillemot leftthreetimes lefttopbox lefttoright contained
+syn keyword contextCommon lefttorighthbox lefttorightvbox lefttorightvtop leftwavearrow leftwhitearrow contained
+syn keyword contextCommon legend leq leqq leqslant lessapprox contained
+syn keyword contextCommon lessdot lesseqgtr lesseqqgtr lessgtr lesssim contained
+syn keyword contextCommon letbeundefined letcatcodecommand letcscsname letcsnamecs letcsnamecsname contained
+syn keyword contextCommon letdummyparameter letempty letgvalue letgvalueempty letgvalurelax contained
+syn keyword contextCommon letterampersand letterat letterbackslash letterbar letterbgroup contained
+syn keyword contextCommon letterclosebrace lettercolon letterdollar letterdoublequote letteregroup contained
+syn keyword contextCommon letterescape letterexclamationmark letterhash letterhat letterleftbrace contained
+syn keyword contextCommon letterleftbracket letterleftparenthesis letterless lettermore letteropenbrace contained
+syn keyword contextCommon letterpercent letterquestionmark letterrightbrace letterrightbracket letterrightparenthesis contained
+syn keyword contextCommon lettersinglequote letterslash letterspacing lettertilde letterunderscore contained
+syn keyword contextCommon letvalue letvalueempty letvaluerelax lfence lfloor contained
+syn keyword contextCommon lgroup lhbox lhooknwarrow lhooksearrow limitatefirstline contained
+syn keyword contextCommon limitatelines limitatetext line linealignment linebox contained
+syn keyword contextCommon linecorrection linefeed linefiller linefillerhbox linefillervbox contained
+syn keyword contextCommon linefillervtop linenote linenumbering lines linespanningtext contained
+syn keyword contextCommon linetable linetablebody linetablecell linetablehead linethickness contained
+syn keyword contextCommon linterval listcitation listcite listlength listnamespaces contained
+syn keyword contextCommon literalmode ljligature ll llangle llap contained
+syn keyword contextCommon llbracket llcorner lll llless llointerval contained
+syn keyword contextCommon lmoustache lnapprox lneq lneqq lnot contained
+syn keyword contextCommon lnsim loadanyfile loadanyfileonce loadbtxdefinitionfile loadbtxreplacementfile contained
+syn keyword contextCommon loadcldfile loadcldfileonce loadfontgoodies loadluafile loadluafileonce contained
+syn keyword contextCommon loadspellchecklist loadtexfile loadtexfileonce loadtypescriptfile localfootnotes contained
+syn keyword contextCommon localframed localframedwithsettings localheadsetup localhsize locallinecorrection contained
+syn keyword contextCommon localnotes localpopbox localpopmacro localpushbox localpushmacro contained
+syn keyword contextCommon localsetups localundefine locatedfilepath locatefilepath locfilename contained
+syn keyword contextCommon logo lohi lointerval lomihi longleftarrow contained
+syn keyword contextCommon longleftrightarrow longmapsfrom longmapsto longrightarrow longrightsquigarrow contained
+syn keyword contextCommon looparrowleft looparrowright lor low lowerbox contained
+syn keyword contextCommon lowercased lowercasestring lowercasing lowerleftdoubleninequote lowerleftsingleninequote contained
+syn keyword contextCommon lowerrightdoubleninequote lowerrightsingleninequote lozenge lparent lrcorner contained
+syn keyword contextCommon lrointerval lrtbbox lstroke lt ltimes contained
+syn keyword contextCommon ltop ltrhbox ltrvbox ltrvtop lua contained
+syn keyword contextCommon luaTeX luacode luaconditional luaenvironment luaexpanded contained
+syn keyword contextCommon luaexpr luafunction luajitTeX luamajorversion luametaTeX contained
+syn keyword contextCommon luaminorversion luaparameterset luasetup luasetups luaversion contained
+syn keyword contextCommon lvert m mLeftarrow mLeftrightarrow mRightarrow contained
+syn keyword contextCommon mainlanguage makecharacteractive makerawcommalist makestrutofbox makeup contained
+syn keyword contextCommon maltese mapfontsize mapsdown mapsfrom mapsto contained
+syn keyword contextCommon mapsup marginblock margindata marginrule margintext contained
+syn keyword contextCommon markcontent markedcontent markedpages marking markinjector contained
+syn keyword contextCommon markpage markpages markreferencepage mat math contained
+syn keyword contextCommon mathalignment mathampersand mathbf mathbi mathblackboard contained
+syn keyword contextCommon mathbs mathcases mathdefault mathdollar mathdouble contained
+syn keyword contextCommon mathematics mathfraktur mathfunction mathhash mathhyphen contained
+syn keyword contextCommon mathit mathitalic mathlabellanguage mathlabeltext mathlabeltexts contained
+syn keyword contextCommon mathmatrix mathmode mathop mathover mathpercent contained
+syn keyword contextCommon mathrm mathscript mathsl mathss mathstyle contained
+syn keyword contextCommon mathtext mathtextbf mathtextbi mathtextbs mathtextit contained
+syn keyword contextCommon mathtextsl mathtexttf mathtf mathtriplet mathtt contained
+syn keyword contextCommon mathunder mathupright mathword mathwordbf mathwordbi contained
+syn keyword contextCommon mathwordbs mathwordit mathwordsl mathwordtf matrices contained
+syn keyword contextCommon matrix maxaligned mbox mcframed mdformula contained
+syn keyword contextCommon measure measured measuredangle measuredeq medskip contained
+syn keyword contextCommon medspace menubutton mequal message mfence contained
+syn keyword contextCommon mframed mfunction mfunctionlabeltext mhbox mho contained
+syn keyword contextCommon mhookleftarrow mhookrightarrow mid midaligned middle contained
+syn keyword contextCommon middlealigned middlebox middlemakeup midhbox midsubsentence contained
+syn keyword contextCommon minimalhbox minus minuscolon mirror mixedcaps contained
+syn keyword contextCommon mixedcolumns mkvibuffer mleftarrow mleftharpoondown mleftharpoonup contained
+syn keyword contextCommon mleftrightarrow mleftrightharpoons mmapsto mode models contained
+syn keyword contextCommon modeset module moduleparameter moduletestsection molecule contained
+syn keyword contextCommon mono monobold mononormal month monthlong contained
+syn keyword contextCommon monthshort mp mpformula mprandomnumber mrel contained
+syn keyword contextCommon mrightarrow mrightharpoondown mrightharpoonup mrightleftharpoons mrightoverleftarrow contained
+syn keyword contextCommon mtext mtriplerel mtwoheadleftarrow mtwoheadrightarrow mu contained
+syn keyword contextCommon multicolumns multimap nHdownarrow nHuparrow nLeftarrow contained
+syn keyword contextCommon nLeftrightarrow nRightarrow nVDash nVdash nVleftarrow contained
+syn keyword contextCommon nVleftrightarrow nVrightarrow nabla nacute namedheadnumber contained
+syn keyword contextCommon namedsection namedstructureheadlocation namedstructureuservariable namedstructurevariable namedsubformulas contained
+syn keyword contextCommon namedtaggedlabeltexts napostrophe napprox napproxEq narrow contained
+syn keyword contextCommon narrower narrownobreakspace nasymp natural naturalhbox contained
+syn keyword contextCommon naturalhpack naturalnumbers naturaltpack naturalvbox naturalvcenter contained
+syn keyword contextCommon naturalvpack naturalvtop naturalwd ncaron ncommaaccent contained
+syn keyword contextCommon ncong ncurl ndivides ne nearrow contained
+syn keyword contextCommon neg negatecolorbox negated negative negativesign contained
+syn keyword contextCommon negemspace negenspace negthinspace neng neq contained
+syn keyword contextCommon nequiv neswarrow newattribute newcatcodetable newcounter contained
+syn keyword contextCommon newevery newfrenchspacing newluatable newmode newsignal contained
+syn keyword contextCommon newsystemmode nexists nextbox nextboxdp nextboxht contained
+syn keyword contextCommon nextboxhtdp nextboxwd nextcounter nextcountervalue nextdepth contained
+syn keyword contextCommon nextparagraphs nextrealpage nextrealpagenumber nextsubcountervalue nextsubpage contained
+syn keyword contextCommon nextsubpagenumber nextuserpage nextuserpagenumber ngeq ngrave contained
+syn keyword contextCommon ngtr ngtrless ngtrsim ni nicelyfilledbox contained
+syn keyword contextCommon nihongo nin njligature nleftarrow nleftrightarrow contained
+syn keyword contextCommon nleq nless nlessgtr nlesssim nmid contained
+syn keyword contextCommon nni nobar nobreakspace nocap nocharacteralign contained
+syn keyword contextCommon nocitation nocite nodetostring noffigurepages noflines contained
+syn keyword contextCommon noflinesinbox noflocalfloats noheaderandfooterlines noheightstrut nohyphens contained
+syn keyword contextCommon noindentation nointerference noitem nonfrenchspacing nonmathematics contained
+syn keyword contextCommon nonvalidassignment normal normalboldface normalframedwithsettings normalitalicface contained
+syn keyword contextCommon normalizebodyfontsize normalizedfontsize normalizefontdepth normalizefontheight normalizefontline contained
+syn keyword contextCommon normalizefontwidth normalizetextdepth normalizetextheight normalizetextline normalizetextwidth contained
+syn keyword contextCommon normalslantedface normaltypeface nospace not notallmodes contained
+syn keyword contextCommon note notesymbol notext notin notmode contained
+syn keyword contextCommon notopandbottomlines notragged nowns nparallel nprec contained
+syn keyword contextCommon npreccurlyeq nrightarrow nsim nsimeq nsqsubseteq contained
+syn keyword contextCommon nsqsupseteq nsubset nsubseteq nsucc nsucccurlyeq contained
+syn keyword contextCommon nsupset nsupseteq ntilde ntimes ntriangleleft contained
+syn keyword contextCommon ntrianglelefteq ntriangleright ntrianglerighteq nu numberofpoints contained
+syn keyword contextCommon numbers nvDash nvdash nvleftarrow nvleftrightarrow contained
+syn keyword contextCommon nvrightarrow nwarrow nwsearrow oacute obeydepth contained
+syn keyword contextCommon objectdepth objectheight objectmargin objectwidth obox contained
+syn keyword contextCommon obreve ocaron ocircumflex ocircumflexacute ocircumflexdotbelow contained
+syn keyword contextCommon ocircumflexgrave ocircumflexhook ocircumflextilde octnumber octstringtonumber contained
+syn keyword contextCommon odiaeresis odiaeresismacron odot odotaccent odotaccentmacron contained
+syn keyword contextCommon odotbelow odoublegrave oeligature offset offsetbox contained
+syn keyword contextCommon ograve ohm ohook ohorn ohornacute contained
+syn keyword contextCommon ohorndotbelow ohorngrave ohornhook ohorntilde ohungarumlaut contained
+syn keyword contextCommon oiiint oiint oint ointclockwise ointctrclockwise contained
+syn keyword contextCommon oinvertedbreve omacron omega omicron ominus contained
+syn keyword contextCommon onedigitrounding oneeighth onefifth onehalf onequarter contained
+syn keyword contextCommon onesixth onesuperior onethird oogonek oogonekmacron contained
+syn keyword contextCommon operatorlanguage operatortext oplus opposite ordfeminine contained
+syn keyword contextCommon ordinaldaynumber ordinalstr ordmasculine ornamenttext oslash contained
+syn keyword contextCommon ostroke ostrokeacute otilde otildemacron otimes contained
+syn keyword contextCommon outputfilename outputstream outputstreambox outputstreamcopy outputstreamunvbox contained
+syn keyword contextCommon outputstreamunvcopy over overbar overbars overbartext contained
+syn keyword contextCommon overbarunderbar overbrace overbracetext overbraceunderbrace overbracket contained
+syn keyword contextCommon overbrackettext overbracketunderbracket overlay overlaybutton overlaycolor contained
+syn keyword contextCommon overlaydepth overlayfigure overlayheight overlayimage overlaylinecolor contained
+syn keyword contextCommon overlaylinewidth overlayoffset overlayrollbutton overlaywidth overleftarrow contained
+syn keyword contextCommon overleftharpoondown overleftharpoonup overleftrightarrow overloaderror overparent contained
+syn keyword contextCommon overparenttext overparentunderparent overprint overrightarrow overrightharpoondown contained
+syn keyword contextCommon overrightharpoonup overset overstrike overstrikes overtwoheadleftarrow contained
+syn keyword contextCommon overtwoheadrightarrow owns packed page pagearea contained
+syn keyword contextCommon pagebreak pagecolumns pagecomment pagefigure pageinjection contained
+syn keyword contextCommon pagelayout pagemakeup pagenumber pagereference pagestaterealpage contained
+syn keyword contextCommon pagestaterealpageorder paletsize par paragraph paragraphmark contained
+syn keyword contextCommon paragraphs paragraphscell parallel parbuilder part contained
+syn keyword contextCommon partial path pdfTeX pdfactualtext pdfbackendactualtext contained
+syn keyword contextCommon pdfbackendcurrentresources pdfbackendsetcatalog pdfbackendsetcolorspace pdfbackendsetextgstate pdfbackendsetinfo contained
+syn keyword contextCommon pdfbackendsetname pdfbackendsetpageattribute pdfbackendsetpageresource pdfbackendsetpagesattribute pdfbackendsetpattern contained
+syn keyword contextCommon pdfbackendsetshade pdfcolor pdfeTeX percent percentdimen contained
+syn keyword contextCommon periodcentered periods permitcaretescape permitcircumflexescape permitspacesbetweengroups contained
+syn keyword contextCommon perp persiandecimals persiandecimalseparator persiannumerals persianthousandsseparator contained
+syn keyword contextCommon perthousand phantom phantombox phi phook contained
+syn keyword contextCommon pi pickupgroupedcommand pitchfork placeattachments placebookmarks contained
+syn keyword contextCommon placebtxrendering placechemical placecitation placecombinedlist placecomments contained
+syn keyword contextCommon placecontent placecurrentformulanumber placedbox placefigure placefloat contained
+syn keyword contextCommon placefloatcaption placefloatwithsetups placefootnotes placeformula placeframed contained
+syn keyword contextCommon placegraphic placeheadnumber placeheadtext placehelp placeholder contained
+syn keyword contextCommon placeindex placeinitial placeintermezzo placelayer placelayeredtext contained
+syn keyword contextCommon placelegend placelist placelistofabbreviations placelistofchemicals placelistoffigures contained
+syn keyword contextCommon placelistofgraphics placelistofintermezzi placelistoflogos placelistofpublications placelistofsorts contained
+syn keyword contextCommon placelistofsynonyms placelistoftables placelocalfootnotes placelocalnotes placement contained
+syn keyword contextCommon placenamedfloat placenamedformula placenotes placeongrid placeontopofeachother contained
+syn keyword contextCommon placepagenumber placepairedbox placeparallel placerawheaddata placerawheadnumber contained
+syn keyword contextCommon placerawheadtext placerawlist placeregister placerenderingwindow placesidebyside contained
+syn keyword contextCommon placesubformula placetable pm popattribute popmacro contained
+syn keyword contextCommon popmode popsystemmode position positioning positionoverlay contained
+syn keyword contextCommon positionregionoverlay positive positivesign postponenotes postponing contained
+syn keyword contextCommon postponingnotes prec precapprox preccurlyeq preceq contained
+syn keyword contextCommon preceqq precnapprox precneq precneqq precnsim contained
+syn keyword contextCommon precsim predefinedfont predefinefont predefinesymbol prefixedpagenumber contained
+syn keyword contextCommon prefixlanguage prefixtext prependetoks prependgvalue prependtocommalist contained
+syn keyword contextCommon prependtoks prependtoksonce prependvalue prerollblank presetbtxlabeltext contained
+syn keyword contextCommon presetdocument presetfieldsymbols presetheadtext presetlabeltext presetmathlabeltext contained
+syn keyword contextCommon presetoperatortext presetprefixtext presetsuffixtext presettaglabeltext presetunittext contained
+syn keyword contextCommon pretocommalist prettyprintbuffer prevcounter prevcountervalue preventmode contained
+syn keyword contextCommon prevrealpage prevrealpagenumber prevsubcountervalue prevsubpage prevsubpagenumber contained
+syn keyword contextCommon prevuserpage prevuserpagenumber prime primes procent contained
+syn keyword contextCommon processMPbuffer processMPfigurefile processaction processallactionsinset processassignlist contained
+syn keyword contextCommon processassignmentcommand processassignmentlist processbetween processblocks processbodyfontenvironmentlist contained
+syn keyword contextCommon processcolorcomponents processcommacommand processcommalist processcommalistwithparameters processcontent contained
+syn keyword contextCommon processfile processfilemany processfilenone processfileonce processfirstactioninset contained
+syn keyword contextCommon processisolatedchars processisolatedwords processlinetablebuffer processlinetablefile processlist contained
+syn keyword contextCommon processmonth processranges processseparatedlist processtexbuffer processtokens contained
+syn keyword contextCommon processuntil processxtablebuffer processyear prod product contained
+syn keyword contextCommon profiledbox profilegivenbox program project propto contained
+syn keyword contextCommon protect protectedcolors pseudoMixedCapped pseudoSmallCapped pseudoSmallcapped contained
+syn keyword contextCommon pseudosmallcapped psi publication punctuation punctuationspace contained
+syn keyword contextCommon purenumber pushattribute pushbutton pushmacro pushmode contained
+syn keyword contextCommon pushoutputstream pushsystemmode putboxincache putnextboxincache qquad contained
+syn keyword contextCommon quad quadrupleprime quads quarterstrut questiondown contained
+syn keyword contextCommon questionedeq quitcommalist quitprevcommalist quittypescriptscanning quotation contained
+syn keyword contextCommon quote quotedbl quotedblbase quotedblleft quotedblright contained
+syn keyword contextCommon quoteleft quoteright quotesingle quotesinglebase rVert contained
+syn keyword contextCommon racute raggedbottom raggedcenter raggedleft raggedright contained
+syn keyword contextCommon raggedwidecenter raisebox randomized randomizetext randomnumber contained
+syn keyword contextCommon randomseed rangle rationals rawcounter rawcountervalue contained
+syn keyword contextCommon rawdate rawdoifelseinset rawdoifinset rawdoifinsetelse rawgetparameters contained
+syn keyword contextCommon rawprocessaction rawprocesscommacommand rawprocesscommalist rawsetups rawstructurelistuservariable contained
+syn keyword contextCommon rawsubcountervalue rbox rbrace rbracket rcaron contained
+syn keyword contextCommon rceil rcommaaccent rdoublegrave readfile readfixfile contained
+syn keyword contextCommon readingfile readjobfile readlocfile readsetfile readsysfile contained
+syn keyword contextCommon readtexfile readxmlfile realSmallCapped realSmallcapped realpagenumber contained
+syn keyword contextCommon reals realsmallcapped recursedepth recurselevel recursestring contained
+syn keyword contextCommon redoconvertfont ref reference referencecolumnnumber referencepagedetail contained
+syn keyword contextCommon referencepagestate referenceprefix referencerealpage referencesymbol referring contained
+syn keyword contextCommon regime registerattachment registerctxluafile registered registerexternalfigure contained
+syn keyword contextCommon registerfontclass registerhyphenationexception registerhyphenationpattern registermenubuttons registerparwrapper contained
+syn keyword contextCommon registerparwrapperreverse registersort registersynonym registerunit regular contained
+syn keyword contextCommon relatemarking relateparameterhandlers relaxvalueifundefined relbar remainingcharacters contained
+syn keyword contextCommon remark removebottomthings removedepth removefromcommalist removelastskip contained
+syn keyword contextCommon removelastspace removemarkedcontent removepunctuation removesubstring removetoks contained
+syn keyword contextCommon removeunwantedspaces repeathead replacefeature replaceincommalist replaceword contained
+syn keyword contextCommon rescan rescanwithsetup resetMPdrawing resetMPenvironment resetMPinstance contained
+syn keyword contextCommon resetallattributes resetandaddfeature resetbar resetboxesincache resetbreakpoints contained
+syn keyword contextCommon resetbuffer resetcharacteralign resetcharacterkerning resetcharacterspacing resetcharacterstripping contained
+syn keyword contextCommon resetcollector resetcounter resetctxscanner resetdigitsmanipulation resetdirection contained
+syn keyword contextCommon resetfeature resetflag resetfontcolorsheme resetfontfallback resetfontsolution contained
+syn keyword contextCommon resethyphenationfeatures resetinjector resetinteractionmenu resetitaliccorrection resetlayer contained
+syn keyword contextCommon resetlocalfloats resetmarker resetmarking resetmode resetpagenumber contained
+syn keyword contextCommon resetparallel resetpath resetpenalties resetperiodkerning resetprofile contained
+syn keyword contextCommon resetrecurselevel resetreference resetreplacements resetscript resetsetups contained
+syn keyword contextCommon resetshownsynonyms resetsubpagenumber resetsymbolset resetsystemmode resettimer contained
+syn keyword contextCommon resettokenlist resettrackers resettrialtypesetting resetusedsortings resetusedsynonyms contained
+syn keyword contextCommon resetuserpagenumber resetvalue resetvisualizers reshapebox resolvedglyphdirect contained
+syn keyword contextCommon resolvedglyphstyled restartcounter restorebox restorecatcodes restorecounter contained
+syn keyword contextCommon restorecurrentattributes restoreendofline restoreglobalbodyfont restriction retestfeature contained
+syn keyword contextCommon reusableMPgraphic reuseMPgraphic reuserandomseed reverseddoubleprime reversedprime contained
+syn keyword contextCommon reversedtripleprime reversehbox reversehpack reversetpack reversevbox contained
+syn keyword contextCommon reversevboxcontent reversevpack reversevtop revivefeature rfence contained
+syn keyword contextCommon rfloor rgroup rhbox rho rhooknearrow contained
+syn keyword contextCommon rhookswarrow right rightaligned rightangle rightarrow contained
+syn keyword contextCommon rightarrowbar rightarrowtail rightarrowtriangle rightbottombox rightbox contained
+syn keyword contextCommon rightdasharrow rightguillemot rightharpoondown rightharpoonup righthbox contained
+syn keyword contextCommon rightheadtext rightlabeltext rightleftarrows rightleftharpoons rightline contained
+syn keyword contextCommon rightmathlabeltext rightorleftpageaction rightpageorder rightrightarrows rightskipadaption contained
+syn keyword contextCommon rightsquigarrow rightsubguillemot rightthreearrows rightthreetimes righttoleft contained
+syn keyword contextCommon righttolefthbox righttoleftvbox righttoleftvtop righttopbox rightwavearrow contained
+syn keyword contextCommon rightwhitearrow ring rinterval rinvertedbreve risingdotseq contained
+syn keyword contextCommon rlap rlointerval rmoustache rneq robustaddtocommalist contained
+syn keyword contextCommon robustdoifelseinset robustdoifinsetelse robustpretocommalist rointerval rollbutton contained
+syn keyword contextCommon roman romanC romanD romanI romanII contained
+syn keyword contextCommon romanIII romanIV romanIX romanL romanM contained
+syn keyword contextCommon romanV romanVI romanVII romanVIII romanX contained
+syn keyword contextCommon romanXI romanXII romanc romand romani contained
+syn keyword contextCommon romanii romaniii romaniv romanix romanl contained
+syn keyword contextCommon romanm romannumerals romanv romanvi romanvii contained
+syn keyword contextCommon romanviii romanx romanxi romanxii rootradical contained
+syn keyword contextCommon rotate rparent rrangle rrbracket rrointerval contained
+syn keyword contextCommon rtimes rtlhbox rtlvbox rtlvtop rtop contained
+syn keyword contextCommon ruby ruledhbox ruledhpack ruledmbox ruledtopv contained
+syn keyword contextCommon ruledtpack ruledvbox ruledvpack ruledvtop runMPbuffer contained
+syn keyword contextCommon runninghbox russianNumerals russiannumerals rvert sacute contained
+syn keyword contextCommon safechar samplefile sans sansbold sansnormal contained
+syn keyword contextCommon sansserif savebox savebtxdataset savebuffer savecounter contained
+syn keyword contextCommon savecurrentattributes savenormalmeaning savetaggedtwopassdata savetwopassdata sbox contained
+syn keyword contextCommon scale scaron scedilla schwa schwahook contained
+syn keyword contextCommon scircumflex scommaaccent screen script sdformula contained
+syn keyword contextCommon searrow secondoffivearguments secondoffourarguments secondofsixarguments secondofthreearguments contained
+syn keyword contextCommon secondofthreeunexpanded secondoftwoarguments secondoftwounexpanded section sectionblock contained
+syn keyword contextCommon sectionblockenvironment sectionlevel sectionmark seeindex select contained
+syn keyword contextCommon selectblocks serializecommalist serializedcommalist serif serifbold contained
+syn keyword contextCommon serifnormal setJSpreamble setMPlayer setMPpositiongraphic setMPpositiongraphicrange contained
+syn keyword contextCommon setMPtext setMPvariable setMPvariables setautopagestaterealpageno setbar contained
+syn keyword contextCommon setbigbodyfont setboxllx setboxlly setbreakpoints setcapstrut contained
+syn keyword contextCommon setcatcodetable setcharacteralign setcharacteraligndetail setcharactercasing setcharactercleaning contained
+syn keyword contextCommon setcharacterkerning setcharacterspacing setcharacterstripping setcharstrut setcollector contained
+syn keyword contextCommon setcolormodell setcounter setcounterown setctxluafunction setcurrentfontclass contained
+syn keyword contextCommon setdataset setdatavalue setdefaultpenalties setdigitsmanipulation setdirection contained
+syn keyword contextCommon setdocumentargument setdocumentargumentdefault setdocumentfilename setdummyparameter setelementexporttag contained
+syn keyword contextCommon setemeasure setevalue setevariable setevariables setexpansion contained
+syn keyword contextCommon setfirstline setfirstpasscharacteralign setflag setfont setfontcolorsheme contained
+syn keyword contextCommon setfontfeature setfontsolution setfontstrut setfractions setglobalscript contained
+syn keyword contextCommon setgmeasure setgvalue setgvariable setgvariables sethboxregister contained
+syn keyword contextCommon sethyphenatedurlafter sethyphenatedurlbefore sethyphenatedurlnormal sethyphenationfeatures setinitial contained
+syn keyword contextCommon setinjector setinteraction setinterfacecommand setinterfaceconstant setinterfaceelement contained
+syn keyword contextCommon setinterfacemessage setinterfacevariable setinternalrendering setitaliccorrection setlayer contained
+syn keyword contextCommon setlayerframed setlayertext setlinefiller setlocalhsize setlocalscript contained
+syn keyword contextCommon setluatable setmainbodyfont setmainparbuilder setmarker setmarking contained
+syn keyword contextCommon setmathstyle setmeasure setmessagetext setminus setmode contained
+syn keyword contextCommon setnostrut setnote setnotetext setobject setoldstyle contained
+syn keyword contextCommon setpagereference setpagestate setpagestaterealpageno setparagraphfreezing setpenalties contained
+syn keyword contextCommon setpercentdimen setperiodkerning setposition setpositionbox setpositiondata contained
+syn keyword contextCommon setpositiondataplus setpositiononly setpositionplus setpositionstrut setprofile contained
+syn keyword contextCommon setrandomseed setreference setreferencedobject setregisterentry setreplacements contained
+syn keyword contextCommon setrigidcolumnbalance setrigidcolumnhsize setscript setsecondpasscharacteralign setsectionblock contained
+syn keyword contextCommon setsimplecolumnshsize setsmallbodyfont setsmallcaps setstackbox setstructurepageregister contained
+syn keyword contextCommon setstrut setsuperiors setsystemmode settabular settaggedmetadata contained
+syn keyword contextCommon settestcrlf settextcontent settightobject settightreferencedobject settightstrut contained
+syn keyword contextCommon settightunreferencedobject settokenlist settrialtypesetting setuevalue setugvalue contained
+syn keyword contextCommon setunreferencedobject setup setupMPgraphics setupMPinstance setupMPpage contained
+syn keyword contextCommon setupMPvariables setupTABLE setupTEXpage setupalign setupalternativestyles contained
+syn keyword contextCommon setuparranging setupattachment setupattachments setupbackend setupbackground contained
+syn keyword contextCommon setupbackgrounds setupbar setupbars setupblackrules setupblank contained
+syn keyword contextCommon setupbleeding setupblock setupbodyfont setupbodyfontenvironment setupbookmark contained
+syn keyword contextCommon setupbottom setupbottomtexts setupbtx setupbtxdataset setupbtxlabeltext contained
+syn keyword contextCommon setupbtxlist setupbtxregister setupbtxrendering setupbuffer setupbutton contained
+syn keyword contextCommon setupcapitals setupcaption setupcaptions setupcharacteralign setupcharacterkerning contained
+syn keyword contextCommon setupcharacterspacing setupchemical setupchemicalframed setupclipping setupcollector contained
+syn keyword contextCommon setupcolor setupcolors setupcolumns setupcolumnset setupcolumnsetarea contained
+syn keyword contextCommon setupcolumnsetareatext setupcolumnsetlines setupcolumnsetspan setupcolumnsetstart setupcombination contained
+syn keyword contextCommon setupcombinedlist setupcomment setupcontent setupcounter setupdataset contained
+syn keyword contextCommon setupdelimitedtext setupdescription setupdescriptions setupdirections setupdocument contained
+syn keyword contextCommon setupeffect setupenumeration setupenumerations setupenv setupexpansion contained
+syn keyword contextCommon setupexport setupexternalfigure setupexternalfigures setupexternalsoundtracks setupfacingfloat contained
+syn keyword contextCommon setupfield setupfieldbody setupfieldcategory setupfieldcontentframed setupfieldlabelframed contained
+syn keyword contextCommon setupfields setupfieldtotalframed setupfiller setupfillinlines setupfillinrules contained
+syn keyword contextCommon setupfirstline setupfittingpage setupfloat setupfloatframed setupfloats contained
+syn keyword contextCommon setupfloatsplitting setupfontexpansion setupfontprotrusion setupfonts setupfontsolution contained
+syn keyword contextCommon setupfooter setupfootertexts setupfootnotes setupforms setupformula contained
+syn keyword contextCommon setupformulae setupformulaframed setupframed setupframedcontent setupframedtable contained
+syn keyword contextCommon setupframedtablecolumn setupframedtablerow setupframedtext setupframedtexts setupglobalreferenceprefix contained
+syn keyword contextCommon setuphead setupheadalternative setupheader setupheadertexts setupheadnumber contained
+syn keyword contextCommon setupheads setupheadtext setuphelp setuphigh setuphighlight contained
+syn keyword contextCommon setuphyphenation setuphyphenmark setupindentedtext setupindenting setupindex contained
+syn keyword contextCommon setupinitial setupinsertion setupinteraction setupinteractionbar setupinteractionmenu contained
+syn keyword contextCommon setupinteractionscreen setupinterlinespace setupitaliccorrection setupitemgroup setupitemizations contained
+syn keyword contextCommon setupitemize setupitems setuplabel setuplabeltext setuplanguage contained
+syn keyword contextCommon setuplayer setuplayeredtext setuplayout setuplayouttext setuplegend contained
+syn keyword contextCommon setuplinefiller setuplinefillers setuplinenote setuplinenumbering setuplines contained
+syn keyword contextCommon setuplinetable setuplinewidth setuplist setuplistalternative setuplistextra contained
+syn keyword contextCommon setuplocalfloats setuplocalinterlinespace setuplow setuplowhigh setuplowmidhigh contained
+syn keyword contextCommon setupmakeup setupmarginblock setupmargindata setupmarginframed setupmarginrule contained
+syn keyword contextCommon setupmarginrules setupmarking setupmathalignment setupmathcases setupmathematics contained
+syn keyword contextCommon setupmathfence setupmathfraction setupmathfractions setupmathframed setupmathlabeltext contained
+syn keyword contextCommon setupmathmatrix setupmathornament setupmathradical setupmathstackers setupmathstyle contained
+syn keyword contextCommon setupmixedcolumns setupmodule setupmulticolumns setupnarrower setupnotation contained
+syn keyword contextCommon setupnotations setupnote setupnotes setupoffset setupoffsetbox contained
+syn keyword contextCommon setupoperatortext setupoppositeplacing setuporientation setupoutput setupoutputroutine contained
+syn keyword contextCommon setuppagechecker setuppagecolumns setuppagecomment setuppageinjection setuppageinjectionalternative contained
+syn keyword contextCommon setuppagenumber setuppagenumbering setuppageshift setuppagestate setuppagetransitions contained
+syn keyword contextCommon setuppairedbox setuppalet setuppaper setuppapersize setupparagraph contained
+syn keyword contextCommon setupparagraphintro setupparagraphnumbering setupparagraphs setupparallel setupperiodkerning contained
+syn keyword contextCommon setupperiods setupplaceholder setupplacement setuppositionbar setuppositioning contained
+syn keyword contextCommon setupprefixtext setupprocessor setupprofile setupprograms setupquotation contained
+syn keyword contextCommon setupquote setuprealpagenumber setupreferenceformat setupreferenceprefix setupreferencestructureprefix contained
+syn keyword contextCommon setupreferencing setupregister setupregisters setuprenderingwindow setuprotate contained
+syn keyword contextCommon setupruby setups setupscale setupscript setupscripts contained
+syn keyword contextCommon setupsectionblock setupselector setupshift setupsidebar setupsorting contained
+syn keyword contextCommon setupspacing setupspellchecking setupstartstop setupstretched setupstrut contained
+syn keyword contextCommon setupstyle setupsubformula setupsubformulas setupsubpagenumber setupsuffixtext contained
+syn keyword contextCommon setupsymbols setupsymbolset setupsynctex setupsynonyms setupsystem contained
+syn keyword contextCommon setuptables setuptabulate setuptagging setuptaglabeltext setuptext contained
+syn keyword contextCommon setuptextbackground setuptextflow setuptextnote setuptextrules setuptexttexts contained
+syn keyword contextCommon setupthinrules setuptolerance setuptooltip setuptop setuptoptexts contained
+syn keyword contextCommon setuptype setuptyping setupunit setupunittext setupurl contained
+syn keyword contextCommon setupuserdata setupuserdataalternative setupuserpagenumber setupversion setupviewerlayer contained
+syn keyword contextCommon setupvspacing setupwhitespace setupwithargument setupwithargumentswapped setupxml contained
+syn keyword contextCommon setupxtable setuvalue setuxvalue setvalue setvariable contained
+syn keyword contextCommon setvariables setvboxregister setvisualizerfont setvtopregister setwidthof contained
+syn keyword contextCommon setxmeasure setxvalue setxvariable setxvariables seveneighths contained
+syn keyword contextCommon sfrac shapebox shapedhbox sharp shift contained
+syn keyword contextCommon shiftbox shiftdown shiftup showallmakeup showattributes contained
+syn keyword contextCommon showbodyfont showbodyfontenvironment showboxes showbtxdatasetauthors showbtxdatasetcompleteness contained
+syn keyword contextCommon showbtxdatasetfields showbtxfields showbtxhashedauthors showbtxtables showchardata contained
+syn keyword contextCommon showcharratio showcolor showcolorbar showcolorcomponents showcolorgroup contained
+syn keyword contextCommon showcolorset showcolorstruts showcounter showdirectives showdirsinmargin contained
+syn keyword contextCommon showedebuginfo showexperiments showfont showfontdata showfontexpansion contained
+syn keyword contextCommon showfontitalics showfontkerns showfontparameters showfontstrip showfontstyle contained
+syn keyword contextCommon showframe showglyphdata showglyphs showgrid showgridsnapping contained
+syn keyword contextCommon showhelp showhyphenationtrace showhyphens showinjector showjustification contained
+syn keyword contextCommon showkerning showlayout showlayoutcomponents showligature showligatures contained
+syn keyword contextCommon showlogcategories showluatables showmakeup showmargins showmessage contained
+syn keyword contextCommon showminimalbaseline shownextbox showotfcomposition showpalet showparentchain contained
+syn keyword contextCommon showparwrapperstate showprint showsetups showsetupsdefinition showstruts contained
+syn keyword contextCommon showsymbolset showtimer showtokens showtrackers showvalue contained
+syn keyword contextCommon showvariable showwarning sidebar sigma signalrightpage contained
+syn keyword contextCommon sim simeq simplealignedbox simplealignedboxplus simplealignedspreadbox contained
+syn keyword contextCommon simplecolumns simplegroupedcommand simplereversealignedbox simplereversealignedboxplus singalcharacteralign contained
+syn keyword contextCommon singlebond singleverticalbar sixperemspace sixthofsixarguments slanted contained
+syn keyword contextCommon slantedbold slantedface slash slicepages slong contained
+syn keyword contextCommon slovenianNumerals sloveniannumerals small smallbodyfont smallbold contained
+syn keyword contextCommon smallbolditalic smallboldslanted smallcappedcharacters smallcappedromannumerals smallcaps contained
+syn keyword contextCommon smaller smallitalicbold smallnormal smallskip smallslanted contained
+syn keyword contextCommon smallslantedbold smalltype smash smashbox smashboxed contained
+syn keyword contextCommon smashedhbox smashedvbox smile snaptogrid softhyphen contained
+syn keyword contextCommon solidus someheadnumber somekindoftab someline somelocalfloat contained
+syn keyword contextCommon somenamedheadnumber someplace somewhere space spaceddigits contained
+syn keyword contextCommon spaceddigitsmethod spaceddigitsseparator spaceddigitssymbol spadesuit spanishNumerals contained
+syn keyword contextCommon spanishnumerals specialitem speech spformula sphericalangle contained
+syn keyword contextCommon splitatasterisk splitatcolon splitatcolons splitatcomma splitatperiod contained
+syn keyword contextCommon splitdfrac splitfilename splitfloat splitformula splitfrac contained
+syn keyword contextCommon splitoffbase splitofffull splitoffkind splitoffname splitoffpath contained
+syn keyword contextCommon splitoffroot splitofftokens splitofftype splitstring splittext contained
+syn keyword contextCommon spread spreadhbox sqcap sqcup sqrt contained
+syn keyword contextCommon sqsubset sqsubseteq sqsubsetneq sqsupset sqsupseteq contained
+syn keyword contextCommon sqsupsetneq square squaredots ssharp stackrel contained
+syn keyword contextCommon stackscripts standardmakeup star stareq startline contained
+syn keyword contextCommon startlinenote startregister startstructurepageregister staticMPfigure staticMPgraphic contained
+syn keyword contextCommon stligature stopline stoplinenote stretched strictdoifelsenextoptional contained
+syn keyword contextCommon strictdoifnextoptionalelse strictinspectnextcharacter stripcharacter strippedcsname stripspaces contained
+syn keyword contextCommon structurelistuservariable structurenumber structuretitle structureuservariable structurevariable contained
+syn keyword contextCommon strut strutdp strutgap strutht struthtdp contained
+syn keyword contextCommon struttedbox strutwd style styleinstance subformulas contained
+syn keyword contextCommon subject subjectlevel subpagenumber subsection subsentence contained
+syn keyword contextCommon subset subseteq subseteqq subsetneq subsetneqq contained
+syn keyword contextCommon substack substituteincommalist subsubject subsubsection subsubsubject contained
+syn keyword contextCommon subsubsubsection subsubsubsubject subsubsubsubsection subsubsubsubsubject subtractfeature contained
+syn keyword contextCommon succ succapprox succcurlyeq succeq succeqq contained
+syn keyword contextCommon succnapprox succneq succneqq succnsim succsim contained
+syn keyword contextCommon suffixlanguage suffixtext sum supset supseteq contained
+syn keyword contextCommon supseteqq supsetneq supsetneqq surd surdradical contained
+syn keyword contextCommon swapcounts swapdimens swapface swapmacros swaptypeface contained
+syn keyword contextCommon swarrow switchstyleonly switchtobodyfont switchtocolor switchtointerlinespace contained
+syn keyword contextCommon symbol symbolreference symbolset synchronizeblank synchronizeindenting contained
+syn keyword contextCommon synchronizemarking synchronizeoutputstreams synchronizestrut synchronizewhitespace synctexblockfilename contained
+syn keyword contextCommon synctexresetfilename synctexsetfilename systemlog systemlogfirst systemloglast contained
+syn keyword contextCommon systemsetups tLeftarrow tLeftrightarrow tRightarrow table contained
+syn keyword contextCommon tablehead tables tabletail tabletext tabulate contained
+syn keyword contextCommon tabulateautoline tabulateautorule tabulatehead tabulateline tabulaterule contained
+syn keyword contextCommon tabulatetail tagged taggedctxcommand taggedlabeltexts taglabellanguage contained
+syn keyword contextCommon taglabeltext tau tbinom tbox tcaron contained
+syn keyword contextCommon tcedilla tcommaaccent tcurl tequal test contained
+syn keyword contextCommon testandsplitstring testcolumn testfeature testfeatureonce testpage contained
+syn keyword contextCommon testpageonly testpagesync testtokens tex texcode contained
+syn keyword contextCommon texdefinition texsetup text textAngstrom textacute contained
+syn keyword contextCommon textampersand textasciicircum textasciitilde textat textbackground contained
+syn keyword contextCommon textbackgroundmanual textbackslash textbar textbottomcomma textbottomdot contained
+syn keyword contextCommon textbraceleft textbraceright textbreve textbrokenbar textbullet contained
+syn keyword contextCommon textcaron textcedilla textcelsius textcent textcircledP contained
+syn keyword contextCommon textcircumflex textcitation textcite textcolor textcolorintent contained
+syn keyword contextCommon textcomma textcontrolspace textcurrency textdag textddag contained
+syn keyword contextCommon textdegree textdiaeresis textdiv textdollar textdong contained
+syn keyword contextCommon textdotaccent textellipsis texteuro textflow textflowcollector contained
+syn keyword contextCommon textfraction textgrave texthash texthorizontalbar texthungarumlaut contained
+syn keyword contextCommon texthyphen textkelvin textlognot textmacron textmakeup contained
+syn keyword contextCommon textmath textmho textminus textmp textmu contained
+syn keyword contextCommon textmultiply textnumero textogonek textohm textormathchar contained
+syn keyword contextCommon textormathchars textounce textpercent textperiod textplus contained
+syn keyword contextCommon textpm textreference textring textrule textslash contained
+syn keyword contextCommon textsterling texttilde textunderscore textvisiblespace textyen contained
+syn keyword contextCommon thai thainumerals thedatavalue thefirstcharacter thematrix contained
+syn keyword contextCommon thenormalizedbodyfontsize theorientation therefore theremainingcharacters theta contained
+syn keyword contextCommon thickspace thinrule thinrules thinspace thirdoffivearguments contained
+syn keyword contextCommon thirdoffourarguments thirdofsixarguments thirdofthreearguments thirdofthreeunexpanded thook contained
+syn keyword contextCommon thookleftarrow thookrightarrow thorn threedigitrounding threeeighths contained
+syn keyword contextCommon threefifths threeperemspace threequarter threesuperior tibetannumerals contained
+syn keyword contextCommon tightlayer tilde times tinyfont title contained
+syn keyword contextCommon tlap tleftarrow tleftharpoondown tleftharpoonup tleftrightarrow contained
+syn keyword contextCommon tleftrightharpoons tmapsto to tochar tokenlist contained
+syn keyword contextCommon tokens tolinenote tooltip top topbox contained
+syn keyword contextCommon topleftbox toplinebox toprightbox topskippedbox tracecatcodetables contained
+syn keyword contextCommon tracedfontname tracedpagestate traceoutputroutines tracepositions trademark contained
+syn keyword contextCommon translate transparencycomponents transparent[] trel triangle contained
+syn keyword contextCommon triangledown triangleleft triangleq triangleright trightarrow contained
+syn keyword contextCommon trightharpoondown trightharpoonup trightleftharpoons trightoverleftarrow triplebond contained
+syn keyword contextCommon tripleprime tripleverticalbar truefilename truefontname tstroke contained
+syn keyword contextCommon ttraggedright ttriplerel ttwoheadleftarrow ttwoheadrightarrow turnediota contained
+syn keyword contextCommon twodigitrounding twofifths twoheaddownarrow twoheadleftarrow twoheadrightarrow contained
+syn keyword contextCommon twoheadrightarrowtail twoheaduparrow twosuperior twothirds tx contained
+syn keyword contextCommon txx typ type typebuffer typedefinedbuffer contained
+syn keyword contextCommon typeface typefile typeinlinebuffer typescript typescriptcollection contained
+syn keyword contextCommon typescriptone typescriptprefix typescriptthree typescripttwo typesetbuffer contained
+syn keyword contextCommon typesetbufferonly typesetfile typing uacute ubreve contained
+syn keyword contextCommon ucaron uchexnumber uchexnumbers ucircumflex uconvertnumber contained
+syn keyword contextCommon udiaeresis udiaeresisacute udiaeresiscaron udiaeresisgrave udiaeresismacron contained
+syn keyword contextCommon udotbelow udots udoublegrave uedcatcodecommand ugrave contained
+syn keyword contextCommon uhook uhorn uhornacute uhorndotbelow uhorngrave contained
+syn keyword contextCommon uhornhook uhorntilde uhungarumlaut uinvertedbreve ulcorner contained
+syn keyword contextCommon umacron undefinevalue undepthed underbar underbars contained
+syn keyword contextCommon underbartext underbrace underbracetext underbracket underbrackettext contained
+syn keyword contextCommon underdash underdashes underdot underdots underleftarrow contained
+syn keyword contextCommon underleftharpoondown underleftharpoonup underleftrightarrow underparent underparenttext contained
+syn keyword contextCommon underrandom underrandoms underrightarrow underrightharpoondown underrightharpoonup contained
+syn keyword contextCommon underset understrike understrikes undertwoheadleftarrow undertwoheadrightarrow contained
+syn keyword contextCommon undoassign unexpandeddocumentvariable unframed unhhbox unihex contained
+syn keyword contextCommon uniqueMPgraphic uniqueMPpagegraphic unit unitlanguage unitshigh contained
+syn keyword contextCommon unitslow unittext unknown unpacked unprotected contained
+syn keyword contextCommon unregisterhyphenationpattern unregisterparwrapper unspaceafter unspaceargument unspaced contained
+syn keyword contextCommon unspacestring unstackscripts untexargument untexcommand uogonek contained
+syn keyword contextCommon upand uparrow updasharrow updateparagraphdemerits updateparagraphpenalties contained
+syn keyword contextCommon updateparagraphproperties updateparagraphshapes updownarrow updownarrowbar updownarrows contained
+syn keyword contextCommon upharpoonleft upharpoonright uplus uppercased uppercasestring contained
+syn keyword contextCommon uppercasing upperleftdoubleninequote upperleftdoublesixquote upperleftsingleninequote upperleftsinglesixquote contained
+syn keyword contextCommon upperrightdoubleninequote upperrightdoublesixquote upperrightsingleninequote upperrightsinglesixquote upsilon contained
+syn keyword contextCommon upuparrows upwhitearrow urcorner uring url contained
+syn keyword contextCommon usableMPgraphic useJSscripts useMPenvironmentbuffer useMPgraphic useMPlibrary contained
+syn keyword contextCommon useMPrun useMPvariables useURL usealignparameter useblankparameter contained
+syn keyword contextCommon useblocks usebodyfont usebodyfontparameter usebtxdataset usebtxdefinitions contained
+syn keyword contextCommon usecitation usecolors usecomponent usedirectory usedummycolorparameter contained
+syn keyword contextCommon usedummystyleandcolor usedummystyleparameter useenvironment useexternaldocument useexternalfigure contained
+syn keyword contextCommon useexternalrendering useexternalsoundtrack usefigurebase usefile usefontpath contained
+syn keyword contextCommon usegridparameter usehyphensparameter useindentingparameter useindentnextparameter useinterlinespaceparameter contained
+syn keyword contextCommon uselanguageparameter useluamodule useluatable usemathstyleparameter usemodule contained
+syn keyword contextCommon useproduct useprofileparameter useproject userdata usereferenceparameter contained
+syn keyword contextCommon userpagenumber usesetupsparameter usestaticMPfigure usesubpath usesymbols contained
+syn keyword contextCommon usetexmodule usetypescript usetypescriptfile useurl usezipfile contained
+syn keyword contextCommon usingbtxspecification utfchar utflower utfupper utilde contained
+syn keyword contextCommon utilityregisterlength vDash validassignment varTheta varepsilon contained
+syn keyword contextCommon varkappa varnothing varphi varpi varrho contained
+syn keyword contextCommon varsigma vartheta vbox vboxreference vboxregister contained
+syn keyword contextCommon vboxtohbox vboxtohboxseparator vdash vdots vec contained
+syn keyword contextCommon vee veebar veeeq verbatim verbatimstring contained
+syn keyword contextCommon verbosenumber version vert verticalgrowingbar verticalpositionbar contained
+syn keyword contextCommon veryraggedcenter veryraggedleft veryraggedright vglue viewerlayer contained
+syn keyword contextCommon vl vpackbox vpackedbox vphantom vpos contained
+syn keyword contextCommon vsmash vsmashbox vsmashed vspace vspacing contained
+syn keyword contextCommon vtop vtopregister wcircumflex wdofstring wedge contained
+syn keyword contextCommon wedgeeq weekday whitearrowupfrombar widegrave widehat contained
+syn keyword contextCommon widetilde widthofstring widthspanningtext withoutpt word contained
+syn keyword contextCommon wordright words wordtonumber wp wr contained
+syn keyword contextCommon writebetweenlist writedatatolist writestatus writetolist xLeftarrow contained
+syn keyword contextCommon xLeftrightarrow xRightarrow xcell xcellgroup xcolumn contained
+syn keyword contextCommon xdefconvertedargument xequal xfrac xgroup xhookleftarrow contained
+syn keyword contextCommon xhookrightarrow xi xleftarrow xleftharpoondown xleftharpoonup contained
+syn keyword contextCommon xleftrightarrow xleftrightharpoons xmapsto xmladdindex xmlafterdocumentsetup contained
+syn keyword contextCommon xmlaftersetup xmlall xmlappenddocumentsetup xmlappendsetup xmlapplyselectors contained
+syn keyword contextCommon xmlatt xmlattdef xmlattribute xmlattributedef xmlbadinclusions contained
+syn keyword contextCommon xmlbeforedocumentsetup xmlbeforesetup xmlchainatt xmlchainattdef xmlchecknamespace contained
+syn keyword contextCommon xmlcommand xmlconcat xmlconcatrange xmlcontext xmlcount contained
+syn keyword contextCommon xmldefaulttotext xmldepth xmldirectives xmldirectivesafter xmldirectivesbefore contained
+syn keyword contextCommon xmldisplayverbatim xmldoif xmldoifatt xmldoifelse xmldoifelseatt contained
+syn keyword contextCommon xmldoifelseempty xmldoifelseselfempty xmldoifelsetext xmldoifelsevalue xmldoifnot contained
+syn keyword contextCommon xmldoifnotatt xmldoifnotselfempty xmldoifnottext xmldoifselfempty xmldoiftext contained
+syn keyword contextCommon xmlelement xmlfilter xmlfirst xmlflush xmlflushcontext contained
+syn keyword contextCommon xmlflushdocumentsetups xmlflushlinewise xmlflushpure xmlflushspacewise xmlflushtext contained
+syn keyword contextCommon xmlinclude xmlinclusion xmlinclusions xmlinfo xmlinjector contained
+syn keyword contextCommon xmlinlineprettyprint xmlinlineprettyprinttext xmlinlineverbatim xmlinstalldirective xmllast contained
+syn keyword contextCommon xmllastatt xmllastmatch xmllastpar xmlloadbuffer xmlloaddata contained
+syn keyword contextCommon xmlloaddirectives xmlloadfile xmlloadonly xmlmain xmlmapvalue contained
+syn keyword contextCommon xmlname xmlnamespace xmlnonspace xmlpar xmlparam contained
+syn keyword contextCommon xmlpath xmlpos xmlposition xmlprependdocumentsetup xmlprependsetup contained
+syn keyword contextCommon xmlprettyprint xmlprettyprinttext xmlprocessbuffer xmlprocessdata xmlprocessfile contained
+syn keyword contextCommon xmlpure xmlraw xmlrefatt xmlregistereddocumentsetups xmlregisteredsetups contained
+syn keyword contextCommon xmlregisterns xmlremapname xmlremapnamespace xmlremovedocumentsetup xmlremovesetup contained
+syn keyword contextCommon xmlresetdocumentsetups xmlresetinjectors xmlresetsetups xmlsave xmlsetatt contained
+syn keyword contextCommon xmlsetattribute xmlsetentity xmlsetfunction xmlsetinjectors xmlsetpar contained
+syn keyword contextCommon xmlsetparam xmlsetsetup xmlsetup xmlsetups xmlshow contained
+syn keyword contextCommon xmlsnippet xmlstrip xmlstripnolines xmlstripped xmlstrippednolines contained
+syn keyword contextCommon xmltag xmltexentity xmltext xmltobuffer xmltobufferverbose contained
+syn keyword contextCommon xmltofile xmlvalue xmlverbatim xrel xrightarrow contained
+syn keyword contextCommon xrightharpoondown xrightharpoonup xrightleftharpoons xrightoverleftarrow xrow contained
+syn keyword contextCommon xrowgroup xsplitstring xtable xtablebody xtablefoot contained
+syn keyword contextCommon xtablehead xtablenext xtriplerel xtwoheadleftarrow xtwoheadrightarrow contained
+syn keyword contextCommon xxfrac xypos yacute ycircumflex ydiaeresis contained
+syn keyword contextCommon ydotbelow yen ygrave yhook yiddishnumerals contained
+syn keyword contextCommon ymacron ytilde zacute zcaron zdotaccent contained
+syn keyword contextCommon zeronumberconversion zerowidthnobreakspace zerowidthspace zeta zhook contained
+syn keyword contextCommon zstroke zwj zwnj contained
diff --git a/runtime/syntax/shared/context-data-metafun.vim b/runtime/syntax/shared/context-data-metafun.vim
new file mode 100644
index 0000000..de42e3a
--- /dev/null
+++ b/runtime/syntax/shared/context-data-metafun.vim
@@ -0,0 +1,117 @@
+vim9script
+
+# Vim syntax file
+# Language: ConTeXt
+# Automatically generated by mtx-interface (2022-08-12 10:49)
+
+syn keyword metafunCommands loadfile loadimage loadmodule dispose nothing
+syn keyword metafunCommands transparency tolist topath tocycle sqr
+syn keyword metafunCommands log ln exp inv pow
+syn keyword metafunCommands pi radian tand cotd sin
+syn keyword metafunCommands cos tan cot atan asin
+syn keyword metafunCommands acos invsin invcos invtan acosh
+syn keyword metafunCommands asinh sinh cosh tanh zmod
+syn keyword metafunCommands paired tripled unitcircle fulldiamond unitdiamond
+syn keyword metafunCommands fullsquare unittriangle fulltriangle unitoctagon fulloctagon
+syn keyword metafunCommands unithexagon fullhexagon llcircle lrcircle urcircle
+syn keyword metafunCommands ulcircle tcircle bcircle lcircle rcircle
+syn keyword metafunCommands lltriangle lrtriangle urtriangle ultriangle uptriangle
+syn keyword metafunCommands downtriangle lefttriangle righttriangle triangle smoothed
+syn keyword metafunCommands cornered superellipsed randomized randomizedcontrols squeezed
+syn keyword metafunCommands enlonged shortened punked curved unspiked
+syn keyword metafunCommands simplified blownup stretched enlarged leftenlarged
+syn keyword metafunCommands topenlarged rightenlarged bottomenlarged crossed laddered
+syn keyword metafunCommands randomshifted interpolated perpendicular paralleled cutends
+syn keyword metafunCommands peepholed llenlarged lrenlarged urenlarged ulenlarged
+syn keyword metafunCommands llmoved lrmoved urmoved ulmoved rightarrow
+syn keyword metafunCommands leftarrow centerarrow drawdoublearrows boundingbox innerboundingbox
+syn keyword metafunCommands outerboundingbox pushboundingbox popboundingbox boundingradius boundingcircle
+syn keyword metafunCommands boundingpoint crossingunder insideof outsideof bottomboundary
+syn keyword metafunCommands leftboundary topboundary rightboundary xsized ysized
+syn keyword metafunCommands xysized sized xyscaled intersection_point intersection_found
+syn keyword metafunCommands penpoint bbwidth bbheight withshade withcircularshade
+syn keyword metafunCommands withlinearshade defineshade shaded shadedinto withshadecolors
+syn keyword metafunCommands withshadedomain withshademethod withshadefactor withshadevector withshadecenter
+syn keyword metafunCommands withshadedirection withshaderadius withshadetransform withshadecenterone withshadecentertwo
+syn keyword metafunCommands withshadestep withshadefraction withshadeorigin shownshadevector shownshadeorigin
+syn keyword metafunCommands shownshadedirection shownshadecenter cmyk spotcolor multitonecolor
+syn keyword metafunCommands namedcolor drawfill undrawfill inverted uncolored
+syn keyword metafunCommands softened grayed greyed onlayer along
+syn keyword metafunCommands graphictext loadfigure externalfigure figure register
+syn keyword metafunCommands outlinetext filloutlinetext drawoutlinetext outlinetexttopath checkedbounds
+syn keyword metafunCommands checkbounds strut rule withmask bitmapimage
+syn keyword metafunCommands colordecimals ddecimal dddecimal ddddecimal colordecimalslist
+syn keyword metafunCommands textext thetextext rawtextext textextoffset texbox
+syn keyword metafunCommands thetexbox rawtexbox istextext infotext rawmadetext
+syn keyword metafunCommands validtexbox onetimetextext rawfmttext thefmttext fmttext
+syn keyword metafunCommands onetimefmttext notcached keepcached verbatim thelabel
+syn keyword metafunCommands label autoalign transparent[] withtransparency withopacity
+syn keyword metafunCommands property properties withproperties asgroup withpattern
+syn keyword metafunCommands withpatternscale withpatternfloat infont space crlf
+syn keyword metafunCommands dquote percent SPACE CRLF DQUOTE
+syn keyword metafunCommands PERCENT grayscale greyscale withgray withgrey
+syn keyword metafunCommands colorpart colorlike readfile clearxy unitvector
+syn keyword metafunCommands center epsed anchored originpath infinite
+syn keyword metafunCommands break xstretched ystretched snapped pathconnectors
+syn keyword metafunCommands function constructedfunction constructedpath constructedpairs straightfunction
+syn keyword metafunCommands straightpath straightpairs curvedfunction curvedpath curvedpairs
+syn keyword metafunCommands evenly oddly condition pushcurrentpicture popcurrentpicture
+syn keyword metafunCommands arrowpath resetarrows tensecircle roundedsquare colortype
+syn keyword metafunCommands whitecolor blackcolor basiccolors complementary complemented
+syn keyword metafunCommands resolvedcolor normalfill normaldraw visualizepaths detailpaths
+syn keyword metafunCommands naturalizepaths drawboundary drawwholepath drawpathonly visualizeddraw
+syn keyword metafunCommands visualizedfill detaileddraw draworigin drawboundingbox drawpath
+syn keyword metafunCommands drawpoint drawpoints drawcontrolpoints drawcontrollines drawpointlabels
+syn keyword metafunCommands drawlineoptions drawpointoptions drawcontroloptions drawlabeloptions draworiginoptions
+syn keyword metafunCommands drawboundoptions drawpathoptions resetdrawoptions undashed pencilled
+syn keyword metafunCommands decorated redecorated undecorated passvariable passarrayvariable
+syn keyword metafunCommands tostring topair format formatted quotation
+syn keyword metafunCommands quote startpassingvariable stoppassingvariable eofill eoclip
+syn keyword metafunCommands nofill dofill fillup eofillup nodraw
+syn keyword metafunCommands dodraw enfill area addbackground shadedup
+syn keyword metafunCommands shadeddown shadedleft shadedright sortlist copylist
+syn keyword metafunCommands shapedlist listtocurves listtolines listsize listlast
+syn keyword metafunCommands uniquelist circularpath squarepath linearpath theoffset
+syn keyword metafunCommands texmode systemmode texvar texstr isarray
+syn keyword metafunCommands prefix dimension getmacro getdimen getcount
+syn keyword metafunCommands gettoks setmacro setdimen setcount settoks
+syn keyword metafunCommands setglobalmacro setglobaldimen setglobalcount setglobaltoks positionpath
+syn keyword metafunCommands positioncurve positionxy positionparagraph positioncolumn positionwhd
+syn keyword metafunCommands positionpage positionregion positionbox positionx positiony
+syn keyword metafunCommands positionanchor positioninregion positionatanchor positioncolumnbox overlaycolumnbox
+syn keyword metafunCommands positioncolumnatx getposboxes getmultipars getpospage getposparagraph
+syn keyword metafunCommands getposcolumn getposregion getposx getposy getposwidth
+syn keyword metafunCommands getposheight getposdepth getposleftskip getposrightskip getposhsize
+syn keyword metafunCommands getposparindent getposhangindent getposhangafter getposxy getposupperleft
+syn keyword metafunCommands getposlowerleft getposupperright getposlowerright getposllx getposlly
+syn keyword metafunCommands getposurx getposury wdpart htpart dppart
+syn keyword metafunCommands texvar texstr inpath pointof leftof
+syn keyword metafunCommands rightof utfnum utflen utfsub newhash
+syn keyword metafunCommands disposehash inhash tohash fromhash isarray
+syn keyword metafunCommands prefix isobject comment report lua
+syn keyword metafunCommands lualist mp MP luacall mirrored
+syn keyword metafunCommands mirroredabout xslanted yslanted scriptindex newscriptindex
+syn keyword metafunCommands newcolor newrgbcolor newcmykcolor newnumeric newboolean
+syn keyword metafunCommands newtransform newpath newpicture newstring newpair
+syn keyword metafunCommands mpvard mpvarn mpvars mpvar withtolerance
+syn keyword metafunCommands hatched withdashes processpath pencilled sortedintersectiontimes
+syn keyword metafunCommands intersectionpath firstintersectionpath secondintersectionpath intersectionsfound cutbeforefirst
+syn keyword metafunCommands cutafterfirst cutbeforelast cutafterlast xnormalized ynormalized
+syn keyword metafunCommands xynormalized phantom scrutinized
+syn keyword metafunInternals nocolormodel greycolormodel graycolormodel rgbcolormodel cmykcolormodel
+syn keyword metafunInternals shadefactor shadeoffset textextoffset textextanchor normaltransparent
+syn keyword metafunInternals multiplytransparent screentransparent overlaytransparent softlighttransparent hardlighttransparent
+syn keyword metafunInternals colordodgetransparent colorburntransparent darkentransparent lightentransparent differencetransparent
+syn keyword metafunInternals exclusiontransparent huetransparent saturationtransparent colortransparent luminositytransparent
+syn keyword metafunInternals ahvariant ahdimple ahfactor ahscale metapostversion
+syn keyword metafunInternals maxdimensions drawoptionsfactor dq sq crossingscale
+syn keyword metafunInternals crossingoption crossingdebug contextlmtxmode metafunversion minifunversion
+syn keyword metafunInternals getparameters presetparameters hasparameter hasoption getparameter
+syn keyword metafunInternals getparameterdefault getparametercount getmaxparametercount getparameterpath getparameterpen
+syn keyword metafunInternals getparametertext applyparameters mergeparameters pushparameters popparameters
+syn keyword metafunInternals setluaparameter definecolor record newrecord setrecord
+syn keyword metafunInternals getrecord cntrecord anchorxy anchorx anchory
+syn keyword metafunInternals anchorht anchordp anchorul anchorll anchorlr
+syn keyword metafunInternals anchorur localanchorbox localanchorcell localanchorspan anchorbox
+syn keyword metafunInternals anchorcell anchorspan matrixbox matrixcell matrixspan
+syn keyword metafunInternals pensilcolor pensilstep
diff --git a/runtime/syntax/shared/context-data-tex.vim b/runtime/syntax/shared/context-data-tex.vim
new file mode 100644
index 0000000..bb54d3c
--- /dev/null
+++ b/runtime/syntax/shared/context-data-tex.vim
@@ -0,0 +1,225 @@
+vim9script
+
+# Vim syntax file
+# Language: ConTeXt
+# Automatically generated by mtx-interface (2022-08-12 10:49)
+
+syn keyword texAleph Alephminorversion Alephrevision Alephversion contained
+syn keyword texEtex botmarks clubpenalties currentgrouplevel currentgrouptype currentifbranch contained
+syn keyword texEtex currentiflevel currentiftype detokenize dimexpr displaywidowpenalties contained
+syn keyword texEtex everyeof firstmarks fontchardp fontcharht fontcharic contained
+syn keyword texEtex fontcharwd glueexpr glueshrink glueshrinkorder gluestretch contained
+syn keyword texEtex gluestretchorder gluetomu ifcsname ifdefined iffontchar contained
+syn keyword texEtex interactionmode interlinepenalties lastlinefit lastnodetype marks contained
+syn keyword texEtex muexpr mutoglue numexpr pagediscards parshapedimen contained
+syn keyword texEtex parshapeindent parshapelength predisplaydirection protected savinghyphcodes contained
+syn keyword texEtex savingvdiscards scantokens showgroups showifs showtokens contained
+syn keyword texEtex splitbotmarks splitdiscards splitfirstmarks topmarks tracingassigns contained
+syn keyword texEtex tracinggroups tracingifs tracingnesting unexpanded unless contained
+syn keyword texEtex widowpenalties contained
+syn keyword texLuatex Uabove Uabovewithdelims Uatop Uatopwithdelims Uchar contained
+syn keyword texLuatex Udelcode Udelcodenum Udelimiter Udelimiterover Udelimiterunder contained
+syn keyword texLuatex Uhextensible Uleft Umathaccent Umathaccentbasedepth Umathaccentbaseheight contained
+syn keyword texLuatex Umathaccentbottomovershoot Umathaccentbottomshiftdown Umathaccentsuperscriptdrop Umathaccentsuperscriptpercent Umathaccenttopovershoot contained
+syn keyword texLuatex Umathaccenttopshiftup Umathaccentvariant Umathadapttoleft Umathadapttoright Umathaxis contained
+syn keyword texLuatex Umathbotaccentvariant Umathchar Umathcharclass Umathchardef Umathcharfam contained
+syn keyword texLuatex Umathcharnum Umathcharnumdef Umathcharslot Umathclass Umathcode contained
+syn keyword texLuatex Umathcodenum Umathconnectoroverlapmin Umathdegreevariant Umathdelimiterovervariant Umathdelimiterpercent contained
+syn keyword texLuatex Umathdelimitershortfall Umathdelimiterundervariant Umathdenominatorvariant Umathdict Umathdictdef contained
+syn keyword texLuatex Umathextrasubpreshift Umathextrasubprespace Umathextrasubshift Umathextrasubspace Umathextrasuppreshift contained
+syn keyword texLuatex Umathextrasupprespace Umathextrasupshift Umathextrasupspace Umathflattenedaccentbasedepth Umathflattenedaccentbaseheight contained
+syn keyword texLuatex Umathflattenedaccentbottomshiftdown Umathflattenedaccenttopshiftup Umathfractiondelsize Umathfractiondenomdown Umathfractiondenomvgap contained
+syn keyword texLuatex Umathfractionnumup Umathfractionnumvgap Umathfractionrule Umathfractionvariant Umathhextensiblevariant contained
+syn keyword texLuatex Umathlimitabovebgap Umathlimitabovekern Umathlimitabovevgap Umathlimitbelowbgap Umathlimitbelowkern contained
+syn keyword texLuatex Umathlimitbelowvgap Umathlimits Umathnoaxis Umathnolimits Umathnolimitsubfactor contained
+syn keyword texLuatex Umathnolimitsupfactor Umathnumeratorvariant Umathopenupdepth Umathopenupheight Umathoperatorsize contained
+syn keyword texLuatex Umathoverbarkern Umathoverbarrule Umathoverbarvgap Umathoverdelimiterbgap Umathoverdelimitervariant contained
+syn keyword texLuatex Umathoverdelimitervgap Umathoverlayaccentvariant Umathoverlinevariant Umathphantom Umathpresubshiftdistance contained
+syn keyword texLuatex Umathpresupshiftdistance Umathprimeraise Umathprimeraisecomposed Umathprimeshiftdrop Umathprimeshiftup contained
+syn keyword texLuatex Umathprimespaceafter Umathprimevariant Umathprimewidth Umathquad Umathradicaldegreeafter contained
+syn keyword texLuatex Umathradicaldegreebefore Umathradicaldegreeraise Umathradicalkern Umathradicalrule Umathradicalvariant contained
+syn keyword texLuatex Umathradicalvgap Umathruledepth Umathruleheight Umathskeweddelimitertolerance Umathskewedfractionhgap contained
+syn keyword texLuatex Umathskewedfractionvgap Umathsource Umathspaceafterscript Umathspacebeforescript Umathstackdenomdown contained
+syn keyword texLuatex Umathstacknumup Umathstackvariant Umathstackvgap Umathsubscriptvariant Umathsubshiftdistance contained
+syn keyword texLuatex Umathsubshiftdown Umathsubshiftdrop Umathsubsupshiftdown Umathsubsupvgap Umathsubtopmax contained
+syn keyword texLuatex Umathsupbottommin Umathsuperscriptvariant Umathsupshiftdistance Umathsupshiftdrop Umathsupshiftup contained
+syn keyword texLuatex Umathsupsubbottommax Umathtopaccentvariant Umathunderbarkern Umathunderbarrule Umathunderbarvgap contained
+syn keyword texLuatex Umathunderdelimiterbgap Umathunderdelimitervariant Umathunderdelimitervgap Umathunderlinevariant Umathuseaxis contained
+syn keyword texLuatex Umathvextensiblevariant Umathvoid Umathxscale Umathyscale Umiddle contained
+syn keyword texLuatex Unosubprescript Unosubscript Unosuperprescript Unosuperscript Uoperator contained
+syn keyword texLuatex Uover Uoverdelimiter Uoverwithdelims Uprimescript Uradical contained
+syn keyword texLuatex Uright Uroot Ushiftedsubprescript Ushiftedsubscript Ushiftedsuperprescript contained
+syn keyword texLuatex Ushiftedsuperscript Uskewed Uskewedwithdelims Ustack Ustartdisplaymath contained
+syn keyword texLuatex Ustartmath Ustartmathmode Ustopdisplaymath Ustopmath Ustopmathmode contained
+syn keyword texLuatex Ustyle Usubprescript Usubscript Usuperprescript Usuperscript contained
+syn keyword texLuatex Uunderdelimiter Uvextensible adjustspacing adjustspacingshrink adjustspacingstep contained
+syn keyword texLuatex adjustspacingstretch afterassigned aftergrouped aliased alignmark contained
+syn keyword texLuatex alignmentcellsource alignmentwrapsource aligntab allcrampedstyles alldisplaystyles contained
+syn keyword texLuatex allmathstyles allscriptscriptstyles allscriptstyles allsplitstyles alltextstyles contained
+syn keyword texLuatex alluncrampedstyles atendofgroup atendofgrouped attribute attributedef contained
+syn keyword texLuatex automaticdiscretionary automatichyphenpenalty automigrationmode autoparagraphmode begincsname contained
+syn keyword texLuatex beginlocalcontrol beginmathgroup beginsimplegroup boundary boxadapt contained
+syn keyword texLuatex boxanchor boxanchors boxattribute boxdirection boxfreeze contained
+syn keyword texLuatex boxgeometry boxorientation boxrepack boxshift boxsource contained
+syn keyword texLuatex boxtarget boxtotal boxxmove boxxoffset boxymove contained
+syn keyword texLuatex boxyoffset catcodetable clearmarks copymathatomrule copymathparent contained
+syn keyword texLuatex copymathspacing crampeddisplaystyle crampedscriptscriptstyle crampedscriptstyle crampedtextstyle contained
+syn keyword texLuatex csstring currentloopiterator currentloopnesting currentmarks defcsname contained
+syn keyword texLuatex detokenized dimensiondef dimexpression directlua edefcsname contained
+syn keyword texLuatex efcode endlocalcontrol endmathgroup endsimplegroup enforced contained
+syn keyword texLuatex etoks etoksapp etokspre everybeforepar everymathatom contained
+syn keyword texLuatex everytab exceptionpenalty expand expandafterpars expandafterspaces contained
+syn keyword texLuatex expandcstoken expanded expandedafter expandedloop expandtoken contained
+syn keyword texLuatex explicitdiscretionary explicithyphenpenalty firstvalidlanguage flushmarks fontcharta contained
+syn keyword texLuatex fontid fontmathcontrol fontspecdef fontspecid fontspecifiedsize contained
+syn keyword texLuatex fontspecscale fontspecxscale fontspecyscale fonttextcontrol formatname contained
+syn keyword texLuatex frozen futurecsname futuredef futureexpand futureexpandis contained
+syn keyword texLuatex futureexpandisap gdefcsname gleaders glet gletcsname contained
+syn keyword texLuatex glettonothing gluespecdef glyphdatafield glyphoptions glyphscale contained
+syn keyword texLuatex glyphscriptfield glyphscriptscale glyphscriptscriptscale glyphstatefield glyphtextscale contained
+syn keyword texLuatex glyphxoffset glyphxscale glyphxscaled glyphyoffset glyphyscale contained
+syn keyword texLuatex glyphyscaled gtoksapp gtokspre hccode hjcode contained
+syn keyword texLuatex hpack hyphenationmin hyphenationmode ifabsdim ifabsnum contained
+syn keyword texLuatex ifarguments ifboolean ifchkdim ifchknum ifcmpdim contained
+syn keyword texLuatex ifcmpnum ifcondition ifcstok ifdimexpression ifdimval contained
+syn keyword texLuatex ifempty ifflags ifhaschar ifhastok ifhastoks contained
+syn keyword texLuatex ifhasxtoks ifincsname ifinsert ifmathparameter ifmathstyle contained
+syn keyword texLuatex ifnumexpression ifnumval ifparameter ifparameters ifrelax contained
+syn keyword texLuatex iftok ignorearguments ignorepars immediate immutable contained
+syn keyword texLuatex indexofcharacter indexofregister inherited initcatcodetable insertbox contained
+syn keyword texLuatex insertcopy insertdepth insertdistance insertheight insertheights contained
+syn keyword texLuatex insertlimit insertmaxdepth insertmode insertmultiplier insertpenalty contained
+syn keyword texLuatex insertprogress insertstorage insertstoring insertunbox insertuncopy contained
+syn keyword texLuatex insertwidth instance integerdef lastarguments lastatomclass contained
+syn keyword texLuatex lastboundary lastchkdim lastchknum lastleftclass lastloopiterator contained
+syn keyword texLuatex lastnamedcs lastnodesubtype lastpageextra lastparcontext lastrightclass contained
+syn keyword texLuatex leftmarginkern letcharcode letcsname letfrozen letmathatomrule contained
+syn keyword texLuatex letmathparent letmathspacing letprotected lettonothing linebreakcriterium contained
+syn keyword texLuatex linedirection localbrokenpenalty localcontrol localcontrolled localcontrolledloop contained
+syn keyword texLuatex localinterlinepenalty localleftbox localleftboxbox localmiddlebox localmiddleboxbox contained
+syn keyword texLuatex localrightbox localrightboxbox lpcode luabytecode luabytecodecall contained
+syn keyword texLuatex luacopyinputnodes luadef luaescapestring luafunction luafunctioncall contained
+syn keyword texLuatex luatexbanner luatexrevision luatexversion mathaccent mathatom contained
+syn keyword texLuatex mathatomglue mathatomskip mathbackwardpenalties mathbeginclass mathcheckfencesmode contained
+syn keyword texLuatex mathdictgroup mathdictproperties mathdirection mathdisplaymode mathdisplayskipmode contained
+syn keyword texLuatex mathdoublescriptmode mathendclass matheqnogapstep mathfenced mathfontcontrol contained
+syn keyword texLuatex mathforwardpenalties mathfrac mathghost mathgluemode mathgroupingmode contained
+syn keyword texLuatex mathinlinemainstyle mathleftclass mathlimitsmode mathmiddle mathnolimitsmode contained
+syn keyword texLuatex mathpenaltiesmode mathrad mathrightclass mathrulesfam mathrulesmode contained
+syn keyword texLuatex mathscale mathscriptsmode mathslackmode mathspacingmode mathstackstyle contained
+syn keyword texLuatex mathstyle mathstylefontid mathsurroundmode mathsurroundskip maththreshold contained
+syn keyword texLuatex mugluespecdef mutable noaligned noatomruling noboundary contained
+syn keyword texLuatex nohrule norelax normalizelinemode normalizeparmode nospaces contained
+syn keyword texLuatex novrule numericscale numexpression orelse orphanpenalties contained
+syn keyword texLuatex orphanpenalty orunless outputbox overloaded overloadmode contained
+syn keyword texLuatex pageboundary pageextragoal pagevsize parametercount parametermark contained
+syn keyword texLuatex parattribute pardirection permanent pettymuskip postexhyphenchar contained
+syn keyword texLuatex posthyphenchar postinlinepenalty prebinoppenalty predisplaygapfactor preexhyphenchar contained
+syn keyword texLuatex prehyphenchar preinlinepenalty prerelpenalty protrudechars protrusionboundary contained
+syn keyword texLuatex pxdimen quitloop quitvmode resetmathspacing retokenized contained
+syn keyword texLuatex rightmarginkern rpcode savecatcodetable scaledemwidth scaledexheight contained
+syn keyword texLuatex scaledextraspace scaledinterwordshrink scaledinterwordspace scaledinterwordstretch scaledmathstyle contained
+syn keyword texLuatex scaledslantperpoint scantextokens semiexpand semiexpanded semiprotected contained
+syn keyword texLuatex setdefaultmathcodes setfontid setmathatomrule setmathdisplaypostpenalty setmathdisplayprepenalty contained
+syn keyword texLuatex setmathignore setmathoptions setmathpostpenalty setmathprepenalty setmathspacing contained
+syn keyword texLuatex shapingpenaltiesmode shapingpenalty skewed skewedwithdelims snapshotpar contained
+syn keyword texLuatex supmarkmode swapcsvalues tabsize textdirection thewithoutunit contained
+syn keyword texLuatex tinymuskip todimension tohexadecimal tointeger tokenized contained
+syn keyword texLuatex toksapp tokspre tolerant tomathstyle toscaled contained
+syn keyword texLuatex tosparsedimension tosparsescaled tpack tracingadjusts tracingalignments contained
+syn keyword texLuatex tracingexpressions tracingfonts tracingfullboxes tracinghyphenation tracinginserts contained
+syn keyword texLuatex tracinglevels tracingmarks tracingmath tracingnodes tracingpenalties contained
+syn keyword texLuatex uleaders undent unexpandedloop unletfrozen unletprotected contained
+syn keyword texLuatex untraced vpack wordboundary wrapuppar xdefcsname contained
+syn keyword texLuatex xtoks xtoksapp xtokspre contained
+syn keyword texOmega Omegaminorversion Omegarevision Omegaversion contained
+syn keyword texPdftex ifpdfabsdim ifpdfabsnum ifpdfprimitive pdfadjustspacing pdfannot contained
+syn keyword texPdftex pdfcatalog pdfcolorstack pdfcolorstackinit pdfcompresslevel pdfcopyfont contained
+syn keyword texPdftex pdfcreationdate pdfdecimaldigits pdfdest pdfdestmargin pdfdraftmode contained
+syn keyword texPdftex pdfeachlinedepth pdfeachlineheight pdfendlink pdfendthread pdffirstlineheight contained
+syn keyword texPdftex pdffontattr pdffontexpand pdffontname pdffontobjnum pdffontsize contained
+syn keyword texPdftex pdfgamma pdfgentounicode pdfglyphtounicode pdfhorigin pdfignoreddimen contained
+syn keyword texPdftex pdfignoreunknownimages pdfimageaddfilename pdfimageapplygamma pdfimagegamma pdfimagehicolor contained
+syn keyword texPdftex pdfimageresolution pdfincludechars pdfinclusioncopyfonts pdfinclusionerrorlevel pdfinfo contained
+syn keyword texPdftex pdfinfoomitdate pdfinsertht pdflastannot pdflastlinedepth pdflastlink contained
+syn keyword texPdftex pdflastobj pdflastxform pdflastximage pdflastximagepages pdflastxpos contained
+syn keyword texPdftex pdflastypos pdflinkmargin pdfliteral pdfmajorversion pdfmapfile contained
+syn keyword texPdftex pdfmapline pdfminorversion pdfnames pdfnoligatures pdfnormaldeviate contained
+syn keyword texPdftex pdfobj pdfobjcompresslevel pdfomitcharset pdfomitcidset pdfoutline contained
+syn keyword texPdftex pdfoutput pdfpageattr pdfpagebox pdfpageheight pdfpageref contained
+syn keyword texPdftex pdfpageresources pdfpagesattr pdfpagewidth pdfpkfixeddpi pdfpkmode contained
+syn keyword texPdftex pdfpkresolution pdfprimitive pdfprotrudechars pdfpxdimen pdfrandomseed contained
+syn keyword texPdftex pdfrecompress pdfrefobj pdfrefxform pdfrefximage pdfreplacefont contained
+syn keyword texPdftex pdfrestore pdfretval pdfsave pdfsavepos pdfsetmatrix contained
+syn keyword texPdftex pdfsetrandomseed pdfstartlink pdfstartthread pdfsuppressoptionalinfo pdfsuppressptexinfo contained
+syn keyword texPdftex pdftexbanner pdftexrevision pdftexversion pdfthread pdfthreadmargin contained
+syn keyword texPdftex pdftracingfonts pdftrailer pdftrailerid pdfuniformdeviate pdfuniqueresname contained
+syn keyword texPdftex pdfvorigin pdfxform pdfxformattr pdfxformmargin pdfxformname contained
+syn keyword texPdftex pdfxformresources pdfximage contained
+syn keyword texTex - / above abovedisplayshortskip contained
+syn keyword texTex abovedisplayskip abovewithdelims accent adjdemerits advance contained
+syn keyword texTex afterassignment aftergroup aligncontent atop atopwithdelims contained
+syn keyword texTex badness baselineskip batchmode begingroup belowdisplayshortskip contained
+syn keyword texTex belowdisplayskip binoppenalty botmark box boxmaxdepth contained
+syn keyword texTex brokenpenalty catcode char chardef cleaders contained
+syn keyword texTex clubpenalty copy count countdef cr contained
+syn keyword texTex crcr csname day deadcycles def contained
+syn keyword texTex defaulthyphenchar defaultskewchar delcode delimiter delimiterfactor contained
+syn keyword texTex delimitershortfall dimen dimendef discretionary displayindent contained
+syn keyword texTex displaylimits displaystyle displaywidowpenalty displaywidth divide contained
+syn keyword texTex doublehyphendemerits dp dump edef else contained
+syn keyword texTex emergencystretch end endcsname endgroup endinput contained
+syn keyword texTex endlinechar eqno errhelp errmessage errorcontextlines contained
+syn keyword texTex errorstopmode escapechar everycr everydisplay everyhbox contained
+syn keyword texTex everyjob everymath everypar everyvbox exhyphenchar contained
+syn keyword texTex exhyphenpenalty expandafter fam fi finalhyphendemerits contained
+syn keyword texTex firstmark floatingpenalty font fontdimen fontname contained
+syn keyword texTex fontspecifiedname futurelet gdef global globaldefs contained
+syn keyword texTex glyph halign hangafter hangindent hbadness contained
+syn keyword texTex hbox hfil hfill hfilneg hfuzz contained
+syn keyword texTex holdinginserts holdingmigrations hrule hsize hskip contained
+syn keyword texTex hss ht hyphenation hyphenchar hyphenpenalty contained
+syn keyword texTex if ifcase ifcat ifdim iffalse contained
+syn keyword texTex ifhbox ifhmode ifinner ifmmode ifnum contained
+syn keyword texTex ifodd iftrue ifvbox ifvmode ifvoid contained
+syn keyword texTex ifx ignorespaces indent input inputlineno contained
+syn keyword texTex insert insertpenalties interlinepenalty jobname kern contained
+syn keyword texTex language lastbox lastkern lastpenalty lastskip contained
+syn keyword texTex lccode leaders left lefthyphenmin leftskip contained
+syn keyword texTex leqno let limits linepenalty lineskip contained
+syn keyword texTex lineskiplimit long looseness lower lowercase contained
+syn keyword texTex mark mathbin mathchar mathchardef mathchoice contained
+syn keyword texTex mathclose mathcode mathinner mathop mathopen contained
+syn keyword texTex mathord mathpunct mathrel mathsurround maxdeadcycles contained
+syn keyword texTex maxdepth meaning meaningasis meaningfull meaningless contained
+syn keyword texTex medmuskip message middle mkern month contained
+syn keyword texTex moveleft moveright mskip multiply muskip contained
+syn keyword texTex muskipdef newlinechar noalign noexpand noindent contained
+syn keyword texTex nolimits nonscript nonstopmode nulldelimiterspace nullfont contained
+syn keyword texTex number omit or outer output contained
+syn keyword texTex outputpenalty over overfullrule overline overshoot contained
+syn keyword texTex overwithdelims pagedepth pagefilllstretch pagefillstretch pagefilstretch contained
+syn keyword texTex pagegoal pageshrink pagestretch pagetotal par contained
+syn keyword texTex parfillleftskip parfillskip parindent parinitleftskip parinitrightskip contained
+syn keyword texTex parshape parskip patterns pausing penalty contained
+syn keyword texTex postdisplaypenalty predisplaypenalty predisplaysize pretolerance prevdepth contained
+syn keyword texTex prevgraf radical raise relax relpenalty contained
+syn keyword texTex right righthyphenmin rightskip romannumeral scaledfontdimen contained
+syn keyword texTex scriptfont scriptscriptfont scriptscriptstyle scriptspace scriptstyle contained
+syn keyword texTex scrollmode setbox setlanguage sfcode shipout contained
+syn keyword texTex show showbox showboxbreadth showboxdepth showlists contained
+syn keyword texTex shownodedetails showthe skewchar skip skipdef contained
+syn keyword texTex spacefactor spaceskip span splitbotmark splitfirstmark contained
+syn keyword texTex splitmaxdepth splittopskip srule string tabskip contained
+syn keyword texTex textfont textstyle the thickmuskip thinmuskip contained
+syn keyword texTex time toks toksdef tolerance topmark contained
+syn keyword texTex topskip tracingcommands tracinglostchars tracingmacros tracingonline contained
+syn keyword texTex tracingoutput tracingpages tracingparagraphs tracingrestores tracingstats contained
+syn keyword texTex uccode uchyph unboundary underline unhbox contained
+syn keyword texTex unhcopy unhpack unkern unpenalty unskip contained
+syn keyword texTex unvbox unvcopy unvpack uppercase vadjust contained
+syn keyword texTex valign vbadness vbox vcenter vfil contained
+syn keyword texTex vfill vfilneg vfuzz vrule vsize contained
+syn keyword texTex vskip vsplit vss vtop wd contained
+syn keyword texTex widowpenalty xdef xleaders xspaceskip year contained
+syn keyword texXetex XeTeXversion contained
diff --git a/runtime/syntax/shared/hgcommitDiff.vim b/runtime/syntax/shared/hgcommitDiff.vim
new file mode 100644
index 0000000..949cdf0
--- /dev/null
+++ b/runtime/syntax/shared/hgcommitDiff.vim
@@ -0,0 +1,390 @@
+" Vim syntax file
+" Language: Sapling / Mecurial Diff (context or unified)
+" Maintainer: Max Coplan <mchcopl@gmail.com>
+" Translations by Jakson Alves de Aquino.
+" Last Change: 2022-12-08
+" Copied from: runtime/syntax/diff.vim
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+scriptencoding utf-8
+
+syn match hgDiffOnly "^\%(SL\|HG\): Only in .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Files .* and .* are identical$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Files .* and .* differ$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binary files .* and .* differ$"
+syn match hgDiffIsA "^\%(SL\|HG\): File .* is a .* while file .* is a .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ No newline at end of file .*"
+syn match hgDiffCommon "^\%(SL\|HG\): Common subdirectories: .*"
+
+" Disable the translations by setting diff_translations to zero.
+if !exists("diff_translations") || diff_translations
+
+" ca
+syn match hgDiffOnly "^\%(SL\|HG\): Només a .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Els fitxers .* i .* són idèntics$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Els fitxers .* i .* difereixen$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Els fitxers .* i .* difereixen$"
+syn match hgDiffIsA "^\%(SL\|HG\): El fitxer .* és un .* mentre que el fitxer .* és un .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ No hi ha cap caràcter de salt de línia al final del fitxer"
+syn match hgDiffCommon "^\%(SL\|HG\): Subdirectoris comuns: .* i .*"
+
+" cs
+syn match hgDiffOnly "^\%(SL\|HG\): Pouze v .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Soubory .* a .* jsou identické$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Soubory .* a .* jsou různé$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binární soubory .* a .* jsou rozdílné$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Soubory .* a .* jsou různé$"
+syn match hgDiffIsA "^\%(SL\|HG\): Soubor .* je .* pokud soubor .* je .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Chybí znak konce řádku na konci souboru"
+syn match hgDiffCommon "^\%(SL\|HG\): Společné podadresáře: .* a .*"
+
+" da
+syn match hgDiffOnly "^\%(SL\|HG\): Kun i .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Filerne .* og .* er identiske$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Filerne .* og .* er forskellige$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binære filer .* og .* er forskellige$"
+syn match hgDiffIsA "^\%(SL\|HG\): Filen .* er en .* mens filen .* er en .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Intet linjeskift ved filafslutning"
+syn match hgDiffCommon "^\%(SL\|HG\): Identiske underkataloger: .* og .*"
+
+" de
+syn match hgDiffOnly "^\%(SL\|HG\): Nur in .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Dateien .* und .* sind identisch.$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Dateien .* und .* sind verschieden.$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binärdateien .* and .* sind verschieden.$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binärdateien .* und .* sind verschieden.$"
+syn match hgDiffIsA "^\%(SL\|HG\): Datei .* ist ein .* während Datei .* ein .* ist.$"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Kein Zeilenumbruch am Dateiende."
+syn match hgDiffCommon "^\%(SL\|HG\): Gemeinsame Unterverzeichnisse: .* und .*.$"
+
+" el
+syn match hgDiffOnly "^\%(SL\|HG\): Μόνο στο .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Τα αρχεία .* καί .* είναι πανομοιότυπα$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Τα αρχεία .* και .* διαφέρουν$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Τα αρχεία .* και .* διαφέρουν$"
+syn match hgDiffIsA "^\%(SL\|HG\): Το αρχείο .* είναι .* ενώ το αρχείο .* είναι .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Δεν υπάρχει χαρακτήρας νέας γραμμής στο τέλος του αρχείου"
+syn match hgDiffCommon "^\%(SL\|HG\): Οι υποκατάλογοι .* και .* είναι ταυτόσημοι$"
+
+" eo
+syn match hgDiffOnly "^\%(SL\|HG\): Nur en .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Dosieroj .* kaj .* estas samaj$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Dosieroj .* kaj .* estas malsamaj$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Dosieroj .* kaj .* estas malsamaj$"
+syn match hgDiffIsA "^\%(SL\|HG\): Dosiero .* estas .*, dum dosiero .* estas .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Mankas linifino ĉe fino de dosiero"
+syn match hgDiffCommon "^\%(SL\|HG\): Komunaj subdosierujoj: .* kaj .*"
+
+" es
+syn match hgDiffOnly "^\%(SL\|HG\): Sólo en .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Los ficheros .* y .* son idénticos$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Los ficheros .* y .* son distintos$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Los ficheros binarios .* y .* son distintos$"
+syn match hgDiffIsA "^\%(SL\|HG\): El fichero .* es un .* mientras que el .* es un .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ No hay ningún carácter de nueva línea al final del fichero"
+syn match hgDiffCommon "^\%(SL\|HG\): Subdirectorios comunes: .* y .*"
+
+" fi
+syn match hgDiffOnly "^\%(SL\|HG\): Vain hakemistossa .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Tiedostot .* ja .* ovat identtiset$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Tiedostot .* ja .* eroavat$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binääritiedostot .* ja .* eroavat$"
+syn match hgDiffIsA "^\%(SL\|HG\): Tiedosto .* on .*, kun taas tiedosto .* on .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Ei rivinvaihtoa tiedoston lopussa"
+syn match hgDiffCommon "^\%(SL\|HG\): Yhteiset alihakemistot: .* ja .*"
+
+" fr
+syn match hgDiffOnly "^\%(SL\|HG\): Seulement dans .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Les fichiers .* et .* sont identiques.*"
+syn match hgDiffDiffer "^\%(SL\|HG\): Les fichiers .* et .* sont différents.*"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Les fichiers binaires .* et .* sont différents.*"
+syn match hgDiffIsA "^\%(SL\|HG\): Le fichier .* est un .* alors que le fichier .* est un .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Pas de fin de ligne à la fin du fichier.*"
+syn match hgDiffCommon "^\%(SL\|HG\): Les sous-répertoires .* et .* sont identiques.*"
+
+" ga
+syn match hgDiffOnly "^\%(SL\|HG\): I .* amháin: .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Is comhionann iad na comhaid .* agus .*"
+syn match hgDiffDiffer "^\%(SL\|HG\): Tá difríocht idir na comhaid .* agus .*"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Tá difríocht idir na comhaid .* agus .*"
+syn match hgDiffIsA "^\%(SL\|HG\): Tá comhad .* ina .* ach tá comhad .* ina .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Gan líne nua ag an chomhadchríoch"
+syn match hgDiffCommon "^\%(SL\|HG\): Fochomhadlanna i gcoitianta: .* agus .*"
+
+" gl
+syn match hgDiffOnly "^\%(SL\|HG\): Só en .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Os ficheiros .* e .* son idénticos$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Os ficheiros .* e .* son diferentes$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Os ficheiros binarios .* e .* son diferentes$"
+syn match hgDiffIsA "^\%(SL\|HG\): O ficheiro .* é un .* mentres que o ficheiro .* é un .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Non hai un salto de liña na fin da liña"
+syn match hgDiffCommon "^\%(SL\|HG\): Subdirectorios comúns: .* e .*"
+
+" he
+" ^\%(SL\|HG\): .* are expansive patterns for long lines, so disabled unless we can match
+" some specific hebrew chars
+if search('\%u05d5\|\%u05d1', 'nw', '', 100)
+ syn match hgDiffOnly "^\%(SL\|HG\): .*-ב קר אצמנ .*"
+ syn match hgDiffIdentical "^\%(SL\|HG\): םיהז םניה .*-ו .* םיצבקה$"
+ syn match hgDiffDiffer "^\%(SL\|HG\): הזמ הז םינוש `.*'-ו `.*' םיצבקה$"
+ syn match hgDiffBDiffer "^\%(SL\|HG\): הזמ הז םינוש `.*'-ו `.*' םיירניב םיצבק$"
+ syn match hgDiffIsA "^\%(SL\|HG\): .* .*-ל .* .* תוושהל ןתינ אל$"
+ syn match hgDiffNoEOL "^\%(SL\|HG\): \\ ץבוקה ףוסב השד.-הרוש ות רס."
+ syn match hgDiffCommon "^\%(SL\|HG\): .*-ו .* :תוהז תויקית-תת$"
+endif
+
+" hr
+syn match hgDiffOnly "^\%(SL\|HG\): Samo u .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Datoteke .* i .* su identične$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Datoteke .* i .* se razlikuju$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binarne datoteke .* i .* se razlikuju$"
+syn match hgDiffIsA "^\%(SL\|HG\): Datoteka .* je .*, a datoteka .* je .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Nema novog retka na kraju datoteke"
+syn match hgDiffCommon "^\%(SL\|HG\): Uobičajeni poddirektoriji: .* i .*"
+
+" hu
+syn match hgDiffOnly "^\%(SL\|HG\): Csak .* -ben: .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): .* és .* fájlok azonosak$"
+syn match hgDiffDiffer "^\%(SL\|HG\): A(z) .* és a(z) .* fájlok különböznek$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): A(z) .* és a(z) .* fájlok különböznek$"
+syn match hgDiffIsA "^\%(SL\|HG\): A(z) .* fájl egy .*, viszont a(z) .* fájl egy .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Nincs újsor a fájl végén"
+syn match hgDiffCommon "^\%(SL\|HG\): Közös alkönyvtárak: .* és .*"
+
+" id
+syn match hgDiffOnly "^\%(SL\|HG\): Hanya dalam .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): File .* dan .* identik$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Berkas .* dan .* berbeda$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): File biner .* dan .* berbeda$"
+syn match hgDiffIsA "^\%(SL\|HG\): File .* adalah .* sementara file .* adalah .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Tidak ada baris-baru di akhir dari berkas"
+syn match hgDiffCommon "^\%(SL\|HG\): Subdirektori sama: .* dan .*"
+
+" it
+syn match hgDiffOnly "^\%(SL\|HG\): Solo in .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): I file .* e .* sono identici$"
+syn match hgDiffDiffer "^\%(SL\|HG\): I file .* e .* sono diversi$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): I file .* e .* sono diversi$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): I file binari .* e .* sono diversi$"
+syn match hgDiffIsA "^\%(SL\|HG\): File .* è un .* mentre file .* è un .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Manca newline alla fine del file"
+syn match hgDiffCommon "^\%(SL\|HG\): Sottodirectory in comune: .* e .*"
+
+" ja
+syn match hgDiffOnly "^\%(SL\|HG\): .*だけに発見: .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): ファイル.*と.*は同一$"
+syn match hgDiffDiffer "^\%(SL\|HG\): ファイル.*と.*は違います$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): バイナリー・ファイル.*と.*は違います$"
+syn match hgDiffIsA "^\%(SL\|HG\): ファイル.*は.*、ファイル.*は.*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ ファイル末尾に改行がありません"
+syn match hgDiffCommon "^\%(SL\|HG\): 共通の下位ディレクトリー: .*と.*"
+
+" ja DiffUtils 3.3
+syn match hgDiffOnly "^\%(SL\|HG\): .* のみに存在: .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): ファイル .* と .* は同一です$"
+syn match hgDiffDiffer "^\%(SL\|HG\): ファイル .* と .* は異なります$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): バイナリーファイル .* と.* は異なります$"
+syn match hgDiffIsA "^\%(SL\|HG\): ファイル .* は .* です。一方、ファイル .* は .* です$"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ ファイル末尾に改行がありません"
+syn match hgDiffCommon "^\%(SL\|HG\): 共通のサブディレクトリー: .* と .*"
+
+" lv
+syn match hgDiffOnly "^\%(SL\|HG\): Tikai iekš .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Fails .* un .* ir identiski$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Faili .* un .* atšķiras$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Faili .* un .* atšķiras$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binārie faili .* un .* atšķiras$"
+syn match hgDiffIsA "^\%(SL\|HG\): Fails .* ir .* kamēr fails .* ir .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Nav jaunu rindu faila beigās"
+syn match hgDiffCommon "^\%(SL\|HG\): Kopējās apakšdirektorijas: .* un .*"
+
+" ms
+syn match hgDiffOnly "^\%(SL\|HG\): Hanya dalam .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Fail .* dan .* adalah serupa$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Fail .* dan .* berbeza$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Fail .* dan .* berbeza$"
+syn match hgDiffIsA "^\%(SL\|HG\): Fail .* adalah .* manakala fail .* adalah .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Tiada baris baru pada penghujung fail"
+syn match hgDiffCommon "^\%(SL\|HG\): Subdirektori umum: .* dan .*"
+
+" nl
+syn match hgDiffOnly "^\%(SL\|HG\): Alleen in .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Bestanden .* en .* zijn identiek$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Bestanden .* en .* zijn verschillend$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Bestanden .* en .* zijn verschillend$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binaire bestanden .* en .* zijn verschillend$"
+syn match hgDiffIsA "^\%(SL\|HG\): Bestand .* is een .* terwijl bestand .* een .* is$"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Geen regeleindeteken (LF) aan einde van bestand"
+syn match hgDiffCommon "^\%(SL\|HG\): Gemeenschappelijke submappen: .* en .*"
+
+" pl
+syn match hgDiffOnly "^\%(SL\|HG\): Tylko w .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Pliki .* i .* są identyczne$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Pliki .* i .* różnią się$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Pliki .* i .* różnią się$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Binarne pliki .* i .* różnią się$"
+syn match hgDiffIsA "^\%(SL\|HG\): Plik .* jest .*, podczas gdy plik .* jest .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Brak znaku nowej linii na końcu pliku"
+syn match hgDiffCommon "^\%(SL\|HG\): Wspólne podkatalogi: .* i .*"
+
+" pt_BR
+syn match hgDiffOnly "^\%(SL\|HG\): Somente em .*"
+syn match hgDiffOnly "^\%(SL\|HG\): Apenas em .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Os aquivos .* e .* são idênticos$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Os arquivos .* e .* são diferentes$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Os arquivos binários .* e .* são diferentes$"
+syn match hgDiffIsA "^\%(SL\|HG\): O arquivo .* é .* enquanto o arquivo .* é .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Falta o caracter nova linha no final do arquivo"
+syn match hgDiffCommon "^\%(SL\|HG\): Subdiretórios idênticos: .* e .*"
+
+" ro
+syn match hgDiffOnly "^\%(SL\|HG\): Doar în .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Fişierele .* şi .* sunt identice$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Fişierele .* şi .* diferă$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Fişierele binare .* şi .* diferă$"
+syn match hgDiffIsA "^\%(SL\|HG\): Fişierul .* este un .* pe când fişierul .* este un .*.$"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Nici un element de linie nouă la sfârşitul fişierului"
+syn match hgDiffCommon "^\%(SL\|HG\): Subdirectoare comune: .* şi .*.$"
+
+" ru
+syn match hgDiffOnly "^\%(SL\|HG\): Только в .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Файлы .* и .* идентичны$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Файлы .* и .* различаются$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Файлы .* и .* различаются$"
+syn match hgDiffIsA "^\%(SL\|HG\): Файл .* это .*, тогда как файл .* -- .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ В конце файла нет новой строки"
+syn match hgDiffCommon "^\%(SL\|HG\): Общие подкаталоги: .* и .*"
+
+" sr
+syn match hgDiffOnly "^\%(SL\|HG\): Само у .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Датотеке „.*“ и „.*“ се подударају$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Датотеке .* и .* различите$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Бинарне датотеке .* и .* различите$"
+syn match hgDiffIsA "^\%(SL\|HG\): Датотека „.*“ је „.*“ док је датотека „.*“ „.*“$"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Без новог реда на крају датотеке"
+syn match hgDiffCommon "^\%(SL\|HG\): Заједнички поддиректоријуми: .* и .*"
+
+" sv
+syn match hgDiffOnly "^\%(SL\|HG\): Endast i .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Filerna .* och .* är lika$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Filerna .* och .* skiljer$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Filerna .* och .* skiljer$"
+syn match hgDiffIsA "^\%(SL\|HG\): Fil .* är en .* medan fil .* är en .*"
+syn match hgDiffBDiffer "^\%(SL\|HG\): De binära filerna .* och .* skiljer$"
+syn match hgDiffIsA "^\%(SL\|HG\): Filen .* är .* medan filen .* är .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Ingen nyrad vid filslut"
+syn match hgDiffCommon "^\%(SL\|HG\): Lika underkataloger: .* och .*"
+
+" tr
+syn match hgDiffOnly "^\%(SL\|HG\): Yalnızca .*'da: .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): .* ve .* dosyaları birbirinin aynı$"
+syn match hgDiffDiffer "^\%(SL\|HG\): .* ve .* dosyaları birbirinden farklı$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): .* ve .* dosyaları birbirinden farklı$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): İkili .* ve .* birbirinden farklı$"
+syn match hgDiffIsA "^\%(SL\|HG\): .* dosyası, bir .*, halbuki .* dosyası bir .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Dosya sonunda yenisatır yok."
+syn match hgDiffCommon "^\%(SL\|HG\): Ortak alt dizinler: .* ve .*"
+
+" uk
+syn match hgDiffOnly "^\%(SL\|HG\): Лише у .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Файли .* та .* ідентичні$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Файли .* та .* відрізняються$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Файли .* та .* відрізняються$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Двійкові файли .* та .* відрізняються$"
+syn match hgDiffIsA "^\%(SL\|HG\): Файл .* це .*, тоді як файл .* -- .*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Наприкінці файлу немає нового рядка"
+syn match hgDiffCommon "^\%(SL\|HG\): Спільні підкаталоги: .* та .*"
+
+" vi
+syn match hgDiffOnly "^\%(SL\|HG\): Chỉ trong .*"
+syn match hgDiffIdentical "^\%(SL\|HG\): Hai tập tin .* và .* là bằng nhau.$"
+syn match hgDiffIdentical "^\%(SL\|HG\): Cả .* và .* là cùng một tập tin$"
+syn match hgDiffDiffer "^\%(SL\|HG\): Hai tập tin .* và .* là khác nhau.$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Hai tập tin nhị phân .* và .* khác nhau$"
+syn match hgDiffIsA "^\%(SL\|HG\): Tập tin .* là một .* trong khi tập tin .* là một .*.$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): Hai tập tin .* và .* là khác nhau.$"
+syn match hgDiffIsA "^\%(SL\|HG\): Tập tin .* là một .* còn tập tin .* là một .*.$"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ Không có ký tự dòng mới tại kêt thức tập tin."
+syn match hgDiffCommon "^\%(SL\|HG\): Thư mục con chung: .* và .*"
+
+" zh_CN
+syn match hgDiffOnly "^\%(SL\|HG\): 只在 .* 存在:.*"
+syn match hgDiffIdentical "^\%(SL\|HG\): 檔案 .* 和 .* 相同$"
+syn match hgDiffDiffer "^\%(SL\|HG\): 文件 .* 和 .* 不同$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): 文件 .* 和 .* 不同$"
+syn match hgDiffIsA "^\%(SL\|HG\): 文件 .* 是.*而文件 .* 是.*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ 文件尾没有 newline 字符"
+syn match hgDiffCommon "^\%(SL\|HG\): .* 和 .* 有共同的子目录$"
+
+" zh_TW
+syn match hgDiffOnly "^\%(SL\|HG\): 只在 .* 存在:.*"
+syn match hgDiffIdentical "^\%(SL\|HG\): 檔案 .* 和 .* 相同$"
+syn match hgDiffDiffer "^\%(SL\|HG\): 檔案 .* 與 .* 不同$"
+syn match hgDiffBDiffer "^\%(SL\|HG\): 二元碼檔 .* 與 .* 不同$"
+syn match hgDiffIsA "^\%(SL\|HG\): 檔案 .* 是.*而檔案 .* 是.*"
+syn match hgDiffNoEOL "^\%(SL\|HG\): \\ 檔案末沒有 newline 字元"
+syn match hgDiffCommon "^\%(SL\|HG\): .* 和 .* 有共同的副目錄$"
+
+endif
+
+
+syn match hgDiffRemoved "^\%(SL\|HG\): -.*"
+syn match hgDiffRemoved "^\%(SL\|HG\): <.*"
+syn match hgDiffAdded "^\%(SL\|HG\): +.*"
+syn match hgDiffAdded "^\%(SL\|HG\): >.*"
+syn match hgDiffChanged "^\%(SL\|HG\): ! .*"
+
+syn match hgDiffSubname " @@..*"ms=s+3 contained
+syn match hgDiffLine "^\%(SL\|HG\): @.*" contains=hgDiffSubname
+syn match hgDiffLine "^\%(SL\|HG\): \<\d\+\>.*"
+syn match hgDiffLine "^\%(SL\|HG\): \*\*\*\*.*"
+syn match hgDiffLine "^\%(SL\|HG\): ---$"
+
+" Some versions of diff have lines like "#c#" and "#d#" (where # is a number)
+syn match hgDiffLine "^\%(SL\|HG\): \d\+\(,\d\+\)\=[cda]\d\+\>.*"
+
+syn match hgDiffFile "^\%(SL\|HG\): diff\>.*"
+syn match hgDiffFile "^\%(SL\|HG\): Index: .*"
+syn match hgDiffFile "^\%(SL\|HG\): ==== .*"
+
+if search('^\%(SL\|HG\): @@ -\S\+ +\S\+ @@', 'nw', '', 100)
+ " unified
+ syn match hgDiffOldFile "^\%(SL\|HG\): --- .*"
+ syn match hgDiffNewFile "^\%(SL\|HG\): +++ .*"
+else
+ " context / old style
+ syn match hgDiffOldFile "^\%(SL\|HG\): \*\*\* .*"
+ syn match hgDiffNewFile "^\%(SL\|HG\): --- .*"
+endif
+
+" Used by git
+syn match hgDiffIndexLine "^\%(SL\|HG\): index \x\x\x\x.*"
+
+syn match hgDiffComment "^\%(SL\|HG\): #.*"
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet
+hi def link hgDiffOldFile hgDiffFile
+hi def link hgDiffNewFile hgDiffFile
+hi def link hgDiffIndexLine PreProc
+hi def link hgDiffFile Type
+hi def link hgDiffOnly Constant
+hi def link hgDiffIdentical Constant
+hi def link hgDiffDiffer Constant
+hi def link hgDiffBDiffer Constant
+hi def link hgDiffIsA Constant
+hi def link hgDiffNoEOL Constant
+hi def link hgDiffCommon Constant
+hi def link hgDiffRemoved Special
+hi def link hgDiffChanged PreProc
+hi def link hgDiffAdded Identifier
+hi def link hgDiffLine Statement
+hi def link hgDiffSubname PreProc
+hi def link hgDiffComment Comment
+
+let b:current_syntax = "hgcommitDiff"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/shared/typescriptcommon.vim b/runtime/syntax/shared/typescriptcommon.vim
new file mode 100644
index 0000000..ef362fc
--- /dev/null
+++ b/runtime/syntax/shared/typescriptcommon.vim
@@ -0,0 +1,2099 @@
+" Vim syntax file
+" Language: TypeScript and TypeScriptReact
+" Maintainer: Bram Moolenaar, Herrington Darkholme
+" Last Change: 2021 Sep 22
+" Based On: Herrington Darkholme's yats.vim
+" Changes: See https:github.com/HerringtonDarkholme/yats.vim
+" Credits: See yats.vim on github
+
+if &cpo =~ 'C'
+ let s:cpo_save = &cpo
+ set cpo&vim
+endif
+
+
+" NOTE: this results in accurate highlighting, but can be slow.
+syntax sync fromstart
+
+"Dollar sign is permitted anywhere in an identifier
+setlocal iskeyword-=$
+if main_syntax == 'typescript' || main_syntax == 'typescriptreact'
+ setlocal iskeyword+=$
+ " syntax cluster htmlJavaScript contains=TOP
+endif
+" For private field added from TypeScript 3.8
+setlocal iskeyword+=#
+
+" lowest priority on least used feature
+syntax match typescriptLabel /[a-zA-Z_$]\k*:/he=e-1 contains=typescriptReserved nextgroup=@typescriptStatement skipwhite skipempty
+
+" other keywords like return,case,yield uses containedin
+syntax region typescriptBlock matchgroup=typescriptBraces start=/{/ end=/}/ contains=@typescriptStatement,@typescriptComments fold
+syntax cluster afterIdentifier contains=
+ \ typescriptDotNotation,
+ \ typescriptFuncCallArg,
+ \ typescriptTemplate,
+ \ typescriptIndexExpr,
+ \ @typescriptSymbols,
+ \ typescriptTypeArguments
+
+syntax match typescriptIdentifierName /\<\K\k*/
+ \ nextgroup=@afterIdentifier
+ \ transparent
+ \ contains=@_semantic
+ \ skipnl skipwhite
+
+syntax match typescriptProp contained /\K\k*!\?/
+ \ transparent
+ \ contains=@props
+ \ nextgroup=@afterIdentifier
+ \ skipwhite skipempty
+
+syntax region typescriptIndexExpr contained matchgroup=typescriptProperty start=/\[/rs=s+1 end=/]/he=e-1 contains=@typescriptValue nextgroup=@typescriptSymbols,typescriptDotNotation,typescriptFuncCallArg skipwhite skipempty
+
+syntax match typescriptDotNotation /\.\|?\.\|!\./ nextgroup=typescriptProp skipnl
+syntax match typescriptDotStyleNotation /\.style\./ nextgroup=typescriptDOMStyle transparent
+" syntax match typescriptFuncCall contained /[a-zA-Z]\k*\ze(/ nextgroup=typescriptFuncCallArg
+syntax region typescriptParenExp matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptComments,@typescriptValue,typescriptCastKeyword nextgroup=@typescriptSymbols skipwhite skipempty
+syntax region typescriptFuncCallArg contained matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptValue,@typescriptComments nextgroup=@typescriptSymbols,typescriptDotNotation skipwhite skipempty skipnl
+syntax region typescriptEventFuncCallArg contained matchgroup=typescriptParens start=/(/ end=/)/ contains=@typescriptEventExpression
+syntax region typescriptEventString contained start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1\|$/ contains=typescriptASCII,@events
+
+syntax region typescriptDestructureString
+ \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1\|$/
+ \ contains=typescriptASCII
+ \ nextgroup=typescriptDestructureAs
+ \ contained skipwhite skipempty
+
+syntax cluster typescriptVariableDeclarations
+ \ contains=typescriptVariableDeclaration,@typescriptDestructures
+
+syntax match typescriptVariableDeclaration /[A-Za-z_$]\k*/
+ \ nextgroup=typescriptTypeAnnotation,typescriptAssign
+ \ contained skipwhite skipempty
+
+syntax cluster typescriptDestructureVariables contains=
+ \ typescriptRestOrSpread,
+ \ typescriptDestructureComma,
+ \ typescriptDestructureLabel,
+ \ typescriptDestructureVariable,
+ \ @typescriptDestructures
+
+syntax match typescriptDestructureVariable /[A-Za-z_$]\k*/ contained
+ \ nextgroup=typescriptDefaultParam
+ \ contained skipwhite skipempty
+
+syntax match typescriptDestructureLabel /[A-Za-z_$]\k*\ze\_s*:/
+ \ nextgroup=typescriptDestructureAs
+ \ contained skipwhite skipempty
+
+syntax match typescriptDestructureAs /:/
+ \ nextgroup=typescriptDestructureVariable,@typescriptDestructures
+ \ contained skipwhite skipempty
+
+syntax match typescriptDestructureComma /,/ contained
+
+syntax cluster typescriptDestructures contains=
+ \ typescriptArrayDestructure,
+ \ typescriptObjectDestructure
+
+syntax region typescriptArrayDestructure matchgroup=typescriptBraces
+ \ start=/\[/ end=/]/
+ \ contains=@typescriptDestructureVariables,@typescriptComments
+ \ nextgroup=typescriptTypeAnnotation,typescriptAssign
+ \ transparent contained skipwhite skipempty fold
+
+syntax region typescriptObjectDestructure matchgroup=typescriptBraces
+ \ start=/{/ end=/}/
+ \ contains=typescriptDestructureString,@typescriptDestructureVariables,@typescriptComments
+ \ nextgroup=typescriptTypeAnnotation,typescriptAssign
+ \ transparent contained skipwhite skipempty fold
+
+"Syntax in the JavaScript code
+
+" String
+syntax match typescriptASCII contained /\\\d\d\d/
+
+syntax region typescriptTemplateSubstitution matchgroup=typescriptTemplateSB
+ \ start=/\${/ end=/}/
+ \ contains=@typescriptValue
+ \ contained
+
+
+syntax region typescriptString
+ \ start=+\z(["']\)+ skip=+\\\%(\z1\|$\)+ end=+\z1+ end=+$+
+ \ contains=typescriptSpecial,@Spell
+ \ extend
+
+syntax match typescriptSpecial contained "\v\\%(x\x\x|u%(\x{4}|\{\x{1,6}})|c\u|.)"
+
+" From vim runtime
+" <https://github.com/vim/vim/blob/master/runtime/syntax/javascript.vim#L48>
+syntax region typescriptRegexpString start=+/[^/*]+me=e-1 skip=+\\\\\|\\/+ end=+/[gimuy]\{0,5\}\s*$+ end=+/[gimuy]\{0,5\}\s*[;.,)\]}:]+me=e-1 nextgroup=typescriptDotNotation oneline
+
+syntax region typescriptTemplate
+ \ start=/`/ skip=/\\\\\|\\`\|\n/ end=/`\|$/
+ \ contains=typescriptTemplateSubstitution,typescriptSpecial,@Spell
+ \ nextgroup=@typescriptSymbols
+ \ skipwhite skipempty
+
+"Array
+syntax region typescriptArray matchgroup=typescriptBraces
+ \ start=/\[/ end=/]/
+ \ contains=@typescriptValue,@typescriptComments
+ \ nextgroup=@typescriptSymbols,typescriptDotNotation
+ \ skipwhite skipempty fold
+
+" Number
+syntax match typescriptNumber /\<0[bB][01][01_]*\>/ nextgroup=@typescriptSymbols skipwhite skipempty
+syntax match typescriptNumber /\<0[oO][0-7][0-7_]*\>/ nextgroup=@typescriptSymbols skipwhite skipempty
+syntax match typescriptNumber /\<0[xX][0-9a-fA-F][0-9a-fA-F_]*\>/ nextgroup=@typescriptSymbols skipwhite skipempty
+syntax match typescriptNumber /\<\%(\d[0-9_]*\%(\.\d[0-9_]*\)\=\|\.\d[0-9_]*\)\%([eE][+-]\=\d[0-9_]*\)\=\>/
+ \ nextgroup=typescriptSymbols skipwhite skipempty
+
+syntax region typescriptObjectLiteral matchgroup=typescriptBraces
+ \ start=/{/ end=/}/
+ \ contains=@typescriptComments,typescriptObjectLabel,typescriptStringProperty,typescriptComputedPropertyName,typescriptObjectAsyncKeyword
+ \ fold contained
+
+syntax keyword typescriptObjectAsyncKeyword async contained
+
+syntax match typescriptObjectLabel contained /\k\+\_s*/
+ \ nextgroup=typescriptObjectColon,@typescriptCallImpl
+ \ skipwhite skipempty
+
+syntax region typescriptStringProperty contained
+ \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1/
+ \ nextgroup=typescriptObjectColon,@typescriptCallImpl
+ \ skipwhite skipempty
+
+" syntax region typescriptPropertyName contained start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1(/me=e-1 nextgroup=@typescriptCallSignature skipwhite skipempty oneline
+syntax region typescriptComputedPropertyName contained matchgroup=typescriptBraces
+ \ start=/\[/rs=s+1 end=/]/
+ \ contains=@typescriptValue
+ \ nextgroup=typescriptObjectColon,@typescriptCallImpl
+ \ skipwhite skipempty
+
+" syntax region typescriptComputedPropertyName contained matchgroup=typescriptPropertyName start=/\[/rs=s+1 end=/]\_s*:/he=e-1 contains=@typescriptValue nextgroup=@typescriptValue skipwhite skipempty
+" syntax region typescriptComputedPropertyName contained matchgroup=typescriptPropertyName start=/\[/rs=s+1 end=/]\_s*(/me=e-1 contains=@typescriptValue nextgroup=@typescriptCallSignature skipwhite skipempty
+" Value for object, statement for label statement
+syntax match typescriptRestOrSpread /\.\.\./ contained
+syntax match typescriptObjectSpread /\.\.\./ contained containedin=typescriptObjectLiteral,typescriptArray nextgroup=@typescriptValue
+
+syntax match typescriptObjectColon contained /:/ nextgroup=@typescriptValue skipwhite skipempty
+
+" + - ^ ~
+syntax match typescriptUnaryOp /[+\-~!]/
+ \ nextgroup=@typescriptValue
+ \ skipwhite
+
+syntax region typescriptTernary matchgroup=typescriptTernaryOp start=/?[.?]\@!/ end=/:/ contained contains=@typescriptValue,@typescriptComments nextgroup=@typescriptValue skipwhite skipempty
+
+syntax match typescriptAssign /=/ nextgroup=@typescriptValue
+ \ skipwhite skipempty
+
+" 2: ==, ===
+syntax match typescriptBinaryOp contained /===\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 6: >>>=, >>>, >>=, >>, >=, >
+syntax match typescriptBinaryOp contained />\(>>=\|>>\|>=\|>\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 4: <<=, <<, <=, <
+syntax match typescriptBinaryOp contained /<\(<=\|<\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 3: ||, |=, |, ||=
+syntax match typescriptBinaryOp contained /||\?=\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 4: &&, &=, &, &&=
+syntax match typescriptBinaryOp contained /&&\?=\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 2: ??, ??=
+syntax match typescriptBinaryOp contained /??=\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 2: *=, *
+syntax match typescriptBinaryOp contained /\*=\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 2: %=, %
+syntax match typescriptBinaryOp contained /%=\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 2: /=, /
+syntax match typescriptBinaryOp contained +/\(=\|[^\*/]\@=\)+ nextgroup=@typescriptValue skipwhite skipempty
+syntax match typescriptBinaryOp contained /!==\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 2: !=, !==
+syntax match typescriptBinaryOp contained /+\(+\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 3: +, ++, +=
+syntax match typescriptBinaryOp contained /-\(-\|=\)\?/ nextgroup=@typescriptValue skipwhite skipempty
+" 3: -, --, -=
+
+" exponentiation operator
+" 2: **, **=
+syntax match typescriptBinaryOp contained /\*\*=\?/ nextgroup=@typescriptValue
+
+syntax cluster typescriptSymbols contains=typescriptBinaryOp,typescriptKeywordOp,typescriptTernary,typescriptAssign,typescriptCastKeyword
+
+" runtime syntax/basic/reserved.vim
+"Import
+syntax keyword typescriptImport from as
+syntax keyword typescriptImport import
+ \ nextgroup=typescriptImportType
+ \ skipwhite
+syntax keyword typescriptImportType type
+ \ contained
+syntax keyword typescriptExport export
+ \ nextgroup=typescriptExportType
+ \ skipwhite
+syntax match typescriptExportType /\<type\s*{\@=/
+ \ contained skipwhite skipempty skipnl
+syntax keyword typescriptModule namespace module
+
+"this
+
+"JavaScript Prototype
+syntax keyword typescriptPrototype prototype
+ \ nextgroup=@afterIdentifier
+
+syntax keyword typescriptCastKeyword as
+ \ nextgroup=@typescriptType
+ \ skipwhite
+
+"Program Keywords
+syntax keyword typescriptIdentifier arguments this super
+ \ nextgroup=@afterIdentifier
+
+syntax keyword typescriptVariable let var
+ \ nextgroup=@typescriptVariableDeclarations
+ \ skipwhite skipempty
+
+syntax keyword typescriptVariable const
+ \ nextgroup=typescriptEnum,@typescriptVariableDeclarations
+ \ skipwhite skipempty
+
+syntax region typescriptEnum matchgroup=typescriptEnumKeyword start=/enum / end=/\ze{/
+ \ nextgroup=typescriptBlock
+ \ skipwhite
+
+syntax keyword typescriptKeywordOp
+ \ contained in instanceof nextgroup=@typescriptValue
+syntax keyword typescriptOperator delete new typeof void
+ \ nextgroup=@typescriptValue
+ \ skipwhite skipempty
+
+syntax keyword typescriptForOperator contained in of
+syntax keyword typescriptBoolean true false nextgroup=@typescriptSymbols skipwhite skipempty
+syntax keyword typescriptNull null undefined nextgroup=@typescriptSymbols skipwhite skipempty
+syntax keyword typescriptMessage alert confirm prompt status
+ \ nextgroup=typescriptDotNotation,typescriptFuncCallArg
+syntax keyword typescriptGlobal self top parent
+ \ nextgroup=@afterIdentifier
+
+"Statement Keywords
+syntax keyword typescriptConditional if else switch
+ \ nextgroup=typescriptConditionalParen
+ \ skipwhite skipempty skipnl
+syntax keyword typescriptConditionalElse else
+syntax keyword typescriptRepeat do while for nextgroup=typescriptLoopParen skipwhite skipempty
+syntax keyword typescriptRepeat for nextgroup=typescriptLoopParen,typescriptAsyncFor skipwhite skipempty
+syntax keyword typescriptBranch break continue containedin=typescriptBlock
+syntax keyword typescriptCase case nextgroup=@typescriptPrimitive skipwhite containedin=typescriptBlock
+syntax keyword typescriptDefault default containedin=typescriptBlock nextgroup=@typescriptValue,typescriptClassKeyword,typescriptInterfaceKeyword skipwhite oneline
+syntax keyword typescriptStatementKeyword with
+syntax keyword typescriptStatementKeyword yield skipwhite nextgroup=@typescriptValue containedin=typescriptBlock
+syntax keyword typescriptStatementKeyword return skipwhite contained nextgroup=@typescriptValue containedin=typescriptBlock
+
+syntax keyword typescriptTry try
+syntax keyword typescriptExceptions catch throw finally
+syntax keyword typescriptDebugger debugger
+
+syntax keyword typescriptAsyncFor await nextgroup=typescriptLoopParen skipwhite skipempty contained
+
+syntax region typescriptLoopParen contained matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=typescriptVariable,typescriptForOperator,typescriptEndColons,@typescriptValue,@typescriptComments
+ \ nextgroup=typescriptBlock
+ \ skipwhite skipempty
+syntax region typescriptConditionalParen contained matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=@typescriptValue,@typescriptComments
+ \ nextgroup=typescriptBlock
+ \ skipwhite skipempty
+syntax match typescriptEndColons /[;,]/ contained
+
+syntax keyword typescriptAmbientDeclaration declare nextgroup=@typescriptAmbients
+ \ skipwhite skipempty
+
+syntax cluster typescriptAmbients contains=
+ \ typescriptVariable,
+ \ typescriptFuncKeyword,
+ \ typescriptClassKeyword,
+ \ typescriptAbstract,
+ \ typescriptEnumKeyword,typescriptEnum,
+ \ typescriptModule
+
+"Syntax coloring for Node.js shebang line
+syntax match shellbang "^#!.*node\>"
+syntax match shellbang "^#!.*iojs\>"
+
+
+"JavaScript comments
+syntax keyword typescriptCommentTodo TODO FIXME XXX TBD
+syntax match typescriptMagicComment "@ts-\%(ignore\|expect-error\)\>"
+syntax match typescriptLineComment "//.*"
+ \ contains=@Spell,typescriptCommentTodo,typescriptRef,typescriptMagicComment
+syntax region typescriptComment
+ \ start="/\*" end="\*/"
+ \ contains=@Spell,typescriptCommentTodo extend
+syntax cluster typescriptComments
+ \ contains=typescriptDocComment,typescriptComment,typescriptLineComment
+
+syntax match typescriptRef +///\s*<reference\s\+.*\/>$+
+ \ contains=typescriptString
+syntax match typescriptRef +///\s*<amd-dependency\s\+.*\/>$+
+ \ contains=typescriptString
+syntax match typescriptRef +///\s*<amd-module\s\+.*\/>$+
+ \ contains=typescriptString
+
+"JSDoc
+syntax case ignore
+
+syntax region typescriptDocComment matchgroup=typescriptComment
+ \ start="/\*\*" end="\*/"
+ \ contains=typescriptDocNotation,typescriptCommentTodo,@Spell
+ \ fold keepend
+syntax match typescriptDocNotation contained /@/ nextgroup=typescriptDocTags
+
+syntax keyword typescriptDocTags contained constant constructor constructs function ignore inner private public readonly static
+syntax keyword typescriptDocTags contained const dict expose inheritDoc interface nosideeffects override protected struct internal
+syntax keyword typescriptDocTags contained example global
+syntax keyword typescriptDocTags contained alpha beta defaultValue eventProperty experimental label
+syntax keyword typescriptDocTags contained packageDocumentation privateRemarks remarks sealed typeParam
+
+" syntax keyword typescriptDocTags contained ngdoc nextgroup=typescriptDocNGDirective
+syntax keyword typescriptDocTags contained ngdoc scope priority animations
+syntax keyword typescriptDocTags contained ngdoc restrict methodOf propertyOf eventOf eventType nextgroup=typescriptDocParam skipwhite
+syntax keyword typescriptDocNGDirective contained overview service object function method property event directive filter inputType error
+
+syntax keyword typescriptDocTags contained abstract virtual access augments
+
+syntax keyword typescriptDocTags contained arguments callback lends memberOf name type kind link mixes mixin tutorial nextgroup=typescriptDocParam skipwhite
+syntax keyword typescriptDocTags contained variation nextgroup=typescriptDocNumParam skipwhite
+
+syntax keyword typescriptDocTags contained author class classdesc copyright default defaultvalue nextgroup=typescriptDocDesc skipwhite
+syntax keyword typescriptDocTags contained deprecated description external host nextgroup=typescriptDocDesc skipwhite
+syntax keyword typescriptDocTags contained file fileOverview overview namespace requires since version nextgroup=typescriptDocDesc skipwhite
+syntax keyword typescriptDocTags contained summary todo license preserve nextgroup=typescriptDocDesc skipwhite
+
+syntax keyword typescriptDocTags contained borrows exports nextgroup=typescriptDocA skipwhite
+syntax keyword typescriptDocTags contained param arg argument property prop module nextgroup=typescriptDocNamedParamType,typescriptDocParamName skipwhite
+syntax keyword typescriptDocTags contained define enum extends implements this typedef nextgroup=typescriptDocParamType skipwhite
+syntax keyword typescriptDocTags contained return returns throws exception nextgroup=typescriptDocParamType,typescriptDocParamName skipwhite
+syntax keyword typescriptDocTags contained see nextgroup=typescriptDocRef skipwhite
+
+syntax keyword typescriptDocTags contained function func method nextgroup=typescriptDocName skipwhite
+syntax match typescriptDocName contained /\h\w*/
+
+syntax keyword typescriptDocTags contained fires event nextgroup=typescriptDocEventRef skipwhite
+syntax match typescriptDocEventRef contained /\h\w*#\(\h\w*\:\)\?\h\w*/
+
+syntax match typescriptDocNamedParamType contained /{.\+}/ nextgroup=typescriptDocParamName skipwhite
+syntax match typescriptDocParamName contained /\[\?0-9a-zA-Z_\.]\+\]\?/ nextgroup=typescriptDocDesc skipwhite
+syntax match typescriptDocParamType contained /{.\+}/ nextgroup=typescriptDocDesc skipwhite
+syntax match typescriptDocA contained /\%(#\|\w\|\.\|:\|\/\)\+/ nextgroup=typescriptDocAs skipwhite
+syntax match typescriptDocAs contained /\s*as\s*/ nextgroup=typescriptDocB skipwhite
+syntax match typescriptDocB contained /\%(#\|\w\|\.\|:\|\/\)\+/
+syntax match typescriptDocParam contained /\%(#\|\w\|\.\|:\|\/\|-\)\+/
+syntax match typescriptDocNumParam contained /\d\+/
+syntax match typescriptDocRef contained /\%(#\|\w\|\.\|:\|\/\)\+/
+syntax region typescriptDocLinkTag contained matchgroup=typescriptDocLinkTag start=/{/ end=/}/ contains=typescriptDocTags
+
+syntax cluster typescriptDocs contains=typescriptDocParamType,typescriptDocNamedParamType,typescriptDocParam
+
+if exists("main_syntax") && main_syntax == "typescript"
+ syntax sync clear
+ syntax sync ccomment typescriptComment minlines=200
+endif
+
+syntax case match
+
+" Types
+syntax match typescriptOptionalMark /?/ contained
+
+syntax cluster typescriptTypeParameterCluster contains=
+ \ typescriptTypeParameter,
+ \ typescriptGenericDefault
+
+syntax region typescriptTypeParameters matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/
+ \ contains=@typescriptTypeParameterCluster
+ \ contained
+
+syntax match typescriptTypeParameter /\K\k*/
+ \ nextgroup=typescriptConstraint
+ \ contained skipwhite skipnl
+
+syntax keyword typescriptConstraint extends
+ \ nextgroup=@typescriptType
+ \ contained skipwhite skipnl
+
+syntax match typescriptGenericDefault /=/
+ \ nextgroup=@typescriptType
+ \ contained skipwhite
+
+"><
+" class A extend B<T> {} // ClassBlock
+" func<T>() // FuncCallArg
+syntax region typescriptTypeArguments matchgroup=typescriptTypeBrackets
+ \ start=/\></ end=/>/
+ \ contains=@typescriptType
+ \ nextgroup=typescriptFuncCallArg,@typescriptTypeOperator
+ \ contained skipwhite
+
+
+syntax cluster typescriptType contains=
+ \ @typescriptPrimaryType,
+ \ typescriptUnion,
+ \ @typescriptFunctionType,
+ \ typescriptConstructorType
+
+" array type: A[]
+" type indexing A['key']
+syntax region typescriptTypeBracket contained
+ \ start=/\[/ end=/\]/
+ \ contains=typescriptString,typescriptNumber
+ \ nextgroup=@typescriptTypeOperator
+ \ skipwhite skipempty
+
+syntax cluster typescriptPrimaryType contains=
+ \ typescriptParenthesizedType,
+ \ typescriptPredefinedType,
+ \ typescriptTypeReference,
+ \ typescriptObjectType,
+ \ typescriptTupleType,
+ \ typescriptTypeQuery,
+ \ typescriptStringLiteralType,
+ \ typescriptTemplateLiteralType,
+ \ typescriptReadonlyArrayKeyword,
+ \ typescriptAssertType
+
+syntax region typescriptStringLiteralType contained
+ \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1\|$/
+ \ nextgroup=typescriptUnion
+ \ skipwhite skipempty
+
+syntax region typescriptTemplateLiteralType contained
+ \ start=/`/ skip=/\\\\\|\\`\|\n/ end=/`\|$/
+ \ contains=typescriptTemplateSubstitutionType
+ \ nextgroup=typescriptTypeOperator
+ \ skipwhite skipempty
+
+syntax region typescriptTemplateSubstitutionType matchgroup=typescriptTemplateSB
+ \ start=/\${/ end=/}/
+ \ contains=@typescriptType
+ \ contained
+
+syntax region typescriptParenthesizedType matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=@typescriptType
+ \ nextgroup=@typescriptTypeOperator
+ \ contained skipwhite skipempty fold
+
+syntax match typescriptTypeReference /\K\k*\(\.\K\k*\)*/
+ \ nextgroup=typescriptTypeArguments,@typescriptTypeOperator,typescriptUserDefinedType
+ \ skipwhite contained skipempty
+
+syntax keyword typescriptPredefinedType any number boolean string void never undefined null object unknown
+ \ nextgroup=@typescriptTypeOperator
+ \ contained skipwhite skipempty
+
+syntax match typescriptPredefinedType /unique symbol/
+ \ nextgroup=@typescriptTypeOperator
+ \ contained skipwhite skipempty
+
+syntax region typescriptObjectType matchgroup=typescriptBraces
+ \ start=/{/ end=/}/
+ \ contains=@typescriptTypeMember,typescriptEndColons,@typescriptComments,typescriptAccessibilityModifier,typescriptReadonlyModifier
+ \ nextgroup=@typescriptTypeOperator
+ \ contained skipwhite skipnl fold
+
+syntax cluster typescriptTypeMember contains=
+ \ @typescriptCallSignature,
+ \ typescriptConstructSignature,
+ \ typescriptIndexSignature,
+ \ @typescriptMembers
+
+syntax match typescriptTupleLable /\K\k*?\?:/
+ \ contained
+
+syntax region typescriptTupleType matchgroup=typescriptBraces
+ \ start=/\[/ end=/\]/
+ \ contains=@typescriptType,@typescriptComments,typescriptRestOrSpread,typescriptTupleLable
+ \ contained skipwhite
+
+syntax cluster typescriptTypeOperator
+ \ contains=typescriptUnion,typescriptTypeBracket,typescriptConstraint,typescriptConditionalType
+
+syntax match typescriptUnion /|\|&/ contained nextgroup=@typescriptPrimaryType skipwhite skipempty
+
+syntax match typescriptConditionalType /?\|:/ contained nextgroup=@typescriptPrimaryType skipwhite skipempty
+
+syntax cluster typescriptFunctionType contains=typescriptGenericFunc,typescriptFuncType
+syntax region typescriptGenericFunc matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/
+ \ contains=typescriptTypeParameter
+ \ nextgroup=typescriptFuncType
+ \ containedin=typescriptFunctionType
+ \ contained skipwhite skipnl
+
+syntax region typescriptFuncType matchgroup=typescriptParens
+ \ start=/(/ end=/)\s*=>/me=e-2
+ \ contains=@typescriptParameterList
+ \ nextgroup=typescriptFuncTypeArrow
+ \ contained skipwhite skipnl oneline
+
+syntax match typescriptFuncTypeArrow /=>/
+ \ nextgroup=@typescriptType
+ \ containedin=typescriptFuncType
+ \ contained skipwhite skipnl
+
+
+syntax keyword typescriptConstructorType new
+ \ nextgroup=@typescriptFunctionType
+ \ contained skipwhite skipnl
+
+syntax keyword typescriptUserDefinedType is
+ \ contained nextgroup=@typescriptType skipwhite skipempty
+
+syntax keyword typescriptTypeQuery typeof keyof
+ \ nextgroup=typescriptTypeReference
+ \ contained skipwhite skipnl
+
+syntax keyword typescriptAssertType asserts
+ \ nextgroup=typescriptTypeReference
+ \ contained skipwhite skipnl
+
+syntax cluster typescriptCallSignature contains=typescriptGenericCall,typescriptCall
+syntax region typescriptGenericCall matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/
+ \ contains=typescriptTypeParameter
+ \ nextgroup=typescriptCall
+ \ contained skipwhite skipnl
+syntax region typescriptCall matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=typescriptDecorator,@typescriptParameterList,@typescriptComments
+ \ nextgroup=typescriptTypeAnnotation,typescriptBlock
+ \ contained skipwhite skipnl
+
+syntax match typescriptTypeAnnotation /:/
+ \ nextgroup=@typescriptType
+ \ contained skipwhite skipnl
+
+syntax cluster typescriptParameterList contains=
+ \ typescriptTypeAnnotation,
+ \ typescriptAccessibilityModifier,
+ \ typescriptReadonlyModifier,
+ \ typescriptOptionalMark,
+ \ typescriptRestOrSpread,
+ \ typescriptFuncComma,
+ \ typescriptDefaultParam
+
+syntax match typescriptFuncComma /,/ contained
+
+syntax match typescriptDefaultParam /=/
+ \ nextgroup=@typescriptValue
+ \ contained skipwhite
+
+syntax keyword typescriptConstructSignature new
+ \ nextgroup=@typescriptCallSignature
+ \ contained skipwhite
+
+syntax region typescriptIndexSignature matchgroup=typescriptBraces
+ \ start=/\[/ end=/\]/
+ \ contains=typescriptPredefinedType,typescriptMappedIn,typescriptString
+ \ nextgroup=typescriptTypeAnnotation
+ \ contained skipwhite oneline
+
+syntax keyword typescriptMappedIn in
+ \ nextgroup=@typescriptType
+ \ contained skipwhite skipnl skipempty
+
+syntax keyword typescriptAliasKeyword type
+ \ nextgroup=typescriptAliasDeclaration
+ \ skipwhite skipnl skipempty
+
+syntax region typescriptAliasDeclaration matchgroup=typescriptUnion
+ \ start=/ / end=/=/
+ \ nextgroup=@typescriptType
+ \ contains=typescriptConstraint,typescriptTypeParameters
+ \ contained skipwhite skipempty
+
+syntax keyword typescriptReadonlyArrayKeyword readonly
+ \ nextgroup=@typescriptPrimaryType
+ \ skipwhite
+
+
+" extension
+if get(g:, 'yats_host_keyword', 1)
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Function Boolean
+ " use of nextgroup Suggested by Doug Kearns
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Error EvalError nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName InternalError
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName RangeError ReferenceError
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName StopIteration
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName SyntaxError TypeError
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName URIError Date
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Float32Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Float64Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Int16Array Int32Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Int8Array Uint16Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Uint32Array Uint8Array
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Uint8ClampedArray
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName ParallelArray
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName ArrayBuffer DataView
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Iterator Generator
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Reflect Proxy
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName arguments
+ hi def link typescriptGlobal Structure
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName eval uneval nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName isFinite nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName isNaN parseFloat nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName parseInt nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName decodeURI nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName decodeURIComponent nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName encodeURI nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName encodeURIComponent nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptGlobalMethod
+ hi def link typescriptGlobalMethod Structure
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Number nextgroup=typescriptGlobalNumberDot,typescriptFuncCallArg
+ syntax match typescriptGlobalNumberDot /\./ contained nextgroup=typescriptNumberStaticProp,typescriptNumberStaticMethod,typescriptProp
+ syntax keyword typescriptNumberStaticProp contained EPSILON MAX_SAFE_INTEGER MAX_VALUE
+ syntax keyword typescriptNumberStaticProp contained MIN_SAFE_INTEGER MIN_VALUE NEGATIVE_INFINITY
+ syntax keyword typescriptNumberStaticProp contained NaN POSITIVE_INFINITY
+ hi def link typescriptNumberStaticProp Keyword
+ syntax keyword typescriptNumberStaticMethod contained isFinite isInteger isNaN isSafeInteger nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptNumberStaticMethod contained parseFloat parseInt nextgroup=typescriptFuncCallArg
+ hi def link typescriptNumberStaticMethod Keyword
+ syntax keyword typescriptNumberMethod contained toExponential toFixed toLocaleString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptNumberMethod contained toPrecision toSource toString valueOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptNumberMethod
+ hi def link typescriptNumberMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName String nextgroup=typescriptGlobalStringDot,typescriptFuncCallArg
+ syntax match typescriptGlobalStringDot /\./ contained nextgroup=typescriptStringStaticMethod,typescriptProp
+ syntax keyword typescriptStringStaticMethod contained fromCharCode fromCodePoint raw nextgroup=typescriptFuncCallArg
+ hi def link typescriptStringStaticMethod Keyword
+ syntax keyword typescriptStringMethod contained anchor charAt charCodeAt codePointAt nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained concat endsWith includes indexOf lastIndexOf nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained link localeCompare match normalize nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained padStart padEnd repeat replace search nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained slice split startsWith substr substring nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained toLocaleLowerCase toLocaleUpperCase nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained toLowerCase toString toUpperCase trim nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptStringMethod contained valueOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptStringMethod
+ hi def link typescriptStringMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Array nextgroup=typescriptGlobalArrayDot,typescriptFuncCallArg
+ syntax match typescriptGlobalArrayDot /\./ contained nextgroup=typescriptArrayStaticMethod,typescriptProp
+ syntax keyword typescriptArrayStaticMethod contained from isArray of nextgroup=typescriptFuncCallArg
+ hi def link typescriptArrayStaticMethod Keyword
+ syntax keyword typescriptArrayMethod contained concat copyWithin entries every fill nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained filter find findIndex forEach indexOf nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained includes join keys lastIndexOf map nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained pop push reduce reduceRight reverse nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained shift slice some sort splice toLocaleString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptArrayMethod contained toSource toString unshift nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptArrayMethod
+ hi def link typescriptArrayMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Object nextgroup=typescriptGlobalObjectDot,typescriptFuncCallArg
+ syntax match typescriptGlobalObjectDot /\./ contained nextgroup=typescriptObjectStaticMethod,typescriptProp
+ syntax keyword typescriptObjectStaticMethod contained create defineProperties defineProperty nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained entries freeze getOwnPropertyDescriptors nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained getOwnPropertyDescriptor getOwnPropertyNames nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained getOwnPropertySymbols getPrototypeOf nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained is isExtensible isFrozen isSealed nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectStaticMethod contained keys preventExtensions values nextgroup=typescriptFuncCallArg
+ hi def link typescriptObjectStaticMethod Keyword
+ syntax keyword typescriptObjectMethod contained getOwnPropertyDescriptors hasOwnProperty nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectMethod contained isPrototypeOf propertyIsEnumerable nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectMethod contained toLocaleString toString valueOf seal nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptObjectMethod contained setPrototypeOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptObjectMethod
+ hi def link typescriptObjectMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Symbol nextgroup=typescriptGlobalSymbolDot,typescriptFuncCallArg
+ syntax match typescriptGlobalSymbolDot /\./ contained nextgroup=typescriptSymbolStaticProp,typescriptSymbolStaticMethod,typescriptProp
+ syntax keyword typescriptSymbolStaticProp contained length iterator match replace
+ syntax keyword typescriptSymbolStaticProp contained search split hasInstance isConcatSpreadable
+ syntax keyword typescriptSymbolStaticProp contained unscopables species toPrimitive
+ syntax keyword typescriptSymbolStaticProp contained toStringTag
+ hi def link typescriptSymbolStaticProp Keyword
+ syntax keyword typescriptSymbolStaticMethod contained for keyFor nextgroup=typescriptFuncCallArg
+ hi def link typescriptSymbolStaticMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Function
+ syntax keyword typescriptFunctionMethod contained apply bind call nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptFunctionMethod
+ hi def link typescriptFunctionMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Math nextgroup=typescriptGlobalMathDot,typescriptFuncCallArg
+ syntax match typescriptGlobalMathDot /\./ contained nextgroup=typescriptMathStaticProp,typescriptMathStaticMethod,typescriptProp
+ syntax keyword typescriptMathStaticProp contained E LN10 LN2 LOG10E LOG2E PI SQRT1_2
+ syntax keyword typescriptMathStaticProp contained SQRT2
+ hi def link typescriptMathStaticProp Keyword
+ syntax keyword typescriptMathStaticMethod contained abs acos acosh asin asinh atan nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained atan2 atanh cbrt ceil clz32 cos nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained cosh exp expm1 floor fround hypot nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained imul log log10 log1p log2 max nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained min pow random round sign sin nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptMathStaticMethod contained sinh sqrt tan tanh trunc nextgroup=typescriptFuncCallArg
+ hi def link typescriptMathStaticMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Date nextgroup=typescriptGlobalDateDot,typescriptFuncCallArg
+ syntax match typescriptGlobalDateDot /\./ contained nextgroup=typescriptDateStaticMethod,typescriptProp
+ syntax keyword typescriptDateStaticMethod contained UTC now parse nextgroup=typescriptFuncCallArg
+ hi def link typescriptDateStaticMethod Keyword
+ syntax keyword typescriptDateMethod contained getDate getDay getFullYear getHours nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getMilliseconds getMinutes getMonth nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getSeconds getTime getTimezoneOffset nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getUTCDate getUTCDay getUTCFullYear nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getUTCHours getUTCMilliseconds getUTCMinutes nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained getUTCMonth getUTCSeconds setDate setFullYear nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained setHours setMilliseconds setMinutes nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained setMonth setSeconds setTime setUTCDate nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained setUTCFullYear setUTCHours setUTCMilliseconds nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained setUTCMinutes setUTCMonth setUTCSeconds nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained toDateString toISOString toJSON toLocaleDateString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained toLocaleFormat toLocaleString toLocaleTimeString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained toSource toString toTimeString toUTCString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDateMethod contained valueOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptDateMethod
+ hi def link typescriptDateMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName JSON nextgroup=typescriptGlobalJSONDot,typescriptFuncCallArg
+ syntax match typescriptGlobalJSONDot /\./ contained nextgroup=typescriptJSONStaticMethod,typescriptProp
+ syntax keyword typescriptJSONStaticMethod contained parse stringify nextgroup=typescriptFuncCallArg
+ hi def link typescriptJSONStaticMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName RegExp nextgroup=typescriptGlobalRegExpDot,typescriptFuncCallArg
+ syntax match typescriptGlobalRegExpDot /\./ contained nextgroup=typescriptRegExpStaticProp,typescriptProp
+ syntax keyword typescriptRegExpStaticProp contained lastIndex
+ hi def link typescriptRegExpStaticProp Keyword
+ syntax keyword typescriptRegExpProp contained global ignoreCase multiline source sticky
+ syntax cluster props add=typescriptRegExpProp
+ hi def link typescriptRegExpProp Keyword
+ syntax keyword typescriptRegExpMethod contained exec test nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptRegExpMethod
+ hi def link typescriptRegExpMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Map WeakMap
+ syntax keyword typescriptES6MapProp contained size
+ syntax cluster props add=typescriptES6MapProp
+ hi def link typescriptES6MapProp Keyword
+ syntax keyword typescriptES6MapMethod contained clear delete entries forEach get has nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptES6MapMethod contained keys set values nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptES6MapMethod
+ hi def link typescriptES6MapMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Set WeakSet
+ syntax keyword typescriptES6SetProp contained size
+ syntax cluster props add=typescriptES6SetProp
+ hi def link typescriptES6SetProp Keyword
+ syntax keyword typescriptES6SetMethod contained add clear delete entries forEach has nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptES6SetMethod contained values nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptES6SetMethod
+ hi def link typescriptES6SetMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Proxy
+ syntax keyword typescriptProxyAPI contained getOwnPropertyDescriptor getOwnPropertyNames
+ syntax keyword typescriptProxyAPI contained defineProperty deleteProperty freeze seal
+ syntax keyword typescriptProxyAPI contained preventExtensions has hasOwn get set enumerate
+ syntax keyword typescriptProxyAPI contained iterate ownKeys apply construct
+ hi def link typescriptProxyAPI Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Promise nextgroup=typescriptGlobalPromiseDot,typescriptFuncCallArg
+ syntax match typescriptGlobalPromiseDot /\./ contained nextgroup=typescriptPromiseStaticMethod,typescriptProp
+ syntax keyword typescriptPromiseStaticMethod contained resolve reject all race nextgroup=typescriptFuncCallArg
+ hi def link typescriptPromiseStaticMethod Keyword
+ syntax keyword typescriptPromiseMethod contained then catch finally nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptPromiseMethod
+ hi def link typescriptPromiseMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Reflect
+ syntax keyword typescriptReflectMethod contained apply construct defineProperty deleteProperty nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptReflectMethod contained enumerate get getOwnPropertyDescriptor nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptReflectMethod contained getPrototypeOf has isExtensible ownKeys nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptReflectMethod contained preventExtensions set setPrototypeOf nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptReflectMethod
+ hi def link typescriptReflectMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Intl
+ syntax keyword typescriptIntlMethod contained Collator DateTimeFormat NumberFormat nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptIntlMethod contained PluralRules nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptIntlMethod
+ hi def link typescriptIntlMethod Keyword
+
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName global process
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName console Buffer
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName module exports
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName setTimeout
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName clearTimeout
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName setInterval
+ syntax keyword typescriptNodeGlobal containedin=typescriptIdentifierName clearInterval
+ hi def link typescriptNodeGlobal Structure
+
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName describe
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName it test before
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName after beforeEach
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName afterEach
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName beforeAll
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName afterAll
+ syntax keyword typescriptTestGlobal containedin=typescriptIdentifierName expect assert
+
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AbortController
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AbstractWorker AnalyserNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName App Apps ArrayBuffer
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ArrayBufferView
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Attr AudioBuffer
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioBufferSourceNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioContext AudioDestinationNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioListener AudioNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName AudioParam BatteryManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName BiquadFilterNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName BlobEvent BluetoothAdapter
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName BluetoothDevice
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName BluetoothManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CameraCapabilities
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CameraControl CameraManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CanvasGradient CanvasImageSource
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CanvasPattern CanvasRenderingContext2D
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CaretPosition CDATASection
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ChannelMergerNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ChannelSplitterNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CharacterData ChildNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ChromeWorker Comment
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Connection Console
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ContactManager Contacts
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ConvolverNode Coordinates
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSS CSSConditionRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSGroupingRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSKeyframeRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSKeyframesRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSMediaRule CSSNamespaceRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSPageRule CSSRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSRuleList CSSStyleDeclaration
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSStyleRule CSSStyleSheet
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName CSSSupportsRule
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DataTransfer DataView
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DedicatedWorkerGlobalScope
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DelayNode DeviceAcceleration
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DeviceRotationRate
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DeviceStorage DirectoryEntry
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DirectoryEntrySync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DirectoryReader
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DirectoryReaderSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Document DocumentFragment
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DocumentTouch DocumentType
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMCursor DOMError
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMException DOMHighResTimeStamp
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMImplementation
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMImplementationRegistry
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMParser DOMRequest
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMString DOMStringList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMStringMap DOMTimeStamp
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName DOMTokenList DynamicsCompressorNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Element Entry EntrySync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Extensions FileException
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Float32Array Float64Array
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName FMRadio FormData
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName GainNode Gamepad
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName GamepadButton Geolocation
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName History HTMLAnchorElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLAreaElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLAudioElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLBaseElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLBodyElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLBRElement HTMLButtonElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLCanvasElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLCollection HTMLDataElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLDataListElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLDivElement HTMLDListElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLDocument HTMLElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLEmbedElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLFieldSetElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLFormControlsCollection
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLFormElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLHeadElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLHeadingElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLHRElement HTMLHtmlElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLIFrameElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLImageElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLInputElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLKeygenElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLLabelElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLLegendElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLLIElement HTMLLinkElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLMapElement HTMLMediaElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLMetaElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLMeterElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLModElement HTMLObjectElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOListElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOptGroupElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOptionElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOptionsCollection
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLOutputElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLParagraphElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLParamElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLPreElement HTMLProgressElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLQuoteElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLScriptElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLSelectElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLSourceElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLSpanElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLStyleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableCaptionElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableCellElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableColElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableDataCellElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableHeaderCellElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableRowElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTableSectionElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTextAreaElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTimeElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTitleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLTrackElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLUListElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLUnknownElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName HTMLVideoElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBCursor IDBCursorSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBCursorWithValue
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBDatabase IDBDatabaseSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBEnvironment IDBEnvironmentSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBFactory IDBFactorySync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBIndex IDBIndexSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBKeyRange IDBObjectStore
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBObjectStoreSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBOpenDBRequest
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBRequest IDBTransaction
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBTransactionSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName IDBVersionChangeEvent
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ImageData IndexedDB
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Int16Array Int32Array
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Int8Array L10n LinkStyle
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName LocalFileSystem
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName LocalFileSystemSync
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Location LockedFile
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName MediaQueryList MediaQueryListListener
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName MediaRecorder MediaSource
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName MediaStream MediaStreamTrack
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName MutationObserver
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Navigator NavigatorGeolocation
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName NavigatorID NavigatorLanguage
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName NavigatorOnLine
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName NavigatorPlugins
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Node NodeFilter
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName NodeIterator NodeList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Notification OfflineAudioContext
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName OscillatorNode PannerNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ParentNode Performance
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PerformanceNavigation
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PerformanceTiming
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Permissions PermissionSettings
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Plugin PluginArray
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Position PositionError
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PositionOptions
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PowerManager ProcessingInstruction
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PromiseResolver
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName PushManager Range
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCConfiguration
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCPeerConnection
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCPeerConnectionErrorCallback
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCSessionDescription
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName RTCSessionDescriptionCallback
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ScriptProcessorNode
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Selection SettingsLock
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SettingsManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SharedWorker StyleSheet
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName StyleSheetList SVGAElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAngle SVGAnimateColorElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedAngle
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedBoolean
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedEnumeration
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedInteger
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedLength
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedLengthList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedNumber
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedNumberList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedPoints
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedPreserveAspectRatio
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedRect
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedString
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimatedTransformList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimateElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimateMotionElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimateTransformElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGAnimationElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGCircleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGClipPathElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGCursorElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGDefsElement SVGDescElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGElement SVGEllipseElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFilterElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontElement SVGFontFaceElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceFormatElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceNameElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceSrcElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGFontFaceUriElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGForeignObjectElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGGElement SVGGlyphElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGGradientElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGHKernElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGImageElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGLength SVGLengthList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGLinearGradientElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGLineElement SVGMaskElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGMatrix SVGMissingGlyphElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGMPathElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGNumber SVGNumberList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPathElement SVGPatternElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPoint SVGPolygonElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPolylineElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGPreserveAspectRatio
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGRadialGradientElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGRect SVGRectElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGScriptElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGSetElement SVGStopElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGStringList SVGStylable
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGStyleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGSVGElement SVGSwitchElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGSymbolElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTests SVGTextElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTextPositioningElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTitleElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTransform SVGTransformable
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTransformList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGTRefElement SVGTSpanElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGUseElement SVGViewElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName SVGVKernElement
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TCPServerSocket
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TCPSocket Telephony
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TelephonyCall Text
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TextDecoder TextEncoder
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName TextMetrics TimeRanges
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Touch TouchList
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Transferable TreeWalker
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Uint16Array Uint32Array
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Uint8Array Uint8ClampedArray
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName URLSearchParams
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName URLUtilsReadOnly
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName UserProximityEvent
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName ValidityState VideoPlaybackQuality
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WaveShaperNode WebBluetooth
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WebGLRenderingContext
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WebSMS WebSocket
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WebVTT WifiManager
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName Window Worker WorkerConsole
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName WorkerLocation WorkerNavigator
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName XDomainRequest XMLDocument
+ syntax keyword typescriptBOM containedin=typescriptIdentifierName XMLHttpRequestEventTarget
+ hi def link typescriptBOM Structure
+
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName applicationCache
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName closed
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName Components
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName controllers
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName dialogArguments
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName document
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName frameElement
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName frames
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName fullScreen
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName history
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName innerHeight
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName innerWidth
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName length
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName location
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName locationbar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName menubar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName messageManager
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName name navigator
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName opener
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName outerHeight
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName outerWidth
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName pageXOffset
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName pageYOffset
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName parent
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName performance
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName personalbar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName returnValue
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName screen
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName screenX
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName screenY
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollbars
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollMaxX
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollMaxY
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollX
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName scrollY
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName self sidebar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName status
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName statusbar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName toolbar
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName top visualViewport
+ syntax keyword typescriptBOMWindowProp containedin=typescriptIdentifierName window
+ syntax cluster props add=typescriptBOMWindowProp
+ hi def link typescriptBOMWindowProp Structure
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName alert nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName atob nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName blur nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName btoa nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName clearImmediate nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName clearInterval nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName clearTimeout nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName close nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName confirm nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName dispatchEvent nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName find nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName focus nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getAttention nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getAttentionWithCycleCount nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getComputedStyle nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getDefaulComputedStyle nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName getSelection nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName matchMedia nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName maximize nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName moveBy nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName moveTo nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName open nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName openDialog nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName postMessage nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName print nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName prompt nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName removeEventListener nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName resizeBy nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName resizeTo nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName restore nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scroll nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollBy nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollByLines nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollByPages nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName scrollTo nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setCursor nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setImmediate nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setInterval nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setResizable nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName setTimeout nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName showModalDialog nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName sizeToContent nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName stop nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMWindowMethod containedin=typescriptIdentifierName updateCommands nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBOMWindowMethod
+ hi def link typescriptBOMWindowMethod Structure
+ syntax keyword typescriptBOMWindowEvent contained onabort onbeforeunload onblur onchange
+ syntax keyword typescriptBOMWindowEvent contained onclick onclose oncontextmenu ondevicelight
+ syntax keyword typescriptBOMWindowEvent contained ondevicemotion ondeviceorientation
+ syntax keyword typescriptBOMWindowEvent contained ondeviceproximity ondragdrop onerror
+ syntax keyword typescriptBOMWindowEvent contained onfocus onhashchange onkeydown onkeypress
+ syntax keyword typescriptBOMWindowEvent contained onkeyup onload onmousedown onmousemove
+ syntax keyword typescriptBOMWindowEvent contained onmouseout onmouseover onmouseup
+ syntax keyword typescriptBOMWindowEvent contained onmozbeforepaint onpaint onpopstate
+ syntax keyword typescriptBOMWindowEvent contained onreset onresize onscroll onselect
+ syntax keyword typescriptBOMWindowEvent contained onsubmit onunload onuserproximity
+ syntax keyword typescriptBOMWindowEvent contained onpageshow onpagehide
+ hi def link typescriptBOMWindowEvent Keyword
+ syntax keyword typescriptBOMWindowCons containedin=typescriptIdentifierName DOMParser
+ syntax keyword typescriptBOMWindowCons containedin=typescriptIdentifierName QueryInterface
+ syntax keyword typescriptBOMWindowCons containedin=typescriptIdentifierName XMLSerializer
+ hi def link typescriptBOMWindowCons Structure
+
+ syntax keyword typescriptBOMNavigatorProp contained battery buildID connection cookieEnabled
+ syntax keyword typescriptBOMNavigatorProp contained doNotTrack maxTouchPoints oscpu
+ syntax keyword typescriptBOMNavigatorProp contained productSub push serviceWorker
+ syntax keyword typescriptBOMNavigatorProp contained vendor vendorSub
+ syntax cluster props add=typescriptBOMNavigatorProp
+ hi def link typescriptBOMNavigatorProp Keyword
+ syntax keyword typescriptBOMNavigatorMethod contained addIdleObserver geolocation nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained getDeviceStorage getDeviceStorages nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained getGamepads getUserMedia registerContentHandler nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained removeIdleObserver requestWakeLock nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained share vibrate watch registerProtocolHandler nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptBOMNavigatorMethod contained sendBeacon nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBOMNavigatorMethod
+ hi def link typescriptBOMNavigatorMethod Keyword
+ syntax keyword typescriptServiceWorkerMethod contained register nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptServiceWorkerMethod
+ hi def link typescriptServiceWorkerMethod Keyword
+
+ syntax keyword typescriptBOMLocationProp contained href protocol host hostname port
+ syntax keyword typescriptBOMLocationProp contained pathname search hash username password
+ syntax keyword typescriptBOMLocationProp contained origin
+ syntax cluster props add=typescriptBOMLocationProp
+ hi def link typescriptBOMLocationProp Keyword
+ syntax keyword typescriptBOMLocationMethod contained assign reload replace toString nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBOMLocationMethod
+ hi def link typescriptBOMLocationMethod Keyword
+
+ syntax keyword typescriptBOMHistoryProp contained length current next previous state
+ syntax keyword typescriptBOMHistoryProp contained scrollRestoration
+ syntax cluster props add=typescriptBOMHistoryProp
+ hi def link typescriptBOMHistoryProp Keyword
+ syntax keyword typescriptBOMHistoryMethod contained back forward go pushState replaceState nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBOMHistoryMethod
+ hi def link typescriptBOMHistoryMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName console
+ syntax keyword typescriptConsoleMethod contained count dir error group groupCollapsed nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptConsoleMethod contained groupEnd info log time timeEnd trace nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptConsoleMethod contained warn nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptConsoleMethod
+ hi def link typescriptConsoleMethod Keyword
+
+ syntax keyword typescriptXHRGlobal containedin=typescriptIdentifierName XMLHttpRequest
+ hi def link typescriptXHRGlobal Structure
+ syntax keyword typescriptXHRProp contained onreadystatechange readyState response
+ syntax keyword typescriptXHRProp contained responseText responseType responseXML status
+ syntax keyword typescriptXHRProp contained statusText timeout ontimeout upload withCredentials
+ syntax cluster props add=typescriptXHRProp
+ hi def link typescriptXHRProp Keyword
+ syntax keyword typescriptXHRMethod contained abort getAllResponseHeaders getResponseHeader nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptXHRMethod contained open overrideMimeType send setRequestHeader nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptXHRMethod
+ hi def link typescriptXHRMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Blob BlobBuilder
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName File FileReader
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName FileReaderSync
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName URL nextgroup=typescriptGlobalURLDot,typescriptFuncCallArg
+ syntax match typescriptGlobalURLDot /\./ contained nextgroup=typescriptURLStaticMethod,typescriptProp
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName URLUtils
+ syntax keyword typescriptFileMethod contained readAsArrayBuffer readAsBinaryString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptFileMethod contained readAsDataURL readAsText nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptFileMethod
+ hi def link typescriptFileMethod Keyword
+ syntax keyword typescriptFileReaderProp contained error readyState result
+ syntax cluster props add=typescriptFileReaderProp
+ hi def link typescriptFileReaderProp Keyword
+ syntax keyword typescriptFileReaderMethod contained abort readAsArrayBuffer readAsBinaryString nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptFileReaderMethod contained readAsDataURL readAsText nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptFileReaderMethod
+ hi def link typescriptFileReaderMethod Keyword
+ syntax keyword typescriptFileListMethod contained item nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptFileListMethod
+ hi def link typescriptFileListMethod Keyword
+ syntax keyword typescriptBlobMethod contained append getBlob getFile nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptBlobMethod
+ hi def link typescriptBlobMethod Keyword
+ syntax keyword typescriptURLUtilsProp contained hash host hostname href origin password
+ syntax keyword typescriptURLUtilsProp contained pathname port protocol search searchParams
+ syntax keyword typescriptURLUtilsProp contained username
+ syntax cluster props add=typescriptURLUtilsProp
+ hi def link typescriptURLUtilsProp Keyword
+ syntax keyword typescriptURLStaticMethod contained createObjectURL revokeObjectURL nextgroup=typescriptFuncCallArg
+ hi def link typescriptURLStaticMethod Keyword
+
+ syntax keyword typescriptCryptoGlobal containedin=typescriptIdentifierName crypto
+ hi def link typescriptCryptoGlobal Structure
+ syntax keyword typescriptSubtleCryptoMethod contained encrypt decrypt sign verify nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptSubtleCryptoMethod contained digest nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptSubtleCryptoMethod
+ hi def link typescriptSubtleCryptoMethod Keyword
+ syntax keyword typescriptCryptoProp contained subtle
+ syntax cluster props add=typescriptCryptoProp
+ hi def link typescriptCryptoProp Keyword
+ syntax keyword typescriptCryptoMethod contained getRandomValues nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptCryptoMethod
+ hi def link typescriptCryptoMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Headers Request
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Response
+ syntax keyword typescriptGlobalMethod containedin=typescriptIdentifierName fetch nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptGlobalMethod
+ hi def link typescriptGlobalMethod Structure
+ syntax keyword typescriptHeadersMethod contained append delete get getAll has set nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptHeadersMethod
+ hi def link typescriptHeadersMethod Keyword
+ syntax keyword typescriptRequestProp contained method url headers context referrer
+ syntax keyword typescriptRequestProp contained mode credentials cache
+ syntax cluster props add=typescriptRequestProp
+ hi def link typescriptRequestProp Keyword
+ syntax keyword typescriptRequestMethod contained clone nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptRequestMethod
+ hi def link typescriptRequestMethod Keyword
+ syntax keyword typescriptResponseProp contained type url status statusText headers
+ syntax keyword typescriptResponseProp contained redirected
+ syntax cluster props add=typescriptResponseProp
+ hi def link typescriptResponseProp Keyword
+ syntax keyword typescriptResponseMethod contained clone nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptResponseMethod
+ hi def link typescriptResponseMethod Keyword
+
+ syntax keyword typescriptServiceWorkerProp contained controller ready
+ syntax cluster props add=typescriptServiceWorkerProp
+ hi def link typescriptServiceWorkerProp Keyword
+ syntax keyword typescriptServiceWorkerMethod contained register getRegistration nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptServiceWorkerMethod
+ hi def link typescriptServiceWorkerMethod Keyword
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Cache
+ syntax keyword typescriptCacheMethod contained match matchAll add addAll put delete nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptCacheMethod contained keys nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptCacheMethod
+ hi def link typescriptCacheMethod Keyword
+
+ syntax keyword typescriptEncodingGlobal containedin=typescriptIdentifierName TextEncoder
+ syntax keyword typescriptEncodingGlobal containedin=typescriptIdentifierName TextDecoder
+ hi def link typescriptEncodingGlobal Structure
+ syntax keyword typescriptEncodingProp contained encoding fatal ignoreBOM
+ syntax cluster props add=typescriptEncodingProp
+ hi def link typescriptEncodingProp Keyword
+ syntax keyword typescriptEncodingMethod contained encode decode nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptEncodingMethod
+ hi def link typescriptEncodingMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName Geolocation
+ syntax keyword typescriptGeolocationMethod contained getCurrentPosition watchPosition nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptGeolocationMethod contained clearWatch nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptGeolocationMethod
+ hi def link typescriptGeolocationMethod Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName NetworkInformation
+ syntax keyword typescriptBOMNetworkProp contained downlink downlinkMax effectiveType
+ syntax keyword typescriptBOMNetworkProp contained rtt type
+ syntax cluster props add=typescriptBOMNetworkProp
+ hi def link typescriptBOMNetworkProp Keyword
+
+ syntax keyword typescriptGlobal containedin=typescriptIdentifierName PaymentRequest
+ syntax keyword typescriptPaymentMethod contained show abort canMakePayment nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptPaymentMethod
+ hi def link typescriptPaymentMethod Keyword
+ syntax keyword typescriptPaymentProp contained shippingAddress shippingOption result
+ syntax cluster props add=typescriptPaymentProp
+ hi def link typescriptPaymentProp Keyword
+ syntax keyword typescriptPaymentEvent contained onshippingaddresschange onshippingoptionchange
+ hi def link typescriptPaymentEvent Keyword
+ syntax keyword typescriptPaymentResponseMethod contained complete nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptPaymentResponseMethod
+ hi def link typescriptPaymentResponseMethod Keyword
+ syntax keyword typescriptPaymentResponseProp contained details methodName payerEmail
+ syntax keyword typescriptPaymentResponseProp contained payerPhone shippingAddress
+ syntax keyword typescriptPaymentResponseProp contained shippingOption
+ syntax cluster props add=typescriptPaymentResponseProp
+ hi def link typescriptPaymentResponseProp Keyword
+ syntax keyword typescriptPaymentAddressProp contained addressLine careOf city country
+ syntax keyword typescriptPaymentAddressProp contained country dependentLocality languageCode
+ syntax keyword typescriptPaymentAddressProp contained organization phone postalCode
+ syntax keyword typescriptPaymentAddressProp contained recipient region sortingCode
+ syntax cluster props add=typescriptPaymentAddressProp
+ hi def link typescriptPaymentAddressProp Keyword
+ syntax keyword typescriptPaymentShippingOptionProp contained id label amount selected
+ syntax cluster props add=typescriptPaymentShippingOptionProp
+ hi def link typescriptPaymentShippingOptionProp Keyword
+
+ syntax keyword typescriptDOMNodeProp contained attributes baseURI baseURIObject childNodes
+ syntax keyword typescriptDOMNodeProp contained firstChild lastChild localName namespaceURI
+ syntax keyword typescriptDOMNodeProp contained nextSibling nodeName nodePrincipal
+ syntax keyword typescriptDOMNodeProp contained nodeType nodeValue ownerDocument parentElement
+ syntax keyword typescriptDOMNodeProp contained parentNode prefix previousSibling textContent
+ syntax cluster props add=typescriptDOMNodeProp
+ hi def link typescriptDOMNodeProp Keyword
+ syntax keyword typescriptDOMNodeMethod contained appendChild cloneNode compareDocumentPosition nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained getUserData hasAttributes hasChildNodes nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained insertBefore isDefaultNamespace isEqualNode nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained isSameNode isSupported lookupNamespaceURI nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained lookupPrefix normalize removeChild nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMNodeMethod contained replaceChild setUserData nextgroup=typescriptFuncCallArg
+ syntax match typescriptDOMNodeMethod contained /contains/
+ syntax cluster props add=typescriptDOMNodeMethod
+ hi def link typescriptDOMNodeMethod Keyword
+ syntax keyword typescriptDOMNodeType contained ELEMENT_NODE ATTRIBUTE_NODE TEXT_NODE
+ syntax keyword typescriptDOMNodeType contained CDATA_SECTION_NODEN_NODE ENTITY_REFERENCE_NODE
+ syntax keyword typescriptDOMNodeType contained ENTITY_NODE PROCESSING_INSTRUCTION_NODEN_NODE
+ syntax keyword typescriptDOMNodeType contained COMMENT_NODE DOCUMENT_NODE DOCUMENT_TYPE_NODE
+ syntax keyword typescriptDOMNodeType contained DOCUMENT_FRAGMENT_NODE NOTATION_NODE
+ hi def link typescriptDOMNodeType Keyword
+
+ syntax keyword typescriptDOMElemAttrs contained accessKey clientHeight clientLeft
+ syntax keyword typescriptDOMElemAttrs contained clientTop clientWidth id innerHTML
+ syntax keyword typescriptDOMElemAttrs contained length onafterscriptexecute onbeforescriptexecute
+ syntax keyword typescriptDOMElemAttrs contained oncopy oncut onpaste onwheel scrollHeight
+ syntax keyword typescriptDOMElemAttrs contained scrollLeft scrollTop scrollWidth tagName
+ syntax keyword typescriptDOMElemAttrs contained classList className name outerHTML
+ syntax keyword typescriptDOMElemAttrs contained style
+ hi def link typescriptDOMElemAttrs Keyword
+ syntax keyword typescriptDOMElemFuncs contained getAttributeNS getAttributeNode getAttributeNodeNS
+ syntax keyword typescriptDOMElemFuncs contained getBoundingClientRect getClientRects
+ syntax keyword typescriptDOMElemFuncs contained getElementsByClassName getElementsByTagName
+ syntax keyword typescriptDOMElemFuncs contained getElementsByTagNameNS hasAttribute
+ syntax keyword typescriptDOMElemFuncs contained hasAttributeNS insertAdjacentHTML
+ syntax keyword typescriptDOMElemFuncs contained matches querySelector querySelectorAll
+ syntax keyword typescriptDOMElemFuncs contained removeAttribute removeAttributeNS
+ syntax keyword typescriptDOMElemFuncs contained removeAttributeNode requestFullscreen
+ syntax keyword typescriptDOMElemFuncs contained requestPointerLock scrollIntoView
+ syntax keyword typescriptDOMElemFuncs contained setAttribute setAttributeNS setAttributeNode
+ syntax keyword typescriptDOMElemFuncs contained setAttributeNodeNS setCapture supports
+ syntax keyword typescriptDOMElemFuncs contained getAttribute
+ hi def link typescriptDOMElemFuncs Keyword
+
+ syntax keyword typescriptDOMDocProp contained activeElement body cookie defaultView
+ syntax keyword typescriptDOMDocProp contained designMode dir domain embeds forms head
+ syntax keyword typescriptDOMDocProp contained images lastModified links location plugins
+ syntax keyword typescriptDOMDocProp contained postMessage readyState referrer registerElement
+ syntax keyword typescriptDOMDocProp contained scripts styleSheets title vlinkColor
+ syntax keyword typescriptDOMDocProp contained xmlEncoding characterSet compatMode
+ syntax keyword typescriptDOMDocProp contained contentType currentScript doctype documentElement
+ syntax keyword typescriptDOMDocProp contained documentURI documentURIObject firstChild
+ syntax keyword typescriptDOMDocProp contained implementation lastStyleSheetSet namespaceURI
+ syntax keyword typescriptDOMDocProp contained nodePrincipal ononline pointerLockElement
+ syntax keyword typescriptDOMDocProp contained popupNode preferredStyleSheetSet selectedStyleSheetSet
+ syntax keyword typescriptDOMDocProp contained styleSheetSets textContent tooltipNode
+ syntax cluster props add=typescriptDOMDocProp
+ hi def link typescriptDOMDocProp Keyword
+ syntax keyword typescriptDOMDocMethod contained caretPositionFromPoint close createNodeIterator nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createRange createTreeWalker elementFromPoint nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained getElementsByName adoptNode createAttribute nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createCDATASection createComment createDocumentFragment nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createElement createElementNS createEvent nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createExpression createNSResolver nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained createProcessingInstruction createTextNode nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained enableStyleSheetsForSet evaluate execCommand nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained exitPointerLock getBoxObjectFor getElementById nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained getElementsByClassName getElementsByTagName nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained getElementsByTagNameNS getSelection nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained hasFocus importNode loadOverlay open nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained queryCommandSupported querySelector nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMDocMethod contained querySelectorAll write writeln nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptDOMDocMethod
+ hi def link typescriptDOMDocMethod Keyword
+
+ syntax keyword typescriptDOMEventTargetMethod contained addEventListener removeEventListener nextgroup=typescriptEventFuncCallArg
+ syntax keyword typescriptDOMEventTargetMethod contained dispatchEvent waitUntil nextgroup=typescriptEventFuncCallArg
+ syntax cluster props add=typescriptDOMEventTargetMethod
+ hi def link typescriptDOMEventTargetMethod Keyword
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName AnimationEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName AudioProcessingEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName BeforeInputEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName BeforeUnloadEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName BlobEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName ClipboardEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CloseEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CompositionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CSSFontFaceLoadEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName CustomEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceLightEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceMotionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceOrientationEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DeviceProximityEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DOMTransactionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName DragEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName EditingBeforeInputEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName ErrorEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName FocusEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName GamepadEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName HashChangeEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName IDBVersionChangeEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName KeyboardEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MediaStreamEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MessageEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MouseEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName MutationEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName OfflineAudioCompletionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName PageTransitionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName PointerEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName PopStateEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName ProgressEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName RelatedEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName RTCPeerConnectionIceEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName SensorEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName StorageEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName SVGEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName SVGZoomEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TimeEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TouchEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TrackEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName TransitionEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName UIEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName UserProximityEvent
+ syntax keyword typescriptDOMEventCons containedin=typescriptIdentifierName WheelEvent
+ hi def link typescriptDOMEventCons Structure
+ syntax keyword typescriptDOMEventProp contained bubbles cancelable currentTarget defaultPrevented
+ syntax keyword typescriptDOMEventProp contained eventPhase target timeStamp type isTrusted
+ syntax keyword typescriptDOMEventProp contained isReload
+ syntax cluster props add=typescriptDOMEventProp
+ hi def link typescriptDOMEventProp Keyword
+ syntax keyword typescriptDOMEventMethod contained initEvent preventDefault stopImmediatePropagation nextgroup=typescriptEventFuncCallArg
+ syntax keyword typescriptDOMEventMethod contained stopPropagation respondWith default nextgroup=typescriptEventFuncCallArg
+ syntax cluster props add=typescriptDOMEventMethod
+ hi def link typescriptDOMEventMethod Keyword
+
+ syntax keyword typescriptDOMStorage contained sessionStorage localStorage
+ hi def link typescriptDOMStorage Keyword
+ syntax keyword typescriptDOMStorageProp contained length
+ syntax cluster props add=typescriptDOMStorageProp
+ hi def link typescriptDOMStorageProp Keyword
+ syntax keyword typescriptDOMStorageMethod contained getItem key setItem removeItem nextgroup=typescriptFuncCallArg
+ syntax keyword typescriptDOMStorageMethod contained clear nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptDOMStorageMethod
+ hi def link typescriptDOMStorageMethod Keyword
+
+ syntax keyword typescriptDOMFormProp contained acceptCharset action elements encoding
+ syntax keyword typescriptDOMFormProp contained enctype length method name target
+ syntax cluster props add=typescriptDOMFormProp
+ hi def link typescriptDOMFormProp Keyword
+ syntax keyword typescriptDOMFormMethod contained reportValidity reset submit nextgroup=typescriptFuncCallArg
+ syntax cluster props add=typescriptDOMFormMethod
+ hi def link typescriptDOMFormMethod Keyword
+
+ syntax keyword typescriptDOMStyle contained alignContent alignItems alignSelf animation
+ syntax keyword typescriptDOMStyle contained animationDelay animationDirection animationDuration
+ syntax keyword typescriptDOMStyle contained animationFillMode animationIterationCount
+ syntax keyword typescriptDOMStyle contained animationName animationPlayState animationTimingFunction
+ syntax keyword typescriptDOMStyle contained appearance backfaceVisibility background
+ syntax keyword typescriptDOMStyle contained backgroundAttachment backgroundBlendMode
+ syntax keyword typescriptDOMStyle contained backgroundClip backgroundColor backgroundImage
+ syntax keyword typescriptDOMStyle contained backgroundOrigin backgroundPosition backgroundRepeat
+ syntax keyword typescriptDOMStyle contained backgroundSize border borderBottom borderBottomColor
+ syntax keyword typescriptDOMStyle contained borderBottomLeftRadius borderBottomRightRadius
+ syntax keyword typescriptDOMStyle contained borderBottomStyle borderBottomWidth borderCollapse
+ syntax keyword typescriptDOMStyle contained borderColor borderImage borderImageOutset
+ syntax keyword typescriptDOMStyle contained borderImageRepeat borderImageSlice borderImageSource
+ syntax keyword typescriptDOMStyle contained borderImageWidth borderLeft borderLeftColor
+ syntax keyword typescriptDOMStyle contained borderLeftStyle borderLeftWidth borderRadius
+ syntax keyword typescriptDOMStyle contained borderRight borderRightColor borderRightStyle
+ syntax keyword typescriptDOMStyle contained borderRightWidth borderSpacing borderStyle
+ syntax keyword typescriptDOMStyle contained borderTop borderTopColor borderTopLeftRadius
+ syntax keyword typescriptDOMStyle contained borderTopRightRadius borderTopStyle borderTopWidth
+ syntax keyword typescriptDOMStyle contained borderWidth bottom boxDecorationBreak
+ syntax keyword typescriptDOMStyle contained boxShadow boxSizing breakAfter breakBefore
+ syntax keyword typescriptDOMStyle contained breakInside captionSide caretColor caretShape
+ syntax keyword typescriptDOMStyle contained caret clear clip clipPath color columns
+ syntax keyword typescriptDOMStyle contained columnCount columnFill columnGap columnRule
+ syntax keyword typescriptDOMStyle contained columnRuleColor columnRuleStyle columnRuleWidth
+ syntax keyword typescriptDOMStyle contained columnSpan columnWidth content counterIncrement
+ syntax keyword typescriptDOMStyle contained counterReset cursor direction display
+ syntax keyword typescriptDOMStyle contained emptyCells flex flexBasis flexDirection
+ syntax keyword typescriptDOMStyle contained flexFlow flexGrow flexShrink flexWrap
+ syntax keyword typescriptDOMStyle contained float font fontFamily fontFeatureSettings
+ syntax keyword typescriptDOMStyle contained fontKerning fontLanguageOverride fontSize
+ syntax keyword typescriptDOMStyle contained fontSizeAdjust fontStretch fontStyle fontSynthesis
+ syntax keyword typescriptDOMStyle contained fontVariant fontVariantAlternates fontVariantCaps
+ syntax keyword typescriptDOMStyle contained fontVariantEastAsian fontVariantLigatures
+ syntax keyword typescriptDOMStyle contained fontVariantNumeric fontVariantPosition
+ syntax keyword typescriptDOMStyle contained fontWeight grad grid gridArea gridAutoColumns
+ syntax keyword typescriptDOMStyle contained gridAutoFlow gridAutoPosition gridAutoRows
+ syntax keyword typescriptDOMStyle contained gridColumn gridColumnStart gridColumnEnd
+ syntax keyword typescriptDOMStyle contained gridRow gridRowStart gridRowEnd gridTemplate
+ syntax keyword typescriptDOMStyle contained gridTemplateAreas gridTemplateRows gridTemplateColumns
+ syntax keyword typescriptDOMStyle contained height hyphens imageRendering imageResolution
+ syntax keyword typescriptDOMStyle contained imageOrientation imeMode inherit justifyContent
+ syntax keyword typescriptDOMStyle contained left letterSpacing lineBreak lineHeight
+ syntax keyword typescriptDOMStyle contained listStyle listStyleImage listStylePosition
+ syntax keyword typescriptDOMStyle contained listStyleType margin marginBottom marginLeft
+ syntax keyword typescriptDOMStyle contained marginRight marginTop marks mask maskType
+ syntax keyword typescriptDOMStyle contained maxHeight maxWidth minHeight minWidth
+ syntax keyword typescriptDOMStyle contained mixBlendMode objectFit objectPosition
+ syntax keyword typescriptDOMStyle contained opacity order orphans outline outlineColor
+ syntax keyword typescriptDOMStyle contained outlineOffset outlineStyle outlineWidth
+ syntax keyword typescriptDOMStyle contained overflow overflowWrap overflowX overflowY
+ syntax keyword typescriptDOMStyle contained overflowClipBox padding paddingBottom
+ syntax keyword typescriptDOMStyle contained paddingLeft paddingRight paddingTop pageBreakAfter
+ syntax keyword typescriptDOMStyle contained pageBreakBefore pageBreakInside perspective
+ syntax keyword typescriptDOMStyle contained perspectiveOrigin pointerEvents position
+ syntax keyword typescriptDOMStyle contained quotes resize right shapeImageThreshold
+ syntax keyword typescriptDOMStyle contained shapeMargin shapeOutside tableLayout tabSize
+ syntax keyword typescriptDOMStyle contained textAlign textAlignLast textCombineHorizontal
+ syntax keyword typescriptDOMStyle contained textDecoration textDecorationColor textDecorationLine
+ syntax keyword typescriptDOMStyle contained textDecorationStyle textIndent textOrientation
+ syntax keyword typescriptDOMStyle contained textOverflow textRendering textShadow
+ syntax keyword typescriptDOMStyle contained textTransform textUnderlinePosition top
+ syntax keyword typescriptDOMStyle contained touchAction transform transformOrigin
+ syntax keyword typescriptDOMStyle contained transformStyle transition transitionDelay
+ syntax keyword typescriptDOMStyle contained transitionDuration transitionProperty
+ syntax keyword typescriptDOMStyle contained transitionTimingFunction unicodeBidi unicodeRange
+ syntax keyword typescriptDOMStyle contained userSelect userZoom verticalAlign visibility
+ syntax keyword typescriptDOMStyle contained whiteSpace width willChange wordBreak
+ syntax keyword typescriptDOMStyle contained wordSpacing wordWrap writingMode zIndex
+ hi def link typescriptDOMStyle Keyword
+
+
+
+ let typescript_props = 1
+ syntax keyword typescriptAnimationEvent contained animationend animationiteration
+ syntax keyword typescriptAnimationEvent contained animationstart beginEvent endEvent
+ syntax keyword typescriptAnimationEvent contained repeatEvent
+ syntax cluster events add=typescriptAnimationEvent
+ hi def link typescriptAnimationEvent Title
+ syntax keyword typescriptCSSEvent contained CssRuleViewRefreshed CssRuleViewChanged
+ syntax keyword typescriptCSSEvent contained CssRuleViewCSSLinkClicked transitionend
+ syntax cluster events add=typescriptCSSEvent
+ hi def link typescriptCSSEvent Title
+ syntax keyword typescriptDatabaseEvent contained blocked complete error success upgradeneeded
+ syntax keyword typescriptDatabaseEvent contained versionchange
+ syntax cluster events add=typescriptDatabaseEvent
+ hi def link typescriptDatabaseEvent Title
+ syntax keyword typescriptDocumentEvent contained DOMLinkAdded DOMLinkRemoved DOMMetaAdded
+ syntax keyword typescriptDocumentEvent contained DOMMetaRemoved DOMWillOpenModalDialog
+ syntax keyword typescriptDocumentEvent contained DOMModalDialogClosed unload
+ syntax cluster events add=typescriptDocumentEvent
+ hi def link typescriptDocumentEvent Title
+ syntax keyword typescriptDOMMutationEvent contained DOMAttributeNameChanged DOMAttrModified
+ syntax keyword typescriptDOMMutationEvent contained DOMCharacterDataModified DOMContentLoaded
+ syntax keyword typescriptDOMMutationEvent contained DOMElementNameChanged DOMNodeInserted
+ syntax keyword typescriptDOMMutationEvent contained DOMNodeInsertedIntoDocument DOMNodeRemoved
+ syntax keyword typescriptDOMMutationEvent contained DOMNodeRemovedFromDocument DOMSubtreeModified
+ syntax cluster events add=typescriptDOMMutationEvent
+ hi def link typescriptDOMMutationEvent Title
+ syntax keyword typescriptDragEvent contained drag dragdrop dragend dragenter dragexit
+ syntax keyword typescriptDragEvent contained draggesture dragleave dragover dragstart
+ syntax keyword typescriptDragEvent contained drop
+ syntax cluster events add=typescriptDragEvent
+ hi def link typescriptDragEvent Title
+ syntax keyword typescriptElementEvent contained invalid overflow underflow DOMAutoComplete
+ syntax keyword typescriptElementEvent contained command commandupdate
+ syntax cluster events add=typescriptElementEvent
+ hi def link typescriptElementEvent Title
+ syntax keyword typescriptFocusEvent contained blur change DOMFocusIn DOMFocusOut focus
+ syntax keyword typescriptFocusEvent contained focusin focusout
+ syntax cluster events add=typescriptFocusEvent
+ hi def link typescriptFocusEvent Title
+ syntax keyword typescriptFormEvent contained reset submit
+ syntax cluster events add=typescriptFormEvent
+ hi def link typescriptFormEvent Title
+ syntax keyword typescriptFrameEvent contained DOMFrameContentLoaded
+ syntax cluster events add=typescriptFrameEvent
+ hi def link typescriptFrameEvent Title
+ syntax keyword typescriptInputDeviceEvent contained click contextmenu DOMMouseScroll
+ syntax keyword typescriptInputDeviceEvent contained dblclick gamepadconnected gamepaddisconnected
+ syntax keyword typescriptInputDeviceEvent contained keydown keypress keyup MozGamepadButtonDown
+ syntax keyword typescriptInputDeviceEvent contained MozGamepadButtonUp mousedown mouseenter
+ syntax keyword typescriptInputDeviceEvent contained mouseleave mousemove mouseout
+ syntax keyword typescriptInputDeviceEvent contained mouseover mouseup mousewheel MozMousePixelScroll
+ syntax keyword typescriptInputDeviceEvent contained pointerlockchange pointerlockerror
+ syntax keyword typescriptInputDeviceEvent contained wheel
+ syntax cluster events add=typescriptInputDeviceEvent
+ hi def link typescriptInputDeviceEvent Title
+ syntax keyword typescriptMediaEvent contained audioprocess canplay canplaythrough
+ syntax keyword typescriptMediaEvent contained durationchange emptied ended ended loadeddata
+ syntax keyword typescriptMediaEvent contained loadedmetadata MozAudioAvailable pause
+ syntax keyword typescriptMediaEvent contained play playing ratechange seeked seeking
+ syntax keyword typescriptMediaEvent contained stalled suspend timeupdate volumechange
+ syntax keyword typescriptMediaEvent contained waiting complete
+ syntax cluster events add=typescriptMediaEvent
+ hi def link typescriptMediaEvent Title
+ syntax keyword typescriptMenuEvent contained DOMMenuItemActive DOMMenuItemInactive
+ syntax cluster events add=typescriptMenuEvent
+ hi def link typescriptMenuEvent Title
+ syntax keyword typescriptNetworkEvent contained datachange dataerror disabled enabled
+ syntax keyword typescriptNetworkEvent contained offline online statuschange connectionInfoUpdate
+ syntax cluster events add=typescriptNetworkEvent
+ hi def link typescriptNetworkEvent Title
+ syntax keyword typescriptProgressEvent contained abort error load loadend loadstart
+ syntax keyword typescriptProgressEvent contained progress timeout uploadprogress
+ syntax cluster events add=typescriptProgressEvent
+ hi def link typescriptProgressEvent Title
+ syntax keyword typescriptResourceEvent contained cached error load
+ syntax cluster events add=typescriptResourceEvent
+ hi def link typescriptResourceEvent Title
+ syntax keyword typescriptScriptEvent contained afterscriptexecute beforescriptexecute
+ syntax cluster events add=typescriptScriptEvent
+ hi def link typescriptScriptEvent Title
+ syntax keyword typescriptSensorEvent contained compassneedscalibration devicelight
+ syntax keyword typescriptSensorEvent contained devicemotion deviceorientation deviceproximity
+ syntax keyword typescriptSensorEvent contained orientationchange userproximity
+ syntax cluster events add=typescriptSensorEvent
+ hi def link typescriptSensorEvent Title
+ syntax keyword typescriptSessionHistoryEvent contained pagehide pageshow popstate
+ syntax cluster events add=typescriptSessionHistoryEvent
+ hi def link typescriptSessionHistoryEvent Title
+ syntax keyword typescriptStorageEvent contained change storage
+ syntax cluster events add=typescriptStorageEvent
+ hi def link typescriptStorageEvent Title
+ syntax keyword typescriptSVGEvent contained SVGAbort SVGError SVGLoad SVGResize SVGScroll
+ syntax keyword typescriptSVGEvent contained SVGUnload SVGZoom
+ syntax cluster events add=typescriptSVGEvent
+ hi def link typescriptSVGEvent Title
+ syntax keyword typescriptTabEvent contained visibilitychange
+ syntax cluster events add=typescriptTabEvent
+ hi def link typescriptTabEvent Title
+ syntax keyword typescriptTextEvent contained compositionend compositionstart compositionupdate
+ syntax keyword typescriptTextEvent contained copy cut paste select text
+ syntax cluster events add=typescriptTextEvent
+ hi def link typescriptTextEvent Title
+ syntax keyword typescriptTouchEvent contained touchcancel touchend touchenter touchleave
+ syntax keyword typescriptTouchEvent contained touchmove touchstart
+ syntax cluster events add=typescriptTouchEvent
+ hi def link typescriptTouchEvent Title
+ syntax keyword typescriptUpdateEvent contained checking downloading error noupdate
+ syntax keyword typescriptUpdateEvent contained obsolete updateready
+ syntax cluster events add=typescriptUpdateEvent
+ hi def link typescriptUpdateEvent Title
+ syntax keyword typescriptValueChangeEvent contained hashchange input readystatechange
+ syntax cluster events add=typescriptValueChangeEvent
+ hi def link typescriptValueChangeEvent Title
+ syntax keyword typescriptViewEvent contained fullscreen fullscreenchange fullscreenerror
+ syntax keyword typescriptViewEvent contained resize scroll
+ syntax cluster events add=typescriptViewEvent
+ hi def link typescriptViewEvent Title
+ syntax keyword typescriptWebsocketEvent contained close error message open
+ syntax cluster events add=typescriptWebsocketEvent
+ hi def link typescriptWebsocketEvent Title
+ syntax keyword typescriptWindowEvent contained DOMWindowCreated DOMWindowClose DOMTitleChanged
+ syntax cluster events add=typescriptWindowEvent
+ hi def link typescriptWindowEvent Title
+ syntax keyword typescriptUncategorizedEvent contained beforeunload message open show
+ syntax cluster events add=typescriptUncategorizedEvent
+ hi def link typescriptUncategorizedEvent Title
+ syntax keyword typescriptServiceWorkerEvent contained install activate fetch
+ syntax cluster events add=typescriptServiceWorkerEvent
+ hi def link typescriptServiceWorkerEvent Title
+
+
+endif
+
+" patch
+" patch for generated code
+syntax keyword typescriptGlobal Promise
+ \ nextgroup=typescriptGlobalPromiseDot,typescriptFuncCallArg,typescriptTypeArguments oneline
+syntax keyword typescriptGlobal Map WeakMap
+ \ nextgroup=typescriptGlobalPromiseDot,typescriptFuncCallArg,typescriptTypeArguments oneline
+
+syntax keyword typescriptConstructor contained constructor
+ \ nextgroup=@typescriptCallSignature
+ \ skipwhite skipempty
+
+
+syntax cluster memberNextGroup contains=typescriptMemberOptionality,typescriptTypeAnnotation,@typescriptCallSignature
+
+syntax match typescriptMember /#\?\K\k*/
+ \ nextgroup=@memberNextGroup
+ \ contained skipwhite
+
+syntax match typescriptMethodAccessor contained /\v(get|set)\s\K/me=e-1
+ \ nextgroup=@typescriptMembers
+
+syntax cluster typescriptPropertyMemberDeclaration contains=
+ \ typescriptClassStatic,
+ \ typescriptAccessibilityModifier,
+ \ typescriptReadonlyModifier,
+ \ typescriptMethodAccessor,
+ \ @typescriptMembers
+ " \ typescriptMemberVariableDeclaration
+
+syntax match typescriptMemberOptionality /?\|!/ contained
+ \ nextgroup=typescriptTypeAnnotation,@typescriptCallSignature
+ \ skipwhite skipempty
+
+syntax cluster typescriptMembers contains=typescriptMember,typescriptStringMember,typescriptComputedMember
+
+syntax keyword typescriptClassStatic static
+ \ nextgroup=@typescriptMembers,typescriptAsyncFuncKeyword,typescriptReadonlyModifier
+ \ skipwhite contained
+
+syntax keyword typescriptAccessibilityModifier public private protected contained
+
+syntax keyword typescriptReadonlyModifier readonly contained
+
+syntax region typescriptStringMember contained
+ \ start=/\z(["']\)/ skip=/\\\\\|\\\z1\|\\\n/ end=/\z1/
+ \ nextgroup=@memberNextGroup
+ \ skipwhite skipempty
+
+syntax region typescriptComputedMember contained matchgroup=typescriptProperty
+ \ start=/\[/rs=s+1 end=/]/
+ \ contains=@typescriptValue,typescriptMember,typescriptMappedIn
+ \ nextgroup=@memberNextGroup
+ \ skipwhite skipempty
+
+"don't add typescriptMembers to nextgroup, let outer scope match it
+" so we won't match abstract method outside abstract class
+syntax keyword typescriptAbstract abstract
+ \ nextgroup=typescriptClassKeyword
+ \ skipwhite skipnl
+syntax keyword typescriptClassKeyword class
+ \ nextgroup=typescriptClassName,typescriptClassExtends,typescriptClassBlock
+ \ skipwhite
+
+syntax match typescriptClassName contained /\K\k*/
+ \ nextgroup=typescriptClassBlock,typescriptClassExtends,typescriptClassTypeParameter
+ \ skipwhite skipnl
+
+syntax region typescriptClassTypeParameter
+ \ start=/</ end=/>/
+ \ contains=@typescriptTypeParameterCluster
+ \ nextgroup=typescriptClassBlock,typescriptClassExtends
+ \ contained skipwhite skipnl
+
+syntax keyword typescriptClassExtends contained extends implements nextgroup=typescriptClassHeritage skipwhite skipnl
+
+syntax match typescriptClassHeritage contained /\v(\k|\.|\(|\))+/
+ \ nextgroup=typescriptClassBlock,typescriptClassExtends,typescriptMixinComma,typescriptClassTypeArguments
+ \ contains=@typescriptValue
+ \ skipwhite skipnl
+ \ contained
+
+syntax region typescriptClassTypeArguments matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/
+ \ contains=@typescriptType
+ \ nextgroup=typescriptClassExtends,typescriptClassBlock,typescriptMixinComma
+ \ contained skipwhite skipnl
+
+syntax match typescriptMixinComma /,/ contained nextgroup=typescriptClassHeritage skipwhite skipnl
+
+" we need add arrowFunc to class block for high order arrow func
+" see test case
+syntax region typescriptClassBlock matchgroup=typescriptBraces start=/{/ end=/}/
+ \ contains=@typescriptPropertyMemberDeclaration,typescriptAbstract,@typescriptComments,typescriptBlock,typescriptAssign,typescriptDecorator,typescriptAsyncFuncKeyword,typescriptArrowFunc
+ \ contained fold
+
+syntax keyword typescriptInterfaceKeyword interface nextgroup=typescriptInterfaceName skipwhite
+syntax match typescriptInterfaceName contained /\k\+/
+ \ nextgroup=typescriptObjectType,typescriptInterfaceExtends,typescriptInterfaceTypeParameter
+ \ skipwhite skipnl
+syntax region typescriptInterfaceTypeParameter
+ \ start=/</ end=/>/
+ \ contains=@typescriptTypeParameterCluster
+ \ nextgroup=typescriptObjectType,typescriptInterfaceExtends
+ \ contained
+ \ skipwhite skipnl
+
+syntax keyword typescriptInterfaceExtends contained extends nextgroup=typescriptInterfaceHeritage skipwhite skipnl
+
+syntax match typescriptInterfaceHeritage contained /\v(\k|\.)+/
+ \ nextgroup=typescriptObjectType,typescriptInterfaceComma,typescriptInterfaceTypeArguments
+ \ skipwhite
+
+syntax region typescriptInterfaceTypeArguments matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/ skip=/\s*,\s*/
+ \ contains=@typescriptType
+ \ nextgroup=typescriptObjectType,typescriptInterfaceComma
+ \ contained skipwhite
+
+syntax match typescriptInterfaceComma /,/ contained nextgroup=typescriptInterfaceHeritage skipwhite skipnl
+
+"Block VariableStatement EmptyStatement ExpressionStatement IfStatement IterationStatement ContinueStatement BreakStatement ReturnStatement WithStatement LabelledStatement SwitchStatement ThrowStatement TryStatement DebuggerStatement
+syntax cluster typescriptStatement
+ \ contains=typescriptBlock,typescriptVariable,
+ \ @typescriptTopExpression,typescriptAssign,
+ \ typescriptConditional,typescriptRepeat,typescriptBranch,
+ \ typescriptLabel,typescriptStatementKeyword,
+ \ typescriptFuncKeyword,
+ \ typescriptTry,typescriptExceptions,typescriptDebugger,
+ \ typescriptExport,typescriptInterfaceKeyword,typescriptEnum,
+ \ typescriptModule,typescriptAliasKeyword,typescriptImport
+
+syntax cluster typescriptPrimitive contains=typescriptString,typescriptTemplate,typescriptRegexpString,typescriptNumber,typescriptBoolean,typescriptNull,typescriptArray
+
+syntax cluster typescriptEventTypes contains=typescriptEventString,typescriptTemplate,typescriptNumber,typescriptBoolean,typescriptNull
+
+" top level expression: no arrow func
+" also no func keyword. funcKeyword is contained in statement
+" funcKeyword allows overloading (func without body)
+" funcImpl requires body
+syntax cluster typescriptTopExpression
+ \ contains=@typescriptPrimitive,
+ \ typescriptIdentifier,typescriptIdentifierName,
+ \ typescriptOperator,typescriptUnaryOp,
+ \ typescriptParenExp,typescriptRegexpString,
+ \ typescriptGlobal,typescriptAsyncFuncKeyword,
+ \ typescriptClassKeyword,typescriptTypeCast
+
+" no object literal, used in type cast and arrow func
+" TODO: change func keyword to funcImpl
+syntax cluster typescriptExpression
+ \ contains=@typescriptTopExpression,
+ \ typescriptArrowFuncDef,
+ \ typescriptFuncImpl
+
+syntax cluster typescriptValue
+ \ contains=@typescriptExpression,typescriptObjectLiteral
+
+syntax cluster typescriptEventExpression contains=typescriptArrowFuncDef,typescriptParenExp,@typescriptValue,typescriptRegexpString,@typescriptEventTypes,typescriptOperator,typescriptGlobal,jsxRegion
+
+syntax keyword typescriptAsyncFuncKeyword async
+ \ nextgroup=typescriptFuncKeyword,typescriptArrowFuncDef
+ \ skipwhite
+
+syntax keyword typescriptAsyncFuncKeyword await
+ \ nextgroup=@typescriptValue
+ \ skipwhite
+
+syntax keyword typescriptFuncKeyword function
+ \ nextgroup=typescriptAsyncFunc,typescriptFuncName,@typescriptCallSignature
+ \ skipwhite skipempty
+
+syntax match typescriptAsyncFunc contained /*/
+ \ nextgroup=typescriptFuncName,@typescriptCallSignature
+ \ skipwhite skipempty
+
+syntax match typescriptFuncName contained /\K\k*/
+ \ nextgroup=@typescriptCallSignature
+ \ skipwhite
+
+" destructuring ({ a: ee }) =>
+syntax match typescriptArrowFuncDef contained /(\(\s*\({\_[^}]*}\|\k\+\)\(:\_[^)]\)\?,\?\)\+)\s*=>/
+ \ contains=typescriptArrowFuncArg,typescriptArrowFunc
+ \ nextgroup=@typescriptExpression,typescriptBlock
+ \ skipwhite skipempty
+
+" matches `(a) =>` or `([a]) =>` or
+" `(
+" a) =>`
+syntax match typescriptArrowFuncDef contained /(\(\_s*[a-zA-Z\$_\[.]\_[^)]*\)*)\s*=>/
+ \ contains=typescriptArrowFuncArg,typescriptArrowFunc
+ \ nextgroup=@typescriptExpression,typescriptBlock
+ \ skipwhite skipempty
+
+syntax match typescriptArrowFuncDef contained /\K\k*\s*=>/
+ \ contains=typescriptArrowFuncArg,typescriptArrowFunc
+ \ nextgroup=@typescriptExpression,typescriptBlock
+ \ skipwhite skipempty
+
+" TODO: optimize this pattern
+syntax region typescriptArrowFuncDef contained start=/(\_[^(^)]*):/ end=/=>/
+ \ contains=typescriptArrowFuncArg,typescriptArrowFunc,typescriptTypeAnnotation
+ \ nextgroup=@typescriptExpression,typescriptBlock
+ \ skipwhite skipempty keepend
+
+syntax match typescriptArrowFunc /=>/
+syntax match typescriptArrowFuncArg contained /\K\k*/
+syntax region typescriptArrowFuncArg contained start=/<\|(/ end=/\ze=>/ contains=@typescriptCallSignature
+
+syntax region typescriptReturnAnnotation contained start=/:/ end=/{/me=e-1 contains=@typescriptType nextgroup=typescriptBlock
+
+
+syntax region typescriptFuncImpl contained start=/function\>/ end=/{/me=e-1
+ \ contains=typescriptFuncKeyword
+ \ nextgroup=typescriptBlock
+
+syntax cluster typescriptCallImpl contains=typescriptGenericImpl,typescriptParamImpl
+syntax region typescriptGenericImpl matchgroup=typescriptTypeBrackets
+ \ start=/</ end=/>/ skip=/\s*,\s*/
+ \ contains=typescriptTypeParameter
+ \ nextgroup=typescriptParamImpl
+ \ contained skipwhite
+syntax region typescriptParamImpl matchgroup=typescriptParens
+ \ start=/(/ end=/)/
+ \ contains=typescriptDecorator,@typescriptParameterList,@typescriptComments
+ \ nextgroup=typescriptReturnAnnotation,typescriptBlock
+ \ contained skipwhite skipnl
+
+syntax match typescriptDecorator /@\([_$a-zA-Z][_$a-zA-Z0-9]*\.\)*[_$a-zA-Z][_$a-zA-Z0-9]*\>/
+ \ nextgroup=typescriptFuncCallArg,typescriptTypeArguments
+ \ contains=@_semantic,typescriptDotNotation
+
+" Define the default highlighting.
+hi def link typescriptReserved Error
+
+hi def link typescriptEndColons Exception
+hi def link typescriptSymbols Normal
+hi def link typescriptBraces Function
+hi def link typescriptParens Normal
+hi def link typescriptComment Comment
+hi def link typescriptLineComment Comment
+hi def link typescriptDocComment Comment
+hi def link typescriptCommentTodo Todo
+hi def link typescriptMagicComment SpecialComment
+hi def link typescriptRef Include
+hi def link typescriptDocNotation SpecialComment
+hi def link typescriptDocTags SpecialComment
+hi def link typescriptDocNGParam typescriptDocParam
+hi def link typescriptDocParam Function
+hi def link typescriptDocNumParam Function
+hi def link typescriptDocEventRef Function
+hi def link typescriptDocNamedParamType Type
+hi def link typescriptDocParamName Type
+hi def link typescriptDocParamType Type
+hi def link typescriptString String
+hi def link typescriptSpecial Special
+hi def link typescriptStringLiteralType String
+hi def link typescriptTemplateLiteralType String
+hi def link typescriptStringMember String
+hi def link typescriptTemplate String
+hi def link typescriptEventString String
+hi def link typescriptDestructureString String
+hi def link typescriptASCII Special
+hi def link typescriptTemplateSB Label
+hi def link typescriptRegexpString String
+hi def link typescriptGlobal Constant
+hi def link typescriptTestGlobal Function
+hi def link typescriptPrototype Type
+hi def link typescriptConditional Conditional
+hi def link typescriptConditionalElse Conditional
+hi def link typescriptCase Conditional
+hi def link typescriptDefault typescriptCase
+hi def link typescriptBranch Conditional
+hi def link typescriptIdentifier Structure
+hi def link typescriptVariable Identifier
+hi def link typescriptDestructureVariable PreProc
+hi def link typescriptEnumKeyword Identifier
+hi def link typescriptRepeat Repeat
+hi def link typescriptForOperator Repeat
+hi def link typescriptStatementKeyword Statement
+hi def link typescriptMessage Keyword
+hi def link typescriptOperator Identifier
+hi def link typescriptKeywordOp Identifier
+hi def link typescriptCastKeyword Special
+hi def link typescriptType Type
+hi def link typescriptNull Boolean
+hi def link typescriptNumber Number
+hi def link typescriptBoolean Boolean
+hi def link typescriptObjectLabel typescriptLabel
+hi def link typescriptDestructureLabel Function
+hi def link typescriptLabel Label
+hi def link typescriptTupleLable Label
+hi def link typescriptStringProperty String
+hi def link typescriptImport Special
+hi def link typescriptImportType Special
+hi def link typescriptAmbientDeclaration Special
+hi def link typescriptExport Special
+hi def link typescriptExportType Special
+hi def link typescriptModule Special
+hi def link typescriptTry Special
+hi def link typescriptExceptions Special
+
+hi def link typescriptMember Function
+hi def link typescriptMethodAccessor Operator
+
+hi def link typescriptAsyncFuncKeyword Keyword
+hi def link typescriptObjectAsyncKeyword Keyword
+hi def link typescriptAsyncFor Keyword
+hi def link typescriptFuncKeyword Keyword
+hi def link typescriptAsyncFunc Keyword
+hi def link typescriptArrowFunc Type
+hi def link typescriptFuncName Function
+hi def link typescriptFuncArg PreProc
+hi def link typescriptArrowFuncArg PreProc
+hi def link typescriptFuncComma Operator
+
+hi def link typescriptClassKeyword Keyword
+hi def link typescriptClassExtends Keyword
+" hi def link typescriptClassName Function
+hi def link typescriptAbstract Special
+" hi def link typescriptClassHeritage Function
+" hi def link typescriptInterfaceHeritage Function
+hi def link typescriptClassStatic StorageClass
+hi def link typescriptReadonlyModifier Keyword
+hi def link typescriptInterfaceKeyword Keyword
+hi def link typescriptInterfaceExtends Keyword
+hi def link typescriptInterfaceName Function
+
+hi def link shellbang Comment
+
+hi def link typescriptTypeParameter Identifier
+hi def link typescriptConstraint Keyword
+hi def link typescriptPredefinedType Type
+hi def link typescriptReadonlyArrayKeyword Keyword
+hi def link typescriptUnion Operator
+hi def link typescriptFuncTypeArrow Function
+hi def link typescriptConstructorType Function
+hi def link typescriptTypeQuery Keyword
+hi def link typescriptAccessibilityModifier Keyword
+hi def link typescriptOptionalMark PreProc
+hi def link typescriptFuncType Special
+hi def link typescriptMappedIn Special
+hi def link typescriptCall PreProc
+hi def link typescriptParamImpl PreProc
+hi def link typescriptConstructSignature Identifier
+hi def link typescriptAliasDeclaration Identifier
+hi def link typescriptAliasKeyword Keyword
+hi def link typescriptUserDefinedType Keyword
+hi def link typescriptTypeReference Identifier
+hi def link typescriptConstructor Keyword
+hi def link typescriptDecorator Special
+hi def link typescriptAssertType Keyword
+
+hi link typeScript NONE
+
+if exists('s:cpo_save')
+ let &cpo = s:cpo_save
+ unlet s:cpo_save
+endif
diff --git a/runtime/syntax/sicad.vim b/runtime/syntax/sicad.vim
new file mode 100644
index 0000000..20eb14c
--- /dev/null
+++ b/runtime/syntax/sicad.vim
@@ -0,0 +1,390 @@
+" Vim syntax file
+" Language: SiCAD (procedure language)
+" Maintainer: Zsolt Branyiczky <zbranyiczky@lmark.mgx.hu>
+" Last Change: 2003 May 11
+" URL: http://lmark.mgx.hu:81/download/vim/sicad.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" use SQL highlighting after 'sql' command
+syn include @SQL syntax/sql.vim
+unlet b:current_syntax
+
+" spaces are used in (auto)indents since sicad hates tabulator characters
+setlocal expandtab
+
+" ignore case
+syn case ignore
+
+" most important commands - not listed by ausku
+syn keyword sicadStatement define
+syn keyword sicadStatement dialog
+syn keyword sicadStatement do
+syn keyword sicadStatement dop contained
+syn keyword sicadStatement end
+syn keyword sicadStatement enddo
+syn keyword sicadStatement endp
+syn keyword sicadStatement erroff
+syn keyword sicadStatement erron
+syn keyword sicadStatement exitp
+syn keyword sicadGoto goto contained
+syn keyword sicadStatement hh
+syn keyword sicadStatement if
+syn keyword sicadStatement in
+syn keyword sicadStatement msgsup
+syn keyword sicadStatement out
+syn keyword sicadStatement padd
+syn keyword sicadStatement parbeg
+syn keyword sicadStatement parend
+syn keyword sicadStatement pdoc
+syn keyword sicadStatement pprot
+syn keyword sicadStatement procd
+syn keyword sicadStatement procn
+syn keyword sicadStatement psav
+syn keyword sicadStatement psel
+syn keyword sicadStatement psymb
+syn keyword sicadStatement ptrace
+syn keyword sicadStatement ptstat
+syn keyword sicadStatement set
+syn keyword sicadStatement sql contained
+syn keyword sicadStatement step
+syn keyword sicadStatement sys
+syn keyword sicadStatement ww
+
+" functions
+syn match sicadStatement "\<atan("me=e-1
+syn match sicadStatement "\<atan2("me=e-1
+syn match sicadStatement "\<cos("me=e-1
+syn match sicadStatement "\<dist("me=e-1
+syn match sicadStatement "\<exp("me=e-1
+syn match sicadStatement "\<log("me=e-1
+syn match sicadStatement "\<log10("me=e-1
+syn match sicadStatement "\<sin("me=e-1
+syn match sicadStatement "\<sqrt("me=e-1
+syn match sicadStatement "\<tanh("me=e-1
+syn match sicadStatement "\<x("me=e-1
+syn match sicadStatement "\<y("me=e-1
+syn match sicadStatement "\<v("me=e-1
+syn match sicadStatement "\<x%g\=p[0-9]\{1,2}\>"me=s+1
+syn match sicadStatement "\<y%g\=p[0-9]\{1,2}\>"me=s+1
+
+" logical operators
+syn match sicadOperator "\.and\."
+syn match sicadOperator "\.ne\."
+syn match sicadOperator "\.not\."
+syn match sicadOperator "\.eq\."
+syn match sicadOperator "\.ge\."
+syn match sicadOperator "\.gt\."
+syn match sicadOperator "\.le\."
+syn match sicadOperator "\.lt\."
+syn match sicadOperator "\.or\."
+syn match sicadOperator "\.eqv\."
+syn match sicadOperator "\.neqv\."
+
+" variable name
+syn match sicadIdentifier "%g\=[irpt][0-9]\{1,2}\>"
+syn match sicadIdentifier "%g\=l[0-9]\>"
+syn match sicadIdentifier "%g\=[irptl]("me=e-1
+syn match sicadIdentifier "%error\>"
+syn match sicadIdentifier "%nsel\>"
+syn match sicadIdentifier "%nvar\>"
+syn match sicadIdentifier "%scl\>"
+syn match sicadIdentifier "%wd\>"
+syn match sicadIdentifier "\$[irt][0-9]\{1,2}\>" contained
+
+" label
+syn match sicadLabel1 "^ *\.[a-z][a-z0-9]\{0,7} \+[^ ]"me=e-1
+syn match sicadLabel1 "^ *\.[a-z][a-z0-9]\{0,7}\*"me=e-1
+syn match sicadLabel2 "\<goto \.\=[a-z][a-z0-9]\{0,7}\>" contains=sicadGoto
+syn match sicadLabel2 "\<goto\.[a-z][a-z0-9]\{0,7}\>" contains=sicadGoto
+
+" boolean
+syn match sicadBoolean "\.[ft]\."
+" integer without sign
+syn match sicadNumber "\<[0-9]\+\>"
+" floating point number, with dot, optional exponent
+syn match sicadFloat "\<[0-9]\+\.[0-9]*\(e[-+]\=[0-9]\+\)\=\>"
+" floating point number, starting with a dot, optional exponent
+syn match sicadFloat "\.[0-9]\+\(e[-+]\=[0-9]\+\)\=\>"
+" floating point number, without dot, with exponent
+syn match sicadFloat "\<[0-9]\+e[-+]\=[0-9]\+\>"
+
+" without this extraString definition a ' ; ' could stop the comment
+syn region sicadString_ transparent start=+'+ end=+'+ oneline contained
+" string
+syn region sicadString start=+'+ end=+'+ oneline
+
+" comments - nasty ones in sicad
+
+" - ' * blabla' or ' * blabla;'
+syn region sicadComment start="^ *\*" skip='\\ *$' end=";"me=e-1 end="$" contains=sicadString_
+" - ' .LABEL03 * blabla' or ' .LABEL03 * blabla;'
+syn region sicadComment start="^ *\.[a-z][a-z0-9]\{0,7} *\*" skip='\\ *$' end=";"me=e-1 end="$" contains=sicadLabel1,sicadString_
+" - '; * blabla' or '; * blabla;'
+syn region sicadComment start="; *\*"ms=s+1 skip='\\ *$' end=";"me=e-1 end="$" contains=sicadString_
+" - comments between docbeg and docend
+syn region sicadComment matchgroup=sicadStatement start="\<docbeg\>" end="\<docend\>"
+
+" catch \ at the end of line
+syn match sicadLineCont "\\ *$"
+
+" parameters in dop block - for the time being it is not used
+"syn match sicadParameter " [a-z][a-z0-9]*[=:]"me=e-1 contained
+" dop block - for the time being it is not used
+syn region sicadDopBlock transparent matchgroup=sicadStatement start='\<dop\>' skip='\\ *$' end=';'me=e-1 end='$' contains=ALL
+
+" sql block - new highlighting mode is used (see syn include)
+syn region sicadSqlBlock transparent matchgroup=sicadStatement start='\<sql\>' skip='\\ *$' end=';'me=e-1 end='$' contains=@SQL,sicadIdentifier,sicadLineCont
+
+" synchronizing
+syn sync clear " clear sync used in sql.vim
+syn sync match sicadSyncComment groupthere NONE "\<docend\>"
+syn sync match sicadSyncComment grouphere sicadComment "\<docbeg\>"
+" next line must be examined too
+syn sync linecont "\\ *$"
+
+" catch error caused by tabulator key
+syn match sicadError "\t"
+" catch errors caused by wrong parenthesis
+"syn region sicadParen transparent start='(' end=')' contains=ALLBUT,sicadParenError
+syn region sicadParen transparent start='(' skip='\\ *$' end=')' end='$' contains=ALLBUT,sicadParenError
+syn match sicadParenError ')'
+"syn region sicadApostrophe transparent start=+'+ end=+'+ contains=ALLBUT,sicadApostropheError
+"syn match sicadApostropheError +'+
+" not closed apostrophe
+"syn region sicadError start=+'+ end=+$+ contains=ALLBUT,sicadApostropheError
+"syn match sicadApostropheError +'[^']*$+me=s+1 contained
+
+" SICAD keywords
+syn keyword sicadStatement abst add addsim adrin aib
+syn keyword sicadStatement aibzsn aidump aifgeo aisbrk alknam
+syn keyword sicadStatement alknr alksav alksel alktrc alopen
+syn keyword sicadStatement ansbo aractiv ararea arareao ararsfs
+syn keyword sicadStatement arbuffer archeck arcomv arcont arconv
+syn keyword sicadStatement arcopy arcopyo arcorr arcreate arerror
+syn keyword sicadStatement areval arflfm arflop arfrast argbkey
+syn keyword sicadStatement argenf argraph argrapho arinters arkompfl
+syn keyword sicadStatement arlasso arlcopy arlgraph arline arlining
+syn keyword sicadStatement arlisly armakea armemo arnext aroverl
+syn keyword sicadStatement arovers arparkmd arpars arrefp arselect
+syn keyword sicadStatement arset arstruct arunify arupdate arvector
+syn keyword sicadStatement arveinfl arvflfl arvoroni ausku basis
+syn keyword sicadStatement basisaus basisdar basisnr bebos befl
+syn keyword sicadStatement befla befli befls beo beorta
+syn keyword sicadStatement beortn bep bepan bepap bepola
+syn keyword sicadStatement bepoln bepsn bepsp ber berili
+syn keyword sicadStatement berk bewz bkl bli bma
+syn keyword sicadStatement bmakt bmakts bmbm bmerk bmerw
+syn keyword sicadStatement bmerws bminit bmk bmorth bmos
+syn keyword sicadStatement bmoss bmpar bmsl bmsum bmsums
+syn keyword sicadStatement bmver bmvero bmw bo bta
+syn keyword sicadStatement buffer bvl bw bza bzap
+syn keyword sicadStatement bzd bzgera bzorth cat catel
+syn keyword sicadStatement cdbdiff ce cgmparam close closesim
+syn keyword sicadStatement comgener comp comp conclose conclose coninfo
+syn keyword sicadStatement conopen conread contour conwrite cop
+syn keyword sicadStatement copar coparp coparp2 copel cr
+syn keyword sicadStatement cs cstat cursor d da
+syn keyword sicadStatement dal dasp dasps dataout dcol
+syn keyword sicadStatement dd defsr del delel deskrdef
+syn keyword sicadStatement df dfn dfns dfpos dfr
+syn keyword sicadStatement dgd dgm dgp dgr dh
+syn keyword sicadStatement diag diaus dir disbsd dkl
+syn keyword sicadStatement dktx dkur dlgfix dlgfre dma
+syn keyword sicadStatement dprio dr druse dsel dskinfo
+syn keyword sicadStatement dsr dv dve eba ebd
+syn keyword sicadStatement ebdmod ebs edbsdbin edbssnin edbsvtin
+syn keyword sicadStatement edt egaus egdef egdefs eglist
+syn keyword sicadStatement egloe egloenp egloes egxx eib
+syn keyword sicadStatement ekur ekuradd elel elpos epg
+syn keyword sicadStatement esau esauadd esek eta etap
+syn keyword sicadStatement etav feparam ficonv filse fl
+syn keyword sicadStatement fli flin flini flinit flins
+syn keyword sicadStatement flkor fln flnli flop flout
+syn keyword sicadStatement flowert flparam flraster flsy flsyd
+syn keyword sicadStatement flsym flsyms flsymt fmtatt fmtdia
+syn keyword sicadStatement fmtlib fpg gbadddb gbaim gbanrs
+syn keyword sicadStatement gbatw gbau gbaudit gbclosp gbcredic
+syn keyword sicadStatement gbcreem gbcreld gbcresdb gbcretd gbde
+syn keyword sicadStatement gbdeldb gbdeldic gbdelem gbdelld gbdelref
+syn keyword sicadStatement gbdeltd gbdisdb gbdisem gbdisld gbdistd
+syn keyword sicadStatement gbebn gbemau gbepsv gbgetdet gbgetes
+syn keyword sicadStatement gbgetmas gbgqel gbgqelr gbgqsa gbgrant
+syn keyword sicadStatement gbimpdic gbler gblerb gblerf gbles
+syn keyword sicadStatement gblocdic gbmgmg gbmntdb gbmoddb gbnam
+syn keyword sicadStatement gbneu gbopenp gbpoly gbpos gbpruef
+syn keyword sicadStatement gbpruefg gbps gbqgel gbqgsa gbrefdic
+syn keyword sicadStatement gbreftab gbreldic gbresem gbrevoke gbsav
+syn keyword sicadStatement gbsbef gbsddk gbsicu gbsrt gbss
+syn keyword sicadStatement gbstat gbsysp gbszau gbubp gbueb
+syn keyword sicadStatement gbunmdb gbuseem gbw gbweg gbwieh
+syn keyword sicadStatement gbzt gelp gera getvar hgw
+syn keyword sicadStatement hpg hr0 hra hrar icclchan
+syn keyword sicadStatement iccrecon icdescon icfree icgetcon icgtresp
+syn keyword sicadStatement icopchan icputcon icreacon icreqd icreqnw
+syn keyword sicadStatement icreqw icrespd icresrve icwricon imsget
+syn keyword sicadStatement imsgqel imsmget imsplot imsprint inchk
+syn keyword sicadStatement inf infd inst kbml kbmls
+syn keyword sicadStatement kbmm kbmms kbmt kbmtdps kbmts
+syn keyword sicadStatement khboe khbol khdob khe khetap
+syn keyword sicadStatement khfrw khktk khlang khld khmfrp
+syn keyword sicadStatement khmks khms khpd khpfeil khpl
+syn keyword sicadStatement khprofil khrand khsa khsabs khsaph
+syn keyword sicadStatement khsd khsdl khse khskbz khsna
+syn keyword sicadStatement khsnum khsob khspos khsvph khtrn
+syn keyword sicadStatement khver khzpe khzpl kib kldat
+syn keyword sicadStatement klleg klsch klsym klvert kmpg
+syn keyword sicadStatement kmtlage kmtp kmtps kodef kodefp
+syn keyword sicadStatement kodefs kok kokp kolae kom
+syn keyword sicadStatement kontly kopar koparp kopg kosy
+syn keyword sicadStatement kp kr krsek krtclose krtopen
+syn keyword sicadStatement ktk lad lae laesel language
+syn keyword sicadStatement lasso lbdes lcs ldesk ldesks
+syn keyword sicadStatement le leak leattdes leba lebas
+syn keyword sicadStatement lebaznp lebd lebm lebv lebvaus
+syn keyword sicadStatement lebvlist lede ledel ledepo ledepol
+syn keyword sicadStatement ledepos leder ledist ledm lee
+syn keyword sicadStatement leeins lees lege lekr lekrend
+syn keyword sicadStatement lekwa lekwas lel lelh lell
+syn keyword sicadStatement lelp lem lena lend lenm
+syn keyword sicadStatement lep lepe lepee lepko lepl
+syn keyword sicadStatement lepmko lepmkop lepos leposm leqs
+syn keyword sicadStatement leqsl leqssp leqsv leqsvov les
+syn keyword sicadStatement lesch lesr less lestd let
+syn keyword sicadStatement letaum letl lev levm levtm
+syn keyword sicadStatement levtp levtr lew lewm lexx
+syn keyword sicadStatement lfs li lining lldes lmode
+syn keyword sicadStatement loedk loepkt lop lose loses
+syn keyword sicadStatement lp lppg lppruef lr ls
+syn keyword sicadStatement lsop lsta lstat ly lyaus
+syn keyword sicadStatement lz lza lzae lzbz lze
+syn keyword sicadStatement lznr lzo lzpos ma ma0
+syn keyword sicadStatement ma1 mad map mapoly mcarp
+syn keyword sicadStatement mccfr mccgr mcclr mccrf mcdf
+syn keyword sicadStatement mcdma mcdr mcdrp mcdve mcebd
+syn keyword sicadStatement mcgse mcinfo mcldrp md me
+syn keyword sicadStatement mefd mefds minmax mipg ml
+syn keyword sicadStatement mmcmdme mmdbf mmdellb mmdir mmdome
+syn keyword sicadStatement mmfsb mminfolb mmlapp mmlbf mmlistlb
+syn keyword sicadStatement mmloadcm mmmsg mmreadlb mmsetlb mmshowcm
+syn keyword sicadStatement mmstatme mnp mpo mr mra
+syn keyword sicadStatement ms msav msgout msgsnd msp
+syn keyword sicadStatement mspf mtd nasel ncomp new
+syn keyword sicadStatement nlist nlistlt nlistly nlistnp nlistpo
+syn keyword sicadStatement np npa npdes npe npem
+syn keyword sicadStatement npinfa npruef npsat npss npssa
+syn keyword sicadStatement ntz oa oan odel odf
+syn keyword sicadStatement odfx oj oja ojaddsk ojaed
+syn keyword sicadStatement ojaeds ojaef ojaefs ojaen ojak
+syn keyword sicadStatement ojaks ojakt ojakz ojalm ojatkis
+syn keyword sicadStatement ojatt ojatw ojbsel ojcasel ojckon
+syn keyword sicadStatement ojde ojdtl ojeb ojebd ojel
+syn keyword sicadStatement ojelpas ojesb ojesbd ojex ojezge
+syn keyword sicadStatement ojko ojlb ojloe ojlsb ojmerk
+syn keyword sicadStatement ojmos ojnam ojpda ojpoly ojprae
+syn keyword sicadStatement ojs ojsak ojsort ojstrukt ojsub
+syn keyword sicadStatement ojtdef ojvek ojx old oldd
+syn keyword sicadStatement op opa opa1 open opensim
+syn keyword sicadStatement opnbsd orth osanz ot otp
+syn keyword sicadStatement otrefp param paranf pas passw
+syn keyword sicadStatement pcatchf pda pdadd pg pg0
+syn keyword sicadStatement pgauf pgaufsel pgb pgko pgm
+syn keyword sicadStatement pgr pgvs pily pkpg plot
+syn keyword sicadStatement plotf plotfr pmap pmdata pmdi
+syn keyword sicadStatement pmdp pmeb pmep pminfo pmlb
+syn keyword sicadStatement pmli pmlp pmmod pnrver poa
+syn keyword sicadStatement pos posa posaus post printfr
+syn keyword sicadStatement protect prs prssy prsym ps
+syn keyword sicadStatement psadd psclose psopen psparam psprw
+syn keyword sicadStatement psres psstat psw pswr qualif
+syn keyword sicadStatement rahmen raster rasterd rbbackup rbchang2
+syn keyword sicadStatement rbchange rbcmd rbcoldst rbcolor rbcopy
+syn keyword sicadStatement rbcut rbcut2 rbdbcl rbdbload rbdbop
+syn keyword sicadStatement rbdbwin rbdefs rbedit rbfdel rbfill
+syn keyword sicadStatement rbfill2 rbfload rbfload2 rbfnew rbfnew2
+syn keyword sicadStatement rbfpar rbfree rbg rbgetcol rbgetdst
+syn keyword sicadStatement rbinfo rbpaste rbpixel rbrstore rbsnap
+syn keyword sicadStatement rbsta rbtile rbtrpix rbvtor rcol
+syn keyword sicadStatement rd rdchange re reb rebmod
+syn keyword sicadStatement refunc ren renel rk rkpos
+syn keyword sicadStatement rohr rohrpos rpr rr rr0
+syn keyword sicadStatement rra rrar rs samtosdb sav
+syn keyword sicadStatement savd savesim savx scol scopy
+syn keyword sicadStatement scopye sdbtosam sddk sdwr se
+syn keyword sicadStatement selaus selpos seman semi sesch
+syn keyword sicadStatement setscl setvar sfclntpf sfconn sffetchf
+syn keyword sicadStatement sffpropi sfftypi sfqugeoc sfquwhcl sfself
+syn keyword sicadStatement sfstat sftest sge sid sie
+syn keyword sicadStatement sig sigp skk skks sn
+syn keyword sicadStatement sn21 snpa snpar snparp snparps
+syn keyword sicadStatement snpars snpas snpd snpi snpkor
+syn keyword sicadStatement snpl snpm sob sob0 sobloe
+syn keyword sicadStatement sobs sof sop split spr
+syn keyword sicadStatement sqdadd sqdlad sqdold sqdsav
+syn keyword sicadStatement sr sres srt sset stat
+syn keyword sicadStatement stdtxt string strukt strupru suinfl
+syn keyword sicadStatement suinflk suinfls supo supo1 sva
+syn keyword sicadStatement svr sy sya syly sysout
+syn keyword sicadStatement syu syux taa tabeg tabl
+syn keyword sicadStatement tabm tam tanr tapg tapos
+syn keyword sicadStatement tarkd tas tase tb tbadd
+syn keyword sicadStatement tbd tbext tbget tbint tbout
+syn keyword sicadStatement tbput tbsat tbsel tbstr tcaux
+syn keyword sicadStatement tccable tcchkrep tccomm tccond tcdbg
+syn keyword sicadStatement tcgbnr tcgrpos tcinit tclconv tcmodel
+syn keyword sicadStatement tcnwe tcpairs tcpath tcrect tcrmdli
+syn keyword sicadStatement tcscheme tcschmap tcse tcselc tcstar
+syn keyword sicadStatement tcstrman tcsubnet tcsymbol tctable tcthrcab
+syn keyword sicadStatement tctrans tctst tdb tdbdel tdbget
+syn keyword sicadStatement tdblist tdbput tgmod titel tmoff
+syn keyword sicadStatement tmon tp tpa tps tpta
+syn keyword sicadStatement tra trans transkdo transopt transpro
+syn keyword sicadStatement triangle trm trpg trrkd trs
+syn keyword sicadStatement ts tsa tx txa txchk
+syn keyword sicadStatement txcng txju txl txp txpv
+syn keyword sicadStatement txtcmp txv txz uckon uiinfo
+syn keyword sicadStatement uistatus umdk umdk1 umdka umge
+syn keyword sicadStatement umges umr verbo verflli verif
+syn keyword sicadStatement verly versinfo vfg vpactive vpcenter
+syn keyword sicadStatement vpcreate vpdelete vpinfo vpmodify vpscroll
+syn keyword sicadStatement vpsta wabsym wzmerk zdrhf zdrhfn
+syn keyword sicadStatement zdrhfw zdrhfwn zefp zfl zflaus
+syn keyword sicadStatement zka zlel zlels zortf zortfn
+syn keyword sicadStatement zortfw zortfwn zortp zortpn zparb
+syn keyword sicadStatement zparbn zparf zparfn zparfw zparfwn
+syn keyword sicadStatement zparp zparpn zwinkp zwinkpn
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "sicad"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/sieve.vim b/runtime/syntax/sieve.vim
new file mode 100644
index 0000000..35b4dfb
--- /dev/null
+++ b/runtime/syntax/sieve.vim
@@ -0,0 +1,55 @@
+" Vim syntax file
+" Language: Sieve filtering language input file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-10-25
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword sieveTodo contained TODO FIXME XXX NOTE
+
+syn region sieveComment start='/\*' end='\*/' contains=sieveTodo,@Spell
+syn region sieveComment display oneline start='#' end='$'
+ \ contains=sieveTodo,@Spell
+
+syn case ignore
+
+syn match sieveTag display ':\h\w*'
+
+syn match sieveNumber display '\<\d\+[KMG]\=\>'
+
+syn match sieveSpecial display '\\["\\]'
+
+syn region sieveString start=+"+ skip=+\\\\\|\\"+ end=+"+
+ \ contains=sieveSpecial
+syn region sieveString start='text:' end='\n.\n'
+
+syn keyword sieveConditional if elsif else
+syn keyword sieveTest address allof anyof envelope exists false header
+ \ not size true
+syn keyword sievePreProc require stop
+syn keyword sieveAction reject fileinto redirect keep discard
+syn keyword sieveKeyword vacation
+
+syn case match
+
+hi def link sieveTodo Todo
+hi def link sieveComment Comment
+hi def link sieveTag Type
+hi def link sieveNumber Number
+hi def link sieveSpecial Special
+hi def link sieveString String
+hi def link sieveConditional Conditional
+hi def link sieveTest Keyword
+hi def link sievePreProc PreProc
+hi def link sieveAction Function
+hi def link sieveKeyword Keyword
+
+let b:current_syntax = "sieve"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/sil.vim b/runtime/syntax/sil.vim
new file mode 100644
index 0000000..43158da
--- /dev/null
+++ b/runtime/syntax/sil.vim
@@ -0,0 +1,179 @@
+" This source file is part of the Swift.org open source project
+"
+" Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
+" Licensed under Apache License v2.0 with Runtime Library Exception
+"
+" See https://swift.org/LICENSE.txt for license information
+" See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
+"
+" Vim syntax file
+" Language: sil
+"
+" Vim maintainer: Emir SARI <bitigchi@me.com>
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+syn keyword silStage skipwhite nextgroup=silStages
+ \ sil_stage
+syn keyword silStages
+ \ canonical
+ \ raw
+
+syn match silIdentifier skipwhite
+ \ /@\<[A-Za-z_0-9]\+\>/
+
+syn match silConvention skipwhite
+ \ /$\?@convention/
+syn region silConvention contained contains=silConventions
+ \ start="@convention(" end=")"
+syn keyword silConventions
+ \ block
+ \ c
+ \ method
+ \ objc_method
+ \ sil_differentiability_witness
+ \ thick
+ \ thin
+ \ witness_method
+
+syn match silFunctionType skipwhite
+ \ /@\(\<autoreleased\>\|\<callee_guaranteed\>\|\<callee_owned\>\|\<error\>\|\<guaranteed\>\|\<in\>\|\<in_constant\>\|\<in_guaranteed\>\|\<inout\>\|\<inout_aliasable\>\|\<noescape\>\|\<out\>\|\<owned\>\)/
+syn match silMetatypeType skipwhite
+ \ /@\(\<thick\>\|\<thin\>\|\<objc\>\)/
+
+" TODO: handle [tail_elems sil-type * sil-operand]
+syn region silAttribute contains=silAttributes
+ \ start="\[" end="\]"
+syn keyword silAttributes contained containedin=silAttribute
+ \ abort
+ \ deinit
+ \ delegatingself
+ \ derivedself
+ \ derivedselfonly
+ \ dynamic
+ \ exact
+ \ init
+ \ modify
+ \ mutating
+ \ objc
+ \ open
+ \ read
+ \ rootself
+ \ stack
+ \ static
+ \ strict
+ \ unknown
+ \ unsafe
+ \ var
+
+syn keyword swiftImport import skipwhite nextgroup=swiftImportModule
+syn match swiftImportModule /\<[A-Za-z_][A-Za-z_0-9]*\>/ contained nextgroup=swiftImportComponent
+syn match swiftImportComponent /\.\<[A-Za-z_][A-Za-z_0-9]*\>/ contained nextgroup=swiftImportComponent
+
+syn region swiftComment start="/\*" end="\*/" contains=swiftComment,swiftTodo
+syn region swiftLineComment start="//" end="$" contains=swiftTodo
+
+syn match swiftLineComment /^#!.*/
+syn match swiftTypeName /\<[A-Z][a-zA-Z_0-9]*\>/
+syn match swiftDecimal /\<[-]\?[0-9]\+\>/
+syn match swiftDecimal /\<[-+]\?[0-9]\+\>/
+
+syn match swiftTypeName /\$\*\<\?[A-Z][a-zA-Z0-9_]*\>/
+syn match swiftVarName /%\<[A-z[a-z_0-9]\+\(#[0-9]\+\)\?\>/
+
+syn keyword swiftKeyword break case continue default do else for if in static switch repeat return where while skipwhite
+
+syn keyword swiftKeyword sil internal thunk skipwhite
+syn keyword swiftKeyword public hidden private shared public_external hidden_external skipwhite
+syn keyword swiftKeyword getter setter allocator initializer enumelt destroyer globalaccessor objc skipwhite
+syn keyword swiftKeyword alloc_global alloc_stack alloc_ref alloc_ref_dynamic alloc_box alloc_existential_box alloc_value_buffer dealloc_stack dealloc_box dealloc_existential_box dealloc_ref dealloc_partial_ref dealloc_value_buffer skipwhite
+syn keyword swiftKeyword debug_value debug_value_addr skipwhite
+syn keyword swiftKeyword load load_unowned store assign mark_uninitialized mark_function_escape copy_addr destroy_addr index_addr index_raw_pointer bind_memory to skipwhite
+syn keyword swiftKeyword strong_retain strong_release strong_retain_unowned ref_to_unowned unowned_to_ref unowned_retain unowned_release load_weak store_unowned store_weak fix_lifetime autorelease_value set_deallocating is_unique is_escaping_closure skipwhite
+syn keyword swiftKeyword function_ref integer_literal float_literal string_literal global_addr skipwhite
+syn keyword swiftKeyword class_method super_method witness_method objc_method objc_super_method skipwhite
+syn keyword swiftKeyword partial_apply builtin skipwhite
+syn keyword swiftApplyKeyword apply try_apply skipwhite
+syn keyword swiftKeyword metatype value_metatype existential_metatype skipwhite
+syn keyword swiftKeyword retain_value release_value retain_value_addr release_value_addr tuple tuple_extract tuple_element_addr struct struct_extract struct_element_addr ref_element_addr skipwhite
+syn keyword swiftKeyword init_enum_data_addr unchecked_enum_data unchecked_take_enum_data_addr inject_enum_addr skipwhite
+syn keyword swiftKeyword init_existential_addr init_existential_value init_existential_metatype deinit_existential_addr deinit_existential_value open_existential_addr open_existential_box open_existential_box_value open_existential_metatype init_existential_ref open_existential_ref open_existential_value skipwhite
+syn keyword swiftKeyword upcast address_to_pointer pointer_to_address pointer_to_thin_function unchecked_addr_cast unchecked_ref_cast unchecked_ref_cast_addr ref_to_raw_pointer ref_to_bridge_object ref_to_unmanaged unmanaged_to_ref raw_pointer_to_ref skipwhite
+syn keyword swiftKeyword convert_function thick_to_objc_metatype thin_function_to_pointer objc_to_thick_metatype thin_to_thick_function unchecked_ref_bit_cast unchecked_trivial_bit_cast bridge_object_to_ref bridge_object_to_word unchecked_bitwise_cast skipwhite
+syn keyword swiftKeyword objc_existential_metatype_to_object objc_metatype_to_object objc_protocol skipwhite
+syn keyword swiftKeyword unconditional_checked_cast unconditional_checked_cast_addr unconditional_checked_cast_value skipwhite
+syn keyword swiftKeyword cond_fail skipwhite
+syn keyword swiftKeyword unreachable return throw br cond_br switch_value select_enum select_enum_addr select_value switch_enum switch_enum_addr dynamic_method_br checked_cast_br checked_cast_value_br checked_cast_addr_br skipwhite
+syn keyword swiftKeyword project_box project_existential_box project_value_buffer project_block_storage init_block_storage_header copy_block mark_dependence skipwhite
+
+syn keyword swiftTypeDefinition class extension protocol struct typealias enum skipwhite nextgroup=swiftTypeName
+syn region swiftTypeAttributes start="\[" end="\]" skipwhite contained nextgroup=swiftTypeName
+syn match swiftTypeName /\<[A-Za-z_][A-Za-z_0-9\.]*\>/ contained nextgroup=swiftTypeParameters
+
+syn region swiftTypeParameters start="<" end=">" skipwhite contained
+
+syn keyword swiftFuncDefinition func skipwhite nextgroup=swiftFuncAttributes,swiftFuncName,swiftOperator
+syn region swiftFuncAttributes start="\[" end="\]" skipwhite contained nextgroup=swiftFuncName,swiftOperator
+syn match swiftFuncName /\<[A-Za-z_][A-Za-z_0-9]*\>/ skipwhite contained nextgroup=swiftTypeParameters
+syn keyword swiftFuncKeyword subscript init destructor nextgroup=swiftTypeParameters
+
+syn keyword swiftVarDefinition var skipwhite nextgroup=swiftVarName
+syn keyword swiftVarDefinition let skipwhite nextgroup=swiftVarName
+syn match swiftVarName /\<[A-Za-z_][A-Za-z_0-9]*\>/ skipwhite contained
+
+syn keyword swiftDefinitionModifier static
+
+syn match swiftImplicitVarName /\$\<[A-Za-z_0-9]\+\>/
+
+hi def link swiftImport Include
+hi def link swiftImportModule Title
+hi def link swiftImportComponent Identifier
+hi def link swiftApplyKeyword Statement
+hi def link swiftKeyword Statement
+hi def link swiftTypeDefinition Define
+hi def link swiftTypeName Type
+hi def link swiftTypeParameters Special
+hi def link swiftTypeAttributes PreProc
+hi def link swiftFuncDefinition Define
+hi def link swiftDefinitionModifier Define
+hi def link swiftFuncName Function
+hi def link swiftFuncAttributes PreProc
+hi def link swiftFuncKeyword Function
+hi def link swiftVarDefinition Define
+hi def link swiftVarName Identifier
+hi def link swiftImplicitVarName Identifier
+hi def link swiftIdentifierKeyword Identifier
+hi def link swiftTypeDeclaration Delimiter
+hi def link swiftBoolean Boolean
+hi def link swiftString String
+hi def link swiftInterpolation Special
+hi def link swiftComment Comment
+hi def link swiftLineComment Comment
+hi def link swiftDecimal Number
+hi def link swiftHex Number
+hi def link swiftOct Number
+hi def link swiftBin Number
+hi def link swiftOperator Function
+hi def link swiftChar Character
+hi def link swiftLabel Label
+hi def link swiftNew Operator
+
+hi def link silStage Special
+hi def link silStages Type
+hi def link silConvention Special
+hi def link silConventionParameter Special
+hi def link silConventions Type
+hi def link silIdentifier Identifier
+hi def link silFunctionType Special
+hi def link silMetatypeType Special
+hi def link silAttribute PreProc
+
+let b:current_syntax = "sil"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/syntax/simula.vim b/runtime/syntax/simula.vim
new file mode 100644
index 0000000..82f66d0
--- /dev/null
+++ b/runtime/syntax/simula.vim
@@ -0,0 +1,87 @@
+" Vim syntax file
+" Language: Simula
+" Maintainer: Haakon Riiser <hakonrk@fys.uio.no>
+" URL: http://folk.uio.no/hakonrk/vim/syntax/simula.vim
+" Last Change: 2001 May 15
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" No case sensitivity in Simula
+syn case ignore
+
+syn match simulaComment "^%.*$" contains=simulaTodo
+syn region simulaComment start="!\|\<comment\>" end=";" contains=simulaTodo
+
+" Text between the keyword 'end' and either a semicolon or one of the
+" keywords 'end', 'else', 'when' or 'otherwise' is also a comment
+syn region simulaComment start="\<end\>"lc=3 matchgroup=Statement end=";\|\<\(end\|else\|when\|otherwise\)\>"
+
+syn match simulaCharError "'.\{-2,}'"
+syn match simulaCharacter "'.'"
+syn match simulaCharacter "'!\d\{-}!'" contains=simulaSpecialChar
+syn match simulaString '".\{-}"' contains=simulaSpecialChar,simulaTodo
+
+syn keyword simulaBoolean true false
+syn keyword simulaCompound begin end
+syn keyword simulaConditional else if otherwise then until when
+syn keyword simulaConstant none notext
+syn keyword simulaFunction procedure
+syn keyword simulaOperator eq eqv ge gt imp in is le lt ne new not qua
+syn keyword simulaRepeat while for
+syn keyword simulaReserved activate after at before delay go goto label prior reactivate switch to
+syn keyword simulaStatement do inner inspect step this
+syn keyword simulaStorageClass external hidden name protected value
+syn keyword simulaStructure class
+syn keyword simulaType array boolean character integer long real short text virtual
+syn match simulaAssigned "\<\h\w*\s*\((.*)\)\=\s*:\(=\|-\)"me=e-2
+syn match simulaOperator "[&:=<>+\-*/]"
+syn match simulaOperator "\<and\(\s\+then\)\=\>"
+syn match simulaOperator "\<or\(\s\+else\)\=\>"
+syn match simulaReferenceType "\<ref\s*(.\{-})"
+syn match simulaSemicolon ";"
+syn match simulaSpecial "[(),.]"
+syn match simulaSpecialCharErr "!\d\{-4,}!" contained
+syn match simulaSpecialCharErr "!!" contained
+syn match simulaSpecialChar "!\d\{-}!" contains=simulaSpecialCharErr contained
+syn match simulaTodo "xxx\+" contained
+
+" Integer number (or float without `.')
+syn match simulaNumber "-\=\<\d\+\>"
+" Real with optional exponent
+syn match simulaReal "-\=\<\d\+\(\.\d\+\)\=\(&&\=[+-]\=\d\+\)\=\>"
+" Real starting with a `.', optional exponent
+syn match simulaReal "-\=\.\d\+\(&&\=[+-]\=\d\+\)\=\>"
+
+
+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
+
+
+let b:current_syntax = "simula"
+" vim: sts=4 sw=4 ts=8
diff --git a/runtime/syntax/sinda.vim b/runtime/syntax/sinda.vim
new file mode 100644
index 0000000..a6e5b45
--- /dev/null
+++ b/runtime/syntax/sinda.vim
@@ -0,0 +1,129 @@
+" Vim syntax file
+" Language: sinda85, sinda/fluint input file
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.sin
+" URL: http://www.naglenet.org/vim/syntax/sinda.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+" Ignore case
+syn case ignore
+
+
+
+"
+"
+" Begin syntax definitions for sinda input and output files.
+"
+
+" Force free-form fortran format
+let fortran_free_source=1
+
+" Load FORTRAN syntax file
+runtime! syntax/fortran.vim
+unlet b:current_syntax
+
+
+
+" Define keywords for SINDA
+syn keyword sindaMacro BUILD BUILDF DEBON DEBOFF DEFMOD FSTART FSTOP
+
+syn keyword sindaOptions TITLE PPSAVE RSI RSO OUTPUT SAVE QMAP USER1 USER2
+syn keyword sindaOptions MODEL PPOUT NOLIST MLINE NODEBUG DIRECTORIES
+syn keyword sindaOptions DOUBLEPR
+
+syn keyword sindaRoutine FORWRD FWDBCK STDSTL FASTIC
+
+syn keyword sindaControl ABSZRO ACCELX ACCELY ACCELZ ARLXCA ATMPCA
+syn keyword sindaControl BACKUP CSGFAC DRLXCA DTIMEH DTIMEI DTIMEL
+syn keyword sindaControl DTIMES DTMPCA EBALNA EBALSA EXTLIM ITEROT
+syn keyword sindaControl ITERXT ITHOLD NLOOPS NLOOPT OUTPUT OPEITR
+syn keyword sindaControl PATMOS SIGMA TIMEO TIMEND UID
+
+syn keyword sindaSubRoutine ASKERS ADARIN ADDARY ADDMOD ARINDV
+syn keyword sindaSubRoutine RYINV ARYMPY ARYSUB ARYTRN BAROC
+syn keyword sindaSubRoutine BELACC BNDDRV BNDGET CHENNB CHGFLD
+syn keyword sindaSubRoutine CHGLMP CHGSUC CHGVOL CHKCHL CHKCHP
+syn keyword sindaSubRoutine CNSTAB COMBAL COMPLQ COMPRS CONTRN
+syn keyword sindaSubRoutine CPRINT CRASH CRVINT CRYTRN CSIFLX
+syn keyword sindaSubRoutine CVTEMP D11CYL C11DAI D11DIM D11MCY
+syn keyword sindaSubRoutine D11MDA D11MDI D11MDT D12CYL D12MCY
+syn keyword sindaSubRoutine D12MDA D1D1DA D1D1IM D1D1WM D1D2DA
+syn keyword sindaSubRoutine D1D2WM D1DEG1 D1DEG2 D1DG1I D1IMD1
+syn keyword sindaSubRoutine D1IMIM D1IMWM D1M1DA D1M2MD D1M2WM
+syn keyword sindaSubRoutine D1MDG1 D1MDG2 D2D1WM D1DEG1 D2DEG2
+syn keyword sindaSubRoutine D2D2
+
+syn keyword sindaIdentifier BIV CAL DIM DIV DPM DPV DTV GEN PER PIV PIM
+syn keyword sindaIdentifier SIM SIV SPM SPV TVS TVD
+
+
+
+" Define matches for SINDA
+syn match sindaFortran "^F[0-9 ]"me=e-1
+syn match sindaMotran "^M[0-9 ]"me=e-1
+
+syn match sindaComment "^C.*$"
+syn match sindaComment "^R.*$"
+syn match sindaComment "\$.*$"
+
+syn match sindaHeader "^header[^,]*"
+
+syn match sindaIncludeFile "include \+[^ ]\+"hs=s+8 contains=fortranInclude
+
+syn match sindaMacro "^PSTART"
+syn match sindaMacro "^PSTOP"
+syn match sindaMacro "^FAC"
+
+syn match sindaInteger "-\=\<[0-9]*\>"
+syn match sindaFloat "-\=\<[0-9]*\.[0-9]*"
+syn match sindaScientific "-\=\<[0-9]*\.[0-9]*E[-+]\=[0-9]\+\>"
+
+syn match sindaEndData "^END OF DATA"
+
+if exists("thermal_todo")
+ execute 'syn match sindaTodo ' . '"^'.thermal_todo.'.*$"'
+else
+ syn match sindaTodo "^?.*$"
+endif
+
+
+
+" Define the default highlighting
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/sindacmp.vim b/runtime/syntax/sindacmp.vim
new file mode 100644
index 0000000..88373eb
--- /dev/null
+++ b/runtime/syntax/sindacmp.vim
@@ -0,0 +1,61 @@
+" Vim syntax file
+" Language: sinda85, sinda/fluint compare file
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.cmp
+" URL: http://www.naglenet.org/vim/syntax/sindacmp.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+" Ignore case
+syn case ignore
+
+
+
+"
+" Begin syntax definitions for compare files.
+"
+
+" Define keywords for sinda compare (sincomp)
+syn keyword sindacmpUnit celsius fahrenheit
+
+
+
+" Define matches for sinda compare (sincomp)
+syn match sindacmpTitle "Steady State Temperature Comparison"
+
+syn match sindacmpLabel "File [1-6] is"
+
+syn match sindacmpHeader "^ *Node\( *File \d\)* *Node Description"
+
+syn match sindacmpInteger "^ *-\=\<[0-9]*\>"
+syn match sindacmpFloat "-\=\<[0-9]*\.[0-9]*"
+
+
+
+" Define the default highlighting
+" Only when an item doesn't have highlighting yet
+
+hi def link sindacmpTitle Type
+hi def link sindacmpUnit PreProc
+
+hi def link sindacmpLabel Statement
+
+hi def link sindacmpHeader sindaHeader
+
+hi def link sindacmpInteger Number
+hi def link sindacmpFloat Special
+
+
+
+let b:current_syntax = "sindacmp"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/sindaout.vim b/runtime/syntax/sindaout.vim
new file mode 100644
index 0000000..c362f19
--- /dev/null
+++ b/runtime/syntax/sindaout.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: sinda85, sinda/fluint output file
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.out
+" URL: http://www.naglenet.org/vim/syntax/sindaout.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+" Ignore case
+syn case match
+
+
+
+" Load SINDA syntax file
+runtime! syntax/sinda.vim
+unlet b:current_syntax
+
+
+
+"
+"
+" Begin syntax definitions for sinda output files.
+"
+
+" Define keywords for sinda output
+syn case match
+
+syn keyword sindaoutPos ON SI
+syn keyword sindaoutNeg OFF ENG
+
+
+
+" Define matches for sinda output
+syn match sindaoutFile ": \w*\.TAK"hs=s+2
+
+syn match sindaoutInteger "T\=[0-9]*\>"ms=s+1
+
+syn match sindaoutSectionDelim "[-<>]\{4,}" contains=sindaoutSectionTitle
+syn match sindaoutSectionDelim ":\=\.\{4,}:\=" contains=sindaoutSectionTitle
+syn match sindaoutSectionTitle "[-<:] \w[0-9A-Za-z_() ]\+ [->:]"hs=s+1,me=e-1
+
+syn match sindaoutHeaderDelim "=\{5,}"
+syn match sindaoutHeaderDelim "|\{5,}"
+syn match sindaoutHeaderDelim "+\{5,}"
+
+syn match sindaoutLabel "Input File:" contains=sindaoutFile
+syn match sindaoutLabel "Begin Solution: Routine"
+
+syn match sindaoutError "<<< Error >>>"
+
+
+" Define the default highlighting
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/sisu.vim b/runtime/syntax/sisu.vim
new file mode 100644
index 0000000..264aae0
--- /dev/null
+++ b/runtime/syntax/sisu.vim
@@ -0,0 +1,275 @@
+" SiSU Vim syntax file
+" SiSU Maintainer: Ralph Amissah <ralph.amissah@gmail.com>
+" SiSU Markup: SiSU (sisu-5.6.7)
+" 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)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+let s:cpo_save = &cpo
+set cpo&vim
+
+"% "Errors:
+syn match sisu_error contains=sisu_link,sisu_error_wspace "<![^ei]\S\+!>"
+
+"% "Markers Identifiers:
+if !exists("sisu_no_identifiers")
+ syn match sisu_mark_endnote "\~^"
+ syn match sisu_break contains=@NoSpell " \\\\\( \|$\)\|<br>\|<br />"
+ syn match sisu_control contains=@NoSpell "^\(-\\\\-\|=\\\\=\|-\.\.-\|<:p[bn]>\)\s*$"
+ syn match sisu_control contains=@NoSpell "^<:\(bo\|---\)>\s*$"
+ syn match sisu_marktail contains=@NoSpell "^--[+~-]#\s*$"
+ syn match sisu_marktail "[~-]#"
+ syn match sisu_control "\""
+ syn match sisu_underline "\(^\| \)_[a-zA-Z0-9]\+_\([ .,]\|$\)"
+ syn match sisu_number contains=@NoSpell "[0-9a-f]\{32\}\|[0-9a-f]\{64\}"
+ syn match sisu_link contains=@NoSpell "\(_\?https\?://\|\.\.\/\)\S\+"
+ syn match sisu_link " \*\~\S\+"
+ syn match sisu_require contains=@NoSpell "^<<\s*[a-zA-Z0-9^./_-]\+\.ss[it]$"
+ syn match sisu_structure "^:A\~$"
+
+"% "Document Sub Headers:
+ syn match sisu_sub_header_title "^\s\+:\(subtitle\|short\|edition\|language\|lang_char\|note\):\s" "group=sisu_header_content
+ syn match sisu_sub_header_creator "^\s\+:\(author\|editor\|contributor\|illustrator\|photographer\|translator\|digitized_by\|prepared_by\|audio\|video\):\s" " &hon &institution
+ syn match sisu_sub_header_rights "^\s\+:\(copyright\|text\|translation\|illustrations\|photographs\|preparation\|digitization\|audio\|video\|license\|all\):\s" " access_rights license
+ syn match sisu_sub_header_classify "^\s\+:\(topic_register\|keywords\|subject\|dewey\|loc\):\s"
+ syn match sisu_sub_header_identifier "^\s\+:\(oclc\|isbn\):\s"
+ syn match sisu_sub_header_date "^\s\+:\(added_to_site\|available\|created\|issued\|modified\|published\|valid\|translated\|original_publication\):\s"
+ syn match sisu_sub_header_original "^\s\+:\(publisher\|date\|language\|lang_char\|institution\|nationality\|source\):\s"
+ syn match sisu_sub_header_make "^\s\+:\(headings\|num_top\|breaks\|language\|italics\|bold\|emphasis\|substitute\|omit\|plaintext_wrap\|texpdf_font_mono\|texpdf_font\|stamp\|promo\|ad\|manpage\|home_button_text\|home_button_image\|cover_image\|footer\):\s"
+ syn match sisu_sub_header_notes "^\s\+:\(description\|abstract\|comment\|coverage\|relation\|source\|history\|type\|format\|prefix\|prefix_[ab]\|suffix\):\s"
+ syn match sisu_within_index_ignore "\S\+[:;]\(\s\+\|$\)"
+ syn match sisu_within_index "[:|;]\|+\d\+"
+
+"% "semantic markers: (ignore)
+ syn match sisu_sem_marker ";{\|};[a-z._]*[a-z]"
+ syn match sisu_sem_marker_block "\([a-z][a-z._]*\|\):{\|}:[a-z._]*[a-z]"
+ syn match sisu_sem_ex_marker ";\[\|\];[a-z._]*[a-z]"
+ syn match sisu_sem_ex_marker_block "\([a-z][a-z._]*\|\):\[\|\]:[a-z._]*[a-z]"
+ syn match sisu_sem_block contains=sisu_error,sisu_error_wspace,sisu_content_alt,sisu_link,sisu_linked,sisu_break,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker,sisu_mark_endnote,sisu_content_endnote "\([a-z]*\):{[^}].\{-}}:\1"
+ syn match sisu_sem_content contains=sisu_error,sisu_error_wspace,sisu_content_alt,sisu_link,sisu_linked,sisu_break,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker ";{[^}].\{-}};[a-z]\+"
+ syn match sisu_sem_ex_block contains=sisu_error,sisu_error_wspace,sisu_content_alt,sisu_link,sisu_linked,sisu_break,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker,sisu_mark_endnote,sisu_content_endnote "\([a-z]*\):\[[^}].\{-}\]:\1"
+ syn match sisu_sem_ex_content contains=sisu_error,sisu_error_wspace,sisu_content_alt,sisu_link,sisu_linked,sisu_break,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker ";\[[^}].\{-}\];[a-z]\+"
+endif
+
+"% "URLs Numbers And ASCII Codes:
+syn match sisu_number "\<\(0x\x\+\|0b[01]\+\|0\o\+\|0\.\d\+\|0\|[1-9][\.0-9_]*\)\>"
+syn match sisu_number "?\(\\M-\\C-\|\\c\|\\C-\|\\M-\)\=\(\\\o\{3}\|\\x\x\{2}\|\\\=\w\)"
+
+"% "Tuned Error: (is error if not already matched)
+syn match sisu_error contains=sisu_error "[\~/\*!_]{\|}[\~/\*!_]"
+syn match sisu_error contains=sisu_error "<a href\|</a>]"
+
+"% "Simple Paired Enclosed Markup:
+"url/link
+syn region sisu_link contains=sisu_error,sisu_error_wspace matchgroup=sisu_action start="^<<\s*|[a-zA-Z0-9^._-]\+|@|[a-zA-Z0-9^._-]\+|"rs=s+2 end="$"
+
+"% "Document Header:
+" title
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_title matchgroup=sisu_header start="^[@]title:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" creator
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_creator matchgroup=sisu_header start="^[@]creator:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" dates
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_date matchgroup=sisu_header start="^[@]date:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" publisher
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_publisher matchgroup=sisu_header start="^[@]publisher:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" rights
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_rights matchgroup=sisu_header start="^[@]rights:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" classify document
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_classify matchgroup=sisu_header start="^[@]classify:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" identifier document
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_identifier matchgroup=sisu_header start="^[@]identifier:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" original language (depreciated)
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_original matchgroup=sisu_header start="^[@]original:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" notes
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_notes matchgroup=sisu_header start="^[@]notes:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" links of interest
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_linked,sisu_sub_header_links matchgroup=sisu_header start="^[@]links:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+" make, processing instructions
+syn region sisu_header_content contains=sisu_error,sisu_comment,sisu_break,sisu_link,sisu_sub_header_make matchgroup=sisu_header start="^[@]make:[+-]\?\(\s\|\n\)"rs=e-1 end="\n$"
+
+"% "Headings:
+syn region sisu_heading contains=sisu_mark_endnote,sisu_content_endnote,sisu_marktail,sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_ocn,sisu_error,sisu_error_wspace matchgroup=sisu_structure start="^\([1-4]\|:\?[A-D]\)\~\(\S\+\|[^-]\)" end="$"
+
+"% "Block Group Text:
+" table
+syn region sisu_content_alt contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_contain start="^table{.\+" end="}table"
+" table
+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="^\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"
+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\+\box\(\.[a-z]\+\)\?" end="^```\(\s\|$\)"
+" code
+syn region sisu_content_alt contains=sisu_error,@NoSpell matchgroup=sisu_contain start="^code\(\.[a-z][0-9a-z_]\+\)\?{" end="^}code"
+syn region sisu_content_alt contains=sisu_error,@NoSpell matchgroup=sisu_contain start="^```\s\+code\(\.[a-z][0-9a-z_]\+\)\?" end="^```\(\s\|$\)"
+" quote
+syn region sisu_normal contains=sisu_fontface,sisu_bold,sisu_control,sisu_identifier,sisu_content_endnote,sisu_mark_endnote,sisu_link,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker,sisu_linked,sisu_error,sisu_error_wspace matchgroup=sisu_contain start="^```\s\+quote" end="^```\(\s\|$\)"
+
+"% "Endnotes:
+" regular endnote or asterisk or plus sign endnote
+syn region sisu_content_endnote contains=sisu_link,sisu_strikeout,sisu_underline,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error,sisu_error_wspace,sisu_mark,sisu_break,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker matchgroup=sisu_mark_endnote start="\~{[*+]*" end="}\~" skip="\n"
+" numbered asterisk or plus sign endnote
+syn region sisu_content_endnote contains=sisu_link,sisu_strikeout,sisu_underline,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error,sisu_error_wspace,sisu_mark,sisu_break,sisu_sem_block,sisu_sem_content,sisu_sem_marker matchgroup=sisu_mark_endnote start="\~\[[*+]*" end="\]\~" skip="\n"
+" endnote content marker (for binary content marking)
+syn region sisu_content_endnote contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_link,sisu_identifier,sisu_error,sisu_error_wspace,sisu_mark,sisu_break matchgroup=sisu_mark_endnote start="\^\~" end="\n$"
+
+"% "Links And Images:
+" image with url link (and possibly footnote of url)
+syn region sisu_linked contains=sisu_fontface,sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker,sisu_sem_block,sisu_error matchgroup=sisu_link start="{\(\~^\s\)\?" end="}\(https\?:/\/\|:\|\.\.\/\|#\)\S\+" oneline
+" sisu outputs, short notation
+syn region sisu_linked contains=sisu_fontface,sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker,sisu_sem_block,sisu_error matchgroup=sisu_link start="{\(\~^\s\)\?" end="\[[1-5][sS]*\]}\S\+\.ss[tm]" oneline
+" image
+syn region sisu_linked contains=sisu_fontface,sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_link start="{" end="}image" oneline
+
+"% "Some Line Operations:
+" bold line
+syn region sisu_bold contains=sisu_strikeout,sisu_identifier,sisu_content_endnote,sisu_mark_endnote,sisu_error,sisu_error_wspace matchgroup=sisu_markpara start="^!_ " end=" \\\\\|$"
+" indent and bullet paragraph
+syn region sisu_normal contains=sisu_fontface,sisu_bold,sisu_control,sisu_identifier,sisu_content_endnote,sisu_mark_endnote,sisu_link,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker,sisu_linked,sisu_error,sisu_error_wspace matchgroup=sisu_markpara start="^_\([1-9*]\|[1-9]\*\) " end="$"
+" indent and bullet (bold start) paragraph
+syn region sisu_bold contains=sisu_fontface,sisu_bold,sisu_control,sisu_identifier,sisu_content_endnote,sisu_mark_endnote,sisu_link,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker,sisu_linked,sisu_error,sisu_error_wspace matchgroup=sisu_markpara start="^_\([1-9*]\|[1-9]\*\)!_\? " end=" \\\\\|$"
+" hanging indent paragraph [proposed]
+syn region sisu_normal contains=sisu_fontface,sisu_bold,sisu_control,sisu_identifier,sisu_content_endnote,sisu_mark_endnote,sisu_link,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker,sisu_linked,sisu_error,sisu_error_wspace matchgroup=sisu_markpara start="^_[0-9]\?_[0-9] " end="$"
+" hanging indent (bold start/ definition) paragraph [proposed]
+syn region sisu_bold contains=sisu_fontface,sisu_bold,sisu_control,sisu_identifier,sisu_content_endnote,sisu_mark_endnote,sisu_link,sisu_sem_block,sisu_sem_content,sisu_sem_marker_block,sisu_sem_marker,sisu_sem_ex_marker_block,sisu_sem_ex_marker,sisu_linked,sisu_error,sisu_error_wspace matchgroup=sisu_markpara start="^_[0-9]\?_[0-9]!_\? " end=" \\\\\|$"
+" list numbering
+syn region sisu_normal contains=sisu_strikeout,sisu_identifier,sisu_content_endnote,sisu_mark_endnote,sisu_link,sisu_linked,sisu_error,sisu_error_wspace matchgroup=sisu_markpara start="^\(#[ 1]\|_# \)" end="$"
+
+"% "Font Face Curly Brackets:
+"syn region sisu_identifier contains=sisu_strikeout,sisu_number,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_sem start="\S\+:{" end="}:[^<>,.!?:; ]\+" oneline
+" book index:
+syn region sisu_index contains=sisu_within_index_ignore,sisu_within_index matchgroup=sisu_index_block start="^={" end="}"
+" emphasis:
+syn region sisu_bold contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_fontface start="\*{" end="}\*"
+" bold:
+syn region sisu_bold contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_fontface start="!{" end="}!"
+" underscore:
+syn region sisu_underline contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_fontface start="_{" end="}_"
+" italics:
+syn region sisu_identifier contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_fontface start="/{" end="}/"
+" added:
+syn region sisu_underline contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_fontface start="+{" end="}+"
+" superscript:
+syn region sisu_identifier contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_fontface start="\^{" end="}\^"
+" subscript:
+syn region sisu_identifier contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_fontface start=",{" end="},"
+" monospace:
+syn region sisu_identifier contains=sisu_strikeout,sisu_number,sisu_bold,sisu_control,sisu_identifier,sisu_error matchgroup=sisu_fontface start="#{" end="}#"
+" strikethrough:
+syn region sisu_strikeout contains=sisu_error matchgroup=sisu_fontface start="-{" end="}-"
+
+"% "Single Words Bold Italicise Etc: (depreciated)
+syn region sisu_bold contains=sisu_error matchgroup=sisu_bold start="\([ (]\|^\)\*[^\|{\n\~\\]"hs=e-1 end="\*"he=e-0 skip="[a-zA-Z0-9']" oneline
+syn region sisu_identifier contains=sisu_error matchgroup=sisu_content_alt start="\([ ]\|^\)/[^{ \|\n\\]"hs=e-1 end="/\[ \.\]" skip="[a-zA-Z0-9']" oneline
+"misc
+syn region sisu_identifier contains=sisu_error matchgroup=sisu_fontface start="\^[^ {\|\n\\]"rs=s+1 end="\^[ ,.;:'})\\\n]" skip="[a-zA-Z0-9']" oneline
+
+"% "Expensive Mode:
+if !exists("sisu_no_expensive")
+else " not Expensive
+ syn region sisu_content_alt matchgroup=sisu_control start="^\s*def\s" matchgroup=NONE end="[?!]\|\>" skip="\.\|\(::\)" oneline
+endif " Expensive?
+
+"% "Headers And Headings: (Document Instructions)
+syn match sisu_control contains=sisu_error,sisu_error_wspace "4\~! \S\+"
+syn region sisu_markpara contains=sisu_error,sisu_error_wspace start="^=begin" end="^=end.*$"
+
+"% "Errors:
+syn match sisu_error_wspace contains=sisu_error_wspace "^\s\+[^:]"
+syn match sisu_error_wspace contains=sisu_error_wspace "\s\s\+"
+syn match sisu_error_wspace contains=sisu_error_wspace "\s\+$"
+syn match sisu_error contains=sisu_error_wspace "\t\+"
+syn match sisu_error contains=sisu_error,sisu_error_wspace "\([^ (][_\\]\||[^ (}]\)https\?:\S\+"
+syn match sisu_error contains=sisu_error "_\?https\?:\S\+[}><]"
+syn match sisu_error contains=sisu_error "\([!*/_\+,^]\){\([^(\}\1)]\)\{-}\n$"
+syn match sisu_error contains=sisu_error "^[\~]{[^{]\{-}\n$"
+syn match sisu_error contains=sisu_error "\s\+.{{"
+syn match sisu_error contains=sisu_error "^\~\s*$"
+syn match sisu_error contains=sisu_error "^0\~.*"
+syn match sisu_error contains=sisu_error "^[1-9]\~\s*$"
+syn match sisu_error contains=sisu_error "^[1-9]\~\S\+\s*$"
+syn match sisu_error contains=sisu_error "[^{]\~\^[^ \)]"
+syn match sisu_error contains=sisu_error "\~\^\s\+\.\s*"
+syn match sisu_error contains=sisu_error "{\~^\S\+"
+syn match sisu_error contains=sisu_error "[_/\*!^]{[ .,:;?><]*}[_/\*!^]"
+syn match sisu_error contains=sisu_error "[^ (\"'(\[][_/\*!]{\|}[_/\*!][a-zA-Z0-9)\]\"']"
+syn match sisu_error contains=sisu_error "<dir>"
+"errors for filetype sisu, though not error in 'metaverse':
+syn match sisu_error contains=sisu_error,sisu_match,sisu_strikeout,sisu_contain,sisu_content_alt,sisu_mark,sisu_break,sisu_number "<[a-zA-Z\/]\+>"
+syn match sisu_error "/\?<\([biu]\)>[^(</\1>)]\{-}\n$"
+
+"% "Error Exceptions:
+syn match sisu_control "\n$" "contains=ALL
+"syn match sisu_control " //"
+syn match sisu_error "%{"
+syn match sisu_error "<br>_\?https\?:\S\+\|_\?https\?:\S\+<br>"
+syn match sisu_error "[><]_\?https\?:\S\+\|_\?https\?:\S\+[><]"
+syn match sisu_comment "^%\{1,2\}.\+"
+
+"% "Definitions Default Highlighting:
+hi def link sisu_normal Normal
+hi def link sisu_bold Statement
+hi def link sisu_header PreProc
+hi def link sisu_header_content Normal
+hi def link sisu_sub_header_title Statement
+hi def link sisu_sub_header_creator Statement
+hi def link sisu_sub_header_date Statement
+hi def link sisu_sub_header_publisher Statement
+hi def link sisu_sub_header_rights Statement
+hi def link sisu_sub_header_classify Statement
+hi def link sisu_sub_header_identifier Statement
+hi def link sisu_sub_header_original Statement
+hi def link sisu_sub_header_links Statement
+hi def link sisu_sub_header_notes Statement
+hi def link sisu_sub_header_make Statement
+hi def link sisu_heading Title
+hi def link sisu_structure Operator
+hi def link sisu_contain Include
+hi def link sisu_mark_endnote Delimiter
+hi def link sisu_require NonText
+hi def link sisu_link NonText
+hi def link sisu_linked String
+hi def link sisu_fontface Delimiter
+hi def link sisu_strikeout DiffDelete
+hi def link sisu_content_alt Special
+hi def link sisu_sem_content SpecialKey
+hi def link sisu_sem_block Special
+hi def link sisu_sem_marker Visual
+"hi def link sisu_sem_marker Structure
+hi def link sisu_sem_marker_block MatchParen
+hi def link sisu_sem_ex_marker FoldColumn
+hi def link sisu_sem_ex_marker_block Folded
+hi def link sisu_sem_ex_content Comment
+"hi def link sisu_sem_ex_content SpecialKey
+hi def link sisu_sem_ex_block Comment
+hi def link sisu_index SpecialKey
+hi def link sisu_index_block Visual
+hi def link sisu_content_endnote Special
+hi def link sisu_control Delimiter
+hi def link sisu_within_index Delimiter
+hi def link sisu_within_index_ignore SpecialKey
+hi def link sisu_ocn Include
+hi def link sisu_number Number
+hi def link sisu_identifier Function
+hi def link sisu_underline Underlined
+hi def link sisu_markpara Include
+hi def link sisu_marktail Include
+hi def link sisu_mark Identifier
+hi def link sisu_break Structure
+hi def link sisu_html Type
+hi def link sisu_action Identifier
+hi def link sisu_comment Comment
+hi def link sisu_error_sem_marker Error
+hi def link sisu_error_wspace Error
+hi def link sisu_error Error
+let b:current_syntax = "sisu"
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/skill.vim b/runtime/syntax/skill.vim
new file mode 100644
index 0000000..47afffc
--- /dev/null
+++ b/runtime/syntax/skill.vim
@@ -0,0 +1,549 @@
+" Vim syntax file
+" Language: SKILL
+" Maintainer: Toby Schaffer <jtschaff@eos.ncsu.edu>
+" Last Change: 2003 May 11
+" Comments: SKILL is a Lisp-like programming language for use in EDA
+" tools from Cadence Design Systems. It allows you to have
+" a programming environment within the Cadence environment
+" that gives you access to the complete tool set and design
+" database. This file also defines syntax highlighting for
+" certain Design Framework II interface functions.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword skillConstants t nil unbound
+
+" enumerate all the SKILL reserved words/functions
+syn match skillFunction "(abs\>"hs=s+1
+syn match skillFunction "\<abs("he=e-1
+syn match skillFunction "(a\=cos\>"hs=s+1
+syn match skillFunction "\<a\=cos("he=e-1
+syn match skillFunction "(add1\>"hs=s+1
+syn match skillFunction "\<add1("he=e-1
+syn match skillFunction "(addDefstructClass\>"hs=s+1
+syn match skillFunction "\<addDefstructClass("he=e-1
+syn match skillFunction "(alias\>"hs=s+1
+syn match skillFunction "\<alias("he=e-1
+syn match skillFunction "(alphalessp\>"hs=s+1
+syn match skillFunction "\<alphalessp("he=e-1
+syn match skillFunction "(alphaNumCmp\>"hs=s+1
+syn match skillFunction "\<alphaNumCmp("he=e-1
+syn match skillFunction "(append1\=\>"hs=s+1
+syn match skillFunction "\<append1\=("he=e-1
+syn match skillFunction "(apply\>"hs=s+1
+syn match skillFunction "\<apply("he=e-1
+syn match skillFunction "(arrayp\>"hs=s+1
+syn match skillFunction "\<arrayp("he=e-1
+syn match skillFunction "(arrayref\>"hs=s+1
+syn match skillFunction "\<arrayref("he=e-1
+syn match skillFunction "(a\=sin\>"hs=s+1
+syn match skillFunction "\<a\=sin("he=e-1
+syn match skillFunction "(assoc\>"hs=s+1
+syn match skillFunction "\<assoc("he=e-1
+syn match skillFunction "(ass[qv]\>"hs=s+1
+syn match skillFunction "\<ass[qv]("he=e-1
+syn match skillFunction "(a\=tan\>"hs=s+1
+syn match skillFunction "\<a\=tan("he=e-1
+syn match skillFunction "(ato[fim]\>"hs=s+1
+syn match skillFunction "\<ato[fim]("he=e-1
+syn match skillFunction "(bcdp\>"hs=s+1
+syn match skillFunction "\<bcdp("he=e-1
+syn match skillKeywords "(begin\>"hs=s+1
+syn match skillKeywords "\<begin("he=e-1
+syn match skillFunction "(booleanp\>"hs=s+1
+syn match skillFunction "\<booleanp("he=e-1
+syn match skillFunction "(boundp\>"hs=s+1
+syn match skillFunction "\<boundp("he=e-1
+syn match skillFunction "(buildString\>"hs=s+1
+syn match skillFunction "\<buildString("he=e-1
+syn match skillFunction "(c[ad]{1,3}r\>"hs=s+1
+syn match skillFunction "\<c[ad]{1,3}r("he=e-1
+syn match skillConditional "(caseq\=\>"hs=s+1
+syn match skillConditional "\<caseq\=("he=e-1
+syn match skillFunction "(ceiling\>"hs=s+1
+syn match skillFunction "\<ceiling("he=e-1
+syn match skillFunction "(changeWorkingDir\>"hs=s+1
+syn match skillFunction "\<changeWorkingDir("he=e-1
+syn match skillFunction "(charToInt\>"hs=s+1
+syn match skillFunction "\<charToInt("he=e-1
+syn match skillFunction "(clearExitProcs\>"hs=s+1
+syn match skillFunction "\<clearExitProcs("he=e-1
+syn match skillFunction "(close\>"hs=s+1
+syn match skillFunction "\<close("he=e-1
+syn match skillFunction "(compareTime\>"hs=s+1
+syn match skillFunction "\<compareTime("he=e-1
+syn match skillFunction "(compress\>"hs=s+1
+syn match skillFunction "\<compress("he=e-1
+syn match skillFunction "(concat\>"hs=s+1
+syn match skillFunction "\<concat("he=e-1
+syn match skillConditional "(cond\>"hs=s+1
+syn match skillConditional "\<cond("he=e-1
+syn match skillFunction "(cons\>"hs=s+1
+syn match skillFunction "\<cons("he=e-1
+syn match skillFunction "(copy\>"hs=s+1
+syn match skillFunction "\<copy("he=e-1
+syn match skillFunction "(copyDefstructDeep\>"hs=s+1
+syn match skillFunction "\<copyDefstructDeep("he=e-1
+syn match skillFunction "(createDir\>"hs=s+1
+syn match skillFunction "\<createDir("he=e-1
+syn match skillFunction "(csh\>"hs=s+1
+syn match skillFunction "\<csh("he=e-1
+syn match skillKeywords "(declare\>"hs=s+1
+syn match skillKeywords "\<declare("he=e-1
+syn match skillKeywords "(declare\(N\|SQN\)\=Lambda\>"hs=s+1
+syn match skillKeywords "\<declare\(N\|SQN\)\=Lambda("he=e-1
+syn match skillKeywords "(defmacro\>"hs=s+1
+syn match skillKeywords "\<defmacro("he=e-1
+syn match skillKeywords "(defprop\>"hs=s+1
+syn match skillKeywords "\<defprop("he=e-1
+syn match skillKeywords "(defstruct\>"hs=s+1
+syn match skillKeywords "\<defstruct("he=e-1
+syn match skillFunction "(defstructp\>"hs=s+1
+syn match skillFunction "\<defstructp("he=e-1
+syn match skillKeywords "(defun\>"hs=s+1
+syn match skillKeywords "\<defun("he=e-1
+syn match skillKeywords "(defUserInitProc\>"hs=s+1
+syn match skillKeywords "\<defUserInitProc("he=e-1
+syn match skillKeywords "(defvar\>"hs=s+1
+syn match skillKeywords "\<defvar("he=e-1
+syn match skillFunction "(delete\(Dir\|File\)\>"hs=s+1
+syn match skillKeywords "\<delete\(Dir\|File\)("he=e-1
+syn match skillFunction "(display\>"hs=s+1
+syn match skillFunction "\<display("he=e-1
+syn match skillFunction "(drain\>"hs=s+1
+syn match skillFunction "\<drain("he=e-1
+syn match skillFunction "(dtpr\>"hs=s+1
+syn match skillFunction "\<dtpr("he=e-1
+syn match skillFunction "(ed\(i\|l\|it\)\=\>"hs=s+1
+syn match skillFunction "\<ed\(i\|l\|it\)\=("he=e-1
+syn match skillFunction "(envobj\>"hs=s+1
+syn match skillFunction "\<envobj("he=e-1
+syn match skillFunction "(equal\>"hs=s+1
+syn match skillFunction "\<equal("he=e-1
+syn match skillFunction "(eqv\=\>"hs=s+1
+syn match skillFunction "\<eqv\=("he=e-1
+syn match skillFunction "(err\>"hs=s+1
+syn match skillFunction "\<err("he=e-1
+syn match skillFunction "(error\>"hs=s+1
+syn match skillFunction "\<error("he=e-1
+syn match skillFunction "(errset\>"hs=s+1
+syn match skillFunction "\<errset("he=e-1
+syn match skillFunction "(errsetstring\>"hs=s+1
+syn match skillFunction "\<errsetstring("he=e-1
+syn match skillFunction "(eval\>"hs=s+1
+syn match skillFunction "\<eval("he=e-1
+syn match skillFunction "(evalstring\>"hs=s+1
+syn match skillFunction "\<evalstring("he=e-1
+syn match skillFunction "(evenp\>"hs=s+1
+syn match skillFunction "\<evenp("he=e-1
+syn match skillFunction "(exists\>"hs=s+1
+syn match skillFunction "\<exists("he=e-1
+syn match skillFunction "(exit\>"hs=s+1
+syn match skillFunction "\<exit("he=e-1
+syn match skillFunction "(exp\>"hs=s+1
+syn match skillFunction "\<exp("he=e-1
+syn match skillFunction "(expandMacro\>"hs=s+1
+syn match skillFunction "\<expandMacro("he=e-1
+syn match skillFunction "(file\(Length\|Seek\|Tell\|TimeModified\)\>"hs=s+1
+syn match skillFunction "\<file\(Length\|Seek\|Tell\|TimeModified\)("he=e-1
+syn match skillFunction "(fixp\=\>"hs=s+1
+syn match skillFunction "\<fixp\=("he=e-1
+syn match skillFunction "(floatp\=\>"hs=s+1
+syn match skillFunction "\<floatp\=("he=e-1
+syn match skillFunction "(floor\>"hs=s+1
+syn match skillFunction "\<floor("he=e-1
+syn match skillRepeat "(for\(all\|each\)\=\>"hs=s+1
+syn match skillRepeat "\<for\(all\|each\)\=("he=e-1
+syn match skillFunction "([fs]\=printf\>"hs=s+1
+syn match skillFunction "\<[fs]\=printf("he=e-1
+syn match skillFunction "(f\=scanf\>"hs=s+1
+syn match skillFunction "\<f\=scanf("he=e-1
+syn match skillFunction "(funobj\>"hs=s+1
+syn match skillFunction "\<funobj("he=e-1
+syn match skillFunction "(gc\>"hs=s+1
+syn match skillFunction "\<gc("he=e-1
+syn match skillFunction "(gensym\>"hs=s+1
+syn match skillFunction "\<gensym("he=e-1
+syn match skillFunction "(get\(_pname\|_string\)\=\>"hs=s+1
+syn match skillFunction "\<get\(_pname\|_string\)\=("he=e-1
+syn match skillFunction "(getc\(har\)\=\>"hs=s+1
+syn match skillFunction "\<getc\(har\)\=("he=e-1
+syn match skillFunction "(getCurrentTime\>"hs=s+1
+syn match skillFunction "\<getCurrentTime("he=e-1
+syn match skillFunction "(getd\>"hs=s+1
+syn match skillFunction "\<getd("he=e-1
+syn match skillFunction "(getDirFiles\>"hs=s+1
+syn match skillFunction "\<getDirFiles("he=e-1
+syn match skillFunction "(getFnWriteProtect\>"hs=s+1
+syn match skillFunction "\<getFnWriteProtect("he=e-1
+syn match skillFunction "(getRunType\>"hs=s+1
+syn match skillFunction "\<getRunType("he=e-1
+syn match skillFunction "(getInstallPath\>"hs=s+1
+syn match skillFunction "\<getInstallPath("he=e-1
+syn match skillFunction "(getqq\=\>"hs=s+1
+syn match skillFunction "\<getqq\=("he=e-1
+syn match skillFunction "(gets\>"hs=s+1
+syn match skillFunction "\<gets("he=e-1
+syn match skillFunction "(getShellEnvVar\>"hs=s+1
+syn match skillFunction "\<getShellEnvVar("he=e-1
+syn match skillFunction "(getSkill\(Path\|Version\)\>"hs=s+1
+syn match skillFunction "\<getSkill\(Path\|Version\)("he=e-1
+syn match skillFunction "(getVarWriteProtect\>"hs=s+1
+syn match skillFunction "\<getVarWriteProtect("he=e-1
+syn match skillFunction "(getVersion\>"hs=s+1
+syn match skillFunction "\<getVersion("he=e-1
+syn match skillFunction "(getWarn\>"hs=s+1
+syn match skillFunction "\<getWarn("he=e-1
+syn match skillFunction "(getWorkingDir\>"hs=s+1
+syn match skillFunction "\<getWorkingDir("he=e-1
+syn match skillRepeat "(go\>"hs=s+1
+syn match skillRepeat "\<go("he=e-1
+syn match skillConditional "(if\>"hs=s+1
+syn match skillConditional "\<if("he=e-1
+syn keyword skillConditional then else
+syn match skillFunction "(index\>"hs=s+1
+syn match skillFunction "\<index("he=e-1
+syn match skillFunction "(infile\>"hs=s+1
+syn match skillFunction "\<infile("he=e-1
+syn match skillFunction "(inportp\>"hs=s+1
+syn match skillFunction "\<inportp("he=e-1
+syn match skillFunction "(in\(Scheme\|Skill\)\>"hs=s+1
+syn match skillFunction "\<in\(Scheme\|Skill\)("he=e-1
+syn match skillFunction "(instring\>"hs=s+1
+syn match skillFunction "\<instring("he=e-1
+syn match skillFunction "(integerp\>"hs=s+1
+syn match skillFunction "\<integerp("he=e-1
+syn match skillFunction "(intToChar\>"hs=s+1
+syn match skillFunction "\<intToChar("he=e-1
+syn match skillFunction "(is\(Callable\|Dir\|Executable\|File\|FileEncrypted\|FileName\|Link\|Macro\|Writable\)\>"hs=s+1
+syn match skillFunction "\<is\(Callable\|Dir\|Executable\|File\|FileEncrypted\|FileName\|Link\|Macro\|Writable\)("he=e-1
+syn match skillKeywords "(n\=lambda\>"hs=s+1
+syn match skillKeywords "\<n\=lambda("he=e-1
+syn match skillKeywords "(last\>"hs=s+1
+syn match skillKeywords "\<last("he=e-1
+syn match skillFunction "(lconc\>"hs=s+1
+syn match skillFunction "\<lconc("he=e-1
+syn match skillFunction "(length\>"hs=s+1
+syn match skillFunction "\<length("he=e-1
+syn match skillKeywords "(let\>"hs=s+1
+syn match skillKeywords "\<let("he=e-1
+syn match skillFunction "(lineread\(string\)\=\>"hs=s+1
+syn match skillFunction "\<lineread\(string\)\=("he=e-1
+syn match skillKeywords "(list\>"hs=s+1
+syn match skillKeywords "\<list("he=e-1
+syn match skillFunction "(listp\>"hs=s+1
+syn match skillFunction "\<listp("he=e-1
+syn match skillFunction "(listToVector\>"hs=s+1
+syn match skillFunction "\<listToVector("he=e-1
+syn match skillFunction "(loadi\=\>"hs=s+1
+syn match skillFunction "\<loadi\=("he=e-1
+syn match skillFunction "(loadstring\>"hs=s+1
+syn match skillFunction "\<loadstring("he=e-1
+syn match skillFunction "(log\>"hs=s+1
+syn match skillFunction "\<log("he=e-1
+syn match skillFunction "(lowerCase\>"hs=s+1
+syn match skillFunction "\<lowerCase("he=e-1
+syn match skillFunction "(makeTable\>"hs=s+1
+syn match skillFunction "\<makeTable("he=e-1
+syn match skillFunction "(makeTempFileName\>"hs=s+1
+syn match skillFunction "\<makeTempFileName("he=e-1
+syn match skillFunction "(makeVector\>"hs=s+1
+syn match skillFunction "\<makeVector("he=e-1
+syn match skillFunction "(map\(c\|can\|car\|list\)\>"hs=s+1
+syn match skillFunction "\<map\(c\|can\|car\|list\)("he=e-1
+syn match skillFunction "(max\>"hs=s+1
+syn match skillFunction "\<max("he=e-1
+syn match skillFunction "(measureTime\>"hs=s+1
+syn match skillFunction "\<measureTime("he=e-1
+syn match skillFunction "(member\>"hs=s+1
+syn match skillFunction "\<member("he=e-1
+syn match skillFunction "(mem[qv]\>"hs=s+1
+syn match skillFunction "\<mem[qv]("he=e-1
+syn match skillFunction "(min\>"hs=s+1
+syn match skillFunction "\<min("he=e-1
+syn match skillFunction "(minusp\>"hs=s+1
+syn match skillFunction "\<minusp("he=e-1
+syn match skillFunction "(mod\(ulo\)\=\>"hs=s+1
+syn match skillFunction "\<mod\(ulo\)\=("he=e-1
+syn match skillKeywords "([mn]\=procedure\>"hs=s+1
+syn match skillKeywords "\<[mn]\=procedure("he=e-1
+syn match skillFunction "(ncon[cs]\>"hs=s+1
+syn match skillFunction "\<ncon[cs]("he=e-1
+syn match skillFunction "(needNCells\>"hs=s+1
+syn match skillFunction "\<needNCells("he=e-1
+syn match skillFunction "(negativep\>"hs=s+1
+syn match skillFunction "\<negativep("he=e-1
+syn match skillFunction "(neq\(ual\)\=\>"hs=s+1
+syn match skillFunction "\<neq\(ual\)\=("he=e-1
+syn match skillFunction "(newline\>"hs=s+1
+syn match skillFunction "\<newline("he=e-1
+syn match skillFunction "(nindex\>"hs=s+1
+syn match skillFunction "\<nindex("he=e-1
+syn match skillFunction "(not\>"hs=s+1
+syn match skillFunction "\<not("he=e-1
+syn match skillFunction "(nth\(cdr\|elem\)\=\>"hs=s+1
+syn match skillFunction "\<nth\(cdr\|elem\)\=("he=e-1
+syn match skillFunction "(null\>"hs=s+1
+syn match skillFunction "\<null("he=e-1
+syn match skillFunction "(numberp\>"hs=s+1
+syn match skillFunction "\<numberp("he=e-1
+syn match skillFunction "(numOpenFiles\>"hs=s+1
+syn match skillFunction "\<numOpenFiles("he=e-1
+syn match skillFunction "(oddp\>"hs=s+1
+syn match skillFunction "\<oddp("he=e-1
+syn match skillFunction "(onep\>"hs=s+1
+syn match skillFunction "\<onep("he=e-1
+syn match skillFunction "(otherp\>"hs=s+1
+syn match skillFunction "\<otherp("he=e-1
+syn match skillFunction "(outfile\>"hs=s+1
+syn match skillFunction "\<outfile("he=e-1
+syn match skillFunction "(outportp\>"hs=s+1
+syn match skillFunction "\<outportp("he=e-1
+syn match skillFunction "(pairp\>"hs=s+1
+syn match skillFunction "\<pairp("he=e-1
+syn match skillFunction "(parseString\>"hs=s+1
+syn match skillFunction "\<parseString("he=e-1
+syn match skillFunction "(plist\>"hs=s+1
+syn match skillFunction "\<plist("he=e-1
+syn match skillFunction "(plusp\>"hs=s+1
+syn match skillFunction "\<plusp("he=e-1
+syn match skillFunction "(portp\>"hs=s+1
+syn match skillFunction "\<portp("he=e-1
+syn match skillFunction "(p\=print\>"hs=s+1
+syn match skillFunction "\<p\=print("he=e-1
+syn match skillFunction "(prependInstallPath\>"hs=s+1
+syn match skillFunction "\<prependInstallPath("he=e-1
+syn match skillFunction "(printl\(ev\|n\)\>"hs=s+1
+syn match skillFunction "\<printl\(ev\|n\)("he=e-1
+syn match skillFunction "(procedurep\>"hs=s+1
+syn match skillFunction "\<procedurep("he=e-1
+syn match skillKeywords "(prog[12n]\=\>"hs=s+1
+syn match skillKeywords "\<prog[12n]\=("he=e-1
+syn match skillFunction "(putd\>"hs=s+1
+syn match skillFunction "\<putd("he=e-1
+syn match skillFunction "(putpropq\{,2}\>"hs=s+1
+syn match skillFunction "\<putpropq\{,2}("he=e-1
+syn match skillFunction "(random\>"hs=s+1
+syn match skillFunction "\<random("he=e-1
+syn match skillFunction "(read\>"hs=s+1
+syn match skillFunction "\<read("he=e-1
+syn match skillFunction "(readString\>"hs=s+1
+syn match skillFunction "\<readString("he=e-1
+syn match skillFunction "(readTable\>"hs=s+1
+syn match skillFunction "\<readTable("he=e-1
+syn match skillFunction "(realp\>"hs=s+1
+syn match skillFunction "\<realp("he=e-1
+syn match skillFunction "(regExit\(After\|Before\)\>"hs=s+1
+syn match skillFunction "\<regExit\(After\|Before\)("he=e-1
+syn match skillFunction "(remainder\>"hs=s+1
+syn match skillFunction "\<remainder("he=e-1
+syn match skillFunction "(remdq\=\>"hs=s+1
+syn match skillFunction "\<remdq\=("he=e-1
+syn match skillFunction "(remExitProc\>"hs=s+1
+syn match skillFunction "\<remExitProc("he=e-1
+syn match skillFunction "(remove\>"hs=s+1
+syn match skillFunction "\<remove("he=e-1
+syn match skillFunction "(remprop\>"hs=s+1
+syn match skillFunction "\<remprop("he=e-1
+syn match skillFunction "(remq\>"hs=s+1
+syn match skillFunction "\<remq("he=e-1
+syn match skillKeywords "(return\>"hs=s+1
+syn match skillKeywords "\<return("he=e-1
+syn match skillFunction "(reverse\>"hs=s+1
+syn match skillFunction "\<reverse("he=e-1
+syn match skillFunction "(rexCompile\>"hs=s+1
+syn match skillFunction "\<rexCompile("he=e-1
+syn match skillFunction "(rexExecute\>"hs=s+1
+syn match skillFunction "\<rexExecute("he=e-1
+syn match skillFunction "(rexMagic\>"hs=s+1
+syn match skillFunction "\<rexMagic("he=e-1
+syn match skillFunction "(rexMatchAssocList\>"hs=s+1
+syn match skillFunction "\<rexMatchAssocList("he=e-1
+syn match skillFunction "(rexMatchList\>"hs=s+1
+syn match skillFunction "\<rexMatchList("he=e-1
+syn match skillFunction "(rexMatchp\>"hs=s+1
+syn match skillFunction "\<rexMatchp("he=e-1
+syn match skillFunction "(rexReplace\>"hs=s+1
+syn match skillFunction "\<rexReplace("he=e-1
+syn match skillFunction "(rexSubstitute\>"hs=s+1
+syn match skillFunction "\<rexSubstitute("he=e-1
+syn match skillFunction "(rindex\>"hs=s+1
+syn match skillFunction "\<rindex("he=e-1
+syn match skillFunction "(round\>"hs=s+1
+syn match skillFunction "\<round("he=e-1
+syn match skillFunction "(rplac[ad]\>"hs=s+1
+syn match skillFunction "\<rplac[ad]("he=e-1
+syn match skillFunction "(schemeTopLevelEnv\>"hs=s+1
+syn match skillFunction "\<schemeTopLevelEnv("he=e-1
+syn match skillFunction "(set\>"hs=s+1
+syn match skillFunction "\<set("he=e-1
+syn match skillFunction "(setarray\>"hs=s+1
+syn match skillFunction "\<setarray("he=e-1
+syn match skillFunction "(setc[ad]r\>"hs=s+1
+syn match skillFunction "\<setc[ad]r("he=e-1
+syn match skillFunction "(setFnWriteProtect\>"hs=s+1
+syn match skillFunction "\<setFnWriteProtect("he=e-1
+syn match skillFunction "(setof\>"hs=s+1
+syn match skillFunction "\<setof("he=e-1
+syn match skillFunction "(setplist\>"hs=s+1
+syn match skillFunction "\<setplist("he=e-1
+syn match skillFunction "(setq\>"hs=s+1
+syn match skillFunction "\<setq("he=e-1
+syn match skillFunction "(setShellEnvVar\>"hs=s+1
+syn match skillFunction "\<setShellEnvVar("he=e-1
+syn match skillFunction "(setSkillPath\>"hs=s+1
+syn match skillFunction "\<setSkillPath("he=e-1
+syn match skillFunction "(setVarWriteProtect\>"hs=s+1
+syn match skillFunction "\<setVarWriteProtect("he=e-1
+syn match skillFunction "(sh\(ell\)\=\>"hs=s+1
+syn match skillFunction "\<sh\(ell\)\=("he=e-1
+syn match skillFunction "(simplifyFilename\>"hs=s+1
+syn match skillFunction "\<simplifyFilename("he=e-1
+syn match skillFunction "(sort\(car\)\=\>"hs=s+1
+syn match skillFunction "\<sort\(car\)\=("he=e-1
+syn match skillFunction "(sqrt\>"hs=s+1
+syn match skillFunction "\<sqrt("he=e-1
+syn match skillFunction "(srandom\>"hs=s+1
+syn match skillFunction "\<srandom("he=e-1
+syn match skillFunction "(sstatus\>"hs=s+1
+syn match skillFunction "\<sstatus("he=e-1
+syn match skillFunction "(strn\=cat\>"hs=s+1
+syn match skillFunction "\<strn\=cat("he=e-1
+syn match skillFunction "(strn\=cmp\>"hs=s+1
+syn match skillFunction "\<strn\=cmp("he=e-1
+syn match skillFunction "(stringp\>"hs=s+1
+syn match skillFunction "\<stringp("he=e-1
+syn match skillFunction "(stringTo\(Function\|Symbol\|Time\)\>"hs=s+1
+syn match skillFunction "\<stringTo\(Function\|Symbol\|Time\)("he=e-1
+syn match skillFunction "(strlen\>"hs=s+1
+syn match skillFunction "\<strlen("he=e-1
+syn match skillFunction "(sub1\>"hs=s+1
+syn match skillFunction "\<sub1("he=e-1
+syn match skillFunction "(subst\>"hs=s+1
+syn match skillFunction "\<subst("he=e-1
+syn match skillFunction "(substring\>"hs=s+1
+syn match skillFunction "\<substring("he=e-1
+syn match skillFunction "(sxtd\>"hs=s+1
+syn match skillFunction "\<sxtd("he=e-1
+syn match skillFunction "(symbolp\>"hs=s+1
+syn match skillFunction "\<symbolp("he=e-1
+syn match skillFunction "(symbolToString\>"hs=s+1
+syn match skillFunction "\<symbolToString("he=e-1
+syn match skillFunction "(symeval\>"hs=s+1
+syn match skillFunction "\<symeval("he=e-1
+syn match skillFunction "(symstrp\>"hs=s+1
+syn match skillFunction "\<symstrp("he=e-1
+syn match skillFunction "(system\>"hs=s+1
+syn match skillFunction "\<system("he=e-1
+syn match skillFunction "(tablep\>"hs=s+1
+syn match skillFunction "\<tablep("he=e-1
+syn match skillFunction "(tableToList\>"hs=s+1
+syn match skillFunction "\<tableToList("he=e-1
+syn match skillFunction "(tailp\>"hs=s+1
+syn match skillFunction "\<tailp("he=e-1
+syn match skillFunction "(tconc\>"hs=s+1
+syn match skillFunction "\<tconc("he=e-1
+syn match skillFunction "(timeToString\>"hs=s+1
+syn match skillFunction "\<timeToString("he=e-1
+syn match skillFunction "(timeToTm\>"hs=s+1
+syn match skillFunction "\<timeToTm("he=e-1
+syn match skillFunction "(tmToTime\>"hs=s+1
+syn match skillFunction "\<tmToTime("he=e-1
+syn match skillFunction "(truncate\>"hs=s+1
+syn match skillFunction "\<truncate("he=e-1
+syn match skillFunction "(typep\=\>"hs=s+1
+syn match skillFunction "\<typep\=("he=e-1
+syn match skillFunction "(unalias\>"hs=s+1
+syn match skillFunction "\<unalias("he=e-1
+syn match skillConditional "(unless\>"hs=s+1
+syn match skillConditional "\<unless("he=e-1
+syn match skillFunction "(upperCase\>"hs=s+1
+syn match skillFunction "\<upperCase("he=e-1
+syn match skillFunction "(vector\(ToList\)\=\>"hs=s+1
+syn match skillFunction "\<vector\(ToList\)\=("he=e-1
+syn match skillFunction "(warn\>"hs=s+1
+syn match skillFunction "\<warn("he=e-1
+syn match skillConditional "(when\>"hs=s+1
+syn match skillConditional "\<when("he=e-1
+syn match skillRepeat "(while\>"hs=s+1
+syn match skillRepeat "\<while("he=e-1
+syn match skillFunction "(write\>"hs=s+1
+syn match skillFunction "\<write("he=e-1
+syn match skillFunction "(writeTable\>"hs=s+1
+syn match skillFunction "\<writeTable("he=e-1
+syn match skillFunction "(xcons\>"hs=s+1
+syn match skillFunction "\<xcons("he=e-1
+syn match skillFunction "(zerop\>"hs=s+1
+syn match skillFunction "\<zerop("he=e-1
+syn match skillFunction "(zxtd\>"hs=s+1
+syn match skillFunction "\<zxtd("he=e-1
+
+" DFII procedural interface routines
+
+" CDF functions
+syn match skillcdfFunctions "(cdf\u\a\+\>"hs=s+1
+syn match skillcdfFunctions "\<cdf\u\a\+("he=e-1
+" graphic editor functions
+syn match skillgeFunctions "(ge\u\a\+\>"hs=s+1
+syn match skillgeFunctions "\<ge\u\a\+("he=e-1
+" human interface functions
+syn match skillhiFunctions "(hi\u\a\+\>"hs=s+1
+syn match skillhiFunctions "\<hi\u\a\+("he=e-1
+" layout editor functions
+syn match skillleFunctions "(le\u\a\+\>"hs=s+1
+syn match skillleFunctions "\<le\u\a\+("he=e-1
+" database|design editor|design flow functions
+syn match skilldbefFunctions "(d[bef]\u\a\+\>"hs=s+1
+syn match skilldbefFunctions "\<d[bef]\u\a\+("he=e-1
+" design management & design data services functions
+syn match skillddFunctions "(dd[s]\=\u\a\+\>"hs=s+1
+syn match skillddFunctions "\<dd[s]\=\u\a\+("he=e-1
+" parameterized cell functions
+syn match skillpcFunctions "(pc\u\a\+\>"hs=s+1
+syn match skillpcFunctions "\<pc\u\a\+("he=e-1
+" tech file functions
+syn match skilltechFunctions "(\(tech\|tc\)\u\a\+\>"hs=s+1
+syn match skilltechFunctions "\<\(tech\|tc\)\u\a\+("he=e-1
+
+" strings
+syn region skillString start=+"+ skip=+\\"+ end=+"+
+
+syn keyword skillTodo contained TODO FIXME XXX
+syn keyword skillNote contained NOTE IMPORTANT
+
+" comments are either C-style or begin with a semicolon
+syn region skillComment start="/\*" end="\*/" contains=skillTodo,skillNote
+syn match skillComment ";.*" contains=skillTodo,skillNote
+syn match skillCommentError "\*/"
+
+syn sync ccomment skillComment minlines=10
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "skill"
+
+" vim: ts=4
diff --git a/runtime/syntax/sl.vim b/runtime/syntax/sl.vim
new file mode 100644
index 0000000..1f6c847
--- /dev/null
+++ b/runtime/syntax/sl.vim
@@ -0,0 +1,107 @@
+" Vim syntax file
+" Language: Renderman shader language
+" Maintainer: Dan Piponi <dan@tanelorn.demon.co.uk>
+" Last Change: 2001 May 09
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A bunch of useful Renderman keywords including special
+" RenderMan control structures
+syn keyword slStatement break return continue
+syn keyword slConditional if else
+syn keyword slRepeat while for
+syn keyword slRepeat illuminance illuminate solar
+
+syn keyword slTodo contained TODO FIXME XXX
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match slSpecial contained "\\[0-9][0-9][0-9]\|\\."
+syn region slString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=slSpecial
+syn match slCharacter "'[^\\]'"
+syn match slSpecialCharacter "'\\.'"
+syn match slSpecialCharacter "'\\[0-9][0-9]'"
+syn match slSpecialCharacter "'\\[0-9][0-9][0-9]'"
+
+"catch errors caused by wrong parenthesis
+syn region slParen transparent start='(' end=')' contains=ALLBUT,slParenError,slIncluded,slSpecial,slTodo,slUserLabel
+syn match slParenError ")"
+syn match slInParen contained "[{}]"
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match slNumber "\<[0-9]\+\(u\=l\=\|lu\|f\)\>"
+"floating point number, with dot, optional exponent
+syn match slFloat "\<[0-9]\+\.[0-9]*\(e[-+]\=[0-9]\+\)\=[fl]\=\>"
+"floating point number, starting with a dot, optional exponent
+syn match slFloat "\.[0-9]\+\(e[-+]\=[0-9]\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match slFloat "\<[0-9]\+e[-+]\=[0-9]\+[fl]\=\>"
+"hex number
+syn match slNumber "\<0x[0-9a-f]\+\(u\=l\=\|lu\)\>"
+"syn match slIdentifier "\<[a-z_][a-z0-9_]*\>"
+syn case match
+
+if exists("sl_comment_strings")
+ " A comment can contain slString, slCharacter and slNumber.
+ " But a "*/" inside a slString in a slComment DOES end the comment! So we
+ " need to use a special type of slString: slCommentString, 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 slCommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region slCommentString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=slSpecial,slCommentSkip
+ syntax region slComment2String contained start=+"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=slSpecial
+ syntax region slComment start="/\*" end="\*/" contains=slTodo,slCommentString,slCharacter,slNumber
+else
+ syn region slComment start="/\*" end="\*/" contains=slTodo
+endif
+syntax match slCommentError "\*/"
+
+syn keyword slOperator sizeof
+syn keyword slType float point color string vector normal matrix void
+syn keyword slStorageClass varying uniform extern
+syn keyword slStorageClass light surface volume displacement transformation imager
+syn keyword slVariable Cs Os P dPdu dPdv N Ng u v du dv s t
+syn keyword slVariable L Cl Ol E I ncomps time Ci Oi
+syn keyword slVariable Ps alpha
+syn keyword slVariable dtime dPdtime
+
+syn sync ccomment slComment minlines=10
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "sl"
+
+" vim: ts=8
diff --git a/runtime/syntax/slang.vim b/runtime/syntax/slang.vim
new file mode 100644
index 0000000..53ede4d
--- /dev/null
+++ b/runtime/syntax/slang.vim
@@ -0,0 +1,89 @@
+" Vim syntax file
+" Language: S-Lang
+" Maintainer: Jan Hlavacek <lahvak@math.ohio-state.edu>
+" Last Change: 980216
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword slangStatement break return continue EXECUTE_ERROR_BLOCK
+syn match slangStatement "\<X_USER_BLOCK[0-4]\>"
+syn keyword slangLabel case
+syn keyword slangConditional !if if else switch
+syn keyword slangRepeat while for _for loop do forever
+syn keyword slangDefinition define typedef variable struct
+syn keyword slangOperator or and andelse orelse shr shl xor not
+syn keyword slangBlock EXIT_BLOCK ERROR_BLOCK
+syn match slangBlock "\<USER_BLOCK[0-4]\>"
+syn keyword slangConstant NULL
+syn keyword slangType Integer_Type Double_Type Complex_Type String_Type Struct_Type Ref_Type Null_Type Array_Type DataType_Type
+
+syn match slangOctal "\<0\d\+\>" contains=slangOctalError
+syn match slangOctalError "[89]\+" contained
+syn match slangHex "\<0[xX][0-9A-Fa-f]*\>"
+syn match slangDecimal "\<[1-9]\d*\>"
+syn match slangFloat "\<\d\+\."
+syn match slangFloat "\<\d\+\.\d\+\([Ee][-+]\=\d\+\)\=\>"
+syn match slangFloat "\<\d\+\.[Ee][-+]\=\d\+\>"
+syn match slangFloat "\<\d\+[Ee][-+]\=\d\+\>"
+syn match slangFloat "\.\d\+\([Ee][-+]\=\d\+\)\=\>"
+syn match slangImaginary "\.\d\+\([Ee][-+]\=\d*\)\=[ij]\>"
+syn match slangImaginary "\<\d\+\(\.\d*\)\=\([Ee][-+]\=\d\+\)\=[ij]\>"
+
+syn region slangString oneline start='"' end='"' skip='\\"'
+syn match slangCharacter "'[^\\]'"
+syn match slangCharacter "'\\.'"
+syn match slangCharacter "'\\[0-7]\{1,3}'"
+syn match slangCharacter "'\\d\d\{1,3}'"
+syn match slangCharacter "'\\x[0-7a-fA-F]\{1,2}'"
+
+syn match slangDelim "[][{};:,]"
+syn match slangOperator "[-%+/&*=<>|!~^@]"
+
+"catch errors caused by wrong parenthesis
+syn region slangParen matchgroup=slangDelim transparent start='(' end=')' contains=ALLBUT,slangParenError
+syn match slangParenError ")"
+
+syn match slangComment "%.*$"
+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.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "slang"
+
+" vim: ts=8
diff --git a/runtime/syntax/slice.vim b/runtime/syntax/slice.vim
new file mode 100644
index 0000000..3a57ece
--- /dev/null
+++ b/runtime/syntax/slice.vim
@@ -0,0 +1,78 @@
+" Vim syntax file
+" Language: Slice (ZeroC's Specification Language for Ice)
+" Maintainer: Morel Bodin <slice06@nym.hush.com>
+" Last Change: 2005 Dec 03
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" The Slice keywords
+
+syn keyword sliceType bool byte double float int long short string void
+syn keyword sliceQualifier const extends idempotent implements local nonmutating out throws
+syn keyword sliceConstruct class enum exception dictionary interface module LocalObject Object sequence struct
+syn keyword sliceQualifier const extends idempotent implements local nonmutating out throws
+syn keyword sliceBoolean false true
+
+" Include directives
+syn region sliceIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match sliceIncluded display contained "<[^>]*>"
+syn match sliceInclude display "^\s*#\s*include\>\s*["<]" contains=sliceIncluded
+
+" Double-include guards
+syn region sliceGuard start="^#\(define\|ifndef\|endif\)" end="$"
+
+" Strings and characters
+syn region sliceString start=+"+ end=+"+
+
+" Numbers (shamelessly ripped from c.vim, only slightly modified)
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match sliceNumbers display transparent "\<\d\|\.\d" contains=sliceNumber,sliceFloat,sliceOctal
+syn match sliceNumber display contained "\d\+"
+"hex number
+syn match sliceNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+" Flag the first zero of an octal number as something special
+syn match sliceOctal display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=sliceOctalZero
+syn match sliceOctalZero display contained "\<0"
+syn match sliceFloat display contained "\d\+f"
+"floating point number, with dot, optional exponent
+syn match sliceFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
+"floating point number, starting with a dot, optional exponent
+syn match sliceFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match sliceFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>"
+" flag an octal number with wrong digits
+syn case match
+
+
+" Comments
+syn region sliceComment start="/\*" end="\*/"
+syn match sliceComment "//.*"
+
+syn sync ccomment sliceComment
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "slice"
+
+" vim: ts=8
diff --git a/runtime/syntax/slpconf.vim b/runtime/syntax/slpconf.vim
new file mode 100644
index 0000000..712ba90
--- /dev/null
+++ b/runtime/syntax/slpconf.vim
@@ -0,0 +1,273 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword slpconfTodo contained TODO FIXME XXX NOTE
+
+syn region slpconfComment display oneline start='^[#;]' end='$'
+ \ contains=slpconfTodo,@Spell
+
+syn match slpconfBegin display '^'
+ \ nextgroup=slpconfTag,
+ \ slpconfComment skipwhite
+
+syn keyword slpconfTag contained net
+ \ nextgroup=slpconfNetTagDot
+
+syn match slpconfNetTagDot contained display '.'
+ \ nextgroup=slpconfNetTag
+
+syn keyword slpconfNetTag contained slp
+ \ nextgroup=slpconfNetSlpTagdot
+
+syn match slpconfNetSlpTagDot contained display '.'
+ \ nextgroup=slpconfNetSlpTag
+
+syn keyword slpconfNetSlpTag contained isDA traceDATraffic traceMsg
+ \ traceDrop traceReg isBroadcastOnly
+ \ passiveDADetection securityEnabled
+ \ nextgroup=slpconfBooleanEq,slpconfBooleanHome
+ \ skipwhite
+
+syn match slpconfBooleanHome contained display
+ \ '\.\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfBooleanEq skipwhite
+
+syn match slpconfBooleanEq contained display '='
+ \ nextgroup=slpconfBoolean skipwhite
+
+syn keyword slpconfBoolean contained true false TRUE FALSE
+
+syn keyword slpconfNetSlpTag contained DAHeartBeat multicastTTL
+ \ DAActiveDiscoveryInterval
+ \ multicastMaximumWait multicastTimeouts
+ \ randomWaitBound MTU maxResults
+ \ nextgroup=slpconfIntegerEq,slpconfIntegerHome
+ \ skipwhite
+
+syn match slpconfIntegerHome contained display
+ \ '\.\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfIntegerEq skipwhite
+
+syn match slpconfIntegerEq contained display '='
+ \ nextgroup=slpconfInteger skipwhite
+
+syn match slpconfInteger contained display '\<\d\+\>'
+
+syn keyword slpconfNetSlpTag contained DAAttributes SAAttributes
+ \ nextgroup=slpconfAttrEq,slpconfAttrHome
+ \ skipwhite
+
+syn match slpconfAttrHome contained display
+ \ '\.\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfAttrEq skipwhite
+
+syn match slpconfAttrEq contained display '='
+ \ nextgroup=slpconfAttrBegin skipwhite
+
+syn match slpconfAttrBegin contained display '('
+ \ nextgroup=slpconfAttrTag skipwhite
+
+syn match slpconfAttrTag contained display
+ \ '[^* \t_(),\\!<=>~[:cntrl:]]\+'
+ \ nextgroup=slpconfAttrTagEq skipwhite
+
+syn match slpconfAttrTagEq contained display '='
+ \ nextgroup=@slpconfAttrValue skipwhite
+
+syn cluster slpconfAttrValueCon contains=slpconfAttrValueSep,slpconfAttrEnd
+
+syn cluster slpconfAttrValue contains=slpconfAttrIValue,slpconfAttrSValue,
+ \ slpconfAttrBValue,slpconfAttrSSValue
+
+syn match slpconfAttrSValue contained display '[^ (),\\!<=>~[:cntrl:]]\+'
+ \ nextgroup=@slpconfAttrValueCon skipwhite
+
+syn match slpconfAttrSSValue contained display '\\FF\%(\\\x\x\)\+'
+ \ nextgroup=@slpconfAttrValueCon skipwhite
+
+syn match slpconfAttrIValue contained display '[-]\=\d\+\>'
+ \ nextgroup=@slpconfAttrValueCon skipwhite
+
+syn keyword slpconfAttrBValue contained true false
+ \ nextgroup=@slpconfAttrValueCon skipwhite
+
+syn match slpconfAttrValueSep contained display ','
+ \ nextgroup=@slpconfAttrValue skipwhite
+
+syn match slpconfAttrEnd contained display ')'
+ \ nextgroup=slpconfAttrSep skipwhite
+
+syn match slpconfAttrSep contained display ','
+ \ nextgroup=slpconfAttrBegin skipwhite
+
+syn keyword slpconfNetSlpTag contained useScopes typeHint
+ \ nextgroup=slpconfStringsEq,slpconfStringsHome
+ \ skipwhite
+
+syn match slpconfStringsHome contained display
+ \ '\.\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfStringsEq skipwhite
+
+syn match slpconfStringsEq contained display '='
+ \ nextgroup=slpconfStrings skipwhite
+
+syn match slpconfStrings contained display
+ \ '\%([[:digit:][:alpha:]]\|[!-+./:-@[-`{-~-]\|\\\x\x\)\+'
+ \ nextgroup=slpconfStringsSep skipwhite
+
+syn match slpconfStringsSep contained display ','
+ \ nextgroup=slpconfStrings skipwhite
+
+syn keyword slpconfNetSlpTag contained DAAddresses
+ \ nextgroup=slpconfAddressesEq,slpconfAddrsHome
+ \ skipwhite
+
+syn match slpconfAddrsHome contained display
+ \ '\.\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfAddressesEq skipwhite
+
+syn match slpconfAddressesEq contained display '='
+ \ nextgroup=@slpconfAddresses skipwhite
+
+syn cluster slpconfAddresses contains=slpconfFQDNs,slpconfHostnumbers
+
+syn match slpconfFQDNs contained display
+ \ '\a[[:alnum:]-]*[[:alnum:]]\|\a'
+ \ nextgroup=slpconfAddressesSep skipwhite
+
+syn match slpconfHostnumbers contained display
+ \ '\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfAddressesSep skipwhite
+
+syn match slpconfAddressesSep contained display ','
+ \ nextgroup=@slpconfAddresses skipwhite
+
+syn keyword slpconfNetSlpTag contained serializedRegURL
+ \ nextgroup=slpconfStringEq,slpconfStringHome
+ \ skipwhite
+
+syn match slpconfStringHome contained display
+ \ '\.\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfStringEq skipwhite
+
+syn match slpconfStringEq contained display '='
+ \ nextgroup=slpconfString skipwhite
+
+syn match slpconfString contained display
+ \ '\%([!-+./:-@[-`{-~-]\|\\\x\x\)\+\|[[:digit:][:alpha:]]'
+
+syn keyword slpconfNetSlpTag contained multicastTimeouts DADiscoveryTimeouts
+ \ datagramTimeouts
+ \ nextgroup=slpconfIntegersEq,
+ \ slpconfIntegersHome skipwhite
+
+syn match slpconfIntegersHome contained display
+ \ '\.\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfIntegersEq skipwhite
+
+syn match slpconfIntegersEq contained display '='
+ \ nextgroup=slpconfIntegers skipwhite
+
+syn match slpconfIntegers contained display '\<\d\+\>'
+ \ nextgroup=slpconfIntegersSep skipwhite
+
+syn match slpconfIntegersSep contained display ','
+ \ nextgroup=slpconfIntegers skipwhite
+
+syn keyword slpconfNetSlpTag contained interfaces
+ \ nextgroup=slpconfHostnumsEq,
+ \ slpconfHostnumsHome skipwhite
+
+syn match slpconfHostnumsHome contained display
+ \ '\.\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfHostnumsEq skipwhite
+
+syn match slpconfHostnumsEq contained display '='
+ \ nextgroup=slpconfOHostnumbers skipwhite
+
+syn match slpconfOHostnumbers contained display
+ \ '\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfHostnumsSep skipwhite
+
+syn match slpconfHostnumsSep contained display ','
+ \ nextgroup=slpconfOHostnumbers skipwhite
+
+syn keyword slpconfNetSlpTag contained locale
+ \ nextgroup=slpconfLocaleEq,slpconfLocaleHome
+ \ skipwhite
+
+syn match slpconfLocaleHome contained display
+ \ '\.\d\{1,3}\%(\.\d\{1,3}\)\{3}'
+ \ nextgroup=slpconfLocaleEq skipwhite
+
+syn match slpconfLocaleEq contained display '='
+ \ nextgroup=slpconfLocale skipwhite
+
+syn match slpconfLocale contained display '\a\{1,8}\%(-\a\{1,8}\)\='
+
+hi def link slpconfTodo Todo
+hi def link slpconfComment Comment
+hi def link slpconfTag Identifier
+hi def link slpconfDelimiter Delimiter
+hi def link slpconfNetTagDot slpconfDelimiter
+hi def link slpconfNetTag slpconfTag
+hi def link slpconfNetSlpTagDot slpconfNetTagDot
+hi def link slpconfNetSlpTag slpconfTag
+hi def link slpconfHome Special
+hi def link slpconfBooleanHome slpconfHome
+hi def link slpconfEq Operator
+hi def link slpconfBooleanEq slpconfEq
+hi def link slpconfBoolean Boolean
+hi def link slpconfIntegerHome slpconfHome
+hi def link slpconfIntegerEq slpconfEq
+hi def link slpconfInteger Number
+hi def link slpconfAttrHome slpconfHome
+hi def link slpconfAttrEq slpconfEq
+hi def link slpconfAttrBegin slpconfDelimiter
+hi def link slpconfAttrTag slpconfTag
+hi def link slpconfAttrTagEq slpconfEq
+hi def link slpconfAttrIValue slpconfInteger
+hi def link slpconfAttrSValue slpconfString
+hi def link slpconfAttrBValue slpconfBoolean
+hi def link slpconfAttrSSValue slpconfString
+hi def link slpconfSeparator slpconfDelimiter
+hi def link slpconfAttrValueSep slpconfSeparator
+hi def link slpconfAttrEnd slpconfAttrBegin
+hi def link slpconfAttrSep slpconfSeparator
+hi def link slpconfStringsHome slpconfHome
+hi def link slpconfStringsEq slpconfEq
+hi def link slpconfStrings slpconfString
+hi def link slpconfStringsSep slpconfSeparator
+hi def link slpconfAddrsHome slpconfHome
+hi def link slpconfAddressesEq slpconfEq
+hi def link slpconfFQDNs String
+hi def link slpconfHostnumbers Number
+hi def link slpconfAddressesSep slpconfSeparator
+hi def link slpconfStringHome slpconfHome
+hi def link slpconfStringEq slpconfEq
+hi def link slpconfString String
+hi def link slpconfIntegersHome slpconfHome
+hi def link slpconfIntegersEq slpconfEq
+hi def link slpconfIntegers slpconfInteger
+hi def link slpconfIntegersSep slpconfSeparator
+hi def link slpconfHostnumsHome slpconfHome
+hi def link slpconfHostnumsEq slpconfEq
+hi def link slpconfOHostnumbers slpconfHostnumbers
+hi def link slpconfHostnumsSep slpconfSeparator
+hi def link slpconfLocaleHome slpconfHome
+hi def link slpconfLocaleEq slpconfEq
+hi def link slpconfLocale slpconfString
+
+let b:current_syntax = "slpconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/slpreg.vim b/runtime/syntax/slpreg.vim
new file mode 100644
index 0000000..a177b06
--- /dev/null
+++ b/runtime/syntax/slpreg.vim
@@ -0,0 +1,122 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword slpregTodo contained TODO FIXME XXX NOTE
+
+syn region slpregComment display oneline start='^[#;]' end='$'
+ \ contains=slpregTodo,@Spell
+
+syn match slpregBegin display '^'
+ \ nextgroup=slpregServiceURL,
+ \ slpregComment
+
+syn match slpregServiceURL contained display 'service:'
+ \ nextgroup=slpregServiceType
+
+syn match slpregServiceType contained display '\a[[:alpha:][:digit:]+-]*\%(\.\a[[:alpha:][:digit:]+-]*\)\=\%(:\a[[:alpha:][:digit:]+-]*\)\='
+ \ nextgroup=slpregServiceSAPCol
+
+syn match slpregServiceSAPCol contained display ':'
+ \ nextgroup=slpregSAP
+
+syn match slpregSAP contained '[^,]\+'
+ \ nextgroup=slpregLangSep
+"syn match slpregSAP contained display '\%(//\%(\%([[:alpha:][:digit:]$-_.~!*\'(),+;&=]*@\)\=\%([[:alnum:]][[:alnum:]-]*[[:alnum:]]\|[[:alnum:]]\.\)*\%(\a[[:alnum:]-]*[[:alnum:]]\|\a\)\%(:\d\+\)\=\)\=\|/at/\%([[:alpha:][:digit:]$-_.~]\|\\\x\x\)\{1,31}:\%([[:alpha:][:digit:]$-_.~]\|\\\x\x\)\{1,31}\%([[:alpha:][:digit:]$-_.~]\|\\\x\x\)\{1,31}\|/ipx/\x\{8}:\x\{12}:\x\{4}\)\%(/\%([[:alpha:][:digit:]$-_.~!*\'()+;?:@&=+]\|\\\x\x\)*\)*\%(;[^()\\!<=>~[:cntrl:]* \t_]\+\%(=[^()\\!<=>~[:cntrl:] ]\+\)\=\)*'
+
+syn match slpregLangSep contained display ','
+ \ nextgroup=slpregLang
+
+syn match slpregLang contained display '\a\{1,8}\%(-\a\{1,8\}\)\='
+ \ nextgroup=slpregLTimeSep
+
+syn match slpregLTimeSep contained display ','
+ \ nextgroup=slpregLTime
+
+syn match slpregLTime contained display '\d\{1,5}'
+ \ nextgroup=slpregType,slpregUNewline
+
+syn match slpregType contained display '\a[[:alpha:][:digit:]+-]*'
+ \ nextgroup=slpregUNewLine
+
+syn match slpregUNewLine contained '\s*\n'
+ \ nextgroup=slpregScopes,slpregAttrList skipnl
+
+syn keyword slpregScopes contained scopes
+ \ nextgroup=slpregScopesEq
+
+syn match slpregScopesEq contained '=' nextgroup=slpregScopeName
+
+syn match slpregScopeName contained '[^(),\\!<=>[:cntrl:];*+ ]\+'
+ \ nextgroup=slpregScopeNameSep,
+ \ slpregScopeNewline
+
+syn match slpregScopeNameSep contained ','
+ \ nextgroup=slpregScopeName
+
+syn match slpregScopeNewline contained '\s*\n'
+ \ nextgroup=slpregAttribute skipnl
+
+syn match slpregAttribute contained '[^(),\\!<=>[:cntrl:]* \t_]\+'
+ \ nextgroup=slpregAttributeEq,
+ \ slpregScopeNewline
+
+syn match slpregAttributeEq contained '='
+ \ nextgroup=@slpregAttrValue
+
+syn cluster slpregAttrValueCon contains=slpregAttribute,slpregAttrValueSep
+
+syn cluster slpregAttrValue contains=slpregAttrIValue,slpregAttrSValue,
+ \ slpregAttrBValue,slpregAttrSSValue
+
+syn match slpregAttrSValue contained display '[^(),\\!<=>~[:cntrl:]]\+'
+ \ nextgroup=@slpregAttrValueCon skipwhite skipnl
+
+syn match slpregAttrSSValue contained display '\\FF\%(\\\x\x\)\+'
+ \ nextgroup=@slpregAttrValueCon skipwhite skipnl
+
+syn match slpregAttrIValue contained display '[-]\=\d\+\>'
+ \ nextgroup=@slpregAttrValueCon skipwhite skipnl
+
+syn keyword slpregAttrBValue contained true false
+ \ nextgroup=@slpregAttrValueCon skipwhite skipnl
+
+syn match slpregAttrValueSep contained display ','
+ \ nextgroup=@slpregAttrValue skipwhite skipnl
+
+hi def link slpregTodo Todo
+hi def link slpregComment Comment
+hi def link slpregServiceURL Type
+hi def link slpregServiceType slpregServiceURL
+hi def link slpregServiceSAPCol slpregServiceURL
+hi def link slpregSAP slpregServiceURL
+hi def link slpregDelimiter Delimiter
+hi def link slpregLangSep slpregDelimiter
+hi def link slpregLang String
+hi def link slpregLTimeSep slpregDelimiter
+hi def link slpregLTime Number
+hi def link slpregType Type
+hi def link slpregScopes Identifier
+hi def link slpregScopesEq Operator
+hi def link slpregScopeName String
+hi def link slpregScopeNameSep slpregDelimiter
+hi def link slpregAttribute Identifier
+hi def link slpregAttributeEq Operator
+hi def link slpregAttrSValue String
+hi def link slpregAttrSSValue slpregAttrSValue
+hi def link slpregAttrIValue Number
+hi def link slpregAttrBValue Boolean
+hi def link slpregAttrValueSep slpregDelimiter
+
+let b:current_syntax = "slpreg"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/slpspi.vim b/runtime/syntax/slpspi.vim
new file mode 100644
index 0000000..eaeb02a
--- /dev/null
+++ b/runtime/syntax/slpspi.vim
@@ -0,0 +1,39 @@
+" Vim syntax file
+" 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
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword slpspiTodo contained TODO FIXME XXX NOTE
+
+syn region slpspiComment display oneline start='^[#;]' end='$'
+ \ contains=slpspiTodo,@Spell
+
+syn match slpspiBegin display '^'
+ \ nextgroup=slpspiKeyType,
+ \ slpspiComment skipwhite
+
+syn keyword slpspiKeyType contained PRIVATE PUBLIC
+ \ nextgroup=slpspiString skipwhite
+
+syn match slpspiString contained '\S\+'
+ \ nextgroup=slpspiKeyFile skipwhite
+
+syn match slpspiKeyFile contained '\S\+'
+
+hi def link slpspiTodo Todo
+hi def link slpspiComment Comment
+hi def link slpspiKeyType Type
+hi def link slpspiString Identifier
+hi def link slpspiKeyFile String
+
+let b:current_syntax = "slpspi"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/slrnrc.vim b/runtime/syntax/slrnrc.vim
new file mode 100644
index 0000000..cf0734a
--- /dev/null
+++ b/runtime/syntax/slrnrc.vim
@@ -0,0 +1,181 @@
+" Vim syntax file
+" Language: Slrn setup file (based on slrn 0.9.8.1)
+" Maintainer: Preben 'Peppe' Guldberg <peppe-vim@wielders.org>
+" Last Change: 23 April 2006
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword slrnrcTodo contained Todo
+
+" In some places whitespace is illegal
+syn match slrnrcSpaceError contained "\s"
+
+syn match slrnrcNumber contained "-\=\<\d\+\>"
+syn match slrnrcNumber contained +'[^']\+'+
+
+syn match slrnrcSpecKey contained +\(\\[er"']\|\^[^'"]\|\\\o\o\o\)+
+
+syn match slrnrcKey contained "\S\+" contains=slrnrcSpecKey
+syn region slrnrcKey contained start=+"+ skip=+\\"+ end=+"+ oneline contains=slrnrcSpecKey
+syn region slrnrcKey contained start=+'+ skip=+\\'+ end=+'+ oneline contains=slrnrcSpecKey
+
+syn match slrnrcSpecChar contained +'+
+syn match slrnrcSpecChar contained +\\[n"]+
+syn match slrnrcSpecChar contained "%[dfmnrs%]"
+
+syn match slrnrcString contained /[^ \t%"']\+/ contains=slrnrcSpecChar
+syn region slrnrcString contained start=+"+ skip=+\\"+ end=+"+ oneline contains=slrnrcSpecChar
+
+syn match slrnSlangPreCondit "^#\s*ifn\=\(def\>\|false\>\|true\>\|\$\)"
+syn match slrnSlangPreCondit "^#\s*e\(lif\|lse\|ndif\)\>"
+
+syn match slrnrcComment "%.*$" contains=slrnrcTodo
+
+syn keyword slrnrcVarInt contained abort_unmodified_edits article_window_page_overlap auto_mark_article_as_read beep broken_xref broken_xref cc_followup check_new_groups
+syn keyword slrnrcVarInt contained color_by_score confirm_actions custom_sort_by_threads display_cursor_bar drop_bogus_groups editor_uses_mime_charset emphasized_text_mask
+syn keyword slrnrcVarInt contained emphasized_text_mode fold_headers fold_headers followup_strip_signature force_authentication force_authentication generate_date_header
+syn keyword slrnrcVarInt contained generate_email_from generate_email_from generate_message_id grouplens_port hide_pgpsignature hide_quotes hide_signature
+syn keyword slrnrcVarInt contained hide_verbatim_marks hide_verbatim_text highlight_unread_subjects highlight_urls ignore_signature kill_score lines_per_update
+syn keyword slrnrcVarInt contained mail_editor_is_mua max_low_score max_queued_groups min_high_score mouse netiquette_warnings new_subject_breaks_threads no_autosave
+syn keyword slrnrcVarInt contained no_backups prefer_head process_verbatim_marks query_next_article query_next_group query_read_group_cutoff read_active reject_long_lines
+syn keyword slrnrcVarInt contained scroll_by_page show_article show_thread_subject simulate_graphic_chars smart_quote sorting_method spoiler_char spoiler_char
+syn keyword slrnrcVarInt contained spoiler_display_mode spoiler_display_mode spool_check_up_on_nov spool_check_up_on_nov uncollapse_threads unsubscribe_new_groups use_blink
+syn keyword slrnrcVarInt contained use_color use_flow_control use_grouplens use_grouplens use_header_numbers use_inews use_inews use_localtime use_metamail use_mime use_mime
+syn keyword slrnrcVarInt contained use_recommended_msg_id use_slrnpull use_slrnpull use_tilde use_tmpdir use_uudeview use_uudeview warn_followup_to wrap_flags wrap_method
+syn keyword slrnrcVarInt contained write_newsrc_flags
+
+" Listed for removal
+syn keyword slrnrcVarInt contained author_display display_author_realname display_score group_dsc_start_column process_verbatum_marks prompt_next_group query_reconnect
+syn keyword slrnrcVarInt contained show_descriptions use_xgtitle
+
+" Match as a "string" too
+syn region slrnrcVarIntStr contained matchgroup=slrnrcVarInt start=+"+ end=+"+ oneline contains=slrnrcVarInt,slrnrcSpaceError
+
+syn keyword slrnrcVarStr contained Xbrowser art_help_line art_status_line cansecret_file cc_post_string charset custom_headers custom_sort_order decode_directory
+syn keyword slrnrcVarStr contained editor_command failed_posts_file followup_custom_headers followup_date_format followup_string followupto_string group_help_line
+syn keyword slrnrcVarStr contained group_status_line grouplens_host grouplens_pseudoname header_help_line header_status_line hostname inews_program macro_directory
+syn keyword slrnrcVarStr contained mail_editor_command metamail_command mime_charset non_Xbrowser organization overview_date_format post_editor_command post_object
+syn keyword slrnrcVarStr contained postpone_directory printer_name quote_string realname reply_custom_headers reply_string replyto save_directory save_posts save_replies
+syn keyword slrnrcVarStr contained score_editor_command scorefile sendmail_command server_object signature signoff_string spool_active_file spool_activetimes_file
+syn keyword slrnrcVarStr contained spool_inn_root spool_newsgroups_file spool_nov_file spool_nov_root spool_overviewfmt_file spool_root supersedes_custom_headers
+syn keyword slrnrcVarStr contained top_status_line username
+
+" Listed for removal
+syn keyword slrnrcVarStr contained followup cc_followup_string
+
+" Match as a "string" too
+syn region slrnrcVarStrStr contained matchgroup=slrnrcVarStr start=+"+ end=+"+ oneline contains=slrnrcVarStr,slrnrcSpaceError
+
+" Various commands
+syn region slrnrcCmdLine matchgroup=slrnrcCmd start="\<\(autobaud\|color\|compatible_charsets\|group_display_format\|grouplens_add\|header_display_format\|ignore_quotes\|include\|interpret\|mono\|nnrpaccess\|posting_host\|server\|set\|setkey\|strip_re_regexp\|strip_sig_regexp\|strip_was_regexp\|unsetkey\|visible_headers\)\>" end="$" oneline contains=slrnrc\(String\|Comment\)
+
+" Listed for removal
+syn region slrnrcCmdLine matchgroup=slrnrcCmd start="\<\(cc_followup_string\|decode_directory\|editor_command\|followup\|hostname\|organization\|quote_string\|realname\|replyto\|scorefile\|signature\|username\)\>" end="$" oneline contains=slrnrc\(String\|Comment\)
+
+" Setting variables
+syn keyword slrnrcSet contained set
+syn match slrnrcSetStr "^\s*set\s\+\S\+" skipwhite nextgroup=slrnrcString contains=slrnrcSet,slrnrcVarStr\(Str\)\=
+syn match slrnrcSetInt contained "^\s*set\s\+\S\+" contains=slrnrcSet,slrnrcVarInt\(Str\)\=
+syn match slrnrcSetIntLine "^\s*set\s\+\S\+\s\+\(-\=\d\+\>\|'[^']\+'\)" contains=slrnrcSetInt,slrnrcNumber,slrnrcVarInt
+
+" Color definitions
+syn match slrnrcColorObj contained "\<quotes\d\+\>"
+syn keyword slrnrcColorObj contained article author boldtext box cursor date description error frame from_myself group grouplens_display header_name header_number headers
+syn keyword slrnrcColorObj contained high_score italicstext menu menu_press message neg_score normal pgpsignature pos_score quotes response_char selection signature status
+syn keyword slrnrcColorObj contained subject thread_number tilde tree underlinetext unread_subject url verbatim
+
+" Listed for removal
+syn keyword slrnrcColorObj contained verbatum
+
+syn region slrnrcColorObjStr contained matchgroup=slrnrcColorObj start=+"+ end=+"+ oneline contains=slrnrcColorObj,slrnrcSpaceError
+syn keyword slrnrcColorVal contained default
+syn keyword slrnrcColorVal contained black blue brightblue brightcyan brightgreen brightmagenta brightred brown cyan gray green lightgray magenta red white yellow
+syn region slrnrcColorValStr contained matchgroup=slrnrcColorVal start=+"+ end=+"+ oneline contains=slrnrcColorVal,slrnrcSpaceError
+" Mathcing a function with three arguments
+syn keyword slrnrcColor contained color
+syn match slrnrcColorInit contained "^\s*color\s\+\S\+" skipwhite nextgroup=slrnrcColorVal\(Str\)\= contains=slrnrcColor\(Obj\|ObjStr\)\=
+syn match slrnrcColorLine "^\s*color\s\+\S\+\s\+\S\+" skipwhite nextgroup=slrnrcColorVal\(Str\)\= contains=slrnrcColor\(Init\|Val\|ValStr\)
+
+" Mono settings
+syn keyword slrnrcMonoVal contained blink bold none reverse underline
+syn region slrnrcMonoValStr contained matchgroup=slrnrcMonoVal start=+"+ end=+"+ oneline contains=slrnrcMonoVal,slrnrcSpaceError
+" Color object is inherited
+" Mono needs at least one argument
+syn keyword slrnrcMono contained mono
+syn match slrnrcMonoInit contained "^\s*mono\s\+\S\+" contains=slrnrcMono,slrnrcColorObj\(Str\)\=
+syn match slrnrcMonoLine "^\s*mono\s\+\S\+\s\+\S.*" contains=slrnrcMono\(Init\|Val\|ValStr\),slrnrcComment
+
+" Functions in article mode
+syn keyword slrnrcFunArt contained article_bob article_eob article_left article_line_down article_line_up article_page_down article_page_up article_right article_search
+syn keyword slrnrcFunArt contained author_search_backward author_search_forward browse_url cancel catchup catchup_all create_score decode delete delete_thread digit_arg
+syn keyword slrnrcFunArt contained enlarge_article_window evaluate_cmd exchange_mark expunge fast_quit followup forward forward_digest get_children_headers get_parent_header
+syn keyword slrnrcFunArt contained goto_article goto_last_read grouplens_rate_article header_bob header_eob header_line_down header_line_up header_page_down header_page_up
+syn keyword slrnrcFunArt contained help hide_article locate_article mark_spot next next_high_score next_same_subject pipe post post_postponed previous print quit redraw
+syn keyword slrnrcFunArt contained repeat_last_key reply request save show_spoilers shrink_article_window skip_quotes skip_to_next_group skip_to_previous_group
+syn keyword slrnrcFunArt contained subject_search_backward subject_search_forward supersede suspend tag_header toggle_collapse_threads toggle_header_formats
+syn keyword slrnrcFunArt contained toggle_header_tag toggle_headers toggle_pgpsignature toggle_quotes toggle_rot13 toggle_signature toggle_sort toggle_verbatim_marks
+syn keyword slrnrcFunArt contained toggle_verbatim_text uncatchup uncatchup_all undelete untag_headers view_scores wrap_article zoom_article_window
+
+" Listed for removal
+syn keyword slrnrcFunArt contained art_bob art_eob art_xpunge article_linedn article_lineup article_pagedn article_pageup down enlarge_window goto_beginning goto_end left
+syn keyword slrnrcFunArt contained locate_header_by_msgid pagedn pageup pipe_article prev print_article right scroll_dn scroll_up shrink_window skip_to_prev_group
+syn keyword slrnrcFunArt contained toggle_show_author up
+
+" Functions in group mode
+syn keyword slrnrcFunGroup contained add_group bob catchup digit_arg eob evaluate_cmd group_search group_search_backward group_search_forward help line_down line_up move_group
+syn keyword slrnrcFunGroup contained page_down page_up post post_postponed quit redraw refresh_groups repeat_last_key save_newsrc select_group subscribe suspend
+syn keyword slrnrcFunGroup contained toggle_group_formats toggle_hidden toggle_list_all toggle_scoring transpose_groups uncatchup unsubscribe
+
+" Listed for removal
+syn keyword slrnrcFunGroup contained down group_bob group_eob pagedown pageup toggle_group_display uncatch_up up
+
+" Functions in readline mode (actually from slang's slrline.c)
+syn keyword slrnrcFunRead contained bdel bol complete cycle del delbol delbow deleol down enter eol left quoted_insert right self_insert trim up
+
+" Binding keys
+syn keyword slrnrcSetkeyObj contained article group readline
+syn region slrnrcSetkeyObjStr contained matchgroup=slrnrcSetkeyObj start=+"+ end=+"+ oneline contains=slrnrcSetkeyObj
+syn match slrnrcSetkeyArt contained '\("\=\)\<article\>\1\s\+\S\+' skipwhite nextgroup=slrnrcKey contains=slrnrcSetKeyObj\(Str\)\=,slrnrcFunArt
+syn match slrnrcSetkeyGroup contained '\("\=\)\<group\>\1\s\+\S\+' skipwhite nextgroup=slrnrcKey contains=slrnrcSetKeyObj\(Str\)\=,slrnrcFunGroup
+syn match slrnrcSetkeyRead contained '\("\=\)\<readline\>\1\s\+\S\+' skipwhite nextgroup=slrnrcKey contains=slrnrcSetKeyObj\(Str\)\=,slrnrcFunRead
+syn match slrnrcSetkey "^\s*setkey\>" skipwhite nextgroup=slrnrcSetkeyArt,slrnrcSetkeyGroup,slrnrcSetkeyRead
+
+" Unbinding keys
+syn match slrnrcUnsetkey '^\s*unsetkey\s\+\("\)\=\(article\|group\|readline\)\>\1' skipwhite nextgroup=slrnrcKey contains=slrnrcSetkeyObj\(Str\)\=
+
+" Define the default highlighting.
+" 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"
+
+"EOF vim: ts=8 noet tw=120 sw=8 sts=0
diff --git a/runtime/syntax/slrnsc.vim b/runtime/syntax/slrnsc.vim
new file mode 100644
index 0000000..9f51cad
--- /dev/null
+++ b/runtime/syntax/slrnsc.vim
@@ -0,0 +1,68 @@
+" Vim syntax file
+" Language: Slrn score file (based on slrn 0.9.8.0)
+" Maintainer: Preben 'Peppe' Guldberg <peppe@wielders.org>
+" Last Change: 8 Oct 2004
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" characters in newsgroup names
+setlocal isk=@,48-57,.,-,_,+
+
+syn match slrnscComment "%.*$"
+syn match slrnscSectionCom ".].*"lc=2
+
+syn match slrnscGroup contained "\(\k\|\*\)\+"
+syn match slrnscNumber contained "\d\+"
+syn match slrnscDate contained "\(\d\{1,2}[-/]\)\{2}\d\{4}"
+syn match slrnscDelim contained ":"
+syn match slrnscComma contained ","
+syn match slrnscOper contained "\~"
+syn match slrnscEsc contained "\\[ecC<>.]"
+syn match slrnscEsc contained "[?^]"
+syn match slrnscEsc contained "[^\\]$\s*$"lc=1
+
+syn keyword slrnscInclude contained include
+syn match slrnscIncludeLine "^\s*Include\s\+\S.*$"
+
+syn region slrnscSection matchgroup=slrnscSectionStd start="^\s*\[" end='\]' contains=slrnscGroup,slrnscComma,slrnscSectionCom
+syn region slrnscSection matchgroup=slrnscSectionNot start="^\s*\[\~" end='\]' contains=slrnscGroup,slrnscCommas,slrnscSectionCom
+
+syn keyword slrnscItem contained Age Bytes Date Expires From Has-Body Lines Message-Id Newsgroup References Subject Xref
+
+syn match slrnscScoreItem contained "%.*$" skipempty nextgroup=slrnscScoreItem contains=slrnscComment
+syn match slrnscScoreItem contained "^\s*Expires:\s*\(\d\{1,2}[-/]\)\{2}\d\{4}\s*$" skipempty nextgroup=slrnscScoreItem contains=slrnscItem,slrnscDelim,slrnscDate
+syn match slrnscScoreItem contained "^\s*\~\=\(Age\|Bytes\|Has-Body\|Lines\):\s*\d\+\s*$" skipempty nextgroup=slrnscScoreItem contains=slrnscOper,slrnscItem,slrnscDelim,slrnscNumber
+syn match slrnscScoreItemFill contained ".*$" skipempty nextgroup=slrnscScoreItem contains=slrnscEsc
+syn match slrnscScoreItem contained "^\s*\~\=\(Date\|From\|Message-Id\|Newsgroup\|References\|Subject\|Xref\):" nextgroup=slrnscScoreItemFill contains=slrnscOper,slrnscItem,slrnscDelim
+syn region slrnscScoreItem contained matchgroup=Special start="^\s*\~\={::\=" end="^\s*}" skipempty nextgroup=slrnscScoreItem contains=slrnscScoreItem
+
+syn keyword slrnscScore contained Score
+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.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "slrnsc"
+
+"EOF vim: ts=8 noet tw=200 sw=8 sts=0
diff --git a/runtime/syntax/sm.vim b/runtime/syntax/sm.vim
new file mode 100644
index 0000000..a16575c
--- /dev/null
+++ b/runtime/syntax/sm.vim
@@ -0,0 +1,80 @@
+" Vim syntax file
+" Language: sendmail
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Oct 25, 2016
+" Version: 9
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SM
+if exists("b:current_syntax")
+ finish
+endif
+
+" Comments
+syn match smComment "^#.*$" contains=@Spell
+
+" Definitions, Classes, Files, Options, Precedence, Trusted Users, Mailers
+syn match smDefine "^[CDF]."
+syn match smDefine "^O[AaBcdDeFfgHiLmNoQqrSsTtuvxXyYzZ]"
+syn match smDefine "^O\s"he=e-1
+syn match smDefine "^M[a-zA-Z0-9]\+,"he=e-1
+syn match smDefine "^T" nextgroup=smTrusted
+syn match smDefine "^P" nextgroup=smMesg
+syn match smTrusted "\S\+$" contained
+syn match smMesg "\S*="he=e-1 contained nextgroup=smPrecedence
+syn match smPrecedence "-\=[0-9]\+" contained
+
+" Header Format H?list-of-mailer-flags?name: format
+syn match smHeaderSep contained "[?:]"
+syn match smHeader "^H\(?[a-zA-Z]\+?\)\=[-a-zA-Z_]\+:" contains=smHeaderSep
+
+" Variables
+syn match smVar "\$[a-z\.\|]"
+
+" Rulesets
+syn match smRuleset "^S\d*"
+
+" Rewriting Rules
+syn match smRewrite "^R" skipwhite nextgroup=smRewriteLhsToken,smRewriteLhsUser
+
+syn match smRewriteLhsUser contained "[^\t$]\+" skipwhite nextgroup=smRewriteLhsToken,smRewriteLhsSep
+syn match smRewriteLhsToken contained "\(\$[-*+]\|\$[-=][A-Za-z]\|\$Y\)\+" skipwhite nextgroup=smRewriteLhsUser,smRewriteLhsSep
+
+syn match smRewriteLhsSep contained "\t\+" skipwhite nextgroup=smRewriteRhsToken,smRewriteRhsUser
+
+syn match smRewriteRhsUser contained "[^\t$]\+" skipwhite nextgroup=smRewriteRhsToken,smRewriteRhsSep
+syn match smRewriteRhsToken contained "\(\$\d\|\$>\d\|\$#\|\$@\|\$:[-_a-zA-Z]\+\|\$[[\]]\|\$@\|\$:\|\$[A-Za-z]\)\+" skipwhite nextgroup=smRewriteRhsUser,smRewriteRhsSep
+
+syn match smRewriteRhsSep contained "\t\+" skipwhite nextgroup=smRewriteComment,smRewriteRhsSep
+syn match smRewriteRhsSep contained "$"
+
+syn match smRewriteComment contained "[^\t$]*$"
+
+" Clauses
+syn match smClauseError "\$\."
+syn match smElse contained "\$|"
+syn match smClauseCont contained "^\t"
+syn region smClause matchgroup=Delimiter start="\$?." matchgroup=Delimiter end="\$\." contains=smElse,smClause,smVar,smClauseCont
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=18
diff --git a/runtime/syntax/smarty.vim b/runtime/syntax/smarty.vim
new file mode 100644
index 0000000..a39c290
--- /dev/null
+++ b/runtime/syntax/smarty.vim
@@ -0,0 +1,76 @@
+" Vim syntax file
+" Language: Smarty Templates
+" Maintainer: Manfred Stienstra manfred.stienstra@dwerg.net
+" Last Change: Mon Nov 4 11:42:23 CET 2002
+" Filenames: *.tpl
+" URL: http://www.dwerg.net/projects/vim/smarty.vim
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+if !exists("main_syntax")
+ " quit when a syntax file was already loaded
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'smarty'
+endif
+
+syn case ignore
+
+runtime! syntax/html.vim
+"syn cluster htmlPreproc add=smartyUnZone
+
+syn match smartyBlock contained "[\[\]]"
+
+syn keyword smartyTagName capture config_load include include_php
+syn keyword smartyTagName insert if elseif else ldelim rdelim literal
+syn keyword smartyTagName php section sectionelse foreach foreachelse
+syn keyword smartyTagName strip assign counter cycle debug eval fetch
+syn keyword smartyTagName html_options html_select_date html_select_time
+syn keyword smartyTagName math popup_init popup html_checkboxes html_image
+syn keyword smartyTagName html_radios html_table mailto textformat
+
+syn keyword smartyModifier cat capitalize count_characters count_paragraphs
+syn keyword smartyModifier count_sentences count_words date_format default
+syn keyword smartyModifier escape indent lower nl2br regex_replace replace
+syn keyword smartyModifier spacify string_format strip strip_tags truncate
+syn keyword smartyModifier upper wordwrap
+
+syn keyword smartyInFunc neq eq
+
+syn keyword smartyProperty contained "file="
+syn keyword smartyProperty contained "loop="
+syn keyword smartyProperty contained "name="
+syn keyword smartyProperty contained "include="
+syn keyword smartyProperty contained "skip="
+syn keyword smartyProperty contained "section="
+
+syn keyword smartyConstant "\$smarty"
+
+syn keyword smartyDot .
+
+syn region smartyZone matchgroup=Delimiter start="{" end="}" contains=smartyProperty, smartyString, smartyBlock, smartyTagName, smartyConstant, smartyInFunc, smartyModifier
+
+syn region htmlString contained start=+"+ end=+"+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,smartyZone
+syn region htmlString contained start=+'+ end=+'+ contains=htmlSpecialChar,javaScriptExpression,@htmlPreproc,smartyZone
+ syn region htmlLink start="<a\>\_[^>]*\<href\>" end="</a>"me=e-4 contains=@Spell,htmlTag,htmlEndTag,htmlSpecialChar,htmlPreProc,htmlComment,javaScript,@htmlPreproc,smartyZone
+
+
+
+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"
+
+if main_syntax == 'smarty'
+ unlet main_syntax
+endif
+
+" vim: ts=8
diff --git a/runtime/syntax/smcl.vim b/runtime/syntax/smcl.vim
new file mode 100644
index 0000000..a5baa47
--- /dev/null
+++ b/runtime/syntax/smcl.vim
@@ -0,0 +1,307 @@
+" smcl.vim -- Vim syntax file for smcl files.
+" Language: SMCL -- Stata Markup and Control Language
+" Maintainer: Jeff Pitblado <jpitblado@stata.com>
+" Last Change: 26apr2006
+" Version: 1.1.2
+
+" Log:
+" 20mar2003 updated the match definition for cmdab
+" 14apr2006 'syntax clear' only under version control
+" check for 'b:current_syntax', removed 'did_smcl_syntax_inits'
+" 26apr2006 changed 'stata_smcl' to 'smcl'
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case match
+
+syn keyword smclCCLword current_date contained
+syn keyword smclCCLword current_time contained
+syn keyword smclCCLword rmsg_time contained
+syn keyword smclCCLword stata_version contained
+syn keyword smclCCLword version contained
+syn keyword smclCCLword born_date contained
+syn keyword smclCCLword flavor contained
+syn keyword smclCCLword SE contained
+syn keyword smclCCLword mode contained
+syn keyword smclCCLword console contained
+syn keyword smclCCLword os contained
+syn keyword smclCCLword osdtl contained
+syn keyword smclCCLword machine_type contained
+syn keyword smclCCLword byteorder contained
+syn keyword smclCCLword sysdir_stata contained
+syn keyword smclCCLword sysdir_updates contained
+syn keyword smclCCLword sysdir_base contained
+syn keyword smclCCLword sysdir_site contained
+syn keyword smclCCLword sysdir_plus contained
+syn keyword smclCCLword sysdir_personal contained
+syn keyword smclCCLword sysdir_oldplace contained
+syn keyword smclCCLword adopath contained
+syn keyword smclCCLword pwd contained
+syn keyword smclCCLword dirsep contained
+syn keyword smclCCLword max_N_theory contained
+syn keyword smclCCLword max_N_current contained
+syn keyword smclCCLword max_k_theory contained
+syn keyword smclCCLword max_k_current contained
+syn keyword smclCCLword max_width_theory contained
+syn keyword smclCCLword max_width_current contained
+syn keyword smclCCLword max_matsize contained
+syn keyword smclCCLword min_matsize contained
+syn keyword smclCCLword max_macrolen contained
+syn keyword smclCCLword macrolen contained
+syn keyword smclCCLword max_cmdlen contained
+syn keyword smclCCLword cmdlen contained
+syn keyword smclCCLword namelen contained
+syn keyword smclCCLword mindouble contained
+syn keyword smclCCLword maxdouble contained
+syn keyword smclCCLword epsdouble contained
+syn keyword smclCCLword minfloat contained
+syn keyword smclCCLword maxfloat contained
+syn keyword smclCCLword epsfloat contained
+syn keyword smclCCLword minlong contained
+syn keyword smclCCLword maxlong contained
+syn keyword smclCCLword minint contained
+syn keyword smclCCLword maxint contained
+syn keyword smclCCLword minbyte contained
+syn keyword smclCCLword maxbyte contained
+syn keyword smclCCLword maxstrvarlen contained
+syn keyword smclCCLword memory contained
+syn keyword smclCCLword maxvar contained
+syn keyword smclCCLword matsize contained
+syn keyword smclCCLword N contained
+syn keyword smclCCLword k contained
+syn keyword smclCCLword width contained
+syn keyword smclCCLword changed contained
+syn keyword smclCCLword filename contained
+syn keyword smclCCLword filedate contained
+syn keyword smclCCLword more contained
+syn keyword smclCCLword rmsg contained
+syn keyword smclCCLword dp contained
+syn keyword smclCCLword linesize contained
+syn keyword smclCCLword pagesize contained
+syn keyword smclCCLword logtype contained
+syn keyword smclCCLword linegap contained
+syn keyword smclCCLword scrollbufsize contained
+syn keyword smclCCLword varlabelpos contained
+syn keyword smclCCLword reventries contained
+syn keyword smclCCLword graphics contained
+syn keyword smclCCLword scheme contained
+syn keyword smclCCLword printcolor contained
+syn keyword smclCCLword adosize contained
+syn keyword smclCCLword maxdb contained
+syn keyword smclCCLword virtual contained
+syn keyword smclCCLword checksum contained
+syn keyword smclCCLword timeout1 contained
+syn keyword smclCCLword timeout2 contained
+syn keyword smclCCLword httpproxy contained
+syn keyword smclCCLword h_current contained
+syn keyword smclCCLword max_matsize contained
+syn keyword smclCCLword min_matsize contained
+syn keyword smclCCLword max_macrolen contained
+syn keyword smclCCLword macrolen contained
+syn keyword smclCCLword max_cmdlen contained
+syn keyword smclCCLword cmdlen contained
+syn keyword smclCCLword namelen contained
+syn keyword smclCCLword mindouble contained
+syn keyword smclCCLword maxdouble contained
+syn keyword smclCCLword epsdouble contained
+syn keyword smclCCLword minfloat contained
+syn keyword smclCCLword maxfloat contained
+syn keyword smclCCLword epsfloat contained
+syn keyword smclCCLword minlong contained
+syn keyword smclCCLword maxlong contained
+syn keyword smclCCLword minint contained
+syn keyword smclCCLword maxint contained
+syn keyword smclCCLword minbyte contained
+syn keyword smclCCLword maxbyte contained
+syn keyword smclCCLword maxstrvarlen contained
+syn keyword smclCCLword memory contained
+syn keyword smclCCLword maxvar contained
+syn keyword smclCCLword matsize contained
+syn keyword smclCCLword N contained
+syn keyword smclCCLword k contained
+syn keyword smclCCLword width contained
+syn keyword smclCCLword changed contained
+syn keyword smclCCLword filename contained
+syn keyword smclCCLword filedate contained
+syn keyword smclCCLword more contained
+syn keyword smclCCLword rmsg contained
+syn keyword smclCCLword dp contained
+syn keyword smclCCLword linesize contained
+syn keyword smclCCLword pagesize contained
+syn keyword smclCCLword logtype contained
+syn keyword smclCCLword linegap contained
+syn keyword smclCCLword scrollbufsize contained
+syn keyword smclCCLword varlabelpos contained
+syn keyword smclCCLword reventries contained
+syn keyword smclCCLword graphics contained
+syn keyword smclCCLword scheme contained
+syn keyword smclCCLword printcolor contained
+syn keyword smclCCLword adosize contained
+syn keyword smclCCLword maxdb contained
+syn keyword smclCCLword virtual contained
+syn keyword smclCCLword checksum contained
+syn keyword smclCCLword timeout1 contained
+syn keyword smclCCLword timeout2 contained
+syn keyword smclCCLword httpproxy contained
+syn keyword smclCCLword httpproxyhost contained
+syn keyword smclCCLword httpproxyport contained
+syn keyword smclCCLword httpproxyauth contained
+syn keyword smclCCLword httpproxyuser contained
+syn keyword smclCCLword httpproxypw contained
+syn keyword smclCCLword trace contained
+syn keyword smclCCLword tracedepth contained
+syn keyword smclCCLword tracesep contained
+syn keyword smclCCLword traceindent contained
+syn keyword smclCCLword traceexapnd contained
+syn keyword smclCCLword tracenumber contained
+syn keyword smclCCLword type contained
+syn keyword smclCCLword level contained
+syn keyword smclCCLword seed contained
+syn keyword smclCCLword searchdefault contained
+syn keyword smclCCLword pi contained
+syn keyword smclCCLword rc contained
+
+" Directive for the contant and current-value class
+syn region smclCCL start=/{ccl / end=/}/ oneline contains=smclCCLword
+
+" The order of the following syntax definitions is roughly that of the on-line
+" documentation for smcl in Stata, from within Stata see help smcl.
+
+" Format directives for line and paragraph modes
+syn match smclFormat /{smcl}/
+syn match smclFormat /{sf\(\|:[^}]\+\)}/
+syn match smclFormat /{it\(\|:[^}]\+\)}/
+syn match smclFormat /{bf\(\|:[^}]\+\)}/
+syn match smclFormat /{inp\(\|:[^}]\+\)}/
+syn match smclFormat /{input\(\|:[^}]\+\)}/
+syn match smclFormat /{err\(\|:[^}]\+\)}/
+syn match smclFormat /{error\(\|:[^}]\+\)}/
+syn match smclFormat /{res\(\|:[^}]\+\)}/
+syn match smclFormat /{result\(\|:[^}]\+\)}/
+syn match smclFormat /{txt\(\|:[^}]\+\)}/
+syn match smclFormat /{text\(\|:[^}]\+\)}/
+syn match smclFormat /{com\(\|:[^}]\+\)}/
+syn match smclFormat /{cmd\(\|:[^}]\+\)}/
+syn match smclFormat /{cmdab:[^:}]\+:[^:}()]*\(\|:\|:(\|:()\)}/
+syn match smclFormat /{hi\(\|:[^}]\+\)}/
+syn match smclFormat /{hilite\(\|:[^}]\+\)}/
+syn match smclFormat /{ul \(on\|off\)}/
+syn match smclFormat /{ul:[^}]\+}/
+syn match smclFormat /{hline\(\| \d\+\| -\d\+\|:[^}]\+\)}/
+syn match smclFormat /{dup \d\+:[^}]\+}/
+syn match smclFormat /{c [^}]\+}/
+syn match smclFormat /{char [^}]\+}/
+syn match smclFormat /{reset}/
+
+" Formatting directives for line mode
+syn match smclFormat /{title:[^}]\+}/
+syn match smclFormat /{center:[^}]\+}/
+syn match smclFormat /{centre:[^}]\+}/
+syn match smclFormat /{center \d\+:[^}]\+}/
+syn match smclFormat /{centre \d\+:[^}]\+}/
+syn match smclFormat /{right:[^}]\+}/
+syn match smclFormat /{lalign \d\+:[^}]\+}/
+syn match smclFormat /{ralign \d\+:[^}]\+}/
+syn match smclFormat /{\.\.\.}/
+syn match smclFormat /{col \d\+}/
+syn match smclFormat /{space \d\+}/
+syn match smclFormat /{tab}/
+
+" Formatting directives for paragraph mode
+syn match smclFormat /{bind:[^}]\+}/
+syn match smclFormat /{break}/
+
+syn match smclFormat /{p}/
+syn match smclFormat /{p \d\+}/
+syn match smclFormat /{p \d\+ \d\+}/
+syn match smclFormat /{p \d\+ \d\+ \d\+}/
+syn match smclFormat /{pstd}/
+syn match smclFormat /{psee}/
+syn match smclFormat /{phang\(\|2\|3\)}/
+syn match smclFormat /{pmore\(\|2\|3\)}/
+syn match smclFormat /{pin\(\|2\|3\)}/
+syn match smclFormat /{p_end}/
+
+syn match smclFormat /{opt \w\+\(\|:\w\+\)\(\|([^)}]*)\)}/
+
+syn match smclFormat /{opth \w*\(\|:\w\+\)(\w*)}/
+syn match smclFormat /{opth "\w\+\((\w\+:[^)}]\+)\)"}/
+syn match smclFormat /{opth \w\+:\w\+(\w\+:[^)}]\+)}/
+
+syn match smclFormat /{dlgtab\s*\(\|\d\+\|\d\+\s\+\d\+\):[^}]\+}/
+
+syn match smclFormat /{p2colset\s\+\d\+\s\+\d\+\s\+\d\+\s\+\d\+}/
+syn match smclFormat /{p2col\s\+:[^{}]*}.*{p_end}/
+syn match smclFormat /{p2col\s\+:{[^{}]*}}.*{p_end}/
+syn match smclFormat /{p2coldent\s*:[^{}]*}.*{p_end}/
+syn match smclFormat /{p2coldent\s*:{[^{}]*}}.*{p_end}/
+syn match smclFormat /{p2line\s*\(\|\d\+\s\+\d\+\)}/
+syn match smclFormat /{p2colreset}/
+
+syn match smclFormat /{synoptset\s\+\d\+\s\+\w\+}/
+syn match smclFormat /{synopt\s*:[^{}]*}.*{p_end}/
+syn match smclFormat /{synopt\s*:{[^{}]*}}.*{p_end}/
+syn match smclFormat /{syntab\s*:[^{}]*}/
+syn match smclFormat /{synopthdr}/
+syn match smclFormat /{synoptline}/
+
+" Link directive for line and paragraph modes
+syn match smclLink /{help [^}]\+}/
+syn match smclLink /{helpb [^}]\+}/
+syn match smclLink /{help_d:[^}]\+}/
+syn match smclLink /{search [^}]\+}/
+syn match smclLink /{search_d:[^}]\+}/
+syn match smclLink /{browse [^}]\+}/
+syn match smclLink /{view [^}]\+}/
+syn match smclLink /{view_d:[^}]\+}/
+syn match smclLink /{news:[^}]\+}/
+syn match smclLink /{net [^}]\+}/
+syn match smclLink /{net_d:[^}]\+}/
+syn match smclLink /{netfrom_d:[^}]\+}/
+syn match smclLink /{ado [^}]\+}/
+syn match smclLink /{ado_d:[^}]\+}/
+syn match smclLink /{update [^}]\+}/
+syn match smclLink /{update_d:[^}]\+}/
+syn match smclLink /{dialog [^}]\+}/
+syn match smclLink /{back:[^}]\+}/
+syn match smclLink /{clearmore:[^}]\+}/
+syn match smclLink /{stata [^}]\+}/
+
+syn match smclLink /{newvar\(\|:[^}]\+\)}/
+syn match smclLink /{var\(\|:[^}]\+\)}/
+syn match smclLink /{varname\(\|:[^}]\+\)}/
+syn match smclLink /{vars\(\|:[^}]\+\)}/
+syn match smclLink /{varlist\(\|:[^}]\+\)}/
+syn match smclLink /{depvar\(\|:[^}]\+\)}/
+syn match smclLink /{depvars\(\|:[^}]\+\)}/
+syn match smclLink /{depvarlist\(\|:[^}]\+\)}/
+syn match smclLink /{indepvars\(\|:[^}]\+\)}/
+
+syn match smclLink /{dtype}/
+syn match smclLink /{ifin}/
+syn match smclLink /{weight}/
+
+" Comment
+syn region smclComment start=/{\*/ end=/}/ oneline
+
+" Strings
+syn region smclString matchgroup=Nothing start=/"/ end=/"/ oneline
+syn region smclEString matchgroup=Nothing start=/`"/ end=/"'/ oneline contains=smclEString
+
+" assign highlight groups
+
+hi def link smclEString smclString
+
+hi def link smclCCLword Statement
+hi def link smclCCL Type
+hi def link smclFormat Statement
+hi def link smclLink Underlined
+hi def link smclComment Comment
+hi def link smclString String
+
+let b:current_syntax = "smcl"
+
+" vim: ts=8
diff --git a/runtime/syntax/smil.vim b/runtime/syntax/smil.vim
new file mode 100644
index 0000000..4cf6e84
--- /dev/null
+++ b/runtime/syntax/smil.vim
@@ -0,0 +1,146 @@
+" Vim syntax file
+" Language: SMIL (Synchronized Multimedia Integration Language)
+" Maintainer: Herve Foucher <Herve.Foucher@helio.org>
+" URL: http://www.helio.org/vim/syntax/smil.vim
+" Last Change: 2012 Feb 03 by Thilo Six
+
+" To learn more about SMIL, please refer to http://www.w3.org/AudioVideo/
+" and to http://www.helio.org/products/smil/tutorial/
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" SMIL is case sensitive
+syn case match
+
+" illegal characters
+syn match smilError "[<>&]"
+syn match smilError "[()&]"
+
+if !exists("main_syntax")
+ let main_syntax = 'smil'
+endif
+
+" tags
+syn match smilSpecial contained "\\\d\d\d\|\\."
+syn match smilSpecial contained "("
+syn match smilSpecial contained "id("
+syn match smilSpecial contained ")"
+syn keyword smilSpecial contained remove freeze true false on off overdub caption new pause replace
+syn keyword smilSpecial contained first last
+syn keyword smilSpecial contained fill meet slice scroll hidden
+syn region smilString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=smilSpecial
+syn region smilString contained start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=smilSpecial
+syn match smilValue contained "=[\t ]*[^'" \t>][^ \t>]*"hs=s+1
+syn region smilEndTag start=+</+ end=+>+ contains=smilTagN,smilTagError
+syn region smilTag start=+<[^/]+ end=+>+ contains=smilTagN,smilString,smilArg,smilValue,smilTagError,smilEvent,smilCssDefinition
+syn match smilTagN contained +<\s*[-a-zA-Z0-9]\++ms=s+1 contains=smilTagName,smilSpecialTagName
+syn match smilTagN contained +</\s*[-a-zA-Z0-9]\++ms=s+2 contains=smilTagName,smilSpecialTagName
+syn match smilTagError contained "[^>]<"ms=s+1
+
+" tag names
+syn keyword smilTagName contained smil head body anchor a switch region layout meta
+syn match smilTagName contained "root-layout"
+syn keyword smilTagName contained par seq
+syn keyword smilTagName contained animation video img audio ref text textstream
+syn match smilTagName contained "\<\(head\|body\)\>"
+
+
+" legal arg names
+syn keyword smilArg contained dur begin end href target id coords show title abstract author copyright alt
+syn keyword smilArg contained left top width height fit src name content fill longdesc repeat type
+syn match smilArg contained "z-index"
+syn match smilArg contained " end-sync"
+syn match smilArg contained " region"
+syn match smilArg contained "background-color"
+syn match smilArg contained "system-bitrate"
+syn match smilArg contained "system-captions"
+syn match smilArg contained "system-overdub-or-caption"
+syn match smilArg contained "system-language"
+syn match smilArg contained "system-required"
+syn match smilArg contained "system-screen-depth"
+syn match smilArg contained "system-screen-size"
+syn match smilArg contained "clip-begin"
+syn match smilArg contained "clip-end"
+syn match smilArg contained "skip-content"
+
+
+" SMIL Boston ext.
+" This are new SMIL functionnalities seen on www.w3.org on August 3rd 1999
+
+" Animation
+syn keyword smilTagName contained animate set move
+syn keyword smilArg contained calcMode from to by additive values origin path
+syn keyword smilArg contained accumulate hold attribute
+syn match smilArg contained "xml:link"
+syn keyword smilSpecial contained discrete linear spline parent layout
+syn keyword smilSpecial contained top left simple
+
+" Linking
+syn keyword smilTagName contained area
+syn keyword smilArg contained actuate behavior inline sourceVolume
+syn keyword smilArg contained destinationVolume destinationPlaystate tabindex
+syn keyword smilArg contained class style lang dir onclick ondblclick onmousedown onmouseup onmouseover onmousemove onmouseout onkeypress onkeydown onkeyup shape nohref accesskey onfocus onblur
+syn keyword smilSpecial contained play pause stop rect circ poly child par seq
+
+" Media Object
+syn keyword smilTagName contained rtpmap
+syn keyword smilArg contained port transport encoding payload clipBegin clipEnd
+syn match smilArg contained "fmt-list"
+
+" Timing and Synchronization
+syn keyword smilTagName contained excl
+syn keyword smilArg contained beginEvent endEvent eventRestart endSync repeatCount repeatDur
+syn keyword smilArg contained syncBehavior syncTolerance
+syn keyword smilSpecial contained canSlip locked
+
+" special characters
+syn match smilSpecialChar "&[^;]*;"
+
+if exists("smil_wrong_comments")
+ syn region smilComment start=+<!--+ end=+-->+
+else
+ syn region smilComment start=+<!+ end=+>+ contains=smilCommentPart,smilCommentError
+ syn match smilCommentError contained "[^><!]"
+ syn region smilCommentPart contained start=+--+ end=+--+
+endif
+syn region smilComment start=+<!DOCTYPE+ keepend end=+>+
+
+" Define the default highlighting.
+" 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"
+
+if main_syntax == 'smil'
+ unlet main_syntax
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/smith.vim b/runtime/syntax/smith.vim
new file mode 100644
index 0000000..b045d3b
--- /dev/null
+++ b/runtime/syntax/smith.vim
@@ -0,0 +1,39 @@
+" Vim syntax file
+" Language: SMITH
+" Maintainer: Rafal M. Sulejman <rms@poczta.onet.pl>
+" Last Change: 21.07.2000
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+
+syn match smithComment ";.*$"
+
+syn match smithNumber "\<[+-]*[0-9]\d*\>"
+
+syn match smithRegister "R[\[]*[0-9]*[\]]*"
+
+syn match smithKeyword "COR\|MOV\|MUL\|NOT\|STOP\|SUB\|NOP\|BLA\|REP"
+
+syn region smithString start=+"+ skip=+\\\\\|\\"+ end=+"+
+
+
+syn case match
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=2
diff --git a/runtime/syntax/sml.vim b/runtime/syntax/sml.vim
new file mode 100644
index 0000000..8f1af3f
--- /dev/null
+++ b/runtime/syntax/sml.vim
@@ -0,0 +1,220 @@
+" Vim syntax file
+" Language: SML
+" Filenames: *.sml *.sig
+" Maintainer: Markus Mottl <markus.mottl@gmail.com>
+" Previous Maintainer: Fabrizio Zeno Cornelli
+" <zeno@filibusta.crema.unimi.it> (invalid)
+" Last Change: 2022 Apr 01
+" 2015 Aug 31 - Fixed opening of modules (Ramana Kumar)
+" 2006 Oct 23 - Fixed character highlighting bug (MM)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Disable spell checking of syntax.
+syn spell notoplevel
+
+" SML is case sensitive.
+syn case match
+
+" lowercase identifier - the standard way to match
+syn match smlLCIdentifier /\<\(\l\|_\)\(\w\|'\)*\>/
+
+syn match smlKeyChar "|"
+
+" Errors
+syn match smlBraceErr "}"
+syn match smlBrackErr "\]"
+syn match smlParenErr ")"
+syn match smlCommentErr "\*)"
+syn match smlThenErr "\<then\>"
+
+" Error-highlighting of "end" without synchronization:
+" as keyword or as error (default)
+if exists("sml_noend_error")
+ syn match smlKeyword "\<end\>"
+else
+ syn match smlEndErr "\<end\>"
+endif
+
+" Some convenient clusters
+syn cluster smlAllErrs contains=smlBraceErr,smlBrackErr,smlParenErr,smlCommentErr,smlEndErr,smlThenErr
+
+syn cluster smlAENoParen contains=smlBraceErr,smlBrackErr,smlCommentErr,smlEndErr,smlThenErr
+
+syn cluster smlContained contains=smlTodo,smlPreDef,smlModParam,smlModParam1,smlPreMPRestr,smlMPRestr,smlMPRestr1,smlMPRestr2,smlMPRestr3,smlModRHS,smlFuncWith,smlFuncStruct,smlModTypeRestr,smlModTRWith,smlWith,smlWithRest,smlModType,smlFullMod
+
+
+" Enclosing delimiters
+syn region smlEncl transparent matchgroup=smlKeyword start="(" matchgroup=smlKeyword end=")" contains=ALLBUT,@smlContained,smlParenErr
+syn region smlEncl transparent matchgroup=smlKeyword start="{" matchgroup=smlKeyword end="}" contains=ALLBUT,@smlContained,smlBraceErr
+syn region smlEncl transparent matchgroup=smlKeyword start="\[" matchgroup=smlKeyword end="\]" contains=ALLBUT,@smlContained,smlBrackErr
+syn region smlEncl transparent matchgroup=smlKeyword start="#\[" matchgroup=smlKeyword end="\]" contains=ALLBUT,@smlContained,smlBrackErr
+
+
+" Comments
+syn region smlComment start="(\*" end="\*)" contains=smlComment,smlTodo,@Spell
+syn keyword smlTodo contained TODO FIXME XXX
+
+
+" let
+syn region smlEnd matchgroup=smlKeyword start="\<let\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
+
+" local
+syn region smlEnd matchgroup=smlKeyword start="\<local\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
+
+" abstype
+syn region smlNone matchgroup=smlKeyword start="\<abstype\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
+
+" begin
+syn region smlEnd matchgroup=smlKeyword start="\<begin\>" matchgroup=smlKeyword end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
+
+" if
+syn region smlNone matchgroup=smlKeyword start="\<if\>" matchgroup=smlKeyword end="\<then\>" contains=ALLBUT,@smlContained,smlThenErr
+
+
+"" Modules
+
+" "struct"
+syn region smlStruct matchgroup=smlModule start="\<struct\>" matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
+
+" "sig"
+syn region smlSig matchgroup=smlModule start="\<sig\>" matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr,smlModule
+syn region smlModSpec matchgroup=smlKeyword start="\<structure\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\>" contained contains=@smlAllErrs,smlComment skipwhite skipempty nextgroup=smlModTRWith,smlMPRestr
+
+" "open"
+syn region smlNone matchgroup=smlKeyword start="\<open\>" matchgroup=smlModule end="\<\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*\>" contains=@smlAllErrs,smlComment
+
+" "structure" - somewhat complicated stuff ;-)
+syn region smlModule matchgroup=smlKeyword start="\<\(structure\|functor\)\>" matchgroup=smlModule end="\<\u\(\w\|'\)*\>" contains=@smlAllErrs,smlComment skipwhite skipempty nextgroup=smlPreDef
+syn region smlPreDef start="."me=e-1 matchgroup=smlKeyword end="\l\|="me=e-1 contained contains=@smlAllErrs,smlComment,smlModParam,smlModTypeRestr,smlModTRWith nextgroup=smlModPreRHS
+syn region smlModParam start="([^*]" end=")" contained contains=@smlAENoParen,smlModParam1
+syn match smlModParam1 "\<\u\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=smlPreMPRestr
+
+syn region smlPreMPRestr start="."me=e-1 end=")"me=e-1 contained contains=@smlAllErrs,smlComment,smlMPRestr,smlModTypeRestr
+
+syn region smlMPRestr start=":" end="."me=e-1 contained contains=@smlComment skipwhite skipempty nextgroup=smlMPRestr1,smlMPRestr2,smlMPRestr3
+syn region smlMPRestr1 matchgroup=smlModule start="\ssig\s\=" matchgroup=smlModule end="\<end\>" contained contains=ALLBUT,@smlContained,smlEndErr,smlModule
+syn region smlMPRestr2 start="\sfunctor\(\s\|(\)\="me=e-1 matchgroup=smlKeyword end="->" contained contains=@smlAllErrs,smlComment,smlModParam skipwhite skipempty nextgroup=smlFuncWith
+syn match smlMPRestr3 "\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*" contained
+syn match smlModPreRHS "=" contained skipwhite skipempty nextgroup=smlModParam,smlFullMod
+syn region smlModRHS start="." end=".\w\|([^*]"me=e-2 contained contains=smlComment skipwhite skipempty nextgroup=smlModParam,smlFullMod
+syn match smlFullMod "\<\u\(\w\|'\)*\(\.\u\(\w\|'\)*\)*" contained skipwhite skipempty nextgroup=smlFuncWith
+
+syn region smlFuncWith start="([^*]"me=e-1 end=")" contained contains=smlComment,smlWith,smlFuncStruct
+syn region smlFuncStruct matchgroup=smlModule start="[^a-zA-Z]struct\>"hs=s+1 matchgroup=smlModule end="\<end\>" contains=ALLBUT,@smlContained,smlEndErr
+
+syn match smlModTypeRestr "\<\w\(\w\|'\)*\(\.\w\(\w\|'\)*\)*\>" contained
+syn region smlModTRWith start=":\s*("hs=s+1 end=")" contained contains=@smlAENoParen,smlWith
+syn match smlWith "\<\(\u\(\w\|'\)*\.\)*\w\(\w\|'\)*\>" contained skipwhite skipempty nextgroup=smlWithRest
+syn region smlWithRest start="[^)]" end=")"me=e-1 contained contains=ALLBUT,@smlContained
+
+" "signature"
+syn region smlKeyword start="\<signature\>" matchgroup=smlModule end="\<\w\(\w\|'\)*\>" contains=smlComment skipwhite skipempty nextgroup=smlMTDef
+syn match smlMTDef "=\s*\w\(\w\|'\)*\>"hs=s+1,me=s
+
+syn keyword smlKeyword and andalso case
+syn keyword smlKeyword datatype else eqtype
+syn keyword smlKeyword exception fn fun handle
+syn keyword smlKeyword in infix infixl infixr
+syn keyword smlKeyword match nonfix of orelse
+syn keyword smlKeyword raise handle type
+syn keyword smlKeyword val where while with withtype
+
+syn keyword smlType bool char exn int list option
+syn keyword smlType real string unit
+
+syn keyword smlOperator div mod not or quot rem
+
+syn keyword smlBoolean true false
+syn match smlConstructor "(\s*)"
+syn match smlConstructor "\[\s*\]"
+syn match smlConstructor "#\[\s*\]"
+syn match smlConstructor "\u\(\w\|'\)*\>"
+
+" Module prefix
+syn match smlModPath "\u\(\w\|'\)*\."he=e-1
+
+syn match smlCharacter +#"\\""\|#"."\|#"\\\d\d\d"+
+syn match smlCharErr +#"\\\d\d"\|#"\\\d"+
+syn region smlString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell
+
+syn match smlFunDef "=>"
+syn match smlRefAssign ":="
+syn match smlTopStop ";;"
+syn match smlOperator "\^"
+syn match smlOperator "::"
+syn match smlAnyVar "\<_\>"
+syn match smlKeyChar "!"
+syn match smlKeyChar ";"
+syn match smlKeyChar "\*"
+syn match smlKeyChar "="
+
+syn match smlNumber "\<-\=\d\+\>"
+syn match smlNumber "\<-\=0[x|X]\x\+\>"
+syn match smlReal "\<-\=\d\+\.\d*\([eE][-+]\=\d\+\)\=[fl]\=\>"
+
+" Synchronization
+syn sync minlines=20
+syn sync maxlines=500
+
+syn sync match smlEndSync grouphere smlEnd "\<begin\>"
+syn sync match smlEndSync groupthere smlEnd "\<end\>"
+syn sync match smlStructSync grouphere smlStruct "\<struct\>"
+syn sync match smlStructSync groupthere smlStruct "\<end\>"
+syn sync match smlSigSync grouphere smlSig "\<sig\>"
+syn sync match smlSigSync groupthere smlSig "\<end\>"
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/snnsnet.vim b/runtime/syntax/snnsnet.vim
new file mode 100644
index 0000000..9dc9e06
--- /dev/null
+++ b/runtime/syntax/snnsnet.vim
@@ -0,0 +1,67 @@
+" Vim syntax file
+" Language: SNNS network file
+" Maintainer: Davide Alberani <alberanid@bigfoot.com>
+" Last Change: 28 Apr 2001
+" Version: 0.2
+" URL: http://digilander.iol.it/alberanid/vim/syntax/snnsnet.vim
+"
+" SNNS http://www-ra.informatik.uni-tuebingen.de/SNNS/
+" is a simulator for neural networks.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match snnsnetTitle "no\."
+syn match snnsnetTitle "type name"
+syn match snnsnetTitle "unit name"
+syn match snnsnetTitle "act\( func\)\="
+syn match snnsnetTitle "out func"
+syn match snnsnetTitle "site\( name\)\="
+syn match snnsnetTitle "site function"
+syn match snnsnetTitle "source:weight"
+syn match snnsnetTitle "unitNo\."
+syn match snnsnetTitle "delta x"
+syn match snnsnetTitle "delta y"
+syn keyword snnsnetTitle typeName unitName bias st position subnet layer sites name target z LLN LUN Toff Soff Ctype
+
+syn match snnsnetType "SNNS network definition file [Vv]\d.\d.*" contains=snnsnetNumbers
+syn match snnsnetType "generated at.*" contains=snnsnetNumbers
+syn match snnsnetType "network name\s*:"
+syn match snnsnetType "source files\s*:"
+syn match snnsnetType "no\. of units\s*:.*" contains=snnsnetNumbers
+syn match snnsnetType "no\. of connections\s*:.*" contains=snnsnetNumbers
+syn match snnsnetType "no\. of unit types\s*:.*" contains=snnsnetNumbers
+syn match snnsnetType "no\. of site types\s*:.*" contains=snnsnetNumbers
+syn match snnsnetType "learning function\s*:"
+syn match snnsnetType "pruning function\s*:"
+syn match snnsnetType "subordinate learning function\s*:"
+syn match snnsnetType "update function\s*:"
+
+syn match snnsnetSection "unit definition section"
+syn match snnsnetSection "unit default section"
+syn match snnsnetSection "site definition section"
+syn match snnsnetSection "type definition section"
+syn match snnsnetSection "connection definition section"
+syn match snnsnetSection "layer definition section"
+syn match snnsnetSection "subnet definition section"
+syn match snnsnetSection "3D translation section"
+syn match snnsnetSection "time delay section"
+
+syn match snnsnetNumbers "\d" contained
+syn match snnsnetComment "#.*$" contains=snnsnetTodo
+syn keyword snnsnetTodo TODO XXX FIXME contained
+
+
+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
+
+
+let b:current_syntax = "snnsnet"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/snnspat.vim b/runtime/syntax/snnspat.vim
new file mode 100644
index 0000000..cb6e9c5
--- /dev/null
+++ b/runtime/syntax/snnspat.vim
@@ -0,0 +1,62 @@
+" Vim syntax file
+" Language: SNNS pattern file
+" Maintainer: Davide Alberani <alberanid@bigfoot.com>
+" Last Change: 2012 Feb 03 by Thilo Six
+" Version: 0.2
+" URL: http://digilander.iol.it/alberanid/vim/syntax/snnspat.vim
+"
+" SNNS http://www-ra.informatik.uni-tuebingen.de/SNNS/
+" is a simulator for neural networks.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" anything that isn't part of the header, a comment or a number
+" is wrong
+syn match snnspatError ".*"
+" hoping that matches any kind of notation...
+syn match snnspatAccepted "\([-+]\=\(\d\+\.\|\.\)\=\d\+\([Ee][-+]\=\d\+\)\=\)"
+syn match snnspatAccepted "\s"
+syn match snnspatBrac "\[\s*\d\+\(\s\|\d\)*\]" contains=snnspatNumbers
+
+" the accepted fields in the header
+syn match snnspatNoHeader "No\. of patterns\s*:\s*" contained
+syn match snnspatNoHeader "No\. of input units\s*:\s*" contained
+syn match snnspatNoHeader "No\. of output units\s*:\s*" contained
+syn match snnspatNoHeader "No\. of variable input dimensions\s*:\s*" contained
+syn match snnspatNoHeader "No\. of variable output dimensions\s*:\s*" contained
+syn match snnspatNoHeader "Maximum input dimensions\s*:\s*" contained
+syn match snnspatNoHeader "Maximum output dimensions\s*:\s*" contained
+syn match snnspatGen "generated at.*" contained contains=snnspatNumbers
+syn match snnspatGen "SNNS pattern definition file [Vv]\d\.\d" contained contains=snnspatNumbers
+
+" the header, what is not an accepted field, is an error
+syn region snnspatHeader start="^SNNS" end="^\s*[-+\.]\=[0-9#]"me=e-2 contains=snnspatNoHeader,snnspatNumbers,snnspatGen,snnspatBrac
+
+" numbers inside the header
+syn match snnspatNumbers "\d" contained
+syn match snnspatComment "#.*$" contains=snnspatTodo
+syn keyword snnspatTodo TODO XXX FIXME contained
+
+
+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
+
+
+let b:current_syntax = "snnspat"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/snnsres.vim b/runtime/syntax/snnsres.vim
new file mode 100644
index 0000000..2f19b67
--- /dev/null
+++ b/runtime/syntax/snnsres.vim
@@ -0,0 +1,50 @@
+" Vim syntax file
+" Language: SNNS result file
+" Maintainer: Davide Alberani <alberanid@bigfoot.com>
+" Last Change: 28 Apr 2001
+" Version: 0.2
+" URL: http://digilander.iol.it/alberanid/vim/syntax/snnsres.vim
+"
+" SNNS http://www-ra.informatik.uni-tuebingen.de/SNNS/
+" is a simulator for neural networks.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" the accepted fields in the header
+syn match snnsresNoHeader "No\. of patterns\s*:\s*" contained
+syn match snnsresNoHeader "No\. of input units\s*:\s*" contained
+syn match snnsresNoHeader "No\. of output units\s*:\s*" contained
+syn match snnsresNoHeader "No\. of variable input dimensions\s*:\s*" contained
+syn match snnsresNoHeader "No\. of variable output dimensions\s*:\s*" contained
+syn match snnsresNoHeader "Maximum input dimensions\s*:\s*" contained
+syn match snnsresNoHeader "Maximum output dimensions\s*:\s*" contained
+syn match snnsresNoHeader "startpattern\s*:\s*" contained
+syn match snnsresNoHeader "endpattern\s*:\s*" contained
+syn match snnsresNoHeader "input patterns included" contained
+syn match snnsresNoHeader "teaching output included" contained
+syn match snnsresGen "generated at.*" contained contains=snnsresNumbers
+syn match snnsresGen "SNNS result file [Vv]\d\.\d" contained contains=snnsresNumbers
+
+" the header, what is not an accepted field, is an error
+syn region snnsresHeader start="^SNNS" end="^\s*[-+\.]\=[0-9#]"me=e-2 contains=snnsresNoHeader,snnsresNumbers,snnsresGen
+
+" numbers inside the header
+syn match snnsresNumbers "\d" contained
+syn match snnsresComment "#.*$" contains=snnsresTodo
+syn keyword snnsresTodo TODO XXX FIXME contained
+
+
+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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/snobol4.vim b/runtime/syntax/snobol4.vim
new file mode 100644
index 0000000..11ce2e0
--- /dev/null
+++ b/runtime/syntax/snobol4.vim
@@ -0,0 +1,113 @@
+" Vim syntax file
+" Language: SNOBOL4
+" Maintainer: Rafal Sulejman <rms@poczta.onet.pl>
+" Site: http://rms.republika.pl/vim/syntax/snobol4.vim
+" 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.
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case ignore
+
+" Snobol4 keywords
+syn keyword snobol4Keyword any apply arb arbno arg array
+syn keyword snobol4Keyword break
+syn keyword snobol4Keyword char clear code collect convert copy
+syn keyword snobol4Keyword data datatype date define detach differ dump dupl
+syn keyword snobol4Keyword endfile eq eval
+syn keyword snobol4Keyword field
+syn keyword snobol4Keyword ge gt ident
+syn keyword snobol4Keyword input integer item
+syn keyword snobol4Keyword le len lgt local lpad lt
+syn keyword snobol4Keyword ne notany
+syn keyword snobol4Keyword opsyn output
+syn keyword snobol4Keyword pos prototype
+syn keyword snobol4Keyword remdr replace rpad rpos rtab rewind
+syn keyword snobol4Keyword size span stoptr
+syn keyword snobol4Keyword tab table time trace trim terminal
+syn keyword snobol4Keyword unload
+syn keyword snobol4Keyword value
+
+" CSNOBOL keywords
+syn keyword snobol4ExtKeyword breakx
+syn keyword snobol4ExtKeyword char chop
+syn keyword snobol4ExtKeyword date delete
+syn keyword snobol4ExtKeyword exp
+syn keyword snobol4ExtKeyword freeze function
+syn keyword snobol4ExtKeyword host
+syn keyword snobol4ExtKeyword io_findunit
+syn keyword snobol4ExtKeyword label lpad leq lge lle llt lne log
+syn keyword snobol4ExtKeyword ord
+syn keyword snobol4ExtKeyword reverse rpad rsort rename
+syn keyword snobol4ExtKeyword serv_listen sset set sort sqrt substr
+syn keyword snobol4ExtKeyword thaw
+syn keyword snobol4ExtKeyword vdiffer
+
+syn region snobol4String matchgroup=Quote start=+"+ end=+"+
+syn region snobol4String matchgroup=Quote start=+'+ end=+'+
+syn match snobol4BogusStatement "^-[^ ][^ ]*"
+syn match snobol4Statement "^-\(include\|copy\|module\|line\|plusopts\|case\|error\|noerrors\|list\|unlist\|execute\|noexecute\|copy\)"
+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\|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 "\(^\|;\)\([\*\|!;#].*$\)"
+
+" Parens matching
+syn cluster snobol4ParenGroup contains=snobol4ParenError
+syn region snobol4Paren transparent start='(' end=')' contains=ALLBUT,@snobol4ParenGroup,snobol4ErrInBracket
+syn match snobol4ParenError display "[\])]"
+syn match snobol4ErrInParen display contained "[\]{}]\|<%\|%>"
+syn region snobol4Bracket transparent start='\[\|<:' end=']\|:>' contains=ALLBUT,@snobol4ParenGroup,snobol4ErrInParen
+syn match snobol4ErrInBracket display contained "[){}]\|<%\|%>"
+
+" optional shell shebang line
+" syn match snobol4Comment "^\#\!.*$"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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/solidity.vim b/runtime/syntax/solidity.vim
new file mode 100644
index 0000000..e552446
--- /dev/null
+++ b/runtime/syntax/solidity.vim
@@ -0,0 +1,173 @@
+" Vim syntax file
+" Language: Solidity
+" Maintainer: Cothi (jiungdev@gmail.com)
+" Original Author: tomlion (https://github.com/tomlion/vim-solidity/blob/master/syntax/solidity.vim)
+" Last Changed: 2022 Sep 27
+"
+" Additional contributors:
+" Modified by thesis (https://github.com/thesis/vim-solidity/blob/main/indent/solidity.vim)
+
+if exists("b:current_syntax")
+ finish
+endif
+
+" keyword
+syn keyword solKeyword abstract anonymous as break calldata case catch constant constructor continue default switch revert require
+syn keyword solKeyword ecrecover addmod mulmod keccak256
+syn keyword solKeyword delete do else emit enum external final for function if immutable import in indexed inline
+syn keyword solKeyword interface internal is let match memory modifier new of payable pragma private public pure override virtual
+syn keyword solKeyword relocatable return returns static storage struct throw try type typeof using
+syn keyword solKeyword var view while
+
+syn keyword solConstant true false wei szabo finney ether seconds minutes hours days weeks years now
+syn keyword solConstant abi block blockhash msg tx this super selfdestruct
+
+syn keyword solBuiltinType mapping address bool
+syn keyword solBuiltinType int int8 int16 int24 int32 int40 int48 int56 int64 int72 int80 int88 int96 int104 int112 int120 int128 int136 int144 int152 int160 int168 int178 int184 int192 int200 int208 int216 int224 int232 int240 int248 int256
+syn keyword solBuiltinType uint uint8 uint16 uint24 uint32 uint40 uint48 uint56 uint64 uint72 uint80 uint88 uint96 uint104 uint112 uint120 uint128 uint136 uint144 uint152 uint160 uint168 uint178 uint184 uint192 uint200 uint208 uint216 uint224 uint232 uint240 uint248 uint256
+syn keyword solBuiltinType fixed
+syn keyword solBuiltinType fixed0x8 fixed0x16 fixed0x24 fixed0x32 fixed0x40 fixed0x48 fixed0x56 fixed0x64 fixed0x72 fixed0x80 fixed0x88 fixed0x96 fixed0x104 fixed0x112 fixed0x120 fixed0x128 fixed0x136 fixed0x144 fixed0x152 fixed0x160 fixed0x168 fixed0x178 fixed0x184 fixed0x192 fixed0x200 fixed0x208 fixed0x216 fixed0x224 fixed0x232 fixed0x240 fixed0x248 fixed0x256
+syn keyword solBuiltinType fixed8x8 fixed8x16 fixed8x24 fixed8x32 fixed8x40 fixed8x48 fixed8x56 fixed8x64 fixed8x72 fixed8x80 fixed8x88 fixed8x96 fixed8x104 fixed8x112 fixed8x120 fixed8x128 fixed8x136 fixed8x144 fixed8x152 fixed8x160 fixed8x168 fixed8x178 fixed8x184 fixed8x192 fixed8x200 fixed8x208 fixed8x216 fixed8x224 fixed8x232 fixed8x240 fixed8x248
+syn keyword solBuiltinType fixed16x8 fixed16x16 fixed16x24 fixed16x32 fixed16x40 fixed16x48 fixed16x56 fixed16x64 fixed16x72 fixed16x80 fixed16x88 fixed16x96 fixed16x104 fixed16x112 fixed16x120 fixed16x128 fixed16x136 fixed16x144 fixed16x152 fixed16x160 fixed16x168 fixed16x178 fixed16x184 fixed16x192 fixed16x200 fixed16x208 fixed16x216 fixed16x224 fixed16x232 fixed16x240
+syn keyword solBuiltinType fixed24x8 fixed24x16 fixed24x24 fixed24x32 fixed24x40 fixed24x48 fixed24x56 fixed24x64 fixed24x72 fixed24x80 fixed24x88 fixed24x96 fixed24x104 fixed24x112 fixed24x120 fixed24x128 fixed24x136 fixed24x144 fixed24x152 fixed24x160 fixed24x168 fixed24x178 fixed24x184 fixed24x192 fixed24x200 fixed24x208 fixed24x216 fixed24x224 fixed24x232
+syn keyword solBuiltinType fixed32x8 fixed32x16 fixed32x24 fixed32x32 fixed32x40 fixed32x48 fixed32x56 fixed32x64 fixed32x72 fixed32x80 fixed32x88 fixed32x96 fixed32x104 fixed32x112 fixed32x120 fixed32x128 fixed32x136 fixed32x144 fixed32x152 fixed32x160 fixed32x168 fixed32x178 fixed32x184 fixed32x192 fixed32x200 fixed32x208 fixed32x216 fixed32x224
+syn keyword solBuiltinType fixed40x8 fixed40x16 fixed40x24 fixed40x32 fixed40x40 fixed40x48 fixed40x56 fixed40x64 fixed40x72 fixed40x80 fixed40x88 fixed40x96 fixed40x104 fixed40x112 fixed40x120 fixed40x128 fixed40x136 fixed40x144 fixed40x152 fixed40x160 fixed40x168 fixed40x178 fixed40x184 fixed40x192 fixed40x200 fixed40x208 fixed40x216
+syn keyword solBuiltinType fixed48x8 fixed48x16 fixed48x24 fixed48x32 fixed48x40 fixed48x48 fixed48x56 fixed48x64 fixed48x72 fixed48x80 fixed48x88 fixed48x96 fixed48x104 fixed48x112 fixed48x120 fixed48x128 fixed48x136 fixed48x144 fixed48x152 fixed48x160 fixed48x168 fixed48x178 fixed48x184 fixed48x192 fixed48x200 fixed48x208
+syn keyword solBuiltinType fixed56x8 fixed56x16 fixed56x24 fixed56x32 fixed56x40 fixed56x48 fixed56x56 fixed56x64 fixed56x72 fixed56x80 fixed56x88 fixed56x96 fixed56x104 fixed56x112 fixed56x120 fixed56x128 fixed56x136 fixed56x144 fixed56x152 fixed56x160 fixed56x168 fixed56x178 fixed56x184 fixed56x192 fixed56x200
+syn keyword solBuiltinType fixed64x8 fixed64x16 fixed64x24 fixed64x32 fixed64x40 fixed64x48 fixed64x56 fixed64x64 fixed64x72 fixed64x80 fixed64x88 fixed64x96 fixed64x104 fixed64x112 fixed64x120 fixed64x128 fixed64x136 fixed64x144 fixed64x152 fixed64x160 fixed64x168 fixed64x178 fixed64x184 fixed64x192
+syn keyword solBuiltinType fixed72x8 fixed72x16 fixed72x24 fixed72x32 fixed72x40 fixed72x48 fixed72x56 fixed72x64 fixed72x72 fixed72x80 fixed72x88 fixed72x96 fixed72x104 fixed72x112 fixed72x120 fixed72x128 fixed72x136 fixed72x144 fixed72x152 fixed72x160 fixed72x168 fixed72x178 fixed72x184
+syn keyword solBuiltinType fixed80x8 fixed80x16 fixed80x24 fixed80x32 fixed80x40 fixed80x48 fixed80x56 fixed80x64 fixed80x72 fixed80x80 fixed80x88 fixed80x96 fixed80x104 fixed80x112 fixed80x120 fixed80x128 fixed80x136 fixed80x144 fixed80x152 fixed80x160 fixed80x168 fixed80x178
+syn keyword solBuiltinType fixed88x8 fixed88x16 fixed88x24 fixed88x32 fixed88x40 fixed88x48 fixed88x56 fixed88x64 fixed88x72 fixed88x80 fixed88x88 fixed88x96 fixed88x104 fixed88x112 fixed88x120 fixed88x128 fixed88x136 fixed88x144 fixed88x152 fixed88x160 fixed88x168
+syn keyword solBuiltinType fixed96x8 fixed96x16 fixed96x24 fixed96x32 fixed96x40 fixed96x48 fixed96x56 fixed96x64 fixed96x72 fixed96x80 fixed96x88 fixed96x96 fixed96x104 fixed96x112 fixed96x120 fixed96x128 fixed96x136 fixed96x144 fixed96x152 fixed96x160
+syn keyword solBuiltinType fixed104x8 fixed104x16 fixed104x24 fixed104x32 fixed104x40 fixed104x48 fixed104x56 fixed104x64 fixed104x72 fixed104x80 fixed104x88 fixed104x96 fixed104x104 fixed104x112 fixed104x120 fixed104x128 fixed104x136 fixed104x144 fixed104x152
+syn keyword solBuiltinType fixed112x8 fixed112x16 fixed112x24 fixed112x32 fixed112x40 fixed112x48 fixed112x56 fixed112x64 fixed112x72 fixed112x80 fixed112x88 fixed112x96 fixed112x104 fixed112x112 fixed112x120 fixed112x128 fixed112x136 fixed112x144
+syn keyword solBuiltinType fixed120x8 fixed120x16 fixed120x24 fixed120x32 fixed120x40 fixed120x48 fixed120x56 fixed120x64 fixed120x72 fixed120x80 fixed120x88 fixed120x96 fixed120x104 fixed120x112 fixed120x120 fixed120x128 fixed120x136
+syn keyword solBuiltinType fixed128x8 fixed128x16 fixed128x24 fixed128x32 fixed128x40 fixed128x48 fixed128x56 fixed128x64 fixed128x72 fixed128x80 fixed128x88 fixed128x96 fixed128x104 fixed128x112 fixed128x120 fixed128x128
+syn keyword solBuiltinType fixed136x8 fixed136x16 fixed136x24 fixed136x32 fixed136x40 fixed136x48 fixed136x56 fixed136x64 fixed136x72 fixed136x80 fixed136x88 fixed136x96 fixed136x104 fixed136x112 fixed136x120
+syn keyword solBuiltinType fixed144x8 fixed144x16 fixed144x24 fixed144x32 fixed144x40 fixed144x48 fixed144x56 fixed144x64 fixed144x72 fixed144x80 fixed144x88 fixed144x96 fixed144x104 fixed144x112
+syn keyword solBuiltinType fixed152x8 fixed152x16 fixed152x24 fixed152x32 fixed152x40 fixed152x48 fixed152x56 fixed152x64 fixed152x72 fixed152x80 fixed152x88 fixed152x96 fixed152x104
+syn keyword solBuiltinType fixed160x8 fixed160x16 fixed160x24 fixed160x32 fixed160x40 fixed160x48 fixed160x56 fixed160x64 fixed160x72 fixed160x80 fixed160x88 fixed160x96
+syn keyword solBuiltinType fixed168x8 fixed168x16 fixed168x24 fixed168x32 fixed168x40 fixed168x48 fixed168x56 fixed168x64 fixed168x72 fixed168x80 fixed168x88
+syn keyword solBuiltinType fixed176x8 fixed176x16 fixed176x24 fixed176x32 fixed176x40 fixed176x48 fixed176x56 fixed176x64 fixed176x72 fixed176x80
+syn keyword solBuiltinType fixed184x8 fixed184x16 fixed184x24 fixed184x32 fixed184x40 fixed184x48 fixed184x56 fixed184x64 fixed184x72
+syn keyword solBuiltinType fixed192x8 fixed192x16 fixed192x24 fixed192x32 fixed192x40 fixed192x48 fixed192x56 fixed192x64
+syn keyword solBuiltinType fixed200x8 fixed200x16 fixed200x24 fixed200x32 fixed200x40 fixed200x48 fixed200x56
+syn keyword solBuiltinType fixed208x8 fixed208x16 fixed208x24 fixed208x32 fixed208x40 fixed208x48
+syn keyword solBuiltinType fixed216x8 fixed216x16 fixed216x24 fixed216x32 fixed216x40
+syn keyword solBuiltinType fixed224x8 fixed224x16 fixed224x24 fixed224x32
+syn keyword solBuiltinType fixed232x8 fixed232x16 fixed232x24
+syn keyword solBuiltinType fixed240x8 fixed240x16
+syn keyword solBuiltinType fixed248x8
+syn keyword solBuiltinType ufixed
+syn keyword solBuiltinType ufixed0x8 ufixed0x16 ufixed0x24 ufixed0x32 ufixed0x40 ufixed0x48 ufixed0x56 ufixed0x64 ufixed0x72 ufixed0x80 ufixed0x88 ufixed0x96 ufixed0x104 ufixed0x112 ufixed0x120 ufixed0x128 ufixed0x136 ufixed0x144 ufixed0x152 ufixed0x160 ufixed0x168 ufixed0x178 ufixed0x184 ufixed0x192 ufixed0x200 ufixed0x208 ufixed0x216 ufixed0x224 ufixed0x232 ufixed0x240 ufixed0x248 ufixed0x256
+syn keyword solBuiltinType ufixed8x8 ufixed8x16 ufixed8x24 ufixed8x32 ufixed8x40 ufixed8x48 ufixed8x56 ufixed8x64 ufixed8x72 ufixed8x80 ufixed8x88 ufixed8x96 ufixed8x104 ufixed8x112 ufixed8x120 ufixed8x128 ufixed8x136 ufixed8x144 ufixed8x152 ufixed8x160 ufixed8x168 ufixed8x178 ufixed8x184 ufixed8x192 ufixed8x200 ufixed8x208 ufixed8x216 ufixed8x224 ufixed8x232 ufixed8x240 ufixed8x248
+syn keyword solBuiltinType ufixed16x8 ufixed16x16 ufixed16x24 ufixed16x32 ufixed16x40 ufixed16x48 ufixed16x56 ufixed16x64 ufixed16x72 ufixed16x80 ufixed16x88 ufixed16x96 ufixed16x104 ufixed16x112 ufixed16x120 ufixed16x128 ufixed16x136 ufixed16x144 ufixed16x152 ufixed16x160 ufixed16x168 ufixed16x178 ufixed16x184 ufixed16x192 ufixed16x200 ufixed16x208 ufixed16x216 ufixed16x224 ufixed16x232 ufixed16x240
+syn keyword solBuiltinType ufixed24x8 ufixed24x16 ufixed24x24 ufixed24x32 ufixed24x40 ufixed24x48 ufixed24x56 ufixed24x64 ufixed24x72 ufixed24x80 ufixed24x88 ufixed24x96 ufixed24x104 ufixed24x112 ufixed24x120 ufixed24x128 ufixed24x136 ufixed24x144 ufixed24x152 ufixed24x160 ufixed24x168 ufixed24x178 ufixed24x184 ufixed24x192 ufixed24x200 ufixed24x208 ufixed24x216 ufixed24x224 ufixed24x232
+syn keyword solBuiltinType ufixed32x8 ufixed32x16 ufixed32x24 ufixed32x32 ufixed32x40 ufixed32x48 ufixed32x56 ufixed32x64 ufixed32x72 ufixed32x80 ufixed32x88 ufixed32x96 ufixed32x104 ufixed32x112 ufixed32x120 ufixed32x128 ufixed32x136 ufixed32x144 ufixed32x152 ufixed32x160 ufixed32x168 ufixed32x178 ufixed32x184 ufixed32x192 ufixed32x200 ufixed32x208 ufixed32x216 ufixed32x224
+syn keyword solBuiltinType ufixed40x8 ufixed40x16 ufixed40x24 ufixed40x32 ufixed40x40 ufixed40x48 ufixed40x56 ufixed40x64 ufixed40x72 ufixed40x80 ufixed40x88 ufixed40x96 ufixed40x104 ufixed40x112 ufixed40x120 ufixed40x128 ufixed40x136 ufixed40x144 ufixed40x152 ufixed40x160 ufixed40x168 ufixed40x178 ufixed40x184 ufixed40x192 ufixed40x200 ufixed40x208 ufixed40x216
+syn keyword solBuiltinType ufixed48x8 ufixed48x16 ufixed48x24 ufixed48x32 ufixed48x40 ufixed48x48 ufixed48x56 ufixed48x64 ufixed48x72 ufixed48x80 ufixed48x88 ufixed48x96 ufixed48x104 ufixed48x112 ufixed48x120 ufixed48x128 ufixed48x136 ufixed48x144 ufixed48x152 ufixed48x160 ufixed48x168 ufixed48x178 ufixed48x184 ufixed48x192 ufixed48x200 ufixed48x208
+syn keyword solBuiltinType ufixed56x8 ufixed56x16 ufixed56x24 ufixed56x32 ufixed56x40 ufixed56x48 ufixed56x56 ufixed56x64 ufixed56x72 ufixed56x80 ufixed56x88 ufixed56x96 ufixed56x104 ufixed56x112 ufixed56x120 ufixed56x128 ufixed56x136 ufixed56x144 ufixed56x152 ufixed56x160 ufixed56x168 ufixed56x178 ufixed56x184 ufixed56x192 ufixed56x200
+syn keyword solBuiltinType ufixed64x8 ufixed64x16 ufixed64x24 ufixed64x32 ufixed64x40 ufixed64x48 ufixed64x56 ufixed64x64 ufixed64x72 ufixed64x80 ufixed64x88 ufixed64x96 ufixed64x104 ufixed64x112 ufixed64x120 ufixed64x128 ufixed64x136 ufixed64x144 ufixed64x152 ufixed64x160 ufixed64x168 ufixed64x178 ufixed64x184 ufixed64x192
+syn keyword solBuiltinType ufixed72x8 ufixed72x16 ufixed72x24 ufixed72x32 ufixed72x40 ufixed72x48 ufixed72x56 ufixed72x64 ufixed72x72 ufixed72x80 ufixed72x88 ufixed72x96 ufixed72x104 ufixed72x112 ufixed72x120 ufixed72x128 ufixed72x136 ufixed72x144 ufixed72x152 ufixed72x160 ufixed72x168 ufixed72x178 ufixed72x184
+syn keyword solBuiltinType ufixed80x8 ufixed80x16 ufixed80x24 ufixed80x32 ufixed80x40 ufixed80x48 ufixed80x56 ufixed80x64 ufixed80x72 ufixed80x80 ufixed80x88 ufixed80x96 ufixed80x104 ufixed80x112 ufixed80x120 ufixed80x128 ufixed80x136 ufixed80x144 ufixed80x152 ufixed80x160 ufixed80x168 ufixed80x178
+syn keyword solBuiltinType ufixed88x8 ufixed88x16 ufixed88x24 ufixed88x32 ufixed88x40 ufixed88x48 ufixed88x56 ufixed88x64 ufixed88x72 ufixed88x80 ufixed88x88 ufixed88x96 ufixed88x104 ufixed88x112 ufixed88x120 ufixed88x128 ufixed88x136 ufixed88x144 ufixed88x152 ufixed88x160 ufixed88x168
+syn keyword solBuiltinType ufixed96x8 ufixed96x16 ufixed96x24 ufixed96x32 ufixed96x40 ufixed96x48 ufixed96x56 ufixed96x64 ufixed96x72 ufixed96x80 ufixed96x88 ufixed96x96 ufixed96x104 ufixed96x112 ufixed96x120 ufixed96x128 ufixed96x136 ufixed96x144 ufixed96x152 ufixed96x160
+syn keyword solBuiltinType ufixed104x8 ufixed104x16 ufixed104x24 ufixed104x32 ufixed104x40 ufixed104x48 ufixed104x56 ufixed104x64 ufixed104x72 ufixed104x80 ufixed104x88 ufixed104x96 ufixed104x104 ufixed104x112 ufixed104x120 ufixed104x128 ufixed104x136 ufixed104x144 ufixed104x152
+syn keyword solBuiltinType ufixed112x8 ufixed112x16 ufixed112x24 ufixed112x32 ufixed112x40 ufixed112x48 ufixed112x56 ufixed112x64 ufixed112x72 ufixed112x80 ufixed112x88 ufixed112x96 ufixed112x104 ufixed112x112 ufixed112x120 ufixed112x128 ufixed112x136 ufixed112x144
+syn keyword solBuiltinType ufixed120x8 ufixed120x16 ufixed120x24 ufixed120x32 ufixed120x40 ufixed120x48 ufixed120x56 ufixed120x64 ufixed120x72 ufixed120x80 ufixed120x88 ufixed120x96 ufixed120x104 ufixed120x112 ufixed120x120 ufixed120x128 ufixed120x136
+syn keyword solBuiltinType ufixed128x8 ufixed128x16 ufixed128x24 ufixed128x32 ufixed128x40 ufixed128x48 ufixed128x56 ufixed128x64 ufixed128x72 ufixed128x80 ufixed128x88 ufixed128x96 ufixed128x104 ufixed128x112 ufixed128x120 ufixed128x128
+syn keyword solBuiltinType ufixed136x8 ufixed136x16 ufixed136x24 ufixed136x32 ufixed136x40 ufixed136x48 ufixed136x56 ufixed136x64 ufixed136x72 ufixed136x80 ufixed136x88 ufixed136x96 ufixed136x104 ufixed136x112 ufixed136x120
+syn keyword solBuiltinType ufixed144x8 ufixed144x16 ufixed144x24 ufixed144x32 ufixed144x40 ufixed144x48 ufixed144x56 ufixed144x64 ufixed144x72 ufixed144x80 ufixed144x88 ufixed144x96 ufixed144x104 ufixed144x112
+syn keyword solBuiltinType ufixed152x8 ufixed152x16 ufixed152x24 ufixed152x32 ufixed152x40 ufixed152x48 ufixed152x56 ufixed152x64 ufixed152x72 ufixed152x80 ufixed152x88 ufixed152x96 ufixed152x104
+syn keyword solBuiltinType ufixed160x8 ufixed160x16 ufixed160x24 ufixed160x32 ufixed160x40 ufixed160x48 ufixed160x56 ufixed160x64 ufixed160x72 ufixed160x80 ufixed160x88 ufixed160x96
+syn keyword solBuiltinType ufixed168x8 ufixed168x16 ufixed168x24 ufixed168x32 ufixed168x40 ufixed168x48 ufixed168x56 ufixed168x64 ufixed168x72 ufixed168x80 ufixed168x88
+syn keyword solBuiltinType ufixed176x8 ufixed176x16 ufixed176x24 ufixed176x32 ufixed176x40 ufixed176x48 ufixed176x56 ufixed176x64 ufixed176x72 ufixed176x80
+syn keyword solBuiltinType ufixed184x8 ufixed184x16 ufixed184x24 ufixed184x32 ufixed184x40 ufixed184x48 ufixed184x56 ufixed184x64 ufixed184x72
+syn keyword solBuiltinType ufixed192x8 ufixed192x16 ufixed192x24 ufixed192x32 ufixed192x40 ufixed192x48 ufixed192x56 ufixed192x64
+syn keyword solBuiltinType ufixed200x8 ufixed200x16 ufixed200x24 ufixed200x32 ufixed200x40 ufixed200x48 ufixed200x56
+syn keyword solBuiltinType ufixed208x8 ufixed208x16 ufixed208x24 ufixed208x32 ufixed208x40 ufixed208x48
+syn keyword solBuiltinType ufixed216x8 ufixed216x16 ufixed216x24 ufixed216x32 ufixed216x40
+syn keyword solBuiltinType ufixed224x8 ufixed224x16 ufixed224x24 ufixed224x32
+syn keyword solBuiltinType ufixed232x8 ufixed232x16 ufixed232x24
+syn keyword solBuiltinType ufixed240x8 ufixed240x16
+syn keyword solBuiltinType ufixed248x8
+syn keyword solBuiltinType string string1 string2 string3 string4 string5 string6 string7 string8 string9 string10 string11 string12 string13 string14 string15 string16 string17 string18 string19 string20 string21 string22 string23 string24 string25 string26 string27 string28 string29 string30 string31 string32
+syn keyword solBuiltinType byte bytes bytes1 bytes2 bytes3 bytes4 bytes5 bytes6 bytes7 bytes8 bytes9 bytes10 bytes11 bytes12 bytes13 bytes14 bytes15 bytes16 bytes17 bytes18 bytes19 bytes20 bytes21 bytes22 bytes23 bytes24 bytes25 bytes26 bytes27 bytes28 bytes29 bytes30 bytes31 bytes32
+
+hi def link solKeyword Keyword
+hi def link solConstant Constant
+hi def link solBuiltinType Type
+hi def link solBuiltinFunction Keyword
+
+syn match solOperator /\(!\||\|&\|+\|-\|<\|>\|=\|%\|\/\|*\|\~\|\^\)/
+syn match solNumber /\<-\=\d\+L\=\>\|\<0[xX]\x\+\>/
+syn match solFloat /\<-\=\%(\d\+\.\d\+\|\d\+\.\|\.\d\+\)\%([eE][+-]\=\d\+\)\=\>/
+
+syn region solString start=+"+ skip=+\\\\\|\\$"\|\\"+ end=+"+
+syn region solString start=+'+ skip=+\\\\\|\\$'\|\\'+ end=+'+
+
+hi def link solOperator Operator
+hi def link solNumber Number
+hi def link solFloat Float
+hi def link solString String
+
+" Function
+syn match solFunction /\<function\>/ nextgroup=solFuncName,solFuncArgs skipwhite
+syn match solFuncName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*/ nextgroup=solFuncArgs skipwhite
+
+syn region solFuncArgs contained matchgroup=solFuncParens start='(' end=')' contains=solFuncArgCommas,solBuiltinType nextgroup=solModifierName,solFuncReturns,solFuncBody keepend skipwhite skipempty
+syn match solModifierName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*/ nextgroup=solModifierArgs,solModifierName skipwhite
+syn region solModifierArgs contained matchgroup=solFuncParens start='(' end=')' contains=solFuncArgCommas nextgroup=solModifierName,solFuncReturns,solFuncBody skipwhite
+syn region solFuncReturns contained matchgroup=solFuncParens nextgroup=solFuncBody start='(' end=')' contains=solFuncArgCommas,solBuiltinType skipwhite
+
+syn match solFuncArgCommas contained ','
+syn region solFuncBody start="{" end="}" fold transparent
+
+hi def link solFunction Type
+hi def link solFuncName Function
+hi def link solModifierName Function
+
+" Yul blocks
+syn match yul /\<assembly\>/ skipwhite skipempty nextgroup=yulBody
+syn region yulBody contained start='{' end='}' fold contains=yulAssemblyOp,solNumber,yulVarDeclaration,solLineComment,solComment skipwhite skipempty
+syn keyword yulAssemblyOp contained stop add sub mul div sdiv mod smod exp not lt gt slt sgt eq iszero and or xor byte shl shr sar addmod mulmod signextend keccak256 pc pop mload mstore mstore8 sload sstore msize gas address balance selfbalance caller callvalue calldataload calldatasize calldatacopy codesize codecopy extcodesize extcodecopy returndatasize returndatacopy extcodehash create create2 call callcode delegatecall staticcall return revert selfdestruct invalid log0 log1 log2 log3 log4 chainid basefee origin gasprice blockhash coinbase timestamp number difficulty gaslimit
+syn keyword yulVarDeclaration contained let
+
+hi def link yul Keyword
+hi def link yulVarDeclaration Keyword
+hi def link yulAssemblyOp Keyword
+
+" Contract
+syn match solContract /\<\%(contract\|library\|interface\)\>/ nextgroup=solContractName skipwhite
+syn match solContractName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*/ nextgroup=solContractParent skipwhite
+syn region solContractParent contained start='is' end='{' contains=solContractName,solContractNoise,solContractCommas skipwhite skipempty
+syn match solContractNoise contained 'is' containedin=solContractParent
+syn match solContractCommas contained ','
+
+hi def link solContract Type
+hi def link solContractName Function
+
+" Event
+syn match solEvent /\<event\>/ nextgroup=solEventName,solEventArgs skipwhite
+syn match solEventName contained /\<[a-zA-Z_$][0-9a-zA-Z_$]*/ nextgroup=solEventArgs skipwhite
+syn region solEventArgs contained matchgroup=solFuncParens start='(' end=')' contains=solEventArgCommas,solBuiltinType,solEventArgSpecial skipwhite skipempty
+syn match solEventArgCommas contained ','
+syn match solEventArgSpecial contained 'indexed'
+
+hi def link solEvent Type
+hi def link solEventName Function
+hi def link solEventArgSpecial Label
+
+" Comment
+syn keyword solCommentTodo TODO FIXME XXX TBD contained
+syn match solNatSpec contained /@title\|@author\|@notice\|@dev\|@param\|@inheritdoc\|@return/
+syn region solLineComment start=+\/\/+ end=+$+ contains=solCommentTodo,solNatSpec,@Spell
+syn region solLineComment start=+^\s*\/\/+ skip=+\n\s*\/\/+ end=+$+ contains=solCommentTodo,solNatSpec,@Spell fold
+syn region solComment start="/\*" end="\*/" contains=solCommentTodo,solNatSpec,@Spell fold
+
+hi def link solCommentTodo Todo
+hi def link solNatSpec Label
+hi def link solLineComment Comment
+hi def link solComment Comment
+
+let b:current_syntax = "solidity"
diff --git a/runtime/syntax/spec.vim b/runtime/syntax/spec.vim
new file mode 100644
index 0000000..d7d5877
--- /dev/null
+++ b/runtime/syntax/spec.vim
@@ -0,0 +1,226 @@
+" Filename: spec.vim
+" Purpose: Vim syntax file
+" 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: 2020 May 25
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn sync minlines=1000
+
+syn match specSpecialChar contained '[][!$()\\|>^;:{}]'
+syn match specColon contained ':'
+syn match specPercent contained '%'
+
+syn match specVariables contained '\$\h\w*' contains=specSpecialVariablesNames,specSpecialChar
+syn match specVariables contained '\${\w*}' contains=specSpecialVariablesNames,specSpecialChar
+
+syn match specMacroIdentifier contained '%\h\w*' contains=specMacroNameLocal,specMacroNameOther,specPercent
+syn match specMacroIdentifier contained '%{\w*}' contains=specMacroNameLocal,specMacroNameOther,specPercent,specSpecialChar
+
+syn match specSpecialVariables contained '\$[0-9]\|\${[0-9]}'
+syn match specCommandOpts contained '\s\(-\w\+\|--\w[a-zA-Z_-]\+\)'ms=s+1
+syn match specComment '^\s*#.*$'
+
+
+syn case match
+
+
+"matches with no highlight
+syn match specNoNumberHilite 'X11\|X11R6\|[a-zA-Z]*\.\d\|[a-zA-Z][-/]\d'
+syn match specManpageFile '[a-zA-Z]\.1'
+
+"Day, Month and most used license acronyms
+syn keyword specLicense contained GPL LGPL BSD MIT GNU
+syn keyword specWeekday contained Mon Tue Wed Thu Fri Sat Sun
+syn keyword specMonth contained Jan Feb Mar Apr Jun Jul Aug Sep Oct Nov Dec
+syn keyword specMonth contained January February March April May June July August September October November December
+
+"#, @, www
+syn match specNumber '\(^-\=\|[ \t]-\=\|-\)[0-9.-]*[0-9]'
+syn match specEmail contained "<\=\<[A-Za-z0-9_.-]\+@\([A-Za-z0-9_-]\+\.\)\+[A-Za-z]\+\>>\="
+syn match specURL contained '\<\(\(https\{0,1}\|ftp\)://\|\(www[23]\{0,1}\.\|ftp\.\)\)[A-Za-z0-9._/~:,#-]\+\>'
+syn match specURLMacro contained '\<\(\(https\{0,1}\|ftp\)://\|\(www[23]\{0,1}\.\|ftp\.\)\)[A-Za-z0-9._/~:,#%{}-]\+\>' contains=specMacroIdentifier
+
+"TODO take specSpecialVariables out of the cluster for the sh* contains (ALLBUT)
+"Special system directories
+syn match specListedFilesPrefix contained '/\(usr\|local\|opt\|X11R6\|X11\)/'me=e-1
+syn match specListedFilesBin contained '/s\=bin/'me=e-1
+syn match specListedFilesLib contained '/\(lib\|include\)/'me=e-1
+syn match specListedFilesDoc contained '/\(man\d*\|doc\|info\)\>'
+syn match specListedFilesEtc contained '/etc/'me=e-1
+syn match specListedFilesShare contained '/share/'me=e-1
+syn cluster specListedFiles contains=specListedFilesBin,specListedFilesLib,specListedFilesDoc,specListedFilesEtc,specListedFilesShare,specListedFilesPrefix,specVariables,specSpecialChar
+
+"specComands
+syn match specConfigure contained '\./configure'
+syn match specTarCommand contained '\<tar\s\+[cxvpzIf]\{,5}\s*'
+syn keyword specCommandSpecial contained root
+syn keyword specCommand contained make xmkmf mkdir chmod ln find sed rm strip moc echo grep ls rm mv mkdir install cp pwd cat tail then else elif cd gzip rmdir ln eval export touch
+syn cluster specCommands contains=specCommand,specTarCommand,specConfigure,specCommandSpecial
+
+"frequently used rpm env vars
+syn keyword specSpecialVariablesNames contained RPM_BUILD_ROOT RPM_BUILD_DIR RPM_SOURCE_DIR RPM_OPT_FLAGS LDFLAGS CC CC_FLAGS CPPNAME CFLAGS CXX CXXFLAGS CPPFLAGS
+
+"valid macro names from /usr/lib/rpm/macros
+syn keyword specMacroNameOther contained buildroot buildsubdir distribution disturl ix86 name nil optflags perl_sitearch release requires_eq vendor version
+syn match specMacroNameOther contained '\<\(PATCH\|SOURCE\)\d*\>'
+
+"valid _macro names from /usr/lib/rpm/macros
+syn keyword specMacroNameLocal contained _arch _binary_payload _bindir _build _build_alias _build_cpu _builddir _build_os _buildshell _buildsubdir _build_vendor _bzip2bin _datadir _dbpath _dbpath_rebuild _defaultdocdir _docdir _excludedocs _exec_prefix _fixgroup _fixowner _fixperms _ftpport _ftpproxy _gpg_path _gzipbin _host _host_alias _host_cpu _host_os _host_vendor _httpport _httpproxy _includedir _infodir _install_langs _install_script_path _instchangelog _langpatt _lib _libdir _libexecdir _localstatedir _mandir _netsharedpath _oldincludedir _os _pgpbin _pgp_path _prefix _preScriptEnvironment _provides _rpmdir _rpmfilename _sbindir _sharedstatedir _signature _sourcedir _source_payload _specdir _srcrpmdir _sysconfdir _target _target_alias _target_cpu _target_os _target_platform _target_vendor _timecheck _tmppath _topdir _usr _unitdir _usrsrc _var _vendor
+
+
+"------------------------------------------------------------------------------
+" here's is all the spec sections definitions: PreAmble, Description, Package,
+" Scripts, Files and Changelog
+
+"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\|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
+"TODO %verify valid parameters: \(not\)\= \(md5\|atime\|...\)
+syn region specFilesArea matchgroup=specSection start='^%[Ff][Ii][Ll][Ee][Ss]\>' skip='%\(attrib\|defattr\|attr\|dir\|config\|docdir\|doc\|lang\|license\|verify\|ghost\|exclude\)\>' end='^%[a-zA-Z]'me=e-2 contains=specFilesOpts,specFilesDirective,@specListedFiles,specComment,specCommandSpecial,specMacroIdentifier
+"tip: remember to include new itens in specFilesArea above
+syn match specFilesDirective contained '%\(attrib\|defattr\|attr\|dir\|config\|docdir\|doc\|lang\|license\|verify\|ghost\|exclude\)\>'
+
+"valid options for certain section headers
+syn match specDescriptionOpts contained '\s-[ln]\s*\a'ms=s+1,me=e-1
+syn match specPackageOpts contained '\s-n\s*\w'ms=s+1,me=e-1
+syn match specFilesOpts contained '\s-f\s*\w'ms=s+1,me=e-1
+
+
+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\|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
+
+"%% Package Section %%
+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\|check\|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
+
+
+
+"------------------------------------------------------------------------------
+"here's the shell syntax for all the Script Sections
+
+
+syn case match
+
+
+"sh-like comment stile, only valid in script part
+syn match shComment contained '#.*$'
+
+syn region dnlComment matchgroup=specComment start=+%dnl+ end=+$+
+
+syn region shQuote1 contained matchgroup=shQuoteDelim start=+'+ skip=+\\'+ end=+'+ contains=specMacroIdentifier
+syn region shQuote2 contained matchgroup=shQuoteDelim start=+"+ skip=+\\"+ end=+"+ contains=specVariables,specMacroIdentifier
+
+syn match shOperator contained '[><|!&;]\|[!=]='
+syn region shDo transparent matchgroup=specBlock start="\<do\>" end="\<done\>" contains=ALLBUT,shFunction,shDoError,shCase,specPreAmble,@specListedFiles
+
+syn region specIf matchgroup=specBlock start="%ifosf\|%ifos\|%ifnos\|%ifarch\|%ifnarch\|%else" end='%endif' contains=ALLBUT, specIfError, shCase
+
+syn region shIf transparent matchgroup=specBlock start="\<if\>" end="\<fi\>" contains=ALLBUT,shFunction,shIfError,shCase,@specListedFiles
+
+syn region shFor matchgroup=specBlock start="\<for\>" end="\<in\>" contains=ALLBUT,shFunction,shInError,shCase,@specListedFiles
+
+syn region shCaseEsac transparent matchgroup=specBlock start="\<case\>" matchgroup=NONE end="\<in\>"me=s-1 contains=ALLBUT,shFunction,shCaseError,@specListedFiles nextgroup=shCaseEsac
+syn region shCaseEsac matchgroup=specBlock start="\<in\>" end="\<esac\>" contains=ALLBUT,shFunction,shCaseError,@specListedFilesBin
+syn region shCase matchgroup=specBlock contained start=")" end=";;" contains=ALLBUT,shFunction,shCaseError,shCase,@specListedFiles
+
+syn sync match shDoSync grouphere shDo "\<do\>"
+syn sync match shDoSync groupthere shDo "\<done\>"
+syn sync match shIfSync grouphere shIf "\<if\>"
+syn sync match shIfSync groupthere shIf "\<fi\>"
+syn sync match specIfSync grouphere specIf "%ifarch\|%ifos\|%ifnos"
+syn sync match specIfSync groupthere specIf "%endIf"
+syn sync match shForSync grouphere shFor "\<for\>"
+syn sync match shForSync groupthere shFor "\<in\>"
+syn sync match shCaseEsacSync grouphere shCaseEsac "\<case\>"
+syn sync match shCaseEsacSync groupthere shCaseEsac "\<esac\>"
+
+" Define the default highlighting.
+" 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 dnlComment 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
new file mode 100644
index 0000000..79c94b7
--- /dev/null
+++ b/runtime/syntax/specman.vim
@@ -0,0 +1,169 @@
+" Vim syntax file
+" Language: SPECMAN E-LANGUAGE
+" Maintainer: Or Freund <or@mobilian.com ;omf@gmx.co.uk; OrMeir@yahoo.com>
+" Last Update: Wed Oct 24 2001
+
+"---------------------------------------------------------
+"| If anyone found an error or fix the parenthesis part |
+"| I will be happy to hear about it |
+"| Thanks Or. |
+"---------------------------------------------------------
+
+" Remove any old syntax stuff hanging around
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn keyword specmanTodo contained TODO todo ToDo FIXME XXX
+
+syn keyword specmanStatement var instance on compute start event expect check that routine
+syn keyword specmanStatement specman is also first only with like
+syn keyword specmanStatement list of all radix hex dec bin ignore illegal
+syn keyword specmanStatement traceable untraceable
+syn keyword specmanStatement cover using count_only trace_only at_least transition item ranges
+syn keyword specmanStatement cross text call task within
+
+syn keyword specmanMethod initialize non_terminal testgroup delayed exit finish
+syn keyword specmanMethod out append print outf appendf
+syn keyword specmanMethod post_generate pre_generate setup_test finalize_test extract_test
+syn keyword specmanMethod init run copy as_a set_config dut_error add clear lock quit
+syn keyword specmanMethod lock unlock release swap quit to_string value stop_run
+syn keyword specmanMethod crc_8 crc_32 crc_32_flip get_config add0 all_indices and_all
+syn keyword specmanMethod apply average count delete exists first_index get_indices
+syn keyword specmanMethod has insert is_a_permutation is_empty key key_exists key_index
+syn keyword specmanMethod last last_index max max_index max_value min min_index
+syn keyword specmanMethod min_value or_all pop pop0 push push0 product resize reverse
+syn keyword specmanMethod sort split sum top top0 unique clear is_all_iterations
+syn keyword specmanMethod get_enclosing_unit hdl_path exec deep_compare deep_compare_physical
+syn keyword specmanMethod pack unpack warning error fatal
+syn match specmanMethod "size()"
+syn keyword specmanPacking packing low high
+syn keyword specmanType locker address
+syn keyword specmanType body code vec chars
+syn keyword specmanType integer real bool int long uint byte bits bit time string
+syn keyword specmanType byte_array external_pointer
+syn keyword specmanBoolean TRUE FALSE
+syn keyword specmanPreCondit #ifdef #ifndef #else
+
+syn keyword specmanConditional choose matches
+syn keyword specmanConditional if then else when try
+
+
+
+syn keyword specmanLabel case casex casez default
+
+syn keyword specmanLogical and or not xor
+
+syn keyword specmanRepeat until repeat while for from to step each do break continue
+syn keyword specmanRepeat before next sequence always -kind network
+syn keyword specmanRepeat index it me in new return result select
+
+syn keyword specmanTemporal cycle sample events forever
+syn keyword specmanTemporal wait change negedge rise fall delay sync sim true detach eventually emit
+
+syn keyword specmanConstant MAX_INT MIN_INT NULL UNDEF
+
+syn keyword specmanDefine define as computed type extend
+syn keyword specmanDefine verilog vhdl variable global sys
+syn keyword specmanStructure struct unit
+syn keyword specmanInclude import
+syn keyword specmanConstraint gen keep keeping soft before
+
+syn keyword specmanSpecial untyped symtab ECHO DOECHO
+syn keyword specmanFile files load module ntv source_ref script read write
+syn keyword specmanFSM initial idle others posedge clock cycles
+
+
+syn match specmanOperator "[&|~><!)(*%@+/=?:;}{,.\^\-\[\]]"
+syn match specmanOperator "+="
+syn match specmanOperator "-="
+syn match specmanOperator "*="
+
+syn match specmanComment "//.*" contains=specmanTodo
+syn match specmanComment "--.*"
+syn region specmanComment start="^'>"hs=s+2 end="^<'"he=e-2
+
+syn match specmanHDL "'[`.a-zA-Z0-9_@\[\]]\+\>'"
+
+
+syn match specmanCompare "=="
+syn match specmanCompare "!==="
+syn match specmanCompare "==="
+syn match specmanCompare "!="
+syn match specmanCompare ">="
+syn match specmanCompare "<="
+syn match specmanNumber "[0-9]:[0-9]"
+syn match specmanNumber "\(\<\d\+\|\)'[bB]\s*[0-1_xXzZ?]\+\>"
+syn match specmanNumber "0[bB]\s*[0-1_xXzZ?]\+\>"
+syn match specmanNumber "\(\<\d\+\|\)'[oO]\s*[0-7_xXzZ?]\+\>"
+syn match specmanNumber "0[oO]\s*[0-9a-fA-F_xXzZ?]\+\>"
+syn match specmanNumber "\(\<\d\+\|\)'[dD]\s*[0-9_xXzZ?]\+\>"
+syn match specmanNumber "\(\<\d\+\|\)'[hH]\s*[0-9a-fA-F_xXzZ?]\+\>"
+syn match specmanNumber "0[xX]\s*[0-9a-fA-F_xXzZ?]\+\>"
+syn match specmanNumber "\<[+-]\=[0-9_]\+\(\.[0-9_]*\|\)\(e[0-9_]*\|\)\>"
+
+syn region specmanString start=+"+ end=+"+
+
+
+
+"**********************************************************************
+" I took this section from c.vim but I didnt succeded to make it work
+" ANY one who dare jumping to this deep watter is more than welocome!
+"**********************************************************************
+""catch errors caused by wrong parenthesis and brackets
+
+"syn cluster specmanParenGroup contains=specmanParenError
+"" ,specmanNumbera,specmanComment
+"if exists("specman_no_bracket_error")
+"syn region specmanParen transparent start='(' end=')' contains=ALLBUT,@specmanParenGroup
+"syn match specmanParenError ")"
+"syn match specmanErrInParen contained "[{}]"
+"else
+"syn region specmanParen transparent start='(' end=')' contains=ALLBUT,@specmanParenGroup,specmanErrInBracket
+"syn match specmanParenError "[\])]"
+"syn match specmanErrInParen contained "[\]{}]"
+"syn region specmanBracket transparent start='\[' end=']' contains=ALLBUT,@specmanParenGroup,specmanErrInParen
+"syn match specmanErrInBracket contained "[);{}]"
+"endif
+"
+
+"Modify the following as needed. The trade-off is performance versus
+"functionality.
+
+syn sync lines=50
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..306039b
--- /dev/null
+++ b/runtime/syntax/spice.vim
@@ -0,0 +1,75 @@
+" Vim syntax file
+" Language: Spice circuit simulator input netlist
+" Maintainer: Noam Halevy <Noam.Halevy.motorola.com>
+" Last Change: 2012 Jun 01
+" (Dominique Pelle added @Spell)
+"
+" This is based on sh.vim by Lennart Schultz
+" but greatly simplified
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" spice syntax is case INsensitive
+syn case ignore
+
+syn keyword spiceTodo contained TODO
+
+syn match spiceComment "^ \=\*.*$" contains=@Spell
+syn match spiceComment "\$.*$" contains=@Spell
+
+" Numbers, all with engineering suffixes and optional units
+"==========================================================
+"floating point number, with dot, optional exponent
+syn match spiceNumber "\<[0-9]\+\.[0-9]*\(e[-+]\=[0-9]\+\)\=\(meg\=\|[afpnumkg]\)\="
+"floating point number, starting with a dot, optional exponent
+syn match spiceNumber "\.[0-9]\+\(e[-+]\=[0-9]\+\)\=\(meg\=\|[afpnumkg]\)\="
+"integer number with optional exponent
+syn match spiceNumber "\<[0-9]\+\(e[-+]\=[0-9]\+\)\=\(meg\=\|[afpnumkg]\)\="
+
+" Misc
+"=====
+syn match spiceWrapLineOperator "\\$"
+syn match spiceWrapLineOperator "^+"
+
+syn match spiceStatement "^ \=\.\I\+"
+
+" Matching pairs of parentheses
+"==========================================
+syn region spiceParen transparent matchgroup=spiceOperator start="(" end=")" contains=ALLBUT,spiceParenError
+syn region spiceSinglequote matchgroup=spiceOperator start=+'+ end=+'+
+
+" Errors
+"=======
+syn match spiceParenError ")"
+
+" Syncs
+" =====
+syn sync minlines=50
+
+" Define the default highlighting.
+" 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"
+
+" insert the following to $VIM/syntax/scripts.vim
+" to autodetect HSpice netlists and text listing output:
+"
+" " Spice netlists and text listings
+" elseif getline(1) =~ 'spice\>' || getline("$") =~ '^\.end'
+" so <sfile>:p:h/spice.vim
+
+" vim: ts=8
diff --git a/runtime/syntax/splint.vim b/runtime/syntax/splint.vim
new file mode 100644
index 0000000..8eba57d
--- /dev/null
+++ b/runtime/syntax/splint.vim
@@ -0,0 +1,243 @@
+" Vim syntax file
+" Language: splint (C with lclint/splint Annotations)
+" Maintainer: Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+" Splint Home: http://www.splint.org/
+" Last Change: $Date: 2004/06/13 20:08:47 $
+" $Revision: 1.1 $
+
+" Note: Splint annotated files are not detected by default.
+" If you want to use this file for highlighting C code,
+" please make sure splint.vim is sourced instead of c.vim,
+" for example by putting
+" /* vim: set filetype=splint : */
+" at the end of your code or something like
+" au! BufRead,BufNewFile *.c setfiletype splint
+" in your vimrc file or filetype.vim
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the C syntax to start with
+runtime! syntax/c.vim
+
+
+" FIXME: uses and changes several clusters defined in c.vim
+" so watch for changes there
+
+" TODO: make a little more grammar explicit
+" match flags with hyphen and underscore notation
+" match flag expanded forms
+" accept other comment char than @
+
+syn case match
+" splint annotations (taken from 'splint -help annotations')
+syn match splintStateAnnot contained "\(pre\|post\):\(only\|shared\|owned\|dependent\|observer\|exposed\|isnull\|notnull\)"
+syn keyword splintSpecialAnnot contained special
+syn keyword splintSpecTag contained uses sets defines allocated releases
+syn keyword splintModifies contained modifies
+syn keyword splintRequires contained requires ensures
+syn keyword splintGlobals contained globals
+syn keyword splintGlobitem contained internalState fileSystem
+syn keyword splintGlobannot contained undef killed
+syn keyword splintWarning contained warn
+
+syn keyword splintModitem contained internalState fileSystem nothing
+syn keyword splintReqitem contained MaxSet MaxRead result
+syn keyword splintIter contained iter yield
+syn keyword splintConst contained constant
+syn keyword splintAlt contained alt
+
+syn keyword splintType contained abstract concrete mutable immutable refcounted numabstract
+syn keyword splintGlobalType contained unchecked checkmod checked checkedstrict
+syn keyword splintMemMgm contained dependent keep killref only owned shared temp
+syn keyword splintAlias contained unique returned
+syn keyword splintExposure contained observer exposed
+syn keyword splintDefState contained out in partial reldef
+syn keyword splintGlobState contained undef killed
+syn keyword splintNullState contained null notnull relnull
+syn keyword splintNullPred contained truenull falsenull nullwhentrue falsewhennull
+syn keyword splintExit contained exits mayexit trueexit falseexit neverexit
+syn keyword splintExec contained noreturn maynotreturn noreturnwhentrue noreturnwhenfalse alwaysreturns
+syn keyword splintSef contained sef
+syn keyword splintDecl contained unused external
+syn keyword splintCase contained fallthrough
+syn keyword splintBreak contained innerbreak loopbreak switchbreak innercontinue
+syn keyword splintUnreach contained notreached
+syn keyword splintSpecFunc contained printflike scanflike messagelike
+
+" TODO: make these region or match
+syn keyword splintErrSupp contained i ignore end t
+syn match splintErrSupp contained "[it]\d\+\>"
+syn keyword splintTypeAcc contained access noaccess
+
+syn keyword splintMacro contained notfunction
+syn match splintSpecType contained "\(\|unsigned\|signed\)integraltype"
+
+" Flags taken from 'splint -help flags full' divided in local and global flags
+" Local Flags:
+syn keyword splintFlag contained abstract abstractcompare accessall accessczech accessczechoslovak
+syn keyword splintFlag contained accessfile accessmodule accessslovak aliasunique allblock
+syn keyword splintFlag contained allempty allglobs allimponly allmacros alwaysexits
+syn keyword splintFlag contained annotationerror ansi89limits assignexpose badflag bitwisesigned
+syn keyword splintFlag contained boolcompare boolfalse boolint boolops booltrue
+syn keyword splintFlag contained booltype bounds boundscompacterrormessages boundsread boundswrite
+syn keyword splintFlag contained branchstate bufferoverflow bufferoverflowhigh bugslimit casebreak
+syn keyword splintFlag contained caseinsensitivefilenames castexpose castfcnptr charindex charint
+syn keyword splintFlag contained charintliteral charunsignedchar checkedglobalias checkmodglobalias checkpost
+syn keyword splintFlag contained checkstrictglobalias checkstrictglobs codeimponly commentchar commenterror
+syn keyword splintFlag contained compdef compdestroy compmempass constmacros constprefix
+syn keyword splintFlag contained constprefixexclude constuse continuecomment controlnestdepth cppnames
+syn keyword splintFlag contained csvoverwrite czech czechconsts czechfcns czechmacros
+syn keyword splintFlag contained czechoslovak czechoslovakconsts czechoslovakfcns czechoslovakmacros czechoslovaktypes
+syn keyword splintFlag contained czechoslovakvars czechtypes czechvars debugfcnconstraint declundef
+syn keyword splintFlag contained deepbreak deparrays dependenttrans distinctexternalnames distinctinternalnames
+syn keyword splintFlag contained duplicatecases duplicatequals elseifcomplete emptyret enumindex
+syn keyword splintFlag contained enumint enummembers enummemuse enumprefix enumprefixexclude
+syn keyword splintFlag contained evalorder evalorderuncon exitarg exportany exportconst
+syn keyword splintFlag contained exportfcn exportheader exportheadervar exportiter exportlocal
+syn keyword splintFlag contained exportmacro exporttype exportvar exposetrans externalnamecaseinsensitive
+syn keyword splintFlag contained externalnamelen externalprefix externalprefixexclude fcnderef fcnmacros
+syn keyword splintFlag contained fcnpost fcnuse fielduse fileextensions filestaticprefix
+syn keyword splintFlag contained filestaticprefixexclude firstcase fixedformalarray floatdouble forblock
+syn keyword splintFlag contained forcehints forempty forloopexec formalarray formatcode
+syn keyword splintFlag contained formatconst formattype forwarddecl freshtrans fullinitblock
+syn keyword splintFlag contained globalias globalprefix globalprefixexclude globimponly globnoglobs
+syn keyword splintFlag contained globs globsimpmodsnothing globstate globuse gnuextensions
+syn keyword splintFlag contained grammar hasyield hints htmlfileformat ifblock
+syn keyword splintFlag contained ifempty ignorequals ignoresigns immediatetrans impabstract
+syn keyword splintFlag contained impcheckedglobs impcheckedspecglobs impcheckedstatics impcheckedstrictglobs impcheckedstrictspecglobs
+syn keyword splintFlag contained impcheckedstrictstatics impcheckmodglobs impcheckmodinternals impcheckmodspecglobs impcheckmodstatics
+syn keyword splintFlag contained impconj implementationoptional implictconstraint impouts imptype
+syn keyword splintFlag contained includenest incompletetype incondefs incondefslib indentspaces
+syn keyword splintFlag contained infloops infloopsuncon initallelements initsize internalglobs
+syn keyword splintFlag contained internalglobsnoglobs internalnamecaseinsensitive internalnamelen internalnamelookalike iso99limits
+syn keyword splintFlag contained isoreserved isoreservedinternal iterbalance iterloopexec iterprefix
+syn keyword splintFlag contained iterprefixexclude iteryield its4low its4moderate its4mostrisky
+syn keyword splintFlag contained its4risky its4veryrisky keep keeptrans kepttrans
+syn keyword splintFlag contained legacy libmacros likelyboundsread likelyboundswrite likelybool
+syn keyword splintFlag contained likelybounds limit linelen lintcomments localprefix
+syn keyword splintFlag contained localprefixexclude locindentspaces longint longintegral longsignedintegral
+syn keyword splintFlag contained longunsignedintegral longunsignedunsignedintegral loopexec looploopbreak looploopcontinue
+syn keyword splintFlag contained loopswitchbreak macroassign macroconstdecl macrodecl macroempty
+syn keyword splintFlag contained macrofcndecl macromatchname macroparams macroparens macroredef
+syn keyword splintFlag contained macroreturn macrostmt macrounrecog macrovarprefix macrovarprefixexclude
+syn keyword splintFlag contained maintype matchanyintegral matchfields mayaliasunique memchecks
+syn keyword splintFlag contained memimp memtrans misplacedsharequal misscase modfilesys
+syn keyword splintFlag contained modglobs modglobsnomods modglobsunchecked modinternalstrict modnomods
+syn keyword splintFlag contained modobserver modobserveruncon mods modsimpnoglobs modstrictglobsnomods
+syn keyword splintFlag contained moduncon modunconnomods modunspec multithreaded mustdefine
+syn keyword splintFlag contained mustfree mustfreefresh mustfreeonly mustmod mustnotalias
+syn keyword splintFlag contained mutrep namechecks needspec nestcomment nestedextern
+syn keyword splintFlag contained newdecl newreftrans nextlinemacros noaccess nocomments
+syn keyword splintFlag contained noeffect noeffectuncon noparams nopp noret
+syn keyword splintFlag contained null nullassign nullderef nullinit nullpass
+syn keyword splintFlag contained nullptrarith nullret nullstate nullterminated
+syn keyword splintFlag contained numabstract numabstractcast numabstractindex numabstractlit numabstractprint
+syn keyword splintFlag contained numenummembers numliteral numstructfields observertrans obviousloopexec
+syn keyword splintFlag contained oldstyle onlytrans onlyunqglobaltrans orconstraint overload
+syn keyword splintFlag contained ownedtrans paramimptemp paramuse parenfileformat partial
+syn keyword splintFlag contained passunknown portability predassign predbool predboolint
+syn keyword splintFlag contained predboolothers predboolptr preproc protoparammatch protoparamname
+syn keyword splintFlag contained protoparamprefix protoparamprefixexclude ptrarith ptrcompare ptrnegate
+syn keyword splintFlag contained quiet readonlystrings readonlytrans realcompare redecl
+syn keyword splintFlag contained redef redundantconstraints redundantsharequal refcounttrans relaxquals
+syn keyword splintFlag contained relaxtypes repeatunrecog repexpose retalias retexpose
+syn keyword splintFlag contained retimponly retval retvalbool retvalint retvalother
+syn keyword splintFlag contained sefparams sefuncon shadow sharedtrans shiftimplementation
+syn keyword splintFlag contained shiftnegative shortint showallconjs showcolumn showconstraintlocation
+syn keyword splintFlag contained showconstraintparens showdeephistory showfunc showloadloc showscan
+syn keyword splintFlag contained showsourceloc showsummary sizeofformalarray sizeoftype skipisoheaders
+syn keyword splintFlag contained skipposixheaders slashslashcomment slovak slovakconsts slovakfcns
+syn keyword splintFlag contained slovakmacros slovaktypes slovakvars specglobimponly specimponly
+syn keyword splintFlag contained specmacros specretimponly specstructimponly specundecl specundef
+syn keyword splintFlag contained stackref statemerge statetransfer staticinittrans statictrans
+syn keyword splintFlag contained strictbranchstate strictdestroy strictops strictusereleased stringliterallen
+syn keyword splintFlag contained stringliteralnoroom stringliteralnoroomfinalnull stringliteralsmaller stringliteraltoolong structimponly
+syn keyword splintFlag contained superuser switchloopbreak switchswitchbreak syntax sysdirerrors
+syn keyword splintFlag contained sysdirexpandmacros sysunrecog tagprefix tagprefixexclude temptrans
+syn keyword splintFlag contained tmpcomments toctou topuse trytorecover type
+syn keyword splintFlag contained typeprefix typeprefixexclude typeuse uncheckedglobalias uncheckedmacroprefix
+syn keyword splintFlag contained uncheckedmacroprefixexclude uniondef unixstandard unqualifiedinittrans unqualifiedtrans
+syn keyword splintFlag contained unreachable unrecog unrecogcomments unrecogdirective unrecogflagcomments
+syn keyword splintFlag contained unsignedcompare unusedspecial usedef usereleased usevarargs
+syn keyword splintFlag contained varuse voidabstract warnflags warnlintcomments warnmissingglobs
+syn keyword splintFlag contained warnmissingglobsnoglobs warnposixheaders warnrc warnsysfiles warnunixlib
+syn keyword splintFlag contained warnuse whileblock whileempty whileloopexec zerobool
+syn keyword splintFlag contained zeroptr
+" Global Flags:
+syn keyword splintGlobalFlag contained csv dump errorstream errorstreamstderr errorstreamstdout
+syn keyword splintGlobalFlag contained expect f help i isolib
+syn keyword splintGlobalFlag contained larchpath lclexpect lclimportdir lcs lh
+syn keyword splintGlobalFlag contained load messagestream messagestreamstderr messagestreamstdout mts
+syn keyword splintGlobalFlag contained neverinclude nof nolib posixlib posixstrictlib
+syn keyword splintGlobalFlag contained showalluses singleinclude skipsysheaders stats streamoverwrite
+syn keyword splintGlobalFlag contained strictlib supcounts sysdirs timedist tmpdir
+syn keyword splintGlobalFlag contained unixlib unixstrictlib warningstream warningstreamstderr warningstreamstdout
+syn keyword splintGlobalFlag contained whichlib
+syn match splintFlagExpr contained "[\+\-\=]" nextgroup=splintFlag,splintGlobalFlag
+
+" detect missing /*@ and wrong */
+syn match splintAnnError "@\*/"
+syn cluster cCommentGroup add=splintAnnError
+syn match splintAnnError2 "[^@]\*/"hs=s+1 contained
+syn region splintAnnotation start="/\*@" end="@\*/" contains=@splintAnnotElem,cType keepend
+syn match splintShortAnn "/\*@\*/"
+syn cluster splintAnnotElem contains=splintStateAnnot,splintSpecialAnnot,splintSpecTag,splintModifies,splintRequires,splintGlobals,splintGlobitem,splintGlobannot,splintWarning,splintModitem,splintIter,splintConst,splintAlt,splintType,splintGlobalType,splintMemMgm,splintAlias,splintExposure,splintDefState,splintGlobState,splintNullState,splintNullPred,splintExit,splintExec,splintSef,splintDecl,splintCase,splintBreak,splintUnreach,splintSpecFunc,splintErrSupp,splintTypeAcc,splintMacro,splintSpecType,splintAnnError2,splintFlagExpr
+syn cluster splintAllStuff contains=@splintAnnotElem,splintFlag,splintGlobalFlag
+syn cluster cParenGroup add=@splintAllStuff
+syn cluster cPreProcGroup add=@splintAllStuff
+syn cluster cMultiGroup add=@splintAllStuff
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "splint"
+
+" vim: ts=8
diff --git a/runtime/syntax/spup.vim b/runtime/syntax/spup.vim
new file mode 100644
index 0000000..9284abf
--- /dev/null
+++ b/runtime/syntax/spup.vim
@@ -0,0 +1,269 @@
+" Vim syntax file
+" Language: Speedup, plant simulator from AspenTech
+" Maintainer: Stefan.Schwarzer <s.schwarzer@ndh.net>
+" URL: http://www.ndh.net/home/sschwarzer/download/spup.vim
+" Last Change: 2012 Feb 03 by Thilo Six
+" Filename: spup.vim
+
+" Bugs
+" - in the appropriate sections keywords are always highlighted
+" even if they are not used with the appropriate meaning;
+" example: in
+" MODEL demonstration
+" TYPE
+" *area AS area
+" both "area" are highlighted as spupType.
+"
+" If you encounter problems or have questions or suggestions, mail me
+
+" Remove old syntax stuff
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" don't highlight several keywords like subsections
+"let strict_subsections = 1
+
+" highlight types usually found in DECLARE section
+if !exists("hightlight_types")
+ let highlight_types = 1
+endif
+
+" one line comment syntax (# comments)
+" 1. allow appended code after comment, do not complain
+" 2. show code beginning with the second # as an error
+" 3. show whole lines with more than one # as an error
+if !exists("oneline_comments")
+ let oneline_comments = 2
+endif
+
+" Speedup SECTION regions
+syn case ignore
+syn region spupCdi matchgroup=spupSection start="^CDI" end="^\*\*\*\*" contains=spupCdiSubs,@spupOrdinary
+syn region spupConditions matchgroup=spupSection start="^CONDITIONS" end="^\*\*\*\*" contains=spupConditionsSubs,@spupOrdinary,spupConditional,spupOperator,spupCode
+syn region spupDeclare matchgroup=spupSection start="^DECLARE" end="^\*\*\*\*" contains=spupDeclareSubs,@spupOrdinary,spupTypes,spupCode
+syn region spupEstimation matchgroup=spupSection start="^ESTIMATION" end="^\*\*\*\*" contains=spupEstimationSubs,@spupOrdinary
+syn region spupExternal matchgroup=spupSection start="^EXTERNAL" end="^\*\*\*\*" contains=spupExternalSubs,@spupOrdinary
+syn region spupFlowsheet matchgroup=spupSection start="^FLOWSHEET" end="^\*\*\*\*" contains=spupFlowsheetSubs,@spupOrdinary,spupStreams,@spupTextproc
+syn region spupFunction matchgroup=spupSection start="^FUNCTION" end="^\*\*\*\*" contains=spupFunctionSubs,@spupOrdinary,spupHelp,spupCode,spupTypes
+syn region spupGlobal matchgroup=spupSection start="^GLOBAL" end="^\*\*\*\*" contains=spupGlobalSubs,@spupOrdinary
+syn region spupHomotopy matchgroup=spupSection start="^HOMOTOPY" end="^\*\*\*\*" contains=spupHomotopySubs,@spupOrdinary
+syn region spupMacro matchgroup=spupSection start="^MACRO" end="^\*\*\*\*" contains=spupMacroSubs,@spupOrdinary,@spupTextproc,spupTypes,spupStreams,spupOperator
+syn region spupModel matchgroup=spupSection start="^MODEL" end="^\*\*\*\*" contains=spupModelSubs,@spupOrdinary,spupConditional,spupOperator,spupTypes,spupStreams,@spupTextproc,spupHelp
+syn region spupOperation matchgroup=spupSection start="^OPERATION" end="^\*\*\*\*" contains=spupOperationSubs,@spupOrdinary,@spupTextproc
+syn region spupOptions matchgroup=spupSection start="^OPTIONS" end="^\*\*\*\*" contains=spupOptionsSubs,@spupOrdinary
+syn region spupProcedure matchgroup=spupSection start="^PROCEDURE" end="^\*\*\*\*" contains=spupProcedureSubs,@spupOrdinary,spupHelp,spupCode,spupTypes
+syn region spupProfiles matchgroup=spupSection start="^PROFILES" end="^\*\*\*\*" contains=@spupOrdinary,@spupTextproc
+syn region spupReport matchgroup=spupSection start="^REPORT" end="^\*\*\*\*" contains=spupReportSubs,@spupOrdinary,spupHelp,@spupTextproc
+syn region spupTitle matchgroup=spupSection start="^TITLE" end="^\*\*\*\*" contains=spupTitleSubs,spupComment,spupConstant,spupError
+syn region spupUnit matchgroup=spupSection start="^UNIT" end="^\*\*\*\*" contains=spupUnitSubs,@spupOrdinary
+
+" Subsections
+syn keyword spupCdiSubs INPUT FREE OUTPUT LINEARTIME MINNONZERO CALCULATE FILES SCALING contained
+syn keyword spupDeclareSubs TYPE STREAM contained
+syn keyword spupEstimationSubs ESTIMATE SSEXP DYNEXP RESULT contained
+syn keyword spupExternalSubs TRANSMIT RECEIVE contained
+syn keyword spupFlowsheetSubs STREAM contained
+syn keyword spupFunctionSubs INPUT OUTPUT contained
+syn keyword spupGlobalSubs VARIABLES MAXIMIZE MINIMIZE CONSTRAINT contained
+syn keyword spupHomotopySubs VARY OPTIONS contained
+syn keyword spupMacroSubs MODEL FLOWSHEET contained
+syn keyword spupModelSubs CATEGORY SET TYPE STREAM EQUATION PROCEDURE contained
+syn keyword spupOperationSubs SET PRESET INITIAL SSTATE FREE contained
+syn keyword spupOptionsSubs ROUTINES TRANSLATE EXECUTION contained
+syn keyword spupProcedureSubs INPUT OUTPUT SPACE PRECALL POSTCALL DERIVATIVE STREAM contained
+" no subsections for Profiles
+syn keyword spupReportSubs SET INITIAL FIELDS FIELDMARK DISPLAY WITHIN contained
+syn keyword spupUnitSubs ROUTINES SET contained
+
+" additional keywords for subsections
+if !exists( "strict_subsections" )
+ syn keyword spupConditionsSubs STOP PRINT contained
+ syn keyword spupDeclareSubs UNIT SET COMPONENTS THERMO OPTIONS contained
+ syn keyword spupEstimationSubs VARY MEASURE INITIAL contained
+ syn keyword spupFlowsheetSubs TYPE FEED PRODUCT INPUT OUTPUT CONNECTION OF IS contained
+ syn keyword spupMacroSubs CONNECTION STREAM SET INPUT OUTPUT OF IS FEED PRODUCT TYPE contained
+ syn keyword spupModelSubs AS ARRAY OF INPUT OUTPUT CONNECTION contained
+ syn keyword spupOperationSubs WITHIN contained
+ syn keyword spupReportSubs LEFT RIGHT CENTER CENTRE UOM TIME DATE VERSION RELDATE contained
+ syn keyword spupUnitSubs IS A contained
+endif
+
+" Speedup data types
+if exists( "highlight_types" )
+ syn keyword spupTypes act_coeff_liq area coefficient concentration contained
+ syn keyword spupTypes control_signal cond_liq cond_vap cp_mass_liq contained
+ syn keyword spupTypes cp_mol_liq cp_mol_vap cv_mol_liq cv_mol_vap contained
+ syn keyword spupTypes diffus_liq diffus_vap delta_p dens_mass contained
+ syn keyword spupTypes dens_mass_sol dens_mass_liq dens_mass_vap dens_mol contained
+ syn keyword spupTypes dens_mol_sol dens_mol_liq dens_mol_vap enthflow contained
+ syn keyword spupTypes enth_mass enth_mass_liq enth_mass_vap enth_mol contained
+ syn keyword spupTypes enth_mol_sol enth_mol_liq enth_mol_vap entr_mol contained
+ syn keyword spupTypes entr_mol_sol entr_mol_liq entr_mol_vap fraction contained
+ syn keyword spupTypes flow_mass flow_mass_liq flow_mass_vap flow_mol contained
+ syn keyword spupTypes flow_mol_vap flow_mol_liq flow_vol flow_vol_vap contained
+ syn keyword spupTypes flow_vol_liq fuga_vap fuga_liq fuga_sol contained
+ syn keyword spupTypes gibb_mol_sol heat_react heat_trans_coeff contained
+ syn keyword spupTypes holdup_heat holdup_heat_liq holdup_heat_vap contained
+ syn keyword spupTypes holdup_mass holdup_mass_liq holdup_mass_vap contained
+ syn keyword spupTypes holdup_mol holdup_mol_liq holdup_mol_vap k_value contained
+ syn keyword spupTypes length length_delta length_short liqfraction contained
+ syn keyword spupTypes liqmassfraction mass massfraction molefraction contained
+ syn keyword spupTypes molweight moment_inertia negative notype percent contained
+ syn keyword spupTypes positive pressure press_diff press_drop press_rise contained
+ syn keyword spupTypes ratio reaction reaction_mass rotation surf_tens contained
+ syn keyword spupTypes temperature temperature_abs temp_diff temp_drop contained
+ syn keyword spupTypes temp_rise time vapfraction vapmassfraction contained
+ syn keyword spupTypes velocity visc_liq visc_vap volume zmom_rate contained
+ syn keyword spupTypes seg_rate smom_rate tmom_rate zmom_mass seg_mass contained
+ syn keyword spupTypes smom_mass tmom_mass zmom_holdup seg_holdup contained
+ syn keyword spupTypes smom_holdup tmom_holdup contained
+endif
+
+" stream types
+syn keyword spupStreams mainstream vapour liquid contained
+
+" "conditional" keywords
+syn keyword spupConditional IF THEN ELSE ENDIF contained
+" Operators, symbols etc.
+syn keyword spupOperator AND OR NOT contained
+syn match spupSymbol "[,\-+=:;*/\"<>@%()]" contained
+syn match spupSpecial "[&\$?]" contained
+" Surprisingly, Speedup allows no unary + instead of the -
+syn match spupError "[(=+\-*/]\s*+\d\+\([ed][+-]\=\d\+\)\=\>"lc=1 contained
+syn match spupError "[(=+\-*/]\s*+\d\+\.\([ed][+-]\=\d\+\)\=\>"lc=1 contained
+syn match spupError "[(=+\-*/]\s*+\d*\.\d\+\([ed][+-]\=\d\+\)\=\>"lc=1 contained
+" String
+syn region spupString start=+"+ end=+"+ oneline contained
+syn region spupString start=+'+ end=+'+ oneline contained
+" Identifier
+syn match spupIdentifier "\<[a-z][a-z0-9_]*\>" contained
+" Textprocessor directives
+syn match spupTextprocGeneric "?[a-z][a-z0-9_]*\>" contained
+syn region spupTextprocError matchgroup=spupTextprocGeneric start="?ERROR" end="?END"he=s-1 contained
+" Number, without decimal point
+syn match spupNumber "-\=\d\+\([ed][+-]\=\d\+\)\=" contained
+" Number, allows 1. before exponent
+syn match spupNumber "-\=\d\+\.\([ed][+-]\=\d\+\)\=" contained
+" Number allows .1 before exponent
+syn match spupNumber "-\=\d*\.\d\+\([ed][+-]\=\d\+\)\=" contained
+" Help subsections
+syn region spupHelp start="^HELP"hs=e+1 end="^\$ENDHELP"he=s-1 contained
+" Fortran code
+syn region spupCode start="^CODE"hs=e+1 end="^\$ENDCODE"he=s-1 contained
+" oneline comments
+if oneline_comments > 3
+ oneline_comments = 2 " default
+endif
+if oneline_comments == 1
+ syn match spupComment "#[^#]*#\="
+elseif oneline_comments == 2
+ syn match spupError "#.*$"
+ syn match spupComment "#[^#]*" nextgroup=spupError
+elseif oneline_comments == 3
+ syn match spupComment "#[^#]*"
+ syn match spupError "#[^#]*#.*"
+endif
+" multiline comments
+syn match spupOpenBrace "{" contained
+syn match spupError "}"
+syn region spupComment matchgroup=spupComment2 start="{" end="}" keepend contains=spupOpenBrace
+
+syn cluster spupOrdinary contains=spupNumber,spupIdentifier,spupSymbol
+syn cluster spupOrdinary add=spupError,spupString,spupComment
+syn cluster spupTextproc contains=spupTextprocGeneric,spupTextprocError
+
+" define synchronizing; especially OPERATION sections can become very large
+syn sync clear
+syn sync minlines=100
+syn sync maxlines=500
+
+syn sync match spupSyncOperation grouphere spupOperation "^OPERATION"
+syn sync match spupSyncCdi grouphere spupCdi "^CDI"
+syn sync match spupSyncConditions grouphere spupConditions "^CONDITIONS"
+syn sync match spupSyncDeclare grouphere spupDeclare "^DECLARE"
+syn sync match spupSyncEstimation grouphere spupEstimation "^ESTIMATION"
+syn sync match spupSyncExternal grouphere spupExternal "^EXTERNAL"
+syn sync match spupSyncFlowsheet grouphere spupFlowsheet "^FLOWSHEET"
+syn sync match spupSyncFunction grouphere spupFunction "^FUNCTION"
+syn sync match spupSyncGlobal grouphere spupGlobal "^GLOBAL"
+syn sync match spupSyncHomotopy grouphere spupHomotopy "^HOMOTOPY"
+syn sync match spupSyncMacro grouphere spupMacro "^MACRO"
+syn sync match spupSyncModel grouphere spupModel "^MODEL"
+syn sync match spupSyncOperation grouphere spupOperation "^OPERATION"
+syn sync match spupSyncOptions grouphere spupOptions "^OPTIONS"
+syn sync match spupSyncProcedure grouphere spupProcedure "^PROCEDURE"
+syn sync match spupSyncProfiles grouphere spupProfiles "^PROFILES"
+syn sync match spupSyncReport grouphere spupReport "^REPORT"
+syn sync match spupSyncTitle grouphere spupTitle "^TITLE"
+syn sync match spupSyncUnit grouphere spupUnit "^UNIT"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+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
+
+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
+
+
+let b:current_syntax = "spup"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim:ts=8
diff --git a/runtime/syntax/spyce.vim b/runtime/syntax/spyce.vim
new file mode 100644
index 0000000..169de19
--- /dev/null
+++ b/runtime/syntax/spyce.vim
@@ -0,0 +1,104 @@
+" Vim syntax file
+" Language: SPYCE
+" Maintainer: Rimon Barr <rimon AT acm DOT org>
+" URL: http://spyce.sourceforge.net
+" Last Change: 2009 Nov 11
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" we define it here so that included files can test for it
+if !exists("main_syntax")
+ let main_syntax='spyce'
+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...
+runtime! syntax/html.vim
+unlet b:current_syntax
+syntax spell default " added by Bram
+
+" include python
+syn include @Python <sfile>:p:h/python.vim
+syn include @Html <sfile>:p:h/html.vim
+
+" spyce definitions
+syn keyword spyceDirectiveKeyword include compact module import contained
+syn keyword spyceDirectiveArg name names file contained
+syn region spyceDirectiveString start=+"+ end=+"+ contained
+syn match spyceDirectiveValue "=[\t ]*[^'", \t>][^, \t>]*"hs=s+1 contained
+
+syn match spyceBeginErrorS ,\[\[,
+syn match spyceBeginErrorA ,<%,
+syn cluster spyceBeginError contains=spyceBeginErrorS,spyceBeginErrorA
+syn match spyceEndErrorS ,\]\],
+syn match spyceEndErrorA ,%>,
+syn cluster spyceEndError contains=spyceEndErrorS,spyceEndErrorA
+
+syn match spyceEscBeginS ,\\\[\[,
+syn match spyceEscBeginA ,\\<%,
+syn cluster spyceEscBegin contains=spyceEscBeginS,spyceEscBeginA
+syn match spyceEscEndS ,\\\]\],
+syn match spyceEscEndA ,\\%>,
+syn cluster spyceEscEnd contains=spyceEscEndS,spyceEscEndA
+syn match spyceEscEndCommentS ,--\\\]\],
+syn match spyceEscEndCommentA ,--\\%>,
+syn cluster spyceEscEndComment contains=spyceEscEndCommentS,spyceEscEndCommentA
+
+syn region spyceStmtS matchgroup=spyceStmtDelim start=,\[\[, end=,\]\], contains=@Python,spyceLambdaS,spyceLambdaA,spyceBeginError keepend
+syn region spyceStmtA matchgroup=spyceStmtDelim start=,<%, end=,%>, contains=@Python,spyceLambdaS,spyceLambdaA,spyceBeginError keepend
+syn region spyceChunkS matchgroup=spyceChunkDelim start=,\[\[\\, end=,\]\], contains=@Python,spyceLambdaS,spyceLambdaA,spyceBeginError keepend
+syn region spyceChunkA matchgroup=spyceChunkDelim start=,<%\\, end=,%>, contains=@Python,spyceLambdaS,spyceLambdaA,spyceBeginError keepend
+syn region spyceEvalS matchgroup=spyceEvalDelim start=,\[\[=, end=,\]\], contains=@Python,spyceLambdaS,spyceLambdaA,spyceBeginError keepend
+syn region spyceEvalA matchgroup=spyceEvalDelim start=,<%=, end=,%>, contains=@Python,spyceLambdaS,spyceLambdaA,spyceBeginError keepend
+syn region spyceDirectiveS matchgroup=spyceDelim start=,\[\[\., end=,\]\], contains=spyceBeginError,spyceDirectiveKeyword,spyceDirectiveArg,spyceDirectiveValue,spyceDirectiveString keepend
+syn region spyceDirectiveA matchgroup=spyceDelim start=,<%@, end=,%>, contains=spyceBeginError,spyceDirectiveKeyword,spyceDirectiveArg,spyceDirectiveValue,spyceDirectiveString keepend
+syn region spyceCommentS matchgroup=spyceCommentDelim start=,\[\[--, end=,--\]\],
+syn region spyceCommentA matchgroup=spyceCommentDelim start=,<%--, end=,--%>,
+syn region spyceLambdaS matchgroup=spyceLambdaDelim start=,\[\[spy!\?, end=,\]\], contains=@Html,@spyce extend
+syn region spyceLambdaA matchgroup=spyceLambdaDelim start=,<%spy!\?, end=,%>, contains=@Html,@spyce extend
+
+syn cluster spyce contains=spyceStmtS,spyceStmtA,spyceChunkS,spyceChunkA,spyceEvalS,spyceEvalA,spyceCommentS,spyceCommentA,spyceDirectiveS,spyceDirectiveA
+
+syn cluster htmlPreproc contains=@spyce
+
+hi link spyceDirectiveKeyword Special
+hi link spyceDirectiveArg Type
+hi link spyceDirectiveString String
+hi link spyceDirectiveValue String
+
+hi link spyceDelim Special
+hi link spyceStmtDelim spyceDelim
+hi link spyceChunkDelim spyceDelim
+hi link spyceEvalDelim spyceDelim
+hi link spyceLambdaDelim spyceDelim
+hi link spyceCommentDelim Comment
+
+hi link spyceBeginErrorS Error
+hi link spyceBeginErrorA Error
+hi link spyceEndErrorS Error
+hi link spyceEndErrorA Error
+
+hi link spyceStmtS spyce
+hi link spyceStmtA spyce
+hi link spyceChunkS spyce
+hi link spyceChunkA spyce
+hi link spyceEvalS spyce
+hi link spyceEvalA spyce
+hi link spyceDirectiveS spyce
+hi link spyceDirectiveA spyce
+hi link spyceCommentS Comment
+hi link spyceCommentA Comment
+hi link spyceLambdaS Normal
+hi link spyceLambdaA Normal
+
+hi link spyce Statement
+
+let b:current_syntax = "spyce"
+if main_syntax == 'spyce'
+ unlet main_syntax
+endif
+
diff --git a/runtime/syntax/sql.vim b/runtime/syntax/sql.vim
new file mode 100644
index 0000000..6de3f4a
--- /dev/null
+++ b/runtime/syntax/sql.vim
@@ -0,0 +1,36 @@
+" Vim syntax file loader
+" Language: SQL
+" Maintainer: David Fishburn <fishburn at ianywhere dot com>
+" Last Change: Thu Sep 15 2005 10:30:02 AM
+" Version: 1.0
+
+" Description: Checks for a:
+" buffer local variable,
+" global variable,
+" If the above exist, it will source the type specified.
+" If none exist, it will source the default sql.vim file.
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Default to the standard Vim distribution file
+let filename = 'sqloracle'
+
+" Check for overrides. Buffer variables have the highest priority.
+if exists("b:sql_type_override")
+ " Check the runtimepath to see if the file exists
+ if globpath(&runtimepath, 'syntax/'.b:sql_type_override.'.vim') != ''
+ let filename = b:sql_type_override
+ endif
+elseif exists("g:sql_type_default")
+ if globpath(&runtimepath, 'syntax/'.g:sql_type_default.'.vim') != ''
+ let filename = g:sql_type_default
+ endif
+endif
+
+" Source the appropriate file
+exec 'runtime syntax/'.filename.'.vim'
+
+" vim:sw=4:
diff --git a/runtime/syntax/sqlanywhere.vim b/runtime/syntax/sqlanywhere.vim
new file mode 100644
index 0000000..e91a99d
--- /dev/null
+++ b/runtime/syntax/sqlanywhere.vim
@@ -0,0 +1,905 @@
+" Vim syntax file
+" Language: SQL, Adaptive Server Anywhere
+" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
+" Last Change: 2013 May 13
+" Version: 16.0.0
+
+" Description: Updated to Adaptive Server Anywhere 16.0.0
+" Updated to Adaptive Server Anywhere 12.0.1 (including spatial data)
+" Updated to Adaptive Server Anywhere 11.0.1
+" Updated to Adaptive Server Anywhere 10.0.1
+" Updated to Adaptive Server Anywhere 9.0.2
+" Updated to Adaptive Server Anywhere 9.0.1
+" Updated to Adaptive Server Anywhere 9.0.0
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" The SQL reserved words, defined as keywords.
+
+syn keyword sqlSpecial false null true
+
+" common functions
+syn keyword sqlFunction abs argn avg bintohex bintostr
+syn keyword sqlFunction byte_length byte_substr char_length
+syn keyword sqlFunction compare count count_big datalength date
+syn keyword sqlFunction date_format dateadd datediff datename
+syn keyword sqlFunction datepart day dayname days debug_eng
+syn keyword sqlFunction dense_rank density dialect difference
+syn keyword sqlFunction dow estimate estimate_source evaluate
+syn keyword sqlFunction experience_estimate explanation
+syn keyword sqlFunction get_identity graphical_plan
+syn keyword sqlFunction graphical_ulplan greater grouping
+syn keyword sqlFunction hextobin hextoint hour hours identity
+syn keyword sqlFunction ifnull index_estimate inttohex isdate
+syn keyword sqlFunction isencrypted isnull isnumeric
+syn keyword sqlFunction lang_message length lesser like_end
+syn keyword sqlFunction like_start list long_ulplan lookup max
+syn keyword sqlFunction min minute minutes month monthname
+syn keyword sqlFunction months newid now nullif number
+syn keyword sqlFunction percent_rank plan quarter rand rank
+syn keyword sqlFunction regexp_compile regexp_compile_patindex
+syn keyword sqlFunction remainder rewrite rowid second seconds
+syn keyword sqlFunction short_ulplan similar sortkey soundex
+syn keyword sqlFunction stddev stack_trace str string strtobin strtouuid stuff
+syn keyword sqlFunction subpartition substr substring sum switchoffset sysdatetimeoffset
+syn keyword sqlFunction textptr todate todatetimeoffset today totimestamp traceback transactsql
+syn keyword sqlFunction ts_index_statistics ts_table_statistics
+syn keyword sqlFunction tsequal ulplan user_id user_name utc_now
+syn keyword sqlFunction uuidtostr varexists variance watcomsql
+syn keyword sqlFunction weeks wsql_state year years ymd
+
+" 9.0.1 functions
+syn keyword sqlFunction acos asin atan atn2 cast ceiling convert cos cot
+syn keyword sqlFunction char_length coalesce dateformat datetime degrees exp
+syn keyword sqlFunction floor getdate insertstr
+syn keyword sqlFunction log log10 lower mod pi power
+syn keyword sqlFunction property radians replicate round sign sin
+syn keyword sqlFunction sqldialect tan truncate truncnum
+syn keyword sqlFunction base64_encode base64_decode
+syn keyword sqlFunction hash compress decompress encrypt decrypt
+
+" 11.0.1 functions
+syn keyword sqlFunction connection_extended_property text_handle_vector_match
+syn keyword sqlFunction read_client_file write_client_file
+
+" 12.0.1 functions
+syn keyword sqlFunction http_response_header
+
+" string functions
+syn keyword sqlFunction ascii char left ltrim repeat
+syn keyword sqlFunction space right rtrim trim lcase ucase
+syn keyword sqlFunction locate charindex patindex replace
+syn keyword sqlFunction errormsg csconvert
+
+" property functions
+syn keyword sqlFunction db_id db_name property_name
+syn keyword sqlFunction property_description property_number
+syn keyword sqlFunction next_connection next_database property
+syn keyword sqlFunction connection_property db_property db_extended_property
+syn keyword sqlFunction event_parmeter event_condition event_condition_name
+
+" sa_ procedures
+syn keyword sqlFunction sa_add_index_consultant_analysis
+syn keyword sqlFunction sa_add_workload_query
+syn keyword sqlFunction sa_app_deregister
+syn keyword sqlFunction sa_app_get_infoStr
+syn keyword sqlFunction sa_app_get_status
+syn keyword sqlFunction sa_app_register
+syn keyword sqlFunction sa_app_registration_unlock
+syn keyword sqlFunction sa_app_set_infoStr
+syn keyword sqlFunction sa_audit_string
+syn keyword sqlFunction sa_check_commit
+syn keyword sqlFunction sa_checkpoint_execute
+syn keyword sqlFunction sa_conn_activity
+syn keyword sqlFunction sa_conn_compression_info
+syn keyword sqlFunction sa_conn_deregister
+syn keyword sqlFunction sa_conn_info
+syn keyword sqlFunction sa_conn_properties
+syn keyword sqlFunction sa_conn_properties_by_conn
+syn keyword sqlFunction sa_conn_properties_by_name
+syn keyword sqlFunction sa_conn_register
+syn keyword sqlFunction sa_conn_set_status
+syn keyword sqlFunction sa_create_analysis_from_query
+syn keyword sqlFunction sa_db_info
+syn keyword sqlFunction sa_db_properties
+syn keyword sqlFunction sa_disable_auditing_type
+syn keyword sqlFunction sa_disable_index
+syn keyword sqlFunction sa_disk_free_space
+syn keyword sqlFunction sa_enable_auditing_type
+syn keyword sqlFunction sa_enable_index
+syn keyword sqlFunction sa_end_forward_to
+syn keyword sqlFunction sa_eng_properties
+syn keyword sqlFunction sa_event_schedules
+syn keyword sqlFunction sa_exec_script
+syn keyword sqlFunction sa_flush_cache
+syn keyword sqlFunction sa_flush_statistics
+syn keyword sqlFunction sa_forward_to
+syn keyword sqlFunction sa_get_dtt
+syn keyword sqlFunction sa_get_histogram
+syn keyword sqlFunction sa_get_request_profile
+syn keyword sqlFunction sa_get_request_profile_sub
+syn keyword sqlFunction sa_get_request_times
+syn keyword sqlFunction sa_get_server_messages
+syn keyword sqlFunction sa_get_simulated_scale_factors
+syn keyword sqlFunction sa_get_workload_capture_status
+syn keyword sqlFunction sa_index_density
+syn keyword sqlFunction sa_index_levels
+syn keyword sqlFunction sa_index_statistics
+syn keyword sqlFunction sa_internal_alter_index_ability
+syn keyword sqlFunction sa_internal_create_analysis_from_query
+syn keyword sqlFunction sa_internal_disk_free_space
+syn keyword sqlFunction sa_internal_get_dtt
+syn keyword sqlFunction sa_internal_get_histogram
+syn keyword sqlFunction sa_internal_get_request_times
+syn keyword sqlFunction sa_internal_get_simulated_scale_factors
+syn keyword sqlFunction sa_internal_get_workload_capture_status
+syn keyword sqlFunction sa_internal_index_density
+syn keyword sqlFunction sa_internal_index_levels
+syn keyword sqlFunction sa_internal_index_statistics
+syn keyword sqlFunction sa_internal_java_loaded_classes
+syn keyword sqlFunction sa_internal_locks
+syn keyword sqlFunction sa_internal_pause_workload_capture
+syn keyword sqlFunction sa_internal_procedure_profile
+syn keyword sqlFunction sa_internal_procedure_profile_summary
+syn keyword sqlFunction sa_internal_read_backup_history
+syn keyword sqlFunction sa_internal_recommend_indexes
+syn keyword sqlFunction sa_internal_reset_identity
+syn keyword sqlFunction sa_internal_resume_workload_capture
+syn keyword sqlFunction sa_internal_start_workload_capture
+syn keyword sqlFunction sa_internal_stop_index_consultant
+syn keyword sqlFunction sa_internal_stop_workload_capture
+syn keyword sqlFunction sa_internal_table_fragmentation
+syn keyword sqlFunction sa_internal_table_page_usage
+syn keyword sqlFunction sa_internal_table_stats
+syn keyword sqlFunction sa_internal_virtual_sysindex
+syn keyword sqlFunction sa_internal_virtual_sysixcol
+syn keyword sqlFunction sa_java_loaded_classes
+syn keyword sqlFunction sa_jdk_version
+syn keyword sqlFunction sa_locks
+syn keyword sqlFunction sa_make_object
+syn keyword sqlFunction sa_pause_workload_capture
+syn keyword sqlFunction sa_proc_debug_attach_to_connection
+syn keyword sqlFunction sa_proc_debug_connect
+syn keyword sqlFunction sa_proc_debug_detach_from_connection
+syn keyword sqlFunction sa_proc_debug_disconnect
+syn keyword sqlFunction sa_proc_debug_get_connection_name
+syn keyword sqlFunction sa_proc_debug_release_connection
+syn keyword sqlFunction sa_proc_debug_request
+syn keyword sqlFunction sa_proc_debug_version
+syn keyword sqlFunction sa_proc_debug_wait_for_connection
+syn keyword sqlFunction sa_procedure_profile
+syn keyword sqlFunction sa_procedure_profile_summary
+syn keyword sqlFunction sa_read_backup_history
+syn keyword sqlFunction sa_recommend_indexes
+syn keyword sqlFunction sa_recompile_views
+syn keyword sqlFunction sa_remove_index_consultant_analysis
+syn keyword sqlFunction sa_remove_index_consultant_workload
+syn keyword sqlFunction sa_reset_identity
+syn keyword sqlFunction sa_resume_workload_capture
+syn keyword sqlFunction sa_server_option
+syn keyword sqlFunction sa_set_simulated_scale_factor
+syn keyword sqlFunction sa_setremoteuser
+syn keyword sqlFunction sa_setsubscription
+syn keyword sqlFunction sa_start_recording_commits
+syn keyword sqlFunction sa_start_workload_capture
+syn keyword sqlFunction sa_statement_text
+syn keyword sqlFunction sa_stop_index_consultant
+syn keyword sqlFunction sa_stop_recording_commits
+syn keyword sqlFunction sa_stop_workload_capture
+syn keyword sqlFunction sa_sync
+syn keyword sqlFunction sa_sync_sub
+syn keyword sqlFunction sa_table_fragmentation
+syn keyword sqlFunction sa_table_page_usage
+syn keyword sqlFunction sa_table_stats
+syn keyword sqlFunction sa_update_index_consultant_workload
+syn keyword sqlFunction sa_validate
+syn keyword sqlFunction sa_virtual_sysindex
+syn keyword sqlFunction sa_virtual_sysixcol
+
+" sp_ procedures
+syn keyword sqlFunction sp_addalias
+syn keyword sqlFunction sp_addauditrecord
+syn keyword sqlFunction sp_adddumpdevice
+syn keyword sqlFunction sp_addgroup
+syn keyword sqlFunction sp_addlanguage
+syn keyword sqlFunction sp_addlogin
+syn keyword sqlFunction sp_addmessage
+syn keyword sqlFunction sp_addremotelogin
+syn keyword sqlFunction sp_addsegment
+syn keyword sqlFunction sp_addserver
+syn keyword sqlFunction sp_addthreshold
+syn keyword sqlFunction sp_addtype
+syn keyword sqlFunction sp_adduser
+syn keyword sqlFunction sp_auditdatabase
+syn keyword sqlFunction sp_auditlogin
+syn keyword sqlFunction sp_auditobject
+syn keyword sqlFunction sp_auditoption
+syn keyword sqlFunction sp_auditsproc
+syn keyword sqlFunction sp_bindefault
+syn keyword sqlFunction sp_bindmsg
+syn keyword sqlFunction sp_bindrule
+syn keyword sqlFunction sp_changedbowner
+syn keyword sqlFunction sp_changegroup
+syn keyword sqlFunction sp_checknames
+syn keyword sqlFunction sp_checkperms
+syn keyword sqlFunction sp_checkreswords
+syn keyword sqlFunction sp_clearstats
+syn keyword sqlFunction sp_column_privileges
+syn keyword sqlFunction sp_columns
+syn keyword sqlFunction sp_commonkey
+syn keyword sqlFunction sp_configure
+syn keyword sqlFunction sp_cursorinfo
+syn keyword sqlFunction sp_databases
+syn keyword sqlFunction sp_datatype_info
+syn keyword sqlFunction sp_dboption
+syn keyword sqlFunction sp_dbremap
+syn keyword sqlFunction sp_depends
+syn keyword sqlFunction sp_diskdefault
+syn keyword sqlFunction sp_displaylogin
+syn keyword sqlFunction sp_dropalias
+syn keyword sqlFunction sp_dropdevice
+syn keyword sqlFunction sp_dropgroup
+syn keyword sqlFunction sp_dropkey
+syn keyword sqlFunction sp_droplanguage
+syn keyword sqlFunction sp_droplogin
+syn keyword sqlFunction sp_dropmessage
+syn keyword sqlFunction sp_dropremotelogin
+syn keyword sqlFunction sp_dropsegment
+syn keyword sqlFunction sp_dropserver
+syn keyword sqlFunction sp_dropthreshold
+syn keyword sqlFunction sp_droptype
+syn keyword sqlFunction sp_dropuser
+syn keyword sqlFunction sp_estspace
+syn keyword sqlFunction sp_extendsegment
+syn keyword sqlFunction sp_fkeys
+syn keyword sqlFunction sp_foreignkey
+syn keyword sqlFunction sp_getmessage
+syn keyword sqlFunction sp_help
+syn keyword sqlFunction sp_helpconstraint
+syn keyword sqlFunction sp_helpdb
+syn keyword sqlFunction sp_helpdevice
+syn keyword sqlFunction sp_helpgroup
+syn keyword sqlFunction sp_helpindex
+syn keyword sqlFunction sp_helpjoins
+syn keyword sqlFunction sp_helpkey
+syn keyword sqlFunction sp_helplanguage
+syn keyword sqlFunction sp_helplog
+syn keyword sqlFunction sp_helpprotect
+syn keyword sqlFunction sp_helpremotelogin
+syn keyword sqlFunction sp_helpsegment
+syn keyword sqlFunction sp_helpserver
+syn keyword sqlFunction sp_helpsort
+syn keyword sqlFunction sp_helptext
+syn keyword sqlFunction sp_helpthreshold
+syn keyword sqlFunction sp_helpuser
+syn keyword sqlFunction sp_indsuspect
+syn keyword sqlFunction sp_lock
+syn keyword sqlFunction sp_locklogin
+syn keyword sqlFunction sp_logdevice
+syn keyword sqlFunction sp_login_environment
+syn keyword sqlFunction sp_modifylogin
+syn keyword sqlFunction sp_modifythreshold
+syn keyword sqlFunction sp_monitor
+syn keyword sqlFunction sp_password
+syn keyword sqlFunction sp_pkeys
+syn keyword sqlFunction sp_placeobject
+syn keyword sqlFunction sp_primarykey
+syn keyword sqlFunction sp_procxmode
+syn keyword sqlFunction sp_recompile
+syn keyword sqlFunction sp_remap
+syn keyword sqlFunction sp_remote_columns
+syn keyword sqlFunction sp_remote_exported_keys
+syn keyword sqlFunction sp_remote_imported_keys
+syn keyword sqlFunction sp_remote_pcols
+syn keyword sqlFunction sp_remote_primary_keys
+syn keyword sqlFunction sp_remote_procedures
+syn keyword sqlFunction sp_remote_tables
+syn keyword sqlFunction sp_remoteoption
+syn keyword sqlFunction sp_rename
+syn keyword sqlFunction sp_renamedb
+syn keyword sqlFunction sp_reportstats
+syn keyword sqlFunction sp_reset_tsql_environment
+syn keyword sqlFunction sp_role
+syn keyword sqlFunction sp_server_info
+syn keyword sqlFunction sp_servercaps
+syn keyword sqlFunction sp_serverinfo
+syn keyword sqlFunction sp_serveroption
+syn keyword sqlFunction sp_setlangalias
+syn keyword sqlFunction sp_setreplicate
+syn keyword sqlFunction sp_setrepproc
+syn keyword sqlFunction sp_setreptable
+syn keyword sqlFunction sp_spaceused
+syn keyword sqlFunction sp_special_columns
+syn keyword sqlFunction sp_sproc_columns
+syn keyword sqlFunction sp_statistics
+syn keyword sqlFunction sp_stored_procedures
+syn keyword sqlFunction sp_syntax
+syn keyword sqlFunction sp_table_privileges
+syn keyword sqlFunction sp_tables
+syn keyword sqlFunction sp_tsql_environment
+syn keyword sqlFunction sp_tsql_feature_not_supported
+syn keyword sqlFunction sp_unbindefault
+syn keyword sqlFunction sp_unbindmsg
+syn keyword sqlFunction sp_unbindrule
+syn keyword sqlFunction sp_volchanged
+syn keyword sqlFunction sp_who
+syn keyword sqlFunction xp_scanf
+syn keyword sqlFunction xp_sprintf
+
+" server functions
+syn keyword sqlFunction col_length
+syn keyword sqlFunction col_name
+syn keyword sqlFunction index_col
+syn keyword sqlFunction object_id
+syn keyword sqlFunction object_name
+syn keyword sqlFunction proc_role
+syn keyword sqlFunction show_role
+syn keyword sqlFunction xp_cmdshell
+syn keyword sqlFunction xp_msver
+syn keyword sqlFunction xp_read_file
+syn keyword sqlFunction xp_real_cmdshell
+syn keyword sqlFunction xp_real_read_file
+syn keyword sqlFunction xp_real_sendmail
+syn keyword sqlFunction xp_real_startmail
+syn keyword sqlFunction xp_real_startsmtp
+syn keyword sqlFunction xp_real_stopmail
+syn keyword sqlFunction xp_real_stopsmtp
+syn keyword sqlFunction xp_real_write_file
+syn keyword sqlFunction xp_scanf
+syn keyword sqlFunction xp_sendmail
+syn keyword sqlFunction xp_sprintf
+syn keyword sqlFunction xp_startmail
+syn keyword sqlFunction xp_startsmtp
+syn keyword sqlFunction xp_stopmail
+syn keyword sqlFunction xp_stopsmtp
+syn keyword sqlFunction xp_write_file
+
+" http functions
+syn keyword sqlFunction http_header http_variable
+syn keyword sqlFunction next_http_header next_http_response_header next_http_variable
+syn keyword sqlFunction sa_set_http_header sa_set_http_option
+syn keyword sqlFunction sa_http_variable_info sa_http_header_info
+
+" http functions 9.0.1
+syn keyword sqlFunction http_encode http_decode
+syn keyword sqlFunction html_encode html_decode
+
+" XML function support
+syn keyword sqlFunction openxml xmlelement xmlforest xmlgen xmlconcat xmlagg
+syn keyword sqlFunction xmlattributes
+
+" Spatial Compatibility Functions
+syn keyword sqlFunction ST_BdMPolyFromText
+syn keyword sqlFunction ST_BdMPolyFromWKB
+syn keyword sqlFunction ST_BdPolyFromText
+syn keyword sqlFunction ST_BdPolyFromWKB
+syn keyword sqlFunction ST_CPolyFromText
+syn keyword sqlFunction ST_CPolyFromWKB
+syn keyword sqlFunction ST_CircularFromTxt
+syn keyword sqlFunction ST_CircularFromWKB
+syn keyword sqlFunction ST_CompoundFromTxt
+syn keyword sqlFunction ST_CompoundFromWKB
+syn keyword sqlFunction ST_GeomCollFromTxt
+syn keyword sqlFunction ST_GeomCollFromWKB
+syn keyword sqlFunction ST_GeomFromText
+syn keyword sqlFunction ST_GeomFromWKB
+syn keyword sqlFunction ST_LineFromText
+syn keyword sqlFunction ST_LineFromWKB
+syn keyword sqlFunction ST_MCurveFromText
+syn keyword sqlFunction ST_MCurveFromWKB
+syn keyword sqlFunction ST_MLineFromText
+syn keyword sqlFunction ST_MLineFromWKB
+syn keyword sqlFunction ST_MPointFromText
+syn keyword sqlFunction ST_MPointFromWKB
+syn keyword sqlFunction ST_MPolyFromText
+syn keyword sqlFunction ST_MPolyFromWKB
+syn keyword sqlFunction ST_MSurfaceFromTxt
+syn keyword sqlFunction ST_MSurfaceFromWKB
+syn keyword sqlFunction ST_OrderingEquals
+syn keyword sqlFunction ST_PointFromText
+syn keyword sqlFunction ST_PointFromWKB
+syn keyword sqlFunction ST_PolyFromText
+syn keyword sqlFunction ST_PolyFromWKB
+" Spatial Structural Methods
+syn keyword sqlFunction ST_CoordDim
+syn keyword sqlFunction ST_CurveN
+syn keyword sqlFunction ST_Dimension
+syn keyword sqlFunction ST_EndPoint
+syn keyword sqlFunction ST_ExteriorRing
+syn keyword sqlFunction ST_GeometryN
+syn keyword sqlFunction ST_GeometryType
+syn keyword sqlFunction ST_InteriorRingN
+syn keyword sqlFunction ST_Is3D
+syn keyword sqlFunction ST_IsClosed
+syn keyword sqlFunction ST_IsEmpty
+syn keyword sqlFunction ST_IsMeasured
+syn keyword sqlFunction ST_IsRing
+syn keyword sqlFunction ST_IsSimple
+syn keyword sqlFunction ST_IsValid
+syn keyword sqlFunction ST_NumCurves
+syn keyword sqlFunction ST_NumGeometries
+syn keyword sqlFunction ST_NumInteriorRing
+syn keyword sqlFunction ST_NumPoints
+syn keyword sqlFunction ST_PointN
+syn keyword sqlFunction ST_StartPoint
+"Spatial Computation
+syn keyword sqlFunction ST_Length
+syn keyword sqlFunction ST_Area
+syn keyword sqlFunction ST_Centroid
+syn keyword sqlFunction ST_Area
+syn keyword sqlFunction ST_Centroid
+syn keyword sqlFunction ST_IsWorld
+syn keyword sqlFunction ST_Perimeter
+syn keyword sqlFunction ST_PointOnSurface
+syn keyword sqlFunction ST_Distance
+" Spatial Input/Output
+syn keyword sqlFunction ST_AsBinary
+syn keyword sqlFunction ST_AsGML
+syn keyword sqlFunction ST_AsGeoJSON
+syn keyword sqlFunction ST_AsSVG
+syn keyword sqlFunction ST_AsSVGAggr
+syn keyword sqlFunction ST_AsText
+syn keyword sqlFunction ST_AsWKB
+syn keyword sqlFunction ST_AsWKT
+syn keyword sqlFunction ST_AsXML
+syn keyword sqlFunction ST_GeomFromBinary
+syn keyword sqlFunction ST_GeomFromShape
+syn keyword sqlFunction ST_GeomFromText
+syn keyword sqlFunction ST_GeomFromWKB
+syn keyword sqlFunction ST_GeomFromWKT
+syn keyword sqlFunction ST_GeomFromXML
+" Spatial Cast Methods
+syn keyword sqlFunction ST_CurvePolyToPoly
+syn keyword sqlFunction ST_CurveToLine
+syn keyword sqlFunction ST_ToCircular
+syn keyword sqlFunction ST_ToCompound
+syn keyword sqlFunction ST_ToCurve
+syn keyword sqlFunction ST_ToCurvePoly
+syn keyword sqlFunction ST_ToGeomColl
+syn keyword sqlFunction ST_ToLineString
+syn keyword sqlFunction ST_ToMultiCurve
+syn keyword sqlFunction ST_ToMultiLine
+syn keyword sqlFunction ST_ToMultiPoint
+syn keyword sqlFunction ST_ToMultiPolygon
+syn keyword sqlFunction ST_ToMultiSurface
+syn keyword sqlFunction ST_ToPoint
+syn keyword sqlFunction ST_ToPolygon
+syn keyword sqlFunction ST_ToSurface
+
+" Array functions 16.x
+syn keyword sqlFunction array array_agg array_max_cardinality trim_array
+syn keyword sqlFunction error_line error_message error_procedure
+syn keyword sqlFunction error_sqlcode error_sqlstate error_stack_trace
+
+
+" keywords
+syn keyword sqlKeyword absolute accent access account action active activate add address admin
+syn keyword sqlKeyword aes_decrypt after aggregate algorithm allow_dup_row allow allowed alter
+syn keyword sqlKeyword always and angular ansi_substring any as append apply
+syn keyword sqlKeyword arbiter array asc ascii ase
+syn keyword sqlKeyword assign at atan2 atomic attended
+syn keyword sqlKeyword audit auditing authentication authorization axis
+syn keyword sqlKeyword autoincrement autostop batch bcp before
+syn keyword sqlKeyword between bit_and bit_length bit_or bit_substr bit_xor
+syn keyword sqlKeyword blank blanks block
+syn keyword sqlKeyword both bottom unbounded breaker bufferpool
+syn keyword sqlKeyword build bulk by byte bytes cache calibrate calibration
+syn keyword sqlKeyword cancel capability cardinality cascade cast
+syn keyword sqlKeyword catalog catch ceil change changes char char_convert
+syn keyword sqlKeyword check checkpointlog checksum class classes client cmp
+syn keyword sqlKeyword cluster clustered collation
+syn keyword sqlKeyword column columns
+syn keyword sqlKeyword command comments committed commitid comparisons
+syn keyword sqlKeyword compatible component compressed compute computes
+syn keyword sqlKeyword concat configuration confirm conflict connection
+syn keyword sqlKeyword console consolidate consolidated
+syn keyword sqlKeyword constraint constraints content
+syn keyword sqlKeyword convert coordinate coordinator copy count count_set_bits
+syn keyword sqlKeyword crc createtime critical cross cube cume_dist
+syn keyword sqlKeyword current cursor data data database
+syn keyword sqlKeyword current_timestamp current_user cycle
+syn keyword sqlKeyword databases datatype dba dbfile
+syn keyword sqlKeyword dbspace dbspaces dbspacename debug decoupled
+syn keyword sqlKeyword decrypted default defaults default_dbspace deferred
+syn keyword sqlKeyword definer definition
+syn keyword sqlKeyword delay deleting delimited dependencies desc
+syn keyword sqlKeyword description deterministic directory
+syn keyword sqlKeyword disable disabled disallow distinct disksandbox disk_sandbox
+syn keyword sqlKeyword dn do domain download duplicate
+syn keyword sqlKeyword dsetpass dttm dynamic each earth editproc effective ejb
+syn keyword sqlKeyword elimination ellipsoid else elseif
+syn keyword sqlKeyword email empty enable encapsulated encrypted encryption end
+syn keyword sqlKeyword encoding endif engine environment erase error errors escape escapes event
+syn keyword sqlKeyword event_parameter every exception exclude excluded exclusive exec
+syn keyword sqlKeyword existing exists expanded expiry express exprtype extended_property
+syn keyword sqlKeyword external externlogin factor failover false
+syn keyword sqlKeyword fastfirstrow feature fieldproc file files filler
+syn keyword sqlKeyword fillfactor final finish first first_keyword first_value
+syn keyword sqlKeyword flattening
+syn keyword sqlKeyword following force foreign format forjson forxml forxml_sep fp frame
+syn keyword sqlKeyword free freepage french fresh full function
+syn keyword sqlKeyword gb generic get_bit go global grid
+syn keyword sqlKeyword group handler hash having header hexadecimal
+syn keyword sqlKeyword hidden high history hg hng hold holdlock host
+syn keyword sqlKeyword hours http_body http_session_timeout id identified identity ignore
+syn keyword sqlKeyword ignore_dup_key ignore_dup_row immediate
+syn keyword sqlKeyword in inactiv inactive inactivity included increment incremental
+syn keyword sqlKeyword index index_enabled index_lparen indexonly info information
+syn keyword sqlKeyword inheritance inline inner inout insensitive inserting
+syn keyword sqlKeyword instead
+syn keyword sqlKeyword internal intersection into introduced inverse invoker
+syn keyword sqlKeyword iq is isolation
+syn keyword sqlKeyword jar java java_location java_main_userid java_vm_options
+syn keyword sqlKeyword jconnect jdk join json kb key keys keep language last
+syn keyword sqlKeyword last_keyword last_value lateral latitude
+syn keyword sqlKeyword ld ldap left len linear lf ln level like
+syn keyword sqlKeyword limit local location log
+syn keyword sqlKeyword logging logical login logscan long longitude low lru ls
+syn keyword sqlKeyword main major manage manual mark master
+syn keyword sqlKeyword match matched materialized max maxvalue maximum mb measure median membership
+syn keyword sqlKeyword merge metadata methods migrate minimum minor minutes minvalue mirror
+syn keyword sqlKeyword mode modify monitor move mru multiplex
+syn keyword sqlKeyword name named namespaces national native natural new next nextval
+syn keyword sqlKeyword ngram no noholdlock nolock nonclustered none normal not
+syn keyword sqlKeyword notify null nullable_constant nulls
+syn keyword sqlKeyword object objects oem_string of off offline offset olap
+syn keyword sqlKeyword old on online only openstring operator
+syn keyword sqlKeyword optimization optimizer option
+syn keyword sqlKeyword or order ordinality organization others out outer over owner
+syn keyword sqlKeyword package packetsize padding page pages
+syn keyword sqlKeyword paglock parallel parameter parent part partial
+syn keyword sqlKeyword partition partitions partner password path pctfree
+syn keyword sqlKeyword permissions perms plan planar policy polygon populate port postfilter preceding
+syn keyword sqlKeyword precisionprefetch prefilter prefix preserve preview previous
+syn keyword sqlKeyword primary prior priority priqty private privilege privileges procedure profile profiling
+syn keyword sqlKeyword property_is_cumulative property_is_numeric public publication publish publisher
+syn keyword sqlKeyword quiesce quote quotes range readclientfile readcommitted reader readfile readonly
+syn keyword sqlKeyword readpast readuncommitted readwrite rebuild
+syn keyword sqlKeyword received recompile recover recursive references
+syn keyword sqlKeyword referencing regex regexp regexp_substr relative relocate
+syn keyword sqlKeyword rename repeatable repeatableread replicate replication
+syn keyword sqlKeyword requests request_timeout required rereceive resend reserve reset
+syn keyword sqlKeyword resizing resolve resource respect restart
+syn keyword sqlKeyword restrict result retain retries
+syn keyword sqlKeyword returns reverse right role roles
+syn keyword sqlKeyword rollup root row row_number rowlock rows rowtype
+syn keyword sqlKeyword sa_index_hash sa_internal_fk_verify sa_internal_termbreak
+syn keyword sqlKeyword sa_order_preserving_hash sa_order_preserving_hash_big sa_order_preserving_hash_prefix
+syn keyword sqlKeyword sa_file_free_pages sa_internal_type_from_catalog sa_internal_valid_hash
+syn keyword sqlKeyword sa_internal_validate_value sa_json_element
+syn keyword sqlKeyword scale schedule schema scope script scripted scroll search seconds secqty security
+syn keyword sqlKeyword semi send sensitive sent sequence serializable
+syn keyword sqlKeyword server severity session set_bit set_bits sets
+syn keyword sqlKeyword shapefile share side simple since site size skip
+syn keyword sqlKeyword snap snapshot soapheader soap_header
+syn keyword sqlKeyword spatial split some sorted_data
+syn keyword sqlKeyword sql sqlcode sqlid sqlflagger sqlstate sqrt square
+syn keyword sqlKeyword stacker stale state statement statistics status stddev_pop stddev_samp
+syn keyword sqlKeyword stemmer stogroup stoplist storage store
+syn keyword sqlKeyword strip stripesizekb striping subpages subscribe subscription
+syn keyword sqlKeyword subtransaction suser_id suser_name suspend synchronization
+syn keyword sqlKeyword syntax_error table tables tablock
+syn keyword sqlKeyword tablockx target tb temp template temporary term then ties
+syn keyword sqlKeyword timezone timeout tls to to_char to_nchar tolerance top
+syn keyword sqlKeyword trace traced_plan tracing
+syn keyword sqlKeyword transfer transform transaction transactional treat tries
+syn keyword sqlKeyword true try tsequal type tune uncommitted unconditionally
+syn keyword sqlKeyword unenforced unicode unique unistr unit unknown unlimited unload
+syn keyword sqlKeyword unpartition unquiesce updatetime updating updlock upgrade upload
+syn keyword sqlKeyword upper usage use user
+syn keyword sqlKeyword using utc utilities validproc
+syn keyword sqlKeyword value values varchar variable
+syn keyword sqlKeyword varying var_pop var_samp vcat verbosity
+syn keyword sqlKeyword verify versions view virtual wait
+syn keyword sqlKeyword warning wd web when where with with_auto
+syn keyword sqlKeyword with_auto with_cube with_rollup without
+syn keyword sqlKeyword with_lparen within word work workload write writefile
+syn keyword sqlKeyword writeclientfile writer writers writeserver xlock
+syn keyword sqlKeyword war xml zeros zone
+" XML
+syn keyword sqlKeyword raw auto elements explicit
+" HTTP support
+syn keyword sqlKeyword authorization secure url service next_soap_header
+" HTTP 9.0.2 new procedure keywords
+syn keyword sqlKeyword namespace certificate certificates clientport proxy trusted_certificates_file
+" OLAP support 9.0.0
+syn keyword sqlKeyword covar_pop covar_samp corr regr_slope regr_intercept
+syn keyword sqlKeyword regr_count regr_r2 regr_avgx regr_avgy
+syn keyword sqlKeyword regr_sxx regr_syy regr_sxy
+
+" Alternate keywords
+syn keyword sqlKeyword character dec options proc reference
+syn keyword sqlKeyword subtrans tran syn keyword
+
+" Login Mode Options
+syn keyword sqlKeywordLogin standard integrated kerberos LDAPUA
+syn keyword sqlKeywordLogin cloudadmin mixed
+
+" Spatial Predicates
+syn keyword sqlKeyword ST_Contains
+syn keyword sqlKeyword ST_ContainsFilter
+syn keyword sqlKeyword ST_CoveredBy
+syn keyword sqlKeyword ST_CoveredByFilter
+syn keyword sqlKeyword ST_Covers
+syn keyword sqlKeyword ST_CoversFilter
+syn keyword sqlKeyword ST_Crosses
+syn keyword sqlKeyword ST_Disjoint
+syn keyword sqlKeyword ST_Equals
+syn keyword sqlKeyword ST_EqualsFilter
+syn keyword sqlKeyword ST_Intersects
+syn keyword sqlKeyword ST_IntersectsFilter
+syn keyword sqlKeyword ST_IntersectsRect
+syn keyword sqlKeyword ST_OrderingEquals
+syn keyword sqlKeyword ST_Overlaps
+syn keyword sqlKeyword ST_Relate
+syn keyword sqlKeyword ST_Touches
+syn keyword sqlKeyword ST_Within
+syn keyword sqlKeyword ST_WithinFilter
+" Spatial Set operations
+syn keyword sqlKeyword ST_Affine
+syn keyword sqlKeyword ST_Boundary
+syn keyword sqlKeyword ST_Buffer
+syn keyword sqlKeyword ST_ConvexHull
+syn keyword sqlKeyword ST_ConvexHullAggr
+syn keyword sqlKeyword ST_Difference
+syn keyword sqlKeyword ST_Intersection
+syn keyword sqlKeyword ST_IntersectionAggr
+syn keyword sqlKeyword ST_SymDifference
+syn keyword sqlKeyword ST_Union
+syn keyword sqlKeyword ST_UnionAggr
+" Spatial Bounds
+syn keyword sqlKeyword ST_Envelope
+syn keyword sqlKeyword ST_EnvelopeAggr
+syn keyword sqlKeyword ST_Lat
+syn keyword sqlKeyword ST_LatMax
+syn keyword sqlKeyword ST_LatMin
+syn keyword sqlKeyword ST_Long
+syn keyword sqlKeyword ST_LongMax
+syn keyword sqlKeyword ST_LongMin
+syn keyword sqlKeyword ST_M
+syn keyword sqlKeyword ST_MMax
+syn keyword sqlKeyword ST_MMin
+syn keyword sqlKeyword ST_Point
+syn keyword sqlKeyword ST_X
+syn keyword sqlKeyword ST_XMax
+syn keyword sqlKeyword ST_XMin
+syn keyword sqlKeyword ST_Y
+syn keyword sqlKeyword ST_YMax
+syn keyword sqlKeyword ST_YMin
+syn keyword sqlKeyword ST_Z
+syn keyword sqlKeyword ST_ZMax
+syn keyword sqlKeyword ST_ZMin
+" Spatial Collection Aggregates
+syn keyword sqlKeyword ST_GeomCollectionAggr
+syn keyword sqlKeyword ST_LineStringAggr
+syn keyword sqlKeyword ST_MultiCurveAggr
+syn keyword sqlKeyword ST_MultiLineStringAggr
+syn keyword sqlKeyword ST_MultiPointAggr
+syn keyword sqlKeyword ST_MultiPolygonAggr
+syn keyword sqlKeyword ST_MultiSurfaceAggr
+syn keyword sqlKeyword ST_Perimeter
+syn keyword sqlKeyword ST_PointOnSurface
+" Spatial SRS
+syn keyword sqlKeyword ST_CompareWKT
+syn keyword sqlKeyword ST_FormatWKT
+syn keyword sqlKeyword ST_ParseWKT
+syn keyword sqlKeyword ST_TransformGeom
+syn keyword sqlKeyword ST_GeometryTypeFromBaseType
+syn keyword sqlKeyword ST_SnapToGrid
+syn keyword sqlKeyword ST_Transform
+syn keyword sqlKeyword ST_SRID
+syn keyword sqlKeyword ST_SRIDFromBaseType
+syn keyword sqlKeyword ST_LoadConfigurationData
+" Spatial Indexes
+syn keyword sqlKeyword ST_LinearHash
+syn keyword sqlKeyword ST_LinearUnHash
+
+syn keyword sqlOperator in any some all between exists
+syn keyword sqlOperator like escape not is and or
+syn keyword sqlOperator minus
+syn keyword sqlOperator prior distinct unnest
+
+syn keyword sqlStatement allocate alter attach backup begin break call case catch
+syn keyword sqlStatement checkpoint clear close comment commit configure connect
+syn keyword sqlStatement continue create deallocate declare delete describe
+syn keyword sqlStatement detach disconnect drop except execute exit explain fetch
+syn keyword sqlStatement for forward from get goto grant help if include
+syn keyword sqlStatement input insert install intersect leave load lock loop
+syn keyword sqlStatement message open output parameters passthrough
+syn keyword sqlStatement prepare print put raiserror read readtext refresh release
+syn keyword sqlStatement remote remove reorganize resignal restore resume
+syn keyword sqlStatement return revoke rollback save savepoint select
+syn keyword sqlStatement set setuser signal start stop synchronize
+syn keyword sqlStatement system trigger truncate try union unload update
+syn keyword sqlStatement validate waitfor whenever while window writetext
+
+
+syn keyword sqlType char nchar long varchar nvarchar text ntext uniqueidentifierstr xml
+syn keyword sqlType bigint bit decimal double varbit
+syn keyword sqlType float int integer numeric
+syn keyword sqlType smallint tinyint real
+syn keyword sqlType money smallmoney
+syn keyword sqlType date datetime datetimeoffset smalldatetime time timestamp
+syn keyword sqlType binary image varray varbinary uniqueidentifier
+syn keyword sqlType unsigned
+" Spatial types
+syn keyword sqlType st_geometry st_point st_curve st_surface st_geomcollection
+syn keyword sqlType st_linestring st_circularstring st_compoundcurve
+syn keyword sqlType st_curvepolygon st_polygon
+syn keyword sqlType st_multipoint st_multicurve st_multisurface
+syn keyword sqlType st_multilinestring st_multipolygon
+
+syn keyword sqlOption Allow_nulls_by_default
+syn keyword sqlOption Allow_read_client_file
+syn keyword sqlOption Allow_snapshot_isolation
+syn keyword sqlOption Allow_write_client_file
+syn keyword sqlOption Ansi_blanks
+syn keyword sqlOption Ansi_close_cursors_on_rollback
+syn keyword sqlOption Ansi_permissions
+syn keyword sqlOption Ansi_substring
+syn keyword sqlOption Ansi_update_constraints
+syn keyword sqlOption Ansinull
+syn keyword sqlOption Auditing
+syn keyword sqlOption Auditing_options
+syn keyword sqlOption Auto_commit_on_create_local_temp_index
+syn keyword sqlOption Background_priority
+syn keyword sqlOption Blocking
+syn keyword sqlOption Blocking_others_timeout
+syn keyword sqlOption Blocking_timeout
+syn keyword sqlOption Chained
+syn keyword sqlOption Checkpoint_time
+syn keyword sqlOption Cis_option
+syn keyword sqlOption Cis_rowset_size
+syn keyword sqlOption Close_on_endtrans
+syn keyword sqlOption Collect_statistics_on_dml_updates
+syn keyword sqlOption Conn_auditing
+syn keyword sqlOption Connection_authentication
+syn keyword sqlOption Continue_after_raiserror
+syn keyword sqlOption Conversion_error
+syn keyword sqlOption Cooperative_commit_timeout
+syn keyword sqlOption Cooperative_commits
+syn keyword sqlOption Database_authentication
+syn keyword sqlOption Date_format
+syn keyword sqlOption Date_order
+syn keyword sqlOption db_publisher
+syn keyword sqlOption Debug_messages
+syn keyword sqlOption Dedicated_task
+syn keyword sqlOption Default_dbspace
+syn keyword sqlOption Default_timestamp_increment
+syn keyword sqlOption Delayed_commit_timeout
+syn keyword sqlOption Delayed_commits
+syn keyword sqlOption Divide_by_zero_error
+syn keyword sqlOption Escape_character
+syn keyword sqlOption Exclude_operators
+syn keyword sqlOption Extended_join_syntax
+syn keyword sqlOption Extern_login_credentials
+syn keyword sqlOption Fire_triggers
+syn keyword sqlOption First_day_of_week
+syn keyword sqlOption For_xml_null_treatment
+syn keyword sqlOption Force_view_creation
+syn keyword sqlOption Global_database_id
+syn keyword sqlOption Http_session_timeout
+syn keyword sqlOption Http_connection_pool_basesize
+syn keyword sqlOption Http_connection_pool_timeout
+syn keyword sqlOption Integrated_server_name
+syn keyword sqlOption Isolation_level
+syn keyword sqlOption Java_class_path
+syn keyword sqlOption Java_location
+syn keyword sqlOption Java_main_userid
+syn keyword sqlOption Java_vm_options
+syn keyword sqlOption Lock_rejected_rows
+syn keyword sqlOption Log_deadlocks
+syn keyword sqlOption Login_mode
+syn keyword sqlOption Login_procedure
+syn keyword sqlOption Materialized_view_optimization
+syn keyword sqlOption Max_client_statements_cached
+syn keyword sqlOption Max_cursor_count
+syn keyword sqlOption Max_hash_size
+syn keyword sqlOption Max_plans_cached
+syn keyword sqlOption Max_priority
+syn keyword sqlOption Max_query_tasks
+syn keyword sqlOption Max_recursive_iterations
+syn keyword sqlOption Max_statement_count
+syn keyword sqlOption Max_temp_space
+syn keyword sqlOption Min_password_length
+syn keyword sqlOption Min_role_admins
+syn keyword sqlOption Nearest_century
+syn keyword sqlOption Non_keywords
+syn keyword sqlOption Odbc_describe_binary_as_varbinary
+syn keyword sqlOption Odbc_distinguish_char_and_varchar
+syn keyword sqlOption Oem_string
+syn keyword sqlOption On_charset_conversion_failure
+syn keyword sqlOption On_tsql_error
+syn keyword sqlOption Optimization_goal
+syn keyword sqlOption Optimization_level
+syn keyword sqlOption Optimization_workload
+syn keyword sqlOption Pinned_cursor_percent_of_cache
+syn keyword sqlOption Post_login_procedure
+syn keyword sqlOption Precision
+syn keyword sqlOption Prefetch
+syn keyword sqlOption Preserve_source_format
+syn keyword sqlOption Prevent_article_pkey_update
+syn keyword sqlOption Priority
+syn keyword sqlOption Progress_messages
+syn keyword sqlOption Query_mem_timeout
+syn keyword sqlOption Quoted_identifier
+syn keyword sqlOption Read_past_deleted
+syn keyword sqlOption Recovery_time
+syn keyword sqlOption Remote_idle_timeout
+syn keyword sqlOption Replicate_all
+syn keyword sqlOption Request_timeout
+syn keyword sqlOption Reserved_keywords
+syn keyword sqlOption Return_date_time_as_string
+syn keyword sqlOption Rollback_on_deadlock
+syn keyword sqlOption Row_counts
+syn keyword sqlOption Scale
+syn keyword sqlOption Secure_feature_key
+syn keyword sqlOption Sort_collation
+syn keyword sqlOption Sql_flagger_error_level
+syn keyword sqlOption Sql_flagger_warning_level
+syn keyword sqlOption String_rtruncation
+syn keyword sqlOption st_geometry_asbinary_format
+syn keyword sqlOption st_geometry_astext_format
+syn keyword sqlOption st_geometry_asxml_format
+syn keyword sqlOption st_geometry_describe_type
+syn keyword sqlOption st_geometry_interpolation
+syn keyword sqlOption st_geometry_on_invalid
+syn keyword sqlOption Subsume_row_locks
+syn keyword sqlOption Suppress_tds_debugging
+syn keyword sqlOption Synchronize_mirror_on_commit
+syn keyword sqlOption Tds_empty_string_is_null
+syn keyword sqlOption Temp_space_limit_check
+syn keyword sqlOption Time_format
+syn keyword sqlOption Time_zone_adjustment
+syn keyword sqlOption Timestamp_format
+syn keyword sqlOption Timestamp_with_time_zone_format
+syn keyword sqlOption Truncate_timestamp_values
+syn keyword sqlOption Tsql_outer_joins
+syn keyword sqlOption Tsql_variables
+syn keyword sqlOption Updatable_statement_isolation
+syn keyword sqlOption Update_statistics
+syn keyword sqlOption Upgrade_database_capability
+syn keyword sqlOption User_estimates
+syn keyword sqlOption Uuid_has_hyphens
+syn keyword sqlOption Verify_password_function
+syn keyword sqlOption Wait_for_commit
+syn keyword sqlOption Webservice_namespace_host
+syn keyword sqlOption Webservice_sessionid_name
+
+" Strings and characters:
+syn region sqlString start=+"+ end=+"+ contains=@Spell
+syn region sqlString start=+'+ end=+'+ contains=@Spell
+
+" Numbers:
+syn match sqlNumber "-\=\<\d*\.\=[0-9_]\>"
+
+" Comments:
+syn region sqlDashComment start=/--/ end=/$/ contains=@Spell
+syn region sqlSlashComment start=/\/\// end=/$/ contains=@Spell
+syn region sqlMultiComment start="/\*" end="\*/" contains=sqlMultiComment,@Spell
+syn cluster sqlComment contains=sqlDashComment,sqlSlashComment,sqlMultiComment,@Spell
+syn sync ccomment sqlComment
+syn sync ccomment sqlDashComment
+syn sync ccomment sqlSlashComment
+
+hi def link sqlDashComment Comment
+hi def link sqlSlashComment Comment
+hi def link sqlMultiComment Comment
+hi def link sqlNumber Number
+hi def link sqlOperator Operator
+hi def link sqlSpecial Special
+hi def link sqlKeyword Keyword
+hi def link sqlStatement Statement
+hi def link sqlString String
+hi def link sqlType Type
+hi def link sqlFunction Function
+hi def link sqlOption PreProc
+
+let b:current_syntax = "sqlanywhere"
+
+" vim:sw=4:
diff --git a/runtime/syntax/sqlforms.vim b/runtime/syntax/sqlforms.vim
new file mode 100644
index 0000000..6077dd1
--- /dev/null
+++ b/runtime/syntax/sqlforms.vim
@@ -0,0 +1,152 @@
+" Vim syntax file
+" Language: SQL*Forms (Oracle 7), based on sql.vim (vim5.0)
+" Maintainer: Austin Ziegler (austin@halostatue.ca)
+" Last Change: 2003 May 11
+" Prev Change: 19980710
+" URL: http://www.halostatue.ca/vim/syntax/proc.vim
+"
+" TODO Find a new maintainer who knows SQL*Forms.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case ignore
+
+setlocal iskeyword=a-z,A-Z,48-57,_,.,-,>
+
+
+ " The SQL reserved words, defined as keywords.
+syntax match sqlTriggers /on-.*$/
+syntax match sqlTriggers /key-.*$/
+syntax match sqlTriggers /post-.*$/
+syntax match sqlTriggers /pre-.*$/
+syntax match sqlTriggers /user-.*$/
+
+syntax keyword sqlSpecial null false true
+
+syntax keyword sqlProcedure abort_query anchor_view bell block_menu break call
+syntax keyword sqlProcedure call_input call_query clear_block clear_eol
+syntax keyword sqlProcedure clear_field clear_form clear_record commit_form
+syntax keyword sqlProcedure copy count_query create_record default_value
+syntax keyword sqlProcedure delete_record display_error display_field down
+syntax keyword sqlProcedure duplicate_field duplicate_record edit_field
+syntax keyword sqlProcedure enter enter_query erase execute_query
+syntax keyword sqlProcedure execute_trigger exit_form first_Record go_block
+syntax keyword sqlProcedure go_field go_record help hide_menu hide_page host
+syntax keyword sqlProcedure last_record list_values lock_record message
+syntax keyword sqlProcedure move_view new_form next_block next_field next_key
+syntax keyword sqlProcedure next_record next_set pause post previous_block
+syntax keyword sqlProcedure previous_field previous_record print redisplay
+syntax keyword sqlProcedure replace_menu resize_view scroll_down scroll_up
+syntax keyword sqlProcedure set_field show_keys show_menu show_page
+syntax keyword sqlProcedure synchronize up user_exit
+
+syntax keyword sqlFunction block_characteristic error_code error_text
+syntax keyword sqlFunction error_type field_characteristic form_failure
+syntax keyword sqlFunction form_fatal form_success name_in
+
+syntax keyword sqlParameters hide no_hide replace no_replace ask_commit
+syntax keyword sqlParameters do_commit no_commit no_validate all_records
+syntax keyword sqlParameters for_update no_restrict restrict no_screen
+syntax keyword sqlParameters bar full_screen pull_down auto_help auto_skip
+syntax keyword sqlParameters fixed_length enterable required echo queryable
+syntax keyword sqlParameters updateable update_null upper_case attr_on
+syntax keyword sqlParameters attr_off base_table first_field last_field
+syntax keyword sqlParameters datatype displayed display_length field_length
+syntax keyword sqlParameters list page primary_key query_length x_pos y_pos
+
+syntax match sqlSystem /system\.block_status/
+syntax match sqlSystem /system\.current_block/
+syntax match sqlSystem /system\.current_field/
+syntax match sqlSystem /system\.current_form/
+syntax match sqlSystem /system\.current_value/
+syntax match sqlSystem /system\.cursor_block/
+syntax match sqlSystem /system\.cursor_field/
+syntax match sqlSystem /system\.cursor_record/
+syntax match sqlSystem /system\.cursor_value/
+syntax match sqlSystem /system\.form_status/
+syntax match sqlSystem /system\.last_query/
+syntax match sqlSystem /system\.last_record/
+syntax match sqlSystem /system\.message_level/
+syntax match sqlSystem /system\.record_status/
+syntax match sqlSystem /system\.trigger_block/
+syntax match sqlSystem /system\.trigger_field/
+syntax match sqlSystem /system\.trigger_record/
+syntax match sqlSystem /\$\$date\$\$/
+syntax match sqlSystem /\$\$time\$\$/
+
+syntax keyword sqlKeyword accept access add as asc by check cluster column
+syntax keyword sqlKeyword compress connect current decimal default
+syntax keyword sqlKeyword desc exclusive file for from group
+syntax keyword sqlKeyword having identified immediate increment index
+syntax keyword sqlKeyword initial into is level maxextents mode modify
+syntax keyword sqlKeyword nocompress nowait of offline on online start
+syntax keyword sqlKeyword successful synonym table to trigger uid
+syntax keyword sqlKeyword unique user validate values view whenever
+syntax keyword sqlKeyword where with option order pctfree privileges
+syntax keyword sqlKeyword public resource row rowlabel rownum rows
+syntax keyword sqlKeyword session share size smallint sql\*forms_version
+syntax keyword sqlKeyword terse define form name title procedure begin
+syntax keyword sqlKeyword default_menu_application trigger block field
+syntax keyword sqlKeyword enddefine declare exception raise when cursor
+syntax keyword sqlKeyword definition base_table pragma
+syntax keyword sqlKeyword column_name global trigger_type text description
+syntax match sqlKeyword "<<<"
+syntax match sqlKeyword ">>>"
+
+syntax keyword sqlOperator not and or out to_number to_date message erase
+syntax keyword sqlOperator in any some all between exists substr nvl
+syntax keyword sqlOperator exception_init
+syntax keyword sqlOperator like escape trunc lpad rpad sum
+syntax keyword sqlOperator union intersect minus to_char greatest
+syntax keyword sqlOperator prior distinct decode least avg
+syntax keyword sqlOperator sysdate true false field_characteristic
+syntax keyword sqlOperator display_field call host
+
+syntax keyword sqlStatement alter analyze audit comment commit create
+syntax keyword sqlStatement delete drop explain grant insert lock noaudit
+syntax keyword sqlStatement rename revoke rollback savepoint select set
+syntax keyword sqlStatement truncate update if elsif loop then
+syntax keyword sqlStatement open fetch close else end
+
+syntax keyword sqlType char character date long raw mlslabel number rowid
+syntax keyword sqlType varchar varchar2 float integer boolean global
+
+syntax keyword sqlCodes sqlcode no_data_found too_many_rows others
+syntax keyword sqlCodes form_trigger_failure notfound found
+syntax keyword sqlCodes validate no_commit
+
+ " Comments:
+syntax region sqlComment start="/\*" end="\*/"
+syntax match sqlComment "--.*"
+
+ " Strings and characters:
+syntax region sqlString start=+"+ skip=+\\\\\|\\"+ end=+"+
+syntax region sqlString start=+'+ skip=+\\\\\|\\"+ end=+'+
+
+ " Numbers:
+syntax match sqlNumber "-\=\<[0-9]*\.\=[0-9_]\>"
+
+syntax sync ccomment sqlComment
+
+
+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"
+
+" vim: ts=8 sw=4
diff --git a/runtime/syntax/sqlhana.vim b/runtime/syntax/sqlhana.vim
new file mode 100644
index 0000000..2e334bb
--- /dev/null
+++ b/runtime/syntax/sqlhana.vim
@@ -0,0 +1,290 @@
+" Vim syntax file
+" Language: SQL, SAP HANA In Memory Database
+" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
+" Last Change: 2012 Oct 23
+" Version: SP4 b (Q2 2012)
+" Homepage: http://www.vim.org/scripts/script.php?script_id=4275
+
+" Description: Updated to SAP HANA SP4
+"
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" The SQL reserved words, defined as keywords.
+" These were pulled from the following SQL reference:
+" http://help.sap.com/hana/hana_sql_en.pdf
+" An easy approach is to copy all text from the PDF
+" into a Vim buffer. The keywords are in UPPER case,
+" so you can run the following commands to be left with
+" mainly the UPPER case words:
+" 1. Delete all words that do not begin with a Capital
+" %s/\(\<[^A-Z]\w*\>\)//g
+" 2. Remove all words where the 2nd letter is not a Capital
+" %s/\(\<[A-Z][^A-Z]\w*\>\)//g
+" 3. Remove all non-word (or space) characters
+" %s/[^0-9A-Za-z_ ]*//g
+" 4. Remove some known words
+" %s/\<\(SAP\|HANA\|OK\|AG\|IBM\|DB2\|AIX\|POWER\d\+\|UNIX\)\>//g
+" 5. Remove blank lines and trailing spaces
+" %s/\s\+$//g
+" %s/^\s\+//g
+" %s/^$\n//g
+" 6. Convert spaces to newlines remove single character
+" %s/[ ]\+/\r/g
+" %g/^\w$/d
+" 7. Sort and remove duplicates
+" :sort
+" :Uniq
+" 8. Use the WhatsMissing plugin against the sqlhana.vim file.
+" 9. Generated a file of all UPPER cased words which should not
+" be in the syntax file. These items should be removed
+" from the list in step 7. You can use WhatsNotMissing
+" between step 7 and this new file to weed out the words
+" we know are not syntax related.
+" 10. Use the WhatsMissingRemoveMatches to remove the words
+" from step 9.
+
+syn keyword sqlSpecial false null true
+
+" Supported Functions for Date/Time types
+syn keyword sqlFunction ADD_DAYS ADD_MONTHS ADD_SECONDS ADD_YEARS COALESCE
+syn keyword sqlFunction CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_UTCDATE
+syn keyword sqlFunction CURRENT_UTCTIME CURRENT_UTCTIMESTAMP
+syn keyword sqlFunction DAYNAME DAYOFMONTH DAYOFYEAR DAYS_BETWEEN EXTRACT
+syn keyword sqlFunction GREATEST HOUR IFNULL ISOWEEK LAST_DAY LEAST LOCALTOUTC
+syn keyword sqlFunction MINUTE MONTH MONTHNAME NEXT_DAY NOW QUARTER SECOND
+syn keyword sqlFunction SECONDS_BETWEEN UTCTOLOCAL WEEK WEEKDAY YEAR
+
+syn keyword sqlFunction TO_CHAR TO_DATE TO_DATS TO_NCHAR TO_TIME TO_TIMESTAMP UTCTOLOCAL
+
+" Aggregate
+syn keyword sqlFunction COUNT MIN MAX SUM AVG STDDEV VAR
+
+" Datatype conversion
+syn keyword sqlFunction CAST TO_ALPHANUM TO_BIGINT TO_BINARY TO_BLOB TO_CHAR TO_CLOB
+syn keyword sqlFunction TO_DATE TO_DATS TO_DECIMAL TO_DOUBLE TO_INT TO_INTEGER TO_NCHAR
+syn keyword sqlFunction TO_NCLOB TO_NVARCHAR TO_REAL TO_SECONDDATE TO_SMALLDECIMAL
+syn keyword sqlFunction TO_SMALLINT TO_TIME TO_TIMESTAMP TO_TINYINT TO_VARCHAR TO_VARBINARY
+
+" Number functions
+syn keyword sqlFunction ABS ACOS ASIN ATAN ATAN2 BINTOHEX BITAND CEIL COS COSH COT
+syn keyword sqlFunction EXP FLOOR GREATEST HEXTOBIN LEAST LN LOG MOD POWER ROUND
+syn keyword sqlFunction SIGN SIN SINH SQRT TAN TANH UMINUS
+
+" String functions
+syn keyword sqlFunction ASCII CHAR CONCAT LCASE LENGTH LOCATE LOWER LPAD LTRIM
+syn keyword sqlFunction NCHAR REPLACE RPAD RTRIM SUBSTR_AFTER SUBSTR_BEFORE
+syn keyword sqlFunction SUBSTRING TRIM UCASE UNICODE UPPER
+
+" Miscellaneous functions
+syn keyword sqlFunction COALESCE CURRENT_CONNECTION CURRENT_SCHEMA CURRENT_USER
+syn keyword sqlFunction GROUPING_ID IFNULL MAP NULLIF SESSION_CONTEXT SESSION_USER SYSUUIDSQL
+syn keyword sqlFunction GET_NUM_SERVERS
+
+
+" sp_ procedures
+" syn keyword sqlFunction sp_addalias
+
+
+" Reserved keywords
+syn keyword sqlkeyword ALL AS AT BEFORE
+syn keyword sqlkeyword BEGIN BOTH BY
+syn keyword sqlkeyword CONDITION
+syn keyword sqlkeyword CURRVAL CURSOR DECLARE
+syn keyword sqlkeyword DISTINCT DO ELSE ELSEIF ELSIF
+syn keyword sqlkeyword END EXCEPTION EXEC
+syn keyword sqlkeyword FOR FROM GROUP
+syn keyword sqlkeyword HAVING IN
+syn keyword sqlkeyword INOUT INTO IS
+syn keyword sqlkeyword LEADING
+syn keyword sqlkeyword LOOP MINUS NATURAL NEXTVAL
+syn keyword sqlkeyword OF ON ORDER OUT
+syn keyword sqlkeyword PRIOR RETURN RETURNS REVERSE
+syn keyword sqlkeyword ROWID SELECT
+syn keyword sqlkeyword SQL START STOP SYSDATE
+syn keyword sqlkeyword SYSTIME SYSTIMESTAMP SYSUUID
+syn keyword sqlkeyword TRAILING USING UTCDATE
+syn keyword sqlkeyword UTCTIME UTCTIMESTAMP VALUES
+syn keyword sqlkeyword WHILE
+syn keyword sqlkeyword ANY SOME EXISTS ESCAPE
+
+" IF keywords
+syn keyword sqlkeyword IF
+
+" CASE keywords
+syn keyword sqlKeyword WHEN THEN
+
+" Syntax rules common to TEXT and SHORTTEXT keywords
+syn keyword sqlKeyword LANGUAGE DETECTION LINGUISTIC
+syn keyword sqlkeyword MIME TYPE
+syn keyword sqlkeyword EXACT WEIGHT FUZZY FUZZINESSTHRESHOLD SEARCH
+syn keyword sqlkeyword PHRASE INDEX RATIO REBUILD
+syn keyword sqlkeyword CONFIGURATION
+syn keyword sqlkeyword SEARCH ONLY
+syn keyword sqlkeyword FAST PREPROCESS
+syn keyword sqlkeyword SYNC SYNCHRONOUS ASYNC ASYNCHRONOUS FLUSH QUEUE
+syn keyword sqlkeyword EVERY AFTER MINUTES DOCUMENTS SUSPEND
+
+" Statement keywords (i.e. after ALTER or CREATE)
+syn keyword sqlkeyword AUDIT POLICY
+syn keyword sqlkeyword FULLTEXT
+syn keyword sqlkeyword SEQUENCE RESTART
+syn keyword sqlkeyword TABLE
+syn keyword sqlkeyword PROCEDURE STATISTICS
+syn keyword sqlkeyword SCHEMA
+syn keyword sqlkeyword SYNONYM
+syn keyword sqlkeyword VIEW
+syn keyword sqlkeyword COLUMN
+syn keyword sqlkeyword SYSTEM LICENSE
+syn keyword sqlkeyword SESSION
+syn keyword sqlkeyword CANCEL WORK
+syn keyword sqlkeyword PLAN CACHE
+syn keyword sqlkeyword LOGGING NOLOGGING RETENTION
+syn keyword sqlkeyword RECONFIGURE SERVICE
+syn keyword sqlkeyword RESET MONITORING
+syn keyword sqlkeyword SAVE DURATION PERFTRACE FUNCTION_PROFILER
+syn keyword sqlkeyword SAVEPOINT
+syn keyword sqlkeyword USER
+syn keyword sqlkeyword ROLE
+syn keyword sqlkeyword ASC DESC
+syn keyword sqlkeyword OWNED
+syn keyword sqlkeyword DEPENDENCIES SCRAMBLE
+
+" Create sequence
+syn keyword sqlkeyword INCREMENT MAXVALUE MINVALUE CYCLE
+
+" Create table
+syn keyword sqlkeyword HISTORY GLOBAL LOCAL TEMPORARY
+
+" Create trigger
+syn keyword sqlkeyword TRIGGER REFERENCING EACH DEFAULT
+syn keyword sqlkeyword SIGNAL RESIGNAL MESSAGE_TEXT OLD NEW
+syn keyword sqlkeyword EXIT HANDLER SQL_ERROR_CODE
+syn keyword sqlkeyword TARGET CONDITION SIGNAL
+
+" Alter table
+syn keyword sqlkeyword ADD DROP MODIFY GENERATED ALWAYS
+syn keyword sqlkeyword UNIQUE BTREE CPBTREE PRIMARY KEY
+syn keyword sqlkeyword CONSTRAINT PRELOAD NONE
+syn keyword sqlkeyword ROW THREADS BATCH
+syn keyword sqlkeyword MOVE PARTITION TO LOCATION PHYSICAL OTHERS
+syn keyword sqlkeyword ROUNDROBIN PARTITIONS HASH RANGE VALUE
+syn keyword sqlkeyword PERSISTENT DELTA AUTO AUTOMERGE
+
+" Create audit policy
+syn keyword sqlkeyword AUDITING SUCCESSFUL UNSUCCESSFUL
+syn keyword sqlkeyword PRIVILEGE STRUCTURED CHANGE LEVEL
+syn keyword sqlkeyword EMERGENCY ALERT CRITICAL WARNING INFO
+
+" Privileges
+syn keyword sqlkeyword DEBUG EXECUTE
+
+" Schema
+syn keyword sqlkeyword CASCADE RESTRICT PARAMETERS SCAN
+
+" Traces
+syn keyword sqlkeyword CLIENT CRASHDUMP EMERGENCYDUMP
+syn keyword sqlkeyword INDEXSERVER NAMESERVER DAEMON
+syn keyword sqlkeyword CLEAR REMOVE TRACES
+
+" Reclaim
+syn keyword sqlkeyword RECLAIM DATA VOLUME VERSION SPACE DEFRAGMENT SPARSIFY
+
+" Join
+syn keyword sqlkeyword INNER OUTER LEFT RIGHT FULL CROSS JOIN
+syn keyword sqlkeyword GROUPING SETS ROLLUP CUBE
+syn keyword sqlkeyword BEST LIMIT OFFSET
+syn keyword sqlkeyword WITH SUBTOTAL BALANCE TOTAL
+syn keyword sqlkeyword TEXT_FILTER FILL UP SORT MATCHES TOP
+syn keyword sqlkeyword RESULT OVERVIEW PREFIX MULTIPLE RESULTSETS
+
+" Lock
+syn keyword sqlkeyword EXCLUSIVE MODE NOWAIT
+
+" Transaction
+syn keyword sqlkeyword TRANSACTION ISOLATION READ COMMITTED
+syn keyword sqlkeyword REPEATABLE SERIALIZABLE WRITE
+
+" Saml
+syn keyword sqlkeyword SAML ASSERTION PROVIDER SUBJECT ISSUER
+
+" User
+syn keyword sqlkeyword PASSWORD IDENTIFIED EXTERNALLY ATTEMPTS ATTEMPTS
+syn keyword sqlkeyword ENABLE DISABLE OFF LIFETIME FORCE DEACTIVATE
+syn keyword sqlkeyword ACTIVATE IDENTITY KERBEROS
+
+" Grant
+syn keyword sqlkeyword ADMIN BACKUP CATALOG SCENARIO INIFILE MONITOR
+syn keyword sqlkeyword OPTIMIZER OPTION
+syn keyword sqlkeyword RESOURCE STRUCTUREDPRIVILEGE TRACE
+
+" Import
+syn keyword sqlkeyword CSV FILE CONTROL NO CHECK SKIP FIRST LIST
+syn keyword sqlkeyword RECORD DELIMITED FIELD OPTIONALLY ENCLOSED FORMAT
+
+" Roles
+syn keyword sqlkeyword PUBLIC CONTENT_ADMIN MODELING MONITORING
+
+" Miscellaneous
+syn keyword sqlkeyword APPLICATION BINARY IMMEDIATE COREFILE SECURITY DEFINER
+syn keyword sqlkeyword DUMMY INVOKER MATERIALIZED MESSEGE_TEXT PARAMETER PARAMETERS
+syn keyword sqlkeyword PART
+syn keyword sqlkeyword CONSTANT SQLEXCEPTION SQLWARNING
+
+syn keyword sqlOperator WHERE BETWEEN LIKE NULL CONTAINS
+syn keyword sqlOperator AND OR NOT CASE
+syn keyword sqlOperator UNION INTERSECT EXCEPT
+
+syn keyword sqlStatement ALTER CALL CALLS CREATE DROP RENAME TRUNCATE
+syn keyword sqlStatement DELETE INSERT UPDATE EXPLAIN
+syn keyword sqlStatement MERGE REPLACE UPSERT SELECT
+syn keyword sqlStatement SET UNSET LOAD UNLOAD
+syn keyword sqlStatement CONNECT DISCONNECT COMMIT LOCK ROLLBACK
+syn keyword sqlStatement GRANT REVOKE
+syn keyword sqlStatement EXPORT IMPORT
+
+
+syn keyword sqlType DATE TIME SECONDDATE TIMESTAMP TINYINT SMALLINT
+syn keyword sqlType INT INTEGER BIGINT SMALLDECIMAL DECIMAL
+syn keyword sqlType REAL DOUBLE FLOAT
+syn keyword sqlType VARCHAR NVARCHAR ALPHANUM SHORTTEXT VARBINARY
+syn keyword sqlType BLOB CLOB NCLOB TEXT DAYDATE
+
+syn keyword sqlOption Webservice_namespace_host
+
+" Strings and characters:
+syn region sqlString start=+"+ end=+"+ contains=@Spell
+syn region sqlString start=+'+ end=+'+ contains=@Spell
+
+" Numbers:
+syn match sqlNumber "-\=\<\d*\.\=[0-9_]\>"
+
+" Comments:
+syn region sqlDashComment start=/--/ end=/$/ contains=@Spell
+syn region sqlSlashComment start=/\/\// end=/$/ contains=@Spell
+syn region sqlMultiComment start="/\*" end="\*/" contains=sqlMultiComment,@Spell
+syn cluster sqlComment contains=sqlDashComment,sqlSlashComment,sqlMultiComment,@Spell
+syn sync ccomment sqlComment
+syn sync ccomment sqlDashComment
+syn sync ccomment sqlSlashComment
+
+hi def link sqlDashComment Comment
+hi def link sqlSlashComment Comment
+hi def link sqlMultiComment Comment
+hi def link sqlNumber Number
+hi def link sqlOperator Operator
+hi def link sqlSpecial Special
+hi def link sqlKeyword Keyword
+hi def link sqlStatement Statement
+hi def link sqlString String
+hi def link sqlType Type
+hi def link sqlFunction Function
+hi def link sqlOption PreProc
+
+let b:current_syntax = "sqlhana"
+
+" vim:sw=4:
diff --git a/runtime/syntax/sqlinformix.vim b/runtime/syntax/sqlinformix.vim
new file mode 100644
index 0000000..e01912b
--- /dev/null
+++ b/runtime/syntax/sqlinformix.vim
@@ -0,0 +1,183 @@
+" Vim syntax file
+" Informix Structured Query Language (SQL) and Stored Procedure Language (SPL)
+" Language: SQL, SPL (Informix Dynamic Server 2000 v9.2)
+" Maintainer: Dean Hill <dhill@hotmail.com>
+" Last Change: 2004 Aug 30
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+
+
+" === Comment syntax group ===
+syn region sqlComment start="{" end="}" contains=sqlTodo
+syn match sqlComment "--.*$" contains=sqlTodo
+syn sync ccomment sqlComment
+
+
+
+" === Constant syntax group ===
+" = Boolean subgroup =
+syn keyword sqlBoolean true false
+syn keyword sqlBoolean null
+syn keyword sqlBoolean public user
+syn keyword sqlBoolean current today
+syn keyword sqlBoolean year month day hour minute second fraction
+
+" = String subgroup =
+syn region sqlString start=+"+ end=+"+
+syn region sqlString start=+'+ end=+'+
+
+" = Numbers subgroup =
+syn match sqlNumber "-\=\<\d*\.\=[0-9_]\>"
+
+
+
+" === Statement syntax group ===
+" SQL
+syn keyword sqlStatement allocate alter
+syn keyword sqlStatement begin
+syn keyword sqlStatement close commit connect create
+syn keyword sqlStatement database deallocate declare delete describe disconnect drop
+syn keyword sqlStatement execute fetch flush free get grant info insert
+syn keyword sqlStatement load lock open output
+syn keyword sqlStatement prepare put
+syn keyword sqlStatement rename revoke rollback select set start stop
+syn keyword sqlStatement truncate unload unlock update
+syn keyword sqlStatement whenever
+" SPL
+syn keyword sqlStatement call continue define
+syn keyword sqlStatement exit
+syn keyword sqlStatement let
+syn keyword sqlStatement return system trace
+
+" = Conditional subgroup =
+" SPL
+syn keyword sqlConditional elif else if then
+syn keyword sqlConditional case
+" Highlight "end if" with one or more separating spaces
+syn match sqlConditional "end \+if"
+
+" = Repeat subgroup =
+" SQL/SPL
+" Handle SQL triggers' "for each row" clause and SPL "for" loop
+syn match sqlRepeat "for\( \+each \+row\)\="
+" SPL
+syn keyword sqlRepeat foreach while
+" Highlight "end for", etc. with one or more separating spaces
+syn match sqlRepeat "end \+for"
+syn match sqlRepeat "end \+foreach"
+syn match sqlRepeat "end \+while"
+
+" = Exception subgroup =
+" SPL
+syn match sqlException "on \+exception"
+syn match sqlException "end \+exception"
+syn match sqlException "end \+exception \+with \+resume"
+syn match sqlException "raise \+exception"
+
+" = Keyword subgroup =
+" SQL
+syn keyword sqlKeyword aggregate add as authorization autofree by
+syn keyword sqlKeyword cache cascade check cluster collation
+syn keyword sqlKeyword column connection constraint cross
+syn keyword sqlKeyword dataskip debug default deferred_prepare
+syn keyword sqlKeyword descriptor diagnostics
+syn keyword sqlKeyword each escape explain external
+syn keyword sqlKeyword file foreign fragment from function
+syn keyword sqlKeyword group having
+syn keyword sqlKeyword immediate index inner into isolation
+syn keyword sqlKeyword join key
+syn keyword sqlKeyword left level log
+syn keyword sqlKeyword mode modify mounting new no
+syn keyword sqlKeyword object of old optical option
+syn keyword sqlKeyword optimization order outer
+syn keyword sqlKeyword pdqpriority pload primary procedure
+syn keyword sqlKeyword references referencing release reserve
+syn keyword sqlKeyword residency right role routine row
+syn keyword sqlKeyword schedule schema scratch session set
+syn keyword sqlKeyword statement statistics synonym
+syn keyword sqlKeyword table temp temporary timeout to transaction trigger
+syn keyword sqlKeyword using values view violations
+syn keyword sqlKeyword where with work
+" Highlight "on" (if it's not followed by some words we've already handled)
+syn match sqlKeyword "on \+\(exception\)\@!"
+" SPL
+" Highlight "end" (if it's not followed by some words we've already handled)
+syn match sqlKeyword "end \+\(if\|for\|foreach\|while\|exception\)\@!"
+syn keyword sqlKeyword resume returning
+
+" = Operator subgroup =
+" SQL
+syn keyword sqlOperator not and or
+syn keyword sqlOperator in is any some all between exists
+syn keyword sqlOperator like matches
+syn keyword sqlOperator union intersect
+syn keyword sqlOperator distinct unique
+
+
+
+" === Identifier syntax group ===
+" = Function subgroup =
+" SQL
+syn keyword sqlFunction abs acos asin atan atan2 avg
+syn keyword sqlFunction cardinality cast char_length character_length cos count
+syn keyword sqlFunction exp filetoblob filetoclob hex
+syn keyword sqlFunction initcap length logn log10 lower lpad
+syn keyword sqlFunction min max mod octet_length pow range replace root round rpad
+syn keyword sqlFunction sin sqrt stdev substr substring sum
+syn keyword sqlFunction to_char tan to_date trim trunc upper variance
+
+
+
+" === Type syntax group ===
+" SQL
+syn keyword sqlType blob boolean byte char character clob
+syn keyword sqlType date datetime dec decimal double
+syn keyword sqlType float int int8 integer interval list lvarchar
+syn keyword sqlType money multiset nchar numeric nvarchar
+syn keyword sqlType real serial serial8 smallfloat smallint
+syn keyword sqlType text varchar varying
+
+
+
+" === Todo syntax group ===
+syn keyword sqlTodo TODO FIXME XXX DEBUG NOTE
+
+
+
+" Define the default highlighting.
+" 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
new file mode 100644
index 0000000..c901145
--- /dev/null
+++ b/runtime/syntax/sqlj.vim
@@ -0,0 +1,91 @@
+" Vim syntax file
+" Language: sqlj
+" Maintainer: Andreas Fischbach <afisch@altavista.com>
+" This file is based on sql.vim && java.vim (thanx)
+" with a handful of additional sql words and still
+" a subset of whatever standard
+" Last change: 31th Dec 2001
+
+" au BufNewFile,BufRead *.sqlj so $VIM/syntax/sqlj.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read the Java syntax to start with
+source <sfile>:p:h/java.vim
+
+" SQLJ extentions
+" The SQL reserved words, defined as keywords.
+
+syn case ignore
+syn keyword sqljSpecial null
+
+syn keyword sqljKeyword access add as asc by check cluster column
+syn keyword sqljKeyword compress connect current decimal default
+syn keyword sqljKeyword desc else exclusive file for from group
+syn keyword sqljKeyword having identified immediate increment index
+syn keyword sqljKeyword initial into is level maxextents mode modify
+syn keyword sqljKeyword nocompress nowait of offline on online start
+syn keyword sqljKeyword successful synonym table then to trigger uid
+syn keyword sqljKeyword unique user validate values view whenever
+syn keyword sqljKeyword where with option order pctfree privileges
+syn keyword sqljKeyword public resource row rowlabel rownum rows
+syn keyword sqljKeyword session share size smallint
+
+syn keyword sqljKeyword fetch database context iterator field join
+syn keyword sqljKeyword foreign outer inner isolation left right
+syn keyword sqljKeyword match primary key
+
+syn keyword sqljOperator not and or
+syn keyword sqljOperator in any some all between exists
+syn keyword sqljOperator like escape
+syn keyword sqljOperator union intersect minus
+syn keyword sqljOperator prior distinct
+syn keyword sqljOperator sysdate
+
+syn keyword sqljOperator max min avg sum count hex
+
+syn keyword sqljStatement alter analyze audit comment commit create
+syn keyword sqljStatement delete drop explain grant insert lock noaudit
+syn keyword sqljStatement rename revoke rollback savepoint select set
+syn keyword sqljStatement truncate update begin work
+
+syn keyword sqljType char character date long raw mlslabel number
+syn keyword sqljType rowid varchar varchar2 float integer
+
+syn keyword sqljType byte text serial
+
+
+" Strings and characters:
+syn region sqljString start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn region sqljString start=+'+ skip=+\\\\\|\\"+ end=+'+
+
+" Numbers:
+syn match sqljNumber "-\=\<\d*\.\=[0-9_]\>"
+
+" PreProc
+syn match sqljPre "#sql"
+
+" Comments:
+syn region sqljComment start="/\*" end="\*/"
+syn match sqlComment "--.*"
+
+syn sync ccomment sqljComment
+
+
+" 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
new file mode 100644
index 0000000..0907b48
--- /dev/null
+++ b/runtime/syntax/sqloracle.vim
@@ -0,0 +1,150 @@
+" Vim syntax file
+" Language: SQL, PL/SQL (Oracle 11g)
+" Maintainer: Christian Brabandt
+" Repository: https://github.com/chrisbra/vim-sqloracle-syntax
+" License: Vim
+" Previous Maintainer: Paul Moore
+" 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
+endif
+
+syn case ignore
+
+" The SQL reserved words, defined as keywords.
+
+syn keyword sqlSpecial false null true
+
+syn keyword sqlKeyword access add as asc begin by case check cluster column
+syn keyword sqlKeyword cache compress connect current cursor decimal default desc
+syn keyword sqlKeyword else elsif end exception exclusive file for from
+syn keyword sqlKeyword function group having identified if immediate increment
+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 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
+syn keyword sqlOperator like escape
+syn keyword sqlOperator union intersect minus
+syn keyword sqlOperator prior distinct
+syn keyword sqlOperator sysdate out
+
+syn keyword sqlStatement analyze audit comment commit
+syn keyword sqlStatement delete drop execute explain grant lock noaudit
+syn keyword sqlStatement rename revoke rollback savepoint set
+syn keyword sqlStatement truncate
+" next ones are contained, so folding works.
+syn keyword sqlStatement create update alter select insert contained
+
+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 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_]\>"
+
+" 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.
+" the keywords create/update/alter/select/insert need to
+" have contained option.
+syn region sqlFold start='^\s*\zs\c\(Create\|Update\|Alter\|Select\|Insert\)' end=';$\|^$' transparent fold contains=ALL
+
+syn sync ccomment sqlComment
+
+" Functions:
+" (Oracle 11g)
+" Aggregate Functions
+syn keyword sqlFunction avg collect corr corr_s corr_k count covar_pop covar_samp cume_dist dense_rank first
+syn keyword sqlFunction group_id grouping grouping_id last max median min percentile_cont percentile_disc percent_rank rank
+syn keyword sqlFunction regr_slope regr_intercept regr_count regr_r2 regr_avgx regr_avgy regr_sxx regr_syy regr_sxy
+syn keyword sqlFunction stats_binomial_test stats_crosstab stats_f_test stats_ks_test stats_mode stats_mw_test
+syn keyword sqlFunction stats_one_way_anova stats_t_test_one stats_t_test_paired stats_t_test_indep stats_t_test_indepu
+syn keyword sqlFunction stats_wsr_test stddev stddev_pop stddev_samp sum
+syn keyword sqlFunction sys_xmlagg var_pop var_samp variance xmlagg
+" Char Functions
+syn keyword sqlFunction ascii chr concat initcap instr length lower lpad ltrim
+syn keyword sqlFunction nls_initcap nls_lower nlssort nls_upper regexp_instr regexp_replace
+syn keyword sqlFunction regexp_substr replace rpad rtrim soundex substr translate treat trim upper
+" Comparison Functions
+syn keyword sqlFunction greatest least
+" Conversion Functions
+syn keyword sqlFunction asciistr bin_to_num cast chartorowid compose convert
+syn keyword sqlFunction decompose hextoraw numtodsinterval numtoyminterval rawtohex rawtonhex rowidtochar
+syn keyword sqlFunction rowidtonchar scn_to_timestamp timestamp_to_scn to_binary_double to_binary_float
+syn keyword sqlFunction to_char to_char to_char to_clob to_date to_dsinterval to_lob to_multi_byte
+syn keyword sqlFunction to_nchar to_nchar to_nchar to_nclob to_number to_dsinterval to_single_byte
+syn keyword sqlFunction to_timestamp to_timestamp_tz to_yminterval to_yminterval translate unistr
+" DataMining Functions
+syn keyword sqlFunction cluster_id cluster_probability cluster_set feature_id feature_set
+syn keyword sqlFunction feature_value prediction prediction_bounds prediction_cost
+syn keyword sqlFunction prediction_details prediction_probability prediction_set
+" Datetime Functions
+syn keyword sqlFunction add_months current_date current_timestamp dbtimezone extract
+syn keyword sqlFunction from_tz last_day localtimestamp months_between new_time
+syn keyword sqlFunction next_day numtodsinterval numtoyminterval round sessiontimezone
+syn keyword sqlFunction sys_extract_utc sysdate systimestamp to_char to_timestamp
+syn keyword sqlFunction to_timestamp_tz to_dsinterval to_yminterval trunc tz_offset
+" Numeric Functions
+syn keyword sqlFunction abs acos asin atan atan2 bitand ceil cos cosh exp
+syn keyword sqlFunction floor ln log mod nanvl power remainder round sign
+syn keyword sqlFunction sin sinh sqrt tan tanh trunc width_bucket
+" NLS Functions
+syn keyword sqlFunction ls_charset_decl_len nls_charset_id nls_charset_name
+" Various Functions
+syn keyword sqlFunction bfilename cardin coalesce collect decode dump empty_blob empty_clob
+syn keyword sqlFunction lnnvl nullif nvl nvl2 ora_hash powermultiset powermultiset_by_cardinality
+syn keyword sqlFunction sys_connect_by_path sys_context sys_guid sys_typeid uid user userenv vsizeality
+" XML Functions
+syn keyword sqlFunction appendchildxml deletexml depth extract existsnode extractvalue insertchildxml
+syn keyword sqlFunction insertxmlbefore path sys_dburigen sys_xmlagg sys_xmlgen updatexml xmlagg xmlcast
+syn keyword sqlFunction xmlcdata xmlcolattval xmlcomment xmlconcat xmldiff xmlelement xmlexists xmlforest
+syn keyword sqlFunction xmlparse xmlpatch xmlpi xmlquery xmlroot xmlsequence xmlserialize xmltable xmltransform
+" Todo:
+syn keyword sqlTodo TODO FIXME XXX DEBUG NOTE contained
+
+" Define the default highlighting.
+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
new file mode 100644
index 0000000..40b4835
--- /dev/null
+++ b/runtime/syntax/sqr.vim
@@ -0,0 +1,262 @@
+" Vim syntax file
+" Language: Structured Query Report Writer (SQR)
+" Maintainer: Nathan Stratton Treadway (nathanst at ontko dot com)
+" URL: http://www.ontko.com/sqr/#editor_config_files
+"
+" Modification History:
+" 2002-Apr-12: Updated for SQR v6.x
+" 2002-Jul-30: Added { and } to iskeyword definition
+" 2003-Oct-15: Allow "." in variable names
+" highlight entire open '... literal when it contains
+" "''" inside it (e.g. "'I can''t say" is treated
+" as one open string, not one terminated and one open)
+" {} variables can occur inside of '...' literals
+"
+" Thanks to the previous maintainer of this file, Jeff Lanzarotta:
+" http://lanzarotta.tripod.com/vim.html
+" jefflanzarotta at yahoo dot com
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=@,48-57,_,-,#,$,{,}
+
+syn case ignore
+
+" BEGIN GENERATED SECTION ============================================
+
+" Generated by generate_vim_syntax.sqr at 2002/04/11 13:04
+" (based on the UltraEdit syntax file for SQR 6.1.4
+" found at http://www.ontko.com/sqr/#editor_config_files )
+
+syn keyword sqrSection begin-footing begin-heading begin-procedure
+syn keyword sqrSection begin-program begin-report begin-setup
+syn keyword sqrSection end-footing end-heading end-procedure
+syn keyword sqrSection end-program end-report end-setup
+
+syn keyword sqrParagraph alter-color-map alter-connection
+syn keyword sqrParagraph alter-locale alter-printer alter-report
+syn keyword sqrParagraph begin-document begin-execute begin-select
+syn keyword sqrParagraph begin-sql declare-chart declare-image
+syn keyword sqrParagraph declare-color-map declare-connection
+syn keyword sqrParagraph declare-layout declare-printer
+syn keyword sqrParagraph declare-report declare-procedure
+syn keyword sqrParagraph declare-toc declare-variable end-declare
+syn keyword sqrParagraph end-document end-select exit-select end-sql
+syn keyword sqrParagraph load-lookup
+
+syn keyword sqrReserved #current-column #current-date #current-line
+syn keyword sqrReserved #end-file #page-count #return-status
+syn keyword sqrReserved #sql-count #sql-status #sqr-max-columns
+syn keyword sqrReserved #sqr-max-lines #sqr-pid #sqr-toc-level
+syn keyword sqrReserved #sqr-toc-page $sqr-database {sqr-database}
+syn keyword sqrReserved $sqr-dbcs {sqr-dbcs} $sqr-encoding
+syn keyword sqrReserved {sqr-encoding} $sqr-encoding-console
+syn keyword sqrReserved {sqr-encoding-console}
+syn keyword sqrReserved $sqr-encoding-database
+syn keyword sqrReserved {sqr-encoding-database}
+syn keyword sqrReserved $sqr-encoding-file-input
+syn keyword sqrReserved {sqr-encoding-file-input}
+syn keyword sqrReserved $sqr-encoding-file-output
+syn keyword sqrReserved {sqr-encoding-file-output}
+syn keyword sqrReserved $sqr-encoding-report-input
+syn keyword sqrReserved {sqr-encoding-report-input}
+syn keyword sqrReserved $sqr-encoding-report-output
+syn keyword sqrReserved {sqr-encoding-report-output}
+syn keyword sqrReserved $sqr-encoding-source {sqr-encoding-source}
+syn keyword sqrReserved $sql-error $sqr-hostname {sqr-hostname}
+syn keyword sqrReserved $sqr-locale $sqr-platform {sqr-platform}
+syn keyword sqrReserved $sqr-program $sqr-report $sqr-toc-text
+syn keyword sqrReserved $sqr-ver $username
+
+syn keyword sqrPreProc #define #else #end-if #endif #if #ifdef
+syn keyword sqrPreProc #ifndef #include
+
+syn keyword sqrCommand add array-add array-divide array-multiply
+syn keyword sqrCommand array-subtract ask break call clear-array
+syn keyword sqrCommand close columns commit concat connect
+syn keyword sqrCommand create-array create-color-palette date-time
+syn keyword sqrCommand display divide do dollar-symbol else encode
+syn keyword sqrCommand end-evaluate end-if end-while evaluate
+syn keyword sqrCommand execute extract find get get-color goto
+syn keyword sqrCommand graphic if input last-page let lookup
+syn keyword sqrCommand lowercase mbtosbs money-symbol move
+syn keyword sqrCommand multiply new-page new-report next-column
+syn keyword sqrCommand next-listing no-formfeed open page-number
+syn keyword sqrCommand page-size position print print-bar-code
+syn keyword sqrCommand print-chart print-direct print-image
+syn keyword sqrCommand printer-deinit printer-init put read
+syn keyword sqrCommand rollback security set-color set-delay-print
+syn keyword sqrCommand set-generations set-levels set-members
+syn keyword sqrCommand sbtombs show stop string subtract toc-entry
+syn keyword sqrCommand unstring uppercase use use-column
+syn keyword sqrCommand use-printer-type use-procedure use-report
+syn keyword sqrCommand while write
+
+syn keyword sqrParam 3d-effects after after-bold after-page
+syn keyword sqrParam after-report after-toc and as at-end before
+syn keyword sqrParam background batch-mode beep before-bold
+syn keyword sqrParam before-page before-report before-toc blink
+syn keyword sqrParam bold border bottom-margin box break by
+syn keyword sqrParam caption center char char-size char-width
+syn keyword sqrParam chars-inch chart-size checksum cl
+syn keyword sqrParam clear-line clear-screen color color-palette
+syn keyword sqrParam cs color_ data-array
+syn keyword sqrParam data-array-column-count
+syn keyword sqrParam data-array-column-labels
+syn keyword sqrParam data-array-row-count data-labels date
+syn keyword sqrParam date-edit-mask date-seperator
+syn keyword sqrParam day-of-week-case day-of-week-full
+syn keyword sqrParam day-of-week-short decimal decimal-seperator
+syn keyword sqrParam default-numeric delay distinct dot-leader
+syn keyword sqrParam edit-option-ad edit-option-am
+syn keyword sqrParam edit-option-bc edit-option-na
+syn keyword sqrParam edit-option-pm encoding entry erase-page
+syn keyword sqrParam extent field fill fixed fixed_nolf float
+syn keyword sqrParam font font-style font-type footing
+syn keyword sqrParam footing-size foreground for-append
+syn keyword sqrParam for-reading for-reports for-tocs
+syn keyword sqrParam for-writing format formfeed from goto-top
+syn keyword sqrParam group having heading heading-size height
+syn keyword sqrParam horz-line image-size in indentation
+syn keyword sqrParam init-string input-date-edit-mask insert
+syn keyword sqrParam integer into item-color item-size key
+syn keyword sqrParam layout left-margin legend legend-placement
+syn keyword sqrParam legend-presentation legend-title level
+syn keyword sqrParam line-height line-size line-width lines-inch
+syn keyword sqrParam local locale loops max-columns max-lines
+syn keyword sqrParam maxlen money money-edit-mask money-sign
+syn keyword sqrParam money-sign-location months-case months-full
+syn keyword sqrParam months-short name need newline newpage
+syn keyword sqrParam no-advance nolf noline noprompt normal not
+syn keyword sqrParam nowait number number-edit-mask on-break
+syn keyword sqrParam on-error or order orientation page-depth
+syn keyword sqrParam paper-size pie-segment-explode
+syn keyword sqrParam pie-segment-percent-display
+syn keyword sqrParam pie-segment-quantity-display pitch
+syn keyword sqrParam point-markers point-size printer
+syn keyword sqrParam printer-type quiet record reset-string
+syn keyword sqrParam return_value reverse right-margin rows save
+syn keyword sqrParam select size skip skiplines sort source
+syn keyword sqrParam sqr-database sqr-platform startup-file
+syn keyword sqrParam status stop sub-title symbol-set system
+syn keyword sqrParam table text thousand-seperator
+syn keyword sqrParam time-seperator times title to toc
+syn keyword sqrParam top-margin type underline update using
+syn keyword sqrParam value vary vert-line wait warn when
+syn keyword sqrParam when-other where with x-axis-grid
+syn keyword sqrParam x-axis-label x-axis-major-increment
+syn keyword sqrParam x-axis-major-tick-marks x-axis-max-value
+syn keyword sqrParam x-axis-min-value x-axis-minor-increment
+syn keyword sqrParam x-axis-minor-tick-marks x-axis-rotate
+syn keyword sqrParam x-axis-scale x-axis-tick-mark-placement xor
+syn keyword sqrParam y-axis-grid y-axis-label
+syn keyword sqrParam y-axis-major-increment
+syn keyword sqrParam y-axis-major-tick-marks y-axis-max-value
+syn keyword sqrParam y-axis-min-value y-axis-minor-increment
+syn keyword sqrParam y-axis-minor-tick-marks y-axis-scale
+syn keyword sqrParam y-axis-tick-mark-placement y2-type
+syn keyword sqrParam y2-data-array y2-data-array-row-count
+syn keyword sqrParam y2-data-array-column-count
+syn keyword sqrParam y2-data-array-column-labels
+syn keyword sqrParam y2-axis-color-palette y2-axis-label
+syn keyword sqrParam y2-axis-major-increment
+syn keyword sqrParam y2-axis-major-tick-marks y2-axis-max-value
+syn keyword sqrParam y2-axis-min-value y2-axis-minor-increment
+syn keyword sqrParam y2-axis-minor-tick-marks y2-axis-scale
+
+syn keyword sqrFunction abs acos asin atan array ascii asciic ceil
+syn keyword sqrFunction cos cosh chr cond deg delete dateadd
+syn keyword sqrFunction datediff datenow datetostr e10 exp edit
+syn keyword sqrFunction exists floor getenv instr instrb isblank
+syn keyword sqrFunction isnull log log10 length lengthb lengthp
+syn keyword sqrFunction lengtht lower lpad ltrim mod nvl power rad
+syn keyword sqrFunction round range replace roman rpad rtrim rename
+syn keyword sqrFunction sign sin sinh sqrt substr substrb substrp
+syn keyword sqrFunction substrt strtodate tan tanh trunc to_char
+syn keyword sqrFunction to_multi_byte to_number to_single_byte
+syn keyword sqrFunction transform translate unicode upper wrapdepth
+
+" END GENERATED SECTION ==============================================
+
+" Variables
+syn match sqrVariable /\(\$\|#\|&\)\(\k\|\.\)*/
+
+
+" Debug compiler directives
+syn match sqrPreProc /\s*#debug\a\=\(\s\|$\)/
+syn match sqrSubstVar /{\k*}/
+
+
+" Strings
+" Note: if an undoubled ! is found, this is not a valid string
+" (SQR will treat the end of the line as a comment)
+syn match sqrString /'\(!!\|[^!']\)*'/ contains=sqrSubstVar
+syn match sqrStrOpen /'\(!!\|''\|[^!']\)*$/
+" If we find a ' followed by an unmatched ! before a matching ',
+" flag the error.
+syn match sqrError /'\(!!\|[^'!]\)*![^!]/me=e-1
+syn match sqrError /'\(!!\|[^'!]\)*!$/
+
+" Numbers:
+syn match sqrNumber /-\=\<\d*\.\=[0-9_]\>/
+
+
+
+" Comments:
+" Handle comments that start with "!=" specially; they are only valid
+" in the first column of the source line. Also, "!!" is only treated
+" as a start-comment if there is only whitespace ahead of it on the line.
+
+syn keyword sqrTodo TODO FIXME XXX DEBUG NOTE ###
+syn match sqrTodo /???/
+
+" 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.
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/squid.vim b/runtime/syntax/squid.vim
new file mode 100644
index 0000000..a8abd18
--- /dev/null
+++ b/runtime/syntax/squid.vim
@@ -0,0 +1,140 @@
+" Vim syntax file
+" Language: Squid config file
+" Maintainer: Klaus Muth <klaus@hampft.de>
+" Last Change: 2005 Jun 12
+" URL: http://www.hampft.de/vim/syntax/squid.vim
+" ThanksTo: Ilya Sher <iso8601@mail.ru>,
+" Michael Dotzler <Michael.Dotzler@leoni.com>
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" squid.conf syntax seems to be case insensitive
+syn case ignore
+
+syn keyword squidTodo contained TODO
+syn match squidComment "#.*$" contains=squidTodo,squidTag
+syn match squidTag contained "TAG: .*$"
+
+" Lots & lots of Keywords!
+syn keyword squidConf acl always_direct announce_host announce_period
+syn keyword squidConf announce_port announce_to anonymize_headers
+syn keyword squidConf append_domain as_whois_server auth_param_basic
+syn keyword squidConf authenticate_children authenticate_program
+syn keyword squidConf authenticate_ttl broken_posts buffered_logs
+syn keyword squidConf cache_access_log cache_announce cache_dir
+syn keyword squidConf cache_dns_program cache_effective_group
+syn keyword squidConf cache_effective_user cache_host cache_host_acl
+syn keyword squidConf cache_host_domain cache_log cache_mem
+syn keyword squidConf cache_mem_high cache_mem_low cache_mgr
+syn keyword squidConf cachemgr_passwd cache_peer cache_peer_access
+syn keyword squidConf cahce_replacement_policy cache_stoplist
+syn keyword squidConf cache_stoplist_pattern cache_store_log cache_swap
+syn keyword squidConf cache_swap_high cache_swap_log cache_swap_low
+syn keyword squidConf client_db client_lifetime client_netmask
+syn keyword squidConf connect_timeout coredump_dir dead_peer_timeout
+syn keyword squidConf debug_options delay_access delay_class
+syn keyword squidConf delay_initial_bucket_level delay_parameters
+syn keyword squidConf delay_pools deny_info dns_children dns_defnames
+syn keyword squidConf dns_nameservers dns_testnames emulate_httpd_log
+syn keyword squidConf err_html_text fake_user_agent firewall_ip
+syn keyword squidConf forwarded_for forward_snmpd_port fqdncache_size
+syn keyword squidConf ftpget_options ftpget_program ftp_list_width
+syn keyword squidConf ftp_passive ftp_user half_closed_clients
+syn keyword squidConf header_access header_replace hierarchy_stoplist
+syn keyword squidConf high_response_time_warning high_page_fault_warning
+syn keyword squidConf htcp_port http_access http_anonymizer httpd_accel
+syn keyword squidConf httpd_accel_host httpd_accel_port
+syn keyword squidConf httpd_accel_uses_host_header
+syn keyword squidConf httpd_accel_with_proxy http_port http_reply_access
+syn keyword squidConf icp_access icp_hit_stale icp_port
+syn keyword squidConf icp_query_timeout ident_lookup ident_lookup_access
+syn keyword squidConf ident_timeout incoming_http_average
+syn keyword squidConf incoming_icp_average inside_firewall ipcache_high
+syn keyword squidConf ipcache_low ipcache_size local_domain local_ip
+syn keyword squidConf logfile_rotate log_fqdn log_icp_queries
+syn keyword squidConf log_mime_hdrs maximum_object_size
+syn keyword squidConf maximum_single_addr_tries mcast_groups
+syn keyword squidConf mcast_icp_query_timeout mcast_miss_addr
+syn keyword squidConf mcast_miss_encode_key mcast_miss_port memory_pools
+syn keyword squidConf memory_pools_limit memory_replacement_policy
+syn keyword squidConf mime_table min_http_poll_cnt min_icp_poll_cnt
+syn keyword squidConf minimum_direct_hops minimum_object_size
+syn keyword squidConf minimum_retry_timeout miss_access negative_dns_ttl
+syn keyword squidConf negative_ttl neighbor_timeout neighbor_type_domain
+syn keyword squidConf netdb_high netdb_low netdb_ping_period
+syn keyword squidConf netdb_ping_rate never_direct no_cache
+syn keyword squidConf passthrough_proxy pconn_timeout pid_filename
+syn keyword squidConf pinger_program positive_dns_ttl prefer_direct
+syn keyword squidConf proxy_auth proxy_auth_realm query_icmp quick_abort
+syn keyword squidConf quick_abort quick_abort_max quick_abort_min
+syn keyword squidConf quick_abort_pct range_offset_limit read_timeout
+syn keyword squidConf redirect_children redirect_program
+syn keyword squidConf redirect_rewrites_host_header reference_age
+syn keyword squidConf reference_age refresh_pattern reload_into_ims
+syn keyword squidConf request_body_max_size request_size request_timeout
+syn keyword squidConf shutdown_lifetime single_parent_bypass
+syn keyword squidConf siteselect_timeout snmp_access
+syn keyword squidConf snmp_incoming_address snmp_port source_ping
+syn keyword squidConf ssl_proxy store_avg_object_size
+syn keyword squidConf store_objects_per_bucket strip_query_terms
+syn keyword squidConf swap_level1_dirs swap_level2_dirs
+syn keyword squidConf tcp_incoming_address tcp_outgoing_address
+syn keyword squidConf tcp_recv_bufsize test_reachability udp_hit_obj
+syn keyword squidConf udp_hit_obj_size udp_incoming_address
+syn keyword squidConf udp_outgoing_address unique_hostname
+syn keyword squidConf unlinkd_program uri_whitespace useragent_log
+syn keyword squidConf visible_hostname wais_relay wais_relay_host
+syn keyword squidConf wais_relay_port
+
+syn keyword squidOpt proxy-only weight ttl no-query default
+syn keyword squidOpt round-robin multicast-responder
+syn keyword squidOpt on off all deny allow
+syn keyword squidopt via parent no-digest heap lru realm
+syn keyword squidopt children credentialsttl none disable
+syn keyword squidopt offline_toggle diskd q1 q2
+
+" Security Actions for cachemgr_passwd
+syn keyword squidAction shutdown info parameter server_list
+syn keyword squidAction client_list
+syn match squidAction "stats/\(objects\|vm_objects\|utilization\|ipcache\|fqdncache\|dns\|redirector\|io\|reply_headers\|filedescriptors\|netdb\)"
+syn match squidAction "log\(/\(status\|enable\|disable\|clear\)\)\="
+syn match squidAction "squid\.conf"
+
+" Keywords for the acl-config
+syn keyword squidAcl url_regex urlpath_regex referer_regex port proto
+syn keyword squidAcl req_mime_type rep_mime_type
+syn keyword squidAcl method browser user src dst
+syn keyword squidAcl time dstdomain ident snmp_community
+
+syn match squidNumber "\<\d\+\>"
+syn match squidIP "\<\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}\>"
+syn match squidStr "\(^\s*acl\s\+\S\+\s\+\(\S*_regex\|re[pq]_mime_type\|browser\|_domain\|user\)\+\s\+\)\@<=.*" contains=squidRegexOpt
+syn match squidRegexOpt contained "\(^\s*acl\s\+\S\+\s\+\S\+\(_regex\|_mime_type\)\s\+\)\@<=[-+]i\s\+"
+
+" All config is in one line, so this has to be sufficient
+" Make it fast like hell :)
+syn sync minlines=3
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "squid"
+
+" vim: ts=8
diff --git a/runtime/syntax/squirrel.vim b/runtime/syntax/squirrel.vim
new file mode 100644
index 0000000..81d59cc
--- /dev/null
+++ b/runtime/syntax/squirrel.vim
@@ -0,0 +1,50 @@
+" Vim syntax file
+" Language: squirrel
+" Current Maintainer: Matt Dunford (zenmatic@gmail.com)
+" URL: https://github.com/zenmatic/vim-syntax-squirrel
+" Last Change: 2021 Nov 28
+
+" http://squirrel-lang.org/
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" inform C syntax that the file was included from cpp.vim
+let b:filetype_in_cpp_family = 1
+
+" Read the C syntax to start with
+runtime! syntax/c.vim
+unlet b:current_syntax
+
+" squirrel extensions
+syn keyword squirrelStatement delete this in yield resume base clone
+syn keyword squirrelAccess local
+syn keyword cConstant null
+syn keyword squirrelModifier static
+syn keyword squirrelType bool instanceof typeof
+syn keyword squirrelExceptions throw try catch
+syn keyword squirrelStructure class function extends constructor
+syn keyword squirrelBoolean true false
+syn keyword squirrelRepeat foreach
+
+syn region squirrelMultiString start='@"' end='"$' end='";$'me=e-1
+
+syn match squirrelShComment "^\s*#.*$"
+
+" Default highlighting
+hi def link squirrelAccess squirrelStatement
+hi def link squirrelExceptions Exception
+hi def link squirrelStatement Statement
+hi def link squirrelModifier Type
+hi def link squirrelType Type
+hi def link squirrelStructure Structure
+hi def link squirrelBoolean Boolean
+hi def link squirrelMultiString String
+hi def link squirrelRepeat cRepeat
+hi def link squirrelShComment Comment
+
+let b:current_syntax = "squirrel"
+
+" vim: ts=8
diff --git a/runtime/syntax/srec.vim b/runtime/syntax/srec.vim
new file mode 100644
index 0000000..6ac22d9
--- /dev/null
+++ b/runtime/syntax/srec.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: Motorola S-Record
+" Maintainer: Markus Heidelberg <markus.heidelberg@web.de>
+" Last Change: 2015 Feb 24
+
+" Each record (line) is built as follows:
+"
+" field digits states
+"
+" +----------+
+" | start | 1 ('S') srecRecStart
+" +----------+
+" | type | 1 srecRecType, (srecRecTypeUnknown)
+" +----------+
+" | count | 2 srecByteCount
+" +----------+
+" | address | 4/6/8 srecNoAddress, srecDataAddress, srecRecCount, srecStartAddress, (srecAddressFieldUnknown)
+" +----------+
+" | data | 0..504/502/500 srecDataOdd, srecDataEven, (srecDataUnexpected)
+" +----------+
+" | checksum | 2 srecChecksum
+" +----------+
+"
+" States in parentheses in the upper format description indicate that they
+" should not appear in a valid file.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match srecRecStart "^S"
+
+syn match srecRecTypeUnknown "^S." contains=srecRecStart
+syn match srecRecType "^S[0-35-9]" contains=srecRecStart
+
+syn match srecByteCount "^S.[0-9a-fA-F]\{2}" contains=srecRecTypeUnknown nextgroup=srecAddressFieldUnknown,srecChecksum
+syn match srecByteCount "^S[0-35-9][0-9a-fA-F]\{2}" contains=srecRecType
+
+syn match srecAddressFieldUnknown "[0-9a-fA-F]\{2}" contained nextgroup=srecAddressFieldUnknown,srecChecksum
+
+syn match srecNoAddress "^S0[0-9a-fA-F]\{6}" contains=srecByteCount nextgroup=srecDataOdd,srecChecksum
+syn match srecDataAddress "^S1[0-9a-fA-F]\{6}" contains=srecByteCount nextgroup=srecDataOdd,srecChecksum
+syn match srecDataAddress "^S2[0-9a-fA-F]\{8}" contains=srecByteCount nextgroup=srecDataOdd,srecChecksum
+syn match srecDataAddress "^S3[0-9a-fA-F]\{10}" contains=srecByteCount nextgroup=srecDataOdd,srecChecksum
+syn match srecRecCount "^S5[0-9a-fA-F]\{6}" contains=srecByteCount nextgroup=srecDataUnexpected,srecChecksum
+syn match srecRecCount "^S6[0-9a-fA-F]\{8}" contains=srecByteCount nextgroup=srecDataUnexpected,srecChecksum
+syn match srecStartAddress "^S7[0-9a-fA-F]\{10}" contains=srecByteCount nextgroup=srecDataUnexpected,srecChecksum
+syn match srecStartAddress "^S8[0-9a-fA-F]\{8}" contains=srecByteCount nextgroup=srecDataUnexpected,srecChecksum
+syn match srecStartAddress "^S9[0-9a-fA-F]\{6}" contains=srecByteCount nextgroup=srecDataUnexpected,srecChecksum
+
+" alternating highlight per byte for easier reading
+syn match srecDataOdd "[0-9a-fA-F]\{2}" contained nextgroup=srecDataEven,srecChecksum
+syn match srecDataEven "[0-9a-fA-F]\{2}" contained nextgroup=srecDataOdd,srecChecksum
+" data bytes which should not exist
+syn match srecDataUnexpected "[0-9a-fA-F]\{2}" contained nextgroup=srecDataUnexpected,srecChecksum
+" Data digit pair regex usage also results in only highlighting the checksum
+" if the number of data characters is even.
+
+syn match srecChecksum "[0-9a-fA-F]\{2}$" contained
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+" 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
+
+
+let b:current_syntax = "srec"
+
+" vim: ts=8
diff --git a/runtime/syntax/srt.vim b/runtime/syntax/srt.vim
new file mode 100644
index 0000000..12fb264
--- /dev/null
+++ b/runtime/syntax/srt.vim
@@ -0,0 +1,62 @@
+" Vim syntax file
+" Language: SubRip
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: *.srt
+" Last Change: 2022 Sep 12
+
+if exists('b:current_syntax')
+ finish
+endif
+
+syn spell toplevel
+
+syn cluster srtSpecial contains=srtBold,srtItalics,srtStrikethrough,srtUnderline,srtFont,srtTag,srtEscape
+
+" Number
+syn match srtNumber /^\d\+$/ contains=@NoSpell
+
+" Range
+syn match srtRange /\d\d:\d\d:\d\d[,.]\d\d\d --> \d\d:\d\d:\d\d[,.]\d\d\d/ skipwhite contains=srtArrow,srtTime nextgroup=srtCoordinates
+syn match srtArrow /-->/ contained contains=@NoSpell
+syn match srtTime /\d\d:\d\d:\d\d[,.]\d\d\d/ contained contains=@NoSpell
+syn match srtCoordinates /X1:\d\+ X2:\d\+ Y1:\d\+ Y2:\d\+/ contained contains=@NoSpell
+
+" Bold
+syn region srtBold matchgroup=srtFormat start=+<b>+ end=+</b>+ contains=@srtSpecial
+syn region srtBold matchgroup=srtFormat start=+{b}+ end=+{/b}+ contains=@srtSpecial
+
+" Italics
+syn region srtItalics matchgroup=srtFormat start=+<i>+ end=+</i>+ contains=@srtSpecial
+syn region srtItalics matchgroup=srtFormat start=+{i}+ end=+{/i}+ contains=@srtSpecial
+
+" Strikethrough
+syn region srtStrikethrough matchgroup=srtFormat start=+<s>+ end=+</s>+ contains=@srtSpecial
+syn region srtStrikethrough matchgroup=srtFormat start=+{s}+ end=+{/s}+ contains=@srtSpecial
+
+" Underline
+syn region srtUnderline matchgroup=srtFormat start=+<u>+ end=+</u>+ contains=@srtSpecial
+syn region srtUnderline matchgroup=srtFormat start=+{u}+ end=+{/u}+ contains=@srtSpecial
+
+" Font
+syn region srtFont matchgroup=srtFormat start=+<font[^>]\{-}>+ end=+</font>+ contains=@srtSpecial
+
+" ASS tags
+syn match srtTag /{\\[^}]\{1,}}/ contains=@NoSpell
+
+" Special characters
+syn match srtEscape /\\[nNh]/ contains=@NoSpell
+
+hi def link srtArrow Delimiter
+hi def link srtCoordinates Label
+hi def link srtEscape SpecialChar
+hi def link srtFormat Special
+hi def link srtNumber Number
+hi def link srtTag PreProc
+hi def link srtTime String
+
+hi srtBold cterm=bold gui=bold
+hi srtItalics cterm=italic gui=italic
+hi srtStrikethrough cterm=strikethrough gui=strikethrough
+hi srtUnderline cterm=underline gui=underline
+
+let b:current_syntax = 'srt'
diff --git a/runtime/syntax/ssa.vim b/runtime/syntax/ssa.vim
new file mode 100644
index 0000000..a5dbf37
--- /dev/null
+++ b/runtime/syntax/ssa.vim
@@ -0,0 +1,63 @@
+" Vim syntax file
+" Language: SubStation Alpha
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: *.ass,*.ssa
+" Last Change: 2022 Oct 10
+
+if exists('b:current_syntax')
+ finish
+endif
+
+" Comments
+syn keyword ssaTodo TODO FIXME NOTE XXX contained
+syn match ssaComment /^\(;\|!:\).*$/ contains=ssaTodo,@Spell
+syn match ssaTextComment /{[^}]*}/ contained contains=@Spell
+
+" Sections
+syn match ssaSection /^\[[a-zA-Z0-9+ ]\+\]$/
+
+" Headers
+syn match ssaHeader /^[^;!:]\+:/ skipwhite nextgroup=ssaField
+
+" Fields
+syn match ssaField /[^,]*/ contained skipwhite nextgroup=ssaDelimiter
+
+" Time
+syn match ssaTime /\d:\d\d:\d\d\.\d\d/ contained skipwhite nextgroup=ssaDelimiter
+
+" Delimiter
+syn match ssaDelimiter /,/ contained skipwhite nextgroup=ssaField,ssaTime,ssaText
+
+" Text
+syn match ssaText /\(^Dialogue:\(.*,\)\{9}\)\@<=.*$/ contained contains=@ssaTags,@Spell
+syn cluster ssaTags contains=ssaOverrideTag,ssaEscapeChar,ssaTextComment,ssaItalics,ssaBold,ssaUnderline,ssaStrikeout
+
+" Override tags
+syn match ssaOverrideTag /{\\[^}]\+}/ contained contains=@NoSpell
+
+" Special characters
+syn match ssaEscapeChar /\\[nNh{}]/ contained contains=@NoSpell
+
+" Markup
+syn region ssaItalics start=/{\\i1}/ end=/{\\i0}/ matchgroup=ssaOverrideTag keepend oneline contained contains=@ssaTags,@Spell
+syn region ssaBold start=/{\\b1}/ end=/{\\b0}/ matchgroup=ssaOverrideTag keepend oneline contained contains=@ssaTags,@Spell
+syn region ssaUnderline start=/{\\u1}/ end=/{\\u0}/ matchgroup=ssaOverrideTag keepend oneline contained contains=@ssaTags,@Spell
+syn region ssaStrikeout start=/{\\s1}/ end=/{\\s0}/ matchgroup=ssaOverrideTag keepend oneline contained contains=@ssaTags,@Spell
+
+hi def link ssaDelimiter Delimiter
+hi def link ssaComment Comment
+hi def link ssaEscapeChar SpecialChar
+hi def link ssaField String
+hi def link ssaHeader Label
+hi def link ssaSection StorageClass
+hi def link ssaOverrideTag Special
+hi def link ssaTextComment Comment
+hi def link ssaTime Number
+hi def link ssaTodo Todo
+
+hi ssaBold cterm=bold gui=bold
+hi ssaItalics cterm=italic gui=italic
+hi ssaStrikeout cterm=strikethrough gui=strikethrough
+hi ssaUnderline cterm=underline gui=underline
+
+let b:current_syntax = 'srt'
diff --git a/runtime/syntax/sshconfig.vim b/runtime/syntax/sshconfig.vim
new file mode 100644
index 0000000..750289d
--- /dev/null
+++ b/runtime/syntax/sshconfig.vim
@@ -0,0 +1,296 @@
+" Vim syntax file
+" Language: OpenSSH client configuration file (ssh_config)
+" Author: David Necas (Yeti)
+" Maintainer: Jakub Jelen <jakuje at gmail dot com>
+" Previous 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>
+" Contributor: Dean, Adam Kenneth <adam.ken.dean@hpe.com>
+" Last Change: 2022 Nov 10
+" Added RemoteCommand from pull request #4809
+" Included additional keywords from Martin.
+" Included PR #5753
+" SSH Version: 8.5p1
+"
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=_,-,a-z,A-Z,48-57
+
+
+" case on
+syn case match
+
+
+" Comments
+syn match sshconfigComment "^#.*$" contains=sshconfigTodo
+syn match sshconfigComment "\s#.*$" contains=sshconfigTodo
+
+syn keyword sshconfigTodo TODO FIXME NOTE contained
+
+
+" Constants
+syn keyword sshconfigYesNo yes no ask confirm
+syn keyword sshconfigYesNo any auto
+syn keyword sshconfigYesNo force autoask none
+
+syn keyword sshconfigCipher 3des blowfish
+
+syn keyword sshconfigCiphers 3des-cbc
+syn keyword sshconfigCiphers blowfish-cbc
+syn keyword sshconfigCiphers cast128-cbc
+syn keyword sshconfigCiphers arcfour
+syn keyword sshconfigCiphers arcfour128
+syn keyword sshconfigCiphers arcfour256
+syn keyword sshconfigCiphers aes128-cbc
+syn keyword sshconfigCiphers aes192-cbc
+syn keyword sshconfigCiphers aes256-cbc
+syn match sshconfigCiphers "\<rijndael-cbc@lysator\.liu.se\>"
+syn keyword sshconfigCiphers aes128-ctr
+syn keyword sshconfigCiphers aes192-ctr
+syn keyword sshconfigCiphers aes256-ctr
+syn match sshconfigCiphers "\<aes128-gcm@openssh\.com\>"
+syn match sshconfigCiphers "\<aes256-gcm@openssh\.com\>"
+syn match sshconfigCiphers "\<chacha20-poly1305@openssh\.com\>"
+
+syn keyword sshconfigMAC hmac-sha1
+syn keyword sshconfigMAC hmac-sha1-96
+syn keyword sshconfigMAC hmac-sha2-256
+syn keyword sshconfigMAC hmac-sha2-512
+syn keyword sshconfigMAC hmac-md5
+syn keyword sshconfigMAC hmac-md5-96
+syn keyword sshconfigMAC hmac-ripemd160
+syn match sshconfigMAC "\<hmac-ripemd160@openssh\.com\>"
+syn match sshconfigMAC "\<umac-64@openssh\.com\>"
+syn match sshconfigMAC "\<umac-128@openssh\.com\>"
+syn match sshconfigMAC "\<hmac-sha1-etm@openssh\.com\>"
+syn match sshconfigMAC "\<hmac-sha1-96-etm@openssh\.com\>"
+syn match sshconfigMAC "\<hmac-sha2-256-etm@openssh\.com\>"
+syn match sshconfigMAC "\<hmac-sha2-512-etm@openssh\.com\>"
+syn match sshconfigMAC "\<hmac-md5-etm@openssh\.com\>"
+syn match sshconfigMAC "\<hmac-md5-96-etm@openssh\.com\>"
+syn match sshconfigMAC "\<hmac-ripemd160-etm@openssh\.com\>"
+syn match sshconfigMAC "\<umac-64-etm@openssh\.com\>"
+syn match sshconfigMAC "\<umac-128-etm@openssh\.com\>"
+
+syn keyword sshconfigHostKeyAlgo ssh-ed25519
+syn match sshconfigHostKeyAlgo "\<ssh-ed25519-cert-v01@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<sk-ssh-ed25519@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<sk-ssh-ed25519-cert-v01@openssh\.com\>"
+syn keyword sshconfigHostKeyAlgo ssh-rsa
+syn keyword sshconfigHostKeyAlgo rsa-sha2-256
+syn keyword sshconfigHostKeyAlgo rsa-sha2-512
+syn keyword sshconfigHostKeyAlgo ssh-dss
+syn keyword sshconfigHostKeyAlgo ecdsa-sha2-nistp256
+syn keyword sshconfigHostKeyAlgo ecdsa-sha2-nistp384
+syn keyword sshconfigHostKeyAlgo ecdsa-sha2-nistp521
+syn match sshconfigHostKeyAlgo "\<sk-ecdsa-sha2-nistp256@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<ssh-rsa-cert-v01@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<rsa-sha2-256-cert-v01@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<rsa-sha2-512-cert-v01@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<ssh-dss-cert-v01@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<ecdsa-sha2-nistp256-cert-v01@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<ecdsa-sha2-nistp384-cert-v01@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<ecdsa-sha2-nistp521-cert-v01@openssh\.com\>"
+syn match sshconfigHostKeyAlgo "\<sk-ecdsa-sha2-nistp256-cert-v01@openssh\.com\>"
+
+syn keyword sshconfigPreferredAuth hostbased publickey password gssapi-with-mic
+syn keyword sshconfigPreferredAuth keyboard-interactive
+
+syn keyword sshconfigLogLevel QUIET FATAL ERROR INFO VERBOSE
+syn keyword sshconfigLogLevel DEBUG DEBUG1 DEBUG2 DEBUG3
+syn keyword sshconfigSysLogFacility DAEMON USER AUTH AUTHPRIV LOCAL0 LOCAL1
+syn keyword sshconfigSysLogFacility LOCAL2 LOCAL3 LOCAL4 LOCAL5 LOCAL6 LOCAL7
+syn keyword sshconfigAddressFamily inet inet6
+
+syn match sshconfigIPQoS "af1[123]"
+syn match sshconfigIPQoS "af2[123]"
+syn match sshconfigIPQoS "af3[123]"
+syn match sshconfigIPQoS "af4[123]"
+syn match sshconfigIPQoS "cs[0-7]"
+syn keyword sshconfigIPQoS ef lowdelay throughput reliability
+syn keyword sshconfigKbdInteractive bsdauth pam skey
+
+syn keyword sshconfigKexAlgo diffie-hellman-group1-sha1
+syn keyword sshconfigKexAlgo diffie-hellman-group14-sha1
+syn keyword sshconfigKexAlgo diffie-hellman-group-exchange-sha1
+syn keyword sshconfigKexAlgo diffie-hellman-group-exchange-sha256
+syn keyword sshconfigKexAlgo ecdh-sha2-nistp256
+syn keyword sshconfigKexAlgo ecdh-sha2-nistp384
+syn keyword sshconfigKexAlgo ecdh-sha2-nistp521
+syn match sshconfigKexAlgo "\<curve25519-sha256@libssh\.org\>"
+
+syn keyword sshconfigTunnel point-to-point ethernet
+
+syn match sshconfigVar "%[rhplLdun]\>"
+syn match sshconfigSpecial "[*?]"
+syn match sshconfigNumber "\d\+"
+syn match sshconfigHostPort "\<\(\d\{1,3}\.\)\{3}\d\{1,3}\(:\d\+\)\?\>"
+syn match sshconfigHostPort "\<\([-a-zA-Z0-9]\+\.\)\+[-a-zA-Z0-9]\{2,}\(:\d\+\)\?\>"
+syn match sshconfigHostPort "\<\(\x\{,4}:\)\+\x\{,4}[:/]\d\+\>"
+syn match sshconfigHostPort "\(Host \)\@<=.\+"
+syn match sshconfigHostPort "\(HostName \)\@<=.\+"
+
+" case off
+syn case ignore
+
+
+" Keywords
+syn keyword sshconfigHostSect Host
+
+syn keyword sshconfigMatch canonical final 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 BindInterface
+syn keyword sshconfigKeyword CanonicalDomains
+syn keyword sshconfigKeyword CanonicalizeFallbackLocal
+syn keyword sshconfigKeyword CanonicalizeHostname
+syn keyword sshconfigKeyword CanonicalizeMaxDots
+syn keyword sshconfigKeyword CanonicalizePermittedCNAMEs
+syn keyword sshconfigKeyword CASignatureAlgorithms
+syn keyword sshconfigKeyword CertificateFile
+syn keyword sshconfigKeyword ChallengeResponseAuthentication
+syn keyword sshconfigKeyword CheckHostIP
+syn keyword sshconfigKeyword Ciphers
+syn keyword sshconfigKeyword ClearAllForwardings
+syn keyword sshconfigKeyword Compression
+syn keyword sshconfigKeyword ConnectTimeout
+syn keyword sshconfigKeyword ConnectionAttempts
+syn keyword sshconfigKeyword ControlMaster
+syn keyword sshconfigKeyword ControlPath
+syn keyword sshconfigKeyword ControlPersist
+syn keyword sshconfigKeyword DynamicForward
+syn keyword sshconfigKeyword EnableSSHKeysign
+syn keyword sshconfigKeyword EscapeChar
+syn keyword sshconfigKeyword ExitOnForwardFailure
+syn keyword sshconfigKeyword FingerprintHash
+syn keyword sshconfigKeyword ForkAfterAuthentication
+syn keyword sshconfigKeyword ForwardAgent
+syn keyword sshconfigKeyword ForwardX11
+syn keyword sshconfigKeyword ForwardX11Timeout
+syn keyword sshconfigKeyword ForwardX11Trusted
+syn keyword sshconfigKeyword GSSAPIAuthentication
+syn keyword sshconfigKeyword GSSAPIDelegateCredentials
+syn keyword sshconfigKeyword GatewayPorts
+syn keyword sshconfigKeyword GlobalKnownHostsFile
+syn keyword sshconfigKeyword HashKnownHosts
+syn keyword sshconfigKeyword HostKeyAlgorithms
+syn keyword sshconfigKeyword HostKeyAlias
+syn keyword sshconfigKeyword HostName
+syn keyword sshconfigKeyword HostbasedAuthentication
+syn keyword sshconfigKeyword HostbasedAcceptedAlgorithms
+syn keyword sshconfigKeyword HostbasedKeyTypes
+syn keyword sshconfigKeyword IPQoS
+syn keyword sshconfigKeyword IdentitiesOnly
+syn keyword sshconfigKeyword IdentityAgent
+syn keyword sshconfigKeyword IdentityFile
+syn keyword sshconfigKeyword IgnoreUnknown
+syn keyword sshconfigKeyword Include
+syn keyword sshconfigKeyword IPQoS
+syn keyword sshconfigKeyword KbdInteractiveAuthentication
+syn keyword sshconfigKeyword KbdInteractiveDevices
+syn keyword sshconfigKeyword KexAlgorithms
+syn keyword sshconfigKeyword KnownHostsCommand
+syn keyword sshconfigKeyword LocalCommand
+syn keyword sshconfigKeyword LocalForward
+syn keyword sshconfigKeyword LogLevel
+syn keyword sshconfigKeyword LogVerbose
+syn keyword sshconfigKeyword MACs
+syn keyword sshconfigKeyword Match
+syn keyword sshconfigKeyword NoHostAuthenticationForLocalhost
+syn keyword sshconfigKeyword NumberOfPasswordPrompts
+syn keyword sshconfigKeyword PKCS11Provider
+syn keyword sshconfigKeyword PasswordAuthentication
+syn keyword sshconfigKeyword PermitLocalCommand
+syn keyword sshconfigKeyword PermitRemoteOpen
+syn keyword sshconfigKeyword Port
+syn keyword sshconfigKeyword PreferredAuthentications
+syn keyword sshconfigKeyword ProxyCommand
+syn keyword sshconfigKeyword ProxyJump
+syn keyword sshconfigKeyword ProxyUseFDPass
+syn keyword sshconfigKeyword PubkeyAcceptedAlgorithms
+syn keyword sshconfigKeyword PubkeyAcceptedKeyTypes
+syn keyword sshconfigKeyword PubkeyAuthentication
+syn keyword sshconfigKeyword RekeyLimit
+syn keyword sshconfigKeyword RemoteCommand
+syn keyword sshconfigKeyword RemoteForward
+syn keyword sshconfigKeyword RequestTTY
+syn keyword sshconfigKeyword RequiredRSASize
+syn keyword sshconfigKeyword RevokedHostKeys
+syn keyword sshconfigKeyword SecurityKeyProvider
+syn keyword sshconfigKeyword SendEnv
+syn keyword sshconfigKeyword ServerAliveCountMax
+syn keyword sshconfigKeyword ServerAliveInterval
+syn keyword sshconfigKeyword SessionType
+syn keyword sshconfigKeyword SmartcardDevice
+syn keyword sshconfigKeyword SetEnv
+syn keyword sshconfigKeyword StdinNull
+syn keyword sshconfigKeyword StreamLocalBindMask
+syn keyword sshconfigKeyword StreamLocalBindUnlink
+syn keyword sshconfigKeyword StrictHostKeyChecking
+syn keyword sshconfigKeyword SyslogFacility
+syn keyword sshconfigKeyword TCPKeepAlive
+syn keyword sshconfigKeyword Tunnel
+syn keyword sshconfigKeyword TunnelDevice
+syn keyword sshconfigKeyword UseBlacklistedKeys
+syn keyword sshconfigKeyword UpdateHostKeys
+syn keyword sshconfigKeyword User
+syn keyword sshconfigKeyword UserKnownHostsFile
+syn keyword sshconfigKeyword VerifyHostKeyDNS
+syn keyword sshconfigKeyword VisualHostKey
+syn keyword sshconfigKeyword XAuthLocation
+
+" Deprecated/ignored/remove/unsupported keywords
+
+syn keyword sshConfigDeprecated Cipher
+syn keyword sshconfigDeprecated GSSAPIClientIdentity
+syn keyword sshconfigDeprecated GSSAPIKeyExchange
+syn keyword sshconfigDeprecated GSSAPIRenewalForcesRekey
+syn keyword sshconfigDeprecated GSSAPIServerIdentity
+syn keyword sshconfigDeprecated GSSAPITrustDNS
+syn keyword sshconfigDeprecated GSSAPITrustDns
+syn keyword sshconfigDeprecated Protocol
+syn keyword sshconfigDeprecated RSAAuthentication
+syn keyword sshconfigDeprecated RhostsRSAAuthentication
+syn keyword sshconfigDeprecated CompressionLevel
+syn keyword sshconfigDeprecated UseRoaming
+syn keyword sshconfigDeprecated UsePrivilegedPort
+
+" Define the default highlighting
+
+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 sshconfigDeprecated
+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
+hi def link sshconfigDeprecated Error
+
+let b:current_syntax = "sshconfig"
+
+" vim:set ts=8 sw=2 sts=2:
diff --git a/runtime/syntax/sshdconfig.vim b/runtime/syntax/sshdconfig.vim
new file mode 100644
index 0000000..c0d9c3f
--- /dev/null
+++ b/runtime/syntax/sshdconfig.vim
@@ -0,0 +1,308 @@
+" Vim syntax file
+" Language: OpenSSH server configuration file (sshd_config)
+" Author: David Necas (Yeti)
+" Maintainer: Jakub Jelen <jakuje at gmail dot com>
+" Previous Maintainer: Dominik Fischer <d dot f dot fischer at web dot de>
+" Contributor: Thilo Six
+" Contributor: Leonard Ehrenfried <leonard.ehrenfried@web.de>
+" Contributor: Karsten Hopp <karsten@redhat.com>
+" Originally: 2009-07-09
+" Last Change: 2022 Nov 10
+" SSH Version: 8.5p1
+"
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal iskeyword=_,-,a-z,A-Z,48-57
+
+
+" case on
+syn case match
+
+
+" Comments
+syn match sshdconfigComment "^#.*$" contains=sshdconfigTodo
+syn match sshdconfigComment "\s#.*$" contains=sshdconfigTodo
+
+syn keyword sshdconfigTodo TODO FIXME NOTE contained
+
+" Constants
+syn keyword sshdconfigYesNo yes no none
+
+syn keyword sshdconfigAddressFamily any inet inet6
+
+syn keyword sshdconfigPrivilegeSeparation sandbox
+
+syn keyword sshdconfigTcpForwarding local remote
+
+syn keyword sshdconfigRootLogin prohibit-password without-password forced-commands-only
+
+syn keyword sshdconfigCiphers 3des-cbc
+syn keyword sshdconfigCiphers blowfish-cbc
+syn keyword sshdconfigCiphers cast128-cbc
+syn keyword sshdconfigCiphers arcfour
+syn keyword sshdconfigCiphers arcfour128
+syn keyword sshdconfigCiphers arcfour256
+syn keyword sshdconfigCiphers aes128-cbc
+syn keyword sshdconfigCiphers aes192-cbc
+syn keyword sshdconfigCiphers aes256-cbc
+syn match sshdconfigCiphers "\<rijndael-cbc@lysator\.liu.se\>"
+syn keyword sshdconfigCiphers aes128-ctr
+syn keyword sshdconfigCiphers aes192-ctr
+syn keyword sshdconfigCiphers aes256-ctr
+syn match sshdconfigCiphers "\<aes128-gcm@openssh\.com\>"
+syn match sshdconfigCiphers "\<aes256-gcm@openssh\.com\>"
+syn match sshdconfigCiphers "\<chacha20-poly1305@openssh\.com\>"
+
+syn keyword sshdconfigMAC hmac-sha1
+syn keyword sshdconfigMAC hmac-sha1-96
+syn keyword sshdconfigMAC hmac-sha2-256
+syn keyword sshdconfigMAC hmac-sha2-512
+syn keyword sshdconfigMAC hmac-md5
+syn keyword sshdconfigMAC hmac-md5-96
+syn keyword sshdconfigMAC hmac-ripemd160
+syn match sshdconfigMAC "\<hmac-ripemd160@openssh\.com\>"
+syn match sshdconfigMAC "\<umac-64@openssh\.com\>"
+syn match sshdconfigMAC "\<umac-128@openssh\.com\>"
+syn match sshdconfigMAC "\<hmac-sha1-etm@openssh\.com\>"
+syn match sshdconfigMAC "\<hmac-sha1-96-etm@openssh\.com\>"
+syn match sshdconfigMAC "\<hmac-sha2-256-etm@openssh\.com\>"
+syn match sshdconfigMAC "\<hmac-sha2-512-etm@openssh\.com\>"
+syn match sshdconfigMAC "\<hmac-md5-etm@openssh\.com\>"
+syn match sshdconfigMAC "\<hmac-md5-96-etm@openssh\.com\>"
+syn match sshdconfigMAC "\<hmac-ripemd160-etm@openssh\.com\>"
+syn match sshdconfigMAC "\<umac-64-etm@openssh\.com\>"
+syn match sshdconfigMAC "\<umac-128-etm@openssh\.com\>"
+
+syn keyword sshdconfigHostKeyAlgo ssh-ed25519
+syn match sshdconfigHostKeyAlgo "\<ssh-ed25519-cert-v01@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<sk-ssh-ed25519@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<sk-ssh-ed25519-cert-v01@openssh\.com\>"
+syn keyword sshdconfigHostKeyAlgo ssh-rsa
+syn keyword sshdconfigHostKeyAlgo rsa-sha2-256
+syn keyword sshdconfigHostKeyAlgo rsa-sha2-512
+syn keyword sshdconfigHostKeyAlgo ssh-dss
+syn keyword sshdconfigHostKeyAlgo ecdsa-sha2-nistp256
+syn keyword sshdconfigHostKeyAlgo ecdsa-sha2-nistp384
+syn keyword sshdconfigHostKeyAlgo ecdsa-sha2-nistp521
+syn match sshdconfigHostKeyAlgo "\<ssh-rsa-cert-v01@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<rsa-sha2-256-cert-v01@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<rsa-sha2-512-cert-v01@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<ssh-dss-cert-v01@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<ecdsa-sha2-nistp256-cert-v01@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<ecdsa-sha2-nistp384-cert-v01@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<ecdsa-sha2-nistp521-cert-v01@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<sk-ecdsa-sha2-nistp256@openssh\.com\>"
+syn match sshdconfigHostKeyAlgo "\<sk-ecdsa-sha2-nistp256-cert-v01@openssh\.com\>"
+
+syn keyword sshdconfigRootLogin prohibit-password without-password forced-commands-only
+
+syn keyword sshdconfigLogLevel QUIET FATAL ERROR INFO VERBOSE
+syn keyword sshdconfigLogLevel DEBUG DEBUG1 DEBUG2 DEBUG3
+syn keyword sshdconfigSysLogFacility DAEMON USER AUTH AUTHPRIV LOCAL0 LOCAL1
+syn keyword sshdconfigSysLogFacility LOCAL2 LOCAL3 LOCAL4 LOCAL5 LOCAL6 LOCAL7
+
+syn keyword sshdconfigCompression delayed
+
+syn match sshdconfigIPQoS "af1[123]"
+syn match sshdconfigIPQoS "af2[123]"
+syn match sshdconfigIPQoS "af3[123]"
+syn match sshdconfigIPQoS "af4[123]"
+syn match sshdconfigIPQoS "cs[0-7]"
+syn keyword sshdconfigIPQoS ef lowdelay throughput reliability
+
+syn keyword sshdconfigKexAlgo diffie-hellman-group1-sha1
+syn keyword sshdconfigKexAlgo diffie-hellman-group14-sha1
+syn keyword sshdconfigKexAlgo diffie-hellman-group14-sha256
+syn keyword sshdconfigKexAlgo diffie-hellman-group16-sha512
+syn keyword sshdconfigKexAlgo diffie-hellman-group18-sha512
+syn keyword sshdconfigKexAlgo diffie-hellman-group-exchange-sha1
+syn keyword sshdconfigKexAlgo diffie-hellman-group-exchange-sha256
+syn keyword sshdconfigKexAlgo ecdh-sha2-nistp256
+syn keyword sshdconfigKexAlgo ecdh-sha2-nistp384
+syn keyword sshdconfigKexAlgo ecdh-sha2-nistp521
+syn keyword sshdconfigKexAlgo curve25519-sha256
+syn match sshdconfigKexAlgo "\<curve25519-sha256@libssh\.org\>"
+syn match sshdconfigKexAlgo "\<sntrup4591761x25519-sha512@tinyssh\.org\>"
+
+syn keyword sshdconfigTunnel point-to-point ethernet
+
+syn keyword sshdconfigSubsystem internal-sftp
+
+syn match sshdconfigVar "%[hu]\>"
+syn match sshdconfigVar "%%"
+
+syn match sshdconfigSpecial "[*?]"
+
+syn match sshdconfigNumber "\d\+"
+syn match sshdconfigHostPort "\<\(\d\{1,3}\.\)\{3}\d\{1,3}\(:\d\+\)\?\>"
+syn match sshdconfigHostPort "\<\([-a-zA-Z0-9]\+\.\)\+[-a-zA-Z0-9]\{2,}\(:\d\+\)\?\>"
+" FIXME: this matches quite a few things which are NOT valid IPv6 addresses
+syn match sshdconfigHostPort "\<\(\x\{,4}:\)\+\x\{,4}:\d\+\>"
+syn match sshdconfigTime "\<\(\d\+[sSmMhHdDwW]\)\+\>"
+
+
+" case off
+syn case ignore
+
+
+" Keywords
+" Also includes RDomain, but that is a keyword.
+syn keyword sshdconfigMatch Host User Group Address LocalAddress LocalPort
+
+syn keyword sshdconfigKeyword AcceptEnv
+syn keyword sshdconfigKeyword AddressFamily
+syn keyword sshdconfigKeyword AllowAgentForwarding
+syn keyword sshdconfigKeyword AllowGroups
+syn keyword sshdconfigKeyword AllowStreamLocalForwarding
+syn keyword sshdconfigKeyword AllowTcpForwarding
+syn keyword sshdconfigKeyword AllowUsers
+syn keyword sshdconfigKeyword AuthenticationMethods
+syn keyword sshdconfigKeyword AuthorizedKeysFile
+syn keyword sshdconfigKeyword AuthorizedKeysCommand
+syn keyword sshdconfigKeyword AuthorizedKeysCommandUser
+syn keyword sshdconfigKeyword AuthorizedPrincipalsCommand
+syn keyword sshdconfigKeyword AuthorizedPrincipalsCommandUser
+syn keyword sshdconfigKeyword AuthorizedPrincipalsFile
+syn keyword sshdconfigKeyword Banner
+syn keyword sshdconfigKeyword CASignatureAlgorithms
+syn keyword sshdconfigKeyword ChallengeResponseAuthentication
+syn keyword sshdconfigKeyword ChrootDirectory
+syn keyword sshdconfigKeyword Ciphers
+syn keyword sshdconfigKeyword ClientAliveCountMax
+syn keyword sshdconfigKeyword ClientAliveInterval
+syn keyword sshdconfigKeyword Compression
+syn keyword sshdconfigKeyword DebianBanner
+syn keyword sshdconfigKeyword DenyGroups
+syn keyword sshdconfigKeyword DenyUsers
+syn keyword sshdconfigKeyword DisableForwarding
+syn keyword sshdconfigKeyword ExposeAuthInfo
+syn keyword sshdconfigKeyword FingerprintHash
+syn keyword sshdconfigKeyword ForceCommand
+syn keyword sshdconfigKeyword GatewayPorts
+syn keyword sshdconfigKeyword GSSAPIAuthentication
+syn keyword sshdconfigKeyword GSSAPICleanupCredentials
+syn keyword sshdconfigKeyword GSSAPIEnablek5users
+syn keyword sshdconfigKeyword GSSAPIKeyExchange
+syn keyword sshdconfigKeyword GSSAPIKexAlgorithms
+syn keyword sshdconfigKeyword GSSAPIStoreCredentialsOnRekey
+syn keyword sshdconfigKeyword GSSAPIStrictAcceptorCheck
+syn keyword sshdconfigKeyword HostCertificate
+syn keyword sshdconfigKeyword HostKey
+syn keyword sshdconfigKeyword HostKeyAgent
+syn keyword sshdconfigKeyword HostKeyAlgorithms
+syn keyword sshdconfigKeyword HostbasedAcceptedAlgorithms
+syn keyword sshdconfigKeyword HostbasedAcceptedKeyTypes
+syn keyword sshdconfigKeyword HostbasedAuthentication
+syn keyword sshdconfigKeyword HostbasedUsesNameFromPacketOnly
+syn keyword sshdconfigKeyword IPQoS
+syn keyword sshdconfigKeyword IgnoreRhosts
+syn keyword sshdconfigKeyword IgnoreUserKnownHosts
+syn keyword sshdconfigKeyword Include
+syn keyword sshdconfigKeyword KbdInteractiveAuthentication
+syn keyword sshdconfigKeyword KerberosAuthentication
+syn keyword sshdconfigKeyword KerberosGetAFSToken
+syn keyword sshdconfigKeyword KerberosOrLocalPasswd
+syn keyword sshdconfigKeyword KerberosTicketCleanup
+syn keyword sshdconfigKeyword KerberosUniqueCCache
+syn keyword sshdconfigKeyword KerberosUseKuserok
+syn keyword sshdconfigKeyword KexAlgorithms
+syn keyword sshdconfigKeyword KeyRegenerationInterval
+syn keyword sshdconfigKeyword ListenAddress
+syn keyword sshdconfigKeyword LogLevel
+syn keyword sshdconfigKeyword LogVerbose
+syn keyword sshdconfigKeyword LoginGraceTime
+syn keyword sshdconfigKeyword MACs
+syn keyword sshdconfigKeyword Match
+syn keyword sshdconfigKeyword MaxAuthTries
+syn keyword sshdconfigKeyword MaxSessions
+syn keyword sshdconfigKeyword MaxStartups
+syn keyword sshdconfigKeyword ModuliFile
+syn keyword sshdconfigKeyword PasswordAuthentication
+syn keyword sshdconfigKeyword PerSourceMaxStartups
+syn keyword sshdconfigKeyword PerSourceNetBlockSize
+syn keyword sshdconfigKeyword PermitBlacklistedKeys
+syn keyword sshdconfigKeyword PermitEmptyPasswords
+syn keyword sshdconfigKeyword PermitListen
+syn keyword sshdconfigKeyword PermitOpen
+syn keyword sshdconfigKeyword PermitRootLogin
+syn keyword sshdconfigKeyword PermitTTY
+syn keyword sshdconfigKeyword PermitTunnel
+syn keyword sshdconfigKeyword PermitUserEnvironment
+syn keyword sshdconfigKeyword PermitUserRC
+syn keyword sshdconfigKeyword PidFile
+syn keyword sshdconfigKeyword Port
+syn keyword sshdconfigKeyword PrintLastLog
+syn keyword sshdconfigKeyword PrintMotd
+syn keyword sshdconfigKeyword Protocol
+syn keyword sshdconfigKeyword PubkeyAcceptedAlgorithms
+syn keyword sshdconfigKeyword PubkeyAcceptedKeyTypes
+syn keyword sshdconfigKeyword PubkeyAuthentication
+syn keyword sshdconfigKeyword PubkeyAuthOptions
+syn keyword sshdconfigKeyword RSAAuthentication
+syn keyword sshdconfigKeyword RekeyLimit
+syn keyword sshdconfigKeyword RequiredRSASize
+syn keyword sshdconfigKeyword RevokedKeys
+syn keyword sshdconfigKeyword RDomain
+syn keyword sshdconfigKeyword RhostsRSAAuthentication
+syn keyword sshdconfigKeyword SecurityKeyProvider
+syn keyword sshdconfigKeyword ServerKeyBits
+syn keyword sshdconfigKeyword SetEnv
+syn keyword sshdconfigKeyword ShowPatchLevel
+syn keyword sshdconfigKeyword StrictModes
+syn keyword sshdconfigKeyword StreamLocalBindMask
+syn keyword sshdconfigKeyword StreamLocalBindUnlink
+syn keyword sshdconfigKeyword Subsystem
+syn keyword sshdconfigKeyword SyslogFacility
+syn keyword sshdconfigKeyword TCPKeepAlive
+syn keyword sshdconfigKeyword TrustedUserCAKeys
+syn keyword sshdconfigKeyword UseBlacklist
+syn keyword sshdconfigKeyword UseBlocklist
+syn keyword sshdconfigKeyword UseDNS
+syn keyword sshdconfigKeyword UseLogin
+syn keyword sshdconfigKeyword UsePAM
+syn keyword sshdconfigKeyword VersionAddendum
+syn keyword sshdconfigKeyword X11DisplayOffset
+syn keyword sshdconfigKeyword X11Forwarding
+syn keyword sshdconfigKeyword X11MaxDisplays
+syn keyword sshdconfigKeyword X11UseLocalhost
+syn keyword sshdconfigKeyword XAuthLocation
+
+
+" Define the default highlighting
+
+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"
+
+" vim:set ts=8 sw=2 sts=2:
diff --git a/runtime/syntax/st.vim b/runtime/syntax/st.vim
new file mode 100644
index 0000000..ffa7820
--- /dev/null
+++ b/runtime/syntax/st.vim
@@ -0,0 +1,95 @@
+" Vim syntax file
+" Language: Smalltalk
+" Maintainer: Arndt Hesse <hesse@self.de>
+" Last Change: 2012 Feb 12 by Thilo Six
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" some Smalltalk keywords and standard methods
+syn keyword stKeyword super self class true false new not
+syn keyword stKeyword notNil isNil inspect out nil
+syn match stMethod "\<do\>:"
+syn match stMethod "\<whileTrue\>:"
+syn match stMethod "\<whileFalse\>:"
+syn match stMethod "\<ifTrue\>:"
+syn match stMethod "\<ifFalse\>:"
+syn match stMethod "\<put\>:"
+syn match stMethod "\<to\>:"
+syn match stMethod "\<at\>:"
+syn match stMethod "\<add\>:"
+syn match stMethod "\<new\>:"
+syn match stMethod "\<for\>:"
+syn match stMethod "\<methods\>:"
+syn match stMethod "\<methodsFor\>:"
+syn match stMethod "\<instanceVariableNames\>:"
+syn match stMethod "\<classVariableNames\>:"
+syn match stMethod "\<poolDictionaries\>:"
+syn match stMethod "\<subclass\>:"
+
+" the block of local variables of a method
+syn region stLocalVariables start="^[ \t]*|" end="|"
+
+" the Smalltalk comment
+syn region stComment start="\"" end="\""
+
+" the Smalltalk strings and single characters
+syn region stString start='\'' skip="''" end='\''
+syn match stCharacter "$."
+
+syn case ignore
+
+" the symbols prefixed by a '#'
+syn match stSymbol "\(#\<[a-z_][a-z0-9_]*\>\)"
+syn match stSymbol "\(#'[^']*'\)"
+
+" the variables in a statement block for loops
+syn match stBlockVariable "\(:[ \t]*\<[a-z_][a-z0-9_]*\>[ \t]*\)\+|" contained
+
+" some representations of numbers
+syn match stNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+syn match stFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+syn match stFloat "\<\d\+e[-+]\=\d\+[fl]\=\>"
+
+syn case match
+
+" a try to highlight paren mismatches
+syn region stParen transparent start='(' end=')' contains=ALLBUT,stParenError
+syn match stParenError ")"
+syn region stBlock transparent start='\[' end='\]' contains=ALLBUT,stBlockError
+syn match stBlockError "\]"
+syn region stSet transparent start='{' end='}' contains=ALLBUT,stSetError
+syn match stSetError "}"
+
+hi link stParenError stError
+hi link stSetError stError
+hi link stBlockError stError
+
+" synchronization for syntax analysis
+syn sync minlines=50
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/stata.vim b/runtime/syntax/stata.vim
new file mode 100644
index 0000000..29f5052
--- /dev/null
+++ b/runtime/syntax/stata.vim
@@ -0,0 +1,450 @@
+" stata.vim -- Vim syntax file for Stata do, ado, and class files.
+" Language: Stata and/or Mata
+" Maintainer: Jeff Pitblado <jpitblado@stata.com>
+" Last Change: 26apr2006
+" Version: 1.1.4
+
+" Log:
+" 14apr2006 renamed syntax groups st* to stata*
+" 'syntax clear' only under version control
+" check for 'b:current_syntax', removed 'did_stata_syntax_inits'
+" 17apr2006 fixed start expression for stataFunc
+" 26apr2006 fixed brace confusion in stataErrInParen and stataErrInBracket
+" fixed paren/bracket confusion in stataFuncGroup
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case match
+
+" comments - single line
+" note that the triple slash continuing line comment comes free
+syn region stataStarComment start=/^\s*\*/ end=/$/ contains=stataComment oneline
+syn region stataSlashComment start="\s//" end=/$/ contains=stataComment oneline
+syn region stataSlashComment start="^//" end=/$/ contains=stataComment oneline
+" comments - multiple line
+syn region stataComment start="/\*" end="\*/" contains=stataComment
+
+" global macros - simple case
+syn match stataGlobal /\$\a\w*/
+" global macros - general case
+syn region stataGlobal start=/\${/ end=/}/ oneline contains=@stataMacroGroup
+" local macros - general case
+syn region stataLocal start=/`/ end=/'/ oneline contains=@stataMacroGroup
+
+" numeric formats
+syn match stataFormat /%-\=\d\+\.\d\+[efg]c\=/
+" numeric hex format
+syn match stataFormat /%-\=21x/
+" string format
+syn match stataFormat /%\(\|-\|\~\)\d\+s/
+
+" Statements
+syn keyword stataConditional else if
+syn keyword stataRepeat foreach
+syn keyword stataRepeat forv[alues]
+syn keyword stataRepeat while
+
+" Common programming commands
+syn keyword stataCommand about
+syn keyword stataCommand adopath
+syn keyword stataCommand adoupdate
+syn keyword stataCommand assert
+syn keyword stataCommand break
+syn keyword stataCommand by
+syn keyword stataCommand cap[ture]
+syn keyword stataCommand cd
+syn keyword stataCommand chdir
+syn keyword stataCommand checksum
+syn keyword stataCommand class
+syn keyword stataCommand classutil
+syn keyword stataCommand compress
+syn keyword stataCommand conf[irm]
+syn keyword stataCommand conren
+syn keyword stataCommand continue
+syn keyword stataCommand cou[nt]
+syn keyword stataCommand cscript
+syn keyword stataCommand cscript_log
+syn keyword stataCommand #delimit
+syn keyword stataCommand d[escribe]
+syn keyword stataCommand dir
+syn keyword stataCommand discard
+syn keyword stataCommand di[splay]
+syn keyword stataCommand do
+syn keyword stataCommand doedit
+syn keyword stataCommand drop
+syn keyword stataCommand edit
+syn keyword stataCommand end
+syn keyword stataCommand erase
+syn keyword stataCommand eret[urn]
+syn keyword stataCommand err[or]
+syn keyword stataCommand e[xit]
+syn keyword stataCommand expand
+syn keyword stataCommand expandcl
+syn keyword stataCommand file
+syn keyword stataCommand findfile
+syn keyword stataCommand format
+syn keyword stataCommand g[enerate]
+syn keyword stataCommand gettoken
+syn keyword stataCommand gl[obal]
+syn keyword stataCommand help
+syn keyword stataCommand hexdump
+syn keyword stataCommand include
+syn keyword stataCommand infile
+syn keyword stataCommand infix
+syn keyword stataCommand input
+syn keyword stataCommand insheet
+syn keyword stataCommand joinby
+syn keyword stataCommand la[bel]
+syn keyword stataCommand levelsof
+syn keyword stataCommand list
+syn keyword stataCommand loc[al]
+syn keyword stataCommand log
+syn keyword stataCommand ma[cro]
+syn keyword stataCommand mark
+syn keyword stataCommand markout
+syn keyword stataCommand marksample
+syn keyword stataCommand mata
+syn keyword stataCommand matrix
+syn keyword stataCommand memory
+syn keyword stataCommand merge
+syn keyword stataCommand mkdir
+syn keyword stataCommand more
+syn keyword stataCommand net
+syn keyword stataCommand nobreak
+syn keyword stataCommand n[oisily]
+syn keyword stataCommand note[s]
+syn keyword stataCommand numlist
+syn keyword stataCommand outfile
+syn keyword stataCommand outsheet
+syn keyword stataCommand _parse
+syn keyword stataCommand pause
+syn keyword stataCommand plugin
+syn keyword stataCommand post
+syn keyword stataCommand postclose
+syn keyword stataCommand postfile
+syn keyword stataCommand preserve
+syn keyword stataCommand print
+syn keyword stataCommand printer
+syn keyword stataCommand profiler
+syn keyword stataCommand pr[ogram]
+syn keyword stataCommand q[uery]
+syn keyword stataCommand qui[etly]
+syn keyword stataCommand rcof
+syn keyword stataCommand reg[ress]
+syn keyword stataCommand rename
+syn keyword stataCommand repeat
+syn keyword stataCommand replace
+syn keyword stataCommand reshape
+syn keyword stataCommand ret[urn]
+syn keyword stataCommand _rmcoll
+syn keyword stataCommand _rmcoll
+syn keyword stataCommand _rmcollright
+syn keyword stataCommand rmdir
+syn keyword stataCommand _robust
+syn keyword stataCommand save
+syn keyword stataCommand sca[lar]
+syn keyword stataCommand search
+syn keyword stataCommand serset
+syn keyword stataCommand set
+syn keyword stataCommand shell
+syn keyword stataCommand sleep
+syn keyword stataCommand sort
+syn keyword stataCommand split
+syn keyword stataCommand sret[urn]
+syn keyword stataCommand ssc
+syn keyword stataCommand su[mmarize]
+syn keyword stataCommand syntax
+syn keyword stataCommand sysdescribe
+syn keyword stataCommand sysdir
+syn keyword stataCommand sysuse
+syn keyword stataCommand token[ize]
+syn keyword stataCommand translate
+syn keyword stataCommand type
+syn keyword stataCommand unab
+syn keyword stataCommand unabcmd
+syn keyword stataCommand update
+syn keyword stataCommand use
+syn keyword stataCommand vers[ion]
+syn keyword stataCommand view
+syn keyword stataCommand viewsource
+syn keyword stataCommand webdescribe
+syn keyword stataCommand webseek
+syn keyword stataCommand webuse
+syn keyword stataCommand which
+syn keyword stataCommand who
+syn keyword stataCommand window
+
+" Literals
+syn match stataQuote /"/
+syn region stataEString matchgroup=Nothing start=/`"/ end=/"'/ oneline contains=@stataMacroGroup,stataQuote,stataString,stataEString
+syn region stataString matchgroup=Nothing start=/"/ end=/"/ oneline contains=@stataMacroGroup
+
+" define clusters
+syn cluster stataFuncGroup contains=@stataMacroGroup,stataFunc,stataString,stataEstring,stataParen,stataBracket
+syn cluster stataMacroGroup contains=stataGlobal,stataLocal
+syn cluster stataParenGroup contains=stataParenError,stataBracketError,stataBraceError,stataSpecial,stataFormat
+
+" Stata functions
+" Math
+syn region stataFunc matchgroup=Function start=/\<abs(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<acos(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<asin(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<atan(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<atan2(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<atanh(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<ceil(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<cloglog(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<comb(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<cos(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<digamma(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<exp(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<floor(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<int(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invcloglog(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invlogit(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<ln(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<lnfact(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<lnfactorial(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<lngamma(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<log(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<log10(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<logit(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<max(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<mod(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<reldif(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<round(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<sign(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<sin(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<sqrt(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<sum(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<tan(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<tanh(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<trigamma(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<trunc(/ end=/)/ contains=@stataFuncGroup
+" Probability distriubtions and density functions
+syn region stataFunc matchgroup=Function start=/\<betaden(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<Binomial(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<binorm(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<binormal(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<chi2(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<chi2tail(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dgammapda(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dgammapdada(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dgammapdadx(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dgammapdx(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dgammapdxdx(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<F(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<Fden(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<Ftail(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<gammaden(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<gammap(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<ibeta(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invbinomial(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invchi2(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invchi2tail(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invF(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invFtail(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invgammap(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invibeta(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invnchi2(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invFtail(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invibeta(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invnorm(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invnormal(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invttail(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<lnnormal(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<lnnormalden(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<nbetaden(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<nchi2(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<nFden(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<nFtail(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<nibeta(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<norm(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<normal(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<normalden(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<normden(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<npnchi2(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<tden(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<ttail(/ end=/)/ contains=@stataFuncGroup
+" Random numbers
+syn region stataFunc matchgroup=Function start=/\<uniform(/ end=/)/ contains=@stataFuncGroup
+" String
+syn region stataFunc matchgroup=Function start=/\<abbrev(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<hchar(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<indexnot(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<itrim(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<length(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<lower(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<ltrim(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<plural(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<proper(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<real(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<regexm(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<regexr(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<regexs(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<reverse(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<rtrim(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<string(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<strlen(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<strmatch(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<strpos(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<subinstr(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<subinword(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<substr(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<trim(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<upper(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<word(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<wordcount(/ end=/)/ contains=@stataFuncGroup
+" Programming
+syn region stataFunc matchgroup=Function start=/\<autocode(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<byteorder(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<c(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<_caller(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<chop(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<clip(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<cond(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<e(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<epsdouble(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<epsfloat(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<float(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<has_eprop(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<has_eprop(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<inlist(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<inrange(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<irecode(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<matrix(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<maxbyte(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<maxdouble(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<maxfloat(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<maxint(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<maxlong(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<mi(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<minbyte(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<mindouble(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<minfloat(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<minint(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<minlong(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<missing(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<r(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<recode(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<replay(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<return(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<s(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<scalar(/ end=/)/ contains=@stataFuncGroup
+" Date
+syn region stataFunc matchgroup=Function start=/\<d(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<date(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<day(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dow(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<doy(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<halfyear(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<mdy(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<month(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<quarter(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<week(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<year(/ end=/)/ contains=@stataFuncGroup
+" Time-series
+syn region stataFunc matchgroup=Function start=/\<daily(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<halfyearly(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<monthly(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<quarterly(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<weekly(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<yearly(/ end=/)/ contains=@stataFuncGroup
+"
+syn region stataFunc matchgroup=Function start=/\<yh(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<ym(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<yq(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<yw(/ end=/)/ contains=@stataFuncGroup
+"
+syn region stataFunc matchgroup=Function start=/\<d(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<h(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<m(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<q(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<w(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<y(/ end=/)/ contains=@stataFuncGroup
+"
+syn region stataFunc matchgroup=Function start=/\<dofd(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dofh(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dofm(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dofq(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dofw(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<dofy(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<hofd(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<mofd(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<qofd(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<wofd(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<yofd(/ end=/)/ contains=@stataFuncGroup
+"
+syn region stataFunc matchgroup=Function start=/\<tin(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<twithin(/ end=/)/ contains=@stataFuncGroup
+" Matrix
+syn region stataFunc matchgroup=Function start=/\<colnumb(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<colsof(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<det(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<diag0cnt(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<el(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<issymmetric(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<matmissing(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<mreldif(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<rownumb(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<rowsof(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<trace(/ end=/)/ contains=@stataFuncGroup
+"
+syn region stataFunc matchgroup=Function start=/\<cholsky(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<corr(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<diag(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<get(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<hadamard(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<I(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<inv(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<invsym(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<J(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<matuniform(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<nullmat(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<sweep(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<vec(/ end=/)/ contains=@stataFuncGroup
+syn region stataFunc matchgroup=Function start=/\<vecdiag(/ end=/)/ contains=@stataFuncGroup
+
+" Errors to catch
+" taken from $VIMRUNTIME/syntax/c.vim
+" catch errors caused by wrong parenthesis, braces and brackets
+syn region stataParen transparent start=/(/ end=/)/ contains=ALLBUT,@stataParenGroup,stataErrInBracket,stataErrInBrace
+syn region stataBracket transparent start=/\[/ end=/]/ contains=ALLBUT,@stataParenGroup,stataErrInParen,stataErrInBrace
+syn region stataBrace transparent start=/{/ end=/}/ contains=ALLBUT,@stataParenGroup,stataErrInParen,stataErrInBracket
+syn match stataParenError /[\])}]/
+syn match stataBracketError /]/
+syn match stataBraceError /}/
+syn match stataErrInParen contained /[\]}]/
+syn match stataErrInBracket contained /[)}]/
+syn match stataErrInBrace contained /[)\]]/
+
+" assign highlight groups
+hi def link stataBraceError stataError
+hi def link stataBracketError stataError
+hi def link stataErrInBrace stataError
+hi def link stataErrInBracket stataError
+hi def link stataErrInParen stataError
+hi def link stataEString stataString
+hi def link stataFormat stataSpecial
+hi def link stataGlobal stataMacro
+hi def link stataLocal stataMacro
+hi def link stataParenError stataError
+hi def link stataSlashComment stataComment
+hi def link stataStarComment stataComment
+
+hi def link stataCommand Define
+hi def link stataComment Comment
+hi def link stataConditional Conditional
+hi def link stataError Error
+hi def link stataFunc None
+hi def link stataMacro Define
+hi def link stataRepeat Repeat
+hi def link stataSpecial SpecialChar
+hi def link stataString String
+
+let b:current_syntax = "stata"
+
+" vim: ts=8
diff --git a/runtime/syntax/stp.vim b/runtime/syntax/stp.vim
new file mode 100644
index 0000000..2992d8b
--- /dev/null
+++ b/runtime/syntax/stp.vim
@@ -0,0 +1,154 @@
+" Vim syntax file
+" Language: Stored Procedures (STP)
+" Maintainer: Jeff Lanzarotta (jefflanzarotta@yahoo.com)
+" URL: http://lanzarotta.tripod.com/vim/syntax/stp.vim.zip
+" Last Change: March 05, 2002
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Specials.
+syn keyword stpSpecial null
+
+" Keywords.
+syn keyword stpKeyword begin break call case create deallocate dynamic
+syn keyword stpKeyword execute from function go grant
+syn keyword stpKeyword index insert into leave max min on output procedure
+syn keyword stpKeyword public result return returns scroll table to
+syn keyword stpKeyword when
+syn match stpKeyword "\<end\>"
+
+" Conditional.
+syn keyword stpConditional if else elseif then
+syn match stpConditional "\<end\s\+if\>"
+
+" Repeats.
+syn keyword stpRepeat for while loop
+syn match stpRepeat "\<end\s\+loop\>"
+
+" Operators.
+syn keyword stpOperator asc not and or desc group having in is any some all
+syn keyword stpOperator between exists like escape with union intersect minus
+syn keyword stpOperator out prior distinct sysdate
+
+" Statements.
+syn keyword stpStatement alter analyze as audit avg by close clustered comment
+syn keyword stpStatement commit continue count create cursor declare delete
+syn keyword stpStatement drop exec execute explain fetch from index insert
+syn keyword stpStatement into lock max min next noaudit nonclustered open
+syn keyword stpStatement order output print raiserror recompile rename revoke
+syn keyword stpStatement rollback savepoint select set sum transaction
+syn keyword stpStatement truncate unique update values where
+
+" Functions.
+syn keyword stpFunction abs acos ascii asin atan atn2 avg ceiling charindex
+syn keyword stpFunction charlength convert col_name col_length cos cot count
+syn keyword stpFunction curunreservedpgs datapgs datalength dateadd datediff
+syn keyword stpFunction datename datepart db_id db_name degree difference
+syn keyword stpFunction exp floor getdate hextoint host_id host_name index_col
+syn keyword stpFunction inttohex isnull lct_admin log log10 lower ltrim max
+syn keyword stpFunction min now object_id object_name patindex pi pos power
+syn keyword stpFunction proc_role radians rand replace replicate reserved_pgs
+syn keyword stpFunction reverse right rtrim rowcnt round show_role sign sin
+syn keyword stpFunction soundex space sqrt str stuff substr substring sum
+syn keyword stpFunction suser_id suser_name tan tsequal upper used_pgs user
+syn keyword stpFunction user_id user_name valid_name valid_user message
+
+" Types.
+syn keyword stpType binary bit char datetime decimal double float image
+syn keyword stpType int integer long money nchar numeric precision real
+syn keyword stpType smalldatetime smallint smallmoney text time tinyint
+syn keyword stpType timestamp varbinary varchar
+
+" Globals.
+syn match stpGlobals '@@char_convert'
+syn match stpGlobals '@@cient_csname'
+syn match stpGlobals '@@client_csid'
+syn match stpGlobals '@@connections'
+syn match stpGlobals '@@cpu_busy'
+syn match stpGlobals '@@error'
+syn match stpGlobals '@@identity'
+syn match stpGlobals '@@idle'
+syn match stpGlobals '@@io_busy'
+syn match stpGlobals '@@isolation'
+syn match stpGlobals '@@langid'
+syn match stpGlobals '@@language'
+syn match stpGlobals '@@max_connections'
+syn match stpGlobals '@@maxcharlen'
+syn match stpGlobals '@@ncharsize'
+syn match stpGlobals '@@nestlevel'
+syn match stpGlobals '@@pack_received'
+syn match stpGlobals '@@pack_sent'
+syn match stpGlobals '@@packet_errors'
+syn match stpGlobals '@@procid'
+syn match stpGlobals '@@rowcount'
+syn match stpGlobals '@@servername'
+syn match stpGlobals '@@spid'
+syn match stpGlobals '@@sqlstatus'
+syn match stpGlobals '@@testts'
+syn match stpGlobals '@@textcolid'
+syn match stpGlobals '@@textdbid'
+syn match stpGlobals '@@textobjid'
+syn match stpGlobals '@@textptr'
+syn match stpGlobals '@@textsize'
+syn match stpGlobals '@@thresh_hysteresis'
+syn match stpGlobals '@@timeticks'
+syn match stpGlobals '@@total_error'
+syn match stpGlobals '@@total_read'
+syn match stpGlobals '@@total_write'
+syn match stpGlobals '@@tranchained'
+syn match stpGlobals '@@trancount'
+syn match stpGlobals '@@transtate'
+syn match stpGlobals '@@version'
+
+" Todos.
+syn keyword stpTodo TODO FIXME XXX DEBUG NOTE
+
+" Strings and characters.
+syn match stpStringError "'.*$"
+syn match stpString "'\([^']\|''\)*'"
+
+" Numbers.
+syn match stpNumber "-\=\<\d*\.\=[0-9_]\>"
+
+" Comments.
+syn region stpComment start="/\*" end="\*/" contains=stpTodo
+syn match stpComment "--.*" contains=stpTodo
+syn sync ccomment stpComment
+
+" Parens.
+syn region stpParen transparent start='(' end=')' contains=ALLBUT,stpParenError
+syn match stpParenError ")"
+
+" Syntax Synchronizing.
+syn sync minlines=10 maxlines=100
+
+" Define the default highlighting.
+" 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"
+
+" vim ts=8 sw=2
diff --git a/runtime/syntax/strace.vim b/runtime/syntax/strace.vim
new file mode 100644
index 0000000..20516a1
--- /dev/null
+++ b/runtime/syntax/strace.vim
@@ -0,0 +1,52 @@
+" Vim syntax file
+" Language: strace output
+" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2022 Jan 29
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" Parse the line
+syn match straceSpecialChar "\\\o\{1,3}\|\\." contained
+syn region straceString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=straceSpecialChar oneline
+syn match straceNumber "\W[+-]\=\(\d\+\)\=\.\=\d\+\([eE][+-]\=\d\+\)\="lc=1
+syn match straceNumber "\W0x\x\+"lc=1
+syn match straceNumberRHS "\W\(0x\x\+\|-\=\d\+\)"lc=1 contained
+syn match straceOtherRHS "?" contained
+syn match straceConstant "[A-Z_]\{2,}"
+syn region straceVerbosed start="(" end=")" matchgroup=Normal contained oneline
+syn region straceReturned start="\s=\s" end="$" contains=StraceEquals,straceNumberRHS,straceOtherRHS,straceConstant,straceVerbosed oneline transparent
+syn match straceEquals "\s=\s"ms=s+1,me=e-1
+syn match straceParenthesis "[][(){}]"
+syn match straceSysCall "^\w\+"
+syn match straceOtherPID "^\[[^]]*\]" contains=stracePID,straceNumber nextgroup=straceSysCallEmbed skipwhite
+syn match straceSysCallEmbed "\w\+" contained
+syn keyword stracePID pid contained
+syn match straceOperator "[-+=*/!%&|:,]"
+syn region straceComment start="/\*" end="\*/" oneline
+
+" Define the default highlighting
+
+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
+
+
+let b:current_syntax = "strace"
diff --git a/runtime/syntax/structurizr.vim b/runtime/syntax/structurizr.vim
new file mode 100644
index 0000000..ab9e4ee
--- /dev/null
+++ b/runtime/syntax/structurizr.vim
@@ -0,0 +1,81 @@
+" Vim syntax file
+" Language: Structurizr DSL
+" Maintainer: Bastian Venthur <venthur@debian.org>
+" Last Change: 2022-02-15
+" Remark: For a language reference, see
+" https://github.com/structurizr/dsl
+
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" comments
+syn match scomment "#.*$"
+syn match scomment "//.*$"
+syn region scomment start="/\*" end="\*/"
+
+" keywords
+syn keyword skeyword animation
+syn keyword skeyword autoLayout
+syn keyword skeyword branding
+syn keyword skeyword component
+syn keyword skeyword configuration
+syn keyword skeyword container
+syn keyword skeyword containerinstance
+syn keyword skeyword custom
+syn keyword skeyword deployment
+syn keyword skeyword deploymentenvironment
+syn keyword skeyword deploymentgroup
+syn keyword skeyword deploymentnode
+syn keyword skeyword description
+syn keyword skeyword dynamic
+syn keyword skeyword element
+syn keyword skeyword enterprise
+syn keyword skeyword exclude
+syn keyword skeyword filtered
+syn keyword skeyword group
+syn keyword skeyword healthcheck
+syn keyword skeyword include
+syn keyword skeyword infrastructurenode
+syn keyword skeyword model
+syn keyword skeyword person
+syn keyword skeyword perspectives
+syn keyword skeyword properties
+syn keyword skeyword relationship
+syn keyword skeyword softwaresystem
+syn keyword skeyword softwaresysteminstance
+syn keyword skeyword styles
+syn keyword skeyword systemcontext
+syn keyword skeyword systemlandscape
+syn keyword skeyword tags
+syn keyword skeyword technology
+syn keyword skeyword terminology
+syn keyword skeyword theme
+syn keyword skeyword title
+syn keyword skeyword url
+syn keyword skeyword users
+syn keyword skeyword views
+syn keyword skeyword workspace
+
+syn match skeyword "\!adrs\s\+"
+syn match skeyword "\!constant\s\+"
+syn match skeyword "\!docs\s\+"
+syn match skeyword "\!identifiers\s\+"
+syn match skeyword "\!impliedrelationships\s\+"
+syn match skeyword "\!include\s\+"
+syn match skeyword "\!plugin\s\+"
+syn match skeyword "\!ref\s\+"
+syn match skeyword "\!script\s\+"
+
+syn region sstring oneline start='"' end='"'
+
+syn region sblock start='{' end='}' fold transparent
+
+hi def link sstring string
+hi def link scomment comment
+hi def link skeyword keyword
+
+let b:current_syntax = "structurizr"
diff --git a/runtime/syntax/sudoers.vim b/runtime/syntax/sudoers.vim
new file mode 100644
index 0000000..bf2d337
--- /dev/null
+++ b/runtime/syntax/sudoers.vim
@@ -0,0 +1,390 @@
+" Vim syntax file
+" Language: sudoers(5) configuration files
+" Maintainer: Eisuke Kawashima ( e.kawaschima+vim AT gmail.com )
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2021 Mar 15
+" Recent Changes: Support for #include and #includedir.
+" Added many new options (Samuel D. Leslie)
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" TODO: instead of 'skipnl', we would like to match a specific group that would
+" match \\$ and then continue with the nextgroup, actually, the skipnl doesn't
+" work...
+" TODO: treat 'ALL' like a special (yay, a bundle of new rules!!!)
+
+syn match sudoersUserSpec '^' nextgroup=@sudoersUserInSpec skipwhite
+
+syn match sudoersSpecEquals contained '=' nextgroup=@sudoersCmndSpecList skipwhite
+
+syn cluster sudoersCmndSpecList contains=sudoersUserRunasBegin,sudoersPASSWD,@sudoersCmndInSpec
+
+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
+syn keyword sudoersAlias Cmnd_Alias nextgroup=sudoersCmndAlias skipwhite skipnl
+
+syn match sudoersUserAlias contained '\<\u[A-Z0-9_]*\>' nextgroup=sudoersUserAliasEquals skipwhite skipnl
+syn match sudoersUserNameInList contained '\<\l\+\>' nextgroup=@sudoersUserList skipwhite skipnl
+syn match sudoersUIDInList contained '#\d\+\>' nextgroup=@sudoersUserList skipwhite skipnl
+syn match sudoersGroupInList contained '%\l\+\>' nextgroup=@sudoersUserList skipwhite skipnl
+syn match sudoersUserNetgroupInList contained '+\l\+\>' nextgroup=@sudoersUserList skipwhite skipnl
+syn match sudoersUserAliasInList contained '\<\u[A-Z0-9_]*\>' nextgroup=@sudoersUserList skipwhite skipnl
+
+syn match sudoersUserName contained '\<\l\+\>' nextgroup=@sudoersParameter skipwhite skipnl
+syn match sudoersUID contained '#\d\+\>' nextgroup=@sudoersParameter skipwhite skipnl
+syn match sudoersGroup contained '%\l\+\>' nextgroup=@sudoersParameter skipwhite skipnl
+syn match sudoersUserNetgroup contained '+\l\+\>' nextgroup=@sudoersParameter skipwhite skipnl
+syn match sudoersUserAliasRef contained '\<\u[A-Z0-9_]*\>' nextgroup=@sudoersParameter skipwhite skipnl
+
+syn match sudoersUserNameInSpec contained '\<\l\+\>' nextgroup=@sudoersUserSpec skipwhite skipnl
+syn match sudoersUIDInSpec contained '#\d\+\>' nextgroup=@sudoersUserSpec skipwhite skipnl
+syn match sudoersGroupInSpec contained '%\l\+\>' nextgroup=@sudoersUserSpec skipwhite skipnl
+syn match sudoersUserNetgroupInSpec contained '+\l\+\>' nextgroup=@sudoersUserSpec skipwhite skipnl
+syn match sudoersUserAliasInSpec contained '\<\u[A-Z0-9_]*\>' nextgroup=@sudoersUserSpec skipwhite skipnl
+
+syn match sudoersUserNameInRunas contained '\<\l\+\>' nextgroup=@sudoersUserRunas skipwhite skipnl
+syn match sudoersUIDInRunas contained '#\d\+\>' nextgroup=@sudoersUserRunas skipwhite skipnl
+syn match sudoersGroupInRunas contained '%\l\+\>' nextgroup=@sudoersUserRunas skipwhite skipnl
+syn match sudoersUserNetgroupInRunas contained '+\l\+\>' nextgroup=@sudoersUserRunas skipwhite skipnl
+syn match sudoersUserAliasInRunas contained '\<\u[A-Z0-9_]*\>' nextgroup=@sudoersUserRunas skipwhite skipnl
+
+syn match sudoersHostAlias contained '\<\u[A-Z0-9_]*\>' nextgroup=sudoersHostAliasEquals skipwhite skipnl
+syn match sudoersHostNameInList contained '\<\l\+\>' nextgroup=@sudoersHostList skipwhite skipnl
+syn match sudoersIPAddrInList contained '\%(\d\{1,3}\.\)\{3}\d\{1,3}' nextgroup=@sudoersHostList skipwhite skipnl
+syn match sudoersNetworkInList contained '\%(\d\{1,3}\.\)\{3}\d\{1,3}\%(/\%(\%(\d\{1,3}\.\)\{3}\d\{1,3}\|\d\+\)\)\=' nextgroup=@sudoersHostList skipwhite skipnl
+syn match sudoersHostNetgroupInList contained '+\l\+\>' nextgroup=@sudoersHostList skipwhite skipnl
+syn match sudoersHostAliasInList contained '\<\u[A-Z0-9_]*\>' nextgroup=@sudoersHostList skipwhite skipnl
+
+syn match sudoersHostName contained '\<\l\+\>' nextgroup=@sudoersParameter skipwhite skipnl
+syn match sudoersIPAddr contained '\%(\d\{1,3}\.\)\{3}\d\{1,3}' nextgroup=@sudoersParameter skipwhite skipnl
+syn match sudoersNetwork contained '\%(\d\{1,3}\.\)\{3}\d\{1,3}\%(/\%(\%(\d\{1,3}\.\)\{3}\d\{1,3}\|\d\+\)\)\=' nextgroup=@sudoersParameter skipwhite skipnl
+syn match sudoersHostNetgroup contained '+\l\+\>' nextgroup=@sudoersParameter skipwhite skipnl
+syn match sudoersHostAliasRef contained '\<\u[A-Z0-9_]*\>' nextgroup=@sudoersParameter skipwhite skipnl
+
+syn match sudoersHostNameInSpec contained '\<\l\+\>' nextgroup=@sudoersHostSpec skipwhite skipnl
+syn match sudoersIPAddrInSpec contained '\%(\d\{1,3}\.\)\{3}\d\{1,3}' nextgroup=@sudoersHostSpec skipwhite skipnl
+syn match sudoersNetworkInSpec contained '\%(\d\{1,3}\.\)\{3}\d\{1,3}\%(/\%(\%(\d\{1,3}\.\)\{3}\d\{1,3}\|\d\+\)\)\=' nextgroup=@sudoersHostSpec skipwhite skipnl
+syn match sudoersHostNetgroupInSpec contained '+\l\+\>' nextgroup=@sudoersHostSpec skipwhite skipnl
+syn match sudoersHostAliasInSpec contained '\<\u[A-Z0-9_]*\>' nextgroup=@sudoersHostSpec skipwhite skipnl
+
+syn match sudoersCmndAlias contained '\<\u[A-Z0-9_]*\>' nextgroup=sudoersCmndAliasEquals skipwhite skipnl
+syn match sudoersCmndNameInList contained '[^[:space:],:=\\]\+\%(\\[[:space:],:=\\][^[:space:],:=\\]*\)*' nextgroup=@sudoersCmndList,sudoersCommandEmpty,sudoersCommandArgs skipwhite
+syn match sudoersCmndAliasInList contained '\<\u[A-Z0-9_]*\>' nextgroup=@sudoersCmndList skipwhite skipnl
+
+syn match sudoersCmndNameInSpec contained '[^[:space:],:=\\]\+\%(\\[[:space:],:=\\][^[:space:],:=\\]*\)*' nextgroup=@sudoersCmndSpec,sudoersCommandEmptyInSpec,sudoersCommandArgsInSpec skipwhite
+syn match sudoersCmndAliasInSpec contained '\<\u[A-Z0-9_]*\>' nextgroup=@sudoersCmndSpec skipwhite skipnl
+
+syn match sudoersUserAliasEquals contained '=' nextgroup=@sudoersUserInList skipwhite skipnl
+syn match sudoersUserListComma contained ',' nextgroup=@sudoersUserInList skipwhite skipnl
+syn match sudoersUserListColon contained ':' nextgroup=sudoersUserAlias skipwhite skipnl
+syn cluster sudoersUserList contains=sudoersUserListComma,sudoersUserListColon
+
+syn match sudoersUserSpecComma contained ',' nextgroup=@sudoersUserInSpec skipwhite skipnl
+syn cluster sudoersUserSpec contains=sudoersUserSpecComma,@sudoersHostInSpec
+
+syn match sudoersUserRunasBegin contained '(' nextgroup=@sudoersUserInRunas skipwhite skipnl
+syn match sudoersUserRunasComma contained ',' nextgroup=@sudoersUserInRunas skipwhite skipnl
+syn match sudoersUserRunasEnd contained ')' nextgroup=sudoersPASSWD,@sudoersCmndInSpec skipwhite skipnl
+syn cluster sudoersUserRunas contains=sudoersUserRunasComma,@sudoersUserInRunas,sudoersUserRunasEnd
+
+
+syn match sudoersHostAliasEquals contained '=' nextgroup=@sudoersHostInList skipwhite skipnl
+syn match sudoersHostListComma contained ',' nextgroup=@sudoersHostInList skipwhite skipnl
+syn match sudoersHostListColon contained ':' nextgroup=sudoersHostAlias skipwhite skipnl
+syn cluster sudoersHostList contains=sudoersHostListComma,sudoersHostListColon
+
+syn match sudoersHostSpecComma contained ',' nextgroup=@sudoersHostInSpec skipwhite skipnl
+syn cluster sudoersHostSpec contains=sudoersHostSpecComma,sudoersSpecEquals
+
+
+syn match sudoersCmndAliasEquals contained '=' nextgroup=@sudoersCmndInList skipwhite skipnl
+syn match sudoersCmndListComma contained ',' nextgroup=@sudoersCmndInList skipwhite skipnl
+syn match sudoersCmndListColon contained ':' nextgroup=sudoersCmndAlias skipwhite skipnl
+syn cluster sudoersCmndList contains=sudoersCmndListComma,sudoersCmndListColon
+
+syn match sudoersCmndSpecComma contained ',' nextgroup=@sudoersCmndSpecList skipwhite skipnl
+syn match sudoersCmndSpecColon contained ':' nextgroup=@sudoersUserInSpec skipwhite skipnl
+syn cluster sudoersCmndSpec contains=sudoersCmndSpecComma,sudoersCmndSpecColon
+
+syn cluster sudoersUserInList contains=sudoersUserNegationInList,sudoersUserNameInList,sudoersUIDInList,sudoersGroupInList,sudoersUserNetgroupInList,sudoersUserAliasInList
+syn cluster sudoersHostInList contains=sudoersHostNegationInList,sudoersHostNameInList,sudoersIPAddrInList,sudoersNetworkInList,sudoersHostNetgroupInList,sudoersHostAliasInList
+syn cluster sudoersCmndInList contains=sudoersCmndNegationInList,sudoersCmndNameInList,sudoersCmndAliasInList
+
+syn cluster sudoersUser contains=sudoersUserNegation,sudoersUserName,sudoersUID,sudoersGroup,sudoersUserNetgroup,sudoersUserAliasRef
+syn cluster sudoersHost contains=sudoersHostNegation,sudoersHostName,sudoersIPAddr,sudoersNetwork,sudoersHostNetgroup,sudoersHostAliasRef
+
+syn cluster sudoersUserInSpec contains=sudoersUserNegationInSpec,sudoersUserNameInSpec,sudoersUIDInSpec,sudoersGroupInSpec,sudoersUserNetgroupInSpec,sudoersUserAliasInSpec
+syn cluster sudoersHostInSpec contains=sudoersHostNegationInSpec,sudoersHostNameInSpec,sudoersIPAddrInSpec,sudoersNetworkInSpec,sudoersHostNetgroupInSpec,sudoersHostAliasInSpec
+syn cluster sudoersUserInRunas contains=sudoersUserNegationInRunas,sudoersUserNameInRunas,sudoersUIDInRunas,sudoersGroupInRunas,sudoersUserNetgroupInRunas,sudoersUserAliasInRunas
+syn cluster sudoersCmndInSpec contains=sudoersCmndNegationInSpec,sudoersCmndNameInSpec,sudoersCmndAliasInSpec
+
+syn match sudoersUserNegationInList contained '!\+' nextgroup=@sudoersUserInList skipwhite skipnl
+syn match sudoersHostNegationInList contained '!\+' nextgroup=@sudoersHostInList skipwhite skipnl
+syn match sudoersCmndNegationInList contained '!\+' nextgroup=@sudoersCmndInList skipwhite skipnl
+
+syn match sudoersUserNegation contained '!\+' nextgroup=@sudoersUser skipwhite skipnl
+syn match sudoersHostNegation contained '!\+' nextgroup=@sudoersHost skipwhite skipnl
+
+syn match sudoersUserNegationInSpec contained '!\+' nextgroup=@sudoersUserInSpec skipwhite skipnl
+syn match sudoersHostNegationInSpec contained '!\+' nextgroup=@sudoersHostInSpec skipwhite skipnl
+syn match sudoersUserNegationInRunas contained '!\+' nextgroup=@sudoersUserInRunas skipwhite skipnl
+syn match sudoersCmndNegationInSpec contained '!\+' nextgroup=@sudoersCmndInSpec skipwhite skipnl
+
+syn match sudoersCommandArgs contained '[^[:space:],:=\\]\+\%(\\[[:space:],:=\\][^[:space:],:=\\]*\)*' nextgroup=sudoersCommandArgs,@sudoersCmndList skipwhite
+syn match sudoersCommandEmpty contained '""' nextgroup=@sudoersCmndList skipwhite skipnl
+
+syn match sudoersCommandArgsInSpec contained '[^[:space:],:=\\]\+\%(\\[[:space:],:=\\][^[:space:],:=\\]*\)*' nextgroup=sudoersCommandArgsInSpec,@sudoersCmndSpec skipwhite
+syn match sudoersCommandEmptyInSpec contained '""' nextgroup=@sudoersCmndSpec skipwhite skipnl
+
+syn keyword sudoersDefaultEntry Defaults nextgroup=sudoersDefaultTypeAt,sudoersDefaultTypeColon,sudoersDefaultTypeGreaterThan,@sudoersParameter skipwhite skipnl
+syn match sudoersDefaultTypeAt contained '@' nextgroup=@sudoersHost skipwhite skipnl
+syn match sudoersDefaultTypeColon contained ':' nextgroup=@sudoersUser skipwhite skipnl
+syn match sudoersDefaultTypeGreaterThan contained '>' nextgroup=@sudoersUser skipwhite skipnl
+
+" 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
+ \ 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_follow
+ \ 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
+ \ 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
+ \ 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
+ \ nextgroup=sudoersListParameterEquals
+ \ skipwhite skipnl
+ \ env_check
+ \ env_delete
+ \ env_keep
+
+syn match sudoersParameterListComma contained ',' nextgroup=@sudoersParameter skipwhite skipnl
+
+syn cluster sudoersParameter contains=sudoersBooleanParameter,sudoersIntegerParameter,sudoersStringParameter,sudoersListParameter
+
+syn match sudoersIntegerParameterEquals contained '[+-]\==' nextgroup=sudoersIntegerValue skipwhite skipnl
+syn match sudoersStringParameterEquals contained '[+-]\==' nextgroup=sudoersStringValue skipwhite skipnl
+syn match sudoersListParameterEquals contained '[+-]\==' nextgroup=sudoersListValue skipwhite skipnl
+
+syn match sudoersIntegerValue contained '\d\+' nextgroup=sudoersParameterListComma skipwhite skipnl
+syn match sudoersStringValue contained '[^[:space:],:=\\]*\%(\\[[:space:],:=\\][^[:space:],:=\\]*\)*' nextgroup=sudoersParameterListComma skipwhite skipnl
+syn region sudoersStringValue contained start=+"+ skip=+\\"+ end=+"+ nextgroup=sudoersParameterListComma skipwhite skipnl
+syn match sudoersListValue contained '[^[:space:],:=\\]*\%(\\[[:space:],:=\\][^[:space:],:=\\]*\)*' nextgroup=sudoersParameterListComma skipwhite skipnl
+syn region sudoersListValue contained start=+"+ skip=+\\"+ end=+"+ nextgroup=sudoersParameterListComma skipwhite skipnl
+
+syn match sudoersPASSWD contained '\%(NO\)\=PASSWD:' nextgroup=@sudoersCmndInSpec skipwhite
+
+hi def link sudoersSpecEquals Operator
+hi def link sudoersTodo Todo
+hi def link sudoersComment Comment
+hi def link sudoersAlias Keyword
+hi def link sudoersUserAlias Identifier
+hi def link sudoersUserNameInList String
+hi def link sudoersUIDInList Number
+hi def link sudoersGroupInList PreProc
+hi def link sudoersUserNetgroupInList PreProc
+hi def link sudoersUserAliasInList PreProc
+hi def link sudoersUserName String
+hi def link sudoersUID Number
+hi def link sudoersGroup PreProc
+hi def link sudoersUserNetgroup PreProc
+hi def link sudoersUserAliasRef PreProc
+hi def link sudoersUserNameInSpec String
+hi def link sudoersUIDInSpec Number
+hi def link sudoersGroupInSpec PreProc
+hi def link sudoersUserNetgroupInSpec PreProc
+hi def link sudoersUserAliasInSpec PreProc
+hi def link sudoersUserNameInRunas String
+hi def link sudoersUIDInRunas Number
+hi def link sudoersGroupInRunas PreProc
+hi def link sudoersUserNetgroupInRunas PreProc
+hi def link sudoersUserAliasInRunas PreProc
+hi def link sudoersHostAlias Identifier
+hi def link sudoersHostNameInList String
+hi def link sudoersIPAddrInList Number
+hi def link sudoersNetworkInList Number
+hi def link sudoersHostNetgroupInList PreProc
+hi def link sudoersHostAliasInList PreProc
+hi def link sudoersHostName String
+hi def link sudoersIPAddr Number
+hi def link sudoersNetwork Number
+hi def link sudoersHostNetgroup PreProc
+hi def link sudoersHostAliasRef PreProc
+hi def link sudoersHostNameInSpec String
+hi def link sudoersIPAddrInSpec Number
+hi def link sudoersNetworkInSpec Number
+hi def link sudoersHostNetgroupInSpec PreProc
+hi def link sudoersHostAliasInSpec PreProc
+hi def link sudoersCmndAlias Identifier
+hi def link sudoersCmndNameInList String
+hi def link sudoersCmndAliasInList PreProc
+hi def link sudoersCmndNameInSpec String
+hi def link sudoersCmndAliasInSpec PreProc
+hi def link sudoersUserAliasEquals Operator
+hi def link sudoersUserListComma Delimiter
+hi def link sudoersUserListColon Delimiter
+hi def link sudoersUserSpecComma Delimiter
+hi def link sudoersUserRunasBegin Delimiter
+hi def link sudoersUserRunasComma Delimiter
+hi def link sudoersUserRunasEnd Delimiter
+hi def link sudoersHostAliasEquals Operator
+hi def link sudoersHostListComma Delimiter
+hi def link sudoersHostListColon Delimiter
+hi def link sudoersHostSpecComma Delimiter
+hi def link sudoersCmndAliasEquals Operator
+hi def link sudoersCmndListComma Delimiter
+hi def link sudoersCmndListColon Delimiter
+hi def link sudoersCmndSpecComma Delimiter
+hi def link sudoersCmndSpecColon Delimiter
+hi def link sudoersUserNegationInList Operator
+hi def link sudoersHostNegationInList Operator
+hi def link sudoersCmndNegationInList Operator
+hi def link sudoersUserNegation Operator
+hi def link sudoersHostNegation Operator
+hi def link sudoersUserNegationInSpec Operator
+hi def link sudoersHostNegationInSpec Operator
+hi def link sudoersUserNegationInRunas Operator
+hi def link sudoersCmndNegationInSpec Operator
+hi def link sudoersCommandArgs String
+hi def link sudoersCommandEmpty Special
+hi def link sudoersDefaultEntry Keyword
+hi def link sudoersDefaultTypeAt Special
+hi def link sudoersDefaultTypeColon Special
+hi def link sudoersDefaultTypeGreaterThan Special
+hi def link sudoersBooleanParameter Identifier
+hi def link sudoersIntegerParameter Identifier
+hi def link sudoersStringParameter Identifier
+hi def link sudoersListParameter Identifier
+hi def link sudoersParameterListComma Delimiter
+hi def link sudoersIntegerParameterEquals Operator
+hi def link sudoersStringParameterEquals Operator
+hi def link sudoersListParameterEquals Operator
+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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/svg.vim b/runtime/syntax/svg.vim
new file mode 100644
index 0000000..819b5ec
--- /dev/null
+++ b/runtime/syntax/svg.vim
@@ -0,0 +1,15 @@
+" Vim syntax file
+" Language: SVG (Scalable Vector Graphics)
+" Maintainer: Vincent Berthoux <twinside@gmail.com>
+" File Types: .svg (used in Web and vector programs)
+"
+" Directly call the xml syntax, because SVG is an XML
+" dialect. But as some plugins base their effect on filetype,
+" providing a distinct filetype from xml is better.
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/xml.vim
+let b:current_syntax = "svg"
diff --git a/runtime/syntax/svn.vim b/runtime/syntax/svn.vim
new file mode 100644
index 0000000..6239790
--- /dev/null
+++ b/runtime/syntax/svn.vim
@@ -0,0 +1,56 @@
+" Vim syntax file
+" Language: Subversion (svn) commit file
+" Maintainer: Dmitry Vasiliev <dima at hlabs dot org>
+" URL: https://github.com/hdima/vim-scripts/blob/master/syntax/svn.vim
+" Last Change: 2013-11-08
+" Filenames: svn-commit*.tmp
+" Version: 1.10
+
+" Contributors:
+"
+" List of the contributors in alphabetical order:
+"
+" A. S. Budden
+" Ingo Karkat
+" Myk Taylor
+" Stefano Zacchiroli
+
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+
+syn spell toplevel
+
+syn match svnFirstLine "\%^.*" nextgroup=svnRegion,svnBlank skipnl
+syn match svnSummary "^.\{0,50\}" contained containedin=svnFirstLine nextgroup=svnOverflow contains=@Spell
+syn match svnOverflow ".*" contained contains=@Spell
+syn match svnBlank "^.*" contained contains=@Spell
+
+syn region svnRegion end="\%$" matchgroup=svnDelimiter start="^--.*--$" contains=svnRemoved,svnRenamed,svnAdded,svnModified,svnProperty,@NoSpell
+syn match svnRemoved "^D .*$" contained contains=@NoSpell
+syn match svnRenamed "^R[ M][ U][ +] .*$" contained contains=@NoSpell
+syn match svnAdded "^A[ M][ U][ +] .*$" contained contains=@NoSpell
+syn match svnModified "^M[ M][ U] .*$" contained contains=@NoSpell
+syn match svnProperty "^_M[ U] .*$" contained contains=@NoSpell
+
+" Synchronization.
+syn sync clear
+syn sync match svnSync grouphere svnRegion "^--.*--$"me=s-1
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet.
+
+hi def link svnSummary Keyword
+hi def link svnBlank Error
+
+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
+
+
+let b:current_syntax = "svn"
diff --git a/runtime/syntax/swayconfig.vim b/runtime/syntax/swayconfig.vim
new file mode 100644
index 0000000..996b8f5
--- /dev/null
+++ b/runtime/syntax/swayconfig.vim
@@ -0,0 +1,106 @@
+" Vim syntax file
+" Language: sway window manager config
+" Original Author: James Eapen <james.eapen@vai.org>
+" Maintainer: James Eapen <james.eapen@vai.org>
+" Version: 0.1.6
+" Reference version (jamespeapen/swayconfig.vim): 0.11.6
+" Last Change: 2022 Aug 08
+
+" References:
+" http://i3wm.org/docs/userguide.html#configuring
+" https://github.com/swaywm/sway/blob/b69d637f7a34e239e48a4267ae94a5e7087b5834/sway/sway.5.scd
+" http://vimdoc.sourceforge.net/htmldoc/syntax.html
+"
+"
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/i3config.vim
+
+scriptencoding utf-8
+
+" Error
+"syn match swayConfigError /.*/
+
+" binding
+syn keyword swayConfigBindKeyword bindswitch bindgesture contained
+syn match swayConfigBind /^\s*\(bindswitch\)\s\+.*$/ contains=i3ConfigVariable,i3ConfigBindKeyword,swayConfigBindKeyword,i3ConfigVariableAndModifier,i3ConfigNumber,i3ConfigUnit,i3ConfigUnitOr,i3ConfigBindArgument,i3ConfigModifier,i3ConfigAction,i3ConfigString,i3ConfigGapStyleKeyword,i3ConfigBorderStyleKeyword
+
+" bindgestures
+syn keyword swayConfigBindGestureCommand swipe pinch hold contained
+syn keyword swayConfigBindGestureDirection up down left right next prev contained
+syn keyword swayConfigBindGesturePinchDirection inward outward clockwise counterclockwise contained
+syn match swayConfigBindGestureHold /^\s*\(bindgesture\)\s\+hold\(:[1-5]\)\?\s\+.*$/ contains=swayConfigBindKeyword,swayConfigBindGestureCommand,swayConfigBindGestureDirection,i3ConfigWorkspaceKeyword,i3ConfigAction
+syn match swayConfigBindGestureSwipe /^\s*\(bindgesture\)\s\+swipe\(:[3-5]\)\?:\(up\|down\|left\|right\)\s\+.*$/ contains=swayConfigBindKeyword,swayConfigBindGestureCommand,swayConfigBindGestureDirection,i3ConfigWorkspaceKeyword,i3ConfigAction
+syn match swayConfigBindGesturePinch /^\s*\(bindgesture\)\s\+pinch\(:[2-5]\)\?:\(up\|down\|left\|right\|inward\|outward\|clockwise\|counterclockwise\)\(+\(up\|down\|left\|right\|inward\|outward\|clockwise\|counterclockwise\)\)\?.*$/ contains=swayConfigBindKeyword,swayConfigBindGestureCommand,swayConfigBindGestureDirection,swayConfigBindGesturePinchDirection,i3ConfigWorkspaceKeyword,i3ConfigAction
+
+" floating
+syn keyword swayConfigFloatingKeyword floating contained
+syn match swayConfigFloating /^\s*floating\s\+\(enable\|disable\|toggle\)\s*$/ contains=swayConfigFloatingKeyword
+
+syn clear i3ConfigFloatingModifier
+syn keyword swayConfigFloatingModifier floating_modifier contained
+syn match swayConfigFloatingMouseAction /^\s\?.*floating_modifier\s\S\+\s\?\(normal\|inverted\|none\)\?$/ contains=swayConfigFloatingModifier,i3ConfigVariable
+
+" Gaps
+syn clear i3ConfigSmartBorderKeyword
+syn clear i3ConfigSmartBorder
+syn keyword swayConfigSmartBorderKeyword on no_gaps off contained
+syn match swayConfigSmartBorder /^\s*smart_borders\s\+\(on\|no_gaps\|off\)\s\?$/ contains=swayConfigSmartBorderKeyword
+
+" Changing colors
+syn keyword swayConfigClientColorKeyword focused_tab_title contained
+syn match swayConfigClientColor /^\s*client.\w\+\s\+.*$/ contains=i3ConfigClientColorKeyword,i3ConfigColor,i3ConfigVariable,i3ConfigClientColorKeyword,swayConfigClientColorKeyword
+
+" Input config
+syn keyword swayConfigInputKeyword input contained
+syn match swayConfigInput /^\s*input\s\+.*$/ contains=swayConfigInputKeyword
+
+" set display outputs
+syn match swayConfigOutput /^\s*output\s\+.*$/ contains=i3ConfigOutput
+
+" set display focus
+syn keyword swayConfigFocusKeyword focus contained
+syn keyword swayConfigFocusType output contained
+syn match swayConfigFocus /^\s*focus\soutput\s.*$/ contains=swayConfigFocusKeyword,swayConfigFocusType
+
+" focus follows mouse
+syn clear i3ConfigFocusFollowsMouseType
+syn clear i3ConfigFocusFollowsMouse
+
+syn keyword swayConfigFocusFollowsMouseType yes no always contained
+syn match swayConfigFocusFollowsMouse /^\s*focus_follows_mouse\s\+\(yes\|no\|always\)\s\?$/ contains=i3ConfigFocusFollowsMouseKeyword,swayConfigFocusFollowsMouseType
+
+
+" xwayland
+syn keyword swayConfigXwaylandKeyword xwayland contained
+syn match swayConfigXwaylandModifier /^\s*xwayland\s\+\(enable\|disable\|force\)\s\?$/ contains=swayConfigXwaylandKeyword
+
+" Group mode/bar
+syn clear i3ConfigBlock
+syn region swayConfigBlock start=+.*s\?{$+ end=+^}$+ contains=i3ConfigBlockKeyword,i3ConfigString,i3ConfigBind,i3ConfigInitializeKeyword,i3ConfigComment,i3ConfigFont,i3ConfigFocusWrappingType,i3ConfigColor,i3ConfigVariable,swayConfigInputKeyword,i3ConfigOutput transparent keepend extend
+
+"hi def link swayConfigError Error
+hi def link i3ConfigFloating Error
+hi def link swayConfigFloating Type
+hi def link swayConfigFloatingMouseAction Type
+hi def link swayConfigFocusKeyword Type
+hi def link swayConfigSmartBorderKeyword Type
+hi def link swayConfigInputKeyword Type
+hi def link swayConfigFocusFollowsMouseType Type
+hi def link swayConfigBindGestureCommand Identifier
+hi def link swayConfigBindGestureDirection Constant
+hi def link swayConfigBindGesturePinchDirection Constant
+hi def link swayConfigBindKeyword Identifier
+hi def link swayConfigClientColorKeyword Identifier
+hi def link swayConfigFloatingKeyword Identifier
+hi def link swayConfigFloatingModifier Identifier
+hi def link swayConfigFocusType Identifier
+hi def link swayConfigSmartBorder Identifier
+hi def link swayConfigXwaylandKeyword Identifier
+hi def link swayConfigXwaylandModifier Type
+hi def link swayConfigBindGesture PreProc
+
+let b:current_syntax = "swayconfig"
diff --git a/runtime/syntax/swift.vim b/runtime/syntax/swift.vim
new file mode 100644
index 0000000..ff07be2
--- /dev/null
+++ b/runtime/syntax/swift.vim
@@ -0,0 +1,286 @@
+" This source file is part of the Swift.org open source project
+"
+" Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
+" Licensed under Apache License v2.0 with Runtime Library Exception
+"
+" See https://swift.org/LICENSE.txt for license information
+" See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
+"
+" Vim syntax file
+" Language: swift
+" Maintainer: Joe Groff <jgroff@apple.com>
+" Last Change: 2018 Jan 21
+"
+" Vim maintainer: Emir SARI <bitigchi@me.com>
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:keepcpo = &cpo
+set cpo&vim
+
+syn keyword swiftKeyword
+ \ break
+ \ case
+ \ catch
+ \ continue
+ \ default
+ \ defer
+ \ do
+ \ else
+ \ fallthrough
+ \ for
+ \ guard
+ \ if
+ \ in
+ \ repeat
+ \ return
+ \ switch
+ \ throw
+ \ try
+ \ where
+ \ while
+syn match swiftMultiwordKeyword
+ \ "indirect case"
+
+syn keyword swiftCoreTypes
+ \ Any
+ \ AnyObject
+
+syn keyword swiftImport skipwhite skipempty nextgroup=swiftImportModule
+ \ import
+
+syn keyword swiftDefinitionModifier
+ \ convenience
+ \ dynamic
+ \ fileprivate
+ \ final
+ \ internal
+ \ lazy
+ \ nonmutating
+ \ open
+ \ override
+ \ prefix
+ \ private
+ \ public
+ \ required
+ \ rethrows
+ \ static
+ \ throws
+ \ weak
+
+syn keyword swiftInOutKeyword skipwhite skipempty nextgroup=swiftTypeName
+ \ inout
+
+syn keyword swiftIdentifierKeyword
+ \ Self
+ \ metatype
+ \ self
+ \ super
+
+syn keyword swiftFuncKeywordGeneral skipwhite skipempty nextgroup=swiftTypeParameters
+ \ init
+
+syn keyword swiftFuncKeyword
+ \ deinit
+ \ subscript
+
+syn keyword swiftScope
+ \ autoreleasepool
+
+syn keyword swiftMutating skipwhite skipempty nextgroup=swiftFuncDefinition
+ \ mutating
+syn keyword swiftFuncDefinition skipwhite skipempty nextgroup=swiftTypeName,swiftOperator
+ \ func
+
+syn keyword swiftTypeDefinition skipwhite skipempty nextgroup=swiftTypeName
+ \ class
+ \ enum
+ \ extension
+ \ operator
+ \ precedencegroup
+ \ protocol
+ \ struct
+
+syn keyword swiftTypeAliasDefinition skipwhite skipempty nextgroup=swiftTypeAliasName
+ \ associatedtype
+ \ typealias
+
+syn match swiftMultiwordTypeDefinition skipwhite skipempty nextgroup=swiftTypeName
+ \ "indirect enum"
+
+syn keyword swiftVarDefinition skipwhite skipempty nextgroup=swiftVarName
+ \ let
+ \ var
+
+syn keyword swiftLabel
+ \ get
+ \ set
+ \ didSet
+ \ willSet
+
+syn keyword swiftBoolean
+ \ false
+ \ true
+
+syn keyword swiftNil
+ \ nil
+
+syn match swiftImportModule contained nextgroup=swiftImportComponent
+ \ /\<[A-Za-z_][A-Za-z_0-9]*\>/
+syn match swiftImportComponent contained nextgroup=swiftImportComponent
+ \ /\.\<[A-Za-z_][A-Za-z_0-9]*\>/
+
+syn match swiftTypeAliasName contained skipwhite skipempty nextgroup=swiftTypeAliasValue
+ \ /\<[A-Za-z_][A-Za-z_0-9]*\>/
+syn match swiftTypeName contained skipwhite skipempty nextgroup=swiftTypeParameters
+ \ /\<[A-Za-z_][A-Za-z_0-9\.]*\>/
+syn match swiftVarName contained skipwhite skipempty nextgroup=swiftTypeDeclaration
+ \ /\<[A-Za-z_][A-Za-z_0-9]*\>/
+syn match swiftImplicitVarName
+ \ /\$\<[A-Za-z_0-9]\+\>/
+
+" TypeName[Optionality]?
+syn match swiftType contained skipwhite skipempty nextgroup=swiftTypeParameters
+ \ /\<[A-Za-z_][A-Za-z_0-9\.]*\>[!?]\?/
+" [Type:Type] (dictionary) or [Type] (array)
+syn region swiftType contained contains=swiftTypePair,swiftType
+ \ matchgroup=Delimiter start=/\[/ end=/\]/
+syn match swiftTypePair contained skipwhite skipempty nextgroup=swiftTypeParameters,swiftTypeDeclaration
+ \ /\<[A-Za-z_][A-Za-z_0-9\.]*\>[!?]\?/
+" (Type[, Type]) (tuple)
+" FIXME: we should be able to use skip="," and drop swiftParamDelim
+syn region swiftType contained contains=swiftType,swiftParamDelim
+ \ matchgroup=Delimiter start="[^@]\?(" end=")" matchgroup=NONE skip=","
+syn match swiftParamDelim contained
+ \ /,/
+" <Generic Clause> (generics)
+syn region swiftTypeParameters contained contains=swiftVarName,swiftConstraint
+ \ matchgroup=Delimiter start="<" end=">" matchgroup=NONE skip=","
+syn keyword swiftConstraint contained
+ \ where
+
+syn match swiftTypeAliasValue skipwhite skipempty nextgroup=swiftType
+ \ /=/
+syn match swiftTypeDeclaration skipwhite skipempty nextgroup=swiftType,swiftInOutKeyword
+ \ /:/
+syn match swiftTypeDeclaration skipwhite skipempty nextgroup=swiftType
+ \ /->/
+
+syn match swiftKeyword
+ \ /\<case\>/
+syn region swiftCaseLabelRegion
+ \ matchgroup=swiftKeyword start=/\<case\>/ matchgroup=Delimiter end=/:/ oneline contains=TOP
+syn region swiftDefaultLabelRegion
+ \ matchgroup=swiftKeyword start=/\<default\>/ matchgroup=Delimiter end=/:/ oneline
+
+syn region swiftParenthesisRegion contains=TOP
+ \ matchgroup=NONE start=/(/ end=/)/
+
+syn region swiftString contains=swiftInterpolationRegion
+ \ start=/"/ skip=/\\\\\|\\"/ end=/"/
+syn region swiftInterpolationRegion contained contains=TOP
+ \ matchgroup=swiftInterpolation start=/\\(/ end=/)/
+syn region swiftComment contains=swiftComment,swiftLineComment,swiftTodo
+ \ start="/\*" end="\*/"
+syn region swiftLineComment contains=swiftComment,swiftTodo
+ \ start="//" end="$"
+
+syn match swiftDecimal
+ \ /[+\-]\?\<\([0-9][0-9_]*\)\([.][0-9_]*\)\?\([eE][+\-]\?[0-9][0-9_]*\)\?\>/
+syn match swiftHex
+ \ /[+\-]\?\<0x[0-9A-Fa-f][0-9A-Fa-f_]*\(\([.][0-9A-Fa-f_]*\)\?[pP][+\-]\?[0-9][0-9_]*\)\?\>/
+syn match swiftOct
+ \ /[+\-]\?\<0o[0-7][0-7_]*\>/
+syn match swiftBin
+ \ /[+\-]\?\<0b[01][01_]*\>/
+
+syn match swiftOperator skipwhite skipempty nextgroup=swiftTypeParameters
+ \ "\.\@<!\.\.\.\@!\|[/=\-+*%<>!&|^~]\@<!\(/[/*]\@![/=\-+*%<>!&|^~]*\|*/\@![/=\-+*%<>!&|^~]*\|->\@![/=\-+*%<>!&|^~]*\|[=+%<>!&|^~][/=\-+*%<>!&|^~]*\)"
+syn match swiftOperator skipwhite skipempty nextgroup=swiftTypeParameters
+ \ "\.\.[<.]"
+
+syn match swiftChar
+ \ /'\([^'\\]\|\\\(["'tnr0\\]\|x[0-9a-fA-F]\{2}\|u[0-9a-fA-F]\{4}\|U[0-9a-fA-F]\{8}\)\)'/
+
+syn match swiftTupleIndexNumber contains=swiftDecimal
+ \ /\.[0-9]\+/
+syn match swiftDecimal contained
+ \ /[0-9]\+/
+
+syn match swiftPreproc
+ \ /#\(\<column\>\|\<dsohandle\>\|\<file\>\|\<line\>\|\<function\>\)/
+syn match swiftPreproc
+ \ /^\s*#\(\<if\>\|\<else\>\|\<elseif\>\|\<endif\>\|\<error\>\|\<warning\>\)/
+syn region swiftPreprocFalse
+ \ start="^\s*#\<if\>\s\+\<false\>" end="^\s*#\(\<else\>\|\<elseif\>\|\<endif\>\)"
+
+syn match swiftAttribute
+ \ /@\<\w\+\>/ skipwhite skipempty nextgroup=swiftType,swiftTypeDefinition
+
+syn keyword swiftTodo MARK TODO FIXME contained
+
+syn match swiftCastOp skipwhite skipempty nextgroup=swiftType,swiftCoreTypes
+ \ "\<is\>"
+syn match swiftCastOp skipwhite skipempty nextgroup=swiftType,swiftCoreTypes
+ \ "\<as\>[!?]\?"
+
+syn match swiftNilOps
+ \ "??"
+
+syn region swiftReservedIdentifier oneline
+ \ start=/`/ end=/`/
+
+hi def link swiftImport Include
+hi def link swiftImportModule Title
+hi def link swiftImportComponent Identifier
+hi def link swiftKeyword Statement
+hi def link swiftCoreTypes Type
+hi def link swiftMultiwordKeyword Statement
+hi def link swiftTypeDefinition Define
+hi def link swiftMultiwordTypeDefinition Define
+hi def link swiftType Type
+hi def link swiftTypePair Type
+hi def link swiftTypeAliasName Identifier
+hi def link swiftTypeName Function
+hi def link swiftConstraint Special
+hi def link swiftFuncDefinition Define
+hi def link swiftDefinitionModifier Operator
+hi def link swiftInOutKeyword Define
+hi def link swiftFuncKeyword Function
+hi def link swiftFuncKeywordGeneral Function
+hi def link swiftTypeAliasDefinition Define
+hi def link swiftVarDefinition Define
+hi def link swiftVarName Identifier
+hi def link swiftImplicitVarName Identifier
+hi def link swiftIdentifierKeyword Identifier
+hi def link swiftTypeAliasValue Delimiter
+hi def link swiftTypeDeclaration Delimiter
+hi def link swiftTypeParameters Delimiter
+hi def link swiftBoolean Boolean
+hi def link swiftString String
+hi def link swiftInterpolation Special
+hi def link swiftComment Comment
+hi def link swiftLineComment Comment
+hi def link swiftDecimal Number
+hi def link swiftHex Number
+hi def link swiftOct Number
+hi def link swiftBin Number
+hi def link swiftOperator Function
+hi def link swiftChar Character
+hi def link swiftLabel Operator
+hi def link swiftMutating Statement
+hi def link swiftPreproc PreCondit
+hi def link swiftPreprocFalse Comment
+hi def link swiftAttribute Type
+hi def link swiftTodo Todo
+hi def link swiftNil Constant
+hi def link swiftCastOp Operator
+hi def link swiftNilOps Operator
+hi def link swiftScope PreProc
+
+let b:current_syntax = "swift"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/syntax/swiftgyb.vim b/runtime/syntax/swiftgyb.vim
new file mode 100644
index 0000000..566b75b
--- /dev/null
+++ b/runtime/syntax/swiftgyb.vim
@@ -0,0 +1,24 @@
+" This source file is part of the Swift.org open source project
+"
+" Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
+" Licensed under Apache License v2.0 with Runtime Library Exception
+"
+" See https://swift.org/LICENSE.txt for license information
+" See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
+"
+" Vim syntax file
+" Language: gyb on swift
+"
+" Vim maintainer: Emir SARI <bitigchi@me.com>
+
+runtime! syntax/swift.vim
+unlet b:current_syntax
+
+syn include @Python syntax/python.vim
+syn region pythonCode matchgroup=gybPythonCode start=+^ *%+ end=+$+ contains=@Python keepend
+syn region pythonCode matchgroup=gybPythonCode start=+%{+ end=+}%+ contains=@Python keepend
+syn match gybPythonCode /\${[^}]*}/
+hi def link gybPythonCode CursorLineNr
+
+let b:current_syntax = "swiftgyb"
+
diff --git a/runtime/syntax/syncolor.vim b/runtime/syntax/syncolor.vim
new file mode 100644
index 0000000..5b907a3
--- /dev/null
+++ b/runtime/syntax/syncolor.vim
@@ -0,0 +1,87 @@
+" Vim syntax support file
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2020 Feb 13
+
+" This file sets up the default methods for highlighting.
+" It is loaded from "synload.vim" and from Vim for ":syntax reset".
+" Also used from init_highlight().
+
+if !exists("syntax_cmd") || syntax_cmd == "on"
+ " ":syntax on" works like in Vim 5.7: set colors but keep links
+ command -nargs=* SynColor hi <args>
+ command -nargs=* SynLink hi link <args>
+else
+ if syntax_cmd == "enable"
+ " ":syntax enable" keeps any existing colors
+ command -nargs=* SynColor hi def <args>
+ command -nargs=* SynLink hi def link <args>
+ elseif syntax_cmd == "reset"
+ " ":syntax reset" resets all colors to the default
+ command -nargs=* SynColor hi <args>
+ command -nargs=* SynLink hi! link <args>
+ else
+ " User defined syncolor file has already set the colors.
+ finish
+ endif
+endif
+
+" Many terminals can only use six different colors (plus black and white).
+" Therefore the number of colors used is kept low. It doesn't look nice with
+" too many colors anyway.
+" Careful with "cterm=bold", it changes the color to bright for some terminals.
+" There are two sets of defaults: for a dark and a light background.
+if &background == "dark"
+ SynColor Comment term=bold cterm=NONE ctermfg=Cyan ctermbg=NONE gui=NONE guifg=#80a0ff guibg=NONE
+ SynColor Constant term=underline cterm=NONE ctermfg=Magenta ctermbg=NONE gui=NONE guifg=#ffa0a0 guibg=NONE
+ SynColor Special term=bold cterm=NONE ctermfg=LightRed ctermbg=NONE gui=NONE guifg=Orange guibg=NONE
+ SynColor Identifier term=underline cterm=bold ctermfg=Cyan ctermbg=NONE gui=NONE guifg=#40ffff guibg=NONE
+ SynColor Statement term=bold cterm=NONE ctermfg=Yellow ctermbg=NONE gui=bold guifg=#ffff60 guibg=NONE
+ SynColor PreProc term=underline cterm=NONE ctermfg=LightBlue ctermbg=NONE gui=NONE guifg=#ff80ff guibg=NONE
+ SynColor Type term=underline cterm=NONE ctermfg=LightGreen ctermbg=NONE gui=bold guifg=#60ff60 guibg=NONE
+ SynColor Underlined term=underline cterm=underline ctermfg=LightBlue gui=underline guifg=#80a0ff
+ SynColor Ignore term=NONE cterm=NONE ctermfg=black ctermbg=NONE gui=NONE guifg=bg guibg=NONE
+else
+ SynColor Comment term=bold cterm=NONE ctermfg=DarkBlue ctermbg=NONE gui=NONE guifg=Blue guibg=NONE
+ SynColor Constant term=underline cterm=NONE ctermfg=DarkRed ctermbg=NONE gui=NONE guifg=Magenta guibg=NONE
+ " #6a5acd is SlateBlue
+ SynColor Special term=bold cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=#6a5acd guibg=NONE
+ SynColor Identifier term=underline cterm=NONE ctermfg=DarkCyan ctermbg=NONE gui=NONE guifg=DarkCyan guibg=NONE
+ SynColor Statement term=bold cterm=NONE ctermfg=Brown ctermbg=NONE gui=bold guifg=Brown guibg=NONE
+ " #6a0dad is Purple
+ SynColor PreProc term=underline cterm=NONE ctermfg=DarkMagenta ctermbg=NONE gui=NONE guifg=#6a0dad guibg=NONE
+ SynColor Type term=underline cterm=NONE ctermfg=DarkGreen ctermbg=NONE gui=bold guifg=SeaGreen guibg=NONE
+ SynColor Underlined term=underline cterm=underline ctermfg=DarkMagenta gui=underline guifg=SlateBlue
+ SynColor Ignore term=NONE cterm=NONE ctermfg=white ctermbg=NONE gui=NONE guifg=bg guibg=NONE
+endif
+SynColor Error term=reverse cterm=NONE ctermfg=White ctermbg=Red gui=NONE guifg=White guibg=Red
+SynColor Todo term=standout cterm=NONE ctermfg=Black ctermbg=Yellow gui=NONE guifg=Blue guibg=Yellow
+
+" Common groups that link to default highlighting.
+" You can specify other highlighting easily.
+SynLink String Constant
+SynLink Character Constant
+SynLink Number Constant
+SynLink Boolean Constant
+SynLink Float Number
+SynLink Function Identifier
+SynLink Conditional Statement
+SynLink Repeat Statement
+SynLink Label Statement
+SynLink Operator Statement
+SynLink Keyword Statement
+SynLink Exception Statement
+SynLink Include PreProc
+SynLink Define PreProc
+SynLink Macro PreProc
+SynLink PreCondit PreProc
+SynLink StorageClass Type
+SynLink Structure Type
+SynLink Typedef Type
+SynLink Tag Special
+SynLink SpecialChar Special
+SynLink Delimiter Special
+SynLink SpecialComment Special
+SynLink Debug Special
+
+delcommand SynColor
+delcommand SynLink
diff --git a/runtime/syntax/synload.vim b/runtime/syntax/synload.vim
new file mode 100644
index 0000000..70e2d88
--- /dev/null
+++ b/runtime/syntax/synload.vim
@@ -0,0 +1,83 @@
+" Vim syntax support file
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Apr 12
+
+" This file sets up for syntax highlighting.
+" It is loaded from "syntax.vim" and "manual.vim".
+" 1. Set the default highlight groups.
+" 2. Install Syntax autocommands for all the available syntax files.
+
+if !has("syntax")
+ finish
+endif
+
+" let others know that syntax has been switched on
+let syntax_on = 1
+
+" Set the default highlighting colors. Use a color scheme if specified.
+if exists("colors_name")
+ exe "colors " . colors_name
+else
+ runtime! syntax/syncolor.vim
+endif
+
+" Line continuation is used here, remove 'C' from 'cpoptions'
+let s:cpo_save = &cpo
+set cpo&vim
+
+" First remove all old syntax autocommands.
+au! Syntax
+
+au Syntax * call s:SynSet()
+
+fun! s:SynSet()
+ " clear syntax for :set syntax=OFF and any syntax name that doesn't exist
+ syn clear
+ if exists("b:current_syntax")
+ unlet b:current_syntax
+ endif
+
+ 0verbose let s = expand("<amatch>")
+ if s == "ON"
+ " :set syntax=ON
+ if &filetype == ""
+ echohl ErrorMsg
+ echo "filetype unknown"
+ echohl None
+ endif
+ let s = &filetype
+ elseif s == "OFF"
+ let s = ""
+ endif
+
+ if s != ""
+ " Load the syntax file(s). When there are several, separated by dots,
+ " load each in sequence. Skip empty entries.
+ for name in split(s, '\.')
+ if !empty(name)
+ exe "runtime! syntax/" . name . ".vim syntax/" . name . "/*.vim"
+ endif
+ endfor
+ endif
+endfun
+
+
+" Handle adding doxygen to other languages (C, C++, C#, IDL, java, php, DataScript)
+au Syntax c,cpp,cs,idl,java,php,datascript
+ \ if (exists('b:load_doxygen_syntax') && b:load_doxygen_syntax)
+ \ || (exists('g:load_doxygen_syntax') && g:load_doxygen_syntax)
+ \ | runtime! syntax/doxygen.vim
+ \ | endif
+
+
+" Source the user-specified syntax highlighting file
+if exists("mysyntaxfile")
+ let s:fname = expand(mysyntaxfile)
+ if filereadable(s:fname)
+ execute "source " . fnameescape(s:fname)
+ endif
+endif
+
+" Restore 'cpoptions'
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/syntax.vim b/runtime/syntax/syntax.vim
new file mode 100644
index 0000000..55a2ee6
--- /dev/null
+++ b/runtime/syntax/syntax.vim
@@ -0,0 +1,44 @@
+" Vim syntax support file
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2022 Apr 12
+
+" This file is used for ":syntax on".
+" It installs the autocommands and starts highlighting for all buffers.
+
+if !has("syntax")
+ finish
+endif
+
+" If Syntax highlighting appears to be on already, turn it off first, so that
+" any leftovers are cleared.
+if exists("syntax_on") || exists("syntax_manual")
+ so <sfile>:p:h/nosyntax.vim
+endif
+
+" Load the Syntax autocommands and set the default methods for highlighting.
+runtime syntax/synload.vim
+
+" Load the FileType autocommands if not done yet.
+if exists("did_load_filetypes")
+ let s:did_ft = 1
+else
+ filetype on
+ let s:did_ft = 0
+endif
+
+" Set up the connection between FileType and Syntax autocommands.
+" This makes the syntax automatically set when the file type is detected.
+" Avoid an error when 'verbose' is set and <amatch> expansion fails.
+augroup syntaxset
+ au! FileType * 0verbose exe "set syntax=" . expand("<amatch>")
+augroup END
+
+
+" Execute the syntax autocommands for the each buffer.
+" If the filetype wasn't detected yet, do that now.
+" Always do the syntaxset autocommands, for buffers where the 'filetype'
+" already was set manually (e.g., help buffers).
+doautoall syntaxset FileType
+if !s:did_ft
+ doautoall filetypedetect BufRead
+endif
diff --git a/runtime/syntax/sysctl.vim b/runtime/syntax/sysctl.vim
new file mode 100644
index 0000000..d99ac01
--- /dev/null
+++ b/runtime/syntax/sysctl.vim
@@ -0,0 +1,39 @@
+" Vim syntax file
+" Language: sysctl.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-05-02
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match sysctlBegin display '^'
+ \ nextgroup=sysctlToken,sysctlComment skipwhite
+
+syn match sysctlToken contained display '[^=]\+'
+ \ nextgroup=sysctlTokenEq skipwhite
+
+syn match sysctlTokenEq contained display '=' nextgroup=sysctlValue skipwhite
+
+syn region sysctlValue contained display oneline
+ \ matchgroup=sysctlValue start='\S'
+ \ matchgroup=Normal end='\s*$'
+
+syn keyword sysctlTodo contained TODO FIXME XXX NOTE
+
+syn region sysctlComment display oneline start='^\s*[#;]' end='$'
+ \ contains=sysctlTodo,@Spell
+
+hi def link sysctlTodo Todo
+hi def link sysctlComment Comment
+hi def link sysctlToken Identifier
+hi def link sysctlTokenEq Operator
+hi def link sysctlValue String
+
+let b:current_syntax = "sysctl"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/systemd.vim b/runtime/syntax/systemd.vim
new file mode 100644
index 0000000..5dfba74
--- /dev/null
+++ b/runtime/syntax/systemd.vim
@@ -0,0 +1,8 @@
+" Vim syntax file
+" Language: systemd.unit(5)
+
+if !exists('b:current_syntax')
+ " Looks a lot like dosini files.
+ runtime! syntax/dosini.vim
+ let b:current_syntax = 'systemd'
+endif
diff --git a/runtime/syntax/systemverilog.vim b/runtime/syntax/systemverilog.vim
new file mode 100644
index 0000000..f99ea8d
--- /dev/null
+++ b/runtime/syntax/systemverilog.vim
@@ -0,0 +1,85 @@
+" Vim syntax file
+" Language: SystemVerilog
+" Maintainer: kocha <kocha.lsifrontend@gmail.com>
+" Last Change: 12-Aug-2013.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Read in Verilog syntax files
+runtime! syntax/verilog.vim
+unlet b:current_syntax
+
+" IEEE1800-2005
+syn keyword systemverilogStatement always_comb always_ff always_latch
+syn keyword systemverilogStatement class endclass new
+syn keyword systemverilogStatement virtual local const protected
+syn keyword systemverilogStatement package endpackage
+syn keyword systemverilogStatement rand randc constraint randomize
+syn keyword systemverilogStatement with inside dist
+syn keyword systemverilogStatement sequence endsequence randsequence
+syn keyword systemverilogStatement srandom
+syn keyword systemverilogStatement logic bit byte
+syn keyword systemverilogStatement int longint shortint
+syn keyword systemverilogStatement struct packed
+syn keyword systemverilogStatement final
+syn keyword systemverilogStatement import export
+syn keyword systemverilogStatement context pure
+syn keyword systemverilogStatement void shortreal chandle string
+syn keyword systemverilogStatement clocking endclocking iff
+syn keyword systemverilogStatement interface endinterface modport
+syn keyword systemverilogStatement cover covergroup coverpoint endgroup
+syn keyword systemverilogStatement property endproperty
+syn keyword systemverilogStatement program endprogram
+syn keyword systemverilogStatement bins binsof illegal_bins ignore_bins
+syn keyword systemverilogStatement alias matches solve static assert
+syn keyword systemverilogStatement assume super before expect bind
+syn keyword systemverilogStatement extends null tagged extern this
+syn keyword systemverilogStatement first_match throughout timeprecision
+syn keyword systemverilogStatement timeunit type union
+syn keyword systemverilogStatement uwire var cross ref wait_order intersect
+syn keyword systemverilogStatement wildcard within
+
+syn keyword systemverilogTypeDef typedef enum
+
+syn keyword systemverilogConditional randcase
+syn keyword systemverilogConditional unique priority
+
+syn keyword systemverilogRepeat return break continue
+syn keyword systemverilogRepeat do foreach
+
+syn keyword systemverilogLabel join_any join_none forkjoin
+
+" IEEE1800-2009 add
+syn keyword systemverilogStatement checker endchecker
+syn keyword systemverilogStatement accept_on reject_on
+syn keyword systemverilogStatement sync_accept_on sync_reject_on
+syn keyword systemverilogStatement eventually nexttime until until_with
+syn keyword systemverilogStatement s_always s_eventually s_nexttime s_until s_until_with
+syn keyword systemverilogStatement let untyped
+syn keyword systemverilogStatement strong weak
+syn keyword systemverilogStatement restrict global implies
+
+syn keyword systemverilogConditional unique0
+
+" IEEE1800-2012 add
+syn keyword systemverilogStatement implements
+syn keyword systemverilogStatement interconnect soft nettype
+
+" Define the default highlighting.
+
+" 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
+
+
+let b:current_syntax = "systemverilog"
+
+" vim: ts=8
diff --git a/runtime/syntax/tads.vim b/runtime/syntax/tads.vim
new file mode 100644
index 0000000..23a65b9
--- /dev/null
+++ b/runtime/syntax/tads.vim
@@ -0,0 +1,171 @@
+" Vim syntax file
+" Language: TADS
+" Maintainer: Amir Karger <karger@post.harvard.edu>
+" $Date: 2004/06/13 19:28:45 $
+" $Revision: 1.1 $
+" Stolen from: Bram Moolenaar's C language file
+" Newest version at: http://www.hec.utah.edu/~karger/vim/syntax/tads.vim
+" History info at the bottom of the file
+
+" TODO lots more keywords
+" global, self, etc. are special *objects*, not functions. They should
+" probably be a different color than the special functions
+" Actually, should cvtstr etc. be functions?! (change tadsFunction)
+" Make global etc. into Identifiers, since we don't have regular variables?
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A bunch of useful keywords
+syn keyword tadsStatement goto break return continue pass
+syn keyword tadsLabel case default
+syn keyword tadsConditional if else switch
+syn keyword tadsRepeat while for do
+syn keyword tadsStorageClass local compoundWord formatstring specialWords
+syn keyword tadsBoolean nil true
+
+" TADS keywords
+syn keyword tadsKeyword replace modify
+syn keyword tadsKeyword global self inherited
+" builtin functions
+syn keyword tadsKeyword cvtstr cvtnum caps lower upper substr
+syn keyword tadsKeyword say length
+syn keyword tadsKeyword setit setscore
+syn keyword tadsKeyword datatype proptype
+syn keyword tadsKeyword car cdr
+syn keyword tadsKeyword defined isclass
+syn keyword tadsKeyword find firstobj nextobj
+syn keyword tadsKeyword getarg argcount
+syn keyword tadsKeyword input yorn askfile
+syn keyword tadsKeyword rand randomize
+syn keyword tadsKeyword restart restore quit save undo
+syn keyword tadsException abort exit exitobj
+
+syn keyword tadsTodo contained TODO FIXME XXX
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match tadsSpecial contained "\\."
+syn region tadsDoubleString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=tadsSpecial,tadsEmbedded
+syn region tadsSingleString start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=tadsSpecial
+" Embedded expressions in strings
+syn region tadsEmbedded contained start="<<" end=">>" contains=tadsKeyword
+
+" TADS doesn't have \xxx, right?
+"syn match cSpecial contained "\\[0-7][0-7][0-7]\=\|\\."
+"syn match cSpecialCharacter "'\\[0-7][0-7]'"
+"syn match cSpecialCharacter "'\\[0-7][0-7][0-7]'"
+
+"catch errors caused by wrong parenthesis
+"syn region cParen transparent start='(' end=')' contains=ALLBUT,cParenError,cIncluded,cSpecial,cTodo,cUserCont,cUserLabel
+"syn match cParenError ")"
+"syn match cInParen contained "[{}]"
+syn region tadsBrace transparent start='{' end='}' contains=ALLBUT,tadsBraceError,tadsIncluded,tadsSpecial,tadsTodo
+syn match tadsBraceError "}"
+
+"integer number (TADS has no floating point numbers)
+syn case ignore
+syn match tadsNumber "\<[0-9]\+\>"
+"hex number
+syn match tadsNumber "\<0x[0-9a-f]\+\>"
+syn match tadsIdentifier "\<[a-z][a-z0-9_$]*\>"
+syn case match
+" flag an octal number with wrong digits
+syn match tadsOctalError "\<0[0-7]*[89]"
+
+" Removed complicated c_comment_strings
+syn region tadsComment start="/\*" end="\*/" contains=tadsTodo
+syn match tadsComment "//.*" contains=tadsTodo
+syntax match tadsCommentError "\*/"
+
+syn region tadsPreCondit start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=tadsComment,tadsString,tadsNumber,tadsCommentError
+syn region tadsIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match tadsIncluded contained "<[^>]*>"
+syn match tadsInclude "^\s*#\s*include\>\s*["<]" contains=tadsIncluded
+syn region tadsDefine start="^\s*#\s*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,tadsPreCondit,tadsIncluded,tadsInclude,tadsDefine,tadsInBrace,tadsIdentifier
+
+syn region tadsPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,tadsPreCondit,tadsIncluded,tadsInclude,tadsDefine,tadsInParen,tadsIdentifier
+
+" Highlight User Labels
+" TODO labels for gotos?
+"syn region cMulti transparent start='?' end=':' contains=ALLBUT,cIncluded,cSpecial,cTodo,cUserCont,cUserLabel,cBitField
+" Avoid matching foo::bar() in C++ by requiring that the next char is not ':'
+"syn match cUserCont "^\s*\I\i*\s*:$" contains=cUserLabel
+"syn match cUserCont ";\s*\I\i*\s*:$" contains=cUserLabel
+"syn match cUserCont "^\s*\I\i*\s*:[^:]" contains=cUserLabel
+"syn match cUserCont ";\s*\I\i*\s*:[^:]" contains=cUserLabel
+
+"syn match cUserLabel "\I\i*" contained
+
+" identifier: class-name [, class-name [...]] [property-list] ;
+" Don't highlight comment in class def
+syn match tadsClassDef "\<class\>[^/]*" contains=tadsObjectDef,tadsClass
+syn match tadsClass contained "\<class\>"
+syn match tadsObjectDef "\<[a-zA-Z][a-zA-Z0-9_$]*\s*:\s*[a-zA-Z0-9_$]\+\(\s*,\s*[a-zA-Z][a-zA-Z0-9_$]*\)*\(\s*;\)\="
+syn keyword tadsFunction contained function
+syn match tadsFunctionDef "\<[a-zA-Z][a-zA-Z0-9_$]*\s*:\s*function[^{]*" contains=tadsFunction
+"syn region tadsObject transparent start = '[a-zA-Z][\i$]\s*:\s*' end=";" contains=tadsBrace,tadsObjectDef
+
+" How far back do we go to find matching groups
+if !exists("tads_minlines")
+ let tads_minlines = 15
+endif
+exec "syn sync ccomment tadsComment minlines=" . tads_minlines
+if !exists("tads_sync_dist")
+ let tads_sync_dist = 100
+endif
+execute "syn sync maxlines=" . tads_sync_dist
+
+" Define the default highlighting.
+" 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
+
+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"
+
+" Changes:
+" 11/18/99 Added a bunch of TADS functions, tadsException
+" 10/22/99 Misspelled Moolenaar (sorry!), c_minlines to tads_minlines
+"
+" vim: ts=8
diff --git a/runtime/syntax/tags.vim b/runtime/syntax/tags.vim
new file mode 100644
index 0000000..4c06dc1
--- /dev/null
+++ b/runtime/syntax/tags.vim
@@ -0,0 +1,31 @@
+" Language: tags
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Oct 26, 2016
+" Version: 8
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TAGS
+
+" 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 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 tagComment "^!_TAG_.*$"
+syn match tagField contained "[a-z]*:"
+
+" Define the default highlighting.
+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"
diff --git a/runtime/syntax/tak.vim b/runtime/syntax/tak.vim
new file mode 100644
index 0000000..7a8fceb
--- /dev/null
+++ b/runtime/syntax/tak.vim
@@ -0,0 +1,119 @@
+" Vim syntax file
+" Language: TAK2, TAK3, TAK2000 thermal modeling input file
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.tak
+" URL: http://www.naglenet.org/vim/syntax/tak.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+" Ignore case
+syn case ignore
+
+
+
+"
+"
+" Begin syntax definitions for tak input file.
+"
+
+" Force free-form fortran format
+let fortran_free_source=1
+
+" Load FORTRAN syntax file
+runtime! syntax/fortran.vim
+unlet b:current_syntax
+
+
+
+" Define keywords for TAK and TAKOUT
+syn keyword takOptions AUTODAMP CPRINT CSGDUMP GPRINT HPRINT LODTMP
+syn keyword takOptions LOGIC LPRINT NCVPRINT PLOTQ QPRINT QDUMP
+syn keyword takOptions SUMMARY SOLRTN UID DICTIONARIES
+
+syn keyword takRoutine SSITER FWDWRD FWDBCK BCKWRD
+
+syn keyword takControl ABSZRO BACKUP DAMP DTIMEI DTIMEL DTIMEH IFC
+syn keyword takControl MAXTEMP NLOOPS NLOOPT NODELIST OUTPUT PLOT
+syn keyword takControl SCALE SIGMA SSCRIT TIMEND TIMEN TIMEO TRCRIT
+syn keyword takControl PLOT
+
+syn keyword takSolids PLATE CYL
+syn keyword takSolidsArg ID MATNAM NTYPE TEMP XL YL ZL ISTRN ISTRG NNX
+syn keyword takSolidsArg NNY NNZ INCX INCY INCZ IAK IAC DIFF ARITH BOUN
+syn keyword takSolidsArg RMIN RMAX AXMAX NNR NNTHETA INCR INCTHETA END
+
+syn case ignore
+
+syn keyword takMacro fac pstart pstop
+syn keyword takMacro takcommon fstart fstop
+
+syn keyword takIdentifier flq flx gen ncv per sim siv stf stv tvd tvs
+syn keyword takIdentifier tvt pro thm
+
+
+
+" Define matches for TAK
+syn match takFortran "^F[0-9 ]"me=e-1
+syn match takMotran "^M[0-9 ]"me=e-1
+
+syn match takComment "^C.*$"
+syn match takComment "^R.*$"
+syn match takComment "\$.*$"
+
+syn match takHeader "^header[^,]*"
+
+syn match takIncludeFile "include \+[^ ]\+"hs=s+8 contains=fortranInclude
+
+syn match takInteger "-\=\<[0-9]*\>"
+syn match takFloat "-\=\<[0-9]*\.[0-9]*"
+syn match takScientific "-\=\<[0-9]*\.[0-9]*E[-+]\=[0-9]\+\>"
+
+syn match takEndData "END OF DATA"
+
+if exists("thermal_todo")
+ execute 'syn match takTodo ' . '"^'.thermal_todo.'.*$"'
+else
+ syn match takTodo "^?.*$"
+endif
+
+
+
+" Define the default highlighting
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/takcmp.vim b/runtime/syntax/takcmp.vim
new file mode 100644
index 0000000..9426e02
--- /dev/null
+++ b/runtime/syntax/takcmp.vim
@@ -0,0 +1,69 @@
+" Vim syntax file
+" Language: TAK2, TAK3, TAK2000 thermal modeling compare file
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.cmp
+" URL: http://www.naglenet.org/vim/syntax/takcmp.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+" Ignore case
+syn case ignore
+
+
+
+"
+"
+" Begin syntax definitions for compare files.
+"
+" Define keywords for TAK compare
+ syn keyword takcmpUnit celsius fahrenheit
+
+
+
+" Define matches for TAK compare
+ syn match takcmpTitle "Steady State Temperature Comparison"
+
+ syn match takcmpLabel "Run Date:"
+ syn match takcmpLabel "Run Time:"
+ syn match takcmpLabel "Temp. File \d Units:"
+ syn match takcmpLabel "Filename:"
+ syn match takcmpLabel "Output Units:"
+
+ syn match takcmpHeader "^ *Node\( *File \d\)* *Node Description"
+
+ syn match takcmpDate "\d\d\/\d\d\/\d\d"
+ syn match takcmpTime "\d\d:\d\d:\d\d"
+ syn match takcmpInteger "^ *-\=\<[0-9]*\>"
+ syn match takcmpFloat "-\=\<[0-9]*\.[0-9]*"
+
+
+
+" Define the default highlighting
+" Only when an item doesn't have highlighting yet
+
+hi def link takcmpTitle Type
+hi def link takcmpUnit PreProc
+
+hi def link takcmpLabel Statement
+
+hi def link takcmpHeader takHeader
+
+hi def link takcmpDate Identifier
+hi def link takcmpTime Identifier
+hi def link takcmpInteger Number
+hi def link takcmpFloat Special
+
+
+
+let b:current_syntax = "takcmp"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/takout.vim b/runtime/syntax/takout.vim
new file mode 100644
index 0000000..5e5d360
--- /dev/null
+++ b/runtime/syntax/takout.vim
@@ -0,0 +1,85 @@
+" Vim syntax file
+" Language: TAK2, TAK3, TAK2000 thermal modeling output file
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.out
+" URL: http://www.naglenet.org/vim/syntax/takout.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+" Ignore case
+syn case match
+
+
+
+" Load TAK syntax file
+runtime! syntax/tak.vim
+unlet b:current_syntax
+
+
+
+"
+"
+" Begin syntax definitions for tak output files.
+"
+
+" Define keywords for TAK output
+syn case match
+
+syn keyword takoutPos ON SI
+syn keyword takoutNeg OFF ENG
+
+
+
+" Define matches for TAK output
+syn match takoutTitle "TAK III"
+syn match takoutTitle "Release \d.\d\d"
+syn match takoutTitle " K & K Associates *Thermal Analysis Kit III *Serial Number \d\d-\d\d\d"
+
+syn match takoutFile ": \w*\.TAK"hs=s+2
+
+syn match takoutInteger "T\=[0-9]*\>"ms=s+1
+
+syn match takoutSectionDelim "[-<>]\{4,}" contains=takoutSectionTitle
+syn match takoutSectionDelim ":\=\.\{4,}:\=" contains=takoutSectionTitle
+syn match takoutSectionTitle "[-<:] \w[0-9A-Za-z_() ]\+ [->:]"hs=s+1,me=e-1
+
+syn match takoutHeaderDelim "=\{5,}"
+syn match takoutHeaderDelim "|\{5,}"
+syn match takoutHeaderDelim "+\{5,}"
+
+syn match takoutLabel "Input File:" contains=takoutFile
+syn match takoutLabel "Begin Solution: Routine"
+
+syn match takoutError "<<< Error >>>"
+
+
+" Define the default highlighting
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/tap.vim b/runtime/syntax/tap.vim
new file mode 100644
index 0000000..6b00b1d
--- /dev/null
+++ b/runtime/syntax/tap.vim
@@ -0,0 +1,86 @@
+" Vim syntax file
+" Language: Verbose TAP Output
+" Maintainer: Rufus Cable <rufus@threebytesfull.com>
+" Remark: Simple syntax highlighting for TAP output
+" License: Vim License (see :help license)
+" Copyright: (c) 2008-2013 Rufus Cable
+" Last Change: 2020 Mar 15
+
+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 /\c\(# TODO\|Failed (TODO)\) .*$/ contained contains=tapTestTodoRev
+syn match tapTestTodoRev /\c\<TODO\>/ contained
+
+" highlight skipped tests
+syn match tapTestSkip /\c# skip .*$/ contained contains=tapTestSkipTag
+syn match tapTestSkipTag /\c\(# \)\@<=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=/^$/
+
+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/tar.vim b/runtime/syntax/tar.vim
new file mode 100644
index 0000000..815c221
--- /dev/null
+++ b/runtime/syntax/tar.vim
@@ -0,0 +1,19 @@
+" Language : Tar Listing Syntax
+" Maintainer : Bram Moolenaar
+" Last change: Sep 08, 2004
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match tarComment '^".*' contains=tarFilename
+syn match tarFilename 'tarfile \zs.*' contained
+syn match tarDirectory '.*/$'
+
+hi def link tarComment Comment
+hi def link tarFilename Constant
+hi def link tarDirectory Type
+
+let b:current_syntax = 'tar'
+
+" vim: ts=8
diff --git a/runtime/syntax/taskdata.vim b/runtime/syntax/taskdata.vim
new file mode 100644
index 0000000..63a8284
--- /dev/null
+++ b/runtime/syntax/taskdata.vim
@@ -0,0 +1,45 @@
+" Vim syntax file
+" Language: task data
+" Maintainer: John Florian <jflorian@doubledog.org>
+" Updated: Wed Jul 8 19:46:20 EDT 2009
+
+
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Key Names for values.
+syn keyword taskdataKey description due end entry imask mask parent
+syn keyword taskdataKey priority project recur start status tags uuid
+syn match taskdataKey "annotation_\d\+"
+syn match taskdataUndo "^time.*$"
+syn match taskdataUndo "^\(old \|new \|---\)"
+
+" Values associated with key names.
+"
+" Strings
+syn region taskdataString matchgroup=Normal start=+"+ end=+"+
+ \ contains=taskdataEncoded,taskdataUUID,@Spell
+"
+" Special Embedded Characters (e.g., "&comma;")
+syn match taskdataEncoded "&\a\+;" contained
+" UUIDs
+syn match taskdataUUID "\x\{8}-\(\x\{4}-\)\{3}\x\{12}" contained
+
+
+" The default methods for highlighting. Can be overridden later.
+hi def link taskdataEncoded Function
+hi def link taskdataKey Statement
+hi def link taskdataString String
+hi def link taskdataUUID Special
+hi def link taskdataUndo Type
+
+let b:current_syntax = "taskdata"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:noexpandtab
diff --git a/runtime/syntax/taskedit.vim b/runtime/syntax/taskedit.vim
new file mode 100644
index 0000000..d33ca78
--- /dev/null
+++ b/runtime/syntax/taskedit.vim
@@ -0,0 +1,37 @@
+" Vim syntax file
+" Language: support for 'task 42 edit'
+" Maintainer: John Florian <jflorian@doubledog.org>
+" Updated: Wed Jul 8 19:46:32 EDT 2009
+
+
+" quit when a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+syn match taskeditHeading "^\s*#\s*Name\s\+Editable details\s*$" contained
+syn match taskeditHeading "^\s*#\s*-\+\s\+-\+\s*$" contained
+syn match taskeditReadOnly "^\s*#\s*\(UU\)\?ID:.*$" contained
+syn match taskeditReadOnly "^\s*#\s*Status:.*$" contained
+syn match taskeditReadOnly "^\s*#\s*i\?Mask:.*$" contained
+syn match taskeditKey "^ *.\{-}:" nextgroup=taskeditString
+syn match taskeditComment "^\s*#.*$"
+ \ contains=taskeditReadOnly,taskeditHeading
+syn match taskeditString ".*$" contained contains=@Spell
+
+
+" The default methods for highlighting. Can be overridden later.
+hi def link taskeditComment Comment
+hi def link taskeditHeading Function
+hi def link taskeditKey Statement
+hi def link taskeditReadOnly Special
+hi def link taskeditString String
+
+let b:current_syntax = "taskedit"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
+" vim:noexpandtab
diff --git a/runtime/syntax/tasm.vim b/runtime/syntax/tasm.vim
new file mode 100644
index 0000000..1d6e570
--- /dev/null
+++ b/runtime/syntax/tasm.vim
@@ -0,0 +1,115 @@
+" Vim syntax file
+" Language: TASM: turbo assembler by Borland
+" Maintaner: FooLman of United Force <foolman@bigfoot.com>
+" Last Change: 2012 Feb 03 by Thilo Six, and 2018 Nov 27.
+
+" 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
+syn match tasmLabel "^[\ \t]*[@a-z_$][a-z0-9_$@]*\ *:"
+syn keyword tasmDirective ALIAS ALIGN ARG ASSUME %BIN CATSRT CODESEG
+syn match tasmDirective "\<\(byte\|word\|dword\|qword\)\ ptr\>"
+" CALL extended syntax
+syn keyword tasmDirective COMM %CONDS CONST %CREF %CREFALL %CREFREF
+syn keyword tasmDirective %CREFUREF %CTLS DATASEG DB DD %DEPTH DF DISPLAY
+syn keyword tasmDirective DOSSEG DP DQ DT DW ELSE EMUL END ENDIF
+" IF XXXX
+syn keyword tasmDirective ENDM ENDP ENDS ENUM EQU ERR EVEN EVENDATA EXITCODE
+syn keyword tasmDirective EXITM EXTRN FARDATA FASTIMUL FLIPFLAG GETFIELD GLOBAL
+syn keyword tasmDirective GOTO GROUP IDEAL %INCL INCLUDE INCLUDELIB INSTR IRP
+"JMP
+syn keyword tasmDirective IRPC JUMPS LABEL LARGESTACK %LINUM %LIST LOCAL
+syn keyword tasmDirective LOCALS MACRO %MACS MASKFLAG MASM MASM51 MODEL
+syn keyword tasmDirective MULTERRS NAME %NEWPAGE %NOCONDS %NOCREF %NOCTLS
+syn keyword tasmDirective NOEMUL %NOINCL NOJUMPS %NOLIST NOLOCALS %NOMACS
+syn keyword tasmDirective NOMASM51 NOMULTERRS NOSMART %NOSYMS %NOTRUNC NOWARN
+syn keyword tasmDirective %PAGESIZE %PCNT PNO87 %POPLCTL POPSTATE PROC PROCDESC
+syn keyword tasmDirective PROCTYPE PUBLIC PUBLICDLL PURGE %PUSHCTL PUSHSTATE
+"rept, ret
+syn keyword tasmDirective QUIRKS RADIX RECORD RETCODE SEGMENT SETFIELD
+syn keyword tasmDirective SETFLAG SIZESTR SMALLSTACK SMART STACK STARTUPCODE
+syn keyword tasmDirective STRUC SUBSTR %SUBTTL %SYMS TABLE %TABSIZE TBLINIT
+syn keyword tasmDirective TBLINST TBLPTR TESTFLAG %TEXT %TITLE %TRUNC TYPEDEF
+syn keyword tasmDirective UDATASEG UFARDATA UNION USES VERSION WAR WHILE ?DEBUG
+
+syn keyword tasmInstruction AAA AAD AAM AAS ADC ADD AND ARPL BOUND BSF BSR
+syn keyword tasmInstruction BSWAP BT BTC BTR BTS CALL CBW CLC CLD CLI CLTS
+syn keyword tasmInstruction CMC CMP CMPXCHG CMPXCHG8B CPUID CWD CDQ CWDE
+syn keyword tasmInstruction DAA DAS DEC DIV ENTER RETN RETF F2XM1
+syn keyword tasmCoprocInstr FABS FADD FADDP FBLD FBSTP FCHG FCOM FCOM2 FCOMI
+syn keyword tasmCoprocInstr FCOMIP FCOMP FCOMP3 FCOMP5 FCOMPP FCOS FDECSTP
+syn keyword tasmCoprocInstr FDISI FDIV FDIVP FDIVR FENI FFREE FFREEP FIADD
+syn keyword tasmCoprocInstr FICOM FICOMP FIDIV FIDIVR FILD FIMUL FINIT FINCSTP
+syn keyword tasmCoprocInstr FIST FISTP FISUB FISUBR FLD FLD1 FLDCW FLDENV
+syn keyword tasmCoprocInstr FLDL2E FLDL2T FLDLG2 FLDLN2 FLDPI FLDZ FMUL FMULP
+syn keyword tasmCoprocInstr FNCLEX FNINIT FNOP FNSAVE FNSTCW FNSTENV FNSTSW
+syn keyword tasmCoprocInstr FPATAN FPREM FPREM1 FPTAN FRNDINT FRSTOR FSCALE
+syn keyword tasmCoprocInstr FSETPM FSIN FSINCOM FSQRT FST FSTP FSTP1 FSTP8
+syn keyword tasmCoprocInstr FSTP9 FSUB FSUBP FSUBR FSUBRP FTST FUCOM FUCOMI
+syn keyword tasmCoprocInstr FUCOMPP FWAIT FXAM FXCH FXCH4 FXCH7 FXTRACT FYL2X
+syn keyword tasmCoprocInstr FYL2XP1 FSTCW FCHS FSINCOS
+syn keyword tasmInstruction IDIV IMUL IN INC INT INTO INVD INVLPG IRET JMP
+syn keyword tasmInstruction LAHF LAR LDS LEA LEAVE LES LFS LGDT LGS LIDT LLDT
+syn keyword tasmInstruction LMSW LOCK LODSB LSL LSS LTR MOV MOVSX MOVZX MUL
+syn keyword tasmInstruction NEG NOP NOT OR OUT POP POPA POPAD POPF POPFD PUSH
+syn keyword tasmInstruction PUSHA PUSHAD PUSHF PUSHFD RCL RCR RDMSR RDPMC RDTSC
+syn keyword tasmInstruction REP RET ROL ROR RSM SAHF SAR SBB SGDT SHL SAL SHLD
+syn keyword tasmInstruction SHR SHRD SIDT SMSW STC STD STI STR SUB TEST VERR
+syn keyword tasmInstruction VERW WBINVD WRMSR XADD XCHG XLAT XOR
+syn keyword tasmMMXinst EMMS MOVD MOVQ PACKSSDW PACKSSWB PACKUSWB PADDB
+syn keyword tasmMMXinst PADDD PADDSB PADDSB PADDSW PADDUSB PADDUSW PADDW
+syn keyword tasmMMXinst PAND PANDN PCMPEQB PCMPEQD PCMPEQW PCMPGTB PCMPGTD
+syn keyword tasmMMXinst PCMPGTW PMADDWD PMULHW PMULLW POR PSLLD PSLLQ
+syn keyword tasmMMXinst PSLLW PSRAD PSRAW PSRLD PSRLQ PSRLW PSUBB PSUBD
+syn keyword tasmMMXinst PSUBSB PSUBSW PSUBUSB PSUBUSW PSUBW PUNPCKHBW
+syn keyword tasmMMXinst PUNPCKHBQ PUNPCKHWD PUNPCKLBW PUNPCKLDQ PUNPCKLWD
+syn keyword tasmMMXinst PXOR
+"FCMOV
+syn match tasmInstruction "\<\(CMPS\|MOVS\|OUTS\|SCAS\|STOS\|LODS\|INS\)[BWD]"
+syn match tasmInstruction "\<\(CMOV\|SET\|J\)N\=[ABCGLESXZ]\>"
+syn match tasmInstruction "\<\(CMOV\|SET\|J\)N\=[ABGL]E\>"
+syn match tasmInstruction "\<\(LOOP\|REP\)N\=[EZ]\=\>"
+syn match tasmRegister "\<[A-D][LH]\>"
+syn match tasmRegister "\<E\=\([A-D]X\|[SD]I\|[BS]P\)\>"
+syn match tasmRegister "\<[C-GS]S\>"
+syn region tasmComment start=";" end="$"
+"HACK! comment ? ... selection
+syn region tasmComment start="comment \+\$" end="\$"
+syn region tasmComment start="comment \+\~" end="\~"
+syn region tasmComment start="comment \+#" end="#"
+syn region tasmString start="'" end="'"
+syn region tasmString start='"' end='"'
+
+syn match tasmDec "\<-\=[0-9]\+\.\=[0-9]*\>"
+syn match tasmHex "\<[0-9][0-9A-F]*H\>"
+syn match tasmOct "\<[0-7]\+O\>"
+syn match tasmBin "\<[01]\+B\>"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "tasm"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/tcl.vim b/runtime/syntax/tcl.vim
new file mode 100644
index 0000000..59cb04f
--- /dev/null
+++ b/runtime/syntax/tcl.vim
@@ -0,0 +1,274 @@
+" Vim syntax file
+" Language: Tcl/Tk
+" Maintainer: Taylor Venable <taylor@metasyntax.net>
+" (previously Brett Cannon <brett@python.org>)
+" (previously Dean Copsey <copsey@cs.ucdavis.edu>)
+" (previously Matt Neumann <mattneu@purpleturtle.com>)
+" (previously Allan Kelly <allan@fruitloaf.co.uk>)
+" Original: Robin Becker <robin@jessikat.demon.co.uk>
+" Last Change: 2021 Nov 16
+" Version: 1.14 plus improvements from PR #8948
+" URL: (removed, no longer worked)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Basic Tcl commands: http://www.tcl.tk/man/tcl8.6/TclCmd/contents.htm
+syn keyword tclCommand after append array bgerror binary cd chan clock close concat
+syn keyword tclCommand dde dict encoding eof error eval exec exit expr fblocked
+syn keyword tclCommand fconfigure fcopy file fileevent flush format gets glob
+syn keyword tclCommand global history http incr info interp join lappend lassign
+syn keyword tclCommand lindex linsert list llength lmap load lrange lrepeat
+syn keyword tclCommand lreplace lreverse lsearch lset lsort memory my namespace
+syn keyword tclCommand next nextto open package pid puts pwd read refchan regexp
+syn keyword tclCommand registry regsub rename scan seek self set socket source
+syn keyword tclCommand split string subst tell time trace unknown unload unset
+syn keyword tclCommand update uplevel upvar variable vwait
+
+" The 'Tcl Standard Library' commands: http://www.tcl.tk/man/tcl8.6/TclCmd/library.htm
+syn keyword tclCommand auto_execok auto_import auto_load auto_mkindex auto_reset
+syn keyword tclCommand auto_qualify tcl_findLibrary parray tcl_endOfWord
+syn keyword tclCommand tcl_startOfNextWord tcl_startOfPreviousWord
+syn keyword tclCommand tcl_wordBreakAfter tcl_wordBreakBefore
+
+" Global variables used by Tcl: http://www.tcl.tk/man/tcl8.6/TclCmd/tclvars.htm
+syn keyword tclVars auto_path env errorCode errorInfo tcl_library tcl_patchLevel
+syn keyword tclVars tcl_pkgPath tcl_platform tcl_precision tcl_rcFileName
+syn keyword tclVars tcl_traceCompile tcl_traceExec tcl_wordchars
+syn keyword tclVars tcl_nonwordchars tcl_version argc argv argv0 tcl_interactive
+
+" Strings which expr accepts as boolean values, aside from zero / non-zero.
+syn keyword tclBoolean true false on off yes no
+
+syn keyword tclProcCommand apply coroutine proc return tailcall yield yieldto
+syn keyword tclConditional if then else elseif switch
+syn keyword tclConditional catch try throw finally
+syn keyword tclLabel default
+syn keyword tclRepeat while for foreach break continue
+
+syn keyword tcltkSwitch contained insert create polygon fill outline tag
+
+" WIDGETS
+" commands associated with widgets
+syn keyword tcltkWidgetSwitch contained background highlightbackground insertontime cget
+syn keyword tcltkWidgetSwitch contained selectborderwidth borderwidth highlightcolor insertwidth
+syn keyword tcltkWidgetSwitch contained selectforeground cursor highlightthickness padx setgrid
+syn keyword tcltkWidgetSwitch contained exportselection insertbackground pady takefocus
+syn keyword tcltkWidgetSwitch contained font insertborderwidth relief xscrollcommand
+syn keyword tcltkWidgetSwitch contained foreground insertofftime selectbackground yscrollcommand
+syn keyword tcltkWidgetSwitch contained height spacing1 spacing2 spacing3
+syn keyword tcltkWidgetSwitch contained state tabs width wrap
+" button
+syn keyword tcltkWidgetSwitch contained command default
+" canvas
+syn keyword tcltkWidgetSwitch contained closeenough confine scrollregion xscrollincrement yscrollincrement orient
+" checkbutton, radiobutton
+syn keyword tcltkWidgetSwitch contained indicatoron offvalue onvalue selectcolor selectimage state variable
+" entry, frame
+syn keyword tcltkWidgetSwitch contained show class colormap container visual
+" listbox, menu
+syn keyword tcltkWidgetSwitch contained selectmode postcommand selectcolor tearoff tearoffcommand title type
+" menubutton, message
+syn keyword tcltkWidgetSwitch contained direction aspect justify
+" scale
+syn keyword tcltkWidgetSwitch contained bigincrement digits from length resolution showvalue sliderlength sliderrelief tickinterval to
+" scrollbar
+syn keyword tcltkWidgetSwitch contained activerelief elementborderwidth
+" image
+syn keyword tcltkWidgetSwitch contained delete names types create
+" variable reference
+ " ::optional::namespaces
+syn match tclVarRef "$\(\(::\)\?\([[:alnum:]_]*::\)*\)\a[[:alnum:]_]*"
+ " ${...} may contain any character except '}'
+syn match tclVarRef "${[^}]*}"
+
+" Used to facilitate hack to utilize string background for certain color
+" schemes, e.g. inkpot and lettuce.
+syn cluster tclVarRefC add=tclVarRef
+syn cluster tclSpecialC add=tclSpecial
+
+" The syntactic unquote-splicing replacement for [expand].
+syn match tclExpand '\s{\*}'
+syn match tclExpand '^{\*}'
+
+" menu, mane add
+syn keyword tcltkWidgetSwitch contained active end last none cascade checkbutton command radiobutton separator
+syn keyword tcltkWidgetSwitch contained activebackground actveforeground accelerator background bitmap columnbreak
+syn keyword tcltkWidgetSwitch contained font foreground hidemargin image indicatoron label menu offvalue onvalue
+syn keyword tcltkWidgetSwitch contained selectcolor selectimage state underline value variable
+syn keyword tcltkWidgetSwitch contained add clone configure delete entrycget entryconfigure index insert invoke
+syn keyword tcltkWidgetSwitch contained post postcascade type unpost yposition activate
+"syn keyword tcltkWidgetSwitch contained
+"syn match tcltkWidgetSwitch contained
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<button\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<scale\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<canvas\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<checkbutton\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<entry\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<frame\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<image\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<listbox\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<menubutton\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<message\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<radiobutton\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\<scrollbar\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+" These words are dual purpose.
+" match switches
+"syn match tcltkWidgetSwitch contained "-text"hs=s+1
+syn match tcltkWidgetSwitch contained "-text\(var\)\?"hs=s+1
+syn match tcltkWidgetSwitch contained "-menu"hs=s+1
+syn match tcltkWidgetSwitch contained "-label"hs=s+1
+" match commands - 2 lines for pretty match.
+"variable
+" Special case - If a number follows a variable region, it must be at the end of
+" the pattern, by definition. Therefore, (1) either include a number as the region
+" end and exclude tclNumber from the contains list, or (2) make variable
+" keepend. As (1) would put variable out of step with everything else, use (2).
+syn region tcltkCommand matchgroup=tcltkCommandColor start="^\<variable\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tclString,tclNumber,tclVarRef,tcltkCommand
+syn region tcltkCommand matchgroup=tcltkCommandColor start="\s\<variable\>\|\[\<variable\>"hs=s+1 matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tclString,tclNumber,tclVarRef,tcltkCommand
+" menu
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="^\<menu\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\s\<menu\>\|\[\<menu\>"hs=s+1 matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+" label
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="^\<label\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\s\<label\>\|\[\<label\>"hs=s+1 matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+" text
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="^\<text\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidget,tcltkWidgetSwitch,tcltkSwitch,tclNumber,tclVarRef,tclString
+syn region tcltkWidget matchgroup=tcltkWidgetColor start="\s\<text\>\|\[\<text\>"hs=s+1 matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidget,tcltkWidgetSwitch,tclString,tcltkSwitch,tclNumber,tclVarRef
+
+" This isn't contained (I don't think) so it's OK to just associate with the Color group.
+" TODO: This could be wrong.
+syn keyword tcltkWidgetColor toplevel
+
+
+syn region tcltkPackConf matchgroup=tcltkPackConfColor start="\<configure\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tcltkPackConfSwitch,tclNumber,tclVarRef keepend
+syn region tcltkPackConf matchgroup=tcltkPackConfColor start="\<cget\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"me=e-1 contains=tclLineContinue,tcltkWidgetSwitch,tclString,tcltkSwitch,tcltkPackConfSwitch,tclNumber,tclVarRef
+
+
+" NAMESPACE
+" commands associated with namespace
+syn keyword tcltkNamespaceSwitch contained children code current delete eval
+syn keyword tcltkNamespaceSwitch contained export forget import inscope origin
+syn keyword tcltkNamespaceSwitch contained parent qualifiers tail which command variable
+syn region tcltkCommand matchgroup=tcltkCommandColor start="\<namespace\>" matchgroup=NONE skip="^\s*$" end="{\|}\|]\|\"\|[^\\]*\s*$"me=e-1 contains=tclLineContinue,tcltkNamespaceSwitch
+
+" EXPR
+" commands associated with expr
+syn keyword tcltkMaths contained abs acos asin atan atan2 bool ceil cos cosh double entier
+syn keyword tcltkMaths contained exp floor fmod hypot int isqrt log log10 max min pow rand
+syn keyword tcltkMaths contained round sin sinh sqrt srand tan tanh wide
+
+syn region tcltkCommand matchgroup=tcltkCommandColor start="\<expr\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"me=e-1 contains=tclLineContinue,tcltkMaths,tclNumber,tclVarRef,tclString,tcltlWidgetSwitch,tcltkCommand,tcltkPackConf
+
+" format
+syn region tcltkCommand matchgroup=tcltkCommandColor start="\<format\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"me=e-1 contains=tclLineContinue,tcltkMaths,tclNumber,tclVarRef,tclString,tcltlWidgetSwitch,tcltkCommand,tcltkPackConf
+
+" PACK
+" commands associated with pack
+syn keyword tcltkPackSwitch contained forget info propagate slaves
+syn keyword tcltkPackConfSwitch contained after anchor before expand fill in ipadx ipady padx pady side
+syn region tcltkCommand matchgroup=tcltkCommandColor start="\<pack\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkPackSwitch,tcltkPackConf,tcltkPackConfSwitch,tclNumber,tclVarRef,tclString,tcltkCommand keepend
+
+" STRING
+" commands associated with string
+syn keyword tcltkStringSwitch contained compare first index last length match range tolower toupper trim trimleft trimright wordstart wordend
+syn region tcltkCommand matchgroup=tcltkCommandColor start="\<string\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkStringSwitch,tclNumber,tclVarRef,tclString,tcltkCommand
+
+" ARRAY
+" commands associated with array
+syn keyword tcltkArraySwitch contained anymore donesearch exists get names nextelement size startsearch set
+" match from command name to ] or EOL
+syn region tcltkCommand matchgroup=tcltkCommandColor start="\<array\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkArraySwitch,tclNumber,tclVarRef,tclString,tcltkCommand
+
+" LSORT
+" switches for lsort
+syn keyword tcltkLsortSwitch contained ascii dictionary integer real command increasing decreasing index
+" match from command name to ] or EOL
+syn region tcltkCommand matchgroup=tcltkCommandColor start="\<lsort\>" matchgroup=NONE skip="^\s*$" end="]\|[^\\]*\s*$"he=e-1 contains=tclLineContinue,tcltkLsortSwitch,tclNumber,tclVarRef,tclString,tcltkCommand
+
+syn keyword tclTodo contained TODO
+
+" Sequences which are backslash-escaped: http://www.tcl.tk/man/tcl8.5/TclCmd/Tcl.htm#M16
+" Octal, hexadecimal, Unicode codepoints, and the classics.
+" Tcl takes as many valid characters in a row as it can, so \xAZ in a string is newline followed by 'Z'.
+syn match tclSpecial contained '\\\(\o\{1,3}\|x\x\{1,2}\|u\x\{1,4}\|[abfnrtv]\)'
+syn match tclSpecial contained '\\[\[\]\{\}\"\$]'
+
+" Command appearing inside another command or inside a string.
+syn region tclEmbeddedStatement start='\[' end='\]' contained contains=tclCommand,tclNumber,tclLineContinue,tclString,tclVarRef,tclEmbeddedStatement
+" A string needs the skip argument as it may legitimately contain \".
+" Match at start of line
+syn region tclString start=+^"+ end=+"+ contains=@tclSpecialC,@Spell skip=+\\\\\|\\"+
+"Match all other legal strings.
+syn region tclString start=+[^\\]"+ms=s+1 end=+"+ contains=@tclSpecialC,@tclVarRefC,tclEmbeddedStatement,@Spell skip=+\\\\\|\\"+
+
+" Line continuation is backslash immediately followed by newline.
+syn match tclLineContinue '\\$'
+
+if exists('g:tcl_warn_continuation')
+ syn match tclNotLineContinue '\\\s\+$'
+endif
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match tclNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+"floating point number, with dot, optional exponent
+syn match tclNumber "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, starting with a dot, optional exponent
+syn match tclNumber "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match tclNumber "\<\d\+e[-+]\=\d\+[fl]\=\>"
+"hex number
+syn match tclNumber "0x\x\+\(u\=l\=\|lu\)\>"
+"syn match tclIdentifier "\<\h\w*\>"
+syn case match
+
+syn region tclComment start="^\s*\#" skip="\\$" end="$" contains=tclTodo,@Spell
+syn region tclComment start=/;\s*\#/hs=s+1 skip="\\$" end="$" contains=tclTodo,@Spell
+
+"syn match tclComment /^\s*\#.*$/
+"syn match tclComment /;\s*\#.*$/hs=s+1
+
+"syn sync ccomment tclComment
+
+" Define the default highlighting.
+" 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')
+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"
+
+" vim: ts=8 noet nolist
diff --git a/runtime/syntax/tcsh.vim b/runtime/syntax/tcsh.vim
new file mode 100644
index 0000000..6837125
--- /dev/null
+++ b/runtime/syntax/tcsh.vim
@@ -0,0 +1,255 @@
+" Vim syntax file
+" Language: tcsh scripts
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Previous Maintainer: Gautam Iyer <gi1242+vim@NoSpam.com> where NoSpam=gmail (Original Author)
+" Last Change: 2021 Oct 15
+
+" Description: We break up each statement into a "command" and an "end" part.
+" All groups are either a "command" or part of the "end" of a statement (ie
+" everything after the "command"). This is because blindly highlighting tcsh
+" statements as keywords caused way too many false positives. Eg:
+"
+" set history=200
+"
+" causes history to come up as a keyword, which we want to avoid.
+
+" Quit when a syntax file was already loaded
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:oldcpo = &cpo
+set cpo&vim " Line continuation is used
+
+syn iskeyword @,48-57,_,192-255,-
+
+syn case match
+
+" ----- Clusters ----- {{{1
+syn cluster tcshModifiers contains=tcshModifier,tcshModifierError
+syn cluster tcshQuoteList contains=tcshDQuote,tcshSQuote,tcshBQuote
+syn cluster tcshStatementEnds contains=@tcshQuoteList,tcshComment,@tcshVarList,tcshRedir,tcshMeta,tcshHereDoc,tcshSpecial,tcshArgument
+syn cluster tcshStatements contains=tcshBuiltin,tcshCommands,tcshIf,tcshWhile
+syn cluster tcshVarList contains=tcshUsrVar,tcshArgv,tcshSubst
+syn cluster tcshConditions contains=tcshCmdSubst,tcshParenExpr,tcshOperator,tcshNumber,@tcshVarList
+
+" ----- Errors ----- {{{1
+" Define first, so can be easily overridden.
+syn match tcshError contained '\v\S.+'
+
+" ----- Statements ----- {{{1
+" Tcsh commands: Any filename / modifiable variable (must be first!)
+syn match tcshCommands '\v[a-zA-Z0-9\\./_$:-]+' contains=tcshSpecial,tcshUsrVar,tcshArgv,tcshVarError nextgroup=tcshStatementEnd
+
+" Builtin commands except those treated specially. Currently (un)set(env),
+" (un)alias, if, while, else, bindkey
+syn keyword tcshBuiltin nextgroup=tcshStatementEnd alloc bg break breaksw builtins bye case cd chdir complete continue default dirs echo echotc end endif endsw eval exec exit fg filetest foreach getspath getxvers glob goto hashstat history hup inlib jobs kill limit log login logout ls ls-F migrate newgrp nice nohup notify onintr popd printenv pushd rehash repeat rootnode sched setpath setspath settc setty setxvers shift source stop suspend switch telltc termname time umask uncomplete unhash universe unlimit ver wait warp watchlog where which
+
+" StatementEnd is anything after a built-in / command till the lexical end of a
+" statement (;, |, ||, |&, && or end of line)
+syn region tcshStatementEnd transparent contained matchgroup=tcshBuiltin start='' end='\v\\@<!(;|\|[|&]?|\&\&|$)' contains=@tcshStatementEnds
+
+" set expressions (Contains shell variables)
+syn keyword tcshShellVar contained addsuffix afsuser ampm anyerror argv autocorrect autoexpand autolist autologout autorehash backslash_quote catalog cdpath cdtohome color colorcat command compat_expr complete continue continue_args correct csubstnonl cwd dextract dirsfile dirstack dspmbyte dunique echo echo_style edit editors ellipsis euid euser fignore filec gid globdot globstar group highlight histchars histdup histfile histlit history home ignoreeof implicitcd inputmode killdup killring listflags listjobs listlinks listmax listmaxrows loginsh logout mail matchbeep nobeep noclobber noding noglob nokanji nonomatch nostat notify oid owd padhour parseoctal path printexitvalue prompt prompt2 prompt3 promptchars pushdtohome pushdsilent recexact recognize_only_executables rmstar rprompt savedirs savehist sched shell shlvl status symlinks tcsh term time tperiod tty uid user verbose version vimode visiblebell watch who wordchars
+syn keyword tcshBuiltin nextgroup=tcshSetEnd set unset
+syn region tcshSetEnd contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$\|;' contains=tcshShellVar,@tcshStatementEnds
+
+" setenv expressions (Contains environment variables)
+syn keyword tcshEnvVar contained AFSUSER COLUMNS DISPLAY EDITOR GROUP HOME HOST HOSTTYPE HPATH LANG LC_CTYPE LINES LS_COLORS MACHTYPE NOREBIND OSTYPE PATH PWD REMOTEHOST SHLVL SYSTYPE TERM TERMCAP USER VENDOR VISUAL
+syn keyword tcshBuiltin nextgroup=tcshEnvEnd setenv unsetenv
+syn region tcshEnvEnd contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$\|;' contains=tcshEnvVar,@tcshStatementEnds
+
+" alias and unalias (contains special aliases)
+syn keyword tcshAliases contained beepcmd cwdcmd jobcmd helpcommand periodic precmd postcmd shell
+syn keyword tcshBuiltin nextgroup=tcshAliCmd skipwhite alias unalias
+syn match tcshAliCmd contained nextgroup=tcshAliEnd skipwhite '\v(\w|-)+' contains=tcshAliases
+syn region tcshAliEnd contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$\|;' contains=@tcshStatementEnds
+
+" if statements
+syn keyword tcshIf nextgroup=tcshIfEnd skipwhite if
+syn region tcshIfEnd contained start='\S' skip='\\$' matchgroup=tcshBuiltin end='\v<then>|$' contains=@tcshConditions,tcshSpecial,@tcshStatementEnds
+syn region tcshIfEnd contained matchgroup=tcshBuiltin contains=@tcshConditions,tcshSpecial start='(' end='\v\)%(\s+then>)?' skipwhite nextgroup=@tcshStatementEnds
+syn region tcshIfEnd contained matchgroup=tcshBuiltin contains=tcshCommands,tcshSpecial start='\v\{\s+' end='\v\s+\}%(\s+then>)?' skipwhite nextgroup=@tcshStatementEnds keepend
+
+" else statements
+syn keyword tcshBuiltin nextgroup=tcshIf skipwhite else
+
+" while statements (contains expressions / operators)
+syn keyword tcshBuiltin nextgroup=@tcshConditions,tcshSpecial skipwhite while
+
+" Conditions (for if and while)
+syn region tcshParenExpr contained contains=@tcshConditions,tcshSpecial matchgroup=tcshBuiltin start='(' end=')'
+syn region tcshCmdSubst contained contains=tcshCommands matchgroup=tcshBuiltin start='\v\{\s+' end='\v\s+\}' keepend
+
+" Bindkey. Internal editor functions
+syn keyword tcshBindkeyFuncs contained backward-char backward-delete-char
+ \ backward-delete-word backward-kill-line backward-word
+ \ beginning-of-line capitalize-word change-case
+ \ change-till-end-of-line clear-screen complete-word
+ \ complete-word-fwd complete-word-back complete-word-raw
+ \ copy-prev-word copy-region-as-kill dabbrev-expand delete-char
+ \ delete-char-or-eof delete-char-or-list
+ \ delete-char-or-list-or-eof delete-word digit digit-argument
+ \ down-history downcase-word end-of-file end-of-line
+ \ exchange-point-and-mark expand-glob expand-history expand-line
+ \ expand-variables forward-char forward-word
+ \ gosmacs-transpose-chars history-search-backward
+ \ history-search-forward insert-last-word i-search-fwd
+ \ i-search-back keyboard-quit kill-line kill-region
+ \ kill-whole-line list-choices list-choices-raw list-glob
+ \ list-or-eof load-average magic-space newline newline-and-hold
+ \ newline-and-down-history normalize-path normalize-command
+ \ overwrite-mode prefix-meta quoted-insert redisplay
+ \ run-fg-editor run-help self-insert-command sequence-lead-in
+ \ set-mark-command spell-word spell-line stuff-char
+ \ toggle-literal-history transpose-chars transpose-gosling
+ \ tty-dsusp tty-flush-output tty-sigintr tty-sigquit tty-sigtsusp
+ \ tty-start-output tty-stop-output undefined-key
+ \ universal-argument up-history upcase-word
+ \ vi-beginning-of-next-word vi-add vi-add-at-eol vi-chg-case
+ \ vi-chg-meta vi-chg-to-eol vi-cmd-mode vi-cmd-mode-complete
+ \ vi-delprev vi-delmeta vi-endword vi-eword vi-char-back
+ \ vi-char-fwd vi-charto-back vi-charto-fwd vi-insert
+ \ vi-insert-at-bol vi-repeat-char-fwd vi-repeat-char-back
+ \ vi-repeat-search-fwd vi-repeat-search-back vi-replace-char
+ \ vi-replace-mode vi-search-back vi-search-fwd vi-substitute-char
+ \ vi-substitute-line vi-word-back vi-word-fwd vi-undo vi-zero
+ \ which-command yank yank-pop e_copy_to_clipboard
+ \ e_paste_from_clipboard e_dosify_next e_dosify_prev e_page_up
+ \ e_page_down
+syn keyword tcshBuiltin nextgroup=tcshBindkeyEnd bindkey
+syn region tcshBindkeyEnd contained transparent matchgroup=tcshBuiltin start='' skip='\\$' end='$' contains=@tcshQuoteList,tcshComment,@tcshVarList,tcshMeta,tcshSpecial,tcshArgument,tcshBindkeyFuncs
+
+" Expressions start with @.
+syn match tcshExprStart '\v\@\s+' nextgroup=tcshExprVar
+syn match tcshExprVar contained '\v\h\w*%(\[\d+\])?' contains=tcshShellVar,tcshEnvVar nextgroup=tcshExprOp
+syn match tcshExprOp contained '++\|--'
+syn match tcshExprOp contained '\v\s*\=' nextgroup=tcshExprEnd
+syn match tcshExprEnd contained '\v.*$'hs=e+1 contains=@tcshConditions
+syn match tcshExprEnd contained '\v.{-};'hs=e contains=@tcshConditions
+
+" ----- Comments: ----- {{{1
+syn match tcshComment '#\s.*' contains=tcshTodo,tcshCommentTi,@Spell
+syn match tcshComment '\v#($|\S.*)' contains=tcshTodo,tcshCommentTi
+syn match tcshSharpBang '^#! .*$'
+syn match tcshCommentTi contained '\v#\s*\u\w*(\s+\u\w*)*:'hs=s+1 contains=tcshTodo
+syn match tcshTodo contained '\v\c<todo>'
+
+" ----- Strings ----- {{{1
+" Tcsh does not allow \" in strings unless the "backslash_quote" shell
+" variable is set. Set the vim variable "tcsh_backslash_quote" to 0 if you
+" want VIM to assume that no backslash quote constructs exist.
+
+" Backquotes are treated as commands, and are not contained in anything
+if exists('tcsh_backslash_quote') && tcsh_backslash_quote == 0
+ syn region tcshSQuote keepend contained start="\v\\@<!'" end="'"
+ syn region tcshDQuote keepend contained start='\v\\@<!"' end='"' contains=@tcshVarList,tcshSpecial,@Spell
+ syn region tcshBQuote keepend start='\v\\@<!`' end='`' contains=@tcshStatements
+else
+ syn region tcshSQuote contained start="\v\\@<!'" skip="\v\\\\|\\'" end="'"
+ syn region tcshDQuote contained start='\v\\@<!"' end='"' contains=@tcshVarList,tcshSpecial,@Spell
+ syn region tcshBQuote keepend matchgroup=tcshBQuoteGrp start='\v\\@<!`' skip='\v\\\\|\\`' end='`' contains=@tcshStatements
+endif
+
+" ----- Variables ----- {{{1
+" Variable Errors. Must come first! \$ constructs will be flagged by
+" tcshSpecial, so we don't consider them here.
+syn match tcshVarError '\v\$\S*' contained
+
+" Modifiable Variables without {}.
+syn match tcshUsrVar contained '\v\$\h\w*%(\[\d+%(-\d+)?\])?' nextgroup=@tcshModifiers contains=tcshShellVar,tcshEnvVar
+syn match tcshArgv contained '\v\$%(\d+|\*)' nextgroup=@tcshModifiers
+
+" Modifiable Variables with {}.
+syn match tcshUsrVar contained '\v\$\{\h\w*%(\[\d+%(-\d+)?\])?%(:\S*)?\}' contains=@tcshModifiers,tcshShellVar,tcshEnvVar
+syn match tcshArgv contained '\v\$\{%(\d+|\*)%(:\S*)?\}' contains=@tcshModifiers
+
+" Un-modifiable Substitutions. Order is important here.
+syn match tcshSubst contained '\v\$[?#$!_<]' nextgroup=tcshModifierError
+syn match tcshSubst contained '\v\$[%#?]%(\h\w*|\d+)' nextgroup=tcshModifierError contains=tcshShellVar,tcshEnvVar
+syn match tcshSubst contained '\v\$\{[%#?]%(\h\w*|\d+)%(:\S*)?\}' contains=tcshModifierError contains=tcshShellVar,tcshEnvVar
+
+" Variable Name Expansion Modifiers (order important)
+syn match tcshModifierError contained '\v:\S*'
+syn match tcshModifier contained '\v:[ag]?[htreuls&qx]' nextgroup=@tcshModifiers
+
+" ----- Operators / Specials ----- {{{1
+" Standard redirects (except <<) [<, >, >>, >>&, >>!, >>&!]
+syn match tcshRedir contained '\v\<|\>\>?\&?!?'
+
+" Meta-chars
+syn match tcshMeta contained '\v[]{}*?[]'
+
+" Here documents (<<)
+syn region tcshHereDoc contained matchgroup=tcshShellVar start='\v\<\<\s*\z(\h\w*)' end='^\z1$' contains=@tcshVarList,tcshSpecial
+syn region tcshHereDoc contained matchgroup=tcshShellVar start="\v\<\<\s*'\z(\h\w*)'" start='\v\<\<\s*"\z(\h\w*)"$' start='\v\<\<\s*\\\z(\h\w*)$' end='^\z1$'
+
+" Operators
+syn match tcshOperator contained '&&\|!\~\|!=\|<<\|<=\|==\|=\~\|>=\|>>\|\*\|\^\|\~\|||\|!\|%\|&\|+\|-\|/\|<\|>\||'
+"syn match tcshOperator contained '[(){}]'
+
+" Numbers
+syn match tcshNumber contained '\v<-?\d+>'
+
+" Arguments
+syn match tcshArgument contained '\v\s@<=-(\w|-)*'
+
+" Special characters. \xxx, or backslashed characters.
+"syn match tcshSpecial contained '\v\\@<!\\(\d{3}|.)'
+syn match tcshSpecial contained '\v\\%([0-7]{3}|.)'
+
+" ----- Synchronising ----- {{{1
+if exists('tcsh_minlines')
+ if tcsh_minlines == 'fromstart'
+ syn sync fromstart
+ else
+ exec 'syn sync minlines=' . tcsh_minlines
+ endif
+else
+ syn sync minlines=100 " Some completions can be quite long
+endif
+
+" ----- Highlighting ----- {{{1
+" Define highlighting of syntax groups
+hi def link tcshError Error
+hi def link tcshBuiltin Statement
+hi def link tcshShellVar Preproc
+hi def link tcshEnvVar tcshShellVar
+hi def link tcshAliases tcshShellVar
+hi def link tcshAliCmd Identifier
+hi def link tcshCommands Identifier
+hi def link tcshIf tcshBuiltin
+hi def link tcshWhile tcshBuiltin
+hi def link tcshBindkeyFuncs Function
+hi def link tcshExprStart tcshBuiltin
+hi def link tcshExprVar tcshUsrVar
+hi def link tcshExprOp tcshOperator
+hi def link tcshExprEnd tcshOperator
+hi def link tcshComment Comment
+hi def link tcshCommentTi Preproc
+hi def link tcshSharpBang tcshCommentTi
+hi def link tcshTodo Todo
+hi def link tcshSQuote Constant
+hi def link tcshDQuote tcshSQuote
+hi def link tcshBQuoteGrp Include
+hi def link tcshVarError Error
+hi def link tcshUsrVar Type
+hi def link tcshArgv tcshUsrVar
+hi def link tcshSubst tcshUsrVar
+hi def link tcshModifier tcshArgument
+hi def link tcshModifierError tcshVarError
+hi def link tcshMeta tcshSubst
+hi def link tcshRedir tcshOperator
+hi def link tcshHereDoc tcshSQuote
+hi def link tcshOperator Operator
+hi def link tcshNumber Number
+hi def link tcshArgument Special
+hi def link tcshSpecial SpecialChar
+" }}}
+
+let &cpo = s:oldcpo
+unlet s:oldcpo
+
+let b:current_syntax = 'tcsh'
+
+" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
diff --git a/runtime/syntax/template.vim b/runtime/syntax/template.vim
new file mode 100644
index 0000000..5bf580f
--- /dev/null
+++ b/runtime/syntax/template.vim
@@ -0,0 +1,15 @@
+" Vim syntax file
+" Language: Generic template
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2019 May 06
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Known template types are very similar to HTML, E.g. golang and "Xfire User
+" Interface Template"
+" If you know how to recognize a more specific type for *.tmpl suggest a
+" change to runtime/scripts.vim.
+runtime! syntax/html.vim
diff --git a/runtime/syntax/teraterm.vim b/runtime/syntax/teraterm.vim
new file mode 100644
index 0000000..9115320
--- /dev/null
+++ b/runtime/syntax/teraterm.vim
@@ -0,0 +1,140 @@
+" Vim syntax file
+" Language: Tera Term Language (TTL)
+" Based on Tera Term Version 4.100
+" Maintainer: Ken Takata
+" URL: https://github.com/k-takata/vim-teraterm
+" Last Change: 2018-08-31
+" Filenames: *.ttl
+" License: VIM License
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+syn case ignore
+
+syn region ttlComment start=";" end="$" contains=@Spell
+syn region ttlComment start="/\*" end="\*/" contains=@Spell
+syn region ttlFirstComment start="/\*" end="\*/" contained contains=@Spell
+ \ nextgroup=ttlStatement,ttlFirstComment
+
+syn match ttlCharacter "#\%(\d\+\|\$\x\+\)\>"
+syn match ttlNumber "\%(\<\d\+\|\$\x\+\)\>"
+syn match ttlString "'[^']*'" contains=@Spell
+syn match ttlString '"[^"]*"' contains=@Spell
+syn cluster ttlConstant contains=ttlCharacter,ttlNumber,ttlString
+
+syn match ttlLabel ":\s*\w\{1,32}\>"
+
+syn keyword ttlOperator and or xor not
+
+syn match ttlVar "\<groupmatchstr\d\>"
+syn match ttlVar "\<param\d\>"
+syn keyword ttlVar inputstr matchstr paramcnt params result timeout mtimeout
+
+
+syn match ttlLine nextgroup=ttlStatement "^"
+syn match ttlStatement contained "\s*"
+ \ nextgroup=ttlIf,ttlElseIf,ttlConditional,ttlRepeat,
+ \ ttlFirstComment,ttlComment,ttlLabel,@ttlCommand
+
+syn cluster ttlCommand contains=ttlControlCommand,ttlCommunicationCommand,
+ \ ttlStringCommand,ttlFileCommand,ttlPasswordCommand,
+ \ ttlMiscCommand
+
+
+syn keyword ttlIf contained nextgroup=ttlIfExpression if
+syn keyword ttlElseIf contained nextgroup=ttlElseIfExpression elseif
+
+syn match ttlIfExpression contained "\s.*"
+ \ contains=@ttlConstant,ttlVar,ttlOperator,ttlComment,ttlThen,
+ \ @ttlCommand
+syn match ttlElseIfExpression contained "\s.*"
+ \ contains=@ttlConstant,ttlVar,ttlOperator,ttlComment,ttlThen
+
+syn keyword ttlThen contained then
+syn keyword ttlConditional contained else endif
+
+syn keyword ttlRepeat contained for next until enduntil while endwhile
+syn match ttlRepeat contained
+ \ "\<\%(do\|loop\)\%(\s\+\%(while\|until\)\)\?\>"
+syn keyword ttlControlCommand contained
+ \ break call continue end execcmnd exit goto include
+ \ mpause pause return
+
+
+syn keyword ttlCommunicationCommand contained
+ \ bplusrecv bplussend callmenu changedir clearscreen
+ \ closett connect cygconnect disconnect dispstr
+ \ enablekeyb flushrecv gethostname getmodemstatus
+ \ gettitle kmtfinish kmtget kmtrecv kmtsend loadkeymap
+ \ logautoclosemode logclose loginfo logopen logpause
+ \ logrotate logstart logwrite quickvanrecv
+ \ quickvansend recvln restoresetup scprecv scpsend
+ \ send sendbreak sendbroadcast sendfile sendkcode
+ \ 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
+ \ strcopy strinsert strjoin strlen strmatch strremove
+ \ strreplace strscan strspecial strsplit strtrim
+ \ tolower toupper
+syn keyword ttlFileCommand contained
+ \ basename dirname fileclose fileconcat filecopy
+ \ filecreate filedelete filelock filemarkptr fileopen
+ \ filereadln fileread filerename filesearch fileseek
+ \ fileseekback filestat filestrseek filestrseek2
+ \ filetruncate fileunlock filewrite filewriteln
+ \ findfirst findnext findclose foldercreate
+ \ folderdelete foldersearch getdir getfileattr makepath
+ \ setdir setfileattr
+syn keyword ttlPasswordCommand contained
+ \ delpassword getpassword ispassword passwordbox
+ \ setpassword
+syn keyword ttlMiscCommand contained
+ \ beep bringupbox checksum8 checksum8file checksum16
+ \ checksum16file checksum32 checksum32file closesbox
+ \ clipb2var crc16 crc16file crc32 crc32file exec
+ \ dirnamebox filenamebox getdate getenv getipv4addr
+ \ getipv6addr getspecialfolder gettime getttdir getver
+ \ ifdefined inputbox intdim listbox messagebox random
+ \ rotateleft rotateright setdate setdlgpos setenv
+ \ setexitcode settime show statusbox strdim uptime
+ \ var2clipb yesnobox
+
+
+hi def link ttlCharacter Character
+hi def link ttlNumber Number
+hi def link ttlComment Comment
+hi def link ttlFirstComment Comment
+hi def link ttlString String
+hi def link ttlLabel Label
+hi def link ttlIf Conditional
+hi def link ttlElseIf Conditional
+hi def link ttlThen Conditional
+hi def link ttlConditional Conditional
+hi def link ttlRepeat Repeat
+hi def link ttlControlCommand Keyword
+hi def link ttlVar Identifier
+hi def link ttlOperator Operator
+hi def link ttlCommunicationCommand Keyword
+hi def link ttlStringCommand Keyword
+hi def link ttlFileCommand Keyword
+hi def link ttlPasswordCommand Keyword
+hi def link ttlMiscCommand Keyword
+
+let b:current_syntax = "teraterm"
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: ts=8 sw=2 sts=2
diff --git a/runtime/syntax/terminfo.vim b/runtime/syntax/terminfo.vim
new file mode 100644
index 0000000..2b0ab08
--- /dev/null
+++ b/runtime/syntax/terminfo.vim
@@ -0,0 +1,93 @@
+" Vim syntax file
+" Language: terminfo(5) definition
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match terminfoKeywords '[,=#|]'
+
+syn keyword terminfoTodo contained TODO FIXME XXX NOTE
+
+syn region terminfoComment display oneline start='^#' end='$'
+ \ contains=terminfoTodo,@Spell
+
+syn match terminfoNumbers '\<[0-9]\+\>'
+
+syn match terminfoSpecialChar '\\\(\o\{3}\|[Eenlrtbfs^\,:0]\)'
+syn match terminfoSpecialChar '\^\a'
+
+syn match terminfoDelay '$<[0-9]\+>'
+
+syn keyword terminfoBooleans bw am bce ccc xhp xhpa cpix crxw xt xenl eo gn
+ \ hc chts km daisy hs hls in lpix da db mir
+ \ msgr nxon xsb npc ndscr nrrmc os mc5i xcpa
+ \ sam eslok hz ul xon
+
+syn keyword terminfoNumerics cols it lh lw lines lm xmc ma colors pairs wnum
+ \ ncv nlab pb vt wsl bitwin bitype bufsz btns
+ \ spinh spinv maddr mjump mcs npins orc orhi
+ \ orl orvi cps widcs
+
+syn keyword terminfoStrings acsc cbt bel cr cpi lpi chr cvr csr rmp tbc mgc
+ \ clear el1 el ed hpa cmdch cwin cup cud1 home
+ \ civis cub1 mrcup cnorm cuf1 ll cuu1 cvvis
+ \ defc dch1 dl1 dial dsl dclk hd enacs smacs
+ \ smam blink bold smcup smdc dim swidm sdrfq
+ \ smir sitm slm smicm snlq snrmq prot rev
+ \ invis sshm smso ssubm ssupm smul sum smxon
+ \ ech rmacs rmam sgr0 rmcup rmdc rwidm rmir
+ \ ritm rlm rmicm rshm rmso rsubm rsupm rmul
+ \ rum rmxon pause hook flash ff fsl wingo hup
+ \ is1 is2 is3 if iprog initc initp ich1 il1 ip
+ \ ka1 ka3 kb2 kbs kbeg kcbt kc1 kc3 kcan ktbc
+ \ kclr kclo kcmd kcpy kcrt kctab kdch1 kdl1
+ \ kcud1 krmir kend kent kel ked kext kfnd khlp
+ \ khome kich1 kil1 kcub1 kll kmrk kmsg kmov
+ \ knxt knp kopn kopt kpp kprv kprt krdo kref
+ \ krfr krpl krst kres kcuf1 ksav kBEG kCAN
+ \ kCMD kCPY kCRT kDC kDL kslt kEND kEOL kEXT
+ \ kind kFND kHLP kHOM kIC kLFT kMSG kMOV kNXT
+ \ kOPT kPRV kPRT kri kRDO kRPL kRIT kRES kSAV
+ \ kSPD khts kUND kspd kund kcuu1 rmkx smkx
+ \ lf0 lf1 lf10 lf2 lf3 lf4 lf5 lf6 lf7 lf8 lf9
+ \ fln rmln smln rmm smm mhpa mcud1 mcub1 mcuf1
+ \ mvpa mcuu1 nel porder oc op pad dch dl cud
+ \ mcud ich indn il cub mcub cuf mcuf rin cuu
+ \ mccu pfkey pfloc pfx pln mc0 mc5p mc4 mc5
+ \ pulse qdial rmclk rep rfi rs1 rs2 rs3 rf rc
+ \ vpa sc ind ri scs sgr setbsmgb smgbp sclk
+ \ scp setb setf smgl smglp smgr smgrp hts smgt
+ \ smgtp wind sbim scsd rbim rcsd subcs supcs
+ \ ht docr tsl tone uc hu u0 u1 u2 u3 u4 u5 u6
+ \ u7 u8 u9 wait xoffc xonc zerom scesa bicr
+ \ binel birep csnm csin colornm defbi devt
+ \ dispc endbi smpch smsc rmpch rmsc getm kmous
+ \ minfo pctrm pfxl reqmp scesc s0ds s1ds s2ds
+ \ s3ds setab setaf setcolor smglr slines smgtb
+ \ ehhlm elhlm erhlm ethlm evhlm sgr1 slengthsL
+syn match terminfoStrings display '\<kf\([0-9]\|[0-5][0-9]\|6[0-3]\)\>'
+
+syn match terminfoParameters '%[%dcspl+*/mAO&|^=<>!~i?te;-]'
+syn match terminfoParameters "%\('[A-Z]'\|{[0-9]\{1,2}}\|p[1-9]\|P[a-z]\|g[A-Z]\)"
+
+hi def link terminfoComment Comment
+hi def link terminfoTodo Todo
+hi def link terminfoNumbers Number
+hi def link terminfoSpecialChar SpecialChar
+hi def link terminfoDelay Special
+hi def link terminfoBooleans Type
+hi def link terminfoNumerics Type
+hi def link terminfoStrings Type
+hi def link terminfoParameters Keyword
+hi def link terminfoKeywords Keyword
+
+let b:current_syntax = "terminfo"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/tex.vim b/runtime/syntax/tex.vim
new file mode 100644
index 0000000..5544fb6
--- /dev/null
+++ b/runtime/syntax/tex.vim
@@ -0,0 +1,1352 @@
+" Vim syntax file
+" Language: TeX
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Apr 22, 2022
+" Version: 121
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_TEX
+"
+" Notes: {{{1
+"
+" 1. If you have a \begin{verbatim} that appears to overrun its boundaries,
+" use %stopzone.
+"
+" 2. Run-on equations ($..$ and $$..$$, particularly) can also be stopped
+" by suitable use of %stopzone.
+"
+" 3. If you have a slow computer, you may wish to modify
+"
+" syn sync maxlines=200
+" syn sync minlines=50
+"
+" to values that are more to your liking.
+"
+" 4. There is no match-syncing for $...$ and $$...$$; hence large
+" equation blocks constructed that way may exhibit syncing problems.
+" (there's no difference between begin/end patterns)
+"
+" 5. If you have the variable "g:tex_no_error" defined then none of the
+" lexical error-checking will be done.
+"
+" ie. let g:tex_no_error=1
+"
+" 6. Please see :help latex-syntax for information on
+" syntax folding :help tex-folding
+" spell checking :help tex-nospell
+" commands and mathzones :help tex-runon
+" new command highlighting :help tex-morecommands
+" error highlighting :help tex-error
+" new math groups :help tex-math
+" new styles :help tex-style
+" using conceal mode :help tex-conceal
+
+" Version Clears: {{{1
+" 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
+
+" by default, enable all region-based highlighting
+let s:tex_fast= "bcmMprsSvV"
+if exists("g:tex_fast")
+ if type(g:tex_fast) != 1
+ " g:tex_fast exists and is not a string, so
+ " turn off all optional region-based highighting
+ let s:tex_fast= ""
+ else
+ let s:tex_fast= g:tex_fast
+ endif
+endif
+
+" let user determine which classes of concealment will be supported
+" a=accents/ligatures d=delimiters m=math symbols g=Greek s=superscripts/subscripts
+if !exists("g:tex_conceal")
+ let s:tex_conceal= 'abdmgsS'
+else
+ let s:tex_conceal= g:tex_conceal
+endif
+if !exists("g:tex_superscripts")
+ 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,+-/().]'
+else
+ let s:tex_subscripts= g:tex_subscripts
+endif
+
+" Determine whether or not to use "*.sty" mode {{{1
+" The user may override the normal determination by setting
+" g:tex_stylish to 1 (for "*.sty" mode)
+" or to 0 else (normal "*.tex" mode)
+" or on a buffer-by-buffer basis with b:tex_stylish
+let s:extfname=expand("%:e")
+if exists("g:tex_stylish")
+ let b:tex_stylish= g:tex_stylish
+elseif !exists("b:tex_stylish")
+ if s:extfname == "sty" || s:extfname == "cls" || s:extfname == "clo" || s:extfname == "dtx" || s:extfname == "ltx"
+ let b:tex_stylish= 1
+ else
+ let b:tex_stylish= 0
+ endif
+endif
+
+" handle folding {{{1
+if !exists("g:tex_fold_enabled")
+ let s:tex_fold_enabled= 0
+elseif g:tex_fold_enabled && !has("folding")
+ let s:tex_fold_enabled= 0
+ echomsg "Ignoring g:tex_fold_enabled=".g:tex_fold_enabled."; need to re-compile vim for +fold support"
+else
+ let s:tex_fold_enabled= 1
+endif
+if s:tex_fold_enabled && &fdm == "manual"
+ setl fdm=syntax
+endif
+if s:tex_fold_enabled && has("folding")
+ com! -nargs=* TexFold <args> fold
+else
+ com! -nargs=* TexFold <args>
+endif
+
+" (La)TeX keywords: uses the characters 0-9,a-z,A-Z,192-255 only... {{{1
+" but _ is the only one that causes problems.
+" One may override this iskeyword setting by providing
+" g:tex_isk
+if exists("g:tex_isk")
+ 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
+ let b:tex_isk="48-57,a-z,A-Z,192-255"
+endif
+if (v:version == 704 && has("patch-7.4.1142")) || v:version > 704
+ 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
+else
+ let s:tex_no_error= 0
+endif
+if exists("g:tex_comment_nospell") && g:tex_comment_nospell
+ let s:tex_comment_nospell= 1
+else
+ let s:tex_comment_nospell= 0
+endif
+if exists("g:tex_nospell") && g:tex_nospell
+ let s:tex_nospell = 1
+else
+ let s:tex_nospell = 0
+endif
+if exists("g:tex_matchcheck")
+ let s:tex_matchcheck= g:tex_matchcheck
+else
+ let s:tex_matchcheck= '[({[]'
+endif
+if exists("g:tex_excludematcher")
+ let s:tex_excludematcher= g:tex_excludematcher
+else
+ let s:tex_excludematcher= 0
+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,@texMathZones
+if !s:tex_no_error
+ syn cluster texCmdGroup add=texMathError
+endif
+syn cluster texEnvGroup contains=texMatcher,texMathDelim,texSpecialChar,texStatement
+syn cluster texFoldGroup 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,texBoldStyle,texItalStyle,texEmphStyle,texNoSpell
+syn cluster texBoldGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texInputFile,texLength,texLigature,texMathZoneV,texMathZoneW,texMathZoneX,texMathZoneY,texMathZoneZ,texNewCmd,texNewEnv,texOnlyMath,texOption,texParen,texRefZone,texSection,texBeginEnd,texSectionZone,texSpaceCode,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,@texMathZones,texTitle,texAbstract,texBoldStyle,texBoldItalStyle,texNoSpell
+syn cluster texItalGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texInput,texInputFile,texLength,texLigature,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,texEmphStyle,texItalBoldStyle,texNoSpell
+if !s:tex_excludematcher
+ syn cluster texBoldGroup add=texMatcher
+ syn cluster texItalGroup add=texMatcher
+endif
+if !s:tex_nospell
+ if !s:tex_no_error
+ syn cluster texMatchGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texError,texInput,texLength,texLigature,texMatcher,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texBoldStyle,texBoldItalStyle,texItalStyle,texItalBoldStyle,texZone,texInputFile,texOption,@Spell
+ syn cluster texMatchNMGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texError,texInput,texLength,texLigature,texMatcherNM,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texBoldStyle,texBoldItalStyle,texItalStyle,texItalBoldStyle,texZone,texInputFile,texOption,@Spell
+ syn cluster texStyleGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texError,texInput,texLength,texLigature,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texBoldStyle,texBoldItalStyle,texItalStyle,texItalBoldStyle,texZone,texInputFile,texOption,texStyleStatement,texStyleMatcher,@Spell
+ 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,texBoldStyle,texBoldItalStyle,texItalStyle,texItalBoldStyle,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,texBoldStyle,texBoldItalStyle,texItalStyle,texItalBoldStyle,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,texBoldStyle,texBoldItalStyle,texItalStyle,texItalBoldStyle,texZone,texInputFile,texOption,texStyleStatement,texStyleMatcher,@Spell
+ endif
+else
+ if !s:tex_no_error
+ syn cluster texMatchGroup contains=texAccent,texBadMath,texComment,texDefCmd,texDelimiter,texDocType,texError,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,texError,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,texError,texInput,texLength,texLigature,texNewCmd,texNewEnv,texOnlyMath,texParen,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone,texInputFile,texOption,texStyleStatement,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
+endif
+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,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
+ syn cluster texMathMatchGroup contains=@texMathZones,texComment,texDefCmd,texDelimiter,texDocType,texInput,texLength,texLigature,texMathDelim,texMathMatcher,texMathOper,texNewCmd,texNewEnv,texRefZone,texSection,texSpecialChar,texStatement,texString,texTypeSize,texTypeStyle,texZone
+ syn cluster texMathZoneGroup contains=texBadPar,texComment,texDelimiter,texLength,texMathDelim,texMathMatcher,texMathOper,texMathSymbol,texMathText,texRefZone,texSpecialChar,texStatement,texTypeSize,texTypeStyle
+ if !s:tex_no_error
+ syn cluster texMathMatchGroup add=texMathError
+ syn cluster texMathZoneGroup add=texMathError
+ endif
+ syn cluster texMathZoneGroup add=@NoSpell
+ " following used in the \part \chapter \section \subsection \subsubsection
+ " \paragraph \subparagraph \author \title highlighting
+ syn cluster texDocGroup contains=texPartZone,@texPartGroup
+ syn cluster texPartGroup contains=texChapterZone,texSectionZone,texParaZone
+ syn cluster texChapterGroup contains=texSectionZone,texParaZone
+ syn cluster texSectionGroup contains=texSubSectionZone,texParaZone
+ syn cluster texSubSectionGroup contains=texSubSubSectionZone,texParaZone
+ syn cluster texSubSubSectionGroup contains=texParaZone
+ syn cluster texParaGroup contains=texSubParaZone
+ if has("conceal") && &enc == 'utf-8'
+ syn cluster texMathZoneGroup add=texGreek,texSuperscript,texSubscript,texMathSymbol
+ syn cluster texMathMatchGroup add=texGreek,texSuperscript,texSubscript,texMathSymbol
+ endif
+endif
+
+" Try to flag {}, [], and () mismatches: {{{1
+if s:tex_fast =~# 'm'
+ if !s:tex_no_error
+ if s:tex_matchcheck =~ '{'
+ syn region texMatcher matchgroup=texDelimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchGroup,texError
+ syn region texMatcherNM matchgroup=texDelimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchNMGroup,texError
+ endif
+ if s:tex_matchcheck =~ '\['
+ syn region texMatcher matchgroup=texDelimiter start="\[" end="]" transparent contains=@texMatchGroup,texError,@NoSpell
+ syn region texMatcherNM matchgroup=texDelimiter start="\[" end="]" transparent contains=@texMatchNMGroup,texError,@NoSpell
+ endif
+ else
+ if s:tex_matchcheck =~ '{'
+ syn region texMatcher matchgroup=texDelimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchGroup
+ syn region texMatcherNM matchgroup=texDelimiter start="{" skip="\\\\\|\\[{}]" end="}" transparent contains=@texMatchNMGroup
+ endif
+ if s:tex_matchcheck =~ '\['
+ syn region texMatcher matchgroup=texDelimiter start="\[" end="]" transparent contains=@texMatchGroup
+ syn region texMatcherNM matchgroup=texDelimiter start="\[" end="]" transparent contains=@texMatchNMGroup
+ endif
+ endif
+ if s:tex_matchcheck =~ '('
+ if !s:tex_nospell
+ syn region texParen start="(" end=")" transparent contains=@texMatchGroup,@Spell
+ else
+ syn region texParen start="(" end=")" transparent contains=@texMatchGroup
+ endif
+ endif
+endif
+if !s:tex_no_error
+ if s:tex_matchcheck =~ '('
+ syn match texError "[}\]]"
+ else
+ syn match texError "[}\])]"
+ endif
+endif
+if s:tex_fast =~# 'M'
+ if !exists("g:tex_no_math")
+ if !s:tex_no_error
+ syn match texMathError "}" contained
+ endif
+ syn region texMathMatcher matchgroup=texDelimiter start="{" skip="\%(\\\\\)*\\}" end="}" end="%stopzone\>" contained contains=@texMathMatchGroup
+ endif
+endif
+
+" TeX/LaTeX keywords: {{{1
+" Instead of trying to be All Knowing, I just match \..alphameric..
+" Note that *.tex files may not have "@" in their \commands
+if exists("g:tex_tex") || b:tex_stylish
+ syn match texStatement "\\[a-zA-Z@]\+"
+else
+ syn match texStatement "\\\a\+"
+ if !s:tex_no_error
+ syn match texError "\\\a*@[a-zA-Z@]*"
+ endif
+endif
+
+" TeX/LaTeX delimiters: {{{1
+syn match texDelimiter "&"
+syn match texDelimiter "\\\\"
+
+" Tex/Latex Options: {{{1
+syn match texOption "[^\\]\zs#\d\+\|^#\d\+"
+
+" texAccent (tnx to Karim Belabas) avoids annoying highlighting for accents: {{{1
+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
+else
+ syn match texAccent "\\[bcdvuH]\A"me=e-1
+ syn match texLigature "\\\([ijolL]\|ae\|oe\|ss\|AA\|AE\|OE\)\A"me=e-1
+endif
+syn match texAccent "\\[bcdvuH]$"
+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=texDelimiter start="{" end="}" contained nextgroup=texBeginEndModifier contains=texComment
+ syn region texBeginEndModifier matchgroup=texDelimiter start="\[" end="]" contained contains=texComment,@texMathZones,@NoSpell
+endif
+
+" \documentclass, \documentstyle, \usepackage: {{{1
+syn match texDocType "\\documentclass\>\|\\documentstyle\>\|\\usepackage\>" nextgroup=texBeginEndName,texDocTypeArgs
+if s:tex_fast =~# 'm'
+ syn region texDocTypeArgs matchgroup=texDelimiter start="\[" end="]" contained nextgroup=texBeginEndName contains=texComment,@NoSpell
+endif
+
+" Preamble syntax-based folding support: {{{1
+if s:tex_fold_enabled && has("folding")
+ syn region texPreamble transparent fold start='\zs\\documentclass\>' end='\ze\\begin{document}' contains=texStyle,@texPreambleMatchGroup
+endif
+
+" TeX input: {{{1
+syn match texInput "\\input\s\+[a-zA-Z/.0-9_^]\+"hs=s+7 contains=texStatement
+syn match texInputFile "\\include\(graphics\|list\)\=\(\[.\{-}\]\)\=\s*{.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
+syn match texInputFile "\\\(epsfig\|input\|usepackage\)\s*\(\[.*\]\)\={.\{-}}" contains=texStatement,texInputCurlies,texInputFileOpt
+syn match texInputCurlies "[{}]" contained
+if s:tex_fast =~# 'm'
+ syn region texInputFileOpt matchgroup=texDelimiter start="\[" end="\]" contained contains=texComment
+endif
+
+" Type Styles (LaTeX 2.09): {{{1
+syn match texTypeStyle "\\rm\>"
+syn match texTypeStyle "\\em\>"
+syn match texTypeStyle "\\bf\>"
+syn match texTypeStyle "\\it\>"
+syn match texTypeStyle "\\sl\>"
+syn match texTypeStyle "\\sf\>"
+syn match texTypeStyle "\\sc\>"
+syn match texTypeStyle "\\tt\>"
+
+" Type Styles: attributes, commands, families, etc (LaTeX2E): {{{1
+if s:tex_conceal !~# 'b'
+ syn match texTypeStyle "\\textbf\>"
+ syn match texTypeStyle "\\textit\>"
+ syn match texTypeStyle "\\emph\>"
+endif
+syn match texTypeStyle "\\textmd\>"
+syn match texTypeStyle "\\textrm\>"
+
+syn match texTypeStyle "\\mathbf\>"
+syn match texTypeStyle "\\mathcal\>"
+syn match texTypeStyle "\\mathit\>"
+syn match texTypeStyle "\\mathnormal\>"
+syn match texTypeStyle "\\mathrm\>"
+syn match texTypeStyle "\\mathsf\>"
+syn match texTypeStyle "\\mathtt\>"
+
+syn match texTypeStyle "\\rmfamily\>"
+syn match texTypeStyle "\\sffamily\>"
+syn match texTypeStyle "\\ttfamily\>"
+
+syn match texTypeStyle "\\itshape\>"
+syn match texTypeStyle "\\scshape\>"
+syn match texTypeStyle "\\slshape\>"
+syn match texTypeStyle "\\upshape\>"
+
+syn match texTypeStyle "\\bfseries\>"
+syn match texTypeStyle "\\mdseries\>"
+
+" Some type sizes: {{{1
+syn match texTypeSize "\\tiny\>"
+syn match texTypeSize "\\scriptsize\>"
+syn match texTypeSize "\\footnotesize\>"
+syn match texTypeSize "\\small\>"
+syn match texTypeSize "\\normalsize\>"
+syn match texTypeSize "\\large\>"
+syn match texTypeSize "\\Large\>"
+syn match texTypeSize "\\LARGE\>"
+syn match texTypeSize "\\huge\>"
+syn match texTypeSize "\\Huge\>"
+
+" Spacecodes (TeX'isms): {{{1
+" \mathcode`\^^@="2201 \delcode`\(="028300 \sfcode`\)=0 \uccode`X=`X \lccode`x=`x
+syn match texSpaceCode "\\\(math\|cat\|del\|lc\|sf\|uc\)code`"me=e-1 nextgroup=texSpaceCodeChar
+syn match texSpaceCodeChar "`\\\=.\(\^.\)\==\(\d\|\"\x\{1,6}\|`.\)" contained
+
+" Sections, subsections, etc: {{{1
+if s:tex_fast =~# 'p'
+ if !s:tex_nospell
+ TexFold syn region texDocZone matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}' contains=@texFoldGroup,@texDocGroup,@Spell
+ TexFold syn region texPartZone matchgroup=texSection start='\\part\>' end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texPartGroup,@Spell
+ TexFold syn region texChapterZone matchgroup=texSection start='\\chapter\>' end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texChapterGroup,@Spell
+ TexFold syn region texSectionZone matchgroup=texSection start='\\section\>' end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texSectionGroup,@Spell
+ TexFold syn region texSubSectionZone matchgroup=texSection start='\\subsection\>' end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texSubSectionGroup,@Spell
+ TexFold syn region texSubSubSectionZone matchgroup=texSection start='\\subsubsection\>' end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texSubSubSectionGroup,@Spell
+ TexFold syn region texParaZone matchgroup=texSection start='\\paragraph\>' end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texParaGroup,@Spell
+ TexFold syn region texSubParaZone matchgroup=texSection start='\\subparagraph\>' end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@Spell
+ TexFold syn region texTitle matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}' contains=@texFoldGroup,@Spell
+ TexFold syn region texAbstract matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}' contains=@texFoldGroup,@Spell
+ else
+ TexFold syn region texDocZone matchgroup=texSection start='\\begin\s*{\s*document\s*}' end='\\end\s*{\s*document\s*}' contains=@texFoldGroup,@texDocGroup
+ TexFold syn region texPartZone matchgroup=texSection start='\\part\>' end='\ze\s*\\\%(part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texPartGroup
+ TexFold syn region texChapterZone matchgroup=texSection start='\\chapter\>' end='\ze\s*\\\%(chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texChapterGroup
+ TexFold syn region texSectionZone matchgroup=texSection start='\\section\>' end='\ze\s*\\\%(section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texSectionGroup
+ TexFold syn region texSubSectionZone matchgroup=texSection start='\\subsection\>' end='\ze\s*\\\%(\%(sub\)\=section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texSubSectionGroup
+ TexFold syn region texSubSubSectionZone matchgroup=texSection start='\\subsubsection\>' end='\ze\s*\\\%(\%(sub\)\{,2}section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texSubSubSectionGroup
+ TexFold syn region texParaZone matchgroup=texSection start='\\paragraph\>' end='\ze\s*\\\%(paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup,@texParaGroup
+ TexFold syn region texSubParaZone matchgroup=texSection start='\\subparagraph\>' end='\ze\s*\\\%(\%(sub\)\=paragraph\>\|\%(sub\)*section\>\|chapter\>\|part\>\|end\s*{\s*document\s*}\)' contains=@texFoldGroup
+ TexFold syn region texTitle matchgroup=texSection start='\\\%(author\|title\)\>\s*{' end='}' contains=@texFoldGroup
+ TexFold syn region texAbstract matchgroup=texSection start='\\begin\s*{\s*abstract\s*}' end='\\end\s*{\s*abstract\s*}' contains=@texFoldGroup
+ endif
+endif
+
+" particular support for bold and italic {{{1
+if s:tex_fast =~# 'b'
+ if s:tex_conceal =~# 'b'
+ if !exists("g:tex_nospell") || !g:tex_nospell
+ syn region texBoldStyle matchgroup=texTypeStyle start="\\textbf\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texBoldGroup,@Spell
+ syn region texBoldItalStyle matchgroup=texTypeStyle start="\\textit\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texItalGroup,@Spell
+ syn region texItalStyle matchgroup=texTypeStyle start="\\textit\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texItalGroup,@Spell
+ syn region texItalBoldStyle matchgroup=texTypeStyle start="\\textbf\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texBoldGroup,@Spell
+ syn region texEmphStyle matchgroup=texTypeStyle start="\\emph\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texItalGroup,@Spell
+ syn region texEmphStyle matchgroup=texTypeStyle start="\\texts[cfl]\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texBoldGroup,@Spell
+ syn region texEmphStyle matchgroup=texTypeStyle start="\\textup\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texBoldGroup,@Spell
+ syn region texEmphStyle matchgroup=texTypeStyle start="\\texttt\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texBoldGroup,@Spell
+ else
+ syn region texBoldStyle matchgroup=texTypeStyle start="\\textbf\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texBoldGroup
+ syn region texBoldItalStyle matchgroup=texTypeStyle start="\\textit\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texItalGroup
+ syn region texItalStyle matchgroup=texTypeStyle start="\\textit\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texItalGroup
+ syn region texItalBoldStyle matchgroup=texTypeStyle start="\\textbf\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texBoldGroup
+ syn region texEmphStyle matchgroup=texTypeStyle start="\\emph\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texItalGroup
+ syn region texEmphStyle matchgroup=texTypeStyle start="\\texts[cfl]\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texEmphGroup
+ syn region texEmphStyle matchgroup=texTypeStyle start="\\textup\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texEmphGroup
+ syn region texEmphStyle matchgroup=texTypeStyle start="\\texttt\s*{" matchgroup=texTypeStyle end="}" concealends contains=@texEmphGroup
+ endif
+ endif
+endif
+
+" Bad Math (mismatched): {{{1
+if !exists("g:tex_no_math") && !s:tex_no_error
+ 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 "\\[\])]"
+ syn match texBadPar contained "\%(\\par\>\|^\s*\n.\)"
+endif
+
+" Math Zones: {{{1
+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 highlighting.
+ fun! TexNewMathZone(sfx,mathzone,starform)
+ let grpname = "texMathZone".a:sfx
+ let syncname = "texSyncMathZone".a:sfx
+ if s:tex_fold_enabled
+ let foldcmd= " fold"
+ else
+ let foldcmd= ""
+ endif
+ exe "syn cluster texMathZones add=".grpname
+ if s:tex_fast =~# 'M'
+ exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
+ exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
+ exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
+ endif
+ exe 'hi def link '.grpname.' texMath'
+ if a:starform
+ let grpname = "texMathZone".a:sfx.'S'
+ let syncname = "texSyncMathZone".a:sfx.'S'
+ exe "syn cluster texMathZones add=".grpname
+ if s:tex_fast =~# 'M'
+ exe 'syn region '.grpname.' start='."'".'\\begin\s*{\s*'.a:mathzone.'\*\s*}'."'".' end='."'".'\\end\s*{\s*'.a:mathzone.'\*\s*}'."'".' keepend contains=@texMathZoneGroup'.foldcmd
+ exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
+ exe 'syn sync match '.syncname.' grouphere '.grpname.' "\\begin\s*{\s*'.a:mathzone.'\*\s*}"'
+ endif
+ exe 'hi def link '.grpname.' texMath'
+ endif
+ endfun
+
+ " Standard Math Zones: {{{2
+ 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'
+ if has("conceal") && &enc == 'utf-8' && s:tex_conceal =~# 'd'
+ syn region texMathZoneV matchgroup=texDelimiter start="\\(" matchgroup=texDelimiter end="\\)\|%stopzone\>" keepend concealends contains=@texMathZoneGroup
+ syn region texMathZoneW matchgroup=texDelimiter start="\\\[" matchgroup=texDelimiter end="\\]\|%stopzone\>" keepend concealends contains=@texMathZoneGroup
+ syn region texMathZoneX matchgroup=texDelimiter start="\$" skip="\\\\\|\\\$" matchgroup=texDelimiter end="\$" end="%stopzone\>" concealends contains=@texMathZoneGroup
+ syn region texMathZoneY matchgroup=texDelimiter start="\$\$" matchgroup=texDelimiter end="\$\$" end="%stopzone\>" keepend concealends contains=@texMathZoneGroup
+ else
+ syn region texMathZoneV matchgroup=texDelimiter start="\\(" matchgroup=texDelimiter end="\\)\|%stopzone\>" keepend contains=@texMathZoneGroup
+ syn region texMathZoneW matchgroup=texDelimiter start="\\\[" matchgroup=texDelimiter end="\\]\|%stopzone\>" keepend contains=@texMathZoneGroup
+ syn region texMathZoneX matchgroup=texDelimiter start="\$" skip="\%(\\\\\)*\\\$" matchgroup=texDelimiter end="\$" end="%stopzone\>" contains=@texMathZoneGroup
+ syn region texMathZoneY matchgroup=texDelimiter start="\$\$" matchgroup=texDelimiter end="\$\$" end="%stopzone\>" keepend contains=@texMathZoneGroup
+ endif
+ syn region texMathZoneZ matchgroup=texStatement start="\\ensuremath\s*{" matchgroup=texStatement end="}" end="%stopzone\>" contains=@texMathZoneGroup
+ endif
+
+ syn match texMathOper "[_^=]" contained
+
+ " Text Inside Math Zones: {{{2
+ if s:tex_fast =~# 'M'
+ if !exists("g:tex_nospell") || !g:tex_nospell
+ syn region texMathText matchgroup=texStatement start='\\\(\(inter\)\=text\|mbox\)\s*{' end='}' contains=@texFoldGroup,@Spell
+ else
+ syn region texMathText matchgroup=texStatement start='\\\(\(inter\)\=text\|mbox\)\s*{' end='}' contains=@texFoldGroup
+ endif
+ endif
+
+ " \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\["
+ 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=[
+ \ ['<' , '<'] ,
+ \ ['>' , '>'] ,
+ \ ['(' , '('] ,
+ \ [')' , ')'] ,
+ \ ['\[' , '['] ,
+ \ [']' , ']'] ,
+ \ ['\\{' , '{'] ,
+ \ ['\\}' , '}'] ,
+ \ ['|' , '|'] ,
+ \ ['\\|' , '‖'] ,
+ \ ['\\backslash' , '\'] ,
+ \ ['\\downarrow' , '↓'] ,
+ \ ['\\Downarrow' , '⇓'] ,
+ \ ['\\lbrace' , '['] ,
+ \ ['\\lceil' , '⌈'] ,
+ \ ['\\lfloor' , '⌊'] ,
+ \ ['\\lgroup' , '⌊'] ,
+ \ ['\\lmoustache' , '⎛'] ,
+ \ ['\\rbrace' , ']'] ,
+ \ ['\\rceil' , '⌉'] ,
+ \ ['\\rfloor' , '⌋'] ,
+ \ ['\\rgroup' , '⌋'] ,
+ \ ['\\rmoustache' , '⎞'] ,
+ \ ['\\uparrow' , '↑'] ,
+ \ ['\\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]
+ endfor
+
+ else
+ syn match texMathDelim contained "\\\(left\|right\)\>" skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad
+ syn match texMathDelim contained "\\[bB]igg\=[lr]\=\>" skipwhite nextgroup=texMathDelimSet1,texMathDelimSet2,texMathDelimBad
+ syn match texMathDelimSet2 contained "\\" nextgroup=texMathDelimKey,texMathDelimBad
+ syn match texMathDelimSet1 contained "[<>()[\]|/.]\|\\[{}|]"
+ syn keyword texMathDelimKey contained backslash lceil lVert rgroup uparrow
+ syn keyword texMathDelimKey contained downarrow lfloor rangle rmoustache Uparrow
+ syn keyword texMathDelimKey contained Downarrow lgroup rbrace rvert updownarrow
+ syn keyword texMathDelimKey contained langle lmoustache rceil rVert Updownarrow
+ syn keyword texMathDelimKey contained lbrace lvert rfloor
+ endif
+ syn match texMathDelim contained "\\\(left\|right\)arrow\>\|\<\([aA]rrow\|brace\)\=vert\>"
+ syn match texMathDelim contained "\\lefteqn\>"
+endif
+
+" Special TeX characters ( \$ \& \% \# \{ \} \_ \S \P ) : {{{1
+syn match texSpecialChar "\\[$&%#{}_]"
+if b:tex_stylish
+ syn match texSpecialChar "\\[SP@][^a-zA-Z@]"me=e-1
+else
+ syn match texSpecialChar "\\[SP@]\A"me=e-1
+endif
+syn match texSpecialChar "\\\\"
+if !exists("g:tex_no_math")
+ syn match texOnlyMath "[_^]"
+endif
+syn match texSpecialChar "\^\^[0-9a-f]\{2}\|\^\^\S"
+if s:tex_conceal !~# 'S'
+ syn match texSpecialChar '\\glq\>' contained conceal cchar=‚
+ syn match texSpecialChar '\\grq\>' contained conceal cchar=‘
+ syn match texSpecialChar '\\glqq\>' contained conceal cchar=„
+ syn match texSpecialChar '\\grqq\>' contained conceal cchar=“
+ syn match texSpecialChar '\\hyp\>' contained conceal cchar=-
+endif
+
+" Comments: {{{1
+" Normal TeX LaTeX : %....
+" Documented TeX Format: ^^A... -and- leading %s (only)
+if !s:tex_comment_nospell
+ syn cluster texCommentGroup contains=texTodo,@Spell
+else
+ syn cluster texCommentGroup contains=texTodo,@NoSpell
+endif
+syn case ignore
+syn keyword texTodo contained combak fixme todo xxx
+syn case match
+if s:extfname == "dtx"
+ syn match texComment "\^\^A.*$" contains=@texCommentGroup
+ syn match texComment "^%\+" contains=@texCommentGroup
+else
+ if s:tex_fold_enabled
+ " allows syntax-folding of 2 or more contiguous comment lines
+ " single-line comments are not folded
+ syn match texComment "%.*$" contains=@texCommentGroup
+ if s:tex_fast =~# 'c'
+ TexFold syn region texComment start="^\zs\s*%.*\_s*%" skip="^\s*%" end='^\ze\s*[^%]' contains=@texCommentGroup
+ TexFold syn region texNoSpell contained matchgroup=texComment start="%\s*nospell\s*{" end="%\s*nospell\s*}" contains=@texFoldGroup,@NoSpell
+ endif
+ else
+ syn match texComment "%.*$" contains=@texCommentGroup
+ if s:tex_fast =~# 'c'
+ syn region texNoSpell contained matchgroup=texComment start="%\s*nospell\s*{" end="%\s*nospell\s*}" contains=@texFoldGroup,@NoSpell
+ endif
+ 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.
+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:
+ 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
+ else
+ syn region texZone start="\\begin{[vV]erbatim}" end="\\end{[vV]erbatim}\|%stopzone\>"
+ 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
+ endif
+endif
+
+" Tex Reference Zones: {{{1
+if s:tex_fast =~# 'r'
+ syn region texZone matchgroup=texStatement start="@samp{" end="}\|%stopzone\>" contains=@texRefGroup
+ syn region texRefZone matchgroup=texStatement start="\\nocite{" end="}\|%stopzone\>" contains=@texRefGroup
+ syn region texRefZone matchgroup=texStatement start="\\bibliography{" end="}\|%stopzone\>" contains=@texRefGroup
+ syn region texRefZone matchgroup=texStatement start="\\label{" end="}\|%stopzone\>" contains=@texRefGroup
+ syn region texRefZone matchgroup=texStatement start="\\\(page\|eq\)ref{" end="}\|%stopzone\>" contains=@texRefGroup
+ syn region texRefZone matchgroup=texStatement start="\\v\=ref{" end="}\|%stopzone\>" contains=@texRefGroup
+ syn region texRefOption contained matchgroup=texDelimiter start='\[' end=']' contains=@texRefGroup,texRefZone nextgroup=texRefOption,texCite
+ syn region texCite contained matchgroup=texDelimiter start='{' end='}' contains=@texRefGroup,texRefZone,texCite
+endif
+syn match texRefZone '\\cite\%([tp]\*\=\)\=\>' nextgroup=texRefOption,texCite
+
+" Handle (re)newcommand, (re)newenvironment : {{{1
+syn match texNewCmd "\\\%(re\)\=newcommand\>" nextgroup=texCmdName skipwhite skipnl
+if s:tex_fast =~# 'V'
+ syn region texCmdName contained matchgroup=texDelimiter start="{"rs=s+1 end="}" nextgroup=texCmdArgs,texCmdBody skipwhite skipnl
+ syn region texCmdArgs contained matchgroup=texDelimiter start="\["rs=s+1 end="]" nextgroup=texCmdBody skipwhite skipnl
+ syn region texCmdBody contained matchgroup=texDelimiter start="{"rs=s+1 skip="\\\\\|\\[{}]" matchgroup=texDelimiter end="}" contains=@texCmdGroup
+endif
+syn match texNewEnv "\\\%(re\)\=newenvironment\>" nextgroup=texEnvName skipwhite skipnl
+if s:tex_fast =~# 'V'
+ syn region texEnvName contained matchgroup=texDelimiter start="{"rs=s+1 end="}" nextgroup=texEnvBgn skipwhite skipnl
+ syn region texEnvBgn contained matchgroup=texDelimiter start="{"rs=s+1 end="}" nextgroup=texEnvEnd skipwhite skipnl contains=@texEnvGroup
+ syn region texEnvEnd contained matchgroup=texDelimiter start="{"rs=s+1 end="}" skipwhite skipnl contains=@texEnvGroup
+endif
+
+" Definitions/Commands: {{{1
+syn match texDefCmd "\\def\>" nextgroup=texDefName skipwhite skipnl
+if b:tex_stylish
+ syn match texDefName contained "\\[a-zA-Z@]\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
+ syn match texDefName contained "\\[^a-zA-Z@]" nextgroup=texDefParms,texCmdBody skipwhite skipnl
+else
+ syn match texDefName contained "\\\a\+" nextgroup=texDefParms,texCmdBody skipwhite skipnl
+ syn match texDefName contained "\\\A" nextgroup=texDefParms,texCmdBody skipwhite skipnl
+endif
+syn match texDefParms contained "#[^{]*" contains=texDefParm nextgroup=texCmdBody skipwhite skipnl
+syn match texDefParm contained "#\d\+"
+
+" TeX Lengths: {{{1
+syn match texLength "\<\d\+\([.,]\d\+\)\=\s*\(true\)\=\s*\(bp\|cc\|cm\|dd\|em\|ex\|in\|mm\|pc\|pt\|sp\)\>"
+
+" TeX String Delimiters: {{{1
+syn match texString "\(``\|''\|,,\)"
+
+" makeatletter -- makeatother sections
+if !s:tex_no_error
+ if s:tex_fast =~# 'S'
+ syn region texStyle matchgroup=texStatement start='\\makeatletter' end='\\makeatother' contains=@texStyleGroup contained
+ endif
+ syn match texStyleStatement "\\[a-zA-Z@]\+" contained
+ if s:tex_fast =~# 'S'
+ syn region texStyleMatcher matchgroup=texDelimiter start="{" skip="\\\\\|\\[{}]" end="}" contains=@texStyleGroup,texError contained
+ syn region texStyleMatcher matchgroup=texDelimiter start="\[" end="]" contains=@texStyleGroup,texError contained
+ endif
+endif
+
+" Conceal mode support (supports set cole=2) {{{1
+if has("conceal") && &enc == 'utf-8'
+
+ " Math Symbols {{{2
+ " (many of these symbols were contributed by Björn Winckler)
+ if s:tex_conceal =~# 'm'
+ let s:texMathList=[
+ \ ['|' , '‖'],
+ \ ['aleph' , 'ℵ'],
+ \ ['amalg' , '∐'],
+ \ ['angle' , '∠'],
+ \ ['approx' , '≈'],
+ \ ['ast' , '∗'],
+ \ ['asymp' , '≍'],
+ \ ['backslash' , '∖'],
+ \ ['bigcap' , '∩'],
+ \ ['bigcirc' , '○'],
+ \ ['bigcup' , '∪'],
+ \ ['bigodot' , '⊙'],
+ \ ['bigoplus' , '⊕'],
+ \ ['bigotimes' , '⊗'],
+ \ ['bigsqcup' , '⊔'],
+ \ ['bigtriangledown', '∇'],
+ \ ['bigtriangleup' , '∆'],
+ \ ['bigvee' , '⋁'],
+ \ ['bigwedge' , '⋀'],
+ \ ['bot' , '⊥'],
+ \ ['bowtie' , '⋈'],
+ \ ['bullet' , '•'],
+ \ ['cap' , '∩'],
+ \ ['cdot' , '·'],
+ \ ['cdots' , '⋯'],
+ \ ['circ' , '∘'],
+ \ ['clubsuit' , '♣'],
+ \ ['cong' , '≅'],
+ \ ['coprod' , '∐'],
+ \ ['copyright' , '©'],
+ \ ['cup' , '∪'],
+ \ ['dagger' , '†'],
+ \ ['dashv' , '⊣'],
+ \ ['ddagger' , '‡'],
+ \ ['ddots' , '⋱'],
+ \ ['diamond' , '⋄'],
+ \ ['diamondsuit' , '♢'],
+ \ ['div' , '÷'],
+ \ ['doteq' , '≐'],
+ \ ['dots' , '…'],
+ \ ['downarrow' , '↓'],
+ \ ['Downarrow' , '⇓'],
+ \ ['ell' , 'ℓ'],
+ \ ['emptyset' , '∅'],
+ \ ['equiv' , '≡'],
+ \ ['exists' , '∃'],
+ \ ['flat' , '♭'],
+ \ ['forall' , '∀'],
+ \ ['frown' , '⁔'],
+ \ ['ge' , '≥'],
+ \ ['geq' , '≥'],
+ \ ['gets' , '←'],
+ \ ['gg' , '⟫'],
+ \ ['hbar' , 'ℏ'],
+ \ ['heartsuit' , '♡'],
+ \ ['hookleftarrow' , '↩'],
+ \ ['hookrightarrow' , '↪'],
+ \ ['iff' , '⇔'],
+ \ ['Im' , 'ℑ'],
+ \ ['imath' , 'ɩ'],
+ \ ['in' , '∈'],
+ \ ['infty' , '∞'],
+ \ ['int' , '∫'],
+ \ ['jmath' , '𝚥'],
+ \ ['land' , '∧'],
+ \ ['lceil' , '⌈'],
+ \ ['ldots' , '…'],
+ \ ['le' , '≤'],
+ \ ['left|' , '|'],
+ \ ['left\\|' , '‖'],
+ \ ['left(' , '('],
+ \ ['left\[' , '['],
+ \ ['left\\{' , '{'],
+ \ ['leftarrow' , '←'],
+ \ ['Leftarrow' , '⇐'],
+ \ ['leftharpoondown', '↽'],
+ \ ['leftharpoonup' , '↼'],
+ \ ['leftrightarrow' , '↔'],
+ \ ['Leftrightarrow' , '⇔'],
+ \ ['leq' , '≤'],
+ \ ['leq' , '≤'],
+ \ ['lfloor' , '⌊'],
+ \ ['ll' , '≪'],
+ \ ['lmoustache' , '╭'],
+ \ ['lor' , '∨'],
+ \ ['mapsto' , '↦'],
+ \ ['mid' , '∣'],
+ \ ['models' , '╞'],
+ \ ['mp' , '∓'],
+ \ ['nabla' , '∇'],
+ \ ['natural' , '♮'],
+ \ ['ne' , '≠'],
+ \ ['nearrow' , '↗'],
+ \ ['neg' , '¬'],
+ \ ['neq' , '≠'],
+ \ ['ni' , '∋'],
+ \ ['notin' , '∉'],
+ \ ['nwarrow' , '↖'],
+ \ ['odot' , '⊙'],
+ \ ['oint' , '∮'],
+ \ ['ominus' , '⊖'],
+ \ ['oplus' , '⊕'],
+ \ ['oslash' , '⊘'],
+ \ ['otimes' , '⊗'],
+ \ ['owns' , '∋'],
+ \ ['P' , '¶'],
+ \ ['parallel' , '║'],
+ \ ['partial' , '∂'],
+ \ ['perp' , '⊥'],
+ \ ['pm' , '±'],
+ \ ['prec' , '≺'],
+ \ ['preceq' , '⪯'],
+ \ ['prime' , '′'],
+ \ ['prod' , '∏'],
+ \ ['propto' , '∝'],
+ \ ['rceil' , '⌉'],
+ \ ['Re' , 'ℜ'],
+ \ ['quad' , ' '],
+ \ ['qquad' , ' '],
+ \ ['rfloor' , '⌋'],
+ \ ['right|' , '|'],
+ \ ['right\\|' , '‖'],
+ \ ['right)' , ')'],
+ \ ['right]' , ']'],
+ \ ['right\\}' , '}'],
+ \ ['rightarrow' , '→'],
+ \ ['Rightarrow' , '⇒'],
+ \ ['rightleftharpoons', '⇌'],
+ \ ['rmoustache' , '╮'],
+ \ ['S' , '§'],
+ \ ['searrow' , '↘'],
+ \ ['setminus' , '∖'],
+ \ ['sharp' , '♯'],
+ \ ['sim' , '∼'],
+ \ ['simeq' , '⋍'],
+ \ ['smile' , '‿'],
+ \ ['spadesuit' , '♠'],
+ \ ['sqcap' , '⊓'],
+ \ ['sqcup' , '⊔'],
+ \ ['sqsubset' , '⊏'],
+ \ ['sqsubseteq' , '⊑'],
+ \ ['sqsupset' , '⊐'],
+ \ ['sqsupseteq' , '⊒'],
+ \ ['star' , '✫'],
+ \ ['subset' , '⊂'],
+ \ ['subseteq' , '⊆'],
+ \ ['succ' , '≻'],
+ \ ['succeq' , '⪰'],
+ \ ['sum' , '∑'],
+ \ ['supset' , '⊃'],
+ \ ['supseteq' , '⊇'],
+ \ ['surd' , '√'],
+ \ ['swarrow' , '↙'],
+ \ ['times' , '×'],
+ \ ['to' , '→'],
+ \ ['top' , '⊤'],
+ \ ['triangle' , '∆'],
+ \ ['triangleleft' , '⊲'],
+ \ ['triangleright' , '⊳'],
+ \ ['uparrow' , '↑'],
+ \ ['Uparrow' , '⇑'],
+ \ ['updownarrow' , '↕'],
+ \ ['Updownarrow' , '⇕'],
+ \ ['vdash' , '⊢'],
+ \ ['vdots' , '⋮'],
+ \ ['vee' , '∨'],
+ \ ['wedge' , '∧'],
+ \ ['wp' , '℘'],
+ \ ['wr' , '≀']]
+ 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]
+ else
+ exe "syn match texMathSymbol '\\\\".texmath[0]."' contained conceal cchar=".texmath[1]
+ endif
+ endfor
+
+ if &ambw == "double"
+ syn match texMathSymbol '\\gg\>' contained conceal cchar=≫
+ syn match texMathSymbol '\\ll\>' contained conceal cchar=≪
+ else
+ syn match texMathSymbol '\\gg\>' contained conceal cchar=⟫
+ syn match texMathSymbol '\\ll\>' contained conceal cchar=⟪
+ endif
+
+ syn match texMathSymbol '\\hat{a}' contained conceal cchar=â
+ syn match texMathSymbol '\\hat{A}' contained conceal cchar=Â
+ syn match texMathSymbol '\\hat{c}' contained conceal cchar=ĉ
+ syn match texMathSymbol '\\hat{C}' contained conceal cchar=Ĉ
+ syn match texMathSymbol '\\hat{e}' contained conceal cchar=ê
+ syn match texMathSymbol '\\hat{E}' contained conceal cchar=Ê
+ syn match texMathSymbol '\\hat{g}' contained conceal cchar=ĝ
+ syn match texMathSymbol '\\hat{G}' contained conceal cchar=Ĝ
+ syn match texMathSymbol '\\hat{i}' contained conceal cchar=î
+ syn match texMathSymbol '\\hat{I}' contained conceal cchar=Î
+ syn match texMathSymbol '\\hat{o}' contained conceal cchar=ô
+ syn match texMathSymbol '\\hat{O}' contained conceal cchar=Ô
+ syn match texMathSymbol '\\hat{s}' contained conceal cchar=ŝ
+ syn match texMathSymbol '\\hat{S}' contained conceal cchar=Ŝ
+ syn match texMathSymbol '\\hat{u}' contained conceal cchar=û
+ syn match texMathSymbol '\\hat{U}' contained conceal cchar=Û
+ syn match texMathSymbol '\\hat{w}' contained conceal cchar=ŵ
+ syn match texMathSymbol '\\hat{W}' contained conceal cchar=Ŵ
+ 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
+ if s:tex_conceal =~# 'g'
+ fun! s:Greek(group,pat,cchar)
+ exe 'syn match '.a:group." '".a:pat."' contained conceal cchar=".a:cchar
+ endfun
+ call s:Greek('texGreek','\\alpha\>' ,'α')
+ call s:Greek('texGreek','\\beta\>' ,'β')
+ call s:Greek('texGreek','\\gamma\>' ,'γ')
+ call s:Greek('texGreek','\\delta\>' ,'δ')
+ call s:Greek('texGreek','\\epsilon\>' ,'ϵ')
+ call s:Greek('texGreek','\\varepsilon\>' ,'ε')
+ call s:Greek('texGreek','\\zeta\>' ,'ζ')
+ call s:Greek('texGreek','\\eta\>' ,'η')
+ call s:Greek('texGreek','\\theta\>' ,'θ')
+ call s:Greek('texGreek','\\vartheta\>' ,'ϑ')
+ call s:Greek('texGreek','\\iota\>' ,'ι')
+ call s:Greek('texGreek','\\kappa\>' ,'κ')
+ call s:Greek('texGreek','\\lambda\>' ,'λ')
+ call s:Greek('texGreek','\\mu\>' ,'μ')
+ call s:Greek('texGreek','\\nu\>' ,'ν')
+ call s:Greek('texGreek','\\xi\>' ,'ξ')
+ call s:Greek('texGreek','\\pi\>' ,'π')
+ call s:Greek('texGreek','\\varpi\>' ,'ϖ')
+ call s:Greek('texGreek','\\rho\>' ,'ρ')
+ call s:Greek('texGreek','\\varrho\>' ,'ϱ')
+ call s:Greek('texGreek','\\sigma\>' ,'σ')
+ call s:Greek('texGreek','\\varsigma\>' ,'ς')
+ call s:Greek('texGreek','\\tau\>' ,'τ')
+ call s:Greek('texGreek','\\upsilon\>' ,'υ')
+ call s:Greek('texGreek','\\phi\>' ,'ϕ')
+ call s:Greek('texGreek','\\varphi\>' ,'φ')
+ call s:Greek('texGreek','\\chi\>' ,'χ')
+ call s:Greek('texGreek','\\psi\>' ,'ψ')
+ call s:Greek('texGreek','\\omega\>' ,'ω')
+ call s:Greek('texGreek','\\Gamma\>' ,'Γ')
+ call s:Greek('texGreek','\\Delta\>' ,'Δ')
+ call s:Greek('texGreek','\\Theta\>' ,'Θ')
+ call s:Greek('texGreek','\\Lambda\>' ,'Λ')
+ call s:Greek('texGreek','\\Xi\>' ,'Ξ')
+ call s:Greek('texGreek','\\Pi\>' ,'Π')
+ call s:Greek('texGreek','\\Sigma\>' ,'Σ')
+ call s:Greek('texGreek','\\Upsilon\>' ,'Υ')
+ call s:Greek('texGreek','\\Phi\>' ,'Φ')
+ call s:Greek('texGreek','\\Chi\>' ,'Χ')
+ call s:Greek('texGreek','\\Psi\>' ,'Ψ')
+ call s:Greek('texGreek','\\Omega\>' ,'Ω')
+ delfun s:Greek
+ endif
+
+ " Superscripts/Subscripts {{{2
+ if s:tex_conceal =~# 's'
+ if s:tex_fast =~# 's'
+ syn region texSuperscript matchgroup=texDelimiter start='\^{' skip="\\\\\|\\[{}]" end='}' contained concealends contains=texSpecialChar,texSuperscripts,texStatement,texSubscript,texSuperscript,texMathMatcher
+ syn region texSubscript matchgroup=texDelimiter start='_{' skip="\\\\\|\\[{}]" end='}' contained concealends contains=texSpecialChar,texSubscripts,texStatement,texSubscript,texSuperscript,texMathMatcher
+ endif
+ " s:SuperSub:
+ fun! s:SuperSub(group,leader,pat,cchar)
+ if a:pat =~# '^\\' || (a:leader == '\^' && a:pat =~# s:tex_superscripts) || (a:leader == '_' && a:pat =~# s:tex_subscripts)
+" call Decho("SuperSub: group<".a:group."> leader<".a:leader."> pat<".a:pat."> cchar<".a:cchar.">")
+ exe 'syn match '.a:group." '".a:leader.a:pat."' contained conceal cchar=".a:cchar
+ exe 'syn match '.a:group."s '".a:pat ."' contained conceal cchar=".a:cchar.' nextgroup='.a:group.'s'
+ endif
+ endfun
+ call s:SuperSub('texSuperscript','\^','0','⁰')
+ call s:SuperSub('texSuperscript','\^','1','¹')
+ call s:SuperSub('texSuperscript','\^','2','²')
+ call s:SuperSub('texSuperscript','\^','3','³')
+ call s:SuperSub('texSuperscript','\^','4','⁴')
+ call s:SuperSub('texSuperscript','\^','5','⁵')
+ call s:SuperSub('texSuperscript','\^','6','⁶')
+ call s:SuperSub('texSuperscript','\^','7','⁷')
+ call s:SuperSub('texSuperscript','\^','8','⁸')
+ call s:SuperSub('texSuperscript','\^','9','⁹')
+ call s:SuperSub('texSuperscript','\^','a','ᵃ')
+ call s:SuperSub('texSuperscript','\^','b','ᵇ')
+ call s:SuperSub('texSuperscript','\^','c','ᶜ')
+ call s:SuperSub('texSuperscript','\^','d','ᵈ')
+ call s:SuperSub('texSuperscript','\^','e','ᵉ')
+ call s:SuperSub('texSuperscript','\^','f','ᶠ')
+ call s:SuperSub('texSuperscript','\^','g','ᵍ')
+ call s:SuperSub('texSuperscript','\^','h','ʰ')
+ call s:SuperSub('texSuperscript','\^','i','ⁱ')
+ call s:SuperSub('texSuperscript','\^','j','ʲ')
+ call s:SuperSub('texSuperscript','\^','k','ᵏ')
+ call s:SuperSub('texSuperscript','\^','l','ˡ')
+ call s:SuperSub('texSuperscript','\^','m','ᵐ')
+ call s:SuperSub('texSuperscript','\^','n','ⁿ')
+ call s:SuperSub('texSuperscript','\^','o','ᵒ')
+ call s:SuperSub('texSuperscript','\^','p','ᵖ')
+ call s:SuperSub('texSuperscript','\^','r','ʳ')
+ call s:SuperSub('texSuperscript','\^','s','ˢ')
+ call s:SuperSub('texSuperscript','\^','t','ᵗ')
+ call s:SuperSub('texSuperscript','\^','u','ᵘ')
+ call s:SuperSub('texSuperscript','\^','v','ᵛ')
+ call s:SuperSub('texSuperscript','\^','w','ʷ')
+ call s:SuperSub('texSuperscript','\^','x','ˣ')
+ call s:SuperSub('texSuperscript','\^','y','ʸ')
+ call s:SuperSub('texSuperscript','\^','z','ᶻ')
+ call s:SuperSub('texSuperscript','\^','A','ᴬ')
+ call s:SuperSub('texSuperscript','\^','B','ᴮ')
+ call s:SuperSub('texSuperscript','\^','D','ᴰ')
+ call s:SuperSub('texSuperscript','\^','E','ᴱ')
+ call s:SuperSub('texSuperscript','\^','G','ᴳ')
+ call s:SuperSub('texSuperscript','\^','H','ᴴ')
+ call s:SuperSub('texSuperscript','\^','I','ᴵ')
+ call s:SuperSub('texSuperscript','\^','J','ᴶ')
+ call s:SuperSub('texSuperscript','\^','K','ᴷ')
+ call s:SuperSub('texSuperscript','\^','L','ᴸ')
+ call s:SuperSub('texSuperscript','\^','M','ᴹ')
+ call s:SuperSub('texSuperscript','\^','N','ᴺ')
+ call s:SuperSub('texSuperscript','\^','O','ᴼ')
+ call s:SuperSub('texSuperscript','\^','P','ᴾ')
+ call s:SuperSub('texSuperscript','\^','R','ᴿ')
+ call s:SuperSub('texSuperscript','\^','T','ᵀ')
+ call s:SuperSub('texSuperscript','\^','U','ᵁ')
+ call s:SuperSub('texSuperscript','\^','V','ⱽ')
+ call s:SuperSub('texSuperscript','\^','W','ᵂ')
+ call s:SuperSub('texSuperscript','\^',',','︐')
+ call s:SuperSub('texSuperscript','\^',':','︓')
+ call s:SuperSub('texSuperscript','\^',';','︔')
+ call s:SuperSub('texSuperscript','\^','+','⁺')
+ call s:SuperSub('texSuperscript','\^','-','⁻')
+ call s:SuperSub('texSuperscript','\^','<','˂')
+ call s:SuperSub('texSuperscript','\^','>','˃')
+ call s:SuperSub('texSuperscript','\^','/','ˊ')
+ call s:SuperSub('texSuperscript','\^','(','⁽')
+ call s:SuperSub('texSuperscript','\^',')','⁾')
+ call s:SuperSub('texSuperscript','\^','\.','˙')
+ call s:SuperSub('texSuperscript','\^','=','˭')
+ call s:SuperSub('texSubscript','_','0','₀')
+ call s:SuperSub('texSubscript','_','1','₁')
+ call s:SuperSub('texSubscript','_','2','₂')
+ call s:SuperSub('texSubscript','_','3','₃')
+ call s:SuperSub('texSubscript','_','4','₄')
+ call s:SuperSub('texSubscript','_','5','₅')
+ call s:SuperSub('texSubscript','_','6','₆')
+ call s:SuperSub('texSubscript','_','7','₇')
+ call s:SuperSub('texSubscript','_','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','_','-','₋')
+ call s:SuperSub('texSubscript','_','/','ˏ')
+ call s:SuperSub('texSubscript','_','(','₍')
+ call s:SuperSub('texSubscript','_',')','₎')
+ call s:SuperSub('texSubscript','_','\.','‸')
+ call s:SuperSub('texSubscript','_','r','ᵣ')
+ call s:SuperSub('texSubscript','_','v','ᵥ')
+ call s:SuperSub('texSubscript','_','x','ₓ')
+ call s:SuperSub('texSubscript','_','\\beta\>' ,'ᵦ')
+ call s:SuperSub('texSubscript','_','\\delta\>','ᵨ')
+ call s:SuperSub('texSubscript','_','\\phi\>' ,'ᵩ')
+ call s:SuperSub('texSubscript','_','\\gamma\>','ᵧ')
+ call s:SuperSub('texSubscript','_','\\chi\>' ,'ᵪ')
+
+ delfun s:SuperSub
+ endif
+
+ " 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 '--'
+ syn match texLigature '---'
+ else
+ fun! s:Accents(chr,...)
+ let i= 1
+ for accent in ["`","\\'","^",'"','\~','\.','=',"c","H","k","r","u","v"]
+ if i > a:0
+ break
+ endif
+ if strlen(a:{i}) == 0 || a:{i} == ' ' || a:{i} == '?'
+ let i= i + 1
+ continue
+ endif
+ if accent =~# '\a'
+ exe "syn match texAccent '".'\\'.accent.'\(\s*{'.a:chr.'}\|\s\+'.a:chr.'\)'."' conceal cchar=".a:{i}
+ else
+ exe "syn match texAccent '".'\\'.accent.'\s*\({'.a:chr.'}\|'.a:chr.'\)'."' conceal cchar=".a:{i}
+ endif
+ let i= i + 1
+ endfor
+ endfun
+ " \` \' \^ \" \~ \. \= \c \H \k \r \u \v
+ call s:Accents('a','à','á','â','ä','ã','ȧ','ā',' ',' ','ą','å','ă','ǎ')
+ call s:Accents('A','À','Á','Â','Ä','Ã','Ȧ','Ā',' ',' ','Ą','Å','Ă','Ǎ')
+ call s:Accents('c',' ','ć','ĉ',' ',' ','ċ',' ','ç',' ',' ',' ',' ','č')
+ call s:Accents('C',' ','Ć','Ĉ',' ',' ','Ċ',' ','Ç',' ',' ',' ',' ','Č')
+ call s:Accents('d',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','ď')
+ call s:Accents('D',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','Ď')
+ call s:Accents('e','è','é','ê','ë','ẽ','ė','ē','ȩ',' ','ę',' ','ĕ','ě')
+ call s:Accents('E','È','É','Ê','Ë','Ẽ','Ė','Ē','Ȩ',' ','Ę',' ','Ĕ','Ě')
+ call s:Accents('g',' ','ǵ','ĝ',' ',' ','ġ',' ','ģ',' ',' ',' ','ğ','ǧ')
+ call s:Accents('G',' ','Ǵ','Ĝ',' ',' ','Ġ',' ','Ģ',' ',' ',' ','Ğ','Ǧ')
+ call s:Accents('h',' ',' ','ĥ',' ',' ',' ',' ',' ',' ',' ',' ',' ','ȟ')
+ call s:Accents('H',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','Ȟ')
+ call s:Accents('i','ì','í','î','ï','ĩ','į','ī',' ',' ','į',' ','ĭ','ǐ')
+ call s:Accents('I','Ì','Í','Î','Ï','Ĩ','İ','Ī',' ',' ','Į',' ','Ĭ','Ǐ')
+ call s:Accents('J',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','ǰ')
+ call s:Accents('k',' ',' ',' ',' ',' ',' ',' ','ķ',' ',' ',' ',' ','ǩ')
+ call s:Accents('K',' ',' ',' ',' ',' ',' ',' ','Ķ',' ',' ',' ',' ','Ǩ')
+ call s:Accents('l',' ','ĺ','ľ',' ',' ',' ',' ','ļ',' ',' ',' ',' ','ľ')
+ call s:Accents('L',' ','Ĺ','Ľ',' ',' ',' ',' ','Ļ',' ',' ',' ',' ','Ľ')
+ call s:Accents('n',' ','ń',' ',' ','ñ',' ',' ','ņ',' ',' ',' ',' ','ň')
+ call s:Accents('N',' ','Ń',' ',' ','Ñ',' ',' ','Ņ',' ',' ',' ',' ','Ň')
+ call s:Accents('o','ò','ó','ô','ö','õ','ȯ','ō',' ','ő','ǫ',' ','ŏ','ǒ')
+ call s:Accents('O','Ò','Ó','Ô','Ö','Õ','Ȯ','Ō',' ','Ő','Ǫ',' ','Ŏ','Ǒ')
+ call s:Accents('r',' ','ŕ',' ',' ',' ',' ',' ','ŗ',' ',' ',' ',' ','ř')
+ call s:Accents('R',' ','Ŕ',' ',' ',' ',' ',' ','Ŗ',' ',' ',' ',' ','Ř')
+ call s:Accents('s',' ','ś','ŝ',' ',' ',' ',' ','ş',' ','ȿ',' ',' ','š')
+ call s:Accents('S',' ','Ś','Ŝ',' ',' ',' ',' ','Ş',' ',' ',' ',' ','Š')
+ call s:Accents('t',' ',' ',' ',' ',' ',' ',' ','ţ',' ',' ',' ',' ','ť')
+ call s:Accents('T',' ',' ',' ',' ',' ',' ',' ','Ţ',' ',' ',' ',' ','Ť')
+ call s:Accents('u','ù','ú','û','ü','ũ',' ','ū',' ','ű','ų','ů','ŭ','ǔ')
+ call s:Accents('U','Ù','Ú','Û','Ü','Ũ',' ','Ū',' ','Ű','Ų','Ů','Ŭ','Ǔ')
+ call s:Accents('w',' ',' ','ŵ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ')
+ call s:Accents('W',' ',' ','Ŵ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ')
+ call s:Accents('y','ỳ','ý','ŷ','ÿ','ỹ',' ',' ',' ',' ',' ',' ',' ',' ')
+ call s:Accents('Y','Ỳ','Ý','Ŷ','Ÿ','Ỹ',' ',' ',' ',' ',' ',' ',' ',' ')
+ call s:Accents('z',' ','ź',' ',' ',' ','ż',' ',' ',' ',' ',' ',' ','ž')
+ call s:Accents('Z',' ','Ź',' ',' ',' ','Ż',' ',' ',' ',' ',' ',' ','Ž')
+ 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 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
+
+" ---------------------------------------------------------------------
+" LaTeX synchronization: {{{1
+syn sync maxlines=200
+syn sync minlines=50
+
+syn sync match texSyncStop groupthere NONE "%stopzone\>"
+
+" Synchronization: {{{1
+" The $..$ and $$..$$ make for impossible sync patterns
+" (one can't tell if a "$$" starts or stops a math zone by itself)
+" The following grouptheres coupled with minlines above
+" help improve the odds of good syncing.
+if !exists("g:tex_no_math")
+ syn sync match texSyncMathZoneA groupthere NONE "\\end{abstract}"
+ syn sync match texSyncMathZoneA groupthere NONE "\\end{center}"
+ syn sync match texSyncMathZoneA groupthere NONE "\\end{description}"
+ syn sync match texSyncMathZoneA groupthere NONE "\\end{enumerate}"
+ syn sync match texSyncMathZoneA groupthere NONE "\\end{itemize}"
+ syn sync match texSyncMathZoneA groupthere NONE "\\end{table}"
+ syn sync match texSyncMathZoneA groupthere NONE "\\end{tabular}"
+ syn sync match texSyncMathZoneA groupthere NONE "\\\(sub\)*section\>"
+endif
+
+" ---------------------------------------------------------------------
+" Highlighting: {{{1
+
+" 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")
+ hi def link texBadMath texError
+ hi def link texBadPar texBadMath
+ hi def link texMathDelimBad texError
+ hi def link texMathError texError
+ if !b:tex_stylish
+ hi def link texOnlyMath texError
+ endif
+ endif
+ 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
+ hi def link texEmphStyle texItalStyle
+ 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")
+ 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
+ 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
+ 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
+delc TexFold
+unlet s:extfname
+let b:current_syntax = "tex"
+let &cpo = s:keepcpo
+unlet s:keepcpo
+" vim: ts=8 fdm=marker
diff --git a/runtime/syntax/texinfo.vim b/runtime/syntax/texinfo.vim
new file mode 100644
index 0000000..79a4dfe
--- /dev/null
+++ b/runtime/syntax/texinfo.vim
@@ -0,0 +1,46 @@
+" Vim syntax file
+" Language: Texinfo (documentation format)
+" Maintainer: Robert Dodier <robert.dodier@gmail.com>
+" Latest Revision: 2021-12-15
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match texinfoControlSequence display '\(@end [a-zA-Z@]\+\|@[a-zA-Z@]\+\)'
+
+syn match texinfoComment display '^\s*\(@comment\|@c\)\>.*$'
+
+syn region texinfoCode matchgroup=texinfoControlSequence start="@code{" end="}" contains=ALL
+syn region texinfoVerb matchgroup=texinfoControlSequence start="@verb{" end="}" contains=ALL
+
+syn region texinfoArgument matchgroup=texinfoBrace start="{" end="}" contains=ALLBUT
+
+syn region texinfoExample matchgroup=texinfoControlSequence start="^@example\s*$" end="^@end example\s*$" contains=ALL
+
+syn region texinfoVerbatim matchgroup=texinfoControlSequence start="^@verbatim\s*$" end="^@end verbatim\s*$"
+
+syn region texinfoMenu matchgroup=texinfoControlSequence start="^@menu\s*$" end="^@end menu\s*$"
+
+if exists("g:texinfo_delimiters")
+ syn match texinfoDelimiter display '[][{}]'
+endif
+
+hi def link texinfoDelimiter Delimiter
+hi def link texinfoComment Comment
+hi def link texinfoControlSequence Identifier
+hi def link texinfoBrace Operator
+hi def link texinfoArgument Special
+hi def link texinfoExample String
+hi def link texinfoVerbatim String
+hi def link texinfoVerb String
+hi def link texinfoCode String
+hi def link texinfoMenu String
+
+let b:current_syntax = "texinfo"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/texmf.vim b/runtime/syntax/texmf.vim
new file mode 100644
index 0000000..d1268fa
--- /dev/null
+++ b/runtime/syntax/texmf.vim
@@ -0,0 +1,74 @@
+" Vim syntax file
+" This is a GENERATED FILE. Please always refer to source file at the URI below.
+" Language: Web2C TeX texmf.cnf configuration file
+" Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2001-05-13
+" URL: http://physics.muni.cz/~yeti/download/syntax/texmf.vim
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+" Comments
+syn match texmfComment "%..\+$" contains=texmfTodo
+syn match texmfComment "%\s*$" contains=texmfTodo
+syn keyword texmfTodo TODO FIXME XXX NOT contained
+
+" Constants and parameters
+syn match texmfPassedParameter "[-+]\=%\w\W"
+syn match texmfPassedParameter "[-+]\=%\w$"
+syn match texmfNumber "\<\d\+\>"
+syn match texmfVariable "\$\(\w\k*\|{\w\k*}\)"
+syn match texmfSpecial +\\"\|\\$+
+syn region texmfString start=+"+ end=+"+ skip=+\\"\\\\+ contains=texmfVariable,texmfSpecial,texmfPassedParameter
+
+" Assignments
+syn match texmfLHSStart "^\s*\w\k*" nextgroup=texmfLHSDot,texmfEquals
+syn match texmfLHSVariable "\w\k*" contained nextgroup=texmfLHSDot,texmfEquals
+syn match texmfLHSDot "\." contained nextgroup=texmfLHSVariable
+syn match texmfEquals "\s*=" contained
+
+" Specialities
+syn match texmfComma "," contained
+syn match texmfColons ":\|;"
+syn match texmfDoubleExclam "!!" contained
+
+" Catch errors caused by wrong parenthesization
+syn region texmfBrace matchgroup=texmfBraceBrace start="{" end="}" contains=ALLBUT,texmfTodo,texmfBraceError,texmfLHSVariable,texmfLHSDot transparent
+syn match texmfBraceError "}"
+
+" Define the default highlighting
+
+hi def link texmfComment Comment
+hi def link texmfTodo Todo
+
+hi def link texmfPassedParameter texmfVariable
+hi def link texmfVariable Identifier
+
+hi def link texmfNumber Number
+hi def link texmfString String
+
+hi def link texmfLHSStart texmfLHS
+hi def link texmfLHSVariable texmfLHS
+hi def link texmfLHSDot texmfLHS
+hi def link texmfLHS Type
+
+hi def link texmfEquals Normal
+
+hi def link texmfBraceBrace texmfDelimiter
+hi def link texmfComma texmfDelimiter
+hi def link texmfColons texmfDelimiter
+hi def link texmfDelimiter Preproc
+
+hi def link texmfDoubleExclam Statement
+hi def link texmfSpecial Special
+
+hi def link texmfBraceError texmfError
+hi def link texmfError Error
+
+
+let b:current_syntax = "texmf"
diff --git a/runtime/syntax/tf.vim b/runtime/syntax/tf.vim
new file mode 100644
index 0000000..47775b8
--- /dev/null
+++ b/runtime/syntax/tf.vim
@@ -0,0 +1,196 @@
+" Vim syntax file
+" Language: tf
+" Maintainer: Lutz Eymers <ixtab@polzin.com>
+" URL: http://www.isp.de/data/tf.vim
+" Email: send syntax_vim.tgz
+" Last Change: 2001 May 10
+"
+" Options lite_minlines = x to sync at least x lines backwards
+
+" Remove any old syntax stuff hanging around
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+if !exists("main_syntax")
+ let main_syntax = 'tf'
+endif
+
+" Special global variables
+syn keyword tfVar HOME LANG MAIL SHELL TERM TFHELP TFLIBDIR TFLIBRARY TZ contained
+syn keyword tfVar background backslash contained
+syn keyword tfVar bamf bg_output borg clearfull cleardone clock connect contained
+syn keyword tfVar emulation end_color gag gethostbyname gpri hook hilite contained
+syn keyword tfVar hiliteattr histsize hpri insert isize istrip kecho contained
+syn keyword tfVar kprefix login lp lpquote maildelay matching max_iter contained
+syn keyword tfVar max_recur mecho more mprefix oldslash promt_sec contained
+syn keyword tfVar prompt_usec proxy_host proxy_port ptime qecho qprefix contained
+syn keyword tfVar quite quitdone redef refreshtime scroll shpause snarf sockmload contained
+syn keyword tfVar start_color tabsize telopt sub time_format visual contained
+syn keyword tfVar watch_dog watchname wordpunct wrap wraplog wrapsize contained
+syn keyword tfVar wrapspace contained
+
+" Worldvar
+syn keyword tfWorld world_name world_character world_password world_host contained
+syn keyword tfWorld world_port world_mfile world_type contained
+
+" Number
+syn match tfNumber "-\=\<\d\+\>"
+
+" Float
+syn match tfFloat "\(-\=\<\d+\|-\=\)\.\d\+\>"
+
+" Operator
+syn match tfOperator "[-+=?:&|!]"
+syn match tfOperator "/[^*~@]"he=e-1
+syn match tfOperator ":="
+syn match tfOperator "[^/%]\*"hs=s+1
+syn match tfOperator "$\+[([{]"he=e-1,me=e-1
+syn match tfOperator "\^\[\+"he=s+1 contains=tfSpecialCharEsc
+
+" Relational
+syn match tfRelation "&&"
+syn match tfRelation "||"
+syn match tfRelation "[<>/!=]="
+syn match tfRelation "[<>]"
+syn match tfRelation "[!=]\~"
+syn match tfRelation "[=!]/"
+
+
+" Readonly Var
+syn match tfReadonly "[#*]" contained
+syn match tfReadonly "\<-\=L\=\d\{-}\>" contained
+syn match tfReadonly "\<P\(\d\+\|R\|L\)\>" contained
+syn match tfReadonly "\<R\>" contained
+
+" Identifier
+syn match tfIdentifier "%\+[a-zA-Z_#*-0-9]\w*" contains=tfVar,tfReadonly
+syn match tfIdentifier "%\+[{]"he=e-1,me=e-1
+syn match tfIdentifier "\$\+{[a-zA-Z_#*-0-9]\w*}" contains=tfWorld
+
+" Function names
+syn keyword tfFunctions ascii char columns echo filename ftime fwrite getopts
+syn keyword tfFunctions getpid idle kbdel kbgoto kbhead kblen kbmatch kbpoint
+syn keyword tfFunctions kbtail kbwordleft kbwordright keycode lines mod
+syn keyword tfFunctions moresize pad rand read regmatch send strcat strchr
+syn keyword tfFunctions strcmp strlen strncmp strrchr strrep strstr substr
+syn keyword tfFunctions systype time tolower toupper
+
+syn keyword tfStatement addworld bamf beep bind break cat changes connect contained
+syn keyword tfStatement dc def dokey echo edit escape eval export expr fg for contained
+syn keyword tfStatement gag getfile grab help hilite histsize hook if input contained
+syn keyword tfStatement kill lcd let list listsockets listworlds load contained
+syn keyword tfStatement localecho log nohilite not partial paste ps purge contained
+syn keyword tfStatement purgeworld putfile quit quote recall recordline save contained
+syn keyword tfStatement saveworld send sh shift sub substitute contained
+syn keyword tfStatement suspend telnet test time toggle trig trigger unbind contained
+syn keyword tfStatement undef undefn undeft unhook untrig unworld contained
+syn keyword tfStatement version watchdog watchname while world contained
+
+" Hooks
+syn keyword tfHook ACTIVITY BACKGROUND BAMF CONFAIL CONFLICT CONNECT DISCONNECT
+syn keyword tfHook KILL LOAD LOADFAIL LOG LOGIN MAIL MORE PENDING PENDING
+syn keyword tfHook PROCESS PROMPT PROXY REDEF RESIZE RESUME SEND SHADOW SHELL
+syn keyword tfHook SIGHUP SIGTERM SIGUSR1 SIGUSR2 WORLD
+
+" Conditional
+syn keyword tfConditional if endif then else elseif contained
+
+" Repeat
+syn keyword tfRepeat while do done repeat for contained
+
+" Statement
+syn keyword tfStatement break quit contained
+
+" Include
+syn keyword tfInclude require load save loaded contained
+
+" Define
+syn keyword tfDefine bind unbind def undef undefn undefn purge hook unhook trig untrig contained
+syn keyword tfDefine set unset setenv contained
+
+" Todo
+syn keyword tfTodo TODO Todo todo contained
+
+" SpecialChar
+syn match tfSpecialChar "\\[abcfnrtyv\\]" contained
+syn match tfSpecialChar "\\\d\{3}" contained contains=tfOctalError
+syn match tfSpecialChar "\\x[0-9a-fA-F]\{2}" contained
+syn match tfSpecialCharEsc "\[\+" contained
+
+syn match tfOctalError "[89]" contained
+
+" Comment
+syn region tfComment start="^;" end="$" contains=tfTodo
+
+" String
+syn region tfString oneline matchgroup=None start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=tfIdentifier,tfSpecialChar,tfEscape
+syn region tfString matchgroup=None start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=tfIdentifier,tfSpecialChar,tfEscape
+
+syn match tfParentError "[)}\]]"
+
+" Parents
+syn region tfParent matchgroup=Delimiter start="(" end=")" contains=ALLBUT,tfReadonly
+syn region tfParent matchgroup=Delimiter start="\[" end="\]" contains=ALL
+syn region tfParent matchgroup=Delimiter start="{" end="}" contains=ALL
+
+syn match tfEndCommand "%%\{-};"
+syn match tfJoinLines "\\$"
+
+" Types
+
+syn match tfType "/[a-zA-Z_~@][a-zA-Z0-9_]*" contains=tfConditional,tfRepeat,tfStatement,tfInclude,tfDefine,tfStatement
+
+" Catch /quote .. '
+syn match tfQuotes "/quote .\{-}'" contains=ALLBUT,tfString
+" Catch $(/escape )
+syn match tfEscape "(/escape .*)"
+
+" sync
+if exists("tf_minlines")
+ exec "syn sync minlines=" . tf_minlines
+else
+ syn sync minlines=100
+endif
+
+" Define the default highlighting.
+" 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"
+
+if main_syntax == 'tf'
+ unlet main_syntax
+endif
+
+" vim: ts=8
diff --git a/runtime/syntax/tidy.vim b/runtime/syntax/tidy.vim
new file mode 100644
index 0000000..7ffda90
--- /dev/null
+++ b/runtime/syntax/tidy.vim
@@ -0,0 +1,276 @@
+" Vim syntax file
+" Language: HMTL Tidy Configuration
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2020 Sep 4
+
+" Preamble {{{1
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn iskeyword @,48-57,-,_
+
+" Values {{{1
+syn match tidyWordSeparator contained ",\|\s" nextgroup=tidyWord skipwhite skipnl
+syn match tidyMuteIDSeparator contained ",\|\s" nextgroup=tidyMuteID skipwhite skipnl
+
+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 tidyCustomTags contained no blocklevel empty inline pre
+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
+" Tag and attribute lists
+syn match tidyWord contained "\<\k\+\>:\@!" nextgroup=tidyWordSeparator skipwhite skipnl
+
+" Mute Message IDs {{{2
+syn keyword tidyMuteID ADDED_MISSING_CHARSET ANCHOR_DUPLICATED
+ \ ANCHOR_NOT_UNIQUE APOS_UNDEFINED APPLET_MISSING_ALT AREA_MISSING_ALT
+ \ ASCII_REQUIRES_DESCRIPTION ASSOCIATE_LABELS_EXPLICITLY
+ \ ASSOCIATE_LABELS_EXPLICITLY_FOR ASSOCIATE_LABELS_EXPLICITLY_ID
+ \ ATTRIBUTE_IS_NOT_ALLOWED ATTRIBUTE_VALUE_REPLACED
+ \ ATTR_VALUE_NOT_LCASE AUDIO_MISSING_TEXT_AIFF AUDIO_MISSING_TEXT_AU
+ \ AUDIO_MISSING_TEXT_RA AUDIO_MISSING_TEXT_RM AUDIO_MISSING_TEXT_SND
+ \ AUDIO_MISSING_TEXT_WAV BACKSLASH_IN_URI BAD_ATTRIBUTE_VALUE
+ \ BAD_ATTRIBUTE_VALUE_REPLACED BAD_CDATA_CONTENT BAD_SUMMARY_HTML5
+ \ BAD_SURROGATE_LEAD BAD_SURROGATE_PAIR BAD_SURROGATE_TAIL
+ \ CANT_BE_NESTED COERCE_TO_ENDTAG COLOR_CONTRAST_ACTIVE_LINK
+ \ COLOR_CONTRAST_LINK COLOR_CONTRAST_TEXT COLOR_CONTRAST_VISITED_LINK
+ \ CONTENT_AFTER_BODY CUSTOM_TAG_DETECTED DATA_TABLE_MISSING_HEADERS
+ \ DATA_TABLE_MISSING_HEADERS_COLUMN DATA_TABLE_MISSING_HEADERS_ROW
+ \ DATA_TABLE_REQUIRE_MARKUP_COLUMN_HEADERS
+ \ DATA_TABLE_REQUIRE_MARKUP_ROW_HEADERS DISCARDING_UNEXPECTED
+ \ DOCTYPE_AFTER_TAGS DOCTYPE_MISSING DUPLICATE_FRAMESET
+ \ ELEMENT_NOT_EMPTY ELEMENT_VERS_MISMATCH_ERROR
+ \ ELEMENT_VERS_MISMATCH_WARN ENCODING_MISMATCH
+ \ ENSURE_PROGRAMMATIC_OBJECTS_ACCESSIBLE_APPLET
+ \ ENSURE_PROGRAMMATIC_OBJECTS_ACCESSIBLE_EMBED
+ \ ENSURE_PROGRAMMATIC_OBJECTS_ACCESSIBLE_OBJECT
+ \ ENSURE_PROGRAMMATIC_OBJECTS_ACCESSIBLE_SCRIPT ESCAPED_ILLEGAL_URI
+ \ FILE_CANT_OPEN FILE_CANT_OPEN_CFG FILE_NOT_FILE FIXED_BACKSLASH
+ \ FOUND_STYLE_IN_BODY FRAME_MISSING_LONGDESC FRAME_MISSING_NOFRAMES
+ \ FRAME_MISSING_TITLE FRAME_SRC_INVALID FRAME_TITLE_INVALID_NULL
+ \ FRAME_TITLE_INVALID_SPACES HEADERS_IMPROPERLY_NESTED
+ \ HEADER_USED_FORMAT_TEXT ID_NAME_MISMATCH ILLEGAL_NESTING
+ \ ILLEGAL_URI_CODEPOINT ILLEGAL_URI_REFERENCE
+ \ IMAGE_MAP_SERVER_SIDE_REQUIRES_CONVERSION
+ \ IMG_ALT_SUSPICIOUS_FILENAME IMG_ALT_SUSPICIOUS_FILE_SIZE
+ \ IMG_ALT_SUSPICIOUS_PLACEHOLDER IMG_ALT_SUSPICIOUS_TOO_LONG
+ \ IMG_BUTTON_MISSING_ALT IMG_MAP_CLIENT_MISSING_TEXT_LINKS
+ \ IMG_MAP_SERVER_REQUIRES_TEXT_LINKS IMG_MISSING_ALT IMG_MISSING_DLINK
+ \ IMG_MISSING_LONGDESC IMG_MISSING_LONGDESC_DLINK
+ \ INFORMATION_NOT_CONVEYED_APPLET INFORMATION_NOT_CONVEYED_IMAGE
+ \ INFORMATION_NOT_CONVEYED_INPUT INFORMATION_NOT_CONVEYED_OBJECT
+ \ INFORMATION_NOT_CONVEYED_SCRIPT INSERTING_AUTO_ATTRIBUTE
+ \ INSERTING_TAG INVALID_ATTRIBUTE INVALID_NCR INVALID_SGML_CHARS
+ \ INVALID_UTF16 INVALID_UTF8 INVALID_XML_ID JOINING_ATTRIBUTE
+ \ LANGUAGE_INVALID LANGUAGE_NOT_IDENTIFIED
+ \ LAYOUT_TABLES_LINEARIZE_PROPERLY LAYOUT_TABLE_INVALID_MARKUP
+ \ LINK_TEXT_MISSING LINK_TEXT_NOT_MEANINGFUL
+ \ LINK_TEXT_NOT_MEANINGFUL_CLICK_HERE LINK_TEXT_TOO_LONG
+ \ LIST_USAGE_INVALID_LI LIST_USAGE_INVALID_OL LIST_USAGE_INVALID_UL
+ \ MALFORMED_COMMENT MALFORMED_COMMENT_DROPPING MALFORMED_COMMENT_EOS
+ \ MALFORMED_COMMENT_WARN MALFORMED_DOCTYPE METADATA_MISSING
+ \ METADATA_MISSING_REDIRECT_AUTOREFRESH MISMATCHED_ATTRIBUTE_ERROR
+ \ MISMATCHED_ATTRIBUTE_WARN MISSING_ATTRIBUTE MISSING_ATTR_VALUE
+ \ MISSING_DOCTYPE MISSING_ENDTAG_BEFORE MISSING_ENDTAG_FOR
+ \ MISSING_ENDTAG_OPTIONAL MISSING_IMAGEMAP MISSING_QUOTEMARK
+ \ MISSING_QUOTEMARK_OPEN MISSING_SEMICOLON MISSING_SEMICOLON_NCR
+ \ MISSING_STARTTAG MISSING_TITLE_ELEMENT MOVED_STYLE_TO_HEAD
+ \ MULTIMEDIA_REQUIRES_TEXT NESTED_EMPHASIS NESTED_QUOTATION
+ \ NEWLINE_IN_URI NEW_WINDOWS_REQUIRE_WARNING_BLANK
+ \ NEW_WINDOWS_REQUIRE_WARNING_NEW NOFRAMES_CONTENT
+ \ NOFRAMES_INVALID_CONTENT NOFRAMES_INVALID_LINK
+ \ NOFRAMES_INVALID_NO_VALUE NON_MATCHING_ENDTAG OBJECT_MISSING_ALT
+ \ OBSOLETE_ELEMENT OPTION_REMOVED OPTION_REMOVED_APPLIED
+ \ OPTION_REMOVED_UNAPPLIED POTENTIAL_HEADER_BOLD
+ \ POTENTIAL_HEADER_ITALICS POTENTIAL_HEADER_UNDERLINE
+ \ PREVIOUS_LOCATION PROGRAMMATIC_OBJECTS_REQUIRE_TESTING_APPLET
+ \ PROGRAMMATIC_OBJECTS_REQUIRE_TESTING_EMBED
+ \ PROGRAMMATIC_OBJECTS_REQUIRE_TESTING_OBJECT
+ \ PROGRAMMATIC_OBJECTS_REQUIRE_TESTING_SCRIPT PROPRIETARY_ATTRIBUTE
+ \ PROPRIETARY_ATTR_VALUE PROPRIETARY_ELEMENT REMOVED_HTML5
+ \ REMOVE_AUTO_REDIRECT REMOVE_AUTO_REFRESH REMOVE_BLINK_MARQUEE
+ \ REMOVE_FLICKER_ANIMATED_GIF REMOVE_FLICKER_APPLET
+ \ REMOVE_FLICKER_EMBED REMOVE_FLICKER_OBJECT REMOVE_FLICKER_SCRIPT
+ \ REPEATED_ATTRIBUTE REPLACE_DEPRECATED_HTML_APPLET
+ \ REPLACE_DEPRECATED_HTML_BASEFONT REPLACE_DEPRECATED_HTML_CENTER
+ \ REPLACE_DEPRECATED_HTML_DIR REPLACE_DEPRECATED_HTML_FONT
+ \ REPLACE_DEPRECATED_HTML_ISINDEX REPLACE_DEPRECATED_HTML_MENU
+ \ REPLACE_DEPRECATED_HTML_S REPLACE_DEPRECATED_HTML_STRIKE
+ \ REPLACE_DEPRECATED_HTML_U REPLACING_ELEMENT REPLACING_UNEX_ELEMENT
+ \ SCRIPT_MISSING_NOSCRIPT SCRIPT_NOT_KEYBOARD_ACCESSIBLE_ON_CLICK
+ \ SCRIPT_NOT_KEYBOARD_ACCESSIBLE_ON_MOUSE_DOWN
+ \ SCRIPT_NOT_KEYBOARD_ACCESSIBLE_ON_MOUSE_MOVE
+ \ SCRIPT_NOT_KEYBOARD_ACCESSIBLE_ON_MOUSE_OUT
+ \ SCRIPT_NOT_KEYBOARD_ACCESSIBLE_ON_MOUSE_OVER
+ \ SCRIPT_NOT_KEYBOARD_ACCESSIBLE_ON_MOUSE_UP SKIPOVER_ASCII_ART
+ \ SPACE_PRECEDING_XMLDECL STRING_ARGUMENT_BAD STRING_CONTENT_LOOKS
+ \ STRING_DOCTYPE_GIVEN STRING_MISSING_MALFORMED STRING_MUTING_TYPE
+ \ STRING_NO_SYSID STRING_UNKNOWN_OPTION
+ \ STYLESHEETS_REQUIRE_TESTING_LINK
+ \ STYLESHEETS_REQUIRE_TESTING_STYLE_ATTR
+ \ STYLESHEETS_REQUIRE_TESTING_STYLE_ELEMENT
+ \ STYLE_SHEET_CONTROL_PRESENTATION SUSPECTED_MISSING_QUOTE
+ \ TABLE_MAY_REQUIRE_HEADER_ABBR TABLE_MAY_REQUIRE_HEADER_ABBR_NULL
+ \ TABLE_MAY_REQUIRE_HEADER_ABBR_SPACES TABLE_MISSING_CAPTION
+ \ TABLE_MISSING_SUMMARY TABLE_SUMMARY_INVALID_NULL
+ \ TABLE_SUMMARY_INVALID_PLACEHOLDER TABLE_SUMMARY_INVALID_SPACES
+ \ TAG_NOT_ALLOWED_IN TEXT_EQUIVALENTS_REQUIRE_UPDATING_APPLET
+ \ TEXT_EQUIVALENTS_REQUIRE_UPDATING_OBJECT
+ \ TEXT_EQUIVALENTS_REQUIRE_UPDATING_SCRIPT TOO_MANY_ELEMENTS
+ \ TOO_MANY_ELEMENTS_IN TRIM_EMPTY_ELEMENT UNESCAPED_AMPERSAND
+ \ UNEXPECTED_ENDTAG UNEXPECTED_ENDTAG_ERR UNEXPECTED_ENDTAG_IN
+ \ UNEXPECTED_END_OF_FILE UNEXPECTED_END_OF_FILE_ATTR
+ \ UNEXPECTED_EQUALSIGN UNEXPECTED_GT UNEXPECTED_QUOTEMARK
+ \ UNKNOWN_ELEMENT UNKNOWN_ELEMENT_LOOKS_CUSTOM UNKNOWN_ENTITY
+ \ USING_BR_INPLACE_OF VENDOR_SPECIFIC_CHARS WHITE_IN_URI
+ \ XML_DECLARATION_DETECTED XML_ID_SYNTAX
+ \ contained nextgroup=tidyMuteIDSeparator skipwhite skipnl
+
+" Options {{{1
+syn keyword tidyCustomTagsOption custom-tags contained nextgroup=tidyCustomTagsDelimiter
+syn match tidyCustomTagsDelimiter ":" nextgroup=tidyCustomTags contained skipwhite
+
+syn keyword tidyBooleanOption add-meta-charset 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-style-tags 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-tabs keep-time language
+ \ literal-attributes logical-emphasis lower-literals markup
+ \ merge-emphasis mute-id 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-filename show-info show-meta-change show-warnings
+ \ skip-nested split strict-tags-attributes tidy-mark
+ \ uppercase-attributes uppercase-tags warn-proprietary-attributes
+ \ 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 fix-bad-comments 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,tidyString 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 tidyAttributesOption priority-attributes contained nextgroup=tidyAttributesDelimiter
+syn match tidyAttributesDelimiter ":" nextgroup=tidyWord contained skipwhite
+
+syn keyword tidyTagsOption new-blocklevel-tags new-empty-tags new-inline-tags new-pre-tags contained nextgroup=tidyTagsDelimiter
+syn match tidyTagsDelimiter ":" nextgroup=tidyWord 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 keyword tidyMuteOption mute contained nextgroup=tidyMuteDelimiter
+syn match tidyMuteDelimiter ":" nextgroup=tidyMuteID contained skipwhite
+
+syn cluster tidyOptions contains=tidy.*Option
+
+" Option line anchor {{{1
+syn match tidyStart "^" nextgroup=@tidyOptions
+" Long standing bug - option lines (except the first) with leading whitespace
+" are silently ignored.
+syn match tidyErrorStart '^\s\+\ze\S'
+
+" Comments {{{1
+syn match tidyComment "^\s*//.*$" contains=tidyTodo
+syn match tidyComment "^\s*#.*$" contains=tidyTodo
+syn keyword tidyTodo TODO NOTE FIXME XXX contained
+
+" Default highlighting {{{1
+hi def link tidyAttributesOption Identifier
+hi def link tidyAutoBooleanOption Identifier
+hi def link tidyBooleanOption Identifier
+hi def link tidyCSSSelectorOption Identifier
+hi def link tidyCustomTagsOption Identifier
+hi def link tidyDoctypeOption Identifier
+hi def link tidyEncodingOption Identifier
+hi def link tidyIntegerOption Identifier
+hi def link tidyMuteOption Identifier
+hi def link tidyNameOption Identifier
+hi def link tidyNewlineOption Identifier
+hi def link tidyRepeatOption Identifier
+hi def link tidySorterOption Identifier
+hi def link tidyStringOption Identifier
+hi def link tidyTagsOption Identifier
+
+hi def link tidyAttributesDelimiter Special
+hi def link tidyAutoBooleanDelimiter Special
+hi def link tidyBooleanDelimiter Special
+hi def link tidyCSSSelectorDelimiter Special
+hi def link tidyCustomTagsDelimiter Special
+hi def link tidyDoctypeDelimiter Special
+hi def link tidyEncodingDelimiter Special
+hi def link tidyIntegerDelimiter Special
+hi def link tidyMuteDelimiter Special
+hi def link tidyNameDelimiter Special
+hi def link tidyNewlineDelimiter Special
+hi def link tidyRepeatDelimiter Special
+hi def link tidySorterDelimiter Special
+hi def link tidyStringDelimiter Special
+hi def link tidyTagsDelimiter Special
+
+hi def link tidyAutoBoolean Boolean
+hi def link tidyBoolean Boolean
+hi def link tidyCustomTags Constant
+hi def link tidyDoctype Constant
+hi def link tidyEncoding Constant
+hi def link tidyMuteID Constant
+hi def link tidyNewline Constant
+hi def link tidyNumber Number
+hi def link tidyRepeat Constant
+hi def link tidySorter Constant
+hi def link tidyString String
+hi def link tidyWord Constant
+
+hi def link tidyComment Comment
+hi def link tidyTodo Todo
+
+hi def link tidyErrorStart Error
+
+" Postscript {{{1
+let b:current_syntax = "tidy"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 fdm=marker
diff --git a/runtime/syntax/tilde.vim b/runtime/syntax/tilde.vim
new file mode 100644
index 0000000..d2a3360
--- /dev/null
+++ b/runtime/syntax/tilde.vim
@@ -0,0 +1,41 @@
+" Vim syntax file
+" This file works only for Vim6.x
+" Language: Tilde
+" Maintainer: Tobias Rundström <tobi@tildesoftware.net>
+" URL: http://www.tildesoftware.net
+" CVS: $Id: tilde.vim,v 1.1 2004/06/13 19:31:51 vimboss Exp $
+
+if exists("b:current_syntax")
+ finish
+endif
+
+"tilde dosent care ...
+syn case ignore
+
+syn match tildeFunction "\~[a-z_0-9]\+"ms=s+1
+syn region tildeParen start="(" end=")" contains=tildeString,tildeNumber,tildeVariable,tildeField,tildeSymtab,tildeFunction,tildeParen,tildeHexNumber,tildeOperator
+syn region tildeString contained start=+"+ skip=+\\\\\|\\"+ end=+"+ keepend
+syn region tildeString contained start=+'+ skip=+\\\\\|\\"+ end=+'+ keepend
+syn match tildeNumber "\d" contained
+syn match tildeOperator "or\|and" contained
+syn match tildeHexNumber "0x[a-z0-9]\+" contained
+syn match tildeVariable "$[a-z_0-9]\+" contained
+syn match tildeField "%[a-z_0-9]\+" contained
+syn match tildeSymtab "@[a-z_0-9]\+" contained
+syn match tildeComment "^#.*"
+syn region tildeCurly start=+{+ end=+}+ contained contains=tildeLG,tildeString,tildeNumber,tildeVariable,tildeField,tildeFunction,tildeSymtab,tildeHexNumber
+syn match tildeLG "=>" contained
+
+
+hi def link tildeComment Comment
+hi def link tildeFunction Operator
+hi def link tildeOperator Operator
+hi def link tildeString String
+hi def link tildeNumber Number
+hi def link tildeHexNumber Number
+hi def link tildeVariable Identifier
+hi def link tildeField Identifier
+hi def link tildeSymtab Identifier
+hi def link tildeError Error
+
+let b:current_syntax = "tilde"
diff --git a/runtime/syntax/tli.vim b/runtime/syntax/tli.vim
new file mode 100644
index 0000000..b96d4a2
--- /dev/null
+++ b/runtime/syntax/tli.vim
@@ -0,0 +1,58 @@
+" Vim syntax file
+" Language: TealInfo source files (*.tli)
+" Maintainer: Kurt W. Andrews <kandrews@fastrans.net>
+" Last Change: 2001 May 10
+" Version: 1.0
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" TealInfo Objects
+
+syn keyword tliObject LIST POPLIST WINDOW POPWINDOW OUTLINE CHECKMARK GOTO
+syn keyword tliObject LABEL IMAGE RECT TRES PASSWORD POPEDIT POPIMAGE CHECKLIST
+
+" TealInfo Fields
+
+syn keyword tliField X Y W H BX BY BW BH SX SY FONT BFONT CYCLE DELAY TABS
+syn keyword tliField STYLE BTEXT RECORD DATABASE KEY TARGET DEFAULT TEXT
+syn keyword tliField LINKS MAXVAL
+
+" TealInfo Styles
+
+syn keyword tliStyle INVERTED HORIZ_RULE VERT_RULE NO_SCROLL NO_BORDER BOLD_BORDER
+syn keyword tliStyle ROUND_BORDER ALIGN_RIGHT ALIGN_CENTER ALIGN_LEFT_START ALIGN_RIGHT_START
+syn keyword tliStyle ALIGN_CENTER_START ALIGN_LEFT_END ALIGN_RIGHT_END ALIGN_CENTER_END
+syn keyword tliStyle LOCKOUT BUTTON_SCROLL BUTTON_SELECT STROKE_FIND FILLED REGISTER
+
+" String and Character constants
+
+syn match tliSpecial "@"
+syn region tliString start=+"+ end=+"+
+
+"TealInfo Numbers, identifiers and comments
+
+syn case ignore
+syn match tliNumber "\d*"
+syn match tliIdentifier "\<\h\w*\>"
+syn match tliComment "#.*"
+syn case match
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/tmux.vim b/runtime/syntax/tmux.vim
new file mode 100644
index 0000000..042b96e
--- /dev/null
+++ b/runtime/syntax/tmux.vim
@@ -0,0 +1,154 @@
+" Language: tmux(1) configuration file
+" Version: 3.3-rc (git-964deae4)
+" 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 compatibility 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 yes no
+
+syn keyword tmuxTodo FIXME NOTE TODO XXX contained
+
+syn match tmuxColour /\<colou\?r[0-9]\+\>/ display
+syn match tmuxKey /\(C-\|M-\|\^\)\+\S\+/ display
+syn match tmuxNumber /\<\d\+\>/ display
+syn match tmuxFlags /\s-\a\+/ display
+syn match tmuxVariableExpansion /\$\({[A-Za-z_]\w*}\|[A-Za-z_]\w*\)/ display
+syn match tmuxControl /^\s*%\(if\|elif\|else\|endif\)\>/
+syn match tmuxEscape /\\\(u\x\{4\}\|U\x\{8\}\|\o\{3\}\|[\\ernt$]\)/ display
+
+syn region tmuxComment start=/#/ skip=/\\\@<!\\$/ end=/$/ contains=tmuxTodo,@Spell
+
+syn region tmuxString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=tmuxFormatString,tmuxEscape,tmuxVariableExpansion,@Spell
+syn region tmuxUninterpolatedString start=+'+ skip=+\\$+ excludenl end=+'+ end='$' contains=tmuxFormatString,@Spell
+
+" TODO: Figure out how escaping works inside of #(...) and #{...} blocks.
+syn region tmuxFormatString start=/#[#DFhHIPSTW]/ end=// contained keepend
+syn region tmuxFormatString start=/#{/ skip=/#{.\{-}}/ end=/}/ keepend
+syn region tmuxFormatString start=/#(/ skip=/#(.\{-})/ end=/)/ contained keepend
+
+" At the time of this writing, the latest tmux release will parse a line
+" reading "abc=xyz set-option ..." as an assignment followed by a command
+" hence the presence of "\s" in the "end" argument.
+syn region tmuxAssignment matchgroup=tmuxVariable start=/^\s*[A-Za-z_]\w*=\@=/ skip=/\\$\|\\\s/ end=/\s\|$/ contains=tmuxString,tmuxUninterpolatedString,tmuxVariableExpansion,tmuxControl,tmuxEscape
+
+hi def link tmuxFormatString Identifier
+hi def link tmuxAction Boolean
+hi def link tmuxBoolean Boolean
+hi def link tmuxCommands Keyword
+hi def link tmuxControl PreCondit
+hi def link tmuxComment Comment
+hi def link tmuxEscape Special
+hi def link tmuxEscapeUnquoted Special
+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 tmuxUninterpolatedString
+\ String
+hi def link tmuxVariable Identifier
+hi def link tmuxVariableExpansion Identifier
+
+" Make the foreground of colourXXX keywords match the color they represent
+" when g:tmux_syntax_colors is unset or set to a non-zero value.
+" Darker colors have their background set to white.
+if get(g:, "tmux_syntax_colors", 1)
+ 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 . " /\\<colou\\?r" . s:i . "\\>/ display"
+\ " | highlight tmuxColour" . s:i . " ctermfg=" . s:i . " ctermbg=" . s:bg
+ endfor
+endif
+
+syn keyword tmuxOptions
+\ activity-action after-bind-key after-capture-pane after-copy-mode
+\ after-display-message after-display-panes after-kill-pane
+\ after-list-buffers after-list-clients after-list-keys after-list-panes
+\ after-list-sessions after-list-windows after-load-buffer after-lock-server
+\ after-new-session after-new-window after-paste-buffer after-pipe-pane
+\ after-queue after-refresh-client after-rename-session after-rename-window
+\ after-resize-pane after-resize-window after-save-buffer
+\ after-select-layout after-select-pane after-select-window after-send-keys
+\ after-set-buffer after-set-environment after-set-hook after-set-option
+\ after-show-environment after-show-messages after-show-options
+\ after-split-window after-unbind-key aggressive-resize alert-activity
+\ alert-bell alert-silence allow-passthrough allow-rename alternate-screen
+\ assume-paste-time automatic-rename automatic-rename-format backspace
+\ base-index bell-action buffer-limit client-active client-attached
+\ client-detached client-focus-in client-focus-out client-resized
+\ client-session-changed clock-mode-colour clock-mode-style command-alias
+\ copy-command copy-mode-current-match-style copy-mode-mark-style
+\ copy-mode-match-style cursor-colour cursor-style default-command
+\ default-shell default-size default-terminal destroy-unattached
+\ detach-on-destroy display-panes-active-colour display-panes-colour
+\ display-panes-time display-time editor escape-time exit-empty
+\ exit-unattached extended-keys fill-character focus-events history-file
+\ history-limit key-table lock-after-time lock-command main-pane-height
+\ main-pane-width message-command-style message-limit message-style
+\ mode-keys mode-style monitor-activity monitor-bell monitor-silence mouse
+\ other-pane-height other-pane-width pane-active-border-style
+\ pane-base-index pane-border-format pane-border-indicators
+\ pane-border-lines pane-border-status pane-border-style pane-colours
+\ pane-died pane-exited pane-focus-in pane-focus-out pane-mode-changed
+\ pane-set-clipboard pane-title-changed popup-border-lines
+\ popup-border-style popup-style prefix prefix2 prompt-history-limit
+\ remain-on-exit remain-on-exit-format renumber-windows repeat-time
+\ scroll-on-clear session-closed session-created session-renamed
+\ session-window-changed set-clipboard set-titles set-titles-string
+\ silence-action status status-bg status-fg status-format status-interval
+\ status-justify status-keys status-left status-left-length
+\ status-left-style status-position status-right status-right-length
+\ status-right-style status-style synchronize-panes terminal-features
+\ terminal-overrides update-environment user-keys visual-activity
+\ visual-bell visual-silence window-active-style window-layout-changed
+\ window-linked window-pane-changed window-renamed window-resized
+\ window-size window-status-activity-style window-status-bell-style
+\ window-status-current-format window-status-current-style
+\ window-status-format window-status-last-style window-status-separator
+\ window-status-style window-style window-unlinked 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-session choose-tree
+\ choose-window clear-history clear-prompt-history clearhist clearphist
+\ clock-mode command-prompt confirm confirm-before copy-mode customize-mode
+\ delete-buffer deleteb detach detach-client display display-menu
+\ display-message display-panes display-popup displayp find-window findw has
+\ has-session if if-shell info join-pane joinp kill-pane kill-server
+\ kill-session kill-window killp killw last last-pane last-window lastp
+\ 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 lockc locks ls lsb lsc lscm lsk lsp lsw menu
+\ move-pane move-window movep movew new new-session new-window neww next
+\ next-layout next-window nextl paste-buffer pasteb pipe-pane pipep popup
+\ prev previous-layout previous-window prevl refresh refresh-client rename
+\ rename-session rename-window renamew resize-pane resize-window resizep
+\ resizew 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
+\ server-info 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-prompt-history
+\ show-window-options showb showenv showmsgs showphist showw source
+\ source-file split-pane split-window splitp 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/toml.vim b/runtime/syntax/toml.vim
new file mode 100644
index 0000000..bcb1b0b
--- /dev/null
+++ b/runtime/syntax/toml.vim
@@ -0,0 +1,81 @@
+" Vim syntax file
+" Language: TOML
+" Homepage: https://github.com/cespare/vim-toml
+" Maintainer: Aman Verma
+" Previous Maintainer: Caleb Spare <cespare@gmail.com>
+" Last Change: Oct 8, 2021
+
+if exists('b:current_syntax')
+ finish
+endif
+
+syn match tomlEscape /\\[btnfr"/\\]/ display contained
+syn match tomlEscape /\\u\x\{4}/ contained
+syn match tomlEscape /\\U\x\{8}/ contained
+syn match tomlLineEscape /\\$/ contained
+
+" Basic strings
+syn region tomlString oneline start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=tomlEscape
+" Multi-line basic strings
+syn region tomlString start=/"""/ end=/"""/ contains=tomlEscape,tomlLineEscape
+" Literal strings
+syn region tomlString oneline start=/'/ end=/'/
+" Multi-line literal strings
+syn region tomlString start=/'''/ end=/'''/
+
+syn match tomlInteger /[+-]\=\<[1-9]\(_\=\d\)*\>/ display
+syn match tomlInteger /[+-]\=\<0\>/ display
+syn match tomlInteger /[+-]\=\<0x[[:xdigit:]]\(_\=[[:xdigit:]]\)*\>/ display
+syn match tomlInteger /[+-]\=\<0o[0-7]\(_\=[0-7]\)*\>/ display
+syn match tomlInteger /[+-]\=\<0b[01]\(_\=[01]\)*\>/ display
+syn match tomlInteger /[+-]\=\<\(inf\|nan\)\>/ display
+
+syn match tomlFloat /[+-]\=\<\d\(_\=\d\)*\.\d\+\>/ display
+syn match tomlFloat /[+-]\=\<\d\(_\=\d\)*\(\.\d\(_\=\d\)*\)\=[eE][+-]\=\d\(_\=\d\)*\>/ display
+
+syn match tomlBoolean /\<\%(true\|false\)\>/ display
+
+" https://tools.ietf.org/html/rfc3339
+syn match tomlDate /\d\{4\}-\d\{2\}-\d\{2\}/ display
+syn match tomlDate /\d\{2\}:\d\{2\}:\d\{2\}\%(\.\d\+\)\?/ display
+syn match tomlDate /\d\{4\}-\d\{2\}-\d\{2\}[T ]\d\{2\}:\d\{2\}:\d\{2\}\%(\.\d\+\)\?\%(Z\|[+-]\d\{2\}:\d\{2\}\)\?/ display
+
+syn match tomlDotInKey /\v[^.]+\zs\./ contained display
+syn match tomlKey /\v(^|[{,])\s*\zs[[:alnum:]._-]+\ze\s*\=/ contains=tomlDotInKey display
+syn region tomlKeyDq oneline start=/\v(^|[{,])\s*\zs"/ end=/"\ze\s*=/ contains=tomlEscape
+syn region tomlKeySq oneline start=/\v(^|[{,])\s*\zs'/ end=/'\ze\s*=/
+
+syn region tomlTable oneline start=/^\s*\[[^\[]/ end=/\]/ contains=tomlKey,tomlKeyDq,tomlKeySq,tomlDotInKey
+
+syn region tomlTableArray oneline start=/^\s*\[\[/ end=/\]\]/ contains=tomlKey,tomlKeyDq,tomlKeySq,tomlDotInKey
+
+syn region tomlKeyValueArray start=/=\s*\[\zs/ end=/\]/ contains=@tomlValue
+
+syn region tomlArray start=/\[/ end=/\]/ contains=@tomlValue contained
+
+syn cluster tomlValue contains=tomlArray,tomlString,tomlInteger,tomlFloat,tomlBoolean,tomlDate,tomlComment
+
+syn keyword tomlTodo TODO FIXME XXX BUG contained
+
+syn match tomlComment /#.*/ contains=@Spell,tomlTodo
+
+hi def link tomlComment Comment
+hi def link tomlTodo Todo
+hi def link tomlTableArray Title
+hi def link tomlTable Title
+hi def link tomlDotInKey Normal
+hi def link tomlKeySq Identifier
+hi def link tomlKeyDq Identifier
+hi def link tomlKey Identifier
+hi def link tomlDate Constant
+hi def link tomlBoolean Boolean
+hi def link tomlFloat Float
+hi def link tomlInteger Number
+hi def link tomlString String
+hi def link tomlLineEscape SpecialChar
+hi def link tomlEscape SpecialChar
+
+syn sync minlines=500
+let b:current_syntax = 'toml'
+
+" vim: et sw=2 sts=2
diff --git a/runtime/syntax/tpp.vim b/runtime/syntax/tpp.vim
new file mode 100644
index 0000000..e2b307b
--- /dev/null
+++ b/runtime/syntax/tpp.vim
@@ -0,0 +1,83 @@
+" Vim syntax file
+" Language: tpp - Text Presentation Program
+" Maintainer: Debian Vim Maintainers
+" Former Maintainer: Gerfried Fuchs <alfie@ist.org>
+" Last Change: 2023 Jan 16
+" URL: https://salsa.debian.org/vim-team/vim-debian/blob/main/syntax/tpp.vim
+" Filenames: *.tpp
+" License: BSD
+"
+" XXX This file is in need of a new maintainer, Debian VIM Maintainers maintain
+" it only because patches have been submitted for it by Debian users and the
+" former maintainer was MIA (Missing In Action), taking over its
+" maintenance was thus the only way to include those patches.
+" If you care about this file, and have time to maintain it please do so!
+"
+" Comments are very welcome - but please make sure that you are commenting on
+" the latest version of this file.
+" SPAM is _NOT_ welcome - be ready to be reported!
+
+" quit when a syntax file was already loaded
+if exists('b:current_syntax')
+ finish
+endif
+
+if !exists('main_syntax')
+ let main_syntax = 'tpp'
+endif
+
+
+"" list of the legal switches/options
+syn match tppAbstractOptionKey contained "^--\%(author\|title\|date\|footer\) *" nextgroup=tppString
+syn match tppPageLocalOptionKey contained "^--\%(heading\|center\|right\|huge\|sethugefont\|exec\) *" nextgroup=tppString
+syn match tppPageLocalSwitchKey contained "^--\%(horline\|-\|\%(begin\|end\)\%(\%(shell\)\?output\|slide\%(left\|right\|top\|bottom\)\)\|\%(bold\|rev\|ul\)\%(on\|off\)\|withborder\)"
+syn match tppNewPageOptionKey contained "^--newpage *" nextgroup=tppString
+syn match tppColorOptionKey contained "^--\%(\%(bg\|fg\)\?color\) *"
+syn match tppTimeOptionKey contained "^--sleep *"
+
+syn match tppString contained ".*"
+syn match tppColor contained "\%(white\|yellow\|red\|green\|blue\|cyan\|magenta\|black\|default\)"
+syn match tppTime contained "\d\+"
+
+syn region tppPageLocalSwitch start="^--" end="$" contains=tppPageLocalSwitchKey oneline
+syn region tppColorOption start="^--\%(\%(bg\|fg\)\?color\)" end="$" contains=tppColorOptionKey,tppColor oneline
+syn region tppTimeOption start="^--sleep" end="$" contains=tppTimeOptionKey,tppTime oneline
+syn region tppNewPageOption start="^--newpage" end="$" contains=tppNewPageOptionKey oneline
+syn region tppPageLocalOption start="^--\%(heading\|center\|right\|huge\|sethugefont\|exec\)" end="$" contains=tppPageLocalOptionKey oneline
+syn region tppAbstractOption start="^--\%(author\|title\|date\|footer\)" end="$" contains=tppAbstractOptionKey oneline
+
+if main_syntax !=# 'sh'
+ " shell command
+ syn include @tppShExec syntax/sh.vim
+ unlet b:current_syntax
+
+ syn region shExec matchgroup=tppPageLocalOptionKey start='^--exec *' keepend end='$' contains=@tppShExec
+
+endif
+
+syn match tppComment "^--##.*$"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = 'tpp'
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/trasys.vim b/runtime/syntax/trasys.vim
new file mode 100644
index 0000000..d52b5ee
--- /dev/null
+++ b/runtime/syntax/trasys.vim
@@ -0,0 +1,160 @@
+" Vim syntax file
+" Language: TRASYS input file
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.inp
+" URL: http://www.naglenet.org/vim/syntax/trasys.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+" Force free-form fortran format
+let fortran_free_source=1
+
+" Load FORTRAN syntax file
+runtime! syntax/fortran.vim
+unlet b:current_syntax
+
+
+" Ignore case
+syn case ignore
+
+
+
+" Define keywords for TRASYS
+syn keyword trasysOptions model rsrec info maxfl nogo dmpdoc
+syn keyword trasysOptions rsi rti rso rto bcdou cmerg emerg
+syn keyword trasysOptions user1 nnmin erplot
+
+syn keyword trasysSurface icsn tx ty tz rotx roty rotz inc bcsn
+syn keyword trasysSurface nnx nny nnz nnax nnr nnth unnx
+syn keyword trasysSurface unny unnz unnax unnr unnth type idupsf
+syn keyword trasysSurface imagsf act active com shade bshade axmin
+syn keyword trasysSurface axmax zmin zmax rmin rmax thmin thmin
+syn keyword trasysSurface thmax alpha emiss trani trans spri sprs
+syn keyword trasysSurface refno posit com dupbcs dimensions
+syn keyword trasysSurface dimension position prop surfn
+
+syn keyword trasysSurfaceType rect trap disk cyl cone sphere parab
+syn keyword trasysSurfaceType box5 box6 shpero tor ogiv elem tape poly
+
+syn keyword trasysSurfaceArgs ff di top bottom in out both no only
+
+syn keyword trasysArgs fig smn nodea zero only ir sol
+syn keyword trasysArgs both wband stepn initl
+
+syn keyword trasysOperations orbgen build
+
+"syn keyword trasysSubRoutine call
+syn keyword trasysSubRoutine chgblk ndata ndatas odata odatas
+syn keyword trasysSubRoutine pldta ffdata cmdata adsurf rbdata
+syn keyword trasysSubRoutine rtdata pffshd orbit1 orbit2 orient
+syn keyword trasysSubRoutine didt1 didt1s didt2 didt2s spin
+syn keyword trasysSubRoutine spinav dicomp distab drdata gbdata
+syn keyword trasysSubRoutine gbaprx rkdata rcdata aqdata stfaq
+syn keyword trasysSubRoutine qodata qoinit modar modpr modtr
+syn keyword trasysSubRoutine modprs modshd moddat rstoff rston
+syn keyword trasysSubRoutine rsmerg ffread diread ffusr1 diusr1
+syn keyword trasysSubRoutine surfp didt3 didt3s romain stfrc
+syn keyword trasysSubRoutine rornt rocstr romove flxdata title
+
+syn keyword trassyPrcsrSegm nplot oplot plot cmcal ffcal rbcal
+syn keyword trassyPrcsrSegm rtcal dical drcal sfcal gbcal rccal
+syn keyword trassyPrcsrSegm rkcal aqcal qocal
+
+
+
+" Define matches for TRASYS
+syn match trasysOptions "list source"
+syn match trasysOptions "save source"
+syn match trasysOptions "no print"
+
+"syn match trasysSurface "^K *.* [^$]"
+"syn match trasysSurface "^D *[0-9]*\.[0-9]\+"
+"syn match trasysSurface "^I *.*[0-9]\+\.\="
+"syn match trasysSurface "^N *[0-9]\+"
+"syn match trasysSurface "^M *[a-z[A-Z0-9]\+"
+"syn match trasysSurface "^B[C][S] *[a-zA-Z0-9]*"
+"syn match trasysSurface "^S *SURFN.*[0-9]"
+syn match trasysSurface "P[0-9]* *="he=e-1
+
+syn match trasysIdentifier "^L "he=e-1
+syn match trasysIdentifier "^K "he=e-1
+syn match trasysIdentifier "^D "he=e-1
+syn match trasysIdentifier "^I "he=e-1
+syn match trasysIdentifier "^N "he=e-1
+syn match trasysIdentifier "^M "he=e-1
+syn match trasysIdentifier "^B[C][S]"
+syn match trasysIdentifier "^S "he=e-1
+
+syn match trasysComment "^C.*$"
+syn match trasysComment "^R.*$"
+syn match trasysComment "\$.*$"
+
+syn match trasysHeader "^header[^,]*"
+
+syn match trasysMacro "^FAC"
+
+syn match trasysInteger "-\=\<[0-9]*\>"
+syn match trasysFloat "-\=\<[0-9]*\.[0-9]*"
+syn match trasysScientific "-\=\<[0-9]*\.[0-9]*E[-+]\=[0-9]\+\>"
+
+syn match trasysBlank "' \+'"hs=s+1,he=e-1
+
+syn match trasysEndData "^END OF DATA"
+
+if exists("thermal_todo")
+ execute 'syn match trasysTodo ' . '"^'.thermal_todo.'.*$"'
+else
+ syn match trasysTodo "^?.*$"
+endif
+
+
+
+" Define regions for TRASYS
+syn region trasysComment matchgroup=trasysHeader start="^HEADER DOCUMENTATION DATA" end="^HEADER[^,]*"
+
+
+
+" Define synchronizing patterns for TRASYS
+syn sync maxlines=500
+syn sync match trasysSync grouphere trasysComment "^HEADER DOCUMENTATION DATA"
+
+
+
+" Define the default highlighting
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/treetop.vim b/runtime/syntax/treetop.vim
new file mode 100644
index 0000000..60bbf26
--- /dev/null
+++ b/runtime/syntax/treetop.vim
@@ -0,0 +1,110 @@
+" Vim syntax file
+" Language: Treetop
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2011-03-14
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword treetopTodo
+ \ contained
+ \ TODO
+ \ FIXME
+ \ XXX
+ \ NOTE
+
+syn match treetopComment
+ \ '#.*'
+ \ display
+ \ contains=treetopTodo
+
+syn include @treetopRuby syntax/ruby.vim
+unlet b:current_syntax
+
+syn keyword treetopKeyword
+ \ require
+ \ end
+syn region treetopKeyword
+ \ matchgroup=treetopKeyword
+ \ start='\<\%(grammar\|include\|module\)\>\ze\s'
+ \ end='$'
+ \ transparent
+ \ oneline
+ \ keepend
+ \ contains=@treetopRuby
+syn keyword treetopKeyword
+ \ rule
+ \ nextgroup=treetopRuleName
+ \ skipwhite skipnl
+
+syn match treetopGrammarName
+ \ '\u\w*'
+ \ contained
+
+syn match treetopRubyModuleName
+ \ '\u\w*'
+ \ contained
+
+syn match treetopRuleName
+ \ '\h\w*'
+ \ contained
+
+syn region treetopString
+ \ matchgroup=treetopStringDelimiter
+ \ start=+"+
+ \ end=+"+
+syn region treetopString
+ \ matchgroup=treetopStringDelimiter
+ \ start=+'+
+ \ end=+'+
+
+syn region treetopCharacterClass
+ \ matchgroup=treetopCharacterClassDelimiter
+ \ start=+\[+
+ \ skip=+\\\]+
+ \ end=+\]+
+
+syn region treetopRubyBlock
+ \ matchgroup=treetopRubyBlockDelimiter
+ \ start=+{+
+ \ end=+}+
+ \ contains=@treetopRuby
+
+syn region treetopSemanticPredicate
+ \ matchgroup=treetopSemanticPredicateDelimiter
+ \ start=+[!&]{+
+ \ end=+}+
+ \ contains=@treetopRuby
+
+syn region treetopSubclassDeclaration
+ \ matchgroup=treetopSubclassDeclarationDelimiter
+ \ start=+<+
+ \ end=+>+
+ \ contains=@treetopRuby
+
+syn match treetopEllipsis
+ \ +''+
+
+hi def link treetopTodo Todo
+hi def link treetopComment Comment
+hi def link treetopKeyword Keyword
+hi def link treetopGrammarName Constant
+hi def link treetopRubyModuleName Constant
+hi def link treetopRuleName Identifier
+hi def link treetopString String
+hi def link treetopStringDelimiter treetopString
+hi def link treetopCharacterClass treetopString
+hi def link treetopCharacterClassDelimiter treetopCharacterClass
+hi def link treetopRubyBlockDelimiter PreProc
+hi def link treetopSemanticPredicateDelimiter PreProc
+hi def link treetopSubclassDeclarationDelimiter PreProc
+hi def link treetopEllipsis Special
+
+let b:current_syntax = 'treetop'
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/trustees.vim b/runtime/syntax/trustees.vim
new file mode 100644
index 0000000..3a7d26e
--- /dev/null
+++ b/runtime/syntax/trustees.vim
@@ -0,0 +1,44 @@
+" Vim syntax file
+" Language: trustees
+" Maintainer: Nima Talebi <nima@it.net.au>
+" Last Change: 2022 Jun 14
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case match
+syntax sync minlines=0 maxlines=0
+
+" Errors & Comments
+syntax match tfsError /.*/
+highlight link tfsError Error
+syntax keyword tfsSpecialComment TODO XXX FIXME contained
+highlight link tfsSpecialComment Todo
+syntax match tfsComment ~\s*#.*~ contains=tfsSpecialComment
+highlight link tfsComment Comment
+
+" Operators & Delimiters
+highlight link tfsSpecialChar Operator
+syntax match tfsSpecialChar ~[*!+]~ contained
+highlight link tfsDelimiter Delimiter
+syntax match tfsDelimiter ~:~ contained
+
+" Trustees Rules - Part 1 of 3 - The Device
+syntax region tfsRuleDevice matchgroup=tfsDeviceContainer start=~\[/~ end=~\]~ nextgroup=tfsRulePath oneline
+highlight link tfsRuleDevice Label
+highlight link tfsDeviceContainer PreProc
+
+" Trustees Rules - Part 2 of 3 - The Path
+syntax match tfsRulePath ~/[-_a-zA-Z0-9/]*~ nextgroup=tfsRuleACL contained contains=tfsDelimiter
+highlight link tfsRulePath String
+
+" Trustees Rules - Part 3 of 3 - The ACLs
+syntax match tfsRuleACL ~\(:\(\*\|[+]\{0,1\}[a-zA-Z0-9/]\+\):[RWEBXODCU!]\+\)\+$~ contained contains=tfsDelimiter,tfsRuleWho,tfsRuleWhat
+syntax match tfsRuleWho ~\(\*\|[+]\{0,1\}[a-zA-Z0-9/]\+\)~ contained contains=tfsSpecialChar
+highlight link tfsRuleWho Identifier
+syntax match tfsRuleWhat ~[RWEBXODCU!]\+~ contained contains=tfsSpecialChar
+highlight link tfsRuleWhat Structure
+
+let b:current_syntax = 'trustees'
diff --git a/runtime/syntax/tsalt.vim b/runtime/syntax/tsalt.vim
new file mode 100644
index 0000000..8dd2a24
--- /dev/null
+++ b/runtime/syntax/tsalt.vim
@@ -0,0 +1,206 @@
+" Vim syntax file
+" Language: Telix (Modem Comm Program) SALT Script
+" Maintainer: Sean M. McKee <mckee@misslink.net>
+" Last Change: 2012 Feb 03 by Thilo Six
+" Version Info: @(#)tsalt.vim 1.5 97/12/16 08:11:15
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" turn case matching off
+syn case ignore
+
+"FUNCTIONS
+" Character Handling Functions
+syn keyword tsaltFunction IsAscii IsAlNum IsAlpha IsCntrl IsDigit
+syn keyword tsaltFunction IsLower IsUpper ToLower ToUpper
+
+" Connect Device Operations
+syn keyword tsaltFunction Carrier cInp_Cnt cGetC cGetCT cPutC cPutN
+syn keyword tsaltFunction cPutS cPutS_TR FlushBuf Get_Baud
+syn keyword tsaltFunction Get_DataB Get_Port Get_StopB Hangup
+syn keyword tsaltFunction KillConnectDevice MakeConnectDevice
+syn keyword tsaltFunction Send_Brk Set_ConnectDevice Set_Port
+
+" File Input/Output Operations
+syn keyword tsaltFunction fClearErr fClose fDelete fError fEOF fFlush
+syn keyword tsaltFunction fGetC fGetS FileAttr FileFind FileSize
+syn keyword tsaltFunction FileTime fnStrip fOpen fPutC fPutS fRead
+syn keyword tsaltFunction fRename fSeek fTell fWrite
+
+" File Transfers and Logs
+syn keyword tsaltFunction Capture Capture_Stat Printer Receive Send
+syn keyword tsaltFunction Set_DefProt UsageLog Usage_Stat UStamp
+
+" Input String Matching
+syn keyword tsaltFunction Track Track_AddChr Track_Free Track_Hit
+syn keyword tsaltFunction WaitFor
+
+" Keyboard Operations
+syn keyword tsaltFunction InKey InKeyW KeyGet KeyLoad KeySave KeySet
+
+" Miscellaneous Functions
+syn keyword tsaltFunction ChatMode Dos Dial DosFunction ExitTelix
+syn keyword tsaltFunction GetEnv GetFon HelpScreen LoadFon NewDir
+syn keyword tsaltFunction Randon Redial RedirectDOS Run
+syn keyword tsaltFunction Set_Terminal Show_Directory TelixVersion
+syn keyword tsaltFunction Terminal TransTab Update_Term
+
+" Script Management
+syn keyword tsaltFunction ArgCount Call CallD CompileScript GetRunPath
+syn keyword tsaltFunction Is_Loaded Load_Scr ScriptVersion
+syn keyword tsaltFunction TelixForWindows Unload_Scr
+
+" Sound Functions
+syn keyword tsaltFunction Alarm PlayWave Tone
+
+" String Handling
+syn keyword tsaltFunction CopyChrs CopyStr DelChrs GetS GetSXY
+syn keyword tsaltFunction InputBox InsChrs ItoS SetChr StoI StrCat
+syn keyword tsaltFunction StrChr StrCompI StrLen StrLower StrMaxLen
+syn keyword tsaltFunction StrPos StrPosI StrUpper SubChr SubChrs
+syn keyword tsaltFunction SubStr
+
+" Time, Date, and Timer Operations
+syn keyword tsaltFunction CurTime Date Delay Delay_Scr Get_OnlineTime
+syn keyword tsaltFunction tDay tHour tMin tMonth tSec tYear Time
+syn keyword tsaltFunction Time_Up Timer_Free Time_Restart
+syn keyword tsaltFunction Time_Start Time_Total
+
+" Video Operations
+syn keyword tsaltFunction Box CNewLine Cursor_OnOff Clear_Scr
+syn keyword tsaltFunction GetTermHeight GetTermWidth GetX GetY
+syn keyword tsaltFunction GotoXY MsgBox NewLine PrintC PrintC_Trm
+syn keyword tsaltFunction PrintN PrintN_Trm PrintS PrintS_Trm
+syn keyword tsaltFunction PrintSC PRintSC_Trm
+syn keyword tsaltFunction PStrA PStrAXY Scroll Status_Wind vGetChr
+syn keyword tsaltFunction vGetChrs vGetChrsA vPutChr vPutChrs
+syn keyword tsaltFunction vPutChrsA vRstrArea vSaveArea
+
+" Dynamic Data Exchange (DDE) Operations
+syn keyword tsaltFunction DDEExecute DDEInitate DDEPoke DDERequest
+syn keyword tsaltFunction DDETerminate DDETerminateAll
+"END FUNCTIONS
+
+"PREDEFINED VARAIABLES
+syn keyword tsaltSysVar _add_lf _alarm_on _answerback_str _asc_rcrtrans
+syn keyword tsaltSysVar _asc_remabort _asc_rlftrans _asc_scpacing
+syn keyword tsaltSysVar _asc_scrtrans _asc_secho _asc_slpacing
+syn keyword tsaltSysVar _asc_spacechr _asc_striph _back_color
+syn keyword tsaltSysVar _capture_fname _connect_str _dest_bs
+syn keyword tsaltSysVar _dial_pause _dial_time _dial_post
+syn keyword tsaltSysVar _dial_pref1 _dial_pref2 _dial_pref3
+syn keyword tsaltSysVar _dial_pref4 _dir_prog _down_dir
+syn keyword tsaltSysVar _entry_bbstype _entry_comment _entry_enum
+syn keyword tsaltSysVar _entry_name _entry_num _entry_logonname
+syn keyword tsaltSysVar _entry_pass _fore_color _image_file
+syn keyword tsaltSysVar _local_echo _mdm_hang_str _mdm_init_str
+syn keyword tsaltSysVar _no_connect1 _no_connect2 _no_connect3
+syn keyword tsaltSysVar _no_connect4 _no_connect5 _redial_stop
+syn keyword tsaltSysVar _scr_chk_key _script_dir _sound_on
+syn keyword tsaltSysVar _strip_high _swap_bs _telix_dir _up_dir
+syn keyword tsaltSysVar _usage_fname _zmodauto _zmod_rcrash
+syn keyword tsaltSysVar _zmod_scrash
+"END PREDEFINED VARAIABLES
+
+"TYPE
+syn keyword tsaltType str int
+"END TYPE
+
+"KEYWORDS
+syn keyword tsaltStatement goto break return continue
+syn keyword tsaltConditional if then else
+syn keyword tsaltRepeat while for do
+"END KEYWORDS
+
+syn keyword tsaltTodo contained TODO
+
+" the rest is pretty close to C -----------------------------------------
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match tsaltSpecial contained "\^\d\d\d\|\^."
+syn region tsaltString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=tsaltSpecial
+syn match tsaltCharacter "'[^\\]'"
+syn match tsaltSpecialCharacter "'\\.'"
+
+"catch errors caused by wrong parenthesis
+syn region tsaltParen transparent start='(' end=')' contains=ALLBUT,tsaltParenError,tsaltIncluded,tsaltSpecial,tsaltTodo
+syn match tsaltParenError ")"
+syn match tsaltInParen contained "[{}]"
+
+hi link tsaltParenError tsaltError
+hi link tsaltInParen tsaltError
+
+"integer number, or floating point number without a dot and with "f".
+syn match tsaltNumber "\<\d\+\(u\=l\=\|lu\|f\)\>"
+"floating point number, with dot, optional exponent
+syn match tsaltFloat "\<\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, starting with a dot, optional exponent
+syn match tsaltFloat "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match tsaltFloat "\<\d\+e[-+]\=\d\+[fl]\=\>"
+"hex number
+syn match tsaltNumber "0x[0-9a-f]\+\(u\=l\=\|lu\)\>"
+"syn match cIdentifier "\<[a-z_][a-z0-9_]*\>"
+
+syn region tsaltComment start="/\*" end="\*/" contains=cTodo
+syn match tsaltComment "//.*" contains=cTodo
+syn match tsaltCommentError "\*/"
+
+syn region tsaltPreCondit start="^[ \t]*#[ \t]*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=tsaltComment,tsaltString,tsaltCharacter,tsaltNumber,tsaltCommentError
+syn region tsaltIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match tsaltIncluded contained "<[^>]*>"
+syn match tsaltInclude "^[ \t]*#[ \t]*include\>[ \t]*["<]" contains=tsaltIncluded
+"syn match TelixSalyLineSkip "\\$"
+syn region tsaltDefine start="^[ \t]*#[ \t]*\(define\>\|undef\>\)" skip="\\$" end="$" contains=ALLBUT,tsaltPreCondit,tsaltIncluded,tsaltInclude,tsaltDefine,tsaltInParen
+syn region tsaltPreProc start="^[ \t]*#[ \t]*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" contains=ALLBUT,tsaltPreCondit,tsaltIncluded,tsaltInclude,tsaltDefine,tsaltInParen
+
+" Highlight User Labels
+syn region tsaltMulti transparent start='?' end=':' contains=ALLBUT,tsaltIncluded,tsaltSpecial,tsaltTodo
+
+syn sync ccomment tsaltComment
+
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8
diff --git a/runtime/syntax/tsscl.vim b/runtime/syntax/tsscl.vim
new file mode 100644
index 0000000..fd2a5e2
--- /dev/null
+++ b/runtime/syntax/tsscl.vim
@@ -0,0 +1,204 @@
+" Vim syntax file
+" Language: TSS (Thermal Synthesizer System) Command Line
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.tsscl
+" URL: http://www.naglenet.org/vim/syntax/tsscl.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+" Ignore case
+syn case ignore
+
+
+
+"
+"
+" Begin syntax definitions for tss geomtery file.
+"
+
+" Load TSS geometry syntax file
+"source $VIM/myvim/tssgm.vim
+"source $VIMRUNTIME/syntax/c.vim
+
+" Define keywords for TSS
+syn keyword tssclCommand begin radk list heatrates attr draw
+
+syn keyword tssclKeyword cells rays error nodes levels objects cpu
+syn keyword tssclKeyword units length positions energy time unit solar
+syn keyword tssclKeyword solar_constant albedo planet_power
+
+syn keyword tssclEnd exit
+
+syn keyword tssclUnits cm feet meters inches
+syn keyword tssclUnits Celsius Kelvin Fahrenheit Rankine
+
+
+
+" Define matches for TSS
+syn match tssclString /"[^"]\+"/ contains=ALLBUT,tssInteger,tssclKeyword,tssclCommand,tssclEnd,tssclUnits
+
+syn match tssclComment "#.*$"
+
+" rational and logical operators
+" < Less than
+" > Greater than
+" <= Less than or equal
+" >= Greater than or equal
+" == or = Equal to
+" != Not equal to
+" && or & Logical AND
+" || or | Logical OR
+" ! Logical NOT
+"
+" algebraic operators:
+" ^ or ** Exponentation
+" * Multiplication
+" / Division
+" % Remainder
+" + Addition
+" - Subtraction
+"
+syn match tssclOper "||\||\|&&\|&\|!=\|!\|>=\|<=\|>\|<\|+\|-\|^\|\*\*\|\*\|/\|%\|==\|=\|\." skipwhite
+
+" CLI Directive Commands, with arguments
+"
+" BASIC COMMAND LIST
+" *ADD input_source
+" *ARITHMETIC { [ON] | OFF }
+" *CLOSE unit_number
+" *CPU
+" *DEFINE
+" *ECHO[/qualifiers] { [ON] | OFF }
+" *ELSE [IF { 0 | 1 } ]
+" *END { IF | WHILE }
+" *EXIT
+" *IF { 0 | 1 }
+" *LIST/n list variable
+" *OPEN[/r | /r+ | /w | /w+ ] unit_number file_name
+" *PROMPT prompt_string sybol_name
+" *READ/unit=unit_number[/LOCAL | /GLOBAL ] sym1 [sym2, [sym3 ...]]
+" *REWIND
+" *STOP
+" *STRCMP string_1 string_2 difference
+" *SYSTEM command
+" *UNDEFINE[/LOCAL][/GLOBAL] symbol_name
+" *WHILE { 0 | 1 }
+" *WRITE[/unit=unit_number] output text
+"
+syn match tssclDirective "\*ADD"
+syn match tssclDirective "\*ARITHMETIC \+\(ON\|OFF\)"
+syn match tssclDirective "\*CLOSE"
+syn match tssclDirective "\*CPU"
+syn match tssclDirective "\*DEFINE"
+syn match tssclDirective "\*ECHO"
+syn match tssclConditional "\*ELSE"
+syn match tssclConditional "\*END \+\(IF\|WHILE\)"
+syn match tssclDirective "\*EXIT"
+syn match tssclConditional "\*IF"
+syn match tssclDirective "\*LIST"
+syn match tssclDirective "\*OPEN"
+syn match tssclDirective "\*PROMPT"
+syn match tssclDirective "\*READ"
+syn match tssclDirective "\*REWIND"
+syn match tssclDirective "\*STOP"
+syn match tssclDirective "\*STRCMP"
+syn match tssclDirective "\*SYSTEM"
+syn match tssclDirective "\*UNDEFINE"
+syn match tssclConditional "\*WHILE"
+syn match tssclDirective "\*WRITE"
+
+syn match tssclContChar "-$"
+
+" C library functoins
+" Bessel functions (jn, yn)
+" Error and complementary error fuctions (erf, erfc)
+" Exponential functions (exp)
+" Logrithm (log, log10)
+" Power (pow)
+" Square root (sqrt)
+" Floor (floor)
+" Ceiling (ceil)
+" Floating point remainder (fmod)
+" Floating point absolute value (fabs)
+" Gamma (gamma)
+" Euclidean distance function (hypot)
+" Hperbolic functions (sinh, cosh, tanh)
+" Trigometric functions in radians (sin, cos, tan, asin, acos, atan, atan2)
+" Trigometric functions in degrees (sind, cosd, tand, asind, acosd, atand,
+" atan2d)
+"
+" local varialbles: cl_arg1, cl_arg2, etc. (cl_arg is an array of arguments)
+" cl_args is the number of arguments
+"
+"
+" I/O: *PROMPT, *WRITE, *READ
+"
+" Conditional branching:
+" IF, ELSE IF, END
+" *IF value *IF I==10
+" *ELSE IF value *ELSE IF I<10
+" *ELSE *ELSE
+" *ENDIF *ENDIF
+"
+"
+" Iterative looping:
+" WHILE
+" *WHILE test
+" .....
+" *END WHILE
+"
+"
+" EXAMPLE:
+" *DEFINE I = 1
+" *WHILE (I <= 10)
+" *WRITE I = 'I'
+" *DEFINE I = (I + 1)
+" *END WHILE
+"
+
+syn match tssclQualifier "/[^/ ]\+"hs=s+1
+syn match tssclSymbol "'\S\+'"
+"syn match tssclSymbol2 " \S\+ " contained
+
+syn match tssclInteger "-\=\<[0-9]*\>"
+syn match tssclFloat "-\=\<[0-9]*\.[0-9]*"
+syn match tssclScientific "-\=\<[0-9]*\.[0-9]*E[-+]\=[0-9]\+\>"
+
+
+
+" Define the default highlighting
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/tssgm.vim b/runtime/syntax/tssgm.vim
new file mode 100644
index 0000000..8ca7962
--- /dev/null
+++ b/runtime/syntax/tssgm.vim
@@ -0,0 +1,98 @@
+" Vim syntax file
+" Language: TSS (Thermal Synthesizer System) Geometry
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.tssgm
+" URL: http://www.naglenet.org/vim/syntax/tssgm.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+" Ignore case
+syn case ignore
+
+
+
+"
+"
+" Begin syntax definitions for tss geomtery file.
+"
+
+" Define keywords for TSS
+syn keyword tssgmParam units mirror param active sides submodel include
+syn keyword tssgmParam iconductor nbeta ngamma optics material thickness color
+syn keyword tssgmParam initial_temp
+syn keyword tssgmParam initial_id node_ids node_add node_type
+syn keyword tssgmParam gamma_boundaries gamma_add beta_boundaries
+syn keyword tssgmParam p1 p2 p3 p4 p5 p6 rot1 rot2 rot3 tx ty tz
+
+syn keyword tssgmSurfType rectangle trapezoid disc ellipse triangle
+syn keyword tssgmSurfType polygon cylinder cone sphere ellipic-cone
+syn keyword tssgmSurfType ogive torus box paraboloid hyperboloid ellipsoid
+syn keyword tssgmSurfType quadrilateral trapeziod
+
+syn keyword tssgmArgs OUT IN DOWN BOTH DOUBLE NONE SINGLE RADK CC FECC
+syn keyword tssgmArgs white red blue green yellow orange violet pink
+syn keyword tssgmArgs turquoise grey black
+syn keyword tssgmArgs Arithmetic Boundary Heater
+
+syn keyword tssgmDelim assembly
+
+syn keyword tssgmEnd end
+
+syn keyword tssgmUnits cm feet meters inches
+syn keyword tssgmUnits Celsius Kelvin Fahrenheit Rankine
+
+
+
+" Define matches for TSS
+syn match tssgmDefault "^DEFAULT/LENGTH = \(ft\|in\|cm\|m\)"
+syn match tssgmDefault "^DEFAULT/TEMP = [CKFR]"
+
+syn match tssgmComment /comment \+= \+".*"/ contains=tssParam,tssgmCommentString
+syn match tssgmCommentString /".*"/ contained
+
+syn match tssgmSurfIdent " \S\+\.\d\+ \=$"
+
+syn match tssgmString /"[^" ]\+"/ms=s+1,me=e-1 contains=ALLBUT,tssInteger
+
+syn match tssgmArgs / = [xyz],"/ms=s+3,me=e-2
+
+syn match tssgmInteger "-\=\<[0-9]*\>"
+syn match tssgmFloat "-\=\<[0-9]*\.[0-9]*"
+syn match tssgmScientific "-\=\<[0-9]*\.[0-9]*E[-+]\=[0-9]\+\>"
+
+
+
+" Define the default highlighting
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/tssop.vim b/runtime/syntax/tssop.vim
new file mode 100644
index 0000000..6a775b2
--- /dev/null
+++ b/runtime/syntax/tssop.vim
@@ -0,0 +1,74 @@
+" Vim syntax file
+" Language: TSS (Thermal Synthesizer System) Optics
+" Maintainer: Adrian Nagle, anagle@ball.com
+" Last Change: 2003 May 11
+" Filenames: *.tssop
+" URL: http://www.naglenet.org/vim/syntax/tssop.vim
+" MAIN URL: http://www.naglenet.org/vim/
+
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+
+" Ignore case
+syn case ignore
+
+
+
+"
+"
+" Begin syntax definitions for tss optics file.
+"
+
+" Define keywords for TSS
+syn keyword tssopParam ir_eps ir_trans ir_spec ir_tspec ir_refract
+syn keyword tssopParam sol_eps sol_trans sol_spec sol_tspec sol_refract
+syn keyword tssopParam color
+
+"syn keyword tssopProp property
+
+syn keyword tssopArgs white red blue green yellow orange violet pink
+syn keyword tssopArgs turquoise grey black
+
+
+
+" Define matches for TSS
+syn match tssopComment /comment \+= \+".*"/ contains=tssopParam,tssopCommentString
+syn match tssopCommentString /".*"/ contained
+
+syn match tssopProp "property "
+syn match tssopProp "edit/optic "
+syn match tssopPropName "^property \S\+" contains=tssopProp
+syn match tssopPropName "^edit/optic \S\+$" contains=tssopProp
+
+syn match tssopInteger "-\=\<[0-9]*\>"
+syn match tssopFloat "-\=\<[0-9]*\.[0-9]*"
+syn match tssopScientific "-\=\<[0-9]*\.[0-9]*E[-+]\=[0-9]\+\>"
+
+
+
+" Define the default highlighting
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/tt2.vim b/runtime/syntax/tt2.vim
new file mode 100644
index 0000000..6826fb1
--- /dev/null
+++ b/runtime/syntax/tt2.vim
@@ -0,0 +1,209 @@
+" Vim syntax file
+" Language: TT2 (Perl Template Toolkit)
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Author: Moriki, Atsushi <4woods+vim@gmail.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2018 Mar 28
+"
+" Installation:
+" put tt2.vim and tt2html.vim in to your syntax directory.
+"
+" add below in your filetype.vim.
+" au BufNewFile,BufRead *.tt2 setf tt2
+" or
+" au BufNewFile,BufRead *.tt2
+" \ if ( getline(1) . getline(2) . getline(3) =~ '<\chtml' |
+" \ && getline(1) . getline(2) . getline(3) !~ '<[%?]' ) |
+" \ || getline(1) =~ '<!DOCTYPE HTML' |
+" \ setf tt2html |
+" \ else |
+" \ setf tt2 |
+" \ endif
+"
+" define START_TAG, END_TAG
+" "ASP"
+" :let b:tt2_syn_tags = '<% %>'
+" "PHP"
+" :let b:tt2_syn_tags = '<? ?>'
+" "TT2 and HTML"
+" :let b:tt2_syn_tags = '\[% %] <!-- -->'
+"
+" Changes:
+" 0.1.3
+" Changed fileformat from 'dos' to 'unix'
+" Deleted 'echo' that print obstructive message
+" 0.1.2
+" Added block comment syntax
+" e.g. [%# COMMENT
+" COMMENT TOO %]
+" [%# IT'S SAFE %] HERE IS OUTSIDE OF TT2 DIRECTIVE
+" [% # WRONG!! %] HERE STILL BE COMMENT
+" 0.1.1
+" Release
+" 0.1.0
+" Internal
+
+if !exists("b:tt2_syn_tags")
+ let b:tt2_syn_tags = '\[% %]'
+ "let b:tt2_syn_tags = '\[% %] \[\* \*]'
+endif
+
+if !exists("b:tt2_syn_inc_perl")
+ let b:tt2_syn_inc_perl = 1
+endif
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn case match
+
+syn cluster tt2_top_cluster contains=tt2_perlcode,tt2_tag_region
+
+" TT2 TAG Region
+if exists("b:tt2_syn_tags")
+
+ let s:str = b:tt2_syn_tags . ' '
+ let s:str = substitute(s:str,'^ \+','','g')
+ let s:str = substitute(s:str,' \+',' ','g')
+
+ while stridx(s:str,' ') > 0
+
+ let s:st = strpart(s:str,0,stridx(s:str,' '))
+ let s:str = substitute(s:str,'[^ ]* ','',"")
+
+ let s:ed = strpart(s:str,0,stridx(s:str,' '))
+ let s:str = substitute(s:str,'[^ ]* ','',"")
+
+ exec 'syn region tt2_tag_region '.
+ \ 'matchgroup=tt2_tag '.
+ \ 'start=+\(' . s:st .'\)[-]\=+ '.
+ \ 'end=+[-]\=\(' . s:ed . '\)+ '.
+ \ 'contains=@tt2_statement_cluster keepend extend'
+
+ exec 'syn region tt2_commentblock_region '.
+ \ 'matchgroup=tt2_tag '.
+ \ 'start=+\(' . s:st .'\)[-]\=\(#\)\@=+ '.
+ \ 'end=+[-]\=\(' . s:ed . '\)+ '.
+ \ 'keepend extend'
+
+ "Include Perl syntax when 'PERL' 'RAWPERL' block
+ if b:tt2_syn_inc_perl
+ syn include @Perl syntax/perl.vim
+ exec 'syn region tt2_perlcode '.
+ \ 'start=+\(\(RAW\)\=PERL\s*[-]\=' . s:ed . '\(\n\)\=\)\@<=+ ' .
+ \ 'end=+' . s:st . '[-]\=\s*END+me=s-1 contains=@Perl keepend'
+ endif
+
+ "echo 'TAGS ' . s:st . ' ' . s:ed
+ unlet s:st
+ unlet s:ed
+ endwhile
+
+else
+
+ syn region tt2_tag_region
+ \ matchgroup=tt2_tag
+ \ start=+\(\[%\)[-]\=+
+ \ end=+[-]\=%\]+
+ \ contains=@tt2_statement_cluster keepend extend
+
+ syn region tt2_commentblock_region
+ \ matchgroup=tt2_tag
+ \ start=+\(\[%\)[-]\=#+
+ \ end=+[-]\=%\]+
+ \ keepend extend
+
+ "Include Perl syntax when 'PERL' 'RAWPERL' block
+ if b:tt2_syn_inc_perl
+ syn include @Perl syntax/perl.vim
+ syn region tt2_perlcode
+ \ start=+\(\(RAW\)\=PERL\s*[-]\=%]\(\n\)\=\)\@<=+
+ \ end=+\[%[-]\=\s*END+me=s-1
+ \ contains=@Perl keepend
+ endif
+endif
+
+" Directive
+syn keyword tt2_directive contained
+ \ GET CALL SET DEFAULT DEBUG
+ \ LAST NEXT BREAK STOP BLOCK
+ \ IF IN UNLESS ELSIF FOR FOREACH WHILE SWITCH CASE
+ \ USE PLUGIN MACRO META
+ \ TRY FINAL RETURN LAST
+ \ CLEAR TO STEP AND OR NOT MOD DIV
+ \ ELSE PERL RAWPERL END
+syn match tt2_directive +|+ contained
+syn keyword tt2_directive contained nextgroup=tt2_string_q,tt2_string_qq,tt2_blockname skipwhite skipempty
+ \ INSERT INCLUDE PROCESS WRAPPER FILTER
+ \ THROW CATCH
+syn keyword tt2_directive contained nextgroup=tt2_def_tag skipwhite skipempty
+ \ TAGS
+
+syn match tt2_def_tag "\S\+\s\+\S\+\|\<\w\+\>" contained
+
+syn match tt2_variable +\I\w*+ contained
+syn match tt2_operator "[+*/%:?-]" contained
+syn match tt2_operator "\<\(mod\|div\|or\|and\|not\)\>" contained
+syn match tt2_operator "[!=<>]=\=\|&&\|||" contained
+syn match tt2_operator "\(\s\)\@<=_\(\s\)\@=" contained
+syn match tt2_operator "=>\|," contained
+syn match tt2_deref "\([[:alnum:]_)\]}]\s*\)\@<=\." contained
+syn match tt2_comment +#.*$+ contained
+syn match tt2_func +\<\I\w*\(\s*(\)\@=+ contained nextgroup=tt2_bracket_r skipempty skipwhite
+"
+syn region tt2_bracket_r start=+(+ end=+)+ contained contains=@tt2_statement_cluster keepend extend
+syn region tt2_bracket_b start=+\[+ end=+]+ contained contains=@tt2_statement_cluster keepend extend
+syn region tt2_bracket_b start=+{+ end=+}+ contained contains=@tt2_statement_cluster keepend extend
+
+syn region tt2_string_qq start=+"+ end=+"+ skip=+\\"+ contained contains=tt2_ivariable keepend extend
+syn region tt2_string_q start=+'+ end=+'+ skip=+\\'+ contained keepend extend
+
+syn match tt2_ivariable +\$\I\w*\>\(\.\I\w*\>\)*+ contained
+syn match tt2_ivariable +\${\I\w*\>\(\.\I\w*\>\)*}+ contained
+
+syn match tt2_number "\d\+" contained
+syn match tt2_number "\d\+\.\d\+" contained
+syn match tt2_number "0x\x\+" contained
+syn match tt2_number "0\o\+" contained
+
+syn match tt2_blockname "\f\+" contained nextgroup=tt2_blockname_joint skipwhite skipempty
+syn match tt2_blockname "$\w\+" contained contains=tt2_ivariable nextgroup=tt2_blockname_joint skipwhite skipempty
+syn region tt2_blockname start=+"+ end=+"+ skip=+\\"+ contained contains=tt2_ivariable nextgroup=tt2_blockname_joint keepend skipwhite skipempty
+syn region tt2_blockname start=+'+ end=+'+ skip=+\\'+ contained nextgroup=tt2_blockname_joint keepend skipwhite skipempty
+syn match tt2_blockname_joint "+" contained nextgroup=tt2_blockname skipwhite skipempty
+
+syn cluster tt2_statement_cluster contains=tt2_directive,tt2_variable,tt2_operator,tt2_string_q,tt2_string_qq,tt2_deref,tt2_comment,tt2_func,tt2_bracket_b,tt2_bracket_r,tt2_number
+
+" Synchronizing
+syn sync minlines=50
+
+hi def link tt2_tag Type
+hi def link tt2_tag_region Type
+hi def link tt2_commentblock_region Comment
+hi def link tt2_directive Statement
+hi def link tt2_variable Identifier
+hi def link tt2_ivariable Identifier
+hi def link tt2_operator Statement
+hi def link tt2_string_qq String
+hi def link tt2_string_q String
+hi def link tt2_blockname String
+hi def link tt2_comment Comment
+hi def link tt2_func Function
+hi def link tt2_number Number
+
+if exists("b:tt2_syn_tags")
+ unlet b:tt2_syn_tags
+endif
+
+let b:current_syntax = "tt2"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:ts=4:sw=4
diff --git a/runtime/syntax/tt2html.vim b/runtime/syntax/tt2html.vim
new file mode 100644
index 0000000..8c223be
--- /dev/null
+++ b/runtime/syntax/tt2html.vim
@@ -0,0 +1,22 @@
+" Vim syntax file
+" Language: TT2 embedded with HTML
+" Maintainer: vim-perl <vim-perl@googlegroups.com>
+" Author: Moriki, Atsushi <4woods+vim@gmail.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2018 Mar 28
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+runtime! syntax/tt2.vim
+unlet b:current_syntax
+
+syn cluster htmlPreProc add=@tt2_top_cluster
+
+let b:current_syntax = "tt2html"
diff --git a/runtime/syntax/tt2js.vim b/runtime/syntax/tt2js.vim
new file mode 100644
index 0000000..52e5a3c
--- /dev/null
+++ b/runtime/syntax/tt2js.vim
@@ -0,0 +1,22 @@
+" Vim syntax file
+" Language: TT2 embedded with Javascript
+" Maintainer: Andy Lester <andy@petdance.com>
+" Author: Yates, Peter <pd.yates@gmail.com>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2018 Mar 28
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/javascript.vim
+unlet b:current_syntax
+
+runtime! syntax/tt2.vim
+unlet b:current_syntax
+
+syn cluster javascriptPreProc add=@tt2_top_cluster
+
+let b:current_syntax = "tt2js"
diff --git a/runtime/syntax/typescript.vim b/runtime/syntax/typescript.vim
new file mode 100644
index 0000000..af71938
--- /dev/null
+++ b/runtime/syntax/typescript.vim
@@ -0,0 +1,47 @@
+" Vim syntax file
+" Language: TypeScript
+" Maintainer: Bram Moolenaar, Herrington Darkholme
+" Last Change: 2019 Nov 30
+" Based On: Herrington Darkholme's yats.vim
+" Changes: Go to https:github.com/HerringtonDarkholme/yats.vim for recent changes.
+" Origin: https://github.com/othree/yajs
+" Credits: Kao Wei-Ko(othree), Jose Elera Campana, Zhao Yi, Claudio Fleiner, Scott Shattuck
+" (This file is based on their hard work), gumnos (From the #vim
+" IRC Channel in Freenode)
+
+" This is the same syntax that is in yats.vim, but:
+" - flattened into one file
+" - HiLink commands changed to "hi def link"
+" - Setting 'cpo' to the Vim value
+
+if !exists("main_syntax")
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'typescript'
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" this region is NOT used in TypeScriptReact
+" nextgroup doesn't contain objectLiteral, let outer region contains it
+syntax region typescriptTypeCast matchgroup=typescriptTypeBrackets
+ \ start=/< \@!/ end=/>/
+ \ contains=@typescriptType
+ \ nextgroup=@typescriptExpression
+ \ contained skipwhite oneline
+
+
+"""""""""""""""""""""""""""""""""""""""""""""""""""
+" Source the part common with typescriptreact.vim
+source <sfile>:h/shared/typescriptcommon.vim
+
+
+let b:current_syntax = "typescript"
+if main_syntax == 'typescript'
+ unlet main_syntax
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/typescriptreact.vim b/runtime/syntax/typescriptreact.vim
new file mode 100644
index 0000000..c4c2d45
--- /dev/null
+++ b/runtime/syntax/typescriptreact.vim
@@ -0,0 +1,160 @@
+" Vim syntax file
+" Language: TypeScript with React (JSX)
+" Maintainer: Bram Moolenaar
+" Last Change: 2019 Nov 30
+" Based On: Herrington Darkholme's yats.vim
+" Changes: See https:github.com/HerringtonDarkholme/yats.vim
+" Credits: See yats.vim on github
+
+if !exists("main_syntax")
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'typescriptreact'
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syntax region tsxTag
+ \ start=+<\([^/!?<>="':]\+\)\@=+
+ \ skip=+</[^ /!?<>"']\+>+
+ \ end=+/\@<!>+
+ \ end=+\(/>\)\@=+
+ \ contained
+ \ contains=tsxTagName,tsxIntrinsicTagName,tsxAttrib,tsxEscJs,
+ \tsxCloseString,@tsxComment
+
+syntax match tsxTag /<>/ contained
+
+
+" <tag></tag>
+" s~~~~~~~~~e
+" and self close tag
+" <tag/>
+" s~~~~e
+" A big start regexp borrowed from https://git.io/vDyxc
+syntax region tsxRegion
+ \ start=+<\_s*\z([a-zA-Z1-9\$_-]\+\(\.\k\+\)*\)+
+ \ skip=+<!--\_.\{-}-->+
+ \ end=+</\_s*\z1>+
+ \ matchgroup=tsxCloseString end=+/>+
+ \ fold
+ \ contains=tsxRegion,tsxCloseString,tsxCloseTag,tsxTag,tsxCommentInvalid,tsxFragment,tsxEscJs,@Spell
+ \ keepend
+ \ extend
+
+" <> </>
+" s~~~~~~e
+" A big start regexp borrowed from https://git.io/vDyxc
+syntax region tsxFragment
+ \ start=+\(\((\|{\|}\|\[\|,\|&&\|||\|?\|:\|=\|=>\|\Wreturn\|^return\|\Wdefault\|^\|>\)\_s*\)\@<=<>+
+ \ skip=+<!--\_.\{-}-->+
+ \ end=+</>+
+ \ fold
+ \ contains=tsxRegion,tsxCloseString,tsxCloseTag,tsxTag,tsxCommentInvalid,tsxFragment,tsxEscJs,@Spell
+ \ keepend
+ \ extend
+
+" </tag>
+" ~~~~~~
+syntax match tsxCloseTag
+ \ +</\_s*[^/!?<>"']\+>+
+ \ contained
+ \ contains=tsxTagName,tsxIntrinsicTagName
+
+syntax match tsxCloseTag +</>+ contained
+
+syntax match tsxCloseString
+ \ +/>+
+ \ contained
+
+" <!-- -->
+" ~~~~~~~~
+syntax match tsxCommentInvalid /<!--\_.\{-}-->/ display
+
+syntax region tsxBlockComment
+ \ contained
+ \ start="/\*"
+ \ end="\*/"
+
+syntax match tsxLineComment
+ \ "//.*$"
+ \ contained
+ \ display
+
+syntax cluster tsxComment contains=tsxBlockComment,tsxLineComment
+
+syntax match tsxEntity "&[^; \t]*;" contains=tsxEntityPunct
+syntax match tsxEntityPunct contained "[&.;]"
+
+" <tag key={this.props.key}>
+" ~~~
+syntax match tsxTagName
+ \ +[</]\_s*[^/!?<>"'* ]\++hs=s+1
+ \ contained
+ \ nextgroup=tsxAttrib
+ \ skipwhite
+ \ display
+syntax match tsxIntrinsicTagName
+ \ +[</]\_s*[a-z1-9-]\++hs=s+1
+ \ contained
+ \ nextgroup=tsxAttrib
+ \ skipwhite
+ \ display
+
+" <tag key={this.props.key}>
+" ~~~
+syntax match tsxAttrib
+ \ +[a-zA-Z_][-0-9a-zA-Z_]*+
+ \ nextgroup=tsxEqual skipwhite
+ \ contained
+ \ display
+
+" <tag id="sample">
+" ~
+syntax match tsxEqual +=+ display contained
+ \ nextgroup=tsxString skipwhite
+
+" <tag id="sample">
+" s~~~~~~e
+syntax region tsxString contained start=+"+ end=+"+ contains=tsxEntity,@Spell display
+
+" <tag key={this.props.key}>
+" s~~~~~~~~~~~~~~e
+syntax region tsxEscJs
+ \ contained
+ \ contains=@typescriptValue,@tsxComment
+ \ matchgroup=typescriptBraces
+ \ start=+{+
+ \ end=+}+
+ \ extend
+
+
+"""""""""""""""""""""""""""""""""""""""""""""""""""
+" Source the part common with typescriptreact.vim
+source <sfile>:h/shared/typescriptcommon.vim
+
+
+syntax cluster typescriptExpression add=tsxRegion,tsxFragment
+
+hi def link tsxTag htmlTag
+hi def link tsxTagName Function
+hi def link tsxIntrinsicTagName htmlTagName
+hi def link tsxString String
+hi def link tsxNameSpace Function
+hi def link tsxCommentInvalid Error
+hi def link tsxBlockComment Comment
+hi def link tsxLineComment Comment
+hi def link tsxAttrib Type
+hi def link tsxEscJs tsxEscapeJs
+hi def link tsxCloseTag htmlTag
+hi def link tsxCloseString Identifier
+
+let b:current_syntax = "typescriptreact"
+if main_syntax == 'typescriptreact'
+ unlet main_syntax
+endif
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/uc.vim b/runtime/syntax/uc.vim
new file mode 100644
index 0000000..90d3339
--- /dev/null
+++ b/runtime/syntax/uc.vim
@@ -0,0 +1,165 @@
+" Vim syntax file
+" Language: UnrealScript
+" Maintainer: Mark Ferrell <major@chaoticdreams.org>
+" URL: ftp://ftp.chaoticdreams.org/pub/ut/vim/uc.vim
+" Credits: Based on the java.vim syntax file by Claudio Fleiner
+" Last change: 2003 May 31
+
+" Please check :help uc.vim for comments on some of the options available.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" some characters that cannot be in a UnrealScript program (outside a string)
+syn match ucError "[\\@`]"
+syn match ucError "<<<\|\.\.\|=>\|<>\|||=\|&&=\|[^-]->\|\*\/"
+
+" we define it here so that included files can test for it
+if !exists("main_syntax")
+ let main_syntax='uc'
+endif
+
+syntax case ignore
+
+" keyword definitions
+syn keyword ucBranch break continue
+syn keyword ucConditional if else switch
+syn keyword ucRepeat while for do foreach
+syn keyword ucBoolean true false
+syn keyword ucConstant null
+syn keyword ucOperator new instanceof
+syn keyword ucType boolean char byte short int long float double
+syn keyword ucType void Pawn sound state auto exec function ipaddr
+syn keyword ucType ELightType actor ammo defaultproperties bool
+syn keyword ucType native noexport var out vector name local string
+syn keyword ucType event
+syn keyword ucStatement return
+syn keyword ucStorageClass static synchronized transient volatile final
+syn keyword ucMethodDecl synchronized throws
+
+" UnrealScript defines classes in sorta fscked up fashion
+syn match ucClassDecl "^[Cc]lass[\s$]*\S*[\s$]*expands[\s$]*\S*;" contains=ucSpecial,ucSpecialChar,ucClassKeys
+syn keyword ucClassKeys class expands extends
+syn match ucExternal "^\#exec.*" contains=ucCommentString,ucNumber
+syn keyword ucScopeDecl public protected private abstract
+
+" UnrealScript Functions
+syn match ucFuncDef "^.*function\s*[\(]*" contains=ucType,ucStorageClass
+syn match ucEventDef "^.*event\s*[\(]*" contains=ucType,ucStorageClass
+syn match ucClassLabel "[a-zA-Z0-9]*\'[a-zA-Z0-9]*\'" contains=ucCharacter
+
+syn region ucLabelRegion transparent matchgroup=ucLabel start="\<case\>" matchgroup=NONE end=":" contains=ucNumber
+syn match ucUserLabel "^\s*[_$a-zA-Z][_$a-zA-Z0-9_]*\s*:"he=e-1 contains=ucLabel
+syn keyword ucLabel default
+
+" The following cluster contains all java groups except the contained ones
+syn cluster ucTop contains=ucExternal,ucError,ucError,ucBranch,ucLabelRegion,ucLabel,ucConditional,ucRepeat,ucBoolean,ucConstant,ucTypedef,ucOperator,ucType,ucType,ucStatement,ucStorageClass,ucMethodDecl,ucClassDecl,ucClassDecl,ucClassDecl,ucScopeDecl,ucError,ucError2,ucUserLabel,ucClassLabel
+
+" Comments
+syn keyword ucTodo contained TODO FIXME XXX
+syn region ucCommentString contained start=+"+ end=+"+ end=+\*/+me=s-1,he=s-1 contains=ucSpecial,ucCommentStar,ucSpecialChar
+syn region ucComment2String contained start=+"+ end=+$\|"+ contains=ucSpecial,ucSpecialChar
+syn match ucCommentCharacter contained "'\\[^']\{1,6\}'" contains=ucSpecialChar
+syn match ucCommentCharacter contained "'\\''" contains=ucSpecialChar
+syn match ucCommentCharacter contained "'[^\\]'"
+syn region ucComment start="/\*" end="\*/" contains=ucCommentString,ucCommentCharacter,ucNumber,ucTodo
+syn match ucCommentStar contained "^\s*\*[^/]"me=e-1
+syn match ucCommentStar contained "^\s*\*$"
+syn match ucLineComment "//.*" contains=ucComment2String,ucCommentCharacter,ucNumber,ucTodo
+hi link ucCommentString ucString
+hi link ucComment2String ucString
+hi link ucCommentCharacter ucCharacter
+
+syn cluster ucTop add=ucComment,ucLineComment
+
+" match the special comment /**/
+syn match ucComment "/\*\*/"
+
+" Strings and constants
+syn match ucSpecialError contained "\\."
+"syn match ucSpecialCharError contained "[^']"
+syn match ucSpecialChar contained "\\\([4-9]\d\|[0-3]\d\d\|[\"\\'ntbrf]\|u\x\{4\}\)"
+syn region ucString start=+"+ end=+"+ contains=ucSpecialChar,ucSpecialError
+syn match ucStringError +"\([^"\\]\|\\.\)*$+
+syn match ucCharacter "'[^']*'" contains=ucSpecialChar,ucSpecialCharError
+syn match ucCharacter "'\\''" contains=ucSpecialChar
+syn match ucCharacter "'[^\\]'"
+syn match ucNumber "\<\(0[0-7]*\|0[xX]\x\+\|\d\+\)[lL]\=\>"
+syn match ucNumber "\(\<\d\+\.\d*\|\.\d\+\)\([eE][-+]\=\d\+\)\=[fFdD]\="
+syn match ucNumber "\<\d\+[eE][-+]\=\d\+[fFdD]\=\>"
+syn match ucNumber "\<\d\+\([eE][-+]\=\d\+\)\=[fFdD]\>"
+
+" unicode characters
+syn match ucSpecial "\\u\d\{4\}"
+
+syn cluster ucTop add=ucString,ucCharacter,ucNumber,ucSpecial,ucStringError
+
+" catch errors caused by wrong parenthesis
+syn region ucParen transparent start="(" end=")" contains=@ucTop,ucParen
+syn match ucParenError ")"
+hi link ucParenError ucError
+
+if !exists("uc_minlines")
+ let uc_minlines = 10
+endif
+exec "syn sync ccomment ucComment minlines=" . uc_minlines
+
+" Define the default highlighting.
+" 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"
+
+if main_syntax == 'uc'
+ unlet main_syntax
+endif
+
+" vim: ts=8
diff --git a/runtime/syntax/udevconf.vim b/runtime/syntax/udevconf.vim
new file mode 100644
index 0000000..82fd81d
--- /dev/null
+++ b/runtime/syntax/udevconf.vim
@@ -0,0 +1,39 @@
+" Vim syntax file
+" Language: udev(8) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword udevconfTodo contained TODO FIXME XXX NOTE
+
+syn region udevconfComment display oneline start='^\s*#' end='$'
+ \ contains=udevconfTodo,@Spell
+
+syn match udevconfBegin display '^'
+ \ nextgroup=udevconfVariable,udevconfComment
+ \ skipwhite
+
+syn keyword udevconfVariable contained udev_root udev_db udev_rules udev_log
+ \ nextgroup=udevconfVariableEq
+
+syn match udevconfVariableEq contained '[[:space:]=]'
+ \ nextgroup=udevconfString skipwhite
+
+syn region udevconfString contained display oneline start=+"+ end=+"+
+
+hi def link udevconfTodo Todo
+hi def link udevconfComment Comment
+hi def link udevconfVariable Identifier
+hi def link udevconfVariableEq Operator
+hi def link udevconfString String
+
+let b:current_syntax = "udevconf"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/udevperm.vim b/runtime/syntax/udevperm.vim
new file mode 100644
index 0000000..abda0b6
--- /dev/null
+++ b/runtime/syntax/udevperm.vim
@@ -0,0 +1,69 @@
+" Vim syntax file
+" Language: udev(8) permissions file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match udevpermBegin display '^' nextgroup=udevpermDevice
+
+syn match udevpermDevice contained display '[^:]\+'
+ \ contains=udevpermPattern
+ \ nextgroup=udevpermUserColon
+
+syn match udevpermPattern contained '[*?]'
+syn region udevpermPattern contained start='\[!\=' end='\]'
+ \ contains=udevpermPatRange
+
+syn match udevpermPatRange contained '[^[-]-[^]-]'
+
+syn match udevpermUserColon contained display ':'
+ \ nextgroup=udevpermUser
+
+syn match udevpermUser contained display '[^:]\+'
+ \ nextgroup=udevpermGroupColon
+
+syn match udevpermGroupColon contained display ':'
+ \ nextgroup=udevpermGroup
+
+syn match udevpermGroup contained display '[^:]\+'
+ \ nextgroup=udevpermPermColon
+
+syn match udevpermPermColon contained display ':'
+ \ nextgroup=udevpermPerm
+
+syn match udevpermPerm contained display '\<0\=\o\+\>'
+ \ contains=udevpermOctalZero
+
+syn match udevpermOctalZero contained display '\<0'
+syn match udevpermOctalError contained display '\<0\o*[89]\d*\>'
+
+syn keyword udevpermTodo contained TODO FIXME XXX NOTE
+
+syn region udevpermComment display oneline start='^\s*#' end='$'
+ \ contains=udevpermTodo,@Spell
+
+hi def link udevpermTodo Todo
+hi def link udevpermComment Comment
+hi def link udevpermDevice String
+hi def link udevpermPattern SpecialChar
+hi def link udevpermPatRange udevpermPattern
+hi def link udevpermColon Normal
+hi def link udevpermUserColon udevpermColon
+hi def link udevpermUser Identifier
+hi def link udevpermGroupColon udevpermColon
+hi def link udevpermGroup Type
+hi def link udevpermPermColon udevpermColon
+hi def link udevpermPerm Number
+hi def link udevpermOctalZero PreProc
+hi def link udevpermOctalError Error
+
+let b:current_syntax = "udevperm"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/udevrules.vim b/runtime/syntax/udevrules.vim
new file mode 100644
index 0000000..ce156cc
--- /dev/null
+++ b/runtime/syntax/udevrules.vim
@@ -0,0 +1,171 @@
+" Vim syntax file
+" Language: udev(8) rules file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-18
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" TODO: Line continuations.
+
+syn keyword udevrulesTodo contained TODO FIXME XXX NOTE
+
+syn region udevrulesComment display oneline start='^\s*#' end='$'
+ \ contains=udevrulesTodo,@Spell
+
+syn keyword udevrulesRuleKey ACTION DEVPATH KERNEL SUBSYSTEM KERNELS
+ \ SUBSYSTEMS DRIVERS RESULT
+ \ nextgroup=udevrulesRuleTest
+ \ skipwhite
+
+syn keyword udevrulesRuleKey ATTRS nextgroup=udevrulesAttrsPath
+
+syn region udevrulesAttrsPath display transparent
+ \ matchgroup=udevrulesDelimiter start='{'
+ \ matchgroup=udevrulesDelimiter end='}'
+ \ contains=udevrulesPath
+ \ nextgroup=udevrulesRuleTest
+ \ skipwhite
+
+syn keyword udevrulesRuleKey ENV nextgroup=udevrulesEnvVar
+
+syn region udevrulesEnvVar display transparent
+ \ matchgroup=udevrulesDelimiter start='{'
+ \ matchgroup=udevrulesDelimiter end='}'
+ \ contains=udevrulesVariable
+ \ nextgroup=udevrulesRuleTest,udevrulesRuleEq
+ \ skipwhite
+
+syn keyword udevrulesRuleKey PROGRAM RESULT
+ \ nextgroup=udevrulesEStringTest,udevrulesEStringEq
+ \ skipwhite
+
+syn keyword udevrulesAssignKey NAME SYMLINK OWNER GROUP RUN
+ \ nextgroup=udevrulesEStringEq
+ \ skipwhite
+
+syn keyword udevrulesAssignKey MODE LABEL GOTO WAIT_FOR_SYSFS
+ \ nextgroup=udevrulesRuleEq
+ \ skipwhite
+
+syn keyword udevrulesAssignKey ATTR nextgroup=udevrulesAttrsPath
+
+syn region udevrulesAttrKey display transparent
+ \ matchgroup=udevrulesDelimiter start='{'
+ \ matchgroup=udevrulesDelimiter end='}'
+ \ contains=udevrulesKey
+ \ nextgroup=udevrulesRuleEq
+ \ skipwhite
+
+syn keyword udevrulesAssignKey IMPORT nextgroup=udevrulesImport,
+ \ udevrulesEStringEq
+ \ skipwhite
+
+syn region udevrulesImport display transparent
+ \ matchgroup=udevrulesDelimiter start='{'
+ \ matchgroup=udevrulesDelimiter end='}'
+ \ contains=udevrulesImportType
+ \ nextgroup=udevrulesEStringEq
+ \ skipwhite
+
+syn keyword udevrulesImportType program file parent
+
+syn keyword udevrulesAssignKey OPTIONS
+ \ nextgroup=udevrulesOptionsEq
+
+syn match udevrulesPath contained display '[^}]\+'
+
+syn match udevrulesVariable contained display '[^}]\+'
+
+syn match udevrulesRuleTest contained display '[=!:]='
+ \ nextgroup=udevrulesString skipwhite
+
+syn match udevrulesEStringTest contained display '[=!+:]='
+ \ nextgroup=udevrulesEString skipwhite
+
+syn match udevrulesRuleEq contained display '+=\|=\ze[^=]'
+ \ nextgroup=udevrulesString skipwhite
+
+syn match udevrulesEStringEq contained '+=\|=\ze[^=]'
+ \ nextgroup=udevrulesEString skipwhite
+
+syn match udevrulesOptionsEq contained '+=\|=\ze[^=]'
+ \ nextgroup=udevrulesOptions skipwhite
+
+syn region udevrulesEString contained display oneline start=+"+ end=+"+
+ \ contains=udevrulesStrEscapes,udevrulesStrVars
+
+syn match udevrulesStrEscapes contained '%[knpbMmcPrN%]'
+
+" TODO: This can actually stand alone (without {…}), so add a nextgroup here.
+syn region udevrulesStrEscapes contained start='%c{' end='}'
+ \ contains=udevrulesStrNumber
+
+syn region udevrulesStrEscapes contained start='%s{' end='}'
+ \ contains=udevrulesPath
+
+syn region udevrulesStrEscapes contained start='%E{' end='}'
+ \ contains=udevrulesVariable
+
+syn match udevrulesStrNumber contained '\d\++\='
+
+syn match udevrulesStrVars contained display '$\%(kernel\|number\|devpath\|id\|major\|minor\|result\|parent\|root\|tempnode\)\>'
+
+syn region udevrulesStrVars contained start='$attr{' end='}'
+ \ contains=udevrulesPath
+
+syn region udevrulesStrVars contained start='$env{' end='}'
+ \ contains=udevrulesVariable
+
+syn match udevrulesStrVars contained display '\$\$'
+
+syn region udevrulesString contained display oneline start=+"+ end=+"+
+ \ contains=udevrulesPattern
+
+syn match udevrulesPattern contained '[*?]'
+syn region udevrulesPattern contained start='\[!\=' end='\]'
+ \ contains=udevrulesPatRange
+
+syn match udevrulesPatRange contained '[^[-]-[^]-]'
+
+syn region udevrulesOptions contained display oneline start=+"+ end=+"+
+ \ contains=udevrulesOption,udevrulesOptionSep
+
+syn keyword udevrulesOption contained last_rule ignore_device ignore_remove
+ \ all_partitions
+
+syn match udevrulesOptionSep contained ','
+
+hi def link udevrulesTodo Todo
+hi def link udevrulesComment Comment
+hi def link udevrulesRuleKey Keyword
+hi def link udevrulesDelimiter Delimiter
+hi def link udevrulesAssignKey Identifier
+hi def link udevrulesPath Identifier
+hi def link udevrulesVariable Identifier
+hi def link udevrulesAttrKey Identifier
+" XXX: setting this to Operator makes for extremely intense highlighting.
+hi def link udevrulesEq Normal
+hi def link udevrulesRuleEq udevrulesEq
+hi def link udevrulesEStringEq udevrulesEq
+hi def link udevrulesOptionsEq udevrulesEq
+hi def link udevrulesEString udevrulesString
+hi def link udevrulesStrEscapes SpecialChar
+hi def link udevrulesStrNumber Number
+hi def link udevrulesStrVars Identifier
+hi def link udevrulesString String
+hi def link udevrulesPattern SpecialChar
+hi def link udevrulesPatRange SpecialChar
+hi def link udevrulesOptions udevrulesString
+hi def link udevrulesOption Type
+hi def link udevrulesOptionSep Delimiter
+hi def link udevrulesImportType Type
+
+let b:current_syntax = "udevrules"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/uil.vim b/runtime/syntax/uil.vim
new file mode 100644
index 0000000..088a0f6
--- /dev/null
+++ b/runtime/syntax/uil.vim
@@ -0,0 +1,75 @@
+" Vim syntax file
+" Language: Motif UIL (User Interface Language)
+" 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/uil.vim
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A bunch of useful keywords
+syn keyword uilType arguments callbacks color
+syn keyword uilType compound_string controls end
+syn keyword uilType exported file include
+syn keyword uilType module object procedure
+syn keyword uilType user_defined xbitmapfile
+
+syn keyword uilTodo contained TODO
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match uilSpecial contained "\\\d\d\d\|\\."
+syn region uilString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@Spell,uilSpecial
+syn match uilCharacter "'[^\\]'"
+syn region uilString start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=@Spell,uilSpecial
+syn match uilSpecialCharacter "'\\.'"
+syn match uilSpecialStatement "Xm[^ =(){}:;]*"
+syn match uilSpecialFunction "MrmNcreateCallback"
+syn match uilRessource "XmN[^ =(){}:;]*"
+
+syn match uilNumber "-\=\<\d*\.\=\d\+\(e\=f\=\|[uU]\=[lL]\=\)\>"
+syn match uilNumber "0[xX]\x\+\>"
+
+syn region uilComment start="/\*" end="\*/" contains=@Spell,uilTodo
+syn match uilComment "!.*" contains=@Spell,uilTodo
+syn match uilCommentError "\*/"
+
+syn region uilPreCondit start="^#\s*\(if\>\|ifdef\>\|ifndef\>\|elif\>\|else\>\|endif\>\)" skip="\\$" end="$" contains=uilComment,uilString,uilCharacter,uilNumber,uilCommentError
+syn match uilIncluded contained "<[^>]*>"
+syn match uilInclude "^#\s*include\s\+." contains=uilString,uilIncluded
+syn match uilLineSkip "\\$"
+syn region uilDefine start="^#\s*\(define\>\|undef\>\)" end="$" contains=uilLineSkip,uilComment,uilString,uilCharacter,uilNumber,uilCommentError
+
+syn sync ccomment uilComment
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+" 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
+
+
+
+let b:current_syntax = "uil"
+
+" vim: ts=8
diff --git a/runtime/syntax/updatedb.vim b/runtime/syntax/updatedb.vim
new file mode 100644
index 0000000..224a7dd
--- /dev/null
+++ b/runtime/syntax/updatedb.vim
@@ -0,0 +1,41 @@
+" Vim syntax file
+" Language: updatedb.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2009-05-25
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword updatedbTodo contained TODO FIXME XXX NOTE
+
+syn region updatedbComment display oneline start='^\s*#' end='$'
+ \ contains=updatedbTodo,@Spell
+
+syn match updatedbBegin display '^'
+ \ nextgroup=updatedbName,updatedbComment skipwhite
+
+syn keyword updatedbName contained
+ \ PRUNEFS
+ \ PRUNENAMES
+ \ PRUNEPATHS
+ \ PRUNE_BIND_MOUNTS
+ \ nextgroup=updatedbNameEq
+
+syn match updatedbNameEq contained display '=' nextgroup=updatedbValue
+
+syn region updatedbValue contained display oneline start='"' end='"'
+
+hi def link updatedbTodo Todo
+hi def link updatedbComment Comment
+hi def link updatedbName Identifier
+hi def link updatedbNameEq Operator
+hi def link updatedbValue String
+
+let b:current_syntax = "updatedb"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/upstart.vim b/runtime/syntax/upstart.vim
new file mode 100644
index 0000000..140cd17
--- /dev/null
+++ b/runtime/syntax/upstart.vim
@@ -0,0 +1,111 @@
+" Vim syntax file
+" Language: Upstart job files
+" Maintainer: Michael Biebl <biebl@debian.org>
+" James Hunt <james.hunt@ubuntu.com>
+" Last Change: 2012 Jan 16
+" License: The Vim license
+" Version: 0.4
+" Remark: Syntax highlighting for Upstart (init(8)) job files.
+"
+" It is inspired by the initng syntax file and includes sh.vim to do the
+" highlighting of script blocks.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let is_bash = 1
+syn include @Shell syntax/sh.vim
+
+syn case match
+
+" avoid need to use 'match' for most events
+setlocal iskeyword+=-
+
+syn match upstartComment /#.*$/ contains=upstartTodo
+syn keyword upstartTodo TODO FIXME contained
+
+syn region upstartString start=/"/ end=/"/ skip=/\\"/
+
+syn region upstartScript matchgroup=upstartStatement start="script" end="end script" contains=@upstartShellCluster
+
+syn cluster upstartShellCluster contains=@Shell
+
+" one argument
+syn keyword upstartStatement description author version instance expect
+syn keyword upstartStatement pid kill normal console env exit export
+syn keyword upstartStatement umask nice oom chroot chdir exec
+
+" two arguments
+syn keyword upstartStatement limit
+
+" one or more arguments (events)
+syn keyword upstartStatement emits
+
+syn keyword upstartStatement on start stop
+
+" flag, no parameter
+syn keyword upstartStatement respawn service instance manual debug task
+
+" prefix for exec or script
+syn keyword upstartOption pre-start post-start pre-stop post-stop
+
+" option for kill
+syn keyword upstartOption timeout
+" option for oom
+syn keyword upstartOption never
+" options for console
+syn keyword upstartOption output owner
+" options for expect
+syn keyword upstartOption fork daemon
+" options for limit
+syn keyword upstartOption unlimited
+
+" 'options' for start/stop on
+syn keyword upstartOption and or
+
+" Upstart itself and associated utilities
+syn keyword upstartEvent runlevel
+syn keyword upstartEvent started
+syn keyword upstartEvent starting
+syn keyword upstartEvent startup
+syn keyword upstartEvent stopped
+syn keyword upstartEvent stopping
+syn keyword upstartEvent control-alt-delete
+syn keyword upstartEvent keyboard-request
+syn keyword upstartEvent power-status-changed
+
+" D-Bus
+syn keyword upstartEvent dbus-activation
+
+" Display Manager (ie gdm)
+syn keyword upstartEvent desktop-session-start
+syn keyword upstartEvent login-session-start
+
+" mountall
+syn keyword upstartEvent all-swaps
+syn keyword upstartEvent filesystem
+syn keyword upstartEvent mounted
+syn keyword upstartEvent mounting
+syn keyword upstartEvent local-filesystems
+syn keyword upstartEvent remote-filesystems
+syn keyword upstartEvent virtual-filesystems
+
+" SysV umountnfs.sh
+syn keyword upstartEvent mounted-remote-filesystems
+
+" upstart-udev-bridge and ifup/down
+syn match upstartEvent /\<\i\{-1,}-device-\(added\|removed\|up\|down\)/
+
+" upstart-socket-bridge
+syn keyword upstartEvent socket
+
+hi def link upstartComment Comment
+hi def link upstartTodo Todo
+hi def link upstartString String
+hi def link upstartStatement Statement
+hi def link upstartOption Type
+hi def link upstartEvent Define
+
+let b:current_syntax = "upstart"
diff --git a/runtime/syntax/upstreamdat.vim b/runtime/syntax/upstreamdat.vim
new file mode 100644
index 0000000..e3b415a
--- /dev/null
+++ b/runtime/syntax/upstreamdat.vim
@@ -0,0 +1,305 @@
+" Vim syntax file
+" Language: Innovation Data Processing upstream.dat file
+" Maintainer: Rob Owens <rowens@fdrinnovation.com>
+" Latest Revision: 2013-11-27
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Parameters:
+syn keyword upstreamdat_Parameter ACCEPTPCREMOTE
+syn keyword upstreamdat_Parameter ACCEPTREMOTE
+syn keyword upstreamdat_Parameter ACTION
+syn keyword upstreamdat_Parameter ACTIVATEONENTRY
+syn keyword upstreamdat_Parameter ARCHIVEBIT
+syn keyword upstreamdat_Parameter ARCHIVEBIT
+syn keyword upstreamdat_Parameter ASCTOEBC
+syn keyword upstreamdat_Parameter ASRBACKUP
+syn keyword upstreamdat_Parameter ATTENDED
+syn keyword upstreamdat_Parameter AUTHORITATIVE
+syn keyword upstreamdat_Parameter AUTHORITATIVERESTORE
+syn keyword upstreamdat_Parameter AUTHORITATIVERESTORE
+syn keyword upstreamdat_Parameter BACKUPPROFILE
+syn keyword upstreamdat_Parameter BACKUPPROFILE2
+syn keyword upstreamdat_Parameter BACKUPREPARSEFILES
+syn keyword upstreamdat_Parameter BACKUPREPARSEFILES
+syn keyword upstreamdat_Parameter BACKUPVERIFY
+syn keyword upstreamdat_Parameter BLANKTRUNC
+syn keyword upstreamdat_Parameter CALCDASDSIZE
+syn keyword upstreamdat_Parameter CHANGEDIRATTRIBS
+syn keyword upstreamdat_Parameter CHANGEDIRATTRIBS
+syn keyword upstreamdat_Parameter COMPRESSLEVEL
+syn keyword upstreamdat_Parameter CONTROLFILE
+syn keyword upstreamdat_Parameter DASDOVERRIDE
+syn keyword upstreamdat_Parameter DATELIMIT
+syn keyword upstreamdat_Parameter DATELIMIT
+syn keyword upstreamdat_Parameter DAYSOLD
+syn keyword upstreamdat_Parameter DAYSOLD
+syn keyword upstreamdat_Parameter DELETED
+syn keyword upstreamdat_Parameter DELETED
+syn keyword upstreamdat_Parameter DELETEPROMPTS
+syn keyword upstreamdat_Parameter DELETEPROMPTS
+syn keyword upstreamdat_Parameter DESTINATION
+syn keyword upstreamdat_Parameter DESTINATION
+syn keyword upstreamdat_Parameter DIRDELETE
+syn keyword upstreamdat_Parameter DIRECTORVMC
+syn keyword upstreamdat_Parameter DIRONLYRESTOREOK
+syn keyword upstreamdat_Parameter DIRSONLY
+syn keyword upstreamdat_Parameter DIRSONLY
+syn keyword upstreamdat_Parameter DISASTERRECOVERY
+syn keyword upstreamdat_Parameter DISPLAY
+syn keyword upstreamdat_Parameter DRIVEALIAS
+syn keyword upstreamdat_Parameter DRIVEALIAS
+syn keyword upstreamdat_Parameter DUALCOPY
+syn keyword upstreamdat_Parameter DUPDAYS
+syn keyword upstreamdat_Parameter DUPLICATE
+syn keyword upstreamdat_Parameter EBCTOASC
+syn keyword upstreamdat_Parameter ENCRYPT
+syn keyword upstreamdat_Parameter ENCRYPTLEVEL
+syn keyword upstreamdat_Parameter EXCLUDELISTNAME
+syn keyword upstreamdat_Parameter FAILBACKUPONERROR
+syn keyword upstreamdat_Parameter FAILBACKUPONERROR
+syn keyword upstreamdat_Parameter FAILIFNOFILES
+syn keyword upstreamdat_Parameter FAILIFNOFILES
+syn keyword upstreamdat_Parameter FAILIFSKIP
+syn keyword upstreamdat_Parameter FAILJOB
+syn keyword upstreamdat_Parameter FAILRESTOREONERROR
+syn keyword upstreamdat_Parameter FAILRESTOREONERROR
+syn keyword upstreamdat_Parameter FILEDATE
+syn keyword upstreamdat_Parameter FILEDATE
+syn keyword upstreamdat_Parameter FILEDELETE
+syn keyword upstreamdat_Parameter FILEDELETE
+syn keyword upstreamdat_Parameter FILES
+syn keyword upstreamdat_Parameter FILES
+syn keyword upstreamdat_Parameter FILESOPENFORUPDAT
+syn keyword upstreamdat_Parameter FILESOPENFORUPDAT
+syn keyword upstreamdat_Parameter FILETRANSFER
+syn keyword upstreamdat_Parameter GETREMOTEFILES
+syn keyword upstreamdat_Parameter HARDLINKDB
+syn keyword upstreamdat_Parameter HARDLINKS
+syn keyword upstreamdat_Parameter HARDLINKS
+syn keyword upstreamdat_Parameter HIDDENFILES
+syn keyword upstreamdat_Parameter HIDDENFILES
+syn keyword upstreamdat_Parameter HOLDTAPE
+syn keyword upstreamdat_Parameter HOLDUSERDIRS
+syn keyword upstreamdat_Parameter HOSTFILENAME
+syn keyword upstreamdat_Parameter HOSTRECORD
+syn keyword upstreamdat_Parameter HOSTSORT
+syn keyword upstreamdat_Parameter IGNOREPLUGINSFORRESTORE
+syn keyword upstreamdat_Parameter INCRDB
+syn keyword upstreamdat_Parameter INCRDBARCHIVEBIT
+syn keyword upstreamdat_Parameter INCRDBDELETEDFILES
+syn keyword upstreamdat_Parameter INCREMENTAL
+syn keyword upstreamdat_Parameter INCREMENTAL
+syn keyword upstreamdat_Parameter INQOPTIONS
+syn keyword upstreamdat_Parameter INSTALLWIN2KAGENT
+syn keyword upstreamdat_Parameter INSTALLWIN2KAGENT
+syn keyword upstreamdat_Parameter JOBOPTIONS
+syn keyword upstreamdat_Parameter JOBRETURNCODEMAP
+syn keyword upstreamdat_Parameter JOBWAITTIMELIMIT
+syn keyword upstreamdat_Parameter KEEPALIVE
+syn keyword upstreamdat_Parameter LANINTERFACE
+syn keyword upstreamdat_Parameter LANWSNAME
+syn keyword upstreamdat_Parameter LANWSPASSWORD
+syn keyword upstreamdat_Parameter LASTACCESS
+syn keyword upstreamdat_Parameter LASTACCESS
+syn keyword upstreamdat_Parameter LATESTDATE
+syn keyword upstreamdat_Parameter LATESTDATE
+syn keyword upstreamdat_Parameter LATESTTIME
+syn keyword upstreamdat_Parameter LATESTTIME
+syn keyword upstreamdat_Parameter LATESTVERSION
+syn keyword upstreamdat_Parameter LINEBLOCK
+syn keyword upstreamdat_Parameter LINETRUNC
+syn keyword upstreamdat_Parameter LISTENFORREMOTE
+syn keyword upstreamdat_Parameter LOCALBACKUP
+syn keyword upstreamdat_Parameter LOCALBACKUPDIR
+syn keyword upstreamdat_Parameter LOCALBACKUPMAX
+syn keyword upstreamdat_Parameter LOCALBACKUPMAXFILESIZE
+syn keyword upstreamdat_Parameter LOCALBACKUPMAXSIZE
+syn keyword upstreamdat_Parameter LOCALEXCLUDEFILE
+syn keyword upstreamdat_Parameter LOCALPARAMETERS
+syn keyword upstreamdat_Parameter LOCALPASSWORD
+syn keyword upstreamdat_Parameter LOCALRESTORE
+syn keyword upstreamdat_Parameter LOCALUSER
+syn keyword upstreamdat_Parameter LOFS
+syn keyword upstreamdat_Parameter LOGNONFATAL
+syn keyword upstreamdat_Parameter MAXBACKUPFILESFAIL
+syn keyword upstreamdat_Parameter MAXBACKUPTIME
+syn keyword upstreamdat_Parameter MAXDUPS
+syn keyword upstreamdat_Parameter MAXFILENAMESIZE
+syn keyword upstreamdat_Parameter MAXKFILESIZE
+syn keyword upstreamdat_Parameter MAXLOGDAYS
+syn keyword upstreamdat_Parameter MAXRESTOREFILESFAIL
+syn keyword upstreamdat_Parameter MAXRESTORETIME
+syn keyword upstreamdat_Parameter MAXRETRY
+syn keyword upstreamdat_Parameter MAXRPTDAYS
+syn keyword upstreamdat_Parameter MERGE
+syn keyword upstreamdat_Parameter MIGRBITS
+syn keyword upstreamdat_Parameter MIGRBITS
+syn keyword upstreamdat_Parameter MINCOMPRESSSIZE
+syn keyword upstreamdat_Parameter MINIMIZE
+syn keyword upstreamdat_Parameter MODIFYFILE
+syn keyword upstreamdat_Parameter MOUNTPOINTS
+syn keyword upstreamdat_Parameter MOUNTPOINTS
+syn keyword upstreamdat_Parameter NDS
+syn keyword upstreamdat_Parameter NDS
+syn keyword upstreamdat_Parameter NEWFILECOMPARE
+syn keyword upstreamdat_Parameter NFSBELOW
+syn keyword upstreamdat_Parameter NODATAOK
+syn keyword upstreamdat_Parameter NODIRFORINCREMENTAL
+syn keyword upstreamdat_Parameter NODIRFORINCREMENTAL
+syn keyword upstreamdat_Parameter NONFILEDATABITMAP
+syn keyword upstreamdat_Parameter NONFILEDATABITMAP
+syn keyword upstreamdat_Parameter NOPOINTRESTORE
+syn keyword upstreamdat_Parameter NOSPECINHERITANCE
+syn keyword upstreamdat_Parameter NOTIFYEVENTS
+syn keyword upstreamdat_Parameter NOTIFYFAILUREATTACHMENT
+syn keyword upstreamdat_Parameter NOTIFYSUCCESSATTACHMENT
+syn keyword upstreamdat_Parameter NOTIFYTARGETS
+syn keyword upstreamdat_Parameter NOUIDGIDNAMES
+syn keyword upstreamdat_Parameter NOUIDGIDNAMES
+syn keyword upstreamdat_Parameter NOVELLMIGRATE
+syn keyword upstreamdat_Parameter NOVELLMIGRATE
+syn keyword upstreamdat_Parameter NOVELLMIGRATEADDEXT
+syn keyword upstreamdat_Parameter NOVELLMIGRATEADDEXT
+syn keyword upstreamdat_Parameter NOVELLPROFILE
+syn keyword upstreamdat_Parameter NOVELLRECALL
+syn keyword upstreamdat_Parameter NTFSADDPERMISSION
+syn keyword upstreamdat_Parameter NTFSADDPERMISSION
+syn keyword upstreamdat_Parameter NTREGRESTORE
+syn keyword upstreamdat_Parameter OSTYPE
+syn keyword upstreamdat_Parameter OUTPORT
+syn keyword upstreamdat_Parameter PACKFLUSHAFTERFILE
+syn keyword upstreamdat_Parameter PACKRECSIZE
+syn keyword upstreamdat_Parameter PARAMETER
+syn keyword upstreamdat_Parameter PASSWORD
+syn keyword upstreamdat_Parameter PATHNAME
+syn keyword upstreamdat_Parameter PATHNAME
+syn keyword upstreamdat_Parameter PERFORMBITMAP
+syn keyword upstreamdat_Parameter PERFORMNUMRECORDS
+syn keyword upstreamdat_Parameter PERFORMRECORDSIZE
+syn keyword upstreamdat_Parameter PLUGIN
+syn keyword upstreamdat_Parameter PLUGIN
+syn keyword upstreamdat_Parameter PLUGINPARAMETERS
+syn keyword upstreamdat_Parameter PLUGINPARAMETERS
+syn keyword upstreamdat_Parameter POSTJOB
+syn keyword upstreamdat_Parameter PREJOB
+syn keyword upstreamdat_Parameter PRTYCLASS
+syn keyword upstreamdat_Parameter PRTYLEVEL
+syn keyword upstreamdat_Parameter RECALLCLEANUP
+syn keyword upstreamdat_Parameter RECALLOFFLINEFILES
+syn keyword upstreamdat_Parameter RECALLOFFLINEFILES
+syn keyword upstreamdat_Parameter RECORDSIZE
+syn keyword upstreamdat_Parameter REMOTEADDR
+syn keyword upstreamdat_Parameter REMOTEAPPLPREF
+syn keyword upstreamdat_Parameter REMOTEAPPLRETRY
+syn keyword upstreamdat_Parameter REMOTECONNECTTYPE
+syn keyword upstreamdat_Parameter REMOTEFLAGS
+syn keyword upstreamdat_Parameter REMOTEIPADAPTER
+syn keyword upstreamdat_Parameter REMOTELOCALPARAMETERS
+syn keyword upstreamdat_Parameter REMOTELOGMODE
+syn keyword upstreamdat_Parameter REMOTELUNAME
+syn keyword upstreamdat_Parameter REMOTEMAXRETRIES
+syn keyword upstreamdat_Parameter REMOTEMODENAME
+syn keyword upstreamdat_Parameter REMOTEPARAMETERFILE
+syn keyword upstreamdat_Parameter REMOTEPORT
+syn keyword upstreamdat_Parameter REMOTEREQUEST
+syn keyword upstreamdat_Parameter REMOTERESTART
+syn keyword upstreamdat_Parameter REMOTEROUTE
+syn keyword upstreamdat_Parameter REMOTETARGETNAME
+syn keyword upstreamdat_Parameter REMOTETCP
+syn keyword upstreamdat_Parameter REMOTETIMEOUT
+syn keyword upstreamdat_Parameter REMOTETMAXRETRY
+syn keyword upstreamdat_Parameter REMOTETPN
+syn keyword upstreamdat_Parameter REMOTEUSAPPL
+syn keyword upstreamdat_Parameter REMOTEVERIFY
+syn keyword upstreamdat_Parameter REMOTEWTOCOMP
+syn keyword upstreamdat_Parameter REPORTNAME
+syn keyword upstreamdat_Parameter REPORTOPTIONS
+syn keyword upstreamdat_Parameter RESTARTLASTFILE
+syn keyword upstreamdat_Parameter RESTART
+syn keyword upstreamdat_Parameter RESTARTTYPE
+syn keyword upstreamdat_Parameter RESTARTVERSIONDATE
+syn keyword upstreamdat_Parameter RESTOREARCHIVEBIT
+syn keyword upstreamdat_Parameter RESTORECHECKPOINT
+syn keyword upstreamdat_Parameter RESTOREDATELIMIT
+syn keyword upstreamdat_Parameter RESTOREDATELIMIT
+syn keyword upstreamdat_Parameter RESTOREFILEFAIL
+syn keyword upstreamdat_Parameter RESTOREMOUNTPOINTS
+syn keyword upstreamdat_Parameter RESTOREMOUNTPOINTS
+syn keyword upstreamdat_Parameter RESTORESEGMENTS
+syn keyword upstreamdat_Parameter RESTORESEGMENTS
+syn keyword upstreamdat_Parameter RESTORETODIFFFS
+syn keyword upstreamdat_Parameter RETAIN
+syn keyword upstreamdat_Parameter RETAIN
+syn keyword upstreamdat_Parameter ROOTENTRY
+syn keyword upstreamdat_Parameter ROOTENTRY
+syn keyword upstreamdat_Parameter SAN
+syn keyword upstreamdat_Parameter SCHEDULENAME
+syn keyword upstreamdat_Parameter SEGMENTEDFILESIZE
+syn keyword upstreamdat_Parameter SEGMENTEDFILESIZE
+syn keyword upstreamdat_Parameter SEGMENTSIZE
+syn keyword upstreamdat_Parameter SEGMENTSIZE
+syn keyword upstreamdat_Parameter SENDHOSTDETAILS
+syn keyword upstreamdat_Parameter SINGLEFS
+syn keyword upstreamdat_Parameter SIZETRC
+syn keyword upstreamdat_Parameter SKIP
+syn keyword upstreamdat_Parameter SKIPBACKUPSCAN
+syn keyword upstreamdat_Parameter SKIPOLD
+syn keyword upstreamdat_Parameter SKIPOLD
+syn keyword upstreamdat_Parameter SMSTARGETSERVICENAME
+syn keyword upstreamdat_Parameter SMSTSA
+syn keyword upstreamdat_Parameter SOLO
+syn keyword upstreamdat_Parameter SORTBACKUP
+syn keyword upstreamdat_Parameter SOSDISK
+syn keyword upstreamdat_Parameter SOSDISK
+syn keyword upstreamdat_Parameter SOSTIMESTAMP
+syn keyword upstreamdat_Parameter SOSTIMESTAMP
+syn keyword upstreamdat_Parameter SOSTIMESTAMPPATH
+syn keyword upstreamdat_Parameter SOSTIMESTAMPPATH
+syn keyword upstreamdat_Parameter SPECNUMBER
+syn keyword upstreamdat_Parameter SPECNUMBER
+syn keyword upstreamdat_Parameter SPECTYPE
+syn keyword upstreamdat_Parameter SPECTYPE
+syn keyword upstreamdat_Parameter STARTTIME
+syn keyword upstreamdat_Parameter STORAGETYPE
+syn keyword upstreamdat_Parameter SUBDIRECTORIES
+syn keyword upstreamdat_Parameter SUBDIRECTORIES
+syn keyword upstreamdat_Parameter SWITCHTOTAPEMB
+syn keyword upstreamdat_Parameter TCPADDRESS
+syn keyword upstreamdat_Parameter TCPTIMEOUT
+syn keyword upstreamdat_Parameter TIMEOVERRIDE
+syn keyword upstreamdat_Parameter TRACE
+syn keyword upstreamdat_Parameter TRANSLATE
+syn keyword upstreamdat_Parameter ULTRACOMP
+syn keyword upstreamdat_Parameter ULTREG
+syn keyword upstreamdat_Parameter ULTUPD
+syn keyword upstreamdat_Parameter UNCMACHINEALIAS
+syn keyword upstreamdat_Parameter UNCMACHINEALIAS
+syn keyword upstreamdat_Parameter USEALEBRA
+syn keyword upstreamdat_Parameter USECONTROLFILE
+syn keyword upstreamdat_Parameter USEGID
+syn keyword upstreamdat_Parameter USERID
+syn keyword upstreamdat_Parameter USEUID
+syn keyword upstreamdat_Parameter USNOUIDGIDERRORS
+syn keyword upstreamdat_Parameter UTF8
+syn keyword upstreamdat_Parameter VAULTNUMBER
+syn keyword upstreamdat_Parameter VERSIONDATE
+syn keyword upstreamdat_Parameter WRITESPARSE
+syn keyword upstreamdat_Parameter XFERECORDSIZE
+syn keyword upstreamdat_Parameter XFERRECSEP
+syn keyword upstreamdat_Parameter XFERRECUSECR
+
+" File Specs:
+syn match upstreamdat_Filespec /file spec\c \d\{1,3}.*/
+
+" Comments:
+syn match upstreamdat_Comment /^#.*/
+
+hi def link upstreamdat_Parameter Type
+"hi def link upstreamdat_Filespec Underlined
+hi def link upstreamdat_Comment Comment
+
+let b:current_syntax = "upstreamdat"
diff --git a/runtime/syntax/upstreaminstalllog.vim b/runtime/syntax/upstreaminstalllog.vim
new file mode 100644
index 0000000..fb23fdc
--- /dev/null
+++ b/runtime/syntax/upstreaminstalllog.vim
@@ -0,0 +1,27 @@
+" Vim syntax file
+" Language: Innovation Data Processing UPSTREAMInstall.log file
+" Maintainer: Rob Owens <rowens@fdrinnovation.com>
+" Latest Revision: 2013-06-17
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Date:
+syn match upstreaminstalllog_Date /\u\l\l \u\l\l\s\{1,2}\d\{1,2} \d\d:\d\d:\d\d \d\d\d\d/
+" Msg Types:
+syn match upstreaminstalllog_MsgD /Msg #MSI\d\{4,5}D/
+syn match upstreaminstalllog_MsgE /Msg #MSI\d\{4,5}E/
+syn match upstreaminstalllog_MsgI /Msg #MSI\d\{4,5}I/
+syn match upstreaminstalllog_MsgW /Msg #MSI\d\{4,5}W/
+" IP Address:
+syn match upstreaminstalllog_IPaddr / \d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/
+
+hi def link upstreaminstalllog_Date Underlined
+hi def link upstreaminstalllog_MsgD Type
+hi def link upstreaminstalllog_MsgE Error
+hi def link upstreaminstalllog_MsgW Constant
+hi def link upstreaminstalllog_IPaddr Identifier
+
+let b:current_syntax = "upstreaminstalllog"
diff --git a/runtime/syntax/upstreamlog.vim b/runtime/syntax/upstreamlog.vim
new file mode 100644
index 0000000..1439bdf
--- /dev/null
+++ b/runtime/syntax/upstreamlog.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" Language: Innovation Data Processing upstream.log file
+" Maintainer: Rob Owens <rowens@fdrinnovation.com>
+" Latest Revision: 2013-09-19
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Date:
+syn match upstreamlog_Date /\u\l\l \u\l\l\s\{1,2}\d\{1,2} \d\d:\d\d:\d\d \d\d\d\d/
+" Msg Types:
+syn match upstreamlog_MsgD /Msg #\(Agt\|PC\|Srv\)\d\{4,5}D/ nextgroup=upstreamlog_Process skipwhite
+syn match upstreamlog_MsgE /Msg #\(Agt\|PC\|Srv\)\d\{4,5}E/ nextgroup=upstreamlog_Process skipwhite
+syn match upstreamlog_MsgI /Msg #\(Agt\|PC\|Srv\)\d\{4,5}I/ nextgroup=upstreamlog_Process skipwhite
+syn match upstreamlog_MsgW /Msg #\(Agt\|PC\|Srv\)\d\{4,5}W/ nextgroup=upstreamlog_Process skipwhite
+" Processes:
+syn region upstreamlog_Process start="(" end=")" contained
+" IP Address:
+syn match upstreamlog_IPaddr /\( \|(\)\zs\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/
+" Profile:
+syn match upstreamlog_Profile /Using default configuration for profile \zs\S\{1,8}\ze/
+syn match upstreamlog_Profile /Now running profile \zs\S\{1,8}\ze/
+syn match upstreamlog_Profile /in profile set \zs\S\{1,8}\ze/
+syn match upstreamlog_Profile /Migrate disk backup from profile \zs\S\{1,8}\ze/
+syn match upstreamlog_Profile /Profileset=\zs\S\{1,8}\ze,/
+syn match upstreamlog_Profile /Vault \(disk\|tape\) backup to vault \d\{1,4} from profile \zs\S\{1,8}\ze/
+syn match upstreamlog_Profile /Profile name \zs\"\S\{1,8}\"/
+syn match upstreamlog_Profile / Profile: \zs\S\{1,8}/
+syn match upstreamlog_Profile / Profile: \zs\S\{1,8}\ze, /
+syn match upstreamlog_Profile /, profile: \zs\S\{1,8}\ze,/
+syn match upstreamlog_Profile /found Profile: \zs\S\{1,8}\ze,/
+syn match upstreamlog_Profile /Backup Profile: \zs\S\{1,8}\ze Version date/
+syn match upstreamlog_Profile /Backup profile: \zs\S\{1,8}\ze Version date/
+syn match upstreamlog_Profile /Full of \zs\S\{1,8}\ze$/
+syn match upstreamlog_Profile /Incr. of \zs\S\{1,8}\ze$/
+syn match upstreamlog_Profile /Profile=\zs\S\{1,8}\ze,/
+" Target:
+syn region upstreamlog_Target start="Computer: \zs" end="\ze[\]\)]"
+syn region upstreamlog_Target start="Computer name \zs\"" end="\"\ze"
+syn region upstreamlog_Target start="request to registered name \zs" end=" "
+
+
+hi def link upstreamlog_Date Underlined
+hi def link upstreamlog_MsgD Type
+hi def link upstreamlog_MsgE Error
+hi def link upstreamlog_MsgW Constant
+hi def link upstreamlog_Process Statement
+hi def link upstreamlog_IPaddr Identifier
+hi def link upstreamlog_Profile Identifier
+hi def link upstreamlog_Target Identifier
+
+let b:current_syntax = "upstreamlog"
diff --git a/runtime/syntax/upstreamrpt.vim b/runtime/syntax/upstreamrpt.vim
new file mode 100644
index 0000000..21c2563
--- /dev/null
+++ b/runtime/syntax/upstreamrpt.vim
@@ -0,0 +1,310 @@
+" Vim syntax file
+" Language: Innovation Data Processing upstream.rpt file
+" Maintainer: Rob Owens <rowens@fdrinnovation.com>
+" Latest Revision: 2014-03-13
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+setlocal foldmethod=syntax
+
+" Parameters:
+syn keyword upstreamdat_Parameter ACCEPTPCREMOTE
+syn keyword upstreamdat_Parameter ACCEPTREMOTE
+syn keyword upstreamdat_Parameter ACTION
+syn keyword upstreamdat_Parameter ACTIVATEONENTRY
+syn keyword upstreamdat_Parameter ARCHIVEBIT
+syn keyword upstreamdat_Parameter ARCHIVEBIT
+syn keyword upstreamdat_Parameter ASCTOEBC
+syn keyword upstreamdat_Parameter ASRBACKUP
+syn keyword upstreamdat_Parameter ATTENDED
+syn keyword upstreamdat_Parameter AUTHORITATIVE
+syn keyword upstreamdat_Parameter AUTHORITATIVERESTORE
+syn keyword upstreamdat_Parameter AUTHORITATIVERESTORE
+syn keyword upstreamdat_Parameter BACKUPPROFILE
+syn keyword upstreamdat_Parameter BACKUPPROFILE2
+syn keyword upstreamdat_Parameter BACKUPREPARSEFILES
+syn keyword upstreamdat_Parameter BACKUPREPARSEFILES
+syn keyword upstreamdat_Parameter BACKUPVERIFY
+syn keyword upstreamdat_Parameter BLANKTRUNC
+syn keyword upstreamdat_Parameter CALCDASDSIZE
+syn keyword upstreamdat_Parameter CHANGEDIRATTRIBS
+syn keyword upstreamdat_Parameter CHANGEDIRATTRIBS
+syn keyword upstreamdat_Parameter COMPRESSLEVEL
+syn keyword upstreamdat_Parameter CONTROLFILE
+syn keyword upstreamdat_Parameter DASDOVERRIDE
+syn keyword upstreamdat_Parameter DATELIMIT
+syn keyword upstreamdat_Parameter DATELIMIT
+syn keyword upstreamdat_Parameter DAYSOLD
+syn keyword upstreamdat_Parameter DAYSOLD
+syn keyword upstreamdat_Parameter DELETED
+syn keyword upstreamdat_Parameter DELETED
+syn keyword upstreamdat_Parameter DELETEPROMPTS
+syn keyword upstreamdat_Parameter DELETEPROMPTS
+syn keyword upstreamdat_Parameter DESTINATION
+syn keyword upstreamdat_Parameter DESTINATION
+syn keyword upstreamdat_Parameter DIRDELETE
+syn keyword upstreamdat_Parameter DIRECTORVMC
+syn keyword upstreamdat_Parameter DIRONLYRESTOREOK
+syn keyword upstreamdat_Parameter DIRSONLY
+syn keyword upstreamdat_Parameter DIRSONLY
+syn keyword upstreamdat_Parameter DISASTERRECOVERY
+syn keyword upstreamdat_Parameter DISPLAY
+syn keyword upstreamdat_Parameter DRIVEALIAS
+syn keyword upstreamdat_Parameter DRIVEALIAS
+syn keyword upstreamdat_Parameter DUALCOPY
+syn keyword upstreamdat_Parameter DUPDAYS
+syn keyword upstreamdat_Parameter DUPLICATE
+syn keyword upstreamdat_Parameter EBCTOASC
+syn keyword upstreamdat_Parameter ENCRYPT
+syn keyword upstreamdat_Parameter ENCRYPTLEVEL
+syn keyword upstreamdat_Parameter EXCLUDELISTNAME
+syn keyword upstreamdat_Parameter FAILBACKUPONERROR
+syn keyword upstreamdat_Parameter FAILBACKUPONERROR
+syn keyword upstreamdat_Parameter FAILIFNOFILES
+syn keyword upstreamdat_Parameter FAILIFNOFILES
+syn keyword upstreamdat_Parameter FAILIFSKIP
+syn keyword upstreamdat_Parameter FAILJOB
+syn keyword upstreamdat_Parameter FAILRESTOREONERROR
+syn keyword upstreamdat_Parameter FAILRESTOREONERROR
+syn keyword upstreamdat_Parameter FILEDATE
+syn keyword upstreamdat_Parameter FILEDATE
+syn keyword upstreamdat_Parameter FILEDELETE
+syn keyword upstreamdat_Parameter FILEDELETE
+syn keyword upstreamdat_Parameter FILES
+syn keyword upstreamdat_Parameter FILES
+syn keyword upstreamdat_Parameter FILESOPENFORUPDAT
+syn keyword upstreamdat_Parameter FILESOPENFORUPDAT
+syn keyword upstreamdat_Parameter FILETRANSFER
+syn keyword upstreamdat_Parameter GETREMOTEFILES
+syn keyword upstreamdat_Parameter HARDLINKDB
+syn keyword upstreamdat_Parameter HARDLINKS
+syn keyword upstreamdat_Parameter HARDLINKS
+syn keyword upstreamdat_Parameter HIDDENFILES
+syn keyword upstreamdat_Parameter HIDDENFILES
+syn keyword upstreamdat_Parameter HOLDTAPE
+syn keyword upstreamdat_Parameter HOLDUSERDIRS
+syn keyword upstreamdat_Parameter HOSTFILENAME
+syn keyword upstreamdat_Parameter HOSTRECORD
+syn keyword upstreamdat_Parameter HOSTSORT
+syn keyword upstreamdat_Parameter IGNOREPLUGINSFORRESTORE
+syn keyword upstreamdat_Parameter INCRDB
+syn keyword upstreamdat_Parameter INCRDBARCHIVEBIT
+syn keyword upstreamdat_Parameter INCRDBDELETEDFILES
+syn keyword upstreamdat_Parameter INCREMENTAL
+syn keyword upstreamdat_Parameter INCREMENTAL
+syn keyword upstreamdat_Parameter INQOPTIONS
+syn keyword upstreamdat_Parameter INSTALLWIN2KAGENT
+syn keyword upstreamdat_Parameter INSTALLWIN2KAGENT
+syn keyword upstreamdat_Parameter JOBOPTIONS
+syn keyword upstreamdat_Parameter JOBRETURNCODEMAP
+syn keyword upstreamdat_Parameter JOBWAITTIMELIMIT
+syn keyword upstreamdat_Parameter KEEPALIVE
+syn keyword upstreamdat_Parameter LANINTERFACE
+syn keyword upstreamdat_Parameter LANWSNAME
+syn keyword upstreamdat_Parameter LANWSPASSWORD
+syn keyword upstreamdat_Parameter LASTACCESS
+syn keyword upstreamdat_Parameter LASTACCESS
+syn keyword upstreamdat_Parameter LATESTDATE
+syn keyword upstreamdat_Parameter LATESTDATE
+syn keyword upstreamdat_Parameter LATESTTIME
+syn keyword upstreamdat_Parameter LATESTTIME
+syn keyword upstreamdat_Parameter LATESTVERSION
+syn keyword upstreamdat_Parameter LINEBLOCK
+syn keyword upstreamdat_Parameter LINETRUNC
+syn keyword upstreamdat_Parameter LISTENFORREMOTE
+syn keyword upstreamdat_Parameter LOCALBACKUP
+syn keyword upstreamdat_Parameter LOCALBACKUPDIR
+syn keyword upstreamdat_Parameter LOCALBACKUPMAX
+syn keyword upstreamdat_Parameter LOCALBACKUPMAXFILESIZE
+syn keyword upstreamdat_Parameter LOCALBACKUPMAXSIZE
+syn keyword upstreamdat_Parameter LOCALEXCLUDEFILE
+syn keyword upstreamdat_Parameter LOCALPARAMETERS
+syn keyword upstreamdat_Parameter LOCALPASSWORD
+syn keyword upstreamdat_Parameter LOCALRESTORE
+syn keyword upstreamdat_Parameter LOCALUSER
+syn keyword upstreamdat_Parameter LOFS
+syn keyword upstreamdat_Parameter LOGNONFATAL
+syn keyword upstreamdat_Parameter MAXBACKUPFILESFAIL
+syn keyword upstreamdat_Parameter MAXBACKUPTIME
+syn keyword upstreamdat_Parameter MAXDUPS
+syn keyword upstreamdat_Parameter MAXFILENAMESIZE
+syn keyword upstreamdat_Parameter MAXKFILESIZE
+syn keyword upstreamdat_Parameter MAXLOGDAYS
+syn keyword upstreamdat_Parameter MAXRESTOREFILESFAIL
+syn keyword upstreamdat_Parameter MAXRESTORETIME
+syn keyword upstreamdat_Parameter MAXRETRY
+syn keyword upstreamdat_Parameter MAXRPTDAYS
+syn keyword upstreamdat_Parameter MERGE
+syn keyword upstreamdat_Parameter MIGRBITS
+syn keyword upstreamdat_Parameter MIGRBITS
+syn keyword upstreamdat_Parameter MINCOMPRESSSIZE
+syn keyword upstreamdat_Parameter MINIMIZE
+syn keyword upstreamdat_Parameter MODIFYFILE
+syn keyword upstreamdat_Parameter MOUNTPOINTS
+syn keyword upstreamdat_Parameter MOUNTPOINTS
+syn keyword upstreamdat_Parameter NDS
+syn keyword upstreamdat_Parameter NDS
+syn keyword upstreamdat_Parameter NEWFILECOMPARE
+syn keyword upstreamdat_Parameter NFSBELOW
+syn keyword upstreamdat_Parameter NODATAOK
+syn keyword upstreamdat_Parameter NODIRFORINCREMENTAL
+syn keyword upstreamdat_Parameter NODIRFORINCREMENTAL
+syn keyword upstreamdat_Parameter NONFILEDATABITMAP
+syn keyword upstreamdat_Parameter NONFILEDATABITMAP
+syn keyword upstreamdat_Parameter NOPOINTRESTORE
+syn keyword upstreamdat_Parameter NOSPECINHERITANCE
+syn keyword upstreamdat_Parameter NOTIFYEVENTS
+syn keyword upstreamdat_Parameter NOTIFYFAILUREATTACHMENT
+syn keyword upstreamdat_Parameter NOTIFYSUCCESSATTACHMENT
+syn keyword upstreamdat_Parameter NOTIFYTARGETS
+syn keyword upstreamdat_Parameter NOUIDGIDNAMES
+syn keyword upstreamdat_Parameter NOUIDGIDNAMES
+syn keyword upstreamdat_Parameter NOVELLMIGRATE
+syn keyword upstreamdat_Parameter NOVELLMIGRATE
+syn keyword upstreamdat_Parameter NOVELLMIGRATEADDEXT
+syn keyword upstreamdat_Parameter NOVELLMIGRATEADDEXT
+syn keyword upstreamdat_Parameter NOVELLPROFILE
+syn keyword upstreamdat_Parameter NOVELLRECALL
+syn keyword upstreamdat_Parameter NTFSADDPERMISSION
+syn keyword upstreamdat_Parameter NTFSADDPERMISSION
+syn keyword upstreamdat_Parameter NTREGRESTORE
+syn keyword upstreamdat_Parameter OSTYPE
+syn keyword upstreamdat_Parameter OUTPORT
+syn keyword upstreamdat_Parameter PACKFLUSHAFTERFILE
+syn keyword upstreamdat_Parameter PACKRECSIZE
+syn keyword upstreamdat_Parameter PARAMETER
+syn keyword upstreamdat_Parameter PASSWORD
+syn keyword upstreamdat_Parameter PATHNAME
+syn keyword upstreamdat_Parameter PATHNAME
+syn keyword upstreamdat_Parameter PERFORMBITMAP
+syn keyword upstreamdat_Parameter PERFORMNUMRECORDS
+syn keyword upstreamdat_Parameter PERFORMRECORDSIZE
+syn keyword upstreamdat_Parameter PLUGIN
+syn keyword upstreamdat_Parameter PLUGIN
+syn keyword upstreamdat_Parameter PLUGINPARAMETERS
+syn keyword upstreamdat_Parameter PLUGINPARAMETERS
+syn keyword upstreamdat_Parameter POSTJOB
+syn keyword upstreamdat_Parameter PREJOB
+syn keyword upstreamdat_Parameter PRTYCLASS
+syn keyword upstreamdat_Parameter PRTYLEVEL
+syn keyword upstreamdat_Parameter RECALLCLEANUP
+syn keyword upstreamdat_Parameter RECALLOFFLINEFILES
+syn keyword upstreamdat_Parameter RECALLOFFLINEFILES
+syn keyword upstreamdat_Parameter RECORDSIZE
+syn keyword upstreamdat_Parameter REMOTEADDR
+syn keyword upstreamdat_Parameter REMOTEAPPLPREF
+syn keyword upstreamdat_Parameter REMOTEAPPLRETRY
+syn keyword upstreamdat_Parameter REMOTECONNECTTYPE
+syn keyword upstreamdat_Parameter REMOTEFLAGS
+syn keyword upstreamdat_Parameter REMOTEIPADAPTER
+syn keyword upstreamdat_Parameter REMOTELOCALPARAMETERS
+syn keyword upstreamdat_Parameter REMOTELOGMODE
+syn keyword upstreamdat_Parameter REMOTELUNAME
+syn keyword upstreamdat_Parameter REMOTEMAXRETRIES
+syn keyword upstreamdat_Parameter REMOTEMODENAME
+syn keyword upstreamdat_Parameter REMOTEPARAMETERFILE
+syn keyword upstreamdat_Parameter REMOTEPORT
+syn keyword upstreamdat_Parameter REMOTEREQUEST
+syn keyword upstreamdat_Parameter REMOTERESTART
+syn keyword upstreamdat_Parameter REMOTEROUTE
+syn keyword upstreamdat_Parameter REMOTETARGETNAME
+syn keyword upstreamdat_Parameter REMOTETCP
+syn keyword upstreamdat_Parameter REMOTETIMEOUT
+syn keyword upstreamdat_Parameter REMOTETMAXRETRY
+syn keyword upstreamdat_Parameter REMOTETPN
+syn keyword upstreamdat_Parameter REMOTEUSAPPL
+syn keyword upstreamdat_Parameter REMOTEVERIFY
+syn keyword upstreamdat_Parameter REMOTEWTOCOMP
+syn keyword upstreamdat_Parameter REPORTNAME
+syn keyword upstreamdat_Parameter REPORTOPTIONS
+syn keyword upstreamdat_Parameter RESTARTLASTFILE
+syn keyword upstreamdat_Parameter RESTART
+syn keyword upstreamdat_Parameter RESTARTTYPE
+syn keyword upstreamdat_Parameter RESTARTVERSIONDATE
+syn keyword upstreamdat_Parameter RESTOREARCHIVEBIT
+syn keyword upstreamdat_Parameter RESTORECHECKPOINT
+syn keyword upstreamdat_Parameter RESTOREDATELIMIT
+syn keyword upstreamdat_Parameter RESTOREDATELIMIT
+syn keyword upstreamdat_Parameter RESTOREFILEFAIL
+syn keyword upstreamdat_Parameter RESTOREMOUNTPOINTS
+syn keyword upstreamdat_Parameter RESTOREMOUNTPOINTS
+syn keyword upstreamdat_Parameter RESTORESEGMENTS
+syn keyword upstreamdat_Parameter RESTORESEGMENTS
+syn keyword upstreamdat_Parameter RESTORETODIFFFS
+syn keyword upstreamdat_Parameter RETAIN
+syn keyword upstreamdat_Parameter RETAIN
+syn keyword upstreamdat_Parameter ROOTENTRY
+syn keyword upstreamdat_Parameter ROOTENTRY
+syn keyword upstreamdat_Parameter SAN
+syn keyword upstreamdat_Parameter SCHEDULENAME
+syn keyword upstreamdat_Parameter SEGMENTEDFILESIZE
+syn keyword upstreamdat_Parameter SEGMENTEDFILESIZE
+syn keyword upstreamdat_Parameter SEGMENTSIZE
+syn keyword upstreamdat_Parameter SEGMENTSIZE
+syn keyword upstreamdat_Parameter SENDHOSTDETAILS
+syn keyword upstreamdat_Parameter SINGLEFS
+syn keyword upstreamdat_Parameter SIZETRC
+syn keyword upstreamdat_Parameter SKIP
+syn keyword upstreamdat_Parameter SKIPBACKUPSCAN
+syn keyword upstreamdat_Parameter SKIPOLD
+syn keyword upstreamdat_Parameter SKIPOLD
+syn keyword upstreamdat_Parameter SMSTARGETSERVICENAME
+syn keyword upstreamdat_Parameter SMSTSA
+syn keyword upstreamdat_Parameter SOLO
+syn keyword upstreamdat_Parameter SORTBACKUP
+syn keyword upstreamdat_Parameter SOSDISK
+syn keyword upstreamdat_Parameter SOSDISK
+syn keyword upstreamdat_Parameter SOSTIMESTAMP
+syn keyword upstreamdat_Parameter SOSTIMESTAMP
+syn keyword upstreamdat_Parameter SOSTIMESTAMPPATH
+syn keyword upstreamdat_Parameter SOSTIMESTAMPPATH
+syn keyword upstreamdat_Parameter SPECNUMBER
+syn keyword upstreamdat_Parameter SPECNUMBER
+syn keyword upstreamdat_Parameter SPECTYPE
+syn keyword upstreamdat_Parameter SPECTYPE
+syn keyword upstreamdat_Parameter STARTTIME
+syn keyword upstreamdat_Parameter STORAGETYPE
+syn keyword upstreamdat_Parameter SUBDIRECTORIES
+syn keyword upstreamdat_Parameter SUBDIRECTORIES
+syn keyword upstreamdat_Parameter SWITCHTOTAPEMB
+syn keyword upstreamdat_Parameter TCPADDRESS
+syn keyword upstreamdat_Parameter TCPTIMEOUT
+syn keyword upstreamdat_Parameter TIMEOVERRIDE
+syn keyword upstreamdat_Parameter TRACE
+syn keyword upstreamdat_Parameter TRANSLATE
+syn keyword upstreamdat_Parameter ULTRACOMP
+syn keyword upstreamdat_Parameter ULTREG
+syn keyword upstreamdat_Parameter ULTUPD
+syn keyword upstreamdat_Parameter UNCMACHINEALIAS
+syn keyword upstreamdat_Parameter UNCMACHINEALIAS
+syn keyword upstreamdat_Parameter USEALEBRA
+syn keyword upstreamdat_Parameter USECONTROLFILE
+syn keyword upstreamdat_Parameter USEGID
+syn keyword upstreamdat_Parameter USERID
+syn keyword upstreamdat_Parameter USEUID
+syn keyword upstreamdat_Parameter USNOUIDGIDERRORS
+syn keyword upstreamdat_Parameter UTF8
+syn keyword upstreamdat_Parameter VAULTNUMBER
+syn keyword upstreamdat_Parameter VERSIONDATE
+syn keyword upstreamdat_Parameter WRITESPARSE
+syn keyword upstreamdat_Parameter XFERECORDSIZE
+syn keyword upstreamdat_Parameter XFERRECSEP
+syn keyword upstreamdat_Parameter XFERRECUSECR
+
+" File Specs:
+syn match upstreamdat_Filespec /file spec\c \d\{1,3}.*/
+
+" Comments:
+syn match upstreamdat_Comment /^#.*/
+
+" List Of Parameters:
+syn region upstreamdat_Parms start="Current Parameters:" end="End Of Parameters" transparent fold
+
+hi def link upstreamdat_Parameter Type
+"hi def link upstreamdat_Filespec Underlined
+hi def link upstreamdat_Comment Comment
+
+let b:current_syntax = "upstreamrpt"
diff --git a/runtime/syntax/usserverlog.vim b/runtime/syntax/usserverlog.vim
new file mode 100644
index 0000000..34a7e3d
--- /dev/null
+++ b/runtime/syntax/usserverlog.vim
@@ -0,0 +1,60 @@
+" Vim syntax file
+" Language: Innovation Data Processing usserver.log file
+" Maintainer: Rob Owens <rowens@fdrinnovation.com>
+" Latest Revision: 2013-09-19
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Date:
+syn match usserverlog_Date /\u\l\l \u\l\l\s\{1,2}\d\{1,2} \d\d:\d\d:\d\d \d\d\d\d/
+" Msg Types:
+syn match usserverlog_MsgD /Msg #\(Agt\|PC\|Srv\)\d\{4,5}D/ nextgroup=usserverlog_Process skipwhite
+syn match usserverlog_MsgE /Msg #\(Agt\|PC\|Srv\)\d\{4,5}E/ nextgroup=usserverlog_Process skipwhite
+syn match usserverlog_MsgI /Msg #\(Agt\|PC\|Srv\)\d\{4,5}I/ nextgroup=usserverlog_Process skipwhite
+syn match usserverlog_MsgW /Msg #\(Agt\|PC\|Srv\)\d\{4,5}W/ nextgroup=usserverlog_Process skipwhite
+" Processes:
+syn region usserverlog_Process start="(" end=")" contained
+" IP Address:
+syn match usserverlog_IPaddr /\( \|(\)\zs\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/
+" Profile:
+syn match usserverlog_Profile /Using default configuration for profile \zs\S\{1,8}\ze/
+syn match usserverlog_Profile /Now running profile \zs\S\{1,8}\ze/
+syn match usserverlog_Profile /in profile set \zs\S\{1,8}\ze/
+syn match usserverlog_Profile /Migrate disk backup from profile \zs\S\{1,8}\ze/
+syn match usserverlog_Profile /Using profile prefix for profile \zs\S\{1,8}\ze/
+syn match usserverlog_Profile /Add\/update profile \zs\S\{1,8}\ze/
+syn match usserverlog_Profile /Profileset=\zs\S\{1,8}\ze,/
+syn match usserverlog_Profile /profileset=\zs\S\{1,8}\ze/
+syn match usserverlog_Profile /Vault \(disk\|tape\) backup to vault \d\{1,4} from profile \zs\S\{1,8}\ze/
+syn match usserverlog_Profile /Profile name \zs\"\S\{1,8}\"/
+syn match usserverlog_Profile / Profile: \zs\S\{1,8}/
+syn match usserverlog_Profile / Profile: \zs\S\{1,8}\ze, /
+syn match usserverlog_Profile /, profile: \zs\S\{1,8}\ze,/
+syn match usserverlog_Profile /Expecting Profile: \zs\S\{1,8}\ze,/
+syn match usserverlog_Profile /found Profile: \zs\S\{1,8}\ze,/
+syn match usserverlog_Profile /Profile \zs\S\{1,8} \zeis a member of group: /
+syn match upstreamlog_Profile /Backup Profile: \zs\S\{1,8}\ze Version date/
+syn match upstreamlog_Profile /Backup profile: \zs\S\{1,8}\ze Version date/
+syn match usserverlog_Profile /Full of \zs\S\{1,8}\ze$/
+syn match usserverlog_Profile /Incr. of \zs\S\{1,8}\ze$/
+syn match usserverlog_Profile /Profile=\zs\S\{1,8}\ze,/
+" Target:
+syn region usserverlog_Target start="Computer: \zs" end="\ze[\]\)]"
+syn region usserverlog_Target start="Computer name \zs\"" end="\"\ze"
+syn region usserverlog_Target start="Registration add request successful \zs" end="$"
+syn region usserverlog_Target start="request to registered name \zs" end=" "
+syn region usserverlog_Target start=", sending to \zs" end="$"
+
+hi def link usserverlog_Date Underlined
+hi def link usserverlog_MsgD Type
+hi def link usserverlog_MsgE Error
+hi def link usserverlog_MsgW Constant
+hi def link usserverlog_Process Statement
+hi def link usserverlog_IPaddr Identifier
+hi def link usserverlog_Profile Identifier
+hi def link usserverlog_Target Identifier
+
+let b:current_syntax = "usserverlog"
diff --git a/runtime/syntax/usw2kagtlog.vim b/runtime/syntax/usw2kagtlog.vim
new file mode 100644
index 0000000..a112340
--- /dev/null
+++ b/runtime/syntax/usw2kagtlog.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" Language: Innovation Data Processing USW2KAgt.log file
+" Maintainer: Rob Owens <rowens@fdrinnovation.com>
+" Latest Revision: 2014-04-01
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Date:
+syn match usw2kagtlog_Date /\u\l\l \u\l\l\s\{1,2}\d\{1,2} \d\d:\d\d:\d\d \d\d\d\d/
+" Msg Types:
+syn match usw2kagtlog_MsgD /Msg #\(Agt\|PC\|Srv\)\d\{4,5}D/ nextgroup=usw2kagtlog_Process skipwhite
+syn match usw2kagtlog_MsgE /Msg #\(Agt\|PC\|Srv\)\d\{4,5}E/ nextgroup=usw2kagtlog_Process skipwhite
+syn match usw2kagtlog_MsgI /Msg #\(Agt\|PC\|Srv\)\d\{4,5}I/ nextgroup=usw2kagtlog_Process skipwhite
+syn match usw2kagtlog_MsgW /Msg #\(Agt\|PC\|Srv\)\d\{4,5}W/ nextgroup=usw2kagtlog_Process skipwhite
+" Processes:
+syn region usw2kagtlog_Process start="(" end=")" contained
+"syn region usw2kagtlog_Process start="Starting the processing for a \zs\"" end="\ze client request"
+"syn region usw2kagtlog_Process start="Ending the processing for a \zs\"" end="\ze client request"
+"syn region usw2kagtlog_Process start="Starting the processing for a \zs\"" end="\ze client\s\{0,1}\r\{0,1}\s\{1,9}request"
+"syn region usw2kagtlog_Process start="Ending the processing for a \zs\"" end="\ze client\s\{0,1}\r\{0,1}\s\{1,9}request"
+syn region usw2kagtlog_Process start="Starting the processing for a \zs\"" end="\ze client"
+syn region usw2kagtlog_Process start="Ending the processing for a \zs\"" end="\ze client"
+" IP Address:
+syn match usw2kagtlog_IPaddr / \d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}/
+" Profile:
+
+syn match usw2kagtlog_Profile /Profile name \zs\"\S\{1,8}\"/
+syn match usw2kagtlog_Profile / Profile: \zs\S\{1,8}/
+syn match usw2kagtlog_Profile / Profile: \zs\S\{1,8}\ze, /
+syn match upstreamlog_Profile /Backup Profile: \zs\S\{1,8}\ze Version date/
+syn match upstreamlog_Profile /Backup profile: \zs\S\{1,8}\ze Version date/
+syn match usw2kagtlog_Profile /Full of \zs\S\{1,8}\ze$/
+syn match usw2kagtlog_Profile /Incr. of \zs\S\{1,8}\ze$/
+syn match usw2kagtlog_Profile /profile name "\zs\S\{1,8}\ze"/
+" Target:
+syn region usw2kagtlog_Target start="Computer: \zs" end="\ze[\]\)]"
+syn region usw2kagtlog_Target start="Computer name \zs\"" end="\"\ze"
+" Agent Keywords:
+syn keyword usw2kagtlog_Agentword opened closed
+
+hi def link usw2kagtlog_Date Underlined
+hi def link usw2kagtlog_MsgD Type
+hi def link usw2kagtlog_MsgE Error
+hi def link usw2kagtlog_MsgW Constant
+hi def link usw2kagtlog_Process Statement
+hi def link usw2kagtlog_IPaddr Identifier
+hi def link usw2kagtlog_Profile Identifier
+hi def link usw2kagtlog_Target Identifier
+hi def link usw2kagtlog_Agentword Special
+
+let b:current_syntax = "usw2kagentlog"
diff --git a/runtime/syntax/valgrind.vim b/runtime/syntax/valgrind.vim
new file mode 100644
index 0000000..a9b4a8c
--- /dev/null
+++ b/runtime/syntax/valgrind.vim
@@ -0,0 +1,110 @@
+" Vim syntax file
+" Language: Valgrind Memory Debugger Output
+" Maintainer: Roger Luethi <rl@hellgate.ch>
+" Program URL: http://devel-home.kde.org/~sewardj/
+" Last Change: 2019 Jul 24
+"
+" Notes: mostly based on strace.vim and xml.vim
+"
+" Contributors: Christoph Gysin <christoph.gysin@gmail.com>
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" Lines can be long with demangled c++ functions.
+setlocal synmaxcol=8000
+
+syn case match
+syn sync minlines=50
+
+syn match valgrindSpecLine "^[+-]\{2}\d\+[+-]\{2}.*$"
+
+syn region valgrindRegion
+ \ start=+^==\z(\d\+\)== \w.*$+
+ \ skip=+^==\z1==\( \| .*\| \S.*\)$+
+ \ end=+^+
+ \ fold
+ \ keepend
+ \ contains=valgrindPidChunk,valgrindLine
+
+syn region valgrindPidChunk
+ \ start=+^==\zs+
+ \ end=+\ze==+
+ \ contained
+ \ contains=valgrindPid0,valgrindPid1,valgrindPid2,valgrindPid3,valgrindPid4,valgrindPid5,valgrindPid6,valgrindPid7,valgrindPid8,valgrindPid9
+ \ keepend
+
+syn match valgrindPid0 "\d\+0=" contained
+syn match valgrindPid1 "\d\+1=" contained
+syn match valgrindPid2 "\d\+2=" contained
+syn match valgrindPid3 "\d\+3=" contained
+syn match valgrindPid4 "\d\+4=" contained
+syn match valgrindPid5 "\d\+5=" contained
+syn match valgrindPid6 "\d\+6=" contained
+syn match valgrindPid7 "\d\+7=" contained
+syn match valgrindPid8 "\d\+8=" contained
+syn match valgrindPid9 "\d\+9=" contained
+
+syn region valgrindLine
+ \ start=+\(^==\d\+== \)\@<=+
+ \ end=+$+
+ \ keepend
+ \ contained
+ \ contains=valgrindOptions,valgrindMsg,valgrindLoc
+
+syn match valgrindOptions "[ ]\{3}-.*$" contained
+
+syn match valgrindMsg "\S.*$" contained
+ \ contains=valgrindError,valgrindNote,valgrindSummary
+syn match valgrindError "\(Invalid\|\d\+ errors\|.* definitely lost\).*$" contained
+syn match valgrindNote ".*still reachable.*" contained
+syn match valgrindSummary ".*SUMMARY:" contained
+
+syn match valgrindLoc "\s\+\(by\|at\|Address\).*$" contained
+ \ contains=valgrindAt,valgrindAddr,valgrindFunc,valgrindBin,valgrindSrc
+syn match valgrindAt "at\s\@=" contained
+syn match valgrindAddr "\W\zs0x\x\+" contained
+
+syn match valgrindFunc ": \zs\h[a-zA-Z0-9_:\[\]()<>&*+\-,=%!|^ @.]*\ze([^)]*)$" contained
+syn match valgrindBin "(\(with\)\=in \zs\S\+)\@=" contained
+syn match valgrindSrc "(\zs[^)]*:\d\+)\@=" contained
+
+" Define the default highlighting
+
+hi def link valgrindSpecLine Type
+"hi def link valgrindRegion Special
+
+hi def link valgrindPid0 Special
+hi def link valgrindPid1 Comment
+hi def link valgrindPid2 Type
+hi def link valgrindPid3 Constant
+hi def link valgrindPid4 Number
+hi def link valgrindPid5 Identifier
+hi def link valgrindPid6 Statement
+hi def link valgrindPid7 Error
+hi def link valgrindPid8 LineNr
+hi def link valgrindPid9 Normal
+"hi def link valgrindLine Special
+
+hi def link valgrindOptions Type
+"hi def link valgrindMsg Special
+"hi def link valgrindLoc Special
+
+hi def link valgrindError Special
+hi def link valgrindNote Comment
+hi def link valgrindSummary Type
+
+hi def link valgrindAt Special
+hi def link valgrindAddr Number
+hi def link valgrindFunc Type
+hi def link valgrindBin Comment
+hi def link valgrindSrc Statement
+
+let b:current_syntax = "valgrind"
+
+let &cpo = s:keepcpo
+unlet s:keepcpo
diff --git a/runtime/syntax/vb.vim b/runtime/syntax/vb.vim
new file mode 100644
index 0000000..607f613
--- /dev/null
+++ b/runtime/syntax/vb.vim
@@ -0,0 +1,375 @@
+" Vim syntax file
+" Language: Visual Basic
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Former Maintainer: Tim Chase <vb.vim@tim.thechases.com>
+" Former Maintainer: Robert M. Cortopassi <cortopar@mindspring.com>
+" (tried multiple times to contact, but email bounced)
+" Last Change:
+" 2021 Nov 26 Incorporated additions from Doug Kearns
+" 2005 May 25 Synched with work by Thomas Barthel
+" 2004 May 30 Added a few keywords
+
+" This was thrown together after seeing numerous requests on the
+" VIM and VIM-DEV mailing lists. It is by no means complete.
+" Send comments, suggestions and requests to the maintainer.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" VB is case insensitive
+syn case ignore
+
+syn keyword vbConditional If Then ElseIf Else Select Case
+
+syn keyword vbOperator AddressOf And ByRef ByVal Eqv Imp In
+syn keyword vbOperator Is Like Mod Not Or To Xor
+
+syn match vbOperator "[()+.,\-/*=&]"
+syn match vbOperator "[<>]=\="
+syn match vbOperator "<>"
+syn match vbOperator "\s\+_$"
+
+syn keyword vbBoolean True False
+syn keyword vbConst Null Nothing
+
+syn keyword vbRepeat Do For ForEach Loop Next
+syn keyword vbRepeat Step To Until Wend While
+
+syn keyword vbEvents AccessKeyPress Activate ActiveRowChanged
+syn keyword vbEvents AfterAddFile AfterChangeFileName AfterCloseFile
+syn keyword vbEvents AfterColEdit AfterColUpdate AfterDelete
+syn keyword vbEvents AfterInsert AfterLabelEdit AfterRemoveFile
+syn keyword vbEvents AfterUpdate AfterWriteFile AmbientChanged
+syn keyword vbEvents ApplyChanges Associate AsyncProgress
+syn keyword vbEvents AsyncReadComplete AsyncReadProgress AxisActivated
+syn keyword vbEvents AxisLabelActivated AxisLabelSelected
+syn keyword vbEvents AxisLabelUpdated AxisSelected AxisTitleActivated
+syn keyword vbEvents AxisTitleSelected AxisTitleUpdated AxisUpdated
+syn keyword vbEvents BeforeClick BeforeColEdit BeforeColUpdate
+syn keyword vbEvents BeforeConnect BeforeDelete BeforeInsert
+syn keyword vbEvents BeforeLabelEdit BeforeLoadFile BeforeUpdate
+syn keyword vbEvents BeginRequest BeginTrans ButtonClick
+syn keyword vbEvents ButtonCompleted ButtonDropDown ButtonGotFocus
+syn keyword vbEvents ButtonLostFocus CallbackKeyDown Change Changed
+syn keyword vbEvents ChartActivated ChartSelected ChartUpdated Click
+syn keyword vbEvents Close CloseQuery CloseUp ColEdit ColResize
+syn keyword vbEvents Collapse ColumnClick CommitTrans Compare
+syn keyword vbEvents ConfigChageCancelled ConfigChanged
+syn keyword vbEvents ConfigChangedCancelled Connect ConnectionRequest
+syn keyword vbEvents CurrentRecordChanged DECommandAdded
+syn keyword vbEvents DECommandPropertyChanged DECommandRemoved
+syn keyword vbEvents DEConnectionAdded DEConnectionPropertyChanged
+syn keyword vbEvents DEConnectionRemoved DataArrival DataChanged
+syn keyword vbEvents DataUpdated DateClicked DblClick Deactivate
+syn keyword vbEvents DevModeChange DeviceArrival DeviceOtherEvent
+syn keyword vbEvents DeviceQueryRemove DeviceQueryRemoveFailed
+syn keyword vbEvents DeviceRemoveComplete DeviceRemovePending
+syn keyword vbEvents Disconnect DisplayChanged Dissociate
+syn keyword vbEvents DoGetNewFileName Done DonePainting DownClick
+syn keyword vbEvents DragDrop DragOver DropDown EditProperty EditQuery
+syn keyword vbEvents EndRequest EnterCell EnterFocus ExitFocus Expand
+syn keyword vbEvents FontChanged FootnoteActivated FootnoteSelected
+syn keyword vbEvents FootnoteUpdated Format FormatSize GotFocus
+syn keyword vbEvents HeadClick HeightChanged Hide InfoMessage
+syn keyword vbEvents IniProperties InitProperties Initialize
+syn keyword vbEvents ItemActivated ItemAdded ItemCheck ItemClick
+syn keyword vbEvents ItemReloaded ItemRemoved ItemRenamed
+syn keyword vbEvents ItemSeletected KeyDown KeyPress KeyUp LeaveCell
+syn keyword vbEvents LegendActivated LegendSelected LegendUpdated
+syn keyword vbEvents LinkClose LinkError LinkExecute LinkNotify
+syn keyword vbEvents LinkOpen Load LostFocus MouseDown MouseMove
+syn keyword vbEvents MouseUp NodeCheck NodeClick OLECompleteDrag
+syn keyword vbEvents OLEDragDrop OLEDragOver OLEGiveFeedback OLESetData
+syn keyword vbEvents OLEStartDrag ObjectEvent ObjectMove OnAddNew
+syn keyword vbEvents OnComm Paint PanelClick PanelDblClick PathChange
+syn keyword vbEvents PatternChange PlotActivated PlotSelected
+syn keyword vbEvents PlotUpdated PointActivated PointLabelActivated
+syn keyword vbEvents PointLabelSelected PointLabelUpdated PointSelected
+syn keyword vbEvents PointUpdated PowerQuerySuspend PowerResume
+syn keyword vbEvents PowerStatusChanged PowerSuspend ProcessTag
+syn keyword vbEvents ProcessingTimeout QueryChangeConfig QueryClose
+syn keyword vbEvents QueryComplete QueryCompleted QueryTimeout
+syn keyword vbEvents QueryUnload ReadProperties RepeatedControlLoaded
+syn keyword vbEvents RepeatedControlUnloaded Reposition
+syn keyword vbEvents RequestChangeFileName RequestWriteFile Resize
+syn keyword vbEvents ResultsChanged RetainedProject RollbackTrans
+syn keyword vbEvents RowColChange RowCurrencyChange RowResize
+syn keyword vbEvents RowStatusChanged Scroll SelChange SelectionChanged
+syn keyword vbEvents SendComplete SendProgress SeriesActivated
+syn keyword vbEvents SeriesSelected SeriesUpdated SettingChanged Show
+syn keyword vbEvents SplitChange Start StateChanged StatusUpdate
+syn keyword vbEvents SysColorsChanged Terminate TimeChanged Timer
+syn keyword vbEvents TitleActivated TitleSelected TitleUpdated
+syn keyword vbEvents UnboundAddData UnboundDeleteRow
+syn keyword vbEvents UnboundGetRelativeBookmark UnboundReadData
+syn keyword vbEvents UnboundWriteData Unformat Unload UpClick Updated
+syn keyword vbEvents UserEvent Validate ValidationError
+syn keyword vbEvents VisibleRecordChanged WillAssociate WillChangeData
+syn keyword vbEvents WillDissociate WillExecute WillUpdateRows
+syn keyword vbEvents WriteProperties
+
+
+syn keyword vbFunction Abs Array Asc AscB AscW Atn Avg BOF CBool CByte
+syn keyword vbFunction CCur CDate CDbl CInt CLng CSng CStr CVDate CVErr
+syn keyword vbFunction CVar CallByName Cdec Choose Chr ChrB ChrW Command
+syn keyword vbFunction Cos Count CreateObject CurDir DDB Date DateAdd
+syn keyword vbFunction DateDiff DatePart DateSerial DateValue Day Dir
+syn keyword vbFunction DoEvents EOF Environ Error Exp FV FileAttr
+syn keyword vbFunction FileDateTime FileLen FilterFix Fix Format
+syn keyword vbFunction FormatCurrency FormatDateTime FormatNumber
+syn keyword vbFunction FormatPercent FreeFile GetAllStrings GetAttr
+syn keyword vbFunction GetAutoServerSettings GetObject GetSetting Hex
+syn keyword vbFunction Hour IIf IMEStatus IPmt InStr Input InputB
+syn keyword vbFunction InputBox InstrB Int IsArray IsDate IsEmpty IsError
+syn keyword vbFunction IsMissing IsNull IsNumeric IsObject Join LBound
+syn keyword vbFunction LCase LOF LTrim Left LeftB Len LenB LoadPicture
+syn keyword vbFunction LoadResData LoadResPicture LoadResString Loc Log
+syn keyword vbFunction MIRR Max Mid MidB Min Minute Month MonthName
+syn keyword vbFunction MsgBox NPV NPer Now Oct PPmt PV Partition Pmt
+syn keyword vbFunction QBColor RGB RTrim Rate Replace Right RightB Rnd
+syn keyword vbFunction Round SLN SYD Second Seek Sgn Shell Sin Space Spc
+syn keyword vbFunction Split Sqr StDev StDevP Str StrComp StrConv
+syn keyword vbFunction StrReverse String Sum Switch Tab Tan Time
+syn keyword vbFunction TimeSerial TimeValue Timer Trim TypeName UBound
+syn keyword vbFunction UCase Val Var VarP VarType Weekday WeekdayName
+syn keyword vbFunction Year
+
+syn keyword vbMethods AboutBox Accept Activate Add AddCustom AddFile
+syn keyword vbMethods AddFromFile AddFromGuid AddFromString
+syn keyword vbMethods AddFromTemplate AddItem AddNew AddToAddInToolbar
+syn keyword vbMethods AddToolboxProgID Append AppendAppendChunk
+syn keyword vbMethods AppendChunk Arrange Assert AsyncRead BatchUpdate
+syn keyword vbMethods BeginQueryEdit BeginTrans Bind BuildPath
+syn keyword vbMethods CanPropertyChange Cancel CancelAsyncRead
+syn keyword vbMethods CancelBatch CancelUpdate CaptureImage CellText
+syn keyword vbMethods CellValue Circle Clear ClearFields ClearSel
+syn keyword vbMethods ClearSelCols ClearStructure Clone Close Cls
+syn keyword vbMethods ColContaining CollapseAll ColumnSize CommitTrans
+syn keyword vbMethods CompactDatabase Compose Connect Copy CopyFile
+syn keyword vbMethods CopyFolder CopyQueryDef Count CreateDatabase
+syn keyword vbMethods CreateDragImage CreateEmbed CreateField
+syn keyword vbMethods CreateFolder CreateGroup CreateIndex CreateLink
+syn keyword vbMethods CreatePreparedStatement CreatePropery CreateQuery
+syn keyword vbMethods CreateQueryDef CreateRelation CreateTableDef
+syn keyword vbMethods CreateTextFile CreateToolWindow CreateUser
+syn keyword vbMethods CreateWorkspace Customize Cut Delete
+syn keyword vbMethods DeleteColumnLabels DeleteColumns DeleteFile
+syn keyword vbMethods DeleteFolder DeleteLines DeleteRowLabels
+syn keyword vbMethods DeleteRows DeselectAll DesignerWindow DoVerb Drag
+syn keyword vbMethods Draw DriveExists Edit EditCopy EditPaste EndDoc
+syn keyword vbMethods EnsureVisible EstablishConnection Execute Exists
+syn keyword vbMethods Expand Export ExportReport ExtractIcon Fetch
+syn keyword vbMethods FetchVerbs FileExists Files FillCache Find
+syn keyword vbMethods FindFirst FindItem FindLast FindNext FindPrevious
+syn keyword vbMethods FolderExists Forward GetAbsolutePathName
+syn keyword vbMethods GetBaseName GetBookmark GetChunk GetClipString
+syn keyword vbMethods GetData GetDrive GetDriveName GetFile GetFileName
+syn keyword vbMethods GetFirstVisible GetFolder GetFormat GetHeader
+syn keyword vbMethods GetLineFromChar GetNumTicks GetParentFolderName
+syn keyword vbMethods GetRows GetSelectedPart GetSelection
+syn keyword vbMethods GetSpecialFolder GetTempName GetText
+syn keyword vbMethods GetVisibleCount GoBack GoForward Hide HitTest
+syn keyword vbMethods HoldFields Idle Import InitializeLabels Insert
+syn keyword vbMethods InsertColumnLabels InsertColumns InsertFile
+syn keyword vbMethods InsertLines InsertObjDlg InsertRowLabels
+syn keyword vbMethods InsertRows Item Keys KillDoc Layout Line Lines
+syn keyword vbMethods LinkExecute LinkPoke LinkRequest LinkSend Listen
+syn keyword vbMethods LoadFile LoadResData LoadResPicture LoadResString
+syn keyword vbMethods LogEvent MakeCompileFile MakeCompiledFile
+syn keyword vbMethods MakeReplica MoreResults Move MoveData MoveFile
+syn keyword vbMethods MoveFirst MoveFolder MoveLast MoveNext
+syn keyword vbMethods MovePrevious NavigateTo NewPage NewPassword
+syn keyword vbMethods NextRecordset OLEDrag OnAddinsUpdate OnConnection
+syn keyword vbMethods OnDisconnection OnStartupComplete Open
+syn keyword vbMethods OpenAsTextStream OpenConnection OpenDatabase
+syn keyword vbMethods OpenQueryDef OpenRecordset OpenResultset OpenURL
+syn keyword vbMethods Overlay PSet PaintPicture PastSpecialDlg Paste
+syn keyword vbMethods PeekData Play Point PopulatePartial PopupMenu
+syn keyword vbMethods Print PrintForm PrintReport PropertyChanged Quit
+syn keyword vbMethods Raise RandomDataFill RandomFillColumns
+syn keyword vbMethods RandomFillRows ReFill Read ReadAll ReadFromFile
+syn keyword vbMethods ReadLine ReadProperty Rebind Refresh RefreshLink
+syn keyword vbMethods RegisterDatabase ReleaseInstance Reload Remove
+syn keyword vbMethods RemoveAddInFromToolbar RemoveAll RemoveItem Render
+syn keyword vbMethods RepairDatabase ReplaceLine Reply ReplyAll Requery
+syn keyword vbMethods ResetCustom ResetCustomLabel ResolveName
+syn keyword vbMethods RestoreToolbar Resync Rollback RollbackTrans
+syn keyword vbMethods RowBookmark RowContaining RowTop Save SaveAs
+syn keyword vbMethods SaveFile SaveToFile SaveToOle1File SaveToolbar
+syn keyword vbMethods Scale ScaleX ScaleY Scroll SelPrint SelectAll
+syn keyword vbMethods SelectPart Send SendData Set SetAutoServerSettings
+syn keyword vbMethods SetData SetFocus SetOption SetSelection SetSize
+syn keyword vbMethods SetText SetViewport Show ShowColor ShowFont
+syn keyword vbMethods ShowHelp ShowOpen ShowPrinter ShowSave
+syn keyword vbMethods ShowWhatsThis SignOff SignOn Size Skip SkipLine
+syn keyword vbMethods Span Split SplitContaining StartLabelEdit
+syn keyword vbMethods StartLogging Stop Synchronize Tag TextHeight
+syn keyword vbMethods TextWidth ToDefaults Trace TwipsToChartPart
+syn keyword vbMethods TypeByChartType URLFor Update UpdateControls
+syn keyword vbMethods UpdateRecord UpdateRow Upto ValidateControls Value
+syn keyword vbMethods WhatsThisMode Write WriteBlankLines WriteLine
+syn keyword vbMethods WriteProperty WriteTemplate ZOrder
+syn keyword vbMethods rdoCreateEnvironment rdoRegisterDataSource
+
+syn keyword vbStatement Alias AppActivate As Base Beep Begin Call ChDir
+syn keyword vbStatement ChDrive Close Const Date Declare DefBool DefByte
+syn keyword vbStatement DefCur DefDate DefDbl DefDec DefInt DefLng DefObj
+syn keyword vbStatement DefSng DefStr DefVar Deftype DeleteSetting Dim Do
+syn keyword vbStatement Each ElseIf End Enum Erase Error Event Exit
+syn keyword vbStatement Explicit FileCopy For ForEach Function Get GoSub
+syn keyword vbStatement GoTo Gosub Implements Kill LSet Let Lib LineInput
+syn keyword vbStatement Load Lock Loop Mid MkDir Name Next On OnError Open
+syn keyword vbStatement Option Preserve Private Property Public Put RSet
+syn keyword vbStatement RaiseEvent Randomize ReDim Redim Reset Resume
+syn keyword vbStatement Return RmDir SavePicture SaveSetting Seek SendKeys
+syn keyword vbStatement Sendkeys Set SetAttr Static Step Stop Sub Time
+syn keyword vbStatement Type Unload Unlock Until Wend While Width With
+syn keyword vbStatement Write
+
+syn keyword vbKeyword As Binary ByRef ByVal Date Empty Error Friend Get
+syn keyword vbKeyword Input Is Len Lock Me Mid New Nothing Null On
+syn keyword vbKeyword Option Optional ParamArray Print Private Property
+syn keyword vbKeyword Public PublicNotCreateable OnNewProcessSingleUse
+syn keyword vbKeyword InSameProcessMultiUse GlobalMultiUse Resume Seek
+syn keyword vbKeyword Set Static Step String Time WithEvents
+
+syn keyword vbTodo contained TODO
+
+"Datatypes
+syn keyword vbTypes Boolean Byte Currency Date Decimal Double Empty
+syn keyword vbTypes Integer Long Object Single String Variant
+
+"VB defined values
+syn keyword vbDefine dbBigInt dbBinary dbBoolean dbByte dbChar
+syn keyword vbDefine dbCurrency dbDate dbDecimal dbDouble dbFloat
+syn keyword vbDefine dbGUID dbInteger dbLong dbLongBinary dbMemo
+syn keyword vbDefine dbNumeric dbSingle dbText dbTime dbTimeStamp
+syn keyword vbDefine dbVarBinary
+
+"VB defined values
+syn keyword vbDefine vb3DDKShadow vb3DFace vb3DHighlight vb3DLight
+syn keyword vbDefine vb3DShadow vbAbort vbAbortRetryIgnore
+syn keyword vbDefine vbActiveBorder vbActiveTitleBar vbAlias
+syn keyword vbDefine vbApplicationModal vbApplicationWorkspace
+syn keyword vbDefine vbAppTaskManager vbAppWindows vbArchive vbArray
+syn keyword vbDefine vbBack vbBinaryCompare vbBlack vbBlue vbBoolean
+syn keyword vbDefine vbButtonFace vbButtonShadow vbButtonText vbByte
+syn keyword vbDefine vbCalGreg vbCalHijri vbCancel vbCr vbCritical
+syn keyword vbDefine vbCrLf vbCurrency vbCyan vbDatabaseCompare
+syn keyword vbDefine vbDataObject vbDate vbDecimal vbDefaultButton1
+syn keyword vbDefine vbDefaultButton2 vbDefaultButton3 vbDefaultButton4
+syn keyword vbDefine vbDesktop vbDirectory vbDouble vbEmpty vbError
+syn keyword vbDefine vbExclamation vbFirstFourDays vbFirstFullWeek
+syn keyword vbDefine vbFirstJan1 vbFormCode vbFormControlMenu
+syn keyword vbDefine vbFormFeed vbFormMDIForm vbFriday vbFromUnicode
+syn keyword vbDefine vbGrayText vbGreen vbHidden vbHide vbHighlight
+syn keyword vbDefine vbHighlightText vbHiragana vbIgnore vbIMEAlphaDbl
+syn keyword vbDefine vbIMEAlphaSng vbIMEDisable vbIMEHiragana
+syn keyword vbDefine vbIMEKatakanaDbl vbIMEKatakanaSng vbIMEModeAlpha
+syn keyword vbDefine vbIMEModeAlphaFull vbIMEModeDisable
+syn keyword vbDefine vbIMEModeHangul vbIMEModeHangulFull
+syn keyword vbDefine vbIMEModeHiragana vbIMEModeKatakana
+syn keyword vbDefine vbIMEModeKatakanaHalf vbIMEModeNoControl
+syn keyword vbDefine vbIMEModeOff vbIMEModeOn vbIMENoOp vbIMEOff
+syn keyword vbDefine vbIMEOn vbInactiveBorder vbInactiveCaptionText
+syn keyword vbDefine vbInactiveTitleBar vbInfoBackground vbInformation
+syn keyword vbDefine vbInfoText vbInteger vbKatakana vbKey0 vbKey1
+syn keyword vbDefine vbKey2 vbKey3 vbKey4 vbKey5 vbKey6 vbKey7 vbKey8
+syn keyword vbDefine vbKey9 vbKeyA vbKeyAdd vbKeyB vbKeyBack vbKeyC
+syn keyword vbDefine vbKeyCancel vbKeyCapital vbKeyClear vbKeyControl
+syn keyword vbDefine vbKeyD vbKeyDecimal vbKeyDelete vbKeyDivide
+syn keyword vbDefine vbKeyDown vbKeyE vbKeyEnd vbKeyEscape vbKeyExecute
+syn keyword vbDefine vbKeyF vbKeyF1 vbKeyF10 vbKeyF11 vbKeyF12 vbKeyF13
+syn keyword vbDefine vbKeyF14 vbKeyF15 vbKeyF16 vbKeyF2 vbKeyF3 vbKeyF4
+syn keyword vbDefine vbKeyF5 vbKeyF6 vbKeyF7 vbKeyF8 vbKeyF9 vbKeyG
+syn keyword vbDefine vbKeyH vbKeyHelp vbKeyHome vbKeyI vbKeyInsert
+syn keyword vbDefine vbKeyJ vbKeyK vbKeyL vbKeyLButton vbKeyLeft vbKeyM
+syn keyword vbDefine vbKeyMButton vbKeyMenu vbKeyMultiply vbKeyN
+syn keyword vbDefine vbKeyNumlock vbKeyNumpad0 vbKeyNumpad1
+syn keyword vbDefine vbKeyNumpad2 vbKeyNumpad3 vbKeyNumpad4
+syn keyword vbDefine vbKeyNumpad5 vbKeyNumpad6 vbKeyNumpad7
+syn keyword vbDefine vbKeyNumpad8 vbKeyNumpad9 vbKeyO vbKeyP
+syn keyword vbDefine vbKeyPageDown vbKeyPageUp vbKeyPause vbKeyPrint
+syn keyword vbDefine vbKeyQ vbKeyR vbKeyRButton vbKeyReturn vbKeyRight
+syn keyword vbDefine vbKeyS vbKeySelect vbKeySeparator vbKeyShift
+syn keyword vbDefine vbKeySnapshot vbKeySpace vbKeySubtract vbKeyT
+syn keyword vbDefine vbKeyTab vbKeyU vbKeyUp vbKeyV vbKeyW vbKeyX
+syn keyword vbDefine vbKeyY vbKeyZ vbLf vbLong vbLowerCase vbMagenta
+syn keyword vbDefine vbMaximizedFocus vbMenuBar vbMenuText
+syn keyword vbDefine vbMinimizedFocus vbMinimizedNoFocus vbMonday
+syn keyword vbDefine vbMsgBox vbMsgBoxHelpButton vbMsgBoxRight
+syn keyword vbDefine vbMsgBoxRtlReading vbMsgBoxSetForeground
+syn keyword vbDefine vbMsgBoxText vbNarrow vbNewLine vbNo vbNormal
+syn keyword vbDefine vbNormalFocus vbNormalNoFocus vbNull vbNullChar
+syn keyword vbDefine vbNullString vbObject vbObjectError vbOK
+syn keyword vbDefine vbOKCancel vbOKOnly vbProperCase vbQuestion
+syn keyword vbDefine vbReadOnly vbRed vbRetry vbRetryCancel vbSaturday
+syn keyword vbDefine vbScrollBars vbSingle vbString vbSunday vbSystem
+syn keyword vbDefine vbSystemModal vbTab vbTextCompare vbThursday
+syn keyword vbDefine vbTitleBarText vbTuesday vbUnicode vbUpperCase
+syn keyword vbDefine vbUseSystem vbUseSystemDayOfWeek vbVariant
+syn keyword vbDefine vbVerticalTab vbVolume vbWednesday vbWhite vbWide
+syn keyword vbDefine vbWindowBackground vbWindowFrame vbWindowText
+syn keyword vbDefine vbYellow vbYes vbYesNo vbYesNoCancel
+
+"Numbers
+"integer number, or floating point number without a dot.
+syn match vbNumber "\<\d\+\>"
+"floating point number, with dot
+syn match vbNumber "\<\d\+\.\d*\>"
+"floating point number, starting with a dot
+syn match vbNumber "\.\d\+\>"
+"syn match vbNumber "{[[:xdigit:]-]\+}\|&[hH][[:xdigit:]]\+&"
+"syn match vbNumber ":[[:xdigit:]]\+"
+"syn match vbNumber "[-+]\=\<\d\+\>"
+syn match vbFloat "[-+]\=\<\d\+[eE][\-+]\=\d\+"
+syn match vbFloat "[-+]\=\<\d\+\.\d*\([eE][\-+]\=\d\+\)\="
+syn match vbFloat "[-+]\=\<\.\d\+\([eE][\-+]\=\d\+\)\="
+
+" String and Character constants
+syn region vbString start=+"+ end=+"\|$+
+syn region vbComment start="\(^\|\s\)REM\s" end="$" contains=vbTodo
+syn region vbComment start="\(^\|\s\)\'" end="$" contains=vbTodo
+syn match vbLineLabel "^\h\w\+:"
+syn match vbLineNumber "^\d\+\(:\|\s\|$\)"
+syn match vbTypeSpecifier "\<\a\w*[@\$%&!#]"ms=s+1
+syn match vbTypeSpecifier "#[a-zA-Z0-9]"me=e-1
+" Conditional Compilation
+syn match vbPreProc "^#const\>"
+syn region vbPreProc matchgroup=PreProc start="^#if\>" end="\<then\>" transparent contains=TOP
+syn region vbPreProc matchgroup=PreProc start="^#elseif\>" end="\<then\>" transparent contains=TOP
+syn match vbPreProc "^#else\>"
+syn match vbPreProc "^#end\s*if\>"
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+hi def link vbBoolean Boolean
+hi def link vbLineNumber Comment
+hi def link vbLineLabel 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
+hi def link vbPreProc PreProc
+
+let b:current_syntax = "vb"
+
+" vim: ts=8
diff --git a/runtime/syntax/vdf.vim b/runtime/syntax/vdf.vim
new file mode 100644
index 0000000..c690b70
--- /dev/null
+++ b/runtime/syntax/vdf.vim
@@ -0,0 +1,54 @@
+" Vim syntax file
+" Language: Valve Data Format
+" Maintainer: ObserverOfTime <chronobserver@disroot.org>
+" Filenames: *.vdf
+" Last Change: 2022 Sep 15
+
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpoptions
+set cpoptions&vim
+
+" Comment
+syn keyword vdfTodo contained TODO FIXME XXX
+syn match vdfComment +//.*+ contains=vdfTodo
+
+" Macro
+syn match vdfMacro /^\s*#.*/
+
+" Tag
+syn region vdfTag start=/"/ skip=/\\"/ end=/"/
+ \ nextgroup=vdfValue skipwhite oneline
+
+" Section
+syn region vdfSection matchgroup=vdfBrace
+ \ start=/{/ end=/}/ transparent fold
+ \ contains=vdfTag,vdfSection,vdfComment,vdfConditional
+
+" Conditional
+syn match vdfConditional /\[\$\w\{1,1021}\]/ nextgroup=vdfTag
+
+" Value
+syn region vdfValue start=/"/ skip=/\\"/ end=/"/
+ \ oneline contained contains=vdfVariable,vdfNumber,vdfEscape
+syn region vdfVariable start=/%/ skip=/\\%/ end=/%/ oneline contained
+syn match vdfEscape /\\[nt\\"]/ contained
+syn match vdfNumber /"-\?\d\+"/ contained
+
+hi def link vdfBrace Delimiter
+hi def link vdfComment Comment
+hi def link vdfConditional Constant
+hi def link vdfEscape SpecialChar
+hi def link vdfMacro Macro
+hi def link vdfNumber Number
+hi def link vdfTag Keyword
+hi def link vdfTodo Todo
+hi def link vdfValue String
+hi def link vdfVariable Identifier
+
+let b:current_syntax = 'vdf'
+
+let &cpoptions = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/vera.vim b/runtime/syntax/vera.vim
new file mode 100644
index 0000000..b41c0a6
--- /dev/null
+++ b/runtime/syntax/vera.vim
@@ -0,0 +1,348 @@
+" Vim syntax file
+" Language: Vera
+" Maintainer: Dave Eggum (opine at bluebottle dOt com)
+" Last Change: 2005 Dec 19
+
+" NOTE: extra white space at the end of the line will be highlighted if you
+" add this line to your colorscheme:
+
+" highlight SpaceError guibg=#204050
+
+" (change the value for guibg to any color you like)
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" A bunch of useful Vera keywords
+syn keyword veraStatement break return continue fork join terminate
+syn keyword veraStatement breakpoint proceed
+
+syn keyword veraLabel bad_state bad_trans bind constraint coverage_group
+syn keyword veraLabel class CLOCK default function interface m_bad_state
+syn keyword veraLabel m_bad_trans m_state m_trans program randseq state
+syn keyword veraLabel task trans
+
+syn keyword veraConditional if else case casex casez randcase
+syn keyword veraRepeat repeat while for do foreach
+syn keyword veraModifier after all any around assoc_size async
+syn keyword veraModifier before big_endian bit_normal bit_reverse export
+syn keyword veraModifier extends extern little_endian local hdl_node hdl_task
+syn keyword veraModifier negedge none packed protected posedge public rules
+syn keyword veraModifier shadow soft static super this typedef unpacked var
+syn keyword veraModifier vca virtual virtuals wildcard with
+
+syn keyword veraType reg string enum event bit
+syn keyword veraType rand randc integer port prod
+
+syn keyword veraDeprecated call_func call_task close_conn get_bind get_bind_id
+syn keyword veraDeprecated get_conn_err mailbox_receive mailbox_send make_client
+syn keyword veraDeprecated make_server simwave_plot up_connections
+
+" predefined tasks and functions
+syn keyword veraTask alloc assoc_index cast_assign cm_coverage
+syn keyword veraTask cm_get_coverage cm_get_limit delay error error_mode
+syn keyword veraTask exit fclose feof ferror fflush flag fopen fprintf
+syn keyword veraTask freadb freadh freadstr get_cycle get_env get_memsize
+syn keyword veraTask get_plus_arg getstate get_systime get_time get_time_unit
+syn keyword veraTask initstate lock_file mailbox_get mailbox_put os_command
+syn keyword veraTask printf prodget prodset psprintf query query_str query_x
+syn keyword veraTask rand48 random region_enter region_exit rewind
+syn keyword veraTask semaphore_get semaphore_put setstate signal_connect
+syn keyword veraTask sprintf srandom sscanf stop suspend_thread sync
+syn keyword veraTask timeout trace trigger unit_delay unlock_file urand48
+syn keyword veraTask urandom urandom_range vera_bit_reverse vera_crc
+syn keyword veraTask vera_pack vera_pack_big_endian vera_plot
+syn keyword veraTask vera_report_profile vera_unpack vera_unpack_big_endian
+syn keyword veraTask vsv_call_func vsv_call_task vsv_get_conn_err
+syn keyword veraTask vsv_make_client vsv_make_server vsv_up_connections
+syn keyword veraTask vsv_wait_for_done vsv_wait_for_input wait_child wait_var
+
+syn cluster veraOperGroup contains=veraOperator,veraOperParen,veraNumber,veraString,veraOperOk,veraType
+" syn match veraOperator "++\|--\|&\|\~&\||\|\~|\|^\|\~^\|\~\|><"
+" syn match veraOperator "*\|/\|%\|+\|-\|<<\|>>\|<\|<=\|>\|>=\|!in"
+" syn match veraOperator "=?=\|!?=\|==\|!=\|===\|!==\|&\~\|^\~\||\~"
+" syn match veraOperator "&&\|||\|=\|+=\|-=\|*=\|/=\|%=\|<<=\|>>=\|&="
+" syn match veraOperator "|=\|^=\|\~&=\|\~|=\|\~^="
+
+syn match veraOperator "[&|\~><!*@+/=,.\^\-]"
+syn keyword veraOperator or in dist not
+
+" open vera class methods
+syn keyword veraMethods atobin atohex atoi atooct backref bittostr capacity
+syn keyword veraMethods compare Configure constraint_mode delete DisableTrigger
+syn keyword veraMethods DoAction empty EnableCount EnableTrigger Event find
+syn keyword veraMethods find_index first first_index GetAssert get_at_least
+syn keyword veraMethods get_auto_bin getc GetCount get_coverage_goal get_cov_weight
+syn keyword veraMethods get_cross_bin_max GetFirstAssert GetName GetNextAssert
+syn keyword veraMethods get_status get_status_msg hide hash icompare insert
+syn keyword veraMethods inst_get_at_least inst_get_auto_bin_max inst_get_collect
+syn keyword veraMethods inst_get_coverage_goal inst_get_cov_weight inst_getcross_bin_max
+syn keyword veraMethods inst_query inst_set_at_least inst_set_auto_bin_max
+syn keyword veraMethods inst_set_bin_activiation inst_set_collect inst_set_coverage_goal
+syn keyword veraMethods inst_set_cov_weight inst_set_cross_bin_max itoa last last_index
+syn keyword veraMethods len load match max max_index min min_index new object_compare
+syn keyword veraMethods object_compare object_copy object_print pack pick_index
+syn keyword veraMethods pop_back pop_front post_boundary postmatch post_pack post_pack
+syn keyword veraMethods post_randomize post_randomize post_unpack post_unpack
+syn keyword veraMethods pre_boundary prematch pre_pack pre_pack pre_randomize
+syn keyword veraMethods pre-randomize pre_unpack push_back push_front putc query
+syn keyword veraMethods query_str rand_mode randomize reserve reverse rsort search
+syn keyword veraMethods set_at_least set_auto_bin_max set_bin_activiation
+syn keyword veraMethods set_coverage_goal set_cov_weight set_cross_bin_max set_name
+syn keyword veraMethods size sort substr sum thismatch tolower toupper unique_index
+syn keyword veraMethods unpack Wait
+
+" interface keywords
+syn keyword veraInterface ASYNC CLOCK gnr gr0 gr1 grx grz NHOLD nr NR0 NR1
+syn keyword veraInterface NRZ NRZ NSAMPLE PHOLD PR0 PR1 PRX PRZ r0 r1 rx snr
+syn keyword veraInterface sr0 sr1 srx srz depth inout input output
+syn match veraInterface "\$\w\+"
+
+
+syn keyword veraTodo contained TODO FIXME XXX FINISH
+
+" veraCommentGroup allows adding matches for special things in comments
+syn cluster veraCommentGroup contains=veraTodo
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match veraSpecial display contained "\\\(x\x\+\|\o\{1,3}\|.\|$\)"
+syn match veraFormat display "%\(\d\+\$\)\=[-+' #0*]*\(\d*\|\*\|\*\d\+\$\)\(\.\(\d*\|\*\|\*\d\+\$\)\)\=\([hlL]\|ll\)\=\([bdiuoxXDOUfeEgGcCsSpnm]\|\[\^\=.[^]]*\]\)" contained
+syn match veraFormat display "%%" contained
+syn region veraString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=veraSpecial,veraFormat,@Spell
+syn region veraConcat contained transparent oneline start='{' end='}'
+
+" veraCppString: same as veraString, but ends at end of line
+syn region veraCppString start=+"+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end='$' contains=veraSpecial,veraFormat,@Spell
+
+syn match veraCharacter "'[^\\]'"
+syn match veraCharacter "L'[^']*'" contains=veraSpecial
+syn match veraSpecialError "'\\[^'\"?\\abefnrtv]'"
+syn match veraSpecialCharacter "'\\['\"?\\abefnrtv]'"
+syn match veraSpecialCharacter display "'\\\o\{1,3}'"
+syn match veraSpecialCharacter display "'\\x\x\{1,2}'"
+syn match veraSpecialCharacter display "L'\\x\x\+'"
+
+" highlight trailing white space
+syn match veraSpaceError display excludenl "\s\+$"
+syn match veraSpaceError display " \+\t"me=e-1
+
+"catch errors caused by wrong parenthesis and brackets
+syn cluster veraParenGroup contains=veraParenError,veraIncluded,veraSpecial,veraCommentSkip,veraCommentString,veraComment2String,@veraCommentGroup,veraCommentStartError,veraUserCont,veraUserLabel,veraBitField,veraCommentSkip,veraOctalZero,veraCppOut,veraCppOut2,veraCppSkip,veraFormat,veraNumber,veraFloat,veraOctal,veraOctalError,veraNumbersCom
+
+syn region veraParen transparent start='(' end=')' contains=ALLBUT,@veraParenGroup,veraCppParen,veraErrInBracket,veraCppBracket,veraCppString,@Spell
+" veraCppParen: same as veraParen but ends at end-of-line; used in veraDefine
+syn region veraCppParen transparent start='(' skip='\\$' excludenl end=')' end='$' contained contains=ALLBUT,@veraParenGroup,veraErrInBracket,veraParen,veraBracket,veraString,@Spell
+syn match veraParenError display "[\])]"
+" syn match veraErrInParen display contained "[\]{}]"
+syn match veraErrInParen display contained "[\]]"
+syn region veraBracket transparent start='\[' end=']' contains=ALLBUT,@veraParenGroup,veraErrInParen,veraCppParen,veraCppBracket,veraCppString,@Spell
+
+" veraCppBracket: same as veraParen but ends at end-of-line; used in veraDefine
+syn region veraCppBracket transparent start='\[' skip='\\$' excludenl end=']' end='$' contained contains=ALLBUT,@veraParenGroup,veraErrInParen,veraParen,veraBracket,veraString,@Spell
+syn match veraErrInBracket display contained "[);{}]"
+
+"integer number, or floating point number without a dot and with "f".
+syn case ignore
+syn match veraNumbers display transparent "\<\d\|\.\d" contains=veraNumber,veraFloat,veraOctalError,veraOctal
+" Same, but without octal error (for comments)
+syn match veraNumbersCom display contained transparent "\<\d\|\.\d" contains=veraNumber,veraFloat,veraOctal
+" syn match veraNumber display contained "\d\+\(u\=l\{0,2}\|ll\=u\)\>"
+" "hex number
+" syn match veraNumber display contained "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+" syn match veraNumber "\(\<[0-9]\+\|\)'[bdoh][0-9a-fxzA-FXZ_]\+\>"
+syn match veraNumber "\<\(\<[0-9]\+\)\?\('[bdoh]\)\?[0-9a-fxz_]\+\>"
+" syn match veraNumber "\<[+-]\=[0-9]\+\>"
+" Flag the first zero of an octal number as something special
+syn match veraOctal display contained "0\o\+\(u\=l\{0,2}\|ll\=u\)\>" contains=veraOctalZero
+syn match veraOctalZero display contained "\<0"
+syn match veraFloat display contained "\d\+f"
+"floating point number, with dot, optional exponent
+syn match veraFloat display contained "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
+"floating point number, starting with a dot, optional exponent
+syn match veraFloat display contained "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+"floating point number, without dot, with exponent
+syn match veraFloat display contained "\d\+e[-+]\=\d\+[fl]\=\>"
+"hexadecimal floating point number, optional leading digits, with dot, with exponent
+syn match veraFloat display contained "0x\x*\.\x\+p[-+]\=\d\+[fl]\=\>"
+"hexadecimal floating point number, with leading digits, optional dot, with exponent
+syn match veraFloat display contained "0x\x\+\.\=p[-+]\=\d\+[fl]\=\>"
+
+" flag an octal number with wrong digits
+syn match veraOctalError display contained "0\o*[89]\d*"
+syn case match
+
+let vera_comment_strings = 1
+
+if exists("vera_comment_strings")
+ " A comment can contain veraString, veraCharacter and veraNumber.
+ " But a "*/" inside a veraString in a veraComment DOES end the comment! So we
+ " need to use a special type of veraString: veraCommentString, which also ends on
+ " "*/", and sees a "*" at the start of the line as comment again.
+ " Unfortunately this doesn't work very well for // type of comments :-(
+ syntax match veraCommentSkip contained "^\s*\*\($\|\s\+\)"
+ syntax region veraCommentString contained start=+L\=\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end=+\*/+me=s-1 contains=veraSpecial,veraCommentSkip
+ syntax region veraComment2String contained start=+\\\@<!"+ skip=+\\\\\|\\"+ end=+"+ end="$" contains=veraSpecial
+ syntax region veraCommentL start="//" skip="\\$" end="$" keepend contains=@veraCommentGroup,veraComment2String,veraCharacter,veraNumbersCom,veraSpaceError,@Spell
+ if exists("vera_no_comment_fold")
+ syntax region veraComment matchgroup=veraCommentStart start="/\*" end="\*/" contains=@veraCommentGroup,veraCommentStartError,veraCommentString,veraCharacter,veraNumbersCom,veraSpaceError,@Spell
+ else
+ syntax region veraComment matchgroup=veraCommentStart start="/\*" end="\*/" contains=@veraCommentGroup,veraCommentStartError,veraCommentString,veraCharacter,veraNumbersCom,veraSpaceError,@Spell fold
+ endif
+else
+ syn region veraCommentL start="//" skip="\\$" end="$" keepend contains=@veraCommentGroup,veraSpaceError,@Spell
+ if exists("vera_no_comment_fold")
+ syn region veraComment matchgroup=veraCommentStart start="/\*" end="\*/" contains=@veraCommentGroup,veraCommentStartError,veraSpaceError,@Spell
+ else
+ syn region veraComment matchgroup=veraCommentStart start="/\*" end="\*/" contains=@veraCommentGroup,veraCommentStartError,veraSpaceError,@Spell fold
+ endif
+endif
+" keep a // comment separately, it terminates a preproc. conditional
+syntax match veraCommentError display "\*/"
+syntax match veraCommentStartError display "/\*"me=e-1 contained
+
+syntax region veraBlock start="{" end="}" transparent fold
+
+" open vera pre-defined constants
+syn keyword veraConstant ALL ANY BAD_STATE BAD_TRANS CALL CHECK CHGEDGE
+syn keyword veraConstant CLEAR COPY_NO_WAIT COPY_WAIT CROSS CROSS_TRANS
+syn keyword veraConstant DEBUG DELETE EC_ARRAYX EC_CODE_END EC_CONFLICT
+syn keyword veraConstant EC_EVNTIMOUT EC_EXPECT EC_FULLEXPECT EC_MBXTMOUT
+syn keyword veraConstant EC_NEXPECT EC_RETURN EC_RGNTMOUT EC_SCONFLICT
+syn keyword veraConstant EC_SEMTMOUT EC_SEXPECT EC_SFULLEXPECT EC_SNEXTPECT
+syn keyword veraConstant EC_USERSET EQ EVENT FAIL FIRST FORK GE GOAL GT
+syn keyword veraConstant HAND_SHAKE HI HIGH HNUM LE LIC_EXIT LIC_PRERR
+syn keyword veraConstant LIC_PRWARN LIC_WAIT LO LOAD LOW LT MAILBOX MAX_COM
+syn keyword veraConstant NAME NE NEGEDGE NEXT NO_OVERLAP NO_OVERLAP_STATE
+syn keyword veraConstant NO_OVERLAP_TRANS NO_VARS NO_WAIT NUM NUM_BIN
+syn keyword veraConstant NUM_DET null OFF OK OK_LAST ON ONE_BLAST ONE_SHOT ORDER
+syn keyword veraConstant PAST_IT PERCENT POSEDGE PROGRAM RAWIN REGION REPORT
+syn keyword veraConstant SAMPLE SAVE SEMAPHORE SET SILENT STATE stderr
+syn keyword veraConstant stdin stdout STR STR_ERR_OUT_OF_RANGE
+syn keyword veraConstant STR_ERR_REGEXP_SYNTAX SUM TRANS VERBOSE void WAIT
+syn keyword veraConstant __LINE__ __FILE__ __DATE__ __TIME__ __VERA__
+syn keyword veraConstant __VERSION__ __VERA_VERSION__ __VERA_MINOR__
+syn keyword veraConstant __VERA_PATCH__ __VERA_VMC__ __VERA_VMC_MINOR__
+
+syn match veraUserConstant "\<[A-Z][A-Z0-9_]\+\>"
+
+syn match veraClass "\zs\w\+\ze::"
+syn match veraClass "\zs\w\+\ze\s\+\w\+\s*[=;,)\[]" contains=veraConstant,veraUserConstant
+syn match veraClass "\zs\w\+\ze\s\+\w\+\s*$" contains=veraConstant,veraUserConstant
+syn match veraUserMethod "\zs\w\+\ze\s*(" contains=veraConstant,veraUserConstant
+syn match veraObject "\zs\w\+\ze\.\w"
+syn match veraObject "\zs\w\+\ze\.\$\w"
+
+" Accept ` for # (Verilog)
+syn region veraPreCondit start="^\s*\(`\|#\)\s*\(if\|ifdef\|ifndef\|elif\)\>" skip="\\$" end="$" end="//"me=s-1 contains=veraComment,veraCppString,veraCharacter,veraCppParen,veraParenError,veraNumbers,veraCommentError,veraSpaceError
+syn match veraPreCondit display "^\s*\(`\|#\)\s*\(else\|endif\)\>"
+if !exists("vera_no_if0")
+ syn region veraCppOut start="^\s*\(`\|#\)\s*if\s\+0\+\>" end=".\@=\|$" contains=veraCppOut2
+ syn region veraCppOut2 contained start="0" end="^\s*\(`\|#\)\s*\(endif\>\|else\>\|elif\>\)" contains=veraSpaceError,veraCppSkip
+ syn region veraCppSkip contained start="^\s*\(`\|#\)\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*\(`\|#\)\s*endif\>" contains=veraSpaceError,veraCppSkip
+endif
+syn region veraIncluded display contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match veraIncluded display contained "<[^>]*>"
+syn match veraInclude display "^\s*\(`\|#\)\s*include\>\s*["<]" contains=veraIncluded
+"syn match veraLineSkip "\\$"
+syn cluster veraPreProcGroup contains=veraPreCondit,veraIncluded,veraInclude,veraDefine,veraErrInParen,veraErrInBracket,veraUserLabel,veraSpecial,veraOctalZero,veraCppOut,veraCppOut2,veraCppSkip,veraFormat,veraNumber,veraFloat,veraOctal,veraOctalError,veraNumbersCom,veraString,veraCommentSkip,veraCommentString,veraComment2String,@veraCommentGroup,veraCommentStartError,veraParen,veraBracket,veraMulti
+syn region veraDefine start="^\s*\(`\|#\)\s*\(define\|undef\)\>" skip="\\$" end="$" end="//"me=s-1 contains=ALLBUT,@veraPreProcGroup,@Spell
+syn region veraPreProc start="^\s*\(`\|#\)\s*\(pragma\>\|line\>\|warning\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@veraPreProcGroup,@Spell
+
+" Highlight User Labels
+syn cluster veraMultiGroup contains=veraIncluded,veraSpecial,veraCommentSkip,veraCommentString,veraComment2String,@veraCommentGroup,veraCommentStartError,veraUserCont,veraUserLabel,veraBitField,veraOctalZero,veraCppOut,veraCppOut2,veraCppSkip,veraFormat,veraNumber,veraFloat,veraOctal,veraOctalError,veraNumbersCom,veraCppParen,veraCppBracket,veraCppString
+syn region veraMulti transparent start='?' skip='::' end=':' contains=ALLBUT,@veraMultiGroup,@Spell
+" syn region veraMulti transparent start='?' skip='::' end=':' contains=ALL
+" The above causes veraCppOut2 to catch on:
+" i = (isTrue) ? 0 : 1;
+" which ends up commenting the rest of the file
+
+" Avoid matching foo::bar() by requiring that the next char is not ':'
+syn cluster veraLabelGroup contains=veraUserLabel
+syn match veraUserCont display "^\s*\I\i*\s*:$" contains=@veraLabelGroup
+syn match veraUserCont display ";\s*\I\i*\s*:$" contains=@veraLabelGroup
+syn match veraUserCont display "^\s*\I\i*\s*:[^:]"me=e-1 contains=@veraLabelGroup
+syn match veraUserCont display ";\s*\I\i*\s*:[^:]"me=e-1 contains=@veraLabelGroup
+
+syn match veraUserLabel display "\I\i*" contained
+
+" Avoid recognizing most bitfields as labels
+syn match veraBitField display "^\s*\I\i*\s*:\s*[1-9]"me=e-1
+syn match veraBitField display ";\s*\I\i*\s*:\s*[1-9]"me=e-1
+
+if exists("vera_minlines")
+ let b:vera_minlines = vera_minlines
+else
+ if !exists("vera_no_if0")
+ let b:vera_minlines = 50 " #if 0 constructs can be long
+ else
+ let b:vera_minlines = 15 " mostly for () constructs
+ endif
+endif
+exec "syn sync ccomment veraComment minlines=" . b:vera_minlines
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "vera"
+
+" vim: ts=8
diff --git a/runtime/syntax/verilog.vim b/runtime/syntax/verilog.vim
new file mode 100644
index 0000000..bbaca49
--- /dev/null
+++ b/runtime/syntax/verilog.vim
@@ -0,0 +1,119 @@
+" Vim syntax file
+" Language: Verilog
+" Maintainer: Mun Johl <Mun.Johl@emulex.com>
+" Last Update: Wed Jul 20 16:04:19 PDT 2011
+
+" 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.
+setlocal iskeyword=@,48-57,63,_,192-255
+
+" A bunch of useful Verilog keywords
+
+syn keyword verilogStatement always and assign automatic buf
+syn keyword verilogStatement bufif0 bufif1 cell cmos
+syn keyword verilogStatement config deassign defparam design
+syn keyword verilogStatement disable edge endconfig
+syn keyword verilogStatement endfunction endgenerate endmodule
+syn keyword verilogStatement endprimitive endspecify endtable endtask
+syn keyword verilogStatement event force function
+syn keyword verilogStatement generate genvar highz0 highz1 ifnone
+syn keyword verilogStatement incdir include initial inout input
+syn keyword verilogStatement instance integer large liblist
+syn keyword verilogStatement library localparam macromodule medium
+syn keyword verilogStatement module nand negedge nmos nor
+syn keyword verilogStatement noshowcancelled not notif0 notif1 or
+syn keyword verilogStatement output parameter pmos posedge primitive
+syn keyword verilogStatement pull0 pull1 pulldown pullup
+syn keyword verilogStatement pulsestyle_onevent pulsestyle_ondetect
+syn keyword verilogStatement rcmos real realtime reg release
+syn keyword verilogStatement rnmos rpmos rtran rtranif0 rtranif1
+syn keyword verilogStatement scalared showcancelled signed small
+syn keyword verilogStatement specify specparam strong0 strong1
+syn keyword verilogStatement supply0 supply1 table task time tran
+syn keyword verilogStatement tranif0 tranif1 tri tri0 tri1 triand
+syn keyword verilogStatement trior trireg unsigned use vectored wait
+syn keyword verilogStatement wand weak0 weak1 wire wor xnor xor
+syn keyword verilogLabel begin end fork join
+syn keyword verilogConditional if else case casex casez default endcase
+syn keyword verilogRepeat forever repeat while for
+
+syn keyword verilogTodo contained TODO FIXME
+
+syn match verilogOperator "[&|~><!)(*#%@+/=?:;}{,.\^\-\[\]]"
+
+syn region verilogComment start="/\*" end="\*/" contains=verilogTodo,@Spell
+syn match verilogComment "//.*" contains=verilogTodo,@Spell
+
+"syn match verilogGlobal "`[a-zA-Z0-9_]\+\>"
+syn match verilogGlobal "`celldefine"
+syn match verilogGlobal "`default_nettype"
+syn match verilogGlobal "`define"
+syn match verilogGlobal "`else"
+syn match verilogGlobal "`elsif"
+syn match verilogGlobal "`endcelldefine"
+syn match verilogGlobal "`endif"
+syn match verilogGlobal "`ifdef"
+syn match verilogGlobal "`ifndef"
+syn match verilogGlobal "`include"
+syn match verilogGlobal "`line"
+syn match verilogGlobal "`nounconnected_drive"
+syn match verilogGlobal "`resetall"
+syn match verilogGlobal "`timescale"
+syn match verilogGlobal "`unconnected_drive"
+syn match verilogGlobal "`undef"
+syn match verilogGlobal "$[a-zA-Z0-9_]\+\>"
+
+syn match verilogConstant "\<[A-Z][A-Z0-9_]\+\>"
+
+syn match verilogNumber "\(\<\d\+\|\)'[sS]\?[bB]\s*[0-1_xXzZ?]\+\>"
+syn match verilogNumber "\(\<\d\+\|\)'[sS]\?[oO]\s*[0-7_xXzZ?]\+\>"
+syn match verilogNumber "\(\<\d\+\|\)'[sS]\?[dD]\s*[0-9_xXzZ?]\+\>"
+syn match verilogNumber "\(\<\d\+\|\)'[sS]\?[hH]\s*[0-9a-fA-F_xXzZ?]\+\>"
+syn match verilogNumber "\<[+-]\=[0-9_]\+\(\.[0-9_]*\|\)\(e[0-9_]*\|\)\>"
+
+syn region verilogString start=+"+ skip=+\\"+ end=+"+ contains=verilogEscape,@Spell
+syn match verilogEscape +\\[nt"\\]+ contained
+syn match verilogEscape "\\\o\o\=\o\=" contained
+
+" Directives
+syn match verilogDirective "//\s*synopsys\>.*$"
+syn region verilogDirective start="/\*\s*synopsys\>" end="\*/"
+syn region verilogDirective start="//\s*synopsys dc_script_begin\>" end="//\s*synopsys dc_script_end\>"
+
+syn match verilogDirective "//\s*\$s\>.*$"
+syn region verilogDirective start="/\*\s*\$s\>" end="\*/"
+syn region verilogDirective start="//\s*\$s dc_script_begin\>" end="//\s*\$s dc_script_end\>"
+
+"Modify the following as needed. The trade-off is performance versus
+"functionality.
+syn sync minlines=50
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8
diff --git a/runtime/syntax/verilogams.vim b/runtime/syntax/verilogams.vim
new file mode 100644
index 0000000..7551b68
--- /dev/null
+++ b/runtime/syntax/verilogams.vim
@@ -0,0 +1,132 @@
+" Vim syntax file
+" Language: Verilog-AMS
+" Maintainer: S. Myles Prather <smprather@gmail.com>
+"
+" Version 1.1 S. Myles Prather <smprather@gmail.com>
+" Moved some keywords to the type category.
+" Added the metrix suffixes to the number matcher.
+" Version 1.2 Prasanna Tamhankar <pratam@gmail.com>
+" Minor reserved keyword updates.
+" Last Update: Thursday September 15 15:36:03 CST 2005
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Set the local value of the 'iskeyword' option
+setlocal iskeyword=@,48-57,_,192-255
+
+" Annex B.1 'All keywords'
+syn keyword verilogamsStatement above abs absdelay acos acosh ac_stim
+syn keyword verilogamsStatement always analog analysis and asin
+syn keyword verilogamsStatement asinh assign atan atan2 atanh
+syn keyword verilogamsStatement buf bufif0 bufif1 ceil cmos connectmodule
+syn keyword verilogamsStatement connectrules cos cosh cross ddt ddx deassign
+syn keyword verilogamsStatement defparam disable discipline
+syn keyword verilogamsStatement driver_update edge enddiscipline
+syn keyword verilogamsStatement endconnectrules endmodule endfunction endgenerate
+syn keyword verilogamsStatement endnature endparamset endprimitive endspecify
+syn keyword verilogamsStatement endtable endtask event exp final_step
+syn keyword verilogamsStatement flicker_noise floor flow force fork
+syn keyword verilogamsStatement function generate highz0
+syn keyword verilogamsStatement highz1 hypot idt idtmod if ifnone inf initial
+syn keyword verilogamsStatement initial_step inout input join
+syn keyword verilogamsStatement laplace_nd laplace_np laplace_zd laplace_zp
+syn keyword verilogamsStatement large last_crossing limexp ln localparam log
+syn keyword verilogamsStatement macromodule max medium min module nand nature
+syn keyword verilogamsStatement negedge net_resolution nmos noise_table nor not
+syn keyword verilogamsStatement notif0 notif1 or output paramset pmos
+syn keyword verilogamsType parameter real integer electrical input output
+syn keyword verilogamsType inout reg tri tri0 tri1 triand trior trireg
+syn keyword verilogamsType string from exclude aliasparam ground genvar
+syn keyword verilogamsType branch time realtime
+syn keyword verilogamsStatement posedge potential pow primitive pull0 pull1
+syn keyword verilogamsStatement pullup pulldown rcmos release
+syn keyword verilogamsStatement rnmos rpmos rtran rtranif0 rtranif1
+syn keyword verilogamsStatement scalared sin sinh slew small specify specparam
+syn keyword verilogamsStatement sqrt strong0 strong1 supply0 supply1
+syn keyword verilogamsStatement table tan tanh task timer tran tranif0
+syn keyword verilogamsStatement tranif1 transition
+syn keyword verilogamsStatement vectored wait wand weak0 weak1
+syn keyword verilogamsStatement white_noise wire wor wreal xnor xor zi_nd
+syn keyword verilogamsStatement zi_np zi_zd zi_zp
+syn keyword verilogamsRepeat forever repeat while for
+syn keyword verilogamsLabel begin end
+syn keyword verilogamsConditional if else case casex casez default endcase
+syn match verilogamsConstant ":inf"lc=1
+syn match verilogamsConstant "-inf"lc=1
+" Annex B.2 Discipline/nature
+syn keyword verilogamsStatement abstol access continuous ddt_nature discrete
+syn keyword verilogamsStatement domain idt_nature units
+" Annex B.3 Connect Rules
+syn keyword verilogamsStatement connect merged resolveto split
+
+syn match verilogamsOperator "[&|~><!)(*#%@+/=?:;}{,.\^\-\[\]]"
+syn match verilogamsOperator "<+"
+syn match verilogamsStatement "[vV]("me=e-1
+syn match verilogamsStatement "[iI]("me=e-1
+
+syn keyword verilogamsTodo contained TODO
+syn region verilogamsComment start="/\*" end="\*/" contains=verilogamsTodo
+syn match verilogamsComment "//.*" contains=verilogamsTodo
+
+syn match verilogamsGlobal "`celldefine"
+syn match verilogamsGlobal "`default_nettype"
+syn match verilogamsGlobal "`define"
+syn match verilogamsGlobal "`else"
+syn match verilogamsGlobal "`elsif"
+syn match verilogamsGlobal "`endcelldefine"
+syn match verilogamsGlobal "`endif"
+syn match verilogamsGlobal "`ifdef"
+syn match verilogamsGlobal "`ifndef"
+syn match verilogamsGlobal "`include"
+syn match verilogamsGlobal "`line"
+syn match verilogamsGlobal "`nounconnected_drive"
+syn match verilogamsGlobal "`resetall"
+syn match verilogamsGlobal "`timescale"
+syn match verilogamsGlobal "`unconnected_drive"
+syn match verilogamsGlobal "`undef"
+syn match verilogamsSystask "$[a-zA-Z0-9_]\+\>"
+
+syn match verilogamsConstant "\<[A-Z][A-Z0-9_]\+\>"
+
+syn match verilogamsNumber "\(\<\d\+\|\)'[bB]\s*[0-1_xXzZ?]\+\>"
+syn match verilogamsNumber "\(\<\d\+\|\)'[oO]\s*[0-7_xXzZ?]\+\>"
+syn match verilogamsNumber "\(\<\d\+\|\)'[dD]\s*[0-9_xXzZ?]\+\>"
+syn match verilogamsNumber "\(\<\d\+\|\)'[hH]\s*[0-9a-fA-F_xXzZ?]\+\>"
+syn match verilogamsNumber "\<[+-]\=[0-9_]\+\(\.[0-9_]*\|\)\(e[0-9_]*\|\)[TGMKkmunpfa]\=\>"
+
+syn region verilogamsString start=+"+ skip=+\\"+ end=+"+ contains=verilogamsEscape
+syn match verilogamsEscape +\\[nt"\\]+ contained
+syn match verilogamsEscape "\\\o\o\=\o\=" contained
+
+"Modify the following as needed. The trade-off is performance versus
+"functionality.
+syn sync lines=50
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+" 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
+
+
+let b:current_syntax = "verilogams"
+
+" vim: ts=8
diff --git a/runtime/syntax/vgrindefs.vim b/runtime/syntax/vgrindefs.vim
new file mode 100644
index 0000000..3de31b1
--- /dev/null
+++ b/runtime/syntax/vgrindefs.vim
@@ -0,0 +1,45 @@
+" Vim syntax file
+" Language: Vgrindefs
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2005 Jun 20
+
+" The Vgrindefs file is used to specify a language for vgrind
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Comments
+syn match vgrindefsComment "^#.*"
+
+" The fields that vgrind recognizes
+syn match vgrindefsField ":ab="
+syn match vgrindefsField ":ae="
+syn match vgrindefsField ":pb="
+syn match vgrindefsField ":bb="
+syn match vgrindefsField ":be="
+syn match vgrindefsField ":cb="
+syn match vgrindefsField ":ce="
+syn match vgrindefsField ":sb="
+syn match vgrindefsField ":se="
+syn match vgrindefsField ":lb="
+syn match vgrindefsField ":le="
+syn match vgrindefsField ":nc="
+syn match vgrindefsField ":tl"
+syn match vgrindefsField ":oc"
+syn match vgrindefsField ":kw="
+
+" Also find the ':' at the end of the line, so all ':' are highlighted
+syn match vgrindefsField ":\\$"
+syn match vgrindefsField ":$"
+syn match vgrindefsField "\\$"
+
+" Define the default highlighting.
+" Only used when an item doesn't have highlighting yet
+hi def link vgrindefsField Statement
+hi def link vgrindefsComment Comment
+
+let b:current_syntax = "vgrindefs"
+
+" vim: ts=8
diff --git a/runtime/syntax/vhdl.vim b/runtime/syntax/vhdl.vim
new file mode 100644
index 0000000..06fc2e7
--- /dev/null
+++ b/runtime/syntax/vhdl.vim
@@ -0,0 +1,268 @@
+" Vim syntax file
+" Language: VHDL [VHSIC (Very High Speed Integrated Circuit) Hardware Description Language]
+" Maintainer: Daniel Kho <daniel.kho@logik.haus>
+" Previous Maintainer: Czo <Olivier.Sirol@lip6.fr>
+" Credits: Stephan Hegel <stephan.hegel@snc.siemens.com.cn>
+" Last Changed: 2020 Apr 04 by Daniel Kho
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" case is not significant
+syn case ignore
+
+" VHDL 1076-2019 keywords
+syn keyword vhdlStatement access after alias all
+syn keyword vhdlStatement architecture array attribute
+syn keyword vhdlStatement assert assume
+syn keyword vhdlStatement begin block body buffer bus
+syn keyword vhdlStatement case component configuration constant
+syn keyword vhdlStatement context cover
+syn keyword vhdlStatement default disconnect downto
+syn keyword vhdlStatement elsif end entity exit
+syn keyword vhdlStatement file for function
+syn keyword vhdlStatement fairness force
+syn keyword vhdlStatement generate generic group guarded
+syn keyword vhdlStatement impure in inertial inout is
+syn keyword vhdlStatement label library linkage literal loop
+syn keyword vhdlStatement map
+syn keyword vhdlStatement new next null
+syn keyword vhdlStatement of on open others out
+syn keyword vhdlStatement package port postponed procedure process pure
+syn keyword vhdlStatement parameter property protected private
+syn keyword vhdlStatement range record register reject report return
+syn keyword vhdlStatement release restrict
+syn keyword vhdlStatement select severity signal shared subtype
+syn keyword vhdlStatement sequence strong
+syn keyword vhdlStatement then to transport type
+syn keyword vhdlStatement unaffected units until use
+syn keyword vhdlStatement variable view
+syn keyword vhdlStatement vpkg vmode vprop vunit
+syn keyword vhdlStatement wait when while with
+
+" VHDL predefined severity levels
+syn keyword vhdlAttribute note warning error failure
+
+" Linting of conditionals.
+syn match vhdlStatement "\<\(if\|else\)\>"
+syn match vhdlError "\<else\s\+if\>"
+
+" Types and type qualifiers
+" Predefined standard VHDL types
+syn match vhdlType "\<bit\>\'\="
+syn match vhdlType "\<boolean\>\'\="
+syn match vhdlType "\<natural\>\'\="
+syn match vhdlType "\<positive\>\'\="
+syn match vhdlType "\<integer\>\'\="
+syn match vhdlType "\<real\>\'\="
+syn match vhdlType "\<time\>\'\="
+
+syn match vhdlType "\<bit_vector\>\'\="
+syn match vhdlType "\<boolean_vector\>\'\="
+syn match vhdlType "\<integer_vector\>\'\="
+syn match vhdlType "\<real_vector\>\'\="
+syn match vhdlType "\<time_vector\>\'\="
+
+syn match vhdlType "\<character\>\'\="
+syn match vhdlType "\<string\>\'\="
+syn keyword vhdlType line text side width
+
+" Predefined standard IEEE VHDL types
+syn match vhdlType "\<std_ulogic\>\'\="
+syn match vhdlType "\<std_logic\>\'\="
+syn match vhdlType "\<std_ulogic_vector\>\'\="
+syn match vhdlType "\<std_logic_vector\>\'\="
+syn match vhdlType "\<unresolved_signed\>\'\="
+syn match vhdlType "\<unresolved_unsigned\>\'\="
+syn match vhdlType "\<u_signed\>\'\="
+syn match vhdlType "\<u_unsigned\>\'\="
+syn match vhdlType "\<signed\>\'\="
+syn match vhdlType "\<unsigned\>\'\="
+
+
+" array attributes
+syn match vhdlAttribute "\'high"
+syn match vhdlAttribute "\'left"
+syn match vhdlAttribute "\'length"
+syn match vhdlAttribute "\'low"
+syn match vhdlAttribute "\'range"
+syn match vhdlAttribute "\'reverse_range"
+syn match vhdlAttribute "\'right"
+syn match vhdlAttribute "\'ascending"
+" block attributes
+syn match vhdlAttribute "\'simple_name"
+syn match vhdlAttribute "\'instance_name"
+syn match vhdlAttribute "\'path_name"
+syn match vhdlAttribute "\'foreign" " VHPI
+" signal attribute
+syn match vhdlAttribute "\'active"
+syn match vhdlAttribute "\'delayed"
+syn match vhdlAttribute "\'event"
+syn match vhdlAttribute "\'last_active"
+syn match vhdlAttribute "\'last_event"
+syn match vhdlAttribute "\'last_value"
+syn match vhdlAttribute "\'quiet"
+syn match vhdlAttribute "\'stable"
+syn match vhdlAttribute "\'transaction"
+syn match vhdlAttribute "\'driving"
+syn match vhdlAttribute "\'driving_value"
+" type attributes
+syn match vhdlAttribute "\'base"
+syn match vhdlAttribute "\'subtype"
+syn match vhdlAttribute "\'element"
+syn match vhdlAttribute "\'leftof"
+syn match vhdlAttribute "\'pos"
+syn match vhdlAttribute "\'pred"
+syn match vhdlAttribute "\'rightof"
+syn match vhdlAttribute "\'succ"
+syn match vhdlAttribute "\'val"
+syn match vhdlAttribute "\'image"
+syn match vhdlAttribute "\'value"
+" VHDL-2019 interface attribute
+syn match vhdlAttribute "\'converse"
+
+syn keyword vhdlBoolean true false
+
+" for this vector values case is significant
+syn case match
+" Values for standard VHDL types
+syn match vhdlVector "\'[0L1HXWZU\-\?]\'"
+syn case ignore
+
+syn match vhdlVector "B\"[01_]\+\""
+syn match vhdlVector "O\"[0-7_]\+\""
+syn match vhdlVector "X\"[0-9a-f_]\+\""
+syn match vhdlCharacter "'.'"
+syn region vhdlString start=+"+ end=+"+
+
+" floating numbers
+syn match vhdlNumber "-\=\<\d\+\.\d\+\(E[+\-]\=\d\+\)\>"
+syn match vhdlNumber "-\=\<\d\+\.\d\+\>"
+syn match vhdlNumber "0*2#[01_]\+\.[01_]\+#\(E[+\-]\=\d\+\)\="
+syn match vhdlNumber "0*16#[0-9a-f_]\+\.[0-9a-f_]\+#\(E[+\-]\=\d\+\)\="
+" integer numbers
+syn match vhdlNumber "-\=\<\d\+\(E[+\-]\=\d\+\)\>"
+syn match vhdlNumber "-\=\<\d\+\>"
+syn match vhdlNumber "0*2#[01_]\+#\(E[+\-]\=\d\+\)\="
+syn match vhdlNumber "0*16#[0-9a-f_]\+#\(E[+\-]\=\d\+\)\="
+
+" operators
+syn keyword vhdlOperator and nand or nor xor xnor
+syn keyword vhdlOperator rol ror sla sll sra srl
+syn keyword vhdlOperator mod rem abs not
+
+" Concatenation and math operators
+syn match vhdlOperator "&\|+\|-\|\*\|\/"
+
+" Equality and comparison operators
+syn match vhdlOperator "=\|\/=\|>\|<\|>="
+
+" Assignment operators
+syn match vhdlOperator "<=\|:="
+syn match vhdlOperator "=>"
+
+" VHDL-202x concurrent signal association (spaceship) operator
+syn match vhdlOperator "<=>"
+
+" VHDL-2008 conversion, matching equality/non-equality operators
+syn match vhdlOperator "??\|?=\|?\/=\|?<\|?<=\|?>\|?>="
+
+" VHDL-2008 external names
+syn match vhdlOperator "<<\|>>"
+
+" Linting for illegal operators
+" '='
+syn match vhdlError "\(=\)[<=&+\-\*\/\\]\+"
+syn match vhdlError "[=&+\-\*\\]\+\(=\)"
+" '>', '<'
+" Allow external names: '<< ... >>'
+syn match vhdlError "\(>\)[<&+\-\/\\]\+"
+syn match vhdlError "[&+\-\/\\]\+\(>\)"
+syn match vhdlError "\(<\)[&+\-\/\\]\+"
+syn match vhdlError "[>=&+\-\/\\]\+\(<\)"
+" Covers most operators
+" support negative sign after operators. E.g. q<=-b;
+" Supports VHDL-202x spaceship (concurrent simple signal association).
+syn match vhdlError "\(<=\)[<=&+\*\\?:]\+"
+syn match vhdlError "[>=&+\-\*\\:]\+\(=>\)"
+syn match vhdlError "\(&\|+\|\-\|\*\*\|\/=\|??\|?=\|?\/=\|?<=\|?>=\|>=\|:=\|=>\)[<>=&+\*\\?:]\+"
+syn match vhdlError "[<>=&+\-\*\\:]\+\(&\|+\|\*\*\|\/=\|??\|?=\|?\/=\|?<\|?<=\|?>\|?>=\|>=\|<=\|:=\)"
+syn match vhdlError "\(?<\|?>\)[<>&+\*\/\\?:]\+"
+syn match vhdlError "\(<<\|>>\)[<>&+\*\/\\?:]\+"
+
+"syn match vhdlError "[?]\+\(&\|+\|\-\|\*\*\|??\|?=\|?\/=\|?<\|?<=\|?>\|?>=\|:=\|=>\)"
+" '/'
+syn match vhdlError "\(\/\)[<>&+\-\*\/\\?:]\+"
+syn match vhdlError "[<>=&+\-\*\/\\:]\+\(\/\)"
+
+syn match vhdlSpecial "<>"
+syn match vhdlSpecial "[().,;]"
+
+
+" time
+syn match vhdlTime "\<\d\+\s\+\(\([fpnum]s\)\|\(sec\)\|\(min\)\|\(hr\)\)\>"
+syn match vhdlTime "\<\d\+\.\d\+\s\+\(\([fpnum]s\)\|\(sec\)\|\(min\)\|\(hr\)\)\>"
+
+syn case match
+syn keyword vhdlTodo contained TODO NOTE
+syn keyword vhdlFixme contained FIXME
+syn case ignore
+
+syn region vhdlComment start="/\*" end="\*/" contains=vhdlTodo,vhdlFixme,@Spell
+syn match vhdlComment "\(^\|\s\)--.*" contains=vhdlTodo,vhdlFixme,@Spell
+
+" Standard IEEE P1076.6 preprocessor directives (metacomments).
+syn match vhdlPreProc "/\*\s*rtl_synthesis\s\+\(on\|off\)\s*\*/"
+syn match vhdlPreProc "\(^\|\s\)--\s*rtl_synthesis\s\+\(on\|off\)\s*"
+syn match vhdlPreProc "/\*\s*rtl_syn\s\+\(on\|off\)\s*\*/"
+syn match vhdlPreProc "\(^\|\s\)--\s*rtl_syn\s\+\(on\|off\)\s*"
+
+" Industry-standard directives. These are not standard VHDL, but are commonly
+" used in the industry.
+syn match vhdlPreProc "/\*\s*synthesis\s\+translate_\(on\|off\)\s*\*/"
+"syn match vhdlPreProc "/\*\s*simulation\s\+translate_\(on\|off\)\s*\*/"
+syn match vhdlPreProc "/\*\s*pragma\s\+translate_\(on\|off\)\s*\*/"
+syn match vhdlPreProc "/\*\s*pragma\s\+synthesis_\(on\|off\)\s*\*/"
+syn match vhdlPreProc "/\*\s*synopsys\s\+translate_\(on\|off\)\s*\*/"
+
+syn match vhdlPreProc "\(^\|\s\)--\s*synthesis\s\+translate_\(on\|off\)\s*"
+"syn match vhdlPreProc "\(^\|\s\)--\s*simulation\s\+translate_\(on\|off\)\s*"
+syn match vhdlPreProc "\(^\|\s\)--\s*pragma\s\+translate_\(on\|off\)\s*"
+syn match vhdlPreProc "\(^\|\s\)--\s*pragma\s\+synthesis_\(on\|off\)\s*"
+syn match vhdlPreProc "\(^\|\s\)--\s*synopsys\s\+translate_\(on\|off\)\s*"
+
+"Modify the following as needed. The trade-off is performance versus functionality.
+syn sync minlines=600
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
new file mode 100644
index 0000000..064416c
--- /dev/null
+++ b/runtime/syntax/vim.vim
@@ -0,0 +1,1046 @@
+" Vim syntax file
+" Language: Vim 9.0 script
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: January 18, 2023
+" Version: 9.0-21
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_VIM
+" Automatically generated keyword lists: {{{1
+
+" Quit when a syntax file was already loaded {{{2
+if exists("b:current_syntax")
+ finish
+endif
+let s:keepcpo= &cpo
+set cpo&vim
+
+" vimTodo: contains common special-notices for comments {{{2
+" Use the vimCommentGroup cluster to add your own.
+syn keyword vimTodo contained COMBAK FIXME TODO XXX
+syn cluster vimCommentGroup contains=vimTodo,@Spell
+
+" regular vim commands {{{2
+syn keyword vimCommand contained a ar[gs] argl[ocal] bad[d] bn[ext] breakd[el] bw[ipeout] cabo[ve] cat[ch] ccl[ose] cfdo chd[ir] class cnf[ile] comc[lear] cp[revious] cstag debugg[reedy] delep dell diffg[et] dig[raphs] do dsp[lit] echoe[rr] em[enu] endfo[r] eval f[ile] fina[lly] foldd[oopen] gr[ep] helpc[lose] his[tory] ij[ump] inor j[oin] keepj[umps] lab[ove] lat lc[d] le[ft] lfir[st] lh[elpgrep] lmak[e] loadk lp[revious] luado ma[rk] mk[exrc] mz[scheme] new nore on[ly] pc[lose] pp[op] promptf[ind] ptj[ump] pu[t] py3f[ile] pyx r[ead] redrawt[abline] ri[ght] rundo sIl sal[l] sbf[irst] sc scp se[t] sg sgn sie sip sme snoremenu spelli[nfo] spr[evious] sri star[tinsert] sts[elect] sus[pend] syncbind tabN[ext] tabl[ast] tabr[ewind] tcld[o] tj[ump] tlu tno[remap] tu[nmenu] undol[ist] v vie[w] vne[w] win[size] wq xmapc[lear] xr[estore]
+syn keyword vimCommand contained ab arga[dd] argu[ment] balt bo[tright] breakl[ist] cN[ext] cad[dbuffer] cb[uffer] cd cfir[st] che[ckpath] cle[arjumps] cnor comp[iler] cpf[ile] cun def deletel delm[arks] diffo[ff] dir doau e[dit] echom[sg] en[dif] endinterface ex files fini[sh] folddoc[losed] grepa[dd] helpf[ind] hor[izontal] il[ist] interface ju[mps] keepp[atterns] lad[dexpr] later lch[dir] lefta[bove] lg[etfile] lhi[story] lmapc[lear] loadkeymap lpf[ile] luafile mak[e] mks[ession] mzf[ile] nmapc[lear] nos[wapfile] opt[ions] pe[rl] pre[serve] promptr[epl] ptl[ast] public py[thon] pyxdo rec[over] reg[isters] rightb[elow] rv[iminfo] sIn san[dbox] sbl[ast] scI scr[iptnames] setf[iletype] sgI sgp sig sir smenu so[urce] spellr[are] sr srl startg[replace] substitutepattern sv[iew] syntime tabc[lose] tabm[ove] tabs tclf[ile] tl[ast] tlunmenu to[pleft] tunma[p] unh[ide] var vim9[cmd] vs[plit] winc[md] wqa[ll] xme xunme
+syn keyword vimCommand contained abc[lear] argd[elete] as[cii] bd[elete] bp[revious] bro[wse] cNf[ile] cadde[xpr] cbe[fore] cdo cg[etfile] checkt[ime] clo[se] co[py] con[tinue] cq[uit] cuna[bbrev] defc[ompile] deletep delp diffp[atch] disa[ssemble] doaut ea echon endclass endt[ry] exi[t] filet fir[st] foldo[pen] gui helpg[rep] i imapc[lear] intro k lN[ext] laddb[uffer] lb[uffer] lcl[ose] leg[acy] lgetb[uffer] ll lne[xt] loc[kmarks] lr[ewind] lv[imgrep] marks mksp[ell] n[ext] noa nu[mber] ownsyntax ped[it] prev[ious] ps[earch] ptn[ext] pw[d] pydo pyxfile red[o] res[ize] ru[ntime] sI sIp sav[eas] sbm[odified] sce scripte[ncoding] setg[lobal] sgc sgr sign sl[eep] smile sor[t] spellr[epall] srI srn startr[eplace] substituterepeat sw[apname] t tabd[o] tabn[ext] tags te[aroff] tlm tm[enu] tp[revious] type unl ve[rsion] vim9s[cript] wN[ext] windo wundo xmenu xunmenu
+syn keyword vimCommand contained abo[veleft] argded[upe] au bel[owright] br[ewind] bufdo c[hange] caddf[ile] cbel[ow] ce[nter] cgetb[uffer] chi[story] cmapc[lear] col[der] conf[irm] cr[ewind] cw[indow] defer deletl dep diffpu[t] dj[ump] dp earlier echow[indow] enddef endw[hile] exp filetype fix[del] for gvim helpt[ags] ia imp is[earch] kee[pmarks] lNf[ile] laddf[ile] lbe[fore] lcs lex[pr] lgete[xpr] lla[st] lnew[er] lockv[ar] ls lvimgrepa[dd] mat[ch] mkv[imrc] nb[key] noautocmd o[pen] p[rint] perld[o] pro ptN[ext] ptp[revious] py3 pyf[ile] q[uit] redi[r] ret[ab] rub[y] sIc sIr sbN[ext] sbn[ext] scg scriptv[ersion] setl[ocal] sge sh[ell] sil[ent] sla[st] sn[ext] sp[lit] spellr[rare] src srp static sun[hide] sy tN[ext] tabe[dit] tabnew tc[d] ter[minal] tlmenu tma[p] tr[ewind] u[ndo] unlo[ckvar] verb[ose] vim[grep] w[rite] winp[os] wv[iminfo] xnoreme xwininfo
+syn keyword vimCommand contained abstract argdo bN[ext] bf[irst] brea[k] buffers ca caf[ter] cbo[ttom] cex[pr] cgete[xpr] cl[ist] cn[ext] colo[rscheme] cons[t] cs d[elete] delc[ommand] deletp di[splay] diffs[plit] dl dr[op] ec el[se] endenum ene[w] export filt[er] fo[ld] fu[nction] h[elp] hi iabc[lear] import isp[lit] keepa l[ist] laf[ter] lbel[ow] lcscope lf[ile] lgr[ep] lli[st] lnf[ile] lol[der] lt[ag] lw[indow] menut[ranslate] mkvie[w] nbc[lose] noh[lsearch] ol[dfiles] pa[ckadd] po[p] prof[ile] pta[g] ptr[ewind] py3do python3 qa[ll] redr[aw] retu[rn] rubyd[o] sIe sN[ext] sb[uffer] sbp[revious] sci scs sf[ind] sgi si sim[alt] sm[agic] sno[magic] spe[llgood] spellu[ndo] sre[wind] st[op] stj[ump] sunme syn ta[g] tabf[ind] tabo[nly] tch[dir] tf[irst] tln tmapc[lear] try una[bbreviate] uns[ilent] vert[ical] vimgrepa[dd] wa[ll] wn[ext] x[it] xnoremenu y[ank]
+syn keyword vimCommand contained addd arge[dit] b[uffer] bl[ast] breaka[dd] bun[load] cabc[lear] cal[l] cc cf[ile] changes cla[st] cnew[er] com cope[n] cscope debug delel delf[unction] dif[fupdate] difft[his] dli[st] ds[earch] echoc[onsole] elsei[f] endf[unction] enum exu[sage] fin[d] foldc[lose] go[to] ha[rdcopy] hid[e] if in iuna[bbrev] keepalt la[st] lan[guage] lbo[ttom] ld[o] lfdo lgrepa[dd] lma lo[adview] lop[en] lua m[ove] mes[sages] mod[e] nbs[tart] nor omapc[lear] packl[oadall] popu[p] profd[el] ptf[irst] pts[elect] py3f[ile] pythonx quita[ll] redraws[tatus] rew[ind] rubyf[ile] sIg sa[rgument] sba[ll] sbr[ewind] scl scscope sfir[st] sgl sic sin sm[ap] snoreme spelld[ump] spellw[rong] srg sta[g] stopi[nsert] sunmenu sync tab tabfir[st] tabp[revious] tcl th[row] tlnoremenu tn[ext] ts[elect] undoj[oin] up[date] vi[sual] viu[sage] wh[ile] wp[revious] xa[ll] xprop z[^.=]
+syn keyword vimCommand contained al[l] argg[lobal] ba[ll] bm[odified]
+syn match vimCommand contained "\<z[-+^.=]\=\>"
+syn keyword vimStdPlugin contained Arguments Asm Break Cfilter Clear Continue DiffOrig Evaluate Finish Gdb Lfilter Man N[ext] Over P[rint] Program Run S Source Step Stop Termdebug TermdebugCommand TOhtml Until Winbar XMLent XMLns
+
+" vimOptions are caught only when contained in a vimSet {{{2
+syn keyword vimOption contained acd ambw arshape aw backupskip beval bk bri bufhidden cdh ci cinsd cms commentstring conceallevel cpt cscopetagorder csto cursorlineopt dg dir ed enc equalprg expandtab fdls fex fileignorecase fml foldlevel formatexpr gcr gli guifont guitabtooltip hidden hlg imactivatefunc imi inc inex isident keymap langmap linebreak lm lsp makeencoding maxmem mh mmp more mousemoveevent mzq numberwidth opfunc patchexpr pfn pp printfont pumwidth pythonthreehome re restorescreen ro rulerformat scl scs sft shellslash shortmess showtabline slm smoothscroll spell spl srr statusline sw sxq tag tal tenc termwintype tgst titleold tpm ttm tw udir ur verbose viminfofile warn wfh wildchar wim winminheight wmh write
+syn keyword vimOption contained ai anti asd awa balloondelay bevalterm bkc briopt buflisted cdhome cin cinw co compatible confirm crb cscopeverbose csverb cwh dict directory edcompatible encoding errorbells exrc fdm ff filetype fmr foldlevelstart formatlistpat gd go guifontset helpfile highlight hls imactivatekey iminsert include inf isk keymodel langmenu lines lmap luadll makeprg maxmempattern mis mmt mouse mouses mzquantum nuw osfiletype patchmode ph preserveindent printheader pvh pyx readonly revins rop runtimepath scr sect sh shelltemp shortname shq sloc sms spellcapcheck splitbelow ss stl swapfile syn tagbsearch tb term terse thesaurus titlestring tr tty twk ul ut verbosefile virtualedit wb wfw wildcharm winaltkeys winminwidth wmnu writeany
+syn keyword vimOption contained akm antialias autochdir background ballooneval bex bl brk buftype cdpath cindent cinwords cocu complete copyindent cryptmethod csl cuc debug dictionary display ef endoffile errorfile fcl fdn ffs fillchars fo foldmarker formatoptions gdefault gp guifontwide helpheight history hlsearch imaf ims includeexpr infercase iskeyword keyprotocol langnoremap linespace lnr lw mat maxmemtot mkspellmem mod mousef mouseshape mzschemedll odev pa path pheader previewheight printmbcharset pvp pyxversion redrawtime ri rs sb scroll sections shcf shelltype showbreak si sm sn spellfile splitkeep ssl stmp swapsync synmaxcol tagcase tbi termbidi textauto thesaurusfunc tl ts ttybuiltin tws undodir varsofttabstop vfile visualbell wc wh wildignore wincolor winptydll wmw writebackup
+syn keyword vimOption contained al ar autoindent backspace balloonevalterm bexpr bo browsedir casemap cedit cink clipboard cole completefunc cot cscopepathcomp cspc cul deco diff dy efm endofline errorformat fcs fdo fic fixendofline foldclose foldmethod formatprg gfm grepformat guiheadroom helplang hk ic imak imsearch incsearch insertmode isp keywordprg langremap lisp loadplugins lz matchpairs mco ml modeline mousefocus mouset mzschemegcdll oft packpath pdev pi previewpopup printmbfont pvw qe regexpengine rightleft rtp sbo scrollbind secure shell shellxescape showcmd sidescroll smartcase so spelllang splitright ssop sts swb syntax tagfunc tbidi termencoding textmode tildeop tm tsl ttyfast twsl undofile vartabstop vi vop wcm whichwrap wildignorecase window winwidth wop writedelay
+syn keyword vimOption contained aleph arab autoread backup balloonexpr bg bomb bs cb cf cinkeys cm colorcolumn completeopt cp cscopeprg csprg culopt def diffexpr ea ei eof esckeys fdc fdt fileencoding fixeol foldcolumn foldminlines fp gfn grepprg guiligatures hf hkmap icon imc imsf inde is isprint km laststatus lispoptions lop ma matchtime mef mle modelineexpr mousehide mousetime nf ofu para penc pm previewwindow printoptions pw qftf relativenumber rightleftcmd ru sbr scrollfocus sel shellcmdflag shellxquote showcmdloc sidescrolloff smartindent softtabstop spelloptions spo st su swf ta taglength tbis termguicolors textwidth timeout to tsr ttym twt undolevels vb viewdir vsts wcr wi wildmenu winfixheight wiv wrap ws
+syn keyword vimOption contained allowrevins arabic autoshelldir backupcopy bdir bh breakat bsdir cc cfu cino cmdheight columns completepopup cpo cscopequickfix csqf cursorbind define diffopt ead ek eol et fde fen fileencodings fk foldenable foldnestmax fs gfs gtl guioptions hh hkmapp iconstring imcmdline imst indentexpr isf joinspaces kmp lazyredraw lispwords lpl macatsui maxcombine menc mls modelines mousem mp nrformats omnifunc paragraphs perldll pmbcs printdevice prompt pythondll quickfixtextfunc remap rl rubydll sc scrolljump selection shellpipe shiftround showfulltag signcolumn smarttab sol spellsuggest spr sta sua switchbuf tabline tagrelative tbs termwinkey tf timeoutlen toolbar tsrfu ttymouse tx undoreload vbs viewoptions vts wd wic wildmode winfixwidth wiw wrapmargin ww
+syn keyword vimOption contained altkeymap arabicshape autowrite backupdir bdlay bin breakindent bsk ccv ch cinoptions cmdwinheight com completeslash cpoptions cscoperelative csre cursorcolumn delcombine digraph eadirection emo ep eventignore fdi fenc fileformat fkmap foldexpr foldopen fsync gfw gtt guipty hi hkp ignorecase imd imstatusfunc indentkeys isfname js kp lbr list lrm magic maxfuncdepth menuitems mm modifiable mousemev mps nu opendevice paste pex pmbfn printencoding pt pythonhome quoteescape renderoptions rlc ruf scb scrolloff selectmode shellquote shiftwidth showmatch siso smc sp spf sps stal suffixes sws tabpagemax tags tc termwinscroll tfu title toolbariconsize ttimeout ttyscroll uc updatecount vdir vif wa weirdinvert wig wildoptions winheight wm wrapscan xtermcodes
+syn keyword vimOption contained ambiwidth ari autowriteall backupext belloff binary breakindentopt bt cd charconvert cinscopedecls cmp comments concealcursor cpp cscopetag cst cursorline dex dip eb emoji equalalways ex fdl fencs fileformats flp foldignore foldtext ft ghr guicursor guitablabel hid hl im imdisable imstyle indk isi key kpc lcs listchars ls makeef maxmapdepth mfd mmd modified mousemodel msm number operatorfunc pastetoggle pexpr popt printexpr pumheight pythonthreedll rdt report rnu ruler scf scrollopt sessionoptions shellredir shm showmode sj smd spc spk sr startofline suffixesadd sxe tabstop tagstack tcldll termwinsize tgc titlelen top ttimeoutlen ttytype udf updatetime ve viminfo wak
+
+" vimOptions: These are the turn-off setting variants {{{2
+syn keyword vimOption contained noacd noallowrevins noantialias noarabic noarshape noautoindent noautowrite noawa noballoonevalterm nobin nobl nobri noci nocompatible nocp nocscopetag nocst nocul nocursorline nodg noea noedcompatible noemoji noeof noerrorbells noex nofen nofixendofline nofkmap nofsync noguipty nohk nohkp noic noim noimd noinf nois nolangnoremap nolbr nolist nolpl noma nomh nomod nomodifiable nomousef nonu noopendevice nopreserveindent noprompt noreadonly noremap norevins norightleft nornu nors noruler nosc noscf noscrollfocus nosecure noshellslash noshiftround noshowcmd noshowmatch nosi nosmartcase nosmarttab nosmoothscroll nosn nospell nosplitright nosr nosta nostmp noswf notagbsearch notagstack notbidi notermbidi notextauto notf notildeop notitle notop nottimeout nottyfast noudf novb nowa nowb nowfh nowic nowildmenu nowinfixwidth nowmnu nowrapscan nowriteany nows
+syn keyword vimOption contained noai noaltkeymap noar noarabicshape noasd noautoread noautowriteall nobackup nobeval nobinary nobomb nobuflisted nocin noconfirm nocrb nocscopeverbose nocsverb nocursorbind nodeco nodiff noeb noek noendoffile noeol noesckeys noexpandtab nofic nofixeol nofoldenable nogd nohid nohkmap nohls noicon noimc noimdisable noinfercase nojoinspaces nolangremap nolinebreak nolnr nolrm nomacatsui noml nomodeline nomodified nomousefocus nonumber nopaste nopreviewwindow nopvw norelativenumber norestorescreen nori norl noro noru nosb noscb noscrollbind noscs nosft noshelltemp noshortname noshowfulltag noshowmode nosm nosmartindent nosmd nosms nosol nosplitbelow nospr nossl nostartofline noswapfile nota notagrelative notbi notbs noterse notextmode notgst notimeout noto notr nottybuiltin notx noundofile novisualbell nowarn noweirdinvert nowfw nowildignorecase nowinfixheight nowiv nowrap nowrite nowritebackup noxtermcodes
+syn keyword vimOption contained noakm noanti noarab noari noautochdir noautoshelldir noaw noballooneval nobevalterm nobk nobreakindent nocf nocindent nocopyindent nocscoperelative nocsre nocuc nocursorcolumn nodelcombine nodigraph noed noemo noendofline noequalalways noet noexrc nofileignorecase nofk nofs nogdefault nohidden nohkmapp nohlsearch noignorecase noimcmdline noincsearch noinsertmode nojs nolazyredraw nolisp noloadplugins nolz nomagic nomle nomodelineexpr nomore nomousehide noodev nopi
+
+" vimOptions: These are the invertible variants {{{2
+syn keyword vimOption contained invacd invallowrevins invantialias invarabic invarshape invautoindent invautowrite invawa invballoonevalterm invbin invbl invbri invci invcompatible invcp invcscopetag invcst invcul invcursorline invdg invea invedcompatible invemoji inveof inverrorbells invex invfen invfixendofline invfkmap invfsync invguipty invhk invhkp invic invim invimd invinf invis invlangnoremap invlbr invlist invlpl invma invmh invmod invmodifiable invmousef invnu invopendevice invpreserveindent invprompt invreadonly invremap invrevins invrightleft invrnu invrs invruler invsc invscf invscrollfocus invsecure invshellslash invshiftround invshowcmd invshowmatch invsi invsmartcase invsmarttab invsmoothscroll invsn invspell invsplitright invsr invsta invstmp invswf invtagbsearch invtagstack invtbidi invtermbidi invtextauto invtf invtildeop invtitle invtop invttimeout invttyfast invudf invvb invwa invwb invwfh invwic invwildmenu invwinfixwidth invwmnu invwrapscan invwriteany invws
+syn keyword vimOption contained invai invaltkeymap invar invarabicshape invasd invautoread invautowriteall invbackup invbeval invbinary invbomb invbuflisted invcin invconfirm invcrb invcscopeverbose invcsverb invcursorbind invdeco invdiff inveb invek invendoffile inveol invesckeys invexpandtab invfic invfixeol invfoldenable invgd invhid invhkmap invhls invicon invimc invimdisable invinfercase invjoinspaces invlangremap invlinebreak invlnr invlrm invmacatsui invml invmodeline invmodified invmousefocus invnumber invpaste invpreviewwindow invpvw invrelativenumber invrestorescreen invri invrl invro invru invsb invscb invscrollbind invscs invsft invshelltemp invshortname invshowfulltag invshowmode invsm invsmartindent invsmd invsms invsol invsplitbelow invspr invssl invstartofline invswapfile invta invtagrelative invtbi invtbs invterse invtextmode invtgst invtimeout invto invtr invttybuiltin invtx invundofile invvisualbell invwarn invweirdinvert invwfw invwildignorecase invwinfixheight invwiv invwrap invwrite invwritebackup invxtermcodes
+syn keyword vimOption contained invakm invanti invarab invari invautochdir invautoshelldir invaw invballooneval invbevalterm invbk invbreakindent invcf invcindent invcopyindent invcscoperelative invcsre invcuc invcursorcolumn invdelcombine invdigraph inved invemo invendofline invequalalways invet invexrc invfileignorecase invfk invfs invgdefault invhidden invhkmapp invhlsearch invignorecase invimcmdline invincsearch invinsertmode invjs invlazyredraw invlisp invloadplugins invlz invmagic invmle invmodelineexpr invmore invmousehide invodev invpi
+
+" termcap codes (which can also be set) {{{2
+syn keyword vimOption contained t_8b t_8u t_AF t_AL t_bc t_BE t_ce t_cl t_Co t_Cs t_CV t_db t_DL t_Ds t_EI t_F2 t_F4 t_F6 t_F8 t_fd t_fs t_IE t_k1 t_k2 t_K3 t_K4 t_K5 t_K6 t_K7 t_K8 t_K9 t_kb t_KB t_kd t_KD t_KE t_KG t_KH t_KI t_KK 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_PE t_PS t_RB t_RC t_RF t_Ri t_RI t_RK t_RS t_RT t_RV t_Sb t_SC t_se t_Sf t_SH t_Si t_SI t_so t_sr t_SR t_ST t_te t_Te t_TE t_ti t_TI t_ts t_Ts t_u7 t_ue t_us t_Us t_ut t_vb t_ve t_vi t_vs t_VS t_WP t_WS t_XM t_xn t_xs t_ZH t_ZR
+syn keyword vimOption contained t_8f t_AB t_al t_AU t_BD t_cd t_Ce t_cm t_cs t_CS t_da t_dl t_ds t_EC t_F1 t_F3 t_F5 t_F7 t_F9 t_fe t_GP t_IS t_K1 t_k3 t_k4 t_k5 t_k6 t_k7 t_k8 t_k9 t_KA t_kB t_KC t_kD t_ke t_KF t_kh t_kI t_KJ t_kl
+syn match vimOption contained "t_%1"
+syn match vimOption contained "t_#2"
+syn match vimOption contained "t_#4"
+syn match vimOption contained "t_@7"
+syn match vimOption contained "t_*7"
+syn match vimOption contained "t_&8"
+syn match vimOption contained "t_%i"
+syn match vimOption contained "t_k;"
+
+" unsupported settings: some were supported by vi but don't do anything in vim {{{2
+" others have been dropped along with msdos support
+syn keyword vimErrSetting contained bioskey biosk conskey consk autoprint beautify flash graphic hardtabs mesg novice open op optimize redraw slow slowopen sourceany w300 w1200 w9600 hardtabs ht nobioskey nobiosk noconskey noconsk noautoprint nobeautify noflash nographic nohardtabs nomesg nonovice noopen noop nooptimize noredraw noslow noslowopen nosourceany now300 now1200 now9600 w1200 w300 w9600
+
+" AutoCmd Events {{{2
+syn case ignore
+syn keyword vimAutoEvent contained BufAdd BufDelete BufFilePost BufHidden BufNew BufRead BufReadPost BufUnload BufWinLeave BufWrite BufWritePost CmdlineChanged CmdlineLeave CmdwinEnter ColorScheme CompleteChanged CompleteDonePre CursorHoldI CursorMovedI DiffUpdated DirChanged DirChangedPre EncodingChanged ExitPre FileAppendCmd FileAppendPost FileAppendPre FileChangedRO FileChangedShell FileChangedShellPost FileEncoding FileExplorer FileReadCmd FileReadPost FileReadPre FileType FileWriteCmd FileWritePost FileWritePre FilterReadPost FilterReadPre FilterWritePost FilterWritePre FocusGained FocusLost FuncUndefined GUIEnter GUIFailed InsertChange InsertCharPre InsertEnter InsertLeave InsertLeavePre MenuPopup ModeChanged OptionSet QuickFixCmdPost QuickFixCmdPre QuitPre RemoteReply SafeState SafeStateAgain SessionLoadPost ShellCmdPost ShellFilterPost SigUSR1 SourceCmd SourcePost SourcePre SpellFileMissing StdinReadPost StdinReadPre SwapExists Syntax TabClosed TabEnter TabLeave TabNew TermChanged TerminalOpen TerminalWinOpen TermResponse TextChanged TextChangedI TextChangedP TextChangedT TextYankPost User VimEnter VimLeave VimLeavePre VimResized VimResume VimSuspend WinClosed WinEnter WinLeave WinNew WinResized WinScrolled
+syn keyword vimAutoEvent contained BufCreate BufEnter BufFilePre BufLeave BufNewFile BufReadCmd BufReadPre BufWinEnter BufWipeout BufWriteCmd BufWritePre CmdlineEnter CmdUndefined CmdwinLeave ColorSchemePre CompleteDone CursorHold CursorMoved
+
+" Highlight commonly used Groupnames {{{2
+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 CurSearch Cursor CursorColumn CursorIM CursorLine CursorLineFold CursorLineNr CursorLineSign DiffAdd DiffChange DiffDelete DiffText Directory EndOfBuffer ErrorMsg FoldColumn Folded IncSearch LineNr LineNrAbove LineNrBelow MatchParen Menu MessageWindow ModeMsg MoreMsg NonText Normal Pmenu PmenuSbar PmenuSel PmenuThumb Question QuickFixLine Scrollbar Search SignColumn SpecialKey SpellBad SpellCap SpellLocal SpellRare StatusLine StatusLineNC StatusLineTerm StatusLineTermNC TabLine TabLineFill TabLineSel Terminal Title Tooltip VertSplit Visual VisualNOS WarningMsg WildMenu
+syn match vimHLGroup contained "Conceal"
+syn case match
+
+" Function Names {{{2
+syn keyword vimFuncName contained abs argc assert_equal assert_match atan balloon_show bufexists bufwinid ceil ch_canread ch_getbufnr ch_read ch_status complete_check count deletebufline digraph_set eval exists_compiled extendnew findfile fnameescape foldtextresult get getchangelist getcmdcompltype getcompletion getfperm getline getpid getscriptinfo getwininfo glob2regpat histadd hlID indexof inputsecret isinf job_setoptions js_encode libcall list2str log10 mapnew matchdelete matchstrpos mzeval popup_atcursor popup_dialog popup_findpreview popup_locate popup_settext prompt_getprompt prop_add_list prop_type_add pum_getpos rand readfile reltimefloat remote_read repeat screenattr screenrow searchpair setbufline setcmdline setline setreg sha256 sign_getplaced sign_unplace slice sound_playfile sqrt str2nr strftime strpart submatch synconcealed system tagfiles term_dumpdiff term_getattr term_getsize term_list term_setkill test_alloc_fail test_getvalue test_null_channel test_null_partial test_setmouse timer_info tolower type values winbufnr win_getid win_id2win winnr win_splitmove
+syn keyword vimFuncName contained acos argidx assert_equalfile assert_nobeep atan2 balloon_split buflisted bufwinnr changenr ch_close ch_getjob ch_readblob cindent complete_info cscope_connection did_filetype digraph_setlist eventhandler exp feedkeys flatten fnamemodify foreground getbufinfo getchar getcmdline getcurpos getfsize getloclist getpos gettabinfo getwinpos globpath histdel hlset input insert islocked job_start json_decode libcallnr listener_add luaeval mapset matchend max nextnonblank popup_beval popup_filter_menu popup_getoptions popup_menu popup_show prompt_setcallback prop_clear prop_type_change pumvisible range reduce reltimestr remote_send resolve screenchar screenstring searchpairpos setbufvar setcmdpos setloclist settabvar shellescape sign_jump sign_unplacelist sort sound_stop srand strcharlen strgetchar strptime substitute synID systemlist taglist term_dumpload term_getcursor term_getstatus term_scrape term_setrestore test_autochdir test_gui_event test_null_dict test_null_string test_settime timer_pause toupper typename virtcol wincol win_gettype winlayout winrestcmd winwidth
+syn keyword vimFuncName contained add arglistid assert_exception assert_notequal autocmd_add blob2list bufload byte2line char2nr ch_close_in ch_info ch_readraw clearmatches confirm cursor diff_filler echoraw executable expand filereadable flattennew foldclosed fullcommand getbufline getcharmod getcmdpos getcursorcharpos getftime getmarklist getqflist gettabvar getwinposx has histget hostname inputdialog interrupt isnan job_status json_encode line listener_flush map match matchfuzzy menu_info nr2char popup_clear popup_filter_yesno popup_getpos popup_move pow prompt_setinterrupt prop_find prop_type_delete py3eval readblob reg_executing remote_expr remote_startserver reverse screenchars search searchpos setcellwidths setcursorcharpos setmatches settabwinvar shiftwidth sign_place simplify sound_clear spellbadword state strcharpart stridx strridx swapfilelist synIDattr tabpagebuflist tan term_dumpwrite term_getjob term_gettitle term_sendkeys term_setsize test_feedinput test_ignore_error test_null_function test_option_not_set test_srand_seed timer_start tr undofile virtcol2col windowsversion win_gotoid winline winrestview wordcount
+syn keyword vimFuncName contained and argv assert_fails assert_notmatch autocmd_delete browse bufloaded byteidx charclass chdir ch_log ch_sendexpr col copy debugbreak diff_hlID empty execute expandcmd filewritable float2nr foldclosedend funcref getbufoneline getcharpos getcmdscreenpos getcwd getftype getmatches getreg gettabwinvar getwinposy has_key histnr iconv inputlist invert items job_stop keys line2byte listener_remove maparg matchadd matchfuzzypos min or popup_close popup_findecho popup_hide popup_notification prevnonblank prompt_setprompt prop_list prop_type_get pyeval readdir reg_recording remote_foreground remove round screencol searchcount server2client setcharpos setenv setpos settagstack sign_define sign_placelist sin soundfold spellsuggest str2float strchars string strtrans swapinfo synIDtrans tabpagenr tanh term_getaltscreen term_getline term_gettty term_setansicolors term_start test_garbagecollect_now test_mswin_event test_null_job test_override test_unknown timer_stop trim undotree visualmode win_execute winheight win_move_separator winsaveview writefile
+syn keyword vimFuncName contained append asin assert_false assert_report autocmd_get browsedir bufname byteidxcomp charcol ch_evalexpr ch_logfile ch_sendraw complete cos deepcopy digraph_get environ exepath expr10 filter floor foldlevel function getbufvar getcharsearch getcmdtype getenv getimstatus getmousepos getreginfo gettagstack getwinvar haslocaldir hlexists indent inputrestore isabsolutepath job_getchannel join keytrans lispindent localtime mapcheck matchaddpos matchlist mkdir pathshorten popup_create popup_findinfo popup_list popup_setoptions printf prop_add prop_remove prop_type_list pyxeval readdirex reltime remote_peek rename rubyeval screenpos searchdecl serverlist setcharsearch setfperm setqflist setwinvar sign_getdefined sign_undefine sinh sound_playevent split str2list strdisplaywidth strlen strwidth swapname synstack tabpagewinnr tempname term_getansicolors term_getscrolled terminalprops term_setapi term_wait test_garbagecollect_soon test_null_blob test_null_list test_refcount test_void timer_stopall trunc uniq wildmenumode win_findbuf win_id2tabwin win_move_statusline win_screenpos xor
+syn keyword vimFuncName contained appendbufline assert_beeps assert_inrange assert_true balloon_gettext bufadd bufnr call charidx ch_evalraw ch_open ch_setoptions complete_add cosh delete digraph_getlist escape exists extend finddir fmod foldtext garbagecollect getcellwidths getcharstr getcmdwintype getfontname getjumplist getmouseshape getregtype gettext glob hasmapto hlget index inputsave isdirectory job_info js_decode len list2blob log maplist matcharg matchstr mode perleval
+
+"--- syntax here and above generated by mkvimvim ---
+" Special Vim Highlighting (not automatic) {{{1
+
+" Set up folding commands {{{2
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# '[afhlmpPrt]'
+ 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 =~# 'h'
+ com! -nargs=* VimFoldh <args> fold
+ else
+ com! -nargs=* VimFoldh <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=* VimFoldh <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) {{{2
+syn keyword vimCommand contained py3
+
+" Deprecated variable options {{{2
+if exists("g:vim_minlines")
+ let g:vimsyn_minlines= g:vim_minlines
+endif
+if exists("g:vim_maxlines")
+ let g:vimsyn_maxlines= g:vim_maxlines
+endif
+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,vimComment,vim9Comment
+syn match vimNumber '-\d\+\%(\.\d\+\%([eE][+-]\=\d\+\)\=\)\=' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0[xX]\x\+' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\%(^\|\A\)\zs#\x\{6}' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
+syn match vimNumber '\<0[zZ][a-zA-Z0-9.]\+' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
+syn match vimNumber '0[0-7]\+' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
+syn match vimNumber '0[bB][01]\+' skipwhite nextgroup=vimGlobal,vimSubst,vimCommand,vimComment,vim9Comment
+
+" All vimCommands are contained by vimIsCommand. {{{2
+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
+" (buftype != nofile test avoids having append, change, insert show up in the command window)
+" =======================
+if &buftype != 'nofile'
+ 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="^\.$""
+endif
+
+" Behave! {{{2
+" =======
+syn match vimBehave "\<be\%[have]\>" skipwhite nextgroup=vimBehaveModel,vimBehaveError
+syn keyword vimBehaveModel contained mswin xterm
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nobehaveerror")
+ syn match vimBehaveError contained "[^ ]\+"
+endif
+
+" Filetypes {{{2
+" =========
+syn match vimFiletype "\<filet\%[ype]\(\s\+\I\i*\)*" skipwhite contains=vimFTCmd,vimFTOption,vimFTError
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_vimFTError")
+ syn match vimFTError contained "\I\i*"
+endif
+syn keyword vimFTCmd contained filet[ype]
+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,vimUserCmd,vimExecute,vimNotFunc,vimFuncName,vimFunction,vimFunctionError,vimLineComment,vimNotFunc,vimMap,vimSpecFile,vimOper,vimNumber,vimOperParen,vimComment,vim9Comment,vimString,vimSubst,vimMark,vimRegister,vimAddress,vimFilter,vimCmplxRepeat,vimComment,vim9Comment,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
+endif
+syn match vimAugroup "aug\%[roup]!" contains=vimAugroupKey
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noaugrouperror")
+ syn match vimAugroupError "\<aug\%[roup]\>\s\+[eE][nN][dD]\>"
+endif
+syn keyword vimAugroupKey contained aug[roup]
+
+" Operators: {{{2
+" =========
+syn cluster vimOperGroup contains=vimEnvvar,vimFunc,vimFuncVar,vimOper,vimOperParen,vimNumber,vimString,vimType,vimRegister,vimContinue,vim9Comment,vimVar
+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 region vimOperParen matchgroup=vimParenSep start="(" end=")" contains=vimoperStar,@vimOperGroup
+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
+
+" 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,vim9Comment,vimContinue,vimCtrlChar,vimEcho,vimEchoHL,vimEnvvar,vimExecute,vimIsCommand,vimFBVar,vimFunc,vimFunction,vimFuncVar,vimGlobal,vimHighlight,vimIsCommand,vimLet,vimLetHereDoc,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
+syn match vimFunction "\<def!\=\s\+\%(\i\|[#.]\|{.\{-1,}}\)*\ze\s*(" contains=@vimFuncList nextgroup=vimFuncBody
+"syn match vimFunction "\<def!\=\ze\s*(" contains=@vimFuncList nextgroup=vimFuncBody
+
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f'
+ syn region vimFuncBody contained fold start="\ze\s*(" matchgroup=vimCommand end="\<\(endf\>\|endfu\%[nction]\>\|enddef\>\)" contains=@vimFuncBodyList
+else
+ syn region vimFuncBody contained start="\ze\s*(" matchgroup=vimCommand end="\<\(endf\>\|endfu\%[nction]\>\|enddef\>\)" contains=@vimFuncBodyList
+endif
+syn match vimFuncVar contained "a:\(\K\k*\|\d\+\)"
+syn match vimFuncSID contained "\c<sid>\|\<s:"
+syn keyword vimFuncKey contained fu[nction]
+syn keyword vimFuncKey contained def
+syn match vimFuncBlank contained "\s\+"
+
+syn keyword vimPattern contained start skip end
+
+" vimTypes : new for vim9
+syn match vimType ":\s*\zs\<\(bool\|number\|float\|string\|blob\|list<\|dict<\|job\|channel\|func\)\>"
+
+" Special Filenames, Modifiers, Extension Removal: {{{2
+" ===============================================
+syn match vimSpecFile "<c\(word\|WORD\)>" nextgroup=vimSpecFileMod,vimSubst
+syn match vimSpecFile "<\([acs]file\|amatch\|abuf\)>" nextgroup=vimSpecFileMod,vimSubst
+syn match vimSpecFile "\s%[ \t:]"ms=s+1,me=e-1 nextgroup=vimSpecFileMod,vimSubst
+syn match vimSpecFile "\s%$"ms=s+1 nextgroup=vimSpecFileMod,vimSubst
+syn match vimSpecFile "\s%<"ms=s+1,me=e-1 nextgroup=vimSpecFileMod,vimSubst
+syn match vimSpecFile "#\d\+\|[#%]<\>" nextgroup=vimSpecFileMod,vimSubst
+syn match vimSpecFileMod "\(:[phtre]\)\+" contained
+
+" User-Specified Commands: {{{2
+" =======================
+syn cluster vimUserCmdList contains=vimAddress,vimSyntax,vimHighlight,vimAutoCmd,vimCmplxRepeat,vimComment,vim9Comment,vimCtrlChar,vimEscapeBrace,vimFunc,vimFuncName,vimFunction,vimFunctionError,vimIsCommand,vimMark,vimNotation,vimNumber,vimOper,vimRegion,vimRegister,vimLet,vimSet,vimSetEqual,vimSetString,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange,vimSynLine
+syn keyword vimUserCommand contained com[mand]
+syn match vimUserCmd "\<com\%[mand]!\=\>.*$" contains=vimUserAttrb,vimUserAttrbError,vimUserCommand,@vimUserCmdList,vimComFilter
+syn match vimUserAttrbError contained "-\a\+\ze\s"
+syn match vimUserAttrb contained "-nargs=[01*?+]" contains=vimUserAttrbKey,vimOper
+syn match vimUserAttrb contained "-complete=" contains=vimUserAttrbKey,vimOper nextgroup=vimUserAttrbCmplt,vimUserCmdError
+syn match vimUserAttrb contained "-range\(=%\|=\d\+\)\=" contains=vimNumber,vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-count\(=\d\+\)\=" contains=vimNumber,vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-bang\>" contains=vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-bar\>" contains=vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-buffer\>" contains=vimOper,vimUserAttrbKey
+syn match vimUserAttrb contained "-register\>" contains=vimOper,vimUserAttrbKey
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror")
+ syn match vimUserCmdError contained "\S\+\>"
+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 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
+
+syn case match
+syn match vimUserAttrbCmplt contained "custom,\u\w*"
+
+" Lower Priority Comments: after some vim commands... {{{2
+" =======================
+syn match vimComment excludenl +\s"[^\-:.%#=*].*$+lc=1 contains=@vimCommentGroup,vimCommentString
+syn match vimComment +\<endif\s\+".*$+lc=5 contains=@vimCommentGroup,vimCommentString
+syn match vimComment +\<else\s\+".*$+lc=4 contains=@vimCommentGroup,vimCommentString
+syn region vimCommentString contained oneline start='\S\s\+"'ms=e end='"'
+" Vim9 comments - TODO: might be highlighted while they don't work
+syn match vim9Comment excludenl +\s#[^{].*$+lc=1 contains=@vimCommentGroup,vimCommentString
+syn match vim9Comment +\<endif\s\+#[^{].*$+lc=5 contains=@vimCommentGroup,vimCommentString
+syn match vim9Comment +\<else\s\+#[^{].*$+lc=4 contains=@vimCommentGroup,vimCommentString
+" Vim9 comment inside expression
+syn match vim9Comment +\s\zs#[^{].*$+ms=s+1 contains=@vimCommentGroup,vimCommentString
+syn match vim9Comment +^\s*#[^{].*$+ contains=@vimCommentGroup,vimCommentString
+syn match vim9Comment +^\s*#$+ contains=@vimCommentGroup,vimCommentString
+
+" Environment Variables: {{{2
+" =====================
+syn match vimEnvvar "\$\I\i*"
+syn match vimEnvvar "\${\I\i*}"
+
+" In-String Specials: {{{2
+" Try to catch strings, if nothing else matches (therefore it must precede the others!)
+" vimEscapeBrace handles ["] []"] (ie. "s don't terminate string inside [])
+syn region vimEscapeBrace oneline contained transparent start="[^\\]\(\\\\\)*\[\zs\^\=\]\=" skip="\\\\\|\\\]" end="]"me=e-1
+syn match vimPatSepErr contained "\\)"
+syn match vimPatSep contained "\\|"
+syn region vimPatSepZone oneline contained matchgroup=vimPatSepZ start="\\%\=\ze(" skip="\\\\" end="\\)\|[^\\]['"]" contains=@vimStringGroup
+syn region vimPatRegion contained transparent matchgroup=vimPatSepR start="\\[z%]\=(" end="\\)" contains=@vimSubstList oneline
+syn match vimNotPatSep contained "\\\\"
+syn cluster vimStringGroup contains=vimEscape,vimEscapeBrace,vimPatSep,vimNotPatSep,vimPatSepErr,vimPatSepZone,@Spell
+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 " see tst45.vim
+syn match vimString contained +"[^"]*\\$+ skipnl nextgroup=vimStringCont
+syn match vimStringCont contained +\(\\\\\|.\)\{-}[^\\]"+
+syn match vimEscape contained "\\."
+
+" Substitutions: {{{2
+" =============
+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 "\%(^\|[^\\\"']\)\<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 "\%#=1\[:\(alnum\|alpha\|blank\|cntrl\|digit\|graph\|lower\|print\|punct\|space\|upper\|xdigit\|retu\%[rn]\|tab\|escape\|backspace\):\]"
+syn match vimSubstSubstr contained "\\z\=\d"
+syn match vimSubstTwoBS contained "\\\\"
+syn match vimSubstFlagErr contained "[^< \t\r|]\+" contains=vimSubstFlags
+syn match vimSubstFlags contained "[&cegiIlnpr#]\+"
+
+" 'String': {{{2
+syn match vimString "[^(,]'[^']\{-}\zs'"
+
+" Marks, Registers, Addresses, Filters: {{{2
+syn match vimMark "'[a-zA-Z0-9]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst
+syn match vimMark "'[<>]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst
+syn match vimMark ",\zs'[<>]\ze" nextgroup=vimFilter,vimMarkNumber,vimSubst
+syn match vimMark "[!,:]\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst
+syn match vimMark "\<norm\%[al]\s\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst
+syn match vimMarkNumber "[-+]\d\+" contained contains=vimOper nextgroup=vimSubst2
+syn match vimPlainMark contained "'[a-zA-Z0-9]"
+syn match vimRange "[`'][a-zA-Z0-9],[`'][a-zA-Z0-9]" contains=vimMark skipwhite nextgroup=vimFilter
+
+syn match vimRegister '[^,;[{: \t]\zs"[a-zA-Z0-9.%#:_\-/]\ze[^a-zA-Z_":0-9]'
+syn match vimRegister '\<norm\s\+\zs"[a-zA-Z0-9]'
+syn match vimRegister '\<normal\s\+\zs"[a-zA-Z0-9]'
+syn match vimRegister '@"'
+syn match vimPlainRegister contained '"[a-zA-Z0-9\-:.%#*+=]'
+
+syn match vimAddress ",\zs[.$]" skipwhite nextgroup=vimSubst1
+syn match vimAddress "%\ze\a" skipwhite nextgroup=vimString,vimSubst1
+
+syn match vimFilter "^!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile
+syn match vimFilter contained "!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile
+syn match vimComFilter contained "|!!\=[^"]\{-}\(|\|\ze\"\|$\)" contains=vimOper,vimSpecFile
+
+" Complex Repeats: (:h complex-repeat) {{{2
+" ===============
+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="\%(\\\\\)*\\.\n\@!" end="$" end="|" matchgroup=vimNotation end="<[cC][rR]>" keepend contains=vimSetEqual,vimOption,vimErrSetting,vimComment,vim9Comment,vimSetString,vimSetMod
+syn region vimSetEqual contained start="[=:]\|[-+^]=" skip="\\\\\|\\\s" end="[| \t]"me=e-1 end="$" contains=vimCtrlChar,vimSetSep,vimNotation,vimEnvvar
+syn region vimSetString contained start=+="+hs=s+1 skip=+\\\\\|\\"+ end=+"+ contains=vimCtrlChar
+syn match vimSetSep contained "[,:]"
+syn match vimSetMod contained "&vim\=\|[!&?<]\|all&"
+
+" Let: {{{2
+" ===
+syn keyword vimLet let unl[et] skipwhite nextgroup=vimVar,vimFuncVar,vimLetHereDoc
+VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\s\+\%(trim\s\+\)\=\%(eval\s\+\)\=\s*\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\s*\z1\s*$'
+
+" Abbreviations: {{{2
+" =============
+syn keyword vimAbb ab[breviate] ca[bbrev] inorea[bbrev] cnorea[bbrev] norea[bbrev] ia[bbrev] skipwhite nextgroup=vimMapMod,vimMapLhs
+
+" Autocmd: {{{2
+" =======
+syn match vimAutoEventList contained "\(!\s\+\)\=\(\a\+,\)*\a\+" contains=vimAutoEvent nextgroup=vimAutoCmdSpace
+syn match vimAutoCmdSpace contained "\s\+" nextgroup=vimAutoCmdSfxList
+syn match vimAutoCmdSfxList contained "\S*" skipwhite nextgroup=vimAutoCmdMod
+syn keyword vimAutoCmd au[tocmd] do[autocmd] doautoa[ll] skipwhite nextgroup=vimAutoEventList
+syn match vimAutoCmdMod "\(++\)\=\(once\|nested\)"
+
+" Echo And Execute: -- prefer strings! {{{2
+" ================
+syn region vimEcho oneline excludenl matchgroup=vimCommand start="\<ec\%[ho]\>" skip="\(\\\\\)*\\|" end="$\||" contains=vimFunc,vimFuncVar,vimString,vimVar
+syn region vimExecute oneline excludenl matchgroup=vimCommand start="\<exe\%[cute]\>" skip="\(\\\\\)*\\|" end="$\||\|<[cC][rR]>" contains=vimFuncVar,vimIsCommand,vimOper,vimNotation,vimOperParen,vimString,vimVar
+syn match vimEchoHL "echohl\=" skipwhite nextgroup=vimGroup,vimHLGroup,vimEchoHLNone
+syn case ignore
+syn keyword vimEchoHLNone none
+syn case match
+
+" Maps: {{{2
+" ====
+syn match vimMap "\<map\>!\=\ze\s*[^(]" skipwhite nextgroup=vimMapMod,vimMapLhs
+syn keyword vimMap cm[ap] cno[remap] im[ap] ino[remap] lm[ap] ln[oremap] nm[ap] nn[oremap] no[remap] om[ap] ono[remap] smap snor[emap] tno[remap] tm[ap] vm[ap] vmapc[lear] vn[oremap] xm[ap] xn[oremap] skipwhite nextgroup=vimMapBang,vimMapMod,vimMapLhs
+syn keyword vimMap mapc[lear] smapc[lear]
+syn keyword vimUnmap cu[nmap] iu[nmap] lu[nmap] nun[map] ou[nmap] sunm[ap] tunma[p] unm[ap] unm[ap] vu[nmap] xu[nmap] 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 "\%#=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
+syn keyword vimMapModKey contained buffer expr leader localleader nowait plug script sid silent unique
+syn case match
+
+" Menus: {{{2
+" =====
+syn cluster vimMenuList contains=vimMenuBang,vimMenuPriority,vimMenuName,vimMenuMod
+syn keyword vimCommand am[enu] an[oremenu] aun[menu] cme[nu] cnoreme[nu] cunme[nu] ime[nu] inoreme[nu] iunme[nu] me[nu] nme[nu] nnoreme[nu] noreme[nu] nunme[nu] ome[nu] onoreme[nu] ounme[nu] unme[nu] vme[nu] vnoreme[nu] vunme[nu] skipwhite nextgroup=@vimMenuList
+syn match vimMenuName "[^ \t\\<]\+" contained nextgroup=vimMenuNameMore,vimMenuMap
+syn match vimMenuPriority "\d\+\(\.\d\+\)*" contained skipwhite nextgroup=vimMenuName
+syn match vimMenuNameMore "\c\\\s\|<tab>\|\\\." contained nextgroup=vimMenuName,vimMenuNameMore contains=vimNotation
+syn match vimMenuMod contained "\c<\(script\|silent\)\+>" skipwhite contains=vimMapModKey,vimMapModErr nextgroup=@vimMenuList
+syn match vimMenuMap "\s" contained skipwhite nextgroup=vimMenuRhs
+syn match vimMenuRhs ".*$" contained contains=vimString,vimComment,vim9Comment,vimIsCommand
+syn match vimMenuBang "!" contained skipwhite nextgroup=@vimMenuList
+
+" Angle-Bracket Notation: (tnx to Michael Geddes) {{{2
+" ======================
+syn case ignore
+syn match vimNotation "\%#=1\(\\\|<lt>\)\=<\([scamd]-\)\{0,4}x\=\(f\d\{1,2}\|[^ \t:]\|cmd\|cr\|lf\|linefeed\|retu\%[rn]\|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]>\)\=\%(\w\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*(" contains=vimFuncEcho,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 keyword vimFuncEcho contained ec ech echo
+
+" User Command Highlighting: {{{2
+syn match vimUsrCmd '^\s*\zs\u\%(\w*\)\@>\%([(#[]\|\s\+\%([-+*/%]\=\|\.\.\)=\)\@!'
+
+" 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]:\)\d\i\{-}\ze\s*(" contained contains=vimFuncKey,vimFuncBlank
+ syn match vimElseIfErr "\<else\s\+if\>"
+ syn match vimBufnrWarn /\<bufnr\s*(\s*["']\.['"]\s*)/
+endif
+
+syn match vimNotFunc "\<if\>\|\<el\%[seif]\>\|\<retu\%[rn]\>\|\<while\>" skipwhite nextgroup=vimOper,vimOperParen,vimVar,vimFunc,vimNotation
+
+" Norm: {{{2
+" ====
+syn match vimNorm "\<norm\%[al]!\=" skipwhite nextgroup=vimNormCmds
+syn match vimNormCmds contained ".*$"
+
+" Syntax: {{{2
+"=======
+syn match vimGroupList contained "@\=[^ \t,]*" contains=vimGroupSpecial,vimPatSep
+syn match vimGroupList contained "@\=[^ \t,]*," nextgroup=vimGroupList contains=vimGroupSpecial,vimPatSep
+syn keyword vimGroupSpecial contained ALL ALLBUT CONTAINED TOP
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsynerror")
+ syn match vimSynError contained "\i\+"
+ syn match vimSynError contained "\i\+=" nextgroup=vimGroupList
+endif
+syn match vimSynContains contained "\<contain\(s\|edin\)=" nextgroup=vimGroupList
+syn match vimSynKeyContainedin contained "\<containedin=" nextgroup=vimGroupList
+syn match vimSynNextgroup contained "nextgroup=" nextgroup=vimGroupList
+
+syn match vimSyntax "\<sy\%[ntax]\>" contains=vimCommand skipwhite nextgroup=vimSynType,vimComment,vim9Comment
+syn match vimAuSyntax contained "\s+sy\%[ntax]" contains=vimCommand skipwhite nextgroup=vimSynType,vimComment,vim9Comment
+syn cluster vimFuncBodyList add=vimSyntax
+
+" Syntax: case {{{2
+syn keyword vimSynType contained case skipwhite nextgroup=vimSynCase,vimSynCaseError
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsyncaseerror")
+ syn match vimSynCaseError contained "\i\+"
+endif
+syn keyword vimSynCase contained ignore match
+
+" Syntax: clear {{{2
+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="\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
+
+" 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="\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,vim9Comment
+syn keyword vimSynType contained match skipwhite nextgroup=vimSynMatchRegion
+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"
+endif
+syn cluster vimFuncBodyList add=vimSynMtchGroup
+
+" Syntax: off and on {{{2
+syn keyword vimSynType contained enable list manual off on reset
+
+" Syntax: region {{{2
+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="\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
+syn region vimSynRegPat contained extend start="\z([-`~!@#$%^&*_=+;:'",./?]\)" skip="\\\\\|\\\z1" end="\z1" contains=@vimSynRegPatGroup skipwhite nextgroup=vimSynPatMod,vimSynReg
+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="]"
+syn match vimSynNotPatRange contained "\\\\\|\\\["
+syn match vimMtchComment contained '"[^"]\+$'
+syn cluster vimFuncBodyList add=vimSynType
+
+" Syntax: sync {{{2
+" ============
+syn keyword vimSynType contained sync skipwhite nextgroup=vimSyncC,vimSyncLines,vimSyncMatch,vimSyncError,vimSyncLinebreak,vimSyncLinecont,vimSyncRegion
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimsyncerror")
+ syn match vimSyncError contained "\i\+"
+endif
+syn keyword vimSyncC contained ccomment clear fromstart
+syn keyword vimSyncMatch contained match skipwhite nextgroup=vimSyncGroupName
+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 "\h\w*" skipwhite nextgroup=vimSyncKey
+syn match vimSyncKey contained "\<groupthere\|grouphere\>" skipwhite nextgroup=vimSyncGroup
+syn match vimSyncGroup contained "\h\w*" skipwhite nextgroup=vimSynRegPat,vimSyncNone
+syn keyword vimSyncNone contained NONE
+
+" Additional IsCommand: here by reasons of precedence {{{2
+" ====================
+syn match vimIsCommand "<Bar>\s*\a\+" transparent contains=vimCommand,vimNotation
+
+" Highlighting: {{{2
+" ============
+syn cluster vimHighlightCluster contains=vimHiLink,vimHiClear,vimHiKeyList,vimComment,vim9Comment
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_novimhictermerror")
+ 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 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
+syn match vimHiAttribList contained "\i\+,"he=e-1 contains=vimHiAttrib nextgroup=vimHiAttribList
+syn case ignore
+syn keyword vimHiCtermColor contained black blue brown cyan darkblue darkcyan darkgray darkgreen darkgrey darkmagenta darkred darkyellow gray green grey grey40 grey50 grey90 lightblue lightcyan lightgray lightgreen lightgrey lightmagenta lightred lightyellow magenta red seagreen white yellow
+syn match vimHiCtermColor contained "\<color\d\{1,3}\>"
+
+syn case match
+syn match vimHiFontname contained "[a-zA-Z\-*]\+"
+syn match vimHiGuiFontname contained "'[a-zA-Z\-* ]\+'"
+syn match vimHiGuiRgb contained "#\x\{6}"
+
+" Highlighting: hi group key=arg ... {{{2
+syn cluster vimHiCluster contains=vimGroup,vimHiGroup,vimHiTerm,vimHiCTerm,vimHiStartStop,vimHiCtermFgBg,vimHiCtermul,vimHiGui,vimHiGuiFont,vimHiGuiFgBg,vimHiKeyError,vimNotation
+syn region vimHiKeyList contained oneline start="\i\+" skip="\\\\\|\\|" end="$\||" contains=@vimHiCluster
+if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_vimhikeyerror")
+ syn match vimHiKeyError contained "\i\+="he=e-1
+endif
+syn match vimHiTerm contained "\cterm="he=e-1 nextgroup=vimHiAttribList
+syn match vimHiStartStop contained "\c\(start\|stop\)="he=e-1 nextgroup=vimHiTermcap,vimOption
+syn match vimHiCTerm contained "\ccterm="he=e-1 nextgroup=vimHiAttribList
+syn match vimHiCtermFgBg contained "\ccterm[fb]g="he=e-1 nextgroup=vimHiNmbr,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError
+syn match vimHiCtermul contained "\cctermul="he=e-1 nextgroup=vimHiNmbr,vimHiCtermColor,vimFgBgAttrib,vimHiCtermError
+syn match vimHiGui contained "\cgui="he=e-1 nextgroup=vimHiAttribList
+syn match vimHiGuiFont contained "\cfont="he=e-1 nextgroup=vimHiFontname
+syn match vimHiGuiFgBg contained "\cgui\%([fb]g\|sp\)="he=e-1 nextgroup=vimHiGroup,vimHiGuiFontname,vimHiGuiRgb,vimFgBgAttrib
+syn match vimHiTermcap contained "\S\+" contains=vimNotation
+syn match vimHiNmbr contained '\d\+'
+
+" Highlight: clear {{{2
+syn keyword vimHiClear contained clear nextgroup=vimHiGroup
+
+" Highlight: link {{{2
+" 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
+" ==================
+syn match vimCtrlChar "[- -]"
+
+" Beginners - Patterns that involve ^ {{{2
+" =========
+syn match vimLineComment +^[ \t:]*".*$+ contains=@vimCommentGroup,vimCommentString,vimCommentTitle,vimComment
+syn match vimLineComment +^[ \t:]*"\("[^"]*"\|[^"]\)*$+ contains=@vimCommentGroup,vimCommentString,vimCommentTitle
+syn match vim9LineComment +^[ \t:]\+#.*$+ contains=@vimCommentGroup,vimCommentString,vimCommentTitle
+syn match vimCommentTitle '"\s*\%([sS]:\|\h\w*#\)\=\u\w*\(\s\+\u\w*\)*:'hs=s+1 contained contains=vimCommentTitleLeader,vimTodo,@vimCommentGroup
+syn match vimContinue "^\s*\\"
+syn region vimString start="^\s*\\\z(['"]\)" skip='\\\\\|\\\z1' end="\z1" oneline keepend contains=@vimStringGroup,vimContinue
+syn match vimCommentTitleLeader '"\s\+'ms=s+1 contained
+
+" Searches And Globals: {{{2
+" ====================
+syn match vimSearch '^\s*[/?].*' contains=vimSearchDelim
+syn match vimSearchDelim '^\s*\zs[/?]\|[/?]$' contained
+syn region vimGlobal matchgroup=Statement start='\<g\%[lobal]!\=/' skip='\\.' end='/' skipwhite nextgroup=vimSubst
+syn region vimGlobal matchgroup=Statement start='\<v\%[global]!\=/' skip='\\.' end='/' skipwhite nextgroup=vimSubst
+
+" Embedded Scripts: {{{2
+" ================
+" perl,ruby : Benoit Cerrina
+" python,tcl : Johannes Zellner
+" mzscheme, lua : Charles Campbell
+
+" 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 =~# 'l' : embed lua (but only if vim supports it)
+" g:vimsyn_embed =~# 'm' : embed mzscheme (but only if vim supports it)
+" g:vimsyn_embed =~# 'p' : embed perl (but only if vim supports it)
+" g:vimsyn_embed =~# 'P' : embed python (but only if vim supports it)
+" g:vimsyn_embed =~# 'r' : embed ruby (but only if vim supports it)
+" g:vimsyn_embed =~# 't' : embed tcl (but only if vim supports it)
+if !exists("g:vimsyn_embed")
+ let g:vimsyn_embed= "lmpPr"
+endif
+
+" [-- lua --] {{{3
+let s:luapath= fnameescape(expand("<sfile>:p:h")."/lua.vim")
+if !filereadable(s:luapath)
+ for s:luapath in split(globpath(&rtp,"syntax/lua.vim"),"\n")
+ if filereadable(fnameescape(s:luapath))
+ let s:luapath= fnameescape(s:luapath)
+ break
+ endif
+ endfor
+endif
+if (g:vimsyn_embed =~# 'l' && has("lua")) && 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
+let s:perlpath= fnameescape(expand("<sfile>:p:h")."/perl.vim")
+if !filereadable(s:perlpath)
+ for s:perlpath in split(globpath(&rtp,"syntax/perl.vim"),"\n")
+ if filereadable(fnameescape(s:perlpath))
+ let s:perlpath= fnameescape(s:perlpath)
+ break
+ endif
+ endfor
+endif
+if (g:vimsyn_embed =~# 'p' && has("perl")) && filereadable(s:perlpath)
+ unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimPerlRegion
+ exe "syn include @vimPerlScript ".s:perlpath
+ 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
+let s:rubypath= fnameescape(expand("<sfile>:p:h")."/ruby.vim")
+if !filereadable(s:rubypath)
+ for s:rubypath in split(globpath(&rtp,"syntax/ruby.vim"),"\n")
+ if filereadable(fnameescape(s:rubypath))
+ let s:rubypath= fnameescape(s:rubypath)
+ break
+ endif
+ endfor
+endif
+if (g:vimsyn_embed =~# 'r' && has("ruby")) && filereadable(s:rubypath)
+ syn cluster vimFuncBodyList add=vimRubyRegion
+ unlet! b:current_syntax
+ exe "syn include @vimRubyScript ".s:rubypath
+ 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
+let s:pythonpath= fnameescape(expand("<sfile>:p:h")."/python.vim")
+if !filereadable(s:pythonpath)
+ for s:pythonpath in split(globpath(&rtp,"syntax/python.vim"),"\n")
+ if filereadable(fnameescape(s:pythonpath))
+ let s:pythonpath= fnameescape(s:pythonpath)
+ break
+ endif
+ endfor
+endif
+if g:vimsyn_embed =~# 'P' && has("pythonx") && filereadable(s:pythonpath)
+ unlet! b:current_syntax
+ syn cluster vimFuncBodyList add=vimPythonRegion
+ exe "syn include @vimPythonScript ".s:pythonpath
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\%(trim\s*\)\=\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\%(trim\s*\)\=$+ end=+\.$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\%(trim\s*\)\=\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\=\s*<<\s*\%(trim\s*\)\=$+ end=+\.$+ contains=@vimPythonScript
+ syn cluster vimFuncBodyList add=vimPythonRegion
+else
+ syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+
+endif
+unlet s:pythonpath
+
+" [-- tcl --] {{{3
+if has("win32") || has("win95") || has("win64") || has("win16")
+ " apparently has("tcl") has been hanging vim on some windows systems with cygwin
+ let s:trytcl= (&shell !~ '\<\%(bash\>\|4[nN][tT]\|\<zsh\)\>\%(\.exe\)\=$')
+else
+ let s:trytcl= 1
+endif
+if s:trytcl
+ let s:tclpath= fnameescape(expand("<sfile>:p:h")."/tcl.vim")
+ if !filereadable(s:tclpath)
+ for s:tclpath in split(globpath(&rtp,"syntax/tcl.vim"),"\n")
+ if filereadable(fnameescape(s:tclpath))
+ let s:tclpath= fnameescape(s:tclpath)
+ break
+ endif
+ endfor
+ endif
+ if (g:vimsyn_embed =~# 't' && has("tcl")) && 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=+\.$+
+endif
+unlet s:trytcl
+
+" [-- mzscheme --] {{{3
+let s:mzschemepath= fnameescape(expand("<sfile>:p:h")."/scheme.vim")
+if !filereadable(s:mzschemepath)
+ for s:mzschemepath in split(globpath(&rtp,"syntax/mzscheme.vim"),"\n")
+ if filereadable(fnameescape(s:mzschemepath))
+ let s:mzschemepath= fnameescape(s:mzschemepath)
+ break
+ endif
+ endfor
+endif
+if (g:vimsyn_embed =~# 'm' && has("mzscheme")) && 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
+"============
+if exists("g:vimsyn_minlines")
+ exe "syn sync minlines=".g:vimsyn_minlines
+endif
+exe "syn sync maxlines=".s:vimsyn_maxlines
+syn sync linecont "^\s\+\\"
+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 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
+ endif
+
+ 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 vimAutoCmdMod Special
+ 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 vim9Comment 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 vimEscape Special
+ hi def link vimFBVar vimVar
+ hi def link vimFgBgAttrib vimHiAttrib
+ hi def link vimFuncEcho vimCommand
+ hi def link vimHiCtermul vimHiTerm
+ 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 vimLetHereDoc vimString
+ hi def link vimLetHereDocStart Special
+ hi def link vimLetHereDocStop Special
+ hi def link vimLineComment vimComment
+ hi def link vim9LineComment 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 vimOperStar vimOper
+ 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 vimType Type
+ 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
+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
new file mode 100644
index 0000000..667e1ba
--- /dev/null
+++ b/runtime/syntax/viminfo.vim
@@ -0,0 +1,48 @@
+" Vim syntax file
+" Language: Vim .viminfo file
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2016 Jun 05
+
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" The lines that are NOT recognized
+syn match viminfoError "^[^\t].*"
+
+" The one-character one-liners that are recognized
+syn match viminfoStatement "^[/&$@:?=%!<]"
+
+" The two-character one-liners that are recognized
+syn match viminfoStatement "^[-'>"]."
+syn match viminfoStatement +^"".+
+syn match viminfoStatement "^\~[/&]"
+syn match viminfoStatement "^\~[hH]"
+syn match viminfoStatement "^\~[mM][sS][lL][eE]\d\+\~\=[/&]"
+
+syn match viminfoOption "^\*.*=" contains=viminfoOptionName
+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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/virata.vim b/runtime/syntax/virata.vim
new file mode 100644
index 0000000..0ed54fa
--- /dev/null
+++ b/runtime/syntax/virata.vim
@@ -0,0 +1,207 @@
+" Vim syntax file
+" Language: Virata AConfig Configuration Script
+" Maintainer: Manuel M.H. Stol <mmh.stol@gmx.net>
+" Last Change: 2003 May 11
+" Vim URL: http://www.vim.org/lang.html
+" Virata URL: http://www.globespanvirata.com/
+
+
+" Virata AConfig Configuration Script syntax
+" Can be detected by: 1) Extension .hw, .sw, .pkg and .module
+" 2) The file name pattern "mk.*\.cfg"
+" 3) The string "Virata" in the first 5 lines
+
+
+" Setup Syntax:
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+" Virata syntax is case insensitive (mostly)
+syn case ignore
+
+
+
+" Comments:
+" Virata comments start with %, but % is not a keyword character
+syn region virataComment start="^%" start="\s%"lc=1 keepend end="$" contains=@virataGrpInComments
+syn region virataSpclComment start="^%%" start="\s%%"lc=1 keepend end="$" contains=@virataGrpInComments
+syn keyword virataInCommentTodo contained TODO FIXME XXX[XXXXX] REVIEW TBD
+syn cluster virataGrpInComments contains=virataInCommentTodo
+syn cluster virataGrpComments contains=@virataGrpInComments,virataComment,virataSpclComment
+
+
+" Constants:
+syn match virataStringError +["]+
+syn region virataString start=+"+ skip=+\(\\\\\|\\"\)+ end=+"+ oneline contains=virataSpclCharError,virataSpclChar,@virataGrpDefSubsts
+syn match virataCharacter +'[^']\{-}'+ contains=virataSpclCharError,virataSpclChar
+syn match virataSpclChar contained +\\\(x\x\+\|\o\{1,3}\|['\"?\\abefnrtv]\)+
+syn match virataNumberError "\<\d\{-1,}\I\{-1,}\>"
+syn match virataNumberError "\<0x\x*\X\x*\>"
+syn match virataNumberError "\<\d\+\.\d*\(e[+-]\=\d\+\)\=\>"
+syn match virataDecNumber "\<\d\+U\=L\=\>"
+syn match virataHexNumber "\<0x\x\+U\=L\=\>"
+syn match virataSizeNumber "\<\d\+[BKM]\>"he=e-1
+syn match virataSizeNumber "\<\d\+[KM]B\>"he=e-2
+syn cluster virataGrpNumbers contains=virataNumberError,virataDecNumber,virataHexNumber,virataSizeNumber
+syn cluster virataGrpConstants contains=@virataGrpNumbers,virataStringError,virataString,virataCharacter,virataSpclChar
+
+
+" Identifiers:
+syn match virataIdentError contained "\<\D\S*\>"
+syn match virataIdentifier contained "\<\I\i\{-}\(\-\i\{-1,}\)*\>" contains=@virataGrpDefSubsts
+syn match virataFileIdent contained "\F\f*" contains=@virataGrpDefSubsts
+syn cluster virataGrpIdents contains=virataIdentifier,virataIdentError
+syn cluster virataGrpFileIdents contains=virataFileIdent,virataIdentError
+
+
+" Statements:
+syn match virataStatement "^\s*Config\(\(/Kernel\)\=\.\(hs\=\|s\)\)\=\>"
+syn match virataStatement "^\s*Config\s\+\I\i\{-}\(\-\i\{-1,}\)*\.\(hs\=\|s\)\>"
+syn match virataStatement "^\s*Make\.\I\i\{-}\(\-\i\{-1}\)*\>" skipwhite nextgroup=@virataGrpIdents
+syn match virataStatement "^\s*Make\.c\(at\)\=++\s"me=e-1 skipwhite nextgroup=@virataGrpIdents
+syn match virataStatement "^\s*\(Architecture\|GetEnv\|Reserved\|\(Un\)\=Define\|Version\)\>" skipwhite nextgroup=@virataGrpIdents
+syn match virataStatement "^\s*\(Hardware\|ModuleSource\|\(Release\)\=Path\|Software\)\>" skipwhite nextgroup=@virataGrpFileIdents
+syn match virataStatement "^\s*\(DefaultPri\|Hydrogen\)\>" skipwhite nextgroup=virataDecNumber,virataNumberError
+syn match virataStatement "^\s*\(NoInit\|PCI\|SysLink\)\>"
+syn match virataStatement "^\s*Allow\s\+\(ModuleConfig\)\>"
+syn match virataStatement "^\s*NoWarn\s\+\(Export\|Parse\=able\|Relative]\)\>"
+syn match virataStatement "^\s*Debug\s\+O\(ff\|n\)\>"
+
+" Import (Package <exec>|Module <name> from <dir>)
+syn region virataImportDef transparent matchgroup=virataStatement start="^\s*Import\>" keepend end="$" contains=virataInImport,virataModuleDef,virataNumberError,virataStringError,@virataGrpDefSubsts
+syn match virataInImport contained "\<\(Module\|Package\|from\)\>" skipwhite nextgroup=@virataGrpFileIdents
+" Export (Header <header file>|SLibrary <obj file>)
+syn region virataExportDef transparent matchgroup=virataStatement start="^\s*Export\>" keepend end="$" contains=virataInExport,virataNumberError,virataStringError,@virataGrpDefSubsts
+syn match virataInExport contained "\<\(Header\|[SU]Library\)\>" skipwhite nextgroup=@virataGrpFileIdents
+" Process <name> is <dir/exec>
+syn region virataProcessDef transparent matchgroup=virataStatement start="^\s*Process\>" keepend end="$" contains=virataInProcess,virataInExec,virataNumberError,virataStringError,@virataGrpDefSubsts,@virataGrpIdents
+syn match virataInProcess contained "\<is\>"
+" Instance <name> of <module>
+syn region virataInstanceDef transparent matchgroup=virataStatement start="^\s*Instance\>" keepend end="$" contains=virataInInstance,virataNumberError,virataStringError,@virataGrpDefSubsts,@virataGrpIdents
+syn match virataInInstance contained "\<of\>"
+" Module <name> from <dir>
+syn region virataModuleDef transparent matchgroup=virataStatement start="^\s*\(Package\|Module\)\>" keepend end="$" contains=virataInModule,virataNumberError,virataStringError,@virataGrpDefSubsts
+syn match virataInModule contained "^\s*Package\>"hs=e-7 skipwhite nextgroup=@virataGrpIdents
+syn match virataInModule contained "^\s*Module\>"hs=e-6 skipwhite nextgroup=@virataGrpIdents
+syn match virataInModule contained "\<from\>" skipwhite nextgroup=@virataGrpFileIdents
+" Colour <name> from <dir>
+syn region virataColourDef transparent matchgroup=virataStatement start="^\s*Colour\>" keepend end="$" contains=virataInColour,virataNumberError,virataStringError,@virataGrpDefSubsts
+syn match virataInColour contained "^\s*Colour\>"hs=e-6 skipwhite nextgroup=@virataGrpIdents
+syn match virataInColour contained "\<from\>" skipwhite nextgroup=@virataGrpFileIdents
+" Link {<link cmds>}
+" Object {Executable [<ExecOptions>]}
+syn match virataStatement "^\s*\(Link\|Object\)"
+" Executable <name> [<ExecOptions>]
+syn region virataExecDef transparent matchgroup=virataStatement start="^\s*Executable\>" keepend end="$" contains=virataInExec,virataNumberError,virataStringError
+syn match virataInExec contained "^\s*Executable\>" skipwhite nextgroup=@virataGrpDefSubsts,@virataGrpIdents
+syn match virataInExec contained "\<\(epilogue\|pro\(logue\|cess\)\|qhandler\)\>" skipwhite nextgroup=@virataGrpDefSubsts,@virataGrpIdents
+syn match virataInExec contained "\<\(priority\|stack\)\>" skipwhite nextgroup=@virataGrpDefSubsts,@virataGrpNumbers
+" Message <name> {<msg format>}
+" MessageId <number>
+syn match virataStatement "^\s*Message\(Id\)\=\>" skipwhite nextgroup=@virataGrpNumbers
+" MakeRule <make suffix=file> {<make cmds>}
+syn region virataMakeDef transparent matchgroup=virataStatement start="^\s*MakeRule\>" keepend end="$" contains=virataInMake,@virataGrpDefSubsts
+syn case match
+syn match virataInMake contained "\<N\>"
+syn case ignore
+" (Append|Edit|Copy)Rule <make suffix=file> <subst cmd>
+syn match virataStatement "^\s*\(Append\|Copy\|Edit\)Rule\>"
+" AlterRules in <file> <subst cmd>
+syn region virataAlterDef transparent matchgroup=virataStatement start="^\s*AlterRules\>" keepend end="$" contains=virataInAlter,@virataGrpDefSubsts
+syn match virataInAlter contained "\<in\>" skipwhite nextgroup=@virataGrpIdents
+" Clustering
+syn cluster virataGrpInStatmnts contains=virataInImport,virataInExport,virataInExec,virataInProcess,virataInAlter,virataInInstance,virataInModule,virataInColour
+syn cluster virataGrpStatements contains=@virataGrpInStatmnts,virataStatement,virataImportDef,virataExportDef,virataExecDef,virataProcessDef,virataAlterDef,virataInstanceDef,virataModuleDef,virataColourDef
+
+
+" MkFlash.Cfg File Statements:
+syn region virataCfgFileDef transparent matchgroup=virataCfgStatement start="^\s*Dir\>" start="^\s*\a\{-}File\>" start="^\s*OutputFile\d\d\=\>" start="^\s*\a\w\{-}[NP]PFile\>" keepend end="$" contains=@virataGrpFileIdents
+syn region virataCfgSizeDef transparent matchgroup=virataCfgStatement start="^\s*\a\{-}Size\>" start="^\s*ConfigInfo\>" keepend end="$" contains=@virataGrpNumbers,@virataGrpDefSubsts,virataIdentError
+syn region virataCfgNumberDef transparent matchgroup=virataCfgStatement start="^\s*FlashchipNum\(b\(er\=\)\=\)\=\>" start="^\s*Granularity\>" keepend end="$" contains=@virataGrpNumbers,@virataGrpDefSubsts
+syn region virataCfgMacAddrDef transparent matchgroup=virataCfgStatement start="^\s*MacAddress\>" keepend end="$" contains=virataNumberError,virataStringError,virataIdentError,virataInMacAddr,@virataGrpDefSubsts
+syn match virataInMacAddr contained "\x[:]\x\{1,2}\>"lc=2
+syn match virataInMacAddr contained "\s\x\{1,2}[:]\x"lc=1,me=e-1,he=e-2 nextgroup=virataInMacAddr
+syn match virataCfgStatement "^\s*Target\>" skipwhite nextgroup=@virataGrpIdents
+syn cluster virataGrpCfgs contains=virataCfgStatement,virataCfgFileDef,virataCfgSizeDef,virataCfgNumberDef,virataCfgMacAddrDef,virataInMacAddr
+
+
+
+" PreProcessor Instructions:
+" Defines
+syn match virataDefine "^\s*\(Un\)\=Set\>" skipwhite nextgroup=@virataGrpIdents
+syn match virataInclude "^\s*Include\>" skipwhite nextgroup=@virataGrpFileIdents
+syn match virataDefSubstError "[^$]\$"lc=1
+syn match virataDefSubstError "\$\(\w\|{\(.\{-}}\)\=\)"
+syn case match
+syn match virataDefSubst "\$\(\d\|[DINORS]\|{\I\i\{-}\(\-\i\{-1,}\)*}\)"
+syn case ignore
+" Conditionals
+syn cluster virataGrpCntnPreCon contains=ALLBUT,@virataGrpInComments,@virataGrpFileIdents,@virataGrpInStatmnts
+syn region virataPreConDef transparent matchgroup=virataPreCondit start="^\s*If\>" end="^\s*Endif\>" contains=@virataGrpCntnPreCon
+syn match virataPreCondit contained "^\s*Else\(\s\+If\)\=\>"
+syn region virataPreConDef transparent matchgroup=virataPreCondit start="^\s*ForEach\>" end="^\s*Done\>" contains=@virataGrpCntnPreCon
+" Pre-Processors
+syn region virataPreProc start="^\s*Error\>" start="^\s*Warning\>" oneline end="$" contains=@virataGrpConstants,@virataGrpDefSubsts
+syn cluster virataGrpDefSubsts contains=virataDefSubstError,virataDefSubst
+syn cluster virataGrpPreProcs contains=@virataGrpDefSubsts,virataDefine,virataInclude,virataPreConDef,virataPreCondit,virataPreProc
+
+
+" Synchronize Syntax:
+syn sync clear
+syn sync minlines=50 "for multiple region nesting
+
+
+
+" Define the default highlighting.
+" 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"
+
+" vim:ts=8:sw=2:noet:
diff --git a/runtime/syntax/vmasm.vim b/runtime/syntax/vmasm.vim
new file mode 100644
index 0000000..c5cbb1e
--- /dev/null
+++ b/runtime/syntax/vmasm.vim
@@ -0,0 +1,238 @@
+" Vim syntax file
+" Language: (VAX) Macro Assembly
+" Maintainer: Tom Uijldert <tom.uijldert [at] cmg.nl>
+" Last change: 2004 May 16
+"
+" This is incomplete. Feel free to contribute...
+"
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Partial list of register symbols
+syn keyword vmasmReg r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12
+syn keyword vmasmReg ap fp sp pc iv dv
+
+" All matches - order is important!
+syn keyword vmasmOpcode adawi adwc ashl ashq bitb bitw bitl decb decw decl
+syn keyword vmasmOpcode ediv emul incb incw incl mcomb mcomw mcoml
+syn keyword vmasmOpcode movzbw movzbl movzwl popl pushl rotl sbwc
+syn keyword vmasmOpcode cmpv cmpzv cmpc3 cmpc5 locc matchc movc3 movc5
+syn keyword vmasmOpcode movtc movtuc scanc skpc spanc crc extv extzv
+syn keyword vmasmOpcode ffc ffs insv aobleq aoblss bbc bbs bbcci bbssi
+syn keyword vmasmOpcode blbc blbs brb brw bsbb bsbw caseb casew casel
+syn keyword vmasmOpcode jmp jsb rsb sobgeq sobgtr callg calls ret
+syn keyword vmasmOpcode bicpsw bispsw bpt halt index movpsl nop popr pushr xfc
+syn keyword vmasmOpcode insqhi insqti insque remqhi remqti remque
+syn keyword vmasmOpcode addp4 addp6 ashp cmpp3 cmpp4 cvtpl cvtlp cvtps cvtpt
+syn keyword vmasmOpcode cvtsp cvttp divp movp mulp subp4 subp6 editpc
+syn keyword vmasmOpcode prober probew rei ldpctx svpctx mfpr mtpr bugw bugl
+syn keyword vmasmOpcode vldl vldq vgathl vgathq vstl vstq vscatl vscatq
+syn keyword vmasmOpcode vvcvt iota mfvp mtvp vsync
+syn keyword vmasmOpcode beql[u] bgtr[u] blss[u]
+syn match vmasmOpcode "\<add[bwlfdgh][23]\>"
+syn match vmasmOpcode "\<bi[cs][bwl][23]\>"
+syn match vmasmOpcode "\<clr[bwlqofdgh]\>"
+syn match vmasmOpcode "\<cmp[bwlfdgh]\>"
+syn match vmasmOpcode "\<cvt[bwlfdgh][bwlfdgh]\>"
+syn match vmasmOpcode "\<cvtr[fdgh]l\>"
+syn match vmasmOpcode "\<div[bwlfdgh][23]\>"
+syn match vmasmOpcode "\<emod[fdgh]\>"
+syn match vmasmOpcode "\<mneg[bwlfdgh]\>"
+syn match vmasmOpcode "\<mov[bwlqofdgh]\>"
+syn match vmasmOpcode "\<mul[bwlfdgh][23]\>"
+syn match vmasmOpcode "\<poly[fdgh]\>"
+syn match vmasmOpcode "\<sub[bwlfdgh][23]\>"
+syn match vmasmOpcode "\<tst[bwlfdgh]\>"
+syn match vmasmOpcode "\<xor[bwl][23]\>"
+syn match vmasmOpcode "\<mova[bwlfqdgho]\>"
+syn match vmasmOpcode "\<push[bwlfqdgho]\>"
+syn match vmasmOpcode "\<acb[bwlfgdh]\>"
+syn match vmasmOpcode "\<b[lng]equ\=\>"
+syn match vmasmOpcode "\<b[cv][cs]\>"
+syn match vmasmOpcode "\<bb[cs][cs]\>"
+syn match vmasmOpcode "\<v[vs]add[lfdg]\>"
+syn match vmasmOpcode "\<v[vs]cmp[lfdg]\>"
+syn match vmasmOpcode "\<v[vs]div[fdg]\>"
+syn match vmasmOpcode "\<v[vs]mul[lfdg]\>"
+syn match vmasmOpcode "\<v[vs]sub[lfdg]\>"
+syn match vmasmOpcode "\<v[vs]bi[cs]l\>"
+syn match vmasmOpcode "\<v[vs]xorl\>"
+syn match vmasmOpcode "\<v[vs]merge\>"
+syn match vmasmOpcode "\<v[vs]s[rl]ll\>"
+
+" Various number formats
+syn match vmasmdecNumber "[+-]\=[0-9]\+\>"
+syn match vmasmdecNumber "^d[0-9]\+\>"
+syn match vmasmhexNumber "^x[0-9a-f]\+\>"
+syn match vmasmoctNumber "^o[0-7]\+\>"
+syn match vmasmbinNumber "^b[01]\+\>"
+syn match vmasmfloatNumber "[-+]\=[0-9]\+E[-+]\=[0-9]\+"
+syn match vmasmfloatNumber "[-+]\=[0-9]\+\.[0-9]*\(E[-+]\=[0-9]\+\)\="
+
+" Valid labels
+syn match vmasmLabel "^[a-z_$.][a-z0-9_$.]\{,30}::\="
+syn match vmasmLabel "\<[0-9]\{1,5}\$:\=" " Local label
+
+" Character string constants
+" Too complex really. Could be "<...>" but those could also be
+" expressions. Don't know how to handle chosen delimiters
+" ("^<sep>...<sep>")
+" syn region vmasmString start="<" end=">" oneline
+
+" Operators
+syn match vmasmOperator "[-+*/@&!\\]"
+syn match vmasmOperator "="
+syn match vmasmOperator "==" " Global assignment
+syn match vmasmOperator "%length(.*)"
+syn match vmasmOperator "%locate(.*)"
+syn match vmasmOperator "%extract(.*)"
+syn match vmasmOperator "^[amfc]"
+syn match vmasmOperator "[bwlg]^"
+
+syn match vmasmOperator "\<\(not_\)\=equal\>"
+syn match vmasmOperator "\<less_equal\>"
+syn match vmasmOperator "\<greater\(_equal\)\=\>"
+syn match vmasmOperator "\<less_than\>"
+syn match vmasmOperator "\<\(not_\)\=defined\>"
+syn match vmasmOperator "\<\(not_\)\=blank\>"
+syn match vmasmOperator "\<identical\>"
+syn match vmasmOperator "\<different\>"
+syn match vmasmOperator "\<eq\>"
+syn match vmasmOperator "\<[gl]t\>"
+syn match vmasmOperator "\<n\=df\>"
+syn match vmasmOperator "\<n\=b\>"
+syn match vmasmOperator "\<idn\>"
+syn match vmasmOperator "\<[nlg]e\>"
+syn match vmasmOperator "\<dif\>"
+
+" Special items for comments
+syn keyword vmasmTodo contained todo
+
+" Comments
+syn match vmasmComment ";.*" contains=vmasmTodo
+
+" Include
+syn match vmasmInclude "\.library\>"
+
+" Macro definition
+syn match vmasmMacro "\.macro\>"
+syn match vmasmMacro "\.mexit\>"
+syn match vmasmMacro "\.endm\>"
+syn match vmasmMacro "\.mcall\>"
+syn match vmasmMacro "\.mdelete\>"
+
+" Conditional assembly
+syn match vmasmPreCond "\.iff\=\>"
+syn match vmasmPreCond "\.if_false\>"
+syn match vmasmPreCond "\.iftf\=\>"
+syn match vmasmPreCond "\.if_true\(_false\)\=\>"
+syn match vmasmPreCond "\.iif\>"
+
+" Loop control
+syn match vmasmRepeat "\.irpc\=\>"
+syn match vmasmRepeat "\.repeat\>"
+syn match vmasmRepeat "\.rept\>"
+syn match vmasmRepeat "\.endr\>"
+
+" Directives
+syn match vmasmDirective "\.address\>"
+syn match vmasmDirective "\.align\>"
+syn match vmasmDirective "\.asci[cdiz]\>"
+syn match vmasmDirective "\.blk[abdfghloqw]\>"
+syn match vmasmDirective "\.\(signed_\)\=byte\>"
+syn match vmasmDirective "\.\(no\)\=cross\>"
+syn match vmasmDirective "\.debug\>"
+syn match vmasmDirective "\.default displacement\>"
+syn match vmasmDirective "\.[dfgh]_floating\>"
+syn match vmasmDirective "\.disable\>"
+syn match vmasmDirective "\.double\>"
+syn match vmasmDirective "\.dsabl\>"
+syn match vmasmDirective "\.enable\=\>"
+syn match vmasmDirective "\.endc\=\>"
+syn match vmasmDirective "\.entry\>"
+syn match vmasmDirective "\.error\>"
+syn match vmasmDirective "\.even\>"
+syn match vmasmDirective "\.external\>"
+syn match vmasmDirective "\.extrn\>"
+syn match vmasmDirective "\.float\>"
+syn match vmasmDirective "\.globa\=l\>"
+syn match vmasmDirective "\.ident\>"
+syn match vmasmDirective "\.link\>"
+syn match vmasmDirective "\.list\>"
+syn match vmasmDirective "\.long\>"
+syn match vmasmDirective "\.mask\>"
+syn match vmasmDirective "\.narg\>"
+syn match vmasmDirective "\.nchr\>"
+syn match vmasmDirective "\.nlist\>"
+syn match vmasmDirective "\.ntype\>"
+syn match vmasmDirective "\.octa\>"
+syn match vmasmDirective "\.odd\>"
+syn match vmasmDirective "\.opdef\>"
+syn match vmasmDirective "\.packed\>"
+syn match vmasmDirective "\.page\>"
+syn match vmasmDirective "\.print\>"
+syn match vmasmDirective "\.psect\>"
+syn match vmasmDirective "\.quad\>"
+syn match vmasmDirective "\.ref[1248]\>"
+syn match vmasmDirective "\.ref16\>"
+syn match vmasmDirective "\.restore\(_psect\)\=\>"
+syn match vmasmDirective "\.save\(_psect\)\=\>"
+syn match vmasmDirective "\.sbttl\>"
+syn match vmasmDirective "\.\(no\)\=show\>"
+syn match vmasmDirective "\.\(sub\)\=title\>"
+syn match vmasmDirective "\.transfer\>"
+syn match vmasmDirective "\.warn\>"
+syn match vmasmDirective "\.weak\>"
+syn match vmasmDirective "\.\(signed_\)\=word\>"
+
+syn case match
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8 sw=2
diff --git a/runtime/syntax/voscm.vim b/runtime/syntax/voscm.vim
new file mode 100644
index 0000000..7d6bea7
--- /dev/null
+++ b/runtime/syntax/voscm.vim
@@ -0,0 +1,94 @@
+" Vim syntax file
+" Language: VOS CM macro
+" Maintainer: Andrew McGill andrewm at lunch.za.net
+" Last Change: Apr 06, 2007
+" Version: 1
+" URL: http://lunch.za.net/
+"
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+" set iskeyword=48-57,_,a-z,A-Z
+
+syn match voscmStatement "^!"
+syn match voscmStatement "&\(label\|begin_parameters\|end_parameters\|goto\|attach_input\|break\|continue\|control\|detach_input\|display_line\|display_line_partial\|echo\|eof\|eval\|if\|mode\|return\|while\|set\|set_string\|then\|else\|do\|done\|end\)\>"
+syn match voscmJump "\(&label\|&goto\) *" nextgroup=voscmLabelId
+syn match voscmLabelId contained "\<[A-Za-z][A-Z_a-z0-9]* *$"
+syn match voscmSetvar "\(&set_string\|&set\) *" nextgroup=voscmVariable
+syn match voscmError "\(&set_string\|&set\) *&"
+syn match voscmVariable contained "\<[A-Za-z][A-Z_a-z0-9]\+\>"
+syn keyword voscmParamKeyword contained number req string switch allow byte disable_input hidden length longword max min no_abbrev output_path req required req_for_form word
+syn region voscmParamList matchgroup=voscmParam start="&begin_parameters" end="&end_parameters" contains=voscmParamKeyword,voscmString,voscmParamName,voscmParamId
+syn match voscmParamName contained "\(^\s*[A-Za-z_0-9]\+\s\+\)\@<=\k\+"
+syn match voscmParamId contained "\(^\s*\)\@<=\k\+"
+syn region par1 matchgroup=par1 start=/(/ end=/)/ contains=voscmFunction,voscmIdentifier,voscmString transparent
+" FIXME: functions should only be allowed after a bracket ... ie (ask ...):
+syn keyword voscmFunction contained abs access after ask before break byte calc ceil command_status concat
+syn keyword voscmFunction contained contents path_name copy count current_dir current_module date date_time
+syn keyword voscmFunction contained decimal directory_name end_of_file exists file_info floor given group_name
+syn keyword voscmFunction contained has_access hexadecimal home_dir index iso_date iso_date_time language_name
+syn keyword voscmFunction contained length lock_type locked ltrim master_disk max message min mod module_info
+syn keyword voscmFunction contained module_name object_name online path_name person_name process_dir process_info
+syn keyword voscmFunction contained process_type quote rank referencing_dir reverse rtrim search
+syn keyword voscmFunction contained software_purchased string substitute substr system_name terminal_info
+syn keyword voscmFunction contained terminal_name time translate trunc unique_string unquote user_name verify
+syn keyword voscmFunction contained where_path
+syn keyword voscmTodo contained TODO FIXME XXX DEBUG NOTE
+syn match voscmTab "\t\+"
+
+syn keyword voscmCommand add_entry_names add_library_path add_profile analyze_pc_samples attach_default_output attach_port batch bind break_process c c_preprocess call_thru cancel_batch_requests cancel_device_reservation cancel_print_requests cc change_current_dir check_posix cobol comment_on_manual compare_dirs compare_files convert_text_file copy_dir copy_file copy_tape cpp create_data_object create_deleted_record_index create_dir create_file create_index create_record_index create_tape_volumes cvt_fixed_to_stream cvt_stream_to_fixed debug delete_dir delete_file delete_index delete_library_path detach_default_output detach_port dismount_tape display display_access display_access_list display_batch_status display_current_dir display_current_module display_date_time display_default_access_list display_device_info display_dir_status display_disk_info display_disk_usage display_error display_file display_file_status display_line display_notices display_object_module_info display_print_defaults display_print_status display_program_module display_system_usage display_tape_params display_terminal_parameters dump_file dump_record dump_tape edit edit_form emacs enforce_region_locks fortran get_external_variable give_access give_default_access handle_sig_dfl harvest_pc_samples help kill line_edit link link_dirs list list_batch_requests list_devices list_gateways list_library_paths list_modules list_port_attachments list_print_requests list_process_cmd_limits list_save_tape list_systems list_tape list_terminal_types list_users locate_files locate_large_files login logout mount_tape move_device_reservation move_dir move_file mp_debug nls_edit_form pascal pl1 position_tape preprocess_file print profile propagate_access read_tape ready remove_access remove_default_access rename reserve_device restore_object save_object send_message set set_cpu_time_limit set_expiration_date set_external_variable set_file_allocation set_implicit_locking set_index_flags set_language set_library_paths set_line_wrap_width set_log_protected_file set_owner_access set_pipe_file set_priority set_ready set_safety_switch set_second_tape set_tape_drive_params set_tape_file_params set_tape_mount_params set_terminal_parameters set_text_file set_time_zone sleep sort start_logging start_process stop_logging stop_process tail_file text_data_merge translate_links truncate_file unlink update_batch_requests update_print_requests update_process_cmd_limits use_abbreviations use_message_file vcc verify_posix_access verify_save verify_system_access walk_dir where_command where_path who_locked write_tape
+
+syn match voscmIdentifier "&[A-Za-z][a-z0-9_A-Z]*&"
+
+syn match voscmString "'[^']*'"
+
+" Number formats
+syn match voscmNumber "\<\d\+\>"
+"Floating point number part only
+syn match voscmDecimalNumber "\.\d\+\([eE][-+]\=\d\)\=\>"
+
+"syn region voscmComment start="^[ ]*&[ ]+" end="$"
+"syn match voscmComment "^[ ]*&[ ].*$"
+"syn match voscmComment "^&$"
+syn region voscmComment start="^[ ]*&[ ]" end="$" contains=voscmTodo
+syn match voscmComment "^&$"
+syn match voscmContinuation "&+$"
+
+"syn match voscmIdentifier "[A-Za-z0-9&._-]\+"
+
+"Synchronization with Statement terminator $
+" syn sync maxlines=100
+
+hi def link voscmConditional Conditional
+hi def link voscmStatement Statement
+hi def link voscmSetvar Statement
+hi def link voscmNumber Number
+hi def link voscmDecimalNumber Float
+hi def link voscmString String
+hi def link voscmIdentifier Identifier
+hi def link voscmVariable Identifier
+hi def link voscmComment Comment
+hi def link voscmJump Statement
+hi def link voscmContinuation Macro
+hi def link voscmLabelId String
+hi def link voscmParamList NONE
+hi def link voscmParamId Identifier
+hi def link voscmParamName String
+hi def link voscmParam Statement
+hi def link voscmParamKeyword Statement
+hi def link voscmFunction Function
+hi def link voscmCommand Structure
+"hi def link voscmIdentifier NONE
+"hi def link voscmSpecial Special " not used
+hi def link voscmTodo Todo
+hi def link voscmTab Error
+hi def link voscmError Error
+
+let b:current_syntax = "voscm"
+
+" vim: ts=8
diff --git a/runtime/syntax/vrml.vim b/runtime/syntax/vrml.vim
new file mode 100644
index 0000000..2474493
--- /dev/null
+++ b/runtime/syntax/vrml.vim
@@ -0,0 +1,222 @@
+" Vim syntax file
+" Language: VRML97
+" Modified from: VRML 1.0C by David Brown <dbrown@cgs.c4.gmeds.com>
+" Maintainer: vacancy!
+" Former Maintainer: Gregory Seidman <gsslist+vim@anthropohedron.net>
+" Last change: 2006 May 03
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" keyword definitions
+
+syn keyword VRMLFields ambientIntensity appearance attenuation
+syn keyword VRMLFields autoOffset avatarSize axisOfRotation backUrl
+syn keyword VRMLFields bboxCenter bboxSize beamWidth beginCap
+syn keyword VRMLFields bottom bottomRadius bottomUrl ccw center
+syn keyword VRMLFields children choice collide color colorIndex
+syn keyword VRMLFields colorPerVertex convex coord coordIndex
+syn keyword VRMLFields creaseAngle crossSection cutOffAngle
+syn keyword VRMLFields cycleInterval description diffuseColor
+syn keyword VRMLFields directOutput direction diskAngle
+syn keyword VRMLFields emissiveColor enabled endCap family
+syn keyword VRMLFields fieldOfView fogType fontStyle frontUrl
+syn keyword VRMLFields geometry groundAngle groundColor headlight
+syn keyword VRMLFields height horizontal info intensity jump
+syn keyword VRMLFields justify key keyValue language leftToRight
+syn keyword VRMLFields leftUrl length level location loop material
+syn keyword VRMLFields maxAngle maxBack maxExtent maxFront
+syn keyword VRMLFields maxPosition minAngle minBack minFront
+syn keyword VRMLFields minPosition mustEvaluate normal normalIndex
+syn keyword VRMLFields normalPerVertex offset on orientation
+syn keyword VRMLFields parameter pitch point position priority
+syn keyword VRMLFields proxy radius range repeatS repeatT rightUrl
+syn keyword VRMLFields rotation scale scaleOrientation shininess
+syn keyword VRMLFields side size skyAngle skyColor solid source
+syn keyword VRMLFields spacing spatialize specularColor speed spine
+syn keyword VRMLFields startTime stopTime string style texCoord
+syn keyword VRMLFields texCoordIndex texture textureTransform title
+syn keyword VRMLFields top topToBottom topUrl translation
+syn keyword VRMLFields transparency type url vector visibilityLimit
+syn keyword VRMLFields visibilityRange whichChoice xDimension
+syn keyword VRMLFields xSpacing zDimension zSpacing
+syn match VRMLFields "\<[A-Za-z_][A-Za-z0-9_]*\>" contains=VRMLComment,VRMLProtos,VRMLfTypes
+" syn match VRMLFields "\<[A-Za-z_][A-Za-z0-9_]*\>\(,\|\s\)*\(#.*$\)*\<IS\>\(#.*$\)*\(,\|\s\)*\<[A-Za-z_][A-Za-z0-9_]*\>\(,\|\s\)*\(#.*$\)*" contains=VRMLComment,VRMLProtos
+" syn region VRMLFields start="\<[A-Za-z_][A-Za-z0-9_]*\>" end=+\(,\|#\|\s\)+me=e-1 contains=VRMLComment,VRMLProtos
+
+syn keyword VRMLEvents addChildren ambientIntensity_changed
+syn keyword VRMLEvents appearance_changed attenuation_changed
+syn keyword VRMLEvents autoOffset_changed avatarSize_changed
+syn keyword VRMLEvents axisOfRotation_changed backUrl_changed
+syn keyword VRMLEvents beamWidth_changed bindTime bottomUrl_changed
+syn keyword VRMLEvents center_changed children_changed
+syn keyword VRMLEvents choice_changed collideTime collide_changed
+syn keyword VRMLEvents color_changed coord_changed
+syn keyword VRMLEvents cutOffAngle_changed cycleInterval_changed
+syn keyword VRMLEvents cycleTime description_changed
+syn keyword VRMLEvents diffuseColor_changed direction_changed
+syn keyword VRMLEvents diskAngle_changed duration_changed
+syn keyword VRMLEvents emissiveColor_changed enabled_changed
+syn keyword VRMLEvents enterTime exitTime fogType_changed
+syn keyword VRMLEvents fontStyle_changed fraction_changed
+syn keyword VRMLEvents frontUrl_changed geometry_changed
+syn keyword VRMLEvents groundAngle_changed headlight_changed
+syn keyword VRMLEvents hitNormal_changed hitPoint_changed
+syn keyword VRMLEvents hitTexCoord_changed intensity_changed
+syn keyword VRMLEvents isActive isBound isOver jump_changed
+syn keyword VRMLEvents keyValue_changed key_changed leftUrl_changed
+syn keyword VRMLEvents length_changed level_changed
+syn keyword VRMLEvents location_changed loop_changed
+syn keyword VRMLEvents material_changed maxAngle_changed
+syn keyword VRMLEvents maxBack_changed maxExtent_changed
+syn keyword VRMLEvents maxFront_changed maxPosition_changed
+syn keyword VRMLEvents minAngle_changed minBack_changed
+syn keyword VRMLEvents minFront_changed minPosition_changed
+syn keyword VRMLEvents normal_changed offset_changed on_changed
+syn keyword VRMLEvents orientation_changed parameter_changed
+syn keyword VRMLEvents pitch_changed point_changed position_changed
+syn keyword VRMLEvents priority_changed radius_changed
+syn keyword VRMLEvents removeChildren rightUrl_changed
+syn keyword VRMLEvents rotation_changed scaleOrientation_changed
+syn keyword VRMLEvents scale_changed set_ambientIntensity
+syn keyword VRMLEvents set_appearance set_attenuation
+syn keyword VRMLEvents set_autoOffset set_avatarSize
+syn keyword VRMLEvents set_axisOfRotation set_backUrl set_beamWidth
+syn keyword VRMLEvents set_bind set_bottomUrl set_center
+syn keyword VRMLEvents set_children set_choice set_collide
+syn keyword VRMLEvents set_color set_colorIndex set_coord
+syn keyword VRMLEvents set_coordIndex set_crossSection
+syn keyword VRMLEvents set_cutOffAngle set_cycleInterval
+syn keyword VRMLEvents set_description set_diffuseColor
+syn keyword VRMLEvents set_direction set_diskAngle
+syn keyword VRMLEvents set_emissiveColor set_enabled set_fogType
+syn keyword VRMLEvents set_fontStyle set_fraction set_frontUrl
+syn keyword VRMLEvents set_geometry set_groundAngle set_headlight
+syn keyword VRMLEvents set_height set_intensity set_jump set_key
+syn keyword VRMLEvents set_keyValue set_leftUrl set_length
+syn keyword VRMLEvents set_level set_location set_loop set_material
+syn keyword VRMLEvents set_maxAngle set_maxBack set_maxExtent
+syn keyword VRMLEvents set_maxFront set_maxPosition set_minAngle
+syn keyword VRMLEvents set_minBack set_minFront set_minPosition
+syn keyword VRMLEvents set_normal set_normalIndex set_offset set_on
+syn keyword VRMLEvents set_orientation set_parameter set_pitch
+syn keyword VRMLEvents set_point set_position set_priority
+syn keyword VRMLEvents set_radius set_rightUrl set_rotation
+syn keyword VRMLEvents set_scale set_scaleOrientation set_shininess
+syn keyword VRMLEvents set_size set_skyAngle set_skyColor
+syn keyword VRMLEvents set_source set_specularColor set_speed
+syn keyword VRMLEvents set_spine set_startTime set_stopTime
+syn keyword VRMLEvents set_string set_texCoord set_texCoordIndex
+syn keyword VRMLEvents set_texture set_textureTransform set_topUrl
+syn keyword VRMLEvents set_translation set_transparency set_type
+syn keyword VRMLEvents set_url set_vector set_visibilityLimit
+syn keyword VRMLEvents set_visibilityRange set_whichChoice
+syn keyword VRMLEvents shininess_changed size_changed
+syn keyword VRMLEvents skyAngle_changed skyColor_changed
+syn keyword VRMLEvents source_changed specularColor_changed
+syn keyword VRMLEvents speed_changed startTime_changed
+syn keyword VRMLEvents stopTime_changed string_changed
+syn keyword VRMLEvents texCoord_changed textureTransform_changed
+syn keyword VRMLEvents texture_changed time topUrl_changed
+syn keyword VRMLEvents touchTime trackPoint_changed
+syn keyword VRMLEvents translation_changed transparency_changed
+syn keyword VRMLEvents type_changed url_changed value_changed
+syn keyword VRMLEvents vector_changed visibilityLimit_changed
+syn keyword VRMLEvents visibilityRange_changed whichChoice_changed
+syn region VRMLEvents start="\S+[^0-9]+\.[A-Za-z_]+"ms=s+1 end="\(,\|$\|\s\)"me=e-1
+
+syn keyword VRMLNodes Anchor Appearance AudioClip Background
+syn keyword VRMLNodes Billboard Box Collision Color
+syn keyword VRMLNodes ColorInterpolator Cone Coordinate
+syn keyword VRMLNodes CoordinateInterpolator Cylinder
+syn keyword VRMLNodes CylinderSensor DirectionalLight
+syn keyword VRMLNodes ElevationGrid Extrusion Fog FontStyle
+syn keyword VRMLNodes Group ImageTexture IndexedFaceSet
+syn keyword VRMLNodes IndexedLineSet Inline LOD Material
+syn keyword VRMLNodes MovieTexture NavigationInfo Normal
+syn keyword VRMLNodes NormalInterpolator OrientationInterpolator
+syn keyword VRMLNodes PixelTexture PlaneSensor PointLight
+syn keyword VRMLNodes PointSet PositionInterpolator
+syn keyword VRMLNodes ProximitySensor ScalarInterpolator
+syn keyword VRMLNodes Script Shape Sound Sphere SphereSensor
+syn keyword VRMLNodes SpotLight Switch Text TextureCoordinate
+syn keyword VRMLNodes TextureTransform TimeSensor TouchSensor
+syn keyword VRMLNodes Transform Viewpoint VisibilitySensor
+syn keyword VRMLNodes WorldInfo
+
+" the following line doesn't catch <node><newline><openbrace> since \n
+" doesn't match as an atom yet :-(
+syn match VRMLNodes "[A-Za-z_][A-Za-z0-9_]*\(,\|\s\)*{"me=e-1
+syn region VRMLNodes start="\<EXTERNPROTO\>\(,\|\s\)*[A-Za-z_]"ms=e start="\<EXTERNPROTO\>\(,\|\s\)*" end="[\s]*\["me=e-1 contains=VRMLProtos,VRMLComment
+syn region VRMLNodes start="PROTO\>\(,\|\s\)*[A-Za-z_]"ms=e start="PROTO\>\(,\|\s\)*" end="[\s]*\["me=e-1 contains=VRMLProtos,VRMLComment
+
+syn keyword VRMLTypes SFBool SFColor MFColor SFFloat MFFloat
+syn keyword VRMLTypes SFImage SFInt32 MFInt32 SFNode MFNode
+syn keyword VRMLTypes SFRotation MFRotation SFString MFString
+syn keyword VRMLTypes SFTime MFTime SFVec2f MFVec2f SFVec3f MFVec3f
+
+syn keyword VRMLfTypes field exposedField eventIn eventOut
+
+syn keyword VRMLValues TRUE FALSE NULL
+
+syn keyword VRMLProtos contained EXTERNPROTO PROTO IS
+
+syn keyword VRMLRoutes contained ROUTE TO
+
+"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
+
+" match definitions.
+syn match VRMLSpecial contained "\\[0-9][0-9][0-9]\|\\."
+syn region VRMLString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=VRMLSpecial,VRMLjScriptString
+syn match VRMLCharacter "'[^\\]'"
+syn match VRMLSpecialCharacter "'\\.'"
+syn match VRMLNumber "[-+]\=\<[0-9]\+\(\.[0-9]\+\)\=\([eE]\{1}[-+]\=[0-9]\+\)\=\>\|0[xX][0-9a-fA-F]\+\>"
+syn match VRMLNumber "0[xX][0-9a-fA-F]\+\>"
+syn match VRMLComment "#.*$"
+
+" newlines should count as whitespace, but they can't be matched yet :-(
+syn region VRMLRouteNode start="[^O]TO\(,\|\s\)*" end="\."me=e-1 contains=VRMLRoutes,VRMLComment
+syn region VRMLRouteNode start="ROUTE\(,\|\s\)*" end="\."me=e-1 contains=VRMLRoutes,VRMLComment
+syn region VRMLInstName start="DEF\>"hs=e+1 skip="DEF\(,\|\s\)*" end="[A-Za-z0-9_]\(\s\|$\|,\)"me=e contains=VRMLInstances,VRMLComment
+syn region VRMLInstName start="USE\>"hs=e+1 skip="USE\(,\|\s\)*" end="[A-Za-z0-9_]\(\s\|$\|,\)"me=e contains=VRMLInstances,VRMLComment
+
+syn keyword VRMLInstances contained DEF USE
+syn sync minlines=1
+
+"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
+
+" Define the default highlighting.
+" 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
+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"
+
+" vim: ts=8
diff --git a/runtime/syntax/vroom.vim b/runtime/syntax/vroom.vim
new file mode 100644
index 0000000..0509e30
--- /dev/null
+++ b/runtime/syntax/vroom.vim
@@ -0,0 +1,110 @@
+" Vim syntax file
+" Language: Vroom (vim testing and executable documentation)
+" Maintainer: David Barnett (https://github.com/google/vim-ft-vroom)
+" Last Change: 2014 Jul 23
+
+" quit when a syntax file was already loaded
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+
+syn include @vroomVim syntax/vim.vim
+syn include @vroomShell syntax/sh.vim
+
+syntax region vroomAction
+ \ matchgroup=vroomOutput
+ \ start='\m^ ' end='\m$' keepend
+ \ contains=vroomControlBlock
+
+syntax region vroomAction
+ \ matchgroup=vroomOutput
+ \ start='\m^ & ' end='\m$' keepend
+ \ contains=vroomControlBlock
+
+syntax match vroomOutput '\m^ &$'
+
+syntax region vroomMessageBody
+ \ matchgroup=vroomMessage
+ \ start='\m^ \~ ' end='\m$' keepend
+ \ contains=vroomControlBlock
+
+syntax region vroomColoredAction
+ \ matchgroup=vroomInput
+ \ start='\m^ > ' end='\m$' keepend
+ \ contains=vimNotation,vroomControlBlock
+syntax region vroomAction
+ \ matchgroup=vroomInput
+ \ start='\m^ % ' end='\m$' keepend
+ \ contains=vimNotation,vroomControlBlock
+
+syntax region vroomAction
+ \ matchgroup=vroomContinuation
+ \ start='\m^ |' end='\m$' keepend
+
+syntax region vroomAction
+ \ start='\m^ \ze:' end='\m$' keepend
+ \ contains=@vroomVim,vroomControlBlock
+
+syntax region vroomAction
+ \ matchgroup=vroomDirective
+ \ start='\m^ @\i\+' end='\m$' keepend
+ \ contains=vroomControlBlock
+
+syntax region vroomSystemAction
+ \ matchgroup=vroomSystem
+ \ start='\m^ ! ' end='\m$' keepend
+ \ contains=@vroomShell,vroomControlBlock
+
+syntax region vroomHijackAction
+ \ matchgroup=vroomHijack
+ \ start='\m^ \$ ' end='\m$' keepend
+ \ contains=vroomControlBlock
+
+syntax match vroomControlBlock contains=vroomControlEscape,@vroomControls
+ \ '\v \([^&()][^()]*\)$'
+
+syntax match vroomControlEscape '\m&' contained
+
+syntax cluster vroomControls
+ \ contains=vroomDelay,vroomMode,vroomBuffer,vroomRange
+ \,vroomChannel,vroomBind,vroomStrictness
+syntax match vroomRange '\v\.(,\+?(\d+|\$)?)?' contained
+syntax match vroomRange '\v\d*,\+?(\d+|\$)?' contained
+syntax match vroomBuffer '\v\d+,@!' contained
+syntax match vroomDelay '\v\d+(\.\d+)?s' contained
+syntax match vroomMode '\v<%(regex|glob|verbatim)' contained
+syntax match vroomChannel '\v<%(stderr|stdout|command|status)>' contained
+syntax match vroomBind '\v<bind>' contained
+syntax match vroomStrictness '\v\<%(STRICT|RELAXED|GUESS-ERRORS)\>' contained
+
+highlight default link vroomInput Identifier
+highlight default link vroomDirective vroomInput
+highlight default link vroomControlBlock vroomInput
+highlight default link vroomSystem vroomInput
+highlight default link vroomOutput Statement
+highlight default link vroomContinuation Constant
+highlight default link vroomHijack Special
+highlight default link vroomColoredAction Statement
+highlight default link vroomSystemAction vroomSystem
+highlight default link vroomHijackAction vroomHijack
+highlight default link vroomMessage vroomOutput
+highlight default link vroomMessageBody Constant
+
+highlight default link vroomControlEscape Special
+highlight default link vroomBuffer vroomInput
+highlight default link vroomRange Include
+highlight default link vroomMode Constant
+highlight default link vroomDelay Type
+highlight default link vroomStrictness vroomMode
+highlight default link vroomChannel vroomMode
+highlight default link vroomBind vroomMode
+
+let b:current_syntax = 'vroom'
+
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/vsejcl.vim b/runtime/syntax/vsejcl.vim
new file mode 100644
index 0000000..f329836
--- /dev/null
+++ b/runtime/syntax/vsejcl.vim
@@ -0,0 +1,36 @@
+" Vim syntax file
+" Language: JCL job control language - DOS/VSE
+" Maintainer: Davyd Ondrejko <david.ondrejko@safelite.com>
+" URL:
+" Last change: 2001 May 10
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" tags
+syn keyword vsejclKeyword DLBL EXEC JOB ASSGN EOJ
+syn keyword vsejclField JNM CLASS DISP USER SYSID JSEP SIZE
+syn keyword vsejclField VSAM
+syn region vsejclComment start="^/\*" end="$"
+syn region vsejclComment start="^[\* ]\{}$" end="$"
+syn region vsejclMisc start="^ " end="$" contains=Jparms
+syn match vsejclString /'.\{-}'/
+syn match vsejclParms /(.\{-})/ contained
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "vsejcl"
+
+" vim: ts=4
diff --git a/runtime/syntax/vue.vim b/runtime/syntax/vue.vim
new file mode 100644
index 0000000..bad0e26
--- /dev/null
+++ b/runtime/syntax/vue.vim
@@ -0,0 +1,14 @@
+" Vim syntax file
+" Language: Vue.js Single File Component
+" Maintainer: Ralph Giles <giles@thaumas.net>
+" URL: https://vuejs.org/v2/guide/single-file-components.html
+" Last Change: 2019 Jul 8
+
+" Quit if a syntax file was already loaded.
+if exists("b:current_syntax")
+ finish
+endif
+
+" We have a collection of html, css and javascript wrapped in
+" tags. The default HTML syntax highlight works well enough.
+runtime! syntax/html.vim
diff --git a/runtime/syntax/wast.vim b/runtime/syntax/wast.vim
new file mode 100644
index 0000000..245d5f6
--- /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
new file mode 100644
index 0000000..d0afadf
--- /dev/null
+++ b/runtime/syntax/wdiff.vim
@@ -0,0 +1,29 @@
+" Vim syntax file
+" Language: wDiff (wordwise diff)
+" Maintainer: Gerfried Fuchs <alfie@ist.org>
+" Last Change: 25 Apr 2001
+" URL: http://alfie.ist.org/vim/syntax/wdiff.vim
+"
+" Comments are very welcome - but please make sure that you are commenting on
+" the latest version of this file.
+" SPAM is _NOT_ welcome - be ready to be reported!
+
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+
+syn region wdiffOld start=+\[-+ end=+-]+
+syn region wdiffNew start="{+" end="+}"
+
+
+" Define the default highlighting.
+" 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/wdl.vim b/runtime/syntax/wdl.vim
new file mode 100644
index 0000000..3b8369e
--- /dev/null
+++ b/runtime/syntax/wdl.vim
@@ -0,0 +1,41 @@
+" Vim syntax file
+" Language: wdl
+" Maintainer: Matt Dunford (zenmatic@gmail.com)
+" URL: https://github.com/zenmatic/vim-syntax-wdl
+" Last Change: 2022 Nov 24
+
+" https://github.com/openwdl/wdl
+
+" quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+
+syn keyword wdlStatement alias task input command runtime input output workflow call scatter import as meta parameter_meta in version
+syn keyword wdlConditional if then else
+syn keyword wdlType struct Array String File Int Float Boolean Map Pair Object
+
+syn keyword wdlFunctions stdout stderr read_lines read_tsv read_map read_object read_objects read_json read_int read_string read_float read_boolean write_lines write_tsv write_map write_object write_objects write_json size sub range transpose zip cross length flatten prefix select_first defined basename floor ceil round
+
+syn region wdlCommandSection start="<<<" end=">>>"
+
+syn region wdlString start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn region wdlString start=+'+ skip=+\\\\\|\\'+ end=+'+
+
+" Comments; their contents
+syn keyword wdlTodo contained TODO FIXME XXX BUG
+syn cluster wdlCommentGroup contains=wdlTodo
+syn region wdlComment start="#" end="$" contains=@wdlCommentGroup
+
+hi def link wdlStatement Statement
+hi def link wdlConditional Conditional
+hi def link wdlType Type
+hi def link wdlFunctions Function
+hi def link wdlString String
+hi def link wdlCommandSection String
+hi def link wdlComment Comment
+hi def link wdlTodo Todo
+
+let b:current_syntax = 'wdl'
diff --git a/runtime/syntax/web.vim b/runtime/syntax/web.vim
new file mode 100644
index 0000000..54eebda
--- /dev/null
+++ b/runtime/syntax/web.vim
@@ -0,0 +1,32 @@
+" Vim syntax file
+" Language: WEB
+" Maintainer: Andreas Scherer <andreas.scherer@pobox.com>
+" Last Change: April 30, 2001
+
+" Details of the WEB language can be found in the article by Donald E. Knuth,
+" "The WEB System of Structured Documentation", included as "webman.tex" in
+" the standard WEB distribution, available for anonymous ftp at
+" ftp://labrea.stanford.edu/pub/tex/web/.
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" Although WEB is the ur-language for the "Literate Programming" paradigm,
+" 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.
+runtime! syntax/cweb.vim
+unlet b:current_syntax
+
+" Replace C/C++ syntax by Pascal syntax.
+syntax include @webIncludedC <sfile>:p:h/pascal.vim
+
+" Double-@ means single-@, anywhere in the WEB source (as in CWEB).
+" Don't misinterpret "@'" as the start of a Pascal string.
+syntax match webIgnoredStuff "@[@']"
+
+let b:current_syntax = "web"
+
+" vim: ts=8
diff --git a/runtime/syntax/webmacro.vim b/runtime/syntax/webmacro.vim
new file mode 100644
index 0000000..9597525
--- /dev/null
+++ b/runtime/syntax/webmacro.vim
@@ -0,0 +1,67 @@
+" WebMacro syntax file
+" Language: WebMacro
+" Maintainer: Claudio Fleiner <claudio@fleiner.com>
+" URL: http://www.fleiner.com/vim/syntax/webmacro.vim
+" Last Change: 2003 May 11
+
+" webmacro is a nice little language that you should
+" check out if you use java servlets.
+" webmacro: http://www.webmacro.org
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+if !exists("main_syntax")
+ " quit when a syntax file was already loaded
+ if exists("b:current_syntax")
+ finish
+ endif
+ let main_syntax = 'webmacro'
+endif
+
+
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+syn cluster htmlPreProc add=webmacroIf,webmacroUse,webmacroBraces,webmacroParse,webmacroInclude,webmacroSet,webmacroForeach,webmacroComment
+
+syn match webmacroVariable "\$[a-zA-Z0-9.()]*;\="
+syn match webmacroNumber "[-+]\=\d\+[lL]\=" contained
+syn keyword webmacroBoolean true false contained
+syn match webmacroSpecial "\\." contained
+syn region webmacroString contained start=+"+ end=+"+ contains=webmacroSpecial,webmacroVariable
+syn region webmacroString contained start=+'+ end=+'+ contains=webmacroSpecial,webmacroVariable
+syn region webmacroList contained matchgroup=Structure start="\[" matchgroup=Structure end="\]" contains=webmacroString,webmacroVariable,webmacroNumber,webmacroBoolean,webmacroList
+
+syn region webmacroIf start="#if" start="#else" end="{"me=e-1 contains=webmacroVariable,webmacroNumber,webmacroString,webmacroBoolean,webmacroList nextgroup=webmacroBraces
+syn region webmacroForeach start="#foreach" end="{"me=e-1 contains=webmacroVariable,webmacroNumber,webmacroString,webmacroBoolean,webmacroList nextgroup=webmacroBraces
+syn match webmacroSet "#set .*$" contains=webmacroVariable,webmacroNumber,webmacroBoolean,webmacroString,webmacroList
+syn match webmacroInclude "#include .*$" contains=webmacroVariable,webmacroNumber,webmacroBoolean,webmacroString,webmacroList
+syn match webmacroParse "#parse .*$" contains=webmacroVariable,webmacroNumber,webmacroBoolean,webmacroString,webmacroList
+syn region webmacroUse matchgroup=PreProc start="#use .*" matchgroup=PreProc end="^-.*" contains=webmacroHash,@HtmlTop
+syn region webmacroBraces matchgroup=Structure start="{" matchgroup=Structure end="}" contained transparent
+syn match webmacroBracesError "[{}]"
+syn match webmacroComment "##.*$"
+syn match webmacroHash "[#{}\$]" contained
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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"
+
+if main_syntax == 'webmacro'
+ unlet main_syntax
+endif
diff --git a/runtime/syntax/wget.vim b/runtime/syntax/wget.vim
new file mode 100644
index 0000000..8178d02
--- /dev/null
+++ b/runtime/syntax/wget.vim
@@ -0,0 +1,243 @@
+" Vim syntax file
+" Language: Wget configuration file (/etc/wgetrc ~/.wgetrc)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Apr 28
+
+" GNU Wget 1.21 built on linux-gnu.
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match wgetComment "#.*$" contains=wgetTodo contained
+
+syn keyword wgetTodo TODO NOTE FIXME XXX contained
+
+syn region wgetString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained oneline
+syn region wgetString start=+'+ skip=+\\\\\|\\'+ end=+'+ contained oneline
+
+syn case ignore
+
+syn keyword wgetBoolean on off yes no contained
+syn keyword wgetNumber inf contained
+
+syn match wgetNumber "\<\d\+>" contained
+syn match wgetQuota "\<\d\+[kmgt]\>" contained
+syn match wgetTime "\<\d\+[smhdw]\>" contained
+
+"{{{ Commands
+let s:commands =<< trim EOL
+ accept
+ accept_regex
+ add_host_dir
+ adjust_extension
+ always_rest
+ ask_password
+ auth_no_challenge
+ background
+ backup_converted
+ backups
+ base
+ bind_address
+ bind_dns_address
+ body_data
+ body_file
+ ca_certificate
+ ca_directory
+ cache
+ certificate
+ certificate_type
+ check_certificate
+ choose_config
+ ciphers
+ compression
+ connect_timeout
+ content_disposition
+ content_on_error
+ continue
+ convert_file_only
+ convert_links
+ cookies
+ crl_file
+ cut_dirs
+ debug
+ default_page
+ delete_after
+ dns_cache
+ dns_servers
+ dns_timeout
+ dir_prefix
+ dir_struct
+ domains
+ dot_bytes
+ dots_in_line
+ dot_spacing
+ dot_style
+ egd_file
+ exclude_directories
+ exclude_domains
+ follow_ftp
+ follow_tags
+ force_html
+ ftp_passwd
+ ftp_password
+ ftp_user
+ ftp_proxy
+ ftps_clear_data_connection
+ ftps_fallback_to_ftp
+ ftps_implicit
+ ftps_resume_ssl
+ hsts
+ hsts_file
+ ftp_stmlf
+ glob
+ header
+ html_extension
+ htmlify
+ http_keep_alive
+ http_passwd
+ http_password
+ http_proxy
+ https_proxy
+ https_only
+ http_user
+ if_modified_since
+ ignore_case
+ ignore_length
+ ignore_tags
+ include_directories
+ inet4_only
+ inet6_only
+ input
+ input_meta_link
+ iri
+ keep_bad_hash
+ keep_session_cookies
+ kill_longer
+ limit_rate
+ load_cookies
+ locale
+ local_encoding
+ logfile
+ login
+ max_redirect
+ metalink_index
+ metalink_over_http
+ method
+ mirror
+ netrc
+ no_clobber
+ no_config
+ no_parent
+ no_proxy
+ numtries
+ output_document
+ page_requisites
+ passive_ftp
+ passwd
+ password
+ pinned_pubkey
+ post_data
+ post_file
+ prefer_family
+ preferred_location
+ preserve_permissions
+ private_key
+ private_key_type
+ progress
+ protocol_directories
+ proxy_passwd
+ proxy_password
+ proxy_user
+ quiet
+ quota
+ random_file
+ random_wait
+ read_timeout
+ rec_level
+ recursive
+ referer
+ regex_type
+ reject
+ rejected_log
+ reject_regex
+ relative_only
+ remote_encoding
+ remove_listing
+ report_speed
+ restrict_file_names
+ retr_symlinks
+ retry_connrefused
+ retry_on_host_error
+ retry_on_http_error
+ robots
+ save_cookies
+ save_headers
+ secure_protocol
+ server_response
+ show_all_dns_entries
+ show_progress
+ simple_host_check
+ span_hosts
+ spider
+ start_pos
+ strict_comments
+ sslcertfile
+ sslcertkey
+ timeout
+ timestamping
+ use_server_timestamps
+ tries
+ trust_server_names
+ unlink
+ use_askpass
+ user
+ use_proxy
+ user_agent
+ verbose
+ wait
+ wait_retry
+ warc_cdx
+ warc_cdx_dedup
+ warc_compression
+ warc_digests
+ warc_file
+ warc_header
+ warc_keep_log
+ warc_max_size
+ warc_temp_dir
+ wdebug
+ xattr
+EOL
+"}}}
+
+call map(s:commands, "substitute(v:val, '_', '[-_]\\\\=', 'g')")
+
+for cmd in s:commands
+ exe 'syn match wgetCommand "\<' . cmd . '\>" nextgroup=wgetAssignmentOperator skipwhite contained'
+endfor
+
+syn case match
+
+syn match wgetStart "^" nextgroup=wgetCommand,wgetComment skipwhite
+syn match wgetAssignmentOperator "=" nextgroup=wgetString,wgetBoolean,wgetNumber,wgetQuota,wgetTime skipwhite contained
+
+hi def link wgetAssignmentOperator Special
+hi def link wgetBoolean Boolean
+hi def link wgetCommand Identifier
+hi def link wgetComment Comment
+hi def link wgetNumber Number
+hi def link wgetQuota Number
+hi def link wgetString String
+hi def link wgetTime Number
+hi def link wgetTodo Todo
+
+let b:current_syntax = "wget"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 fdm=marker:
diff --git a/runtime/syntax/wget2.vim b/runtime/syntax/wget2.vim
new file mode 100644
index 0000000..a63c336
--- /dev/null
+++ b/runtime/syntax/wget2.vim
@@ -0,0 +1,250 @@
+" Vim syntax file
+" Language: Wget2 configuration file (/etc/wget2rc ~/.wget2rc)
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Last Change: 2022 Apr 28
+
+" GNU Wget2 2.0.0 - multithreaded metalink/file/website downloader
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match wgetComment "#.*$" contains=wgetTodo contained
+
+syn keyword wgetTodo TODO NOTE FIXME XXX contained
+
+syn region wgetString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained oneline
+syn region wgetString start=+'+ skip=+\\\\\|\\'+ end=+'+ contained oneline
+
+syn case ignore
+
+syn keyword wgetBoolean on off yes no y n contained
+syn keyword wgetNumber infinity inf contained
+
+syn match wgetNumber "\<\d\+>" contained
+syn match wgetQuota "\<\d\+[kmgt]\>" contained
+syn match wgetTime "\<\d\+[smhd]\>" contained
+
+"{{{ Commands
+let s:commands =<< trim EOL
+ accept
+ accept-regex
+ adjust-extension
+ append-output
+ ask-password
+ auth-no-challenge
+ background
+ backup-converted
+ backups
+ base
+ bind-address
+ bind-interface
+ body-data
+ body-file
+ ca-certificate
+ ca-directory
+ cache
+ certificate
+ certificate-type
+ check-certificate
+ check-hostname
+ chunk-size
+ clobber
+ compression
+ config
+ connect-timeout
+ content-disposition
+ content-on-error
+ continue
+ convert-file-only
+ convert-links
+ cookie-suffixes
+ cookies
+ crl-file
+ cut-dirs
+ cut-file-get-vars
+ cut-url-get-vars
+ debug
+ default-http-port
+ default-https-port
+ default-page
+ delete-after
+ directories
+ directory-prefix
+ dns-cache
+ dns-cache-preload
+ dns-timeout
+ domains
+ download-attr
+ egd-file
+ exclude-directories
+ exclude-domains
+ execute
+ filter-mime-type
+ filter-urls
+ follow-tags
+ force-atom
+ force-css
+ force-directories
+ force-html
+ force-metalink
+ force-progress
+ force-rss
+ force-sitemap
+ fsync-policy
+ gnupg-homedir
+ header
+ help
+ host-directories
+ hpkp
+ hpkp-file
+ hsts
+ hsts-file
+ hsts-preload
+ hsts-preload-file
+ html-extension
+ http-keep-alive
+ http-password
+ http-proxy
+ http-proxy-password
+ http-proxy-user
+ http-user
+ http2
+ http2-only
+ http2-request-window
+ https-enforce
+ https-only
+ https-proxy
+ hyperlink
+ if-modified-since
+ ignore-case
+ ignore-length
+ ignore-tags
+ include-directories
+ inet4-only
+ inet6-only
+ input-encoding
+ input-file
+ keep-extension
+ keep-session-cookies
+ level
+ limit-rate
+ list-plugins
+ load-cookies
+ local-db
+ local-encoding
+ local-plugin
+ max-redirect
+ max-threads
+ metalink
+ method
+ mirror
+ netrc
+ netrc-file
+ ocsp
+ ocsp-date
+ ocsp-file
+ ocsp-nonce
+ ocsp-server
+ ocsp-stapling
+ output-document
+ output-file
+ page-requisites
+ parent
+ password
+ plugin
+ plugin-dirs
+ plugin-help
+ plugin-opt
+ post-data
+ post-file
+ prefer-family
+ private-key
+ private-key-type
+ progress
+ protocol-directories
+ proxy
+ quiet
+ quota
+ random-file
+ random-wait
+ read-timeout
+ recursive
+ referer
+ regex-type
+ reject
+ reject-regex
+ remote-encoding
+ report-speed
+ restrict-file-names
+ retry-connrefused
+ retry-on-http-error
+ robots
+ save-content-on
+ save-cookies
+ save-headers
+ secure-protocol
+ server-response
+ signature-extensions
+ span-hosts
+ spider
+ start-pos
+ stats-dns
+ stats-ocsp
+ stats-server
+ stats-site
+ stats-tls
+ strict-comments
+ tcp-fastopen
+ timeout
+ timestamping
+ tls-false-start
+ tls-resume
+ tls-session-file
+ tries
+ trust-server-names
+ unlink
+ use-askpass
+ use-server-timestamps
+ user
+ user-agent
+ verbose
+ verify-save-failed
+ verify-sig
+ version
+ wait
+ waitretry
+ xattr
+EOL
+"}}}
+
+call map(s:commands, "substitute(v:val, '_', '[-_]\\\\=', 'g')")
+
+for cmd in s:commands
+ exe 'syn match wgetCommand "\<' . cmd . '\>" nextgroup=wgetAssignmentOperator skipwhite contained'
+endfor
+
+syn case match
+
+syn match wgetStart "^" nextgroup=wgetCommand,wgetComment skipwhite
+syn match wgetAssignmentOperator "=" nextgroup=wgetString,wgetBoolean,wgetNumber,wgetQuota,wgetTime skipwhite contained
+
+hi def link wgetAssignmentOperator Special
+hi def link wgetBoolean Boolean
+hi def link wgetCommand Identifier
+hi def link wgetComment Comment
+hi def link wgetNumber Number
+hi def link wgetQuota Number
+hi def link wgetString String
+hi def link wgetTime Number
+hi def link wgetTodo Todo
+
+let b:current_syntax = "wget"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8 fdm=marker:
diff --git a/runtime/syntax/whitespace.vim b/runtime/syntax/whitespace.vim
new file mode 100644
index 0000000..4d2e32e
--- /dev/null
+++ b/runtime/syntax/whitespace.vim
@@ -0,0 +1,13 @@
+" Simplistic way to make spaces and Tabs visible
+
+" This can be added to an already active syntax.
+
+syn match Space " "
+syn match Tab "\t"
+if &background == "dark"
+ hi def Space ctermbg=darkred guibg=#500000
+ hi def Tab ctermbg=darkgreen guibg=#003000
+else
+ hi def Space ctermbg=lightred guibg=#ffd0d0
+ hi def Tab ctermbg=lightgreen guibg=#d0ffd0
+endif
diff --git a/runtime/syntax/winbatch.vim b/runtime/syntax/winbatch.vim
new file mode 100644
index 0000000..15ea0fc
--- /dev/null
+++ b/runtime/syntax/winbatch.vim
@@ -0,0 +1,174 @@
+" Vim syntax file
+" Language: WinBatch/Webbatch (*.wbt, *.web)
+" Maintainer: dominique@mggen.com
+" URL: http://www.mggen.com/vim/syntax/winbatch.zip
+" Last change: 2001 May 10
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+syn keyword winbatchCtl if then else endif break end return exit next
+syn keyword winbatchCtl while for gosub goto switch select to case
+syn keyword winbatchCtl endselect endwhile endselect endswitch
+
+" String
+syn region winbatchVar start=+%+ end=+%+
+" %var% in strings
+syn region winbatchString start=+"+ end=+"+ contains=winbatchVar
+
+syn match winbatchComment ";.*$"
+syn match winbatchLabel "^\ *:[0-9a-zA-Z_\-]\+\>"
+
+" constant (bezgin by @)
+syn match winbatchConstant "@[0_9a-zA-Z_\-]\+"
+
+" number
+syn match winbatchNumber "\<[0-9]\+\(u\=l\=\|lu\|f\)\>"
+
+syn keyword winbatchImplicit aboveicons acc_attrib acc_chng_nt acc_control acc_create
+syn keyword winbatchImplicit acc_delete acc_full_95 acc_full_nt acc_list acc_pfull_nt
+syn keyword winbatchImplicit acc_pmang_nt acc_print_nt acc_read acc_read_95 acc_read_nt
+syn keyword winbatchImplicit acc_write amc arrange ascending attr_a attr_a attr_ci attr_ci
+syn keyword winbatchImplicit attr_dc attr_dc attr_di attr_di attr_dm attr_dm attr_h attr_h
+syn keyword winbatchImplicit attr_ic attr_ic attr_p attr_p attr_ri attr_ri attr_ro attr_ro
+syn keyword winbatchImplicit attr_sh attr_sh attr_sy attr_sy attr_t attr_t attr_x attr_x
+syn keyword winbatchImplicit avogadro backscan boltzmann cancel capslock check columns
+syn keyword winbatchImplicit commonformat cr crlf ctrl default default deg2rad descending
+syn keyword winbatchImplicit disable drive electric enable eulers false faraday float8
+syn keyword winbatchImplicit fwdscan gftsec globalgroup gmtsec goldenratio gravitation hidden
+syn keyword winbatchImplicit icon lbutton lclick ldblclick lf lightmps lightmtps localgroup
+syn keyword winbatchImplicit magfield major mbokcancel mbutton mbyesno mclick mdblclick minor
+syn keyword winbatchImplicit msformat multiple ncsaformat no none none noresize normal
+syn keyword winbatchImplicit notify nowait numlock off on open parsec parseonly pi
+syn keyword winbatchImplicit planckergs planckjoules printer rad2deg rbutton rclick rdblclick
+syn keyword winbatchImplicit regclasses regcurrent regmachine regroot regusers rows save
+syn keyword winbatchImplicit scrolllock server shift single sorted stack string tab tile
+syn keyword winbatchImplicit true uncheck unsorted wait wholesection word1 word2 word4 yes
+syn keyword winbatchImplicit zoomed about abs acos addextender appexist appwaitclose asin
+syn keyword winbatchImplicit askfilename askfiletext askitemlist askline askpassword askyesno
+syn keyword winbatchImplicit atan average beep binaryalloc binarycopy binaryeodget binaryeodset
+syn keyword winbatchImplicit binaryfree binaryhashrec binaryincr binaryincr2 binaryincr4
+syn keyword winbatchImplicit binaryincrflt binaryindex binaryindexnc binaryoletype binarypeek
+syn keyword winbatchImplicit binarypeek2 binarypeek4 binarypeekflt binarypeekstr binarypoke
+syn keyword winbatchImplicit binarypoke2 binarypoke4 binarypokeflt binarypokestr binaryread
+syn keyword winbatchImplicit binarysort binarystrcnt binarywrite boxbuttondraw boxbuttonkill
+syn keyword winbatchImplicit boxbuttonstat boxbuttonwait boxcaption boxcolor
+syn keyword winbatchImplicit boxdataclear boxdatatag
+syn keyword winbatchImplicit boxdestroy boxdrawcircle boxdrawline boxdrawrect boxdrawtext
+syn keyword winbatchImplicit boxesup boxmapmode boxnew boxopen boxpen boxshut boxtext boxtextcolor
+syn keyword winbatchImplicit boxtextfont boxtitle boxupdates break buttonnames by call
+syn keyword winbatchImplicit callext ceiling char2num clipappend clipget clipput
+syn keyword winbatchImplicit continue cos cosh datetime
+syn keyword winbatchImplicit ddeexecute ddeinitiate ddepoke dderequest ddeterminate
+syn keyword winbatchImplicit ddetimeout debug debugdata decimals delay dialog
+syn keyword winbatchImplicit dialogbox dirattrget dirattrset dirchange direxist
+syn keyword winbatchImplicit dirget dirhome diritemize dirmake dirremove dirrename
+syn keyword winbatchImplicit dirwindows diskexist diskfree diskinfo diskscan disksize
+syn keyword winbatchImplicit diskvolinfo display dllcall dllfree dllhinst dllhwnd dllload
+syn keyword winbatchImplicit dosboxcursorx dosboxcursory dosboxgetall dosboxgetdata
+syn keyword winbatchImplicit dosboxheight dosboxscrmode dosboxversion dosboxwidth dosversion
+syn keyword winbatchImplicit drop edosgetinfo edosgetvar edoslistvars edospathadd edospathchk
+syn keyword winbatchImplicit edospathdel edossetvar
+syn keyword winbatchImplicit endsession envgetinfo envgetvar environment
+syn keyword winbatchImplicit environset envitemize envlistvars envpathadd envpathchk
+syn keyword winbatchImplicit envpathdel envsetvar errormode exclusive execute exetypeinfo
+syn keyword winbatchImplicit exp fabs fileappend fileattrget fileattrset fileclose
+syn keyword winbatchImplicit filecompare filecopy filedelete fileexist fileextension filefullname
+syn keyword winbatchImplicit fileitemize filelocate filemapname filemove filenameeval1
+syn keyword winbatchImplicit filenameeval2 filenamelong filenameshort fileopen filepath
+syn keyword winbatchImplicit fileread filerename fileroot filesize filetimecode filetimeget
+syn keyword winbatchImplicit filetimeset filetimetouch fileverinfo filewrite fileymdhms
+syn keyword winbatchImplicit findwindow floor getexacttime gettickcount
+syn keyword winbatchImplicit iconarrange iconreplace ignoreinput inidelete inideletepvt
+syn keyword winbatchImplicit iniitemize iniitemizepvt iniread inireadpvt iniwrite iniwritepvt
+syn keyword winbatchImplicit installfile int intcontrol isdefined isfloat isint iskeydown
+syn keyword winbatchImplicit islicensed isnumber itemcount itemextract iteminsert itemlocate
+syn keyword winbatchImplicit itemremove itemselect itemsort keytoggleget keytoggleset
+syn keyword winbatchImplicit lasterror log10 logdisk loge max message min mod mouseclick
+syn keyword winbatchImplicit mouseclickbtn mousedrag mouseinfo mousemove msgtextget n3attach
+syn keyword winbatchImplicit n3captureend n3captureprt n3chgpassword n3detach n3dirattrget
+syn keyword winbatchImplicit n3dirattrset n3drivepath n3drivepath2 n3drivestatus n3fileattrget
+syn keyword winbatchImplicit n3fileattrset n3getloginid n3getmapped n3getnetaddr n3getuser
+syn keyword winbatchImplicit n3getuserid n3logout n3map n3mapdelete n3mapdir n3maproot n3memberdel
+syn keyword winbatchImplicit n3memberget n3memberset n3msgsend n3msgsendall n3serverinfo
+syn keyword winbatchImplicit n3serverlist n3setsrchdrv n3usergroups n3version n4attach
+syn keyword winbatchImplicit n4captureend n4captureprt n4chgpassword n4detach n4dirattrget
+syn keyword winbatchImplicit n4dirattrset n4drivepath n4drivestatus n4fileattrget n4fileattrset
+syn keyword winbatchImplicit n4getloginid n4getmapped n4getnetaddr n4getuser n4getuserid
+syn keyword winbatchImplicit n4login n4logout n4map n4mapdelete n4mapdir n4maproot n4memberdel
+syn keyword winbatchImplicit n4memberget n4memberset n4msgsend n4msgsendall n4serverinfo
+syn keyword winbatchImplicit n4serverlist n4setsrchdrv n4usergroups n4version netadddrive
+syn keyword winbatchImplicit netaddprinter netcancelcon netdirdialog netgetcon netgetuser
+syn keyword winbatchImplicit netinfo netresources netversion num2char objectclose
+syn keyword winbatchImplicit objectopen parsedata pause playmedia playmidi playwaveform
+syn keyword winbatchImplicit print random regapp regclosekey regconnect regcreatekey
+syn keyword winbatchImplicit regdeletekey regdelvalue regentrytype regloadhive regopenkey
+syn keyword winbatchImplicit regquerybin regquerydword regqueryex regqueryexpsz regqueryitem
+syn keyword winbatchImplicit regquerykey regquerymulsz regqueryvalue regsetbin
+syn keyword winbatchImplicit regsetdword regsetex regsetexpsz regsetmulsz regsetvalue
+syn keyword winbatchImplicit regunloadhive reload reload rtstatus run runenviron
+syn keyword winbatchImplicit runexit runhide runhidewait runicon runiconwait runshell runwait
+syn keyword winbatchImplicit runzoom runzoomwait sendkey sendkeyschild sendkeysto
+syn keyword winbatchImplicit sendmenusto shellexecute shortcutedit shortcutextra shortcutinfo
+syn keyword winbatchImplicit shortcutmake sin sinh snapshot sounds sqrt
+syn keyword winbatchImplicit srchfree srchinit srchnext strcat strcharcount strcmp
+syn keyword winbatchImplicit strfill strfix strfixchars stricmp strindex strlen
+syn keyword winbatchImplicit strlower strreplace strscan strsub strtrim strupper
+syn keyword winbatchImplicit tan tanh tcpaddr2host tcpftpchdir tcpftpclose tcpftpget
+syn keyword winbatchImplicit tcpftplist tcpftpmode tcpftpopen tcpftpput tcphost2addr tcphttpget
+syn keyword winbatchImplicit tcphttppost tcpparmget tcpparmset tcpping tcpsmtp terminate
+syn keyword winbatchImplicit textbox textboxsort textoutbufdel textoutbuffer textoutdebug
+syn keyword winbatchImplicit textoutfree textoutinfo textoutreset textouttrack textouttrackb
+syn keyword winbatchImplicit textouttrackp textoutwait textselect timeadd timedate
+syn keyword winbatchImplicit timedelay timediffdays timediffsecs timejulianday timejultoymd
+syn keyword winbatchImplicit timesubtract timewait timeymdhms version versiondll
+syn keyword winbatchImplicit w3addcon w3cancelcon w3dirbrowse w3getcaps w3getcon w3netdialog
+syn keyword winbatchImplicit w3netgetuser w3prtbrowse w3version w95accessadd w95accessdel
+syn keyword winbatchImplicit w95adddrive w95addprinter w95cancelcon w95dirdialog w95getcon
+syn keyword winbatchImplicit w95getuser w95resources w95shareadd w95sharedel w95shareset
+syn keyword winbatchImplicit w95version waitforkey wallpaper webbaseconv webcloselog
+syn keyword winbatchImplicit webcmddata webcondata webcounter webdatdata webdumperror webhashcode
+syn keyword winbatchImplicit webislocal weblogline webopenlog webout weboutfile webparamdata
+syn keyword winbatchImplicit webparamnames websettimeout webverifycard winactivate
+syn keyword winbatchImplicit winactivchild winarrange winclose winclosenot winconfig winexename
+syn keyword winbatchImplicit winexist winparset winparget winexistchild wingetactive
+syn keyword winbatchImplicit winhelp winhide winiconize winidget winisdos winitemchild
+syn keyword winbatchImplicit winitemize winitemnameid winmetrics winname winparmget
+syn keyword winbatchImplicit winparmset winplace winplaceget winplaceset
+syn keyword winbatchImplicit winposition winresources winshow winstate winsysinfo
+syn keyword winbatchImplicit wintitle winversion winwaitchild winwaitclose winwaitexist
+syn keyword winbatchImplicit winzoom wnaddcon wncancelcon wncmptrinfo wndialog
+syn keyword winbatchImplicit wndlgbrowse wndlgcon wndlgcon2 wndlgcon3
+syn keyword winbatchImplicit wndlgcon4 wndlgdiscon wndlgnoshare wndlgshare wngetcaps
+syn keyword winbatchImplicit wngetcon wngetuser wnnetnames wnrestore wnservers wnsharecnt
+syn keyword winbatchImplicit wnsharename wnsharepath wnshares wntaccessadd wntaccessdel
+syn keyword winbatchImplicit wntaccessget wntadddrive wntaddprinter wntcancelcon wntdirdialog
+syn keyword winbatchImplicit wntgetcon wntgetuser wntlistgroups wntmemberdel wntmemberget
+syn keyword winbatchImplicit wntmembergrps wntmemberlist wntmemberset wntresources wntshareadd
+syn keyword winbatchImplicit wntsharedel wntshareset wntversion wnversion wnwrkgroups wwenvunload
+syn keyword winbatchImplicit xbaseconvert xcursorset xdisklabelget xdriveready xextenderinfo
+syn keyword winbatchImplicit xgetchildhwnd xgetelapsed xhex xmemcompact xmessagebox
+syn keyword winbatchImplicit xsendmessage xverifyccard yield
+
+" Define the default highlighting.
+" Only when an item doesn't have highlighting yet
+
+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
+
+
+let b:current_syntax = "winbatch"
+
+" vim: ts=8
diff --git a/runtime/syntax/wml.vim b/runtime/syntax/wml.vim
new file mode 100644
index 0000000..73bf822
--- /dev/null
+++ b/runtime/syntax/wml.vim
@@ -0,0 +1,150 @@
+" Vim syntax file
+" Language: WML - Website MetaLanguage
+" Maintainer: Gerfried Fuchs <alfie@ist.org>
+" Filenames: *.wml
+" Last Change: 07 Feb 2002
+" URL: http://alfie.ist.org/software/vim/syntax/wml.vim
+"
+" Original Version: Craig Small <csmall@eye-net.com.au>
+
+" Comments are very welcome - but please make sure that you are commenting on
+" the latest version of this file.
+" SPAM is _NOT_ welcome - be ready to be reported!
+
+" If you are looking for the "Wireless Markup Language" syntax file,
+" please take a look at the wap.vim file done by Ralf Schandl, soon in a
+" vim-package around your corner :)
+
+
+" 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
+runtime! syntax/html.vim
+unlet b:current_syntax
+
+if !exists("main_syntax")
+ let main_syntax = 'wml'
+endif
+
+" special character
+syn match wmlNextLine "\\$"
+
+" Redfine htmlTag
+syn clear htmlTag
+syn region htmlTag start=+<[^/<]+ end=+>+ contains=htmlTagN,htmlString,htmlArg,htmlValue,htmlTagError,htmlEvent,htmlCssDefinition
+
+"
+" Add in extra Arguments used by wml
+syn keyword htmlTagName contained gfont imgbg imgdot lowsrc
+syn keyword htmlTagName contained navbar:define navbar:header
+syn keyword htmlTagName contained navbar:footer navbar:prolog
+syn keyword htmlTagName contained navbar:epilog navbar:button
+syn keyword htmlTagName contained navbar:filter navbar:debug
+syn keyword htmlTagName contained navbar:render
+syn keyword htmlTagName contained preload rollover
+syn keyword htmlTagName contained space hspace vspace over
+syn keyword htmlTagName contained ps ds pi ein big sc spaced headline
+syn keyword htmlTagName contained ue subheadline zwue verbcode
+syn keyword htmlTagName contained isolatin pod sdf text url verbatim
+syn keyword htmlTagName contained xtable
+syn keyword htmlTagName contained csmap fsview import box
+syn keyword htmlTagName contained case:upper case:lower
+syn keyword htmlTagName contained grid cell info lang: logo page
+syn keyword htmlTagName contained set-var restore
+syn keyword htmlTagName contained array:push array:show set-var ifdef
+syn keyword htmlTagName contained say m4 symbol dump enter divert
+syn keyword htmlTagName contained toc
+syn keyword htmlTagName contained wml card do refresh oneevent catch spawn
+
+"
+" The wml arguments
+syn keyword htmlArg contained adjust background base bdcolor bdspace
+syn keyword htmlArg contained bdwidth complete copyright created crop
+syn keyword htmlArg contained direction description domainname eperlfilter
+syn keyword htmlArg contained file hint imgbase imgstar interchar interline
+syn keyword htmlArg contained keephr keepindex keywords layout spacing
+syn keyword htmlArg contained padding nonetscape noscale notag notypo
+syn keyword htmlArg contained onload oversrc pos select slices style
+syn keyword htmlArg contained subselected txtcol_select txtcol_normal
+syn keyword htmlArg contained txtonly via
+syn keyword htmlArg contained mode columns localsrc ordered
+
+
+" Lines starting with an # are usually comments
+syn match wmlComment "^\s*#.*"
+" The different exceptions to comments
+syn match wmlSharpBang "^#!.*"
+syn match wmlUsed contained "\s\s*[A-Za-z:_-]*"
+syn match wmlUse "^\s*#\s*use\s\+" contains=wmlUsed
+syn match wmlInclude "^\s*#\s*include.+"
+
+syn region wmlBody contained start=+<<+ end=+>>+
+
+syn match wmlLocationId contained "[A-Za-z]\+"
+syn region wmlLocation start=+<<+ end=+>>+ contains=wmlLocationId
+"syn region wmlLocation start=+{#+ end=+#}+ contains=wmlLocationId
+"syn region wmlLocationed contained start=+<<+ end=+>>+ contains=wmlLocationId
+
+syn match wmlDivert "\.\.[a-zA-Z_]\+>>"
+syn match wmlDivertEnd "<<\.\."
+" new version
+"syn match wmlDivert "{#[a-zA-Z_]\+#:"
+"syn match wmlDivertEnd ":##}"
+
+syn match wmlDefineName contained "\s\+[A-Za-z-]\+"
+syn region htmlTagName start="\<\(define-tag\|define-region\)" end="\>" contains=wmlDefineName
+
+" The perl include stuff
+if main_syntax != 'perl'
+ " Perl script
+ syn include @wmlPerlScript syntax/perl.vim
+ unlet b:current_syntax
+
+ syn region perlScript start=+<perl>+ keepend end=+</perl>+ contains=@wmlPerlScript,wmlPerlTag
+" eperl between '<:' and ':>' -- Alfie [1999-12-26]
+ syn region perlScript start=+<:+ keepend end=+:>+ contains=@wmlPerlScript,wmlPerlTag
+ syn match wmlPerlTag contained "</*perl>" contains=wmlPerlTagN
+ syn keyword wmlPerlTagN contained perl
+
+ hi link wmlPerlTag htmlTag
+ hi link wmlPerlTagN htmlStatement
+endif
+
+" verbatim tags -- don't highlight anything in between -- Alfie [2002-02-07]
+syn region wmlVerbatimText start=+<verbatim>+ keepend end=+</verbatim>+ contains=wmlVerbatimTag
+syn match wmlVerbatimTag contained "</*verbatim>" contains=wmlVerbatimTagN
+syn keyword wmlVerbatimTagN contained verbatim
+hi link wmlVerbatimTag htmlTag
+hi link wmlVerbatimTagN htmlStatement
+
+if main_syntax == "html"
+ syn sync match wmlHighlight groupthere NONE "</a-zA-Z]"
+ syn sync match wmlHighlight groupthere perlScript "<perl>"
+ syn sync match wmlHighlightSkip "^.*['\"].*$"
+ syn sync minlines=10
+endif
+
+" Define the default highlighting.
+" 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/wsh.vim b/runtime/syntax/wsh.vim
new file mode 100644
index 0000000..4b664a1
--- /dev/null
+++ b/runtime/syntax/wsh.vim
@@ -0,0 +1,45 @@
+" Vim syntax file
+" Language: Windows Scripting Host
+" Maintainer: Paul Moore <pf_moore AT yahoo.co.uk>
+" Last Change: Fre, 24 Nov 2000 21:54:09 +0100
+
+" This reuses the XML, VB and JavaScript syntax files. While VB is not
+" VBScript, it's close enough for us. No attempt is made to handle
+" other languages.
+" Send comments, suggestions and requests to the maintainer.
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:wsh_cpo_save = &cpo
+set cpo&vim
+
+runtime! syntax/xml.vim
+unlet b:current_syntax
+
+syn case ignore
+syn include @wshVBScript <sfile>:p:h/vb.vim
+unlet b:current_syntax
+syn include @wshJavaScript <sfile>:p:h/javascript.vim
+unlet b:current_syntax
+syn region wshVBScript
+ \ matchgroup=xmlTag start="<script[^>]*VBScript\(>\|[^>]*[^/>]>\)"
+ \ matchgroup=xmlEndTag end="</script>"
+ \ fold
+ \ contains=@wshVBScript
+ \ keepend
+syn region wshJavaScript
+ \ matchgroup=xmlTag start="<script[^>]*J\(ava\)\=Script\(>\|[^>]*[^/>]>\)"
+ \ matchgroup=xmlEndTag end="</script>"
+ \ fold
+ \ contains=@wshJavaScript
+ \ keepend
+
+syn cluster xmlRegionHook add=wshVBScript,wshJavaScript
+
+let b:current_syntax = "wsh"
+
+let &cpo = s:wsh_cpo_save
+unlet s:wsh_cpo_save
diff --git a/runtime/syntax/wsml.vim b/runtime/syntax/wsml.vim
new file mode 100644
index 0000000..d01294c
--- /dev/null
+++ b/runtime/syntax/wsml.vim
@@ -0,0 +1,113 @@
+" Vim syntax file
+" Language: WSML
+" Maintainer: Thomas Haselwanter <thomas.haselwanter@deri.org>
+" URL: none
+" Last Change: 2006 Apr 30
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" WSML
+syn keyword wsmlHeader wsmlVariant
+syn keyword wsmlNamespace namespace
+syn keyword wsmlTopLevel concept instance relationInstance ofType usesMediator usesService relation sharedVariables importsOntology
+syn keyword wsmlOntology hasValue memberOf ofType impliesType subConceptOf
+syn keyword wsmlAxiom axiom definedBy
+syn keyword wsmlService assumption effect postcondition precondition capability interface
+syn keyword wsmlTopLevel ooMediator wwMediator wgMediator ggMediator
+syn keyword wsmlMediation usesService source target
+syn match wsmlDataTypes "\( _string\| _decimal\| _integer\| _float\| _double\| _iri\| _sqname\| _boolean\| _duration\| _dateTime\| _time\| _date\| _gyearmonth\| _gyear\| _gmonthday\| _gday\| _gmonth\| _hexbinary\| _base64binary\)\((\S*)\)\?" contains=wsmlString,wsmlNumber,wsmlCharacter
+syn keyword wsmlTopLevel goal webService ontology
+syn keyword wsmlKeywordsInsideLEs true false memberOf hasValue subConceptOf ofType impliesType and or implies impliedBy equivalent neg naf forall exists
+syn keyword wsmlNFP nfp endnfp nonFunctionalProperties endNonFunctionalProperties
+syn region wsmlNFPregion start="nfp\|nonFunctionalProperties" end="endnfp\|endNonFunctionalProperties" contains=ALL
+syn region wsmlNamespace start="namespace" end="}" contains=wsmlIdentifier
+syn match wsmlOperator "!=\|:=:\|=<\|>=\|=\|+\|\*\|/\|<->\|->\|<-\|:-\|!-\|-\|<\|>"
+syn match wsmlBrace "(\|)\|\[\|\]\|{\|}"
+syn match wsmlIdentifier +_"\S*"+
+syn match wsmlIdentifier "_#\d*"
+syn match wsmlSqName "[0-9A-Za-z]\+#[0-9A-Za-z]\+"
+syn match wsmlVariable "?[0-9A-Za-z]\+"
+
+" ASM-specific code
+syn keyword wsmlBehavioral choreography orchestration transitionRules
+syn keyword wsmlChoreographyPri stateSignature in out shared static controlled
+syn keyword wsmlChoreographySec with do withGrounding forall endForall choose if then endIf
+syn match wsmlChoreographyTer "\(\s\|\_^\)\(add\|delete\|update\)\s*(.*)" contains=wsmlKeywordsInsideLEs,wsmlIdentifier,wsmlSqName,wsmlString,wsmlNumber,wsmlDataTypes,wsmlVariable
+
+" Comments
+syn keyword wsmlTodo contained TODO
+syn keyword wsmlFixMe contained FIXME
+if exists("wsml_comment_strings")
+ syn region wsmlCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=wsmlSpecial,wsmlCommentStar,wsmlSpecialChar,@Spell
+ syn region wsmlComment2String contained start=+"+ end=+$\|"+ contains=wsmlSpecial,wsmlSpecialChar,@Spell
+ syn match wsmlCommentCharacter contained "'\\[^']\{1,6\}'" contains=wsmlSpecialChar
+ syn match wsmlCommentCharacter contained "'\\''" contains=wsmlSpecialChar
+ syn match wsmlCommentCharacter contained "'[^\\]'"
+ syn cluster wsmlCommentSpecial add=wsmlCommentString,wsmlCommentCharacter,wsmlNumber
+ syn cluster wsmlCommentSpecial2 add=wsmlComment2String,wsmlCommentCharacter,wsmlNumber
+endif
+
+syn region wsmlComment start="/\*" end="\*/" contains=@wsmlCommentSpecial,wsmlTodo,wsmlFixMe,@Spell
+syn match wsmlCommentStar contained "^\s*\*[^/]"me=e-1
+syn match wsmlCommentStar contained "^\s*\*$"
+syn match wsmlLineComment "//.*" contains=@wsmlCommentSpecial2,wsmlTodo,@Spell
+
+syn cluster wsmlTop add=wsmlComment,wsmlLineComment
+
+"match the special comment /**/
+syn match wsmlComment "/\*\*/"
+
+" Strings
+syn region wsmlString start=+"+ end=+"+ contains=wsmlSpecialChar,wsmlSpecialError,@Spell
+syn match wsmlCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
+syn match wsmlCharacter "'\\''" contains=javaSpecialChar
+syn match wsmlCharacter "'[^\\]'"
+syn match wsmlNumber "\<\(0[0-7]*\|0[xX]\x\+\|\d\+\)[lL]\=\>"
+syn match wsmlNumber "\(\<\d\+\.\d*\|\.\d\+\)\([eE][-+]\=\d\+\)\=[fFdD]\="
+syn match wsmlNumber "\<\d\+[eE][-+]\=\d\+[fFdD]\=\>"
+syn match wsmlNumber "\<\d\+\([eE][-+]\=\d\+\)\=[fFdD]\>"
+
+" unicode characters
+syn match wsmlSpecial "\\u\d\{4\}"
+
+syn cluster wsmlTop add=wsmlString,wsmlCharacter,wsmlNumber,wsmlSpecial,wsmlStringError
+
+" Define the default highlighting.
+" 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
+
+
+let b:current_syntax = "wsml"
+let b:spell_options="contained"
+
diff --git a/runtime/syntax/wvdial.vim b/runtime/syntax/wvdial.vim
new file mode 100644
index 0000000..035138b
--- /dev/null
+++ b/runtime/syntax/wvdial.vim
@@ -0,0 +1,28 @@
+" Vim syntax file
+" Language: Configuration file for WvDial
+" Maintainer: Prahlad Vaidyanathan <slime@vsnl.net>
+" Last Update: Mon, 15 Oct 2001 09:39:03 Indian Standard Time
+
+" Quit if syntax file is already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match wvdialComment "^;.*$"lc=1
+syn match wvdialComment "[^\\];.*$"lc=1
+syn match wvdialSection "^\s*\[.*\]"
+syn match wvdialValue "=.*$"ms=s+1
+syn match wvdialValue "\s*[^ ;"' ]\+"lc=1
+syn match wvdialVar "^\s*\(Inherits\|Modem\|Baud\|Init.\|Phone\|Area\ Code\|Dial\ Prefix\|Dial\ Command\|Login\|Login\| Prompt\|Password\|Password\ Prompt\|PPPD\ Path\|Force\ Address\|Remote\ Name\|Carrier\ Check\|Stupid\ [Mm]ode\|New\ PPPD\|Default\ Reply\|Auto\ Reconnect\|SetVolume\|Username\)"
+syn match wvdialEqual "="
+
+" The default highlighting
+hi def link wvdialComment Comment
+hi def link wvdialSection PreProc
+hi def link wvdialVar Identifier
+hi def link wvdialValue String
+hi def link wvdialEqual Statement
+
+let b:current_syntax = "wvdial"
+
+"EOF vim: tw=78:ft=vim:ts=8
diff --git a/runtime/syntax/xbl.vim b/runtime/syntax/xbl.vim
new file mode 100644
index 0000000..97837e3
--- /dev/null
+++ b/runtime/syntax/xbl.vim
@@ -0,0 +1,29 @@
+" Vim syntax file
+" Language: XBL 1.0
+" Maintainer: Doug Kearns <dougkearns@gmail.com>
+" Latest Revision: 2007 November 5
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+runtime! syntax/xml.vim
+unlet b:current_syntax
+
+syn include @javascriptTop syntax/javascript.vim
+unlet b:current_syntax
+
+syn region xblJavascript
+ \ matchgroup=xmlCdataStart start=+<!\[CDATA\[+
+ \ matchgroup=xmlCdataEnd end=+]]>+
+ \ contains=@javascriptTop keepend extend
+
+let b:current_syntax = "xbl"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim: ts=8
diff --git a/runtime/syntax/xdefaults.vim b/runtime/syntax/xdefaults.vim
new file mode 100644
index 0000000..7da5969
--- /dev/null
+++ b/runtime/syntax/xdefaults.vim
@@ -0,0 +1,132 @@
+" Vim syntax file
+" Language: X resources files like ~/.Xdefaults (xrdb)
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Author and previous maintainer:
+" Gautam H. Mudunuri <gmudunur@informatica.com>
+" Last Change: Di, 09 Mai 2006 23:10:23 CEST
+" $Id: xdefaults.vim,v 1.2 2007/05/05 17:19:40 vimboss Exp $
+"
+" REFERENCES:
+" xrdb manual page
+" xrdb source: ftp://ftp.x.org/pub/R6.4/xc/programs/xrdb/xrdb.c
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" turn case on
+syn case match
+
+
+if !exists("xdefaults_no_colon_errors")
+ " mark lines which do not contain a colon as errors.
+ " This does not really catch all errors but only lines
+ " which contain at least two WORDS and no colon. This
+ " was done this way so that a line is not marked as
+ " error while typing (which would be annoying).
+ syntax match xdefaultsErrorLine "^\s*[a-zA-Z.*]\+\s\+[^: ]\+"
+endif
+
+
+" syn region xdefaultsLabel start=+^[^:]\{-}:+he=e-1 skip=+\\+ end="$"
+syn match xdefaultsLabel +^[^:]\{-}:+he=e-1 contains=xdefaultsPunct,xdefaultsSpecial,xdefaultsLineEnd
+syn region xdefaultsValue keepend start=+:+lc=1 skip=+\\+ end=+$+ contains=xdefaultsSpecial,xdefaultsLabel,xdefaultsLineEnd
+
+syn match xdefaultsSpecial contained +#override+
+syn match xdefaultsSpecial contained +#augment+
+syn match xdefaultsPunct contained +[.*:]+
+syn match xdefaultsLineEnd contained +\\$+
+syn match xdefaultsLineEnd contained +\\n\\$+
+syn match xdefaultsLineEnd contained +\\n$+
+
+
+
+" COMMENTS
+
+" note, that the '!' must be at the very first position of the line
+syn match xdefaultsComment "^!.*$" contains=xdefaultsTodo,@Spell
+
+" lines starting with a '#' mark and which are not preprocessor
+" lines are skipped. This is not part of the xrdb documentation.
+" It was reported by Bram Moolenaar and could be confirmed by
+" having a look at xrdb.c:GetEntries()
+syn match xdefaultsCommentH "^#.*$"
+"syn region xdefaultsComment start="^#" end="$" keepend contains=ALL
+syn region xdefaultsComment start="/\*" end="\*/" contains=xdefaultsTodo,@Spell
+
+syntax match xdefaultsCommentError "\*/"
+
+syn keyword xdefaultsTodo contained TODO FIXME XXX display
+
+
+
+" PREPROCESSOR STUFF
+
+syn region xdefaultsPreProc start="^\s*#\s*\(if\|ifdef\|ifndef\|elif\|else\|endif\)\>" skip="\\$" end="$" contains=xdefaultsSymbol
+if !exists("xdefaults_no_if0")
+ syn region xdefaultsCppOut start="^\s*#\s*if\s\+0\>" end=".\|$" contains=xdefaultsCppOut2
+ syn region xdefaultsCppOut2 contained start="0" end="^\s*#\s*\(endif\>\|else\>\|elif\>\)" contains=xdefaultsCppSkip
+ syn region xdefaultsCppSkip contained start="^\s*#\s*\(if\>\|ifdef\>\|ifndef\>\)" skip="\\$" end="^\s*#\s*endif\>" contains=xdefaultsCppSkip
+endif
+syn region xdefaultsIncluded contained start=+"+ skip=+\\\\\|\\"+ end=+"+
+syn match xdefaultsIncluded contained "<[^>]*>"
+syn match xdefaultsInclude "^\s*#\s*include\>\s*["<]" contains=xdefaultsIncluded
+syn cluster xdefaultsPreProcGroup contains=xdefaultsPreProc,xdefaultsIncluded,xdefaultsInclude,xdefaultsDefine,xdefaultsCppOut,xdefaultsCppOut2,xdefaultsCppSkip
+syn region xdefaultsDefine start="^\s*#\s*\(define\|undef\)\>" skip="\\$" end="$" contains=ALLBUT,@xdefaultsPreProcGroup,xdefaultsCommentH,xdefaultsErrorLine,xdefaultsLabel,xdefaultsValue
+syn region xdefaultsPreProc start="^\s*#\s*\(pragma\>\|line\>\|warning\>\|warn\>\|error\>\)" skip="\\$" end="$" keepend contains=ALLBUT,@xdefaultsPreProcGroup,xdefaultsCommentH,xdefaultsErrorLine,xdefaultsLabel,xdefaultsValue
+
+
+
+" symbols as defined by xrdb
+syn keyword xdefaultsSymbol contained SERVERHOST
+syn match xdefaultsSymbol contained "SRVR_[a-zA-Z0-9_]\+"
+syn keyword xdefaultsSymbol contained HOST
+syn keyword xdefaultsSymbol contained DISPLAY_NUM
+syn keyword xdefaultsSymbol contained CLIENTHOST
+syn match xdefaultsSymbol contained "CLNT_[a-zA-Z0-9_]\+"
+syn keyword xdefaultsSymbol contained RELEASE
+syn keyword xdefaultsSymbol contained REVISION
+syn keyword xdefaultsSymbol contained VERSION
+syn keyword xdefaultsSymbol contained VENDOR
+syn match xdefaultsSymbol contained "VNDR_[a-zA-Z0-9_]\+"
+syn match xdefaultsSymbol contained "EXT_[a-zA-Z0-9_]\+"
+syn keyword xdefaultsSymbol contained NUM_SCREENS
+syn keyword xdefaultsSymbol contained SCREEN_NUM
+syn keyword xdefaultsSymbol contained BITS_PER_RGB
+syn keyword xdefaultsSymbol contained CLASS
+syn keyword xdefaultsSymbol contained StaticGray GrayScale StaticColor PseudoColor TrueColor DirectColor
+syn match xdefaultsSymbol contained "CLASS_\(StaticGray\|GrayScale\|StaticColor\|PseudoColor\|TrueColor\|DirectColor\)"
+syn keyword xdefaultsSymbol contained COLOR
+syn match xdefaultsSymbol contained "CLASS_\(StaticGray\|GrayScale\|StaticColor\|PseudoColor\|TrueColor\|DirectColor\)_[0-9]\+"
+syn keyword xdefaultsSymbol contained HEIGHT
+syn keyword xdefaultsSymbol contained WIDTH
+syn keyword xdefaultsSymbol contained PLANES
+syn keyword xdefaultsSymbol contained X_RESOLUTION
+syn keyword xdefaultsSymbol contained Y_RESOLUTION
+
+" Define the default highlighting.
+" 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"
+
+" vim:ts=8
diff --git a/runtime/syntax/xf86conf.vim b/runtime/syntax/xf86conf.vim
new file mode 100644
index 0000000..e8162f3
--- /dev/null
+++ b/runtime/syntax/xf86conf.vim
@@ -0,0 +1,207 @@
+" Vim syntax file
+" Language: XF86Config (XFree86 configuration file)
+" Former Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Last Change By David: 2010 Nov 01
+" Last Change: 2023 Jan 23
+" Required Vim Version: 6.0
+"
+" Options: let xf86conf_xfree86_version = 3 or 4
+" to force XFree86 3.x or 4.x XF86Config syntax
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+if !exists("b:xf86conf_xfree86_version")
+ if exists("xf86conf_xfree86_version")
+ let b:xf86conf_xfree86_version = xf86conf_xfree86_version
+ else
+ let b:xf86conf_xfree86_version = 4
+ endif
+endif
+
+syn case ignore
+
+" Comments
+syn match xf86confComment "#.*$" contains=xf86confTodo
+syn case match
+syn keyword xf86confTodo FIXME TODO XXX NOT contained
+syn case ignore
+syn match xf86confTodo "???" contained
+
+" Sectioning errors
+syn keyword xf86confSectionError Section contained
+syn keyword xf86confSectionError EndSection
+syn keyword xf86confSubSectionError SubSection
+syn keyword xf86confSubSectionError EndSubSection
+syn keyword xf86confModeSubSectionError Mode
+syn keyword xf86confModeSubSectionError EndMode
+syn cluster xf86confSectionErrors contains=xf86confSectionError,xf86confSubSectionError,xf86confModeSubSectionError
+
+" Values
+if b:xf86conf_xfree86_version >= 4
+ syn region xf86confString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained contains=xf86confSpecialChar,xf86confConstant,xf86confOptionName oneline keepend nextgroup=xf86confValue skipwhite
+else
+ syn region xf86confString start=+"+ skip=+\\\\\|\\"+ end=+"+ contained contains=xf86confSpecialChar,xf86confOptionName oneline keepend
+endif
+syn match xf86confSpecialChar "\\\d\d\d\|\\." contained
+syn match xf86confDecimalNumber "\(\s\|-\)\zs\d*\.\=\d\+\>"
+syn match xf86confFrequency "\(\s\|-\)\zs\d\+\.\=\d*\(Hz\|k\|kHz\|M\|MHz\)"
+syn match xf86confOctalNumber "\<0\o\+\>"
+syn match xf86confOctalNumberError "\<0\o\+[89]\d*\>"
+syn match xf86confHexadecimalNumber "\<0x\x\+\>"
+syn match xf86confValue "\s\+.*$" contained contains=xf86confComment,xf86confString,xf86confFrequency,xf86conf\w\+Number,xf86confConstant
+syn keyword xf86confOption Option nextgroup=xf86confString skipwhite
+syn match xf86confModeLineValue "\"[^\"]\+\"\(\_s\+[0-9.]\+\)\{9}" nextgroup=xf86confSync skipwhite skipnl
+
+" Sections and subsections
+if b:xf86conf_xfree86_version >= 4
+ syn region xf86confSection matchgroup=xf86confSectionDelim start="^\s*Section\s\+\"\(Files\|Server[_ ]*Flags\|Input[_ ]*Device\|Device\|Video[_ ]*Adaptor\|Server[_ ]*Layout\|DRI\|Extensions\|Vendor\|Keyboard\|Pointer\|InputClass\)\"" end="^\s*EndSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confComment,xf86confOption,xf86confKeyword,xf86confSectionError
+ syn region xf86confSectionModule matchgroup=xf86confSectionDelim start="^\s*Section\s\+\"Module\"" end="^\s*EndSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confSubsectionAny,xf86confComment,xf86confOption,xf86confKeyword
+ syn region xf86confSectionMonitor matchgroup=xf86confSectionDelim start="^\s*Section\s\+\"Monitor\"" end="^\s*EndSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confSubsectionMode,xf86confModeLine,xf86confComment,xf86confOption,xf86confKeyword
+ syn region xf86confSectionModes matchgroup=xf86confSectionDelim start="^\s*Section\s\+\"Modes\"" end="^\s*EndSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confSubsectionMode,xf86confModeLine,xf86confComment
+ syn region xf86confSectionScreen matchgroup=xf86confSectionDelim start="^\s*Section\s\+\"Screen\"" end="^\s*EndSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confSubsectionDisplay,xf86confComment,xf86confOption,xf86confKeyword
+ syn region xf86confSubSectionAny matchgroup=xf86confSectionDelim start="^\s*SubSection\s\+\"[^\"]\+\"" end="^\s*EndSubSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confComment,xf86confOption,xf86confKeyword,@xf86confSectionErrors
+ syn region xf86confSubSectionMode matchgroup=xf86confSectionDelim start="^\s*Mode\s\+\"[^\"]\+\"" end="^\s*EndMode\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confComment,xf86confKeyword,@xf86confSectionErrors
+ syn region xf86confSubSectionDisplay matchgroup=xf86confSectionDelim start="^\s*SubSection\s\+\"Display\"" end="^\s*EndSubSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confComment,xf86confOption,xf86confKeyword,@xf86confSectionErrors
+else
+ syn region xf86confSection matchgroup=xf86confSectionDelim start="^\s*Section\s\+\"\(Files\|Server[_ ]*Flags\|Device\|Keyboard\|Pointer\)\"" end="^\s*EndSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confComment,xf86confOptionName,xf86confOption,xf86confKeyword
+ syn region xf86confSectionMX matchgroup=xf86confSectionDelim start="^\s*Section\s\+\"\(Module\|Xinput\)\"" end="^\s*EndSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confSubsectionAny,xf86confComment,xf86confOptionName,xf86confOption,xf86confKeyword
+ syn region xf86confSectionMonitor matchgroup=xf86confSectionDelim start="^\s*Section\s\+\"Monitor\"" end="^\s*EndSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confSubsectionMode,xf86confModeLine,xf86confComment,xf86confOptionName,xf86confOption,xf86confKeyword
+ syn region xf86confSectionScreen matchgroup=xf86confSectionDelim start="^\s*Section\s\+\"Screen\"" end="^\s*EndSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confSubsectionDisplay,xf86confComment,xf86confOptionName,xf86confOption,xf86confKeyword
+ syn region xf86confSubSectionAny matchgroup=xf86confSectionDelim start="^\s*SubSection\s\+\"[^\"]\+\"" end="^\s*EndSubSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confComment,xf86confOptionName,xf86confOption,xf86confKeyword,@xf86confSectionErrors
+ syn region xf86confSubSectionMode matchgroup=xf86confSectionDelim start="^\s*Mode\s\+\"[^\"]\+\"" end="^\s*EndMode\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confComment,xf86confOptionName,xf86confOption,xf86confKeyword,@xf86confSectionErrors
+ syn region xf86confSubSectionDisplay matchgroup=xf86confSectionDelim start="^\s*SubSection\s\+\"Display\"" end="^\s*EndSubSection\>" skip="#.*$\|\"[^\"]*\"" contains=xf86confComment,xf86confOptionName,xf86confOption,xf86confKeyword,@xf86confSectionErrors
+endif
+
+" Options
+if b:xf86conf_xfree86_version >= 4
+ command -nargs=+ Xf86confdeclopt syn keyword xf86confOptionName <args> contained
+else
+ command -nargs=+ Xf86confdeclopt syn keyword xf86confOptionName <args> contained nextgroup=xf86confValue,xf86confComment skipwhite
+endif
+
+Xf86confdeclopt 18bitBus AGPFastWrite AGPMode Accel AllowClosedownGrabs AllowDeactivateGrabs
+Xf86confdeclopt AllowMouseOpenFail AllowNonLocalModInDev AllowNonLocalXvidtune AlwaysCore
+Xf86confdeclopt AngleOffset AutoRepeat BaudRate BeamTimeout Beep BlankTime BlockWrite BottomX
+Xf86confdeclopt BottomY ButtonNumber ButtonThreshold Buttons ByteSwap CacheLines ChordMiddle
+Xf86confdeclopt ClearDTR ClearDTS ClickMode CloneDisplay CloneHSync CloneMode CloneVRefresh
+Xf86confdeclopt ColorKey Composite CompositeSync CoreKeyboard CorePointer Crt2Memory CrtScreen
+Xf86confdeclopt CrtcNumber CyberShadow CyberStretch DDC DDCMode DMAForXv DPMS Dac6Bit DacSpeed
+Xf86confdeclopt DataBits Debug DebugLevel DefaultServerLayout DeltaX DeltaY Device DeviceName
+Xf86confdeclopt DisableModInDev DisableVidModeExtension Display Display1400 DontVTSwitch
+Xf86confdeclopt DontZap DontZoom DoubleScan DozeMode DozeScan DozeTime DragLockButtons
+Xf86confdeclopt DualCount DualRefresh EarlyRasPrecharge Emulate3Buttons Emulate3Timeout
+Xf86confdeclopt EmulateWheel EmulateWheelButton EmulateWheelInertia EnablePageFlip EnterCount
+Xf86confdeclopt EstimateSizesAggressively ExternDisp FPClock16 FPClock24 FPClock32
+Xf86confdeclopt FPClock8 FPDither FastDram FifoAggresive FifoConservative FifoModerate
+Xf86confdeclopt FireGL3000 FixPanelSize FlatPanel FlipXY FlowControl ForceCRT1 ForceCRT2Type
+Xf86confdeclopt ForceLegacyCRT ForcePCIMode FpmVRAM FrameBufferWC FullMMIO GammaBrightness
+Xf86confdeclopt HWClocks HWCursor HandleSpecialKeys HistorySize Interlace Interlaced InternDisp
+Xf86confdeclopt InvX InvY InvertX InvertY KeepShape LCDClock LateRasPrecharge LcdCenter
+Xf86confdeclopt LeftAlt Linear MGASDRAM MMIO MMIOCache MTTR MaxX MaxY MaximumXPosition
+Xf86confdeclopt MaximumYPosition MinX MinY MinimumXPosition MinimumYPosition NoAccel
+Xf86confdeclopt NoAllowMouseOpenFail NoAllowNonLocalModInDev NoAllowNonLocalXvidtune
+Xf86confdeclopt NoBlockWrite NoCompositeSync NoCompression NoCrtScreen NoCyberShadow NoDCC
+Xf86confdeclopt NoDDC NoDac6Bit NoDebug NoDisableModInDev NoDisableVidModeExtension NoDontZap
+Xf86confdeclopt NoDontZoom NoFireGL3000 NoFixPanelSize NoFpmVRAM NoFrameBufferWC NoHWClocks
+Xf86confdeclopt NoHWCursor NoHal NoLcdCenter NoLinear NoMGASDRAM NoMMIO NoMMIOCache NoMTTR
+Xf86confdeclopt NoOverClockMem NoOverlay NoPC98 NoPM NoPciBurst NoPciRetry NoProbeClock
+Xf86confdeclopt NoSTN NoSWCursor NoShadowFb NoShowCache NoSlowEDODRAM NoStretch NoSuspendHack
+Xf86confdeclopt NoTexturedVideo NoTrapSignals NoUseFBDev NoUseModeline NoUseVclk1 NoVTSysReq
+Xf86confdeclopt NoXVideo NvAGP OSMImageBuffers OffTime Origin OverClockMem Overlay
+Xf86confdeclopt PC98 PCIBurst PM PWMActive PWMSleep PanelDelayCompensation PanelHeight
+Xf86confdeclopt PanelOff PanelWidth Parity PciBurst PciRetry Pixmap Port PressDur PressPitch
+Xf86confdeclopt PressVol ProbeClocks ProgramFPRegs Protocol RGBBits ReleaseDur ReleasePitch
+Xf86confdeclopt ReportingMode Resolution RightAlt RightCtl Rotate STN SWCursor SampleRate
+Xf86confdeclopt ScreenNumber ScrollLock SendCoreEvents SendDragEvents Serial ServerNumLock
+Xf86confdeclopt SetLcdClk SetMClk SetRefClk ShadowFb ShadowStatus ShowCache SleepMode
+Xf86confdeclopt SleepScan SleepTime SlowDram SlowEDODRAM StandbyTime StopBits Stretch
+Xf86confdeclopt SuspendHack SuspendTime SwapXY SyncOnGreen TV TVOutput TVOverscan TVStandard
+Xf86confdeclopt TVXPosOffset TVYPosOffset TexturedVideo Threshold Tilt TopX TopY TouchTime
+Xf86confdeclopt TrapSignals Type USB UseBIOS UseFB UseFBDev UseFlatPanel UseModeline
+Xf86confdeclopt UseROMData UseVclk1 VTInit VTSysReq VTime VideoKey Vmin XAxisMapping
+Xf86confdeclopt XLeds XVideo XaaNoCPUToScreenColorExpandFill XaaNoColor8x8PatternFillRect
+Xf86confdeclopt XaaNoColor8x8PatternFillTrap XaaNoDashedBresenhamLine XaaNoDashedTwoPointLine
+Xf86confdeclopt XaaNoImageWriteRect XaaNoMono8x8PatternFillRect XaaNoMono8x8PatternFillTrap
+Xf86confdeclopt XaaNoOffscreenPixmaps XaaNoPixmapCache XaaNoScanlineCPUToScreenColorExpandFill
+Xf86confdeclopt XaaNoScanlineImageWriteRect XaaNoScreenToScreenColorExpandFill
+Xf86confdeclopt XaaNoScreenToScreenCopy XaaNoSolidBresenhamLine XaaNoSolidFillRect
+Xf86confdeclopt XaaNoSolidFillTrap XaaNoSolidHorVertLine XaaNoSolidTwoPointLine Xinerama
+Xf86confdeclopt XkbCompat XkbDisable XkbGeometry XkbKeycodes XkbKeymap XkbLayout XkbModel
+Xf86confdeclopt XkbOptions XkbRules XkbSymbols XkbTypes XkbVariant XvBskew XvHsync XvOnCRT2
+Xf86confdeclopt XvRskew XvVsync YAxisMapping ZAxisMapping ZoomOnLCD
+
+delcommand Xf86confdeclopt
+
+" Keywords
+syn keyword xf86confKeyword Device Driver FontPath Group Identifier Load ModelName ModulePath Monitor RGBPath VendorName VideoAdaptor Visual nextgroup=xf86confComment,xf86confString skipwhite
+syn keyword xf86confKeyword BiosBase Black BoardName BusID ChipID ChipRev Chipset nextgroup=xf86confComment,xf86confValue
+syn keyword xf86confKeyword ClockChip Clocks DacSpeed DefaultDepth DefaultFbBpp nextgroup=xf86confComment,xf86confValue
+syn keyword xf86confKeyword DefaultColorDepth nextgroup=xf86confComment,xf86confValue
+syn keyword xf86confKeyword Depth DisplaySize DotClock FbBpp Flags Gamma HorizSync nextgroup=xf86confComment,xf86confValue
+syn keyword xf86confKeyword Hskew HTimings InputDevice IOBase MemBase Mode nextgroup=xf86confComment,xf86confValue
+syn keyword xf86confKeyword Modes Ramdac Screen TextClockFreq UseModes VendorName nextgroup=xf86confComment,xf86confValue
+syn keyword xf86confKeyword VertRefresh VideoRam ViewPort Virtual VScan VTimings nextgroup=xf86confComment,xf86confValue
+syn keyword xf86confKeyword Weight White nextgroup=xf86confComment,xf86confValue
+syn keyword xf86confMatch MatchDevicePath MatchDriver MatchLayout MatchOS MatchPnPID MatchProduct MatchTag MatchUSBID MatchVendor nextgroup=xf86confComment,xf86confString skipwhite
+syn keyword xf86confMatch MatchIsPointer MatchIsKeyboard MatchIsTouchpad MatchIsTouchscreen MatchIsJoystick nextgroup=xf86confComment,xf86confValue skipwhite
+syn keyword xf86confModeLine ModeLine nextgroup=xf86confComment,xf86confModeLineValue skipwhite skipnl
+
+" Constants
+if b:xf86conf_xfree86_version >= 4
+ syn keyword xf86confConstant true false on off yes no omit contained
+else
+ syn keyword xf86confConstant Meta Compose Control
+endif
+syn keyword xf86confConstant StaticGray GrayScale StaticColor PseudoColor TrueColor DirectColor contained
+syn keyword xf86confConstant Absolute RightOf LeftOf Above Below Relative StaticGray GrayScale StaticColor PseudoColor TrueColor DirectColor contained
+syn match xf86confSync "\(\s\+[+-][CHV]_*Sync\)\+" contained
+
+" Synchronization
+if b:xf86conf_xfree86_version >= 4
+ syn sync match xf86confSyncSection grouphere xf86confSection "^\s*Section\s\+\"\(Files\|Server[_ ]*Flags\|Input[_ ]*Device\|Device\|Video[_ ]*Adaptor\|Server[_ ]*Layout\|DRI\|Extensions\|Vendor\|Keyboard\|Pointer\|InputClass\)\""
+ syn sync match xf86confSyncSectionModule grouphere xf86confSectionModule "^\s*Section\s\+\"Module\""
+ syn sync match xf86confSyncSectionModes groupthere xf86confSectionModes "^\s*Section\s\+\"Modes\""
+else
+ syn sync match xf86confSyncSection grouphere xf86confSection "^\s*Section\s\+\"\(Files\|Server[_ ]*Flags\|Device\|Keyboard\|Pointer\)\""
+ syn sync match xf86confSyncSectionMX grouphere xf86confSectionMX "^\s*Section\s\+\"\(Module\|Xinput\)\""
+endif
+syn sync match xf86confSyncSectionMonitor groupthere xf86confSectionMonitor "^\s*Section\s\+\"Monitor\""
+syn sync match xf86confSyncSectionScreen groupthere xf86confSectionScreen "^\s*Section\s\+\"Screen\""
+syn sync match xf86confSyncEndSection groupthere NONE "^\s*End_*Section\s*$"
+
+" Define the default highlighting
+hi def link xf86confComment Comment
+hi def link xf86confTodo Todo
+hi def link xf86confSectionDelim Statement
+hi def link xf86confOptionName Identifier
+
+hi def link xf86confSectionError xf86confError
+hi def link xf86confSubSectionError xf86confError
+hi def link xf86confModeSubSectionError xf86confError
+hi def link xf86confOctalNumberError xf86confError
+hi def link xf86confError Error
+
+hi def link xf86confOption xf86confKeyword
+hi def link xf86confMatch xf86confKeyword
+hi def link xf86confModeLine xf86confKeyword
+hi def link xf86confKeyword Type
+
+hi def link xf86confDecimalNumber xf86confNumber
+hi def link xf86confOctalNumber xf86confNumber
+hi def link xf86confHexadecimalNumber xf86confNumber
+hi def link xf86confFrequency xf86confNumber
+hi def link xf86confModeLineValue Constant
+hi def link xf86confNumber Constant
+
+hi def link xf86confSync xf86confConstant
+hi def link xf86confConstant Special
+hi def link xf86confSpecialChar Special
+hi def link xf86confString String
+
+hi def link xf86confValue Constant
+
+let b:current_syntax = "xf86conf"
diff --git a/runtime/syntax/xhtml.vim b/runtime/syntax/xhtml.vim
new file mode 100644
index 0000000..0c6ea73
--- /dev/null
+++ b/runtime/syntax/xhtml.vim
@@ -0,0 +1,11 @@
+" Vim syntax file
+" Language: XHTML
+" Maintainer: noone
+" Last Change: 2003 Feb 04
+
+" Load the HTML syntax for now.
+runtime! syntax/html.vim
+
+let b:current_syntax = "xhtml"
+
+" vim: ts=8
diff --git a/runtime/syntax/xinetd.vim b/runtime/syntax/xinetd.vim
new file mode 100644
index 0000000..fab3a91
--- /dev/null
+++ b/runtime/syntax/xinetd.vim
@@ -0,0 +1,347 @@
+" Vim syntax file
+" Language: xinetd.conf(5) configuration file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword xinetdTodo contained TODO FIXME XXX NOTE
+
+syn region xinetdComment display oneline start='^\s*#' end='$'
+ \ contains=xinetdTodo,@Spell
+
+syn match xinetdService '^\s*service\>'
+ \ nextgroup=xinetdServiceName skipwhite
+
+syn match xinetdServiceName contained '\S\+'
+ \ nextgroup=xinetdServiceGroup skipwhite skipnl
+
+syn match xinetdDefaults '^\s*defaults'
+ \ nextgroup=xinetdServiceGroup skipwhite skipnl
+
+syn region xinetdServiceGroup contained transparent
+ \ matchgroup=xinetdServiceGroupD start='{'
+ \ matchgroup=xinetdServiceGroupD end='}'
+ \ contains=xinetdAttribute,xinetdReqAttribute,
+ \ xinetdDisable
+
+syn keyword xinetdReqAttribute contained user server protocol
+ \ nextgroup=xinetdStringEq skipwhite
+
+syn keyword xinetdAttribute contained id group bind
+ \ interface
+ \ nextgroup=xinetdStringEq skipwhite
+
+syn match xinetdStringEq contained display '='
+ \ nextgroup=xinetdString skipwhite
+
+syn match xinetdString contained display '\S\+'
+
+syn keyword xinetdAttribute contained type nextgroup=xinetdTypeEq skipwhite
+
+syn match xinetdTypeEq contained display '='
+ \ nextgroup=xinetdType skipwhite
+
+syn keyword xinetdType contained RPC INTERNAL TCPMUX TCPMUXPLUS
+ \ UNLISTED
+ \ nextgroup=xinetdType skipwhite
+
+syn keyword xinetdAttribute contained flags
+ \ nextgroup=xinetdFlagsEq skipwhite
+
+syn cluster xinetdFlagsC contains=xinetdFlags,xinetdDeprFlags
+
+syn match xinetdFlagsEq contained display '='
+ \ nextgroup=@xinetdFlagsC skipwhite
+
+syn keyword xinetdFlags contained INTERCEPT NORETRY IDONLY NAMEINARGS
+ \ NODELAY KEEPALIVE NOLIBWRAP SENSOR IPv4 IPv6
+ \ nextgroup=@xinetdFlagsC skipwhite
+
+syn keyword xinetdDeprFlags contained REUSE nextgroup=xinetdFlagsC skipwhite
+
+syn keyword xinetdDisable contained disable
+ \ nextgroup=xinetdBooleanEq skipwhite
+
+syn match xinetdBooleanEq contained display '='
+ \ nextgroup=xinetdBoolean skipwhite
+
+syn keyword xinetdBoolean contained yes no
+
+syn keyword xinetdReqAttribute contained socket_type
+ \ nextgroup=xinetdSocketTypeEq skipwhite
+
+syn match xinetdSocketTypeEq contained display '='
+ \ nextgroup=xinetdSocketType skipwhite
+
+syn keyword xinetdSocketType contained stream dgram raw seqpacket
+
+syn keyword xinetdReqAttribute contained wait
+ \ nextgroup=xinetdBooleanEq skipwhite
+
+syn keyword xinetdAttribute contained groups mdns
+ \ nextgroup=xinetdBooleanEq skipwhite
+
+syn keyword xinetdAttribute contained instances per_source rlimit_cpu
+ \ rlimit_data rlimit_rss rlimit_stack
+ \ nextgroup=xinetdUNumberEq skipwhite
+
+syn match xinetdUNumberEq contained display '='
+ \ nextgroup=xinetdUnlimited,xinetdNumber
+ \ skipwhite
+
+syn keyword xinetdUnlimited contained UNLIMITED
+
+syn match xinetdNumber contained display '\<\d\+\>'
+
+syn keyword xinetdAttribute contained nice
+ \ nextgroup=xinetdSignedNumEq skipwhite
+
+syn match xinetdSignedNumEq contained display '='
+ \ nextgroup=xinetdSignedNumber skipwhite
+
+syn match xinetdSignedNumber contained display '[+-]\=\d\+\>'
+
+syn keyword xinetdAttribute contained server_args
+ \ enabled
+ \ nextgroup=xinetdStringsEq skipwhite
+
+syn match xinetdStringsEq contained display '='
+ \ nextgroup=xinetdStrings skipwhite
+
+syn match xinetdStrings contained display '\S\+'
+ \ nextgroup=xinetdStrings skipwhite
+
+syn keyword xinetdAttribute contained only_from no_access passenv
+ \ nextgroup=xinetdStringsAdvEq skipwhite
+
+syn match xinetdStringsAdvEq contained display '[+-]\=='
+ \ nextgroup=xinetdStrings skipwhite
+
+syn keyword xinetdAttribute contained access_times
+ \ nextgroup=xinetdTimeRangesEq skipwhite
+
+syn match xinetdTimeRangesEq contained display '='
+ \ nextgroup=xinetdTimeRanges skipwhite
+
+syn match xinetdTimeRanges contained display
+ \ '\%(0?\d\|1\d\|2[0-3]\):\%(0?\d\|[1-5]\d\)-\%(0?\d\|1\d\|2[0-3]\):\%(0?\d\|[1-5]\d\)'
+ \ nextgroup=xinetdTimeRanges skipwhite
+
+syn keyword xinetdAttribute contained log_type nextgroup=xinetdLogTypeEq
+ \ skipwhite
+
+syn match xinetdLogTypeEq contained display '='
+ \ nextgroup=xinetdLogType skipwhite
+
+syn keyword xinetdLogType contained SYSLOG nextgroup=xinetdSyslogType
+ \ skipwhite
+
+syn keyword xinetdLogType contained FILE nextgroup=xinetdLogFile skipwhite
+
+syn keyword xinetdSyslogType contained daemon auth authpriv user mail lpr
+ \ news uucp ftp local0 local1 local2 local3
+ \ local4 local5 local6 local7
+ \ nextgroup=xinetdSyslogLevel skipwhite
+
+syn keyword xinetdSyslogLevel contained emerg alert crit err warning notice
+ \ info debug
+
+syn match xinetdLogFile contained display '\S\+'
+ \ nextgroup=xinetdLogSoftLimit skipwhite
+
+syn match xinetdLogSoftLimit contained display '\<\d\+\>'
+ \ nextgroup=xinetdLogHardLimit skipwhite
+
+syn match xinetdLogHardLimit contained display '\<\d\+\>'
+
+syn keyword xinetdAttribute contained log_on_success
+ \ nextgroup=xinetdLogSuccessEq skipwhite
+
+syn match xinetdLogSuccessEq contained display '[+-]\=='
+ \ nextgroup=xinetdLogSuccess skipwhite
+
+syn keyword xinetdLogSuccess contained PID HOST USERID EXIT DURATION TRAFFIC
+ \ nextgroup=xinetdLogSuccess skipwhite
+
+syn keyword xinetdAttribute contained log_on_failure
+ \ nextgroup=xinetdLogFailureEq skipwhite
+
+syn match xinetdLogFailureEq contained display '[+-]\=='
+ \ nextgroup=xinetdLogFailure skipwhite
+
+syn keyword xinetdLogFailure contained HOST USERID ATTEMPT
+ \ nextgroup=xinetdLogFailure skipwhite
+
+syn keyword xinetdReqAttribute contained rpc_version
+ \ nextgroup=xinetdRPCVersionEq skipwhite
+
+syn match xinetdRPCVersionEq contained display '='
+ \ nextgroup=xinetdRPCVersion skipwhite
+
+syn match xinetdRPCVersion contained display '\d\+\%(-\d\+\)\=\>'
+
+syn keyword xinetdReqAttribute contained rpc_number port
+ \ nextgroup=xinetdNumberEq skipwhite
+
+syn match xinetdNumberEq contained display '='
+ \ nextgroup=xinetdNumber skipwhite
+
+syn keyword xinetdAttribute contained env nextgroup=xinetdEnvEq skipwhite
+
+syn match xinetdEnvEq contained display '+\=='
+ \ nextgroup=xinetdEnvName skipwhite
+
+syn match xinetdEnvName contained display '[^=]\+'
+ \ nextgroup=xinetdEnvNameEq
+
+syn match xinetdEnvNameEq contained display '=' nextgroup=xinetdEnvValue
+
+syn match xinetdEnvValue contained display '\S\+'
+ \ nextgroup=xinetdEnvName skipwhite
+
+syn keyword xinetdAttribute contained banner banner_success banner_failure
+ \ nextgroup=xinetdPathEq skipwhite
+
+syn keyword xinetdPPAttribute include includedir
+ \ nextgroup=xinetdPath skipwhite
+
+syn match xinetdPathEq contained display '='
+ \ nextgroup=xinetdPath skipwhite
+
+syn match xinetdPath contained display '\S\+'
+
+syn keyword xinetdAttribute contained redirect nextgroup=xinetdRedirectEq
+ \ skipwhite
+
+syn match xinetdRedirectEq contained display '='
+ \ nextgroup=xinetdRedirectIP skipwhite
+
+syn match xinetdRedirectIP contained display '\S\+'
+ \ nextgroup=xinetdNumber skipwhite
+
+syn keyword xinetdAttribute contained cps nextgroup=xinetdCPSEq skipwhite
+
+syn match xinetdCPSEq contained display '='
+ \ nextgroup=xinetdCPS skipwhite
+
+syn match xinetdCPS contained display '\<\d\+\>'
+ \ nextgroup=xinetdNumber skipwhite
+
+syn keyword xinetdAttribute contained max_load nextgroup=xinetdFloatEq
+ \ skipwhite
+
+syn match xinetdFloatEq contained display '='
+ \ nextgroup=xinetdFloat skipwhite
+
+syn match xinetdFloat contained display '\d\+\.\d*\|\.\d\+'
+
+syn keyword xinetdAttribute contained umask nextgroup=xinetdOctalEq
+ \ skipwhite
+
+syn match xinetdOctalEq contained display '='
+ \ nextgroup=xinetdOctal,xinetdOctalError
+ \ skipwhite
+
+syn match xinetdOctal contained display '\<0\o\+\>'
+ \ contains=xinetdOctalZero
+syn match xinetdOctalZero contained display '\<0'
+syn match xinetdOctalError contained display '\<0\o*[89]\d*\>'
+
+syn keyword xinetdAttribute contained rlimit_as nextgroup=xinetdASEq
+ \ skipwhite
+
+syn match xinetdASEq contained display '='
+ \ nextgroup=xinetdAS,xinetdUnlimited
+ \ skipwhite
+
+syn match xinetdAS contained display '\d\+' nextgroup=xinetdASMult
+
+syn match xinetdASMult contained display '[KM]'
+
+syn keyword xinetdAttribute contained deny_time nextgroup=xinetdDenyTimeEq
+ \ skipwhite
+
+syn match xinetdDenyTimeEq contained display '='
+ \ nextgroup=xinetdDenyTime,xinetdNumber
+ \ skipwhite
+
+syn keyword xinetdDenyTime contained FOREVER NEVER
+
+hi def link xinetdTodo Todo
+hi def link xinetdComment Comment
+hi def link xinetdService Keyword
+hi def link xinetdServiceName String
+hi def link xinetdDefaults Keyword
+hi def link xinetdServiceGroupD Delimiter
+hi def link xinetdReqAttribute Keyword
+hi def link xinetdAttribute Type
+hi def link xinetdEq Operator
+hi def link xinetdStringEq xinetdEq
+hi def link xinetdString String
+hi def link xinetdTypeEq xinetdEq
+hi def link xinetdType Identifier
+hi def link xinetdFlagsEq xinetdEq
+hi def link xinetdFlags xinetdType
+hi def link xinetdDeprFlags WarningMsg
+hi def link xinetdDisable Special
+hi def link xinetdBooleanEq xinetdEq
+hi def link xinetdBoolean Boolean
+hi def link xinetdSocketTypeEq xinetdEq
+hi def link xinetdSocketType xinetdType
+hi def link xinetdUNumberEq xinetdEq
+hi def link xinetdUnlimited Define
+hi def link xinetdNumber Number
+hi def link xinetdSignedNumEq xinetdEq
+hi def link xinetdSignedNumber xinetdNumber
+hi def link xinetdStringsEq xinetdEq
+hi def link xinetdStrings xinetdString
+hi def link xinetdStringsAdvEq xinetdEq
+hi def link xinetdTimeRangesEq xinetdEq
+hi def link xinetdTimeRanges Number
+hi def link xinetdLogTypeEq xinetdEq
+hi def link xinetdLogType Keyword
+hi def link xinetdSyslogType xinetdType
+hi def link xinetdSyslogLevel Number
+hi def link xinetdLogFile xinetdPath
+hi def link xinetdLogSoftLimit xinetdNumber
+hi def link xinetdLogHardLimit xinetdNumber
+hi def link xinetdLogSuccessEq xinetdEq
+hi def link xinetdLogSuccess xinetdType
+hi def link xinetdLogFailureEq xinetdEq
+hi def link xinetdLogFailure xinetdType
+hi def link xinetdRPCVersionEq xinetdEq
+hi def link xinetdRPCVersion xinetdNumber
+hi def link xinetdNumberEq xinetdEq
+hi def link xinetdEnvEq xinetdEq
+hi def link xinetdEnvName Identifier
+hi def link xinetdEnvNameEq xinetdEq
+hi def link xinetdEnvValue String
+hi def link xinetdPPAttribute PreProc
+hi def link xinetdPathEq xinetdEq
+hi def link xinetdPath String
+hi def link xinetdRedirectEq xinetdEq
+hi def link xinetdRedirectIP String
+hi def link xinetdCPSEq xinetdEq
+hi def link xinetdCPS xinetdNumber
+hi def link xinetdFloatEq xinetdEq
+hi def link xinetdFloat xinetdNumber
+hi def link xinetdOctalEq xinetdEq
+hi def link xinetdOctal xinetdNumber
+hi def link xinetdOctalZero PreProc
+hi def link xinetdOctalError Error
+hi def link xinetdASEq xinetdEq
+hi def link xinetdAS xinetdNumber
+hi def link xinetdASMult PreProc
+hi def link xinetdDenyTimeEq xinetdEq
+hi def link xinetdDenyTime PreProc
+
+let b:current_syntax = "xinetd"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/xkb.vim b/runtime/syntax/xkb.vim
new file mode 100644
index 0000000..22be56d
--- /dev/null
+++ b/runtime/syntax/xkb.vim
@@ -0,0 +1,79 @@
+" Vim syntax file
+" This is a GENERATED FILE. Please always refer to source file at the URI below.
+" Language: XKB (X Keyboard Extension) components
+" Maintainer: David Ne\v{c}as (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2020 Oct 18
+" URL: http://trific.ath.cx/Ftp/vim/syntax/xkb.vim
+
+" Setup
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case match
+syn sync minlines=100
+
+" Comments
+syn region xkbComment start="//" skip="\\$" end="$" keepend contains=xkbTodo
+syn region xkbComment start="/\*" matchgroup=NONE end="\*/" contains=xkbCommentStartError,xkbTodo
+syn match xkbCommentError "\*/"
+syntax match xkbCommentStartError "/\*" contained
+syn sync ccomment xkbComment
+syn keyword xkbTodo TODO FIXME contained
+
+" Literal strings
+syn match xkbSpecialChar "\\\d\d\d\|\\." contained
+syn region xkbString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=xkbSpecialChar oneline
+
+" Catch errors caused by wrong parenthesization
+syn region xkbParen start='(' end=')' contains=ALLBUT,xkbParenError,xkbSpecial,xkbTodo transparent
+syn match xkbParenError ")"
+syn region xkbBrace start='{' end='}' contains=ALLBUT,xkbBraceError,xkbSpecial,xkbTodo transparent
+syn match xkbBraceError "}"
+syn region xkbBracket start='\[' end='\]' contains=ALLBUT,xkbBracketError,xkbSpecial,xkbTodo transparent
+syn match xkbBracketError "\]"
+
+" Physical keys
+syn match xkbPhysicalKey "<\w\+>"
+
+" Keywords
+syn keyword xkbPreproc augment include replace
+syn keyword xkbConstant False True
+syn keyword xkbModif override replace
+syn keyword xkbIdentifier action affect alias allowExplicit approx baseColor button clearLocks color controls cornerRadius count ctrls description driveskbd font fontSize gap group groups height indicator indicatorDrivesKeyboard interpret key keys labelColor latchToLock latchMods left level_name map maximum minimum modifier_map modifiers name offColor onColor outline preserve priority repeat row section setMods shape slant solid symbols text top type useModMapMods virtualModifier virtualMods virtual_modifiers weight whichModState width
+syn keyword xkbFunction AnyOf ISOLock LatchGroup LatchMods LockControls LockGroup LockMods LockPointerButton MovePtr NoAction PointerButton SetControls SetGroup SetMods SetPtrDflt Terminate
+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
+
+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
new file mode 100644
index 0000000..37ae951
--- /dev/null
+++ b/runtime/syntax/xmath.vim
@@ -0,0 +1,225 @@
+" Vim syntax file
+" Language: xmath (a simulation tool)
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Aug 31, 2016
+" Version: 10
+" 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 exists("b:current_syntax")
+ finish
+endif
+
+" parenthesis sanity checker
+syn region xmathZone matchgroup=Delimiter start="(" matchgroup=Delimiter end=")" transparent contains=ALLBUT,xmathError,xmathBraceError,xmathCurlyError
+syn region xmathZone matchgroup=Delimiter start="{" matchgroup=Delimiter end="}" transparent contains=ALLBUT,xmathError,xmathBraceError,xmathParenError
+syn region xmathZone matchgroup=Delimiter start="\[" matchgroup=Delimiter end="]" transparent contains=ALLBUT,xmathError,xmathCurlyError,xmathParenError
+syn match xmathError "[)\]}]"
+syn match xmathBraceError "[)}]" contained
+syn match xmathCurlyError "[)\]]" contained
+syn match xmathParenError "[\]}]" contained
+syn match xmathComma "[,;:]"
+syn match xmathComma "\.\.\.$"
+
+" A bunch of useful xmath keywords
+syn case ignore
+syn keyword xmathFuncCmd function endfunction command endcommand
+syn keyword xmathStatement abort beep debug default define
+syn keyword xmathStatement execute exit pause return undefine
+syn keyword xmathConditional if else elseif endif
+syn keyword xmathRepeat while for endwhile endfor
+syn keyword xmathCmd anigraph deletedatastore keep renamedatastore
+syn keyword xmathCmd autocode deletestd linkhyper renamestd
+syn keyword xmathCmd build deletesuperblock linksim renamesuperblock
+syn keyword xmathCmd comment deletetransition listusertype save
+syn keyword xmathCmd copydatastore deleteusertype load sbadisplay
+syn keyword xmathCmd copystd detailmodel lock set
+syn keyword xmathCmd copysuperblock display minmax_display setsbdefault
+syn keyword xmathCmd createblock documentit modifyblock show
+syn keyword xmathCmd createbubble editcatalog modifybubble showlicense
+syn keyword xmathCmd createconnection erase modifystd showsbdefault
+syn keyword xmathCmd creatertf expandsuperbubble modifysuperblock stop
+syn keyword xmathCmd createstd for modifytransition stopcosim
+syn keyword xmathCmd createsuperblock go modifyusertype syntax
+syn keyword xmathCmd createsuperbubble goto new unalias
+syn keyword xmathCmd createtransition hardcopy next unlock
+syn keyword xmathCmd createusertype help polargraph usertype
+syn keyword xmathCmd delete hyperbuild print whatis
+syn keyword xmathCmd deleteblock if printmodel while
+syn keyword xmathCmd deletebubble ifilter quit who
+syn keyword xmathCmd deleteconnection ipcwc remove xgraph
+
+syn keyword xmathFunc abcd eye irea querystdoptions
+syn keyword xmathFunc abs eyepattern is querysuperblock
+syn keyword xmathFunc acos feedback ISID querysuperblockopt
+syn keyword xmathFunc acosh fft ISID Models querytransition
+syn keyword xmathFunc adconversion fftpdm kronecker querytransitionopt
+syn keyword xmathFunc afeedback filter length qz
+syn keyword xmathFunc all find limit rampinvar
+syn keyword xmathFunc ambiguity firparks lin random
+syn keyword xmathFunc amdemod firremez lin30 randpdm
+syn keyword xmathFunc analytic firwind linearfm randpert
+syn keyword xmathFunc analyze fmdemod linfnorm randsys
+syn keyword xmathFunc any forwdiff lintodb rank
+syn keyword xmathFunc append fprintf list rayleigh
+syn keyword xmathFunc argn frac log rcepstrum
+syn keyword xmathFunc argv fracred log10 rcond
+syn keyword xmathFunc arma freq logm rdintegrate
+syn keyword xmathFunc arma2ss freqcircle lognormal read
+syn keyword xmathFunc armax freqcont logspace real
+syn keyword xmathFunc ascii frequencyhop lowpass rectify
+syn keyword xmathFunc asin fsesti lpopt redschur
+syn keyword xmathFunc asinh fslqgcomp lqgcomp reflect
+syn keyword xmathFunc atan fsregu lqgltr regulator
+syn keyword xmathFunc atan2 fwls ls residue
+syn keyword xmathFunc atanh gabor ls2unc riccati
+syn keyword xmathFunc attach_ac100 garb ls2var riccati_eig
+syn keyword xmathFunc backdiff gaussian lsjoin riccati_schur
+syn keyword xmathFunc balance gcexp lu ricean
+syn keyword xmathFunc balmoore gcos lyapunov rifd
+syn keyword xmathFunc bandpass gdfileselection makecontinuous rlinfo
+syn keyword xmathFunc bandstop gdmessage makematrix rlocus
+syn keyword xmathFunc bj gdselection makepoly rms
+syn keyword xmathFunc blknorm genconv margin rootlocus
+syn keyword xmathFunc bode get markoff roots
+syn keyword xmathFunc bpm get_info30 matchedpz round
+syn keyword xmathFunc bpm2inn get_inn max rref
+syn keyword xmathFunc bpmjoin gfdm maxlike rve_get
+syn keyword xmathFunc bpmsplit gfsk mean rve_info
+syn keyword xmathFunc bst gfskernel mergeseg rve_reset
+syn keyword xmathFunc buttconstr gfunction min rve_update
+syn keyword xmathFunc butterworth ggauss minimal samplehold
+syn keyword xmathFunc cancel giv mkpert schur
+syn keyword xmathFunc canform giv2var mkphase sdf
+syn keyword xmathFunc ccepstrum givjoin mma sds
+syn keyword xmathFunc char gpsk mmaget sdtrsp
+syn keyword xmathFunc chebconstr gpulse mmaput sec
+syn keyword xmathFunc chebyshev gqam mod sech
+syn keyword xmathFunc check gqpsk modal siginterp
+syn keyword xmathFunc cholesky gramp modalstate sign
+syn keyword xmathFunc chop gsawtooth modcarrier sim
+syn keyword xmathFunc circonv gsigmoid mreduce sim30
+syn keyword xmathFunc circorr gsin mtxplt simin
+syn keyword xmathFunc clock gsinc mu simin30
+syn keyword xmathFunc clocus gsqpsk mulhank simout
+syn keyword xmathFunc clsys gsquarewave multipath simout30
+syn keyword xmathFunc coherence gstep musynfit simtransform
+syn keyword xmathFunc colorind GuiDialogCreate mxstr2xmstr sin
+syn keyword xmathFunc combinepf GuiDialogDestroy mxstring2xmstring singriccati
+syn keyword xmathFunc commentof GuiFlush names sinh
+syn keyword xmathFunc compare GuiGetValue nichols sinm
+syn keyword xmathFunc complementaryerf GuiManage noisefilt size
+syn keyword xmathFunc complexenvelope GuiPlot none smargin
+syn keyword xmathFunc complexfreqshift GuiPlotGet norm sns2sys
+syn keyword xmathFunc concatseg GuiSetValue numden sort
+syn keyword xmathFunc condition GuiShellCreate nyquist spectrad
+syn keyword xmathFunc conj GuiShellDeiconify obscf spectrum
+syn keyword xmathFunc conmap GuiShellDestroy observable spline
+syn keyword xmathFunc connect GuiShellIconify oe sprintf
+syn keyword xmathFunc conpdm GuiShellLower ones sqrt
+syn keyword xmathFunc constellation GuiShellRaise ophank sqrtm
+syn keyword xmathFunc consys GuiShellRealize optimize sresidualize
+syn keyword xmathFunc controllable GuiShellUnrealize optscale ss2arma
+syn keyword xmathFunc convolve GuiTimer orderfilt sst
+syn keyword xmathFunc correlate GuiToolCreate orderstate ssv
+syn keyword xmathFunc cos GuiToolDestroy orth stable
+syn keyword xmathFunc cosh GuiToolExist oscmd stair
+syn keyword xmathFunc cosm GuiUnmanage oscope starp
+syn keyword xmathFunc cot GuiWidgetExist osscale step
+syn keyword xmathFunc coth h2norm padcrop stepinvar
+syn keyword xmathFunc covariance h2syn partialsum string
+syn keyword xmathFunc csc hadamard pdm stringex
+syn keyword xmathFunc csch hankelsv pdmslice substr
+syn keyword xmathFunc csum hessenberg pem subsys
+syn keyword xmathFunc ctrcf highpass perfplots sum
+syn keyword xmathFunc ctrlplot hilbert period svd
+syn keyword xmathFunc daug hilberttransform pfscale svplot
+syn keyword xmathFunc dbtolin hinfcontr phaseshift sweep
+syn keyword xmathFunc dct hinfnorm pinv symbolmap
+syn keyword xmathFunc decimate hinfsyn plot sys2sns
+syn keyword xmathFunc defFreqRange histogram plot30 sysic
+syn keyword xmathFunc defTimeRange idfreq pmdemod Sysid
+syn keyword xmathFunc delay idimpulse poisson system
+syn keyword xmathFunc delsubstr idsim poissonimpulse tan
+syn keyword xmathFunc det ifft poleplace tanh
+syn keyword xmathFunc detrend imag poles taper
+syn keyword xmathFunc dht impinvar polezero tfid
+syn keyword xmathFunc diagonal impplot poltrend toeplitz
+syn keyword xmathFunc differentiate impulse polyfit trace
+syn keyword xmathFunc directsequence index polynomial tril
+syn keyword xmathFunc discretize indexlist polyval trim
+syn keyword xmathFunc divide initial polyvalm trim30
+syn keyword xmathFunc domain initmodel prbs triu
+syn keyword xmathFunc dst initx0 product trsp
+syn keyword xmathFunc eig inn2bpm psd truncate
+syn keyword xmathFunc ellipconstr inn2pe put_inn tustin
+syn keyword xmathFunc elliptic inn2unc qpopt uniform
+syn keyword xmathFunc erf insertseg qr val
+syn keyword xmathFunc error int quantize variance
+syn keyword xmathFunc estimator integrate queryblock videolines
+syn keyword xmathFunc etfe integratedump queryblockoptions wcbode
+syn keyword xmathFunc exist interp querybubble wcgain
+syn keyword xmathFunc exp interpolate querybubbleoptionswindow
+syn keyword xmathFunc expm inv querycatalog wtbalance
+syn keyword xmathFunc extractchan invhilbert queryconnection zeros
+syn keyword xmathFunc extractseg iqmix querystd
+
+syn case match
+
+" Labels (supports xmath's goto)
+syn match xmathLabel "^\s*<[a-zA-Z_][a-zA-Z0-9]*>"
+
+" String and Character constants
+" Highlight special characters (those which have a backslash) differently
+syn match xmathSpecial contained "\\\d\d\d\|\\."
+syn region xmathString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=xmathSpecial,@Spell
+syn match xmathCharacter "'[^\\]'"
+syn match xmathSpecialChar "'\\.'"
+
+syn match xmathNumber "-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>"
+
+" Comments:
+" xmath supports #... (like Unix shells)
+" and #{ ... }# comment blocks
+syn cluster xmathCommentGroup contains=xmathString,xmathTodo,@Spell
+syn keyword xmathTodo contained COMBAK DEBUG FIXME Todo TODO XXX
+syn match xmathComment "#.*$" contains=@xmathCommentGroup
+syn region xmathCommentBlock start="#{" end="}#" contains=@xmathCommentGroup
+
+" synchronizing
+syn sync match xmathSyncComment grouphere xmathCommentBlock "#{"
+syn sync match xmathSyncComment groupthere NONE "}#"
+
+" Define the default highlighting.
+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
+ 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"
+
+" vim: ts=17
diff --git a/runtime/syntax/xml.vim b/runtime/syntax/xml.vim
new file mode 100644
index 0000000..d99f8b4
--- /dev/null
+++ b/runtime/syntax/xml.vim
@@ -0,0 +1,361 @@
+" Vim syntax file
+" Language: XML
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Repository: https://github.com/chrisbra/vim-xml-ftplugin
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Author: Paul Siegmann <pauls@euronet.nl>
+" Last Changed: Nov 03, 2019
+" Filenames: *.xml
+" Last Change:
+" 20190923 - Fix xmlEndTag to match xmlTag (vim/vim#884)
+" 20190924 - Fix xmlAttribute property (amadeus/vim-xml@d8ce1c946)
+" 20191103 - Enable spell checking globally
+" 20210428 - Improve syntax synchronizing
+
+" CONFIGURATION:
+" syntax folding can be turned on by
+"
+" let g:xml_syntax_folding = 1
+"
+" before the syntax file gets loaded (e.g. in ~/.vimrc).
+" This might slow down syntax highlighting significantly,
+" especially for large files.
+"
+" CREDITS:
+" The original version was derived by Paul Siegmann from
+" Claudio Fleiner's html.vim.
+"
+" REFERENCES:
+" [1] http://www.w3.org/TR/2000/REC-xml-20001006
+" [2] http://www.w3.org/XML/1998/06/xmlspec-report-19980910.htm
+"
+" as <hirauchi@kiwi.ne.jp> pointed out according to reference [1]
+"
+" 2.3 Common Syntactic Constructs
+" [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender
+" [5] Name ::= (Letter | '_' | ':') (NameChar)*
+"
+" NOTE:
+" 1) empty tag delimiters "/>" inside attribute values (strings)
+" confuse syntax highlighting.
+" 2) for large files, folding can be pretty slow, especially when
+" loading a file the first time and viewoptions contains 'folds'
+" so that folds of previous sessions are applied.
+" Don't use 'foldmethod=syntax' in this case.
+
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:xml_cpo_save = &cpo
+set cpo&vim
+
+syn case match
+
+" Allow spell checking in tag values,
+" there is no syntax region for that,
+" so enable spell checking in top-level elements
+" <tag>This text is spell checked</tag>
+syn spell toplevel
+
+" mark illegal characters
+syn match xmlError "[<&]"
+
+" strings (inside tags) aka VALUES
+"
+" EXAMPLE:
+"
+" <tag foo.attribute = "value">
+" ^^^^^^^
+syn region xmlString contained start=+"+ end=+"+ contains=xmlEntity,@Spell display
+syn region xmlString contained start=+'+ end=+'+ contains=xmlEntity,@Spell display
+
+
+" punctuation (within attributes) e.g. <tag xml:foo.attribute ...>
+" ^ ^
+" syn match xmlAttribPunct +[-:._]+ contained display
+syn match xmlAttribPunct +[:.]+ contained display
+
+" no highlighting for xmlEqual (xmlEqual has no highlighting group)
+syn match xmlEqual +=+ display
+
+
+" attribute, everything before the '='
+"
+" PROVIDES: @xmlAttribHook
+"
+" EXAMPLE:
+"
+" <tag foo.attribute = "value">
+" ^^^^^^^^^^^^^
+"
+syn match xmlAttrib
+ \ +[-'"<]\@1<!\<[a-zA-Z:_][-.0-9a-zA-Z:_]*\>\%(['"]\@!\|$\)+
+ \ contained
+ \ contains=xmlAttribPunct,@xmlAttribHook
+ \ display
+
+
+" namespace spec
+"
+" PROVIDES: @xmlNamespaceHook
+"
+" EXAMPLE:
+"
+" <xsl:for-each select = "lola">
+" ^^^
+"
+if exists("g:xml_namespace_transparent")
+syn match xmlNamespace
+ \ +\(<\|</\)\@2<=[^ /!?<>"':]\+[:]\@=+
+ \ contained
+ \ contains=@xmlNamespaceHook
+ \ transparent
+ \ display
+else
+syn match xmlNamespace
+ \ +\(<\|</\)\@2<=[^ /!?<>"':]\+[:]\@=+
+ \ contained
+ \ contains=@xmlNamespaceHook
+ \ display
+endif
+
+
+" tag name
+"
+" PROVIDES: @xmlTagHook
+"
+" EXAMPLE:
+"
+" <tag foo.attribute = "value">
+" ^^^
+"
+syn match xmlTagName
+ \ +\%(<\|</\)\@2<=[^ /!?<>"']\++
+ \ contained
+ \ contains=xmlNamespace,xmlAttribPunct,@xmlTagHook
+ \ display
+
+
+if exists('g:xml_syntax_folding')
+
+ " start tag
+ " use matchgroup=xmlTag to skip over the leading '<'
+ "
+ " PROVIDES: @xmlStartTagHook
+ "
+ " EXAMPLE:
+ "
+ " <tag id="whoops">
+ " s^^^^^^^^^^^^^^^e
+ "
+ syn region xmlTag
+ \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+
+ \ matchgroup=xmlTag end=+>+
+ \ contained
+ \ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook
+
+
+ " highlight the end tag
+ "
+ " PROVIDES: @xmlTagHook
+ " (should we provide a separate @xmlEndTagHook ?)
+ "
+ " EXAMPLE:
+ "
+ " </tag>
+ " ^^^^^^
+ "
+ syn region xmlEndTag
+ \ matchgroup=xmlTag start=+</[^ /!?<>"']\@=+
+ \ matchgroup=xmlTag end=+>+
+ \ contained
+ \ contains=xmlTagName,xmlNamespace,xmlAttribPunct,@xmlTagHook
+
+ " tag elements with syntax-folding.
+ " NOTE: NO HIGHLIGHTING -- highlighting is done by contained elements
+ "
+ " PROVIDES: @xmlRegionHook
+ "
+ " EXAMPLE:
+ "
+ " <tag id="whoops">
+ " <!-- comment -->
+ " <another.tag></another.tag>
+ " <empty.tag/>
+ " some data
+ " </tag>
+ "
+ syn region xmlRegion
+ \ start=+<\z([^ /!?<>"']\+\)+
+ \ skip=+<!--\_.\{-}-->+
+ \ end=+</\z1\_\s\{-}>+
+ \ end=+/>+
+ \ fold
+ \ contains=xmlTag,xmlEndTag,xmlCdata,xmlRegion,xmlComment,xmlEntity,xmlProcessing,@xmlRegionHook,@Spell
+ \ keepend
+ \ extend
+
+else
+
+ " no syntax folding:
+ " - contained attribute removed
+ " - xmlRegion not defined
+ "
+ syn region xmlTag
+ \ matchgroup=xmlTag start=+<[^ /!?<>"']\@=+
+ \ matchgroup=xmlTag end=+>+
+ \ contains=xmlError,xmlTagName,xmlAttrib,xmlEqual,xmlString,@xmlStartTagHook
+
+ syn region xmlEndTag
+ \ matchgroup=xmlTag start=+</[^ /!?<>"']\@=+
+ \ matchgroup=xmlTag end=+>+
+ \ contains=xmlTagName,xmlNamespace,xmlAttribPunct,@xmlTagHook
+
+endif
+
+
+" &entities; compare with dtd
+syn match xmlEntity "&[^; \t]*;" contains=xmlEntityPunct
+syn match xmlEntityPunct contained "[&.;]"
+
+if exists('g:xml_syntax_folding')
+
+ " The real comments (this implements the comments as defined by xml,
+ " but not all xml pages actually conform to it. Errors are flagged.
+ syn region xmlComment
+ \ start=+<!+
+ \ end=+>+
+ \ contains=xmlCommentStart,xmlCommentError
+ \ extend
+ \ fold
+
+else
+
+ " no syntax folding:
+ " - fold attribute removed
+ "
+ syn region xmlComment
+ \ start=+<!+
+ \ end=+>+
+ \ contains=xmlCommentStart,xmlCommentError
+ \ extend
+
+endif
+
+syn match xmlCommentStart contained "<!" nextgroup=xmlCommentPart
+syn keyword xmlTodo contained TODO FIXME XXX
+syn match xmlCommentError contained "[^><!]"
+syn region xmlCommentPart
+ \ start=+--+
+ \ end=+--+
+ \ contained
+ \ contains=xmlTodo,@xmlCommentHook,@Spell
+
+
+" CData sections
+"
+" PROVIDES: @xmlCdataHook
+"
+syn region xmlCdata
+ \ start=+<!\[CDATA\[+
+ \ end=+]]>+
+ \ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook,@Spell
+ \ keepend
+ \ extend
+
+" using the following line instead leads to corrupt folding at CDATA regions
+" syn match xmlCdata +<!\[CDATA\[\_.\{-}]]>+ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook
+syn match xmlCdataStart +<!\[CDATA\[+ contained contains=xmlCdataCdata
+syn keyword xmlCdataCdata CDATA contained
+syn match xmlCdataEnd +]]>+ contained
+
+
+" Processing instructions
+" This allows "?>" inside strings -- good idea?
+syn region xmlProcessing matchgroup=xmlProcessingDelim start="<?" end="?>" contains=xmlAttrib,xmlEqual,xmlString
+
+
+if exists('g:xml_syntax_folding')
+
+ " DTD -- we use dtd.vim here
+ syn region xmlDocType matchgroup=xmlDocTypeDecl
+ \ start="<!DOCTYPE"he=s+2,rs=s+2 end=">"
+ \ fold
+ \ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString
+else
+
+ " no syntax folding:
+ " - fold attribute removed
+ "
+ syn region xmlDocType matchgroup=xmlDocTypeDecl
+ \ start="<!DOCTYPE"he=s+2,rs=s+2 end=">"
+ \ contains=xmlDocTypeKeyword,xmlInlineDTD,xmlString
+
+endif
+
+syn keyword xmlDocTypeKeyword contained DOCTYPE PUBLIC SYSTEM
+syn region xmlInlineDTD contained matchgroup=xmlDocTypeDecl start="\[" end="]" contains=@xmlDTD
+syn include @xmlDTD <sfile>:p:h/dtd.vim
+unlet b:current_syntax
+
+
+" synchronizing
+
+syn sync match xmlSyncComment grouphere xmlComment +<!--+
+syn sync match xmlSyncComment groupthere NONE +-->+
+
+" The following is slow on large documents (and the doctype is optional
+" syn sync match xmlSyncDT grouphere xmlDocType +\_.\(<!DOCTYPE\)\@=+
+" syn sync match xmlSyncDT groupthere NONE +]>+
+
+if exists('g:xml_syntax_folding')
+ syn sync match xmlSync grouphere xmlRegion +\_.\(<[^ /!?<>"']\+\)\@=+
+ " syn sync match xmlSync grouphere xmlRegion "<[^ /!?<>"']*>"
+ syn sync match xmlSync groupthere xmlRegion +</[^ /!?<>"']\+>+
+endif
+
+syn sync minlines=100 maxlines=200
+
+
+" The default highlighting.
+hi def link xmlTodo Todo
+hi def link xmlTag Function
+hi def link xmlTagName Function
+hi def link xmlEndTag Identifier
+if !exists("g:xml_namespace_transparent")
+ hi def link xmlNamespace Tag
+endif
+hi def link xmlEntity Statement
+hi def link xmlEntityPunct Type
+
+hi def link xmlAttribPunct Comment
+hi def link xmlAttrib Type
+
+hi def link xmlString String
+hi def link xmlComment Comment
+hi def link xmlCommentStart xmlComment
+hi def link xmlCommentPart Comment
+hi def link xmlCommentError Error
+hi def link xmlError Error
+
+hi def link xmlProcessingDelim Comment
+hi def link xmlProcessing Type
+
+hi def link xmlCdata String
+hi def link xmlCdataCdata Statement
+hi def link xmlCdataStart Type
+hi def link xmlCdataEnd Type
+
+hi def link xmlDocTypeDecl Function
+hi def link xmlDocTypeKeyword Statement
+hi def link xmlInlineDTD Function
+
+let b:current_syntax = "xml"
+
+let &cpo = s:xml_cpo_save
+unlet s:xml_cpo_save
+
+" vim: ts=4
diff --git a/runtime/syntax/xmodmap.vim b/runtime/syntax/xmodmap.vim
new file mode 100644
index 0000000..28cae3e
--- /dev/null
+++ b/runtime/syntax/xmodmap.vim
@@ -0,0 +1,677 @@
+" Vim syntax file
+" Language: xmodmap(1) definition file
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn keyword xmodmapTodo contained TODO FIXME XXX NOTE
+
+syn region xmodmapComment display oneline start='^!' end='$'
+ \ contains=xmodmapTodo,@Spell
+
+syn case ignore
+syn match xmodmapInt display '\<\d\+\>'
+syn match xmodmapHex display '\<0x\x\+\>'
+syn match xmodmapOctal display '\<0\o\+\>'
+syn match xmodmapOctalError display '\<0\o*[89]\d*'
+syn case match
+
+syn match xmodmapKeySym display '\<[A-Za-z]\>'
+
+" #include <X11/keysymdef.h>
+syn keyword xmodmapKeySym XK_VoidSymbol XK_BackSpace XK_Tab XK_Linefeed
+ \ XK_Clear XK_Return XK_Pause XK_Scroll_Lock
+ \ XK_Sys_Req XK_Escape XK_Delete XK_Multi_key
+ \ XK_Codeinput XK_SingleCandidate
+ \ XK_MultipleCandidate XK_PreviousCandidate
+ \ XK_Kanji XK_Muhenkan XK_Henkan_Mode
+ \ XK_Henkan XK_Romaji XK_Hiragana XK_Katakana
+ \ XK_Hiragana_Katakana XK_Zenkaku XK_Hankaku
+ \ XK_Zenkaku_Hankaku XK_Touroku XK_Massyo
+ \ XK_Kana_Lock XK_Kana_Shift XK_Eisu_Shift
+ \ XK_Eisu_toggle XK_Kanji_Bangou XK_Zen_Koho
+ \ XK_Mae_Koho XK_Home XK_Left XK_Up XK_Right
+ \ XK_Down XK_Prior XK_Page_Up XK_Next
+ \ XK_Page_Down XK_End XK_Begin XK_Select
+ \ XK_Print XK_Execute XK_Insert XK_Undo XK_Redo
+ \ XK_Menu XK_Find XK_Cancel XK_Help XK_Break
+ \ XK_Mode_switch XK_script_switch XK_Num_Lock
+ \ XK_KP_Space XK_KP_Tab XK_KP_Enter XK_KP_F1
+ \ XK_KP_F2 XK_KP_F3 XK_KP_F4 XK_KP_Home
+ \ XK_KP_Left XK_KP_Up XK_KP_Right XK_KP_Down
+ \ XK_KP_Prior XK_KP_Page_Up XK_KP_Next
+ \ XK_KP_Page_Down XK_KP_End XK_KP_Begin
+ \ XK_KP_Insert XK_KP_Delete XK_KP_Equal
+ \ XK_KP_Multiply XK_KP_Add XK_KP_Separator
+ \ XK_KP_Subtract XK_KP_Decimal XK_KP_Divide
+ \ XK_KP_0 XK_KP_1 XK_KP_2 XK_KP_3 XK_KP_4
+ \ XK_KP_5 XK_KP_6 XK_KP_7 XK_KP_8 XK_KP_9 XK_F1
+ \ XK_F2 XK_F3 XK_F4 XK_F5 XK_F6 XK_F7 XK_F8
+ \ XK_F9 XK_F10 XK_F11 XK_L1 XK_F12 XK_L2 XK_F13
+ \ XK_L3 XK_F14 XK_L4 XK_F15 XK_L5 XK_F16 XK_L6
+ \ XK_F17 XK_L7 XK_F18 XK_L8 XK_F19 XK_L9 XK_F20
+ \ XK_L10 XK_F21 XK_R1 XK_F22 XK_R2 XK_F23
+ \ XK_R3 XK_F24 XK_R4 XK_F25 XK_R5 XK_F26
+ \ XK_R6 XK_F27 XK_R7 XK_F28 XK_R8 XK_F29
+ \ XK_R9 XK_F30 XK_R10 XK_F31 XK_R11 XK_F32
+ \ XK_R12 XK_F33 XK_R13 XK_F34 XK_R14 XK_F35
+ \ XK_R15 XK_Shift_L XK_Shift_R XK_Control_L
+ \ XK_Control_R XK_Caps_Lock XK_Shift_Lock
+ \ XK_Meta_L XK_Meta_R XK_Alt_L XK_Alt_R
+ \ XK_Super_L XK_Super_R XK_Hyper_L XK_Hyper_R
+ \ XK_dead_hook XK_dead_horn XK_3270_Duplicate
+ \ XK_3270_FieldMark XK_3270_Right2 XK_3270_Left2
+ \ XK_3270_BackTab XK_3270_EraseEOF
+ \ XK_3270_EraseInput XK_3270_Reset
+ \ XK_3270_Quit XK_3270_PA1 XK_3270_PA2
+ \ XK_3270_PA3 XK_3270_Test XK_3270_Attn
+ \ XK_3270_CursorBlink XK_3270_AltCursor
+ \ XK_3270_KeyClick XK_3270_Jump
+ \ XK_3270_Ident XK_3270_Rule XK_3270_Copy
+ \ XK_3270_Play XK_3270_Setup XK_3270_Record
+ \ XK_3270_ChangeScreen XK_3270_DeleteWord
+ \ XK_3270_ExSelect XK_3270_CursorSelect
+ \ XK_3270_PrintScreen XK_3270_Enter XK_space
+ \ XK_exclam XK_quotedbl XK_numbersign XK_dollar
+ \ XK_percent XK_ampersand XK_apostrophe
+ \ XK_quoteright XK_parenleft XK_parenright
+ \ XK_asterisk XK_plus XK_comma XK_minus
+ \ XK_period XK_slash XK_0 XK_1 XK_2 XK_3
+ \ XK_4 XK_5 XK_6 XK_7 XK_8 XK_9 XK_colon
+ \ XK_semicolon XK_less XK_equal XK_greater
+ \ XK_question XK_at XK_A XK_B XK_C XK_D XK_E
+ \ XK_F XK_G XK_H XK_I XK_J XK_K XK_L XK_M XK_N
+ \ XK_O XK_P XK_Q XK_R XK_S XK_T XK_U XK_V XK_W
+ \ XK_X XK_Y XK_Z XK_bracketleft XK_backslash
+ \ XK_bracketright XK_asciicircum XK_underscore
+ \ XK_grave XK_quoteleft XK_a XK_b XK_c XK_d
+ \ XK_e XK_f XK_g XK_h XK_i XK_j XK_k XK_l
+ \ XK_m XK_n XK_o XK_p XK_q XK_r XK_s XK_t XK_u
+ \ XK_v XK_w XK_x XK_y XK_z XK_braceleft XK_bar
+ \ XK_braceright XK_asciitilde XK_nobreakspace
+ \ XK_exclamdown XK_cent XK_sterling XK_currency
+ \ XK_yen XK_brokenbar XK_section XK_diaeresis
+ \ XK_copyright XK_ordfeminine XK_guillemotleft
+ \ XK_notsign XK_hyphen XK_registered XK_macron
+ \ XK_degree XK_plusminus XK_twosuperior
+ \ XK_threesuperior XK_acute XK_mu XK_paragraph
+ \ XK_periodcentered XK_cedilla XK_onesuperior
+ \ XK_masculine XK_guillemotright XK_onequarter
+ \ XK_onehalf XK_threequarters XK_questiondown
+ \ XK_Agrave XK_Aacute XK_Acircumflex XK_Atilde
+ \ XK_Adiaeresis XK_Aring XK_AE XK_Ccedilla
+ \ XK_Egrave XK_Eacute XK_Ecircumflex
+ \ XK_Ediaeresis XK_Igrave XK_Iacute
+ \ XK_Icircumflex XK_Idiaeresis XK_ETH XK_Eth
+ \ XK_Ntilde XK_Ograve XK_Oacute XK_Ocircumflex
+ \ XK_Otilde XK_Odiaeresis XK_multiply
+ \ XK_Ooblique XK_Ugrave XK_Uacute XK_Ucircumflex
+ \ XK_Udiaeresis XK_Yacute XK_THORN XK_Thorn
+ \ XK_ssharp XK_agrave XK_aacute XK_acircumflex
+ \ XK_atilde XK_adiaeresis XK_aring XK_ae
+ \ XK_ccedilla XK_egrave XK_eacute XK_ecircumflex
+ \ XK_ediaeresis XK_igrave XK_iacute
+ \ XK_icircumflex XK_idiaeresis XK_eth XK_ntilde
+ \ XK_ograve XK_oacute XK_ocircumflex XK_otilde
+ \ XK_odiaeresis XK_division XK_oslash XK_ugrave
+ \ XK_uacute XK_ucircumflex XK_udiaeresis
+ \ XK_yacute XK_thorn XK_ydiaeresis XK_Aogonek
+ \ XK_breve XK_Lstroke XK_Lcaron XK_Sacute
+ \ XK_Scaron XK_Scedilla XK_Tcaron XK_Zacute
+ \ XK_Zcaron XK_Zabovedot XK_aogonek XK_ogonek
+ \ XK_lstroke XK_lcaron XK_sacute XK_caron
+ \ XK_scaron XK_scedilla XK_tcaron XK_zacute
+ \ XK_doubleacute XK_zcaron XK_zabovedot
+ \ XK_Racute XK_Abreve XK_Lacute XK_Cacute
+ \ XK_Ccaron XK_Eogonek XK_Ecaron XK_Dcaron
+ \ XK_Dstroke XK_Nacute XK_Ncaron XK_Odoubleacute
+ \ XK_Rcaron XK_Uring XK_Udoubleacute
+ \ XK_Tcedilla XK_racute XK_abreve XK_lacute
+ \ XK_cacute XK_ccaron XK_eogonek XK_ecaron
+ \ XK_dcaron XK_dstroke XK_nacute XK_ncaron
+ \ XK_odoubleacute XK_udoubleacute XK_rcaron
+ \ XK_uring XK_tcedilla XK_abovedot XK_Hstroke
+ \ XK_Hcircumflex XK_Iabovedot XK_Gbreve
+ \ XK_Jcircumflex XK_hstroke XK_hcircumflex
+ \ XK_idotless XK_gbreve XK_jcircumflex
+ \ XK_Cabovedot XK_Ccircumflex XK_Gabovedot
+ \ XK_Gcircumflex XK_Ubreve XK_Scircumflex
+ \ XK_cabovedot XK_ccircumflex XK_gabovedot
+ \ XK_gcircumflex XK_ubreve XK_scircumflex XK_kra
+ \ XK_kappa XK_Rcedilla XK_Itilde XK_Lcedilla
+ \ XK_Emacron XK_Gcedilla XK_Tslash XK_rcedilla
+ \ XK_itilde XK_lcedilla XK_emacron XK_gcedilla
+ \ XK_tslash XK_ENG XK_eng XK_Amacron XK_Iogonek
+ \ XK_Eabovedot XK_Imacron XK_Ncedilla XK_Omacron
+ \ XK_Kcedilla XK_Uogonek XK_Utilde XK_Umacron
+ \ XK_amacron XK_iogonek XK_eabovedot XK_imacron
+ \ XK_ncedilla XK_omacron XK_kcedilla XK_uogonek
+ \ XK_utilde XK_umacron XK_Babovedot XK_babovedot
+ \ XK_Dabovedot XK_Wgrave XK_Wacute XK_dabovedot
+ \ XK_Ygrave XK_Fabovedot XK_fabovedot
+ \ XK_Mabovedot XK_mabovedot XK_Pabovedot
+ \ XK_wgrave XK_pabovedot XK_wacute XK_Sabovedot
+ \ XK_ygrave XK_Wdiaeresis XK_wdiaeresis
+ \ XK_sabovedot XK_Wcircumflex XK_Tabovedot
+ \ XK_Ycircumflex XK_wcircumflex
+ \ XK_tabovedot XK_ycircumflex XK_OE XK_oe
+ \ XK_Ydiaeresis XK_overline XK_kana_fullstop
+ \ XK_kana_openingbracket XK_kana_closingbracket
+ \ XK_kana_comma XK_kana_conjunctive
+ \ XK_kana_middledot XK_kana_WO XK_kana_a
+ \ XK_kana_i XK_kana_u XK_kana_e XK_kana_o
+ \ XK_kana_ya XK_kana_yu XK_kana_yo
+ \ XK_kana_tsu XK_kana_tu XK_prolongedsound
+ \ XK_kana_A XK_kana_I XK_kana_U XK_kana_E
+ \ XK_kana_O XK_kana_KA XK_kana_KI XK_kana_KU
+ \ XK_kana_KE XK_kana_KO XK_kana_SA XK_kana_SHI
+ \ XK_kana_SU XK_kana_SE XK_kana_SO XK_kana_TA
+ \ XK_kana_CHI XK_kana_TI XK_kana_TSU
+ \ XK_kana_TU XK_kana_TE XK_kana_TO XK_kana_NA
+ \ XK_kana_NI XK_kana_NU XK_kana_NE XK_kana_NO
+ \ XK_kana_HA XK_kana_HI XK_kana_FU XK_kana_HU
+ \ XK_kana_HE XK_kana_HO XK_kana_MA XK_kana_MI
+ \ XK_kana_MU XK_kana_ME XK_kana_MO XK_kana_YA
+ \ XK_kana_YU XK_kana_YO XK_kana_RA XK_kana_RI
+ \ XK_kana_RU XK_kana_RE XK_kana_RO XK_kana_WA
+ \ XK_kana_N XK_voicedsound XK_semivoicedsound
+ \ XK_kana_switch XK_Farsi_0 XK_Farsi_1
+ \ XK_Farsi_2 XK_Farsi_3 XK_Farsi_4 XK_Farsi_5
+ \ XK_Farsi_6 XK_Farsi_7 XK_Farsi_8 XK_Farsi_9
+ \ XK_Arabic_percent XK_Arabic_superscript_alef
+ \ XK_Arabic_tteh XK_Arabic_peh XK_Arabic_tcheh
+ \ XK_Arabic_ddal XK_Arabic_rreh XK_Arabic_comma
+ \ XK_Arabic_fullstop XK_Arabic_0 XK_Arabic_1
+ \ XK_Arabic_2 XK_Arabic_3 XK_Arabic_4
+ \ XK_Arabic_5 XK_Arabic_6 XK_Arabic_7
+ \ XK_Arabic_8 XK_Arabic_9 XK_Arabic_semicolon
+ \ XK_Arabic_question_mark XK_Arabic_hamza
+ \ XK_Arabic_maddaonalef XK_Arabic_hamzaonalef
+ \ XK_Arabic_hamzaonwaw XK_Arabic_hamzaunderalef
+ \ XK_Arabic_hamzaonyeh XK_Arabic_alef
+ \ XK_Arabic_beh XK_Arabic_tehmarbuta
+ \ XK_Arabic_teh XK_Arabic_theh XK_Arabic_jeem
+ \ XK_Arabic_hah XK_Arabic_khah XK_Arabic_dal
+ \ XK_Arabic_thal XK_Arabic_ra XK_Arabic_zain
+ \ XK_Arabic_seen XK_Arabic_sheen
+ \ XK_Arabic_sad XK_Arabic_dad XK_Arabic_tah
+ \ XK_Arabic_zah XK_Arabic_ain XK_Arabic_ghain
+ \ XK_Arabic_tatweel XK_Arabic_feh XK_Arabic_qaf
+ \ XK_Arabic_kaf XK_Arabic_lam XK_Arabic_meem
+ \ XK_Arabic_noon XK_Arabic_ha XK_Arabic_heh
+ \ XK_Arabic_waw XK_Arabic_alefmaksura
+ \ XK_Arabic_yeh XK_Arabic_fathatan
+ \ XK_Arabic_dammatan XK_Arabic_kasratan
+ \ XK_Arabic_fatha XK_Arabic_damma
+ \ XK_Arabic_kasra XK_Arabic_shadda
+ \ XK_Arabic_sukun XK_Arabic_madda_above
+ \ XK_Arabic_hamza_above XK_Arabic_hamza_below
+ \ XK_Arabic_jeh XK_Arabic_veh XK_Arabic_keheh
+ \ XK_Arabic_gaf XK_Arabic_noon_ghunna
+ \ XK_Arabic_heh_doachashmee XK_Farsi_yeh
+ \ XK_Arabic_yeh_baree XK_Arabic_heh_goal
+ \ XK_Arabic_switch XK_Cyrillic_GHE_bar
+ \ XK_Cyrillic_ghe_bar XK_Cyrillic_ZHE_descender
+ \ XK_Cyrillic_zhe_descender
+ \ XK_Cyrillic_KA_descender
+ \ XK_Cyrillic_ka_descender
+ \ XK_Cyrillic_KA_vertstroke
+ \ XK_Cyrillic_ka_vertstroke
+ \ XK_Cyrillic_EN_descender
+ \ XK_Cyrillic_en_descender
+ \ XK_Cyrillic_U_straight XK_Cyrillic_u_straight
+ \ XK_Cyrillic_U_straight_bar
+ \ XK_Cyrillic_u_straight_bar
+ \ XK_Cyrillic_HA_descender
+ \ XK_Cyrillic_ha_descender
+ \ XK_Cyrillic_CHE_descender
+ \ XK_Cyrillic_che_descender
+ \ XK_Cyrillic_CHE_vertstroke
+ \ XK_Cyrillic_che_vertstroke XK_Cyrillic_SHHA
+ \ XK_Cyrillic_shha XK_Cyrillic_SCHWA
+ \ XK_Cyrillic_schwa XK_Cyrillic_I_macron
+ \ XK_Cyrillic_i_macron XK_Cyrillic_O_bar
+ \ XK_Cyrillic_o_bar XK_Cyrillic_U_macron
+ \ XK_Cyrillic_u_macron XK_Serbian_dje
+ \ XK_Macedonia_gje XK_Cyrillic_io
+ \ XK_Ukrainian_ie XK_Ukranian_je
+ \ XK_Macedonia_dse XK_Ukrainian_i XK_Ukranian_i
+ \ XK_Ukrainian_yi XK_Ukranian_yi XK_Cyrillic_je
+ \ XK_Serbian_je XK_Cyrillic_lje XK_Serbian_lje
+ \ XK_Cyrillic_nje XK_Serbian_nje XK_Serbian_tshe
+ \ XK_Macedonia_kje XK_Ukrainian_ghe_with_upturn
+ \ XK_Byelorussian_shortu XK_Cyrillic_dzhe
+ \ XK_Serbian_dze XK_numerosign
+ \ XK_Serbian_DJE XK_Macedonia_GJE
+ \ XK_Cyrillic_IO XK_Ukrainian_IE XK_Ukranian_JE
+ \ XK_Macedonia_DSE XK_Ukrainian_I XK_Ukranian_I
+ \ XK_Ukrainian_YI XK_Ukranian_YI XK_Cyrillic_JE
+ \ XK_Serbian_JE XK_Cyrillic_LJE XK_Serbian_LJE
+ \ XK_Cyrillic_NJE XK_Serbian_NJE XK_Serbian_TSHE
+ \ XK_Macedonia_KJE XK_Ukrainian_GHE_WITH_UPTURN
+ \ XK_Byelorussian_SHORTU XK_Cyrillic_DZHE
+ \ XK_Serbian_DZE XK_Cyrillic_yu
+ \ XK_Cyrillic_a XK_Cyrillic_be XK_Cyrillic_tse
+ \ XK_Cyrillic_de XK_Cyrillic_ie XK_Cyrillic_ef
+ \ XK_Cyrillic_ghe XK_Cyrillic_ha XK_Cyrillic_i
+ \ XK_Cyrillic_shorti XK_Cyrillic_ka
+ \ XK_Cyrillic_el XK_Cyrillic_em XK_Cyrillic_en
+ \ XK_Cyrillic_o XK_Cyrillic_pe XK_Cyrillic_ya
+ \ XK_Cyrillic_er XK_Cyrillic_es XK_Cyrillic_te
+ \ XK_Cyrillic_u XK_Cyrillic_zhe XK_Cyrillic_ve
+ \ XK_Cyrillic_softsign XK_Cyrillic_yeru
+ \ XK_Cyrillic_ze XK_Cyrillic_sha XK_Cyrillic_e
+ \ XK_Cyrillic_shcha XK_Cyrillic_che
+ \ XK_Cyrillic_hardsign XK_Cyrillic_YU
+ \ XK_Cyrillic_A XK_Cyrillic_BE XK_Cyrillic_TSE
+ \ XK_Cyrillic_DE XK_Cyrillic_IE XK_Cyrillic_EF
+ \ XK_Cyrillic_GHE XK_Cyrillic_HA XK_Cyrillic_I
+ \ XK_Cyrillic_SHORTI XK_Cyrillic_KA
+ \ XK_Cyrillic_EL XK_Cyrillic_EM XK_Cyrillic_EN
+ \ XK_Cyrillic_O XK_Cyrillic_PE XK_Cyrillic_YA
+ \ XK_Cyrillic_ER XK_Cyrillic_ES XK_Cyrillic_TE
+ \ XK_Cyrillic_U XK_Cyrillic_ZHE XK_Cyrillic_VE
+ \ XK_Cyrillic_SOFTSIGN XK_Cyrillic_YERU
+ \ XK_Cyrillic_ZE XK_Cyrillic_SHA XK_Cyrillic_E
+ \ XK_Cyrillic_SHCHA XK_Cyrillic_CHE
+ \ XK_Cyrillic_HARDSIGN XK_Greek_ALPHAaccent
+ \ XK_Greek_EPSILONaccent XK_Greek_ETAaccent
+ \ XK_Greek_IOTAaccent XK_Greek_IOTAdieresis
+ \ XK_Greek_OMICRONaccent XK_Greek_UPSILONaccent
+ \ XK_Greek_UPSILONdieresis
+ \ XK_Greek_OMEGAaccent XK_Greek_accentdieresis
+ \ XK_Greek_horizbar XK_Greek_alphaaccent
+ \ XK_Greek_epsilonaccent XK_Greek_etaaccent
+ \ XK_Greek_iotaaccent XK_Greek_iotadieresis
+ \ XK_Greek_iotaaccentdieresis
+ \ XK_Greek_omicronaccent XK_Greek_upsilonaccent
+ \ XK_Greek_upsilondieresis
+ \ XK_Greek_upsilonaccentdieresis
+ \ XK_Greek_omegaaccent XK_Greek_ALPHA
+ \ XK_Greek_BETA XK_Greek_GAMMA XK_Greek_DELTA
+ \ XK_Greek_EPSILON XK_Greek_ZETA XK_Greek_ETA
+ \ XK_Greek_THETA XK_Greek_IOTA XK_Greek_KAPPA
+ \ XK_Greek_LAMDA XK_Greek_LAMBDA XK_Greek_MU
+ \ XK_Greek_NU XK_Greek_XI XK_Greek_OMICRON
+ \ XK_Greek_PI XK_Greek_RHO XK_Greek_SIGMA
+ \ XK_Greek_TAU XK_Greek_UPSILON XK_Greek_PHI
+ \ XK_Greek_CHI XK_Greek_PSI XK_Greek_OMEGA
+ \ XK_Greek_alpha XK_Greek_beta XK_Greek_gamma
+ \ XK_Greek_delta XK_Greek_epsilon XK_Greek_zeta
+ \ XK_Greek_eta XK_Greek_theta XK_Greek_iota
+ \ XK_Greek_kappa XK_Greek_lamda XK_Greek_lambda
+ \ XK_Greek_mu XK_Greek_nu XK_Greek_xi
+ \ XK_Greek_omicron XK_Greek_pi XK_Greek_rho
+ \ XK_Greek_sigma XK_Greek_finalsmallsigma
+ \ XK_Greek_tau XK_Greek_upsilon XK_Greek_phi
+ \ XK_Greek_chi XK_Greek_psi XK_Greek_omega
+ \ XK_Greek_switch XK_leftradical
+ \ XK_topleftradical XK_horizconnector
+ \ XK_topintegral XK_botintegral
+ \ XK_vertconnector XK_topleftsqbracket
+ \ XK_botleftsqbracket XK_toprightsqbracket
+ \ XK_botrightsqbracket XK_topleftparens
+ \ XK_botleftparens XK_toprightparens
+ \ XK_botrightparens XK_leftmiddlecurlybrace
+ \ XK_rightmiddlecurlybrace
+ \ XK_topleftsummation XK_botleftsummation
+ \ XK_topvertsummationconnector
+ \ XK_botvertsummationconnector
+ \ XK_toprightsummation XK_botrightsummation
+ \ XK_rightmiddlesummation XK_lessthanequal
+ \ XK_notequal XK_greaterthanequal XK_integral
+ \ XK_therefore XK_variation XK_infinity
+ \ XK_nabla XK_approximate XK_similarequal
+ \ XK_ifonlyif XK_implies XK_identical XK_radical
+ \ XK_includedin XK_includes XK_intersection
+ \ XK_union XK_logicaland XK_logicalor
+ \ XK_partialderivative XK_function XK_leftarrow
+ \ XK_uparrow XK_rightarrow XK_downarrow XK_blank
+ \ XK_soliddiamond XK_checkerboard XK_ht XK_ff
+ \ XK_cr XK_lf XK_nl XK_vt XK_lowrightcorner
+ \ XK_uprightcorner XK_upleftcorner
+ \ XK_lowleftcorner XK_crossinglines
+ \ XK_horizlinescan1 XK_horizlinescan3
+ \ XK_horizlinescan5 XK_horizlinescan7
+ \ XK_horizlinescan9 XK_leftt XK_rightt XK_bott
+ \ XK_topt XK_vertbar XK_emspace XK_enspace
+ \ XK_em3space XK_em4space XK_digitspace
+ \ XK_punctspace XK_thinspace XK_hairspace
+ \ XK_emdash XK_endash XK_signifblank XK_ellipsis
+ \ XK_doubbaselinedot XK_onethird XK_twothirds
+ \ XK_onefifth XK_twofifths XK_threefifths
+ \ XK_fourfifths XK_onesixth XK_fivesixths
+ \ XK_careof XK_figdash XK_leftanglebracket
+ \ XK_decimalpoint XK_rightanglebracket
+ \ XK_marker XK_oneeighth XK_threeeighths
+ \ XK_fiveeighths XK_seveneighths XK_trademark
+ \ XK_signaturemark XK_trademarkincircle
+ \ XK_leftopentriangle XK_rightopentriangle
+ \ XK_emopencircle XK_emopenrectangle
+ \ XK_leftsinglequotemark XK_rightsinglequotemark
+ \ XK_leftdoublequotemark XK_rightdoublequotemark
+ \ XK_prescription XK_minutes XK_seconds
+ \ XK_latincross XK_hexagram XK_filledrectbullet
+ \ XK_filledlefttribullet XK_filledrighttribullet
+ \ XK_emfilledcircle XK_emfilledrect
+ \ XK_enopencircbullet XK_enopensquarebullet
+ \ XK_openrectbullet XK_opentribulletup
+ \ XK_opentribulletdown XK_openstar
+ \ XK_enfilledcircbullet XK_enfilledsqbullet
+ \ XK_filledtribulletup XK_filledtribulletdown
+ \ XK_leftpointer XK_rightpointer XK_club
+ \ XK_diamond XK_heart XK_maltesecross
+ \ XK_dagger XK_doubledagger XK_checkmark
+ \ XK_ballotcross XK_musicalsharp XK_musicalflat
+ \ XK_malesymbol XK_femalesymbol XK_telephone
+ \ XK_telephonerecorder XK_phonographcopyright
+ \ XK_caret XK_singlelowquotemark
+ \ XK_doublelowquotemark XK_cursor
+ \ XK_leftcaret XK_rightcaret XK_downcaret
+ \ XK_upcaret XK_overbar XK_downtack XK_upshoe
+ \ XK_downstile XK_underbar XK_jot XK_quad
+ \ XK_uptack XK_circle XK_upstile XK_downshoe
+ \ XK_rightshoe XK_leftshoe XK_lefttack
+ \ XK_righttack XK_hebrew_doublelowline
+ \ XK_hebrew_aleph XK_hebrew_bet XK_hebrew_beth
+ \ XK_hebrew_gimel XK_hebrew_gimmel
+ \ XK_hebrew_dalet XK_hebrew_daleth
+ \ XK_hebrew_he XK_hebrew_waw XK_hebrew_zain
+ \ XK_hebrew_zayin XK_hebrew_chet XK_hebrew_het
+ \ XK_hebrew_tet XK_hebrew_teth XK_hebrew_yod
+ \ XK_hebrew_finalkaph XK_hebrew_kaph
+ \ XK_hebrew_lamed XK_hebrew_finalmem
+ \ XK_hebrew_mem XK_hebrew_finalnun XK_hebrew_nun
+ \ XK_hebrew_samech XK_hebrew_samekh
+ \ XK_hebrew_ayin XK_hebrew_finalpe XK_hebrew_pe
+ \ XK_hebrew_finalzade XK_hebrew_finalzadi
+ \ XK_hebrew_zade XK_hebrew_zadi XK_hebrew_qoph
+ \ XK_hebrew_kuf XK_hebrew_resh XK_hebrew_shin
+ \ XK_hebrew_taw XK_hebrew_taf XK_Hebrew_switch
+ \ XK_Thai_kokai XK_Thai_khokhai XK_Thai_khokhuat
+ \ XK_Thai_khokhwai XK_Thai_khokhon
+ \ XK_Thai_khorakhang XK_Thai_ngongu
+ \ XK_Thai_chochan XK_Thai_choching
+ \ XK_Thai_chochang XK_Thai_soso XK_Thai_chochoe
+ \ XK_Thai_yoying XK_Thai_dochada XK_Thai_topatak
+ \ XK_Thai_thothan XK_Thai_thonangmontho
+ \ XK_Thai_thophuthao XK_Thai_nonen
+ \ XK_Thai_dodek XK_Thai_totao XK_Thai_thothung
+ \ XK_Thai_thothahan XK_Thai_thothong
+ \ XK_Thai_nonu XK_Thai_bobaimai XK_Thai_popla
+ \ XK_Thai_phophung XK_Thai_fofa XK_Thai_phophan
+ \ XK_Thai_fofan XK_Thai_phosamphao XK_Thai_moma
+ \ XK_Thai_yoyak XK_Thai_rorua XK_Thai_ru
+ \ XK_Thai_loling XK_Thai_lu XK_Thai_wowaen
+ \ XK_Thai_sosala XK_Thai_sorusi XK_Thai_sosua
+ \ XK_Thai_hohip XK_Thai_lochula XK_Thai_oang
+ \ XK_Thai_honokhuk XK_Thai_paiyannoi
+ \ XK_Thai_saraa XK_Thai_maihanakat
+ \ XK_Thai_saraaa XK_Thai_saraam XK_Thai_sarai
+ \ XK_Thai_saraii XK_Thai_saraue XK_Thai_sarauee
+ \ XK_Thai_sarau XK_Thai_sarauu XK_Thai_phinthu
+ \ XK_Thai_maihanakat_maitho XK_Thai_baht
+ \ XK_Thai_sarae XK_Thai_saraae XK_Thai_sarao
+ \ XK_Thai_saraaimaimuan XK_Thai_saraaimaimalai
+ \ XK_Thai_lakkhangyao XK_Thai_maiyamok
+ \ XK_Thai_maitaikhu XK_Thai_maiek XK_Thai_maitho
+ \ XK_Thai_maitri XK_Thai_maichattawa
+ \ XK_Thai_thanthakhat XK_Thai_nikhahit
+ \ XK_Thai_leksun XK_Thai_leknung XK_Thai_leksong
+ \ XK_Thai_leksam XK_Thai_leksi XK_Thai_lekha
+ \ XK_Thai_lekhok XK_Thai_lekchet XK_Thai_lekpaet
+ \ XK_Thai_lekkao XK_Hangul XK_Hangul_Start
+ \ XK_Hangul_End XK_Hangul_Hanja XK_Hangul_Jamo
+ \ XK_Hangul_Romaja XK_Hangul_Codeinput
+ \ XK_Hangul_Jeonja XK_Hangul_Banja
+ \ XK_Hangul_PreHanja XK_Hangul_PostHanja
+ \ XK_Hangul_SingleCandidate
+ \ XK_Hangul_MultipleCandidate
+ \ XK_Hangul_PreviousCandidate XK_Hangul_Special
+ \ XK_Hangul_switch XK_Hangul_Kiyeog
+ \ XK_Hangul_SsangKiyeog XK_Hangul_KiyeogSios
+ \ XK_Hangul_Nieun XK_Hangul_NieunJieuj
+ \ XK_Hangul_NieunHieuh XK_Hangul_Dikeud
+ \ XK_Hangul_SsangDikeud XK_Hangul_Rieul
+ \ XK_Hangul_RieulKiyeog XK_Hangul_RieulMieum
+ \ XK_Hangul_RieulPieub XK_Hangul_RieulSios
+ \ XK_Hangul_RieulTieut XK_Hangul_RieulPhieuf
+ \ XK_Hangul_RieulHieuh XK_Hangul_Mieum
+ \ XK_Hangul_Pieub XK_Hangul_SsangPieub
+ \ XK_Hangul_PieubSios XK_Hangul_Sios
+ \ XK_Hangul_SsangSios XK_Hangul_Ieung
+ \ XK_Hangul_Jieuj XK_Hangul_SsangJieuj
+ \ XK_Hangul_Cieuc XK_Hangul_Khieuq
+ \ XK_Hangul_Tieut XK_Hangul_Phieuf
+ \ XK_Hangul_Hieuh XK_Hangul_A XK_Hangul_AE
+ \ XK_Hangul_YA XK_Hangul_YAE XK_Hangul_EO
+ \ XK_Hangul_E XK_Hangul_YEO XK_Hangul_YE
+ \ XK_Hangul_O XK_Hangul_WA XK_Hangul_WAE
+ \ XK_Hangul_OE XK_Hangul_YO XK_Hangul_U
+ \ XK_Hangul_WEO XK_Hangul_WE XK_Hangul_WI
+ \ XK_Hangul_YU XK_Hangul_EU XK_Hangul_YI
+ \ XK_Hangul_I XK_Hangul_J_Kiyeog
+ \ XK_Hangul_J_SsangKiyeog XK_Hangul_J_KiyeogSios
+ \ XK_Hangul_J_Nieun XK_Hangul_J_NieunJieuj
+ \ XK_Hangul_J_NieunHieuh XK_Hangul_J_Dikeud
+ \ XK_Hangul_J_Rieul XK_Hangul_J_RieulKiyeog
+ \ XK_Hangul_J_RieulMieum XK_Hangul_J_RieulPieub
+ \ XK_Hangul_J_RieulSios XK_Hangul_J_RieulTieut
+ \ XK_Hangul_J_RieulPhieuf XK_Hangul_J_RieulHieuh
+ \ XK_Hangul_J_Mieum XK_Hangul_J_Pieub
+ \ XK_Hangul_J_PieubSios XK_Hangul_J_Sios
+ \ XK_Hangul_J_SsangSios XK_Hangul_J_Ieung
+ \ XK_Hangul_J_Jieuj XK_Hangul_J_Cieuc
+ \ XK_Hangul_J_Khieuq XK_Hangul_J_Tieut
+ \ XK_Hangul_J_Phieuf XK_Hangul_J_Hieuh
+ \ XK_Hangul_RieulYeorinHieuh
+ \ XK_Hangul_SunkyeongeumMieum
+ \ XK_Hangul_SunkyeongeumPieub XK_Hangul_PanSios
+ \ XK_Hangul_KkogjiDalrinIeung
+ \ XK_Hangul_SunkyeongeumPhieuf
+ \ XK_Hangul_YeorinHieuh XK_Hangul_AraeA
+ \ XK_Hangul_AraeAE XK_Hangul_J_PanSios
+ \ XK_Hangul_J_KkogjiDalrinIeung
+ \ XK_Hangul_J_YeorinHieuh XK_Korean_Won
+ \ XK_Armenian_eternity XK_Armenian_ligature_ew
+ \ XK_Armenian_full_stop XK_Armenian_verjaket
+ \ XK_Armenian_parenright XK_Armenian_parenleft
+ \ XK_Armenian_guillemotright
+ \ XK_Armenian_guillemotleft XK_Armenian_em_dash
+ \ XK_Armenian_dot XK_Armenian_mijaket
+ \ XK_Armenian_separation_mark XK_Armenian_but
+ \ XK_Armenian_comma XK_Armenian_en_dash
+ \ XK_Armenian_hyphen XK_Armenian_yentamna
+ \ XK_Armenian_ellipsis XK_Armenian_exclam
+ \ XK_Armenian_amanak XK_Armenian_accent
+ \ XK_Armenian_shesht XK_Armenian_question
+ \ XK_Armenian_paruyk XK_Armenian_AYB
+ \ XK_Armenian_ayb XK_Armenian_BEN
+ \ XK_Armenian_ben XK_Armenian_GIM
+ \ XK_Armenian_gim XK_Armenian_DA XK_Armenian_da
+ \ XK_Armenian_YECH XK_Armenian_yech
+ \ XK_Armenian_ZA XK_Armenian_za XK_Armenian_E
+ \ XK_Armenian_e XK_Armenian_AT XK_Armenian_at
+ \ XK_Armenian_TO XK_Armenian_to
+ \ XK_Armenian_ZHE XK_Armenian_zhe
+ \ XK_Armenian_INI XK_Armenian_ini
+ \ XK_Armenian_LYUN XK_Armenian_lyun
+ \ XK_Armenian_KHE XK_Armenian_khe
+ \ XK_Armenian_TSA XK_Armenian_tsa
+ \ XK_Armenian_KEN XK_Armenian_ken XK_Armenian_HO
+ \ XK_Armenian_ho XK_Armenian_DZA XK_Armenian_dza
+ \ XK_Armenian_GHAT XK_Armenian_ghat
+ \ XK_Armenian_TCHE XK_Armenian_tche
+ \ XK_Armenian_MEN XK_Armenian_men XK_Armenian_HI
+ \ XK_Armenian_hi XK_Armenian_NU XK_Armenian_nu
+ \ XK_Armenian_SHA XK_Armenian_sha XK_Armenian_VO
+ \ XK_Armenian_vo XK_Armenian_CHA XK_Armenian_cha
+ \ XK_Armenian_PE XK_Armenian_pe XK_Armenian_JE
+ \ XK_Armenian_je XK_Armenian_RA XK_Armenian_ra
+ \ XK_Armenian_SE XK_Armenian_se XK_Armenian_VEV
+ \ XK_Armenian_vev XK_Armenian_TYUN
+ \ XK_Armenian_tyun XK_Armenian_RE
+ \ XK_Armenian_re XK_Armenian_TSO
+ \ XK_Armenian_tso XK_Armenian_VYUN
+ \ XK_Armenian_vyun XK_Armenian_PYUR
+ \ XK_Armenian_pyur XK_Armenian_KE XK_Armenian_ke
+ \ XK_Armenian_O XK_Armenian_o XK_Armenian_FE
+ \ XK_Armenian_fe XK_Armenian_apostrophe
+ \ XK_Armenian_section_sign XK_Georgian_an
+ \ XK_Georgian_ban XK_Georgian_gan
+ \ XK_Georgian_don XK_Georgian_en XK_Georgian_vin
+ \ XK_Georgian_zen XK_Georgian_tan
+ \ XK_Georgian_in XK_Georgian_kan XK_Georgian_las
+ \ XK_Georgian_man XK_Georgian_nar XK_Georgian_on
+ \ XK_Georgian_par XK_Georgian_zhar
+ \ XK_Georgian_rae XK_Georgian_san
+ \ XK_Georgian_tar XK_Georgian_un
+ \ XK_Georgian_phar XK_Georgian_khar
+ \ XK_Georgian_ghan XK_Georgian_qar
+ \ XK_Georgian_shin XK_Georgian_chin
+ \ XK_Georgian_can XK_Georgian_jil
+ \ XK_Georgian_cil XK_Georgian_char
+ \ XK_Georgian_xan XK_Georgian_jhan
+ \ XK_Georgian_hae XK_Georgian_he XK_Georgian_hie
+ \ XK_Georgian_we XK_Georgian_har XK_Georgian_hoe
+ \ XK_Georgian_fi XK_Ccedillaabovedot
+ \ XK_Xabovedot XK_Qabovedot XK_IE XK_UO
+ \ XK_Zstroke XK_ccedillaabovedot XK_xabovedot
+ \ XK_qabovedot XK_ie XK_uo XK_zstroke XK_SCHWA
+ \ XK_schwa XK_Lbelowdot XK_Lstrokebelowdot
+ \ XK_lbelowdot XK_lstrokebelowdot XK_Gtilde
+ \ XK_gtilde XK_Abelowdot XK_abelowdot
+ \ XK_Ahook XK_ahook XK_Acircumflexacute
+ \ XK_acircumflexacute XK_Acircumflexgrave
+ \ XK_acircumflexgrave XK_Acircumflexhook
+ \ XK_acircumflexhook XK_Acircumflextilde
+ \ XK_acircumflextilde XK_Acircumflexbelowdot
+ \ XK_acircumflexbelowdot XK_Abreveacute
+ \ XK_abreveacute XK_Abrevegrave XK_abrevegrave
+ \ XK_Abrevehook XK_abrevehook XK_Abrevetilde
+ \ XK_abrevetilde XK_Abrevebelowdot
+ \ XK_abrevebelowdot XK_Ebelowdot XK_ebelowdot
+ \ XK_Ehook XK_ehook XK_Etilde XK_etilde
+ \ XK_Ecircumflexacute XK_ecircumflexacute
+ \ XK_Ecircumflexgrave XK_ecircumflexgrave
+ \ XK_Ecircumflexhook XK_ecircumflexhook
+ \ XK_Ecircumflextilde XK_ecircumflextilde
+ \ XK_Ecircumflexbelowdot XK_ecircumflexbelowdot
+ \ XK_Ihook XK_ihook XK_Ibelowdot XK_ibelowdot
+ \ XK_Obelowdot XK_obelowdot XK_Ohook XK_ohook
+ \ XK_Ocircumflexacute XK_ocircumflexacute
+ \ XK_Ocircumflexgrave XK_ocircumflexgrave
+ \ XK_Ocircumflexhook XK_ocircumflexhook
+ \ XK_Ocircumflextilde XK_ocircumflextilde
+ \ XK_Ocircumflexbelowdot XK_ocircumflexbelowdot
+ \ XK_Ohornacute XK_ohornacute XK_Ohorngrave
+ \ XK_ohorngrave XK_Ohornhook XK_ohornhook
+ \ XK_Ohorntilde XK_ohorntilde XK_Ohornbelowdot
+ \ XK_ohornbelowdot XK_Ubelowdot XK_ubelowdot
+ \ XK_Uhook XK_uhook XK_Uhornacute XK_uhornacute
+ \ XK_Uhorngrave XK_uhorngrave XK_Uhornhook
+ \ XK_uhornhook XK_Uhorntilde XK_uhorntilde
+ \ XK_Uhornbelowdot XK_uhornbelowdot XK_Ybelowdot
+ \ XK_ybelowdot XK_Yhook XK_yhook XK_Ytilde
+ \ XK_ytilde XK_Ohorn XK_ohorn XK_Uhorn XK_uhorn
+ \ XK_combining_tilde XK_combining_grave
+ \ XK_combining_acute XK_combining_hook
+ \ XK_combining_belowdot XK_EcuSign XK_ColonSign
+ \ XK_CruzeiroSign XK_FFrancSign XK_LiraSign
+ \ XK_MillSign XK_NairaSign XK_PesetaSign
+ \ XK_RupeeSign XK_WonSign XK_NewSheqelSign
+ \ XK_DongSign XK_EuroSign
+
+" #include <X11/Sunkeysym.h>
+syn keyword xmodmapKeySym SunXK_Sys_Req SunXK_Print_Screen SunXK_Compose
+ \ SunXK_AltGraph SunXK_PageUp SunXK_PageDown
+ \ SunXK_Undo SunXK_Again SunXK_Find SunXK_Stop
+ \ SunXK_Props SunXK_Front SunXK_Copy SunXK_Open
+ \ SunXK_Paste SunXK_Cut SunXK_PowerSwitch
+ \ SunXK_AudioLowerVolume SunXK_AudioMute
+ \ SunXK_AudioRaiseVolume SunXK_VideoDegauss
+ \ SunXK_VideoLowerBrightness
+ \ SunXK_VideoRaiseBrightness
+ \ SunXK_PowerSwitchShift
+
+" #include <X11/XF86keysym.h>
+syn keyword xmodmapKeySym XF86XK_ModeLock XF86XK_Standby
+ \ XF86XK_AudioLowerVolume XF86XK_AudioMute
+ \ XF86XK_AudioRaiseVolume XF86XK_AudioPlay
+ \ XF86XK_AudioStop XF86XK_AudioPrev
+ \ XF86XK_AudioNext XF86XK_HomePage
+ \ XF86XK_Mail XF86XK_Start XF86XK_Search
+ \ XF86XK_AudioRecord XF86XK_Calculator
+ \ XF86XK_Memo XF86XK_ToDoList XF86XK_Calendar
+ \ XF86XK_PowerDown XF86XK_ContrastAdjust
+ \ XF86XK_RockerUp XF86XK_RockerDown
+ \ XF86XK_RockerEnter XF86XK_Back XF86XK_Forward
+ \ XF86XK_Stop XF86XK_Refresh XF86XK_PowerOff
+ \ XF86XK_WakeUp XF86XK_Eject XF86XK_ScreenSaver
+ \ XF86XK_WWW XF86XK_Sleep XF86XK_Favorites
+ \ XF86XK_AudioPause XF86XK_AudioMedia
+ \ XF86XK_MyComputer XF86XK_VendorHome
+ \ XF86XK_LightBulb XF86XK_Shop XF86XK_History
+ \ XF86XK_OpenURL XF86XK_AddFavorite
+ \ XF86XK_HotLinks XF86XK_BrightnessAdjust
+ \ XF86XK_Finance XF86XK_Community
+ \ XF86XK_AudioRewind XF86XK_XF86BackForward
+ \ XF86XK_Launch0 XF86XK_Launch1 XF86XK_Launch2
+ \ XF86XK_Launch3 XF86XK_Launch4 XF86XK_Launch5
+ \ XF86XK_Launch6 XF86XK_Launch7 XF86XK_Launch8
+ \ XF86XK_Launch9 XF86XK_LaunchA XF86XK_LaunchB
+ \ XF86XK_LaunchC XF86XK_LaunchD XF86XK_LaunchE
+ \ XF86XK_LaunchF XF86XK_ApplicationLeft
+ \ XF86XK_ApplicationRight XF86XK_Book
+ \ XF86XK_CD XF86XK_Calculater XF86XK_Clear
+ \ XF86XK_Close XF86XK_Copy XF86XK_Cut
+ \ XF86XK_Display XF86XK_DOS XF86XK_Documents
+ \ XF86XK_Excel XF86XK_Explorer XF86XK_Game
+ \ XF86XK_Go XF86XK_iTouch XF86XK_LogOff
+ \ XF86XK_Market XF86XK_Meeting XF86XK_MenuKB
+ \ XF86XK_MenuPB XF86XK_MySites XF86XK_New
+ \ XF86XK_News XF86XK_OfficeHome XF86XK_Open
+ \ XF86XK_Option XF86XK_Paste XF86XK_Phone
+ \ XF86XK_Q XF86XK_Reply XF86XK_Reload
+ \ XF86XK_RotateWindows XF86XK_RotationPB
+ \ XF86XK_RotationKB XF86XK_Save XF86XK_ScrollUp
+ \ XF86XK_ScrollDown XF86XK_ScrollClick
+ \ XF86XK_Send XF86XK_Spell XF86XK_SplitScreen
+ \ XF86XK_Support XF86XK_TaskPane XF86XK_Terminal
+ \ XF86XK_Tools XF86XK_Travel XF86XK_UserPB
+ \ XF86XK_User1KB XF86XK_User2KB XF86XK_Video
+ \ XF86XK_WheelButton XF86XK_Word XF86XK_Xfer
+ \ XF86XK_ZoomIn XF86XK_ZoomOut XF86XK_Away
+ \ XF86XK_Messenger XF86XK_WebCam
+ \ XF86XK_MailForward XF86XK_Pictures
+ \ XF86XK_Music XF86XK_Switch_VT_1
+ \ XF86XK_Switch_VT_2 XF86XK_Switch_VT_3
+ \ XF86XK_Switch_VT_4 XF86XK_Switch_VT_5
+ \ XF86XK_Switch_VT_6 XF86XK_Switch_VT_7
+ \ XF86XK_Switch_VT_8 XF86XK_Switch_VT_9
+ \ XF86XK_Switch_VT_10 XF86XK_Switch_VT_11
+ \ XF86XK_Switch_VT_12 XF86XK_Ungrab
+ \ XF86XK_ClearGrab XF86XK_Next_VMode
+ \ XF86XK_Prev_VMode
+
+syn keyword xmodmapKeyword keycode keysym clear add remove pointer
+
+hi def link xmodmapComment Comment
+hi def link xmodmapTodo Todo
+hi def link xmodmapInt Number
+hi def link xmodmapHex Number
+hi def link xmodmapOctal Number
+hi def link xmodmapOctalError Error
+hi def link xmodmapKeySym Constant
+hi def link xmodmapKeyword Keyword
+
+let b:current_syntax = "xmodmap"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/xpm.vim b/runtime/syntax/xpm.vim
new file mode 100644
index 0000000..be9f387
--- /dev/null
+++ b/runtime/syntax/xpm.vim
@@ -0,0 +1,141 @@
+" Vim syntax file
+" Language: X Pixmap
+" Maintainer: Ronald Schild <rs@scutum.de>
+" Last Change: 2021 Oct 04
+" Version: 5.4n.1
+" Jemma Nelson added termguicolors support
+" Dominique Pellé fixed spelling support
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn spell notoplevel
+
+syn keyword xpmType char
+syn keyword xpmStorageClass static
+syn keyword xpmTodo TODO FIXME XXX contained
+syn region xpmComment start="/\*" end="\*/" contains=xpmTodo,@Spell
+syn region xpmPixelString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=@xpmColors
+
+if has("gui_running") || has("termguicolors") && &termguicolors
+
+let color = ""
+let chars = ""
+let colors = 0
+let cpp = 0
+let n = 0
+let i = 1
+
+while i <= line("$") " scanning all lines
+
+ let s = matchstr(getline(i), '".\{-1,}"')
+ if s != "" " does line contain a string?
+
+ if n == 0 " first string is the Values string
+
+ " get the 3rd value: colors = number of colors
+ let colors = substitute(s, '"\s*\d\+\s\+\d\+\s\+\(\d\+\).*"', '\1', '')
+ " get the 4th value: cpp = number of character per pixel
+ let cpp = substitute(s, '"\s*\d\+\s\+\d\+\s\+\d\+\s\+\(\d\+\).*"', '\1', '')
+ if cpp =~ '[^0-9]'
+ break " if cpp is not made of digits there must be something wrong
+ endif
+
+ " Highlight the Values string as normal string (no pixel string).
+ " Only when there is no slash, it would terminate the pattern.
+ if s !~ '/'
+ exe 'syn match xpmValues /' . s . '/'
+ endif
+ hi link xpmValues String
+
+ let n = 1 " n = color index
+
+ elseif n <= colors " string is a color specification
+
+ " get chars = <cpp> length string representing the pixels
+ " (first incl. the following whitespace)
+ let chars = substitute(s, '"\(.\{'.cpp.'}\s\).*"', '\1', '')
+
+ " now get color, first try 'c' key if any (color visual)
+ let color = substitute(s, '".*\sc\s\+\(.\{-}\)\s*\(\(g4\=\|[ms]\)\s.*\)*\s*"', '\1', '')
+ if color == s
+ " no 'c' key, try 'g' key (grayscale with more than 4 levels)
+ let color = substitute(s, '".*\sg\s\+\(.\{-}\)\s*\(\(g4\|[ms]\)\s.*\)*\s*"', '\1', '')
+ if color == s
+ " next try: 'g4' key (4-level grayscale)
+ let color = substitute(s, '".*\sg4\s\+\(.\{-}\)\s*\([ms]\s.*\)*\s*"', '\1', '')
+ if color == s
+ " finally try 'm' key (mono visual)
+ let color = substitute(s, '".*\sm\s\+\(.\{-}\)\s*\(s\s.*\)*\s*"', '\1', '')
+ if color == s
+ let color = ""
+ endif
+ endif
+ endif
+ endif
+
+ " Vim cannot handle RGB codes with more than 6 hex digits
+ if color =~ '#\x\{10,}$'
+ let color = substitute(color, '\(\x\x\)\x\x', '\1', 'g')
+ elseif color =~ '#\x\{7,}$'
+ let color = substitute(color, '\(\x\x\)\x', '\1', 'g')
+ " nor with 3 digits
+ elseif color =~ '#\x\{3}$'
+ let color = substitute(color, '\(\x\)\(\x\)\(\x\)', '0\10\20\3', '')
+ endif
+
+ " escape meta characters in patterns
+ let s = escape(s, '/\*^$.~[]')
+ let chars = escape(chars, '/\*^$.~[]')
+
+ " now create syntax items
+ " highlight the color string as normal string (no pixel string)
+ exe 'syn match xpmCol'.n.'Def /'.s.'/ contains=xpmCol'.n.'inDef'
+ exe 'hi link xpmCol'.n.'Def String'
+
+ " but highlight the first whitespace after chars in its color
+ exe 'syn match xpmCol'.n.'inDef /"'.chars.'/hs=s+'.(cpp+1).' contained'
+ exe 'hi link xpmCol'.n.'inDef xpmColor'.n
+
+ " remove the following whitespace from chars
+ let chars = substitute(chars, '.$', '', '')
+
+ " and create the syntax item contained in the pixel strings
+ exe 'syn match xpmColor'.n.' /'.chars.'/ contained'
+ exe 'syn cluster xpmColors add=xpmColor'.n
+
+ " if no color or color = "None" show background
+ if color == "" || substitute(color, '.*', '\L&', '') == 'none'
+ exe 'hi xpmColor'.n.' guifg=bg'
+ exe 'hi xpmColor'.n.' guibg=NONE'
+ elseif color !~ "'"
+ exe 'hi xpmColor'.n." guifg='".color."'"
+ exe 'hi xpmColor'.n." guibg='".color."'"
+ endif
+ let n = n + 1
+ else
+ break " no more color string
+ endif
+ endif
+ let i = i + 1
+endwhile
+
+unlet color chars colors cpp n i s
+
+endif " has("gui_running") || has("termguicolors") && &termguicolors
+
+" Define the default highlighting.
+" 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"
+
+" vim: ts=8:sw=3:noet:
diff --git a/runtime/syntax/xpm2.vim b/runtime/syntax/xpm2.vim
new file mode 100644
index 0000000..dfa6945
--- /dev/null
+++ b/runtime/syntax/xpm2.vim
@@ -0,0 +1,153 @@
+" Vim syntax file
+" Language: X Pixmap v2
+" Maintainer: Steve Wall (hitched97@velnet.com)
+" 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>
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn region xpm2PixelString start="^" end="$" contains=@xpm2Colors
+syn keyword xpm2Todo TODO FIXME XXX contained
+syn match xpm2Comment "\!.*$" contains=@Spell,xpm2Todo
+
+
+command -nargs=+ Hi hi def <args>
+
+if has("gui_running") || has("termguicolors") && &termguicolors
+
+ let color = ""
+ let chars = ""
+ let colors = 0
+ let cpp = 0
+ let n = 0
+ let i = 1
+
+ while i <= line("$") " scanning all lines
+
+ let s = getline(i)
+ if match(s,"\!.*$") != -1
+ let s = matchstr(s, "^[^\!]*")
+ endif
+ if s != "" " does line contain a string?
+
+ if n == 0 " first string is the Values string
+
+ " get the 3rd value: colors = number of colors
+ let colors = substitute(s, '\s*\d\+\s\+\d\+\s\+\(\d\+\).*', '\1', '')
+ " get the 4th value: cpp = number of character per pixel
+ let cpp = substitute(s, '\s*\d\+\s\+\d\+\s\+\d\+\s\+\(\d\+\).*', '\1', '')
+ if cpp =~ '[^0-9]'
+ break " if cpp is not made of digits there must be something wrong
+ endif
+
+ " Highlight the Values string as normal string (no pixel string).
+ " Only when there is no slash, it would terminate the pattern.
+ if s !~ '/'
+ exe 'syn match xpm2Values /' . s . '/'
+ endif
+ hi def link xpm2Values Statement
+
+ let n = 1 " n = color index
+
+ elseif n <= colors " string is a color specification
+
+ " get chars = <cpp> length string representing the pixels
+ " (first incl. the following whitespace)
+ let chars = substitute(s, '\(.\{'.cpp.'}\s\+\).*', '\1', '')
+
+ " now get color, first try 'c' key if any (color visual)
+ let color = substitute(s, '.*\sc\s\+\(.\{-}\)\s*\(\(g4\=\|[ms]\)\s.*\)*\s*', '\1', '')
+ if color == s
+ " no 'c' key, try 'g' key (grayscale with more than 4 levels)
+ let color = substitute(s, '.*\sg\s\+\(.\{-}\)\s*\(\(g4\|[ms]\)\s.*\)*\s*', '\1', '')
+ if color == s
+ " next try: 'g4' key (4-level grayscale)
+ let color = substitute(s, '.*\sg4\s\+\(.\{-}\)\s*\([ms]\s.*\)*\s*', '\1', '')
+ if color == s
+ " finally try 'm' key (mono visual)
+ let color = substitute(s, '.*\sm\s\+\(.\{-}\)\s*\(s\s.*\)*\s*', '\1', '')
+ if color == s
+ let color = ""
+ endif
+ endif
+ endif
+ endif
+
+ " Vim cannot handle RGB codes with more than 6 hex digits
+ if color =~ '#\x\{10,}$'
+ let color = substitute(color, '\(\x\x\)\x\x', '\1', 'g')
+ elseif color =~ '#\x\{7,}$'
+ let color = substitute(color, '\(\x\x\)\x', '\1', 'g')
+ " nor with 3 digits
+ elseif color =~ '#\x\{3}$'
+ let color = substitute(color, '\(\x\)\(\x\)\(\x\)', '0\10\20\3', '')
+ endif
+
+ " escape meta characters in patterns
+ let s = escape(s, '/\*^$.~[]')
+ let chars = escape(chars, '/\*^$.~[]')
+
+ " change whitespace to "\s\+"
+ let s = substitute(s, "[ \t][ \t]*", "\\\\s\\\\+", "g")
+ let chars = substitute(chars, "[ \t][ \t]*", "\\\\s\\\\+", "g")
+
+ " 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 '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 'hi def link xpm2Col'.n.'inDef xpm2Color'.n
+
+ " remove the following whitespace from chars
+ let chars = substitute(chars, '\\s\\+$', '', '')
+
+ " and create the syntax item contained in the pixel strings
+ exe 'syn match xpm2Color'.n.' /'.chars.'/ contained'
+ exe 'syn cluster xpm2Colors add=xpm2Color'.n
+
+ " if no color or color = "None" show background
+ if color == "" || substitute(color, '.*', '\L&', '') == 'none'
+ exe 'Hi xpm2Color'.n.' guifg=bg guibg=NONE'
+ elseif color !~ "'"
+ exe 'Hi xpm2Color'.n." guifg='".color."' guibg='".color."'"
+ endif
+ let n = n + 1
+ else
+ break " no more color string
+ endif
+ endif
+ let i = i + 1
+ endwhile
+
+ unlet color chars colors cpp n i s
+
+endif " has("gui_running") || has("termguicolors") && &termguicolors
+
+" Define the default highlighting.
+" 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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+" vim: ts=8:sw=2:noet:
diff --git a/runtime/syntax/xquery.vim b/runtime/syntax/xquery.vim
new file mode 100644
index 0000000..0c6b72a
--- /dev/null
+++ b/runtime/syntax/xquery.vim
@@ -0,0 +1,82 @@
+" Vim syntax file
+" Language: XQuery
+" Author: René Neumann <necoro@necoro.eu>
+" Author: Steve Spigarelli <http://spig.net/>
+" Original Author: Jean-Marc Vanel <http://jmvanel.free.fr/>
+" Last Change: mar jui 12 18:04:05 CEST 2005
+" Filenames: *.xq
+" URL: http://jmvanel.free.fr/vim/xquery.vim
+
+" REFERENCES:
+" [1] http://www.w3.org/TR/xquery/
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+" - is allowed in keywords
+setlocal iskeyword+=-
+
+runtime syntax/xml.vim
+
+syn case match
+
+" From XQuery grammar:
+syn keyword xqStatement ancestor ancestor-or-self and as ascending at attribute base-uri boundary-space by case cast castable child collation construction declare default descendant descendant-or-self descending div document element else empty encoding eq every except external following following-sibling for function ge greatest gt idiv if import in inherit-namespaces instance intersect is le least let lt mod module namespace ne no of or order ordered ordering parent preceding preceding-sibling preserve return satisfies schema self some stable strip then to treat typeswitch union unordered validate variable version where xmlspace xquery yes
+
+" TODO contains clashes with vim keyword
+syn keyword xqFunction abs adjust-date-to-timezone adjust-date-to-timezone adjust-dateTime-to-timezone adjust-dateTime-to-timezone adjust-time-to-timezone adjust-time-to-timezone avg base-uri base-uri boolean ceiling codepoint-equal codepoints-to-string collection collection compare concat count current-date current-dateTime current-time data dateTime day-from-date day-from-dateTime days-from-duration deep-equal deep-equal default-collation distinct-values distinct-values doc doc-available document-uri empty ends-with ends-with error error error error escape-uri exactly-one exists false floor hours-from-dateTime hours-from-duration hours-from-time id id idref idref implicit-timezone in-scope-prefixes index-of index-of insert-before lang lang last local-name local-name local-name-from-QName lower-case matches matches max max min min minutes-from-dateTime minutes-from-duration minutes-from-time month-from-date month-from-dateTime months-from-duration name name namespace-uri namespace-uri namespace-uri-for-prefix namespace-uri-from-QName nilled node-name normalize-space normalize-space normalize-unicode normalize-unicode not number number one-or-more position prefix-from-QName QName remove replace replace resolve-QName resolve-uri resolve-uri reverse root root round round-half-to-even round-half-to-even seconds-from-dateTime seconds-from-duration seconds-from-time starts-with starts-with static-base-uri string string string-join string-length string-length string-to-codepoints subsequence subsequence substring substring substring-after substring-after substring-before substring-before sum sum timezone-from-date timezone-from-dateTime timezone-from-time tokenize tokenize trace translate true unordered upper-case year-from-date year-from-dateTime years-from-duration zero-or-one
+
+syn keyword xqOperator add-dayTimeDuration-to-date add-dayTimeDuration-to-dateTime add-dayTimeDuration-to-time add-dayTimeDurations add-yearMonthDuration-to-date add-yearMonthDuration-to-dateTime add-yearMonthDurations base64Binary-equal boolean-equal boolean-greater-than boolean-less-than concatenate date-equal date-greater-than date-less-than dateTime-equal dateTime-greater-than dateTime-less-than dayTimeDuration-equal dayTimeDuration-greater-than dayTimeDuration-less-than divide-dayTimeDuration divide-dayTimeDuration-by-dayTimeDuration divide-yearMonthDuration divide-yearMonthDuration-by-yearMonthDuration except gDay-equal gMonth-equal gMonthDay-equal gYear-equal gYearMonth-equal hexBinary-equal intersect is-same-node multiply-dayTimeDuration multiply-yearMonthDuration node-after node-before NOTATION-equal numeric-add numeric-divide numeric-equal numeric-greater-than numeric-integer-divide numeric-less-than numeric-mod numeric-multiply numeric-subtract numeric-unary-minus numeric-unary-plus QName-equal subtract-dates-yielding-dayTimeDuration subtract-dateTimes-yielding-dayTimeDuration subtract-dayTimeDuration-from-date subtract-dayTimeDuration-from-dateTime subtract-dayTimeDuration-from-time subtract-dayTimeDurations subtract-times subtract-yearMonthDuration-from-date subtract-yearMonthDuration-from-dateTime subtract-yearMonthDurations time-equal time-greater-than time-less-than to union yearMonthDuration-equal yearMonthDuration-greater-than yearMonthDuration-less-than
+
+syn match xqType "xs:\(\|Datatype\|primitive\|string\|boolean\|float\|double\|decimal\|duration\|dateTime\|time\|date\|gYearMonth\|gYear\|gMonthDay\|gDay\|gMonth\|hexBinary\|base64Binary\|anyURI\|QName\|NOTATION\|\|normalizedString\|token\|language\|IDREFS\|ENTITIES\|NMTOKEN\|NMTOKENS\|Name\|NCName\|ID\|IDREF\|ENTITY\|integer\|nonPositiveInteger\|negativeInteger\|long\|int\|short\|byte\|nonNegativeInteger\|unsignedLong\|unsignedInt\|unsignedShort\|unsignedByte\|positiveInteger\)"
+
+
+" From XPath grammar:
+syn keyword xqXPath some every in in satisfies if then else to div idiv mod union intersect except instance of treat castable cast eq ne lt le gt ge is child descendant attribute self descendant-or-self following-sibling following namespace parent ancestor preceding-sibling preceding ancestor-or-self void item node document-node text comment processing-instruction attribute schema-attribute schema-element
+
+" eXist extensions
+syn match xqExist "&="
+
+" XQdoc
+syn match XQdoc contained "@\(param\|return\|author\)\>"
+
+" floating point number, with dot, optional exponent
+syn match xqFloat "\d\+\.\d*\(e[-+]\=\d\+\)\=[fl]\="
+" floating point number, starting with a dot, optional exponent
+syn match xqFloat "\.\d\+\(e[-+]\=\d\+\)\=[fl]\=\>"
+" floating point number, without dot, with exponent
+syn match xqFloat "\d\+e[-+]\=\d\+[fl]\=\>"
+syn match xqNumber "0x\x\+\(u\=l\{0,2}\|ll\=u\)\>"
+syn match xqNumber "\<\d\+\>"
+
+syn region xqString start=+\z(['"]\)+ skip=+\\.+ end=+\z1+
+syn region xqComment start='(:' excludenl end=':)' contains=XQdoc
+
+syn match xqVariable "$\<[a-zA-Z:_][-.0-9a-zA-Z0-9:_]*\>"
+syn match xqSeparator ",\|;"
+syn region xqCode transparent contained start='{' excludenl end='}' contains=xqFunction,xqCode,xmlRegionBis,xqComment,xqStatement,xmlString,xqSeparator,xqNumber,xqVariable,xqString keepend extend
+
+syn region xmlRegionBis start=+<\z([^ /!?<>"']\+\)+ skip=+<!--\_.\{-}-->+ end=+</\z1\_\s\{-}>+ end=+/>+ fold contains=xmlTag,xmlEndTag,xmlCdata,xmlRegionBis,xmlComment,xmlEntity,xmlProcessing,xqCode keepend extend
+
+hi def link xqNumber Number
+hi def link xqFloat Number
+hi def link xqString String
+hi def link xqVariable Identifier
+hi def link xqComment Comment
+hi def link xqSeparator Operator
+hi def link xqStatement Statement
+hi def link xqFunction Function
+hi def link xqOperator Operator
+hi def link xqType Type
+hi def link xqXPath Operator
+hi def link XQdoc Special
+hi def link xqExist Operator
+
+" override the xml highlighting
+"hi link xmlTag Structure
+"hi link xmlTagName Structure
+"hi link xmlEndTag Structure
+
+let b:current_syntax = "xquery"
diff --git a/runtime/syntax/xs.vim b/runtime/syntax/xs.vim
new file mode 100644
index 0000000..2145ede
--- /dev/null
+++ b/runtime/syntax/xs.vim
@@ -0,0 +1,3680 @@
+" Vim syntax file
+" Language: XS (Perl extension interface language)
+" 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>
+" Homepage: https://github.com/vim-perl/vim-perl
+" Bugs/requests: https://github.com/vim-perl/vim-perl/issues
+" License: Vim License (see :help license)
+" Last Change: 2018 Mar 28
+
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime! syntax/c.vim
+
+" 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 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
+syn keyword xsSuperseded isalnum isalpha iscntrl isdigit isgraph islower
+syn keyword xsSuperseded isprint ispunct isspace isupper isxdigit malloc
+syn keyword xsSuperseded memcpy memmove memset printf putc rand realloc
+syn keyword xsSuperseded rewind setenv sprintf srand stderr stdin stdout
+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 get(g:, 'xs_not_core', 0)
+syn keyword xsPrivate F0convert Perl__add_range_to_invlist
+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_populate_swatch
+syn keyword xsPrivate Perl__invlist_search
+syn keyword xsPrivate Perl__invlist_union_maybe_complement_2nd
+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_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_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_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
+syn keyword xsPrivate S_do_smartmatch S_do_trans_complex
+syn keyword xsPrivate S_do_trans_complex_utf8 S_do_trans_count
+syn keyword xsPrivate S_do_trans_count_utf8 S_do_trans_simple
+syn keyword xsPrivate S_do_trans_simple_utf8 S_docatch S_doeval S_dofindlabel
+syn keyword xsPrivate S_doform S_dooneliner S_doopen_pm S_doparseform
+syn keyword xsPrivate S_dopoptoeval S_dopoptogiven S_dopoptolabel
+syn keyword xsPrivate S_dopoptoloop S_dopoptosub_at S_dopoptowhen
+syn keyword xsPrivate S_dump_exec_pos S_dump_trie S_dump_trie_interim_list
+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_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_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_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_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_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_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_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 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
+syn keyword xsPrivate do_smartmatch do_trans_complex do_trans_complex_utf8
+syn keyword xsPrivate do_trans_count do_trans_count_utf8 do_trans_simple
+syn keyword xsPrivate do_trans_simple_utf8 docatch doeval dofindlabel doform
+syn keyword xsPrivate dooneliner doopen_pm doparseform dopoptoeval
+syn keyword xsPrivate dopoptogiven dopoptolabel dopoptoloop dopoptosub_at
+syn keyword xsPrivate dopoptowhen dump_exec_pos dump_trie
+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_default_stash find_hash_subscript find_in_my_stash
+syn keyword xsPrivate find_rundefsvoffset find_uninit_var first_symbol
+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
+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_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_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_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 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 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 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 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 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
+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_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 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_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_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
+syn keyword xsKeyword ENABLE FALLBACK: IN INCLUDE: INIT: INPUT: INTERFACE:
+syn keyword xsKeyword INTERFACE_MACRO: IN_OUT IN_OUTLIST MODULE NO_INIT:
+syn keyword xsKeyword NO_OUTPUT: OUT OUTLIST OUTPUT: OVERLOAD: PACKAGE
+syn keyword xsKeyword POSTCALL: PPCODE: PREFIX PREINIT: PROTOTYPE:
+syn keyword xsKeyword PROTOTYPES: REQUIRE: SCOPE: VERSIONCHECK: length
+syn keyword xsFunction GetVars Gv_AMupdate PerlIO_clearerr PerlIO_close
+syn keyword xsFunction PerlIO_eof PerlIO_error PerlIO_fileno PerlIO_fill
+syn keyword xsFunction PerlIO_flush PerlIO_get_base PerlIO_get_bufsiz
+syn keyword xsFunction PerlIO_get_cnt PerlIO_get_ptr PerlIO_read PerlIO_seek
+syn keyword xsFunction PerlIO_set_cnt PerlIO_set_ptrcnt PerlIO_setlinebuf
+syn keyword xsFunction PerlIO_stderr PerlIO_stdin PerlIO_stdout PerlIO_tell
+syn keyword xsFunction PerlIO_unread PerlIO_write Perl_GetVars
+syn keyword xsFunction Perl_Gv_AMupdate Perl_PerlIO_clearerr
+syn keyword xsFunction Perl_PerlIO_close Perl_PerlIO_context_layers
+syn keyword xsFunction Perl_PerlIO_eof Perl_PerlIO_error Perl_PerlIO_fileno
+syn keyword xsFunction Perl_PerlIO_fill Perl_PerlIO_flush
+syn keyword xsFunction Perl_PerlIO_get_base Perl_PerlIO_get_bufsiz
+syn keyword xsFunction Perl_PerlIO_get_cnt Perl_PerlIO_get_ptr
+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__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_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
+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_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
+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_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_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
+syn keyword xsFunction Perl_gv_fetchfile_flags Perl_gv_fetchmeth_pv
+syn keyword xsFunction Perl_gv_fetchmeth_pv_autoload Perl_gv_fetchmeth_pvn
+syn keyword xsFunction Perl_gv_fetchmeth_pvn_autoload Perl_gv_fetchmeth_sv
+syn keyword xsFunction Perl_gv_fetchmeth_sv_autoload
+syn keyword xsFunction Perl_gv_fetchmethod_autoload
+syn keyword xsFunction Perl_gv_fetchmethod_pv_flags
+syn keyword xsFunction Perl_gv_fetchmethod_pvn_flags
+syn keyword xsFunction Perl_gv_fetchmethod_sv_flags Perl_gv_fetchpv
+syn keyword xsFunction Perl_gv_fetchpvn_flags Perl_gv_fetchsv
+syn keyword xsFunction Perl_gv_fullname Perl_gv_fullname4 Perl_gv_handler
+syn keyword xsFunction Perl_gv_init_pv Perl_gv_init_pvn Perl_gv_init_sv
+syn keyword xsFunction Perl_gv_name_set Perl_gv_stashpv Perl_gv_stashpvn
+syn keyword xsFunction Perl_gv_stashsv Perl_he_dup Perl_hek_dup
+syn keyword xsFunction Perl_hv_assert Perl_hv_clear
+syn keyword xsFunction Perl_hv_clear_placeholders Perl_hv_common
+syn keyword xsFunction Perl_hv_common_key_len Perl_hv_copy_hints_hv
+syn keyword xsFunction Perl_hv_delayfree_ent Perl_hv_eiter_p
+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_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_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_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_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
+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
+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_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
+syn keyword xsFunction Perl_parse_stmtseq Perl_parse_termexpr Perl_parser_dup
+syn keyword xsFunction Perl_pmop_dump Perl_pop_scope Perl_pregcomp
+syn keyword xsFunction Perl_pregexec Perl_pregfree Perl_pregfree2
+syn keyword xsFunction Perl_prescan_version Perl_printf_nocontext
+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_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
+syn keyword xsFunction Perl_reg_named_buff_exists Perl_reg_named_buff_fetch
+syn keyword xsFunction Perl_reg_named_buff_firstkey
+syn keyword xsFunction Perl_reg_named_buff_nextkey Perl_reg_named_buff_scalar
+syn keyword xsFunction Perl_regclass_swash Perl_regdump Perl_regdupe_internal
+syn keyword xsFunction Perl_regexec_flags Perl_regfree_internal
+syn keyword xsFunction Perl_reginitcolors Perl_regnext Perl_repeatcpy
+syn keyword xsFunction Perl_require_pv Perl_rninstr Perl_rsignal
+syn keyword xsFunction Perl_rsignal_state Perl_runops_debug
+syn keyword xsFunction Perl_runops_standard Perl_rv2cv_op_cv Perl_rvpv_dup
+syn keyword xsFunction Perl_safesyscalloc Perl_safesysfree Perl_safesysmalloc
+syn keyword xsFunction Perl_safesysrealloc Perl_save_I16 Perl_save_I32
+syn keyword xsFunction Perl_save_I8 Perl_save_adelete Perl_save_aelem_flags
+syn keyword xsFunction Perl_save_alloc Perl_save_aptr Perl_save_ary
+syn keyword xsFunction Perl_save_bool Perl_save_clearsv Perl_save_delete
+syn keyword xsFunction Perl_save_destructor Perl_save_destructor_x
+syn keyword xsFunction Perl_save_generic_pvref Perl_save_generic_svref
+syn keyword xsFunction Perl_save_gp Perl_save_hash Perl_save_hdelete
+syn keyword xsFunction Perl_save_helem_flags Perl_save_hints Perl_save_hptr
+syn keyword xsFunction Perl_save_int Perl_save_item Perl_save_iv
+syn keyword xsFunction Perl_save_list Perl_save_long Perl_save_nogv
+syn keyword xsFunction Perl_save_padsv_and_mortalize Perl_save_pptr
+syn keyword xsFunction Perl_save_pushi32ptr Perl_save_pushptr
+syn keyword xsFunction Perl_save_pushptrptr Perl_save_re_context
+syn keyword xsFunction Perl_save_scalar Perl_save_set_svflags
+syn keyword xsFunction Perl_save_shared_pvref Perl_save_sptr Perl_save_svref
+syn keyword xsFunction Perl_save_vptr Perl_savepv Perl_savepvn
+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_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_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
+syn keyword xsFunction Perl_sv_recode_to_utf8 Perl_sv_reftype Perl_sv_replace
+syn keyword xsFunction Perl_sv_report_used Perl_sv_reset Perl_sv_rvweaken
+syn keyword xsFunction Perl_sv_setiv Perl_sv_setiv_mg Perl_sv_setnv
+syn keyword xsFunction Perl_sv_setnv_mg Perl_sv_setpv Perl_sv_setpv_mg
+syn keyword xsFunction Perl_sv_setpvf Perl_sv_setpvf_mg
+syn keyword xsFunction Perl_sv_setpvf_mg_nocontext Perl_sv_setpvf_nocontext
+syn keyword xsFunction Perl_sv_setpviv Perl_sv_setpviv_mg Perl_sv_setpvn
+syn keyword xsFunction Perl_sv_setpvn_mg Perl_sv_setref_iv Perl_sv_setref_nv
+syn keyword xsFunction Perl_sv_setref_pv Perl_sv_setref_pvn Perl_sv_setref_uv
+syn keyword xsFunction Perl_sv_setsv_flags Perl_sv_setsv_mg Perl_sv_setuv
+syn keyword xsFunction Perl_sv_setuv_mg Perl_sv_tainted Perl_sv_true
+syn keyword xsFunction Perl_sv_uni_display Perl_sv_unmagic Perl_sv_unmagicext
+syn keyword xsFunction Perl_sv_unref_flags Perl_sv_untaint Perl_sv_upgrade
+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_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_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 _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_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_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
+syn keyword xsFunction gv_fetchmethod_pv_flags gv_fetchmethod_pvn_flags
+syn keyword xsFunction gv_fetchmethod_sv_flags gv_fetchpv gv_fetchpvn_flags
+syn keyword xsFunction gv_fetchsv gv_fullname gv_fullname4 gv_handler
+syn keyword xsFunction gv_init_pv gv_init_pvn gv_init_sv gv_name_set
+syn keyword xsFunction gv_stashpv gv_stashpvn gv_stashsv he_dup hek_dup
+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_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 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 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 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
+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
+syn keyword xsFunction sv_setsv_flags sv_setsv_mg sv_setuv sv_setuv_mg
+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_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 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
+syn keyword xsFunction whichsig_pv whichsig_pvn whichsig_sv wrap_op_checker
+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_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_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_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_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 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 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_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_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 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 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 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_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
+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 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
+syn keyword xsMacro DEBUG_CX DEBUG_C_FLAG DEBUG_C_TEST DEBUG_C_TEST_ DEBUG_D
+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_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_ 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
+syn keyword xsMacro DEBUG_T_TEST DEBUG_T_TEST_ DEBUG_U DEBUG_U_FLAG
+syn keyword xsMacro DEBUG_U_TEST DEBUG_U_TEST_ DEBUG_Uv DEBUG_Uv_TEST
+syn keyword xsMacro DEBUG_Uv_TEST_ DEBUG_X DEBUG_X_FLAG DEBUG_X_TEST
+syn keyword xsMacro DEBUG_X_TEST_ DEBUG_Xv DEBUG_Xv_TEST DEBUG_Xv_TEST_
+syn keyword xsMacro DEBUG__ DEBUG_c DEBUG_c_FLAG DEBUG_c_TEST DEBUG_c_TEST_
+syn keyword xsMacro DEBUG_f DEBUG_f_FLAG DEBUG_f_TEST DEBUG_f_TEST_ DEBUG_l
+syn keyword xsMacro DEBUG_l_FLAG DEBUG_l_TEST DEBUG_l_TEST_ DEBUG_m
+syn keyword xsMacro DEBUG_m_FLAG DEBUG_m_TEST DEBUG_m_TEST_ DEBUG_o
+syn keyword xsMacro DEBUG_o_FLAG DEBUG_o_TEST DEBUG_o_TEST_ DEBUG_p
+syn keyword xsMacro DEBUG_p_FLAG DEBUG_p_TEST DEBUG_p_TEST_ DEBUG_q
+syn keyword xsMacro DEBUG_q_FLAG DEBUG_q_TEST DEBUG_q_TEST_ DEBUG_r
+syn keyword xsMacro DEBUG_r_FLAG DEBUG_r_TEST DEBUG_r_TEST_ DEBUG_s
+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_
+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 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_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_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
+syn keyword xsMacro GETNETBYADDR_R_PROTO GETNETBYNAME_R_PROTO
+syn keyword xsMacro GETNETENT_R_PROTO GETPROTOBYNAME_R_PROTO
+syn keyword xsMacro GETPROTOBYNUMBER_R_PROTO GETPROTOENT_R_PROTO
+syn keyword xsMacro GETPWENT_R_PROTO GETPWNAM_R_PROTO GETPWUID_R_PROTO
+syn keyword xsMacro GETSERVBYNAME_R_PROTO GETSERVBYPORT_R_PROTO
+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 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 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_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_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_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_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_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_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 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 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 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
+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_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
+syn keyword xsMacro I_SYS_STATVFS I_SYS_TIME I_SYS_TIMES I_SYS_TYPES I_SYS_UN
+syn keyword xsMacro I_SYS_VFS I_SYS_WAIT I_TERMIOS I_TIME I_UNISTD I_USTAT
+syn keyword xsMacro I_UTIME I_V I_VALUES IoANY IoBOTTOM_GV IoBOTTOM_NAME
+syn keyword xsMacro IoDIRP IoFLAGS IoFMT_GV IoFMT_NAME IoIFP IoLINES
+syn keyword xsMacro IoLINES_LEFT IoOFP IoPAGE IoPAGE_LEN IoTOP_GV IoTOP_NAME
+syn keyword xsMacro IoTYPE IoTYPE_APPEND IoTYPE_CLOSED IoTYPE_IMPLICIT
+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 KELVIN_SIGN KEYWORD_PLUGIN_DECLINE
+syn keyword xsMacro KEYWORD_PLUGIN_EXPR KEYWORD_PLUGIN_STMT KEY_AUTOLOAD
+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
+syn keyword xsMacro KEY_cos KEY_crypt KEY_dbmclose KEY_dbmopen KEY_default
+syn keyword xsMacro KEY_defined KEY_delete KEY_die KEY_do KEY_dump KEY_each
+syn keyword xsMacro KEY_else KEY_elsif KEY_endgrent KEY_endhostent
+syn keyword xsMacro KEY_endnetent KEY_endprotoent KEY_endpwent KEY_endservent
+syn keyword xsMacro KEY_eof KEY_eq KEY_eval KEY_evalbytes KEY_exec KEY_exists
+syn keyword xsMacro KEY_exit KEY_exp KEY_fc KEY_fcntl KEY_fileno KEY_flock
+syn keyword xsMacro KEY_for KEY_foreach KEY_fork KEY_format KEY_formline
+syn keyword xsMacro KEY_ge KEY_getc KEY_getgrent KEY_getgrgid KEY_getgrnam
+syn keyword xsMacro KEY_gethostbyaddr KEY_gethostbyname KEY_gethostent
+syn keyword xsMacro KEY_getlogin KEY_getnetbyaddr KEY_getnetbyname
+syn keyword xsMacro KEY_getnetent KEY_getpeername KEY_getpgrp KEY_getppid
+syn keyword xsMacro KEY_getpriority KEY_getprotobyname KEY_getprotobynumber
+syn keyword xsMacro KEY_getprotoent KEY_getpwent KEY_getpwnam KEY_getpwuid
+syn keyword xsMacro KEY_getservbyname KEY_getservbyport KEY_getservent
+syn keyword xsMacro KEY_getsockname KEY_getsockopt KEY_given KEY_glob
+syn keyword xsMacro KEY_gmtime KEY_goto KEY_grep KEY_gt KEY_hex KEY_if
+syn keyword xsMacro KEY_index KEY_int KEY_ioctl KEY_join KEY_keys KEY_kill
+syn keyword xsMacro KEY_last KEY_lc KEY_lcfirst KEY_le KEY_length KEY_link
+syn keyword xsMacro KEY_listen KEY_local KEY_localtime KEY_lock KEY_log
+syn keyword xsMacro KEY_lstat KEY_lt KEY_m KEY_map KEY_mkdir KEY_msgctl
+syn keyword xsMacro KEY_msgget KEY_msgrcv KEY_msgsnd KEY_my KEY_ne KEY_next
+syn keyword xsMacro KEY_no KEY_not KEY_oct KEY_open KEY_opendir KEY_or
+syn keyword xsMacro KEY_ord KEY_our KEY_pack KEY_package KEY_pipe KEY_pop
+syn keyword xsMacro KEY_pos KEY_print KEY_printf KEY_prototype KEY_push KEY_q
+syn keyword xsMacro KEY_qq KEY_qr KEY_quotemeta KEY_qw KEY_qx KEY_rand
+syn keyword xsMacro KEY_read KEY_readdir KEY_readline KEY_readlink
+syn keyword xsMacro KEY_readpipe KEY_recv KEY_redo KEY_ref KEY_rename
+syn keyword xsMacro KEY_require KEY_reset KEY_return KEY_reverse
+syn keyword xsMacro KEY_rewinddir KEY_rindex KEY_rmdir KEY_s KEY_say
+syn keyword xsMacro KEY_scalar KEY_seek KEY_seekdir KEY_select KEY_semctl
+syn keyword xsMacro KEY_semget KEY_semop KEY_send KEY_setgrent KEY_sethostent
+syn keyword xsMacro KEY_setnetent KEY_setpgrp KEY_setpriority KEY_setprotoent
+syn keyword xsMacro KEY_setpwent KEY_setservent KEY_setsockopt KEY_shift
+syn keyword xsMacro KEY_shmctl KEY_shmget KEY_shmread KEY_shmwrite
+syn keyword xsMacro KEY_shutdown KEY_sin KEY_sleep KEY_socket KEY_socketpair
+syn keyword xsMacro KEY_sort KEY_splice KEY_split KEY_sprintf KEY_sqrt
+syn keyword xsMacro KEY_srand KEY_stat KEY_state KEY_study KEY_sub KEY_substr
+syn keyword xsMacro KEY_symlink KEY_syscall KEY_sysopen KEY_sysread
+syn keyword xsMacro KEY_sysseek KEY_system KEY_syswrite KEY_tell KEY_telldir
+syn keyword xsMacro KEY_tie KEY_tied KEY_time KEY_times KEY_tr KEY_truncate
+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 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_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
+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_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 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 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 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_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 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_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
+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
+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
+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_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_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_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_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_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_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_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
+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_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_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_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_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
+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
+syn keyword xsMacro PERL_ARGS_ASSERT_DOFILE PERL_ARGS_ASSERT_DOFINDLABEL
+syn keyword xsMacro PERL_ARGS_ASSERT_DOFORM PERL_ARGS_ASSERT_DOONELINER
+syn keyword xsMacro PERL_ARGS_ASSERT_DOOPEN_PM PERL_ARGS_ASSERT_DOPARSEFORM
+syn keyword xsMacro PERL_ARGS_ASSERT_DOPOPTOLABEL
+syn keyword xsMacro PERL_ARGS_ASSERT_DOPOPTOSUB_AT PERL_ARGS_ASSERT_DOREF
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_AEXEC PERL_ARGS_ASSERT_DO_AEXEC5
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_ASPAWN PERL_ARGS_ASSERT_DO_BINMODE
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_CHOMP PERL_ARGS_ASSERT_DO_DUMP_PAD
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_EOF PERL_ARGS_ASSERT_DO_EXEC
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_EXEC3 PERL_ARGS_ASSERT_DO_GVGV_DUMP
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_GV_DUMP PERL_ARGS_ASSERT_DO_HV_DUMP
+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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_TRANS
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_TRANS_COMPLEX
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_TRANS_COMPLEX_UTF8
+syn keyword xsMacro PERL_ARGS_ASSERT_DO_TRANS_COUNT
+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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_SV_CHILD PERL_ARGS_ASSERT_DUMP_TRIE
+syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_LIST
+syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_TRIE_INTERIM_TABLE
+syn keyword xsMacro PERL_ARGS_ASSERT_DUMP_VINDENT
+syn keyword xsMacro PERL_ARGS_ASSERT_DUP_ATTRLIST
+syn keyword xsMacro PERL_ARGS_ASSERT_EMULATE_COP_IO PERL_ARGS_ASSERT_EVAL_PV
+syn keyword xsMacro PERL_ARGS_ASSERT_EVAL_SV PERL_ARGS_ASSERT_EXEC_FAILED
+syn keyword xsMacro PERL_ARGS_ASSERT_EXPECT_NUMBER PERL_ARGS_ASSERT_F0CONVERT
+syn keyword xsMacro PERL_ARGS_ASSERT_FBM_COMPILE PERL_ARGS_ASSERT_FBM_INSTR
+syn keyword xsMacro PERL_ARGS_ASSERT_FEATURE_IS_ENABLED
+syn keyword xsMacro PERL_ARGS_ASSERT_FILTER_DEL PERL_ARGS_ASSERT_FILTER_GETS
+syn keyword xsMacro PERL_ARGS_ASSERT_FILTER_READ PERL_ARGS_ASSERT_FINALIZE_OP
+syn keyword xsMacro PERL_ARGS_ASSERT_FINALIZE_OPTREE
+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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_FORCE_IDENT
+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
+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_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 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
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_EFULLNAME
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_EFULLNAME3
+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
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETHOD_AUTOLOAD
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETHOD_PVN_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETHOD_PV_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETHOD_SV_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETH_PV
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETH_PVN
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETH_PVN_AUTOLOAD
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETH_PV_AUTOLOAD
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETH_SV
+syn keyword xsMacro PERL_ARGS_ASSERT_GV_FETCHMETH_SV_AUTOLOAD
+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 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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_DELAYFREE_ENT
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_DELETE PERL_ARGS_ASSERT_HV_DELETE_ENT
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_EITER_P PERL_ARGS_ASSERT_HV_EITER_SET
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_ENAME_ADD
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_ENAME_DELETE
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_EXISTS PERL_ARGS_ASSERT_HV_EXISTS_ENT
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_FETCH PERL_ARGS_ASSERT_HV_FETCH_ENT
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_FILL PERL_ARGS_ASSERT_HV_FREE_ENT
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_FREE_ENT_RET
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_ITERINIT PERL_ARGS_ASSERT_HV_ITERKEY
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_ITERKEYSV
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_ITERNEXT
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_ITERNEXTSV
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_ITERNEXT_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_ITERVAL
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_KILL_BACKREFS
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_KSPLIT PERL_ARGS_ASSERT_HV_MAGIC
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_MAGIC_CHECK
+syn keyword xsMacro PERL_ARGS_ASSERT_HV_NAME_SET
+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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_INIT_POSTDUMP_SYMBOLS
+syn keyword xsMacro PERL_ARGS_ASSERT_INIT_TM PERL_ARGS_ASSERT_INPLACE_AASSIGN
+syn keyword xsMacro PERL_ARGS_ASSERT_INSTR PERL_ARGS_ASSERT_INTUIT_METHOD
+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_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_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_CNTRL
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_COMMON
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_DIGIT
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_GRAPH
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_IDCONT
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_IDFIRST
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_LOWER
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_MARK
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_PERL_SPACE
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_PERL_WORD
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_POSIX_DIGIT
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_PRINT
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_PUNCT
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_SPACE
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_STRING
+syn keyword xsMacro PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC
+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 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
+syn keyword xsMacro PERL_ARGS_ASSERT_LEX_STUFF_PVN
+syn keyword xsMacro PERL_ARGS_ASSERT_LEX_STUFF_SV
+syn keyword xsMacro PERL_ARGS_ASSERT_LEX_UNSTUFF PERL_ARGS_ASSERT_LOAD_MODULE
+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
+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
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETPOS
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETSIG
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_GETSUBSTR
+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_METHCALL
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_METHCALL1
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_METHPACK
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_NEXTPACK
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_REGDATA_CNT
+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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETPOS
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETREGEXP
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETSIG
+syn keyword xsMacro PERL_ARGS_ASSERT_MAGIC_SETSUBSTR
+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_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_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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA
+syn keyword xsMacro PERL_ARGS_ASSERT_MRO_GET_LINEAR_ISA_DFS
+syn keyword xsMacro PERL_ARGS_ASSERT_MRO_GET_PRIVATE_DATA
+syn keyword xsMacro PERL_ARGS_ASSERT_MRO_ISA_CHANGED_IN
+syn keyword xsMacro PERL_ARGS_ASSERT_MRO_META_DUP
+syn keyword xsMacro PERL_ARGS_ASSERT_MRO_META_INIT
+syn keyword xsMacro PERL_ARGS_ASSERT_MRO_METHOD_CHANGED_IN
+syn keyword xsMacro PERL_ARGS_ASSERT_MRO_PACKAGE_MOVED
+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_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
+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_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
+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_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_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_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
+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_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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_PERL_ALLOC_USING
+syn keyword xsMacro PERL_ARGS_ASSERT_PERL_CLONE
+syn keyword xsMacro PERL_ARGS_ASSERT_PERL_CLONE_USING
+syn keyword xsMacro PERL_ARGS_ASSERT_PERL_CONSTRUCT
+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
+syn keyword xsMacro PERL_ARGS_ASSERT_PRINTBUF
+syn keyword xsMacro PERL_ARGS_ASSERT_PRINTF_NOCONTEXT
+syn keyword xsMacro PERL_ARGS_ASSERT_PROCESS_SPECIAL_BLOCKS
+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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_REFCOUNTED_HE_FETCH_SV
+syn keyword xsMacro PERL_ARGS_ASSERT_REFCOUNTED_HE_NEW_PV
+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_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
+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
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_CHECK_NAMED_BUFF_MATCHED
+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
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_NAMED_BUFF_FETCH
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_NAMED_BUFF_FIRSTKEY
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_NAMED_BUFF_ITER
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_NAMED_BUFF_NEXTKEY
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_NAMED_BUFF_SCALAR
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_NODE
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_FETCH
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_LENGTH
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_NUMBERED_BUFF_STORE
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_QR_PACKAGE
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_RECODE
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_SCAN_NAME
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_SKIPCOMMENT
+syn keyword xsMacro PERL_ARGS_ASSERT_REG_TEMP_COPY PERL_ARGS_ASSERT_REPEATCPY
+syn keyword xsMacro PERL_ARGS_ASSERT_REPORT_REDEFINED_CV
+syn keyword xsMacro PERL_ARGS_ASSERT_REQUIRE_PV
+syn keyword xsMacro PERL_ARGS_ASSERT_REQUIRE_TIE_MOD
+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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_RXRES_RESTORE
+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
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_DESTRUCTOR
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_GENERIC_PVREF
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_GENERIC_SVREF
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_GP PERL_ARGS_ASSERT_SAVE_HASH
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_HDELETE
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_HEK_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_HELEM_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SAVE_HPTR PERL_ARGS_ASSERT_SAVE_I16
+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_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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_HEREDOC PERL_ARGS_ASSERT_SCAN_HEX
+syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_IDENT
+syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_INPUTSYMBOL
+syn keyword xsMacro PERL_ARGS_ASSERT_SCAN_NUM PERL_ARGS_ASSERT_SCAN_OCT
+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_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_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_STDIZE_LOCALE
+syn keyword xsMacro PERL_ARGS_ASSERT_STRIP_RETURN
+syn keyword xsMacro PERL_ARGS_ASSERT_STR_TO_VERSION
+syn keyword xsMacro PERL_ARGS_ASSERT_STUDY_CHUNK
+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_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_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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_CATPVN_FLAGS
+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
+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_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_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_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
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_POS_U2B_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_POS_U2B_FORWARDS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_POS_U2B_MIDWAY PERL_ARGS_ASSERT_SV_PV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_PVBYTE PERL_ARGS_ASSERT_SV_PVBYTEN
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_PVBYTEN_FORCE PERL_ARGS_ASSERT_SV_PVN
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_PVN_FORCE
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_PVN_FORCE_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_PVN_NOMG PERL_ARGS_ASSERT_SV_PVUTF8
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_PVUTF8N
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_PVUTF8N_FORCE
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_RECODE_TO_UTF8
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_REF PERL_ARGS_ASSERT_SV_REFTYPE
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_RELEASE_COW
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_REPLACE PERL_ARGS_ASSERT_SV_RESET
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_RVWEAKEN PERL_ARGS_ASSERT_SV_SETHEK
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETIV PERL_ARGS_ASSERT_SV_SETIV_MG
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETNV PERL_ARGS_ASSERT_SV_SETNV_MG
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETPV PERL_ARGS_ASSERT_SV_SETPVF
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETPVF_MG
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETPVF_MG_NOCONTEXT
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETPVF_NOCONTEXT
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETPVIV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETPVIV_MG PERL_ARGS_ASSERT_SV_SETPVN
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETPVN_MG
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETPV_MG
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETREF_IV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETREF_NV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETREF_PV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETREF_PVN
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETREF_UV PERL_ARGS_ASSERT_SV_SETSV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETSV_COW
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETSV_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETSV_MG PERL_ARGS_ASSERT_SV_SETUV
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_SETUV_MG PERL_ARGS_ASSERT_SV_TAINT
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_TAINTED PERL_ARGS_ASSERT_SV_UNGLOB
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_UNI_DISPLAY
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_UNMAGIC
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_UNMAGICEXT PERL_ARGS_ASSERT_SV_UNREF
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_UNREF_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_UNTAINT PERL_ARGS_ASSERT_SV_UPGRADE
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_USEPVN
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_USEPVN_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_USEPVN_MG
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_UTF8_DECODE
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE
+syn keyword xsMacro PERL_ARGS_ASSERT_SV_UTF8_ENCODE
+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_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_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_MANY_ARGUMENTS_PV
+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
+syn keyword xsMacro PERL_ARGS_ASSERT_TO_UNI_UPPER
+syn keyword xsMacro PERL_ARGS_ASSERT_TO_UTF8_CASE
+syn keyword xsMacro PERL_ARGS_ASSERT_TO_UTF8_FOLD
+syn keyword xsMacro PERL_ARGS_ASSERT_TO_UTF8_LOWER
+syn keyword xsMacro PERL_ARGS_ASSERT_TO_UTF8_SUBSTR
+syn keyword xsMacro PERL_ARGS_ASSERT_TO_UTF8_TITLE
+syn keyword xsMacro PERL_ARGS_ASSERT_TO_UTF8_UPPER
+syn keyword xsMacro PERL_ARGS_ASSERT_TRANSLATE_SUBSTR_OFFSETS
+syn keyword xsMacro PERL_ARGS_ASSERT_UIV_2BUF PERL_ARGS_ASSERT_UNLNK
+syn keyword xsMacro PERL_ARGS_ASSERT_UNPACKSTRING PERL_ARGS_ASSERT_UNPACK_REC
+syn keyword xsMacro PERL_ARGS_ASSERT_UNPACK_STR
+syn keyword xsMacro PERL_ARGS_ASSERT_UNREFERENCED_TO_TMP_STACK
+syn keyword xsMacro PERL_ARGS_ASSERT_UPG_VERSION
+syn keyword xsMacro PERL_ARGS_ASSERT_UTF16_TEXTFILTER
+syn keyword xsMacro PERL_ARGS_ASSERT_UTF16_TO_UTF8
+syn keyword xsMacro PERL_ARGS_ASSERT_UTF16_TO_UTF8_REVERSED
+syn keyword xsMacro PERL_ARGS_ASSERT_UTF8N_TO_UVCHR
+syn keyword xsMacro PERL_ARGS_ASSERT_UTF8N_TO_UVUNI
+syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_DISTANCE PERL_ARGS_ASSERT_UTF8_HOP
+syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_LENGTH
+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_UVUNI
+syn keyword xsMacro PERL_ARGS_ASSERT_UTF8_TO_UVUNI_BUF
+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
+syn keyword xsMacro PERL_ARGS_ASSERT_VCMP PERL_ARGS_ASSERT_VDEB
+syn keyword xsMacro PERL_ARGS_ASSERT_VFORM PERL_ARGS_ASSERT_VISIT
+syn keyword xsMacro PERL_ARGS_ASSERT_VIVIFY_DEFELEM
+syn keyword xsMacro PERL_ARGS_ASSERT_VIVIFY_REF PERL_ARGS_ASSERT_VLOAD_MODULE
+syn keyword xsMacro PERL_ARGS_ASSERT_VMESS PERL_ARGS_ASSERT_VNEWSVPVF
+syn keyword xsMacro PERL_ARGS_ASSERT_VNORMAL PERL_ARGS_ASSERT_VNUMIFY
+syn keyword xsMacro PERL_ARGS_ASSERT_VSTRINGIFY PERL_ARGS_ASSERT_VVERIFY
+syn keyword xsMacro PERL_ARGS_ASSERT_VWARN PERL_ARGS_ASSERT_VWARNER
+syn keyword xsMacro PERL_ARGS_ASSERT_WAIT4PID PERL_ARGS_ASSERT_WARN
+syn keyword xsMacro PERL_ARGS_ASSERT_WARNER PERL_ARGS_ASSERT_WARNER_NOCONTEXT
+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_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_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_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
+syn keyword xsMacro PERL_ARGS_ASSERT__TO_UNI_FOLD_FLAGS
+syn keyword xsMacro PERL_ARGS_ASSERT__TO_UPPER_TITLE_LATIN1
+syn keyword xsMacro PERL_ARGS_ASSERT__TO_UTF8_FOLD_FLAGS
+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_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 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_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_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_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_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
+syn keyword xsMacro PERL_ULONG_MAX PERL_ULONG_MIN PERL_UNICODE_ALL_FLAGS
+syn keyword xsMacro PERL_UNICODE_ARGV PERL_UNICODE_ARGV_FLAG
+syn keyword xsMacro PERL_UNICODE_DEFAULT_FLAGS PERL_UNICODE_IN
+syn keyword xsMacro PERL_UNICODE_INOUT PERL_UNICODE_INOUT_FLAG
+syn keyword xsMacro PERL_UNICODE_IN_FLAG PERL_UNICODE_LOCALE
+syn keyword xsMacro PERL_UNICODE_LOCALE_FLAG PERL_UNICODE_MAX
+syn keyword xsMacro PERL_UNICODE_OUT PERL_UNICODE_OUT_FLAG PERL_UNICODE_STD
+syn keyword xsMacro PERL_UNICODE_STDERR PERL_UNICODE_STDERR_FLAG
+syn keyword xsMacro PERL_UNICODE_STDIN PERL_UNICODE_STDIN_FLAG
+syn keyword xsMacro PERL_UNICODE_STDOUT PERL_UNICODE_STDOUT_FLAG
+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_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_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_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
+syn keyword xsMacro PL_debug_pad PL_def_layerlist PL_defgv PL_defoutgv
+syn keyword xsMacro PL_defstash PL_delaymagic PL_delaymagic_egid
+syn keyword xsMacro PL_delaymagic_euid PL_delaymagic_gid PL_delaymagic_uid
+syn keyword xsMacro PL_destroyhook PL_diehook PL_dirty PL_do_undump
+syn keyword xsMacro PL_dollarzero_mutex PL_doswitches PL_dowarn PL_dumper_fd
+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_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_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_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
+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_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_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 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 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_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
+syn keyword xsMacro PerlLIO_write PerlMemParse_calloc PerlMemParse_free
+syn keyword xsMacro PerlMemParse_free_lock PerlMemParse_get_lock
+syn keyword xsMacro PerlMemParse_is_locked PerlMemParse_malloc
+syn keyword xsMacro PerlMemParse_realloc PerlMemShared_calloc
+syn keyword xsMacro PerlMemShared_free PerlMemShared_free_lock
+syn keyword xsMacro PerlMemShared_get_lock PerlMemShared_is_locked
+syn keyword xsMacro PerlMemShared_malloc PerlMemShared_realloc PerlMem_calloc
+syn keyword xsMacro PerlMem_free PerlMem_free_lock PerlMem_get_lock
+syn keyword xsMacro PerlMem_is_locked PerlMem_malloc PerlMem_realloc
+syn keyword xsMacro PerlProc_DynaLoad PerlProc_GetOSError PerlProc__exit
+syn keyword xsMacro PerlProc_abort PerlProc_crypt PerlProc_execl
+syn keyword xsMacro PerlProc_execv PerlProc_execvp PerlProc_exit
+syn keyword xsMacro PerlProc_fork PerlProc_getegid PerlProc_geteuid
+syn keyword xsMacro PerlProc_getgid PerlProc_getlogin PerlProc_getpid
+syn keyword xsMacro PerlProc_gettimeofday PerlProc_getuid PerlProc_kill
+syn keyword xsMacro PerlProc_killpg PerlProc_lasthost PerlProc_longjmp
+syn keyword xsMacro PerlProc_pause PerlProc_pclose PerlProc_pipe
+syn keyword xsMacro PerlProc_popen PerlProc_popen_list PerlProc_setgid
+syn keyword xsMacro PerlProc_setjmp PerlProc_setuid PerlProc_signal
+syn keyword xsMacro PerlProc_sleep PerlProc_spawnvp PerlProc_times
+syn keyword xsMacro PerlProc_wait PerlProc_waitpid PerlSIO_canset_cnt
+syn keyword xsMacro PerlSIO_clearerr PerlSIO_fast_gets PerlSIO_fclose
+syn keyword xsMacro PerlSIO_fdopen PerlSIO_fdupopen PerlSIO_feof
+syn keyword xsMacro PerlSIO_ferror PerlSIO_fflush PerlSIO_fgetc
+syn keyword xsMacro PerlSIO_fgetpos PerlSIO_fgets PerlSIO_fileno
+syn keyword xsMacro PerlSIO_fopen PerlSIO_fputc PerlSIO_fputs PerlSIO_fread
+syn keyword xsMacro PerlSIO_freopen PerlSIO_fseek PerlSIO_fsetpos
+syn keyword xsMacro PerlSIO_ftell PerlSIO_fwrite PerlSIO_get_base
+syn keyword xsMacro PerlSIO_get_bufsiz PerlSIO_get_cnt PerlSIO_get_ptr
+syn keyword xsMacro PerlSIO_has_base PerlSIO_has_cntptr PerlSIO_init
+syn keyword xsMacro PerlSIO_printf PerlSIO_rewind PerlSIO_set_cnt
+syn keyword xsMacro PerlSIO_set_ptr PerlSIO_setbuf PerlSIO_setlinebuf
+syn keyword xsMacro PerlSIO_setvbuf PerlSIO_stderr PerlSIO_stdin
+syn keyword xsMacro PerlSIO_stdout PerlSIO_stdoutf PerlSIO_tmpfile
+syn keyword xsMacro PerlSIO_ungetc PerlSIO_vprintf PerlSock_accept
+syn keyword xsMacro PerlSock_bind PerlSock_closesocket PerlSock_connect
+syn keyword xsMacro PerlSock_endhostent PerlSock_endnetent
+syn keyword xsMacro PerlSock_endprotoent PerlSock_endservent
+syn keyword xsMacro PerlSock_gethostbyaddr PerlSock_gethostbyname
+syn keyword xsMacro PerlSock_gethostent PerlSock_gethostname
+syn keyword xsMacro PerlSock_getnetbyaddr PerlSock_getnetbyname
+syn keyword xsMacro PerlSock_getnetent PerlSock_getpeername
+syn keyword xsMacro PerlSock_getprotobyname PerlSock_getprotobynumber
+syn keyword xsMacro PerlSock_getprotoent PerlSock_getservbyname
+syn keyword xsMacro PerlSock_getservbyport PerlSock_getservent
+syn keyword xsMacro PerlSock_getsockname PerlSock_getsockopt PerlSock_htonl
+syn keyword xsMacro PerlSock_htons PerlSock_inet_addr PerlSock_inet_ntoa
+syn keyword xsMacro PerlSock_listen PerlSock_ntohl PerlSock_ntohs
+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_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_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
+syn keyword xsMacro Perl_pp_dbmclose Perl_pp_dofile Perl_pp_dor
+syn keyword xsMacro Perl_pp_dorassign Perl_pp_dump Perl_pp_egrent
+syn keyword xsMacro Perl_pp_enetent Perl_pp_eprotoent Perl_pp_epwent
+syn keyword xsMacro Perl_pp_eservent Perl_pp_exp Perl_pp_fcntl
+syn keyword xsMacro Perl_pp_ftatime Perl_pp_ftbinary Perl_pp_ftblk
+syn keyword xsMacro Perl_pp_ftchr Perl_pp_ftctime Perl_pp_ftdir
+syn keyword xsMacro Perl_pp_fteexec Perl_pp_fteowned Perl_pp_fteread
+syn keyword xsMacro Perl_pp_ftewrite Perl_pp_ftfile Perl_pp_ftmtime
+syn keyword xsMacro Perl_pp_ftpipe Perl_pp_ftrexec Perl_pp_ftrwrite
+syn keyword xsMacro Perl_pp_ftsgid Perl_pp_ftsize Perl_pp_ftsock
+syn keyword xsMacro Perl_pp_ftsuid Perl_pp_ftsvtx Perl_pp_ftzero
+syn keyword xsMacro Perl_pp_getpeername Perl_pp_getsockname Perl_pp_ggrgid
+syn keyword xsMacro Perl_pp_ggrnam Perl_pp_ghbyaddr Perl_pp_ghbyname
+syn keyword xsMacro Perl_pp_gnbyaddr Perl_pp_gnbyname Perl_pp_gpbyname
+syn keyword xsMacro Perl_pp_gpbynumber Perl_pp_gpwnam Perl_pp_gpwuid
+syn keyword xsMacro Perl_pp_gsbyname Perl_pp_gsbyport Perl_pp_gsockopt
+syn keyword xsMacro Perl_pp_hex Perl_pp_i_postdec Perl_pp_i_postinc
+syn keyword xsMacro Perl_pp_i_predec Perl_pp_i_preinc Perl_pp_keys
+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_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_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_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
+syn keyword xsMacro REENTRANT_PROTO_S_CWISBIE REENTRANT_PROTO_S_CWISBWIE
+syn keyword xsMacro REENTRANT_PROTO_S_ICSBI REENTRANT_PROTO_S_ISBI
+syn keyword xsMacro REENTRANT_PROTO_S_LISBI REENTRANT_PROTO_S_SBI
+syn keyword xsMacro REENTRANT_PROTO_S_SBIE REENTRANT_PROTO_S_SBW
+syn keyword xsMacro REENTRANT_PROTO_S_TISBI REENTRANT_PROTO_S_TSBI
+syn keyword xsMacro REENTRANT_PROTO_S_TSBIE REENTRANT_PROTO_S_TWISBIE
+syn keyword xsMacro REENTRANT_PROTO_V_D REENTRANT_PROTO_V_H
+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_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 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_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_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_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
+syn keyword xsMacro SAVECOPSTASH_FREE SAVEDELETE SAVEDESTRUCTOR
+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_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_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 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_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_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_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_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
+syn keyword xsMacro SvPV_force_nomg_nolen SvPV_free SvPV_mutable SvPV_nolen
+syn keyword xsMacro SvPV_nolen_const SvPV_nomg SvPV_nomg_const
+syn keyword xsMacro SvPV_nomg_const_nolen SvPV_nomg_nolen SvPV_renew SvPV_set
+syn keyword xsMacro SvPV_shrink_to_cur SvPVbyte SvPVbyte_force SvPVbyte_nolen
+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_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_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 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
+syn keyword xsMacro UNICODE_GREEK_CAPITAL_LETTER_SIGMA
+syn keyword xsMacro UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA
+syn keyword xsMacro UNICODE_GREEK_SMALL_LETTER_SIGMA
+syn keyword xsMacro UNICODE_IS_BYTE_ORDER_MARK UNICODE_IS_FE_FF
+syn keyword xsMacro UNICODE_IS_NONCHAR UNICODE_IS_REPLACEMENT
+syn keyword xsMacro UNICODE_IS_SUPER UNICODE_IS_SURROGATE UNICODE_LINE_SEPA_0
+syn keyword xsMacro UNICODE_LINE_SEPA_1 UNICODE_LINE_SEPA_2
+syn keyword xsMacro UNICODE_PARA_SEPA_0 UNICODE_PARA_SEPA_1
+syn keyword xsMacro UNICODE_PARA_SEPA_2 UNICODE_PAT_MOD UNICODE_PAT_MODS
+syn keyword xsMacro UNICODE_REPLACEMENT UNICODE_SURROGATE_FIRST
+syn keyword xsMacro UNICODE_SURROGATE_LAST UNICODE_WARN_FE_FF
+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 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_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_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_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 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
+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 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_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 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_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_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 _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_ 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 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 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 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_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 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_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_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 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 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 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 tryAMAGICunTARGETlist tryAMAGICun_MG ttyname umask uname
+syn keyword xsMacro unlink unpackWARN1 unpackWARN2 unpackWARN3 unpackWARN4
+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.
+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"
+
+" vim: ts=8
diff --git a/runtime/syntax/xsd.vim b/runtime/syntax/xsd.vim
new file mode 100644
index 0000000..5ba6b44
--- /dev/null
+++ b/runtime/syntax/xsd.vim
@@ -0,0 +1,61 @@
+" Vim syntax file
+" Language: XSD (XML Schema)
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Tue, 27 Apr 2004 14:54:59 CEST
+" Filenames: *.xsd
+" $Id: xsd.vim,v 1.1 2004/06/13 18:20:48 vimboss Exp $
+
+" REFERENCES:
+" [1] http://www.w3.org/TR/xmlschema-0
+"
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime syntax/xml.vim
+
+syn cluster xmlTagHook add=xsdElement
+syn case match
+
+syn match xsdElement '\%(xsd:\)\@<=all'
+syn match xsdElement '\%(xsd:\)\@<=annotation'
+syn match xsdElement '\%(xsd:\)\@<=any'
+syn match xsdElement '\%(xsd:\)\@<=anyAttribute'
+syn match xsdElement '\%(xsd:\)\@<=appInfo'
+syn match xsdElement '\%(xsd:\)\@<=attribute'
+syn match xsdElement '\%(xsd:\)\@<=attributeGroup'
+syn match xsdElement '\%(xsd:\)\@<=choice'
+syn match xsdElement '\%(xsd:\)\@<=complexContent'
+syn match xsdElement '\%(xsd:\)\@<=complexType'
+syn match xsdElement '\%(xsd:\)\@<=documentation'
+syn match xsdElement '\%(xsd:\)\@<=element'
+syn match xsdElement '\%(xsd:\)\@<=enumeration'
+syn match xsdElement '\%(xsd:\)\@<=extension'
+syn match xsdElement '\%(xsd:\)\@<=field'
+syn match xsdElement '\%(xsd:\)\@<=group'
+syn match xsdElement '\%(xsd:\)\@<=import'
+syn match xsdElement '\%(xsd:\)\@<=include'
+syn match xsdElement '\%(xsd:\)\@<=key'
+syn match xsdElement '\%(xsd:\)\@<=keyref'
+syn match xsdElement '\%(xsd:\)\@<=length'
+syn match xsdElement '\%(xsd:\)\@<=list'
+syn match xsdElement '\%(xsd:\)\@<=maxInclusive'
+syn match xsdElement '\%(xsd:\)\@<=maxLength'
+syn match xsdElement '\%(xsd:\)\@<=minInclusive'
+syn match xsdElement '\%(xsd:\)\@<=minLength'
+syn match xsdElement '\%(xsd:\)\@<=pattern'
+syn match xsdElement '\%(xsd:\)\@<=redefine'
+syn match xsdElement '\%(xsd:\)\@<=restriction'
+syn match xsdElement '\%(xsd:\)\@<=schema'
+syn match xsdElement '\%(xsd:\)\@<=selector'
+syn match xsdElement '\%(xsd:\)\@<=sequence'
+syn match xsdElement '\%(xsd:\)\@<=simpleContent'
+syn match xsdElement '\%(xsd:\)\@<=simpleType'
+syn match xsdElement '\%(xsd:\)\@<=union'
+syn match xsdElement '\%(xsd:\)\@<=unique'
+
+hi def link xsdElement Statement
+
+" vim: ts=8
diff --git a/runtime/syntax/xslt.vim b/runtime/syntax/xslt.vim
new file mode 100644
index 0000000..900b8ca
--- /dev/null
+++ b/runtime/syntax/xslt.vim
@@ -0,0 +1,71 @@
+" Vim syntax file
+" Language: XSLT
+" Maintainer: Bogdan Barbu <l4b.bogdan.barbu@gmail.com>
+" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Fri, 17 Jan 2020 07:15:37 +0200
+" Filenames: *.xsl
+" $Id: xslt.vim,v 1.1 2004/06/13 15:52:10 vimboss Exp $
+
+" REFERENCES:
+" [1] http://www.w3.org/TR/xslt
+" [2] http://www.w3.org/TR/xslt20
+
+" Quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+runtime syntax/xml.vim
+
+syn cluster xmlTagHook add=xslElement
+syn case match
+
+syn match xslElement '\%(xsl:\)\@<=analyze-string'
+syn match xslElement '\%(xsl:\)\@<=apply-imports'
+syn match xslElement '\%(xsl:\)\@<=apply-templates'
+syn match xslElement '\%(xsl:\)\@<=attribute'
+syn match xslElement '\%(xsl:\)\@<=attribute-set'
+syn match xslElement '\%(xsl:\)\@<=call-template'
+syn match xslElement '\%(xsl:\)\@<=character-map'
+syn match xslElement '\%(xsl:\)\@<=choose'
+syn match xslElement '\%(xsl:\)\@<=comment'
+syn match xslElement '\%(xsl:\)\@<=copy'
+syn match xslElement '\%(xsl:\)\@<=copy-of'
+syn match xslElement '\%(xsl:\)\@<=decimal-format'
+syn match xslElement '\%(xsl:\)\@<=document'
+syn match xslElement '\%(xsl:\)\@<=element'
+syn match xslElement '\%(xsl:\)\@<=fallback'
+syn match xslElement '\%(xsl:\)\@<=for-each'
+syn match xslElement '\%(xsl:\)\@<=for-each-group'
+syn match xslElement '\%(xsl:\)\@<=function'
+syn match xslElement '\%(xsl:\)\@<=if'
+syn match xslElement '\%(xsl:\)\@<=include'
+syn match xslElement '\%(xsl:\)\@<=import'
+syn match xslElement '\%(xsl:\)\@<=import-schema'
+syn match xslElement '\%(xsl:\)\@<=key'
+syn match xslElement '\%(xsl:\)\@<=message'
+syn match xslElement '\%(xsl:\)\@<=namespace'
+syn match xslElement '\%(xsl:\)\@<=namespace-alias'
+syn match xslElement '\%(xsl:\)\@<=number'
+syn match xslElement '\%(xsl:\)\@<=otherwise'
+syn match xslElement '\%(xsl:\)\@<=output'
+syn match xslElement '\%(xsl:\)\@<=param'
+syn match xslElement '\%(xsl:\)\@<=perform-sort'
+syn match xslElement '\%(xsl:\)\@<=processing-instruction'
+syn match xslElement '\%(xsl:\)\@<=preserve-space'
+syn match xslElement '\%(xsl:\)\@<=script'
+syn match xslElement '\%(xsl:\)\@<=sequence'
+syn match xslElement '\%(xsl:\)\@<=sort'
+syn match xslElement '\%(xsl:\)\@<=strip-space'
+syn match xslElement '\%(xsl:\)\@<=stylesheet'
+syn match xslElement '\%(xsl:\)\@<=template'
+syn match xslElement '\%(xsl:\)\@<=transform'
+syn match xslElement '\%(xsl:\)\@<=text'
+syn match xslElement '\%(xsl:\)\@<=value-of'
+syn match xslElement '\%(xsl:\)\@<=variable'
+syn match xslElement '\%(xsl:\)\@<=when'
+syn match xslElement '\%(xsl:\)\@<=with-param'
+
+hi def link xslElement Statement
+
+" vim: ts=8
diff --git a/runtime/syntax/xxd.vim b/runtime/syntax/xxd.vim
new file mode 100644
index 0000000..2f90b6b
--- /dev/null
+++ b/runtime/syntax/xxd.vim
@@ -0,0 +1,30 @@
+" Vim syntax file
+" Language: bin using xxd
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Aug 31, 2016
+" Version: 11
+" Notes: use :help xxd to see how to invoke it
+" URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_XXD
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn match xxdAddress "^[0-9a-f]\+:" contains=xxdSep
+syn match xxdSep contained ":"
+syn match xxdAscii " .\{,16\}\r\=$"hs=s+2 contains=xxdDot
+syn match xxdDot contained "[.\r]"
+
+" Define the default highlighting.
+if !exists("skip_xxd_syntax_inits")
+
+ hi def link xxdAddress Constant
+ hi def link xxdSep Identifier
+ hi def link xxdAscii Statement
+
+endif
+
+let b:current_syntax = "xxd"
+
+" vim: ts=4
diff --git a/runtime/syntax/yacc.vim b/runtime/syntax/yacc.vim
new file mode 100644
index 0000000..3aa01e8
--- /dev/null
+++ b/runtime/syntax/yacc.vim
@@ -0,0 +1,120 @@
+" Vim syntax file
+" Language: Yacc
+" Maintainer: Charles E. Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
+" Last Change: Mar 25, 2019
+" Version: 17
+" 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 exists("b:current_syntax")
+ syntax clear
+endif
+
+" ---------------------------------------------------------------------
+" Folding Support {{{1
+if has("folding")
+ com! -nargs=+ SynFold <args> fold
+else
+ com! -nargs=+ SynFold <args>
+endif
+
+" ---------------------------------------------------------------------
+" Read the C syntax to start with {{{1
+" Read the C/C++ syntax to start with
+let s:Cpath= fnameescape(expand("<sfile>:p:h").(exists("g:yacc_uses_cpp")? "/cpp.vim" : "/c.vim"))
+if !filereadable(s:Cpath)
+ for s:Cpath in split(globpath(&rtp,(exists("g:yacc_uses_cpp")? "syntax/cpp.vim" : "syntax/c.vim")),"\n")
+ if filereadable(fnameescape(s:Cpath))
+ let s:Cpath= fnameescape(s:Cpath)
+ break
+ endif
+ endfor
+endif
+exe "syn include @yaccCode ".s:Cpath
+
+" ---------------------------------------------------------------------
+" Yacc Clusters: {{{1
+syn cluster yaccInitCluster contains=yaccKey,yaccKeyActn,yaccBrkt,yaccType,yaccString,yaccUnionStart,yaccHeader2,yaccComment,yaccDefines,yaccParseParam,yaccParseOption
+syn cluster yaccRulesCluster contains=yaccNonterminal,yaccString,yaccComment
+
+" ---------------------------------------------------------------------
+" Yacc Sections: {{{1
+SynFold syn region yaccInit start='.'ms=s-1,rs=s-1 matchgroup=yaccSectionSep end='^%%\ze\(\s*/[*/].*\)\=$'me=e-2,re=e-2 contains=@yaccInitCluster nextgroup=yaccRules skipwhite skipempty contained
+SynFold syn region yaccInit2 start='\%^.'ms=s-1,rs=s-1 matchgroup=yaccSectionSep end='^%%\ze\(\s*/[*/].*\)\=$'me=e-2,re=e-2 contains=@yaccInitCluster nextgroup=yaccRules skipwhite skipempty
+SynFold syn region yaccHeader2 matchgroup=yaccSep start="^\s*\zs%{" end="^\s*%}" contains=@yaccCode nextgroup=yaccInit skipwhite skipempty contained
+SynFold syn region yaccHeader matchgroup=yaccSep start="^\s*\zs%{" end="^\s*%}" contains=@yaccCode nextgroup=yaccInit skipwhite skipempty
+SynFold syn region yaccRules matchgroup=yaccSectionSep start='^%%\ze\(\s*/[*/].*\)\=$' end='^%%\ze\(\s*/[*/].*\)\=$'me=e-2,re=e-2 contains=@yaccRulesCluster nextgroup=yaccEndCode skipwhite skipempty contained
+SynFold syn region yaccEndCode matchgroup=yaccSectionSep start='^%%\ze\(\s*/[*/].*\)\=$' end='\%$' contains=@yaccCode contained
+
+" ---------------------------------------------------------------------
+" Yacc Commands: {{{1
+syn match yaccDefines '^%define\s\+.*$'
+syn match yaccParseParam '%\(parse\|lex\)-param\>' skipwhite nextgroup=yaccParseParamStr
+syn match yaccParseOption '%\%(api\.pure\|pure-parser\|locations\|error-verbose\)\>'
+syn region yaccParseParamStr contained matchgroup=Delimiter start='{' end='}' contains=cStructure
+
+syn match yaccDelim "[:|]" contained
+syn match yaccOper "@\d\+" contained
+
+syn match yaccKey "^\s*%\(token\|type\|left\|right\|start\|ident\|nonassoc\)\>" contained
+syn match yaccKey "\s%\(prec\|expect\)\>" contained
+syn match yaccKey "\$\(<[a-zA-Z_][a-zA-Z_0-9]*>\)\=[\$0-9]\+" contained
+syn keyword yaccKeyActn yyerrok yyclearin contained
+
+syn match yaccUnionStart "^%union" skipwhite skipnl nextgroup=yaccUnion contained
+SynFold syn region yaccUnion matchgroup=yaccCurly start="{" matchgroup=yaccCurly end="}" contains=@yaccCode contained
+syn match yaccBrkt "[<>]" contained
+syn match yaccType "<[a-zA-Z_][a-zA-Z0-9_]*>" contains=yaccBrkt contained
+
+SynFold syn region yaccNonterminal start="^\s*\a\w*\ze\_s*\(/\*\_.\{-}\*/\)\=\_s*:" matchgroup=yaccDelim end=";" matchgroup=yaccSectionSep end='^%%$'me=e-2,re=e-2 contains=yaccAction,yaccDelim,yaccString,yaccComment contained
+syn region yaccComment start="/\*" end="\*/"
+syn region yaccComment start="//" end="$"
+syn match yaccString "'[^']*'" contained
+
+
+" ---------------------------------------------------------------------
+" I'd really like to highlight just the outer {}. Any suggestions??? {{{1
+syn match yaccCurlyError "[{}]"
+SynFold syn region yaccAction matchgroup=yaccCurly start="{" end="}" contains=@yaccCode,yaccVar contained
+syn match yaccVar '\$\d\+\|\$\$\|\$<\I\i*>\$\|\$<\I\i*>\d\+' containedin=cParen,cPreProc,cMulti contained
+
+" ---------------------------------------------------------------------
+" Yacc synchronization: {{{1
+syn sync fromstart
+
+" ---------------------------------------------------------------------
+" Define the default highlighting. {{{1
+if !exists("skip_yacc_syn_inits")
+ hi def link yaccBrkt yaccStmt
+ hi def link yaccComment Comment
+ hi def link yaccCurly Delimiter
+ hi def link yaccCurlyError Error
+ hi def link yaccDefines cDefine
+ hi def link yaccDelim Delimiter
+ hi def link yaccKeyActn Special
+ hi def link yaccKey yaccStmt
+ hi def link yaccNonterminal Function
+ hi def link yaccOper yaccStmt
+ hi def link yaccParseOption cDefine
+ hi def link yaccParseParam yaccParseOption
+ hi def link yaccSectionSep Todo
+ hi def link yaccSep Delimiter
+ hi def link yaccStmt Statement
+ hi def link yaccString String
+ hi def link yaccType Type
+ hi def link yaccUnionStart yaccKey
+ hi def link yaccVar Special
+endif
+
+" ---------------------------------------------------------------------
+" Cleanup: {{{1
+delcommand SynFold
+let b:current_syntax = "yacc"
+
+" ---------------------------------------------------------------------
+" Modelines: {{{1
+" vim: ts=15 fdm=marker
diff --git a/runtime/syntax/yaml.vim b/runtime/syntax/yaml.vim
new file mode 100644
index 0000000..49f7d04
--- /dev/null
+++ b/runtime/syntax/yaml.vim
@@ -0,0 +1,243 @@
+" Vim syntax file
+" Language: YAML (YAML Ain't Markup Language) 1.2
+" Maintainer: Nikolai Pavlov <zyx.vim@gmail.com>
+" First author: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2015-03-28
+" removed duplicate yamlKeyValueDelimiter (pull #4799)
+
+if exists('b:current_syntax')
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Choose the schema to use
+" TODO: Validate schema
+if !exists('b:yaml_schema')
+ if exists('g:yaml_schema')
+ let b:yaml_schema = g:yaml_schema
+ else
+ let b:yaml_schema = 'core'
+ endif
+endif
+
+let s:ns_char = '\%([\n\r\uFEFF \t]\@!\p\)'
+let s:ns_word_char = '[[:alnum:]_\-]'
+let s:ns_uri_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$,.!~*''()[\]]\)'
+let s:ns_tag_char = '\%(%\x\x\|'.s:ns_word_char.'\|[#/;?:@&=+$.~*''()]\)'
+let s:c_ns_anchor_char = '\%([\n\r\uFEFF \t,[\]{}]\@!\p\)'
+let s:c_indicator = '[\-?:,[\]{}#&*!|>''"%@`]'
+let s:c_flow_indicator = '[,[\]{}]'
+
+let s:ns_char_without_c_indicator = substitute(s:ns_char, '\v\C[\zs', '\=s:c_indicator[1:-2]', '')
+
+let s:_collection = '[^\@!\(\%(\\\.\|\[^\\\]]\)\+\)]'
+let s:_neg_collection = '[^\(\%(\\\.\|\[^\\\]]\)\+\)]'
+function s:SimplifyToAssumeAllPrintable(p)
+ return substitute(a:p, '\V\C\\%('.s:_collection.'\\@!\\p\\)', '[^\1]', '')
+endfunction
+let s:ns_char = s:SimplifyToAssumeAllPrintable(s:ns_char)
+let s:ns_char_without_c_indicator = s:SimplifyToAssumeAllPrintable(s:ns_char_without_c_indicator)
+let s:c_ns_anchor_char = s:SimplifyToAssumeAllPrintable(s:c_ns_anchor_char)
+
+function s:SimplifyAdjacentCollections(p)
+ return substitute(a:p, '\V\C'.s:_collection.'\\|'.s:_collection, '[\1\2]', 'g')
+endfunction
+let s:ns_uri_char = s:SimplifyAdjacentCollections(s:ns_uri_char)
+let s:ns_tag_char = s:SimplifyAdjacentCollections(s:ns_tag_char)
+
+let s:c_verbatim_tag = '!<'.s:ns_uri_char.'\+>'
+let s:c_named_tag_handle = '!'.s:ns_word_char.'\+!'
+let s:c_secondary_tag_handle = '!!'
+let s:c_primary_tag_handle = '!'
+let s:c_tag_handle = '\%('.s:c_named_tag_handle.
+ \ '\|'.s:c_secondary_tag_handle.
+ \ '\|'.s:c_primary_tag_handle.'\)'
+let s:c_ns_shorthand_tag = s:c_tag_handle . s:ns_tag_char.'\+'
+let s:c_non_specific_tag = '!'
+let s:c_ns_tag_property = s:c_verbatim_tag.
+ \ '\|'.s:c_ns_shorthand_tag.
+ \ '\|'.s:c_non_specific_tag
+
+let s:c_ns_anchor_name = s:c_ns_anchor_char.'\+'
+let s:c_ns_anchor_property = '&'.s:c_ns_anchor_name
+let s:c_ns_alias_node = '\*'.s:c_ns_anchor_name
+
+let s:ns_directive_name = s:ns_char.'\+'
+
+let s:ns_local_tag_prefix = '!'.s:ns_uri_char.'*'
+let s:ns_global_tag_prefix = s:ns_tag_char.s:ns_uri_char.'*'
+let s:ns_tag_prefix = s:ns_local_tag_prefix.
+ \ '\|'.s:ns_global_tag_prefix
+
+let s:ns_plain_safe_out = s:ns_char
+let s:ns_plain_safe_in = '\%('.s:c_flow_indicator.'\@!'.s:ns_char.'\)'
+
+let s:ns_plain_safe_in = substitute(s:ns_plain_safe_in, '\V\C\\%('.s:_collection.'\\@!'.s:_neg_collection.'\\)', '[^\1\2]', '')
+let s:ns_plain_safe_in_without_colhash = substitute(s:ns_plain_safe_in, '\V\C'.s:_neg_collection, '[^\1:#]', '')
+let s:ns_plain_safe_out_without_colhash = substitute(s:ns_plain_safe_out, '\V\C'.s:_neg_collection, '[^\1:#]', '')
+
+let s:ns_plain_first_in = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_in.'\)\@=\)'
+let s:ns_plain_first_out = '\%('.s:ns_char_without_c_indicator.'\|[?:\-]\%('.s:ns_plain_safe_out.'\)\@=\)'
+
+let s:ns_plain_char_in = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_in.'\|'.s:ns_plain_safe_in_without_colhash.'\)'
+let s:ns_plain_char_out = '\%('.s:ns_char.'#\|:'.s:ns_plain_safe_out.'\|'.s:ns_plain_safe_out_without_colhash.'\)'
+
+let s:ns_plain_out = s:ns_plain_first_out . s:ns_plain_char_out.'*'
+let s:ns_plain_in = s:ns_plain_first_in . s:ns_plain_char_in.'*'
+
+
+syn keyword yamlTodo contained TODO FIXME XXX NOTE
+
+syn region yamlComment display oneline start='\%\(^\|\s\)#' end='$'
+ \ contains=yamlTodo
+
+execute 'syn region yamlDirective oneline start='.string('^\ze%'.s:ns_directive_name.'\s\+').' '.
+ \ 'end="$" '.
+ \ 'contains=yamlTAGDirective,'.
+ \ 'yamlYAMLDirective,'.
+ \ 'yamlReservedDirective '.
+ \ 'keepend'
+
+syn match yamlTAGDirective '%TAG\s\+' contained nextgroup=yamlTagHandle
+execute 'syn match yamlTagHandle contained nextgroup=yamlTagPrefix '.string(s:c_tag_handle.'\s\+')
+execute 'syn match yamlTagPrefix contained nextgroup=yamlComment ' . string(s:ns_tag_prefix)
+
+syn match yamlYAMLDirective '%YAML\s\+' contained nextgroup=yamlYAMLVersion
+syn match yamlYAMLVersion '\d\+\.\d\+' contained nextgroup=yamlComment
+
+execute 'syn match yamlReservedDirective contained nextgroup=yamlComment '.
+ \string('%\%(\%(TAG\|YAML\)\s\)\@!'.s:ns_directive_name)
+
+syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start='"' skip='\\"' end='"'
+ \ contains=yamlEscape
+ \ nextgroup=yamlKeyValueDelimiter
+syn region yamlFlowString matchgroup=yamlFlowStringDelimiter start="'" skip="''" end="'"
+ \ contains=yamlSingleEscape
+ \ nextgroup=yamlKeyValueDelimiter
+syn match yamlEscape contained '\\\%([\\"abefnrtv\^0_ NLP\n]\|x\x\x\|u\x\{4}\|U\x\{8}\)'
+syn match yamlSingleEscape contained "''"
+
+syn match yamlBlockScalarHeader contained '\s\+\zs[|>]\%([+-]\=[1-9]\|[1-9]\=[+-]\)\='
+
+syn cluster yamlConstant contains=yamlBool,yamlNull
+
+syn cluster yamlFlow contains=yamlFlowString,yamlFlowMapping,yamlFlowCollection
+syn cluster yamlFlow add=yamlFlowMappingKey,yamlFlowMappingMerge
+syn cluster yamlFlow add=@yamlConstant,yamlPlainScalar,yamlFloat
+syn cluster yamlFlow add=yamlTimestamp,yamlInteger,yamlMappingKeyStart
+syn cluster yamlFlow add=yamlComment
+syn region yamlFlowMapping matchgroup=yamlFlowIndicator start='{' end='}' contains=@yamlFlow
+syn region yamlFlowCollection matchgroup=yamlFlowIndicator start='\[' end='\]' contains=@yamlFlow
+
+execute 'syn match yamlPlainScalar /'.s:ns_plain_out.'/'
+execute 'syn match yamlPlainScalar contained /'.s:ns_plain_in.'/'
+
+syn match yamlMappingKeyStart '?\ze\s'
+syn match yamlMappingKeyStart '?' contained
+
+execute 'syn match yamlFlowMappingKey /\%#=1'.s:ns_plain_in.'\%(\s\+'.s:ns_plain_in.'\)*\ze\s*:/ contained '.
+ \'nextgroup=yamlKeyValueDelimiter'
+syn match yamlFlowMappingMerge /<<\ze\s*:/ contained nextgroup=yamlKeyValueDelimiter
+
+syn match yamlBlockCollectionItemStart '^\s*\zs-\%(\s\+-\)*\s' nextgroup=yamlBlockMappingKey,yamlBlockMappingMerge
+" Use the old regexp engine, the NFA engine doesn't like all the \@ items.
+execute 'syn match yamlBlockMappingKey /\%#=1^\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ '.
+ \'nextgroup=yamlKeyValueDelimiter'
+execute 'syn match yamlBlockMappingKey /\%#=1\s*\zs'.s:ns_plain_out.'\%(\s\+'.s:ns_plain_out.'\)*\ze\s*:\%(\s\|$\)/ contained '.
+ \'nextgroup=yamlKeyValueDelimiter'
+syn match yamlBlockMappingMerge /^\s*\zs<<\ze:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter
+syn match yamlBlockMappingMerge /<<\ze\s*:\%(\s\|$\)/ nextgroup=yamlKeyValueDelimiter contained
+
+syn match yamlKeyValueDelimiter /\s*:/ contained
+
+syn cluster yamlScalarWithSpecials contains=yamlPlainScalar,yamlBlockMappingKey,yamlFlowMappingKey
+
+let s:_bounder = s:SimplifyToAssumeAllPrintable('\%([[\]{}, \t]\@!\p\)')
+if b:yaml_schema is# 'json'
+ syn keyword yamlNull null contained containedin=@yamlScalarWithSpecials
+ syn keyword yamlBool true false
+ exe 'syn match yamlInteger /'.s:_bounder.'\@1<!\%(0\|-\=[1-9][0-9]*\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
+ exe 'syn match yamlFloat /'.s:_bounder.'\@1<!\%(-\=[1-9][0-9]*\%(\.[0-9]*\)\=\(e[-+]\=[0-9]\+\)\=\|0\|-\=\.inf\|\.nan\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
+elseif b:yaml_schema is# 'core'
+ syn keyword yamlNull null Null NULL contained containedin=@yamlScalarWithSpecials
+ syn keyword yamlBool true True TRUE false False FALSE contained containedin=@yamlScalarWithSpecials
+ exe 'syn match yamlNull /'.s:_bounder.'\@1<!\~'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
+ exe 'syn match yamlInteger /'.s:_bounder.'\@1<!\%([+-]\=\%(0\%(b[0-1_]\+\|[0-7_]\+\|x[0-9a-fA-F_]\+\)\=\|\%([1-9][0-9_]*\%(:[0-5]\=\d\)\+\)\)\|[1-9][0-9_]*\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
+ exe 'syn match yamlFloat /'.s:_bounder.'\@1<!\%([+-]\=\%(\%(\d[0-9_]*\)\.[0-9_]*\%([eE][+-]\=\d\+\)\=\|\.[0-9_]\+\%([eE][-+]\=[0-9]\+\)\=\|\d[0-9_]*\%(:[0-5]\=\d\)\+\.[0-9_]*\|\.\%(inf\|Inf\|INF\)\)\|\%(\.\%(nan\|NaN\|NAN\)\)\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
+elseif b:yaml_schema is# 'pyyaml'
+ syn keyword yamlNull null Null NULL contained containedin=@yamlScalarWithSpecials
+ syn keyword yamlBool true True TRUE false False FALSE yes Yes YES no No NO on On ON off Off OFF contained containedin=@yamlScalarWithSpecials
+ exe 'syn match yamlNull /'.s:_bounder.'\@1<!\~'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
+ exe 'syn match yamlFloat /'.s:_bounder.'\@1<!\%(\v[-+]?%(\d[0-9_]*)\.[0-9_]*%([eE][-+]\d+)?|\.[0-9_]+%([eE][-+]\d+)?|[-+]?\d[0-9_]*%(\:[0-5]?\d)+\.[0-9_]*|[-+]?\.%(inf|Inf|INF)|\.%(nan|NaN|NAN)\m\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
+ exe 'syn match yamlInteger /'.s:_bounder.'\@1<!\%(\v[-+]?0b[0-1_]+|[-+]?0[0-7_]+|[-+]?%(0|[1-9][0-9_]*)|[-+]?0x[0-9a-fA-F_]+|[-+]?[1-9][0-9_]*%(:[0-5]?\d)+\m\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
+ exe 'syn match yamlTimestamp /'.s:_bounder.'\@1<!\%(\v\d\d\d\d\-\d\d\-\d\d|\d\d\d\d \-\d\d? \-\d\d?%([Tt]|[ \t]+)\d\d?\:\d\d \:\d\d %(\.\d*)?%([ \t]*%(Z|[-+]\d\d?%(\:\d\d)?))?\m\)'.s:_bounder.'\@!/ contained containedin=@yamlScalarWithSpecials'
+elseif b:yaml_schema is# 'failsafe'
+ " Nothing
+endif
+unlet s:_bounder
+
+
+execute 'syn match yamlNodeTag '.string(s:c_ns_tag_property)
+execute 'syn match yamlAnchor '.string(s:c_ns_anchor_property)
+execute 'syn match yamlAlias '.string(s:c_ns_alias_node)
+
+syn match yamlDocumentStart '^---\ze\%(\s\|$\)'
+syn match yamlDocumentEnd '^\.\.\.\ze\%(\s\|$\)'
+
+hi def link yamlTodo Todo
+hi def link yamlComment Comment
+
+hi def link yamlDocumentStart PreProc
+hi def link yamlDocumentEnd PreProc
+
+hi def link yamlDirectiveName Keyword
+
+hi def link yamlTAGDirective yamlDirectiveName
+hi def link yamlTagHandle String
+hi def link yamlTagPrefix String
+
+hi def link yamlYAMLDirective yamlDirectiveName
+hi def link yamlReservedDirective Error
+hi def link yamlYAMLVersion Number
+
+hi def link yamlString String
+hi def link yamlFlowString yamlString
+hi def link yamlFlowStringDelimiter yamlString
+hi def link yamlEscape SpecialChar
+hi def link yamlSingleEscape SpecialChar
+
+hi def link yamlBlockCollectionItemStart Label
+hi def link yamlBlockMappingKey Identifier
+hi def link yamlBlockMappingMerge Special
+
+hi def link yamlFlowMappingKey Identifier
+hi def link yamlFlowMappingMerge Special
+
+hi def link yamlMappingKeyStart Special
+hi def link yamlFlowIndicator Special
+hi def link yamlKeyValueDelimiter Special
+
+hi def link yamlConstant Constant
+
+hi def link yamlNull yamlConstant
+hi def link yamlBool yamlConstant
+
+hi def link yamlAnchor Type
+hi def link yamlAlias Type
+hi def link yamlNodeTag Type
+
+hi def link yamlInteger Number
+hi def link yamlFloat Float
+hi def link yamlTimestamp Number
+
+let b:current_syntax = "yaml"
+
+unlet s:ns_word_char s:ns_uri_char s:c_verbatim_tag s:c_named_tag_handle s:c_secondary_tag_handle s:c_primary_tag_handle s:c_tag_handle s:ns_tag_char s:c_ns_shorthand_tag s:c_non_specific_tag s:c_ns_tag_property s:c_ns_anchor_char s:c_ns_anchor_name s:c_ns_anchor_property s:c_ns_alias_node s:ns_char s:ns_directive_name s:ns_local_tag_prefix s:ns_global_tag_prefix s:ns_tag_prefix s:c_indicator s:ns_plain_safe_out s:c_flow_indicator s:ns_plain_safe_in s:ns_plain_first_in s:ns_plain_first_out s:ns_plain_char_in s:ns_plain_char_out s:ns_plain_out s:ns_plain_in s:ns_char_without_c_indicator s:ns_plain_safe_in_without_colhash s:ns_plain_safe_out_without_colhash
+unlet s:_collection s:_neg_collection
+delfunction s:SimplifyAdjacentCollections
+delfunction s:SimplifyToAssumeAllPrintable
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/z8a.vim b/runtime/syntax/z8a.vim
new file mode 100644
index 0000000..6809eb9
--- /dev/null
+++ b/runtime/syntax/z8a.vim
@@ -0,0 +1,101 @@
+" Vim syntax file
+" Language: Z80 assembler asz80
+" Maintainer: Milan Pikula <www@fornax.elf.stuba.sk>
+" Last Change: 2003 May 11
+
+" quit when a syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syn case ignore
+
+" Common Z80 Assembly instructions
+syn keyword z8aInstruction adc add and bit ccf cp cpd cpdr cpi cpir cpl
+syn keyword z8aInstruction daa di djnz ei exx halt im in
+syn keyword z8aInstruction ind ini indr inir jp jr ld ldd lddr ldi ldir
+syn keyword z8aInstruction neg nop or otdr otir out outd outi
+syn keyword z8aInstruction res rl rla rlc rlca rld
+syn keyword z8aInstruction rr rra rrc rrca rrd sbc scf set sla sra
+syn keyword z8aInstruction srl sub xor
+" syn keyword z8aInstruction push pop call ret reti retn inc dec ex rst
+
+" Any other stuff
+syn match z8aIdentifier "[a-z_][a-z0-9_]*"
+
+" Instructions changing stack
+syn keyword z8aSpecInst push pop call ret reti retn rst
+syn match z8aInstruction "\<inc\>"
+syn match z8aInstruction "\<dec\>"
+syn match z8aInstruction "\<ex\>"
+syn match z8aSpecInst "\<inc\s\+sp\>"me=s+3
+syn match z8aSpecInst "\<dec\s\+sp\>"me=s+3
+syn match z8aSpecInst "\<ex\s\+(\s*sp\s*)\s*,\s*hl\>"me=s+2
+
+"Labels
+syn match z8aLabel "[a-z_][a-z0-9_]*:"
+syn match z8aSpecialLabel "[a-z_][a-z0-9_]*::"
+
+" PreProcessor commands
+syn match z8aPreProc "\.org"
+syn match z8aPreProc "\.globl"
+syn match z8aPreProc "\.db"
+syn match z8aPreProc "\.dw"
+syn match z8aPreProc "\.ds"
+syn match z8aPreProc "\.byte"
+syn match z8aPreProc "\.word"
+syn match z8aPreProc "\.blkb"
+syn match z8aPreProc "\.blkw"
+syn match z8aPreProc "\.ascii"
+syn match z8aPreProc "\.asciz"
+syn match z8aPreProc "\.module"
+syn match z8aPreProc "\.title"
+syn match z8aPreProc "\.sbttl"
+syn match z8aPreProc "\.even"
+syn match z8aPreProc "\.odd"
+syn match z8aPreProc "\.area"
+syn match z8aPreProc "\.page"
+syn match z8aPreProc "\.setdp"
+syn match z8aPreProc "\.radix"
+syn match z8aInclude "\.include"
+syn match z8aPreCondit "\.if"
+syn match z8aPreCondit "\.else"
+syn match z8aPreCondit "\.endif"
+
+" Common strings
+syn match z8aString "\".*\""
+syn match z8aString "\'.*\'"
+
+" Numbers
+syn match z8aNumber "[0-9]\+"
+syn match z8aNumber "0[xXhH][0-9a-fA-F]\+"
+syn match z8aNumber "0[bB][0-1]*"
+syn match z8aNumber "0[oO\@qQ][0-7]\+"
+syn match z8aNumber "0[dD][0-9]\+"
+
+" Character constant
+syn match z8aString "\#\'."hs=s+1
+
+" Comments
+syn match z8aComment ";.*"
+
+syn case match
+
+" Define the default highlighting.
+" 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/zig.vim b/runtime/syntax/zig.vim
new file mode 100644
index 0000000..e09b5e8
--- /dev/null
+++ b/runtime/syntax/zig.vim
@@ -0,0 +1,292 @@
+" Vim syntax file
+" Language: Zig
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+let s:zig_syntax_keywords = {
+ \ 'zigBoolean': ["true"
+ \ , "false"]
+ \ , 'zigNull': ["null"]
+ \ , 'zigType': ["bool"
+ \ , "f16"
+ \ , "f32"
+ \ , "f64"
+ \ , "f80"
+ \ , "f128"
+ \ , "void"
+ \ , "type"
+ \ , "anytype"
+ \ , "anyerror"
+ \ , "anyframe"
+ \ , "volatile"
+ \ , "linksection"
+ \ , "noreturn"
+ \ , "allowzero"
+ \ , "i0"
+ \ , "u0"
+ \ , "isize"
+ \ , "usize"
+ \ , "comptime_int"
+ \ , "comptime_float"
+ \ , "c_short"
+ \ , "c_ushort"
+ \ , "c_int"
+ \ , "c_uint"
+ \ , "c_long"
+ \ , "c_ulong"
+ \ , "c_longlong"
+ \ , "c_ulonglong"
+ \ , "c_longdouble"
+ \ , "anyopaque"]
+ \ , 'zigConstant': ["undefined"
+ \ , "unreachable"]
+ \ , 'zigConditional': ["if"
+ \ , "else"
+ \ , "switch"]
+ \ , 'zigRepeat': ["while"
+ \ , "for"]
+ \ , 'zigComparatorWord': ["and"
+ \ , "or"
+ \ , "orelse"]
+ \ , 'zigStructure': ["struct"
+ \ , "enum"
+ \ , "union"
+ \ , "error"
+ \ , "packed"
+ \ , "opaque"]
+ \ , 'zigException': ["error"]
+ \ , 'zigVarDecl': ["var"
+ \ , "const"
+ \ , "comptime"
+ \ , "threadlocal"]
+ \ , 'zigDummyVariable': ["_"]
+ \ , 'zigKeyword': ["fn"
+ \ , "try"
+ \ , "test"
+ \ , "pub"
+ \ , "usingnamespace"]
+ \ , 'zigExecution': ["return"
+ \ , "break"
+ \ , "continue"]
+ \ , 'zigMacro': ["defer"
+ \ , "errdefer"
+ \ , "async"
+ \ , "nosuspend"
+ \ , "await"
+ \ , "suspend"
+ \ , "resume"
+ \ , "export"
+ \ , "extern"]
+ \ , 'zigPreProc': ["catch"
+ \ , "inline"
+ \ , "noinline"
+ \ , "asm"
+ \ , "callconv"
+ \ , "noalias"]
+ \ , 'zigBuiltinFn': ["align"
+ \ , "@addWithOverflow"
+ \ , "@as"
+ \ , "@atomicLoad"
+ \ , "@atomicStore"
+ \ , "@bitCast"
+ \ , "@breakpoint"
+ \ , "@alignCast"
+ \ , "@alignOf"
+ \ , "@cDefine"
+ \ , "@cImport"
+ \ , "@cInclude"
+ \ , "@cUndef"
+ \ , "@clz"
+ \ , "@cmpxchgWeak"
+ \ , "@cmpxchgStrong"
+ \ , "@compileError"
+ \ , "@compileLog"
+ \ , "@ctz"
+ \ , "@popCount"
+ \ , "@divExact"
+ \ , "@divFloor"
+ \ , "@divTrunc"
+ \ , "@embedFile"
+ \ , "@export"
+ \ , "@extern"
+ \ , "@tagName"
+ \ , "@TagType"
+ \ , "@errorName"
+ \ , "@call"
+ \ , "@errorReturnTrace"
+ \ , "@fence"
+ \ , "@fieldParentPtr"
+ \ , "@field"
+ \ , "@unionInit"
+ \ , "@frameAddress"
+ \ , "@import"
+ \ , "@newStackCall"
+ \ , "@asyncCall"
+ \ , "@intToPtr"
+ \ , "@max"
+ \ , "@min"
+ \ , "@memcpy"
+ \ , "@memset"
+ \ , "@mod"
+ \ , "@mulAdd"
+ \ , "@mulWithOverflow"
+ \ , "@splat"
+ \ , "@src"
+ \ , "@bitOffsetOf"
+ \ , "@byteOffsetOf"
+ \ , "@offsetOf"
+ \ , "@OpaqueType"
+ \ , "@panic"
+ \ , "@prefetch"
+ \ , "@ptrCast"
+ \ , "@ptrToInt"
+ \ , "@rem"
+ \ , "@returnAddress"
+ \ , "@setCold"
+ \ , "@Type"
+ \ , "@shuffle"
+ \ , "@reduce"
+ \ , "@select"
+ \ , "@setRuntimeSafety"
+ \ , "@setEvalBranchQuota"
+ \ , "@setFloatMode"
+ \ , "@shlExact"
+ \ , "@This"
+ \ , "@hasDecl"
+ \ , "@hasField"
+ \ , "@shlWithOverflow"
+ \ , "@shrExact"
+ \ , "@sizeOf"
+ \ , "@bitSizeOf"
+ \ , "@sqrt"
+ \ , "@byteSwap"
+ \ , "@subWithOverflow"
+ \ , "@intCast"
+ \ , "@floatCast"
+ \ , "@intToFloat"
+ \ , "@floatToInt"
+ \ , "@boolToInt"
+ \ , "@errSetCast"
+ \ , "@truncate"
+ \ , "@typeInfo"
+ \ , "@typeName"
+ \ , "@TypeOf"
+ \ , "@atomicRmw"
+ \ , "@intToError"
+ \ , "@errorToInt"
+ \ , "@intToEnum"
+ \ , "@enumToInt"
+ \ , "@setAlignStack"
+ \ , "@frame"
+ \ , "@Frame"
+ \ , "@frameSize"
+ \ , "@bitReverse"
+ \ , "@Vector"
+ \ , "@sin"
+ \ , "@cos"
+ \ , "@tan"
+ \ , "@exp"
+ \ , "@exp2"
+ \ , "@log"
+ \ , "@log2"
+ \ , "@log10"
+ \ , "@fabs"
+ \ , "@floor"
+ \ , "@ceil"
+ \ , "@trunc"
+ \ , "@wasmMemorySize"
+ \ , "@wasmMemoryGrow"
+ \ , "@round"]
+ \ }
+
+function! s:syntax_keyword(dict)
+ for key in keys(a:dict)
+ execute 'syntax keyword' key join(a:dict[key], ' ')
+ endfor
+endfunction
+
+call s:syntax_keyword(s:zig_syntax_keywords)
+
+syntax match zigType "\v<[iu][1-9]\d*>"
+syntax match zigOperator display "\V\[-+/*=^&?|!><%~]"
+syntax match zigArrowCharacter display "\V->"
+
+" 12_34 (. but not ..)? (12_34)? (exponent 12_34)?
+syntax match zigDecNumber display "\v<\d%(_?\d)*%(\.\.@!)?%(\d%(_?\d)*)?%([eE][+-]?\d%(_?\d)*)?"
+syntax match zigHexNumber display "\v<0x\x%(_?\x)*%(\.\.@!)?%(\x%(_?\x)*)?%([pP][+-]?\d%(_?\d)*)?"
+syntax match zigOctNumber display "\v<0o\o%(_?\o)*"
+syntax match zigBinNumber display "\v<0b[01]%(_?[01])*"
+
+syntax match zigCharacterInvalid display contained /b\?'\zs[\n\r\t']\ze'/
+syntax match zigCharacterInvalidUnicode display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/
+syntax match zigCharacter /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=zigEscape,zigEscapeError,zigCharacterInvalid,zigCharacterInvalidUnicode
+syntax match zigCharacter /'\([^\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{6}\)\)'/ contains=zigEscape,zigEscapeUnicode,zigEscapeError,zigCharacterInvalid
+
+syntax region zigBlock start="{" end="}" transparent fold
+
+syntax region zigCommentLine start="//" end="$" contains=zigTodo,@Spell
+syntax region zigCommentLineDoc start="//[/!]/\@!" end="$" contains=zigTodo,@Spell
+
+syntax match zigMultilineStringPrefix /c\?\\\\/ contained containedin=zigMultilineString
+syntax region zigMultilineString matchgroup=zigMultilineStringDelimiter start="c\?\\\\" end="$" contains=zigMultilineStringPrefix display
+
+syntax keyword zigTodo contained TODO
+
+syntax region zigString matchgroup=zigStringDelimiter start=+c\?"+ skip=+\\\\\|\\"+ end=+"+ oneline contains=zigEscape,zigEscapeUnicode,zigEscapeError,@Spell
+syntax match zigEscapeError display contained /\\./
+syntax match zigEscape display contained /\\\([nrt\\'"]\|x\x\{2}\)/
+syntax match zigEscapeUnicode display contained /\\\(u\x\{4}\|U\x\{6}\)/
+
+highlight default link zigDecNumber zigNumber
+highlight default link zigHexNumber zigNumber
+highlight default link zigOctNumber zigNumber
+highlight default link zigBinNumber zigNumber
+
+highlight default link zigBuiltinFn Statement
+highlight default link zigKeyword Keyword
+highlight default link zigType Type
+highlight default link zigCommentLine Comment
+highlight default link zigCommentLineDoc Comment
+highlight default link zigDummyVariable Comment
+highlight default link zigTodo Todo
+highlight default link zigString String
+highlight default link zigStringDelimiter String
+highlight default link zigMultilineString String
+highlight default link zigMultilineStringContent String
+highlight default link zigMultilineStringPrefix String
+highlight default link zigMultilineStringDelimiter Delimiter
+highlight default link zigCharacterInvalid Error
+highlight default link zigCharacterInvalidUnicode zigCharacterInvalid
+highlight default link zigCharacter Character
+highlight default link zigEscape Special
+highlight default link zigEscapeUnicode zigEscape
+highlight default link zigEscapeError Error
+highlight default link zigBoolean Boolean
+highlight default link zigNull Boolean
+highlight default link zigConstant Constant
+highlight default link zigNumber Number
+highlight default link zigArrowCharacter zigOperator
+highlight default link zigOperator Operator
+highlight default link zigStructure Structure
+highlight default link zigExecution Special
+highlight default link zigMacro Macro
+highlight default link zigConditional Conditional
+highlight default link zigComparatorWord Keyword
+highlight default link zigRepeat Repeat
+highlight default link zigSpecial Special
+highlight default link zigVarDecl Function
+highlight default link zigPreProc PreProc
+highlight default link zigException Exception
+
+delfunction s:syntax_keyword
+
+let b:current_syntax = "zig"
+
+let &cpo = s:cpo_save
+unlet! s:cpo_save
diff --git a/runtime/syntax/zimbu.vim b/runtime/syntax/zimbu.vim
new file mode 100644
index 0000000..1a7a485
--- /dev/null
+++ b/runtime/syntax/zimbu.vim
@@ -0,0 +1,160 @@
+" Vim syntax file
+" Language: Zimbu
+" Maintainer: Bram Moolenaar
+" Last Change: 2014 Nov 23
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn include @Ccode syntax/c.vim
+
+syn keyword zimbuTodo TODO FIXME XXX contained
+syn match zimbuNoBar "|" contained
+syn match zimbuParam "|[^| ]\+|" contained contains=zimbuNoBar
+syn match zimbuNoBacktick "`" contained
+syn match zimbuCode "`[^`]\+`" contained contains=zimbuNoBacktick
+syn match zimbuComment "#.*$" contains=zimbuTodo,zimbuParam,zimbuCode,@Spell
+syn match zimbuComment "/\*.\{-}\*/" contains=zimbuTodo,zimbuParam,zimbuCode,@Spell
+
+syn match zimbuChar "'\\\=.'"
+
+syn keyword zimbuBasicType bool status
+syn keyword zimbuBasicType int1 int2 int3 int4 int5 int6 int7
+syn keyword zimbuBasicType int9 int10 int11 int12 int13 int14 int15
+syn keyword zimbuBasicType int int8 int16 int32 int64 bigInt
+syn keyword zimbuBasicType nat nat8 byte nat16 nat32 nat64 bigNat
+syn keyword zimbuBasicType nat1 nat2 nat3 nat4 nat5 nat6 nat7
+syn keyword zimbuBasicType nat9 nat10 nat11 nat12 nat13 nat14 nat15
+syn keyword zimbuBasicType float float32 float64 float80 float128
+syn keyword zimbuBasicType fixed1 fixed2 fixed3 fixed4 fixed5 fixed6
+syn keyword zimbuBasicType fixed7 fixed8 fixed9 fixed10 fixed11 fixed12
+syn keyword zimbuBasicType fixed13 fixed14 fixed15
+
+syn keyword zimbuCompType string varString
+syn keyword zimbuCompType byteString varByteString
+syn keyword zimbuCompType tuple array list dict dictList set callback
+syn keyword zimbuCompType sortedList multiDict multiDictList multiSet
+syn keyword zimbuCompType complex complex32 complex64 complex80 complex128
+syn keyword zimbuCompType proc func def thread evalThread lock cond pipe
+
+syn keyword zimbuType VAR dyn type USE GET
+syn match zimbuType "IO.File"
+syn match zimbuType "IO.Stat"
+
+syn keyword zimbuStatement IF ELSE ELSEIF IFNIL WHILE REPEAT FOR IN TO STEP
+syn keyword zimbuStatement DO UNTIL SWITCH WITH
+syn keyword zimbuStatement TRY CATCH FINALLY
+syn keyword zimbuStatement GENERATE_IF GENERATE_ELSE GENERATE_ELSEIF
+syn keyword zimbuStatement GENERATE_ERROR
+syn keyword zimbuStatement BUILD_IF BUILD_ELSE BUILD_ELSEIF
+syn keyword zimbuStatement CASE DEFAULT FINAL ABSTRACT VIRTUAL DEFINE REPLACE
+syn keyword zimbuStatement IMPLEMENTS EXTENDS PARENT LOCAL
+syn keyword zimbuStatement PART ALIAS TYPE CONNECT WRAP
+syn keyword zimbuStatement BREAK CONTINUE PROCEED
+syn keyword zimbuStatement RETURN EXIT THROW DEFER
+syn keyword zimbuStatement IMPORT AS OPTIONS MAIN
+syn keyword zimbuStatement INTERFACE PIECE INCLUDE MODULE ENUM BITS
+syn keyword zimbuStatement SHARED STATIC
+syn keyword zimbuStatement LAMBDA
+syn match zimbuStatement "\<\(FUNC\|PROC\|DEF\)\>"
+syn match zimbuStatement "\<CLASS\>"
+syn match zimbuStatement "}"
+
+syn match zimbuAttribute "@backtrace=no\>"
+syn match zimbuAttribute "@backtrace=yes\>"
+syn match zimbuAttribute "@abstract\>"
+syn match zimbuAttribute "@earlyInit\>"
+syn match zimbuAttribute "@default\>"
+syn match zimbuAttribute "@define\>"
+syn match zimbuAttribute "@replace\>"
+syn match zimbuAttribute "@final\>"
+syn match zimbuAttribute "@primitive\>"
+syn match zimbuAttribute "@notOnExit\>"
+
+syn match zimbuAttribute "@private\>"
+syn match zimbuAttribute "@protected\>"
+syn match zimbuAttribute "@public\>"
+syn match zimbuAttribute "@local\>"
+syn match zimbuAttribute "@file\>"
+syn match zimbuAttribute "@directory\>"
+syn match zimbuAttribute "@read=private\>"
+syn match zimbuAttribute "@read=protected\>"
+syn match zimbuAttribute "@read=public\>"
+syn match zimbuAttribute "@read=file\>"
+syn match zimbuAttribute "@read=directory\>"
+syn match zimbuAttribute "@items=private\>"
+syn match zimbuAttribute "@items=protected\>"
+syn match zimbuAttribute "@items=public\>"
+syn match zimbuAttribute "@items=file\>"
+syn match zimbuAttribute "@items=directory\>"
+
+syn keyword zimbuMethod NEW EQUAL COPY COMPARE SIZE GET SET INIT EARLYINIT
+
+syn keyword zimbuOperator IS ISNOT ISA ISNOTA
+
+syn keyword zimbuModule ARG CHECK E GC IO LOG PROTO SYS HTTP ZC ZWT T TIME THREAD
+
+syn match zimbuImport "\.\zsPROTO"
+syn match zimbuImport "\.\zsCHEADER"
+
+"syn match zimbuString +"\([^"\\]\|\\.\)*\("\|$\)+ contains=zimbuStringExpr
+syn region zimbuString start=+"+ skip=+[^"\\]\|\\.+ end=+"\|$+ contains=zimbuStringExpr
+syn match zimbuString +R"\([^"]\|""\)*\("\|$\)+
+syn region zimbuLongString start=+''"+ end=+"''+
+syn match zimbuStringExpr +\\([^)]*)+hs=s+2,he=e-1 contained contains=zimbuString,zimbuParenPairOuter
+syn region zimbuParenPairOuter start=+(+ms=s+1 end=+)+me=e-1 contained contains=zimbuString,zimbuParenPair
+syn region zimbuParenPair start=+(+ end=+)+ contained contains=zimbuString,zimbuParenPair
+
+syn keyword zimbuFixed TRUE FALSE NIL THIS THISTYPE FAIL OK
+syn keyword zimbuError NULL
+
+" trailing whitespace
+syn match zimbuSpaceError display excludenl "\S\s\+$"ms=s+1
+" mixed tabs and spaces
+syn match zimbuSpaceError display " \+\t"
+syn match zimbuSpaceError display "\t\+ "
+
+syn match zimbuUses contained "\<uses([a-zA-Z_ ,]*)"
+syn match zimbuBlockgc contained "blockgc"
+syn match zimbuBlockComment contained " #.*"
+
+syn region zimbuCregion matchgroup=zimbuCblock start="^>>>" end="^<<<.*" contains=@Ccode,zimbuUses,zimbuBlockgc,zimbuBlockComment keepend
+
+" Assume long strings and C regions don't take more than 200 lines.
+syn sync minlines=200
+
+" When we find the start of a long string, without a # or " before it, we are
+" sure to be inside a long string.
+syn sync match zimbuLongStringSync grouphere zimbuLongString +^[^"#]*''\"+
+
+hi def link zimbuBasicType Type
+hi def link zimbuCompType Type
+hi def link zimbuType Type
+hi def link zimbuStatement Statement
+hi def link zimbuOperator Statement
+hi def link zimbuMethod PreProc
+hi def link zimbuModule PreProc
+hi def link zimbuImport PreProc
+hi def link zimbuUses PreProc
+hi def link zimbuBlockgc PreProc
+hi def link zimbuAttribute PreProc
+hi def link zimbuString Constant
+hi def link zimbuLongString Special
+hi def link zimbuChar Constant
+hi def link zimbuFixed Constant
+hi def link zimbuComment Comment
+hi def link zimbuCommentStart zimbuComment
+hi def link zimbuBlockComment Comment
+hi def link zimbuCblock Comment
+hi def link zimbuTodo Todo
+hi def link zimbuParam Constant
+hi def link zimbuCode Statement
+hi def link zimbuNoBar Ignore
+hi def link zimbuNoBacktick Ignore
+hi def link zimbuSpaceError Error
+hi def link zimbuError Error
+
+let b:current_syntax = "zimbu"
+
+" vim: ts=8
diff --git a/runtime/syntax/zir.vim b/runtime/syntax/zir.vim
new file mode 100644
index 0000000..6553d32
--- /dev/null
+++ b/runtime/syntax/zir.vim
@@ -0,0 +1,49 @@
+" Vim syntax file
+" Language: Zir
+" Upstream: https://github.com/ziglang/zig.vim
+
+if exists("b:current_syntax")
+ finish
+endif
+let b:current_syntax = "zir"
+
+syn region zirCommentLine start=";" end="$" contains=zirTodo,@Spell
+
+syn region zirBlock start="{" end="}" transparent fold
+
+syn keyword zirKeyword primitive fntype int str as ptrtoint fieldptr deref asm unreachable export ref fn
+
+syn keyword zirTodo contained TODO
+
+syn region zirString start=+c\?"+ skip=+\\\\\|\\"+ end=+"+ oneline contains=zirEscape,zirEscapeUnicode,zirEscapeError,@Spell
+
+syn match zirEscapeError display contained /\\./
+syn match zirEscape display contained /\\\([nrt\\'"]\|x\x\{2}\)/
+syn match zirEscapeUnicode display contained /\\\(u\x\{4}\|U\x\{6}\)/
+
+syn match zirDecNumber display "\<[0-9]\+\%(.[0-9]\+\)\=\%([eE][+-]\?[0-9]\+\)\="
+syn match zirHexNumber display "\<0x[a-fA-F0-9]\+\%([a-fA-F0-9]\+\%([pP][+-]\?[0-9]\+\)\?\)\="
+syn match zirOctNumber display "\<0o[0-7]\+"
+syn match zirBinNumber display "\<0b[01]\+\%(.[01]\+\%([eE][+-]\?[0-9]\+\)\?\)\="
+
+syn match zirGlobal display "[^a-zA-Z0-9_]\?\zs@[a-zA-Z0-9_]\+"
+syn match zirLocal display "[^a-zA-Z0-9_]\?\zs%[a-zA-Z0-9_]\+"
+
+hi def link zirCommentLine Comment
+hi def link zirTodo Todo
+
+hi def link zirKeyword Keyword
+
+hi def link zirString Constant
+
+hi def link zirEscape Special
+hi def link zirEscapeUnicode zirEscape
+hi def link zirEscapeError Error
+
+hi def link zirDecNumber Constant
+hi def link zirHexNumber Constant
+hi def link zirOctNumber Constant
+hi def link zirBinNumber Constant
+
+hi def link zirGlobal Identifier
+hi def link zirLocal Identifier
diff --git a/runtime/syntax/zsh.vim b/runtime/syntax/zsh.vim
new file mode 100644
index 0000000..69671c5
--- /dev/null
+++ b/runtime/syntax/zsh.vim
@@ -0,0 +1,359 @@
+" Vim syntax file
+" Language: Zsh shell script
+" Maintainer: Christian Brabandt <cb@256bit.org>
+" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2022-07-26
+" License: Vim (see :h license)
+" Repository: https://github.com/chrisbra/vim-zsh
+
+if exists("b:current_syntax")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+function! s:ContainedGroup()
+ " needs 7.4.2008 for execute() function
+ let result='TOP'
+ " vim-pandoc syntax defines the @langname cluster for embedded syntax languages
+ " However, if no syntax is defined yet, `syn list @zsh` will return
+ " "No syntax items defined", so make sure the result is actually a valid syn cluster
+ for cluster in ['markdownHighlight_zsh', 'zsh']
+ try
+ " markdown syntax defines embedded clusters as @markdownhighlight_<lang>,
+ " pandoc just uses @<lang>, so check both for both clusters
+ let a=split(execute('syn list @'. cluster), "\n")
+ if len(a) == 2 && a[0] =~# '^---' && a[1] =~? cluster
+ return '@'. cluster
+ endif
+ catch /E392/
+ " ignore
+ endtry
+ endfor
+ return result
+endfunction
+
+let s:contained=s:ContainedGroup()
+
+syn iskeyword @,48-57,_,192-255,#,-
+if get(g:, 'zsh_fold_enable', 0)
+ setlocal foldmethod=syntax
+endif
+
+syn match zshQuoted '\\.'
+syn match zshPOSIXQuoted '\\[xX][0-9a-fA-F]\{1,2}'
+syn match zshPOSIXQuoted '\\[0-7]\{1,3}'
+syn match zshPOSIXQuoted '\\u[0-9a-fA-F]\{1,4}'
+syn match zshPOSIXQuoted '\\U[1-9a-fA-F]\{1,8}'
+
+syn region zshString matchgroup=zshStringDelimiter start=+"+ end=+"+
+ \ contains=zshQuoted,@zshDerefs,@zshSubstQuoted fold
+syn region zshString matchgroup=zshStringDelimiter start=+'+ end=+'+ fold
+syn region zshPOSIXString matchgroup=zshStringDelimiter start=+\$'+
+ \ skip=+\\[\\']+ end=+'+ contains=zshPOSIXQuoted,zshQuoted
+syn match zshJobSpec '%\(\d\+\|?\=\w\+\|[%+-]\)'
+
+syn match zshNumber '[+-]\=\<\d\+\>'
+syn match zshNumber '[+-]\=\<0x\x\+\>'
+syn match zshNumber '[+-]\=\<0\o\+\>'
+syn match zshNumber '[+-]\=\d\+#[-+]\=\w\+\>'
+syn match zshNumber '[+-]\=\d\+\.\d\+\>'
+
+syn keyword zshPrecommand noglob nocorrect exec command builtin - time
+
+syn keyword zshDelimiter do done end
+
+syn keyword zshConditional if then elif else fi esac select
+
+syn keyword zshCase case nextgroup=zshCaseWord skipwhite
+syn match zshCaseWord /\S\+/ nextgroup=zshCaseIn skipwhite contained transparent
+syn keyword zshCaseIn in nextgroup=zshCasePattern skipwhite skipnl contained
+syn match zshCasePattern /\S[^)]*)/ contained
+
+syn keyword zshRepeat while until repeat
+
+syn keyword zshRepeat for foreach nextgroup=zshVariable skipwhite
+
+syn keyword zshException always
+
+syn keyword zshKeyword function nextgroup=zshKSHFunction skipwhite
+
+syn match zshKSHFunction contained '\w\S\+'
+syn match zshFunction '^\s*\k\+\ze\s*()'
+
+syn match zshOperator '||\|&&\|;\|&!\='
+
+ " <<<, <, <>, and variants.
+syn match zshRedir '\d\=\(<<<\|<&\s*[0-9p-]\=\|<>\?\)'
+ " >, >>, and variants.
+syn match zshRedir '\d\=\(>&\s*[0-9p-]\=\|&>>\?\|>>\?&\?\)[|!]\='
+ " | and |&, but only if it's not preceeded or
+ " followed by a | to avoid matching ||.
+syn match zshRedir '|\@1<!|&\=|\@!'
+
+syn region zshHereDoc matchgroup=zshRedir
+ \ start='<\@<!<<\s*\z([^<]\S*\)'
+ \ end='^\z1\>'
+ \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
+syn region zshHereDoc matchgroup=zshRedir
+ \ start='<\@<!<<\s*\\\z(\S\+\)'
+ \ end='^\z1\>'
+ \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
+syn region zshHereDoc matchgroup=zshRedir
+ \ start='<\@<!<<-\s*\\\=\z(\S\+\)'
+ \ end='^\s*\z1\>'
+ \ contains=@zshSubst,@zshDerefs,zshQuoted,zshPOSIXString
+syn region zshHereDoc matchgroup=zshRedir
+ \ start=+<\@<!<<\s*\(["']\)\z(\S\+\)\1+
+ \ end='^\z1\>'
+syn region zshHereDoc matchgroup=zshRedir
+ \ start=+<\@<!<<-\s*\(["']\)\z(\S\+\)\1+
+ \ end='^\s*\z1\>'
+
+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+\?=\?'
+ \ contains=@zshSubst
+
+syn cluster zshDerefs contains=zshShortDeref,zshLongDeref,zshDeref,zshDollarVar
+
+syn match zshShortDeref '\$[!#$*@?_-]\w\@!'
+syn match zshShortDeref '\$[=^~]*[#+]*\d\+\>'
+
+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\)'
+
+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
+ \ chdir clone comparguments compcall compctl
+ \ compdescribe compfiles compgroups compquote
+ \ comptags comptry compvalues continue dirs
+ \ disable disown echo echotc echoti emulate
+ \ enable eval exec exit export false fc fg
+ \ functions getcap getln getopts hash history
+ \ jobs kill let limit log logout popd print
+ \ printf prompt pushd pushln pwd r read
+ \ rehash return sched set setcap shift
+ \ source stat suspend test times trap true
+ \ ttyctl type ulimit umask unalias unfunction
+ \ unhash unlimit unset vared wait
+ \ whence where which zcompile zformat zftp zle
+ \ zmodload zparseopts zprof zpty zrecompile
+ \ zregexparse zsocket zstyle ztcp
+
+" Options, generated by from the zsh source with the make-options.zsh script.
+syn case ignore
+syn match zshOptStart
+ \ /\v^\s*%(%(un)?setopt|set\s+[-+]o)/
+ \ nextgroup=zshOption skipwhite
+syn keyword zshOption nextgroup=zshOption,zshComment skipwhite contained
+ \ auto_cd no_auto_cd autocd noautocd auto_pushd no_auto_pushd autopushd noautopushd cdable_vars
+ \ no_cdable_vars cdablevars nocdablevars cd_silent no_cd_silent cdsilent nocdsilent chase_dots
+ \ no_chase_dots chasedots nochasedots chase_links no_chase_links chaselinks nochaselinks posix_cd
+ \ posixcd no_posix_cd noposixcd pushd_ignore_dups no_pushd_ignore_dups pushdignoredups
+ \ nopushdignoredups pushd_minus no_pushd_minus pushdminus nopushdminus pushd_silent no_pushd_silent
+ \ pushdsilent nopushdsilent pushd_to_home no_pushd_to_home pushdtohome nopushdtohome
+ \ always_last_prompt no_always_last_prompt alwayslastprompt noalwayslastprompt always_to_end
+ \ no_always_to_end alwaystoend noalwaystoend auto_list no_auto_list autolist noautolist auto_menu
+ \ no_auto_menu automenu noautomenu auto_name_dirs no_auto_name_dirs autonamedirs noautonamedirs
+ \ auto_param_keys no_auto_param_keys autoparamkeys noautoparamkeys auto_param_slash
+ \ no_auto_param_slash autoparamslash noautoparamslash auto_remove_slash no_auto_remove_slash
+ \ autoremoveslash noautoremoveslash bash_auto_list no_bash_auto_list bashautolist nobashautolist
+ \ complete_aliases no_complete_aliases completealiases nocompletealiases complete_in_word
+ \ no_complete_in_word completeinword nocompleteinword glob_complete no_glob_complete globcomplete
+ \ noglobcomplete hash_list_all no_hash_list_all hashlistall nohashlistall list_ambiguous
+ \ no_list_ambiguous listambiguous nolistambiguous list_beep no_list_beep listbeep nolistbeep
+ \ list_packed no_list_packed listpacked nolistpacked list_rows_first no_list_rows_first listrowsfirst
+ \ nolistrowsfirst list_types no_list_types listtypes nolisttypes menu_complete no_menu_complete
+ \ menucomplete nomenucomplete rec_exact no_rec_exact recexact norecexact bad_pattern no_bad_pattern
+ \ badpattern nobadpattern bare_glob_qual no_bare_glob_qual bareglobqual nobareglobqual brace_ccl
+ \ no_brace_ccl braceccl nobraceccl case_glob no_case_glob caseglob nocaseglob case_match
+ \ no_case_match casematch nocasematch case_paths no_case_paths casepaths nocasepaths csh_null_glob
+ \ no_csh_null_glob cshnullglob nocshnullglob equals no_equals noequals extended_glob no_extended_glob
+ \ extendedglob noextendedglob force_float no_force_float forcefloat noforcefloat glob no_glob noglob
+ \ glob_assign no_glob_assign globassign noglobassign glob_dots no_glob_dots globdots noglobdots
+ \ glob_star_short no_glob_star_short globstarshort noglobstarshort glob_subst no_glob_subst globsubst
+ \ noglobsubst hist_subst_pattern no_hist_subst_pattern histsubstpattern nohistsubstpattern
+ \ ignore_braces no_ignore_braces ignorebraces noignorebraces ignore_close_braces
+ \ no_ignore_close_braces ignoreclosebraces noignoreclosebraces ksh_glob no_ksh_glob kshglob nokshglob
+ \ magic_equal_subst no_magic_equal_subst magicequalsubst nomagicequalsubst mark_dirs no_mark_dirs
+ \ markdirs nomarkdirs multibyte no_multibyte nomultibyte nomatch no_nomatch nonomatch null_glob
+ \ no_null_glob nullglob nonullglob numeric_glob_sort no_numeric_glob_sort numericglobsort
+ \ nonumericglobsort rc_expand_param no_rc_expand_param rcexpandparam norcexpandparam rematch_pcre
+ \ no_rematch_pcre rematchpcre norematchpcre sh_glob no_sh_glob shglob noshglob unset no_unset nounset
+ \ warn_create_global no_warn_create_global warncreateglobal nowarncreateglobal warn_nested_var
+ \ no_warn_nested_var warnnestedvar no_warnnestedvar append_history no_append_history appendhistory
+ \ noappendhistory bang_hist no_bang_hist banghist nobanghist extended_history no_extended_history
+ \ extendedhistory noextendedhistory hist_allow_clobber no_hist_allow_clobber histallowclobber
+ \ nohistallowclobber hist_beep no_hist_beep histbeep nohistbeep hist_expire_dups_first
+ \ no_hist_expire_dups_first histexpiredupsfirst nohistexpiredupsfirst hist_fcntl_lock
+ \ no_hist_fcntl_lock histfcntllock nohistfcntllock hist_find_no_dups no_hist_find_no_dups
+ \ histfindnodups nohistfindnodups hist_ignore_all_dups no_hist_ignore_all_dups histignorealldups
+ \ nohistignorealldups hist_ignore_dups no_hist_ignore_dups histignoredups nohistignoredups
+ \ hist_ignore_space no_hist_ignore_space histignorespace nohistignorespace hist_lex_words
+ \ no_hist_lex_words histlexwords nohistlexwords hist_no_functions no_hist_no_functions
+ \ histnofunctions nohistnofunctions hist_no_store no_hist_no_store histnostore nohistnostore
+ \ hist_reduce_blanks no_hist_reduce_blanks histreduceblanks nohistreduceblanks hist_save_by_copy
+ \ no_hist_save_by_copy histsavebycopy nohistsavebycopy hist_save_no_dups no_hist_save_no_dups
+ \ histsavenodups nohistsavenodups hist_verify no_hist_verify histverify nohistverify
+ \ inc_append_history no_inc_append_history incappendhistory noincappendhistory
+ \ inc_append_history_time no_inc_append_history_time incappendhistorytime noincappendhistorytime
+ \ share_history no_share_history sharehistory nosharehistory all_export no_all_export allexport
+ \ noallexport global_export no_global_export globalexport noglobalexport global_rcs no_global_rcs
+ \ globalrcs noglobalrcs rcs no_rcs norcs aliases no_aliases noaliases clobber no_clobber noclobber
+ \ clobber_empty no_clobber_empty clobberempty noclobberempty correct no_correct nocorrect correct_all
+ \ no_correct_all correctall nocorrectall dvorak no_dvorak nodvorak flow_control no_flow_control
+ \ flowcontrol noflowcontrol ignore_eof no_ignore_eof ignoreeof noignoreeof interactive_comments
+ \ no_interactive_comments interactivecomments nointeractivecomments hash_cmds no_hash_cmds hashcmds
+ \ nohashcmds hash_dirs no_hash_dirs hashdirs nohashdirs hash_executables_only
+ \ no_hash_executables_only hashexecutablesonly nohashexecutablesonly mail_warning no_mail_warning
+ \ mailwarning nomailwarning path_dirs no_path_dirs pathdirs nopathdirs path_script no_path_script
+ \ pathscript nopathscript print_eight_bit no_print_eight_bit printeightbit noprinteightbit
+ \ print_exit_value no_print_exit_value printexitvalue noprintexitvalue rc_quotes no_rc_quotes
+ \ rcquotes norcquotes rm_star_silent no_rm_star_silent rmstarsilent normstarsilent rm_star_wait
+ \ no_rm_star_wait rmstarwait normstarwait short_loops no_short_loops shortloops noshortloops
+ \ short_repeat no_short_repeat shortrepeat noshortrepeat sun_keyboard_hack no_sun_keyboard_hack
+ \ sunkeyboardhack nosunkeyboardhack auto_continue no_auto_continue autocontinue noautocontinue
+ \ auto_resume no_auto_resume autoresume noautoresume bg_nice no_bg_nice bgnice nobgnice check_jobs
+ \ no_check_jobs checkjobs nocheckjobs check_running_jobs no_check_running_jobs checkrunningjobs
+ \ nocheckrunningjobs hup no_hup nohup long_list_jobs no_long_list_jobs longlistjobs nolonglistjobs
+ \ monitor no_monitor nomonitor notify no_notify nonotify posix_jobs posixjobs no_posix_jobs
+ \ noposixjobs prompt_bang no_prompt_bang promptbang nopromptbang prompt_cr no_prompt_cr promptcr
+ \ nopromptcr prompt_sp no_prompt_sp promptsp nopromptsp prompt_percent no_prompt_percent
+ \ promptpercent nopromptpercent prompt_subst no_prompt_subst promptsubst nopromptsubst
+ \ transient_rprompt no_transient_rprompt transientrprompt notransientrprompt alias_func_def
+ \ no_alias_func_def aliasfuncdef noaliasfuncdef c_bases no_c_bases cbases nocbases c_precedences
+ \ no_c_precedences cprecedences nocprecedences debug_before_cmd no_debug_before_cmd debugbeforecmd
+ \ nodebugbeforecmd err_exit no_err_exit errexit noerrexit err_return no_err_return errreturn
+ \ noerrreturn eval_lineno no_eval_lineno evallineno noevallineno exec no_exec noexec function_argzero
+ \ no_function_argzero functionargzero nofunctionargzero local_loops no_local_loops localloops
+ \ nolocalloops local_options no_local_options localoptions nolocaloptions local_patterns
+ \ no_local_patterns localpatterns nolocalpatterns local_traps no_local_traps localtraps nolocaltraps
+ \ multi_func_def no_multi_func_def multifuncdef nomultifuncdef multios no_multios nomultios
+ \ octal_zeroes no_octal_zeroes octalzeroes nooctalzeroes pipe_fail no_pipe_fail pipefail nopipefail
+ \ source_trace no_source_trace sourcetrace nosourcetrace typeset_silent no_typeset_silent
+ \ typesetsilent notypesetsilent typeset_to_unset no_typeset_to_unset typesettounset notypesettounset
+ \ verbose no_verbose noverbose xtrace no_xtrace noxtrace append_create no_append_create appendcreate
+ \ noappendcreate bash_rematch no_bash_rematch bashrematch nobashrematch bsd_echo no_bsd_echo bsdecho
+ \ nobsdecho continue_on_error no_continue_on_error continueonerror nocontinueonerror
+ \ csh_junkie_history no_csh_junkie_history cshjunkiehistory nocshjunkiehistory csh_junkie_loops
+ \ no_csh_junkie_loops cshjunkieloops nocshjunkieloops csh_junkie_quotes no_csh_junkie_quotes
+ \ cshjunkiequotes nocshjunkiequotes csh_nullcmd no_csh_nullcmd cshnullcmd nocshnullcmd ksh_arrays
+ \ no_ksh_arrays ksharrays noksharrays ksh_autoload no_ksh_autoload kshautoload nokshautoload
+ \ ksh_option_print no_ksh_option_print kshoptionprint nokshoptionprint ksh_typeset no_ksh_typeset
+ \ kshtypeset nokshtypeset ksh_zero_subscript no_ksh_zero_subscript kshzerosubscript
+ \ nokshzerosubscript posix_aliases no_posix_aliases posixaliases noposixaliases posix_argzero
+ \ no_posix_argzero posixargzero noposixargzero posix_builtins no_posix_builtins posixbuiltins
+ \ noposixbuiltins posix_identifiers no_posix_identifiers posixidentifiers noposixidentifiers
+ \ posix_strings no_posix_strings posixstrings noposixstrings posix_traps no_posix_traps posixtraps
+ \ noposixtraps sh_file_expansion no_sh_file_expansion shfileexpansion noshfileexpansion sh_nullcmd
+ \ no_sh_nullcmd shnullcmd noshnullcmd sh_option_letters no_sh_option_letters shoptionletters
+ \ noshoptionletters sh_word_split no_sh_word_split shwordsplit noshwordsplit traps_async
+ \ no_traps_async trapsasync notrapsasync interactive no_interactive nointeractive login no_login
+ \ nologin privileged no_privileged noprivileged restricted no_restricted norestricted shin_stdin
+ \ no_shin_stdin shinstdin noshinstdin single_command no_single_command singlecommand nosinglecommand
+ \ beep no_beep nobeep combining_chars no_combining_chars combiningchars nocombiningchars emacs
+ \ no_emacs noemacs overstrike no_overstrike nooverstrike single_line_zle no_single_line_zle
+ \ singlelinezle nosinglelinezle vi no_vi novi zle no_zle nozle brace_expand no_brace_expand
+ \ braceexpand nobraceexpand dot_glob no_dot_glob dotglob nodotglob hash_all no_hash_all hashall
+ \ nohashall hist_append no_hist_append histappend nohistappend hist_expand no_hist_expand histexpand
+ \ nohistexpand log no_log nolog mail_warn no_mail_warn mailwarn nomailwarn one_cmd no_one_cmd onecmd
+ \ noonecmd physical no_physical nophysical prompt_vars no_prompt_vars promptvars nopromptvars stdin
+ \ no_stdin nostdin track_all no_track_all trackall notrackall
+syn case match
+
+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-]\+'
+
+" TODO: $[...] is the same as $((...)), so add that as well.
+syn cluster zshSubst contains=zshSubst,zshOldSubst,zshMathSubst
+syn cluster zshSubstQuoted contains=zshSubstQuoted,zshOldSubst,zshMathSubst
+exe 'syn region zshSubst matchgroup=zshSubstDelim transparent start=/\$(/ skip=/\\)/ end=/)/ contains='.s:contained. ' fold'
+exe 'syn region zshSubstQuoted matchgroup=zshSubstDelim transparent start=/\$(/ skip=/\\)/ end=/)/ contains='.s:contained. ' fold'
+syn region zshSubstQuoted matchgroup=zshSubstDelim start='\${' skip='\\}' end='}' contains=@zshSubst,zshBrackets,zshQuoted fold
+syn region zshParentheses transparent start='(' skip='\\)' end=')' fold
+syn region zshGlob start='(#' end=')'
+syn region zshMathSubst matchgroup=zshSubstDelim transparent
+ \ start='\%(\$\?\)[<=>]\@<!((' skip='\\)' end='))'
+ \ contains=zshParentheses,@zshSubst,zshNumber,
+ \ @zshDerefs,zshString fold
+" The ms=s+1 prevents matching zshBrackets several times on opening brackets
+" (see https://github.com/chrisbra/vim-zsh/issues/21#issuecomment-576330348)
+syn region zshBrackets contained transparent start='{'ms=s+1 skip='\\}'
+ \ end='}' fold
+exe 'syn region zshBrackets transparent start=/{/ms=s+1 skip=/\\}/ end=/}/ contains='.s:contained. ' fold'
+
+syn region zshSubst matchgroup=zshSubstDelim start='\${' skip='\\}'
+ \ end='}' contains=@zshSubst,zshBrackets,zshQuoted,zshString fold
+exe 'syn region zshOldSubst matchgroup=zshSubstDelim start=/`/ skip=/\\[\\`]/ end=/`/ contains='.s:contained. ',zshOldSubst fold'
+
+syn sync minlines=50 maxlines=90
+syn sync match zshHereDocSync grouphere NONE '<<-\=\s*\%(\\\=\S\+\|\(["']\)\S\+\1\)'
+syn sync match zshHereDocEndSync groupthere NONE '^\s*EO\a\+\>'
+
+syn keyword zshTodo contained TODO FIXME XXX NOTE
+
+syn region zshComment oneline start='\%(^\|\s\+\)#' end='$'
+ \ contains=zshTodo,@Spell fold
+
+syn region zshComment start='^\s*#' end='^\%(\s*#\)\@!'
+ \ contains=zshTodo,@Spell fold
+
+syn match zshPreProc '^\%1l#\%(!\|compdef\|autoload\).*$'
+
+hi def link zshTodo Todo
+hi def link zshComment Comment
+hi def link zshPreProc PreProc
+hi def link zshQuoted SpecialChar
+hi def link zshPOSIXQuoted SpecialChar
+hi def link zshString String
+hi def link zshStringDelimiter zshString
+hi def link zshPOSIXString zshString
+hi def link zshJobSpec Special
+hi def link zshPrecommand Special
+hi def link zshDelimiter Keyword
+hi def link zshConditional Conditional
+hi def link zshCase zshConditional
+hi def link zshCaseIn zshCase
+hi def link zshException Exception
+hi def link zshRepeat Repeat
+hi def link zshKeyword Keyword
+hi def link zshFunction None
+hi def link zshKSHFunction zshFunction
+hi def link zshHereDoc String
+hi def link zshOperator None
+hi def link zshRedir Operator
+hi def link zshVariable None
+hi def link zshVariableDef zshVariable
+hi def link zshDereferencing PreProc
+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 zshOptStart Keyword
+hi def link zshOption Constant
+hi def link zshTypes Type
+hi def link zshSwitches Special
+hi def link zshNumber Number
+hi def link zshSubst PreProc
+hi def link zshSubstQuoted zshSubst
+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"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/termcap b/runtime/termcap
new file mode 100644
index 0000000..38790c4
--- /dev/null
+++ b/runtime/termcap
@@ -0,0 +1,135 @@
+#
+# Demonstration of a termcap file (for the Amiga and Archimedes)
+#
+# Maintainer: Bram Moolenaar <Bram@vim.org>
+# Last change: 1999 Feb 02
+#
+sx|ansi|any ansi terminal with pessimistic assumptions:\
+ :co#80:li#24:cl=50\E[;H\E[2J:bs:am:cm=\E[%i%d;%dH:\
+ :nd=\E[C:up=\E[A:ce=\E[K:ho=\E[H:pt:
+
+Mu|sun|Sun Microsystems Workstation console:\
+ :am:bs:km:mi:ms:pt:li#34:co#80:cl=^L:cm=\E[%i%d;%dH:\
+ :ce=\E[K:cd=\E[J:\
+ :so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:rs=\E[s:\
+ :md=\E[1m:mr=\E[7m:me=\E[m:\
+ :al=\E[L:dl=\E[M:im=:ei=:ic=\E[@:dc=\E[P:\
+ :AL=\E[%dL:DL=\E[%dM:IC=\E[%d@:DC=\E[%dP:\
+ :up=\E[A:nd=\E[C:ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:\
+ :k1=\E[224z:k2=\E[225z:k3=\E[226z:k4=\E[227z:k5=\E[228z:\
+ :k6=\E[229z:k7=\E[230z:k8=\E[231z:k9=\E[232z:
+
+M-|sun-e|sun-nic|sune|Sun Microsystems Workstation without insert character:\
+ :ic@:im@:ei@:tc=sun:
+Mu|sun-s|Sun Microsystems Workstation window with status line:\
+ :hs:ts=\E]l:fs=\E\\:ds=\E]l\E\\:tc=sun:
+Mu|sun-e-s|sun-s-e|Sun Microsystems Workstation with status hacked for emacs:\
+ :hs:ts=\E]l:fs=\E\\:ds=\E]l\E\\:tc=sun-e:
+M0|sun-48|Sun 48-line window:\
+ :li#48:co#80:tc=sun:
+M1|sun-34|Sun 34-line window:\
+ :li#34:co#80:tc=sun:
+M2|sun-24|Sun 24-line window:\
+ :li#24:co#80:tc=sun:
+M3|sun-17|Sun 17-line window:\
+ :li#17:co#80:tc=sun:
+
+v9|925a|tvi925a|TeleVideo Model 925:\
+ :al=\EE:am:bs:bt=\EI:bw:cd=\EY:ce=\ET:cl=^Z:cm=\E=%+ %+ :co#80:dc=\EW:\
+ :dl=\ER:do=^V:ei=:ic=\EQ:if=/usr/share/lib/tabset/std:im=:kb=^H:kd=^V:\
+ :kh=^^:kl=^H:kn#12:kr=^L:ku=^K:li#24:nd=^L:pt:se=\EG0:sg#1:so=\EG4:\
+ :ue=\EG0:ug#1:ul:up=^K:us=\EG8:is=\El\
+ :vb=\Eb\200\200\200\200\200\200\200\200\200\200\200\200\200\200\Ed:\
+ :ve=\E.4:vs=\E.2:
+
+d0|vt100|vt100-am|vt100am|dec vt100:\
+ :do=^J:co#80:li#24:cl=50\E[;H\E[2J:sf=5\ED:\
+ :le=^H:bs:am:cm=5\E[%i%d;%dH:nd=2\E[C:up=2\E[A:\
+ :ce=3\E[K:cd=50\E[J:so=2\E[7m:se=2\E[m:us=2\E[4m:ue=2\E[m:\
+ :md=2\E[1m:mr=2\E[7m:mb=2\E[5m:me=2\E[m:is=\E[1;24r\E[24;1H:\
+ :rf=/usr/share/lib/tabset/vt100:\
+ :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:ks=\E[?1h\E=:ke=\E[?1l\E>:\
+ :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=^H:\
+ :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:pt:sr=5\EM:vt#3:xn:\
+ :sc=\E7:rc=\E8:cs=\E[%i%d;%dr:
+
+# Amiga termcap by Bram Moolenaar
+AA|amiga|Amiga ANSI:\
+ :co#80:li#25:am:do=\E[B:ce=\E[K:cd=\E[J:\
+ :cl=\014:ku=\233A:kd=\233B:kl=\233D:kr=\233C:kb=^H:\
+ :#4=\233 A:%i=\233 @:%1=\233?~:\
+ :k1=\2330~:k2=\2331~:k3=\2332~:k4=\2333~:k5=\2334~:\
+ :k6=\2335~:k7=\2336~:k8=\2337~:k9=\2338~:k;=\2339~:\
+ :F1=\23310~:F2=\23311~:F3=\23312~:F4=\23313~:F5=\23314~:\
+ :F6=\23315~:F7=\23316~:F8=\23317~:F9=\23318~:FA=\23319~:\
+ :al=\E[L:AL=\E[%dL:dl=\E[M:DL=\E[%dM:le=^H:cm=\E[%i%d;%dH:\
+ :nd=\E[C:RI=\E[%dC:up=\E[A:\
+ :ce=\E[K:ho=\E[H:dc=\E[P:ic=\E[@:vi=\E[0 p:ve=\E[1 p:\
+ :so=\E[2m:se=\E[m:us=\E[4m:ue=\E[m:mr=\E[7m:mb=\E[7;2m:me=\E[m:
+
+# Acorn VDU
+# For non-green text, change the ^B in the :cl= line to
+# your favourite control code.
+a0|acorn0|Acorn VDU Driver Mode 0:\
+ :cl=^V\200^S^A^B\200\200\200:\
+ :is=^C^F^D^O^V\200^S^A^B\200\200\200:\
+ :tc=acorn_generic
+
+ag|acorn_generic|Acorn Generic VDU driver:\
+ :li#32:\
+ :co#80:\
+ :am:\
+ :bs:\
+ :bw:\
+ :bl=^G:\
+ :ce=^W^H^E^F\200\200\200\200\200\200:\
+ :cl=^L:\
+ :cm=^_%r%.%.:\
+ :ho=^^:\
+ :le=\010:\
+ :cr=\015:\
+ :me=^W^Q^E\200\200\200\200\200\200\200:\
+ :mr=^W^Q^E\200\200\200\200\200\200\200:\
+ :sb=^W^G^A^B\200\200\200\200\200\200:\
+ :se=^W^Q^E\200\200\200\200\200\200\200:\
+ :sf=^W^G^A^C\200\200\200\200\200\200:\
+ :so=^W^Q^E\200\200\200\200\200\200\200:\
+ :sr=^W^G^A^B\200\200\200\200\200\200:\
+ :up=^K:\
+ :vb=^R^C^G^Y^D\200\200\200\200^Ye\200^E\200^D^Ye\200\200\200\200:\
+ :vi=^W^A\200\200\200\200\200\200\200\200:\
+ :ve=^W^A^A\200\200\200\200\200\200\200:\
+ :ku=\317:\
+ :kd=\316:\
+ :kl=\314:\
+ :kr=\315:\
+ :kP=\337:\
+ :kN=\336:\
+ :kh=\036:\
+ :kH=\313:\
+ :su=\337:\
+ :sd=\336:\
+ :#4=\334:\
+ :%i=\335:\
+ :k1=\301:\
+ :k2=\302:\
+ :k3=\303:\
+ :k4=\304:\
+ :k5=\305:\
+ :k6=\306:\
+ :k7=\307:\
+ :k8=\310:\
+ :k9=\311:\
+ :F1=\321:\
+ :F2=\322:\
+ :F3=\323:\
+ :F4=\324:\
+ :F5=\325:\
+ :F6=\326:\
+ :F7=\327:\
+ :F8=\330:\
+ :F9=\331
+
+#
+# END OF TERMCAP
+#
diff --git a/runtime/tools.info b/runtime/tools.info
new file mode 100755
index 0000000..4d173b0
--- /dev/null
+++ b/runtime/tools.info
Binary files differ
diff --git a/runtime/tools/README.txt b/runtime/tools/README.txt
new file mode 100644
index 0000000..19976b3
--- /dev/null
+++ b/runtime/tools/README.txt
@@ -0,0 +1,37 @@
+Some tools that can be used with Vim:
+
+blink.c: C program to make the cursor blink in an xterm.
+
+ccfilter*: C program to filter the output of a few compilers to a common
+ QuickFix format.
+
+efm_filter.*: Perl script to filter compiler messages to QuickFix format.
+
+efm_perl.pl: Perl script to filter error messages from the Perl interpreter
+ for use with Vim quickfix mode.
+
+mve.* Awk script to filter error messages to QuickFix format.
+
+pltags.pl: Perl script to create a tags file from Perl scripts.
+
+ref: Shell script for the K command.
+
+shtags.*: Perl script to create a tags file from a shell script.
+
+vim132: Shell script to edit in 132 column mode on vt100 compatible
+ terminals.
+
+vimm: Shell script to start Vim on a DEC terminal with mouse
+ enabled.
+
+vimspell.*: Shell script for highlighting spelling mistakes.
+
+vim_vs_net.cmd: MS-Windows command file to use Vim with MS Visual Studio 7 and
+ later.
+
+xcmdsrv_client.c: Example for a client program that communicates with a Vim
+ server through the X-Windows interface.
+
+unicode.vim Vim script to generate tables for src/mbyte.c.
+
+[xxd can be found in the src directory]
diff --git a/runtime/tools/blink.c b/runtime/tools/blink.c
new file mode 100644
index 0000000..a782061
--- /dev/null
+++ b/runtime/tools/blink.c
@@ -0,0 +1,24 @@
+/*
+ * An extremely simple program to make the cursor blink in an xterm.
+ * This is useful when the cursor is hard to spot in a highlighted file.
+ * Start in the background: "blink&" Stop by killing it.
+ * Bram Moolenaar 980109 (based on an idea from John Lange).
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+ int
+main(void)
+{
+ while (1)
+ {
+ printf("\e[?25h");
+ fflush(stdout);
+ usleep(400000); /* on time */
+ printf("\e[?25l");
+ fflush(stdout);
+ usleep(250000); /* off time */
+ }
+ return 0;
+}
diff --git a/runtime/tools/ccfilter.1 b/runtime/tools/ccfilter.1
new file mode 100644
index 0000000..92fe624
--- /dev/null
+++ b/runtime/tools/ccfilter.1
@@ -0,0 +1,93 @@
+.TH ccfilter 1 "01-Apr-97"
+.SH NAME
+ccfilter \- a compiler's output filter for vim quickfix
+.SH SYNOPSIS
+ccfilter [
+.B <options>
+]
+.SH DESCRIPTION
+The ccfilter utility "filters" the output of several compilers
+and makers (make/gmake) from several platforms (see NOTES below)
+to a standardized format which easily fits in vim's quickfix
+feature. For further details, see in vim ":help quickfix".
+.PP
+ccfilter reads
+.B 'stdin'
+and outputs to
+.B 'stdout'
+\.
+.PP
+The need for ccfilter is clear, as some compilers have irregular
+and/or multiple line error messages (with the relevant information on
+line 2), which makes it impossible for the errorformat to correctly
+display them !
+
+When working on different platforms, and with different compilers,
+ccfilter eases the utilization of quickfix, due to its standardized
+output, allowing to have in .vimrc a plain
+.br
+.B \ \ \ \ :set\ errorformat=%f:%l:%c:%t:%m
+
+.SH USAGE
+When using ccfilter, one would include the following lines in .vimrc:
+.br
+.B \ \ \ \ :set shellpipe=\\\\|&ccfilter\\\\>
+.br
+.B \ \ \ \ :set errorformat=%f:%l:%c:%t:%m
+
+.SH OPTIONS
+.TP 16
+-c
+Decrement column by one. This may be needed, depending on
+the compiler being used.
+.TP
+-r
+Decrement row by one. This may be needed, depending on
+the compiler being used.
+.TP
+-v
+Verbose (Outputs also invalid lines).
+This option makes ccfilter output also the lines that
+couldn't be correctly parsed. This is used mostly for
+ccfilter debugging.
+.TP
+-o <COMPILER>
+Treat input as <COMPILER>'s output.
+Even when configuring ccfilter to assume a default
+COMPILER, sometimes it's helpful to be able to specify
+the COMPILER used to generate ccfilter's input.
+For example, when cross-compiling on a network from a
+single machine.
+.TP
+-h
+Shows a brief help, describing the configured default COMPILER
+and the valid parameters for COMPILER.
+
+.SH NOTES
+Currently, ccfilter accepts output from several compilers, as
+described below:
+.TP 10
+GCC
+GCC compiler
+.TP
+AIX
+AIX's C compiler
+.TP
+ATT
+AT&T/NCR's High Performance C Compiler
+.TP
+IRIX
+IRIX's MIPS/MIPSpro C compiler
+.TP
+SOLARIS
+SOLARIS's SparcWorks C compiler
+.TP
+HPUX
+HPUX's C compiler
+
+.SH AUTHOR
+.B ccfilter
+was developed by
+.B Pablo Ariel Kohan
+.BR
+.B mailto:pablo@memco.co.il
diff --git a/runtime/tools/ccfilter.c b/runtime/tools/ccfilter.c
new file mode 100644
index 0000000..43489f1
--- /dev/null
+++ b/runtime/tools/ccfilter.c
@@ -0,0 +1,328 @@
+/* ======================================================================= */
+/* Project : VIM */
+/* Module : ccfilter Version: 02.01.01 */
+/* File : ccfilter.c */
+/* Purpose : Filter gmake/cc output into a standardized form */
+/* ======================================================================= */
+/* Created On: 12-Sep-95 20:32 */
+/* Last modification: 03-Feb-98 */
+/* -e option added by Bernd Feige */
+/* ======================================================================= */
+/* Copyright : */
+/* This source file is copyright (c) to Pablo Ariel Kohan */
+/* ======================================================================= */
+#define __CCFILTER_C__
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LINELENGTH 2048
+
+/* Collector(s) */
+char Line[LINELENGTH];
+char Line2[LINELENGTH];
+/* Components */
+char FileName[1024];
+char BasePath[1024];
+char CWD[1024];
+unsigned long Row;
+unsigned long Col;
+char Severity;
+char Reason[LINELENGTH];
+
+#define COMPILER_UNKNOWN 0
+#define COMPILER_GCC 1
+#define COMPILER_AIX 2
+#define COMPILER_ATT 3
+#define COMPILER_IRIX 4
+#define COMPILER_SOLARIS 5
+#define COMPILER_HPUX 6
+
+char *COMPILER_Names[][2] =
+ {
+ /* Name Description */
+ { "N/A", "" },
+ { "GCC", "GCC compiler" },
+ { "AIX", "AIX's C compiler" },
+ { "ATT", "AT&T/NCR's High Performance C Compiler" },
+ { "IRIX", "IRIX's MIPS/MIPSpro C compiler" },
+ { "SOLARIS", "SOLARIS's SparcWorks C compiler" },
+ { "HPUX", "HPUX's C compiler" }
+ };
+#define COMPILER_QTY (sizeof(COMPILER_Names)/sizeof(COMPILER_Names[0]))
+
+#if defined(_GCC)
+# define COMPILER_DEFAULT COMPILER_GCC
+#elif defined(_AIX)
+# define COMPILER_DEFAULT COMPILER_AIX
+#elif defined(_ATT)
+# define COMPILER_DEFAULT COMPILER_ATT
+#elif defined(_IRIX)
+# define COMPILER_DEFAULT COMPILER_IRIX
+#elif defined(_SOLARIS)
+# define COMPILER_DEFAULT COMPILER_SOLARIS
+#elif defined(_HPUX)
+# define COMPILER_DEFAULT COMPILER_HPUX
+#else
+# define COMPILER_DEFAULT COMPILER_UNKNOWN
+#endif
+
+const char USAGE[] =
+"ccfilter v2.1 (c)1994-1997 by Pablo Ariel Kohan\n"
+"Filter Out compiler's output, and converts it to fit VIM\n\n"
+"Usage:\n"
+" ccfilter [<options>]\n"
+"Where: <options> is one or more of:\n"
+" -c Decrement column by one\n"
+" -r Decrement row by one\n"
+" -e Echo stdin to stderr\n"
+" -v Verbose (Outputs also invalid lines)\n"
+" -o <COMPILER> Treat input as <COMPILER>'s output\n"
+" Note: COMPILER may be preceded by an _\n"
+" -h This usage.\n";
+
+
+int ShowUsage( char *szError )
+{
+ int i;
+
+ fprintf( stderr, USAGE );
+
+ fprintf( stderr, "Current default <COMPILER>: %s\n",
+ COMPILER_Names[COMPILER_DEFAULT][0] );
+
+ fprintf( stderr, "Acceptable parameters for <COMPILER> are:\n" );
+ for (i=1; i < COMPILER_QTY; i++)
+ fprintf( stderr, " %-15.15s %s\n",
+ COMPILER_Names[i][0],
+ COMPILER_Names[i][1] );
+ fprintf(stderr, szError);
+ return 0;
+}
+
+char *echogets(char *s, int echo)
+{
+ char * const retval=fgets(s, LINELENGTH, stdin);
+ if (echo!=0 && retval!=NULL) {
+ fputs(retval, stderr);
+ }
+ return retval;
+}
+
+int main( int argc, char *argv[] )
+{ int rv, i, j, ok;
+ int stay;
+ int prefetch;
+ char *p;
+ int dec_col = 0; /* Decrement column value by 1 */
+ int dec_row = 0; /* Decrement row value by 1 */
+ int echo = 0; /* Echo stdin to stderr */
+ int verbose = 0; /* Include Bad Formatted Lines */
+ int CWDlen;
+ int COMPILER = COMPILER_DEFAULT;
+
+ getcwd( CWD, sizeof(CWD) );
+ CWDlen = strlen(CWD);
+
+ for (i=1; i<argc; i++)
+ {
+ if (argv[i][0] != '-')
+ return ShowUsage("");
+ switch ( argv[i][1] )
+ {
+ case 'c':
+ dec_col = 1;
+ break;
+ case 'r':
+ dec_row = 1;
+ break;
+ case 'e':
+ echo = 1;
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+ case 'o':
+ {
+ if (i+1 >= argc)
+ return ShowUsage("Error: Missing parameter for -o\n");
+ i++;
+ COMPILER = -1;
+ for (j=1; j<COMPILER_QTY; j++)
+ if ( (strcmp(argv[i], COMPILER_Names[j][0]) == 0) ||
+ ( (argv[i][0] == '_') &&
+ (strcmp(&argv[i][1], COMPILER_Names[j][0]) == 0) ) )
+ COMPILER = j;
+ if (COMPILER == -1)
+ return ShowUsage("Error: Invalid COMPILER specified\n");
+ }
+ break;
+ case 'h':
+ return ShowUsage("");
+ default:
+ return ShowUsage("Error: Invalid option\n");
+ }
+ }
+ if (COMPILER == 0)
+ return ShowUsage("Error: COMPILER must be specified in this system\n");
+
+ stay = ( echogets(Line, echo) != NULL );
+ prefetch = 0;
+
+ while( stay )
+ {
+ *FileName = 0;
+ Row = 0;
+ Col = 0;
+ Severity = ' ';
+ *Reason = 0;
+ ok = 0;
+ switch (COMPILER)
+ {
+ case COMPILER_GCC:
+ Severity = 'e';
+#ifdef GOTO_FROM_WHERE_INCLUDED
+ rv = sscanf( Line, "In file included from %[^:]:%lu:",
+ FileName, &Row );
+ if ( rv == 2 )
+ {
+ ok = (echogets(Reason, echo) != NULL);
+ }
+ else
+#endif
+ {
+ if ((rv = sscanf( Line, "%[^:]:%lu: warning: %[^\n]",
+ FileName, &Row, Reason ))==3) {
+ Severity = 'w';
+ } else {
+ rv = sscanf( Line, "%[^:]:%lu: %[^\n]",
+ FileName, &Row, Reason );
+ }
+ ok = ( rv == 3 );
+ }
+ Col = (dec_col ? 1 : 0 );
+ break;
+ case COMPILER_AIX:
+ rv = sscanf( Line, "\"%[^\"]\", line %lu.%lu: %*s (%c) %[^\n]",
+ FileName, &Row, &Col, &Severity, Reason );
+ ok = ( rv == 5 );
+ break;
+ case COMPILER_HPUX:
+ rv = sscanf( Line, "cc: \"%[^\"]\", line %lu: %c%*[^:]: %[^\n]",
+ FileName, &Row, &Severity, Reason );
+ ok = ( rv == 4 );
+ Col = (dec_col ? 1 : 0 );
+ break;
+ case COMPILER_SOLARIS:
+ rv = sscanf( Line, "\"%[^\"]\", line %lu: warning: %[^\n]",
+ FileName, &Row, Reason );
+ Severity = 'w';
+ ok = ( rv == 3 );
+ if ( rv != 3 )
+ {
+ rv = sscanf( Line, "\"%[^\"]\", line %lu: %[^\n]",
+ FileName, &Row, Reason );
+ Severity = 'e';
+ ok = ( rv == 3 );
+ }
+ Col = (dec_col ? 1 : 0 );
+ break;
+ case COMPILER_ATT:
+ rv = sscanf( Line, "%c \"%[^\"]\",L%lu/C%lu%*[^:]:%[^\n]",
+ &Severity, FileName, &Row, &Col, Reason );
+ ok = ( rv == 5 );
+
+ if (rv != 5)
+ { rv = sscanf( Line, "%c \"%[^\"]\",L%lu/C%lu: %[^\n]",
+ &Severity, FileName, &Row, &Col, Reason );
+ ok = ( rv == 5 );
+ }
+
+ if (rv != 5)
+ { rv = sscanf( Line, "%c \"%[^\"]\",L%lu: %[^\n]",
+ &Severity, FileName, &Row, Reason );
+ ok = ( rv == 4 );
+ Col = (dec_col ? 1 : 0 );
+ }
+
+ stay = (echogets(Line2, echo) != NULL);
+ while ( stay && (Line2[0] == '|') )
+ { for (p=&Line2[2]; (*p) && (isspace(*p)); p++);
+ strcat( Reason, ": " );
+ strcat( Reason, p );
+ Line2[0] = 0;
+ stay = (echogets(Line2, echo) != NULL);
+ }
+ prefetch = 1;
+ strcpy( Line, Line2 );
+ break;
+ case COMPILER_IRIX:
+ Col = 1;
+ prefetch = 0;
+ rv = 0;
+ ok = 0;
+ if ( !strncmp(Line, "cfe: ", 5) )
+ { p = &Line[5];
+ Severity = tolower(*p);
+ p = strchr( &Line[5], ':' );
+ if (p == NULL)
+ { ok = 0;
+ }
+ else
+ {
+ rv = sscanf( p+2, "%[^:]: %lu: %[^\n]",
+ FileName, &Row, Reason );
+ if (rv != 3)
+ rv = sscanf( p+2, "%[^,], line %lu: %[^\n]",
+ FileName, &Row, Reason );
+ ok = ( rv == 3 );
+ }
+
+ if (ok)
+ { prefetch = 1;
+ stay = (echogets(Line, echo) != NULL);
+ if (Line[0] == ' ')
+ stay = (echogets(Line2, echo) != NULL);
+ if ( (Line2[0] == ' ') &&
+ ( (Line2[1] == '-') || (Line2[1] == '^') ) )
+ { Col = strlen(Line2)-1;
+ prefetch = 0;
+ }
+ else
+ { strcat( Line, "\n" );
+ strcat( Line, Line2 );
+ }
+ }
+ }
+ break;
+ }
+ if (dec_col) Col--;
+ if (dec_row) Row--;
+ if (!ok)
+ {
+ if ( Line[0] == 'g' )
+ p = &Line[1];
+ else
+ p = &Line[0];
+ ok = sscanf( p, "make[%*d]: Entering directory `%[^']",
+ BasePath );
+ if (verbose)
+ printf( "[%u]?%s\n", (unsigned)ok, Line );
+ }
+ else
+ {
+ for (p=Reason; (*p) && (isspace(*p)); p++);
+ if ( BasePath[CWDlen] == 0 )
+ printf( "%s:%lu:%lu:%c:%s\n", FileName, Row, Col, Severity, p );
+ else
+ {
+ printf( "%s/%s:%lu:%lu:%c:%s\n", &BasePath[CWDlen+1], FileName, Row, Col, Severity, p );
+ }
+ }
+ if (!prefetch)
+ stay = ( echogets(Line, echo) != NULL );
+ }
+ return 0;
+}
diff --git a/runtime/tools/ccfilter_README.txt b/runtime/tools/ccfilter_README.txt
new file mode 100644
index 0000000..ea989f2
--- /dev/null
+++ b/runtime/tools/ccfilter_README.txt
@@ -0,0 +1,101 @@
+READ THIS FIRST
+===============
+
+ccfilter is a C program to filter the output of a few compilers to a common
+QuickFix format. It is provided with Vim to make quickfix useful for more
+compilers.
+
+ccfilter WILL FAIL with long lines (more than 2047 bytes).
+
+
+COMPILING AND INSTALLING:
+=========================
+
+To compile ccfilter, you can just do a plain:
+ cc ccfilter.c -o ccfilter
+Though, it may be wise to have your default compiler defined,
+so you would normally compile it with one of the following:
+ cc -D_GCC ccfilter.c -o ccfilter
+ cc -D_AIX ccfilter.c -o ccfilter
+ cc -D_ATT ccfilter.c -o ccfilter
+ cc -D_IRIX ccfilter.c -o ccfilter
+ cc -D_SOLARIS ccfilter.c -o ccfilter
+ cc -D_HPUX ccfilter.c -o ccfilter
+You can then copy ccfilter to its target destination (i.e: /usr/local/bin).
+The man page ccfilter.1 has to be copied to somewhere in your MANPATH,
+under a man1 directory (i.e: /usr/local/man/man1).
+
+
+SUPPORTED COMPILERS/PORTING NOTES:
+==================================
+
+The supported formats for the different compilers are described below:
+In this section, meta-names are used as place-holders in the line
+formats: <FILE> <ROW> <COL> <SEVERITY> <REASON> <>
+The <> denotes ignored text.
+Line formats are delimited by the ^ (caret) symbol.
+
+0) Special case: "gmake directory change" lines:
+ Lines with a format like:
+ ^gmake[<NUM>]: Entering directory `<DIR>'^
+ are used to follow the directory changes during the make process,
+ providing in the <FILE> part, a relative (if possible) directory
+ path to the erroneous file.
+
+
+1) GCC:
+ Recognized lines are of the format:
+ - ^In file included from <FILE>:<ROW>:^
+ Line following this one is used as <REASON>
+ <SEVERITY> is always 'e' (error)
+ <COL> is always '0'
+
+ - ^<FILE>:<ROW>:<REASON>^
+ <SEVERITY> is always 'e' (error)
+ <COL> is always '0'
+
+
+2) AIX:
+ Recognized lines are of the format:
+ - ^"<FILE>", line <ROW>.<COL>: <> (<SEVERITY>) <REASON>",
+
+
+3) HPUX:
+ Recognized lines are of the format:
+ - ^cc: "<FILE>", line <ROW>: <SEVERITY>: <REASON>^
+ <COL> is always '0'
+
+
+4) SOLARIS:
+ Recognized lines are of the format:
+ - ^"<FILE>", line <ROW>: warning: <REASON>^
+ This assumes <SEVERITY> is "W"
+ <COL> is always '0'
+
+ - ^"<FILE>", line <ROW>: <REASON>^
+ This assumes <SEVERITY> is "E"
+ <COL> is always '0'
+
+
+5) ATT / NCR:
+ Recognized lines are of the format:
+ - ^<SEVERITY> "<FILE>",L<ROW>/C<COL><>:<REASON>^
+ or
+ - ^<SEVERITY> "<FILE>",L<ROW>/C<COL>:<REASON>^
+ Following lines beginning with a pipe (|) are continuation
+ lines, and are therefore appended to the <REASON>
+
+ - ^<SEVERITY> "<FILE>",L<ROW>:<REASON>^
+ <COL> is '0'
+ Following lines beginning with a pipe (|) are continuation
+ lines, and are therefore appended to the <REASON>
+
+
+6) SGI-IRIX:
+ Recognized lines are of the format:
+ - ^cfe: <SEVERITY>: <FILE>: <ROW>: <REASON>^
+ or
+ ^cfe: <SEVERITY>: <FILE>, line <ROW>: <REASON>^
+ Following lines beginning with a dash (-) are "column-bar"
+ that end with a caret in the column of the error. These lines
+ are analyzed to generate the <COL>.
diff --git a/runtime/tools/demoserver.py b/runtime/tools/demoserver.py
new file mode 100644
index 0000000..2667aed
--- /dev/null
+++ b/runtime/tools/demoserver.py
@@ -0,0 +1,107 @@
+#!/usr/bin/python
+#
+# Server that will accept connections from a Vim channel.
+# Run this server and then in Vim you can open the channel:
+# :let handle = ch_open('localhost:8765')
+#
+# Then Vim can send requests to the server:
+# :let response = ch_sendexpr(handle, 'hello!')
+#
+# And you can control Vim by typing a JSON message here, e.g.:
+# ["ex","echo 'hi there'"]
+#
+# There is no prompt, just type a line and press Enter.
+# To exit cleanly type "quit<Enter>".
+#
+# See ":help channel-demo" in Vim.
+#
+# This requires Python 2.6 or later.
+
+from __future__ import print_function
+import json
+import socket
+import sys
+import threading
+
+try:
+ # Python 3
+ import socketserver
+except ImportError:
+ # Python 2
+ import SocketServer as socketserver
+
+thesocket = None
+
+class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
+
+ def handle(self):
+ print("=== socket opened ===")
+ global thesocket
+ thesocket = self.request
+ while True:
+ try:
+ data = self.request.recv(4096).decode('utf-8')
+ except socket.error:
+ print("=== socket error ===")
+ break
+ if data == '':
+ print("=== socket closed ===")
+ break
+ print("received: {0}".format(data))
+ try:
+ decoded = json.loads(data)
+ except ValueError:
+ print("json decoding failed")
+ decoded = [-1, '']
+
+ # Send a response if the sequence number is positive.
+ # Negative numbers are used for "eval" responses.
+ if decoded[0] >= 0:
+ if decoded[1] == 'hello!':
+ response = "got it"
+ id = decoded[0]
+ elif decoded[1] == 'hello channel!':
+ response = "got that"
+ # response is not to a specific message callback but to the
+ # channel callback, need to use ID zero
+ id = 0
+ else:
+ response = "what?"
+ id = decoded[0]
+ encoded = json.dumps([id, response])
+ print("sending {0}".format(encoded))
+ self.request.sendall(encoded.encode('utf-8'))
+ thesocket = None
+
+class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
+ pass
+
+if __name__ == "__main__":
+ HOST, PORT = "localhost", 8765
+
+ server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
+ ip, port = server.server_address
+
+ # Start a thread with the server -- that thread will then start one
+ # more thread for each request
+ server_thread = threading.Thread(target=server.serve_forever)
+
+ # Exit the server thread when the main thread terminates
+ server_thread.daemon = True
+ server_thread.start()
+ print("Server loop running in thread: ", server_thread.name)
+
+ print("Listening on port {0}".format(PORT))
+ while True:
+ typed = sys.stdin.readline()
+ if "quit" in typed:
+ print("Goodbye!")
+ break
+ if thesocket is None:
+ print("No socket yet")
+ else:
+ print("sending {0}".format(typed))
+ thesocket.sendall(typed.encode('utf-8'))
+
+ server.shutdown()
+ server.server_close()
diff --git a/runtime/tools/efm_filter.pl b/runtime/tools/efm_filter.pl
new file mode 100755
index 0000000..1d1a4f3
--- /dev/null
+++ b/runtime/tools/efm_filter.pl
@@ -0,0 +1,39 @@
+#!/usr/bin/env perl
+#
+# This program works as a filter that reads from stdin, copies to
+# stdout *and* creates an error file that can be read by vim.
+#
+# This program has only been tested on SGI, Irix5.3.
+#
+# Written by Ives Aerts in 1996. This little program is not guaranteed
+# to do (or not do) anything at all and can be freely used for
+# whatever purpose you can think of.
+
+$args = @ARGV;
+
+unless ($args == 1) {
+ die("Usage: vimccparse <output filename>\n");
+}
+
+$filename = @ARGV[0];
+open (OUT, ">$filename") || die ("Can't open file: \"$filename\"");
+
+while (<STDIN>) {
+ print;
+ if ( (/"(.*)", line (\d+): (e)rror\((\d+)\):/)
+ || (/"(.*)", line (\d+): (w)arning\((\d+)\):/) ) {
+ $file=$1;
+ $line=$2;
+ $errortype="\u$3";
+ $errornr=$4;
+ chop($errormsg=<STDIN>);
+ $errormsg =~ s/^\s*//;
+ $sourceline=<STDIN>;
+ $column=index(<STDIN>, "^") - 1;
+
+ print OUT "$file>$line:$column:$errortype:$errornr:$errormsg\n";
+ }
+}
+
+close(OUT);
+exit(0);
diff --git a/runtime/tools/efm_filter.txt b/runtime/tools/efm_filter.txt
new file mode 100644
index 0000000..d3f97f4
--- /dev/null
+++ b/runtime/tools/efm_filter.txt
@@ -0,0 +1,31 @@
+[adopted from a message that Ives posted in the Vim mailing list]
+
+Some compilers produce an error message that cannot be handled with
+'errorformat' in Vim. Following is an example of a Perl script that
+translates one error message into something that Vim understands.
+
+
+The compiler that generates this kind of error messages (4 lines):
+
+"/tmp_mnt/cm/src/apertos/MoU/MetaCore/MetaCore/common/src/MetaCoreImp_M.cc",
+line 50: error(3114):
+ identifier "PRIMITIVE_M" is undefined
+ return(ExecuteCore(PRIMITIVE_M,
+
+You can find a small perl program at the end.
+The way I use it is:
+
+:set errorformat=%f>%l:%c:%t:%n:%m
+:set makeprg=clearmake\ -C\ gnu
+:set shellpipe=2>&1\|\ vimccparse
+
+If somebody thinks this is useful: feel free to do whatever you can think
+of with this code.
+
+-Ives
+____________________________________________________________
+Ives Aerts (SW Developer) Sony Telecom Europe
+ives@sonytel.be St.Stevens Woluwestr. 55
+`Death could create most things, B-1130 Brussels, Belgium
+ except for plumbing.' PHONE : +32 2 724 19 67
+ (Soul Music - T.Pratchett) FAX : +32 2 726 26 86
diff --git a/runtime/tools/efm_perl.pl b/runtime/tools/efm_perl.pl
new file mode 100755
index 0000000..1aab2d4
--- /dev/null
+++ b/runtime/tools/efm_perl.pl
@@ -0,0 +1,153 @@
+#!/usr/bin/perl -w
+
+# vimparse.pl - Reformats the error messages of the Perl interpreter for use
+# with the quickfix mode of Vim
+#
+# Copyright (c) 2001 by Joerg Ziefle <joerg.ziefle@gmx.de>
+# You may use and distribute this software under the same terms as Perl itself.
+#
+# Usage: put one of the two configurations below in your ~/.vimrc (without the
+# description and '# ') and enjoy (be sure to adjust the paths to vimparse.pl
+# before):
+#
+# Program is run interactively with 'perl -w':
+#
+# set makeprg=$HOME/bin/vimparse.pl\ %\ $*
+# set errorformat=%f:%l:%m
+#
+# Program is only compiled with 'perl -wc':
+#
+# set makeprg=$HOME/bin/vimparse.pl\ -c\ %\ $*
+# set errorformat=%f:%l:%m
+#
+# Usage:
+# vimparse.pl [-c] [-f <errorfile>] <programfile> [programargs]
+#
+# -c compile only, don't run (perl -wc)
+# -f write errors to <errorfile>
+#
+# Example usages:
+# * From the command line:
+# vimparse.pl program.pl
+#
+# vimparse.pl -c -f errorfile program.pl
+# Then run vim -q errorfile to edit the errors with Vim.
+#
+# * From Vim:
+# Edit in Vim (and save, if you don't have autowrite on), then
+# type ':mak' or ':mak args' (args being the program arguments)
+# to error check.
+#
+# Version history:
+# 0.2 (04/12/2001):
+# * First public version (sent to Bram)
+# * -c command line option for compiling only
+# * grammatical fix: 'There was 1 error.'
+# * bug fix for multiple arguments
+# * more error checks
+# * documentation (top of file, &usage)
+# * minor code clean ups
+# 0.1 (02/02/2001):
+# * Initial version
+# * Basic functionality
+#
+# Todo:
+# * test on more systems
+# * use portable way to determine the location of perl ('use Config')
+# * include option that shows perldiag messages for each error
+# * allow to pass in program by STDIN
+# * more intuitive behaviour if no error is found (show message)
+#
+# Tested under SunOS 5.7 with Perl 5.6.0. Let me know if it's not working for
+# you.
+
+use strict;
+use Getopt::Std;
+
+use vars qw/$opt_c $opt_f $opt_h/; # needed for Getopt in combination with use strict 'vars'
+
+use constant VERSION => 0.2;
+
+getopts('cf:h');
+
+&usage if $opt_h; # not necessarily needed, but good for further extension
+
+if (defined $opt_f) {
+
+ open FILE, "> $opt_f" or do {
+ warn "Couldn't open $opt_f: $!. Using STDOUT instead.\n";
+ undef $opt_f;
+ };
+
+};
+
+my $handle = (defined $opt_f ? \*FILE : \*STDOUT);
+
+(my $file = shift) or &usage; # display usage if no filename is supplied
+my $args = (@ARGV ? ' ' . join ' ', @ARGV : '');
+
+my @lines = `perl @{[defined $opt_c ? '-c ' : '' ]} -w "$file$args" 2>&1`;
+
+my $errors = 0;
+foreach my $line (@lines) {
+
+ chomp($line);
+ my ($file, $lineno, $message, $rest);
+
+ if ($line =~ /^(.*)\sat\s(.*)\sline\s(\d+)(\.|,\snear\s\".*\")$/) {
+
+ ($message, $file, $lineno, $rest) = ($1, $2, $3, $4);
+ $errors++;
+ $message .= $rest if ($rest =~ s/^,//);
+ print $handle "$file:$lineno:$message\n";
+
+ } else { next };
+
+}
+
+if (defined $opt_f) {
+
+ my $msg;
+ if ($errors == 1) {
+
+ $msg = "There was 1 error.\n";
+
+ } else {
+
+ $msg = "There were $errors errors.\n";
+
+ };
+
+ print STDOUT $msg;
+ close FILE;
+ unlink $opt_f unless $errors;
+
+};
+
+sub usage {
+
+ (local $0 = $0) =~ s/^.*\/([^\/]+)$/$1/; # remove path from name of program
+ print<<EOT;
+Usage:
+ $0 [-c] [-f <errorfile>] <programfile> [programargs]
+
+ -c compile only, don't run (executes 'perl -wc')
+ -f write errors to <errorfile>
+
+Examples:
+ * At the command line:
+ $0 program.pl
+ Displays output on STDOUT.
+
+ $0 -c -f errorfile program.pl
+ Then run 'vim -q errorfile' to edit the errors with Vim.
+
+ * In Vim:
+ Edit in Vim (and save, if you don't have autowrite on), then
+ type ':mak' or ':mak args' (args being the program arguments)
+ to error check.
+EOT
+
+ exit 0;
+
+};
diff --git a/runtime/tools/emoji_list.vim b/runtime/tools/emoji_list.vim
new file mode 100644
index 0000000..d361b7e
--- /dev/null
+++ b/runtime/tools/emoji_list.vim
@@ -0,0 +1,23 @@
+" Script to fill the window with emoji characters, one per line.
+" Source this script: :source %
+
+if &modified
+ new
+else
+ enew
+endif
+
+" Use a compiled Vim9 function for speed
+def DoIt()
+ var lnum = 1
+ for c in range(0x100, 0x1ffff)
+ var cs = nr2char(c)
+ if charclass(cs) == 3
+ setline(lnum, '|' .. cs .. '| ' .. strwidth(cs))
+ lnum += 1
+ endif
+ endfor
+enddef
+
+call DoIt()
+set nomodified
diff --git a/runtime/tools/mve.awk b/runtime/tools/mve.awk
new file mode 100755
index 0000000..396f806
--- /dev/null
+++ b/runtime/tools/mve.awk
@@ -0,0 +1,23 @@
+#!/usr/bin/nawk -f
+#
+# Change "nawk" to "awk" or "gawk" if you get errors.
+#
+# Make Vim Errors
+# Processes errors from cc for use by Vim's quick fix tools
+# specifically it translates the ---------^ notation to a
+# column number
+#
+BEGIN { FS="[:,]" }
+
+/^cfe/ { file=$3
+ msg=$5
+ split($4,s," ")
+ line=s[2]
+}
+
+# You may have to substitute a tab character for the \t here:
+/^[\t-]*\^/ {
+ p=match($0, ".*\\^" )
+ col=RLENGTH-2
+ printf("%s, line %d, col %d : %s\n", file,line,col,msg)
+}
diff --git a/runtime/tools/mve.txt b/runtime/tools/mve.txt
new file mode 100644
index 0000000..8aa5cf6
--- /dev/null
+++ b/runtime/tools/mve.txt
@@ -0,0 +1,20 @@
+[ The mve awk script was posted on the vimdev mailing list ]
+
+From: jimmer@barney.mdhc.mdc.com (J. McGlasson)
+Date: Mon, 31 Mar 1997 13:16:49 -0700 (Mar)
+
+My compiler (SGI MIPSpro C compiler - IRIX 6.4) works like this.
+I have written a script mve (make vim errors), through which I pipe my make
+output, which translates output of the following form:
+
+cfe: Error: syntax.c, line 4: Syntax Error
+ int i[12;
+ ------------^
+
+into:
+
+ cl.c, line 4, col 12 : Syntax Error
+
+(in vim notation: %f, line %l, col %c : %m)
+
+You might be able to tailor this for your compiler's output.
diff --git a/runtime/tools/pltags.pl b/runtime/tools/pltags.pl
new file mode 100755
index 0000000..7a74682
--- /dev/null
+++ b/runtime/tools/pltags.pl
@@ -0,0 +1,300 @@
+#!/usr/bin/env perl
+
+# pltags - create a tags file for Perl code, for use by vi(m)
+#
+# Distributed with Vim <http://www.vim.org/>, latest version always available
+# at <http://www.mscha.com/mscha.html?pltags#tools>
+#
+# Version 2.3, 28 February 2002
+#
+# Written by Michael Schaap <pltags@mscha.com>. Suggestions for improvement
+# are very welcome!
+#
+# This script will not work with Perl 4 or below!
+#
+# Revision history:
+# 1.0 1997? Original version, quickly hacked together
+# 2.0 1999? Completely rewritten, better structured and documented,
+# support for variables, packages, Exuberant Ctags extensions
+# 2.1 Jun 2000 Fixed critical bug (typo in comment) ;-)
+# Support multiple level packages (e.g. Archive::Zip::Member)
+# 2.2 Jul 2001 'Glob' wildcards - especially useful under Windows
+# (thanks to Serge Sivkov and Jason King)
+# Bug fix: reset package name for each file
+# 2.21 Jul 2001 Oops... bug in variable detection (/local../ -> /^local.../)
+# 2.3 Feb 2002 Support variables declared with "our"
+# (thanks to Lutz Mende)
+
+# Complain about undeclared variables
+use strict;
+
+# Used modules
+use Getopt::Long;
+
+# Options with their defaults
+my $do_subs = 1; # --subs, --nosubs include subs in tags file?
+my $do_vars = 1; # --vars, --novars include variables in tags file?
+my $do_pkgs = 1; # --pkgs, --nopkgs include packages in tags file?
+my $do_exts = 1; # --extensions, --noextensions
+ # include Exuberant Ctags extensions
+
+# Global variables
+my $VERSION = "2.21"; # pltags version
+my $status = 0; # GetOptions return value
+my $file = ""; # File being processed
+my @tags = (); # List of produced tags
+my $is_pkg = 0; # Are we tagging a package?
+my $has_subs = 0; # Has this file any subs yet?
+my $package_name = ""; # Name of current package
+my $var_continues = 0; # Variable declaration continues on last line
+my $line = ""; # Current line in file
+my $stmt = ""; # Current Perl statement
+my @vars = (); # List of variables in declaration
+my $var = ""; # Variable in declaration
+my $tagline = ""; # Tag file line
+
+# Create a tag file line and push it on the list of found tags
+sub MakeTag($$$$$)
+{
+ my ($tag, # Tag name
+ $type, # Type of tag
+ $is_static, # Is this a static tag?
+ $file, # File in which tag appears
+ $line) = @_; # Line in which tag appears
+
+ my $tagline = ""; # Created tag line
+
+ # Only process tag if not empty
+ if ($tag)
+ {
+ # Get rid of \n, and escape / and \ in line
+ chomp $line;
+ $line =~ s/\\/\\\\/g;
+ $line =~ s/\//\\\//g;
+
+ # Create a tag line
+ $tagline = "$tag\t$file\t/^$line\$/";
+
+ # If we're told to do so, add extensions
+ if ($do_exts)
+ {
+ $tagline .= ";\"\t$type"
+ . ($is_static ? "\tfile:" : "")
+ . ($package_name ? "\tclass:$package_name" : "");
+ }
+
+ # Push it on the stack
+ push (@tags, $tagline);
+ }
+}
+
+# Parse package name from statement
+sub PackageName($)
+{
+ my ($stmt) = @_; # Statement
+
+ # Look for the argument to "package". Return it if found, else return ""
+ if ($stmt =~ /^package\s+([\w:]+)/)
+ {
+ my $pkgname = $1;
+
+ # Remove any parent package name(s)
+ $pkgname =~ s/.*://;
+ return $pkgname;
+ }
+ else
+ {
+ return "";
+ }
+}
+
+# Parse sub name from statement
+sub SubName($)
+{
+ my ($stmt) = @_; # Statement
+
+ # Look for the argument to "sub". Return it if found, else return ""
+ if ($stmt =~ /^sub\s+([\w:]+)/)
+ {
+ my $subname = $1;
+
+ # Remove any parent package name(s)
+ $subname =~ s/.*://;
+ return $subname;
+ }
+ else
+ {
+ return "";
+ }
+}
+
+# Parse all variable names from statement
+sub VarNames($)
+{
+ my ($stmt) = @_;
+
+ # Remove my or local from statement, if present
+ $stmt =~ s/^(my|our|local)\s+//;
+
+ # Remove any assignment piece
+ $stmt =~ s/\s*=.*//;
+
+ # Now find all variable names, i.e. "words" preceded by $, @ or %
+ @vars = ($stmt =~ /[\$\@\%]([\w:]+)\b/g);
+
+ # Remove any parent package name(s)
+ map(s/.*://, @vars);
+
+ return (@vars);
+}
+
+############### Start ###############
+
+print "\npltags $VERSION by Michael Schaap <mscha\@mscha.com>\n\n";
+
+# Get options
+$status = GetOptions("subs!" => \$do_subs,
+ "vars!" => \$do_vars,
+ "pkgs!" => \$do_pkgs,
+ "extensions!" => \$do_exts);
+
+# Usage if error in options or no arguments given
+unless ($status && @ARGV)
+{
+ print "\n" unless ($status);
+ print " Usage: $0 [options] filename ...\n\n";
+ print " Where options can be:\n";
+ print " --subs (--nosubs) (don't) include sub declarations in tag file\n";
+ print " --vars (--novars) (don't) include variable declarations in tag file\n";
+ print " --pkgs (--nopkgs) (don't) include package declarations in tag file\n";
+ print " --extensions (--noextensions)\n";
+ print " (don't) include Exuberant Ctags / Vim style\n";
+ print " extensions in tag file\n\n";
+ print " Default options: ";
+ print ($do_subs ? "--subs " : "--nosubs ");
+ print ($do_vars ? "--vars " : "--novars ");
+ print ($do_pkgs ? "--pkgs " : "--nopkgs ");
+ print ($do_exts ? "--extensions\n\n" : "--noextensions\n\n");
+ print " Example: $0 *.pl *.pm ../shared/*.pm\n\n";
+ exit;
+}
+
+# Loop through files on command line - 'glob' any wildcards, since Windows
+# doesn't do this for us
+foreach $file (map { glob } @ARGV)
+{
+ # Skip if this is not a file we can open. Also skip tags files and backup
+ # files
+ next unless ((-f $file) && (-r $file) && ($file !~ /tags$/)
+ && ($file !~ /~$/));
+
+ print "Tagging file $file...\n";
+
+ $is_pkg = 0;
+ $package_name = "";
+ $has_subs = 0;
+ $var_continues = 0;
+
+ open (IN, $file) or die "Can't open file '$file': $!";
+
+ # Loop through file
+ foreach $line (<IN>)
+ {
+ # Statement is line with comments and whitespace trimmed
+ ($stmt = $line) =~ s/#.*//;
+ $stmt =~ s/^\s*//;
+ $stmt =~ s/\s*$//;
+
+ # Nothing left? Never mind.
+ next unless ($stmt);
+
+ # This is a variable declaration if one was started on the previous
+ # line, or if this line starts with my or local
+ if ($var_continues or ($stmt =~/^my\b/)
+ or ($stmt =~/^our\b/) or ($stmt =~/^local\b/))
+ {
+ # The declaration continues if the line does not end with ;
+ $var_continues = ($stmt !~ /;$/);
+
+ # Loop through all variable names in the declaration
+ foreach $var (VarNames($stmt))
+ {
+ # Make a tag for this variable unless we're told not to. We
+ # assume that a variable is always static, unless it appears
+ # in a package before any sub. (Not necessarily true, but
+ # it's ok for most purposes and Vim works fine even if it is
+ # incorrect)
+ if ($do_vars)
+ {
+ MakeTag($var, "v", (!$is_pkg or $has_subs), $file, $line);
+ }
+ }
+ }
+
+ # This is a package declaration if the line starts with package
+ elsif ($stmt =~/^package\b/)
+ {
+ # Get name of the package
+ $package_name = PackageName($stmt);
+
+ if ($package_name)
+ {
+ # Remember that we're doing a package
+ $is_pkg = 1;
+
+ # Make a tag for this package unless we're told not to. A
+ # package is never static.
+ if ($do_pkgs)
+ {
+ MakeTag($package_name, "p", 0, $file, $line);
+ }
+ }
+ }
+
+ # This is a sub declaration if the line starts with sub
+ elsif ($stmt =~/^sub\b/)
+ {
+ # Remember that this file has subs
+ $has_subs = 1;
+
+ # Make a tag for this sub unless we're told not to. We assume
+ # that a sub is static, unless it appears in a package. (Not
+ # necessarily true, but it's ok for most purposes and Vim works
+ # fine even if it is incorrect)
+ if ($do_subs)
+ {
+ MakeTag(SubName($stmt), "s", (!$is_pkg), $file, $line);
+ }
+ }
+ }
+ close (IN);
+}
+
+# Do we have any tags? If so, write them to the tags file
+if (@tags)
+{
+ # Add some tag file extensions if we're told to
+ if ($do_exts)
+ {
+ push (@tags, "!_TAG_FILE_FORMAT\t2\t/extended format/");
+ push (@tags, "!_TAG_FILE_SORTED\t1\t/0=unsorted, 1=sorted/");
+ push (@tags, "!_TAG_PROGRAM_AUTHOR\tMichael Schaap\t/mscha\@mscha.com/");
+ push (@tags, "!_TAG_PROGRAM_NAME\tpltags\t//");
+ push (@tags, "!_TAG_PROGRAM_VERSION\t$VERSION\t/supports multiple tags and extended format/");
+ }
+
+ print "\nWriting tags file.\n";
+
+ open (OUT, ">tags") or die "Can't open tags file: $!";
+
+ foreach $tagline (sort @tags)
+ {
+ print OUT "$tagline\n";
+ }
+
+ close (OUT);
+}
+else
+{
+ print "\nNo tags found.\n";
+}
diff --git a/runtime/tools/ref b/runtime/tools/ref
new file mode 100755
index 0000000..77bfc80
--- /dev/null
+++ b/runtime/tools/ref
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# ref - Check spelling of the arguments
+#
+# Usage: ref word ..
+#
+# can be used for the K command of Vim
+#
+spell <<EOF
+$*
+EOF
diff --git a/runtime/tools/shtags.1 b/runtime/tools/shtags.1
new file mode 100644
index 0000000..0a13802
--- /dev/null
+++ b/runtime/tools/shtags.1
@@ -0,0 +1,61 @@
+.TH shtags 1 "local Utilities"
+.SH NAME
+shtags \- Create tags for shell scripts
+.SH SYNOPSIS
+.B shtags
+[\fI-mvw\fP] [\fI-t <file>\fP] [\fI-s <shell>\fP] <files>
+.SH DESCRIPTION
+\fBshtags\fP creates a \fBvi(1)\fP tags file for shell scripts - which
+essentially turns your code into a hypertext document. \fBshtags\fP
+attempts to create tags for all function and variable definitions,
+although this is a little difficult, because in most shell languages,
+variables don't need to be explicitly defined, and as such there is
+often no distinct "variable definition". If this is the case,
+\fBshtags\fP simply creates a tag for the first instance of a variable
+which is being set in a simple way, ie: \fIset x = 5\fP.
+.SH OPTIONS
+.IP "\fB-t <file>\fP"
+Name of tags file to create. (default is 'tags')
+.IP "\fB-s <shell>\fP"
+The name of the shell used by the script(s). By default,
+\fBshtags\fP tries to work out which is the appropriate shell for each
+file individually by looking at the first line of each file. This won't
+work however, if the script starts as a bourne shell script and tries
+to be clever about starting the shell it really wants.
+.b
+Currently supported shells are:
+.RS
+.IP \fBsh\fP
+Bourne Shell
+.IP \fBperl\fP
+Perl (versions 4 and 5)
+.IP \fBksh\fP
+Korn Shell
+.IP \fBtclsh\fP
+The TCL shell
+.IP \fBwish\fP
+The TK Windowing shell (same as tclsh)
+.RE
+
+.IP \fB-v\fP
+Include variable definitions (variables mentioned at the start of a line)
+.IP \fB-V\fP
+Print version information.
+.IP \fB-w\fP
+Suppress "duplicate tag" warning messages.
+.IP \fB-x\fP
+Explicitly create a new tags file. Normally new tags are merged with
+the old tags file.
+.PP
+\fBshtags\fP scans the specified files for subroutines and possibly
+variable definitions, and creates a \fBvi\fP style tags file.
+.SH FILES
+.IP \fBtags\fP
+A tags file contains a sorted list of tags, one tag per line. The
+format is the same as that used by \fBvi\fP(1)
+.SH AUTHOR
+Stephen Riehm
+.br
+sr@pc-plus.de
+.SH "SEE ALSO"
+ctags(1), etags(1), perl(1), tclsh(1), wish(1), sh(1), ksh(1).
diff --git a/runtime/tools/shtags.pl b/runtime/tools/shtags.pl
new file mode 100755
index 0000000..49a469a
--- /dev/null
+++ b/runtime/tools/shtags.pl
@@ -0,0 +1,144 @@
+#!/usr/bin/env perl
+#
+# shtags: create a tags file for perl scripts
+#
+# Author: Stephen Riehm
+# Updated by: David Woodfall <dave@dawoodfall.net>
+# Last Changed: 2018/04/02
+#
+
+use Getopt::Std;
+
+# obvious... :-)
+sub usage
+ {
+ print <<_EOUSAGE_ ;
+USAGE: $program [-kvwVx] [-t <file>] <files>
+ -t <file> Name of tags file to create. (default is 'tags')
+ -s <shell> Name of the shell language in the script
+ -v Include variable definitions.
+ (variables mentioned at the start of a line)
+ -V Print version information.
+ -w Suppress "duplicate tag" warnings.
+ -x Explicitly create a new tags file. Normally tags are merged.
+ <files> List of files to scan for tags.
+_EOUSAGE_
+ exit 0
+ }
+
+sub version
+{
+ #
+ # Version information
+ #
+ @id = split( ', ', 'scripts/bin/shtags, /usr/local/, LOCAL_SCRIPTS, 1.2, 18/04/02, 07:37' );
+ $id[0] =~ s,.*/,,;
+ print <<_EOVERS;
+$id[0]: $id[3]
+Last Modified: @id[4,5]
+Component: $id[1]
+Release: $id[2]
+_EOVERS
+ exit( 1 );
+}
+
+#
+# initialisations
+#
+($program = $0) =~ s,.*/,,;
+
+#
+# parse command line
+#
+getopts( "t:s:vVwx" ) || &usage();
+$tags_file = $opt_t || 'tags';
+$explicit = $opt_x;
+$variable_tags = $opt_v;
+$allow_warnings = ! $opt_w;
+&version if $opt_V;
+&usage() unless @ARGV != 0;
+
+# slurp up the existing tags. Some will be replaced, the ones that aren't
+# will be re-written exactly as they were read
+if( ! $explicit && open( TAGS, "< $tags_file" ) )
+ {
+ while( <TAGS> )
+ {
+ /^\S+/;
+ $tags{$&} = $_;
+ }
+ close( TAGS );
+ }
+
+#
+# for each line of every file listed on the command line, look for a
+# 'sub' definition, or, if variables are wanted as well, look for a
+# variable definition at the start of a line
+#
+while( <> )
+ {
+ &check_shell($_), ( $old_file = $ARGV ) if $ARGV ne $old_file;
+ next unless $shell;
+ if( $shell eq "sh" )
+ {
+ next unless /^\s*(((\w+)))\s*\(\s*\)/
+ || ( $variable_tags && /^(((\w+)=))/ );
+ $match = $3;
+ }
+ if( $shell eq "ksh" )
+ {
+ # ksh
+ next unless /^\s*function\s+(((\w+)))/
+ || ( $variable_tags && /^(((\w+)=))/ );
+ $match = $3;
+ }
+ if( $shell eq "perl" )
+ {
+ # perl
+ next unless /^\s*sub\s+(\w+('|::))?(\w+)/
+ || /^\s*(((\w+))):/
+ || ( $variable_tags && /^(([(\s]*[\$\@\%]{1}(\w+).*=))/ );
+ $match = $3;
+ }
+ if( $shell eq "tcl" )
+ {
+ next unless /^\s*proc\s+(((\S+)))/
+ || ( $variable_tags && /^\s*set\s+(((\w+)\s))/ );
+ $match = $3;
+ }
+ chop;
+ warn "$match - duplicate ignored\n"
+ if ( $new{$match}++
+ || !( $tags{$match} = sprintf( "%s\t%s\t?^%s\$?\n", $match, $ARGV, $_ ) ) )
+ && $allow_warnings;
+ }
+
+# write the new tags to the tags file - note that the whole file is rewritten
+open( TAGS, "> $tags_file" );
+foreach( sort( keys %tags ) )
+ {
+ print TAGS "$tags{$_}";
+ }
+close( TAGS );
+
+sub check_shell
+ {
+ local( $_ ) = @_;
+ # read the first line of a script, and work out which shell it is,
+ # unless a shell was specified on the command line
+ #
+ # This routine can't handle clever scripts which start sh and then
+ # use sh to start the shell they really wanted.
+ if( $opt_s )
+ {
+ $shell = $opt_s;
+ }
+ else
+ {
+ $shell = "sh" if /^:$/ || /^#!.*\/bin\/sh/;
+ $shell = "ksh" if /^#!.*\/ksh/;
+ $shell = "perl" if /^#!.*\/perl/;
+ $shell = "tcl" if /^#!.*\/wish/;
+ printf "Using $shell for $ARGV\n";
+ }
+ }
diff --git a/runtime/tools/unicode.vim b/runtime/tools/unicode.vim
new file mode 100644
index 0000000..630a581
--- /dev/null
+++ b/runtime/tools/unicode.vim
@@ -0,0 +1,471 @@
+" Script to extract tables from Unicode .txt files, to be used in src/mbyte.c.
+" The format of the UnicodeData.txt file is explained here:
+" http://www.unicode.org/Public/5.1.0/ucd/UCD.html
+" For the other files see the header.
+"
+" Might need to update the URL to the emoji-data.txt
+" Usage: Vim -S <this-file>
+"
+" Author: Bram Moolenaar
+" Last Update: 2020 Aug 24
+
+" Parse lines of UnicodeData.txt. Creates a list of lists in s:dataprops.
+func! ParseDataToProps()
+ let s:dataprops = []
+ let lnum = 1
+ while lnum <= line('$')
+ let l = split(getline(lnum), '\s*;\s*', 1)
+ if len(l) != 15
+ echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 15'
+ return
+ endif
+ call add(s:dataprops, l)
+ let lnum += 1
+ endwhile
+endfunc
+
+" Parse lines of CaseFolding.txt. Creates a list of lists in s:foldprops.
+func! ParseFoldProps()
+ let s:foldprops = []
+ let lnum = 1
+ while lnum <= line('$')
+ let line = getline(lnum)
+ if line !~ '^#' && line !~ '^\s*$'
+ let l = split(line, '\s*;\s*', 1)
+ if len(l) != 4
+ echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 4'
+ return
+ endif
+ call add(s:foldprops, l)
+ endif
+ let lnum += 1
+ endwhile
+endfunc
+
+" Parse lines of EastAsianWidth.txt. Creates a list of lists in s:widthprops.
+func! ParseWidthProps()
+ let s:widthprops = []
+ let lnum = 1
+ while lnum <= line('$')
+ let line = getline(lnum)
+ if line !~ '^#' && line !~ '^\s*$'
+ let l = split(line, '\s*;\s*', 1)
+ if len(l) != 2
+ echoerr 'Found ' . len(l) . ' items in line ' . lnum . ', expected 2'
+ return
+ endif
+ call add(s:widthprops, l)
+ endif
+ let lnum += 1
+ endwhile
+endfunc
+
+" Build the toLower or toUpper table in a new buffer.
+" Uses s:dataprops.
+func! BuildCaseTable(name, index)
+ let start = -1
+ let end = -1
+ let step = 0
+ let add = -1
+ let ranges = []
+ for p in s:dataprops
+ if p[a:index] != ''
+ let n = ('0x' . p[0]) + 0
+ let nl = ('0x' . p[a:index]) + 0
+ if start >= 0 && add == nl - n && (step == 0 || n - end == step)
+ " continue with same range.
+ let step = n - end
+ let end = n
+ else
+ if start >= 0
+ " produce previous range
+ call Range(ranges, start, end, step, add)
+ endif
+ let start = n
+ let end = n
+ let step = 0
+ let add = nl - n
+ endif
+ endif
+ endfor
+ if start >= 0
+ call Range(ranges, start, end, step, add)
+ endif
+
+ " New buffer to put the result in.
+ new
+ exe "file to" . a:name
+ call setline(1, "static convertStruct to" . a:name . "[] =")
+ call setline(2, "{")
+ call append('$', ranges)
+ call setline('$', getline('$')[:-2]) " remove last comma
+ call setline(line('$') + 1, "};")
+ wincmd p
+endfunc
+
+" Build the foldCase table in a new buffer.
+" Uses s:foldprops.
+func! BuildFoldTable()
+ let start = -1
+ let end = -1
+ let step = 0
+ let add = -1
+ let ranges = []
+ for p in s:foldprops
+ if p[1] == 'C' || p[1] == 'S'
+ let n = ('0x' . p[0]) + 0
+ let nl = ('0x' . p[2]) + 0
+ if start >= 0 && add == nl - n && (step == 0 || n - end == step)
+ " continue with same range.
+ let step = n - end
+ let end = n
+ else
+ if start >= 0
+ " produce previous range
+ call Range(ranges, start, end, step, add)
+ endif
+ let start = n
+ let end = n
+ let step = 0
+ let add = nl - n
+ endif
+ endif
+ endfor
+ if start >= 0
+ call Range(ranges, start, end, step, add)
+ endif
+
+ " New buffer to put the result in.
+ new
+ file foldCase
+ call setline(1, "static convertStruct foldCase[] =")
+ call setline(2, "{")
+ call append('$', ranges)
+ call setline('$', getline('$')[:-2]) " remove last comma
+ call setline(line('$') + 1, "};")
+ wincmd p
+endfunc
+
+func! Range(ranges, start, end, step, add)
+ let s = printf("\t{0x%x,0x%x,%d,%d},", a:start, a:end, a:step == 0 ? -1 : a:step, a:add)
+ call add(a:ranges, s)
+endfunc
+
+" Build the combining table.
+" Uses s:dataprops.
+func! BuildCombiningTable()
+ let start = -1
+ let end = -1
+ let ranges = []
+ for p in s:dataprops
+ " The 'Mc' property was removed, it does take up space.
+ if p[2] == 'Mn' || p[2] == 'Me'
+ let n = ('0x' . p[0]) + 0
+ if start >= 0 && end + 1 == n
+ " continue with same range.
+ let end = n
+ else
+ if start >= 0
+ " produce previous range
+ call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
+ endif
+ let start = n
+ let end = n
+ endif
+ endif
+ endfor
+ if start >= 0
+ call add(ranges, printf("\t{0x%04x, 0x%04x},", start, end))
+ endif
+
+ " New buffer to put the result in.
+ new
+ file combining
+ call setline(1, " static struct interval combining[] =")
+ call setline(2, " {")
+ call append('$', ranges)
+ call setline('$', getline('$')[:-2]) " remove last comma
+ call setline(line('$') + 1, " };")
+ wincmd p
+endfunc
+
+" Build the double width or ambiguous width table in a new buffer.
+" Uses s:widthprops and s:dataprops.
+func! BuildWidthTable(pattern, tableName)
+ let start = -1
+ let end = -1
+ let ranges = []
+ let dataidx = 0
+ " Account for indentation differences between ambiguous and doublewidth
+ " table in mbyte.c
+ if a:pattern == 'A'
+ let spc = ' '
+ else
+ let spc = "\t"
+ endif
+ for p in s:widthprops
+ if p[1][0] =~ a:pattern
+ if p[0] =~ '\.\.'
+ " It is a range. we don't check for composing char then.
+ let rng = split(p[0], '\.\.')
+ if len(rng) != 2
+ echoerr "Cannot parse range: '" . p[0] . "' in width table"
+ endif
+ let n = ('0x' . rng[0]) + 0
+ let n_last = ('0x' . rng[1]) + 0
+ else
+ let n = ('0x' . p[0]) + 0
+ let n_last = n
+ endif
+ " Find this char in the data table.
+ while 1
+ let dn = ('0x' . s:dataprops[dataidx][0]) + 0
+ if dn >= n
+ break
+ endif
+ let dataidx += 1
+ endwhile
+ if dn != n && n_last == n
+ echoerr "Cannot find character " . n . " in data table"
+ endif
+ " Only use the char when it's not a composing char.
+ " But use all chars from a range.
+ let dp = s:dataprops[dataidx]
+ if n_last > n || (dp[2] != 'Mn' && dp[2] != 'Mc' && dp[2] != 'Me')
+ if start >= 0 && end + 1 == n
+ " continue with same range.
+ else
+ if start >= 0
+ " produce previous range
+ call add(ranges, printf("%s{0x%04x, 0x%04x},", spc, start, end))
+ if a:pattern == 'A'
+ call add(s:ambitable, [start, end])
+ else
+ call add(s:doubletable, [start, end])
+ endif
+ endif
+ let start = n
+ endif
+ let end = n_last
+ endif
+ endif
+ endfor
+ if start >= 0
+ call add(ranges, printf("%s{0x%04x, 0x%04x},", spc, start, end))
+ if a:pattern == 'A'
+ call add(s:ambitable, [start, end])
+ else
+ call add(s:doubletable, [start, end])
+ endif
+ endif
+
+ " New buffer to put the result in.
+ new
+ exe "file " . a:tableName
+ if a:pattern == 'A'
+ call setline(1, "static struct interval " . a:tableName . "[] =")
+ call setline(2, "{")
+ else
+ call setline(1, " static struct interval " . a:tableName . "[] =")
+ call setline(2, " {")
+ endif
+ call append('$', ranges)
+ call setline('$', getline('$')[:-2]) " remove last comma
+ if a:pattern == 'A'
+ call setline(line('$') + 1, "};")
+ else
+ call setline(line('$') + 1, " };")
+ endif
+ wincmd p
+endfunc
+
+
+" Get characters from a list of lines in form "12ab .." or "12ab..56cd ..."
+" and put them in dictionary "chardict"
+func AddLinesToCharDict(lines, chardict)
+ for line in a:lines
+ let tokens = split(line, '\.\.')
+ let first = str2nr(tokens[0], 16)
+ if len(tokens) == 1
+ let last = first
+ else
+ let last = str2nr(tokens[1], 16)
+ endif
+ for nr in range(first, last)
+ let a:chardict[nr] = 1
+ endfor
+ endfor
+endfunc
+
+func Test_AddLinesToCharDict()
+ let dict = {}
+ call AddLinesToCharDict([
+ \ '1234 blah blah',
+ \ '1235 blah blah',
+ \ '12a0..12a2 blah blah',
+ \ '12a1 blah blah',
+ \ ], dict)
+ call assert_equal({0x1234: 1, 0x1235: 1,
+ \ 0x12a0: 1, 0x12a1: 1, 0x12a2: 1,
+ \ }, dict)
+ if v:errors != []
+ echoerr 'AddLinesToCharDict' v:errors
+ return 1
+ endif
+ return 0
+endfunc
+
+
+func CharDictToPairList(chardict)
+ let result = []
+ let keys = keys(a:chardict)->map('str2nr(v:val)')->sort('N')
+ let low = keys[0]
+ let high = keys[0]
+ for key in keys
+ if key > high + 1
+ call add(result, [low, high])
+ let low = key
+ let high = key
+ else
+ let high = key
+ endif
+ endfor
+ call add(result, [low, high])
+ return result
+endfunc
+
+func Test_CharDictToPairList()
+ let dict = {0x1020: 1, 0x1021: 1, 0x1022: 1,
+ \ 0x1024: 1,
+ \ 0x2022: 1,
+ \ 0x2024: 1, 0x2025: 1}
+ call assert_equal([
+ \ [0x1020, 0x1022],
+ \ [0x1024, 0x1024],
+ \ [0x2022, 0x2022],
+ \ [0x2024, 0x2025],
+ \ ], CharDictToPairList(dict))
+ if v:errors != []
+ echoerr 'CharDictToPairList' v:errors
+ return 1
+ endif
+ return 0
+endfunc
+
+
+" Build the amoji width table in a new buffer.
+func BuildEmojiTable()
+ " First make the table for all emojis.
+ let pattern = '; Emoji\s\+#\s'
+ let lines = map(filter(filter(getline(1, '$'), 'v:val=~"^[1-9]"'), 'v:val=~pattern'), 'matchstr(v:val,"^\\S\\+")')
+
+ " Make a dictionary with an entry for each character.
+ let chardict = {}
+ call AddLinesToCharDict(lines, chardict)
+ let pairlist = CharDictToPairList(chardict)
+ let allranges = map(pairlist, 'printf(" {0x%04x, 0x%04x},", v:val[0], v:val[1])')
+
+ " New buffer to put the result in.
+ new
+ exe 'file emoji_all'
+ call setline(1, "static struct interval emoji_all[] =")
+ call setline(2, "{")
+ call append('$', allranges)
+ call setline('$', getline('$')[:-2]) " remove last comma
+ call setline(line('$') + 1, "};")
+ wincmd p
+
+ " Make the table for wide emojis.
+ let pattern = '; Emoji_\(Presentation\|Modifier_Base\)\s\+#\s'
+ let lines = map(filter(filter(getline(1, '$'), 'v:val=~"^[1-9]"'), 'v:val=~pattern'), 'matchstr(v:val,"^\\S\\+")')
+
+ " Make a dictionary with an entry for each character.
+ let chardict = {}
+ call AddLinesToCharDict(lines, chardict)
+
+ " exclude characters that are in the "ambiguous" or "doublewidth" table
+ for ambi in s:ambitable
+ for nr in range(ambi[0], ambi[1])
+ if has_key(chardict, nr)
+ call remove(chardict, nr)
+ endif
+ endfor
+ endfor
+
+ for wide in s:doubletable
+ for nr in range(wide[0], wide[1])
+ if has_key(chardict, nr)
+ call remove(chardict, nr)
+ endif
+ endfor
+ endfor
+
+ let pairlist = CharDictToPairList(chardict)
+ let wide_ranges = map(pairlist, 'printf("\t{0x%04x, 0x%04x},", v:val[0], v:val[1])')
+
+ " New buffer to put the result in.
+ new
+ exe 'file emoji_wide'
+ call setline(1, " static struct interval emoji_wide[] =")
+ call setline(2, " {")
+ call append('$', wide_ranges)
+ call setline('$', getline('$')[:-2]) " remove last comma
+ call setline(line('$') + 1, " };")
+ wincmd p
+endfunc
+
+" First test a few things
+let v:errors = []
+if Test_AddLinesToCharDict() || Test_CharDictToPairList()
+ finish
+endif
+
+
+" Try to avoid hitting E36
+set equalalways
+
+" Edit the Unicode text file. Requires the netrw plugin.
+edit http://unicode.org/Public/UNIDATA/UnicodeData.txt
+
+" Parse each line, create a list of lists.
+call ParseDataToProps()
+
+" Build the toLower table.
+call BuildCaseTable("Lower", 13)
+
+" Build the toUpper table.
+call BuildCaseTable("Upper", 12)
+
+" Build the ranges of composing chars.
+call BuildCombiningTable()
+
+" Edit the case folding text file. Requires the netrw plugin.
+edit http://www.unicode.org/Public/UNIDATA/CaseFolding.txt
+
+" Parse each line, create a list of lists.
+call ParseFoldProps()
+
+" Build the foldCase table.
+call BuildFoldTable()
+
+" Edit the width text file. Requires the netrw plugin.
+edit http://www.unicode.org/Public/UNIDATA/EastAsianWidth.txt
+
+" Parse each line, create a list of lists.
+call ParseWidthProps()
+
+" Build the double width table.
+let s:doubletable = []
+call BuildWidthTable('[WF]', 'doublewidth')
+
+" Build the ambiguous width table.
+let s:ambitable = []
+call BuildWidthTable('A', 'ambiguous')
+
+" Edit the emoji text file. Requires the netrw plugin.
+" commented out, because it drops too many characters
+"edit https://unicode.org/Public/15.0.0/ucd/emoji/emoji-data.txt
+"
+"" Build the emoji table. Ver. 1.0 - 6.0
+"" Must come after the "ambiguous" and "doublewidth" tables
+"call BuildEmojiTable()
diff --git a/runtime/tools/vim132 b/runtime/tools/vim132
new file mode 100755
index 0000000..29ea4ce
--- /dev/null
+++ b/runtime/tools/vim132
@@ -0,0 +1,13 @@
+#!/bin/csh
+#
+# Shell script for use with UNIX
+# Starts up Vim with the terminal in 132 column mode
+# Only works on VT-100 terminals and lookalikes
+# You need to have a termcap entry "vt100-w". Same as vt100 but 132 columns.
+#
+set oldterm=$term
+echo "[?3h"
+setenv TERM vt100-w
+vim $*
+set term=$oldterm
+echo "[?3l"
diff --git a/runtime/tools/vim_vs_net.cmd b/runtime/tools/vim_vs_net.cmd
new file mode 100644
index 0000000..335236c
--- /dev/null
+++ b/runtime/tools/vim_vs_net.cmd
@@ -0,0 +1,23 @@
+@rem
+@rem To use this with Visual Studio .Net
+@rem Tools->External Tools...
+@rem Add
+@rem Title - Vim
+@rem Command - d:\files\util\vim_vs_net.cmd
+@rem Arguments - +$(CurLine) $(ItemPath)
+@rem Init Dir - Empty
+@rem
+@rem Courtesy of Brian Sturk
+@rem
+@rem --remote-silent +%1 is a command +954, move ahead 954 lines
+@rem --remote-silent %2 full path to file
+@rem In Vim
+@rem :h --remote-silent for more details
+@rem
+@rem --servername VS_NET
+@rem This will create a new instance of vim called VS_NET. So if you open
+@rem multiple files from VS, they will use the same instance of Vim.
+@rem This allows you to have multiple copies of Vim running, but you can
+@rem control which one has VS files in it.
+@rem
+start /b gvim.exe --servername VS_NET --remote-silent "%1" "%2"
diff --git a/runtime/tools/vimm b/runtime/tools/vimm
new file mode 100755
index 0000000..7b84cb2
--- /dev/null
+++ b/runtime/tools/vimm
@@ -0,0 +1,6 @@
+#!/bin/sh
+# enable DEC locator input model on remote terminal
+printf "\033[1;2'z\033[1;3'{\c"
+vim "$@"
+# disable DEC locator input model on remote terminal
+printf "\033[2;4'{\033[0'z\c"
diff --git a/runtime/tools/vimspell.sh b/runtime/tools/vimspell.sh
new file mode 100755
index 0000000..d336fe6
--- /dev/null
+++ b/runtime/tools/vimspell.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+#
+# Spell a file & generate the syntax statements necessary to
+# highlight in vim. Based on a program from Krishna Gadepalli
+# <krishna@stdavids.picker.com>.
+#
+# I use the following mappings (in .vimrc):
+#
+# noremap <F8> :so `vimspell.sh %`<CR><CR>
+# noremap <F7> :syntax clear SpellErrors<CR>
+#
+# Neil Schemenauer <nascheme@ucalgary.ca>
+# March 1999
+# updated 2008 Jul 17 by Bram
+#
+# Safe method for the temp file by Javier Fernndez-Sanguino_Pea
+
+INFILE=$1
+tmp="${TMPDIR-/tmp}"
+OUTFILE=`mktemp -t vimspellXXXXXX || tempfile -p vimspell || echo none`
+# If the standard commands failed then create the file
+# since we cannot create a directory (we cannot remove it on exit)
+# create a file in the safest way possible.
+if test "$OUTFILE" = none; then
+ OUTFILE=$tmp/vimspell$$
+ [ -e $OUTFILE ] && { echo "Cannot use temporary file $OUTFILE, it already exists!"; exit 1 ; }
+ (umask 077; touch $OUTFILE)
+fi
+# Note the copy of vimspell cannot be deleted on exit since it is
+# used by vim, otherwise it should do this:
+# trap "rm -f $OUTFILE" 0 1 2 3 9 11 13 15
+
+
+#
+# local spellings
+#
+LOCAL_DICT=${LOCAL_DICT-$HOME/local/lib/local_dict}
+
+if [ -f $LOCAL_DICT ]
+then
+ SPELL_ARGS="+$LOCAL_DICT"
+fi
+
+spell $SPELL_ARGS $INFILE | sort -u |
+awk '
+ {
+ printf "syntax match SpellErrors \"\\<%s\\>\"\n", $0 ;
+ }
+
+END {
+ printf "highlight link SpellErrors ErrorMsg\n\n" ;
+ }
+' > $OUTFILE
+echo "!rm $OUTFILE" >> $OUTFILE
+echo $OUTFILE
diff --git a/runtime/tools/vimspell.txt b/runtime/tools/vimspell.txt
new file mode 100644
index 0000000..2842af7
--- /dev/null
+++ b/runtime/tools/vimspell.txt
@@ -0,0 +1,22 @@
+vimspell.sh
+===========
+
+This is a simple script to spell check a file and generate the syntax
+statements necessary to highlight the errors in vim. It is based on a
+similar program by Krishna Gadepalli <krishna@stdavids.picker.com>.
+
+To use this script, first place it in a directory in your path. Next,
+you should add some convenient key mappings. I use the following (in
+.vimrc):
+
+ noremap <F8> :so `vimspell.sh %`<CR><CR>
+ noremap <F7> :syntax clear SpellErrors<CR>
+
+This program requires the old Unix "spell" command. On my Debian
+system, "spell" is a wrapper around "ispell". For better security,
+you should uncomment the line in the script that uses "tempfile" to
+create a temporary file. As all systems don't have "tempfile" the
+insecure "pid method" is used.
+
+
+ Neil Schemenauer <nascheme@ucalgary.ca>
diff --git a/runtime/tools/xcmdsrv_client.c b/runtime/tools/xcmdsrv_client.c
new file mode 100644
index 0000000..e1aea10
--- /dev/null
+++ b/runtime/tools/xcmdsrv_client.c
@@ -0,0 +1,578 @@
+/* vi:set ts=8 sts=4 sw=4:
+ *
+ * VIM - Vi IMproved by Bram Moolenaar
+ * X-Windows communication by Flemming Madsen
+ *
+ * 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.
+ *
+ * Client for sending commands to an '+xcmdsrv' enabled vim.
+ * This is mostly a de-Vimified version of if_xcmdsrv.c in vim.
+ * See that file for a protocol specification.
+ *
+ * You can make a test program with a Makefile like:
+ * xcmdsrv_client: xcmdsrv_client.c
+ * cc -o $@ -g -DMAIN -I/usr/X11R6/include -L/usr/X11R6/lib $< -lX11
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#ifdef HAVE_SELECT
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#else
+#include <sys/poll.h>
+#endif
+#include <X11/Intrinsic.h>
+#include <X11/Xatom.h>
+
+/* Client API */
+char * sendToVim(Display *dpy, char *name, char *cmd, int asKeys, int *code);
+
+#ifdef MAIN
+/* A sample program */
+main(int argc, char **argv)
+{
+ char *res;
+ int code;
+
+ if (argc == 4)
+ {
+ if ((res = sendToVim(XOpenDisplay(NULL), argv[2], argv[3],
+ argv[1][0] != 'e', &code)) != NULL)
+ {
+ if (code)
+ printf("Error code returned: %d\n", code);
+ puts(res);
+ }
+ exit(0);
+ }
+ else
+ fprintf(stderr, "Usage: %s {k|e} <server> <command>", argv[0]);
+
+ exit(1);
+}
+#endif
+
+/*
+ * Maximum size property that can be read at one time by
+ * this module:
+ */
+
+#define MAX_PROP_WORDS 100000
+
+/*
+ * Forward declarations for procedures defined later in this file:
+ */
+
+static int x_error_check(Display *dpy, XErrorEvent *error_event);
+static int AppendPropCarefully(Display *display,
+ Window window, Atom property, char *value, int length);
+static Window LookupName(Display *dpy, char *name,
+ int delete, char **loose);
+static int SendInit(Display *dpy);
+static char *SendEventProc(Display *dpy, XEvent *eventPtr,
+ int expect, int *code);
+static int IsSerialName(char *name);
+
+/* Private variables */
+static Atom registryProperty = None;
+static Atom commProperty = None;
+static Window commWindow = None;
+static int got_x_error = FALSE;
+
+
+/*
+ * sendToVim --
+ * Send to an instance of Vim via the X display.
+ *
+ * Results:
+ * A string with the result or NULL. Caller must free if non-NULL
+ */
+
+ char *
+sendToVim(
+ Display *dpy, /* Where to send. */
+ char *name, /* Where to send. */
+ char *cmd, /* What to send. */
+ int asKeys, /* Interpret as keystrokes or expr ? */
+ int *code) /* Return code. 0 => OK */
+{
+ Window w;
+ Atom *plist;
+ XErrorHandler old_handler;
+#define STATIC_SPACE 500
+ char *property, staticSpace[STATIC_SPACE];
+ int length;
+ int res;
+ static int serial = 0; /* Running count of sent commands.
+ * Used to give each command a
+ * different serial number. */
+ XEvent event;
+ XPropertyEvent *e = (XPropertyEvent *)&event;
+ time_t start;
+ char *result;
+ char *loosename = NULL;
+
+ if (commProperty == None && dpy != NULL)
+ {
+ if (SendInit(dpy) < 0)
+ return NULL;
+ }
+
+ /*
+ * Bind the server name to a communication window.
+ *
+ * Find any survivor with a serialno attached to the name if the
+ * original registrant of the wanted name is no longer present.
+ *
+ * Delete any lingering names from dead editors.
+ */
+
+ old_handler = XSetErrorHandler(x_error_check);
+ while (TRUE)
+ {
+ got_x_error = FALSE;
+ w = LookupName(dpy, name, 0, &loosename);
+ /* Check that the window is hot */
+ if (w != None)
+ {
+ plist = XListProperties(dpy, w, &res);
+ XSync(dpy, False);
+ if (plist != NULL)
+ XFree(plist);
+ if (got_x_error)
+ {
+ LookupName(dpy, loosename ? loosename : name,
+ /*DELETE=*/TRUE, NULL);
+ continue;
+ }
+ }
+ break;
+ }
+ if (w == None)
+ {
+ fprintf(stderr, "no registered server named %s\n", name);
+ return NULL;
+ }
+ else if (loosename != NULL)
+ name = loosename;
+
+ /*
+ * Send the command to target interpreter by appending it to the
+ * comm window in the communication window.
+ */
+
+ length = strlen(name) + strlen(cmd) + 10;
+ if (length <= STATIC_SPACE)
+ property = staticSpace;
+ else
+ property = (char *) malloc((unsigned) length);
+
+ serial++;
+ sprintf(property, "%c%c%c-n %s%c-s %s",
+ 0, asKeys ? 'k' : 'c', 0, name, 0, cmd);
+ if (name == loosename)
+ free(loosename);
+ if (!asKeys)
+ {
+ /* Add a back reference to our comm window */
+ sprintf(property + length, "%c-r %x %d", 0, (uint) commWindow, serial);
+ length += strlen(property + length + 1) + 1;
+ }
+
+ res = AppendPropCarefully(dpy, w, commProperty, property, length + 1);
+ if (length > STATIC_SPACE)
+ free(property);
+ if (res < 0)
+ {
+ fprintf(stderr, "Failed to send command to the destination program\n");
+ return NULL;
+ }
+
+ if (asKeys) /* There is no answer for this - Keys are sent async */
+ return NULL;
+
+
+ /*
+ * Enter a loop processing X events & pooling chars until we see the result
+ */
+
+#define SEND_MSEC_POLL 50
+
+ time(&start);
+ while ((time((time_t *) 0) - start) < 60)
+ {
+ /* Look out for the answer */
+#ifndef HAVE_SELECT
+ struct pollfd fds;
+
+ fds.fd = ConnectionNumber(dpy);
+ fds.events = POLLIN;
+ if (poll(&fds, 1, SEND_MSEC_POLL) < 0)
+ break;
+#else
+ fd_set fds;
+ struct timeval tv;
+
+ tv.tv_sec = 0;
+ tv.tv_usec = SEND_MSEC_POLL * 1000;
+ FD_ZERO(&fds);
+ FD_SET(ConnectionNumber(dpy), &fds);
+ if (select(ConnectionNumber(dpy) + 1, &fds, NULL, NULL, &tv) < 0)
+ break;
+#endif
+ while (XEventsQueued(dpy, QueuedAfterReading) > 0)
+ {
+ XNextEvent(dpy, &event);
+ if (event.type == PropertyNotify && e->window == commWindow)
+ if ((result = SendEventProc(dpy, &event, serial, code)) != NULL)
+ return result;
+ }
+ }
+ return NULL;
+}
+
+
+/*
+ * SendInit --
+ * This procedure is called to initialize the
+ * communication channels for sending commands and
+ * receiving results.
+ */
+
+ static int
+SendInit(Display *dpy)
+{
+ XErrorHandler old_handler;
+
+ /*
+ * Create the window used for communication, and set up an
+ * event handler for it.
+ */
+ old_handler = XSetErrorHandler(x_error_check);
+ got_x_error = FALSE;
+
+ commProperty = XInternAtom(dpy, "Comm", False);
+ /* Change this back to "InterpRegistry" to talk to tk processes */
+ registryProperty = XInternAtom(dpy, "VimRegistry", False);
+
+ if (commWindow == None)
+ {
+ commWindow =
+ XCreateSimpleWindow(dpy, XDefaultRootWindow(dpy),
+ getpid(), 0, 10, 10, 0,
+ WhitePixel(dpy, DefaultScreen(dpy)),
+ WhitePixel(dpy, DefaultScreen(dpy)));
+ XSelectInput(dpy, commWindow, PropertyChangeMask);
+ }
+
+ XSync(dpy, False);
+ (void) XSetErrorHandler(old_handler);
+
+ return got_x_error ? -1 : 0;
+}
+
+/*
+ * LookupName --
+ * Given an interpreter name, see if the name exists in
+ * the interpreter registry for a particular display.
+ *
+ * Results:
+ * If the given name is registered, return the ID of
+ * the window associated with the name. If the name
+ * isn't registered, then return 0.
+ */
+
+ static Window
+LookupName(
+ Display *dpy, /* Display whose registry to check. */
+ char *name, /* Name of an interpreter. */
+ int delete, /* If non-zero, delete info about name. */
+ char **loose) /* Do another search matching -999 if not found
+ Return result here if a match is found */
+{
+ unsigned char *regProp, *entry;
+ unsigned char *p;
+ int result, actualFormat;
+ unsigned long numItems, bytesAfter;
+ Atom actualType;
+ Window returnValue;
+
+ /*
+ * Read the registry property.
+ */
+
+ regProp = NULL;
+ result = XGetWindowProperty(dpy, RootWindow(dpy, 0), registryProperty, 0,
+ MAX_PROP_WORDS, False, XA_STRING, &actualType,
+ &actualFormat, &numItems, &bytesAfter,
+ &regProp);
+
+ if (actualType == None)
+ return 0;
+
+ /*
+ * If the property is improperly formed, then delete it.
+ */
+
+ if ((result != Success) || (actualFormat != 8) || (actualType != XA_STRING))
+ {
+ if (regProp != NULL)
+ XFree(regProp);
+ XDeleteProperty(dpy, RootWindow(dpy, 0), registryProperty);
+ return 0;
+ }
+
+ /*
+ * Scan the property for the desired name.
+ */
+
+ returnValue = None;
+ entry = NULL; /* Not needed, but eliminates compiler warning. */
+ for (p = regProp; (p - regProp) < numItems; )
+ {
+ entry = p;
+ while ((*p != 0) && (!isspace(*p)))
+ p++;
+ if ((*p != 0) && (strcasecmp(name, p + 1) == 0))
+ {
+ sscanf(entry, "%x", (uint*) &returnValue);
+ break;
+ }
+ while (*p != 0)
+ p++;
+ p++;
+ }
+
+ if (loose != NULL && returnValue == None && !IsSerialName(name))
+ {
+ for (p = regProp; (p - regProp) < numItems; )
+ {
+ entry = p;
+ while ((*p != 0) && (!isspace(*p)))
+ p++;
+ if ((*p != 0) && IsSerialName(p + 1)
+ && (strncmp(name, p + 1, strlen(name)) == 0))
+ {
+ sscanf(entry, "%x", (uint*) &returnValue);
+ *loose = strdup(p + 1);
+ break;
+ }
+ while (*p != 0)
+ p++;
+ p++;
+ }
+ }
+
+ /*
+ * Delete the property, if that is desired (copy down the
+ * remainder of the registry property to overlay the deleted
+ * info, then rewrite the property).
+ */
+
+ if ((delete) && (returnValue != None))
+ {
+ int count;
+
+ while (*p != 0)
+ p++;
+ p++;
+ count = numItems - (p-regProp);
+ if (count > 0)
+ memcpy(entry, p, count);
+ XChangeProperty(dpy, RootWindow(dpy, 0), registryProperty, XA_STRING,
+ 8, PropModeReplace, regProp,
+ (int) (numItems - (p-entry)));
+ XSync(dpy, False);
+ }
+
+ XFree(regProp);
+ return returnValue;
+}
+
+ static char *
+SendEventProc(
+ Display *dpy,
+ XEvent *eventPtr, /* Information about event. */
+ int expected, /* The one were waiting for */
+ int *code) /* Return code. 0 => OK */
+{
+ unsigned char *propInfo;
+ unsigned char *p;
+ int result, actualFormat;
+ int retCode;
+ unsigned long numItems, bytesAfter;
+ Atom actualType;
+
+ if ((eventPtr->xproperty.atom != commProperty)
+ || (eventPtr->xproperty.state != PropertyNewValue))
+ {
+ return;
+ }
+
+ /*
+ * Read the comm property and delete it.
+ */
+
+ propInfo = NULL;
+ result = XGetWindowProperty(dpy, commWindow, commProperty, 0,
+ MAX_PROP_WORDS, True, XA_STRING, &actualType,
+ &actualFormat, &numItems, &bytesAfter,
+ &propInfo);
+
+ /*
+ * If the property doesn't exist or is improperly formed
+ * then ignore it.
+ */
+
+ if ((result != Success) || (actualType != XA_STRING)
+ || (actualFormat != 8))
+ {
+ if (propInfo != NULL)
+ {
+ XFree(propInfo);
+ }
+ return;
+ }
+
+ /*
+ * Several commands and results could arrive in the property at
+ * one time; each iteration through the outer loop handles a
+ * single command or result.
+ */
+
+ for (p = propInfo; (p - propInfo) < numItems; )
+ {
+ /*
+ * Ignore leading NULs; each command or result starts with a
+ * NUL so that no matter how badly formed a preceding command
+ * is, we'll be able to tell that a new command/result is
+ * starting.
+ */
+
+ if (*p == 0)
+ {
+ p++;
+ continue;
+ }
+
+ if ((*p == 'r') && (p[1] == 0))
+ {
+ int serial, gotSerial;
+ char *res;
+
+ /*
+ * This is a reply to some command that we sent out. Iterate
+ * over all of its options. Stop when we reach the end of the
+ * property or something that doesn't look like an option.
+ */
+
+ p += 2;
+ gotSerial = 0;
+ res = "";
+ retCode = 0;
+ while (((p-propInfo) < numItems) && (*p == '-'))
+ {
+ switch (p[1])
+ {
+ case 'r':
+ if (p[2] == ' ')
+ res = p + 3;
+ break;
+ case 's':
+ if (sscanf(p + 2, " %d", &serial) == 1)
+ gotSerial = 1;
+ break;
+ case 'c':
+ if (sscanf(p + 2, " %d", &retCode) != 1)
+ retCode = 0;
+ break;
+ }
+ while (*p != 0)
+ p++;
+ p++;
+ }
+
+ if (!gotSerial)
+ continue;
+
+ if (code != NULL)
+ *code = retCode;
+ return serial == expected ? strdup(res) : NULL;
+ }
+ else
+ {
+ /*
+ * Didn't recognize this thing. Just skip through the next
+ * null character and try again.
+ * Also, throw away commands that we can't process anyway.
+ */
+
+ while (*p != 0)
+ p++;
+ p++;
+ }
+ }
+ XFree(propInfo);
+}
+
+/*
+ * AppendPropCarefully --
+ *
+ * Append a given property to a given window, but set up
+ * an X error handler so that if the append fails this
+ * procedure can return an error code rather than having
+ * Xlib panic.
+ *
+ * Return:
+ * 0 on OK - -1 on error
+ *--------------------------------------------------------------
+ */
+
+ static int
+AppendPropCarefully(
+ Display *dpy, /* Display on which to operate. */
+ Window window, /* Window whose property is to
+ * be modified. */
+ Atom property, /* Name of property. */
+ char *value, /* Characters to append to property. */
+ int length) /* How much to append */
+{
+ XErrorHandler old_handler;
+
+ old_handler = XSetErrorHandler(x_error_check);
+ got_x_error = FALSE;
+ XChangeProperty(dpy, window, property, XA_STRING, 8,
+ PropModeAppend, value, length);
+ XSync(dpy, False);
+ (void) XSetErrorHandler(old_handler);
+ return got_x_error ? -1 : 0;
+}
+
+
+/*
+ * Another X Error handler, just used to check for errors.
+ */
+/* ARGSUSED */
+ static int
+x_error_check(Display *dpy, XErrorEvent *error_event)
+{
+ got_x_error = TRUE;
+ return 0;
+}
+
+/*
+ * Check if "str" looks like it had a serial number appended.
+ * Actually just checks if the name ends in a digit.
+ */
+ static int
+IsSerialName(char *str)
+{
+ int len = strlen(str);
+
+ return (len > 1 && isdigit(str[len - 1]));
+}
diff --git a/runtime/tutor.info b/runtime/tutor.info
new file mode 100755
index 0000000..f8ceda3
--- /dev/null
+++ b/runtime/tutor.info
Binary files differ
diff --git a/runtime/tutor/Makefile b/runtime/tutor/Makefile
new file mode 100644
index 0000000..3d1d560
--- /dev/null
+++ b/runtime/tutor/Makefile
@@ -0,0 +1,104 @@
+# Makefile for the Vim tutor.
+#
+# The Japanese tutor exists in three encodings. Use the UTF-8 version as the
+# original and create the others with conversion.
+#
+# Similarly for Russian and Korean
+
+all: tutor.utf-8 \
+ tutor.bar \
+ tutor.ca.utf-8 \
+ tutor.de.utf-8 \
+ tutor.el tutor.el.cp737 \
+ tutor.eo \
+ tutor.es \
+ tutor.fr.utf-8 \
+ tutor.hr tutor.hr.cp1250 \
+ tutor.hu tutor.hu.cp1250 \
+ tutor.it.utf-8 \
+ tutor.ja.sjis tutor.ja.euc \
+ tutor.ko.euc \
+ tutor.nl \
+ tutor.no.utf-8 \
+ tutor.nb \
+ tutor.nb.utf-8 \
+ tutor.ru tutor.ru.cp1251 \
+ tutor.sv.utf-8 \
+ tutor.tr.iso9 \
+ tutor.zh.utf-8
+
+tutor.utf-8: tutor
+ iconv -f ISO-8859-1 -t UTF-8 tutor > tutor.utf-8
+
+tutor.bar: tutor.bar.utf-8
+ iconv -f UTF-8 -t ISO-8859-1 tutor.bar.utf-8 > tutor.bar
+
+tutor.ca.utf-8: tutor.ca
+ iconv -f ISO-8859-1 -t UTF-8 tutor.ca > tutor.ca.utf-8
+
+tutor.eo: tutor.eo.utf-8
+ iconv -f UTF-8 -t ISO-8859-3 tutor.eo.utf-8 > tutor.eo
+
+tutor.de.utf-8: tutor.de
+ iconv -f ISO-8859-1 -t UTF-8 tutor.de > tutor.de.utf-8
+
+tutor.el: tutor.el.utf-8
+ iconv -f UTF-8 -t ISO-8859-7 tutor.el.utf-8 > tutor.el
+
+tutor.el.cp737: tutor.el.utf-8
+ iconv -f UTF-8 -t cp737 tutor.el.utf-8 > tutor.el.cp737
+
+tutor.es: tutor.es.utf-8
+ iconv -f UTF-8 -t ISO-8859-1 tutor.es.utf-8 > tutor.es
+
+tutor.fr.utf-8: tutor.fr
+ iconv -f ISO-8859-1 -t UTF-8 tutor.fr > tutor.fr.utf-8
+
+tutor.hu: tutor.hu.utf-8
+ iconv -f UTF-8 -t ISO-8859-2 tutor.hu.utf-8 > tutor.hu
+
+tutor.hu.cp1250: tutor.hu.utf-8
+ iconv -f UTF-8 -t cp1250 tutor.hu.utf-8 > tutor.hu.cp1250
+
+tutor.hr: tutor.hr.utf-8
+ iconv -f UTF-8 -t ISO-8859-2 tutor.hr.utf-8 > tutor.hr
+
+tutor.hr.cp1250: tutor.hr.utf-8
+ iconv -f UTF-8 -t cp1250 tutor.hr.utf-8 > tutor.hr.cp1250
+
+tutor.ja.sjis: tutor.ja.utf-8
+ iconv -f UTF-8 -t cp932 tutor.ja.utf-8 > tutor.ja.sjis
+
+tutor.ja.euc: tutor.ja.utf-8
+ iconv -f UTF-8 -t EUC-JP tutor.ja.utf-8 > tutor.ja.euc
+
+tutor.ko.euc: tutor.ko.utf-8
+ iconv -f UTF-8 -t EUC-KR tutor.ko.utf-8 > tutor.ko.euc
+
+tutor.nl: tutor.nl.utf-8
+ iconv -f UTF-8 -t ISO-8859-1 tutor.nl.utf-8 > tutor.nl
+
+tutor.no.utf-8: tutor.no
+ iconv -f ISO-8859-1 -t UTF-8 tutor.no > tutor.no.utf-8
+
+# nb is an alias for no
+tutor.nb: tutor.no
+ cp tutor.no tutor.nb
+
+tutor.nb.utf-8: tutor.no.utf-8
+ cp tutor.no.utf-8 tutor.nb.utf-8
+
+tutor.ru: tutor.ru.utf-8
+ iconv -f UTF-8 -t KOI8-R tutor.ru.utf-8 > tutor.ru
+
+tutor.ru.cp1251: tutor.ru.utf-8
+ iconv -f UTF-8 -t cp1251 tutor.ru.utf-8 > tutor.ru.cp1251
+
+tutor.tr.iso9: tutor.tr.utf-8
+ iconv -f UTF-8 -t ISO-8859-9 tutor.tr.utf-8 > tutor.tr.iso9
+
+tutor.sv.utf-8: tutor.sv
+ iconv -f ISO-8859-1 -t UTF-8 tutor.sv > tutor.sv.utf-8
+
+tutor.zh.utf-8: tutor.zh.big5
+ iconv -f BIG-5 -t UTF-8 tutor.zh.big5 > tutor.zh.utf-8
diff --git a/runtime/tutor/README.el.cp737.txt b/runtime/tutor/README.el.cp737.txt
new file mode 100644
index 0000000..426f929
--- /dev/null
+++ b/runtime/tutor/README.el.cp737.txt
@@ -0,0 +1,24 @@
+ Tutor 夘 "" 㚞 ⦬ 㩫
+ᡫ Vim.
+
+ 櫜 ⦠ 㩫 驦 櫜
+ 騘. ⢜ 夘 櫠 嫜 ᤜ
+嘪 ⤦ 餫 ᡫ Vim.
+
+ Tutor 夘 ⤘ ⮜ 㣘 .
+嫜 ⩜ "vim tutor" 㩜
+圪 㣘. 㣘 礜 㩜
+ , .
+
+ 穫 Unix 嫜 婞 㩜 暨 "vimtutor".
+ 㩜 高 ⤘ 殜 嚨 tutor.
+
+ 櫜 ਞ⤘ 㣘
+ 嫞 椦. 驫 ⢘ 墜
+ 㧦 驜 ᤜ.
+
+Bob Ware, Colorado School of Mines, Golden, Co 80401, USA
+(303) 273-3987
+bware@mines.colorado.edu bware@slate.mines.colorado.edu bware@mines.bitnet
+
+[ 㟞 Vim Bram Moolenaar]
diff --git a/runtime/tutor/README.el.txt b/runtime/tutor/README.el.txt
new file mode 100644
index 0000000..b2f5e07
--- /dev/null
+++ b/runtime/tutor/README.el.txt
@@ -0,0 +1,24 @@
+ Tutor ""
+ Vim.
+
+
+ .
+ Vim.
+
+ Tutor .
+ "vim tutor"
+ .
+ , .
+
+ Unix "vimtutor".
+ tutor.
+
+
+ .
+ .
+
+Bob Ware, Colorado School of Mines, Golden, Co 80401, USA
+(303) 273-3987
+bware@mines.colorado.edu bware@slate.mines.colorado.edu bware@mines.bitnet
+
+[ Vim Bram Moolenaar]
diff --git a/runtime/tutor/README.txt b/runtime/tutor/README.txt
new file mode 100644
index 0000000..060268e
--- /dev/null
+++ b/runtime/tutor/README.txt
@@ -0,0 +1,37 @@
+Tutor is a "hands on" tutorial for new users of the Vim editor.
+
+Most new users can get through it in less than one hour. The result
+is that you can do a simple editing task using the Vim editor.
+
+Tutor is a file that contains the tutorial lessons. You can simply
+execute "vim tutor" and then follow the instructions in the lessons.
+The lessons tell you to modify the file, so DON'T DO THIS ON YOUR
+ORIGINAL COPY.
+
+On Unix you can also use the "vimtutor" program. It will make a
+scratch copy of the tutor first.
+
+I have considered adding more advanced lessons but have not found the
+time. Please let me know how you like it and send any improvements you
+make.
+
+Bob Ware, Colorado School of Mines, Golden, Co 80401, USA
+(303) 273-3987
+bware@mines.colorado.edu bware@slate.mines.colorado.edu bware@mines.bitnet
+
+
+Translation
+-----------
+
+The tutor.xx and tutor.xx.utf-8 files are translated files (where xx is the
+language code). The encoding of tutor.xx might be latin1 or other traditional
+encoding. If you don't need a translation with such traditional encoding,
+you just need to prepare the tutor.xx.utf-8 file.
+If you need another encoding, you can also prepare a file named tutor.xx.enc
+(replace enc with the actual encoding name). You might also need to adjust the
+tutor.vim file.
+The "make" command can be used for creating tutor.xx from tutor.xx.utf-8.
+See the Makefile for detail. (For some languages, tutor.xx.utf-8 is created
+from tutor.xx for historical reasons.)
+
+[This file was modified for Vim by Bram Moolenaar et al.]
diff --git a/runtime/tutor/README.txt.info b/runtime/tutor/README.txt.info
new file mode 100755
index 0000000..238b11f
--- /dev/null
+++ b/runtime/tutor/README.txt.info
Binary files differ
diff --git a/runtime/tutor/tutor b/runtime/tutor/tutor
new file mode 100644
index 0000000..3df15f1
--- /dev/null
+++ b/runtime/tutor/tutor
@@ -0,0 +1,972 @@
+===============================================================================
+= W e l c o m e t o t h e V I M T u t o r - Version 1.7 =
+===============================================================================
+
+ 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.
+
+ The approximate time required to complete the tutor is 30 minutes,
+ depending upon how much time is spent with experimentation.
+
+ ATTENTION:
+ The commands in the lessons will modify the text. Make a copy of this
+ file to practice on (if you started "vimtutor" this is already a copy).
+
+ It is important to remember that this tutor is set up to teach by
+ use. That means that you need to execute the commands to learn them
+ properly. If you only read the text, you will forget the commands!
+
+ Now, make sure that your Caps-Lock key is NOT depressed and press
+ the j key enough times to move the cursor so that lesson 1.1
+ completely fills the screen.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 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.
+ v
+ 1. Move the cursor around the screen until you are comfortable.
+
+ 2. Hold down the down key (j) 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.
+
+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!!
+
+ 1. Press the <ESC> key (to make sure you are in Normal mode).
+
+ 2. Type: :q! <ENTER>.
+ This exits the editor, DISCARDING any changes you have made.
+
+ 3. Get back here by executing the command that got you into this tutor. That
+ might be: vimtutor <ENTER>
+
+ 4. If you have these steps memorized and are confident, execute steps
+ 1 through 3 to exit and re-enter the editor.
+
+NOTE: :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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.3: TEXT EDITING - DELETION
+
+
+ ** Press x to delete the character under the cursor. **
+
+ 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.
+
+ 3. Press the x key to delete the unwanted character.
+
+ 4. Repeat steps 2 through 4 until the sentence is correct.
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 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.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.4: TEXT EDITING - INSERTION
+
+
+ ** Press i to insert text. **
+
+ 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
+ of the character BEFORE which the text is to be inserted.
+
+ 3. Press i and type in the necessary additions.
+
+ 4. As each error is fixed press <ESC> to return to Normal mode.
+ Repeat steps 2 through 4 to correct the sentence.
+
+---> 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.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.5: TEXT EDITING - APPENDING
+
+
+ ** Press A 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.
+
+ 2. Press A and type in the necessary additions.
+
+ 3. As the text has been appended press <ESC> to return to Normal mode.
+
+ 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
+ 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.6: EDITING A FILE
+
+ ** Use :wq to save a file and exit. **
+
+ !! NOTE: Before executing any of the steps below, read this entire lesson!!
+
+ 1. If you have access to another terminal, do the following there.
+ Otherwise, exit this tutor as you did in lesson 1.2: :q!
+
+ 2. At the shell prompt type this command: vim file.txt <ENTER>
+ 'vim' is the command to start the Vim editor, 'file.txt' is the name of
+ the file you wish to edit. Use the name of a file that you can change.
+
+ 3. Insert and delete text as you learned in the previous lessons.
+
+ 4. Save the file with changes and exit Vim with: :wq <ENTER>
+
+ 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1 SUMMARY
+
+
+ 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: vim FILENAME <ENTER>
+
+ 3. To exit Vim type: <ESC> :q! <ENTER> to trash all changes.
+ OR type: <ESC> :wq <ENTER> to save the changes.
+
+ 4. To delete the character at the cursor type: x
+
+ 5. To insert or append text type:
+ i type inserted text <ESC> insert before the cursor
+ A type appended text <ESC> append after the line
+
+NOTE: Pressing <ESC> will place you in Normal mode or will cancel
+ an unwanted and partially completed command.
+
+Now continue with lesson 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.1: DELETION COMMANDS
+
+
+ ** Type dw to delete a word. **
+
+ 1. Press <ESC> to make sure you are in Normal mode.
+
+ 2. Move the cursor to the line below marked --->.
+
+ 3. Move the cursor to the beginning of a word that needs to be deleted.
+
+ 4. Type dw to make the word disappear.
+
+ NOTE: The letter d will appear on the last line of the screen as you type
+ it. Vim is waiting for you to type w . If you see another character
+ than d you typed something wrong; press <ESC> and start over.
+
+---> 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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.2: MORE DELETION COMMANDS
+
+
+ ** Type d$ to delete to the end of the line. **
+
+ 1. Press <ESC> to make sure you are in Normal mode.
+
+ 2. Move the cursor to the line below marked --->.
+
+ 3. Move the cursor to the end of the correct line (AFTER the first . ).
+
+ 4. Type d$ to delete to the end of the line.
+
+---> 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.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.3: ON OPERATORS AND MOTIONS
+
+
+ Many commands that change text are made from an operator and a motion.
+ The format for a delete command with the d delete operator is as follows:
+
+ d motion
+
+ Where:
+ d - is the delete operator.
+ motion - is what the operator will operate on (listed below).
+
+ A short list of motions:
+ w - until the start of the next word, EXCLUDING its first character.
+ 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 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 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 below marked --->.
+
+ 2. Type 2w to move the cursor two words forward.
+
+ 3. Type 3e to move the cursor to the end of the third word forward.
+
+ 4. Type 0 (zero) to move to the start of the line.
+
+ 5. Repeat steps 2 and 3 with different numbers.
+
+---> This is just a line with words you can move around in.
+
+ 6. Move on to lesson 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.5: USING A COUNT TO DELETE MORE
+
+
+ ** Typing a number with an operator repeats it that many times. **
+
+ 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 --->.
+
+ 2. Type d2w 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.
+
+---> 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. **
+
+ 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 to delete the line.
+ 3. Now move to the fourth line.
+ 4. Type 2dd to delete two lines.
+
+---> 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.
+
+Doubling to operate on a line also works for operators mentioned below.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.7: THE UNDO COMMAND
+
+
+ ** Press u to undo the last commands, U to fix a whole line. **
+
+ 1. Move the cursor to the line below marked ---> and place it on the
+ first error.
+ 2. Type x to delete the first unwanted character.
+ 3. Now type u to undo the last command executed.
+ 4. This time fix all the errors on the line using the x command.
+ 5. Now type a capital U to return the line to its original state.
+ 6. Now type u a few times to undo the U and preceding commands.
+ 7. Now type CTRL-R (keeping CTRL key pressed while hitting R) a few times
+ to redo the commands (undo the undos).
+
+---> 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.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2 SUMMARY
+
+ 1. To delete from the cursor up to the next word type: dw
+ 2. To delete from the cursor up to the end of the word type: de
+ 3. To delete from the cursor to the end of a line type: d$
+ 4. To delete a whole line type: dd
+
+ 5. To repeat a motion prepend it with a number: 2w
+ 6. The format for a change command is:
+ operator [number] motion
+ where:
+ operator - is what to do, such as d for delete
+ [number] - is an optional count to repeat the motion
+ motion - moves over the text to operate on, such as w (word),
+ e (end of word), $ (end of the line), etc.
+
+ 7. To move to the start of the line use a zero: 0
+
+ 8. To undo previous actions, type: u (lowercase u)
+ To undo all the changes on a line, type: U (capital U)
+ To undo the undos, type: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.1: THE PUT COMMAND
+
+
+ ** Type p to put previously deleted text after the cursor. **
+
+ 1. Move the cursor to the first line below marked --->.
+
+ 2. Type dd 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.
+
+ 4. Type p to put the line below the cursor.
+
+ 5. Repeat steps 2 through 4 to put all the lines in correct order.
+
+---> 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 to replace the character at the cursor with x . **
+
+ 1. Move the cursor to the first line below marked --->.
+
+ 2. Move the cursor so that it is on top of the first error.
+
+ 3. Type r and then the character which should be there.
+
+ 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!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 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 . **
+
+ 1. Move the cursor to the first line below marked --->.
+
+ 2. Place the cursor on the u in lubw.
+
+ 3. Type ce and the correct word (in this case, type ine ).
+
+ 4. Press <ESC> 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.
+
+---> 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 ce deletes the word and places you in Insert mode.
+ cc does the same for the whole line.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.4: MORE CHANGES USING c
+
+
+ ** 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:
+
+ c [number] motion
+
+ 2. The motions are the same, such as w (word) and $ (end of line).
+
+ 3. Move the cursor to the first line below marked --->.
+
+ 4. Move the cursor to the first error.
+
+ 5. Type c$ and type the rest of the line like the second and press <ESC>.
+
+---> 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$ command.
+
+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 . 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 and then the
+ character you want to have there.
+
+ 3. The change operator allows you to change from the cursor to where the
+ motion takes you. eg. Type ce to change from the cursor to the end of
+ the word, c$ to change to the end of a line.
+
+ 4. The format for change is:
+
+ c [number] motion
+
+Now go on to the next lesson.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.1: CURSOR LOCATION AND FILE STATUS
+
+ ** Type CTRL-G to show your location in the file and the file status.
+ Type G to move to a line in the file. **
+
+ NOTE: Read this entire lesson before executing any of the steps!!
+
+ 1. Hold down the Ctrl key and press g . We call this CTRL-G.
+ 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' option is set (see :help 'ruler' )
+
+ 2. Press G to move you to the bottom of the file.
+ Type gg to move you to the start of the file.
+
+ 3. Type the number of the line you were on and then G . This will
+ return you to the line you were on when you first pressed CTRL-G.
+
+ 4. If you feel confident to do this, execute steps 1 through 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.2: THE SEARCH COMMAND
+
+
+ ** Type / followed by a phrase to search for the phrase. **
+
+ 1. In Normal mode type the / character. Notice that it and the cursor
+ appear at the bottom of the screen as with the : command.
+
+ 2. Now type 'errroor' <ENTER>. This is the word you want to search for.
+
+ 3. To search for the same phrase again, simply type n .
+ To search for the same phrase in the opposite direction, type N .
+
+ 4. To search for a phrase in the backward direction, use ? instead of / .
+
+ 5. To go back to where you came from press CTRL-O (Keep Ctrl down while
+ pressing the letter o). Repeat to go back further. CTRL-I goes forward.
+
+---> "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' option has been reset.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.3: MATCHING PARENTHESES SEARCH
+
+
+ ** Type % to find a matching ),], or } . **
+
+ 1. Place the cursor on any (, [, or { in the line below marked --->.
+
+ 2. Now type the % character.
+
+ 3. The cursor will move to the matching parenthesis or bracket.
+
+ 4. Type % to move the cursor to the other matching bracket.
+
+ 5. Move the cursor to another (,),[,],{ or } and see what % does.
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+
+NOTE: This is very useful in debugging a program with unmatched parentheses!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.4: THE SUBSTITUTE COMMAND
+
+
+ ** Type :s/old/new/g to substitute 'new' for 'old'. **
+
+ 1. Move the cursor to the line below marked --->.
+
+ 2. Type :s/thee/the <ENTER> . Note that this command only changes the
+ first occurrence of "thee" in the line.
+
+ 3. Now type :s/thee/the/g . Adding the g flag 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.
+
+ 4. To change every occurrence of a character string between two lines,
+ type :#,#s/old/new/g where #,# are the line numbers of the range
+ of lines where the substitution is to be done.
+ Type :%s/old/new/g to change every occurrence in the whole file.
+ Type :%s/old/new/gc to find every occurrence in the whole file,
+ with a prompt whether to substitute or not.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4 SUMMARY
+
+
+ 1. CTRL-G displays your location in the file and the file status.
+ G moves to the end of the file.
+ number G moves to that line number.
+ gg moves to the first line.
+
+ 2. Typing / followed by a phrase searches FORWARD for the phrase.
+ Typing ? followed by a phrase searches BACKWARD for the phrase.
+ After a search type n to find the next occurrence in the same direction
+ or N to search in the opposite direction.
+ CTRL-O takes you back to older positions, CTRL-I to newer positions.
+
+ 3. Typing % while the cursor is on a (,),[,],{, or } goes to its match.
+
+ 4. To substitute new for the first old in a line type :s/old/new
+ To substitute new for all 'old's on a line type :s/old/new/g
+ To substitute phrases between two line #'s type :#,#s/old/new/g
+ To substitute all occurrences in the file type :%s/old/new/g
+ To ask for confirmation each time add 'c' :%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.1: HOW TO EXECUTE AN EXTERNAL COMMAND
+
+
+ ** Type :! followed by an external command to execute that command. **
+
+ 1. Type the familiar command : to set the cursor at the bottom of the
+ screen. This allows you to enter a command-line command.
+
+ 2. Now type the ! (exclamation point) character. This allows you to
+ execute any external shell command.
+
+ 3. As an example type ls following the ! and then hit <ENTER>. This
+ will show you a listing of your directory, just as if you were at the
+ shell prompt. Or use :!dir if ls doesn't work.
+
+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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.2: MORE ON WRITING FILES
+
+
+ ** To save the changes made to the text, type :w FILENAME **
+
+ 1. Type :!dir or :!ls to get a listing of your directory.
+ You already know you must hit <ENTER> after this.
+
+ 2. Choose a filename that does not exist yet, such as TEST.
+
+ 3. Now type: :w TEST (where TEST is the filename you chose.)
+
+ 4. This saves the whole file (the Vim Tutor) under the name TEST.
+ To verify this, type :!dir or :!ls again to see your directory.
+
+NOTE: If you were to exit Vim and start it again with vim TEST , the file
+ would be an exact copy of the tutor when you saved it.
+
+ 5. Now remove the file by typing (Windows): :!del TEST
+ or (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.3: SELECTING TEXT TO WRITE
+
+
+ ** To save part of the file, type v motion :w FILENAME **
+
+ 1. Move the cursor to this line.
+
+ 2. Press v and move the cursor to the fifth item below. Notice that the
+ text is highlighted.
+
+ 3. Press the : character. At the bottom of the screen :'<,'> will appear.
+
+ 4. Type w TEST , where TEST is a filename that does not exist yet. Verify
+ that you see :'<,'>w TEST before you press <ENTER>.
+
+ 5. Vim will write the selected lines to the file TEST. Use :!dir or :!ls
+ to see it. Do not remove it yet! We will use it in the next lesson.
+
+NOTE: Pressing v starts Visual selection. 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 deletes the text.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.4: RETRIEVING AND MERGING FILES
+
+
+ ** To insert the contents of a file, type :r FILENAME **
+
+ 1. Place the cursor just above this line.
+
+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 :r TEST 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.
+
+NOTE: You can also read the output of an external command. For example,
+ :r !ls reads the output of the ls command and puts it below the
+ cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5 SUMMARY
+
+
+ 1. :!command executes an external command.
+
+ Some useful examples are:
+ (Windows) (Unix)
+ :!dir :!ls - shows a directory listing.
+ :!del FILENAME :!rm FILENAME - removes file FILENAME.
+
+ 2. :w FILENAME writes the current Vim file to disk with name FILENAME.
+
+ 3. v motion :w FILENAME saves the Visually selected lines in file
+ FILENAME.
+
+ 4. :r FILENAME retrieves disk file FILENAME and puts it below the
+ cursor position.
+
+ 5. :r !dir reads the output of the dir command and puts it below the
+ cursor position.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.1: THE OPEN COMMAND
+
+
+ ** Type o to open a line below the cursor and place you in Insert mode. **
+
+ 1. Move the cursor to the first line below marked --->.
+
+ 2. Type the lowercase letter o to open up a line BELOW the cursor and place
+ you in Insert mode.
+
+ 3. Now type some text and press <ESC> to exit Insert mode.
+
+---> After typing o 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 , rather
+ than a lowercase o. Try this on the line below.
+
+---> Open up a line above this by typing O while the cursor is on this line.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.2: THE APPEND COMMAND
+
+
+ ** Type a to insert text AFTER the cursor. **
+
+ 1. Move the cursor to the start of the first line below marked --->.
+
+ 2. Press e until the cursor is on the end of li .
+
+ 3. Type an a (lowercase) to append text AFTER the cursor.
+
+ 4. Complete the word like the line below it. Press <ESC> to exit Insert
+ mode.
+
+ 5. Use e 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.
+---> This line will allow you to practice appending text to a line.
+
+NOTE: a, i and 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 to replace more than one character. **
+
+ 1. Move the cursor to the first line below marked --->. Move the cursor to
+ the beginning of the first xxx .
+
+ 2. Now press R and type the number below it in the second line, so that it
+ replaces the xxx .
+
+ 3. Press <ESC> to leave Replace mode. Notice that the rest of the line
+ remains unmodified.
+
+ 4. Repeat the steps to replace the remaining xxx.
+
+---> 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.4: COPY AND PASTE TEXT
+
+
+ ** Use the y operator to copy text and p to paste it **
+
+ 1. Move to the line below marked ---> and place the cursor after "a)".
+
+ 2. Start Visual mode with v and move the cursor to just before "first".
+
+ 3. Type y to yank (copy) the highlighted text.
+
+ 4. Move the cursor to the end of the next line: j$
+
+ 5. Type p to put (paste) the text. Then type: a second <ESC> .
+
+ 6. Use Visual mode to select " item.", yank it with y , move to the end of
+ the next line with j$ and put the text there with p .
+
+---> a) this is the first item.
+ b)
+
+ NOTE: You can also use y as an operator: yw yanks one word,
+ yy yanks the whole line, then p puts that line.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.5: SET OPTION
+
+
+ ** Set an option so a search or substitute ignores case **
+
+ 1. Search for 'ignore' by entering: /ignore <ENTER>
+ Repeat several times by pressing n .
+
+ 2. Set the 'ic' (Ignore case) option by entering: :set ic
+
+ 3. Now search for 'ignore' again by pressing n
+ Notice that Ignore and IGNORE are now also found.
+
+ 4. Set the 'hlsearch' and 'incsearch' options: :set hls is
+
+ 5. Now type the search command again and see what happens: /ignore <ENTER>
+
+ 6. To disable ignoring case enter: :set noic
+
+NOTE: To remove the highlighting of matches enter: :nohlsearch
+NOTE: If you want to ignore case for just one search command, use \c
+ in the phrase: /ignore\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6 SUMMARY
+
+ 1. Type o to open a line BELOW the cursor and start Insert mode.
+ Type O to open a line ABOVE the cursor.
+
+ 2. Type a to insert text AFTER the cursor.
+ Type A to insert text after the end of the line.
+
+ 3. The e command moves to the end of a word.
+
+ 4. The y operator yanks (copies) text, p puts (pastes) it.
+
+ 5. Typing a capital R enters Replace mode until <ESC> is pressed.
+
+ 6. Typing ":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
+ 'hls' 'hlsearch' highlight all matching phrases
+ You can either use the long or the short option name.
+
+ 7. Prepend "no" to switch an option off: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7.1: GETTING HELP
+
+
+ ** Use the on-line help system **
+
+ Vim has a comprehensive on-line help system. To get started, try one of
+ these three:
+ - press the <HELP> key (if you have one)
+ - press the <F1> key (if you have one)
+ - type :help <ENTER>
+
+ Read the text in the help window to find out how the help works.
+ Type CTRL-W CTRL-W to jump from one window to another.
+ Type :q <ENTER> 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 w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7.2: CREATE A STARTUP SCRIPT
+
+
+ ** Enable Vim features **
+
+ Vim has many more features than Vi, but most of them are disabled by
+ default. To start using more features you should create a "vimrc" file.
+
+ 1. Start editing the "vimrc" file. This depends on your system:
+ :e ~/.vimrc for Unix
+ :e ~/_vimrc for Windows
+
+ 2. Now read the example "vimrc" file contents:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Write the file with:
+ :w
+
+ 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
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7.3: COMPLETION
+
+
+ ** Command line completion with CTRL-D and <TAB> **
+
+ 1. Make sure Vim is not in compatible mode: :set nocp
+
+ 2. Look what files exist in the directory: :!ls or :!dir
+
+ 3. Type the start of a command: :e
+
+ 4. Press CTRL-D and Vim will show a list of commands that start with "e".
+
+ 5. Type d<TAB> and Vim will complete the command name to ":edit".
+
+ 6. Now add a space and the start of an existing file name: :edit FIL
+
+ 7. Press <TAB>. Vim will complete the name (if it is unique).
+
+NOTE: Completion works for many commands. Just try pressing CTRL-D and
+ <TAB>. It is especially useful for :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7 SUMMARY
+
+
+ 1. Type :help or press <F1> or <HELP> to open a help window.
+
+ 2. Type :help cmd to find help on cmd .
+
+ 3. Type CTRL-W CTRL-W to jump to another window.
+
+ 4. Type :q to close the help window.
+
+ 5. Create a vimrc startup script to keep your preferred settings.
+
+ 6. When typing a : command, press CTRL-D to see possible completions.
+ Press <TAB> to use one completion.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ This concludes the Vim Tutor. It 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. Read the user
+ manual next: ":help user-manual".
+
+ For further reading and studying, this book is recommended:
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+ The first book completely dedicated to Vim. Especially useful for beginners.
+ There are many examples and pictures.
+ See https://iccf-holland.org/click5.html
+
+ This book is older and more about Vi than Vim, but also recommended:
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+ It is a good book to get to know almost anything you want to do with Vi.
+ The sixth edition also includes information on Vim.
+
+ 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.
+
+ Modified for Vim by Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.bar b/runtime/tutor/tutor.bar
new file mode 100644
index 0000000..ec30edd
--- /dev/null
+++ b/runtime/tutor/tutor.bar
@@ -0,0 +1,981 @@
+===============================================================================
+= G o t i k a m i n n W I M M - S c h a i n e r - Fassung 1.7 =
+===============================================================================
+
+ Dyr Wimm ist ayn gro mchtigs Blat, ds was mit aynn Wsn Befelh aufwartt; z
+ vil, d myn s allsand in aynn Schainer wie dnn daader unterbrng. Der
+ Schainer ist yso aufbaut, d yr halt netty die Befelh allsand bringt, wost
+ brauchst, dst mit iem fr s Eerste wirklich bbs anfangen kanst.
+ Durchhinarechtn kanst di, wennst willst, in ayner halbetn Stund; ds haisst,
+ wennst di nit groo mit n Prbln und Tftln aufhaltst.
+
+ OBACHT:
+ Die Faudungen, wost daader finddst, gaand istig s Gwort ndern. Dsswgn
+ machst eyn n Bstn glei ayn Aamum von derer Dautticht daader. Haast alsnan
+ ds Gwort daader mit n Befelh "vimtutor bar" ausherlaassn, ist s ee schoon
+ ayn Aamum.
+ Mir kan s nit oft gnueg sagn, d der Schainer daader istig gan n ebn
+ ghoert. Also muesst schoon aau die Befelh +ausfern, wennst ys gscheid ler-
+ nen willst. Mit n Lsn yllain ist s +nit taan!
+
+ Ietz schaust grad non, d dein Fststlltastn nit druckt ist; und aft geest
+ glei aynmaal mit dyr j-Tastn abwrts (yso laaufft ds nmlich), hinst dst
+ de gantze Letzn 1.1 auf n Bildschirm haast.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.1: MIT N MRKL UMAYNANDFARN
+
+** Dyrmitst mit n Mrkl umaynandkimmst, druck h, j, k und l wie unt zaigt. **
+ ^ Ayn slsbrugg:
+ k De Tastn h ist winster und +geet aau gan winster.
+ < h l > S l leit zesm und richtt si gan zesm.
+ j S j kan myn wie aynn Pfeil gan unt seghn.
+ v Mit n k kimmst gan n KOPF.
+ 1. Ietz ruedertst ainfach mit n Mrkl auf n Bildschirm umaynand, hinst dst
+ di sicher felst.
+ 2. Halt d Abhin-Tastn (j) druckt; aft rumplt s ainfach weiter. Netty yso
+ kimmst gan dyr naehstn Letzn.
+
+ 3. Wie gsait, ietz bewgst di also mit derer Tastn gan dyr Letzn 1.2.
+
+Non bbs: Allweil, wenn dyr niemer ganz wol ist, wasst bbenn druckt haast, aft
+ zipfst <ESC> ; naacher bist wider ganz gwon in dyr Befelhs-Artweis.
+
+
+ Nbnbei gsait kimmst gwonerweil aau mit de Pfeiltastnen weiter. Aber
+ hjkl seind z haissn s Wimm-Urgstain; und de "Hrtn" seind ganz dyr-
+ fr, d myn bei +dene bleibt. Prblt s ainfach aus!
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.2: NN WIMM AUSSCHALTTN
+
+
+ ALSO, EE WENNST BBS VON DAA UNT AUSFERST, LIS LIEBER ZEERST DE GANTZE LET-
+ ZN!
+
+ 1. Druck d <ESC>-Tastn, dyrmitst aau gwi in dyr Befelhs-Artweis bist.
+
+ 2. Demmlt :q!<EIN> .
+ Daa dyrmit benddst ys Blat und verwirffst allss, wasst bbenn gndert
+ haast.
+
+ 3. Balst nn Eingib seghst, gib d Faudung ein, wo di zo dnn Schainer brun-
+ gen haat, also vimtutor bar<EIN> .
+
+ 4. Also, wenn ietz allsse sitzt, naacherd ferst d Schritt 1 hinst 3 aus, mit
+ wasst ys Blat verlaasst und aft wider einhinkimmst.
+
+Anmrkung: Mit :q!<EIN> verwirffst allss, wasst gndert older enther gschribn
+ haast. In aynn ttlych Letznen lernst acht, wiest ds allss in ayner
+ Dautticht speichertst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.3: GWORT BARECHTN - LSCHN
+
+
+ ** Druck x , dyrmitst ds Zaichen unter n Mrkl lschst. **
+
+ 1. Bewg di mit n Mrkl auf de mit ---> angmrkte Zeil unt.
+
+ 2. Zo n Faeler Verbssern farst mit n Mrkl netty auf ds Zaichen, ds wo
+ glscht ghoert.
+
+ 3. Druck de Tastn x , dst ds berflssige Zaichen lschst.
+
+ 4. Ietz tuest so lang weiter mit 2 hinst 4, hinst d dyr Saz stimmt.
+
+---> De Kkuue sprangg bber nn Maanad.
+
+ 5. Wenn ietz de Zeil verbssert ist, geest gan dyr Letzn 1.4. weiter.
+
+Und ganz wichtig: Dyrweilst dnn Schainer durcharechtst, versuech nit bbenn,
+ allss auswendig z lernen; nn, lern ainfach mit n Anwenddn!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.4: GWORT BARECHTN - EINFEGN
+
+
+ ** Druck i , dyrmitst bbs einfegst. **
+
+ 1. Bewg nn Mrkl zo dyr eerstn untignen Zeil, wo mit ---> angeet.
+
+ 2. Dyrmitst de eerste Zeil wie de zwaitte machst, bewg nn Mrkl auf ds
+ eerste Zaichen NAACH derer Stll, daa wo s Gwort eingfegt werdn sollt.
+
+ 3. Druck i und gib ds ein, was abgeet.
+
+ 4. Wenn ieweils ayn Faeler verweitert ist, aft druck <ESC> ; dyrmit kimmst
+ gan dyr Befelhsartweis zrugg.
+ So, und ietz tuest ainfach yso weiter, hinst d dyr Saz stimmt.
+
+---> Daader gt dd bbs b.
+---> Daader geet diend bbs ab.
+
+ 5. Balst mainst, dst ys Gwort-Einfegn kanst, aft geest gan dyr Letzn 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.5: GWORT BARECHTN - ANFEGN
+
+
+ ** Druck A gan n Gwort Anfegn. **
+
+ 1. Gee mit n Mrkl gan dyr eerstn untignen Zeil, wo ayn ---> dyrvor haat.
+ Daa ist s gleich, wo gnaun dyr Mrkl in derer Zeil steet.
+
+ 2. Demmlt A und gib de entsprchetn Ergntzungen ein.
+
+ 3. Wennst mit n Anfegn frtig bist, aft druckst <ESC> , dst wider eyn de
+ Befelhsartweis zruggkimmst.
+
+ 4. So, und ietz geest aft non gan dyr zwaittn mit ---> angmrktn Zeil; und
+ daadl machst ys netty yso.
+
+---> In derer Zeil gee
+ In derer Zeil geet ayn Weeng ayn Gwort ab.
+---> Aau daader stee
+ Aau daader steet bbs Unvollstndigs.
+
+ 5. Wennst s Anfegn von Gwort drauf haast, naacherd gee gan dyr Letzn 1.6.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.6: AYN DAUTTICHT BARECHTN
+
+
+ ** Mit :wq speichertst ayn Dautticht und verlaasst nn Wimm ganz. **
+
+ !! OBACHT: Ee wennst mit dnn alln daa unt weitertuest, lis zeerst de gantze
+ Letzn durch!!
+
+ 1. Verlaa also s Blat, wie s in dyr Letzn 1.2. haisst, mit :q! !
+
+ 2. Gib d Faudung eyn n Eingib ein: vim Schainer<EIN> . 'vim' ruefft s Blat
+ auf, und 'Schainer' haisst de Dautticht, wost barechtn willst. Dyrmit
+ haast also ayn Dautticht, d wost barechtn kanst.
+
+ 3. Ietz fegst bbs ein older lschst bbs, wiest ys in de vorignen Letznen
+ glernt haast.
+
+ 4. Speichert de gnderte Dautticht und verlaa nn Wimm mit :wq<EIN> .
+
+ 5. Schmei nn Wimmschainer neu an und gee gan dyr folgetn Zammenfassung.
+
+ 6. Aft dst de obignen Schritt glsn und kppt haast, kanst ys durchfern.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 1
+
+
+ 1. Dyr Mrkl werd mit de Tastnen hjkl older aau mit de Pfeiltastnen gsteuert.
+ h (winst) j (ab) k (auf) l (zes)
+
+ 2. Um nn Wimm umbb n Eingib aus z ginnen, demmlt: vim DAUTTICHT<EIN> .
+
+ 3. Willst nn Wimm verlaassn und aau allss verwerffen, aft gibst ein:
+ <ESC> und :q!<EIN> .
+ Gan n Verlaassn und Speichern aber zipfst <ESC> und :wq<EIN> .
+
+ 4. Willst ds Zaichen lschn, daa wo dyr Mrkl drauf ist, demmltst x .
+
+ 5. Willst bbs vor n Mrkl eingbn, zipfst i und drafter <ESC> .
+ Mechst ys aber eyn s Zeilnend anhinhngen, benutzt ys A .
+ Und ainfach naach n Mrkl fegst ys mit a ein.
+
+Anmrkung: Druckst <ESC> , kimmst eyn de Befelhsartweis zrugg older brichst
+ ayn Faudung ab, d wo dyr schiefgangen ist.
+
+ Ietz tue mit dyr Letzn 2 weiter.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.1.: LSHFAUDUNGEN
+
+
+ ** Demmlt dw , dyrmitst ayn Wort lschst. **
+
+ 1. Druck <ESC> , dyrmit s aau gwi ist, dst in dyr Befelhsartweis bist.
+
+ 2. Bewg nn Mrkl zo dyr mit ---> angmrktn Zeil unt.
+
+ 3. Und daa geest ietz auf n Anfang von aynn Wort, ds wo glscht ghoert.
+
+ 4. Zipf dw , dst ds gantze Wort lschst.
+
+ Nbnbei: Dyr Buechstabn d erscheint auf dyr lsstn Zeil von n Bildschirm,
+ sobaldst n eingibst. Dyr Wimm wartt ietz drauf, d bbs kimmt, al-
+ so daader ayn w . Seghst freilich bbs Anderts wie ayn d ,
+ naacherd haast bbs Falschs demmlt. Druck aft <ESC> und prblt
+ s non aynmaal.
+---> Ayn ttlych Wrter lustig ghoernd nit Fisper eyn dnn Saz einhin.
+
+ 5. fert d Schritt 3 und 4, hinst d dyr Saz psst, und gee aft gan dyr
+ Letzn 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.2.: NON MEERER LSHFAUDUNGEN
+
+
+ ** Gib d$ ein, dst hinst eyn s Zeilnend lschst. **
+
+ 1. Druck <ESC> , dyrmitst aau gwi in dyr Befelhsartweis bist.
+
+ 2. Bewg nn Mrkl hinst eyn de mit ---> angmrkte Zeil untn.
+
+ 3. Gee mit n Mrkl auf s End von dyr faelerfreien Zeil, NAACH n eerstn . .
+
+ 4. Zipf d$ , dst hinst eyn s End von dyr Zeil lschst.
+
+---> bber haat s End von dyr Zeil doplt eingbn. doplt eingbn.
+
+
+ 5. Gee weiter gan dyr Letzn 2.3, dyrmitst versteest, was daader ablaaufft.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.3: PFEMERER UND WOLENDER
+
+
+ Vil Faudungen, wo s Gwort ndernd, stznd si aus aynn Pfemerer und aynn Wo-
+ lend zamm. Bal i also bbs lschn will, schreib i ainsting d und aft s "Wo-
+ lend", ds haisst also, "wolend", "wohin" d i will - older was i halt gnaun
+ lschn will.
+
+
+
+
+
+
+ Daader also, was i wie lschn kan:
+ w - hinst eyn n Anfang von n naehstn Wort AANE dnn sein eersts Zaichen.
+ e - gan n End von n ietzundn Wort MIT dnn seinn lsstn Zaichen.
+ $ - zo n End von dyr Zeil MIT derer irn lsstn Zaichen.
+
+ Also lscht de Tastnfolg de allss umbb n Mrkl hinst eyn s Wortend.
+Anmrkung: Gib i grad ds zwaitte Zaichen yllain ein, ruckt halt dyr Mrkl
+ entsprchet weiter.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.4: MIT AYNN ZLER D WOLENDER FERN
+
+
+ ** Gib i ayn Zal vor aynn Wolend ein, werd ds Sel entsprchet oft gangen. **
+
+ 1. Bewg nn Mrkl gan n Anfang von dyr Zeil mit ---> dyrvor unt.
+
+ 2. Zipf 2w , dst mit n Mrkl zwai Wrter weitergeest.
+
+ 3. Zipf 3e , dst mit n Mrkl auf s End von n drittn Wort kimmst.
+
+ 4. Zipf 0 (aynn Nuller), dst eyn n Anfang von dyr Zeil hinkimmst.
+
+ 5. Widerhol d Schritt 2 und 3 mit verschaidne Zler.
+
+ ---> Ds ist ietz grad ayn Zeil zo n drinn Umaynanderruedern.
+
+ 6. Gee weiter gan dyr Letzn 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.5: DURCH AYNN ZLER GLEI MEERER LSCHN
+
+
+ ** Ayn Zal vor aynn Pfemerer fert dnn entsprchet oft aus. **
+
+ Also, i mecht lschn, und zwaar bbs Bestimmts, und ds so und so oft: Daa
+ dyrzue benutz i aynn Zler:
+ d Zler Wolend (also nn Bewgungsschrit)
+
+ 1. Bewg nn Mrkl zo n eerstn Wort in GROOSSBUECHSTABN in dyr mit ---> an-
+ gmrktn Zeil.
+
+ 2. Demmlt d2w , dyrmitst de ganz groogschribnen Wrter lschst.
+
+ 3. fert d Schritt 1 und 2 mit dnn entsprchetn Zler, dyrmitst de drauf-
+ folgetn ganz grogschribnen Wrter mit ayner ainzignen Faudung lschst:
+
+
+---> D ABC DE Zeil FGHI JK LMN OP mit Wrter ist Q RS TUV ietz berichtigt.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.6: ARECHTN AUF ZEILN
+
+
+ ** Zipf dd , um ayn gantze Zeil z lschn. **
+
+ Weil s gro oft vrkimmt, d myn gantze Zeiln lscht, kaamend schoon d Ent-
+ wickler von n Urwimm daa drauf, d myn ainfach dd gan dnn Zwk schreibt.
+
+
+ 1. Bewg nn Mrkl gan dyr zwaittn Zeil in n untignen "Gedicht".
+ 2. Zipf dd , um d Zeil z lschn.
+ 3. Ietz bewgst di gan dyr viertn Zeil.
+ 4. Zipf 2dd , um zwo Zeiln zo n Lschn.
+
+---> 1) Roosn seind root;
+---> 2) Drunter ist s Koot.
+---> 3) Veigerln seind blau.
+---> 4) Umgrabn tuet s d Sau.
+---> 5) D Ur sait de Zeit,
+---> 6) Sait, d s mi freut,
+---> 7) Dirndl, dein Gschau.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.7: RUGGGNGIG MACHEN (RUGGLN)
+
+
+ ** Zipf u , dyrmitst de lsstn Faudungen ruggltst **
+ ** older U , um ayn gantze Zeil widerherzstlln. **
+
+ 1. Bewg nn Mrkl gan dyr mit ---> angmrktn Zeil unt und gee dyrmit auf n
+ eerstn Faeler.
+ 2. Zipf x , dst ds eerste z vile Zaichen lschst.
+ 3. Ietz demmlt u , dyrmitst de lsste Faudung ruggltst.
+ 4. Ietz behb allsand Faeler auf dyr Zeil mit dyr Hilf von n Befelh x .
+ 5. Aft gibst ayn U (groo) ein, dst de Zeil wider yso hinbringst, wie s
+ gwsn ist.
+ 6. So, und ietz demmltst so oft u , hinst dst s U und de andern Fau-
+ dungen rugggngig gmacht haast.
+ 7. Und ietzet widerum schreibst so oft <STRG>r , hinst dst allsand Be-
+ felh widerhergstllt, z haissn allsse rugg-grugglt haast (also d Rugggn-
+ gigmachungen rugggngig gmacht).
+---> Beerichtig d Faeller voon dehrer Zeiil und sttll s mitt n Ruggruggln wi-
+ der her.
+ 8. Die Faudungen seind gro wichtig; s helffend ainn nrrisch weiter.
+ Ietz gee weiter gan dyr Zammenfassung von dyr Letzn 2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 2
+
+
+ 1. Um von n Mrkl aus hinst eyn s naehste Wort zo n Lschn, zipf: dw
+ 2. Um umbb n Mrkl hinst eyn s End von dyr Zeil zo n Lschn, demmlt d$
+ 3. Dyrmitst ayn gantze Zeil lschst, gib ein: dd
+ 4. Mechst ayn Bewgung, ayn "Wolend", fters, stll de entsprchete Zal dyr-
+ vor: 3dw older aau: d3w
+ 5. Dyr Pfueg fr ayn nderungsfaudung lautt yso:
+ Pfemerer [Zal] Bewgungsschrit (Wolend)
+ Und ds haisst:
+ Dyr PFEMERER gibt an, WAS taan ghoert, bbenn d = lschn (delete).
+ [ZAL] - Ayn Zal KAN myn angbn, wenn myn halt ayn Wolend fter habn will.
+ S WOLEND, also dyr Schrit WOHIN, besagt, auf was i aushin will, bbenn
+ auf aynn Wortanfang ( w ), s End von dyr Zeil ( $ ) und so weiter.
+
+ 6. Dst eyn n Anfang von dyr Zeil hinkimmst, schreib aynn Nuller: 0
+
+ 7. Um bbs Vorigs wider z ruggln, gib ein: u (klain also)
+ Um allsand nderungen in ayner Zeil z ruggln, haast: U (also groo)
+ Um "rugg-z-ruggln", also allss wider herzstlln, zipf: <STRG>r
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 3.1: ANFEGN (put)
+
+
+ ** Zipf p , dyrmitst bbs gnetty Glschts naach n Mrkl anfegst. **
+
+ 1. Bewg nn Mrkl gan dyr eerstn untignen Zeil mit ---> dyrvor.
+
+ 2. Zipf dd , um sele Zeil z lschn und dyrmit in ayner Wimm-Osn zo n Spei-
+ chern.
+
+ 3. Bewg nn Mrkl gan dyr Zeil c), BER derer, daa wo de glschte Zeil ein-
+ hinkemmen sollt.
+
+ 4. So, und ietz gibst ainfach p ein, und schoon haast d Zeil unter derer
+ mit n Mrkl drinn.
+ 5. fert d Schritt 2 hinst 4, hinst dst allsand Zeiln yso naachynaynand
+ haast, wie s hinghoernd.
+
+---> d) Kanst du ds aau?
+---> b) Veigerln seind blau.
+---> c) Bedachtn kan myn lernen.
+---> a) Roosn seind root.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 3.2: ERSTZN (replace)
+
+
+ ** Zipf rx , um ds Zaichen unter n Mrkl durch x z erstzn. **
+
+ 1. Bewg nn Mrkl zo dyr eerstn untignen Zeil mit ---> dyrvor.
+
+ 2. Bewg nn Mrkl, hinst d yr auf n eerstn Faeler steet.
+
+ 3. Zipf r und drafter ds Zaichen, wo dyrfr daa hinghoert.
+
+ 4. Widerhol d Schritt 2 und 3, hinst dst de eerste Zeil gmae dyr zwaittn
+ berichtigt haast:
+---> Wie d Zeit eingobn wurd, wurdnd ainike falsche Zastnen zipft!
+---> Wie d Zeil eingbn wurd, wurdnd ainige falsche Tastnen zipft!
+
+ 5. Ietz tue mit dyr Letzn 3.3 weiter.
+
+Anmrkung: Vergi nit drauf, dst mit n Anwenddn lernen solltst und nit bbenn
+ mit n Auswendiglernen!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 3.3: NDERN (change)
+
+
+ ** Um hinst eyn s Wortend z ndern, zipf ce . **
+
+ 1. Gee mit n Mrkl auf de eerste mit ---> angmrkte Zeil.
+
+ 2. Ietz farst netty auf s "s" von Wstwr hin.
+
+ 3. Zipf ce ein und aft d Wortberichtigung, daader also rter .
+
+ 4. Druck <ESC> und bewg nn Mrkl zo n naehstn Zaichen, wo gndert ghoert.
+
+ 5. fert d Schritt 3 und 4, hinst d dyr eerste Saz wie dyr zwaitte ist.
+
+---> Ainige Wstwr von derer Zlww ghhnnd mit n ndern-Pfemerer gaauu.
+---> Ainige Wrter von derer Zeil ghoernd mit n ndern-Pfemerer gndert.
+
+ce lscht also s Wort und schlaaufft di eyn d Eingaab-Artweis.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 3.4.: NON MEERER NDERUNGEN PFELFS c
+
+
+ ** D Lshfaudung c arechtt mit de nmlichnen Wolender wie d mit d **
+
+ 1. Dyr nder-Pfemerer arechtt anleich wie d Lshfaudung mit d , und zwaar
+ yso:
+ c [Zal] Bewgungsschrit (Wolend)
+
+ 2. D Wolender seind de gleichn, bbenn w fr Wort und $ fr s Zeilnend.
+
+
+ 3. Bewg di zo dyr eerstn untignen Zeil mit ---> .
+
+ 4. Ietz geest auf dnn eerstn Faeler.
+
+ 5. Zipf c$ , gib nn Rest von dyr Zeil wie in dyr zwaittn ein und druck aft
+ <ESC>.
+---> S End von derer Zeil sollt an de zwaitte daader anglichen werdn.
+---> S End von derer Zeil sollt mit n Befelh c$ berichtigt werdn.
+
+Denk allweil dran, dst iederzeit mit dyr Ruggtastn Faeler ausbssern kanst.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 3
+
+
+ 1. Um ayn vorher glschts Gwort anzfegn, zipf p . Daa dyrmit werd ds
+ gantze Gwort NAACH n Mrkl angfegt. Wenn s ayn gantze Zeil gwsn ist,
+ werd d sel als de Zeil unterhalb n Mrkl eingfegt.
+
+ 2. Um ds Zaichen unter n Mrkl, also wo dyr Mrkl ist, z erstzn, zipf r
+ und aft ds Zaichen, wost daadl habn willst.
+
+ 3. Dyr nderungspfemerer ( c = change) laasst ainn umbb n Mrkl hinst eyn s
+ End von n Wolend ndern. Zipf ce , dyrmitst umbb n Mrkl hinst eyn s End
+ von n Wort ndertst, und c$ hinst eyn s End von dyr Zeil.
+
+ 4. Fr d nderung lautt dyr Pfueg:
+
+ c [Zal] Wolend
+
+Ietz tue mit dyr naehstn Letzn weiter.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 4.1: MRKLSTLLUNG UND DAUTTICHTDARSTAND
+
+** Demmlt <STRG>g, dst nn Befand und Darstand von dyr Dautticht anzaigst. **
+ ** Zipf G , dyrmitst auf ayn bestimmte Zeil in dyr Dautticht hinkimmst. **
+
+Anmrkung: Lis d gantze Letzn daader durch, ee wennst iewign bbs unternimmst!
+
+ 1. Druck <STRG>g . Auf ds hin erscheint auf derer Seitt ganz unt ayn Dar-
+ standsmeldung mit n Dauttichtnam und n Befand innerhalb dyr Dautticht.
+ Mrk dyr de Zeilnnummer fr n Schrit 3.
+
+Anmrkung: Mglicherweis seghst aau nn Mrklbefand in n zesmen untern Bild-
+ schirmgg. Aft ist s "Lindl" (ruler) eingstllt; meerer ber ds
+ laasst dyr dyr Befelh :help 'ruler' ausher.
+ 2. Druck G , um an s End von dyr Dautticht z kemmen.
+ gg gibst ein, dst gan n Anfang von dyr Dautticht aufhinkimmst.
+
+ 3. Gib d Nummer von derer Zeil ein, daa wost vorher warst, und aft non G .
+ Ds bringt di zrugg gan seler Zeil, daa wost stuenddst, wiest ds eerste
+ Maal <STRG>g gadruckst.
+
+ 4. Wennst di sicher gnueg felst, aft fer d Schritt 1 hinst 3 aus.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 4.2: DYR BEFELH ZO N SUECHEN
+
+
+ ** Zipf / und dyrnaach aynn Ausdruk, um selbignen zo n Suechen. **
+
+ 1. Du gibst also in dyr Befelhsartweis s Zaichen / ein. Ds sel wie aau dyr
+ Mrkl erscheinend drauf unt auf n Schirm, netty wie bei dyr Faudung : .
+
+ 2. Ietz zipf Faeeler<EIN> . Netty um ds 'Faeeler' willst ietz suechen.
+
+ 3. Willst um gnaun dnn Ausdruk weitersuechen, zipf ainfach n (wie next).
+ Willst hinzrugg suechen, aft gibst N ein.
+
+ 4. Um von Haus aus zruggaus z suechen, nimm ? statt / her.
+
+ 5. Dyrmitst wider daa hinkimmst, wost herkemmen bist, nimm <STRG>o , und ds
+ fter, wennst weiter zrugg willst. Mit <STRG>i widerum kimmst vorwrts.
+
+---> Aynn Faeler schreibt myn nit "Faeeler"; Faeeler ist ayn Faeler
+
+Anmrkung: Wenn d Suech s Dauttichtend dyrraicht haat, geet s eyn n Anfang wi-
+ der weiter dyrmit, men Sach dyr Schaltter 'wrapscan' wr auf aus.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 4.3: DE GGNKLAMMERN FINDDN
+
+
+ ** Zipf % , um de entsprchete Klammer ) , ] older } z finddn. **
+
+ 1. Stz nn Mrkl auf iewign aine von dene drei Klammern ( , [ older {
+ in dyr untignen Zeil, wo mit ---> angmrkt ist.
+
+ 2. Ietzet zipf s Zaichen % .
+
+ 3. Dyr Mrkl geet ietz auf de pssete schliessete Klammer.
+
+ 4. Ietz demmlt % , und dyrmit kimmst gan dyr ffneretn Klammer zrugg.
+
+ 5. Stz nn Mrkl auf ayn anderne Klammer von ({[]}) und prblt % aus.
+
+---> Ds ( ist bloo ayn Pochzeil ( mit [ verschaidne ] { Klammern } drinn. ))
+
+Anmrkung: Um d Mglichkeit gaast bsunders froo sein, wennst aynmaal in aynn
+ Spaichgwort verzweiflt ayn faelete Ggnklammer suechst!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 4.4: D ERSTZUNGSFAUDUNG (substitute)
+
+
+ ** Zipf :s/alt/neu/g , um 'alt' durch 'neu' zo n Erstzn. **
+
+ 1. Gee mit n Mrkl zo dyr unt steehetn mit ---> angmrktn Zeil.
+
+ 2. Zipf :s/dee/de <EIN> . Der Befelh erstzt alsnan grad ds +eerste "dee",
+ wo vrkimmt.
+
+ 3. Ietz prblt s mit :s/dee/de/g . Ds zuestzliche g ("Pflok" nennt myn
+ bbs Slchers) bewirkt, d allss, was dyrmit kennzaichnet ist, innerhalb
+ von dyr ainn Zeil erstzt werd.
+
+---> Dee schoenste Zeit, d myn dee Blemln anschaut, ist dee schoene Lan-
+ gesszeit.
+ 4. Um ietz allsand Suechbegriff innerhalb von zwo Zeiln zo n ndern, zipf
+ :#,#s/alt/neu/g , wobei # ieweils fr de eerste und lsste Zeil von dnn
+ Pfraich steet.
+ :%s/alt/neu/g zipfst, dst d Vrkemmen in dyr gantzn Dautticht ndertst.
+ Mit :%s/alt/neu/gc finddst allsand Vrkemmen in dyr gsamtn Dautticht;
+ daa werst aber zeerst non gfraagt, obst ys erstzn willst older nity.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 4
+
+ 1. <STRG>g zaigt dnn ietzundn Dauttichtbefand und nn Darstand dyrvon an.
+ G bringt di an s End von dyr Dautticht.
+ <Zal>G bringt di gan dyr entsprchetn Zeilnnummer.
+ <Zal>gg geet +grad yso.
+ gg bringt di zo dyr eerstn Zeil.
+ 2. D Eingaab von / mit aynn Ausdruk suecht VRSHLING um dnn Ausdruk.
+ Gibst ? und aynn Suechbegrif ein, suecht s um dnn RSHLING.
+ Zipf naach ayner Suech n ; naacherd werd in de gleiche Richtung weiter-
+ gsuecht. Mit N geet s umkeerter weiter.
+ <STRG>o bringt di zo lterne Befndd zrugg, <STRG>i zo neuerne.
+
+ 3. D Eingaab von % , wenn dyr Mrkl auf ainer von dene Klammern steet: ({[
+ )]} , bringt di zo dyr Ggnklammer.
+
+ 4. Um ds eerste Vrkemmen von "alt" in ayner Zeil durch "neu" z erstzn,
+ zipf :s/alt/neu .
+ Um allsand in ayner Zeil z erstzn, zipf :s/alt/neu/g .
+ Mechst allss in zwo Zeiln erstzn, demmlt zo n Beispil :5,6s/alt/neu/g .
+ Mechst allss in dyr gantzn Dautticht erstzn, gib ein: :%s/alt/neu/g .
+ Willst ayn ieds Maal bstaetln, hng 'c' wie confirm hint anhin.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 5.1: ZWISCHNDRINN AYNN AUSSERIGNEN BEFELH AUSFERN
+
+
+ ** Willst ayn Gffaudung ausfern, gib ainfach d sel naach :! ein. **
+
+ 1. Zipf dnn bekanntn Befelh : , dyrmitst mit n Mrkl auf n Bildschirm
+ ganz abhin kimmst. Draufhin kanst aynn gwonen Gfbefelh eingbn.
+
+ 2. Zeerst kimmt aber non ayn Ruefzaichen ! . Und ietzet haast d Mglich-
+ keit, ayn beliebige ausserige Gffaudung auszfern.
+
+ 3. Als Beispil zipf :!ls<EIN> ; und schoon haast ayn Auflistung von deinn
+ Verzaichniss, netty wie wennst ganz gwon in n Eingib wrst. Geet ls
+ aus iewign aynn Grund nit, aft prblt s mit :!dir<EIN> .
+
+Also non aynmaal: Mit dnn Angang kan ayn iede beliebige ausserige Faudung aus-
+ gfert werdn, aau mit Auerwerdd.
+
+Und wolgmrkt: Alle Befelh, wo mit : angeend, messend mit <EIN> bst-
+ tigt werdn. Ds dyrsagn myr frba +niemer.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 5.2: NON MEERER DRBER, WIE MYN DAUTTICHTN SCHREIBT
+
+
+ ** Um bbs Gnderts neu z speichern, zipf :w NEUER_DAUTTICHTNAM . **
+
+ 1. Zipf :!dir older :!ls , dst dyr ayn Auflistung von deinn Verzaich-
+ niss ausherlaasst. Dst drafter <EIN> eingbn muesst, waisst ee schoon.
+
+ 2. Suech dyr aynn Dauttichtnam aus, dnn wo s non nit geit, bbenn POCH .
+
+ 3. Ietz demmlt: :w POCH (also mit POCH als dnn neuen Dauttichtnam).
+
+ 4. Ds speichert ietz de gantze Dautticht, also nn Wimmschainer, unter dnn
+ Nam POCH. Ds kanst leicht berpreffen, indem dst ainfach :!ls older
+ :!dir zipfst und dyrmit deinn Verzaichnissinhalt seghst.
+
+Anmrkung: Stigst ietz aus n Wimm aus und gnnst n aft wider mit vim POCH ,
+ naacherd wr d Dautticht ayn gnaune Aamum von n Schainer dyrselbn,
+ wiest n gspeichert haast.
+
+ 5. Ietz verweitert d Dautticht - fallsst s Fenstl haast - , mit :!del POCH
+ beziehungsweis bei aynn Unixgebu mit :!rm POCH .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 5.3: AYNN TAIL VON N GWORT ZO N SPEICHERN AUSWALN
+
+** Um aynn Tail von dyr Dautticht z speichern, zipf v [Wolend] :w DAUTTICHT **
+
+ 1. Ruck nn Mrkl auf netty d Zeil daader.
+
+ 2. Demmlt v und gee mit n Mrkl auf dnn fmftn Auflistungspunt untet. Du
+ seghst glei, d s Gwort vrherghbt erscheint.
+
+ 3. Druck s Zaichen : . Ganz unt auf n Bildschirm erscheint :'<,'> .
+
+ 4. Zipf w POCH , wobei s dnn Dauttichtnam POCH non nit geit. Vergwi di,
+ dst ds :'<,'>w POCH aau +seghst, ee wennst <EIN> druckst.
+
+ 5. Dyr Wimm schreibt de ausgwaltn Zeiln eyn de Dautticht POCH einhin. Benutz
+ :!dir older :!ls , dst ds berpreffst. Lsh s fein nit bbenn! Mir
+ brauchend s nmlich fr de naehste Letzn.
+
+Anmrkung: Druckt myn v , ginnt d Sichtisch-Auswal. Du kanst mit n Mrkl um-
+ aynandfarn, um d Auswal z verndern. Drafter kan myn mit yn aynn
+ Pfemerer mit dnn Gwort bbs machen. Zo n Beispil lscht d ds
+ Gwort.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 5.4: EINLSN UND ZAMMENFERN VON DAUTTICHTN
+
+
+ ** Um nn Inhalt von ayner Dautticht einzlsn, zipf :r DAUTTICHTNAM **
+
+ 1. Stz nn Mrkl ber d Zeil daader.
+
+OBACHT: Aft dst nn Schrit 2 ausgfert haast, seghst auf aynmaal bbs aus
+ dyr Letzn 5.3. Bewg di naacherd wider abwrts, dyrmitst d Letzn wi-
+ derfinddst.
+ 2. Ietz lis dein Dautticht POCH ein, indem dst d Faudung :r POCH aus-
+ ferst, wobei wie gsait POCH fr dnn von dir ausgsuechtn Dauttichtnam
+ steet. De einglsne Dautticht werd unterhalb dyr Mrklzeil eingfegt.
+
+ 3. Um zo n berpreffen, ob de Dautticht aau gwi einglsn ist, gee zrugg;
+ und du seghst, d s ietz zwo Ausfrtigungen von dyr Letzn 5.3. geit, s
+ Urniss und de eingfegte Dauttichtfassung.
+
+Anmrkung: Du kanst aau d Ausgaab von aynn Ausserigbefelh einlsn. Zo n Bei-
+ spil list :r !ls d Ausgaab von dyr Faudung ls ein und fegt s
+ unterhalb n Mrkl ein.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 5
+
+
+ 1. :!FAUDUNG fert aynn ausserignen Befelh aus.
+
+ Daader ayn ttlych gwnddte Beispiler:
+ (Fenstl) (Unix - Linux)
+ :!dir :!ls - listt s Verzaichniss auf.
+ :!del DAUTTICHT :!rm DAUTTICHT - verweitert sele Dautticht.
+
+ 2. :w DAUTTICHT speichert de ietzunde Wimmdautticht unter dnn besagtn Nam.
+
+ 3. v WOLEND :w DAUTTICHTNAM schreibt de sichtisch ausgwaltn Zeiln eyn de
+ Dautticht mit seln Nam.
+
+ 4. :r DAUTTICHTNAM ladt sele Dautticht und fegt s unterhalb n Mrklbefand
+ ein.
+
+ 5. :r !dir list d Ausgaab von dyr Faudung dir und fegt s unterhalb n
+ Mrklbefand ein.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.1: ZEIL FFNEN (open)
+
+
+ ** Zipf o , um ayn Zeil unterhalb n Mrkl z ffnen und eyn d **
+ ** Einfegartweis z kemmen. **
+
+ 1. Bewg nn Mrkl zo dyr eerstn mit ---> angmrktn Zeil unt.
+
+ 2. Zipf o (klain), um ayn Zeil UNTERHALB n Mrkl z ffnen und mit dyr Ein-
+ fegartweis weiterztuen.
+
+ 3. Ietzet zipf ayn Weeng bbs und druck <ESC> , um d Einfegartweis z ver-
+ laassn.
+---> Mit o werd dyr Mrkl in dyr Einfegartweis auf de offene Zeil gstzt.
+
+ 4. Um ayn Zeil OBERHALB n Mrkl aufzmachen, gib ainfach ayn groosss O statt
+ yn aynn klainen ein. Versuech ds auf dyr untignen Zeil.
+
+---> ffnet ayn Zeil ber derer daader mit O , wenn dyr Mrkl auf derer Zeil
+ ist.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.2: GWORT ANFEGN (append)
+
+
+ ** Zipf a , um bbs NAACH n Mrkl einzfegn. **
+
+ 1. Bewg nn Mrkl gan n Anfang von dyr eerstn ebungszeil mit ---> unt.
+
+ 2. Druck e , hinst d dyr Mrkl an n End von Zei steet.
+
+ 3. Zipf ayn klains a , um bbs NAACH n Mrkl anzfegn.
+
+ 4. Vergntz ds Wort wie in dyr Zeil drunter. Druck <ESC> , um d Schreib-
+ Artweis z verlaassn.
+
+ 5. Bewg di mit e zo n naehstn ungantzn Wort und widerhol d Schritt 3 und
+ 4.
+
+---> D Ze biett ayn Glgn , ayn Gwort in ayner Zeil anzf.
+---> D Zeil biett ayn Glgnet, ayn Gwort in ayner Zeil anzfegn.
+
+Anmrkung: a , i und A bringend ainn gleichermaan eyn d Einfegartweis;
+ dyr ainzige Unterschaid ist, WO mit n Einfegn angfangt werd.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.3: AYN ANDERNE WEIS ZO N ERSTZN (replace)
+
+
+ ** Demmlt ayn groosss R , um meerer als wie grad ain Zaichen z erstzn. **
+
+ 1. Bewg nn Mrkl zo dyr eerstn untignen, mit ---> angmrktn Zeil.
+ Gee mit n Mrkl gan n Anfang von n eerstn xxx .
+
+ 2. Ietz druck R und zipf sele Zal, wo drunter in dyr zwaittn Zeil steet,
+ yso d de sel s xxx erstzt.
+
+ 3. Druck <ESC> , um d Erstzungsartweis z verlaassn. Du gspannst, d dyr
+ Rest von dyr Zeil unverndert bleibt.
+
+ 4. fert die Schritt, um ds berblibne xxx z erstzn.
+
+---> S Zunddn von 123 zo xxx ergibt xxx.
+---> S Zunddn von 123 zo 456 ergibt 579.
+
+Anmrkung: D Erstzungsartweis ist wie d Einfegartweis, aber ayn ieds eindem-
+ mlte Zaichen lscht ayn vorhanddns.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.4: GWORT AAMEN UND EINFEGN
+
+ ** Benutz nn Pfemerer y , um bbs z aamen, und p , um bbs einzfegn. **
+
+ 1. Gee zo dyr mit ---> angmrktn Zeil unt und stz nn Mrkl hinter "a)".
+
+ 2. Ginn d Sichtisch-Artweis mit v und bewg nn Mrkl gnaun vor "eerste".
+
+ 3. Zipf y , um dnn vrherghbtn Tail z aamen.
+
+ 4. Bewg nn Mrkl gan n End von dyr naehstn Zeil: j$
+
+ 5. Demmlt p , um ds Gwort einzfegn, und aft: a zwaitte <ESC> .
+
+ 6. Benutz d Sichtischartweis, um " Eintrag." auszwaln, aam s mittls y , be-
+ wg di gan n End von dyr naehstn Zeil mit j$ und feg s Gwort dortn mit
+ p an.
+
+---> a) ds ist dyr eerste Eintrag.
+ b)
+Anmrkung: Du kanst y aau als Pfemerer verwenddn; yw zo n Beispil aamt
+ hinst eyn n naehstn Wortanfang (aane dnn selber).
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.5: SCHALTTER STZN
+
+** Stz aynn Schaltter yso, d ayn Suech older Erstzung Groo- und Klain- **
+ ** schreibung bergeet. **
+
+ 1. Suech um 'bergee", indem dst /bergee eingibst.
+ Widerhol d Suech ayn ttlych Maal, indem dst de Tastn n druckst.
+
+ 2. Stz de Zwisl - nn Schaltter - 'ic' (ignore case), indem dst :set ic
+ eingibst.
+ 3. Ietz suech wider um 'bergee' und tue aau wider mit n weiter. Daa fallt
+ dyr auf, d ietz bbenn aau bergee und BERGEE hergeet.
+
+ 4. Stz de Zwisln 'hlsearch' und 'incsearch' pfelfs: :set hls is
+
+ 5. Widerhol d Suech und bobacht, was ietz gschieght: /bergee <EIN>
+
+ 6. Dst groo und klain wider gwon unterscheidst, zipf: :set noic
+
+Anmrkung: Mechst de Trffer niemer vrherghbt seghn, gib ein: :nohlsearch
+Anmrkung: Sollt klain/groo bei ayner ainzignen Suech wurst sein, benutz \c
+ in n Suechausdruk: /bergee\c <EIN>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 6
+
+ 1. Zipf o , um ayn Zeil UNTERHALB n Mrkl z ffnen und d Einfegartweis z
+ ginnen.
+ Zipf O , um ayn Zeil OBERHALB n Mrkl z ffnen.
+
+ 2. Zipf a , um NAACH n Mrkl ayn Gwort einzfegn.
+ Zipf A , um ayn Gwort naach n Zeilnend anzfegn.
+
+ 3. D Faudung e bringt di gan n End von aynn Wort.
+
+ 4. Dyr Pfemerer y (yank) aamt bbs, p (put) fegt ds ein.
+
+ 5. Ayn groosss R geet eyn d Erstzungsartweis, hinst d myn <ESC> druckt.
+
+ 6. D Eingaab von ":set xxx" stzt de Zwisl "xxx". Ayn ttlych Zwisln seind:
+ 'ic' 'ignorecase' Groo/klain wurst bei ayner Suech
+ 'is' 'incsearch' Zaig aau schoon ayn Tailberainstimmung
+ 'hls' 'hlsearch' Hb allsand pssetn Ausdrck vrher
+ Dyr Schaltternam kan in dyr Kurz- older Langform angbn werdn.
+
+ 7. Stll yn ayner Zwisl "no" voran, dst ys abschalttst: :set noic
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 7.1: AYN HILFGWORT AUFRUEFFEN
+
+
+ ** Nutz ds einbaute Hilfgebu, de "Betribsanlaittung". **
+
+ Eyn n Wimm ist ayn ausferliche "Gebrauchsanweisung" einbaut. Fr s Eerste
+ prblt ainfach ains von dene dreu aus:
+ - Druck d <HILF>-Tastn, wennst bbenn aine haast.
+ - Druck de Tastn <F1>, fallsst ys haast.
+ - Zipf :help <EIN>
+
+ Lis di eyn s Hilffenster ein, dyrmitst draufkimmst, wie ds mit dyr Hilf geet.
+ Demmlt <STRG>w w , um von ainn Fenster zo n andern zo n Springen.
+ Demmlt :q <EIN> , um s Hilffenster zo n Schliessn.
+
+ Du kanst zo so guet wie allssand ayn Hilf finddn, indem dst yn dyr Faudung
+ :help aynn Auerwerd naachstllst und istig <EIN> nit vergisst. Prblt ds:
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 7.2: ERSTLL AYN GIN-SCHRIPF
+
+
+ ** Mutz nn Wimm mit de einbautn Faehigkeitn auf. **
+
+ Dyr Wimm besitzt ayn Wsn Schftungen, wo ber n Urwimm aushingeend, aber de
+ meerern dyrvon seind in dyr Vorgaab ausgschaltt. Dyrmitst meerer aus n Wimm
+ ausherholst, erstllst ayn "vimrc"-Dautticht.
+
+ 1. Lg ayn "vimrc"-Dautticht an; ds geet ie naach Betribsgebu verschidn:
+ :e ~/.vimrc fr s Unix
+ :e ~/_vimrc bei n Fenstl
+
+ 2. Ietz lis nn Inhalt von dyr Beispil-"vimrc"-Dautticht ein:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Speichert de Dautticht mit:
+ :w
+
+ 4. Bei n naehstn Gin von n Wimm ist aft d Fegnussvrherhbung zuegschalttn.
+ Du kanst dyr allss eyn d Dautticht einhinschreibn, wasst bstndig habn
+ willst. Meerer dyrzue erfarst unter: :help vimrc-intro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 7.3: VERGNTZN
+
+
+ ** Befelhszeilnvergntzung mit <STRG>d und <TAB> **
+
+ 1. Vergwi di, d dyr Wimm nit auf n Urwimm-"Glais" fart: :set nocp
+
+ 2. Schaug naach, wlcherne Dauttichtn d s in n Verzaichniss geit: :!ls
+ older :!dir
+ 3. Zipf nn Anfang von ayner Faudung: :e
+
+ 4. Druck <STRG>d , und dyr Wimm zaigt ayn Listn von Faudungen, wo mit "e"
+ angeend.
+ 5. Druck <TAB> , und dyr Wimm vervollstndigt nn Faudungsnam zo ":edit".
+
+ 6. Feg ayn Laerzaichen und nn Anfang von ayner besteehetn Dautticht an:
+ :edit DAU
+
+ 7. Druck <TAB> . Dyr Wimm vergntzt nn Nam, ds haisst, wenn yr aindeuttig
+ ist.
+Anmrkung: D Vergntzung geit s fr aynn Hauffen Faudungen. Versuech ainfach
+ <STRG>d und <TAB> . Bsunders ntzlich ist ds bei :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 7
+
+
+ 1. Zipf :help oder druck <F1> oder <HILF> , um ayn Hilffenster z ffnen.
+
+ 2. Zipf :help FAUDUNG , um auf ayn Hilf gan aynn Befelh z kemmen.
+
+ 3. Zipf <STRG>w w , um zo n andern Fenster z springen.
+
+ 4. Zipf :q , um s Hilffenster z schliessn.
+
+ 5. Erstll ayn vimrc-Ginschripf zuer Sicherung von deine Mtzneinstllungen.
+
+ 6. Druck <STRG>d , aft dst naach : ayn Faudung angfangt haast, dyr-
+ mitst mgliche Vergntzungen anzaigt kriegst.
+ Druck <TAB> fr ain Vervollstndigung yllain.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Ds wr ietzet s End von n Wimmschainer. Gangen ist s daa drum, aynn kurtzn
+ und bndignen berblik ber s Blat WIMM z lifern, netty vil gnueg, d myn
+ fr s Eerste wirklich bbs dyrmit anfangen kan. Dyrmit ist s aber auf kain
+ Weitn non nit taan; dyr Wimm haat schoon non vil meerer auf Lager. Lis als
+ Naehsts aynmaal s Benutzerhandbuech: :help user-manual
+
+ Zo n Weiterlsn und Weiterlernen wr ds Buech daader zo n Empfelhen:
+ Vim - Vi Improved - von n OUALLINE Steve
+ Verlaag: New Riders
+ Ds ist ds eerste Buech, wo ganz yn n Wimm gwidmt ist, netty ds Grechte fr
+ Anfnger. Es haat ayn Wsn Beispiler und aau Bilder drinn.
+ See https://iccf-holland.org/click5.html
+
+ Ds folgete Buech ist schoon lter und meerer ber n Urwimm als wie ber n
+ Wimm, aber aau zo n Empfelhen: Textbearbeitung mit dem vi-Editor - von dyr
+ LAMB Linda und n ROBBINS Arnold - Verlaag O'Reilly - Buechlaittzal (ISBN):
+ 3897211262
+ In dnn Buech kan myn fast allss finddn, was myn mit n Urwimm angeen mecht.
+ De sxte Ausgaab enthaltt aau schoon bbs ber n Wimm.
+ Als ietzunde Bezugniss fr d Fassung 7 und ayn pfrenge Einferung dient ds
+ folgete Buech:
+ vim ge-packt von n WOBST Reinhard
+ mitp-Verlaag, Buechlaittzal 978-3-8266-1781-2
+ Trotz dyr recht pfrengen Darstllung ist s durch seine viln ntzlichnen Bei-
+ spiler aau fr Einsteiger grad grecht. Probhaeupster und de Beispilschripfer
+ seind zesig zo n Kriegn; see https://iccf-holland.org/click5.html
+
+ Verfasst habnd dnn Schainer dyr PIERCE Michael C. und WARE Robert K. von dyr
+ Kolraader Knappnschuel (Colorado School of Mines). Er beruet auf Entwrff, wo
+ dyr SMITH Charles von dyr Kolraader Allschuel (Colorado State University)
+ zuer Verfegung gstllt haat. Gundpost: bware@mines.colorado.edu
+ Fr n Wimm haat n dyr MOOLENAAR Bram barechtt.
+ De bairische berstzung stammt von n HELL Sepp 2009, ayn Weeng berarechtt
+ 2011. Sein Gundpostbrcht ist sturmibund@t-online.de
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.bar.utf-8 b/runtime/tutor/tutor.bar.utf-8
new file mode 100644
index 0000000..42bea0e
--- /dev/null
+++ b/runtime/tutor/tutor.bar.utf-8
@@ -0,0 +1,981 @@
+===============================================================================
+= G o t i k a m i n n W I M M - S c h a i n e r - Fassung 1.7 =
+===============================================================================
+
+ Dyr Wimm ist ayn gro mächtigs Blat, dös was mit aynn Wösn Befelh aufwartt; z
+ vil, däß myn s allsand in aynn Schainer wie dönn daader unterbräng. Der
+ Schainer ist yso aufbaut, däß yr halt netty die Befelh allsand bringt, wost
+ brauchst, däßst mit iem für s Eerste wirklich öbbs anfangen kanst.
+ Durchhinarechtn kanst di, wennst willst, in ayner halbetn Stund; dös haisst,
+ wennst di nit grooß mit n Pröbln und Tüftln aufhaltst.
+
+ OBACHT:
+ Die Faudungen, wost daader finddst, gaand istig s Gwort öndern. Dösswögn
+ machst eyn n Böstn glei ayn Aamum von derer Dautticht daader. Haast alsnan
+ dös Gwort daader mit n Befelh "vimtutor bar" ausherlaassn, ist s ee schoon
+ ayn Aamum.
+ Mir kan s nit oft gnueg sagn, däß der Schainer daader istig gan n Üebn
+ ghoert. Also muesst schoon aau die Befelh +ausfüern, wennst ys gscheid ler-
+ nen willst. Mit n Lösn yllain ist s +nit taan!
+
+ Ietz schaust grad non, däß dein Föststölltastn nit druckt ist; und aft geest
+ glei aynmaal mit dyr j-Tastn abwärts (yso laaufft dös nömlich), hinst däßst
+ de gantze Letzn 1.1 auf n Bildschirm haast.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.1: MIT N MÖRKL UMAYNANDFARN
+
+** Dyrmitst mit n Mörkl umaynandkimmst, druck h, j, k und l wie unt zaigt. **
+ ^ Ayn Öslsbrugg:
+ k De Tastn h ist winster und +geet aau gan winster.
+ < h l > S l leit zesm und richtt si gan zesm.
+ j S j kan myn wie aynn Pfeil gan unt seghn.
+ v Mit n k kimmst gan n KOPF.
+ 1. Ietz ruedertst ainfach mit n Mörkl auf n Bildschirm umaynand, hinst däßst
+ di sicher füelst.
+ 2. Halt d Abhin-Tastn (j) druckt; aft rumplt s ainfach weiter. Netty yso
+ kimmst gan dyr naehstn Letzn.
+
+ 3. Wie gsait, ietz bewögst di also mit derer Tastn gan dyr Letzn 1.2.
+
+Non öbbs: Allweil, wenn dyr niemer ganz wol ist, wasst öbbenn druckt haast, aft
+ zipfst <ESC> ; naacher bist wider ganz gwon in dyr Befelhs-Artweis.
+
+
+ Nöbnbei gsait kimmst gwonerweil aau mit de Pfeiltastnen weiter. Aber
+ hjkl seind z haissn s Wimm-Urgstain; und de "Hörtn" seind ganz dyr-
+ für, däß myn bei +dene bleibt. Pröblt s ainfach aus!
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.2: ÖNN WIMM AUSSCHALTTN
+
+
+ ALSO, EE WENNST ÖBBS VON DAA UNT AUSFÜERST, LIS LIEBER ZEERST DE GANTZE LET-
+ ZN!
+
+ 1. Druck d <ESC>-Tastn, dyrmitst aau gwiß in dyr Befelhs-Artweis bist.
+
+ 2. Demmlt :q!<EIN> .
+ Daa dyrmit benddst ys Blat und verwirffst allss, wasst öbbenn göndert
+ haast.
+
+ 3. Balst önn Eingib seghst, gib dö Faudung ein, wo di zo dönn Schainer brun-
+ gen haat, also vimtutor bar<EIN> .
+
+ 4. Also, wenn ietz allsse sitzt, naacherd füerst d Schritt 1 hinst 3 aus, mit
+ wasst ys Blat verlaasst und aft wider einhinkimmst.
+
+Anmörkung: Mit :q!<EIN> verwirffst allss, wasst göndert older enther gschribn
+ haast. In aynn Öttlych Letznen lernst acht, wiest dös allss in ayner
+ Dautticht speichertst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.3: GWORT BARECHTN - LÖSCHN
+
+
+ ** Druck x , dyrmitst dös Zaichen unter n Mörkl löschst. **
+
+ 1. Bewög di mit n Mörkl auf de mit ---> angmörkte Zeil unt.
+
+ 2. Zo n Faeler Verbössern farst mit n Mörkl netty auf dös Zaichen, dös wo
+ glöscht ghoert.
+
+ 3. Druck de Tastn x , däßst dös überflüssige Zaichen löschst.
+
+ 4. Ietz tuest so lang weiter mit 2 hinst 4, hinst däß dyr Saz stimmt.
+
+---> De Kkuue sprangg übber nn Maanad.
+
+ 5. Wenn ietz de Zeil verbössert ist, geest gan dyr Letzn 1.4. weiter.
+
+Und ganz wichtig: Dyrweilst dönn Schainer durcharechtst, versuech nit öbbenn,
+ allss auswendig z lernen; nän, lern ainfach mit n Anwenddn!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.4: GWORT BARECHTN - EINFÜEGN
+
+
+ ** Druck i , dyrmitst öbbs einfüegst. **
+
+ 1. Bewög önn Mörkl zo dyr eerstn untignen Zeil, wo mit ---> angeet.
+
+ 2. Dyrmitst de eerste Zeil wie de zwaitte machst, bewög önn Mörkl auf dös
+ eerste Zaichen NAACH derer Stöll, daa wo s Gwort eingfüegt werdn sollt.
+
+ 3. Druck i und gib dös ein, was abgeet.
+
+ 4. Wenn ieweils ayn Faeler verweitert ist, aft druck <ESC> ; dyrmit kimmst
+ gan dyr Befelhsartweis zrugg.
+ So, und ietz tuest ainfach yso weiter, hinst däß dyr Saz stimmt.
+
+---> Daader gt dd öbbs b.
+---> Daader geet diend öbbs ab.
+
+ 5. Balst mainst, däßst ys Gwort-Einfüegn kanst, aft geest gan dyr Letzn 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.5: GWORT BARECHTN - ANFÜEGN
+
+
+ ** Druck A gan n Gwort Anfüegn. **
+
+ 1. Gee mit n Mörkl gan dyr eerstn untignen Zeil, wo ayn ---> dyrvor haat.
+ Daa ist s gleich, wo gnaun dyr Mörkl in derer Zeil steet.
+
+ 2. Demmlt A und gib de entspröchetn Ergöntzungen ein.
+
+ 3. Wennst mit n Anfüegn förtig bist, aft druckst <ESC> , däßst wider eyn de
+ Befelhsartweis zruggkimmst.
+
+ 4. So, und ietz geest aft non gan dyr zwaittn mit ---> angmörktn Zeil; und
+ daadl machst ys netty yso.
+
+---> In derer Zeil gee
+ In derer Zeil geet ayn Weeng ayn Gwort ab.
+---> Aau daader stee
+ Aau daader steet öbbs Unvollstöndigs.
+
+ 5. Wennst s Anfüegn von Gwort drauf haast, naacherd gee gan dyr Letzn 1.6.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 1.6: AYN DAUTTICHT BARECHTN
+
+
+ ** Mit :wq speichertst ayn Dautticht und verlaasst önn Wimm ganz. **
+
+ !! OBACHT: Ee wennst mit dönn alln daa unt weitertuest, lis zeerst de gantze
+ Letzn durch!!
+
+ 1. Verlaaß also s Blat, wie s in dyr Letzn 1.2. haisst, mit :q! !
+
+ 2. Gib dö Faudung eyn n Eingib ein: vim Schainer<EIN> . 'vim' ruefft s Blat
+ auf, und 'Schainer' haisst de Dautticht, wost barechtn willst. Dyrmit
+ haast also ayn Dautticht, dö wost barechtn kanst.
+
+ 3. Ietz füegst öbbs ein older löschst öbbs, wiest ys in de vorignen Letznen
+ glernt haast.
+
+ 4. Speichert de gönderte Dautticht und verlaaß önn Wimm mit :wq<EIN> .
+
+ 5. Schmeiß önn Wimmschainer neu an und gee gan dyr folgetn Zammenfassung.
+
+ 6. Aft däßst de obignen Schritt glösn und käppt haast, kanst ys durchfüern.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 1
+
+
+ 1. Dyr Mörkl werd mit de Tastnen hjkl older aau mit de Pfeiltastnen gsteuert.
+ h (winst) j (ab) k (auf) l (zes)
+
+ 2. Um önn Wimm umbb n Eingib aus z ginnen, demmlt: vim DAUTTICHT<EIN> .
+
+ 3. Willst önn Wimm verlaassn und aau allss verwerffen, aft gibst ein:
+ <ESC> und :q!<EIN> .
+ Gan n Verlaassn und Speichern aber zipfst <ESC> und :wq<EIN> .
+
+ 4. Willst dös Zaichen löschn, daa wo dyr Mörkl drauf ist, demmltst x .
+
+ 5. Willst öbbs vor n Mörkl eingöbn, zipfst i und drafter <ESC> .
+ Mechst ys aber eyn s Zeilnend anhinhöngen, benutzt ys A .
+ Und ainfach naach n Mörkl füegst ys mit a ein.
+
+Anmörkung: Druckst <ESC> , kimmst eyn de Befelhsartweis zrugg older brichst
+ ayn Faudung ab, dö wo dyr schiefgangen ist.
+
+ Ietz tue mit dyr Letzn 2 weiter.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.1.: LÖSHFAUDUNGEN
+
+
+ ** Demmlt dw , dyrmitst ayn Wort löschst. **
+
+ 1. Druck <ESC> , dyrmit s aau gwiß ist, däßst in dyr Befelhsartweis bist.
+
+ 2. Bewög önn Mörkl zo dyr mit ---> angmörktn Zeil unt.
+
+ 3. Und daa geest ietz auf n Anfang von aynn Wort, dös wo glöscht ghoert.
+
+ 4. Zipf dw , däßst dös gantze Wort löschst.
+
+ Nöbnbei: Dyr Buechstabn d erscheint auf dyr lösstn Zeil von n Bildschirm,
+ sobaldst n eingibst. Dyr Wimm wartt ietz drauf, däß öbbs kimmt, al-
+ so daader ayn w . Seghst freilich öbbs Anderts wie ayn d ,
+ naacherd haast öbbs Falschs demmlt. Druck aft <ESC> und pröblt
+ s non aynmaal.
+---> Ayn Öttlych Wörter lustig ghoernd nit Fisper eyn dönn Saz einhin.
+
+ 5. Äfert d Schritt 3 und 4, hinst däß dyr Saz pässt, und gee aft gan dyr
+ Letzn 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.2.: NON MEERER LÖSHFAUDUNGEN
+
+
+ ** Gib d$ ein, däßst hinst eyn s Zeilnend löschst. **
+
+ 1. Druck <ESC> , dyrmitst aau gwiß in dyr Befelhsartweis bist.
+
+ 2. Bewög önn Mörkl hinst eyn de mit ---> angmörkte Zeil untn.
+
+ 3. Gee mit n Mörkl auf s End von dyr faelerfreien Zeil, NAACH n eerstn . .
+
+ 4. Zipf d$ , däßst hinst eyn s End von dyr Zeil löschst.
+
+---> Öbber haat s End von dyr Zeil doplt eingöbn. doplt eingöbn.
+
+
+ 5. Gee weiter gan dyr Letzn 2.3, dyrmitst versteest, was daader ablaaufft.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.3: PFEMERER UND WOLENDER
+
+
+ Vil Faudungen, wo s Gwort öndernd, sötznd si aus aynn Pfemerer und aynn Wo-
+ lend zamm. Bal i also öbbs löschn will, schreib i ainsting d und aft s "Wo-
+ lend", dös haisst also, "wolend", "wohin" däß i will - older was i halt gnaun
+ löschn will.
+
+
+
+
+
+
+ Daader also, was i wie löschn kan:
+ w - hinst eyn n Anfang von n naehstn Wort AANE dönn sein eersts Zaichen.
+ e - gan n End von n ietzundn Wort MIT dönn seinn lösstn Zaichen.
+ $ - zo n End von dyr Zeil MIT derer irn lösstn Zaichen.
+
+ Also löscht de Tastnfolg de allss umbb n Mörkl hinst eyn s Wortend.
+Anmörkung: Gib i grad dös zwaitte Zaichen yllain ein, ruckt halt dyr Mörkl
+ entspröchet weiter.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.4: MIT AYNN ZÖLER D WOLENDER ÄFERN
+
+
+ ** Gib i ayn Zal vor aynn Wolend ein, werd dös Sel entspröchet oft gangen. **
+
+ 1. Bewög önn Mörkl gan n Anfang von dyr Zeil mit ---> dyrvor unt.
+
+ 2. Zipf 2w , däßst mit n Mörkl zwai Wörter weitergeest.
+
+ 3. Zipf 3e , däßst mit n Mörkl auf s End von n drittn Wort kimmst.
+
+ 4. Zipf 0 (aynn Nuller), däßst eyn n Anfang von dyr Zeil hinkimmst.
+
+ 5. Widerhol d Schritt 2 und 3 mit verschaidne Zöler.
+
+ ---> Dös ist ietz grad ayn Zeil zo n drinn Umaynanderruedern.
+
+ 6. Gee weiter gan dyr Letzn 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.5: DURCH AYNN ZÖLER GLEI MEERER LÖSCHN
+
+
+ ** Ayn Zal vor aynn Pfemerer füert dönn entspröchet oft aus. **
+
+ Also, i mecht löschn, und zwaar öbbs Bestimmts, und dös so und so oft: Daa
+ dyrzue benutz i aynn Zöler:
+ d Zöler Wolend (also önn Bewögungsschrit)
+
+ 1. Bewög önn Mörkl zo n eerstn Wort in GROOSSBUECHSTABN in dyr mit ---> an-
+ gmörktn Zeil.
+
+ 2. Demmlt d2w , dyrmitst de ganz grooßgschribnen Wörter löschst.
+
+ 3. Äfert d Schritt 1 und 2 mit dönn entspröchetn Zöler, dyrmitst de drauf-
+ folgetn ganz großgschribnen Wörter mit ayner ainzignen Faudung löschst:
+
+
+---> Dö ABC DE Zeil FGHI JK LMN OP mit Wörter ist Q RS TUV ietz berichtigt.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.6: ARECHTN AUF ZEILN
+
+
+ ** Zipf dd , um ayn gantze Zeil z löschn. **
+
+ Weil s gro oft vürkimmt, däß myn gantze Zeiln löscht, kaamend schoon d Ent-
+ wickler von n Urwimm daa drauf, däß myn ainfach dd gan dönn Zwök schreibt.
+
+
+ 1. Bewög önn Mörkl gan dyr zwaittn Zeil in n untignen "Gedicht".
+ 2. Zipf dd , um dö Zeil z löschn.
+ 3. Ietz bewögst di gan dyr viertn Zeil.
+ 4. Zipf 2dd , um zwo Zeiln zo n Löschn.
+
+---> 1) Roosn seind root;
+---> 2) Drunter ist s Koot.
+---> 3) Veigerln seind blau.
+---> 4) Umgrabn tuet s d Sau.
+---> 5) D Ur sait de Zeit,
+---> 6) Sait, däß s mi freut,
+---> 7) Dirndl, dein Gschau.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 2.7: RUGGGÖNGIG MACHEN (RUGGLN)
+
+
+ ** Zipf u , dyrmitst de lösstn Faudungen ruggltst **
+ ** older U , um ayn gantze Zeil widerherzstölln. **
+
+ 1. Bewög önn Mörkl gan dyr mit ---> angmörktn Zeil unt und gee dyrmit auf n
+ eerstn Faeler.
+ 2. Zipf x , däßst dös eerste z vile Zaichen löschst.
+ 3. Ietz demmlt u , dyrmitst de lösste Faudung ruggltst.
+ 4. Ietz behöb allsand Faeler auf dyr Zeil mit dyr Hilf von n Befelh x .
+ 5. Aft gibst ayn U (grooß) ein, däßst de Zeil wider yso hinbringst, wie s
+ gwösn ist.
+ 6. So, und ietz demmltst so oft u , hinst däßst s U und de andern Fau-
+ dungen rugggöngig gmacht haast.
+ 7. Und ietzet widerum schreibst so oft <STRG>r , hinst däßst allsand Be-
+ felh widerhergstöllt, z haissn allsse rugg-grugglt haast (also d Rugggön-
+ gigmachungen rugggöngig gmacht).
+---> Beerichtig d Faeller voon dehrer Zeiil und sttöll s mitt n Ruggruggln wi-
+ der her.
+ 8. Die Faudungen seind gro wichtig; sö helffend ainn närrisch weiter.
+ Ietz gee weiter gan dyr Zammenfassung von dyr Letzn 2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 2
+
+
+ 1. Um von n Mörkl aus hinst eyn s naehste Wort zo n Löschn, zipf: dw
+ 2. Um umbb n Mörkl hinst eyn s End von dyr Zeil zo n Löschn, demmlt d$
+ 3. Dyrmitst ayn gantze Zeil löschst, gib ein: dd
+ 4. Mechst ayn Bewögung, ayn "Wolend", öfters, stöll de entspröchete Zal dyr-
+ vor: 3dw older aau: d3w
+ 5. Dyr Pfueg für ayn Önderungsfaudung lautt yso:
+ Pfemerer [Zal] Bewögungsschrit (Wolend)
+ Und dös haisst:
+ Dyr PFEMERER gibt an, WAS taan ghoert, öbbenn d = löschn (»delete«).
+ [ZAL] - Ayn Zal KAN myn angöbn, wenn myn halt ayn Wolend öfter habn will.
+ S WOLEND, also dyr Schrit WOHIN, besagt, auf was i aushin will, öbbenn
+ auf aynn Wortanfang ( w ), s End von dyr Zeil ( $ ) und so weiter.
+
+ 6. Däßst eyn n Anfang von dyr Zeil hinkimmst, schreib aynn Nuller: 0
+
+ 7. Um öbbs Vorigs wider z ruggln, gib ein: u (klain also)
+ Um allsand Önderungen in ayner Zeil z ruggln, haast: U (also grooß)
+ Um "rugg-z-ruggln", also allss wider herzstölln, zipf: <STRG>r
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 3.1: ANFÜEGN (»put«)
+
+
+ ** Zipf p , dyrmitst öbbs gnetty Glöschts naach n Mörkl anfüegst. **
+
+ 1. Bewög önn Mörkl gan dyr eerstn untignen Zeil mit ---> dyrvor.
+
+ 2. Zipf dd , um sele Zeil z löschn und dyrmit in ayner Wimm-Osn zo n Spei-
+ chern.
+
+ 3. Bewög önn Mörkl gan dyr Zeil c), ÜBER derer, daa wo de glöschte Zeil ein-
+ hinkemmen sollt.
+
+ 4. So, und ietz gibst ainfach p ein, und schoon haast dö Zeil unter derer
+ mit n Mörkl drinn.
+ 5. Äfert d Schritt 2 hinst 4, hinst däßst allsand Zeiln yso naachynaynand
+ haast, wie s hinghoernd.
+
+---> d) Kanst du dös aau?
+---> b) Veigerln seind blau.
+---> c) Bedachtn kan myn lernen.
+---> a) Roosn seind root.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 3.2: ERSÖTZN (»replace«)
+
+
+ ** Zipf rx , um dös Zaichen unter n Mörkl durch x z ersötzn. **
+
+ 1. Bewög önn Mörkl zo dyr eerstn untignen Zeil mit ---> dyrvor.
+
+ 2. Bewög önn Mörkl, hinst däß yr auf n eerstn Faeler steet.
+
+ 3. Zipf r und drafter dös Zaichen, wo dyrfür daa hinghoert.
+
+ 4. Widerhol d Schritt 2 und 3, hinst däßst de eerste Zeil gmaeß dyr zwaittn
+ berichtigt haast:
+---> Wie dö Zeit eingobn wurd, wurdnd ainike falsche Zastnen zipft!
+---> Wie dö Zeil eingöbn wurd, wurdnd ainige falsche Tastnen zipft!
+
+ 5. Ietz tue mit dyr Letzn 3.3 weiter.
+
+Anmörkung: Vergiß nit drauf, däßst mit n Anwenddn lernen solltst und nit öbbenn
+ mit n Auswendiglernen!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 3.3: ÖNDERN (»change«)
+
+
+ ** Um hinst eyn s Wortend z öndern, zipf ce . **
+
+ 1. Gee mit n Mörkl auf de eerste mit ---> angmörkte Zeil.
+
+ 2. Ietz farst netty auf s "s" von Wstwr hin.
+
+ 3. Zipf ce ein und aft d Wortberichtigung, daader also örter .
+
+ 4. Druck <ESC> und bewög önn Mörkl zo n naehstn Zaichen, wo göndert ghoert.
+
+ 5. Äfert d Schritt 3 und 4, hinst däß dyr eerste Saz wie dyr zwaitte ist.
+
+---> Ainige Wstwr von derer Zlww ghhnnd mit n Öndern-Pfemerer gaauu.
+---> Ainige Wörter von derer Zeil ghoernd mit n Öndern-Pfemerer göndert.
+
+ce löscht also s Wort und schlaaufft di eyn d Eingaab-Artweis.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 3.4.: NON MEERER ÖNDERUNGEN PFELFS c
+
+
+ ** D Löshfaudung c arechtt mit de nömlichnen Wolender wie dö mit d **
+
+ 1. Dyr Önder-Pfemerer arechtt anleich wie d Löshfaudung mit d , und zwaar
+ yso:
+ c [Zal] Bewögungsschrit (Wolend)
+
+ 2. D Wolender seind de gleichn, öbbenn w für Wort und $ für s Zeilnend.
+
+
+ 3. Bewög di zo dyr eerstn untignen Zeil mit ---> .
+
+ 4. Ietz geest auf dönn eerstn Faeler.
+
+ 5. Zipf c$ , gib önn Rest von dyr Zeil wie in dyr zwaittn ein und druck aft
+ <ESC>.
+---> S End von derer Zeil sollt an de zwaitte daader anglichen werdn.
+---> S End von derer Zeil sollt mit n Befelh c$ berichtigt werdn.
+
+Denk allweil dran, däßst iederzeit mit dyr Ruggtastn Faeler ausbössern kanst.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 3
+
+
+ 1. Um ayn vorher glöschts Gwort anzfüegn, zipf p . Daa dyrmit werd dös
+ gantze Gwort NAACH n Mörkl angfüegt. Wenn s ayn gantze Zeil gwösn ist,
+ werd dö sel als de Zeil unterhalb n Mörkl eingfüegt.
+
+ 2. Um dös Zaichen unter n Mörkl, also wo dyr Mörkl ist, z ersötzn, zipf r
+ und aft dös Zaichen, wost daadl habn willst.
+
+ 3. Dyr Önderungspfemerer ( c = »change«) laasst ainn umbb n Mörkl hinst eyn s
+ End von n Wolend öndern. Zipf ce , dyrmitst umbb n Mörkl hinst eyn s End
+ von n Wort öndertst, und c$ hinst eyn s End von dyr Zeil.
+
+ 4. Für d Önderung lautt dyr Pfueg:
+
+ c [Zal] Wolend
+
+Ietz tue mit dyr naehstn Letzn weiter.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 4.1: MÖRKLSTÖLLUNG UND DAUTTICHTDARSTAND
+
+** Demmlt <STRG>g, däßst önn Befand und Darstand von dyr Dautticht anzaigst. **
+ ** Zipf G , dyrmitst auf ayn bestimmte Zeil in dyr Dautticht hinkimmst. **
+
+Anmörkung: Lis dö gantze Letzn daader durch, ee wennst iewign öbbs unternimmst!
+
+ 1. Druck <STRG>g . Auf dös hin erscheint auf derer Seitt ganz unt ayn Dar-
+ standsmeldung mit n Dauttichtnam und n Befand innerhalb dyr Dautticht.
+ Mörk dyr de Zeilnnummer für n Schrit 3.
+
+Anmörkung: Müglicherweis seghst aau önn Mörklbefand in n zesmen untern Bild-
+ schirmögg. Aft ist s "Lindl" (»ruler«) eingstöllt; meerer über dös
+ laasst dyr dyr Befelh :help 'ruler' ausher.
+ 2. Druck G , um an s End von dyr Dautticht z kemmen.
+ gg gibst ein, däßst gan n Anfang von dyr Dautticht aufhinkimmst.
+
+ 3. Gib d Nummer von derer Zeil ein, daa wost vorher warst, und aft non G .
+ Dös bringt di zrugg gan seler Zeil, daa wost stuenddst, wiest dös eerste
+ Maal <STRG>g gadruckst.
+
+ 4. Wennst di sicher gnueg füelst, aft füer d Schritt 1 hinst 3 aus.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 4.2: DYR BEFELH ZO N SUECHEN
+
+
+ ** Zipf / und dyrnaach aynn Ausdruk, um selbignen zo n Suechen. **
+
+ 1. Du gibst also in dyr Befelhsartweis s Zaichen / ein. Dös sel wie aau dyr
+ Mörkl erscheinend drauf unt auf n Schirm, netty wie bei dyr Faudung : .
+
+ 2. Ietz zipf Faeeler<EIN> . Netty um dös 'Faeeler' willst ietz suechen.
+
+ 3. Willst um gnaun dönn Ausdruk weitersuechen, zipf ainfach n (wie »next«).
+ Willst hinzrugg suechen, aft gibst N ein.
+
+ 4. Um von Haus aus zruggaus z suechen, nimm ? statt / her.
+
+ 5. Dyrmitst wider daa hinkimmst, wost herkemmen bist, nimm <STRG>o , und dös
+ öfter, wennst weiter zrugg willst. Mit <STRG>i widerum kimmst vorwärts.
+
+---> Aynn Faeler schreibt myn nit "Faeeler"; Faeeler ist ayn Faeler
+
+Anmörkung: Wenn d Suech s Dauttichtend dyrraicht haat, geet s eyn n Anfang wi-
+ der weiter dyrmit, men Sach dyr Schaltter 'wrapscan' wär auf aus.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 4.3: DE GÖGNKLAMMERN FINDDN
+
+
+ ** Zipf % , um de entspröchete Klammer ) , ] older } z finddn. **
+
+ 1. Sötz önn Mörkl auf iewign aine von dene drei Klammern ( , [ older {
+ in dyr untignen Zeil, wo mit ---> angmörkt ist.
+
+ 2. Ietzet zipf s Zaichen % .
+
+ 3. Dyr Mörkl geet ietz auf de pässete schliessete Klammer.
+
+ 4. Ietz demmlt % , und dyrmit kimmst gan dyr öffneretn Klammer zrugg.
+
+ 5. Sötz önn Mörkl auf ayn anderne Klammer von ({[]}) und pröblt % aus.
+
+---> Dös ( ist blooß ayn Pochzeil ( mit [ verschaidne ] { Klammern } drinn. ))
+
+Anmörkung: Um dö Müglichkeit gaast bsunders froo sein, wennst aynmaal in aynn
+ Spaichgwort verzweiflt ayn faelete Gögnklammer suechst!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 4.4: D ERSÖTZUNGSFAUDUNG (»substitute«)
+
+
+ ** Zipf :s/alt/neu/g , um 'alt' durch 'neu' zo n Ersötzn. **
+
+ 1. Gee mit n Mörkl zo dyr unt steehetn mit ---> angmörktn Zeil.
+
+ 2. Zipf :s/dee/de <EIN> . Der Befelh ersötzt alsnan grad dös +eerste "dee",
+ wo vürkimmt.
+
+ 3. Ietz pröblt s mit :s/dee/de/g . Dös zuesötzliche g ("Pflok" nennt myn
+ öbbs Sölchers) bewirkt, däß allss, was dyrmit kennzaichnet ist, innerhalb
+ von dyr ainn Zeil ersötzt werd.
+
+---> Dee schoenste Zeit, däß myn dee Blüemln anschaut, ist dee schoene Lan-
+ gesszeit.
+ 4. Um ietz allsand Suechbegriff innerhalb von zwo Zeiln zo n Öndern, zipf
+ :#,#s/alt/neu/g , wobei # ieweils für de eerste und lösste Zeil von dönn
+ Pfraich steet.
+ :%s/alt/neu/g zipfst, däßst d Vürkemmen in dyr gantzn Dautticht öndertst.
+ Mit :%s/alt/neu/gc finddst allsand Vürkemmen in dyr gsamtn Dautticht;
+ daa werst aber zeerst non gfraagt, obst ys ersötzn willst older nity.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 4
+
+ 1. <STRG>g zaigt dönn ietzundn Dauttichtbefand und önn Darstand dyrvon an.
+ G bringt di an s End von dyr Dautticht.
+ <Zal>G bringt di gan dyr entspröchetn Zeilnnummer.
+ <Zal>gg geet +grad yso.
+ gg bringt di zo dyr eerstn Zeil.
+ 2. D Eingaab von / mit aynn Ausdruk suecht VÜRSHLING um dönn Ausdruk.
+ Gibst ? und aynn Suechbegrif ein, suecht s um dönn ÄRSHLING.
+ Zipf naach ayner Suech n ; naacherd werd in de gleiche Richtung weiter-
+ gsuecht. Mit N geet s umkeerter weiter.
+ <STRG>o bringt di zo ölterne Befändd zrugg, <STRG>i zo neuerne.
+
+ 3. D Eingaab von % , wenn dyr Mörkl auf ainer von dene Klammern steet: ({[
+ )]} , bringt di zo dyr Gögnklammer.
+
+ 4. Um dös eerste Vürkemmen von "alt" in ayner Zeil durch "neu" z ersötzn,
+ zipf :s/alt/neu .
+ Um allsand in ayner Zeil z ersötzn, zipf :s/alt/neu/g .
+ Mechst allss in zwo Zeiln ersötzn, demmlt zo n Beispil :5,6s/alt/neu/g .
+ Mechst allss in dyr gantzn Dautticht ersötzn, gib ein: :%s/alt/neu/g .
+ Willst ayn ieds Maal bstaetln, höng 'c' wie »confirm« hint anhin.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 5.1: ZWISCHNDRINN AYNN AUSSERIGNEN BEFELH AUSFÜERN
+
+
+ ** Willst ayn Gfäßfaudung ausfüern, gib ainfach dö sel naach :! ein. **
+
+ 1. Zipf dönn bekanntn Befelh : , dyrmitst mit n Mörkl auf n Bildschirm
+ ganz abhin kimmst. Draufhin kanst aynn gwonen Gfäßbefelh eingöbn.
+
+ 2. Zeerst kimmt aber non ayn Ruefzaichen ! . Und ietzet haast d Müglich-
+ keit, ayn beliebige ausserige Gfäßfaudung auszfüern.
+
+ 3. Als Beispil zipf :!ls<EIN> ; und schoon haast ayn Auflistung von deinn
+ Verzaichniss, netty wie wennst ganz gwon in n Eingib wärst. Geet ls
+ aus iewign aynn Grund nit, aft pröblt s mit :!dir<EIN> .
+
+Also non aynmaal: Mit dönn Angang kan ayn iede beliebige ausserige Faudung aus-
+ gfüert werdn, aau mit Auerwerdd.
+
+Und wolgmörkt: Alle Befelh, wo mit : angeend, müessend mit <EIN> bstö-
+ tigt werdn. Dös dyrsagn myr fürbaß +niemer.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 5.2: NON MEERER DRÜBER, WIE MYN DAUTTICHTN SCHREIBT
+
+
+ ** Um öbbs Gönderts neu z speichern, zipf :w NEUER_DAUTTICHTNAM . **
+
+ 1. Zipf :!dir older :!ls , däßst dyr ayn Auflistung von deinn Verzaich-
+ niss ausherlaasst. Däßst drafter <EIN> eingöbn muesst, waisst ee schoon.
+
+ 2. Suech dyr aynn Dauttichtnam aus, dönn wo s non nit geit, öbbenn POCH .
+
+ 3. Ietz demmlt: :w POCH (also mit POCH als dönn neuen Dauttichtnam).
+
+ 4. Dös speichert ietz de gantze Dautticht, also önn Wimmschainer, unter dönn
+ Nam POCH. Dös kanst leicht überprüeffen, indem däßst ainfach :!ls older
+ :!dir zipfst und dyrmit deinn Verzaichnissinhalt seghst.
+
+Anmörkung: Stigst ietz aus n Wimm aus und gännst n aft wider mit vim POCH ,
+ naacherd wär dö Dautticht ayn gnaune Aamum von n Schainer dyrselbn,
+ wiest n gspeichert haast.
+
+ 5. Ietz verweitert dö Dautticht - fallsst s Fenstl haast - , mit :!del POCH
+ beziehungsweis bei aynn Unixgebäu mit :!rm POCH .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 5.3: AYNN TAIL VON N GWORT ZO N SPEICHERN AUSWALN
+
+** Um aynn Tail von dyr Dautticht z speichern, zipf v [Wolend] :w DAUTTICHT **
+
+ 1. Ruck önn Mörkl auf netty dö Zeil daader.
+
+ 2. Demmlt v und gee mit n Mörkl auf dönn fümftn Auflistungspunt untet. Du
+ seghst glei, däß s Gwort vürherghöbt erscheint.
+
+ 3. Druck s Zaichen : . Ganz unt auf n Bildschirm erscheint :'<,'> .
+
+ 4. Zipf w POCH , wobei s dönn Dauttichtnam POCH non nit geit. Vergwiß di,
+ däßst dös :'<,'>w POCH aau +seghst, ee wennst <EIN> druckst.
+
+ 5. Dyr Wimm schreibt de ausgwaltn Zeiln eyn de Dautticht POCH einhin. Benutz
+ :!dir older :!ls , däßst dös überprüeffst. Lösh s fein nit öbbenn! Mir
+ brauchend s nömlich für de naehste Letzn.
+
+Anmörkung: Druckt myn v , ginnt d Sichtisch-Auswal. Du kanst mit n Mörkl um-
+ aynandfarn, um d Auswal z veröndern. Drafter kan myn mit yn aynn
+ Pfemerer mit dönn Gwort öbbs machen. Zo n Beispil löscht d dös
+ Gwort.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 5.4: EINLÖSN UND ZAMMENFÜERN VON DAUTTICHTN
+
+
+ ** Um önn Inhalt von ayner Dautticht einzlösn, zipf :r DAUTTICHTNAM **
+
+ 1. Sötz önn Mörkl über dö Zeil daader.
+
+OBACHT: Aft däßst önn Schrit 2 ausgfüert haast, seghst auf aynmaal öbbs aus
+ dyr Letzn 5.3. Bewög di naacherd wider abwärts, dyrmitst dö Letzn wi-
+ derfinddst.
+ 2. Ietz lis dein Dautticht POCH ein, indem däßst d Faudung :r POCH aus-
+ füerst, wobei wie gsait POCH für dönn von dir ausgsuechtn Dauttichtnam
+ steet. De einglösne Dautticht werd unterhalb dyr Mörklzeil eingfüegt.
+
+ 3. Um zo n Überprüeffen, ob de Dautticht aau gwiß einglösn ist, gee zrugg;
+ und du seghst, däß s ietz zwo Ausförtigungen von dyr Letzn 5.3. geit, s
+ Urniss und de eingfüegte Dauttichtfassung.
+
+Anmörkung: Du kanst aau d Ausgaab von aynn Ausserigbefelh einlösn. Zo n Bei-
+ spil list :r !ls d Ausgaab von dyr Faudung ls ein und füegt s
+ unterhalb n Mörkl ein.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 5
+
+
+ 1. :!FAUDUNG füert aynn ausserignen Befelh aus.
+
+ Daader ayn Öttlych gwänddte Beispiler:
+ (Fenstl) (Unix - Linux)
+ :!dir :!ls - listt s Verzaichniss auf.
+ :!del DAUTTICHT :!rm DAUTTICHT - verweitert sele Dautticht.
+
+ 2. :w DAUTTICHT speichert de ietzunde Wimmdautticht unter dönn besagtn Nam.
+
+ 3. v WOLEND :w DAUTTICHTNAM schreibt de sichtisch ausgwaltn Zeiln eyn de
+ Dautticht mit seln Nam.
+
+ 4. :r DAUTTICHTNAM ladt sele Dautticht und füegt s unterhalb n Mörklbefand
+ ein.
+
+ 5. :r !dir list d Ausgaab von dyr Faudung dir und füegt s unterhalb n
+ Mörklbefand ein.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.1: ZEIL ÖFFNEN (»open«)
+
+
+ ** Zipf o , um ayn Zeil unterhalb n Mörkl z öffnen und eyn d **
+ ** Einfüegartweis z kemmen. **
+
+ 1. Bewög önn Mörkl zo dyr eerstn mit ---> angmörktn Zeil unt.
+
+ 2. Zipf o (klain), um ayn Zeil UNTERHALB n Mörkl z öffnen und mit dyr Ein-
+ füegartweis weiterztuen.
+
+ 3. Ietzet zipf ayn Weeng öbbs und druck <ESC> , um d Einfüegartweis z ver-
+ laassn.
+---> Mit o werd dyr Mörkl in dyr Einfüegartweis auf de offene Zeil gsötzt.
+
+ 4. Um ayn Zeil OBERHALB n Mörkl aufzmachen, gib ainfach ayn groosss O statt
+ yn aynn klainen ein. Versuech dös auf dyr untignen Zeil.
+
+---> Öffnet ayn Zeil über derer daader mit O , wenn dyr Mörkl auf derer Zeil
+ ist.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.2: GWORT ANFÜEGN (»append«)
+
+
+ ** Zipf a , um öbbs NAACH n Mörkl einzfüegn. **
+
+ 1. Bewög önn Mörkl gan n Anfang von dyr eerstn Üebungszeil mit ---> unt.
+
+ 2. Druck e , hinst däß dyr Mörkl an n End von Zei steet.
+
+ 3. Zipf ayn klains a , um öbbs NAACH n Mörkl anzfüegn.
+
+ 4. Vergöntz dös Wort wie in dyr Zeil drunter. Druck <ESC> , um d Schreib-
+ Artweis z verlaassn.
+
+ 5. Bewög di mit e zo n naehstn ungantzn Wort und widerhol d Schritt 3 und
+ 4.
+
+---> Dö Ze biett ayn Glögn , ayn Gwort in ayner Zeil anzfü.
+---> Dö Zeil biett ayn Glögnet, ayn Gwort in ayner Zeil anzfüegn.
+
+Anmörkung: a , i und A bringend ainn gleichermaaßn eyn d Einfüegartweis;
+ dyr ainzige Unterschaid ist, WO mit n Einfüegn angfangt werd.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.3: AYN ANDERNE WEIS ZO N ERSÖTZN (»replace«)
+
+
+ ** Demmlt ayn groosss R , um meerer als wie grad ain Zaichen z ersötzn. **
+
+ 1. Bewög önn Mörkl zo dyr eerstn untignen, mit ---> angmörktn Zeil.
+ Gee mit n Mörkl gan n Anfang von n eerstn xxx .
+
+ 2. Ietz druck R und zipf sele Zal, wo drunter in dyr zwaittn Zeil steet,
+ yso däß de sel s xxx ersötzt.
+
+ 3. Druck <ESC> , um d Ersötzungsartweis z verlaassn. Du gspannst, däß dyr
+ Rest von dyr Zeil unveröndert bleibt.
+
+ 4. Äfert die Schritt, um dös überblibne xxx z ersötzn.
+
+---> S Zunddn von 123 zo xxx ergibt xxx.
+---> S Zunddn von 123 zo 456 ergibt 579.
+
+Anmörkung: D Ersötzungsartweis ist wie d Einfüegartweis, aber ayn ieds eindem-
+ mlte Zaichen löscht ayn vorhanddns.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.4: GWORT AAMEN UND EINFÜEGN
+
+ ** Benutz önn Pfemerer y , um öbbs z aamen, und p , um öbbs einzfüegn. **
+
+ 1. Gee zo dyr mit ---> angmörktn Zeil unt und sötz önn Mörkl hinter "a)".
+
+ 2. Ginn d Sichtisch-Artweis mit v und bewög önn Mörkl gnaun vor "eerste".
+
+ 3. Zipf y , um dönn vürherghöbtn Tail z aamen.
+
+ 4. Bewög önn Mörkl gan n End von dyr naehstn Zeil: j$
+
+ 5. Demmlt p , um dös Gwort einzfüegn, und aft: a zwaitte <ESC> .
+
+ 6. Benutz d Sichtischartweis, um " Eintrag." auszwaln, aam s mittls y , be-
+ wög di gan n End von dyr naehstn Zeil mit j$ und füeg s Gwort dortn mit
+ p an.
+
+---> a) dös ist dyr eerste Eintrag.
+ b)
+Anmörkung: Du kanst y aau als Pfemerer verwenddn; yw zo n Beispil aamt
+ hinst eyn n naehstn Wortanfang (aane dönn selber).
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 6.5: SCHALTTER SÖTZN
+
+** Sötz aynn Schaltter yso, däß ayn Suech older Ersötzung Grooß- und Klain- **
+ ** schreibung übergeet. **
+
+ 1. Suech um 'übergee", indem däßst /übergee eingibst.
+ Widerhol d Suech ayn Öttlych Maal, indem däßst de Tastn n druckst.
+
+ 2. Sötz de Zwisl - önn Schaltter - 'ic' (»ignore case«), indem däßst :set ic
+ eingibst.
+ 3. Ietz suech wider um 'übergee' und tue aau wider mit n weiter. Daa fallt
+ dyr auf, däß ietz öbbenn aau Übergee und ÜBERGEE hergeet.
+
+ 4. Sötz de Zwisln 'hlsearch' und 'incsearch' pfelfs: :set hls is
+
+ 5. Widerhol d Suech und bobacht, was ietz gschieght: /übergee <EIN>
+
+ 6. Däßst grooß und klain wider gwon unterscheidst, zipf: :set noic
+
+Anmörkung: Mechst de Tröffer niemer vürherghöbt seghn, gib ein: :nohlsearch
+Anmörkung: Sollt klain/grooß bei ayner ainzignen Suech wurst sein, benutz \c
+ in n Suechausdruk: /übergee\c <EIN>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 6
+
+ 1. Zipf o , um ayn Zeil UNTERHALB n Mörkl z öffnen und d Einfüegartweis z
+ ginnen.
+ Zipf O , um ayn Zeil OBERHALB n Mörkl z öffnen.
+
+ 2. Zipf a , um NAACH n Mörkl ayn Gwort einzfüegn.
+ Zipf A , um ayn Gwort naach n Zeilnend anzfüegn.
+
+ 3. D Faudung e bringt di gan n End von aynn Wort.
+
+ 4. Dyr Pfemerer y (»yank«) aamt öbbs, p (»put«) füegt dös ein.
+
+ 5. Ayn groosss R geet eyn d Ersötzungsartweis, hinst däß myn <ESC> druckt.
+
+ 6. D Eingaab von ":set xxx" sötzt de Zwisl "xxx". Ayn Öttlych Zwisln seind:
+ 'ic' 'ignorecase' Grooß/klain wurst bei ayner Suech
+ 'is' 'incsearch' Zaig aau schoon ayn Tailüberainstimmung
+ 'hls' 'hlsearch' Höb allsand pässetn Ausdrück vürher
+ Dyr Schaltternam kan in dyr Kurz- older Langform angöbn werdn.
+
+ 7. Stöll yn ayner Zwisl "no" voran, däßst ys abschalttst: :set noic
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 7.1: AYN HILFGWORT AUFRUEFFEN
+
+
+ ** Nutz dös einbaute Hilfgebäu, de "Betribsanlaittung". **
+
+ Eyn n Wimm ist ayn ausfüerliche "Gebrauchsanweisung" einbaut. Für s Eerste
+ pröblt ainfach ains von dene dreu aus:
+ - Druck d <HILF>-Tastn, wennst öbbenn aine haast.
+ - Druck de Tastn <F1>, fallsst ys haast.
+ - Zipf :help <EIN>
+
+ Lis di eyn s Hilffenster ein, dyrmitst draufkimmst, wie dös mit dyr Hilf geet.
+ Demmlt <STRG>w w , um von ainn Fenster zo n andern zo n Springen.
+ Demmlt :q <EIN> , um s Hilffenster zo n Schliessn.
+
+ Du kanst zo so guet wie allssand ayn Hilf finddn, indem däßst yn dyr Faudung
+ :help aynn Auerwerd naachstöllst und istig <EIN> nit vergisst. Pröblt dös:
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 7.2: ERSTÖLL AYN GIN-SCHRIPF
+
+
+ ** Mutz önn Wimm mit de einbautn Faehigkeitn auf. **
+
+ Dyr Wimm besitzt ayn Wösn Schäftungen, wo über n Urwimm aushingeend, aber de
+ meerern dyrvon seind in dyr Vorgaab ausgschaltt. Dyrmitst meerer aus n Wimm
+ ausherholst, erstöllst ayn "vimrc"-Dautticht.
+
+ 1. Lög ayn "vimrc"-Dautticht an; dös geet ie naach Betribsgebäu verschidn:
+ :e ~/.vimrc für s Unix
+ :e ~/_vimrc bei n Fenstl
+
+ 2. Ietz lis önn Inhalt von dyr Beispil-"vimrc"-Dautticht ein:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Speichert de Dautticht mit:
+ :w
+
+ 4. Bei n naehstn Gin von n Wimm ist aft d Füegnussvürherhöbung zuegschalttn.
+ Du kanst dyr allss eyn dö Dautticht einhinschreibn, wasst bständig habn
+ willst. Meerer dyrzue erfarst unter: :help vimrc-intro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Letzn 7.3: VERGÖNTZN
+
+
+ ** Befelhszeilnvergöntzung mit <STRG>d und <TAB> **
+
+ 1. Vergwiß di, däß dyr Wimm nit auf n Urwimm-"Glais" fart: :set nocp
+
+ 2. Schaug naach, wölcherne Dauttichtn däß s in n Verzaichniss geit: :!ls
+ older :!dir
+ 3. Zipf önn Anfang von ayner Faudung: :e
+
+ 4. Druck <STRG>d , und dyr Wimm zaigt ayn Listn von Faudungen, wo mit "e"
+ angeend.
+ 5. Druck <TAB> , und dyr Wimm vervollstöndigt önn Faudungsnam zo ":edit".
+
+ 6. Füeg ayn Laerzaichen und önn Anfang von ayner besteehetn Dautticht an:
+ :edit DAU
+
+ 7. Druck <TAB> . Dyr Wimm vergöntzt önn Nam, dös haisst, wenn yr aindeuttig
+ ist.
+Anmörkung: D Vergöntzung geit s für aynn Hauffen Faudungen. Versuech ainfach
+ <STRG>d und <TAB> . Bsunders nützlich ist dös bei :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZAMMENFASSUNG VON DYR LETZN 7
+
+
+ 1. Zipf :help oder druck <F1> oder <HILF> , um ayn Hilffenster z öffnen.
+
+ 2. Zipf :help FAUDUNG , um auf ayn Hilf gan aynn Befelh z kemmen.
+
+ 3. Zipf <STRG>w w , um zo n andern Fenster z springen.
+
+ 4. Zipf :q , um s Hilffenster z schliessn.
+
+ 5. Erstöll ayn vimrc-Ginschripf zuer Sicherung von deine Mötzneinstöllungen.
+
+ 6. Druck <STRG>d , aft däßst naach : ayn Faudung angfangt haast, dyr-
+ mitst mügliche Vergöntzungen anzaigt kriegst.
+ Druck <TAB> für ain Vervollstöndigung yllain.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Dös wär ietzet s End von n Wimmschainer. Gangen ist s daa drum, aynn kurtzn
+ und bündignen Überblik über s Blat WIMM z lifern, netty vil gnueg, däß myn
+ für s Eerste wirklich öbbs dyrmit anfangen kan. Dyrmit ist s aber auf kain
+ Weitn non nit taan; dyr Wimm haat schoon non vil meerer auf Lager. Lis als
+ Naehsts aynmaal s Benutzerhandbuech: :help user-manual
+
+ Zo n Weiterlösn und Weiterlernen wör dös Buech daader zo n Empfelhen:
+ Vim - Vi Improved - von n OUALLINE Steve
+ Verlaag: New Riders
+ Dös ist dös eerste Buech, wo ganz yn n Wimm gwidmt ist, netty dös Grechte für
+ Anfönger. Es haat ayn Wösn Beispiler und aau Bilder drinn.
+ See https://iccf-holland.org/click5.html
+
+ Dös folgete Buech ist schoon ölter und meerer über n Urwimm als wie über n
+ Wimm, aber aau zo n Empfelhen: Textbearbeitung mit dem vi-Editor - von dyr
+ LAMB Linda und n ROBBINS Arnold - Verlaag O'Reilly - Buechlaittzal (ISBN):
+ 3897211262
+ In dönn Buech kan myn fast allss finddn, was myn mit n Urwimm angeen mecht.
+ De söxte Ausgaab enthaltt aau schoon öbbs über n Wimm.
+ Als ietzunde Bezugniss für d Fassung 7 und ayn pfrenge Einfüerung dient dös
+ folgete Buech:
+ vim ge-packt von n WOBST Reinhard
+ mitp-Verlaag, Buechlaittzal 978-3-8266-1781-2
+ Trotz dyr recht pfrengen Darstöllung ist s durch seine viln nützlichnen Bei-
+ spiler aau für Einsteiger grad grecht. Probhaeupster und de Beispilschripfer
+ seind zesig zo n Kriegn; see https://iccf-holland.org/click5.html
+
+ Verfasst habnd dönn Schainer dyr PIERCE Michael C. und WARE Robert K. von dyr
+ Kolraader Knappnschuel (Colorado School of Mines). Er beruet auf Entwürff, wo
+ dyr SMITH Charles von dyr Kolraader Allschuel (Colorado State University)
+ zuer Verfüegung gstöllt haat. Gundpost: bware@mines.colorado.edu
+ Für n Wimm haat n dyr MOOLENAAR Bram barechtt.
+ De bairische Übersötzung stammt von n HELL Sepp 2009, ayn Weeng überarechtt
+ 2011. Sein Gundpostbrächt ist sturmibund@t-online.de
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.bg.utf-8 b/runtime/tutor/tutor.bg.utf-8
new file mode 100644
index 0000000..325ed78
--- /dev/null
+++ b/runtime/tutor/tutor.bg.utf-8
@@ -0,0 +1,1037 @@
+===============================================================================
+= Добре дошли в самоучителя на V I M - Версия 1.7 =
+===============================================================================
+
+ Vim е много мощен редактор с много команди - твърде много, за да бъдат
+ обяснени в ръководство като това. Този самоучител е създаден, за да обясни
+ достатъчно от тях, така че да можете да използвате Vim за всякакви цели.
+
+ Времето, необходимо за уроците, е около 25-30 минути, в зависимост от
+ това, колко време ви трябва за упражненията.
+
+ ВНИМАНИЕ!
+ Командите в уроците ще променят текста им. Запишете файла другаде, за да
+ се упражнявате (ако сте отворили самоучителя с "vimtutor", това вече е
+ направено).
+
+ Важно е да се запомни, че този самоучител е съставен с цел да се учите
+ чрез употреба. Това означава да изпълнявате командите, за да ги научите
+ правилно. Ако просто четете текста, ще забравите командите!
+
+
+ И така, уверете се, че клавишът CapsLock не е натиснат, и натиснете клавиша
+ j няколко пъти, така че Урок 1.1 да се побере на екрана.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.1: ПРИДВИЖВАНЕ НА ПОКАЗАЛЕЦА
+
+
+ ** За да преместите показалеца, натискайте клавишите h,j,k,l както е указано. **
+ ^
+ k Подсказка: Клавишът h е вляво и премества показалеца наляво.
+ < h l > Клавишът l е вдясно и премества показалеца надясно.
+ j Клавишът j прилича на стрелка, насочена надолу.
+ v
+ 1. Движете показалеца насам-натам по екрана, докато свикнете.
+
+ 2. Задръжте клавиша за преместване надолу (j), докато започне да повтаря
+ действието си. Сега знаете как да се придвижите до следващия урок.
+
+ 3. Използвайте клавиша за движение надолу, за да стигнете до Урок 1.2.
+
+Важно! Ако се окаже, че не сте сигурни какво сте въвели, натиснете <ESC>, за да
+ отидете в нормален режим. След това въведете желаната команда отново.
+
+Важно! Клавишите със стрелки би трябвало също да работят, но ако използвате
+ hjkl ще можете да се придвижвате по-бързо, след като свикнете. Наистина!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.2: Излизане от VIM (quit)
+
+
+ Важно!!! Преди да изпълните която и да е от стъпките по-долу, прочетете
+ целия урок!!!
+
+ 1. Натиснете клавиша <ESC> (за да се уверите, че сте в нормален режим).
+
+ 2. Напишете: :q! <ENTER>.
+ Така излизате от редактора без да записвате промените, които сте направили.
+
+ 3. Върнете се тук като изпълните командата, с която пуснахте този самоучител.
+ Това ще да е: vimtutor <ENTER>
+
+ 4. Ако сте сигурни, че сте запомнили стъпките от 1 до 3, изпълнете ги и
+ влезте отново в редактора.
+
+Внимание! :q! <ENTER> отхвърля всички промени, които сте направили. След
+ няколко урока ще се научите как да записвате промени във файл.
+
+ 5. Придвижете показалеца надолу до Урок 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.3: ПРОМЯНА НА ТЕКСТ - ИЗТРИВАНЕ (DELETE)
+
+
+ ** Натиснете x , за да изтриете буквата под показалеца. **
+
+ 1. Придвижете показалеца до реда по-долу, означен със --->.
+
+ 2. За да поправите грешките, придвижете показалеца върху буквата,
+ която ще триете.
+
+ 3. Натиснете клавиша x, за да изтриете нежеланата буква.
+
+ 4. Повтаряйте стъпки от 2 до 4, докато поправите изречението.
+
+---> Кккравата сскоочии връъъъзз ллуннатааа.
+
+ 5. След като горният ред е вече поправен, можем да отидем на Урок 1.4.
+
+Важно! Като правите този урок, не се опитвайте да помните, учете се с правене.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.4: ПРОМЯНА НА ТЕКСТ - ВЪВЕЖДАНЕ (INSERT)
+
+
+ ** Бележка на преводача **
+ В упражненията нататък ще ви се налага да въвеждате текст на български. Vim
+ притежава собствена система за въвеждане на не-латински букви. За да можете
+ да пишете български букви, докато сте в режим за въвеждане, и едновременно с
+ това командите ви да се въвеждат с латински букви, направете следното:
+
+ Натиснете <ESC>, за да се уверите, че не сте в режим за въвеждане.
+
+ Въведете ":set keymap=bulgarian-phonetic" или ":set keymap=bulgarian-bds"
+ (без кавичките!), в зависимост от това коя подредба предпочитате. Забележете,
+ че щом въведете : , те ще се появят в дъното на екрана. Вече можете да
+ въвеждате български букви, без да ползвате системната клавиатурна подредба.
+
+ За да превключвате между двете подредби, докато сте в режим за въвеждане,
+ натискайте CTRL-^ (дръжте натиснати CTRL и SHIFT и натиснете ^).
+
+
+ ** Натиснете i, за да въведете текст. **
+
+ 1. Придвижете показалеца до първия ред долу, означен със --->.
+
+ 2. За да направите първия ред същия като втория, придвижете показалеца върху
+ първата буква СЛЕД мястото, където трябва да бъде въведен текстът.
+
+ 3. Натиснете i и напишете каквото трябва да се добави.
+
+ 4. След поправяне на всяка грешка натискайте <ESC>, за да се върнете към
+ Нормален режим. Повтаряйте стъпки от 2 до 4, докато поправите изречението.
+
+---> Част текс липс н тзи .
+---> Част от текста липсва на този ред.
+
+ 5. След като усвоите въвеждането на текст, отидете на Урок 1.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.5: ПРОМЯНА НА ТЕКСТ - ДОБАВЯНЕ (APPEND)
+
+
+ ** Натиснете A (SHIFT+a) , за да добавите текст. **
+
+ 1. Придвижете показалеца до реда долу, означен със --->.
+ Няма значение на коя буква в реда се намира показалеца.
+
+ 2. Натиснете A и добавете каквото е нужно.
+
+ 3. След като сте добавили каквото е нужно, натиснете <ESC>, за да се върнете
+ в Нормален режим.
+
+ 4. Придвижете показалеца до втория ред означен със ---> и повторете стъпки 2,
+ и 3, за да поправите изречението.
+
+---> Има текст, който липсва
+ Има текст, които липсва на този ред.
+---> Тук също има текст,
+ Тук също има текст, който липсва.
+
+ 5. След като овладеете добавянето на текст, отидете на Урок 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.6: ПРОМЯНА НА ФАЙЛ
+
+ ** Използвайте :wq (write and quit), за да запишете файла и
+ излезете. **
+
+ Внимание! Преди да изпълните която и да е от стъпките долу, прочетете целия урок!!
+
+ 1. Излезте от самоучителя, както направихте в Урок 1.2: :q!
+ Или, ако имате достъп до друг терминал, направете следното там.
+
+ 2. На командния ред напишете следното и натиснете <ENTER>: vim tutor <ENTER>
+ 'vim' е командата, която стартира редактора Vim, 'tutor' е името на файла,
+ които искате да промените. Използвайте файл който може да бъде променян.
+
+ 3. Въвеждайте и изтривайте текст по начините, научени в предишните уроци.
+
+ 4. Запишете файла и излезте от Vim с: :wq <ENTER>
+
+ 5. Ако сте излезли от vimtutor в стъпка 1, пуснете го отново и се придвижете
+ надолу до обобщението, което следва.
+
+ 6. След като прочетете и разберете горните стъпки, направете ги.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1 ОБОБЩЕНИЕ
+
+
+ 1. Показалецът се премества като използвате клавишите със стрелки или с клавишите.
+ h (наляво) j (надолу) k (нагоре) l (надясно)
+
+ 2. За да пуснете Vim от командния ред, напишете: vim ИМЕ-НА-ФАЙЛ <ENTER>
+
+ 3. За да излезете от Vim, напишете:
+ <ESC> :q! <ENTER> за да отхвърлите всички промени.
+ ИЛИ напишете: <ESC> :wq <ENTER> за да запишете промените.
+
+ 4. За да изтриете буква намираща се под показалеца, натиснете: x .
+
+ 5. За да въведете или добавите текст, натиснете:
+ i въведете текста, натиснете <ESC>. Въвежда преди показалеца.
+ A добавете текста, натиснете <ESC>. Добавя в края на реда.
+
+Внимание! С натискане на <ESC> преминавате в Нормален режим или отменяте
+ нежелана, недописана команда.
+
+Сега продължете с Урок 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.1: КОМАНДИ ЗА ИЗТРИВАНЕ
+
+
+ ** Въведете dw , за да изтриете дума. **
+
+ 1. Натиснете <ESC>, за да се уверите, че сте в Нормален режим.
+
+ 2. Придвижете показалеца до реда по-долу, означен със --->.
+
+ 3. Придвижете показалеца до началото на думата, която трябва да бъде изтрита.
+
+ 4. Натиснете последователно dw , и думата ще изчезне.
+
+ Забележка! Буквата d ще се появи на последния ред от екрана, когато я
+ натиснете. Vim ви чака да натиснете w. Ако видите друга буква, значи сте
+ натиснали грешен клавиш. Натиснете <ESC> и започнете отначало.
+
+---> Има някои думи хартия, които забава не са част от това изречение.
+
+ 5. Повтаряйте стъпки 3 и 4, докато поправите изречението, и преминете към
+ Урок 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.2: ОЩЕ КОМАНДИ ЗА ИЗТРИВАНЕ
+
+
+ ** Въведете d$ , за да изтриете всичко до края на реда. **
+
+ 1. Натиснете <ESC>, за да се уверите, че сте в Нормален режим.
+
+ 2. Придвижете показалеца до реда по-долу, означен със --->.
+
+ 3. Придвижете показалеца до правилния ред (СЛЕД първата .).
+
+ 4. Натиснете последователно d$ , за да изтриете всичко до края на реда.
+
+---> Някой е въвел края на този ред двукратно. края на този ред двукратно.
+
+
+ 5. Отидете до Урок 2.3, за да разберете какво се случва.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.3: ЗА ОПЕРАТОРИТЕ И ДВИЖЕНИЯТА
+
+
+ Много команди, които променят текст, се състоят от оператор и движение.
+ Форматът за командата за изтриване с оператора d (delete) е както следва.
+
+ d движение
+
+ Където:
+ d е операторът за изтриване.
+ движение - върху какво ще се приложи операторът (списъкът долу).
+
+ Кратък списък с движения:
+ w - (word) до началото на следващата дума, като се ИЗКЛЮЧВА първата ѝ буква.
+ e - (end of word) до края на текущата дума, ВКЛЮЧИТЕЛНО последната буква.
+ $ - До края на реда, ВКЛЮЧИТЕЛНО последния символ.
+
+ Така, като въведете de, ще изтриете от мястото на показалеца до края на
+ думата.
+
+Забележка! Като натиснете само клавиша за движение, ще преместите показалеца на
+ съответното място.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.4: ИЗПОЛЗВАНЕ НА БРОЯЧ ПРИ ДВИЖЕНИЕ
+
+
+ ** Ако въведете число преди движението, то се повтаря толкова пъти
+ колкото е числото. **
+
+ 1. Придвижете показалеца до началото на реда долу, означен със --->.
+
+ 2. Въведете 2w , за да преместите показалеца с две думи напред.
+
+ 3. Въведете 3e , за да преместите показалеца до края на третата дума
+ напред.
+
+ 4. Въведете 0 (нула), за да отидете в началото на реда.
+
+ 5. Повтаряйте стъпки 2 и 3 с различни числа.
+
+---> Това е просто ред с думи, в който можете да се движите.
+
+ 6. Отидете на Урок 2.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.5: ИЗПОЛЗВАЙТЕ БРОЯЧ, ЗА ДА ТРИЕТЕ ПОВЕЧЕ
+
+
+ ** Ако въведете число преди оператор, действието се повтаря толкова пъти
+ колкото е числото. **
+
+ Както е упоменато горе, за да изтриете повече при използване на оператора за
+ изтриване заедно с движение, трябва да въведете числото преди движението:
+ d число движение
+
+ 1. Придвижете показалеца до първата дума, изписана с ГЛАВНИ БУКВИ в реда,
+ означен със --->.
+
+ 2. Въведете d2w , за да изтриете думите, написани с ГЛАВНИ БУКВИ.
+
+ 3. Повторете стъпки 1 и 2, за да изтриете последователните
+ думи, изписани с големи букви с една команда.
+
+---> този АБВ ГДЕ ред ЖЗИЙ КЛ МНОП РСТ с думи УФХ ЦЧШ ЩЪЬЮЯ е почистен.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.6: РАБОТА С РЕДОВЕ
+
+
+ ** Въведете dd , за да изтриете цял ред. **
+
+ Понеже често се налага да се трие цял ред, създателите на Vim са решили, че ще
+ е по-лесно да се натисне два пъти d, за да се изтрие ред.
+
+ 1. Придвижете показалеца на втория ред в абзаца долу.
+ 2. Въведете dd , за да изтриете реда.
+ 3. Сега отидете на четвъртия ред.
+ 4. Въведете 2dd , за да изтриете два реда.
+
+---> 1) Розите са червени,
+---> 2) Калта е забавление,
+---> 3) Теменужките са сини,
+---> 4) Аз имам кола,
+---> 5) Часовниците показват часа,
+---> 6) Захарта е сладка,
+---> 7) Както и ти.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.7: ОТМЯНА
+
+
+ ** Натиснете u , за да отмените (undo) последната команда; U , за
+ отмяна на всички команди на текущия ред. **
+
+ 1. Придвижете показалеца до началото на реда долу, означен със --->, и го
+ поставете на първата грешка.
+ 2. Въведете x , за да изтриете първата нежелана буква.
+ 3. Сега натиснете u , за да отмените последната изпълнена команда.
+ 4. Този път поправете всички грешки, като използвате командата x.
+ 5. Сега въведете главно U (SHIFT+U), за да върнете реда в първоначалния му вид.
+ 6. А сега натиснете u няколко пъти, за да отмените предишното U и командите
+ преди него.
+ 7. Сега натиснете CTRL-R (redo) (дръжте клавиша CTRL натиснат, докато натискате R)
+ неколкократно, за да изпълните отново командите (да отмените отмените).
+
+---> Пооправеете грешшките нна този реди и ги заменете с отмянаа.
+
+ 8. Това са много полезни команди. Сега отидете на обобщението за Урок 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2 ОБОБЩЕНИЕ
+
+
+ 1. За да изтриете всичко от показалеца до началото на следващата дума, въведете dw
+ 2. За да изтриете всичко от показалеца до края на реда, въведете d$
+ 3. За да изтриете цял ред, въведете dd
+
+ 4. За да повторите движение въведете преди него число 2w
+ 5. Форматът за команда за промяна е:
+ команда [число] движение
+ където:
+ оператор - това, което трябва да се направи (заповед), например d за изтриване
+ [число] - незадължителен брой повторения на движението
+ движение - придвижване в текста, върху който се работи, например w (word),
+ $ (до края на реда) и т.н.
+
+ 6. За да се придвижите до началото на ред, натиснете нула - 0
+
+ 7. За да отмените предишни действия, натиснете u (малка буква u)
+ За да отмените всички промени на един ред, въведете U (главна буква U)
+ За да отмените отмените, натиснете CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.1: КОМАНДАТА ЗА ПОСТАВЯНЕ (PUT)
+
+
+ ** Въведете p , за да поставите изтрит преди това текст след
+ показалеца.**
+
+ 1. Придвижете показалеца до първия ред, означен със ---> долу.
+
+ 2. Въведете dd , за да изтриете реда и да го запишете в регистъра на Vim.
+
+ 3. Придвижете показалеца до реда, означен със c), НАД мястото, където трябва да
+ се постави изтрития ред.
+
+ 4. Въведете p , за да поставите (put) реда под реда, на който е показалеца.
+
+ 5. Повтаряйте стъпки от 2 до 4, за да подредите правилно редовете.
+
+---> d) Ти можеш ли да учиш?
+---> b) Теменужките са сини,
+---> c) Уменията се научават,
+---> a) Розите са червени,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.2: КОМАНДАТА ЗА ЗАМЕСТВАНЕ (REPLACE)
+
+
+ ** Въведете rx , за да заместите буквата под показалеца с x . **
+
+ 1. Придвижете показалеца до първия ред, означен със ---> долу.
+
+ 2. Наместете показалеца така, че да се окаже върху първата грешка.
+
+ 3. Въведете r и след това буквата, с която ще замествате.
+
+ 4. Повтаряйте стъпки 2 и 3 докато първият ред стане същия като втория.
+
+---> Катишо тизе гад и песен, никей а нарескъл гришнета бливочи!
+---> Когато този ред е писан, някой е натискал грешните клавиши!
+
+ 5. Сега отидете на урок 3.3.
+
+Забележка! Помнете, че трябва да се учите, като се упражнявате, а не като се
+ опитвате да запомните.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.3: ОПЕРАТОРЪТ ЗА ПРОМЯНА (CHANGE)
+
+
+ ** За да промените от мястото на показалеца до края на дума, въведете ce . **
+
+ 1. Придвижете показалеца до първия ред долу, означен със --->.
+
+ 2. Поставете показалеца върху з в тзии.
+
+ 3. Въведете ce и правилния остатък от думата ( в този случай ози).
+
+ 4. Натиснете <ESC> и отидете на следващата група букви, които трябва да се променят.
+
+ 5. Повтаряйте стъпки 3 и 4, докато първото изречение стане същото като второто.
+
+---> На тзии ред иам неклико дмуи, ктоио требав да се прмнеято като се изповлза оепртореа за промяна.
+---> На този ред има няколко думи, които трябва да се променят като се използва оператора за промяна.
+
+ Забележете, че ce изтрива думата и преминавате в режим за въвеждане.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.4: ОЩЕ ПРОМЕНИ С ИЗПОЛЗВАНЕ НА c
+
+
+ ** Операторът за промяна се използва със същите движения както при триене **
+
+ 1. Операторът за промяна работи по същия начин като операторът за триене.
+ Форматът е:
+
+ c [число] движение
+
+ 2. Движенията са същите, например: w (word) и $ (край на ред).
+
+ 3. Отидете на първия ред долу, отбелязан със --->.
+
+ 4. Придвижете показалеца до първата грешка.
+
+ 5. Въведете c$ и допишете остатъка от реда така, че да стане същият като
+ долния ред. След това натиснете <ESC>.
+
+---> Краят на този ред трябва да изглежда като долния.
+---> Краят на този ред трябва да бъде поправен с командата c$.
+
+Забележка! Можете да използвате клавиша Backspace за поправка на грешки, докато въвеждате.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3 ОБОБЩЕНИЕ
+
+
+ 1. За да поставите изтрит преди това отнякъде текст, въведете p .
+ Това поставя изтрития текст СЛЕД мястото, на което се намира показалеца.
+ Ако сте изтрили преди това цял ред, той ще бъде поставен като следващ ред.
+
+ 2. За да заместите буква, намираща се под показалеца, въведете r и след
+ това буквата, с която искате да заместите.
+
+ 3. Операторът за промяна ви позволява да променяте текста от мястото на
+ показалеца до мястото, указано от съответното движение. Например, въведете
+ ce за да изтриете от мястото на показалеца до края на думата, или,
+ въведете c$ ,за да замените с нов текст до края на реда.
+
+ 4. Форматът на оператора за промяна е:
+
+ c [число] движение
+
+Сега отидете на следващия урок.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.1: МЕСТОПОЛОЖЕНИЕ НА ПОКАЗАЛЕЦА И СЪСТОЯНИЕ НА ФАЙЛА
+
+ ** Въведете CTRL-G, за да видите къде се намирате във файла и неговото
+ състояние. Въведете G , за да отидете на някой ред. **
+
+Внимание! Прочетете целия урок, преди да изпълните стъпките в него!
+
+ 1. Задръжте натиснат клавиша Ctrl и натиснете g. Това действие го наричаме
+ CTRL-G. В дъното на екрана ще се появи съобщение с името на файла и
+ мястото, където се намира показалецът. Запомнете номера на реда за стъпка 3.
+
+Забележка: Може би виждате мястото на показалеца в долния десен ъгъл на екрана.
+Това се случва, когато настройката 'ruler' е зададена (вижте :help 'ruler' )
+
+ 2. Натиснете G , за да отидете в края на файла.
+ Въведете gg , за да отидете в началото на файла.
+
+ 3. Въведете номера на реда, на който бяхте, и след това натиснете G. Това ще
+ ви върне на мястото където бяхте, когато натиснахте CTRL-G.
+
+ 4. Ако вече се чувствате уверени, изпълнете стъпките от 1 до 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.2: КОМАНДАТА ЗА ТЪРСЕНЕ
+
+
+ ** Въведете / , последвана от фраза, за да потърсите фразата. **
+
+ 1. В Нормален режим въведете знака / . Забележете, че / (наклонената
+ черта) и показалецът се появяват в дъното на екрана, както се случва при
+ използването на командата : .
+
+ 2. Сега въведете 'грешшшка' <ENTER>. Това е думата, която ще търсите.
+
+ 3. За да търсите същата дума отново, натиснете n .
+ За да търсите същата дума отново, но в обратната посока, натиснете N .
+
+ 4. За да търсите за фраза в обратната посока използвайте ? вместо / .
+
+ 5. За да се върнете, там където сте били, натиснете CTRL-O (задръжте Ctrl
+ натиснат докато натискате клавиша o). Повторете, за да отидете още
+ по-назад. С CTRL-I пък отивате напред.
+
+---> "грешшшка" се се пише "грешка" грешшшка е грешка.
+Внимание! Когато търсенето достигне до края на файла, то ще продължи от
+началото на файла, освен ако настройката 'wrapscan' е била нулирана.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.3: ТЪРСЕНЕ НА СЪОТВЕТСТВАЩИ СКОБИ
+
+
+ ** Въведете % , за да на мерите съответната ),], или } . **
+
+ 1. Поставете показалеца върху някоя скоба (, [, или { в реда долу, означен със --->.
+
+ 2. Сега Въведете символа % .
+
+ 3. Показалецът ще се премести върху съответстващата фигурна, квадратна или
+ обикновена скоба.
+
+ 4. Въведете % , за да преместите показалеца на другата съответстваща скоба.
+
+ 5. Придвижете показалеца до друга (,),[,],{ или } скоба и вижте какво прави % .
+
+---> Това ( е ред за проверка с различни скоби като (, [ ] и { } в него. ))
+
+
+Забележка! Това е много полезно при откриване на грешки в програми с несъответстващи скоби.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.4: КОМАНДАТА ЗА ЗАМЕСТВАНЕ (SUBSTITUTE)
+
+
+ ** Въведете :s/старо/ново/g за да заместите 'старо' със 'ново'. **
+
+ 1. Придвижете показалеца до реда долу, означен със --->.
+
+ 2. Въведете :s/тоо/то <ENTER> . Забележете, че командата замества само
+ първото съвпадение с "тоо" на реда.
+
+ 3. Сега въведете :s/тоо/то/g . Като добавите знака g (globally) това
+ означава, че искате да се заместят всички съвпадения, навсякъде в реда.
+
+---> Най-добротоо време да сте на полетоо е лятотоо.
+
+ 4. За да заместите всяко съвпадение на дадена последователност от символи
+ между два реда:
+ Въведете :#,#s/old/new/g където #,# са числата на редовете
+ (първи и последен), обхватът, в който искате да
+ стане заместването.
+ Въведете :%s/old/new/g за да промените всяко съвпадение в целия файл.
+ Въведете :%s/old/new/gc да бъдете питани при всяко съвпадение, дали
+ да се замести или не.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4 ОБОБЩЕНИЕ
+
+
+ 1. CTRL-G показва къде се намирате във файл и състоянието му.
+ G ви отвежда до края на файла.
+ число G ви отвежда до съответния ред.
+ gg ви отвежда до първия ред.
+
+ 2. Ако натиснете / , последвана от низ за търсене, търсите НАПРЕД.
+ Ако натиснете / , последвана от низ за търсене, търсите НАЗАД.
+ След търсене, въведете n , за да намерите следващо съвпадение с низа,
+ който търсите в същата посока, в която търсите или N , за да търсите в
+ обратната посока.
+ CTRL-O ви отвежда назад до старо място във файла, CTRL-I обратно до
+ по-нови места.
+
+ 3. Ако натиснете % докато показалеца се намира на (,),[,],{, или }, той
+ отива до съответстващата скоба.
+
+ 4. За да заместите един низ с друг, въведете :s/низ/друг
+ За да заместите един низ с друг навсякъде в един ред, въведете :s/низ/друг/g
+ За да заместите в даден обхват от редове, въведете :#,#s/низ/друг/g
+ За да заместите всички съвпадения във файл, въведете :%s/низ/друг/g
+ За да бъдете питани при всяко съвпадение, добавете 'c' :%s/низ/друг/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.1: КАК ДА ИЗПЪЛНИМ ВЪНШНА КОМАНДА
+
+
+ ** Въведете :! , последвано от външна команда, за да я изпълните. **
+
+ 1. Въведете познатото ви вече : , за да поставите показалеца в дъното на
+ екрана. Това ви позволява да въвеждате команда.
+
+ 2. Сега въведете ! (удивителен знак). Това ви позволява да изпълнявате
+ всякакви външни команди.
+
+ 3. Например, след ! въведете ls и след това натиснете <ENTER>. Това ще
+ ви покаже списък с файловете и папките точно както ако сте в терминал.
+ Напишете :!dir ако ls не работи.
+
+Забележка: По този начин можете да изпълнявате всякакви външни команди и с аргументи.
+
+Забележка: Всички команди, започващи с : завършват с натискането на <ENTER>
+ От сега нататък няма да го споменаваме постоянно.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.2: ПОВЕЧЕ ЗА ЗАПИСВАНЕТО НА ФАЙЛОВЕ
+
+
+ ** За да запишете промените, направени в текста въведете :w ИМЕНАФАЙЛ. **
+
+ 1. Въведете :!dir или :!ls за да видите списък със съдържанието на
+ текущата папка. Вече знаете, че трябва да натиснете <ENTER> след това.
+
+ 2. Изберете име на файла, което не съществува, например TEST.
+
+ 3. Сега въведете :w TEST (където TEST е името на файла).
+
+ 4. Това записва целия файл (Самоучителя за Vim) под името TEST.
+ За да проверите, напишете :!dir или :!ls отново и вижте съдържанието
+ на вашата папка.
+
+Забележете! Ако излезете от Vim и го пуснете отново, като напишете на командния
+ ред vim TEST , файлът ще бъде точно копие на самоучителя, когато
+ сте го записали.
+
+ 5. Сега изтрийте файла като напишете (в MS-DOS): :!del TEST
+ или (в какъвто и да е Unix) :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.3: ИЗБОР НА ТЕКСТ ЗА ЗАПИС
+
+
+ ** За да запишете част от файла, натиснете v , следвано от движение :w FILENAME **
+
+ 1. Придвижете показалеца на този ред.
+
+ 2. Натиснете v и придвижете показалеца пет реда надолу. Забележете, че
+ текстът се осветява.
+
+ 3. Натиснете : . В дъното на екрана ще се появи :'<,'> .
+
+ 4. Напишете w TEST , където TEST е име на файл, който все още не съществува.
+ Уверете се, че виждате :'<,'>w TEST преди да натиснете <ENTER>.
+
+ 5. Vim ще запише избраните редове във файла TEST. Използвайте :!dir или :!ls ,
+ за да го видите. Не го изтривайте все още! Ще го използваме в следващия урок.
+
+Забележете! Като натиснете v , започвате видимо избиране (Visual selection).
+ Може да движите показалеца наоколо, за да направите избраното
+ по-голямо или по-малко. След което, можете да използвате оператор,
+ за да направите нещо с текста. Например, d изтрива текста.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.4: ИЗВЛИЧАНЕ И СЛИВАНЕ НА ФАЙЛОВЕ
+
+
+ ** За да вмъкнете съдържание на файл в текущия, въведете :r ИМЕНАФАЙЛ **
+
+ 1. Поставете показалеца над този ред.
+
+Важно! След като изпълните стъпка 2, ще видите текста от Урок 5.3. След това
+ отидете НАДОЛУ, за да видите този урок отново.
+
+ 2. Сега извлечете файла TEST, като използвате командата :r TEST , където TEST
+ е името на файла, което сте използвали. Файла, който извлекохте е вмъкнат
+ под реда, на който се намира показалеца.
+
+ 3. За да проверите, че файла е извлечен, отидете назад и ще забележите, че
+ има два урока 5.3 - оригинала и копието от извлечения файл.
+
+Важно! Също така можете да четете изхода от външна команда.
+ :r !ls прочита показаното от ls и го поставя под показалеца.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5 ОБОБЩЕНИЕ
+
+
+ 1. :!команда изпълнява външна команда.
+
+ Някои полезни примери са:
+ (MS-DOS) (Unix)
+ :!dir :!ls - показва съдържанието на директорията, в която
+ се намирате.
+ :!del FILENAME :!rm FILENAME - изтрива файла FILENAME.
+
+ 2. :w FILENAME записва текущия файл под името FILENAME.
+
+ 3. v движение :w FILENAME записва видимо избраните редове във файл с име
+ FILENAME.
+
+ 4. :r FILENAME извлича съдържанието на файла с име FILENAME и го вмъква под
+ мястото, където се намира показалеца
+
+ 5. :r !dir чете изхода на командата dir и го поставя под мястото, на
+ което се намира показалеца.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.1: КОМАНДАТА ЗА ОТВАРЯНЕ (OPEN)
+
+
+ ** Натиснете o , за да отворите ред под показалеца и да преминете в
+ режим за въвеждане. **
+
+ 1. Придвижете показалеца до реда долу, означен със --->.
+
+ 2. Натиснете клавиша o , за да отворите нов ред ПОД показалеца и да преминете
+ в режим за въвеждане.
+
+ 3. Сега въведете някакъв текст и натиснете <ESC> , за да излезете от режима
+ за въвеждане.
+
+---> След като натиснете o , показалеца отива на новоотворения ред и
+ преминавате в режим за въвеждане.
+
+ 4. За да отворите нов ред НАД показалеца, просто въведете главно O вместо
+ малко. Пробвайте това на долния ред.
+
+---> Отворете нов ред над този, като натиснете O , докато показалеца е на
+ този ред.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.2: КОМАНДАТА ЗА ДОБАВЯНЕ (APPEND)
+
+
+ ** Натиснете a , за да въведете текст СЛЕД показалеца. **
+
+ 1. Придвижете показалеца до началото на реда долу, означен със --->.
+
+ 2. Натискайте e , докато показалеца отиде до края на ре .
+
+ 3. Натиснете a (малка буква), за да добавите текст СЛЕД показалеца.
+
+ 4. Допълнете думата както е на следващия ред. Натиснете <ESC> , за да
+ излезете от режима за въвеждане.
+
+ 5. Използвайте e , за да се придвижите до следващата непълна дума и
+ повторете стъпки 3 и 4.
+
+---> Този ре ви позволява да упраж добав на тек в ред.
+---> Този ред ви позволява да упражнявате добавяне на текст в ред.
+
+Важно! a, i и A - с всички тях отивате в режим за въвеждане. Единствената
+ разлика е в това, къде се въвеждат знаците.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.3: ДРУГ НАЧИН ЗА ЗАМЕСТВАНЕ
+
+
+ ** Натиснете главно R , за да заместите повече от един знак. **
+
+ 1. Придвижете показалеца до първия ред долу означен със --->. Придвижете
+ показалеца до началото на първото xxx.
+
+ 2. Сега натиснете R и въведете числото от долния ред, така че да замести xxx .
+
+ 3. Натиснете <ESC> , за да излезете от режима за заместване. Забележете, че
+ остатъка от реда остава непроменен.
+
+ 4. Повторете стъпките, за да заместите другото xxx.
+
+---> Ако добавите 123 към xxx ще получите xxx.
+---> Ако добавите 123 към 456 ще получите 579.
+
+Важно! Режимът за заместване е същия като режима за въвеждане, но всеки въведен
+ знак изтрива съществуващ знак.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.4: КОПИРАНЕ И ЗАМЕСТВАНЕ
+
+
+ ** Използвайте операторът y (yank), за да копирате текст и p (paste),
+ за да го поставите. **
+
+ 1. Отидете до реда, означен със ---> долу и поставете показалеца след "a)".
+
+ 2. Преминете във режим за видимо избиране като използвате v и преместете
+ показалеца точно пред "първата".
+
+ 3. Натиснете y , за да копирате (yank) осветения текст.
+
+ 4. Преместете показалеца на края на следващия ред с j$
+
+ 5. Натиснете p ,за да поставите (paste) текста. След това натиснете пак <ESC> .
+
+ 6. Използвайте режима за видимо избиране, за да изберете " точка.", вземете
+ го с y , отидете на края на следващия ред с j$ и поставете текста с p .
+
+---> a) това е първата точка.
+ b)
+
+ Важно! Можете да използвате y също и като оператор. yw взима цяла дума.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.5: ЗАДАВАНЕ НА НАСТРОЙКА
+
+
+ ** Задайте настройка, та при търсене и заместване, да не се различават
+ големи и малки букви. **
+
+ 1. Търсете 'разли' като въведете /разли <ENTER>
+ Повторете няколко пъти като натискате n .
+
+ 2. Задайте настройката 'ic' (Ignore case) като въведете :set ic
+
+ 3.Сега търсете 'разли' отново като натискате n .
+ Забележете, че сега Разлика и РАЗЛИКА също биват намерени.
+
+ 4. Задайте настройките 'hlsearch' (highlight search)
+ и 'incsearch' (incremental search): :set hls is
+ Тези настройки означават съответно "осветяване на намереното"
+ и "частично търсене".
+
+ 5. Сега въведете отново командата за търсене и вижте какво се случва:
+ /разли <ENTER>
+
+ 6. За да изключите нечувствителното към регистъра на буквите търсене, въведете
+ :set noic
+
+Забележка! За да премахнете осветяването, въведете :nohlsearch
+Забележка! Ако искате да не се прави разлика между главни и малки букви само
+ при едно търсене, въведете \c (латинско ц) в края на низа, който
+ търсите: /разлика\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6 ОБОБЩЕНИЕ
+
+ 1. Натиснете o , за да отворите нов ред ПОД показалеца и да преминете в
+ режим за въвеждане.
+ Натиснете O , за да отворите ред НАД показалеца.
+
+ 2. Натиснете a , за да въведете текст СЛЕД показалеца.
+ Натиснете A , за да въведете текст след края на реда.
+
+ 3. Командата e ви отвежда в края на дума.
+
+ 4. Операторът y взима (yank) текст, а p го поставя (paste).
+
+ 5. Ако въведете R , докато сте в нормален режим, преминавате в режим за
+ заместване, докато натиснете <ESC>.
+
+ 6. Ако напишете ":set xxx", задавате настройката "xxx". Ето някои настройки:
+ 'ic' 'ignorecase' Търсенето не прави разлика между главни и малки букви
+ 'is' 'incsearch' Показва частични съвпадения на търсеното
+ 'hls' 'hlsearch' Осветява всички намерени съвпадения
+ Можете да ползвате кратките или дългите наименувания на настройките
+
+ 7. Поставете "no" отпред за да изключите настройка: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7.1: КАК ДА НАМЕРИМ ПОМОЩ
+
+
+ ** Ползвайте наличната система за помощ **
+
+ Vim върви с изчерпателна система за помощ. За да започнете, опитайте някоя от
+ следните три възможности:
+ - натиснете клавиша <HELP> (ако имате такъв на клавиатурата си)
+ - натиснете клавиша <F1> (ако имате такъв на клавиатурата си)
+ - напишете :help <ENTER>
+
+ Прочетете текста в прозореца за помощ, за да разберете как работи системата.
+ Натиснете CTRL-W CTRL-W (два пъти CTRL-W), за да прескочите от един прозорец в друг.
+ Въведете :q <ENTER> , за да затворите прозореца за помощ.
+
+ Можете да намерите помощ по всякакъв въпрос, като напишете
+ ":help" именакоманда. Опитайте следните (не забравяйте да натискате <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7.2: СЪЗДАЙТЕ СКРИПТ ЗА СТАРТИРАНЕ
+
+
+ ** Включване на възможностите на Vim **
+
+ Vim има много повече възможности от Vi, но по подразбиране повечето от тях не
+ са включени. За да започнете да ползвате тези възможности, трябва да
+ създадете файл, наречен "vimrc".
+
+ 1. Създайте вашия файл "vimrc". В зависимост от вашата операционна система:
+ :e ~/.vimrc за всеки вид Unix
+ :e ~/_vimrc за MS-Windows
+
+ 2. Сега прочетете съдържанието на примерния файл "vimrc":
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Запишете файла с:
+ :w
+
+ Следващият път като пуснете Vim той ще осветява текста във файловете, които
+ отваряте в зависимост от синтаксиса им. Можете да добавите всичките си
+ предпочитани настройки в този файл. За повече информация, въведете
+ :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7.3: ДОВЪРШВАНЕ
+
+
+ ** Довършване на команди с CTRL-D и <TAB> **
+
+ 1. Уверете се, че Vim е в несъвместим режим: :set nocp
+
+ 2. Вижте какви файлове има в папката ви: :!ls или :!dir
+
+ 3. Въведете началото на команда: :e
+
+ 4. Натиснете CTRL-D и Vim ще ви покаже команди, започващи с "e".
+
+ 5. Натиснете <TAB> и Vim ще допълни командата до ":edit".
+
+ 6. Сега добавете празно пространство и началото на името на съществуващ файл:
+ :edit FIL
+
+ 7. Натиснете <TAB>. Vim ще допълни името (ако е единствено).
+
+Важно! Допълването работи за много команди. Просто натиснете CTRL-D и/или
+ <TAB>. Особено полезно е при намиране на помощ :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7 ОБОБЩЕНИЕ
+
+
+ 1. Напишете :help или натиснете <F1> или <Help> за да отворите помощния
+ прозорец.
+
+ 2. Напишете :help cmd , за да намерите помощ за cmd .
+
+ 3. Натиснете CTRL-W CTRL-W , за да прескочите в друг прозорец.
+ 4. Напишете :q , за да затворите помощния прозорец.
+
+ 5. Създайте файл за стартиране vimrc, за да запазите предпочитаните от вас
+ настройки.
+
+ 6. Когато въвеждате команда след : , натиснете CTRL-D , за да видите
+ възможностите за допълване. Натиснете <TAB> , за да използвате някоя от
+ предложените възможности за допълване.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ С това завършва Самоучителят на Vim. Той бе предназначен да даде кратък
+ преглед на текстовия редактор Vim. Съвсем достатъчно, за да можете да
+ ползвате редактора лесно. Самоучителят е доста непълен, понеже Vim има много
+ повече команди. Сега прочете наръчника за потребителя: ":help user-manual".
+
+ Препоръчваме следната книга за по-нататъшно четене:
+ Vim - Vi Improved - от Steve Oualline
+ Издател: New Riders
+ Това е първата книга, изцяло посветена на Vim. Особено полезна е за
+ начинаещи. В нея ще намерите много примери и картинки.
+ Вижте https://iccf-holland.org/click5.html
+
+ Следната книга е по-стара и по-скоро за Vi отколкото за Vim, но също се препоръчва:
+ Learning the Vi Editor - от Linda Lamb
+ Издател: O'Reilly & Associates Inc.
+ Това е книга, която ще ви запознае с почти всичко във Vi.
+ Шестото издание включва и информация за Vim.
+
+ Този самоучител е написан от Michael C. Pierce и Robert K. Ware,
+ Colorado School of Mines, като използва идеи предоставени от Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Променен за Vim от Bram Moolenaar.
+
+ Превод от Красимир Беров <berov@cpan.org>, юли 2016.
+ Този превод е подарък за сина ми Павел и е посветен на българските деца.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
diff --git a/runtime/tutor/tutor.ca b/runtime/tutor/tutor.ca
new file mode 100644
index 0000000..808a87d
--- /dev/null
+++ b/runtime/tutor/tutor.ca
@@ -0,0 +1,809 @@
+===============================================================================
+= B e n v i n g u t s a l t u t o r d e l V I M - Versi 1.5 =
+===============================================================================
+
+ El Vim s un editor potent i t moltes ordres, massa com per a
+ explicar-les totes un tutor com aquest. Aquest tutor est pensat per a
+ ensenyar les ordres bsiques que us permetin fer servir el Vim com a
+ editor de propsit general.
+
+ El temps aproximat de completar el tutor s d'uns 25 o 30 minuts
+ depenent de quant temps dediqueu a experimentar.
+
+ Feu una cpia d'aquest fitxer per a practicar-hi (si heu comenat amb
+ el programa vimtutor aix que esteu llegint ja s una cpia).
+
+ s important recordar que aquest tutor est pensat per a ensenyar
+ practicant, s a dir que haureu d'executar les ordres si les voleu
+ aprendre. Si noms llegiu el text el ms probable s que les oblideu.
+
+ Ara assegureu-vos que la tecla de bloqueig de majscules no est
+ activada i premeu la tecla j per a moure el cursor avall, fins que la
+ lli 1.1 ocupi completament la pantalla.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 1.1: MOURE EL CURSOR
+
+
+ ** Per a moure el cursor premeu les tecles h, j, k, l tal com s'indica. **
+ ^
+ k Pista: La h s a l'esquerra i mou el cursor cap a l'esquerra.
+ < h l > La l s a la dreta i mou el cursor cap a la dreta.
+ j La j sembla una fletxa cap avall.
+ v
+ 1. Moveu el cursor per la pantalla fins que us sentiu confortables.
+
+ 2. Mantingueu premuda la tecla avall (j) una estona.
+---> Ara ja sabeu com moure-us fins a la segent lli.
+
+ 3. Usant la tecla avall, aneu a la lli 1.2.
+
+Nota: Si no esteu segurs de la tecla que heu premut, premeu <ESC> per a
+ tornar al mode Normal. Llavors torneu a teclejar l'ordre que voleu.
+
+Nota: Les tecles de moviment del cursor (fletxes) tamb funcionen. Per
+ usant hjkl anireu ms rpid un cop us hi hagueu acostumant.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 1.2: ENTRAR I SORTIR DEL VIM
+
+
+ !! NOTA: Abans de seguir els passos segents llegiu *tota* la lli!!
+
+ 1. Premeu <ESC> (per a estar segurs que esteu en el mode Normal).
+
+ 2. Teclegeu: :q! <ENTRAR>.
+
+---> Amb aix sortireu de l'editor SENSE desar els canvis que hagueu pogut
+ fer. Si voleu desar els canvis teclegeu:
+ :wq <ENTRAR>
+
+ 3. Quan vegeu l'introductor de l'intrpret escriviu l'ordre amb la
+ qual heu arribat a aquest tutor. Podria ser: vimtutor <ENTRAR>
+ O b: vim tutor <ENTRAR>
+
+---> 'vim' s l'editor vim, i 'tutor' s el fitxer que voleu editar.
+
+ 4. Si heu memoritzat les ordres, feu els passos anteriors, de l'1 al 3,
+ per a sortir i tornar a entrar a l'editor. Llavors moveu el cursor
+ avall fins a la lli 1.3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 1.3: EDITAR TEXT - ESBORRAR
+
+
+ ** En mode Normal premeu x per a esborrar el carcter sota el cursor. **
+
+ 1. Moveu el cursor fins a la lnia que hi ha ms avall senyalada amb --->.
+
+ 2. Poseu el cursor a sobre el carcter que cal esborrar per a corregir
+ els errors.
+
+ 3. Premeu la tecla x per a esborrar el carcter.
+
+ 4. Repetiu els passos 2 i 3 fins que la frase sigui correcta.
+
+---> Unna vaaca vva salttar perr sobbree la llluna.
+
+ 5. Ara que la lnia s correcta, aneu a la lli 1.4.
+
+NOTA: Mentre aneu fent no tracteu de memoritzar, practiqueu i prou.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 1.4: EDITAR TEXT - INSERIR
+
+
+ ** En mode Normal premeu i per a inserir text. **
+
+ 1. Moveu el cursor avall fins la primera lnia senyalada amb --->.
+
+ 2. Per a fer la primera lnia igual que la segona poseu el cursor sobre
+ el primer carcter POSTERIOR al text que s'ha d'inserir.
+
+ 3. Premeu la tecla i i escriviu el text que falta.
+
+ 4. Quan hageu acabat premeu <ESC> per tornar al mode Normal. Repetiu
+ els passos 2, 3 i 4 fins a corregir la frase.
+
+---> Falten carctrs en aquesta .
+---> Falten alguns carcters en aquesta lnia.
+
+ 5. Quan us trobeu cmodes inserint text aneu al sumari de baix.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLI 1 SUMARI
+
+
+ 1. El cursor es mou amb les fletxes o b amb les tecles hjkl.
+ h (esquerra) j (avall) k (amunt) l (dreta)
+
+ 2. Per a entrar al Vim (des de l'intrpret) escriviu: vim FITXER <ENTRAR>
+
+ 3. Per a sortir teclegeu: <ESC> :q! <ENTRAR> per a descartar els canvis.
+ O B teclegeu: <ESC> :wq <ENTRAR> per a desar els canvis.
+
+ 4. Per a esborrar el carcter de sota el cursor en el mode Normal premeu: x
+
+ 5. Per a inserir text on hi ha el cursor, en mode Normal, premeu:
+ i escriviu el text <ESC>
+
+NOTA: La tecla <ESC> us porta al mode Normal o cancella una ordre que
+ estigui a mitges.
+
+Ara continueu a la lli 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 2.1: ORDRES PER ESBORRAR
+
+
+ ** Teclegeu dw per a esborrar fins al final d'una paraula. **
+
+ 1. Premeu <ESC> per estar segurs que esteu en mode normal.
+
+ 2. Moveu el cursor avall fins a la lnia senyalada amb --->.
+
+ 3. Moveu el cursor fins al principi de la paraula que s'ha d'esborrar.
+
+ 4. Teclegeu dw per a fer desaparixer la paraula.
+
+NOTA: Les lletres dw apareixeran a la lnia de baix de la pantalla mentre
+ les aneu escrivint. Si us equivoqueu premeu <ESC> i torneu a comenar.
+
+---> Hi ha algunes paraules divertit que no pertanyen paper a aquesta frase.
+
+ 5. Repetiu el passos 3 i 4 fins que la frase sigui correcta i continueu
+ a la lli 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 2.2: MS ORDRES PER ESBORRAR
+
+
+ ** Escriviu d$ per a esborrar fins al final de la lnia. **
+
+ 1. Premeu <ESC> per a estar segurs que esteu en el mode Normal.
+
+ 2. Moveu el cursor avall fins a la lnia senyalada amb --->.
+
+ 3. Moveu el cursor fins al final de la lnia correcta
+ (DESPRS del primer . ).
+
+ 4. Teclegeu d$ per a esborrar fins al final de la lnia.
+
+---> Alg ha escrit el final d'aquesta lnia dos cops. lnia dos cops.
+
+ 5. Aneu a la lli 2.3 per a entendre qu est passant.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 2.3: SOBRE ORDRES I OBJECTES
+
+
+ El format de l'ordre d'esborrar d s el segent:
+
+ [nombre] d objecte O B d [nombre] objecte
+ On:
+ nombre - s el nombre de cops que s'ha d'executar (opcional, omissi=1).
+ d - s l'ordre d'esborrar.
+ objecte - s la cosa amb la qual operar (llista a baix).
+
+ Una petita llista d'objectes:
+ w - des del cursor fins al final de la paraula, incloent l'espai.
+ e - des del cursor fins al final de la paraula, SENSE incloure l'espai.
+ $ - des del cursor fins al final de la lnia.
+
+NOTA: Per als aventurers: si teclegeu noms l'objecte, en el mode Normal,
+ sense cap ordre, el cursor es mour tal com est descrit a la llista
+ d'objectes.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 2.4: UNA EXCEPCI A 'ORDRE-OBJECTE'
+
+
+ ** Teclegeu dd per a esborrar tota la lnia. **
+
+ Com que molt sovint s'han d'eliminar lnies senceres, els programadors
+ del Vi van creure que seria ms convenient teclejar dd per a esborrar
+ tota la lnia.
+
+ 1. Moveu el cursor a la segona lnia de la frase de baix.
+ 2. Teclegeu dd per a esborrar la lnia.
+ 3. Ara aneu a la quarta lnia.
+ 4. Teclegeu 2dd per a esborrar dues lnies (recordeu nombre-ordre-objecte).
+
+ 1) Les roses sn vermelles,
+ 2) El fang s divertit,
+ 3) Les violetes sn blaves,
+ 4) Tinc un cotxe,
+ 5) Els rellotges diuen l'hora,
+ 6) El sucre s dol,
+ 7) Igual que tu.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 2.5: L'ORDRE DESFER
+
+
+ ** Premeu u per a desfer els canvis, U per a restaurar tota la lnia. **
+
+ 1. Moveu el cursor sobre el primer error de lnia de baix senyalada amb --->
+ 2. Premeu x per a esborrar el carcter no desitjat.
+ 3. Ara premeu u per a desfer l'ltima ordre executada.
+ 4. Aquest cop corregiu tots els errors de la lnia amb l'ordre x.
+ 5. Ara premeu U per a restablir la lnia al seu estat original.
+ 6. Ara premeu u uns quants cops per a desfer U i les ordres anteriors.
+ 7. Ara premeu CONTROL-R (les dues tecles al mateix temps) uns quants cops
+ per a refer les ordres.
+
+---> Correegiu els errors d'aqquesta lnia i dessfeu-los aamb desfer.
+
+ 8. Aquestes ordres sn molt tils. Ara aneu al sumari de la lli 2.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLI 2 SUMARI
+
+
+ 1. Per a esborrar del cursor al final de la paraula teclegeu: dw
+
+ 2. Per a esborrar del cursor al final de la lnia teclegeu: d$
+
+ 3. Per a esborrar una lnia sencera teclegeu: dd
+
+ 4. El format de qualsevol ordre del mode Normal s:
+
+ [nombre] ordre objecte O B ordre [nombre] objecte
+ on:
+ nombre - s quants cops repetir l'ordre
+ ordre - s qu fer, com ara d per esborrar
+ objecte - s amb qu s'ha d'actuar, com ara w (paraula),
+ $ (fins a final de lnia), etc.
+
+ 5. Per a desfer les accions anteriors premeu: u
+ Per a desfer tots el canvis en una lnia premeu: U
+ Per a desfer l'ordre desfer premeu: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 3.1: L'ORDRE 'POSAR'
+
+
+ ** Premeu p per a inserir l'ltima cosa que heu esborrat
+ desprs del cursor. **
+
+
+ 1. Moveu el cursor a la primera lnia de llista de baix.
+
+ 2. Teclegeu dd per a esborrar la lnia i desar-la a la memria.
+
+ 3. Moveu el cursor a la lnia ANTERIOR d'on hauria d'anar.
+
+ 4. En mode Normal, premeu p per a inserir la lnia.
+
+ 5. Repetiu els passos 2, 3 i 4 per a ordenar les lnies correctament.
+
+ d) Pots aprendre tu?
+ b) Les violetes sn blaves,
+ c) La intelligncia s'aprn,
+ a) Les roses sn vermelles,
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 3.2: L'ORDRE SUBSTITUIR
+
+
+ ** Premeu r i un carcter per a substituir el carcter
+ de sota el cursor. **
+
+ 1. Moveu el cursor a la primera lnia de sota senyalada amb --->.
+
+ 2. Moveu el cursor a sobre del primer carcter equivocat.
+
+ 3. Premeu r i tot seguit el carcter correcte per a corregir l'error.
+
+ 4. Repetiu els passos 2 i 3 fins que la lnia sigui correcta.
+
+---> Quen van escroure aquerta lnia, algh va prmer tikles equivocades!
+---> Quan van escriure aquesta lnia, alg va prmer tecles equivocades!
+
+ 5. Ara continueu a la lli 3.2.
+
+NOTA: Recordeu que heu de practicar, no memoritzar.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 3.3: L'ORDRE CANVIAR
+
+
+ ** Per a canviar una part o tota la paraula, escriviu cw . **
+
+ 1. Moveu el cursor a la primera lnia de sota senyalada amb --->.
+
+ 2. Poseu el cursor sobre la u de 'lughc'.
+
+ 3. Teclegeu cw i corregiu la paraula (en aquest cas, escrivint 'nia'.)
+
+ 4. Premeu <ESC> i aneu al segent error.
+
+ 5. Repetiu els passos 3 i 4 fins que les dues frases siguin iguals.
+
+---> Aquesta lughc t algunes paradskl que s'han de cdddf.
+---> Aquesta lnia t algunes paraules que s'han de canviar.
+
+Noteu que cw no noms canvia la paraula, tamb us posa en mode d'inserci.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 3.4: MS CANVIS AMB c
+
+
+ ** L'ordre canviar s'usa amb els mateixos objectes que l'ordre esborrar. **
+
+ 1. L'ordre canviar funciona igual que la d'esborrar. El format s:
+
+ [nombre] c objecte O B c [nombre] objecte
+
+ 2. Els objectes sn els mateixos, w (paraula), $ (final de lnia), etc.
+
+ 3. Moveu el cursor fins la primera lnia senyalada amb --->.
+
+ 4. Avanceu fins al primer error.
+
+ 5. Premeu c$ per fer la lnia igual que la segona i premeu <ESC>.
+
+---> El final d'aquesta lnia necessita canvis per ser igual que la segona.
+---> El final d'aquesta lnia s'ha de corregir amb l'ordre c$.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLI 3 SUMARI
+
+
+ 1. Per a tornar a posar el text que heu esborrat, premeu p . Aix posa
+ el text esborrat DESPRS del cursor (si heu esborrat una lnia anir
+ a parar a la lnia SEGENT d'on hi ha el cursor).
+
+ 2. Per a substituir el carcter de sota el cursor, premeu r i tot
+ seguit el carcter que ha de reemplaar l'original.
+
+ 3. L'ordre canviar permet canviar l'objecte especificat, des del cursor
+ fins el final de l'objecte. Per exemple, cw canvia el que hi ha des
+ del cursor fins al final de la paraula, i c$ fins al final de
+ lnia.
+
+ 4. El format de l'ordre canviar s:
+
+ [nombre] c objecte O B c [nombre] objecte
+
+Ara aneu a la segent lli.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 4.1: SITUACI I ESTAT DEL FITXER
+
+
+ ** Premeu CTRL-g per a veure la situaci dins del fitxer i el seu estat.
+ Premeu SHIFT-g per a anar a una lnia determinada. **
+
+ Nota: No proveu res fins que hagueu llegit TOTA la lli!!
+
+ 1. Mantingueu premuda la tecla Control i premeu g . A la part de baix
+ de la pgina apareixer un lnia amb el nom del fitxer i la lnia en
+ la qual us trobeu. Recordeu el nmero de la lnia pel Pas 3.
+
+ 2. Premeu Shift-g per a anar al final de tot del fitxer.
+
+ 3. Teclegeu el nmero de la lnia on reu i desprs premeu Shift-g. Aix
+ us tornar a la lnia on reu quan heu premut per primer cop Ctrl-g.
+ (Quan teclegeu el nmero NO es veur a la pantalla.)
+
+ 4. Ara executeu els passos de l'1 al 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 4.2: L'ORDRE CERCAR
+
+
+ ** Premeu / seguit de la frase que vulgueu cercar. **
+
+ 1. En el mode Normal premeu el carcter / . Noteu que el cursor apareix
+ a la part de baix de la pantalla igual que amb l'ordre : .
+
+ 2. Ara escriviu 'errroor' <ENTRAR>. Aquesta s la paraula que voleu
+ cercar.
+
+ 3. Per a tornar a cercar la mateixa frase, premeu n . Per a cercar la
+ mateixa frase en direcci contraria, premeu Shift-n .
+
+ 4. Si voleu cercar una frase en direcci ascendent, useu l'ordre ? en
+ lloc de /.
+
+---> "errroor" no s com s'escriu error; errroor s un error.
+
+Nota: Quan la cerca arribi al final del fitxer continuar a l'inici.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 4.3: CERCA DE PARNTESIS
+
+
+ ** Premeu % per cercar el ), ], o } corresponent. **
+
+ 1. Poseu el cursor a qualsevol (, [, o { de la lnia senyalada amb --->.
+
+ 2. Ara premeu el carcter % .
+
+ 3. El cursor hauria d'anar a la clau o parntesis corresponent.
+
+ 4. Premeu % per a tornar el cursor al primer parntesi.
+
+---> Aix ( s una lnia amb carcters (, [ ] i { } de prova. ))
+
+Nota: Aix s molt til per a trobar errors en programes informtics!
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 4.4: UNA MANERA DE CORREGIR ERRORS
+
+
+ ** Escriviu :s/vell/nou/g per a substituir 'vell' per 'nou'. **
+
+ 1. Moveu el cursor a la lnia de sota senyalada amb --->.
+
+ 2. Escriviu :s/laa/la <ENTRAR>. Aquesta ordre noms canvia la primera
+ coincidncia que es trobi a la lnia.
+
+ 3. Ara escriviu :s/laa/la/g per a fer una substituci global. Aix
+ canviar totes les coincidncies que es trobin a la lnia.
+
+---> laa millor poca per a veure laa flor s laa primavera.
+
+ 4. Per a canviar totes les coincidncies d'una cadena entre dues lnies,
+ escriviu :#,#s/vell/nou/g on #,# sn els nombres de les lnies.
+ Escriviu :%s/vell/nou/g per a substituir la cadena a tot el fitxer.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLI 4 SUMARI
+
+
+ 1. Ctrl-g mostra la posici dins del fitxer i l'estat del mateix.
+ Shift-g us porta al final del fitxer. Un nmero seguit de Shift-g us
+ porta a la lnia corresponent.
+
+ 2. L'ordre / seguida d'una frase cerca la frase cap ENDAVANT.
+ L'ordre ? seguida d'una frase cerca la frase cap ENDARRERE.
+ Desprs d'una cerca premeu n per a trobar la prxima coincidncia en
+ la mateixa direcci, o Shift-n per a cercar en la direcci contrria.
+
+ 3. L'ordre % quan el cursor es troba en un (, ), [, ], {, o } troba la
+ parella corresponent.
+
+ 4. Per a substituir el primer 'vell' per 'nou' en una lnia :s/vell/nou
+ Per a substituir tots els 'vell' per 'nou' en una lnia :s/vell/nou/g
+ Per a substituir frases entre les lnies # i # :#,#s/vell/nou/g
+ Per a substituir totes les coincidncies en el fitxer :%s/vell/nou/g
+ Per a demanar confirmaci cada cop afegiu 'c' :%s/vell/nou/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 5.1: COM EXECUTAR UNA ORDRE EXTERNA
+
+
+ ** Teclegeu :! seguit d'una ordre externa per a executar-la. **
+
+ 1. Premeu el familiar : per a collocar el cursor a la part de baix de
+ la pantalla. Aix us permet entrar una ordre.
+
+ 2. Ara teclegeu el carcter ! (signe d'exclamaci). Aix us permet
+ executar qualsevol ordre de l'intrpret del sistema.
+
+ 3. Per exemple, escriviu ls i tot seguit premeu <ENTRAR>. Aix us
+ mostrar el contingut del directori, tal com si estigussiu a la
+ lnia d'ordres. Proveu :!dir si ls no funciona.
+
+Nota: D'aquesta manera s possible executar qualsevol ordre externa.
+
+Nota: Totes les ordres : s'han d'acabar amb la tecla <ENTRAR>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 5.2: MS SOBRE L'ESCRIPTURA DE FITXERS
+
+
+ ** Per a desar els canvis fets, escriviu :w FITXER. **
+
+ 1. Escriviu :!dir o b :!ls per a obtenir un llistat del directori.
+ Ja sabeu que heu de prmer <ENTRAR> desprs d'aix.
+
+ 2. Trieu un nom de fitxer que no existeixi, com ara PROVA.
+
+ 3. Ara feu: :w PROVA (on PROVA s el nom que heu triat.)
+
+ 4. Aix desa el text en un fitxer amb el nom de PROVA. Per a comprovar-ho
+ escriviu :!dir i mireu el contingut del directori.
+
+Note: Si sortiu del Vim i entreu una altra vegada amb el fitxer PROVA, el
+ fitxer ser una cpia exacta del tutor que heu desat.
+
+ 5. Ara esborreu el fitxer teclejant (MS-DOS): :!del PROVA
+ o b (Unix): :!rm PROVA
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 5.3: UNA ORDRE SELECTIVA PER A DESAR
+
+
+ ** Per a desar una part del fitxer, escriviu :#,# w FITXER **
+
+ 1. Un altre cop, feu :!dir o :!ls per a obtenir un llistat del
+ directori i trieu un nom de fitxer adequat com ara PROVA.
+
+ 2. Moveu el cursor a dalt de tot de la pgina i premeu Ctrl-g per
+ saber el nmero de la lnia. RECORDEU AQUEST NMERO!
+
+ 3. Ara aneu a baix de tot de la pgina i torneu a prmer Ctrl-g.
+ RECORDEU AQUEST NMERO TAMB!
+
+ 4. Per a desar NOMS una secci en un fitxer, escriviu :#,# w PROVA on
+ #,# sn els dos nmeros que heu recordat (dalt, baix) i PROVA el nom
+ del fitxer.
+
+ 5. Comproveu que el fitxer nou hi sigui amb :!dir per no l'esborreu.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 5.4: OBTENIR I AJUNTAR FITXERS
+
+
+ ** Per a inserir el contingut d'un fitxer, feu :r FITXER **
+
+ 1. Assegureu-vos, amb l'ordre :!dir , que el fitxer PROVA encara hi s.
+
+ 2. Situeu el cursor a dalt de tot d'aquesta pgina.
+
+NOTA: Desprs d'executar el Pas 3 veureu la lli 5.3. Tireu cap avall
+ fins a aquesta lli un altre cop.
+
+ 3. Ara obtingueu el fitxer PROVA amb l'ordre :r PROVA on PROVA s el
+ nom del fitxer.
+
+NOTA: El fitxer que obtingueu s'insereix en el lloc on hi hagi el cursor.
+
+ 4. Per a comprovar que s'ha obtingut el fitxer tireu enrere i mireu com
+ ara hi ha dues cpies de la lli 5.3, l'original i la del fitxer.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLI 5 SUMARI
+
+
+ 1. :!ordre executa una ordre externa.
+
+ Alguns exemples tils:
+ (MS-DOS) (Unix)
+ :!dir :!ls - mostra un llistat del directori
+ :!del FITXER :!rm FITXER - esborra el fitxer FITXER
+
+ 2. :w FITXER escriu el fitxer editat al disc dur, amb el nom FITXER.
+
+ 3. :#,#w FITXER desa les lnies de # a # en el fitxer FITXER.
+
+ 4. :r FITXER llegeix el fitxer FITXER del disc dur i l'insereix en el
+ fitxer editat a la posici on hi ha el cursor.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 6.1: L'ORDRE OBRIR
+
+
+ ** Premeu o per a obrir una lnia i entrar en mode inserci. **
+
+ 1. Moveu el cursor a la lnia de sota senyalada amb --->.
+
+ 2. Premeu o (minscula) per a obrir una lnia a BAIX del cursor i
+ situar-vos en mode d'inserci.
+
+ 3. Copieu la lnia senyalada amb ---> i premeu <ESC> per a tornar al mode
+ normal.
+
+---> Desprs de prmer o el cursor se situa a la lnia nova en mode inserci.
+
+ 4. Per a obrir una lnia a SOBRE del cursor, premeu la O majscula, en lloc
+ de la minscula. Proveu-ho amb la lnia de sota.
+Obriu una lnia sobre aquesta prement Shift-o amb el cursor en aquesta lnia.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 6.2: L'ORDRE AFEGIR
+
+
+ ** Premeu a per a afegir text DESPRS del cursor. **
+
+ 1. Moveu el cursor al final de la primera lnia de sota senyalada
+ amb ---> prement $ en el mode Normal.
+
+ 2. Premeu la lletra a (minscula) per a afegir text DESPRS del carcter
+ sota el cursor. (La A majscula afegeix text al final de la lnia.)
+
+Nota: Aix s'evita haver de prmer i , l'ltim carcter, el text a inserir,
+ la tecla <ESC>, cursor a la dreta, i finalment x , noms per afegir
+ text a final de lnia.
+
+ 3. Ara completeu la primera lnia. Tingueu en compte que aquesta ordre
+ s exactament igual que la d'inserir, excepte pel que fa al lloc on
+ s'insereix el text.
+
+---> Aquesta lnia us permetr practicar
+---> Aquesta lnia us permetr practicar afegir text a final de lnia.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 6.3: UNA ALTRA MANERA DE SUBSTITUIR
+
+
+ ** Teclegeu una R majscula per a substituir ms d'un carcter. **
+
+ 1. Moveu el cursor a la lnia de sota senyalada amb --->.
+
+ 2. Poseu el cursor al principi de la primera paraula que s diferent
+ respecte a la segona lnia senyalada amb ---> (la paraula "l'ltima").
+
+ 3. Ara premeu R i substituu el que queda de text a la primera lnia
+ escrivint sobre el text vell, per a fer-la igual que la segona.
+
+---> Per a fer aquesta lnia igual que l'ltima useu les tecles.
+---> Per a fer aquesta lnia igual que la segona, premeu R i el text nou.
+
+ 4. Tingueu en compte que en prmer <ESC> per a sortir, el text que no
+ s'hagi alterat es mant.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lli 6.4: ESTABLIR OPCIONS
+
+ ** Feu que les ordres cercar o substituir ignorin les diferncies
+ entre majscules i minscules **
+
+ 1. Cerqueu la paraula 'ignorar' amb: /ignorar
+ Repetiu-ho uns quants cops amb la tecla n.
+
+ 2. Establiu l'opci 'ic' (ignore case) escrivint:
+ :set ic
+
+ 3. Ara cerqueu 'ignorar' un altre cop amb la tecla n.
+ Repetiu-ho uns quants cops ms.
+
+ 4. Establiu les opcions 'hlsearch' i 'incsearch':
+ :set hls is
+
+ 5. Ara torneu a executar una ordre de cerca, i mireu qu passa:
+ /ignorar
+
+ 6. Per a treure el ressaltat dels resultats, feu:
+ :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLI 6 SUMARI
+
+
+ 1. L'ordre o obre una lnia a SOTA la del cursor i mou el cursor a la nova
+ lnia, en mode Inserci.
+ La O majscula obre la lnia a SOBRE la que hi ha el cursor.
+
+ 2. Premeu una a per a afegir text DESPRS del carcter a sota del cursor.
+ La A majscula afegeix automticament el text a final de lnia.
+
+ 3. L'ordre R majscula us posa en mode substituci fins que premeu <ESC>.
+
+ 4. Escriviu ":set xxx" per a establir l'opci "xxx"
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLI 7: ORDRES D'AJUDA
+
+
+ ** Utilitzeu el sistema intern d'ajuda **
+
+ El Vim t un extens sistema d'ajuda. Per a llegir una introducci proveu una
+ d'aquestes tres coses:
+ - premeu la tecla <AJUDA> (si la teniu)
+ - premeu la tecla <F1> (si la teniu)
+ - escriviu :help <ENTRAR>
+
+ Teclegeu :q <ENTRAR> per a tancar la finestra d'ajuda.
+
+ Podeu trobar ajuda sobre prcticament qualsevol tema passant un argument
+ a l'ordre ":help". Proveu el segent (no oblideu prmer <ENTRAR>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLI 8: CREAR UN SCRIPT D'INICI
+
+ ** Activeu funcions automticament **
+
+ El Vim t moltes ms funcions que el Vi, per moltes estan desactivades
+ per defecte. Per a comenar a utilitzar ms funcions heu de crear un
+ fitxer "vimrc".
+
+ 1. Comenceu a editar el fitxer "vimrc", depenent del sistema
+ :edit ~/.vimrc per Unix
+ :edit ~/_vimrc per MS-Windows
+
+ 2. Llegiu el fitxer "vimrc" d'exemple:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Deseu el fitxer amb:
+
+ :write
+
+ El prxim cop que executeu el Vim usar ressaltat de sintaxi. Podeu
+ afegir els ajustos que vulgueu en aquest fitxer "vimrc".
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Aqu conclou el Tutor del Vim. s una breu introducci a l'editor Vim,
+ suficient perqu el pugueu comenar a fer servir. No s complet perqu
+ el Vim t moltes ordres. Per a llegir el manual de l'usuari, feu:
+ ":help user-manual".
+
+ Per a un estudi ms a fons us recomanem el segent llibre:
+ Vim - Vi Improved - de Steve Oualline
+ Editorial: New Riders
+ s el primer llibre dedicat completament al Vim, especialment til per a
+ usuaris novells. Cont molts exemples i diagrames.
+ Vegeu https://iccf-holland.org/click5.html
+
+ Aquest altre s ms vell i tracta ms sobre el Vi que sobre el Vim:
+ Learning the Vi Editor - de Linda Lamb
+ Editorial: O'Reilly & Associates Inc.
+ s un bon llibre per a aprendre qualsevol cosa que desitgeu sobre el Vi.
+ La sisena edici tamb inclou informaci sobre el Vim.
+
+ Aquest tutorial ha estat escrit per Michael C. Pierce i Robert K. Ware,
+ Colorado School of Mines amb la collaboraci de Charles Smith, Colorado
+ State University. E-mail: bware@mines.colorado.edu.
+
+ Modificat pel Vim per Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.ca.utf-8 b/runtime/tutor/tutor.ca.utf-8
new file mode 100644
index 0000000..f39154b
--- /dev/null
+++ b/runtime/tutor/tutor.ca.utf-8
@@ -0,0 +1,809 @@
+===============================================================================
+= B e n v i n g u t s a l t u t o r d e l V I M - Versió 1.5 =
+===============================================================================
+
+ El Vim és un editor potent i té moltes ordres, massa com per a
+ explicar-les totes un tutor com aquest. Aquest tutor està pensat per a
+ ensenyar les ordres bàsiques que us permetin fer servir el Vim com a
+ editor de propòsit general.
+
+ El temps aproximat de completar el tutor és d'uns 25 o 30 minuts
+ depenent de quant temps dediqueu a experimentar.
+
+ Feu una còpia d'aquest fitxer per a practicar-hi (si heu començat amb
+ el programa vimtutor això que esteu llegint ja és una còpia).
+
+ És important recordar que aquest tutor està pensat per a ensenyar
+ practicant, és a dir que haureu d'executar les ordres si les voleu
+ aprendre. Si només llegiu el text el més probable és que les oblideu.
+
+ Ara assegureu-vos que la tecla de bloqueig de majúscules no està
+ activada i premeu la tecla j per a moure el cursor avall, fins que la
+ lliçó 1.1 ocupi completament la pantalla.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 1.1: MOURE EL CURSOR
+
+
+ ** Per a moure el cursor premeu les tecles h, j, k, l tal com s'indica. **
+ ^
+ k Pista: La h és a l'esquerra i mou el cursor cap a l'esquerra.
+ < h l > La l és a la dreta i mou el cursor cap a la dreta.
+ j La j sembla una fletxa cap avall.
+ v
+ 1. Moveu el cursor per la pantalla fins que us sentiu confortables.
+
+ 2. Mantingueu premuda la tecla avall (j) una estona.
+---> Ara ja sabeu com moure-us fins a la següent lliçó.
+
+ 3. Usant la tecla avall, aneu a la lliçó 1.2.
+
+Nota: Si no esteu segurs de la tecla que heu premut, premeu <ESC> per a
+ tornar al mode Normal. Llavors torneu a teclejar l'ordre que volíeu.
+
+Nota: Les tecles de moviment del cursor (fletxes) també funcionen. Però
+ usant hjkl anireu més ràpid un cop us hi hagueu acostumant.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 1.2: ENTRAR I SORTIR DEL VIM
+
+
+ !! NOTA: Abans de seguir els passos següents llegiu *tota* la lliçó!!
+
+ 1. Premeu <ESC> (per a estar segurs que esteu en el mode Normal).
+
+ 2. Teclegeu: :q! <ENTRAR>.
+
+---> Amb això sortireu de l'editor SENSE desar els canvis que hagueu pogut
+ fer. Si voleu desar els canvis teclegeu:
+ :wq <ENTRAR>
+
+ 3. Quan vegeu l'introductor de l'intèrpret escriviu l'ordre amb la
+ qual heu arribat a aquest tutor. Podria ser: vimtutor <ENTRAR>
+ O bé: vim tutor <ENTRAR>
+
+---> 'vim' és l'editor vim, i 'tutor' és el fitxer que voleu editar.
+
+ 4. Si heu memoritzat les ordres, feu els passos anteriors, de l'1 al 3,
+ per a sortir i tornar a entrar a l'editor. Llavors moveu el cursor
+ avall fins a la lliçó 1.3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 1.3: EDITAR TEXT - ESBORRAR
+
+
+ ** En mode Normal premeu x per a esborrar el caràcter sota el cursor. **
+
+ 1. Moveu el cursor fins a la línia que hi ha més avall senyalada amb --->.
+
+ 2. Poseu el cursor a sobre el caràcter que cal esborrar per a corregir
+ els errors.
+
+ 3. Premeu la tecla x per a esborrar el caràcter.
+
+ 4. Repetiu els passos 2 i 3 fins que la frase sigui correcta.
+
+---> Unna vaaca vva salttar perr sobbree la llluna.
+
+ 5. Ara que la línia és correcta, aneu a la lliçó 1.4.
+
+NOTA: Mentre aneu fent no tracteu de memoritzar, practiqueu i prou.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 1.4: EDITAR TEXT - INSERIR
+
+
+ ** En mode Normal premeu i per a inserir text. **
+
+ 1. Moveu el cursor avall fins la primera línia senyalada amb --->.
+
+ 2. Per a fer la primera línia igual que la segona poseu el cursor sobre
+ el primer caràcter POSTERIOR al text que s'ha d'inserir.
+
+ 3. Premeu la tecla i i escriviu el text que falta.
+
+ 4. Quan hageu acabat premeu <ESC> per tornar al mode Normal. Repetiu
+ els passos 2, 3 i 4 fins a corregir la frase.
+
+---> Falten carctrs en aquesta .
+---> Falten alguns caràcters en aquesta línia.
+
+ 5. Quan us trobeu còmodes inserint text aneu al sumari de baix.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLIÇÓ 1 SUMARI
+
+
+ 1. El cursor es mou amb les fletxes o bé amb les tecles hjkl.
+ h (esquerra) j (avall) k (amunt) l (dreta)
+
+ 2. Per a entrar al Vim (des de l'intèrpret) escriviu: vim FITXER <ENTRAR>
+
+ 3. Per a sortir teclegeu: <ESC> :q! <ENTRAR> per a descartar els canvis.
+ O BÉ teclegeu: <ESC> :wq <ENTRAR> per a desar els canvis.
+
+ 4. Per a esborrar el caràcter de sota el cursor en el mode Normal premeu: x
+
+ 5. Per a inserir text on hi ha el cursor, en mode Normal, premeu:
+ i escriviu el text <ESC>
+
+NOTA: La tecla <ESC> us porta al mode Normal o cancel·la una ordre que
+ estigui a mitges.
+
+Ara continueu a la lliçó 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 2.1: ORDRES PER ESBORRAR
+
+
+ ** Teclegeu dw per a esborrar fins al final d'una paraula. **
+
+ 1. Premeu <ESC> per estar segurs que esteu en mode normal.
+
+ 2. Moveu el cursor avall fins a la línia senyalada amb --->.
+
+ 3. Moveu el cursor fins al principi de la paraula que s'ha d'esborrar.
+
+ 4. Teclegeu dw per a fer desaparèixer la paraula.
+
+NOTA: Les lletres dw apareixeran a la línia de baix de la pantalla mentre
+ les aneu escrivint. Si us equivoqueu premeu <ESC> i torneu a començar.
+
+---> Hi ha algunes paraules divertit que no pertanyen paper a aquesta frase.
+
+ 5. Repetiu el passos 3 i 4 fins que la frase sigui correcta i continueu
+ a la lliçó 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 2.2: MÉS ORDRES PER ESBORRAR
+
+
+ ** Escriviu d$ per a esborrar fins al final de la línia. **
+
+ 1. Premeu <ESC> per a estar segurs que esteu en el mode Normal.
+
+ 2. Moveu el cursor avall fins a la línia senyalada amb --->.
+
+ 3. Moveu el cursor fins al final de la línia correcta
+ (DESPRÉS del primer . ).
+
+ 4. Teclegeu d$ per a esborrar fins al final de la línia.
+
+---> Algú ha escrit el final d'aquesta línia dos cops. línia dos cops.
+
+ 5. Aneu a la lliçó 2.3 per a entendre què està passant.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 2.3: SOBRE ORDRES I OBJECTES
+
+
+ El format de l'ordre d'esborrar d és el següent:
+
+ [nombre] d objecte O BÉ d [nombre] objecte
+ On:
+ nombre - és el nombre de cops que s'ha d'executar (opcional, omissió=1).
+ d - és l'ordre d'esborrar.
+ objecte - és la cosa amb la qual operar (llista a baix).
+
+ Una petita llista d'objectes:
+ w - des del cursor fins al final de la paraula, incloent l'espai.
+ e - des del cursor fins al final de la paraula, SENSE incloure l'espai.
+ $ - des del cursor fins al final de la línia.
+
+NOTA: Per als aventurers: si teclegeu només l'objecte, en el mode Normal,
+ sense cap ordre, el cursor es mourà tal com està descrit a la llista
+ d'objectes.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 2.4: UNA EXCEPCIÓ A 'ORDRE-OBJECTE'
+
+
+ ** Teclegeu dd per a esborrar tota la línia. **
+
+ Com que molt sovint s'han d'eliminar línies senceres, els programadors
+ del Vi van creure que seria més convenient teclejar dd per a esborrar
+ tota la línia.
+
+ 1. Moveu el cursor a la segona línia de la frase de baix.
+ 2. Teclegeu dd per a esborrar la línia.
+ 3. Ara aneu a la quarta línia.
+ 4. Teclegeu 2dd per a esborrar dues línies (recordeu nombre-ordre-objecte).
+
+ 1) Les roses són vermelles,
+ 2) El fang és divertit,
+ 3) Les violetes són blaves,
+ 4) Tinc un cotxe,
+ 5) Els rellotges diuen l'hora,
+ 6) El sucre és dolç,
+ 7) Igual que tu.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 2.5: L'ORDRE DESFER
+
+
+ ** Premeu u per a desfer els canvis, U per a restaurar tota la línia. **
+
+ 1. Moveu el cursor sobre el primer error de línia de baix senyalada amb --->
+ 2. Premeu x per a esborrar el caràcter no desitjat.
+ 3. Ara premeu u per a desfer l'última ordre executada.
+ 4. Aquest cop corregiu tots els errors de la línia amb l'ordre x.
+ 5. Ara premeu U per a restablir la línia al seu estat original.
+ 6. Ara premeu u uns quants cops per a desfer U i les ordres anteriors.
+ 7. Ara premeu CONTROL-R (les dues tecles al mateix temps) uns quants cops
+ per a refer les ordres.
+
+---> Correegiu els errors d'aqquesta línia i dessfeu-los aamb desfer.
+
+ 8. Aquestes ordres són molt útils. Ara aneu al sumari de la lliçó 2.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLIÇÓ 2 SUMARI
+
+
+ 1. Per a esborrar del cursor al final de la paraula teclegeu: dw
+
+ 2. Per a esborrar del cursor al final de la línia teclegeu: d$
+
+ 3. Per a esborrar una línia sencera teclegeu: dd
+
+ 4. El format de qualsevol ordre del mode Normal és:
+
+ [nombre] ordre objecte O BÉ ordre [nombre] objecte
+ on:
+ nombre - és quants cops repetir l'ordre
+ ordre - és què fer, com ara d per esborrar
+ objecte - és amb què s'ha d'actuar, com ara w (paraula),
+ $ (fins a final de línia), etc.
+
+ 5. Per a desfer les accions anteriors premeu: u
+ Per a desfer tots el canvis en una línia premeu: U
+ Per a desfer l'ordre desfer premeu: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 3.1: L'ORDRE 'POSAR'
+
+
+ ** Premeu p per a inserir l'última cosa que heu esborrat
+ després del cursor. **
+
+
+ 1. Moveu el cursor a la primera línia de llista de baix.
+
+ 2. Teclegeu dd per a esborrar la línia i desar-la a la memòria.
+
+ 3. Moveu el cursor a la línia ANTERIOR d'on hauria d'anar.
+
+ 4. En mode Normal, premeu p per a inserir la línia.
+
+ 5. Repetiu els passos 2, 3 i 4 per a ordenar les línies correctament.
+
+ d) Pots aprendre tu?
+ b) Les violetes són blaves,
+ c) La intel·ligència s'aprèn,
+ a) Les roses són vermelles,
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 3.2: L'ORDRE SUBSTITUIR
+
+
+ ** Premeu r i un caràcter per a substituir el caràcter
+ de sota el cursor. **
+
+ 1. Moveu el cursor a la primera línia de sota senyalada amb --->.
+
+ 2. Moveu el cursor a sobre del primer caràcter equivocat.
+
+ 3. Premeu r i tot seguit el caràcter correcte per a corregir l'error.
+
+ 4. Repetiu els passos 2 i 3 fins que la línia sigui correcta.
+
+---> Quen van escroure aquerta línia, algh va prémer tikles equivocades!
+---> Quan van escriure aquesta línia, algú va prémer tecles equivocades!
+
+ 5. Ara continueu a la lliçó 3.2.
+
+NOTA: Recordeu que heu de practicar, no memoritzar.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 3.3: L'ORDRE CANVIAR
+
+
+ ** Per a canviar una part o tota la paraula, escriviu cw . **
+
+ 1. Moveu el cursor a la primera línia de sota senyalada amb --->.
+
+ 2. Poseu el cursor sobre la u de 'lughc'.
+
+ 3. Teclegeu cw i corregiu la paraula (en aquest cas, escrivint 'ínia'.)
+
+ 4. Premeu <ESC> i aneu al següent error.
+
+ 5. Repetiu els passos 3 i 4 fins que les dues frases siguin iguals.
+
+---> Aquesta lughc té algunes paradskl que s'han de cdddf.
+---> Aquesta línia té algunes paraules que s'han de canviar.
+
+Noteu que cw no només canvia la paraula, també us posa en mode d'inserció.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 3.4: MÉS CANVIS AMB c
+
+
+ ** L'ordre canviar s'usa amb els mateixos objectes que l'ordre esborrar. **
+
+ 1. L'ordre canviar funciona igual que la d'esborrar. El format és:
+
+ [nombre] c objecte O BÉ c [nombre] objecte
+
+ 2. Els objectes són els mateixos, w (paraula), $ (final de línia), etc.
+
+ 3. Moveu el cursor fins la primera línia senyalada amb --->.
+
+ 4. Avanceu fins al primer error.
+
+ 5. Premeu c$ per fer la línia igual que la segona i premeu <ESC>.
+
+---> El final d'aquesta línia necessita canvis per ser igual que la segona.
+---> El final d'aquesta línia s'ha de corregir amb l'ordre c$.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLIÇÓ 3 SUMARI
+
+
+ 1. Per a tornar a posar el text que heu esborrat, premeu p . Això posa
+ el text esborrat DESPRÉS del cursor (si heu esborrat una línia anirà
+ a parar a la línia SEGÜENT d'on hi ha el cursor).
+
+ 2. Per a substituir el caràcter de sota el cursor, premeu r i tot
+ seguit el caràcter que ha de reemplaçar l'original.
+
+ 3. L'ordre canviar permet canviar l'objecte especificat, des del cursor
+ fins el final de l'objecte. Per exemple, cw canvia el que hi ha des
+ del cursor fins al final de la paraula, i c$ fins al final de
+ línia.
+
+ 4. El format de l'ordre canviar és:
+
+ [nombre] c objecte O BÉ c [nombre] objecte
+
+Ara aneu a la següent lliçó.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 4.1: SITUACIÓ I ESTAT DEL FITXER
+
+
+ ** Premeu CTRL-g per a veure la situació dins del fitxer i el seu estat.
+ Premeu SHIFT-g per a anar a una línia determinada. **
+
+ Nota: No proveu res fins que hagueu llegit TOTA la lliçó!!
+
+ 1. Mantingueu premuda la tecla Control i premeu g . A la part de baix
+ de la pàgina apareixerà un línia amb el nom del fitxer i la línia en
+ la qual us trobeu. Recordeu el número de la línia pel Pas 3.
+
+ 2. Premeu Shift-g per a anar al final de tot del fitxer.
+
+ 3. Teclegeu el número de la línia on éreu i després premeu Shift-g. Això
+ us tornarà a la línia on éreu quan heu premut per primer cop Ctrl-g.
+ (Quan teclegeu el número NO es veurà a la pantalla.)
+
+ 4. Ara executeu els passos de l'1 al 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 4.2: L'ORDRE CERCAR
+
+
+ ** Premeu / seguit de la frase que vulgueu cercar. **
+
+ 1. En el mode Normal premeu el caràcter / . Noteu que el cursor apareix
+ a la part de baix de la pantalla igual que amb l'ordre : .
+
+ 2. Ara escriviu 'errroor' <ENTRAR>. Aquesta és la paraula que voleu
+ cercar.
+
+ 3. Per a tornar a cercar la mateixa frase, premeu n . Per a cercar la
+ mateixa frase en direcció contraria, premeu Shift-n .
+
+ 4. Si voleu cercar una frase en direcció ascendent, useu l'ordre ? en
+ lloc de /.
+
+---> "errroor" no és com s'escriu error; errroor és un error.
+
+Nota: Quan la cerca arribi al final del fitxer continuarà a l'inici.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 4.3: CERCA DE PARÈNTESIS
+
+
+ ** Premeu % per cercar el ), ], o } corresponent. **
+
+ 1. Poseu el cursor a qualsevol (, [, o { de la línia senyalada amb --->.
+
+ 2. Ara premeu el caràcter % .
+
+ 3. El cursor hauria d'anar a la clau o parèntesis corresponent.
+
+ 4. Premeu % per a tornar el cursor al primer parèntesi.
+
+---> Això ( és una línia amb caràcters (, [ ] i { } de prova. ))
+
+Nota: Això és molt útil per a trobar errors en programes informàtics!
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 4.4: UNA MANERA DE CORREGIR ERRORS
+
+
+ ** Escriviu :s/vell/nou/g per a substituir 'vell' per 'nou'. **
+
+ 1. Moveu el cursor a la línia de sota senyalada amb --->.
+
+ 2. Escriviu :s/laa/la <ENTRAR>. Aquesta ordre només canvia la primera
+ coincidència que es trobi a la línia.
+
+ 3. Ara escriviu :s/laa/la/g per a fer una substitució global. Això
+ canviarà totes les coincidències que es trobin a la línia.
+
+---> laa millor època per a veure laa flor és laa primavera.
+
+ 4. Per a canviar totes les coincidències d'una cadena entre dues línies,
+ escriviu :#,#s/vell/nou/g on #,# són els nombres de les línies.
+ Escriviu :%s/vell/nou/g per a substituir la cadena a tot el fitxer.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLIÇÓ 4 SUMARI
+
+
+ 1. Ctrl-g mostra la posició dins del fitxer i l'estat del mateix.
+ Shift-g us porta al final del fitxer. Un número seguit de Shift-g us
+ porta a la línia corresponent.
+
+ 2. L'ordre / seguida d'una frase cerca la frase cap ENDAVANT.
+ L'ordre ? seguida d'una frase cerca la frase cap ENDARRERE.
+ Després d'una cerca premeu n per a trobar la pròxima coincidència en
+ la mateixa direcció, o Shift-n per a cercar en la direcció contrària.
+
+ 3. L'ordre % quan el cursor es troba en un (, ), [, ], {, o } troba la
+ parella corresponent.
+
+ 4. Per a substituir el primer 'vell' per 'nou' en una línia :s/vell/nou
+ Per a substituir tots els 'vell' per 'nou' en una línia :s/vell/nou/g
+ Per a substituir frases entre les línies # i # :#,#s/vell/nou/g
+ Per a substituir totes les coincidències en el fitxer :%s/vell/nou/g
+ Per a demanar confirmació cada cop afegiu 'c' :%s/vell/nou/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 5.1: COM EXECUTAR UNA ORDRE EXTERNA
+
+
+ ** Teclegeu :! seguit d'una ordre externa per a executar-la. **
+
+ 1. Premeu el familiar : per a col·locar el cursor a la part de baix de
+ la pantalla. Això us permet entrar una ordre.
+
+ 2. Ara teclegeu el caràcter ! (signe d'exclamació). Això us permet
+ executar qualsevol ordre de l'intèrpret del sistema.
+
+ 3. Per exemple, escriviu ls i tot seguit premeu <ENTRAR>. Això us
+ mostrarà el contingut del directori, tal com si estiguéssiu a la
+ línia d'ordres. Proveu :!dir si ls no funciona.
+
+Nota: D'aquesta manera és possible executar qualsevol ordre externa.
+
+Nota: Totes les ordres : s'han d'acabar amb la tecla <ENTRAR>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 5.2: MÉS SOBRE L'ESCRIPTURA DE FITXERS
+
+
+ ** Per a desar els canvis fets, escriviu :w FITXER. **
+
+ 1. Escriviu :!dir o bé :!ls per a obtenir un llistat del directori.
+ Ja sabeu que heu de prémer <ENTRAR> després d'això.
+
+ 2. Trieu un nom de fitxer que no existeixi, com ara PROVA.
+
+ 3. Ara feu: :w PROVA (on PROVA és el nom que heu triat.)
+
+ 4. Això desa el text en un fitxer amb el nom de PROVA. Per a comprovar-ho
+ escriviu :!dir i mireu el contingut del directori.
+
+Note: Si sortiu del Vim i entreu una altra vegada amb el fitxer PROVA, el
+ fitxer serà una còpia exacta del tutor que heu desat.
+
+ 5. Ara esborreu el fitxer teclejant (MS-DOS): :!del PROVA
+ o bé (Unix): :!rm PROVA
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 5.3: UNA ORDRE SELECTIVA PER A DESAR
+
+
+ ** Per a desar una part del fitxer, escriviu :#,# w FITXER **
+
+ 1. Un altre cop, feu :!dir o :!ls per a obtenir un llistat del
+ directori i trieu un nom de fitxer adequat com ara PROVA.
+
+ 2. Moveu el cursor a dalt de tot de la pàgina i premeu Ctrl-g per
+ saber el número de la línia. RECORDEU AQUEST NÚMERO!
+
+ 3. Ara aneu a baix de tot de la pàgina i torneu a prémer Ctrl-g.
+ RECORDEU AQUEST NÚMERO TAMBÉ!
+
+ 4. Per a desar NOMÉS una secció en un fitxer, escriviu :#,# w PROVA on
+ #,# són els dos números que heu recordat (dalt, baix) i PROVA el nom
+ del fitxer.
+
+ 5. Comproveu que el fitxer nou hi sigui amb :!dir però no l'esborreu.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 5.4: OBTENIR I AJUNTAR FITXERS
+
+
+ ** Per a inserir el contingut d'un fitxer, feu :r FITXER **
+
+ 1. Assegureu-vos, amb l'ordre :!dir , que el fitxer PROVA encara hi és.
+
+ 2. Situeu el cursor a dalt de tot d'aquesta pàgina.
+
+NOTA: Després d'executar el Pas 3 veureu la lliçó 5.3. Tireu cap avall
+ fins a aquesta lliçó un altre cop.
+
+ 3. Ara obtingueu el fitxer PROVA amb l'ordre :r PROVA on PROVA és el
+ nom del fitxer.
+
+NOTA: El fitxer que obtingueu s'insereix en el lloc on hi hagi el cursor.
+
+ 4. Per a comprovar que s'ha obtingut el fitxer tireu enrere i mireu com
+ ara hi ha dues còpies de la lliçó 5.3, l'original i la del fitxer.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLIÇÓ 5 SUMARI
+
+
+ 1. :!ordre executa una ordre externa.
+
+ Alguns exemples útils:
+ (MS-DOS) (Unix)
+ :!dir :!ls - mostra un llistat del directori
+ :!del FITXER :!rm FITXER - esborra el fitxer FITXER
+
+ 2. :w FITXER escriu el fitxer editat al disc dur, amb el nom FITXER.
+
+ 3. :#,#w FITXER desa les línies de # a # en el fitxer FITXER.
+
+ 4. :r FITXER llegeix el fitxer FITXER del disc dur i l'insereix en el
+ fitxer editat a la posició on hi ha el cursor.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 6.1: L'ORDRE OBRIR
+
+
+ ** Premeu o per a obrir una línia i entrar en mode inserció. **
+
+ 1. Moveu el cursor a la línia de sota senyalada amb --->.
+
+ 2. Premeu o (minúscula) per a obrir una línia a BAIX del cursor i
+ situar-vos en mode d'inserció.
+
+ 3. Copieu la línia senyalada amb ---> i premeu <ESC> per a tornar al mode
+ normal.
+
+---> Després de prémer o el cursor se situa a la línia nova en mode inserció.
+
+ 4. Per a obrir una línia a SOBRE del cursor, premeu la O majúscula, en lloc
+ de la minúscula. Proveu-ho amb la línia de sota.
+Obriu una línia sobre aquesta prement Shift-o amb el cursor en aquesta línia.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 6.2: L'ORDRE AFEGIR
+
+
+ ** Premeu a per a afegir text DESPRÉS del cursor. **
+
+ 1. Moveu el cursor al final de la primera línia de sota senyalada
+ amb ---> prement $ en el mode Normal.
+
+ 2. Premeu la lletra a (minúscula) per a afegir text DESPRÉS del caràcter
+ sota el cursor. (La A majúscula afegeix text al final de la línia.)
+
+Nota: Així s'evita haver de prémer i , l'últim caràcter, el text a inserir,
+ la tecla <ESC>, cursor a la dreta, i finalment x , només per afegir
+ text a final de línia.
+
+ 3. Ara completeu la primera línia. Tingueu en compte que aquesta ordre
+ és exactament igual que la d'inserir, excepte pel que fa al lloc on
+ s'insereix el text.
+
+---> Aquesta línia us permetrà practicar
+---> Aquesta línia us permetrà practicar afegir text a final de línia.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 6.3: UNA ALTRA MANERA DE SUBSTITUIR
+
+
+ ** Teclegeu una R majúscula per a substituir més d'un caràcter. **
+
+ 1. Moveu el cursor a la línia de sota senyalada amb --->.
+
+ 2. Poseu el cursor al principi de la primera paraula que és diferent
+ respecte a la segona línia senyalada amb ---> (la paraula "l'última").
+
+ 3. Ara premeu R i substituïu el que queda de text a la primera línia
+ escrivint sobre el text vell, per a fer-la igual que la segona.
+
+---> Per a fer aquesta línia igual que l'última useu les tecles.
+---> Per a fer aquesta línia igual que la segona, premeu R i el text nou.
+
+ 4. Tingueu en compte que en prémer <ESC> per a sortir, el text que no
+ s'hagi alterat es manté.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lliçó 6.4: ESTABLIR OPCIONS
+
+ ** Feu que les ordres cercar o substituir ignorin les diferències
+ entre majúscules i minúscules **
+
+ 1. Cerqueu la paraula 'ignorar' amb: /ignorar
+ Repetiu-ho uns quants cops amb la tecla n.
+
+ 2. Establiu l'opció 'ic' (ignore case) escrivint:
+ :set ic
+
+ 3. Ara cerqueu 'ignorar' un altre cop amb la tecla n.
+ Repetiu-ho uns quants cops més.
+
+ 4. Establiu les opcions 'hlsearch' i 'incsearch':
+ :set hls is
+
+ 5. Ara torneu a executar una ordre de cerca, i mireu què passa:
+ /ignorar
+
+ 6. Per a treure el ressaltat dels resultats, feu:
+ :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLIÇÓ 6 SUMARI
+
+
+ 1. L'ordre o obre una línia a SOTA la del cursor i mou el cursor a la nova
+ línia, en mode Inserció.
+ La O majúscula obre la línia a SOBRE la que hi ha el cursor.
+
+ 2. Premeu una a per a afegir text DESPRÉS del caràcter a sota del cursor.
+ La A majúscula afegeix automàticament el text a final de línia.
+
+ 3. L'ordre R majúscula us posa en mode substitució fins que premeu <ESC>.
+
+ 4. Escriviu ":set xxx" per a establir l'opció "xxx"
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLIÇÓ 7: ORDRES D'AJUDA
+
+
+ ** Utilitzeu el sistema intern d'ajuda **
+
+ El Vim té un extens sistema d'ajuda. Per a llegir una introducció proveu una
+ d'aquestes tres coses:
+ - premeu la tecla <AJUDA> (si la teniu)
+ - premeu la tecla <F1> (si la teniu)
+ - escriviu :help <ENTRAR>
+
+ Teclegeu :q <ENTRAR> per a tancar la finestra d'ajuda.
+
+ Podeu trobar ajuda sobre pràcticament qualsevol tema passant un argument
+ a l'ordre ":help". Proveu el següent (no oblideu prémer <ENTRAR>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LLIÇÓ 8: CREAR UN SCRIPT D'INICI
+
+ ** Activeu funcions automàticament **
+
+ El Vim té moltes més funcions que el Vi, però moltes estan desactivades
+ per defecte. Per a començar a utilitzar més funcions heu de crear un
+ fitxer "vimrc".
+
+ 1. Comenceu a editar el fitxer "vimrc", depenent del sistema
+ :edit ~/.vimrc per Unix
+ :edit ~/_vimrc per MS-Windows
+
+ 2. Llegiu el fitxer "vimrc" d'exemple:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Deseu el fitxer amb:
+
+ :write
+
+ El pròxim cop que executeu el Vim usarà ressaltat de sintaxi. Podeu
+ afegir els ajustos que vulgueu en aquest fitxer "vimrc".
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Aquí conclou el Tutor del Vim. És una breu introducció a l'editor Vim,
+ suficient perquè el pugueu començar a fer servir. No és complet perquè
+ el Vim té moltes ordres. Per a llegir el manual de l'usuari, feu:
+ ":help user-manual".
+
+ Per a un estudi més a fons us recomanem el següent llibre:
+ Vim - Vi Improved - de Steve Oualline
+ Editorial: New Riders
+ És el primer llibre dedicat completament al Vim, especialment útil per a
+ usuaris novells. Conté molts exemples i diagrames.
+ Vegeu https://iccf-holland.org/click5.html
+
+ Aquest altre és més vell i tracta més sobre el Vi que sobre el Vim:
+ Learning the Vi Editor - de Linda Lamb
+ Editorial: O'Reilly & Associates Inc.
+ És un bon llibre per a aprendre qualsevol cosa que desitgeu sobre el Vi.
+ La sisena edició també inclou informació sobre el Vim.
+
+ Aquest tutorial ha estat escrit per Michael C. Pierce i Robert K. Ware,
+ Colorado School of Mines amb la col·laboració de Charles Smith, Colorado
+ State University. E-mail: bware@mines.colorado.edu.
+
+ Modificat pel Vim per Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.cs b/runtime/tutor/tutor.cs
new file mode 100644
index 0000000..6d62bb5
--- /dev/null
+++ b/runtime/tutor/tutor.cs
@@ -0,0 +1,812 @@
+===============================================================================
+= V t e j t e v t u t o r i a l u V I M - Verze 1.5 =
+===============================================================================
+
+ Vim je velmi vkonn editor, kter m pli mnoho pkaz na to, aby
+ mohly bt vechny vysvtlen ve vuce jako tato. Tato vuka obsahuje
+ dostaten mnostv pkaz na to, aby bylo mon pouvat Vim jako
+ vceelov editor.
+
+ Piblin as potebn ke zvldnut tto vuky je 25-30 minut, zle
+ na tom, kolik asu strvte pezkuovnm.
+
+ Pkazy v lekcch upravuj text. Vytvo kopii tohoto souboru pro
+ procviovn (pi startu "vimtutor" je ji toto kopie).
+
+ Je dleit pamatovat, e tato vuka je vytvoena pro vuku pouvnm.
+ To znamen, e je poteba si pkazy vyzkouet pro jejich sprvn
+ nauen. Pokud si jen te text, pkazy zapomene!
+
+ Nyn se pesvdte, e Caps-Lock NEN stlaen a nkolikrt stisknte
+ klvesu j aby se kurzor posunul natolik, e lekce 1.1 zapln celou
+ obrazovku.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.1: POHYB KURZORU
+
+
+ ** Pro pohyb kurzoru pouvej klvesy h,j,k,l jak je znzornno ne. **
+ ^
+ k Funkce: Klvesa h je vlevo a vykon pohyb vlevo.
+ < h l > Klvesa l je vpravo a vykon pohyb vpravo.
+ j Klvesa j vypad na ipku dolu.
+ v
+ 1. Pohybuj kurzorem po obrazovce dokud si na to nezvykne.
+
+ 2. Dr klvesu pro pohyb dolu (j), dokud se jej funkce nezopakuje.
+---> Te v jak se pesunout na nsledujc lekci.
+
+ 3. Pouitm klvesy dolu pejdi na lekci 1.2.
+
+Poznmka: Pokud si nkdy nejsi jist nm, co jsi napsal, stla <ESC> pro
+ pechod do Normlnho mdu. Pot pepi poadovan pkaz.
+
+Poznmka: Kurzorov klvesy tak funguj, avak pouvn hjkl je rychlej
+ jakmile si na nj zvykne.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.2: SPUTN A UKONEN VIM
+
+
+ !! POZNMKA: Ped vykonnm tchto krok si peti celou lekci!!
+
+ 1. Stla <ESC> (pro ujitn, e se nachz v Normlnm mdu).
+
+ 2. Napi: :q! <ENTER>.
+
+---> Tmto ukon editor BEZ uloen zmn, kter si vykonal.
+ Pokud chce uloit zmny a ukonit editor napi:
+ :wq <ENTER>
+
+ 3. A se dostane na pkazov dek, napi pkaz, kterm se dostane zpt
+ do tto vuky. To me bt: vimtutor <ENTER>
+ Bn se pouv: vim tutor <ENTER>
+
+---> 'vim' znamen sputn editoru, 'tutor' je soubor k editaci.
+
+ 4. Pokud si tyto kroky spolehliv pamatuje, vykonej kroky 1 a 3, m
+ ukon a znovu spust editor. Potom pesu kurzor dolu na lekci 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.3: PRAVA TEXTU - MAZN
+
+
+ ** Stisknutm klvesy x v Normlnm mdu smae znak na mst kurzoru. **
+
+ 1. Pesu kurzor ne na dek oznaen --->.
+
+ 2. K odstrann chyb pejdi kurzorem na znak, kter chce smazat.
+
+ 3. Stla klvesu x k odstrann nechtnch znak.
+
+ 4. Opakuj kroky 2 a 4 dokud nen vta sprvn.
+
+---> Krva skoilla pess mssc.
+
+ 5. Pokud je vta sprvn, pejdi na lekci 1.4.
+
+POZNMKA: Nesna se pouze zapamatovat pedvdn pkazy, u se je pouvnm.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.4: PRAVA TEXTU - VKLDN
+
+
+ ** Stlaen klvesy i v Normlnm mdu umouje vkldn textu. **
+
+ 1. Pesu kurzor na prvn dek oznaen --->.
+
+ 2. Pro upraven prvnho dku do podoby dku druhho, pesu kurzor na
+ prvn znak za msto, kde m bt text vloen.
+
+ 3. Stla i a napi potebn dodatek.
+
+ 4. Po opraven kad chyby stla <ESC> pro nvrat do Normlnho mdu.
+ Opakuj kroky 2 a 4 dokud nen vta sprvn.
+
+---> Njak txt na tto .
+---> Njak text chyb na tto dce.
+
+ 5. Pokud ji ovld vkldn textu, pejdi na nsledujc shrnut.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 1
+
+
+ 1. Kurzorem se pohybuje pomoc ipek nebo klvesami hjkl.
+ h (vlevo) j (dolu) k (nahoru) l (vpravo)
+
+ 2. Pro sputn Vimu (z pkazovho dku) napi: vim SOUBOR <ENTER>
+
+ 3. Pro ukonen Vimu napi: <ESC> :q! <ENTER> bez uloen zmn.
+ anebo: <ESC> :wq <ENTER> pro uloen zmn.
+
+ 4. Pro smazn znaku pod kurzorem napi v Normlnm mdu: x
+
+ 5. Pro vkldn textu od msta kurzoru napi v Normlnm mdu:
+ i vkldan text <ESC>
+
+POZNMKA: Stlaen <ESC> t pemst do Normlnho mdu nebo zru nechtn
+ a sten dokonen pkaz.
+
+Nyn pokrauj Lekc 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.1: PKAZY MAZN
+
+
+ ** Pkaz dw smae znaky do konce slova. **
+
+ 1. Stla <ESC> k ubezpeen, e jsi v Normlnm mdu.
+
+ 2. Pesu kurzor ne na dek oznaen --->.
+
+ 3. Pesu kurzor na zatek slova, kter je poteba smazat.
+
+ 4. Napi dw , aby slovo zmizelo.
+
+POZNMKA: Psmena dw se zobraz na poslednm dku obrazovky jakmile je
+ nape. Kdy nape nco patn, stla <ESC> a zani znova.
+
+---> Jsou tu njak slova zbava, kter nepat list do tto vty.
+
+ 5. Opakuj kroky 3 a 4 dokud nen vta sprvn a pejdi na lekci 2.2.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.2: VCE PKAZ MAZN
+
+
+ ** Napsn pkazu d$ smae ve a do konce dky. **
+
+ 1. Stla <ESC> k ubezpeen, e jsi v Normlnm mdu.
+
+ 2. Pesu kurzor ne na dek oznaen --->.
+
+ 3. Pesu kurzor na konec sprvn vty (ZA prvn teku).
+
+ 4. Napi d$ ,aby jsi smazal znaky a do konce dku.
+
+---> Nkdo napsal konec tto vty dvakrt. konec tto vty dvakrt.
+
+
+ 5. Pejdi na lekci 2.3 pro pochopen toho, co se stalo.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.3: ROZIOVAC PKAZY A OBJEKTY
+
+
+ Formt mazacho pkazu d je nsledujc:
+
+ [slo] d objekt NEBO d [slo] objekt
+ Kde:
+ slo - udv kolikrt se pkaz vykon (voliteln, vchoz=1).
+ d - je pkaz mazn.
+ objekt - udv na em se pkaz vykonv (vypsan ne).
+
+ Krtk vpis objekt:
+ w - od kurzoru do konce slova, vetn mezer.
+ e - od kurzoru do konce slova, BEZ mezer.
+ $ - od kurzoru do konce dku.
+
+POZNMKA: Stlaenm klvesy objektu v Normlnm mdu se kurzor pesune na
+ msto upesnn ve vpisu objekt.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.4: VJIMKA Z 'PKAZ-OBJEKT'
+
+
+ ** Napsnm dd smae cel dek. **
+
+ Vzhledem k astosti mazn celho dku se autoi Vimu rozhodli, e bude
+ jednodu napsat prost dv d k smazn celho dku.
+
+ 1. Pesu kurzor na druh dek spodnho textu.
+ 2. Napi dd pro smazn dku.
+ 3. Pejdi na tvrt dek.
+ 4. Napi 2dd (vzpome si slo-pkaz-objekt) pro smazn dvou dk.
+
+ 1) Re jsou erven,
+ 2) Blto je zbavn,
+ 3) Fialky jsou modr,
+ 4) Mm auto,
+ 5) Hodinky ukazuj as,
+ 6) Cukr je sladk,
+ 7) A to jsi i ty.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.5: PKAZ UNDO
+
+
+ ** Stla u pro vrcen poslednho pkazu, U pro celou dku. **
+
+ 1. Pesu kurzor ne na dek oznaen ---> a pemsti ho na prvn chybu.
+ 2. Napi x pro smazn prvnho nechtnho znaku.
+ 3. Te napi u m vrt zpt posledn vykonan pkaz.
+ 4. Nyn oprav vechny chyby na dku pomoc pkazu x .
+ 5. Napi velk U m vrt dek do pvodnho stavu.
+ 6. Te napi u nkolikrt, m vrt zpt pkaz U .
+ 7. Stla CTRL-R (klvesu CTRL dr stlaenou a stiskni R) nkolikrt,
+ m vrt zpt pedtm vrcen pkazy (redo).
+
+---> Opprav chybby nna toomto dku a nahra je pommoc undo.
+
+ 8. Toto jsou velmi uiten pkazy. Nyn pejdi na souhrn Lekce 2.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 2
+
+
+ 1. Pro smazn znak od kurzoru do konce slova napi: dw
+
+ 2. Pro smazn znak od kurzoru do konce dku napi: d$
+
+ 3. Pro smazn celho dku napi: dd
+
+ 4. Formt pkazu v Normlnm mdu je:
+
+ [slo] pkaz objekt NEBO pkaz [slo] objekt
+ kde:
+ slo - udv poet opakovn pkazu
+ pkaz - udv co je teba vykonat, napklad d mae
+ objekt - udv rozsah pkazu, napklad w (slovo),
+ $ (do konce dku), atd.
+
+ 5. Pro vrcen pedel innosti, napi: u (mal u)
+ Pro vrcen vech prav na dku napi: U (velk U)
+ Pro vrcen vrcench prav (redo) napi: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.1: PKAZ VLOIT
+
+
+ ** Pka p vlo posledn vymazan text za kurzor. **
+
+ 1. Pesu kurzor ne na posledn dek textu.
+
+ 2. Napi dd pro smazn dku a jeho uloen do bufferu.
+
+ 3. Pesu kurzor VݩE tam, kam smazan dek pat.
+
+ 4. V Normlnm mdu napi p pro optn vloen dku.
+
+ 5. Opakuj kroky 2 a 4 dokud dky nebudou ve sprvnm poad.
+
+ d) Tak se doke vzdlvat?
+ b) Fialky jsou modr,
+ c) Inteligence se u,
+ a) Re jsou erven,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.2: PKAZ NAHRAZEN
+
+
+ ** Napsnm r a znaku se nahrad znak pod kurzorem. **
+
+ 1. Pesu kurzor ne na prvn dek oznaen --->.
+
+ 2. Pesu kurzor na zatek prvn chyby.
+
+ 3. Napi r a potom znak, kter nahrad chybu.
+
+ 4. Opakuj kroky 2 a 3 dokud nen prvn dka sprvn.
+
+---> Kdi byl pzn tento deg, nkdu stlail paqn klvesy!
+---> Kdy byl psn tento dek, nkdo stlal patn klvesy!
+
+ 5. Nyn pejdi na Lekci 3.2.
+
+POZNMKA: Zapamatuj si, e by ses ml uit pouvnm, ne zapamatovnm.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.3: PKAZ PRAVY
+
+
+ ** Pokud chce zmnit st nebo cel slovo, napi cw . **
+
+ 1. Pesu kurzor ne na prvn dek oznaen --->.
+
+ 2. Umsti kurzor na psmeno i v slov iok.
+
+ 3. Napi cw a oprav slovo (v tomto ppad napi 'dek'.)
+
+ 4. Stla <ESC> a pejdi na dal chybu (prvn znak, kter teba zmnit.)
+
+ 5. Opakuj kroky 3 a 4 dokud nen prvn vta stejn jako ta druh.
+
+---> Tento iok m nkolik skic, kter psadoinsa zmnit pasdgf pkazu.
+---> Tento dek m nkolik slov, kter potebuj zmnit pomoc pkazu.
+
+Vimni si, e cw nejen nahrazuje slovo, ale tak pemst do vkldn.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.4: VCE ZMN POUITM c
+
+
+ ** Pkaz pro pravu se dru se stejnmi objekty jako ten pro mazn. **
+
+ 1. Pkaz pro pravu pracuje stejn jako pro mazn. Formt je:
+
+ [slo] c objekt NEBO c [slo] objekt
+
+ 2. Objekty jsou tak shodn, jako nap.: w (slovo), $ (konec dku), atd.
+
+ 3. Pejdi ne na prvn dek oznaen --->.
+
+ 4. Pesu kurzor na prvn rozdl.
+
+ 5. Napi c$ pro upraven zbytku dku podle toho druhho a stla <ESC>.
+
+---> Konec tohoto dku potebuje pomoc, aby byl jako ten druh.
+---> Konec tohoto dku potebuje opravit pouitm pkazu c$ .
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 3
+
+
+ 1. Pro vloen textu, kter byl smazn, napi p . To vlo smazan text
+ ZA kurzor (pokud byl dek smazan, pejde na dek pod kurzorem).
+
+ 2. Pro nahrazen znaku pod kurzorem, napi r a potom znak, kterm
+ chce pvodn znak nahradit.
+
+ 3. Pkaz na upravovn umouje zmnit specifikovan objekt od kurzoru
+ do konce objektu. Napklad: Napi cw ,m zmn text od pozice
+ kurzoru do konce slova, c$ zmn text do konce dku.
+
+ 4. Formt pro nahrazovn je:
+
+ [slo] c objekt NEBO c [slo] objekt
+
+Nyn pejdi na nsledujc lekci.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.1: POZICE A STATUS SOUBORU
+
+
+ ** Stla CTRL-g pro zobrazen sv pozice v souboru a statusu souboru.
+ Stla SHIFT-G pro pechod na dek v souboru. **
+
+ Poznmka: Peti si celou lekci ne zane vykonvat kroky!!
+
+ 1. Dr klvesu Ctrl stlaenou a stiskni g . Vespod obrazovky se zobraz
+ stavov dek s nzvem souboru a dkou na kter se nachz. Zapamatuj
+ si slo dku pro krok 3.
+
+ 2. Stla shift-G pro pesun na konec souboru.
+
+ 3. Napi slo dku na kterm si se nachzel a stla shift-G. To t
+ vrt na dek, na kterm jsi dve stiskl Ctrl-g.
+ (Kdy pe sla, tak se NEZOBRAZUJ na obrazovce.)
+
+ 4. Pokud se ct schopn vykonat tyto kroky, vykonej je.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.2: PKAZ VYHLEDVN
+
+
+ ** Napi / nsledovan etzcem pro vyhledn onoho etzce. **
+
+ 1. Stiskni / v Normlnm mdu. Vimni si, e tento znak se spolu s
+ kurzorem zobraz v doln sti obrazovky jako pkaz : .
+
+ 2. Nyn napi 'chhybba' <ENTER>. To je slovo, kter chce vyhledat.
+
+ 3. Pro vyhledn dalho vsledku stejnho etzce, jednodue stla n .
+ Pro vyhledn dalho vsledku stejnho etzce opanm smrem, stiskni
+ Shift-N.
+
+ 4. Pokud chce vyhledat etzec v opanm smru, pouij pkaz ? msto
+ pkazu / .
+
+---> "chhybba" nen zpsob, jak hlskovat chyba; chhybba je chyba.
+
+Poznmka: Kdy vyhledvn doshne konce souboru, bude pokraovat na jeho
+ zatku.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.3: VYHLEDVN PROV ZVORKY
+
+
+ ** Napi % pro nalezen prov ),], nebo } . **
+
+ 1. Pemsti kurzor na kteroukoli (, [, nebo { v dku oznaenm --->.
+
+ 2. Nyn napi znak % .
+
+ 3. Kurzor se pemst na odpovdajc zvorku.
+
+ 4. Stla % pro pesun kurzoru zpt na otvrajc zvorku.
+
+---> Toto ( je testovac dek ('s, ['s ] a {'s } v nm. ))
+
+Poznmka: Toto je velmi uiten p ladn programu s chybjcmi
+ uzavracmi zvorkami.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.4: ZPSOB JAK ZMNIT CHYBY
+
+
+ ** Napi :s/star/nov/g pro nahrazen slova 'nov' za 'star'. **
+
+ 1. Pesu kurzor na dek oznaen --->.
+
+ 2. Napi :s/dobr/dobr <ENTER> . Vimni si, e tento pkaz zmn pouze
+ prvn vskyt v dku.
+
+ 3. Nyn napi :s/dobr/dobr/g co znamen celkov nahrazen v dku.
+ Toto nahrad vechny vskyty v dku.
+
+---> dobr suroviny a dobr nin jsou zkladem dobr kuchyn.
+
+ 4. Pro zmnu vech vskyt etzce mezi dvma dky,
+ Napi :#,#s/star/nov/g kde #,# jsou sla onch dek.
+ Napi :%s/star/nov/g pro zmnu vech vskyt v celm souboru.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 4
+
+
+ 1. Ctrl-g vype tvou pozici v souboru a status souboru.
+ Shift-G t pemst na konec souboru. slo nsledovan
+ Shift-G t pesune na dan slo dku.
+
+ 2. Napsn / nsledovan etzcem vyhled etzec smrem DOPEDU.
+ Napsn ? nsledovan etzcem vyhled etzec smrem DOZADU.
+ Napsn n po vyhledvn najde nsledujc vskyt etzce ve stejnm
+ smru, Shift-N ve smru opanm.
+
+ 3. Stisknut % kdy je kurzor na (,),[,],{, nebo } najde odpovdajc
+ provou zvorku.
+
+ 4. Pro nahrazen novho za prvn star v dku napi :s/star/nov
+ Pro nahrazen novho za vechny star v dku napi :s/star/nov/g
+ Pro nahrazen etzc mezi dvmi dkami # napi :#,#s/star/nov/g
+ Pro nahrazen vech vskyt v souboru napi :%s/star/nov/g
+ Pro potvrzen kadho nahrazen pidej 'c' :%s/star/nov/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.1: JAK VYKONAT VNJ PKAZ
+
+
+ ** Napi :! nsledovan vnjm pkazem pro sputn pkazu. **
+
+ 1. Napi obvykl pkaz : , kter umst kurzor na spodek obrazovky
+ To umon napsat pkaz.
+
+ 2. Nyn stiskni ! (vykink). To umon vykonat jakkoliv vnj
+ pkaz z pkazovho dku.
+
+ 3. Napklad napi ls za ! a stiskni <ENTER>. Tento pkaz zobraz
+ obsah tvho adrese jako v pkazovm dku.
+ Vyzkouej :!dir pokud ls nefunguje.
+
+Poznmka: Takto je mon vykonat jakkoliv pkaz.
+
+Poznmka: Vechny pkazy : mus bt dokonen stisknutm <ENTER>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.2: VCE O UKLDN SOUBOR
+
+
+ ** Pro uloen zmn v souboru napi :w SOUBOR. **
+
+ 1. Napi :!dir nebo :!ls pro vpis aktulnho adrese.
+ U v, e za tmto mus stisknout <ENTER>.
+
+ 2. Vyber si nzev souboru, kter jet neexistuje, napklad TEST.
+
+ 3. Nyn napi: :w TEST (kde TEST je vybran nzev souboru.)
+
+ 4. To ulo cel soubor (Vuka Vimu) pod nzvem TEST.
+ Pro oven napi znovu :!dir , m zobraz obsah adrese.
+
+Poznmka: Jakmile ukon Vim a znovu ho spust s nzvem souboru TEST,
+ soubor bude pesn kopie vuky, kdy si ji ukldal.
+
+ 5. Nyn odstra soubor napsnm (MS-DOS): :!del TEST
+ nebo (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.3: VBROV PKAZ ULOEN
+
+
+ ** Pro uloen sti souboru napi :#,# w SOUBOR **
+
+ 1. Jet jednou napi :!dir nebo :!ls pro vpis aktulnho adrese
+ a vyber vhodn nzev souboru jako nap. TEST.
+
+ 2. Pesu kurzor na vrch tto strnky a stiskni Ctrl-g pro zobrazen
+ sla dku. ZAPAMATUJ SI TOTO SLO!
+
+ 3. Nyn se pesu na spodek tto strnky a opt stiskni Ctrl-g.
+ ZAPAMATUJ SI I SLO TOHOTO DKU!
+
+ 4. Pro uloen POUZE sti souboru, napi :#,# w TEST kde #,# jsou
+ sla dvou zapamatovanch dk (vrch, spodek) a TEST je nzev souboru.
+
+ 5. Znova se ujisti, e tam ten soubor je pomoc :!dir ale NEODSTRAUJ ho.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.4: SLUOVN SOUBOR
+
+
+ ** K vloen obsahu souboru napi :r NZEV_SOUBORU **
+
+ 1. Napi :!dir pro ujitn, e soubor TEST stle existuje.
+
+ 2. Pesu kurzor na vrch tto strnky.
+
+POZNMKA: Po vykonn kroku 3 uvid lekci 5.3. Potom se opt pesu dol
+ na tuto lekci.
+
+ 3. Nyn vlo soubor TEST pouitm pkazu :r TEST kde TEST je nzev
+ souboru.
+
+POZNMKA: Soubor, kter vkld se vlo od msta, kde se nachz kurzor.
+
+ 4. Pro potvrzen vloen souboru, pesu kurzor zpt a vimni si, e te
+ m dv kopie lekce 5.3, originl a souborovou verzi.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 5
+
+
+ 1. :!pkaz vykon vnj pkaz.
+
+ Nkter uiten pklady jsou:
+ (MS-DOS) (Unix)
+ :!dir :!ls - zobraz obsah souboru.
+ :!del SOUBOR :!rm SOUBOR - odstran SOUBOR.
+
+ 2. :w SOUBOR ulo aktuln text jako SOUBOR na disk.
+
+ 3. :#,#w SOUBOR ulo dky od # do # do SOUBORU.
+
+ 4. :r SOUBOR vybere z disku SOUBOR a vlo ho do editovanho souboru
+ za pozici kurzoru.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.1: PKAZ OTEVT
+
+
+ ** Napi o pro vloen dku pod kurzor a pepnut do Vkldacho mdu. **
+
+ 1. Pemsti kurzor ne na dek oznaen --->.
+
+ 2. Napi o (mal) pro vloen dku POD kurzor a pepnut do
+ Vkldacho mdu.
+
+ 3. Nyn zkopruj dek oznaen ---> a stiskni <ESC> pro ukonen
+ Vkldacho mdu.
+
+---> Po stisknut o se kurzor pemst na vloen dek do Vkldacho
+ mdu.
+
+ 4. Pro oteven dku NAD kurzorem jednodue napi velk O , msto
+ malho o. Vyzkouej si to na nsledujcm dku.
+Vlo dek nad tmto napsnm Shift-O po umstn kurzoru na tento dek.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.2: PKAZ PIDAT
+
+
+ ** Stiskni a pro vloen textu ZA kurzor. **
+
+ 1. Pesu kurzor na ne na konec dky oznaen --->
+ stisknutm $ v Normlnm mdu.
+
+ 2. Stiskni a (mal) pro pidn textu ZA znak, kter je pod kurzorem.
+ (Velk A pid na konec dku.)
+
+Poznmka: Tmto se vyhne stisknut i , poslednho znaku, textu na vloen,
+ <ESC>, kurzor doprava, a nakonec x na pidvn na konec dku!
+
+ 3. Nyn dokon prvn dek. Vimni si, e pidvn je vlastn stejn jako
+ Vkldac md, krom msta, kam se text vkld.
+
+---> Tento dek ti umouje nacviit
+---> Tento dek ti umouje nacviit pidvn textu na konec dky.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.3: JIN ZPSOB NAHRAZOVN
+
+
+ ** Napi velk R pro nahrazen vc ne jednoho znaku. **
+
+ 1. Pesu kurzor na prvn dek oznaen --->.
+
+ 2. Umsti kurzor na zatek prvnho slova, kter je odlin od druhho
+ dku oznaenho ---> (slovo 'posledn').
+
+ 3. Nyn stiskni R a nahra zbytek textu na prvnm dku pepsnm
+ starho textu tak, aby byl prvn dek stejn jako ten druh.
+
+---> Pro upraven prvnho dku do tvaru toho posledn na stran pouij kl.
+---> Pro upraven prvnho dku do tvaru toho druhho, napi R a nov text.
+
+ 4. Vimni si, e jakmile stiskne <ESC> vechen nezmnn text zstv.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.4: NASTAVEN MONOST
+
+ ** Nastav monost, e vyhledvn anebo nahrazovn nedb velikosti psmen **
+
+ 1. Vyhledej etzec 'ignore' napsnm:
+ /ignore
+ Zopakuj nkolikrt stisknut klvesy n.
+
+ 2. Nastav monost 'ic' (Ignore case) napsnm pkazu:
+ :set ic
+
+ 3. Nyn znovu vyhledej 'ignore' stisknutm: n
+ Nkolikrt hledn zopakuj stisknutm klvesy n.
+
+ 4. Nastav monosti 'hlsearch' a 'incsearch':
+ :set hls is
+
+ 5. Nyn znovu vykonej vyhledvac pkaz a sleduj, co se stane:
+ /ignore
+
+ 6. Pro vypnut zvrazovn vsledk napi:
+ :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRHNUT LEKCE 6
+
+
+ 1. Stisknut o oteve nov dek POD kurzorem a umst kurzor na vloen
+ dek do Vkldacho mdu.
+ Napsn velkho O oteve dek NAD dkem, na kterm je kurzor.
+
+ 2. Stiskni a pro vloen textu ZA znak na pozici kurzoru.
+ Napsn velkho A automaticky pid text na konec dku.
+
+ 3. Stisknut velkho R pepne do Nahrazovacho mdu, dokud
+ nestiskne <ESC> pro jeho ukonen.
+
+ 4. Napsn ":set xxx" nastav monosti "xxx".
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCE 7: PKAZY ON-LINE NPOVDY
+
+
+ ** Pouvej on-line systm npovdy **
+
+ Vim m obshl on-line systm npovdy. Pro zatek vyzkouej jeden z
+ nsledujcch:
+ - stiskni klvesu <HELP> (pokud ji m)
+ - stiskni klvesu <F1> (pokud ji m)
+ - napi :help <ENTER>
+
+ Napi :q <ENTER> pro uzaven okna npovdy.
+
+ Me najt npovdu k jakmukoliv tmatu pidnm argumentu k
+ pkazu ":help". Zkus tyto (nezapome stisknout <ENTER>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCE 8: VYTVOEN INICIALIZANHO SKRIPTU
+
+ ** Zapni funkce editoru Vim **
+
+ Vim m daleko vce funkc ne Vi, ale vtina z nich je vypnuta ve vchozm
+ nastaven. Pro zapnut nkterch vytvo soubor "vimrc".
+
+ 1. Zani upravovat soubor "vimrc". Toto zvis na pouitm systmu:
+ :edit ~/.vimrc pro Unix
+ :edit ~/_vimrc pro MS-Windows
+
+ 2. Nyn ti ukzkov "vimrc" soubor:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Ulo soubor pomoc:
+
+ :write
+
+ Po ptm startu Vim se zapne zvrazovn syntaxe.
+ Do souboru "vimrc" me pidat vechny svoje upednostovan nastaven.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Toto ukonuje vuku Vim, kter byla mylen jako strun pehled
+ editoru Vim, tak akort postaujc pro lehk a obstojn pouvn editoru.
+ Tato vuka m daleko od plnosti, protoe Vim obsahuje podstatn vce
+ pkaz. Dle si peti uivatelsk manul: ":help user-manual".
+
+ Pro dal studium je doporuen kniha:
+ Vim - Vi Improved - od Steve Oualline
+ Nakladatel: New Riders
+ Prvn kniha uren pro Vim. Obzvlt vhodn pro zatenky.
+ Obsahuje mnostv pklad a obrzk.
+ viz https://iccf-holland.org/click5.html
+
+ Tato kniha je star a vce vnovan Vi ne Vim, ale tak doporuen:
+ Learning the Vi Editor - od Linda Lamb
+ Nakladatel: O'Reilly & Associates Inc.
+ Je to dobr kniha pro zskn vdomost tm o vem, co mete s Vi dlat.
+ est vydn obsahuje t informace o Vim.
+
+ Tato vuka byla napsan autory Michael C. Pierce a Robert K. Ware,
+ Colorado School of Mines s pouitm mylenek od: Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Upravil pro Vim: Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Peklad do etiny: Lubo Turek
+ E-Mail: lubos.turek@gmail.com
+ 2007 Feb 28
diff --git a/runtime/tutor/tutor.cs.cp1250 b/runtime/tutor/tutor.cs.cp1250
new file mode 100644
index 0000000..26567db
--- /dev/null
+++ b/runtime/tutor/tutor.cs.cp1250
@@ -0,0 +1,812 @@
+===============================================================================
+= V t e j t e v t u t o r i a l u V I M - Verze 1.5 =
+===============================================================================
+
+ Vim je velmi vkonn editor, kter m pli mnoho pkaz na to, aby
+ mohly bt vechny vysvtlen ve vuce jako tato. Tato vuka obsahuje
+ dostaten mnostv pkaz na to, aby bylo mon pouvat Vim jako
+ vceelov editor.
+
+ Piblin as potebn ke zvldnut tto vuky je 25-30 minut, zle
+ na tom, kolik asu strvte pezkuovnm.
+
+ Pkazy v lekcch upravuj text. Vytvo kopii tohoto souboru pro
+ procviovn (pi startu "vimtutor" je ji toto kopie).
+
+ Je dleit pamatovat, e tato vuka je vytvoena pro vuku pouvnm.
+ To znamen, e je poteba si pkazy vyzkouet pro jejich sprvn
+ nauen. Pokud si jen te text, pkazy zapomene!
+
+ Nyn se pesvdte, e Caps-Lock NEN stlaen a nkolikrt stisknte
+ klvesu j aby se kurzor posunul natolik, e lekce 1.1 zapln celou
+ obrazovku.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.1: POHYB KURZORU
+
+
+ ** Pro pohyb kurzoru pouvej klvesy h,j,k,l jak je znzornno ne. **
+ ^
+ k Funkce: Klvesa h je vlevo a vykon pohyb vlevo.
+ < h l > Klvesa l je vpravo a vykon pohyb vpravo.
+ j Klvesa j vypad na ipku dolu.
+ v
+ 1. Pohybuj kurzorem po obrazovce dokud si na to nezvykne.
+
+ 2. Dr klvesu pro pohyb dolu (j), dokud se jej funkce nezopakuje.
+---> Te v jak se pesunout na nsledujc lekci.
+
+ 3. Pouitm klvesy dolu pejdi na lekci 1.2.
+
+Poznmka: Pokud si nkdy nejsi jist nm, co jsi napsal, stla <ESC> pro
+ pechod do Normlnho mdu. Pot pepi poadovan pkaz.
+
+Poznmka: Kurzorov klvesy tak funguj, avak pouvn hjkl je rychlej
+ jakmile si na nj zvykne.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.2: SPUTN A UKONEN VIM
+
+
+ !! POZNMKA: Ped vykonnm tchto krok si peti celou lekci!!
+
+ 1. Stla <ESC> (pro ujitn, e se nachz v Normlnm mdu).
+
+ 2. Napi: :q! <ENTER>.
+
+---> Tmto ukon editor BEZ uloen zmn, kter si vykonal.
+ Pokud chce uloit zmny a ukonit editor napi:
+ :wq <ENTER>
+
+ 3. A se dostane na pkazov dek, napi pkaz, kterm se dostane zpt
+ do tto vuky. To me bt: vimtutor <ENTER>
+ Bn se pouv: vim tutor <ENTER>
+
+---> 'vim' znamen sputn editoru, 'tutor' je soubor k editaci.
+
+ 4. Pokud si tyto kroky spolehliv pamatuje, vykonej kroky 1 a 3, m
+ ukon a znovu spust editor. Potom pesu kurzor dolu na lekci 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.3: PRAVA TEXTU - MAZN
+
+
+ ** Stisknutm klvesy x v Normlnm mdu smae znak na mst kurzoru. **
+
+ 1. Pesu kurzor ne na dek oznaen --->.
+
+ 2. K odstrann chyb pejdi kurzorem na znak, kter chce smazat.
+
+ 3. Stla klvesu x k odstrann nechtnch znak.
+
+ 4. Opakuj kroky 2 a 4 dokud nen vta sprvn.
+
+---> Krva skoilla pess mssc.
+
+ 5. Pokud je vta sprvn, pejdi na lekci 1.4.
+
+POZNMKA: Nesna se pouze zapamatovat pedvdn pkazy, u se je pouvnm.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.4: PRAVA TEXTU - VKLDN
+
+
+ ** Stlaen klvesy i v Normlnm mdu umouje vkldn textu. **
+
+ 1. Pesu kurzor na prvn dek oznaen --->.
+
+ 2. Pro upraven prvnho dku do podoby dku druhho, pesu kurzor na
+ prvn znak za msto, kde m bt text vloen.
+
+ 3. Stla i a napi potebn dodatek.
+
+ 4. Po opraven kad chyby stla <ESC> pro nvrat do Normlnho mdu.
+ Opakuj kroky 2 a 4 dokud nen vta sprvn.
+
+---> Njak txt na tto .
+---> Njak text chyb na tto dce.
+
+ 5. Pokud ji ovld vkldn textu, pejdi na nsledujc shrnut.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 1
+
+
+ 1. Kurzorem se pohybuje pomoc ipek nebo klvesami hjkl.
+ h (vlevo) j (dolu) k (nahoru) l (vpravo)
+
+ 2. Pro sputn Vimu (z pkazovho dku) napi: vim SOUBOR <ENTER>
+
+ 3. Pro ukonen Vimu napi: <ESC> :q! <ENTER> bez uloen zmn.
+ anebo: <ESC> :wq <ENTER> pro uloen zmn.
+
+ 4. Pro smazn znaku pod kurzorem napi v Normlnm mdu: x
+
+ 5. Pro vkldn textu od msta kurzoru napi v Normlnm mdu:
+ i vkldan text <ESC>
+
+POZNMKA: Stlaen <ESC> t pemst do Normlnho mdu nebo zru nechtn
+ a sten dokonen pkaz.
+
+Nyn pokrauj Lekc 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.1: PKAZY MAZN
+
+
+ ** Pkaz dw smae znaky do konce slova. **
+
+ 1. Stla <ESC> k ubezpeen, e jsi v Normlnm mdu.
+
+ 2. Pesu kurzor ne na dek oznaen --->.
+
+ 3. Pesu kurzor na zatek slova, kter je poteba smazat.
+
+ 4. Napi dw , aby slovo zmizelo.
+
+POZNMKA: Psmena dw se zobraz na poslednm dku obrazovky jakmile je
+ nape. Kdy nape nco patn, stla <ESC> a zani znova.
+
+---> Jsou tu njak slova zbava, kter nepat list do tto vty.
+
+ 5. Opakuj kroky 3 a 4 dokud nen vta sprvn a pejdi na lekci 2.2.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.2: VCE PKAZ MAZN
+
+
+ ** Napsn pkazu d$ smae ve a do konce dky. **
+
+ 1. Stla <ESC> k ubezpeen, e jsi v Normlnm mdu.
+
+ 2. Pesu kurzor ne na dek oznaen --->.
+
+ 3. Pesu kurzor na konec sprvn vty (ZA prvn teku).
+
+ 4. Napi d$ ,aby jsi smazal znaky a do konce dku.
+
+---> Nkdo napsal konec tto vty dvakrt. konec tto vty dvakrt.
+
+
+ 5. Pejdi na lekci 2.3 pro pochopen toho, co se stalo.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.3: ROZIOVAC PKAZY A OBJEKTY
+
+
+ Formt mazacho pkazu d je nsledujc:
+
+ [slo] d objekt NEBO d [slo] objekt
+ Kde:
+ slo - udv kolikrt se pkaz vykon (voliteln, vchoz=1).
+ d - je pkaz mazn.
+ objekt - udv na em se pkaz vykonv (vypsan ne).
+
+ Krtk vpis objekt:
+ w - od kurzoru do konce slova, vetn mezer.
+ e - od kurzoru do konce slova, BEZ mezer.
+ $ - od kurzoru do konce dku.
+
+POZNMKA: Stlaenm klvesy objektu v Normlnm mdu se kurzor pesune na
+ msto upesnn ve vpisu objekt.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.4: VJIMKA Z 'PKAZ-OBJEKT'
+
+
+ ** Napsnm dd smae cel dek. **
+
+ Vzhledem k astosti mazn celho dku se autoi Vimu rozhodli, e bude
+ jednodu napsat prost dv d k smazn celho dku.
+
+ 1. Pesu kurzor na druh dek spodnho textu.
+ 2. Napi dd pro smazn dku.
+ 3. Pejdi na tvrt dek.
+ 4. Napi 2dd (vzpome si slo-pkaz-objekt) pro smazn dvou dk.
+
+ 1) Re jsou erven,
+ 2) Blto je zbavn,
+ 3) Fialky jsou modr,
+ 4) Mm auto,
+ 5) Hodinky ukazuj as,
+ 6) Cukr je sladk,
+ 7) A to jsi i ty.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.5: PKAZ UNDO
+
+
+ ** Stla u pro vrcen poslednho pkazu, U pro celou dku. **
+
+ 1. Pesu kurzor ne na dek oznaen ---> a pemsti ho na prvn chybu.
+ 2. Napi x pro smazn prvnho nechtnho znaku.
+ 3. Te napi u m vrt zpt posledn vykonan pkaz.
+ 4. Nyn oprav vechny chyby na dku pomoc pkazu x .
+ 5. Napi velk U m vrt dek do pvodnho stavu.
+ 6. Te napi u nkolikrt, m vrt zpt pkaz U .
+ 7. Stla CTRL-R (klvesu CTRL dr stlaenou a stiskni R) nkolikrt,
+ m vrt zpt pedtm vrcen pkazy (redo).
+
+---> Opprav chybby nna toomto dku a nahra je pommoc undo.
+
+ 8. Toto jsou velmi uiten pkazy. Nyn pejdi na souhrn Lekce 2.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 2
+
+
+ 1. Pro smazn znak od kurzoru do konce slova napi: dw
+
+ 2. Pro smazn znak od kurzoru do konce dku napi: d$
+
+ 3. Pro smazn celho dku napi: dd
+
+ 4. Formt pkazu v Normlnm mdu je:
+
+ [slo] pkaz objekt NEBO pkaz [slo] objekt
+ kde:
+ slo - udv poet opakovn pkazu
+ pkaz - udv co je teba vykonat, napklad d mae
+ objekt - udv rozsah pkazu, napklad w (slovo),
+ $ (do konce dku), atd.
+
+ 5. Pro vrcen pedel innosti, napi: u (mal u)
+ Pro vrcen vech prav na dku napi: U (velk U)
+ Pro vrcen vrcench prav (redo) napi: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.1: PKAZ VLOIT
+
+
+ ** Pka p vlo posledn vymazan text za kurzor. **
+
+ 1. Pesu kurzor ne na posledn dek textu.
+
+ 2. Napi dd pro smazn dku a jeho uloen do bufferu.
+
+ 3. Pesu kurzor V݊E tam, kam smazan dek pat.
+
+ 4. V Normlnm mdu napi p pro optn vloen dku.
+
+ 5. Opakuj kroky 2 a 4 dokud dky nebudou ve sprvnm poad.
+
+ d) Tak se doke vzdlvat?
+ b) Fialky jsou modr,
+ c) Inteligence se u,
+ a) Re jsou erven,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.2: PKAZ NAHRAZEN
+
+
+ ** Napsnm r a znaku se nahrad znak pod kurzorem. **
+
+ 1. Pesu kurzor ne na prvn dek oznaen --->.
+
+ 2. Pesu kurzor na zatek prvn chyby.
+
+ 3. Napi r a potom znak, kter nahrad chybu.
+
+ 4. Opakuj kroky 2 a 3 dokud nen prvn dka sprvn.
+
+---> Kdi byl pzn tento deg, nkdu stlail paqn klvesy!
+---> Kdy byl psn tento dek, nkdo stlal patn klvesy!
+
+ 5. Nyn pejdi na Lekci 3.2.
+
+POZNMKA: Zapamatuj si, e by ses ml uit pouvnm, ne zapamatovnm.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.3: PKAZ PRAVY
+
+
+ ** Pokud chce zmnit st nebo cel slovo, napi cw . **
+
+ 1. Pesu kurzor ne na prvn dek oznaen --->.
+
+ 2. Umsti kurzor na psmeno i v slov iok.
+
+ 3. Napi cw a oprav slovo (v tomto ppad napi 'dek'.)
+
+ 4. Stla <ESC> a pejdi na dal chybu (prvn znak, kter teba zmnit.)
+
+ 5. Opakuj kroky 3 a 4 dokud nen prvn vta stejn jako ta druh.
+
+---> Tento iok m nkolik skic, kter psadoinsa zmnit pasdgf pkazu.
+---> Tento dek m nkolik slov, kter potebuj zmnit pomoc pkazu.
+
+Vimni si, e cw nejen nahrazuje slovo, ale tak pemst do vkldn.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.4: VCE ZMN POUITM c
+
+
+ ** Pkaz pro pravu se dru se stejnmi objekty jako ten pro mazn. **
+
+ 1. Pkaz pro pravu pracuje stejn jako pro mazn. Formt je:
+
+ [slo] c objekt NEBO c [slo] objekt
+
+ 2. Objekty jsou tak shodn, jako nap.: w (slovo), $ (konec dku), atd.
+
+ 3. Pejdi ne na prvn dek oznaen --->.
+
+ 4. Pesu kurzor na prvn rozdl.
+
+ 5. Napi c$ pro upraven zbytku dku podle toho druhho a stla <ESC>.
+
+---> Konec tohoto dku potebuje pomoc, aby byl jako ten druh.
+---> Konec tohoto dku potebuje opravit pouitm pkazu c$ .
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 3
+
+
+ 1. Pro vloen textu, kter byl smazn, napi p . To vlo smazan text
+ ZA kurzor (pokud byl dek smazan, pejde na dek pod kurzorem).
+
+ 2. Pro nahrazen znaku pod kurzorem, napi r a potom znak, kterm
+ chce pvodn znak nahradit.
+
+ 3. Pkaz na upravovn umouje zmnit specifikovan objekt od kurzoru
+ do konce objektu. Napklad: Napi cw ,m zmn text od pozice
+ kurzoru do konce slova, c$ zmn text do konce dku.
+
+ 4. Formt pro nahrazovn je:
+
+ [slo] c objekt NEBO c [slo] objekt
+
+Nyn pejdi na nsledujc lekci.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.1: POZICE A STATUS SOUBORU
+
+
+ ** Stla CTRL-g pro zobrazen sv pozice v souboru a statusu souboru.
+ Stla SHIFT-G pro pechod na dek v souboru. **
+
+ Poznmka: Peti si celou lekci ne zane vykonvat kroky!!
+
+ 1. Dr klvesu Ctrl stlaenou a stiskni g . Vespod obrazovky se zobraz
+ stavov dek s nzvem souboru a dkou na kter se nachz. Zapamatuj
+ si slo dku pro krok 3.
+
+ 2. Stla shift-G pro pesun na konec souboru.
+
+ 3. Napi slo dku na kterm si se nachzel a stla shift-G. To t
+ vrt na dek, na kterm jsi dve stiskl Ctrl-g.
+ (Kdy pe sla, tak se NEZOBRAZUJ na obrazovce.)
+
+ 4. Pokud se ct schopn vykonat tyto kroky, vykonej je.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.2: PKAZ VYHLEDVN
+
+
+ ** Napi / nsledovan etzcem pro vyhledn onoho etzce. **
+
+ 1. Stiskni / v Normlnm mdu. Vimni si, e tento znak se spolu s
+ kurzorem zobraz v doln sti obrazovky jako pkaz : .
+
+ 2. Nyn napi 'chhybba' <ENTER>. To je slovo, kter chce vyhledat.
+
+ 3. Pro vyhledn dalho vsledku stejnho etzce, jednodue stla n .
+ Pro vyhledn dalho vsledku stejnho etzce opanm smrem, stiskni
+ Shift-N.
+
+ 4. Pokud chce vyhledat etzec v opanm smru, pouij pkaz ? msto
+ pkazu / .
+
+---> "chhybba" nen zpsob, jak hlskovat chyba; chhybba je chyba.
+
+Poznmka: Kdy vyhledvn doshne konce souboru, bude pokraovat na jeho
+ zatku.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.3: VYHLEDVN PROV ZVORKY
+
+
+ ** Napi % pro nalezen prov ),], nebo } . **
+
+ 1. Pemsti kurzor na kteroukoli (, [, nebo { v dku oznaenm --->.
+
+ 2. Nyn napi znak % .
+
+ 3. Kurzor se pemst na odpovdajc zvorku.
+
+ 4. Stla % pro pesun kurzoru zpt na otvrajc zvorku.
+
+---> Toto ( je testovac dek ('s, ['s ] a {'s } v nm. ))
+
+Poznmka: Toto je velmi uiten p ladn programu s chybjcmi
+ uzavracmi zvorkami.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.4: ZPSOB JAK ZMNIT CHYBY
+
+
+ ** Napi :s/star/nov/g pro nahrazen slova 'nov' za 'star'. **
+
+ 1. Pesu kurzor na dek oznaen --->.
+
+ 2. Napi :s/dobr/dobr <ENTER> . Vimni si, e tento pkaz zmn pouze
+ prvn vskyt v dku.
+
+ 3. Nyn napi :s/dobr/dobr/g co znamen celkov nahrazen v dku.
+ Toto nahrad vechny vskyty v dku.
+
+---> dobr suroviny a dobr nin jsou zkladem dobr kuchyn.
+
+ 4. Pro zmnu vech vskyt etzce mezi dvma dky,
+ Napi :#,#s/star/nov/g kde #,# jsou sla onch dek.
+ Napi :%s/star/nov/g pro zmnu vech vskyt v celm souboru.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 4
+
+
+ 1. Ctrl-g vype tvou pozici v souboru a status souboru.
+ Shift-G t pemst na konec souboru. slo nsledovan
+ Shift-G t pesune na dan slo dku.
+
+ 2. Napsn / nsledovan etzcem vyhled etzec smrem DOPEDU.
+ Napsn ? nsledovan etzcem vyhled etzec smrem DOZADU.
+ Napsn n po vyhledvn najde nsledujc vskyt etzce ve stejnm
+ smru, Shift-N ve smru opanm.
+
+ 3. Stisknut % kdy je kurzor na (,),[,],{, nebo } najde odpovdajc
+ provou zvorku.
+
+ 4. Pro nahrazen novho za prvn star v dku napi :s/star/nov
+ Pro nahrazen novho za vechny star v dku napi :s/star/nov/g
+ Pro nahrazen etzc mezi dvmi dkami # napi :#,#s/star/nov/g
+ Pro nahrazen vech vskyt v souboru napi :%s/star/nov/g
+ Pro potvrzen kadho nahrazen pidej 'c' :%s/star/nov/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.1: JAK VYKONAT VNJ PKAZ
+
+
+ ** Napi :! nsledovan vnjm pkazem pro sputn pkazu. **
+
+ 1. Napi obvykl pkaz : , kter umst kurzor na spodek obrazovky
+ To umon napsat pkaz.
+
+ 2. Nyn stiskni ! (vykink). To umon vykonat jakkoliv vnj
+ pkaz z pkazovho dku.
+
+ 3. Napklad napi ls za ! a stiskni <ENTER>. Tento pkaz zobraz
+ obsah tvho adrese jako v pkazovm dku.
+ Vyzkouej :!dir pokud ls nefunguje.
+
+Poznmka: Takto je mon vykonat jakkoliv pkaz.
+
+Poznmka: Vechny pkazy : mus bt dokonen stisknutm <ENTER>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.2: VCE O UKLDN SOUBOR
+
+
+ ** Pro uloen zmn v souboru napi :w SOUBOR. **
+
+ 1. Napi :!dir nebo :!ls pro vpis aktulnho adrese.
+ U v, e za tmto mus stisknout <ENTER>.
+
+ 2. Vyber si nzev souboru, kter jet neexistuje, napklad TEST.
+
+ 3. Nyn napi: :w TEST (kde TEST je vybran nzev souboru.)
+
+ 4. To ulo cel soubor (Vuka Vimu) pod nzvem TEST.
+ Pro oven napi znovu :!dir , m zobraz obsah adrese.
+
+Poznmka: Jakmile ukon Vim a znovu ho spust s nzvem souboru TEST,
+ soubor bude pesn kopie vuky, kdy si ji ukldal.
+
+ 5. Nyn odstra soubor napsnm (MS-DOS): :!del TEST
+ nebo (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.3: VBROV PKAZ ULOEN
+
+
+ ** Pro uloen sti souboru napi :#,# w SOUBOR **
+
+ 1. Jet jednou napi :!dir nebo :!ls pro vpis aktulnho adrese
+ a vyber vhodn nzev souboru jako nap. TEST.
+
+ 2. Pesu kurzor na vrch tto strnky a stiskni Ctrl-g pro zobrazen
+ sla dku. ZAPAMATUJ SI TOTO SLO!
+
+ 3. Nyn se pesu na spodek tto strnky a opt stiskni Ctrl-g.
+ ZAPAMATUJ SI I SLO TOHOTO DKU!
+
+ 4. Pro uloen POUZE sti souboru, napi :#,# w TEST kde #,# jsou
+ sla dvou zapamatovanch dk (vrch, spodek) a TEST je nzev souboru.
+
+ 5. Znova se ujisti, e tam ten soubor je pomoc :!dir ale NEODSTRAUJ ho.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.4: SLUOVN SOUBOR
+
+
+ ** K vloen obsahu souboru napi :r NZEV_SOUBORU **
+
+ 1. Napi :!dir pro ujitn, e soubor TEST stle existuje.
+
+ 2. Pesu kurzor na vrch tto strnky.
+
+POZNMKA: Po vykonn kroku 3 uvid lekci 5.3. Potom se opt pesu dol
+ na tuto lekci.
+
+ 3. Nyn vlo soubor TEST pouitm pkazu :r TEST kde TEST je nzev
+ souboru.
+
+POZNMKA: Soubor, kter vkld se vlo od msta, kde se nachz kurzor.
+
+ 4. Pro potvrzen vloen souboru, pesu kurzor zpt a vimni si, e te
+ m dv kopie lekce 5.3, originl a souborovou verzi.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUT LEKCE 5
+
+
+ 1. :!pkaz vykon vnj pkaz.
+
+ Nkter uiten pklady jsou:
+ (MS-DOS) (Unix)
+ :!dir :!ls - zobraz obsah souboru.
+ :!del SOUBOR :!rm SOUBOR - odstran SOUBOR.
+
+ 2. :w SOUBOR ulo aktuln text jako SOUBOR na disk.
+
+ 3. :#,#w SOUBOR ulo dky od # do # do SOUBORU.
+
+ 4. :r SOUBOR vybere z disku SOUBOR a vlo ho do editovanho souboru
+ za pozici kurzoru.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.1: PKAZ OTEVT
+
+
+ ** Napi o pro vloen dku pod kurzor a pepnut do Vkldacho mdu. **
+
+ 1. Pemsti kurzor ne na dek oznaen --->.
+
+ 2. Napi o (mal) pro vloen dku POD kurzor a pepnut do
+ Vkldacho mdu.
+
+ 3. Nyn zkopruj dek oznaen ---> a stiskni <ESC> pro ukonen
+ Vkldacho mdu.
+
+---> Po stisknut o se kurzor pemst na vloen dek do Vkldacho
+ mdu.
+
+ 4. Pro oteven dku NAD kurzorem jednodue napi velk O , msto
+ malho o. Vyzkouej si to na nsledujcm dku.
+Vlo dek nad tmto napsnm Shift-O po umstn kurzoru na tento dek.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.2: PKAZ PIDAT
+
+
+ ** Stiskni a pro vloen textu ZA kurzor. **
+
+ 1. Pesu kurzor na ne na konec dky oznaen --->
+ stisknutm $ v Normlnm mdu.
+
+ 2. Stiskni a (mal) pro pidn textu ZA znak, kter je pod kurzorem.
+ (Velk A pid na konec dku.)
+
+Poznmka: Tmto se vyhne stisknut i , poslednho znaku, textu na vloen,
+ <ESC>, kurzor doprava, a nakonec x na pidvn na konec dku!
+
+ 3. Nyn dokon prvn dek. Vimni si, e pidvn je vlastn stejn jako
+ Vkldac md, krom msta, kam se text vkld.
+
+---> Tento dek ti umouje nacviit
+---> Tento dek ti umouje nacviit pidvn textu na konec dky.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.3: JIN ZPSOB NAHRAZOVN
+
+
+ ** Napi velk R pro nahrazen vc ne jednoho znaku. **
+
+ 1. Pesu kurzor na prvn dek oznaen --->.
+
+ 2. Umsti kurzor na zatek prvnho slova, kter je odlin od druhho
+ dku oznaenho ---> (slovo 'posledn').
+
+ 3. Nyn stiskni R a nahra zbytek textu na prvnm dku pepsnm
+ starho textu tak, aby byl prvn dek stejn jako ten druh.
+
+---> Pro upraven prvnho dku do tvaru toho posledn na stran pouij kl.
+---> Pro upraven prvnho dku do tvaru toho druhho, napi R a nov text.
+
+ 4. Vimni si, e jakmile stiskne <ESC> vechen nezmnn text zstv.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.4: NASTAVEN MONOST
+
+ ** Nastav monost, e vyhledvn anebo nahrazovn nedb velikosti psmen **
+
+ 1. Vyhledej etzec 'ignore' napsnm:
+ /ignore
+ Zopakuj nkolikrt stisknut klvesy n.
+
+ 2. Nastav monost 'ic' (Ignore case) napsnm pkazu:
+ :set ic
+
+ 3. Nyn znovu vyhledej 'ignore' stisknutm: n
+ Nkolikrt hledn zopakuj stisknutm klvesy n.
+
+ 4. Nastav monosti 'hlsearch' a 'incsearch':
+ :set hls is
+
+ 5. Nyn znovu vykonej vyhledvac pkaz a sleduj, co se stane:
+ /ignore
+
+ 6. Pro vypnut zvrazovn vsledk napi:
+ :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRHNUT LEKCE 6
+
+
+ 1. Stisknut o oteve nov dek POD kurzorem a umst kurzor na vloen
+ dek do Vkldacho mdu.
+ Napsn velkho O oteve dek NAD dkem, na kterm je kurzor.
+
+ 2. Stiskni a pro vloen textu ZA znak na pozici kurzoru.
+ Napsn velkho A automaticky pid text na konec dku.
+
+ 3. Stisknut velkho R pepne do Nahrazovacho mdu, dokud
+ nestiskne <ESC> pro jeho ukonen.
+
+ 4. Napsn ":set xxx" nastav monosti "xxx".
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCE 7: PKAZY ON-LINE NPOVDY
+
+
+ ** Pouvej on-line systm npovdy **
+
+ Vim m obshl on-line systm npovdy. Pro zatek vyzkouej jeden z
+ nsledujcch:
+ - stiskni klvesu <HELP> (pokud ji m)
+ - stiskni klvesu <F1> (pokud ji m)
+ - napi :help <ENTER>
+
+ Napi :q <ENTER> pro uzaven okna npovdy.
+
+ Me najt npovdu k jakmukoliv tmatu pidnm argumentu k
+ pkazu ":help". Zkus tyto (nezapome stisknout <ENTER>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCE 8: VYTVOEN INICIALIZANHO SKRIPTU
+
+ ** Zapni funkce editoru Vim **
+
+ Vim m daleko vce funkc ne Vi, ale vtina z nich je vypnuta ve vchozm
+ nastaven. Pro zapnut nkterch vytvo soubor "vimrc".
+
+ 1. Zani upravovat soubor "vimrc". Toto zvis na pouitm systmu:
+ :edit ~/.vimrc pro Unix
+ :edit ~/_vimrc pro MS-Windows
+
+ 2. Nyn ti ukzkov "vimrc" soubor:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Ulo soubor pomoc:
+
+ :write
+
+ Po ptm startu Vim se zapne zvrazovn syntaxe.
+ Do souboru "vimrc" me pidat vechny svoje upednostovan nastaven.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Toto ukonuje vuku Vim, kter byla mylen jako strun pehled
+ editoru Vim, tak akort postaujc pro lehk a obstojn pouvn editoru.
+ Tato vuka m daleko od plnosti, protoe Vim obsahuje podstatn vce
+ pkaz. Dle si peti uivatelsk manul: ":help user-manual".
+
+ Pro dal studium je doporuen kniha:
+ Vim - Vi Improved - od Steve Oualline
+ Nakladatel: New Riders
+ Prvn kniha uren pro Vim. Obzvlt vhodn pro zatenky.
+ Obsahuje mnostv pklad a obrzk.
+ viz https://iccf-holland.org/click5.html
+
+ Tato kniha je star a vce vnovan Vi ne Vim, ale tak doporuen:
+ Learning the Vi Editor - od Linda Lamb
+ Nakladatel: O'Reilly & Associates Inc.
+ Je to dobr kniha pro zskn vdomost tm o vem, co mete s Vi dlat.
+ est vydn obsahuje t informace o Vim.
+
+ Tato vuka byla napsan autory Michael C. Pierce a Robert K. Ware,
+ Colorado School of Mines s pouitm mylenek od: Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Upravil pro Vim: Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Peklad do etiny: Lubo Turek
+ E-Mail: lubos.turek@gmail.com
+ 2007 Feb 28
diff --git a/runtime/tutor/tutor.cs.utf-8 b/runtime/tutor/tutor.cs.utf-8
new file mode 100644
index 0000000..36bb3a2
--- /dev/null
+++ b/runtime/tutor/tutor.cs.utf-8
@@ -0,0 +1,812 @@
+===============================================================================
+= V í t e j t e v t u t o r i a l u V I M - Verze 1.5 =
+===============================================================================
+
+ Vim je velmi výkonný editor, který má příliš mnoho příkazů na to, aby
+ mohly být všechny vysvětlené ve výuce jako tato. Tato výuka obsahuje
+ dostatečné množství příkazů na to, aby bylo možné používat Vim jako
+ víceúčelový editor.
+
+ Přibližný čas potřebný ke zvládnutí této výuky je 25-30 minut, záleží
+ na tom, kolik času strávíte přezkušováním.
+
+ Příkazy v lekcích upravují text. Vytvoř kopii tohoto souboru pro
+ procvičování (při startu "vimtutor" je již toto kopie).
+
+ Je důležité pamatovat, že tato výuka je vytvořena pro výuku používáním.
+ To znamená, že je potřeba si příkazy vyzkoušet pro jejich správné
+ naučení. Pokud si jen čteš text, příkazy zapomeneš!
+
+ Nyní se přesvědčte, že Caps-Lock NENÍ stlačený a několikrát stiskněte
+ klávesu j aby se kurzor posunul natolik, že lekce 1.1 zaplní celou
+ obrazovku.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.1: POHYB KURZORU
+
+
+ ** Pro pohyb kurzoru používej klávesy h,j,k,l jak je znázorněno níže. **
+ ^
+ k Funkce: Klávesa h je vlevo a vykoná pohyb vlevo.
+ < h l > Klávesa l je vpravo a vykoná pohyb vpravo.
+ j Klávesa j vypadá na šipku dolu.
+ v
+ 1. Pohybuj kurzorem po obrazovce dokud si na to nezvykneš.
+
+ 2. Drž klávesu pro pohyb dolu (j), dokud se její funkce nezopakuje.
+---> Teď víš jak se přesunout na následující lekci.
+
+ 3. Použitím klávesy dolu přejdi na lekci 1.2.
+
+Poznámka: Pokud si někdy nejsi jist něčím, co jsi napsal, stlač <ESC> pro
+ přechod do Normálního módu. Poté přepiš požadovaný příkaz.
+
+Poznámka: Kurzorové klávesy také fungují, avšak používání hjkl je rychlejší
+ jakmile si na něj zvykneš.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.2: SPUŠTĚNÍ A UKONČENÍ VIM
+
+
+ !! POZNÁMKA: Před vykonáním těchto kroků si přečti celou lekci!!
+
+ 1. Stlač <ESC> (pro ujištění, že se nacházíš v Normálním módu).
+
+ 2. Napiš: :q! <ENTER>.
+
+---> Tímto ukončíš editor BEZ uložení změn, které si vykonal.
+ Pokud chceš uložit změny a ukončit editor napiš:
+ :wq <ENTER>
+
+ 3. Až se dostaneš na příkazový řádek, napiš příkaz, kterým se dostaneš zpět
+ do této výuky. To může být: vimtutor <ENTER>
+ Běžně se používá: vim tutor <ENTER>
+
+---> 'vim' znamená spuštění editoru, 'tutor' je soubor k editaci.
+
+ 4. Pokud si tyto kroky spolehlivě pamatuješ, vykonej kroky 1 až 3, čímž
+ ukončíš a znovu spustíš editor. Potom přesuň kurzor dolu na lekci 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.3: ÚPRAVA TEXTU - MAZÁNÍ
+
+
+ ** Stisknutím klávesy x v Normálním módu smažeš znak na místě kurzoru. **
+
+ 1. Přesuň kurzor níže na řádek označený --->.
+
+ 2. K odstranění chyb přejdi kurzorem na znak, který chceš smazat.
+
+ 3. Stlač klávesu x k odstranění nechtěných znaků.
+
+ 4. Opakuj kroky 2 až 4 dokud není věta správně.
+
+---> Krááva skoččilla přess měssíc.
+
+ 5. Pokud je věta správně, přejdi na lekci 1.4.
+
+POZNÁMKA: Nesnaž se pouze zapamatovat předváděné příkazy, uč se je používáním.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 1.4: ÚPRAVA TEXTU - VKLÁDÁNÍ
+
+
+ ** Stlačení klávesy i v Normálním módu umožňuje vkládání textu. **
+
+ 1. Přesuň kurzor na první řádek označený --->.
+
+ 2. Pro upravení prvního řádku do podoby řádku druhého, přesuň kurzor na
+ první znak za místo, kde má být text vložený.
+
+ 3. Stlač i a napiš potřebný dodatek.
+
+ 4. Po opravení každé chyby stlač <ESC> pro návrat do Normálního módu.
+ Opakuj kroky 2 až 4 dokud není věta správně.
+
+---> Nějaký txt na této .
+---> Nějaký text chybí na této řádce.
+
+ 5. Pokud již ovládáš vkládání textu, přejdi na následující shrnutí.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUTÍ LEKCE 1
+
+
+ 1. Kurzorem se pohybuje pomocí šipek nebo klávesami hjkl.
+ h (vlevo) j (dolu) k (nahoru) l (vpravo)
+
+ 2. Pro spuštění Vimu (z příkazového řádku) napiš: vim SOUBOR <ENTER>
+
+ 3. Pro ukončení Vimu napiš: <ESC> :q! <ENTER> bez uložení změn.
+ anebo: <ESC> :wq <ENTER> pro uložení změn.
+
+ 4. Pro smazání znaku pod kurzorem napiš v Normálním módu: x
+
+ 5. Pro vkládání textu od místa kurzoru napiš v Normálním módu:
+ i vkládaný text <ESC>
+
+POZNÁMKA: Stlačení <ESC> tě přemístí do Normálního módu nebo zruší nechtěný
+ a částečně dokončený příkaz.
+
+Nyní pokračuj Lekcí 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.1: PŘÍKAZY MAZÁNÍ
+
+
+ ** Příkaz dw smaže znaky do konce slova. **
+
+ 1. Stlač <ESC> k ubezpečení, že jsi v Normálním módu.
+
+ 2. Přesuň kurzor níže na řádek označený --->.
+
+ 3. Přesuň kurzor na začátek slova, které je potřeba smazat.
+
+ 4. Napiš dw , aby slovo zmizelo.
+
+POZNÁMKA: Písmena dw se zobrazí na posledním řádku obrazovky jakmile je
+ napíšeš. Když napíšeš něco špatně, stlač <ESC> a začni znova.
+
+---> Jsou tu nějaká slova zábava, která nepatří list do této věty.
+
+ 5. Opakuj kroky 3 až 4 dokud není věta správně a přejdi na lekci 2.2.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.2: VÍCE PŘÍKAZŮ MAZÁNÍ
+
+
+ ** Napsání příkazu d$ smaže vše až do konce řádky. **
+
+ 1. Stlač <ESC> k ubezpečení, že jsi v Normálním módu.
+
+ 2. Přesuň kurzor níže na řádek označený --->.
+
+ 3. Přesuň kurzor na konec správné věty (ZA první tečku).
+
+ 4. Napiš d$ ,aby jsi smazal znaky až do konce řádku.
+
+---> Někdo napsal konec této věty dvakrát. konec této věty dvakrát.
+
+
+ 5. Přejdi na lekci 2.3 pro pochopení toho, co se stalo.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.3: ROZŠIŘOVACÍ PŘÍKAZY A OBJEKTY
+
+
+ Formát mazacího příkazu d je následující:
+
+ [číslo] d objekt NEBO d [číslo] objekt
+ Kde:
+ číslo - udává kolikrát se příkaz vykoná (volitelné, výchozí=1).
+ d - je příkaz mazání.
+ objekt - udává na čem se příkaz vykonává (vypsané níže).
+
+ Krátký výpis objektů:
+ w - od kurzoru do konce slova, včetně mezer.
+ e - od kurzoru do konce slova, BEZ mezer.
+ $ - od kurzoru do konce řádku.
+
+POZNÁMKA: Stlačením klávesy objektu v Normálním módu se kurzor přesune na
+ místo upřesněné ve výpisu objektů.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.4: VÝJIMKA Z 'PŘÍKAZ-OBJEKT'
+
+
+ ** Napsáním dd smažeš celý řádek. **
+
+ Vzhledem k častosti mazání celého řádku se autoři Vimu rozhodli, že bude
+ jednoduší napsat prostě dvě d k smazání celého řádku.
+
+ 1. Přesuň kurzor na druhý řádek spodního textu.
+ 2. Napiš dd pro smazání řádku.
+ 3. Přejdi na čtvrtý řádek.
+ 4. Napiš 2dd (vzpomeň si číslo-příkaz-objekt) pro smazání dvou řádků.
+
+ 1) Růže jsou červené,
+ 2) Bláto je zábavné,
+ 3) Fialky jsou modré,
+ 4) Mám auto,
+ 5) Hodinky ukazují čas,
+ 6) Cukr je sladký,
+ 7) A to jsi i ty.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 2.5: PŘÍKAZ UNDO
+
+
+ ** Stlač u pro vrácení posledního příkazu, U pro celou řádku. **
+
+ 1. Přesuň kurzor níže na řádek označený ---> a přemísti ho na první chybu.
+ 2. Napiš x pro smazání prvního nechtěného znaku.
+ 3. Teď napiš u čímž vrátíš zpět poslední vykonaný příkaz.
+ 4. Nyní oprav všechny chyby na řádku pomocí příkazu x .
+ 5. Napiš velké U čímž vrátíš řádek do původního stavu.
+ 6. Teď napiš u několikrát, čímž vrátíš zpět příkaz U .
+ 7. Stlač CTRL-R (klávesu CTRL drž stlačenou a stiskni R) několikrát,
+ čímž vrátíš zpět předtím vrácené příkazy (redo).
+
+---> Opprav chybby nna toomto řádku a nahraď je pommocí undo.
+
+ 8. Toto jsou velmi užitečné příkazy. Nyní přejdi na souhrn Lekce 2.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUTÍ LEKCE 2
+
+
+ 1. Pro smazání znaků od kurzoru do konce slova napiš: dw
+
+ 2. Pro smazání znaků od kurzoru do konce řádku napiš: d$
+
+ 3. Pro smazání celého řádku napiš: dd
+
+ 4. Formát příkazu v Normálním módu je:
+
+ [číslo] příkaz objekt NEBO příkaz [číslo] objekt
+ kde:
+ číslo - udává počet opakování příkazu
+ příkaz - udává co je třeba vykonat, například d maže
+ objekt - udává rozsah příkazu, například w (slovo),
+ $ (do konce řádku), atd.
+
+ 5. Pro vrácení předešlé činnosti, napiš: u (malé u)
+ Pro vrácení všech úprav na řádku napiš: U (velké U)
+ Pro vrácení vrácených úprav (redo) napiš: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.1: PŘÍKAZ VLOŽIT
+
+
+ ** Příka p vloží poslední vymazaný text za kurzor. **
+
+ 1. Přesuň kurzor níže na poslední řádek textu.
+
+ 2. Napiš dd pro smazání řádku a jeho uložení do bufferu.
+
+ 3. Přesuň kurzor VÝŠE tam, kam smazaný řádek patří.
+
+ 4. V Normálním módu napiš p pro opětné vložení řádku.
+
+ 5. Opakuj kroky 2 až 4 dokud řádky nebudou ve správném pořadí.
+
+ d) Také se dokážeš vzdělávat?
+ b) Fialky jsou modré,
+ c) Inteligence se učí,
+ a) Růže jsou červené,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.2: PŘÍKAZ NAHRAZENÍ
+
+
+ ** Napsáním r a znaku se nahradí znak pod kurzorem. **
+
+ 1. Přesuň kurzor níže na první řádek označený --->.
+
+ 2. Přesuň kurzor na začátek první chyby.
+
+ 3. Napiš r a potom znak, který nahradí chybu.
+
+ 4. Opakuj kroky 2 až 3 dokud není první řádka správně.
+
+---> Kdiž byl pzán tento řádeg, někdu stlažil špaqné klávesy!
+---> Když byl psán tento řádek, někdo stlačíl špatné klávesy!
+
+ 5. Nyní přejdi na Lekci 3.2.
+
+POZNÁMKA: Zapamatuj si, že by ses měl učit používáním, ne zapamatováním.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.3: PŘÍKAZ ÚPRAVY
+
+
+ ** Pokud chceš změnit část nebo celé slovo, napiš cw . **
+
+ 1. Přesuň kurzor níže na první řádek označený --->.
+
+ 2. Umísti kurzor na písmeno i v slově řiťok.
+
+ 3. Napiš cw a oprav slovo (v tomto případě napiš 'ádek'.)
+
+ 4. Stlač <ESC> a přejdi na další chybu (první znak, který třeba změnit.)
+
+ 5. Opakuj kroky 3 až 4 dokud není první věta stejná jako ta druhá.
+
+---> Tento řiťok má několik skic, které psadoinsa změnit pasdgf příkazu.
+---> Tento řádek má několik slov, které potřebují změnit pomocí příkazu.
+
+Všimni si, že cw nejen nahrazuje slovo, ale také přemístí do vkládání.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 3.4: VÍCE ZMĚN POUŽITÍM c
+
+
+ ** Příkaz pro úpravu se druží se stejnými objekty jako ten pro mazání. **
+
+ 1. Příkaz pro úpravu pracuje stejně jako pro mazání. Formát je:
+
+ [číslo] c objekt NEBO c [číslo] objekt
+
+ 2. Objekty jsou také shodné, jako např.: w (slovo), $ (konec řádku), atd.
+
+ 3. Přejdi níže na první řádek označený --->.
+
+ 4. Přesuň kurzor na první rozdíl.
+
+ 5. Napiš c$ pro upravení zbytku řádku podle toho druhého a stlač <ESC>.
+
+---> Konec tohoto řádku potřebuje pomoc, aby byl jako ten druhý.
+---> Konec tohoto řádku potřebuje opravit použitím příkazu c$ .
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUTÍ LEKCE 3
+
+
+ 1. Pro vložení textu, který byl smazán, napiš p . To vloží smazaný text
+ ZA kurzor (pokud byl řádek smazaný, přejde na řádek pod kurzorem).
+
+ 2. Pro nahrazení znaku pod kurzorem, napiš r a potom znak, kterým
+ chceš původní znak nahradit.
+
+ 3. Příkaz na upravování umožňuje změnit specifikovaný objekt od kurzoru
+ do konce objektu. Například: Napiš cw ,čímž změníš text od pozice
+ kurzoru do konce slova, c$ změní text do konce řádku.
+
+ 4. Formát pro nahrazování je:
+
+ [číslo] c objekt NEBO c [číslo] objekt
+
+Nyní přejdi na následující lekci.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.1: POZICE A STATUS SOUBORU
+
+
+ ** Stlač CTRL-g pro zobrazení své pozice v souboru a statusu souboru.
+ Stlač SHIFT-G pro přechod na řádek v souboru. **
+
+ Poznámka: Přečti si celou lekci než začneš vykonávat kroky!!
+
+ 1. Drž klávesu Ctrl stlačenou a stiskni g . Vespod obrazovky se zobrazí
+ stavový řádek s názvem souboru a řádkou na které se nacházíš. Zapamatuj
+ si číslo řádku pro krok 3.
+
+ 2. Stlač shift-G pro přesun na konec souboru.
+
+ 3. Napiš číslo řádku na kterém si se nacházel a stlač shift-G. To tě
+ vrátí na řádek, na kterém jsi dříve stiskl Ctrl-g.
+ (Když píšeš čísla, tak se NEZOBRAZUJÍ na obrazovce.)
+
+ 4. Pokud se cítíš schopný vykonat tyto kroky, vykonej je.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.2: PŘÍKAZ VYHLEDÁVÁNÍ
+
+
+ ** Napiš / následované řetězcem pro vyhledání onoho řetězce. **
+
+ 1. Stiskni / v Normálním módu. Všimni si, že tento znak se spolu s
+ kurzorem zobrazí v dolní části obrazovky jako příkaz : .
+
+ 2. Nyní napiš 'chhybba' <ENTER>. To je slovo, které chceš vyhledat.
+
+ 3. Pro vyhledání dalšího výsledku stejného řetězce, jednoduše stlač n .
+ Pro vyhledání dalšího výsledku stejného řetězce opačným směrem, stiskni
+ Shift-N.
+
+ 4. Pokud chceš vyhledat řetězec v opačném směru, použij příkaz ? místo
+ příkazu / .
+
+---> "chhybba" není způsob, jak hláskovat chyba; chhybba je chyba.
+
+Poznámka: Když vyhledávání dosáhne konce souboru, bude pokračovat na jeho
+ začátku.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.3: VYHLEDÁVÁNÍ PÁROVÉ ZÁVORKY
+
+
+ ** Napiš % pro nalezení párové ),], nebo } . **
+
+ 1. Přemísti kurzor na kteroukoli (, [, nebo { v řádku označeném --->.
+
+ 2. Nyní napiš znak % .
+
+ 3. Kurzor se přemístí na odpovídající závorku.
+
+ 4. Stlač % pro přesun kurzoru zpět na otvírající závorku.
+
+---> Toto ( je testovací řádek ('s, ['s ] a {'s } v něm. ))
+
+Poznámka: Toto je velmi užitečné pří ladění programu s chybějícími
+ uzavíracími závorkami.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 4.4: ZPŮSOB JAK ZMĚNIT CHYBY
+
+
+ ** Napiš :s/staré/nové/g pro nahrazení slova 'nové' za 'staré'. **
+
+ 1. Přesuň kurzor na řádek označený --->.
+
+ 2. Napiš :s/dobréé/dobré <ENTER> . Všimni si, že tento příkaz změní pouze
+ první výskyt v řádku.
+
+ 3. Nyní napiš :s/dobréé/dobré/g což znamená celkové nahrazení v řádku.
+ Toto nahradí všechny výskyty v řádku.
+
+---> dobréé suroviny a dobréé náčiní jsou základem dobréé kuchyně.
+
+ 4. Pro změnu všech výskytů řetězce mezi dvěma řádky,
+ Napiš :#,#s/staré/nové/g kde #,# jsou čísla oněch řádek.
+ Napiš :%s/staré/nové/g pro změnu všech výskytů v celém souboru.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUTÍ LEKCE 4
+
+
+ 1. Ctrl-g vypíše tvou pozici v souboru a status souboru.
+ Shift-G tě přemístí na konec souboru. Číslo následované
+ Shift-G tě přesune na dané číslo řádku.
+
+ 2. Napsání / následované řetězcem vyhledá řetězec směrem DOPŘEDU.
+ Napsání ? následované řetězcem vyhledá řetězec směrem DOZADU.
+ Napsání n po vyhledávání najde následující výskyt řetězce ve stejném
+ směru, Shift-N ve směru opačném.
+
+ 3. Stisknutí % když je kurzor na (,),[,],{, nebo } najde odpovídající
+ párovou závorku.
+
+ 4. Pro nahrazení nového za první starý v řádku napiš :s/staré/nové
+ Pro nahrazení nového za všechny staré v řádku napiš :s/staré/nové/g
+ Pro nahrazení řetězců mezi dvěmi řádkami # napiš :#,#s/staré/nové/g
+ Pro nahrazení všech výskytů v souboru napiš :%s/staré/nové/g
+ Pro potvrzení každého nahrazení přidej 'c' :%s/staré/nové/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.1: JAK VYKONAT VNĚJŠÍ PŘÍKAZ
+
+
+ ** Napiš :! následované vnějším příkazem pro spuštění příkazu. **
+
+ 1. Napiš obvyklý příkaz : , který umístí kurzor na spodek obrazovky
+ To umožní napsat příkaz.
+
+ 2. Nyní stiskni ! (vykřičník). To umožní vykonat jakýkoliv vnější
+ příkaz z příkazového řádku.
+
+ 3. Například napiš ls za ! a stiskni <ENTER>. Tento příkaz zobrazí
+ obsah tvého adresáře jako v příkazovém řádku.
+ Vyzkoušej :!dir pokud ls nefunguje.
+
+Poznámka: Takto je možné vykonat jakýkoliv příkaz.
+
+Poznámka: Všechny příkazy : musí být dokončené stisknutím <ENTER>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.2: VÍCE O UKLÁDÁNÍ SOUBORŮ
+
+
+ ** Pro uložení změn v souboru napiš :w SOUBOR. **
+
+ 1. Napiš :!dir nebo :!ls pro výpis aktuálního adresáře.
+ Už víš, že za tímto musíš stisknout <ENTER>.
+
+ 2. Vyber si název souboru, který ještě neexistuje, například TEST.
+
+ 3. Nyní napiš: :w TEST (kde TEST je vybraný název souboru.)
+
+ 4. To uloží celý soubor (Výuka Vimu) pod názvem TEST.
+ Pro ověření napiš znovu :!dir , čímž zobrazíš obsah adresáře.
+
+Poznámka: Jakmile ukončíš Vim a znovu ho spustíš s názvem souboru TEST,
+ soubor bude přesná kopie výuky, když si ji ukládal.
+
+ 5. Nyní odstraň soubor napsáním (MS-DOS): :!del TEST
+ nebo (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.3: VÝBĚROVÝ PŘÍKAZ ULOŽENÍ
+
+
+ ** Pro uložení části souboru napiš :#,# w SOUBOR **
+
+ 1. Ještě jednou napiš :!dir nebo :!ls pro výpis aktuálního adresáře
+ a vyber vhodný název souboru jako např. TEST.
+
+ 2. Přesuň kurzor na vrch této stránky a stiskni Ctrl-g pro zobrazení
+ čísla řádku. ZAPAMATUJ SI TOTO ČÍSLO!
+
+ 3. Nyní se přesuň na spodek této stránky a opět stiskni Ctrl-g.
+ ZAPAMATUJ SI I ČÍSLO TOHOTO ŘÁDKU!
+
+ 4. Pro uložení POUZE části souboru, napiš :#,# w TEST kde #,# jsou
+ čísla dvou zapamatovaných řádků (vrch, spodek) a TEST je název souboru.
+
+ 5. Znova se ujisti, že tam ten soubor je pomocí :!dir ale NEODSTRAŇUJ ho.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 5.4: SLUČOVÁNÍ SOUBORŮ
+
+
+ ** K vložení obsahu souboru napiš :r NÁZEV_SOUBORU **
+
+ 1. Napiš :!dir pro ujištění, že soubor TEST stále existuje.
+
+ 2. Přesuň kurzor na vrch této stránky.
+
+POZNÁMKA: Po vykonání kroku 3 uvidíš lekci 5.3. Potom se opět přesuň dolů
+ na tuto lekci.
+
+ 3. Nyní vlož soubor TEST použitím příkazu :r TEST kde TEST je název
+ souboru.
+
+POZNÁMKA: Soubor, který vkládáš se vloží od místa, kde se nachází kurzor.
+
+ 4. Pro potvrzení vložení souboru, přesuň kurzor zpět a všimni si, že teď
+ máš dvě kopie lekce 5.3, originál a souborovou verzi.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRNUTÍ LEKCE 5
+
+
+ 1. :!příkaz vykoná vnější příkaz.
+
+ Některé užitečné příklady jsou:
+ (MS-DOS) (Unix)
+ :!dir :!ls - zobrazí obsah souboru.
+ :!del SOUBOR :!rm SOUBOR - odstraní SOUBOR.
+
+ 2. :w SOUBOR uloží aktuální text jako SOUBOR na disk.
+
+ 3. :#,#w SOUBOR uloží řádky od # do # do SOUBORU.
+
+ 4. :r SOUBOR vybere z disku SOUBOR a vloží ho do editovaného souboru
+ za pozici kurzoru.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.1: PŘÍKAZ OTEVŘÍT
+
+
+ ** Napiš o pro vložení řádku pod kurzor a přepnutí do Vkládacího módu. **
+
+ 1. Přemísti kurzor níže na řádek označený --->.
+
+ 2. Napiš o (malé) pro vložení řádku POD kurzor a přepnutí do
+ Vkládacího módu.
+
+ 3. Nyní zkopíruj řádek označený ---> a stiskni <ESC> pro ukončení
+ Vkládacího módu.
+
+---> Po stisknutí o se kurzor přemístí na vložený řádek do Vkládacího
+ módu.
+
+ 4. Pro otevření řádku NAD kurzorem jednoduše napiš velké O , místo
+ malého o. Vyzkoušej si to na následujícím řádku.
+Vlož řádek nad tímto napsáním Shift-O po umístění kurzoru na tento řádek.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.2: PŘÍKAZ PŘIDAT
+
+
+ ** Stiskni a pro vložení textu ZA kurzor. **
+
+ 1. Přesuň kurzor na níže na konec řádky označené --->
+ stisknutím $ v Normálním módu.
+
+ 2. Stiskni a (malé) pro přidání textu ZA znak, který je pod kurzorem.
+ (Velké A přidá na konec řádku.)
+
+Poznámka: Tímto se vyhneš stisknutí i , posledního znaku, textu na vložení,
+ <ESC>, kurzor doprava, a nakonec x na přidávání na konec řádku!
+
+ 3. Nyní dokončí první řádek. Všimni si, že přidávání je vlastně stejné jako
+ Vkládací mód, kromě místa, kam se text vkládá.
+
+---> Tento řádek ti umožňuje nacvičit
+---> Tento řádek ti umožňuje nacvičit přidávání textu na konec řádky.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.3: JINÝ ZPŮSOB NAHRAZOVÁNÍ
+
+
+ ** Napiš velké R pro nahrazení víc než jednoho znaku. **
+
+ 1. Přesuň kurzor na první řádek označený --->.
+
+ 2. Umísti kurzor na začátek prvního slova, které je odlišné od druhého
+ řádku označeného ---> (slovo 'poslední').
+
+ 3. Nyní stiskni R a nahraď zbytek textu na prvním řádku přepsáním
+ starého textu tak, aby byl první řádek stejný jako ten druhý.
+
+---> Pro upravení prvního řádku do tvaru toho poslední na straně použij kl.
+---> Pro upravení prvního řádku do tvaru toho druhého, napiš R a nový text.
+
+ 4. Všimni si, že jakmile stiskneš <ESC> všechen nezměněný text zůstává.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekce 6.4: NASTAVENÍ MOŽNOSTÍ
+
+ ** Nastav možnost, že vyhledávání anebo nahrazování nedbá velikosti písmen **
+
+ 1. Vyhledej řetězec 'ignore' napsáním:
+ /ignore
+ Zopakuj několikrát stisknutí klávesy n.
+
+ 2. Nastav možnost 'ic' (Ignore case) napsáním příkazu:
+ :set ic
+
+ 3. Nyní znovu vyhledej 'ignore' stisknutím: n
+ Několikrát hledání zopakuj stisknutím klávesy n.
+
+ 4. Nastav možnosti 'hlsearch' a 'incsearch':
+ :set hls is
+
+ 5. Nyní znovu vykonej vyhledávací příkaz a sleduj, co se stane:
+ /ignore
+
+ 6. Pro vypnutí zvýrazňování výsledků napiš:
+ :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SHRHNUTÍ LEKCE 6
+
+
+ 1. Stisknutí o otevře nový řádek POD kurzorem a umístí kurzor na vložený
+ řádek do Vkládacího módu.
+ Napsání velkého O otevře řádek NAD řádkem, na kterém je kurzor.
+
+ 2. Stiskni a pro vložení textu ZA znak na pozici kurzoru.
+ Napsání velkého A automaticky přidá text na konec řádku.
+
+ 3. Stisknutí velkého R přepne do Nahrazovacího módu, dokud
+ nestiskneš <ESC> pro jeho ukončení.
+
+ 4. Napsání ":set xxx" nastaví možnosti "xxx".
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCE 7: PŘÍKAZY ON-LINE NÁPOVĚDY
+
+
+ ** Používej on-line systém nápovědy **
+
+ Vim má obsáhlý on-line systém nápovědy. Pro začátek vyzkoušej jeden z
+ následujících:
+ - stiskni klávesu <HELP> (pokud ji máš)
+ - stiskni klávesu <F1> (pokud ji máš)
+ - napiš :help <ENTER>
+
+ Napiš :q <ENTER> pro uzavření okna nápovědy.
+
+ Můžeš najít nápovědu k jakémukoliv tématu přidáním argumentu k
+ příkazu ":help". Zkus tyto (nezapomeň stisknout <ENTER>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCE 8: VYTVOŘENÍ INICIALIZAČNÍHO SKRIPTU
+
+ ** Zapni funkce editoru Vim **
+
+ Vim má daleko více funkcí než Vi, ale většina z nich je vypnuta ve výchozím
+ nastavení. Pro zapnutí některých vytvoř soubor "vimrc".
+
+ 1. Začni upravovat soubor "vimrc". Toto závisí na použitém systému:
+ :edit ~/.vimrc pro Unix
+ :edit ~/_vimrc pro MS-Windows
+
+ 2. Nyní čti ukázkový "vimrc" soubor:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Ulož soubor pomocí:
+
+ :write
+
+ Po příštím startu Vim se zapne zvýrazňování syntaxe.
+ Do souboru "vimrc" můžeš přidat všechny svoje upřednostňované nastavení.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Toto ukončuje výuku Vim, která byla myšlená jako stručný přehled
+ editoru Vim, tak akorát postačující pro lehké a obstojné používání editoru.
+ Tato výuka má daleko od úplnosti, protože Vim obsahuje podstatně více
+ příkazů. Dále si přečti uživatelský manuál: ":help user-manual".
+
+ Pro další studium je doporučená kniha:
+ Vim - Vi Improved - od Steve Oualline
+ Nakladatel: New Riders
+ První kniha určená pro Vim. Obzvláště vhodná pro začátečníky.
+ Obsahuje množství příkladů a obrázků.
+ viz https://iccf-holland.org/click5.html
+
+ Tato kniha je starší a více věnovaná Vi než Vim, ale také doporučená:
+ Learning the Vi Editor - od Linda Lamb
+ Nakladatel: O'Reilly & Associates Inc.
+ Je to dobrá kniha pro získání vědomostí téměř o všem, co můžete s Vi dělat.
+ Šesté vydání obsahuje též informace o Vim.
+
+ Tato výuka byla napsaná autory Michael C. Pierce a Robert K. Ware,
+ Colorado School of Mines s použitím myšlenek od: Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Upravil pro Vim: Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Překlad do češtiny: Luboš Turek
+ E-Mail: lubos.turek@gmail.com
+ 2007 Feb 28
diff --git a/runtime/tutor/tutor.da b/runtime/tutor/tutor.da
new file mode 100644
index 0000000..ba62fce
--- /dev/null
+++ b/runtime/tutor/tutor.da
@@ -0,0 +1,972 @@
+===============================================================================
+= V e l k o m m e n t i l V I M - v e j l e d n i n g e n - Version 1.7 =
+===============================================================================
+
+ Vim er en meget kraftfuld editor med mange kommandoer, for mange til
+ at forklare i en vejledning som denne. Vejledningen er designet til at
+ beskrive nok af kommandoerne til at du vil vre i stand til let at bruge
+ Vim som en alsidig editor.
+
+ Det tager cirka 25-30 minutter at fuldfre vejledningen,
+ afhngig af hvor meget tid der bruges p at eksperimentere.
+
+ VR OPMRKSOM P AT:
+ Kommandoerne i lektionerne ndre teksten. Opret en kopi af filen
+ til at ve p (hvis du startede "vimtutor", s er det allerede en kopi).
+
+ Det er vigtigt at huske p at vejledningen er sat op til at lre ved at
+ bruge. Det betyder at du skal udfre kommandoerne for at lre at bruge
+ dem ordentligt. Lser du kun teksten, s glemmer du kommandoerne!
+
+ Srg for at din Caps-Lock-tast IKKE er aktiveret og tryk
+ p j-tasten nok gange til at flytte markren s lektion 1.1
+ fylder hele skrmen.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.1: FLYT MARKREN
+
+
+ ** Tryk p h-,j-,k-,l-tasterne som vist, for at flytte markren. **
+ ^
+ k Fif: H-tasten er til venstre og flytter til venstre.
+ < h l > L-tasten er til hjre og flytter til hjre.
+ j J-tasten ligner en ned-pil.
+ v
+ 1. Flyt markren rundt p skrmen indtil du er fortrolig med det.
+
+ 2. Hold ned-tasten (j) nede, indtil den gentager.
+ Nu ved du hvordan du flytter til den nste lektion.
+
+ 3. Brug ned-tasten til at flytte til lektion 1.2.
+
+BEMRK: Hvis du nogensinde bliver i tvivl om noget du skrev, s tryk p <ESC>
+ for at stille dig i normal tilstand. Skriv s kommandoen igen.
+
+BEMRK: Piletasterne br ogs virke. Men med hjkl kan du flytte rundt
+ meget hurtigere, nr du har vnnet dig til det. Serist!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.2: AFSLUT VIM
+
+
+ !! BEMRK: Ls hele lektionen, inden trinnene nedenfor udfres!!
+
+ 1. Tryk p <ESC>-tasten (for at vre sikker p, at du er i normal tilstand).
+
+ 2. Skriv: :q! <ENTER>.
+ Det afslutter editoren, hvorved ndringer som du har foretaget forkastes.
+
+ 3. Vend tilbage hertil ved at udfre kommandoen som fik dig ind i
+ vejledningen. Det var muligvis: vimtutor <ENTER>
+
+ 4. Hvis du har lrt trinnene udenad og er klar, s udfr trin
+ 1 til 3 for at afslutte og komme ind i editoren igen.
+
+BEMRK: :q! <ENTER> forkaster ndringer som du har foretaget. Om f lektioner
+ vil du lre at gemme ndringerne til en fil.
+
+ 5. Flyt markren ned til lektion 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.3: TEKSTREDIGERING - SLET
+
+
+ ** Tryk p x for at slette tegnet som markren er ovenp. **
+
+ 1. Flyt markren ned til linjen med --->.
+
+ 2. Ret fejlene ved at flytte markren indtil den er ovenp
+ tegnet som skal slettes.
+
+ 3. Tryk p x-tasten for at slette det unskede tegn.
+
+ 4. Gentag trin 2 til 4 indtil stningen er korrekt.
+
+---> Kkoen sprangg ovverr mnen.
+
+ 5. G videre til lektion 1.4, nu hvor linjen er korrekt.
+
+BEMRK: Efterhnden som du gennemgr vejledningen, s lr det ikke udenad,
+ lr det ved at gre det.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.4: TEKSTREDIGERING - INDST
+
+
+ ** Tryk p i for at indstte tekst. **
+
+ 1. Flyt markren ned til den frste linje med --->.
+
+ 2. For at gre den frste linje magen til den anden, skal markren flyttes
+ ovenp det frst tegn EFTER der hvor teksten skal indsttes.
+
+ 3. Tryk p i og skriv de ndvendige tilfjelser.
+
+ 4. Efterhnden som hver fejl rettes, s tryk p <ESC> for at vende tilbage
+ til normal tilstand. Gentag trin 2 til 4 for at rette stningen.
+
+---> Der mangler tekst dene .
+---> Der mangler noget tekst p denne linje.
+
+ 5. Nr du fortrolig med at indstte tekst, s flyt til lektion 1.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.5: TEKSTREDIGERING - VEDHFT
+
+
+ ** Tryk p A for at vedhfte tekst. **
+
+ 1. Flyt markren ned til den frste linje med --->.
+ Det er lige meget hvilket tegn markren er p, p linjen.
+
+ 2. Tryk p A og skriv de ndvendige tilfjelser.
+
+ 3. Tryk p <ESC> nr teksten er blevet vedhftet for at vende tilbage til normal tilstand.
+
+ 4. Flyt markren til den anden linje med ---> og gentag
+ trin 2 og 3 for at rette stningen.
+
+---> Der mangler noget tekst p den
+ Der mangler noget tekst p denne linje.
+---> Der mangler ogs noget tek
+ Der mangler ogs noget tekst her.
+
+ 5. Nr du er fortrolig med at vedhfte tekst, s flyt til lektion 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.6: REDIGER EN FIL
+
+ ** Brug :wq til at gemme en fil og afslutte. **
+
+ !! BEMRK: Ls hele lektionen, inden trinnene nedenfor udfres!!
+
+ 1. Afslut vejledningen som du gjorde i lektion 1.2: :q!
+ Eller gr flgende i en anden terminal, hvis du har adgang til en.
+
+ 2. Skriv denne kommando i skalprompten: vim tutor <ENTER>
+ 'vim' er kommandoen til at starte Vim-editoren, 'tutor' er navnet p
+ filen som du vil redigere. Brug en fil som kan ndres.
+
+ 3. Indst og slet tekst, som du lrte vi de forrige lektioner.
+
+ 4. Gem filen med ndringer og afslut Vim med: :wq <ENTER>
+
+ 5. Hvis du afsluttede vimtutor i trin 1, s genstart vimtutor og flyt ned
+ til flgende opsummering.
+
+ 6. Udfr trinnene ovenfor, nr du har lst og forstet dem.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1 OPSUMMERING
+
+
+ 1. Markren flyttes enten med piletasterne eller hjkl-tasterne.
+ h (venstre) j (ned) k (op) l (hjre)
+
+ 2. Vim startes fra skalprompten, ved at skrive: vim FILNAVN <ENTER>
+
+ 3. Vim afsluttes, ved at skrive: <ESC> :q! <ENTER> for at forkaste alle ndringer.
+ ELLER, ved at skrive: <ESC> :wq <ENTER> for at gemme ndringerne.
+
+ 4. Slet tegn ved markren, ved at skrive: x
+
+ 5. Indst eller vedhft tekst, ved at skrive:
+ i skriv indsat tekst <ESC> indst inden markren
+ A skriv vedhftet tekst <ESC> vedhft efter linjen
+
+BEMRK: Nr der trykkes p <ESC>, s stilles du i normal tilstand eller ogs
+ annulleres en unsket og delvist fuldfrt kommando.
+
+Fortst nu med lektion 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.1: SLETTEKOMMANDOER
+
+
+ ** Skriv dw for at slette et ord. **
+
+ 1. Tryk p <ESC> for at vre sikker p, at du er i normal tilstand.
+
+ 2. Flyt markren ned til linjen med --->.
+
+ 3. Flyt markren til begyndelsen af et ord som skal slettes.
+
+ 4. Skriv dw for at f ordet til at forsvinde.
+
+ BEMRK: Bogstavet d vises p den sidste linje p den skrm du skrev
+ det p. Vim venter p at du skriver w . Hvis du ser et andet tegn
+ end d , s skrev du forkert; tryk p <ESC> og start forfra.
+
+---> Der er regnorm nogle ord som sjovt ikke hrer til papir i stningen.
+
+ 5. Gentag trin 3 og 4 indtil stningen er korrekt og g til lektion 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.2: FLERE SLETTEKOMMANDOER
+
+
+ ** Skriv d$ for at slette til slutningen af linjen. **
+
+ 1. Tryk p <ESC> for at vre sikker p, at du er i normal tilstand.
+
+ 2. Flyt markren ned til linjen med --->.
+
+ 3. Flyt markren til slutningen af den rette linje (EFTER det frste . ).
+
+ 4. Skriv d$ for at slette til slutningen af linjen.
+
+---> Nogen skrev slutningen af linjen to gange. slutningen af linjen to gange.
+
+
+ 5. Flyt videre til lektion 2.3 for at forst hvad der sker.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.3: OM OPERATORER OG BEVGELSER
+
+
+ Mange kommandoer som ndre tekst skabes fra en operator og en bevgelse.
+ Formatet til en slettekommando med sletteoperatoren d er som flger:
+
+ d bevgelse
+
+ Hvor:
+ d - er sletteoperatoren.
+ bevgelse - er hvad operatoren skal arbejde p (oplistet nedenfor).
+
+ En kort liste over bevgelser:
+ w - indtil begyndelsen af det nste ord, EKSKLUSIV dets frste tegn.
+ e - til slutningen af det nuvrende ord, INKLUSIV det sidste tegn.
+ $ - til slutningen af linjen, INKLUSIV det sidste tegn.
+
+ S nr der skrives de s slettes der fra markren til slutningen af ordet.
+
+BEMRK: Nr kun bevgelsen trykkes i normal tilstand, uden en operator,
+ s flyttes markren som angivet.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.4: BRUG TLLER TIL EN BEVGELSE
+
+
+ ** Nr der skrives et nummer inden en bevgelse, s gentages den det antal gange. **
+
+ 1. Flyt markren ned til begyndelsen af linjen med --->.
+
+ 2. Skriv 2w for at flytte markren fremad to ord.
+
+ 3. Skriv 3e for at flytte markren fremad til slutningen af det tredje ord.
+
+ 4. Skriv 0 (nul) for at flytte til begyndelsen af linjen.
+
+ 5. Gentag trin 2 og 3 med forskellige numre.
+
+---> Dette er blot en linje med ord som du kan flytte rundt i.
+
+ 6. Flyt videre til lektion 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.5: BRUG TLLER TIL AT SLETTE FLERE
+
+
+ ** Nr der skrives et nummer med en operator, s gentages den det antal gange. **
+
+ I kombinationen med sletteoperatoren og en bevgelse nvnt ovenfor kan du
+ indstte en tller inden bevgelsen for at slette flere:
+ d nummer bevgelse
+
+ 1. Flyt markren til det frste ord MED STORT p linjen med --->.
+
+ 2. Skriv d2w for at slette de to ord MED STORT
+
+ 3. Gentag trin 1 og 2 med en anden tller for at slette de efterflgende
+ ord MED STORT med n kommando
+
+---> denne ABC DE linje FGHI JK LMN OP med ord er Q RS TUV renset.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.6: ARBEJD P LINJER
+
+
+ ** Skriv dd for at slette en hel linje. **
+
+ Pga. at sletning af linjer bruges s ofte, s besluttede designerne af Vi
+ at det ville vre lettere bare at skrive to d'er for at slette en linje.
+
+ 1. Flyt markren til den anden linje i frasen nedenfor.
+ 2. Skriv dd for at slette linjen.
+ 3. Flyt nu til den fjerde linje.
+ 4. Skriv 2dd for at slette to linjer.
+
+---> 1) Roser er rde,
+---> 2) Mudder er sjovt,
+---> 3) Violer er bl,
+---> 4) Jeg har en scooter,
+---> 5) Ure viser tiden,
+---> 6) Sukker er sdt
+---> 7) Og du er lige s.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.7: FORTRYD-KOMMANDOEN
+
+
+ ** Tryk p u for at fortryde de sidste kommandoer, U for at rette en hel linje. **
+
+ 1. Flyt markren ned til linjen med ---> og placer den p
+ den frste fejl.
+ 2. Skriv x for at slette det frste unskede tegn.
+ 3. Skriv nu u for at fortryde den sidste kommando der blev udfrt.
+ 4. Ret denne gang alle fejlene p linjen med x-kommadoen.
+ 5. Skriv nu et stort U for at f linjen tilbage til dens oprindelige tilstand.
+ 6. Skriv nu u nogle f gange for at fortryde U'et og forudgende kommandoer.
+ 7. Skriv nu CTRL-R (hold CTRL-tasten nede mens der trykkes p R) nogle f gange
+ for at omgre kommandoerne (fortryd fortrydelserne).
+
+---> Rett fejlene pp liinjen og errstat dem meed fortryd.
+
+ 8. Det er meget nyttige kommandoer. Flyt nu til lektion 2 opsummering.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2 OPSUMMERING
+
+
+ 1. Slet fra markren op til det nste ord, ved at skrive: dw
+ 2. Slet fra markren til slutningen af en linje, ved at skrive: d$
+ 3. Slet en hel linje, ved at skrive: dd
+
+ 4. Gentag en bevgelse ved at vedhfte et nummer i begyndelsen: 2w
+ 5. Formatet til en ndr-kommando er:
+ operator [nummer] bevgelse
+ hvor:
+ operator - er hvad der skal gres, ssom d for at slette
+ [nummer] - er en valgfri tller til at gentage bevgelsen
+ bevgelse - flytter over teksten som der skal arbejde p, ssom w (ord),
+ $ (til slutningen af linjen), osv.
+
+ 6. Flyt til begyndelsen af linjen med et nul: 0
+
+ 7. Fortryd tidligere handlinger, ved at skrive: u (lille u)
+ Fortryd alle ndringerne p en linje, ved at skrive: U (stort U)
+ Fortryd fortrydelserne, ved at skrive: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.1: PUT-INDSTTE-KOMMANDOEN
+
+
+ ** Skriv p for at put-indstte tidligere slettede tekst efter markren. **
+
+ 1. Flyt markren ned til den frste linje med --->.
+
+ 2. Skriv dd for at slette linjen og gemme den i et Vim-register.
+
+ 3. Flyt markren til c)-linjen, OVER hvor den slettede linje skal vre.
+
+ 4. Skriv p for at put-indstte linjen nedenunder markren.
+
+ 5. Gentag trin 2 til 4 for at put-indstte alle linjerne i den rigtige rkkeflge.
+
+---> d) Kan du lre lige s?
+---> b) Violer er bl,
+---> c) Intelligens skal lres,
+---> a) Roser er rde,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.2: ERSTAT-KOMMANDOEN
+
+
+ ** Skriv rx for at erstatte tegnet ved markren med x . **
+
+ 1. Flyt markren ned til den frste linje med --->.
+
+ 2. Flyt markren s den er ovenp den frste fejl.
+
+ 3. Skriv r og s tegnet som skal vre der.
+
+ 4. Gentag trin 2 og 3 indtil den frste linje er magen til den anden.
+
+---> Def var nohen der trukkede p de forkerge taster, da linjem blev skrevet!
+---> Der var nogen der trykkede p de forkerte taster, da linjen blev skrevet!
+
+ 5. Flyt nu videre til lektion 3.3.
+
+BEMRK: Husk p at du skal lre ved at gre det, ikke ved at lre det udenad.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.3: NDRINGSOPERATOREN
+
+
+ ** ndr indtil slutningen af et ord, ved at skrive ce . **
+
+ 1. Flyt markren ned til den frste linje med --->.
+
+ 2. Placer markren p k'et i likibj.
+
+ 3. Skriv ce og det korrekte ord (i dette tilflde skrives njen ).
+
+ 4. Tryk p <ESC> og flyt til det nste tegn der skal ndres.
+
+ 5. Gentag trin 3 og 4 indtil den frste stning er magen til den anden.
+
+---> Likibj har nogle f ndo som vnes ndres vrf ndringsoperatoren.
+---> Linjen har nogle f ord som skal ndres med ndringsoperatoren.
+
+Bemrk at ce sletter ordet og stiller dig i indst-tilstand.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.4: FLERE NDRINGER MED c
+
+
+ ** NDRINGSOPERATOREN bruges med de samme bevgelser som slet. **
+
+ 1. ndringsoperatoren virker p samme mde som slet. Formatet er:
+
+ c [nummer] bevgelse
+
+ 2. Bevgelserne er de samme, ssom w (ord) og $ (slutningen af linjen).
+
+ 3. Flyt ned til den frste linje med --->.
+
+ 4. Flyt markren til den frste fejl.
+
+ 5. Skriv c$ og skriv resten af linjen som den anden linje og tryk p <ESC>.
+
+---> Slutningen af linjen har brug for lidt hjlp til at blive ligesom den anden.
+---> Slutningen af linjen skal rettes med c$-kommandoen.
+
+BEMRK: Du kan bruge backspace-tasten til at rette fejl nr du skriver.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3 OPSUMMERING
+
+
+ 1. Put-indst tekst tilbage som lige er blevet slettet, ved at skrive p .
+ Det put-indstter den slettede tekst EFTER markren (hvis en linje blev
+ slettet, s vil den vre p linjen nedenunder markren).
+
+ 2. Erstat tegnet under markren, ved at skrive r og s
+ tegnet som du vil have der.
+
+ 3. ndringsoperatoren giver dig mulighed for at ndre fra markren til hvor
+ bevgelsen tager dig hen. Skriv f.eks. ce for at ndre fra markren til
+ slutningen af ordet, c$ for at ndre til slutningen af en linjen.
+
+ 4. Formatet til at ndre er:
+
+ c [nummer] bevgelse
+
+G nu videre til den nste lektion.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.1: MARKRPLACERING OG FILSTATUS
+
+ ** Skriv CTRL-G for at vise din placering i filen og filstatussen.
+ Skriv G for at flytte til en linje i filen. **
+
+ BEMRK: Ls hele lektionen, inden trinnene udfres!!
+
+ 1. Hold Ctrl-tasten nede og tryk p g . Vi kalder det CTRL-G.
+ Der vises en meddelelse nederst p siden med filnavnet og
+ placeringen i filen. Husk linjenummeret til trin 3.
+
+BEMRK: Du ser muligvis markrplaceringen nederst i hjre hjrne af skrmen.
+ Det sker nr 'ruler'-valgmuligheden er sat (se :help 'ruler' )
+
+ 2. Tryk p G for at flytte dig nederst i filen.
+ Skriv gg for at flytte dig verst i filen.
+
+ 3. Skriv nummeret p den linje du var p, og s G . Det
+ returnerer dig til den linje du var p da du frste trykkede p CTRL-G.
+
+ 4. Hvis du fler dig klar til at gre det, s udfre trin 1 til 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.2: SG-KOMMANDOEN
+
+
+ ** Skriv / efterfulgt af en frase for at sge efter frasen. **
+
+ 1. I normal tilstand, skriv /-tegnet . Bemrk at det og markren
+ vises i bunden af skrmen som med :-kommandoen .
+
+ 2. Skriv nu 'feeejjl' <ENTER>. Det er ordet du vil sge efter.
+
+ 3. Sg efter den samme frase igen, ved blot at skrive n .
+ Sg efter den samme frase i den anden retning, ved at skrive N .
+
+ 4. Sg efter en frase i den modsatte retning, ved at bruge ? i stedet for / .
+
+ 5. G tilbage hvor du kom fra, ved at trykke p CTRL-O (Hold Ctrl nede mens
+ der trykkes p bogstavet o). Gentag for at g lngere tilbage. CTRL-I gr fremad.
+
+---> "feeejjl" er den forkerte mde at stave til fejl; feeejjl er en fejl.
+BEMRK: Nr sgningen nr slutningen af filen, s fortstter den ved
+ begyndelsen, men mindre 'wrapscan'-valgmuligheden er blevet slet fra.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.3: SG EFTER MODSVARENDE PARENTESER
+
+
+ ** Skriv % for at finde en modsvarende ),], eller } . **
+
+ 1. Placer markren p (, [, eller { p linjen nedenfor med --->.
+
+ 2. Skriv nu %-tegnet .
+
+ 3. Markren flytter til den modsvarende parentes eller klamme.
+
+ 4. Skriv % for at flytte markren til den anden modsvarende klamme.
+
+ 5. Flyt markren til en anden (,),[,],{ eller } og se hvad % gr.
+
+---> Dette ( er en testlinje med ('er, ['er ] og {'er }. ))
+
+
+BEMRK: Det er meget nyttigt ved fejlretning af et program som mangler
+ modsvarende parenteser!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.4: UDSKIFT-KOMMANDOEN
+
+
+ ** Skriv :s/gammel/ny/g for at udskifte 'gammel' med 'ny'. **
+
+ 1. Flyt markren ned til linjen med --->.
+
+ 2. Skriv :s/dett/det <ENTER> . Bemrk at kommandoen kun ndre den
+ frste forekomst af "dett" p linjen.
+
+ 3. Skriv nu :s/dett/det/g . Nr g-flaget tilfjes, s udskiftes der
+ globalt p linjen, alts ndre alle forekomster af "dett" p linjen.
+
+---> dett siges at dett er bedst at se p blomster nr dett er forr.
+
+ 4. ndr hver forekomst af en tegnstreng mellem to linjer,
+ ved at skrive :#,#s/gammel/ny/g hvor #,# er linjenumrene over omrdet
+ af linjer hvor udskiftningen skal ske.
+ Skriv :%s/gammel/ny/g for at ndre hver forekomst i hele filen.
+ Skriv :%s/gammel/ny/gc for at finde hver forekomst i hele filen,
+ med en prompt om hvorvidt der skal udskiftes eller ej.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4 OPSUMMERING
+
+
+ 1. CTRL-G viser din placering i filen og filstatussen.
+ G flytter til slutningen af filen.
+ nummer G flytter til linjenummeret.
+ gg flytter til den frste linje.
+
+ 2. Nr der skrives / efterfulgt af en frase, s sges der FREMAD efter frasen.
+ Nr der skrives ? efterfulgt af en frase, s sges der BAGLNS efter frasen.
+ Skriv n efter en sgning, for at finde den nste forekomst i den samme retning,
+ eller N for at sge i den modsatte retning.
+ CTRL-O tager dig tilbage til ldre placeringer, CTRL-I til nyere placeringer.
+
+ 3. Nr der skrives % mens markren er p et (,),[,],{, eller }, s gr den til dens match.
+
+ 4. Udskift den frste frste gammel med ny p en linje, ved at skrive :s/gammel/ny
+ Udskift alle gammel med ny p en linje, ved at skrive :s/gammel/ny/g
+ Udskift fraser mellem to linenumre, ved at skrive :#,#s/gammel/ny/g
+ Udskift alle forekomster i filen, ved at skrive :%s/gammel/ny/g
+ Sprg om bekrftelse hver gang, ved at tilfje 'c' :%s/gammel/ny/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.1: UDFR EN EKSTERN KOMMANDO
+
+
+ ** Skriv :! efterfulgt af en ekstern kommando, for at udfre kommandoen. **
+
+ 1. Skriv den velkendte kommando : for at stte markren nederst p
+ skrmen. Det giver dig mulighed for at indtaste en kommandolinjekommando.
+
+ 2. Skriv nu !-tegnet (udrbstegn). Det giver dig mulighed
+ for at udfre enhver ekstern skalkommando.
+
+ 3. Skriv f.eks. ls efter ! og tryk s p <ENTER>. Det
+ viser dig en liste over din mappe, ligesom hvis du var ved
+ skalprompten. Eller brug :!dir hvis ikke ls virker.
+
+BEMRK: Det er muligt at udfre enhver ekstern kommando p denne mde,
+ ogs med argumenter.
+
+BEMRK: Alle :-kommandoer skal afsluttes ved at trykke p <ENTER>.
+ Vi nvner det ikke altid herefter.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.2: MERE OM AT SKRIVE FILER
+
+
+ ** Gem ndringerne som er foretaget til teksten, ved at skrive :w FILNAVN. **
+
+ 1. Skriv :!dir eller :!ls for at f en liste over din mappe.
+ Du ved allerede at du skal trykke p <ENTER> bagefter.
+
+ 2. Vlg et filnavn som ikke findes endnu, ssom TEST.
+
+ 3. Skriv nu: :w TEST (hvor TEST er filnavnet som du vlger.)
+
+ 4. Det gemmer hele filen (Vim-vejledningen) under navnet TEST.
+ Bekrft det, ved igen at skrive :!dir eller :!ls for at se din mappe.
+
+BEMRK: Hvis du afslutter Vim og starter den igen med vim TEST , s vil
+ filen vre en njagtig kopi af vejledningen da du gemte den.
+
+ 5. Fjern nu filen, ved at skrive (MS-DOS): :!del TEST
+ eller (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.3: MARKR TEKST SOM SKAL SKRIVES
+
+
+ ** Gem en del af en fil, ved at skrive v bevgelse :w FILNAVN **
+
+ 1. Flyt markren til denne linje.
+
+ 2. Tryk p v og flyt markren til the femte punkt nedenfor. Bemrk at
+ teksten er fremhvet.
+
+ 3. Tryk p :-tegnet . Nederst p skrmen vises :'<,'>.
+
+ 4. Skriv w TEST , hvor TEST er filnavnet som endnu ikke findes. Bekrft
+ at du ser :'<,'>w TEST inden du trykker p <ENTER>.
+
+ 5. Vim skriver de markerede linjer til filen TEST. Brug :!dir eller :!ls
+ for at se den. Fjern den ikke endnu! Vi bruger den i den nste lektion.
+
+BEMRK: Nr der trykkes p v startes visuel markering. Du kan flytte markren
+ rundt for at gre markeringen strre eller mindre. Du kan s bruge en
+ operator til at gre noget med teksten. F.eks. vil d slette teksten.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.4: INDHENT OG SAMMENLG FILER
+
+
+ ** Indst indholdet af en fil, ved at skrive :r FILNAVN **
+
+ 1. Placer markren lige ovenover denne linje.
+
+BEMRK: Nr trin 2 er udfrt vil du se teksten fra lektion 5.3. Flyt s
+ NED for at se denne lektion igen.
+
+ 2. Indhent nu din TEST-fil med kommandoen :r TEST , hvor TEST er
+ navnet p filen som du brugte.
+ Filen som du indhenter placeres under markrens linje.
+
+ 3. Bekrft at en fil blev indhentet, ved at flytte markren tilbage og bemrk
+ at der nu er to kopier af lektion 5.3, den originale og filversionen.
+
+BEMRK: Du kan ogs lse outputtet fra en ekstern kommando. F.eks. lser
+ :r !ls outputtet fra ls-kommandoen og indstter det under
+ markren.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5 OPSUMMERING
+
+
+ 1. :!kommando udfrer en ekstern kommando.
+
+ Nogle nyttige eksempler er:
+ (MS-DOS) (Unix)
+ :!dir :!ls - viser en liste over mapper.
+ :!del FILNAVN :!rm FILNAVN - fjerner filen FILNAVN.
+
+ 2. :w FILNAVN skriver den nuvrende Vim-fil til disken med navnet FILNAVN.
+
+ 3. v bevgelse :w FILNAVN gemmer de visuelt markerede linjer i filen
+ FILNAVN.
+
+ 4. :r FILNAVN indhenter diskfilen FILNAVN og indstter den under
+ markrens placering.
+
+ 5. :r !dir lser outputtet fra dir-kommandoen og indstter det under
+ markrens placering.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.1: BN-KOMMANDOEN
+
+
+ ** Skriv o for at bne en linje under markren og stille dig i indst-tilstand. **
+
+ 1. Flyt markren ned til linjen med --->.
+
+ 2. Skriv bogstavet o med smt, for at bne en linje UNDER markren og stille
+ dig i indst-tilstand.
+
+ 3. Skriv nu noget tekst og tryk p <ESC> for at afslutte indst-tilstand.
+
+---> Efter o er blevet skrevet, placeres markren p den bne linje i indst-tilstand.
+
+ 4. Skriv blot et stort O , i stedet for et lille o , for at
+ bne en linje OVENOVER markren. Prv det p linjen nedenfor.
+
+---> bn en line ovenover denne, ved at skrive O mens markren er p denne linje.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.2: VEDHFT-KOMMANDOEN
+
+
+ ** Skriv a for at indstte tekst EFTER markren. **
+
+ 1. Flyt markren ned til begyndelsen af linjen med --->.
+
+ 2. Tryk p e indtil markren er p slutningen af lin .
+
+ 3. Skriv et a (med smt) for at vedhfte tekst EFTER markren.
+
+ 4. Fuldfr ordet ligesom linjen under det. Tryk p <ESC> for at afslutte
+ indst-tilstand.
+
+ 5. Brug e til at flytte til det nste ufrdige ord og gentag trin 3 og 4.
+
+---> Lin giver dig mulighed for at v vedhftnin af tekst til en linje.
+---> Linjen giver dig mulighed for at ve vedhftning af tekst til en linje.
+
+BEMRK: a, i og A gr alle til den samme indst-tilstand,
+ den eneste forskel er hvor tegnene indsttes.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.3: AN ANDEN MDE AT ERSTATTE
+
+
+ ** Skriv et stort R for at erstatte flere end t tegn. **
+
+ 1. Flyt markren ned til den frste linje med --->. Flyt markren til
+ begyndelsen af den frste xxx .
+
+ 2. Tryk nu p R og skriv nummeret som er under det p den anden linje,
+ s det erstatter xxx .
+
+ 3. Tryk p <ESC> for at forlade erstat-tilstand. Bemrk at resten af linjen
+ forbliver undret.
+
+ 4. Gentag trinnene for at erstatte det sidste xxx.
+
+---> Nr 123 lgges sammen med xxx giver det xxx.
+---> Nr 123 lgges sammen med 456 giver det 579.
+
+BEMRK: Erstat-tilstand er ligesom indst-tilstand, men hvert indtastede
+ tegn sletter et eksisterende tegn.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.4: KOPER OG INDST TEKST
+
+
+ ** Brug y-operatoren til at kopiere tekst og p til at indstte den **
+
+ 1. G ned til linjen med ---> og placer markren efter "a)".
+
+ 2. Start visuel tilstand med v og flyt markren til lige inden "frste".
+
+ 3. Skriv y for at yank-udtrkke (kopiere) den fremhvede tekst.
+
+ 4. Flyt markren til slutningen af den nste linje: j$
+
+ 5. Skriv p for at put-indstte (indstte) teksten. Skriv s: a andet <ESC> .
+
+ 6. Brug visuel tilstand til at markere " punkt.", yank-udtrk med y , flyt
+ til slutningen af nste linje med j$ og put-indst teksten der med p .
+
+---> a) dette er det frste punkt.
+ b)
+
+ BEMRK: du kan ogs bruge y som en operator; yw yank-udtrkker et ord.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.5: ST VALGMULIGHED
+
+
+ ** St en valgmulighed s en sgning eller udskiftning ignorerer forskelle p store/sm bogstaver **
+
+ 1. Sg efter 'ignorer', ved at skrive: /ignorer <ENTER>
+ Gentag flere gange ved at trykke p n .
+
+ 2. St 'ic'-valgmuligheden (Ignorer forskelle p store/sm bogstaver), ved at skrive: :set ic
+
+ 3. Sg nu efter 'ignorer' igen, ved at trykke p n
+ Bemrk at Ignorer og IGNORER nu ogs bliver fundet.
+
+ 4. St 'hlsearch'- og 'incsearch'-valgmulighederne: :set hls is
+
+ 5. Skriv nu sg-kommandoen igen og se hvad der sker: /ignorer <ENTER>
+
+ 6. Deaktivr ignorering af forskelle p store/sm bogstaver, ved at skrive: :set noic
+
+BEMRK: Fjern fremhvningen af matches, ved at skrive: :nohlsearch
+BEMRK: Hvis du vil ignorere case for en enkelt sg-kommando, s brug \c
+ i frasen: /ignorer\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6 OPSUMMERING
+
+ 1. Skriv o for at bne en linje NEDENUNDER markren og starte indst-tilstand.
+ Skriv O for at bne en linje OVENOVER markren.
+
+ 2. Skriv a for at indstte tekst EFTER markren.
+ Skriv A for at indstte tekst efter slutningen af linjen.
+
+ 3. e-kommandoen flytter til slutningen af et ord.
+
+ 4. y-operatoren yank-udtrkker (kopierer) tekst, p put-indstter (indstter) den.
+
+ 5. Nr der skrives et stort R stilles du i erstat-tilstand indtil der trykkes p <ESC> .
+
+ 6. Nr der skrives ":set xxx", s sttes valgmuligheden "xxx". Nogle valgmuligheder er:
+ 'ic' 'ignorecase' ignorer forskelle p store/sm bogstaver nr der sges
+ 'is' 'incsearch' vis delvise match for en sgefrase
+ 'hls' 'hlsearch' fremhv alle fraser som matcher
+ Du kan enten bruge det lange eller korte valgmulighedsnavn.
+
+ 7. Vedhft "no" i begyndelsen, for at sl en valgmulighed fra: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.1: F HJLP
+
+
+ ** Brug online-hjlpesystemet **
+
+ Vim har et omfattende online-hjlpesystem. Prv en af disse tre,
+ for at komme i gang:
+ - tryk p <HELP>-tasten (hvis du har en)
+ - tryk p <F1>-tasten (hvis du har en)
+ - skriv :help <ENTER>
+
+ Ls teksten i hjlpevinduet for at finde ud af hvordan hjlpen virker.
+ Skriv CTRL-W CTRL-W for at hoppe fra et vindue til et andet.
+ Skriv :q <ENTER> for at lukke hjlpevinduet.
+
+ Du kan finde hjlp om nsten alle emner, ved at give et argument til
+ ":help"-kommandoen. Prv disse (husk at trykke p <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.2: OPRET ET OPSTARTS-SCRIPT
+
+
+ ** Aktivr Vim-funktionaliteter **
+
+ Vim har mange flere funktionaliteter end Vi, men de fleste er deaktiveret som
+ standard. For at bruge flere funktionaliteter skal du oprette en "vimrc"-fil.
+
+ 1. Begynd at redigere "vimrc"-filen. Det afhnger af dit system:
+ :e ~/.vimrc i Unix
+ :e ~/_vimrc i MS-Windows
+
+ 2. Ls nu indholdet af eksempel "vimrc"-filen:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Skriv filen med:
+ :w
+
+ Nste gang du starter Vim bruger den syntaksfremhvning.
+ Du kan tilfje alle dine foretrukne indstillinger til "vimrc"-filen.
+ F mere information, ved at skrive :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.3: FULDFRELSE
+
+
+ ** Kommandolinjefuldfrelse med CTRL-D og <TAB> **
+
+ 1. Srg for at Vim ikke er i kompatibel tilstand: :set nocp
+
+ 2. Se hvilke filer der er i mappen: :!ls eller :!dir
+
+ 3. Skriv begyndelsen af en kommando: :e
+
+ 4. Tryk p CTRL-D og Vim viser en liste over kommandoer der begynder med "e".
+
+ 5. Tryk p <TAB> og Vim vil fuldfre kommandonavnet til ":edit".
+
+ 6. Tilfj nu et mellemrum og begyndelsen af et eksisterende filnavn: :edit FIL
+
+ 7. Tryk p <TAB>. Vim fuldfrer navnet (hvis det er unikt).
+
+BEMRK: Fuldfrelse virker til mange kommandoer. Prv blot at trykke p
+ CTRL-D og <TAB>. Det er srligt nyttigt til :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7 OPSUMMERING
+
+
+ 1. Skriv :help eller tryk p <F1> eller <Help> for at bne et hjlpevindue.
+
+ 2. Skriv :help kommando for at finde hjlp om kommando .
+
+ 3. Skriv CTRL-W CTRL-W for at hoppe til et andet vindue
+
+ 4. Skriv :q for at lukke hjlpevinduet
+
+ 5. Opret et vimrc-opstarts-script for at bevare dine foretrukne indstillinger.
+
+ 6. Nr der skrives en :-kommando , s tryk p CTRL-D for at se
+ mulige fuldfrelser. Tryk p <TAB> for at bruge en fuldfrelse.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Det afslutter Vim-vejledningen. Det var meningen den skulle give et
+ kortfattet overblik af Vim-editoren, lige nok til at du kan bruge editoren
+ nogenlunde let. Den er langt fra komplet, da Vim har mange mange flere
+ kommandoer. Ls brugermanualen som det nste: ":help user-manual".
+
+ Denne bog anbefales, til yderligere lsning og studering:
+ Vim - Vi Improved - af Steve Oualline
+ Forlag: New Riders
+ Den frste bog som helt er tilegnet Vim. Specielt nyttig for begyndere.
+ Der er mange eksempler og billeder.
+ Se https://iccf-holland.org/click5.html
+
+ Denne bog er ldre og mere om Vi end Vim, men anbefales ogs:
+ Learning the Vi Editor - af Linda Lamb
+ Forlag: O'Reilly & Associates Inc.
+ Det er en god bog til at komme til kende nsten alt hvad du vil gre med Vi.
+ Den sjette udgave inkluderer ogs information om Vim.
+
+ Vejledningen blev skrevet af Michael C. Pierce og Robert K. Ware,
+ Colorado School of Mines med ideer af Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ ndret til Vim af Bram Moolenaar.
+
+ Oversat af scootergrisen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.da.utf-8 b/runtime/tutor/tutor.da.utf-8
new file mode 100644
index 0000000..dad3ea8
--- /dev/null
+++ b/runtime/tutor/tutor.da.utf-8
@@ -0,0 +1,972 @@
+===============================================================================
+= V e l k o m m e n t i l V I M - v e j l e d n i n g e n - Version 1.7 =
+===============================================================================
+
+ Vim er en meget kraftfuld editor med mange kommandoer, for mange til
+ at forklare i en vejledning som denne. Vejledningen er designet til at
+ beskrive nok af kommandoerne til at du vil være i stand til let at bruge
+ Vim som en alsidig editor.
+
+ Det tager cirka 25-30 minutter at fuldføre vejledningen,
+ afhængig af hvor meget tid der bruges på at eksperimentere.
+
+ VÆR OPMÆRKSOM PÅ AT:
+ Kommandoerne i lektionerne ændrer teksten. Opret en kopi af filen
+ til at øve på (hvis du startede "vimtutor", så er det allerede en kopi).
+
+ Det er vigtigt at huske på at vejledningen er sat op til at lære ved at
+ bruge. Det betyder at du skal udføre kommandoerne for at lære at bruge
+ dem ordentligt. Læser du kun teksten, så glemmer du kommandoerne!
+
+ Sørg for at din Caps-Lock-tast IKKE er aktiveret og tryk
+ på j-tasten nok gange til at flytte markøren så lektion 1.1
+ fylder hele skærmen.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.1: FLYT MARKØREN
+
+
+ ** Tryk på h-,j-,k-,l-tasterne som vist, for at flytte markøren. **
+ ^
+ k Fif: H-tasten er til venstre og flytter til venstre.
+ < h l > L-tasten er til højre og flytter til højre.
+ j J-tasten ligner en ned-pil.
+ v
+ 1. Flyt markøren rundt på skærmen indtil du er fortrolig med det.
+
+ 2. Hold ned-tasten (j) nede, indtil den gentager.
+ Nu ved du hvordan du flytter til den næste lektion.
+
+ 3. Brug ned-tasten til at flytte til lektion 1.2.
+
+BEMÆRK: Hvis du nogensinde bliver i tvivl om noget du skrev, så tryk på <ESC>
+ for at stille dig i normal tilstand. Skriv så kommandoen igen.
+
+BEMÆRK: Piletasterne bør også virke. Men med hjkl kan du flytte rundt
+ meget hurtigere, når du har vænnet dig til det. Seriøst!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.2: AFSLUT VIM
+
+
+ !! BEMÆRK: Læs hele lektionen, inden trinnene nedenfor udføres!!
+
+ 1. Tryk på <ESC>-tasten (for at være sikker på, at du er i normal tilstand).
+
+ 2. Skriv: :q! <ENTER>.
+ Det afslutter editoren, hvorved ændringer som du har foretaget forkastes.
+
+ 3. Vend tilbage hertil ved at udføre kommandoen som fik dig ind i
+ vejledningen. Det var muligvis: vimtutor <ENTER>
+
+ 4. Hvis du har lært trinnene udenad og er klar, så udfør trin
+ 1 til 3 for at afslutte og komme ind i editoren igen.
+
+BEMÆRK: :q! <ENTER> forkaster ændringer som du har foretaget. Om få lektioner
+ vil du lære at gemme ændringerne til en fil.
+
+ 5. Flyt markøren ned til lektion 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.3: TEKSTREDIGERING - SLET
+
+
+ ** Tryk på x for at slette tegnet som markøren er ovenpå. **
+
+ 1. Flyt markøren ned til linjen med --->.
+
+ 2. Ret fejlene ved at flytte markøren indtil den er ovenpå
+ tegnet som skal slettes.
+
+ 3. Tryk på x-tasten for at slette det uønskede tegn.
+
+ 4. Gentag trin 2 til 4 indtil sætningen er korrekt.
+
+---> Kkoen sprangg ovverr måånen.
+
+ 5. Gå videre til lektion 1.4, nu hvor linjen er korrekt.
+
+BEMÆRK: Efterhånden som du gennemgår vejledningen, så lær det ikke udenad,
+ lær det ved at gøre det.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.4: TEKSTREDIGERING - INDSÆT
+
+
+ ** Tryk på i for at indsætte tekst. **
+
+ 1. Flyt markøren ned til den første linje med --->.
+
+ 2. For at gøre den første linje magen til den anden, skal markøren flyttes
+ ovenpå det først tegn EFTER der hvor teksten skal indsættes.
+
+ 3. Tryk på i og skriv de nødvendige tilføjelser.
+
+ 4. Efterhånden som hver fejl rettes, så tryk på <ESC> for at vende tilbage
+ til normal tilstand. Gentag trin 2 til 4 for at rette sætningen.
+
+---> Der mangler tekst dene .
+---> Der mangler noget tekst på denne linje.
+
+ 5. Når du fortrolig med at indsætte tekst, så flyt til lektion 1.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.5: TEKSTREDIGERING - VEDHÆFT
+
+
+ ** Tryk på A for at vedhæfte tekst. **
+
+ 1. Flyt markøren ned til den første linje med --->.
+ Det er lige meget hvilket tegn markøren er på, på linjen.
+
+ 2. Tryk på A og skriv de nødvendige tilføjelser.
+
+ 3. Tryk på <ESC> når teksten er blevet vedhæftet for at vende tilbage til normal tilstand.
+
+ 4. Flyt markøren til den anden linje med ---> og gentag
+ trin 2 og 3 for at rette sætningen.
+
+---> Der mangler noget tekst på den
+ Der mangler noget tekst på denne linje.
+---> Der mangler også noget tek
+ Der mangler også noget tekst her.
+
+ 5. Når du er fortrolig med at vedhæfte tekst, så flyt til lektion 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.6: REDIGER EN FIL
+
+ ** Brug :wq til at gemme en fil og afslutte. **
+
+ !! BEMÆRK: Læs hele lektionen, inden trinnene nedenfor udføres!!
+
+ 1. Afslut vejledningen som du gjorde i lektion 1.2: :q!
+ Eller gør følgende i en anden terminal, hvis du har adgang til en.
+
+ 2. Skriv denne kommando i skalprompten: vim tutor <ENTER>
+ 'vim' er kommandoen til at starte Vim-editoren, 'tutor' er navnet på
+ filen som du vil redigere. Brug en fil som kan ændres.
+
+ 3. Indsæt og slet tekst, som du lærte vi de forrige lektioner.
+
+ 4. Gem filen med ændringer og afslut Vim med: :wq <ENTER>
+
+ 5. Hvis du afsluttede vimtutor i trin 1, så genstart vimtutor og flyt ned
+ til følgende opsummering.
+
+ 6. Udfør trinnene ovenfor, når du har læst og forstået dem.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1 OPSUMMERING
+
+
+ 1. Markøren flyttes enten med piletasterne eller hjkl-tasterne.
+ h (venstre) j (ned) k (op) l (højre)
+
+ 2. Vim startes fra skalprompten, ved at skrive: vim FILNAVN <ENTER>
+
+ 3. Vim afsluttes, ved at skrive: <ESC> :q! <ENTER> for at forkaste alle ændringer.
+ ELLER, ved at skrive: <ESC> :wq <ENTER> for at gemme ændringerne.
+
+ 4. Slet tegn ved markøren, ved at skrive: x
+
+ 5. Indsæt eller vedhæft tekst, ved at skrive:
+ i skriv indsat tekst <ESC> indsæt inden markøren
+ A skriv vedhæftet tekst <ESC> vedhæft efter linjen
+
+BEMÆRK: Når der trykkes på <ESC>, så stilles du i normal tilstand eller også
+ annulleres en uønsket og delvist fuldført kommando.
+
+Fortsæt nu med lektion 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.1: SLETTEKOMMANDOER
+
+
+ ** Skriv dw for at slette et ord. **
+
+ 1. Tryk på <ESC> for at være sikker på, at du er i normal tilstand.
+
+ 2. Flyt markøren ned til linjen med --->.
+
+ 3. Flyt markøren til begyndelsen af et ord som skal slettes.
+
+ 4. Skriv dw for at få ordet til at forsvinde.
+
+ BEMÆRK: Bogstavet d vises på den sidste linje på den skærm du skrev
+ det på. Vim venter på at du skriver w . Hvis du ser et andet tegn
+ end d , så skrev du forkert; tryk på <ESC> og start forfra.
+
+---> Der er regnorm nogle ord som sjovt ikke hører til papir i sætningen.
+
+ 5. Gentag trin 3 og 4 indtil sætningen er korrekt og gå til lektion 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.2: FLERE SLETTEKOMMANDOER
+
+
+ ** Skriv d$ for at slette til slutningen af linjen. **
+
+ 1. Tryk på <ESC> for at være sikker på, at du er i normal tilstand.
+
+ 2. Flyt markøren ned til linjen med --->.
+
+ 3. Flyt markøren til slutningen af den rette linje (EFTER det første . ).
+
+ 4. Skriv d$ for at slette til slutningen af linjen.
+
+---> Nogen skrev slutningen af linjen to gange. slutningen af linjen to gange.
+
+
+ 5. Flyt videre til lektion 2.3 for at forstå hvad der sker.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.3: OM OPERATORER OG BEVÆGELSER
+
+
+ Mange kommandoer som ændre tekst skabes fra en operator og en bevægelse.
+ Formatet til en slettekommando med sletteoperatoren d er som følger:
+
+ d bevægelse
+
+ Hvor:
+ d - er sletteoperatoren.
+ bevægelse - er hvad operatoren skal arbejde på (oplistet nedenfor).
+
+ En kort liste over bevægelser:
+ w - indtil begyndelsen af det næste ord, EKSKLUSIV dets første tegn.
+ e - til slutningen af det nuværende ord, INKLUSIV det sidste tegn.
+ $ - til slutningen af linjen, INKLUSIV det sidste tegn.
+
+ Så når der skrives de så slettes der fra markøren til slutningen af ordet.
+
+BEMÆRK: Når kun bevægelsen trykkes i normal tilstand, uden en operator,
+ så flyttes markøren som angivet.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.4: BRUG TÆLLER TIL EN BEVÆGELSE
+
+
+ ** Når der skrives et nummer inden en bevægelse, så gentages den det antal gange. **
+
+ 1. Flyt markøren ned til begyndelsen af linjen med --->.
+
+ 2. Skriv 2w for at flytte markøren fremad to ord.
+
+ 3. Skriv 3e for at flytte markøren fremad til slutningen af det tredje ord.
+
+ 4. Skriv 0 (nul) for at flytte til begyndelsen af linjen.
+
+ 5. Gentag trin 2 og 3 med forskellige numre.
+
+---> Dette er blot en linje med ord som du kan flytte rundt i.
+
+ 6. Flyt videre til lektion 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.5: BRUG TÆLLER TIL AT SLETTE FLERE
+
+
+ ** Når der skrives et nummer med en operator, så gentages den det antal gange. **
+
+ I kombinationen med sletteoperatoren og en bevægelse nævnt ovenfor kan du
+ indsætte en tæller inden bevægelsen for at slette flere:
+ d nummer bevægelse
+
+ 1. Flyt markøren til det første ord MED STORT på linjen med --->.
+
+ 2. Skriv d2w for at slette de to ord MED STORT
+
+ 3. Gentag trin 1 og 2 med en anden tæller for at slette de efterfølgende
+ ord MED STORT med én kommando
+
+---> denne ABC DE linje FGHI JK LMN OP med ord er Q RS TUV renset.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.6: ARBEJD PÅ LINJER
+
+
+ ** Skriv dd for at slette en hel linje. **
+
+ Pga. at sletning af linjer bruges så ofte, så besluttede designerne af Vi
+ at det ville være lettere bare at skrive to d'er for at slette en linje.
+
+ 1. Flyt markøren til den anden linje i frasen nedenfor.
+ 2. Skriv dd for at slette linjen.
+ 3. Flyt nu til den fjerde linje.
+ 4. Skriv 2dd for at slette to linjer.
+
+---> 1) Roser er røde,
+---> 2) Mudder er sjovt,
+---> 3) Violer er blå,
+---> 4) Jeg har en scooter,
+---> 5) Ure viser tiden,
+---> 6) Sukker er sødt
+---> 7) Og du er lige så.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.7: FORTRYD-KOMMANDOEN
+
+
+ ** Tryk på u for at fortryde de sidste kommandoer, U for at rette en hel linje. **
+
+ 1. Flyt markøren ned til linjen med ---> og placer den på
+ den første fejl.
+ 2. Skriv x for at slette det første uønskede tegn.
+ 3. Skriv nu u for at fortryde den sidste kommando der blev udført.
+ 4. Ret denne gang alle fejlene på linjen med x-kommadoen.
+ 5. Skriv nu et stort U for at få linjen tilbage til dens oprindelige tilstand.
+ 6. Skriv nu u nogle få gange for at fortryde U'et og forudgående kommandoer.
+ 7. Skriv nu CTRL-R (hold CTRL-tasten nede mens der trykkes på R) nogle få gange
+ for at omgøre kommandoerne (fortryd fortrydelserne).
+
+---> Rett fejlene ppå liinjen og errstat dem meed fortryd.
+
+ 8. Det er meget nyttige kommandoer. Flyt nu til lektion 2 opsummering.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2 OPSUMMERING
+
+
+ 1. Slet fra markøren op til det næste ord, ved at skrive: dw
+ 2. Slet fra markøren til slutningen af en linje, ved at skrive: d$
+ 3. Slet en hel linje, ved at skrive: dd
+
+ 4. Gentag en bevægelse ved at vedhæfte et nummer i begyndelsen: 2w
+ 5. Formatet til en ændr-kommando er:
+ operator [nummer] bevægelse
+ hvor:
+ operator - er hvad der skal gøres, såsom d for at slette
+ [nummer] - er en valgfri tæller til at gentage bevægelsen
+ bevægelse - flytter over teksten som der skal arbejde på, såsom w (ord),
+ $ (til slutningen af linjen), osv.
+
+ 6. Flyt til begyndelsen af linjen med et nul: 0
+
+ 7. Fortryd tidligere handlinger, ved at skrive: u (lille u)
+ Fortryd alle ændringerne på en linje, ved at skrive: U (stort U)
+ Fortryd fortrydelserne, ved at skrive: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.1: PUT-INDSÆTTE-KOMMANDOEN
+
+
+ ** Skriv p for at put-indsætte tidligere slettede tekst efter markøren. **
+
+ 1. Flyt markøren ned til den første linje med --->.
+
+ 2. Skriv dd for at slette linjen og gemme den i et Vim-register.
+
+ 3. Flyt markøren til c)-linjen, OVER hvor den slettede linje skal være.
+
+ 4. Skriv p for at put-indsætte linjen nedenunder markøren.
+
+ 5. Gentag trin 2 til 4 for at put-indsætte alle linjerne i den rigtige rækkefølge.
+
+---> d) Kan du lære lige så?
+---> b) Violer er blå,
+---> c) Intelligens skal læres,
+---> a) Roser er røde,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.2: ERSTAT-KOMMANDOEN
+
+
+ ** Skriv rx for at erstatte tegnet ved markøren med x . **
+
+ 1. Flyt markøren ned til den første linje med --->.
+
+ 2. Flyt markøren så den er ovenpå den første fejl.
+
+ 3. Skriv r og så tegnet som skal være der.
+
+ 4. Gentag trin 2 og 3 indtil den første linje er magen til den anden.
+
+---> Def var nohen der trukkede på de forkerge taster, da linjem blev skrevet!
+---> Der var nogen der trykkede på de forkerte taster, da linjen blev skrevet!
+
+ 5. Flyt nu videre til lektion 3.3.
+
+BEMÆRK: Husk på at du skal lære ved at gøre det, ikke ved at lære det udenad.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.3: ÆNDRINGSOPERATOREN
+
+
+ ** Ændr indtil slutningen af et ord, ved at skrive ce . **
+
+ 1. Flyt markøren ned til den første linje med --->.
+
+ 2. Placer markøren på k'et i likibj.
+
+ 3. Skriv ce og det korrekte ord (i dette tilfælde skrives njen ).
+
+ 4. Tryk på <ESC> og flyt til det næste tegn der skal ændres.
+
+ 5. Gentag trin 3 og 4 indtil den første sætning er magen til den anden.
+
+---> Likibj har nogle få ndo som vnes ændres vrf ændringsoperatoren.
+---> Linjen har nogle få ord som skal ændres med ændringsoperatoren.
+
+Bemærk at ce sletter ordet og stiller dig i indsæt-tilstand.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.4: FLERE ÆNDRINGER MED c
+
+
+ ** ÆNDRINGSOPERATOREN bruges med de samme bevægelser som slet. **
+
+ 1. Ændringsoperatoren virker på samme måde som slet. Formatet er:
+
+ c [nummer] bevægelse
+
+ 2. Bevægelserne er de samme, såsom w (ord) og $ (slutningen af linjen).
+
+ 3. Flyt ned til den første linje med --->.
+
+ 4. Flyt markøren til den første fejl.
+
+ 5. Skriv c$ og skriv resten af linjen som den anden linje og tryk på <ESC>.
+
+---> Slutningen af linjen har brug for lidt hjælp til at blive ligesom den anden.
+---> Slutningen af linjen skal rettes med c$-kommandoen.
+
+BEMÆRK: Du kan bruge backspace-tasten til at rette fejl når du skriver.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3 OPSUMMERING
+
+
+ 1. Put-indsæt tekst tilbage som lige er blevet slettet, ved at skrive p .
+ Det put-indsætter den slettede tekst EFTER markøren (hvis en linje blev
+ slettet, så vil den være på linjen nedenunder markøren).
+
+ 2. Erstat tegnet under markøren, ved at skrive r og så
+ tegnet som du vil have der.
+
+ 3. Ændringsoperatoren giver dig mulighed for at ændre fra markøren til hvor
+ bevægelsen tager dig hen. Skriv f.eks. ce for at ændre fra markøren til
+ slutningen af ordet, c$ for at ændre til slutningen af en linjen.
+
+ 4. Formatet til at ændre er:
+
+ c [nummer] bevægelse
+
+Gå nu videre til den næste lektion.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.1: MARKØRPLACERING OG FILSTATUS
+
+ ** Skriv CTRL-G for at vise din placering i filen og filstatussen.
+ Skriv G for at flytte til en linje i filen. **
+
+ BEMÆRK: Læs hele lektionen, inden trinnene udføres!!
+
+ 1. Hold Ctrl-tasten nede og tryk på g . Vi kalder det CTRL-G.
+ Der vises en meddelelse nederst på siden med filnavnet og
+ placeringen i filen. Husk linjenummeret til trin 3.
+
+BEMÆRK: Du ser muligvis markørplaceringen nederst i højre hjørne af skærmen.
+ Det sker når 'ruler'-valgmuligheden er sat (se :help 'ruler' )
+
+ 2. Tryk på G for at flytte dig nederst i filen.
+ Skriv gg for at flytte dig øverst i filen.
+
+ 3. Skriv nummeret på den linje du var på, og så G . Det
+ returnerer dig til den linje du var på da du første trykkede på CTRL-G.
+
+ 4. Hvis du føler dig klar til at gøre det, så udføre trin 1 til 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.2: SØG-KOMMANDOEN
+
+
+ ** Skriv / efterfulgt af en frase for at søge efter frasen. **
+
+ 1. I normal tilstand, skriv /-tegnet . Bemærk at det og markøren
+ vises i bunden af skærmen som med :-kommandoen .
+
+ 2. Skriv nu 'feeejjl' <ENTER>. Det er ordet du vil søge efter.
+
+ 3. Søg efter den samme frase igen, ved blot at skrive n .
+ Søg efter den samme frase i den anden retning, ved at skrive N .
+
+ 4. Søg efter en frase i den modsatte retning, ved at bruge ? i stedet for / .
+
+ 5. Gå tilbage hvor du kom fra, ved at trykke på CTRL-O (Hold Ctrl nede mens
+ der trykkes på bogstavet o). Gentag for at gå længere tilbage. CTRL-I går fremad.
+
+---> "feeejjl" er den forkerte måde at stave til fejl; feeejjl er en fejl.
+BEMÆRK: Når søgningen når slutningen af filen, så fortsætter den ved
+ begyndelsen, men mindre 'wrapscan'-valgmuligheden er blevet slået fra.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.3: SØG EFTER MODSVARENDE PARENTESER
+
+
+ ** Skriv % for at finde en modsvarende ),], eller } . **
+
+ 1. Placer markøren på (, [, eller { på linjen nedenfor med --->.
+
+ 2. Skriv nu %-tegnet .
+
+ 3. Markøren flytter til den modsvarende parentes eller klamme.
+
+ 4. Skriv % for at flytte markøren til den anden modsvarende klamme.
+
+ 5. Flyt markøren til en anden (,),[,],{ eller } og se hvad % gør.
+
+---> Dette ( er en testlinje med ('er, ['er ] og {'er }. ))
+
+
+BEMÆRK: Det er meget nyttigt ved fejlretning af et program som mangler
+ modsvarende parenteser!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.4: UDSKIFT-KOMMANDOEN
+
+
+ ** Skriv :s/gammel/ny/g for at udskifte 'gammel' med 'ny'. **
+
+ 1. Flyt markøren ned til linjen med --->.
+
+ 2. Skriv :s/dett/det <ENTER> . Bemærk at kommandoen kun ændre den
+ første forekomst af "dett" på linjen.
+
+ 3. Skriv nu :s/dett/det/g . Når g-flaget tilføjes, så udskiftes der
+ globalt på linjen, altså ændre alle forekomster af "dett" på linjen.
+
+---> dett siges at dett er bedst at se på blomster når dett er forår.
+
+ 4. Ændr hver forekomst af en tegnstreng mellem to linjer,
+ ved at skrive :#,#s/gammel/ny/g hvor #,# er linjenumrene over området
+ af linjer hvor udskiftningen skal ske.
+ Skriv :%s/gammel/ny/g for at ændre hver forekomst i hele filen.
+ Skriv :%s/gammel/ny/gc for at finde hver forekomst i hele filen,
+ med en prompt om hvorvidt der skal udskiftes eller ej.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4 OPSUMMERING
+
+
+ 1. CTRL-G viser din placering i filen og filstatussen.
+ G flytter til slutningen af filen.
+ nummer G flytter til linjenummeret.
+ gg flytter til den første linje.
+
+ 2. Når der skrives / efterfulgt af en frase, så søges der FREMAD efter frasen.
+ Når der skrives ? efterfulgt af en frase, så søges der BAGLÆNS efter frasen.
+ Skriv n efter en søgning, for at finde den næste forekomst i den samme retning,
+ eller N for at søge i den modsatte retning.
+ CTRL-O tager dig tilbage til ældre placeringer, CTRL-I til nyere placeringer.
+
+ 3. Når der skrives % mens markøren er på et (,),[,],{, eller }, så går den til dens match.
+
+ 4. Udskift den første første gammel med ny på en linje, ved at skrive :s/gammel/ny
+ Udskift alle gammel med ny på en linje, ved at skrive :s/gammel/ny/g
+ Udskift fraser mellem to linenumre, ved at skrive :#,#s/gammel/ny/g
+ Udskift alle forekomster i filen, ved at skrive :%s/gammel/ny/g
+ Spørg om bekræftelse hver gang, ved at tilføje 'c' :%s/gammel/ny/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.1: UDFØR EN EKSTERN KOMMANDO
+
+
+ ** Skriv :! efterfulgt af en ekstern kommando, for at udføre kommandoen. **
+
+ 1. Skriv den velkendte kommando : for at sætte markøren nederst på
+ skærmen. Det giver dig mulighed for at indtaste en kommandolinjekommando.
+
+ 2. Skriv nu !-tegnet (udråbstegn). Det giver dig mulighed
+ for at udføre enhver ekstern skalkommando.
+
+ 3. Skriv f.eks. ls efter ! og tryk så på <ENTER>. Det
+ viser dig en liste over din mappe, ligesom hvis du var ved
+ skalprompten. Eller brug :!dir hvis ikke ls virker.
+
+BEMÆRK: Det er muligt at udføre enhver ekstern kommando på denne måde,
+ også med argumenter.
+
+BEMÆRK: Alle :-kommandoer skal afsluttes ved at trykke på <ENTER>.
+ Vi nævner det ikke altid herefter.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.2: MERE OM AT SKRIVE FILER
+
+
+ ** Gem ændringerne som er foretaget til teksten, ved at skrive :w FILNAVN. **
+
+ 1. Skriv :!dir eller :!ls for at få en liste over din mappe.
+ Du ved allerede at du skal trykke på <ENTER> bagefter.
+
+ 2. Vælg et filnavn som ikke findes endnu, såsom TEST.
+
+ 3. Skriv nu: :w TEST (hvor TEST er filnavnet som du vælger.)
+
+ 4. Det gemmer hele filen (Vim-vejledningen) under navnet TEST.
+ Bekræft det, ved igen at skrive :!dir eller :!ls for at se din mappe.
+
+BEMÆRK: Hvis du afslutter Vim og starter den igen med vim TEST , så vil
+ filen være en nøjagtig kopi af vejledningen da du gemte den.
+
+ 5. Fjern nu filen, ved at skrive (MS-DOS): :!del TEST
+ eller (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.3: MARKÉR TEKST SOM SKAL SKRIVES
+
+
+ ** Gem en del af en fil, ved at skrive v bevægelse :w FILNAVN **
+
+ 1. Flyt markøren til denne linje.
+
+ 2. Tryk på v og flyt markøren til the femte punkt nedenfor. Bemærk at
+ teksten er fremhævet.
+
+ 3. Tryk på :-tegnet . Nederst på skærmen vises :'<,'>.
+
+ 4. Skriv w TEST , hvor TEST er filnavnet som endnu ikke findes. Bekræft
+ at du ser :'<,'>w TEST inden du trykker på <ENTER>.
+
+ 5. Vim skriver de markerede linjer til filen TEST. Brug :!dir eller :!ls
+ for at se den. Fjern den ikke endnu! Vi bruger den i den næste lektion.
+
+BEMÆRK: Når der trykkes på v startes visuel markering. Du kan flytte markøren
+ rundt for at gøre markeringen større eller mindre. Du kan så bruge en
+ operator til at gøre noget med teksten. F.eks. vil d slette teksten.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.4: INDHENT OG SAMMENLÆG FILER
+
+
+ ** Indsæt indholdet af en fil, ved at skrive :r FILNAVN **
+
+ 1. Placer markøren lige ovenover denne linje.
+
+BEMÆRK: Når trin 2 er udført vil du se teksten fra lektion 5.3. Flyt så
+ NED for at se denne lektion igen.
+
+ 2. Indhent nu din TEST-fil med kommandoen :r TEST , hvor TEST er
+ navnet på filen som du brugte.
+ Filen som du indhenter placeres under markørens linje.
+
+ 3. Bekræft at en fil blev indhentet, ved at flytte markøren tilbage og bemærk
+ at der nu er to kopier af lektion 5.3, den originale og filversionen.
+
+BEMÆRK: Du kan også læse outputtet fra en ekstern kommando. F.eks. læser
+ :r !ls outputtet fra ls-kommandoen og indsætter det under
+ markøren.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5 OPSUMMERING
+
+
+ 1. :!kommando udfører en ekstern kommando.
+
+ Nogle nyttige eksempler er:
+ (MS-DOS) (Unix)
+ :!dir :!ls - viser en liste over mapper.
+ :!del FILNAVN :!rm FILNAVN - fjerner filen FILNAVN.
+
+ 2. :w FILNAVN skriver den nuværende Vim-fil til disken med navnet FILNAVN.
+
+ 3. v bevægelse :w FILNAVN gemmer de visuelt markerede linjer i filen
+ FILNAVN.
+
+ 4. :r FILNAVN indhenter diskfilen FILNAVN og indsætter den under
+ markørens placering.
+
+ 5. :r !dir læser outputtet fra dir-kommandoen og indsætter det under
+ markørens placering.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.1: ÅBN-KOMMANDOEN
+
+
+ ** Skriv o for at åbne en linje under markøren og stille dig i indsæt-tilstand. **
+
+ 1. Flyt markøren ned til linjen med --->.
+
+ 2. Skriv bogstavet o med småt, for at åbne en linje UNDER markøren og stille
+ dig i indsæt-tilstand.
+
+ 3. Skriv nu noget tekst og tryk på <ESC> for at afslutte indsæt-tilstand.
+
+---> Efter o er blevet skrevet, placeres markøren på den åbne linje i indsæt-tilstand.
+
+ 4. Skriv blot et stort O , i stedet for et lille o , for at
+ åbne en linje OVENOVER markøren. Prøv det på linjen nedenfor.
+
+---> Åbn en line ovenover denne, ved at skrive O mens markøren er på denne linje.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.2: VEDHÆFT-KOMMANDOEN
+
+
+ ** Skriv a for at indsætte tekst EFTER markøren. **
+
+ 1. Flyt markøren ned til begyndelsen af linjen med --->.
+
+ 2. Tryk på e indtil markøren er på slutningen af lin .
+
+ 3. Skriv et a (med småt) for at vedhæfte tekst EFTER markøren.
+
+ 4. Fuldfør ordet ligesom linjen under det. Tryk på <ESC> for at afslutte
+ indsæt-tilstand.
+
+ 5. Brug e til at flytte til det næste ufærdige ord og gentag trin 3 og 4.
+
+---> Lin giver dig mulighed for at øv vedhæftnin af tekst til en linje.
+---> Linjen giver dig mulighed for at øve vedhæftning af tekst til en linje.
+
+BEMÆRK: a, i og A går alle til den samme indsæt-tilstand,
+ den eneste forskel er hvor tegnene indsættes.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.3: AN ANDEN MÅDE AT ERSTATTE
+
+
+ ** Skriv et stort R for at erstatte flere end ét tegn. **
+
+ 1. Flyt markøren ned til den første linje med --->. Flyt markøren til
+ begyndelsen af den første xxx .
+
+ 2. Tryk nu på R og skriv nummeret som er under det på den anden linje,
+ så det erstatter xxx .
+
+ 3. Tryk på <ESC> for at forlade erstat-tilstand. Bemærk at resten af linjen
+ forbliver uændret.
+
+ 4. Gentag trinnene for at erstatte det sidste xxx.
+
+---> Når 123 lægges sammen med xxx giver det xxx.
+---> Når 123 lægges sammen med 456 giver det 579.
+
+BEMÆRK: Erstat-tilstand er ligesom indsæt-tilstand, men hvert indtastede
+ tegn sletter et eksisterende tegn.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.4: KOPÍER OG INDSÆT TEKST
+
+
+ ** Brug y-operatoren til at kopiere tekst og p til at indsætte den **
+
+ 1. Gå ned til linjen med ---> og placer markøren efter "a)".
+
+ 2. Start visuel tilstand med v og flyt markøren til lige inden "første".
+
+ 3. Skriv y for at yank-udtrække (kopiere) den fremhævede tekst.
+
+ 4. Flyt markøren til slutningen af den næste linje: j$
+
+ 5. Skriv p for at put-indsætte (indsætte) teksten. Skriv så: a andet <ESC> .
+
+ 6. Brug visuel tilstand til at markere " punkt.", yank-udtræk med y , flyt
+ til slutningen af næste linje med j$ og put-indsæt teksten der med p .
+
+---> a) dette er det første punkt.
+ b)
+
+ BEMÆRK: du kan også bruge y som en operator; yw yank-udtrækker et ord.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.5: SÆT VALGMULIGHED
+
+
+ ** Sæt en valgmulighed så en søgning eller udskiftning ignorerer forskelle på store/små bogstaver **
+
+ 1. Søg efter 'ignorer', ved at skrive: /ignorer <ENTER>
+ Gentag flere gange ved at trykke på n .
+
+ 2. Sæt 'ic'-valgmuligheden (Ignorer forskelle på store/små bogstaver), ved at skrive: :set ic
+
+ 3. Søg nu efter 'ignorer' igen, ved at trykke på n
+ Bemærk at Ignorer og IGNORER nu også bliver fundet.
+
+ 4. Sæt 'hlsearch'- og 'incsearch'-valgmulighederne: :set hls is
+
+ 5. Skriv nu søg-kommandoen igen og se hvad der sker: /ignorer <ENTER>
+
+ 6. Deaktivér ignorering af forskelle på store/små bogstaver, ved at skrive: :set noic
+
+BEMÆRK: Fjern fremhævningen af matches, ved at skrive: :nohlsearch
+BEMÆRK: Hvis du vil ignorere case for en enkelt søg-kommando, så brug \c
+ i frasen: /ignorer\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6 OPSUMMERING
+
+ 1. Skriv o for at åbne en linje NEDENUNDER markøren og starte indsæt-tilstand.
+ Skriv O for at åbne en linje OVENOVER markøren.
+
+ 2. Skriv a for at indsætte tekst EFTER markøren.
+ Skriv A for at indsætte tekst efter slutningen af linjen.
+
+ 3. e-kommandoen flytter til slutningen af et ord.
+
+ 4. y-operatoren yank-udtrækker (kopierer) tekst, p put-indsætter (indsætter) den.
+
+ 5. Når der skrives et stort R stilles du i erstat-tilstand indtil der trykkes på <ESC> .
+
+ 6. Når der skrives ":set xxx", så sættes valgmuligheden "xxx". Nogle valgmuligheder er:
+ 'ic' 'ignorecase' ignorer forskelle på store/små bogstaver når der søges
+ 'is' 'incsearch' vis delvise match for en søgefrase
+ 'hls' 'hlsearch' fremhæv alle fraser som matcher
+ Du kan enten bruge det lange eller korte valgmulighedsnavn.
+
+ 7. Vedhæft "no" i begyndelsen, for at slå en valgmulighed fra: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.1: FÅ HJÆLP
+
+
+ ** Brug online-hjælpesystemet **
+
+ Vim har et omfattende online-hjælpesystem. Prøv en af disse tre,
+ for at komme i gang:
+ - tryk på <HELP>-tasten (hvis du har en)
+ - tryk på <F1>-tasten (hvis du har en)
+ - skriv :help <ENTER>
+
+ Læs teksten i hjælpevinduet for at finde ud af hvordan hjælpen virker.
+ Skriv CTRL-W CTRL-W for at hoppe fra et vindue til et andet.
+ Skriv :q <ENTER> for at lukke hjælpevinduet.
+
+ Du kan finde hjælp om næsten alle emner, ved at give et argument til
+ ":help"-kommandoen. Prøv disse (husk at trykke på <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.2: OPRET ET OPSTARTS-SCRIPT
+
+
+ ** Aktivér Vim-funktionaliteter **
+
+ Vim har mange flere funktionaliteter end Vi, men de fleste er deaktiveret som
+ standard. For at bruge flere funktionaliteter skal du oprette en "vimrc"-fil.
+
+ 1. Begynd at redigere "vimrc"-filen. Det afhænger af dit system:
+ :e ~/.vimrc i Unix
+ :e ~/_vimrc i MS-Windows
+
+ 2. Læs nu indholdet af eksempel "vimrc"-filen:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Skriv filen med:
+ :w
+
+ Næste gang du starter Vim bruger den syntaksfremhævning.
+ Du kan tilføje alle dine foretrukne indstillinger til "vimrc"-filen.
+ Få mere information, ved at skrive :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.3: FULDFØRELSE
+
+
+ ** Kommandolinjefuldførelse med CTRL-D og <TAB> **
+
+ 1. Sørg for at Vim ikke er i kompatibel tilstand: :set nocp
+
+ 2. Se hvilke filer der er i mappen: :!ls eller :!dir
+
+ 3. Skriv begyndelsen af en kommando: :e
+
+ 4. Tryk på CTRL-D og Vim viser en liste over kommandoer der begynder med "e".
+
+ 5. Tryk på <TAB> og Vim vil fuldføre kommandonavnet til ":edit".
+
+ 6. Tilføj nu et mellemrum og begyndelsen af et eksisterende filnavn: :edit FIL
+
+ 7. Tryk på <TAB>. Vim fuldfører navnet (hvis det er unikt).
+
+BEMÆRK: Fuldførelse virker til mange kommandoer. Prøv blot at trykke på
+ CTRL-D og <TAB>. Det er særligt nyttigt til :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7 OPSUMMERING
+
+
+ 1. Skriv :help eller tryk på <F1> eller <Help> for at åbne et hjælpevindue.
+
+ 2. Skriv :help kommando for at finde hjælp om kommando .
+
+ 3. Skriv CTRL-W CTRL-W for at hoppe til et andet vindue
+
+ 4. Skriv :q for at lukke hjælpevinduet
+
+ 5. Opret et vimrc-opstarts-script for at bevare dine foretrukne indstillinger.
+
+ 6. Når der skrives en :-kommando , så tryk på CTRL-D for at se
+ mulige fuldførelser. Tryk på <TAB> for at bruge en fuldførelse.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Det afslutter Vim-vejledningen. Det var meningen den skulle give et
+ kortfattet overblik af Vim-editoren, lige nok til at du kan bruge editoren
+ nogenlunde let. Den er langt fra komplet, da Vim har mange mange flere
+ kommandoer. Læs brugermanualen som det næste: ":help user-manual".
+
+ Denne bog anbefales, til yderligere læsning og studering:
+ Vim - Vi Improved - af Steve Oualline
+ Forlag: New Riders
+ Den første bog som helt er tilegnet Vim. Specielt nyttig for begyndere.
+ Der er mange eksempler og billeder.
+ Se https://iccf-holland.org/click5.html
+
+ Denne bog er ældre og mere om Vi end Vim, men anbefales også:
+ Learning the Vi Editor - af Linda Lamb
+ Forlag: O'Reilly & Associates Inc.
+ Det er en god bog til at komme til kende næsten alt hvad du vil gøre med Vi.
+ Den sjette udgave inkluderer også information om Vim.
+
+ Vejledningen blev skrevet af Michael C. Pierce og Robert K. Ware,
+ Colorado School of Mines med ideer af Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Ændret til Vim af Bram Moolenaar.
+
+ Oversat af scootergrisen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.de b/runtime/tutor/tutor.de
new file mode 100644
index 0000000..599fdc7
--- /dev/null
+++ b/runtime/tutor/tutor.de
@@ -0,0 +1,982 @@
+===============================================================================
+= W i l l k o m m e n im V I M T u t o r - Version 1.7.de.1 =
+===============================================================================
+
+ Vim ist ein sehr mchtiger Editor, der viele Befehle bereitstellt; zu viele,
+ um alle in einem Tutor wie diesem zu erklren. Dieser Tutor ist so
+ gestaltet, um genug Befehle vorzustellen, dass Du die Fhigkeit erlangst,
+ Vim mit Leichtigkeit als einen Allzweck-Editor zu verwenden.
+ Die Zeit fr das Durcharbeiten dieses Tutors betrgt ca. 25-30 Minuten,
+ abhngig davon, wie viel Zeit Du mit Experimentieren verbringst.
+
+ ACHTUNG:
+ Die in den Lektionen angewendeten Kommandos werden den Text modifizieren.
+ Erstelle eine Kopie dieser Datei, in der Du ben willst (falls Du "vimtutor"
+ aufgerufen hast, ist dies bereits eine Kopie).
+
+ Es ist wichtig, sich zu vergegenwrtigen, dass dieser Tutor fr das Anwenden
+ konzipiert ist. Das bedeutet, dass Du die Befehle anwenden musst, um sie
+ richtig zu lernen. Wenn Du nur den Text liest, vergisst Du die Befehle!
+
+ Jetzt stelle sicher, dass deine Umstelltaste NICHT gedrckt ist und bettige
+ die j Taste gengend Mal, um den Cursor nach unten zu bewegen, so dass
+ Lektion 1.1 den Bildschirm vollkommen ausfllt.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.1: BEWEGEN DES CURSORS
+
+ ** Um den Cursor zu bewegen, drcke die h,j,k,l Tasten wie unten gezeigt. **
+ ^ Hilfestellung:
+ k Die h Taste befindet sich links und bewegt nach links.
+ < h l > Die l Taste liegt rechts und bewegt nach rechts.
+ j Die j Taste hnelt einem Pfeil nach unten.
+ v
+ 1. Bewege den Cursor auf dem Bildschirm umher, bis Du Dich sicher fhlst.
+
+ 2. Halte die Nach-Unten-Taste (j) gedrckt, bis sie sich wiederholt.
+ Jetzt weit Du, wie Du Dich zur nchsten Lektion bewegen kannst.
+
+ 3. Benutze die Nach-Unten-Taste, um Dich zu Lektion 1.2 zu bewegen.
+
+Anmerkung: Immer, wenn Du Dir unsicher bist ber das, was Du getippt hast,
+ drcke <ESC> , um Dich in den Normalmodus zu begeben.
+ Dann gib das gewnschte Kommando noch einmal ein.
+
+Anmerkung: Die Cursor-Tasten sollten ebenfalls funktionieren. Aber wenn Du
+ hjkl benutzt, wirst Du in der Lage sein, Dich sehr viel schneller
+ umherzubewegen, wenn Du Dich einmal daran gewhnt hast. Wirklich!
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.2: VIM BEENDEN
+
+
+ !! Hinweis: Bevor Du einen der unten aufgefhrten Schritte ausfhrst, lies
+ diese gesamte Lektion!!
+
+ 1. Drcke die <ESC> Taste (um sicherzustellen, dass Du im Normalmodus bist).
+
+ 2. Tippe: :q! <ENTER>.
+ Dies beendet den Editor und VERWIRFT alle nderungen, die Du gemacht hast.
+
+ 3. Wenn Du die Eingabeaufforderung siehst, gib das Kommando ein, das Dich zu
+ diesem Tutor gefhrt hat. Dies wre: vimtutor <ENTER>
+
+ 4. Wenn Du Dir diese Schritte eingeprgt hast und Du Dich sicher fhlst,
+ fhre Schritte 1 bis 3 aus, um den Editor zu verlassen und wieder
+ hineinzugelangen.
+
+Anmerkung: :q! <ENTER> verwirft alle nderungen, die Du gemacht hast. Einige
+ Lektionen spter lernst Du, die nderungen in einer Datei zu speichern.
+
+ 5. Bewege den Cursor abwrts zu Lektion 1.3.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.3: TEXT EDITIEREN - LSCHEN
+
+
+ ** Drcke x , um das Zeichen unter dem Cursor zu lschen. **
+
+ 1. Bewege den Cursor zu der mit ---> markierten Zeile unten.
+
+ 2. Um die Fehler zu beheben, bewege den Cursor, bis er ber dem Zeichen steht,
+ das gelscht werden soll.
+
+ 3. Drcke die x Taste, um das unerwnschte Zeichen zu lschen.
+
+ 4. Wiederhole die Schritte 2 bis 4, bis der Satz korrekt ist.
+
+---> Die Kkuh sprangg bberr deen Moond.
+
+ 5. Nun, da die Zeile korrekt ist, gehe weiter zur Lektion 1.4.
+
+Anmerkung: Whrend Du durch diesen Tutor gehst, versuche nicht, auswendig zu
+ lernen, lerne vielmehr durch Anwenden.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.4: TEXT EDITIEREN - EINFGEN
+
+
+ ** Drcke i , um Text einzufgen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 2. Um die erste Zeile mit der zweiten gleichzumachen, bewege den Cursor auf
+ das erste Zeichen NACH der Stelle, an der Text eingefgt werden soll.
+
+ 3. Drcke i und gib die ntigen Ergnzungen ein.
+
+ 4. Wenn jeweils ein Fehler beseitigt ist, drcke <ESC> , um zum Normalmodus
+ zurckzukehren.
+ Wiederhole Schritte 2 bis 4, um den Satz zu korrigieren.
+
+---> In dieser ft etwas .
+---> In dieser Zeile fehlt etwas Text.
+
+ 5. Wenn Du Dich mit dem Einfgen von Text sicher fhlst, gehe zu Lektion 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.5: TEXT EDITIEREN - ANFGEN
+
+
+ ** Drcke A , um Text anzufgen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+ Dabei ist gleichgltig, auf welchem Zeichen der Zeile der Cursor steht.
+
+ 2. Drcke A und gib die erforderlichen Ergnzungen ein.
+
+ 3. Wenn das Anfgen abgeschlossen ist, drcke <ESC>, um in den Normalmodus
+ zurckzukehren.
+
+ 4. Bewege den Cursor zur zweiten mit ---> markierten Zeile und wiederhole
+ die Schritte 2 und 3, um den Satz zu auszubessern.
+
+---> In dieser Zeile feh
+ In dieser Zeile fehlt etwas Text.
+---> Auch hier steh
+ Auch hier steht etwas Unvollstndiges.
+
+ 5. Wenn Du dich mit dem Anfgen von Text sicher fhlst, gehe zu Lektion 1.6.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.6: EINE DATEI EDITIEREN
+
+ ** Benutze :wq , um eine Datei zu speichern und Vim zu verlassen. **
+
+ !! Hinweis: Bevor Du einen der unten aufgefhrten Schritte ausfhrst, lies
+ diese gesamte Lektion!!
+
+ 1. Verlasse den Editor so wie in Lektion 1.2: :q!
+ Oder, falls du Zugriff zu einem anderen Terminal hast, fhre das
+ Folgende dort aus.
+
+ 2. Gib dieses Kommando in die Eingabeaufforderung ein: vim tutor <ENTER>
+ 'vim' ist der Aufruf des Editors, 'tutor' ist die zu editierende Datei.
+ Benutze eine Datei, die gendert werden darf.
+
+ 3. Fge Text ein oder lsche ihn, wie Du in den vorangehenden Lektionen
+ gelernt hast.
+
+ 4. Speichere die genderte Datei und verlasse Vim mit: :wq <ENTER>
+
+ 5. Falls Du in Schritt 1 den vimtutor beendet hast, starte vimtutor neu und
+ bewege dich abwrts bis zur folgenden Zusammenfassung.
+
+ 6. Nachdem Du obige Schritte gelesen und verstanden hast: fhre sie durch.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 1
+
+
+ 1. Der Cursor wird mit den Pfeiltasten oder den Tasten hjkl bewegt.
+ h (links) j (unten) k (aufwrts) l (rechts)
+
+ 2. Um Vim aus der Eingabeaufforderung zu starten, tippe: vim DATEI <ENTER>
+
+ 3. Um Vim zu verlassen und alle nderungen zu verwerfen, tippe:
+ <ESC> :q! <ENTER> .
+
+ 4. Um das Zeichen unter dem Cursor zu lschen, tippe: x
+
+ 5. Um Text einzufgen oder anzufgen, tippe:
+ i Einzufgenden Text eingeben <ESC> Einfgen vor dem Cursor
+ A Anzufgenden Text eingeben <ESC> Anfgen nach dem Zeilenende
+
+Anmerkung: Drcken von <ESC> bringt Dich in den Normalmodus oder bricht ein
+ ungewolltes, erst teilweise eingegebenes Kommando ab.
+
+ Nun fahre mit Lektion 2 fort.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.1: LSCHKOMMANDOS
+
+
+ ** Tippe dw , um ein Wort zu lschen. **
+
+ 1. Drcke <ESC> , um sicherzustellen, dass Du im Normalmodus bist.
+
+ 2. Bewege den Cursor zu der mit ---> markierten Zeile unten.
+
+ 3. Bewege den Cursor zum Anfang eines Wortes, das gelscht werden soll.
+
+ 4. Tippe dw , um das Wort zu entfernen.
+
+ Anmerkung: Der Buchstabe d erscheint auf der untersten Zeile des Schirms,
+ wenn Du ihn eingibst. Vim wartet darauf, dass Du w eingibst. Falls Du
+ ein anderes Zeichen als d siehst, hast Du etwas Falsches getippt;
+ drcke <ESC> und beginne noch einmal.
+
+---> Einige Wrter lustig gehren nicht Papier in diesen Satz.
+
+ 5. Wiederhole die Schritte 3 und 4, bis der Satz korrekt ist und gehe
+ zur Lektion 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.2: WEITERE LSCHKOMMANDOS
+
+
+ ** Tippe d$ , um bis zum Ende der Zeile zu lschen. **
+
+ 1. Drcke <ESC> , um sicherzustellen, dass Du im Normalmodus bist.
+
+ 2. Bewege den Cursor zu der mit ---> markierten Zeile unten.
+
+ 3. Bewege den Cursor zum Ende der korrekten Zeile (NACH dem ersten . ).
+
+ 4. Tippe d$ , um bis zum Zeilenende zu lschen.
+
+---> Jemand hat das Ende der Zeile doppelt eingegeben. doppelt eingegeben.
+
+
+ 5. Gehe weiter zur Lektion 2.3 , um zu verstehen, was hierbei vorgeht.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.3: BER OPERATOREN UND BEWEGUNGSZGE
+
+
+ Viele Kommandos, die Text ndern, setzen sich aus einem Operator und einer
+ Bewegung zusammen. Das Format fr ein Lschkommando mit dem Lschoperator d
+ lautet wie folgt:
+
+ d Bewegung
+
+ wobei:
+ d - der Lschoperator
+ Bewegung - worauf der Lschoperator angewandt wird (unten aufgefhrt).
+
+ Eine kleine Auflistung von Bewegungen:
+ w - bis zum Beginn des nchsten Wortes OHNE dessen erstes Zeichen.
+ e - zum Ende des aktuellen Wortes MIT dessen letztem Zeichen.
+ $ - zum Ende der Zeile MIT dem letzten Zeichen.
+
+ Dementsprechend lscht die Eingabe von de vom Cursor an bis zum Wortende.
+
+Anmerkung: Die Eingabe lediglich des Bewegungsteils im Normalmodus bewegt den
+ Cursor entsprechend.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.4: ANWENDUNG EINES ZHLERS FR EINEN BEWEGUNGSSCHRITT
+
+
+ ** Die Eingabe einer Zahl vor einem Bewegungsschritt wiederholt diesen. **
+
+ 1. Bewege den Cursor zum Beginn der mit ---> markierten Zeile unten.
+
+ 2. Tippe 2w , um den Cursor zwei Wrter vorwrts zu bewegen.
+
+ 3. Tippe 3e , um den Cursor zum Ende des dritten Wortes zu bewegen.
+
+ 4. Tippe 0 (Null) , um zum Anfang der Zeile zu gelangen.
+
+ 5. Wiederhole Schritte 2 und 3 mit verschiedenen Nummern.
+
+ ---> Dies ist nur eine Zeile aus Wrtern, um sich darin herumzubewegen.
+
+ 6. Gehe weiter zu Lektion 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.5: ANWENDUNG EINES ZHLERS FR MEHRERE LSCHVORGNGE
+
+
+ ** Die Eingabe einer Zahl mit einem Operator wiederholt diesen mehrfach. **
+
+ In der Kombination aus Lschoperator und Bewegungsschritt (siehe oben)
+ stellt man, um mehr zu lschen dem Schritt einen Zhler voran:
+ d Nummer Bewegungsschritt
+
+ 1. Bewege den Cursor zum ersten Wort in GROSSBUCHSTABEN in der mit --->
+ markieren Zeile.
+
+ 2. Tippe d2w , um die zwei Wrter in GROSSBUCHSTABEN zu lschen.
+
+ 3. Wiederhole Schritte 1 und 2 mit einem anderen Zhler, um die darauffol-
+ genden Wrter in GROSSBUCHSTABEN mit einem einzigen Kommando zu lschen.
+
+---> Diese ABC DE Zeile FGHI JK LMN OP mit Wrtern ist Q RS TUV bereinigt.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.6: ARBEITEN AUF ZEILEN
+
+
+ ** Tippe dd , um eine ganze Zeile zu lschen. **
+
+ Wegen der Hufigkeit, dass man ganze Zeilen lscht, kamen die Entwickler von
+ Vi darauf, dass es leichter wre, einfach zwei d's einzugeben, um eine Zeile
+ zu lschen.
+
+ 1. Bewege den Cursor zur zweiten Zeile in der unten stehenden Redewendung.
+ 2. Tippe dd , um die Zeile zu lschen.
+ 3. Nun bewege Dich zur vierten Zeile.
+ 4. Tippe 2dd , um zwei Zeilen zu lschen.
+
+---> 1) Rosen sind rot,
+---> 2) Matsch ist lustig,
+---> 3) Veilchen sind blau,
+---> 4) Ich habe ein Auto,
+---> 5) Die Uhr sagt die Zeit,
+---> 6) Zucker ist s,
+---> 7) So wie Du auch.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.7: RCKGNGIG MACHEN (UNDO)
+
+
+ ** Tippe u , um die letzten Kommandos rckgngig zu machen **
+ ** oder U , um eine ganze Zeile wiederherzustellen. **
+
+ 1. Bewege den Cursor zu der mit ---> markierten Zeile unten
+ und setze ihn auf den ersten Fehler.
+ 2. Tippe x , um das erste unerwnschte Zeichen zu lschen.
+ 3. Nun tippe u , um das soeben ausgefhrte Kommando rckgngig zu machen.
+ 4. Jetzt behebe alle Fehler auf der Zeile mit Hilfe des x Kommandos.
+ 5. Nun tippe ein groes U , um die Zeile in ihren Ursprungszustand
+ wiederherzustellen.
+ 6. Nun tippe u einige Male, um das U und die vorhergehenden Kommandos
+ rckgngig zu machen.
+ 7. Nun tippe CTRL-R (halte CTRL gedrckt und drcke R) mehrere Male, um die
+ Kommandos wiederherzustellen (die Rckgngigmachungen rckgngig machen).
+
+---> Beehebe die Fehller diesser Zeile und sttelle sie mitt 'undo' wieder her.
+
+ 8. Dies sind sehr ntzliche Kommandos. Nun gehe weiter zur Zusammenfassung
+ von Lektion 2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 2
+
+
+ 1. Um vom Cursor bis zum nchsten Wort zu lschen, tippe: dw
+ 2. Um vom Cursor bis zum Ende einer Zeile zu lschen, tippe: d$
+ 3. Um eine ganze Zeile zu lschen, tippe: dd
+
+ 4. Um eine Bewegung zu wiederholen, stelle eine Nummer voran: 2w
+ 5. Das Format fr ein nderungskommando ist:
+ Operator [Anzahl] Bewegungsschritt
+ wobei:
+ Operator - gibt an, was getan werden soll, zum Beispiel d fr delete
+ [Anzahl] - ein optionaler Zhler, um den Bewegungsschritt zu wiederholen
+ Bewegungsschritt - Bewegung ber den zu ndernden Text, wie
+ w (Wort), $ (zum Ende der Zeile), etc.
+
+ 6. Um Dich zum Anfang der Zeile zu begeben, benutze die Null: 0
+
+ 7. Um vorherige Aktionen rckgngig zu machen, tippe: u (kleines u)
+ Um alle nderungen auf einer Zeile rckgngig zu machen: U (groes U)
+ Um die Rckgngigmachungen rckgngig zu machen, tippe: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.1: ANFGEN (PUT)
+
+
+ ** Tippe p , um vorher gelschten Text nach dem Cursor anzufgen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 2. Tippe dd , um die Zeile zu lschen und sie in einem Vim-Register zu
+ speichern.
+
+ 3. Bewege den Cursor zur Zeile c), BER derjenigen, wo die gelschte Zeile
+ platziert werden soll.
+
+ 4. Tippe p , um die Zeile unterhalb des Cursors zu platzieren.
+
+ 5. Wiederhole die Schritte 2 bis 4, um alle Zeilen in die richtige
+ Reihenfolge zu bringen.
+
+---> d) Kannst Du das auch?
+---> b) Veilchen sind blau,
+---> c) Intelligenz ist lernbar,
+---> a) Rosen sind rot,
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.2: ERSETZEN (REPLACE)
+
+
+ ** Tippe rx , um das Zeichen unter dem Cursor durch x zu ersetzen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 2. Bewege den Cursor, bis er sich auf dem ersten Fehler befindet.
+
+ 3. Tippe r und anschlieend das Zeichen, welches dort stehen sollte.
+
+ 4. Wiederhole Schritte 2 und 3, bis die erste Zeile gleich der zweiten ist.
+
+---> Alf diese Zeite eingegoben wurde, wurden einike falsche Tasten gelippt!
+---> Als diese Zeile eingegeben wurde, wurden einige falsche Tasten getippt!
+
+ 5. Nun fahre fort mit Lektion 3.2.
+
+Anmerkung: Erinnere Dich daran, dass Du durch Anwenden lernen solltest, nicht
+ durch Auswendiglernen.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.3: NDERN (CHANGE)
+
+
+ ** Um eine nderung bis zum Wortende durchzufhren, tippe ce . **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 2. Platziere den Cursor auf das s von Wstwr.
+
+ 3. Tippe ce und die Wortkorrektur ein (in diesem Fall tippe rter ).
+
+ 4. Drcke <ESC> und bewege den Cursor zum nchsten zu ndernden Zeichen.
+
+ 5. Wiederhole Schritte 3 und 4 bis der erste Satz gleich dem zweiten ist.
+
+---> Einige Wstwr dieser Zlaww lasdjlaf mit dem ndern-Operator gaaauu werden.
+---> Einige Wrter dieser Zeile sollen mit dem ndern-Operator gendert werden.
+
+Beachte, dass ce das Wort lscht und Dich in den Eingabemodus versetzt.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.4: MEHR NDERUNGEN MITTELS c
+
+
+ ** Das change-Kommando arbeitet mit denselben Bewegungen wie delete. **
+
+ 1. Der change Operator arbeitet in gleicher Weise wie delete. Das Format ist:
+
+ c [Anzahl] Bewegungsschritt
+
+ 2. Die Bewegungsschritte sind die gleichen , so wie w (Wort) und $
+ (Zeilenende).
+
+ 3. Bewege Dich zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 4. Bewege den Cursor zum ersten Fehler.
+
+ 5. Tippe c$ , gib den Rest der Zeile wie in der zweiten ein, drcke <ESC> .
+
+---> Das Ende dieser Zeile soll an die zweite Zeile angeglichen werden.
+---> Das Ende dieser Zeile soll mit dem c$ Kommando korrigiert werden.
+
+Anmerkung: Du kannst die Rcktaste benutzen, um Tippfehler zu korrigieren.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 3
+
+
+ 1. Um einen vorher gelschten Text anzufgen, tippe p . Dies fgt den
+ gelschten Text NACH dem Cursor an (wenn eine ganze Zeile gelscht wurde,
+ wird diese in die Zeile unter dem Cursor eingefgt).
+
+ 2. Um das Zeichen unter dem Cursor zu ersetzen, tippe r und danach das
+ an dieser Stelle gewollte Zeichen.
+
+ 3. Der nderungs- (change) Operator erlaubt, vom Cursor bis zum Ende des
+ Bewegungsschrittes zu ndern. Tippe ce , um eine nderung vom Cursor bis
+ zum Ende des Wortes vorzunehmen; c$ bis zum Ende einer Zeile.
+
+ 4. Das Format fr change ist:
+
+ c [Anzahl] Bewegungsschritt
+
+ Nun fahre mit der nchsten Lektion fort.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.1: CURSORPOSITION UND DATEISTATUS
+
+ ** Tippe CTRL-G , um deine Dateiposition sowie den Dateistatus anzuzeigen. **
+ ** Tippe G , um Dich zu einer Zeile in der Datei zu begeben. **
+
+Anmerkung: Lies diese gesamte Lektion, bevor Du irgendeinen Schritt ausfhrst!!
+
+ 1. Halte die Ctrl Taste unten und drcke g . Dies nennen wir CTRL-G.
+ Eine Statusmeldung am Fu der Seite erscheint mit dem Dateinamen und der
+ Position innerhalb der Datei. Merke Dir die Zeilennummer fr Schritt 3.
+
+Anmerkung: Mglicherweise siehst Du die Cursorposition in der unteren rechten
+ Bildschirmecke. Dies ist Auswirkung der 'ruler' Option
+ (siehe :help 'ruler')
+
+ 2. Drcke G , um Dich zum Ende der Datei zu begeben.
+ Tippe gg , um Dich zum Anfang der Datei zu begeben.
+
+ 3. Gib die Nummer der Zeile ein, auf der Du vorher warst, gefolgt von G .
+ Dies bringt Dich zurck zu der Zeile, auf der Du gestanden hast, als Du
+ das erste Mal CTRL-G gedrckt hast.
+
+ 4. Wenn Du Dich sicher genug fhlst, fhre die Schritte 1 bis 3 aus.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.2: DAS SUCHEN - KOMMANDO
+
+
+ ** Tippe / gefolgt von einem Ausdruck, um nach dem Ausdruck zu suchen. **
+
+ 1. Im Normalmodus, tippe das / Zeichen. Beachte, dass das / und der
+ Cursor am Fu des Schirms erscheinen, so wie beim : Kommando.
+
+ 2. Nun tippe 'Fehhler' <ENTER>. Dies ist das Wort, nach dem Du suchen willst.
+
+ 3. Um nach demselben Ausdruck weiterzusuchen, tippe einfach n (fr next).
+ Um nach demselben Ausdruck in der Gegenrichtung zu suchen, tippe N .
+
+ 4. Um nach einem Ausdruck rckwrts zu suchen , benutze ? statt / .
+
+ 5. Um dahin zurckzukehren, von wo Du gekommen bist, drcke CTRL-O (Halte
+ Ctrl unten und drcke den Buchstaben o). Wiederhole dies, um noch weiter
+ zurckzugehen. CTRL-I geht vorwrts.
+
+---> Fehler schreibt sich nicht "Fehhler"; Fehhler ist ein Fehler
+Anmerkung: Wenn die Suche das Dateiende erreicht hat, wird sie am Anfang
+ fortgesetzt, es sei denn, die 'wrapscan' Option wurde abgeschaltet.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.3: PASSENDE KLAMMERN FINDEN
+
+
+ ** Tippe % , um eine gegenberliegenden Klammer ),], oder } zu finden. **
+
+ 1. Platziere den Cursor auf irgendeinem der Zeichen (, [, oder { in der unten
+ stehenden Zeile, die mit ---> markiert ist.
+
+ 2. Nun tippe das % Zeichen.
+
+ 3. Der Cursor bewegt sich zur passenden gegenberliegenden Klammer.
+
+ 4. Tippe % , um den Cursor zur passenden anderen Klammer zu bewegen.
+
+ 5. Setze den Cursor auf ein anderes (,),[,],{ oder } und probiere % aus.
+
+---> Dies ( ist eine Testzeile ( mit [ verschiedenen ] { Klammern } darin. ))
+
+Anmerkung: Diese Funktionalitt ist sehr ntzlich bei der Fehlersuche in einem
+ Programmtext, in dem passende Klammern fehlen!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.4: DAS ERSETZUNGSKOMMANDO (SUBSTITUTE)
+
+
+ ** Tippe :s/alt/neu/g , um 'alt' durch 'neu' zu ersetzen. **
+
+ 1. Bewege den Cursor zu der unten stehenden mit ---> markierten Zeile.
+
+ 2. Tippe :s/diee/die <ENTER> . Beachte, dass der Befehl nur das erste
+ Vorkommen von "diee" ersetzt.
+
+ 3. Nun tippe :s/diee/die/g . Das Zufgen des Flags g bedeutet, eine
+ globale Ersetzung ber die Zeile durchzufhren, dies ersetzt alle
+ Vorkommen von "diee" auf der Zeile.
+
+---> diee schnste Zeit, um diee Blumen anzuschauen, ist diee Frhlingszeit.
+
+ 4. Um alle Vorkommen einer Zeichenkette innerhalb zweier Zeilen zu ndern,
+ tippe :#,#s/alt/neu/g wobei #,# die Zeilennummern des Bereiches sind,
+ in dem die Ersetzung durchgefhrt werden soll.
+ Tippe :%s/alt/neu/g um alle Vorkommen in der gesamten Datei zu ndern.
+ Tippe :%s/alt/neu/gc um alle Vorkommen in der gesamten Datei zu finden
+ mit einem Fragedialog, ob ersetzt werden soll oder nicht.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 4
+
+ 1. CTRL-G zeigt die aktuelle Dateiposition sowie den Dateistatus.
+ G bringt Dich zum Ende der Datei.
+ Nummer G bringt Dich zur entsprechenden Zeilennummer.
+ gg bringt Dich zur ersten Zeile.
+
+ 2. Die Eingabe von / plus einem Ausdruck sucht VORWRTS nach dem Ausdruck.
+ Die Eingabe von ? plus einem Ausdruck sucht RCKWRTS nach dem Ausdruck.
+ Tippe nach einer Suche n , um das nchste Vorkommen in der gleichen
+ Richtung zu finden; oder N , um in der Gegenrichtung zu suchen.
+ CTRL-O bringt Dich zurck zu lteren Positionen, CTRL-I zu neueren.
+
+ 3. Die Eingabe von % , wenn der Cursor sich auf (,),[,],{, oder }
+ befindet, bringt Dich zur Gegenklammer.
+
+ 4. Um das erste Vorkommen von "alt" in einer Zeile durch "neu" zu ersetzen,
+ tippe :s/alt/neu
+ Um alle Vorkommen von "alt" in der Zeile ersetzen, tippe :s/alt/neu/g
+ Um Ausdrcke innerhalb zweier Zeilen # zu ersetzen :#,#s/alt/neu/g
+ Um alle Vorkommen in der ganzen Datei zu ersetzen, tippe :%s/alt/neu/g
+ Fr eine jedesmalige Besttigung, addiere 'c' (confirm) :%s/alt/neu/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.1: AUSFHREN EINES EXTERNEN KOMMANDOS
+
+
+ ** Gib :! , gefolgt von einem externen Kommando ein, um es auszufhren. **
+
+ 1. Tippe das vertraute Kommando : , um den Cursor auf den Fu des Schirms
+ zu setzen. Dies erlaubt Dir, ein Kommandozeilen-Kommando einzugeben.
+
+ 2. Nun tippe ein ! (Ausrufezeichen). Dies ermglicht Dir, ein beliebiges,
+ externes Shellkommando auszufhren.
+
+ 3. Als Beispiel tippe ls nach dem ! und drcke <ENTER>. Dies liefert
+ eine Auflistung deines Verzeichnisses; genauso, als wenn Du in der
+ Eingabeaufforderung wrst. Oder verwende :!dir , falls ls nicht geht.
+
+Anmerkung: Mit dieser Methode kann jedes beliebige externe Kommando
+ ausgefhrt werden, auch mit Argumenten.
+
+Anmerkung: Alle : Kommandos mssen durch Eingabe von <ENTER>
+ abgeschlossen werden. Von jetzt an erwhnen wir dies nicht jedesmal.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.2: MEHR BER DAS SCHREIBEN VON DATEIEN
+
+
+** Um am Text durchgefhrte nderungen zu speichern, tippe :w DATEINAME. **
+
+ 1. Tippe :!dir oder :!ls , um eine Auflistung deines Verzeichnisses zu
+ erhalten. Du weit nun bereits, dass Du danach <ENTER> eingeben musst.
+
+ 2. Whle einen Dateinamen, der noch nicht existiert, z.B. TEST.
+
+ 3. Nun tippe: :w TEST (wobei TEST der gewhlte Dateiname ist).
+
+ 4. Dies speichert die ganze Datei (den Vim Tutor) unter dem Namen TEST.
+ Um dies zu berprfen, tippe nochmals :!ls bzw. !dir, um deinen
+ Verzeichnisinhalt zu sehen.
+
+Anmerkung: Wrdest Du Vim jetzt beenden und danach wieder mit vim TEST
+ starten, dann wre diese Datei eine exakte Kopie des Tutors zu dem
+ Zeitpunkt, als Du ihn gespeichert hast.
+
+ 5. Nun entferne die Datei durch Eingabe von (MS-DOS): :!del TEST
+ oder (Unix): :!rm TEST
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.3: AUSWHLEN VON TEXT ZUM SCHREIBEN
+
+** Um einen Abschnitt der Datei zu speichern, tippe v Bewegung :w DATEI **
+
+ 1. Bewege den Cursor zu dieser Zeile.
+
+ 2. Tippe v und bewege den Cursor zum fnften Auflistungspunkt unten.
+ Beachte, dass der Text hervorgehoben wird.
+
+ 3. Drcke das Zeichen : . Am Fu des Schirms erscheint :'<,'> .
+
+ 4. Tippe w TEST , wobei TEST ein noch nicht vorhandener Dateiname ist.
+ Vergewissere Dich, dass Du :'<,'>w TEST siehst, bevor Du <ENTER> drckst.
+
+ 5. Vim schreibt die ausgewhlten Zeilen in die Datei TEST. Benutze :!dir
+ oder :!ls , um sie zu sehen. Lsche sie noch nicht! Wir werden sie in
+ der nchsten Lektion benutzen.
+
+Hinweis: Drcken von v startet die Visuelle Auswahl. Du kannst den Cursor
+ umherbewegen, um die Auswahl zu vergrern oder zu verkleinern. Anschlieend
+ lsst sich ein Operator anwenden, um mit dem Text etwas zu tun. Zum Beispiel
+ lscht d den Text.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.4: EINLESEN UND ZUSAMMENFHREN VON DATEIEN
+
+
+ ** Um den Inhalt einer Datei einzulesen, tippe :r DATEINAME **
+
+ 1. Platziere den Cursor direkt ber dieser Zeile.
+
+BEACHTE: Nachdem Du Schritt 2 ausgefhrt hast, wirst Du Text aus Lektion 5.3
+ sehen. Dann bewege Dich wieder ABWRTS, Lektion 5.4 wiederzusehen.
+
+ 2. Nun lies deine Datei TEST ein indem Du das Kommando :r TEST ausfhrst,
+ wobei TEST der von Dir verwendete Dateiname ist.
+ Die eingelesene Datei wird unterhalb der Cursorzeile eingefgt.
+
+ 3. Um zu berprfen, dass die Datei eingelesen wurde, gehe zurck und
+ beachte, dass es jetzt zwei Kopien von Lektion 5.3 gibt, das Original und
+ die eingefgte Dateiversion.
+
+Anmerkung: Du kannst auch die Ausgabe eines externen Kommandos einlesen. Zum
+ Beispiel liest :r !ls die Ausgabe des Kommandos ls ein und platziert
+ sie unterhalb des Cursors.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 5
+
+
+ 1. :!Kommando fhrt ein externes Kommando aus.
+
+ Einige ntzliche Beispiele sind
+ (MS-DOS) (Unix)
+ :!dir :!ls - zeigt eine Verzeichnisauflistung.
+ :!del DATEINAME :!rm DATEINAME - entfernt Datei DATEINAME.
+
+ 2. :w DATEINAME speichert die aktuelle Vim-Datei unter dem Namen DATEINAME.
+
+ 3. v Bewegung :w DATEINAME schreibt die Visuell ausgewhlten Zeilen in
+ die Datei DATEINAME.
+
+ 4. :r DATEINAME ldt die Datei DATEINAME und fgt sie unterhalb der
+ Cursorposition ein.
+
+ 5. :r !dir liest die Ausgabe des Kommandos dir und fgt sie unterhalb der
+ Cursorposition ein.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.1: ZEILEN FFNEN (OPEN)
+
+
+ ** Tippe o , um eine Zeile unterhalb des Cursors zu ffnen und Dich in **
+ ** den Einfgemodus zu begeben. **
+
+ 1. Bewege den Cursor zu der ersten mit ---> markierten Zeile unten.
+
+ 2. Tippe o (klein geschrieben), um eine Zeile UNTERHALB des Cursors zu ffnen
+ und Dich in den Einfgemodus zu begeben.
+
+ 3. Nun tippe etwas Text und drcke <ESC> , um den Einfgemodus zu verlassen.
+
+---> Mit o wird der Cursor auf der offenen Zeile im Einfgemodus platziert.
+
+ 4. Um eine Zeile BERHALB des Cursors aufzumachen, gib einfach ein groes O
+ statt einem kleinen o ein. Versuche dies auf der unten stehenden Zeile.
+
+---> ffne eine Zeile ber dieser mit O , wenn der Cursor auf dieser Zeile ist.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.2: TEXT ANFGEN (APPEND)
+
+
+ ** Tippe a , um Text NACH dem Cursor einzufgen. **
+
+ 1. Bewege den Cursor zum Anfang der ersten bungszeile mit ---> unten.
+
+ 2. Drcke e , bis der Cursor am Ende von Zei steht.
+
+ 3. Tippe ein kleines a , um Text NACH dem Cursor anzufgen.
+
+ 4. Vervollstndige das Wort so wie in der Zeile darunter. Drcke <ESC> ,
+ um den Einfgemodus zu verlassen.
+
+ 5. Bewege Dich mit e zum nchsten unvollstndigen Wort und wiederhole
+ Schritte 3 und 4.
+
+---> Diese Zei bietet Gelegen , Text in einer Zeile anzuf.
+---> Diese Zeile bietet Gelegenheit, Text in einer Zeile anzufgen.
+
+Anmerkung: a, i und A gehen alle gleichermaen in den Einfgemodus; der
+ einzige Unterschied ist, wo die Zeichen eingefgt werden.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.3: EINE ANDERE ART DES ERSETZENS (REPLACE)
+
+
+ ** Tippe ein groes R , um mehr als ein Zeichen zu ersetzen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden, mit ---> markierten Zeile.
+ Bewege den Cursor zum Anfang des ersten xxx .
+
+ 2. Nun drcke R und tippe die Nummer, die darunter in der zweiten Zeile
+ steht, so dass diese das xxx ersetzt.
+
+ 3. Drcke <ESC> , um den Ersetzungsmodus zu verlassen. Beachte, dass der Rest
+ der Zeile unverndert bleibt.
+
+ 4. Wiederhole die Schritte, um das verbliebene xxx zu ersetzen.
+
+---> Das Addieren von 123 zu xxx ergibt xxx.
+---> Das Addieren von 123 zu 456 ergibt 579.
+
+Anmerkung: Der Ersetzungsmodus ist wie der Einfgemodus, aber jedes eingetippte
+ Zeichen lscht ein vorhandenes Zeichen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.4: TEXT KOPIEREN UND EINFGEN
+
+ ** Benutze den y Operator, um Text zu kopieren; p , um ihn einzufgen **
+
+ 1. Gehe zu der mit ---> markierten Zeile unten; setze den Cursor hinter "a)".
+
+ 2. Starte den Visuellen Modus mit v , bewege den Cursor genau vor "erste".
+
+ 3. Tippe y , um den hervorgehoben Text zu kopieren.
+
+ 4. Bewege den Cursor zum Ende der nchsten Zeile: j$
+
+ 5. Tippe p , um den Text einzufgen und anschlieend: a zweite <ESC> .
+
+ 6. Benutze den Visuellen Modus, um " Eintrag." auszuwhlen, kopiere mittels
+ y , bewege Dich zum Ende der nchsten Zeile mit j$ und fge den Text
+ dort mit p an.
+
+---> a) dies ist der erste Eintrag.
+ b)
+
+Anmerkung: Du kannst y auch als Operator verwenden; yw kopiert ein Wort.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.5: OPTIONEN SETZEN
+
+ ** Setze eine Option so, dass eine Suche oder Ersetzung Gro- **
+ ** und Kleinschreibung ignoriert **
+
+ 1. Suche nach 'ignoriere', indem Du /ignoriere eingibst.
+ Wiederhole die Suche einige Male, indem Du die n - Taste drckst.
+
+ 2. Setze die 'ic' (Ignore case) - Option, indem Du :set ic eingibst.
+
+ 3. Nun suche wieder nach 'ignoriere', indem Du n tippst.
+ Beachte, dass jetzt Ignoriere und auch IGNORIERE gefunden wird.
+
+ 4. Setze die 'hlsearch' und 'incsearch' - Optionen: :set hls is
+
+ 5. Wiederhole die Suche und beobachte, was passiert: /ignoriere <ENTER>
+
+ 6. Um das Ignorieren von Gro/Kleinschreibung abzuschalten, tippe: :set noic
+
+Anmerkung: Um die Hervorhebung der Treffer zu entfernen, gib ein: :nohlsearch
+Anmerkung: Um die Schreibweise fr eine einzige Suche zu ignorieren, benutze \c
+ im Suchausdruck: /ignoriere\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 6
+
+ 1. Tippe o , um eine Zeile UNTER dem Cursor zu ffnen und den Einfgemodus
+ zu starten
+ Tippe O , um eine Zeile BER dem Cursor zu ffnen.
+
+ 2. Tippe a , um Text NACH dem Cursor anzufgen.
+ Tippe A , um Text nach dem Zeilenende anzufgen.
+
+ 3. Das Kommando e bringt Dich zum Ende eines Wortes.
+
+ 4. Der Operator y (yank) kopiert Text, p (put) fgt ihn ein.
+
+ 5. Ein groes R geht in den Ersetzungsmodus bis zum Drcken von <ESC> .
+
+ 6. Die Eingabe von ":set xxx" setzt die Option "xxx". Einige Optionen sind:
+ 'ic' 'ignorecase' Ignoriere Gro/Kleinschreibung bei einer Suche
+ 'is' 'incsearch' Zeige Teilbereinstimmungen fr einen Suchausdruck
+ 'hls' 'hlsearch' Hebe alle passenden Ausdrcke hervor
+ Der Optionsname kann in der Kurz- oder der Langform angegeben werden.
+
+ 7. Stelle einer Option "no" voran, um sie abzuschalten: :set noic
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.1 : AUFRUFEN VON HILFE
+
+
+ ** Nutze das eingebaute Hilfesystem **
+
+ Vim besitzt ein umfassendes eingebautes Hilfesystem. Fr den Anfang probiere
+ eins der drei folgenden Dinge aus:
+ - Drcke die <Hilfe> - Taste (falls Du eine besitzt)
+ - Drcke die <F1> Taste (falls Du eine besitzt)
+ - Tippe :help <ENTER>
+
+ Lies den Text im Hilfefenster, um zu verstehen wie die Hilfe funktioniert.
+ Tippe CTRL-W CTRL-W , um von einem Fenster zum anderen zu springen.
+ Tippe :q <ENTER> , um das Hilfefenster zu schlieen.
+
+ Du kannst Hilfe zu praktisch jedem Thema finden, indem Du dem ":help"-
+ Kommando ein Argument gibst. Probiere folgendes (<ENTER> nicht vergessen):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.2: ERSTELLE EIN START-SKRIPT
+
+
+ ** Aktiviere die Features von Vim **
+
+ Vim besitzt viele Funktionalitten, die ber Vi hinausgehen, aber die meisten
+ von ihnen sind standardmig deaktiviert. Um mehr Funktionalitten zu nutzen,
+ musst Du eine "vimrc" - Datei erstellen.
+
+ 1. Starte das Editieren der "vimrc"-Datei, abhngig von deinem System:
+ :e ~/.vimrc fr Unix
+ :e ~/_vimrc fr MS-Windows
+
+ 2. Nun lies den Inhalt der Beispiel-"vimrc"-Datei ein:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Speichere die Datei mit:
+ :w
+
+ Beim nchsten Start von Vim wird die Syntaxhervorhebung aktiviert sein.
+ Du kannst all deine bevorzugten Optionen zu dieser "vimrc"-Datei zufgen.
+ Fr mehr Informationen tippe :help vimrc-intro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.3: VERVOLLSTNDIGEN
+
+
+ ** Kommandozeilenvervollstndigung mit CTRL-D und <TAB> **
+
+ 1. Stelle sicher, dass Vim nicht im Vi-Kompatibilittsmodus ist: :set nocp
+
+ 2. Siehe nach, welche Dateien im Verzeichnis existieren: :!ls oder :!dir
+
+ 3. Tippe den Beginn eines Kommandos: :e
+
+ 4. Drcke CTRL-D und Vim zeigt eine Liste mit "e" beginnender Kommandos.
+
+ 5. Drcke <TAB> und Vim vervollstndigt den Kommandonamen zu ":edit".
+
+ 6. Nun fge ein Leerzeichen und den Anfang einer existierenden Datei an:
+ :edit DAT
+
+ 7. Drcke <TAB>. Vim vervollstndigt den Namen (falls er eindeutig ist).
+
+Anmerkung: Vervollstndigung funktioniert fr viele Kommandos. Probiere
+ einfach CTRL-D und <TAB>. Dies ist insbesondere ntzlich fr :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 7
+
+
+ 1. Tippe :help oder drcke <F1> oder <Help>, um ein Hilfefenster zu ffnen.
+
+ 2. Tippe :help Kommando , um Hilfe ber Kommando zu erhalten.
+
+ 3. Tippe CTRL-W CTRL-W , um zum anderen Fenster zu springen.
+
+ 4. Tippe :q , um das Hilfefenster zu schlieen.
+
+ 5. Erstelle ein vimrc - Startskript mit deinen bevorzugter Einstellungen.
+
+ 6. Drcke CTRL-D nach dem Tippen eines : Kommandos, um mgliche
+ Vervollstndigungen anzusehen.
+ Drcke <TAB> , um eine Vervollstndigung zu anzuwenden.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Damit ist der Vim Tutor beendet. Seine Intention war, einen kurzen und
+ bndigen berblick ber den Vim Editor zu geben; gerade genug, um relativ
+ leicht mit ihm umgehen zu knnen. Der Vim Tutor hat nicht den geringsten
+ Anspruch auf Vollstndigkeit; Vim hat noch weitaus mehr Kommandos. Lies als
+ nchstes das User Manual: ":help user-manual".
+
+ Fr weiteres Lesen und Lernen ist folgendes Buch empfehlenswert :
+ Vim - Vi Improved - von Steve Oualline
+ Verlag: New Riders
+ Das erste Buch, welches durchgngig Vim gewidmet ist. Besonders ntzlich
+ fr Anfnger. Viele Beispiele und Bilder sind enthalten.
+ Siehe https://iccf-holland.org/click5.html
+
+ Folgendes Buch ist lter und mehr ber Vi als Vim, aber auch empfehlenswert:
+ Textbearbeitung mit dem Vi-Editor - von Linda Lamb und Arnold Robbins
+ Verlag O'Reilly - ISBN: 3897211262
+ In diesem Buch kann man fast alles finden, was man mit Vi tun mchte.
+ Die sechste Ausgabe enthlt auch Informationen ber Vim.
+
+ Als aktuelle Referenz fr Version 6.2 und knappe Einfhrung dient das
+ folgende Buch:
+ vim ge-packt von Reinhard Wobst
+ mitp-Verlag, ISBN 3-8266-1425-9
+ Trotz der kompakten Darstellung ist es durch viele ntzliche Beispiele auch
+ fr Einsteiger empfehlenswert. Probekapitel und die Beispielskripte sind
+ online erhltlich. Siehe https://iccf-holland.org/click5.html
+
+ Dieses Tutorial wurde geschrieben von Michael C. Pierce und Robert K. Ware,
+ Colorado School of Mines. Es benutzt Ideen, die Charles Smith, Colorado State
+ University, zur Verfgung stellte. E-Mail: bware@mines.colorado.edu.
+
+ Bearbeitet fr Vim von Bram Moolenaar.
+ Deutsche bersetzung von Joachim Hofmann 2015. E-Mail: Joachim.Hof@gmx.de
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.de.utf-8 b/runtime/tutor/tutor.de.utf-8
new file mode 100644
index 0000000..9a5b592
--- /dev/null
+++ b/runtime/tutor/tutor.de.utf-8
@@ -0,0 +1,982 @@
+===============================================================================
+= W i l l k o m m e n im V I M T u t o r - Version 1.7.de.1 =
+===============================================================================
+
+ Vim ist ein sehr mächtiger Editor, der viele Befehle bereitstellt; zu viele,
+ um alle in einem Tutor wie diesem zu erklären. Dieser Tutor ist so
+ gestaltet, um genug Befehle vorzustellen, dass Du die Fähigkeit erlangst,
+ Vim mit Leichtigkeit als einen Allzweck-Editor zu verwenden.
+ Die Zeit für das Durcharbeiten dieses Tutors beträgt ca. 25-30 Minuten,
+ abhängig davon, wie viel Zeit Du mit Experimentieren verbringst.
+
+ ACHTUNG:
+ Die in den Lektionen angewendeten Kommandos werden den Text modifizieren.
+ Erstelle eine Kopie dieser Datei, in der Du üben willst (falls Du "vimtutor"
+ aufgerufen hast, ist dies bereits eine Kopie).
+
+ Es ist wichtig, sich zu vergegenwärtigen, dass dieser Tutor für das Anwenden
+ konzipiert ist. Das bedeutet, dass Du die Befehle anwenden musst, um sie
+ richtig zu lernen. Wenn Du nur den Text liest, vergisst Du die Befehle!
+
+ Jetzt stelle sicher, dass deine Umstelltaste NICHT gedrückt ist und betätige
+ die j Taste genügend Mal, um den Cursor nach unten zu bewegen, so dass
+ Lektion 1.1 den Bildschirm vollkommen ausfüllt.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.1: BEWEGEN DES CURSORS
+
+ ** Um den Cursor zu bewegen, drücke die h,j,k,l Tasten wie unten gezeigt. **
+ ^ Hilfestellung:
+ k Die h Taste befindet sich links und bewegt nach links.
+ < h l > Die l Taste liegt rechts und bewegt nach rechts.
+ j Die j Taste ähnelt einem Pfeil nach unten.
+ v
+ 1. Bewege den Cursor auf dem Bildschirm umher, bis Du Dich sicher fühlst.
+
+ 2. Halte die Nach-Unten-Taste (j) gedrückt, bis sie sich wiederholt.
+ Jetzt weißt Du, wie Du Dich zur nächsten Lektion bewegen kannst.
+
+ 3. Benutze die Nach-Unten-Taste, um Dich zu Lektion 1.2 zu bewegen.
+
+Anmerkung: Immer, wenn Du Dir unsicher bist über das, was Du getippt hast,
+ drücke <ESC> , um Dich in den Normalmodus zu begeben.
+ Dann gib das gewünschte Kommando noch einmal ein.
+
+Anmerkung: Die Cursor-Tasten sollten ebenfalls funktionieren. Aber wenn Du
+ hjkl benutzt, wirst Du in der Lage sein, Dich sehr viel schneller
+ umherzubewegen, wenn Du Dich einmal daran gewöhnt hast. Wirklich!
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.2: VIM BEENDEN
+
+
+ !! Hinweis: Bevor Du einen der unten aufgeführten Schritte ausführst, lies
+ diese gesamte Lektion!!
+
+ 1. Drücke die <ESC> Taste (um sicherzustellen, dass Du im Normalmodus bist).
+
+ 2. Tippe: :q! <ENTER>.
+ Dies beendet den Editor und VERWIRFT alle Änderungen, die Du gemacht hast.
+
+ 3. Wenn Du die Eingabeaufforderung siehst, gib das Kommando ein, das Dich zu
+ diesem Tutor geführt hat. Dies wäre: vimtutor <ENTER>
+
+ 4. Wenn Du Dir diese Schritte eingeprägt hast und Du Dich sicher fühlst,
+ führe Schritte 1 bis 3 aus, um den Editor zu verlassen und wieder
+ hineinzugelangen.
+
+Anmerkung: :q! <ENTER> verwirft alle Änderungen, die Du gemacht hast. Einige
+ Lektionen später lernst Du, die Änderungen in einer Datei zu speichern.
+
+ 5. Bewege den Cursor abwärts zu Lektion 1.3.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.3: TEXT EDITIEREN - LÖSCHEN
+
+
+ ** Drücke x , um das Zeichen unter dem Cursor zu löschen. **
+
+ 1. Bewege den Cursor zu der mit ---> markierten Zeile unten.
+
+ 2. Um die Fehler zu beheben, bewege den Cursor, bis er über dem Zeichen steht,
+ das gelöscht werden soll.
+
+ 3. Drücke die x Taste, um das unerwünschte Zeichen zu löschen.
+
+ 4. Wiederhole die Schritte 2 bis 4, bis der Satz korrekt ist.
+
+---> Die Kkuh sprangg übberr deen Moond.
+
+ 5. Nun, da die Zeile korrekt ist, gehe weiter zur Lektion 1.4.
+
+Anmerkung: Während Du durch diesen Tutor gehst, versuche nicht, auswendig zu
+ lernen, lerne vielmehr durch Anwenden.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.4: TEXT EDITIEREN - EINFÜGEN
+
+
+ ** Drücke i , um Text einzufügen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 2. Um die erste Zeile mit der zweiten gleichzumachen, bewege den Cursor auf
+ das erste Zeichen NACH der Stelle, an der Text eingefügt werden soll.
+
+ 3. Drücke i und gib die nötigen Ergänzungen ein.
+
+ 4. Wenn jeweils ein Fehler beseitigt ist, drücke <ESC> , um zum Normalmodus
+ zurückzukehren.
+ Wiederhole Schritte 2 bis 4, um den Satz zu korrigieren.
+
+---> In dieser ft etwas .
+---> In dieser Zeile fehlt etwas Text.
+
+ 5. Wenn Du Dich mit dem Einfügen von Text sicher fühlst, gehe zu Lektion 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.5: TEXT EDITIEREN - ANFÜGEN
+
+
+ ** Drücke A , um Text anzufügen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+ Dabei ist gleichgültig, auf welchem Zeichen der Zeile der Cursor steht.
+
+ 2. Drücke A und gib die erforderlichen Ergänzungen ein.
+
+ 3. Wenn das Anfügen abgeschlossen ist, drücke <ESC>, um in den Normalmodus
+ zurückzukehren.
+
+ 4. Bewege den Cursor zur zweiten mit ---> markierten Zeile und wiederhole
+ die Schritte 2 und 3, um den Satz zu auszubessern.
+
+---> In dieser Zeile feh
+ In dieser Zeile fehlt etwas Text.
+---> Auch hier steh
+ Auch hier steht etwas Unvollständiges.
+
+ 5. Wenn Du dich mit dem Anfügen von Text sicher fühlst, gehe zu Lektion 1.6.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.6: EINE DATEI EDITIEREN
+
+ ** Benutze :wq , um eine Datei zu speichern und Vim zu verlassen. **
+
+ !! Hinweis: Bevor Du einen der unten aufgeführten Schritte ausführst, lies
+ diese gesamte Lektion!!
+
+ 1. Verlasse den Editor so wie in Lektion 1.2: :q!
+ Oder, falls du Zugriff zu einem anderen Terminal hast, führe das
+ Folgende dort aus.
+
+ 2. Gib dieses Kommando in die Eingabeaufforderung ein: vim tutor <ENTER>
+ 'vim' ist der Aufruf des Editors, 'tutor' ist die zu editierende Datei.
+ Benutze eine Datei, die geändert werden darf.
+
+ 3. Füge Text ein oder lösche ihn, wie Du in den vorangehenden Lektionen
+ gelernt hast.
+
+ 4. Speichere die geänderte Datei und verlasse Vim mit: :wq <ENTER>
+
+ 5. Falls Du in Schritt 1 den vimtutor beendet hast, starte vimtutor neu und
+ bewege dich abwärts bis zur folgenden Zusammenfassung.
+
+ 6. Nachdem Du obige Schritte gelesen und verstanden hast: führe sie durch.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 1
+
+
+ 1. Der Cursor wird mit den Pfeiltasten oder den Tasten hjkl bewegt.
+ h (links) j (unten) k (aufwärts) l (rechts)
+
+ 2. Um Vim aus der Eingabeaufforderung zu starten, tippe: vim DATEI <ENTER>
+
+ 3. Um Vim zu verlassen und alle Änderungen zu verwerfen, tippe:
+ <ESC> :q! <ENTER> .
+
+ 4. Um das Zeichen unter dem Cursor zu löschen, tippe: x
+
+ 5. Um Text einzufügen oder anzufügen, tippe:
+ i Einzufügenden Text eingeben <ESC> Einfügen vor dem Cursor
+ A Anzufügenden Text eingeben <ESC> Anfügen nach dem Zeilenende
+
+Anmerkung: Drücken von <ESC> bringt Dich in den Normalmodus oder bricht ein
+ ungewolltes, erst teilweise eingegebenes Kommando ab.
+
+ Nun fahre mit Lektion 2 fort.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.1: LÖSCHKOMMANDOS
+
+
+ ** Tippe dw , um ein Wort zu löschen. **
+
+ 1. Drücke <ESC> , um sicherzustellen, dass Du im Normalmodus bist.
+
+ 2. Bewege den Cursor zu der mit ---> markierten Zeile unten.
+
+ 3. Bewege den Cursor zum Anfang eines Wortes, das gelöscht werden soll.
+
+ 4. Tippe dw , um das Wort zu entfernen.
+
+ Anmerkung: Der Buchstabe d erscheint auf der untersten Zeile des Schirms,
+ wenn Du ihn eingibst. Vim wartet darauf, dass Du w eingibst. Falls Du
+ ein anderes Zeichen als d siehst, hast Du etwas Falsches getippt;
+ drücke <ESC> und beginne noch einmal.
+
+---> Einige Wörter lustig gehören nicht Papier in diesen Satz.
+
+ 5. Wiederhole die Schritte 3 und 4, bis der Satz korrekt ist und gehe
+ zur Lektion 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.2: WEITERE LÖSCHKOMMANDOS
+
+
+ ** Tippe d$ , um bis zum Ende der Zeile zu löschen. **
+
+ 1. Drücke <ESC> , um sicherzustellen, dass Du im Normalmodus bist.
+
+ 2. Bewege den Cursor zu der mit ---> markierten Zeile unten.
+
+ 3. Bewege den Cursor zum Ende der korrekten Zeile (NACH dem ersten . ).
+
+ 4. Tippe d$ , um bis zum Zeilenende zu löschen.
+
+---> Jemand hat das Ende der Zeile doppelt eingegeben. doppelt eingegeben.
+
+
+ 5. Gehe weiter zur Lektion 2.3 , um zu verstehen, was hierbei vorgeht.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.3: ÜBER OPERATOREN UND BEWEGUNGSZÜGE
+
+
+ Viele Kommandos, die Text ändern, setzen sich aus einem Operator und einer
+ Bewegung zusammen. Das Format für ein Löschkommando mit dem Löschoperator d
+ lautet wie folgt:
+
+ d Bewegung
+
+ wobei:
+ d - der Löschoperator
+ Bewegung - worauf der Löschoperator angewandt wird (unten aufgeführt).
+
+ Eine kleine Auflistung von Bewegungen:
+ w - bis zum Beginn des nächsten Wortes OHNE dessen erstes Zeichen.
+ e - zum Ende des aktuellen Wortes MIT dessen letztem Zeichen.
+ $ - zum Ende der Zeile MIT dem letzten Zeichen.
+
+ Dementsprechend löscht die Eingabe von de vom Cursor an bis zum Wortende.
+
+Anmerkung: Die Eingabe lediglich des Bewegungsteils im Normalmodus bewegt den
+ Cursor entsprechend.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.4: ANWENDUNG EINES ZÄHLERS FÜR EINEN BEWEGUNGSSCHRITT
+
+
+ ** Die Eingabe einer Zahl vor einem Bewegungsschritt wiederholt diesen. **
+
+ 1. Bewege den Cursor zum Beginn der mit ---> markierten Zeile unten.
+
+ 2. Tippe 2w , um den Cursor zwei Wörter vorwärts zu bewegen.
+
+ 3. Tippe 3e , um den Cursor zum Ende des dritten Wortes zu bewegen.
+
+ 4. Tippe 0 (Null) , um zum Anfang der Zeile zu gelangen.
+
+ 5. Wiederhole Schritte 2 und 3 mit verschiedenen Nummern.
+
+ ---> Dies ist nur eine Zeile aus Wörtern, um sich darin herumzubewegen.
+
+ 6. Gehe weiter zu Lektion 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.5: ANWENDUNG EINES ZÄHLERS FÜR MEHRERE LÖSCHVORGÄNGE
+
+
+ ** Die Eingabe einer Zahl mit einem Operator wiederholt diesen mehrfach. **
+
+ In der Kombination aus Löschoperator und Bewegungsschritt (siehe oben)
+ stellt man, um mehr zu löschen dem Schritt einen Zähler voran:
+ d Nummer Bewegungsschritt
+
+ 1. Bewege den Cursor zum ersten Wort in GROSSBUCHSTABEN in der mit --->
+ markieren Zeile.
+
+ 2. Tippe d2w , um die zwei Wörter in GROSSBUCHSTABEN zu löschen.
+
+ 3. Wiederhole Schritte 1 und 2 mit einem anderen Zähler, um die darauffol-
+ genden Wörter in GROSSBUCHSTABEN mit einem einzigen Kommando zu löschen.
+
+---> Diese ABC DE Zeile FGHI JK LMN OP mit Wörtern ist Q RS TUV bereinigt.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.6: ARBEITEN AUF ZEILEN
+
+
+ ** Tippe dd , um eine ganze Zeile zu löschen. **
+
+ Wegen der Häufigkeit, dass man ganze Zeilen löscht, kamen die Entwickler von
+ Vi darauf, dass es leichter wäre, einfach zwei d's einzugeben, um eine Zeile
+ zu löschen.
+
+ 1. Bewege den Cursor zur zweiten Zeile in der unten stehenden Redewendung.
+ 2. Tippe dd , um die Zeile zu löschen.
+ 3. Nun bewege Dich zur vierten Zeile.
+ 4. Tippe 2dd , um zwei Zeilen zu löschen.
+
+---> 1) Rosen sind rot,
+---> 2) Matsch ist lustig,
+---> 3) Veilchen sind blau,
+---> 4) Ich habe ein Auto,
+---> 5) Die Uhr sagt die Zeit,
+---> 6) Zucker ist süß,
+---> 7) So wie Du auch.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.7: RÜCKGÄNGIG MACHEN (UNDO)
+
+
+ ** Tippe u , um die letzten Kommandos rückgängig zu machen **
+ ** oder U , um eine ganze Zeile wiederherzustellen. **
+
+ 1. Bewege den Cursor zu der mit ---> markierten Zeile unten
+ und setze ihn auf den ersten Fehler.
+ 2. Tippe x , um das erste unerwünschte Zeichen zu löschen.
+ 3. Nun tippe u , um das soeben ausgeführte Kommando rückgängig zu machen.
+ 4. Jetzt behebe alle Fehler auf der Zeile mit Hilfe des x Kommandos.
+ 5. Nun tippe ein großes U , um die Zeile in ihren Ursprungszustand
+ wiederherzustellen.
+ 6. Nun tippe u einige Male, um das U und die vorhergehenden Kommandos
+ rückgängig zu machen.
+ 7. Nun tippe CTRL-R (halte CTRL gedrückt und drücke R) mehrere Male, um die
+ Kommandos wiederherzustellen (die Rückgängigmachungen rückgängig machen).
+
+---> Beehebe die Fehller diesser Zeile und sttelle sie mitt 'undo' wieder her.
+
+ 8. Dies sind sehr nützliche Kommandos. Nun gehe weiter zur Zusammenfassung
+ von Lektion 2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 2
+
+
+ 1. Um vom Cursor bis zum nächsten Wort zu löschen, tippe: dw
+ 2. Um vom Cursor bis zum Ende einer Zeile zu löschen, tippe: d$
+ 3. Um eine ganze Zeile zu löschen, tippe: dd
+
+ 4. Um eine Bewegung zu wiederholen, stelle eine Nummer voran: 2w
+ 5. Das Format für ein Änderungskommando ist:
+ Operator [Anzahl] Bewegungsschritt
+ wobei:
+ Operator - gibt an, was getan werden soll, zum Beispiel d für delete
+ [Anzahl] - ein optionaler Zähler, um den Bewegungsschritt zu wiederholen
+ Bewegungsschritt - Bewegung über den zu ändernden Text, wie
+ w (Wort), $ (zum Ende der Zeile), etc.
+
+ 6. Um Dich zum Anfang der Zeile zu begeben, benutze die Null: 0
+
+ 7. Um vorherige Aktionen rückgängig zu machen, tippe: u (kleines u)
+ Um alle Änderungen auf einer Zeile rückgängig zu machen: U (großes U)
+ Um die Rückgängigmachungen rückgängig zu machen, tippe: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.1: ANFÜGEN (PUT)
+
+
+ ** Tippe p , um vorher gelöschten Text nach dem Cursor anzufügen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 2. Tippe dd , um die Zeile zu löschen und sie in einem Vim-Register zu
+ speichern.
+
+ 3. Bewege den Cursor zur Zeile c), ÜBER derjenigen, wo die gelöschte Zeile
+ platziert werden soll.
+
+ 4. Tippe p , um die Zeile unterhalb des Cursors zu platzieren.
+
+ 5. Wiederhole die Schritte 2 bis 4, um alle Zeilen in die richtige
+ Reihenfolge zu bringen.
+
+---> d) Kannst Du das auch?
+---> b) Veilchen sind blau,
+---> c) Intelligenz ist lernbar,
+---> a) Rosen sind rot,
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.2: ERSETZEN (REPLACE)
+
+
+ ** Tippe rx , um das Zeichen unter dem Cursor durch x zu ersetzen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 2. Bewege den Cursor, bis er sich auf dem ersten Fehler befindet.
+
+ 3. Tippe r und anschließend das Zeichen, welches dort stehen sollte.
+
+ 4. Wiederhole Schritte 2 und 3, bis die erste Zeile gleich der zweiten ist.
+
+---> Alf diese Zeite eingegoben wurde, wurden einike falsche Tasten gelippt!
+---> Als diese Zeile eingegeben wurde, wurden einige falsche Tasten getippt!
+
+ 5. Nun fahre fort mit Lektion 3.2.
+
+Anmerkung: Erinnere Dich daran, dass Du durch Anwenden lernen solltest, nicht
+ durch Auswendiglernen.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.3: ÄNDERN (CHANGE)
+
+
+ ** Um eine Änderung bis zum Wortende durchzuführen, tippe ce . **
+
+ 1. Bewege den Cursor zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 2. Platziere den Cursor auf das s von Wstwr.
+
+ 3. Tippe ce und die Wortkorrektur ein (in diesem Fall tippe örter ).
+
+ 4. Drücke <ESC> und bewege den Cursor zum nächsten zu ändernden Zeichen.
+
+ 5. Wiederhole Schritte 3 und 4 bis der erste Satz gleich dem zweiten ist.
+
+---> Einige Wstwr dieser Zlaww lasdjlaf mit dem Ändern-Operator gaaauu werden.
+---> Einige Wörter dieser Zeile sollen mit dem Ändern-Operator geändert werden.
+
+Beachte, dass ce das Wort löscht und Dich in den Eingabemodus versetzt.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.4: MEHR ÄNDERUNGEN MITTELS c
+
+
+ ** Das change-Kommando arbeitet mit denselben Bewegungen wie delete. **
+
+ 1. Der change Operator arbeitet in gleicher Weise wie delete. Das Format ist:
+
+ c [Anzahl] Bewegungsschritt
+
+ 2. Die Bewegungsschritte sind die gleichen , so wie w (Wort) und $
+ (Zeilenende).
+
+ 3. Bewege Dich zur ersten unten stehenden mit ---> markierten Zeile.
+
+ 4. Bewege den Cursor zum ersten Fehler.
+
+ 5. Tippe c$ , gib den Rest der Zeile wie in der zweiten ein, drücke <ESC> .
+
+---> Das Ende dieser Zeile soll an die zweite Zeile angeglichen werden.
+---> Das Ende dieser Zeile soll mit dem c$ Kommando korrigiert werden.
+
+Anmerkung: Du kannst die Rücktaste benutzen, um Tippfehler zu korrigieren.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 3
+
+
+ 1. Um einen vorher gelöschten Text anzufügen, tippe p . Dies fügt den
+ gelöschten Text NACH dem Cursor an (wenn eine ganze Zeile gelöscht wurde,
+ wird diese in die Zeile unter dem Cursor eingefügt).
+
+ 2. Um das Zeichen unter dem Cursor zu ersetzen, tippe r und danach das
+ an dieser Stelle gewollte Zeichen.
+
+ 3. Der Änderungs- (change) Operator erlaubt, vom Cursor bis zum Ende des
+ Bewegungsschrittes zu ändern. Tippe ce , um eine Änderung vom Cursor bis
+ zum Ende des Wortes vorzunehmen; c$ bis zum Ende einer Zeile.
+
+ 4. Das Format für change ist:
+
+ c [Anzahl] Bewegungsschritt
+
+ Nun fahre mit der nächsten Lektion fort.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.1: CURSORPOSITION UND DATEISTATUS
+
+ ** Tippe CTRL-G , um deine Dateiposition sowie den Dateistatus anzuzeigen. **
+ ** Tippe G , um Dich zu einer Zeile in der Datei zu begeben. **
+
+Anmerkung: Lies diese gesamte Lektion, bevor Du irgendeinen Schritt ausführst!!
+
+ 1. Halte die Ctrl Taste unten und drücke g . Dies nennen wir CTRL-G.
+ Eine Statusmeldung am Fuß der Seite erscheint mit dem Dateinamen und der
+ Position innerhalb der Datei. Merke Dir die Zeilennummer für Schritt 3.
+
+Anmerkung: Möglicherweise siehst Du die Cursorposition in der unteren rechten
+ Bildschirmecke. Dies ist Auswirkung der 'ruler' Option
+ (siehe :help 'ruler')
+
+ 2. Drücke G , um Dich zum Ende der Datei zu begeben.
+ Tippe gg , um Dich zum Anfang der Datei zu begeben.
+
+ 3. Gib die Nummer der Zeile ein, auf der Du vorher warst, gefolgt von G .
+ Dies bringt Dich zurück zu der Zeile, auf der Du gestanden hast, als Du
+ das erste Mal CTRL-G gedrückt hast.
+
+ 4. Wenn Du Dich sicher genug fühlst, führe die Schritte 1 bis 3 aus.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.2: DAS SUCHEN - KOMMANDO
+
+
+ ** Tippe / gefolgt von einem Ausdruck, um nach dem Ausdruck zu suchen. **
+
+ 1. Im Normalmodus, tippe das / Zeichen. Beachte, dass das / und der
+ Cursor am Fuß des Schirms erscheinen, so wie beim : Kommando.
+
+ 2. Nun tippe 'Fehhler' <ENTER>. Dies ist das Wort, nach dem Du suchen willst.
+
+ 3. Um nach demselben Ausdruck weiterzusuchen, tippe einfach n (für next).
+ Um nach demselben Ausdruck in der Gegenrichtung zu suchen, tippe N .
+
+ 4. Um nach einem Ausdruck rückwärts zu suchen , benutze ? statt / .
+
+ 5. Um dahin zurückzukehren, von wo Du gekommen bist, drücke CTRL-O (Halte
+ Ctrl unten und drücke den Buchstaben o). Wiederhole dies, um noch weiter
+ zurückzugehen. CTRL-I geht vorwärts.
+
+---> Fehler schreibt sich nicht "Fehhler"; Fehhler ist ein Fehler
+Anmerkung: Wenn die Suche das Dateiende erreicht hat, wird sie am Anfang
+ fortgesetzt, es sei denn, die 'wrapscan' Option wurde abgeschaltet.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.3: PASSENDE KLAMMERN FINDEN
+
+
+ ** Tippe % , um eine gegenüberliegenden Klammer ),], oder } zu finden. **
+
+ 1. Platziere den Cursor auf irgendeinem der Zeichen (, [, oder { in der unten
+ stehenden Zeile, die mit ---> markiert ist.
+
+ 2. Nun tippe das % Zeichen.
+
+ 3. Der Cursor bewegt sich zur passenden gegenüberliegenden Klammer.
+
+ 4. Tippe % , um den Cursor zur passenden anderen Klammer zu bewegen.
+
+ 5. Setze den Cursor auf ein anderes (,),[,],{ oder } und probiere % aus.
+
+---> Dies ( ist eine Testzeile ( mit [ verschiedenen ] { Klammern } darin. ))
+
+Anmerkung: Diese Funktionalität ist sehr nützlich bei der Fehlersuche in einem
+ Programmtext, in dem passende Klammern fehlen!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.4: DAS ERSETZUNGSKOMMANDO (SUBSTITUTE)
+
+
+ ** Tippe :s/alt/neu/g , um 'alt' durch 'neu' zu ersetzen. **
+
+ 1. Bewege den Cursor zu der unten stehenden mit ---> markierten Zeile.
+
+ 2. Tippe :s/diee/die <ENTER> . Beachte, dass der Befehl nur das erste
+ Vorkommen von "diee" ersetzt.
+
+ 3. Nun tippe :s/diee/die/g . Das Zufügen des Flags g bedeutet, eine
+ globale Ersetzung über die Zeile durchzuführen, dies ersetzt alle
+ Vorkommen von "diee" auf der Zeile.
+
+---> diee schönste Zeit, um diee Blumen anzuschauen, ist diee Frühlingszeit.
+
+ 4. Um alle Vorkommen einer Zeichenkette innerhalb zweier Zeilen zu ändern,
+ tippe :#,#s/alt/neu/g wobei #,# die Zeilennummern des Bereiches sind,
+ in dem die Ersetzung durchgeführt werden soll.
+ Tippe :%s/alt/neu/g um alle Vorkommen in der gesamten Datei zu ändern.
+ Tippe :%s/alt/neu/gc um alle Vorkommen in der gesamten Datei zu finden
+ mit einem Fragedialog, ob ersetzt werden soll oder nicht.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 4
+
+ 1. CTRL-G zeigt die aktuelle Dateiposition sowie den Dateistatus.
+ G bringt Dich zum Ende der Datei.
+ Nummer G bringt Dich zur entsprechenden Zeilennummer.
+ gg bringt Dich zur ersten Zeile.
+
+ 2. Die Eingabe von / plus einem Ausdruck sucht VORWÄRTS nach dem Ausdruck.
+ Die Eingabe von ? plus einem Ausdruck sucht RÜCKWÄRTS nach dem Ausdruck.
+ Tippe nach einer Suche n , um das nächste Vorkommen in der gleichen
+ Richtung zu finden; oder N , um in der Gegenrichtung zu suchen.
+ CTRL-O bringt Dich zurück zu älteren Positionen, CTRL-I zu neueren.
+
+ 3. Die Eingabe von % , wenn der Cursor sich auf (,),[,],{, oder }
+ befindet, bringt Dich zur Gegenklammer.
+
+ 4. Um das erste Vorkommen von "alt" in einer Zeile durch "neu" zu ersetzen,
+ tippe :s/alt/neu
+ Um alle Vorkommen von "alt" in der Zeile ersetzen, tippe :s/alt/neu/g
+ Um Ausdrücke innerhalb zweier Zeilen # zu ersetzen :#,#s/alt/neu/g
+ Um alle Vorkommen in der ganzen Datei zu ersetzen, tippe :%s/alt/neu/g
+ Für eine jedesmalige Bestätigung, addiere 'c' (confirm) :%s/alt/neu/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.1: AUSFÜHREN EINES EXTERNEN KOMMANDOS
+
+
+ ** Gib :! , gefolgt von einem externen Kommando ein, um es auszuführen. **
+
+ 1. Tippe das vertraute Kommando : , um den Cursor auf den Fuß des Schirms
+ zu setzen. Dies erlaubt Dir, ein Kommandozeilen-Kommando einzugeben.
+
+ 2. Nun tippe ein ! (Ausrufezeichen). Dies ermöglicht Dir, ein beliebiges,
+ externes Shellkommando auszuführen.
+
+ 3. Als Beispiel tippe ls nach dem ! und drücke <ENTER>. Dies liefert
+ eine Auflistung deines Verzeichnisses; genauso, als wenn Du in der
+ Eingabeaufforderung wärst. Oder verwende :!dir , falls ls nicht geht.
+
+Anmerkung: Mit dieser Methode kann jedes beliebige externe Kommando
+ ausgeführt werden, auch mit Argumenten.
+
+Anmerkung: Alle : Kommandos müssen durch Eingabe von <ENTER>
+ abgeschlossen werden. Von jetzt an erwähnen wir dies nicht jedesmal.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.2: MEHR ÜBER DAS SCHREIBEN VON DATEIEN
+
+
+** Um am Text durchgeführte Änderungen zu speichern, tippe :w DATEINAME. **
+
+ 1. Tippe :!dir oder :!ls , um eine Auflistung deines Verzeichnisses zu
+ erhalten. Du weißt nun bereits, dass Du danach <ENTER> eingeben musst.
+
+ 2. Wähle einen Dateinamen, der noch nicht existiert, z.B. TEST.
+
+ 3. Nun tippe: :w TEST (wobei TEST der gewählte Dateiname ist).
+
+ 4. Dies speichert die ganze Datei (den Vim Tutor) unter dem Namen TEST.
+ Um dies zu überprüfen, tippe nochmals :!ls bzw. !dir, um deinen
+ Verzeichnisinhalt zu sehen.
+
+Anmerkung: Würdest Du Vim jetzt beenden und danach wieder mit vim TEST
+ starten, dann wäre diese Datei eine exakte Kopie des Tutors zu dem
+ Zeitpunkt, als Du ihn gespeichert hast.
+
+ 5. Nun entferne die Datei durch Eingabe von (MS-DOS): :!del TEST
+ oder (Unix): :!rm TEST
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.3: AUSWÄHLEN VON TEXT ZUM SCHREIBEN
+
+** Um einen Abschnitt der Datei zu speichern, tippe v Bewegung :w DATEI **
+
+ 1. Bewege den Cursor zu dieser Zeile.
+
+ 2. Tippe v und bewege den Cursor zum fünften Auflistungspunkt unten.
+ Beachte, dass der Text hervorgehoben wird.
+
+ 3. Drücke das Zeichen : . Am Fuß des Schirms erscheint :'<,'> .
+
+ 4. Tippe w TEST , wobei TEST ein noch nicht vorhandener Dateiname ist.
+ Vergewissere Dich, dass Du :'<,'>w TEST siehst, bevor Du <ENTER> drückst.
+
+ 5. Vim schreibt die ausgewählten Zeilen in die Datei TEST. Benutze :!dir
+ oder :!ls , um sie zu sehen. Lösche sie noch nicht! Wir werden sie in
+ der nächsten Lektion benutzen.
+
+Hinweis: Drücken von v startet die Visuelle Auswahl. Du kannst den Cursor
+ umherbewegen, um die Auswahl zu vergrößern oder zu verkleinern. Anschließend
+ lässt sich ein Operator anwenden, um mit dem Text etwas zu tun. Zum Beispiel
+ löscht d den Text.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.4: EINLESEN UND ZUSAMMENFÜHREN VON DATEIEN
+
+
+ ** Um den Inhalt einer Datei einzulesen, tippe :r DATEINAME **
+
+ 1. Platziere den Cursor direkt über dieser Zeile.
+
+BEACHTE: Nachdem Du Schritt 2 ausgeführt hast, wirst Du Text aus Lektion 5.3
+ sehen. Dann bewege Dich wieder ABWÄRTS, Lektion 5.4 wiederzusehen.
+
+ 2. Nun lies deine Datei TEST ein indem Du das Kommando :r TEST ausführst,
+ wobei TEST der von Dir verwendete Dateiname ist.
+ Die eingelesene Datei wird unterhalb der Cursorzeile eingefügt.
+
+ 3. Um zu überprüfen, dass die Datei eingelesen wurde, gehe zurück und
+ beachte, dass es jetzt zwei Kopien von Lektion 5.3 gibt, das Original und
+ die eingefügte Dateiversion.
+
+Anmerkung: Du kannst auch die Ausgabe eines externen Kommandos einlesen. Zum
+ Beispiel liest :r !ls die Ausgabe des Kommandos ls ein und platziert
+ sie unterhalb des Cursors.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 5
+
+
+ 1. :!Kommando führt ein externes Kommando aus.
+
+ Einige nützliche Beispiele sind
+ (MS-DOS) (Unix)
+ :!dir :!ls - zeigt eine Verzeichnisauflistung.
+ :!del DATEINAME :!rm DATEINAME - entfernt Datei DATEINAME.
+
+ 2. :w DATEINAME speichert die aktuelle Vim-Datei unter dem Namen DATEINAME.
+
+ 3. v Bewegung :w DATEINAME schreibt die Visuell ausgewählten Zeilen in
+ die Datei DATEINAME.
+
+ 4. :r DATEINAME lädt die Datei DATEINAME und fügt sie unterhalb der
+ Cursorposition ein.
+
+ 5. :r !dir liest die Ausgabe des Kommandos dir und fügt sie unterhalb der
+ Cursorposition ein.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.1: ZEILEN ÖFFNEN (OPEN)
+
+
+ ** Tippe o , um eine Zeile unterhalb des Cursors zu öffnen und Dich in **
+ ** den Einfügemodus zu begeben. **
+
+ 1. Bewege den Cursor zu der ersten mit ---> markierten Zeile unten.
+
+ 2. Tippe o (klein geschrieben), um eine Zeile UNTERHALB des Cursors zu öffnen
+ und Dich in den Einfügemodus zu begeben.
+
+ 3. Nun tippe etwas Text und drücke <ESC> , um den Einfügemodus zu verlassen.
+
+---> Mit o wird der Cursor auf der offenen Zeile im Einfügemodus platziert.
+
+ 4. Um eine Zeile ÜBERHALB des Cursors aufzumachen, gib einfach ein großes O
+ statt einem kleinen o ein. Versuche dies auf der unten stehenden Zeile.
+
+---> Öffne eine Zeile über dieser mit O , wenn der Cursor auf dieser Zeile ist.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.2: TEXT ANFÜGEN (APPEND)
+
+
+ ** Tippe a , um Text NACH dem Cursor einzufügen. **
+
+ 1. Bewege den Cursor zum Anfang der ersten Übungszeile mit ---> unten.
+
+ 2. Drücke e , bis der Cursor am Ende von Zei steht.
+
+ 3. Tippe ein kleines a , um Text NACH dem Cursor anzufügen.
+
+ 4. Vervollständige das Wort so wie in der Zeile darunter. Drücke <ESC> ,
+ um den Einfügemodus zu verlassen.
+
+ 5. Bewege Dich mit e zum nächsten unvollständigen Wort und wiederhole
+ Schritte 3 und 4.
+
+---> Diese Zei bietet Gelegen , Text in einer Zeile anzufü.
+---> Diese Zeile bietet Gelegenheit, Text in einer Zeile anzufügen.
+
+Anmerkung: a, i und A gehen alle gleichermaßen in den Einfügemodus; der
+ einzige Unterschied ist, wo die Zeichen eingefügt werden.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.3: EINE ANDERE ART DES ERSETZENS (REPLACE)
+
+
+ ** Tippe ein großes R , um mehr als ein Zeichen zu ersetzen. **
+
+ 1. Bewege den Cursor zur ersten unten stehenden, mit ---> markierten Zeile.
+ Bewege den Cursor zum Anfang des ersten xxx .
+
+ 2. Nun drücke R und tippe die Nummer, die darunter in der zweiten Zeile
+ steht, so dass diese das xxx ersetzt.
+
+ 3. Drücke <ESC> , um den Ersetzungsmodus zu verlassen. Beachte, dass der Rest
+ der Zeile unverändert bleibt.
+
+ 4. Wiederhole die Schritte, um das verbliebene xxx zu ersetzen.
+
+---> Das Addieren von 123 zu xxx ergibt xxx.
+---> Das Addieren von 123 zu 456 ergibt 579.
+
+Anmerkung: Der Ersetzungsmodus ist wie der Einfügemodus, aber jedes eingetippte
+ Zeichen löscht ein vorhandenes Zeichen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.4: TEXT KOPIEREN UND EINFÜGEN
+
+ ** Benutze den y Operator, um Text zu kopieren; p , um ihn einzufügen **
+
+ 1. Gehe zu der mit ---> markierten Zeile unten; setze den Cursor hinter "a)".
+
+ 2. Starte den Visuellen Modus mit v , bewege den Cursor genau vor "erste".
+
+ 3. Tippe y , um den hervorgehoben Text zu kopieren.
+
+ 4. Bewege den Cursor zum Ende der nächsten Zeile: j$
+
+ 5. Tippe p , um den Text einzufügen und anschließend: a zweite <ESC> .
+
+ 6. Benutze den Visuellen Modus, um " Eintrag." auszuwählen, kopiere mittels
+ y , bewege Dich zum Ende der nächsten Zeile mit j$ und füge den Text
+ dort mit p an.
+
+---> a) dies ist der erste Eintrag.
+ b)
+
+Anmerkung: Du kannst y auch als Operator verwenden; yw kopiert ein Wort.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.5: OPTIONEN SETZEN
+
+ ** Setze eine Option so, dass eine Suche oder Ersetzung Groß- **
+ ** und Kleinschreibung ignoriert **
+
+ 1. Suche nach 'ignoriere', indem Du /ignoriere eingibst.
+ Wiederhole die Suche einige Male, indem Du die n - Taste drückst.
+
+ 2. Setze die 'ic' (Ignore case) - Option, indem Du :set ic eingibst.
+
+ 3. Nun suche wieder nach 'ignoriere', indem Du n tippst.
+ Beachte, dass jetzt Ignoriere und auch IGNORIERE gefunden wird.
+
+ 4. Setze die 'hlsearch' und 'incsearch' - Optionen: :set hls is
+
+ 5. Wiederhole die Suche und beobachte, was passiert: /ignoriere <ENTER>
+
+ 6. Um das Ignorieren von Groß/Kleinschreibung abzuschalten, tippe: :set noic
+
+Anmerkung: Um die Hervorhebung der Treffer zu entfernen, gib ein: :nohlsearch
+Anmerkung: Um die Schreibweise für eine einzige Suche zu ignorieren, benutze \c
+ im Suchausdruck: /ignoriere\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 6
+
+ 1. Tippe o , um eine Zeile UNTER dem Cursor zu öffnen und den Einfügemodus
+ zu starten
+ Tippe O , um eine Zeile ÜBER dem Cursor zu öffnen.
+
+ 2. Tippe a , um Text NACH dem Cursor anzufügen.
+ Tippe A , um Text nach dem Zeilenende anzufügen.
+
+ 3. Das Kommando e bringt Dich zum Ende eines Wortes.
+
+ 4. Der Operator y (yank) kopiert Text, p (put) fügt ihn ein.
+
+ 5. Ein großes R geht in den Ersetzungsmodus bis zum Drücken von <ESC> .
+
+ 6. Die Eingabe von ":set xxx" setzt die Option "xxx". Einige Optionen sind:
+ 'ic' 'ignorecase' Ignoriere Groß/Kleinschreibung bei einer Suche
+ 'is' 'incsearch' Zeige Teilübereinstimmungen für einen Suchausdruck
+ 'hls' 'hlsearch' Hebe alle passenden Ausdrücke hervor
+ Der Optionsname kann in der Kurz- oder der Langform angegeben werden.
+
+ 7. Stelle einer Option "no" voran, um sie abzuschalten: :set noic
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.1 : AUFRUFEN VON HILFE
+
+
+ ** Nutze das eingebaute Hilfesystem **
+
+ Vim besitzt ein umfassendes eingebautes Hilfesystem. Für den Anfang probiere
+ eins der drei folgenden Dinge aus:
+ - Drücke die <Hilfe> - Taste (falls Du eine besitzt)
+ - Drücke die <F1> Taste (falls Du eine besitzt)
+ - Tippe :help <ENTER>
+
+ Lies den Text im Hilfefenster, um zu verstehen wie die Hilfe funktioniert.
+ Tippe CTRL-W CTRL-W , um von einem Fenster zum anderen zu springen.
+ Tippe :q <ENTER> , um das Hilfefenster zu schließen.
+
+ Du kannst Hilfe zu praktisch jedem Thema finden, indem Du dem ":help"-
+ Kommando ein Argument gibst. Probiere folgendes (<ENTER> nicht vergessen):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.2: ERSTELLE EIN START-SKRIPT
+
+
+ ** Aktiviere die Features von Vim **
+
+ Vim besitzt viele Funktionalitäten, die über Vi hinausgehen, aber die meisten
+ von ihnen sind standardmäßig deaktiviert. Um mehr Funktionalitäten zu nutzen,
+ musst Du eine "vimrc" - Datei erstellen.
+
+ 1. Starte das Editieren der "vimrc"-Datei, abhängig von deinem System:
+ :e ~/.vimrc für Unix
+ :e ~/_vimrc für MS-Windows
+
+ 2. Nun lies den Inhalt der Beispiel-"vimrc"-Datei ein:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Speichere die Datei mit:
+ :w
+
+ Beim nächsten Start von Vim wird die Syntaxhervorhebung aktiviert sein.
+ Du kannst all deine bevorzugten Optionen zu dieser "vimrc"-Datei zufügen.
+ Für mehr Informationen tippe :help vimrc-intro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 7.3: VERVOLLSTÄNDIGEN
+
+
+ ** Kommandozeilenvervollständigung mit CTRL-D und <TAB> **
+
+ 1. Stelle sicher, dass Vim nicht im Vi-Kompatibilitätsmodus ist: :set nocp
+
+ 2. Siehe nach, welche Dateien im Verzeichnis existieren: :!ls oder :!dir
+
+ 3. Tippe den Beginn eines Kommandos: :e
+
+ 4. Drücke CTRL-D und Vim zeigt eine Liste mit "e" beginnender Kommandos.
+
+ 5. Drücke <TAB> und Vim vervollständigt den Kommandonamen zu ":edit".
+
+ 6. Nun füge ein Leerzeichen und den Anfang einer existierenden Datei an:
+ :edit DAT
+
+ 7. Drücke <TAB>. Vim vervollständigt den Namen (falls er eindeutig ist).
+
+Anmerkung: Vervollständigung funktioniert für viele Kommandos. Probiere
+ einfach CTRL-D und <TAB>. Dies ist insbesondere nützlich für :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZUSAMMENFASSUNG VON LEKTION 7
+
+
+ 1. Tippe :help oder drücke <F1> oder <Help>, um ein Hilfefenster zu öffnen.
+
+ 2. Tippe :help Kommando , um Hilfe über Kommando zu erhalten.
+
+ 3. Tippe CTRL-W CTRL-W , um zum anderen Fenster zu springen.
+
+ 4. Tippe :q , um das Hilfefenster zu schließen.
+
+ 5. Erstelle ein vimrc - Startskript mit deinen bevorzugter Einstellungen.
+
+ 6. Drücke CTRL-D nach dem Tippen eines : Kommandos, um mögliche
+ Vervollständigungen anzusehen.
+ Drücke <TAB> , um eine Vervollständigung zu anzuwenden.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Damit ist der Vim Tutor beendet. Seine Intention war, einen kurzen und
+ bündigen Überblick über den Vim Editor zu geben; gerade genug, um relativ
+ leicht mit ihm umgehen zu können. Der Vim Tutor hat nicht den geringsten
+ Anspruch auf Vollständigkeit; Vim hat noch weitaus mehr Kommandos. Lies als
+ nächstes das User Manual: ":help user-manual".
+
+ Für weiteres Lesen und Lernen ist folgendes Buch empfehlenswert :
+ Vim - Vi Improved - von Steve Oualline
+ Verlag: New Riders
+ Das erste Buch, welches durchgängig Vim gewidmet ist. Besonders nützlich
+ für Anfänger. Viele Beispiele und Bilder sind enthalten.
+ Siehe https://iccf-holland.org/click5.html
+
+ Folgendes Buch ist älter und mehr über Vi als Vim, aber auch empfehlenswert:
+ Textbearbeitung mit dem Vi-Editor - von Linda Lamb und Arnold Robbins
+ Verlag O'Reilly - ISBN: 3897211262
+ In diesem Buch kann man fast alles finden, was man mit Vi tun möchte.
+ Die sechste Ausgabe enthält auch Informationen über Vim.
+
+ Als aktuelle Referenz für Version 6.2 und knappe Einführung dient das
+ folgende Buch:
+ vim ge-packt von Reinhard Wobst
+ mitp-Verlag, ISBN 3-8266-1425-9
+ Trotz der kompakten Darstellung ist es durch viele nützliche Beispiele auch
+ für Einsteiger empfehlenswert. Probekapitel und die Beispielskripte sind
+ online erhältlich. Siehe https://iccf-holland.org/click5.html
+
+ Dieses Tutorial wurde geschrieben von Michael C. Pierce und Robert K. Ware,
+ Colorado School of Mines. Es benutzt Ideen, die Charles Smith, Colorado State
+ University, zur Verfügung stellte. E-Mail: bware@mines.colorado.edu.
+
+ Bearbeitet für Vim von Bram Moolenaar.
+ Deutsche Übersetzung von Joachim Hofmann 2015. E-Mail: Joachim.Hof@gmx.de
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.el b/runtime/tutor/tutor.el
new file mode 100644
index 0000000..9a2fd98
--- /dev/null
+++ b/runtime/tutor/tutor.el
@@ -0,0 +1,815 @@
+===============================================================================
+= V I M T u t o r - 1.5 =
+===============================================================================
+
+ Vim ,
+ .
+
+ Vim .
+
+
+ 25-30 ,
+ .
+
+ .
+ (
+ "Vimtutor" ).
+
+
+ .
+ .
+ , !
+
+ , Caps-Lock
+ j
+ 1.1 .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.1:
+
+ ** , h,j,k,l . **
+ ^
+ k Hint: h ' .
+ < h l > l .
+ j j .
+ v
+
+ 1. .
+
+ 2. (j) .
+---> .
+
+ 3. , 1.2.
+
+: , <ESC>
+ . .
+
+: . hjkl
+ , .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.2: VIM
+
+ !! : , !!
+
+ 1. <ESC> ( ).
+
+ 2. : :q! <ENTER>.
+
+---> .
+ :
+ :wq <ENTER>
+
+ 3. ,
+ . : vimtutor <ENTER>
+ : vim tutor <ENTER>
+
+---> 'vim' vim, 'tutor'
+ .
+
+ 4. ,
+ 1 3 .
+ 1.3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.3: -
+
+ ** x
+ . **
+
+ 1. --->.
+
+ 2. ,
+ .
+
+ 3. x .
+
+ 4. 2 4 .
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. , 1.4.
+
+: ,
+ , .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.4: -
+
+ ** i . **
+
+ 1. --->.
+
+ 2. ,
+ .
+
+ 3. i .
+
+ 4. <ESC>
+ . 2 4
+ .
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5.
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1
+
+
+ 1. hjkl.
+ h () j () k () l ()
+
+ 2. Vim ( %) : vim <ENTER>
+
+ 3. : <ESC> :q! <ENTER> .
+ : <ESC> :wq <ENTER> .
+
+ 4.
+ : x
+
+ 5. :
+ i <ESC>
+
+: <ESC>
+ .
+
+ 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.1:
+
+ ** dw . **
+
+ 1. <ESC> .
+
+ 2. --->.
+
+ 3. .
+
+ 4. dw .
+
+: dw
+ . , <ESC>
+ .
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. 3 4
+ 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.2:
+
+ ** d$ . **
+
+ 1. <ESC> .
+
+ 2. --->.
+
+ 3. ( . ).
+
+ 4. d$ .
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+ 5. 2.3 .
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.3:
+
+
+ d :
+
+ [] d d []
+ :
+ - (, ' =1).
+ d - .
+ - ( ).
+
+ :
+ w - , .
+ e - , .
+ $ - .
+
+: ,
+
+ .
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.4: '-'
+
+ ** dd . **
+
+ ,
+ Vim d
+ .
+
+ 1. .
+ 2. dd .
+ 3. .
+ 4. 2dd ( --)
+ .
+
+ 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.5:
+
+ ** u ,
+ U . **
+
+ 1. --->
+ .
+ 2. x .
+ 3. u .
+ 4. x.
+ 5. U
+ .
+ 6. u U
+ .
+ 7. CTRL-R ( CTRL R)
+ ( ).
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. .
+ 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2
+
+
+ 1. : dw
+
+ 2. : d$
+
+ 3. : dd
+
+ 4. :
+
+ [] []
+ :
+ -
+ - , d
+ - , w (),
+ $ ( ), .
+
+ 5. , : u ( u)
+ , : U ( U)
+ , : CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.1:
+
+
+ ** p . **
+
+ 1. .
+
+ 2. dd
+ Vim.
+
+ 3.
+ .
+
+ 4. , p .
+
+ 5. 2 4
+ .
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.2:
+
+
+ ** r
+ . **
+
+ 1. --->.
+
+ 2. .
+
+ 3. r .
+
+ 4. 2 3 .
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. 3.2.
+
+: ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.3:
+
+ ** , cw . **
+
+ 1. --->.
+
+ 2. u lubw.
+
+ 3. cw ( , 'ine'.)
+
+ 4. <ESC> (
+ ).
+
+ 5. 3 4
+ .
+
+---> This lubw has a few wptfd that mrrf changing usf the change command.
+---> This line has a few words that need changing using the change command.
+
+ cw ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.4: c
+
+
+ ** . **
+
+
+ 1. . :
+
+ [] c c []
+
+ 2. , w (), $ ( ), .
+
+ 3. --->.
+
+ 4. .
+
+ 5. c$
+ <ESC>.
+
+---> 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$ command.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3
+
+
+ 1. , p .
+ (
+ .
+
+ 2. , r
+ .
+
+ 3.
+ . .. cw
+ , c$
+ .
+
+ 4. :
+
+ [] c c []
+
+ .
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.1:
+
+
+ ** CTRL-g .
+ SHIFT-G . **
+
+ : !!
+
+ 1. Ctrl g .
+
+ . 3.
+
+ 2. shift-G .
+
+ 3. shift-G.
+ Ctrl-g.
+ ( , ).
+
+ 4. , 1 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.2:
+
+
+ ** / . **
+
+ 1. / .
+ : .
+
+ 2. 'errroor' <ENTER>. .
+
+ 3. , n .
+ , Shift-N .
+
+ 4. , ? / .
+
+---> .
+
+ "errroor" is not the way to spell error; errroor is an error.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.3:
+
+
+ ** % ), ], } . **
+
+ 1. (, [, {
+ --->.
+
+ 2. % .
+
+ 3. .
+
+ 4. %
+ ( ).
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+:
+ !
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.4:
+
+
+ ** :s/old/new/g 'new' 'old'. **
+
+ 1. --->.
+
+ 2. :s/thee/the <ENTER> .
+ .
+
+ 3. :s/thee/the/g
+ . .
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. ,
+ :#,#s/old/new/g #,# .
+ :%s/old/new/g .
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4
+
+
+ 1. Ctrl-g .
+ Shift-G .
+ Shift-G .
+
+ 2. /
+ . ?
+ . n
+ Shift-N
+ .
+
+ 3. % (,),[,],{, }
+ .
+
+ 4. new old :s/old/new
+ new 'old' :s/old/new/g
+ # :#,#s/old/new/g
+ :%s/old/new/g
+ 'c' "%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.1:
+
+
+** :! . **
+
+ 1. :
+ . .
+
+ 2. ! ().
+ .
+
+ 3. ls ! <ENTER>.
+ ,
+ . :!dir ls .
+
+---> :
+ .
+
+---> : : <ENTER>.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.2:
+
+
+ ** , :w . **
+
+ 1. :!dir :!ls .
+ <ENTER> .
+
+ 2. , TEST.
+
+ 3. : :w TEST ( TEST ).
+
+ 4. (vim Tutor) TEST.
+ , :!dir .
+
+---> Vim
+ TEST, tutor .
+
+ 5. (MS-DOS): :!del TEST
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.3:
+
+
+ ** , :#,# w **
+
+ 1. , :!dir :!ls
+ TEST.
+
+ 2.
+ Ctrl-g .
+ !
+
+ 3. Ctrl-g .
+ !
+
+ 4. , :#,# w TEST
+ #,# (,) TEST
+ .
+
+ 5. , :!dir .
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.4:
+
+
+ ** , :r **
+
+ 1. :!dir TEST .
+
+ 2. .
+
+: 3 5.3.
+ .
+
+ 3. TEST :r TEST
+ TEST .
+
+:
+ .
+
+ 4. ,
+ 5.3,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5
+
+
+ 1. :! .
+
+ (MS-DOS):
+ :!dir - .
+ :!del - .
+
+ 2. :w Vim .
+
+ 3. :#,#w # # .
+
+ 4. :r
+ .
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.1:
+
+
+ ** o
+ . **
+
+ 1. --->.
+
+ 2. o ()
+ .
+
+ 3. ---> <ESC>
+ .
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. ,
+ O, o. .
+ Shift-O
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.2:
+
+ ** a . **
+
+ 1.
+ ---> $ .
+
+ 2. a ()
+ . ( A
+ ).
+
+: i , ,
+ , <ESC>, -, , x,
+ !
+
+ 3. .
+ ,
+ .
+
+---> This line will allow you to practice
+---> This line will allow you to practice appending text to the end of a line.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.3:
+
+
+ ** R . **
+
+ 1. --->.
+
+ 2.
+ ---> ( 'last').
+
+ 3. R
+
+ .
+
+---> To make the first line the same as the last on this page use the keys.
+---> To make the first line the same as the second, type R and the new text.
+
+ 4. <ESC> ,
+ .
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.4:
+
+
+ **
+ - **
+
+ 1. 'ignore' :
+ /ignore
+ n.
+
+ 2. 'ic' (Ignore case) :
+ :set ic
+
+ 3. 'ignore' : n
+ n
+
+ 4. 'hlsearch' 'incsearch':
+ :set hls is
+
+ 5. ,
+ /ignore
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6
+
+
+ 1. o
+ .
+
+ 2. a
+ . A
+ .
+
+ 3. R
+ <ESC> .
+
+ 4. ":set xxx" "xxx".
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7: ON-LINE
+
+
+ ** on-line **
+
+ Vim on-line . ,
+ :
+ - <HELP> ( )
+ - <F1> ( )
+ - :help <ENTER>
+
+ :q <ENTER> .
+
+ ,
+ ":help". ( <ENTER>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 8: SCRIPT
+
+ ** Vim **
+
+ Vim ' , Vi,
+ .
+ "vimrc".
+
+ 1. "vimrc", :
+ :edit ~/.vimrc Unix
+ :edit ~/_vimrc MS-Windows
+
+ 2. "vimrc":
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. :
+ :write
+
+ Vim
+ . '
+ "vimrc".
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Vim Tutor.
+ Vim,
+ .
+ Vim .
+ :
+ ":help user-manual".
+
+ , :
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+ Vim.
+ .
+ .
+ https://iccf-holland.org/click5.html
+
+ Vi Vim,
+ :
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+
+ Vi.
+ Vim.
+
+ Michael C. Pierce Robert K. Ware,
+ Colorado School of Mines Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Vim Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.el.cp737 b/runtime/tutor/tutor.el.cp737
new file mode 100644
index 0000000..6483344
--- /dev/null
+++ b/runtime/tutor/tutor.el.cp737
@@ -0,0 +1,815 @@
+===============================================================================
+= V I M T u t o r - 롛 1.5 =
+===============================================================================
+
+ Vim 夘 ⤘ 婮 ᡫ ⮜ , ᨘ
+ 㩦 㚞 . 㚞
+ ᩫ ᯜ
+ ᤦ 嫜 硦 Vim ⤘ 㩞 ᡫ.
+
+ ⚚ 椦 嫘 驜 㚞
+ 夘 25-30 , 餫 橦 椦 ⯜
+ .
+
+ 㣘 㩦 壜. 㩫 ⤘
+ 嚨 妬 嫜 ( 㩘
+ "Vimtutor" 夘 㛞 ⤘ 嚨).
+
+ 夘 ᩫ 櫠 㚞 夘 ⤞ ⫩
+ 驫 ᩡ 㩞. 夜 櫠 ᝜
+ 嫜 ៜ ੫. ᝜ 椦
+ 壜, ᩜ!
+
+ 騘, 嫜 櫠 㡫 Caps-Lock 夘 ⤦
+ 㩫 㡫 j 㩜 ⫩
+ 驫 ៞ 1.1 婜 椞.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 1.1:
+
+ ** 㩜 , 㩫 㡫 h,j,k,l 室. **
+ ^
+ k Hint: 㡫 h 夘 ' .
+ < h l > 㡫 l 夘 .
+ j 㡫 j ᝜ ᡠ .
+ v
+
+ 1. 婫 椞 ⮨ 韜 ᤜ.
+
+ 2. 㩫 ⤦ 㡫 (j) ⮨ .
+---> 騘 ⨜ 嫜 棜 ៞.
+
+ 3. 餫 㡫, 嫜 ៞ 1.2.
+
+ਫ਼: ᢢ ᫠ 㩘, 㩫 <ESC> 嫜
+ ᩫ. 㩫 ⢘.
+
+ਫ਼: 㡫 ⧜ 婞 禬. hjkl
+ 嫜 嫜 櫜, 梠 婜.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 1.2: VIM
+
+ !! : ⩜ ᧦ 㣘, ᩫ 梦 ៞!!
+
+ 1. 㩫 㡫 <ESC> ( 婫 嚦 ᩫ).
+
+ 2. 㩫: :q! <ENTER>.
+
+---> ⨮ ᡫ 驜 槦 ⮜ ᤜ.
+ ⢜ 驜 ⨟ 㩫:
+ :wq <ENTER>
+
+ 3.  嫜 , 㩫
+ 㡘 㚞. 夘: vimtutor <ENTER>
+ 穘: vim tutor <ENTER>
+
+---> 'vim' 夜 ᡫ vim, 'tutor' 夘
+ ⢦ 驦.
+
+ 4. ⮜ 穜 㣘 ⮜ 埞, ⩫
+ 㣘 1 3 嫜 嫜 ᡫ.
+ 㩫 ៞ 1.3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 1.3: -
+
+ **  婫 ᩫ 㩫 x ᯜ
+ 㨘 . **
+
+ 1. 婫 ⤞ --->.
+
+ 2. 驜 ៞, 婫 ⮨ 夘
+ 㨘 .
+
+ 3. 㩫 㡫 x ᯜ 磞 㨘.
+
+ 4. ᙜ 㣘 2 ⮨ 4 ⮨ 櫘 夘 ੫.
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. 騘 夘 ੫, 夫 ៞ 1.4.
+
+: ⮜ 㚞, 㩫
+ 眫, 夜 㩞.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 1.4: -
+
+ **  婫 ᩫ 㩫 i ᢢ 壜. **
+
+ 1. 婫 ⮨ 髞 ⤞ --->.
+
+ 2. ᤜ 髞 因 竜, 婫
+ 髦 㨘 槦 壜.
+
+ 3. 㩫 i 㩫 嫞 㡜.
+
+ 4. 餜 ៜ ៦ 㩫 <ESC> ⯜
+ ᩫ. ᙜ 㣘 2 ⮨ 4 驜
+ 櫘.
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5.  婫 ᤜ ⤦ 嫜
+ 增.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1
+
+
+ 1. ☪ 嫘 餫 嫜 㡫 hjkl.
+ h (⨘) j () k () l ()
+
+ 2. 嫜 Vim ( %) ᯫ: vim <ENTER>
+
+ 3. 嫜 ᯫ: <ESC> :q! <ENTER> 樨 .
+ ᯫ: <ESC> :wq <ENTER> 㡜 .
+
+ 4. ᯜ ⤘ 㨘
+ ᩫ 㩫: x
+
+ 5. ᚜ 壜 橦 婫 ᩫ ᯫ:
+ i 㩫 壜 <ESC>
+
+: 餫 <ESC> 嫜 ᩫ
+ 驜 磞 ⤞ .
+
+騘 婫 ៞ 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 2.1:
+
+ ** ᯫ dw ᯜ ⮨ ⢦ 嘪 ⥞. **
+
+ 1. 㩫 <ESC> 嫜 櫠 婫 ᩫ.
+
+ 2. 婫 ⤞ --->.
+
+ 3. 夜 ⥞ ⧜ .
+
+ 4. ᯫ dw ᤜ ⥞ .
+
+: ᣣ dw 椞 橦
+ 嫜. ᯘ ᫠ ៦, 㩫 <ESC>
+ 㩫 .
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. ᙜ 㣘 3 4 ⮨ 櫘 夘 ੫
+ 夜 ៞ 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 2.2:
+
+ ** 㩫 d$ ᯜ ⮨ ⢦ . **
+
+ 1. 㩫 <ESC> 嫜 櫠 婫 ᩫ.
+
+ 2. 婫 ⤞ --->.
+
+ 3. 婫 ⢦ ੫ ( 髞 . ).
+
+ 4. 㩫 d$ ᯜ ⮨ ⢦ .
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+ 5. 夜 ៞ 2.3 ᙜ 夜.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 2.3:
+
+
+ d 夘 :
+
+ [] d 壜 d [] 壜
+ :
+ - 橜 (, ' =1).
+ d - .
+ 壜 - 㩜 ( 婫).
+
+ 婫 壜:
+ w - ⮨ ⢦ ⥞, ᤦ ᩫ.
+ e - ⮨ ⢦ ⥞, ᩫ.
+ $ - ⮨ ⢦ .
+
+: 秦 ⫝̸, 餫 壜 橦
+ 婫 ᩫ ᧦ 㩜
+ 坜 婫 .
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 2.4: '-'
+
+ ** 㩫 dd ᯜ 梞 . **
+
+ 嘪 櫞 桢 ,
+ Vim ᩠ 櫠 㫘 櫜 ᭜ d
+ ᯜ .
+
+ 1. 婫 竜 ᩞ.
+ 2. ᯫ dd ᯜ .
+ 3. 騘 嫜 ⫘ .
+ 4. ᯫ 2dd (嫜 --壜)
+ ᯜ .
+
+ 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 2.5:
+
+ ** 㩫 u ⩜ 圪 ,
+ U 驜 梞 . **
+
+ 1. 婫 ⤞ --->
+ 㩫 髦 ៦.
+ 2. 㩫 x ᯜ 髦 磞 㨘.
+ 3. 騘 㩫 u ⩜ ⤞ .
+ 4. 驫 梘 ៞ 餫 x.
+ 5. 騘 㩫 ⤘ U ⯜
+ ᩫ.
+ 6. 騘 㩫 u ⩜ U
+ 磜 .
+ 7. 騘 㩫 CTRL-R (餫 ⤦ 㡫 CTRL ᫜ R)
+ ⨜ (娜 ⩜).
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. 夘 㩠 . 騘 夜
+ 增 㣘 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2
+
+
+ 1. ᯜ ⮨ ⢦ ⥞ ᯫ: dw
+
+ 2. ᯜ ⮨ ⢦ ᯫ: d$
+
+ 3. ᯜ 桢 ᯫ: dd
+
+ 4. ᩫ 夘:
+
+ [] 壜 [] 壜
+ 槦:
+ - 橜
+ - 夜, d
+ 壜 - 㩜 , w (⥞),
+ $ (⢦ ), .
+
+ 5. ⩜ 磜 ⨚, 㩫: u ( u)
+ ⩜ 梜 , 㩫: U ( U)
+ ⩜ ⩜, 㩫: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 3.1:
+
+
+ ** 㩫 p 㩜 . **
+
+ 1. 婫 髞 ᛘ.
+
+ 2. 㩫 dd ᯜ 穜
+ ਠ 㣞 Vim.
+
+ 3. 婫 ⧜ ᜠ
+ ⤞ .
+
+ 4.  婫 ᩫ, 㩫 p ᢜ .
+
+ 5. ᙜ 㣘 2 4 ᢜ 梜
+ ੫ .
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 3.2:
+
+
+ ** 㩫 r 㨘 ᥜ 夘
+ . **
+
+ 1. 婫 髞 ⤞ --->.
+
+ 2. 婫 ⫩ 驫 夘 髦 ៦.
+
+ 3. 㩫 r 㨘 妪 餜 ៦.
+
+ 4. ᙜ 㣘 2 3 ⮨ 夘 ੫ 髞 .
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. 騘 夜 ៞ 3.2.
+
+: ᩫ 櫠 ⧜ 夜 㩞, 殠
+ 検.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 3.3:
+
+ ** ᥜ 㣘 梞 ⥞, 㩫 cw . **
+
+ 1. 婫 髞 ⤞ --->.
+
+ 2. 㩫 u ⥞ lubw.
+
+ 3. 㩫 cw ੫ ⥞ ( 姫ਫ਼ , ᯫ 'ine'.)
+
+ 4. 㩫 <ESC> 夜 棜 ៦ ( 髦
+ 㨘 ).
+
+ 5. ᙜ 㣘 3 4 ⮨ 櫦 髞 櫘 夘
+ 因 竜.
+
+---> This lubw has a few wptfd that mrrf changing usf the change command.
+---> This line has a few words that need changing using the change command.
+
+婫 櫠 cw 殠 椦 ᜠ ⥞, ᚜
+婞 .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 3.4: c
+
+
+ ** 嫘 因 壜 . **
+
+
+ 1. 眠 因 槦 . 夘:
+
+ [] c 壜 c [] 壜
+
+ 2. 壜 夘 ᢠ 因, w (⥞), $ (⢦ ), .
+
+ 3. 嫜 髞 ⤞ --->.
+
+ 4. 婫 髦 ៦.
+
+ 5. ᯫ c$ ᤜ 梦 因 竜
+ 㩫 <ESC>.
+
+---> 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$ command.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3
+
+
+ 1. 㩜 壜 梠 ⮜ , 㩫 p .
+ ⤦ 壜 ( ᭫
+ ᜠ .
+
+ 2. 㩜 㨘 , 㩫 r
+ 㨘 㩜 .
+
+ 3. ⧜ ᥜ ⤦ 壜
+ ⮨ ⢦ 壜. .. ᯫ cw
+ ᥜ ⮨ ⢦ ⥞, c$ ᥜ
+ ⮨ ⢦ .
+
+ 4. 夘:
+
+ [] c 壜 c [] 壜
+
+騘 婫 棜 ៞.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 4.1:
+
+
+ ** 㩫 CTRL-g ⩞ ᩫ .
+ 㩫 SHIFT-G ᫜ . **
+
+ ਫ਼: ᩫ 桢 ៞ ⩜ ᧦ 㣘!!
+
+ 1. 㩫 ⤦ 㡫 Ctrl 㩫 g . ᩫ
+ ⨦ 囘 椦 妬
+ 婫. 嫜 㣘 3.
+
+ 2. 㩫 shift-G 嫜 ⢦ 妬.
+
+ 3. 㩫 㩘 shift-G.
+ ⯜ 㩘 㩜 髞 Ctrl-g.
+ ( 嫜 , 坦 椞).
+
+ 4. 韜 嚦 , ⩫ 㣘 1 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 4.2:
+
+
+ ** 㩫 / 磜 ᩞ ᮤ. **
+
+ 1. ᩫ 㩫 㨘 / . 㩫 櫠
+ ☪ 坦 ⨦ 椞 : .
+
+ 2. 騘 ᯫ 'errroor' <ENTER>. 夘 ⥞ ⢜ ᥜ.
+
+ 3. ᥜ 因 ᩞ, 㩫 n .
+ ᥜ 因 ᩞ 埜 矬, 㩫 Shift-N .
+
+ 4. ⢜ ᥜ ᩞ , 㩫 ? / .
+
+--->  㫞 ᩜ ⢦ 妬 婜 .
+
+ "errroor" is not the way to spell error; errroor is an error.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 4.3:
+
+
+ ** 㩫 % 嫜 婫 ), ], } . **
+
+ 1. 㩫 ᧦ (, [, {
+ ⤞ --->.
+
+ 2. 騘 㩫 㨘 % .
+
+ 3. ☪ ⧜ 夘 婫 ⤟ 碞.
+
+ 4. 㩫 % 㩜 髞 碞
+ ( ).
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+: 夘 㩠 ਫ਼ ᣣ
+ ⩜!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 4.4:
+
+
+ ** ᯫ :s/old/new/g ᥜ 'new' 'old'. **
+
+ 1. 婫 ⤞ --->.
+
+ 2. ᯫ :s/thee/the <ENTER> . 驫 櫠 ᝜ 椦
+ 髞 ᤠ .
+
+ 3. 騘 ᯫ :s/thee/the/g 餫 ᩫ
+ . ᝜ 梜 婜 .
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. ᥜ ៜ ᤠ 嘪 ,
+ ᯫ :#,#s/old/new/g 槦 #,# .
+ ᯫ :%s/old/new/g ᥜ ៜ ᤠ 梦 .
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4
+
+
+ 1. Ctrl-g 坜 ⩞ ᩫ .
+ Shift-G 夜 ⢦ 妬. 뤘
+ 磜 Shift-G 夜 夞 .
+
+ 2. ᭦ / 磜 ᩞ ᮤ
+ ᩞ. ᭦ ? 磜 ᩞ ᮤ
+ ᩞ. 㫞 㩫 n 嫜
+ 棜 ᤠ 因 矬 Shift-N ᥜ
+ 埜 矬.
+
+ 3. 餫 % 橦 ☪ 夘 (,),[,],{, } 坜
+ 婫 娠 .
+
+ 4. ᩫ new 髦 old ᯫ :s/old/new
+ ᩫ new 'old' ᯫ :s/old/new/g
+ ᩫ ᩜ # ᯫ :#,#s/old/new/g
+ ᩫ 婜 ᯫ :%s/old/new/g
+ 髞 ਫ਼ ៜ ⩫ ⤘ 'c' "%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 5.1:
+
+
+** ᯫ :! 磜 ૜ ⩜. **
+
+ 1. 㩫 : ⩜ ⨦
+ 椞. ⧜ 驜 .
+
+ 2. 騘 㩫 ! (). ⧜ ⩜
+ 㧦 ૜ .
+
+ 3. ᛜ ᯫ ls ! 㩫 <ENTER>.
+ 婜 婫 暦 , 㩘
+ . 㩫 :!dir ls 眠.
+
+---> ਫ਼: 夘 ⩜ 㧦 ૜
+ 槦.
+
+---> ਫ਼:  : ⧜ 坦 餫 <ENTER>.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 5.2:
+
+
+ ** 驜 ᚜ ᤘ , ᯫ :w . **
+
+ 1. ᯫ :!dir :!ls ᨜ 婫 暦 .
+ 웞 ⨜ 櫠 ⧜ 㩜 <ENTER> .
+
+ 2. ⥫ ⤘ 椦 妬 ᨮ 棘, TEST.
+
+ 3. 騘 ᯫ: :w TEST (槦 TEST 夘 椦 妬 ⥘).
+
+ 4. 靜 梦 (vim Tutor) 椦 TEST.
+ 穜, ᯫ :!dir 嫜 ᢦ .
+
+---> 驫 櫠 夘 Vim 夘 椦
+ 妬 TEST, 㫘 嚨 tutor 櫘 驘.
+
+ 5. 騘 ᯫ ᭦ (MS-DOS): :!del TEST
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 5.3:
+
+
+ ** 驜 㣘 妬, ᯫ :#,# w **
+
+ 1. ꢢ , ᯫ :!dir :!ls ᨜ 婫
+ ᢦ ⥫ ⤘ ᢢ 椦 妬 TEST.
+
+ 2. 婫 ⨦ 囘 㩫
+ Ctrl-g 嫜 .
+ !
+
+ 3. 騘 夜 ⨦ 囘 㩫 Ctrl-g .
+ !
+
+ 4. 驜 ⤘ 㣘 , ᯫ :#,# w TEST
+ 槦 #,# 穘 (,) TEST
+ 椦 妬 .
+
+ 5. , 嫜 櫠 夘 :!dir ᯜ.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 5.4:
+
+
+ ** ᚜ 棜 妬, ᯫ :r **
+
+ 1. ᯫ :!dir 嫜 櫠 TEST ᨮ .
+
+ 2. 㩫 ⨦ 囘.
+
+: 櫦 ⩜ 㣘 3 嫜 ៞ 5.3.
+ 嫜 ៞ .
+
+ 3. 騘 㩫 TEST 餫 :r TEST
+ 槦 TEST 夘 椦 妬.
+
+: ᫜ 嫘 餫 婡
+ ☪.
+
+ 4. 穜 櫠 㟞,
+ 㩫 櫠 ᨮ 騘 嚨 㣘 5.3,
+ ⡛ 妬.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5
+
+
+ 1. :! ૜ .
+
+ 㩠 嚣 夘 (MS-DOS):
+ :!dir - ᤠ 婫 暦.
+ :!del - ᭜ .
+
+ 2. :w ᭜ Vim 婡 椦 .
+
+ 3. :#,#w 靜 # ⮨ # .
+
+ 4. :r 婡 ᢢ ⩘
+ ⮦ ⩞ .
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 6.1:
+
+
+ ** 㩫 o 奜
+ 嫜 ᩫ ⤦. **
+
+ 1. 婫 ⤞ --->.
+
+ 2. 㩫 o () 奜
+ 嫜 ᩫ ⤦.
+
+ 3. 騘 ᯫ ⤞ ---> 㩫 <ESC>
+ 嫜 ᩫ ⤦.
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. 奜 , 㩫 ⤘
+ O, ⤘ o. ᩫ .
+嚜 餫 Shift-O 橦 ☪ 夘
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 6.2:
+
+ ** 㩫 a ᚜ 壜 . **
+
+ 1. 婫 ⢦ 髞
+ ⤞ ---> 餫 $ ᩫ.
+
+ 2. 㩫 ⤘ a () ⩜ 壜 㨘
+ 夘 . ( A ⫝̸ ⢦
+ ).
+
+ਫ਼: 皜 ᫞ i , 㨘,
+ 壜 , <ESC>, -, ⢦, x, 椦
+ 椦 ⩜ ⢦ !
+
+ 3. 驫 騘 髞 . 驫 婞 櫠 㡞 夘
+ 因 ᩫ ⤦ ᩫ ,
+ ⩞ ᚜ 壜.
+
+---> This line will allow you to practice
+---> This line will allow you to practice appending text to the end of a line.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 6.3:
+
+
+ ** 㩫 R ᥜ 櫜 ⤘ 㨜. **
+
+ 1. 婫 髞 ⤞ --->.
+
+ 2. 㩫 髞 ⥞ 夘
+ 竜 ⤞ ---> ( ⥞ 'last').
+
+ 3. 㩫 騘 R ᥫ 梦 ⤦ 髞
+ ᭦ 壜 驫 ᤜ 髞 因
+ 竜.
+
+---> To make the first line the same as the last on this page use the keys.
+---> To make the first line the same as the second, type R and the new text.
+
+ 4. 驫 櫠 櫘 ᫜ <ESC> 嫜, ⤜ 㧦
+ ૦ 壜.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ៞ 6.4:
+
+
+ ** 婫 ⫩ 驫 㫞 ᩫ
+ - **
+
+ 1. ᥫ 'ignore' ᚦ:
+ /ignore
+ 婫 餫 㡫 n.
+
+ 2. ⩫ 'ic' (Ignore case) ᭦:
+ :set ic
+
+ 3. ᥫ 騘 'ignore' 餫: n
+ 婫 㫞 棘 餫 㡫 n
+
+ 4. ⩫ 'hlsearch' 'incsearch':
+ :set hls is
+
+ 5. ᚜ 騘 㫞, 嫜 夜
+ /ignore
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6
+
+
+ 1. 餫 o 嚜
+ ᩫ ⤦.
+
+ 2. 㩫 a ᚜ 壜 㨘 夘
+ ☪. 餫 A 棘 ⫝̸ 壜 ⢦
+ .
+
+ 3. 餫 R ⨮ ᩫ ᩫ ⮨
+ <ESC> ⢟.
+
+ 4. ᭦ ":set xxx" 坜 "xxx".
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7: ON-LINE
+
+
+ ** 㩫 on-line 穫 㟜 **
+
+ Vim ⮜ ⤘ on-line 穫 㟜. 㩜,
+ ᩫ ᧦ :
+ - 㩫 㡫 <HELP> ( ⮜ ᧦)
+ - 㩫 㡫 <F1> ( ⮜ ᧦)
+ - ᯫ :help <ENTER>
+
+ ᯫ :q <ENTER> 婜 ៬ 㟜.
+
+ 嫜 嫜 㟜 ៜ 壜, 夦 ᣜ
+ ":help". ᩫ ( ᫜ ᫜ <ENTER>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 8: SCRIPT
+
+ ** 㩫 Vim **
+
+ Vim ⮜ 櫜 ' , Vi,
+ 櫜 夘 ⤘. 婜 嫜
+ 櫜 ⧜ ᥜ ⤘ "vimrc".
+
+ 1. 婫 餦 "vimrc", ᫘ 穫 :
+ :edit ~/.vimrc Unix
+ :edit ~/_vimrc MS-Windows
+
+ 2. 騘 ᚜ 壜 嚣 "vimrc":
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. ᯫ :
+ :write
+
+ 棜 㩜 Vim 㩜 ૠ
+ 礫. 嫜 ⩜ 梜 飜 '
+ "vimrc".
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ 餜 Vim Tutor. 㫘 驜 礫
+ 增 ᡫ Vim, ᮠ 橞 驫 ⯜
+ 㩜 ᡫ 硦. ⮜
+ ⤞ 嘩 Vim ⮜ ᨘ . ᩫ
+ 槠 因 㩞:
+ ":help user-manual".
+
+ ᙘ ⫞, 㤜 :
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+ 髦 ⤦ Vim.
+ 嫜 㩠 ᨠ.
+ ᨮ 嚣 検.
+ 嫜 https://iccf-holland.org/click5.html
+
+ 夘 櫜 櫜 Vi Vim,
+ 婞 飜:
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+ 夘 ⤘ ៜ ᤫ ⢜
+ ᤜ Vi.
+ ⡫ ⡛ ⮜ 棘 圪 Vim.
+
+ 㚞 ᭫ Michael C. Pierce Robert K. Ware,
+ Colorado School of Mines 餫 ✪ Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Vim Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.el.utf-8 b/runtime/tutor/tutor.el.utf-8
new file mode 100644
index 0000000..7cb9741
--- /dev/null
+++ b/runtime/tutor/tutor.el.utf-8
@@ -0,0 +1,815 @@
+===============================================================================
+= Κ αλ ω σ ή ρ θ α τ ε σ τ ο V I M T u t o r - Έκδοση 1.5 =
+===============================================================================
+
+ Ο Vim είναι ένας πανίσχυρος συντάκτης που έχει πολλές εντολές, πάρα
+ πολλές για να εξηγήσουμε σε μία περιήγηση όπως αυτή. Αυτή η περιήγηση
+ σχεδιάστηκε για να περιγράψει ικανοποιητικά τις εντολές που θα σας
+ κάνουν να χρησιμοποιείτε εύκολα τον Vim σαν έναν γενικής χρήσης συντάκτη.
+
+ Ο κατά προσέγγιση χρόνος που απαιτείται για να ολοκληρώσετε την περιήγηση
+ είναι 25-30 λεπτά, εξαρτώντας από το πόσο χρόνο θα ξοδέψετε για
+ πειραματισμούς.
+
+ Οι εντολές στα μαθήματα θα τροποποιήσουν το κείμενο. Δημιουργήστε ένα
+ αντίγραφο αυτού του αρχείου για να εξασκηθείτε (αν ξεκινήσατε το
+ "Vimtutor" αυτό είναι ήδη ένα αντίγραφο).
+
+ Είναι σημαντικό να θυμάστε ότι αυτή η περιήγηση είναι οργανωμένη έτσι
+ ώστε να διδάσκει μέσω της χρήσης. Αυτό σημαίνει ότι χρειάζεται να
+ εκτελείτε τις εντολές για να τις μάθετε σωστά. Αν διαβάζετε μόνο το
+ κείμενο, θα τις ξεχάσετε!
+
+ Τώρα, βεβαιωθείτε ότι το πλήκτρο Caps-Lock ΔΕΝ είναι πατημένο και
+ πατήστε το πλήκτρο j αρκετές φορές για να μετακινήσετε τον δρομέα έτσι
+ ώστε το Μάθημα 1.1 να γεμίσει πλήρως την οθόνη.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 1.1: ΜΕΤΑΚΙΝΟΝΤΑΣ ΤΟΝ ΔΡΟΜΕΑ
+
+ ** Για να κινήσετε τον δρομέα, πατήστε τα πλήκτρα h,j,k,l όπως δείχνεται. **
+ ^
+ k Hint: Το πλήκτρο h είναι αριστερά και κινεί στ' αριστερά.
+ < h l > Το πλήκτρο l είναι δεξιά και κινεί στα δεξιά.
+ j Το πλήκτρο j μοιάζει με βελάκι προς τα κάτω.
+ v
+
+ 1. Μετακινείστε τον δρομέα τριγύρω στην οθόνη μέχρι να νοιώθετε άνετα.
+
+ 2. Κρατήστε πατημένο το κάτω πλήκτρο (j) μέχρι να επαναληφθεί.
+---> Τώρα ξέρετε πώς να μετακινηθείτε στο επόμενο μάθημα.
+
+ 3. Χρησιμοποιώντας το κάτω πλήκτρο, μετακινηθείτε στο Μάθημα 1.2.
+
+Σημείωση: Αν αμφιβάλλετε για κάτι που πατήσατε, πατήστε <ESC> για να βρεθείτε
+ στην Κανονική Κατάσταση. Μετά πατήστε ξανά την εντολή που θέλατε.
+
+Σημείωση: Τα πλήκτρα του δρομέα θα πρέπει επίσης να δουλεύουν. Αλλά με τα hjkl
+ θα μπορείτε να κινηθείτε πολύ γρηγορότερα, μόλις τα συνηθίσετε.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 1.2: ΜΠΑΙΝΟΝΤΑΣ ΚΑΙ ΒΓΑΙΝΟΝΤΑΣ ΣΤΟΝ VIM
+
+ !! ΣΗΜΕΙΩΣΗ: Πριν εκτελέσετε κάποιο από τα βήματα, διαβάστε όλο το μάθημα!!
+
+ 1. Πατήστε το πλήκτρο <ESC> (για να είστε σίγουρα στην Κανονική Κατάσταση).
+
+ 2. Πληκτρολογήστε: :q! <ENTER>.
+
+---> Αυτό εξέρχεται από τον συντάκτη ΧΩΡΙΣ να σώσει όποιες αλλαγές έχετε κάνει.
+ Αν θέλετε να σώσετε τις αλλαγές και να εξέρθετε πληκτρολογήστε:
+ :wq <ENTER>
+
+ 3. Όταν δείτε την προτροπή του φλοιού, πληκτρολογήστε την εντολή με την οποία
+ μπήκατε σε αυτήν την περιήγηση. Μπορεί να είναι: vimtutor <ENTER>
+ Κανονικά θα χρησιμοποιούσατε: vim tutor <ENTER>
+
+---> 'vim' σημαίνει εισαγωγή στον συντάκτη vim, 'tutor' είναι το αρχείο που
+ θέλουμε να διορθώσουμε.
+
+ 4. Αν έχετε απομνημονεύσει αυτά τα βήματα και έχετε αυτοπεποίθηση, εκτελέστε
+ τα βήματα 1 έως 3 για να βγείτε και να μπείτε ξανά στον συντάκτη. Μετά
+ μετακινήστε τον δρομέα κάτω στο Μάθημα 1.3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 1.3: ΔΙΟΡΘΩΣΗ ΚΕΙΜΕΝΟΥ - ΔΙΑΓΡΑΦΗ
+
+ ** Όσο είστε στην Κανονική Κατάσταση πατήστε x για να διαγράψετε τον
+ χαρακτήρα κάτω από τον δρομέα. **
+
+ 1. Μετακινείστε τον δρομέα στην παρακάτω γραμμή σημειωμένη με --->.
+
+ 2. Για να διορθώσετε τα λάθη, κινείστε τον δρομέα μέχρι να είναι πάνω από
+ τον χαρακτήρα που θα διαγραφεί.
+
+ 3. Πατήστε το πλήκτρο x για να διαγράψετε τον ανεπιθύμητο χαρακτήρα.
+
+ 4. Επαναλάβετε τα βήματα 2 μέχρι 4 μέχρι η πρόταση να είναι σωστή.
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. Τώρα που η γραμμή είναι σωστή, πηγαίντε στο Μάθημα 1.4.
+
+ΣΗΜΕΙΩΣΗ: Καθώς διατρέχετε αυτήν την περιήγηση, προσπαθήστε να μην
+ απομνημονεύετε, μαθαίνετε με τη χρήση.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 1.4: ΔΙΟΡΘΩΣΗ ΚΕΙΜΕΝΟΥ - ΠΑΡΕΜΒΟΛΗ
+
+ ** Όσο είστε σε Κανονική Κατάσταση πατήστε i για να παρεμβάλλετε κείμενο. **
+
+ 1. Μετακινείστε τον δρομέα μέχρι την πρώτη γραμμή παρακάτω σημειωμένη με --->.
+
+ 2. Για να κάνετε την πρώτη γραμμή ίδια με την δεύτερη, μετακινείστε τον
+ δρομέα πάνω στον πρώτο χαρακτήρα ΜΕΤΑ από όπου θα παρεμβληθεί το κείμενο.
+
+ 3. Πατήστε το i και πληκτρολογήστε τις απαραίτητες προσθήκες.
+
+ 4. Καθώς διορθώνετε κάθε λάθος πατήστε <ESC> για να επιστρέψετε στην
+ Κανονική Κατάσταση. Επαναλάβετε τα βήματα 2 μέχρι 4 για να διορθώσετε
+ την πρόταση.
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5. Όταν είστε άνετοι με την παρεμβολή κειμένου μετακινηθείτε στην
+ παρακάτω περίληψη.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ΜΑΘΗΜΑ 1 ΠΕΡΙΛΗΨΗ
+
+
+ 1. Ο δρομέας κινείται χρησιμοποιώντας είτε τα πλήκτρα δρομέα ή τα hjkl.
+ h (αριστέρα) j (κάτω) k (πάνω) l (δεξιά)
+
+ 2. Για να μπείτε στον Vim (από την προτροπή %) γράψτε: vim ΑΡΧΕΙΟ <ENTER>
+
+ 3. Για να βγείτε γράψτε: <ESC> :q! <ENTER> για απόρριψη των αλλαγών.
+ Ή γράψτε: <ESC> :wq <ENTER> για αποθήκευση των αλλαγών.
+
+ 4. Για να διαγράψετε έναν χαρακτήρα κάτω από τον δρομέα σε
+ Κανονική Κατάσταση πατήστε: x
+
+ 5. Για να εισάγετε κείμενο στον δρομέα όσο είστε σε Κανονική Κατάσταση γράψτε:
+ i πληκτρολογήστε το κείμενο <ESC>
+
+ΣΗΜΕΙΩΣΗ: Πατώντας <ESC> θα τοποθετηθείτε στην Κανονική Κατάσταση ή θα
+ ακυρώσετε μία ανεπιθύμητη και μερικώς ολοκληρωμένη εντολή.
+
+Τώρα συνεχίστε με το Μάθημα 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 2.1: ΕΝΤΟΛΕΣ ΔΙΑΓΡΑΦΗΣ
+
+ ** Γράψτε dw για να διαγράψετε μέχρι το τέλος μίας λέξης. **
+
+ 1. Πατήστε <ESC> για να βεβαιωθείτε ότι είστε στην Κανονική Κατάσταση.
+
+ 2. Μετακινείστε τον δρομέα στην παρακάτω γραμμή σημειωμένη με --->.
+
+ 3. Πηγαίνετε τον δρομέα στην αρχή της λέξης που πρέπει να διαγραφεί.
+
+ 4. Γράψτε dw για να κάνετε την λέξη να εξαφανιστεί.
+
+ΣΗΜΕΙΩΣΗ: Τα γράμματα dw θα εμφανιστούν στην τελευταία γραμμή της οθόνης όσο
+ τα πληκτρολογείτε. Αν γράψατε κάτι λάθος, πατήστε <ESC> και
+ ξεκινήστε από την αρχή.
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. Επαναλάβετε τα βήματα 3 και 4 μέχρι η πρόταση να είναι σωστή και
+ πηγαίνετε στο Μάθημα 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 2.2: ΠΕΡΙΣΣΟΤΕΡΕΣ ΕΝΤΟΛΕΣ ΔΙΑΓΡΑΦΗΣ
+
+ ** Πληκτρολογήστε d$ για να διαγράψετε μέχρι το τέλος της γραμμής. **
+
+ 1. Πατήστε <ESC> για να βεβαιωθείτε ότι είστε στην Κανονική Κατάσταση.
+
+ 2. Μετακινείστε τον δρομέα στην παρακάτω γραμμή σημειωμένη με --->.
+
+ 3. Μετακινείστε τον δρομέα στο τέλος της σωστής γραμμής (ΜΕΤΑ την πρώτη . ).
+
+ 4. Πατήστε d$ για να διαγράψετε μέχρι το τέλος της γραμμής.
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+ 5. Πηγαίνετε στο Μάθημα 2.3 για να καταλάβετε τι συμβαίνει.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 2.3: ΠΕΡΙ ΕΝΤΟΛΩΝ ΚΑΙ ΑΝΤΙΚΕΙΜΕΝΩΝ
+
+
+Η μορφή της εντολής διαγραφής d είναι ως εξής:
+
+ [αριθμός] d αντικείμενο Ή d [αριθμός] αντικείμενο
+ Όπου:
+ αριθμός - πόσες φορές θα εκτελεστεί η εντολή (προαιρετικό, εξ' ορισμού=1).
+ d - η εντολή της διαγραφής.
+ αντικείμενο - πάνω σε τι θα λειτουργήσει η εντολή (παρακάτω λίστα).
+
+ Μία μικρή λίστα από αντικείμενα:
+ w - από τον δρομέα μέχρι το τέλος της λέξης, περιλαμβάνοντας το διάστημα.
+ e - από τον δρομέα μέχρι το τέλος της λέξης, ΧΩΡΙΣ το διάστημα.
+ $ - από τον δρομέα μέχρι το τέλος της γραμμής.
+
+ΣΗΜΕΙΩΣΗ: Για τους τύπους της περιπέτειας, πατώντας απλώς το αντικείμενο όσο
+ είστε στην Κανονική Κατάσταση χωρίς κάποια εντολή θα μετακινήσετε
+ τον δρομέα όπως καθορίζεται στην λίστα αντικειμένων.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 2.4: ΜΙΑ ΕΞΑΙΡΕΣΗ ΣΤΗΝ 'ΕΝΤΟΛΗ-ΑΝΤΙΚΕΙΜΕΝΟ'
+
+ ** Πληκτρολογήστε dd για να διαγράψετε όλη τη γραμμή. **
+
+ Εξαιτίας της συχνότητας της διαγραφής ολόκληρης γραμμής, οι σχεδιαστές
+ του Vim αποφάσισαν ότι θα ήταν ευκολότερο να γράφετε απλώς δύο d στη
+ σειρά για να διαγράψετε μία γραμμή.
+
+ 1. Μετακινείστε τον δρομέα στη δεύτερη γραμμή της παρακάτω φράσης.
+ 2. Γράψτε dd για να διαγράψετε τη γραμμή.
+ 3. Τώρα μετακινηθείτε στην τέταρτη γραμμή.
+ 4. Γράψτε 2dd (θυμηθείτε αριθμός-εντολή-αντικείμενο) για να
+ διαγράψετε δύο γραμμές.
+
+ 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 2.5: Η ΕΝΤΟΛΗ ΑΝΑΙΡΕΣΗΣ
+
+ ** Πατήστε u για να αναιρέσετε τις τελευταίες εντολές,
+ U για να διορθώσετε όλη τη γραμμή. **
+
+ 1. Μετακινείστε τον δρομέα στην παρακάτω γραμμή σημειωμένη με ---> και
+ τοποθετήστε τον πάνω στο πρώτο λάθος.
+ 2. Πατήστε x για να διαγράψετε τον πρώτο ανεπιθύμητο χαρακτήρα.
+ 3. Τώρα πατήστε u για να αναιρέσετε την τελευταία εκτελεσμένη εντολή.
+ 4. Αυτή τη φορά διορθώστε όλα τα λάθη στη γραμμή χρησιμοποιώντας την εντολή x.
+ 5. Τώρα πατήστε ένα κεφαλαίο U για να επιστρέψετε τη γραμμή στην αρχική
+ της κατάσταση.
+ 6. Τώρα πατήστε u μερικές φορές για να αναιρέσετε την U και
+ προηγούμενες εντολές.
+ 7. Τώρα πατήστε CTRL-R (κρατώντας πατημένο το πλήκτρο CTRL καθώς πατάτε το R)
+ μερικές φορές για να επαναφέρετε τις εντολές (αναίρεση των αναιρέσεων).
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. Αυτές είναι πολύ χρήσιμες εντολές. Τώρα πηγαίνετε στην
+ Περίληψη του Μαθήματος 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ΜΑΘΗΜΑ 2 ΠΕΡΙΛΗΨΗ
+
+
+ 1. Για να διαγράψετε από τον δρομέα μέχρι το τέλος λέξης γράψτε: dw
+
+ 2. Για να διαγράψετε από τον δρομέα μέχρι το τέλος γραμμής γράψτε: d$
+
+ 3. Για να διαγράψετε ολόκληρη τη γραμμή γράψτε: dd
+
+ 4. Η μορφή για μία εντολή στην Κανονική Κατάσταση είναι:
+
+ [αριθμός] εντολή αντικείμενο Ή εντολή [αριθμός] αντικείμενο
+ όπου:
+ αριθμός - πόσες φορές να επαναληφθεί η εντολή
+ εντολή - τι να γίνει, όπως η d για διαγραφή
+ αντικείμενο - πάνω σε τι να ενεργήσει η εντολή, όπως w (λέξη),
+ $ (τέλος της γραμμής), κτλ.
+
+ 5. Για να αναιρέσετε προηγούμενες ενέργειες, πατήστε: u (πεζό u)
+ Για να αναιρέσετε όλες τις αλλαγές στη γραμμή, πατήστε: U (κεφαλαίο U)
+ Για να αναιρέσετε τις αναιρέσεις, πατήστε: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 3.1: Η ΕΝΤΟΛΗ ΤΟΠΟΘΕΤΗΣΗΣ
+
+
+ ** Πατήστε p για να τοποθετήσετε την τελευταία διαγραφή μετά τον δρομέα. **
+
+ 1. Μετακινείστε τον δρομέα στην πρώτη γραμμή της παρακάτω ομάδας.
+
+ 2. Πατήστε dd για να διαγράψετε τη γραμμή και να την αποθηκεύσετε σε
+ προσωρινή μνήμη του Vim.
+
+ 3. Μετακινείστε τον δρομέα στη γραμμή ΠΑΝΩ από εκεί που θα πρέπει να πάει
+ η διαγραμμένη γραμμή.
+
+ 4. Όσο είστε σε Κανονική Κατάσταση, πατήστε p για να βάλετε τη γραμμή.
+
+ 5. Επαναλάβετε τα βήματα 2 έως 4 για να βάλετε όλες τις γραμμές στη
+ σωστή σειρά.
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 3.2: Η ΕΝΤΟΛΗ ΑΝΤΙΚΑΤΑΣΤΑΣΗΣ
+
+
+ ** Πατήστε r και χαρακτήρα για να αλλάξετε αυτόν που είναι
+ κάτω από τον δρομέα. **
+
+ 1. Μετακινείστε τον δρομέα στην πρώτη γραμμή παρακάτω σημειωμένη με --->.
+
+ 2. Μετακινείστε τον δρομέα έτσι ώστε να είναι πάνω στο πρώτο λάθος.
+
+ 3. Πατήστε r και μετά τον χαρακτήρα ο οποίος διορθώνει το λάθος.
+
+ 4. Επαναλάβετε τα βήματα 2 και 3 μέχρι να είναι σωστή η πρώτη γραμμή.
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. Τώρα πηγαίνετε στο Μάθημα 3.2.
+
+ΣΗΜΕΙΩΣΗ: Να θυμάστε ότι πρέπει να μαθαίνετε με τη χρήση, και όχι με
+ την απομνημόνευση.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 3.3: Η ΕΝΤΟΛΗ ΑΛΛΑΓΗΣ
+
+ ** Για να αλλάξετε τμήμα ή όλη τη λέξη, πατήστε cw . **
+
+ 1. Μετακινείστε τον δρομέα στην πρώτη γραμμή παρακάτω σημειωμένη με --->.
+
+ 2. Τοποθετήστε τον δρομέα πάνω στο u της λέξης lubw.
+
+ 3. Πατήστε cw και τη σωστή λέξη (στην περίπτωση αυτή, γράψτε 'ine'.)
+
+ 4. Πατήστε <ESC> και πηγαίνετε στο επόμενο λάθος (στον πρώτο
+ χαρακτήρα προς αλλαγή).
+
+ 5. Επαναλάβετε τα βήματα 3 και 4 μέχρις ότου η πρώτη πρόταση να είναι
+ ίδια με τη δεύτερη.
+
+---> This lubw has a few wptfd that mrrf changing usf the change command.
+---> This line has a few words that need changing using the change command.
+
+Παρατηρείστε ότι η cw όχι μόνο αντικαθιστάει τη λέξη, αλλά σας εισάγει
+επίσης σε παρεμβολή.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 3.4: ΠΕΡΙΣΣΟΤΕΡΕΣ ΑΛΛΑΓΕΣ ΜΕ c
+
+
+ ** Η εντολή αλλαγής χρησιμοποιείται με τα ίδια αντικείμενα της διαγραφής. **
+
+
+ 1. Η εντολή αλλαγής δουλεύει με τον ίδιο τρόπο όπως η διαγραφή. Η μορφή είναι:
+
+ [αριθμός] c αντικείμενο Ή c [αριθμός] αντικείμενο
+
+ 2. Τα αντικείμενα είναι πάλι τα ίδια, όπως w (λέξη), $ (τέλος γραμμής), κτλ.
+
+ 3. Μετακινηθείτε στην πρώτη γραμμή παρακάτω σημειωμένη με --->.
+
+ 4. Μετακινείστε τον δρομέα στο πρώτο λάθος.
+
+ 5. Γράψτε c$ για να κάνετε το υπόλοιπο της γραμμής ίδιο με τη δεύτερη
+ και πατήστε <ESC>.
+
+---> 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$ command.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ΜΑΘΗΜΑ 3 ΠΕΡΙΛΗΨΗ
+
+
+ 1. Για να τοποθετήσετε κείμενο που μόλις έχει διαγραφεί, πατήστε p .
+ Αυτό τοποθετεί το διαγραμμένο κείμενο ΜΕΤΑ τον δρομέα (αν διαγράφτηκε
+ γραμμή θα πάει μετά στη γραμμή κάτω από τον δρομέα.
+
+ 2. Για να αντικαταστήσετε τον χαρακτήρα κάτω από τον δρομέα, πατήστε r
+ και μετά τον χαρακτήρα που θα αντικαταστήσει τον αρχικό.
+
+ 3. Η εντολή αλλαγής σας επιτρέπει να αλλάξετε το καθορισμένο αντικείμενο
+ από τον δρομέα μέχρι το τέλος του αντικείμενο. Π.χ. γράψτε cw για να
+ αλλάξετε από τον δρομέα μέχρι το τέλος της λέξης, c$ για να αλλάξετε
+ μέχρι το τέλος γραμμής.
+
+ 4. Η μορφή για την αλλαγή είναι:
+
+ [αριθμός] c αντικείμενο Ή c [αριθμός] αντικείμενο
+
+Τώρα συνεχίστε με το επόμενο μάθημα.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 4.1: ΘΕΣΗ ΚΑΙ ΚΑΤΑΣΤΑΣΗ ΑΡΧΕΙΟΥ
+
+
+ ** Πατήστε CTRL-g για να εμφανιστεί η θέση σας στο αρχείο και η κατάστασή του.
+ Πατήστε SHIFT-G για να πάτε σε μία γραμμή στο αρχείο. **
+
+ Σημείωση: Διαβάστε ολόκληρο το μάθημα πριν εκτελέσετε κάποιο από τα βήματα!!
+
+ 1. Κρατήστε πατημένο το πλήκτρο Ctrl και πατήστε g . Μία γραμμή κατάστασης
+ θα εμφανιστεί στο κάτω μέρος της σελίδας με το όνομα αρχείου και τη
+ γραμμή που είστε. Θυμηθείτε τον αριθμό γραμμής για το Βήμα 3.
+
+ 2. Πατήστε shift-G για να μετακινηθείτε στο τέλος του αρχείου.
+
+ 3. Πατήστε τον αριθμό της γραμμής που ήσασταν και μετά shift-G. Αυτό θα
+ σας επιστρέψει στη γραμμή που ήσασταν πριν πατήσετε για πρώτη φορά Ctrl-g.
+ (Όταν πληκτρολογείτε τους αριθμούς, ΔΕΝ θα εμφανίζονται στην οθόνη).
+
+ 4. Αν νοιώθετε σίγουρος για αυτό, εκτελέστε τα βήματα 1 έως 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 4.2: Η ΕΝΤΟΛΗ ΑΝΑΖΗΤΗΣΗΣ
+
+
+ ** Πατήστε / ακολουθούμενο από τη φράση που ψάχνετε. **
+
+ 1. Σε Κανονική Κατάσταση πατήστε τον χαρακτήρα / . Παρατηρήστε ότι αυτός και
+ ο δρομέας εμφανίζονται στο κάτω μέρος της οθόνης όπως με την εντολή : .
+
+ 2. Τώρα γράψτε 'errroor' <ENTER>. Αυτή είναι η λέξη που θέλετε να ψάξετε.
+
+ 3. Για να ψάξετε ξανά για την ίδια φράση, πατήστε απλώς n .
+ Για να ψάξετε την ίδια φράση στην αντίθετη κατεύθυνση, πατήστε Shift-N .
+
+ 4. Αν θέλετε να ψάξετε για μία φράση προς τα πίσω, χρησιμοποιήστε την εντολή ? αντί της / .
+
+---> Όταν η αναζήτηση φτάσει στο τέλος του αρχείου θα συνεχίσει από την αρχή.
+
+ "errroor" is not the way to spell error; errroor is an error.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 4.3: ΕΥΡΕΣΗ ΤΑΙΡΙΑΣΤΩΝ ΠΑΡΕΝΘΕΣΕΩΝ
+
+
+ ** Πατήστε % για να βρείτε την αντίστοιχη ), ], ή } . **
+
+ 1. Τοποθετήστε τον δρομέα σε κάποια (, [, ή { στην παρακάτω γραμμή
+ σημειωμένη με --->.
+
+ 2. Τώρα πατήστε τον χαρακτήρα % .
+
+ 3. Ο δρομέας θα πρέπει να είναι στην αντίστοιχη παρένθεση ή αγκύλη.
+
+ 4. Πατήστε % για να μετακινήσετε τον δρομέα πίσω στην πρώτη αγκύλη
+ (του ζευγαριού).
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+ΣΗΜΕΙΩΣΗ: Αυτό είναι πολύ χρήσιμο στην αποσφαλμάτωση ενός προγράμματος
+ με μη ταιριαστές παρενθέσεις!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 4.4: ΕΝΑΣ ΤΡΟΠΟΣ ΓΙΑ ΑΛΛΑΓΗ ΛΑΘΩΝ
+
+
+ ** Γράψτε :s/old/new/g για να αλλάξετε το 'new' με το 'old'. **
+
+ 1. Μετακινείστε τον δρομέα στην παρακάτω γραμμή σημειωμένη με --->.
+
+ 2. Γράψτε :s/thee/the <ENTER> . Σημειώστε ότι αυτή η εντολή αλλάζει μόνο
+ την πρώτη εμφάνιση στη γραμμή.
+
+ 3. Τώρα γράψτε :s/thee/the/g εννοώντας γενική αντικατάσταση στη
+ γραμμή. Αυτό αλλάζει όλες τις εμφανίσεις επί της γραμμής.
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. Για να αλλάξετε κάθε εμφάνιση μίας συμβολοσειράς μεταξύ δύο γραμμών,
+ γράψτε :#,#s/old/new/g όπου #,# οι αριθμοί των δύο γραμμών.
+ Γράψτε :%s/old/new/g για να αλλάξετε κάθε εμφάνιση σε όλο το αρχείο.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ΜΑΘΗΜΑ 4 ΠΕΡΙΛΗΨΗ
+
+
+ 1. Το Ctrl-g εμφανίζει τη θέση σας στο αρχείο και την κατάστασή του.
+ Το Shift-G πηγαίνει στο τέλος του αρχείου. Ένας αριθμός γραμμής
+ ακολουθούμενος από Shift-G πηγαίνει σε εκείνη τη γραμμή.
+
+ 2. Γράφοντας / ακολουθούμενο από μία φράση ψάχνει προς τα ΜΠΡΟΣΤΑ για
+ τη φράση. Γράφοντας ? ακολουθούμενο από μία φράση ψάχνει προς τα ΠΙΣΩ
+ για τη φράση. Μετά από μία αναζήτηση πατήστε n για να βρείτε την
+ επόμενη εμφάνιση προς την ίδια κατεύθυνση ή Shift-N για να ψάξετε
+ προς την αντίθετη κατεύθυνση.
+
+ 3. Πατώντας % όσο ο δρομέας είναι πάνω σε μία (,),[,],{, ή } εντοπίζει
+ το αντίστοιχο ταίρι του ζευγαριού.
+
+ 4. Για αντικατάσταση με new του πρώτου old στη γραμμή γράψτε :s/old/new
+ Για αντικατάσταση με new όλων των 'old' στη γραμμή γράψτε :s/old/new/g
+ Για αντικατάσταση φράσεων μεταξύ δύο # γραμμών γράψτε :#,#s/old/new/g
+ Για αντικατάσταση όλων των εμφανίσεων στο αρχείο γράψτε :%s/old/new/g
+ Για ερώτηση επιβεβαίωσης κάθε φορά προσθέστε ένα 'c' "%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 5.1: ΠΩΣ ΕΚΤΕΛΩ ΜΙΑ ΕΞΩΤΕΡΙΚΗ ΕΝΤΟΛΗ
+
+
+** Γράψτε :! ακολουθούμενο από μία εξωτερική εντολή για να την εκτελέσετε. **
+
+ 1. Πατήστε την οικεία εντολή : για να θέσετε τον δρομέα στο κάτω μέρος
+ της οθόνης. Αυτό σας επιτρέπει να δώσετε μία εντολή.
+
+ 2. Τώρα πατήστε το ! (θαυμαστικό). Αυτό σας επιτρέπει να εκτελέσετε
+ οποιαδήποτε εξωτερική εντολή του φλοιού.
+
+ 3. Σαν παράδειγμα γράψτε ls μετά από το ! και πατήστε <ENTER>. Αυτό θα
+ σας εμφανίσει μία λίστα του καταλόγου σας, ακριβώς σαν να ήσασταν στην
+ προτροπή του φλοιού. Ή χρησιμοποιήστε :!dir αν το ls δεν δουλεύει.
+
+---> Σημείωση: Είναι δυνατόν να εκτελέσετε οποιαδήποτε εξωτερική εντολή
+ με αυτόν τον τρόπο.
+
+---> Σημείωση: Όλες οι εντολές : πρέπει να τερματίζονται πατώντας το <ENTER>.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 5.2: ΠΕΡΙΣΣΟΤΕΡΑ ΠΕΡΙ ΕΓΓΡΑΦΗΣ ΑΡΧΕΙΩΝ
+
+
+ ** Για να σώσετε τις αλλάγες που κάνατε στο αρχείο, γράψτε :w ΑΡΧΕΙΟ. **
+
+ 1. Γράψτε :!dir ή :!ls για να πάρετε μία λίστα του καταλόγου σας.
+ Ήδη ξέρετε ότι πρέπει να πατήσετε <ENTER> μετά από αυτό.
+
+ 2. Διαλέξτε ένα όνομα αρχείου που δεν υπάρχει ακόμα, όπως το TEST.
+
+ 3. Τώρα γράψτε: :w TEST (όπου TEST είναι το όνομα αρχείου που διαλέξατε).
+
+ 4. Αυτό σώζει όλο το αρχείο (vim Tutor) με το όνομα TEST. Για να το
+ επαληθεύσετε, γράψτε ξανά :!dir για να δείτε τον κατάλογό σας.
+
+---> Σημειώστε ότι αν βγαίνατε από τον Vim και μπαίνατε ξανά με το όνομα
+ αρχείου TEST, το αρχείο θα ήταν ακριβές αντίγραφο του tutor όταν το σώσατε.
+
+ 5. Τώρα διαγράψτε το αρχείο γράφοντας (MS-DOS): :!del TEST
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 5.3: ΕΠΙΛΕΚΤΙΚΗ ΕΝΤΟΛΗ ΕΓΓΡΑΦΗΣ
+
+
+ ** Για να σώσετε τμήμα του αρχείου, γράψτε :#,# w ΑΡΧΕΙΟ **
+
+ 1. Άλλη μια φορά, γράψτε :!dir ή :!ls για να πάρετε μία λίστα από τον
+ κατάλογό σας και διαλέξτε ένα κατάλληλο όνομα αρχείου όπως το TEST.
+
+ 2. Μετακινείστε τον δρομέα στο πάνω μέρος αυτής της σελίδας και πατήστε
+ Ctrl-g για να βρείτε τον αριθμό αυτής της γραμμής.
+ ΝΑ ΘΥΜΑΣΤΕ ΑΥΤΟΝ ΤΟΝ ΑΡΙΘΜΟ!
+
+ 3. Τώρα πηγαίνετε στο κάτω μέρος της σελίδας και πατήστε Ctrl-g ξανά.
+ ΝΑ ΘΥΜΑΣΤΕ ΚΑΙ ΑΥΤΟΝ ΤΟΝ ΑΡΙΘΜΟ!
+
+ 4. Για να σώσετε ΜΟΝΟ ένα τμήμα σε αρχείο, γράψτε :#,# w TEST
+ όπου #,# οι δύο αριθμοί που απομνημονεύσατε (πάνω,κάτω) και TEST το
+ όνομα του αρχείου σας.
+
+ 5. Ξανά, δείτε ότι το αρχείο είναι εκεί με την :!dir αλλά ΜΗΝ το διαγράψετε.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 5.4: ΑΝΑΚΤΩΝΤΑΣ ΚΑΙ ΕΝΩΝΟΝΤΑΣ ΑΡΧΕΙΑ
+
+
+ ** Για να εισάγετε τα περιεχόμενα ενός αρχείου, γράψτε :r ΑΡΧΕΙΟ **
+
+ 1. Γράψτε :!dir για να βεβαιωθείτε ότι το TEST υπάρχει από πριν.
+
+ 2. Τοποθετήστε τον δρομέα στο πάνω μέρος της σελίδας.
+
+ΣΗΜΕΙΩΣΗ: Αφότου εκτελέσετε το Βήμα 3 θα δείτε το Μάθημα 5.3.
+ Μετά κινηθείτε ΚΑΤΩ ξανά προς το μάθημα αυτό.
+
+ 3. Τώρα ανακτήστε το αρχείο σας TEST χρησιμοποιώντας την εντολή :r TEST
+ όπου TEST είναι το όνομα του αρχείου.
+
+ΣΗΜΕΙΩΣΗ: Το αρχείο που ανακτάτε τοποθετείται ξεκινώντας εκεί που βρίσκεται
+ ο δρομέας.
+
+ 4. Για να επαληθεύσετε ότι το αρχείο ανακτήθηκε, πίσω τον δρομέα και
+ παρατηρήστε ότι υπάρχουν τώρα δύο αντίγραφα του Μαθήματος 5.3, το
+ αρχικό και η έκδοση του αρχείου.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ΜΑΘΗΜΑ 5 ΠΕΡΙΛΗΨΗ
+
+
+ 1. :!εντολή εκτελεί μία εξωτερική εντολή.
+
+ Μερικά χρήσιμα παραδείγματα είναι (MS-DOS):
+ :!dir - εμφάνιση λίστας ενός καταλόγου.
+ :!del ΑΡΧΕΙΟ - διαγράφει το ΑΡΧΕΙΟ.
+
+ 2. :w ΑΡΧΕΙΟ γράφει το τρέχων αρχείο του Vim στο δίσκο με όνομα ΑΡΧΕΙΟ.
+
+ 3. :#,#w ΑΡΧΕΙΟ σώζει τις γραμμές από # μέχρι # στο ΑΡΧΕΙΟ.
+
+ 4. :r ΑΡΧΕΙΟ ανακτεί το αρχείο δίσκου ΑΡΧΕΙΟ και το παρεμβάλλει μέσα
+ στο τρέχον αρχείο μετά από τη θέση του δρομέα.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 6.1: Η ΕΝΤΟΛΗ ΑΝΟΙΓΜΑΤΟΣ
+
+
+ ** Πατήστε o για να ανοίξετε μία γραμμή κάτω από τον δρομέα και να
+ βρεθείτε σε Κατάσταση Κειμένου. **
+
+ 1. Μετακινείστε τον δρομέα στην παρακάτω γραμμή σημειωμένη με --->.
+
+ 2. Πατήστε o (πεζό) για να ανοίξετε μία γραμμή ΚΑΤΩ από τον δρομέα και να
+ βρεθείτε σε Κατάσταση Κειμένου.
+
+ 3. Τώρα αντιγράψτε τη σημειωμένη με ---> γραμμή και πατήστε <ESC> για να
+ βγείτε από την Κατάσταση Κειμένου.
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. Για να ανοίξετε μία γραμμή ΠΑΝΩ από τον δρομέα, πατήστε απλά ένα κεφαλαίο
+ O, αντί για ένα πεζό o. Δοκιμάστε το στην παρακάτω γραμμή.
+Ανοίγετε γραμμή πάνω από αυτήν πατώντας Shift-O όσο ο δρομέας είναι στη γραμμή
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 6.2: Η ΕΝΤΟΛΗ ΠΡΟΣΘΗΚΗΣ
+
+ ** Πατήστε a για να εισάγετε κείμενο ΜΕΤΑ τον δρομέα. **
+
+ 1. Μετακινείστε τον δρομέα στο τέλος της πρώτης γραμμής παρακάτω
+ σημειωμένη με ---> πατώντας $ στην Κανονική Κατάσταση.
+
+ 2. Πατήστε ένα a (πεζό) για να προσθέσετε κείμενο ΜΕΤΑ από τον χαρακτήρα
+ που είναι κάτω από τον δρομέα. (Το κεφαλαίο A προσθέτει στο τέλος
+ της γραμμής).
+
+Σημείωση: Αυτό αποφεύγει το πάτημα του i , τον τελευταίο χαρακτήρα, το
+ κείμενο της εισαγωγής, <ESC>, δρομέα-δεξιά, και τέλος, x, μόνο και
+ μόνο για να προσθέσετε στο τέλος της γραμμής!
+
+ 3. Συμπληρώστε τώρα την πρώτη γραμμή. Σημειώστε επίσης ότι η προσθήκη είναι
+ ακριβώς ίδια στην Κατάσταση Κειμένου με την Κατάσταση Εισαγωγής, εκτός
+ από τη θέση που εισάγεται το κείμενο.
+
+---> This line will allow you to practice
+---> This line will allow you to practice appending text to the end of a line.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 6.3: ΑΛΛΗ ΕΚΔΟΣΗ ΤΗΣ ΑΝΤΙΚΑΤΑΣΤΑΣΗΣ
+
+
+ ** Πατήστε κεφαλαίο R για να αλλάξετε περισσότερους από έναν χαρακτήρες. **
+
+ 1. Μετακινείστε τον δρομέα στην πρώτη γραμμή παρακάτω σημειωμένη με --->.
+
+ 2. Τοποθετήστε τον δρομέα στην αρχή της πρώτης λέξης που είναι διαφορετική
+ από τη δεύτερη γραμμή σημειωμένη με ---> (η λέξη 'last').
+
+ 3. Πατήστε τώρα R και αλλάξτε το υπόλοιπο του κειμένου στην πρώτη γραμμή
+ γράφοντας πάνω από το παλιό κείμενο ώστε να κάνετε την πρώτη γραμμή ίδια
+ με τη δεύτερη.
+
+---> To make the first line the same as the last on this page use the keys.
+---> To make the first line the same as the second, type R and the new text.
+
+ 4. Σημειώστε ότι όταν πατάτε <ESC> για να βγείτε, παραμένει οποιοδήποτε
+ αναλλοίωτο κείμενο.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Μάθημα 6.4: ΡΥΘΜΙΣΗ ΕΠΙΛΟΓΗΣ
+
+
+ ** Ρυθμίστε μία επιλογή έτσι ώστε η αναζήτηση ή η αντικατάσταση να αγνοεί
+ τη διαφορά πεζών-κεφαλαίων **
+
+ 1. Ψάξτε για 'ignore' εισάγοντας:
+ /ignore
+ Συνεχίστε αρκετές φορές πατώντας το πλήκτρο n.
+
+ 2. Θέστε την επιλογή 'ic' (Ignore case) γράφοντας:
+ :set ic
+
+ 3. Ψάξτε τώρα ξανά για 'ignore' πατώντας: n
+ Συνεχίστε την αναζήτηση μερικές ακόμα φορές πατώντας το πλήκτρο n
+
+ 4. Θέστε τις επιλογές 'hlsearch' και 'incsearch':
+ :set hls is
+
+ 5. Εισάγετε τώρα ξανά την εντολή αναζήτησης, και δείτε τι συμβαίνει
+ /ignore
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ΜΑΘΗΜΑ 6 ΠΕΡΙΛΗΨΗ
+
+
+ 1. Πατώντας o ανοίγει μία γραμμή ΚΑΤΩ από τον δρομέα και τοποθετεί τον
+ δρομέα στην ανοιχτή γραμμή σε Κατάσταση Κειμένου.
+
+ 2. Πατήστε a για να εισάγετε κείμενο ΜΕΤΑ τον χαρακτήρα στον οποίο είναι
+ ο δρομέας. Πατώντας κεφαλαίο A αυτόματα προσθέτει κείμενο στο τέλος
+ της γραμμής.
+
+ 3. Πατώντας κεφαλαίο R εισέρχεται στην Κατάσταη Αντικατάστασης μέχρι να
+ πατηθεί το <ESC> και να εξέλθει.
+
+ 4. Γράφοντας ":set xxx" ρυθμίζει την επιλογή "xxx".
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ΜΑΘΗΜΑ 7: ON-LINE ΕΝΤΟΛΕΣ ΒΟΗΘΕΙΑΣ
+
+
+ ** Χρησιμοποιήστε το on-line σύστημα βοήθειας **
+
+ Ο Vim έχει ένα περιεκτικό on-line σύστημα βοήθειας. Για να ξεκινήσει,
+ δοκιμάστε κάποιο από τα τρία:
+ - πατήστε το πλήκτρο <HELP> (αν έχετε κάποιο)
+ - πατήστε το πλήκτρο <F1> (αν έχετε κάποιο)
+ - γράψτε :help <ENTER>
+
+ Γράψτε :q <ENTER> για να κλείσετε το παράθυρο της βοήθειας.
+
+ Μπορείτε να βρείτε βοήθεια πάνω σε κάθε αντικείμενο, δίνοντας μία παράμετρο
+ στην εντολή ":help". Δοκιμάστε αυτά (μην ξεχνάτε να πατάτε <ENTER>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ΜΑΘΗΜΑ 8: ΔΗΜΙΟΥΡΓΗΣΤΕ ΕΝΑ SCRIPT ΕΚΚΙΝΗΣΗΣ
+
+ ** Ενεργοποιήστε χαρακτηριστικά του Vim **
+
+ Ο Vim έχει πολλά περισσότερα χαρακτηριστικά απ' ό,τι ο Vi, αλλά τα
+ περισσότερα είναι αρχικά απενεργοποιημένα. Για να αρχίσετε να χρησιμοποιείτε
+ περισσότερα χαρακτηριστικά πρέπει να φτιάξετε ένα αρχείο "vimrc".
+
+ 1. Αρχίστε διορθώνοντας το αρχείο "vimrc", αυτό εξαρτάται από το σύστημά σας:
+ :edit ~/.vimrc για Unix
+ :edit ~/_vimrc για MS-Windows
+
+ 2. Τώρα εισάγετε το κείμενο παραδείγματος για αρχείο "vimrc":
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Γράψτε το αρχείο με την:
+ :write
+
+ Την επόμενη φορά που θα ξεκινήσετε τον Vim θα χρησιμοποιήσει φωτισμό
+ σύνταξης. Μπορείτε να προσθέσετε όλες τις προτιμώμενες επιλογές σ' αυτό
+ το αρχείο "vimrc".
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Εδώ ολοκληρώνεται το Vim Tutor. Σκοπός του ήταν να δώσει μία σύντομη
+ περίληψη του συντάκτη Vim, τουλάχιστον τόση ώστε να σας επιτρέψει να
+ χρησιμοποιήσετε τον συντάκτη αρκετά εύκολα. Απέχει πολύ από μία
+ ολοκληρωμένη παρουσίαση καθώς ο Vim έχει πάρα πολλές εντολές. Διαβάστε
+ κατόπιν το εγχειρίδιο χρήσης:
+ ":help user-manual".
+
+ Για περαιτέρω διάβασμα και μελέτη, συστήνεται αυτό το βιβλίο:
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+ Το πρώτο βιβλίο πλήρως αφιερωμένο στον Vim.
+ Ιδιαίτερα χρήσιμο για αρχάριους.
+ Υπάρχουν πολλά παραδείγματα και εικόνες.
+ Δείτε την https://iccf-holland.org/click5.html
+
+ Αυτό το βιβλίο είναι παλιότερο και περισσότερο για τον Vi παρά για τον Vim,
+ αλλά επίσης συνιστώμενο:
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+ Είναι ένα καλό βιβλίο για να μάθετε σχεδόν τα πάντα που θέλετε
+ να κάνετε με τον Vi.
+ Η έκτη έκδοση περιέχει ακόμα πληροφορίες για τον Vim.
+
+ Αυτή η περιήγηση γράφτηκε από τους Michael C. Pierce και Robert K. Ware,
+ Colorado School of Mines χρησιμοποιώντας ιδέες από τον Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Προσαρμογή για τον Vim από τον Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.eo b/runtime/tutor/tutor.eo
new file mode 100644
index 0000000..b33699e
--- /dev/null
+++ b/runtime/tutor/tutor.eo
@@ -0,0 +1,991 @@
+==============================================================================
+= B o n v e n o n al la I n s t r u i l o de V I M - Versio 1.7 =
+==============================================================================
+
+ Vim estas tre potenca redaktilo, kiu havas multajn komandojn, tro da ili
+ por ion klarigi en instruilo kiel i tiu. i tiu instruilo estas
+ fasonita por priskribi sufiajn komandojn, por ke vi kapablu uzi Vim
+ kun sufia facileco.
+
+ La tempo bezonata por plenumi la kurson estas 30 minutoj, kaj dependas
+ de kiom da tempo estas uzata por eksperimenti.
+
+ ATENTU:
+ La komandoj en la lecionoj anos la tekston. Kopiu tiun i dosieron
+ por ekzerci vin (se vi lanis "vimtutor", tiam estas jam kopio).
+
+ Gravas memori, ke i tiu instruilo estas organizata por instrui per
+ la uzo. Tio signifas, ke vi devas plenumi la komandojn por bone lerni
+ ilin. Se vi nur legas la tekston, vi forgesos la komandojn!
+
+ Nun, certigu, ke la majuskla baskulo NE estas en reimo majuskla,
+ kaj premu la klavon j sufie da fojoj por movi la kursoron, kaj por
+ ke la leciono 1.1 plenigu la ekranon.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.1: MOVI LA KURSORON
+
+
+ ** Por movi la kursoron, premu la h,j,k,l klavojn kiel montrite. **
+ ^
+ k Konsilo: La klavo h estas la plej liva kaj movas liven.
+ < h l > La klavo l estas la plej dekstra kaj movas dekstren.
+ j La klavo j aspektas kiel malsuprena sago.
+ v
+ 1. Movu la kursoron sur la ekrano is kiam vi sentas vin komforta.
+
+ 2. Premu la klavon (j) is kiam i ripetas.
+ Vi nun scias, kiel movii al la sekvanta leciono
+
+ 3. Uzante la malsuprenan klavon, moviu al la leciono 1.2.
+
+RIMARKO: Se vi dubas pri tio, kion vi premis, premu <ESK> por reiri al
+ la normala reimo. Tiam repremu la deziratan komandon.
+
+RIMARKO: La klavoj de la kursoro devus anka funkcii. Sed uzante hjkl,
+ vi kapablos movii pli rapide post kiam vi kutimios.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.2: ELIRI EL VIM
+
+
+ !! RIMARKO: Anta ol plenumi iujn subajn paojn ajn, legu la tutan lecionon!!
+
+ 1. Premu la klavon <ESK> (por certigi, ke vi estas en normala reimo).
+
+ 2. Tajpu: :q! <Enenklavo>.
+ Tio eliras el la rekdaktilo, SEN konservi la anojn, kiujn vi faris.
+
+ 3. Kiam vi vidas la elinviton, tajpu la komandon kiun vi uzis por eniri
+ en i tiu instruilo. Tio estus: vimtutor <Enenklavo>
+
+ 4. Se vi memoris tiujn paojn kaj sentas vin memfida, plenumu la paojn
+ 1 is 3 por eliri kaj reeniri la redaktilon.
+
+RIMARKO: :q! <Enenklavo> eliras sen konservi la anojn, kiujn vi faris.
+ Post kelkaj lecionoj, vi lernos kiel konservi la anojn al dosiero.
+
+ 5. Movu la kursoron suben is la leciono 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.3: REDAKTO DE TEKSTO - FORVIO
+
+
+ ** Premu x por forvii la signon sub la kursoro. **
+
+ 1. Movu la kursoron al la suba linio markita per --->.
+
+ 2. Por korekti la erarojn, movu la kursoron is kiam i estas sur la
+ forvienda signo.
+
+ 3. Premu la klavon x por forvii la nedeziratan signon.
+
+ 4. Ripetu paojn 2 is 4 is kiam la frazo estas usta.
+
+
+---> La boovinno saaltiss ssur laa luuno.
+
+ 5. Post kiam la linio estas usta, iru al la leciono 1.4
+
+RIMARKO: Trairante la instruilon, ne provu memori, lernu per la uzo.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.4: REDAKTO DE TEKSTO - ENMETO
+
+
+ ** Premu i por enmeti tekston. **
+
+ 1. Movu la kursoron al la unua suba linio markita per --->.
+
+ 2. Por igi la unuan linion sama kiel la dua, movu la kursoron sur la unuan
+ signon anta kie la teksto estas enmetenda.
+
+ 3. Premu i kaj tajpu la bezonatajn aldonojn.
+
+ 4. Premu <ESK> kiam la eraroj estas korektitaj por reiri al la normala
+ reimo. Ripetu la paojn 2 is 4 por korekti la frazon.
+
+---> Mank en i linio.
+---> Mankas teksto en i tiu linio.
+
+ 5. Kiam vi sentas vin komforta pri enmeto de teksto, moviu al la
+ leciono 1.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.5: REDAKTO DE TEKSTO - POSTALDONO
+
+
+ ** Premu A por postaldoni tekston. **
+
+ 1. Movu la kursoron al la unua suba linio markita per --->.
+ Ne gravas sur kiu signo estas la kursoro.
+
+ 2. Premu majusklan A kaj tajpu la bezonatajn aldonojn.
+
+ 3. Post kiam la teksto estas aldonita, premu <ESK> por reiri al la normala
+ reimo.
+
+ 4. Movu la kursoron al la dua linio markita per ---> kaj ripetu la
+ paojn 2 kaj 3 por korekti la frazon.
+
+---> Mankas teksto el ti
+ Mankas teksto el tiu linio.
+---> Mankas anka teks
+ Mankas anka teksto i tie.
+
+ 5 Kiam vi sentas vin komforta pri postaldono de teksto, moviu al la
+ leciono 1.6
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.6: REDAKTI DOSIERON
+
+ ** Uzu :wq por konservi dosieron kaj eliri. **
+
+ !! RIMARKO: Anta ol plenumi iun suban paon ajn, legu la tutan lecionon!!
+
+ 1. Eliru el la instruilo kiel vi faris en la leciono 1.2: :q!
+ A, se vi havas atingon al alia terminalo, faru tion, kio sekvas tie.
+
+ 2. e la elinvito, tajpu i tiun komandon: vim tutor <Enenklavo>
+ 'vim' estas la komando por lani la redaktilon Vim, 'tutor' estas la
+ dosiernomo de la dosiero, kiun vi volas redakti. Uzu dosieron, kiu
+ aneblas.
+
+ 3. Enmetu kaj forviu tekston, kiel vi lernis en la antaaj lecionoj.
+
+ 4. Konservu la dosieron kun anoj kaj eliru el Vim per: :wq <Enenklavo>
+
+ 5. Se vi eliris el la instruilo vimtutor en pao 1, restartigu la instruilon
+ vimtutor kaj moviu suben al la sekvanta resumo.
+
+ 6. Post kiam vi legis la suprajn paojn, kaj komprenis ilin: faru ilin.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1 RESUMO
+
+
+ 1. La kursoro movias a per la sagoklavoj, a per la klavoj hjkl.
+ h (liven) j (suben) k (supren) l (dekstren)
+
+ 2. Por lani Vim el la elinvito, tajpu: vim DOSIERNOMO <Enenklavo>
+
+ 3. Por eliri el Vim, tajpu: <ESK> :q! <Enenklavo> por rezigni la anojn
+
+ 4. Por forvii la signojn e la pozicio de la kursoro, tajpu: x
+
+ 5. Por enmeti a postaldoni tekston, tajpu:
+ i tajpu enmetendan tekston <ESK>
+ enmetas tekston anta la kursoro
+
+ A tajpu la postaldonendan tekston <ESK>
+ postaldonas post la kursoro
+
+RIMARKO: Premo de <ESK> iras al la normala reimo, a rezignas la
+ nedeziratan a parte plenumita komando.
+
+Nun darigu al la leciono 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.1: KOMANDOJ DE FORVIO
+
+
+ ** Tajpu dw por forvii vorton. **
+
+ 1. Premu <ESK> por certigi, ke vi estas en normala reimo.
+
+ 2. Movu la kursoron al la suba linio markita per --->.
+
+ 3. Movu la kursoron al la komenco de vorto, kiu forviendas.
+
+ 4. Tajpu dw por forvii la vorton.
+
+ RIMARKO: La litero d aperos en la lasta linio sur la ekrano kiam vi
+ tajpas in. Vim atendas is kiam vi tajpas w . Se vi vidas
+ alian signon ol d vi tajpis ion mise; premu <ESK> kaj
+ rekomencu.
+
+---> Estas iuj vortoj kiuj Zamenhof ne devus esti akuzativo en i tiu frazo.
+
+ 5. Ripetu paojn 3 kaj 4 is kiam la frazo estas usta kaj moviu al la
+ leciono 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.2: PLIAJ KOMANDOJ DE FORVIO
+
+
+ ** Tajpu d$ por forvii la finon de la linio. **
+
+ 1. Premu <ESK> por certigi, ke vi estas en normala reimo.
+
+ 2. Movu la kursoron al la suba linio markita per --->.
+
+ 3. Movu la kursoron e la fino de la usta linio (POST la unua . ).
+
+ 4. Tajpu d$ por forivii is la fino de la linio.
+
+---> Iu tajpis la finon de i tiu linio dufoje. fino de i tiu linio dufoje.
+
+
+ 5. Moviu al la leciono 2.3 por kompreni kio okazas.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.3: PRI OPERATOROJ KAJ MOVOJ
+
+
+ Multaj komandoj, kiuj anas la tekston, estas faritaj de operatoro kaj
+ movo. La formato de komando de forvio per la operatoro de forvio d
+ estas kiel sekvas:
+
+ d movo
+
+ Kie:
+ d - estas la operatoro de movo
+ movo - estas tio, pri kio la operatoro operacios (listigita sube)
+
+ Mallonga listo de movoj:
+ w - is la komenco de la sekvanta vorto, krom ia unua signo.
+ e - is la fino de la nuna vorto, krom la lasta signo.
+ $ - is la fino de la linio, krom la lasta signo.
+
+ Do tajpo de 'de' forvios ekde la kursoro is la fino de la vorto.
+
+RIMARKO: Premo de nur la movo en Normala reimo sen operatoro movos
+ la kursoron kiel specifite.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.4: UZI NOMBRON POR MOVO
+
+ ** Tajpo de nombro anta movo ripetas in lafoje. **
+
+ 1. Movu la kursoron e la komenco de la suba linio markita per --->.
+
+ 2. Tajpu 2w por movi la kursoron je du vortoj antaen.
+
+ 3. Tajpu 3e por movi la kursoron e la fino de la tria vorto antaen.
+
+ 4. Tajpu 0 (nul) por movii e la komenco de la linio.
+
+
+ 5. Ripetu paojn 2 is 3 kun malsamaj nombroj.
+
+---> Tio estas nur linio kun vortoj, kie vi povas movii.
+
+ 6. Moviu al la leciono 2.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.5: UZI NOMBRON POR FORVII PLI
+
+
+ ** Tajpo de nombro kun operatoro ripetas in lafoje. **
+
+ En la kombinao de la operatoro de forvio, kaj movo kiel menciita
+ i-supre, eblas aldoni nombron anta la movo por pli forvii:
+ d nombro movo
+
+ 1. Movu la kursoron e la unua MAJUSKLA vorto en la linio markita per --->.
+
+ 2. Tajpu d2w por forvii la du MAJUSKLAJN vortojn.
+
+ 3. Ripetu paojn 1 is 2 per malsama nombro por forvii la sinsekvajn
+ MAJUSKLAJN vortojn per unu komando.
+
+---> Tiu AB CDE linio FGHI JK LMN OP de vortoj estas Q RS TUV purigita.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.6: OPERACII SUR LINIOJ
+
+
+ ** Tajpu dd por forvii tutan linion. **
+
+ Pro la ofteco de forvio de tuta linio, la verkisto de Vi decidis, ke
+ estus pli facile simple tajpi du d-ojn por forvii linion.
+
+ 1. Movu la kursoron sur la duan linion en la suba frazo.
+ 2. Tajpu dd por forvii la linion.
+ 3. Nun moviu al la kvara linio.
+ 4. Tajpu 2dd por forvii du liniojn.
+
+---> 1) Rozoj estas ruaj,
+---> 2) limo estas amuza,
+---> 3) Violoj estas bluaj,
+---> 4) Mi havas aton,
+---> 5) Horlooj diras kioma horo estas,
+---> 6) Sukero estas dola,
+---> 7) Kaj tiel vi estas.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.7: LA KOMANDO DE MALFARO
+
+
+ ** Premu u por malfari la lastajn komandojn, U por ripari la tutan linion. **
+
+ 1. Movu la kursoron e la suba linio markita per ---> kaj metu in sur
+ la unuan eraron.
+ 2. Tajpu x por forvii la unuan nedeziratan signon.
+ 3. Nun tajpu u por malfari la lastan plenumitan komandon.
+ 4. i-foje, riparu iujn erarojn en la linio kaj ia originala stato.
+ 5. Nun tajpu majusklan U por igi la linion al ia antaa stato.
+ 6. Nun tajpu u kelkfoje por malfari la U kaj antaajn komandojn.
+ 7. Nun tajpu CTRL-R (premante la CTRL klavon dum vi premas R) kelkfoje
+ por refari la komandojn (malfari la malfarojn).
+
+---> Koorektii la erarojn sur tiuu i liniio kaj remettu illlin per malfaro.
+
+ 8. Tiuj estas tre utilaj komandoj. Nun moviu al la leciono 2 RESUMO.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2 RESUMO
+
+
+ 1. Por forvii ekde la kursoro is la sekvanta vorto, tajpu: dw
+ 2. Por forvii ekde la kursoro is la fino de la linio, tajpu: d$
+ 3. Por forvii tutan linion, tajpu: dd
+
+ 4. Por ripeti movon, antametu nombron: 2w
+ 5. La formato de ana komando estas:
+ operatoro [nombro] movo
+
+ kie:
+ operatoro - estas tio, kio farendas, kiel d por forvii
+ [nombro] - estas opcia nombro por ripeti la movon
+ movo - movas sur la teksto por operacii, kiel ekzemple w (vorto),
+ $ (is fino de linio), ktp.
+
+ 6. Por movii al la komenco de la linio, uzu nul: 0
+
+ 7. Por malfari antaajn agojn, tajpu: u (minuskla u)
+ Por malfari iujn anojn sur la linio, tajpu: U (majuskla U)
+ Por refari la malfarojn, tajpu: CTRL-R
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3.1 LA KOMANDO DE METO
+
+
+ ** Tajpu p por meti tekston forviitan antae post la kursoro. **
+
+ 1. Movu la kursoron e la unua suba linio markita per --->.
+
+ 2. Tajpu dd por forvii la linion kaj konservi in ene de reistro de Vim.
+
+ 3. Movu la kursoron e la linio c), SUPER kie la forviita linio devus esti.
+
+ 4. Tajpu p por meti la linion sub la kursoron.
+
+ 5. Ripetu la paojn 2 is 4 por meti iujn liniojn en la usta ordo.
+
+---> d) u anka vi povas lerni?
+---> b) Violoj estas bluaj,
+---> c) Inteligenteco lerneblas,
+---> a) Rozoj estas ruaj,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3.2 LA KOMANDO DE ANSTATAIGO
+
+
+ ** Tajpu rx por anstataigi la signon e la kursoro per x . **
+
+
+ 1. Movu la kursoron e la unua suba linio markita per --->.
+
+ 2. Movu la kursoron is la unua eraro.
+
+ 3. Tajpu r kaj la signon, kiu devus esti tie.
+
+ 4. Ripetu paojn 2 kaj 3 is kiam la unua linio egalas la duan.
+
+---> Kiem tiu lanio estis tajpita, iu pramis la nauftajn klovojn!
+---> Kiam tiu linio estis tajpita, iu premis la neustajn klavojn!
+
+ 5. Nun moviu al la leciono 3.3.
+
+RIMARKO: Memoru, ke vi devus lerni per uzo, kaj ne per memorado.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3.3 LA OPERATORO DE ANO
+
+
+ ** Por ani is la fino de la vorto, tajpu ce . **
+
+ 1. Movu la kursoron e la unua suba linio markita per --->.
+
+ 2. Metu la kursoron sur la d en lduzw
+
+ 3. Tajpu ce kaj la ustan vorton (en tiu i kazo, tajpu inio ).
+
+ 4. Premu <ESK> kaj moviu al la sekvanta signo, kiu bezonas anon.
+
+ 5. Ripetu la paojn 3 kaj 4 is kiam la unua frazo egalas la duan.
+
+---> Tiu lduzw havas kelkajn vortojn, kiii bezas anon per la anooto.
+---> Tiu linio havas kelkajn vortojn, kiuj bezonas anon per la anoperatoro.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3.4 PLIAJ ANOJ PER c
+
+
+ ** La operatoro de ano uzeblas kun la sama movo kiel forvio. **
+
+ 1. La operatoro de ano funkcias sammaniere kiel forvio. La formato estas:
+
+ c [nombro] movo
+
+ 2. La movoj estas samaj, kiel ekzemple w (vorto) kaj $ (fino de linio).
+
+ 3. Moviu e la unua suba linio markita per --->.
+
+ 4. Movu la kursoron al la unua eraro.
+
+ 5. Tajpu c$ kaj tajpu la reston de la linio kiel la dua kaj premu <ESK>.
+
+---> La fino de i tiu linio bezonas helpon por igi in same kiel la dua.
+---> La fino de i tiu linio bezonas korektojn per uzo de la komando c$
+
+RIMARKO: Vi povas uzi la klavon Retropao por korekti erarojn dum vi tajpas.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3 RESUMO
+
+
+ 1. Por remeti tekston, kiun vi us forviis, tajpu p. Tio metas la
+ forviitan tekston POST la kursoro (se linio estis forviita, i
+ iros en la linion sub la kursoro).
+
+ 2. Por anstataigi la signon sub la kursoro, tajpu r kaj tiam la signon
+ kion vi deziras havi tie.
+
+ 3. La operatoro de ano ebligas al vi ani ekde la kursoro, is kie
+ la movo iras. Ekz. tajpu ce por ani ekde la kursoro is la fino
+ de la vorto, c$ por ani is la fino de la linio.
+
+ 4. La formato de ano estas:
+
+ c [nombro] movo
+
+Nun darigu al la sekvanta leciono.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4.1: POZICIO DE KURSORO KAJ STATO DE DOSIERO
+
+
+ ** Tajpu CTRL-G por montri vian pozicion en la dosiero kaj la dosierstaton.
+ Tajpu G por movii al linio en la dosiero. **
+
+ RIMARKO: Legu la tutan lecionon anta ol plenumi iun paon ajn!!
+
+ 1. Premu la klavon Ctrl kaj premu g . Oni nomas tion CTRL-G.
+ Mesao aperos e la suba parto de la pao kun la dosiernomo kaj la
+ pozicio en la dosiero. Memoru la numeron de la linio por pao 3.
+
+ RIMARKO: Vi eble vidas la pozicion de la kursoro e la suba dekstra
+ angulo de la ekrano. Tio okazas kiam la agordo 'ruler' estas
+ altita (vidu :help 'ruler')
+
+ 2. Premu G por movii e la subo de la dosiero.
+ Tajpu gg por movii e la komenco de la dosiero.
+
+ 3. Tajpu la numeron de la linio kie vi estis kaj poste G . Tio removos
+ vin al la linio, kie vi estis kiam vi unue premis CTRL-G.
+
+ 4. Se vi sentas vin komforta, plenumu paojn 1 is 3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4.2 LA KOMANDO DE SERO
+
+
+ ** Tajpu / kaj poste frazon por seri la frazon. **
+
+ 1. En normala reimo, tajpu la / signon. Rimarku, ke i kaj la kursoro
+ aperas e la suba parto de la ekrano kiel por la : komando.
+
+ 2. Nun tajpu 'errarro' <Enenklavo>.
+ Tio estas la vorto, kion vi volas seri.
+
+ 3. Por seri la saman frazon denove, simple tajpu n .
+ Por seri la saman frazon denove en la retrodirekto, tajpu N .
+
+ 4. Por seri frazon en la retrodirekto, uzu ? anstata / .
+
+ 5. Por reiri tien, el kie vi venis, premu CTRL-O (Premu Ctrl kaj o
+ literon o). Ripetu por pli retroiri. CTRL-I iras antaen.
+
+---> "errarro" ne estas maniero por literumi eraro; errarro estas eraro.
+
+RIMARKO: Kiam la sero atingas la finon de la dosiero, i daras e la
+ komenco, krom se la agordo 'wrapscan' estas malaltita.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4.3 SERO DE KONGRUAJ KRAMPOJ
+
+
+ ** Tajpu % por trovi kongruan ), ] a } **
+
+ 1. Poziciu la kursoron sur iun (, [ a { en la linio markita per --->.
+
+ 2. Nun tajpu la % signon.
+
+ 3. La kursoro movias al la kongrua krampo.
+
+ 4. Tajpu % por movi la kursoron al la alia kongrua krampo.
+
+ 5. Movu la kursoron al la alia (, ), [, ], {, } kaj observu tion,
+ kion % faras.
+
+---> i tiu ( estas testa linio kun (-oj, [-oj, ]-oj kaj {-oj, }-oj en i. ))
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4.4 LA KOMANDO DE ANSTATAIGO
+
+
+ ** Tajpu :s/malnova/nova/g por anstataigi 'nova' per 'malnova'. **
+
+ 1. Movu la kursoron al la suba linio markita per --->.
+
+ 2. Tajpu :s/laa/la <Enenklavo> . Rimarku, ke la komando anas nur la
+ unuan okazaon de "laa" en la linio.
+
+ 3. Nun tajpu :s/laa/la/g . Aldono de g opcio signifas mallokan
+ anstataigon en la linio. i anas iujn okazaojn de "laa" en la
+ linio.
+
+---> laa plej bona tempo por vidi florojn estas en laa printempo.
+
+ 4. Por ani iujn okazaojn de iu ena signo inter du linioj,
+ tajpu :#,#s/malnova/nova/g kie #,# estas la numeroj de linioj de la
+ intervalo de la linioj kie la anstataigo
+ okazos.
+ Tajpu :%s/malnova/nova/g por ani iujn okazaojn en la tuta
+ dosiero.
+ Tajpu :s/malnova/nova/gc por trovi iujn okazaojn en la tuta
+ dosiero, kun invitilo u anstataigi
+ a ne.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4 RESUMO
+
+ 1. CTRL-G vidigas vian pozicion en la dosiero kaj la staton de la dosiero.
+ G movas la kursoron al la fino de la dosiero.
+ numero G movas la kursoron al numero de tiu linio.
+ gg movas la kursoron al la unua linio.
+
+ 2. Tajpo de / kaj frazon seras la frazon antaen.
+ Tajpo de ? kaj frazon seras la frazon malantaen.
+ Post sero, tajpu n por trovi la sekvantan okazaon en la sama direkto a
+ N por seri en la mala direkto.
+ CTRL-O movas vin al la antaaj pozicioj, CTRL-I al la novaj pozicioj.
+
+ 3. Tajpo de % kiam la kursoro estas sur (,),[,],{ a } movias al ia
+ kongruo.
+
+ 4. Por anstataigi 'nova' en la unua 'malnova' en linio :s/malnova/nova
+ Por anstataigi 'nova' en iuj 'malnova'-oj en linio :s/malnova/nova/g
+ Por anstataigi frazon inter du #-aj linioj :#,#s/malnova/nova/g
+ Por anstataigi iujn okazaojn en la dosiero :%s/malnova/nova/g
+ Por demandi konfirmon iu-foje, aldonu 'c' :%s/malnova/nova/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5.1 KIEL PLENUMI EKSTERAN KOMANDON
+
+
+ ** Tajpu :! sekvata de ekstera komando por plenumi la komandon. **
+
+ 1. Tajpu la konatan komandon : por pozicii la kursoron e la suba parto
+ de la ekrano. Tio ebligas tajpadon de komando en komanda linio.
+
+ 2. Nun tajpu la ! (krisigno) signon. Tio ebligas al vi plenumi iun
+ eksteran elan komandon ajn.
+
+ 3. Ekzemple, tajpu ls post ! kaj tajpu <Enenklavo>. Tio listigos la
+ enhavon de la dosierujo, same kiel se vi estis en ela invito.
+ A uzu :!dir se ls ne funkcias.
+
+RIMARKO: Eblas plenumi iun eksteran komandon ajn tiamaniere, anka kun
+ argumentoj.
+
+RIMARKO: iuj : komandoj devas finii per tajpo de <Enenklavo>
+ Ekde nun, ni ne plu mencios tion.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5.2 PLI PRI KONSERVO DE DOSIERO
+
+
+ ** Por konservi la faritajn anojn en la teksto, tajpu :w DOSIERNOMO. **
+
+ 1. Tajpu !dir a !ls por akiri liston de via dosierujo.
+ Vi jam scias, ke vi devas tajpi <Enenklavo> post tio.
+
+ 2. Elektu dosieron, kiu ankora ne ekzistas, kiel ekzemple TESTO.
+
+ 3. Nun tajpu: :w TESTO (kie TESTO estas la elektita dosiernomo)
+
+ 4. Tio konservas la tutan dosieron (instruilon de Vim) kun la nomo TESTO.
+ Por kontroli tion, tajpu :!dir a :!ls denove por vidigi vian
+ dosierujon.
+
+RIMARKO: Se vi volus eliri el Vim kaj restartigi in denove per vim TESTO,
+ la dosiero estus precize same kiel kopio de la instruilo kiam vi
+ konservis in.
+
+ 5. Nun forviu la dosieron tajpante (VINDOZO): :!del TESTO
+ a (UNIKSO): :!rm TESTO
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5.3 APARTIGI KONSERVENDAN TESTON
+
+
+ ** Por konservi parton de la dosiero, tajpu v movo :w DOSIERNOMO **
+
+ 1. Movu la kursoron al tiu linio.
+
+ 2. Premu v kaj movu la kursoron al la kvina suba ero. Rimarku, ke la
+ teksto emfazias.
+
+ 3. Premu la : signon. e la fino de la ekrano :'<,'> aperos.
+
+ 4. Tajpu w TESTO , kie TESTO estas dosiernomo, kiu ankora ne ekzistas.
+ Kontrolu, ke vi vidas :'<,'>w TESTO anta ol premi <Enenklavo>.
+
+ 5. Vim konservos la apartigitajn liniojn al la dosiero TESTO. Uzu :dir
+ a :!ls por vidigi in. Ne forviu in. Ni uzos in en la sekvanta
+ leciono.
+
+RIMARKO: Premo de v komencas Viduman apartigon. Vi povas movi la kursoron
+ por pligrandigi a malpligrandigi la apartigon. Tiam vi povas uzi
+ operatoron por plenumi ion kun la teksto. Ekzemple, d forvias
+ la tekston.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5.4 AKIRI KAJ KUNFANDI DOSIEROJN
+
+
+ ** Por enmeti la enhavon de dosiero, tajpu :r DOSIERNOMON **
+
+ 1. Movu la kursoron tuj super i tiu linio.
+
+RIMARKO: Post plenumo de pao 2, vi vidos tekston el la leciono 5.3. Tiam
+ moviu SUBEN por vidi tiun lecionon denove.
+
+ 2. Nun akiru vian dosieron TESTO uzante la komandon :r TESTO kie TESTO
+ estas la nomo de la dosiero, kiun vi uzis.
+ La dosiero, kion vi akiras, estas metita sub la linio de la kursoro.
+
+ 3. Por kontroli, u la dosiero akiriis, retromovu la kursoron kaj rimarku,
+ ke estas nun du kopioj de la leciono 5.3, la originala kaj la versio mem
+ de la dosiero.
+
+RIMARKO: Vi nun povas legi la eliron de ekstera komando. Ekzemple,
+ :r !ls legas la eliron de la komando ls kaj metas in sub la
+ kursoron.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5 RESUMO
+
+
+ 1. :!komando plenumas eksteran komandon.
+
+ Iuj utilaj ekzemploj estas:
+ (VINDOZO) (UNIKSO)
+ :!dir :!ls - listigas dosierujon
+ :!del DOSIERNOMO :!rm DOSIERNOMO - forvias la dosieron DOSIERNOMO
+
+ 2. :w DOSIERNOMO konservas la nunan dosieron de Vim al disko kun la
+ nomo DOSIERNOMO.
+
+ 3. v movo :w DOSIERNOMO konservas la Viduman apartigon de linioj en
+ dosiero DOSIERNOMO.
+
+ 4. :r DOSIERNOMO akiras la dosieron DOSIERNOMO el la disko kaj metas
+ in sub la pozicion de la kursoro.
+
+ 5. :r !dir legas la eligon de la komando dir kaj metas in sub la
+ pozicion de la kursoro.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.1 LA KOMANDO DE MALFERMO
+
+
+ ** Tajpu o por malfermi linion sub la kursoro kaj eniri Enmetan reimon. **
+
+ 1. Movu la kursoron al la suba linio markita per --->.
+
+ 2. Tajpu la minusklan literon o por malfermi linion SUB la kursoro kaj
+ eniri la Enmetan reimon.
+
+ 3. Nun tajpu tekston kaj premu <ESK> por eliri el la Enmeta reimo.
+
+---> Post tajpo de o la kursoro movias al la malfermata linio en
+ Enmeta reimo.
+
+ 4. Por malfermi linion SUPER la kursoro, nur tajpu majusklan O ,
+ anstata minusklan o. Provu tion per la suba linio.
+
+---> Malfermu linion SUPER tiu tajpante O dum la kursoro estas sur tiu linio.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.2 LA KOMANDO DE POSTALDONO
+
+
+ ** Tajpu a por enmeti POST la kursoro. **
+
+ 1. Movu la kursoron e la komenco de la linio markita per --->.
+
+ 2. Premu e is kiam la kursoro estas e la fino de li.
+
+ 3. Tajpu a (minuskle) por aldoni tekston POST la kursoro.
+
+ 4. Kompletigu la vorton same kiel la linio sub i. Premu <ESK> por
+ eliri el la Enmeta reimo.
+
+ 5. Uzu e por movii al la sekvanta nekompleta vorto kaj ripetu
+ paojn 3 kaj 4.
+
+---> i tiu lin ebligos vin ekz vin postal tekston al linio.
+---> i tiu linio ebligos vin ekzerci vin postaldoni tekston al linio.
+
+RIMARKO: iu a, i kaj A iras al la sama Enmeta reimo, la nura malsamo
+ estas tie, kie la signoj estas enmetitaj.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.3 ALIA MANIERO POR ANSTATAIGI
+
+
+ ** Tajpu majusklan R por anstataigi pli ol unu signo. **
+
+ 1. Movu la kursoron al la unua suba linio markita per --->. Movu la
+ kursoron al la komenco de la unua xxx .
+
+ 2. Nun premu R kaj tajpu la nombron sub i en la dua linio, por ke i
+ anstataigu la xxx .
+
+ 3. Premu <ESK> por foriri el la Anstataiga reimo. Rimarku, ke la cetera
+ parto de la linio restas neanata.
+
+ 4. Ripetu la paojn por anstataigi la restantajn xxx.
+
+---> Aldono de 123 al xxx donas al vi xxx.
+---> Aldono de 123 al 456 donas al vi 579.
+
+RIMARKO: Anstataiga reimo estas same kiel Enmeta reimo, sed iu signo
+ tajpita forvias ekzistan signon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.4 KOPII KAJ ALGLUI TEKSTON
+
+
+ ** Uzu la y operatoron por kopii tekston, kaj p por alglui in **
+
+
+ 1. Iru al la suba linio markita per ---> kaj poziciu la kursoron post "a)".
+
+ 2. Komencu la Viduman reimon per v kaj movu la kursoron tuj anta "unua".
+
+ 3. Tajpu y por kopii la emfazitan tekston.
+
+ 4. Movu la kursoron e la fino de la linio: j$
+
+ 5. Tajpu p por alglui la tekston. Tiam tajpu: a dua <ESK> .
+
+ 6. Uzu Viduman reimon por apartigi " ero.", kopiu in per y , moviu
+ e la fino de la sekvanta linio per j$ kaj algluu la tekston tie
+ per p .
+
+---> a) tio estas la unua ero.
+ b)
+
+RIMARKO: vi povas anka uzi y kiel operatoro; yw kopias unu vorton.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.5 AGORDI OPCION
+
+
+ ** Agordu opcion por ke sero a anstataigo ignoru usklecon **
+
+ 1. Seru 'ignori' per tajpo de /ignori <Enenklavo>
+ Ripetu plurfoje premante n .
+
+ 2. altu la opcion 'ic' (ignori usklecon) per: :set ic
+
+ 3. Nun seru 'ignori' denove premante n
+ Rimarku, ke Ignori kaj IGNORI estas nun troveblas.
+
+ 4. altu la opciojn 'hlsearch' kaj 'incsearch': :set hls is
+
+ 5. Nun retajpu la seran komandon kaj vidu kio okazas: /ignore <Enenklavo>
+
+ 6. Por malalti ignoron de uskleco: :set noic
+
+RIMARKO: Por forigi emfazon de kongruo, tajpu: :nohlsearch
+RIMARKO: Se vi deziras ignori usklecon por nur unu sera komando, uzu \c
+ en la frazo: /ignore\c <Enenklavo>
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6 RESUMO
+
+ 1. Tajpu o por malfermi linion SUB la kursoro kaj eki en Enmeta reimo.
+ 1. Tajpu O por malfermi linion SUPER la kursoro.
+
+ 2. Tajpu a por enmeti tekston POST la kursoro.
+ Tajpu A por enmeti tekston post la fino de la linio.
+
+ 3. La e komando movas la kursoron al la fino de vorto.
+
+ 4. la y operatoro kopias tekston, p algluas in.
+
+ 5. Tajpo de majuskla R eniras la Anstataigan reimon is kiam
+ <ESK> estas premita.
+
+ 6. Tajpo de ":set xxx" altas la opcion "xxx". Iuj opcioj estas:
+ 'ic' 'ignorecase' ignori usklecon dum sero
+ 'is' 'incsearch' montru partan kongruon dum sero
+ 'hls' 'hlsearch' emfazas iujn kongruajn frazojn
+ Vi povas uzi a la longan, a la mallongan nomon de opcio.
+
+ 7. Antaaldonu "no" por malalti la opcion: :set noic
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 7.1 AKIRI HELPON
+
+
+ ** Uzu la helpan sistemon **
+
+ Vim havas ampleksan helpan sistemon. Por komencii, provu unu el la tiuj
+ tri:
+ - premu la klavon <HELPO> (se vi havas in)
+ - premu la klavon <F1> (se vi havas in)
+ - tajpu :help <Enenklavo>
+
+ Legu la tekston en la helpfenestro por trovi kiel helpo funkcias.
+ Tajpu CTRL-W CTRL-W por salti de unu fenestro al la alia.
+ Tajpu :q <Enenklavo> por fermi la helpan fenestron.
+
+ Vi povas trovi helpon pri io ajn aldonante argumenton al la komando
+ ":help". Provu tiujn (ne forgesu premi <Enenklavo>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 7.2 KREI STARTAN SKRIPTON
+
+
+ ** Ebligu kapablojn de Vim **
+
+ Vim havas multe pli da kapabloj ol Vi, sed la plej multaj estas defalte
+ malaltitaj. Por ekuzi la kapablojn, vi devas krei dosieron "vimrc".
+
+ 1. Ekredaktu la dosieron "vimrc". Tio dependas de via sistemo:
+ :e ~/.vimrc por Unikso
+ :e ~/_vimrc por Vindozo
+
+ 2. Nun legu la enhavon de la ekzempla "vimrc"
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Konservu la dosieron per:
+ :w
+
+ La sekvantan fojon, kiam vi lanas Vim, i uzos sintaksan emfazon.
+ Vi povas aldoni iujn viajn preferatajn agordojn al tiu dosiero "vimrc".
+ Por pli da informoj, tajpu :help vimrc-intro
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 7.3 KOMPLETIGO
+
+
+ ** Kompletigo de komanda linio per CTRL-D kaj <TAB> **
+
+ 1. Certigu ke Vim estas en kongrua reimo: :set nocp
+
+ 2. Rigardu tiujn dosierojn, kiuj ekzistas en la dosierujo: :!ls a :!dir
+
+ 3. Tajpu la komencon de komando: :e
+
+ 4. Premu CTRL-D kaj Vim montros liston de komandoj, kiuj komencas per "e".
+
+ 5. Premu d<TAB> kaj Vim kompletigos la nomon de la komando al ":edit".
+
+ 6. Nun aldonu spaceton kaj la komencon de ekzistanta nomo: :edit DOSI
+
+ 7. Premu d<TAB>. Vim kompletigos la nomon (se i estas unika)
+
+RIMARKO: Kompletigo funkcias por multaj komandoj. Nur provu premi CTRL-D kaj
+ <TAB>. Estas aparte utila por :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 7 RESUMO
+
+
+ 1. Tajpu :help a premu <F1> a <Helpo> por malfermi helpan fenestron.
+
+ 2. Tajpu :help kmd por trovi helpon pri kmd.
+
+ 3. Tajpu CTRL-W CTRL-W por salti al alia fenestro.
+
+ 4. Tajpu :q to fermi la helpan fenestron.
+
+ 5. Kreu komencan skripton vimrc por konservi viajn agordojn.
+
+ 6. Kiam vi tajpas : komandon, premu CTRL-D por vidi iujn kompleteblojn.
+ Premu <TAB> por uzi unu kompletigon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Tio konkludas la instruilon de Vim. i celis doni mallongan superrigardon
+ de la redaktilo Vim, nur tion kio sufias por ebligi al vi facilan uzon de
+ la redaktilo. Estas nepre nekompleta, ar Vim havas multajn multajn pliajn
+ komandojn. Legu la manlibron: ":help user-manual".
+
+ Tiu instruilo estis verkita de Michael C. Pierce kaj Robert K. Ware,
+ el la Koloradia Lernejo de Minejoj (Colorado School of Mines) uzante
+ ideojn provizitajn de Charles Smith el la Stata Universitato de Koloradio
+ (Colorado State University)
+
+ Retpoto: bware@mines.colorado.edu.
+
+ Modifita por Vim de Bram Moolenaar.
+
+ Esperantigita fare de Dominique Pell, 2008-04-01
+ Retpoto: dominique.pelle@gmail.com
+ Lasta ano: 2020-07-19
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.eo.utf-8 b/runtime/tutor/tutor.eo.utf-8
new file mode 100644
index 0000000..1feeeb9
--- /dev/null
+++ b/runtime/tutor/tutor.eo.utf-8
@@ -0,0 +1,991 @@
+==============================================================================
+= B o n v e n o n al la I n s t r u i l o de V I M - Versio 1.7 =
+==============================================================================
+
+ Vim estas tre potenca redaktilo, kiu havas multajn komandojn, tro da ili
+ por ĉion klarigi en instruilo kiel ĉi tiu. Ĉi tiu instruilo estas
+ fasonita por priskribi sufiĉajn komandojn, por ke vi kapablu uzi Vim
+ kun sufiĉa facileco.
+
+ La tempo bezonata por plenumi la kurson estas 30 minutoj, kaj dependas
+ de kiom da tempo estas uzata por eksperimenti.
+
+ ATENTU:
+ La komandoj en la lecionoj ŝanĝos la tekston. Kopiu tiun ĉi dosieron
+ por ekzerci vin (se vi lanĉis "vimtutor", tiam estas jam kopio).
+
+ Gravas memori, ke ĉi tiu instruilo estas organizata por instrui per
+ la uzo. Tio signifas, ke vi devas plenumi la komandojn por bone lerni
+ ilin. Se vi nur legas la tekston, vi forgesos la komandojn!
+
+ Nun, certigu, ke la majuskla baskulo NE estas en reĝimo majuskla,
+ kaj premu la klavon j sufiĉe da fojoj por movi la kursoron, kaj por
+ ke la leciono 1.1 plenigu la ekranon.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.1: MOVI LA KURSORON
+
+
+ ** Por movi la kursoron, premu la h,j,k,l klavojn kiel montrite. **
+ ^
+ k Konsilo: La klavo h estas la plej liva kaj movas liven.
+ < h l > La klavo l estas la plej dekstra kaj movas dekstren.
+ j La klavo j aspektas kiel malsuprena sago.
+ v
+ 1. Movu la kursoron sur la ekrano ĝis kiam vi sentas vin komforta.
+
+ 2. Premu la klavon (j) ĝis kiam ĝi ripetas.
+ Vi nun scias, kiel moviĝi al la sekvanta leciono
+
+ 3. Uzante la malsuprenan klavon, moviĝu al la leciono 1.2.
+
+RIMARKO: Se vi dubas pri tio, kion vi premis, premu <ESK> por reiri al
+ la normala reĝimo. Tiam repremu la deziratan komandon.
+
+RIMARKO: La klavoj de la kursoro devus ankaŭ funkcii. Sed uzante hjkl,
+ vi kapablos moviĝi pli rapide post kiam vi kutimiĝos.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.2: ELIRI EL VIM
+
+
+ !! RIMARKO: Antaŭ ol plenumi iujn subajn paŝojn ajn, legu la tutan lecionon!!
+
+ 1. Premu la klavon <ESK> (por certigi, ke vi estas en normala reĝimo).
+
+ 2. Tajpu: :q! <Enenklavo>.
+ Tio eliras el la rekdaktilo, SEN konservi la ŝanĝojn, kiujn vi faris.
+
+ 3. Kiam vi vidas la ŝelinviton, tajpu la komandon kiun vi uzis por eniri
+ en ĉi tiu instruilo. Tio estus: vimtutor <Enenklavo>
+
+ 4. Se vi memoris tiujn paŝojn kaj sentas vin memfida, plenumu la paŝojn
+ 1 ĝis 3 por eliri kaj reeniri la redaktilon.
+
+RIMARKO: :q! <Enenklavo> eliras sen konservi la ŝanĝojn, kiujn vi faris.
+ Post kelkaj lecionoj, vi lernos kiel konservi la ŝanĝojn al dosiero.
+
+ 5. Movu la kursoron suben ĝis la leciono 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.3: REDAKTO DE TEKSTO - FORVIŜO
+
+
+ ** Premu x por forviŝi la signon sub la kursoro. **
+
+ 1. Movu la kursoron al la suba linio markita per --->.
+
+ 2. Por korekti la erarojn, movu la kursoron ĝis kiam ĝi estas sur la
+ forviŝenda signo.
+
+ 3. Premu la klavon x por forviŝi la nedeziratan signon.
+
+ 4. Ripetu paŝojn 2 ĝis 4 ĝis kiam la frazo estas ĝusta.
+
+
+---> La boovinno saaltiss ssur laa luuno.
+
+ 5. Post kiam la linio estas ĝusta, iru al la leciono 1.4
+
+RIMARKO: Trairante la instruilon, ne provu memori, lernu per la uzo.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.4: REDAKTO DE TEKSTO - ENMETO
+
+
+ ** Premu i por enmeti tekston. **
+
+ 1. Movu la kursoron al la unua suba linio markita per --->.
+
+ 2. Por igi la unuan linion sama kiel la dua, movu la kursoron sur la unuan
+ signon antaŭ kie la teksto estas enmetenda.
+
+ 3. Premu i kaj tajpu la bezonatajn aldonojn.
+
+ 4. Premu <ESK> kiam la eraroj estas korektitaj por reiri al la normala
+ reĝimo. Ripetu la paŝojn 2 ĝis 4 por korekti la frazon.
+
+---> Mank en ĉi linio.
+---> Mankas teksto en ĉi tiu linio.
+
+ 5. Kiam vi sentas vin komforta pri enmeto de teksto, moviĝu al la
+ leciono 1.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.5: REDAKTO DE TEKSTO - POSTALDONO
+
+
+ ** Premu A por postaldoni tekston. **
+
+ 1. Movu la kursoron al la unua suba linio markita per --->.
+ Ne gravas sur kiu signo estas la kursoro.
+
+ 2. Premu majusklan A kaj tajpu la bezonatajn aldonojn.
+
+ 3. Post kiam la teksto estas aldonita, premu <ESK> por reiri al la normala
+ reĝimo.
+
+ 4. Movu la kursoron al la dua linio markita per ---> kaj ripetu la
+ paŝojn 2 kaj 3 por korekti la frazon.
+
+---> Mankas teksto el ti
+ Mankas teksto el tiu linio.
+---> Mankas ankaŭ teks
+ Mankas ankaŭ teksto ĉi tie.
+
+ 5 Kiam vi sentas vin komforta pri postaldono de teksto, moviĝu al la
+ leciono 1.6
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1.6: REDAKTI DOSIERON
+
+ ** Uzu :wq por konservi dosieron kaj eliri. **
+
+ !! RIMARKO: Antaŭ ol plenumi iun suban paŝon ajn, legu la tutan lecionon!!
+
+ 1. Eliru el la instruilo kiel vi faris en la leciono 1.2: :q!
+ Aŭ, se vi havas atingon al alia terminalo, faru tion, kio sekvas tie.
+
+ 2. Ĉe la ŝelinvito, tajpu ĉi tiun komandon: vim tutor <Enenklavo>
+ 'vim' estas la komando por lanĉi la redaktilon Vim, 'tutor' estas la
+ dosiernomo de la dosiero, kiun vi volas redakti. Uzu dosieron, kiu
+ ŝanĝeblas.
+
+ 3. Enmetu kaj forviŝu tekston, kiel vi lernis en la antaŭaj lecionoj.
+
+ 4. Konservu la dosieron kun ŝanĝoj kaj eliru el Vim per: :wq <Enenklavo>
+
+ 5. Se vi eliris el la instruilo vimtutor en paŝo 1, restartigu la instruilon
+ vimtutor kaj moviĝu suben al la sekvanta resumo.
+
+ 6. Post kiam vi legis la suprajn paŝojn, kaj komprenis ilin: faru ilin.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 1 RESUMO
+
+
+ 1. La kursoro moviĝas aŭ per la sagoklavoj, aŭ per la klavoj hjkl.
+ h (liven) j (suben) k (supren) l (dekstren)
+
+ 2. Por lanĉi Vim el la ŝelinvito, tajpu: vim DOSIERNOMO <Enenklavo>
+
+ 3. Por eliri el Vim, tajpu: <ESK> :q! <Enenklavo> por rezigni la ŝanĝojn
+
+ 4. Por forviŝi la signojn ĉe la pozicio de la kursoro, tajpu: x
+
+ 5. Por enmeti aŭ postaldoni tekston, tajpu:
+ i tajpu enmetendan tekston <ESK>
+ enmetas tekston antaŭ la kursoro
+
+ A tajpu la postaldonendan tekston <ESK>
+ postaldonas post la kursoro
+
+RIMARKO: Premo de <ESK> iras al la normala reĝimo, aŭ rezignas la
+ nedeziratan aŭ parte plenumita komando.
+
+Nun daŭrigu al la leciono 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.1: KOMANDOJ DE FORVIŜO
+
+
+ ** Tajpu dw por forviŝi vorton. **
+
+ 1. Premu <ESK> por certigi, ke vi estas en normala reĝimo.
+
+ 2. Movu la kursoron al la suba linio markita per --->.
+
+ 3. Movu la kursoron al la komenco de vorto, kiu forviŝendas.
+
+ 4. Tajpu dw por forviŝi la vorton.
+
+ RIMARKO: La litero d aperos en la lasta linio sur la ekrano kiam vi
+ tajpas ĝin. Vim atendas ĝis kiam vi tajpas w . Se vi vidas
+ alian signon ol d vi tajpis ion mise; premu <ESK> kaj
+ rekomencu.
+
+---> Estas iuj vortoj kiuj Zamenhof ne devus esti akuzativo en ĉi tiu frazo.
+
+ 5. Ripetu paŝojn 3 kaj 4 ĝis kiam la frazo estas ĝusta kaj moviĝu al la
+ leciono 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.2: PLIAJ KOMANDOJ DE FORVIŜO
+
+
+ ** Tajpu d$ por forviŝi la finon de la linio. **
+
+ 1. Premu <ESK> por certigi, ke vi estas en normala reĝimo.
+
+ 2. Movu la kursoron al la suba linio markita per --->.
+
+ 3. Movu la kursoron ĉe la fino de la ĝusta linio (POST la unua . ).
+
+ 4. Tajpu d$ por foriviŝi ĝis la fino de la linio.
+
+---> Iu tajpis la finon de ĉi tiu linio dufoje. fino de ĉi tiu linio dufoje.
+
+
+ 5. Moviĝu al la leciono 2.3 por kompreni kio okazas.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.3: PRI OPERATOROJ KAJ MOVOJ
+
+
+ Multaj komandoj, kiuj ŝanĝas la tekston, estas faritaj de operatoro kaj
+ movo. La formato de komando de forviŝo per la operatoro de forviŝo d
+ estas kiel sekvas:
+
+ d movo
+
+ Kie:
+ d - estas la operatoro de movo
+ movo - estas tio, pri kio la operatoro operacios (listigita sube)
+
+ Mallonga listo de movoj:
+ w - ĝis la komenco de la sekvanta vorto, krom ĝia unua signo.
+ e - ĝis la fino de la nuna vorto, krom la lasta signo.
+ $ - ĝis la fino de la linio, krom la lasta signo.
+
+ Do tajpo de 'de' forviŝos ekde la kursoro ĝis la fino de la vorto.
+
+RIMARKO: Premo de nur la movo en Normala reĝimo sen operatoro movos
+ la kursoron kiel specifite.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.4: UZI NOMBRON POR MOVO
+
+ ** Tajpo de nombro antaŭ movo ripetas ĝin laŭfoje. **
+
+ 1. Movu la kursoron ĉe la komenco de la suba linio markita per --->.
+
+ 2. Tajpu 2w por movi la kursoron je du vortoj antaŭen.
+
+ 3. Tajpu 3e por movi la kursoron ĉe la fino de la tria vorto antaŭen.
+
+ 4. Tajpu 0 (nul) por moviĝi ĉe la komenco de la linio.
+
+
+ 5. Ripetu paŝojn 2 ĝis 3 kun malsamaj nombroj.
+
+---> Tio estas nur linio kun vortoj, kie vi povas moviĝi.
+
+ 6. Moviĝu al la leciono 2.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.5: UZI NOMBRON POR FORVIŜI PLI
+
+
+ ** Tajpo de nombro kun operatoro ripetas ĝin laŭfoje. **
+
+ En la kombinaĵo de la operatoro de forviŝo, kaj movo kiel menciita
+ ĉi-supre, eblas aldoni nombron antaŭ la movo por pli forviŝi:
+ d nombro movo
+
+ 1. Movu la kursoron ĉe la unua MAJUSKLA vorto en la linio markita per --->.
+
+ 2. Tajpu d2w por forviŝi la du MAJUSKLAJN vortojn.
+
+ 3. Ripetu paŝojn 1 ĝis 2 per malsama nombro por forviŝi la sinsekvajn
+ MAJUSKLAJN vortojn per unu komando.
+
+---> Tiu AB CDE linio FGHI JK LMN OP de vortoj estas Q RS TUV purigita.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.6: OPERACII SUR LINIOJ
+
+
+ ** Tajpu dd por forviŝi tutan linion. **
+
+ Pro la ofteco de forviŝo de tuta linio, la verkisto de Vi decidis, ke
+ estus pli facile simple tajpi du d-ojn por forviŝi linion.
+
+ 1. Movu la kursoron sur la duan linion en la suba frazo.
+ 2. Tajpu dd por forviŝi la linion.
+ 3. Nun moviĝu al la kvara linio.
+ 4. Tajpu 2dd por forviŝi du liniojn.
+
+---> 1) Rozoj estas ruĝaj,
+---> 2) Ŝlimo estas amuza,
+---> 3) Violoj estas bluaj,
+---> 4) Mi havas aŭton,
+---> 5) Horloĝoj diras kioma horo estas,
+---> 6) Sukero estas dolĉa,
+---> 7) Kaj tiel vi estas.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2.7: LA KOMANDO DE MALFARO
+
+
+ ** Premu u por malfari la lastajn komandojn, U por ripari la tutan linion. **
+
+ 1. Movu la kursoron ĉe la suba linio markita per ---> kaj metu ĝin sur
+ la unuan eraron.
+ 2. Tajpu x por forviŝi la unuan nedeziratan signon.
+ 3. Nun tajpu u por malfari la lastan plenumitan komandon.
+ 4. Ĉi-foje, riparu ĉiujn erarojn en la linio kaj ĝia originala stato.
+ 5. Nun tajpu majusklan U por igi la linion al ĝia antaŭa stato.
+ 6. Nun tajpu u kelkfoje por malfari la U kaj antaŭajn komandojn.
+ 7. Nun tajpu CTRL-R (premante la CTRL klavon dum vi premas R) kelkfoje
+ por refari la komandojn (malfari la malfarojn).
+
+---> Koorektii la erarojn sur tiuu ĉi liniio kaj remettu illlin per malfaro.
+
+ 8. Tiuj estas tre utilaj komandoj. Nun moviĝu al la leciono 2 RESUMO.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 2 RESUMO
+
+
+ 1. Por forviŝi ekde la kursoro ĝis la sekvanta vorto, tajpu: dw
+ 2. Por forviŝi ekde la kursoro ĝis la fino de la linio, tajpu: d$
+ 3. Por forviŝi tutan linion, tajpu: dd
+
+ 4. Por ripeti movon, antaŭmetu nombron: 2w
+ 5. La formato de ŝanĝa komando estas:
+ operatoro [nombro] movo
+
+ kie:
+ operatoro - estas tio, kio farendas, kiel d por forviŝi
+ [nombro] - estas opcia nombro por ripeti la movon
+ movo - movas sur la teksto por operacii, kiel ekzemple w (vorto),
+ $ (ĝis fino de linio), ktp.
+
+ 6. Por moviĝi al la komenco de la linio, uzu nul: 0
+
+ 7. Por malfari antaŭajn agojn, tajpu: u (minuskla u)
+ Por malfari ĉiujn ŝanĝojn sur la linio, tajpu: U (majuskla U)
+ Por refari la malfarojn, tajpu: CTRL-R
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3.1 LA KOMANDO DE METO
+
+
+ ** Tajpu p por meti tekston forviŝitan antaŭe post la kursoro. **
+
+ 1. Movu la kursoron ĉe la unua suba linio markita per --->.
+
+ 2. Tajpu dd por forviŝi la linion kaj konservi ĝin ene de reĝistro de Vim.
+
+ 3. Movu la kursoron ĉe la linio c), SUPER kie la forviŝita linio devus esti.
+
+ 4. Tajpu p por meti la linion sub la kursoron.
+
+ 5. Ripetu la paŝojn 2 ĝis 4 por meti ĉiujn liniojn en la ĝusta ordo.
+
+---> d) Ĉu ankaŭ vi povas lerni?
+---> b) Violoj estas bluaj,
+---> c) Inteligenteco lerneblas,
+---> a) Rozoj estas ruĝaj,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3.2 LA KOMANDO DE ANSTATAŬIGO
+
+
+ ** Tajpu rx por anstataŭigi la signon ĉe la kursoro per x . **
+
+
+ 1. Movu la kursoron ĉe la unua suba linio markita per --->.
+
+ 2. Movu la kursoron ĝis la unua eraro.
+
+ 3. Tajpu r kaj la signon, kiu devus esti tie.
+
+ 4. Ripetu paŝojn 2 kaj 3 ĝis kiam la unua linio egalas la duan.
+
+---> Kiem tiu lanio estis tajpita, iu pramis la naĝuftajn klovojn!
+---> Kiam tiu linio estis tajpita, iu premis la neĝustajn klavojn!
+
+ 5. Nun moviĝu al la leciono 3.3.
+
+RIMARKO: Memoru, ke vi devus lerni per uzo, kaj ne per memorado.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3.3 LA OPERATORO DE ŜANĜO
+
+
+ ** Por ŝanĝi ĝis la fino de la vorto, tajpu ce . **
+
+ 1. Movu la kursoron ĉe la unua suba linio markita per --->.
+
+ 2. Metu la kursoron sur la d en lduzw
+
+ 3. Tajpu ce kaj la ĝustan vorton (en tiu ĉi kazo, tajpu inio ).
+
+ 4. Premu <ESK> kaj moviĝu al la sekvanta signo, kiu bezonas ŝanĝon.
+
+ 5. Ripetu la paŝojn 3 kaj 4 ĝis kiam la unua frazo egalas la duan.
+
+---> Tiu lduzw havas kelkajn vortojn, kiii bezas ŝanĝon per la ŝanĝooto.
+---> Tiu linio havas kelkajn vortojn, kiuj bezonas ŝanĝon per la ŝanĝoperatoro.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3.4 PLIAJ ŜANĜOJ PER c
+
+
+ ** La operatoro de ŝanĝo uzeblas kun la sama movo kiel forviŝo. **
+
+ 1. La operatoro de ŝanĝo funkcias sammaniere kiel forviŝo. La formato estas:
+
+ c [nombro] movo
+
+ 2. La movoj estas samaj, kiel ekzemple w (vorto) kaj $ (fino de linio).
+
+ 3. Moviĝu ĉe la unua suba linio markita per --->.
+
+ 4. Movu la kursoron al la unua eraro.
+
+ 5. Tajpu c$ kaj tajpu la reston de la linio kiel la dua kaj premu <ESK>.
+
+---> La fino de ĉi tiu linio bezonas helpon por igi ĝin same kiel la dua.
+---> La fino de ĉi tiu linio bezonas korektojn per uzo de la komando c$
+
+RIMARKO: Vi povas uzi la klavon Retropaŝo por korekti erarojn dum vi tajpas.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 3 RESUMO
+
+
+ 1. Por remeti tekston, kiun vi ĵus forviŝis, tajpu p. Tio metas la
+ forviŝitan tekston POST la kursoro (se linio estis forviŝita, ĝi
+ iros en la linion sub la kursoro).
+
+ 2. Por anstataŭigi la signon sub la kursoro, tajpu r kaj tiam la signon
+ kion vi deziras havi tie.
+
+ 3. La operatoro de ŝanĝo ebligas al vi ŝanĝi ekde la kursoro, ĝis kie
+ la movo iras. Ekz. tajpu ce por ŝanĝi ekde la kursoro ĝis la fino
+ de la vorto, c$ por ŝanĝi ĝis la fino de la linio.
+
+ 4. La formato de ŝanĝo estas:
+
+ c [nombro] movo
+
+Nun daŭrigu al la sekvanta leciono.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4.1: POZICIO DE KURSORO KAJ STATO DE DOSIERO
+
+
+ ** Tajpu CTRL-G por montri vian pozicion en la dosiero kaj la dosierstaton.
+ Tajpu G por moviĝi al linio en la dosiero. **
+
+ RIMARKO: Legu la tutan lecionon antaŭ ol plenumi iun paŝon ajn!!
+
+ 1. Premu la klavon Ctrl kaj premu g . Oni nomas tion CTRL-G.
+ Mesaĝo aperos ĉe la suba parto de la paĝo kun la dosiernomo kaj la
+ pozicio en la dosiero. Memoru la numeron de la linio por paŝo 3.
+
+ RIMARKO: Vi eble vidas la pozicion de la kursoro ĉe la suba dekstra
+ angulo de la ekrano. Tio okazas kiam la agordo 'ruler' estas
+ ŝaltita (vidu :help 'ruler')
+
+ 2. Premu G por moviĝi ĉe la subo de la dosiero.
+ Tajpu gg por moviĝi ĉe la komenco de la dosiero.
+
+ 3. Tajpu la numeron de la linio kie vi estis kaj poste G . Tio removos
+ vin al la linio, kie vi estis kiam vi unue premis CTRL-G.
+
+ 4. Se vi sentas vin komforta, plenumu paŝojn 1 ĝis 3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4.2 LA KOMANDO DE SERĈO
+
+
+ ** Tajpu / kaj poste frazon por serĉi la frazon. **
+
+ 1. En normala reĝimo, tajpu la / signon. Rimarku, ke ĝi kaj la kursoro
+ aperas ĉe la suba parto de la ekrano kiel por la : komando.
+
+ 2. Nun tajpu 'errarro' <Enenklavo>.
+ Tio estas la vorto, kion vi volas serĉi.
+
+ 3. Por serĉi la saman frazon denove, simple tajpu n .
+ Por serĉi la saman frazon denove en la retrodirekto, tajpu N .
+
+ 4. Por serĉi frazon en la retrodirekto, uzu ? anstataŭ / .
+
+ 5. Por reiri tien, el kie vi venis, premu CTRL-O (Premu Ctrl kaj o
+ literon o). Ripetu por pli retroiri. CTRL-I iras antaŭen.
+
+---> "errarro" ne estas maniero por literumi eraro; errarro estas eraro.
+
+RIMARKO: Kiam la serĉo atingas la finon de la dosiero, ĝi daŭras ĉe la
+ komenco, krom se la agordo 'wrapscan' estas malŝaltita.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4.3 SERĈO DE KONGRUAJ KRAMPOJ
+
+
+ ** Tajpu % por trovi kongruan ), ] aŭ } **
+
+ 1. Poziciu la kursoron sur iun (, [ aŭ { en la linio markita per --->.
+
+ 2. Nun tajpu la % signon.
+
+ 3. La kursoro moviĝas al la kongrua krampo.
+
+ 4. Tajpu % por movi la kursoron al la alia kongrua krampo.
+
+ 5. Movu la kursoron al la alia (, ), [, ], {, } kaj observu tion,
+ kion % faras.
+
+---> Ĉi tiu ( estas testa linio kun (-oj, [-oj, ]-oj kaj {-oj, }-oj en ĝi. ))
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4.4 LA KOMANDO DE ANSTATAŭIGO
+
+
+ ** Tajpu :s/malnova/nova/g por anstataŭigi 'nova' per 'malnova'. **
+
+ 1. Movu la kursoron al la suba linio markita per --->.
+
+ 2. Tajpu :s/laa/la <Enenklavo> . Rimarku, ke la komando ŝanĝas nur la
+ unuan okazaĵon de "laa" en la linio.
+
+ 3. Nun tajpu :s/laa/la/g . Aldono de g opcio signifas mallokan
+ anstataŭigon en la linio. Ĝi ŝanĝas ĉiujn okazaĵojn de "laa" en la
+ linio.
+
+---> laa plej bona tempo por vidi florojn estas en laa printempo.
+
+ 4. Por ŝanĝi ĉiujn okazaĵojn de iu ĉena signo inter du linioj,
+ tajpu :#,#s/malnova/nova/g kie #,# estas la numeroj de linioj de la
+ intervalo de la linioj kie la anstataŭigo
+ okazos.
+ Tajpu :%s/malnova/nova/g por ŝanĝi ĉiujn okazaĵojn en la tuta
+ dosiero.
+ Tajpu :s/malnova/nova/gc por trovi ĉiujn okazaĵojn en la tuta
+ dosiero, kun invitilo ĉu anstataŭigi
+ aŭ ne.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 4 RESUMO
+
+ 1. CTRL-G vidigas vian pozicion en la dosiero kaj la staton de la dosiero.
+ G movas la kursoron al la fino de la dosiero.
+ numero G movas la kursoron al numero de tiu linio.
+ gg movas la kursoron al la unua linio.
+
+ 2. Tajpo de / kaj frazon serĉas la frazon antaŭen.
+ Tajpo de ? kaj frazon serĉas la frazon malantaŭen.
+ Post serĉo, tajpu n por trovi la sekvantan okazaĵon en la sama direkto aŭ
+ N por serĉi en la mala direkto.
+ CTRL-O movas vin al la antaŭaj pozicioj, CTRL-I al la novaj pozicioj.
+
+ 3. Tajpo de % kiam la kursoro estas sur (,),[,],{ aŭ } moviĝas al ĝia
+ kongruo.
+
+ 4. Por anstataŭigi 'nova' en la unua 'malnova' en linio :s/malnova/nova
+ Por anstataŭigi 'nova' en ĉiuj 'malnova'-oj en linio :s/malnova/nova/g
+ Por anstataŭigi frazon inter du #-aj linioj :#,#s/malnova/nova/g
+ Por anstataŭigi ĉiujn okazaĵojn en la dosiero :%s/malnova/nova/g
+ Por demandi konfirmon ĉiu-foje, aldonu 'c' :%s/malnova/nova/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5.1 KIEL PLENUMI EKSTERAN KOMANDON
+
+
+ ** Tajpu :! sekvata de ekstera komando por plenumi la komandon. **
+
+ 1. Tajpu la konatan komandon : por pozicii la kursoron ĉe la suba parto
+ de la ekrano. Tio ebligas tajpadon de komando en komanda linio.
+
+ 2. Nun tajpu la ! (krisigno) signon. Tio ebligas al vi plenumi iun
+ eksteran ŝelan komandon ajn.
+
+ 3. Ekzemple, tajpu ls post ! kaj tajpu <Enenklavo>. Tio listigos la
+ enhavon de la dosierujo, same kiel se vi estis en ŝela invito.
+ Aŭ uzu :!dir se ls ne funkcias.
+
+RIMARKO: Eblas plenumi iun eksteran komandon ajn tiamaniere, ankaŭ kun
+ argumentoj.
+
+RIMARKO: Ĉiuj : komandoj devas finiĝi per tajpo de <Enenklavo>
+ Ekde nun, ni ne plu mencios tion.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5.2 PLI PRI KONSERVO DE DOSIERO
+
+
+ ** Por konservi la faritajn ŝanĝojn en la teksto, tajpu :w DOSIERNOMO. **
+
+ 1. Tajpu !dir aŭ !ls por akiri liston de via dosierujo.
+ Vi jam scias, ke vi devas tajpi <Enenklavo> post tio.
+
+ 2. Elektu dosieron, kiu ankoraŭ ne ekzistas, kiel ekzemple TESTO.
+
+ 3. Nun tajpu: :w TESTO (kie TESTO estas la elektita dosiernomo)
+
+ 4. Tio konservas la tutan dosieron (instruilon de Vim) kun la nomo TESTO.
+ Por kontroli tion, tajpu :!dir aŭ :!ls denove por vidigi vian
+ dosierujon.
+
+RIMARKO: Se vi volus eliri el Vim kaj restartigi ĝin denove per vim TESTO,
+ la dosiero estus precize same kiel kopio de la instruilo kiam vi
+ konservis ĝin.
+
+ 5. Nun forviŝu la dosieron tajpante (VINDOZO): :!del TESTO
+ aŭ (UNIKSO): :!rm TESTO
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5.3 APARTIGI KONSERVENDAN TESTON
+
+
+ ** Por konservi parton de la dosiero, tajpu v movo :w DOSIERNOMO **
+
+ 1. Movu la kursoron al tiu linio.
+
+ 2. Premu v kaj movu la kursoron al la kvina suba ero. Rimarku, ke la
+ teksto emfaziĝas.
+
+ 3. Premu la : signon. Ĉe la fino de la ekrano :'<,'> aperos.
+
+ 4. Tajpu w TESTO , kie TESTO estas dosiernomo, kiu ankoraŭ ne ekzistas.
+ Kontrolu, ke vi vidas :'<,'>w TESTO antaŭ ol premi <Enenklavo>.
+
+ 5. Vim konservos la apartigitajn liniojn al la dosiero TESTO. Uzu :dir
+ aŭ :!ls por vidigi ĝin. Ne forviŝu ĝin. Ni uzos ĝin en la sekvanta
+ leciono.
+
+RIMARKO: Premo de v komencas Viduman apartigon. Vi povas movi la kursoron
+ por pligrandigi aŭ malpligrandigi la apartigon. Tiam vi povas uzi
+ operatoron por plenumi ion kun la teksto. Ekzemple, d forviŝas
+ la tekston.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5.4 AKIRI KAJ KUNFANDI DOSIEROJN
+
+
+ ** Por enmeti la enhavon de dosiero, tajpu :r DOSIERNOMON **
+
+ 1. Movu la kursoron tuj super ĉi tiu linio.
+
+RIMARKO: Post plenumo de paŝo 2, vi vidos tekston el la leciono 5.3. Tiam
+ moviĝu SUBEN por vidi tiun lecionon denove.
+
+ 2. Nun akiru vian dosieron TESTO uzante la komandon :r TESTO kie TESTO
+ estas la nomo de la dosiero, kiun vi uzis.
+ La dosiero, kion vi akiras, estas metita sub la linio de la kursoro.
+
+ 3. Por kontroli, ĉu la dosiero akiriĝis, retromovu la kursoron kaj rimarku,
+ ke estas nun du kopioj de la leciono 5.3, la originala kaj la versio mem
+ de la dosiero.
+
+RIMARKO: Vi nun povas legi la eliron de ekstera komando. Ekzemple,
+ :r !ls legas la eliron de la komando ls kaj metas ĝin sub la
+ kursoron.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 5 RESUMO
+
+
+ 1. :!komando plenumas eksteran komandon.
+
+ Iuj utilaj ekzemploj estas:
+ (VINDOZO) (UNIKSO)
+ :!dir :!ls - listigas dosierujon
+ :!del DOSIERNOMO :!rm DOSIERNOMO - forviŝas la dosieron DOSIERNOMO
+
+ 2. :w DOSIERNOMO konservas la nunan dosieron de Vim al disko kun la
+ nomo DOSIERNOMO.
+
+ 3. v movo :w DOSIERNOMO konservas la Viduman apartigon de linioj en
+ dosiero DOSIERNOMO.
+
+ 4. :r DOSIERNOMO akiras la dosieron DOSIERNOMO el la disko kaj metas
+ ĝin sub la pozicion de la kursoro.
+
+ 5. :r !dir legas la eligon de la komando dir kaj metas ĝin sub la
+ pozicion de la kursoro.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.1 LA KOMANDO DE MALFERMO
+
+
+ ** Tajpu o por malfermi linion sub la kursoro kaj eniri Enmetan reĝimon. **
+
+ 1. Movu la kursoron al la suba linio markita per --->.
+
+ 2. Tajpu la minusklan literon o por malfermi linion SUB la kursoro kaj
+ eniri la Enmetan reĝimon.
+
+ 3. Nun tajpu tekston kaj premu <ESK> por eliri el la Enmeta reĝimo.
+
+---> Post tajpo de o la kursoro moviĝas al la malfermata linio en
+ Enmeta reĝimo.
+
+ 4. Por malfermi linion SUPER la kursoro, nur tajpu majusklan O ,
+ anstataŭ minusklan o. Provu tion per la suba linio.
+
+---> Malfermu linion SUPER tiu tajpante O dum la kursoro estas sur tiu linio.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.2 LA KOMANDO DE POSTALDONO
+
+
+ ** Tajpu a por enmeti POST la kursoro. **
+
+ 1. Movu la kursoron ĉe la komenco de la linio markita per --->.
+
+ 2. Premu e ĝis kiam la kursoro estas ĉe la fino de li.
+
+ 3. Tajpu a (minuskle) por aldoni tekston POST la kursoro.
+
+ 4. Kompletigu la vorton same kiel la linio sub ĝi. Premu <ESK> por
+ eliri el la Enmeta reĝimo.
+
+ 5. Uzu e por moviĝi al la sekvanta nekompleta vorto kaj ripetu
+ paŝojn 3 kaj 4.
+
+---> Ĉi tiu lin ebligos vin ekz vin postal tekston al linio.
+---> Ĉi tiu linio ebligos vin ekzerci vin postaldoni tekston al linio.
+
+RIMARKO: Ĉiu a, i kaj A iras al la sama Enmeta reĝimo, la nura malsamo
+ estas tie, kie la signoj estas enmetitaj.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.3 ALIA MANIERO POR ANSTATAŬIGI
+
+
+ ** Tajpu majusklan R por anstataŭigi pli ol unu signo. **
+
+ 1. Movu la kursoron al la unua suba linio markita per --->. Movu la
+ kursoron al la komenco de la unua xxx .
+
+ 2. Nun premu R kaj tajpu la nombron sub ĝi en la dua linio, por ke ĝi
+ anstataŭigu la xxx .
+
+ 3. Premu <ESK> por foriri el la Anstataŭiga reĝimo. Rimarku, ke la cetera
+ parto de la linio restas neŝanĝata.
+
+ 4. Ripetu la paŝojn por anstataŭigi la restantajn xxx.
+
+---> Aldono de 123 al xxx donas al vi xxx.
+---> Aldono de 123 al 456 donas al vi 579.
+
+RIMARKO: Anstataŭiga reĝimo estas same kiel Enmeta reĝimo, sed ĉiu signo
+ tajpita forviŝas ekzistan signon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.4 KOPII KAJ ALGLUI TEKSTON
+
+
+ ** Uzu la y operatoron por kopii tekston, kaj p por alglui ĝin **
+
+
+ 1. Iru al la suba linio markita per ---> kaj poziciu la kursoron post "a)".
+
+ 2. Komencu la Viduman reĝimon per v kaj movu la kursoron tuj antaŭ "unua".
+
+ 3. Tajpu y por kopii la emfazitan tekston.
+
+ 4. Movu la kursoron ĉe la fino de la linio: j$
+
+ 5. Tajpu p por alglui la tekston. Tiam tajpu: a dua <ESK> .
+
+ 6. Uzu Viduman reĝimon por apartigi " ero.", kopiu ĝin per y , moviĝu
+ ĉe la fino de la sekvanta linio per j$ kaj algluu la tekston tie
+ per p .
+
+---> a) tio estas la unua ero.
+ b)
+
+RIMARKO: vi povas ankaŭ uzi y kiel operatoro; yw kopias unu vorton.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6.5 AGORDI OPCION
+
+
+ ** Agordu opcion por ke serĉo aŭ anstataŭigo ignoru usklecon **
+
+ 1. Serĉu 'ignori' per tajpo de /ignori <Enenklavo>
+ Ripetu plurfoje premante n .
+
+ 2. Ŝaltu la opcion 'ic' (ignori usklecon) per: :set ic
+
+ 3. Nun serĉu 'ignori' denove premante n
+ Rimarku, ke Ignori kaj IGNORI estas nun troveblas.
+
+ 4. Ŝaltu la opciojn 'hlsearch' kaj 'incsearch': :set hls is
+
+ 5. Nun retajpu la serĉan komandon kaj vidu kio okazas: /ignore <Enenklavo>
+
+ 6. Por malŝalti ignoron de uskleco: :set noic
+
+RIMARKO: Por forigi emfazon de kongruo, tajpu: :nohlsearch
+RIMARKO: Se vi deziras ignori usklecon por nur unu serĉa komando, uzu \c
+ en la frazo: /ignore\c <Enenklavo>
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 6 RESUMO
+
+ 1. Tajpu o por malfermi linion SUB la kursoro kaj eki en Enmeta reĝimo.
+ 1. Tajpu O por malfermi linion SUPER la kursoro.
+
+ 2. Tajpu a por enmeti tekston POST la kursoro.
+ Tajpu A por enmeti tekston post la fino de la linio.
+
+ 3. La e komando movas la kursoron al la fino de vorto.
+
+ 4. la y operatoro kopias tekston, p algluas ĝin.
+
+ 5. Tajpo de majuskla R eniras la Anstataŭigan reĝimon ĝis kiam
+ <ESK> estas premita.
+
+ 6. Tajpo de ":set xxx" ŝaltas la opcion "xxx". Iuj opcioj estas:
+ 'ic' 'ignorecase' ignori usklecon dum serĉo
+ 'is' 'incsearch' montru partan kongruon dum serĉo
+ 'hls' 'hlsearch' emfazas ĉiujn kongruajn frazojn
+ Vi povas uzi aŭ la longan, aŭ la mallongan nomon de opcio.
+
+ 7. Antaŭaldonu "no" por malŝalti la opcion: :set noic
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 7.1 AKIRI HELPON
+
+
+ ** Uzu la helpan sistemon **
+
+ Vim havas ampleksan helpan sistemon. Por komenciĝi, provu unu el la tiuj
+ tri:
+ - premu la klavon <HELPO> (se vi havas ĝin)
+ - premu la klavon <F1> (se vi havas ĝin)
+ - tajpu :help <Enenklavo>
+
+ Legu la tekston en la helpfenestro por trovi kiel helpo funkcias.
+ Tajpu CTRL-W CTRL-W por salti de unu fenestro al la alia.
+ Tajpu :q <Enenklavo> por fermi la helpan fenestron.
+
+ Vi povas trovi helpon pri io ajn aldonante argumenton al la komando
+ ":help". Provu tiujn (ne forgesu premi <Enenklavo>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 7.2 KREI STARTAN SKRIPTON
+
+
+ ** Ebligu kapablojn de Vim **
+
+ Vim havas multe pli da kapabloj ol Vi, sed la plej multaj estas defaŭlte
+ malŝaltitaj. Por ekuzi la kapablojn, vi devas krei dosieron "vimrc".
+
+ 1. Ekredaktu la dosieron "vimrc". Tio dependas de via sistemo:
+ :e ~/.vimrc por Unikso
+ :e ~/_vimrc por Vindozo
+
+ 2. Nun legu la enhavon de la ekzempla "vimrc"
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Konservu la dosieron per:
+ :w
+
+ La sekvantan fojon, kiam vi lanĉas Vim, ĝi uzos sintaksan emfazon.
+ Vi povas aldoni ĉiujn viajn preferatajn agordojn al tiu dosiero "vimrc".
+ Por pli da informoj, tajpu :help vimrc-intro
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 7.3 KOMPLETIGO
+
+
+ ** Kompletigo de komanda linio per CTRL-D kaj <TAB> **
+
+ 1. Certigu ke Vim estas en kongrua reĝimo: :set nocp
+
+ 2. Rigardu tiujn dosierojn, kiuj ekzistas en la dosierujo: :!ls aŭ :!dir
+
+ 3. Tajpu la komencon de komando: :e
+
+ 4. Premu CTRL-D kaj Vim montros liston de komandoj, kiuj komencas per "e".
+
+ 5. Premu d<TAB> kaj Vim kompletigos la nomon de la komando al ":edit".
+
+ 6. Nun aldonu spaceton kaj la komencon de ekzistanta nomo: :edit DOSI
+
+ 7. Premu d<TAB>. Vim kompletigos la nomon (se ĝi estas unika)
+
+RIMARKO: Kompletigo funkcias por multaj komandoj. Nur provu premi CTRL-D kaj
+ <TAB>. Estas aparte utila por :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leciono 7 RESUMO
+
+
+ 1. Tajpu :help aŭ premu <F1> aŭ <Helpo> por malfermi helpan fenestron.
+
+ 2. Tajpu :help kmd por trovi helpon pri kmd.
+
+ 3. Tajpu CTRL-W CTRL-W por salti al alia fenestro.
+
+ 4. Tajpu :q to fermi la helpan fenestron.
+
+ 5. Kreu komencan skripton vimrc por konservi viajn agordojn.
+
+ 6. Kiam vi tajpas : komandon, premu CTRL-D por vidi ĉiujn kompleteblojn.
+ Premu <TAB> por uzi unu kompletigon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Tio konkludas la instruilon de Vim. Ĝi celis doni mallongan superrigardon
+ de la redaktilo Vim, nur tion kio sufiĉas por ebligi al vi facilan uzon de
+ la redaktilo. Estas nepre nekompleta, ĉar Vim havas multajn multajn pliajn
+ komandojn. Legu la manlibron: ":help user-manual".
+
+ Tiu instruilo estis verkita de Michael C. Pierce kaj Robert K. Ware,
+ el la Koloradia Lernejo de Minejoj (Colorado School of Mines) uzante
+ ideojn provizitajn de Charles Smith el la Stata Universitato de Koloradio
+ (Colorado State University)
+
+ Retpoŝto: bware@mines.colorado.edu.
+
+ Modifita por Vim de Bram Moolenaar.
+
+ Esperantigita fare de Dominique Pellé, 2008-04-01
+ Retpoŝto: dominique.pelle@gmail.com
+ Lasta ŝanĝo: 2020-07-19
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.es b/runtime/tutor/tutor.es
new file mode 100644
index 0000000..ed9397c
--- /dev/null
+++ b/runtime/tutor/tutor.es
@@ -0,0 +1,1026 @@
+===============================================================================
+= B i e n v e n i d o a l t u t o r d e V I M - Versin 1.7 =
+===============================================================================
+
+ Vim es un editor muy potente que dispone de muchos comandos, demasiados
+ para ser explicados en un tutor como ste. Este tutor est diseado
+ para describir suficientes comandos para que usted sea capaz de
+ aprender fcilmente a usar Vim como un editor de propsito general.
+
+ El tiempo necesario para completar el tutor es aproximadamente de 30
+ minutos, dependiendo de cunto tiempo se dedique a la experimentacin.
+
+ Los comandos de estas lecciones modificarn el texto. Haga una copia de
+ este fichero para practicar (con vimtutor esto ya es una copia).
+
+ Es importante recordar que este tutor est pensado para ensear con
+ la prctica. Esto significa que es necesario ejecutar los comandos
+ para aprenderlos adecuadamente. Si nicamente lee el texto, se le
+ olvidarn los comandos.
+
+ Ahora, asegrese de que la tecla de bloqueo de maysculas NO est
+ activada y pulse la tecla j lo suficiente para mover el cursor
+ de forma que la Leccin 1.1 ocupe completamente la pantalla.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 1.1: MOVER EL CURSOR
+
+ ** Para mover el cursor, pulse las teclas h,j,k,l de la forma indicada. **
+ ^
+ k Indicacin: La tecla h est a la izquierda y lo mueve a la izquierda.
+ < h l > La tecla l est a la derecha y lo mueve a la derecha.
+ j La tecla j parece una flecha que apunta hacia abajo.
+ v
+
+ 1. Mueva el cursor por la pantalla hasta que se sienta cmodo con ello.
+
+ 2. Mantenga pulsada la tecla (j) hasta que se repita automgicamente.
+ Ahora ya sabe como llegar a la leccin siguiente.
+
+ 3. Utilizando la tecla abajo, vaya a la leccin 1.2.
+
+NOTA: Si alguna vez no est seguro sobre algo que ha tecleado, pulse <ESC>
+ para situarse en modo Normal. Luego vuelva a teclear la orden que deseaba.
+
+NOTA: Las teclas de movimiento del cursor tambin funcionan. Pero usando
+ hjkl podr moverse mucho ms rpido una vez que se acostumbre a ello.
+ De verdad!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 1.2: SALIR DE VIM
+
+ NOTA: Antes de ejecutar alguno de los siguientes pasos lea primero
+ la leccin entera!!
+
+ 1. Pulse la tecla <ESC> (para asegurarse de que est en modo Normal).
+
+ 2. Escriba: :q! <INTRO>
+ Esto provoca la salida del editor DESCARTANDO cualquier cambio que haya hecho.
+
+ 3. Regrese aqu ejecutando el comando que le trajo a este tutor.
+ ste puede haber sido: vimtutor <INTRO>
+
+ 4. Si ha memorizado estos pasos y se siente con confianza, ejecute los
+ pasos 1 a 3 para salir y volver a entrar al editor.
+
+NOTA: :q! <INTRO> descarta cualquier cambio que haya realizado.
+ En prximas lecciones aprender cmo guardar los cambios en un archivo.
+
+ 5. Mueva el cursor hasta la Leccin 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 1.3: EDITAR TEXTO - BORRAR
+
+ ** Pulse x para eliminar el carcter bajo el cursor. **
+
+ 1. Mueva el cursor a la lnea de abajo sealada con --->.
+
+ 2. Para corregir los errores, mueva el cursor hasta que est sobre el
+ carcter que va a ser borrado.
+
+ 3. Pulse la tecla x para eliminar el carcter no deseado.
+
+ 4. Repita los pasos 2 a 4 hasta que la frase sea la correcta.
+
+---> La vvaca salt soobree laa luuuuna.
+
+ 5. Ahora que la lnea esta correcta, contine con la Leccin 1.4.
+
+NOTA: A medida que vaya avanzando en este tutor no intente memorizar,
+ aprenda practicando.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 1.4: EDITAR TEXTO - INSERTAR
+
+ ** Pulse i para insertar texto. **
+
+ 1. Mueva el cursor a la primera lnea de abajo sealada con --->.
+
+ 2. Para hacer que la primera lnea sea igual que la segunda, mueva el
+ cursor hasta que est sobre el carcter ANTES del cual el texto va a ser
+ insertado.
+
+ 3. Pulse i y escriba los caracteres a aadir.
+
+ 4. A medida que sea corregido cada error pulse <ESC> para volver al modo
+ Normal. Repita los pasos 2 a 4 para corregir la frase.
+
+---> Flta texto en esta .
+---> Falta algo de texto en esta lnea.
+
+ 5. Cuando se sienta cmodo insertando texto pase vaya a la leccin 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 1.5: EDITAR TEXTO - AADIR
+
+
+ ** Pulse A para aadir texto. **
+
+ 1. Mueva el cursor a la primera lnea inferior marcada con --->.
+ No importa sobre qu carcter est el cursor en esta lnea.
+
+ 2. Pulse A y escriba el texto necesario.
+
+ 3. Cuando el texto haya sido aadido pulse <ESC> para volver al modo Normal.
+
+ 4. Mueva el cursor a la segunda lnea marcada con ---> y repita los
+ pasos 2 y 3 para corregir esta frase.
+
+---> Falta algn texto en es
+ Falta algn texto en esta lnea.
+---> Tambin falta alg
+ Tambin falta algn texto aqu.
+
+ 5. Cuando se sienta cmodo aadiendo texto pase a la leccin 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 1.6: EDITAR UN ARCHIVO
+
+ ** Use :wq para guardar un archivo y salir **
+
+ !! NOTA: Antes de ejecutar los siguientes pasos, lea la leccin entera!!
+
+ 1. Si tiene acceso a otra terminal, haga lo siguiente en ella.
+ Si no es as, salga de este tutor como hizo en la leccin 1.2: :q!
+
+ 2. En el smbolo del sistema escriba este comando: vim archivo.txt <INTRO>
+ 'vim' es el comando para arrancar el editor Vim, 'archivo.txt'
+ es el nombre del archivo que quiere editar
+ Utilice el nombre de un archivo que pueda cambiar.
+
+ 3. Inserte y elimine texto como ya aprendi en las lecciones anteriores.
+
+ 4. Guarde el archivo con los cambios y salga de Vim con: :wq <INTRO>
+
+ 5. Si ha salido de vimtutor en el paso 1 reinicie vimtutor y baje hasta
+ el siguiente sumario.
+
+ 6. Despus de leer los pasos anteriores y haberlos entendido: hgalos.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIN 1
+
+
+ 1. El cursor se mueve utilizando las teclas de las flechas o las teclas hjkl.
+ h (izquierda) j (abajo) k (arriba) l (derecha)
+
+ 2. Para acceder a Vim desde el smbolo del sistema escriba:
+ vim NOMBREARCHIVO <INTRO>
+
+ 3. Para salir de Vim escriba: <ESC> :q! <INTRO> para eliminar todos
+ los cambios.
+ O escriba: <ESC> :wq <INTRO> para guardar los cambios.
+
+ 4. Para borrar un carcter bajo el cursor en modo Normal pulse: x
+
+ 5. Para insertar o aadir texto escriba:
+ i escriba el texto a insertar <ESC> inserta el texto antes del cursor
+ A escriba el texto a aadir <ESC> aade texto al final de la lnea
+
+NOTA: Pulsando <ESC> se vuelve al modo Normal o cancela una orden no deseada
+ o incompleta.
+
+Ahora contine con la Leccin 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 2.1: COMANDOS PARA BORRAR
+
+
+ ** Escriba dw para borrar una palabra **
+
+
+ 1. Pulse <ESC> para asegurarse de que est en el modo Normal.
+
+ 2. Mueva el cursor a la lnea inferior sealada con --->.
+
+ 3. Mueva el cursor al comienzo de una palabra que desee borrar.
+
+ 4. Pulse dw para hacer que la palabra desaparezca.
+
+ NOTA: La letra d aparecer en la ltima lnea inferior derecha
+ de la pantalla mientras la escribe. Vim est esperando que escriba w .
+ Si ve otro carcter que no sea d escribi algo mal, pulse <ESC> y
+ comience de nuevo.
+
+---> Hay algunas palabras psalo bien que no pertenecen papel a esta frase.
+
+ 5. Repita los pasos 3 y 4 hasta que la frase sea correcta y pase a la
+ leccin 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 2.2: MS COMANDOS PARA BORRAR
+
+
+ ** Escriba d$ para borrar hasta el final de la lnea. **
+
+ 1. Pulse <ESC> para asegurarse de que est en el modo Normal.
+
+ 2. Mueva el cursor a la lnea inferior sealada con --->.
+
+ 3. Mueva el cursor al final de la lnea correcta (DESPUS del primer . ).
+
+ 4. Escriba d$ para borrar hasta el final de la lnea.
+
+---> Alguien ha escrito el final de esta lnea dos veces. esta lnea dos veces.
+
+ 5. Pase a la leccin 2.3 para entender qu est pasando.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 2.3: SOBRE OPERADORES Y MOVIMIENTOS
+
+
+ Muchos comandos que cambian texto estn compuestos por un operador y un
+ movimiento.
+ El formato para eliminar un comando con el operador de borrado d es el
+ siguiente:
+
+ d movimiento
+
+ Donde:
+ d - es el operador para borrar.
+ movimiento - es sobre lo que el comando va a operar (lista inferior).
+
+ Una lista resumida de movimientos:
+ w - hasta el comienzo de la siguiente palabra, EXCLUYENDO su primer
+ carcter.
+ e - hasta el final de la palabra actual, INCLUYENDO el ltimo carcter.
+ $ - hasta el final de la lnea, INCLUYENDO el ltimo carcter.
+
+ Por tanto, al escribir de borrar desde la posicin del cursor, hasta
+ el final de la palabra.
+
+NOTA: Pulsando nicamente el movimiento estando en el modo Normal sin un
+ operador, mover el cursor como se especifica en la lista anterior.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 2.4: UTILIZAR UN CONTADOR PARA UN MOVIMIENTO
+
+
+ ** Al escribir un nmero antes de un movimiento, lo repite esas veces. **
+
+ 1. Mueva el cursor al comienzo de la lnea marcada con --->.
+
+ 2. Escriba 2w para mover el cursor dos palabras hacia adelante.
+
+ 3. Escriba 3e para mover el cursor al final de la tercera palabra hacia
+ adelante.
+
+ 4. Escriba 0 (cero) para colocar el cursor al inicio de la lnea.
+
+ 5. Repita el paso 2 y 3 con diferentes nmeros.
+
+---> Esto es solo una lnea con palabras donde poder moverse.
+
+ 6. Pase a la leccin 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 2.5: UTILIZAR UN CONTADOR PARA BORRAR MAS
+
+
+ ** Al escribir un nmero con un operador lo repite esas veces. **
+
+ En combinacin con el operador de borrado y el movimiento mencionado
+ anteriormente, aada un contador antes del movimiento para eliminar ms:
+ d nmero movimiento
+
+ 1. Mueva el cursor al inicio de la primera palabra en MAYSCULAS en la
+ lnea marcada con --->.
+
+ 2. Escriba d2w para eliminar las dos palabras en MAYSCULAS.
+
+ 3. Repita los pasos 1 y 2 con diferentes contadores para eliminar
+ las siguientes palabras en MAYSCULAS con un comando.
+
+---> Esta ABC DE serie FGHI JK LMN OP de palabras ha sido Q RS TUV limpiada.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 2.6: OPERACIN EN LNEAS
+
+
+ ** Escriba dd para eliminar una lnea completa. **
+
+ Debido a la frecuencia con que se elimina una lnea completa, los
+ diseadores de Vi, decidieron que sera ms sencillo simplemente escribir
+ dos letras d para eliminar una lnea.
+
+ 1. Mueva el cursor a la segunda lnea del prrafo inferior.
+ 2. Escriba dd para eliminar la lnea.
+ 3. Ahora muvase a la cuarta lnea.
+ 4. Escriba 2dd para eliminar dos lneas a la vez.
+
+---> 1) Las rosas son rojas,
+---> 2) El barro es divertido,
+---> 3) La violeta es azul,
+---> 4) Tengo un coche,
+---> 5) Los relojes dan la hora,
+---> 6) El azcar es dulce
+---> 7) Y tambin lo eres t.
+
+La duplicacin para borrar lneas tambin funcionan con los operadores
+mencionados anteriormente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 2.7: EL MANDATO DESHACER
+
+
+ ** Pulse u para deshacer los ltimos comandos,
+ U para deshacer una lnea entera. **
+
+ 1. Mueva el cursor a la lnea inferior sealada con ---> y sitelo bajo el
+ primer error.
+ 2. Pulse x para borrar el primer carcter no deseado.
+ 3. Pulse ahora u para deshacer el ltimo comando ejecutado.
+ 4. Ahora corrija todos los errores de la lnea usando el comando x.
+ 5. Pulse ahora U mayscula para devolver la lnea a su estado original.
+ 6. Pulse ahora u unas pocas veces para deshacer lo hecho por U y los
+ comandos previos.
+ 7. Ahora pulse CTRL-R (mantenga pulsada la tecla CTRL y pulse R) unas
+ cuantas veces para volver a ejecutar los comandos (deshacer lo deshecho).
+
+---> Corrrija los errores dee esttta lnea y vuuelva a ponerlos coon deshacer.
+
+ 8. Estos son unos comandos muy tiles. Ahora vayamos al resumen de la
+ leccin 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIN 2
+
+ 1. Para borrar desde el cursor hasta siguiente palabra pulse: dw
+ 2. Para borrar desde el cursor hasta el final de la palabra pulse: de
+ 3. Para borrar desde el cursor hasta el final de una lnea pulse: d$
+ 4. Para borrar una lnea entera pulse: dd
+
+ 5. Para repetir un movimiento anteponga un nmero: 2w
+ 6. El formato para un comando de cambio es:
+ operador [nmero] movimiento
+ donde:
+ comando - es lo que hay que hacer, por ejemplo, d para borrar
+ [nmero] - es un nmero opcional para repetir el movimiento
+ movimiento - se mueve sobre el texto sobre el que operar, como
+ w (palabra), $ (hasta el final de la lnea), etc.
+ 7. Para moverse al inicio de la lnea utilice un cero: 0
+
+ 8. Para deshacer acciones previas pulse: u (u minscula)
+ Para deshacer todos los cambios de una lnea pulse: U (U mayscula)
+ Para deshacer lo deshecho pulse: CTRL-R
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 3.1: EL COMANDO PUT (poner)
+
+** Pulse p para poner (pegar) despus del cursor lo ltimo que ha borrado. **
+
+ 1. Mueva el cursor a la primera lnea inferior marcada con --->.
+
+ 2. Escriba dd para borrar la lnea y almacenarla en un registro de Vim.
+
+ 3. Mueva el cursor a la lnea c) por ENCIMA de donde debera estar
+ la lnea eliminada.
+
+ 4. Pulse p para pegar la lnea borrada por debajo del cursor.
+
+ 5. Repita los pasos 2 a 4 para poner todas las lneas en el orden correcto.
+
+---> d) Puedes aprenderla t?
+---> b) La violeta es azul,
+---> c) La inteligencia se aprende,
+---> a) Las rosas son rojas,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 3.2: EL COMANDO REEMPLAZAR
+
+
+ ** Pulse rx para reemplazar el carcter bajo el cursor con x . **
+
+ 1. Mueva el cursor a la primera lnea inferior marcada con --->.
+
+ 2. Mueva el cursor para situarlo sobre el primer error.
+
+ 3. Pulse r y despus el carcter que debera ir ah.
+
+ 4. Repita los pasos 2 y 3 hasta que la primera sea igual a la segunda.
+
+---> Cuendo esta lnea fue rscrita alguien pulso algunas teclas equibocadas!
+---> Cuando esta lnea fue escrita alguien puls algunas teclas equivocadas!
+
+ 5. Ahora pase a la leccin 3.3.
+
+NOTA: Recuerde que debera aprender practicando.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 3.3: EL COMANDO CAMBIAR
+
+
+ ** Para cambiar hasta el final de una palabra, escriba ce . **
+
+ 1. Mueva el cursor a la primera lnea inferior marcada con --->.
+
+ 2. Site el cursor en la u de lubrs.
+
+ 3. Escriba ce y corrija la palabra (en este caso, escriba 'nea').
+
+ 4. Pulse <ESC> y mueva el cursor al siguiente error que debe ser cambiado.
+
+ 5. Repita los pasos 3 y 4 hasta que la primera frase sea igual a la segunda.
+
+---> Esta lubrs tiene unas pocas pskavtad que corregir usem el comando change.
+---> Esta lnea tiene unas pocas palabras que corregir usando el comando change.
+
+Tenga en cuenta que ce elimina la palabra y entra en el modo Insertar.
+ cc hace lo mismo para toda la lnea.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 3.4: MS CAMBIOS USANDO c
+
+ ** El operador change se utiliza con los mismos movimientos que delete. **
+
+ 1. El operador change funciona de la misma forma que delete. El formato es:
+
+ c [nmero] movimiento
+
+ 2. Los movimientos son tambin los mismos, tales como w (palabra) o
+ $ (fin de la lnea).
+
+ 3. Mueva el cursor a la primera lnea inferior sealada con --->.
+
+ 4. Mueva el cursor al primer error.
+
+ 5. Pulse c$ y escriba el resto de la lnea para que sea como la segunda
+ y pulse <ESC>.
+
+---> El final de esta lnea necesita alguna ayuda para que sea como la segunda.
+---> El final de esta lnea necesita ser corregido usando el comando c$.
+
+NOTA: Puede utilizar el retorno de carro para corregir errores mientras escribe.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIN 3
+
+
+ 1. Para volver a poner o pegar el texto que acaba de ser borrado,
+ escriba p . Esto pega el texto despus del cursor (si se borr una
+ lnea, al pegarla, esta se situar en la lnea debajo del cursor).
+
+ 2. Para reemplazar el carcter bajo el cursor, pulse r y luego el
+ carcter que quiere que est en ese lugar.
+
+ 3. El operador change le permite cambiar desde la posicin del cursor
+ hasta donde el movimiento indicado le lleve. Por ejemplo, pulse ce
+ para cambiar desde el cursor hasta el final de la palabra, o c$
+ para cambiar hasta el final de la lnea.
+
+ 4. El formato para change es:
+
+ c [nmero] movimiento
+
+ Pase ahora a la leccin siguiente.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 4.1: UBICACIN DEL CURSOR Y ESTADO DEL ARCHIVO
+
+ ** Pulse CTRL-G para mostrar su situacin en el fichero y su estado.
+ Pulse G para moverse a una determinada lnea del fichero. **
+
+NOTA: Lea esta leccin entera antes de ejecutar cualquiera de los pasos!!
+
+ 1. Mantenga pulsada la tecla Ctrl y pulse g . Le llamamos a esto CTRL-G.
+ Aparecer un mensaje en la parte inferior de la pgina con el nombre
+ del archivo y la posicin en este. Recuerde el nmero de lnea
+ para el paso 3.
+
+NOTA: Quizs pueda ver la posicin del cursor en la esquina inferior derecha
+ de la pantalla. Esto ocurre cuando la opcin 'ruler' (regla) est
+ habilitada (consulte :help 'ruler' )
+
+ 2. Pulse G para mover el cursor hasta la parte inferior del archivo.
+ Pulse gg para mover el cursor al inicio del archivo.
+
+ 3. Escriba el nmero de la lnea en la que estaba y despus G . Esto
+ le volver a la lnea en la que estaba cuando puls CTRL-G.
+
+ 4. Si se siente seguro en poder hacer esto ejecute los pasos 1 a 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 4.2: EL COMANDO SEARCH (buscar)
+
+ ** Escriba / seguido de una frase para buscar la frase. **
+
+ 1. En modo Normal pulse el carcter / . Fjese que tanto el carcter /
+ como el cursor aparecen en la ltima lnea de la pantalla, lo mismo
+ que el comando : .
+
+ 2. Escriba ahora errroor <INTRO>. Esta es la palabra que quiere buscar.
+
+ 3. Para repetir la bsqueda de la misma frase otra vez, simplemente pulse n .
+ Para buscar la misma frase en la direccin opuesta, pulse N .
+
+ 4. Si quiere buscar una frase en la direccin opuesta (hacia arriba),
+ utilice el comando ? en lugar de / .
+
+ 5. Para regresar al lugar de donde proceda pulse CTRL-O (Mantenga pulsado
+ Ctrl mientras pulsa la letra o). Repita el proceso para regresar ms atrs.
+ CTRL-I va hacia adelante.
+
+---> "errroor" no es la forma correcta de escribir error, errroor es un error.
+
+NOTA: Cuando la bsqueda llega al final del archivo, continuar desde el
+ comienzo, a menos que la opcin 'wrapscan' haya sido desactivada.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 4.3: BSQUEDA PARA COMPROBAR PARNTESIS
+
+ ** Pulse % para encontrar el parntesis correspondiente a ),] o } . **
+
+ 1. Site el cursor en cualquiera de los caracteres (, [ o { en la lnea
+ inferior sealada con --->.
+
+ 2. Pulse ahora el carcter % .
+
+ 3. El cursor se mover a la pareja de cierre del parntesis, corchete
+ o llave correspondiente.
+
+ 4. Pulse % para mover el cursor a la otra pareja del carcter.
+
+ 5. Mueva el cursor a otro (,),[,],{ o } y vea lo que hace % .
+
+---> Esto ( es una lnea de prueba con (, [, ], {, y } en ella. ))
+
+NOTA: Esto es muy til en la deteccin de errores en un programa con
+ parntesis, corchetes o llaves sin pareja.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 4.4: EL COMANDO SUSTITUIR
+
+
+ ** Escriba :s/viejo/nuevo/g para sustituir 'viejo' por 'nuevo'. **
+
+ 1. Mueva el cursor a la lnea inferior sealada con --->.
+
+ 2. Escriba :s/laas/las/ <INTRO> . Tenga en cuenta que este mandato cambia
+ slo la primera aparicin en la lnea de la expresin a cambiar.
+
+ 3. Ahora escriba :/laas/la/g . Al aadir la opcin g esto significa
+ que har la sustitucin global en la lnea, cambiando todas las
+ ocurrencias del trmino "laas" en la lnea.
+
+---> Laas mejores pocas para ver laas flores son laas primaveras.
+
+ 4. Para cambiar cada ocurrencia de la cadena de caracteres entre dos lneas,
+ Escriba :#,#s/viejo/nuevo/g donde #,# son los nmeros de lnea del rango
+ de lneas donde se realizar la sustitucin.
+ Escriba :%s/old/new/g para cambiar cada ocurrencia en todo el
+ archivo.
+ Escriba :%s/old/new/gc para encontrar cada ocurrencia en todo el
+ archivo, pidiendo confirmacin para
+ realizar la sustitucin o no.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIN 4
+
+
+ 1. CTRL-G muestra la posicin del cursor en el fichero y su estado.
+ G mueve el cursor al final del archivo.
+ nmero G mueve el cursor a ese nmero de lnea.
+ gg mueve el cursor a la primera lnea del archivo.
+
+ 2. Escribiendo / seguido de una frase busca la frase hacia ADELANTE.
+ Escribiendo ? seguido de una frase busca la frase hacia ATRS.
+ Despus de una bsqueda pulse n para encontrar la aparicin
+ siguiente en la misma direccin o N para buscar en direccin opuesta.
+
+ 3. Pulsando % cuando el cursor esta sobre (,), [,], { o } localiza
+ la pareja correspondiente.
+
+ 4. Para cambiar viejo en el primer nuevo en una lnea escriba :s/viejo/nuevo
+ Para cambiar todos los viejo por nuevo en una lnea escriba :s/viejo/nuevo/g
+ Para cambiar frases entre dos nmeros de lneas escriba :#,#s/viejo/nuevo/g
+ Para cambiar viejo por nuevo en todo el fichero escriba :%s/viejo/nuevo/g
+ Para pedir confirmacin en cada caso aada 'c' :%s/viejo/nuevo/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 5.1: CMO EJECUTAR UN MANDATO EXTERNO
+
+
+ ** Escriba :! seguido de un comando externo para ejecutar ese comando. **
+
+ 1. Escriba el conocido comando : para situar el cursor al final de la
+ pantalla. Esto le permitir introducir un comando.
+
+ 2. Ahora escriba el carcter ! (signo de admiracin). Esto le permitir
+ ejecutar cualquier mandato del sistema.
+
+ 3. Como ejemplo escriba ls despus del ! y luego pulse <INTRO>. Esto
+ le mostrar una lista de su directorio, igual que si estuviera en el
+ smbolo del sistema. Si ls no funciona utilice :!dir .
+
+NOTA: De esta manera es posible ejecutar cualquier comando externo,
+ tambin incluyendo argumentos.
+
+NOTA: Todos los comando : deben finalizarse pulsando <INTRO>.
+ De ahora en adelante no siempre se mencionar.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 5.2: MS SOBRE GUARDAR FICHEROS
+
+
+ ** Para guardar los cambios hechos en un fichero,
+ escriba :w NOMBRE_DE_FICHERO **
+
+ 1. Escriba :!dir o :!ls para ver una lista de los archivos
+ de su directorio.
+ Ya sabe que debe pulsar <INTRO> despus de ello.
+
+ 2. Elija un nombre de fichero que todava no exista, como TEST.
+
+ 3. Ahora escriba :w TEST (donde TEST es el nombre de fichero elegido).
+
+ 4. Esta accin guarda todo el fichero (Vim Tutor) bajo el nombre TEST.
+ Para comprobarlo escriba :!dir o :!ls de nuevo y vea su directorio.
+
+NOTA: Si saliera de Vim y volviera a entrar de nuevo con vim TEST , el
+ archivo sera una copia exacta del tutorial cuando lo guard.
+
+ 5. Ahora elimine el archivo escribiendo (Windows): :!del TEST
+ o (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 5.3: SELECCIONAR TEXTO PARA GUARDAR
+
+
+ ** Para guardar parte del archivo, escriba v movimiento :w ARCHIVO **
+
+ 1. Mueva el cursor a esta lnea.
+
+ 2. Pulse v y mueva el cursor hasta el quinto elemento inferior. Vea que
+ el texto es resaltado.
+
+ 3. Pulse el carcter : en la parte inferior de la pantalla aparecer
+ :'<,'>
+
+ 4. Pulse w TEST , donde TEST es un nombre de archivo que an no existe.
+ Verifique que ve :'<,'>w TEST antes de pulsar <INTRO>.
+
+ 5. Vim escribir las lneas seleccionadas en el archivo TEST. Utilice
+ :!dir o :!ls para verlo. No lo elimine todava! Lo utilizaremos
+ en la siguiente leccin.
+
+NOTA: Al pulsar v inicia la seleccin visual. Puede mover el cursor para
+ hacer la seleccin ms grande o pequea. Despus puede utilizar un
+ operador para hacer algo con el texto. Por ejemplo, d eliminar
+ el texto seleccionado.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 5.4: RECUPERANDO Y MEZCLANDO FICHEROS
+
+
+ ** Para insertar el contenido de un fichero escriba :r NOMBRE_DEL_FICHERO **
+
+ 1. Site el cursor justo por encima de esta lnea.
+
+NOTA: Despus de ejecutar el paso 2 ver texto de la leccin 5.3. Despus
+ DESCIENDA hasta ver de nuevo esta leccin.
+
+ 2. Ahora recupere el archivo TEST utilizando el comando :r TEST donde
+ TEST es el nombre que ha utilizado.
+ El archivo que ha recuperado se colocar debajo de la lnea donde
+ se encuentra el cursor.
+
+ 3. Para verificar que se ha recuperado el archivo, suba el cursor y
+ compruebe que ahora hay dos copias de la leccin 5.3, la original y
+ la versin del archivo.
+
+NOTA: Tambin puede leer la salida de un comando externo. Por ejemplo,
+ :r !ls lee la salida del comando ls y lo pega debajo de la lnea
+ donde se encuentra el cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIN 5
+
+
+ 1. :!comando ejecuta un comando externo.
+
+ Algunos ejemplos tiles son:
+ (Windows) (Unix)
+ :!dir :!ls - muestra el contenido de un directorio.
+ :!del ARCHIVO :!rm ARCHIVO - borra el fichero ARCHIVO.
+
+ 2. :w ARCHIVO escribe el archivo actual de Vim en el disco con el
+ nombre de ARCHIVO.
+
+ 3. v movimiento :w ARCHIVO guarda las lneas seleccionadas visualmente
+ en el archivo ARCHIVO.
+
+ 4. :r ARCHIVO recupera del disco el archivo ARCHIVO y lo pega debajo
+ de la posicin del cursor.
+
+ 5. :r !dir lee la salida del comando dir y lo pega debajo de la
+ posicin del cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 6.1: EL COMANDO OPEN
+
+
+ ** Pulse o para abrir una lnea debajo del cursor
+ y situarle en modo Insertar **
+
+ 1. Mueva el cursor a la lnea inferior sealada con --->.
+
+ 2. Pulse la letra minscula o para abrir una lnea por DEBAJO del cursor
+ y situarle en modo Insertar.
+
+ 3. Ahora escriba algn texto y despus pulse <ESC> para salir del modo
+ insertar.
+
+---> Despus de pulsar o el cursor se sita en la lnea abierta en modo Insertar.
+
+ 4. Para abrir una lnea por ENCIMA del cursor, simplemente pulse una O
+ mayscula, en lugar de una o minscula. Pruebe esto en la lnea siguiente.
+
+---> Abra una lnea sobre esta pulsando O cuando el cursor est en esta lnea.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 6.2: EL COMANDO APPEND (aadir)
+
+
+ ** Pulse a para insertar texto DESPUS del cursor. **
+
+ 1. Mueva el cursor al inicio de la primera lnea inferior sealada con --->.
+
+ 2. Escriba e hasta que el cursor est al final de ln .
+
+ 3. Escriba una a (minscula) para aadir texto DESPUS del cursor.
+
+ 4. Complete la palabra como en la lnea inferior. Pulse <ESC> para salir
+ del modo insertar.
+
+ 5. Utilice e para moverse hasta la siguiente palabra incompleta y
+ repita los pasos 3 y 4.
+
+---> Esta ln le permit prati cmo aad texto a una lnea.
+---> Esta lnea le permitir practicar cmo aadir texto a una lnea.
+
+NOTA: a, i y A todos entran en el modo Insertar, la nica diferencia es
+ dnde ubican los caracteres insertados.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 6.3: OTRA VERSIN DE REPLACE (remplazar)
+
+
+ ** Pulse una R mayscula para sustituir ms de un carcter. **
+
+ 1. Mueva el cursor a la primera lnea inferior sealada con --->. Mueva
+ el cursor al inicio de la primera xxx .
+
+ 2. Ahora pulse R y escriba el nmero que aparece en la lnea inferior,
+ esto reemplazar el texto xxx .
+
+ 3. Pulse <ESC> para abandonar el modo Reemplazar. Observe que el resto de
+ la lnea permanece sin modificaciones.
+
+ 4. Repita los pasos para reemplazar el texto xxx que queda.
+
+---> Sumar 123 a xxx da un resultado de xxx.
+---> Sumar 123 a 456 da un resultado de 579.
+
+NOTA: El modo Reemplazar es como el modo Insertar, pero cada carcter escrito
+ elimina un carcter ya existente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 6.4: COPIAR Y PEGAR TEXTO
+
+
+
+ ** Utilice el operador y para copiar texto y p para pegarlo. **
+
+ 1. Mueva el cursor a la lnea inferior marcada con ---> y posicione el
+ cursor despus de "a)".
+
+ 2. Inicie el modo Visual con v y mueva el cursor justo antes de "primer".
+
+ 3. Pulse y para copiar ("yank") el texto resaltado.
+
+ 4. Mueva el cursor al final de la siguiente lnea mediante: j$
+
+ 5. Pulse p para poner (pegar) el texto. Despus escriba: el segundo <ESC>.
+
+ 6. Utilice el modo visual para seleccionar " elemento.", y cpielo con y
+ mueva el cursor al final de la siguiente lnea con j$ y pegue el texto
+ recin copiado con p .
+
+---> a) este es el primer elemento.
+ b)
+
+NOTA: Tambin puede utilizar y como un operador: yw copia una palabra,
+ yy copia la lnea completa donde est el cursor, despus p pegar
+ esa lnea.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 6.5: ACTIVAR (SET) UNA OPCIN
+
+
+ ** Active una opcin para buscar o sustituir ignorando si est
+ en maysculas o minsculas el texto. **
+
+ 1. Busque la cadena de texto 'ignorar' escribiendo: /ignorar <INTRO>
+ Repita la bsqueda varias veces pulsando n .
+
+ 2. Active la opcin 'ic' (Ignore case o ignorar maysculas y minsculas)
+ mediante: :set ic
+
+ 3. Ahora busque de nuevo 'ignorar' pulsando n
+ Observe que ahora tambin se encuentran Ignorar e IGNORAR.
+
+ 4. Active las opciones 'hlsearch' y 'incsearch' escribiendo: :set hls is
+
+ 5. Ahora escriba de nuevo el comando de bsqueda y vea qu ocurre: /ignore <INTRO>
+
+ 6. Para inhabilitar el ignorar la distincin de maysculas y minsculas
+ escriba: :set noic
+
+NOTA: Para eliminar el resaltado de las coincidencias escriba: :nohlsearch
+NOTA: Si quiere ignorar las maysculas y minsculas, solo para un comando
+ de bsqueda, utilice \c en la frase: /ignorar\c <INTRO>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIN 6
+
+
+ 1. Escriba o para abrir una lnea por DEBAJO de la posicin del cursor y
+ entrar en modo Insertar.
+ Escriba O para abrir una lnea por ENCIMA de la posicin del cursor y
+ entrar en modo Insertar
+
+ 2. Escriba a para insertar texto DESPUS del cursor.
+ Escriba A para insertar texto al final de la lnea.
+
+ 3. El comando e mueve el cursor al final de una palabra.
+
+ 4. El operador y copia (yank) texto, p lo pega (pone).
+
+ 5. Al escribir una R mayscula entra en el modo Reemplazar hasta que
+ se pulsa <ESC> .
+
+ 6. Al escribir ":set xxx" activa la opcin "xxx". Algunas opciones son:
+ 'ic' 'ignorecase' ignorar maysculas/minsculas al buscar
+ 'is' 'incsearch' mostrar las coincidencias parciales para la bsqueda
+ de una frase
+ 'hls' 'hlsearch' resalta todas las coincidencias de la frases
+ Puedes utilizar tanto los nombre largos o cortos de las opciones.
+
+ 7. Aada "no" para inhabilitar una opcin: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 7: OBTENER AYUDA
+
+
+ ** Utilice el sistema de ayuda en lnea **
+
+ Vim dispone de un sistema de ayuda en lnea. Para comenzar, pruebe una
+ de estas tres formas:
+ - pulse la tecla <AYUDA> (si dispone de ella)
+ - pulse la tecla <F1> (si dispone de ella)
+ - escriba :help <INTRO>
+
+ Lea el texto en la ventana de ayuda para descubrir cmo funciona la ayuda.
+ Escriba CTRL-W CTRL-W para saltar de una ventana a otra.
+ Escriba :q <INTRO> para cerrar la ventana de ayuda.
+
+ Puede encontrar ayuda en casi cualquier tema aadiendo un argumento al
+ comando :help. Pruebe stos (no olvide pulsar <INTRO>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 7.2: CREAR UN SCRIPT DE INICIO
+
+
+ ** Habilitar funcionalidades en Vim **
+
+ Vim tiene muchas ms funcionalidades que Vi, pero algunas estn
+ inhabilitadas de manera predeterminada.
+ Para empezar a utilizar ms funcionalidades debera crear un archivo
+ llamado "vimrc".
+
+ 1. Comience a editar el archivo "vimrc". Esto depende de su sistema:
+ :e ~/.vimrc para Unix
+ :e ~/_vimrc para Windows
+
+ 2. Ahora lea el contenido del archivo "vimrc" de ejemplo:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Guarde el archivo mediante:
+ :w
+
+ La prxima vez que inicie Vim, este usar el resaltado de sintaxis.
+ Puede aadir todos sus ajustes preferidos a este archivo "vimrc".
+ Para ms informacin escriba :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leccin 7.3: COMPLETADO
+
+
+ ** Completado de la lnea de comandos con CTRL-D o <TAB> **
+
+ 1. Asegrese de que Vim no est en el modo compatible: :set nocp
+
+ 2. Vea qu archivos existen en el directorio con: :!ls o :!dir
+
+ 3. Escriba el inicio de un comando: :e
+
+ 4. Pulse CTRL-D y Vim mostrar una lista de comandos que empiezan con "e".
+
+ 5. Aada d<TAB> y Vim completar el nombre del comando a ":edit".
+
+ 6. Ahora aada un espacio y el inicio del nombre de un archivo: :edit FIL
+
+ 7. Pulse <TAB>. Vim completar el nombre (si solo hay uno).
+
+NOTA: El completado funciona con muchos comandos. Solo pulse CTRL-D o
+ <TAB>. Es especialmente til para :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIN 7
+
+
+ 1. Escriba :help o pulse <F1> o <HELP> para abrir la ventana de ayuda.
+
+ 2. Escriba :help cmd para encontrar ayuda sobre cmd .
+
+ 3. Escriba CTRL-W CTRL-W para saltar a otra ventana.
+
+ 4. Escriba :q para cerrar la ventana de ayuda.
+
+ 5. Cree un fichero vimrc de inicio para guardar sus ajustes preferidos.
+
+ 6. Cuando escriba un comando : pulse CTRL-D para ver posibles opciones.
+ Pulse <TAB> para utilizar una de las opciones de completado.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Aqu concluye el tutor de Vim. Est pensado para dar una visin breve del
+ editor Vim, lo suficiente para permitirle usar el editor de forma bastante
+ sencilla. Est muy lejos de estar completo pues Vim tiene muchsimos ms
+ comandos. Lea el siguiente manual de usuario: ":help user-manual".
+
+ Para lecturas y estudios posteriores se recomienda el libro:
+ Vim - Vi Improved - de Steve Oualline
+ Editado por: New Riders
+ El primer libro dedicado completamente a Vim. Especialmente til para
+ recin principiantes.
+ Tiene muchos ejemplos e imgenes.
+ Vea https://iccf-holland.org/click5.html
+
+ Este tutorial ha sido escrito por Michael C. Pierce y Robert K. Ware,
+ Colorado School of Mines utilizando ideas suministradas por Charles Smith,
+ Colorado State University.
+ E-mail: bware@mines.colorado.edu.
+
+ Modificado para Vim por Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Traducido del ingls por:
+
+ * Eduardo F. Amatria
+ Correo electrnico: eferna1@platea.pntic.mec.es
+ * Victorhck
+ Correo electrnico: victorhck@opensuse.org
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.es.utf-8 b/runtime/tutor/tutor.es.utf-8
new file mode 100644
index 0000000..d6187ff
--- /dev/null
+++ b/runtime/tutor/tutor.es.utf-8
@@ -0,0 +1,1026 @@
+===============================================================================
+= B i e n v e n i d o a l t u t o r d e V I M - Versión 1.7 =
+===============================================================================
+
+ Vim es un editor muy potente que dispone de muchos comandos, demasiados
+ para ser explicados en un tutor como éste. Este tutor está diseñado
+ para describir suficientes comandos para que usted sea capaz de
+ aprender fácilmente a usar Vim como un editor de propósito general.
+
+ El tiempo necesario para completar el tutor es aproximadamente de 30
+ minutos, dependiendo de cuánto tiempo se dedique a la experimentación.
+
+ Los comandos de estas lecciones modificarán el texto. Haga una copia de
+ este fichero para practicar (con «vimtutor» esto ya es una copia).
+
+ Es importante recordar que este tutor está pensado para enseñar con
+ la práctica. Esto significa que es necesario ejecutar los comandos
+ para aprenderlos adecuadamente. Si únicamente lee el texto, ¡se le
+ olvidarán los comandos.
+
+ Ahora, asegúrese de que la tecla de bloqueo de mayúsculas NO está
+ activada y pulse la tecla j lo suficiente para mover el cursor
+ de forma que la Lección 1.1 ocupe completamente la pantalla.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 1.1: MOVER EL CURSOR
+
+ ** Para mover el cursor, pulse las teclas h,j,k,l de la forma indicada. **
+ ^
+ k Indicación: La tecla h está a la izquierda y lo mueve a la izquierda.
+ < h l > La tecla l está a la derecha y lo mueve a la derecha.
+ j La tecla j parece una flecha que apunta hacia abajo.
+ v
+
+ 1. Mueva el cursor por la pantalla hasta que se sienta cómodo con ello.
+
+ 2. Mantenga pulsada la tecla (j) hasta que se repita «automágicamente».
+ Ahora ya sabe como llegar a la lección siguiente.
+
+ 3. Utilizando la tecla abajo, vaya a la lección 1.2.
+
+NOTA: Si alguna vez no está seguro sobre algo que ha tecleado, pulse <ESC>
+ para situarse en modo Normal. Luego vuelva a teclear la orden que deseaba.
+
+NOTA: Las teclas de movimiento del cursor también funcionan. Pero usando
+ hjkl podrá moverse mucho más rápido una vez que se acostumbre a ello.
+ ¡De verdad!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 1.2: SALIR DE VIM
+
+ ¡¡ NOTA: Antes de ejecutar alguno de los siguientes pasos lea primero
+ la lección entera!!
+
+ 1. Pulse la tecla <ESC> (para asegurarse de que está en modo Normal).
+
+ 2. Escriba: :q! <INTRO>
+ Esto provoca la salida del editor DESCARTANDO cualquier cambio que haya hecho.
+
+ 3. Regrese aquí ejecutando el comando que le trajo a este tutor.
+ Éste puede haber sido: vimtutor <INTRO>
+
+ 4. Si ha memorizado estos pasos y se siente con confianza, ejecute los
+ pasos 1 a 3 para salir y volver a entrar al editor.
+
+NOTA: :q! <INTRO> descarta cualquier cambio que haya realizado.
+ En próximas lecciones aprenderá cómo guardar los cambios en un archivo.
+
+ 5. Mueva el cursor hasta la Lección 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 1.3: EDITAR TEXTO - BORRAR
+
+ ** Pulse x para eliminar el carácter bajo el cursor. **
+
+ 1. Mueva el cursor a la línea de abajo señalada con --->.
+
+ 2. Para corregir los errores, mueva el cursor hasta que esté sobre el
+ carácter que va a ser borrado.
+
+ 3. Pulse la tecla x para eliminar el carácter no deseado.
+
+ 4. Repita los pasos 2 a 4 hasta que la frase sea la correcta.
+
+---> La vvaca saltóó soobree laa luuuuna.
+
+ 5. Ahora que la línea esta correcta, continúe con la Lección 1.4.
+
+NOTA: A medida que vaya avanzando en este tutor no intente memorizar,
+ aprenda practicando.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 1.4: EDITAR TEXTO - INSERTAR
+
+ ** Pulse i para insertar texto. **
+
+ 1. Mueva el cursor a la primera línea de abajo señalada con --->.
+
+ 2. Para hacer que la primera línea sea igual que la segunda, mueva el
+ cursor hasta que esté sobre el carácter ANTES del cual el texto va a ser
+ insertado.
+
+ 3. Pulse i y escriba los caracteres a añadir.
+
+ 4. A medida que sea corregido cada error pulse <ESC> para volver al modo
+ Normal. Repita los pasos 2 a 4 para corregir la frase.
+
+---> Flta texto en esta .
+---> Falta algo de texto en esta línea.
+
+ 5. Cuando se sienta cómodo insertando texto pase vaya a la lección 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 1.5: EDITAR TEXTO - AÑADIR
+
+
+ ** Pulse A para añadir texto. **
+
+ 1. Mueva el cursor a la primera línea inferior marcada con --->.
+ No importa sobre qué carácter está el cursor en esta línea.
+
+ 2. Pulse A y escriba el texto necesario.
+
+ 3. Cuando el texto haya sido añadido pulse <ESC> para volver al modo Normal.
+
+ 4. Mueva el cursor a la segunda línea marcada con ---> y repita los
+ pasos 2 y 3 para corregir esta frase.
+
+---> Falta algún texto en es
+ Falta algún texto en esta línea.
+---> También falta alg
+ También falta algún texto aquí.
+
+ 5. Cuando se sienta cómodo añadiendo texto pase a la lección 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 1.6: EDITAR UN ARCHIVO
+
+ ** Use :wq para guardar un archivo y salir **
+
+ !! NOTA: Antes de ejecutar los siguientes pasos, lea la lección entera!!
+
+ 1. Si tiene acceso a otra terminal, haga lo siguiente en ella.
+ Si no es así, salga de este tutor como hizo en la lección 1.2: :q!
+
+ 2. En el símbolo del sistema escriba este comando: vim archivo.txt <INTRO>
+ 'vim' es el comando para arrancar el editor Vim, 'archivo.txt'
+ es el nombre del archivo que quiere editar
+ Utilice el nombre de un archivo que pueda cambiar.
+
+ 3. Inserte y elimine texto como ya aprendió en las lecciones anteriores.
+
+ 4. Guarde el archivo con los cambios y salga de Vim con: :wq <INTRO>
+
+ 5. Si ha salido de vimtutor en el paso 1 reinicie vimtutor y baje hasta
+ el siguiente sumario.
+
+ 6. Después de leer los pasos anteriores y haberlos entendido: hágalos.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIÓN 1
+
+
+ 1. El cursor se mueve utilizando las teclas de las flechas o las teclas hjkl.
+ h (izquierda) j (abajo) k (arriba) l (derecha)
+
+ 2. Para acceder a Vim desde el símbolo del sistema escriba:
+ vim NOMBREARCHIVO <INTRO>
+
+ 3. Para salir de Vim escriba: <ESC> :q! <INTRO> para eliminar todos
+ los cambios.
+ O escriba: <ESC> :wq <INTRO> para guardar los cambios.
+
+ 4. Para borrar un carácter bajo el cursor en modo Normal pulse: x
+
+ 5. Para insertar o añadir texto escriba:
+ i escriba el texto a insertar <ESC> inserta el texto antes del cursor
+ A escriba el texto a añadir <ESC> añade texto al final de la línea
+
+NOTA: Pulsando <ESC> se vuelve al modo Normal o cancela una orden no deseada
+ o incompleta.
+
+Ahora continúe con la Lección 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 2.1: COMANDOS PARA BORRAR
+
+
+ ** Escriba dw para borrar una palabra **
+
+
+ 1. Pulse <ESC> para asegurarse de que está en el modo Normal.
+
+ 2. Mueva el cursor a la línea inferior señalada con --->.
+
+ 3. Mueva el cursor al comienzo de una palabra que desee borrar.
+
+ 4. Pulse dw para hacer que la palabra desaparezca.
+
+ NOTA: La letra d aparecerá en la última línea inferior derecha
+ de la pantalla mientras la escribe. Vim está esperando que escriba w .
+ Si ve otro carácter que no sea d escribió algo mal, pulse <ESC> y
+ comience de nuevo.
+
+---> Hay algunas palabras pásalo bien que no pertenecen papel a esta frase.
+
+ 5. Repita los pasos 3 y 4 hasta que la frase sea correcta y pase a la
+ lección 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 2.2: MÁS COMANDOS PARA BORRAR
+
+
+ ** Escriba d$ para borrar hasta el final de la línea. **
+
+ 1. Pulse <ESC> para asegurarse de que está en el modo Normal.
+
+ 2. Mueva el cursor a la línea inferior señalada con --->.
+
+ 3. Mueva el cursor al final de la línea correcta (DESPUÉS del primer . ).
+
+ 4. Escriba d$ para borrar hasta el final de la línea.
+
+---> Alguien ha escrito el final de esta línea dos veces. esta línea dos veces.
+
+ 5. Pase a la lección 2.3 para entender qué está pasando.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 2.3: SOBRE OPERADORES Y MOVIMIENTOS
+
+
+ Muchos comandos que cambian texto están compuestos por un operador y un
+ movimiento.
+ El formato para eliminar un comando con el operador de borrado d es el
+ siguiente:
+
+ d movimiento
+
+ Donde:
+ d - es el operador para borrar.
+ movimiento - es sobre lo que el comando va a operar (lista inferior).
+
+ Una lista resumida de movimientos:
+ w - hasta el comienzo de la siguiente palabra, EXCLUYENDO su primer
+ carácter.
+ e - hasta el final de la palabra actual, INCLUYENDO el último carácter.
+ $ - hasta el final de la línea, INCLUYENDO el último carácter.
+
+ Por tanto, al escribir de borrará desde la posición del cursor, hasta
+ el final de la palabra.
+
+NOTA: Pulsando únicamente el movimiento estando en el modo Normal sin un
+ operador, moverá el cursor como se especifica en la lista anterior.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 2.4: UTILIZAR UN CONTADOR PARA UN MOVIMIENTO
+
+
+ ** Al escribir un número antes de un movimiento, lo repite esas veces. **
+
+ 1. Mueva el cursor al comienzo de la línea marcada con --->.
+
+ 2. Escriba 2w para mover el cursor dos palabras hacia adelante.
+
+ 3. Escriba 3e para mover el cursor al final de la tercera palabra hacia
+ adelante.
+
+ 4. Escriba 0 (cero) para colocar el cursor al inicio de la línea.
+
+ 5. Repita el paso 2 y 3 con diferentes números.
+
+---> Esto es solo una línea con palabras donde poder moverse.
+
+ 6. Pase a la lección 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 2.5: UTILIZAR UN CONTADOR PARA BORRAR MAS
+
+
+ ** Al escribir un número con un operador lo repite esas veces. **
+
+ En combinación con el operador de borrado y el movimiento mencionado
+ anteriormente, añada un contador antes del movimiento para eliminar más:
+ d número movimiento
+
+ 1. Mueva el cursor al inicio de la primera palabra en MAYÚSCULAS en la
+ línea marcada con --->.
+
+ 2. Escriba d2w para eliminar las dos palabras en MAYÚSCULAS.
+
+ 3. Repita los pasos 1 y 2 con diferentes contadores para eliminar
+ las siguientes palabras en MAYÚSCULAS con un comando.
+
+---> Esta ABC DE serie FGHI JK LMN OP de palabras ha sido Q RS TUV limpiada.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 2.6: OPERACIÓN EN LÍNEAS
+
+
+ ** Escriba dd para eliminar una línea completa. **
+
+ Debido a la frecuencia con que se elimina una línea completa, los
+ diseñadores de Vi, decidieron que sería más sencillo simplemente escribir
+ dos letras d para eliminar una línea.
+
+ 1. Mueva el cursor a la segunda línea del párrafo inferior.
+ 2. Escriba dd para eliminar la línea.
+ 3. Ahora muévase a la cuarta línea.
+ 4. Escriba 2dd para eliminar dos líneas a la vez.
+
+---> 1) Las rosas son rojas,
+---> 2) El barro es divertido,
+---> 3) La violeta es azul,
+---> 4) Tengo un coche,
+---> 5) Los relojes dan la hora,
+---> 6) El azúcar es dulce
+---> 7) Y también lo eres tú.
+
+La duplicación para borrar líneas también funcionan con los operadores
+mencionados anteriormente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 2.7: EL MANDATO DESHACER
+
+
+ ** Pulse u para deshacer los últimos comandos,
+ U para deshacer una línea entera. **
+
+ 1. Mueva el cursor a la línea inferior señalada con ---> y sitúelo bajo el
+ primer error.
+ 2. Pulse x para borrar el primer carácter no deseado.
+ 3. Pulse ahora u para deshacer el último comando ejecutado.
+ 4. Ahora corrija todos los errores de la línea usando el comando x.
+ 5. Pulse ahora U mayúscula para devolver la línea a su estado original.
+ 6. Pulse ahora u unas pocas veces para deshacer lo hecho por U y los
+ comandos previos.
+ 7. Ahora pulse CTRL-R (mantenga pulsada la tecla CTRL y pulse R) unas
+ cuantas veces para volver a ejecutar los comandos (deshacer lo deshecho).
+
+---> Corrrija los errores dee esttta línea y vuuelva a ponerlos coon deshacer.
+
+ 8. Estos son unos comandos muy útiles. Ahora vayamos al resumen de la
+ lección 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIÓN 2
+
+ 1. Para borrar desde el cursor hasta siguiente palabra pulse: dw
+ 2. Para borrar desde el cursor hasta el final de la palabra pulse: de
+ 3. Para borrar desde el cursor hasta el final de una línea pulse: d$
+ 4. Para borrar una línea entera pulse: dd
+
+ 5. Para repetir un movimiento anteponga un número: 2w
+ 6. El formato para un comando de cambio es:
+ operador [número] movimiento
+ donde:
+ comando - es lo que hay que hacer, por ejemplo, d para borrar
+ [número] - es un número opcional para repetir el movimiento
+ movimiento - se mueve sobre el texto sobre el que operar, como
+ w (palabra), $ (hasta el final de la línea), etc.
+ 7. Para moverse al inicio de la línea utilice un cero: 0
+
+ 8. Para deshacer acciones previas pulse: u (u minúscula)
+ Para deshacer todos los cambios de una línea pulse: U (U mayúscula)
+ Para deshacer lo deshecho pulse: CTRL-R
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 3.1: EL COMANDO «PUT» (poner)
+
+** Pulse p para poner (pegar) después del cursor lo último que ha borrado. **
+
+ 1. Mueva el cursor a la primera línea inferior marcada con --->.
+
+ 2. Escriba dd para borrar la línea y almacenarla en un registro de Vim.
+
+ 3. Mueva el cursor a la línea c) por ENCIMA de donde debería estar
+ la línea eliminada.
+
+ 4. Pulse p para pegar la línea borrada por debajo del cursor.
+
+ 5. Repita los pasos 2 a 4 para poner todas las líneas en el orden correcto.
+
+---> d) ¿Puedes aprenderla tú?
+---> b) La violeta es azul,
+---> c) La inteligencia se aprende,
+---> a) Las rosas son rojas,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 3.2: EL COMANDO REEMPLAZAR
+
+
+ ** Pulse rx para reemplazar el carácter bajo el cursor con x . **
+
+ 1. Mueva el cursor a la primera línea inferior marcada con --->.
+
+ 2. Mueva el cursor para situarlo sobre el primer error.
+
+ 3. Pulse r y después el carácter que debería ir ahí.
+
+ 4. Repita los pasos 2 y 3 hasta que la primera sea igual a la segunda.
+
+---> ¡Cuendo esta línea fue rscrita alguien pulso algunas teclas equibocadas!
+---> ¡Cuando esta línea fue escrita alguien pulsó algunas teclas equivocadas!
+
+ 5. Ahora pase a la lección 3.3.
+
+NOTA: Recuerde que debería aprender practicando.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 3.3: EL COMANDO CAMBIAR
+
+
+ ** Para cambiar hasta el final de una palabra, escriba ce . **
+
+ 1. Mueva el cursor a la primera línea inferior marcada con --->.
+
+ 2. Sitúe el cursor en la u de lubrs.
+
+ 3. Escriba ce y corrija la palabra (en este caso, escriba 'ínea').
+
+ 4. Pulse <ESC> y mueva el cursor al siguiente error que debe ser cambiado.
+
+ 5. Repita los pasos 3 y 4 hasta que la primera frase sea igual a la segunda.
+
+---> Esta lubrs tiene unas pocas pskavtad que corregir usem el comando change.
+---> Esta línea tiene unas pocas palabras que corregir usando el comando change.
+
+Tenga en cuenta que ce elimina la palabra y entra en el modo Insertar.
+ cc hace lo mismo para toda la línea.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 3.4: MÁS CAMBIOS USANDO c
+
+ ** El operador change se utiliza con los mismos movimientos que delete. **
+
+ 1. El operador change funciona de la misma forma que delete. El formato es:
+
+ c [número] movimiento
+
+ 2. Los movimientos son también los mismos, tales como w (palabra) o
+ $ (fin de la línea).
+
+ 3. Mueva el cursor a la primera línea inferior señalada con --->.
+
+ 4. Mueva el cursor al primer error.
+
+ 5. Pulse c$ y escriba el resto de la línea para que sea como la segunda
+ y pulse <ESC>.
+
+---> El final de esta línea necesita alguna ayuda para que sea como la segunda.
+---> El final de esta línea necesita ser corregido usando el comando c$.
+
+NOTA: Puede utilizar el retorno de carro para corregir errores mientras escribe.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIÓN 3
+
+
+ 1. Para volver a poner o pegar el texto que acaba de ser borrado,
+ escriba p . Esto pega el texto después del cursor (si se borró una
+ línea, al pegarla, esta se situará en la línea debajo del cursor).
+
+ 2. Para reemplazar el carácter bajo el cursor, pulse r y luego el
+ carácter que quiere que esté en ese lugar.
+
+ 3. El operador change le permite cambiar desde la posición del cursor
+ hasta donde el movimiento indicado le lleve. Por ejemplo, pulse ce
+ para cambiar desde el cursor hasta el final de la palabra, o c$
+ para cambiar hasta el final de la línea.
+
+ 4. El formato para change es:
+
+ c [número] movimiento
+
+ Pase ahora a la lección siguiente.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 4.1: UBICACIÓN DEL CURSOR Y ESTADO DEL ARCHIVO
+
+ ** Pulse CTRL-G para mostrar su situación en el fichero y su estado.
+ Pulse G para moverse a una determinada línea del fichero. **
+
+NOTA: ¡¡Lea esta lección entera antes de ejecutar cualquiera de los pasos!!
+
+ 1. Mantenga pulsada la tecla Ctrl y pulse g . Le llamamos a esto CTRL-G.
+ Aparecerá un mensaje en la parte inferior de la página con el nombre
+ del archivo y la posición en este. Recuerde el número de línea
+ para el paso 3.
+
+NOTA: Quizás pueda ver la posición del cursor en la esquina inferior derecha
+ de la pantalla. Esto ocurre cuando la opción 'ruler' (regla) está
+ habilitada (consulte :help 'ruler' )
+
+ 2. Pulse G para mover el cursor hasta la parte inferior del archivo.
+ Pulse gg para mover el cursor al inicio del archivo.
+
+ 3. Escriba el número de la línea en la que estaba y después G . Esto
+ le volverá a la línea en la que estaba cuando pulsó CTRL-G.
+
+ 4. Si se siente seguro en poder hacer esto ejecute los pasos 1 a 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 4.2: EL COMANDO «SEARCH» (buscar)
+
+ ** Escriba / seguido de una frase para buscar la frase. **
+
+ 1. En modo Normal pulse el carácter / . Fíjese que tanto el carácter /
+ como el cursor aparecen en la última línea de la pantalla, lo mismo
+ que el comando : .
+
+ 2. Escriba ahora errroor <INTRO>. Esta es la palabra que quiere buscar.
+
+ 3. Para repetir la búsqueda de la misma frase otra vez, simplemente pulse n .
+ Para buscar la misma frase en la dirección opuesta, pulse N .
+
+ 4. Si quiere buscar una frase en la dirección opuesta (hacia arriba),
+ utilice el comando ? en lugar de / .
+
+ 5. Para regresar al lugar de donde procedía pulse CTRL-O (Mantenga pulsado
+ Ctrl mientras pulsa la letra o). Repita el proceso para regresar más atrás.
+ CTRL-I va hacia adelante.
+
+---> "errroor" no es la forma correcta de escribir error, errroor es un error.
+
+NOTA: Cuando la búsqueda llega al final del archivo, continuará desde el
+ comienzo, a menos que la opción 'wrapscan' haya sido desactivada.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 4.3: BÚSQUEDA PARA COMPROBAR PARÉNTESIS
+
+ ** Pulse % para encontrar el paréntesis correspondiente a ),] o } . **
+
+ 1. Sitúe el cursor en cualquiera de los caracteres (, [ o { en la línea
+ inferior señalada con --->.
+
+ 2. Pulse ahora el carácter % .
+
+ 3. El cursor se moverá a la pareja de cierre del paréntesis, corchete
+ o llave correspondiente.
+
+ 4. Pulse % para mover el cursor a la otra pareja del carácter.
+
+ 5. Mueva el cursor a otro (,),[,],{ o } y vea lo que hace % .
+
+---> Esto ( es una línea de prueba con (, [, ], {, y } en ella. ))
+
+NOTA: ¡Esto es muy útil en la detección de errores en un programa con
+ paréntesis, corchetes o llaves sin pareja.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 4.4: EL COMANDO SUSTITUIR
+
+
+ ** Escriba :s/viejo/nuevo/g para sustituir 'viejo' por 'nuevo'. **
+
+ 1. Mueva el cursor a la línea inferior señalada con --->.
+
+ 2. Escriba :s/laas/las/ <INTRO> . Tenga en cuenta que este mandato cambia
+ sólo la primera aparición en la línea de la expresión a cambiar.
+
+ 3. Ahora escriba :/laas/la/g . Al añadir la opción g esto significa
+ que hará la sustitución global en la línea, cambiando todas las
+ ocurrencias del término "laas" en la línea.
+
+---> Laas mejores épocas para ver laas flores son laas primaveras.
+
+ 4. Para cambiar cada ocurrencia de la cadena de caracteres entre dos líneas,
+ Escriba :#,#s/viejo/nuevo/g donde #,# son los números de línea del rango
+ de líneas donde se realizará la sustitución.
+ Escriba :%s/old/new/g para cambiar cada ocurrencia en todo el
+ archivo.
+ Escriba :%s/old/new/gc para encontrar cada ocurrencia en todo el
+ archivo, pidiendo confirmación para
+ realizar la sustitución o no.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIÓN 4
+
+
+ 1. CTRL-G muestra la posición del cursor en el fichero y su estado.
+ G mueve el cursor al final del archivo.
+ número G mueve el cursor a ese número de línea.
+ gg mueve el cursor a la primera línea del archivo.
+
+ 2. Escribiendo / seguido de una frase busca la frase hacia ADELANTE.
+ Escribiendo ? seguido de una frase busca la frase hacia ATRÁS.
+ Después de una búsqueda pulse n para encontrar la aparición
+ siguiente en la misma dirección o N para buscar en dirección opuesta.
+
+ 3. Pulsando % cuando el cursor esta sobre (,), [,], { o } localiza
+ la pareja correspondiente.
+
+ 4. Para cambiar viejo en el primer nuevo en una línea escriba :s/viejo/nuevo
+ Para cambiar todos los viejo por nuevo en una línea escriba :s/viejo/nuevo/g
+ Para cambiar frases entre dos números de líneas escriba :#,#s/viejo/nuevo/g
+ Para cambiar viejo por nuevo en todo el fichero escriba :%s/viejo/nuevo/g
+ Para pedir confirmación en cada caso añada 'c' :%s/viejo/nuevo/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 5.1: CÓMO EJECUTAR UN MANDATO EXTERNO
+
+
+ ** Escriba :! seguido de un comando externo para ejecutar ese comando. **
+
+ 1. Escriba el conocido comando : para situar el cursor al final de la
+ pantalla. Esto le permitirá introducir un comando.
+
+ 2. Ahora escriba el carácter ! (signo de admiración). Esto le permitirá
+ ejecutar cualquier mandato del sistema.
+
+ 3. Como ejemplo escriba ls después del ! y luego pulse <INTRO>. Esto
+ le mostrará una lista de su directorio, igual que si estuviera en el
+ símbolo del sistema. Si ls no funciona utilice :!dir .
+
+NOTA: De esta manera es posible ejecutar cualquier comando externo,
+ también incluyendo argumentos.
+
+NOTA: Todos los comando : deben finalizarse pulsando <INTRO>.
+ De ahora en adelante no siempre se mencionará.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 5.2: MÁS SOBRE GUARDAR FICHEROS
+
+
+ ** Para guardar los cambios hechos en un fichero,
+ escriba :w NOMBRE_DE_FICHERO **
+
+ 1. Escriba :!dir o :!ls para ver una lista de los archivos
+ de su directorio.
+ Ya sabe que debe pulsar <INTRO> después de ello.
+
+ 2. Elija un nombre de fichero que todavía no exista, como TEST.
+
+ 3. Ahora escriba :w TEST (donde TEST es el nombre de fichero elegido).
+
+ 4. Esta acción guarda todo el fichero (Vim Tutor) bajo el nombre TEST.
+ Para comprobarlo escriba :!dir o :!ls de nuevo y vea su directorio.
+
+NOTA: Si saliera de Vim y volviera a entrar de nuevo con vim TEST , el
+ archivo sería una copia exacta del tutorial cuando lo guardó.
+
+ 5. Ahora elimine el archivo escribiendo (Windows): :!del TEST
+ o (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 5.3: SELECCIONAR TEXTO PARA GUARDAR
+
+
+ ** Para guardar parte del archivo, escriba v movimiento :w ARCHIVO **
+
+ 1. Mueva el cursor a esta línea.
+
+ 2. Pulse v y mueva el cursor hasta el quinto elemento inferior. Vea que
+ el texto es resaltado.
+
+ 3. Pulse el carácter : en la parte inferior de la pantalla aparecerá
+ :'<,'>
+
+ 4. Pulse w TEST , donde TEST es un nombre de archivo que aún no existe.
+ Verifique que ve :'<,'>w TEST antes de pulsar <INTRO>.
+
+ 5. Vim escribirá las líneas seleccionadas en el archivo TEST. Utilice
+ :!dir o :!ls para verlo. ¡No lo elimine todavía! Lo utilizaremos
+ en la siguiente lección.
+
+NOTA: Al pulsar v inicia la selección visual. Puede mover el cursor para
+ hacer la selección más grande o pequeña. Después puede utilizar un
+ operador para hacer algo con el texto. Por ejemplo, d eliminará
+ el texto seleccionado.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 5.4: RECUPERANDO Y MEZCLANDO FICHEROS
+
+
+ ** Para insertar el contenido de un fichero escriba :r NOMBRE_DEL_FICHERO **
+
+ 1. Sitúe el cursor justo por encima de esta línea.
+
+NOTA: Después de ejecutar el paso 2 verá texto de la lección 5.3. Después
+ DESCIENDA hasta ver de nuevo esta lección.
+
+ 2. Ahora recupere el archivo TEST utilizando el comando :r TEST donde
+ TEST es el nombre que ha utilizado.
+ El archivo que ha recuperado se colocará debajo de la línea donde
+ se encuentra el cursor.
+
+ 3. Para verificar que se ha recuperado el archivo, suba el cursor y
+ compruebe que ahora hay dos copias de la lección 5.3, la original y
+ la versión del archivo.
+
+NOTA: También puede leer la salida de un comando externo. Por ejemplo,
+ :r !ls lee la salida del comando ls y lo pega debajo de la línea
+ donde se encuentra el cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIÓN 5
+
+
+ 1. :!comando ejecuta un comando externo.
+
+ Algunos ejemplos útiles son:
+ (Windows) (Unix)
+ :!dir :!ls - muestra el contenido de un directorio.
+ :!del ARCHIVO :!rm ARCHIVO - borra el fichero ARCHIVO.
+
+ 2. :w ARCHIVO escribe el archivo actual de Vim en el disco con el
+ nombre de ARCHIVO.
+
+ 3. v movimiento :w ARCHIVO guarda las líneas seleccionadas visualmente
+ en el archivo ARCHIVO.
+
+ 4. :r ARCHIVO recupera del disco el archivo ARCHIVO y lo pega debajo
+ de la posición del cursor.
+
+ 5. :r !dir lee la salida del comando dir y lo pega debajo de la
+ posición del cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 6.1: EL COMANDO OPEN
+
+
+ ** Pulse o para abrir una línea debajo del cursor
+ y situarle en modo Insertar **
+
+ 1. Mueva el cursor a la línea inferior señalada con --->.
+
+ 2. Pulse la letra minúscula o para abrir una línea por DEBAJO del cursor
+ y situarle en modo Insertar.
+
+ 3. Ahora escriba algún texto y después pulse <ESC> para salir del modo
+ insertar.
+
+---> Después de pulsar o el cursor se sitúa en la línea abierta en modo Insertar.
+
+ 4. Para abrir una línea por ENCIMA del cursor, simplemente pulse una O
+ mayúscula, en lugar de una o minúscula. Pruebe esto en la línea siguiente.
+
+---> Abra una línea sobre esta pulsando O cuando el cursor está en esta línea.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 6.2: EL COMANDO APPEND (añadir)
+
+
+ ** Pulse a para insertar texto DESPUÉS del cursor. **
+
+ 1. Mueva el cursor al inicio de la primera línea inferior señalada con --->.
+
+ 2. Escriba e hasta que el cursor esté al final de lín .
+
+ 3. Escriba una a (minúscula) para añadir texto DESPUÉS del cursor.
+
+ 4. Complete la palabra como en la línea inferior. Pulse <ESC> para salir
+ del modo insertar.
+
+ 5. Utilice e para moverse hasta la siguiente palabra incompleta y
+ repita los pasos 3 y 4.
+
+---> Esta lín le permit prati cómo añad texto a una línea.
+---> Esta línea le permitirá practicar cómo añadir texto a una línea.
+
+NOTA: a, i y A todos entran en el modo Insertar, la única diferencia es
+ dónde ubican los caracteres insertados.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 6.3: OTRA VERSIÓN DE REPLACE (remplazar)
+
+
+ ** Pulse una R mayúscula para sustituir más de un carácter. **
+
+ 1. Mueva el cursor a la primera línea inferior señalada con --->. Mueva
+ el cursor al inicio de la primera xxx .
+
+ 2. Ahora pulse R y escriba el número que aparece en la línea inferior,
+ esto reemplazará el texto xxx .
+
+ 3. Pulse <ESC> para abandonar el modo Reemplazar. Observe que el resto de
+ la línea permanece sin modificaciones.
+
+ 4. Repita los pasos para reemplazar el texto xxx que queda.
+
+---> Sumar 123 a xxx da un resultado de xxx.
+---> Sumar 123 a 456 da un resultado de 579.
+
+NOTA: El modo Reemplazar es como el modo Insertar, pero cada carácter escrito
+ elimina un carácter ya existente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 6.4: COPIAR Y PEGAR TEXTO
+
+
+
+ ** Utilice el operador y para copiar texto y p para pegarlo. **
+
+ 1. Mueva el cursor a la línea inferior marcada con ---> y posicione el
+ cursor después de "a)".
+
+ 2. Inicie el modo Visual con v y mueva el cursor justo antes de "primer".
+
+ 3. Pulse y para copiar ("yank") el texto resaltado.
+
+ 4. Mueva el cursor al final de la siguiente línea mediante: j$
+
+ 5. Pulse p para poner (pegar) el texto. Después escriba: el segundo <ESC>.
+
+ 6. Utilice el modo visual para seleccionar " elemento.", y cópielo con y
+ mueva el cursor al final de la siguiente línea con j$ y pegue el texto
+ recién copiado con p .
+
+---> a) este es el primer elemento.
+ b)
+
+NOTA: También puede utilizar y como un operador: yw copia una palabra,
+ yy copia la línea completa donde está el cursor, después p pegará
+ esa línea.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 6.5: ACTIVAR (SET) UNA OPCIÓN
+
+
+ ** Active una opción para buscar o sustituir ignorando si está
+ en mayúsculas o minúsculas el texto. **
+
+ 1. Busque la cadena de texto 'ignorar' escribiendo: /ignorar <INTRO>
+ Repita la búsqueda varias veces pulsando n .
+
+ 2. Active la opción 'ic' (Ignore case o ignorar mayúsculas y minúsculas)
+ mediante: :set ic
+
+ 3. Ahora busque de nuevo 'ignorar' pulsando n
+ Observe que ahora también se encuentran Ignorar e IGNORAR.
+
+ 4. Active las opciones 'hlsearch' y 'incsearch' escribiendo: :set hls is
+
+ 5. Ahora escriba de nuevo el comando de búsqueda y vea qué ocurre: /ignore <INTRO>
+
+ 6. Para inhabilitar el ignorar la distinción de mayúsculas y minúsculas
+ escriba: :set noic
+
+NOTA: Para eliminar el resaltado de las coincidencias escriba: :nohlsearch
+NOTA: Si quiere ignorar las mayúsculas y minúsculas, solo para un comando
+ de búsqueda, utilice \c en la frase: /ignorar\c <INTRO>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIÓN 6
+
+
+ 1. Escriba o para abrir una línea por DEBAJO de la posición del cursor y
+ entrar en modo Insertar.
+ Escriba O para abrir una línea por ENCIMA de la posición del cursor y
+ entrar en modo Insertar
+
+ 2. Escriba a para insertar texto DESPUÉS del cursor.
+ Escriba A para insertar texto al final de la línea.
+
+ 3. El comando e mueve el cursor al final de una palabra.
+
+ 4. El operador y copia (yank) texto, p lo pega (pone).
+
+ 5. Al escribir una R mayúscula entra en el modo Reemplazar hasta que
+ se pulsa <ESC> .
+
+ 6. Al escribir ":set xxx" activa la opción "xxx". Algunas opciones son:
+ 'ic' 'ignorecase' ignorar mayúsculas/minúsculas al buscar
+ 'is' 'incsearch' mostrar las coincidencias parciales para la búsqueda
+ de una frase
+ 'hls' 'hlsearch' resalta todas las coincidencias de la frases
+ Puedes utilizar tanto los nombre largos o cortos de las opciones.
+
+ 7. Añada "no" para inhabilitar una opción: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 7: OBTENER AYUDA
+
+
+ ** Utilice el sistema de ayuda en línea **
+
+ Vim dispone de un sistema de ayuda en línea. Para comenzar, pruebe una
+ de estas tres formas:
+ - pulse la tecla <AYUDA> (si dispone de ella)
+ - pulse la tecla <F1> (si dispone de ella)
+ - escriba :help <INTRO>
+
+ Lea el texto en la ventana de ayuda para descubrir cómo funciona la ayuda.
+ Escriba CTRL-W CTRL-W para saltar de una ventana a otra.
+ Escriba :q <INTRO> para cerrar la ventana de ayuda.
+
+ Puede encontrar ayuda en casi cualquier tema añadiendo un argumento al
+ comando «:help». Pruebe éstos (no olvide pulsar <INTRO>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 7.2: CREAR UN SCRIPT DE INICIO
+
+
+ ** Habilitar funcionalidades en Vim **
+
+ Vim tiene muchas más funcionalidades que Vi, pero algunas están
+ inhabilitadas de manera predeterminada.
+ Para empezar a utilizar más funcionalidades debería crear un archivo
+ llamado "vimrc".
+
+ 1. Comience a editar el archivo "vimrc". Esto depende de su sistema:
+ :e ~/.vimrc para Unix
+ :e ~/_vimrc para Windows
+
+ 2. Ahora lea el contenido del archivo "vimrc" de ejemplo:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Guarde el archivo mediante:
+ :w
+
+ La próxima vez que inicie Vim, este usará el resaltado de sintaxis.
+ Puede añadir todos sus ajustes preferidos a este archivo "vimrc".
+ Para más información escriba :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lección 7.3: COMPLETADO
+
+
+ ** Completado de la línea de comandos con CTRL-D o <TAB> **
+
+ 1. Asegúrese de que Vim no está en el modo compatible: :set nocp
+
+ 2. Vea qué archivos existen en el directorio con: :!ls o :!dir
+
+ 3. Escriba el inicio de un comando: :e
+
+ 4. Pulse CTRL-D y Vim mostrará una lista de comandos que empiezan con "e".
+
+ 5. Añada d<TAB> y Vim completará el nombre del comando a ":edit".
+
+ 6. Ahora añada un espacio y el inicio del nombre de un archivo: :edit FIL
+
+ 7. Pulse <TAB>. Vim completará el nombre (si solo hay uno).
+
+NOTA: El completado funciona con muchos comandos. Solo pulse CTRL-D o
+ <TAB>. Es especialmente útil para :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMEN DE LA LECCIÓN 7
+
+
+ 1. Escriba :help o pulse <F1> o <HELP> para abrir la ventana de ayuda.
+
+ 2. Escriba :help cmd para encontrar ayuda sobre cmd .
+
+ 3. Escriba CTRL-W CTRL-W para saltar a otra ventana.
+
+ 4. Escriba :q para cerrar la ventana de ayuda.
+
+ 5. Cree un fichero vimrc de inicio para guardar sus ajustes preferidos.
+
+ 6. Cuando escriba un comando : pulse CTRL-D para ver posibles opciones.
+ Pulse <TAB> para utilizar una de las opciones de completado.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Aquí concluye el tutor de Vim. Está pensado para dar una visión breve del
+ editor Vim, lo suficiente para permitirle usar el editor de forma bastante
+ sencilla. Está muy lejos de estar completo pues Vim tiene muchísimos más
+ comandos. Lea el siguiente manual de usuario: ":help user-manual".
+
+ Para lecturas y estudios posteriores se recomienda el libro:
+ Vim - Vi Improved - de Steve Oualline
+ Editado por: New Riders
+ El primer libro dedicado completamente a Vim. Especialmente útil para
+ recién principiantes.
+ Tiene muchos ejemplos e imágenes.
+ Vea https://iccf-holland.org/click5.html
+
+ Este tutorial ha sido escrito por Michael C. Pierce y Robert K. Ware,
+ Colorado School of Mines utilizando ideas suministradas por Charles Smith,
+ Colorado State University.
+ E-mail: bware@mines.colorado.edu.
+
+ Modificado para Vim por Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Traducido del inglés por:
+
+ * Eduardo F. Amatria
+ Correo electrónico: eferna1@platea.pntic.mec.es
+ * Victorhck
+ Correo electrónico: victorhck@opensuse.org
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.fr b/runtime/tutor/tutor.fr
new file mode 100644
index 0000000..35f7440
--- /dev/null
+++ b/runtime/tutor/tutor.fr
@@ -0,0 +1,1038 @@
+===============================================================================
+= B i e n v e n u e dans l e T u t o r i e l de V I M - Version 1.7 =
+===============================================================================
+
+ Vim est un diteur trs puissant qui a trop de commandes pour pouvoir
+ toutes les expliquer dans un cours comme celui-ci, qui est conu pour en
+ dcrire suffisamment afin de vous permettre d'utiliser simplement Vim.
+
+ Le temps requis pour suivre ce cours est d'environ 25 30 minutes, selon
+ le temps que vous passerez exprimenter.
+
+ ATTENTION :
+ Les commandes utilises dans les leons modifieront le texte. Faites une
+ copie de ce fichier afin de vous entraner dessus (si vous avez lanc
+ "vimtutor" ceci est dj une copie).
+
+ Il est important de garder en tte que ce cours est conu pour apprendre
+ par la pratique. Cela signifie que vous devez excuter les commandes
+ pour les apprendre correctement. Si vous vous contentez de lire le texte,
+ vous oublierez les commandes !
+
+ Maintenant, vrifiez que votre clavier n'est PAS verrouill en
+ majuscules, et appuyez la touche j le nombre de fois suffisant pour
+ que la Leon 1.1 remplisse compltement l'cran.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 1.1 : DPLACEMENT DU CURSEUR
+
+
+ ** Pour dplacer le curseur, appuyez les touches h,j,k,l comme indiqu. **
+ ^
+ k Astuce : La touche h est gauche et dplace gauche.
+ < h l > La touche l est droite et dplace droite.
+ j La touche j ressemble une flche vers le bas.
+ v
+ 1. Dplacez le curseur sur l'cran jusqu' vous sentir l'aise.
+
+ 2. Maintenez la touche Bas (j) enfonce jusqu' ce qu'elle se rpte.
+ Maintenant vous tes capable de vous dplacer jusqu' la leon suivante.
+
+ 3. En utilisant la touche Bas, allez la Leon 1.2.
+
+NOTE : Si jamais vous doutez de ce que vous venez de taper, appuyez <chap>
+ pour revenir en mode Normal. Puis retapez la commande que vous vouliez.
+
+NOTE : Les touches flches devraient galement fonctionner. Mais en utilisant
+ hjkl vous pourrez vous dplacer beaucoup plus rapidement, une fois que
+ vous aurez pris l'habitude.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 1.2 : SORTIR DE VIM
+
+
+ !! NOTE : Avant d'effectuer les tapes ci-dessous, lisez toute cette leon !!
+
+ 1. Appuyez la touche <chap> (pour tre sr d'tre en mode Normal).
+
+ 2. Tapez : :q! <Entre>
+ Ceci quitte l'diteur SANS enregistrer les changements que vous avez
+ faits.
+
+ 3. Revenez ici en tapant la commande qui vous a men ce tutoriel.
+ Cela pourrait tre : vimtutor <Entre>
+
+ 4. Si vous avez mmoris ces tapes et tes confiant, effectuez les tapes
+ 1 3 pour sortir puis rentrer dans l'diteur.
+
+NOTE : :q! <Entre> annule tous les changements que vous avez faits. Dans
+ quelques leons, vous apprendrez enregistrer les changements.
+
+ 5. Dplacez le curseur la Leon 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 1.3 : DITION DE TEXTE - EFFACEMENT
+
+
+ ** Appuyez x pour effacer le caractre sous le curseur. **
+
+ 1. Dplacez le curseur sur la ligne marque ---> ci-dessous.
+
+ 2. Pour corriger les erreurs, dplacez le curseur jusqu' ce qu'il soit
+ sur un caractre effacer.
+
+ 3. Appuyez la touche x pour effacer le caractre redondant.
+
+ 4. Rptez les tapes 2 4 jusqu' ce que la phrase soit correcte.
+
+---> La vvache a saut au-ddessus dde la luune.
+
+ 5. Maintenant que la ligne est correcte, passez la Leon 1.4.
+
+NOTE : En avanant dans ce cours, n'essayez pas de mmoriser, apprenez par
+ la pratique.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 1.4 : DITION DE TEXTE - INSERTION
+
+
+ ** Appuyez i pour insrer du texte. **
+
+ 1. Dplacez le curseur sur la premire ligne marque ---> ci-dessous.
+
+ 2. Pour rendre la premire ligne identique la seconde, mettez le curseur
+ sur le premier caractre APRS l'endroit o insrer le texte.
+
+ 3. Appuyez i et tapez les caractres qui manquent.
+
+ 4. Une fois qu'une erreur est corrige, appuyez <chap> pour revenir en mode
+ Normal. Rptez les tapes 2 4 pour corriger la phrase.
+
+---> Il mnqe caractres cette .
+---> Il manque des caractres dans cette ligne.
+
+ 5. Une fois que vous tes l'aise avec l'insertion de texte, allez la
+ Leon 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 1.5 : DITION DE TEXTE - AJOUTER
+
+
+ ** Appuyez A pour ajouter du texte. **
+
+ 1. Dplacez le curseur sur la premire ligne ci-dessous marque --->.
+ Peu importe sur quel caractre se trouve le curseur sur cette ligne.
+
+ 2. Appuyez A et tapez les ajouts ncessaires.
+
+ 3. Quand le texte a t ajout, appuyez <chap> pour revenir en mode
+ Normal.
+
+ 4. Dplacez le curseur sur la seconde ligne marque ---> et rptez les
+ tapes 2 et 3 pour corriger la phrase.
+
+---> Il manque du texte partir de cet
+ Il manque du texte partir de cette ligne.
+---> Il manque aussi du te
+ Il manque aussi du texte ici.
+
+ 5. Quand vous vous sentez suffisamment l'aise pour ajouter du texte,
+ allez la Leon 1.6.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 1.6 : DITER UN FICHIER
+
+
+ ** Utilisez :wq pour enregistrer un fichier et sortir. **
+
+!! NOTE : Lisez toute la leon avant d'excuter les instructions ci-dessous !!
+
+ 1. Sortez de ce tutoriel comme vous l'avez fait dans la Leon 1.2 : :q!
+ Ou, si vous avez accs un autre terminal, excutez-y les actions
+ qui suivent.
+
+ 2. l'invite du shell, tapez cette commande : vim tutor <Entre>
+ 'vim' est la commande pour dmarrer l'diteur Vim, 'tutor' est le
+ nom du fichier que vous souhaitez diter. Utilisez un fichier qui peut
+ tre modifi.
+
+ 3. Insrez et effacez du texte comme vous l'avez appris dans les leons
+ prcdentes.
+
+ 4. Enregistrez le fichier avec les changements et sortez de Vim avec :
+ :wq <Entre>
+
+ 5. Si vous avez quitt vimtutor l'tape 1, recommencez vimtutor et
+ dplacez-vous en bas vers le rsum suivant.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RSUM DE LA LEON 1
+
+
+ 1. Le curseur se dplace avec les touches flches ou les touches hjkl.
+ h (gauche) j (bas) k (haut) l (droite)
+
+ 2. Pour dmarrer Vim l'invite du shell tapez : vim FICHIER <Entre>
+
+ 3. Pour quitter Vim tapez : <chap> :q! <Entre> pour perdre tous les
+ changements.
+ OU tapez : <chap> :wq <Entre> pour enregistrer les
+ changements.
+
+ 4. Pour effacer un caractre sous le curseur tapez : x
+
+ 5. Pour insrer ou ajouter du texte tapez :
+ i tapez le texte insrer avant le curseur <chap>
+ A tapez le texte ajouter en fin de ligne <chap>
+
+NOTE : Appuyer <chap> vous place en mode Normal ou annule une commande
+ partiellement tape dont vous ne voulez plus.
+
+Passez maintenant la leon 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 2.1 : COMMANDES D'EFFACEMENT
+
+
+ ** Tapez dw pour effacer un mot. **
+
+ 1. Appuyez <chap> pour tre sr d'tre en mode Normal.
+
+ 2. Dplacez le curseur sur la ligne marque ---> ci-dessous.
+
+ 3. Placez le curseur sur le dbut d'un mot qui a besoin d'tre effac.
+
+ 4. Tapez dw pour faire disparatre ce mot.
+
+NOTE : La lettre d apparatra sur la dernire ligne de l'cran lors de
+ votre frappe. Vim attend que vous tapiez w . Si vous voyez un autre
+ caractre que d vous avez tap autre chose ; appuyez <chap> et
+ recommencez.
+
+---> Il y a quelques drle mots qui n'ont rien faire papier sur cette ligne.
+
+ 5. Rptez les tapes 3 et 4 jusqu' ce que la phrase soit correcte et allez
+ la Leon 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 2.2 : PLUS DE COMMANDES D'EFFACEMENTS
+
+
+ ** Tapez d$ pour effacer jusqu' la fin de la ligne. **
+
+ 1. Appuyez <chap> pour tre sr d'tre en mode Normal.
+
+ 2. Dplacez le curseur sur la ligne marque ---> ci-dessous.
+
+ 3. Dplacez le curseur jusqu' la fin de la ligne correcte (APRS le
+ premier . ).
+
+ 4. Tapez d$ pour effacer jusqu' la fin de la ligne.
+
+---> Quelqu'un a tap la fin de cette ligne deux fois. cette ligne deux fois.
+
+ 5. Allez la Leon 2.3 pour comprendre ce qui se passe.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 2.3 : PROPOS DES OPRATEURS ET DES MOUVEMENTS
+
+
+ Plusieurs commandes qui changent le texte sont constitues d'un oprateur
+ et d'un mouvement. Le format pour une commande d'effacement avec l'oprateur
+ d d'effacement est le suivant :
+
+ d mouvement
+
+ O :
+ d - est l'oprateur d'effacement
+ mouvement - est le mouvement sur lequel agit l'oprateur (lists
+ ci-dessous)
+
+ Une courte liste de mouvements :
+ w - jusqu'au dbut du prochain mot, en EXCLUANT son premier caractre.
+ e - jusqu' la fin du mot courant, en EXCLUANT son dernier caractre.
+ $ - jusqu' la fin de la ligne, en INCLUANT son dernier caractre.
+
+ Ainsi, taper de va effacer depuis le curseur jusqu' la fin du mot.
+
+NOTE : Le seul appui d'un mouvement en mode Normal, sans commande, dplace le
+ curseur comme indiqu.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 2.4 : UTILISER UN QUANTIFICATEUR AVEC UN MOUVEMENT
+
+
+ ** Taper un nombre avant un mouvement le rpte autant de fois. **
+
+ 1. Dplacez le curseur au dbut de la ligne marque ---> ci-dessous.
+
+ 2. Tapez 2w pour dplacer le curseur de 2 mots vers l'avant.
+
+ 3. Tapez 3e pour dplacer le curseur la fin du troisime mot vers
+ l'avant.
+
+ 4. Tapez 0 (zro) pour dplacer au dbut de la ligne.
+
+ 5. Rptez les tapes 2 et 3 avec des quantificateurs diffrents.
+
+---> Ceci est juste une ligne avec des mots o vous pouvez vous dplacer.
+
+ 6. Dplacez-vous la Leon 2.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 2.5 : UTILISER UN QUANTIFICATEUR POUR EFFACER PLUS
+
+
+ ** Taper un nombre avec un oprateur le rpte autant de fois. **
+
+ Outre la combinaison de l'oprateur d'effacement avec un dplacement
+ mentionn ci-dessus, vous pouvez insrer un nombre (quantificateur)
+ pour effacer encore plus :
+ d nombre dplacement
+
+ 1. Dplacez le curseur vers le premier mot en MAJUSCULES dans la ligne
+ marque --->.
+
+ 2. Tapez d2w pour effacer les deux mots en MAJUSCULES.
+
+ 3. Rptez les tapes 1 et 2 avec des quantificateurs diffrents pour
+ effacer les mots suivants en MAJUSCULES l'aide d'une commande.
+
+---> Cette ABC DE ligne FGHI JK LMN OP de mots est Q RS TUV nettoye.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 2.6 : OPREZ SUR DES LIGNES
+
+
+ ** Tapez dd pour effacer une ligne complte. **
+
+ Vu le nombre de fois o l'on efface des lignes compltes, les concepteurs
+ de Vi ont dcid qu'il serait plus facile de taper simplement deux d
+ pour effacer une ligne.
+
+ 1. Placez le curseur sur la seconde ligne de la phrase ci-dessous.
+ 2. Tapez dd pour effacer la ligne.
+ 3. Maintenant allez la quatrime ligne.
+ 4. Tapez 2dd pour effacer deux lignes.
+
+---> 1) Les roses sont rouges,
+---> 2) La boue c'est drle,
+---> 3) Les violettes sont bleues,
+---> 4) J'ai une voiture,
+---> 5) Les horloges donnent l'heure,
+---> 6) Le sucre est doux
+---> 7) Tout comme vous.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 2.7 : L'ANNULATION
+
+
+ ** Tapez u pour annuler les dernires commandes. **
+ ** Tapez U pour rcuprer toute une ligne. **
+
+ 1. Dplacez le curseur sur la ligne marque ---> ci-dessous et placez-le sur
+ la premire erreur.
+ 2. Tapez x pour effacer le premier caractre redondant.
+ 3. Puis tapez u pour annuler la dernire commande excute.
+ 4. Cette fois, corrigez toutes les erreurs de la ligne avec la commande x .
+ 5. Puis tapez un U majuscule pour remettre la ligne dans son tat initial.
+ 6. Puis tapez u deux-trois fois pour annuler le U et les commandes
+ prcdentes.
+ 7. Maintenant tapez CTRL-R (maintenez la touche CTRL enfonce pendant que
+ vous appuyez R) deux-trois fois pour refaire les commandes (annuler
+ les annulations).
+
+---> Coorrigez les erreurs suur ccette ligne et reemettez-les avvec 'annuler'.
+
+ 8. Ce sont des commandes trs utiles. Maintenant, allez au rsum de la
+ Leon 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RSUM DE LA LEON 2
+
+
+ 1. Pour effacer du curseur jusqu'au mot suivant tapez : dw
+
+ 2. Pour effacer du curseur jusqu' la fin d'une ligne tapez : d$
+
+ 3. Pour effacer toute une ligne tapez : dd
+
+ 4. Pour rpter un dplacement ajoutez un quantificateur : 2w
+
+ 5. Le format d'une commande de changement est :
+
+ oprateur [nombre] dplacement
+
+ O :
+ oprateur - est ce qu'il faut faire, comme d pour effacer.
+ [nombre] - un quantificateur optionnel pour rpter le dplacement.
+ dplacement - dplace le long du texte oprer, tel que w (mot),
+ $ (jusqu' la fin de ligne), etc.
+
+ 6. Pour se dplacer au dbut de ligne, utilisez un zro : 0
+
+ 5. Pour annuler des actions prcdentes, tapez : u (u minuscule)
+ Pour annuler tous les changements sur une ligne tapez : U (U majuscule)
+ Pour annuler l'annulation tapez : CTRL-R
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 3.1 : LE COLLAGE
+
+
+ ** Tapez p pour placer aprs le curseur ce qui vient d'tre effac. **
+
+ 1. Placez le curseur sur la premire ligne ci-dessous marque --->.
+
+ 2. Tapez dd pour effacer la ligne et la placer dans un registre de Vim.
+
+ 3. Dplacez le curseur sur la ligne c) au-dessus o vous voulez remettre la
+ ligne efface.
+
+ 4. En mode Normal, tapez p pour remettre la ligne en dessous du curseur.
+
+ 5. Rptez les tapes 2 4 pour mettre toutes les lignes dans le bon ordre.
+
+---> d) Et vous, qu'apprenez-vous ?
+---> b) Les violettes sont bleues,
+---> c) L'intelligence s'apprend,
+---> a) Les roses sont rouges,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 3.2 : LA COMMANDE DE REMPLACEMENT
+
+
+ ** Tapez rx pour remplacer un caractre sous le curseur par x . **
+
+ 1. Dplacez le curseur sur la premire ligne marque ---> ci-dessous.
+
+ 2. Placez le curseur de manire ce qu'il surplombe la premire erreur.
+
+ 3. Tapez r suivi du caractre qui doit corriger l'erreur.
+
+ 4. Rptez les tapes 2 et 3 jusqu' ce que la premire ligne soit gale
+ la seconde.
+
+---> Quand cette ligne a t sauvie, quelqu'un a lait des faunes de frappe !
+---> Quand cette ligne a t saisie, quelqu'un a fait des fautes de frappe !
+
+ 5. Maintenant, allez la Leon 3.3.
+
+NOTE : N'oubliez pas que vous devriez apprendre par la pratique, pas par
+ mmorisation.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 3.3 : L'OPRATEUR DE CHANGEMENT
+
+
+ ** Pour changer jusqu' la fin d'un mot, tapez ce .**
+
+ 1. Dplacez le curseur sur la premire ligne marque ---> ci-dessous.
+
+ 2. Placez le curseur sur le u de luhko.
+
+ 3. Tapez ce et corrigez le mot (dans notre cas, tapez 'igne'.)
+
+ 4. Appuyez <chap> et placez-vous sur le prochain caractre qui doit
+ tre chang.
+
+ 5. Rptez les tapes 3 et 4 jusqu' ce que la premire phrase soit
+ identique la seconde.
+
+---> Cette luhko contient quelques myqa qui ont ricne d'tre chantufip.
+---> Cette ligne contient quelques mots qui ont besoin d'tre changs.
+
+Notez que ce efface le mot et vous place ensuite en mode Insertion.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 3.4 : PLUS DE CHANGEMENTS AVEC c
+
+
+ ** L'oprateur de changement fonctionne avec les mmes dplacements
+ que l'effacement. **
+
+ 1. L'oprateur de changement fonctionne de la mme manire que
+ l'effacement. Le format est :
+
+ c [nombre] dplacement
+
+ 2. Les dplacements sont identiques : w (mot) et $ (fin de ligne).
+
+ 3. Dplacez-vous sur la premire ligne marque ---> ci-dessous.
+
+ 4. Placez le curseur sur la premire erreur.
+
+ 5. Tapez c$ et tapez le reste de la ligne afin qu'elle soit identique
+ la seconde ligne, puis tapez <chap>.
+
+---> La fin de cette ligne doit tre rendue identique la seconde.
+---> La fin de cette ligne doit tre corrige avec la commande c$ .
+
+NOTE : Vous pouvez utiliser la touche Retour Arrire pour corriger les
+ erreurs lorsque vous tapez.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RSUM DE LA LEON 3
+
+
+ 1. Pour remettre le texte qui a dj t effac, tapez p . Cela Place le
+ texte effac APRS le curseur (si une ligne complte a t efface, elle
+ sera place sous la ligne du curseur).
+
+ 2. Pour remplacer le caractre sous le curseur, tapez r suivi du caractre
+ qui remplacera l'original.
+
+ 3. L'oprateur de changement vous permet de changer depuis la position du
+ curseur jusqu'o le dplacement vous amne. Par exemple, tapez ce
+ pour changer du curseur jusqu' la fin du mot, c$ pour changer jusqu'
+ la fin d'une ligne.
+
+ 4. Le format pour le changement est :
+
+ c [nombre] dplacement
+
+Passez maintenant la leon suivante.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 4.1 : POSITION DU CURSEUR ET TAT DU FICHIER
+
+
+ ** Tapez CTRL-G pour afficher votre position dans le fichier et son tat.
+ Tapez G pour vous rendre une ligne donne du fichier. **
+
+NOTE : Lisez toute cette leon avant d'effectuer l'une des tapes !!
+
+ 1. Maintenez enfonce la touche CTRL et appuyez sur g . On appelle cela
+ CTRL-G. Une ligne d'tat va apparatre en bas de l'cran avec le nom
+ du fichier et le numro de la ligne o vous tes. Notez ce numro, il
+ servira lors de l'tape 3.
+
+NOTE : Vous pouvez peut-tre voir le curseur en bas droite de l'cran.
+ Ceci arrive quand l'option 'ruler' est active (voir :help 'ruler')
+
+ 2. Tapez G pour vous dplacer la fin du fichier.
+ Tapez gg pour vous dplacer au dbut du fichier.
+
+ 3. Tapez le numro de la ligne o vous tiez suivi de G . Cela vous
+ ramnera la ligne o vous tiez au dpart quand vous aviez appuy
+ CTRL-G.
+
+ 4. Si vous vous sentez prt faire ceci, effectuez les tapes 1 3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 4.2 : LA RECHERCHE
+
+
+ ** Tapez / suivi d'un texte pour rechercher ce texte. **
+
+ 1. Tapez le caractre / en mode Normal. Notez que celui-ci et le curseur
+ apparaissent en bas de l'cran, comme lorsque l'on utilise : .
+
+ 2. Puis tapez 'errreuur' <Entre>. C'est le mot que vous voulez rechercher.
+
+ 3. Pour rechercher nouveau le mme texte, tapez simplement n .
+ Pour rechercher le mme texte dans la direction oppose, tapez N .
+
+ 4. Pour rechercher une phrase dans la direction oppose, utilisez ?
+ au lieu de / .
+
+---> erreur ne s'crit pas "errreuur" ; errreuur est une erreur.
+
+NOTE : Quand la recherche atteint la fin du fichier, elle reprend au dbut
+ sauf si l'option 'wrapscan' est dsactive.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 4.3 : RECHERCHE DES PARENTHSES CORRESPONDANTES
+
+
+ ** Tapez % pour trouver des ), ] ou } correspondants. **
+
+ 1. Placez le curseur sur l'un des (, [ ou { de la ligne marque --->
+ ci-dessous.
+
+ 2. Puis tapez le caractre % .
+
+ 3. Le curseur se dplacera sur la parenthse ou crochet correspondant.
+
+ 4. Tapez % pour replacer le curseur sur la parenthse ou crochet
+ correspondant.
+
+ 5. Dplacez le curseur sur un autre (,),[,],{ ou } et regardez ce que
+ fait % .
+
+---> Voici ( une ligne de test contenant des (, des [ ] et des { } )).
+
+NOTE : Cette fonctionnalit est trs utile lors du dbogage d'un programme qui
+ contient des parenthses dsquilibres !
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 4.4 : LA COMMANDE DE SUBSTITUTION
+
+
+ ** Tapez :s/ancien/nouveau/g pour remplacer 'ancien' par 'nouveau'. **
+
+ 1. Dplacez le curseur sur la ligne marque ---> ci-dessous.
+
+ 2. Tapez :s/lee/le <Entre> . Notez que cette commande change seulement la
+ premire occurrence de "lee" dans la ligne.
+
+ 3. Puis tapez :s/lee/le/g . L'ajout du drapeau g ordonne de faire une
+ substitution globale sur la ligne, et change toutes les occurrences de
+ "lee" sur la ligne.
+
+---> lee meilleur moment pour regarder lees fleurs est pendant lee printemps.
+
+ 4. Pour changer toutes les occurrences d'un texte, entre deux lignes,
+ tapez :#,#s/ancien/nouveau/g o #,# sont les numros de lignes de la
+ plage o la substitution doit tre faite.
+ Tapez :%s/ancien/nouveau/g pour changer toutes les occurrences dans
+ tout le fichier.
+ Tapez :%s/ancien/nouveau/gc pour trouver toutes les occurrences dans
+ tout le fichier avec une invite pour
+ confirmer ou infirmer chaque substitution.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RSUM DE LA LEON 4
+
+
+ 1. CTRL-G affiche la position dans le fichier et l'tat de celui-ci.
+ G dplace la fin du fichier.
+ nombre G dplace au numro de ligne.
+ gg dplace la premire ligne.
+
+ 2. Taper / suivi d'un texte recherche ce texte vers l'AVANT.
+ Taper ? suivi d'un texte recherche ce texte vers l'ARRIRE.
+ Aprs une recherche tapez n pour trouver l'occurrence suivante dans la
+ mme direction ou Maj-N pour rechercher dans la direction oppose.
+
+ 3. Taper % lorsque le curseur est sur (, ), [, ], { ou } dplace
+ celui-ci sur le caractre correspondant.
+
+ 4. Pour remplacer le premier aa par bb sur une ligne tapez :s/aa/bb
+ Pour remplacer tous les aa par bb sur une ligne tapez :s/aa/bb/g
+ Pour remplacer du texte entre deux numros de ligne tapez :#,#s/aa/bb/g
+ Pour remplacer toutes les occurrences dans le fichier tapez :%s/aa/bb/g
+ Pour demander une confirmation chaque fois ajoutez 'c' :%s/aa/bb/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 5.1 : COMMENT EXCUTER UNE COMMANDE EXTERNE
+
+
+ ** Tapez :! suivi d'une commande externe pour excuter cette commande. **
+
+ 1. Tapez le : familier pour mettre le curseur en bas de l'cran. Cela vous
+ permet de saisir une commande.
+
+ 2. Puis tapez un ! (point d'exclamation). Cela vous permet d'excuter
+ n'importe quelle commande valide pour votre interprteur (shell).
+
+ 3. Par exemple, tapez ls aprs le ! et appuyez <Entre>. Ceci affichera
+ la liste des fichiers du rpertoire courant, comme si vous aviez tap la
+ commande l'invite du shell. Utilisez :!dir si :!ls ne marche pas.
+
+NOTE : Il est possible d'excuter n'importe quelle commande externe de cette
+ manire, avec ou sans argument.
+
+NOTE : Toutes les commandes : doivent finir par la frappe de <Entre>.
+ partir de maintenant, nous ne le mentionnerons plus.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 5.2 : PLUS DE DTAILS SUR L'ENREGISTREMENT DE FICHIERS
+
+
+ ** Pour enregistrer les changements faits au texte, tapez :w FICHIER . **
+
+ 1. Tapez :!dir ou :!ls pour avoir la liste des fichiers dans le
+ rpertoire courant. Vous savez dj qu'il faut appuyer <Entre> aprs
+ cela.
+
+ 2. Choisissez un nom de fichier qui n'existe pas encore, par exemple TEST.
+
+ 3. Puis tapez :w TEST (o TEST est le nom que vous avez choisi).
+
+ 4. Cela enregistre tout le fichier (Tutoriel Vim) sous le nom TEST.
+ Pour le vrifier, tapez :!dir ou :!ls de nouveau pour revisualiser
+ votre rpertoire.
+
+NOTE : Si vous quittez Vim et le redmarrez de nouveau avec le fichier TEST,
+ celui-ci sera une copie exacte de ce cours au moment o vous l'avez
+ enregistr.
+
+ 5. Maintenant, effacez le fichier en tapant (Windows) : :!del TEST
+ ou (Unix) : :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 5.3 : SLECTION DU TEXTE ENREGISTRER
+
+
+ ** Pour enregistrer une portion du fichier,
+ tapez : v dplacement :w FICHIER **
+
+ 1. Dplacez le curseur sur cette ligne.
+
+ 2. Appuyez v et dplacez le curseur vers la cinquime ligne plus bas.
+ Remarquez que le texte est en surbrillance.
+
+ 3. Appuyez : . En bas de l'cran :'<,'> va apparatre.
+
+ 4. Tapez w TEST , o TEST est un nom de fichier qui n'existe pas.
+ Vrifiez que vous voyez :'<,'>w TEST avant d'appuyer sur <Entre>.
+
+ 5. Vim va enregistrer les lignes slectionnes dans le fichier TEST.
+ Utilisez :!dir ou :!ls pour le voir. Ne l'effacez pas encore !
+ Nous allons l'utiliser dans la leon suivante.
+
+NOTE : L'appui de v dmarre la slection Visuelle. Vous pouvez dplacer le
+ curseur pour agrandir ou rtrcir la slection. Puis vous pouvez
+ utiliser un oprateur pour faire quelque chose sur le texte. Par
+ exemple, d efface le texte.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 5.4 : RCUPRATION ET FUSION DE FICHIERS
+
+
+ ** Pour insrer le contenu d'un fichier, tapez :r FICHIER **
+
+ 1. Placez le curseur juste au-dessus de cette ligne.
+
+NOTE : Aprs avoir excut l'tape 2 vous verrez du texte de la Leon 5.3.
+ Puis dplacez-vous vers le bas pour voir cette leon nouveau.
+
+ 2. Maintenant rcuprez votre fichier TEST en utilisant la commande :r TEST
+ o TEST est le nom de votre fichier.
+ Le fichier que vous rcuprez est plac au-dessous de la ligne du curseur.
+
+ 3. Pour vrifier que le fichier a bien t insr, remontez et vrifiez
+ qu'il y a maintenant deux copies de la Leon 5.3, l'originale et celle
+ contenue dans le fichier.
+
+NOTE : Vous pouvez aussi lire la sortie d'une commande externe. Par exemple,
+ :r !ls lit la sortie de la commande ls et la place sous la ligne du
+ curseur.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RSUM DE LA LEON 5
+
+
+ 1. :!commande excute une commande externe.
+
+ Quelques exemples pratiques :
+ (Windows) (Unix)
+ :!dir :!ls affiche le contenu du rpertoire courant.
+ :!del FICHIER :!rm FICHIER efface FICHIER.
+
+ 2. :w FICHIER enregistre le fichier Vim courant sur le disque avec pour
+ nom FICHIER.
+
+ 3. v dplacement :w FICHIER sauvegarde les lignes de la slection Visuelle
+ dans le fichier FICHIER.
+
+ 4. :r FICHIER rcupre le contenu du fichier FICHIER et l'insre sous la
+ position du curseur.
+
+ 5. :r !dir lit la sortie de la commande dir et l'insre sous la position
+ du curseur.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 6.1 : LA COMMANDE D'OUVERTURE
+
+
+** Tapez o pour ouvrir une ligne sous le curseur et y aller en Insertion. **
+
+ 1. Dplacez le curseur sur la ligne marque ---> ci-dessous.
+
+ 2. Tapez la lettre o minuscule pour ouvrir une ligne SOUS le curseur et
+ vous y placer en mode Insertion.
+
+ 3. Puis tapez du texte et appuyez <chap> pour sortir du mode Insertion.
+
+---> En tapant o le curseur se met sur la ligne ouverte, en mode Insertion.
+
+ 4. Pour ouvrir une ligne au-DESSUS du curseur, tapez simplement un O
+ majuscule, plutt qu'un o minuscule. Faites un essai sur la ligne
+ ci-dessous.
+
+---> Ouvrez une ligne ci-dessus en tapant O lorsque le curseur est ici.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 6.2 : LA COMMANDE D'AJOUT
+
+
+ ** Tapez a pour insrer du texte APRS le curseur. **
+
+ 1. Placez le curseur au dbut de la ligne marque ---> ci-dessous.
+
+ 2. Appuyez e jusqu' ce que le curseur soit sur la fin de li .
+
+ 3. Appuyez a (minuscule) pour ajouter du texte APRS le curseur.
+
+ 4. Compltez le mot comme dans la ligne dessous. Appuyez <chap> pour
+ sortir du mode Insertion.
+
+ 5. Utilisez e pour vous dplacer vers le mot incomplet suivant et
+ rptez les tapes 3 et 4.
+
+---> Cette li vous perm de pratiq l'ajout de t dans une ligne.
+---> Cette ligne vous permet de pratiquer l'ajout de texte dans une ligne.
+
+NOTE : a, i, A vont tous dans le mme mode Insertion, la seule diffrence
+ est l'endroit o les caractres sont insrs.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 6.3 : UNE AUTRE MANIRE DE REMPLACER
+
+
+ ** Tapez un R majuscule pour remplacer plus d'un caractre. **
+
+ 1. Dplacez le curseur sur la premire ligne marque ---> ci-dessous.
+ Dplacez le curseur sur le dbut du premier xxx .
+
+ 2. Appuyez maintenant R et tapez le nombre dessous dans la deuxime ligne,
+ de manire remplacer le xxx .
+
+ 3. Appuyez <chap> pour quitter le mode Remplacement. Notez que le reste de
+ la ligne demeure inchang.
+
+ 4. Rptez les tapes pour remplacer les xxx restants.
+
+
+---> L'ajout de 123 xxx donne xxx.
+---> L'ajout de 123 456 donne 579.
+
+NOTE : Le mode Remplacement est comme le mode Insertion, mais tous les
+ caractres taps effacent un caractre existant.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 6.4 : COPIER ET COLLER DU TEXTE
+
+
+ ** Utilisez l'oprateur y pour copier du texte et p pour le coller **
+
+ 1. Allez la ligne marque ---> ci-dessous et placez le curseur aprs "a)".
+
+ 2. Dmarrez le mode Visuel avec v et dplacez le curseur juste devant
+ "premier".
+
+ 3. Tapez y pour copier le texte en surbrillance.
+
+ 4. Dplacez le curseur la fin de la ligne suivante : j$
+
+ 5. Tapez p pour coller le texte. Puis tapez : un second <chap> .
+
+ 6. Utilisez le mode Visuel pour slectionner "lment", copiez-le avec y ,
+ dplacez-vous la fin de la ligne suivante avec j$ et collez le texte
+ cet endroit avec p .
+
+---> a) ceci est le premier lment.
+ b)
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 6.5 : RGLAGE DES OPTIONS
+
+
+ ** Rglons une option afin que la recherche et la substitution ignorent la
+ casse des caractres. **
+
+ 1. Recherchez 'ignore' en tapant : /ignore <Entre>
+ Rptez ceci plusieurs fois en utilisant la touche n .
+
+ 2. Activez l'option 'ic' (ignorer casse) en tapant :set ic .
+
+ 3. Puis cherchez 'ignore' de nouveau en utilisant n .
+ Remarquez que Ignore et IGNORE sont maintenant aussi trouvs.
+
+ 4. Activez les options 'hlsearch' et 'incsearch' avec :set hls is .
+
+ 5. Puis recommencez une recherche, et faites bien attention ce qui se
+ produit : /ignore <Entre>
+
+ 6. Pour dsactiver 'ignorer casse', entrez : :set noic
+
+NOTE : Pour enlever la surbrillance des rsultats, entrez : :nohlsearch
+
+NOTE : Si vous voulez ignorer la casse uniquement pour une recherche, utilisez
+ \c dans la phrase : /ignore\c <Entre>
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RSUM DE LA LEON 6
+
+
+ 1. Taper o ouvre une ligne SOUS le curseur et dmarre le mode Insertion.
+ Taper O ouvre une ligne au-DESSUS du curseur.
+
+ 2. Taper a pour insrer du texte APRS le curseur.
+ Taper A pour insrer du texte aprs la fin de ligne.
+
+ 3. Taper e dplace la fin du mot.
+
+ 4. Taper y copie du texte, p le colle.
+
+ 5. Taper R majuscule active le mode Remplacement jusqu' ce qu' <chap>
+ soit appuy.
+
+ 6. Taper ":set xxx" active l'option "xxx". Quelques options sont :
+ 'ic' 'ignorecase' pour ignorer la casse lors des recherches.
+ 'is' 'incsearch' pour montrer les appariements partiels.
+ 'hls' 'hlsearch' pour mettre en surbrillance les appariements.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 7.1 : OBTENIR DE L'AIDE
+
+
+ ** Utiliser le systme d'aide en ligne. **
+
+ Vim a un systme complet d'aide en ligne. Pour y accder, essayez l'une de
+ ces trois mthodes :
+ - appuyez la touche <Help> (si vous en avez une)
+ - appuyez la touche <F1> (si vous en avez une)
+ - tapez :help <Entre>
+
+
+ Lisez le texte dans la fentre d'aide pour savoir comment fonctionne l'aide.
+ Tapez CTRL-W CTRL-W pour sauter d'une fentre l'autre.
+ Tapez :q <Entre> pour fermer la fentre d'aide.
+
+ Vous pouvez accder l'aide sur peu prs n'importe quel sujet en donnant
+ des arguments la commande :help . Essayez par exemple (n'oubliez pas
+ d'appuyer sur <Entre>) :
+
+ :help w
+ :help c_CTRL-D
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 7.2 : CRER UN SCRIPT DE DMARRAGE
+
+ ** Activer les fonctionnalits de Vim. **
+
+ Vim a beaucoup plus de fonctionnalits que Vi, mais la plupart de celles-ci
+ sont dsactives par dfaut. Pour commencer les utiliser, vous devez
+ crer un fichier "vimrc".
+
+ 1. Commencez diter le fichier "vimrc". Ceci dpend de votre systme :
+ :edit ~/.vimrc pour Unix
+ :edit ~/_vimrc pour Windows
+
+ 2. Lisez maintenant le fichier d'exemple "vimrc" :
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Enregistrez le fichier avec :
+ :w
+
+ La prochaine fois que vous dmarrerez Vim, la coloration syntaxique sera
+ active. Vous pouvez ajouter tous vos rglages prfrs dans ce fichier
+ "vimrc". Pour plus d'informations, tapez :help vimrc-intro
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leon 7.3 : COMPLTEMENT
+
+
+ ** Compltement de ligne de commande avec CTRL-D et <TAB> **
+
+ 1. Mettez Vim soit en mode non compatible : set nocp
+
+ 2. Regardez quels fichiers existent dans le rpertoire : !ls ou !dir
+
+ 3. Tapez le dbut d'une commande : :e
+
+ 4. Appuyez CTRL-D et Vim affichera une liste de commandes qui commencent
+ par "e".
+
+ 5. Appuyez d<TAB> et Vim compltera le nom de la commande : ":edit"
+
+ 6. Ajoutez maintenant un espace et le dbut d'un fichier existant :
+ :edit FIC
+
+ 7 Appuyez <TAB>. Vim va complter le nom (s'il est unique).
+
+NOTE : Le compltement fonctionne pour de nombreuses commandes. Essayez
+ d'appuyer CTRL-D et <TAB>. C'est utile en particulier pour :help .
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RSUM DE LA LEON 7
+
+
+ 1. Tapez :help ou appuyez <F1> ou <Aide> pour ouvrir la fentre d'aide.
+
+ 2. Tapez :help cmd pour trouver l'aide sur cmd .
+
+ 3. Tapez CTRL-W CTRL-W pour sauter une autre fentre.
+
+ 4. Tapez :q pour fermer la fentre d'aide.
+
+ 5. Crez un script de dmarrage vimrc pour conserver vos rglages prfrs.
+
+ 6. Quand vous tapez une commande : appuyez CTRL-D pour voir les
+ compltements possibles. Appuyez <TAB> pour utiliser un compltement.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Ceci conclut le Tutoriel Vim. Le but tait de vous donner un bref aperu de
+ l'diteur Vim, juste assez pour vous permettre d'utiliser l'diteur
+ relativement facilement. Il est loin d'tre complet, vu que Vim a beaucoup
+ plus de commandes. Un Manuel de l'utilisateur est disponible en anglais :
+ :help user-manual
+
+ Pour continuer dcouvrir et apprendre Vim, il existe un livre traduit en
+ franais. Il parle plus de Vi que de Vim, mais pourra vous tre utile.
+ L'diteur Vi - Collection Prcis et concis - par Arnold Robbins
+ diteur : O'Reilly France
+ ISBN : 2-84177-102-4
+
+ Deux livres en anglais sont galement mentionns dans la version originale
+ de ce tutoriel, dont un qui traite spcifiquement de Vim. Merci de vous y
+ rfrer si vous tes intresss.
+
+ Ce tutoriel a t crit par Michael C. Pierce et Robert K. Ware de l'cole
+ des Mines du Colorado et reprend des ides fournies par Charles Smith,
+ Universit d'tat du Colorado. E-mail : bware@mines.colorado.edu.
+
+ Modifi pour Vim par Bram Moolenaar.
+ Traduit en franais par Adrien Beau, en avril 2001.
+ Dernires mises jour par Dominique Pell.
+
+ E-mail : dominique.pelle@gmail.com
+ Last Change : 2018 Dec 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.fr.utf-8 b/runtime/tutor/tutor.fr.utf-8
new file mode 100644
index 0000000..35eab89
--- /dev/null
+++ b/runtime/tutor/tutor.fr.utf-8
@@ -0,0 +1,1038 @@
+===============================================================================
+= B i e n v e n u e dans l e T u t o r i e l de V I M - Version 1.7 =
+===============================================================================
+
+ Vim est un éditeur très puissant qui a trop de commandes pour pouvoir
+ toutes les expliquer dans un cours comme celui-ci, qui est conçu pour en
+ décrire suffisamment afin de vous permettre d'utiliser simplement Vim.
+
+ Le temps requis pour suivre ce cours est d'environ 25 à 30 minutes, selon
+ le temps que vous passerez à expérimenter.
+
+ ATTENTION :
+ Les commandes utilisées dans les leçons modifieront le texte. Faites une
+ copie de ce fichier afin de vous entraîner dessus (si vous avez lancé
+ "vimtutor" ceci est déjà une copie).
+
+ Il est important de garder en tête que ce cours est conçu pour apprendre
+ par la pratique. Cela signifie que vous devez exécuter les commandes
+ pour les apprendre correctement. Si vous vous contentez de lire le texte,
+ vous oublierez les commandes !
+
+ Maintenant, vérifiez que votre clavier n'est PAS verrouillé en
+ majuscules, et appuyez la touche j le nombre de fois suffisant pour
+ que la Leçon 1.1 remplisse complètement l'écran.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 1.1 : DÉPLACEMENT DU CURSEUR
+
+
+ ** Pour déplacer le curseur, appuyez les touches h,j,k,l comme indiqué. **
+ ^
+ k Astuce : La touche h est à gauche et déplace à gauche.
+ < h l > La touche l est à droite et déplace à droite.
+ j La touche j ressemble à une flèche vers le bas.
+ v
+ 1. Déplacez le curseur sur l'écran jusqu'à vous sentir à l'aise.
+
+ 2. Maintenez la touche Bas (j) enfoncée jusqu'à ce qu'elle se répète.
+ Maintenant vous êtes capable de vous déplacer jusqu'à la leçon suivante.
+
+ 3. En utilisant la touche Bas, allez à la Leçon 1.2.
+
+NOTE : Si jamais vous doutez de ce que vous venez de taper, appuyez <Échap>
+ pour revenir en mode Normal. Puis retapez la commande que vous vouliez.
+
+NOTE : Les touches fléchées devraient également fonctionner. Mais en utilisant
+ hjkl vous pourrez vous déplacer beaucoup plus rapidement, une fois que
+ vous aurez pris l'habitude.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 1.2 : SORTIR DE VIM
+
+
+ !! NOTE : Avant d'effectuer les étapes ci-dessous, lisez toute cette leçon !!
+
+ 1. Appuyez la touche <Échap> (pour être sûr d'être en mode Normal).
+
+ 2. Tapez : :q! <Entrée>
+ Ceci quitte l'éditeur SANS enregistrer les changements que vous avez
+ faits.
+
+ 3. Revenez ici en tapant la commande qui vous a mené à ce tutoriel.
+ Cela pourrait être : vimtutor <Entrée>
+
+ 4. Si vous avez mémorisé ces étapes et êtes confiant, effectuez les étapes
+ 1 à 3 pour sortir puis rentrer dans l'éditeur.
+
+NOTE : :q! <Entrée> annule tous les changements que vous avez faits. Dans
+ quelques leçons, vous apprendrez à enregistrer les changements.
+
+ 5. Déplacez le curseur à la Leçon 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 1.3 : ÉDITION DE TEXTE - EFFACEMENT
+
+
+ ** Appuyez x pour effacer le caractère sous le curseur. **
+
+ 1. Déplacez le curseur sur la ligne marquée ---> ci-dessous.
+
+ 2. Pour corriger les erreurs, déplacez le curseur jusqu'à ce qu'il soit
+ sur un caractère à effacer.
+
+ 3. Appuyez la touche x pour effacer le caractère redondant.
+
+ 4. Répétez les étapes 2 à 4 jusqu'à ce que la phrase soit correcte.
+
+---> La vvache a sautéé au-ddessus dde la luune.
+
+ 5. Maintenant que la ligne est correcte, passez à la Leçon 1.4.
+
+NOTE : En avançant dans ce cours, n'essayez pas de mémoriser, apprenez par
+ la pratique.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 1.4 : ÉDITION DE TEXTE - INSERTION
+
+
+ ** Appuyez i pour insérer du texte. **
+
+ 1. Déplacez le curseur sur la première ligne marquée ---> ci-dessous.
+
+ 2. Pour rendre la première ligne identique à la seconde, mettez le curseur
+ sur le premier caractère APRÈS l'endroit où insérer le texte.
+
+ 3. Appuyez i et tapez les caractères qui manquent.
+
+ 4. Une fois qu'une erreur est corrigée, appuyez <Échap> pour revenir en mode
+ Normal. Répétez les étapes 2 à 4 pour corriger la phrase.
+
+---> Il mnqe caractères cette .
+---> Il manque des caractères dans cette ligne.
+
+ 5. Une fois que vous êtes à l'aise avec l'insertion de texte, allez à la
+ Leçon 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 1.5 : ÉDITION DE TEXTE - AJOUTER
+
+
+ ** Appuyez A pour ajouter du texte. **
+
+ 1. Déplacez le curseur sur la première ligne ci-dessous marquée --->.
+ Peu importe sur quel caractère se trouve le curseur sur cette ligne.
+
+ 2. Appuyez A et tapez les ajouts nécessaires.
+
+ 3. Quand le texte a été ajouté, appuyez <Échap> pour revenir en mode
+ Normal.
+
+ 4. Déplacez le curseur sur la seconde ligne marquée ---> et répétez les
+ étapes 2 et 3 pour corriger la phrase.
+
+---> Il manque du texte à partir de cet
+ Il manque du texte à partir de cette ligne.
+---> Il manque aussi du te
+ Il manque aussi du texte ici.
+
+ 5. Quand vous vous sentez suffisamment à l'aise pour ajouter du texte,
+ allez à la Leçon 1.6.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 1.6 : ÉDITER UN FICHIER
+
+
+ ** Utilisez :wq pour enregistrer un fichier et sortir. **
+
+!! NOTE : Lisez toute la leçon avant d'exécuter les instructions ci-dessous !!
+
+ 1. Sortez de ce tutoriel comme vous l'avez fait dans la Leçon 1.2 : :q!
+ Ou, si vous avez accès à un autre terminal, exécutez-y les actions
+ qui suivent.
+
+ 2. À l'invite du shell, tapez cette commande : vim tutor <Entrée>
+ 'vim' est la commande pour démarrer l'éditeur Vim, 'tutor' est le
+ nom du fichier que vous souhaitez éditer. Utilisez un fichier qui peut
+ être modifié.
+
+ 3. Insérez et effacez du texte comme vous l'avez appris dans les leçons
+ précédentes.
+
+ 4. Enregistrez le fichier avec les changements et sortez de Vim avec :
+ :wq <Entrée>
+
+ 5. Si vous avez quitté vimtutor à l'étape 1, recommencez vimtutor et
+ déplacez-vous en bas vers le résumé suivant.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RÉSUMÉ DE LA LEÇON 1
+
+
+ 1. Le curseur se déplace avec les touches fléchées ou les touches hjkl.
+ h (gauche) j (bas) k (haut) l (droite)
+
+ 2. Pour démarrer Vim à l'invite du shell tapez : vim FICHIER <Entrée>
+
+ 3. Pour quitter Vim tapez : <Échap> :q! <Entrée> pour perdre tous les
+ changements.
+ OU tapez : <Échap> :wq <Entrée> pour enregistrer les
+ changements.
+
+ 4. Pour effacer un caractère sous le curseur tapez : x
+
+ 5. Pour insérer ou ajouter du texte tapez :
+ i tapez le texte à insérer avant le curseur <Échap>
+ A tapez le texte à ajouter en fin de ligne <Échap>
+
+NOTE : Appuyer <Échap> vous place en mode Normal ou annule une commande
+ partiellement tapée dont vous ne voulez plus.
+
+Passez maintenant à la leçon 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 2.1 : COMMANDES D'EFFACEMENT
+
+
+ ** Tapez dw pour effacer un mot. **
+
+ 1. Appuyez <Échap> pour être sûr d'être en mode Normal.
+
+ 2. Déplacez le curseur sur la ligne marquée ---> ci-dessous.
+
+ 3. Placez le curseur sur le début d'un mot qui a besoin d'être effacé.
+
+ 4. Tapez dw pour faire disparaître ce mot.
+
+NOTE : La lettre d apparaîtra sur la dernière ligne de l'écran lors de
+ votre frappe. Vim attend que vous tapiez w . Si vous voyez un autre
+ caractère que d vous avez tapé autre chose ; appuyez <Échap> et
+ recommencez.
+
+---> Il y a quelques drôle mots qui n'ont rien à faire papier sur cette ligne.
+
+ 5. Répétez les étapes 3 et 4 jusqu'à ce que la phrase soit correcte et allez
+ à la Leçon 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 2.2 : PLUS DE COMMANDES D'EFFACEMENTS
+
+
+ ** Tapez d$ pour effacer jusqu'à la fin de la ligne. **
+
+ 1. Appuyez <Échap> pour être sûr d'être en mode Normal.
+
+ 2. Déplacez le curseur sur la ligne marquée ---> ci-dessous.
+
+ 3. Déplacez le curseur jusqu'à la fin de la ligne correcte (APRÈS le
+ premier . ).
+
+ 4. Tapez d$ pour effacer jusqu'à la fin de la ligne.
+
+---> Quelqu'un a tapé la fin de cette ligne deux fois. cette ligne deux fois.
+
+ 5. Allez à la Leçon 2.3 pour comprendre ce qui se passe.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 2.3 : À PROPOS DES OPÉRATEURS ET DES MOUVEMENTS
+
+
+ Plusieurs commandes qui changent le texte sont constituées d'un opérateur
+ et d'un mouvement. Le format pour une commande d'effacement avec l'opérateur
+ d d'effacement est le suivant :
+
+ d mouvement
+
+ Où :
+ d - est l'opérateur d'effacement
+ mouvement - est le mouvement sur lequel agit l'opérateur (listés
+ ci-dessous)
+
+ Une courte liste de mouvements :
+ w - jusqu'au début du prochain mot, en EXCLUANT son premier caractère.
+ e - jusqu'à la fin du mot courant, en EXCLUANT son dernier caractère.
+ $ - jusqu'à la fin de la ligne, en INCLUANT son dernier caractère.
+
+ Ainsi, taper de va effacer depuis le curseur jusqu'à la fin du mot.
+
+NOTE : Le seul appui d'un mouvement en mode Normal, sans commande, déplace le
+ curseur comme indiqué.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 2.4 : UTILISER UN QUANTIFICATEUR AVEC UN MOUVEMENT
+
+
+ ** Taper un nombre avant un mouvement le répète autant de fois. **
+
+ 1. Déplacez le curseur au début de la ligne marquée ---> ci-dessous.
+
+ 2. Tapez 2w pour déplacer le curseur de 2 mots vers l'avant.
+
+ 3. Tapez 3e pour déplacer le curseur à la fin du troisième mot vers
+ l'avant.
+
+ 4. Tapez 0 (zéro) pour déplacer au début de la ligne.
+
+ 5. Répétez les étapes 2 et 3 avec des quantificateurs différents.
+
+---> Ceci est juste une ligne avec des mots où vous pouvez vous déplacer.
+
+ 6. Déplacez-vous à la Leçon 2.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 2.5 : UTILISER UN QUANTIFICATEUR POUR EFFACER PLUS
+
+
+ ** Taper un nombre avec un opérateur le répète autant de fois. **
+
+ Outre la combinaison de l'opérateur d'effacement avec un déplacement
+ mentionné ci-dessus, vous pouvez insérer un nombre (quantificateur)
+ pour effacer encore plus :
+ d nombre déplacement
+
+ 1. Déplacez le curseur vers le premier mot en MAJUSCULES dans la ligne
+ marquée --->.
+
+ 2. Tapez d2w pour effacer les deux mots en MAJUSCULES.
+
+ 3. Répétez les étapes 1 et 2 avec des quantificateurs différents pour
+ effacer les mots suivants en MAJUSCULES à l'aide d'une commande.
+
+---> Cette ABC DE ligne FGHI JK LMN OP de mots est Q RS TUV nettoyée.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 2.6 : OPÉREZ SUR DES LIGNES
+
+
+ ** Tapez dd pour effacer une ligne complète. **
+
+ Vu le nombre de fois où l'on efface des lignes complètes, les concepteurs
+ de Vi ont décidé qu'il serait plus facile de taper simplement deux d
+ pour effacer une ligne.
+
+ 1. Placez le curseur sur la seconde ligne de la phrase ci-dessous.
+ 2. Tapez dd pour effacer la ligne.
+ 3. Maintenant allez à la quatrième ligne.
+ 4. Tapez 2dd pour effacer deux lignes.
+
+---> 1) Les roses sont rouges,
+---> 2) La boue c'est drôle,
+---> 3) Les violettes sont bleues,
+---> 4) J'ai une voiture,
+---> 5) Les horloges donnent l'heure,
+---> 6) Le sucre est doux
+---> 7) Tout comme vous.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 2.7 : L'ANNULATION
+
+
+ ** Tapez u pour annuler les dernières commandes. **
+ ** Tapez U pour récupérer toute une ligne. **
+
+ 1. Déplacez le curseur sur la ligne marquée ---> ci-dessous et placez-le sur
+ la première erreur.
+ 2. Tapez x pour effacer le premier caractère redondant.
+ 3. Puis tapez u pour annuler la dernière commande exécutée.
+ 4. Cette fois, corrigez toutes les erreurs de la ligne avec la commande x .
+ 5. Puis tapez un U majuscule pour remettre la ligne dans son état initial.
+ 6. Puis tapez u deux-trois fois pour annuler le U et les commandes
+ précédentes.
+ 7. Maintenant tapez CTRL-R (maintenez la touche CTRL enfoncée pendant que
+ vous appuyez R) deux-trois fois pour refaire les commandes (annuler
+ les annulations).
+
+---> Coorrigez les erreurs suur ccette ligne et reemettez-les avvec 'annuler'.
+
+ 8. Ce sont des commandes très utiles. Maintenant, allez au résumé de la
+ Leçon 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RÉSUMÉ DE LA LEÇON 2
+
+
+ 1. Pour effacer du curseur jusqu'au mot suivant tapez : dw
+
+ 2. Pour effacer du curseur jusqu'à la fin d'une ligne tapez : d$
+
+ 3. Pour effacer toute une ligne tapez : dd
+
+ 4. Pour répéter un déplacement ajoutez un quantificateur : 2w
+
+ 5. Le format d'une commande de changement est :
+
+ opérateur [nombre] déplacement
+
+ Où :
+ opérateur - est ce qu'il faut faire, comme d pour effacer.
+ [nombre] - un quantificateur optionnel pour répéter le déplacement.
+ déplacement - déplace le long du texte à opérer, tel que w (mot),
+ $ (jusqu'à la fin de ligne), etc.
+
+ 6. Pour se déplacer au début de ligne, utilisez un zéro : 0
+
+ 5. Pour annuler des actions précédentes, tapez : u (u minuscule)
+ Pour annuler tous les changements sur une ligne tapez : U (U majuscule)
+ Pour annuler l'annulation tapez : CTRL-R
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 3.1 : LE COLLAGE
+
+
+ ** Tapez p pour placer après le curseur ce qui vient d'être effacé. **
+
+ 1. Placez le curseur sur la première ligne ci-dessous marquée --->.
+
+ 2. Tapez dd pour effacer la ligne et la placer dans un registre de Vim.
+
+ 3. Déplacez le curseur sur la ligne c) au-dessus où vous voulez remettre la
+ ligne effacée.
+
+ 4. En mode Normal, tapez p pour remettre la ligne en dessous du curseur.
+
+ 5. Répétez les étapes 2 à 4 pour mettre toutes les lignes dans le bon ordre.
+
+---> d) Et vous, qu'apprenez-vous ?
+---> b) Les violettes sont bleues,
+---> c) L'intelligence s'apprend,
+---> a) Les roses sont rouges,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 3.2 : LA COMMANDE DE REMPLACEMENT
+
+
+ ** Tapez rx pour remplacer un caractère sous le curseur par x . **
+
+ 1. Déplacez le curseur sur la première ligne marquée ---> ci-dessous.
+
+ 2. Placez le curseur de manière à ce qu'il surplombe la première erreur.
+
+ 3. Tapez r suivi du caractère qui doit corriger l'erreur.
+
+ 4. Répétez les étapes 2 et 3 jusqu'à ce que la première ligne soit égale
+ à la seconde.
+
+---> Quand cette ligne a été sauvie, quelqu'un a lait des faunes de frappe !
+---> Quand cette ligne a été saisie, quelqu'un a fait des fautes de frappe !
+
+ 5. Maintenant, allez à la Leçon 3.3.
+
+NOTE : N'oubliez pas que vous devriez apprendre par la pratique, pas par
+ mémorisation.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 3.3 : L'OPÉRATEUR DE CHANGEMENT
+
+
+ ** Pour changer jusqu'à la fin d'un mot, tapez ce .**
+
+ 1. Déplacez le curseur sur la première ligne marquée ---> ci-dessous.
+
+ 2. Placez le curseur sur le u de luhko.
+
+ 3. Tapez ce et corrigez le mot (dans notre cas, tapez 'igne'.)
+
+ 4. Appuyez <Échap> et placez-vous sur le prochain caractère qui doit
+ être changé.
+
+ 5. Répétez les étapes 3 et 4 jusqu'à ce que la première phrase soit
+ identique à la seconde.
+
+---> Cette luhko contient quelques myqa qui ont ricne d'être chantufip.
+---> Cette ligne contient quelques mots qui ont besoin d'être changés.
+
+Notez que ce efface le mot et vous place ensuite en mode Insertion.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 3.4 : PLUS DE CHANGEMENTS AVEC c
+
+
+ ** L'opérateur de changement fonctionne avec les mêmes déplacements
+ que l'effacement. **
+
+ 1. L'opérateur de changement fonctionne de la même manière que
+ l'effacement. Le format est :
+
+ c [nombre] déplacement
+
+ 2. Les déplacements sont identiques : w (mot) et $ (fin de ligne).
+
+ 3. Déplacez-vous sur la première ligne marquée ---> ci-dessous.
+
+ 4. Placez le curseur sur la première erreur.
+
+ 5. Tapez c$ et tapez le reste de la ligne afin qu'elle soit identique
+ à la seconde ligne, puis tapez <Échap>.
+
+---> La fin de cette ligne doit être rendue identique à la seconde.
+---> La fin de cette ligne doit être corrigée avec la commande c$ .
+
+NOTE : Vous pouvez utiliser la touche Retour Arrière pour corriger les
+ erreurs lorsque vous tapez.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RÉSUMÉ DE LA LEÇON 3
+
+
+ 1. Pour remettre le texte qui a déjà été effacé, tapez p . Cela Place le
+ texte effacé APRÈS le curseur (si une ligne complète a été effacée, elle
+ sera placée sous la ligne du curseur).
+
+ 2. Pour remplacer le caractère sous le curseur, tapez r suivi du caractère
+ qui remplacera l'original.
+
+ 3. L'opérateur de changement vous permet de changer depuis la position du
+ curseur jusqu'où le déplacement vous amène. Par exemple, tapez ce
+ pour changer du curseur jusqu'à la fin du mot, c$ pour changer jusqu'à
+ la fin d'une ligne.
+
+ 4. Le format pour le changement est :
+
+ c [nombre] déplacement
+
+Passez maintenant à la leçon suivante.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 4.1 : POSITION DU CURSEUR ET ÉTAT DU FICHIER
+
+
+ ** Tapez CTRL-G pour afficher votre position dans le fichier et son état.
+ Tapez G pour vous rendre à une ligne donnée du fichier. **
+
+NOTE : Lisez toute cette leçon avant d'effectuer l'une des étapes !!
+
+ 1. Maintenez enfoncée la touche CTRL et appuyez sur g . On appelle cela
+ CTRL-G. Une ligne d'état va apparaître en bas de l'écran avec le nom
+ du fichier et le numéro de la ligne où vous êtes. Notez ce numéro, il
+ servira lors de l'étape 3.
+
+NOTE : Vous pouvez peut-être voir le curseur en bas à droite de l'écran.
+ Ceci arrive quand l'option 'ruler' est activée (voir :help 'ruler')
+
+ 2. Tapez G pour vous déplacer à la fin du fichier.
+ Tapez gg pour vous déplacer au début du fichier.
+
+ 3. Tapez le numéro de la ligne où vous étiez suivi de G . Cela vous
+ ramènera à la ligne où vous étiez au départ quand vous aviez appuyé
+ CTRL-G.
+
+ 4. Si vous vous sentez prêt à faire ceci, effectuez les étapes 1 à 3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 4.2 : LA RECHERCHE
+
+
+ ** Tapez / suivi d'un texte pour rechercher ce texte. **
+
+ 1. Tapez le caractère / en mode Normal. Notez que celui-ci et le curseur
+ apparaissent en bas de l'écran, comme lorsque l'on utilise : .
+
+ 2. Puis tapez 'errreuur' <Entrée>. C'est le mot que vous voulez rechercher.
+
+ 3. Pour rechercher à nouveau le même texte, tapez simplement n .
+ Pour rechercher le même texte dans la direction opposée, tapez N .
+
+ 4. Pour rechercher une phrase dans la direction opposée, utilisez ?
+ au lieu de / .
+
+---> erreur ne s'écrit pas "errreuur" ; errreuur est une erreur.
+
+NOTE : Quand la recherche atteint la fin du fichier, elle reprend au début
+ sauf si l'option 'wrapscan' est désactivée.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 4.3 : RECHERCHE DES PARENTHÈSES CORRESPONDANTES
+
+
+ ** Tapez % pour trouver des ), ] ou } correspondants. **
+
+ 1. Placez le curseur sur l'un des (, [ ou { de la ligne marquée --->
+ ci-dessous.
+
+ 2. Puis tapez le caractère % .
+
+ 3. Le curseur se déplacera sur la parenthèse ou crochet correspondant.
+
+ 4. Tapez % pour replacer le curseur sur la parenthèse ou crochet
+ correspondant.
+
+ 5. Déplacez le curseur sur un autre (,),[,],{ ou } et regardez ce que
+ fait % .
+
+---> Voici ( une ligne de test contenant des (, des [ ] et des { } )).
+
+NOTE : Cette fonctionnalité est très utile lors du débogage d'un programme qui
+ contient des parenthèses déséquilibrées !
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 4.4 : LA COMMANDE DE SUBSTITUTION
+
+
+ ** Tapez :s/ancien/nouveau/g pour remplacer 'ancien' par 'nouveau'. **
+
+ 1. Déplacez le curseur sur la ligne marquée ---> ci-dessous.
+
+ 2. Tapez :s/lee/le <Entrée> . Notez que cette commande change seulement la
+ première occurrence de "lee" dans la ligne.
+
+ 3. Puis tapez :s/lee/le/g . L'ajout du drapeau g ordonne de faire une
+ substitution globale sur la ligne, et change toutes les occurrences de
+ "lee" sur la ligne.
+
+---> lee meilleur moment pour regarder lees fleurs est pendant lee printemps.
+
+ 4. Pour changer toutes les occurrences d'un texte, entre deux lignes,
+ tapez :#,#s/ancien/nouveau/g où #,# sont les numéros de lignes de la
+ plage où la substitution doit être faite.
+ Tapez :%s/ancien/nouveau/g pour changer toutes les occurrences dans
+ tout le fichier.
+ Tapez :%s/ancien/nouveau/gc pour trouver toutes les occurrences dans
+ tout le fichier avec une invite pour
+ confirmer ou infirmer chaque substitution.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RÉSUMÉ DE LA LEÇON 4
+
+
+ 1. CTRL-G affiche la position dans le fichier et l'état de celui-ci.
+ G déplace à la fin du fichier.
+ nombre G déplace au numéro de ligne.
+ gg déplace à la première ligne.
+
+ 2. Taper / suivi d'un texte recherche ce texte vers l'AVANT.
+ Taper ? suivi d'un texte recherche ce texte vers l'ARRIÈRE.
+ Après une recherche tapez n pour trouver l'occurrence suivante dans la
+ même direction ou Maj-N pour rechercher dans la direction opposée.
+
+ 3. Taper % lorsque le curseur est sur (, ), [, ], { ou } déplace
+ celui-ci sur le caractère correspondant.
+
+ 4. Pour remplacer le premier aa par bb sur une ligne tapez :s/aa/bb
+ Pour remplacer tous les aa par bb sur une ligne tapez :s/aa/bb/g
+ Pour remplacer du texte entre deux numéros de ligne tapez :#,#s/aa/bb/g
+ Pour remplacer toutes les occurrences dans le fichier tapez :%s/aa/bb/g
+ Pour demander une confirmation à chaque fois ajoutez 'c' :%s/aa/bb/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 5.1 : COMMENT EXÉCUTER UNE COMMANDE EXTERNE
+
+
+ ** Tapez :! suivi d'une commande externe pour exécuter cette commande. **
+
+ 1. Tapez le : familier pour mettre le curseur en bas de l'écran. Cela vous
+ permet de saisir une commande.
+
+ 2. Puis tapez un ! (point d'exclamation). Cela vous permet d'exécuter
+ n'importe quelle commande valide pour votre interpréteur (shell).
+
+ 3. Par exemple, tapez ls après le ! et appuyez <Entrée>. Ceci affichera
+ la liste des fichiers du répertoire courant, comme si vous aviez tapé la
+ commande à l'invite du shell. Utilisez :!dir si :!ls ne marche pas.
+
+NOTE : Il est possible d'exécuter n'importe quelle commande externe de cette
+ manière, avec ou sans argument.
+
+NOTE : Toutes les commandes : doivent finir par la frappe de <Entrée>.
+ À partir de maintenant, nous ne le mentionnerons plus.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 5.2 : PLUS DE DÉTAILS SUR L'ENREGISTREMENT DE FICHIERS
+
+
+ ** Pour enregistrer les changements faits au texte, tapez :w FICHIER . **
+
+ 1. Tapez :!dir ou :!ls pour avoir la liste des fichiers dans le
+ répertoire courant. Vous savez déjà qu'il faut appuyer <Entrée> après
+ cela.
+
+ 2. Choisissez un nom de fichier qui n'existe pas encore, par exemple TEST.
+
+ 3. Puis tapez :w TEST (où TEST est le nom que vous avez choisi).
+
+ 4. Cela enregistre tout le fichier (Tutoriel Vim) sous le nom TEST.
+ Pour le vérifier, tapez :!dir ou :!ls de nouveau pour revisualiser
+ votre répertoire.
+
+NOTE : Si vous quittez Vim et le redémarrez de nouveau avec le fichier TEST,
+ celui-ci sera une copie exacte de ce cours au moment où vous l'avez
+ enregistré.
+
+ 5. Maintenant, effacez le fichier en tapant (Windows) : :!del TEST
+ ou (Unix) : :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 5.3 : SÉLECTION DU TEXTE À ENREGISTRER
+
+
+ ** Pour enregistrer une portion du fichier,
+ tapez : v déplacement :w FICHIER **
+
+ 1. Déplacez le curseur sur cette ligne.
+
+ 2. Appuyez v et déplacez le curseur vers la cinquième ligne plus bas.
+ Remarquez que le texte est en surbrillance.
+
+ 3. Appuyez : . En bas de l'écran :'<,'> va apparaître.
+
+ 4. Tapez w TEST , où TEST est un nom de fichier qui n'existe pas.
+ Vérifiez que vous voyez :'<,'>w TEST avant d'appuyer sur <Entrée>.
+
+ 5. Vim va enregistrer les lignes sélectionnées dans le fichier TEST.
+ Utilisez :!dir ou :!ls pour le voir. Ne l'effacez pas encore !
+ Nous allons l'utiliser dans la leçon suivante.
+
+NOTE : L'appui de v démarre la sélection Visuelle. Vous pouvez déplacer le
+ curseur pour agrandir ou rétrécir la sélection. Puis vous pouvez
+ utiliser un opérateur pour faire quelque chose sur le texte. Par
+ exemple, d efface le texte.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 5.4 : RÉCUPÉRATION ET FUSION DE FICHIERS
+
+
+ ** Pour insérer le contenu d'un fichier, tapez :r FICHIER **
+
+ 1. Placez le curseur juste au-dessus de cette ligne.
+
+NOTE : Après avoir exécuté l'étape 2 vous verrez du texte de la Leçon 5.3.
+ Puis déplacez-vous vers le bas pour voir cette leçon à nouveau.
+
+ 2. Maintenant récupérez votre fichier TEST en utilisant la commande :r TEST
+ où TEST est le nom de votre fichier.
+ Le fichier que vous récupérez est placé au-dessous de la ligne du curseur.
+
+ 3. Pour vérifier que le fichier a bien été inséré, remontez et vérifiez
+ qu'il y a maintenant deux copies de la Leçon 5.3, l'originale et celle
+ contenue dans le fichier.
+
+NOTE : Vous pouvez aussi lire la sortie d'une commande externe. Par exemple,
+ :r !ls lit la sortie de la commande ls et la place sous la ligne du
+ curseur.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RÉSUMÉ DE LA LEÇON 5
+
+
+ 1. :!commande exécute une commande externe.
+
+ Quelques exemples pratiques :
+ (Windows) (Unix)
+ :!dir :!ls affiche le contenu du répertoire courant.
+ :!del FICHIER :!rm FICHIER efface FICHIER.
+
+ 2. :w FICHIER enregistre le fichier Vim courant sur le disque avec pour
+ nom FICHIER.
+
+ 3. v déplacement :w FICHIER sauvegarde les lignes de la sélection Visuelle
+ dans le fichier FICHIER.
+
+ 4. :r FICHIER récupère le contenu du fichier FICHIER et l'insère sous la
+ position du curseur.
+
+ 5. :r !dir lit la sortie de la commande dir et l'insère sous la position
+ du curseur.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 6.1 : LA COMMANDE D'OUVERTURE
+
+
+** Tapez o pour ouvrir une ligne sous le curseur et y aller en Insertion. **
+
+ 1. Déplacez le curseur sur la ligne marquée ---> ci-dessous.
+
+ 2. Tapez la lettre o minuscule pour ouvrir une ligne SOUS le curseur et
+ vous y placer en mode Insertion.
+
+ 3. Puis tapez du texte et appuyez <Échap> pour sortir du mode Insertion.
+
+---> En tapant o le curseur se met sur la ligne ouverte, en mode Insertion.
+
+ 4. Pour ouvrir une ligne au-DESSUS du curseur, tapez simplement un O
+ majuscule, plutôt qu'un o minuscule. Faites un essai sur la ligne
+ ci-dessous.
+
+---> Ouvrez une ligne ci-dessus en tapant O lorsque le curseur est ici.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 6.2 : LA COMMANDE D'AJOUT
+
+
+ ** Tapez a pour insérer du texte APRÈS le curseur. **
+
+ 1. Placez le curseur au début de la ligne marquée ---> ci-dessous.
+
+ 2. Appuyez e jusqu'à ce que le curseur soit sur la fin de li .
+
+ 3. Appuyez a (minuscule) pour ajouter du texte APRÈS le curseur.
+
+ 4. Complétez le mot comme dans la ligne dessous. Appuyez <Échap> pour
+ sortir du mode Insertion.
+
+ 5. Utilisez e pour vous déplacer vers le mot incomplet suivant et
+ répétez les étapes 3 et 4.
+
+---> Cette li vous perm de pratiq l'ajout de t dans une ligne.
+---> Cette ligne vous permet de pratiquer l'ajout de texte dans une ligne.
+
+NOTE : a, i, A vont tous dans le même mode Insertion, la seule différence
+ est l'endroit où les caractères sont insérés.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 6.3 : UNE AUTRE MANIÈRE DE REMPLACER
+
+
+ ** Tapez un R majuscule pour remplacer plus d'un caractère. **
+
+ 1. Déplacez le curseur sur la première ligne marquée ---> ci-dessous.
+ Déplacez le curseur sur le début du premier xxx .
+
+ 2. Appuyez maintenant R et tapez le nombre dessous dans la deuxième ligne,
+ de manière à remplacer le xxx .
+
+ 3. Appuyez <Échap> pour quitter le mode Remplacement. Notez que le reste de
+ la ligne demeure inchangé.
+
+ 4. Répétez les étapes pour remplacer les xxx restants.
+
+
+---> L'ajout de 123 à xxx donne xxx.
+---> L'ajout de 123 à 456 donne 579.
+
+NOTE : Le mode Remplacement est comme le mode Insertion, mais tous les
+ caractères tapés effacent un caractère existant.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 6.4 : COPIER ET COLLER DU TEXTE
+
+
+ ** Utilisez l'opérateur y pour copier du texte et p pour le coller **
+
+ 1. Allez à la ligne marquée ---> ci-dessous et placez le curseur après "a)".
+
+ 2. Démarrez le mode Visuel avec v et déplacez le curseur juste devant
+ "premier".
+
+ 3. Tapez y pour copier le texte en surbrillance.
+
+ 4. Déplacez le curseur à la fin de la ligne suivante : j$
+
+ 5. Tapez p pour coller le texte. Puis tapez : un second <Échap> .
+
+ 6. Utilisez le mode Visuel pour sélectionner "élément", copiez-le avec y ,
+ déplacez-vous à la fin de la ligne suivante avec j$ et collez le texte
+ à cet endroit avec p .
+
+---> a) ceci est le premier élément.
+ b)
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 6.5 : RÉGLAGE DES OPTIONS
+
+
+ ** Réglons une option afin que la recherche et la substitution ignorent la
+ casse des caractères. **
+
+ 1. Recherchez 'ignore' en tapant : /ignore <Entrée>
+ Répétez ceci plusieurs fois en utilisant la touche n .
+
+ 2. Activez l'option 'ic' (ignorer casse) en tapant :set ic .
+
+ 3. Puis cherchez 'ignore' de nouveau en utilisant n .
+ Remarquez que Ignore et IGNORE sont maintenant aussi trouvés.
+
+ 4. Activez les options 'hlsearch' et 'incsearch' avec :set hls is .
+
+ 5. Puis recommencez une recherche, et faites bien attention à ce qui se
+ produit : /ignore <Entrée>
+
+ 6. Pour désactiver 'ignorer casse', entrez : :set noic
+
+NOTE : Pour enlever la surbrillance des résultats, entrez : :nohlsearch
+
+NOTE : Si vous voulez ignorer la casse uniquement pour une recherche, utilisez
+ \c dans la phrase : /ignore\c <Entrée>
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RÉSUMÉ DE LA LEÇON 6
+
+
+ 1. Taper o ouvre une ligne SOUS le curseur et démarre le mode Insertion.
+ Taper O ouvre une ligne au-DESSUS du curseur.
+
+ 2. Taper a pour insérer du texte APRÈS le curseur.
+ Taper A pour insérer du texte après la fin de ligne.
+
+ 3. Taper e déplace à la fin du mot.
+
+ 4. Taper y copie du texte, p le colle.
+
+ 5. Taper R majuscule active le mode Remplacement jusqu'à ce qu' <Échap>
+ soit appuyé.
+
+ 6. Taper ":set xxx" active l'option "xxx". Quelques options sont :
+ 'ic' 'ignorecase' pour ignorer la casse lors des recherches.
+ 'is' 'incsearch' pour montrer les appariements partiels.
+ 'hls' 'hlsearch' pour mettre en surbrillance les appariements.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 7.1 : OBTENIR DE L'AIDE
+
+
+ ** Utiliser le système d'aide en ligne. **
+
+ Vim a un système complet d'aide en ligne. Pour y accéder, essayez l'une de
+ ces trois méthodes :
+ - appuyez la touche <Help> (si vous en avez une)
+ - appuyez la touche <F1> (si vous en avez une)
+ - tapez :help <Entrée>
+
+
+ Lisez le texte dans la fenêtre d'aide pour savoir comment fonctionne l'aide.
+ Tapez CTRL-W CTRL-W pour sauter d'une fenêtre à l'autre.
+ Tapez :q <Entrée> pour fermer la fenêtre d'aide.
+
+ Vous pouvez accéder à l'aide sur à peu près n'importe quel sujet en donnant
+ des arguments à la commande :help . Essayez par exemple (n'oubliez pas
+ d'appuyer sur <Entrée>) :
+
+ :help w
+ :help c_CTRL-D
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 7.2 : CRÉER UN SCRIPT DE DÉMARRAGE
+
+ ** Activer les fonctionnalités de Vim. **
+
+ Vim a beaucoup plus de fonctionnalités que Vi, mais la plupart de celles-ci
+ sont désactivées par défaut. Pour commencer à les utiliser, vous devez
+ créer un fichier "vimrc".
+
+ 1. Commencez à éditer le fichier "vimrc". Ceci dépend de votre système :
+ :edit ~/.vimrc pour Unix
+ :edit ~/_vimrc pour Windows
+
+ 2. Lisez maintenant le fichier d'exemple "vimrc" :
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Enregistrez le fichier avec :
+ :w
+
+ La prochaine fois que vous démarrerez Vim, la coloration syntaxique sera
+ activée. Vous pouvez ajouter tous vos réglages préférés dans ce fichier
+ "vimrc". Pour plus d'informations, tapez :help vimrc-intro
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leçon 7.3 : COMPLÈTEMENT
+
+
+ ** Complètement de ligne de commande avec CTRL-D et <TAB> **
+
+ 1. Mettez Vim soit en mode non compatible : set nocp
+
+ 2. Regardez quels fichiers existent dans le répertoire : !ls ou !dir
+
+ 3. Tapez le début d'une commande : :e
+
+ 4. Appuyez CTRL-D et Vim affichera une liste de commandes qui commencent
+ par "e".
+
+ 5. Appuyez d<TAB> et Vim complétera le nom de la commande : ":edit"
+
+ 6. Ajoutez maintenant un espace et le début d'un fichier existant :
+ :edit FIC
+
+ 7 Appuyez <TAB>. Vim va compléter le nom (s'il est unique).
+
+NOTE : Le complètement fonctionne pour de nombreuses commandes. Essayez
+ d'appuyer CTRL-D et <TAB>. C'est utile en particulier pour :help .
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RÉSUMÉ DE LA LEÇON 7
+
+
+ 1. Tapez :help ou appuyez <F1> ou <Aide> pour ouvrir la fenêtre d'aide.
+
+ 2. Tapez :help cmd pour trouver l'aide sur cmd .
+
+ 3. Tapez CTRL-W CTRL-W pour sauter à une autre fenêtre.
+
+ 4. Tapez :q pour fermer la fenêtre d'aide.
+
+ 5. Créez un script de démarrage vimrc pour conserver vos réglages préférés.
+
+ 6. Quand vous tapez une commande : appuyez CTRL-D pour voir les
+ complètements possibles. Appuyez <TAB> pour utiliser un complètement.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Ceci conclut le Tutoriel Vim. Le but était de vous donner un bref aperçu de
+ l'éditeur Vim, juste assez pour vous permettre d'utiliser l'éditeur
+ relativement facilement. Il est loin d'être complet, vu que Vim a beaucoup
+ plus de commandes. Un Manuel de l'utilisateur est disponible en anglais :
+ :help user-manual
+
+ Pour continuer à découvrir et à apprendre Vim, il existe un livre traduit en
+ français. Il parle plus de Vi que de Vim, mais pourra vous être utile.
+ L'éditeur Vi - Collection Précis et concis - par Arnold Robbins
+ Éditeur : O'Reilly France
+ ISBN : 2-84177-102-4
+
+ Deux livres en anglais sont également mentionnés dans la version originale
+ de ce tutoriel, dont un qui traite spécifiquement de Vim. Merci de vous y
+ référer si vous êtes intéressés.
+
+ Ce tutoriel a été écrit par Michael C. Pierce et Robert K. Ware de l'École
+ des Mines du Colorado et reprend des idées fournies par Charles Smith,
+ Université d'État du Colorado. E-mail : bware@mines.colorado.edu.
+
+ Modifié pour Vim par Bram Moolenaar.
+ Traduit en français par Adrien Beau, en avril 2001.
+ Dernières mises à jour par Dominique Pellé.
+
+ E-mail : dominique.pelle@gmail.com
+ Last Change : 2018 Dec 2
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.hr b/runtime/tutor/tutor.hr
new file mode 100644
index 0000000..fced374
--- /dev/null
+++ b/runtime/tutor/tutor.hr
@@ -0,0 +1,972 @@
+===============================================================================
+= D o b r o d o l i u VIM p r i r u n i k - Verzija 1.7 =
+===============================================================================
+
+ Vim je vrlo moan editor koji ima mnogo naredbi, previe da bi ih
+ se svih ovdje spomenulo. Namjena prirunika je objasniti dovoljno
+ naredbi kako bi poetnici znatno lake koristili ovaj svestran editor.
+
+ Priblino vrijeme potrebno za uspjean zavretak prirunika je oko
+ 30 minuta a ovisi o tome koliko e te vremena odvojiti za vjebanje.
+
+ UPOZORENJE:
+ Naredbe u ovom priruniku e promijeniti ovaj tekst.
+ Napravite kopiju ove datoteke kako bi ste na istoj vjebali
+ (ako ste pokrenuli "vimtutor" ovo je ve kopija).
+
+ Vrlo je vano primijetiti da je ovaj prirunik namijenjen za vjebanje.
+ Preciznije, morate izvriti naredbe u Vim-u kako bi ste iste nauili
+ pravilno koristiti. Ako samo itate tekst, zaboraviti e te naredbe!
+
+ Ako je CapsLock ukljuen ISKLJUITE ga. Pritiskajte tipku j kako
+ bi pomakli kursor sve dok Lekcija 1.1 ne ispuni ekran.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.1: POMICANJE KURSORA
+
+
+ ** Za pomicanje kursora, pritisnite h,j,k,l tipke kako je prikazano **
+ ^
+ k Savjet: h tipka je lijevo i pomie kursor lijevo.
+ < h l > l tipka je desno i pomie kursor desno.
+ j j izgleda kao strelica usmjerena dolje.
+ v
+ 1. Pomiite kursor po ekranu dok se ne naviknete na koritenje.
+
+ 2. Drite tipku (j) pritisnutom.
+ Sada znate kako doi do sljedee lekcije.
+
+ 3. Koristei tipku j prijeite na sljedeu lekciju 1.2.
+
+NAPOMENA: Ako niste sigurni to ste zapravo pritisnuli uvijek koristite
+ tipku <ESC> kako bi preli u Normal mod i onda pokuajte ponovno.
+
+NAPOMENA: Kursorske tipke rade isto. Koritenje hjkl tipaka je znatno
+ bre, nakon to se jednom naviknete na njihovo koritenje. Stvarno!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.2: IZLAZ IZ VIM-a
+
+
+ !! UPOZORENJE: Prije izvoenja bilo kojeg koraka,
+ proitajte cijelu lekciju!!
+
+ 1. Pritisnite <ESC> tipku (Vim je sada u Normal modu).
+
+ 2. Otipkajte: :q! <ENTER>.
+ Izlaz iz editora, GUBE se sve napravljene promjene.
+
+ 3. Kada se pojavi ljuska, utipkajte naredbu koja je pokrenula
+ ovaj prirunik: vimtutor <ENTER>
+
+ 4. Ako ste upamtili ove korake, izvrite ih redom od 1 do 3
+ kako bi ponovno pokrenuli editor.
+
+NAPOMENA: :q! <ENTER> ponitava sve promjene koje ste napravili.
+ U sljedeim lekcijama nauit e te kako promjene sauvati.
+
+ 5. Pomaknite kursor na Lekciju 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.3: PROMJENA TEKSTA - BRISANJE
+
+
+ ** Pritisnite x za brisanje znaka pod kursorom. **
+
+ 1. Pomaknite kursor na liniju oznaenu s --->.
+
+ 2. Kako bi ste ispravili pogreke, pomiite kursor dok se
+ ne bude nalazio na slovu kojeg trebate izbrisati.
+
+ 3. Pritisnite tipku x kako bi uklonili neeljeno slovo.
+
+ 4. Ponovite korake od 2 do 4 dok ne ispravite sve pogreke.
+
+---> KKKravaa jee presskoila mmjeseccc.
+
+ 5. Nakon to ispravite liniju, prijeite na lekciju 1.4.
+
+NAPOMENA: Koristei ovaj prirunik ne pokuavajte pamtiti
+ ve uite primjenom.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.4: PROMJENA TEKSTA - UBACIVANJE
+
+
+ ** Pritisnite i za ubacivanje teksta ispred kursora. **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 2. Kako bi napravili prvu liniju istovjetnoj drugoj, pomaknite
+ kursor na prvi znak POSLIJE kojeg e te utipkati potreban tekst.
+
+ 3. Pritisnite i te utipkajte potrebne nadopune.
+
+ 4. Nakon to ispravite pogreku pritisnite <ESC> kako bi vratili Vim
+ u Normal mod. Ponovite korake od 2 do 4 kako bi ispravili sve pogreke.
+
+---> Nedje no teka od v lin.
+---> Nedostaje neto teksta od ove linije.
+
+ 5. Prijeite na sljedeu lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.5: PROMJENA TEKSTA - DODAVANJE
+
+
+ ** Pritisnite A za dodavanje teksta. **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+ Nije vano na kojem se slovu nalazi kursor na toj liniji.
+
+ 2. Pritisnite A i napravite potrebne promjene.
+
+ 3. Nakon to ste dodali tekst, pritisnite <ESC>
+ za povratak u Normal mod.
+
+ 4. Pomaknite kursor na drugu liniju oznaenu s --->
+ i ponovite korake 2 i 3 dok ne popravite tekst.
+
+---> Ima neto teksta koji nedostaje n
+ Ima neto teksta koji nedostaje na ovoj liniji.
+---> Ima neto teksta koji ne
+ Ima neto teksta koji nedostaje ba ovdje.
+
+ 5. Prijeite na lekciju 1.6.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.6: PROMJENA DATOTEKE
+
+
+ ** Koristite :wq za spremanje teksta i naputanje Vim-a. **
+
+ !! UPOZORENJE: Prije izvravanja bilo kojeg koraka, proitajte lekciju!!
+
+ 1. Izaite iz programa kao sto ste napravili u lekciji 1.2: :q!
+
+ 2. Iz ljuske utipkajte sljedeu naredbu: vim tutor <ENTER>
+ 'vim' je naredba pokretanja Vim editora, 'tutor' je ime datoteke koju
+ elite ureivati. Koristite datoteku koju imate ovlasti mijenjati.
+
+ 3. Ubacite i izbriite tekst kao to ste to napravili u lekcijama prije.
+
+ 4. Sauvajte promjenjeni tekst i izaite iz Vim-a: :wq <ENTER>
+
+ 5. Ponovno pokrenite vimtutor i nastavite itati saetak koji sljedi.
+
+ 6. Nakon sto proitate gornje korake i u potpunosti ih razumijete:
+ izvrite ih.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1 SAETAK
+
+
+ 1. Kursor se pomie strelicama ili pomou hjkl tipaka.
+ h (lijevo) j (dolje) k (gore) l (desno)
+
+ 2. Pokretanje Vim-a iz ljuske: vim IME_DATOTEKE <ENTER>
+
+ 3. Izlaz: <ESC> :q! <ENTER> sve promjene su izgubljene.
+ ILI: <ESC> :wq <ENTER> promjene su sauvane.
+
+ 4. Brisanje znaka na kojem se nalazi kursor: x
+
+ 5. Ubacivanja ili dodavanje teksta:
+ i utipkajte tekst <ESC> unos ispred kursora
+ A utipkajte tekst <ESC> dodavanje na kraju linije
+
+NAPOMENA: Tipkanjem tipke <ESC> prebacuje Vim u Normal mod i
+ prekida neeljenu ili djelomino zavrenu naredbu.
+
+Nastavite itati Lekciju 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.1: NAREDBE BRISANJA
+
+
+ ** Tipkajte dw za brisanje rijei. **
+
+ 1. Pritisnite <ESC> kako bi bili sigurni da je Vim u Normal modu.
+
+ 2. Pomaknite kursor na liniju oznaenu s --->.
+
+ 3. Pomaknite kursor na poetak rijei koju treba izbrisati.
+
+ 4. Otipkajte dw kako bi uklonili rije.
+
+NAPOMENA: Vim e prikazati slovo d na zadnjoj liniji kad ga otipkate.
+ Vim eka da otipkate w . Ako je prikazano neko drugo slovo,
+ krivo ste otipkali; pritisnite <ESC> i pokuajte ponovno.
+
+---> Neke rijei smijeno ne pripadaju na papir ovoj reenici.
+
+ 5. Ponovite korake 3 i 4 dok ne ispravite reenicu;
+ prijeite na Lekciju 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.2: JO BRISANJA
+
+
+ ** Otipkajte d$ za brisanje znakova do kraja linije. **
+
+ 1. Pritisnite <ESC> kako bi bili
+ sigurni da je Vim u Normal modu.
+
+ 2. Pomaknite kursor na liniju oznaenu s --->.
+
+ 3. Pomaknite kursor do kraja ispravne reenice
+ (POSLJE prve . ).
+
+ 4. Otipkajte d$
+ kako bi izbrisali sve znakove do kraja linije.
+
+---> Netko je utipkao kraj ove linije dvaput. kraj ove linije dvaput.
+
+ 5. Prijeite na Lekciju 2.3 za bolje objanjenje.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.3: UKRATKO O OPERATORIMA I POKRETIMA
+
+
+ Mnogo naredbi koje mijenjaju tekst se sastoje od operatora i pokreta.
+ Oblik naredbe brisanja sa d operatorom je sljedei:
+
+ d pokret
+
+ Pri emu je:
+ d - operator brisanja.
+ pokret - ono na emu e se operacija izvravati (navedeno u nastavku).
+
+ Kratka lista pokreta:
+ w - sve do poetka sljedee rijei, NE UKLJUUJUI prvo slovo.
+ e - sve do kraja trenutane rijei, UKLJUUJUI zadnje slovo.
+ $ - sve do kraje linije, UKLJUUJUI zadnje slovo.
+
+ Tipkanjem de e se brisati od kursora do kraja rijei.
+
+NAPOMENA: Pritiskajui samo pokrete dok ste u Normal modu bez operatora e
+ pomicati kursor kao to je navedeno.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.4: KORITENJE BROJANJA ZA POKRETE
+
+
+ ** Tipkanjem nekog broja prije pokreta, pokret se izvrava toliko puta. **
+
+ 1. Pomaknite kursor na liniju oznaenu s --->.
+
+ 2. Otipkajte 2w da pomaknete kursor dvije rijei naprijed.
+
+ 3. Otipkajte 3e da pomaknete kursor na kraj tree rijei naprijed.
+
+ 4. Otipkajte 0 (nulu) da pomaknete kursor na poetak linije.
+
+ 5. Ponovite korake 2 i 3 s nekim drugim brojevima.
+
+---> Reenica sa rijeima po kojoj moete pomicati kursor.
+
+ 6. Prijeite na Lekciju 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.5: KORITENJE BROJANJA ZA VEE BRISANJE
+
+
+ ** Tipkanje broja N s operatorom ponavlja ga N-puta. **
+
+ U kombinaciji operatora brisanja i pokreta spomenutih iznad
+ ubacujete broj prije pokreta kako bi izbrisali vie znakova:
+
+ d broj pokret
+
+ 1. Pomaknite kursor na prvo slovo u rijei sa VELIKIM SLOVIMA
+ oznaenu s --->.
+
+ 2. Otipkajte 2dw da izbriete dvije rijei sa VELIKIM SLOVIMA
+
+ 3. Ponovite korake 1 i 2 sa razliitim brojevima da izbriete
+ uzastopne rijei sa VELIKIM SLOVIMA sa samo jednom naredbom.
+
+---> ova ABC DE linija FGHI JK LMN OP rijei je RS TUVZ popravljena.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.6: OPERIRANJE NAD LINIJAMA
+
+
+ ** Otipkajte dd za brisanje cijele linije. **
+
+ Zbog uestalosti brisanja cijelih linija, dizajneri Vi-a su odluili da
+ je lake brisati linije tipkanjem d dvaput.
+
+ 1. Pomaknite kursor na drugu liniju u donjoj kitici.
+ 2. Otipkajte dd kako bi izbrisali liniju.
+ 3. Pomaknite kursor na etvrtu liniju.
+ 4. Otipkajte 2dd kako bi izbrisali dvije linije.
+
+---> 1) Rue su crvene,
+---> 2) Plaa je super,
+---> 3) Ljubice su plave,
+---> 4) Imam auto,
+---> 5) Satovi ukazuju vrijeme,
+---> 6) eer je sladak
+---> 7) Kao i ti.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.7: NAREDBA PONITENJA
+
+
+ ** Pritisnite u za ponitenje zadnje naredbe, U za cijelu liniju. **
+
+ 1. Pomaknite kursor na liniju oznaenu s ---> i postavite kursor na prvu
+ pogreku.
+ 2. Otipkajte x kako bi izbrisali prvi neeljeni znak.
+ 3. Otipkajte u kako bi ponitili zadnju izvrenu naredbu.
+ 4. Ovaj put ispravite sve pogreke na liniji koristei x naredbu.
+ 5. Sada utipkajte veliko U kako bi ponitili sve promjene
+ na liniji, vraajui je u prijanje stanje.
+ 6. Sada utipkajte u nekoliko puta kako bi ponitili U
+ i prijanje naredbe.
+ 7. Sada utipkajte CTRL-R (drei CTRL tipku pritisnutom dok
+ ne pritisnete R) nekoliko puta kako bi vratili promjene
+ (ponitili ponitenja).
+
+---> Poopravite pogreke nna ovvoj liniji ii poonititeee ih.
+
+ 8. Vrlo korisne naredbe. Prijeite na saetak Lekcije 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2 SAETAK
+
+
+ 1. Brisanje od kursora do sljedee rijei: dw
+ 2. Brisanje od kursora do kraja linije: d$
+ 3. Brisanje cijele linije: dd
+
+ 4. Za ponavljanje pokreta prethodite mu broj: 2w
+ 5. Oblik naredbe mijenjanja:
+ operator [broj] pokret
+ gdje je:
+ operator - to napraviti, npr. d za brisanje
+ [broj] - neobavezan broj ponavljanja pokreta
+ pokret - kretanje po tekstu po kojem se operira,
+ kao to je: w (rije), $ (kraj linije), itd.
+
+ 6. Postavljanje kursora na poetak linije: 0
+
+ 7. Za ponitenje prethodnih promjena, pritisnite: u (malo u)
+ Za ponitenje svih promjena na liniji, pritisnite: U (veliko U)
+ Za vraanja promjena, utipkajte: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.1: NAREDBA POSTAVI
+
+
+ ** p za unos prethodno izbrisanog teksta iza kursora. **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 2. Otipkajte dd kako bi izbrisali liniju i spremili je u Vim registar.
+
+ 3. Pomaknite kursor na liniju c), IZNAD linije koju trebate unijeti.
+
+ 4. Otipkajte p kako bi postavili liniju ispod kursora.
+
+ 5. Ponovite korake 2 do 4 kako bi postavili sve linije u pravilnom
+ rasporedu.
+
+---> d) Moe li i ti nauiti?
+---> b) Ljubice su plave,
+---> c) Inteligencija je nauena,
+---> a) Rue su crvene,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.2: NAREDBA PROMJENE
+
+
+ ** Otipkajte rx za zamjenu slova ispod kursora sa slovom x . **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 2. Pomaknite kursor tako da se nalazi na prvoj pogreci.
+
+ 3. Otipkajte r i nakon toga ispravan znak na tom mjestu.
+
+ 4. Ponovite korake 2 i 3 sve dok prva
+ linije ne bude istovjetna drugoj.
+
+---> Kede ju ovu limija tupjana, natko je protuskao kruve tupke!
+---> Kada je ova linija tipkana, netko je pritiskao krive tipke!
+
+ 5. Prijeite na Lekciju 3.2.
+
+NAPOMENA: Prisjetite da trebate uiti vjebanjem, ne pamenjem.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.3: OPERATOR MIJENJANJA
+
+
+ ** Za mijenjanje do kraja rijei, istipkajte ce . **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 2. Postavite kursor na a u lackmb.
+
+ 3. Otipkajte ce i ispravite rije (u ovom sluaju otipkajte inija ).
+
+ 4. Pritisnite <ESC> i pomaknite kursor na sljedei znak
+ kojeg je potrebno ispraviti.
+
+ 5. Ponovite korake 3 i 4 sve dok prva reenica ne postane istovjetna
+ drugoj.
+
+---> Ova lackmb ima nekoliko rjlcah koje trfcb mijdmlfsz.
+---> Ova linija ima nekoliko rijei koje treba mijenjati.
+
+Primijetite da ce brie rije i postavlja Vim u Insert mod.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.4: JO MIJENJANJA KORITENJEM c
+
+
+ ** Naredba mijenjanja se koristi sa istim pokretima kao i brisanje. **
+
+ 1. Operator mijenjanja se koristi na isti nain kao i operator brisanja:
+
+ c [broj] pokret
+
+ 2. Pokreti su isti, npr: w (rije) i $ (kraj linije).
+
+ 3. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 4. Pomaknite kursor na prvu pogreku.
+
+ 5. Otipkajte c$ i utipkajte ostatak linije tako da bude istovjetna
+ drugoj te pritisnite <ESC>.
+
+---> Kraj ove linije treba pomo tako da izgleda kao linija ispod.
+---> Kraj ove linije treba ispraviti koritenjem c$ naredbe.
+
+NAPOMENA: Moete koristiti Backspace za ispravljanje greaka.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3 SAETAK
+
+
+ 1. Za postavljanje teksta koji je upravo izbrisan, pritisnite p . Ovo
+ postavlja tekst IZA kursora (ako je pak linija izbrisana tekst se
+ postavlja na liniju ispod kursora).
+
+ 2. Za promjenu znaka na kojem se nalazi kursor, pritisnite r i nakon toga
+ eljeni znak.
+
+ 3. Operator mijenjanja dozvoljava promjenu teksta od kursora do pozicije do
+ koje dovede pokret. tj. Otipkajte ce za mijenjanje od kursora do kraja
+ rijei, c$ za mijenjanje od kursora do kraja linije.
+
+ 4. Oblik naredbe mijenjanja:
+
+ c [broj] pokret
+
+Prijeite na sljedeu lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.1: POZICIJA KURSORA I STATUS DATOTEKE
+
+ ** CTRL-G za prikaz pozicije kursora u datoteci i status datoteke.
+ Pritisnite G za pomicanje kursora na neku liniju u datoteci. **
+
+NAPOMENA: Proitajte cijelu lekciju prije izvrenja bilo kojeg koraka!!
+
+ 1. Drite Ctrl tipku pritisnutom i pritisnite g . Ukratko: CTRL-G.
+ Vim e ispisati poruku na dnu ekrana sa imenom datoteke i pozicijom
+ kursora u datoteci. Zapamtite broj linije za 3. korak.
+
+NAPOMENA: Moete vidjeti poziciju kursora u donjem desnom kutu ako
+ je postavka 'ruler' aktivirana (objanjeno u 6. lekciji).
+
+ 2. Pritisnite G za pomicanje kursora na kraj datoteke.
+ Otipkajte gg za pomicanje kursora na poetak datoteke.
+
+ 3. Otipkajte broj linije na kojoj ste bili maloprije i zatim G . Kursor
+ e se vratiti na liniju na kojoj se nalazio kada ste otipkali CTRL-G.
+
+ 4. Ako ste spremni, izvrite korake od 1 do 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.2: NAREDBE TRAENJA
+
+ ** Otipkajte / i nakon toga izraz kojeg elite traiti. **
+
+ 1. U Normal modu otipkajte / znak. Primijetite da se znak
+ pojavio zajedno sa kursorom na dnu ekrana kao kod : naredbe.
+
+ 2. Sada otipkajte 'grrrreka' <ENTER>. To je rije koju zapravo traite.
+
+ 3. Za ponovno traenje istog izraza, otipkajte n .
+ Za traenje istog izraza ali u suprotnom smjeru, otipkajte N .
+
+ 4. Za traenje izraza unatrag, koristite ? umjesto / .
+
+ 5. Za povratak na prethodnu poziciju koristite CTRL-O (drite Ctrl
+ pritisnutim dok ne pritisnete tipku o). Ponavljajte sve dok se ne
+ vratite na poetak. CTRL-I slino kao CTRL-O ali u suprotnom smjeru.
+
+---> "pogrrrreka" je pogreno; umjesto pogrrrreka treba stajati pogreka.
+
+NAPOMENA: Ako se traenjem doe do kraja datoteke nastavit e se od njenog
+ poetka osim ako je postavka 'wrapscan' deaktivirana.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.3: TRAENJE PRIPADAJUE ZAGRADE
+
+
+ ** Otipkajte % za pronalazak pripadajue ), ] ili } . **
+
+ 1. Postavite kursor na bilo koju od ( , [ ili {
+ otvorenih zagrada u liniji oznaenoj s --->.
+
+ 2. Otipkajte znak % .
+
+ 3. Kursor e se pomaknuti na pripadajuu zatvorenu zagradu.
+
+ 4. Otipkajte % kako bi pomakli kursor na drugu pripadajuu zagradu.
+
+ 5. Pomaknite kursor na neku od (,),[,],{ ili } i ponovite % naredbu.
+
+---> Linija ( testiranja obinih ( [ uglatih ] i { vitiastih } zagrada.))
+
+
+NAPOMENA: Vrlo korisno u ispravljanju koda sa nepripadajuim zagradama!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.4: NAREDBE ZAMIJENE
+
+
+ ** Otipkajte :s/staro/novo/g da zamijenite 'staro' za 'novo'. **
+
+ 1. Pomaknite kursor na liniju oznaenu s --->.
+
+ 2. Otipkajte :s/cvr/cvr <ENTER> . Primjetite da ova naredba zamjenjuje
+ samo prvi "cvr" u liniji.
+
+ 3. Otipkajte :s/cvr/cvr/g . Dodavanje g stavke znai da e se naredba
+ izvriti na cijeloj liniji, zamjenjivanjem svih "cvr" u liniji.
+
+---> i cvri cvri cvrak na voru crne smre.
+
+ 4. Za zamjenu svih izraza u rasponu dviju linija,
+ otipkajte :#,#s/staro/novo/g #,# su brojevi linije datoteke na kojima
+ te izmeu njih e se izvriti zamjena.
+ Otipkajte :%s/staro/novo/g za zamjenu svih izraza u cijeloj datoteci.
+ Otipkajte :%s/staro/novo/gc za pronalazak svakog izraza u datoteci i
+ potvrdu zamjene.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4 SAETAK
+
+
+ 1. CTRL-G prikazuje poziciju kursora u datoteci i status datoteke.
+ G postavlja kursor na zadnju liniju datoteke.
+ broj G postavlja kursor na broj liniju.
+ gg postavlja kursor na prvu liniju.
+
+ 2. Tipkanje / sa izrazom trai UNAPRIJED taj izraz.
+ Tipkanje ? sa izrazom trai UNATRAG taj izraz.
+ Nakon naredbe traenja koristite n za pronalazak izraza u istom
+ smjeru, i N za pronalazak istog izraza ali u suprotnom smjeru.
+ CTRL-O vraa kursor na prethodnu poziciju, CTRL-I na sljedeu poziciju.
+
+ 3. Tipkanje % dok je kursor na zagradi pomie ga na pripadajuu zagradu.
+
+ 4. Za zamjenu prvog izraza staro za izraz novo :s/staro/novo
+ Za zamjenu svih izraza staro na cijeloj liniji :s/staro/novo/g
+ Za zamjenu svih izraza staro u rasponu linija #,# :#,#s/staro/novo/g
+ Za zamjenu u cijeloj datoteci :%s/staro/novo/g
+ Za potvrdu svake zamjene dodajte 'c' :%s/staro/novo/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.1: IZVRAVANJE VANJSKIH NAREDBI
+
+
+ ** Otipkajte :! sa vanjskom naredbom koju elite izvriti. **
+
+ 1. Otipkajte poznatu naredbu : kako bi kursor premjestili na dno
+ ekrana. Time omoguavate unos naredbe u naredbenoj liniji.
+
+ 2. Otipkajte znak ! (usklinik). Tako omoguavate
+ izvravanje naredbe vanjske ljuske.
+
+ 3. Kao primjer otipkajte ls nakon ! te pritisnite <ENTER>.
+ Ovo e prikazati sadraj direktorija, kao da ste u ljusci.
+ Koristite :!dir ako :!ls ne radi.
+
+NAPOMENA: Mogue je izvravati bilo koju vanjsku naredbu na ovaj nain,
+ zajedno sa njenim argumentima.
+
+NAPOMENA: Sve : naredbe se izvravaju nakon to pritisnete <ENTER>
+ U daljnjem tekstu to nee uvijek biti napomenuto.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.2: VIE O SPREMANJU DATOTEKA
+
+ ** Za spremanje promjena, otipkajte :w IME_DATOTEKE. **
+
+ 1. Otipkajte :!dir ili :!ls za pregled direktorija.
+ Ve znate da morate pritisnuti <ENTER> na kraju tipkanja.
+
+ 2. Izaberite ime datoteke koja jo ne postoji, npr. TEST.
+
+ 3. Otipkajte: :w TEST (gdje je TEST ime koje ste prethodno odabrali.)
+
+ 4. Time e te spremiti cijelu datoteku (Vim Tutor) pod imenom TEST.
+ Za provjeru, otipkajte ponovno :!dir ili :!ls
+ za pregled direktorija.
+
+NAPOMENA: Ako bi napustili Vim i ponovno ga pokrenuli sa vim TEST ,
+ datoteka bi bila potpuna kopija ove datoteke u trenutku
+ kada ste je spremili.
+
+ 5. Izbriite datoteku tako da otipkate (MS-DOS): :!del TEST
+ ili (Unix): :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.3: SPREMANJE OZNAENOG TEKSTA
+
+
+ ** Kako bi spremili dio datoteke, otipkajte v pokret :w IME_DATOTEKE **
+
+ 1. Pomaknite kursor na ovu liniju.
+
+ 2. Pritisnite v i pomaknite kursor pet linija ispod ove.
+ Primijetite promjenu, oznaeni tekst se razlikuje od obinog.
+
+ 3. Pritisnite : znak. Na dnu ekrana pojavit e se :'<,'> .
+
+ 4. Otipkajte w TEST , pritom je TEST ime datoteke koja jo ne postoji.
+ Provjerite da zaista pie :'<,'>w TEST
+ prije nego to pritisnite <ENTER>.
+
+ 5. Vim e spremiti oznaeni tekst u TEST. Provjerite sa :!dir ili :!ls .
+ Nemojte je jo brisati! Koristiti e te je u sljedeoj lekciji.
+
+NAPOMENA: Tipka v zapoinje Vizualno oznaavanje. Moete pomicati kursor
+ unaokolo kako bi mijenjali veliinu oznaenog teksta. Moete
+ koristiti i operatore. Npr, d e izbrisati oznaeni tekst.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.4: UITAVANJE DATOTEKA
+
+
+ ** Za ubacivanje sadraja datoteke, otipkajte :r IME_DATOTEKE **
+
+ 1. Postavite kursor iznad ove linije.
+
+NAPOMENA: Nakon to izvrite 2. korak vidjeti e te tekst iz Lekcije 5.3.
+ Stoga pomaknite kursor DOLJE kako bi ponovno vidjeli ovu lekciju.
+
+ 2. Uitajte vau TEST datoteku koristei naredbu :r TEST
+ gdje je TEST ime datoteke koju ste koristili u prethodnoj lekciji.
+ Sadraj uitane datoteke je ubaen liniju ispod kursora.
+
+ 3. Kako bi provjerili da je datoteka uitana, vratite kursor unatrag i
+ primijetite dvije kopije Lekcije 5.3, originalnu i onu iz datoteke.
+
+NAPOMENA: Moete takoer uitati ispis vanjske naredbe. Npr, :r !ls
+ e uitati ispis ls naredbe i postaviti ispis liniju ispod
+ kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5 SAETAK
+
+
+ 1. :!naredba izvrava vanjsku naredbu.
+
+ Korisni primjeri:
+ (MS-DOS) (Unix)
+ :!dir :!ls - pregled direktorija.
+ :!del DATOTEKA :!rm DATOTEKA - brie datoteku DATOTEKA.
+
+ 2. :w DATOTEKA zapisuje trenutanu datoteku na disk sa imenom DATOTEKA.
+
+ 3. v pokret :w IME_DATOTEKE sprema vizualno oznaene linije u
+ datoteku IME_DATOTEKE.
+
+ 4. :r IME_DATOTEKE uitava datoteku IME_DATOTEKE sa diska i stavlja
+ njen sadraj liniju ispod kursora.
+
+ 5. :r !dir uitava ispis naredbe dir i postavlja sadraj ispisa liniju
+ ispod kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.1: NAREDBA OTVORI
+
+
+ ** Pritisnite o kako bi otvorili liniju ispod kursora
+ i preli u Insert mod. **
+
+ 1. Pomaknite kursor na sljedeu liniju oznaenu s --->.
+
+ 2. Otipkajte malo o kako bi otvorili novu liniju ISPOD kursora
+ i preli u Insert mod.
+
+ 3. Otipkajte neto teksta i nakon toga pritisnite <ESC>
+ kako bi napustili Insert mod.
+
+---> Nakon to pritisnete o kursor e prei u novu liniju u Insert mod.
+
+ 4. Za otvaranje linije IZNAD kursora, otipkajte umjesto malog o veliko O ,
+ Pokuajte na donjoj liniji oznaenoj s --->.
+
+---> Otvorite liniju iznad ove - otipkajte O dok je kursor na ovoj liniji.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.2: NAREDBA DODAJ
+
+
+ ** Otipkajte a za dodavanje teksta IZA kursora. **
+
+ 1. Pomaknite kursor na poetak sljedee linije oznaene s --->.
+
+ 2. Tipkajte e dok se kursor ne nalazi na kraju li .
+
+ 3. Otipkajte a (malo) kako bi dodali tekst IZA kursora.
+
+ 4. Dopunite rije kao to je na liniji ispod.
+ Pritisnite <ESC> za izlaz iz Insert moda.
+
+ 5. Sa e prijeite na sljedeu nepotpunu rije i ponovite korake 3 i 4.
+
+---> Ova li omoguava vje dodav teksta nekoj liniji.
+---> Ova linija omoguava vjebanje dodavanja teksta nekoj liniji.
+
+NAPOMENA: Sa i, a, i A prelazite u isti Insert mod, jedina
+ razlika je u poziciji od koje e se tekst ubacivati.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.3: DRUGI NAIN MIJENJANJA
+
+
+ ** Otipkajte veliko R kako bi zamijelili vie od jednog znaka. **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+ Pomaknite kursor na poetak prvog xxx .
+
+ 2. Pritisnite R i otipkajte broj koji je liniju ispod,
+ tako da zamijeni xxx .
+
+ 3. Pritisnite <ESC> za izlaz iz Replace moda.
+ Primijetite da je ostatak linije ostao nepromjenjen.
+
+ 5. Ponovite korake kako bi zamijenili preostali xxx.
+
+---> Zbrajanje: 123 plus xxx je xxx.
+---> Zbrajanje: 123 plus 456 je 579.
+
+NAPOMENA: Replace mod je kao Insert mod, ali sa bitnom razlikom,
+ svaki otipkani znak brie ve postojei.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.4: KOPIRANJE I LIJEPLJENJE TEKSTA
+
+
+ ** Koristite y operator za kopiranje a p za lijepljenje teksta. **
+
+ 1. Pomaknite kursor na liniju s ---> i postavite kursor nakon "a)".
+
+ 2. Pokrenite Visual mod sa v i pomaknite kursor sve do ispred "prva".
+
+ 3. Pritisnite y kako bi kopirali oznaeni tekst.
+
+ 4. Pomaknite kursor do kraja sljedee linije: j$
+
+ 5. Pritisnite p kako bi zalijepili tekst. Onda utipkajte: druga <ESC> .
+
+ 6. Koristite Visual mod kako bi oznaili " linija.", kopirajte: y , kursor
+ postavite na kraj sljedee linije: j$ i ondje zalijepite tekst: p .
+
+---> a) ovo je prva linija.
+ b)
+
+NAPOMENA: moete koristiti y kao operator; yw kopira jednu rije.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.5: MIJENJANJE POSTAVKI
+
+
+ ** Postavka: naredbe traenja i zamijene ne razlikuju VELIKA i mala slova **
+
+ 1. Potraite 'razlika' tipkanjem: /razlika <ENTER>
+ Nekoliko puta ponovite pritiskanjem n .
+
+ 2. Aktivirajte 'ic' (Ignore case) postavku: :set ic
+
+ 3. Ponovno potraite 'razlika' tipkanjem n
+ Primijetite da su sada i RAZLIKA i Razlika pronaeni.
+
+ 4. Aktivirajte 'hlsearch' i 'incsearch' postavke: :set hls is
+
+ 5. Otipkajte naredbu traenja i primijetite razlike: /razlika <ENTER>
+
+ 6. Za deaktiviranje ic postavke koristite: :set noic
+
+NAPOMENA: Za neoznaavanje pronaenih izraza otipkajte: :nohlsearch
+NAPOMENA: Bez razlikovanja velikih i malih slova u samo jednoj naredbi
+ koristite \c u izrazu: /razlika\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6 SAETAK
+
+ 1. Pritisnite o za otvaranje linije ISPOD kursora i prelazak u Insert mod.
+ Pritisnite O za otvaranje linije IZNAD kursora.
+
+ 2. Pritisnite a za unos teksta IZA kursora.
+ Pritisnite A za unos teksta na kraju linije.
+
+ 3. Naredba e pomie kursor na kraj rijei.
+
+ 4. Operator y kopira tekst, p ga lijepi.
+
+ 5. Tipkanjem velikog R Vim prelazi u Replace mod dok ne pritisnete <ESC> .
+
+ 6. Tipkanjem ":set xxx" aktivira postavku "xxx". Neke postavke su:
+ 'ic' 'ignorecase' ne razlikuje velika/mala slova pri traenju
+ 'is' 'incsearch' trai nedovrene izraze
+ 'hls' 'hlsearch' oznai sve pronaene izraze
+ Moete koristite dugo ili kratko ime postavke.
+
+ 7. Prethodite "no" imenu postavke za deaktiviranje iste: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.1: DOBIVANJE POMOI
+
+
+ ** Koristite on-line sustav pomoi **
+
+ Vim ima detaljan on-line sustav pomoi.
+ Za poetak, pokuajte jedno od sljedeeg:
+ - pritisnite <HELP> tipku (ako je vaa tipkovnica ima)
+ - pritisnite <F1> tipku (ako je vaa tipkovnica ima)
+ - utipkajte :help <ENTER>
+
+ Proitajte tekst u prozoru pomoi kako bi ste se znali sluiti istom.
+ Tipkanjem CTRL-W CTRL-W prelazite iz jednog prozora u drugi.
+ Otipkajte :q <ENTER> kako bi zatvorili prozor pomoi.
+
+ Pronai e te pomo o bilo kojoj temi, tako da dodate upit samoj
+ ":help" naredbi. Pokuajte (ne zaboravite pritisnuti <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.2: PRAVLJENJE SKRIPTE
+
+
+ ** Aktivirajte Vim mogunosti **
+
+ Vim ima mnogo vie alata od Vi-ja, ali veina njih nije aktivirana.
+ Kako bi mogli koristiti vie mogunosti napravite "vimrc" datoteku.
+
+ 1. Uredite "vimrc" datoteku. Ovo ovisi o vaem sistemu:
+ :e ~/.vimrc za Unix
+ :e ~/_vimrc za MS-Windows
+
+ 2. Sada uitajte primjer sadraja "vimrc" datoteke:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Sauvajte datoteku sa:
+ :w
+
+ Sljedeeg puta kada pokrenete Vim, bojanje sintakse teksta biti e
+ aktivirano. Sve vae postavke moete dodati u "vimrc" datoteku.
+ Za vie informacija otipkajte :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.3: AUTOMATSKO DOVRAVANJE
+
+
+ ** Dovravanje iz naredbene linije pomou CTRL-D i <TAB> **
+
+ 1. Provjerite da Vim nije u Vi modu: :set nocp
+
+ 2. Pogledajte koje datoteke postoje u direktoriju: :!ls or :!dir
+
+ 3. Otipkajte poetak naredbe: :e
+
+ 4. Tipkajte CTRL-D i prikazati e se lista naredbi koje zapoinju sa "e".
+
+ 5. Pritisnite <TAB> i Vim e dopuniti unos u naredbu ":edit".
+
+ 6. Dodajte razmak i poetak datoteke: :edit FIL
+
+ 7. Pritisnite <TAB>. Vim e nadopuniti ime datoteke (ako je jedinstveno).
+
+NAPOMENA: Mogue je dopuniti mnoge naredbe. Koristite CTRL-D i <TAB>.
+ Naroito je korisno za :help naredbe.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7 SAETAK
+
+
+ 1. Otipkajte :help ili pritisnite <F1> ili <Help> za pomo.
+
+ 2. Otipkajte :help naredba kako bi dobili pomo za naredba .
+
+ 3. Otipkajte CTRL-W CTRL-W za prelazak u drugi prozor
+
+ 4. Otipkajte :q kako bi zatvorili prozor pomoi
+
+ 5. Napravite vimrc skriptu za podizanje kako bi u nju spremali
+ vae omiljene postavke.
+
+ 6. Kada tipkate naredbu koja zapoinje sa :
+ pritisnite CTRL-D kako bi vidjeli mogue valjane vrijednosti.
+ Pritisnite <TAB> kako bi odabrali jednu od njih.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Kraj. Cilj prirunika je da pokae kratak pregled Vim editora, tek toliko
+ da omogui njegovo koritenje. Prirunik nije potpun jer Vim ima mnogo vie
+ naredbi. Za vie informacija: ":help user-manual".
+
+ Za itanje i koritenje, preporuamo:
+ Vim - Vi Improved - by Steve Oualline
+ Izdava: New Riders
+ Prva knjiga potpuno posveena Vim-u. Vrlo korisna za poetnike.
+ Sa mnogo primjera i slika.
+ Posjetite https://iccf-holland.org/click5.html
+
+ Sljedea knjiga je neto starija i vie o Vi-u nego o Vim-u, preporuamo:
+ Learning the Vi Editor - by Linda Lamb
+ Izdava: O'Reilly & Associates Inc.
+ Solidna knjiga, moete saznati skoro sve to moete napraviti
+ u Vi-u. esto izdanje ima neto informacija i o Vim-u.
+
+ Ovaj prirunik su napisali: Michael C. Pierce i Robert K. Ware,
+ Colorado School of Mines koristei ideje Charles Smith,
+ Colorado State University. E-pota: bware@mines.colorado.edu.
+
+ Naknadne promjene napravio je Bram Moolenaar.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Preveo na hrvatski: Paul B. Mahol <onemda@gmail.com>
+ Preinaka 1.42, Lipanj 2008
+
+
diff --git a/runtime/tutor/tutor.hr.cp1250 b/runtime/tutor/tutor.hr.cp1250
new file mode 100644
index 0000000..f968053
--- /dev/null
+++ b/runtime/tutor/tutor.hr.cp1250
@@ -0,0 +1,972 @@
+===============================================================================
+= D o b r o d o l i u VIM p r i r u n i k - Verzija 1.7 =
+===============================================================================
+
+ Vim je vrlo moan editor koji ima mnogo naredbi, previe da bi ih
+ se svih ovdje spomenulo. Namjena prirunika je objasniti dovoljno
+ naredbi kako bi poetnici znatno lake koristili ovaj svestran editor.
+
+ Priblino vrijeme potrebno za uspjean zavretak prirunika je oko
+ 30 minuta a ovisi o tome koliko e te vremena odvojiti za vjebanje.
+
+ UPOZORENJE:
+ Naredbe u ovom priruniku e promijeniti ovaj tekst.
+ Napravite kopiju ove datoteke kako bi ste na istoj vjebali
+ (ako ste pokrenuli "vimtutor" ovo je ve kopija).
+
+ Vrlo je vano primijetiti da je ovaj prirunik namijenjen za vjebanje.
+ Preciznije, morate izvriti naredbe u Vim-u kako bi ste iste nauili
+ pravilno koristiti. Ako samo itate tekst, zaboraviti e te naredbe!
+
+ Ako je CapsLock ukljuen ISKLJUITE ga. Pritiskajte tipku j kako
+ bi pomakli kursor sve dok Lekcija 1.1 ne ispuni ekran.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.1: POMICANJE KURSORA
+
+
+ ** Za pomicanje kursora, pritisnite h,j,k,l tipke kako je prikazano **
+ ^
+ k Savjet: h tipka je lijevo i pomie kursor lijevo.
+ < h l > l tipka je desno i pomie kursor desno.
+ j j izgleda kao strelica usmjerena dolje.
+ v
+ 1. Pomiite kursor po ekranu dok se ne naviknete na koritenje.
+
+ 2. Drite tipku (j) pritisnutom.
+ Sada znate kako doi do sljedee lekcije.
+
+ 3. Koristei tipku j prijeite na sljedeu lekciju 1.2.
+
+NAPOMENA: Ako niste sigurni to ste zapravo pritisnuli uvijek koristite
+ tipku <ESC> kako bi preli u Normal mod i onda pokuajte ponovno.
+
+NAPOMENA: Kursorske tipke rade isto. Koritenje hjkl tipaka je znatno
+ bre, nakon to se jednom naviknete na njihovo koritenje. Stvarno!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.2: IZLAZ IZ VIM-a
+
+
+ !! UPOZORENJE: Prije izvoenja bilo kojeg koraka,
+ proitajte cijelu lekciju!!
+
+ 1. Pritisnite <ESC> tipku (Vim je sada u Normal modu).
+
+ 2. Otipkajte: :q! <ENTER>.
+ Izlaz iz editora, GUBE se sve napravljene promjene.
+
+ 3. Kada se pojavi ljuska, utipkajte naredbu koja je pokrenula
+ ovaj prirunik: vimtutor <ENTER>
+
+ 4. Ako ste upamtili ove korake, izvrite ih redom od 1 do 3
+ kako bi ponovno pokrenuli editor.
+
+NAPOMENA: :q! <ENTER> ponitava sve promjene koje ste napravili.
+ U sljedeim lekcijama nauit e te kako promjene sauvati.
+
+ 5. Pomaknite kursor na Lekciju 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.3: PROMJENA TEKSTA - BRISANJE
+
+
+ ** Pritisnite x za brisanje znaka pod kursorom. **
+
+ 1. Pomaknite kursor na liniju oznaenu s --->.
+
+ 2. Kako bi ste ispravili pogreke, pomiite kursor dok se
+ ne bude nalazio na slovu kojeg trebate izbrisati.
+
+ 3. Pritisnite tipku x kako bi uklonili neeljeno slovo.
+
+ 4. Ponovite korake od 2 do 4 dok ne ispravite sve pogreke.
+
+---> KKKravaa jee presskoila mmjeseccc.
+
+ 5. Nakon to ispravite liniju, prijeite na lekciju 1.4.
+
+NAPOMENA: Koristei ovaj prirunik ne pokuavajte pamtiti
+ ve uite primjenom.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.4: PROMJENA TEKSTA - UBACIVANJE
+
+
+ ** Pritisnite i za ubacivanje teksta ispred kursora. **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 2. Kako bi napravili prvu liniju istovjetnoj drugoj, pomaknite
+ kursor na prvi znak POSLIJE kojeg e te utipkati potreban tekst.
+
+ 3. Pritisnite i te utipkajte potrebne nadopune.
+
+ 4. Nakon to ispravite pogreku pritisnite <ESC> kako bi vratili Vim
+ u Normal mod. Ponovite korake od 2 do 4 kako bi ispravili sve pogreke.
+
+---> Nedje no teka od v lin.
+---> Nedostaje neto teksta od ove linije.
+
+ 5. Prijeite na sljedeu lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.5: PROMJENA TEKSTA - DODAVANJE
+
+
+ ** Pritisnite A za dodavanje teksta. **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+ Nije vano na kojem se slovu nalazi kursor na toj liniji.
+
+ 2. Pritisnite A i napravite potrebne promjene.
+
+ 3. Nakon to ste dodali tekst, pritisnite <ESC>
+ za povratak u Normal mod.
+
+ 4. Pomaknite kursor na drugu liniju oznaenu s --->
+ i ponovite korake 2 i 3 dok ne popravite tekst.
+
+---> Ima neto teksta koji nedostaje n
+ Ima neto teksta koji nedostaje na ovoj liniji.
+---> Ima neto teksta koji ne
+ Ima neto teksta koji nedostaje ba ovdje.
+
+ 5. Prijeite na lekciju 1.6.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.6: PROMJENA DATOTEKE
+
+
+ ** Koristite :wq za spremanje teksta i naputanje Vim-a. **
+
+ !! UPOZORENJE: Prije izvravanja bilo kojeg koraka, proitajte lekciju!!
+
+ 1. Izaite iz programa kao sto ste napravili u lekciji 1.2: :q!
+
+ 2. Iz ljuske utipkajte sljedeu naredbu: vim tutor <ENTER>
+ 'vim' je naredba pokretanja Vim editora, 'tutor' je ime datoteke koju
+ elite ureivati. Koristite datoteku koju imate ovlasti mijenjati.
+
+ 3. Ubacite i izbriite tekst kao to ste to napravili u lekcijama prije.
+
+ 4. Sauvajte promjenjeni tekst i izaite iz Vim-a: :wq <ENTER>
+
+ 5. Ponovno pokrenite vimtutor i nastavite itati saetak koji sljedi.
+
+ 6. Nakon sto proitate gornje korake i u potpunosti ih razumijete:
+ izvrite ih.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1 SAETAK
+
+
+ 1. Kursor se pomie strelicama ili pomou hjkl tipaka.
+ h (lijevo) j (dolje) k (gore) l (desno)
+
+ 2. Pokretanje Vim-a iz ljuske: vim IME_DATOTEKE <ENTER>
+
+ 3. Izlaz: <ESC> :q! <ENTER> sve promjene su izgubljene.
+ ILI: <ESC> :wq <ENTER> promjene su sauvane.
+
+ 4. Brisanje znaka na kojem se nalazi kursor: x
+
+ 5. Ubacivanja ili dodavanje teksta:
+ i utipkajte tekst <ESC> unos ispred kursora
+ A utipkajte tekst <ESC> dodavanje na kraju linije
+
+NAPOMENA: Tipkanjem tipke <ESC> prebacuje Vim u Normal mod i
+ prekida neeljenu ili djelomino zavrenu naredbu.
+
+Nastavite itati Lekciju 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.1: NAREDBE BRISANJA
+
+
+ ** Tipkajte dw za brisanje rijei. **
+
+ 1. Pritisnite <ESC> kako bi bili sigurni da je Vim u Normal modu.
+
+ 2. Pomaknite kursor na liniju oznaenu s --->.
+
+ 3. Pomaknite kursor na poetak rijei koju treba izbrisati.
+
+ 4. Otipkajte dw kako bi uklonili rije.
+
+NAPOMENA: Vim e prikazati slovo d na zadnjoj liniji kad ga otipkate.
+ Vim eka da otipkate w . Ako je prikazano neko drugo slovo,
+ krivo ste otipkali; pritisnite <ESC> i pokuajte ponovno.
+
+---> Neke rijei smijeno ne pripadaju na papir ovoj reenici.
+
+ 5. Ponovite korake 3 i 4 dok ne ispravite reenicu;
+ prijeite na Lekciju 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.2: JO BRISANJA
+
+
+ ** Otipkajte d$ za brisanje znakova do kraja linije. **
+
+ 1. Pritisnite <ESC> kako bi bili
+ sigurni da je Vim u Normal modu.
+
+ 2. Pomaknite kursor na liniju oznaenu s --->.
+
+ 3. Pomaknite kursor do kraja ispravne reenice
+ (POSLJE prve . ).
+
+ 4. Otipkajte d$
+ kako bi izbrisali sve znakove do kraja linije.
+
+---> Netko je utipkao kraj ove linije dvaput. kraj ove linije dvaput.
+
+ 5. Prijeite na Lekciju 2.3 za bolje objanjenje.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.3: UKRATKO O OPERATORIMA I POKRETIMA
+
+
+ Mnogo naredbi koje mijenjaju tekst se sastoje od operatora i pokreta.
+ Oblik naredbe brisanja sa d operatorom je sljedei:
+
+ d pokret
+
+ Pri emu je:
+ d - operator brisanja.
+ pokret - ono na emu e se operacija izvravati (navedeno u nastavku).
+
+ Kratka lista pokreta:
+ w - sve do poetka sljedee rijei, NE UKLJUUJUI prvo slovo.
+ e - sve do kraja trenutane rijei, UKLJUUJUI zadnje slovo.
+ $ - sve do kraje linije, UKLJUUJUI zadnje slovo.
+
+ Tipkanjem de e se brisati od kursora do kraja rijei.
+
+NAPOMENA: Pritiskajui samo pokrete dok ste u Normal modu bez operatora e
+ pomicati kursor kao to je navedeno.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.4: KORITENJE BROJANJA ZA POKRETE
+
+
+ ** Tipkanjem nekog broja prije pokreta, pokret se izvrava toliko puta. **
+
+ 1. Pomaknite kursor na liniju oznaenu s --->.
+
+ 2. Otipkajte 2w da pomaknete kursor dvije rijei naprijed.
+
+ 3. Otipkajte 3e da pomaknete kursor na kraj tree rijei naprijed.
+
+ 4. Otipkajte 0 (nulu) da pomaknete kursor na poetak linije.
+
+ 5. Ponovite korake 2 i 3 s nekim drugim brojevima.
+
+---> Reenica sa rijeima po kojoj moete pomicati kursor.
+
+ 6. Prijeite na Lekciju 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.5: KORITENJE BROJANJA ZA VEE BRISANJE
+
+
+ ** Tipkanje broja N s operatorom ponavlja ga N-puta. **
+
+ U kombinaciji operatora brisanja i pokreta spomenutih iznad
+ ubacujete broj prije pokreta kako bi izbrisali vie znakova:
+
+ d broj pokret
+
+ 1. Pomaknite kursor na prvo slovo u rijei sa VELIKIM SLOVIMA
+ oznaenu s --->.
+
+ 2. Otipkajte 2dw da izbriete dvije rijei sa VELIKIM SLOVIMA
+
+ 3. Ponovite korake 1 i 2 sa razliitim brojevima da izbriete
+ uzastopne rijei sa VELIKIM SLOVIMA sa samo jednom naredbom.
+
+---> ova ABC DE linija FGHI JK LMN OP rijei je RS TUVZ popravljena.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.6: OPERIRANJE NAD LINIJAMA
+
+
+ ** Otipkajte dd za brisanje cijele linije. **
+
+ Zbog uestalosti brisanja cijelih linija, dizajneri Vi-a su odluili da
+ je lake brisati linije tipkanjem d dvaput.
+
+ 1. Pomaknite kursor na drugu liniju u donjoj kitici.
+ 2. Otipkajte dd kako bi izbrisali liniju.
+ 3. Pomaknite kursor na etvrtu liniju.
+ 4. Otipkajte 2dd kako bi izbrisali dvije linije.
+
+---> 1) Rue su crvene,
+---> 2) Plaa je super,
+---> 3) Ljubice su plave,
+---> 4) Imam auto,
+---> 5) Satovi ukazuju vrijeme,
+---> 6) eer je sladak
+---> 7) Kao i ti.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.7: NAREDBA PONITENJA
+
+
+ ** Pritisnite u za ponitenje zadnje naredbe, U za cijelu liniju. **
+
+ 1. Pomaknite kursor na liniju oznaenu s ---> i postavite kursor na prvu
+ pogreku.
+ 2. Otipkajte x kako bi izbrisali prvi neeljeni znak.
+ 3. Otipkajte u kako bi ponitili zadnju izvrenu naredbu.
+ 4. Ovaj put ispravite sve pogreke na liniji koristei x naredbu.
+ 5. Sada utipkajte veliko U kako bi ponitili sve promjene
+ na liniji, vraajui je u prijanje stanje.
+ 6. Sada utipkajte u nekoliko puta kako bi ponitili U
+ i prijanje naredbe.
+ 7. Sada utipkajte CTRL-R (drei CTRL tipku pritisnutom dok
+ ne pritisnete R) nekoliko puta kako bi vratili promjene
+ (ponitili ponitenja).
+
+---> Poopravite pogreke nna ovvoj liniji ii poonititeee ih.
+
+ 8. Vrlo korisne naredbe. Prijeite na saetak Lekcije 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2 SAETAK
+
+
+ 1. Brisanje od kursora do sljedee rijei: dw
+ 2. Brisanje od kursora do kraja linije: d$
+ 3. Brisanje cijele linije: dd
+
+ 4. Za ponavljanje pokreta prethodite mu broj: 2w
+ 5. Oblik naredbe mijenjanja:
+ operator [broj] pokret
+ gdje je:
+ operator - to napraviti, npr. d za brisanje
+ [broj] - neobavezan broj ponavljanja pokreta
+ pokret - kretanje po tekstu po kojem se operira,
+ kao to je: w (rije), $ (kraj linije), itd.
+
+ 6. Postavljanje kursora na poetak linije: 0
+
+ 7. Za ponitenje prethodnih promjena, pritisnite: u (malo u)
+ Za ponitenje svih promjena na liniji, pritisnite: U (veliko U)
+ Za vraanja promjena, utipkajte: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.1: NAREDBA POSTAVI
+
+
+ ** p za unos prethodno izbrisanog teksta iza kursora. **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 2. Otipkajte dd kako bi izbrisali liniju i spremili je u Vim registar.
+
+ 3. Pomaknite kursor na liniju c), IZNAD linije koju trebate unijeti.
+
+ 4. Otipkajte p kako bi postavili liniju ispod kursora.
+
+ 5. Ponovite korake 2 do 4 kako bi postavili sve linije u pravilnom
+ rasporedu.
+
+---> d) Moe li i ti nauiti?
+---> b) Ljubice su plave,
+---> c) Inteligencija je nauena,
+---> a) Rue su crvene,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.2: NAREDBA PROMJENE
+
+
+ ** Otipkajte rx za zamjenu slova ispod kursora sa slovom x . **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 2. Pomaknite kursor tako da se nalazi na prvoj pogreci.
+
+ 3. Otipkajte r i nakon toga ispravan znak na tom mjestu.
+
+ 4. Ponovite korake 2 i 3 sve dok prva
+ linije ne bude istovjetna drugoj.
+
+---> Kede ju ovu limija tupjana, natko je protuskao kruve tupke!
+---> Kada je ova linija tipkana, netko je pritiskao krive tipke!
+
+ 5. Prijeite na Lekciju 3.2.
+
+NAPOMENA: Prisjetite da trebate uiti vjebanjem, ne pamenjem.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.3: OPERATOR MIJENJANJA
+
+
+ ** Za mijenjanje do kraja rijei, istipkajte ce . **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 2. Postavite kursor na a u lackmb.
+
+ 3. Otipkajte ce i ispravite rije (u ovom sluaju otipkajte inija ).
+
+ 4. Pritisnite <ESC> i pomaknite kursor na sljedei znak
+ kojeg je potrebno ispraviti.
+
+ 5. Ponovite korake 3 i 4 sve dok prva reenica ne postane istovjetna
+ drugoj.
+
+---> Ova lackmb ima nekoliko rjlcah koje trfcb mijdmlfsz.
+---> Ova linija ima nekoliko rijei koje treba mijenjati.
+
+Primijetite da ce brie rije i postavlja Vim u Insert mod.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.4: JO MIJENJANJA KORITENJEM c
+
+
+ ** Naredba mijenjanja se koristi sa istim pokretima kao i brisanje. **
+
+ 1. Operator mijenjanja se koristi na isti nain kao i operator brisanja:
+
+ c [broj] pokret
+
+ 2. Pokreti su isti, npr: w (rije) i $ (kraj linije).
+
+ 3. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+
+ 4. Pomaknite kursor na prvu pogreku.
+
+ 5. Otipkajte c$ i utipkajte ostatak linije tako da bude istovjetna
+ drugoj te pritisnite <ESC>.
+
+---> Kraj ove linije treba pomo tako da izgleda kao linija ispod.
+---> Kraj ove linije treba ispraviti koritenjem c$ naredbe.
+
+NAPOMENA: Moete koristiti Backspace za ispravljanje greaka.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3 SAETAK
+
+
+ 1. Za postavljanje teksta koji je upravo izbrisan, pritisnite p . Ovo
+ postavlja tekst IZA kursora (ako je pak linija izbrisana tekst se
+ postavlja na liniju ispod kursora).
+
+ 2. Za promjenu znaka na kojem se nalazi kursor, pritisnite r i nakon toga
+ eljeni znak.
+
+ 3. Operator mijenjanja dozvoljava promjenu teksta od kursora do pozicije do
+ koje dovede pokret. tj. Otipkajte ce za mijenjanje od kursora do kraja
+ rijei, c$ za mijenjanje od kursora do kraja linije.
+
+ 4. Oblik naredbe mijenjanja:
+
+ c [broj] pokret
+
+Prijeite na sljedeu lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.1: POZICIJA KURSORA I STATUS DATOTEKE
+
+ ** CTRL-G za prikaz pozicije kursora u datoteci i status datoteke.
+ Pritisnite G za pomicanje kursora na neku liniju u datoteci. **
+
+NAPOMENA: Proitajte cijelu lekciju prije izvrenja bilo kojeg koraka!!
+
+ 1. Drite Ctrl tipku pritisnutom i pritisnite g . Ukratko: CTRL-G.
+ Vim e ispisati poruku na dnu ekrana sa imenom datoteke i pozicijom
+ kursora u datoteci. Zapamtite broj linije za 3. korak.
+
+NAPOMENA: Moete vidjeti poziciju kursora u donjem desnom kutu ako
+ je postavka 'ruler' aktivirana (objanjeno u 6. lekciji).
+
+ 2. Pritisnite G za pomicanje kursora na kraj datoteke.
+ Otipkajte gg za pomicanje kursora na poetak datoteke.
+
+ 3. Otipkajte broj linije na kojoj ste bili maloprije i zatim G . Kursor
+ e se vratiti na liniju na kojoj se nalazio kada ste otipkali CTRL-G.
+
+ 4. Ako ste spremni, izvrite korake od 1 do 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.2: NAREDBE TRAENJA
+
+ ** Otipkajte / i nakon toga izraz kojeg elite traiti. **
+
+ 1. U Normal modu otipkajte / znak. Primijetite da se znak
+ pojavio zajedno sa kursorom na dnu ekrana kao kod : naredbe.
+
+ 2. Sada otipkajte 'grrrreka' <ENTER>. To je rije koju zapravo traite.
+
+ 3. Za ponovno traenje istog izraza, otipkajte n .
+ Za traenje istog izraza ali u suprotnom smjeru, otipkajte N .
+
+ 4. Za traenje izraza unatrag, koristite ? umjesto / .
+
+ 5. Za povratak na prethodnu poziciju koristite CTRL-O (drite Ctrl
+ pritisnutim dok ne pritisnete tipku o). Ponavljajte sve dok se ne
+ vratite na poetak. CTRL-I slino kao CTRL-O ali u suprotnom smjeru.
+
+---> "pogrrrreka" je pogreno; umjesto pogrrrreka treba stajati pogreka.
+
+NAPOMENA: Ako se traenjem doe do kraja datoteke nastavit e se od njenog
+ poetka osim ako je postavka 'wrapscan' deaktivirana.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.3: TRAENJE PRIPADAJUE ZAGRADE
+
+
+ ** Otipkajte % za pronalazak pripadajue ), ] ili } . **
+
+ 1. Postavite kursor na bilo koju od ( , [ ili {
+ otvorenih zagrada u liniji oznaenoj s --->.
+
+ 2. Otipkajte znak % .
+
+ 3. Kursor e se pomaknuti na pripadajuu zatvorenu zagradu.
+
+ 4. Otipkajte % kako bi pomakli kursor na drugu pripadajuu zagradu.
+
+ 5. Pomaknite kursor na neku od (,),[,],{ ili } i ponovite % naredbu.
+
+---> Linija ( testiranja obinih ( [ uglatih ] i { vitiastih } zagrada.))
+
+
+NAPOMENA: Vrlo korisno u ispravljanju koda sa nepripadajuim zagradama!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.4: NAREDBE ZAMIJENE
+
+
+ ** Otipkajte :s/staro/novo/g da zamijenite 'staro' za 'novo'. **
+
+ 1. Pomaknite kursor na liniju oznaenu s --->.
+
+ 2. Otipkajte :s/cvr/cvr <ENTER> . Primjetite da ova naredba zamjenjuje
+ samo prvi "cvr" u liniji.
+
+ 3. Otipkajte :s/cvr/cvr/g . Dodavanje g stavke znai da e se naredba
+ izvriti na cijeloj liniji, zamjenjivanjem svih "cvr" u liniji.
+
+---> i cvri cvri cvrak na voru crne smre.
+
+ 4. Za zamjenu svih izraza u rasponu dviju linija,
+ otipkajte :#,#s/staro/novo/g #,# su brojevi linije datoteke na kojima
+ te izmeu njih e se izvriti zamjena.
+ Otipkajte :%s/staro/novo/g za zamjenu svih izraza u cijeloj datoteci.
+ Otipkajte :%s/staro/novo/gc za pronalazak svakog izraza u datoteci i
+ potvrdu zamjene.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4 SAETAK
+
+
+ 1. CTRL-G prikazuje poziciju kursora u datoteci i status datoteke.
+ G postavlja kursor na zadnju liniju datoteke.
+ broj G postavlja kursor na broj liniju.
+ gg postavlja kursor na prvu liniju.
+
+ 2. Tipkanje / sa izrazom trai UNAPRIJED taj izraz.
+ Tipkanje ? sa izrazom trai UNATRAG taj izraz.
+ Nakon naredbe traenja koristite n za pronalazak izraza u istom
+ smjeru, i N za pronalazak istog izraza ali u suprotnom smjeru.
+ CTRL-O vraa kursor na prethodnu poziciju, CTRL-I na sljedeu poziciju.
+
+ 3. Tipkanje % dok je kursor na zagradi pomie ga na pripadajuu zagradu.
+
+ 4. Za zamjenu prvog izraza staro za izraz novo :s/staro/novo
+ Za zamjenu svih izraza staro na cijeloj liniji :s/staro/novo/g
+ Za zamjenu svih izraza staro u rasponu linija #,# :#,#s/staro/novo/g
+ Za zamjenu u cijeloj datoteci :%s/staro/novo/g
+ Za potvrdu svake zamjene dodajte 'c' :%s/staro/novo/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.1: IZVRAVANJE VANJSKIH NAREDBI
+
+
+ ** Otipkajte :! sa vanjskom naredbom koju elite izvriti. **
+
+ 1. Otipkajte poznatu naredbu : kako bi kursor premjestili na dno
+ ekrana. Time omoguavate unos naredbe u naredbenoj liniji.
+
+ 2. Otipkajte znak ! (usklinik). Tako omoguavate
+ izvravanje naredbe vanjske ljuske.
+
+ 3. Kao primjer otipkajte ls nakon ! te pritisnite <ENTER>.
+ Ovo e prikazati sadraj direktorija, kao da ste u ljusci.
+ Koristite :!dir ako :!ls ne radi.
+
+NAPOMENA: Mogue je izvravati bilo koju vanjsku naredbu na ovaj nain,
+ zajedno sa njenim argumentima.
+
+NAPOMENA: Sve : naredbe se izvravaju nakon to pritisnete <ENTER>
+ U daljnjem tekstu to nee uvijek biti napomenuto.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.2: VIE O SPREMANJU DATOTEKA
+
+ ** Za spremanje promjena, otipkajte :w IME_DATOTEKE. **
+
+ 1. Otipkajte :!dir ili :!ls za pregled direktorija.
+ Ve znate da morate pritisnuti <ENTER> na kraju tipkanja.
+
+ 2. Izaberite ime datoteke koja jo ne postoji, npr. TEST.
+
+ 3. Otipkajte: :w TEST (gdje je TEST ime koje ste prethodno odabrali.)
+
+ 4. Time e te spremiti cijelu datoteku (Vim Tutor) pod imenom TEST.
+ Za provjeru, otipkajte ponovno :!dir ili :!ls
+ za pregled direktorija.
+
+NAPOMENA: Ako bi napustili Vim i ponovno ga pokrenuli sa vim TEST ,
+ datoteka bi bila potpuna kopija ove datoteke u trenutku
+ kada ste je spremili.
+
+ 5. Izbriite datoteku tako da otipkate (MS-DOS): :!del TEST
+ ili (Unix): :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.3: SPREMANJE OZNAENOG TEKSTA
+
+
+ ** Kako bi spremili dio datoteke, otipkajte v pokret :w IME_DATOTEKE **
+
+ 1. Pomaknite kursor na ovu liniju.
+
+ 2. Pritisnite v i pomaknite kursor pet linija ispod ove.
+ Primijetite promjenu, oznaeni tekst se razlikuje od obinog.
+
+ 3. Pritisnite : znak. Na dnu ekrana pojavit e se :'<,'> .
+
+ 4. Otipkajte w TEST , pritom je TEST ime datoteke koja jo ne postoji.
+ Provjerite da zaista pie :'<,'>w TEST
+ prije nego to pritisnite <ENTER>.
+
+ 5. Vim e spremiti oznaeni tekst u TEST. Provjerite sa :!dir ili :!ls .
+ Nemojte je jo brisati! Koristiti e te je u sljedeoj lekciji.
+
+NAPOMENA: Tipka v zapoinje Vizualno oznaavanje. Moete pomicati kursor
+ unaokolo kako bi mijenjali veliinu oznaenog teksta. Moete
+ koristiti i operatore. Npr, d e izbrisati oznaeni tekst.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.4: UITAVANJE DATOTEKA
+
+
+ ** Za ubacivanje sadraja datoteke, otipkajte :r IME_DATOTEKE **
+
+ 1. Postavite kursor iznad ove linije.
+
+NAPOMENA: Nakon to izvrite 2. korak vidjeti e te tekst iz Lekcije 5.3.
+ Stoga pomaknite kursor DOLJE kako bi ponovno vidjeli ovu lekciju.
+
+ 2. Uitajte vau TEST datoteku koristei naredbu :r TEST
+ gdje je TEST ime datoteke koju ste koristili u prethodnoj lekciji.
+ Sadraj uitane datoteke je ubaen liniju ispod kursora.
+
+ 3. Kako bi provjerili da je datoteka uitana, vratite kursor unatrag i
+ primijetite dvije kopije Lekcije 5.3, originalnu i onu iz datoteke.
+
+NAPOMENA: Moete takoer uitati ispis vanjske naredbe. Npr, :r !ls
+ e uitati ispis ls naredbe i postaviti ispis liniju ispod
+ kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5 SAETAK
+
+
+ 1. :!naredba izvrava vanjsku naredbu.
+
+ Korisni primjeri:
+ (MS-DOS) (Unix)
+ :!dir :!ls - pregled direktorija.
+ :!del DATOTEKA :!rm DATOTEKA - brie datoteku DATOTEKA.
+
+ 2. :w DATOTEKA zapisuje trenutanu datoteku na disk sa imenom DATOTEKA.
+
+ 3. v pokret :w IME_DATOTEKE sprema vizualno oznaene linije u
+ datoteku IME_DATOTEKE.
+
+ 4. :r IME_DATOTEKE uitava datoteku IME_DATOTEKE sa diska i stavlja
+ njen sadraj liniju ispod kursora.
+
+ 5. :r !dir uitava ispis naredbe dir i postavlja sadraj ispisa liniju
+ ispod kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.1: NAREDBA OTVORI
+
+
+ ** Pritisnite o kako bi otvorili liniju ispod kursora
+ i preli u Insert mod. **
+
+ 1. Pomaknite kursor na sljedeu liniju oznaenu s --->.
+
+ 2. Otipkajte malo o kako bi otvorili novu liniju ISPOD kursora
+ i preli u Insert mod.
+
+ 3. Otipkajte neto teksta i nakon toga pritisnite <ESC>
+ kako bi napustili Insert mod.
+
+---> Nakon to pritisnete o kursor e prei u novu liniju u Insert mod.
+
+ 4. Za otvaranje linije IZNAD kursora, otipkajte umjesto malog o veliko O ,
+ Pokuajte na donjoj liniji oznaenoj s --->.
+
+---> Otvorite liniju iznad ove - otipkajte O dok je kursor na ovoj liniji.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.2: NAREDBA DODAJ
+
+
+ ** Otipkajte a za dodavanje teksta IZA kursora. **
+
+ 1. Pomaknite kursor na poetak sljedee linije oznaene s --->.
+
+ 2. Tipkajte e dok se kursor ne nalazi na kraju li .
+
+ 3. Otipkajte a (malo) kako bi dodali tekst IZA kursora.
+
+ 4. Dopunite rije kao to je na liniji ispod.
+ Pritisnite <ESC> za izlaz iz Insert moda.
+
+ 5. Sa e prijeite na sljedeu nepotpunu rije i ponovite korake 3 i 4.
+
+---> Ova li omoguava vje dodav teksta nekoj liniji.
+---> Ova linija omoguava vjebanje dodavanja teksta nekoj liniji.
+
+NAPOMENA: Sa i, a, i A prelazite u isti Insert mod, jedina
+ razlika je u poziciji od koje e se tekst ubacivati.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.3: DRUGI NAIN MIJENJANJA
+
+
+ ** Otipkajte veliko R kako bi zamijelili vie od jednog znaka. **
+
+ 1. Pomaknite kursor na prvu sljedeu liniju oznaenu s --->.
+ Pomaknite kursor na poetak prvog xxx .
+
+ 2. Pritisnite R i otipkajte broj koji je liniju ispod,
+ tako da zamijeni xxx .
+
+ 3. Pritisnite <ESC> za izlaz iz Replace moda.
+ Primijetite da je ostatak linije ostao nepromjenjen.
+
+ 5. Ponovite korake kako bi zamijenili preostali xxx.
+
+---> Zbrajanje: 123 plus xxx je xxx.
+---> Zbrajanje: 123 plus 456 je 579.
+
+NAPOMENA: Replace mod je kao Insert mod, ali sa bitnom razlikom,
+ svaki otipkani znak brie ve postojei.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.4: KOPIRANJE I LIJEPLJENJE TEKSTA
+
+
+ ** Koristite y operator za kopiranje a p za lijepljenje teksta. **
+
+ 1. Pomaknite kursor na liniju s ---> i postavite kursor nakon "a)".
+
+ 2. Pokrenite Visual mod sa v i pomaknite kursor sve do ispred "prva".
+
+ 3. Pritisnite y kako bi kopirali oznaeni tekst.
+
+ 4. Pomaknite kursor do kraja sljedee linije: j$
+
+ 5. Pritisnite p kako bi zalijepili tekst. Onda utipkajte: druga <ESC> .
+
+ 6. Koristite Visual mod kako bi oznaili " linija.", kopirajte: y , kursor
+ postavite na kraj sljedee linije: j$ i ondje zalijepite tekst: p .
+
+---> a) ovo je prva linija.
+ b)
+
+NAPOMENA: moete koristiti y kao operator; yw kopira jednu rije.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.5: MIJENJANJE POSTAVKI
+
+
+ ** Postavka: naredbe traenja i zamijene ne razlikuju VELIKA i mala slova **
+
+ 1. Potraite 'razlika' tipkanjem: /razlika <ENTER>
+ Nekoliko puta ponovite pritiskanjem n .
+
+ 2. Aktivirajte 'ic' (Ignore case) postavku: :set ic
+
+ 3. Ponovno potraite 'razlika' tipkanjem n
+ Primijetite da su sada i RAZLIKA i Razlika pronaeni.
+
+ 4. Aktivirajte 'hlsearch' i 'incsearch' postavke: :set hls is
+
+ 5. Otipkajte naredbu traenja i primijetite razlike: /razlika <ENTER>
+
+ 6. Za deaktiviranje ic postavke koristite: :set noic
+
+NAPOMENA: Za neoznaavanje pronaenih izraza otipkajte: :nohlsearch
+NAPOMENA: Bez razlikovanja velikih i malih slova u samo jednoj naredbi
+ koristite \c u izrazu: /razlika\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6 SAETAK
+
+ 1. Pritisnite o za otvaranje linije ISPOD kursora i prelazak u Insert mod.
+ Pritisnite O za otvaranje linije IZNAD kursora.
+
+ 2. Pritisnite a za unos teksta IZA kursora.
+ Pritisnite A za unos teksta na kraju linije.
+
+ 3. Naredba e pomie kursor na kraj rijei.
+
+ 4. Operator y kopira tekst, p ga lijepi.
+
+ 5. Tipkanjem velikog R Vim prelazi u Replace mod dok ne pritisnete <ESC> .
+
+ 6. Tipkanjem ":set xxx" aktivira postavku "xxx". Neke postavke su:
+ 'ic' 'ignorecase' ne razlikuje velika/mala slova pri traenju
+ 'is' 'incsearch' trai nedovrene izraze
+ 'hls' 'hlsearch' oznai sve pronaene izraze
+ Moete koristite dugo ili kratko ime postavke.
+
+ 7. Prethodite "no" imenu postavke za deaktiviranje iste: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.1: DOBIVANJE POMOI
+
+
+ ** Koristite on-line sustav pomoi **
+
+ Vim ima detaljan on-line sustav pomoi.
+ Za poetak, pokuajte jedno od sljedeeg:
+ - pritisnite <HELP> tipku (ako je vaa tipkovnica ima)
+ - pritisnite <F1> tipku (ako je vaa tipkovnica ima)
+ - utipkajte :help <ENTER>
+
+ Proitajte tekst u prozoru pomoi kako bi ste se znali sluiti istom.
+ Tipkanjem CTRL-W CTRL-W prelazite iz jednog prozora u drugi.
+ Otipkajte :q <ENTER> kako bi zatvorili prozor pomoi.
+
+ Pronai e te pomo o bilo kojoj temi, tako da dodate upit samoj
+ ":help" naredbi. Pokuajte (ne zaboravite pritisnuti <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.2: PRAVLJENJE SKRIPTE
+
+
+ ** Aktivirajte Vim mogunosti **
+
+ Vim ima mnogo vie alata od Vi-ja, ali veina njih nije aktivirana.
+ Kako bi mogli koristiti vie mogunosti napravite "vimrc" datoteku.
+
+ 1. Uredite "vimrc" datoteku. Ovo ovisi o vaem sistemu:
+ :e ~/.vimrc za Unix
+ :e ~/_vimrc za MS-Windows
+
+ 2. Sada uitajte primjer sadraja "vimrc" datoteke:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Sauvajte datoteku sa:
+ :w
+
+ Sljedeeg puta kada pokrenete Vim, bojanje sintakse teksta biti e
+ aktivirano. Sve vae postavke moete dodati u "vimrc" datoteku.
+ Za vie informacija otipkajte :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.3: AUTOMATSKO DOVRAVANJE
+
+
+ ** Dovravanje iz naredbene linije pomou CTRL-D i <TAB> **
+
+ 1. Provjerite da Vim nije u Vi modu: :set nocp
+
+ 2. Pogledajte koje datoteke postoje u direktoriju: :!ls or :!dir
+
+ 3. Otipkajte poetak naredbe: :e
+
+ 4. Tipkajte CTRL-D i prikazati e se lista naredbi koje zapoinju sa "e".
+
+ 5. Pritisnite <TAB> i Vim e dopuniti unos u naredbu ":edit".
+
+ 6. Dodajte razmak i poetak datoteke: :edit FIL
+
+ 7. Pritisnite <TAB>. Vim e nadopuniti ime datoteke (ako je jedinstveno).
+
+NAPOMENA: Mogue je dopuniti mnoge naredbe. Koristite CTRL-D i <TAB>.
+ Naroito je korisno za :help naredbe.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7 SAETAK
+
+
+ 1. Otipkajte :help ili pritisnite <F1> ili <Help> za pomo.
+
+ 2. Otipkajte :help naredba kako bi dobili pomo za naredba .
+
+ 3. Otipkajte CTRL-W CTRL-W za prelazak u drugi prozor
+
+ 4. Otipkajte :q kako bi zatvorili prozor pomoi
+
+ 5. Napravite vimrc skriptu za podizanje kako bi u nju spremali
+ vae omiljene postavke.
+
+ 6. Kada tipkate naredbu koja zapoinje sa :
+ pritisnite CTRL-D kako bi vidjeli mogue valjane vrijednosti.
+ Pritisnite <TAB> kako bi odabrali jednu od njih.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Kraj. Cilj prirunika je da pokae kratak pregled Vim editora, tek toliko
+ da omogui njegovo koritenje. Prirunik nije potpun jer Vim ima mnogo vie
+ naredbi. Za vie informacija: ":help user-manual".
+
+ Za itanje i koritenje, preporuamo:
+ Vim - Vi Improved - by Steve Oualline
+ Izdava: New Riders
+ Prva knjiga potpuno posveena Vim-u. Vrlo korisna za poetnike.
+ Sa mnogo primjera i slika.
+ Posjetite https://iccf-holland.org/click5.html
+
+ Sljedea knjiga je neto starija i vie o Vi-u nego o Vim-u, preporuamo:
+ Learning the Vi Editor - by Linda Lamb
+ Izdava: O'Reilly & Associates Inc.
+ Solidna knjiga, moete saznati skoro sve to moete napraviti
+ u Vi-u. esto izdanje ima neto informacija i o Vim-u.
+
+ Ovaj prirunik su napisali: Michael C. Pierce i Robert K. Ware,
+ Colorado School of Mines koristei ideje Charles Smith,
+ Colorado State University. E-pota: bware@mines.colorado.edu.
+
+ Naknadne promjene napravio je Bram Moolenaar.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Preveo na hrvatski: Paul B. Mahol <onemda@gmail.com>
+ Preinaka 1.42, Lipanj 2008
+
+
diff --git a/runtime/tutor/tutor.hr.utf-8 b/runtime/tutor/tutor.hr.utf-8
new file mode 100644
index 0000000..291def0
--- /dev/null
+++ b/runtime/tutor/tutor.hr.utf-8
@@ -0,0 +1,972 @@
+===============================================================================
+= D o b r o d o š l i u VIM p r i r u č n i k - Verzija 1.7 =
+===============================================================================
+
+ Vim je vrlo moćan editor koji ima mnogo naredbi, previše da bi ih
+ se svih ovdje spomenulo. Namjena priručnika je objasniti dovoljno
+ naredbi kako bi početnici znatno lakše koristili ovaj svestran editor.
+
+ Približno vrijeme potrebno za uspješan završetak priručnika je oko
+ 30 minuta a ovisi o tome koliko će te vremena odvojiti za vježbanje.
+
+ UPOZORENJE:
+ Naredbe u ovom priručniku će promijeniti ovaj tekst.
+ Napravite kopiju ove datoteke kako bi ste na istoj vježbali
+ (ako ste pokrenuli "vimtutor" ovo je već kopija).
+
+ Vrlo je važno primijetiti da je ovaj priručnik namijenjen za vježbanje.
+ Preciznije, morate izvršiti naredbe u Vim-u kako bi ste iste naučili
+ pravilno koristiti. Ako samo čitate tekst, zaboraviti će te naredbe!
+
+ Ako je CapsLock uključen ISKLJUČITE ga. Pritiskajte tipku j kako
+ bi pomakli kursor sve dok Lekcija 1.1 ne ispuni ekran.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.1: POMICANJE KURSORA
+
+
+ ** Za pomicanje kursora, pritisnite h,j,k,l tipke kako je prikazano **
+ ^
+ k Savjet: h tipka je lijevo i pomiče kursor lijevo.
+ < h l > l tipka je desno i pomiče kursor desno.
+ j j izgleda kao strelica usmjerena dolje.
+ v
+ 1. Pomičite kursor po ekranu dok se ne naviknete na korištenje.
+
+ 2. Držite tipku (j) pritisnutom.
+ Sada znate kako doći do sljedeće lekcije.
+
+ 3. Koristeći tipku j prijeđite na sljedeću lekciju 1.2.
+
+NAPOMENA: Ako niste sigurni što ste zapravo pritisnuli uvijek koristite
+ tipku <ESC> kako bi prešli u Normal mod i onda pokušajte ponovno.
+
+NAPOMENA: Kursorske tipke rade isto. Korištenje hjkl tipaka je znatno
+ brže, nakon što se jednom naviknete na njihovo korištenje. Stvarno!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.2: IZLAZ IZ VIM-a
+
+
+ !! UPOZORENJE: Prije izvođenja bilo kojeg koraka,
+ pročitajte cijelu lekciju!!
+
+ 1. Pritisnite <ESC> tipku (Vim je sada u Normal modu).
+
+ 2. Otipkajte: :q! <ENTER>.
+ Izlaz iz editora, GUBE se sve napravljene promjene.
+
+ 3. Kada se pojavi ljuska, utipkajte naredbu koja je pokrenula
+ ovaj priručnik: vimtutor <ENTER>
+
+ 4. Ako ste upamtili ove korake, izvršite ih redom od 1 do 3
+ kako bi ponovno pokrenuli editor.
+
+NAPOMENA: :q! <ENTER> poništava sve promjene koje ste napravili.
+ U sljedećim lekcijama naučit će te kako promjene sačuvati.
+
+ 5. Pomaknite kursor na Lekciju 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.3: PROMJENA TEKSTA - BRISANJE
+
+
+ ** Pritisnite x za brisanje znaka pod kursorom. **
+
+ 1. Pomaknite kursor na liniju označenu s --->.
+
+ 2. Kako bi ste ispravili pogreške, pomičite kursor dok se
+ ne bude nalazio na slovu kojeg trebate izbrisati.
+
+ 3. Pritisnite tipku x kako bi uklonili neželjeno slovo.
+
+ 4. Ponovite korake od 2 do 4 dok ne ispravite sve pogreške.
+
+---> KKKravaa jee presskočila mmjeseccc.
+
+ 5. Nakon što ispravite liniju, prijeđite na lekciju 1.4.
+
+NAPOMENA: Koristeći ovaj priručnik ne pokušavajte pamtiti
+ već učite primjenom.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.4: PROMJENA TEKSTA - UBACIVANJE
+
+
+ ** Pritisnite i za ubacivanje teksta ispred kursora. **
+
+ 1. Pomaknite kursor na prvu sljedeću liniju označenu s --->.
+
+ 2. Kako bi napravili prvu liniju istovjetnoj drugoj, pomaknite
+ kursor na prvi znak POSLIJE kojeg će te utipkati potreban tekst.
+
+ 3. Pritisnite i te utipkajte potrebne nadopune.
+
+ 4. Nakon što ispravite pogrešku pritisnite <ESC> kako bi vratili Vim
+ u Normal mod. Ponovite korake od 2 do 4 kako bi ispravili sve pogreške.
+
+---> Nedje no teka od v lin.
+---> Nedostaje nešto teksta od ove linije.
+
+ 5. Prijeđite na sljedeću lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.5: PROMJENA TEKSTA - DODAVANJE
+
+
+ ** Pritisnite A za dodavanje teksta. **
+
+ 1. Pomaknite kursor na prvu sljedeću liniju označenu s --->.
+ Nije važno na kojem se slovu nalazi kursor na toj liniji.
+
+ 2. Pritisnite A i napravite potrebne promjene.
+
+ 3. Nakon što ste dodali tekst, pritisnite <ESC>
+ za povratak u Normal mod.
+
+ 4. Pomaknite kursor na drugu liniju označenu s --->
+ i ponovite korake 2 i 3 dok ne popravite tekst.
+
+---> Ima nešto teksta koji nedostaje n
+ Ima nešto teksta koji nedostaje na ovoj liniji.
+---> Ima nešto teksta koji ne
+ Ima nešto teksta koji nedostaje baš ovdje.
+
+ 5. Prijeđite na lekciju 1.6.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.6: PROMJENA DATOTEKE
+
+
+ ** Koristite :wq za spremanje teksta i napuštanje Vim-a. **
+
+ !! UPOZORENJE: Prije izvršavanja bilo kojeg koraka, pročitajte lekciju!!
+
+ 1. Izađite iz programa kao sto ste napravili u lekciji 1.2: :q!
+
+ 2. Iz ljuske utipkajte sljedeću naredbu: vim tutor <ENTER>
+ 'vim' je naredba pokretanja Vim editora, 'tutor' je ime datoteke koju
+ želite uređivati. Koristite datoteku koju imate ovlasti mijenjati.
+
+ 3. Ubacite i izbrišite tekst kao što ste to napravili u lekcijama prije.
+
+ 4. Sačuvajte promjenjeni tekst i izađite iz Vim-a: :wq <ENTER>
+
+ 5. Ponovno pokrenite vimtutor i nastavite čitati sažetak koji sljedi.
+
+ 6. Nakon sto pročitate gornje korake i u potpunosti ih razumijete:
+ izvršite ih.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1 SAŽETAK
+
+
+ 1. Kursor se pomiče strelicama ili pomoću hjkl tipaka.
+ h (lijevo) j (dolje) k (gore) l (desno)
+
+ 2. Pokretanje Vim-a iz ljuske: vim IME_DATOTEKE <ENTER>
+
+ 3. Izlaz: <ESC> :q! <ENTER> sve promjene su izgubljene.
+ ILI: <ESC> :wq <ENTER> promjene su sačuvane.
+
+ 4. Brisanje znaka na kojem se nalazi kursor: x
+
+ 5. Ubacivanja ili dodavanje teksta:
+ i utipkajte tekst <ESC> unos ispred kursora
+ A utipkajte tekst <ESC> dodavanje na kraju linije
+
+NAPOMENA: Tipkanjem tipke <ESC> prebacuje Vim u Normal mod i
+ prekida neželjenu ili djelomično završenu naredbu.
+
+Nastavite čitati Lekciju 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.1: NAREDBE BRISANJA
+
+
+ ** Tipkajte dw za brisanje riječi. **
+
+ 1. Pritisnite <ESC> kako bi bili sigurni da je Vim u Normal modu.
+
+ 2. Pomaknite kursor na liniju označenu s --->.
+
+ 3. Pomaknite kursor na početak riječi koju treba izbrisati.
+
+ 4. Otipkajte dw kako bi uklonili riječ.
+
+NAPOMENA: Vim će prikazati slovo d na zadnjoj liniji kad ga otipkate.
+ Vim čeka da otipkate w . Ako je prikazano neko drugo slovo,
+ krivo ste otipkali; pritisnite <ESC> i pokušajte ponovno.
+
+---> Neke riječi smiješno ne pripadaju na papir ovoj rečenici.
+
+ 5. Ponovite korake 3 i 4 dok ne ispravite rečenicu;
+ prijeđite na Lekciju 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.2: JOŠ BRISANJA
+
+
+ ** Otipkajte d$ za brisanje znakova do kraja linije. **
+
+ 1. Pritisnite <ESC> kako bi bili
+ sigurni da je Vim u Normal modu.
+
+ 2. Pomaknite kursor na liniju označenu s --->.
+
+ 3. Pomaknite kursor do kraja ispravne rečenice
+ (POSLJE prve . ).
+
+ 4. Otipkajte d$
+ kako bi izbrisali sve znakove do kraja linije.
+
+---> Netko je utipkao kraj ove linije dvaput. kraj ove linije dvaput.
+
+ 5. Prijeđite na Lekciju 2.3 za bolje objašnjenje.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.3: UKRATKO O OPERATORIMA I POKRETIMA
+
+
+ Mnogo naredbi koje mijenjaju tekst se sastoje od operatora i pokreta.
+ Oblik naredbe brisanja sa d operatorom je sljedeći:
+
+ d pokret
+
+ Pri čemu je:
+ d - operator brisanja.
+ pokret - ono na čemu će se operacija izvršavati (navedeno u nastavku).
+
+ Kratka lista pokreta:
+ w - sve do početka sljedeće riječi, NE UKLJUČUJUĆI prvo slovo.
+ e - sve do kraja trenutačne riječi, UKLJUČUJUĆI zadnje slovo.
+ $ - sve do kraje linije, UKLJUČUJUĆI zadnje slovo.
+
+ Tipkanjem de će se brisati od kursora do kraja riječi.
+
+NAPOMENA: Pritiskajući samo pokrete dok ste u Normal modu bez operatora će
+ pomicati kursor kao što je navedeno.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.4: KORIŠTENJE BROJANJA ZA POKRETE
+
+
+ ** Tipkanjem nekog broja prije pokreta, pokret se izvršava toliko puta. **
+
+ 1. Pomaknite kursor na liniju označenu s --->.
+
+ 2. Otipkajte 2w da pomaknete kursor dvije riječi naprijed.
+
+ 3. Otipkajte 3e da pomaknete kursor na kraj treće riječi naprijed.
+
+ 4. Otipkajte 0 (nulu) da pomaknete kursor na početak linije.
+
+ 5. Ponovite korake 2 i 3 s nekim drugim brojevima.
+
+---> Rečenica sa riječima po kojoj možete pomicati kursor.
+
+ 6. Prijeđite na Lekciju 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.5: KORIŠTENJE BROJANJA ZA VEĆE BRISANJE
+
+
+ ** Tipkanje broja N s operatorom ponavlja ga N-puta. **
+
+ U kombinaciji operatora brisanja i pokreta spomenutih iznad
+ ubacujete broj prije pokreta kako bi izbrisali više znakova:
+
+ d broj pokret
+
+ 1. Pomaknite kursor na prvo slovo u riječi sa VELIKIM SLOVIMA
+ označenu s --->.
+
+ 2. Otipkajte 2dw da izbrišete dvije riječi sa VELIKIM SLOVIMA
+
+ 3. Ponovite korake 1 i 2 sa različitim brojevima da izbrišete
+ uzastopne riječi sa VELIKIM SLOVIMA sa samo jednom naredbom.
+
+---> ova ABCČĆ DĐE linija FGHI JK LMN OP riječi je RSŠ TUVZŽ popravljena.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.6: OPERIRANJE NAD LINIJAMA
+
+
+ ** Otipkajte dd za brisanje cijele linije. **
+
+ Zbog učestalosti brisanja cijelih linija, dizajneri Vi-a su odlučili da
+ je lakše brisati linije tipkanjem d dvaput.
+
+ 1. Pomaknite kursor na drugu liniju u donjoj kitici.
+ 2. Otipkajte dd kako bi izbrisali liniju.
+ 3. Pomaknite kursor na četvrtu liniju.
+ 4. Otipkajte 2dd kako bi izbrisali dvije linije.
+
+---> 1) Ruže su crvene,
+---> 2) Plaža je super,
+---> 3) Ljubice su plave,
+---> 4) Imam auto,
+---> 5) Satovi ukazuju vrijeme,
+---> 6) Šećer je sladak
+---> 7) Kao i ti.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.7: NAREDBA PONIŠTENJA
+
+
+ ** Pritisnite u za poništenje zadnje naredbe, U za cijelu liniju. **
+
+ 1. Pomaknite kursor na liniju označenu s ---> i postavite kursor na prvu
+ pogrešku.
+ 2. Otipkajte x kako bi izbrisali prvi neželjeni znak.
+ 3. Otipkajte u kako bi poništili zadnju izvršenu naredbu.
+ 4. Ovaj put ispravite sve pogreške na liniji koristeći x naredbu.
+ 5. Sada utipkajte veliko U kako bi poništili sve promjene
+ na liniji, vraćajući je u prijašnje stanje.
+ 6. Sada utipkajte u nekoliko puta kako bi poništili U
+ i prijašnje naredbe.
+ 7. Sada utipkajte CTRL-R (držeći CTRL tipku pritisnutom dok
+ ne pritisnete R) nekoliko puta kako bi vratili promjene
+ (poništili poništenja).
+
+---> Poopravite pogreške nna ovvoj liniji ii pooništiteee ih.
+
+ 8. Vrlo korisne naredbe. Prijeđite na sažetak Lekcije 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2 SAŽETAK
+
+
+ 1. Brisanje od kursora do sljedeće riječi: dw
+ 2. Brisanje od kursora do kraja linije: d$
+ 3. Brisanje cijele linije: dd
+
+ 4. Za ponavljanje pokreta prethodite mu broj: 2w
+ 5. Oblik naredbe mijenjanja:
+ operator [broj] pokret
+ gdje je:
+ operator - što napraviti, npr. d za brisanje
+ [broj] - neobavezan broj ponavljanja pokreta
+ pokret - kretanje po tekstu po kojem se operira,
+ kao što je: w (riječ), $ (kraj linije), itd.
+
+ 6. Postavljanje kursora na početak linije: 0
+
+ 7. Za poništenje prethodnih promjena, pritisnite: u (malo u)
+ Za poništenje svih promjena na liniji, pritisnite: U (veliko U)
+ Za vraćanja promjena, utipkajte: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.1: NAREDBA POSTAVI
+
+
+ ** p za unos prethodno izbrisanog teksta iza kursora. **
+
+ 1. Pomaknite kursor na prvu sljedeću liniju označenu s --->.
+
+ 2. Otipkajte dd kako bi izbrisali liniju i spremili je u Vim registar.
+
+ 3. Pomaknite kursor na liniju c), IZNAD linije koju trebate unijeti.
+
+ 4. Otipkajte p kako bi postavili liniju ispod kursora.
+
+ 5. Ponovite korake 2 do 4 kako bi postavili sve linije u pravilnom
+ rasporedu.
+
+---> d) Možeš li i ti naučiti?
+---> b) Ljubice su plave,
+---> c) Inteligencija je naučena,
+---> a) Ruže su crvene,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.2: NAREDBA PROMJENE
+
+
+ ** Otipkajte rx za zamjenu slova ispod kursora sa slovom x . **
+
+ 1. Pomaknite kursor na prvu sljedeću liniju označenu s --->.
+
+ 2. Pomaknite kursor tako da se nalazi na prvoj pogrešci.
+
+ 3. Otipkajte r i nakon toga ispravan znak na tom mjestu.
+
+ 4. Ponovite korake 2 i 3 sve dok prva
+ linije ne bude istovjetna drugoj.
+
+---> Kede ju ovu limija tupjana, natko je protuskao kruve tupke!
+---> Kada je ova linija tipkana, netko je pritiskao krive tipke!
+
+ 5. Prijeđite na Lekciju 3.2.
+
+NAPOMENA: Prisjetite da trebate učiti vježbanjem, ne pamćenjem.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.3: OPERATOR MIJENJANJA
+
+
+ ** Za mijenjanje do kraja riječi, istipkajte ce . **
+
+ 1. Pomaknite kursor na prvu sljedeću liniju označenu s --->.
+
+ 2. Postavite kursor na a u lackmb.
+
+ 3. Otipkajte ce i ispravite riječ (u ovom slučaju otipkajte inija ).
+
+ 4. Pritisnite <ESC> i pomaknite kursor na sljedeći znak
+ kojeg je potrebno ispraviti.
+
+ 5. Ponovite korake 3 i 4 sve dok prva rečenica ne postane istovjetna
+ drugoj.
+
+---> Ova lackmb ima nekoliko rjlcah koje trfcb mijdmlfsz.
+---> Ova linija ima nekoliko riječi koje treba mijenjati.
+
+Primijetite da ce briše riječ i postavlja Vim u Insert mod.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.4: JOŠ MIJENJANJA KORIŠTENJEM c
+
+
+ ** Naredba mijenjanja se koristi sa istim pokretima kao i brisanje. **
+
+ 1. Operator mijenjanja se koristi na isti način kao i operator brisanja:
+
+ c [broj] pokret
+
+ 2. Pokreti su isti, npr: w (riječ) i $ (kraj linije).
+
+ 3. Pomaknite kursor na prvu sljedeću liniju označenu s --->.
+
+ 4. Pomaknite kursor na prvu pogrešku.
+
+ 5. Otipkajte c$ i utipkajte ostatak linije tako da bude istovjetna
+ drugoj te pritisnite <ESC>.
+
+---> Kraj ove linije treba pomoć tako da izgleda kao linija ispod.
+---> Kraj ove linije treba ispraviti korištenjem c$ naredbe.
+
+NAPOMENA: Možete koristiti Backspace za ispravljanje grešaka.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3 SAŽETAK
+
+
+ 1. Za postavljanje teksta koji je upravo izbrisan, pritisnite p . Ovo
+ postavlja tekst IZA kursora (ako je pak linija izbrisana tekst se
+ postavlja na liniju ispod kursora).
+
+ 2. Za promjenu znaka na kojem se nalazi kursor, pritisnite r i nakon toga
+ željeni znak.
+
+ 3. Operator mijenjanja dozvoljava promjenu teksta od kursora do pozicije do
+ koje dovede pokret. tj. Otipkajte ce za mijenjanje od kursora do kraja
+ riječi, c$ za mijenjanje od kursora do kraja linije.
+
+ 4. Oblik naredbe mijenjanja:
+
+ c [broj] pokret
+
+Prijeđite na sljedeću lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.1: POZICIJA KURSORA I STATUS DATOTEKE
+
+ ** CTRL-G za prikaz pozicije kursora u datoteci i status datoteke.
+ Pritisnite G za pomicanje kursora na neku liniju u datoteci. **
+
+NAPOMENA: Pročitajte cijelu lekciju prije izvršenja bilo kojeg koraka!!
+
+ 1. Držite Ctrl tipku pritisnutom i pritisnite g . Ukratko: CTRL-G.
+ Vim će ispisati poruku na dnu ekrana sa imenom datoteke i pozicijom
+ kursora u datoteci. Zapamtite broj linije za 3. korak.
+
+NAPOMENA: Možete vidjeti poziciju kursora u donjem desnom kutu ako
+ je postavka 'ruler' aktivirana (objašnjeno u 6. lekciji).
+
+ 2. Pritisnite G za pomicanje kursora na kraj datoteke.
+ Otipkajte gg za pomicanje kursora na početak datoteke.
+
+ 3. Otipkajte broj linije na kojoj ste bili maloprije i zatim G . Kursor
+ će se vratiti na liniju na kojoj se nalazio kada ste otipkali CTRL-G.
+
+ 4. Ako ste spremni, izvršite korake od 1 do 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.2: NAREDBE TRAŽENJA
+
+ ** Otipkajte / i nakon toga izraz kojeg želite tražiti. **
+
+ 1. U Normal modu otipkajte / znak. Primijetite da se znak
+ pojavio zajedno sa kursorom na dnu ekrana kao kod : naredbe.
+
+ 2. Sada otipkajte 'grrrreška' <ENTER>. To je riječ koju zapravo tražite.
+
+ 3. Za ponovno traženje istog izraza, otipkajte n .
+ Za traženje istog izraza ali u suprotnom smjeru, otipkajte N .
+
+ 4. Za traženje izraza unatrag, koristite ? umjesto / .
+
+ 5. Za povratak na prethodnu poziciju koristite CTRL-O (držite Ctrl
+ pritisnutim dok ne pritisnete tipku o). Ponavljajte sve dok se ne
+ vratite na početak. CTRL-I slično kao CTRL-O ali u suprotnom smjeru.
+
+---> "pogrrrreška" je pogrešno; umjesto pogrrrreška treba stajati pogreška.
+
+NAPOMENA: Ako se traženjem dođe do kraja datoteke nastavit će se od njenog
+ početka osim ako je postavka 'wrapscan' deaktivirana.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.3: TRAŽENJE PRIPADAJUĆE ZAGRADE
+
+
+ ** Otipkajte % za pronalazak pripadajuće ), ] ili } . **
+
+ 1. Postavite kursor na bilo koju od ( , [ ili {
+ otvorenih zagrada u liniji označenoj s --->.
+
+ 2. Otipkajte znak % .
+
+ 3. Kursor će se pomaknuti na pripadajuću zatvorenu zagradu.
+
+ 4. Otipkajte % kako bi pomakli kursor na drugu pripadajuću zagradu.
+
+ 5. Pomaknite kursor na neku od (,),[,],{ ili } i ponovite % naredbu.
+
+---> Linija ( testiranja običnih ( [ uglatih ] i { vitičastih } zagrada.))
+
+
+NAPOMENA: Vrlo korisno u ispravljanju koda sa nepripadajućim zagradama!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.4: NAREDBE ZAMIJENE
+
+
+ ** Otipkajte :s/staro/novo/g da zamijenite 'staro' za 'novo'. **
+
+ 1. Pomaknite kursor na liniju označenu s --->.
+
+ 2. Otipkajte :s/cvrćč/cvrč <ENTER> . Primjetite da ova naredba zamjenjuje
+ samo prvi "cvrćč" u liniji.
+
+ 3. Otipkajte :s/cvrćč/cvrč/g . Dodavanje g stavke znači da će se naredba
+ izvršiti na cijeloj liniji, zamjenjivanjem svih "cvrćč" u liniji.
+
+---> i cvrćči cvrćči cvrćčak na čvoru crne smrče.
+
+ 4. Za zamjenu svih izraza u rasponu dviju linija,
+ otipkajte :#,#s/staro/novo/g #,# su brojevi linije datoteke na kojima
+ te između njih će se izvršiti zamjena.
+ Otipkajte :%s/staro/novo/g za zamjenu svih izraza u cijeloj datoteci.
+ Otipkajte :%s/staro/novo/gc za pronalazak svakog izraza u datoteci i
+ potvrdu zamjene.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4 SAŽETAK
+
+
+ 1. CTRL-G prikazuje poziciju kursora u datoteci i status datoteke.
+ G postavlja kursor na zadnju liniju datoteke.
+ broj G postavlja kursor na broj liniju.
+ gg postavlja kursor na prvu liniju.
+
+ 2. Tipkanje / sa izrazom traži UNAPRIJED taj izraz.
+ Tipkanje ? sa izrazom traži UNATRAG taj izraz.
+ Nakon naredbe traženja koristite n za pronalazak izraza u istom
+ smjeru, i N za pronalazak istog izraza ali u suprotnom smjeru.
+ CTRL-O vraća kursor na prethodnu poziciju, CTRL-I na sljedeću poziciju.
+
+ 3. Tipkanje % dok je kursor na zagradi pomiče ga na pripadajuću zagradu.
+
+ 4. Za zamjenu prvog izraza staro za izraz novo :s/staro/novo
+ Za zamjenu svih izraza staro na cijeloj liniji :s/staro/novo/g
+ Za zamjenu svih izraza staro u rasponu linija #,# :#,#s/staro/novo/g
+ Za zamjenu u cijeloj datoteci :%s/staro/novo/g
+ Za potvrdu svake zamjene dodajte 'c' :%s/staro/novo/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.1: IZVRŠAVANJE VANJSKIH NAREDBI
+
+
+ ** Otipkajte :! sa vanjskom naredbom koju želite izvršiti. **
+
+ 1. Otipkajte poznatu naredbu : kako bi kursor premjestili na dno
+ ekrana. Time omogućavate unos naredbe u naredbenoj liniji.
+
+ 2. Otipkajte znak ! (uskličnik). Tako omogućavate
+ izvršavanje naredbe vanjske ljuske.
+
+ 3. Kao primjer otipkajte ls nakon ! te pritisnite <ENTER>.
+ Ovo će prikazati sadržaj direktorija, kao da ste u ljusci.
+ Koristite :!dir ako :!ls ne radi.
+
+NAPOMENA: Moguće je izvršavati bilo koju vanjsku naredbu na ovaj način,
+ zajedno sa njenim argumentima.
+
+NAPOMENA: Sve : naredbe se izvršavaju nakon što pritisnete <ENTER>
+ U daljnjem tekstu to neće uvijek biti napomenuto.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.2: VIŠE O SPREMANJU DATOTEKA
+
+ ** Za spremanje promjena, otipkajte :w IME_DATOTEKE. **
+
+ 1. Otipkajte :!dir ili :!ls za pregled direktorija.
+ Već znate da morate pritisnuti <ENTER> na kraju tipkanja.
+
+ 2. Izaberite ime datoteke koja još ne postoji, npr. TEST.
+
+ 3. Otipkajte: :w TEST (gdje je TEST ime koje ste prethodno odabrali.)
+
+ 4. Time će te spremiti cijelu datoteku (Vim Tutor) pod imenom TEST.
+ Za provjeru, otipkajte ponovno :!dir ili :!ls
+ za pregled direktorija.
+
+NAPOMENA: Ako bi napustili Vim i ponovno ga pokrenuli sa vim TEST ,
+ datoteka bi bila potpuna kopija ove datoteke u trenutku
+ kada ste je spremili.
+
+ 5. Izbrišite datoteku tako da otipkate (MS-DOS): :!del TEST
+ ili (Unix): :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.3: SPREMANJE OZNAČENOG TEKSTA
+
+
+ ** Kako bi spremili dio datoteke, otipkajte v pokret :w IME_DATOTEKE **
+
+ 1. Pomaknite kursor na ovu liniju.
+
+ 2. Pritisnite v i pomaknite kursor pet linija ispod ove.
+ Primijetite promjenu, označeni tekst se razlikuje od običnog.
+
+ 3. Pritisnite : znak. Na dnu ekrana pojavit će se :'<,'> .
+
+ 4. Otipkajte w TEST , pritom je TEST ime datoteke koja još ne postoji.
+ Provjerite da zaista piše :'<,'>w TEST
+ prije nego što pritisnite <ENTER>.
+
+ 5. Vim će spremiti označeni tekst u TEST. Provjerite sa :!dir ili :!ls .
+ Nemojte je još brisati! Koristiti će te je u sljedećoj lekciji.
+
+NAPOMENA: Tipka v započinje Vizualno označavanje. Možete pomicati kursor
+ unaokolo kako bi mijenjali veličinu označenog teksta. Možete
+ koristiti i operatore. Npr, d će izbrisati označeni tekst.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.4: UČITAVANJE DATOTEKA
+
+
+ ** Za ubacivanje sadržaja datoteke, otipkajte :r IME_DATOTEKE **
+
+ 1. Postavite kursor iznad ove linije.
+
+NAPOMENA: Nakon što izvršite 2. korak vidjeti će te tekst iz Lekcije 5.3.
+ Stoga pomaknite kursor DOLJE kako bi ponovno vidjeli ovu lekciju.
+
+ 2. Učitajte vašu TEST datoteku koristeći naredbu :r TEST
+ gdje je TEST ime datoteke koju ste koristili u prethodnoj lekciji.
+ Sadržaj učitane datoteke je ubačen liniju ispod kursora.
+
+ 3. Kako bi provjerili da je datoteka učitana, vratite kursor unatrag i
+ primijetite dvije kopije Lekcije 5.3, originalnu i onu iz datoteke.
+
+NAPOMENA: Možete također učitati ispis vanjske naredbe. Npr, :r !ls
+ će učitati ispis ls naredbe i postaviti ispis liniju ispod
+ kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5 SAŽETAK
+
+
+ 1. :!naredba izvršava vanjsku naredbu.
+
+ Korisni primjeri:
+ (MS-DOS) (Unix)
+ :!dir :!ls - pregled direktorija.
+ :!del DATOTEKA :!rm DATOTEKA - briše datoteku DATOTEKA.
+
+ 2. :w DATOTEKA zapisuje trenutačnu datoteku na disk sa imenom DATOTEKA.
+
+ 3. v pokret :w IME_DATOTEKE sprema vizualno označene linije u
+ datoteku IME_DATOTEKE.
+
+ 4. :r IME_DATOTEKE učitava datoteku IME_DATOTEKE sa diska i stavlja
+ njen sadržaj liniju ispod kursora.
+
+ 5. :r !dir učitava ispis naredbe dir i postavlja sadržaj ispisa liniju
+ ispod kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.1: NAREDBA OTVORI
+
+
+ ** Pritisnite o kako bi otvorili liniju ispod kursora
+ i prešli u Insert mod. **
+
+ 1. Pomaknite kursor na sljedeću liniju označenu s --->.
+
+ 2. Otipkajte malo o kako bi otvorili novu liniju ISPOD kursora
+ i prešli u Insert mod.
+
+ 3. Otipkajte nešto teksta i nakon toga pritisnite <ESC>
+ kako bi napustili Insert mod.
+
+---> Nakon što pritisnete o kursor će preći u novu liniju u Insert mod.
+
+ 4. Za otvaranje linije IZNAD kursora, otipkajte umjesto malog o veliko O ,
+ Pokušajte na donjoj liniji označenoj s --->.
+
+---> Otvorite liniju iznad ove - otipkajte O dok je kursor na ovoj liniji.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.2: NAREDBA DODAJ
+
+
+ ** Otipkajte a za dodavanje teksta IZA kursora. **
+
+ 1. Pomaknite kursor na početak sljedeće linije označene s --->.
+
+ 2. Tipkajte e dok se kursor ne nalazi na kraju li .
+
+ 3. Otipkajte a (malo) kako bi dodali tekst IZA kursora.
+
+ 4. Dopunite riječ kao što je na liniji ispod.
+ Pritisnite <ESC> za izlaz iz Insert moda.
+
+ 5. Sa e prijeđite na sljedeću nepotpunu riječ i ponovite korake 3 i 4.
+
+---> Ova li omogućava vje dodav teksta nekoj liniji.
+---> Ova linija omogućava vježbanje dodavanja teksta nekoj liniji.
+
+NAPOMENA: Sa i, a, i A prelazite u isti Insert mod, jedina
+ razlika je u poziciji od koje će se tekst ubacivati.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.3: DRUGI NAČIN MIJENJANJA
+
+
+ ** Otipkajte veliko R kako bi zamijelili više od jednog znaka. **
+
+ 1. Pomaknite kursor na prvu sljedeću liniju označenu s --->.
+ Pomaknite kursor na početak prvog xxx .
+
+ 2. Pritisnite R i otipkajte broj koji je liniju ispod,
+ tako da zamijeni xxx .
+
+ 3. Pritisnite <ESC> za izlaz iz Replace moda.
+ Primijetite da je ostatak linije ostao nepromjenjen.
+
+ 5. Ponovite korake kako bi zamijenili preostali xxx.
+
+---> Zbrajanje: 123 plus xxx je xxx.
+---> Zbrajanje: 123 plus 456 je 579.
+
+NAPOMENA: Replace mod je kao Insert mod, ali sa bitnom razlikom,
+ svaki otipkani znak briše već postojeći.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.4: KOPIRANJE I LIJEPLJENJE TEKSTA
+
+
+ ** Koristite y operator za kopiranje a p za lijepljenje teksta. **
+
+ 1. Pomaknite kursor na liniju s ---> i postavite kursor nakon "a)".
+
+ 2. Pokrenite Visual mod sa v i pomaknite kursor sve do ispred "prva".
+
+ 3. Pritisnite y kako bi kopirali označeni tekst.
+
+ 4. Pomaknite kursor do kraja sljedeće linije: j$
+
+ 5. Pritisnite p kako bi zalijepili tekst. Onda utipkajte: druga <ESC> .
+
+ 6. Koristite Visual mod kako bi označili " linija.", kopirajte: y , kursor
+ postavite na kraj sljedeće linije: j$ i ondje zalijepite tekst: p .
+
+---> a) ovo je prva linija.
+ b)
+
+NAPOMENA: možete koristiti y kao operator; yw kopira jednu riječ.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.5: MIJENJANJE POSTAVKI
+
+
+ ** Postavka: naredbe traženja i zamijene ne razlikuju VELIKA i mala slova **
+
+ 1. Potražite 'razlika' tipkanjem: /razlika <ENTER>
+ Nekoliko puta ponovite pritiskanjem n .
+
+ 2. Aktivirajte 'ic' (Ignore case) postavku: :set ic
+
+ 3. Ponovno potražite 'razlika' tipkanjem n
+ Primijetite da su sada i RAZLIKA i Razlika pronađeni.
+
+ 4. Aktivirajte 'hlsearch' i 'incsearch' postavke: :set hls is
+
+ 5. Otipkajte naredbu traženja i primijetite razlike: /razlika <ENTER>
+
+ 6. Za deaktiviranje ic postavke koristite: :set noic
+
+NAPOMENA: Za neoznačavanje pronađenih izraza otipkajte: :nohlsearch
+NAPOMENA: Bez razlikovanja velikih i malih slova u samo jednoj naredbi
+ koristite \c u izrazu: /razlika\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6 SAŽETAK
+
+ 1. Pritisnite o za otvaranje linije ISPOD kursora i prelazak u Insert mod.
+ Pritisnite O za otvaranje linije IZNAD kursora.
+
+ 2. Pritisnite a za unos teksta IZA kursora.
+ Pritisnite A za unos teksta na kraju linije.
+
+ 3. Naredba e pomiče kursor na kraj riječi.
+
+ 4. Operator y kopira tekst, p ga lijepi.
+
+ 5. Tipkanjem velikog R Vim prelazi u Replace mod dok ne pritisnete <ESC> .
+
+ 6. Tipkanjem ":set xxx" aktivira postavku "xxx". Neke postavke su:
+ 'ic' 'ignorecase' ne razlikuje velika/mala slova pri traženju
+ 'is' 'incsearch' traži nedovršene izraze
+ 'hls' 'hlsearch' označi sve pronađene izraze
+ Možete koristite dugo ili kratko ime postavke.
+
+ 7. Prethodite "no" imenu postavke za deaktiviranje iste: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.1: DOBIVANJE POMOĆI
+
+
+ ** Koristite on-line sustav pomoći **
+
+ Vim ima detaljan on-line sustav pomoći.
+ Za početak, pokušajte jedno od sljedećeg:
+ - pritisnite <HELP> tipku (ako je vaša tipkovnica ima)
+ - pritisnite <F1> tipku (ako je vaša tipkovnica ima)
+ - utipkajte :help <ENTER>
+
+ Pročitajte tekst u prozoru pomoći kako bi ste se znali služiti istom.
+ Tipkanjem CTRL-W CTRL-W prelazite iz jednog prozora u drugi.
+ Otipkajte :q <ENTER> kako bi zatvorili prozor pomoći.
+
+ Pronaći će te pomoć o bilo kojoj temi, tako da dodate upit samoj
+ ":help" naredbi. Pokušajte (ne zaboravite pritisnuti <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.2: PRAVLJENJE SKRIPTE
+
+
+ ** Aktivirajte Vim mogućnosti **
+
+ Vim ima mnogo više alata od Vi-ja, ali većina njih nije aktivirana.
+ Kako bi mogli koristiti više mogućnosti napravite "vimrc" datoteku.
+
+ 1. Uredite "vimrc" datoteku. Ovo ovisi o vašem sistemu:
+ :e ~/.vimrc za Unix
+ :e ~/_vimrc za MS-Windows
+
+ 2. Sada učitajte primjer sadržaja "vimrc" datoteke:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Sačuvajte datoteku sa:
+ :w
+
+ Sljedećeg puta kada pokrenete Vim, bojanje sintakse teksta biti će
+ aktivirano. Sve vaše postavke možete dodati u "vimrc" datoteku.
+ Za više informacija otipkajte :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.3: AUTOMATSKO DOVRŠAVANJE
+
+
+ ** Dovršavanje iz naredbene linije pomoću CTRL-D i <TAB> **
+
+ 1. Provjerite da Vim nije u Vi modu: :set nocp
+
+ 2. Pogledajte koje datoteke postoje u direktoriju: :!ls or :!dir
+
+ 3. Otipkajte početak naredbe: :e
+
+ 4. Tipkajte CTRL-D i prikazati će se lista naredbi koje započinju sa "e".
+
+ 5. Pritisnite <TAB> i Vim će dopuniti unos u naredbu ":edit".
+
+ 6. Dodajte razmak i početak datoteke: :edit FIL
+
+ 7. Pritisnite <TAB>. Vim će nadopuniti ime datoteke (ako je jedinstveno).
+
+NAPOMENA: Moguće je dopuniti mnoge naredbe. Koristite CTRL-D i <TAB>.
+ Naročito je korisno za :help naredbe.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7 SAŽETAK
+
+
+ 1. Otipkajte :help ili pritisnite <F1> ili <Help> za pomoć.
+
+ 2. Otipkajte :help naredba kako bi dobili pomoć za naredba .
+
+ 3. Otipkajte CTRL-W CTRL-W za prelazak u drugi prozor
+
+ 4. Otipkajte :q kako bi zatvorili prozor pomoći
+
+ 5. Napravite vimrc skriptu za podizanje kako bi u nju spremali
+ vaše omiljene postavke.
+
+ 6. Kada tipkate naredbu koja započinje sa :
+ pritisnite CTRL-D kako bi vidjeli moguće valjane vrijednosti.
+ Pritisnite <TAB> kako bi odabrali jednu od njih.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Kraj. Cilj priručnika je da pokaže kratak pregled Vim editora, tek toliko
+ da omogući njegovo korištenje. Priručnik nije potpun jer Vim ima mnogo više
+ naredbi. Za više informacija: ":help user-manual".
+
+ Za čitanje i korištenje, preporučamo:
+ Vim - Vi Improved - by Steve Oualline
+ Izdavač: New Riders
+ Prva knjiga potpuno posvećena Vim-u. Vrlo korisna za početnike.
+ Sa mnogo primjera i slika.
+ Posjetite https://iccf-holland.org/click5.html
+
+ Sljedeća knjiga je nešto starija i više o Vi-u nego o Vim-u, preporučamo:
+ Learning the Vi Editor - by Linda Lamb
+ Izdavač: O'Reilly & Associates Inc.
+ Solidna knjiga, možete saznati skoro sve što možete napraviti
+ u Vi-u. Šesto izdanje ima nešto informacija i o Vim-u.
+
+ Ovaj priručnik su napisali: Michael C. Pierce i Robert K. Ware,
+ Colorado School of Mines koristeći ideje Charles Smith,
+ Colorado State University. E-pošta: bware@mines.colorado.edu.
+
+ Naknadne promjene napravio je Bram Moolenaar.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Preveo na hrvatski: Paul B. Mahol <onemda@gmail.com>
+ Preinaka 1.42, Lipanj 2008
+
+
diff --git a/runtime/tutor/tutor.hu b/runtime/tutor/tutor.hu
new file mode 100644
index 0000000..d895e19
--- /dev/null
+++ b/runtime/tutor/tutor.hu
@@ -0,0 +1,830 @@
+===============================================================================
+== d v z l j k a V I M - o k t a t b a n - 1.5-s verzi ==
+===============================================================================
+
+ A Vim egy nagyon hatkony szerkeszt, amelynek rengeteg utastsa
+ van, tl sok, hogy egy ilyen oktatban (tutorban), mint az itteni
+ mindet elmagyarzzuk. Ez az oktat arra trekszik, hogy annyit
+ elmagyarzzon, amennyi elg, hogy knnyedn hasznljuk a Vim-et, az
+ ltalnos cl szvegszerkesztt.
+
+ A feladatok megoldshoz 25-30 perc szksges attl fggen,
+ mennyit tltnk a ksrletezssel.
+
+ A leckben szerepl utastsok mdostani fogjk a szveget.
+ Ksztsen msolatot errl a fjlrl, ha gyakorolni akar.
+ (Ha "vimtutor"-ral indtotta, akkor ez mr egy msolat.)
+
+ Fontos megrteni, hogy ez az oktat cselekedve tanttat.
+ Ez azt jelenti, hogy nnek ajnlott vgrehajtania az utastsokat,
+ hogy megfelelen megtanulja azokat. Ha csak olvassa, elfelejti!
+
+ Most bizonyosodjon, meg, hogy a Caps-Lock gombja NINCS lenyomva, s
+ Nyomja meg megfelel szmszor a j gombot, hogy az 1.1-es
+ lecke teljesen a kpernyn legyen!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.1. lecke: A KURZOR MOZGATSA
+
+
+ ** A kurzor mozgatshoz nyomja meg a h,j,k,l gombokat az albbi szerint. **
+ ^
+ k Tipp: A h billenty van balra, s balra mozgat
+ < h l > A l billenty van jobbra, s jobbra mozgat
+ j A j billenty olyan, mint egy lefele nyl
+ v
+ 1. Mozgassa a kurzort krbe az ablakban, amg hozz nem szokik!
+
+ 2. Tartsa lenyomva a lefelt (j), akkor ismtldik!
+---> Most tudja, hogyan mehet a kvetkez leckre.
+
+ 3. A lefel gomb hasznlatval menjen a 1.2. leckre!
+
+Megj: Ha nem biztos benne, mit nyomott meg, nyomja meg az <ESC>-et, hogy
+ norml mdba kerljn, s ismtelje meg a parancsot!
+
+Megj: A kurzor gomboknak is mkdnik kell, de a hjkl hasznlatval
+ sokkal gyorsabban tud, mozogni, ha hozzszokik.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.2. lecke: BE S KILPS A VIMBL
+
+
+ !! MEGJ: Mieltt vgrehajtja az albbi lpseket, olvassa vgig a leckt !!
+
+ 1. Nyomja meg az <ESC> gombot (hogy biztosan norml mdban legyen).
+
+ 2. rja: :q! <ENTER>.
+
+---> Ezzel kilp a szerkesztbl a vltozsok MENTSE NLKL.
+ Ha menteni szeretn a vltozsokat s kilpni, rja:
+ :wq <ENTER>
+
+ 3. Amikor a shell promptot ltja, rja be a parancsot, amely ebbe az
+ oktatba hozza:
+ Ez valsznleg: vimtutor <ENTER>
+ Normlis esetben ezt rn: vim tutor.hu <ENTER>
+
+---> 'vim' jelenti a vimbe belpst, 'tutor.hu' a fjl, amit szerkeszteni kvn.
+
+ 4. Ha megjegyezte a lpseket s biztos magban, hajtsa vgre a lpseket
+ 1-tl 3-ig, hogy kilpjen s visszatrjen a szerkesztbe. Azutn
+ menjen az 1.3. leckre.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.3. lecke: SZVEG SZERKESZTSE - TRLS
+
+
+** Norml mdban nyomjon x-et, hogy a kurzor alatti karaktert trlje. **
+
+ 1. Mozgassa a kurzort a ---> kezdet sorra!
+
+ 2. A hibk kijavtshoz mozgassa a kurzort amg a trlend karakter
+ fl nem r.
+
+ 3. Nyomja meg az x gombot, hogy trlje a nem kvnt karaktert.
+
+ 4. Ismtelje a 2, 3, 4-es lpseket, hogy kijavtsa a mondatot.
+
+---> szi jjjell izziik aa galaggonya rruuhja.
+
+ 5. Ha a sor helyes, ugorjon a 1.4. leckre.
+
+MEGJ: A tanuls sorn ne memorizlni prbljon, hanem hasznlat sorn tanuljon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.4. lecke: SZVEG SZERKESZTSE - BESZRS
+
+
+ ** Norml mdban i megnyomsval lehet beilleszteni. **
+
+ 1. Az albbi els ---> kezdet sorra menjen.
+
+ 2. Ahhoz, hogy az elst azonoss tegye a msodikkal, mozgassa a kurzort
+ az els karakterre, amely UTN szveget kell beszrni.
+
+ 3. Nyomjon i-t s rja be a megfelel szveget.
+
+ 4. Amikor mindent bert, nyomjon <ESC>-et, hogy Norml mdba visszatrjen.
+ Ismtelje a 2 s 4 kztti lpseket, hogy kijavtsa a mondatot.
+
+---> Az that sol hizik pr sz.
+---> Az itt lthat sorbl hinyzik pr rsz.
+
+ 5. Ha mr begyakorolta a beszrst, menjen az albbi sszefoglalra.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1. LECKE SSZEFOGLALJA
+
+
+ 1. A kurzort vagy a nyilakkal vagy a hjkl gombokkal mozgathatja.
+ h (balra) j (le) k (fel) l (jobbra)
+
+ 2. A Vimbe (a $ prompttl) gy lphet be: vim FILENAME <ENTER>
+
+ 3. A Vimbl gy lphet ki: <ESC> :q! <ENTER> a vltoztatsok eldobsval.
+ vagy gy: <ESC> :wq <ENTER> a vltozsok mentsvel.
+
+ 4. A kurzor alatti karakter trlse norml mdban: x
+
+ 5. Szveg beszrsa a kurzor utn norml mdban:
+ i gpelje be a szveget <ESC>
+
+MEGJ: Az <ESC> megnyomsa norml mdba viszi, vagy megszakt egy nem befejezett
+ rszben befejezett parancsot.
+
+Most folytassuk a 2. leckvel!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.1. lecke: TRL UTASTSOK
+
+
+ ** dw trl a sz vgig. **
+
+ 1. Nyomjon <ESC>-et, hogy megbizonyosodjon, hogy norml mdban van!
+
+ 2. Mozgassa a kurzort a ---> kezdet sorra!
+
+ 3. Mozgassa a kurzort arra annak a sznak az elejre, amit trlni szeretne.
+ Trlje az llatokat a mondatbl.
+
+ 4. A sz trlshez rja: dw
+
+ MEGJ: Ha rosszul kezdte az utastst csak nyomjon <ESC> gombot
+ a megszaktshoz.
+
+---> Pr sz kutya nem uhu illik pingvin a mondatba tehn.
+
+ 5. Ismtelje a 3 s 4 kztti utastsokat amg kell s ugorjon a 2.2 leckre!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.2. lecke: MG TBB TRL UTASTS
+
+
+ ** d$ bersval a sor vgig trlhet. **
+
+ 1. Nyomjon <ESC>-et, hogy megbizonyosodjon, hogy norml mdban van!
+
+ 2. Mozgassa a kurzort a ---> kezdet sorra!
+
+ 3. Mozgassa a kurzort a helyes sor vgre (az els . UTN)!
+
+ 4. d$ begpelsvel trlje a sor vgt!
+
+---> Valaki a sor vgt ktszer gpelte be. ktszer gpelte be.
+
+
+ 5. Menjen a 2.3. leckre, hogy megrtse mi trtnt!
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.3. lecke: UTASTSOKRL S MOZGSOKRL
+
+
+ A d (delete=trls) utasts formja a kvetkez:
+
+ [szm] d mozgs VAGY d [szm] mozgs
+ Ahol:
+ szm - hnyszor hajtdjon vgre a parancs (elhagyhat, alaprtk=1).
+ d - a trls (delete) utasts.
+ mozgs - amin a parancsnak teljeslnie kell (albb listzva).
+
+ Mozgsok rvid listja:
+ w - a kurzortl a sz vgig, belertve a szkzt.
+ e - a kurzortl a sz vgig, NEM belertve a szkzt.
+ $ - a kurzortl a sor vgig.
+
+MEGJ: Csupn a mozgs begpelsvel (parancs nlkl)
+ a kurzor mozgs ltal megadott helyre kerl.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.4. lecke: EGSZ SOROK FELDOLGOZSA
+
+
+ ** dd bersval trlheti az egsz sort. **
+
+ A teljes sor trlsnek gyakorisga miatt a Vi tervezi elhatroztk,
+ hogy knnyebb lenne csupn a d-t ktszer megnyomni, hogy egy sort trljnk.
+
+ 1. Mozgassa a kurzort az albbi kifejezsek msodik sorra!
+ 2. dd begpelsvel trlje a sort!
+ 3. Menjen a 3. (eredetileg 4.) sorra!
+ 4. 2dd (ugyebr szm-utasts-mozgs) begpelsvel trljn kt sort!
+
+ 1) Alv szegek a jghideg homokban,
+ 2) - kezdi a klt -
+ 3) Plaktmagnyban z jjelek.
+ 4) Pingvinek ne fljetek,
+ 5) Tvolrl egy vaku villant,
+ 6) gve hagytad a folyosn a villanyt.
+ 7) Ma ontjk vremet.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.5. lecke: A VISSZAVONS (UNDO) PARANCS
+
+
+** u gpelsvel visszavonhat az utols parancs, U az egsz sort helyrelltja. **
+
+ 1. Menjnk az albbi ---> kezdet sor els hibjra!
+ 2. x lenyomsval trlje az els felesleges karaktert!
+ 3. u megnyomsval vonja vissza az utolsnak vgrehajtott utastst!
+ 4. Msodjra javtson ki minden hibt a sorban az x utastssal!
+ 5. Most nagy U -val lltsa vissza a sor eredeti llapott!
+ 6. Nyomja meg az u gombot prszor, hogy az U s az azt megelz utastsokat
+ visszalltsa!
+ 7. CTRL-R (CTRL gomb lenyomsa mellett ssn R-t) prszor csinlja jra a
+ visszavont parancsokat (redo)!
+
+---> Javtsa a hhibkaat ebbben a sooorban majd lltsa visszaaa az eredetit.
+
+ 8. Ezek nagyon hasznos parancsok. Most ugorjon a 2. lecke sszefoglaljra.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2. LECKE SSZEFOGLALJA
+
+
+ 1. Trls a kurzortl a sz vgig: dw
+
+ 2. Trls a kurzortl a sor vgig: d$
+
+ 3. Egsz sor trlse: dd
+
+ 4. Egy utasts alakja norml mdban:
+
+ [szm] utasts mozgs VAGY utasts [szm] mozgs
+ ahol:
+ szm - hnyszor ismteljk a parancsot
+ utasts - mit tegynk, pl. d a trlskor
+ mozgs - mire hasson az utasts, pldul w (sz=word),
+ $ (a sor vgig), stb.
+
+ 5. Az elz tett visszavonsa (undo): u (kis u)
+ A sor sszes vltozsnak visszavonsa: U (nagy U)
+ Visszavonsok visszavonsa: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.1. lecke: A BEILLESZTS (PUT) PARANCS
+
+
+ ** p letsvel az utolsnak trltet a kurzor utn illeszthetjk. **
+
+ 1. Mozgassuk a kurzort az albbi sorok els sorra.
+
+ 2. dd letsvel trljk a sort s eltroldik a Vim pufferben.
+
+ 3. Mozgassuk a kurzort azeltt a sor ELTTI sorba, ahov mozgatni
+ szeretnnk a trlt sort.
+
+ 4. Norml mdban rjunk p bett a trlt sor beillesztshez.
+
+ 5. Folytassuk a 2-4. utastsokkal hogy a helyes sorrendet kapjuk.
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.2. lecke: AZ TRS (REPLACE) PARANCS
+
+
+** r s a karakterek letsvel a kurzor alatti karaktert megvltoztatjuk. **
+
+ 1. Mozgassuk a kurzort az els ---> kezdet sorra!
+
+ 2. Mozgassuk a kurzort az els hiba fl!
+
+ 3. r majd a kvnt karakter letsvel vltoztassuk meg a hibsat!
+
+ 4. A 2. s 3. lpsekkel javtsuk az sszes hibt!
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. Menjnk a 3.2. leckre!
+
+MEGJ: Emlkezzen, hogy nem memorizlssal, hanem gyakorlssal tanuljon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.3. lecke: A CSERE (CHANGE) PARANCS
+
+
+ ** A sz egy rsznek megvltoztatshoz rjuk: cw . **
+
+ 1. Mozgassuk a kurzort az els ---> kezdet sorra!
+
+ 2. Vigye a kurzort a Ezen sz z betje fl!
+
+ 3. cw s a helyes szrsz (itt 'bben') bersval javtsa a szt!
+
+ 4. <ESC> lenyomsa utn a kvetkez hibra ugorjon (az els cserlend
+ karakterre)!
+
+ 5. A 3. s 4. lpsek ismtlsvel az els mondatot tegye a msodikkal
+ azonoss!
+
+---> Ezen a sorrrrr pr szra meg kell vltozzanak a change utaskrs.
+---> Ebben a sorban pr szt meg kell vltoztatni a change utastssal.
+
+Vegyk szre, hogy a cw nem csak a szt rja t, hanem beszr
+(insert) mdba vlt.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.4. lecke: TBBFLE VLTOZTATS c-VEL
+
+
+ ** A c utasts hasznlhat ugyanazokkal az mozgsokkal mint a trls **
+
+ 1. A change utasts a trlssel azonosan viselkedik. A forma:
+
+ [szm] c mozgs OR c [szm] mozgs
+
+ 2. A mozgsok is azonosak, pl. w (sz), $ (sorvg), stb.
+
+ 3. Mozgassuk a kurzort az els ---> kezdet sorra!
+
+ 4. Menjnk az els hibra!
+
+ 5. c$ begpelsvel a sorvgeket tegyk azonoss s nyomjunk <ESC>-et!
+
+---> Ennek a sornak a vge kiigaztsra szorul, hogy megegyezzen a msodikkal.
+---> Ennek a sornak a vge a c$ paranccsal vltoztathat meg.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3. LECKE SSZEFOGLALJA
+
+
+ 1. A mr trlt sort beillesztshez nyomjunk p-t. Ez a trlt szveget
+ a kurzor UTN helyezi (ha sor kerlt trlsre, a kurzor alatti sorba).
+
+ 2. A kurzor alatti karakter trshoz az r-et s azt a karaktert
+ nyomjuk, amellyel az eredetit fell szeretnnk rni.
+
+ 3. A vltoztats (c) utasts a karaktertl az mozgs vgig
+ vltoztatja meg az mozgst. Pldul a cw a kurzortl a sz vgig,
+ a c$ a sor vgig.
+
+ 4. A vltoztats formtuma:
+
+ [szm] c mozgs VAGY c [szm] mozgs
+
+Ugorjunk a kvetkez leckre!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.1. lecke: HELY S FJLLLAPOT
+
+
+ ** CTRL-g megnyomsval megnzhetjk a helynket a fjlban s a fjl llapott.
+ SHIFT-G letsvel a fjl adott sorra ugorhatunk. **
+
+ Megj: Olvassuk el az egsz leckt a lpsek vgrehajtsa eltt!!
+
+ 1. Tartsuk nyomva a Ctrl gombot s nyomjunk g-t. Az llapotsor
+ megjelenik a lap aljn a fjlnvvel s az aktulis sor sorszmval.
+ Jegyezzk meg a sorszmot a 3. lpshez!
+
+ 2. Nyomjunk Shift-G-t a lap aljra ugrshoz!
+
+ 3. ssk be az eredeti sor szmt, majd ssnk shift-G-t! Ezzel
+ visszajutunk az eredeti sorra ahol Ctrl-g-t nyomtunk.
+ (A bert szm NEM fog megjelenni a kpernyn.)
+
+ 4. Ha megjegyezte a feladatot, hajtsa vgre az 1-3. lpseket!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.2. lecke: A KERESS (SEARCH) PARANCS
+
+
+ ** / majd a kvnt kifejezs bersval kereshetjk meg a kifejezst. **
+
+ 1. Norml mdban ssnk / karaktert! Ez s a kurzor megjelenik
+ a kperny aljn, ahogy a : utasts is.
+
+ 2. rjuk be: 'hiibaa' <ENTER>! Ez az a sz amit keresnk.
+
+ 3. A kifejezs jabb keresshez ssk le egyszeren: n .
+ A kifejezs ellenkez irnyban trtn keresshez ezt ssk be: Shift-N .
+
+ 4. Ha visszafel szeretne keresni, akkor ? kell a / helyett.
+
+---> "hiibaa" nem a helyes mdja a hiba lersnak; a hiibaa egy hiba.
+
+Megj: Ha a keress elri a fjl vgt, akkor az elejn kezdi.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.3. lecke: ZRJELEK PRJNAK KERESSE
+
+
+ ** % letsvel megtalljuk a ),], vagy } prjt. **
+
+ 1. Helyezze a kurzort valamelyik (, [, vagy { zrjelre a ---> kezdet
+ sorban!
+
+ 2. ssn % karaktert!
+
+ 3. A kurzor a zrjel prjra fog ugrani.
+
+ 4. % letsvel visszaugrik az eredeti zrjelre.
+
+---> Ez ( egy tesztsor (-ekkel, [-ekkel ] s {-ekkel } a sorban. ))
+
+Megj: Ez nagyon hasznos, ha olyan programot debugolunk, amelyben a
+ zrjelek nem prosak!
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.4. lecke: A HIBK KIJAVTSNAK EGY MDJA
+
+
+ ** :s/rgi/j/g begpelsvel az 'j'-ra cserljk a 'rgi'-t. **
+
+ 1. Menjnk a ---> kezdet sorra!
+
+ 2. rjuk be: :s/eggy/egy <ENTER> . Ekkor csak az els vltozik meg a
+ sorban.
+
+ 3. Most ezt rjuk: :s/eggy/egg/g amely globlisan helyettest
+ a sorban, azaz minden elfordulst.
+ Ez a sorban minden elfordulst helyettest.
+
+---> eggy heggy meggy, szembe jn eggy msik heggy.
+
+ 4. Kt sor kztt a karaktersor minden elfordulsnak helyettestse:
+ :#,#s/rgi/j/g ahol #,# a kt sor sorszma.
+ :%s/rgi/j/g a fjlbeli sszes elforduls helyettestse.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4. LECKE SSZEFOGLALJA
+
+
+ 1. Ctrl-g kirja az kurzor helyt a fjlban s a fjl llapott.
+ Shift-G a fjl vgre megy, gg az elejre. Egy szm utn
+ Shift-G az adott szm sorra ugrik.
+
+ 2. / utn egy kifejezs ELREFELE keresi a kifejezst.
+ 2. ? utn egy kifejezs VISSZAFELE keresi a kifejezst.
+ Egy keress utn az n a kvetkez elfordulst keresi azonos irnyban
+ Shift-N az ellenkez irnyban keres.
+
+ 3. % begpelsvel, ha (,),[,],{, vagy } karakteren vagyunk a zrjel
+ prjra ugrik.
+
+ 4. az els rgi helyettestse jjal a sorban :s/rgi/j
+ az sszes rgi helyettestse jjal a sorban :s/rgi/j/g
+ kt sor kztti kifejezsekre :#,#s/rgi/j/g
+ # helyn az aktulis sor (.) s az utols ($) is llhat :.,$/rgi/j/g
+ A fjlbeli sszes elforduls helyettestse :%s/rgi/j/g
+ Mindenkori megerstsre vr 'c' hatsra :%s/rgi/j/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.1. lecke: KLS PARANCS VGREHAJTSA
+
+
+ ** :! utn kls parancsot rva vgrehajtdik a parancs. **
+
+ 1. rjuk be az ismers : parancsot, hogy a kurzort a kperny aljra
+ helyezzk. Ez lehetv teszi egy parancs berst.
+
+ 2. ! (felkiltjel) bersval tegyk lehetv kls hj (shell)-parancs
+ vgrehajtst.
+
+ 3. rjunk pldul ls parancsot a ! utn majd ssnk <ENTER>-t. Ez ki
+ fogja listzni a knyvtrunkat ugyangy, mintha a shell promptnl
+ lennnk. Vagy rja ezt :!dir ha az ls nem mkdik.
+
+Megj: Ilymdon brmely kls utasts vgrehajthat.
+
+Megj: Minden : parancs utn <ENTER>-t kell tni.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.2. lecke: BVEBBEN A FJLOK RSRL
+
+
+ ** A fjlok vltozsait gy rhatjuk ki :w FJLNV. **
+
+ 1. :!dir vagy :!ls bersval listzzuk a knyvtrunkat!
+ n mr tudja, hogy <ENTER>-t kell tnie utna.
+
+ 2. Vlasszon egy fjlnevet, amely mg nem ltezik pl. TESZT!
+
+ 3. rja: :w TESZT (ahol TESZT a vlasztott fjlnv)!
+
+ 4. Ez elmenti a teljes fjlt (a Vim oktatjt) TESZT nven.
+ Ellenrzskpp rjuk ismt :!dir hogy lssuk a knyvtrat!
+ (Felfel gombbal : utn az elz utastsok visszahozhatak.)
+
+Megj: Ha n kilpne a Vimbl s s visszatrne a TESZT fjlnvvel, akkor a
+ fjl az oktat mentskori pontos msolata lenne.
+
+ 5. Tvoltsa el a fjlt (MS-DOS): :!del TESZT
+ vagy (Unix): :!rm TESZT
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.3. lecke: EGY KIVLASZTOTT RSZ KIRSA
+
+
+ ** A fjl egy rsznek kirshoz rja :#,# w FJLNV **
+
+ 1. :!dir vagy :!ls bersval listzza a knyvtrat, s vlasszon egy
+ megfelel fjlnevet, pl. TESZT.
+
+ 2. Mozgassa a kurzort ennek az oldalnak a tetejre, s nyomjon
+ Ctrl-g-t, hogy megtudja a sorszmot. JEGYEZZE MEG A SZMOT!
+
+ 3. Most menjen a lap aljra, s sse be ismt: Ctrl-g. EZT A SZMOT
+ IS JEGYEZZE MEG!
+
+ 4. Ha csak ezt a rszt szeretn menteni a fjlnak, rja :#,# w TESZT
+ ahol #,# a kt sorszm, amit megjegyzett, TESZT az n fjlneve.
+
+ 5. Ismt nzze meg, hogy a fjl ott van (:!dir) de NE trlje.
+
+ 6. Vimben ltezik egy msik lehetsg: nyomja meg a Shift-V gombprt
+ az els menteni kvnt soron, majd menjen le az utolsra, ezutn
+ rja :w TESZT2 Ekkor a TESZT2 fjlba kerl a kijellt rsz.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.4. lecke: FJLOK VISSZALLTSA S SSZEFZSE
+
+
+ ** Egy fjl tartalmnak beillesztshez rja :r FJLNV **
+
+ 1. :!dir bersval nzze meg, hogy az n TESZT fjlja ltezik mg.
+
+ 2. Helyezze a kurzort ennek az oldalnak a tetejre.
+
+MEGJ: A 3. lps utn az 5.3. leckt fogja ltni. Azutn LEFEL indulva
+ keresse meg ismt ezt a leckt.
+
+ 3. Most szrja be a TESZT nev fjlt a :r TESZT paranccsal, ahol
+ TESZT az n fjljnak a neve.
+
+MEGJ: A fjl, amit beillesztett a kurzora alatt helyezkedik el.
+
+ 4. Hogy ellenrizzk, hogy a fjlt tnyleg beillesztettk, menjen
+ vissza, s nzze meg, hogy ktszer szerepel az 5.3. lecke! Az eredeti
+ mellett a fjlbl bemsolt is ott van.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5. LECKE SSZEFOGLALJA
+
+
+ 1. :!parancs vgrehajt egy kls utastst.
+
+ Pr hasznos plda:
+ (MS-DOS) (Unix)
+ :!dir :!ls - knyvtrlista kirsa.
+ :!del FJLNV :!rm FJLNV - FJLNV nev fjl trlse.
+
+ 2. :w FJLNV kirja a jelenlegi Vim-fjlt a lemezre FJNV nven.
+
+ 3. :#,#w FJLNV kirja a kt sorszm (#) kztti sorokat FJLNV-be
+ Msik lehetsg, hogy a kezdsornl Shift-v-t nyom lemegy az utols
+ sorra, majd ezt ti be :w FJLNV
+
+ 4. :r FJLNV beolvassa a FJLNV fjlt s behelyezi a jelenlegi fjlba
+ a kurzorpozci utni sorba.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.1. lecke: A MEGNYITS (OPEN) PARANCS
+
+
+** o bersval nyit egy j sort a kurzor alatt s beszr mdba vlt **
+
+ 1. Mozgassuk a kurzort a ---> kezdet sorra.
+
+ 2. o (kicsi) bersval nyisson egy sort a kurzor ALATT! Ekkor
+ automatikusan beszr (insert) mdba kerl.
+
+ 3. Msolja le a ---> jel sort s <ESC> megnyomsval lpjen ki
+ a beszr mdbl.
+
+---> Az o lenyomsa utn a kurzor a kvetkez sor elejn ll beszr mdban.
+
+ 4. A kurzor FELETTI sor megnyitshoz egyszeren nagy O bett rjon
+kicsi helyett. Prblja ki a kvetkez soron!
+Nyisson egy j sort efelett Shift-O megnyomsval, mialatt a kurzor
+ezen a soron ll.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.2. lecke: AZ APPEND PARANCS
+
+
+ ** a lenyomsval a kurzor UTN szrhatunk szveget. **
+
+ 1. Mozgassuk a kurzort a kvetkez ---> kezdet sor vgre gy,
+ hogy norml mdban $-t r be.
+
+ 2. Kis "a" letsvel szveget szrhat be AMG a karakter mg,
+ amelyen a kurzor ll.
+ (A nagy "A" az egsz sor vgre rja a szveget.)
+
+Megj: A Vimben a sor legvgre is lehet llni, azonban ez eldjben
+ a Vi-ban nem lehetsges, ezrt abban az a nlkl elg krlmnyes
+ a sor vghez szveget rni.
+
+ 3. Egsztse ki az els sort. Vegye szre, hogy az a utasts (append)
+ teljesen egyezik az i-vel (insert) csupn a beszrt szveg helye
+ klnbzik.
+
+---> Ez a sor lehetv teszi nnek, hogy gyakorolja
+---> Ez a sor lehetv teszi nnek, hogy gyakorolja a sor vgre beillesztst.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.3. lecke: AZ TRS MSIK VLTOZATA
+
+
+ ** Nagy R bersval rhat fell tbb mint egy karaktert. **
+
+ 1. Mozgassuk a kurzort az els ---> kezdet sorra!
+
+ 2. Helyezze a kurzort az els sz elejre amely eltr a msodik
+ ---> kezdet sor tartalmtl (a 'az utolsval' rsztl).
+
+ 3. Nyomjon R karaktert s rja t a szveg maradkt az els sorban
+ gy, hogy a kt sor egyez legyen.
+
+---> Az els sort tegye azonoss az utolsval: hasznlja a gombokat.
+---> Az els sort tegye azonoss a msodikkal: rjon R-t s az j szveget.
+
+ 4. Jegyezzk meg, ha <ESC>-et nyomok, akkor a vltozatlanul hagyott
+ szvegek vltozatlanok maradnak.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.4. lecke: BELLTSOK
+
+** lltsuk be, hogy a keress s a helyettests ne fggjn kis/NAGYbetktl **
+
+ 1. Keressk meg az 'ignore'-t az berva:
+ /ignore
+ Ezt ismteljk tbbszr az n billentyvel
+
+ 2. lltsuk be az 'ic' (Ignore case) lehetsget gy:
+ :set ic
+
+ 3. Most keressnk ismt az 'ignore'-ra n-nel
+ Ismteljk meg tbbszr a keresst: n
+
+ 4. lltsuk be a 'hlsearch' s 'incsearch' lehetsgeket:
+ :set hls is
+
+ 5. Most ismt rjuk be a keresparancsot, s lssuk mi trtnik:
+ /ignore
+
+ 6. A kiemelst szntessk meg albbi utastsok egyikvel:
+ :set nohls vagy :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6. LECKE SSZEFOGLALJA
+
+
+ 1. o bersval j sort nyitunk meg a sor ALATT s a kurzor az j
+ sorban lesz beszrs-mdban.
+ Nagy O a sor FELETT nyit j sort, s oda kerl a kurzor.
+
+ 2. a bersval az aktulis karaktertl UTN (jobbra) szrhatunk be szveget.
+ Nagy A automatikusan a sor legvghez adja hozz a szveget.
+
+ 3. A nagy R betsvel tr (replace) mdba kerlnk <ESC> lenyomsig.
+
+ 4. ":set xxx" bersval az "xxx" opci llthat be.
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7. lecke: AZ ON-LINE SG PARANCSAI
+
+
+ ** Az online sgrendszer hasznlata **
+
+ A Vim rszletes sgval rendelkezik. Indulshoz a kvetkezk egyikt
+ tegye:
+ - nyomja meg a <HELP> gombot (ha van ilyen)
+ - nyomja meg az <F1> gombot (ha van ilyen)
+ - rja be: :help <ENTER>
+
+ :q <ENTER> bersval zrhatja be a sgablakot.
+
+ Majdnem minden tmakrrl tallhat sgt, argumentum megadsval
+ ":help" utasts . Prblja az albbiakat ki (<ENTER>-t ne felejtsk):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 8. lecke: INDTSZKRIPT RSA
+
+ ** A Vim lehetsgeinek belltsa **
+
+ A Vim rengeteg lehetsggel rendelkezik a Vi-hoz kpest, de a legtbb
+ alapbl elrhetetlen. Ahhoz, hogy alapbl tbb lehetsgnk legyen ksztennk
+ kell egy "vimrc" fjlt.
+
+ 1. Kezdjk el szerkeszteni a "vimrc" fjlt, ennek mdja:
+ :edit ~/.vimrc Unixon, Linuxon
+ :edit ~/_vimrc MS-Windowson
+
+ 2. Most szrjuk be a plda "vimrc" fjl szvegt:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. rjuk ki a fjlt:
+
+ :write
+
+ Legkzelebb a Vim szintaxiskiemelssel indul.
+ Hozzadhatja kedvenc belltsait ehhez a "vimrc" fjlhoz.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Itt vgzdik a Vim oktat, melynek a szndka egy rvid ttekints a
+ Vimrl, amely elg ahhoz, hogy elg knnyedn kezeljk a szerkesztt.
+ Tvol van a teljessgtl, mivel a Vimnek szmtalan tovbbi utastsa
+ van. Ezutn a felhasznli kziknyvet rdemes elolvasni az angolul
+ tudknak: ":help user-manual". (egyelre nem tud magyarul)
+
+ Tovbbi magyar olvasnivalk rhetek el az albbi oldalrl.
+ http://wiki.hup.hu/index.php/Vim
+
+ Angol olvasmnyok:
+ For further reading and studying, this book is recommended:
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+ The first book completely dedicated to Vim. Especially useful for beginners.
+ There are many examples and pictures.
+ See https://iccf-holland.org/click5.html
+
+ This book is older and more about Vi than Vim, but also recommended:
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+ It is a good book to get to know almost anything you want to do with Vi.
+ The sixth edition also includes information on Vim.
+
+ Ezt az oktatt Michael C. Pierce s Robert K. Ware rta, a Colorado
+ School of Mines dolgozi Charles Smith (Colorado State University)
+ tmogatsval.
+
+ E-mail: bware@mines.colorado.edu.
+
+ A Vimhez idomtotta Bram Moolenaar.
+
+ Magyartotta: Horvth rpd <horvath.arpad@arek.uni-opbuda.hu>, 2006-2012
+
diff --git a/runtime/tutor/tutor.hu.cp1250 b/runtime/tutor/tutor.hu.cp1250
new file mode 100644
index 0000000..d895e19
--- /dev/null
+++ b/runtime/tutor/tutor.hu.cp1250
@@ -0,0 +1,830 @@
+===============================================================================
+== d v z l j k a V I M - o k t a t b a n - 1.5-s verzi ==
+===============================================================================
+
+ A Vim egy nagyon hatkony szerkeszt, amelynek rengeteg utastsa
+ van, tl sok, hogy egy ilyen oktatban (tutorban), mint az itteni
+ mindet elmagyarzzuk. Ez az oktat arra trekszik, hogy annyit
+ elmagyarzzon, amennyi elg, hogy knnyedn hasznljuk a Vim-et, az
+ ltalnos cl szvegszerkesztt.
+
+ A feladatok megoldshoz 25-30 perc szksges attl fggen,
+ mennyit tltnk a ksrletezssel.
+
+ A leckben szerepl utastsok mdostani fogjk a szveget.
+ Ksztsen msolatot errl a fjlrl, ha gyakorolni akar.
+ (Ha "vimtutor"-ral indtotta, akkor ez mr egy msolat.)
+
+ Fontos megrteni, hogy ez az oktat cselekedve tanttat.
+ Ez azt jelenti, hogy nnek ajnlott vgrehajtania az utastsokat,
+ hogy megfelelen megtanulja azokat. Ha csak olvassa, elfelejti!
+
+ Most bizonyosodjon, meg, hogy a Caps-Lock gombja NINCS lenyomva, s
+ Nyomja meg megfelel szmszor a j gombot, hogy az 1.1-es
+ lecke teljesen a kpernyn legyen!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.1. lecke: A KURZOR MOZGATSA
+
+
+ ** A kurzor mozgatshoz nyomja meg a h,j,k,l gombokat az albbi szerint. **
+ ^
+ k Tipp: A h billenty van balra, s balra mozgat
+ < h l > A l billenty van jobbra, s jobbra mozgat
+ j A j billenty olyan, mint egy lefele nyl
+ v
+ 1. Mozgassa a kurzort krbe az ablakban, amg hozz nem szokik!
+
+ 2. Tartsa lenyomva a lefelt (j), akkor ismtldik!
+---> Most tudja, hogyan mehet a kvetkez leckre.
+
+ 3. A lefel gomb hasznlatval menjen a 1.2. leckre!
+
+Megj: Ha nem biztos benne, mit nyomott meg, nyomja meg az <ESC>-et, hogy
+ norml mdba kerljn, s ismtelje meg a parancsot!
+
+Megj: A kurzor gomboknak is mkdnik kell, de a hjkl hasznlatval
+ sokkal gyorsabban tud, mozogni, ha hozzszokik.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.2. lecke: BE S KILPS A VIMBL
+
+
+ !! MEGJ: Mieltt vgrehajtja az albbi lpseket, olvassa vgig a leckt !!
+
+ 1. Nyomja meg az <ESC> gombot (hogy biztosan norml mdban legyen).
+
+ 2. rja: :q! <ENTER>.
+
+---> Ezzel kilp a szerkesztbl a vltozsok MENTSE NLKL.
+ Ha menteni szeretn a vltozsokat s kilpni, rja:
+ :wq <ENTER>
+
+ 3. Amikor a shell promptot ltja, rja be a parancsot, amely ebbe az
+ oktatba hozza:
+ Ez valsznleg: vimtutor <ENTER>
+ Normlis esetben ezt rn: vim tutor.hu <ENTER>
+
+---> 'vim' jelenti a vimbe belpst, 'tutor.hu' a fjl, amit szerkeszteni kvn.
+
+ 4. Ha megjegyezte a lpseket s biztos magban, hajtsa vgre a lpseket
+ 1-tl 3-ig, hogy kilpjen s visszatrjen a szerkesztbe. Azutn
+ menjen az 1.3. leckre.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.3. lecke: SZVEG SZERKESZTSE - TRLS
+
+
+** Norml mdban nyomjon x-et, hogy a kurzor alatti karaktert trlje. **
+
+ 1. Mozgassa a kurzort a ---> kezdet sorra!
+
+ 2. A hibk kijavtshoz mozgassa a kurzort amg a trlend karakter
+ fl nem r.
+
+ 3. Nyomja meg az x gombot, hogy trlje a nem kvnt karaktert.
+
+ 4. Ismtelje a 2, 3, 4-es lpseket, hogy kijavtsa a mondatot.
+
+---> szi jjjell izziik aa galaggonya rruuhja.
+
+ 5. Ha a sor helyes, ugorjon a 1.4. leckre.
+
+MEGJ: A tanuls sorn ne memorizlni prbljon, hanem hasznlat sorn tanuljon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.4. lecke: SZVEG SZERKESZTSE - BESZRS
+
+
+ ** Norml mdban i megnyomsval lehet beilleszteni. **
+
+ 1. Az albbi els ---> kezdet sorra menjen.
+
+ 2. Ahhoz, hogy az elst azonoss tegye a msodikkal, mozgassa a kurzort
+ az els karakterre, amely UTN szveget kell beszrni.
+
+ 3. Nyomjon i-t s rja be a megfelel szveget.
+
+ 4. Amikor mindent bert, nyomjon <ESC>-et, hogy Norml mdba visszatrjen.
+ Ismtelje a 2 s 4 kztti lpseket, hogy kijavtsa a mondatot.
+
+---> Az that sol hizik pr sz.
+---> Az itt lthat sorbl hinyzik pr rsz.
+
+ 5. Ha mr begyakorolta a beszrst, menjen az albbi sszefoglalra.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1. LECKE SSZEFOGLALJA
+
+
+ 1. A kurzort vagy a nyilakkal vagy a hjkl gombokkal mozgathatja.
+ h (balra) j (le) k (fel) l (jobbra)
+
+ 2. A Vimbe (a $ prompttl) gy lphet be: vim FILENAME <ENTER>
+
+ 3. A Vimbl gy lphet ki: <ESC> :q! <ENTER> a vltoztatsok eldobsval.
+ vagy gy: <ESC> :wq <ENTER> a vltozsok mentsvel.
+
+ 4. A kurzor alatti karakter trlse norml mdban: x
+
+ 5. Szveg beszrsa a kurzor utn norml mdban:
+ i gpelje be a szveget <ESC>
+
+MEGJ: Az <ESC> megnyomsa norml mdba viszi, vagy megszakt egy nem befejezett
+ rszben befejezett parancsot.
+
+Most folytassuk a 2. leckvel!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.1. lecke: TRL UTASTSOK
+
+
+ ** dw trl a sz vgig. **
+
+ 1. Nyomjon <ESC>-et, hogy megbizonyosodjon, hogy norml mdban van!
+
+ 2. Mozgassa a kurzort a ---> kezdet sorra!
+
+ 3. Mozgassa a kurzort arra annak a sznak az elejre, amit trlni szeretne.
+ Trlje az llatokat a mondatbl.
+
+ 4. A sz trlshez rja: dw
+
+ MEGJ: Ha rosszul kezdte az utastst csak nyomjon <ESC> gombot
+ a megszaktshoz.
+
+---> Pr sz kutya nem uhu illik pingvin a mondatba tehn.
+
+ 5. Ismtelje a 3 s 4 kztti utastsokat amg kell s ugorjon a 2.2 leckre!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.2. lecke: MG TBB TRL UTASTS
+
+
+ ** d$ bersval a sor vgig trlhet. **
+
+ 1. Nyomjon <ESC>-et, hogy megbizonyosodjon, hogy norml mdban van!
+
+ 2. Mozgassa a kurzort a ---> kezdet sorra!
+
+ 3. Mozgassa a kurzort a helyes sor vgre (az els . UTN)!
+
+ 4. d$ begpelsvel trlje a sor vgt!
+
+---> Valaki a sor vgt ktszer gpelte be. ktszer gpelte be.
+
+
+ 5. Menjen a 2.3. leckre, hogy megrtse mi trtnt!
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.3. lecke: UTASTSOKRL S MOZGSOKRL
+
+
+ A d (delete=trls) utasts formja a kvetkez:
+
+ [szm] d mozgs VAGY d [szm] mozgs
+ Ahol:
+ szm - hnyszor hajtdjon vgre a parancs (elhagyhat, alaprtk=1).
+ d - a trls (delete) utasts.
+ mozgs - amin a parancsnak teljeslnie kell (albb listzva).
+
+ Mozgsok rvid listja:
+ w - a kurzortl a sz vgig, belertve a szkzt.
+ e - a kurzortl a sz vgig, NEM belertve a szkzt.
+ $ - a kurzortl a sor vgig.
+
+MEGJ: Csupn a mozgs begpelsvel (parancs nlkl)
+ a kurzor mozgs ltal megadott helyre kerl.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.4. lecke: EGSZ SOROK FELDOLGOZSA
+
+
+ ** dd bersval trlheti az egsz sort. **
+
+ A teljes sor trlsnek gyakorisga miatt a Vi tervezi elhatroztk,
+ hogy knnyebb lenne csupn a d-t ktszer megnyomni, hogy egy sort trljnk.
+
+ 1. Mozgassa a kurzort az albbi kifejezsek msodik sorra!
+ 2. dd begpelsvel trlje a sort!
+ 3. Menjen a 3. (eredetileg 4.) sorra!
+ 4. 2dd (ugyebr szm-utasts-mozgs) begpelsvel trljn kt sort!
+
+ 1) Alv szegek a jghideg homokban,
+ 2) - kezdi a klt -
+ 3) Plaktmagnyban z jjelek.
+ 4) Pingvinek ne fljetek,
+ 5) Tvolrl egy vaku villant,
+ 6) gve hagytad a folyosn a villanyt.
+ 7) Ma ontjk vremet.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.5. lecke: A VISSZAVONS (UNDO) PARANCS
+
+
+** u gpelsvel visszavonhat az utols parancs, U az egsz sort helyrelltja. **
+
+ 1. Menjnk az albbi ---> kezdet sor els hibjra!
+ 2. x lenyomsval trlje az els felesleges karaktert!
+ 3. u megnyomsval vonja vissza az utolsnak vgrehajtott utastst!
+ 4. Msodjra javtson ki minden hibt a sorban az x utastssal!
+ 5. Most nagy U -val lltsa vissza a sor eredeti llapott!
+ 6. Nyomja meg az u gombot prszor, hogy az U s az azt megelz utastsokat
+ visszalltsa!
+ 7. CTRL-R (CTRL gomb lenyomsa mellett ssn R-t) prszor csinlja jra a
+ visszavont parancsokat (redo)!
+
+---> Javtsa a hhibkaat ebbben a sooorban majd lltsa visszaaa az eredetit.
+
+ 8. Ezek nagyon hasznos parancsok. Most ugorjon a 2. lecke sszefoglaljra.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2. LECKE SSZEFOGLALJA
+
+
+ 1. Trls a kurzortl a sz vgig: dw
+
+ 2. Trls a kurzortl a sor vgig: d$
+
+ 3. Egsz sor trlse: dd
+
+ 4. Egy utasts alakja norml mdban:
+
+ [szm] utasts mozgs VAGY utasts [szm] mozgs
+ ahol:
+ szm - hnyszor ismteljk a parancsot
+ utasts - mit tegynk, pl. d a trlskor
+ mozgs - mire hasson az utasts, pldul w (sz=word),
+ $ (a sor vgig), stb.
+
+ 5. Az elz tett visszavonsa (undo): u (kis u)
+ A sor sszes vltozsnak visszavonsa: U (nagy U)
+ Visszavonsok visszavonsa: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.1. lecke: A BEILLESZTS (PUT) PARANCS
+
+
+ ** p letsvel az utolsnak trltet a kurzor utn illeszthetjk. **
+
+ 1. Mozgassuk a kurzort az albbi sorok els sorra.
+
+ 2. dd letsvel trljk a sort s eltroldik a Vim pufferben.
+
+ 3. Mozgassuk a kurzort azeltt a sor ELTTI sorba, ahov mozgatni
+ szeretnnk a trlt sort.
+
+ 4. Norml mdban rjunk p bett a trlt sor beillesztshez.
+
+ 5. Folytassuk a 2-4. utastsokkal hogy a helyes sorrendet kapjuk.
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.2. lecke: AZ TRS (REPLACE) PARANCS
+
+
+** r s a karakterek letsvel a kurzor alatti karaktert megvltoztatjuk. **
+
+ 1. Mozgassuk a kurzort az els ---> kezdet sorra!
+
+ 2. Mozgassuk a kurzort az els hiba fl!
+
+ 3. r majd a kvnt karakter letsvel vltoztassuk meg a hibsat!
+
+ 4. A 2. s 3. lpsekkel javtsuk az sszes hibt!
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. Menjnk a 3.2. leckre!
+
+MEGJ: Emlkezzen, hogy nem memorizlssal, hanem gyakorlssal tanuljon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.3. lecke: A CSERE (CHANGE) PARANCS
+
+
+ ** A sz egy rsznek megvltoztatshoz rjuk: cw . **
+
+ 1. Mozgassuk a kurzort az els ---> kezdet sorra!
+
+ 2. Vigye a kurzort a Ezen sz z betje fl!
+
+ 3. cw s a helyes szrsz (itt 'bben') bersval javtsa a szt!
+
+ 4. <ESC> lenyomsa utn a kvetkez hibra ugorjon (az els cserlend
+ karakterre)!
+
+ 5. A 3. s 4. lpsek ismtlsvel az els mondatot tegye a msodikkal
+ azonoss!
+
+---> Ezen a sorrrrr pr szra meg kell vltozzanak a change utaskrs.
+---> Ebben a sorban pr szt meg kell vltoztatni a change utastssal.
+
+Vegyk szre, hogy a cw nem csak a szt rja t, hanem beszr
+(insert) mdba vlt.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.4. lecke: TBBFLE VLTOZTATS c-VEL
+
+
+ ** A c utasts hasznlhat ugyanazokkal az mozgsokkal mint a trls **
+
+ 1. A change utasts a trlssel azonosan viselkedik. A forma:
+
+ [szm] c mozgs OR c [szm] mozgs
+
+ 2. A mozgsok is azonosak, pl. w (sz), $ (sorvg), stb.
+
+ 3. Mozgassuk a kurzort az els ---> kezdet sorra!
+
+ 4. Menjnk az els hibra!
+
+ 5. c$ begpelsvel a sorvgeket tegyk azonoss s nyomjunk <ESC>-et!
+
+---> Ennek a sornak a vge kiigaztsra szorul, hogy megegyezzen a msodikkal.
+---> Ennek a sornak a vge a c$ paranccsal vltoztathat meg.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3. LECKE SSZEFOGLALJA
+
+
+ 1. A mr trlt sort beillesztshez nyomjunk p-t. Ez a trlt szveget
+ a kurzor UTN helyezi (ha sor kerlt trlsre, a kurzor alatti sorba).
+
+ 2. A kurzor alatti karakter trshoz az r-et s azt a karaktert
+ nyomjuk, amellyel az eredetit fell szeretnnk rni.
+
+ 3. A vltoztats (c) utasts a karaktertl az mozgs vgig
+ vltoztatja meg az mozgst. Pldul a cw a kurzortl a sz vgig,
+ a c$ a sor vgig.
+
+ 4. A vltoztats formtuma:
+
+ [szm] c mozgs VAGY c [szm] mozgs
+
+Ugorjunk a kvetkez leckre!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.1. lecke: HELY S FJLLLAPOT
+
+
+ ** CTRL-g megnyomsval megnzhetjk a helynket a fjlban s a fjl llapott.
+ SHIFT-G letsvel a fjl adott sorra ugorhatunk. **
+
+ Megj: Olvassuk el az egsz leckt a lpsek vgrehajtsa eltt!!
+
+ 1. Tartsuk nyomva a Ctrl gombot s nyomjunk g-t. Az llapotsor
+ megjelenik a lap aljn a fjlnvvel s az aktulis sor sorszmval.
+ Jegyezzk meg a sorszmot a 3. lpshez!
+
+ 2. Nyomjunk Shift-G-t a lap aljra ugrshoz!
+
+ 3. ssk be az eredeti sor szmt, majd ssnk shift-G-t! Ezzel
+ visszajutunk az eredeti sorra ahol Ctrl-g-t nyomtunk.
+ (A bert szm NEM fog megjelenni a kpernyn.)
+
+ 4. Ha megjegyezte a feladatot, hajtsa vgre az 1-3. lpseket!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.2. lecke: A KERESS (SEARCH) PARANCS
+
+
+ ** / majd a kvnt kifejezs bersval kereshetjk meg a kifejezst. **
+
+ 1. Norml mdban ssnk / karaktert! Ez s a kurzor megjelenik
+ a kperny aljn, ahogy a : utasts is.
+
+ 2. rjuk be: 'hiibaa' <ENTER>! Ez az a sz amit keresnk.
+
+ 3. A kifejezs jabb keresshez ssk le egyszeren: n .
+ A kifejezs ellenkez irnyban trtn keresshez ezt ssk be: Shift-N .
+
+ 4. Ha visszafel szeretne keresni, akkor ? kell a / helyett.
+
+---> "hiibaa" nem a helyes mdja a hiba lersnak; a hiibaa egy hiba.
+
+Megj: Ha a keress elri a fjl vgt, akkor az elejn kezdi.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.3. lecke: ZRJELEK PRJNAK KERESSE
+
+
+ ** % letsvel megtalljuk a ),], vagy } prjt. **
+
+ 1. Helyezze a kurzort valamelyik (, [, vagy { zrjelre a ---> kezdet
+ sorban!
+
+ 2. ssn % karaktert!
+
+ 3. A kurzor a zrjel prjra fog ugrani.
+
+ 4. % letsvel visszaugrik az eredeti zrjelre.
+
+---> Ez ( egy tesztsor (-ekkel, [-ekkel ] s {-ekkel } a sorban. ))
+
+Megj: Ez nagyon hasznos, ha olyan programot debugolunk, amelyben a
+ zrjelek nem prosak!
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.4. lecke: A HIBK KIJAVTSNAK EGY MDJA
+
+
+ ** :s/rgi/j/g begpelsvel az 'j'-ra cserljk a 'rgi'-t. **
+
+ 1. Menjnk a ---> kezdet sorra!
+
+ 2. rjuk be: :s/eggy/egy <ENTER> . Ekkor csak az els vltozik meg a
+ sorban.
+
+ 3. Most ezt rjuk: :s/eggy/egg/g amely globlisan helyettest
+ a sorban, azaz minden elfordulst.
+ Ez a sorban minden elfordulst helyettest.
+
+---> eggy heggy meggy, szembe jn eggy msik heggy.
+
+ 4. Kt sor kztt a karaktersor minden elfordulsnak helyettestse:
+ :#,#s/rgi/j/g ahol #,# a kt sor sorszma.
+ :%s/rgi/j/g a fjlbeli sszes elforduls helyettestse.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4. LECKE SSZEFOGLALJA
+
+
+ 1. Ctrl-g kirja az kurzor helyt a fjlban s a fjl llapott.
+ Shift-G a fjl vgre megy, gg az elejre. Egy szm utn
+ Shift-G az adott szm sorra ugrik.
+
+ 2. / utn egy kifejezs ELREFELE keresi a kifejezst.
+ 2. ? utn egy kifejezs VISSZAFELE keresi a kifejezst.
+ Egy keress utn az n a kvetkez elfordulst keresi azonos irnyban
+ Shift-N az ellenkez irnyban keres.
+
+ 3. % begpelsvel, ha (,),[,],{, vagy } karakteren vagyunk a zrjel
+ prjra ugrik.
+
+ 4. az els rgi helyettestse jjal a sorban :s/rgi/j
+ az sszes rgi helyettestse jjal a sorban :s/rgi/j/g
+ kt sor kztti kifejezsekre :#,#s/rgi/j/g
+ # helyn az aktulis sor (.) s az utols ($) is llhat :.,$/rgi/j/g
+ A fjlbeli sszes elforduls helyettestse :%s/rgi/j/g
+ Mindenkori megerstsre vr 'c' hatsra :%s/rgi/j/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.1. lecke: KLS PARANCS VGREHAJTSA
+
+
+ ** :! utn kls parancsot rva vgrehajtdik a parancs. **
+
+ 1. rjuk be az ismers : parancsot, hogy a kurzort a kperny aljra
+ helyezzk. Ez lehetv teszi egy parancs berst.
+
+ 2. ! (felkiltjel) bersval tegyk lehetv kls hj (shell)-parancs
+ vgrehajtst.
+
+ 3. rjunk pldul ls parancsot a ! utn majd ssnk <ENTER>-t. Ez ki
+ fogja listzni a knyvtrunkat ugyangy, mintha a shell promptnl
+ lennnk. Vagy rja ezt :!dir ha az ls nem mkdik.
+
+Megj: Ilymdon brmely kls utasts vgrehajthat.
+
+Megj: Minden : parancs utn <ENTER>-t kell tni.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.2. lecke: BVEBBEN A FJLOK RSRL
+
+
+ ** A fjlok vltozsait gy rhatjuk ki :w FJLNV. **
+
+ 1. :!dir vagy :!ls bersval listzzuk a knyvtrunkat!
+ n mr tudja, hogy <ENTER>-t kell tnie utna.
+
+ 2. Vlasszon egy fjlnevet, amely mg nem ltezik pl. TESZT!
+
+ 3. rja: :w TESZT (ahol TESZT a vlasztott fjlnv)!
+
+ 4. Ez elmenti a teljes fjlt (a Vim oktatjt) TESZT nven.
+ Ellenrzskpp rjuk ismt :!dir hogy lssuk a knyvtrat!
+ (Felfel gombbal : utn az elz utastsok visszahozhatak.)
+
+Megj: Ha n kilpne a Vimbl s s visszatrne a TESZT fjlnvvel, akkor a
+ fjl az oktat mentskori pontos msolata lenne.
+
+ 5. Tvoltsa el a fjlt (MS-DOS): :!del TESZT
+ vagy (Unix): :!rm TESZT
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.3. lecke: EGY KIVLASZTOTT RSZ KIRSA
+
+
+ ** A fjl egy rsznek kirshoz rja :#,# w FJLNV **
+
+ 1. :!dir vagy :!ls bersval listzza a knyvtrat, s vlasszon egy
+ megfelel fjlnevet, pl. TESZT.
+
+ 2. Mozgassa a kurzort ennek az oldalnak a tetejre, s nyomjon
+ Ctrl-g-t, hogy megtudja a sorszmot. JEGYEZZE MEG A SZMOT!
+
+ 3. Most menjen a lap aljra, s sse be ismt: Ctrl-g. EZT A SZMOT
+ IS JEGYEZZE MEG!
+
+ 4. Ha csak ezt a rszt szeretn menteni a fjlnak, rja :#,# w TESZT
+ ahol #,# a kt sorszm, amit megjegyzett, TESZT az n fjlneve.
+
+ 5. Ismt nzze meg, hogy a fjl ott van (:!dir) de NE trlje.
+
+ 6. Vimben ltezik egy msik lehetsg: nyomja meg a Shift-V gombprt
+ az els menteni kvnt soron, majd menjen le az utolsra, ezutn
+ rja :w TESZT2 Ekkor a TESZT2 fjlba kerl a kijellt rsz.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.4. lecke: FJLOK VISSZALLTSA S SSZEFZSE
+
+
+ ** Egy fjl tartalmnak beillesztshez rja :r FJLNV **
+
+ 1. :!dir bersval nzze meg, hogy az n TESZT fjlja ltezik mg.
+
+ 2. Helyezze a kurzort ennek az oldalnak a tetejre.
+
+MEGJ: A 3. lps utn az 5.3. leckt fogja ltni. Azutn LEFEL indulva
+ keresse meg ismt ezt a leckt.
+
+ 3. Most szrja be a TESZT nev fjlt a :r TESZT paranccsal, ahol
+ TESZT az n fjljnak a neve.
+
+MEGJ: A fjl, amit beillesztett a kurzora alatt helyezkedik el.
+
+ 4. Hogy ellenrizzk, hogy a fjlt tnyleg beillesztettk, menjen
+ vissza, s nzze meg, hogy ktszer szerepel az 5.3. lecke! Az eredeti
+ mellett a fjlbl bemsolt is ott van.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5. LECKE SSZEFOGLALJA
+
+
+ 1. :!parancs vgrehajt egy kls utastst.
+
+ Pr hasznos plda:
+ (MS-DOS) (Unix)
+ :!dir :!ls - knyvtrlista kirsa.
+ :!del FJLNV :!rm FJLNV - FJLNV nev fjl trlse.
+
+ 2. :w FJLNV kirja a jelenlegi Vim-fjlt a lemezre FJNV nven.
+
+ 3. :#,#w FJLNV kirja a kt sorszm (#) kztti sorokat FJLNV-be
+ Msik lehetsg, hogy a kezdsornl Shift-v-t nyom lemegy az utols
+ sorra, majd ezt ti be :w FJLNV
+
+ 4. :r FJLNV beolvassa a FJLNV fjlt s behelyezi a jelenlegi fjlba
+ a kurzorpozci utni sorba.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.1. lecke: A MEGNYITS (OPEN) PARANCS
+
+
+** o bersval nyit egy j sort a kurzor alatt s beszr mdba vlt **
+
+ 1. Mozgassuk a kurzort a ---> kezdet sorra.
+
+ 2. o (kicsi) bersval nyisson egy sort a kurzor ALATT! Ekkor
+ automatikusan beszr (insert) mdba kerl.
+
+ 3. Msolja le a ---> jel sort s <ESC> megnyomsval lpjen ki
+ a beszr mdbl.
+
+---> Az o lenyomsa utn a kurzor a kvetkez sor elejn ll beszr mdban.
+
+ 4. A kurzor FELETTI sor megnyitshoz egyszeren nagy O bett rjon
+kicsi helyett. Prblja ki a kvetkez soron!
+Nyisson egy j sort efelett Shift-O megnyomsval, mialatt a kurzor
+ezen a soron ll.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.2. lecke: AZ APPEND PARANCS
+
+
+ ** a lenyomsval a kurzor UTN szrhatunk szveget. **
+
+ 1. Mozgassuk a kurzort a kvetkez ---> kezdet sor vgre gy,
+ hogy norml mdban $-t r be.
+
+ 2. Kis "a" letsvel szveget szrhat be AMG a karakter mg,
+ amelyen a kurzor ll.
+ (A nagy "A" az egsz sor vgre rja a szveget.)
+
+Megj: A Vimben a sor legvgre is lehet llni, azonban ez eldjben
+ a Vi-ban nem lehetsges, ezrt abban az a nlkl elg krlmnyes
+ a sor vghez szveget rni.
+
+ 3. Egsztse ki az els sort. Vegye szre, hogy az a utasts (append)
+ teljesen egyezik az i-vel (insert) csupn a beszrt szveg helye
+ klnbzik.
+
+---> Ez a sor lehetv teszi nnek, hogy gyakorolja
+---> Ez a sor lehetv teszi nnek, hogy gyakorolja a sor vgre beillesztst.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.3. lecke: AZ TRS MSIK VLTOZATA
+
+
+ ** Nagy R bersval rhat fell tbb mint egy karaktert. **
+
+ 1. Mozgassuk a kurzort az els ---> kezdet sorra!
+
+ 2. Helyezze a kurzort az els sz elejre amely eltr a msodik
+ ---> kezdet sor tartalmtl (a 'az utolsval' rsztl).
+
+ 3. Nyomjon R karaktert s rja t a szveg maradkt az els sorban
+ gy, hogy a kt sor egyez legyen.
+
+---> Az els sort tegye azonoss az utolsval: hasznlja a gombokat.
+---> Az els sort tegye azonoss a msodikkal: rjon R-t s az j szveget.
+
+ 4. Jegyezzk meg, ha <ESC>-et nyomok, akkor a vltozatlanul hagyott
+ szvegek vltozatlanok maradnak.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.4. lecke: BELLTSOK
+
+** lltsuk be, hogy a keress s a helyettests ne fggjn kis/NAGYbetktl **
+
+ 1. Keressk meg az 'ignore'-t az berva:
+ /ignore
+ Ezt ismteljk tbbszr az n billentyvel
+
+ 2. lltsuk be az 'ic' (Ignore case) lehetsget gy:
+ :set ic
+
+ 3. Most keressnk ismt az 'ignore'-ra n-nel
+ Ismteljk meg tbbszr a keresst: n
+
+ 4. lltsuk be a 'hlsearch' s 'incsearch' lehetsgeket:
+ :set hls is
+
+ 5. Most ismt rjuk be a keresparancsot, s lssuk mi trtnik:
+ /ignore
+
+ 6. A kiemelst szntessk meg albbi utastsok egyikvel:
+ :set nohls vagy :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6. LECKE SSZEFOGLALJA
+
+
+ 1. o bersval j sort nyitunk meg a sor ALATT s a kurzor az j
+ sorban lesz beszrs-mdban.
+ Nagy O a sor FELETT nyit j sort, s oda kerl a kurzor.
+
+ 2. a bersval az aktulis karaktertl UTN (jobbra) szrhatunk be szveget.
+ Nagy A automatikusan a sor legvghez adja hozz a szveget.
+
+ 3. A nagy R betsvel tr (replace) mdba kerlnk <ESC> lenyomsig.
+
+ 4. ":set xxx" bersval az "xxx" opci llthat be.
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7. lecke: AZ ON-LINE SG PARANCSAI
+
+
+ ** Az online sgrendszer hasznlata **
+
+ A Vim rszletes sgval rendelkezik. Indulshoz a kvetkezk egyikt
+ tegye:
+ - nyomja meg a <HELP> gombot (ha van ilyen)
+ - nyomja meg az <F1> gombot (ha van ilyen)
+ - rja be: :help <ENTER>
+
+ :q <ENTER> bersval zrhatja be a sgablakot.
+
+ Majdnem minden tmakrrl tallhat sgt, argumentum megadsval
+ ":help" utasts . Prblja az albbiakat ki (<ENTER>-t ne felejtsk):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 8. lecke: INDTSZKRIPT RSA
+
+ ** A Vim lehetsgeinek belltsa **
+
+ A Vim rengeteg lehetsggel rendelkezik a Vi-hoz kpest, de a legtbb
+ alapbl elrhetetlen. Ahhoz, hogy alapbl tbb lehetsgnk legyen ksztennk
+ kell egy "vimrc" fjlt.
+
+ 1. Kezdjk el szerkeszteni a "vimrc" fjlt, ennek mdja:
+ :edit ~/.vimrc Unixon, Linuxon
+ :edit ~/_vimrc MS-Windowson
+
+ 2. Most szrjuk be a plda "vimrc" fjl szvegt:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. rjuk ki a fjlt:
+
+ :write
+
+ Legkzelebb a Vim szintaxiskiemelssel indul.
+ Hozzadhatja kedvenc belltsait ehhez a "vimrc" fjlhoz.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Itt vgzdik a Vim oktat, melynek a szndka egy rvid ttekints a
+ Vimrl, amely elg ahhoz, hogy elg knnyedn kezeljk a szerkesztt.
+ Tvol van a teljessgtl, mivel a Vimnek szmtalan tovbbi utastsa
+ van. Ezutn a felhasznli kziknyvet rdemes elolvasni az angolul
+ tudknak: ":help user-manual". (egyelre nem tud magyarul)
+
+ Tovbbi magyar olvasnivalk rhetek el az albbi oldalrl.
+ http://wiki.hup.hu/index.php/Vim
+
+ Angol olvasmnyok:
+ For further reading and studying, this book is recommended:
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+ The first book completely dedicated to Vim. Especially useful for beginners.
+ There are many examples and pictures.
+ See https://iccf-holland.org/click5.html
+
+ This book is older and more about Vi than Vim, but also recommended:
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+ It is a good book to get to know almost anything you want to do with Vi.
+ The sixth edition also includes information on Vim.
+
+ Ezt az oktatt Michael C. Pierce s Robert K. Ware rta, a Colorado
+ School of Mines dolgozi Charles Smith (Colorado State University)
+ tmogatsval.
+
+ E-mail: bware@mines.colorado.edu.
+
+ A Vimhez idomtotta Bram Moolenaar.
+
+ Magyartotta: Horvth rpd <horvath.arpad@arek.uni-opbuda.hu>, 2006-2012
+
diff --git a/runtime/tutor/tutor.hu.utf-8 b/runtime/tutor/tutor.hu.utf-8
new file mode 100644
index 0000000..f2e0d40
--- /dev/null
+++ b/runtime/tutor/tutor.hu.utf-8
@@ -0,0 +1,830 @@
+===============================================================================
+== Ü d v ö z ö l j ü k a V I M - o k t a t ó b a n - 1.5-ös verzió ==
+===============================================================================
+
+ A Vim egy nagyon hatékony szerkesztő, amelynek rengeteg utasítása
+ van, túl sok, hogy egy ilyen oktatóban (tutorban), mint az itteni
+ mindet elmagyarázzuk. Ez az oktató arra törekszik, hogy annyit
+ elmagyarázzon, amennyi elég, hogy könnyedén használjuk a Vim-et, az
+ általános célú szövegszerkesztőt.
+
+ A feladatok megoldásához 25-30 perc szükséges attól függően,
+ mennyit töltünk a kísérletezéssel.
+
+ A leckében szereplő utasítások módosítani fogják a szöveget.
+ Készítsen másolatot erről a fájlról, ha gyakorolni akar.
+ (Ha "vimtutor"-ral indította, akkor ez már egy másolat.)
+
+ Fontos megérteni, hogy ez az oktató cselekedve taníttat.
+ Ez azt jelenti, hogy Önnek ajánlott végrehajtania az utasításokat,
+ hogy megfelelően megtanulja azokat. Ha csak olvassa, elfelejti!
+
+ Most bizonyosodjon, meg, hogy a Caps-Lock gombja NINCS lenyomva, és
+ Nyomja meg megfelelő számúszor a j gombot, hogy az 1.1-es
+ lecke teljesen a képernyőn legyen!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.1. lecke: A KURZOR MOZGATÁSA
+
+
+ ** A kurzor mozgatásához nyomja meg a h,j,k,l gombokat az alábbi szerint. **
+ ^
+ k Tipp: A h billentyű van balra, és balra mozgat
+ < h l > A l billentyű van jobbra, és jobbra mozgat
+ j A j billentyű olyan, mint egy lefele nyíl
+ v
+ 1. Mozgassa a kurzort körbe az ablakban, amíg hozzá nem szokik!
+
+ 2. Tartsa lenyomva a lefelét (j), akkor ismétlődik!
+---> Most tudja, hogyan mehet a következő leckére.
+
+ 3. A lefelé gomb használatával menjen a 1.2. leckére!
+
+Megj: Ha nem biztos benne, mit nyomott meg, nyomja meg az <ESC>-et, hogy
+ normál módba kerüljön, és ismételje meg a parancsot!
+
+Megj: A kurzor gomboknak is működniük kell, de a hjkl használatával
+ sokkal gyorsabban tud, mozogni, ha hozzászokik.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.2. lecke: BE ÉS KILÉPÉS A VIMBŐL
+
+
+ !! MEGJ: Mielőtt végrehajtja az alábbi lépéseket, olvassa végig a leckét !!
+
+ 1. Nyomja meg az <ESC> gombot (hogy biztosan normál módban legyen).
+
+ 2. Írja: :q! <ENTER>.
+
+---> Ezzel kilép a szerkesztőből a változások MENTÉSE NÉLKÜL.
+ Ha menteni szeretné a változásokat és kilépni, írja:
+ :wq <ENTER>
+
+ 3. Amikor a shell promptot látja, írja be a parancsot, amely ebbe az
+ oktatóba hozza:
+ Ez valószínűleg: vimtutor <ENTER>
+ Normális esetben ezt írná: vim tutor.hu <ENTER>
+
+---> 'vim' jelenti a vimbe belépést, 'tutor.hu' a fájl, amit szerkeszteni kíván.
+
+ 4. Ha megjegyezte a lépéseket és biztos magában, hajtsa végre a lépéseket
+ 1-től 3-ig, hogy kilépjen és visszatérjen a szerkesztőbe. Azután
+ menjen az 1.3. leckére.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.3. lecke: SZÖVEG SZERKESZTÉSE - TÖRLÉS
+
+
+** Normál módban nyomjon x-et, hogy a kurzor alatti karaktert törölje. **
+
+ 1. Mozgassa a kurzort a ---> kezdetű sorra!
+
+ 2. A hibák kijavításához mozgassa a kurzort amíg a törlendő karakter
+ fölé nem ér.
+
+ 3. Nyomja meg az x gombot, hogy törölje a nem kívánt karaktert.
+
+ 4. Ismételje a 2, 3, 4-es lépéseket, hogy kijavítsa a mondatot.
+
+---> ŐŐszi éjjjell izziik aa galaggonya rruuhája.
+
+ 5. Ha a sor helyes, ugorjon a 1.4. leckére.
+
+MEGJ: A tanulás során ne memorizálni próbáljon, hanem használat során tanuljon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.4. lecke: SZÖVEG SZERKESZTÉSE - BESZÚRÁS
+
+
+ ** Normál módban i megnyomásával lehet beilleszteni. **
+
+ 1. Az alábbi első ---> kezdetű sorra menjen.
+
+ 2. Ahhoz, hogy az elsőt azonossá tegye a másodikkal, mozgassa a kurzort
+ az első karakterre, amely UTÁN szöveget kell beszúrni.
+
+ 3. Nyomjon i-t és írja be a megfelelő szöveget.
+
+ 4. Amikor mindent beírt, nyomjon <ESC>-et, hogy Normál módba visszatérjen.
+ Ismételje a 2 és 4 közötti lépéseket, hogy kijavítsa a mondatot.
+
+---> Az átható soól hizik pár ész.
+---> Az itt látható sorból hiányzik pár rész.
+
+ 5. Ha már begyakorolta a beszúrást, menjen az alábbi összefoglalóra.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1. LECKE ÖSSZEFOGLALÓJA
+
+
+ 1. A kurzort vagy a nyilakkal vagy a hjkl gombokkal mozgathatja.
+ h (balra) j (le) k (fel) l (jobbra)
+
+ 2. A Vimbe (a $ prompttól) így léphet be: vim FILENAME <ENTER>
+
+ 3. A Vimből így léphet ki: <ESC> :q! <ENTER> a változtatások eldobásával.
+ vagy így: <ESC> :wq <ENTER> a változások mentésével.
+
+ 4. A kurzor alatti karakter törlése normál módban: x
+
+ 5. Szöveg beszúrása a kurzor után normál módban:
+ i gépelje be a szöveget <ESC>
+
+MEGJ: Az <ESC> megnyomása normál módba viszi, vagy megszakít egy nem befejezett
+ részben befejezett parancsot.
+
+Most folytassuk a 2. leckével!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.1. lecke: TÖRLŐ UTASÍTÁSOK
+
+
+ ** dw töröl a szó végéig. **
+
+ 1. Nyomjon <ESC>-et, hogy megbizonyosodjon, hogy normál módban van!
+
+ 2. Mozgassa a kurzort a ---> kezdetű sorra!
+
+ 3. Mozgassa a kurzort arra annak a szónak az elejére, amit törölni szeretne.
+ Törölje az állatokat a mondatból.
+
+ 4. A szó törléséhez írja: dw
+
+ MEGJ: Ha rosszul kezdte az utasítást csak nyomjon <ESC> gombot
+ a megszakításához.
+
+---> Pár szó kutya nem uhu illik pingvin a mondatba tehén.
+
+ 5. Ismételje a 3 és 4 közötti utasításokat amíg kell és ugorjon a 2.2 leckére!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.2. lecke: MÉG TÖBB TÖRLŐ UTASÍTÁS
+
+
+ ** d$ beírásával a sor végéig törölhet. **
+
+ 1. Nyomjon <ESC>-et, hogy megbizonyosodjon, hogy normál módban van!
+
+ 2. Mozgassa a kurzort a ---> kezdetű sorra!
+
+ 3. Mozgassa a kurzort a helyes sor végére (az első . UTÁN)!
+
+ 4. d$ begépelésével törölje a sor végét!
+
+---> Valaki a sor végét kétszer gépelte be. kétszer gépelte be.
+
+
+ 5. Menjen a 2.3. leckére, hogy megértse mi történt!
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.3. lecke: UTASÍTÁSOKRÓL ÉS MOZGÁSOKRÓL
+
+
+ A d (delete=törlés) utasítás formája a következő:
+
+ [szám] d mozgás VAGY d [szám] mozgás
+ Ahol:
+ szám - hányszor hajtódjon végre a parancs (elhagyható, alapérték=1).
+ d - a törlés (delete) utasítás.
+ mozgás - amin a parancsnak teljesülnie kell (alább listázva).
+
+ Mozgások rövid listája:
+ w - a kurzortól a szó végéig, beleértve a szóközt.
+ e - a kurzortól a szó végéig, NEM beleértve a szóközt.
+ $ - a kurzortól a sor végéig.
+
+MEGJ: Csupán a mozgás begépelésével (parancs nélkül)
+ a kurzor mozgás által megadott helyre kerül.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.4. lecke: EGÉSZ SOROK FELDOLGOZÁSA
+
+
+ ** dd beírásával törölheti az egész sort. **
+
+ A teljes sor törlésének gyakorisága miatt a Vi tervezői elhatározták,
+ hogy könnyebb lenne csupán a d-t kétszer megnyomni, hogy egy sort töröljünk.
+
+ 1. Mozgassa a kurzort az alábbi kifejezések második sorára!
+ 2. dd begépelésével törölje a sort!
+ 3. Menjen a 3. (eredetileg 4.) sorra!
+ 4. 2dd (ugyebár szám-utasítás-mozgás) begépelésével töröljön két sort!
+
+ 1) Alvó szegek a jéghideg homokban,
+ 2) - kezdi a költő -
+ 3) Plakátmagányban ázó éjjelek.
+ 4) Pingvinek ne féljetek,
+ 5) Távolról egy vaku villant,
+ 6) Égve hagytad a folyosón a villanyt.
+ 7) Ma ontják véremet.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.5. lecke: A VISSZAVONÁS (UNDO) PARANCS
+
+
+** u gépelésével visszavonható az utolsó parancs, U az egész sort helyreállítja. **
+
+ 1. Menjünk az alábbi ---> kezdetű sor első hibájára!
+ 2. x lenyomásával törölje az első felesleges karaktert!
+ 3. u megnyomásával vonja vissza az utolsónak végrehajtott utasítást!
+ 4. Másodjára javítson ki minden hibát a sorban az x utasítással!
+ 5. Most nagy U -val állítsa vissza a sor eredeti állapotát!
+ 6. Nyomja meg az u gombot párszor, hogy az U és az azt megelőző utasításokat
+ visszaállítsa!
+ 7. CTRL-R (CTRL gomb lenyomása mellett üssön R-t) párszor csinálja újra a
+ visszavont parancsokat (redo)!
+
+---> Javíítsa a hhibákaat ebbben a sooorban majd állítsa visszaaa az eredetit.
+
+ 8. Ezek nagyon hasznos parancsok. Most ugorjon a 2. lecke összefoglalójára.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2. LECKE ÖSSZEFOGLALÓJA
+
+
+ 1. Törlés a kurzortól a szó végéig: dw
+
+ 2. Törlés a kurzortól a sor végéig: d$
+
+ 3. Egész sor törlése: dd
+
+ 4. Egy utasítás alakja normál módban:
+
+ [szám] utasítás mozgás VAGY utasítás [szám] mozgás
+ ahol:
+ szám - hányszor ismételjük a parancsot
+ utasítás - mit tegyünk, pl. d a törléskor
+ mozgás - mire hasson az utasítás, például w (szó=word),
+ $ (a sor végéig), stb.
+
+ 5. Az előző tett visszavonása (undo): u (kis u)
+ A sor összes változásának visszavonása: U (nagy U)
+ Visszavonások visszavonása: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.1. lecke: A BEILLESZTÉS (PUT) PARANCS
+
+
+ ** p leütésével az utolsónak töröltet a kurzor után illeszthetjük. **
+
+ 1. Mozgassuk a kurzort az alábbi sorok első sorára.
+
+ 2. dd leütésével töröljük a sort és eltárolódik a Vim pufferében.
+
+ 3. Mozgassuk a kurzort azelőtt a sor ELŐTTI sorba, ahová mozgatni
+ szeretnénk a törölt sort.
+
+ 4. Normál módban írjunk p betűt a törölt sor beillesztéséhez.
+
+ 5. Folytassuk a 2-4. utasításokkal hogy a helyes sorrendet kapjuk.
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.2. lecke: AZ ÁTÍRÁS (REPLACE) PARANCS
+
+
+** r és a karakterek leütésével a kurzor alatti karaktert megváltoztatjuk. **
+
+ 1. Mozgassuk a kurzort az első ---> kezdetű sorra!
+
+ 2. Mozgassuk a kurzort az első hiba fölé!
+
+ 3. r majd a kívánt karakter leütésével változtassuk meg a hibásat!
+
+ 4. A 2. és 3. lépésekkel javítsuk az összes hibát!
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. Menjünk a 3.2. leckére!
+
+MEGJ: Emlékezzen, hogy nem memorizálással, hanem gyakorlással tanuljon.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.3. lecke: A CSERE (CHANGE) PARANCS
+
+
+ ** A szó egy részének megváltoztatásához írjuk: cw . **
+
+ 1. Mozgassuk a kurzort az első ---> kezdetű sorra!
+
+ 2. Vigye a kurzort a Ezen szó z betűje fölé!
+
+ 3. cw és a helyes szórész (itt 'bben') beírásával javítsa a szót!
+
+ 4. <ESC> lenyomása után a következő hibára ugorjon (az első cserélendő
+ karakterre)!
+
+ 5. A 3. és 4. lépések ismétlésével az első mondatot tegye a másodikkal
+ azonossá!
+
+---> Ezen a sorrrrr pár szóra meg kell változzanak a change utaskíréső.
+---> Ebben a sorban pár szót meg kell változtatni a change utasítással.
+
+Vegyük észre, hogy a cw nem csak a szót írja át, hanem beszúró
+(insert) módba vált.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.4. lecke: TÖBBFÉLE VÁLTOZTATÁS c-VEL
+
+
+ ** A c utasítás használható ugyanazokkal az mozgásokkal mint a törlés **
+
+ 1. A change utasítás a törléssel azonosan viselkedik. A forma:
+
+ [szám] c mozgás OR c [szám] mozgás
+
+ 2. A mozgások is azonosak, pl. w (szó), $ (sorvég), stb.
+
+ 3. Mozgassuk a kurzort az első ---> kezdetű sorra!
+
+ 4. Menjünk az első hibára!
+
+ 5. c$ begépelésével a sorvégeket tegyük azonossá és nyomjunk <ESC>-et!
+
+---> Ennek a sornak a vége kiigazításra szorul, hogy megegyezzen a másodikkal.
+---> Ennek a sornak a vége a c$ paranccsal változtatható meg.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3. LECKE ÖSSZEFOGLALÓJA
+
+
+ 1. A már törölt sort beillesztéséhez nyomjunk p-t. Ez a törölt szöveget
+ a kurzor UTÁN helyezi (ha sor került törlésre, a kurzor alatti sorba).
+
+ 2. A kurzor alatti karakter átírásához az r-et és azt a karaktert
+ nyomjuk, amellyel az eredetit felül szeretnénk írni.
+
+ 3. A változtatás (c) utasítás a karaktertől az mozgás végéig
+ változtatja meg az mozgást. Például a cw a kurzortól a szó végéig,
+ a c$ a sor végéig.
+
+ 4. A változtatás formátuma:
+
+ [szám] c mozgás VAGY c [szám] mozgás
+
+Ugorjunk a következő leckére!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.1. lecke: HELY ÉS FÁJLÁLLAPOT
+
+
+ ** CTRL-g megnyomásával megnézhetjük a helyünket a fájlban és a fájl állapotát.
+ SHIFT-G leütésével a fájl adott sorára ugorhatunk. **
+
+ Megj: Olvassuk el az egész leckét a lépések végrehajtása előtt!!
+
+ 1. Tartsuk nyomva a Ctrl gombot és nyomjunk g-t. Az állapotsor
+ megjelenik a lap alján a fájlnévvel és az aktuális sor sorszámával.
+ Jegyezzük meg a sorszámot a 3. lépéshez!
+
+ 2. Nyomjunk Shift-G-t a lap aljára ugráshoz!
+
+ 3. Üssük be az eredeti sor számát, majd üssünk shift-G-t! Ezzel
+ visszajutunk az eredeti sorra ahol Ctrl-g-t nyomtunk.
+ (A beírt szám NEM fog megjelenni a képernyőn.)
+
+ 4. Ha megjegyezte a feladatot, hajtsa végre az 1-3. lépéseket!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.2. lecke: A KERESÉS (SEARCH) PARANCS
+
+
+ ** / majd a kívánt kifejezés beírásával kereshetjük meg a kifejezést. **
+
+ 1. Normál módban üssünk / karaktert! Ez és a kurzor megjelenik
+ a képernyő alján, ahogy a : utasítás is.
+
+ 2. Írjuk be: 'hiibaa' <ENTER>! Ez az a szó amit keresünk.
+
+ 3. A kifejezés újabb kereséséhez üssük le egyszerűen: n .
+ A kifejezés ellenkező irányban történő kereséséhez ezt üssük be: Shift-N .
+
+ 4. Ha visszafelé szeretne keresni, akkor ? kell a / helyett.
+
+---> "hiibaa" nem a helyes módja a hiba leírásának; a hiibaa egy hiba.
+
+Megj: Ha a keresés eléri a fájl végét, akkor az elején kezdi.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.3. lecke: ZÁRÓJELEK PÁRJÁNAK KERESÉSE
+
+
+ ** % leütésével megtaláljuk a ),], vagy } párját. **
+
+ 1. Helyezze a kurzort valamelyik (, [, vagy { zárójelre a ---> kezdetű
+ sorban!
+
+ 2. Üssön % karaktert!
+
+ 3. A kurzor a zárójel párjára fog ugrani.
+
+ 4. % leütésével visszaugrik az eredeti zárójelre.
+
+---> Ez ( egy tesztsor (-ekkel, [-ekkel ] és {-ekkel } a sorban. ))
+
+Megj: Ez nagyon hasznos, ha olyan programot debugolunk, amelyben a
+ zárójelek nem párosak!
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.4. lecke: A HIBÁK KIJAVÍTÁSÁNAK EGY MÓDJA
+
+
+ ** :s/régi/új/g begépelésével az 'új'-ra cseréljük a 'régi'-t. **
+
+ 1. Menjünk a ---> kezdetű sorra!
+
+ 2. Írjuk be: :s/eggy/egy <ENTER> . Ekkor csak az első változik meg a
+ sorban.
+
+ 3. Most ezt írjuk: :s/eggy/egg/g amely globálisan helyettesít
+ a sorban, azaz minden előfordulást.
+ Ez a sorban minden előfordulást helyettesít.
+
+---> eggy heggy meggy, szembe jön eggy másik heggy.
+
+ 4. Két sor között a karaktersor minden előfordulásának helyettesítése:
+ :#,#s/régi/új/g ahol #,# a két sor sorszáma.
+ :%s/régi/új/g a fájlbeli összes előfordulás helyettesítése.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4. LECKE ÖSSZEFOGLALÓJA
+
+
+ 1. Ctrl-g kiírja az kurzor helyét a fájlban és a fájl állapotát.
+ Shift-G a fájl végére megy, gg az elejére. Egy szám után
+ Shift-G az adott számú sorra ugrik.
+
+ 2. / után egy kifejezés ELŐREFELE keresi a kifejezést.
+ 2. ? után egy kifejezés VISSZAFELE keresi a kifejezést.
+ Egy keresés után az n a következő előfordulást keresi azonos irányban
+ Shift-N az ellenkező irányban keres.
+
+ 3. % begépelésével, ha (,),[,],{, vagy } karakteren vagyunk a zárójel
+ párjára ugrik.
+
+ 4. az első régi helyettesítése újjal a sorban :s/régi/új
+ az összes régi helyettesítése újjal a sorban :s/régi/új/g
+ két sor közötti kifejezésekre :#,#s/régi/új/g
+ # helyén az aktuális sor (.) és az utolsó ($) is állhat :.,$/régi/új/g
+ A fájlbeli összes előfordulás helyettesítése :%s/régi/új/g
+ Mindenkori megerősítésre vár 'c' hatására :%s/régi/új/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.1. lecke: KÜLSŐ PARANCS VÉGREHAJTÁSA
+
+
+ ** :! után külső parancsot írva végrehajtódik a parancs. **
+
+ 1. Írjuk be az ismerős : parancsot, hogy a kurzort a képernyő aljára
+ helyezzük. Ez lehetővé teszi egy parancs beírását.
+
+ 2. ! (felkiáltójel) beírásával tegyük lehetővé külső héj (shell)-parancs
+ végrehajtását.
+
+ 3. Írjunk például ls parancsot a ! után majd üssünk <ENTER>-t. Ez ki
+ fogja listázni a könyvtárunkat ugyanúgy, mintha a shell promptnál
+ lennénk. Vagy írja ezt :!dir ha az ls nem működik.
+
+Megj: Ilymódon bármely külső utasítás végrehajtható.
+
+Megj: Minden : parancs után <ENTER>-t kell ütni.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.2. lecke: BŐVEBBEN A FÁJLOK ÍRÁSÁRÓL
+
+
+ ** A fájlok változásait így írhatjuk ki :w FÁJLNÉV. **
+
+ 1. :!dir vagy :!ls beírásával listázzuk a könyvtárunkat!
+ Ön már tudja, hogy <ENTER>-t kell ütnie utána.
+
+ 2. Válasszon egy fájlnevet, amely még nem létezik pl. TESZT!
+
+ 3. Írja: :w TESZT (ahol TESZT a választott fájlnév)!
+
+ 4. Ez elmenti a teljes fájlt (a Vim oktatóját) TESZT néven.
+ Ellenőrzésképp írjuk ismét :!dir hogy lássuk a könyvtárat!
+ (Felfelé gombbal : után az előző utasítások visszahozhatóak.)
+
+Megj: Ha Ön kilépne a Vimből és és visszatérne a TESZT fájlnévvel, akkor a
+ fájl az oktató mentéskori pontos másolata lenne.
+
+ 5. Távolítsa el a fájlt (MS-DOS): :!del TESZT
+ vagy (Unix): :!rm TESZT
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.3. lecke: EGY KIVÁLASZTOTT RÉSZ KIÍRÁSA
+
+
+ ** A fájl egy részének kiírásához írja :#,# w FÁJLNÉV **
+
+ 1. :!dir vagy :!ls beírásával listázza a könyvtárat, és válasszon egy
+ megfelelő fájlnevet, pl. TESZT.
+
+ 2. Mozgassa a kurzort ennek az oldalnak a tetejére, és nyomjon
+ Ctrl-g-t, hogy megtudja a sorszámot. JEGYEZZE MEG A SZÁMOT!
+
+ 3. Most menjen a lap aljára, és üsse be ismét: Ctrl-g. EZT A SZÁMOT
+ IS JEGYEZZE MEG!
+
+ 4. Ha csak ezt a részét szeretné menteni a fájlnak, írja :#,# w TESZT
+ ahol #,# a két sorszám, amit megjegyzett, TESZT az Ön fájlneve.
+
+ 5. Ismét nézze meg, hogy a fájl ott van (:!dir) de NE törölje.
+
+ 6. Vimben létezik egy másik lehetőség: nyomja meg a Shift-V gombpárt
+ az első menteni kívánt soron, majd menjen le az utolsóra, ezután
+ írja :w TESZT2 Ekkor a TESZT2 fájlba kerül a kijelölt rész.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.4. lecke: FÁJLOK VISSZAÁLLÍTÁSA ÉS ÖSSZEFŰZÉSE
+
+
+ ** Egy fájl tartalmának beillesztéséhez írja :r FÁJLNÉV **
+
+ 1. :!dir beírásával nézze meg, hogy az Ön TESZT fájlja létezik még.
+
+ 2. Helyezze a kurzort ennek az oldalnak a tetejére.
+
+MEGJ: A 3. lépés után az 5.3. leckét fogja látni. Azután LEFELÉ indulva
+ keresse meg ismét ezt a leckét.
+
+ 3. Most szúrja be a TESZT nevű fájlt a :r TESZT paranccsal, ahol
+ TESZT az Ön fájljának a neve.
+
+MEGJ: A fájl, amit beillesztett a kurzora alatt helyezkedik el.
+
+ 4. Hogy ellenőrizzük, hogy a fájlt tényleg beillesztettük, menjen
+ vissza, és nézze meg, hogy kétszer szerepel az 5.3. lecke! Az eredeti
+ mellett a fájlból bemásolt is ott van.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5. LECKE ÖSSZEFOGLALÓJA
+
+
+ 1. :!parancs végrehajt egy külső utasítást.
+
+ Pár hasznos példa:
+ (MS-DOS) (Unix)
+ :!dir :!ls - könyvtárlista kiírása.
+ :!del FÁJLNÉV :!rm FÁJLNÉV - FÁJLNÉV nevű fájl törlése.
+
+ 2. :w FÁJLNÉV kiírja a jelenlegi Vim-fájlt a lemezre FÁJNÉV néven.
+
+ 3. :#,#w FÁJLNÉV kiírja a két sorszám (#) közötti sorokat FÁJLNÉV-be
+ Másik lehetőség, hogy a kezdősornál Shift-v-t nyom lemegy az utolsó
+ sorra, majd ezt üti be :w FÁJLNÉV
+
+ 4. :r FÁJLNÉV beolvassa a FÁJLNÉV fájlt és behelyezi a jelenlegi fájlba
+ a kurzorpozíció utáni sorba.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.1. lecke: A MEGNYITÁS (OPEN) PARANCS
+
+
+** o beírásával nyit egy új sort a kurzor alatt és beszúró módba vált **
+
+ 1. Mozgassuk a kurzort a ---> kezdetű sorra.
+
+ 2. o (kicsi) beírásával nyisson egy sort a kurzor ALATT! Ekkor
+ automatikusan beszúró (insert) módba kerül.
+
+ 3. Másolja le a ---> jelű sort és <ESC> megnyomásával lépjen ki
+ a beszúró módból.
+
+---> Az o lenyomása után a kurzor a következő sor elején áll beszúró módban.
+
+ 4. A kurzor FELETTI sor megnyitásához egyszerűen nagy O betűt írjon
+kicsi helyett. Próbálja ki a következő soron!
+Nyisson egy új sort efelett Shift-O megnyomásával, mialatt a kurzor
+ezen a soron áll.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.2. lecke: AZ APPEND PARANCS
+
+
+ ** a lenyomásával a kurzor UTÁN szúrhatunk szöveget. **
+
+ 1. Mozgassuk a kurzort a következő ---> kezdetű sor végére úgy,
+ hogy normál módban $-t ír be.
+
+ 2. Kis "a" leütésével szöveget szúrhat be AMÖGÉ a karakter mögé,
+ amelyen a kurzor áll.
+ (A nagy "A" az egész sor végére írja a szöveget.)
+
+Megj: A Vimben a sor legvégére is lehet állni, azonban ez elődjében
+ a Vi-ban nem lehetséges, ezért abban az a nélkül elég körülményes
+ a sor végéhez szöveget írni.
+
+ 3. Egészítse ki az első sort. Vegye észre, hogy az a utasítás (append)
+ teljesen egyezik az i-vel (insert) csupán a beszúrt szöveg helye
+ különbözik.
+
+---> Ez a sor lehetővé teszi Önnek, hogy gyakorolja
+---> Ez a sor lehetővé teszi Önnek, hogy gyakorolja a sor végére beillesztést.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.3. lecke: AZ ÁTÍRÁS MÁSIK VÁLTOZATA
+
+
+ ** Nagy R beírásával írhat felül több mint egy karaktert. **
+
+ 1. Mozgassuk a kurzort az első ---> kezdetű sorra!
+
+ 2. Helyezze a kurzort az első szó elejére amely eltér a második
+ ---> kezdetű sor tartalmától (a 'az utolsóval' résztől).
+
+ 3. Nyomjon R karaktert és írja át a szöveg maradékát az első sorban
+ úgy, hogy a két sor egyező legyen.
+
+---> Az első sort tegye azonossá az utolsóval: használja a gombokat.
+---> Az első sort tegye azonossá a másodikkal: írjon R-t és az új szöveget.
+
+ 4. Jegyezzük meg, ha <ESC>-et nyomok, akkor a változatlanul hagyott
+ szövegek változatlanok maradnak.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.4. lecke: BEÁLLÍTÁSOK
+
+** Állítsuk be, hogy a keresés és a helyettesítés ne függjön kis/NAGYbetűktől **
+
+ 1. Keressük meg az 'ignore'-t az beírva:
+ /ignore
+ Ezt ismételjük többször az n billentyűvel
+
+ 2. Állítsuk be az 'ic' (Ignore case) lehetőséget így:
+ :set ic
+
+ 3. Most keressünk ismét az 'ignore'-ra n-nel
+ Ismételjük meg többször a keresést: n
+
+ 4. Állítsuk be a 'hlsearch' és 'incsearch' lehetőségeket:
+ :set hls is
+
+ 5. Most ismét írjuk be a keresőparancsot, és lássuk mi történik:
+ /ignore
+
+ 6. A kiemelést szüntessük meg alábbi utasítások egyikével:
+ :set nohls vagy :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6. LECKE ÖSSZEFOGLALÓJA
+
+
+ 1. o beírásával új sort nyitunk meg a sor ALATT és a kurzor az új
+ sorban lesz beszúrás-módban.
+ Nagy O a sor FELETT nyit új sort, és oda kerül a kurzor.
+
+ 2. a beírásával az aktuális karaktertől UTÁN (jobbra) szúrhatunk be szöveget.
+ Nagy A automatikusan a sor legvégéhez adja hozzá a szöveget.
+
+ 3. A nagy R beütésével átíró (replace) módba kerülünk <ESC> lenyomásáig.
+
+ 4. ":set xxx" beírásával az "xxx" opció állítható be.
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7. lecke: AZ ON-LINE SÚGÓ PARANCSAI
+
+
+ ** Az online súgórendszer használata **
+
+ A Vim részletes súgóval rendelkezik. Induláshoz a következők egyikét
+ tegye:
+ - nyomja meg a <HELP> gombot (ha van ilyen)
+ - nyomja meg az <F1> gombot (ha van ilyen)
+ - írja be: :help <ENTER>
+
+ :q <ENTER> beírásával zárhatja be a súgóablakot.
+
+ Majdnem minden témakörről találhat súgót, argumentum megadásával
+ ":help" utasítás . Próbálja az alábbiakat ki (<ENTER>-t ne felejtsük):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 8. lecke: INDÍTÓSZKRIPT ÍRÁSA
+
+ ** A Vim lehetőségeinek beállítása **
+
+ A Vim rengeteg lehetőséggel rendelkezik a Vi-hoz képest, de a legtöbb
+ alapból elérhetetlen. Ahhoz, hogy alapból több lehetőségünk legyen készítenünk
+ kell egy "vimrc" fájlt.
+
+ 1. Kezdjük el szerkeszteni a "vimrc" fájlt, ennek módja:
+ :edit ~/.vimrc Unixon, Linuxon
+ :edit ~/_vimrc MS-Windowson
+
+ 2. Most szúrjuk be a példa "vimrc" fájl szövegét:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Írjuk ki a fájlt:
+
+ :write
+
+ Legközelebb a Vim szintaxiskiemeléssel indul.
+ Hozzáadhatja kedvenc beállításait ehhez a "vimrc" fájlhoz.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Itt végződik a Vim oktató, melynek a szándéka egy rövid áttekintés a
+ Vimről, amely elég ahhoz, hogy elég könnyedén kezeljük a szerkesztőt.
+ Távol van a teljességtől, mivel a Vimnek számtalan további utasítása
+ van. Ezután a felhasználói kézikönyvet érdemes elolvasni az angolul
+ tudóknak: ":help user-manual". (egyelőre nem tud magyarul)
+
+ További magyar olvasnivalók érhetőek el az alábbi oldalról.
+ http://wiki.hup.hu/index.php/Vim
+
+ Angol olvasmányok:
+ For further reading and studying, this book is recommended:
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+ The first book completely dedicated to Vim. Especially useful for beginners.
+ There are many examples and pictures.
+ See https://iccf-holland.org/click5.html
+
+ This book is older and more about Vi than Vim, but also recommended:
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+ It is a good book to get to know almost anything you want to do with Vi.
+ The sixth edition also includes information on Vim.
+
+ Ezt az oktatót Michael C. Pierce és Robert K. Ware írta, a Colorado
+ School of Mines dolgozói Charles Smith (Colorado State University)
+ támogatásával.
+
+ E-mail: bware@mines.colorado.edu.
+
+ A Vimhez idomította Bram Moolenaar.
+
+ Magyarította: Horváth Árpád <horvath.arpad@arek.uni-opbuda.hu>, 2006-2012
+
diff --git a/runtime/tutor/tutor.info b/runtime/tutor/tutor.info
new file mode 100644
index 0000000..dccf4be
--- /dev/null
+++ b/runtime/tutor/tutor.info
Binary files differ
diff --git a/runtime/tutor/tutor.it b/runtime/tutor/tutor.it
new file mode 100644
index 0000000..ce3b970
--- /dev/null
+++ b/runtime/tutor/tutor.it
@@ -0,0 +1,967 @@
+===============================================================================
+= Benvenuto alla G u i d a all'Editor V I M - Versione 1.7 =
+===============================================================================
+
+ Vim un Editor molto potente ed ha parecchi comandi, troppi per
+ spiegarli tutti in una guida come questa. Questa guida serve a
+ descrivere quei comandi che ti permettono di usare facilmente
+ Vim come Editor di uso generale.
+
+ Il tempo necessario per completare la guida circa 25-30 minuti,
+ a seconda di quanto tempo dedichi alla sperimentazione.
+
+ ATTENZIONE!
+ I comandi nelle lezioni modificano questo testo. Fai una copia di questo
+ file per esercitarti (se hai usato "vimtutor", stai gi usando una copia).
+
+ importante non scordare che questa guida vuole insegnare tramite
+ l'uso. Questo vuol dire che devi eseguire i comandi per impararli
+ davvero. Se leggi il testo e basta, dimenticherai presto i comandi!
+
+ Adesso, assicurati che il tasto BLOCCA-MAIUSCOLO non sia schiacciato
+ e premi il tasto j tanto da muovere il cursore fino a che la
+ Lezione 1.1 riempia completamente lo schermo.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.1: MOVIMENTI DEL CURSORE
+
+
+ ** Per muovere il cursore, premi i tasti h,j,k,l come indicato. **
+ ^
+ k NOTA: Il tasto h a sinistra e muove a sinistra.
+ < h l > Il tasto l a destra e muove a destra.
+ j Il tasto j ricorda una freccia in gi.
+ v
+ 1. Muovi il cursore sullo schermo finch non ti senti a tuo agio.
+
+ 2. Tieni schiacciato il tasto "gi" (j) finch non si ripete il movimento.
+ Adesso sai come arrivare fino alla lezione seguente.
+
+ 3. Usando il tasto "gi" spostati alla Lezione 1.2.
+
+NOTA: Quando non sei sicuro del tasto che hai premuto, premi <ESC> per andare
+ in Modalit Normale [Normal Mode]. Poi ri-immetti il comando che volevi.
+
+NOTA: I tasti con le frecce fanno lo stesso servizio. Ma usando hjkl riesci
+ a muoverti molto pi rapidamente, dopo che ci si abitua. Davvero!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.2: USCIRE DA VIM
+
+
+ !! NOTA: Prima di eseguire quanto richiesto, leggi la Lezione per intero!!
+
+ 1. Premi il tasto <ESC> (per assicurarti di essere in Modalit Normale).
+
+ 2. Batti: :q! <INVIO>.
+ Cos esci dall'Editor SCARTANDO qualsiasi modifica fatta.
+
+ 3. Quando vedi il PROMPT della Shell, batti il comando con cui sei arrivato
+ qui. Sarebbe: vimtutor <INVIO>
+
+ 4. Se hai memorizzato questi comandi e ti senti pronto, esegui i passi
+ da 1 a 3 per uscire e rientrare nell'Editor.
+
+NOTA: :q! <INVIO> SCARTA qualsiasi modifica fatta. In una delle prossime
+ lezioni imparerai come salvare un file che hai modificato.
+
+ 5. Muovi in gi il cursore per passare alla lezione 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.3: MODIFICA DI TESTI - CANCELLAZIONE
+
+
+ ** Premere x per cancellare il carattere sotto al cursore **
+
+ 1. Muovi il cursore alla linea pi sotto, indicata da --->.
+
+ 2. Per correggere errori, muovi il cursore fino a posizionarlo sopra il
+ carattere da cancellare.
+
+ 3. Premi il tasto x per cancellare il carattere sbagliato.
+
+ 4. Ripeti i passi da 2 a 4 finch la frase corretta.
+
+---> La mmucca salt finnoo allaa lunnna.
+
+ 5. Ora che la linea corretta, vai alla Lezione 1.4
+
+NOTA: Mentre segui questa guida, non cercare di imparare a memoria,
+ ma impara facendo pratica.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.4: MODIFICA DI TESTI - INSERIMENTO
+
+
+ ** Premere i per inserire testo. **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+
+ 2. Per rendere la prima linea uguale alla seconda, muovi il cursore sopra
+ il primo carattere DOPO la posizione in cui il testo va inserito.
+
+ 3. Premi i e batti le aggiunte opportune.
+
+ 4. Quando un errore corretto, premi <ESC> per tornare in Modalit Normale.
+ Ripeti i passi da 2 a 4 fino a completare la correzione della frase.
+
+---> C'era del tsto mncnt questa .
+---> C'era del testo mancante da questa linea.
+
+ 5. Quando sei a tuo agio nell'inserimento di testo vai alla lezione 1.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.5: MODIFICA DI TESTI - AGGIUNTA
+
+
+ ** Premere A per aggiungere testo a fine linea. **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+ Non importa dove posizionato il cursore sulla linea stessa.
+
+ 2. Batti A e inserisci le necessarie aggiunte.
+
+ 3. Alla fine della aggiunta premi <ESC> per tornare in modalit Normale.
+
+ 4. Muovi il cursore alla seconda linea indicata ---> e ripeti
+ i passi 2 e 3 per correggere questa frase.
+
+---> C' del testo che manca da qu
+ C' del testo che manca da questa linea.
+---> C' anche del testo che ma
+ C' anche del testo che manca qui.
+
+ 5. Quando sei a tuo agio nell'aggiunta di testo vai alla lezione 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.6: MODIFICARE UN FILE
+
+
+ ** Usare :wq per salvare un file e uscire. **
+
+ !! NOTA: Prima di eseguire quanto richiesto, leggi la Lezione per intero!!
+
+ 1. Esci da Vim come hai fatto nella lezione 1.2: :q!
+
+ 2. Quando vedi il PROMPT della Shell, batti il comando: vim tutor <INVIO>
+ 'vim' il comando per richiamare Vim, 'tutor' il nome del file che
+ desideri modificare. Usa un file che possa essere modificato.
+
+ 3. Inserisci e cancella testo come hai imparato nelle lezioni precedenti.
+
+ 4. Salva il file ed esci da Vim con: :wq <INVIO>
+
+ 5. Rientra in vimtutor e scendi al sommario che segue.
+
+ 6. Dopo aver letto i passi qui sopra ed averli compresi: eseguili.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1 SOMMARIO
+
+
+ 1. Il cursore si muove usando i tasti con le frecce o i tasti hjkl.
+ h (sinistra) j (gi) k (su) l (destra)
+
+ 2. Per eseguire Vim dal PROMPT della Shell batti: vim NOMEFILE <INVIO>
+
+ 3. Per uscire da Vim batti: <ESC> :q! <INVIO> per uscire senza salvare.
+ oppure batti: <ESC> :wq <INVIO> per uscire salvando modifiche.
+
+ 4. Per cancellare il carattere sotto al cursore batti: x
+
+ 5. Per inserire testo subito prima del cursore batti:
+ i batti testo inserito <ESC> inserisci prima del cursore
+ A batti testo aggiunto <ESC> aggiungi a fine linea
+
+NOTA: premendo <ESC> ritornerai in Modalit Normale o annullerai
+ un comando errato che puoi aver inserito in parte.
+
+Ora continua con la Lezione 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.1: COMANDI DI CANCELLAZIONE
+
+
+ ** Batti dw per cancellare una parola. **
+
+ 1. Premi <ESC> per accertarti di essere in Modalit Normale.
+
+ 2. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+
+ 3. Muovi il cursore all'inizio di una parola che vuoi cancellare.
+
+ 4. Batti dw per cancellare la parola.
+
+NOTA: La lettera d sar visibile sull'ultima linea dello schermo mentre la
+ batti. Vim attende che tu batta w . Se vedi una lettera diversa
+ da d hai battuto qualcosa di sbagliato; premi <ESC> e ricomincia.
+
+---> Ci sono le alcune parole gioia che non c'entrano carta in questa frase.
+
+ 5. Ripeti i passi 3 e 4 finch la frase corretta, poi vai alla Lezione 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.2: ALTRI COMANDI DI CANCELLAZIONE
+
+
+ ** Batti d$ per cancellare fino a fine linea. **
+
+ 1. Premi <ESC> per accertarti di essere in Modalit Normale.
+
+ 2. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+
+ 3. Muovi il cursore alla fine della linea corretta (DOPO il primo . ).
+
+ 4. Batti d$ per cancellare fino a fine linea.
+
+---> Qualcuno ha battuto la fine di questa linea due volte. linea due volte.
+
+
+ 5. Vai alla Lezione 2.3 per capire il funzionamento di questo comando.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.3: OPERATORI E MOVIMENTI
+
+
+ Molti comandi di modifica testi consistono in un operatore e un movimento.
+ Il formato del comando di cancellazione con l'operatore d il seguente:
+
+ d movimento
+
+ Dove:
+ d - l'operatore di cancellazione
+ movimento - indica dove l'operatore va applicato (lista qui sotto).
+
+ Breve lista di movimenti:
+ w - fino a inizio della parola seguente, ESCLUSO il suo primo carattere.
+ e - alla fine della parola corrente, COMPRESO il suo ultimo carattere.
+ $ - dal cursore fino a fine linea, COMPRESO l'ultimo carattere della linea.
+
+ Quindi se batti de cancelli dal cursore fino a fine parola.
+
+NOTA: Se batti solo il movimento mentre sei in Modalit Normale, senza
+ nessun operatore, il cursore si muover come specificato.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.4: USO DI UN CONTATORE PER UN MOVIMENTO
+
+
+ ** Se batti un numero prima di un movimento, lo ripeti altrettante volte. **
+
+ 1. Muovi il cursore fino all'inizio della linea qui sotto, indicata da --->.
+
+ 2. Batti 2w per spostare il cursore due parole pi avanti.
+
+ 3. Batti 3e per spostare il cursore alla fine della terza parola seguente.
+
+ 4. Batti 0 (zero) per posizionarti all'inizio della linea.
+
+ 5. Ripeti i passi 2 e 3 usando numeri differenti.
+
+---> Questa solo una linea con parole all'interno della quale puoi muoverti.
+
+ 6. Vai alla Lezione 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.5: USO DI UN CONTATORE PER CANCELLARE DI PIU'
+
+
+ ** Se batti un numero prima di un movimento, lo ripeti altrettante volte. **
+
+ Nella combinazione dell'operatore cancella e di un movimento, descritto prima,
+ inserite un contatore prima del movimento per cancellare di pi:
+ d numero movimento
+
+ 1. Muovi il cursore alla prima parola MAIUSCOLA nella riga indicata da --->.
+
+ 2. Batti d2w per cancellare le due parole MAIUSCOLE
+
+ 3. Ripeti i passi 1 e 2 con un contatore diverso per cancellare le parole
+ MAIUSCOLE consecutive con un solo comando
+
+---> questa ABC DE linea FGHI JK LMN OP di parole Q RS TUV ora ripulita.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.6: LAVORARE SU LINEE INTERE
+
+ ** Batti dd per cancellare un'intera linea. **
+
+ Per la frequenza con cui capita di cancellare linee intere, chi ha
+ disegnato Vi ha deciso che sarebbe stato pi semplice battere
+ due d consecutive per cancellare una linea.
+
+ 1. Muovi il cursore alla linea 2) nella frase qui sotto.
+ 2. Batti dd per cancellare la linea.
+ 3. Ora spostati alla linea 4).
+ 4. Batti 2dd per cancellare due linee.
+
+---> 1) Le rose sono rosse,
+---> 2) Il fango divertente,
+---> 3) Le viole sono blu,
+---> 4) Io ho un'automobile,
+---> 5) Gli orologi segnano il tempo,
+---> 6) Lo zucchero dolce,
+---> 7) E cos sei anche tu.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.7: IL COMANDO UNDO [ANNULLA]
+
+ ** Premi u per annullare gli ultimi comandi eseguiti. **
+ ** Premi U per annullare le modifiche all'ultima linea. **
+
+ 1. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+ e posizionati sul primo errore.
+ 2. Batti x per cancellare il primo carattere sbagliato.
+ 3. Adesso batti u per annullare l'ultimo comando eseguito.
+ 4. Ora invece, correggi tutti gli errori sulla linea usando il comando x .
+ 5. Adesso batti una U Maiuscola per riportare la linea al suo stato originale.
+ 6. Adesso batti u pi volte per annullare la U e i comandi precedenti.
+ 7. Adesso batti pi volte CTRL-r (tieni il tasto CTRL schiacciato
+ mentre batti r) per rieseguire i comandi (annullare l'annullamento).
+
+---> Correeggi gli errori ssu quuesta linea e riimpiazzali coon "undo".
+
+ 8. Questi comandi sono molto utili. Ora spostati al Sommario della Lezione 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2 SOMMARIO
+
+
+ 1. Per cancellare dal cursore fino alla parola seguente batti: dw
+ 2. Per cancellare dal cursore fino alla fine della linea batti: d$
+ 3. Per cancellare un'intera linea batti: dd
+ 4. Per eseguire pi volte un movimento, mettici davanti un numero: 2w
+ 5. Il formato per un comando di modifica :
+
+ operatore [numero] movimento
+ dove:
+ operatore - indica il da farsi, ad es. d per [delete] cancellare
+ [numero] - contatore facoltativo di ripetizione del movimento
+ movimento - spostamento nel testo su cui operare, ad es.
+ w [word] parola, $ (fino a fine linea), etc.
+
+ 6. Per andare a inizio linea usate uno zero: 0
+ 7. Per annullare i comandi precedenti, batti: u (u minuscola)
+ Per annullare tutte le modifiche a una linea batti: U (U maiuscola)
+ Per annullare l'annullamento ["redo"] batti: CTRL-r
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3.1: IL COMANDO PUT [METTI, PONI]
+
+
+ ** Batti p per porre [put] testo (cancellato prima) dopo il cursore. **
+
+ 1. Muovi il cursore alla prima linea indicata con ---> qui in basso.
+
+ 2. Batti dd per cancellare la linea e depositarla in un registro di Vim.
+
+ 3. Muovi il cursore fino alla linea c) SOPRA quella dove andrebbe messa
+ la linea appena cancellata.
+
+ 4. Batti p per mettere la linea sotto il cursore.
+
+ 5. Ripeti i passi da 2 a 4 per mettere tutte le linee nel giusto ordine.
+
+---> d) Puoi impararla tu?
+---> b) Le viole sono blu,
+---> c) La saggezza si impara,
+---> a) Le rose sono rosse,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3.2: IL COMANDO REPLACE [RIMPIAZZARE]
+
+
+ ** Batti rx per rimpiazzare il carattere sotto al cursore con x . **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+
+ 2. Muovi il cursore fino a posizionarlo sopra il primo errore.
+
+ 3. Batti r e poi il carattere che dovrebbe stare qui.
+
+ 4. Ripeti i passi 2 e 3 finch la prima linea uguale alla seconda.
+
+---> Ammattendo quetta lince, qualcuno ho predato alcuni tosti sballiati!
+---> Immettendo questa linea, qualcuno ha premuto alcuni tasti sbagliati!
+
+ 5. Ora passa alla Lezione 3.3.
+
+NOTA: Ricordati che dovresti imparare con la pratica, non solo leggendo.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3.3: L'OPERATORE CHANGE [CAMBIA]
+
+
+ ** Per cambiare fino alla fine di una parola, batti ce . **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+
+ 2. Posiziona il cursore alla u in lubw.
+
+ 3. Batti ce e la parola corretta (in questo caso, batti inea ).
+
+ 4. Premi <ESC> e vai sul prossimo carattere da modificare.
+
+ 5. Ripeti i passi 3 e 4 finch la prima frase uguale alla seconda.
+
+---> Questa lubw ha alcune pptfd da asdert usgfk l'operatore CHANGE.
+---> Questa linea ha alcune parole da cambiare usando l'operatore CHANGE.
+
+Nota che ce cancella la parola, e ti mette anche in Modalit Inserimento
+ [Insert Mode]
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3.4: ALTRI CAMBIAMENTI USANDO c
+
+** L'operatore c [CHANGE] agisce sugli stessi movimenti di d [DELETE] **
+
+ 1. L'operatore CHANGE si comporta come DELETE. Il formato :
+
+ c [numero] movimento
+
+ 2. I movimenti sono gli stessi,
+ ad es. w (word, parola), $ (fine linea), etc.
+
+ 3. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+
+ 4. Posiziona il cursore al primo errore.
+
+ 5. Batti c$ e inserisci resto della linea utilizzando come modello la
+ linea seguente, e quando hai finito premi <ESC>
+
+---> La fine di questa linea deve essere aiutata a divenire come la seguente.
+---> La fine di questa linea deve essere corretta usando il comando c$ .
+
+NOTA: Puoi usare il tasto Backspace se devi correggere errori di battitura.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3 SOMMARIO
+
+
+ 1. Per reinserire del testo appena cancellato, batti p . Questo
+ inserisce [pone] il testo cancellato DOPO il cursore (se era stata tolta
+ una linea intera, questa verr messa nella linea SOTTO il cursore).
+
+ 2. Per rimpiazzare il carattere sotto il cursore, batti r e poi il
+ carattere che vuoi sostituire.
+
+ 3. L'operatore change ti permette di cambiare dal cursore fino a dove
+ arriva il movimento. Ad es. Batti ce per cambiare dal cursore
+ fino alla fine della parola, c$ per cambiare fino a fine linea.
+
+ 4. Il formato di change :
+
+ c [numero] movimento
+
+Ora vai alla prossima Lezione.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4.1: POSIZIONAMENTO E SITUAZIONE FILE
+
+ ** Batti CTRL-G per vedere a che punto sei nel file e la situazione **
+ ** del file. Batti G per raggiungere una linea nel file. **
+
+ NOTA: Leggi l'intera Lezione prima di eseguire un qualsiasi passo!!
+
+ 1. Tieni premuto il tasto CTRL e batti g . Ossia batti CTRL-G.
+ Un messaggio apparir in fondo alla pagina con il NOME FILE e la
+ posizione nel file. Ricordati il numero della linea per il Passo 3.
+
+NOTA: La posizione del cursore si vede nell'angolo in basso a destra dello
+ schermo, se impostata l'opzione 'ruler' (righello, vedi :help ruler).
+
+ 2. Premi G [G Maiuscolo] per posizionarti in fondo al file.
+ Batti gg per posizionarti in cima al file.
+
+ 3. Batti il numero della linea in cui ti trovavi e poi G . Questo ti
+ riporter fino alla linea in cui ti trovavi quando avevi battuto CTRL-g.
+
+ 4. Se ti senti sicuro nel farlo, esegui i passi da 1 a 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4.2: IL COMANDO SEARCH [RICERCA]
+
+ ** Batti / seguito da una frase per ricercare quella frase. **
+
+ 1. in Modalit Normale batti il carattere / . Nota che la "/" e il cursore
+ sono visibili in fondo dello schermo come quando si usa il comando : .
+
+ 2. Adesso batti 'errroore' <INVIO>. Questa la parola che vuoi ricercare.
+
+ 3. Per ricercare ancora la stessa frase, batti soltanto n .
+ Per ricercare la stessa frase in direzione opposta, batti N .
+
+ 4. Per ricercare una frase nella direzione opposta, usa ? al posto di / .
+
+ 5. Per tornare dove eri prima nel file premi CTRL-O (tieni il tasto CTRL
+ schiacciato mentre premi la lettera o). Ripeti CTRL-O per andare ancora
+ indietro. Puoi usare CTRL-I per tornare in avanti.
+
+---> "errroore" non il modo giusto di digitare errore; errroore un errore.
+NOTA: Quando la ricerca arriva a fine file, ricomincia dall'inizio del file,
+ a meno che l'opzione 'wrapscan' sia stata disattivata.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4.3: RICERCA DI PARENTESI CORRISPONDENTI
+
+
+ ** Batti % per trovare una ),], o } corrispondente. **
+
+ 1. Posiziona il cursore su una (, [, o { nella linea sotto, indicata da --->.
+
+ 2. Adesso batti il carattere % .
+
+ 3. Il cursore si sposter sulla parentesi corrispondente.
+
+ 4. Batti % per muovere il cursore all'altra parentesi corrispondente.
+
+---> Questa ( una linea di test con (, [ ] e { } al suo interno. ))
+
+
+NOTA: Questo molto utile nel "debug" di un programma con parentesi errate!
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4.4: L'OPERATORE SOSTITUZIONE (SUBSTITUTE)
+
+ ** Batti :s/vecchio/nuovo/g per sostituire 'nuovo' a 'vecchio'. **
+
+ 1. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+
+ 2. Batti :s/lla/la <INVIO> . Nota che questo comando cambia solo
+ LA PRIMA occorrenza di "lla" sulla linea.
+
+ 3. Adesso batti :s/lla/la/g . Aggiungendo la flag g si chiede di
+ sostituire "globalmente" sulla linea, ossia tutte le occorrenze
+ di "lla" sulla linea.
+
+---> lla stagione migliore per lla fioritura lla primavera.
+
+ 4. Per cambiare ogni ricorrenza di una stringa di caratteri tra due linee,
+ batti :#,#s/vecchio/nuovo/g dove #,# sono i numeri che delimitano
+ il gruppo di linee in cui si vuole sostituire.
+ Batti :%s/vecchio/nuovo/g per cambiare ogni occorrenza nell'intero file.
+ Batti :%s/vecchio/nuovo/gc per trovare ogni occorrenza nell'intero file
+ ricevendo per ognuna una richiesta se
+ effettuare o meno la sostituzione.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4 SOMMARIO
+
+
+1. CTRL-G visualizza a che punto sei nel file e la situazione del file.
+ G [G Maiuscolo] ti porta all'ultima linea del file.
+ numero G ti porta alla linea con quel numero.
+ gg ti porta alla prima linea del file.
+
+2. Battendo / seguito da una frase ricerca IN AVANTI quella frase.
+ Battendo ? seguito da una frase ricerca ALL'INDIETRO quella frase.
+ DOPO una ricerca batti n per trovare la prossima occorrenza nella
+ stessa direzione, oppure N per cercare in direzione opposta.
+ CTRL-O ti porta alla posizione precedente, CTRL-I a quella pi nuova.
+
+3. Battendo % mentre il cursore si trova su (,),[,],{, oppure }
+ ti posizioni sulla corrispondente parentesi.
+
+4. Per sostituire "nuovo" al primo "vecchio" in 1 linea batti :s/vecchio/nuovo
+ Per sostituire "nuovo" ad ogni "vecchio" in 1 linea batti :s/vecchio/nuovo/g
+ Per sostituire frasi tra 2 numeri di linea [#] batti :#,#s/vecchio/nuovo/g
+ Per sostituire tutte le occorrenze nel file batti :%s/vecchio/nuovo/g
+ Per chiedere conferma ogni volta aggiungi 'c' :%s/vecchio/nuovo/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5.1: COME ESEGUIRE UN COMANDO ESTERNO
+
+
+ ** Batti :! seguito da un comando esterno per eseguire quel comando. **
+
+ 1. Batti il comando : per posizionare il cursore in fondo allo schermo.
+ Ci ti permette di immettere un comando dalla linea comandi.
+
+ 2. Adesso batti il carattere ! (punto esclamativo). Ci ti permette di
+ eseguire qualsiasi comando esterno si possa eseguire nella "shell".
+
+ 3. Ad esempio batti ls dopo il ! e poi premi <INVIO>. Questo
+ visualizza una lista della tua directory, proprio come se fossi in una
+ "shell". Usa :!dir se ls non funziona. [Unix: ls MS-DOS: dir]
+
+NOTA: E' possibile in questo modo eseguire un comando a piacere, specificando
+ anche dei parametri per i comandi stessi.
+
+NOTA: Tutti i comandi : devono essere terminati premendo <INVIO>
+ Da qui in avanti non lo ripeteremo ogni volta.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5.2: ANCORA SULLA SCRITTURA DEI FILE
+
+
+ ** Per salvare le modifiche apportate a un testo batti :w NOMEFILE. **
+
+ 1. Batti :!dir or :!ls per procurarti una lista della tua directory.
+ Gi sai che devi premere <INVIO> dopo aver scritto il comando.
+
+ 2. Scegli un NOMEFILE che ancora non esista, ad es. TEST .
+
+ 3. Adesso batti: :w TEST (dove TEST il NOMEFILE che hai scelto).
+
+ 4. Questo salva l'intero file ("tutor.it") con il nome di TEST.
+ Per verifica batti ancora :!dir o :!ls per listare la tua directory.
+
+NOTA: Se esci da Vim e riesegui Vim battendo vim TEST , il file aperto
+ sar una copia esatta di "tutor.it" al momento del salvataggio.
+
+ 5. Ora cancella il file battendo (MS-DOS): :!del TEST
+ o (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5.3: SELEZIONARE IL TESTO DA SCRIVERE
+
+ ** Per salvare una porzione di file, batti v movimento :w NOMEFILE **
+
+ 1. Muovi il cursore su questa linea.
+
+ 2. Premi v e muovi il cursore fino alla linea numerata 5., qui sotto.
+ Nota che il testo viene evidenziato.
+
+ 3. Batti il carattere : . In fondo allo schermo apparir :'<,'> .
+
+ 4. Batti w TEST , dove TEST il nome di un file non ancora esistente.
+ Verifica che si veda :'<,'>w TEST prima di dare <INVIO>.
+
+ 5. Vim scriver nel file TEST le linee che hai selezionato. Usa :!dir
+ o :!ls per controllare che esiste. Non cancellarlo ora! Ti servir
+ nella prossima lezione.
+
+NOTA: Battere v inizia una selezione visuale. Puoi muovere il cursore
+ come vuoi, e rendere la selezione pi piccola o pi grande. Poi
+ puoi usare un operatore per agire sul testo selezionato.
+ Ad es., d cancella il testo.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5.4: INSERIRE E RIUNIRE FILE
+
+
+ ** Per inserire il contenuto di un file, batti :r NOMEFILE **
+
+ 1. Posiziona il cursore appena sopra questa riga.
+
+NOTA: Dopo aver eseguito il Passo 2 vedrai il testo della Lezione 5.3.
+ Quindi spostati IN GIU' per tornare ancora a questa Lezione.
+
+ 2. Ora inserisci il tuo file TEST con il comando :r TEST dove TEST
+ il nome che hai usato per creare il file.
+ Il file richiesto inserito sotto la linea in cui si trova il cursore.
+
+ 3. Per verificare che un file stato inserito, torna indietro col cursore
+ e nota che ci sono ora 2 copie della Lezione 5.3, quella originale e
+ quella che viene dal file.
+
+NOTA: Puoi anche leggere l'output prodotto da un comando esterno. Ad es.
+ :r !ls legge l'output del comando ls e lo inserisce sotto la linea
+ in cui si trova il cursore.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5 SOMMARIO
+
+
+ 1. :!comando esegue un comando esterno.
+
+ Alcuni esempi utili sono [in MSDOS]:
+ :!dir - visualizza lista directory
+ :!del NOMEFILE - cancella file NOMEFILE.
+
+ 2. :w NOMEFILE scrive su disco il file che stai editando con nome NOMEFILE.
+
+ 3. v movimento :w NOMEFILE salva le linee selezionate in maniera
+ visuale nel file NOMEFILE.
+
+ 4. :r NOMEFILE legge il file NOMEFILE da disco e lo inserisce nel file
+ che stai modificando, dopo la linea in cui posizionato il cursore.
+
+ 5. :r !dir legge l'output del comando dir e lo inserisce dopo la
+ linea in cui posizionato il cursore.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.1: IL COMANDO OPEN [APRIRE]
+
+
+ ** Batti o per aprire una linea sotto il cursore **
+ ** e passare in Modalit Inserimento. **
+
+ 1. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+
+ 2. Batti la lettera minuscola o per aprire una linea sotto il cursore e
+ passare in Modalit Inserimento.
+
+ 3. Poi inserisci del testo e premi <ESC> per uscire dalla
+ Modalit Inserimento.
+
+---> Dopo battuto o il cursore sulla linea aperta (in Modalit Inserimento).
+
+ 4. Per aprire una linea SOPRA il cursore, batti una O maiuscola, invece
+ che una o minuscola. Prova sulla linea qui sotto.
+---> Apri una linea SOPRA questa battendo O mentre il cursore su questa linea.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.2: IL COMANDO APPEND [AGGIUNGERE]
+
+ ** Batti a per inserire testo DOPO il cursore. **
+
+ 1. Muovi il cursore all'inizio della linea qui sotto, indicata da --->.
+
+ 2. Batti e finch il cursore arriva alla fine di li .
+
+ 3. Batti una a (minuscola) per aggiungere testo DOPO il cursore.
+
+ 4. Completa la parola come mostrato nella linea successiva. Premi <ESC>
+ per uscire dalla Modalit Inserimento.
+
+ 5. Usa e per passare alla successiva parola incompleta e ripeti i passi
+ 3 e 4.
+
+---> Questa li ti permetter di esercit ad aggiungere testo a una linea.
+---> Questa linea ti permetter di esercitarti ad aggiungere testo a una linea.
+
+NOTA: a, i ed A entrano sempre in Modalit Inserimento, la sola differenza
+ dove verranno inseriti i caratteri.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.3: UN ALTRO MODO DI RIMPIAZZARE [REPLACE]
+
+
+ ** Batti una R maiuscola per rimpiazzare pi di un carattere. **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->. Muovi il
+ cursore all'inizio del primo xxx .
+
+ 2. Ora batti R e batti il numero che vedi nella linea seguente, in modo
+ che rimpiazzi l' xxx .
+
+ 3. Premi <ESC> per uscire dalla Modalit Replace. Nota che il resto della
+ linea resta invariato.
+
+ 4. Ripeti i passi in modo da rimpiazzare l'altro xxx .
+
+---> Aggiungendo 123 a xxx si ottiene xxx.
+---> Aggiungendo 123 a 456 si ottiene 579.
+
+NOTA: La Modalit Replace come la Modalit Inserimento, ma ogni carattere
+ che viene battuto ricopre un carattere esistente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.4: COPIA E INCOLLA DEL TESTO
+
+
+ ** usa l'operatore y per copiare del testo e p per incollarlo **
+
+ 1. Vai alla linea indicata da ---> qui sotto, e metti il cursore dopo "a)".
+
+ 2. Entra in Modalit Visuale con v e metti il cursore davanti a "primo".
+
+ 3. Batti y per copiare [yank] il testo evidenziato.
+
+ 4. Muovi il cursore alla fine della linea successiva: j$
+
+ 5. Batti p per incollare [paste] il testo. Poi batti: a secondo <ESC> .
+
+ 6. Usa la Modalit Visuale per selezionare " elemento.", copialo con y ,
+ Vai alla fine della linea successiva con j$ e incolla il testo con p .
+
+---> a) questo il primo elemento.
+ b)
+
+NOTA: Puoi usare y come operatore; yw copia una parola [word].
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.5: SET [IMPOSTA] UN'OPZIONE
+
+ ** Imposta un'opzione per ignorare maiuscole/minuscole **
+ ** durante la ricerca/sostituzione **
+
+ 1. Ricerca 'nota' battendo: /nota <ENTER>
+ Ripeti la ricerca pi volte usando il tasto n
+
+ 2. Imposta l'opzione 'ic' (Ignore Case, [Ignora maiuscolo/minuscolo])
+ battendo: :set ic
+
+ 3. Ora ricerca ancora 'nota' premendo il tasto n
+ Troverai adesso anche Nota e NOTA .
+
+ 4. Imposta le opzioni 'hlsearch' e 'incsearch' :set hls is
+
+ 5. Ora batti ancora il comando di ricerca, e guarda cosa succede: /nota
+
+ 6. Per disabilitare il riconoscimento di maiuscole/minuscole batti: :set noic
+NOTA: Per non evidenziare le occorrenze trovate batti: :nohlsearch
+NOTA: Per ignorare maiuscole/minuscole solo per una ricerca, usa \c
+ nel comando di ricerca: /nota\c <INVIO>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6 SOMMARIO
+
+ 1. Batti o per aggiungere una linea SOTTO il cursore ed entrare in
+ Modalit Inserimento.
+ Batti O per aggiungere una linea SOPRA il cursore.
+
+ 2. Batti a per inserire testo DOPO il cursore.
+ Batti A per inserire testo alla fine della linea.
+
+ 3. Il comando e sposta il cursore alla fine di una parola.
+
+ 4. L'operatore y copia del testo, p incolla del testo.
+
+ 5. Batti R per entrare in Modalit Replace, e ne esci premendo <ESC>.
+
+ 6. Batti ":set xxx" per impostare l'opzione "xxx". Alcun opzioni sono:
+ 'ic' 'ignorecase' ignorare maiuscole/minuscole nella ricerca
+ 'is' 'incsearch' mostra occorrenze parziali durante una ricerca
+ 'hls' 'hlsearch' evidenzia tutte le occorrenze di una ricerca
+ Puoi usare sia il nome completo di un'opzione che quello abbreviato.
+
+ 7. Usa il prefisso "no" per annullare una opzione: :set noic
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 7.1: OTTENERE AIUTO
+
+ ** Usa il sistema di aiuto on-line **
+
+ Vim ha un esauriente sistema di aiuto on-line. Per cominciare, prova una di
+ queste alternative:
+ - premi il tasto <AIUTO> (se ce n' uno)
+ - premi il tasto <F1> (se ce n' uno)
+ - batti :help <INVIO> OPPURE :h <INVIO>
+
+ Leggi il testo nella finestra di aiuto per vedere come funziona l'aiuto.
+ Batti CTRL-W CTRL-W per passare da una finestra all'altra.
+ Batti :q <INVIO> per chiudere la finestra di aiuto.
+
+ Puoi trovare aiuto su quasi tutto, dando un argomento al comando ":help"
+ Prova questi (non dimenticare di premere <INVIO>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 7.2: PREPARARE UNO SCRIPT INIZIALE
+
+ ** Attiva le opzioni Vim **
+
+ Vim ha molte pi opzioni di Vi, ma molte di esse sono predefinite inattive.
+ Per cominciare a usare pi opzioni, devi creare un file "vimrc".
+
+ 1. Comincia a editare il file "vimrc". Questo dipende dal tuo sistema:
+ :e ~/.vimrc per Unix
+ :e ~/_vimrc per MS-Windows
+
+ 2. Ora leggi i contenuti del file "vimrc" distribuito come esempio:
+
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Scrivi il file con:
+ :w
+
+ La prossima volta che apri Vim, sar abilitata la colorazione sintattica.
+ Puoi aggiungere a questo file "vimrc" tutte le tue impostazioni preferite.
+ Per maggiori informazioni batti: :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 7.3: COMPLETAMENTO
+
+
+ ** Completamento linea comandi con CTRL-D e <TAB> **
+
+ 1. Imposta Vim in modalit compatibile: :set nocp
+
+ 2. Guarda i file esistenti nella directory: :!ls o :!dir
+
+ 3. Batti l'inizio di un comando: :e
+
+ 4. Premi CTRL-D e Vim ti mostra una lista di comandi che iniziano per "e".
+
+ 5. Premi <TAB> e Vim completa per te il nome comando come ":edit".
+
+ 6. Ora batti uno spazio e l'inizio del nome di un file esistente: :edit FIL
+
+ 7. Premi <TAB>. Vim completer il nome del file (se il solo possibile).
+
+NOTA: Il completamento disponibile per molti comandi. Prova a battere
+ CTRL-D e <TAB>. Particolarmente utile per :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 7 Sommario
+
+
+ 1. Batti :help o premi <F1> o <Help> per aprire una finestra di aiuto.
+
+ 2. Batti :help comando per avere aiuto su comando .
+
+ 3. Batti CTRL-W CTRL-W per saltare alla prossima finestra.
+
+ 4. Batti :q per chiudere la finestra di aiuto.
+
+ 5. Crea uno script iniziale vimrc contenente le tue impostazioni preferite.
+
+ 6. Mentre batti un comando : , premi CTRL-D per vedere i possibili
+ completamenti. Premi <TAB> per usare il completamento desiderato.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Qui finisce la Guida a Vim. Il suo intento di fornire una breve panoramica
+ dell'Editor Vim, che ti consenta di usare l'Editor abbastanza facilmente.
+ Questa guida largamente incompleta poich Vim ha moltissimi altri comandi.
+ Puoi anche leggere il manuale utente (anche in italiano): ":help user-manual".
+
+ Per ulteriore lettura e studio, raccomandiamo:
+ Vim - Vi Improved - di Steve Oualline Editore: New Riders
+ Il primo libro completamente dedicato a Vim. Utile specie per principianti.
+ Contiene molti esempi e figure.
+ Vedi https://iccf-holland.org/click5.html
+
+ Quest'altro libro pi su Vi che su Vim, ma pure consigliato:
+ Learning the Vi Editor - di Linda Lamb e Arnold Robbins
+ Editore: O'Reilly & Associates Inc.
+ un buon libro per imparare quasi tutto ci che puoi voler fare con Vi.
+ Ne esiste una traduzione italiana, basata su una vecchia edizione.
+
+ Questa guida stata scritta da Michael C. Pierce e Robert K. Ware,
+ Colorado School of Mines, usando idee fornite da Charles Smith,
+ Colorado State University - E-mail: bware@mines.colorado.edu
+ Modificato per Vim da Bram Moolenaar.
+ Segnalare refusi ad Antonio Colombo - E-mail: azc100@gmail.com
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.it.utf-8 b/runtime/tutor/tutor.it.utf-8
new file mode 100644
index 0000000..d1f62e2
--- /dev/null
+++ b/runtime/tutor/tutor.it.utf-8
@@ -0,0 +1,967 @@
+===============================================================================
+= Benvenuto alla G u i d a all'Editor V I M - Versione 1.7 =
+===============================================================================
+
+ Vim è un Editor molto potente ed ha parecchi comandi, troppi per
+ spiegarli tutti in una guida come questa. Questa guida serve a
+ descrivere quei comandi che ti permettono di usare facilmente
+ Vim come Editor di uso generale.
+
+ Il tempo necessario per completare la guida è circa 25-30 minuti,
+ a seconda di quanto tempo dedichi alla sperimentazione.
+
+ ATTENZIONE!
+ I comandi nelle lezioni modificano questo testo. Fai una copia di questo
+ file per esercitarti (se hai usato "vimtutor", stai già usando una copia).
+
+ È importante non scordare che questa guida vuole insegnare tramite
+ l'uso. Questo vuol dire che devi eseguire i comandi per impararli
+ davvero. Se leggi il testo e basta, dimenticherai presto i comandi!
+
+ Adesso, assicurati che il tasto BLOCCA-MAIUSCOLO non sia schiacciato
+ e premi il tasto j tanto da muovere il cursore fino a che la
+ Lezione 1.1 riempia completamente lo schermo.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.1: MOVIMENTI DEL CURSORE
+
+
+ ** Per muovere il cursore, premi i tasti h,j,k,l come indicato. **
+ ^
+ k NOTA: Il tasto h è a sinistra e muove a sinistra.
+ < h l > Il tasto l è a destra e muove a destra.
+ j Il tasto j ricorda una freccia in giù.
+ v
+ 1. Muovi il cursore sullo schermo finché non ti senti a tuo agio.
+
+ 2. Tieni schiacciato il tasto "giù" (j) finché non si ripete il movimento.
+ Adesso sai come arrivare fino alla lezione seguente.
+
+ 3. Usando il tasto "giù" spostati alla Lezione 1.2.
+
+NOTA: Quando non sei sicuro del tasto che hai premuto, premi <ESC> per andare
+ in Modalità Normale [Normal Mode]. Poi ri-immetti il comando che volevi.
+
+NOTA: I tasti con le frecce fanno lo stesso servizio. Ma usando hjkl riesci
+ a muoverti molto più rapidamente, dopo che ci si abitua. Davvero!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.2: USCIRE DA VIM
+
+
+ !! NOTA: Prima di eseguire quanto richiesto, leggi la Lezione per intero!!
+
+ 1. Premi il tasto <ESC> (per assicurarti di essere in Modalità Normale).
+
+ 2. Batti: :q! <INVIO>.
+ Così esci dall'Editor SCARTANDO qualsiasi modifica fatta.
+
+ 3. Quando vedi il PROMPT della Shell, batti il comando con cui sei arrivato
+ qui. Sarebbe: vimtutor <INVIO>
+
+ 4. Se hai memorizzato questi comandi e ti senti pronto, esegui i passi
+ da 1 a 3 per uscire e rientrare nell'Editor.
+
+NOTA: :q! <INVIO> SCARTA qualsiasi modifica fatta. In una delle prossime
+ lezioni imparerai come salvare un file che hai modificato.
+
+ 5. Muovi in giù il cursore per passare alla lezione 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.3: MODIFICA DI TESTI - CANCELLAZIONE
+
+
+ ** Premere x per cancellare il carattere sotto al cursore **
+
+ 1. Muovi il cursore alla linea più sotto, indicata da --->.
+
+ 2. Per correggere errori, muovi il cursore fino a posizionarlo sopra il
+ carattere da cancellare.
+
+ 3. Premi il tasto x per cancellare il carattere sbagliato.
+
+ 4. Ripeti i passi da 2 a 4 finché la frase è corretta.
+
+---> La mmucca saltòò finnoo allaa lunnna.
+
+ 5. Ora che la linea è corretta, vai alla Lezione 1.4
+
+NOTA: Mentre segui questa guida, non cercare di imparare a memoria,
+ ma impara facendo pratica.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.4: MODIFICA DI TESTI - INSERIMENTO
+
+
+ ** Premere i per inserire testo. **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+
+ 2. Per rendere la prima linea uguale alla seconda, muovi il cursore sopra
+ il primo carattere DOPO la posizione in cui il testo va inserito.
+
+ 3. Premi i e batti le aggiunte opportune.
+
+ 4. Quando un errore è corretto, premi <ESC> per tornare in Modalità Normale.
+ Ripeti i passi da 2 a 4 fino a completare la correzione della frase.
+
+---> C'era del tsto mncnt questa .
+---> C'era del testo mancante da questa linea.
+
+ 5. Quando sei a tuo agio nell'inserimento di testo vai alla lezione 1.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.5: MODIFICA DI TESTI - AGGIUNTA
+
+
+ ** Premere A per aggiungere testo a fine linea. **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+ Non importa dove è posizionato il cursore sulla linea stessa.
+
+ 2. Batti A e inserisci le necessarie aggiunte.
+
+ 3. Alla fine della aggiunta premi <ESC> per tornare in modalità Normale.
+
+ 4. Muovi il cursore alla seconda linea indicata ---> e ripeti
+ i passi 2 e 3 per correggere questa frase.
+
+---> C'è del testo che manca da qu
+ C'è del testo che manca da questa linea.
+---> C'è anche del testo che ma
+ C'è anche del testo che manca qui.
+
+ 5. Quando sei a tuo agio nell'aggiunta di testo vai alla lezione 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1.6: MODIFICARE UN FILE
+
+
+ ** Usare :wq per salvare un file e uscire. **
+
+ !! NOTA: Prima di eseguire quanto richiesto, leggi la Lezione per intero!!
+
+ 1. Esci da Vim come hai fatto nella lezione 1.2: :q!
+
+ 2. Quando vedi il PROMPT della Shell, batti il comando: vim tutor <INVIO>
+ 'vim' è il comando per richiamare Vim, 'tutor' è il nome del file che
+ desideri modificare. Usa un file che possa essere modificato.
+
+ 3. Inserisci e cancella testo come hai imparato nelle lezioni precedenti.
+
+ 4. Salva il file ed esci da Vim con: :wq <INVIO>
+
+ 5. Rientra in vimtutor e scendi al sommario che segue.
+
+ 6. Dopo aver letto i passi qui sopra ed averli compresi: eseguili.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 1 SOMMARIO
+
+
+ 1. Il cursore si muove usando i tasti con le frecce o i tasti hjkl.
+ h (sinistra) j (giù) k (su) l (destra)
+
+ 2. Per eseguire Vim dal PROMPT della Shell batti: vim NOMEFILE <INVIO>
+
+ 3. Per uscire da Vim batti: <ESC> :q! <INVIO> per uscire senza salvare.
+ oppure batti: <ESC> :wq <INVIO> per uscire salvando modifiche.
+
+ 4. Per cancellare il carattere sotto al cursore batti: x
+
+ 5. Per inserire testo subito prima del cursore batti:
+ i batti testo inserito <ESC> inserisci prima del cursore
+ A batti testo aggiunto <ESC> aggiungi a fine linea
+
+NOTA: premendo <ESC> ritornerai in Modalità Normale o annullerai
+ un comando errato che puoi aver inserito in parte.
+
+Ora continua con la Lezione 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.1: COMANDI DI CANCELLAZIONE
+
+
+ ** Batti dw per cancellare una parola. **
+
+ 1. Premi <ESC> per accertarti di essere in Modalità Normale.
+
+ 2. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+
+ 3. Muovi il cursore all'inizio di una parola che vuoi cancellare.
+
+ 4. Batti dw per cancellare la parola.
+
+NOTA: La lettera d sarà visibile sull'ultima linea dello schermo mentre la
+ batti. Vim attende che tu batta w . Se vedi una lettera diversa
+ da d hai battuto qualcosa di sbagliato; premi <ESC> e ricomincia.
+
+---> Ci sono le alcune parole gioia che non c'entrano carta in questa frase.
+
+ 5. Ripeti i passi 3 e 4 finché la frase è corretta, poi vai alla Lezione 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.2: ALTRI COMANDI DI CANCELLAZIONE
+
+
+ ** Batti d$ per cancellare fino a fine linea. **
+
+ 1. Premi <ESC> per accertarti di essere in Modalità Normale.
+
+ 2. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+
+ 3. Muovi il cursore alla fine della linea corretta (DOPO il primo . ).
+
+ 4. Batti d$ per cancellare fino a fine linea.
+
+---> Qualcuno ha battuto la fine di questa linea due volte. linea due volte.
+
+
+ 5. Vai alla Lezione 2.3 per capire il funzionamento di questo comando.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.3: OPERATORI E MOVIMENTI
+
+
+ Molti comandi di modifica testi consistono in un operatore e un movimento.
+ Il formato del comando di cancellazione con l'operatore d è il seguente:
+
+ d movimento
+
+ Dove:
+ d - è l'operatore di cancellazione
+ movimento - indica dove l'operatore va applicato (lista qui sotto).
+
+ Breve lista di movimenti:
+ w - fino a inizio della parola seguente, ESCLUSO il suo primo carattere.
+ e - alla fine della parola corrente, COMPRESO il suo ultimo carattere.
+ $ - dal cursore fino a fine linea, COMPRESO l'ultimo carattere della linea.
+
+ Quindi se batti de cancelli dal cursore fino a fine parola.
+
+NOTA: Se batti solo il movimento mentre sei in Modalità Normale, senza
+ nessun operatore, il cursore si muoverà come specificato.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.4: USO DI UN CONTATORE PER UN MOVIMENTO
+
+
+ ** Se batti un numero prima di un movimento, lo ripeti altrettante volte. **
+
+ 1. Muovi il cursore fino all'inizio della linea qui sotto, indicata da --->.
+
+ 2. Batti 2w per spostare il cursore due parole più avanti.
+
+ 3. Batti 3e per spostare il cursore alla fine della terza parola seguente.
+
+ 4. Batti 0 (zero) per posizionarti all'inizio della linea.
+
+ 5. Ripeti i passi 2 e 3 usando numeri differenti.
+
+---> Questa è solo una linea con parole all'interno della quale puoi muoverti.
+
+ 6. Vai alla Lezione 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.5: USO DI UN CONTATORE PER CANCELLARE DI PIU'
+
+
+ ** Se batti un numero prima di un movimento, lo ripeti altrettante volte. **
+
+ Nella combinazione dell'operatore cancella e di un movimento, descritto prima,
+ inserite un contatore prima del movimento per cancellare di più:
+ d numero movimento
+
+ 1. Muovi il cursore alla prima parola MAIUSCOLA nella riga indicata da --->.
+
+ 2. Batti d2w per cancellare le due parole MAIUSCOLE
+
+ 3. Ripeti i passi 1 e 2 con un contatore diverso per cancellare le parole
+ MAIUSCOLE consecutive con un solo comando
+
+---> questa ABC DE linea FGHI JK LMN OP di parole è Q RS TUV ora ripulita.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.6: LAVORARE SU LINEE INTERE
+
+ ** Batti dd per cancellare un'intera linea. **
+
+ Per la frequenza con cui capita di cancellare linee intere, chi ha
+ disegnato Vi ha deciso che sarebbe stato più semplice battere
+ due d consecutive per cancellare una linea.
+
+ 1. Muovi il cursore alla linea 2) nella frase qui sotto.
+ 2. Batti dd per cancellare la linea.
+ 3. Ora spostati alla linea 4).
+ 4. Batti 2dd per cancellare due linee.
+
+---> 1) Le rose sono rosse,
+---> 2) Il fango è divertente,
+---> 3) Le viole sono blu,
+---> 4) Io ho un'automobile,
+---> 5) Gli orologi segnano il tempo,
+---> 6) Lo zucchero è dolce,
+---> 7) E così sei anche tu.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2.7: IL COMANDO UNDO [ANNULLA]
+
+ ** Premi u per annullare gli ultimi comandi eseguiti. **
+ ** Premi U per annullare le modifiche all'ultima linea. **
+
+ 1. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+ e posizionati sul primo errore.
+ 2. Batti x per cancellare il primo carattere sbagliato.
+ 3. Adesso batti u per annullare l'ultimo comando eseguito.
+ 4. Ora invece, correggi tutti gli errori sulla linea usando il comando x .
+ 5. Adesso batti una U Maiuscola per riportare la linea al suo stato originale.
+ 6. Adesso batti u più volte per annullare la U e i comandi precedenti.
+ 7. Adesso batti più volte CTRL-r (tieni il tasto CTRL schiacciato
+ mentre batti r) per rieseguire i comandi (annullare l'annullamento).
+
+---> Correeggi gli errori ssu quuesta linea e riimpiazzali coon "undo".
+
+ 8. Questi comandi sono molto utili. Ora spostati al Sommario della Lezione 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 2 SOMMARIO
+
+
+ 1. Per cancellare dal cursore fino alla parola seguente batti: dw
+ 2. Per cancellare dal cursore fino alla fine della linea batti: d$
+ 3. Per cancellare un'intera linea batti: dd
+ 4. Per eseguire più volte un movimento, mettici davanti un numero: 2w
+ 5. Il formato per un comando di modifica è:
+
+ operatore [numero] movimento
+ dove:
+ operatore - indica il da farsi, ad es. d per [delete] cancellare
+ [numero] - contatore facoltativo di ripetizione del movimento
+ movimento - spostamento nel testo su cui operare, ad es.
+ w [word] parola, $ (fino a fine linea), etc.
+
+ 6. Per andare a inizio linea usate uno zero: 0
+ 7. Per annullare i comandi precedenti, batti: u (u minuscola)
+ Per annullare tutte le modifiche a una linea batti: U (U maiuscola)
+ Per annullare l'annullamento ["redo"] batti: CTRL-r
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3.1: IL COMANDO PUT [METTI, PONI]
+
+
+ ** Batti p per porre [put] testo (cancellato prima) dopo il cursore. **
+
+ 1. Muovi il cursore alla prima linea indicata con ---> qui in basso.
+
+ 2. Batti dd per cancellare la linea e depositarla in un registro di Vim.
+
+ 3. Muovi il cursore fino alla linea c) SOPRA quella dove andrebbe messa
+ la linea appena cancellata.
+
+ 4. Batti p per mettere la linea sotto il cursore.
+
+ 5. Ripeti i passi da 2 a 4 per mettere tutte le linee nel giusto ordine.
+
+---> d) Puoi impararla tu?
+---> b) Le viole sono blu,
+---> c) La saggezza si impara,
+---> a) Le rose sono rosse,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3.2: IL COMANDO REPLACE [RIMPIAZZARE]
+
+
+ ** Batti rx per rimpiazzare il carattere sotto al cursore con x . **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+
+ 2. Muovi il cursore fino a posizionarlo sopra il primo errore.
+
+ 3. Batti r e poi il carattere che dovrebbe stare qui.
+
+ 4. Ripeti i passi 2 e 3 finché la prima linea è uguale alla seconda.
+
+---> Ammattendo quetta lince, qualcuno ho predato alcuni tosti sballiati!
+---> Immettendo questa linea, qualcuno ha premuto alcuni tasti sbagliati!
+
+ 5. Ora passa alla Lezione 3.3.
+
+NOTA: Ricordati che dovresti imparare con la pratica, non solo leggendo.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3.3: L'OPERATORE CHANGE [CAMBIA]
+
+
+ ** Per cambiare fino alla fine di una parola, batti ce . **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+
+ 2. Posiziona il cursore alla u in lubw.
+
+ 3. Batti ce e la parola corretta (in questo caso, batti inea ).
+
+ 4. Premi <ESC> e vai sul prossimo carattere da modificare.
+
+ 5. Ripeti i passi 3 e 4 finché la prima frase è uguale alla seconda.
+
+---> Questa lubw ha alcune pptfd da asdert usgfk l'operatore CHANGE.
+---> Questa linea ha alcune parole da cambiare usando l'operatore CHANGE.
+
+Nota che ce cancella la parola, e ti mette anche in Modalità Inserimento
+ [Insert Mode]
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3.4: ALTRI CAMBIAMENTI USANDO c
+
+** L'operatore c [CHANGE] agisce sugli stessi movimenti di d [DELETE] **
+
+ 1. L'operatore CHANGE si comporta come DELETE. Il formato è:
+
+ c [numero] movimento
+
+ 2. I movimenti sono gli stessi,
+ ad es. w (word, parola), $ (fine linea), etc.
+
+ 3. Muovi il cursore alla prima linea qui sotto, indicata da --->.
+
+ 4. Posiziona il cursore al primo errore.
+
+ 5. Batti c$ e inserisci resto della linea utilizzando come modello la
+ linea seguente, e quando hai finito premi <ESC>
+
+---> La fine di questa linea deve essere aiutata a divenire come la seguente.
+---> La fine di questa linea deve essere corretta usando il comando c$ .
+
+NOTA: Puoi usare il tasto Backspace se devi correggere errori di battitura.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 3 SOMMARIO
+
+
+ 1. Per reinserire del testo appena cancellato, batti p . Questo
+ inserisce [pone] il testo cancellato DOPO il cursore (se era stata tolta
+ una linea intera, questa verrà messa nella linea SOTTO il cursore).
+
+ 2. Per rimpiazzare il carattere sotto il cursore, batti r e poi il
+ carattere che vuoi sostituire.
+
+ 3. L'operatore change ti permette di cambiare dal cursore fino a dove
+ arriva il movimento. Ad es. Batti ce per cambiare dal cursore
+ fino alla fine della parola, c$ per cambiare fino a fine linea.
+
+ 4. Il formato di change è:
+
+ c [numero] movimento
+
+Ora vai alla prossima Lezione.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4.1: POSIZIONAMENTO E SITUAZIONE FILE
+
+ ** Batti CTRL-G per vedere a che punto sei nel file e la situazione **
+ ** del file. Batti G per raggiungere una linea nel file. **
+
+ NOTA: Leggi l'intera Lezione prima di eseguire un qualsiasi passo!!
+
+ 1. Tieni premuto il tasto CTRL e batti g . Ossia batti CTRL-G.
+ Un messaggio apparirà in fondo alla pagina con il NOME FILE e la
+ posizione nel file. Ricordati il numero della linea per il Passo 3.
+
+NOTA: La posizione del cursore si vede nell'angolo in basso a destra dello
+ schermo, se è impostata l'opzione 'ruler' (righello, vedi :help ruler).
+
+ 2. Premi G [G Maiuscolo] per posizionarti in fondo al file.
+ Batti gg per posizionarti in cima al file.
+
+ 3. Batti il numero della linea in cui ti trovavi e poi G . Questo ti
+ riporterà fino alla linea in cui ti trovavi quando avevi battuto CTRL-g.
+
+ 4. Se ti senti sicuro nel farlo, esegui i passi da 1 a 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4.2: IL COMANDO SEARCH [RICERCA]
+
+ ** Batti / seguito da una frase per ricercare quella frase. **
+
+ 1. in Modalità Normale batti il carattere / . Nota che la "/" e il cursore
+ sono visibili in fondo dello schermo come quando si usa il comando : .
+
+ 2. Adesso batti 'errroore' <INVIO>. Questa è la parola che vuoi ricercare.
+
+ 3. Per ricercare ancora la stessa frase, batti soltanto n .
+ Per ricercare la stessa frase in direzione opposta, batti N .
+
+ 4. Per ricercare una frase nella direzione opposta, usa ? al posto di / .
+
+ 5. Per tornare dove eri prima nel file premi CTRL-O (tieni il tasto CTRL
+ schiacciato mentre premi la lettera o). Ripeti CTRL-O per andare ancora
+ indietro. Puoi usare CTRL-I per tornare in avanti.
+
+---> "errroore" non è il modo giusto di digitare errore; errroore è un errore.
+NOTA: Quando la ricerca arriva a fine file, ricomincia dall'inizio del file,
+ a meno che l'opzione 'wrapscan' sia stata disattivata.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4.3: RICERCA DI PARENTESI CORRISPONDENTI
+
+
+ ** Batti % per trovare una ),], o } corrispondente. **
+
+ 1. Posiziona il cursore su una (, [, o { nella linea sotto, indicata da --->.
+
+ 2. Adesso batti il carattere % .
+
+ 3. Il cursore si sposterà sulla parentesi corrispondente.
+
+ 4. Batti % per muovere il cursore all'altra parentesi corrispondente.
+
+---> Questa ( è una linea di test con (, [ ] e { } al suo interno. ))
+
+
+NOTA: Questo è molto utile nel "debug" di un programma con parentesi errate!
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4.4: L'OPERATORE SOSTITUZIONE (SUBSTITUTE)
+
+ ** Batti :s/vecchio/nuovo/g per sostituire 'nuovo' a 'vecchio'. **
+
+ 1. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+
+ 2. Batti :s/lla/la <INVIO> . Nota che questo comando cambia solo
+ LA PRIMA occorrenza di "lla" sulla linea.
+
+ 3. Adesso batti :s/lla/la/g . Aggiungendo la flag g si chiede di
+ sostituire "globalmente" sulla linea, ossia tutte le occorrenze
+ di "lla" sulla linea.
+
+---> lla stagione migliore per lla fioritura è lla primavera.
+
+ 4. Per cambiare ogni ricorrenza di una stringa di caratteri tra due linee,
+ batti :#,#s/vecchio/nuovo/g dove #,# sono i numeri che delimitano
+ il gruppo di linee in cui si vuole sostituire.
+ Batti :%s/vecchio/nuovo/g per cambiare ogni occorrenza nell'intero file.
+ Batti :%s/vecchio/nuovo/gc per trovare ogni occorrenza nell'intero file
+ ricevendo per ognuna una richiesta se
+ effettuare o meno la sostituzione.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 4 SOMMARIO
+
+
+1. CTRL-G visualizza a che punto sei nel file e la situazione del file.
+ G [G Maiuscolo] ti porta all'ultima linea del file.
+ numero G ti porta alla linea con quel numero.
+ gg ti porta alla prima linea del file.
+
+2. Battendo / seguito da una frase ricerca IN AVANTI quella frase.
+ Battendo ? seguito da una frase ricerca ALL'INDIETRO quella frase.
+ DOPO una ricerca batti n per trovare la prossima occorrenza nella
+ stessa direzione, oppure N per cercare in direzione opposta.
+ CTRL-O ti porta alla posizione precedente, CTRL-I a quella più nuova.
+
+3. Battendo % mentre il cursore si trova su (,),[,],{, oppure }
+ ti posizioni sulla corrispondente parentesi.
+
+4. Per sostituire "nuovo" al primo "vecchio" in 1 linea batti :s/vecchio/nuovo
+ Per sostituire "nuovo" ad ogni "vecchio" in 1 linea batti :s/vecchio/nuovo/g
+ Per sostituire frasi tra 2 numeri di linea [#] batti :#,#s/vecchio/nuovo/g
+ Per sostituire tutte le occorrenze nel file batti :%s/vecchio/nuovo/g
+ Per chiedere conferma ogni volta aggiungi 'c' :%s/vecchio/nuovo/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5.1: COME ESEGUIRE UN COMANDO ESTERNO
+
+
+ ** Batti :! seguito da un comando esterno per eseguire quel comando. **
+
+ 1. Batti il comando : per posizionare il cursore in fondo allo schermo.
+ Ciò ti permette di immettere un comando dalla linea comandi.
+
+ 2. Adesso batti il carattere ! (punto esclamativo). Ciò ti permette di
+ eseguire qualsiasi comando esterno si possa eseguire nella "shell".
+
+ 3. Ad esempio batti ls dopo il ! e poi premi <INVIO>. Questo
+ visualizza una lista della tua directory, proprio come se fossi in una
+ "shell". Usa :!dir se ls non funziona. [Unix: ls MS-DOS: dir]
+
+NOTA: È possibile in questo modo eseguire un comando a piacere, specificando
+ anche dei parametri per i comandi stessi.
+
+NOTA: Tutti i comandi : devono essere terminati premendo <INVIO>
+ Da qui in avanti non lo ripeteremo ogni volta.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5.2: ANCORA SULLA SCRITTURA DEI FILE
+
+
+ ** Per salvare le modifiche apportate a un testo batti :w NOMEFILE. **
+
+ 1. Batti :!dir or :!ls per procurarti una lista della tua directory.
+ Già sai che devi premere <INVIO> dopo aver scritto il comando.
+
+ 2. Scegli un NOMEFILE che ancora non esista, ad es. TEST .
+
+ 3. Adesso batti: :w TEST (dove TEST è il NOMEFILE che hai scelto).
+
+ 4. Questo salva l'intero file ("tutor.it") con il nome di TEST.
+ Per verifica batti ancora :!dir o :!ls per listare la tua directory.
+
+NOTA: Se esci da Vim e riesegui Vim battendo vim TEST , il file aperto
+ sarà una copia esatta di "tutor.it" al momento del salvataggio.
+
+ 5. Ora cancella il file battendo (MS-DOS): :!del TEST
+ o (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5.3: SELEZIONARE IL TESTO DA SCRIVERE
+
+ ** Per salvare una porzione di file, batti v movimento :w NOMEFILE **
+
+ 1. Muovi il cursore su questa linea.
+
+ 2. Premi v e muovi il cursore fino alla linea numerata 5., qui sotto.
+ Nota che il testo viene evidenziato.
+
+ 3. Batti il carattere : . In fondo allo schermo apparirà :'<,'> .
+
+ 4. Batti w TEST , dove TEST è il nome di un file non ancora esistente.
+ Verifica che si veda :'<,'>w TEST prima di dare <INVIO>.
+
+ 5. Vim scriverà nel file TEST le linee che hai selezionato. Usa :!dir
+ o :!ls per controllare che esiste. Non cancellarlo ora! Ti servirà
+ nella prossima lezione.
+
+NOTA: Battere v inizia una selezione visuale. Puoi muovere il cursore
+ come vuoi, e rendere la selezione più piccola o più grande. Poi
+ puoi usare un operatore per agire sul testo selezionato.
+ Ad es., d cancella il testo.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5.4: INSERIRE E RIUNIRE FILE
+
+
+ ** Per inserire il contenuto di un file, batti :r NOMEFILE **
+
+ 1. Posiziona il cursore appena sopra questa riga.
+
+NOTA: Dopo aver eseguito il Passo 2 vedrai il testo della Lezione 5.3.
+ Quindi spostati IN GIU' per tornare ancora a questa Lezione.
+
+ 2. Ora inserisci il tuo file TEST con il comando :r TEST dove TEST è
+ il nome che hai usato per creare il file.
+ Il file richiesto è inserito sotto la linea in cui si trova il cursore.
+
+ 3. Per verificare che un file è stato inserito, torna indietro col cursore
+ e nota che ci sono ora 2 copie della Lezione 5.3, quella originale e
+ quella che viene dal file.
+
+NOTA: Puoi anche leggere l'output prodotto da un comando esterno. Ad es.
+ :r !ls legge l'output del comando ls e lo inserisce sotto la linea
+ in cui si trova il cursore.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 5 SOMMARIO
+
+
+ 1. :!comando esegue un comando esterno.
+
+ Alcuni esempi utili sono [in MSDOS]:
+ :!dir - visualizza lista directory
+ :!del NOMEFILE - cancella file NOMEFILE.
+
+ 2. :w NOMEFILE scrive su disco il file che stai editando con nome NOMEFILE.
+
+ 3. v movimento :w NOMEFILE salva le linee selezionate in maniera
+ visuale nel file NOMEFILE.
+
+ 4. :r NOMEFILE legge il file NOMEFILE da disco e lo inserisce nel file
+ che stai modificando, dopo la linea in cui è posizionato il cursore.
+
+ 5. :r !dir legge l'output del comando dir e lo inserisce dopo la
+ linea in cui è posizionato il cursore.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.1: IL COMANDO OPEN [APRIRE]
+
+
+ ** Batti o per aprire una linea sotto il cursore **
+ ** e passare in Modalità Inserimento. **
+
+ 1. Muovi il cursore fino alla linea qui sotto, indicata da --->.
+
+ 2. Batti la lettera minuscola o per aprire una linea sotto il cursore e
+ passare in Modalità Inserimento.
+
+ 3. Poi inserisci del testo e premi <ESC> per uscire dalla
+ Modalità Inserimento.
+
+---> Dopo battuto o il cursore è sulla linea aperta (in Modalità Inserimento).
+
+ 4. Per aprire una linea SOPRA il cursore, batti una O maiuscola, invece
+ che una o minuscola. Prova sulla linea qui sotto.
+---> Apri una linea SOPRA questa battendo O mentre il cursore è su questa linea.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.2: IL COMANDO APPEND [AGGIUNGERE]
+
+ ** Batti a per inserire testo DOPO il cursore. **
+
+ 1. Muovi il cursore all'inizio della linea qui sotto, indicata da --->.
+
+ 2. Batti e finché il cursore arriva alla fine di li .
+
+ 3. Batti una a (minuscola) per aggiungere testo DOPO il cursore.
+
+ 4. Completa la parola come mostrato nella linea successiva. Premi <ESC>
+ per uscire dalla Modalità Inserimento.
+
+ 5. Usa e per passare alla successiva parola incompleta e ripeti i passi
+ 3 e 4.
+
+---> Questa li ti permetterà di esercit ad aggiungere testo a una linea.
+---> Questa linea ti permetterà di esercitarti ad aggiungere testo a una linea.
+
+NOTA: a, i ed A entrano sempre in Modalità Inserimento, la sola differenza
+ è dove verranno inseriti i caratteri.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.3: UN ALTRO MODO DI RIMPIAZZARE [REPLACE]
+
+
+ ** Batti una R maiuscola per rimpiazzare più di un carattere. **
+
+ 1. Muovi il cursore alla prima linea qui sotto, indicata da --->. Muovi il
+ cursore all'inizio del primo xxx .
+
+ 2. Ora batti R e batti il numero che vedi nella linea seguente, in modo
+ che rimpiazzi l' xxx .
+
+ 3. Premi <ESC> per uscire dalla Modalità Replace. Nota che il resto della
+ linea resta invariato.
+
+ 4. Ripeti i passi in modo da rimpiazzare l'altro xxx .
+
+---> Aggiungendo 123 a xxx si ottiene xxx.
+---> Aggiungendo 123 a 456 si ottiene 579.
+
+NOTA: La Modalità Replace è come la Modalità Inserimento, ma ogni carattere
+ che viene battuto ricopre un carattere esistente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.4: COPIA E INCOLLA DEL TESTO
+
+
+ ** usa l'operatore y per copiare del testo e p per incollarlo **
+
+ 1. Vai alla linea indicata da ---> qui sotto, e metti il cursore dopo "a)".
+
+ 2. Entra in Modalità Visuale con v e metti il cursore davanti a "primo".
+
+ 3. Batti y per copiare [yank] il testo evidenziato.
+
+ 4. Muovi il cursore alla fine della linea successiva: j$
+
+ 5. Batti p per incollare [paste] il testo. Poi batti: a secondo <ESC> .
+
+ 6. Usa la Modalità Visuale per selezionare " elemento.", copialo con y ,
+ Vai alla fine della linea successiva con j$ e incolla il testo con p .
+
+---> a) questo è il primo elemento.
+ b)
+
+NOTA: Puoi usare y come operatore; yw copia una parola [word].
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6.5: SET [IMPOSTA] UN'OPZIONE
+
+ ** Imposta un'opzione per ignorare maiuscole/minuscole **
+ ** durante la ricerca/sostituzione **
+
+ 1. Ricerca 'nota' battendo: /nota <ENTER>
+ Ripeti la ricerca più volte usando il tasto n
+
+ 2. Imposta l'opzione 'ic' (Ignore Case, [Ignora maiuscolo/minuscolo])
+ battendo: :set ic
+
+ 3. Ora ricerca ancora 'nota' premendo il tasto n
+ Troverai adesso anche Nota e NOTA .
+
+ 4. Imposta le opzioni 'hlsearch' e 'incsearch' :set hls is
+
+ 5. Ora batti ancora il comando di ricerca, e guarda cosa succede: /nota
+
+ 6. Per disabilitare il riconoscimento di maiuscole/minuscole batti: :set noic
+NOTA: Per non evidenziare le occorrenze trovate batti: :nohlsearch
+NOTA: Per ignorare maiuscole/minuscole solo per una ricerca, usa \c
+ nel comando di ricerca: /nota\c <INVIO>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 6 SOMMARIO
+
+ 1. Batti o per aggiungere una linea SOTTO il cursore ed entrare in
+ Modalità Inserimento.
+ Batti O per aggiungere una linea SOPRA il cursore.
+
+ 2. Batti a per inserire testo DOPO il cursore.
+ Batti A per inserire testo alla fine della linea.
+
+ 3. Il comando e sposta il cursore alla fine di una parola.
+
+ 4. L'operatore y copia del testo, p incolla del testo.
+
+ 5. Batti R per entrare in Modalità Replace, e ne esci premendo <ESC>.
+
+ 6. Batti ":set xxx" per impostare l'opzione "xxx". Alcun opzioni sono:
+ 'ic' 'ignorecase' ignorare maiuscole/minuscole nella ricerca
+ 'is' 'incsearch' mostra occorrenze parziali durante una ricerca
+ 'hls' 'hlsearch' evidenzia tutte le occorrenze di una ricerca
+ Puoi usare sia il nome completo di un'opzione che quello abbreviato.
+
+ 7. Usa il prefisso "no" per annullare una opzione: :set noic
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 7.1: OTTENERE AIUTO
+
+ ** Usa il sistema di aiuto on-line **
+
+ Vim ha un esauriente sistema di aiuto on-line. Per cominciare, prova una di
+ queste alternative:
+ - premi il tasto <AIUTO> (se ce n'è uno)
+ - premi il tasto <F1> (se ce n'è uno)
+ - batti :help <INVIO> OPPURE :h <INVIO>
+
+ Leggi il testo nella finestra di aiuto per vedere come funziona l'aiuto.
+ Batti CTRL-W CTRL-W per passare da una finestra all'altra.
+ Batti :q <INVIO> per chiudere la finestra di aiuto.
+
+ Puoi trovare aiuto su quasi tutto, dando un argomento al comando ":help"
+ Prova questi (non dimenticare di premere <INVIO>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 7.2: PREPARARE UNO SCRIPT INIZIALE
+
+ ** Attiva le opzioni Vim **
+
+ Vim ha molte più opzioni di Vi, ma molte di esse sono predefinite inattive.
+ Per cominciare a usare più opzioni, devi creare un file "vimrc".
+
+ 1. Comincia a editare il file "vimrc". Questo dipende dal tuo sistema:
+ :e ~/.vimrc per Unix
+ :e ~/_vimrc per MS-Windows
+
+ 2. Ora leggi i contenuti del file "vimrc" distribuito come esempio:
+
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Scrivi il file con:
+ :w
+
+ La prossima volta che apri Vim, sarà abilitata la colorazione sintattica.
+ Puoi aggiungere a questo file "vimrc" tutte le tue impostazioni preferite.
+ Per maggiori informazioni batti: :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 7.3: COMPLETAMENTO
+
+
+ ** Completamento linea comandi con CTRL-D e <TAB> **
+
+ 1. Imposta Vim in modalità compatibile: :set nocp
+
+ 2. Guarda i file esistenti nella directory: :!ls o :!dir
+
+ 3. Batti l'inizio di un comando: :e
+
+ 4. Premi CTRL-D e Vim ti mostra una lista di comandi che iniziano per "e".
+
+ 5. Premi <TAB> e Vim completa per te il nome comando come ":edit".
+
+ 6. Ora batti uno spazio e l'inizio del nome di un file esistente: :edit FIL
+
+ 7. Premi <TAB>. Vim completerà il nome del file (se è il solo possibile).
+
+NOTA: Il completamento è disponibile per molti comandi. Prova a battere
+ CTRL-D e <TAB>. Particolarmente utile per :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lezione 7 Sommario
+
+
+ 1. Batti :help o premi <F1> o <Help> per aprire una finestra di aiuto.
+
+ 2. Batti :help comando per avere aiuto su comando .
+
+ 3. Batti CTRL-W CTRL-W per saltare alla prossima finestra.
+
+ 4. Batti :q per chiudere la finestra di aiuto.
+
+ 5. Crea uno script iniziale vimrc contenente le tue impostazioni preferite.
+
+ 6. Mentre batti un comando : , premi CTRL-D per vedere i possibili
+ completamenti. Premi <TAB> per usare il completamento desiderato.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Qui finisce la Guida a Vim. Il suo intento è di fornire una breve panoramica
+ dell'Editor Vim, che ti consenta di usare l'Editor abbastanza facilmente.
+ Questa guida è largamente incompleta poiché Vim ha moltissimi altri comandi.
+ Puoi anche leggere il manuale utente (anche in italiano): ":help user-manual".
+
+ Per ulteriore lettura e studio, raccomandiamo:
+ Vim - Vi Improved - di Steve Oualline Editore: New Riders
+ Il primo libro completamente dedicato a Vim. Utile specie per principianti.
+ Contiene molti esempi e figure.
+ Vedi https://iccf-holland.org/click5.html
+
+ Quest'altro libro è più su Vi che su Vim, ma è pure consigliato:
+ Learning the Vi Editor - di Linda Lamb e Arnold Robbins
+ Editore: O'Reilly & Associates Inc.
+ È un buon libro per imparare quasi tutto ciò che puoi voler fare con Vi.
+ Ne esiste una traduzione italiana, basata su una vecchia edizione.
+
+ Questa guida è stata scritta da Michael C. Pierce e Robert K. Ware,
+ Colorado School of Mines, usando idee fornite da Charles Smith,
+ Colorado State University - E-mail: bware@mines.colorado.edu
+ Modificato per Vim da Bram Moolenaar.
+ Segnalare refusi ad Antonio Colombo - E-mail: azc100@gmail.com
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.ja.euc b/runtime/tutor/tutor.ja.euc
new file mode 100644
index 0000000..92e040d
--- /dev/null
+++ b/runtime/tutor/tutor.ja.euc
@@ -0,0 +1,977 @@
+===============================================================================
+= V I M (塼ȥꥢ) - Version 1.7 =
+===============================================================================
+
+ Vim ϡΥ塼ȥꥢˤ¿Υޥɤ
+ ˶ϤʥǥǤΥ塼ȥꥢϡʤ Vim ǽǥ
+ ȤƻȤʤ褦ˤʤΤ˽ʬʥޥɤˤĤ򤹤褦
+ ˤʤäƤޤ
+
+ 塼ȥꥢλΤɬפʻ֤ϡФޥɤΤˤɤ
+ ֤ȤΤˤޤ褽30ʬǤ
+
+ ATTENTION:
+ ʲѥޥɤˤϤʸϤѹΤ⤢ޤϤ
+ ˥ԡޤ礦("vimtutor"ʤС˥ԡƤޤ)
+
+ Υ塼ȥꥢ뤬ȤȤdzФȤߤˤʤäƤ뤳Ȥ򡢿
+ ƤʤФʤޤؽˤϥޥɤºݤ˻ʤ
+ ʤʤΤǤʸϤɤʤСä˺Ƥޤޤ!
+
+ CapsåƤʤȤǧ塢̤˥å1.1
+ ɽȤޤǡj 򲡤ƥưޤ礦
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 1.1: ΰư
+
+
+ ** ưˤϡͤ h,j,k,l 򲡤ޤ **
+ ^
+ k ҥ: h Ϻ˰ưޤ
+ < h l > l ϱ˰ưޤ
+ j j ϲΤ褦ʥǤ
+ v
+ 1. ư˴ޤǡ꡼ǥưޤ礦
+
+ 2. ؤΥ(j)򲡤ĤŤȡϢ³ưưǤޤ
+ ǼΥå˰ưˡ狼ޤ͡
+
+ 3. ؤΥȤäơå1.2 ˰ưޤ礦
+
+NOTE: 򥿥פƤ뤫Ƚʤʤä顢<ESC>򲡤ƥΡޥ⡼ɤˤ
+ ޤ줫Ϥ褦ȤƤޥɤϤޤ礦
+
+NOTE: 륭ǤưǤޤ hjkl ˰ٴƤޤСϤ뤫
+ ®ư뤳ȤǤǤ礦ޥ!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 1.2: VIM εưȽλ
+
+
+ !! NOTE: ʲΤ륹ƥåפԤˡΥåɤߤޤ礦!!
+
+ 1. <ESC>򲡤ޤ礦(μ¤˥Ρޥ⡼ɤˤ뤿)
+
+ 2. Τ褦˥: :q! <ENTER>
+ ˤԽƤ¸˥ǥλޤ
+
+ 3. Υ塼ȥꥢϤ٤Υޥɤ¹Ԥȡޤ
+ Υޥɤ: vimtutor <ENTER>
+
+ 4. ޤǤΥƥåפФĤʤСƥå 1 3 ޤǤ
+ ݤ˻ơVim 1ٽλƤƤӵưޤ礦
+
+NOTE: :q! <ENTER> Ƥѹ˴ޤåˤѹե
+ ¸ˡˤĤƤٶƤޤ礦
+
+ 5. 1.3ޤǥưޤ礦
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 1.3: ƥԽ -
+
+
+ ** Ρޥ⡼ɤˤƥβʸˤ x 򲡤ޤ **
+
+ 1. ʲ ---> ȼ줿Ԥ˥ưޤ礦
+
+ 2. ְ㤤뤿ˡǽʸޤǥưޤ
+
+ 3. ɬפʸ x 򲡤ƺޤ礦
+
+ 4. ʸʤޤ ƥå 2 4 򷫤֤ޤ礦
+
+---> ĤĤ Ƥ ȤӤϤͤ
+
+ 5. Ԥʤä顢å 1.4 ؿʤߤޤ礦
+
+NOTE: ƤΥå̤ơФ褦ȤΤǤϤʤºݤˤäƤߤޤ礦
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 1.4: ƥԽ -
+
+
+ ** Ρޥ⡼ɤˤƥƥȤˤ i 򲡤ޤ **
+
+ 1. ʲ ---> ȼ줿ǽιԤ˥ưޤ礦
+
+ 2. 1ܤ2ܤƱͤˤ뤿ˡƥȤʤФʤʤ
+ μʸ˥ưޤ
+
+ 3. i 򲡤Ƥ顢ɲäɬפʸ򥿥פޤ礦
+
+ 4. ְ㤤 <ESC> 򲡤ƥޥɥ⡼ɤꡢʸˤʤ
+ ˥ƥå 2 4 򷫤֤ޤ礦
+
+---> ˤ ­ʤ ƥ 롣
+---> ˤ Ĥ ­ʤ ƥ 롣
+
+ 5. ˡ狼äå 1.5 ؿʤߤޤ礦
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 1.5: ƥԽ - ɲ
+
+
+ ** ƥȤɲäˤ A 򲡤ޤ礦 **
+
+ 1. ʲ ---> ȼ줿ǽιԤ˥ưޤ礦
+ 뤬ιԤΤɤʸˤäƤ⤫ޤޤ
+
+ 2. ɲäɬפʾ A 򥿥פޤ礦
+
+ 3. ƥȤɲä顢 <ESC> 򲡤ƥΡޥ⡼ɤޤ礦
+
+ 4. 2ܤ ---> ȼ줿ذưƥå 2 3 򷫤֤ʸˡ
+ ޤ礦
+
+---> ˤϴְäƥȤ
+ ˤϴְäƥȤޤ
+---> ˤְäƥ
+ ˤְäƥȤޤ
+
+ 5. ƥȤɲäڲˤʤäƤå 1.6 ؿʤߤޤ礦
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 1.6: եԽ
+
+ ** ե¸ƽλˤ :wq ȥפޤ **
+
+ !! NOTE: ʲΥƥåפ¹ԤˡޤΤɤǤ!!
+
+ 1. ̤üϤǰʲƤԤäƤǤʤС
+ å 1.2 Ǥä褦 :q! 򥿥פơΥ塼ȥꥢλ
+ ޤ
+
+ 2. ץץȤǤΥޥɤ򥿥פޤ: vim file.txt <ENTER>
+ 'vim' Vim ǥư륳ޥɡ'file.txt' Խե
+ ̾ǤѹǤե̾Ȥޤ礦
+
+ 3. Υådzؤ褦ˡƥȤޤ
+
+ 4. ѹե¸ޤ: :wq <ENTER>
+
+ 5. ƥå 1 vimtutor λ vimtutor ٵưʲ
+ ؿʤߤޤ礦
+
+ 6. ʾΥƥåפɤ򤷤Ǥ¹Ԥޤ礦
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 1
+
+
+ 1. ⤷ hjkl ǰưޤ
+ h () j () k () l ()
+
+ 2. Vim ưˤϥץץȤ vim ե̾ <ENTER> ȥפޤ
+
+ 3. Vim λˤ <ESC> :q! <ENTER> ȥפޤ(ѹ˴)
+ ⤷ <ESC> :wq <ENTER> ȥפޤ(ѹ¸)
+
+ 4. βʸˤϡΡޥ⡼ɤ x ȥפޤ
+
+ 5. ΰ֤ʸˤϡΡޥ⡼ɤ i ȥפޤ
+ i ƥȤΥ <ESC> ֤ɲ
+ A ƥȤɲ <ESC> ɲ
+
+NOTE: <ESC> 򲡤ȥΡޥ⡼ɤ˰ܹԤޤκݡְä
+ ΥޥɤäȤǤޤ
+
+ơ³ƥå 2 Ϥޤ礦
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 2.1: ޥ
+
+
+ ** ñޤǤˤ dw ȥפޤ礦 **
+
+ 1. μ¤˥Ρޥ⡼ɤˤ뤿 <ESC> 򲡤ޤ礦
+
+ 2. ʲ ---> ȼ줿Ԥ˥ưޤ礦
+
+ 3. äñƬ˥ưޤ礦
+
+ 4. ñ뤿 dw ȥפޤ礦
+
+ NOTE: d 򥿥פȡʸ꡼κDzԤ˸ޤVim
+ ʤ w 򥿥פΤԤäƤޤ⤷ d ʳʸɽ줿
+ ϲְäƤޤ <ESC> 򲡤Ƥľޤ礦
+
+---> ʸ ˤ Ĥ Τ ɬפΤʤ ñ ޤޤ ޤ
+
+ 5. 3 4 ޤǤʸʤޤǷ֤å 2.2 ؿʤߤޤ礦
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 2.2: ¾κޥ
+
+
+ ** ԤޤǤˤ d$ ȥפޤ礦 **
+
+ 1. μ¤˥Ρޥ⡼ɤˤ뤿 <ESC> 򲡤ޤ礦
+
+ 2. ʲ ---> ȼ줿Ԥ˥ưޤ礦
+
+ 3. ʸإưޤ礦(ǽ θǤ)
+
+ 4. ޤǺΤ d$ ȥפޤ礦
+
+---> ïιԤκǸ2٥פޤ 2٥פޤ
+
+
+ 5. ɤȤ򤹤뤿ˡå 2.3 ؿʤߤޤ礦
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 2.3: ڥ졼ȥ⡼
+
+
+ ƥȤѹä¿Υޥɤϥڥ졼ȥ⡼󤫤ʤޤ
+ ޥ d Υڥ졼ϼͤˤʤäƤޤ:
+
+ d ⡼
+
+ 줾:
+ d - ޥɡ
+ ⡼ - ФƯ뤫(ʲ˵󤲤ޤ)
+
+ ⡼ΰ:
+ w - ֤ޤñޤǡ
+ e - ֤ޤޤʤñޤǡ
+ $ - ֤ޤǡ
+
+ Ĥޤ de ȥפȡ֤ñνޤǤޤ
+
+NOTE: ͤϡΡޥ⡼ɤˤƥڥ졼ʤ˥⡼򲡤
+ ߤޤ礦뤬ŪǼ֤˰ưϤǤ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 2.4: ⡼˥ȤѤ
+
+
+ ** Ԥ֤Υ⡼˿ͤ򥿥פޤ **
+
+ 1. ʲ ---> ȼ줿ԤƬ˥ưޤ
+
+ 2. 2w 򥿥פñ2ʬ˰ưޤ
+
+ 3. 3e 򥿥פ3ܤñνü˰ưޤ
+
+ 4. 0 ()򥿥פƹƬ˰ưޤ
+
+ 5. ƥå 2 3 㤦ͤȤäƷ֤ޤ
+
+---> This is just a line with words you can move around in.
+
+ 6. å 2.5 ˿ʤߤޤ礦
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 2.5: ¿뤿˥ȤѤ
+
+
+ ** ڥ졼ȥȤ򥿥פȡʣ󷫤֤ޤ **
+
+ ҤκΥڥ졼ȥ⡼Ȥ߹碌˥Ȥɲä뤳Ȥǡ
+ ¿κԤޤ:
+ d ⡼
+
+ 1. ---> ȼ줿Ԥκǽʸñ˥ưޤ礦
+
+ 2. ʸñ2Ĥ d2w ȥפƺޤ
+
+ 3. Ϣ³ʸñ򡢰ۤʤ륫Ȥꤷ1ĤΥޥɤǺ
+ ƥå 1 2 򷫤֤ޤ
+
+---> ABC DEԤFGHI JK LMN OPñQ RS TUVˤʤä
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 2.6: Ԥ
+
+
+ ** Τˤ dd ȥפޤ **
+
+ Τ٤¿ΤǡViΥǥʡϹԤκ d 2󥿥פ
+ ñʤΤ˷ޤ
+
+ 1. ʲζ2ܤ˥ưޤ
+ 2. dd ȥפƹԤޤ
+ 3. 4ܤ˰ưޤ
+ 4. 2dd ȥפ2Ԥޤ
+
+---> 1) Х֤
+---> 2) ĤޤʤΤϳڤ
+---> 3) ߥĤ
+---> 4) ϼ֤äƤ롢
+---> 5) פ𤲤롢
+---> 6) ϴŤ
+---> 7) ޥʡ
+
+2󥿥פ1ԤФƺѤˡϰʲǽҤ٤륪ڥ졼Ǥưޤ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 2.7: ľޥ
+
+
+ ** ǸΥޥɤäˤ u 򲡤ޤU ϹΤμäǤ **
+
+ 1. ʲ ---> ȼ줿Ԥ˥ưǽδְ㤤˥
+ ưޤ礦
+ 2. x 򥿥פƺǽΤʤʸޤ礦
+ 3. u 򥿥פƺǸ˼¹Ԥޥɤäޤ礦
+ 4. ٤ϡx Ѥƹθƽޤ礦
+ 5. ʸ U 򥿥פơԤ򸵤ξ֤ᤷޤ礦
+ 6. u 򥿥פľ U ޥɤäޤ礦
+ 7. ǤϥޥɤƼ¹ԤΤ CTRL-R (CTRL 򲡤ޤ R Ǥ)
+ פƤߤޤ礦(äμä)
+
+---> ΤιԤΤδְ㤤Ǥνäޤޤ
+
+ 8. ϤȤƤʥޥɤǤå 2 ؿʤߤޤ礦
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 2
+
+
+ 1. ֤鼡ñޤǤˤ dw ȥפޤ
+ 2. ֤ñޤǤˤ de ȥפޤ
+ 3. ֤ԤޤǤˤ d$ ȥפޤ
+ 4. Τˤ dd ȥפޤ
+
+ 5. ⡼򷫤֤ˤϿͤͿޤ: 2w
+ 6. ѹѤ륳ޥɤη
+ ڥ졼 [] ⡼
+ 줾:
+ ڥ졼 - d Dz򤹤뤫
+ [] - Υޥɤ򲿲󷫤֤
+ ⡼ - w (ñ) e (ñ)$ ()ʤɤǡƥȤ
+ ФƯ뤫
+
+ 7. ԤƬ˰ưˤϥѤޤ: 0
+
+ 8. ưä: u (ʸ u)
+ Τѹä: U (ʸ U)
+ äμä: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 3.1: Žդޥ
+
+
+ ** Ǹ˺줿Ԥ򥫡θŽդˤ p 򥿥פޤ **
+
+ 1. ---> ȼ줿ʲκǽιԤ˥ưޤ礦
+
+ 2. dd ȥפƹԤVim Υ쥸˳Ǽޤ礦
+
+ 3. Ԥ褢٤֤ξιԤǤ c) Ԥޤǡư
+ ޤ礦
+
+ 4. Ρޥ⡼ɤ p 򥿥פƳǼԤ򥫡βᤷޤ
+
+ 5. ֤ʤͤ˥ƥå 2 4 򷫤֤ޤ礦
+
+---> d) ؤ֤ȤǤ?
+---> b) ߥĤ
+---> c) ηäȤϳؤ֤Ρ
+---> a) Х֤
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 3.2: ֤ޥ
+
+
+ ** βʸ x ֤ˤ rx 򥿥פޤ **
+
+ 1. ʲ ---> ȼ줿ǽιԤ˥ưޤ礦
+
+ 2. ǽδְ㤤Ƭ˥ưޤ礦
+
+ 3. r ȥפְäƤʸ֤롢ʸ򥿥פޤ礦
+
+ 4. ǽιԤʤޤǥƥå 2 3 򷫤֤ޤ礦
+
+---> ιϤ͡οͤϴĤä򲡤⤷!
+---> ιԤϤˡοͤϴĤְä򲡤ޤ!
+
+ 5. å 3.3 ؿʤߤޤ礦
+
+NOTE: ºݤ˻ޤ礦褷ƳФˤϤʤȡ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 3.3: ѹޥ
+
+
+ ** ñޤǤѹˤ ce ȥפޤ **
+
+ 1. ʲ ---> ȼ줿ǽιԤ˥ưޤ礦
+
+ 2. lubw u ΰ֤˥ưޤ礦
+
+ 3. ce ȥפñ򥿥פޤ礦(ξ 'ine' ȥ)
+
+ 4. <ESC> 򥿥פƤ鼡δְ㤤(ѹ٤ʸƬ)˰ưޤ
+
+ 5. ǽιԤιԤͤˤʤޤǥƥå 3 4 򷫤֤ޤ
+
+---> 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.
+
+ce ñ塢⡼ɤ뤳Ȥդޤ礦
+cc ƱȤΤФƹԤޤ
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 3.4: c Ѥ¾ѹ
+
+
+ ** ѹڥ졼ϡƱͤ˥⡼Ѥޤ **
+
+ 1. ѹڥ졼ϡƱ褦ư򤷤ޤη
+
+ c [] ⡼
+
+ 2. ⡼Ʊǡw ñ졢 $ ϹʤɤȤäΤǤ
+
+ 3. ʲ ---> ȼ줿ǽιԤ˥ưޤ礦
+
+ 4. ǽδְ㤤إưޤ礦
+
+ 5. c$ ȥפƹԤλĤ򣲹ܤͤˤ<ESC> 򲡤ޤ礦
+
+---> 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$ command.
+
+NOTE: δְ㤤ϥХåڡȤäľȤǤޤ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 3
+
+
+ 1. ˺줿ƥȤ֤ˤϡp 򥿥פޤϺ
+ 줿ƥȤ򥫡θޤ(ñ̤Ǻ줿ΤʤС
+ Τ뼡ιԤޤ)
+
+ 2. βʸ֤ˤϡr 򥿥פ塢֤
+ ʸ򥿥פޤ
+
+ 3. ѹޥɤǤϥ֤Υ⡼ǻꤵ뽪üޤǤ
+ 뤳ȤǽǤ㤨 ce ʤХ֤ñνޤǡ
+ c$ ʤйԤνޤǤѹޤ
+
+ 4. ѹޥɤη
+
+ c [] ⡼
+
+Υåؿʤߤޤ礦
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 4.1: ֤ȥեξ
+
+ ** եǤΰ֤ȥեξ֤ɽˤ CTRL-G 򥿥פޤ
+ եΤԤ˰ưˤ G 򥿥פޤ **
+
+ NOTE: ƥåפ¹ԤˡΥåƤܤ̤ޤ礦!!
+
+ 1. CTRL 򲡤ޤ g 򲡤ޤ礦 CTRL-G ȸƤǤޤ
+ ڡΰֲ˥ե̾ȹֹ椬ɽϤǤ ƥå 3Τ
+ ˹ֹФƤޤ礦
+
+NOTE: ̤α˥ΰ֤ɽƤ뤫⤷ޤ󡣤
+ 'ruler' ץ(:help 'ruler' 򻲾)ꤹ뤳Ȥɽޤ
+
+ 2. եκDzԤ˰ư뤿 G 򥿥פޤ礦
+ եƬ˰ưˤ gg ȥפޤ礦
+
+ 3. ۤɤιԤֹ򥿥פ G 򥿥פޤ礦ǽ CTRL-G 򲡤
+ äϤǤ
+
+ 4. Ƥ饹ƥå 1 3 ¹Ԥޤ礦
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 4.2: ޥ
+
+
+ ** 򸡺ˤ / ȡ򥿥פޤ **
+
+ 1. Ρޥ⡼ɤ / Ȥʸ򥿥פޤֲ̰ : ޥɤ
+ Ʊͤ / 뤳Ȥ˵ŤǤ礦
+
+ 2. Ǥϡ'errroor' <ENTER> ȥפޤ礦줬ñǤ
+
+ 3. Ʊ⤦ٸȤ ñ n 򥿥פޤ
+ ˸򸡺Ȥ N 򥿥פޤ
+
+ 4. ˸򸡺ϡ/ ? ޥɤѤޤ
+
+ 5. ξˤ CTRL-O (Ctrl 򲡤³ʤʸ o 򥿥)򥿥פ
+ ޤˤϤ򷫤֤ޤCTRL-I Ǥ
+
+---> "errroor" error ȥڥ뤬㤤ޤ; errroor Ϥ error Ǥ
+NOTE: եνãȡץ 'wrapscan' ꤵƤ
+ ϡեƬ鸡³Ԥޤ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 4.3: б̤򸡺
+
+
+ ** б ),] } 򸡺ˤ % 򥿥פޤ **
+
+ 1. ---> Ǽ줿Ԥ (,[ { Τɤ줫˥ưޤ礦
+
+ 2. % ȥפޤ礦
+
+ 3. б̤˰ưϤǤ
+
+ 4. ǽγ̤˰ưˤ % ȥפޤ礦
+
+ 5. ¾ (,),[,],{ } ǥư% 򤷤Ƥ뤫ǧޤ礦
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+
+NOTE: εǽϳ̤פƤʤץǥХåΤˤȤƤΩ
+ ޤ
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 4.4: ְ㤤ѹˡ
+
+
+ ** 'old' 'new' ִˤ :s/old/new/g ȥפޤ **
+
+ 1. ʲ ---> ȼ줿Ԥ˥ưޤ礦
+
+ 2. :s/thee/the <ENTER> ȥפޤ礦ΥޥɤϤιԤǺǽ˸
+ äΤˤԤ뤳Ȥ˵Ĥޤ礦
+
+ 3. Ǥ :s/thee/the/g ȥפޤ礦ɲä g ե饰ϹΤִ
+ 뤳Ȥ̣ޤѹϤιԤǸĤäƤβսФƹԤ
+ ޤ
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. ʣԤ鸫ĤʸƤβսѹˤ
+ :#,#s/old/new/g #,# ˤ֤ϰϤγϤȽλιֹꤹ롣
+ :%s/old/new/g եΤǸĤΤФѹ롣
+ :%s/old/new/gc եΤǸĤΤФơ11ijǧȤ
+ ѹ롣
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 4
+
+
+ 1. CTRL-G ϥեǤΰ֤ȥեξܺ٤ɽޤ
+ G ϥեκDzԤ˰ưޤ
+ G ϤιԤ˰ưޤ
+ gg ƬԤ˰ưޤ
+
+ 2. / θ˸򥿥פ˸򸡺ޤ
+ ? θ˸򥿥פȸ˸򸡺ޤ
+ θ n ƱμθN ϵθ򤷤ޤ
+ CTRL-O Ͼ˰ܤCTRL-I Ͼ򼡤˰ưޤ
+
+ 3. (,),[,],{, ⤷ } ˥뤬֤ % 򥿥פФˤʤʸ
+ ذưޤ
+
+ 4. ߹Ԥκǽ old new ִ롣 :s/old/new
+ ߹ԤƤ old new ִ롣 :s/old/new/g
+ 2Ĥ # Ԥδ֤Ǹִ롣 :#,#s/old/new/g
+ եƤθִ롣 :%s/old/new/g
+ 'c' äִ٤˳ǧ롣 :%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 5.1: ޥɤ¹Ԥˡ
+
+
+ ** :! θ˼¹Ԥ볰ޥɤ򥿥פޤ **
+
+ 1. ̤κDz˥뤬ư褦Ƥ : 򥿥פޤ礦
+ ǥޥɥ饤̿᤬פǤͤˤʤޤ
+
+ 2. ! Ȥʸ(ò)򥿥פޤ礦
+ dz륳ޥɤ¹ԤǤͤˤʤޤ
+
+ 3. Ȥ ! ³ ls ȥפ <ENTER> 򲡤ޤ礦
+ ץץȤΤ褦˥ǥ쥯ȥΰɽϤǤ
+ ⤷ ls ưʤʤ :!dir Ѥޤ礦
+
+NOTE: ˡˤäƤ륳ޥɤ¹Ԥ뤳ȤǤޤ
+ Ϳޤ
+
+NOTE: Ƥ : ޥɤ <ENTER> 򲡤ƽλʤФʤޤ
+ ʹߤǤϤΤȤ˸ڤޤ
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 5.2: ¾Υեؽ񤭹
+
+
+ ** եѹ¸ˤ :w ե̾ ȥפޤ **
+
+ 1. ǥ쥯ȥΰ뤿 :!dir ⤷ :!ls ȥפޤ礦
+ Τ <ENTER> 򲡤Τϴˤ¸ΤǤ͡
+
+ 2. TEST Τ褦ˡΥǥ쥯ȥ̵ե̾Ӥޤ
+
+ 3. Ǥ :w TEST ȥפޤ礦 (TEST ϡե̾Ǥ)
+
+ 4. ˤեΤ TEST Ȥ̾¸ޤ
+ ⤦ :!dir ⤷ :!ls ȥפƥǥ쥯ȥǧƤߤޤ礦
+
+NOTE: Vim λե̾ TEST ȶ˵ưȡ¸
+ 塼ȥꥢʣǤ夬ϤǤ
+
+ 5. ˡΤ褦˥פƥեäޤ礦(Windows): :!del TEST
+ ⤷(Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 5.3: 򤷤񤭹
+
+
+** եΰ¸ˤϡv ⡼ :w FILENAME 򥿥פޤ **
+
+ 1. ιԤ˥ưޤ
+
+ 2. v 򲡤ʲ5ܤ˥ưޤƥȤĴɽ
+ ܤƲ
+
+ 3. ʸ : 򲡤ȡ̤κDz :'<,'> ޤ
+
+ 4. w TEST (TEST ¸ߤʤե̾)򥿥פޤ
+ <ENTER> 򲡤 :'<,'>w TEST ȤʤäƤ뤳ȤǧƲ
+
+ 5. Vim TEST Ȥե򤵤줿Ԥ񤭹Ǥ礦
+ :!dir ⤷ :!ls Ǥǧޤ
+ ϺʤǤƲΥåǻѤޤ
+
+NOTE: v 򲡤ȡVisual 򤬻ϤޤޤưȤǡϰϤ
+ 礭⾮ǤޤˡϰϤФƥڥ졼Ŭ
+ Ǥޤ㤨 d ϥƥȤޤ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 5.4: եμȹʻ
+
+
+ ** եȤˤ :r ե̾ ȥפޤ **
+
+ 1. 򤳤ιԤΤ˹碌ޤ
+
+NOTE: ƥå 2 μ¹Ը塢å 5.3 ΥƥȤޤ˲äƤ
+ Υå˰ưޤ礦
+
+ 2. Ǥ TEST Ȥե :r TEST Ȥޥɤɤ߹ߤޤ礦
+ Ǥ TEST ϻȤե̾ΤȤǤ
+ ɤ߹ޤ줿եϡԤβˤޤ
+
+ 3. եǧƤߤޤ礦᤹ȡå5.3
+ ꥸʥȥեˤΤ2Ĥ뤳Ȥ狼ޤ
+
+NOTE: ޥɤνϤɤ߹ळȤǤޤ㤨С
+ :r !ls ls ޥɤνϤ򥫡ʲɤ߹ߤޤ
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 5
+
+
+ 1. :!command ˤä ޥɤ¹Ԥ롣
+
+ 褯Ȥ:
+ (Windows) (Unix)
+ :!dir :!ls - ǥ쥯ȥΰ򸫤롣
+ :!del FILENAME :!rm FILENAME - ե롣
+
+ 2. :w ե̾ ˤäƥե̾Ȥե뤬ǥ˽񤭹ޤ롣
+
+ 3. v ⡼ :w FILENAME Ȥȡӥ奢Ԥե¸
+ 롣
+
+ 4. :r ե̾ ˤե̾Ȥե뤬ǥޤ졢
+ ֤β롣
+
+ 5. :r !dir dir ޥɤνϤ򥫡ְʲɤ߹ࡣ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 6.1: ץ󥳥ޥ
+
+
+ ** o 򥿥פȡβιԤ⡼ɤޤ **
+
+ 1. ʲ ---> ȼ줿ǽιԤ˥ưޤ礦
+
+ 2. o (ʸ) 򥿥פơβιԤ򳫤⡼ɤޤ
+
+ 3. Ĥʸ򥿥פƤ顢⡼ɤλ٤ <ESC>
+ פޤ
+
+---> o 򥿥פȥϳԤذư⡼ɤޤ
+
+ 4. ξιԤˤϡʸ o ǤϤʤñʸ O
+ 򥿥פޤιԤǻƤߤޤ礦
+
+---> ιԤξˤϡιԤإ֤ O 򥿥פޤ
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 6.2: ɲåޥ
+
+
+ ** μΰ֤ƥȤɲäˤ a ȥפޤ **
+
+ 1. ---> Ǽ줿ǽιԤذưޤ礦
+
+ 2. e 򲡤 li νüޤǥưޤ
+
+ 3. θ˥ƥȤɲä뤿 a (ʸ) 򥿥פޤ
+
+ 4. βιԤΤ褦ñ˴ޤ⡼ɤȴ٤ <ESC>
+ ޤ
+
+ 5. e ȤäƼԴñذưƥå 3 4 򷫤֤ޤ
+
+---> 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, i A Ʊ⡼ɤذܤޤʸ֤ۤʤ
+ ޤ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 6.3: ¾ִˡ
+
+
+ ** 1ʸʾ֤ˤʸ R ȥפޤ礦 **
+
+ 1. ʲ ---> ȼ줿Ԥ˥ưޤǽ xxx Ƭ˰ư
+ ޤ
+
+ 2. R 򲡤ơ2ܤοͤ򥿥פ뤳Ȥǡxxx ִޤ
+
+ 3. ִ⡼ɤȴˤ <ESC> 򲡤ޤԤλĤ꤬ѹƤʤޤޤ
+ ʤ뤳ȤդƤ
+
+ 4. Ĥä xxx 򥹥ƥåפ򷫤ִ֤ޤ礦
+
+---> Adding 123 to xxx gives you xxx.
+---> Adding 123 to 456 gives you 579.
+
+NOTE: ִ⡼ɤ⡼ɤ˻ƤޤƤΥפ줿ʸϴ¸ʸ
+ ޤ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 6.4: ƥȤΥԡȥڡ
+
+
+ ** ƥȤΥԡˤϥڥ졼 y 򡢥ڡȤˤ p Ȥޤ **
+
+ 1. ---> ȼ줿Ԥذư "a)" θ֤Ƥޤ
+
+ 2. v ǥӥ奢⡼ɤ򳫻Ϥ"first" μޤǥưޤ
+
+ 3. y 򥿥פƶĴɽ줿ƥȤ yank (ԡ)ޤ
+
+ 4. ιԤιޤǥưޤ: j$
+
+ 5. p 򲡤Žդ(put)Ƥ顢򥿥פޤ: a second <ESC>
+
+ 6. ӥ奢⡼ɤ " item." 򤷡y ǥ󥯡ιԤιޤ j$
+ ư p ǥƥȤ򤽤 put ޤ
+
+---> a) this is the first item.
+ b)
+
+ NOTE: y 򥪥ڥ졼ȤƻȤȤǤޤyw ñ1 yank ޤ
+ yy ϹԤ1 yank p ǤιԤ put ޤ
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 6.5: ץ
+
+
+ ** ִκݤʸ/ʸ̵뤹ˤϡץꤷޤ **
+
+ 1. ͤϤ 'ignore' 򸡺ޤ礦: /ignore <ENTER>
+ n 򲡤Ʋ٤򷫤֤ޤ
+
+ 2. ͤϤ 'ic' (Ignore Case ά) ץꤷޤ: :set ic
+
+ 3. Ǥ n ˤäƤ⤦1 'ignore' 򸡺ޤ
+ n 򲡤Ƥ˿󸡺򷫤֤ޤ礦
+
+ 4. 'hlsearch' 'incsearch' ץꤷޤ礦: :set hls is
+
+ 5. ޥɤϤơ뤫Ƥߤޤ礦: /ignore <ENTER>
+
+ 6. ʸʸζ̵̤ˤˤϼͤϤޤ: :set noic
+
+NOTE: ޥåζĴɽˤϼͤϤޤ: :nohlsearch
+NOTE: 1Ĥθޥɤʸʸζ̤᤿ʤС \c
+ Ѥޤ: /ignore\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 6
+
+ 1. o 򥿥פȥβιԤ򳫤ơ⡼ɤˤʤ롣
+ O (ʸ) 򥿥פȥξιԤ⡼ɤˤʤ롣
+
+ 2. ʸμƥȤɲäˤ a ȥפ롣
+ ˥ƥȤˤʸ A 򥿥פ롣
+
+ 3. e ޥɤñνü˥ư롣
+
+ 4. y ڥ졼ϥƥȤ yank (ԡ)p Ϥ put (ڡ)롣
+
+ 5. ʸ R 򥿥פִ⡼ɤꡢ<ESC> 򲡤ȴ롣
+
+ 6. ":set xxx" ȥפȥץ "xxx" ꤵ롣
+ 'ic' 'ignorecase' ʸʸζ̤ʤ
+ 'is' 'incsearch' ե졼ʬޥåƤʬɽ
+ 'hls' 'hlsearch' ޥå뤹٤ƤĴɽ
+ ĹûɤΥץ̾ǤѤǤޤ
+
+ 7. ץ̵ˤˤ "no" Ϳ: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 7.1: 饤إץޥ
+
+
+ ** 饤إפѤޤ礦 **
+
+ Vim ˤϹϤˤ錄륪饤إץƥबޤ
+ إפ򳫻Ϥˤϡ3ĤΤɤ줫1ĤƤߤޤ礦:
+ - إץ <HELP> 򲡤(⤷ʤ)
+ - <F1> 򲡤(⤷ʤ)
+ - :help <ENTER> ȥפ롣
+
+ إץɥΥƥȤɤȡإפưǤޤ
+ CTRL-W CTRL-W ȥפ إץɥإפޤ
+ :q <ENTER> ȥפ إץɥĤޤ
+
+ ":help" ޥɤ˰Ϳ뤳Ȥˤꡢ̾Υإפ򸫤Ĥ뤳
+ ǤޤƤߤޤ礦(<ENTER> 򥿥פ˺ʤ褦):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 7.2: ưץȤκ
+
+ ** Vim ħȯ **
+
+ Vim ˤ Vi ¿ħƧޤƤޤΤۤȤɤϽ֤ˤ
+ ԲĤȤʤäƤޤ¿ħȤϤˤ "vimrc" ե
+ ޤ
+
+ 1. "vimrc" եԽ򳫻Ϥޤϥƥ˰¸ޤ
+ :e ~/.vimrc UNIX
+ :e ~/_vimrc Windows
+
+ 2. ǥץ "vimrc" ɤ߹ߤޤ
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. ʲΤ褦˥եؽ񤭹ߤޤ
+ :w
+
+ Vim ưȡŤʸȤ褦ˤʤǤ礦
+ "vimrc" եءߤɲä뤳ȤǤޤ
+ ¿ξˤ :help vimrc-intro ȥפޤ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 7.3: 䴰
+
+
+ ** CTRL-D <TAB> ǥޥɥ饤䴰 **
+
+ 1. ߴ⡼ɤǤʤȤǧޤ: :set nocp
+
+ 2. ߤΥǥ쥯ȥ˺ߤե :!ls :!dir dzǧޤ
+
+ 3. ޥɤƬ򥿥פޤ: :e
+
+ 4. CTRL-D 򲡤 Vim "e" Ϥޤ륳ޥɤΰɽޤ
+
+ 5. d<TAB> ȥפ Vim ":edit" Ȥޥ̾䴰ޤ
+
+ 6. ˶ȡ¸Υե̾λϤޤäޤ: :edit FIL
+
+ 7. <TAB> 򲡤 Vim ̾䴰ޤ(⤷Ĥ̵ä)
+
+NOTE: 䴰¿Υޥɤưޤ CTRL-D <TAB> ƤߤƤ
+ ä :help κݤΩޤ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ å 7
+
+
+ 1. إץɥ򳫤ˤ :help Ȥ뤫 <F1> ⤷ <HELP> 򲡤
+
+ 2. ޥ(cmd)Υإפ򸡺ˤ :help cmd ȥפ롣
+
+ 3. ̤Υɥإפˤ CTRL-W CTRL-W ȥפ롣
+
+ 4. إץɥĤˤ :q ȥפ롣
+
+ 5. ߤݤĤˤ vimrc ưץȤ롣
+
+ 6. : command Dzǽ䴰򸫤ˤ CTRL-D 򥿥פ롣
+ 䴰Ѥˤ <TAB> 򲡤
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ ˤ Vim Υ塼ȥꥢ򽪤ޤǥñˡ⽼ʬ
+ ȤȤǤ褦ˤȡVim λijǰΤߤ褦Ȥޤ
+ Vim ˤϤ¿ΥޥɤꡢƤ뤳ȤϤǤޤ
+ ʹߤϥ桼ޥ˥奢򻲾Ȥ: ":help user-manual"
+
+ ʸγؽΤˡܤޤ
+ Vim - Vi Improved - by Steve Oualline
+ Ǽ: New Riders
+ ǽܤϴ Vim Τ˽񤫤ޤȤ櫓鿴ԤˤϤǤ
+ ¿ǤǺܤƤޤ
+ URL򻲾ȤƲ https://iccf-holland.org/click5.html
+
+ Vim Vi ˤĤƽ񤫤줿ŤܤǤޤ:
+ Learning the Vi Editor - by Linda Lamb
+ Ǽ: O'Reilly & Associates Inc.
+ Vi ǤꤿȻפȤۤƤΤ뤳ȤǤɽǤ
+ 6ǤǤϡVim ˤĤƤξޤޤƤޤ
+
+ Υ塼ȥꥢ Colorado State University Charles Smith Υǥ
+ ˡColorado School of Mines Michael C. Pierce Robert K. Ware
+ ξ̾ˤäƽ񤫤ޤ E-mail: bware@mines.colorado.edu.
+
+ Modified for Vim by Bram Moolenaar.
+
+ ܸ ٹ <mattn.jp@gmail.com>
+ vim-jp <https://github.com/vim-jp/lang-ja>
+ ƽ ¼ Ϻ <koron.kaoriya@gmail.com>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ vi:set ts=8 sts=4 sw=4 tw=78:
diff --git a/runtime/tutor/tutor.ja.sjis b/runtime/tutor/tutor.ja.sjis
new file mode 100644
index 0000000..ab46380
--- /dev/null
+++ b/runtime/tutor/tutor.ja.sjis
@@ -0,0 +1,977 @@
+===============================================================================
+= V I M { (`[gA) - Version 1.7 =
+===============================================================================
+
+ Vim ́Ã`[gAŐɂ͑̃R}h
+ ɋ͂ȃGfB^[łB̃`[gÁAȂ Vim 𖜔\GfB
+ ^[ƂĎgȂ悤ɂȂ̂ɏ\ȃR}hɂ‚Đ悤
+ ɂȂĂ܂B
+
+ `[gÂɕKvȎԂ́AoR}ĥɂǂꂾ
+ Ԃĝɂ܂A悻30łB
+
+ ATTENTION:
+ ȉ̗KpR}hɂ͂͂̕ύX̂܂BKn߂O
+ ɃRs[쐬܂傤("vimtutor"Ȃ΁AɃRs[Ă܂)B
+
+ ̃`[gAAgƂŊodg݂ɂȂĂ邱ƂAS
+ ĂȂ΂Ȃ܂BwKɂ̓R}hۂɎȂ
+ ȂȂ̂łB͂ǂ񂾂Ȃ΁AƖYĂ܂܂!
+
+ ACapsbNL[ĂȂƂmFAʂɃbX1.1
+ S\Ƃ܂ŁAj L[ăJ[\ړ܂傤B
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 1.1: J[\̈ړ
+
+
+ ** J[\ړɂ́Al h,j,k,l ܂B **
+ ^
+ k qg: h L[͍Ɉړ܂B
+ < h l > l L[͉EɈړ܂B
+ j j L[͉L[̂悤ȃL[łB
+ v
+ 1. ړɊ܂ŁAXN[ŃJ[\ړ܂傤B
+
+ 2. ւ̃L[(j)‚ÂƁAAĈړł܂B
+ Ŏ̃bXɈړ@킩܂ˁB
+
+ 3. ւ̃L[gāAbX1.2 Ɉړ܂傤B
+
+NOTE: ^CvĂ邩ȂȂA<ESC>ăm[}[hɂ
+ ܂Bꂩ͂悤ƂĂR}hē͂܂傤B
+
+NOTE: J[\L[łړł܂B hjkl ɈxĂ܂΁A͂邩
+ ɑړ邱Ƃłł傤B}W!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 1.2: VIM ̋NƏI
+
+
+ !! NOTE: ȉ̂XebvsOɁÃbXǂ݂܂傤!!
+
+ 1. <ESC>L[܂傤B(mɃm[}[hɂ邽)
+
+ 2. ̂悤Ƀ^Cv: :q! <ENTER>
+ ɂҏWeۑɃGfB^I܂B
+
+ 3. ̃`[gAn߂ׂ̃R}hsƁAɖ߂܂B
+ ̃R}h: vimtutor <ENTER>
+
+ 4. ܂ł̃XebvoM‚Ȃ΁AXebv 1 3 ܂ł
+ ۂɎāAVim 1xIĂĂыN܂傤B
+
+NOTE: :q! <ENTER> ͑SĂ̕ύXj܂BbXɂĕύXt@Cɕ
+ @ɂ‚Ă׋Ă܂傤B
+
+ 5. 1.3܂ŃJ[\ړ܂傤B
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 1.3: eLXgҏW - 폜
+
+
+ ** m[}[hɂăJ[\̉̕폜ɂ x ܂B **
+
+ 1. ȉ ---> ƎꂽsɃJ[\ړ܂傤B
+
+ 2. ԈႢC邽߂ɁA폜ŏ̕܂ŃJ[\ړ܂B
+
+ 3. sKvȕ x č폜܂傤B
+
+ 4. Ȃ܂ Xebv 2 4 JԂ܂傤B
+
+---> ‚‚ Ă Ƃт͂˂
+
+ 5. sȂAbX 1.4 ֐i݂܂傤B
+
+NOTE: SẴbXʂāAo悤Ƃ̂ł͂ȂۂɂĂ݂܂傤B
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 1.4: eLXgҏW - }
+
+
+ ** m[}[hɂăeLXg}ɂ i ܂B **
+
+ 1. ȉ ---> Ǝꂽŏ̍sɃJ[\ړ܂傤B
+
+ 2. 1sڂ2sڂƓlɂ邽߂ɁAeLXg}Ȃ΂ȂȂʒu
+ ̎̕ɃJ[\ړ܂B
+
+ 3. i L[ĂAljKvȕ^Cv܂傤B
+
+ 4. ԈႢC <ESC> ăR}h[hɖ߂AɂȂl
+ ɃXebv 2 4 JԂ܂傤B
+
+---> ɂ Ȃ eLXg B
+---> s ɂ ‚ Ȃ eLXg B
+
+ 5. }̕@킩烌bX 1.5 ֐i݂܂傤B
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 1.5: eLXgҏW - lj
+
+
+ ** eLXgljɂ A ܂傤B **
+
+ 1. ȉ ---> Ǝꂽŏ̍sɃJ[\ړ܂傤B
+ J[\̍ŝǂ̕ɂĂ܂܂B
+
+ 2. ljKvȏꏊ A ^Cv܂傤B
+
+ 3. eLXgljIA <ESC> ăm[}[hɖ߂܂傤B
+
+ 4. 2sڂ ---> ƎꂽꏊֈړAXebv 2 3 JԂĕ@
+ C܂傤B
+
+---> ɂ͊ԈeLXg
+ ɂ͊ԈeLXg܂B
+---> ɂԈeLX
+ ɂԈeLXg܂B
+
+ 5. eLXg̒ljyɂȂĂ烌bX 1.6 ֐i݂܂傤B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 1.6: t@C̕ҏW
+
+ ** t@CۑďIɂ :wq ƃ^Cv܂B **
+
+ !! NOTE: ȉ̃XebvsOɁA܂Ŝǂł!!
+
+ 1. ʂ̒[ꍇ͂ňȉ̓esĂBłȂ΁A
+ bX 1.2 ł悤 :q! ^CvāÃ`[gAI
+ ܂B
+
+ 2. VFvvgł̃R}h^Cv܂: vim file.txt <ENTER>
+ 'vim' Vim GfB^NR}hA'file.txt' ͕ҏWt@C
+ ̖OłBύXłt@C̖Og܂傤B
+
+ 3. ÕbXŊw񂾂悤ɁAeLXg}A폜܂B
+
+ 4. ύXt@Cɕۑ܂: :wq <ENTER>
+
+ 5. Xebv 1 vimtutor Iꍇ vimtutor ēxNAȉ
+ v֐i݂܂傤B
+
+ 6. ȏ̃Xebvǂŗłs܂傤B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 1 v
+
+
+ 1. J[\͖L[ hjkl L[ňړ܂B
+ h () j () k () l (E)
+
+ 2. Vim Nɂ̓vvg vim t@C <ENTER> ƃ^Cv܂B
+
+ 3. Vim Iɂ <ESC> :q! <ENTER> ƃ^Cv܂(ύXj)B
+ <ESC> :wq <ENTER> ƃ^Cv܂(ύXۑ)B
+
+ 4. J[\̉̕폜ɂ́Am[}[h x ƃ^Cv܂B
+
+ 5. J[\̈ʒuɕ}ɂ́Am[}[h i ƃ^Cv܂B
+ i eLXg̃^Cv <ESC> J[\ʒuɒlj
+ A eLXg̒lj <ESC> sɒlj
+
+NOTE: <ESC> L[ƃm[}[hɈڍs܂B̍ہAԈ͓r
+ ̃R}hƂł܂B
+
+āAăbX 2 n߂܂傤B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 2.1: 폜R}h
+
+
+ ** P̖܂ł폜ɂ dw ƃ^Cv܂傤B **
+
+ 1. mɃm[}[hɂ邽 <ESC> ܂傤B
+
+ 2. ȉ ---> ƎꂽsɃJ[\ړ܂傤B
+
+ 3. P̐擪ɃJ[\ړ܂傤B
+
+ 4. P폜邽߂ dw ƃ^Cv܂傤B
+
+ NOTE: d ^CvƁA̕XN[̍ʼnsɌ܂BVim
+ Ȃ w ^Cv̂҂Ă܂B d ȊO̕\ꂽ
+ ͉ԈĂ܂B <ESC> Ă蒼܂傤B
+
+---> ɂ ‚ ̂ Kv̂Ȃ P ܂܂ ܂B
+
+ 5. 3 4 ܂ł𕶂Ȃ܂ŌJԂAbX 2.2 ֐i݂܂傤B
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 2.2: ̑̍폜R}h
+
+
+ ** s̖܂ł폜ɂ d$ ƃ^Cv܂傤B **
+
+ 1. mɃm[}[hɂ邽 <ESC> ܂傤B
+
+ 2. ȉ ---> ƎꂽsɃJ[\ړ܂傤B
+
+ 3. ̖փJ[\ړ܂傤(ŏ B ̌ł)B
+
+ 4. s܂ō폜̂ d$ ƃ^Cv܂傤B
+
+---> N̍s̍Ō2x^Cv܂B 2x^Cv܂B
+
+
+ 5. ǂƂ邽߂ɁAbX 2.3 ֐i݂܂傤B
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 2.3: Iy[^ƃ[V
+
+
+ eLXgɕύX鑽̃R}h̓Iy[^ƃ[VȂ܂B
+ 폜R}h d ̃Iy[^͎̗lɂȂĂ܂:
+
+ d [V
+
+ ꂼ:
+ d - 폜R}hB
+ [V - ɑ΂ē邩(ȉɋ܂)B
+
+ [Vꗗ̈ꕔ:
+ w - J[\ʒu󔒂܂ޒP̖܂ŁB
+ e - J[\ʒu󔒂܂܂ȂP̖܂ŁB
+ $ - J[\ʒus܂ŁB
+
+ ‚܂ de ƃ^CvƁAJ[\ʒuP̏I܂ł폜܂B
+
+NOTE: `ĺAm[}[hɂăIy[^ȂɃ[V
+ ݂܂傤BJ[\ړIꗗŎʒuɈړ͂łB
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 2.4: [VɃJEggp
+
+
+ ** sJԂ̃[V̑Oɐl^Cv܂B **
+
+ 1. ȉ ---> Ǝꂽs̐擪ɃJ[\ړ܂B
+
+ 2. 2w ^CvĒP2•Ɉړ܂B
+
+ 3. 3e ^Cv3–ڂ̒P̏I[Ɉړ܂B
+
+ 4. 0 ([)^CvčsɈړ܂B
+
+ 5. Xebv 2 3 ႤlgČJԂ܂B
+
+---> This is just a line with words you can move around in.
+
+ 6. bX 2.5 ɐi݂܂傤B
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 2.5: 葽폜邽߂ɃJEggp
+
+
+ ** Iy[^ƃJEg^CvƁȂ삪JԂ܂B **
+
+ q̍폜̃Iy[^ƃ[V̑gݍ킹ɃJEglj邱ƂŁA
+ 葽̍폜s܂:
+ d l [V
+
+ 1. ---> Ǝꂽs̍ŏ̑啶̒PɃJ[\ړ܂傤B
+
+ 2. 啶̒P2‚ d2w ƃ^Cvč폜܂B
+
+ 3. A啶̒PAقȂJEgw肵1‚̃R}hō폜A
+ Xebv 1 2 JԂ܂B
+
+---> ABC DEsFGHI JK LMN OPPQ RS TUVYɂȂB
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 2.6: s̑
+
+
+ ** sŜ폜ɂ dd ƃ^Cv܂B **
+
+ sŜ폜px̂ŁAVĩfUCi[͍s̍폜 d 2^Cv
+ ȒPȂ̂Ɍ߂܂B
+
+ 1. ȉ̋2sڂɃJ[\ړ܂B
+ 2. dd ƃ^Cvčs폜܂B
+ 3. 4sڂɈړ܂B
+ 4. 2dd ƃ^Cv2s폜܂B
+
+---> 1) o͐ԂA
+---> 2) ‚܂Ȃ̂͊yA
+---> 3) X~͐‚A
+---> 4) ͎ԂĂA
+---> 5) vA
+---> 6) ͊Â
+---> 7) I}Gi[
+
+2^Cv1sɑ΂čp@͈ȉŏqׂIy[^ł삵܂B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 2.7: 蒼R}h
+
+
+ ** Ō̃R}hɂ u ܂BU ͍sŜ̎łB **
+
+ 1. ȉ ---> ƎꂽsɃJ[\ړAŏ̊ԈႢɃJ[\
+ ړ܂傤B
+ 2. x ^Cvčŏ̂Ȃ폜܂傤B
+ 3. Au ^CvčŌɎsR}h܂傤B
+ 4. x́Ax gpčšSďC܂傤B
+ 5. 啶 U ^CvāAs̏Ԃɖ߂܂傤B
+ 6. u ^CvĒO U R}h܂傤B
+ 7. ł̓R}hĎŝ CTRL-R (CTRL ܂ R ł)𐔉
+ ^CvĂ݂܂傤(̎)B
+
+---> ̂̍ŝ̊ԈႢCXAł̏C܂܂B
+
+ 8. ͂ƂĂ֗ȃR}hłBbX 2 v֐i݂܂傤B
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 2 v
+
+
+ 1. J[\ʒu玟̒P܂ł폜ɂ dw ƃ^Cv܂B
+ 2. J[\ʒuP̖܂ł폜ɂ de ƃ^Cv܂B
+ 3. J[\ʒus̖܂ł폜ɂ d$ ƃ^Cv܂B
+ 4. sŜ폜ɂ dd ƃ^Cv܂B
+
+ 5. [VJԂɂ͐lt^܂: 2w
+ 6. ύXɗpR}ȟ`
+ Iy[^ [l] [V
+ ꂼ:
+ Iy[^ - 폜 d ̗ނʼn邩B
+ [l] - ̃R}hJԂB
+ [V - w (P) e (Pꖖ)A$ (s)Ȃǂ̗ނŁAeLXg
+ ɑ΂ē邩B
+
+ 7. s̐擪Ɉړɂ̓[gp܂: 0
+
+ 8. O̓: u ( u)
+ sŜ̕ύX: U (啶 U)
+ ̎: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 3.1: \tR}h
+
+
+ ** Ōɍ폜ꂽsJ[\̌ɓ\tɂ p ^Cv܂B **
+
+ 1. ---> Ǝꂽȉ̍ŏ̍sɃJ[\ړ܂傤B
+
+ 2. dd ƃ^Cvčs폜AVim ̃WX^Ɋi[܂傤B
+
+ 3. 폜s{ׂʒȕ̍sł c) s܂ŁAJ[\ړ
+ ܂傤B
+
+ 4. m[}[h p ^CvĊi[sJ[\̉ɖ߂܂B
+
+ 5. ԂȂlɃXebv 2 4 JԂ܂傤B
+
+---> d) MwԂƂł?
+---> b) X~͐‚A
+---> c) mbƂ͊wԂ́A
+---> a) o͐ԂA
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 3.2: uR}h
+
+
+ ** J[\̉̕ x ɒuɂ rx ^Cv܂B **
+
+ 1. ȉ ---> Ǝꂽŏ̍sɃJ[\ړ܂傤B
+
+ 2. ŏ̊ԈႢ̐擪ɃJ[\ړ܂傤B
+
+ 3. r ƃ^CvAԈĂ镶uA^Cv܂傤B
+
+ 4. ŏ̍sȂ܂ŃXebv 2 3 JԂ܂傤B
+
+---> ̍l͂ˁA̐l͊‚L[!
+---> ̍s͂ɁA̐l͊‚ԈL[܂!
+
+ 5. AbX 3.3 ֐i݂܂傤B
+
+NOTE: ۂɎ܂傤BĊo邾ɂ͂ȂƁB
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 3.3: ύXR}h
+
+
+ ** P̖܂łύXɂ ce ƃ^Cv܂B **
+
+ 1. ȉ ---> Ǝꂽŏ̍sɃJ[\ړ܂傤B
+
+ 2. lubw u ̈ʒuɃJ[\ړ܂傤B
+
+ 3. ce ƃ^CvAP^Cv܂傤(̏ꍇ 'ine' ƃ^Cv)B
+
+ 4. <ESC> ^CvĂ玟̊ԈႢ(ύXׂ̐擪)Ɉړ܂B
+
+ 5. ŏ̍s̍s̗lɂȂ܂ŃXebv 3 4 JԂ܂B
+
+---> 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.
+
+ce ͒P폜A}[hɓ邱Ƃɒӂ܂傤B
+cc ͓ƂsŜɑ΂čs܂B
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 3.4: c gp̑̕ύX
+
+
+ ** ύXIy[^́A폜ƓlɃ[Vgp܂B **
+
+ 1. ύXIy[^́A폜Ɠ悤ȓ܂B̌`
+
+ c [l] [V
+
+ 2. [VŁAw ͒PA $ ͍sȂǂƂ̂łB
+
+ 3. ȉ ---> Ǝꂽŏ̍sɃJ[\ړ܂傤B
+
+ 4. ŏ̊ԈႢփJ[\ړ܂傤B
+
+ 5. c$ ƃ^Cvčs̎cQsڂ̗lɂA<ESC> ܂傤B
+
+---> 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$ command.
+
+NOTE: ^Cv̊ԈႢ̓obNXy[XL[gĒƂł܂B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 3 v
+
+
+ 1. ɍ폜ꂽeLXgĔzuɂ́Ap ^Cv܂B͍폜
+ ꂽeLXgJ[\̌ɑ}܂(sPʂō폜ꂽ̂Ȃ΁AJ[
+ \̂鎟̍sɑ}܂)B
+
+ 2. J[\̉̕uɂ́Ar ^CvAu
+ ^Cv܂B
+
+ 3. ύXR}hł̓J[\ʒũ[VŎw肳I[܂ł
+ X邱Ƃ”\łBႦ ce Ȃ΃J[\ʒuP̏I܂ŁA
+ c$ Ȃ΍s̏I܂łύX܂B
+
+ 4. ύXR}ȟ`
+
+ c [l] [V
+
+ÃbX֐i݂܂傤B
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 4.1: ʒuƃt@C̏
+
+ ** t@Cł̈ʒuƃt@C̏Ԃ\ɂ CTRL-G ^Cv܂B
+ t@ĈsɈړɂ G ^Cv܂B **
+
+ NOTE: XebvsOɁÃbXSĂɖڂʂ܂傤!!
+
+ 1. CTRL ܂ g ܂傤B̑ CTRL-G ƌĂł܂B
+ y[ẄԉɃt@Cƍsԍ\͂łB Xebv 3̂
+ ɍsԍoĂ܂傤B
+
+NOTE: ʂ̉EɃJ[\̈ʒu\Ă邩܂B
+ 'ruler' IvV(:help 'ruler' Q)ݒ肷邱Ƃŕ\܂B
+
+ 2. t@C̍ʼnsɈړ邽߂ G ^Cv܂傤B
+ t@C̐擪Ɉړɂ gg ƃ^Cv܂傤B
+
+ 3. قǂ̍s̔ԍ^Cv G ^Cv܂傤Bŏ CTRL-G s
+ ɖ߂ė͂łB
+
+ 4. MĂXebv 1 3 s܂傤B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 4.2: R}h
+
+
+ ** ɂ / ƁAO^Cv܂B **
+
+ 1. m[}[h / Ƃ^Cv܂Bʈԉ : R}h
+ l / 邱ƂɋCÂł傤B
+
+ 2. ł́A'errroor' <ENTER> ƃ^Cv܂傤BꂪPłB
+
+ 3. xƂ P n ^Cv܂B
+ tɌƂ N ^Cv܂B
+
+ 4. tɌꍇ́A/ ̑ ? R}hgp܂B
+
+ 5. ̏ꏊɖ߂ɂ CTRL-O (Ctrl Ȃ當 o ^Cv)^Cv
+ ܂Bɖ߂ɂ͂JԂ܂BCTRL-I ͑OłB
+
+---> "errroor" error ƃXyႢ܂; errroor ͂ error łB
+NOTE: t@C̏IɒBƁAIvV 'wrapscan' ݒ肳Ă
+ ꍇ́At@C̐擪猟𑱍s܂B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 4.3: Ή銇ʂ
+
+
+ ** Ή ),] } ɂ % ^Cv܂B **
+
+ 1. ---> Ŏꂽs (,[ { ̂ǂꂩɃJ[\ړ܂傤B
+
+ 2. % ƃ^Cv܂傤B
+
+ 3. J[\͑Ή銇ʂɈړ͂łB
+
+ 4. ŏ̊ʂɈړɂ % ƃ^Cv܂傤B
+
+ 5. (,),[,],{ } ŃJ[\ړA% Ă邩mF܂傤B
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+
+NOTE: ̋@\͊ʂvĂȂvOfobÔɂƂĂ𗧂
+ ܂B
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 4.4: ԈႢύX@
+
+
+ ** 'old' 'new' ɒuɂ :s/old/new/g ƃ^Cv܂B **
+
+ 1. ȉ ---> ƎꂽsɃJ[\ړ܂傤B
+
+ 2. :s/thee/the <ENTER> ƃ^Cv܂傤B̃R}h͂̍sōŏɌ
+ ̂ɂs邱ƂɋC‚܂傤B
+
+ 3. ł :s/thee/the/g ƃ^Cv܂傤Blj g tO͍sŜu
+ 邱ƂӖ܂B̕ύX͂̍sŌ‚SẲӏɑ΂čs
+ ܂B
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. s猩‚镶̑SẲӏύXɂ
+ :#,#s/old/new/g #,# ɂ͒u͈͂̊JnƏI̍sԍw肷B
+ :%s/old/new/g t@CŜŌ‚̂ɑ΂ĕύXB
+ :%s/old/new/gc t@CŜŌ‚̂ɑ΂āA11ŠmFƂ
+ ύXB
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 4 v
+
+
+ 1. CTRL-G ̓t@Cł̈ʒuƃt@C̏ڍׂ\܂B
+ G ̓t@C̍ʼnsɈړ܂B
+ l G ͂̍sɈړ܂B
+ gg ͐擪sɈړ܂B
+
+ 2. / ̌Ɍ^CvƑOɌ܂B
+ ? ̌Ɍ^CvƌɌ܂B
+ ̌ n ͓̎̌AN ͋ť܂B
+ CTRL-O ͏ꏊOɈڂACTRL-I ͏ꏊɈړ܂B
+
+ 3. (,),[,],{, } ɃJ[\Ԃ % ^CvƑ΂ɂȂ镶
+ ֈړ܂B
+
+ 4. ݍs̍ŏ old new ɒuB :s/old/new
+ ݍs̑SĂ old new ɒuB :s/old/new/g
+ 2‚ # s̊ԂŌuB :#,#s/old/new/g
+ t@C̒̑SĂ̌uB :%s/old/new/g
+ 'c' ƒu̓xɊmF߂B :%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 5.1: OR}hs@
+
+
+ ** :! ̌ɎsOR}h^Cv܂B **
+
+ 1. ʂ̍ʼnɃJ[\ړ悤Ae : ^Cv܂傤B
+ ŃR}hC߂^CvłlɂȂ܂B
+
+ 2. ! Ƃ(Q)^Cv܂傤B
+ ŊOVFR}hsłlɂȂ܂B
+
+ 3. Ƃ ! ɑ ls ƃ^Cv <ENTER> ܂傤B
+ VFvvĝ悤ɃfBNg̈ꗗ\͂łB
+ ls ȂȂ :!dir gp܂傤B
+
+NOTE: ̕@ɂĂR}hs邱Ƃł܂B
+ ^܂B
+
+NOTE: SĂ : R}h <ENTER> ďIȂ΂Ȃ܂B
+ ȍ~ł͂̂ƂɌy܂B
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 5.2: ̑̃t@C֏
+
+
+ ** t@C֕ύXۑɂ :w t@C ƃ^Cv܂B **
+
+ 1. fBNg̈ꗗ𓾂邽߂ :!dir :!ls ƃ^Cv܂傤B
+ ̂ <ENTER> ̂͊ɂmłˁB
+
+ 2. TEST ̂悤ɁÃfBNgɖt@C‘Iт܂B
+
+ 3. ł :w TEST ƃ^Cv܂傤 (TEST ́AI񂾃t@Cł)B
+
+ 4. ɂt@CŜ TEST ƂOŕۑ܂B
+ x :!dir :!ls ƃ^CvăfBNgmFĂ݂܂傤B
+
+NOTE: Vim IAt@C TEST ƋɋNƁAۑ
+ `[gA̕łオ͂łB
+
+ 5. ɁÂ悤Ƀ^Cvăt@C܂傤(Windows): :!del TEST
+ (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 5.3: I
+
+
+** t@C̈ꕔۑɂ́Av [V :w FILENAME ^Cv܂B **
+
+ 1. ̍sɃJ[\ړ܂B
+
+ 2. v Aȉ̑5ڂɃJ[\ړ܂BeLXg\
+ ɒڂĉB
+
+ 3. : ƁAʂ̍ʼn :'<,'> ܂B
+
+ 4. w TEST (TEST ݂͑Ȃt@C)^Cv܂B
+ <ENTER> O :'<,'>w TEST ƂȂĂ邱ƂmFĉB
+
+ 5. Vim TEST Ƃt@CɑIꂽsނł傤B
+ :!dir :!ls łmF܂B
+ ͍폜ȂłĉB̃bXŎgp܂B
+
+NOTE: v ƁAVisual In܂܂BJ[\𓮂ƂŁAI͈͂
+ 傫ł܂BɁȂI͈͂ɑ΂ăIy[^Kp
+ ł܂BႦ d ̓eLXg폜܂B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 5.4: t@C̎捞ƍ
+
+
+ ** t@C̒g}ɂ :r t@C ƃ^Cv܂B **
+
+ 1. J[\̍ŝɍ킹܂B
+
+NOTE: Xebv 2 ̎sAbX 5.3 ̃eLXg܂BɉĂ
+ ̃bXɈړ܂傤B
+
+ 2. ł TEST Ƃt@C :r TEST ƂR}hœǂݍ݂܂傤B
+ ł TEST ͎gt@C̖ÔƂłB
+ ǂݍ܂ꂽt@ĆAJ[\s̉ɂ܂B
+
+ 3. 荞񂾃t@CmFĂ݂܂傤BJ[\߂ƁAbX5.3
+ IWiƃt@Cɂ̂2‚邱Ƃ킩܂B
+
+NOTE: OR}h̏o͂ǂݍނƂł܂BႦ΁A
+ :r !ls ls R}h̏o͂J[\ȉɓǂݍ݂܂B
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 5 v
+
+
+ 1. :!command ɂ OR}hsB
+
+ 悭g:
+ (Windows) (Unix)
+ :!dir :!ls - fBNg̈ꗗB
+ :!del FILENAME :!rm FILENAME - t@C폜B
+
+ 2. :w t@C ɂăt@CƂt@CfBXNɏ܂B
+
+ 3. v [V :w FILENAME ƂƁArWAIst@Cɕۑ
+ B
+
+ 4. :r t@C ɂt@CƂt@CfBXN荞܂A
+ J[\ʒủɑ}B
+
+ 5. :r !dir dir R}h̏o͂J[\ʒuȉɓǂݍށB
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 6.1: I[vR}h
+
+
+ ** o ^CvƁAJ[\̉̍sJA}[hɓ܂B **
+
+ 1. ȉ ---> Ǝꂽŏ̍sɃJ[\ړ܂傤B
+
+ 2. o () ^CvāAJ[\̉̍sJA}[hɓ܂B
+
+ 3. ‚^CvĂA}[hIׂ <ESC>
+ ^Cv܂B
+
+---> o ^CvƃJ[\͊Jsֈړ}[hɓ܂B
+
+ 4. J[\̏̍sɑ}ɂ́A o ł͂ȂAPɑ啶 O
+ ^Cv܂B̍sŎĂ݂܂傤B
+
+---> ̍s֑̏}ɂ́A̍sփJ[\u O ^Cv܂B
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 6.2: ljR}h
+
+
+ ** J[\̎̈ʒueLXgljɂ a ƃ^Cv܂B **
+
+ 1. J[\ ---> Ŏꂽŏ̍sֈړ܂傤B
+
+ 2. e li ̏I[܂ŃJ[\ړ܂B
+
+ 3. J[\̌ɃeLXglj邽߂ a () ^Cv܂B
+
+ 4. ̉̍ŝ悤ȒPɊ܂B}[h𔲂ׂ <ESC>
+ ܂B
+
+ 5. e gĎ̕sSȒPֈړAXebv 3 4 JԂ܂B
+
+---> 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, i A ͓}[hֈڂ܂A}ʒuقȂ
+ ܂B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 6.3: ̑̒u@
+
+
+ ** 1ȏuɂ͑啶 R ƃ^Cv܂傤B **
+
+ 1. ȉ ---> ƎꂽsɃJ[\ړ܂Bŏ xxx ̐擪Ɉړ
+ ܂B
+
+ 2. R āA2sڂ̐l^Cv邱ƂŁAxxx u܂B
+
+ 3. u[h𔲂ɂ <ESC> ܂Bs̎c肪ύXĂȂ܂܂
+ Ȃ邱ƂɒӂĂB
+
+ 4. c xxx XebvJԂĒu܂傤B
+
+---> Adding 123 to xxx gives you xxx.
+---> Adding 123 to 456 gives you 579.
+
+NOTE: u[h͑}[hɎĂ܂ASẴ^Cvꂽ͊̕
+ 폜܂B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 6.4: eLXg̃Rs[ƃy[Xg
+
+
+ ** eLXg̃Rs[ɂ̓Iy[^ y Ay[Xgɂ p g܂B **
+
+ 1. ---> ƎꂽsֈړAJ[\ "a)" ̌ɒuĂ܂B
+
+ 2. v ŃrWA[hJnA"first" ̎O܂ŃJ[\ړ܂B
+
+ 3. y ^Cvċ\ꂽeLXg yank (Rs[)܂B
+
+ 4. ̍s̍s܂ŃJ[\ړ܂: j$
+
+ 5. p ē\t(put)ĂA^Cv܂: a second <ESC>
+
+ 6. rWA[h " item." IAy ŃNA̍s̍s܂ j$
+ ړA p ŃeLXg put ܂B
+
+---> a) this is the first item.
+ b)
+
+ NOTE: y Iy[^ƂĎgƂł܂Byw ͒P1 yank ܂B
+ yy ͍s1 yank Ap ł̍s put ܂B
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 6.5: IvV̐ݒ
+
+
+ ** u̍ۂɑ啶/𖳎ɂ́AIvVݒ肵܂B **
+
+ 1. ̗lɓ͂ 'ignore' ܂傤: /ignore <ENTER>
+ n ĉxJԂ܂B
+
+ 2. ̗lɓ͂ 'ic' (Ignore Case ̗) IvVݒ肵܂: :set ic
+
+ 3. ł n ɂĂ1x 'ignore' ܂B
+ n Ăɐ񌟍JԂ܂傤B
+
+ 4. 'hlsearch' 'incsearch' IvVݒ肵܂傤: :set hls is
+
+ 5. R}hē͂āAN邩Ă݂܂傤: /ignore <ENTER>
+
+ 6. 啶̋ʂ𖳌ɂɂ͎̗lɓ͂܂: :set noic
+
+NOTE: }b`̋\߂ɂ͎̗lɓ͂܂: :nohlsearch
+NOTE: 1‚̌R}h啶̋ʂ߂Ȃ΁A \c
+ gp܂: /ignore\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 6 v
+
+ 1. o ^CvƃJ[\̉̍sJāAő}[hɂȂB
+ O (啶) ^CvƃJ[\̏̍ső}[hɂȂB
+
+ 2. J[\̎̕eLXgljɂ a ƃ^CvB
+ sɃeLXg}ɂ͑啶 A ^CvB
+
+ 3. e R}h͒P̏I[ɃJ[\ړB
+
+ 4. y Iy[^̓eLXg yank (Rs[)Ap ͂ put (y[Xg)B
+
+ 5. 啶 R ^Cvƒu[hɓA<ESC> ƔB
+
+ 6. ":set xxx" ƃ^CvƃIvV "xxx" ݒ肳B
+ 'ic' 'ignorecase' ɑ啶̋ʂȂ
+ 'is' 'incsearch' t[Yɕ}b`Ă镔\
+ 'hls' 'hlsearch' }b`邷ׂĂ\
+ AZAǂ̃IvVłgpł܂B
+
+ 7. IvV𖳌ɂɂ "no" t^: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 7.1: ICwvR}h
+
+
+ ** ICwvgp܂傤 **
+
+ Vim ɂ͍L͂ɂ킽ICwvVXe܂B
+ wvJnɂ́A3‚̂ǂꂩ1‚Ă݂܂傤:
+ - wvL[ <HELP> (Ȃ)B
+ - <F1> L[(Ȃ)B
+ - :help <ENTER> ƃ^CvB
+
+ wvEBhẼeLXgǂނƁAwv̓삪ł܂B
+ CTRL-W CTRL-W ƃ^Cv wvEBhEփWv܂B
+ :q <ENTER> ƃ^Cv wvEBhE‚܂B
+
+ ":help" R}hɈ^邱ƂɂA薼̃wv‚邱
+ ł܂BĂ݂܂傤(<ENTER> ^CvYȂ悤):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 7.2: NXNvg̍쐬
+
+ ** Vim ̓𔭊 **
+
+ Vim ɂ Vi ̓𓥂܂Ă܂ÂقƂǂ͏Ԃɂ
+ gps‚ƂȂĂ܂B葽̓g͂߂ɂ "vimrc" t@C
+ 쐬܂B
+
+ 1. "vimrc" t@C̕ҏWJn܂B̓VXeɈˑ܂B
+ :e ~/.vimrc UNIX
+ :e ~/_vimrc Windows
+
+ 2. ŃTv "vimrc" ǂݍ݂܂B
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. ȉ̂悤Ƀt@C֏݂܂B
+ :w
+
+ Vim NƁAFÂ\g悤ɂȂł傤B
+ "vimrc" t@CցAD݂̐ݒlj邱Ƃł܂B
+ 葽̏𓾂ɂ :help vimrc-intro ƃ^Cv܂B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 7.3: ⊮
+
+
+ ** CTRL-D <TAB> ŃR}hC⊮ **
+
+ 1. ݊[hłȂƂmF܂: :set nocp
+
+ 2. ݂̃fBNgɍ݂t@C :!ls :!dir ŊmF܂B
+
+ 3. R}h̐擪^Cv܂: :e
+
+ 4. CTRL-D Vim "e" n܂R}ḧꗗ\܂B
+
+ 5. d<TAB> ƃ^Cv Vim ":edit" ƂR}h⊮܂B
+
+ 6. ɋ󔒂ƁÃt@C̎n܂܂: :edit FIL
+
+ 7. <TAB> Vim ͖O⊮܂B(‚ꍇ)
+
+NOTE: ⊮͑̃R}hœ삵܂B CTRL-D <TAB> Ă݂Ă
+ B :help ̍ۂɖ𗧂܂B
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ bX 7 v
+
+
+ 1. wvEBhEJɂ :help Ƃ邩 <F1> <HELP> B
+
+ 2. R}h(cmd)̃wvɂ :help cmd ƃ^CvB
+
+ 3. ʂ̃EBhEփWvɂ CTRL-W CTRL-W ƃ^CvB
+
+ 4. wvEBhE‚ɂ :q ƃ^CvB
+
+ 5. D݂̐ݒۂ‚ɂ vimrc NXNvg쐬B
+
+ 6. : command ʼn”\ȕ⊮ɂ CTRL-D ^CvB
+ ⊮gpɂ <TAB> B
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ ɂ Vim ̃`[gAI܂BGfB^ȒPɁA[
+ gƂł悤ɂƁAVim ̎ŠTO̗v_݂̂`悤Ƃ܂B
+ Vim ɂ͂ɑ̃R}hAőSĂ邱Ƃ͂ł܂B
+ ȍ~̓[U[}jAQƂ: ":help user-manual"
+
+ Ȍ̊wK̂߂ɁA̖{𐄑E܂B
+ Vim - Vi Improved - by Steve Oualline
+ oŎ: New Riders
+ ŏ̖{͊S Vim ̂߂ɏ܂BƂ킯S҂ɂ͂߂łB
+ ̗}łfڂĂ܂B
+ URLQƂĉ https://iccf-holland.org/click5.html
+
+ Vim Vi ɂ‚ďꂽÂ{łE܂:
+ Learning the Vi Editor - by Linda Lamb
+ oŎ: O'Reilly & Associates Inc.
+ Vi ł肽ƎvƂقڑSĂm邱ƂłǏłB
+ 6łł́AVim ɂ‚Ă̏܂܂Ă܂B
+
+ ̃`[gA Colorado State University Charles Smith ̃ACfA
+ ɁAColorado School of Mines Michael C. Pierce Robert K. Ware
+ ɂď܂B E-mail: bware@mines.colorado.edu.
+
+ Modified for Vim by Bram Moolenaar.
+
+ { { ׍O <mattn.jp@gmail.com>
+ vim-jp`[ <https://github.com/vim-jp/lang-ja>
+ ďC Y <koron.kaoriya@gmail.com>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ vi:set ts=8 sts=4 sw=4 tw=78:
diff --git a/runtime/tutor/tutor.ja.utf-8 b/runtime/tutor/tutor.ja.utf-8
new file mode 100644
index 0000000..8eaa72c
--- /dev/null
+++ b/runtime/tutor/tutor.ja.utf-8
@@ -0,0 +1,977 @@
+===============================================================================
+= V I M 教 本 (チュートリアル) へ よ う こ そ - Version 1.7 =
+===============================================================================
+
+ Vim は、このチュートリアルで説明するには多すぎる程のコマンドを備えた非常
+ に強力なエディターです。このチュートリアルは、あなたが Vim を万能エディ
+ ターとして使いこなせるようになるのに十分なコマンドについて説明をするよう
+ になっています。
+
+ チュートリアルを完了するのに必要な時間は、覚えたコマンドを試すのにどれだ
+ け時間を使うのかにもよりますが、およそ30分です。
+
+ ATTENTION:
+ 以下の練習用コマンドにはこの文章を変更するものもあります。練習を始める前
+ にコピーを作成しましょう("vimtutor"したならば、既にコピーされています)。
+
+ このチュートリアルが、使うことで覚えられる仕組みになっていることを、心し
+ ておかなければなりません。正しく学習するにはコマンドを実際に試さなければ
+ ならないのです。文章を読んだだけならば、きっと忘れてしまいます!
+
+ さぁ、Capsロックキーが押されていないことを確認した後、画面にレッスン1.1
+ が全部表示されるところまで、j キーを押してカーソルを移動しましょう。
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 1.1: カーソルの移動
+
+
+ ** カーソルを移動するには、示される様に h,j,k,l を押します。 **
+ ^
+ k ヒント: h キーは左方向に移動します。
+ < h l > l キーは右方向に移動します。
+ j j キーは下矢印キーのようなキーです。
+ v
+ 1. 移動に慣れるまで、スクリーンでカーソル移動させましょう。
+
+ 2. 下へのキー(j)を押しつづけると、連続して移動できます。
+ これで次のレッスンに移動する方法がわかりましたね。
+
+ 3. 下へのキーを使って、レッスン1.2 に移動しましょう。
+
+NOTE: 何をタイプしているか判らなくなったら、<ESC>を押してノーマルモードにし
+ ます。それから入力しようとしていたコマンドを再入力しましょう。
+
+NOTE: カーソルキーでも移動できます。しかし hjkl に一度慣れてしまえば、はるか
+ に速く移動することができるでしょう。いやマジで!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 1.2: VIM の起動と終了
+
+
+ !! NOTE: 以下のあらゆるステップを行う前に、このレッスンを読みましょう!!
+
+ 1. <ESC>キーを押しましょう。(確実にノーマルモードにするため)
+
+ 2. 次のようにタイプ: :q! <ENTER>
+ これにより編集した内容を保存せずにエディタが終了します。
+
+ 3. このチュートリアルを始める為のコマンドを実行すると、ここに戻れます。
+ そのコマンドは: vimtutor <ENTER>
+
+ 4. これまでのステップを覚え自信がついたならば、ステップ 1 から 3 までを実
+ 際に試して、Vim を1度終了してから再び起動しましょう。
+
+NOTE: :q! <ENTER> は全ての変更を破棄します。レッスンにて変更をファイルに保
+ 存する方法についても勉強していきましょう。
+
+ 5. 1.3までカーソルを移動させましょう。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 1.3: テキスト編集 - 削除
+
+
+ ** ノーマルモードにてカーソルの下の文字を削除するには x を押します。 **
+
+ 1. 以下の ---> と示された行にカーソルを移動しましょう。
+
+ 2. 間違いを修正するために、削除する最初の文字までカーソルを移動します。
+
+ 3. 不必要な文字を x を押して削除しましょう。
+
+ 4. 文が正しくなるまで ステップ 2 から 4 を繰り返しましょう。
+
+---> その ううさぎ は つつきき を こええてて とびはねたた
+
+ 5. 行が正しくなったら、レッスン 1.4 へ進みましょう。
+
+NOTE: 全てのレッスンを通じて、覚えようとするのではなく実際にやってみましょう。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 1.4: テキスト編集 - 挿入
+
+
+ ** ノーマルモードにてテキストを挿入するには i を押します。 **
+
+ 1. 以下の ---> と示された最初の行にカーソルを移動しましょう。
+
+ 2. 1行目を2行目と同じ様にするために、テキストを挿入しなければならない位置
+ の次の文字にカーソルを移動します。
+
+ 3. i キーを押してから、追加が必要な文字をタイプしましょう。
+
+ 4. 間違いを修正したら <ESC> を押してコマンドモードに戻り、正しい文になる様
+ にステップ 2 から 4 を繰り返しましょう。
+
+---> この には 足りない テキスト ある。
+---> この 行 には 幾つか 足りない テキスト が ある。
+
+ 5. 挿入の方法がわかったらレッスン 1.5 へ進みましょう。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 1.5: テキスト編集 - 追加
+
+
+ ** テキストを追加するには A を押しましょう。 **
+
+ 1. 以下の ---> と示された最初の行にカーソルを移動しましょう。
+ カーソルがその行のどの文字上にあってもかまいません。
+
+ 2. 追加が必要な場所で A をタイプしましょう。
+
+ 3. テキストを追加し終えたら、 <ESC> を押してノーマルモードに戻りましょう。
+
+ 4. 2行目の ---> と示された場所へ移動し、ステップ 2 から 3 を繰り返して文法
+ を修正しましょう。
+
+---> ここには間違ったテキストがあり
+ ここには間違ったテキストがあります。
+---> ここにも間違ったテキス
+ ここにも間違ったテキストがあります。
+
+ 5. テキストの追加が軽快になってきたらレッスン 1.6 へ進みましょう。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 1.6: ファイルの編集
+
+ ** ファイルを保存して終了するには :wq とタイプします。 **
+
+ !! NOTE: 以下のステップを実行する前に、まず全体を読んでください!!
+
+ 1. 別の端末がある場合はそこで以下の内容を行ってください。そうでなければ、
+ レッスン 1.2 でやったように :q! をタイプして、このチュートリアルを終了
+ します。
+
+ 2. シェルプロンプトでこのコマンドをタイプします: vim file.txt <ENTER>
+ 'vim' が Vim エディタを起動するコマンド、'file.txt' は編集したいファイル
+ の名前です。変更できるファイルの名前を使いましょう。
+
+ 3. 前のレッスンで学んだように、テキストを挿入、削除します。
+
+ 4. 変更をファイルに保存します: :wq <ENTER>
+
+ 5. ステップ 1 で vimtutor を終了した場合は vimtutor を再度起動し、以下の
+ 要約へ進みましょう。
+
+ 6. 以上のステップを読んで理解した上でこれを実行しましょう。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 1 要約
+
+
+ 1. カーソルは矢印キーもしくは hjkl キーで移動します。
+ h (左) j (下) k (上) l (右)
+
+ 2. Vim を起動するにはプロンプトから vim ファイル名 <ENTER> とタイプします。
+
+ 3. Vim を終了するには <ESC> :q! <ENTER> とタイプします(変更を破棄)。
+ もしくは <ESC> :wq <ENTER> とタイプします(変更を保存)。
+
+ 4. カーソルの下の文字を削除するには、ノーマルモードで x とタイプします。
+
+ 5. カーソルの位置に文字を挿入するには、ノーマルモードで i とタイプします。
+ i テキストのタイプ <ESC> カーソル位置に追加
+ A テキストの追加 <ESC> 行末に追加
+
+NOTE: <ESC> キーを押すとノーマルモードに移行します。その際、間違ったり入力途
+ 中のコマンドを取り消すことができます。
+
+さて、続けてレッスン 2 を始めましょう。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 2.1: 削除コマンド
+
+
+ ** 単語の末尾までを削除するには dw とタイプしましょう。 **
+
+ 1. 確実にノーマルモードにするため <ESC> を押しましょう。
+
+ 2. 以下の ---> と示された行にカーソルを移動しましょう。
+
+ 3. 消したい単語の先頭にカーソルを移動しましょう。
+
+ 4. 単語を削除するために dw とタイプしましょう。
+
+ NOTE: d をタイプすると、その文字がスクリーンの最下行に現われます。Vim は
+ あなたが w をタイプするのを待っています。もし d 以外の文字が表示された
+ 時は何か間違っています。 <ESC> を押してやり直しましょう。
+
+---> この 文 紙 には いくつかの たのしい 必要のない 単語 が 含まれて います。
+
+ 5. 3 から 4 までを文が正しくなるまで繰り返し、レッスン 2.2 へ進みましょう。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 2.2: その他の削除コマンド
+
+
+ ** 行の末尾までを削除するには d$ とタイプしましょう。 **
+
+ 1. 確実にノーマルモードにするため <ESC> を押しましょう。
+
+ 2. 以下の ---> と示された行にカーソルを移動しましょう。
+
+ 3. 正しい文の末尾へカーソルを移動しましょう(最初の 。 の後です)。
+
+ 4. 行末まで削除するのに d$ とタイプしましょう。
+
+---> 誰かがこの行の最後を2度タイプしました。 2度タイプしました。
+
+
+ 5. どういうことか理解するために、レッスン 2.3 へ進みましょう。
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 2.3: オペレータとモーション
+
+
+ テキストに変更を加える多くのコマンドはオペレータとモーションからなります。
+ 削除コマンド d のオペレータは次の様になっています:
+
+ d モーション
+
+ それぞれ:
+ d - 削除コマンド。
+ モーション - 何に対して働きかけるか(以下に挙げます)。
+
+ モーション一覧の一部:
+ w - カーソル位置から空白を含む単語の末尾まで。
+ e - カーソル位置から空白を含まない単語の末尾まで。
+ $ - カーソル位置から行末まで。
+
+ つまり de とタイプすると、カーソル位置から単語の終わりまでを削除します。
+
+NOTE: 冒険したい人は、ノーマルモードにてオペレータなしにモーションを押して
+ みましょう。カーソルが目的語一覧で示される位置に移動するはずです。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 2.4: モーションにカウントを使用する
+
+
+ ** 何回も行いたい繰り返しのモーションの前に数値をタイプします。 **
+
+ 1. 以下の ---> と示された行の先頭にカーソルを移動します。
+
+ 2. 2w をタイプして単語2つ分先に移動します。
+
+ 3. 3e をタイプして3つ目の単語の終端に移動します。
+
+ 4. 0 (ゼロ)をタイプして行頭に移動します。
+
+ 5. ステップ 2 と 3 を違う数値を使って繰り返します。
+
+---> This is just a line with words you can move around in.
+
+ 6. レッスン 2.5 に進みましょう。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 2.5: より多くを削除するためにカウントを使用する
+
+
+ ** オペレータとカウントをタイプすると、その操作が複数回繰り返されます。 **
+
+ 既述の削除のオペレータとモーションの組み合わせにカウントを追加することで、
+ より多くの削除が行えます:
+ d 数値 モーション
+
+ 1. ---> と示された行の最初の大文字の単語にカーソルを移動しましょう。
+
+ 2. 大文字の単語2つを d2w とタイプして削除します。
+
+ 3. 連続した大文字の単語を、異なるカウントを指定した1つのコマンドで削除し、
+ ステップ 1 と 2 を繰り返します。
+
+---> このABC DE行のFGHI JK LMN OP単語はQ RS TUV綺麗になった。
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 2.6: 行の操作
+
+
+ ** 行全体を削除するには dd とタイプします。 **
+
+ 行全体を削除する頻度が多いので、Viのデザイナーは行の削除を d の2回タイプと
+ いう簡単なものに決めました。
+
+ 1. 以下の句の2行目にカーソルを移動します。
+ 2. dd とタイプして行を削除します。
+ 3. さらに4行目に移動します。
+ 4. 2dd とタイプして2行を削除します。
+
+---> 1) バラは赤い、
+---> 2) つまらないものは楽しい、
+---> 3) スミレは青い、
+---> 4) 私は車をもっている、
+---> 5) 時計が時刻を告げる、
+---> 6) 砂糖は甘い
+---> 7) オマエモナー
+
+2回タイプで1行に対して作用させる方法は以下で述べるオペレータでも動作します。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 2.7: やり直しコマンド
+
+
+ ** 最後のコマンドを取り消すには u を押します。U は行全体の取り消しです。 **
+
+ 1. 以下の ---> と示された行にカーソルを移動し、最初の間違いにカーソル
+ を移動しましょう。
+ 2. x をタイプして最初のいらない文字を削除しましょう。
+ 3. さぁ、u をタイプして最後に実行したコマンドを取り消しましょう。
+ 4. 今度は、x を使用して行内の誤りを全て修正しましょう。
+ 5. 大文字の U をタイプして、行を元の状態に戻しましょう。
+ 6. u をタイプして直前の U コマンドを取り消しましょう。
+ 7. ではコマンドを再実行するのに CTRL-R (CTRL を押したまま R を打つ)を数回
+ タイプしてみましょう(取り消しの取り消し)。
+
+---> このの行のの間違いを修正々し、後でそれらの修正をを取り消しまますす。
+
+ 8. これはとても便利なコマンドです。さぁレッスン 2 要約へ進みましょう。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 2 要約
+
+
+ 1. カーソル位置から次の単語までを削除するには dw とタイプします。
+ 2. カーソル位置から単語の末尾までを削除するには de とタイプします。
+ 3. カーソル位置から行の末尾までを削除するには d$ とタイプします。
+ 4. 行全体を削除するには dd とタイプします。
+
+ 5. モーションを繰り返すには数値を付与します: 2w
+ 6. 変更に用いるコマンドの形式は
+ オペレータ [数値] モーション
+ それぞれ:
+ オペレータ - 削除 d の類で何をするか。
+ [数値] - そのコマンドを何回繰り返すか。
+ モーション - w (単語)や e (単語末尾)、$ (行末)などの類で、テキストの
+ 何に対して働きかけるか。
+
+ 7. 行の先頭に移動するにはゼロを使用します: 0
+
+ 8. 前回の動作を取り消す: u (小文字 u)
+ 行全体の変更を取り消す: U (大文字 U)
+ 取り消しの取り消し: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 3.1: 貼り付けコマンド
+
+
+ ** 最後に削除された行をカーソルの後に貼り付けるには p をタイプします。 **
+
+ 1. ---> と示された以下の最初の行にカーソルを移動しましょう。
+
+ 2. dd とタイプして行を削除し、Vim のレジスタに格納しましょう。
+
+ 3. 削除した行が本来あるべき位置の上の行である c) 行まで、カーソルを移動させ
+ ましょう。
+
+ 4. ノーマルモードで p をタイプして格納した行をカーソルの下に戻します。
+
+ 5. 順番が正しくなる様にステップ 2 から 4 を繰り返しましょう。
+
+---> d) 貴方も学ぶことができる?
+---> b) スミレは青い、
+---> c) 知恵とは学ぶもの、
+---> a) バラは赤い、
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 3.2: 置き換えコマンド
+
+
+ ** カーソルの下の文字を x に置き換えるには rx をタイプします。 **
+
+ 1. 以下の ---> と示された最初の行にカーソルを移動しましょう。
+
+ 2. 最初の間違いの先頭にカーソルを移動しましょう。
+
+ 3. r とタイプし、間違っている文字を置き換える、正しい文字をタイプしましょう。
+
+ 4. 最初の行が正しくなるまでステップ 2 から 3 を繰り返しましょう。
+
+---> この合を人力した時ね、その人は幾つか問違ったキーを押しもした!
+---> この行を入力した時に、その人は幾つか間違ったキーを押しました!
+
+ 5. さぁ、レッスン 3.3 へ進みましょう。
+
+NOTE: 実際に試しましょう。決して覚えるだけにはしないこと。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 3.3: 変更コマンド
+
+
+ ** 単語の末尾までを変更するには ce とタイプします。 **
+
+ 1. 以下の ---> と示された最初の行にカーソルを移動しましょう。
+
+ 2. lubw の u の位置にカーソルを移動しましょう。
+
+ 3. ce とタイプし、正しい単語をタイプしましょう(この場合 'ine' とタイプ)。
+
+ 4. <ESC> をタイプしてから次の間違い(変更すべき文字の先頭)に移動します。
+
+ 5. 最初の行が次の行の様になるまでステップ 3 と 4 を繰り返します。
+
+---> 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.
+
+ce は単語を削除した後、挿入モードに入ることに注意しましょう。
+cc は同じことを行全体に対して行います。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 3.4: c を使用したその他の変更
+
+
+ ** 変更オペレータは、削除と同じ様にモーションを使用します。 **
+
+ 1. 変更オペレータは、削除と同じような動作をします。その形式は
+
+ c [数値] モーション
+
+ 2. モーションも同じで、w は単語、 $ は行末などといったものです。
+
+ 3. 以下の ---> と示された最初の行にカーソルを移動しましょう。
+
+ 4. 最初の間違いへカーソルを移動しましょう。
+
+ 5. c$ とタイプして行の残りを2行目の様にし、<ESC> を押しましょう。
+
+---> 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$ command.
+
+NOTE: タイプ中の間違いはバックスペースキーを使って直すこともできます。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 3 要約
+
+
+ 1. 既に削除されたテキストを再配置するには、p をタイプします。これは削除さ
+ れたテキストをカーソルの後に挿入します(行単位で削除されたのならば、カー
+ ソルのある次の行に挿入されます)。
+
+ 2. カーソルの下の文字を置き換えるには、r をタイプした後、それを置き換える
+ 文字をタイプします。
+
+ 3. 変更コマンドではカーソル位置から特定のモーションで指定される終端までを変
+ 更することが可能です。例えば ce ならばカーソル位置から単語の終わりまで、
+ c$ ならば行の終わりまでを変更します。
+
+ 4. 変更コマンドの形式は
+
+ c [数値] モーション
+
+さぁ、次のレッスンへ進みましょう。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 4.1: 位置とファイルの情報
+
+ ** ファイル内での位置とファイルの状態を表示するには CTRL-G をタイプします。
+ ファイル内のある行に移動するには G をタイプします。 **
+
+ NOTE: ステップを実行する前に、このレッスン全てに目を通しましょう!!
+
+ 1. CTRL を押したまま g を押しましょう。この操作を CTRL-G と呼んでいます。
+ ページの一番下にファイル名と行番号が表示されるはずです。 ステップ 3のため
+ に行番号を覚えておきましょう。
+
+NOTE: 画面の右下隅にカーソルの位置が表示されているかもしれません。これは
+ 'ruler' オプション(:help 'ruler' を参照)を設定することで表示されます。
+
+ 2. ファイルの最下行に移動するために G をタイプしましょう。
+ ファイルの先頭に移動するには gg とタイプしましょう。
+
+ 3. 先ほどの行の番号をタイプし G をタイプしましょう。最初に CTRL-G を押した行
+ に戻って来るはずです。
+
+ 4. 自信が持てたらステップ 1 から 3 を実行しましょう。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 4.2: 検索コマンド
+
+
+ ** 語句を検索するには / と、前方検索する語句をタイプします。 **
+
+ 1. ノーマルモードで / という文字をタイプします。画面一番下に : コマンドと
+ 同じ様に / が現れることに気づくでしょう。
+
+ 2. では、'errroor' <ENTER> とタイプしましょう。これが検索したい単語です。
+
+ 3. 同じ語句をもう一度検索するときは 単に n をタイプします。
+ 逆方向に語句を検索するときは N をタイプします。
+
+ 4. 逆方向に語句を検索する場合は、/ の代わりに ? コマンドを使用します。
+
+ 5. 元の場所に戻るには CTRL-O (Ctrl を押し続けながら文字 o をタイプ)をタイプし
+ ます。さらに戻るにはこれを繰り返します。CTRL-I は前方向です。
+
+---> "errroor" は error とスペルが違います; errroor はいわゆる error です。
+NOTE: 検索がファイルの終わりに達すると、オプション 'wrapscan' が設定されている
+ 場合は、ファイルの先頭から検索を続行します。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 4.3: 対応する括弧を検索
+
+
+ ** 対応する ),] や } を検索するには % をタイプします。 **
+
+ 1. 下の ---> で示された行で (,[ か { のどれかにカーソルを移動しましょう。
+
+ 2. そこで % とタイプしましょう。
+
+ 3. カーソルは対応する括弧に移動するはずです。
+
+ 4. 最初の括弧に移動するには % とタイプしましょう。
+
+ 5. 他の (,),[,],{ や } でカーソルを移動し、% が何をしているか確認しましょう。
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+
+NOTE: この機能は括弧が一致していないプログラムをデバッグするのにとても役立ち
+ ます。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 4.4: 間違いを変更する方法
+
+
+ ** 'old' を 'new' に置換するには :s/old/new/g とタイプします。 **
+
+ 1. 以下の ---> と示された行にカーソルを移動しましょう。
+
+ 2. :s/thee/the <ENTER> とタイプしましょう。このコマンドはその行で最初に見つ
+ かったものにだけ行われることに気をつけましょう。
+
+ 3. では :s/thee/the/g とタイプしましょう。追加した g フラグは行全体を置換す
+ ることを意味します。この変更はその行で見つかった全ての箇所に対して行われ
+ ます。
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. 複数行から見つかる文字の全ての箇所を変更するには
+ :#,#s/old/new/g #,# には置き換える範囲の開始と終了の行番号を指定する。
+ :%s/old/new/g ファイル全体で見つかるものに対して変更する。
+ :%s/old/new/gc ファイル全体で見つかるものに対して、1つ1つ確認をとりな
+ がら変更する。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 4 要約
+
+
+ 1. CTRL-G はファイルでの位置とファイルの詳細を表示します。
+ G はファイルの最下行に移動します。
+ 数値 G はその行に移動します。
+ gg は先頭行に移動します。
+
+ 2. / の後に語句をタイプすると前方に語句を検索します。
+ ? の後に語句をタイプすると後方に語句を検索します。
+ 検索の後の n は同じ方向の次の検索を、N は逆方向の検索をします。
+ CTRL-O は場所を前に移し、CTRL-I は場所を次に移動します。
+
+ 3. (,),[,],{, もしくは } 上にカーソルがある状態で % をタイプすると対になる文
+ 字へ移動します。
+
+ 4. 現在行の最初の old を new に置換する。 :s/old/new
+ 現在行の全ての old を new に置換する。 :s/old/new/g
+ 2つの # 行の間で語句を置換する。 :#,#s/old/new/g
+ ファイルの中の全ての検索語句を置換する。 :%s/old/new/g
+ 'c' を加えると置換の度に確認を求める。 :%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 5.1: 外部コマンドを実行する方法
+
+
+ ** :! の後に実行する外部コマンドをタイプします。 **
+
+ 1. 画面の最下部にカーソルが移動するよう、慣れ親しんだ : をタイプしましょう。
+ これでコマンドライン命令がタイプできる様になります。
+
+ 2. ここで ! という文字(感嘆符)をタイプしましょう。
+ これで外部シェルコマンドが実行できる様になります。
+
+ 3. 例として ! に続けて ls とタイプし <ENTER> を押しましょう。
+ シェルプロンプトのようにディレクトリの一覧が表示されるはずです。
+ もしくは ls が動かないならば :!dir を使用しましょう。
+
+NOTE: この方法によってあらゆるコマンドが実行することができます。もちろん引数
+ も与えられます。
+
+NOTE: 全ての : コマンドは <ENTER> を押して終了しなければなりません。
+ 以降ではこのことに言及しません。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 5.2: その他のファイルへ書き込み
+
+
+ ** ファイルへ変更を保存するには :w ファイル名 とタイプします。 **
+
+ 1. ディレクトリの一覧を得るために :!dir もしくは :!ls とタイプしましょう。
+ このあと <ENTER> を押すのは既にご存知ですね。
+
+ 2. TEST のように、そのディレクトリに無いファイル名を一つ選びます。
+
+ 3. では :w TEST とタイプしましょう (TEST は、選んだファイル名です)。
+
+ 4. これによりファイル全体が TEST という名前で保存されます。
+ もう一度 :!dir もしくは :!ls とタイプしてディレクトリを確認してみましょう。
+
+NOTE: ここで Vim を終了し、ファイル名 TEST と共に起動すると、保存した時の
+ チュートリアルの複製ができ上がるはずです。
+
+ 5. さらに、次のようにタイプしてファイルを消しましょう(Windows): :!del TEST
+ もしくは(Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 5.3: 選択した書き込み
+
+
+** ファイルの一部を保存するには、v モーションと :w FILENAME をタイプします。 **
+
+ 1. この行にカーソルを移動します。
+
+ 2. v を押し、以下の第5項目にカーソルを移動します。テキストが強調表示されるの
+ に注目して下さい。
+
+ 3. 文字 : を押すと、画面の最下部に :'<,'> が現れます。
+
+ 4. w TEST (TEST は存在しないファイル名)をタイプします。
+ <ENTER> を押す前に :'<,'>w TEST となっていることを確認して下さい。
+
+ 5. Vim は TEST というファイルに選択された行を書き込むでしょう。
+ :!dir もしくは :!ls でそれを確認します。
+ それは削除しないでおいて下さい。次のレッスンで使用します。
+
+NOTE: v を押すと、Visual 選択が始まります。カーソルを動かすことで、選択範囲を
+ 大きくも小さくもできます。さらに、その選択範囲に対してオペレータを適用
+ できます。例えば d はテキストを削除します。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 5.4: ファイルの取込と合併
+
+
+ ** ファイルの中身を挿入するには :r ファイル名 とタイプします。 **
+
+ 1. カーソルをこの行のすぐ上に合わせます。
+
+NOTE: ステップ 2 の実行後、レッスン 5.3 のテキストが現れます。下に下がってこ
+ のレッスンに移動しましょう。
+
+ 2. では TEST というファイルを :r TEST というコマンドで読み込みましょう。
+ ここでいう TEST は使うファイルの名前のことです。
+ 読み込まれたファイルは、カーソル行の下にあります。
+
+ 3. 取り込んだファイルを確認してみましょう。カーソルを戻すと、レッスン5.3 の
+ オリジナルとファイルによるものの2つがあることがわかります。
+
+NOTE: 外部コマンドの出力を読み込むこともできます。例えば、
+ :r !ls は ls コマンドの出力をカーソル以下に読み込みます。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 5 要約
+
+
+ 1. :!command によって 外部コマンドを実行する。
+
+ よく使う例:
+ (Windows) (Unix)
+ :!dir :!ls - ディレクトリ内の一覧を見る。
+ :!del FILENAME :!rm FILENAME - ファイルを削除する。
+
+ 2. :w ファイル名 によってファイル名というファイルがディスクに書き込まれる。
+
+ 3. v モーションで :w FILENAME とすると、ビジュアル選択行がファイルに保存さ
+ れる。
+
+ 4. :r ファイル名 によりファイル名というファイルがディスクより取り込まれ、
+ カーソル位置の下に挿入される。
+
+ 5. :r !dir は dir コマンドの出力をカーソル位置以下に読み込む。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 6.1: オープンコマンド
+
+
+ ** o をタイプすると、カーソルの下の行が開き、挿入モードに入ります。 **
+
+ 1. 以下の ---> と示された最初の行にカーソルを移動しましょう。
+
+ 2. o (小文字) をタイプして、カーソルの下の行を開き、挿入モードに入ります。
+
+ 3. いくつか文字をタイプしてから、挿入モードを終了する為に <ESC> を
+ タイプします。
+
+---> o をタイプするとカーソルは開いた行へ移動し挿入モードに入ります。
+
+ 4. カーソルの上の行に挿入するには、小文字の o ではなく、単純に大文字の O
+ をタイプします。次の行で試してみましょう。
+
+---> この行の上へ挿入するには、この行へカーソルを置いて O をタイプします。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 6.2: 追加コマンド
+
+
+ ** カーソルの次の位置からテキストを追加するには a とタイプします。 **
+
+ 1. カーソルを ---> で示された最初の行へ移動しましょう。
+
+ 2. e を押して li の終端部までカーソルを移動します。
+
+ 3. カーソルの後ろにテキストを追加するために a (小文字) をタイプします。
+
+ 4. その下の行のような単語に完成させます。挿入モードを抜ける為に <ESC> を押
+ します。
+
+ 5. e を使って次の不完全な単語へ移動し、ステップ 3 と 4 を繰り返します。
+
+---> 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, i と A は同じ挿入モードへ移りますが、文字が挿入される位置だけが異なり
+ ます。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 6.3: その他の置換方法
+
+
+ ** 1文字以上を置き換えるには大文字の R とタイプしましょう。 **
+
+ 1. 以下の ---> と示された行にカーソルを移動します。最初の xxx の先頭に移動し
+ ます。
+
+ 2. R を押して、2行目の数値をタイプすることで、xxx が置換されます。
+
+ 3. 置換モードを抜けるには <ESC> を押します。行の残りが変更されていないままに
+ なることに注意してください。
+
+ 4. 残った xxx をステップを繰り返して置換しましょう。
+
+---> Adding 123 to xxx gives you xxx.
+---> Adding 123 to 456 gives you 579.
+
+NOTE: 置換モードは挿入モードに似ていますが、全てのタイプされた文字は既存の文字
+ を削除します。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 6.4: テキストのコピーとペースト
+
+
+ ** テキストのコピーにはオペレータ y を、ペーストには p を使います。 **
+
+ 1. ---> と示された行へ移動し、カーソルを "a)" の後に置いておきます。
+
+ 2. v でビジュアルモードを開始し、"first" の手前までカーソルを移動します。
+
+ 3. y をタイプして強調表示されたテキストを yank (コピー)します。
+
+ 4. 次の行の行末までカーソルを移動します: j$
+
+ 5. p を押して貼り付け(put)てから、次をタイプします: a second <ESC>
+
+ 6. ビジュアルモードで " item." を選択し、y でヤンク、次の行の行末まで j$ で
+ 移動し、 p でテキストをそこに put します。
+
+---> a) this is the first item.
+ b)
+
+ NOTE: y をオペレータとして使うこともできます。yw は単語を1つ yank します。
+ yy は行を1つ yank し、p でその行を put します。
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 6.5: オプションの設定
+
+
+ ** 検索や置換の際に大文字/小文字を無視するには、オプションを設定します。 **
+
+ 1. 次の様に入力して 'ignore' を検索しましょう: /ignore <ENTER>
+ n を押して何度か検索を繰り返します。
+
+ 2. 次の様に入力して 'ic' (Ignore Case の略) オプションを設定します: :set ic
+
+ 3. では n によってもう1度 'ignore' を検索します。
+ n を押してさらに数回検索を繰り返しましょう。
+
+ 4. 'hlsearch' と 'incsearch' オプションを設定しましょう: :set hls is
+
+ 5. 検索コマンドを再入力して、何が起こるか見てみましょう: /ignore <ENTER>
+
+ 6. 大文字小文字の区別を無効にするには次の様に入力します: :set noic
+
+NOTE: マッチの強調表示をやめるには次の様に入力します: :nohlsearch
+NOTE: 1つの検索コマンドだけ大文字小文字の区別をやめたいならば、語句内で \c
+ を使用します: /ignore\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 6 要約
+
+ 1. o をタイプするとカーソルの下の行を開けて、そこで挿入モードになる。
+ O (大文字) をタイプするとカーソルの上の行で挿入モードになる。
+
+ 2. カーソル上の文字の次からテキストを追加するには a とタイプする。
+ 行末にテキストを挿入するには大文字 A をタイプする。
+
+ 3. e コマンドは単語の終端にカーソルを移動する。
+
+ 4. y オペレータはテキストを yank (コピー)し、p はそれを put (ペースト)する。
+
+ 5. 大文字の R をタイプすると置換モードに入り、<ESC> を押すと抜ける。
+
+ 6. ":set xxx" とタイプするとオプション "xxx" が設定される。
+ 'ic' 'ignorecase' 検索時に大文字小文字の区別しない
+ 'is' 'incsearch' 検索フレーズに部分マッチしている部分を表示する
+ 'hls' 'hlsearch' マッチするすべてを強調表示する
+ 長い方、短い方、どちらのオプション名でも使用できます。
+
+ 7. オプションを無効にするには "no" を付与する: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 7.1: オンラインヘルプコマンド
+
+
+ ** オンラインヘルプを使用しましょう **
+
+ Vim には広範にわたるオンラインヘルプシステムがあります。
+ ヘルプを開始するには、これら3つのどれか1つを試してみましょう:
+ - ヘルプキー <HELP> を押す(もしあるならば)。
+ - <F1> キーを押す(もしあるならば)。
+ - :help <ENTER> とタイプする。
+
+ ヘルプウィンドウのテキストを読むと、ヘルプの動作が理解できます。
+ CTRL-W CTRL-W とタイプすると ヘルプウィンドウへジャンプします。
+ :q <ENTER> とタイプすると ヘルプウィンドウが閉じられます。
+
+ ":help" コマンドに引数を与えることにより、あらゆる題名のヘルプを見つけること
+ ができます。これらを試してみましょう(<ENTER> をタイプし忘れないように):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 7.2: 起動スクリプトの作成
+
+ ** Vim の特徴を発揮する **
+
+ Vim には Vi よりも多くの特徴を踏まえていますが、そのほとんどは初期状態にて
+ 使用不可となっています。より多くの特徴を使いはじめるには "vimrc" ファイル
+ を作成します。
+
+ 1. "vimrc" ファイルの編集を開始します。これはシステムに依存します。
+ :e ~/.vimrc UNIX 向け
+ :e ~/_vimrc Windows 向け
+
+ 2. ここでサンプルの "vimrc" を読み込みます。
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. 以下のようにファイルへ書き込みます。
+ :w
+
+ 次回 Vim を起動すると、色づけ構文が使えるようになるでしょう。
+ この "vimrc" ファイルへ、お好みの設定を追加することができます。
+ より多くの情報を得るには :help vimrc-intro とタイプします。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 7.3: 補完
+
+
+ ** CTRL-D と <TAB> でコマンドラインを補完する **
+
+ 1. 互換モードでないことを確認します: :set nocp
+
+ 2. 現在のディレクトリに在るファイルを :!ls か :!dir で確認します。
+
+ 3. コマンドの先頭をタイプします: :e
+
+ 4. CTRL-D を押すと Vim は "e" から始まるコマンドの一覧を表示します。
+
+ 5. d<TAB> とタイプすると Vim は ":edit" というコマンド名を補完します。
+
+ 6. さらに空白と、既存のファイル名の始まりを加えます: :edit FIL
+
+ 7. <TAB> を押すと Vim は名前を補完します。(もし一つしか無かった場合)
+
+NOTE: 補完は多くのコマンドで動作します。そして CTRL-D と <TAB> 押してみてくだ
+ さい。特に :help の際に役立ちます。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ レッスン 7 要約
+
+
+ 1. ヘルプウィンドウを開くには :help とするか <F1> もしくは <HELP> を押す。
+
+ 2. コマンド(cmd)のヘルプを検索するには :help cmd とタイプする。
+
+ 3. 別のウィンドウへジャンプするには CTRL-W CTRL-W とタイプする。
+
+ 4. ヘルプウィンドウを閉じるには :q とタイプする。
+
+ 5. お好みの設定を保つには vimrc 起動スクリプトを作成する。
+
+ 6. : command で可能な補完を見るには CTRL-D をタイプする。
+ 補完を使用するには <TAB> を押す。
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ これにて Vim のチュートリアルを終わります。エディタを簡単に、しかも充分に
+ 使うことができるようにと、Vim の持つ概念の要点のみを伝えようとしました。
+ Vim にはさらに多くのコマンドがあり、ここで全てを説明することはできません。
+ 以降はユーザーマニュアルを参照ください: ":help user-manual"
+
+ これ以後の学習のために、次の本を推薦します。
+ Vim - Vi Improved - by Steve Oualline
+ 出版社: New Riders
+ 最初の本は完全に Vim のために書かれました。とりわけ初心者にはお奨めです。
+ 多くの例題や図版が掲載されています。
+ 次のURLを参照して下さい https://iccf-holland.org/click5.html
+
+ 次は Vim よりも Vi について書かれた古い本ですが推薦します:
+ Learning the Vi Editor - by Linda Lamb
+ 出版社: O'Reilly & Associates Inc.
+ Vi でやりたいと思うことほぼ全てを知ることができる良書です。
+ 第6版では、Vim についての情報も含まれています。
+
+ このチュートリアルは Colorado State University の Charles Smith のアイデア
+ を基に、Colorado School of Mines の Michael C. Pierce と Robert K. Ware の
+ 両名によって書かれました。 E-mail: bware@mines.colorado.edu.
+
+ Modified for Vim by Bram Moolenaar.
+
+ 日本語訳 松本 泰弘 <mattn.jp@gmail.com>
+ vim-jpチーム <https://github.com/vim-jp/lang-ja>
+ 監修 村岡 太郎 <koron.kaoriya@gmail.com>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ vi:set ts=8 sts=4 sw=4 tw=78:
diff --git a/runtime/tutor/tutor.ko b/runtime/tutor/tutor.ko
new file mode 100644
index 0000000..993c43d
--- /dev/null
+++ b/runtime/tutor/tutor.ko
@@ -0,0 +1,968 @@
+===============================================================================
+= 빔 길잡이 (VIM Tutor) 에 오신 것을 환영합니다 - Version 1.7 =
+===============================================================================
+
+ 빔(Vim)은 이 길잡이에서 다 설명할 수 없을 만큼 많은 명령을 가진
+ 매우 강력한 편집기입니다. 이 길잡이는 빔을 쉽게 전천후 편집기로 사용할
+ 수 있도록 충분한 명령에 대해 설명하고 있습니다.
+
+ 이 길잡이를 떼는 데에는 실습하는 데에 얼마나 시간을 쓰는 가에 따라서
+ 25-30 분 정도가 걸립니다.
+
+ 이 연습에 포함된 명령은 내용을 고칩니다. 이 파일의 복사본을 만들어서
+ 연습하세요. (vimtutor 를 통해 시작했다면, 이미 복사본을 사용하는
+ 중입니다.)
+
+ 중요한 것은, 이 길잡이가 직접 써보면서 배우도록 고려되어 있다는 것입니다.
+ 명령을 제대로 익히려면, 직접 실행해보는 것이 필요합니다. 내용을 읽는
+ 것만으로는, 명령을 잊어버리게 될 것입니다.
+
+ 자 이제, Caps Lock(Shift-Lock) 키가 눌려있지 않은지 확인해보시고, j 키를
+ 충분히 눌러서 Lesson 1.1이 화면에 가득 차도록 움직여봅시다.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.1: 커서 움직이기
+
+ ** 커서를 움직이려면, 표시된 대로 h,j,k,l 키를 누르십시오. **
+ ^
+ k 힌트: h 키는 왼쪽에 있으며, 왼쪽으로 움직입니다.
+ < h l > l 키는 오른쪽에 있으며, 오른쪽으로
+ j 움직입니다.
+ v j 키는 아래방향 화살표처럼 생겼습니다.
+
+ 1. 익숙해질 때까지 커서를 스크린 상에서 움직여 보십시오.
+
+ 2. 아래 방향키 (j)를 반복입력이 될 때까지 누르고 계십시오.
+ 이제 다음 lesson으로 가는 방법을 알게 되었습니다.
+
+ 3. 아래 방향키를 이용하여, Lesson 1.2 로 가십시오.
+
+참고: 원하지 않는 무언가가 입력이 되었다면, <ESC>를 눌러서, 명령 모드로
+ 돌아가십시오. 그 후에 원하는 명령을 다시 입력하십시오.
+
+참고: 커서키 또한 작동할 것입니다. 하지만 hjkl에 익숙해지면, 커서키보다
+ 훨씬 빠르게 이동할 수 있을 것입니다. 정말요!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.2: 빔을 시작하고 끝내기
+
+
+ !! 주의: 아래 있는 단계를 실행하기 전에, 이 lesson 전체를 읽으십시오!!
+
+ 1. <ESC> 키를 눌러서 확실하게 명령 모드로 빠져 나옵니다.
+
+ 2. 다음과 같이 입력합니다: :q! <ENTER>
+ 이렇게 하면, 바뀐 내용을 *저장하지 않고* 편집기를 빠져나갑니다.
+
+ 3. 쉘 프롬프트가 보인다면, 다시 길잡이로 돌아오기 위해 다음과 같이
+ 입력합니다.
+ vimtutor <ENTER>
+ 또는 다음과 같을 수도 있습니다.
+ vim tutor.ko <ENTER>
+
+---> 'vim' 은 빔 편집기로 들어가는 것을 뜻하며, 'tutor.ko'는 편집하려는
+ 파일을 뜻합니다.
+
+ 4. 위에서 이야기한 단계를 기억하였으며, 확신이 서면, 1에서 3까지를
+ 수행하여 편집기를 나갔다가 다시 들어와 보십시오.
+
+주의: :q! <ENTER> 는 바뀐 내용을 저장하지 않습니다. 이 후 lesson에서
+ 어떻게 편집 내용을 저장하는지 배울 수 있습니다.
+
+ 5. 그 후 커서를 아래로 움직여 Lesson 1.3 으로 가십시오.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.3: 텍스트 편집 - 지우기
+
+
+** 명령 모드에서 x 를 누르면 커서가 위치한 곳의 글자를 지울 수 있습니다. **
+
+ 1. ----> 로 표시된 곳으로 커서를 옮겨보십시오.
+
+ 2. 오타를 수정하기 위해, 커서를 지울 글자 위로 움직여 보십시오.
+
+ 3. x 키를 눌러서 지워야할 글자를 지우십시오.
+
+ 4. 2에서 4까지를 반복하여 문장이 올바르게 되도록 하여 보십시오.
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. 문장이 정확해졌다면, Lesson 1.4로 가십시오.
+
+주의: 이 길잡이를 보면서 외우려고 하지말고, 직접 사용해보면서 익히길
+ 바랍니다.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.4: 텍스트 편집 - 삽입 (INSERTION)
+
+
+ ** 명령 모드에서 i 를 누르면 텍스트를 입력할 수 있습니다. **
+
+ 1. 커서를 첫번째 ---> 로 표시된 줄로 움직입니다.
+
+ 2. 첫번째 줄을 두번째 줄과 똑같이 만들것입니다. 텍스트가 들어가야할
+ 곳 다음부터 첫번째 글자 위에 커서를 옮겨 놓습니다.
+
+ 3. i 키를 누른 후, 필요한 내용을 입력합니다.
+
+ 4. 수정한 후에는 <ESC> 를 눌러서 명령 모드로 돌아갑니다.
+ 문장을 올바르게 만들기 위해 2에서 4의 과정을 반복합니다.
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5. 텍스트를 삽입하는 데에 익숙해졌다면, Lesson 1.5로 가십시오.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.5: 택스트 편집 - 추가 (APPENDING)
+
+
+ ** A 를 입력해 텍스트를 추가할 수 있습니다. **
+
+ 1. 커서를 첫번째 ---> 로 표시된 줄로 움직입니다.
+ 커서가 문장 내 어디에 있던 상관없습니다.
+
+ 2. A 키를 눌러 필요한 내용을 입력합니다.
+
+ 3. 내용을 모두 입력한 후 <ESC>를 눌러 명령 모드로 돌아갑니다.
+
+ 4. 커서를 두번째 ---> 로 표시된 줄로 움직입니다.
+ 문장을 올바르게 만들기 위해 2에서 3의 과정을 반복합니다.
+
+---> 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. 텍스트를 추가하는 데 익숙해졌다면, Lesson 1.6으로 가십시오.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.6: 파일 편집
+
+ ** :wq 를 이용하여 파일을 저장하고 빠져나갈 수 있습니다. **
+
+ !! 주의: 아래 있는 단계를 실행하기 전에, 이 lesson 전체를 읽으십시오!!
+
+ 1. lesson 1.2에서 배웠던 것처럼 :q!로 편집기를 나갈 수 있습니다.
+ 만약, 다른 터미널에 접근 가능하다면, 아래의 단계를 다른 터미널에서 해봅니다.
+
+ 2. 쉘 프롬프트에 다음과 같이 입력합니다: vim tutor <ENTER>
+ 'vim' 은 빔 에디터 시작을 위한 명령어, 'tutor'는 수정하고자 하는
+ 파일의 이름 입니다.
+
+ 3. 앞에서 배웠던 것처럼 텍스트를 삽입하고 지워보세요.
+
+ 4. 다음 명령어를 이용해 파일 수정 부분을 저장하고 빠져나갑니다: :wq <ENTER>
+
+ 5. 만약 1에서 vimtutor를 빠져나갔다가 다시 들어왔다면, 아래로 움직여 요약으로 넘어가도록 합시다.
+
+ 6. 위 모든 단계를 다 읽고 이해한 후에 직접 해보세요.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 1 요약
+
+
+ 1. 커서를 움직일 때에는 화살표 키나 hjkl 키를 이용합니다.
+ h (왼쪽) j (아래) k (위) l (오른쪽)
+
+ 2. 쉘 프롬프트에서 빔을 시작하려면 vim FILENAME <ENTER>
+
+ 3. 수정한 내용을 무시한 채로 빔에서 빠져나가려면 <ESC> :q! <ENTER>
+ 저장한 후 빔에서 빠져나가려면 <ESC> :wq <ENTER>
+
+ 4. 명령 모드에서 커서가 위치한 곳의 글자를 지우려면 x 를 입력합니다.
+
+ 5. 명령 모드에서 커서가 위치한 곳에 텍스트를 삽입하려면
+ i 를 누른 후 텍스트를 입력하고 <ESC> 커서 앞에 삽입합니다.
+ A 를 누른 후 텍스트를 입력하고 <ESC> 문장 뒤에 추가 합니다.
+
+참고: <ESC>는 명령 모드로 돌아가는 데 쓰며, 원치 않는 명령이나 완전히 입력되지
+ 않은 명령을 취소하는 데에도 씁니다.
+
+그럼 Lesson 2를 시작합시다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.1: 삭제(DELETION) 명령
+
+
+ ** 한 단어를 끝까지 지우려면 dw 라고 치면 됩니다. **
+
+ 1. <ESC> 키를 눌러서 확실하게 명령 모드로 빠져 나옵니다.
+
+ 2. 아래에 ---> 로 표시된 줄 까지 커서를 옮깁니다.
+
+ 3. 지워야할 단어의 처음으로 커서를 옮깁니다.
+
+ 4. dw 라고 쳐서 그 단어를 지웁니다.
+
+ 주의: 위에서 말한대로 하면 화면의 마지막 줄에 dw 라는 글자가 표시됩니다.
+ 잘못 쳤다면, <ESC> 를 눌러서 다시 시작하십시오.
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. 3, 4번 과정을 다시 하여 문장을 정확하게 만든 뒤 Lesson 2.2로 가십시오.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.2: 다른 삭제 명령
+
+ ** d$ 라고 치면 그 줄 끝까지 지워집니다. **
+
+ 1. <ESC> 키를 눌러서 확실하게 명령 모드로 빠져 나옵니다.
+
+ 2. 아래에 ---> 로 표시된 줄 까지 커서를 옮깁니다.
+
+ 3. 올바른 줄의 끝으로 커서를 옮깁니다. (첫번째로 나오는 . 다음입니다.)
+
+ 4. d$ 라고 쳐서 줄 끝까지 지웁니다.
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+
+ 5. 어떤 일이 일어났는지 이해하기 위해 Lesson 2.3 으로 가십시오.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.3: 명령과 적용 대상에 대해
+
+
+ 삭제 명령 d의 형식은 다음과 같습니다.
+
+ d 대상
+
+ 여기서:
+ d - 지우는 명령
+ 대상 - 아래에 제시된 대상에 대해 명령을 수행
+
+ 적용 가능한 대상의 종류:
+ w - 커서에서 그 단어의 끝까지 (공백 포함.)
+ e - 커서에서 그 단어의 끝까지 (공백을 포함하지 않음.)
+ $ - 커서에서 그 줄의 끝까지
+
+ 예를 들어, de 는 커서의 위치부터 해당 단어의 끝까지 지웁니다.
+
+참고: 호기심이 있다면, 명령 모드에서 명령 없이 대상을 입력해보십시오.
+ 위에서 이야기한 대상의 목록에 따라 커서가 움직이게 됩니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.4: 대상에 반복 적용하기
+
+
+ ** 대상 이전에 숫자를 넣어주면 그 만큼 반복 됩니다. **
+
+ 1. 아래에 ---> 로 표시된 줄 까지 커서를 옮깁니다.
+
+ 2. 2w 입력하여 커서를 단어 두 개 뒤로 옮깁니다.
+
+ 3. 3e 입력하여 커서를 뒤로 세 번째 단어의 끝으로 옮깁니다.
+
+ 4. 0 (zero) 를 입력하여 문장의 시작부분으로 움직입니다.
+
+ 5. 2에서 3까지를 다른 숫자로 반복해 봅니다.
+
+---> This is just a line with words you can move around in.
+
+ 6. Lesson 2.5로 가십시오.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.5: 삭제에 반복 적용하기
+
+
+ ** 명령과 숫자를 함께 사용하면 그만큼 반복 수행 됩니다. **
+
+ 위에서 삭제 명령과 대상의 조합과 같이, 대상 이전에 횟수를 넣어 더 많이 삭제 할 수 있습니다:
+ d 횟수 대상
+
+ 1. 아래 ---> 표시된 줄에서 커서를 첫번째 대문자 단어로 옮깁니다.
+
+ 2. d2w를 입력하여 두 대문자 단어를 지웁니다.
+
+ 3. 이어지는 대문자 단어들을 1에서 2까지의 단계를 이용해 횟수를 바꾸어 삭제해 봅니다.
+
+---> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.6: 줄 전체 조작하기
+
+
+
+ ** dd 라고 치면 줄 전체를 지웁니다. **
+
+ 줄 전체를 지우는 일이 잦기 때문에, Vi를 디자인 한 사람들은, 간단히 d를
+ 두번 연달아 치면 한 줄을 지울 수 있도록 하였습니다.
+
+ 1. 커서를 아래 나온 단락의 두번째 줄로 가져가십시오.
+ 2. dd 를 입력하여 그 줄을 지우십시오.
+ 3. 그런 다음 네번째 줄로 가십시오.
+ 4. 2dd 라고 입력하여 두줄을 지웁니다. ( 횟수-명령-대상을 기억하세요. )
+
+---> 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: 취소(UNDO) 명령
+
+
+ ** u 를 누르면 마지막 명령이 취소되며, U 는 줄 전체를 수정합니다. **
+
+ 1. 커서를 ---> 로 표시된 줄로 이동한 후 첫번째 잘못된 부분 위로 옮깁니다.
+ 2. x 를 입력하여 첫번째 잘못된 글자를 지웁니다.
+ 3. 그럼 이제 u 를 입력하여 마지막으로 수행된 명령을 취소합니다.
+ 4. 이번에는 x 명령을 이용하여 그 줄의 모든 에러를 수정해봅시다.
+ 5. 대문자 U 를 눌러서 그 줄을 원래 상태로 돌려놓아 보십시오.
+ 6. 이번에는 u 를 몇 번 눌러서 U 와 이전 명령을 취소해봅시다.
+ 7. CTRL-R (CTRL 키를 누른 상태에서 R을 누르는 것) 을 몇 번 눌러서
+ 명령을 다시 실행해봅시다. (취소한 것을 취소함.)
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. 이 명령은 매우 유용합니다. 그럼 Lesson 2 요약으로 넘어가도록 합시다.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 2 요약
+
+
+ 1. 커서가 위치한 곳부터 단어의 끝까지 지우려면: dw
+ 2. 커서가 위치한 곳부터 줄 끝까지 지우려면: d$
+ 3. 줄 전체를 지우려면: dd
+
+ 4. 횟수와 함께 대상을 반복 시키려면: 2w
+ 5. 명령 모드에서 내리는 명령의 형식은 다음과 같습니다:
+
+ [횟수] 명령 대상 또는 명령 [횟수] 대상
+
+ 여기서:
+ 횟수 - 그 명령을 몇 번 반복할 것인가
+ 명령 - 어떤 명령을 내릴 것인가 ( 예를 들어, 삭제인 경우는 d )
+ 대상 - 명령이 동작할 대상, 예를 들어 w (단어), $ (줄의 끝) 등.
+
+ 6. 커서를 문장 맨 앞으로 옮기려면: 0
+
+ 7. 이전 행동을 취소하려면: u (소문자 u)
+ 한 줄에서 수정한 것을 모두 취소하려면: U (대문자 U)
+ 취소한 것을 다시 실행하려면: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.1: 붙이기(PUT) 명령
+
+
+ ** p 를 입력하여 마지막으로 지운 내용을 커서 뒤에 붙입니다. **
+
+ 1. 아래에 있는 문단의 첫 줄로 커서를 움직이십시오.
+
+ 2. dd 를 입력하여 그 줄을 지워서 빔의 버퍼에 저장합니다.
+
+ 3. 아까 지운 줄이 가야할 위치의 *윗줄로* 커서를 옮깁니다.
+
+ 4. 명령 모드에서, p 를 입력하여 그 줄을 제대로 된 자리로 옮깁니다.
+
+ 5. 2에서 4를 반복하여 모든 줄의 순서를 바로 잡으십시오.
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.2: 치환(REPLACE) 명령
+
+
+ ** 커서 아래의 글자 하나를 바꾸려면, r 을 누른 후 바꿀 글자를 입력합니다. **
+
+ 1. 커서를 ---> 로 표시된 첫 줄로 옮깁니다.
+
+ 2. 커서를 잘못된 첫 부분으로 옮깁니다.
+
+ 3. r 을 누른 후, 잘못된 부분을 고쳐 쓸 글자를 입력합니다.
+
+ 4. 2에서 3의 과정을 반복하여, 첫 줄의 오류를 수정하십시오.
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. Lesson 3.2 로 이동합시다.
+
+주의: 외우지 말고, 직접 해보면서 익혀야 한다는 것을 잊지 마십시오.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.3: 변환(CHANGE) 명령
+
+
+ ** 한 단어의 전체를 바꾸려면, ce 를 치십시오. **
+
+ 1. 커서를 ---> 로 표시된 첫줄로 옮깁니다.
+
+ 2. 커서를 lubw 에서 u 위에 올려놓습니다.
+
+ 3. ce 라고 명령한 후 단어를 정확하게 수정합니다. (이 경우, 'ine' 를 칩니다.)
+
+ 4. <ESC> 를 누른 후 다음 에러로 갑니다 (수정되어야할 첫 글자로 갑니다.)
+
+ 5. 3에서 4의 과정을 반복하여 첫번째 문장을 두번째 문장과 같도록 만듭니다.
+
+---> This lubw has a few wptfd that mrrf changing usf the change command.
+---> This line has a few words that need changing using the change command.
+
+ce 는 단어를 치환하는 것 뿐만 아니라, 내용을 삽입할 수 있도록 한다는 것에
+유의합시다.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.4: c 를 이용한 다른 변환 명령
+
+
+ ** 변환 명령은 삭제할 때 이용한 대상에 대해 적용할 수 있습니다. **
+
+ 1. 변환 명령은 삭제와 동일한 방식으로 동작합니다. 형식은 다음과 같습니다:
+
+ [횟수] c 대상 또는 c [횟수] 대상
+
+ 2. 적용 가능한 대상 역시 같습니다. w (단어), $ (줄의 끝) 등이 있습니다.
+
+ 3. ---> 로 표시된 첫줄로 이동합니다.
+
+ 4. 첫 에러 위로 커서를 옮깁니다.
+
+ 5. c$ 를 입력하여, 그 줄의 나머지가 두번째 줄처럼 되도록 수정한 후 <ESC> 를
+ 누르십시오.
+
+---> 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$ command.
+
+참고: 입력하는 동안은 백스페이스를 이용할 수 있습니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 3 요약
+
+
+ 1. 이미 지운 내용을 되돌리려면, p 를 누르십시오. 이 명령은 커서 *다음에*
+ 지워진 내용을 붙입니다(PUT). (한 줄을 지운 경우에는 커서 다음 줄에
+ 지워진 내용이 붙습니다.)
+
+ 2. 커서 아래의 글자를 치환하려면(REPLACE), r 을 누른 후 원래 글자 대신
+ 바꾸어 넣을 글자를 입력합니다.
+
+ 3. 변환 명령(CHANGE)은 커서에서 부터 지정한 대상의 끝까지 바꿀 수 있는
+ 명령입니다. 예를 들어, 커서 위치에서 단어의 끝까지 바꾸려면 ce 를
+ 입력하면 되며, c$ 는 줄 끝까지 바꾸는 데 쓰입니다.
+
+ 4. 변환 명령의 형식은 다음과 같습니다:
+
+ [횟수] c 대상 또는 c [횟수] 대상
+
+계속해서 다음 Lesson 을 진행합시다.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.1: 위치와 파일의 상태
+
+
+ ** CTRL-G 를 누르면 파일 내에서의 현재 위치와 파일의 상태를 볼 수 있습니다.
+ G 를 누르면 파일 내의 마지막 줄로 이동합니다. **
+
+ 주의: 아래의 단계를 따라하기 전에, 이 Lesson 전체를 먼저 읽으십시오.
+
+ 1. CTRL 키를 누른 상태에서 g 를 누릅니다. 파일 이름과 현재 위치한 줄이
+ 표시된 상태줄이 화면 아래에 표시될 것입니다. 3번째 단계를 위해 그
+ 줄 번호를 기억하고 계십시오.
+
+참고: 커서가 화면 오른쪽 하단으로 옮겨진 것을 보인다면,
+ 이는 'ruler' 옵션을 세팅된 경우 입니다. (:help 'ruler' 를 참고 하세요.)
+
+ 2. G 를 누르면 파일의 마지막으로 이동합니다.
+ gg 를 누르면 파일의 시작 부분으로 이동합니다.
+
+ 3. 아까 기억했던 줄 번호를 입력한 후 G 를 누르십시오. 이렇게 하면
+ 처음에 CTRL-G 를 눌렀던 장소로 되돌아가게 될 것입니다.
+ (번호를 입력할 때, 이것은 화면에 표시되지 않습니다.)
+
+ 4. 자신이 생겼다면, 1에서 3까지를 실행해보십시오.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.2: 찾기 명령
+
+
+ ** / 를 누른 후 검색할 문구를 입력하십시오. **
+
+ 1. 명령 모드에서 / 를 입력하십시오. : 명령에서와 마찬가지로, 화면 아래에
+ / 와 커서가 표시될 것입니다.
+
+ 2. 'errroor' 라고 친 후 <ENTER> 를 치십시오. 이 단어를 찾으려고 합니다.
+
+ 3. 같은 문구를 다시 찾으려면, 간단히 n 을 입력하십시오.
+ 같은 문구를 반대 방향으로 찾으려면, Shift-N 을 입력하십시오.
+
+ 4. 문구를 역방향으로 찾으려면, / 대신 ? 를 이용하면 됩니다.
+
+ 5. 원래 있던 곳으로 돌아가기 위해서는 CTRL-O 를 이용하면 됩니다. 반복하면 더 이전으로도
+ 갈 수 있습니다. CTRL-I 로 다시 뒤로 갈 수도 있습니다.
+
+---> "errroor" is not the way to spell error; errroor is an error.
+
+참고: 찾는 중에 파일의 끝에 다다르게 되면, 파일의 처음부터 다시 찾게 됩니다.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.3: 괄호의 짝 찾기
+
+
+ ** % 를 눌러서 ), ], } 의 짝을 찾습니다. **
+
+ 1. 커서를 ---> 로 표시된 줄의 (, [, { 중 하나에 가져다 놓습니다.
+
+ 2. % 를 입력해 봅시다.
+
+ 3. 커서가 짝이 맞는 괄호로 이동할 것입니다.
+
+ 4. % 를 입력하여, 이전 괄호로 되돌아 옵시다.
+
+ 5. 커서를 다른 (,),[,],{ 혹은 } 로 움직여 % 를 입력해 봅니다.
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+참고: 짝이 맞지 않는 괄호가 있는 프로그램을 디버깅할 때에 매우 유용합니다!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.4: 치환(SUBTITUTE) 명령
+
+
+ ** :s/old/new/g 하면 'old' 를 'new' 로 치환(SUBTITUTE)합니다. **
+
+ 1. 커서를 ---> 로 표시된 줄에 가져다 놓습니다.
+
+ 2. :s/thee/the 를 입력한 후 <ENTER> 를 칩니다. 이 명령은 그 줄에서
+ 처음으로 발견된 것만 바꾼다는 것에 주의하십시오.
+
+ 3. 이번에는 :s/thee/the/g 를 입력합니다. 이는 그 줄 전체(globally)를
+ 치환한다는 것을 의미합니다.
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. 두 줄 사이의 모든 문자열에 대해 치환하려면 다음과 같이 합니다,
+ :#,#s/old/new/g #,# 는 두 줄의 줄번호를 뜻합니다.
+ :%s/old/new/g 파일 전체에서 발견된 모든 것을 치환하는 경우입니다.
+ :%s/old/new/gc 파일 전체에서 발견된 모든 것을 찾고, 치환할지 안
+ 할지 프롬프트로 명령합니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 4 요약
+
+ 1. CTRL-G 파일의 상태와 파일 내에서의 현재 위치를 표시합니다.
+ G 파일의 끝으로 이동합니다.
+ 숫자 G 해당 줄로 이동합니다.
+ gg 첫 번째 라인으로 이동합니다.
+
+ 2. / 를 입력한 후 문구를 입력하면 그 문구를 아랫방향으로 찾습니다.
+ ? 를 입력한 후 문구를 입력하면 윗방향으로 찾습니다.
+ 검색 후, n 을 입력하면 같은 방향으로 다음 문구를 찾으며,
+ Shift-N 을 입력하면 반대 방향으로 찾습니다.
+ CTRL-O 는 과거의 위치로, CTRL-I는 새로운 위치로 옮겨줍니다.
+
+ 3. 커서가 (,),[,],{,} 위에 있을 때에 % 를 입력하면 상응하는 짝을
+ 찾아갑니다.
+
+ 4. 어떤 줄에 처음 등장하는 old를 new로 바꾸려면 :s/old/new
+ 한 줄에 등장하는 모든 old를 new로 바꾸려면 :s/old/new/g
+ 두 줄 #,# 사이에서 치환을 하려면 :#,#s/old/new/g
+ 파일 내의 모든 문구를 치환하려면 :%s/old/new/g
+ 바꿀 때마다 확인을 거치려면 'c'를 붙여서 :%s/old/new/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.1: 외부 명령 실행하는 방법
+
+
+ ** :! 을 입력한 후 실행하려는 명령을 입력하십시오. **
+
+ 1. 친숙한 명령인 : 를 입력하면 커서가 화면 아래로 이동합니다. 명령을
+ 입력할 수 있게 됩니다.
+
+ 2. 이제 ! (느낌표) 를 입력하십시오. 이렇게 하면 외부 쉘 명령을 실행할
+ 수 있습니다.
+
+ 3. 시험삼아 ! 다음에 ls 를 입력한 후 <ENTER> 를 쳐보십시오. 쉘 프롬프트
+ 에서처럼 디렉토리의 목록이 출력될 것입니다. ls 가 동작하지 않는다면
+ :!dir 을 시도해 보십시오.
+
+참고: 어떤 외부 명령도 이 방법으로 실행할 수 있습니다.
+
+참고: 모든 : 명령은 <ENTER> 를 쳐야 마무리 됩니다.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.2: 보다 자세한 파일 저장
+
+
+ ** 수정된 내용을 파일로 저장하려면, :w FILENAME 하십시오. **
+
+ 1. :!dir 또는 :!ls 를 입력하여 디렉토리의 리스트를 얻어옵니다.
+ 위의 명령 후 <ENTER>를 쳐야한다는 것은 이미 알고 있을 것입니다.
+
+ 2. TEST 처럼 존재하지 않는 파일 이름을 하나 고르십시오.
+
+ 3. 이제 :w TEST 라고 입력하십시오. (TEST는 당신이 선택한 파일 이름입니다.)
+
+ 4. 이렇게 하면 빔 길잡이 파일 전체를 TEST라는 이름으로 저장합니다.
+ 확인하려면, :!dir 을 다시 입력하여, 디렉토리를 살펴보십시오.
+
+참고: 빔을 종료한 후, 빔을 다시 실행하여 TEST라는 파일을 열면, 그 파일은
+ 저장했을 때와 완벽히 같은 복사본일 것입니다.
+
+ 5. 이제 그 파일을 지웁시다.
+ (MS-DOS에서): !del TEST
+ (Unix에서): !rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.3: 선택적으로 저장하는 명령
+
+ ** 파일의 일부를 저장하려면, v 대상 :w FILENAME 을 입력합니다. **
+
+ 1. 이 줄로 커서를 가져옵니다.
+
+ 2. v 를 누르고 커서를 아래 다섯번째로 옮깁니다. 이 때, 문자열들이 하이라이트 됨을 주목합니다.
+
+ 3. : 를 누릅니다. 화면 하단에 :'<,'> 가 나타납니다.
+
+ 4. w TEST 를 입력합니다. 여기서 TEST는 파일 이름이며 아직 생성되어 있지 않습니다. <ENTER>를
+ 누르기 전, :'<,'>w TEST 로 입력되었는지 확인 합니다.
+
+ 5. 빔은 선택된 문장들을 TEST 파일에 입력합니다. :!dir 혹은 :!ls를 이용하여 파일이 만들어졌는지
+ 확인하십시오. 아직 삭제하지 마십시오! 다음 레슨에서 이 파일을 사용합니다.
+
+참고 : v 를 눌러 비주얼(Visual) 선택을 시작합니다. 커서를 주변으로 움직여 선택 부분을 조절할 수
+ 있습니다. 그리고 명령어를 이용해 해당 문자열을 조작할 수 있습니다. 예를 들어, d 를 이용해
+ 삭제할 수도 있습니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.4: 파일 읽어들이기, 합치기
+
+
+ ** 어떤 파일의 내용을 삽입하려면, :r FILENAME 하십시오 **
+
+ 1. 커서를 이 라인 바로 위로 옮기십시오.
+
+주의: 3번째 단계를 실행하면, Lesson 5.3 을 보게 될 것입니다. 그렇게 되면
+ 이 lesson으로 다시 내려오십시오.
+
+ 2. 이제 TEST 파일을 읽어들입시다. :r TEST 명령을 사용하십시오. TEST 는
+ 파일의 이름입니다. 읽어들인 파일은 커서가 위치한 문장 아래부터 놓이게 됩니다.
+
+ 3. 파일이 읽어들여진 것을 확인하기 위해, 뒤로 이동해서 기존 버전과 파일에서
+ 읽어들인 버전, 이렇게 Lesson 5.3 이 두번 반복되었음을 확인하십시오.
+
+참고: 외부 명령어의 결과값도 읽을 수 있습니다. 예를 들어, :r !ls 는 ls 명령어에 대한 결과값을
+ 읽어 커서 바로 아래에 합칩니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 5 요약
+
+
+ 1. :!command 를 이용하여 외부 명령을 실행합니다.
+
+ 유용한 예:
+ (MS-DOS) (Unix)
+ :!dir :!ls - 디렉토리의 목록을 보여준다.
+ :!del FILENAME :!rm FILENAME - FILENAME이라는 파일을 지운다.
+
+ 2. :w FILENAME 하면 현재 빔에서 사용하는 파일을 FILENAME이라는 이름으로
+ 디스크에 저장합니다.
+
+ 3. v 명령 :w FILENAME 은 비주얼 모드에서 선택된 문장들을 파일 FILENAME에 저장합니다.
+
+ 4. :r FILENAME 은 디스크에서 FILENAME이라는 파일을 불러들여서 커서 위치
+ 뒤에 현재 파일을 집어넣습니다.
+
+ 5. :r !dir 는 dir 명령어의 결과값을 현재 커서의 위치 아래에 붙힙니다.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.1: 새 줄 열기(OPEN) 명령
+
+
+ ** o 를 누르면 커서 아래에 줄을 만들고 편집 모드가 됩니다. **
+
+ 1. 아래에 ---> 로 표시된 줄로 커서를 옮기십시오.
+
+ 2. o (소문자)를 쳐서 커서 *아래에* 줄을 하나 여십시오. 편집 모드가 됩니다.
+
+ 3. ---> 로 표시된 줄을 복사한 후 <ESC> 를 눌러서 편집 모드에서 나오십시오.
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. 커서 *위에* 줄을 하나 만드려면, 소문자 o 대신 대문자 O 를 치면 됩니다.
+ 아래 있는 줄에 대해 이 명령을 내려보십시오.
+
+---> Open up a line above this by typing O while the cursor is on this line.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.2: 추가(APPEND) 명령
+
+
+ ** a 를 누르면 커서 *다음에* 글을 입력할 수 있습니다. **
+
+ 1. 커서를 ---> 로 표시된 첫번째 줄의 끝으로 옮깁니다.
+
+ 2. e 를 눌러 li 의 끝으로 커서를 옮깁니다.
+
+ 3. 소문자 a 를 커서 아래 글자 *다음*에 글을 추가할 수 있습니다.
+
+ 4. 아랫줄과 같이 문장을 완성해 봅니다. <ESC>를 이용해 편집(Insert) 모드를 나갑니다.
+
+ 5. e 를 이용해 다음 고칠 단어로 움직여 3에서 4까지를 반복합니다.
+
+참고: 그렇게 하시면 고작 줄의 끝에 추가를 하기 위해 i를 누르고, 커서 아래에
+ 있던 글자를 반복하고, 글을 끼워넣고, <ESC>를 눌러 명령 모드로 돌아와서,
+ 커서를 오른쪽으로 옮기고 마지막으로 x까지 눌러야 하는 번거로움을 피하실
+ 수 있습니다.
+
+ 3. 이제 첫 줄을 완성하십시오. 추가 명령은 텍스트가 입력되는 위치 외에는
+ 편집 모드와 완전히 같다는 것을 유념하십시오.
+
+---> This li will allow you to pract appendi text to a line.
+---> This line will allow you to practice appending text to a line.
+
+참고: a, i 그리고 A 는 텍스트가 입력되는 위치 외에는 편집 모드와 완전히 같다는 것을 유념하십시오.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.3: 치환(REPLACE) 의 다른 버전
+
+
+ ** 대문자 R 을 입력하면 하나 이상의 글자를 바꿀 수 있습니다. **
+
+ 1. ---> 로 표시된 첫번째 줄로 움직여 커서를 xxx의 앞으로 옮깁니다.
+
+ 2. R 을 입력한 후, 두번째 줄과 같은 숫자를 입력해 xxx를 치환합니다.
+
+ 3. <ESC> 를 눌러 치환 모드를 빠져나갑니다. 나머지 문장은 그대로 남아 있는지 확인합니다.
+
+ 4. 위 단계들 반복하여 남은 모든 xxx를 치환합니다.
+
+---> Adding 123 to xxx gives you xxx.
+---> Adding 123 to 456 gives you 579.
+
+주의: 치환 모드는 편집 모드와 비슷합니다. 하지만 입력된 문자들이 원래 문자들을 삭제하는 점이 다릅니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.4: 문자 복사 붙여넣기(COPY AND PASTE)
+
+
+ ** y 를 이용해 복사하고 p 로 붙여 넣습니다. **
+
+ 1. ---> 로 표시된 줄로 움직여 커서를 "a)" 뒤로 옮깁니다.
+
+ 2. v 를 눌러 비주얼 모드를 시작하고 "first" 바로 앞까지 커서를 움직입니다.
+
+ 3. y 를 눌러 하이라이트 된 부분을 복사(yank (copy))합니다.
+
+ 4. 커서를 다음 문장의 끝으로 옮깁니다: j$
+
+ 5. p 를 눌러 문자열을 붙여 넣습니다.(paste) 그리고 second <ESC> 를 입력합니다.
+
+ 6. 비주얼 모드를 이용해 " item."을 선택, y 로 복사, j$ 으로 다음 문장 끝으로 움직여
+ p 로 단어를 붙여 넣습니다.
+
+---> a) this is the first item.
+ b)
+
+ 참고: y 역시 명령어로 사용 가능합니다. 예를 들어, yw 는 한 단어를 복사합니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.5: 옵션 설정(SET)
+
+ ** 찾기나 바꾸기에서 대소문자 구분을 없애기 위해 옵션을 설정합니다 **
+
+ 1. 다음을 입력하여 'ignore' 를 찾으십시오: /ignore <ENTER>
+ n 키를 이용하여 여러번 반복하십시오.
+
+ 2. 'ic' (대소문자 구별 안함, Ignore case) 옵션을 설정하십시오:
+ :set ic
+
+ 3. n 키를 눌러서 'ignore' 를 다시 찾아보십시오.
+ 이제 ignore과 IGNORE 모두 검색되는 점을 주목합니다.
+
+ 4. 'hlsearch' 와 'incsearch' 옵션을 설정합시다.
+ :set hls is
+
+ 5. 찾기 명령을 다시 입력하여, 어떤 일이 일어나는지 확인해 보십시오:
+ /ignore
+
+ 6. 대소문자 구별을 끄기 위해서는, 다음과 같이 입력합니다:
+ :set noic
+
+참고: 찾은 내용이 강조(HIGHLIGHT)된 것을 없애려면: :nohlsearch
+참고: 만약, 검색 한번에 대해서만 대소문자 구별 세팅을 끄고 싶다면 \c 를 이용할 수 있습니다.
+ : /ignore\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 6 요약
+
+
+ 1. o 를 입력하면 커서 *아래에* 한 줄이 열리며, 커서는 편집 모드로
+ 열린 줄 위에 위치하게 됩니다.
+ 대문자 O 를 입력하면 커서가 있는 줄의 *위로* 새 줄을 열게 됩니다.
+
+ 2. a 를 입력하면 커서 *다음에* 글을 입력할 수 있습니다.
+ 대문자 A 를 입력하면 자동으로 그 줄의 끝에 글자를 추가하게 됩니다.
+
+ 3. e 를 입력하면 단어의 끝으로 움직입니다.
+
+ 4. y 를 입력하면 복사(yank (copy))를, p 를 입력하면 붙여 넣기가 됩니다.
+
+ 5. 대문자 R 을 입력하면 <ESC> 를 눌러서 나가기 전까지 바꾸기 모드가 됩니다.
+
+ 6. ":set xxx" 를 하면 "xxx" 옵션이 설정됩니다.:
+ 'ic' 'ignorecase' 검색시 대소문자 구별을 하지 않습니다.
+ 'is' 'incsearch' 검색어에서 부분 검색 결과를 보여줍니다.
+ 'hls' 'hlsearch' 검색 결과값을 하이라이트해줍니다.
+ 옵션은 전체 이름 혹은 줄인 이름 모두 사용 가능합니다.
+
+ 7. 앞에 "no"를 붙여 옵션을 끌 수 있습니다: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 7.1: 온라인 도움말 명령
+
+
+ ** 온라인 도움말 시스템 사용하기 **
+
+ 빔은 폭 넓은 온라인 도움말 시스템을 제공합니다. 도움말을 보려면,
+ 다음 세가지 중 하나를 시도해보십시오:
+ - <HELP> 키를 누른다. (키가 있는 경우)
+ - <F1> 키를 누른다. (키가 있는 경우)
+ - :help <ENTER> 라고 입력한다.
+
+ 도움말 창을 닫으려면 :q <ENTER> 라고 입력하십시오.
+ CTRL-W CTRL-W 다른쪽 윈도우로 넘어갑니다.
+ :q <ENTER> 도움말 윈도우를 닫습니다.
+
+ ":help" 라는 명령에 인자를 주면 어떤 주제에 관한 도움말을 찾을 수 있습니다.
+ 다음 명령을 내려 보십시오. ( <ENTER> 키를 누르는 것을 잊지 마십시오.)
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 7.2: 시작 스크립트 만들기
+
+ ** 빔의 기능 켜기 **
+
+ 빔은 Vi 보다 훨씬 많은 기능을 가지고 있지만, 대부분은 기본적으로 작동하지
+ 않습니다. 더 많은 기능을 써보려면, "vimrc" 라는 파일을 만들어야 합니다.
+
+ 1. "vimrc" 파일을 수정합시다. 이 파일은 사용하는 시스템에 따라 다릅니다:
+ :e ~/.vimrc Unix의 경우
+ :e ~/_vimrc MS-Windows의 경우
+
+ 2. 이제 "vimrc"의 예제를 읽어들입니다:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. 다음과 같이 하여 파일을 저장합니다:
+ :w
+
+ 다음 번에 빔을 시작하면, 구문 강조(syntax highlighting)이 사용될 것입니다.
+ 모든 원하는 설정을 이 "vimrc" 파일에 넣어둘 수 있습니다.
+ 더 자세한 내용은 :help vimrc-intro를 참고 하세요.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7.3: 명령어 완성하기
+
+
+ ** CTRL-D 와 <TAB> 이용하여 명령어를 완성할 수 있습니다.**
+
+ 1. 먼저 vim이 호환 모드가 아닌지를 확인합니다: :set nocp
+
+ 2. 디렉토리에 파일이 존재하는지 먼저 확인 합니다.: :!ls 혹은 :!dir
+
+ 3. 다음과 같이 명령어를 입력합니다: :e
+
+ 4. CTRL-D 를 누르면 "e"로 시작하는 모든 명령어들을 볼 수 있습니다.
+
+ 5. <TAB> 을 눌러 ":edit" 명령어를 완성해 봅니다.
+
+ 6. 이제 빈칸 하나를 추가한 뒤, 존재하는 파일 이름의 앞 부분을 입력합니다: :edit FIL
+
+ 7. <TAB> 을 눌러 파일 이름을 완성 시킵니다.
+
+참고: 완성하기는 많은 명령어에서 사용할 수 있습니다. CTRL-D와 <TAB> 만 누르세요!
+ 특히, :help 에서 유용할 것입니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7 요약
+
+
+ 1. 도움말을 열기 위해 :help 혹은 <F1> 혹은 <Help> 를 누릅니다.
+
+ 2. cmd 에 대한 도움말을 보기 위해서는 :help cmd 를 입력합니다.
+
+ 3. CTRL-W CTRL-W 를 이용해 다른 윈도우로 넘어갑니다.
+
+ 4. :q 로 도움말 윈도우를 빠져나옵니다.
+
+ 5. vimrc 시작 스크립트를 이용해 선호하는 세팅을 유지할 수 있습니다.
+
+ 6. : 명령어를 입력할때, CTRL-D 를 눌러 가능한 명령어들을 볼수 있습니다.
+ <TAB> 을 눌러 완성 가능합니다.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ 이것으로 빔 길잡이를 마칩니다. 이 길잡이는 빔 편집기에 대한 간략한 개요를
+ 보여주기 위한 의도로 제작되었으며, 이 편집기를 정말 간단히 사용하기에
+ 충분할 뿐입니다. 빔에는 이 길잡이와는 비교할 수 없을 만큼 훨씬 많은 명령이
+ 있습니다. 다음 사용자 매뉴얼을 읽으십시오: ":help user-manual"
+
+ 보다 자세히 읽고 공부하려면, 다음 책을 추천해 드립니다:
+ Vim - Vi Improved - by Steve Oualline
+ 출판사: New Riders
+ 이 책은 완전히 빔에 대해서만 다루고 있습니다. 특히 초보자들에게 유용합니다.
+ 많은 예제와 그림이 있습니다.
+ 다음을 참고하십시오: https://iccf-holland.org/click5.html
+
+ 다음 책은 좀 오래된 책으로 빔보다는 Vi에 대해 다루고 있지만, 역시 추천할 만
+ 합니다:
+ Learning the Vi Editor - by Linda Lamb
+ 출판사: O'Reilly & Associates Inc.
+ Vi로 하고 싶은 거의 모든 것에 대해 알 수 있는 좋은 책입니다.
+ 여섯번째 개정판은 빔에 관한 내용을 포함하고 있습니다.
+
+ 이 길잡이는 Colorado School of Mines의 Michael C. Pierce 와
+ Robert K. Ware 가 Colorado State University의 Charles Smith 의 아이디어에
+ 착안하여 썼습니다.
+ . E-mail: bware@mines.colorado.edu.
+
+ Modified for Vim by Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.ko.euc b/runtime/tutor/tutor.ko.euc
new file mode 100644
index 0000000..b93bb3b
--- /dev/null
+++ b/runtime/tutor/tutor.ko.euc
@@ -0,0 +1,968 @@
+===============================================================================
+= (VIM Tutor) ȯմϴ - Version 1.7 =
+===============================================================================
+
+ (Vim) ̿ ŭ
+ ſ Դϴ. ̴ õ
+ ֵ ɿ ϰ ֽϴ.
+
+ ̸ ǽϴ 󸶳 ð
+ 25-30 ɸϴ.
+
+ Ե Ĩϴ. 纻 
+ ϼ. (vimtutor ߴٸ, ̹ 纻 ϴ
+ Դϴ.)
+
+ ߿ , ̰ Ẹ鼭 쵵 Ǿ ִٴ Դϴ.
+ , غ ʿմϴ. д
+ ͸δ, ؾ Դϴ.
+
+ , Caps Lock(Shift-Lock) Ű Ȯغð, j Ű
+ Lesson 1.1 ȭ鿡 ô.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.1: Ŀ ̱
+
+ ** Ŀ ̷, ǥõ h,j,k,l Ű ʽÿ. **
+ ^
+ k Ʈ: h Ű ʿ , Դϴ.
+ < h l > l Ű ʿ ,
+ j Դϴ.
+ v j Ű Ʒ ȭǥó ϴ.
+
+ 1. ͼ Ŀ ũ 󿡼 ʽÿ.
+
+ 2. Ʒ Ű (j) ݺԷ ʽÿ.
+ lesson ˰ Ǿϴ.
+
+ 3. Ʒ Ű ̿Ͽ, Lesson 1.2 ʽÿ.
+
+: ʴ 𰡰 Է Ǿٸ, <ESC> ,
+ ưʽÿ. Ŀ ϴ ٽ ԷϽʽÿ.
+
+: ĿŰ ۵ Դϴ. hjkl ͼ, ĿŰ
+ ξ ̵ Դϴ. !
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.2: ϰ
+
+
+ !! : Ʒ ִ ܰ踦 ϱ , lesson ü ʽÿ!!
+
+ 1. <ESC> Ű Ȯϰ ɴϴ.
+
+ 2. Էմϴ: :q! <ENTER>
+ ̷ ϸ, ٲ * ʰ* ⸦ ϴ.
+
+ 3. Ʈ δٸ, ٽ ̷ ƿ
+ Էմϴ.
+ vimtutor <ENTER>
+ Ǵ ֽϴ.
+ vim tutor.ko <ENTER>
+
+---> 'vim'  ϸ, 'tutor.ko' Ϸ
+ մϴ.
+
+ 4. ̾߱ ܰ踦 Ͽ, Ȯ , 1 3
+ Ͽ ⸦ ٰ ٽ ʽÿ.
+
+: :q! <ENTER> ٲ ʽϴ. lesson
+  ϴ ֽϴ.
+
+ 5. Ŀ Ʒ Lesson 1.3 ʽÿ.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.3: ؽƮ -
+
+
+** 忡 x Ŀ ġ ڸ ֽϴ. **
+
+ 1. ----> ǥõ Ŀ Űܺʽÿ.
+
+ 2. Ÿ ϱ , Ŀ ʽÿ.
+
+ 3. x Ű ڸ ʽÿ.
+
+ 4. 2 4 ݺϿ ùٸ ǵ Ͽ ʽÿ.
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. Ȯٸ, Lesson 1.4 ʽÿ.
+
+: ̸ 鼭 ܿ , غ鼭
+ ٶϴ.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.4: ؽƮ - (INSERTION)
+
+
+ ** 忡 i ؽƮ Է ֽϴ. **
+
+ 1. Ŀ ù° ---> ǥõ ٷ Դϴ.
+
+ 2. ù° ι° ٰ Ȱ Դϴ. ؽƮ 
+ ù° Ŀ Ű ϴ.
+
+ 3. i Ű , ʿ Էմϴ.
+
+ 4. Ŀ <ESC> ưϴ.
+ ùٸ 2 4 ݺմϴ.
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5. ؽƮ ϴ ͼٸ, Lesson 1.5 ʽÿ.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.5: ýƮ - ߰ (APPENDING)
+
+
+ ** A Է ؽƮ ߰ ֽϴ. **
+
+ 1. Ŀ ù° ---> ǥõ ٷ Դϴ.
+ Ŀ ִ ϴ.
+
+ 2. A Ű ʿ Էմϴ.
+
+ 3. Է <ESC> ưϴ.
+
+ 4. Ŀ ι° ---> ǥõ ٷ Դϴ.
+ ùٸ 2 3 ݺմϴ.
+
+---> 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. ؽƮ ߰ϴ ͼٸ, Lesson 1.6 ʽÿ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.6:
+
+ ** :wq ̿Ͽ ϰ ֽϴ. **
+
+ !! : Ʒ ִ ܰ踦 ϱ , lesson ü ʽÿ!!
+
+ 1. lesson 1.2 ó :q! ⸦ ֽϴ.
+ , ٸ ͹̳ο ϴٸ, Ʒ ܰ踦 ٸ ͹̳ο غϴ.
+
+ 2. Ʈ Էմϴ: vim tutor <ENTER>
+ 'vim' ɾ, 'tutor' ϰ ϴ
+ ̸ Դϴ.
+
+ 3. տ ó ؽƮ ϰ .
+
+ 4. ɾ ̿ κ ϰ ϴ: :wq <ENTER>
+
+ 5. 1 vimtutor ٰ ٽ Դٸ, Ʒ Ѿ սô.
+
+ 6. ܰ踦 а Ŀ غ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 1
+
+
+ 1. Ŀ ȭǥ Ű hjkl Ű ̿մϴ.
+ h () j (Ʒ) k () l ()
+
+ 2. Ʈ Ϸ vim FILENAME <ENTER>
+
+ 3. ä <ESC> :q! <ENTER>
+ <ESC> :wq <ENTER>
+
+ 4. 忡 Ŀ ġ ڸ x Էմϴ.
+
+ 5. 忡 Ŀ ġ ؽƮ Ϸ
+ i ؽƮ Էϰ <ESC> Ŀ տ մϴ.
+ A ؽƮ Էϰ <ESC> ڿ ߰ մϴ.
+
+: <ESC> ư , ġ ʴ ̳ Էµ
+ ϴ ϴ.
+
+׷ Lesson 2 սô.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.1: (DELETION)
+
+
+ ** ܾ dw ġ ˴ϴ. **
+
+ 1. <ESC> Ű Ȯϰ ɴϴ.
+
+ 2. Ʒ ---> ǥõ Ŀ űϴ.
+
+ 3. ܾ ó Ŀ űϴ.
+
+ 4. dw ļ ܾ ϴ.
+
+ : Ѵ ϸ ȭ ٿ dw ڰ ǥõ˴ϴ.
+ ߸ ƴٸ, <ESC> ٽ Ͻʽÿ.
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. 3, 4 ٽ Ͽ Ȯϰ Lesson 2.2 ʽÿ.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.2: ٸ
+
+ ** d$ ġ ϴ. **
+
+ 1. <ESC> Ű Ȯϰ ɴϴ.
+
+ 2. Ʒ ---> ǥõ Ŀ űϴ.
+
+ 3. ùٸ Ŀ űϴ. (ù° . Դϴ.)
+
+ 4. d$ ļ ϴ.
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+
+ 5.  Ͼ ϱ Lesson 2.3 ʽÿ.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.3: ɰ
+
+
+ d ϴ.
+
+ d
+
+ ⼭:
+ d -
+ - Ʒ õ
+
+ :
+ w - Ŀ ܾ ( .)
+ e - Ŀ ܾ ( .)
+ $ - Ŀ
+
+ , de Ŀ ġ ش ܾ ϴ.
+
+: ȣ ִٸ, 忡 Էغʽÿ.
+ ̾߱ Ͽ Ŀ ̰ ˴ϴ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.4: ݺ ϱ
+
+
+ ** ڸ ־ָ ŭ ݺ ˴ϴ. **
+
+ 1. Ʒ ---> ǥõ Ŀ űϴ.
+
+ 2. 2w ԷϿ Ŀ ܾ ڷ űϴ.
+
+ 3. 3e ԷϿ Ŀ ڷ ° ܾ űϴ.
+
+ 4. 0 (zero) ԷϿ ۺκ Դϴ.
+
+ 5. 2 3 ٸ ڷ ݺ ϴ.
+
+---> This is just a line with words you can move around in.
+
+ 6. Lesson 2.5 ʽÿ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.5: ݺ ϱ
+
+
+ ** ɰ ڸ Բ ϸ ׸ŭ ݺ ˴ϴ. **
+
+ ɰ հ , Ƚ ־ ֽϴ:
+ d Ƚ
+
+ 1. Ʒ ---> ǥõ ٿ Ŀ ù° 빮 ܾ űϴ.
+
+ 2. d2w ԷϿ 빮 ܾ ϴ.
+
+ 3. ̾ 빮 ܾ 1 2 ܰ踦 ̿ Ƚ ٲپ ϴ.
+
+---> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.6: ü ϱ
+
+
+
+ ** dd ġ ü ϴ. **
+
+ ü , Vi , d
+ ι ޾ ġ ֵ Ͽϴ.
+
+ 1. Ŀ Ʒ ܶ ι° ٷ ʽÿ.
+ 2. dd ԷϿ ʽÿ.
+ 3. ׷ ׹° ٷ ʽÿ.
+ 4. 2dd ԷϿ ϴ. ( Ƚ-- ϼ. )
+
+---> 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: (UNDO)
+
+
+ ** u ҵǸ, U ü մϴ. **
+
+ 1. Ŀ ---> ǥõ ٷ ̵ ù° ߸ κ űϴ.
+ 2. x ԷϿ ù° ߸ ڸ ϴ.
+ 3. ׷ u ԷϿ մϴ.
+ 4. ̹ x ̿Ͽ غô.
+ 5. 빮 U · ʽÿ.
+ 6. ̹ u U غô.
+ 7. CTRL-R (CTRL Ű ¿ R )
+ ٽ غô. ( .)
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. ſ մϴ. ׷ Lesson 2 Ѿ սô.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 2
+
+
+ 1. Ŀ ġ ܾ : dw
+ 2. Ŀ ġ : d$
+ 3. ü : dd
+
+ 4. Ƚ Բ ݺ Ű: 2w
+ 5. 忡 ϴ:
+
+ [Ƚ] Ǵ [Ƚ]
+
+ ⼭:
+ Ƚ - ݺ ΰ
+ -  ΰ ( , d )
+ - , w (ܾ), $ ( ) .
+
+ 6. Ŀ ű: 0
+
+ 7. ൿ Ϸ: u (ҹ u)
+ ٿ Ϸ: U (빮 U)
+ ٽ Ϸ: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.1: ̱(PUT)
+
+
+ ** p ԷϿ Ŀ ڿ Դϴ. **
+
+ 1. Ʒ ִ ù ٷ Ŀ ̽ʽÿ.
+
+ 2. dd ԷϿ ۿ մϴ.
+
+ 3. Ʊ ġ *ٷ* Ŀ űϴ.
+
+ 4. 忡, p ԷϿ ڸ űϴ.
+
+ 5. 2 4 ݺϿ ٷ ʽÿ.
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.2: ġȯ(REPLACE)
+
+
+ ** Ŀ Ʒ ϳ ٲٷ, r ٲ ڸ Էմϴ. **
+
+ 1. Ŀ ---> ǥõ ù ٷ űϴ.
+
+ 2. Ŀ ߸ ù κ űϴ.
+
+ 3. r , ߸ κ ڸ Էմϴ.
+
+ 4. 2 3 ݺϿ, ù Ͻʽÿ.
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. Lesson 3.2 ̵սô.
+
+: ܿ , غ鼭 Ѵٴ ʽÿ.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.3: ȯ(CHANGE)
+
+
+ ** ܾ ü ٲٷ, ce ġʽÿ. **
+
+ 1. Ŀ ---> ǥõ ùٷ űϴ.
+
+ 2. Ŀ lubw u ÷ϴ.
+
+ 3. ce ܾ Ȯϰ մϴ. ( , 'ine' Ĩϴ.)
+
+ 4. <ESC> ϴ (Ǿ ù ڷ ϴ.)
+
+ 5. 3 4 ݺϿ ù° ι° ϴ.
+
+---> This lubw has a few wptfd that mrrf changing usf the change command.
+---> This line has a few words that need changing using the change command.
+
+ce ܾ ġȯϴ Ӹ ƴ϶, ֵ Ѵٴ Ϳ
+սô.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.4: c ̿ ٸ ȯ
+
+
+ ** ȯ ̿ ֽϴ. **
+
+ 1. ȯ մϴ. ϴ:
+
+ [Ƚ] c Ǵ c [Ƚ]
+
+ 2. ϴ. w (ܾ), $ ( ) ֽϴ.
+
+ 3. ---> ǥõ ùٷ ̵մϴ.
+
+ 4. ù Ŀ űϴ.
+
+ 5. c$ ԷϿ, ι° ó ǵ <ESC>
+ ʽÿ.
+
+---> 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$ command.
+
+: Էϴ 齺̽ ̿ ֽϴ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 3
+
+
+ 1. ̹ ǵ, p ʽÿ. Ŀ **
+ Դϴ(PUT). ( 쿡 Ŀ ٿ
+ ٽϴ.)
+
+ 2. Ŀ Ʒ ڸ ġȯϷ(REPLACE), r
+ ٲپ ڸ Էմϴ.
+
+ 3. ȯ (CHANGE) Ŀ ٲ ִ
+ Դϴ. , Ŀ ġ ܾ ٲٷ ce
+ Էϸ Ǹ, c$ ٲٴ Դϴ.
+
+ 4. ȯ ϴ:
+
+ [Ƚ] c Ǵ c [Ƚ]
+
+ؼ Lesson սô.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.1: ġ
+
+
+ ** CTRL-G ġ ¸ ֽϴ.
+ G ٷ ̵մϴ. **
+
+ : Ʒ ܰ踦 ϱ , Lesson ü ʽÿ.
+
+ 1. CTRL Ű ¿ g ϴ. ̸ ġ
+ ǥõ ȭ Ʒ ǥõ Դϴ. 3° ܰ踦
+ ȣ ϰ ʽÿ.
+
+: Ŀ ȭ ϴ Ű δٸ,
+ ̴ 'ruler' ɼ õ Դϴ. (:help 'ruler' ϼ.)
+
+ 2. G ̵մϴ.
+ gg κ ̵մϴ.
+
+ 3. Ʊ ߴ ȣ Է G ʽÿ. ̷ ϸ
+ ó CTRL-G ҷ ǵư Դϴ.
+ (ȣ Է , ̰ ȭ鿡 ǥõ ʽϴ.)
+
+ 4. ڽ ٸ, 1 3 غʽÿ.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.2: ã
+
+
+ ** / ˻ ԷϽʽÿ. **
+
+ 1. 忡 / ԷϽʽÿ. : ɿ , ȭ Ʒ
+ / Ŀ ǥõ Դϴ.
+
+ 2. 'errroor' ģ <ENTER> ġʽÿ. ܾ ã մϴ.
+
+ 3. ٽ ã, n ԷϽʽÿ.
+ ݴ ã, Shift-N ԷϽʽÿ.
+
+ 4. ã, / ? ̿ϸ ˴ϴ.
+
+ 5. ִ ư ؼ CTRL-O ̿ϸ ˴ϴ. ݺϸ ε
+ ֽϴ. CTRL-I ٽ ڷ ֽϴ.
+
+---> "errroor" is not the way to spell error; errroor is an error.
+
+: ã ߿ ٴٸ Ǹ, ó ٽ ã ˴ϴ.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.3: ȣ ¦ ã
+
+
+ ** % ), ], } ¦ ãϴ. **
+
+ 1. Ŀ ---> ǥõ (, [, { ϳ ϴ.
+
+ 2. % Է ô.
+
+ 3. Ŀ ¦ ´ ȣ ̵ Դϴ.
+
+ 4. % ԷϿ, ȣ ǵ ɽô.
+
+ 5. Ŀ ٸ (,),[,],{ Ȥ } % Է ϴ.
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+: ¦ ʴ ȣ ִ α׷ ſ մϴ!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.4: ġȯ(SUBTITUTE)
+
+
+ ** :s/old/new/g ϸ 'old' 'new' ġȯ(SUBTITUTE)մϴ. **
+
+ 1. Ŀ ---> ǥõ ٿ ϴ.
+
+ 2. :s/thee/the Է <ENTER> Ĩϴ. ٿ
+ ó ߰ߵ ͸ ٲ۴ٴ Ϳ Ͻʽÿ.
+
+ 3. ̹ :s/thee/the/g Էմϴ. ̴ ü(globally)
+ ġȯѴٴ ǹմϴ.
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. ڿ ġȯϷ մϴ,
+ :#,#s/old/new/g #,# ٹȣ մϴ.
+ :%s/old/new/g ü ߰ߵ ġȯϴ Դϴ.
+ :%s/old/new/gc ü ߰ߵ ã, ġȯ
+ Ʈ մϴ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 4
+
+ 1. CTRL-G ¿ ġ ǥմϴ.
+ G ̵մϴ.
+ G ش ٷ ̵մϴ.
+ gg ù ° ̵մϴ.
+
+ 2. / Է Էϸ Ʒ ãϴ.
+ ? Է Էϸ ãϴ.
+ ˻ , n Էϸ ã,
+ Shift-N Էϸ ݴ ãϴ.
+ CTRL-O ġ, CTRL-I ο ġ Űݴϴ.
+
+ 3. Ŀ (,),[,],{,} % Էϸ ϴ ¦
+ ãưϴ.
+
+ 4.  ٿ ó ϴ old new ٲٷ :s/old/new
+ ٿ ϴ old new ٲٷ :s/old/new/g
+ #,# ̿ ġȯ Ϸ :#,#s/old/new/g
+ ġȯϷ :%s/old/new/g
+ ٲ Ȯ ġ 'c' ٿ :%s/old/new/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.1: ܺ ϴ
+
+
+ ** :! Է Ϸ ԷϽʽÿ. **
+
+ 1. ģ : Էϸ Ŀ ȭ Ʒ ̵մϴ.
+ Է ְ ˴ϴ.
+
+ 2. ! (ǥ) ԷϽʽÿ. ̷ ϸ ܺ
+ ֽϴ.
+
+ 3. ! ls Է <ENTER> ĺʽÿ. Ʈ
+ ó 丮 µ Դϴ. ls ʴ´ٸ
+ :!dir õ ʽÿ.
+
+:  ܺ ɵ ֽϴ.
+
+: : <ENTER> ľ ˴ϴ.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.2: ڼ
+
+
+ ** Ϸ Ϸ, :w FILENAME Ͻʽÿ. **
+
+ 1. :!dir Ǵ :!ls ԷϿ 丮 Ʈ ɴϴ.
+ <ENTER> ľѴٴ ̹ ˰ Դϴ.
+
+ 2. TEST ó ʴ ̸ ϳ ʽÿ.
+
+ 3. :w TEST ԷϽʽÿ. (TEST ̸Դϴ.)
+
+ 4. ̷ ϸ ü TEST ̸ մϴ.
+ ȮϷ, :!dir ٽ ԷϿ, 丮 캸ʽÿ.
+
+: , ٽ Ͽ TEST ,
+ Ϻ 纻 Դϴ.
+
+ 5. ô.
+ (MS-DOS): !del TEST
+ (Unix): !rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.3: ϴ
+
+ ** Ϻθ Ϸ, v :w FILENAME Էմϴ. **
+
+ 1. ٷ Ŀ ɴϴ.
+
+ 2. v Ŀ Ʒ ټ° űϴ. , ڿ ̶Ʈ ָմϴ.
+
+ 3. : ϴ. ȭ ϴܿ :'<,'> Ÿϴ.
+
+ 4. w TEST Էմϴ. ⼭ TEST ̸̸ Ǿ ʽϴ. <ENTER>
+ , :'<,'>w TEST ԷµǾ Ȯ մϴ.
+
+ 5. õ TEST Ͽ Էմϴ. :!dir Ȥ :!ls ̿Ͽ
+ ȮϽʽÿ. ʽÿ! մϴ.
+
+ : v ־(Visual) մϴ. Ŀ ֺ κ
+ ֽϴ. ׸ ɾ ̿ ش ڿ ֽϴ. , d ̿
+ ֽϴ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.4: о̱, ġ
+
+
+ **  Ϸ, :r FILENAME Ͻʽÿ **
+
+ 1. Ŀ ٷ űʽÿ.
+
+: 3° ܰ踦 ϸ, Lesson 5.3 Դϴ. ׷ Ǹ
+ lesson ٽ ʽÿ.
+
+ 2. TEST оԽô. :r TEST Ͻʽÿ. TEST
+ ̸Դϴ. о Ŀ ġ Ʒ ̰ ˴ϴ.
+
+ 3. о鿩 Ȯϱ , ڷ ̵ؼ Ͽ
+ о , ̷ Lesson 5.3 ι ݺǾ ȮϽʽÿ.
+
+: ܺ ɾ ֽϴ. , :r !ls ls ɾ
+ о Ŀ ٷ Ʒ Ĩϴ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 5
+
+
+ 1. :!command ̿Ͽ ܺ մϴ.
+
+ :
+ (MS-DOS) (Unix)
+ :!dir :!ls - 丮 ش.
+ :!del FILENAME :!rm FILENAME - FILENAME̶ .
+
+ 2. :w FILENAME ϸ ϴ FILENAME̶ ̸
+ ũ մϴ.
+
+ 3. v :w FILENAME ־ 忡 õ FILENAME մϴ.
+
+ 4. :r FILENAME ũ FILENAME̶ ҷ鿩 Ŀ ġ
+ ڿ ֽϴ.
+
+ 5. :r !dir dir ɾ Ŀ ġ Ʒ ϴ.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.1: (OPEN)
+
+
+ ** o Ŀ Ʒ 尡 ˴ϴ. **
+
+ 1. Ʒ ---> ǥõ ٷ Ŀ űʽÿ.
+
+ 2. o (ҹ) ļ Ŀ *Ʒ* ϳ ʽÿ. 尡 ˴ϴ.
+
+ 3. ---> ǥõ <ESC> 忡 ʽÿ.
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. Ŀ ** ϳ , ҹ o 빮 O ġ ˴ϴ.
+ Ʒ ִ ٿ ʽÿ.
+
+---> Open up a line above this by typing O while the cursor is on this line.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.2: ߰(APPEND)
+
+
+ ** a Ŀ ** Է ֽϴ. **
+
+ 1. Ŀ ---> ǥõ ù° űϴ.
+
+ 2. e li Ŀ űϴ.
+
+ 3. ҹ a Ŀ Ʒ ** ߰ ֽϴ.
+
+ 4. Ʒٰ ϼ ϴ. <ESC> ̿ (Insert) 带 ϴ.
+
+ 5. e ̿ ĥ ܾ 3 4 ݺմϴ.
+
+: ׷ Ͻø ߰ ϱ i , Ŀ Ʒ
+ ִ ڸ ݺϰ, ְ, <ESC> ƿͼ,
+ Ŀ ű x ϴ ŷο Ͻ
+ ֽϴ.
+
+ 3. ù ϼϽʽÿ. ߰ ؽƮ ԷµǴ ġ ܿ
+ ٴ Ͻʽÿ.
+
+---> This li will allow you to pract appendi text to a line.
+---> This line will allow you to practice appending text to a line.
+
+: a, i ׸ A ؽƮ ԷµǴ ġ ܿ ٴ Ͻʽÿ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.3: ġȯ(REPLACE) ٸ
+
+
+ ** 빮 R Էϸ ϳ ̻ ڸ ٲ ֽϴ. **
+
+ 1. ---> ǥõ ù° ٷ Ŀ xxx űϴ.
+
+ 2. R Է , ι° ٰ ڸ Է xxx ġȯմϴ.
+
+ 3. <ESC> ġȯ 带 ϴ. ״ ִ Ȯմϴ.
+
+ 4. ܰ ݺϿ xxx ġȯմϴ.
+
+---> Adding 123 to xxx gives you xxx.
+---> Adding 123 to 456 gives you 579.
+
+: ġȯ մϴ. Էµ ڵ ڵ ϴ ٸϴ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.4: ٿֱ(COPY AND PASTE)
+
+
+ ** y ̿ ϰ p ٿ ֽϴ. **
+
+ 1. ---> ǥõ ٷ Ŀ "a)" ڷ űϴ.
+
+ 2. v ־ 带 ϰ "first" ٷ ձ Ŀ Դϴ.
+
+ 3. y ̶Ʈ κ (yank (copy))մϴ.
+
+ 4. Ŀ űϴ: j$
+
+ 5. p ڿ ٿ ֽϴ.(paste) ׸ second <ESC> Էմϴ.
+
+ 6. ־ 带 ̿ " item." , y , j$
+ p ܾ ٿ ֽϴ.
+
+---> a) this is the first item.
+ b)
+
+ : y ɾ մϴ. , yw ܾ մϴ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.5: ɼ (SET)
+
+ ** ã⳪ ٲٱ⿡ ҹ ֱ ɼ մϴ **
+
+ 1. ԷϿ 'ignore' ãʽÿ: /ignore <ENTER>
+ n Ű ̿Ͽ ݺϽʽÿ.
+
+ 2. 'ic' (ҹ , Ignore case) ɼ Ͻʽÿ:
+ :set ic
+
+ 3. n Ű 'ignore' ٽ ãƺʽÿ.
+ ignore IGNORE ˻Ǵ ָմϴ.
+
+ 4. 'hlsearch' 'incsearch' ɼ սô.
+ :set hls is
+
+ 5. ã ٽ ԷϿ,  Ͼ Ȯ ʽÿ:
+ /ignore
+
+ 6. ҹ ؼ, Էմϴ:
+ :set noic
+
+: ã (HIGHLIGHT) ַ: :nohlsearch
+: , ˻ ѹ ؼ ҹ ʹٸ \c ̿ ֽϴ.
+ : /ignore\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 6
+
+
+ 1. o Էϸ Ŀ *Ʒ* , Ŀ
+ ġϰ ˴ϴ.
+ 빮 O Էϸ Ŀ ִ ** ˴ϴ.
+
+ 2. a Էϸ Ŀ ** Է ֽϴ.
+ 빮 A Էϸ ڵ ڸ ߰ϰ ˴ϴ.
+
+ 3. e Էϸ ܾ Դϴ.
+
+ 4. y Էϸ (yank (copy)), p Էϸ ٿ ֱⰡ ˴ϴ.
+
+ 5. 빮 R Էϸ <ESC> ٲٱ 尡 ˴ϴ.
+
+ 6. ":set xxx" ϸ "xxx" ɼ ˴ϴ.:
+ 'ic' 'ignorecase' ˻ ҹ ʽϴ.
+ 'is' 'incsearch' ˻ κ ˻ ݴϴ.
+ 'hls' 'hlsearch' ˻ ̶Ʈݴϴ.
+ ɼ ü ̸ Ȥ ̸ մϴ.
+
+ 7. տ "no" ٿ ɼ ֽϴ: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 7.1: ¶
+
+
+ ** ¶ ý ϱ **
+
+ ¶ ý մϴ. ,
+ ϳ õغʽÿ:
+ - <HELP> Ű . (Ű ִ )
+ - <F1> Ű . (Ű ִ )
+ - :help <ENTER> ԷѴ.
+
+ â :q <ENTER> ԷϽʽÿ.
+ CTRL-W CTRL-W ٸ Ѿϴ.
+ :q <ENTER> 츦 ݽϴ.
+
+ ":help" ɿ ڸ ָ  ã ֽϴ.
+ ʽÿ. ( <ENTER> Ű ʽÿ.)
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 7.2: ũƮ
+
+ ** ѱ **
+
+ Vi ξ , κ ⺻ ۵
+ ʽϴ. Ẹ, "vimrc" մϴ.
+
+ 1. "vimrc" սô. ϴ ýۿ ٸϴ:
+ :e ~/.vimrc Unix
+ :e ~/_vimrc MS-Windows
+
+ 2. "vimrc" оԴϴ:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Ͽ մϴ:
+ :w
+
+ ϸ, (syntax highlighting) Դϴ.
+ ϴ "vimrc" Ͽ ־ ֽϴ.
+ ڼ :help vimrc-intro ϼ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7.3: ɾ ϼϱ
+
+
+ ** CTRL-D <TAB> ̿Ͽ ɾ ϼ ֽϴ.**
+
+ 1. vim ȣȯ 尡 ƴ Ȯմϴ: :set nocp
+
+ 2. 丮 ϴ Ȯ մϴ.: :!ls Ȥ :!dir
+
+ 3. ɾ Էմϴ: :e
+
+ 4. CTRL-D "e" ϴ ɾ ֽϴ.
+
+ 5. <TAB> ":edit" ɾ ϼ ϴ.
+
+ 6. ĭ ϳ ߰ , ϴ ̸ κ Էմϴ: :edit FIL
+
+ 7. <TAB> ̸ ϼ ŵϴ.
+
+: ϼϱ ɾ ֽϴ. CTRL-D <TAB> !
+ Ư, :help Դϴ.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7
+
+
+ 1. :help Ȥ <F1> Ȥ <Help> ϴ.
+
+ 2. cmd ؼ :help cmd Էմϴ.
+
+ 3. CTRL-W CTRL-W ̿ ٸ Ѿϴ.
+
+ 4. :q 츦 ɴϴ.
+
+ 5. vimrc ũƮ ̿ ȣϴ ֽϴ.
+
+ 6. : ɾ ԷҶ, CTRL-D ɾ ֽϴ.
+ <TAB> ϼ մϴ.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ ̰ ̸ Ĩϴ. ̴ ⿡ 並
+ ֱ ǵ ۵Ǿ, ⸦ ϱ⿡
+ Դϴ. ̿ʹ ŭ ξ
+ ֽϴ. Ŵ ʽÿ: ":help user-manual"
+
+ ڼ а Ϸ, å õ 帳ϴ:
+ Vim - Vi Improved - by Steve Oualline
+ ǻ: New Riders
+ å ؼ ٷ ֽϴ. Ư ʺڵ鿡 մϴ.
+ ׸ ֽϴ.
+ Ͻʽÿ: https://iccf-holland.org/click5.html
+
+ å å ٴ Vi ٷ , õ
+ մϴ:
+ Learning the Vi Editor - by Linda Lamb
+ ǻ: O'Reilly & Associates Inc.
+ Vi ϰ Ϳ ִ åԴϴ.
+ ° ϰ ֽϴ.
+
+ ̴ Colorado School of Mines Michael C. Pierce
+ Robert K. Ware Colorado State University Charles Smith ̵
+ Ͽ ϴ.
+ . E-mail: bware@mines.colorado.edu.
+
+ Modified for Vim by Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.ko.utf-8 b/runtime/tutor/tutor.ko.utf-8
new file mode 100644
index 0000000..993c43d
--- /dev/null
+++ b/runtime/tutor/tutor.ko.utf-8
@@ -0,0 +1,968 @@
+===============================================================================
+= 빔 길잡이 (VIM Tutor) 에 오신 것을 환영합니다 - Version 1.7 =
+===============================================================================
+
+ 빔(Vim)은 이 길잡이에서 다 설명할 수 없을 만큼 많은 명령을 가진
+ 매우 강력한 편집기입니다. 이 길잡이는 빔을 쉽게 전천후 편집기로 사용할
+ 수 있도록 충분한 명령에 대해 설명하고 있습니다.
+
+ 이 길잡이를 떼는 데에는 실습하는 데에 얼마나 시간을 쓰는 가에 따라서
+ 25-30 분 정도가 걸립니다.
+
+ 이 연습에 포함된 명령은 내용을 고칩니다. 이 파일의 복사본을 만들어서
+ 연습하세요. (vimtutor 를 통해 시작했다면, 이미 복사본을 사용하는
+ 중입니다.)
+
+ 중요한 것은, 이 길잡이가 직접 써보면서 배우도록 고려되어 있다는 것입니다.
+ 명령을 제대로 익히려면, 직접 실행해보는 것이 필요합니다. 내용을 읽는
+ 것만으로는, 명령을 잊어버리게 될 것입니다.
+
+ 자 이제, Caps Lock(Shift-Lock) 키가 눌려있지 않은지 확인해보시고, j 키를
+ 충분히 눌러서 Lesson 1.1이 화면에 가득 차도록 움직여봅시다.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.1: 커서 움직이기
+
+ ** 커서를 움직이려면, 표시된 대로 h,j,k,l 키를 누르십시오. **
+ ^
+ k 힌트: h 키는 왼쪽에 있으며, 왼쪽으로 움직입니다.
+ < h l > l 키는 오른쪽에 있으며, 오른쪽으로
+ j 움직입니다.
+ v j 키는 아래방향 화살표처럼 생겼습니다.
+
+ 1. 익숙해질 때까지 커서를 스크린 상에서 움직여 보십시오.
+
+ 2. 아래 방향키 (j)를 반복입력이 될 때까지 누르고 계십시오.
+ 이제 다음 lesson으로 가는 방법을 알게 되었습니다.
+
+ 3. 아래 방향키를 이용하여, Lesson 1.2 로 가십시오.
+
+참고: 원하지 않는 무언가가 입력이 되었다면, <ESC>를 눌러서, 명령 모드로
+ 돌아가십시오. 그 후에 원하는 명령을 다시 입력하십시오.
+
+참고: 커서키 또한 작동할 것입니다. 하지만 hjkl에 익숙해지면, 커서키보다
+ 훨씬 빠르게 이동할 수 있을 것입니다. 정말요!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.2: 빔을 시작하고 끝내기
+
+
+ !! 주의: 아래 있는 단계를 실행하기 전에, 이 lesson 전체를 읽으십시오!!
+
+ 1. <ESC> 키를 눌러서 확실하게 명령 모드로 빠져 나옵니다.
+
+ 2. 다음과 같이 입력합니다: :q! <ENTER>
+ 이렇게 하면, 바뀐 내용을 *저장하지 않고* 편집기를 빠져나갑니다.
+
+ 3. 쉘 프롬프트가 보인다면, 다시 길잡이로 돌아오기 위해 다음과 같이
+ 입력합니다.
+ vimtutor <ENTER>
+ 또는 다음과 같을 수도 있습니다.
+ vim tutor.ko <ENTER>
+
+---> 'vim' 은 빔 편집기로 들어가는 것을 뜻하며, 'tutor.ko'는 편집하려는
+ 파일을 뜻합니다.
+
+ 4. 위에서 이야기한 단계를 기억하였으며, 확신이 서면, 1에서 3까지를
+ 수행하여 편집기를 나갔다가 다시 들어와 보십시오.
+
+주의: :q! <ENTER> 는 바뀐 내용을 저장하지 않습니다. 이 후 lesson에서
+ 어떻게 편집 내용을 저장하는지 배울 수 있습니다.
+
+ 5. 그 후 커서를 아래로 움직여 Lesson 1.3 으로 가십시오.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.3: 텍스트 편집 - 지우기
+
+
+** 명령 모드에서 x 를 누르면 커서가 위치한 곳의 글자를 지울 수 있습니다. **
+
+ 1. ----> 로 표시된 곳으로 커서를 옮겨보십시오.
+
+ 2. 오타를 수정하기 위해, 커서를 지울 글자 위로 움직여 보십시오.
+
+ 3. x 키를 눌러서 지워야할 글자를 지우십시오.
+
+ 4. 2에서 4까지를 반복하여 문장이 올바르게 되도록 하여 보십시오.
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. 문장이 정확해졌다면, Lesson 1.4로 가십시오.
+
+주의: 이 길잡이를 보면서 외우려고 하지말고, 직접 사용해보면서 익히길
+ 바랍니다.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.4: 텍스트 편집 - 삽입 (INSERTION)
+
+
+ ** 명령 모드에서 i 를 누르면 텍스트를 입력할 수 있습니다. **
+
+ 1. 커서를 첫번째 ---> 로 표시된 줄로 움직입니다.
+
+ 2. 첫번째 줄을 두번째 줄과 똑같이 만들것입니다. 텍스트가 들어가야할
+ 곳 다음부터 첫번째 글자 위에 커서를 옮겨 놓습니다.
+
+ 3. i 키를 누른 후, 필요한 내용을 입력합니다.
+
+ 4. 수정한 후에는 <ESC> 를 눌러서 명령 모드로 돌아갑니다.
+ 문장을 올바르게 만들기 위해 2에서 4의 과정을 반복합니다.
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5. 텍스트를 삽입하는 데에 익숙해졌다면, Lesson 1.5로 가십시오.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.5: 택스트 편집 - 추가 (APPENDING)
+
+
+ ** A 를 입력해 텍스트를 추가할 수 있습니다. **
+
+ 1. 커서를 첫번째 ---> 로 표시된 줄로 움직입니다.
+ 커서가 문장 내 어디에 있던 상관없습니다.
+
+ 2. A 키를 눌러 필요한 내용을 입력합니다.
+
+ 3. 내용을 모두 입력한 후 <ESC>를 눌러 명령 모드로 돌아갑니다.
+
+ 4. 커서를 두번째 ---> 로 표시된 줄로 움직입니다.
+ 문장을 올바르게 만들기 위해 2에서 3의 과정을 반복합니다.
+
+---> 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. 텍스트를 추가하는 데 익숙해졌다면, Lesson 1.6으로 가십시오.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.6: 파일 편집
+
+ ** :wq 를 이용하여 파일을 저장하고 빠져나갈 수 있습니다. **
+
+ !! 주의: 아래 있는 단계를 실행하기 전에, 이 lesson 전체를 읽으십시오!!
+
+ 1. lesson 1.2에서 배웠던 것처럼 :q!로 편집기를 나갈 수 있습니다.
+ 만약, 다른 터미널에 접근 가능하다면, 아래의 단계를 다른 터미널에서 해봅니다.
+
+ 2. 쉘 프롬프트에 다음과 같이 입력합니다: vim tutor <ENTER>
+ 'vim' 은 빔 에디터 시작을 위한 명령어, 'tutor'는 수정하고자 하는
+ 파일의 이름 입니다.
+
+ 3. 앞에서 배웠던 것처럼 텍스트를 삽입하고 지워보세요.
+
+ 4. 다음 명령어를 이용해 파일 수정 부분을 저장하고 빠져나갑니다: :wq <ENTER>
+
+ 5. 만약 1에서 vimtutor를 빠져나갔다가 다시 들어왔다면, 아래로 움직여 요약으로 넘어가도록 합시다.
+
+ 6. 위 모든 단계를 다 읽고 이해한 후에 직접 해보세요.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 1 요약
+
+
+ 1. 커서를 움직일 때에는 화살표 키나 hjkl 키를 이용합니다.
+ h (왼쪽) j (아래) k (위) l (오른쪽)
+
+ 2. 쉘 프롬프트에서 빔을 시작하려면 vim FILENAME <ENTER>
+
+ 3. 수정한 내용을 무시한 채로 빔에서 빠져나가려면 <ESC> :q! <ENTER>
+ 저장한 후 빔에서 빠져나가려면 <ESC> :wq <ENTER>
+
+ 4. 명령 모드에서 커서가 위치한 곳의 글자를 지우려면 x 를 입력합니다.
+
+ 5. 명령 모드에서 커서가 위치한 곳에 텍스트를 삽입하려면
+ i 를 누른 후 텍스트를 입력하고 <ESC> 커서 앞에 삽입합니다.
+ A 를 누른 후 텍스트를 입력하고 <ESC> 문장 뒤에 추가 합니다.
+
+참고: <ESC>는 명령 모드로 돌아가는 데 쓰며, 원치 않는 명령이나 완전히 입력되지
+ 않은 명령을 취소하는 데에도 씁니다.
+
+그럼 Lesson 2를 시작합시다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.1: 삭제(DELETION) 명령
+
+
+ ** 한 단어를 끝까지 지우려면 dw 라고 치면 됩니다. **
+
+ 1. <ESC> 키를 눌러서 확실하게 명령 모드로 빠져 나옵니다.
+
+ 2. 아래에 ---> 로 표시된 줄 까지 커서를 옮깁니다.
+
+ 3. 지워야할 단어의 처음으로 커서를 옮깁니다.
+
+ 4. dw 라고 쳐서 그 단어를 지웁니다.
+
+ 주의: 위에서 말한대로 하면 화면의 마지막 줄에 dw 라는 글자가 표시됩니다.
+ 잘못 쳤다면, <ESC> 를 눌러서 다시 시작하십시오.
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. 3, 4번 과정을 다시 하여 문장을 정확하게 만든 뒤 Lesson 2.2로 가십시오.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.2: 다른 삭제 명령
+
+ ** d$ 라고 치면 그 줄 끝까지 지워집니다. **
+
+ 1. <ESC> 키를 눌러서 확실하게 명령 모드로 빠져 나옵니다.
+
+ 2. 아래에 ---> 로 표시된 줄 까지 커서를 옮깁니다.
+
+ 3. 올바른 줄의 끝으로 커서를 옮깁니다. (첫번째로 나오는 . 다음입니다.)
+
+ 4. d$ 라고 쳐서 줄 끝까지 지웁니다.
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+
+ 5. 어떤 일이 일어났는지 이해하기 위해 Lesson 2.3 으로 가십시오.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.3: 명령과 적용 대상에 대해
+
+
+ 삭제 명령 d의 형식은 다음과 같습니다.
+
+ d 대상
+
+ 여기서:
+ d - 지우는 명령
+ 대상 - 아래에 제시된 대상에 대해 명령을 수행
+
+ 적용 가능한 대상의 종류:
+ w - 커서에서 그 단어의 끝까지 (공백 포함.)
+ e - 커서에서 그 단어의 끝까지 (공백을 포함하지 않음.)
+ $ - 커서에서 그 줄의 끝까지
+
+ 예를 들어, de 는 커서의 위치부터 해당 단어의 끝까지 지웁니다.
+
+참고: 호기심이 있다면, 명령 모드에서 명령 없이 대상을 입력해보십시오.
+ 위에서 이야기한 대상의 목록에 따라 커서가 움직이게 됩니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.4: 대상에 반복 적용하기
+
+
+ ** 대상 이전에 숫자를 넣어주면 그 만큼 반복 됩니다. **
+
+ 1. 아래에 ---> 로 표시된 줄 까지 커서를 옮깁니다.
+
+ 2. 2w 입력하여 커서를 단어 두 개 뒤로 옮깁니다.
+
+ 3. 3e 입력하여 커서를 뒤로 세 번째 단어의 끝으로 옮깁니다.
+
+ 4. 0 (zero) 를 입력하여 문장의 시작부분으로 움직입니다.
+
+ 5. 2에서 3까지를 다른 숫자로 반복해 봅니다.
+
+---> This is just a line with words you can move around in.
+
+ 6. Lesson 2.5로 가십시오.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.5: 삭제에 반복 적용하기
+
+
+ ** 명령과 숫자를 함께 사용하면 그만큼 반복 수행 됩니다. **
+
+ 위에서 삭제 명령과 대상의 조합과 같이, 대상 이전에 횟수를 넣어 더 많이 삭제 할 수 있습니다:
+ d 횟수 대상
+
+ 1. 아래 ---> 표시된 줄에서 커서를 첫번째 대문자 단어로 옮깁니다.
+
+ 2. d2w를 입력하여 두 대문자 단어를 지웁니다.
+
+ 3. 이어지는 대문자 단어들을 1에서 2까지의 단계를 이용해 횟수를 바꾸어 삭제해 봅니다.
+
+---> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.6: 줄 전체 조작하기
+
+
+
+ ** dd 라고 치면 줄 전체를 지웁니다. **
+
+ 줄 전체를 지우는 일이 잦기 때문에, Vi를 디자인 한 사람들은, 간단히 d를
+ 두번 연달아 치면 한 줄을 지울 수 있도록 하였습니다.
+
+ 1. 커서를 아래 나온 단락의 두번째 줄로 가져가십시오.
+ 2. dd 를 입력하여 그 줄을 지우십시오.
+ 3. 그런 다음 네번째 줄로 가십시오.
+ 4. 2dd 라고 입력하여 두줄을 지웁니다. ( 횟수-명령-대상을 기억하세요. )
+
+---> 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: 취소(UNDO) 명령
+
+
+ ** u 를 누르면 마지막 명령이 취소되며, U 는 줄 전체를 수정합니다. **
+
+ 1. 커서를 ---> 로 표시된 줄로 이동한 후 첫번째 잘못된 부분 위로 옮깁니다.
+ 2. x 를 입력하여 첫번째 잘못된 글자를 지웁니다.
+ 3. 그럼 이제 u 를 입력하여 마지막으로 수행된 명령을 취소합니다.
+ 4. 이번에는 x 명령을 이용하여 그 줄의 모든 에러를 수정해봅시다.
+ 5. 대문자 U 를 눌러서 그 줄을 원래 상태로 돌려놓아 보십시오.
+ 6. 이번에는 u 를 몇 번 눌러서 U 와 이전 명령을 취소해봅시다.
+ 7. CTRL-R (CTRL 키를 누른 상태에서 R을 누르는 것) 을 몇 번 눌러서
+ 명령을 다시 실행해봅시다. (취소한 것을 취소함.)
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. 이 명령은 매우 유용합니다. 그럼 Lesson 2 요약으로 넘어가도록 합시다.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 2 요약
+
+
+ 1. 커서가 위치한 곳부터 단어의 끝까지 지우려면: dw
+ 2. 커서가 위치한 곳부터 줄 끝까지 지우려면: d$
+ 3. 줄 전체를 지우려면: dd
+
+ 4. 횟수와 함께 대상을 반복 시키려면: 2w
+ 5. 명령 모드에서 내리는 명령의 형식은 다음과 같습니다:
+
+ [횟수] 명령 대상 또는 명령 [횟수] 대상
+
+ 여기서:
+ 횟수 - 그 명령을 몇 번 반복할 것인가
+ 명령 - 어떤 명령을 내릴 것인가 ( 예를 들어, 삭제인 경우는 d )
+ 대상 - 명령이 동작할 대상, 예를 들어 w (단어), $ (줄의 끝) 등.
+
+ 6. 커서를 문장 맨 앞으로 옮기려면: 0
+
+ 7. 이전 행동을 취소하려면: u (소문자 u)
+ 한 줄에서 수정한 것을 모두 취소하려면: U (대문자 U)
+ 취소한 것을 다시 실행하려면: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.1: 붙이기(PUT) 명령
+
+
+ ** p 를 입력하여 마지막으로 지운 내용을 커서 뒤에 붙입니다. **
+
+ 1. 아래에 있는 문단의 첫 줄로 커서를 움직이십시오.
+
+ 2. dd 를 입력하여 그 줄을 지워서 빔의 버퍼에 저장합니다.
+
+ 3. 아까 지운 줄이 가야할 위치의 *윗줄로* 커서를 옮깁니다.
+
+ 4. 명령 모드에서, p 를 입력하여 그 줄을 제대로 된 자리로 옮깁니다.
+
+ 5. 2에서 4를 반복하여 모든 줄의 순서를 바로 잡으십시오.
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.2: 치환(REPLACE) 명령
+
+
+ ** 커서 아래의 글자 하나를 바꾸려면, r 을 누른 후 바꿀 글자를 입력합니다. **
+
+ 1. 커서를 ---> 로 표시된 첫 줄로 옮깁니다.
+
+ 2. 커서를 잘못된 첫 부분으로 옮깁니다.
+
+ 3. r 을 누른 후, 잘못된 부분을 고쳐 쓸 글자를 입력합니다.
+
+ 4. 2에서 3의 과정을 반복하여, 첫 줄의 오류를 수정하십시오.
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. Lesson 3.2 로 이동합시다.
+
+주의: 외우지 말고, 직접 해보면서 익혀야 한다는 것을 잊지 마십시오.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.3: 변환(CHANGE) 명령
+
+
+ ** 한 단어의 전체를 바꾸려면, ce 를 치십시오. **
+
+ 1. 커서를 ---> 로 표시된 첫줄로 옮깁니다.
+
+ 2. 커서를 lubw 에서 u 위에 올려놓습니다.
+
+ 3. ce 라고 명령한 후 단어를 정확하게 수정합니다. (이 경우, 'ine' 를 칩니다.)
+
+ 4. <ESC> 를 누른 후 다음 에러로 갑니다 (수정되어야할 첫 글자로 갑니다.)
+
+ 5. 3에서 4의 과정을 반복하여 첫번째 문장을 두번째 문장과 같도록 만듭니다.
+
+---> This lubw has a few wptfd that mrrf changing usf the change command.
+---> This line has a few words that need changing using the change command.
+
+ce 는 단어를 치환하는 것 뿐만 아니라, 내용을 삽입할 수 있도록 한다는 것에
+유의합시다.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.4: c 를 이용한 다른 변환 명령
+
+
+ ** 변환 명령은 삭제할 때 이용한 대상에 대해 적용할 수 있습니다. **
+
+ 1. 변환 명령은 삭제와 동일한 방식으로 동작합니다. 형식은 다음과 같습니다:
+
+ [횟수] c 대상 또는 c [횟수] 대상
+
+ 2. 적용 가능한 대상 역시 같습니다. w (단어), $ (줄의 끝) 등이 있습니다.
+
+ 3. ---> 로 표시된 첫줄로 이동합니다.
+
+ 4. 첫 에러 위로 커서를 옮깁니다.
+
+ 5. c$ 를 입력하여, 그 줄의 나머지가 두번째 줄처럼 되도록 수정한 후 <ESC> 를
+ 누르십시오.
+
+---> 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$ command.
+
+참고: 입력하는 동안은 백스페이스를 이용할 수 있습니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 3 요약
+
+
+ 1. 이미 지운 내용을 되돌리려면, p 를 누르십시오. 이 명령은 커서 *다음에*
+ 지워진 내용을 붙입니다(PUT). (한 줄을 지운 경우에는 커서 다음 줄에
+ 지워진 내용이 붙습니다.)
+
+ 2. 커서 아래의 글자를 치환하려면(REPLACE), r 을 누른 후 원래 글자 대신
+ 바꾸어 넣을 글자를 입력합니다.
+
+ 3. 변환 명령(CHANGE)은 커서에서 부터 지정한 대상의 끝까지 바꿀 수 있는
+ 명령입니다. 예를 들어, 커서 위치에서 단어의 끝까지 바꾸려면 ce 를
+ 입력하면 되며, c$ 는 줄 끝까지 바꾸는 데 쓰입니다.
+
+ 4. 변환 명령의 형식은 다음과 같습니다:
+
+ [횟수] c 대상 또는 c [횟수] 대상
+
+계속해서 다음 Lesson 을 진행합시다.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.1: 위치와 파일의 상태
+
+
+ ** CTRL-G 를 누르면 파일 내에서의 현재 위치와 파일의 상태를 볼 수 있습니다.
+ G 를 누르면 파일 내의 마지막 줄로 이동합니다. **
+
+ 주의: 아래의 단계를 따라하기 전에, 이 Lesson 전체를 먼저 읽으십시오.
+
+ 1. CTRL 키를 누른 상태에서 g 를 누릅니다. 파일 이름과 현재 위치한 줄이
+ 표시된 상태줄이 화면 아래에 표시될 것입니다. 3번째 단계를 위해 그
+ 줄 번호를 기억하고 계십시오.
+
+참고: 커서가 화면 오른쪽 하단으로 옮겨진 것을 보인다면,
+ 이는 'ruler' 옵션을 세팅된 경우 입니다. (:help 'ruler' 를 참고 하세요.)
+
+ 2. G 를 누르면 파일의 마지막으로 이동합니다.
+ gg 를 누르면 파일의 시작 부분으로 이동합니다.
+
+ 3. 아까 기억했던 줄 번호를 입력한 후 G 를 누르십시오. 이렇게 하면
+ 처음에 CTRL-G 를 눌렀던 장소로 되돌아가게 될 것입니다.
+ (번호를 입력할 때, 이것은 화면에 표시되지 않습니다.)
+
+ 4. 자신이 생겼다면, 1에서 3까지를 실행해보십시오.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.2: 찾기 명령
+
+
+ ** / 를 누른 후 검색할 문구를 입력하십시오. **
+
+ 1. 명령 모드에서 / 를 입력하십시오. : 명령에서와 마찬가지로, 화면 아래에
+ / 와 커서가 표시될 것입니다.
+
+ 2. 'errroor' 라고 친 후 <ENTER> 를 치십시오. 이 단어를 찾으려고 합니다.
+
+ 3. 같은 문구를 다시 찾으려면, 간단히 n 을 입력하십시오.
+ 같은 문구를 반대 방향으로 찾으려면, Shift-N 을 입력하십시오.
+
+ 4. 문구를 역방향으로 찾으려면, / 대신 ? 를 이용하면 됩니다.
+
+ 5. 원래 있던 곳으로 돌아가기 위해서는 CTRL-O 를 이용하면 됩니다. 반복하면 더 이전으로도
+ 갈 수 있습니다. CTRL-I 로 다시 뒤로 갈 수도 있습니다.
+
+---> "errroor" is not the way to spell error; errroor is an error.
+
+참고: 찾는 중에 파일의 끝에 다다르게 되면, 파일의 처음부터 다시 찾게 됩니다.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.3: 괄호의 짝 찾기
+
+
+ ** % 를 눌러서 ), ], } 의 짝을 찾습니다. **
+
+ 1. 커서를 ---> 로 표시된 줄의 (, [, { 중 하나에 가져다 놓습니다.
+
+ 2. % 를 입력해 봅시다.
+
+ 3. 커서가 짝이 맞는 괄호로 이동할 것입니다.
+
+ 4. % 를 입력하여, 이전 괄호로 되돌아 옵시다.
+
+ 5. 커서를 다른 (,),[,],{ 혹은 } 로 움직여 % 를 입력해 봅니다.
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+참고: 짝이 맞지 않는 괄호가 있는 프로그램을 디버깅할 때에 매우 유용합니다!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.4: 치환(SUBTITUTE) 명령
+
+
+ ** :s/old/new/g 하면 'old' 를 'new' 로 치환(SUBTITUTE)합니다. **
+
+ 1. 커서를 ---> 로 표시된 줄에 가져다 놓습니다.
+
+ 2. :s/thee/the 를 입력한 후 <ENTER> 를 칩니다. 이 명령은 그 줄에서
+ 처음으로 발견된 것만 바꾼다는 것에 주의하십시오.
+
+ 3. 이번에는 :s/thee/the/g 를 입력합니다. 이는 그 줄 전체(globally)를
+ 치환한다는 것을 의미합니다.
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. 두 줄 사이의 모든 문자열에 대해 치환하려면 다음과 같이 합니다,
+ :#,#s/old/new/g #,# 는 두 줄의 줄번호를 뜻합니다.
+ :%s/old/new/g 파일 전체에서 발견된 모든 것을 치환하는 경우입니다.
+ :%s/old/new/gc 파일 전체에서 발견된 모든 것을 찾고, 치환할지 안
+ 할지 프롬프트로 명령합니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 4 요약
+
+ 1. CTRL-G 파일의 상태와 파일 내에서의 현재 위치를 표시합니다.
+ G 파일의 끝으로 이동합니다.
+ 숫자 G 해당 줄로 이동합니다.
+ gg 첫 번째 라인으로 이동합니다.
+
+ 2. / 를 입력한 후 문구를 입력하면 그 문구를 아랫방향으로 찾습니다.
+ ? 를 입력한 후 문구를 입력하면 윗방향으로 찾습니다.
+ 검색 후, n 을 입력하면 같은 방향으로 다음 문구를 찾으며,
+ Shift-N 을 입력하면 반대 방향으로 찾습니다.
+ CTRL-O 는 과거의 위치로, CTRL-I는 새로운 위치로 옮겨줍니다.
+
+ 3. 커서가 (,),[,],{,} 위에 있을 때에 % 를 입력하면 상응하는 짝을
+ 찾아갑니다.
+
+ 4. 어떤 줄에 처음 등장하는 old를 new로 바꾸려면 :s/old/new
+ 한 줄에 등장하는 모든 old를 new로 바꾸려면 :s/old/new/g
+ 두 줄 #,# 사이에서 치환을 하려면 :#,#s/old/new/g
+ 파일 내의 모든 문구를 치환하려면 :%s/old/new/g
+ 바꿀 때마다 확인을 거치려면 'c'를 붙여서 :%s/old/new/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.1: 외부 명령 실행하는 방법
+
+
+ ** :! 을 입력한 후 실행하려는 명령을 입력하십시오. **
+
+ 1. 친숙한 명령인 : 를 입력하면 커서가 화면 아래로 이동합니다. 명령을
+ 입력할 수 있게 됩니다.
+
+ 2. 이제 ! (느낌표) 를 입력하십시오. 이렇게 하면 외부 쉘 명령을 실행할
+ 수 있습니다.
+
+ 3. 시험삼아 ! 다음에 ls 를 입력한 후 <ENTER> 를 쳐보십시오. 쉘 프롬프트
+ 에서처럼 디렉토리의 목록이 출력될 것입니다. ls 가 동작하지 않는다면
+ :!dir 을 시도해 보십시오.
+
+참고: 어떤 외부 명령도 이 방법으로 실행할 수 있습니다.
+
+참고: 모든 : 명령은 <ENTER> 를 쳐야 마무리 됩니다.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.2: 보다 자세한 파일 저장
+
+
+ ** 수정된 내용을 파일로 저장하려면, :w FILENAME 하십시오. **
+
+ 1. :!dir 또는 :!ls 를 입력하여 디렉토리의 리스트를 얻어옵니다.
+ 위의 명령 후 <ENTER>를 쳐야한다는 것은 이미 알고 있을 것입니다.
+
+ 2. TEST 처럼 존재하지 않는 파일 이름을 하나 고르십시오.
+
+ 3. 이제 :w TEST 라고 입력하십시오. (TEST는 당신이 선택한 파일 이름입니다.)
+
+ 4. 이렇게 하면 빔 길잡이 파일 전체를 TEST라는 이름으로 저장합니다.
+ 확인하려면, :!dir 을 다시 입력하여, 디렉토리를 살펴보십시오.
+
+참고: 빔을 종료한 후, 빔을 다시 실행하여 TEST라는 파일을 열면, 그 파일은
+ 저장했을 때와 완벽히 같은 복사본일 것입니다.
+
+ 5. 이제 그 파일을 지웁시다.
+ (MS-DOS에서): !del TEST
+ (Unix에서): !rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.3: 선택적으로 저장하는 명령
+
+ ** 파일의 일부를 저장하려면, v 대상 :w FILENAME 을 입력합니다. **
+
+ 1. 이 줄로 커서를 가져옵니다.
+
+ 2. v 를 누르고 커서를 아래 다섯번째로 옮깁니다. 이 때, 문자열들이 하이라이트 됨을 주목합니다.
+
+ 3. : 를 누릅니다. 화면 하단에 :'<,'> 가 나타납니다.
+
+ 4. w TEST 를 입력합니다. 여기서 TEST는 파일 이름이며 아직 생성되어 있지 않습니다. <ENTER>를
+ 누르기 전, :'<,'>w TEST 로 입력되었는지 확인 합니다.
+
+ 5. 빔은 선택된 문장들을 TEST 파일에 입력합니다. :!dir 혹은 :!ls를 이용하여 파일이 만들어졌는지
+ 확인하십시오. 아직 삭제하지 마십시오! 다음 레슨에서 이 파일을 사용합니다.
+
+참고 : v 를 눌러 비주얼(Visual) 선택을 시작합니다. 커서를 주변으로 움직여 선택 부분을 조절할 수
+ 있습니다. 그리고 명령어를 이용해 해당 문자열을 조작할 수 있습니다. 예를 들어, d 를 이용해
+ 삭제할 수도 있습니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.4: 파일 읽어들이기, 합치기
+
+
+ ** 어떤 파일의 내용을 삽입하려면, :r FILENAME 하십시오 **
+
+ 1. 커서를 이 라인 바로 위로 옮기십시오.
+
+주의: 3번째 단계를 실행하면, Lesson 5.3 을 보게 될 것입니다. 그렇게 되면
+ 이 lesson으로 다시 내려오십시오.
+
+ 2. 이제 TEST 파일을 읽어들입시다. :r TEST 명령을 사용하십시오. TEST 는
+ 파일의 이름입니다. 읽어들인 파일은 커서가 위치한 문장 아래부터 놓이게 됩니다.
+
+ 3. 파일이 읽어들여진 것을 확인하기 위해, 뒤로 이동해서 기존 버전과 파일에서
+ 읽어들인 버전, 이렇게 Lesson 5.3 이 두번 반복되었음을 확인하십시오.
+
+참고: 외부 명령어의 결과값도 읽을 수 있습니다. 예를 들어, :r !ls 는 ls 명령어에 대한 결과값을
+ 읽어 커서 바로 아래에 합칩니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 5 요약
+
+
+ 1. :!command 를 이용하여 외부 명령을 실행합니다.
+
+ 유용한 예:
+ (MS-DOS) (Unix)
+ :!dir :!ls - 디렉토리의 목록을 보여준다.
+ :!del FILENAME :!rm FILENAME - FILENAME이라는 파일을 지운다.
+
+ 2. :w FILENAME 하면 현재 빔에서 사용하는 파일을 FILENAME이라는 이름으로
+ 디스크에 저장합니다.
+
+ 3. v 명령 :w FILENAME 은 비주얼 모드에서 선택된 문장들을 파일 FILENAME에 저장합니다.
+
+ 4. :r FILENAME 은 디스크에서 FILENAME이라는 파일을 불러들여서 커서 위치
+ 뒤에 현재 파일을 집어넣습니다.
+
+ 5. :r !dir 는 dir 명령어의 결과값을 현재 커서의 위치 아래에 붙힙니다.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.1: 새 줄 열기(OPEN) 명령
+
+
+ ** o 를 누르면 커서 아래에 줄을 만들고 편집 모드가 됩니다. **
+
+ 1. 아래에 ---> 로 표시된 줄로 커서를 옮기십시오.
+
+ 2. o (소문자)를 쳐서 커서 *아래에* 줄을 하나 여십시오. 편집 모드가 됩니다.
+
+ 3. ---> 로 표시된 줄을 복사한 후 <ESC> 를 눌러서 편집 모드에서 나오십시오.
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. 커서 *위에* 줄을 하나 만드려면, 소문자 o 대신 대문자 O 를 치면 됩니다.
+ 아래 있는 줄에 대해 이 명령을 내려보십시오.
+
+---> Open up a line above this by typing O while the cursor is on this line.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.2: 추가(APPEND) 명령
+
+
+ ** a 를 누르면 커서 *다음에* 글을 입력할 수 있습니다. **
+
+ 1. 커서를 ---> 로 표시된 첫번째 줄의 끝으로 옮깁니다.
+
+ 2. e 를 눌러 li 의 끝으로 커서를 옮깁니다.
+
+ 3. 소문자 a 를 커서 아래 글자 *다음*에 글을 추가할 수 있습니다.
+
+ 4. 아랫줄과 같이 문장을 완성해 봅니다. <ESC>를 이용해 편집(Insert) 모드를 나갑니다.
+
+ 5. e 를 이용해 다음 고칠 단어로 움직여 3에서 4까지를 반복합니다.
+
+참고: 그렇게 하시면 고작 줄의 끝에 추가를 하기 위해 i를 누르고, 커서 아래에
+ 있던 글자를 반복하고, 글을 끼워넣고, <ESC>를 눌러 명령 모드로 돌아와서,
+ 커서를 오른쪽으로 옮기고 마지막으로 x까지 눌러야 하는 번거로움을 피하실
+ 수 있습니다.
+
+ 3. 이제 첫 줄을 완성하십시오. 추가 명령은 텍스트가 입력되는 위치 외에는
+ 편집 모드와 완전히 같다는 것을 유념하십시오.
+
+---> This li will allow you to pract appendi text to a line.
+---> This line will allow you to practice appending text to a line.
+
+참고: a, i 그리고 A 는 텍스트가 입력되는 위치 외에는 편집 모드와 완전히 같다는 것을 유념하십시오.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.3: 치환(REPLACE) 의 다른 버전
+
+
+ ** 대문자 R 을 입력하면 하나 이상의 글자를 바꿀 수 있습니다. **
+
+ 1. ---> 로 표시된 첫번째 줄로 움직여 커서를 xxx의 앞으로 옮깁니다.
+
+ 2. R 을 입력한 후, 두번째 줄과 같은 숫자를 입력해 xxx를 치환합니다.
+
+ 3. <ESC> 를 눌러 치환 모드를 빠져나갑니다. 나머지 문장은 그대로 남아 있는지 확인합니다.
+
+ 4. 위 단계들 반복하여 남은 모든 xxx를 치환합니다.
+
+---> Adding 123 to xxx gives you xxx.
+---> Adding 123 to 456 gives you 579.
+
+주의: 치환 모드는 편집 모드와 비슷합니다. 하지만 입력된 문자들이 원래 문자들을 삭제하는 점이 다릅니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.4: 문자 복사 붙여넣기(COPY AND PASTE)
+
+
+ ** y 를 이용해 복사하고 p 로 붙여 넣습니다. **
+
+ 1. ---> 로 표시된 줄로 움직여 커서를 "a)" 뒤로 옮깁니다.
+
+ 2. v 를 눌러 비주얼 모드를 시작하고 "first" 바로 앞까지 커서를 움직입니다.
+
+ 3. y 를 눌러 하이라이트 된 부분을 복사(yank (copy))합니다.
+
+ 4. 커서를 다음 문장의 끝으로 옮깁니다: j$
+
+ 5. p 를 눌러 문자열을 붙여 넣습니다.(paste) 그리고 second <ESC> 를 입력합니다.
+
+ 6. 비주얼 모드를 이용해 " item."을 선택, y 로 복사, j$ 으로 다음 문장 끝으로 움직여
+ p 로 단어를 붙여 넣습니다.
+
+---> a) this is the first item.
+ b)
+
+ 참고: y 역시 명령어로 사용 가능합니다. 예를 들어, yw 는 한 단어를 복사합니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.5: 옵션 설정(SET)
+
+ ** 찾기나 바꾸기에서 대소문자 구분을 없애기 위해 옵션을 설정합니다 **
+
+ 1. 다음을 입력하여 'ignore' 를 찾으십시오: /ignore <ENTER>
+ n 키를 이용하여 여러번 반복하십시오.
+
+ 2. 'ic' (대소문자 구별 안함, Ignore case) 옵션을 설정하십시오:
+ :set ic
+
+ 3. n 키를 눌러서 'ignore' 를 다시 찾아보십시오.
+ 이제 ignore과 IGNORE 모두 검색되는 점을 주목합니다.
+
+ 4. 'hlsearch' 와 'incsearch' 옵션을 설정합시다.
+ :set hls is
+
+ 5. 찾기 명령을 다시 입력하여, 어떤 일이 일어나는지 확인해 보십시오:
+ /ignore
+
+ 6. 대소문자 구별을 끄기 위해서는, 다음과 같이 입력합니다:
+ :set noic
+
+참고: 찾은 내용이 강조(HIGHLIGHT)된 것을 없애려면: :nohlsearch
+참고: 만약, 검색 한번에 대해서만 대소문자 구별 세팅을 끄고 싶다면 \c 를 이용할 수 있습니다.
+ : /ignore\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 6 요약
+
+
+ 1. o 를 입력하면 커서 *아래에* 한 줄이 열리며, 커서는 편집 모드로
+ 열린 줄 위에 위치하게 됩니다.
+ 대문자 O 를 입력하면 커서가 있는 줄의 *위로* 새 줄을 열게 됩니다.
+
+ 2. a 를 입력하면 커서 *다음에* 글을 입력할 수 있습니다.
+ 대문자 A 를 입력하면 자동으로 그 줄의 끝에 글자를 추가하게 됩니다.
+
+ 3. e 를 입력하면 단어의 끝으로 움직입니다.
+
+ 4. y 를 입력하면 복사(yank (copy))를, p 를 입력하면 붙여 넣기가 됩니다.
+
+ 5. 대문자 R 을 입력하면 <ESC> 를 눌러서 나가기 전까지 바꾸기 모드가 됩니다.
+
+ 6. ":set xxx" 를 하면 "xxx" 옵션이 설정됩니다.:
+ 'ic' 'ignorecase' 검색시 대소문자 구별을 하지 않습니다.
+ 'is' 'incsearch' 검색어에서 부분 검색 결과를 보여줍니다.
+ 'hls' 'hlsearch' 검색 결과값을 하이라이트해줍니다.
+ 옵션은 전체 이름 혹은 줄인 이름 모두 사용 가능합니다.
+
+ 7. 앞에 "no"를 붙여 옵션을 끌 수 있습니다: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 7.1: 온라인 도움말 명령
+
+
+ ** 온라인 도움말 시스템 사용하기 **
+
+ 빔은 폭 넓은 온라인 도움말 시스템을 제공합니다. 도움말을 보려면,
+ 다음 세가지 중 하나를 시도해보십시오:
+ - <HELP> 키를 누른다. (키가 있는 경우)
+ - <F1> 키를 누른다. (키가 있는 경우)
+ - :help <ENTER> 라고 입력한다.
+
+ 도움말 창을 닫으려면 :q <ENTER> 라고 입력하십시오.
+ CTRL-W CTRL-W 다른쪽 윈도우로 넘어갑니다.
+ :q <ENTER> 도움말 윈도우를 닫습니다.
+
+ ":help" 라는 명령에 인자를 주면 어떤 주제에 관한 도움말을 찾을 수 있습니다.
+ 다음 명령을 내려 보십시오. ( <ENTER> 키를 누르는 것을 잊지 마십시오.)
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LESSON 7.2: 시작 스크립트 만들기
+
+ ** 빔의 기능 켜기 **
+
+ 빔은 Vi 보다 훨씬 많은 기능을 가지고 있지만, 대부분은 기본적으로 작동하지
+ 않습니다. 더 많은 기능을 써보려면, "vimrc" 라는 파일을 만들어야 합니다.
+
+ 1. "vimrc" 파일을 수정합시다. 이 파일은 사용하는 시스템에 따라 다릅니다:
+ :e ~/.vimrc Unix의 경우
+ :e ~/_vimrc MS-Windows의 경우
+
+ 2. 이제 "vimrc"의 예제를 읽어들입니다:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. 다음과 같이 하여 파일을 저장합니다:
+ :w
+
+ 다음 번에 빔을 시작하면, 구문 강조(syntax highlighting)이 사용될 것입니다.
+ 모든 원하는 설정을 이 "vimrc" 파일에 넣어둘 수 있습니다.
+ 더 자세한 내용은 :help vimrc-intro를 참고 하세요.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7.3: 명령어 완성하기
+
+
+ ** CTRL-D 와 <TAB> 이용하여 명령어를 완성할 수 있습니다.**
+
+ 1. 먼저 vim이 호환 모드가 아닌지를 확인합니다: :set nocp
+
+ 2. 디렉토리에 파일이 존재하는지 먼저 확인 합니다.: :!ls 혹은 :!dir
+
+ 3. 다음과 같이 명령어를 입력합니다: :e
+
+ 4. CTRL-D 를 누르면 "e"로 시작하는 모든 명령어들을 볼 수 있습니다.
+
+ 5. <TAB> 을 눌러 ":edit" 명령어를 완성해 봅니다.
+
+ 6. 이제 빈칸 하나를 추가한 뒤, 존재하는 파일 이름의 앞 부분을 입력합니다: :edit FIL
+
+ 7. <TAB> 을 눌러 파일 이름을 완성 시킵니다.
+
+참고: 완성하기는 많은 명령어에서 사용할 수 있습니다. CTRL-D와 <TAB> 만 누르세요!
+ 특히, :help 에서 유용할 것입니다.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7 요약
+
+
+ 1. 도움말을 열기 위해 :help 혹은 <F1> 혹은 <Help> 를 누릅니다.
+
+ 2. cmd 에 대한 도움말을 보기 위해서는 :help cmd 를 입력합니다.
+
+ 3. CTRL-W CTRL-W 를 이용해 다른 윈도우로 넘어갑니다.
+
+ 4. :q 로 도움말 윈도우를 빠져나옵니다.
+
+ 5. vimrc 시작 스크립트를 이용해 선호하는 세팅을 유지할 수 있습니다.
+
+ 6. : 명령어를 입력할때, CTRL-D 를 눌러 가능한 명령어들을 볼수 있습니다.
+ <TAB> 을 눌러 완성 가능합니다.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ 이것으로 빔 길잡이를 마칩니다. 이 길잡이는 빔 편집기에 대한 간략한 개요를
+ 보여주기 위한 의도로 제작되었으며, 이 편집기를 정말 간단히 사용하기에
+ 충분할 뿐입니다. 빔에는 이 길잡이와는 비교할 수 없을 만큼 훨씬 많은 명령이
+ 있습니다. 다음 사용자 매뉴얼을 읽으십시오: ":help user-manual"
+
+ 보다 자세히 읽고 공부하려면, 다음 책을 추천해 드립니다:
+ Vim - Vi Improved - by Steve Oualline
+ 출판사: New Riders
+ 이 책은 완전히 빔에 대해서만 다루고 있습니다. 특히 초보자들에게 유용합니다.
+ 많은 예제와 그림이 있습니다.
+ 다음을 참고하십시오: https://iccf-holland.org/click5.html
+
+ 다음 책은 좀 오래된 책으로 빔보다는 Vi에 대해 다루고 있지만, 역시 추천할 만
+ 합니다:
+ Learning the Vi Editor - by Linda Lamb
+ 출판사: O'Reilly & Associates Inc.
+ Vi로 하고 싶은 거의 모든 것에 대해 알 수 있는 좋은 책입니다.
+ 여섯번째 개정판은 빔에 관한 내용을 포함하고 있습니다.
+
+ 이 길잡이는 Colorado School of Mines의 Michael C. Pierce 와
+ Robert K. Ware 가 Colorado State University의 Charles Smith 의 아이디어에
+ 착안하여 썼습니다.
+ . E-mail: bware@mines.colorado.edu.
+
+ Modified for Vim by Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.lv.utf-8 b/runtime/tutor/tutor.lv.utf-8
new file mode 100644
index 0000000..e1ca778
--- /dev/null
+++ b/runtime/tutor/tutor.lv.utf-8
@@ -0,0 +1,1009 @@
+===============================================================================
+= Ī s a p a m ā c ī b a V I M - Versija 1.7 =
+===============================================================================
+
+ Vim ir jaudīgs teksta redaktors ar pārāk daudzām komandām, lai to
+ aprakstītu tik īsā aprakstā kā šis. Šī pamācība ir paredzēta, lai
+ spētu iemācīties tik daudz, cik nepieciešams, lietojot Vim, kā plaša
+ pielietojuma teksta redaktoru.
+
+ Atkarībā no tā, cik daudz laika veltīsiet eksperimentiem,
+ šīs pamācības aptuvenais izpildīšanas laiks ir 25 — 30 minūtes.
+
+ UZMANĪBU:
+ Darbojoties ar komandām, jūs izmainīsiet šo tekstu, tāpēc izveidojiet šī
+ faila kopiju (ja jūs palaidāt "vimtutor" komandu, šī jau ir kopija).
+
+ Svarīgi atcerēties, ka šo pamācību ir paredzēts izpildīt praktiski!
+ Ja jūs tikai lasīsiet šo tekstu, jūs komandas aizmirsīsiet!
+
+ Tagad pārliecinieties, ka tastatūrai nav nospiesti SHIFT vai
+ CAPS-LOCK taustiņi un spiediet j taustiņu, līdz pilnībā redzat
+
+ 1.1 nodarbības saturu
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.1 nodarbība: KURSORA PĀRVIETOŠANA
+
+ ** Lai pārvietotu kursoru, spiediet taustiņus h, j, k, l **
+
+ Lai atcerētos,
+ izmantojiet vārdus: k "Kaugšup"
+ ^
+ pa "Heisi" h < > l pa "Labi"
+ v
+ j "Jejup"
+
+ 1. Pārvietojiet kursoru pa ekrānu tik ilgi, kamēr pierodat.
+
+ 2. Turiet j taustiņu tik ilgi, kamēr ieslēdzas tā auto-atkārtošana.
+ Un dodieties uz nākamo nodarbību.
+
+PIEZĪME: Ja neesat pārliecināts par nospiesto taustiņu, spiediet <ESC>,
+ lai atgrieztos normālajā režīmā, un spiediet vajadzīgo taustiņu atkal.
+
+PIEZĪME: Kursora vadībai var izmantot arī bultiņu taustiņus, bet ticiet —
+ iemācīties vadīt ar j, k, l, h taustiņiem ir daudz parocīgāk!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.2 nodarbība: IZIEŠANA NO VIM
+
+ !! PIEZĪME: Pirms izpildīt šīs nodarbības soļus, izlasiet visu instrukciju!
+
+ 1. Lai būtu drošs, ka esat normālajā režīmā, nospiediet <ESC> taustiņu.
+
+ 2. Ievadiet komandu: :q! <ENTER>.
+ Ievadot šo komandu, jūs iziesiet no redaktora nesaglabājot izmaiņas.
+
+ 3. Ja palaidāt vim komandrindā, tad pēc tam atkal to izsauciet, ievadot
+ vimtutor <ENTER>
+
+ 4. Kad esat iegaumējis 1. — 3. soli, izpildiet tos, lai atgrieztos
+ redaktorā.
+
+PIEZĪME: :q! <ENTER> komanda atceļ visas failā radītās izmaiņas. Pēc dažām
+ nodarbībām jūs uzzināsiet, kā izmaiņas varat saglabāt.
+
+ 5. Pārvietojiet kursoru, uz 1.3 nodarbību.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.3 nodarbība: TEKSTA REDIĢĒŠANA – DZĒŠANA
+
+ ** Lai izdzēstu zem kursora atrodošos burtu, spiediet x **
+
+ 1. Pārvietojiet kursoru uz līniju ar atzīmi --->.
+
+ 2. Lai izlabotu kļūdas, pārvietojiet kursoru uz vajadzīgo burtu.
+
+ 3. Spiediet x taustiņu, lai izdzēstu nevajadzīgo burtu.
+
+ 4. Atkārtojiet 2. līdz 4. soļus, līdz teksts ir pareizs.
+
+---> Hiiipijiiii čččauuukstiiina celllofānu.
+
+ 5. Kad augstāk parādītā rinda ir izlabota, dodieties uz 1.4. nodarbību.
+
+PIEZĪME: Izpildot šo pamācību, centieties mācīties nevis domājot,
+ bet gan praktiski trenējot kustību atmiņu.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.4 nodarbība: TEKSTA REDIĢĒŠANA — IEVIETOŠANA
+
+ ** Lai ievietotu tekstu, spiediet i **
+
+ 1. Pārvietojiet kursoru uz pirmo līniju ar atzīmi --->.
+
+ 2. Lai ierakstītu tekstu augšējā rindā tieši tādu pašu kā apakšējā,
+ novietojiet kursoru tieši PĒC ievietojamā teksta.
+
+ 3. Spiediet i un ievadiet visu nepieciešamo tekstu.
+
+ 4. Pēc katra papildinājuma, spiediet <ESC> lai atgrieztos normālajā režīmā.
+ Atkārtojiet 2. līdz 4. soļus, līdz teksts ir pareizs.
+
+---> Šaā lnij no tksta rūkt dai buti.
+ Šajā līnijā no teksta trūkst daži burti.
+
+ 5. Kad esat apguvis šīs darbības, dodieties uz 1.5. nodarbību.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.5 nodarbība: TEKSTA REDIĢĒŠANA — PIEVIENOŠANA
+
+ ** Lai pievienotu tekstu, spiediet A **
+
+ 1. Pārvietojiet kursoru uz pirmo līniju ar atzīmi --->.
+ Nav svarīgi, uz kura šīs rindas burta atrodas kursors.
+
+ 2. Spiediet A un pievienojiet iztrūkstošo tekstu.
+
+ 3. Kad nepieciešamais teksts ir pievienots, spiediet <ESC>,
+ lai atgrieztos normālajā režīmā.
+
+ 4. Pārvietojiet kursoru uz otro līniju ar atzīmi --->
+ un atkārtojiet 2. un 3. soļus.
+
+---> Šajā līnijā tekstam
+ Šajā līnijā tekstam pietrūkst beigas.
+---> Šajā līnijā t
+ Šajā līnijā tekstam pietrūkst beigas.
+
+ 5. Kad esat apguvis šīs darbības, dodieties uz 1.6. nodarbību.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.6 nodarbība: FAILA SAGLABĀŠANA
+
+ ** Lai saglabātu failu un izietu no redaktora, spiediet :wq **
+
+ !! PIEZĪME: Pirms izpildīt šo nodarbību, izlasiet visus tās soļus!
+
+ 1. Pārliecinieties, ka esat pareizi izpildījis visas iepriekšējās nodarbības.
+
+ 2. Ja neesat pārliecināts, izejiet no redaktora, kā 1.2. nodarbībā ar komandu:
+ :q!
+
+ 3. Tad atkal palaidiet pamācību, un, ja nepieciešams, veiciet failā izmaiņas.
+
+ 4. Saglabājiet faila izmaiņas, redaktorā ievadot :w tutor <ENTER>
+ Izejiet no redaktora, ievadot komandu :wq <ENTER>
+
+ 5. Palaidiet atkal šo pamācību, terminālī ievadot komandu: vim tutor
+ Šajā komandā vārds "vim" izsauc teksta redaktoru, bet
+ vārds "tutor" ir faila nosaukums, kurā ir saglabāta izmainītā pamācība.
+
+ 5. Kad esat sapratis veicamās darbības, izpildiet tās.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1. nodarbības APKOPOJUMS
+
+
+ 1. Kursoru pārvieto ar bultiņu vai arī h,j,k,l taustiņiem:
+ h (pa kreisi) j (lejup) k (augšup) l (pa labi)
+
+ 2. Lai ar Vim rediģētu noteiktu failu, ievadiet komandu: vim fails <ENTER>
+
+ 3. Lai izietu no Vim ievadiet:
+ <ESC> :q! <ENTER> lai pazaudētu izmaiņas.
+ <ESC> :wq <ENTER> lai saglabātu izmaiņas.
+
+ 4. Lai izdzēstu burtu zem kursora, spiediet x
+
+ 5. Lai ievietotu vai pievienotu tekstu, spiediet:
+ i ievadāmais teksts <ESC> lai ievietotu pirms kursora
+ A pievienojamais teksts <ESC> lai pievienotu rindas beigās
+
+PIEZĪME: <ESC> spiešana atgriezīs jūs normālajā režīmā, vai arī atcels
+ nepareizu vai daļēji ievadītu komandu.
+
+Tagad dodieties uz 2. nodarbību.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.1 nodarbība: DZĒŠANAS KOMANDAS
+
+
+ ** Lai izdzēstu vārdu, spiediet dw **
+
+ 1. Nospiediet <ESC> lai pārliecinātos, ka esat normālajā režīmā.
+
+ 2. Pārvietojiet kursoru uz rindu ar atzīmi --->.
+
+ 3. Pārvietojiet kursoru uz izdzēšamā vārda sākumu.
+
+ 4. Ievadiet dw lai izdzēstu nepieciešamo vārdu.
+
+PIEZĪME: Nospiežot d, ekrāna labajā apakšējā stūrī parādīsies d burts.
+ Tas ir tāpēc, ka Vim gaida nākamo komandu (burtu w).
+ Ja jūs redzat citu burtu, vai neredzat neko, esat kaut ko izdarījis
+ nepareizi. Tad spiediet <ESC> un sāciet no sākuma.
+
+---> Šajā kuku teikumā ir tata daži lala vārdi, kuri mumu nav vajadzīgi.
+
+ 5. Izpildiet 3. — 4. soļus, līdz teksts ir pareizs un dodieties uz 2.2. nodarbību.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.2 nodarbība: CITAS DZĒŠANAS KOMANDAS
+
+
+ ** Lai izdzēstu līdz rindas beigām, spiediet d$ **
+
+ 1. Nospiediet <ESC> lai pārliecinātos, ka esat normālajā režīmā.
+
+ 2. Pārvietojiet kursoru uz rindu ar atzīmi --->.
+
+ 3. Pārvietojiet kursoru līdz pirmā teikuma beigām (PĒC pirmā punkta).
+
+ 4. Ievadiet d$ lai izdzēstu tekstu no kursora līdz rindas beigām.
+
+---> Kāds ir ievadījis teikuma beigas divreiz. ievadījis teikuma beigas divreiz.
+
+
+ 5. Dodieties uz 2.3 nodarbību, lai labāk izprastu, kā tas notiek.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.3 nodarbība: OPERATORI UN KOMANDAS
+
+
+ Daudzas tekstu mainošās komandas sastāv no operatora un kustības.
+ Dzēšanas komanda, kuru izsauc ar d operatoru vispārīgā gadījumā ir sekojoša:
+
+ d kustība
+
+ Kur:
+ d - ir dzēšanas operators.
+ kustība - ir operators, kas nosaka dzēšanas veidu.
+
+ Biežāk izplatītās kustības ir:
+ w - līdz nākamā vārda sākumam, NEIESKAITOT tā pirmo burtu.
+ e - līdz tekošā vārda beigām, IESKAITOT pēdējo burtu.
+ $ - līdz rindas beigām, IESKAITOT tās pēdējo burtu.
+
+ Piemēram, ievadot de tiks izdzēsts teksts no kursora līdz rindas beigām.
+
+PIEZĪME: Ievadot kustības komandu normālajā režīmā, tā pārvietos kursoru uz
+ norādīto vietu.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.4 nodarbība: KUSTĪBAS SKAITA IZMANTOŠANA
+
+
+ ** Pirms kustības ievadot skaitli, tā tiks atkārtota norādās reizes. **
+
+ 1. Pārvietojiet kursoru uz līniju ar atzīmi --->.
+
+ 2. Ievadiet 2w lai pārvietotu kursoru par 2 vārdiem uz priekšu.
+
+ 3. Ievadiet 3e lai pārvietotu kursoru par 3 vārdiem atpakaļ.
+
+ 4. Ievadiet 0 (nulli), lai pārvietotu kursoru uz rindas sākumu.
+
+ 5. Atkārtojiet 2. — 3. soļus ar dažādiem skaitļiem.
+
+---> Šī ir rinda ar vārdiem, kurā jūs varat pārvietoties.
+
+ 6. Dodieties uz nodarbību 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.5 nodarbība: SKAITĻA IZMANTOŠANA DZĒŠANAI
+
+
+ ** Ievadot skaitli pirms operatora, tas tiks atkārtots norādītās reizes. **
+
+ Pirms augšminētajām dzēšanas un pārvietošanās darbībām
+ var ievadīt skaitli, lai norādītu cik reizes to izpildīt, formā:
+ d skaitlis kustība
+
+ 1. Pārvietojiet kursoru uz pirmo vārdu ar LIELAJIEM BURTIEM rindā ar atzīmi --->.
+
+ 2. Ievadiet komandu d2w lai izdzēstu divus vārdus ar LIELAJIEM BURTIEM
+
+ 3. Atkārtojiet pirmo soli, dzēšanas komandai norādot dažādus skaitļus,
+ lai izdzēstu visus vārdus ar LIELAJIEM BURTIEM
+
+---> šajā ABC DE rindā FGHI JK LMN OP ir jāizdzēš liekie Q RS TUV vārdi
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.6 nodarbība: DARBĪBAS AR RINDĀM
+
+
+ ** Ievadiet dd lai izdzēstu visu teksta rindu. **
+
+ Tā kā veselas rindas izdzēšana ir izplatīta darbība, Vi dizaineri nolēma
+ tās dzēšanu realizēt ar dubultu d ievadīšanu.
+
+ 1. Pārvietojiet kursoru uz otro rindu ar atzīmi --->
+ 2. Ievadiet dd lai izdzēstu rindu.
+ 3. Pārvietojiet kursoru uz ceturto rindu.
+ 4. Ievadiet 2dd lai izdzēstu divas rindas.
+
+---> 1) Astoņi kustoņi,
+---> 2) astoņi kustoņi,
+---> 3) kas tos astoņus kustoņus pirks?
+---> 4) Zirgs.
+---> 5) Astoņi kustoņi,
+---> 6) astoņi kustoņi,
+---> 7) kas tos astoņus kustoņus pirks?
+---> 8) Cirks.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.7 nodarbība: ATCELŠANAS KOMANDA
+
+
+ ** Lai atceltu darbību, spiediet u **
+ ** Lai atceltu visas darbības tekošajā rindā, spiediet U **
+
+ 1. Pārvietojiet kursoru uz rindu ar atzīmi ---> un novietojiet to uz
+ pirmās kļūdas.
+ 2. Pārvietojiet kursoru un ievadiet x lai izdzēstu visus liekos burtus.
+ 3. Ievadiet u lai atceltu iepriekšējo komandu.
+ 4. Šī darbība atcels iepriekšējo darbību, kuru veicāt, ievadot x
+ 5. Ievadiet U lai atgrieztos sākuma stāvoklī.
+ 6. Ievadiet u vairākas reizes, lai atceltu U un iepriekšējās komandas.
+ 7. Ievadiet CTRL-R t.i.:
+ nospiediet CTRL un, to neatlaižot, Shift un to neatlaižot un r
+ vairākas reizes, lai atceltu atcelšanas darbības.
+
+---> Iizlabojiet kļūudas šaajā riindā, aatceliet tās un aatceliet aatcelšanu.
+
+ 8. Šīs ir svarīgas un noderīgas iespējas.
+ Tagad pārejiet uz 2. nodarbības apkopojumu.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2. nodarbības APKOPOJUMS
+
+
+ 1. Lai izdzēstu vārdu, uz kura atrodas kursors, ievada: dw
+ 2. Lai izdzēstu rindu no kursora līdz tās beigām, ievada: d$
+ 3. Lai izdzēstu visu rindu, ievada: dd
+ 4. Lai atkārtotu kustības darbību, pirms tās ievada skaitli, piemēram:
+ 2w
+
+ 5. Lai atkārtotu izmaiņu darbību, komandu formāts ir sekojošs:
+ operators [skaitlis] kustība
+ kur:
+ operators - ir veicamā darbība, piemēram, d lai dzēstu
+ [skaitlis] - ir neobligāts darbības atkārtojumu skaits
+ kustība - pārvieto kursoru tik tālu, cik ir veicama darbība, piem:
+ w lai pārvietotos par vienu vārdu,
+ $ lai pārvietotos līdz rindas beigām u.tml.
+
+ 6. Lai pārvietotos uz rindas sākumu, ievada: 0 (nulli)
+
+ 7. Lai atceltu iepriekšējo darbību, ievada: u (mazo u)
+ Lai atceltu visas rindā veiktās izmaiņas, ievada: U (Shift+U)
+ Lai atceltu atcelšanas darbības, ievada: CTRL-R (Ctrl+Shift+r)
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.1 nodarbība: IEVIETOŠANAS DARBĪBA
+
+
+ ** Lai pēc kursora ievietotu iepriekš izdzēstu tekstu, spiediet p **
+
+ 1. Pārvietojiet kursoru uz pirmo rindu ar atzīmi --->
+
+ 2. Ievadiet dd lai izdzēstu visu rindu un saglabātu to reģistrā.
+
+ 3. Pārvietojiet kursoru uz c) rindu (virs vietas, kur būtu jāievieto
+ dzēstā rinda).
+
+ 4. Spiediet p lai ievietotu reģistrā saglabāto rindu.
+
+ 5. Atkārtojiet soļus 2 līdz 4 līdz rindas ir pareizajā secībā.
+
+---> d) Zirgs.
+---> c) kas tos astoņus kustoņus pirks?
+---> b) astoņi kustoņi,
+---> a) Astoņi kustoņi,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.2 nodarbība: AIZVIETOŠANAS KOMANDA
+
+
+ ** Lai aizvietotu burtu ar citu, ievadiet r un nepieciešamo burtu. **
+
+ 1. Pārvietojiet kursoru uz pirmo rindu ar atzīmi --->
+
+ 2. Pārvietojiet kursoru, lai iezīmētu pirmo nepareizo burtu.
+
+ 3. Ievadiet r un tad burtu, uz kuru iezīmēto ir nepieciešams nomainīt.
+
+ 4. Atkārtojiet soļus 2 un 3 līdz ir pirmā rinda atbilst otrajai rindai.
+
+---> Iavadut šo rixdu, kuds ar nuspeedis napariizus teusteņus!
+---> Ievadot šo rindu, kāds ir nospiedis nepareizus taustiņus!
+
+ 5. Tagad dodieties uz 3.3. nodarbību.
+
+PIEZĪME: Atcerieties, ka jums ir jāmācās darbojoties,
+ nevis vienkārši mēģinot atcerēties!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.3 nodarbība: IZMAIŅU DARBĪBA
+
+
+ ** Lai izmainītu tekstu līdz vārda beigām, spiediet ce **
+
+ 1. Pārvietojiet kursoru uz pirmo rindu ar atzīmi --->
+
+ 2. Novietojiet kursoru virs pirmā Š vārdā Šma.
+
+ 3. Ievadiet ce un izlabojiet vārdu uz pareizu (šajā gad. "Šīs").
+
+ 4. Spiediet <ESC> un pārvietojiet kursoru uz nākamo maināmo vārdu.
+
+ 5. Atkārtojiet soļus 3 un 4 līdz pirmā un otrā rinda ir vienādas.
+
+---> Šma rindas vamula nepieciešams šimahaļ, lietojot šašābiļabita darbību.
+---> Šīs rindas vārdus nepieciešams izlabot, lietojot izmainīšanas darbību.
+
+Ievērojiet, ka pēc ce un vārda ievades jūs paliekat ievietošanas režīmā.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.4 nodarbība: CITAS MAINĪŠANAS DARBĪBAS AR c
+
+
+ ** Izmaiņu kustības operatoru lieto tieši tāpat kā dzēšanai. **
+
+ 1. Izmaiņu kustības operators darbojas tāpat kā dzēšanai. Formāts ir:
+
+ c [skaitlis] kustība
+
+ 2. Var lietot tos pašus kustības operatorus w (vārds) un $ (rindas beigas).
+
+ 3. Pārvietojiet kursoru uz pirmo rindu ar atzīmi --->.
+
+ 4. Pārvietojiet kursoru uz pirmo kļūdu.
+
+ 5. Ievadiet c$ rakstiet nomaināmo tekstu līdz rindas beigām un spiediet <ESC>.
+
+---> Šī teksta beigas nepieciešams izlabot, lietojot c$ komandu.
+---> Šī teksta beigas nepieciešams izlabot, lietojot c$ šari-vari-traļi-muļi.
+
+PIEZĪME: Lai labotu nepareizi ievadītu tekstu, spiediet <BACKSPACE> taustiņu.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3. NODARBĪBAS APKOPOJUMS
+
+
+ 1. Lai ievietotu izdzēsto tekstu, spiediet p taustiņu. Ar to ievietosiet
+ dzēsto tekstu PĒC kursora. (Ja bija izdzēsta vesela rinda, tā tiks
+ ievietota rindā VIRS kursora.)
+
+ 2. Lai izmainītu burtu zem kursora, spiediet r un pēc tam
+ jums nepieciešamo rakstzīmi.
+
+ 3. Izmaiņu operators ļauj jums nomainīt tekstu no kursora līdz
+ kustības operatora norādītajai vietai. Piemēram,
+ ievadot ce jūs izmaināt tekstu no kursora līdz VĀRDA beigām, bet
+ ievadot c$ jūs nomaināt tekstu no kursora līdz RINDAS beigām.
+
+ 4. Izmaiņu komandas formāts ir:
+
+ c [skaitlis] kustība
+
+Tagad dodieties uz nākamo nodarbību.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.1 nodarbība: KURSORA VIETA FAILĀ UN FAILA STATUSS
+
+ ** Lai noteiktu kursora atrašanās vietu failā un faila statusu, spiediet CTRL-g
+ Lai pārvietotu kursoru uz noteiktu faila rindu, spiediet G **
+
+ PIEZĪME: Pirms pildīt šo uzdevumu, izlasiet visas tā darbības līdz beigām!
+
+ 1. Spiediet Ctrl taustiņu, un neatlaižot to, spiediet g saīsināti CTRL-g.
+ Redaktora ekrāna apakšā parādīsies statusa rinda, ar faila statusu
+ un rindu kurā atrodas kursors, kā arī citu informāciju.
+ Atcerieties šo vietu, lai izpildītu 3. darbību.
+
+PIEZĪME: Jūs varat redzēt kursora atrašanās vietu failā vienmēr ekrāna
+ labajā apakšējā stūrī, ja redaktoram ir ieslēgta ruler opcija.
+ (Skatiet palīdzību par šo komandu, ievadot :help 'ruler')
+
+ 2. Lai pārvietotu kursoru uz faila beigām, ievadiet G
+ Lai pārvietotu kursoru uz faila sākumu, ievadiet gg
+
+ 3. Ievadiet iepriekš iegaumētās rindas numuru un tad ievadiet G
+ Ar šo jūs pārvietosiet kursoru atpakaļ rindā, kurā jūs sākāt
+ šo nodarbību.
+
+ 4. Atkārtojiet darbības 1. — 3. tik ilgi, kamēr droši atceraties šīs komandas.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.2 nodarbība: MEKLĒŠANAS KOMANDA
+
+
+ ** Lai meklētu tekstā, spiediet / un ievadiet meklējamo frāzi. **
+
+ 1. Normālajā režīmā spiediet / taustiņu. Ievērojiet, ka kursors pārvietojas
+ uz redaktora apakšējo rindu, līdzīgi, kā nospiežot taustiņu :
+ lai ievadītu dažādas komandas.
+
+ 2. Tad ievadiet vārdu kļūūūda un spiediet <ENTER>.
+ Ar šo jūs izgaismosiet atrasto meklējamo redaktorā.
+
+ 3. Lai atrastu nākošo vārdu, spiediet n taustiņu.
+ Lai pārvietotu kursoru uz nākamo atrasto vietu tekstā uz augšu,
+ ievadiet N
+
+ 4. Lai meklētu frāzi augšupejošā virzienā / vietā lietojiet ?
+
+ 5. Lai atgrieztos uz vietu, kurā sākāt meklēšanu, spiediet CTRL-O
+ (spiediet Ctrl, tad, to neatlaižot spiediet arī o). To var turpināt,
+ lai dotos tālāk atpakaļ, vai arī spiest CTRL-i, lai dotos uz priekšu.
+
+---> "kļūūūda" nav pareizs vārds; kļūda ir vienkārši kļūda.
+
+PIEZĪME: Ja ir atrasta pēdējā meklējamā frāze faila beigās vai sākumā,
+ pēc nākamā meklējuma tiks atrasta pirmā/pēdējā faila sākumā/beigās,
+ ja vien nav atslēgta wrapscan opcija.
+
+PIEZĪME: Ja vairs nevēlaties izgaismot meklējamo tekstu, spiediet /
+ un ievadiet nesakarīgu/neatrodamu frāzi. (VIM speciālisti parasti
+ piekārto savu taustiņu kombināciju šai darbībai.)
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.3 nodarbība: SAISTĪTO IEKAVU MEKLĒŠANA
+
+
+ ** Lai atrastu saistīto ),], vai } iekavu, ievadiet % **
+
+ 1. Novietojiet kursoru uz iekavām (, [, { rindā ar atzīmi --->.
+
+ 2. Ievadiet % simbolu.
+
+ 3. Kursors pārvietosies uz izvēlētajai iekavai atbilstošo pretējo iekavu.
+
+ 4. Ievadiet % lai pārvietotos atpakaļ uz atbilstošo pretējo iekavu.
+
+ 5. Pārvietojiet kursoru uz cita veida iekavu (,),[,],{ or } un pārbaudiet,
+ kas notiek atkārtoti ievadot %
+
+---> Šī ir (testa rinda ar dažādām (-veida, [-veida] un {-veida} iekavām.))
+
+
+PIEZĪME: Šī iespēja ir ļoti noderīga, lai pārbaudītu nelīdzsvarotas iekavas
+ programmas kodā
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.4 nodarbība: AIZVIETOŠANAS KOMANDA
+
+
+ ** Ievadiet :s/vecais/jaunais/g lai aizvietotu 'vecais' ar 'jaunais'. **
+
+ 1. Novietojiet kursoru rindā ar atzīmi --->.
+
+ 2. Ievadiet :s/ss/s<ENTER>
+ Ievērojiet, ka šī komanda nomaina tikai pirmo atrasto frāzi.
+
+ 3. Tagad ievadiet :s/ss/s/g<ENTER>
+ Ievērojiet, ka slēdzis g liek aizvietot frāzi visās atrastajās vietās.
+
+---> visslabākaiss laikss vērot ziedus ir pavassariss.
+
+ 4. Aizvietošanas komandai var norādīt darbības diapazonu:
+
+ ievadiet :#,#s/vecais/jaunais/g kur #,# ir diapazona sākuma un beigu rinda
+ ievadiet :%s/vecais/jaunais/g lai aizvietotu frāzi visā failā
+ ievadiet :%s/vecais/jaunais/gc lai aizvietotu visā failā ar uzaicinājumu
+ apstiprināt katru aizvietošanu
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.5 nodarbība: DARBĪBAS ATKĀRTOŠANA
+
+ ** Lai atkārtotu iepriekšējo darbību, spiediet . **
+
+ Atšķirībā no citiem teksta redaktoriem, Vim par vienu darbību uzskata
+ vairāku ievadīto komandu virkni ārpus normālā režīma (t.i. ievietošanas,
+ aizstāšanas u.tml.). Tas ļauj viegli atkārtot sarežģītas darbības, spiežot
+ . taustiņu.
+
+ 1. Pārliecinieties, ka esat normālajā režīmā, spiežot <ESC>.
+
+ 2. Sameklējiet pirmo skaitli rindā ar --->, ievadot: /11
+
+ 3. Ievadiet komandu 2sll un atgriezieties normālajā režīmā.
+
+ 4. Lai sameklētu nākamo skaitli un atkārtotu iepriekšējo aizstāšanas darbību,
+ spiediet: n.
+
+---> ba11e ce11e ha11e le11e ka11a mu11a nu11e ra11ijs šte11e ti11s ze11is
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4. nodarbības APKOPOJUMS
+
+ 1. CTRL-G statusa rindā parāda faila nosaukumu, statusu un kursora atrašanās
+ vietu
+ G pārvieto kursoru uz faila beigām.
+ skaitlis G pārvieto kursoru uz norādīto rindu.
+ gg pārvieto kursoru uz faila sākumu.
+
+ 2. Ievadot / un frāzi, to meklē failā uz priekšu
+ Ievadot ? un frāzi, to meklē failā atpakaļ
+ Pēc pirmās atrastās frāzes, spiežot n sameklē nākamo frāzi tajā pašā virzienā
+ vai arī, spiežot N, sameklē nākamo frāzi pretējā virzienā.
+ CTRL-o pārvieto kursoru uz iepriekšējo izmaiņu vietu, CTRL-i uz nākamo vietu.
+ . atkārto iepriekšējo darbību, ko var apvienot ar meklēšanu: n. vai N.
+
+ 3. Ja kursors atrodas uz (,),[,],{, vai }, ievadot % kursors pārvietojas uz
+ pretējo iekavu.
+
+ 4. Lai aizvietotu frāzi tekošajā rindā vienreiz, ievadiet: :s/vecais/jaunais
+ Lai aizvietotu visas frāzes tekošajā rindā, ievadiet: :s/vecais/jaunais/g
+ Lai aizvietotu visas frāzes starp norādītajām rindām: :#,#s/vecais/jaunais/g
+ Lai aizvietotu visas frāzes failā, ievadiet: :%s/vecais/jaunais/g
+ Lai aizvietotu visas frāzes failā ar apstiprinājumu: :%s/vecais/jaunais/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.1 nodarbība: KĀ IZPILDĪT ĀRĒJU KOMANDU
+
+
+ ** Ievadiet :! un pēc tam sekojošo ārējo komandu. **
+
+ 1. Nospiediet ierasto : lai parādītu uzaicinājumu statusa rindā
+
+ 2. Šajā rindā ievadiet ! (izsaukuma zīmi). Tā norāda VIM, ka būs jāizpilda
+ ārēja (komandrindas čaulas) komanda
+
+ 3. Pēc tam ievadiet, piemēram ls un spiediet <ENTER>
+ Šī komanda ekrāna apakšējā daļā parādīs failu sarakstu.
+ Ja lietojat Windows, ls komandas vietā ievadiet dir
+
+PIEZĪME: Izsaucamās komandas izpilda nospiežot <ENTER> taustiņu, kopš šī brīža
+ mēs to vairs īpaši neuzsvērsim. Lai aizvērtu komandas izvadīto saturu,
+ arī jāspiež <ENTER> taustiņš.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.2 nodarbība: VAIRĀK PAR FAILU SAGLABĀŠANU
+
+ ** Lai saglabātu failu ar noteiktu nosaukumu, ievadiet :w NOSAUKUMS **
+
+ 1. Ievadiet :!ls (vai :!dir), lai apskatītu failu sarakstu.
+ Atcerieties, ka pēc komandu nosaukuma ievades jānospiež <ENTER>!
+
+ 2. Izdomājiet jaunu faila nosaukumu, piemēram, test
+
+ 3. Tagad ievadiet: :w test1 (kur test ir jūsu izvēlētais faila nosaukums)
+
+ 4. Šī komanda saglabās vim pamācību failā test
+ Lai pārbaudītu, ievadiet :!ls vai :!dir un sameklējiet failu sarakstā
+
+PIEZĪME: Ja jūs iziesiet no vim un palaidīsiet to ar komandu vim test
+ vim atvērs jūsu saglabāto test failu.
+
+ 5. Tagad izdzēsiet šo failu, ievadot komandu: :!rm test
+ Vai, ja lietojat Windows, komandu: :!del test
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.3 nodarbība: TEKSTA DAĻĒJA SAGLABĀŠANA
+
+ ** Lai saglabātu tikai daļu no faila, ievadiet: v kustība :w fails **
+
+ 1. Pārvietojiet kursoru uz šo rindu
+
+ 2. Spiediet v un pārvietojiet kursoru līdz piektajam punktam.
+
+ 3. Spiediet : simbolu. Statusa rindā parādīsies :'<,'>
+
+ 4. Ievadiet w test kur test ir izvēlētais faila nosaukums.
+ Pirms spiest <ENTER>, pārliecinieties, ka redzat :'<,'>w test
+
+ 5. Vim saglabās iezīmēto tekstu failā test.
+ Neizdzēsiet šo failu, mēs to izmantosim nākošajā nodarbībā!
+
+PIEZĪME: Spiežot v VIM pārslēdzas vizuālā iezīmēšanas režīmā. Jūs varat izmantot
+ kursora pārvietošanas komandas, lai iezīmētu nepieciešamo tekstu.
+ Pēc teksta iezīmēšanas, jūs varat izmantot dažādus operatorus, lai
+ kaut ko darītu ar iezīmēto tekstu. Piemēram, spiežot d jūs izdzēsīsit
+ iezīmēto tekstu.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.4 nodarbība: FAILU SATURA IEGŪŠANA UN APVIENOŠANA
+
+ ** Lai ievietotu faila saturu, ievadiet :r fails **
+
+ 1. Novietojiet kursoru tieši virs šīs rindas.
+
+PIEZĪME: Pēc 2. soļa izpildes, jūs redzēsiet tekstu no 5.3 nodarbības.
+ Pēc tam pārvietojiet kursoru uz leju, lai lasītu tālāk šīs
+ nodarbības saturu.
+
+ 2. Iegūstiet test faila saturu, ievadot komandas :r test
+ kur test ir jūsu iepriekšējā nodarbībā saglabātais fails.
+ Ielasītā faila saturs tiek ievietots zem kursora.
+
+ 3. Lai pārbaudītu, ka darbība ir izdevusies, pārliecinieties, ka 5.4
+ nodarbības aprakstā ir saturs no 5.3 nodarbības.
+
+PIEZĪME: Jūs varat ievadīt saturu failā, izpildot ārēju komandu.
+ Piemēram, ar komandu :r !ls
+ jūs ievietosiet failā tekošās mapes failu sarakstu.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5. nodarbības APKOPOJUMS
+
+ 1. :!komanda izpilda ārēju komandu
+
+ Daži noderīgi piemēri:
+ (MS-DOS) (Unix)
+ :!dir :!ls - parāda mapes saturu
+ :!del fails :!rm fails - izdzēš norādīto failu
+
+ 2. :w fails saglabā tekošo failu failā ar norādīto nosaukumu.
+
+ 3. v kustība :w fails saglabā vizuāli iezīmēto tekstu norādītajā failā.
+
+ 4. :r fails ielasa faila saturu tekošajā failā zem kursora.
+
+ 5. :r !ls ielasa izpildītās komandas atgriezto saturu failā zem kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.1 nodarbība: ATVĒRŠANAS KOMANDA
+
+ ** Ievadiet o lai ievadītu jaunu rindu virs kursora un pārietu ievades režīmā. **
+
+ 1. Pārvietojiet kursoru uz rindu ar atzīmi --->.
+
+ 2. Ievadiet mazo o lai ievadītu jaunu rindu virs kursora un pārslēgtos
+ ievades režīmā.
+
+ 3. Ievadiet kādu tekstu un spiediet <ESC>, lai izietu no ievades režīma.
+
+---> Ievadot o izveidosiet rindu virs šīs un pāriesiet ievades režīmā.
+
+ 4. Lai izveidotu rindu ZEM kursora, ievadiet lielo O.
+
+---> Ievadot O izveidosiet rindu zem šīs un pāriesiet ievades režīmā.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.2 nodarbība: PIEVIENOŠANAS KOMANDA
+
+ ** Ievadiet a lai ievietotu jaunu tekstu PĒC kursora. **
+
+ 1. Pārvietojiet kursoru uz pirmo rindu ar atzīmi --->.
+
+ 2. Spiediet e līdz kursors ir pirmā nepabeigtā vārda beigās.
+
+ 3. Ievadiet a (mazo a), lai pievienotu tekstu pēc kursora.
+
+ 4. Ievadiet tekstu, lai abas rindas ar atzīmi ---> sakrīt.
+ Spiediet <ESC>, lai pārietu normālajā režīmā.
+
+ 5. Ievadiet e, lai novietotu kursoru nākamā nepabiegtā vārda beigās,
+ un atkārtojiet soļus 3 un 4.
+
+---> Šī rin ju palīd praktiz tekst pievienoš vārd bei
+---> Šī rinda jums palīdzēs praktizēties teksta pievienošanā vārdu beigās.
+
+PIEZĪME: No normālā režīma pāriet uz ievades režīmu ievadot a, i, A un I.
+ Atšķirība ir tikai tā, kur tiek uzsākta teksta ievade: a – pēc kursora,
+ i — pirms kursora, A — rindas beigās, I — rindas sākumā.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.3 nodarbība: VĒL VIENS AIZVIETOŠANAS VEIDS
+
+ ** Lai aizvietotu vairāk kā vienu rakstzīmi, spiediet R **
+
+ 1. Pārvietojiet kursoru uz rindu ar atzīmi --->.
+
+ 2. Pārvietojiet kursoru uz pirmo no xxx
+
+ 3. Spiediet R un ievadiet skaitli, kas norādīts apakšējā rindā tā,
+ lai ievadītie cipari pārraksta xxx.
+
+ 4. Lai izietu no aizvietošanas režīma, spiediet <ESC>.
+ Pārliecinieties, ka pārējais rindas saturs nav izmainīts.
+
+ 5. Atkārtojiet 2. — 4. soļa darbības, lai līdzīgi aizvietotu pārējos xxx.
+
+---> Saskaitot xxx ar xxx iegūstam xxx.
+---> Saskaitot 123 ar 456 iegūstam 579.
+
+PIEZĪME: Aizvietošanas režīms darbojas līdzīgi ievietošanas režīmam, ar
+ tikai ievadītās rakstzīmes aizvieto esošās.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.4 nodarbība: TEKSTA KOPĒŠANA UN IEVIETOŠANA
+
+ ** Lai kopētu tekstu, izmantojiet y, bet lai ievietotu — p **
+
+ 1. Pārvietojiet kursoru uz rindu ar atzīmi ---> un novietojiet kursoru
+ pēc "a)"
+
+ 2. Ieslēdziet vizuālo režīmu, spiežot v un pārvietojiet kursoru līdz
+ "pirmais" (to neskaitot)
+
+ 3. Spiediet y lai iekopētu izcelto tekstu
+
+ 4. Pārvietojiet kursoru uz nākamās rindas beigām, spiežot j$
+
+ 5. Spiediet p lai ievietotu nokopēto tekstu. Pēc tam spiediet <ESC>
+
+ 6. Ierakstiet otrās rindas beigās vārdu "otrais"
+
+ 7. Līdzīgi, lietojot v y un p, nokopējiet vārdu "simtdivdesmitpiecgadnieks",
+ lai iegūtu rindu: šis ir otrais simtdivdesmitpiecgadnieks.
+
+---> a) šis ir pirmais simtdivdesmitpiecgadnieks.
+ b)
+
+ PIEZĪME: y var lietot kopā ar pārvietošanās operatoru, piemēram,
+ spiežot yw var nokopēt izvēlēto vārdu.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.5 nodarbība: IESTATĪJUMU MAIŅA
+
+ ** Iestatiet meklēšana un aizstāšana, neievērojot lielos/mazos burtus **
+
+ 1. Sameklējiet vārdu 'neievērot', ievadot: /neievērot <ENTER>
+ Atkārtojiet meklēšanu, spiežot n
+
+ 2. Iestatiet 'ic' (Neievērot lielos/mazos burtus) iestatījumu, ievadot: :set ic
+
+ 3. Tagad sameklējiet 'neievērot' atkārtoti, spiežot n
+ Ievērojiet, ka tiek atrasti vārdi Neievērot un NEIEVĒROT.
+
+ 4. Iestatiet 'hlsearch' un 'incsearch' opcijas, ievadot: :set hls is
+
+ 5. Ievadiet atkal sekojošo komandu, un skatieties, kas notiek: /neievērot <ENTER>
+
+ 6. Lai atceltu lielo/mazo burtu neievērošanu, ievadiet: :set noic
+
+PIEZĪME: Lai atceltu atrasto vietu izcelšanu, ievadiet: :nohlsearch
+PIEZĪME: Ja vēlaties meklēt gan lielos, gan mazos burtus vienā meklējumā,
+ ievadiet papildu komandu \c
+ Piemēram: /neievērot\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6. nodarbības APKOPOJUMS
+
+ Lai pārietu uz ievietošanas režīmu un:
+
+ 1. lai ievietotu jaunu rindu zem tekošās, ievadiet o
+ lai ievietotu jaunu rindu virs tekošās, ievadiet O
+
+ 2. Lai ievietotu tekstu pēc kursora, ievadiet a
+ Lai ievietotu tekstu rindas beigās, ievadiet A
+
+ Normālajā režīmā:
+
+ 3. e komanda pārvieto kursoru uz vārda beigām.
+
+ 4. y komanda nokopē tekstu, bet p komanda ievieto to.
+
+ 5. R ieslēdz aizvietošanas režīmu, līdz tiek nospiests <ESC>.
+
+ 6. Ievadot ":set xxx" iestata "xxx" opciju. Dažas no tām ir sekojošas:
+ 'ic' 'ignorecase' meklējot neievēro lielos/mazos burtus.
+ 'is' 'incsearch' uzreiz meklē daļēji ievadīto frāzi.
+ 'hls' 'hlsearch' izgaismo atrastās frāzes.
+ Var norādīt gan īso, gan garo opcijas nosaukumu.
+
+ 7. Lai opciju izslēgtu, pievieno priedēkli "no". Piemēram, :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7.1 nodarbība: PALĪDZĪBAS IEGŪŠANA
+
+
+ ** Iebūvētās palīdzības izmantošana **
+
+ Vim ir plaša iebūvētā palīdzības sistēma. Lai sāktu to lietot, ievadiet vieno
+ no sekojošām komandām:
+ - spiediet <HELP> taustiņu (ja jūsu tastatūrā tāds pastāv)
+ - spiediet <F1> taustiņu (ja jūsu tastatūrai ir tāds)
+ - ievadiet :help <ENTER>
+
+ Izlasiet palīdzības aprakstu, lai saprastu, kā tas darbojas.
+ Ievadiet CTRL-W CTRL-W lai pārslēgtos uz citu logu.
+ Ievadiet :q <ENTER> lai aizvērtu palīdzības logu.
+
+ Jūs varat atrast konkrētu palīdzību par jebkuru komandu, ievadot:
+ ":help" komanda. Piemēram (neaizmirstiet komandas beigās nospiest <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7.2 nodarbība: IZVEIDOJIET SĀKŠANAS SKRIPTU
+
+ ** Ieslēdziet Vim iespējas **
+
+ Vim ir daudz plašākas iespējas, nekā Vi, bet vairums no tām,
+ pēc noklusēšanas, nav ieslēgtas. Lai tās ieslēgtu, izveidojiet "vimrc" failu.
+
+ 1. Atkarībā no lietotās operētājsistēmas, atveriet "vimrc" failu sekojoši:
+ :e ~/.vimrc Unix-veidīgā (t.sk. MacOS un Linux)
+ :e ~/_vimrc VMS-veidīgā (t.sk. MS-Windows)
+
+ 2. Ielasiet "vimrc" šablona faila saturu, ievadot:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Saglabājiet šablona saturu savā iestatījumu failā:
+ :w
+
+ Kad nākamo reizi atvērsiet Vim, tajā tiks izmantota sintakses izgaismošana.
+ Jūs varat ievietot arī citas iestatījumu iespējas savā "vimrc" failā.
+ Papildu informācijai ievadiet :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7.3 nodarbība: AUTOMĀTISKĀ PABEIGŠANA
+
+ ** Automātisko pabeigšanu komandrindā izsauc ar CTRL-D un <TAB> **
+
+ 1. Pārliecinieties, ka Vim ir ar Vi nesavietojamā režīmā: :set nocp
+
+ 2. Apskatiet tekošās mapes saturu Vim, ievadot: :!ls vai :!dir
+
+ 3. Ievadiet komandas sākumu ar: :e
+
+ 4. Spiediet CTRL-D un Vim parādīs visas komandas, kuras sākas ar "e".
+
+ 5. Spiediet <TAB> un Vim automātiski pabeigs komandu uz ":edit".
+
+ 6. Spiediet atstarpes taustiņu un sāciet ievadīt faila nosaukumu,
+ piemēram: :edit FIL
+
+ 7. Spiediet <TAB> un Vim pabeigs faila nosaukumu,
+ ja norādītais sākums ir unikāls.
+
+PIEZĪME: Pabeigšana strādā dažādām komandām.
+ Vienkārši mēģiniet spiest CTRL-D un <TAB>.
+ Šī iespēja var būt īpaši noderīga, ievadot :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7. nodarbības APKOPOJUMS
+
+
+ 1. Lai atvērtu palīdzības logu, ievadiet :help vai spiediet <F1> vai <Help>
+
+ 2. Lai atvērtu palīdzību par "komanda", ievadiet :help komanda
+
+ 3. Lai pārslēgtos uz citu logu, spiediet: CTRL-W CTRL-W
+
+ 4. Lai aizvērtu tekošo logu, ievadiet: :q
+
+ 5. Izveidojiet savu "vimrc" sākšanas skriptu ar saviem iestatījumiem.
+
+ 6. Ievadot : komanda spiediet CTRL-D, lai apskatītu iespējamos pabeigšanas
+ veidus. Lai pabeigtu komandu, spiediet <TAB> .
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Ar šo Vim ievads ir pabeigts. Tajā tika sniegts īss Vim redaktora apraksts,
+ ar kuru pietiek, lai Vim lietotu vienkāršām darbībām.
+ Vim iespējas ir daudz plašākas, un tajā ir daudz vairāk komandu. Lai apskatītu
+ tās, ievadiet: ":help user-manual".
+
+ Tālākai apmācībai tiek rekomendētas sekojošas grāmatas:
+
+ Vim - Vi Improved, Steve Oualline, New Riders
+
+ Šī grāmata ir tieši par Vim, un ir ļoti ieteicama iesācējiem.
+ Daudzi piemēri un attēli no tās pieejami: https://iccf-holland.org/click5.html
+
+ Otra, vecāka grāmata ir par Vi, nevis Vim, bet arī ir ļoti noderīga:
+
+ Learning the Vi Editor, Linda Lamb, O'Reilly & Associates Inc.
+
+ Tajā ir visplašākais Vi iespēju apraksts, grāmatas sestajā laidienā ir
+ aprakstītas arī Vim iespējas.
+
+ Šīs pamācības variantu angļu valodā izveidoja:
+
+ * Michael C. Pierce,
+ * Robert K. Ware,
+ * Charles Smith,
+ * Bram Moolenaar.
+
+ Pamācību latviešu valodā tulkoja:
+
+ * Valdis Vītoliņš
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.nb b/runtime/tutor/tutor.nb
new file mode 100644
index 0000000..9eb6dfa
--- /dev/null
+++ b/runtime/tutor/tutor.nb
@@ -0,0 +1,973 @@
+===============================================================================
+= V e l k o m m e n t i l i n n f r i n g e n i V i m -- Ver. 1.7 =
+===============================================================================
+
+ Vim er en meget kraftig editor med mange kommandoer, alt for mange til
+ kunne g gjennom alle i en innfring som denne. Den er beregnet p
+ sette deg inn i bruken av nok kommandoer s du vil vre i stand til lett
+ kunne bruke Vim som en editor til alle forml.
+
+ Tiden som kreves for g gjennom denne innfringen tar ca. 25-30
+ minutter, avhengig av hvor mye tid du bruker til eksperimentering.
+
+ MERK:
+ Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne
+ filen som du kan ve deg p (hvis du kjrte vimtutor-kommandoen, er
+ dette allerede en kopi).
+
+ Det er viktig huske at denne innfringen er beregnet p lring gjennom
+ bruk. Det betyr at du m utfre kommandoene for lre dem skikkelig.
+ Hvis du bare leser teksten, vil du glemme kommandoene!
+
+ Frst av alt, sjekk at Caps Lock IKKE er aktiv og trykk j-tasten for
+ flytte markren helt til leksjon 1.1 fyller skjermen.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.1: FLYTTING AV MARKREN
+
+
+ ** For flytte markren, trykk tastene h, j, k, l som vist. **
+ ^
+ k Tips: h-tasten er til venstre og flytter til venstre.
+ < h l > l-tasten er til hyre og flytter til hyre.
+ j j-tasten ser ut som en pil som peker nedover.
+ v
+ 1. Flytt markren rundt p skjermen til du har ftt det inn i fingrene.
+
+ 2. Hold inne nedovertasten (j) til den repeterer.
+ N vet du hvordan du beveger deg til neste leksjon.
+
+ 3. G til leksjon 1.2 ved hjelp av nedovertasten.
+
+Merk: Hvis du blir usikker p noe du har skrevet, trykk <ESC> for g til
+ normalmodus. Skriv deretter kommandoen du nsket p nytt.
+
+Merk: Piltastene skal ogs virke. Men ved bruke hjkl vil du vre i stand til
+ bevege markren mye raskere nr du er blitt vant til det. Helt sant!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.2: AVSLUTTE VIM
+
+
+ !! MERK: Fr du utfrer noen av punktene nedenfor, les hele leksjonen!!
+
+ 1. Trykk <ESC>-tasten (for forsikre deg om at du er i normalmodus).
+
+ 2. Skriv: :q! <ENTER>.
+ Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.
+
+ 3. Nr du ser kommandolinjen i skallet, skriv kommandoen som startet denne
+ innfringen. Den er: vimtutor <ENTER>
+
+ 4. Hvis du er sikker p at du husker dette, utfr punktene 1 til 3 for
+ avslutte og starte editoren p nytt.
+
+MERK: :q! <ENTER> forkaster alle forandringer som du gjorde. I lpet av noen
+ f leksjoner vil du lre hvordan du lagrer forandringene til en fil.
+
+ 5. Flytt markren ned til leksjon 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.3: REDIGERING AV TEKST -- SLETTING
+
+
+ ** Trykk x for slette tegnet under markren. **
+
+ 1. Flytt markren til den frste linjen merket med --->.
+
+ 2. For ordne feilene p linjen, flytt markren til den er opp tegnet som
+ skal slettes.
+
+ 3. Trykk tasten x for slette det unskede tegnet.
+
+ 4. Repeter punkt 2 til 4 til setningen er lik den som er under.
+
+---> Hessstennnn brrrsnudddde ii gaaata.
+---> Hesten brsnudde i gata.
+
+ 5. N som linjen er korrekt, g til leksjon 1.4.
+
+MERK: Nr du gr gjennom innfringen, ikke bare prv huske kommandoene, men
+ bruk dem helt til de sitter.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING
+
+
+ ** Trykk i for sette inn tekst. **
+
+ 1. Flytt markren til den frste linjen som er merket med --->.
+
+ 2. For gjre den frste linjen lik den andre, flytt markren til den str
+ p tegnet ETTER posisjonen der teksten skal settes inn.
+
+ 3. Trykk i og skriv inn teksten som mangler.
+
+ 4. Etterhvert som hver feil er fikset, trykk <ESC> for returnere til
+ normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.
+
+---> Det er tkst som mnglr .
+---> Det er ganske mye tekst som mangler her.
+
+ 5. Nr du fler deg komfortabel med sette inn tekst, g til oppsummeringen
+ nedenfor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL
+
+
+ ** Trykk A for legge til tekst. **
+
+ 1. Flytt markren til den frste linjen nedenfor merket --->.
+ Det har ikke noe si hvor markren er plassert p den linjen.
+
+ 2. Trykk A og skriv inn det som skal legges til.
+
+ 3. Nr teksten er lagt til, trykk <ESC> for returnere til normalmodusen.
+
+ 4. Flytt markren til den andre linjen markert med ---> og repeter steg 2 og
+ 3 for reparere denne setningen.
+
+---> Det mangler noe tekst p
+ Det mangler noe tekst p denne linjen.
+---> Det mangler ogs litt tek
+ Det mangler ogs litt tekst p denne linjen.
+
+ 5. Nr du fler at du behersker legge til tekst, g til leksjon 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.6: REDIGERE EN FIL
+
+
+ ** Bruk :wq for lagre en fil og avslutte. **
+
+ !! MERK: Fr du utfrer noen av stegene nedenfor, les hele denne leksjonen!!
+
+ 1. Avslutt denne innfringen som du gjorde i leksjon 1.2: :q!
+
+ 2. Skriv denne kommandoen p kommandolinja: vim tutor <ENTER>
+ vim er kommandoen for starte Vim-editoren, tutor er navnet p fila
+ som du vil redigere. Bruk en fil som kan forandres.
+
+ 3. Sett inn og slett tekst som du lrte i de foregende leksjonene.
+
+ 4. Lagre filen med forandringene og avslutt Vim med: :wq <ENTER>
+
+ 5. Start innfringen p nytt og flytt ned til oppsummeringen som flger.
+
+ 6. Etter ha lest og forsttt stegene ovenfor: Sett i gang.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 1
+
+
+ 1. Markren beveges ved hjelp av piltastene eller hjkl-tastene.
+ h (venstre) j (ned) k (opp) l (hyre)
+
+ 2. For starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN <ENTER>
+
+ 3. For avslutte Vim, skriv: <ESC> :q! <ENTER> for forkaste endringer.
+ ELLER skriv: <ESC> :wq <ENTER> for lagre forandringene.
+
+ 4. For slette tegnet under markren, trykk: x
+
+ 5. For sette inn eller legge til tekst, trykk:
+ i skriv innsatt tekst <ESC> sett inn fr markren
+ A skriv tillagt tekst <ESC> legg til p slutten av linjen
+
+MERK: Nr du trykker <ESC> gr du til normalmodus eller du avbryter en unsket
+ og delvis fullfrt kommando.
+
+ N kan du g videre til leksjon 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.1: SLETTEKOMMANDOER
+
+
+ ** Trykk dw for slette et ord. **
+
+ 1. Trykk <ESC> for vre sikker p at du er i normalmodus.
+
+ 2. Flytt markren til den frste linjen nedenfor merket --->.
+
+ 3. Flytt markren til begynnelsen av ordet som skal slettes.
+
+ 4. Trykk dw og ordet vil forsvinne.
+
+MERK: Bokstaven d vil komme til syne p den nederste linjen p skjermen nr
+ du skriver den. Vim venter p at du skal skrive w . Hvis du ser et annet
+ tegn enn d har du skrevet noe feil; trykk <ESC> og start p nytt.
+
+---> Det er agurk tre ord eple som ikke hrer pre hjemme i denne setningen.
+---> Det er tre ord som ikke hrer hjemme i denne setningen.
+
+ 5. Repeter punkt 3 og 4 til den frste setningen er lik den andre. G
+ deretter til leksjon 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.2: FLERE SLETTEKOMMANDOER
+
+
+ ** Trykk d$ for slette til slutten av linjen. **
+
+ 1. Trykk <ESC> for vre sikker p at du er i normalmodus.
+
+ 2. Flytt markren til linjen nedenfor merket --->.
+
+ 3. Flytt markren til punktet der linjen skal kuttes (ETTER frste punktum).
+
+ 4. Trykk d$ for slette alt til slutten av linjen.
+
+---> Noen skrev slutten p linjen en gang for mye. linjen en gang for mye.
+
+ 5. G til leksjon 2.3 for forst hva som skjer.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.3: OM OPERATORER OG BEVEGELSER
+
+
+ Mange kommandoer som forandrer teksten er laget ut i fra en operator og en
+ bevegelse. Formatet for en slettekommando med sletteoperatoren d er:
+
+ d bevegelse
+
+ Der:
+ d - er sletteoperatoren.
+ bevegelse - er hva operatoren vil opere p (listet nedenfor).
+
+ En kort liste med bevegelser:
+ w - til starten av det neste ordet, UNNTATT det frste tegnet.
+ e - til slutten av det nvrende ordet, INKLUDERT det siste tegnet.
+ $ - til slutten av linjen, INKLUDERT det siste tegnet.
+
+ Ved skrive de vil alts alt fra markren til slutten av ordet bli
+ slettet.
+
+MERK: Ved skrive kun bevegelsen i normalmodusen uten en operator vil
+ markren flyttes som spesifisert.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE
+
+
+ ** Ved skrive et tall foran en bevegelse repeterer den s mange ganger. **
+
+ 1. Flytt markren til starten av linjen markert ---> nedenfor.
+
+ 2. Skriv 2w for flytte markren to ord framover.
+
+ 3. Skriv 3e for flytte markren framover til slutten av det tredje
+ ordet.
+
+ 4. Skriv 0 (null) for flytte til starten av linjen.
+
+ 5. Repeter steg 2 og 3 med forskjellige tall.
+
+---> Dette er en linje med noen ord som du kan bevege deg rundt p.
+
+ 6. G videre til leksjon 2.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.5: BRUK AV ANTALL FOR SLETTE MER
+
+
+ ** Et tall sammen med en operator repeterer den s mange ganger. **
+
+ I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du
+ inn antall fr bevegelsen for slette mer:
+ d nummer bevegelse
+
+ 1. Flytt markren til det frste ordet med STORE BOKSTAVER p linjen markert
+ med --->.
+
+ 2. Skriv 2dw for slette de to ordene med store bokstaver.
+
+ 3. Repeter steg 1 og 2 med forskjelling antall for slette de etterflgende
+ ordene som har store bokstaver.
+
+---> Denne ABC DE linjen FGHI JK LMN OP er n Q RS TUV litt mer lesbar.
+
+MERK: Et antall mellom operatoren d og bevegelsen virker p samme mte som
+ bruke bevegelsen uten en operator.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.6: OPERERE P LINJER
+
+
+ ** Trykk dd for slette en hel linje. **
+
+ P grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at
+ det vil vre lettere rett og slett trykke to d-er for slette en linje.
+
+ 1. Flytt markren til den andre linjen i verset nedenfor.
+ 2. Trykk dd slette linjen.
+ 3. Flytt deretter til den fjerde linjen.
+ 4. Trykk 2dd for slette to linjer.
+
+---> 1) Roser er rde,
+---> 2) Gjrme er gy,
+---> 3) Fioler er bl,
+---> 4) Jeg har en bil,
+---> 5) Klokker viser tiden,
+---> 6) Druer er ste
+---> 7) Og du er likes.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.7: ANGRE-KOMMANDOEN
+
+
+ ** Trykk u for angre siste kommando, U for fikse en hel linje. **
+
+ 1. Flytt markren til linjen nedenfor merket ---> og plasser den p den
+ frste feilen.
+ 2. Trykk x for slette det frste unskede tegnet.
+ 3. Trykk s u for angre den siste utfrte kommandoen.
+ 4. Deretter ordner du alle feilene p linjene ved bruke kommandoen x .
+ 5. Trykk n en stor U for sette linjen tilbake til det den var
+ originalt.
+ 6. Trykk u noen ganger for angre U og foregende kommandoer.
+ 7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen
+ ganger for gjenopprette kommandoene (omgjre angrekommandoene).
+
+---> RReparer feiilene p denne linnnjen oog erssstatt dem meed angre.
+
+ 8. Dette er meget nyttige kommandoer. N kan du g til oppsummeringen av
+ leksjon 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 2
+
+
+ 1. For slette fra markren fram til det neste ordet, trykk: dw
+ 2. For slette fra markren til slutten av en linje, trykk: d$
+ 3. For slette en hel linje, trykk: dd
+
+ 4. For repetere en bevegelse, sett et nummer foran: 2w
+ 5. Formatet for en forandringskommando er:
+ operator [nummer] bevegelse
+ der:
+ operator - hva som skal gjres, f.eks. d for slette
+ [nummer] - et valgfritt antall for repetere bevegelsen
+ bevegelse - hva kommandoen skal operere p, eksempelvis w (ord),
+ $ (til slutten av linjen) og s videre.
+
+ 6. For g til starten av en linje, bruk en null: 0
+
+ 7. For angre tidligere endringer, skriv: u (liten u)
+ For angre alle forandringer p en linje, skriv: U (stor U)
+ For omgjre angringen, trykk: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.1: LIM INN-KOMMANDOEN
+
+
+ ** Trykk p for lime inn tidligere slettet tekst etter markren **
+
+ 1. Flytt markren til den frste linjen med ---> nedenfor.
+
+ 2. Trykk dd for slette linjen og lagre den i et Vim-register.
+
+ 3. Flytt markren til c)-linjen, OVER posisjonen linjen skal settes inn.
+
+ 4. Trykk p for legge linjen under markren.
+
+ 5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkeflge.
+
+---> d) Kan du ogs lre?
+---> b) Fioler er bl,
+---> c) Intelligens m lres,
+---> a) Roser er rde,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.2: ERSTATT-KOMMANDOEN
+
+
+ ** Trykk rx for erstatte tegnet under markren med x. **
+
+ 1. Flytt markren til den frste linjen nedenfor merket --->.
+
+ 2. Flytt markren s den str opp den frste feilen.
+
+ 3. Trykk r og deretter tegnet som skal vre der.
+
+ 4. Repeter punkt 2 og 3 til den frste linjen er lik den andre.
+
+---> Da dfnne lynjxn ble zkrevet, var det nen som tjykket feite taster!
+---> Da denne linjen ble skrevet, var det noen som trykket feile taster!
+
+ 5. G videre til leksjon 3.2.
+
+MERK: Husk at du br lre ved BRUKE, ikke pugge.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.3: FORANDRE-OPERATOREN
+
+
+ ** For forandre til slutten av et ord, trykk ce . **
+
+ 1. Flytt markren til den frste linjen nedenfor som er merket --->.
+
+ 2. Plasser markren p u i lubjwr.
+
+ 3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv injen).
+
+ 4. Trykk <ESC> og g til det neste tegnet som skal forandres.
+
+ 5. Repeter punkt 3 og 4 helt til den frste setningen er lik den andre.
+
+---> Denne lubjwr har noen wgh som m forkwp med forkzryas-kommandoen.
+---> Denne linjen har noen ord som m forandres med forandre-kommandoen.
+
+Vr oppmerksom p at ce sletter ordet og gr inn i innsettingsmodus.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c
+
+
+ ** Forandringskommandoen blir brukt med de samme bevegelser som slett. **
+
+ 1. Forandringsoperatoren fungerer p samme mte som slett. Formatet er:
+
+ c [nummer] bevegelse
+
+ 2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en
+ linje).
+
+ 3. G til den frste linjen nedenfor som er merket --->.
+
+ 4. Flytt markren til den frste feilen.
+
+ 5. Skriv c$ og skriv resten av linjen lik den andre og trykk <ESC>.
+
+---> Slutten p denne linjen trenger litt hjelp for gjre den lik den neste.
+---> Slutten p denne linjen trenger bli rettet ved bruk av c$-kommandoen.
+
+MERK: Du kan bruke slettetasten for rette feil mens du skriver.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 3
+
+
+ 1. For legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette
+ limer inn den slettede teksten ETTER markren (hvis en linje ble slettet
+ vil den bli limt inn p linjen under markren).
+
+ 2. For erstatte et tegn under markren, trykk r og deretter tegnet som
+ du vil ha der.
+
+ 3. Forandringsoperatoren lar deg forandre fra markren til dit bevegelsen
+ tar deg. Det vil si, skriv ce for forandre fra markren til slutten
+ av ordet, c$ for forandre til slutten av linjen.
+
+ 4. Formatet for forandre er:
+
+ c [nummer] bevegelse
+
+N kan du g til neste leksjon.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.1: POSISJONERING AV MARKREN OG FILSTATUS
+
+ ** Trykk CTRL-G for vise posisjonen i filen og filstatusen.
+ Trykk G for g til en spesifikk linje i filen. **
+
+ Merk: Les hele leksjonen fr du utfrer noen av punktene!
+
+ 1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding
+ vil komme til syne p bunnen av skjermen med filnavnet og posisjonen i
+ filen. Husk linjenummeret for bruk i steg 3.
+
+Merk: Du kan se markrposisjonen i nederste hyre hjrne av skjermen. Dette
+ skjer nr ruler-valget er satt (forklart i leksjon 6).
+
+ 2. Trykk G for g til bunnen av filen.
+ Skriv gg for g til begynnelsen av filen.
+
+ 3. Skriv inn linjenummeret du var p og deretter G . Dette vil fre deg
+ tilbake til linjen du var p da du frst trykket CTRL-G.
+
+ 4. Utfr steg 1 til 3 hvis du fler deg sikker p prosedyren.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.2: SKEKOMMANDOEN
+
+ ** Skriv / etterfulgt av en skestreng som du vil lete etter. **
+
+ 1. Trykk / nr du er i normalmodusen. Legg merke til at skrstreken og
+ markren kommer til syne p bunnen av skjermen i likhet med
+ :-kommandoene.
+
+ 2. Skriv feeeiil og trykk <ENTER>. Dette er teksten du vil lete etter.
+
+ 3. For finne neste forekomst av skestrengen, trykk n .
+ For lete etter samme sketeksten i motsatt retning, trykk N .
+
+ 4. For lete etter en tekst bakover i filen, bruk ? istedenfor / .
+
+ 5. For g tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens
+ du trykker bokstaven o ). Repeter for g enda lengre tilbake. CTRL-I
+ gr framover.
+
+---> feeeiil er ikke mten skrive feil p, feeeiil er helt feil.
+Merk: Nr skingen nr slutten av filen, vil den fortsette fra starten unntatt
+ hvis wrapscan-valget er resatt.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.3: FINN SAMSVARENDE PARENTESER
+
+
+ ** Trykk % for finne en samsvarende ), ] eller } . **
+
+ 1. Plasser markren p en (, [ eller { p linjen nedenfor merket --->.
+
+ 2. Trykk % .
+
+ 3. Markren vil g til den samsvarende parentesen eller hakeparentesen.
+
+ 4. Trykk % for flytte markren til den andre samsvarende parentesen.
+
+ 5. Flytt markren til en annen (, ), [, ], { eller } og se hva % gjr.
+
+---> Dette ( er en testlinje med (, [ ] og { } i den )).
+
+Merk: Dette er veldig nyttig til feilsking i programmer som har ubalansert
+ antall parenteser!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.4: ERSTATT-KOMMANDOEN
+
+
+ ** Skriv :s/gammel/ny/g for erstatte gammel med ny. **
+
+ 1. Flytt markren til linjen nedenfor som er merket med --->.
+
+ 2. Skriv :s/deen/den/ <ENTER> . Legg merke til at denne kommandoen bare
+ forandrer den frste forekomsten av deen p linjen.
+
+ 3. Skriv :s/deen/den/g . Nr g-flagget legges til, betyr dette global
+ erstatning p linjen og erstatter alle forekomster av deen p linjen.
+
+---> deen som kan kaste deen tyngste steinen lengst er deen beste
+
+ 4. For erstatte alle forekomster av en tekststreng mellom to linjer,
+ skriv :#,#s/gammel/ny/g der #,# er linjenumrene p de to linjene for
+ linjeomrdet erstatningen skal gjres.
+ Skriv :%s/gammel/ny/g for erstatte tekst i hele filen.
+ Skriv :%s/gammel/ny/gc for finne alle forekomster i hele filen, og
+ deretter sprre om teksten skal erstattes eller
+ ikke.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 4
+
+
+ 1. Ctrl-G viser nvrende posisjon i filen og filstatusen.
+ G gr til slutten av filen.
+ nummer G gr til det linjenummeret.
+ gg gr til den frste linjen.
+
+ 2. Skriv / etterfulgt av en sketekst for lete FRAMOVER etter teksten.
+ Skriv ? etterfulgt av en sketekst for lete BAKOVER etter teksten.
+ Etter et sk kan du trykke n for finne neste forekomst i den samme
+ retningen eller N for lete i motsatt retning.
+ CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.
+
+ 3. Skriv % nr markren str p en (, ), [, ], { eller } for finne den
+ som samsvarer.
+
+ 4. Erstatte gammel med frste ny p en linje: :s/gammel/ny
+ Erstatte alle gammel med ny p en linje: :s/gammel/ny/g
+ Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g
+ Erstatte alle forekomster i en fil: :%s/gammel/ny/g
+ For godkjenne hver erstatning, legg til c: :%s/gammel/ny/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.1: HVORDAN UTFRE EN EKSTERN KOMMANDO
+
+
+ ** Skriv :! etterfulgt av en ekstern kommando for utfre denne. **
+
+ 1. Skriv den velkjente kommandoen : for plassere markren p bunnen av
+ skjermen. Dette lar deg skrive en kommandolinjekommando.
+
+ 2. N kan du skrive tegnet ! . Dette lar deg utfre en hvilken som helst
+ ekstern kommando.
+
+ 3. Som et eksempel, skriv ls etter utropstegnet og trykk <ENTER>. Du vil
+ n f en liste over filene i katalogen, akkurat som om du hadde kjrt
+ kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis
+ ls ikke virker.
+
+MERK: Det er mulig kjre alle eksterne kommandoer p denne mten, ogs med
+ parametere.
+
+MERK: Alle :-kommandoer m avsluttes med <ENTER>. Fra dette punktet er det
+ ikke alltid vi nevner det.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.2: MER OM LAGRING AV FILER
+
+
+ ** For lagre endringene gjort i en tekst, skriv :w FILNAVN. **
+
+ 1. Skriv :!dir eller :!ls for f en liste over filene i katalogen. Du
+ vet allerede at du m trykke <ENTER> etter dette.
+
+ 2. Velg et filnavn p en fil som ikke finnes, som for eksempel TEST .
+
+ 3. Skriv :w TEST (der TEST er filnavnet du velger).
+
+ 4. Dette lagrer hele filen (denne innfringen) under navnet TEST . For
+ sjekke dette, skriv :!dir eller :!ls igjen for se innholdet av
+ katalogen.
+
+Merk: Hvis du n hadde avsluttet Vim og startet p nytt igjen med vim TEST,
+ ville filen vrt en eksakt kopi av innfringen da du lagret den.
+
+ 5. Fjern filen ved skrive :!rm TEST hvis du er p et Unix-lignende
+ operativsystem, eller :!del TEST hvis du bruker MS-DOS.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES
+
+
+ ** For lagre en del av en fil, skriv v bevegelse :w FILNAVN **
+
+ 1. Flytt markren til denne linjen.
+
+ 2. Trykk v og flytt markren til det femte elementet nedenfor. Legg merke
+ til at teksten blir markert.
+
+ 3. Trykk : (kolon). P bunnen av skjermen vil :'<,'> komme til syne.
+
+ 4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller
+ at du ser :'<,'>w TEST fr du trykker Enter.
+
+ 5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls
+ for se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.
+
+MERK: Ved trykke v startes visuelt valg. Du kan flytte markren rundt for
+ gjre det valgte omrdet strre eller mindre. Deretter kan du bruke en
+ operator for gjre noe med teksten. For eksempel sletter d teksten.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.4: HENTING OG SAMMENSLING AV FILER
+
+
+ ** For lese inn en annen fil inn i nvrende buffer, skriv :r FILNAVN **
+
+ 1. Plasser markren like over denne linjen.
+
+MERK: Etter ha utfrt steg 2 vil du se teksten fra leksjon 5.3. G deretter
+ NED for se denne leksjonen igjen.
+
+ 2. Hent TEST-filen ved bruke kommandoen :r TEST der TEST er navnet p
+ filen du brukte. Filen du henter blir plassert nedenfor markrlinjen.
+
+ 3. For sjekke at filen ble hentet, g tilbake og se at det er to kopier av
+ leksjon 5.3, originalen og denne versjonen.
+
+MERK: Du kan ogs lese utdataene av en ekstern kommando. For eksempel, :r !ls
+ leser utdataene av ls-kommandoen og legger dem nedenfor markren.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 5
+
+
+ 1. :!kommando utfrer en ekstern kommandio.
+
+ Noen nyttige eksempler er:
+ (MS-DOS) (Unix)
+ :!dir :!ls - List filene i katalogen.
+ :!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN.
+
+ 2. :w FILNAVN skriver den nvrende Vim-filen disken med navnet FILNAVN .
+
+ 3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen
+ FILNAVN.
+
+ 4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markren.
+
+ 5. :r !dir leser utdataene fra dir-kommandoen og legger dem nedenfor
+ markrposisjonen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.1: PNE LINJE-KOMMANDOEN
+
+
+ ** Skriv o for pne opp for en ny linje etter markren og g til
+ innsettingsmodus **
+
+ 1. Flytt markren til linjen nedenfor merket --->.
+
+ 2. Skriv o (liten o) for pne opp en linje NEDENFOR markren og g inn i
+ innsettingsmodus.
+
+ 3. Skriv litt tekst og trykk <ESC> for g ut av innsettingsmodusen.
+
+---> Etter at o er skrevet blir markren plassert p den tomme linjen.
+
+ 4. For pne en ny linje OVER markren, trykk rett og slett en stor O
+ istedenfor en liten o . Prv dette p linjen nedenfor.
+
+---> Lag ny linje over denne ved trykke O mens markren er p denne linjen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.2: LEGG TIL-KOMMANDOEN
+
+
+ ** Skriv a for legge til tekst ETTER markren. **
+
+ 1. Flytt markren til starten av linjen merket ---> nedenfor.
+
+ 2. Trykk e til markren er p slutten av li.
+
+ 3. Trykk a (liten a) for legge til tekst ETTER markren.
+
+ 4. Fullfr ordet snn som p linjen nedenfor. Trykk <ESC> for g ut av
+ innsettingsmodusen.
+
+ 5. Bruk e for g til det neste ufullstendige ordet og repeter steg 3 og
+ 4.
+
+---> Denne li lar deg ve p leg til tek p en linje.
+---> Denne linjen lar deg ve p legge til tekst p en linje.
+
+Merk: a, i og A gr alle til den samme innsettingsmodusen, den eneste
+ forskjellen er hvor tegnene blir satt inn.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.3: EN ANNEN MTE ERSTATTE P
+
+
+ ** Skriv en stor R for erstatte mer enn ett tegn. **
+
+ 1. Flytt markren til den frste linjen nedenfor merket --->. Flytt markren
+ til begynnelsen av den frste xxx-en.
+
+ 2. Trykk R og skriv inn tallet som str nedenfor p den andre linjen s
+ det erstatter xxx.
+
+ 3. Trykk <ESC> for g ut av erstatningsmodusen. Legg merke til at resten
+ av linjen forblir uforandret.
+
+ 4. Repeter stegene for erstatte den gjenvrende xxx.
+
+---> Ved legge 123 til xxx fr vi xxx.
+---> Ved legge 123 til 456 fr vi 579.
+
+MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives
+ erstatter et eksisterende tegn.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.4: KOPIERE OG LIME INN TEKST
+
+
+ ** Bruk y-operatoren for kopiere tekst og p for lime den inn **
+
+ 1. G til linjen merket ---> nedenfor og plasser markren etter a).
+
+ 2. G inn i visuell modus med v og flytt markren til like fr frste.
+
+ 3. Trykk y for kopiere (engelsk: yank) den uthevede teksten.
+
+ 4. Flytt markren til slutten av den neste linjen: j$
+
+ 5. Trykk p for lime inn teksten. Trykk deretter: a andre <ESC> .
+
+ 6. Bruk visuell modus for velge valget., kopier det med y , g til
+ slutten av den neste linjen med j$ og legg inn teksten der med p .
+
+---> a) Dette er det frste valget.
+ b)
+
+Merk: Du kan ogs bruke y som en operator; yw kopierer ett ord.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.5: SETT VALG
+
+
+ ** Sett et valg s sk eller erstatning ignorerer store/sm bokstaver. **
+
+ 1. Let etter ignore ved skrive: /ignore <ENTER>
+ Repeter flere ganger ved trykke n .
+
+ 2. Sett ic-valget (Ignore Case) ved skrive: :set ic
+
+ 3. Sk etter ignore igjen ved trykke n .
+ Legg merke til at bde Ignore og IGNORE blir funnet.
+
+ 4. Sett hlsearch- og incsearch-valgene: :set hls is
+
+ 5. Skriv skekommandoen igjen og se hva som skjer: /ignore <ENTER>
+
+ 6. For sl av ignorering av store/sm bokstaver, skriv: :set noic
+
+Merk: For fjerne uthevingen av treff, skriv: :nohlsearch
+Merk: Hvis du vil ignorere store/sm bokstaver for kun en skekommando, bruk
+ \c i uttrykket: /ignore\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 6
+
+ 1. Trykk o for legge til en linje NEDENFOR markren og g inn i
+ innsettingsmodus.
+ Trykk O for pne en linje OVER markren.
+
+ 2. Skriv a for sette inn tekst ETTER markren.
+ Skriv A for sette inn tekst etter slutten av linjen.
+
+ 3. Kommandoen e gr til slutten av et ord.
+
+ 4. Operatoren y (yank) kopierer tekst, p (paste) limer den inn.
+
+ 5. Ved trykke R gr du inn i erstatningsmodus helt til <ESC> trykkes.
+
+ 6. Skriv :set xxx for sette valget xxx. Noen valg er:
+ ic ignorecase ignorer store/sm bokstaver under sk
+ is incsearch vis delvise treff for en sketekst
+ hls hlsearch uthev alle sketreff
+
+ 7. Legg til no foran valget for sl det av: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.1: F HJELP
+
+
+ ** Bruk det innebygde hjelpesystemet. **
+
+ Vim har et omfattende innebygget hjelpesystem. For starte det, prv en av
+ disse mtene:
+ - Trykk Hjelp-tasten (hvis du har en)
+ - Trykk F1-tasten (hvis du har en)
+ - Skriv :help <ENTER>
+
+ Les teksten i hjelpevinduet for finne ut hvordan hjelpen virker.
+ Skriv CTRL-W CTRL-W for hoppe fra et vindu til et annet
+ Skriv :q <ENTER> for lukke hjelpevinduet.
+
+ Du kan f hjelp for omtrent alle temaer om Vim ved skrive et parameter til
+ :help-kommandoen. Prv disse (ikke glem trykke <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.2: LAG ET OPPSTARTSSKRIPT
+
+
+ ** Sl p funksjoner i Vim **
+
+ Vim har mange flere funksjoner enn Vi, men flesteparten av dem er sltt av
+ som standard. For begynne bruke flere funksjoner m du lage en
+ vimrc-fil.
+
+ 1. Start redigeringen av vimrc-filen. Dette avhenger av systemet ditt:
+ :e ~/.vimrc for Unix
+ :e ~/_vimrc for MS Windows
+
+ 2. Les inn eksempelfilen for vimrc:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Lagre filen med:
+ :w
+
+ Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til
+ alle dine foretrukne oppsett i denne vimrc-filen.
+ For mer informasjon, skriv :help vimrc-intro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.3: FULLFRING
+
+
+ ** Kommandolinjefullfring med CTRL-D og <TAB> **
+
+ 1. Vr sikker p at Vim ikke er i Vi-kompatibel modus: :set nocp
+
+ 2. Se hvilke filer som er i katalogen: :!ls eller :!dir
+
+ 3. Skriv starten p en kommando: :e
+
+ 4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med
+ e.
+
+ 5. Trykk <TAB> og Vim vil fullfre kommandonavnet til :edit.
+
+ 6. Legg til et mellomrom og starten p et eksisterende filnavn: :edit FIL
+
+ 7. Trykk <TAB>. Vim vil fullfre navnet (hvis det er unikt).
+
+MERK: Fullfring fungerer for mange kommandoer. Prv ved trykke CTRL-D og
+ <TAB>. Det er spesielt nyttig for bruk sammen med :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 7
+
+
+ 1. Skriv :help eller trykk <F1> eller <Help> for pne et hjelpevindu.
+
+ 2. Skriv :help kommando for f hjelp om kommando .
+
+ 3. Trykk CTRL-W CTRL-W for hoppe til et annet vindu.
+
+ 4. Trykk :q for lukke hjelpevinduet.
+
+ 5. Opprett et vimrc-oppstartsskript for lagre favorittvalgene dine.
+
+ 6. Nr du skriver en :-kommando, trykk CTRL-D for se mulige
+ fullfringer. Trykk <TAB> for bruke en fullfring.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Her slutter innfringen i Vim. Den var ment som en rask oversikt over
+ editoren, akkurat nok til la deg sette i gang med enkel bruk. Den er p
+ langt nr komplett, da Vim har mange flere kommandoer. Les bruksanvisningen
+ ved skrive :help user-manual .
+
+ For videre lesing og studier, kan denne boken anbefales:
+ Vim - Vi Improved av Steve Oualline
+ Utgiver: New Riders
+ Den frste boken som er fullt og helt dedisert til Vim. Spesielt nyttig for
+ nybegynnere. Inneholder mange eksempler og illustrasjoner.
+ Se https://iccf-holland.org/click5.html
+
+ Denne boken er eldre og handler mer om Vi enn Vim, men anbefales ogs:
+ Learning the Vi Editor av Linda Lamb
+ Utgiver: O'Reilly & Associates Inc.
+ Det er en god bok for f vite omtrent hva som helst om Vi.
+ Den sjette utgaven inneholder ogs informasjon om Vim.
+
+ Denne innfringen er skrevet av Michael C. Pierce og Robert K. Ware,
+ Colorado School of Mines med ider av Charles Smith, Colorado State
+ University. E-mail: bware@mines.colorado.edu .
+
+ Modifisert for Vim av Bram Moolenaar.
+ Oversatt av yvind A. Holm. E-mail: vimtutor _AT_ sunbase.org
+ Id: tutor.no 406 2007-03-18 22:48:36Z sunny
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+vim: set ts=8 :
diff --git a/runtime/tutor/tutor.nb.utf-8 b/runtime/tutor/tutor.nb.utf-8
new file mode 100644
index 0000000..6a8a4e9
--- /dev/null
+++ b/runtime/tutor/tutor.nb.utf-8
@@ -0,0 +1,973 @@
+===============================================================================
+= V e l k o m m e n t i l i n n f ø r i n g e n i V i m -- Ver. 1.7 =
+===============================================================================
+
+ Vim er en meget kraftig editor med mange kommandoer, alt for mange til å
+ kunne gå gjennom alle i en innføring som denne. Den er beregnet på å
+ sette deg inn i bruken av nok kommandoer så du vil være i stand til lett
+ å kunne bruke Vim som en editor til alle formål.
+
+ Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30
+ minutter, avhengig av hvor mye tid du bruker til eksperimentering.
+
+ MERK:
+ Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne
+ filen som du kan øve deg på (hvis du kjørte «vimtutor»-kommandoen, er
+ dette allerede en kopi).
+
+ Det er viktig å huske at denne innføringen er beregnet på læring gjennom
+ bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig.
+ Hvis du bare leser teksten, vil du glemme kommandoene!
+
+ Først av alt, sjekk at «Caps Lock» IKKE er aktiv og trykk «j»-tasten for
+ å flytte markøren helt til leksjon 1.1 fyller skjermen.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.1: FLYTTING AV MARKØREN
+
+
+ ** For å flytte markøren, trykk tastene h, j, k, l som vist. **
+ ^
+ k Tips: h-tasten er til venstre og flytter til venstre.
+ < h l > l-tasten er til høyre og flytter til høyre.
+ j j-tasten ser ut som en pil som peker nedover.
+ v
+ 1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene.
+
+ 2. Hold inne nedovertasten (j) til den repeterer.
+ Nå vet du hvordan du beveger deg til neste leksjon.
+
+ 3. Gå til leksjon 1.2 ved hjelp av nedovertasten.
+
+Merk: Hvis du blir usikker på noe du har skrevet, trykk <ESC> for å gå til
+ normalmodus. Skriv deretter kommandoen du ønsket på nytt.
+
+Merk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til
+ å bevege markøren mye raskere når du er blitt vant til det. Helt sant!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.2: AVSLUTTE VIM
+
+
+ !! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!!
+
+ 1. Trykk <ESC>-tasten (for å forsikre deg om at du er i normalmodus).
+
+ 2. Skriv: :q! <ENTER>.
+ Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.
+
+ 3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne
+ innføringen. Den er: vimtutor <ENTER>
+
+ 4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å
+ avslutte og starte editoren på nytt.
+
+MERK: :q! <ENTER> forkaster alle forandringer som du gjorde. I løpet av noen
+ få leksjoner vil du lære hvordan du lagrer forandringene til en fil.
+
+ 5. Flytt markøren ned til leksjon 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.3: REDIGERING AV TEKST -- SLETTING
+
+
+ ** Trykk x for å slette tegnet under markøren. **
+
+ 1. Flytt markøren til den første linjen merket med --->.
+
+ 2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som
+ skal slettes.
+
+ 3. Trykk tasten x for å slette det uønskede tegnet.
+
+ 4. Repeter punkt 2 til 4 til setningen er lik den som er under.
+
+---> Hessstennnn brrråsnudddde ii gaaata.
+---> Hesten bråsnudde i gata.
+
+ 5. Nå som linjen er korrekt, gå til leksjon 1.4.
+
+MERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men
+ bruk dem helt til de sitter.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING
+
+
+ ** Trykk i for å sette inn tekst. **
+
+ 1. Flytt markøren til den første linjen som er merket med --->.
+
+ 2. For å gjøre den første linjen lik den andre, flytt markøren til den står
+ på tegnet ETTER posisjonen der teksten skal settes inn.
+
+ 3. Trykk i og skriv inn teksten som mangler.
+
+ 4. Etterhvert som hver feil er fikset, trykk <ESC> for å returnere til
+ normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.
+
+---> Det er tkst som mnglr .
+---> Det er ganske mye tekst som mangler her.
+
+ 5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen
+ nedenfor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL
+
+
+ ** Trykk A for å legge til tekst. **
+
+ 1. Flytt markøren til den første linjen nedenfor merket --->.
+ Det har ikke noe å si hvor markøren er plassert på den linjen.
+
+ 2. Trykk A og skriv inn det som skal legges til.
+
+ 3. Når teksten er lagt til, trykk <ESC> for å returnere til normalmodusen.
+
+ 4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og
+ 3 for å reparere denne setningen.
+
+---> Det mangler noe tekst p
+ Det mangler noe tekst på denne linjen.
+---> Det mangler også litt tek
+ Det mangler også litt tekst på denne linjen.
+
+ 5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.6: REDIGERE EN FIL
+
+
+ ** Bruk :wq for å lagre en fil og avslutte. **
+
+ !! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!!
+
+ 1. Avslutt denne innføringen som du gjorde i leksjon 1.2: :q!
+
+ 2. Skriv denne kommandoen på kommandolinja: vim tutor <ENTER>
+ «vim» er kommandoen for å starte Vim-editoren, «tutor» er navnet på fila
+ som du vil redigere. Bruk en fil som kan forandres.
+
+ 3. Sett inn og slett tekst som du lærte i de foregående leksjonene.
+
+ 4. Lagre filen med forandringene og avslutt Vim med: :wq <ENTER>
+
+ 5. Start innføringen på nytt og flytt ned til oppsummeringen som følger.
+
+ 6. Etter å ha lest og forstått stegene ovenfor: Sett i gang.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 1
+
+
+ 1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene.
+ h (venstre) j (ned) k (opp) l (høyre)
+
+ 2. For å starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN <ENTER>
+
+ 3. For å avslutte Vim, skriv: <ESC> :q! <ENTER> for å forkaste endringer.
+ ELLER skriv: <ESC> :wq <ENTER> for å lagre forandringene.
+
+ 4. For å slette tegnet under markøren, trykk: x
+
+ 5. For å sette inn eller legge til tekst, trykk:
+ i skriv innsatt tekst <ESC> sett inn før markøren
+ A skriv tillagt tekst <ESC> legg til på slutten av linjen
+
+MERK: Når du trykker <ESC> går du til normalmodus eller du avbryter en uønsket
+ og delvis fullført kommando.
+
+ Nå kan du gå videre til leksjon 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.1: SLETTEKOMMANDOER
+
+
+ ** Trykk dw for å slette et ord. **
+
+ 1. Trykk <ESC> for å være sikker på at du er i normalmodus.
+
+ 2. Flytt markøren til den første linjen nedenfor merket --->.
+
+ 3. Flytt markøren til begynnelsen av ordet som skal slettes.
+
+ 4. Trykk dw og ordet vil forsvinne.
+
+MERK: Bokstaven d vil komme til syne på den nederste linjen på skjermen når
+ du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet
+ tegn enn d har du skrevet noe feil; trykk <ESC> og start på nytt.
+
+---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen.
+---> Det er tre ord som ikke hører hjemme i denne setningen.
+
+ 5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå
+ deretter til leksjon 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.2: FLERE SLETTEKOMMANDOER
+
+
+ ** Trykk d$ for å slette til slutten av linjen. **
+
+ 1. Trykk <ESC> for å være sikker på at du er i normalmodus.
+
+ 2. Flytt markøren til linjen nedenfor merket --->.
+
+ 3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum).
+
+ 4. Trykk d$ for å slette alt til slutten av linjen.
+
+---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye.
+
+ 5. Gå til leksjon 2.3 for å forstå hva som skjer.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.3: OM OPERATORER OG BEVEGELSER
+
+
+ Mange kommandoer som forandrer teksten er laget ut i fra en operator og en
+ bevegelse. Formatet for en slettekommando med sletteoperatoren d er:
+
+ d bevegelse
+
+ Der:
+ d - er sletteoperatoren.
+ bevegelse - er hva operatoren vil opere på (listet nedenfor).
+
+ En kort liste med bevegelser:
+ w - til starten av det neste ordet, UNNTATT det første tegnet.
+ e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet.
+ $ - til slutten av linjen, INKLUDERT det siste tegnet.
+
+ Ved å skrive de vil altså alt fra markøren til slutten av ordet bli
+ slettet.
+
+MERK: Ved å skrive kun bevegelsen i normalmodusen uten en operator vil
+ markøren flyttes som spesifisert.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE
+
+
+ ** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. **
+
+ 1. Flytt markøren til starten av linjen markert ---> nedenfor.
+
+ 2. Skriv 2w for å flytte markøren to ord framover.
+
+ 3. Skriv 3e for å flytte markøren framover til slutten av det tredje
+ ordet.
+
+ 4. Skriv 0 (null) for å flytte til starten av linjen.
+
+ 5. Repeter steg 2 og 3 med forskjellige tall.
+
+---> Dette er en linje med noen ord som du kan bevege deg rundt på.
+
+ 6. Gå videre til leksjon 2.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER
+
+
+ ** Et tall sammen med en operator repeterer den så mange ganger. **
+
+ I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du
+ inn antall før bevegelsen for å slette mer:
+ d nummer bevegelse
+
+ 1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert
+ med --->.
+
+ 2. Skriv 2dw for å slette de to ordene med store bokstaver.
+
+ 3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende
+ ordene som har store bokstaver.
+
+---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar.
+
+MERK: Et antall mellom operatoren d og bevegelsen virker på samme måte som å
+ bruke bevegelsen uten en operator.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.6: OPERERE PÅ LINJER
+
+
+ ** Trykk dd for å slette en hel linje. **
+
+ På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at
+ det vil være lettere å rett og slett trykke to d-er for å slette en linje.
+
+ 1. Flytt markøren til den andre linjen i verset nedenfor.
+ 2. Trykk dd å slette linjen.
+ 3. Flytt deretter til den fjerde linjen.
+ 4. Trykk 2dd for å slette to linjer.
+
+---> 1) Roser er røde,
+---> 2) Gjørme er gøy,
+---> 3) Fioler er blå,
+---> 4) Jeg har en bil,
+---> 5) Klokker viser tiden,
+---> 6) Druer er søte
+---> 7) Og du er likeså.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.7: ANGRE-KOMMANDOEN
+
+
+ ** Trykk u for å angre siste kommando, U for å fikse en hel linje. **
+
+ 1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den
+ første feilen.
+ 2. Trykk x for å slette det første uønskede tegnet.
+ 3. Trykk så u for å angre den siste utførte kommandoen.
+ 4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen x .
+ 5. Trykk nå en stor U for å sette linjen tilbake til det den var
+ originalt.
+ 6. Trykk u noen ganger for å angre U og foregående kommandoer.
+ 7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen
+ ganger for å gjenopprette kommandoene (omgjøre angrekommandoene).
+
+---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre.
+
+ 8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av
+ leksjon 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 2
+
+
+ 1. For å slette fra markøren fram til det neste ordet, trykk: dw
+ 2. For å slette fra markøren til slutten av en linje, trykk: d$
+ 3. For å slette en hel linje, trykk: dd
+
+ 4. For å repetere en bevegelse, sett et nummer foran: 2w
+ 5. Formatet for en forandringskommando er:
+ operator [nummer] bevegelse
+ der:
+ operator - hva som skal gjøres, f.eks. d for å slette
+ [nummer] - et valgfritt antall for å repetere bevegelsen
+ bevegelse - hva kommandoen skal operere på, eksempelvis w (ord),
+ $ (til slutten av linjen) og så videre.
+
+ 6. For å gå til starten av en linje, bruk en null: 0
+
+ 7. For å angre tidligere endringer, skriv: u (liten u)
+ For å angre alle forandringer på en linje, skriv: U (stor U)
+ For å omgjøre angringen, trykk: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.1: «LIM INN»-KOMMANDOEN
+
+
+ ** Trykk p for å lime inn tidligere slettet tekst etter markøren **
+
+ 1. Flytt markøren til den første linjen med ---> nedenfor.
+
+ 2. Trykk dd for å slette linjen og lagre den i et Vim-register.
+
+ 3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn.
+
+ 4. Trykk p for å legge linjen under markøren.
+
+ 5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge.
+
+---> d) Kan du også lære?
+---> b) Fioler er blå,
+---> c) Intelligens må læres,
+---> a) Roser er røde,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.2: «ERSTATT»-KOMMANDOEN
+
+
+ ** Trykk rx for å erstatte tegnet under markøren med x. **
+
+ 1. Flytt markøren til den første linjen nedenfor merket --->.
+
+ 2. Flytt markøren så den står oppå den første feilen.
+
+ 3. Trykk r og deretter tegnet som skal være der.
+
+ 4. Repeter punkt 2 og 3 til den første linjen er lik den andre.
+
+---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster!
+---> Da denne linjen ble skrevet, var det noen som trykket feile taster!
+
+ 5. Gå videre til leksjon 3.2.
+
+MERK: Husk at du bør lære ved å BRUKE, ikke pugge.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.3: «FORANDRE»-OPERATOREN
+
+
+ ** For å forandre til slutten av et ord, trykk ce . **
+
+ 1. Flytt markøren til den første linjen nedenfor som er merket --->.
+
+ 2. Plasser markøren på u i «lubjwr».
+
+ 3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv «injen»).
+
+ 4. Trykk <ESC> og gå til det neste tegnet som skal forandres.
+
+ 5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre.
+
+---> Denne lubjwr har noen wgh som må forkwåp med «forækzryas»-kommandoen.
+---> Denne linjen har noen ord som må forandres med «forandre»-kommandoen.
+
+Vær oppmerksom på at ce sletter ordet og går inn i innsettingsmodus.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c
+
+
+ ** Forandringskommandoen blir brukt med de samme bevegelser som «slett». **
+
+ 1. Forandringsoperatoren fungerer på samme måte som «slett». Formatet er:
+
+ c [nummer] bevegelse
+
+ 2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en
+ linje).
+
+ 3. Gå til den første linjen nedenfor som er merket --->.
+
+ 4. Flytt markøren til den første feilen.
+
+ 5. Skriv c$ og skriv resten av linjen lik den andre og trykk <ESC>.
+
+---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste.
+---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen.
+
+MERK: Du kan bruke slettetasten for å rette feil mens du skriver.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 3
+
+
+ 1. For å legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette
+ limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet
+ vil den bli limt inn på linjen under markøren).
+
+ 2. For å erstatte et tegn under markøren, trykk r og deretter tegnet som
+ du vil ha der.
+
+ 3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen
+ tar deg. Det vil si, skriv ce for å forandre fra markøren til slutten
+ av ordet, c$ for å forandre til slutten av linjen.
+
+ 4. Formatet for «forandre» er:
+
+ c [nummer] bevegelse
+
+Nå kan du gå til neste leksjon.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS
+
+ ** Trykk CTRL-G for å vise posisjonen i filen og filstatusen.
+ Trykk G for å gå til en spesifikk linje i filen. **
+
+ Merk: Les hele leksjonen før du utfører noen av punktene!
+
+ 1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding
+ vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i
+ filen. Husk linjenummeret for bruk i steg 3.
+
+Merk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette
+ skjer når «ruler»-valget er satt (forklart i leksjon 6).
+
+ 2. Trykk G for å gå til bunnen av filen.
+ Skriv gg for å gå til begynnelsen av filen.
+
+ 3. Skriv inn linjenummeret du var på og deretter G . Dette vil føre deg
+ tilbake til linjen du var på da du først trykket CTRL-G.
+
+ 4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.2: SØKEKOMMANDOEN
+
+ ** Skriv / etterfulgt av en søkestreng som du vil lete etter. **
+
+ 1. Trykk / når du er i normalmodusen. Legg merke til at skråstreken og
+ markøren kommer til syne på bunnen av skjermen i likhet med
+ «:»-kommandoene.
+
+ 2. Skriv «feeeiil» og trykk <ENTER>. Dette er teksten du vil lete etter.
+
+ 3. For å finne neste forekomst av søkestrengen, trykk n .
+ For å lete etter samme søketeksten i motsatt retning, trykk N .
+
+ 4. For å lete etter en tekst bakover i filen, bruk ? istedenfor / .
+
+ 5. For å gå tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens
+ du trykker bokstaven o ). Repeter for å gå enda lengre tilbake. CTRL-I
+ går framover.
+
+---> «feeeiil» er ikke måten å skrive «feil» på, feeeiil er helt feil.
+Merk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt
+ hvis «wrapscan»-valget er resatt.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.3: FINN SAMSVARENDE PARENTESER
+
+
+ ** Trykk % for å finne en samsvarende ), ] eller } . **
+
+ 1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->.
+
+ 2. Trykk % .
+
+ 3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen.
+
+ 4. Trykk % for å flytte markøren til den andre samsvarende parentesen.
+
+ 5. Flytt markøren til en annen (, ), [, ], { eller } og se hva % gjør.
+
+---> Dette ( er en testlinje med (, [ ] og { } i den )).
+
+Merk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert
+ antall parenteser!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.4: ERSTATT-KOMMANDOEN
+
+
+ ** Skriv :s/gammel/ny/g for å erstatte «gammel» med «ny». **
+
+ 1. Flytt markøren til linjen nedenfor som er merket med --->.
+
+ 2. Skriv :s/deen/den/ <ENTER> . Legg merke til at denne kommandoen bare
+ forandrer den første forekomsten av «deen» på linjen.
+
+ 3. Skriv :s/deen/den/g . Når g-flagget legges til, betyr dette global
+ erstatning på linjen og erstatter alle forekomster av «deen» på linjen.
+
+---> deen som kan kaste deen tyngste steinen lengst er deen beste
+
+ 4. For å erstatte alle forekomster av en tekststreng mellom to linjer,
+ skriv :#,#s/gammel/ny/g der #,# er linjenumrene på de to linjene for
+ linjeområdet erstatningen skal gjøres.
+ Skriv :%s/gammel/ny/g for å erstatte tekst i hele filen.
+ Skriv :%s/gammel/ny/gc for å finne alle forekomster i hele filen, og
+ deretter spørre om teksten skal erstattes eller
+ ikke.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 4
+
+
+ 1. Ctrl-G viser nåværende posisjon i filen og filstatusen.
+ G går til slutten av filen.
+ nummer G går til det linjenummeret.
+ gg går til den første linjen.
+
+ 2. Skriv / etterfulgt av en søketekst for å lete FRAMOVER etter teksten.
+ Skriv ? etterfulgt av en søketekst for å lete BAKOVER etter teksten.
+ Etter et søk kan du trykke n for å finne neste forekomst i den samme
+ retningen eller N for å lete i motsatt retning.
+ CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.
+
+ 3. Skriv % når markøren står på en (, ), [, ], { eller } for å finne den
+ som samsvarer.
+
+ 4. Erstatte «gammel» med første «ny» på en linje: :s/gammel/ny
+ Erstatte alle «gammel» med «ny» på en linje: :s/gammel/ny/g
+ Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g
+ Erstatte alle forekomster i en fil: :%s/gammel/ny/g
+ For å godkjenne hver erstatning, legg til «c»: :%s/gammel/ny/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO
+
+
+ ** Skriv :! etterfulgt av en ekstern kommando for å utføre denne. **
+
+ 1. Skriv den velkjente kommandoen : for å plassere markøren på bunnen av
+ skjermen. Dette lar deg skrive en kommandolinjekommando.
+
+ 2. Nå kan du skrive tegnet ! . Dette lar deg utføre en hvilken som helst
+ ekstern kommando.
+
+ 3. Som et eksempel, skriv ls etter utropstegnet og trykk <ENTER>. Du vil
+ nå få en liste over filene i katalogen, akkurat som om du hadde kjørt
+ kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis
+ «ls» ikke virker.
+
+MERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med
+ parametere.
+
+MERK: Alle «:»-kommandoer må avsluttes med <ENTER>. Fra dette punktet er det
+ ikke alltid vi nevner det.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.2: MER OM LAGRING AV FILER
+
+
+ ** For å lagre endringene gjort i en tekst, skriv :w FILNAVN. **
+
+ 1. Skriv :!dir eller :!ls for å få en liste over filene i katalogen. Du
+ vet allerede at du må trykke <ENTER> etter dette.
+
+ 2. Velg et filnavn på en fil som ikke finnes, som for eksempel TEST .
+
+ 3. Skriv :w TEST (der TEST er filnavnet du velger).
+
+ 4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å
+ sjekke dette, skriv :!dir eller :!ls igjen for å se innholdet av
+ katalogen.
+
+Merk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med «vim TEST»,
+ ville filen vært en eksakt kopi av innføringen da du lagret den.
+
+ 5. Fjern filen ved å skrive :!rm TEST hvis du er på et Unix-lignende
+ operativsystem, eller :!del TEST hvis du bruker MS-DOS.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES
+
+
+ ** For å lagre en del av en fil, skriv v bevegelse :w FILNAVN **
+
+ 1. Flytt markøren til denne linjen.
+
+ 2. Trykk v og flytt markøren til det femte elementet nedenfor. Legg merke
+ til at teksten blir markert.
+
+ 3. Trykk : (kolon). På bunnen av skjermen vil :'<,'> komme til syne.
+
+ 4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller
+ at du ser :'<,'>w TEST før du trykker Enter.
+
+ 5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls
+ for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.
+
+MERK: Ved å trykke v startes visuelt valg. Du kan flytte markøren rundt for
+ å gjøre det valgte området større eller mindre. Deretter kan du bruke en
+ operator for å gjøre noe med teksten. For eksempel sletter d teksten.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.4: HENTING OG SAMMENSLÅING AV FILER
+
+
+ ** For å lese inn en annen fil inn i nåværende buffer, skriv :r FILNAVN **
+
+ 1. Plasser markøren like over denne linjen.
+
+MERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter
+ NED for å se denne leksjonen igjen.
+
+ 2. Hent TEST-filen ved å bruke kommandoen :r TEST der TEST er navnet på
+ filen du brukte. Filen du henter blir plassert nedenfor markørlinjen.
+
+ 3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av
+ leksjon 5.3, originalen og denne versjonen.
+
+MERK: Du kan også lese utdataene av en ekstern kommando. For eksempel, :r !ls
+ leser utdataene av ls-kommandoen og legger dem nedenfor markøren.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 5
+
+
+ 1. :!kommando utfører en ekstern kommandio.
+
+ Noen nyttige eksempler er:
+ (MS-DOS) (Unix)
+ :!dir :!ls - List filene i katalogen.
+ :!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN.
+
+ 2. :w FILNAVN skriver den nåværende Vim-filen disken med navnet FILNAVN .
+
+ 3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen
+ FILNAVN.
+
+ 4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markøren.
+
+ 5. :r !dir leser utdataene fra «dir»-kommandoen og legger dem nedenfor
+ markørposisjonen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.1: «ÅPNE LINJE»-KOMMANDOEN
+
+
+ ** Skriv o for å «åpne opp» for en ny linje etter markøren og gå til
+ innsettingsmodus **
+
+ 1. Flytt markøren til linjen nedenfor merket --->.
+
+ 2. Skriv o (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i
+ innsettingsmodus.
+
+ 3. Skriv litt tekst og trykk <ESC> for å gå ut av innsettingsmodusen.
+
+---> Etter at o er skrevet blir markøren plassert på den tomme linjen.
+
+ 4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor O
+ istedenfor en liten o . Prøv dette på linjen nedenfor.
+
+---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.2: «LEGG TIL»-KOMMANDOEN
+
+
+ ** Skriv a for å legge til tekst ETTER markøren. **
+
+ 1. Flytt markøren til starten av linjen merket ---> nedenfor.
+
+ 2. Trykk e til markøren er på slutten av «li».
+
+ 3. Trykk a (liten a) for å legge til tekst ETTER markøren.
+
+ 4. Fullfør ordet sånn som på linjen nedenfor. Trykk <ESC> for å gå ut av
+ innsettingsmodusen.
+
+ 5. Bruk e for å gå til det neste ufullstendige ordet og repeter steg 3 og
+ 4.
+
+---> Denne li lar deg øve på å leg til tek på en linje.
+---> Denne linjen lar deg øve på å legge til tekst på en linje.
+
+Merk: a, i og A går alle til den samme innsettingsmodusen, den eneste
+ forskjellen er hvor tegnene blir satt inn.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ
+
+
+ ** Skriv en stor R for å erstatte mer enn ett tegn. **
+
+ 1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren
+ til begynnelsen av den første «xxx»-en.
+
+ 2. Trykk R og skriv inn tallet som står nedenfor på den andre linjen så
+ det erstatter xxx.
+
+ 3. Trykk <ESC> for å gå ut av erstatningsmodusen. Legg merke til at resten
+ av linjen forblir uforandret.
+
+ 4. Repeter stegene for å erstatte den gjenværende xxx.
+
+---> Ved å legge 123 til xxx får vi xxx.
+---> Ved å legge 123 til 456 får vi 579.
+
+MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives
+ erstatter et eksisterende tegn.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.4: KOPIERE OG LIME INN TEKST
+
+
+ ** Bruk y-operatoren for å kopiere tekst og p for å lime den inn **
+
+ 1. Gå til linjen merket ---> nedenfor og plasser markøren etter «a)».
+
+ 2. Gå inn i visuell modus med v og flytt markøren til like før «første».
+
+ 3. Trykk y for å kopiere (engelsk: «yank») den uthevede teksten.
+
+ 4. Flytt markøren til slutten av den neste linjen: j$
+
+ 5. Trykk p for å lime inn teksten. Trykk deretter: a andre <ESC> .
+
+ 6. Bruk visuell modus for å velge « valget.», kopier det med y , gå til
+ slutten av den neste linjen med j$ og legg inn teksten der med p .
+
+---> a) Dette er det første valget.
+ b)
+
+Merk: Du kan også bruke y som en operator; yw kopierer ett ord.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.5: SETT VALG
+
+
+ ** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. **
+
+ 1. Let etter «ignore» ved å skrive: /ignore <ENTER>
+ Repeter flere ganger ved å trykke n .
+
+ 2. Sett «ic»-valget (Ignore Case) ved å skrive: :set ic
+
+ 3. Søk etter «ignore» igjen ved å trykke n .
+ Legg merke til at både «Ignore» og «IGNORE» blir funnet.
+
+ 4. Sett «hlsearch»- og «incsearch»-valgene: :set hls is
+
+ 5. Skriv søkekommandoen igjen og se hva som skjer: /ignore <ENTER>
+
+ 6. For å slå av ignorering av store/små bokstaver, skriv: :set noic
+
+Merk: For å fjerne uthevingen av treff, skriv: :nohlsearch
+Merk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk
+ \c i uttrykket: /ignore\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 6
+
+ 1. Trykk o for å legge til en linje NEDENFOR markøren og gå inn i
+ innsettingsmodus.
+ Trykk O for å åpne en linje OVER markøren.
+
+ 2. Skriv a for å sette inn tekst ETTER markøren.
+ Skriv A for å sette inn tekst etter slutten av linjen.
+
+ 3. Kommandoen e går til slutten av et ord.
+
+ 4. Operatoren y («yank») kopierer tekst, p («paste») limer den inn.
+
+ 5. Ved å trykke R går du inn i erstatningsmodus helt til <ESC> trykkes.
+
+ 6. Skriv «:set xxx» for å sette valget «xxx». Noen valg er:
+ «ic» «ignorecase» ignorer store/små bokstaver under søk
+ «is» «incsearch» vis delvise treff for en søketekst
+ «hls» «hlsearch» uthev alle søketreff
+
+ 7. Legg til «no» foran valget for å slå det av: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.1: FÅ HJELP
+
+
+ ** Bruk det innebygde hjelpesystemet. **
+
+ Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av
+ disse måtene:
+ - Trykk Hjelp-tasten (hvis du har en)
+ - Trykk F1-tasten (hvis du har en)
+ - Skriv :help <ENTER>
+
+ Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker.
+ Skriv CTRL-W CTRL-W for å hoppe fra et vindu til et annet
+ Skriv :q <ENTER> for å lukke hjelpevinduet.
+
+ Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til
+ «:help»-kommandoen. Prøv disse (ikke glem å trykke <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.2: LAG ET OPPSTARTSSKRIPT
+
+
+ ** Slå på funksjoner i Vim **
+
+ Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av
+ som standard. For å begynne å bruke flere funksjoner må du lage en
+ «vimrc»-fil.
+
+ 1. Start redigeringen av «vimrc»-filen. Dette avhenger av systemet ditt:
+ :e ~/.vimrc for Unix
+ :e ~/_vimrc for MS Windows
+
+ 2. Les inn eksempelfilen for «vimrc»:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Lagre filen med:
+ :w
+
+ Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til
+ alle dine foretrukne oppsett i denne «vimrc»-filen.
+ For mer informasjon, skriv :help vimrc-intro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.3: FULLFØRING
+
+
+ ** Kommandolinjefullføring med CTRL-D og <TAB> **
+
+ 1. Vær sikker på at Vim ikke er i Vi-kompatibel modus: :set nocp
+
+ 2. Se hvilke filer som er i katalogen: :!ls eller :!dir
+
+ 3. Skriv starten på en kommando: :e
+
+ 4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med
+ «e».
+
+ 5. Trykk <TAB> og Vim vil fullføre kommandonavnet til «:edit».
+
+ 6. Legg til et mellomrom og starten på et eksisterende filnavn: :edit FIL
+
+ 7. Trykk <TAB>. Vim vil fullføre navnet (hvis det er unikt).
+
+MERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og
+ <TAB>. Det er spesielt nyttig for bruk sammen med :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 7
+
+
+ 1. Skriv :help eller trykk <F1> eller <Help> for å åpne et hjelpevindu.
+
+ 2. Skriv :help kommando for å få hjelp om kommando .
+
+ 3. Trykk CTRL-W CTRL-W for å hoppe til et annet vindu.
+
+ 4. Trykk :q for å lukke hjelpevinduet.
+
+ 5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine.
+
+ 6. Når du skriver en «:»-kommando, trykk CTRL-D for å se mulige
+ fullføringer. Trykk <TAB> for å bruke en fullføring.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Her slutter innføringen i Vim. Den var ment som en rask oversikt over
+ editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på
+ langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen
+ ved å skrive :help user-manual .
+
+ For videre lesing og studier, kan denne boken anbefales:
+ «Vim - Vi Improved» av Steve Oualline
+ Utgiver: New Riders
+ Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for
+ nybegynnere. Inneholder mange eksempler og illustrasjoner.
+ Se https://iccf-holland.org/click5.html
+
+ Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også:
+ «Learning the Vi Editor» av Linda Lamb
+ Utgiver: O'Reilly & Associates Inc.
+ Det er en god bok for å få vite omtrent hva som helst om Vi.
+ Den sjette utgaven inneholder også informasjon om Vim.
+
+ Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware,
+ Colorado School of Mines med idéer av Charles Smith, Colorado State
+ University. E-mail: bware@mines.colorado.edu .
+
+ Modifisert for Vim av Bram Moolenaar.
+ Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org
+ Id: tutor.no 406 2007-03-18 22:48:36Z sunny
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+vim: set ts=8 :
diff --git a/runtime/tutor/tutor.nl b/runtime/tutor/tutor.nl
new file mode 100644
index 0000000..eb5414d
--- /dev/null
+++ b/runtime/tutor/tutor.nl
@@ -0,0 +1,950 @@
+ ==========================================================================
+ = W e l k o m b i j d e V I M l e s s e n - Versie 1.7 =
+ ==========================================================================
+
+ Vim is een krachtige editor met veel commando's, te veel om uit te leggen
+ in lessen zoals deze. Deze lessen zijn bedoeld om voldoende commando's te
+ behandelen om je in staat te stellen met Vim te werken als een editor voor
+ algemeen gebruik.
+
+ Deze lessen zullen 25 tot 30 minuten in beslag nemen, afhankelijk van de
+ tijd die wordt besteed aan het uitproberen van de commando's.
+
+ LET OP:
+ Door de commando's in deze lessen verandert de tekst. Maak een kopie van
+ dit bestand om mee te oefenen (als je "vimtutor" uitvoerde, is dit al een
+ kopie).
+
+ Deze lessen zijn bedoeld om al doende te leren. Dat betekent dat je de
+ commando's moet uitvoeren om ze goed te leren kennen. Als je de tekst
+ alleen maar doorleest, zal je de commando's niet leren!
+
+ Zorg ervoor dat de <Caps Lock> toets NIET is ingedrukt en druk vaak genoeg
+ op de j-toets om de cursor zo te bewegen dat les 1.1 volledig op het
+ scherm staat.
+
+ LET OP: In deze lessen worden omwille van de duidelijkheid vaak spaties
+ gebruikt binnen een commando (bv. "40 G" of "operator [getal] beweging").
+ Tik deze spaties echter NIET. Ze verstoren de werking.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.1: VERPLAATS DE CURSOR
+
+ ** De cursor wordt verplaatst met de toetsen h, j, k, l zoals aangegeven. **
+ ^
+ k Hint: De h is de meest linkse en beweegt naar links.
+ < h l > De l is de meest rechtse en beweegt naar rechts.
+ j De j lijkt op een pijl naar beneden.
+ v
+
+ 1. Beweeg de cursor over het scherm om er vertrouwd mee te raken.
+
+ 2. Druk de omlaag-toets (j) tot hij repeteert.
+ Nu weet je hoe je de volgende les bereikt.
+
+ 3. Gebruik de omlaag-toets om naar les 1.2 te gaan.
+
+ OPMERKING: Als je twijfelt aan wat je tikte, druk <ESC> om in de opdracht-
+ modus te komen. Tik daarna het commando dat bedoeld wordt.
+
+ OPMERKING: Pijltjes-toetsen werken ook. Met de hjkl-toetsen kan je sneller
+ rondbewegen, als je er eenmaal aan gewend bent. Echt waar!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.2: VIM AFSLUITEN
+
+ !! LET OP: Lees deze les goed door voordat je iets uitvoert!!
+
+ 1. Druk de <ESC> toets (om zeker in de opdrachtmodus te zitten).
+
+ 2. Tik :q! <ENTER>
+ Hiermee wordt de editor afgesloten. Alle veranderingen gaan VERLOREN.
+
+ 3. Nu zie je de shell-prompt. Tik het commando waarmee je deze lessen
+ hebt opgeroepen. Dat is normaal gesproken: vimtutor <ENTER>
+
+ 4. Als je deze stappen goed hebt doorgelezen, voer dan de stappen 1 tot 3
+ uit om de editor te verlaten en weer op te starten.
+
+ LET OP: :q! <ENTER> verwerpt alle veranderingen die je aanbracht. Een paar
+ lessen verder zal je leren hoe veranderingen worden opgeslagen in
+ een bestand.
+
+ 5. Beweeg de cursor omlaag naar les 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.3: TEKST BEWERKEN - WISSEN
+
+ ** Tik x om het teken onder de cursor te wissen. **
+
+ 1. Ga met de cursor naar de regel verderop met --->.
+
+ 2. Zet de cursor op een teken dat moet worden gewist om een fout te
+ herstellen.
+
+ 3. Tik x om het ongewenste teken te wissen.
+
+ 4. Herhaal deze stappen tot de regel goed is.
+
+ ---> Vi kkent eenn opdracccchtmodus en een invooegmmmmodus.
+
+ 5. Nu de regel gecorrigeerd is kan je naar les 1.4 gaan.
+
+ LET OP: Probeer de lessen niet uit je hoofd te leren. Leer al doende.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.4: TEKST BEWERKEN - INVOEGEN
+
+ ** Tik i ('insert') om tekst in te voegen. **
+
+ 1. Ga met de cursor naar de eerste regel verderop met --->.
+
+ 2. Maak de eerste regel gelijk aan de tweede. Zet daarvoor de cursor op
+ het karakter waarvoor tekst moet worden ingevoegd.
+
+ 3. Tik i en daarna de nodige aanvullingen.
+
+ 4. Tik <ESC> na elke herstelde fout om terug te keren in de opdrachtmodus.
+ Herhaal de stappen 2 tot 4 om de zin te verbeteren.
+
+ ---> Aan regel ontekt wat .
+ ---> Aan deze regel ontbreekt wat tekst.
+
+ 5. Ga naar les 1.5 als je gewend bent aan het invoegen van tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.5: TEKST BEWERKEN - TOEVOEGEN
+
+ ** Tik A ('append') om tekst toe te voegen. **
+
+ 1. Ga met de cursor naar de eerste regel verderop met --->.
+ Het maakt niet uit waar de cursor in deze regel staat.
+
+ 2. Tik hoofdletter A en tik de nodige aanvullingen.
+
+ 3. Tik <ESC> nadat de tekst is aangevuld. Zo keer je terug in de
+ opdrachtmodus.
+
+ 4. Ga naar de tweede regel verderop met ---> en herhaal stap 2 en 3
+ om deze zin te corrigeren.
+
+ ---> Er ontbreekt wat tekst aan de
+ Er ontbreekt wat tekst aan deze regel.
+ ---> Hier ontbreekt ook w
+ Hier ontbreekt ook wat tekst.
+
+ 5. Ga naar les 1.6 als je vertrouwd bent geraakt aan het toevoegen
+ van tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.6: EEN BESTAND EDITTEN
+
+ ** Gebruik :wq om een bestand op te slaan en de editor te verlaten. **
+
+ !! LET OP: Lees deze les helemaal door voordat je een van de volgende
+ stappen uitvoert!!
+
+ 1. Verlaat deze les zoals je in les 1.2 deed: :q!
+ Of gebruik een andere terminal als je daar de beschikking over hebt. Doe
+ daar het volgende.
+
+ 2. Tik het volgende commando na de shell-prompt: vim les <ENTER>
+ 'vim' (vaak ook 'vi') is het commando om de Vim-editor te starten,
+ 'les' is de naam van het bestand, dat je gaat bewerken. Kies een andere
+ naam als er al een bestand 'les' bestaat, dat niet veranderd mag worden.
+
+ 3. Voeg naar eigen keus tekst toe, zoals je geleerd hebt in eerdere lessen.
+
+ 4. Sla het bestand met de wijzigingen op en verlaat Vim met :wq <ENTER>
+
+ 5. Herstart vimtutor als je deze bij stap 1 hebt verlaten en ga verder met
+ de volgende samenvatting.
+
+ 6. Voer deze stappen uit nadat je ze hebt gelezen en begrepen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 1
+
+ 1. De cursor wordt bewogen met de pijltjestoetsen of de hjkl-toetsen.
+ h (links) j (omlaag) k (omhoog) l (rechts)
+
+ 2. Start Vim van de shell-prompt. Tik: vim BESTANDSNAAM <ENTER>
+
+ 3. Sluit Vim af met <ESC> :q! <ENTER> om de veranderingen weg te gooien.
+ OF tik <ESC> :wq <ENTER> om de veranderingen te bewaren.
+
+ 4. Wis het teken onder de cursor met: x
+
+ 5. Invoegen of toevoegen van tekst, tik:
+ i en daarna de in te voegen tekst <ESC> voeg in vanaf de cursor
+ A en daarna de toe te voegen tekst <ESC> voeg toe achter de regel
+
+ OPMERKING: Met <ESC> kom je terug in opdrachtmodus en wordt een ongewenst
+ of gedeeltelijk uitgevoerd commando afgebroken.
+
+ Ga nu verder met les 2.1.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.1: WIS-COMMANDO'S
+
+ ** Tik dw ('delete word') om een woord te wissen. **
+
+ 1. Druk op <ESC> om zeker in de opdrachtmodus te zijn.
+
+ 2. Ga naar de regel hieronder, die met ---> begint.
+
+ 3. Ga met de cursor naar het begin van een woord dat moet worden gewist.
+
+ 4. Met het tikken van dw verdwijnt het woord.
+
+ OPMERKING: De letter d verschijnt op de laatste regel van het scherm
+ zodra je hem tikt. Vim is aan het wachten tot je de w tikt.
+ Als je een ander teken dan d ziet, heb je iets verkeerds
+ getikt. Druk op <ESC> en begin opnieuw.
+
+ NOG EEN OPMERKING: Dit werkt alleen als de optie 'showcmd' is ingeschakeld.
+ Dat gebeurt met :set showcmd <ENTER>
+
+ ---> Er zijn een het paar ggg woorden, die niet in deze len zin thuishoren.
+
+ 5. Herhaal de stappen 3 en 4 tot de zin goed is en ga naar les 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.2: MEER WIS-COMMANDO'S
+
+ ** Tik d$ om te wissen tot het einde van de regel. **
+
+ 1. Druk op <ESC> om zeker in de opdrachtmodus te zijn.
+
+ 2. Ga naar de regel hieronder, die met ---> begint.
+
+ 3. Ga met de cursor naar het einde van de correcte regel (NA de eerste . ).
+
+ 4. Tik d$ om te wissen tot het einde van de regel.
+
+ ---> Iemand heeft het einde van deze regel dubbel getikt. dubbel getikt.
+
+ 5. Ga naar les 2.3 voor uitleg.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.3: OVER OPERATOREN EN BEWEGINGEN
+
+ Veel commando's die de tekst veranderen, bestaan uit een operator en een
+ beweging. De samenstelling van een wis-commando met de operator d is:
+ d beweging
+
+ Daarbij is:
+ d - de wis-operator
+ beweging - het bereik waarop de operator werkt (zie het lijstje hieronder)
+
+ Een korte lijst van bewegingen vanaf de cursor:
+ w - tot het begin van het volgende woord, ZONDER het eerste teken daarvan.
+ e - tot het einde van het huidige woord, INCLUSIEF het laatste teken.
+ $ - tot het einde van de regel, INCLUSIEF het laatste teken.
+
+ Het tikken van de wist tekst vanaf de cursor tot het eind van het woord.
+
+ OPMERKING: Het intikken van alleen maar de beweging, zonder een operator,
+ in de opdrachtmodus beweegt de cursor (respectievelijk naar het
+ volgende woord, naar het eind van het huidige woord en naar het
+ eind van de regel).
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.4: GEBRUIK VAN EEN TELLER BIJ EEN BEWEGING
+
+ ** Een getal voor een beweging herhaalt het zoveel keer. **
+
+ 1. Ga naar de regel hieronder, die met ---> begint.
+
+ 2. Tik 2w zodat de cursor twee woorden vooruit gaat.
+
+ 3. Tik 3e zodat de cursor naar het einde van het derde woord gaat.
+
+ 4. Tik 0 (nul) om naar het begin van de regel te gaan.
+
+ 5. Herhaal de stappen 2 en 3 met andere getallen.
+
+ ---> Dit is een regel met woorden waarin je heen en weer kan bewegen.
+
+ 6. Ga verder met les 2.5.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.5: GEBRUIK EEN TELLER OM MEER TE WISSEN
+
+ ** Een getal met een operator zorgt dat deze zoveel keer wordt herhaald. **
+
+ Bij de combinatie van wis-operator en beweging kan je voor de beweging een
+ teller zetten om meer te wissen:
+ d [teller] beweging
+
+ 1. Ga naar het eerste woord in HOOFDLETTERS in de regel na --->.
+
+ 2. Met d2w worden twee woorden (in dit voorbeeld in hoofdletters) gewist.
+
+ 3. Herhaal de stappen 1 en 2 met verschillende tellers om de verschillende
+ woorden in hoofdletters met n commando te wissen.
+
+ ---> deze ABC DE regel FGHI JK LMN OP is QZ RS ontdaan van rommel.
+
+ OPMERKING: De teller kan ook aan het begin staan: d2w en 2dw werken allebei.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.6: BEWERKING VAN HELE REGELS
+
+ ** Tik dd om een hele regel te wissen. **
+
+ Omdat het wissen van een hele regel vaak voorkomt, besloten de ontwerpers
+ van Vi dat met het tikken van dd simpelweg een hele regel gewist wordt.
+
+ 1. Ga met de cursor naar de tweede regel van de zinnetjes hieronder.
+
+ 2. Tik dd om de regel te wissen.
+
+ 3. Ga nu naar de vierde regel.
+
+ 4. Tik 2dd om twee regels te wissen.
+
+ ---> 1) Rozen zijn rood.
+ ---> 2) Modder is leuk.
+ ---> 3) Viooltjes zijn blauw.
+ ---> 4) Ik heb een auto.
+ ---> 5) De klok slaat de tijd.
+ ---> 6) Suiker is zoet.
+ ---> 7) En dat ben jij ook.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.7: HET COMMANDO HERSTEL
+
+ ** u maakt het laatste commando ongedaan, U herstelt een hele regel. **
+
+ 1. Ga met de cursor naar de regel hieronder met ---> en zet hem
+ op de eerste fout.
+
+ 2. Tik x om het eerste ongewenste teken te wissen.
+
+ 3. Tik nu u en maak daarmee het vorige commando ongedaan.
+
+ 4. Herstel nu alle fouten in de regel met het x commando.
+
+ 5. Tik een hoofdletter U om de regel in z'n oorspronkelijke staat terug
+ te brengen.
+
+ 6. Tik nu een paar keer u en herstel daarmee de U en eerdere commando's.
+
+ 7. Tik nu een paar keer CTRL-R (Ctrl-toets ingedrukt houden en R tikken) en
+ voer daarmee de commando's opnieuw uit: 'redo' oftewel 'undo de undo's'.
+
+ ---> Heerstel de fouten inn deeze regel en brenng ze weer terugg met undo.
+
+ 8. Dit zijn heel nuttige commando's. Ga verder met samenvatting van les 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 2
+
+ 1. Wis van de cursor tot het volgende woord met dw
+
+ 2. Wis van de cursor tot het eind van de regel met d$
+
+ 3. Wis de hele regel met dd
+
+ 4. Herhaal een beweging door er een getal voor te zetten: 2w
+
+ 5. De opbouw van een wijzigingscommando is:
+ operator [getal] beweging
+ daarbij is:
+ operator - wat er moet gebeuren, bijvoorbeeld d om te wissen
+ [getal] - een (niet-verplichte) teller om 'beweging' te herhalen
+ beweging - een beweging door de te wijzigen tekst zoals w (woord)
+ of $ (tot het einde van de regel) enz.
+
+ 6. Ga naar het begin van de regel met nul: 0
+
+ 7. Undo de voorgaande actie met u (kleine letter)
+ Undo alle veranderingen in een regel met U (hoofdletter)
+ Undo de undo's met CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 3.1: HET COMMANDO PLAK
+
+ ** Tik p ('put') en plak daarmee zojuist gewiste tekst na te cursor. **
+
+ 1. Ga met de cursor naar de eerste regel met ---> hierna.
+
+ 2. Wis de regel met dd en bewaar hem zodoende in een Vim-register.
+
+ 3. Ga naar de c-regel, waar de gewiste regel ONDER moet komen.
+
+ 4. Tik p om de regel terug te zetten onder de regel met de cursor.
+
+ 5. Herhaal de stappen 2 tot 4 om de regels in de goede volgorde te zetten.
+
+---> d) Krijg je het ook onder de knie?
+---> b) Viooltjes zijn blauw,
+---> c) Begrip is te leren,
+---> a) Rozen zijn rood,
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 3.2: HET COMMANDO VERVANG
+
+ ** Tik rx ('replace') om het teken onder de cursor te vervangen door x. **
+
+ 1. Ga naar de eerste regel hieronder met --->.
+
+ 2. Zet de cursor op de eerste fout.
+
+ 3. Tik r en dan het teken dat er hoort te staan.
+
+ 4. Herhaal de stappen 2 en 3 tot de eerste regel gelijk is aan de tweede.
+
+ ---> Bij het tokken van dezf hegel heeft iemamd verklerde letters getikt.
+ ---> Bij het tikken van deze regel heeft iemand verkeerde letters getikt.
+
+ 5. Ga nu naar les 3.3.
+
+ LET OP: Door het te doen, leer je beter dan door het uit je hoofd te leren.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 3.3: HET COMMANDO VERANDER
+
+ ** Tik ce om te veranderen tot het einde van een woord. **
+
+ 1. Ga met de cursor naar de eerste regel hieronder met --->.
+
+ 2. Zet de cursor op de u van ruch.
+
+ 3. Tik ce en de juiste letters (in dit geval "egel").
+
+ 4. Druk <ESC> en ga naar het volgende teken dat moet worden veranderd.
+
+ 5. Herhaal de stappen 3 en 4 tot de eerste regel gelijk is aan de tweede.
+
+ ---> In deze ruch staan een paar weedrim die veranderd moud worden.
+ ---> In deze regel staan een paar woorden die veranderd moeten worden.
+
+ LET OP: Met ce wordt (het laatste deel van) een woord gewist en kom je
+ in de invoegmodus.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 3.4: MEER VERANDERINGEN MET c
+
+ 1. Het commando verander ('change') werkt op dezelfde manier als wis. De
+ opbouw is:
+ c [teller] beweging
+
+ 2. De bewegingen zijn hetzelfde, zoals w (woord) en $ (einde regel).
+
+ 3. Ga naar de eerste regel hieronder met --->.
+
+ 4. Zet de cursor op de eerste fout.
+
+ 5. Tik c$ en tik de rest van de regel zodat hij gelijk wordt aan de
+ tweede en sluit af met <ESC>.
+
+ ---> Het einde van deze regel moet precies zo worden als de tweede regel.
+ ---> Het einde van deze regel moet gecorrigeerd worden met het commando c$.
+
+ OPMERKING: Je kan de toets <BACKSPACE> gebruiken om tikfouten te herstellen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 3
+
+ 1. Tik p om tekst terug te plakken, die zojuist is gewist. Dit zet de
+ gewiste tekst ACHTER de cursor (als een hele regel is gewist komt deze
+ op de regel ONDER de cursor.
+
+ 2. Het teken waarop de cursor staat wordt vervangen met r gevolgd door
+ het teken dat je daar wilt hebben.
+
+ 3. Het commando 'verander' stelt je in staat om tekst te veranderen vanaf
+ de cursor tot waar de 'beweging' je brengt. Dat wil zeggen: tik ce om
+ te veranderen vanaf de cursor tot het einde van het woord, c$ om te
+ veranderen tot het einde van de regel.
+
+ 4. De opbouw van het commando verander is:
+ c [teller] beweging
+
+ Ga nu naar de volgende les.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 4.1: PLAATS VAN DE CURSOR EN STATUS VAN HET BESTAND
+
+ ** CTRL-G laat zien waar (regelnummer) je je bevindt en wat de status van
+ het bestand is. Met [nummer] G ga je naar een bepaalde regel. **
+
+ LET OP: Lees de hele les voordat je een stap uitvoert!!
+
+ 1. Hou de Ctrl-toets ingedrukt en tik g . Dit noemen we CTRL-G.
+ Onderaan de pagina verschijnt een boodschap met de bestandsnaam en de
+ positie in het bestand. Onthou het regelnummer voor stap 3.
+
+ OPMERKING: Als de optie 'ruler' aan staat, wordt de positie van de cursor
+ (regelnummer, kolom) steeds in de rechter-onderhoek van het
+ scherm vermeld. In dit geval vermeldt CTRL-G geen regelnummer.
+ CTRL-G geeft ook de status aan, namelijk of de tekst veranderd
+ is ('modified') sinds het de laatste keer is opgeslagen.
+
+ 2. Tik hoofdletter G om naar het einde van het bestand te gaan.
+ Tik gg om naar het begin van het bestand te gaan.
+
+ 3. Tik het regelnummer waar je bij stap 1 was en daarna G . Dit brengt je
+ terug naar de regel waar je was toen je de eerste keer CTRL-G tikte.
+
+ 4. Voer de stappen 1 tot 3 uit als je dit goed hebt gelezen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 4.2: HET COMMANDO ZOEKEN
+
+ ** Met /ZOEK wordt naar de zoekterm (n of meer woorden) gezocht. **
+
+ 1. Tik in de opdrachtmodus het teken / . Je ziet dat het met de cursor
+ aan de onderkant van het scherm verschijnt, zoals bij het :-commando.
+
+ 2. Tik nu 'ffouut' <ENTER>. Dit is het woord waarnaar gezocht wordt.
+
+ 3. Tik n om verder te zoeken met dezelfde zoekterm.
+ Zoek met N met dezelfde zoekterm in de tegenovergestelde richting.
+
+ 4. Zoek in achterwaartse richting met ?zoekterm in plaats van / .
+
+ 5. Keer terug naar de vorige hit met CTRL-O (hou Ctrl-toets ingedrukt en
+ tik letter o). Herhaal om verder terug te gaan. CTRL-I gaat vooruit.
+
+ ---> "ffouut" is niet de juiste spelling van fout, ffouut is een fout.
+
+ OPMERKING: Als zoeken het einde van het bestand bereikt, wordt vanaf het
+ begin doorgezocht, tenzij de optie 'wrapscan' is uitgeschakeld.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 4.3: GA NAAR CORRESPONDERENDE HAAKJES
+
+ ** Tik % om naar corresponderende ), ] of } te gaan. **
+
+ 1. Zet de cursor op een (, [ of { in de regel hieronder met --->.
+
+ 2. Tik dan het teken % .
+
+ 3. De cursor gaan naar het overeenkomstige haakje.
+
+ 4. Met opnieuw % gaat de cursor terug naar het eerste haakje.
+
+ 5. Plaats de cursor op een ander haakje en bekijk wat % doet.
+
+ ---> Dit ( is een testregel met ('s, ['s ] en {'s } erin. ))
+
+ OPMERKING: Dit is nuttig bij het debuggen van een programma waarin haakjes
+ niet corresponderen. Met de optie 'showmatch' wordt ook
+ aangegeven of haakjes corresponderen, maar de cursor wordt niet
+ (blijvend) verplaatst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 4.4: HET VERVANG COMMANDO
+
+ ** Tik :s/oud/nieuw/g om 'oud' door 'nieuw' te vervangen. **
+
+ 1. Ga met de cursor naar de regel hieronder met --->.
+
+ 2. Tik :s/dee/de <ENTER>. Zoals je ziet, vervangt ('substitute') dit
+ commando alleen de eerste "dee" in de regel.
+
+ 3. Tik nu :s/dee/de/g . Met de g-vlag ('global') wordt elke "dee" in de
+ regel vervangen.
+
+ ---> dee beste tijd om dee bloemen te zien is in dee lente.
+
+ 4. Om in (een deel van) een tekst elk 'oud' te vervangen door 'nieuw':
+ tik :#,#s/oud/nieuw/g waar #,# de regelnummers zijn die het gebied
+ begrenzen waarin wordt vervangen.
+ tik :%s/oud/nieuw/g om alles te vervangen in het hele bestand.
+ tik :%s/oud/nieuw/gc om elke 'oud' in het hele bestand te vinden
+ en te vragen of er vervangen moet worden.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 4
+
+ 1. CTRL-G laat positie in het bestand zien en de status van het bestand.
+ G verplaatst je naar het einde van het bestand.
+ nummer G verplaatst je naar regelnummer.
+ gg verplaatst je naar de eerste regel.
+
+ 2. Met / en een zoekterm wordt VOORWAARTS gezocht naar de term.
+ Met ? en een zoekterm wordt ACHTERWAARTS gezocht naar de term.
+ Tik n na een zoekopdracht om de volgende hit te vinden,
+ of tik N om in de andere richting te zoeken.
+ CTRL-O brengt je naar eerdere hit, CTRL-I naar nieuwere.
+
+ 3. Tik % terwijl de cursor op een haakje ([{}]) staat, om naar het
+ corresponderende haakje te gaan.
+
+ 4. :s/oud/nieuw vervangt het eerste 'oud' in een regel door 'nieuw'.
+ :s/oud/nieuw/g vervangt elk 'oud' in een regel door 'nieuw'.
+ :#,#s/oud/nieuw/g vervangt elk 'oud' door 'nieuw' tussen de regelnummers.
+ :%s/oud/nieuw/g vervangt elk 'oud' door 'nieuw' in het hele bestand.
+ Voeg c toe (:%s/oud/nieuw/gc) om elke keer om bevestiging
+ ('confirmation') te vragen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 5.1: HOE EEN EXTERN COMMANDO WORDT UITGEVOERD
+
+ ** Tik :! gevolgd door een extern commando om dat uit te voeren. **
+
+ 1. Tik het commando : waarmee de cursor op de onderste regel van het
+ scherm komt te staan. Nu kan je een opdracht geven via de commando-regel.
+
+ 2. Tik een ! (uitroepteken). Dit stelt je in staat om elk shell-commando
+ uit te voeren.
+
+ 3. Tik bijvoorbeeld ls na het uitroepteken en daarna <ENTER>. Hiermee
+ krijg je de inhoud van je map te zien, net alsof je de opdracht gaf
+ vanaf de shell-prompt. Probeer :!dir als het niet werkt.
+
+ OPMERKING: Elk extern commando kan op deze manier uitgevoerd worden, ook
+ met argumenten.
+
+ OPMERKING: Alle commando's na : moeten worden afgesloten met <ENTER>.
+ Vanaf nu zullen we dat niet meer altijd vermelden.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 5.2: MEER OVER HET OPSLAAN VAN BESTANDEN
+
+ ** Tik :w BESTANDSNAAM om de tekst mt veranderingen op te slaan. **
+
+ 1. Tik :!dir of :!ls om de inhoud van je map te tonen. Je weet
+ inmiddels dat je daarna een <ENTER> moet tikken.
+
+ 2. Kies een bestandsnaam die nog niet bestaat, bijvoorbeeld TEST.
+
+ 3. Tik nu: :w TEST (als je de naam TEST hebt gekozen).
+
+ 4. Hierdoor wordt het hele bestand (de VIM lessen) opgeslagen onder de
+ naam TEST. Tik weer :!dir of :!ls om dit te controleren.
+
+ OPMERKING: Als je Vim zou verlaten en opnieuw zou starten met vim TEST is
+ het bestand een exacte kopie van de lessen, zoals je ze opsloeg.
+
+ 5. Wis het bestand nu met de opdracht (MS-DOS) :!del TEST
+ of (Unix) :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 5.3: EEN DEEL VAN DE TEKST OPSLAAN
+
+ ** Sla een deel van het bestand op met v beweging :w BESTANDSNAAM **
+
+ 1. Ga naar deze regel.
+
+ 2. Tik v en ga met de cursor naar stap 5 hieronder. Je ziet dat de
+ tekst oplicht.
+
+ 3. Tik : . Onderaan het scherm zal :'<,'> verschijnen.
+
+ 4. Tik w TEST , waar TEST een bestandsnaam is, die nog niet bestaat.
+ Controleer dat je :'<,'>w TEST ziet staan voordat je <ENTER> tikt.
+
+ 5. Vim slaat nu de geselecteerde regels op in het bestand TEST. Met
+ :!dir of !ls kan je dat zien. Wis het nog niet! We zullen het in
+ de volgende les gebruiken.
+
+ OPMERKING: Het tikken van v zet zichtbare modus ('visual selection') aan.
+ Je kan de cursor rondbewegen om de selectie groter of kleiner
+ te maken. Vervolgens kan je een commando gebruiken om iets met
+ de tekst te doen. Met d bijvoorbeeld wis je de tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 5.4: OPHALEN EN SAMENVOEGEN VAN BESTANDEN
+
+ ** Tik :r BESTANDSNAAM om de inhoud van een bestand in te voegen. **
+
+ 1. Zet de cursor precies boven deze regel.
+
+ OPMERKING: Na het uitvoeren van stap 2 zie je tekst van les 5.3. Scrol
+ daarna naar beneden om deze les weer te zien.
+
+ 2. Haal nu het bestand TEST op met het commando :r TEST .
+ Het bestand dat je ophaalt komt onder de regel waarin de cursor staat.
+
+ 3. Controleer dat er een bestand is opgehaald. Ga met de cursor omhoog.
+ Dan zie je de tekst van les 5.3 dubbel, het origineel en de versie uit
+ het bestand.
+
+ OPMERKING: Je kan ook de uitvoer van een extern commando inlezen. Om een
+ voorbeeld te geven: :r !ls leest de uitvoer van het commando
+ ls en zet dat onder de regel waarin de cursor staat.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 5
+
+ 1. :!COMMANDO voert een extern commando uit.
+ Enkele bruikbare voorbeelden zijn:
+ (MS-DOS) (Unix)
+ :!dir :!ls - laat de inhoud van een map zien
+ :!del BESTAND :!rm BESTAND - wist bestand BESTAND
+
+ 2. :w BESTANDSNAAM schrijft het huidige Vim-bestand naar disk met de
+ naam BESTANDSNAAM.
+
+ 3. v beweging :w BESTANDSNAAM laat je in zichtbare modus een fragment
+ selecteren, dat wordt opgeslagen in het bestand BESTANDSNAAM.
+
+ 4. :r BESTANDSNAAM haalt het bestand BESTANDSNAAM op en voegt het onder
+ de cursor-positie in de tekst in.
+
+ 5. :r !dir leest de uitvoer van het externe commando dir en zet het onder
+ de cursor-positie.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.1: HET COMMANDO OPEN
+
+ ** Tik o om een regel onder de cursor te openen in invoegmodus. **
+
+ 1. Ga naar de eerste regel beneden met --->.
+
+ 2. Tik de kleine letter o en open daarmee een regel ONDER de cursor en
+ ga naar de invoegmodus.
+
+ 3. Tik wat tekst in en sluit af met <ESC> om de invoegmodus te verlaten.
+
+ ---> Als je o tikt, komt de cursor in een nieuwe regel in invoegmodus.
+
+ 4. Om een regel BOVEN de cursor te openen, moet je gewoon een hoofdletter
+ O tikken in plaats van een kleine letter. Probeer dat vanaf de volgende
+ regel.
+
+ ---> Open een regel hierboven. Tik een O terwijl de cursor hier staat.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.2: HET COMMANDO TOEVOEGEN
+
+ ** Tik a om tekst toe te voegen ACHTER de cursor. **
+
+ 1. Ga naar het begin van de regel beneden met --->.
+
+ 2. Tik e tot de cursor op het einde van "ste" staat.
+
+ 3. Tik een (kleine letter) a ('append') om toe te voegen ACHTER de cursor.
+
+ 4. Vul het woord aan zoals in de volgende regel. Druk <ESC> om de
+ invoegmodus te verlaten.
+
+ 5. Ga met e naar het einde van het volgende onvolledige woord en herhaal
+ de stappen 3 en 4.
+
+ ---> Deze regel ste je in staat om te oef in het toevo van tekst.
+ Deze regel stelt je in staat om te oefenen in het toevoegen van tekst.
+
+ OPMERKING: a, i en A openen allemaal dezelfde invoegmodus, het enige
+ verschil is waar tekens worden ingevoegd.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.3: VERVANGEN OP EEN ANDERE MANIER
+
+ ** Tik een hoofdletter R om meer dan n teken te vervangen. **
+
+ 1. Ga naar de eerste regel beneden met --->. Ga met de cursor naar het
+ begin van de eerste "xxx" .
+
+ 2. Tik nu R en daarna het getal eronder in de tweede regel, zodat xxx
+ wordt vervangen.
+
+ 3. Druk <ESC> om de vervangmodus te verlaten. Je ziet dat de rest van de
+ regel ongewijzigd blijft.
+
+ 4. Herhaal de stappen om de overgebleven xxx te vervangen.
+
+ ---> Optellen van 123 en xxx geeft je xxx.
+ ---> Optellen van 123 en 456 geeft je 579.
+
+ OPMERKING: Vervangmodus lijkt op invoegmodus, maar elk teken dat je tikt,
+ vervangt een bestaand teken.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.4: TEKST KOPIREN EN PLAKKEN
+
+ ** Gebruik y om tekst te kopiren en p om te plakken. **
+
+ 1. Ga naar de regel beneden met ---> en zet de cursor achter "a)".
+
+ 2. Zet zichtbare modus aan met v en zet de cursor juist voor "eerste".
+
+ 3. Tik y ('yank') om de opgelichte tekst ("dit is het") te kopiren.
+
+ 4. Ga met j$ met de cursor naar het einde van de volgende regel.
+
+ 5. Plak de gekopieerde tekst met p en tik a tweede <ESC>.
+
+ 6. Selecteer in zichtbare modus "onderdeel", kopieer het met y en
+ ga met j$ naar het einde van de tweede regel. Plak de tekst daar
+ met p .
+
+ ---> a) dit is het eerste onderdeel
+ b)
+
+ OPMERKING: Je kan y ook als operator gebruiken; yw kopieert een woord,
+ yy een hele regel.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.5: OPTIES GEBRUIKEN
+
+ ** Gebruik een optie voor al dan niet hoofdlettergevoelig zoeken. **
+
+ 1. Zoek naar 'hoofdlettergevoelig' met /hoofdlettergevoelig <ENTER>
+ Herhaal het zoeken enkele keren door n te tikken.
+
+ 2. Schakel de optie 'ic' ('ignore case', niet-hoofdlettergevoelig) in
+ met :set ic
+
+ 3. Zoek met n opnieuw naar 'hoofdlettergevoelig'. Je ziet dat
+ Hoofdlettergevoelig en HOOFDLETTERGEVOELIG nu ook gevonden worden.
+
+ 4. Schakel de opties 'hlsearch' (treffers oplichten) en 'incsearch' (toon
+ gedeeltelijke treffers bij intikken) in met :set hls is
+
+ 5. Tik weer /hoofdlettergevoelig <ENTER> en kijk wat er gebeurt.
+
+ 6. Schakel 'hoofdlettergevoelig' weer in met :set noic
+
+ OPMERKING: Schakel het oplichten van treffers uit met :nohlsearch
+
+ OPMERKING: Om bij een enkel zoek-commando de hoofdlettergevoeligheid om
+ te draaien kan \c worden gebruikt na de zoekterm:
+ /hoofdlettergevoelig\c <ENTER>.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 6
+
+ 1. Tik o om een regel te openen ONDER de cursor en invoegmodus te starten.
+ Tik O om een regel te openen BOVEN de cursor.
+
+ 2. Tik a om tekst toe te voegen NA de cursor.
+ Tik A om tekst toe te voegen aan het einde van de regel.
+
+ 3. Het commando e beweegt de cursor naar het einde van een woord.
+
+ 4. De operator y yankt (kopieert) tekst, p zet het terug (plakt).
+
+ 5. Met hoofdletter R wordt de vervangmodus geopend, met <ESC> afgesloten.
+
+ 6. Met :set xxx wordt optie 'xxx' ingeschakeld. Opties zijn bijvoorbeeld:
+ ic ignorecase geen verschil hoofdletters/kleine letters bij zoeken
+ is incsearch toon gedeeltelijke treffers tijdens intikken zoekterm
+ hls hlsearch laat alle treffers oplichten
+ Je kan zowel de lange als de korte naam van een optie gebruiken.
+
+ 7. Zet 'no' voor de naam om een optie uit te schakelen: :set noic
+ schakelt 'ic' uit.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 7.1: HULP INROEPEN
+
+ ** Het gebruik van ingebouwde hulp. **
+
+ Vim heeft een uitgebreid ingebouwd hulpsysteem. Probeer, om te beginnen,
+ n van deze drie:
+ - druk de <HELP> toets (als je die hebt)
+ - druk de <F1> toets (als je die hebt)
+ - tik :help <ENTER>
+
+ Lees de tekst in het help-venster om te leren hoe 'help' werkt.
+ Tik CTRL-W CTRL-W om van het ene venster naar het andere te gaan.
+ Met :q <ENTER> wordt het help-venster gesloten.
+
+ Je kan hulp vinden over nagenoeg elk onderwerp door een argument aan het
+ commando :help toe te voegen. Probeer deze (en vergeet <ENTER> niet):
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 7.2: SCHRIJF EEN CONFIGURATIEBESTAND
+
+ ** Mogelijkheden van Vim uitbreiden. **
+
+ Vim kent veel meer mogelijkheden dan Vi, maar de meeste zijn standaard
+ uitgeschakeld. Om meer functies te gebruiken moet je een 'vimrc'-bestand
+ schrijven.
+
+ 1. Bewerk het bestand 'vimrc'. Hoe dat moet hangt af van je systeem:
+ :e ~/.vimrc voor Unix
+ :e ~/_vimrc voor MS-Windows
+
+ 2. Lees de inhoud van het voorbeeld-bestand:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Sla het bestand op met :w
+
+ De volgende keer dat je Vim start wordt 'syntaxiskleuring' gebruiken.
+ Je kan al je voorkeursinstellingen toevoegen aan dit 'vimrc'-bestand.
+ Tik :help vimrc-intro voor meer informatie.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 7.3: AANVULLEN
+
+ ** Aanvullen van de 'command line' met CTRL-D en <TAB>. **
+
+ 1. Zorg dat Vim niet in 'compatible mode' is met :set nocp
+
+ 2. Kijk welke bestanden zich in de map bevinden met :!ls of :!dir
+
+ 3. Tik het begin van een commando: :e
+
+ 4. Met CTRL-D toont Vim een lijst commando's, die met "e" beginnen.
+
+ 5. Druk enkele keren <TAB>. Vim laat aanvullingen zien, zoals ":edit",
+ dat we hier gebruiken.
+
+ 6. Voeg een spatie toe en de eerste letter(s) van een bestaande
+ bestandsnaam: :edit BESTAND
+
+ 7. Druk <TAB>. Vim vult de naam aan (als hij uniek is).
+
+ OPMERKING: Aanvullen werkt bij tal van commando's. Probeer gewoon CTRL-D
+ en <TAB>. Het is bijzonder nuttig bij :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 7
+
+ 1. Tik :help of druk <F1> of <Help> om een help-venster te openen.
+
+ 2. Tik :help CMD voor hulp over CMD .
+
+ 3. Tik CTRL-W CTRL-W om naar een ander venster te gaan.
+
+ 4. Tik :q om het help-venster te sluiten.
+
+ 5. Maak een bestand met de naam 'vimrc' voor je voorkeursinstellingen.
+
+ 6. Druk CTRL-D tijdens het intikken van een :-commando om mogelijke
+ aanvullingen te zien. Druk <TAB> om aanvullen te gebruiken.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Hiermee komen de Vim-lessen tot een einde. Ze waren bedoeld om een kort
+ overzicht te geven van de Vim-editor, juist voldoende om de editor
+ redelijk makkelijk te gebruiken. Deze lessen zijn verre van volledig. Vim
+ kent veel meer commando's. Lees hierna de handleiding voor gebruikers:
+ ":help user-manual".
+
+ Voor verdere studie wordt aanbevolen:
+ Vim - Vi Improved - door Steve Oualline
+ Uitgever: New Riders
+ Dit is het eerste boek dat geheel aan Vim is gewijd. Speciaal geschikt
+ voor beginners. Met veel voorbeelden en afbeeldingen.
+ Zie https://iccf-holland.org/click5.html
+
+ Het volgende boek is ouder en gaat meer over Vi dan Vim, maar het wordt
+ toch aanbevolen:
+ Learning the Vi Editor - door Linda Lamb
+ Uitgever: O'Reilly & Associates Inc.
+ Het is een goed boek om nagenoeg alles te weten te komen dat je met Vi
+ zou willen doen. De zesde en vooral de nieuwe zevende druk (onder de
+ titel Learning the Vi and Vim Editors door Arnold Robbins, Elbert Hannah
+ & Linda Lamb) bevat ook informatie over Vim.
+
+ Deze lessen zijn geschreven door Michael C. Pierce en Robert K. Ware,
+ Colorado School of Mines met gebruikmaking van ideen van Charles Smith
+ van de Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Aangepast voor Vim door Bram Moolenaar.
+
+ Nederlandse vertaling door Rob Bishoff, april 2012
+ e-mail: rob.bishoff@hccnet.nl)
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.nl.utf-8 b/runtime/tutor/tutor.nl.utf-8
new file mode 100644
index 0000000..1f4be70
--- /dev/null
+++ b/runtime/tutor/tutor.nl.utf-8
@@ -0,0 +1,950 @@
+ ==========================================================================
+ = W e l k o m b i j d e V I M l e s s e n - Versie 1.7 =
+ ==========================================================================
+
+ Vim is een krachtige editor met veel commando's, te veel om uit te leggen
+ in lessen zoals deze. Deze lessen zijn bedoeld om voldoende commando's te
+ behandelen om je in staat te stellen met Vim te werken als een editor voor
+ algemeen gebruik.
+
+ Deze lessen zullen 25 tot 30 minuten in beslag nemen, afhankelijk van de
+ tijd die wordt besteed aan het uitproberen van de commando's.
+
+ LET OP:
+ Door de commando's in deze lessen verandert de tekst. Maak een kopie van
+ dit bestand om mee te oefenen (als je "vimtutor" uitvoerde, is dit al een
+ kopie).
+
+ Deze lessen zijn bedoeld om al doende te leren. Dat betekent dat je de
+ commando's moet uitvoeren om ze goed te leren kennen. Als je de tekst
+ alleen maar doorleest, zal je de commando's niet leren!
+
+ Zorg ervoor dat de <Caps Lock> toets NIET is ingedrukt en druk vaak genoeg
+ op de j-toets om de cursor zo te bewegen dat les 1.1 volledig op het
+ scherm staat.
+
+ LET OP: In deze lessen worden omwille van de duidelijkheid vaak spaties
+ gebruikt binnen een commando (bv. "40 G" of "operator [getal] beweging").
+ Tik deze spaties echter NIET. Ze verstoren de werking.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.1: VERPLAATS DE CURSOR
+
+ ** De cursor wordt verplaatst met de toetsen h, j, k, l zoals aangegeven. **
+ ^
+ k Hint: De h is de meest linkse en beweegt naar links.
+ < h l > De l is de meest rechtse en beweegt naar rechts.
+ j De j lijkt op een pijl naar beneden.
+ v
+
+ 1. Beweeg de cursor over het scherm om er vertrouwd mee te raken.
+
+ 2. Druk de omlaag-toets (j) tot hij repeteert.
+ Nu weet je hoe je de volgende les bereikt.
+
+ 3. Gebruik de omlaag-toets om naar les 1.2 te gaan.
+
+ OPMERKING: Als je twijfelt aan wat je tikte, druk <ESC> om in de opdracht-
+ modus te komen. Tik daarna het commando dat bedoeld wordt.
+
+ OPMERKING: Pijltjes-toetsen werken ook. Met de hjkl-toetsen kan je sneller
+ rondbewegen, als je er eenmaal aan gewend bent. Echt waar!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.2: VIM AFSLUITEN
+
+ !! LET OP: Lees deze les goed door voordat je iets uitvoert!!
+
+ 1. Druk de <ESC> toets (om zeker in de opdrachtmodus te zitten).
+
+ 2. Tik :q! <ENTER>
+ Hiermee wordt de editor afgesloten. Alle veranderingen gaan VERLOREN.
+
+ 3. Nu zie je de shell-prompt. Tik het commando waarmee je deze lessen
+ hebt opgeroepen. Dat is normaal gesproken: vimtutor <ENTER>
+
+ 4. Als je deze stappen goed hebt doorgelezen, voer dan de stappen 1 tot 3
+ uit om de editor te verlaten en weer op te starten.
+
+ LET OP: :q! <ENTER> verwerpt alle veranderingen die je aanbracht. Een paar
+ lessen verder zal je leren hoe veranderingen worden opgeslagen in
+ een bestand.
+
+ 5. Beweeg de cursor omlaag naar les 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.3: TEKST BEWERKEN - WISSEN
+
+ ** Tik x om het teken onder de cursor te wissen. **
+
+ 1. Ga met de cursor naar de regel verderop met --->.
+
+ 2. Zet de cursor op een teken dat moet worden gewist om een fout te
+ herstellen.
+
+ 3. Tik x om het ongewenste teken te wissen.
+
+ 4. Herhaal deze stappen tot de regel goed is.
+
+ ---> Vi kkent eenn opdracccchtmodus en een invooegmmmmodus.
+
+ 5. Nu de regel gecorrigeerd is kan je naar les 1.4 gaan.
+
+ LET OP: Probeer de lessen niet uit je hoofd te leren. Leer al doende.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.4: TEKST BEWERKEN - INVOEGEN
+
+ ** Tik i ('insert') om tekst in te voegen. **
+
+ 1. Ga met de cursor naar de eerste regel verderop met --->.
+
+ 2. Maak de eerste regel gelijk aan de tweede. Zet daarvoor de cursor op
+ het karakter waarvoor tekst moet worden ingevoegd.
+
+ 3. Tik i en daarna de nodige aanvullingen.
+
+ 4. Tik <ESC> na elke herstelde fout om terug te keren in de opdrachtmodus.
+ Herhaal de stappen 2 tot 4 om de zin te verbeteren.
+
+ ---> Aan regel ontekt wat .
+ ---> Aan deze regel ontbreekt wat tekst.
+
+ 5. Ga naar les 1.5 als je gewend bent aan het invoegen van tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.5: TEKST BEWERKEN - TOEVOEGEN
+
+ ** Tik A ('append') om tekst toe te voegen. **
+
+ 1. Ga met de cursor naar de eerste regel verderop met --->.
+ Het maakt niet uit waar de cursor in deze regel staat.
+
+ 2. Tik hoofdletter A en tik de nodige aanvullingen.
+
+ 3. Tik <ESC> nadat de tekst is aangevuld. Zo keer je terug in de
+ opdrachtmodus.
+
+ 4. Ga naar de tweede regel verderop met ---> en herhaal stap 2 en 3
+ om deze zin te corrigeren.
+
+ ---> Er ontbreekt wat tekst aan de
+ Er ontbreekt wat tekst aan deze regel.
+ ---> Hier ontbreekt ook w
+ Hier ontbreekt ook wat tekst.
+
+ 5. Ga naar les 1.6 als je vertrouwd bent geraakt aan het toevoegen
+ van tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 1.6: EEN BESTAND EDITTEN
+
+ ** Gebruik :wq om een bestand op te slaan en de editor te verlaten. **
+
+ !! LET OP: Lees deze les helemaal door voordat je een van de volgende
+ stappen uitvoert!!
+
+ 1. Verlaat deze les zoals je in les 1.2 deed: :q!
+ Of gebruik een andere terminal als je daar de beschikking over hebt. Doe
+ daar het volgende.
+
+ 2. Tik het volgende commando na de shell-prompt: vim les <ENTER>
+ 'vim' (vaak ook 'vi') is het commando om de Vim-editor te starten,
+ 'les' is de naam van het bestand, dat je gaat bewerken. Kies een andere
+ naam als er al een bestand 'les' bestaat, dat niet veranderd mag worden.
+
+ 3. Voeg naar eigen keus tekst toe, zoals je geleerd hebt in eerdere lessen.
+
+ 4. Sla het bestand met de wijzigingen op en verlaat Vim met :wq <ENTER>
+
+ 5. Herstart vimtutor als je deze bij stap 1 hebt verlaten en ga verder met
+ de volgende samenvatting.
+
+ 6. Voer deze stappen uit nadat je ze hebt gelezen en begrepen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 1
+
+ 1. De cursor wordt bewogen met de pijltjestoetsen of de hjkl-toetsen.
+ h (links) j (omlaag) k (omhoog) l (rechts)
+
+ 2. Start Vim van de shell-prompt. Tik: vim BESTANDSNAAM <ENTER>
+
+ 3. Sluit Vim af met <ESC> :q! <ENTER> om de veranderingen weg te gooien.
+ OF tik <ESC> :wq <ENTER> om de veranderingen te bewaren.
+
+ 4. Wis het teken onder de cursor met: x
+
+ 5. Invoegen of toevoegen van tekst, tik:
+ i en daarna de in te voegen tekst <ESC> voeg in vanaf de cursor
+ A en daarna de toe te voegen tekst <ESC> voeg toe achter de regel
+
+ OPMERKING: Met <ESC> kom je terug in opdrachtmodus en wordt een ongewenst
+ of gedeeltelijk uitgevoerd commando afgebroken.
+
+ Ga nu verder met les 2.1.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.1: WIS-COMMANDO'S
+
+ ** Tik dw ('delete word') om een woord te wissen. **
+
+ 1. Druk op <ESC> om zeker in de opdrachtmodus te zijn.
+
+ 2. Ga naar de regel hieronder, die met ---> begint.
+
+ 3. Ga met de cursor naar het begin van een woord dat moet worden gewist.
+
+ 4. Met het tikken van dw verdwijnt het woord.
+
+ OPMERKING: De letter d verschijnt op de laatste regel van het scherm
+ zodra je hem tikt. Vim is aan het wachten tot je de w tikt.
+ Als je een ander teken dan d ziet, heb je iets verkeerds
+ getikt. Druk op <ESC> en begin opnieuw.
+
+ NOG EEN OPMERKING: Dit werkt alleen als de optie 'showcmd' is ingeschakeld.
+ Dat gebeurt met :set showcmd <ENTER>
+
+ ---> Er zijn een het paar ggg woorden, die niet in deze len zin thuishoren.
+
+ 5. Herhaal de stappen 3 en 4 tot de zin goed is en ga naar les 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.2: MEER WIS-COMMANDO'S
+
+ ** Tik d$ om te wissen tot het einde van de regel. **
+
+ 1. Druk op <ESC> om zeker in de opdrachtmodus te zijn.
+
+ 2. Ga naar de regel hieronder, die met ---> begint.
+
+ 3. Ga met de cursor naar het einde van de correcte regel (NA de eerste . ).
+
+ 4. Tik d$ om te wissen tot het einde van de regel.
+
+ ---> Iemand heeft het einde van deze regel dubbel getikt. dubbel getikt.
+
+ 5. Ga naar les 2.3 voor uitleg.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.3: OVER OPERATOREN EN BEWEGINGEN
+
+ Veel commando's die de tekst veranderen, bestaan uit een operator en een
+ beweging. De samenstelling van een wis-commando met de operator d is:
+ d beweging
+
+ Daarbij is:
+ d - de wis-operator
+ beweging - het bereik waarop de operator werkt (zie het lijstje hieronder)
+
+ Een korte lijst van bewegingen vanaf de cursor:
+ w - tot het begin van het volgende woord, ZONDER het eerste teken daarvan.
+ e - tot het einde van het huidige woord, INCLUSIEF het laatste teken.
+ $ - tot het einde van de regel, INCLUSIEF het laatste teken.
+
+ Het tikken van de wist tekst vanaf de cursor tot het eind van het woord.
+
+ OPMERKING: Het intikken van alleen maar de beweging, zonder een operator,
+ in de opdrachtmodus beweegt de cursor (respectievelijk naar het
+ volgende woord, naar het eind van het huidige woord en naar het
+ eind van de regel).
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.4: GEBRUIK VAN EEN TELLER BIJ EEN BEWEGING
+
+ ** Een getal voor een beweging herhaalt het zoveel keer. **
+
+ 1. Ga naar de regel hieronder, die met ---> begint.
+
+ 2. Tik 2w zodat de cursor twee woorden vooruit gaat.
+
+ 3. Tik 3e zodat de cursor naar het einde van het derde woord gaat.
+
+ 4. Tik 0 (nul) om naar het begin van de regel te gaan.
+
+ 5. Herhaal de stappen 2 en 3 met andere getallen.
+
+ ---> Dit is een regel met woorden waarin je heen en weer kan bewegen.
+
+ 6. Ga verder met les 2.5.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.5: GEBRUIK EEN TELLER OM MEER TE WISSEN
+
+ ** Een getal met een operator zorgt dat deze zoveel keer wordt herhaald. **
+
+ Bij de combinatie van wis-operator en beweging kan je voor de beweging een
+ teller zetten om meer te wissen:
+ d [teller] beweging
+
+ 1. Ga naar het eerste woord in HOOFDLETTERS in de regel na --->.
+
+ 2. Met d2w worden twee woorden (in dit voorbeeld in hoofdletters) gewist.
+
+ 3. Herhaal de stappen 1 en 2 met verschillende tellers om de verschillende
+ woorden in hoofdletters met één commando te wissen.
+
+ ---> deze ABC DE regel FGHI JK LMN OP is QZ RS ontdaan van rommel.
+
+ OPMERKING: De teller kan ook aan het begin staan: d2w en 2dw werken allebei.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.6: BEWERKING VAN HELE REGELS
+
+ ** Tik dd om een hele regel te wissen. **
+
+ Omdat het wissen van een hele regel vaak voorkomt, besloten de ontwerpers
+ van Vi dat met het tikken van dd simpelweg een hele regel gewist wordt.
+
+ 1. Ga met de cursor naar de tweede regel van de zinnetjes hieronder.
+
+ 2. Tik dd om de regel te wissen.
+
+ 3. Ga nu naar de vierde regel.
+
+ 4. Tik 2dd om twee regels te wissen.
+
+ ---> 1) Rozen zijn rood.
+ ---> 2) Modder is leuk.
+ ---> 3) Viooltjes zijn blauw.
+ ---> 4) Ik heb een auto.
+ ---> 5) De klok slaat de tijd.
+ ---> 6) Suiker is zoet.
+ ---> 7) En dat ben jij ook.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 2.7: HET COMMANDO HERSTEL
+
+ ** u maakt het laatste commando ongedaan, U herstelt een hele regel. **
+
+ 1. Ga met de cursor naar de regel hieronder met ---> en zet hem
+ op de eerste fout.
+
+ 2. Tik x om het eerste ongewenste teken te wissen.
+
+ 3. Tik nu u en maak daarmee het vorige commando ongedaan.
+
+ 4. Herstel nu alle fouten in de regel met het x commando.
+
+ 5. Tik een hoofdletter U om de regel in z'n oorspronkelijke staat terug
+ te brengen.
+
+ 6. Tik nu een paar keer u en herstel daarmee de U en eerdere commando's.
+
+ 7. Tik nu een paar keer CTRL-R (Ctrl-toets ingedrukt houden en R tikken) en
+ voer daarmee de commando's opnieuw uit: 'redo' oftewel 'undo de undo's'.
+
+ ---> Heerstel de fouten inn deeze regel en brenng ze weer terugg met undo.
+
+ 8. Dit zijn heel nuttige commando's. Ga verder met samenvatting van les 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 2
+
+ 1. Wis van de cursor tot het volgende woord met dw
+
+ 2. Wis van de cursor tot het eind van de regel met d$
+
+ 3. Wis de hele regel met dd
+
+ 4. Herhaal een beweging door er een getal voor te zetten: 2w
+
+ 5. De opbouw van een wijzigingscommando is:
+ operator [getal] beweging
+ daarbij is:
+ operator - wat er moet gebeuren, bijvoorbeeld d om te wissen
+ [getal] - een (niet-verplichte) teller om 'beweging' te herhalen
+ beweging - een beweging door de te wijzigen tekst zoals w (woord)
+ of $ (tot het einde van de regel) enz.
+
+ 6. Ga naar het begin van de regel met nul: 0
+
+ 7. Undo de voorgaande actie met u (kleine letter)
+ Undo alle veranderingen in een regel met U (hoofdletter)
+ Undo de undo's met CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 3.1: HET COMMANDO PLAK
+
+ ** Tik p ('put') en plak daarmee zojuist gewiste tekst na te cursor. **
+
+ 1. Ga met de cursor naar de eerste regel met ---> hierna.
+
+ 2. Wis de regel met dd en bewaar hem zodoende in een Vim-register.
+
+ 3. Ga naar de c-regel, waar de gewiste regel ONDER moet komen.
+
+ 4. Tik p om de regel terug te zetten onder de regel met de cursor.
+
+ 5. Herhaal de stappen 2 tot 4 om de regels in de goede volgorde te zetten.
+
+---> d) Krijg je het ook onder de knie?
+---> b) Viooltjes zijn blauw,
+---> c) Begrip is te leren,
+---> a) Rozen zijn rood,
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 3.2: HET COMMANDO VERVANG
+
+ ** Tik rx ('replace') om het teken onder de cursor te vervangen door x. **
+
+ 1. Ga naar de eerste regel hieronder met --->.
+
+ 2. Zet de cursor op de eerste fout.
+
+ 3. Tik r en dan het teken dat er hoort te staan.
+
+ 4. Herhaal de stappen 2 en 3 tot de eerste regel gelijk is aan de tweede.
+
+ ---> Bij het tokken van dezf hegel heeft iemamd verklerde letters getikt.
+ ---> Bij het tikken van deze regel heeft iemand verkeerde letters getikt.
+
+ 5. Ga nu naar les 3.3.
+
+ LET OP: Door het te doen, leer je beter dan door het uit je hoofd te leren.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 3.3: HET COMMANDO VERANDER
+
+ ** Tik ce om te veranderen tot het einde van een woord. **
+
+ 1. Ga met de cursor naar de eerste regel hieronder met --->.
+
+ 2. Zet de cursor op de u van ruch.
+
+ 3. Tik ce en de juiste letters (in dit geval "egel").
+
+ 4. Druk <ESC> en ga naar het volgende teken dat moet worden veranderd.
+
+ 5. Herhaal de stappen 3 en 4 tot de eerste regel gelijk is aan de tweede.
+
+ ---> In deze ruch staan een paar weedrim die veranderd moud worden.
+ ---> In deze regel staan een paar woorden die veranderd moeten worden.
+
+ LET OP: Met ce wordt (het laatste deel van) een woord gewist en kom je
+ in de invoegmodus.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 3.4: MEER VERANDERINGEN MET c
+
+ 1. Het commando verander ('change') werkt op dezelfde manier als wis. De
+ opbouw is:
+ c [teller] beweging
+
+ 2. De bewegingen zijn hetzelfde, zoals w (woord) en $ (einde regel).
+
+ 3. Ga naar de eerste regel hieronder met --->.
+
+ 4. Zet de cursor op de eerste fout.
+
+ 5. Tik c$ en tik de rest van de regel zodat hij gelijk wordt aan de
+ tweede en sluit af met <ESC>.
+
+ ---> Het einde van deze regel moet precies zo worden als de tweede regel.
+ ---> Het einde van deze regel moet gecorrigeerd worden met het commando c$.
+
+ OPMERKING: Je kan de toets <BACKSPACE> gebruiken om tikfouten te herstellen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 3
+
+ 1. Tik p om tekst terug te plakken, die zojuist is gewist. Dit zet de
+ gewiste tekst ACHTER de cursor (als een hele regel is gewist komt deze
+ op de regel ONDER de cursor.
+
+ 2. Het teken waarop de cursor staat wordt vervangen met r gevolgd door
+ het teken dat je daar wilt hebben.
+
+ 3. Het commando 'verander' stelt je in staat om tekst te veranderen vanaf
+ de cursor tot waar de 'beweging' je brengt. Dat wil zeggen: tik ce om
+ te veranderen vanaf de cursor tot het einde van het woord, c$ om te
+ veranderen tot het einde van de regel.
+
+ 4. De opbouw van het commando verander is:
+ c [teller] beweging
+
+ Ga nu naar de volgende les.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 4.1: PLAATS VAN DE CURSOR EN STATUS VAN HET BESTAND
+
+ ** CTRL-G laat zien waar (regelnummer) je je bevindt en wat de status van
+ het bestand is. Met [nummer] G ga je naar een bepaalde regel. **
+
+ LET OP: Lees de hele les voordat je een stap uitvoert!!
+
+ 1. Hou de Ctrl-toets ingedrukt en tik g . Dit noemen we CTRL-G.
+ Onderaan de pagina verschijnt een boodschap met de bestandsnaam en de
+ positie in het bestand. Onthou het regelnummer voor stap 3.
+
+ OPMERKING: Als de optie 'ruler' aan staat, wordt de positie van de cursor
+ (regelnummer, kolom) steeds in de rechter-onderhoek van het
+ scherm vermeld. In dit geval vermeldt CTRL-G geen regelnummer.
+ CTRL-G geeft ook de status aan, namelijk of de tekst veranderd
+ is ('modified') sinds het de laatste keer is opgeslagen.
+
+ 2. Tik hoofdletter G om naar het einde van het bestand te gaan.
+ Tik gg om naar het begin van het bestand te gaan.
+
+ 3. Tik het regelnummer waar je bij stap 1 was en daarna G . Dit brengt je
+ terug naar de regel waar je was toen je de eerste keer CTRL-G tikte.
+
+ 4. Voer de stappen 1 tot 3 uit als je dit goed hebt gelezen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 4.2: HET COMMANDO ZOEKEN
+
+ ** Met /ZOEK wordt naar de zoekterm (één of meer woorden) gezocht. **
+
+ 1. Tik in de opdrachtmodus het teken / . Je ziet dat het met de cursor
+ aan de onderkant van het scherm verschijnt, zoals bij het :-commando.
+
+ 2. Tik nu 'ffouut' <ENTER>. Dit is het woord waarnaar gezocht wordt.
+
+ 3. Tik n om verder te zoeken met dezelfde zoekterm.
+ Zoek met N met dezelfde zoekterm in de tegenovergestelde richting.
+
+ 4. Zoek in achterwaartse richting met ?zoekterm in plaats van / .
+
+ 5. Keer terug naar de vorige hit met CTRL-O (hou Ctrl-toets ingedrukt en
+ tik letter o). Herhaal om verder terug te gaan. CTRL-I gaat vooruit.
+
+ ---> "ffouut" is niet de juiste spelling van fout, ffouut is een fout.
+
+ OPMERKING: Als zoeken het einde van het bestand bereikt, wordt vanaf het
+ begin doorgezocht, tenzij de optie 'wrapscan' is uitgeschakeld.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 4.3: GA NAAR CORRESPONDERENDE HAAKJES
+
+ ** Tik % om naar corresponderende ), ] of } te gaan. **
+
+ 1. Zet de cursor op een (, [ of { in de regel hieronder met --->.
+
+ 2. Tik dan het teken % .
+
+ 3. De cursor gaan naar het overeenkomstige haakje.
+
+ 4. Met opnieuw % gaat de cursor terug naar het eerste haakje.
+
+ 5. Plaats de cursor op een ander haakje en bekijk wat % doet.
+
+ ---> Dit ( is een testregel met ('s, ['s ] en {'s } erin. ))
+
+ OPMERKING: Dit is nuttig bij het debuggen van een programma waarin haakjes
+ niet corresponderen. Met de optie 'showmatch' wordt ook
+ aangegeven of haakjes corresponderen, maar de cursor wordt niet
+ (blijvend) verplaatst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 4.4: HET VERVANG COMMANDO
+
+ ** Tik :s/oud/nieuw/g om 'oud' door 'nieuw' te vervangen. **
+
+ 1. Ga met de cursor naar de regel hieronder met --->.
+
+ 2. Tik :s/dee/de <ENTER>. Zoals je ziet, vervangt ('substitute') dit
+ commando alleen de eerste "dee" in de regel.
+
+ 3. Tik nu :s/dee/de/g . Met de g-vlag ('global') wordt elke "dee" in de
+ regel vervangen.
+
+ ---> dee beste tijd om dee bloemen te zien is in dee lente.
+
+ 4. Om in (een deel van) een tekst elk 'oud' te vervangen door 'nieuw':
+ tik :#,#s/oud/nieuw/g waar #,# de regelnummers zijn die het gebied
+ begrenzen waarin wordt vervangen.
+ tik :%s/oud/nieuw/g om alles te vervangen in het hele bestand.
+ tik :%s/oud/nieuw/gc om elke 'oud' in het hele bestand te vinden
+ en te vragen of er vervangen moet worden.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 4
+
+ 1. CTRL-G laat positie in het bestand zien en de status van het bestand.
+ G verplaatst je naar het einde van het bestand.
+ nummer G verplaatst je naar regelnummer.
+ gg verplaatst je naar de eerste regel.
+
+ 2. Met / en een zoekterm wordt VOORWAARTS gezocht naar de term.
+ Met ? en een zoekterm wordt ACHTERWAARTS gezocht naar de term.
+ Tik n na een zoekopdracht om de volgende hit te vinden,
+ of tik N om in de andere richting te zoeken.
+ CTRL-O brengt je naar eerdere hit, CTRL-I naar nieuwere.
+
+ 3. Tik % terwijl de cursor op een haakje ([{}]) staat, om naar het
+ corresponderende haakje te gaan.
+
+ 4. :s/oud/nieuw vervangt het eerste 'oud' in een regel door 'nieuw'.
+ :s/oud/nieuw/g vervangt elk 'oud' in een regel door 'nieuw'.
+ :#,#s/oud/nieuw/g vervangt elk 'oud' door 'nieuw' tussen de regelnummers.
+ :%s/oud/nieuw/g vervangt elk 'oud' door 'nieuw' in het hele bestand.
+ Voeg c toe (:%s/oud/nieuw/gc) om elke keer om bevestiging
+ ('confirmation') te vragen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 5.1: HOE EEN EXTERN COMMANDO WORDT UITGEVOERD
+
+ ** Tik :! gevolgd door een extern commando om dat uit te voeren. **
+
+ 1. Tik het commando : waarmee de cursor op de onderste regel van het
+ scherm komt te staan. Nu kan je een opdracht geven via de commando-regel.
+
+ 2. Tik een ! (uitroepteken). Dit stelt je in staat om elk shell-commando
+ uit te voeren.
+
+ 3. Tik bijvoorbeeld ls na het uitroepteken en daarna <ENTER>. Hiermee
+ krijg je de inhoud van je map te zien, net alsof je de opdracht gaf
+ vanaf de shell-prompt. Probeer :!dir als het niet werkt.
+
+ OPMERKING: Elk extern commando kan op deze manier uitgevoerd worden, ook
+ met argumenten.
+
+ OPMERKING: Alle commando's na : moeten worden afgesloten met <ENTER>.
+ Vanaf nu zullen we dat niet meer altijd vermelden.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 5.2: MEER OVER HET OPSLAAN VAN BESTANDEN
+
+ ** Tik :w BESTANDSNAAM om de tekst mèt veranderingen op te slaan. **
+
+ 1. Tik :!dir of :!ls om de inhoud van je map te tonen. Je weet
+ inmiddels dat je daarna een <ENTER> moet tikken.
+
+ 2. Kies een bestandsnaam die nog niet bestaat, bijvoorbeeld TEST.
+
+ 3. Tik nu: :w TEST (als je de naam TEST hebt gekozen).
+
+ 4. Hierdoor wordt het hele bestand (de VIM lessen) opgeslagen onder de
+ naam TEST. Tik weer :!dir of :!ls om dit te controleren.
+
+ OPMERKING: Als je Vim zou verlaten en opnieuw zou starten met vim TEST is
+ het bestand een exacte kopie van de lessen, zoals je ze opsloeg.
+
+ 5. Wis het bestand nu met de opdracht (MS-DOS) :!del TEST
+ of (Unix) :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 5.3: EEN DEEL VAN DE TEKST OPSLAAN
+
+ ** Sla een deel van het bestand op met v beweging :w BESTANDSNAAM **
+
+ 1. Ga naar deze regel.
+
+ 2. Tik v en ga met de cursor naar stap 5 hieronder. Je ziet dat de
+ tekst oplicht.
+
+ 3. Tik : . Onderaan het scherm zal :'<,'> verschijnen.
+
+ 4. Tik w TEST , waar TEST een bestandsnaam is, die nog niet bestaat.
+ Controleer dat je :'<,'>w TEST ziet staan voordat je <ENTER> tikt.
+
+ 5. Vim slaat nu de geselecteerde regels op in het bestand TEST. Met
+ :!dir of !ls kan je dat zien. Wis het nog niet! We zullen het in
+ de volgende les gebruiken.
+
+ OPMERKING: Het tikken van v zet zichtbare modus ('visual selection') aan.
+ Je kan de cursor rondbewegen om de selectie groter of kleiner
+ te maken. Vervolgens kan je een commando gebruiken om iets met
+ de tekst te doen. Met d bijvoorbeeld wis je de tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 5.4: OPHALEN EN SAMENVOEGEN VAN BESTANDEN
+
+ ** Tik :r BESTANDSNAAM om de inhoud van een bestand in te voegen. **
+
+ 1. Zet de cursor precies boven deze regel.
+
+ OPMERKING: Na het uitvoeren van stap 2 zie je tekst van les 5.3. Scrol
+ daarna naar beneden om deze les weer te zien.
+
+ 2. Haal nu het bestand TEST op met het commando :r TEST .
+ Het bestand dat je ophaalt komt onder de regel waarin de cursor staat.
+
+ 3. Controleer dat er een bestand is opgehaald. Ga met de cursor omhoog.
+ Dan zie je de tekst van les 5.3 dubbel, het origineel en de versie uit
+ het bestand.
+
+ OPMERKING: Je kan ook de uitvoer van een extern commando inlezen. Om een
+ voorbeeld te geven: :r !ls leest de uitvoer van het commando
+ ls en zet dat onder de regel waarin de cursor staat.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 5
+
+ 1. :!COMMANDO voert een extern commando uit.
+ Enkele bruikbare voorbeelden zijn:
+ (MS-DOS) (Unix)
+ :!dir :!ls - laat de inhoud van een map zien
+ :!del BESTAND :!rm BESTAND - wist bestand BESTAND
+
+ 2. :w BESTANDSNAAM schrijft het huidige Vim-bestand naar disk met de
+ naam BESTANDSNAAM.
+
+ 3. v beweging :w BESTANDSNAAM laat je in zichtbare modus een fragment
+ selecteren, dat wordt opgeslagen in het bestand BESTANDSNAAM.
+
+ 4. :r BESTANDSNAAM haalt het bestand BESTANDSNAAM op en voegt het onder
+ de cursor-positie in de tekst in.
+
+ 5. :r !dir leest de uitvoer van het externe commando dir en zet het onder
+ de cursor-positie.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.1: HET COMMANDO OPEN
+
+ ** Tik o om een regel onder de cursor te openen in invoegmodus. **
+
+ 1. Ga naar de eerste regel beneden met --->.
+
+ 2. Tik de kleine letter o en open daarmee een regel ONDER de cursor en
+ ga naar de invoegmodus.
+
+ 3. Tik wat tekst in en sluit af met <ESC> om de invoegmodus te verlaten.
+
+ ---> Als je o tikt, komt de cursor in een nieuwe regel in invoegmodus.
+
+ 4. Om een regel BOVEN de cursor te openen, moet je gewoon een hoofdletter
+ O tikken in plaats van een kleine letter. Probeer dat vanaf de volgende
+ regel.
+
+ ---> Open een regel hierboven. Tik een O terwijl de cursor hier staat.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.2: HET COMMANDO TOEVOEGEN
+
+ ** Tik a om tekst toe te voegen ACHTER de cursor. **
+
+ 1. Ga naar het begin van de regel beneden met --->.
+
+ 2. Tik e tot de cursor op het einde van "ste" staat.
+
+ 3. Tik een (kleine letter) a ('append') om toe te voegen ACHTER de cursor.
+
+ 4. Vul het woord aan zoals in de volgende regel. Druk <ESC> om de
+ invoegmodus te verlaten.
+
+ 5. Ga met e naar het einde van het volgende onvolledige woord en herhaal
+ de stappen 3 en 4.
+
+ ---> Deze regel ste je in staat om te oef in het toevo van tekst.
+ Deze regel stelt je in staat om te oefenen in het toevoegen van tekst.
+
+ OPMERKING: a, i en A openen allemaal dezelfde invoegmodus, het enige
+ verschil is waar tekens worden ingevoegd.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.3: VERVANGEN OP EEN ANDERE MANIER
+
+ ** Tik een hoofdletter R om meer dan één teken te vervangen. **
+
+ 1. Ga naar de eerste regel beneden met --->. Ga met de cursor naar het
+ begin van de eerste "xxx" .
+
+ 2. Tik nu R en daarna het getal eronder in de tweede regel, zodat xxx
+ wordt vervangen.
+
+ 3. Druk <ESC> om de vervangmodus te verlaten. Je ziet dat de rest van de
+ regel ongewijzigd blijft.
+
+ 4. Herhaal de stappen om de overgebleven xxx te vervangen.
+
+ ---> Optellen van 123 en xxx geeft je xxx.
+ ---> Optellen van 123 en 456 geeft je 579.
+
+ OPMERKING: Vervangmodus lijkt op invoegmodus, maar elk teken dat je tikt,
+ vervangt een bestaand teken.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.4: TEKST KOPIËREN EN PLAKKEN
+
+ ** Gebruik y om tekst te kopiëren en p om te plakken. **
+
+ 1. Ga naar de regel beneden met ---> en zet de cursor achter "a)".
+
+ 2. Zet zichtbare modus aan met v en zet de cursor juist voor "eerste".
+
+ 3. Tik y ('yank') om de opgelichte tekst ("dit is het") te kopiëren.
+
+ 4. Ga met j$ met de cursor naar het einde van de volgende regel.
+
+ 5. Plak de gekopieerde tekst met p en tik a tweede <ESC>.
+
+ 6. Selecteer in zichtbare modus "onderdeel", kopieer het met y en
+ ga met j$ naar het einde van de tweede regel. Plak de tekst daar
+ met p .
+
+ ---> a) dit is het eerste onderdeel
+ b)
+
+ OPMERKING: Je kan y ook als operator gebruiken; yw kopieert een woord,
+ yy een hele regel.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 6.5: OPTIES GEBRUIKEN
+
+ ** Gebruik een optie voor al dan niet hoofdlettergevoelig zoeken. **
+
+ 1. Zoek naar 'hoofdlettergevoelig' met /hoofdlettergevoelig <ENTER>
+ Herhaal het zoeken enkele keren door n te tikken.
+
+ 2. Schakel de optie 'ic' ('ignore case', niet-hoofdlettergevoelig) in
+ met :set ic
+
+ 3. Zoek met n opnieuw naar 'hoofdlettergevoelig'. Je ziet dat
+ Hoofdlettergevoelig en HOOFDLETTERGEVOELIG nu ook gevonden worden.
+
+ 4. Schakel de opties 'hlsearch' (treffers oplichten) en 'incsearch' (toon
+ gedeeltelijke treffers bij intikken) in met :set hls is
+
+ 5. Tik weer /hoofdlettergevoelig <ENTER> en kijk wat er gebeurt.
+
+ 6. Schakel 'hoofdlettergevoelig' weer in met :set noic
+
+ OPMERKING: Schakel het oplichten van treffers uit met :nohlsearch
+
+ OPMERKING: Om bij een enkel zoek-commando de hoofdlettergevoeligheid om
+ te draaien kan \c worden gebruikt na de zoekterm:
+ /hoofdlettergevoelig\c <ENTER>.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 6
+
+ 1. Tik o om een regel te openen ONDER de cursor en invoegmodus te starten.
+ Tik O om een regel te openen BOVEN de cursor.
+
+ 2. Tik a om tekst toe te voegen NA de cursor.
+ Tik A om tekst toe te voegen aan het einde van de regel.
+
+ 3. Het commando e beweegt de cursor naar het einde van een woord.
+
+ 4. De operator y yankt (kopieert) tekst, p zet het terug (plakt).
+
+ 5. Met hoofdletter R wordt de vervangmodus geopend, met <ESC> afgesloten.
+
+ 6. Met :set xxx wordt optie 'xxx' ingeschakeld. Opties zijn bijvoorbeeld:
+ ic ignorecase geen verschil hoofdletters/kleine letters bij zoeken
+ is incsearch toon gedeeltelijke treffers tijdens intikken zoekterm
+ hls hlsearch laat alle treffers oplichten
+ Je kan zowel de lange als de korte naam van een optie gebruiken.
+
+ 7. Zet 'no' voor de naam om een optie uit te schakelen: :set noic
+ schakelt 'ic' uit.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 7.1: HULP INROEPEN
+
+ ** Het gebruik van ingebouwde hulp. **
+
+ Vim heeft een uitgebreid ingebouwd hulpsysteem. Probeer, om te beginnen,
+ één van deze drie:
+ - druk de <HELP> toets (als je die hebt)
+ - druk de <F1> toets (als je die hebt)
+ - tik :help <ENTER>
+
+ Lees de tekst in het help-venster om te leren hoe 'help' werkt.
+ Tik CTRL-W CTRL-W om van het ene venster naar het andere te gaan.
+ Met :q <ENTER> wordt het help-venster gesloten.
+
+ Je kan hulp vinden over nagenoeg elk onderwerp door een argument aan het
+ commando :help toe te voegen. Probeer deze (en vergeet <ENTER> niet):
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 7.2: SCHRIJF EEN CONFIGURATIEBESTAND
+
+ ** Mogelijkheden van Vim uitbreiden. **
+
+ Vim kent veel meer mogelijkheden dan Vi, maar de meeste zijn standaard
+ uitgeschakeld. Om meer functies te gebruiken moet je een 'vimrc'-bestand
+ schrijven.
+
+ 1. Bewerk het bestand 'vimrc'. Hoe dat moet hangt af van je systeem:
+ :e ~/.vimrc voor Unix
+ :e ~/_vimrc voor MS-Windows
+
+ 2. Lees de inhoud van het voorbeeld-bestand:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Sla het bestand op met :w
+
+ De volgende keer dat je Vim start wordt 'syntaxiskleuring' gebruiken.
+ Je kan al je voorkeursinstellingen toevoegen aan dit 'vimrc'-bestand.
+ Tik :help vimrc-intro voor meer informatie.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Les 7.3: AANVULLEN
+
+ ** Aanvullen van de 'command line' met CTRL-D en <TAB>. **
+
+ 1. Zorg dat Vim niet in 'compatible mode' is met :set nocp
+
+ 2. Kijk welke bestanden zich in de map bevinden met :!ls of :!dir
+
+ 3. Tik het begin van een commando: :e
+
+ 4. Met CTRL-D toont Vim een lijst commando's, die met "e" beginnen.
+
+ 5. Druk enkele keren <TAB>. Vim laat aanvullingen zien, zoals ":edit",
+ dat we hier gebruiken.
+
+ 6. Voeg een spatie toe en de eerste letter(s) van een bestaande
+ bestandsnaam: :edit BESTAND
+
+ 7. Druk <TAB>. Vim vult de naam aan (als hij uniek is).
+
+ OPMERKING: Aanvullen werkt bij tal van commando's. Probeer gewoon CTRL-D
+ en <TAB>. Het is bijzonder nuttig bij :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ SAMENVATTING Les 7
+
+ 1. Tik :help of druk <F1> of <Help> om een help-venster te openen.
+
+ 2. Tik :help CMD voor hulp over CMD .
+
+ 3. Tik CTRL-W CTRL-W om naar een ander venster te gaan.
+
+ 4. Tik :q om het help-venster te sluiten.
+
+ 5. Maak een bestand met de naam 'vimrc' voor je voorkeursinstellingen.
+
+ 6. Druk CTRL-D tijdens het intikken van een :-commando om mogelijke
+ aanvullingen te zien. Druk <TAB> om aanvullen te gebruiken.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Hiermee komen de Vim-lessen tot een einde. Ze waren bedoeld om een kort
+ overzicht te geven van de Vim-editor, juist voldoende om de editor
+ redelijk makkelijk te gebruiken. Deze lessen zijn verre van volledig. Vim
+ kent veel meer commando's. Lees hierna de handleiding voor gebruikers:
+ ":help user-manual".
+
+ Voor verdere studie wordt aanbevolen:
+ Vim - Vi Improved - door Steve Oualline
+ Uitgever: New Riders
+ Dit is het eerste boek dat geheel aan Vim is gewijd. Speciaal geschikt
+ voor beginners. Met veel voorbeelden en afbeeldingen.
+ Zie https://iccf-holland.org/click5.html
+
+ Het volgende boek is ouder en gaat meer over Vi dan Vim, maar het wordt
+ toch aanbevolen:
+ Learning the Vi Editor - door Linda Lamb
+ Uitgever: O'Reilly & Associates Inc.
+ Het is een goed boek om nagenoeg alles te weten te komen dat je met Vi
+ zou willen doen. De zesde en vooral de nieuwe zevende druk (onder de
+ titel Learning the Vi and Vim Editors door Arnold Robbins, Elbert Hannah
+ & Linda Lamb) bevat ook informatie over Vim.
+
+ Deze lessen zijn geschreven door Michael C. Pierce en Robert K. Ware,
+ Colorado School of Mines met gebruikmaking van ideeën van Charles Smith
+ van de Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Aangepast voor Vim door Bram Moolenaar.
+
+ Nederlandse vertaling door Rob Bishoff, april 2012
+ e-mail: rob.bishoff@hccnet.nl)
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.no b/runtime/tutor/tutor.no
new file mode 100644
index 0000000..9eb6dfa
--- /dev/null
+++ b/runtime/tutor/tutor.no
@@ -0,0 +1,973 @@
+===============================================================================
+= V e l k o m m e n t i l i n n f r i n g e n i V i m -- Ver. 1.7 =
+===============================================================================
+
+ Vim er en meget kraftig editor med mange kommandoer, alt for mange til
+ kunne g gjennom alle i en innfring som denne. Den er beregnet p
+ sette deg inn i bruken av nok kommandoer s du vil vre i stand til lett
+ kunne bruke Vim som en editor til alle forml.
+
+ Tiden som kreves for g gjennom denne innfringen tar ca. 25-30
+ minutter, avhengig av hvor mye tid du bruker til eksperimentering.
+
+ MERK:
+ Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne
+ filen som du kan ve deg p (hvis du kjrte vimtutor-kommandoen, er
+ dette allerede en kopi).
+
+ Det er viktig huske at denne innfringen er beregnet p lring gjennom
+ bruk. Det betyr at du m utfre kommandoene for lre dem skikkelig.
+ Hvis du bare leser teksten, vil du glemme kommandoene!
+
+ Frst av alt, sjekk at Caps Lock IKKE er aktiv og trykk j-tasten for
+ flytte markren helt til leksjon 1.1 fyller skjermen.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.1: FLYTTING AV MARKREN
+
+
+ ** For flytte markren, trykk tastene h, j, k, l som vist. **
+ ^
+ k Tips: h-tasten er til venstre og flytter til venstre.
+ < h l > l-tasten er til hyre og flytter til hyre.
+ j j-tasten ser ut som en pil som peker nedover.
+ v
+ 1. Flytt markren rundt p skjermen til du har ftt det inn i fingrene.
+
+ 2. Hold inne nedovertasten (j) til den repeterer.
+ N vet du hvordan du beveger deg til neste leksjon.
+
+ 3. G til leksjon 1.2 ved hjelp av nedovertasten.
+
+Merk: Hvis du blir usikker p noe du har skrevet, trykk <ESC> for g til
+ normalmodus. Skriv deretter kommandoen du nsket p nytt.
+
+Merk: Piltastene skal ogs virke. Men ved bruke hjkl vil du vre i stand til
+ bevege markren mye raskere nr du er blitt vant til det. Helt sant!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.2: AVSLUTTE VIM
+
+
+ !! MERK: Fr du utfrer noen av punktene nedenfor, les hele leksjonen!!
+
+ 1. Trykk <ESC>-tasten (for forsikre deg om at du er i normalmodus).
+
+ 2. Skriv: :q! <ENTER>.
+ Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.
+
+ 3. Nr du ser kommandolinjen i skallet, skriv kommandoen som startet denne
+ innfringen. Den er: vimtutor <ENTER>
+
+ 4. Hvis du er sikker p at du husker dette, utfr punktene 1 til 3 for
+ avslutte og starte editoren p nytt.
+
+MERK: :q! <ENTER> forkaster alle forandringer som du gjorde. I lpet av noen
+ f leksjoner vil du lre hvordan du lagrer forandringene til en fil.
+
+ 5. Flytt markren ned til leksjon 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.3: REDIGERING AV TEKST -- SLETTING
+
+
+ ** Trykk x for slette tegnet under markren. **
+
+ 1. Flytt markren til den frste linjen merket med --->.
+
+ 2. For ordne feilene p linjen, flytt markren til den er opp tegnet som
+ skal slettes.
+
+ 3. Trykk tasten x for slette det unskede tegnet.
+
+ 4. Repeter punkt 2 til 4 til setningen er lik den som er under.
+
+---> Hessstennnn brrrsnudddde ii gaaata.
+---> Hesten brsnudde i gata.
+
+ 5. N som linjen er korrekt, g til leksjon 1.4.
+
+MERK: Nr du gr gjennom innfringen, ikke bare prv huske kommandoene, men
+ bruk dem helt til de sitter.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING
+
+
+ ** Trykk i for sette inn tekst. **
+
+ 1. Flytt markren til den frste linjen som er merket med --->.
+
+ 2. For gjre den frste linjen lik den andre, flytt markren til den str
+ p tegnet ETTER posisjonen der teksten skal settes inn.
+
+ 3. Trykk i og skriv inn teksten som mangler.
+
+ 4. Etterhvert som hver feil er fikset, trykk <ESC> for returnere til
+ normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.
+
+---> Det er tkst som mnglr .
+---> Det er ganske mye tekst som mangler her.
+
+ 5. Nr du fler deg komfortabel med sette inn tekst, g til oppsummeringen
+ nedenfor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL
+
+
+ ** Trykk A for legge til tekst. **
+
+ 1. Flytt markren til den frste linjen nedenfor merket --->.
+ Det har ikke noe si hvor markren er plassert p den linjen.
+
+ 2. Trykk A og skriv inn det som skal legges til.
+
+ 3. Nr teksten er lagt til, trykk <ESC> for returnere til normalmodusen.
+
+ 4. Flytt markren til den andre linjen markert med ---> og repeter steg 2 og
+ 3 for reparere denne setningen.
+
+---> Det mangler noe tekst p
+ Det mangler noe tekst p denne linjen.
+---> Det mangler ogs litt tek
+ Det mangler ogs litt tekst p denne linjen.
+
+ 5. Nr du fler at du behersker legge til tekst, g til leksjon 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.6: REDIGERE EN FIL
+
+
+ ** Bruk :wq for lagre en fil og avslutte. **
+
+ !! MERK: Fr du utfrer noen av stegene nedenfor, les hele denne leksjonen!!
+
+ 1. Avslutt denne innfringen som du gjorde i leksjon 1.2: :q!
+
+ 2. Skriv denne kommandoen p kommandolinja: vim tutor <ENTER>
+ vim er kommandoen for starte Vim-editoren, tutor er navnet p fila
+ som du vil redigere. Bruk en fil som kan forandres.
+
+ 3. Sett inn og slett tekst som du lrte i de foregende leksjonene.
+
+ 4. Lagre filen med forandringene og avslutt Vim med: :wq <ENTER>
+
+ 5. Start innfringen p nytt og flytt ned til oppsummeringen som flger.
+
+ 6. Etter ha lest og forsttt stegene ovenfor: Sett i gang.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 1
+
+
+ 1. Markren beveges ved hjelp av piltastene eller hjkl-tastene.
+ h (venstre) j (ned) k (opp) l (hyre)
+
+ 2. For starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN <ENTER>
+
+ 3. For avslutte Vim, skriv: <ESC> :q! <ENTER> for forkaste endringer.
+ ELLER skriv: <ESC> :wq <ENTER> for lagre forandringene.
+
+ 4. For slette tegnet under markren, trykk: x
+
+ 5. For sette inn eller legge til tekst, trykk:
+ i skriv innsatt tekst <ESC> sett inn fr markren
+ A skriv tillagt tekst <ESC> legg til p slutten av linjen
+
+MERK: Nr du trykker <ESC> gr du til normalmodus eller du avbryter en unsket
+ og delvis fullfrt kommando.
+
+ N kan du g videre til leksjon 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.1: SLETTEKOMMANDOER
+
+
+ ** Trykk dw for slette et ord. **
+
+ 1. Trykk <ESC> for vre sikker p at du er i normalmodus.
+
+ 2. Flytt markren til den frste linjen nedenfor merket --->.
+
+ 3. Flytt markren til begynnelsen av ordet som skal slettes.
+
+ 4. Trykk dw og ordet vil forsvinne.
+
+MERK: Bokstaven d vil komme til syne p den nederste linjen p skjermen nr
+ du skriver den. Vim venter p at du skal skrive w . Hvis du ser et annet
+ tegn enn d har du skrevet noe feil; trykk <ESC> og start p nytt.
+
+---> Det er agurk tre ord eple som ikke hrer pre hjemme i denne setningen.
+---> Det er tre ord som ikke hrer hjemme i denne setningen.
+
+ 5. Repeter punkt 3 og 4 til den frste setningen er lik den andre. G
+ deretter til leksjon 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.2: FLERE SLETTEKOMMANDOER
+
+
+ ** Trykk d$ for slette til slutten av linjen. **
+
+ 1. Trykk <ESC> for vre sikker p at du er i normalmodus.
+
+ 2. Flytt markren til linjen nedenfor merket --->.
+
+ 3. Flytt markren til punktet der linjen skal kuttes (ETTER frste punktum).
+
+ 4. Trykk d$ for slette alt til slutten av linjen.
+
+---> Noen skrev slutten p linjen en gang for mye. linjen en gang for mye.
+
+ 5. G til leksjon 2.3 for forst hva som skjer.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.3: OM OPERATORER OG BEVEGELSER
+
+
+ Mange kommandoer som forandrer teksten er laget ut i fra en operator og en
+ bevegelse. Formatet for en slettekommando med sletteoperatoren d er:
+
+ d bevegelse
+
+ Der:
+ d - er sletteoperatoren.
+ bevegelse - er hva operatoren vil opere p (listet nedenfor).
+
+ En kort liste med bevegelser:
+ w - til starten av det neste ordet, UNNTATT det frste tegnet.
+ e - til slutten av det nvrende ordet, INKLUDERT det siste tegnet.
+ $ - til slutten av linjen, INKLUDERT det siste tegnet.
+
+ Ved skrive de vil alts alt fra markren til slutten av ordet bli
+ slettet.
+
+MERK: Ved skrive kun bevegelsen i normalmodusen uten en operator vil
+ markren flyttes som spesifisert.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE
+
+
+ ** Ved skrive et tall foran en bevegelse repeterer den s mange ganger. **
+
+ 1. Flytt markren til starten av linjen markert ---> nedenfor.
+
+ 2. Skriv 2w for flytte markren to ord framover.
+
+ 3. Skriv 3e for flytte markren framover til slutten av det tredje
+ ordet.
+
+ 4. Skriv 0 (null) for flytte til starten av linjen.
+
+ 5. Repeter steg 2 og 3 med forskjellige tall.
+
+---> Dette er en linje med noen ord som du kan bevege deg rundt p.
+
+ 6. G videre til leksjon 2.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.5: BRUK AV ANTALL FOR SLETTE MER
+
+
+ ** Et tall sammen med en operator repeterer den s mange ganger. **
+
+ I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du
+ inn antall fr bevegelsen for slette mer:
+ d nummer bevegelse
+
+ 1. Flytt markren til det frste ordet med STORE BOKSTAVER p linjen markert
+ med --->.
+
+ 2. Skriv 2dw for slette de to ordene med store bokstaver.
+
+ 3. Repeter steg 1 og 2 med forskjelling antall for slette de etterflgende
+ ordene som har store bokstaver.
+
+---> Denne ABC DE linjen FGHI JK LMN OP er n Q RS TUV litt mer lesbar.
+
+MERK: Et antall mellom operatoren d og bevegelsen virker p samme mte som
+ bruke bevegelsen uten en operator.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.6: OPERERE P LINJER
+
+
+ ** Trykk dd for slette en hel linje. **
+
+ P grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at
+ det vil vre lettere rett og slett trykke to d-er for slette en linje.
+
+ 1. Flytt markren til den andre linjen i verset nedenfor.
+ 2. Trykk dd slette linjen.
+ 3. Flytt deretter til den fjerde linjen.
+ 4. Trykk 2dd for slette to linjer.
+
+---> 1) Roser er rde,
+---> 2) Gjrme er gy,
+---> 3) Fioler er bl,
+---> 4) Jeg har en bil,
+---> 5) Klokker viser tiden,
+---> 6) Druer er ste
+---> 7) Og du er likes.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.7: ANGRE-KOMMANDOEN
+
+
+ ** Trykk u for angre siste kommando, U for fikse en hel linje. **
+
+ 1. Flytt markren til linjen nedenfor merket ---> og plasser den p den
+ frste feilen.
+ 2. Trykk x for slette det frste unskede tegnet.
+ 3. Trykk s u for angre den siste utfrte kommandoen.
+ 4. Deretter ordner du alle feilene p linjene ved bruke kommandoen x .
+ 5. Trykk n en stor U for sette linjen tilbake til det den var
+ originalt.
+ 6. Trykk u noen ganger for angre U og foregende kommandoer.
+ 7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen
+ ganger for gjenopprette kommandoene (omgjre angrekommandoene).
+
+---> RReparer feiilene p denne linnnjen oog erssstatt dem meed angre.
+
+ 8. Dette er meget nyttige kommandoer. N kan du g til oppsummeringen av
+ leksjon 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 2
+
+
+ 1. For slette fra markren fram til det neste ordet, trykk: dw
+ 2. For slette fra markren til slutten av en linje, trykk: d$
+ 3. For slette en hel linje, trykk: dd
+
+ 4. For repetere en bevegelse, sett et nummer foran: 2w
+ 5. Formatet for en forandringskommando er:
+ operator [nummer] bevegelse
+ der:
+ operator - hva som skal gjres, f.eks. d for slette
+ [nummer] - et valgfritt antall for repetere bevegelsen
+ bevegelse - hva kommandoen skal operere p, eksempelvis w (ord),
+ $ (til slutten av linjen) og s videre.
+
+ 6. For g til starten av en linje, bruk en null: 0
+
+ 7. For angre tidligere endringer, skriv: u (liten u)
+ For angre alle forandringer p en linje, skriv: U (stor U)
+ For omgjre angringen, trykk: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.1: LIM INN-KOMMANDOEN
+
+
+ ** Trykk p for lime inn tidligere slettet tekst etter markren **
+
+ 1. Flytt markren til den frste linjen med ---> nedenfor.
+
+ 2. Trykk dd for slette linjen og lagre den i et Vim-register.
+
+ 3. Flytt markren til c)-linjen, OVER posisjonen linjen skal settes inn.
+
+ 4. Trykk p for legge linjen under markren.
+
+ 5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkeflge.
+
+---> d) Kan du ogs lre?
+---> b) Fioler er bl,
+---> c) Intelligens m lres,
+---> a) Roser er rde,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.2: ERSTATT-KOMMANDOEN
+
+
+ ** Trykk rx for erstatte tegnet under markren med x. **
+
+ 1. Flytt markren til den frste linjen nedenfor merket --->.
+
+ 2. Flytt markren s den str opp den frste feilen.
+
+ 3. Trykk r og deretter tegnet som skal vre der.
+
+ 4. Repeter punkt 2 og 3 til den frste linjen er lik den andre.
+
+---> Da dfnne lynjxn ble zkrevet, var det nen som tjykket feite taster!
+---> Da denne linjen ble skrevet, var det noen som trykket feile taster!
+
+ 5. G videre til leksjon 3.2.
+
+MERK: Husk at du br lre ved BRUKE, ikke pugge.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.3: FORANDRE-OPERATOREN
+
+
+ ** For forandre til slutten av et ord, trykk ce . **
+
+ 1. Flytt markren til den frste linjen nedenfor som er merket --->.
+
+ 2. Plasser markren p u i lubjwr.
+
+ 3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv injen).
+
+ 4. Trykk <ESC> og g til det neste tegnet som skal forandres.
+
+ 5. Repeter punkt 3 og 4 helt til den frste setningen er lik den andre.
+
+---> Denne lubjwr har noen wgh som m forkwp med forkzryas-kommandoen.
+---> Denne linjen har noen ord som m forandres med forandre-kommandoen.
+
+Vr oppmerksom p at ce sletter ordet og gr inn i innsettingsmodus.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c
+
+
+ ** Forandringskommandoen blir brukt med de samme bevegelser som slett. **
+
+ 1. Forandringsoperatoren fungerer p samme mte som slett. Formatet er:
+
+ c [nummer] bevegelse
+
+ 2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en
+ linje).
+
+ 3. G til den frste linjen nedenfor som er merket --->.
+
+ 4. Flytt markren til den frste feilen.
+
+ 5. Skriv c$ og skriv resten av linjen lik den andre og trykk <ESC>.
+
+---> Slutten p denne linjen trenger litt hjelp for gjre den lik den neste.
+---> Slutten p denne linjen trenger bli rettet ved bruk av c$-kommandoen.
+
+MERK: Du kan bruke slettetasten for rette feil mens du skriver.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 3
+
+
+ 1. For legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette
+ limer inn den slettede teksten ETTER markren (hvis en linje ble slettet
+ vil den bli limt inn p linjen under markren).
+
+ 2. For erstatte et tegn under markren, trykk r og deretter tegnet som
+ du vil ha der.
+
+ 3. Forandringsoperatoren lar deg forandre fra markren til dit bevegelsen
+ tar deg. Det vil si, skriv ce for forandre fra markren til slutten
+ av ordet, c$ for forandre til slutten av linjen.
+
+ 4. Formatet for forandre er:
+
+ c [nummer] bevegelse
+
+N kan du g til neste leksjon.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.1: POSISJONERING AV MARKREN OG FILSTATUS
+
+ ** Trykk CTRL-G for vise posisjonen i filen og filstatusen.
+ Trykk G for g til en spesifikk linje i filen. **
+
+ Merk: Les hele leksjonen fr du utfrer noen av punktene!
+
+ 1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding
+ vil komme til syne p bunnen av skjermen med filnavnet og posisjonen i
+ filen. Husk linjenummeret for bruk i steg 3.
+
+Merk: Du kan se markrposisjonen i nederste hyre hjrne av skjermen. Dette
+ skjer nr ruler-valget er satt (forklart i leksjon 6).
+
+ 2. Trykk G for g til bunnen av filen.
+ Skriv gg for g til begynnelsen av filen.
+
+ 3. Skriv inn linjenummeret du var p og deretter G . Dette vil fre deg
+ tilbake til linjen du var p da du frst trykket CTRL-G.
+
+ 4. Utfr steg 1 til 3 hvis du fler deg sikker p prosedyren.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.2: SKEKOMMANDOEN
+
+ ** Skriv / etterfulgt av en skestreng som du vil lete etter. **
+
+ 1. Trykk / nr du er i normalmodusen. Legg merke til at skrstreken og
+ markren kommer til syne p bunnen av skjermen i likhet med
+ :-kommandoene.
+
+ 2. Skriv feeeiil og trykk <ENTER>. Dette er teksten du vil lete etter.
+
+ 3. For finne neste forekomst av skestrengen, trykk n .
+ For lete etter samme sketeksten i motsatt retning, trykk N .
+
+ 4. For lete etter en tekst bakover i filen, bruk ? istedenfor / .
+
+ 5. For g tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens
+ du trykker bokstaven o ). Repeter for g enda lengre tilbake. CTRL-I
+ gr framover.
+
+---> feeeiil er ikke mten skrive feil p, feeeiil er helt feil.
+Merk: Nr skingen nr slutten av filen, vil den fortsette fra starten unntatt
+ hvis wrapscan-valget er resatt.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.3: FINN SAMSVARENDE PARENTESER
+
+
+ ** Trykk % for finne en samsvarende ), ] eller } . **
+
+ 1. Plasser markren p en (, [ eller { p linjen nedenfor merket --->.
+
+ 2. Trykk % .
+
+ 3. Markren vil g til den samsvarende parentesen eller hakeparentesen.
+
+ 4. Trykk % for flytte markren til den andre samsvarende parentesen.
+
+ 5. Flytt markren til en annen (, ), [, ], { eller } og se hva % gjr.
+
+---> Dette ( er en testlinje med (, [ ] og { } i den )).
+
+Merk: Dette er veldig nyttig til feilsking i programmer som har ubalansert
+ antall parenteser!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.4: ERSTATT-KOMMANDOEN
+
+
+ ** Skriv :s/gammel/ny/g for erstatte gammel med ny. **
+
+ 1. Flytt markren til linjen nedenfor som er merket med --->.
+
+ 2. Skriv :s/deen/den/ <ENTER> . Legg merke til at denne kommandoen bare
+ forandrer den frste forekomsten av deen p linjen.
+
+ 3. Skriv :s/deen/den/g . Nr g-flagget legges til, betyr dette global
+ erstatning p linjen og erstatter alle forekomster av deen p linjen.
+
+---> deen som kan kaste deen tyngste steinen lengst er deen beste
+
+ 4. For erstatte alle forekomster av en tekststreng mellom to linjer,
+ skriv :#,#s/gammel/ny/g der #,# er linjenumrene p de to linjene for
+ linjeomrdet erstatningen skal gjres.
+ Skriv :%s/gammel/ny/g for erstatte tekst i hele filen.
+ Skriv :%s/gammel/ny/gc for finne alle forekomster i hele filen, og
+ deretter sprre om teksten skal erstattes eller
+ ikke.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 4
+
+
+ 1. Ctrl-G viser nvrende posisjon i filen og filstatusen.
+ G gr til slutten av filen.
+ nummer G gr til det linjenummeret.
+ gg gr til den frste linjen.
+
+ 2. Skriv / etterfulgt av en sketekst for lete FRAMOVER etter teksten.
+ Skriv ? etterfulgt av en sketekst for lete BAKOVER etter teksten.
+ Etter et sk kan du trykke n for finne neste forekomst i den samme
+ retningen eller N for lete i motsatt retning.
+ CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.
+
+ 3. Skriv % nr markren str p en (, ), [, ], { eller } for finne den
+ som samsvarer.
+
+ 4. Erstatte gammel med frste ny p en linje: :s/gammel/ny
+ Erstatte alle gammel med ny p en linje: :s/gammel/ny/g
+ Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g
+ Erstatte alle forekomster i en fil: :%s/gammel/ny/g
+ For godkjenne hver erstatning, legg til c: :%s/gammel/ny/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.1: HVORDAN UTFRE EN EKSTERN KOMMANDO
+
+
+ ** Skriv :! etterfulgt av en ekstern kommando for utfre denne. **
+
+ 1. Skriv den velkjente kommandoen : for plassere markren p bunnen av
+ skjermen. Dette lar deg skrive en kommandolinjekommando.
+
+ 2. N kan du skrive tegnet ! . Dette lar deg utfre en hvilken som helst
+ ekstern kommando.
+
+ 3. Som et eksempel, skriv ls etter utropstegnet og trykk <ENTER>. Du vil
+ n f en liste over filene i katalogen, akkurat som om du hadde kjrt
+ kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis
+ ls ikke virker.
+
+MERK: Det er mulig kjre alle eksterne kommandoer p denne mten, ogs med
+ parametere.
+
+MERK: Alle :-kommandoer m avsluttes med <ENTER>. Fra dette punktet er det
+ ikke alltid vi nevner det.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.2: MER OM LAGRING AV FILER
+
+
+ ** For lagre endringene gjort i en tekst, skriv :w FILNAVN. **
+
+ 1. Skriv :!dir eller :!ls for f en liste over filene i katalogen. Du
+ vet allerede at du m trykke <ENTER> etter dette.
+
+ 2. Velg et filnavn p en fil som ikke finnes, som for eksempel TEST .
+
+ 3. Skriv :w TEST (der TEST er filnavnet du velger).
+
+ 4. Dette lagrer hele filen (denne innfringen) under navnet TEST . For
+ sjekke dette, skriv :!dir eller :!ls igjen for se innholdet av
+ katalogen.
+
+Merk: Hvis du n hadde avsluttet Vim og startet p nytt igjen med vim TEST,
+ ville filen vrt en eksakt kopi av innfringen da du lagret den.
+
+ 5. Fjern filen ved skrive :!rm TEST hvis du er p et Unix-lignende
+ operativsystem, eller :!del TEST hvis du bruker MS-DOS.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES
+
+
+ ** For lagre en del av en fil, skriv v bevegelse :w FILNAVN **
+
+ 1. Flytt markren til denne linjen.
+
+ 2. Trykk v og flytt markren til det femte elementet nedenfor. Legg merke
+ til at teksten blir markert.
+
+ 3. Trykk : (kolon). P bunnen av skjermen vil :'<,'> komme til syne.
+
+ 4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller
+ at du ser :'<,'>w TEST fr du trykker Enter.
+
+ 5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls
+ for se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.
+
+MERK: Ved trykke v startes visuelt valg. Du kan flytte markren rundt for
+ gjre det valgte omrdet strre eller mindre. Deretter kan du bruke en
+ operator for gjre noe med teksten. For eksempel sletter d teksten.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.4: HENTING OG SAMMENSLING AV FILER
+
+
+ ** For lese inn en annen fil inn i nvrende buffer, skriv :r FILNAVN **
+
+ 1. Plasser markren like over denne linjen.
+
+MERK: Etter ha utfrt steg 2 vil du se teksten fra leksjon 5.3. G deretter
+ NED for se denne leksjonen igjen.
+
+ 2. Hent TEST-filen ved bruke kommandoen :r TEST der TEST er navnet p
+ filen du brukte. Filen du henter blir plassert nedenfor markrlinjen.
+
+ 3. For sjekke at filen ble hentet, g tilbake og se at det er to kopier av
+ leksjon 5.3, originalen og denne versjonen.
+
+MERK: Du kan ogs lese utdataene av en ekstern kommando. For eksempel, :r !ls
+ leser utdataene av ls-kommandoen og legger dem nedenfor markren.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 5
+
+
+ 1. :!kommando utfrer en ekstern kommandio.
+
+ Noen nyttige eksempler er:
+ (MS-DOS) (Unix)
+ :!dir :!ls - List filene i katalogen.
+ :!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN.
+
+ 2. :w FILNAVN skriver den nvrende Vim-filen disken med navnet FILNAVN .
+
+ 3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen
+ FILNAVN.
+
+ 4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markren.
+
+ 5. :r !dir leser utdataene fra dir-kommandoen og legger dem nedenfor
+ markrposisjonen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.1: PNE LINJE-KOMMANDOEN
+
+
+ ** Skriv o for pne opp for en ny linje etter markren og g til
+ innsettingsmodus **
+
+ 1. Flytt markren til linjen nedenfor merket --->.
+
+ 2. Skriv o (liten o) for pne opp en linje NEDENFOR markren og g inn i
+ innsettingsmodus.
+
+ 3. Skriv litt tekst og trykk <ESC> for g ut av innsettingsmodusen.
+
+---> Etter at o er skrevet blir markren plassert p den tomme linjen.
+
+ 4. For pne en ny linje OVER markren, trykk rett og slett en stor O
+ istedenfor en liten o . Prv dette p linjen nedenfor.
+
+---> Lag ny linje over denne ved trykke O mens markren er p denne linjen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.2: LEGG TIL-KOMMANDOEN
+
+
+ ** Skriv a for legge til tekst ETTER markren. **
+
+ 1. Flytt markren til starten av linjen merket ---> nedenfor.
+
+ 2. Trykk e til markren er p slutten av li.
+
+ 3. Trykk a (liten a) for legge til tekst ETTER markren.
+
+ 4. Fullfr ordet snn som p linjen nedenfor. Trykk <ESC> for g ut av
+ innsettingsmodusen.
+
+ 5. Bruk e for g til det neste ufullstendige ordet og repeter steg 3 og
+ 4.
+
+---> Denne li lar deg ve p leg til tek p en linje.
+---> Denne linjen lar deg ve p legge til tekst p en linje.
+
+Merk: a, i og A gr alle til den samme innsettingsmodusen, den eneste
+ forskjellen er hvor tegnene blir satt inn.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.3: EN ANNEN MTE ERSTATTE P
+
+
+ ** Skriv en stor R for erstatte mer enn ett tegn. **
+
+ 1. Flytt markren til den frste linjen nedenfor merket --->. Flytt markren
+ til begynnelsen av den frste xxx-en.
+
+ 2. Trykk R og skriv inn tallet som str nedenfor p den andre linjen s
+ det erstatter xxx.
+
+ 3. Trykk <ESC> for g ut av erstatningsmodusen. Legg merke til at resten
+ av linjen forblir uforandret.
+
+ 4. Repeter stegene for erstatte den gjenvrende xxx.
+
+---> Ved legge 123 til xxx fr vi xxx.
+---> Ved legge 123 til 456 fr vi 579.
+
+MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives
+ erstatter et eksisterende tegn.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.4: KOPIERE OG LIME INN TEKST
+
+
+ ** Bruk y-operatoren for kopiere tekst og p for lime den inn **
+
+ 1. G til linjen merket ---> nedenfor og plasser markren etter a).
+
+ 2. G inn i visuell modus med v og flytt markren til like fr frste.
+
+ 3. Trykk y for kopiere (engelsk: yank) den uthevede teksten.
+
+ 4. Flytt markren til slutten av den neste linjen: j$
+
+ 5. Trykk p for lime inn teksten. Trykk deretter: a andre <ESC> .
+
+ 6. Bruk visuell modus for velge valget., kopier det med y , g til
+ slutten av den neste linjen med j$ og legg inn teksten der med p .
+
+---> a) Dette er det frste valget.
+ b)
+
+Merk: Du kan ogs bruke y som en operator; yw kopierer ett ord.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.5: SETT VALG
+
+
+ ** Sett et valg s sk eller erstatning ignorerer store/sm bokstaver. **
+
+ 1. Let etter ignore ved skrive: /ignore <ENTER>
+ Repeter flere ganger ved trykke n .
+
+ 2. Sett ic-valget (Ignore Case) ved skrive: :set ic
+
+ 3. Sk etter ignore igjen ved trykke n .
+ Legg merke til at bde Ignore og IGNORE blir funnet.
+
+ 4. Sett hlsearch- og incsearch-valgene: :set hls is
+
+ 5. Skriv skekommandoen igjen og se hva som skjer: /ignore <ENTER>
+
+ 6. For sl av ignorering av store/sm bokstaver, skriv: :set noic
+
+Merk: For fjerne uthevingen av treff, skriv: :nohlsearch
+Merk: Hvis du vil ignorere store/sm bokstaver for kun en skekommando, bruk
+ \c i uttrykket: /ignore\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 6
+
+ 1. Trykk o for legge til en linje NEDENFOR markren og g inn i
+ innsettingsmodus.
+ Trykk O for pne en linje OVER markren.
+
+ 2. Skriv a for sette inn tekst ETTER markren.
+ Skriv A for sette inn tekst etter slutten av linjen.
+
+ 3. Kommandoen e gr til slutten av et ord.
+
+ 4. Operatoren y (yank) kopierer tekst, p (paste) limer den inn.
+
+ 5. Ved trykke R gr du inn i erstatningsmodus helt til <ESC> trykkes.
+
+ 6. Skriv :set xxx for sette valget xxx. Noen valg er:
+ ic ignorecase ignorer store/sm bokstaver under sk
+ is incsearch vis delvise treff for en sketekst
+ hls hlsearch uthev alle sketreff
+
+ 7. Legg til no foran valget for sl det av: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.1: F HJELP
+
+
+ ** Bruk det innebygde hjelpesystemet. **
+
+ Vim har et omfattende innebygget hjelpesystem. For starte det, prv en av
+ disse mtene:
+ - Trykk Hjelp-tasten (hvis du har en)
+ - Trykk F1-tasten (hvis du har en)
+ - Skriv :help <ENTER>
+
+ Les teksten i hjelpevinduet for finne ut hvordan hjelpen virker.
+ Skriv CTRL-W CTRL-W for hoppe fra et vindu til et annet
+ Skriv :q <ENTER> for lukke hjelpevinduet.
+
+ Du kan f hjelp for omtrent alle temaer om Vim ved skrive et parameter til
+ :help-kommandoen. Prv disse (ikke glem trykke <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.2: LAG ET OPPSTARTSSKRIPT
+
+
+ ** Sl p funksjoner i Vim **
+
+ Vim har mange flere funksjoner enn Vi, men flesteparten av dem er sltt av
+ som standard. For begynne bruke flere funksjoner m du lage en
+ vimrc-fil.
+
+ 1. Start redigeringen av vimrc-filen. Dette avhenger av systemet ditt:
+ :e ~/.vimrc for Unix
+ :e ~/_vimrc for MS Windows
+
+ 2. Les inn eksempelfilen for vimrc:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Lagre filen med:
+ :w
+
+ Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til
+ alle dine foretrukne oppsett i denne vimrc-filen.
+ For mer informasjon, skriv :help vimrc-intro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.3: FULLFRING
+
+
+ ** Kommandolinjefullfring med CTRL-D og <TAB> **
+
+ 1. Vr sikker p at Vim ikke er i Vi-kompatibel modus: :set nocp
+
+ 2. Se hvilke filer som er i katalogen: :!ls eller :!dir
+
+ 3. Skriv starten p en kommando: :e
+
+ 4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med
+ e.
+
+ 5. Trykk <TAB> og Vim vil fullfre kommandonavnet til :edit.
+
+ 6. Legg til et mellomrom og starten p et eksisterende filnavn: :edit FIL
+
+ 7. Trykk <TAB>. Vim vil fullfre navnet (hvis det er unikt).
+
+MERK: Fullfring fungerer for mange kommandoer. Prv ved trykke CTRL-D og
+ <TAB>. Det er spesielt nyttig for bruk sammen med :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 7
+
+
+ 1. Skriv :help eller trykk <F1> eller <Help> for pne et hjelpevindu.
+
+ 2. Skriv :help kommando for f hjelp om kommando .
+
+ 3. Trykk CTRL-W CTRL-W for hoppe til et annet vindu.
+
+ 4. Trykk :q for lukke hjelpevinduet.
+
+ 5. Opprett et vimrc-oppstartsskript for lagre favorittvalgene dine.
+
+ 6. Nr du skriver en :-kommando, trykk CTRL-D for se mulige
+ fullfringer. Trykk <TAB> for bruke en fullfring.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Her slutter innfringen i Vim. Den var ment som en rask oversikt over
+ editoren, akkurat nok til la deg sette i gang med enkel bruk. Den er p
+ langt nr komplett, da Vim har mange flere kommandoer. Les bruksanvisningen
+ ved skrive :help user-manual .
+
+ For videre lesing og studier, kan denne boken anbefales:
+ Vim - Vi Improved av Steve Oualline
+ Utgiver: New Riders
+ Den frste boken som er fullt og helt dedisert til Vim. Spesielt nyttig for
+ nybegynnere. Inneholder mange eksempler og illustrasjoner.
+ Se https://iccf-holland.org/click5.html
+
+ Denne boken er eldre og handler mer om Vi enn Vim, men anbefales ogs:
+ Learning the Vi Editor av Linda Lamb
+ Utgiver: O'Reilly & Associates Inc.
+ Det er en god bok for f vite omtrent hva som helst om Vi.
+ Den sjette utgaven inneholder ogs informasjon om Vim.
+
+ Denne innfringen er skrevet av Michael C. Pierce og Robert K. Ware,
+ Colorado School of Mines med ider av Charles Smith, Colorado State
+ University. E-mail: bware@mines.colorado.edu .
+
+ Modifisert for Vim av Bram Moolenaar.
+ Oversatt av yvind A. Holm. E-mail: vimtutor _AT_ sunbase.org
+ Id: tutor.no 406 2007-03-18 22:48:36Z sunny
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+vim: set ts=8 :
diff --git a/runtime/tutor/tutor.no.utf-8 b/runtime/tutor/tutor.no.utf-8
new file mode 100644
index 0000000..6a8a4e9
--- /dev/null
+++ b/runtime/tutor/tutor.no.utf-8
@@ -0,0 +1,973 @@
+===============================================================================
+= V e l k o m m e n t i l i n n f ø r i n g e n i V i m -- Ver. 1.7 =
+===============================================================================
+
+ Vim er en meget kraftig editor med mange kommandoer, alt for mange til å
+ kunne gå gjennom alle i en innføring som denne. Den er beregnet på å
+ sette deg inn i bruken av nok kommandoer så du vil være i stand til lett
+ å kunne bruke Vim som en editor til alle formål.
+
+ Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30
+ minutter, avhengig av hvor mye tid du bruker til eksperimentering.
+
+ MERK:
+ Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne
+ filen som du kan øve deg på (hvis du kjørte «vimtutor»-kommandoen, er
+ dette allerede en kopi).
+
+ Det er viktig å huske at denne innføringen er beregnet på læring gjennom
+ bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig.
+ Hvis du bare leser teksten, vil du glemme kommandoene!
+
+ Først av alt, sjekk at «Caps Lock» IKKE er aktiv og trykk «j»-tasten for
+ å flytte markøren helt til leksjon 1.1 fyller skjermen.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.1: FLYTTING AV MARKØREN
+
+
+ ** For å flytte markøren, trykk tastene h, j, k, l som vist. **
+ ^
+ k Tips: h-tasten er til venstre og flytter til venstre.
+ < h l > l-tasten er til høyre og flytter til høyre.
+ j j-tasten ser ut som en pil som peker nedover.
+ v
+ 1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene.
+
+ 2. Hold inne nedovertasten (j) til den repeterer.
+ Nå vet du hvordan du beveger deg til neste leksjon.
+
+ 3. Gå til leksjon 1.2 ved hjelp av nedovertasten.
+
+Merk: Hvis du blir usikker på noe du har skrevet, trykk <ESC> for å gå til
+ normalmodus. Skriv deretter kommandoen du ønsket på nytt.
+
+Merk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til
+ å bevege markøren mye raskere når du er blitt vant til det. Helt sant!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.2: AVSLUTTE VIM
+
+
+ !! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!!
+
+ 1. Trykk <ESC>-tasten (for å forsikre deg om at du er i normalmodus).
+
+ 2. Skriv: :q! <ENTER>.
+ Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.
+
+ 3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne
+ innføringen. Den er: vimtutor <ENTER>
+
+ 4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å
+ avslutte og starte editoren på nytt.
+
+MERK: :q! <ENTER> forkaster alle forandringer som du gjorde. I løpet av noen
+ få leksjoner vil du lære hvordan du lagrer forandringene til en fil.
+
+ 5. Flytt markøren ned til leksjon 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.3: REDIGERING AV TEKST -- SLETTING
+
+
+ ** Trykk x for å slette tegnet under markøren. **
+
+ 1. Flytt markøren til den første linjen merket med --->.
+
+ 2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som
+ skal slettes.
+
+ 3. Trykk tasten x for å slette det uønskede tegnet.
+
+ 4. Repeter punkt 2 til 4 til setningen er lik den som er under.
+
+---> Hessstennnn brrråsnudddde ii gaaata.
+---> Hesten bråsnudde i gata.
+
+ 5. Nå som linjen er korrekt, gå til leksjon 1.4.
+
+MERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men
+ bruk dem helt til de sitter.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING
+
+
+ ** Trykk i for å sette inn tekst. **
+
+ 1. Flytt markøren til den første linjen som er merket med --->.
+
+ 2. For å gjøre den første linjen lik den andre, flytt markøren til den står
+ på tegnet ETTER posisjonen der teksten skal settes inn.
+
+ 3. Trykk i og skriv inn teksten som mangler.
+
+ 4. Etterhvert som hver feil er fikset, trykk <ESC> for å returnere til
+ normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.
+
+---> Det er tkst som mnglr .
+---> Det er ganske mye tekst som mangler her.
+
+ 5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen
+ nedenfor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL
+
+
+ ** Trykk A for å legge til tekst. **
+
+ 1. Flytt markøren til den første linjen nedenfor merket --->.
+ Det har ikke noe å si hvor markøren er plassert på den linjen.
+
+ 2. Trykk A og skriv inn det som skal legges til.
+
+ 3. Når teksten er lagt til, trykk <ESC> for å returnere til normalmodusen.
+
+ 4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og
+ 3 for å reparere denne setningen.
+
+---> Det mangler noe tekst p
+ Det mangler noe tekst på denne linjen.
+---> Det mangler også litt tek
+ Det mangler også litt tekst på denne linjen.
+
+ 5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 1.6: REDIGERE EN FIL
+
+
+ ** Bruk :wq for å lagre en fil og avslutte. **
+
+ !! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!!
+
+ 1. Avslutt denne innføringen som du gjorde i leksjon 1.2: :q!
+
+ 2. Skriv denne kommandoen på kommandolinja: vim tutor <ENTER>
+ «vim» er kommandoen for å starte Vim-editoren, «tutor» er navnet på fila
+ som du vil redigere. Bruk en fil som kan forandres.
+
+ 3. Sett inn og slett tekst som du lærte i de foregående leksjonene.
+
+ 4. Lagre filen med forandringene og avslutt Vim med: :wq <ENTER>
+
+ 5. Start innføringen på nytt og flytt ned til oppsummeringen som følger.
+
+ 6. Etter å ha lest og forstått stegene ovenfor: Sett i gang.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 1
+
+
+ 1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene.
+ h (venstre) j (ned) k (opp) l (høyre)
+
+ 2. For å starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN <ENTER>
+
+ 3. For å avslutte Vim, skriv: <ESC> :q! <ENTER> for å forkaste endringer.
+ ELLER skriv: <ESC> :wq <ENTER> for å lagre forandringene.
+
+ 4. For å slette tegnet under markøren, trykk: x
+
+ 5. For å sette inn eller legge til tekst, trykk:
+ i skriv innsatt tekst <ESC> sett inn før markøren
+ A skriv tillagt tekst <ESC> legg til på slutten av linjen
+
+MERK: Når du trykker <ESC> går du til normalmodus eller du avbryter en uønsket
+ og delvis fullført kommando.
+
+ Nå kan du gå videre til leksjon 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.1: SLETTEKOMMANDOER
+
+
+ ** Trykk dw for å slette et ord. **
+
+ 1. Trykk <ESC> for å være sikker på at du er i normalmodus.
+
+ 2. Flytt markøren til den første linjen nedenfor merket --->.
+
+ 3. Flytt markøren til begynnelsen av ordet som skal slettes.
+
+ 4. Trykk dw og ordet vil forsvinne.
+
+MERK: Bokstaven d vil komme til syne på den nederste linjen på skjermen når
+ du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet
+ tegn enn d har du skrevet noe feil; trykk <ESC> og start på nytt.
+
+---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen.
+---> Det er tre ord som ikke hører hjemme i denne setningen.
+
+ 5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå
+ deretter til leksjon 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.2: FLERE SLETTEKOMMANDOER
+
+
+ ** Trykk d$ for å slette til slutten av linjen. **
+
+ 1. Trykk <ESC> for å være sikker på at du er i normalmodus.
+
+ 2. Flytt markøren til linjen nedenfor merket --->.
+
+ 3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum).
+
+ 4. Trykk d$ for å slette alt til slutten av linjen.
+
+---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye.
+
+ 5. Gå til leksjon 2.3 for å forstå hva som skjer.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.3: OM OPERATORER OG BEVEGELSER
+
+
+ Mange kommandoer som forandrer teksten er laget ut i fra en operator og en
+ bevegelse. Formatet for en slettekommando med sletteoperatoren d er:
+
+ d bevegelse
+
+ Der:
+ d - er sletteoperatoren.
+ bevegelse - er hva operatoren vil opere på (listet nedenfor).
+
+ En kort liste med bevegelser:
+ w - til starten av det neste ordet, UNNTATT det første tegnet.
+ e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet.
+ $ - til slutten av linjen, INKLUDERT det siste tegnet.
+
+ Ved å skrive de vil altså alt fra markøren til slutten av ordet bli
+ slettet.
+
+MERK: Ved å skrive kun bevegelsen i normalmodusen uten en operator vil
+ markøren flyttes som spesifisert.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE
+
+
+ ** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. **
+
+ 1. Flytt markøren til starten av linjen markert ---> nedenfor.
+
+ 2. Skriv 2w for å flytte markøren to ord framover.
+
+ 3. Skriv 3e for å flytte markøren framover til slutten av det tredje
+ ordet.
+
+ 4. Skriv 0 (null) for å flytte til starten av linjen.
+
+ 5. Repeter steg 2 og 3 med forskjellige tall.
+
+---> Dette er en linje med noen ord som du kan bevege deg rundt på.
+
+ 6. Gå videre til leksjon 2.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER
+
+
+ ** Et tall sammen med en operator repeterer den så mange ganger. **
+
+ I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du
+ inn antall før bevegelsen for å slette mer:
+ d nummer bevegelse
+
+ 1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert
+ med --->.
+
+ 2. Skriv 2dw for å slette de to ordene med store bokstaver.
+
+ 3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende
+ ordene som har store bokstaver.
+
+---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar.
+
+MERK: Et antall mellom operatoren d og bevegelsen virker på samme måte som å
+ bruke bevegelsen uten en operator.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.6: OPERERE PÅ LINJER
+
+
+ ** Trykk dd for å slette en hel linje. **
+
+ På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at
+ det vil være lettere å rett og slett trykke to d-er for å slette en linje.
+
+ 1. Flytt markøren til den andre linjen i verset nedenfor.
+ 2. Trykk dd å slette linjen.
+ 3. Flytt deretter til den fjerde linjen.
+ 4. Trykk 2dd for å slette to linjer.
+
+---> 1) Roser er røde,
+---> 2) Gjørme er gøy,
+---> 3) Fioler er blå,
+---> 4) Jeg har en bil,
+---> 5) Klokker viser tiden,
+---> 6) Druer er søte
+---> 7) Og du er likeså.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 2.7: ANGRE-KOMMANDOEN
+
+
+ ** Trykk u for å angre siste kommando, U for å fikse en hel linje. **
+
+ 1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den
+ første feilen.
+ 2. Trykk x for å slette det første uønskede tegnet.
+ 3. Trykk så u for å angre den siste utførte kommandoen.
+ 4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen x .
+ 5. Trykk nå en stor U for å sette linjen tilbake til det den var
+ originalt.
+ 6. Trykk u noen ganger for å angre U og foregående kommandoer.
+ 7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen
+ ganger for å gjenopprette kommandoene (omgjøre angrekommandoene).
+
+---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre.
+
+ 8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av
+ leksjon 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 2
+
+
+ 1. For å slette fra markøren fram til det neste ordet, trykk: dw
+ 2. For å slette fra markøren til slutten av en linje, trykk: d$
+ 3. For å slette en hel linje, trykk: dd
+
+ 4. For å repetere en bevegelse, sett et nummer foran: 2w
+ 5. Formatet for en forandringskommando er:
+ operator [nummer] bevegelse
+ der:
+ operator - hva som skal gjøres, f.eks. d for å slette
+ [nummer] - et valgfritt antall for å repetere bevegelsen
+ bevegelse - hva kommandoen skal operere på, eksempelvis w (ord),
+ $ (til slutten av linjen) og så videre.
+
+ 6. For å gå til starten av en linje, bruk en null: 0
+
+ 7. For å angre tidligere endringer, skriv: u (liten u)
+ For å angre alle forandringer på en linje, skriv: U (stor U)
+ For å omgjøre angringen, trykk: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.1: «LIM INN»-KOMMANDOEN
+
+
+ ** Trykk p for å lime inn tidligere slettet tekst etter markøren **
+
+ 1. Flytt markøren til den første linjen med ---> nedenfor.
+
+ 2. Trykk dd for å slette linjen og lagre den i et Vim-register.
+
+ 3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn.
+
+ 4. Trykk p for å legge linjen under markøren.
+
+ 5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge.
+
+---> d) Kan du også lære?
+---> b) Fioler er blå,
+---> c) Intelligens må læres,
+---> a) Roser er røde,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.2: «ERSTATT»-KOMMANDOEN
+
+
+ ** Trykk rx for å erstatte tegnet under markøren med x. **
+
+ 1. Flytt markøren til den første linjen nedenfor merket --->.
+
+ 2. Flytt markøren så den står oppå den første feilen.
+
+ 3. Trykk r og deretter tegnet som skal være der.
+
+ 4. Repeter punkt 2 og 3 til den første linjen er lik den andre.
+
+---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster!
+---> Da denne linjen ble skrevet, var det noen som trykket feile taster!
+
+ 5. Gå videre til leksjon 3.2.
+
+MERK: Husk at du bør lære ved å BRUKE, ikke pugge.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.3: «FORANDRE»-OPERATOREN
+
+
+ ** For å forandre til slutten av et ord, trykk ce . **
+
+ 1. Flytt markøren til den første linjen nedenfor som er merket --->.
+
+ 2. Plasser markøren på u i «lubjwr».
+
+ 3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv «injen»).
+
+ 4. Trykk <ESC> og gå til det neste tegnet som skal forandres.
+
+ 5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre.
+
+---> Denne lubjwr har noen wgh som må forkwåp med «forækzryas»-kommandoen.
+---> Denne linjen har noen ord som må forandres med «forandre»-kommandoen.
+
+Vær oppmerksom på at ce sletter ordet og går inn i innsettingsmodus.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c
+
+
+ ** Forandringskommandoen blir brukt med de samme bevegelser som «slett». **
+
+ 1. Forandringsoperatoren fungerer på samme måte som «slett». Formatet er:
+
+ c [nummer] bevegelse
+
+ 2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en
+ linje).
+
+ 3. Gå til den første linjen nedenfor som er merket --->.
+
+ 4. Flytt markøren til den første feilen.
+
+ 5. Skriv c$ og skriv resten av linjen lik den andre og trykk <ESC>.
+
+---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste.
+---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen.
+
+MERK: Du kan bruke slettetasten for å rette feil mens du skriver.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 3
+
+
+ 1. For å legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette
+ limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet
+ vil den bli limt inn på linjen under markøren).
+
+ 2. For å erstatte et tegn under markøren, trykk r og deretter tegnet som
+ du vil ha der.
+
+ 3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen
+ tar deg. Det vil si, skriv ce for å forandre fra markøren til slutten
+ av ordet, c$ for å forandre til slutten av linjen.
+
+ 4. Formatet for «forandre» er:
+
+ c [nummer] bevegelse
+
+Nå kan du gå til neste leksjon.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS
+
+ ** Trykk CTRL-G for å vise posisjonen i filen og filstatusen.
+ Trykk G for å gå til en spesifikk linje i filen. **
+
+ Merk: Les hele leksjonen før du utfører noen av punktene!
+
+ 1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding
+ vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i
+ filen. Husk linjenummeret for bruk i steg 3.
+
+Merk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette
+ skjer når «ruler»-valget er satt (forklart i leksjon 6).
+
+ 2. Trykk G for å gå til bunnen av filen.
+ Skriv gg for å gå til begynnelsen av filen.
+
+ 3. Skriv inn linjenummeret du var på og deretter G . Dette vil føre deg
+ tilbake til linjen du var på da du først trykket CTRL-G.
+
+ 4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.2: SØKEKOMMANDOEN
+
+ ** Skriv / etterfulgt av en søkestreng som du vil lete etter. **
+
+ 1. Trykk / når du er i normalmodusen. Legg merke til at skråstreken og
+ markøren kommer til syne på bunnen av skjermen i likhet med
+ «:»-kommandoene.
+
+ 2. Skriv «feeeiil» og trykk <ENTER>. Dette er teksten du vil lete etter.
+
+ 3. For å finne neste forekomst av søkestrengen, trykk n .
+ For å lete etter samme søketeksten i motsatt retning, trykk N .
+
+ 4. For å lete etter en tekst bakover i filen, bruk ? istedenfor / .
+
+ 5. For å gå tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens
+ du trykker bokstaven o ). Repeter for å gå enda lengre tilbake. CTRL-I
+ går framover.
+
+---> «feeeiil» er ikke måten å skrive «feil» på, feeeiil er helt feil.
+Merk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt
+ hvis «wrapscan»-valget er resatt.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.3: FINN SAMSVARENDE PARENTESER
+
+
+ ** Trykk % for å finne en samsvarende ), ] eller } . **
+
+ 1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->.
+
+ 2. Trykk % .
+
+ 3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen.
+
+ 4. Trykk % for å flytte markøren til den andre samsvarende parentesen.
+
+ 5. Flytt markøren til en annen (, ), [, ], { eller } og se hva % gjør.
+
+---> Dette ( er en testlinje med (, [ ] og { } i den )).
+
+Merk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert
+ antall parenteser!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 4.4: ERSTATT-KOMMANDOEN
+
+
+ ** Skriv :s/gammel/ny/g for å erstatte «gammel» med «ny». **
+
+ 1. Flytt markøren til linjen nedenfor som er merket med --->.
+
+ 2. Skriv :s/deen/den/ <ENTER> . Legg merke til at denne kommandoen bare
+ forandrer den første forekomsten av «deen» på linjen.
+
+ 3. Skriv :s/deen/den/g . Når g-flagget legges til, betyr dette global
+ erstatning på linjen og erstatter alle forekomster av «deen» på linjen.
+
+---> deen som kan kaste deen tyngste steinen lengst er deen beste
+
+ 4. For å erstatte alle forekomster av en tekststreng mellom to linjer,
+ skriv :#,#s/gammel/ny/g der #,# er linjenumrene på de to linjene for
+ linjeområdet erstatningen skal gjøres.
+ Skriv :%s/gammel/ny/g for å erstatte tekst i hele filen.
+ Skriv :%s/gammel/ny/gc for å finne alle forekomster i hele filen, og
+ deretter spørre om teksten skal erstattes eller
+ ikke.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 4
+
+
+ 1. Ctrl-G viser nåværende posisjon i filen og filstatusen.
+ G går til slutten av filen.
+ nummer G går til det linjenummeret.
+ gg går til den første linjen.
+
+ 2. Skriv / etterfulgt av en søketekst for å lete FRAMOVER etter teksten.
+ Skriv ? etterfulgt av en søketekst for å lete BAKOVER etter teksten.
+ Etter et søk kan du trykke n for å finne neste forekomst i den samme
+ retningen eller N for å lete i motsatt retning.
+ CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.
+
+ 3. Skriv % når markøren står på en (, ), [, ], { eller } for å finne den
+ som samsvarer.
+
+ 4. Erstatte «gammel» med første «ny» på en linje: :s/gammel/ny
+ Erstatte alle «gammel» med «ny» på en linje: :s/gammel/ny/g
+ Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g
+ Erstatte alle forekomster i en fil: :%s/gammel/ny/g
+ For å godkjenne hver erstatning, legg til «c»: :%s/gammel/ny/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO
+
+
+ ** Skriv :! etterfulgt av en ekstern kommando for å utføre denne. **
+
+ 1. Skriv den velkjente kommandoen : for å plassere markøren på bunnen av
+ skjermen. Dette lar deg skrive en kommandolinjekommando.
+
+ 2. Nå kan du skrive tegnet ! . Dette lar deg utføre en hvilken som helst
+ ekstern kommando.
+
+ 3. Som et eksempel, skriv ls etter utropstegnet og trykk <ENTER>. Du vil
+ nå få en liste over filene i katalogen, akkurat som om du hadde kjørt
+ kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis
+ «ls» ikke virker.
+
+MERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med
+ parametere.
+
+MERK: Alle «:»-kommandoer må avsluttes med <ENTER>. Fra dette punktet er det
+ ikke alltid vi nevner det.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.2: MER OM LAGRING AV FILER
+
+
+ ** For å lagre endringene gjort i en tekst, skriv :w FILNAVN. **
+
+ 1. Skriv :!dir eller :!ls for å få en liste over filene i katalogen. Du
+ vet allerede at du må trykke <ENTER> etter dette.
+
+ 2. Velg et filnavn på en fil som ikke finnes, som for eksempel TEST .
+
+ 3. Skriv :w TEST (der TEST er filnavnet du velger).
+
+ 4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å
+ sjekke dette, skriv :!dir eller :!ls igjen for å se innholdet av
+ katalogen.
+
+Merk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med «vim TEST»,
+ ville filen vært en eksakt kopi av innføringen da du lagret den.
+
+ 5. Fjern filen ved å skrive :!rm TEST hvis du er på et Unix-lignende
+ operativsystem, eller :!del TEST hvis du bruker MS-DOS.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES
+
+
+ ** For å lagre en del av en fil, skriv v bevegelse :w FILNAVN **
+
+ 1. Flytt markøren til denne linjen.
+
+ 2. Trykk v og flytt markøren til det femte elementet nedenfor. Legg merke
+ til at teksten blir markert.
+
+ 3. Trykk : (kolon). På bunnen av skjermen vil :'<,'> komme til syne.
+
+ 4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller
+ at du ser :'<,'>w TEST før du trykker Enter.
+
+ 5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls
+ for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.
+
+MERK: Ved å trykke v startes visuelt valg. Du kan flytte markøren rundt for
+ å gjøre det valgte området større eller mindre. Deretter kan du bruke en
+ operator for å gjøre noe med teksten. For eksempel sletter d teksten.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 5.4: HENTING OG SAMMENSLÅING AV FILER
+
+
+ ** For å lese inn en annen fil inn i nåværende buffer, skriv :r FILNAVN **
+
+ 1. Plasser markøren like over denne linjen.
+
+MERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter
+ NED for å se denne leksjonen igjen.
+
+ 2. Hent TEST-filen ved å bruke kommandoen :r TEST der TEST er navnet på
+ filen du brukte. Filen du henter blir plassert nedenfor markørlinjen.
+
+ 3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av
+ leksjon 5.3, originalen og denne versjonen.
+
+MERK: Du kan også lese utdataene av en ekstern kommando. For eksempel, :r !ls
+ leser utdataene av ls-kommandoen og legger dem nedenfor markøren.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 5
+
+
+ 1. :!kommando utfører en ekstern kommandio.
+
+ Noen nyttige eksempler er:
+ (MS-DOS) (Unix)
+ :!dir :!ls - List filene i katalogen.
+ :!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN.
+
+ 2. :w FILNAVN skriver den nåværende Vim-filen disken med navnet FILNAVN .
+
+ 3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen
+ FILNAVN.
+
+ 4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markøren.
+
+ 5. :r !dir leser utdataene fra «dir»-kommandoen og legger dem nedenfor
+ markørposisjonen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.1: «ÅPNE LINJE»-KOMMANDOEN
+
+
+ ** Skriv o for å «åpne opp» for en ny linje etter markøren og gå til
+ innsettingsmodus **
+
+ 1. Flytt markøren til linjen nedenfor merket --->.
+
+ 2. Skriv o (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i
+ innsettingsmodus.
+
+ 3. Skriv litt tekst og trykk <ESC> for å gå ut av innsettingsmodusen.
+
+---> Etter at o er skrevet blir markøren plassert på den tomme linjen.
+
+ 4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor O
+ istedenfor en liten o . Prøv dette på linjen nedenfor.
+
+---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.2: «LEGG TIL»-KOMMANDOEN
+
+
+ ** Skriv a for å legge til tekst ETTER markøren. **
+
+ 1. Flytt markøren til starten av linjen merket ---> nedenfor.
+
+ 2. Trykk e til markøren er på slutten av «li».
+
+ 3. Trykk a (liten a) for å legge til tekst ETTER markøren.
+
+ 4. Fullfør ordet sånn som på linjen nedenfor. Trykk <ESC> for å gå ut av
+ innsettingsmodusen.
+
+ 5. Bruk e for å gå til det neste ufullstendige ordet og repeter steg 3 og
+ 4.
+
+---> Denne li lar deg øve på å leg til tek på en linje.
+---> Denne linjen lar deg øve på å legge til tekst på en linje.
+
+Merk: a, i og A går alle til den samme innsettingsmodusen, den eneste
+ forskjellen er hvor tegnene blir satt inn.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ
+
+
+ ** Skriv en stor R for å erstatte mer enn ett tegn. **
+
+ 1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren
+ til begynnelsen av den første «xxx»-en.
+
+ 2. Trykk R og skriv inn tallet som står nedenfor på den andre linjen så
+ det erstatter xxx.
+
+ 3. Trykk <ESC> for å gå ut av erstatningsmodusen. Legg merke til at resten
+ av linjen forblir uforandret.
+
+ 4. Repeter stegene for å erstatte den gjenværende xxx.
+
+---> Ved å legge 123 til xxx får vi xxx.
+---> Ved å legge 123 til 456 får vi 579.
+
+MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives
+ erstatter et eksisterende tegn.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.4: KOPIERE OG LIME INN TEKST
+
+
+ ** Bruk y-operatoren for å kopiere tekst og p for å lime den inn **
+
+ 1. Gå til linjen merket ---> nedenfor og plasser markøren etter «a)».
+
+ 2. Gå inn i visuell modus med v og flytt markøren til like før «første».
+
+ 3. Trykk y for å kopiere (engelsk: «yank») den uthevede teksten.
+
+ 4. Flytt markøren til slutten av den neste linjen: j$
+
+ 5. Trykk p for å lime inn teksten. Trykk deretter: a andre <ESC> .
+
+ 6. Bruk visuell modus for å velge « valget.», kopier det med y , gå til
+ slutten av den neste linjen med j$ og legg inn teksten der med p .
+
+---> a) Dette er det første valget.
+ b)
+
+Merk: Du kan også bruke y som en operator; yw kopierer ett ord.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 6.5: SETT VALG
+
+
+ ** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. **
+
+ 1. Let etter «ignore» ved å skrive: /ignore <ENTER>
+ Repeter flere ganger ved å trykke n .
+
+ 2. Sett «ic»-valget (Ignore Case) ved å skrive: :set ic
+
+ 3. Søk etter «ignore» igjen ved å trykke n .
+ Legg merke til at både «Ignore» og «IGNORE» blir funnet.
+
+ 4. Sett «hlsearch»- og «incsearch»-valgene: :set hls is
+
+ 5. Skriv søkekommandoen igjen og se hva som skjer: /ignore <ENTER>
+
+ 6. For å slå av ignorering av store/små bokstaver, skriv: :set noic
+
+Merk: For å fjerne uthevingen av treff, skriv: :nohlsearch
+Merk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk
+ \c i uttrykket: /ignore\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 6
+
+ 1. Trykk o for å legge til en linje NEDENFOR markøren og gå inn i
+ innsettingsmodus.
+ Trykk O for å åpne en linje OVER markøren.
+
+ 2. Skriv a for å sette inn tekst ETTER markøren.
+ Skriv A for å sette inn tekst etter slutten av linjen.
+
+ 3. Kommandoen e går til slutten av et ord.
+
+ 4. Operatoren y («yank») kopierer tekst, p («paste») limer den inn.
+
+ 5. Ved å trykke R går du inn i erstatningsmodus helt til <ESC> trykkes.
+
+ 6. Skriv «:set xxx» for å sette valget «xxx». Noen valg er:
+ «ic» «ignorecase» ignorer store/små bokstaver under søk
+ «is» «incsearch» vis delvise treff for en søketekst
+ «hls» «hlsearch» uthev alle søketreff
+
+ 7. Legg til «no» foran valget for å slå det av: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.1: FÅ HJELP
+
+
+ ** Bruk det innebygde hjelpesystemet. **
+
+ Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av
+ disse måtene:
+ - Trykk Hjelp-tasten (hvis du har en)
+ - Trykk F1-tasten (hvis du har en)
+ - Skriv :help <ENTER>
+
+ Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker.
+ Skriv CTRL-W CTRL-W for å hoppe fra et vindu til et annet
+ Skriv :q <ENTER> for å lukke hjelpevinduet.
+
+ Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til
+ «:help»-kommandoen. Prøv disse (ikke glem å trykke <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.2: LAG ET OPPSTARTSSKRIPT
+
+
+ ** Slå på funksjoner i Vim **
+
+ Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av
+ som standard. For å begynne å bruke flere funksjoner må du lage en
+ «vimrc»-fil.
+
+ 1. Start redigeringen av «vimrc»-filen. Dette avhenger av systemet ditt:
+ :e ~/.vimrc for Unix
+ :e ~/_vimrc for MS Windows
+
+ 2. Les inn eksempelfilen for «vimrc»:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Lagre filen med:
+ :w
+
+ Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til
+ alle dine foretrukne oppsett i denne «vimrc»-filen.
+ For mer informasjon, skriv :help vimrc-intro
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Leksjon 7.3: FULLFØRING
+
+
+ ** Kommandolinjefullføring med CTRL-D og <TAB> **
+
+ 1. Vær sikker på at Vim ikke er i Vi-kompatibel modus: :set nocp
+
+ 2. Se hvilke filer som er i katalogen: :!ls eller :!dir
+
+ 3. Skriv starten på en kommando: :e
+
+ 4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med
+ «e».
+
+ 5. Trykk <TAB> og Vim vil fullføre kommandonavnet til «:edit».
+
+ 6. Legg til et mellomrom og starten på et eksisterende filnavn: :edit FIL
+
+ 7. Trykk <TAB>. Vim vil fullføre navnet (hvis det er unikt).
+
+MERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og
+ <TAB>. Det er spesielt nyttig for bruk sammen med :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ OPPSUMMERING AV LEKSJON 7
+
+
+ 1. Skriv :help eller trykk <F1> eller <Help> for å åpne et hjelpevindu.
+
+ 2. Skriv :help kommando for å få hjelp om kommando .
+
+ 3. Trykk CTRL-W CTRL-W for å hoppe til et annet vindu.
+
+ 4. Trykk :q for å lukke hjelpevinduet.
+
+ 5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine.
+
+ 6. Når du skriver en «:»-kommando, trykk CTRL-D for å se mulige
+ fullføringer. Trykk <TAB> for å bruke en fullføring.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Her slutter innføringen i Vim. Den var ment som en rask oversikt over
+ editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på
+ langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen
+ ved å skrive :help user-manual .
+
+ For videre lesing og studier, kan denne boken anbefales:
+ «Vim - Vi Improved» av Steve Oualline
+ Utgiver: New Riders
+ Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for
+ nybegynnere. Inneholder mange eksempler og illustrasjoner.
+ Se https://iccf-holland.org/click5.html
+
+ Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også:
+ «Learning the Vi Editor» av Linda Lamb
+ Utgiver: O'Reilly & Associates Inc.
+ Det er en god bok for å få vite omtrent hva som helst om Vi.
+ Den sjette utgaven inneholder også informasjon om Vim.
+
+ Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware,
+ Colorado School of Mines med idéer av Charles Smith, Colorado State
+ University. E-mail: bware@mines.colorado.edu .
+
+ Modifisert for Vim av Bram Moolenaar.
+ Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org
+ Id: tutor.no 406 2007-03-18 22:48:36Z sunny
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+vim: set ts=8 :
diff --git a/runtime/tutor/tutor.pl b/runtime/tutor/tutor.pl
new file mode 100644
index 0000000..e683431
--- /dev/null
+++ b/runtime/tutor/tutor.pl
@@ -0,0 +1,995 @@
+===============================================================================
+= W i t a j w t u t o r i a l u V I M - a - Wersja 1.7. =
+===============================================================================
+
+ Vim to potny edytor, ktry posiada wiele polece, zbyt duo, by
+ wyjani je wszystkie w tym tutorialu. Ten przewodnik ma nauczy
+ Ci posugiwa si wystarczajco wieloma komendami, by mg atwo
+ uywa Vima jako edytora oglnego przeznaczenia.
+
+ Czas potrzebny na ukoczenie tutoriala to 25 do 30 minut i zaley
+ od tego jak wiele czasu spdzisz na eksperymentowaniu.
+
+ UWAGA:
+ Polecenia wykonywane w czasie lekcji zmodyfikuj tekst. Zrb
+ wczeniej kopi tego pliku do wicze (jeli zacze komend
+ "vimtutor", to ju pracujesz na kopii).
+
+ Pamitaj, e przewodnik ten zosta zaprojektowany do nauki poprzez
+ wiczenia. Oznacza to, e musisz wykonywa polecenia, by nauczy si ich
+ prawidowo. Jeli bdziesz jedynie czyta tekst, szybko zapomnisz wiele
+ polece!
+
+ Teraz upewnij si, e nie masz wcinitego Caps Locka i wciskaj j
+ tak dugo dopki Lekcja 1.1. nie wypeni cakowicie ekranu.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.1.: PORUSZANIE SI KURSOREM
+
+ ** By wykona ruch kursorem, wcinij h, j, k, l jak pokazano. **
+
+ ^
+ k Wskazwka: h jest po lewej
+ < h l > l jest po prawej
+ j j wyglda jak strzaka w d
+ v
+ 1. Poruszaj kursorem dopki nie bdziesz pewien, e pamitasz polecenia.
+
+ 2. Trzymaj j tak dugo a bdzie si powtarza.
+ Teraz wiesz jak doj do nastpnej lekcji.
+
+ 3. Uywajc strzaki w d przejd do nastpnej lekcji.
+
+Uwaga: Jeli nie jeste pewien czego co wpisae, wcinij <ESC>, by wrci do
+ trybu Normal. Wtedy powtrz polecenie.
+
+Uwaga: Klawisze kursora take powinny dziaa, ale uywajc hjkl bdziesz
+ w stanie porusza si o wiele szybciej, jak si tylko przyzwyczaisz.
+ Naprawd!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.2.: WYCHODZENIE Z VIM-a
+
+ !! UWAGA: Przed wykonaniem jakiegokolwiek polecenia przeczytaj ca lekcj !!
+
+ 1. Wcinij <ESC> (aby upewni si, e jeste w trybie Normal).
+ 2. Wpisz: :q!<ENTER>.
+ To spowoduje wyjcie z edytora PORZUCAJC wszelkie zmiany, jakie
+ zdye zrobi. Jeli chcesz zapamita zmiany i wyj,
+ wpisz: :wq<ENTER>
+
+ 3. Kiedy widzisz znak zachty powoki wpisz komend, eby wrci
+ do tutoriala. Czyli: vimtutor<ENTER>
+
+ 4. Jeli chcesz zapamita polecenia, wykonaj kroki 1. do 3., aby
+ wyj i wrci do edytora.
+
+UWAGA: :q!<ENTER> porzuca wszelkie zmiany jakie zrobie. W nastpnych
+ lekcjach dowiesz si jak je zapamitywa.
+
+ 5. Przenie kursor do lekcji 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.3.: EDYCJA TEKSTU - KASOWANIE
+
+ ** Wcinij x aby usun znak pod kursorem. **
+
+ 1. Przenie kursor do linii poniej oznaczonej --->.
+
+ 2. By poprawi bdy, naprowad kursor na znak do usunicia.
+
+ 3. Wcinij x aby usun niechciany znak.
+
+ 4. Powtarzaj kroki 2. do 4. dopki zdanie nie jest poprawne.
+
+---> Kkrowa prrzeskoczya prrzez ksiiycc.
+
+ 5. Teraz, kiedy zdanie jest poprawione, przejd do Lekcji 1.4.
+
+UWAGA: Ucz si przez wiczenie, nie wkuwanie.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.4.: EDYCJA TEKSTU - INSERT (wprowadzanie)
+
+
+ ** Wcinij i aby wstawi tekst. **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->.
+
+ 2. Aby poprawi pierwszy wiersz, ustaw kursor na pierwszym znaku PO tym,
+ gdzie tekst ma by wstawiony.
+
+ 3. Wcinij i a nastpnie wpisz konieczne poprawki.
+
+ 4. Po poprawieniu bdu wcinij <ESC>, by wrci do trybu Normal.
+ Powtarzaj kroki 2. do 4., aby poprawi cae zdanie.
+
+---> W tej brkje troch .
+---> W tej linii brakuje troch tekstu.
+
+ 5. Kiedy czujesz si swobodnie wstawiajc tekst, przejd do
+ podsumowania poniej.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.5.: EDYCJA TEKSTU - APPENDING (dodawanie)
+
+
+ ** Wcinij A by doda tekst. **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->.
+ Nie ma znaczenia, ktry to bdzie znak.
+
+ 2. Wcinij A i wpisz odpowiednie dodatki.
+
+ 3. Kiedy tekst zosta dodany, wcinij <ESC> i wr do trybu Normalnego.
+
+ 4. Przenie kursor do drugiej linii oznaczonej ---> i powtrz kroki 2. i 3.,
+ aby poprawi zdanie.
+
+---> Brakuje tu tro
+ Brakuje tu troch tekstu.
+---> Tu te troch bra
+ Tu te troch brakuje.
+
+ 5. Kiedy ju utrwalie wiczenie, przejd do lekcji 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.6.: EDYCJA PLIKU
+
+ ** Uyj :wq aby zapisa plik i wyj. **
+
+ !! UWAGA: zanim wykonasz jakiekolwiek polecenia przeczytaj ca lekcj !!
+
+ 1. Zakocz tutorial tak jak w lekcji 1.2.: :q!
+ lub, jeli masz dostp do innego terminala, wykonaj kolejne kroki tam.
+
+ 2. W powoce wydaj polecenie: vim tutor<ENTER>
+ "vim" jest poleceniem uruchamiajcym edytor Vim. 'tutor' to nazwa pliku,
+ jaki chcesz edytowa. Uyj pliku, ktry moe zosta zmieniony.
+
+ 3. Dodaj i usu tekst tak, jak si nauczye w poprzednich lekcjach.
+
+ 4. Zapisz plik ze zmianami i opu Vima: :wq<ENTER>
+
+ 5. Jeli zakoczye vimtutor w kroku 1., uruchom go ponownie i przejd
+ do podsumowania poniej.
+
+ 6. Po przeczytaniu wszystkich krokw i ich zrozumieniu: wykonaj je.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 1. PODSUMOWANIE
+
+ 1. Poruszasz kursorem uywajc "strzaek" i klawiszy hjkl .
+ h (w lewo) j (w d) k (do gry) l (w prawo)
+
+ 2. By wej do Vima, (z powoki) wpisz:
+ vim NAZWA_PLIKU<ENTER>
+
+ 3. By wyj z Vima, wpisz:
+ <ESC> :q!<ENTER> by usun wszystkie zmiany.
+ LUB: <ESC> :wq<ENTER> by zmiany zachowa.
+
+ 4. By usun znak pod kursorem, wcinij: x
+
+ 5. By wstawi tekst przed kursorem lub doda:
+ i wpisz tekst <ESC> wstawi przed kursorem
+ A wpisz tekst <ESC> doda na kocu linii
+
+UWAGA: Wcinicie <ESC> przeniesie Ci z powrotem do trybu Normal
+ lub odwoa niechciane lub czciowo wprowadzone polecenia.
+
+Teraz moemy kontynuowa i przej do Lekcji 2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.1.: POLECENIE DELETE (usuwanie)
+
+
+ ** Wpisz dw by usun wyraz. **
+
+ 1. Wcinij <ESC>, by upewni si, e jeste w trybie Normal.
+
+ 2. Przenie kursor do linii poniej oznaczonej --->.
+
+ 3. Przesu kursor na pocztek wyrazu, ktry chcesz usun.
+
+ 4. Wpisz dw by usun wyraz.
+
+ UWAGA: Litera d pojawi si na dole ekranu. Vim czeka na wpisanie w .
+ Jeli zobaczysz inny znak, oznacza to, e wpisae co le; wcinij
+ <ESC> i zacznij od pocztku.
+
+---> Jest tu par papier wyrazw, ktre kamie nie nale do noyce tego zdania.
+
+ 5. Powtarzaj kroki 3. i 4. dopki zdanie nie bdzie poprawne, potem
+ przejd do Lekcji 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.2.: WICEJ POLECE USUWAJCYCH
+
+
+ ** Wpisz d$ aby usun tekst do koca linii. **
+
+ 1. Wcinij <ESC> aby si upewni, e jeste w trybie Normal.
+
+ 2. Przenie kursor do linii poniej oznaczonej --->.
+
+ 3. Przenie kursor do koca poprawnego zdania (PO pierwszej . ).
+
+ 4. Wpisz d$ aby usun reszt linii.
+
+---> Kto wpisa koniec tego zdania dwukrotnie. zdania dwukrotnie.
+
+
+ 5. Przejd do Lekcji 2.3., by zrozumie co si stao.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.3.: O OPERATORACH I RUCHACH
+
+
+ Wiele polece zmieniajcych tekst jest zoonych z operatora i ruchu.
+ Format dla polecenia usuwajcego z operatorem d jest nastpujcy:
+
+ d ruch
+
+ gdzie:
+ d - operator usuwania.
+ ruch - na czym polecenie bdzie wykonywane (lista poniej).
+
+ Krtka lista ruchw:
+ w - do pocztku nastpnego wyrazu WYCZAJC pierwszy znak.
+ e - do koca biecego wyrazu, WCZAJC ostatni znak.
+ $ - do koca linii, WCZAJC ostatni znak.
+
+W ten sposb wpisanie de usunie znaki od kursora do koca wyrazu.
+
+UWAGA: Wpisanie tylko ruchu w trybie Normal bez operatora przeniesie kursor
+ tak, jak to okrelono.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.4.: UYCIE MNONIKA DLA RUCHU
+
+
+ ** Wpisanie liczby przed ruchem powtarza ruch odpowiedni ilo razy. **
+
+ 1. Przenie kursor na pocztek linii poniej zaznaczonej --->.
+
+ 2. Wpisz 2w aby przenie kursor o dwa wyrazy do przodu.
+
+ 3. Wpisz 3e aby przenie kursor do koca trzeciego wyrazu w przd.
+
+ 4. Wpisz 0 (zero), aby przenie kursor na pocztek linii.
+
+ 5. Powtrz kroki 2. i 3. z innymi liczbami.
+
+
+ ---> To jest zwyky wiersz z wyrazami, po ktrych moesz si porusza.
+
+ 6. Przejd do lekcji 2.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.5.: UYCIE MNONIKA, BY WICEJ USUN
+
+
+ ** Wpisanie liczby z operatorem powtarza go odpowiedni ilo razy. **
+
+ W wyej wspomnianej kombinacji operatora usuwania i ruchu podaj mnonik
+ przed ruchem, by wicej usun:
+ d liczba ruch
+
+ 1. Przenie kursor do pierwszego wyrazu KAPITALIKAMI w linii zaznaczonej --->.
+
+ 2. Wpisz 2dw aby usun dwa wyrazy KAPITALIKAMI.
+
+ 3. Powtarzaj kroki 1. i 2. z innymi mnonikami, aby usun kolejne wyrazy
+ KAPITALIKAMI jednym poleceniem
+
+---> ta ASD WE linia QWE ASDF ZXCV FG wyrazw zostaa ERT FGH CF oczyszczona.
+
+UWAGA: Mnonik pomidzy operatorem d i ruchem dziaa podobnie do ruchu bez
+ operatora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.6.: OPEROWANIE NA LINIACH
+
+
+ ** Wpisz dd aby usun ca lini. **
+
+ Z powodu czstoci usuwania caych linii, projektanci Vi zdecydowali, e
+ bdzie atwiej wpisa dwa razy d aby usun lini.
+
+ 1. Przenie kursor do drugiego zdania z wierszyka poniej.
+ 2. Wpisz dd aby usun wiersz.
+ 3. Teraz przenie si do czwartego wiersza.
+ 4. Wpisz 2dd aby usun dwa wiersze.
+
+---> 1) Re s czerwone,
+---> 2) Boto jest fajne,
+---> 3) Fioki s niebieskie,
+---> 4) Mam samochd,
+---> 5) Zegar podaje czas,
+---> 6) Cukier jest sodki,
+---> 7) I ty te.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.7.: POLECENIE UNDO (cofnij)
+
+
+ ** Wcinij u aby cofn skutki ostatniego polecenia.
+ U za, by cofn skutki dla caej linii. **
+
+ 1. Przenie kursor do zdania poniej oznaczonego ---> i umie go na
+ pierwszym bdzie.
+ 2. Wpisz x aby usun pierwszy niechciany znak.
+ 3. Teraz wcinij u aby cofn skutki ostatniego polecenia.
+ 4. Tym razem popraw wszystkie bdy w linii uywajc polecenia x .
+ 5. Teraz wcinij wielkie U aby przywrci lini do oryginalnego stanu.
+ 6. Teraz wcinij u kilka razy, by cofn U i poprzednie polecenia.
+ 7. Teraz wpisz CTRL-R (trzymaj rwnoczenie wcinite klawisze CTRL i R)
+ kilka razy, by cofn cofnicia.
+
+---> Poopraw bdyyy w teej liniii i zaamiie je prrzez coofnij.
+
+ 8. To s bardzo poyteczne polecenia.
+
+ Przejd teraz do podsumowania Lekcji 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 2. PODSUMOWANIE
+
+
+ 1. By usun znaki od kursora do nastpnego wyrazu, wpisz: dw
+ 2. By usun znaki od kursora do koca linii, wpisz: d$
+ 3. By usun ca lini: dd
+ 4. By powtrzy ruch, poprzed go liczb: 2w
+ 5. Format polecenia zmiany to:
+ operator [liczba] ruch
+ gdzie:
+ operator - to, co trzeba zrobi (np. d dla usuwania)
+ [liczba] - opcjonalne, ile razy powtrzy ruch
+ ruch - przenosi nad tekstem do operowania, takim jak w (wyraz),
+ $ (do koca linii) etc.
+
+ 6. By przej do pocztku linii, uyj zera: 0
+ 7. By cofn poprzednie polecenie, wpisz: u (mae u)
+ By cofn wszystkie zmiany w linii, wpisz: U (wielkie U)
+ By cofn cofnicie, wpisz: CTRL-R
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.1.: POLECENIE PUT (wstaw)
+
+
+ ** Wpisz p by wstawi ostatnie usunicia za kursorem. **
+
+ 1. Przenie kursor do pierwszej linii ---> poniej.
+
+ 2. Wpisz dd aby usun lini i przechowa j w rejestrze Vima.
+
+ 3. Przenie kursor do linii c), POWYEJ tej, gdzie usunita linia powinna
+ si znajdowa.
+
+ 4. Wcinij p by wstawi lini poniej kursora.
+
+ 5. Powtarzaj kroki 2. do 4. a znajd si w odpowiednim porzdku.
+
+---> d) Jak dwa anioki.
+---> b) Na dole fioki,
+---> c) A my si kochamy,
+---> a) Na grze re,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.2.: POLECENIE REPLACE (zastp)
+
+
+ ** Wpisz rx aby zastpi znak pod kursorem na x . **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->
+
+ 2. Ustaw kursor na pierwszym bdzie.
+
+ 3. Wpisz r a potem znak jaki powinien go zastpi.
+
+ 4. Powtarzaj kroki 2. i 3. dopki pierwsza linia nie bdzie taka, jak druga.
+
+---> Kjedy ten wiersz bi wstkiwany, kto wcizn per zych klawirzy!
+---> Kiedy ten wiersz by wstukiwany, kto wcisn par zych klawiszy!
+
+ 5. Teraz czas na Lekcj 3.3.
+
+
+UWAGA: Pamitaj, by uczy si wiczc, a nie pamiciowo.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.3.: OPERATOR CHANGE (zmie)
+
+ ** By zmieni do koca wyrazu, wpisz ce . **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->.
+
+ 2. Umie kursor na u w lunos.
+
+ 3. Wpisz ce i popraw wyraz (w tym wypadku wstaw inia ).
+
+ 4. Wcinij <ESC> i przejd do nastpnej planowanej zmiany.
+
+ 5. Powtarzaj kroki 3. i 4. dopki pierwsze zdanie nie bdzie takie same,
+ jak drugie.
+
+---> Ta lunos ma pire sw, ktre tina zbnic uifajonc pcmazu zmie.
+---> Ta linia ma par sw, ktre trzeba zmieni uywajc polecenia zmie.
+
+ Zauwa, e ce nie tylko zamienia wyraz, ale take zmienia tryb na
+ Insert (wprowadzanie).
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.4.: WICEJ ZMIAN UYWAJC c
+
+
+ ** Polecenie change uywa takich samych ruchw, jak delete. **
+
+ 1. Operator change dziaa tak samo, jak delete. Format wyglda tak:
+
+ c [liczba] ruch
+
+ 2. Ruchy s take takie same, np.: w (wyraz), $ (koniec linii) etc.
+
+ 3. Przenie si do pierwszej linii poniej oznaczonej --->
+
+ 4. Ustaw kursor na pierwszym bdzie.
+
+ 5. Wpisz c$ , popraw koniec wiersza i wcinij <ESC>.
+
+---> Koniec tego wiersza musi by poprawiony, aby wyglda tak, jak drugi.
+---> Koniec tego wiersza musi by poprawiony uywajc polecenia c$ .
+
+UWAGA: Moesz uywa <BS> aby poprawia bdy w czasie pisania.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 3. PODSUMOWANIE
+
+
+ 1. Aby wstawi tekst, ktry zosta wczeniej usunity wcinij p . To
+ polecenie wstawia skasowany tekst PO kursorze (jeli caa linia
+ zostaa usunita, zostanie ona umieszczona w linii poniej kursora).
+
+ 2. By zamieni znak pod kursorem, wcinij r a potem znak, ktry ma zastpi
+ oryginalny.
+
+ 3. Operator change pozwala Ci na zastpienie od kursora do miejsca, gdzie
+ zabraby Ci ruch. Np. wpisz ce aby zamieni tekst od kursora do koca
+ wyrazu, c$ aby zmieni tekst do koca linii.
+
+ 4. Format do polecenia change (zmie):
+
+ c [liczba] obiekt
+
+ Teraz przejd do nastpnej lekcji.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.1.: POOENIE KURSORA ORAZ STATUS PLIKU
+
+ ** Nacinij CTRL-G aby zobaczy swoje pooenie w pliku i status
+ pliku. Nacinij G aby przej do linii w pliku. **
+
+ UWAGA: Przeczytaj ca lekcj zanim wykonasz jakie polecenia!!!
+
+ 1. Przytrzymaj klawisz CTRL i wcinij g . Uywamy notacji CTRL-G.
+ Na dole strony pojawi si pasek statusu z nazw pliku i pozycj w pliku.
+ Zapamitaj numer linii dla potrzeb kroku 3.
+
+UWAGA: Moesz te zobaczy pozycj kursora w prawym, dolnym rogu ekranu.
+ Dzieje si tak kiedy ustawiona jest opcja 'ruler' (wicej w lekcji 6.).
+
+ 2. Wcinij G aby przej na koniec pliku.
+ Wcinij gg aby przej do pocztku pliku.
+
+ 3. Wpisz numer linii, w ktrej bye a potem G . To przeniesie Ci
+ z powrotem do linii, w ktrej bye kiedy wcisne CTRL-G.
+
+ 4. Jeli czujesz si wystarczajco pewnie, wykonaj kroki 1-3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.2.: POLECENIE SZUKAJ
+
+
+ ** Wpisz / a nastpnie wyraenie, aby je znale. **
+
+ 1. W trybie Normal wpisz / . Zauwa, e znak ten oraz kursor pojawi
+ si na dole ekranu tak samo, jak polecenie : .
+
+ 2. Teraz wpisz bond<ENTER> . To jest sowo, ktrego chcesz szuka.
+
+ 3. By szuka tej samej frazy ponownie, po prostu wcinij n .
+ Aby szuka tej frazy w przeciwnym, kierunku wcinij N .
+
+ 4. Jeli chcesz szuka frazy do tyu, uyj polecenia ? zamiast / .
+
+ 5. Aby wrci gdzie bye, wcinij CTRL-O. Powtarzaj, by wrci dalej. CTRL-I
+ idzie do przodu.
+
+Uwaga: 'bond' to nie jest metoda, by przeliterowa bd; 'bond' to bd.
+Uwaga: Kiedy szukanie osignie koniec pliku, bdzie kontynuowane od pocztku
+ o ile opcja 'wrapscan' nie zostaa przestawiona.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.3.: W POSZUKIWANIU PARUJCYCH NAWIASW
+
+
+ ** Wpisz % by znale parujcy ), ], lub } . **
+
+ 1. Umie kursor na ktrym z (, [, lub { w linii poniej oznaczonej --->.
+
+ 2. Teraz wpisz znak % .
+
+ 3. Kursor powinien si znale na parujcym nawiasie.
+
+ 4. Wcinij % aby przenie kursor z powrotem do parujcego nawiasu.
+
+ 5. Przenie kursor do innego (,),[,],{ lub } i zobacz co robi % .
+
+---> To ( jest linia testowa z (, [, ] i {, } . ))
+
+Uwaga: Ta funkcja jest bardzo uyteczna w debuggowaniu programu
+ z niesparowanymi nawiasami!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.4.: POLECENIE SUBSTITUTE (zamiana)
+
+
+ ** Wpisz :s/stary/nowy/g aby zamieni 'stary' na 'nowy'. **
+
+ 1. Przenie kursor do linii poniej oznaczonej --->.
+
+ 2. Wpisz :s/czaas/czas<ENTER> . Zauwa, e to polecenie zmienia
+ tylko pierwsze wystpienie 'czaas' w linii.
+
+ 3. Teraz wpisz :s/czaas/czas/g . Dodane g oznacza zamian (substytucj)
+ globalnie w caej linii. Zmienia wszystkie wystpienia 'czaas' w linii.
+
+---> Najlepszy czaas na zobaczenie najadniejszych kwiatw to czaas wiosny.
+
+ 4. Aby zmieni wszystkie wystpienia acucha znakw pomidzy dwoma liniami,
+ wpisz: :#,#s/stare/nowe/g gdzie #,# s numerami linii ograniczajcych
+ region, gdzie ma nastpi zamiana.
+ wpisz :%s/stare/nowe/g by zmieni wszystkie wystpienia w caym pliku.
+ wpisz :%s/stare/nowe/gc by zmieni wszystkie wystpienia w caym
+ pliku, proszc o potwierdzenie za kadym razem.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 4. PODSUMOWANIE
+
+ 1. CTRL-G pokae Twoj pozycj w pliku i status pliku. SHIFT-G przenosi
+ Ci do koca pliku.
+ G przenosi do koca pliku.
+ liczba G przenosi do linii [liczba].
+ gg przenosi do pierwszej linii.
+
+ 2. Wpisanie / a nastpnie acucha znakw szuka acucha DO PRZODU.
+ Wpisanie ? a nastpnie acucha znakw szuka acucha DO TYU.
+ Po wyszukiwaniu wcinij n by znale nastpne wystpienie szukanej
+ frazy w tym samym kierunku lub N by szuka w kierunku przeciwnym.
+ CTRL-O przenosi do starszych pozycji, CTRL-I do nowszych.
+
+ 3. Wpisanie % gdy kursor znajduje si na (,),[,],{, lub } lokalizuje
+ parujcy znak.
+
+ 4. By zamieni pierwszy stary na nowy w linii, wpisz :s/stary/nowy
+ By zamieni wszystkie stary na nowy w linii, wpisz :s/stary/nowy/g
+ By zamieni frazy pomidzy dwoma liniami # wpisz :#,#s/stary/nowy/g
+ By zamieni wszystkie wystpienia w pliku, wpisz :%s/stary/nowy/g
+ By Vim prosi Ci o potwierdzenie, dodaj 'c' :%s/stary/nowy/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.1.: JAK WYKONA POLECENIA ZEWNTRZNE?
+
+
+ ** Wpisz :! a nastpnie zewntrzne polecenie, by je wykona. **
+
+ 1. Wpisz znajome polecenie : by ustawi kursor na dole ekranu. To pozwala
+ na wprowadzenie komendy linii polece.
+
+ 2. Teraz wstaw ! (wykrzyknik). To umoliwi Ci wykonanie dowolnego
+ zewntrznego polecenia powoki.
+
+ 3. Jako przykad wpisz ls za ! a nastpnie wcinij <ENTER>. To polecenie
+ pokae spis plikw w Twoim katalogu, tak jakby by przy znaku zachty
+ powoki. Moesz te uy :!dir jeli ls nie dziaa.
+
+Uwaga: W ten sposb mona wykona wszystkie polecenia powoki.
+Uwaga: Wszystkie polecenia : musz by zakoczone <ENTER>.
+ Od tego momentu nie zawsze bdziemy o tym wspomina.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.2.: WICEJ O ZAPISYWANIU PLIKW
+
+
+ ** By zachowa zmiany w tekcie, wpisz :w NAZWA_PLIKU . **
+
+ 1. Wpisz :!dir lub :!ls by zobaczy spis plikw w katalogu.
+ Ju wiesz, e musisz po tym wcisn <ENTER>.
+
+ 2. Wybierz nazw pliku, jaka jeszcze nie istnieje, np. TEST.
+
+ 3. Teraz wpisz: :w TEST (gdzie TEST jest nazw pliku jak wybrae.)
+
+ 4. To polecenie zapamita cay plik (Vim Tutor) pod nazw TEST.
+ By to sprawdzi, wpisz :!dir lub :!ls eby znowu zobaczy list plikw.
+
+Uwaga: Zauwa, e gdyby teraz wyszed z Vima, a nastpnie wszed ponownie
+ poleceniem vim TEST , plik byby dokadn kopi tutoriala, kiedy go
+ zapisywae.
+
+ 5. Teraz usu plik wpisujc (MS-DOS): :!del TEST
+ lub (Unix): :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.3.: WYBRANIE TEKSTU DO ZAPISU
+
+
+ ** By zachowa cz pliku, wpisz v ruch :w NAZWA_PLIKU **
+
+ 1. Przenie kursor do tego wiersza.
+
+ 2. Wcinij v i przenie kursor do punktu 5. Zauwa, e tekst zosta
+ podwietlony.
+
+ 3. Wcinij znak : . Na dole ekranu pojawi si :'<,'> .
+
+ 4. Wpisz w TEST , gdzie TEST to nazwa pliku, ktry jeszcze nie istnieje.
+ Upewnij si, e widzisz :'<,'>w TEST zanim wciniesz Enter.
+
+ 5. Vim zapisze wybrane linie do pliku TEST. Uyj :!dir lub :!ls , eby to
+ zobaczy. Jeszcze go nie usuwaj! Uyjemy go w nastpnej lekcji.
+
+UWAGA: Wcinicie v zaczyna tryb Wizualny. Moesz porusza kursorem, by
+ zmieni rozmiary zaznaczenia. Moesz te uy operatora, by zrobi co
+ z tekstem. Na przykad d usuwa tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.4.: WSTAWIANIE I CZENIE PLIKW
+
+
+ ** By wstawi zawarto pliku, wpisz :r NAZWA_PLIKU **
+
+ 1. Umie kursor tu powyej tej linii.
+
+UWAGA: Po wykonaniu kroku 2. zobaczysz tekst z Lekcji 5.3. Potem przejd
+ do DOU, by zobaczy ponownie t lekcj.
+
+ 2. Teraz wczytaj plik TEST uywajc polecenia :r TEST , gdzie TEST
+ jest nazw pliku.
+ Wczytany plik jest umieszczony poniej linii z kursorem.
+
+ 3. By sprawdzi czy plik zosta wczytany, cofnij kursor i zobacz, e
+ teraz s dwie kopie Lekcji 5.3., orygina i kopia z pliku.
+
+UWAGA: Moesz te wczyta wyjcie zewntrznego polecenia. Na przykad
+ :r !ls wczytuje wyjcie polecenia ls i umieszcza je pod poniej
+ kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 5. PODSUMOWANIE
+
+
+ 1. :!polecenie wykonuje polecenie zewntrzne.
+
+ Uytecznymi przykadami s:
+
+ :!dir - pokazuje spis plikw w katalogu.
+
+ :!rm NAZWA_PLIKU - usuwa plik NAZWA_PLIKU.
+
+ 2. :w NAZWA_PLIKU zapisuje obecny plik Vima na dysk z nazw NAZWA_PLIKU.
+
+ 3. v ruch :w NAZWA_PLIKU zapisuje Wizualnie wybrane linie do NAZWA_PLIKU.
+
+ 4. :r NAZWA_PLIKU wczytuje z dysku plik NAZWA_PLIKU i wstawia go do
+ biecego pliku poniej kursora.
+
+ 5. :r !dir wczytuje wyjcie polecenia dir i umieszcza je poniej kursora.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.1.: POLECENIE OPEN (otwrz)
+
+
+ ** Wpisz o by otworzy lini poniej kursora i przenie si do
+ trybu Insert (wprowadzanie). **
+
+ 1. Przenie kursor do linii poniej oznaczonej --->.
+
+ 2. Wpisz o (mae), by otworzy lini PONIEJ kursora i przenie si
+ do trybu Insert (wprowadzanie).
+
+ 3. Wpisz troch tekstu i wcinij <ESC> by wyj z trybu Insert (wprowadzanie).
+
+---> Po wciniciu o kursor znajdzie si w otwartej linii w trybie Insert.
+
+ 4. By otworzy lini POWYEJ kursora, wcinij wielkie O zamiast maego
+ o . Wyprbuj to na linii poniej.
+
+---> Otwrz lini powyej wciskajc SHIFT-O gdy kursor bdzie na tej linii.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.2.: POLECENIE APPEND (dodaj)
+
+
+ ** Wpisz a by doda tekst ZA kursorem. **
+
+ 1. Przenie kursor do pocztku pierwszej linii poniej oznaczonej --->
+
+ 2. Wciskaj e dopki kursor nie bdzie na kocu li .
+
+ 3. Wpisz a (mae), aby doda tekst ZA znakiem pod kursorem.
+
+ 4. Dokocz wyraz tak, jak w linii poniej. Wcinij <ESC> aby opuci tryb
+ Insert.
+
+ 5. Uyj e by przej do kolejnego niedokoczonego wyrazu i powtarzaj kroki
+ 3. i 4.
+
+---> Ta li poz Ci wi dodaw teks do ko lin
+---> Ta linia pozwoli Ci wiczy dodawanie tekstu do koca linii.
+
+Uwaga: a , i oraz A prowadz do trybu Insert, jedyn rnic jest miejsce,
+ gdzie nowe znaki bd dodawane.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.3.: INNA WERSJA REPLACE (zamiana)
+
+
+ ** Wpisz wielkie R by zamieni wicej ni jeden znak. **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->. Przenie
+ kursor do pierwszego xxx .
+
+ 2. Wcinij R i wpisz numer poniej w drugiej linii, tak, e zastpi on
+ xxx.
+
+ 3. Wcinij <ESC> by opuci tryb Replace. Zauwa, e reszta linii pozostaje
+ niezmieniona.
+
+ 5. Powtarzaj kroki by wymieni wszystkie xxx.
+
+---> Dodanie 123 do xxx daje xxx.
+---> Dodanie 123 do 456 daje 579.
+
+UWAGA: Tryb Replace jest jak tryb Insert, ale kady znak usuwa istniejcy
+ znak.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.4.: KOPIOWANIE I WKLEJANIE TEKSTU
+
+
+ ** uyj operatora y aby skopiowa tekst i p aby go wklei **
+
+ 1. Przejd do linii oznaczonej ---> i umie kursor za "a)".
+
+ 2. Wejd w tryb Wizualny v i przenie kursor na pocztek "pierwszy".
+
+ 3. Wcinij y aby kopiowa (yankowa) podwietlony tekst.
+
+ 4. Przenie kursor do koca nastpnej linii: j$
+
+ 5. Wcinij p aby wklei (wpakowa) tekst. Dodaj: a drugi<ESC> .
+
+ 6. Uyj trybu Wizualnego, aby wybra " element.", yankuj go y , przejd do
+ koca nastpnej linii j$ i upakuj tam tekst z p .
+
+---> a) to jest pierwszy element.
+ b)
+Uwaga: moesz uy y jako operatora; yw kopiuje jeden wyraz.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.5.: USTAWIANIE OPCJI
+
+
+** Ustawianie opcji tak, by szukaj lub substytucja ignoroway wielko liter **
+
+ 1. Szukaj 'ignore' wpisujc: /ignore<ENTER>
+ Powtrz szukanie kilka razy naciskajc klawisz n .
+
+ 2. Ustaw opcj 'ic' (Ignore case -- ignoruj wielko liter) poprzez
+ wpisanie: :set ic
+
+ 3. Teraz szukaj 'ignore' ponownie wciskajc: n
+ Zauwa, e Ignore i IGNORE take s teraz znalezione.
+
+ 4. Ustaw opcje 'hlsearch' i 'incsearch': :set hls is
+
+ 5. Teraz wprowad polecenie szukaj ponownie i zobacz co si zdarzy:
+ /ignore<ENTER>
+
+ 6. Aby wyczy ignorowanie wielkoci liter: :set noic
+
+Uwaga: Aby usun podwietlanie dopasowa, wpisz: :nohlsearch
+Uwaga: Aby ignorowa wielko liter dla jednego wyszukiwania: /ignore\c<ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 6. PODSUMOWANIE
+
+
+ 1. Wpisanie o otwiera lini PONIEJ kursora.
+ Wpisanie O otwiera lini POWYEJ kursora.
+
+ 2. Wpisanie a wstawia tekst ZA znakiem, na ktrym jest kursor.
+ Wpisanie A dodaje tekst na kocu linii.
+
+ 3. Polecenie e przenosi do koca wyrazu.
+ 4. Operator y yankuje (kopiuje) tekst, p pakuje (wkleja) go.
+ 5. Wpisanie wielkiego R wprowadza w tryb Replace (zamiana) dopki
+ nie zostanie wcinity <ESC>.
+ 6. Wpisanie ":set xxx" ustawia opcj "xxx". Niektre opcje:
+ 'ic' 'ignorecase' ignoruj wielko znakw
+ 'is' 'incsearch' poka czciowe dopasowania
+ 'hls' 'hlsearch' podwietl wszystkie dopasowania
+ Moesz uy zarwno dugiej, jak i krtkiej formy.
+ 7. Dodaj "no", aby wyczy opcj: :set noic
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 7.1. JAK UZYSKA POMOC?
+
+ ** Uycie systemu pomocy on-line **
+
+ Vim posiada bardzo dobry system pomocy on-line. By zacz, sprbuj jednej
+ z trzech moliwoci:
+ - wcinij klawisz <HELP> (jeli taki masz)
+ - wcinij klawisz <F1> (jeli taki masz)
+ - wpisz :help<ENTER>
+
+ Przeczytaj tekst w oknie pomocy, aby dowiedzie si jak dziaa pomoc.
+ wpisz CTRL-W CTRL-W aby przeskoczy z jednego okna do innego
+ wpisz :q<ENTER> aby zamkn okno pomocy.
+
+ Moesz te znale pomoc na kady temat podajc argument polecenia ":help".
+ Sprbuj tych (nie zapomnij wcisn <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 7.2. TWORZENIE SKRYPTU STARTOWEGO
+
+ ** Wcz moliwoci Vima **
+
+ Vim ma o wiele wicej moliwoci ni Vi, ale wikszo z nich jest domylnie
+ wyczona. Jeli chcesz wczy te moliwoci na starcie musisz utworzy
+ plik "vimrc".
+
+ 1. Pocztek edycji pliku "vimrc" zaley od Twojego systemu:
+ :edit ~/.vimrc dla Uniksa
+ :edit ~/_vimrc dla MS-Windows
+ 2. Teraz wczytaj przykadowy plik "vimrc":
+ :read $VIMRUNTIME/vimrc_example.vim
+ 3. Zapisz plik:
+ :w
+
+ Nastpnym razem, gdy zaczniesz prac w Vimie bdzie on uywa podwietlania
+ skadni. Moesz doda wszystkie swoje ulubione ustawienia do tego pliku
+ "vimrc".
+ Aby uzyska wicej informacji, wpisz :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 7.3.: UZUPENIANIE
+
+
+ ** Uzupenianie linii polece z CTRL-D i <TAB> **
+
+ 1. Upewnij si, e Vim nie jest w trybie kompatybilnoci: :set nocp
+
+ 2. Zerknij, jakie pliki s w biecym katalogu: :!ls lub :!dir
+
+ 3. Wpisz pocztek polecenia: :e
+
+ 4. Wcinij CTRL-D i Vim pokae list polece, jakie zaczynaj si na "e".
+
+ 5. Wcinij <TAB> i Vim uzupeni polecenie do ":edit".
+
+ 6. Dodaj spacj i zacznij wpisywa nazw istniejcego pliku: :edit FIL
+
+ 7. Wcinij <TAB>. Vim uzupeni nazw (jeli jest niepowtarzalna).
+
+UWAGA: Uzupenianie dziaa dla wielu polece. Sprbuj wcisn CTRL-D i <TAB>.
+ Uyteczne zwaszcza przy :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 7. PODSUMOWANIE
+
+
+ 1. Wpisz :help albo wcinij <F1> lub <Help> aby otworzy okno pomocy.
+
+ 2. Wpisz :help cmd aby uzyska pomoc o cmd .
+
+ 3. Wpisz CTRL-W CTRL-W aby przeskoczy do innego okna.
+
+ 4. Wpisz :q aby zamkn okno pomocy.
+
+ 5. Utwrz plik startowy vimrc aby zachowa wybrane ustawienia.
+
+ 6. Po poleceniu : , wcinij CTRL-D aby zobaczy moliwe uzupenienia.
+ Wcinij <TAB> aby uy jednego z nich.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Tutaj si koczy tutorial Vima. Zosta on pomylany tak, aby da krtki
+ przegld jego moliwoci, wystarczajcy by mg go uywa. Jest on
+ daleki od kompletnoci, poniewa Vim ma o wiele, wiele wicej polece.
+
+ Dla dalszej nauki rekomendujemy ksik:
+ Vim - Vi Improved - autor Steve Oualline
+ Wydawca: New Riders
+ Pierwsza ksika cakowicie powicona Vimowi. Uyteczna zwaszcza dla
+ pocztkujcych. Zawiera wiele przykadw i ilustracji.
+ Zobacz https://iccf-holland.org./click5.html
+
+ Starsza pozycja i bardziej o Vi ni o Vimie, ale take warta
+ polecenia:
+ Learning the Vi Editor - autor Linda Lamb
+ Wydawca: O'Reilly & Associates Inc.
+ To dobra ksika, by dowiedzie si niemal wszystkiego, co chciaby zrobi
+ z Vi. Szsta edycja zawiera te informacje o Vimie.
+
+ Po polsku wydano:
+ Edytor vi. Leksykon kieszonkowy - autor Arnold Robbins
+ Wydawca: Helion 2001 (O'Reilly).
+ ISBN: 83-7197-472-8
+ http://helion.pl/ksiazki/vilek.htm
+ Jest to ksieczka zawierajca spis polece vi i jego najwaniejszych
+ klonw (midzy innymi Vima).
+
+ Edytor vi - autorzy Linda Lamb i Arnold Robbins
+ Wydawca: Helion 2001 (O'Reilly) - wg 6. ang. wydania
+ ISBN: 83-7197-539-2
+ http://helion.pl/ksiazki/viedyt.htm
+ Rozszerzona wersja Learning the Vi Editor w polskim tumaczeniu.
+
+ Ten tutorial zosta napisany przez Michaela C. Pierce'a i Roberta K. Ware'a,
+ Colorado School of Mines korzystajc z pomocy Charlesa Smitha,
+ Colorado State University.
+ E-mail: bware@mines.colorado.edu.
+
+ Zmodyfikowane dla Vima przez Brama Moolenaara.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Przetumaczone przez Mikoaja Machowskiego,
+ Sierpie 2001,
+ rev. Marzec 2002
+ 2nd rev. Wrzesie 2004
+ 3rd rev. Marzec 2006
+ 4th rev. Grudzie 2008
+ Wszelkie uwagi prosz kierowa na: mikmach@wp.pl
diff --git a/runtime/tutor/tutor.pl.cp1250 b/runtime/tutor/tutor.pl.cp1250
new file mode 100644
index 0000000..129f8ec
--- /dev/null
+++ b/runtime/tutor/tutor.pl.cp1250
@@ -0,0 +1,995 @@
+===============================================================================
+= W i t a j w t u t o r i a l u V I M - a - Wersja 1.7. =
+===============================================================================
+
+ Vim to potny edytor, ktry posiada wiele polece, zbyt duo, by
+ wyjani je wszystkie w tym tutorialu. Ten przewodnik ma nauczy
+ Ci posugiwa si wystarczajco wieloma komendami, by mg atwo
+ uywa Vima jako edytora oglnego przeznaczenia.
+
+ Czas potrzebny na ukoczenie tutoriala to 25 do 30 minut i zaley
+ od tego jak wiele czasu spdzisz na eksperymentowaniu.
+
+ UWAGA:
+ Polecenia wykonywane w czasie lekcji zmodyfikuj tekst. Zrb
+ wczeniej kopi tego pliku do wicze (jeli zacze komend
+ "vimtutor", to ju pracujesz na kopii).
+
+ Pamitaj, e przewodnik ten zosta zaprojektowany do nauki poprzez
+ wiczenia. Oznacza to, e musisz wykonywa polecenia, by nauczy si ich
+ prawidowo. Jeli bdziesz jedynie czyta tekst, szybko zapomnisz wiele
+ polece!
+
+ Teraz upewnij si, e nie masz wcinitego Caps Locka i wciskaj j
+ tak dugo dopki Lekcja 1.1. nie wypeni cakowicie ekranu.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.1.: PORUSZANIE SI KURSOREM
+
+ ** By wykona ruch kursorem, wcinij h, j, k, l jak pokazano. **
+
+ ^
+ k Wskazwka: h jest po lewej
+ < h l > l jest po prawej
+ j j wyglda jak strzaka w d
+ v
+ 1. Poruszaj kursorem dopki nie bdziesz pewien, e pamitasz polecenia.
+
+ 2. Trzymaj j tak dugo a bdzie si powtarza.
+ Teraz wiesz jak doj do nastpnej lekcji.
+
+ 3. Uywajc strzaki w d przejd do nastpnej lekcji.
+
+Uwaga: Jeli nie jeste pewien czego co wpisae, wcinij <ESC>, by wrci do
+ trybu Normal. Wtedy powtrz polecenie.
+
+Uwaga: Klawisze kursora take powinny dziaa, ale uywajc hjkl bdziesz
+ w stanie porusza si o wiele szybciej, jak si tylko przyzwyczaisz.
+ Naprawd!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.2.: WYCHODZENIE Z VIM-a
+
+ !! UWAGA: Przed wykonaniem jakiegokolwiek polecenia przeczytaj ca lekcj !!
+
+ 1. Wcinij <ESC> (aby upewni si, e jeste w trybie Normal).
+ 2. Wpisz: :q!<ENTER>.
+ To spowoduje wyjcie z edytora PORZUCAJC wszelkie zmiany, jakie
+ zdye zrobi. Jeli chcesz zapamita zmiany i wyj,
+ wpisz: :wq<ENTER>
+
+ 3. Kiedy widzisz znak zachty powoki wpisz komend, eby wrci
+ do tutoriala. Czyli: vimtutor<ENTER>
+
+ 4. Jeli chcesz zapamita polecenia, wykonaj kroki 1. do 3., aby
+ wyj i wrci do edytora.
+
+UWAGA: :q!<ENTER> porzuca wszelkie zmiany jakie zrobie. W nastpnych
+ lekcjach dowiesz si jak je zapamitywa.
+
+ 5. Przenie kursor do lekcji 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.3.: EDYCJA TEKSTU - KASOWANIE
+
+ ** Wcinij x aby usun znak pod kursorem. **
+
+ 1. Przenie kursor do linii poniej oznaczonej --->.
+
+ 2. By poprawi bdy, naprowad kursor na znak do usunicia.
+
+ 3. Wcinij x aby usun niechciany znak.
+
+ 4. Powtarzaj kroki 2. do 4. dopki zdanie nie jest poprawne.
+
+---> Kkrowa prrzeskoczya prrzez ksiiycc.
+
+ 5. Teraz, kiedy zdanie jest poprawione, przejd do Lekcji 1.4.
+
+UWAGA: Ucz si przez wiczenie, nie wkuwanie.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.4.: EDYCJA TEKSTU - INSERT (wprowadzanie)
+
+
+ ** Wcinij i aby wstawi tekst. **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->.
+
+ 2. Aby poprawi pierwszy wiersz, ustaw kursor na pierwszym znaku PO tym,
+ gdzie tekst ma by wstawiony.
+
+ 3. Wcinij i a nastpnie wpisz konieczne poprawki.
+
+ 4. Po poprawieniu bdu wcinij <ESC>, by wrci do trybu Normal.
+ Powtarzaj kroki 2. do 4., aby poprawi cae zdanie.
+
+---> W tej brkje troch .
+---> W tej linii brakuje troch tekstu.
+
+ 5. Kiedy czujesz si swobodnie wstawiajc tekst, przejd do
+ podsumowania poniej.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.5.: EDYCJA TEKSTU - APPENDING (dodawanie)
+
+
+ ** Wcinij A by doda tekst. **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->.
+ Nie ma znaczenia, ktry to bdzie znak.
+
+ 2. Wcinij A i wpisz odpowiednie dodatki.
+
+ 3. Kiedy tekst zosta dodany, wcinij <ESC> i wr do trybu Normalnego.
+
+ 4. Przenie kursor do drugiej linii oznaczonej ---> i powtrz kroki 2. i 3.,
+ aby poprawi zdanie.
+
+---> Brakuje tu tro
+ Brakuje tu troch tekstu.
+---> Tu te troch bra
+ Tu te troch brakuje.
+
+ 5. Kiedy ju utrwalie wiczenie, przejd do lekcji 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.6.: EDYCJA PLIKU
+
+ ** Uyj :wq aby zapisa plik i wyj. **
+
+ !! UWAGA: zanim wykonasz jakiekolwiek polecenia przeczytaj ca lekcj !!
+
+ 1. Zakocz tutorial tak jak w lekcji 1.2.: :q!
+ lub, jeli masz dostp do innego terminala, wykonaj kolejne kroki tam.
+
+ 2. W powoce wydaj polecenie: vim tutor<ENTER>
+ "vim" jest poleceniem uruchamiajcym edytor Vim. 'tutor' to nazwa pliku,
+ jaki chcesz edytowa. Uyj pliku, ktry moe zosta zmieniony.
+
+ 3. Dodaj i usu tekst tak, jak si nauczye w poprzednich lekcjach.
+
+ 4. Zapisz plik ze zmianami i opu Vima: :wq<ENTER>
+
+ 5. Jeli zakoczye vimtutor w kroku 1., uruchom go ponownie i przejd
+ do podsumowania poniej.
+
+ 6. Po przeczytaniu wszystkich krokw i ich zrozumieniu: wykonaj je.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 1. PODSUMOWANIE
+
+ 1. Poruszasz kursorem uywajc "strzaek" i klawiszy hjkl .
+ h (w lewo) j (w d) k (do gry) l (w prawo)
+
+ 2. By wej do Vima, (z powoki) wpisz:
+ vim NAZWA_PLIKU<ENTER>
+
+ 3. By wyj z Vima, wpisz:
+ <ESC> :q!<ENTER> by usun wszystkie zmiany.
+ LUB: <ESC> :wq<ENTER> by zmiany zachowa.
+
+ 4. By usun znak pod kursorem, wcinij: x
+
+ 5. By wstawi tekst przed kursorem lub doda:
+ i wpisz tekst <ESC> wstawi przed kursorem
+ A wpisz tekst <ESC> doda na kocu linii
+
+UWAGA: Wcinicie <ESC> przeniesie Ci z powrotem do trybu Normal
+ lub odwoa niechciane lub czciowo wprowadzone polecenia.
+
+Teraz moemy kontynuowa i przej do Lekcji 2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.1.: POLECENIE DELETE (usuwanie)
+
+
+ ** Wpisz dw by usun wyraz. **
+
+ 1. Wcinij <ESC>, by upewni si, e jeste w trybie Normal.
+
+ 2. Przenie kursor do linii poniej oznaczonej --->.
+
+ 3. Przesu kursor na pocztek wyrazu, ktry chcesz usun.
+
+ 4. Wpisz dw by usun wyraz.
+
+ UWAGA: Litera d pojawi si na dole ekranu. Vim czeka na wpisanie w .
+ Jeli zobaczysz inny znak, oznacza to, e wpisae co le; wcinij
+ <ESC> i zacznij od pocztku.
+
+---> Jest tu par papier wyrazw, ktre kamie nie nale do noyce tego zdania.
+
+ 5. Powtarzaj kroki 3. i 4. dopki zdanie nie bdzie poprawne, potem
+ przejd do Lekcji 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.2.: WICEJ POLECE USUWAJCYCH
+
+
+ ** Wpisz d$ aby usun tekst do koca linii. **
+
+ 1. Wcinij <ESC> aby si upewni, e jeste w trybie Normal.
+
+ 2. Przenie kursor do linii poniej oznaczonej --->.
+
+ 3. Przenie kursor do koca poprawnego zdania (PO pierwszej . ).
+
+ 4. Wpisz d$ aby usun reszt linii.
+
+---> Kto wpisa koniec tego zdania dwukrotnie. zdania dwukrotnie.
+
+
+ 5. Przejd do Lekcji 2.3., by zrozumie co si stao.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.3.: O OPERATORACH I RUCHACH
+
+
+ Wiele polece zmieniajcych tekst jest zoonych z operatora i ruchu.
+ Format dla polecenia usuwajcego z operatorem d jest nastpujcy:
+
+ d ruch
+
+ gdzie:
+ d - operator usuwania.
+ ruch - na czym polecenie bdzie wykonywane (lista poniej).
+
+ Krtka lista ruchw:
+ w - do pocztku nastpnego wyrazu WYCZAJC pierwszy znak.
+ e - do koca biecego wyrazu, WCZAJC ostatni znak.
+ $ - do koca linii, WCZAJC ostatni znak.
+
+W ten sposb wpisanie de usunie znaki od kursora do koca wyrazu.
+
+UWAGA: Wpisanie tylko ruchu w trybie Normal bez operatora przeniesie kursor
+ tak, jak to okrelono.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.4.: UYCIE MNONIKA DLA RUCHU
+
+
+ ** Wpisanie liczby przed ruchem powtarza ruch odpowiedni ilo razy. **
+
+ 1. Przenie kursor na pocztek linii poniej zaznaczonej --->.
+
+ 2. Wpisz 2w aby przenie kursor o dwa wyrazy do przodu.
+
+ 3. Wpisz 3e aby przenie kursor do koca trzeciego wyrazu w przd.
+
+ 4. Wpisz 0 (zero), aby przenie kursor na pocztek linii.
+
+ 5. Powtrz kroki 2. i 3. z innymi liczbami.
+
+
+ ---> To jest zwyky wiersz z wyrazami, po ktrych moesz si porusza.
+
+ 6. Przejd do lekcji 2.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.5.: UYCIE MNONIKA, BY WICEJ USUN
+
+
+ ** Wpisanie liczby z operatorem powtarza go odpowiedni ilo razy. **
+
+ W wyej wspomnianej kombinacji operatora usuwania i ruchu podaj mnonik
+ przed ruchem, by wicej usun:
+ d liczba ruch
+
+ 1. Przenie kursor do pierwszego wyrazu KAPITALIKAMI w linii zaznaczonej --->.
+
+ 2. Wpisz 2dw aby usun dwa wyrazy KAPITALIKAMI.
+
+ 3. Powtarzaj kroki 1. i 2. z innymi mnonikami, aby usun kolejne wyrazy
+ KAPITALIKAMI jednym poleceniem
+
+---> ta ASD WE linia QWE ASDF ZXCV FG wyrazw zostaa ERT FGH CF oczyszczona.
+
+UWAGA: Mnonik pomidzy operatorem d i ruchem dziaa podobnie do ruchu bez
+ operatora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.6.: OPEROWANIE NA LINIACH
+
+
+ ** Wpisz dd aby usun ca lini. **
+
+ Z powodu czstoci usuwania caych linii, projektanci Vi zdecydowali, e
+ bdzie atwiej wpisa dwa razy d aby usun lini.
+
+ 1. Przenie kursor do drugiego zdania z wierszyka poniej.
+ 2. Wpisz dd aby usun wiersz.
+ 3. Teraz przenie si do czwartego wiersza.
+ 4. Wpisz 2dd aby usun dwa wiersze.
+
+---> 1) Re s czerwone,
+---> 2) Boto jest fajne,
+---> 3) Fioki s niebieskie,
+---> 4) Mam samochd,
+---> 5) Zegar podaje czas,
+---> 6) Cukier jest sodki,
+---> 7) I ty te.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.7.: POLECENIE UNDO (cofnij)
+
+
+ ** Wcinij u aby cofn skutki ostatniego polecenia.
+ U za, by cofn skutki dla caej linii. **
+
+ 1. Przenie kursor do zdania poniej oznaczonego ---> i umie go na
+ pierwszym bdzie.
+ 2. Wpisz x aby usun pierwszy niechciany znak.
+ 3. Teraz wcinij u aby cofn skutki ostatniego polecenia.
+ 4. Tym razem popraw wszystkie bdy w linii uywajc polecenia x .
+ 5. Teraz wcinij wielkie U aby przywrci lini do oryginalnego stanu.
+ 6. Teraz wcinij u kilka razy, by cofn U i poprzednie polecenia.
+ 7. Teraz wpisz CTRL-R (trzymaj rwnoczenie wcinite klawisze CTRL i R)
+ kilka razy, by cofn cofnicia.
+
+---> Poopraw bdyyy w teej liniii i zaamiie je prrzez coofnij.
+
+ 8. To s bardzo poyteczne polecenia.
+
+ Przejd teraz do podsumowania Lekcji 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 2. PODSUMOWANIE
+
+
+ 1. By usun znaki od kursora do nastpnego wyrazu, wpisz: dw
+ 2. By usun znaki od kursora do koca linii, wpisz: d$
+ 3. By usun ca lini: dd
+ 4. By powtrzy ruch, poprzed go liczb: 2w
+ 5. Format polecenia zmiany to:
+ operator [liczba] ruch
+ gdzie:
+ operator - to, co trzeba zrobi (np. d dla usuwania)
+ [liczba] - opcjonalne, ile razy powtrzy ruch
+ ruch - przenosi nad tekstem do operowania, takim jak w (wyraz),
+ $ (do koca linii) etc.
+
+ 6. By przej do pocztku linii, uyj zera: 0
+ 7. By cofn poprzednie polecenie, wpisz: u (mae u)
+ By cofn wszystkie zmiany w linii, wpisz: U (wielkie U)
+ By cofn cofnicie, wpisz: CTRL-R
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.1.: POLECENIE PUT (wstaw)
+
+
+ ** Wpisz p by wstawi ostatnie usunicia za kursorem. **
+
+ 1. Przenie kursor do pierwszej linii ---> poniej.
+
+ 2. Wpisz dd aby usun lini i przechowa j w rejestrze Vima.
+
+ 3. Przenie kursor do linii c), POWYEJ tej, gdzie usunita linia powinna
+ si znajdowa.
+
+ 4. Wcinij p by wstawi lini poniej kursora.
+
+ 5. Powtarzaj kroki 2. do 4. a znajd si w odpowiednim porzdku.
+
+---> d) Jak dwa anioki.
+---> b) Na dole fioki,
+---> c) A my si kochamy,
+---> a) Na grze re,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.2.: POLECENIE REPLACE (zastp)
+
+
+ ** Wpisz rx aby zastpi znak pod kursorem na x . **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->
+
+ 2. Ustaw kursor na pierwszym bdzie.
+
+ 3. Wpisz r a potem znak jaki powinien go zastpi.
+
+ 4. Powtarzaj kroki 2. i 3. dopki pierwsza linia nie bdzie taka, jak druga.
+
+---> Kjedy ten wiersz bi wstkiwany, kto wcizn per zych klawirzy!
+---> Kiedy ten wiersz by wstukiwany, kto wcisn par zych klawiszy!
+
+ 5. Teraz czas na Lekcj 3.3.
+
+
+UWAGA: Pamitaj, by uczy si wiczc, a nie pamiciowo.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.3.: OPERATOR CHANGE (zmie)
+
+ ** By zmieni do koca wyrazu, wpisz ce . **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->.
+
+ 2. Umie kursor na u w lunos.
+
+ 3. Wpisz ce i popraw wyraz (w tym wypadku wstaw inia ).
+
+ 4. Wcinij <ESC> i przejd do nastpnej planowanej zmiany.
+
+ 5. Powtarzaj kroki 3. i 4. dopki pierwsze zdanie nie bdzie takie same,
+ jak drugie.
+
+---> Ta lunos ma pire sw, ktre tina zbnic uifajonc pcmazu zmie.
+---> Ta linia ma par sw, ktre trzeba zmieni uywajc polecenia zmie.
+
+ Zauwa, e ce nie tylko zamienia wyraz, ale take zmienia tryb na
+ Insert (wprowadzanie).
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.4.: WICEJ ZMIAN UYWAJC c
+
+
+ ** Polecenie change uywa takich samych ruchw, jak delete. **
+
+ 1. Operator change dziaa tak samo, jak delete. Format wyglda tak:
+
+ c [liczba] ruch
+
+ 2. Ruchy s take takie same, np.: w (wyraz), $ (koniec linii) etc.
+
+ 3. Przenie si do pierwszej linii poniej oznaczonej --->
+
+ 4. Ustaw kursor na pierwszym bdzie.
+
+ 5. Wpisz c$ , popraw koniec wiersza i wcinij <ESC>.
+
+---> Koniec tego wiersza musi by poprawiony, aby wyglda tak, jak drugi.
+---> Koniec tego wiersza musi by poprawiony uywajc polecenia c$ .
+
+UWAGA: Moesz uywa <BS> aby poprawia bdy w czasie pisania.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 3. PODSUMOWANIE
+
+
+ 1. Aby wstawi tekst, ktry zosta wczeniej usunity wcinij p . To
+ polecenie wstawia skasowany tekst PO kursorze (jeli caa linia
+ zostaa usunita, zostanie ona umieszczona w linii poniej kursora).
+
+ 2. By zamieni znak pod kursorem, wcinij r a potem znak, ktry ma zastpi
+ oryginalny.
+
+ 3. Operator change pozwala Ci na zastpienie od kursora do miejsca, gdzie
+ zabraby Ci ruch. Np. wpisz ce aby zamieni tekst od kursora do koca
+ wyrazu, c$ aby zmieni tekst do koca linii.
+
+ 4. Format do polecenia change (zmie):
+
+ c [liczba] obiekt
+
+ Teraz przejd do nastpnej lekcji.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.1.: POOENIE KURSORA ORAZ STATUS PLIKU
+
+ ** Nacinij CTRL-G aby zobaczy swoje pooenie w pliku i status
+ pliku. Nacinij G aby przej do linii w pliku. **
+
+ UWAGA: Przeczytaj ca lekcj zanim wykonasz jakie polecenia!!!
+
+ 1. Przytrzymaj klawisz CTRL i wcinij g . Uywamy notacji CTRL-G.
+ Na dole strony pojawi si pasek statusu z nazw pliku i pozycj w pliku.
+ Zapamitaj numer linii dla potrzeb kroku 3.
+
+UWAGA: Moesz te zobaczy pozycj kursora w prawym, dolnym rogu ekranu.
+ Dzieje si tak kiedy ustawiona jest opcja 'ruler' (wicej w lekcji 6.).
+
+ 2. Wcinij G aby przej na koniec pliku.
+ Wcinij gg aby przej do pocztku pliku.
+
+ 3. Wpisz numer linii, w ktrej bye a potem G . To przeniesie Ci
+ z powrotem do linii, w ktrej bye kiedy wcisne CTRL-G.
+
+ 4. Jeli czujesz si wystarczajco pewnie, wykonaj kroki 1-3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.2.: POLECENIE SZUKAJ
+
+
+ ** Wpisz / a nastpnie wyraenie, aby je znale. **
+
+ 1. W trybie Normal wpisz / . Zauwa, e znak ten oraz kursor pojawi
+ si na dole ekranu tak samo, jak polecenie : .
+
+ 2. Teraz wpisz bond<ENTER> . To jest sowo, ktrego chcesz szuka.
+
+ 3. By szuka tej samej frazy ponownie, po prostu wcinij n .
+ Aby szuka tej frazy w przeciwnym, kierunku wcinij N .
+
+ 4. Jeli chcesz szuka frazy do tyu, uyj polecenia ? zamiast / .
+
+ 5. Aby wrci gdzie bye, wcinij CTRL-O. Powtarzaj, by wrci dalej. CTRL-I
+ idzie do przodu.
+
+Uwaga: 'bond' to nie jest metoda, by przeliterowa bd; 'bond' to bd.
+Uwaga: Kiedy szukanie osignie koniec pliku, bdzie kontynuowane od pocztku
+ o ile opcja 'wrapscan' nie zostaa przestawiona.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.3.: W POSZUKIWANIU PARUJCYCH NAWIASW
+
+
+ ** Wpisz % by znale parujcy ), ], lub } . **
+
+ 1. Umie kursor na ktrym z (, [, lub { w linii poniej oznaczonej --->.
+
+ 2. Teraz wpisz znak % .
+
+ 3. Kursor powinien si znale na parujcym nawiasie.
+
+ 4. Wcinij % aby przenie kursor z powrotem do parujcego nawiasu.
+
+ 5. Przenie kursor do innego (,),[,],{ lub } i zobacz co robi % .
+
+---> To ( jest linia testowa z (, [, ] i {, } . ))
+
+Uwaga: Ta funkcja jest bardzo uyteczna w debuggowaniu programu
+ z niesparowanymi nawiasami!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.4.: POLECENIE SUBSTITUTE (zamiana)
+
+
+ ** Wpisz :s/stary/nowy/g aby zamieni 'stary' na 'nowy'. **
+
+ 1. Przenie kursor do linii poniej oznaczonej --->.
+
+ 2. Wpisz :s/czaas/czas<ENTER> . Zauwa, e to polecenie zmienia
+ tylko pierwsze wystpienie 'czaas' w linii.
+
+ 3. Teraz wpisz :s/czaas/czas/g . Dodane g oznacza zamian (substytucj)
+ globalnie w caej linii. Zmienia wszystkie wystpienia 'czaas' w linii.
+
+---> Najlepszy czaas na zobaczenie najadniejszych kwiatw to czaas wiosny.
+
+ 4. Aby zmieni wszystkie wystpienia acucha znakw pomidzy dwoma liniami,
+ wpisz: :#,#s/stare/nowe/g gdzie #,# s numerami linii ograniczajcych
+ region, gdzie ma nastpi zamiana.
+ wpisz :%s/stare/nowe/g by zmieni wszystkie wystpienia w caym pliku.
+ wpisz :%s/stare/nowe/gc by zmieni wszystkie wystpienia w caym
+ pliku, proszc o potwierdzenie za kadym razem.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 4. PODSUMOWANIE
+
+ 1. CTRL-G pokae Twoj pozycj w pliku i status pliku. SHIFT-G przenosi
+ Ci do koca pliku.
+ G przenosi do koca pliku.
+ liczba G przenosi do linii [liczba].
+ gg przenosi do pierwszej linii.
+
+ 2. Wpisanie / a nastpnie acucha znakw szuka acucha DO PRZODU.
+ Wpisanie ? a nastpnie acucha znakw szuka acucha DO TYU.
+ Po wyszukiwaniu wcinij n by znale nastpne wystpienie szukanej
+ frazy w tym samym kierunku lub N by szuka w kierunku przeciwnym.
+ CTRL-O przenosi do starszych pozycji, CTRL-I do nowszych.
+
+ 3. Wpisanie % gdy kursor znajduje si na (,),[,],{, lub } lokalizuje
+ parujcy znak.
+
+ 4. By zamieni pierwszy stary na nowy w linii, wpisz :s/stary/nowy
+ By zamieni wszystkie stary na nowy w linii, wpisz :s/stary/nowy/g
+ By zamieni frazy pomidzy dwoma liniami # wpisz :#,#s/stary/nowy/g
+ By zamieni wszystkie wystpienia w pliku, wpisz :%s/stary/nowy/g
+ By Vim prosi Ci o potwierdzenie, dodaj 'c' :%s/stary/nowy/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.1.: JAK WYKONA POLECENIA ZEWNTRZNE?
+
+
+ ** Wpisz :! a nastpnie zewntrzne polecenie, by je wykona. **
+
+ 1. Wpisz znajome polecenie : by ustawi kursor na dole ekranu. To pozwala
+ na wprowadzenie komendy linii polece.
+
+ 2. Teraz wstaw ! (wykrzyknik). To umoliwi Ci wykonanie dowolnego
+ zewntrznego polecenia powoki.
+
+ 3. Jako przykad wpisz ls za ! a nastpnie wcinij <ENTER>. To polecenie
+ pokae spis plikw w Twoim katalogu, tak jakby by przy znaku zachty
+ powoki. Moesz te uy :!dir jeli ls nie dziaa.
+
+Uwaga: W ten sposb mona wykona wszystkie polecenia powoki.
+Uwaga: Wszystkie polecenia : musz by zakoczone <ENTER>.
+ Od tego momentu nie zawsze bdziemy o tym wspomina.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.2.: WICEJ O ZAPISYWANIU PLIKW
+
+
+ ** By zachowa zmiany w tekcie, wpisz :w NAZWA_PLIKU . **
+
+ 1. Wpisz :!dir lub :!ls by zobaczy spis plikw w katalogu.
+ Ju wiesz, e musisz po tym wcisn <ENTER>.
+
+ 2. Wybierz nazw pliku, jaka jeszcze nie istnieje, np. TEST.
+
+ 3. Teraz wpisz: :w TEST (gdzie TEST jest nazw pliku jak wybrae.)
+
+ 4. To polecenie zapamita cay plik (Vim Tutor) pod nazw TEST.
+ By to sprawdzi, wpisz :!dir lub :!ls eby znowu zobaczy list plikw.
+
+Uwaga: Zauwa, e gdyby teraz wyszed z Vima, a nastpnie wszed ponownie
+ poleceniem vim TEST , plik byby dokadn kopi tutoriala, kiedy go
+ zapisywae.
+
+ 5. Teraz usu plik wpisujc (MS-DOS): :!del TEST
+ lub (Unix): :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.3.: WYBRANIE TEKSTU DO ZAPISU
+
+
+ ** By zachowa cz pliku, wpisz v ruch :w NAZWA_PLIKU **
+
+ 1. Przenie kursor do tego wiersza.
+
+ 2. Wcinij v i przenie kursor do punktu 5. Zauwa, e tekst zosta
+ podwietlony.
+
+ 3. Wcinij znak : . Na dole ekranu pojawi si :'<,'> .
+
+ 4. Wpisz w TEST , gdzie TEST to nazwa pliku, ktry jeszcze nie istnieje.
+ Upewnij si, e widzisz :'<,'>w TEST zanim wciniesz Enter.
+
+ 5. Vim zapisze wybrane linie do pliku TEST. Uyj :!dir lub :!ls , eby to
+ zobaczy. Jeszcze go nie usuwaj! Uyjemy go w nastpnej lekcji.
+
+UWAGA: Wcinicie v zaczyna tryb Wizualny. Moesz porusza kursorem, by
+ zmieni rozmiary zaznaczenia. Moesz te uy operatora, by zrobi co
+ z tekstem. Na przykad d usuwa tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.4.: WSTAWIANIE I CZENIE PLIKW
+
+
+ ** By wstawi zawarto pliku, wpisz :r NAZWA_PLIKU **
+
+ 1. Umie kursor tu powyej tej linii.
+
+UWAGA: Po wykonaniu kroku 2. zobaczysz tekst z Lekcji 5.3. Potem przejd
+ do DOU, by zobaczy ponownie t lekcj.
+
+ 2. Teraz wczytaj plik TEST uywajc polecenia :r TEST , gdzie TEST
+ jest nazw pliku.
+ Wczytany plik jest umieszczony poniej linii z kursorem.
+
+ 3. By sprawdzi czy plik zosta wczytany, cofnij kursor i zobacz, e
+ teraz s dwie kopie Lekcji 5.3., orygina i kopia z pliku.
+
+UWAGA: Moesz te wczyta wyjcie zewntrznego polecenia. Na przykad
+ :r !ls wczytuje wyjcie polecenia ls i umieszcza je pod poniej
+ kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 5. PODSUMOWANIE
+
+
+ 1. :!polecenie wykonuje polecenie zewntrzne.
+
+ Uytecznymi przykadami s:
+
+ :!dir - pokazuje spis plikw w katalogu.
+
+ :!rm NAZWA_PLIKU - usuwa plik NAZWA_PLIKU.
+
+ 2. :w NAZWA_PLIKU zapisuje obecny plik Vima na dysk z nazw NAZWA_PLIKU.
+
+ 3. v ruch :w NAZWA_PLIKU zapisuje Wizualnie wybrane linie do NAZWA_PLIKU.
+
+ 4. :r NAZWA_PLIKU wczytuje z dysku plik NAZWA_PLIKU i wstawia go do
+ biecego pliku poniej kursora.
+
+ 5. :r !dir wczytuje wyjcie polecenia dir i umieszcza je poniej kursora.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.1.: POLECENIE OPEN (otwrz)
+
+
+ ** Wpisz o by otworzy lini poniej kursora i przenie si do
+ trybu Insert (wprowadzanie). **
+
+ 1. Przenie kursor do linii poniej oznaczonej --->.
+
+ 2. Wpisz o (mae), by otworzy lini PONIEJ kursora i przenie si
+ do trybu Insert (wprowadzanie).
+
+ 3. Wpisz troch tekstu i wcinij <ESC> by wyj z trybu Insert (wprowadzanie).
+
+---> Po wciniciu o kursor znajdzie si w otwartej linii w trybie Insert.
+
+ 4. By otworzy lini POWYEJ kursora, wcinij wielkie O zamiast maego
+ o . Wyprbuj to na linii poniej.
+
+---> Otwrz lini powyej wciskajc SHIFT-O gdy kursor bdzie na tej linii.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.2.: POLECENIE APPEND (dodaj)
+
+
+ ** Wpisz a by doda tekst ZA kursorem. **
+
+ 1. Przenie kursor do pocztku pierwszej linii poniej oznaczonej --->
+
+ 2. Wciskaj e dopki kursor nie bdzie na kocu li .
+
+ 3. Wpisz a (mae), aby doda tekst ZA znakiem pod kursorem.
+
+ 4. Dokocz wyraz tak, jak w linii poniej. Wcinij <ESC> aby opuci tryb
+ Insert.
+
+ 5. Uyj e by przej do kolejnego niedokoczonego wyrazu i powtarzaj kroki
+ 3. i 4.
+
+---> Ta li poz Ci wi dodaw teks do ko lin
+---> Ta linia pozwoli Ci wiczy dodawanie tekstu do koca linii.
+
+Uwaga: a , i oraz A prowadz do trybu Insert, jedyn rnic jest miejsce,
+ gdzie nowe znaki bd dodawane.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.3.: INNA WERSJA REPLACE (zamiana)
+
+
+ ** Wpisz wielkie R by zamieni wicej ni jeden znak. **
+
+ 1. Przenie kursor do pierwszej linii poniej oznaczonej --->. Przenie
+ kursor do pierwszego xxx .
+
+ 2. Wcinij R i wpisz numer poniej w drugiej linii, tak, e zastpi on
+ xxx.
+
+ 3. Wcinij <ESC> by opuci tryb Replace. Zauwa, e reszta linii pozostaje
+ niezmieniona.
+
+ 5. Powtarzaj kroki by wymieni wszystkie xxx.
+
+---> Dodanie 123 do xxx daje xxx.
+---> Dodanie 123 do 456 daje 579.
+
+UWAGA: Tryb Replace jest jak tryb Insert, ale kady znak usuwa istniejcy
+ znak.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.4.: KOPIOWANIE I WKLEJANIE TEKSTU
+
+
+ ** uyj operatora y aby skopiowa tekst i p aby go wklei **
+
+ 1. Przejd do linii oznaczonej ---> i umie kursor za "a)".
+
+ 2. Wejd w tryb Wizualny v i przenie kursor na pocztek "pierwszy".
+
+ 3. Wcinij y aby kopiowa (yankowa) podwietlony tekst.
+
+ 4. Przenie kursor do koca nastpnej linii: j$
+
+ 5. Wcinij p aby wklei (wpakowa) tekst. Dodaj: a drugi<ESC> .
+
+ 6. Uyj trybu Wizualnego, aby wybra " element.", yankuj go y , przejd do
+ koca nastpnej linii j$ i upakuj tam tekst z p .
+
+---> a) to jest pierwszy element.
+ b)
+Uwaga: moesz uy y jako operatora; yw kopiuje jeden wyraz.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.5.: USTAWIANIE OPCJI
+
+
+** Ustawianie opcji tak, by szukaj lub substytucja ignoroway wielko liter **
+
+ 1. Szukaj 'ignore' wpisujc: /ignore<ENTER>
+ Powtrz szukanie kilka razy naciskajc klawisz n .
+
+ 2. Ustaw opcj 'ic' (Ignore case -- ignoruj wielko liter) poprzez
+ wpisanie: :set ic
+
+ 3. Teraz szukaj 'ignore' ponownie wciskajc: n
+ Zauwa, e Ignore i IGNORE take s teraz znalezione.
+
+ 4. Ustaw opcje 'hlsearch' i 'incsearch': :set hls is
+
+ 5. Teraz wprowad polecenie szukaj ponownie i zobacz co si zdarzy:
+ /ignore<ENTER>
+
+ 6. Aby wyczy ignorowanie wielkoci liter: :set noic
+
+Uwaga: Aby usun podwietlanie dopasowa, wpisz: :nohlsearch
+Uwaga: Aby ignorowa wielko liter dla jednego wyszukiwania: /ignore\c<ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 6. PODSUMOWANIE
+
+
+ 1. Wpisanie o otwiera lini PONIEJ kursora.
+ Wpisanie O otwiera lini POWYEJ kursora.
+
+ 2. Wpisanie a wstawia tekst ZA znakiem, na ktrym jest kursor.
+ Wpisanie A dodaje tekst na kocu linii.
+
+ 3. Polecenie e przenosi do koca wyrazu.
+ 4. Operator y yankuje (kopiuje) tekst, p pakuje (wkleja) go.
+ 5. Wpisanie wielkiego R wprowadza w tryb Replace (zamiana) dopki
+ nie zostanie wcinity <ESC>.
+ 6. Wpisanie ":set xxx" ustawia opcj "xxx". Niektre opcje:
+ 'ic' 'ignorecase' ignoruj wielko znakw
+ 'is' 'incsearch' poka czciowe dopasowania
+ 'hls' 'hlsearch' podwietl wszystkie dopasowania
+ Moesz uy zarwno dugiej, jak i krtkiej formy.
+ 7. Dodaj "no", aby wyczy opcj: :set noic
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 7.1. JAK UZYSKA POMOC?
+
+ ** Uycie systemu pomocy on-line **
+
+ Vim posiada bardzo dobry system pomocy on-line. By zacz, sprbuj jednej
+ z trzech moliwoci:
+ - wcinij klawisz <HELP> (jeli taki masz)
+ - wcinij klawisz <F1> (jeli taki masz)
+ - wpisz :help<ENTER>
+
+ Przeczytaj tekst w oknie pomocy, aby dowiedzie si jak dziaa pomoc.
+ wpisz CTRL-W CTRL-W aby przeskoczy z jednego okna do innego
+ wpisz :q<ENTER> aby zamkn okno pomocy.
+
+ Moesz te znale pomoc na kady temat podajc argument polecenia ":help".
+ Sprbuj tych (nie zapomnij wcisn <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 7.2. TWORZENIE SKRYPTU STARTOWEGO
+
+ ** Wcz moliwoci Vima **
+
+ Vim ma o wiele wicej moliwoci ni Vi, ale wikszo z nich jest domylnie
+ wyczona. Jeli chcesz wczy te moliwoci na starcie musisz utworzy
+ plik "vimrc".
+
+ 1. Pocztek edycji pliku "vimrc" zaley od Twojego systemu:
+ :edit ~/.vimrc dla Uniksa
+ :edit ~/_vimrc dla MS-Windows
+ 2. Teraz wczytaj przykadowy plik "vimrc":
+ :read $VIMRUNTIME/vimrc_example.vim
+ 3. Zapisz plik:
+ :w
+
+ Nastpnym razem, gdy zaczniesz prac w Vimie bdzie on uywa podwietlania
+ skadni. Moesz doda wszystkie swoje ulubione ustawienia do tego pliku
+ "vimrc".
+ Aby uzyska wicej informacji, wpisz :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 7.3.: UZUPENIANIE
+
+
+ ** Uzupenianie linii polece z CTRL-D i <TAB> **
+
+ 1. Upewnij si, e Vim nie jest w trybie kompatybilnoci: :set nocp
+
+ 2. Zerknij, jakie pliki s w biecym katalogu: :!ls lub :!dir
+
+ 3. Wpisz pocztek polecenia: :e
+
+ 4. Wcinij CTRL-D i Vim pokae list polece, jakie zaczynaj si na "e".
+
+ 5. Wcinij <TAB> i Vim uzupeni polecenie do ":edit".
+
+ 6. Dodaj spacj i zacznij wpisywa nazw istniejcego pliku: :edit FIL
+
+ 7. Wcinij <TAB>. Vim uzupeni nazw (jeli jest niepowtarzalna).
+
+UWAGA: Uzupenianie dziaa dla wielu polece. Sprbuj wcisn CTRL-D i <TAB>.
+ Uyteczne zwaszcza przy :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 7. PODSUMOWANIE
+
+
+ 1. Wpisz :help albo wcinij <F1> lub <Help> aby otworzy okno pomocy.
+
+ 2. Wpisz :help cmd aby uzyska pomoc o cmd .
+
+ 3. Wpisz CTRL-W CTRL-W aby przeskoczy do innego okna.
+
+ 4. Wpisz :q aby zamkn okno pomocy.
+
+ 5. Utwrz plik startowy vimrc aby zachowa wybrane ustawienia.
+
+ 6. Po poleceniu : , wcinij CTRL-D aby zobaczy moliwe uzupenienia.
+ Wcinij <TAB> aby uy jednego z nich.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Tutaj si koczy tutorial Vima. Zosta on pomylany tak, aby da krtki
+ przegld jego moliwoci, wystarczajcy by mg go uywa. Jest on
+ daleki od kompletnoci, poniewa Vim ma o wiele, wiele wicej polece.
+
+ Dla dalszej nauki rekomendujemy ksik:
+ Vim - Vi Improved - autor Steve Oualline
+ Wydawca: New Riders
+ Pierwsza ksika cakowicie powicona Vimowi. Uyteczna zwaszcza dla
+ pocztkujcych. Zawiera wiele przykadw i ilustracji.
+ Zobacz https://iccf-holland.org./click5.html
+
+ Starsza pozycja i bardziej o Vi ni o Vimie, ale take warta
+ polecenia:
+ Learning the Vi Editor - autor Linda Lamb
+ Wydawca: O'Reilly & Associates Inc.
+ To dobra ksika, by dowiedzie si niemal wszystkiego, co chciaby zrobi
+ z Vi. Szsta edycja zawiera te informacje o Vimie.
+
+ Po polsku wydano:
+ Edytor vi. Leksykon kieszonkowy - autor Arnold Robbins
+ Wydawca: Helion 2001 (O'Reilly).
+ ISBN: 83-7197-472-8
+ http://helion.pl/ksiazki/vilek.htm
+ Jest to ksieczka zawierajca spis polece vi i jego najwaniejszych
+ klonw (midzy innymi Vima).
+
+ Edytor vi - autorzy Linda Lamb i Arnold Robbins
+ Wydawca: Helion 2001 (O'Reilly) - wg 6. ang. wydania
+ ISBN: 83-7197-539-2
+ http://helion.pl/ksiazki/viedyt.htm
+ Rozszerzona wersja Learning the Vi Editor w polskim tumaczeniu.
+
+ Ten tutorial zosta napisany przez Michaela C. Pierce'a i Roberta K. Ware'a,
+ Colorado School of Mines korzystajc z pomocy Charlesa Smitha,
+ Colorado State University.
+ E-mail: bware@mines.colorado.edu.
+
+ Zmodyfikowane dla Vima przez Brama Moolenaara.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Przetumaczone przez Mikoaja Machowskiego,
+ Sierpie 2001,
+ rev. Marzec 2002
+ 2nd rev. Wrzesie 2004
+ 3rd rev. Marzec 2006
+ 4th rev. Grudzie 2008
+ Wszelkie uwagi prosz kierowa na: mikmach@wp.pl
diff --git a/runtime/tutor/tutor.pl.utf-8 b/runtime/tutor/tutor.pl.utf-8
new file mode 100644
index 0000000..7856837
--- /dev/null
+++ b/runtime/tutor/tutor.pl.utf-8
@@ -0,0 +1,995 @@
+===============================================================================
+= W i t a j w t u t o r i a l u V I M - a - Wersja 1.7. =
+===============================================================================
+
+ Vim to potężny edytor, który posiada wiele poleceń, zbyt dużo, by
+ wyjaśnić je wszystkie w tym tutorialu. Ten przewodnik ma nauczyć
+ Cię posługiwać się wystarczająco wieloma komendami, byś mógł łatwo
+ używać Vima jako edytora ogólnego przeznaczenia.
+
+ Czas potrzebny na ukończenie tutoriala to 25 do 30 minut i zależy
+ od tego jak wiele czasu spędzisz na eksperymentowaniu.
+
+ UWAGA:
+ Polecenia wykonywane w czasie lekcji zmodyfikują tekst. Zrób
+ wcześniej kopię tego pliku do ćwiczeń (jeśli zacząłeś komendą
+ "vimtutor", to już pracujesz na kopii).
+
+ Pamiętaj, że przewodnik ten został zaprojektowany do nauki poprzez
+ ćwiczenia. Oznacza to, że musisz wykonywać polecenia, by nauczyć się ich
+ prawidłowo. Jeśli będziesz jedynie czytał tekst, szybko zapomnisz wiele
+ poleceń!
+
+ Teraz upewnij się, że nie masz wciśniętego Caps Locka i wciskaj j
+ tak długo dopóki Lekcja 1.1. nie wypełni całkowicie ekranu.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.1.: PORUSZANIE SIĘ KURSOREM
+
+ ** By wykonać ruch kursorem, wciśnij h, j, k, l jak pokazano. **
+
+ ^
+ k Wskazówka: h jest po lewej
+ < h l > l jest po prawej
+ j j wygląda jak strzałka w dół
+ v
+ 1. Poruszaj kursorem dopóki nie będziesz pewien, że pamiętasz polecenia.
+
+ 2. Trzymaj j tak długo aż będzie się powtarzał.
+ Teraz wiesz jak dojść do następnej lekcji.
+
+ 3. Używając strzałki w dół przejdź do następnej lekcji.
+
+Uwaga: Jeśli nie jesteś pewien czegoś co wpisałeś, wciśnij <ESC>, by wrócić do
+ trybu Normal. Wtedy powtórz polecenie.
+
+Uwaga: Klawisze kursora także powinny działać, ale używając hjkl będziesz
+ w stanie poruszać się o wiele szybciej, jak się tylko przyzwyczaisz.
+ Naprawdę!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.2.: WYCHODZENIE Z VIM-a
+
+ !! UWAGA: Przed wykonaniem jakiegokolwiek polecenia przeczytaj całą lekcję !!
+
+ 1. Wciśnij <ESC> (aby upewnić się, że jesteś w trybie Normal).
+ 2. Wpisz: :q!<ENTER>.
+ To spowoduje wyjście z edytora PORZUCAJĄC wszelkie zmiany, jakie
+ zdążyłeś zrobić. Jeśli chcesz zapamiętać zmiany i wyjść,
+ wpisz: :wq<ENTER>
+
+ 3. Kiedy widzisz znak zachęty powłoki wpisz komendę, żeby wrócić
+ do tutoriala. Czyli: vimtutor<ENTER>
+
+ 4. Jeśli chcesz zapamiętać polecenia, wykonaj kroki 1. do 3., aby
+ wyjść i wrócić do edytora.
+
+UWAGA: :q!<ENTER> porzuca wszelkie zmiany jakie zrobiłeś. W następnych
+ lekcjach dowiesz się jak je zapamiętywać.
+
+ 5. Przenieś kursor do lekcji 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.3.: EDYCJA TEKSTU - KASOWANIE
+
+ ** Wciśnij x aby usunąć znak pod kursorem. **
+
+ 1. Przenieś kursor do linii poniżej oznaczonej --->.
+
+ 2. By poprawić błędy, naprowadź kursor na znak do usunięcia.
+
+ 3. Wciśnij x aby usunąć niechciany znak.
+
+ 4. Powtarzaj kroki 2. do 4. dopóki zdanie nie jest poprawne.
+
+---> Kkrowa prrzeskoczyła prrzez ksiiężycc.
+
+ 5. Teraz, kiedy zdanie jest poprawione, przejdź do Lekcji 1.4.
+
+UWAGA: Ucz się przez ćwiczenie, nie wkuwanie.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.4.: EDYCJA TEKSTU - INSERT (wprowadzanie)
+
+
+ ** Wciśnij i aby wstawić tekst. **
+
+ 1. Przenieś kursor do pierwszej linii poniżej oznaczonej --->.
+
+ 2. Aby poprawić pierwszy wiersz, ustaw kursor na pierwszym znaku PO tym,
+ gdzie tekst ma być wstawiony.
+
+ 3. Wciśnij i a następnie wpisz konieczne poprawki.
+
+ 4. Po poprawieniu błędu wciśnij <ESC>, by wrócić do trybu Normal.
+ Powtarzaj kroki 2. do 4., aby poprawić całe zdanie.
+
+---> W tej brkje trochę .
+---> W tej linii brakuje trochę tekstu.
+
+ 5. Kiedy czujesz się swobodnie wstawiając tekst, przejdź do
+ podsumowania poniżej.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.5.: EDYCJA TEKSTU - APPENDING (dodawanie)
+
+
+ ** Wciśnij A by dodać tekst. **
+
+ 1. Przenieś kursor do pierwszej linii poniżej oznaczonej --->.
+ Nie ma znaczenia, który to będzie znak.
+
+ 2. Wciśnij A i wpisz odpowiednie dodatki.
+
+ 3. Kiedy tekst został dodany, wciśnij <ESC> i wróć do trybu Normalnego.
+
+ 4. Przenieś kursor do drugiej linii oznaczonej ---> i powtórz kroki 2. i 3.,
+ aby poprawić zdanie.
+
+---> Brakuje tu tro
+ Brakuje tu trochę tekstu.
+---> Tu też trochę bra
+ Tu też trochę brakuje.
+
+ 5. Kiedy już utrwaliłeś ćwiczenie, przejdź do lekcji 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 1.6.: EDYCJA PLIKU
+
+ ** Użyj :wq aby zapisać plik i wyjść. **
+
+ !! UWAGA: zanim wykonasz jakiekolwiek polecenia przeczytaj całą lekcję !!
+
+ 1. Zakończ tutorial tak jak w lekcji 1.2.: :q!
+ lub, jeśli masz dostęp do innego terminala, wykonaj kolejne kroki tam.
+
+ 2. W powłoce wydaj polecenie: vim tutor<ENTER>
+ "vim" jest poleceniem uruchamiającym edytor Vim. 'tutor' to nazwa pliku,
+ jaki chcesz edytować. Użyj pliku, który może zostać zmieniony.
+
+ 3. Dodaj i usuń tekst tak, jak się nauczyłeś w poprzednich lekcjach.
+
+ 4. Zapisz plik ze zmianami i opuść Vima: :wq<ENTER>
+
+ 5. Jeśli zakończyłeś vimtutor w kroku 1., uruchom go ponownie i przejdź
+ do podsumowania poniżej.
+
+ 6. Po przeczytaniu wszystkich kroków i ich zrozumieniu: wykonaj je.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 1. PODSUMOWANIE
+
+ 1. Poruszasz kursorem używając "strzałek" i klawiszy hjkl .
+ h (w lewo) j (w dół) k (do góry) l (w prawo)
+
+ 2. By wejść do Vima, (z powłoki) wpisz:
+ vim NAZWA_PLIKU<ENTER>
+
+ 3. By wyjść z Vima, wpisz:
+ <ESC> :q!<ENTER> by usunąć wszystkie zmiany.
+ LUB: <ESC> :wq<ENTER> by zmiany zachować.
+
+ 4. By usunąć znak pod kursorem, wciśnij: x
+
+ 5. By wstawić tekst przed kursorem lub dodać:
+ i wpisz tekst <ESC> wstawi przed kursorem
+ A wpisz tekst <ESC> doda na końcu linii
+
+UWAGA: Wciśnięcie <ESC> przeniesie Cię z powrotem do trybu Normal
+ lub odwoła niechciane lub częściowo wprowadzone polecenia.
+
+Teraz możemy kontynuować i przejść do Lekcji 2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.1.: POLECENIE DELETE (usuwanie)
+
+
+ ** Wpisz dw by usunąć wyraz. **
+
+ 1. Wciśnij <ESC>, by upewnić się, że jesteś w trybie Normal.
+
+ 2. Przenieś kursor do linii poniżej oznaczonej --->.
+
+ 3. Przesuń kursor na początek wyrazu, który chcesz usunąć.
+
+ 4. Wpisz dw by usunąć wyraz.
+
+ UWAGA: Litera d pojawi się na dole ekranu. Vim czeka na wpisanie w .
+ Jeśli zobaczysz inny znak, oznacza to, że wpisałeś coś źle; wciśnij
+ <ESC> i zacznij od początku.
+
+---> Jest tu parę papier wyrazów, które kamień nie należą do nożyce tego zdania.
+
+ 5. Powtarzaj kroki 3. i 4. dopóki zdanie nie będzie poprawne, potem
+ przejdź do Lekcji 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.2.: WIĘCEJ POLECEŃ USUWAJĄCYCH
+
+
+ ** Wpisz d$ aby usunąć tekst do końca linii. **
+
+ 1. Wciśnij <ESC> aby się upewnić, że jesteś w trybie Normal.
+
+ 2. Przenieś kursor do linii poniżej oznaczonej --->.
+
+ 3. Przenieś kursor do końca poprawnego zdania (PO pierwszej . ).
+
+ 4. Wpisz d$ aby usunąć resztę linii.
+
+---> Ktoś wpisał koniec tego zdania dwukrotnie. zdania dwukrotnie.
+
+
+ 5. Przejdź do Lekcji 2.3., by zrozumieć co się stało.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.3.: O OPERATORACH I RUCHACH
+
+
+ Wiele poleceń zmieniających tekst jest złożonych z operatora i ruchu.
+ Format dla polecenia usuwającego z operatorem d jest następujący:
+
+ d ruch
+
+ gdzie:
+ d - operator usuwania.
+ ruch - na czym polecenie będzie wykonywane (lista poniżej).
+
+ Krótka lista ruchów:
+ w - do początku następnego wyrazu WYŁĄCZAJĄC pierwszy znak.
+ e - do końca bieżącego wyrazu, WŁĄCZAJĄC ostatni znak.
+ $ - do końca linii, WŁĄCZAJĄC ostatni znak.
+
+W ten sposób wpisanie de usunie znaki od kursora do końca wyrazu.
+
+UWAGA: Wpisanie tylko ruchu w trybie Normal bez operatora przeniesie kursor
+ tak, jak to określono.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.4.: UŻYCIE MNOŻNIKA DLA RUCHU
+
+
+ ** Wpisanie liczby przed ruchem powtarza ruch odpowiednią ilość razy. **
+
+ 1. Przenieś kursor na początek linii poniżej zaznaczonej --->.
+
+ 2. Wpisz 2w aby przenieść kursor o dwa wyrazy do przodu.
+
+ 3. Wpisz 3e aby przenieść kursor do końca trzeciego wyrazu w przód.
+
+ 4. Wpisz 0 (zero), aby przenieść kursor na początek linii.
+
+ 5. Powtórz kroki 2. i 3. z innymi liczbami.
+
+
+ ---> To jest zwykły wiersz z wyrazami, po których możesz się poruszać.
+
+ 6. Przejdź do lekcji 2.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.5.: UŻYCIE MNOŻNIKA, BY WIĘCEJ USUNĄĆ
+
+
+ ** Wpisanie liczby z operatorem powtarza go odpowiednią ilość razy. **
+
+ W wyżej wspomnianej kombinacji operatora usuwania i ruchu podaj mnożnik
+ przed ruchem, by więcej usunąć:
+ d liczba ruch
+
+ 1. Przenieś kursor do pierwszego wyrazu KAPITALIKAMI w linii zaznaczonej --->.
+
+ 2. Wpisz 2dw aby usunąć dwa wyrazy KAPITALIKAMI.
+
+ 3. Powtarzaj kroki 1. i 2. z innymi mnożnikami, aby usunąć kolejne wyrazy
+ KAPITALIKAMI jednym poleceniem
+
+---> ta ASD WE linia QWE ASDF ZXCV FG wyrazów została ERT FGH CF oczyszczona.
+
+UWAGA: Mnożnik pomiędzy operatorem d i ruchem działa podobnie do ruchu bez
+ operatora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.6.: OPEROWANIE NA LINIACH
+
+
+ ** Wpisz dd aby usunąć całą linię. **
+
+ Z powodu częstości usuwania całych linii, projektanci Vi zdecydowali, że
+ będzie łatwiej wpisać dwa razy d aby usunąć linię.
+
+ 1. Przenieś kursor do drugiego zdania z wierszyka poniżej.
+ 2. Wpisz dd aby usunąć wiersz.
+ 3. Teraz przenieś się do czwartego wiersza.
+ 4. Wpisz 2dd aby usunąć dwa wiersze.
+
+---> 1) Róże są czerwone,
+---> 2) Błoto jest fajne,
+---> 3) Fiołki są niebieskie,
+---> 4) Mam samochód,
+---> 5) Zegar podaje czas,
+---> 6) Cukier jest słodki,
+---> 7) I ty też.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 2.7.: POLECENIE UNDO (cofnij)
+
+
+ ** Wciśnij u aby cofnąć skutki ostatniego polecenia.
+ U zaś, by cofnąć skutki dla całej linii. **
+
+ 1. Przenieś kursor do zdania poniżej oznaczonego ---> i umieść go na
+ pierwszym błędzie.
+ 2. Wpisz x aby usunąć pierwszy niechciany znak.
+ 3. Teraz wciśnij u aby cofnąć skutki ostatniego polecenia.
+ 4. Tym razem popraw wszystkie błędy w linii używając polecenia x .
+ 5. Teraz wciśnij wielkie U aby przywrócić linię do oryginalnego stanu.
+ 6. Teraz wciśnij u kilka razy, by cofnąć U i poprzednie polecenia.
+ 7. Teraz wpisz CTRL-R (trzymaj równocześnie wciśnięte klawisze CTRL i R)
+ kilka razy, by cofnąć cofnięcia.
+
+---> Poopraw błędyyy w teej liniii i zaamiień je prrzez coofnij.
+
+ 8. To są bardzo pożyteczne polecenia.
+
+ Przejdź teraz do podsumowania Lekcji 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 2. PODSUMOWANIE
+
+
+ 1. By usunąć znaki od kursora do następnego wyrazu, wpisz: dw
+ 2. By usunąć znaki od kursora do końca linii, wpisz: d$
+ 3. By usunąć całą linię: dd
+ 4. By powtórzyć ruch, poprzedź go liczbą: 2w
+ 5. Format polecenia zmiany to:
+ operator [liczba] ruch
+ gdzie:
+ operator - to, co trzeba zrobić (np. d dla usuwania)
+ [liczba] - opcjonalne, ile razy powtórzyć ruch
+ ruch - przenosi nad tekstem do operowania, takim jak w (wyraz),
+ $ (do końca linii) etc.
+
+ 6. By przejść do początku linii, użyj zera: 0
+ 7. By cofnąć poprzednie polecenie, wpisz: u (małe u)
+ By cofnąć wszystkie zmiany w linii, wpisz: U (wielkie U)
+ By cofnąć cofnięcie, wpisz: CTRL-R
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.1.: POLECENIE PUT (wstaw)
+
+
+ ** Wpisz p by wstawić ostatnie usunięcia za kursorem. **
+
+ 1. Przenieś kursor do pierwszej linii ---> poniżej.
+
+ 2. Wpisz dd aby usunąć linię i przechować ją w rejestrze Vima.
+
+ 3. Przenieś kursor do linii c), POWYŻEJ tej, gdzie usunięta linia powinna
+ się znajdować.
+
+ 4. Wciśnij p by wstawić linię poniżej kursora.
+
+ 5. Powtarzaj kroki 2. do 4. aż znajdą się w odpowiednim porządku.
+
+---> d) Jak dwa aniołki.
+---> b) Na dole fiołki,
+---> c) A my się kochamy,
+---> a) Na górze róże,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.2.: POLECENIE REPLACE (zastąp)
+
+
+ ** Wpisz rx aby zastąpić znak pod kursorem na x . **
+
+ 1. Przenieś kursor do pierwszej linii poniżej oznaczonej --->
+
+ 2. Ustaw kursor na pierwszym błędzie.
+
+ 3. Wpisz r a potem znak jaki powinien go zastąpić.
+
+ 4. Powtarzaj kroki 2. i 3. dopóki pierwsza linia nie będzie taka, jak druga.
+
+---> Kjedy ten wiersz bił wstókiwany, ktoś wciznął perę złych klawirzy!
+---> Kiedy ten wiersz był wstukiwany, ktoś wcisnął parę złych klawiszy!
+
+ 5. Teraz czas na Lekcję 3.3.
+
+
+UWAGA: Pamiętaj, by uczyć się ćwicząc, a nie pamięciowo.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.3.: OPERATOR CHANGE (zmień)
+
+ ** By zmienić do końca wyrazu, wpisz ce . **
+
+ 1. Przenieś kursor do pierwszej linii poniżej oznaczonej --->.
+
+ 2. Umieść kursor na u w lunos.
+
+ 3. Wpisz ce i popraw wyraz (w tym wypadku wstaw inia ).
+
+ 4. Wciśnij <ESC> i przejdź do następnej planowanej zmiany.
+
+ 5. Powtarzaj kroki 3. i 4. dopóki pierwsze zdanie nie będzie takie same,
+ jak drugie.
+
+---> Ta lunos ma pire słów, które tżina zbnic użifajonc pcmazu zmień.
+---> Ta linia ma parę słów, które trzeba zmienić używając polecenia zmień.
+
+ Zauważ, że ce nie tylko zamienia wyraz, ale także zmienia tryb na
+ Insert (wprowadzanie).
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 3.4.: WIĘCEJ ZMIAN UŻYWAJĄC c
+
+
+ ** Polecenie change używa takich samych ruchów, jak delete. **
+
+ 1. Operator change działa tak samo, jak delete. Format wygląda tak:
+
+ c [liczba] ruch
+
+ 2. Ruchy są także takie same, np.: w (wyraz), $ (koniec linii) etc.
+
+ 3. Przenieś się do pierwszej linii poniżej oznaczonej --->
+
+ 4. Ustaw kursor na pierwszym błędzie.
+
+ 5. Wpisz c$ , popraw koniec wiersza i wciśnij <ESC>.
+
+---> Koniec tego wiersza musi być poprawiony, aby wyglądał tak, jak drugi.
+---> Koniec tego wiersza musi być poprawiony używając polecenia c$ .
+
+UWAGA: Możesz używać <BS> aby poprawiać błędy w czasie pisania.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 3. PODSUMOWANIE
+
+
+ 1. Aby wstawić tekst, który został wcześniej usunięty wciśnij p . To
+ polecenie wstawia skasowany tekst PO kursorze (jeśli cała linia
+ została usunięta, zostanie ona umieszczona w linii poniżej kursora).
+
+ 2. By zamienić znak pod kursorem, wciśnij r a potem znak, który ma zastąpić
+ oryginalny.
+
+ 3. Operator change pozwala Ci na zastąpienie od kursora do miejsca, gdzie
+ zabrałby Cię ruch. Np. wpisz ce aby zamienić tekst od kursora do końca
+ wyrazu, c$ aby zmienić tekst do końca linii.
+
+ 4. Format do polecenia change (zmień):
+
+ c [liczba] obiekt
+
+ Teraz przejdź do następnej lekcji.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.1.: POŁOŻENIE KURSORA ORAZ STATUS PLIKU
+
+ ** Naciśnij CTRL-G aby zobaczyć swoje położenie w pliku i status
+ pliku. Naciśnij G aby przejść do linii w pliku. **
+
+ UWAGA: Przeczytaj całą lekcję zanim wykonasz jakieś polecenia!!!
+
+ 1. Przytrzymaj klawisz CTRL i wciśnij g . Używamy notacji CTRL-G.
+ Na dole strony pojawi się pasek statusu z nazwą pliku i pozycją w pliku.
+ Zapamiętaj numer linii dla potrzeb kroku 3.
+
+UWAGA: Możesz też zobaczyć pozycję kursora w prawym, dolnym rogu ekranu.
+ Dzieje się tak kiedy ustawiona jest opcja 'ruler' (więcej w lekcji 6.).
+
+ 2. Wciśnij G aby przejść na koniec pliku.
+ Wciśnij gg aby przejść do początku pliku.
+
+ 3. Wpisz numer linii, w której byłeś a potem G . To przeniesie Cię
+ z powrotem do linii, w której byłeś kiedy wcisnąłeś CTRL-G.
+
+ 4. Jeśli czujesz się wystarczająco pewnie, wykonaj kroki 1-3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.2.: POLECENIE SZUKAJ
+
+
+ ** Wpisz / a następnie wyrażenie, aby je znaleźć. **
+
+ 1. W trybie Normal wpisz / . Zauważ, że znak ten oraz kursor pojawią
+ się na dole ekranu tak samo, jak polecenie : .
+
+ 2. Teraz wpisz błond<ENTER> . To jest słowo, którego chcesz szukać.
+
+ 3. By szukać tej samej frazy ponownie, po prostu wciśnij n .
+ Aby szukać tej frazy w przeciwnym, kierunku wciśnij N .
+
+ 4. Jeśli chcesz szukać frazy do tyłu, użyj polecenia ? zamiast / .
+
+ 5. Aby wrócić gdzie byłeś, wciśnij CTRL-O. Powtarzaj, by wrócić dalej. CTRL-I
+ idzie do przodu.
+
+Uwaga: 'błond' to nie jest metoda, by przeliterować błąd; 'błond' to błąd.
+Uwaga: Kiedy szukanie osiągnie koniec pliku, będzie kontynuowane od początku
+ o ile opcja 'wrapscan' nie została przestawiona.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.3.: W POSZUKIWANIU PARUJĄCYCH NAWIASÓW
+
+
+ ** Wpisz % by znaleźć parujący ), ], lub } . **
+
+ 1. Umieść kursor na którymś z (, [, lub { w linii poniżej oznaczonej --->.
+
+ 2. Teraz wpisz znak % .
+
+ 3. Kursor powinien się znaleźć na parującym nawiasie.
+
+ 4. Wciśnij % aby przenieść kursor z powrotem do parującego nawiasu.
+
+ 5. Przenieś kursor do innego (,),[,],{ lub } i zobacz co robi % .
+
+---> To ( jest linia testowa z (, [, ] i {, } . ))
+
+Uwaga: Ta funkcja jest bardzo użyteczna w debuggowaniu programu
+ z niesparowanymi nawiasami!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 4.4.: POLECENIE SUBSTITUTE (zamiana)
+
+
+ ** Wpisz :s/stary/nowy/g aby zamienić 'stary' na 'nowy'. **
+
+ 1. Przenieś kursor do linii poniżej oznaczonej --->.
+
+ 2. Wpisz :s/czaas/czas<ENTER> . Zauważ, że to polecenie zmienia
+ tylko pierwsze wystąpienie 'czaas' w linii.
+
+ 3. Teraz wpisz :s/czaas/czas/g . Dodane g oznacza zamianę (substytucję)
+ globalnie w całej linii. Zmienia wszystkie wystąpienia 'czaas' w linii.
+
+---> Najlepszy czaas na zobaczenie najładniejszych kwiatów to czaas wiosny.
+
+ 4. Aby zmienić wszystkie wystąpienia łańcucha znaków pomiędzy dwoma liniami,
+ wpisz: :#,#s/stare/nowe/g gdzie #,# są numerami linii ograniczających
+ region, gdzie ma nastąpić zamiana.
+ wpisz :%s/stare/nowe/g by zmienić wszystkie wystąpienia w całym pliku.
+ wpisz :%s/stare/nowe/gc by zmienić wszystkie wystąpienia w całym
+ pliku, prosząc o potwierdzenie za każdym razem.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 4. PODSUMOWANIE
+
+ 1. CTRL-G pokaże Twoją pozycję w pliku i status pliku. SHIFT-G przenosi
+ Cię do końca pliku.
+ G przenosi do końca pliku.
+ liczba G przenosi do linii [liczba].
+ gg przenosi do pierwszej linii.
+
+ 2. Wpisanie / a następnie łańcucha znaków szuka łańcucha DO PRZODU.
+ Wpisanie ? a następnie łańcucha znaków szuka łańcucha DO TYŁU.
+ Po wyszukiwaniu wciśnij n by znaleźć następne wystąpienie szukanej
+ frazy w tym samym kierunku lub N by szukać w kierunku przeciwnym.
+ CTRL-O przenosi do starszych pozycji, CTRL-I do nowszych.
+
+ 3. Wpisanie % gdy kursor znajduje się na (,),[,],{, lub } lokalizuje
+ parujący znak.
+
+ 4. By zamienić pierwszy stary na nowy w linii, wpisz :s/stary/nowy
+ By zamienić wszystkie stary na nowy w linii, wpisz :s/stary/nowy/g
+ By zamienić frazy pomiędzy dwoma liniami # wpisz :#,#s/stary/nowy/g
+ By zamienić wszystkie wystąpienia w pliku, wpisz :%s/stary/nowy/g
+ By Vim prosił Cię o potwierdzenie, dodaj 'c' :%s/stary/nowy/gc
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.1.: JAK WYKONAĆ POLECENIA ZEWNĘTRZNE?
+
+
+ ** Wpisz :! a następnie zewnętrzne polecenie, by je wykonać. **
+
+ 1. Wpisz znajome polecenie : by ustawić kursor na dole ekranu. To pozwala
+ na wprowadzenie komendy linii poleceń.
+
+ 2. Teraz wstaw ! (wykrzyknik). To umożliwi Ci wykonanie dowolnego
+ zewnętrznego polecenia powłoki.
+
+ 3. Jako przykład wpisz ls za ! a następnie wciśnij <ENTER>. To polecenie
+ pokaże spis plików w Twoim katalogu, tak jakbyś był przy znaku zachęty
+ powłoki. Możesz też użyć :!dir jeśli ls nie działa.
+
+Uwaga: W ten sposób można wykonać wszystkie polecenia powłoki.
+Uwaga: Wszystkie polecenia : muszą być zakończone <ENTER>.
+ Od tego momentu nie zawsze będziemy o tym wspominać.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.2.: WIĘCEJ O ZAPISYWANIU PLIKÓW
+
+
+ ** By zachować zmiany w tekście, wpisz :w NAZWA_PLIKU . **
+
+ 1. Wpisz :!dir lub :!ls by zobaczyć spis plików w katalogu.
+ Już wiesz, że musisz po tym wcisnąć <ENTER>.
+
+ 2. Wybierz nazwę pliku, jaka jeszcze nie istnieje, np. TEST.
+
+ 3. Teraz wpisz: :w TEST (gdzie TEST jest nazwą pliku jaką wybrałeś.)
+
+ 4. To polecenie zapamięta cały plik (Vim Tutor) pod nazwą TEST.
+ By to sprawdzić, wpisz :!dir lub :!ls żeby znowu zobaczyć listę plików.
+
+Uwaga: Zauważ, że gdybyś teraz wyszedł z Vima, a następnie wszedł ponownie
+ poleceniem vim TEST , plik byłby dokładną kopią tutoriala, kiedy go
+ zapisywałeś.
+
+ 5. Teraz usuń plik wpisując (MS-DOS): :!del TEST
+ lub (Unix): :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.3.: WYBRANIE TEKSTU DO ZAPISU
+
+
+ ** By zachować część pliku, wpisz v ruch :w NAZWA_PLIKU **
+
+ 1. Przenieś kursor do tego wiersza.
+
+ 2. Wciśnij v i przenieś kursor do punktu 5. Zauważ, że tekst został
+ podświetlony.
+
+ 3. Wciśnij znak : . Na dole ekranu pojawi się :'<,'> .
+
+ 4. Wpisz w TEST , gdzie TEST to nazwa pliku, który jeszcze nie istnieje.
+ Upewnij się, że widzisz :'<,'>w TEST zanim wciśniesz Enter.
+
+ 5. Vim zapisze wybrane linie do pliku TEST. Użyj :!dir lub :!ls , żeby to
+ zobaczyć. Jeszcze go nie usuwaj! Użyjemy go w następnej lekcji.
+
+UWAGA: Wciśnięcie v zaczyna tryb Wizualny. Możesz poruszać kursorem, by
+ zmienić rozmiary zaznaczenia. Możesz też użyć operatora, by zrobić coś
+ z tekstem. Na przykład d usuwa tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 5.4.: WSTAWIANIE I ŁĄCZENIE PLIKÓW
+
+
+ ** By wstawić zawartość pliku, wpisz :r NAZWA_PLIKU **
+
+ 1. Umieść kursor tuż powyżej tej linii.
+
+UWAGA: Po wykonaniu kroku 2. zobaczysz tekst z Lekcji 5.3. Potem przejdź
+ do DOŁU, by zobaczyć ponownie tę lekcję.
+
+ 2. Teraz wczytaj plik TEST używając polecenia :r TEST , gdzie TEST
+ jest nazwą pliku.
+ Wczytany plik jest umieszczony poniżej linii z kursorem.
+
+ 3. By sprawdzić czy plik został wczytany, cofnij kursor i zobacz, że
+ teraz są dwie kopie Lekcji 5.3., oryginał i kopia z pliku.
+
+UWAGA: Możesz też wczytać wyjście zewnętrznego polecenia. Na przykład
+ :r !ls wczytuje wyjście polecenia ls i umieszcza je pod poniżej
+ kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 5. PODSUMOWANIE
+
+
+ 1. :!polecenie wykonuje polecenie zewnętrzne.
+
+ Użytecznymi przykładami są:
+
+ :!dir - pokazuje spis plików w katalogu.
+
+ :!rm NAZWA_PLIKU - usuwa plik NAZWA_PLIKU.
+
+ 2. :w NAZWA_PLIKU zapisuje obecny plik Vima na dysk z nazwą NAZWA_PLIKU.
+
+ 3. v ruch :w NAZWA_PLIKU zapisuje Wizualnie wybrane linie do NAZWA_PLIKU.
+
+ 4. :r NAZWA_PLIKU wczytuje z dysku plik NAZWA_PLIKU i wstawia go do
+ bieżącego pliku poniżej kursora.
+
+ 5. :r !dir wczytuje wyjście polecenia dir i umieszcza je poniżej kursora.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.1.: POLECENIE OPEN (otwórz)
+
+
+ ** Wpisz o by otworzyć linię poniżej kursora i przenieść się do
+ trybu Insert (wprowadzanie). **
+
+ 1. Przenieś kursor do linii poniżej oznaczonej --->.
+
+ 2. Wpisz o (małe), by otworzyć linię PONIŻEJ kursora i przenieść się
+ do trybu Insert (wprowadzanie).
+
+ 3. Wpisz trochę tekstu i wciśnij <ESC> by wyjść z trybu Insert (wprowadzanie).
+
+---> Po wciśnięciu o kursor znajdzie się w otwartej linii w trybie Insert.
+
+ 4. By otworzyć linię POWYŻEJ kursora, wciśnij wielkie O zamiast małego
+ o . Wypróbuj to na linii poniżej.
+
+---> Otwórz linię powyżej wciskając SHIFT-O gdy kursor będzie na tej linii.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.2.: POLECENIE APPEND (dodaj)
+
+
+ ** Wpisz a by dodać tekst ZA kursorem. **
+
+ 1. Przenieś kursor do początku pierwszej linii poniżej oznaczonej --->
+
+ 2. Wciskaj e dopóki kursor nie będzie na końcu li .
+
+ 3. Wpisz a (małe), aby dodać tekst ZA znakiem pod kursorem.
+
+ 4. Dokończ wyraz tak, jak w linii poniżej. Wciśnij <ESC> aby opuścić tryb
+ Insert.
+
+ 5. Użyj e by przejść do kolejnego niedokończonego wyrazu i powtarzaj kroki
+ 3. i 4.
+
+---> Ta li poz Ci ćwi dodaw teks do koń lin
+---> Ta linia pozwoli Ci ćwiczyć dodawanie tekstu do końca linii.
+
+Uwaga: a , i oraz A prowadzą do trybu Insert, jedyną różnicą jest miejsce,
+ gdzie nowe znaki będą dodawane.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.3.: INNA WERSJA REPLACE (zamiana)
+
+
+ ** Wpisz wielkie R by zamienić więcej niż jeden znak. **
+
+ 1. Przenieś kursor do pierwszej linii poniżej oznaczonej --->. Przenieś
+ kursor do pierwszego xxx .
+
+ 2. Wciśnij R i wpisz numer poniżej w drugiej linii, tak, że zastąpi on
+ xxx.
+
+ 3. Wciśnij <ESC> by opuścić tryb Replace. Zauważ, że reszta linii pozostaje
+ niezmieniona.
+
+ 5. Powtarzaj kroki by wymienić wszystkie xxx.
+
+---> Dodanie 123 do xxx daje xxx.
+---> Dodanie 123 do 456 daje 579.
+
+UWAGA: Tryb Replace jest jak tryb Insert, ale każdy znak usuwa istniejący
+ znak.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.4.: KOPIOWANIE I WKLEJANIE TEKSTU
+
+
+ ** użyj operatora y aby skopiować tekst i p aby go wkleić **
+
+ 1. Przejdź do linii oznaczonej ---> i umieść kursor za "a)".
+
+ 2. Wejdź w tryb Wizualny v i przenieś kursor na początek "pierwszy".
+
+ 3. Wciśnij y aby kopiować (yankować) podświetlony tekst.
+
+ 4. Przenieś kursor do końca następnej linii: j$
+
+ 5. Wciśnij p aby wkleić (wpakować) tekst. Dodaj: a drugi<ESC> .
+
+ 6. Użyj trybu Wizualnego, aby wybrać " element.", yankuj go y , przejdź do
+ końca następnej linii j$ i upakuj tam tekst z p .
+
+---> a) to jest pierwszy element.
+ b)
+Uwaga: możesz użyć y jako operatora; yw kopiuje jeden wyraz.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 6.5.: USTAWIANIE OPCJI
+
+
+** Ustawianie opcji tak, by szukaj lub substytucja ignorowały wielkość liter **
+
+ 1. Szukaj 'ignore' wpisując: /ignore<ENTER>
+ Powtórz szukanie kilka razy naciskając klawisz n .
+
+ 2. Ustaw opcję 'ic' (Ignore case -- ignoruj wielkość liter) poprzez
+ wpisanie: :set ic
+
+ 3. Teraz szukaj 'ignore' ponownie wciskając: n
+ Zauważ, że Ignore i IGNORE także są teraz znalezione.
+
+ 4. Ustaw opcje 'hlsearch' i 'incsearch': :set hls is
+
+ 5. Teraz wprowadź polecenie szukaj ponownie i zobacz co się zdarzy:
+ /ignore<ENTER>
+
+ 6. Aby wyłączyć ignorowanie wielkości liter: :set noic
+
+Uwaga: Aby usunąć podświetlanie dopasowań, wpisz: :nohlsearch
+Uwaga: Aby ignorować wielkość liter dla jednego wyszukiwania: /ignore\c<ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 6. PODSUMOWANIE
+
+
+ 1. Wpisanie o otwiera linię PONIŻEJ kursora.
+ Wpisanie O otwiera linię POWYŻEJ kursora.
+
+ 2. Wpisanie a wstawia tekst ZA znakiem, na którym jest kursor.
+ Wpisanie A dodaje tekst na końcu linii.
+
+ 3. Polecenie e przenosi do końca wyrazu.
+ 4. Operator y yankuje (kopiuje) tekst, p pakuje (wkleja) go.
+ 5. Wpisanie wielkiego R wprowadza w tryb Replace (zamiana) dopóki
+ nie zostanie wciśnięty <ESC>.
+ 6. Wpisanie ":set xxx" ustawia opcję "xxx". Niektóre opcje:
+ 'ic' 'ignorecase' ignoruj wielkość znaków
+ 'is' 'incsearch' pokaż częściowe dopasowania
+ 'hls' 'hlsearch' podświetl wszystkie dopasowania
+ Możesz użyć zarówno długiej, jak i krótkiej formy.
+ 7. Dodaj "no", aby wyłączyć opcję: :set noic
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 7.1. JAK UZYSKAĆ POMOC?
+
+ ** Użycie systemu pomocy on-line **
+
+ Vim posiada bardzo dobry system pomocy on-line. By zacząć, spróbuj jednej
+ z trzech możliwości:
+ - wciśnij klawisz <HELP> (jeśli taki masz)
+ - wciśnij klawisz <F1> (jeśli taki masz)
+ - wpisz :help<ENTER>
+
+ Przeczytaj tekst w oknie pomocy, aby dowiedzieć się jak działa pomoc.
+ wpisz CTRL-W CTRL-W aby przeskoczyć z jednego okna do innego
+ wpisz :q<ENTER> aby zamknąć okno pomocy.
+
+ Możesz też znaleźć pomoc na każdy temat podając argument polecenia ":help".
+ Spróbuj tych (nie zapomnij wcisnąć <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCJA 7.2. TWORZENIE SKRYPTU STARTOWEGO
+
+ ** Włącz możliwości Vima **
+
+ Vim ma o wiele więcej możliwości niż Vi, ale większość z nich jest domyślnie
+ wyłączona. Jeśli chcesz włączyć te możliwości na starcie musisz utworzyć
+ plik "vimrc".
+
+ 1. Początek edycji pliku "vimrc" zależy od Twojego systemu:
+ :edit ~/.vimrc dla Uniksa
+ :edit ~/_vimrc dla MS-Windows
+ 2. Teraz wczytaj przykładowy plik "vimrc":
+ :read $VIMRUNTIME/vimrc_example.vim
+ 3. Zapisz plik:
+ :w
+
+ Następnym razem, gdy zaczniesz pracę w Vimie będzie on używać podświetlania
+ składni. Możesz dodać wszystkie swoje ulubione ustawienia do tego pliku
+ "vimrc".
+ Aby uzyskać więcej informacji, wpisz :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 7.3.: UZUPEŁNIANIE
+
+
+ ** Uzupełnianie linii poleceń z CTRL-D i <TAB> **
+
+ 1. Upewnij się, że Vim nie jest w trybie kompatybilności: :set nocp
+
+ 2. Zerknij, jakie pliki są w bieżącym katalogu: :!ls lub :!dir
+
+ 3. Wpisz początek polecenia: :e
+
+ 4. Wciśnij CTRL-D i Vim pokaże listę poleceń, jakie zaczynają się na "e".
+
+ 5. Wciśnij <TAB> i Vim uzupełni polecenie do ":edit".
+
+ 6. Dodaj spację i zacznij wpisywać nazwę istniejącego pliku: :edit FIL
+
+ 7. Wciśnij <TAB>. Vim uzupełni nazwę (jeśli jest niepowtarzalna).
+
+UWAGA: Uzupełnianie działa dla wielu poleceń. Spróbuj wcisnąć CTRL-D i <TAB>.
+ Użyteczne zwłaszcza przy :help .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcja 7. PODSUMOWANIE
+
+
+ 1. Wpisz :help albo wciśnij <F1> lub <Help> aby otworzyć okno pomocy.
+
+ 2. Wpisz :help cmd aby uzyskać pomoc o cmd .
+
+ 3. Wpisz CTRL-W CTRL-W aby przeskoczyć do innego okna.
+
+ 4. Wpisz :q aby zamknąć okno pomocy.
+
+ 5. Utwórz plik startowy vimrc aby zachować wybrane ustawienia.
+
+ 6. Po poleceniu : , wciśnij CTRL-D aby zobaczyć możliwe uzupełnienia.
+ Wciśnij <TAB> aby użyć jednego z nich.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Tutaj się kończy tutorial Vima. Został on pomyślany tak, aby dać krótki
+ przegląd jego możliwości, wystarczający byś mógł go używać. Jest on
+ daleki od kompletności, ponieważ Vim ma o wiele, wiele więcej poleceń.
+
+ Dla dalszej nauki rekomendujemy książkę:
+ Vim - Vi Improved - autor Steve Oualline
+ Wydawca: New Riders
+ Pierwsza książka całkowicie poświęcona Vimowi. Użyteczna zwłaszcza dla
+ początkujących. Zawiera wiele przykładów i ilustracji.
+ Zobacz https://iccf-holland.org./click5.html
+
+ Starsza pozycja i bardziej o Vi niż o Vimie, ale także warta
+ polecenia:
+ Learning the Vi Editor - autor Linda Lamb
+ Wydawca: O'Reilly & Associates Inc.
+ To dobra książka, by dowiedzieć się niemal wszystkiego, co chciałbyś zrobić
+ z Vi. Szósta edycja zawiera też informacje o Vimie.
+
+ Po polsku wydano:
+ Edytor vi. Leksykon kieszonkowy - autor Arnold Robbins
+ Wydawca: Helion 2001 (O'Reilly).
+ ISBN: 83-7197-472-8
+ http://helion.pl/ksiazki/vilek.htm
+ Jest to książeczka zawierająca spis poleceń vi i jego najważniejszych
+ klonów (między innymi Vima).
+
+ Edytor vi - autorzy Linda Lamb i Arnold Robbins
+ Wydawca: Helion 2001 (O'Reilly) - wg 6. ang. wydania
+ ISBN: 83-7197-539-2
+ http://helion.pl/ksiazki/viedyt.htm
+ Rozszerzona wersja Learning the Vi Editor w polskim tłumaczeniu.
+
+ Ten tutorial został napisany przez Michaela C. Pierce'a i Roberta K. Ware'a,
+ Colorado School of Mines korzystając z pomocy Charlesa Smitha,
+ Colorado State University.
+ E-mail: bware@mines.colorado.edu.
+
+ Zmodyfikowane dla Vima przez Brama Moolenaara.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Przetłumaczone przez Mikołaja Machowskiego,
+ Sierpień 2001,
+ rev. Marzec 2002
+ 2nd rev. Wrzesień 2004
+ 3rd rev. Marzec 2006
+ 4th rev. Grudzień 2008
+ Wszelkie uwagi proszę kierować na: mikmach@wp.pl
diff --git a/runtime/tutor/tutor.pt b/runtime/tutor/tutor.pt
new file mode 100644
index 0000000..5735c09
--- /dev/null
+++ b/runtime/tutor/tutor.pt
@@ -0,0 +1,1004 @@
+===============================================================================
+= B e m - v i n d o ao t u t o r i a l do V I M - Verso 1.8 pt_BR =
+===============================================================================
+
+ Vim um poderoso editor que possui muitos comandos, tantos que seria
+ impossvel ensin-los num tutorial como este, que concebido para
+ apresentar os comandos suficientes para permiti-lo usar facilmente o
+ Vim como um editor de textos genrico.
+
+ O tempo necessrio para completar o tutorial de cerca de 25-30 minutos,
+ dependendo de quanto tempo gasto praticando os comandos.
+
+ ATENO:
+ Os comandos nas lies modificam este texto. Faa uma cpia deste
+ arquivo para praticar os comandos (se usou o "vimtutor", esta j
+ uma cpia).
+
+ importante lembrar que este tutorial concebido para ensinar pela
+ prtica. Isso significa que voc precisa executar os comandos para
+ aprend-los adequadamente. Se voc somente ler o texto, esquecer os
+ comandos!
+
+ Agora, certifique-se de que sua tecla Shift-Lock (ou Caps Lock) no esteja
+ ativada e pressione a tecla j o bastante para mover o cursor at que a
+ Lio 1.1 aparea inteiramente na tela.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 1.1: MOVER O CURSOR
+
+
+ ** Para mover o cursor, pressione as teclas h,j,k,l conforme indicado. **
+ ^
+ k Dica: A tecla h est esquerda e move esquerda.
+ < h l > A tecla l est direita e move direita.
+ j A tecla j se parece com uma seta para baixo.
+ v
+ 1. Mova o cursor pela tela at que voc se sinta confortvel.
+
+ 2. Segure pressionada a tecla (j) at haver repetio.
+ Agora voc j sabe como ir para a prxima lio.
+
+ 3. Usando a tecla j, v para a Lio 1.2.
+
+NOTA: Se est inseguro sobre o que digitou, pressione <ESC> para
+ coloc-lo no modo Normal. Ento redigite o comando que queria.
+
+NOTA: As teclas de cursor funcionam tambm. Mas usando hjkl, to logo
+ esteja acostumado, voc poder se mover muito mais rapidamente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 1.2: SAIR DO VIM
+
+
+ !! NOTA: Antes de executar quaisquer dos passos abaixo, leia a lio inteira !!
+
+ 1. Pressione <ESC> (para ter certeza de que est no modo Normal).
+
+ 2. Digite: :q! <ENTER>.
+ Assim, sai do editor SEM salvar qualquer mudana feita.
+
+ 3. Repita o procedimento que o trouxe a este tutorial. O procedimento pode
+ ter sido a digitao de: vimtutor <ENTER>.
+
+ 4. Se memorizou estes passos e est confiante, execute os passos de
+ 1 a 3 para sair e reentrar no editor.
+
+NOTA: :q! <ENTER> descarta qualquer mudana. Em uma prxima lio ser
+ ensinado como salvar as mudanas feitas em um arquivo.
+
+ 5. Desa o cursor at a Lio 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 1.3: EDITAR TEXTOS - REMOO
+
+ ** Pressione x para deletar o caractere sob o cursor. **
+
+
+ 1. Mova o cursor para a linha abaixo marcada com --->.
+
+ 2. Para corrigir os erros, mova o cursor at que ele esteja sobre o
+ caractere a ser deletado.
+
+ 3. Pressione a tecla x para remover o caractere incorreto.
+
+ 4. Repita os passos 2 at 4 at que a frase esteja correta.
+
+---> A vvaca pullouu por ccimaa dda luuua.
+
+ 5. Agora que a frase est correta, prossiga para a Lio 1.4.
+
+NOTA: Enquanto segue este tutorial, no tente memorizar, aprenda pelo uso.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 1.4: EDITAR TEXTOS - INSERO
+
+ ** Pressione i para inserir texto. **
+
+
+ 1. Mova o cursor at a primeira linha abaixo marcada com --->.
+
+ 2. Para deixar a primeira linha igual segunda, mova o cursor para
+ o primeiro caractere DEPOIS de onde o texto dever ser inserido.
+
+ 3. Pressione i e digite as adies necessrias.
+
+ 4. Assim que cada erro for corrigido pressione <ESC> para retornar ao modo
+ Normal. Repita os passos 2 at 4 para corrigir a frase.
+
+---> Tem text fatado nesta .
+---> Tem algum texto faltando nesta linha.
+
+ 5. Quando se sentir vontade com a insero de texto, mova o cursor para
+ a Lio 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 1.5: EDITAR TEXTO - ADICIONAR
+
+ ** Pressione A para adicionar texto. **
+
+ 1. Mova o cursor para a primeira linha abaixo marcada com --->.
+ No importa sobre qual caractere o cursor estar na linha.
+
+ 2. Pressione A e digite as adies necessrias.
+
+ 3. Quando adicionar o texto, pressione <ESC> para retornar ao modo Normal.
+
+ 4. Mova o cursor para a segunda linha marcada ---> e repita os passos 2 e 3
+ para corrigir a frase.
+
+---> H algum texto faltando nes
+ H algum texto faltando nesta linha.
+---> H algum texto faltan
+ H algum texto faltando aqui.
+
+ 5. Quando se sentir confortvel adicionando texto, v para a Lio 1.6.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 1.6: EDITAR UM ARQUIVO
+
+ ** Use :wq para salvar um arquivo e sair. **
+
+ !! NOTA: Leia toda a lio antes de executar as instrues!!
+
+ 1. Saia deste tutorial como o fez na lio 1.2: :q!
+ Ou, se tiver acesso a outro terminal, faa o seguinte nele.
+
+ 2. No prompt do shell, digite esse comando: vim tutor <ENTER>
+ 'vim' o comando para iniciar o editor Vim e 'tutor' o nome do
+ arquivo que voc quer editar. Use um arquivo que possa ser modificado.
+
+ 3. Insira e apague texto tal como aprendeu nas lies anteriores.
+
+ 4. Salve o arquivo com as mudanas e saia do Vim com: :wq <ENTER>
+
+ 5. Se tiver sado do vimtutor no passo 1, reinicie o vimtutor e v para
+ o resumo seguinte.
+
+ 6. Aps ler os passos acima e compreend-los, execute-os.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIO 1
+
+ 1. O cursor movido usando tanto as teclas de seta quanto as teclas hjkl.
+ h (esquerda) j (para baixo) k (para cima) l (direita)
+
+ 2. Para entrar no Vim a partir de um shell digite: vim NOMEDOARQUIVO <ENTER>
+
+ 3. Para sair do Vim digite: <ESC> :q! <ENTER> para descartar as alteraes.
+ OU digite: <ESC> :wq <ENTER> para salvar as alteraes.
+
+ 4. Para deletar um caractere sob o cursor no modo Normal digite: x
+
+ 5. Para inserir texto na posio do cursor enquanto estiver no modo Normal
+ digite:
+ i digite o texto <ESC> inserir depois do cursor
+ A digite o texto <ESC> adicionar no final da linha
+
+NOTA: Pressionando <ESC> voc ir para o modo Normal ou cancelar um comando
+ ainda incompleto.
+
+Agora continue com a Lio 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 2.1: COMANDOS DE REMOO
+
+ ** Digite dw para apagar uma palavra. **
+
+
+ 1. Pressione <ESC> para ter certeza de que est no modo Normal.
+
+ 2. Mova o cursor at a linha abaixo marcada com --->.
+
+ 3. Mova o cursor at o comeo da palavra que precisa ser deletada.
+
+ 4. Digite dw para fazer a palavra desaparecer.
+
+ NOTA: A letra d vai aparecer na ltima linha da tela enquanto voc a
+ digita. O Vim o est esperando digitar um w . Se digitou
+ alguma coisa errada, pressione <ESC> e comece de novo.
+
+---> Tem a algumas oi palavras diverso que no pertencem papel a esta frase.
+
+ 5. Repita os passos 3 ao 4 at que a frase esteja correta e v para a
+ Lio 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 2.2: MAIS COMANDOS DE REMOO
+
+ ** Digite d$ para deletar at o fim da linha. **
+
+
+
+ 1. Pressione <ESC> para ter certeza de estar no modo Normal.
+
+ 2. Mova o cursor at a linha abaixo marcada com --->.
+
+ 3. Mova o cursor at o fim da linha correta (DEPOIS do primeiro . ).
+
+ 4. Digite d$ para apagar at o fim da linha.
+
+---> Algum digitou o fim desta linha duas vezes. desta linha duas vezes.
+
+ 5. V para a lio 2.3 para entender o funcionamento deste comando.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 2.3: SOBRE OPERADORES E MOVIMENTOS
+
+ Muitos comandos que mudam texto so feitos de um operador e de um movimento.
+ O formato para um comando apagar com o operador de remoo d tem a
+ seguinte forma:
+
+ d movimento
+
+ Onde:
+ d - o operador apagar.
+ movimento - o movimento sobre o qual o operador age (listado abaixo).
+
+ Uma pequena lista de teclas de movimento:
+ w - at o incio da prxima palavra, excluindo seu primeiro caractere.
+ e - at o fim da palavra atual, incluindo seu ltimo caractere.
+ $ - at o fim da linha, incluindo seu ltimo caractere.
+
+ Portanto, digitar de apaga do cursor ao fim da palavra.
+
+NOTA: Pressionar apenas a tecla de movimento em modo Normal, sem o
+operador, faz o cursor se mover como especificado na lista de teclas de
+movimento.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 2.4: USAR UM CONTADOR PARA UM MOVIMENTO
+
+ ** Digitar um nmero antes de um movimento repete-o o tanto de vezes. **
+
+
+ 1. Mova o cursor para o comeo da linha marcada com ---> abaixo.
+
+ 2. Digite 2w para mover o cursor duas palavras adiante.
+
+ 3. Digite 3e para mover o cursor para o fim da terceira palavra adiante.
+
+ 4. Digite 0 (zero) para mover para o incio da linha.
+
+ 5. Repita os passos 2 e 3 com diferentes nmeros.
+
+---> Esta uma linha com algumas palavras para permiti-lo fazer movimentos.
+
+ 6. V para a Lio 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 2.5: USAR UM CONTADOR PARA APAGAR MAIS
+
+ ** Digitar um nmero com um operador repete-o esse nmero de vezes. **
+
+
+ Voc deve inserir um contador entre o operador de remoo e o de movimento
+ mencionados acima para apagar mais:
+ d nmero movimento
+
+ 1. Movimente o cursor para a primeira palavra em LETRAS MAISCULAS na
+ linha marcada com --->.
+
+ 2. Digite d2w para deletar as duas palavras em LETRAS MAISCULAS.
+
+ 3. Repita os passos 1 e 2 com diferentes contadores para deletar as
+ palavras em LETRAS MAISCULAS com um comando.
+
+---> esta ABC DE linha FGHI JK LMN OP de palavras est Q RS TUV limpa.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 2.6: TRABALHAR COM LINHAS
+
+ ** Digite dd para apagar uma linha inteira. **
+
+ Em virtude da frequncia em deletar uma linha inteira, os desenvolvedores
+ do Vi decidiram que seria mais simples digitar dois d para apagar uma linha.
+
+ 1. Mova o cursor at a segunda linha da frase abaixo.
+ 2. Digite dd para apagar a linha.
+ 3. Agora mova at a quarta linha.
+ 4. Digite 2dd para apagar duas linhas.
+
+---> 1) Rosas so vermelhas,
+---> 2) Lama divertida,
+---> 3) Violetas so azuis,
+---> 4) Eu tenho um carro,
+---> 5) Relgios dizem as horas,
+---> 6) Acar doce,
+---> 7) Assim como voc.
+
+Notas do tradutor: Lama (mud) em ingls pode significar fofoca, difamao.
+ H rima no texto original.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 2.7: O COMANDO UNDO (DESFAZER)
+
+** Pressione u para desfazer os ltimos comandos, U recupera a linha inteira.**
+
+
+ 1. Mova o cursor para a linha abaixo marcada com ---> e posicione-o sobre o
+ primeiro erro.
+ 2. Digite x para deletar o primeiro caractere errado.
+ 3. Agora, digite u para desfazer o ltimo comando executado.
+ 4. Desta vez, corrija todos os erros na linha usando o comando x .
+ 5. Agora, digite um U maisculo para retornar a linha ao seu estado original.
+ 6. Digite u algumas vezes para desfazer o U e os comandos anteriores.
+ 7. Digite CTRL-R (segurando a tecla CTRL enquanto digita R) algumas vezes
+ para refazer os comandos (desfazer os undos).
+
+---> Corriija os erros nnesta linha e reetorne-os com undo.
+
+ 8. Esses comandos so muito teis. Agora v para o resumo da Lio 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIO 2
+
+
+ 1. Para apagar do cursor at a prxima palavra, digite: dw
+ 2. Para apagar do cursor at o fim de uma linha, digite: d$
+ 3. Para apagar uma linha inteira, digite: dd
+ 4. Para repetir um movimento, adicione antes um nmero: 2w
+ 5. O formato para um comando no modo Normal :
+ operador [nmero] movimento
+ onde:
+ operador - o que ser feito, como d para apagar
+ [nmero] - quantas vezes o comando ser repetido
+ movimento - movimento sobre o texto que receber a operao, como
+ w (palavra), $ (at o fim da linha), etc.
+
+ 6. Para ir ao incio da linha, use um zero: 0
+
+ 7. Para desfazer uma ao anterior, digite: u (minsculo)
+ Para desfazer todas as alteraes em uma linha, digite: U (maisculo)
+ Para desfazer o que foi desfeito, digite: CTRL-R
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 3.1: O COMANDO COLAR
+
+ ** Digite p para colar aps o cursor o que acabou de apagar. **
+
+
+ 1. Mova o cursor at a primeira linha marcada com --->.
+
+ 2. Digite dd para apagar a linha e guard-la num registro do Vim.
+
+ 3. Mova o cursor at a linha c) ACIMA de onde a linha apagada deveria estar.
+
+ 4. No modo Normal, digite p para inserir a linha.
+
+ 5. Repita os passos 2 ao 4 para pr todas as linhas na ordem correta.
+
+---> d) Voc pode aprender tambm?
+---> b) Violetas so azuis,
+---> c) Inteligncia se aprende,
+---> a) Rosas so vermelhas,
+
+Nota do tradutor: H rima no original.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 3.2: O COMANDO SUBSTITUIR
+
+ ** Digite rx para substituir o caractere sob o cursor por x . **
+
+
+ 1. Mova o cursor at a primeira linha abaixo marcada com --->.
+
+ 2. Mova o cursor at que esteja sobre o primeiro erro.
+
+ 3. Digite r e ento o caractere que deveria estar l.
+
+ 4. Repita os passos 2 e 3 at que a primeira linha esteja igual segunda.
+
+---> Quendo este limha foi dugitada, alguem pressioniu algumas teclas erradzs!
+---> Quando esta linha foi digitada, algum pressionou algumas teclas erradas!
+
+ 5. Agora v para a Lio 3.3.
+
+NOTA: Lembre-se que voc deve aprender pelo uso, no pela memorizao.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 3.3: O OPERADOR CHANGE (MUDAR)
+
+ ** Para alterar at o fim de uma palavra, digite ce . **
+
+
+ 1. Mova o cursor at a primeira linha abaixo marcada com --->.
+
+ 2. Posicione o cursor sobre o u em lunba.
+
+ 3. Digite ce e a palavra correta (nesse caso, digite 'inha'.)
+
+ 4. Pressione <ESC> e mova para o prximo caractere a ser alterado.
+
+ 5. Repita os passos 3 e 4 at que a primeira frase esteja igual segunda.
+
+---> Essa lunba tem pwlesmfr que ocrimmm soi alteradas cup o comando change.
+---> Essa linha tem palavras que precisam ser alteradas com o comando change.
+
+Note que ce no somente substitui a palavra, mas tambm o coloca no modo
+de Insero.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 3.4: MAIS MUDANAS USANDO c
+
+ ** O operador change usado com os mesmos movimentos que o delete. **
+
+
+ 1. O operador change trabalha da mesma maneira que o delete. O formato :
+
+ c [nmero] movimento
+
+ 2. Os movimentos tambm so os mesmos: w (palavra) e $ (fim da linha).
+
+ 3. Mova at a primeira linha abaixo marcada com --->.
+
+ 4. Mova o cursor at o primeiro erro.
+
+ 5. Digite c$ e digite o resto da segunda para torn-las iguais e
+ pressione <ESC>.
+
+---> O fim desta linha precisa de ajuda para ficar igual segunda.
+---> O fim desta linha precisa ser corrigido usando o comando c$.
+
+NOTA: Voc pode usar a tecla Backspace para corrigir erros enquanto digita.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIO 3
+
+
+ 1. Para reinserir um texto que j foi apagado, digite p . Isso coloca o texto
+ deletado APS o cursor (se uma linha deletada ela ser inserida na linha
+ abaixo do cursor).
+
+ 2. Para substituir o caractere sob o cursor, digite r e ento o caractere
+ que substituir o original.
+
+ 3. O comando change possibilita mudar do cursor at onde o movimento for.
+ Ex: Digite ce para mudar do cursor at o fim de uma palavra, c$ para
+ mudar at o fim da linha.
+
+ 4. O formato para uma operao change :
+
+ c [nmero] movimento
+
+Agora v para a prxima lio.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 4.1: LOCALIZAO DO CURSOR E ESTADO DO ARQUIVO
+
+ ** Digite CTRL-G para mostrar sua localizao no arquivo e seu estado.
+ Digite G para mover para uma linha do arquivo. **
+
+ Nota: Leia esta lio inteira antes de executar qualquer um dos passos!!
+
+ 1. Segure pressionada a tecla Ctrl e pressione g . Chamamos isso de
+ CTRL-G. Uma mensagem aparecer no rodap da pgina com o nome do arquivo
+ e a sua posio no arquivo. Lembre-se do nmero da linha para o Passo 3.
+
+NOTA: A posio do cursor pode estar visvel no canto direito inferior da
+ tela. Isso acontece quando a opo 'ruler' est ativa
+ (veja :help 'ruler' ).
+
+ 2. Pressione G para se mover at o fim do arquivo.
+ Digite gg para se mover at o incio do arquivo.
+
+ 3. Digite o nmero da linha em que estava e ento G . Assim o cursor retornar
+ linha em que estava quando pressionou CTRL-G.
+
+ 4. Se estiver seguro para faz-los, execute os passos 1 a 3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 4.2: O COMANDO BUSCAR
+
+ ** Digite / seguido por uma frase para procurar por ela. **
+
+ 1. No modo Normal digite o caractere / . Note que ele e o cursor aparecem
+ no rodap da tela, como ocorre com o comando : .
+
+ 2. Agora digite 'errroo' <ENTER>. Esta a palavra que quer procurar.
+
+ 3. Para buscar a mesma palavra de novo, simplesmente tecle n .
+ Para buscar a mesma palavra na direo oposta, tecle N .
+
+ 4. Se quer procurar por uma frase de trs para frente, use ? em vez de / .
+
+ 5. Para voltar aonde estava, pressione CTRL-O (mantenha a tecla Ctrl
+ pressionada e pressione a tecla o). Repita para voltar a outras posies.
+ CTRL-I segue para posies mais recentes.
+
+---> "errroo" no uma maneira de escrever erro; errroo um erro.
+
+NOTA: Quando a busca atinge o fim do arquivo ela continuar do comeo, a
+ menos que a opo 'wrapscan' esteja desativada.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 4.3: BUSCA DE PARNTESES CORRESPONDENTES
+
+ ** Digite % para encontrar um ),], ou } correspondente. **
+
+
+ 1. Posicione o cursor em qualquer (, [, ou { na linha abaixo marcada com --->.
+
+ 2. Agora digite o caractere % .
+
+ 3. O cursor deve estar no parntese ou colchete que casa com o primeiro.
+
+ 4. Digite % para mover o cursor de volta ao primeiro colchete ou parntese
+ (por casamento).
+
+---> Isto ( uma linha de teste contendo (, [ ] e { }. ))
+
+Nota: Isso muito til para corrigir um programa com parntese no-casado!
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 4.4: O COMANDO SUBSTITUIR
+
+ ** Digite :s/velho/novo/g para substituir 'velho' por 'novo'. **
+
+
+ 1. Mova o cursor para a linha abaixo marcada com --->.
+
+ 2. Digite :s/aa/a <ENTER> . Note que este comando somente muda a
+ primeira ocorrncia na linha.
+
+ 3. Agora digite :s/aa/a/g significando substituir globalmente na linha.
+ Isto muda todas as ocorrncias na linha.
+
+---> aa melhor poca para ver aas flores aa primavera.
+
+ 4. Para mudar toda ocorrncia de uma string entre duas linhas,
+ digite :#,#s/velho/novo/g onde #,# so os nmeros das duas linhas.
+ Digite :%s/velho/novo/g para mudar todas as ocorrncias no arquivo
+ inteiro.
+ Digite :%s/velho/novo/gc para mudar todas as ocorrncias no arquivo
+ inteiro, com a opo de confirmar cada
+ substituio.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIO 4
+
+
+ 1. CTRL-G mostra em que ponto do arquivo est e o estado dele.
+ G move para o fim do arquivo.
+ nmero G move para a linha com esse nmero.
+ gg move para a primeira linha.
+
+ 2. Digitando / seguido por uma expresso procura FRENTE por ela.
+ Digitando ? seguido por uma expresso procura pela expresso de TRS
+ PARA FRENTE.
+ Aps uma busca, digite n para achar a prxima ocorrncia na mesma direo
+ ou N para procurar na direo oposta.
+ CTRL-O leva a posies antigas e CTRL-I a posies mais recentes.
+
+ 3. Digitando % enquanto o cursor est sobre um (,),[,],{, ou } localiza
+ o par que casa com ele.
+
+ 4. Para substituir:
+ o primeiro 'velho' de uma linha por 'novo' digite :s/velho/novo
+ todos os 'velho' em uma linha por 'novo' digite :s/velho/novo/g
+ expresses entre dois nmeros (#) de linhas digite :#,#s/velho/novo
+ todas as ocorrncias no arquivo digite :%s/velho/novo/g
+ Para confirmar cada substituio adicione 'c' :%s/velho/novo/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 5.1: COMO EXECUTAR UM COMANDO EXTERNO
+
+
+ ** Digite :! seguido por um comando externo para execut-lo. **
+
+ 1. Digite o familiar comando : para levar o cursor ao rodap da tela. Isso
+ o permite entrar um comando.
+
+ 2. Agora digite o caractere ! (ponto de exclamao). Isso o permite
+ executar qualquer comando do shell.
+
+ 3. Como um exemplo digite ls seguindo o ! e ento tecle <ENTER>. Isto
+ mostrar uma listagem do seu diretrio, como se voc estivesse no
+ prompt do shell. Ou use :!dir se ls no funcionar.
+
+NOTA: possvel executar qualquer comando externo dessa maneira, inclusive
+ com argumentos.
+
+NOTA: Todos os comandos : devem ser finalizados teclando-se <ENTER>
+ Daqui em diante no mencionaremos isso todas as vezes.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 5.2: MAIS SOBRE SALVAR ARQUIVOS
+
+ ** Para salvar as alteraes no texto, digite :w NOMEDOARQUIVO. **
+
+
+ 1. Digite :!dir ou :!ls para ter uma listagem de seu diretrio.
+ Voc j deve saber que precisa teclar <ENTER> depois disso.
+
+ 2. Escolha um nome de arquivo que ainda no exista, como TESTE.
+
+ 3. Agora digite: :w TESTE (onde TESTE o nome que voc escolheu.)
+
+ 4. Isto salva o arquivo inteiro (o Vim Tutor) com o nome TESTE.
+ Para verificar isso, digite :!ls de novo para ver seu diretrio.
+
+NOTA: Se sair do Vim e entrar de novo com o nome do arquivo TESTE,
+ o arquivo deve ser uma cpia exata do tutorial quando voc o salvou.
+
+ 5. Agora remova o arquivo digitando (MS-DOS): :!del TESTE
+ ou (Unix): :!rm TESTE
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 5.3: SELECIONAR O TEXTO A SER SALVO
+
+ ** Para salvar parte de um arquivo, digite v movimento :w NOMEDOARQUIVO **
+
+ 1. Mova o cursor para esta linha.
+
+ 2. Pressione v e mova o cursor para o quinto item abaixo. Note que o texto
+ realado.
+
+ 3. Pressione o caractere : e note que aparecer :'<,'> no lado inferior
+ da tela.
+
+ 4. Digite w TESTE , sendo TESTE um nome de arquivo que no existe ainda.
+ Certifique-se de ver :'<,'>w TESTE antes de pressionar <ENTER>.
+
+ 5. O Vim salvar as linhas selecionadas no arquivo TESTE. Use :!dir ou
+ !:ls para v-lo. No o apague ainda! Ns o usaremos na prxima lio.
+
+NOTA: Pressionar v inicia o modo Visual de seleo. Voc pode mover o
+cursor pela tela para tornar a seleo maior ou menor. Pode, ento, usar um
+operador para executar alguma ao. Por exemplo, d apaga o texto.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 5.4: RECUPERAR E UNIR ARQUIVOS
+
+ ** Para inserir o contedo de um arquivo, digite :r NOMEDOARQUIVO **
+
+
+ 1. Posicione o cursor logo acima desta linha.
+
+NOTA: Depois de executar o Passo 2 voc ver a Lio 5.3. Ento DESA o
+ cursor para ver esta lio novamente.
+
+ 2. Agora recupere o arquivo TESTE usando o comando :r TESTE onde TESTE o
+ nome do arquivo.
+ O arquivo recuperado colocado abaixo da linha atual do cursor.
+
+ 3. Para verificar que o arquivo foi recuperado, volte com o cursor e verifique
+ que agora existem duas cpias da Lio 5.3, a original e a verso do
+ arquivo.
+
+NOTA: Voc tambm pode ler a sada de um comando externo. Por exemplo, :r !ls
+ l a sada do comando ls e coloca o resultado abaixo do cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIO 5
+
+
+ 1. :!comando executa um comando externo.
+
+ Alguns exemplos teis so:
+ (MS-DOS) (UNIX)
+ :!dir :!ls - lista contedo do diretrio.
+ :!del ARQUIVO :!rm ARQUIVO - remove ARQUIVO.
+
+ 2. :w ARQUIVO salva o atual arquivo do Vim para o disco com o nome ARQUIVO.
+
+ 3. v movimento :w ARQUIVO salva as linhas Visualmente selecionadas em
+ ARQUIVO.
+
+ 4. :r ARQUIVO recupera ARQUIVO do disco e o insere dentro do arquivo atual
+ na posio do cursor.
+
+ 5. :r !dir l a sada do comando dir e coloca o resultado abaixo da posio
+ atual do cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 6.1: O COMANDO ABRIR
+
+ ** Digite o para abrir uma linha em baixo do cursor e ir para o modo de
+ Insero. **
+
+ 1. Mova o cursor para a linha abaixo marcada com --->.
+
+ 2. Digite o (minsculo) para abrir uma linha ABAIXO do cursor e ir para o
+ modo de Insero.
+
+ 3. Agora digite algum texto e pressione <ESC> para sair do modo de
+ Insero.
+
+---> Aps teclar o o cursor colocado na linha aberta no modo de Insero.
+
+ 4. Para abrir uma linha ACIMA do cursor, simplesmente tecle um O maisculo,
+ em vez de um o minsculo. Tente isso na linha abaixo.
+
+---> Abra uma linha acima desta teclando O enquanto o cursor est nesta linha.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 6.2: O COMANDO ADICIONAR
+
+ ** Digite a para inserir texto DEPOIS do cursor. **
+
+ 1. Mova o cursor para o incio da linha marcada com ---> .
+
+ 2. Pressione e at o cursor ficar sobre o final de li .
+
+ 3. Digite um a (minsculo) para adicionar texto DEPOIS do caractere sob o
+ cursor.
+
+ 4. Complete a palavra conforme a linha abaixo. Pressione <ESC> para sair do
+ modo de Insero.
+
+ 5. Use e para mover para a prxima palavra incompleta repita os passos 3
+ e 4.
+
+---> Esta lin o permite pratic a adi de texto a uma linha.
+---> Esta linha o permite praticar a adio de texto a uma linha.
+
+NOTA: a, i e A levam ao mesmo modo de Insero, a nica diferena onde os
+ caracteres so inseridos.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 6.3: UMA OUTRA VERSO DO SUBSTITUIR
+
+ ** Digite um R maisculo para substituir mais de um caractere. **
+
+
+ 1. Mova o cursor para a primeira linha abaixo marcada com --->. Mova o
+ cursor para o incio do primeiro xxx .
+
+ 2. Agora pressione R e digite os nmeros que esto abaixo dele, na segunda
+ linha, para substituir o xxx .
+
+ 3. Pressione <ESC> para sair do modo de Substituio. Note que o resto da
+ linha permanece inalterado.
+
+ 4. Repita os passos para substituir os xxx restantes.
+
+---> Adicionando 123 a xxx resulta em xxx.
+---> Adicionando 123 a 456 resulta em 579.
+
+NOTA: O modo de Substituio como o modo de Insero, mas cada caractere
+ digitado apaga um caractere existente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 6.4: COPIAR E COLAR TEXTO
+
+ ** Use o operador y para copiar texto e p para col-lo. **
+
+ 1. V linha marcada com ---> abaixo e posicione o cursor aps "a)".
+
+ 2. Inicie o modo Visual com v e mova o cursor para logo antes de
+ "primeiro".
+
+ 3. Digite y para copiar o texto selecionado.
+
+ 4. Mova o cursor para o fim da prxima linha: j$
+
+ 5. Digite p para colar o texto. Ento, digite: o segundo <ESC> .
+
+ 6. Use o modo Visual para selecionar " item.", copie-o com y , mova para
+ o fim da prxima linha com j$ e cole o texto com p .
+
+---> a) esse o primeiro item.
+ b)
+
+NOTA: Voc tambm pode usar y como um operador; por exemplo, yw copia uma
+ palavra.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 6.5: CONFIGURAR PREFERNCIAS
+
+ ** Configure uma preferncia de modo que uma busca ou substituio
+ ignore se as letras so maisculas ou minsculas. **
+
+ 1. Procure por 'ignore' entrando: /ignore <ENTER>
+ Repita vrias vezes teclando n .
+
+ 2. Configure a opo 'ic' (Ignore case) digitando: :set ic
+
+ 3. Agora procure por 'ignore' de novo teclando: n
+ Repita vrias vezes.
+
+ 4. Configure as opes 'hlsearch' e 'incsearch': :set hls is
+
+ 5. Agora entre com o comando buscar de novo, e veja o que acontece:
+ /ignore
+
+ 6. Para desabilitar a diferenciao entre maisculas e minsculas:
+ :set noic
+
+NOTA: Para remover o realce dos termos localizados entre: :nohlsearch
+NOTA: Se quiser ignorar a diferena entre maisculas e minsculas em apenas
+ uma pesquisa, use \c no comando: /ignore\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIO 6
+
+ 1. Digite o para abrir uma linha ABAIXO do cursor e iniciar o modo de
+ Insero.
+ Digite O para abrir uma linha ACIMA da linha onde o cursor est.
+
+ 2. Digite a para adicionar texto DEPOIS do caractere onde est o cursor.
+ Digite A para adicionar texto ao fim da linha.
+
+ 3. O comando e move o cursor para o fim de uma palavra.
+
+ 4. O operador y copia texto, p cola o texto copiado.
+
+ 5. Digitando R entra-se no modo de Substituio at que <ESC> seja
+ pressionado.
+
+ 6. Digitando ":set xxx" modifica-se a opo "xxx". Algumas opes so:
+ 'ic' 'ignorecase' ignora diferena entre maisculas/minsculas
+ 'is' 'incsearch' realiza a busca enquanto se digita
+ 'hls' 'hlsearch' reala todos os trechos localizados
+ Voc tanto pode usar o nome curto quanto o nome longo da opo.
+
+ 7. Adicione o prefixo "no" para desabilitar uma opo: :set noic
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LIO 7.1: OBTENDO AJUDA
+
+ ** Use o sistema de ajuda do prprio Vim **
+
+ O Vim possui sistema de ajuda abrangente. Para comear, tente algum
+ desses trs:
+ - pressione a tecla <HELP> (se voc tiver uma)
+ - pressione a tecla <F1> (se voc tiver uma)
+ - digite :help <ENTER>
+
+ Leia o texto da ajuda para aprender como o sistema de ajuda funciona.
+ Digite CTRL-W CTRL-W para pular de uma janela a outra.
+ Digite :q <ENTER> para fechar a janela da ajuda.
+
+ Voc pode encontrar ajuda sobre qualquer assunto, fornecendo um argumento
+ para o comando ":help". Tente isto (no se esquea de pressionar <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 7.2: CRIAR UM SCRIPT DE INICIALIZAO
+
+ ** Habilite recursos do Vim **
+
+ O Vim tem muito mais recursos do que o Vi, mas na sua maioria eles so
+ desabilitados por padro. Para usar mais recursos, voc tem que criar um
+ arquivo "vimrc".
+
+ 1. Comece a editar o arquivo "vimrc". Isso depende do sistema:
+ :e ~/.vimrc para Unix
+ :e ~/_vimrc para MS-Windows
+
+ 2. Agora, leia o contedo do arquivo "vimrc" de exemplo:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Salve o arquivo com:
+ :w
+
+ Da prxima vez que o Vim for iniciado, ele usar realce de sintaxe. Voc
+ pode adicionar suas configuraes preferidas para esse arquivo "vimrc". Para
+ maiores informaes, digite: :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lio 7.3: COMPLETAO
+
+ ** Completao da linha de comando com CTRL-D e <TAB> **
+
+ 1. Certifique-se de que o Vim no est no modo compatvel: :set nocp
+
+ 2. Veja quais arquivos existem no diretrio: :!ls ou :!dir
+
+ 3. Digite o incio de um comando: :e
+
+ 4. Pressione CTRL-D e o Vim mostrar a lista dos comandos iniciados
+ com "e".
+
+ 5. Pressione <TAB> e o Vim completar o nome do comando para ":edit".
+
+ 6. Agora, adicione um espao e o incio do nome de um arquivo existente:
+ :edit ARQ
+
+ 7. Pressione <TAB>. O Vim completar o nome (se ele for nico).
+
+NOTA: A completao funciona com muitos comandos. Basta pressionar CTRL-D e
+<TAB>. Isso especialmente til para :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIO 7
+
+
+ 1. Digite :help ou pressione <F1> ou <Help> para abrir a janela de ajuda.
+
+ 2. Digite :help cmd para achar a ajuda sobre cmd .
+
+ 3. Digite CTRL-W CTRL-W para pular de uma janela a outra.
+
+ 4. Digite :q para fechar a janela de ajuda.
+
+ 5. Crie um script de inicializao vimrc para ativar automaticamente as suas
+ configuraes preferidas.
+
+ 6. Quando pressionar um comando : , pressione CTRL-D para ver as possibilidades
+ de completao. Pressione <TAB> para us-la.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Isto conclui o tutorial do Vim, uma breve apresentao do editor Vim,
+ somente o bastante para que voc possa usar o editor com facilidade.
+ Ele est longe de ser completo, uma vez que o Vim possui muitos, muitos mais
+ comandos. O prximo passo ler o manual: ":help user-manual".
+
+ Livro recomendado em Portugus sobre o Vim:
+ O editor de texto Vim - de Srgio Luiz Arajo da Silva et al.
+ http://code.google.com/p/vimbook/
+
+ Para futura leitura e estudo, este livro recomendado:
+ Vim - Vi Improved - de Steve Oualline
+ Editora: New Riders
+ Este o primeiro livro completamente dedicado ao Vim. Especialmente til
+ para iniciantes, com muitos exemplos e ilustraes.
+ Veja https://iccf-holland.org/click5.html
+
+ Esse livro mais antigo e mais sobre o Vi do que sobre o Vim, mas tambm
+ recomendado:
+ Learning the Vi Editor - de Linda Lamb
+ Editora: O'Reilly & Associates Inc.
+ Este um bom livro para aprender quase tudo o que voc quer fazer com o Vi.
+ A sexta edio tambm inclui informaes sobre o Vim.
+
+ Este tutorial foi escrito por Michael C. Pierce e Robert K. Ware,
+ Colorado School of Mines, usando idias fornecidas por Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Modificado para o Vim por Bram Moolenaar.
+
+ Verso 1.4 traduzida para o portugus por Marcelo Drudi Miranda, Escola
+ Politcnica da Universidade de So Paulo.
+
+ Reviso e atualizao da traduo para a verso 1.7 por Jakson Aquino,
+ Universidade Federal do Cear: E-mail: jalvesaq@gmail.com
+
+ Nova reviso e atualizao para a verso 1.8 por Ron Gonalves,
+ Universidade Federal de Uberlndia.
+
+ Last Change: 2017 Feb 11
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.pt.utf-8 b/runtime/tutor/tutor.pt.utf-8
new file mode 100644
index 0000000..9d8e758
--- /dev/null
+++ b/runtime/tutor/tutor.pt.utf-8
@@ -0,0 +1,1004 @@
+===============================================================================
+= B e m - v i n d o ao t u t o r i a l do V I M - Versão 1.8 pt_BR =
+===============================================================================
+
+ Vim é um poderoso editor que possui muitos comandos, tantos que seria
+ impossível ensiná-los num tutorial como este, que é concebido para
+ apresentar os comandos suficientes para permiti-lo usar facilmente o
+ Vim como um editor de textos genérico.
+
+ O tempo necessário para completar o tutorial é de cerca de 25-30 minutos,
+ dependendo de quanto tempo é gasto praticando os comandos.
+
+ ATENÇÃO:
+ Os comandos nas lições modificam este texto. Faça uma cópia deste
+ arquivo para praticar os comandos (se usou o "vimtutor", esta já
+ é uma cópia).
+
+ É importante lembrar que este tutorial é concebido para ensinar pela
+ prática. Isso significa que você precisa executar os comandos para
+ aprendê-los adequadamente. Se você somente ler o texto, esquecerá os
+ comandos!
+
+ Agora, certifique-se de que sua tecla Shift-Lock (ou Caps Lock) não esteja
+ ativada e pressione a tecla j o bastante para mover o cursor até que a
+ Lição 1.1 apareça inteiramente na tela.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 1.1: MOVER O CURSOR
+
+
+ ** Para mover o cursor, pressione as teclas h,j,k,l conforme indicado. **
+ ^
+ k Dica: A tecla h está à esquerda e move à esquerda.
+ < h l > A tecla l está à direita e move à direita.
+ j A tecla j se parece com uma seta para baixo.
+ v
+ 1. Mova o cursor pela tela até que você se sinta confortável.
+
+ 2. Segure pressionada a tecla (j) até haver repetição.
+ Agora você já sabe como ir para a próxima lição.
+
+ 3. Usando a tecla j, vá para a Lição 1.2.
+
+NOTA: Se está inseguro sobre o que digitou, pressione <ESC> para
+ colocá-lo no modo Normal. Então redigite o comando que queria.
+
+NOTA: As teclas de cursor funcionam também. Mas usando hjkl, tão logo
+ esteja acostumado, você poderá se mover muito mais rapidamente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 1.2: SAIR DO VIM
+
+
+ !! NOTA: Antes de executar quaisquer dos passos abaixo, leia a lição inteira !!
+
+ 1. Pressione <ESC> (para ter certeza de que está no modo Normal).
+
+ 2. Digite: :q! <ENTER>.
+ Assim, sai do editor SEM salvar qualquer mudança feita.
+
+ 3. Repita o procedimento que o trouxe a este tutorial. O procedimento pode
+ ter sido a digitação de: vimtutor <ENTER>.
+
+ 4. Se memorizou estes passos e está confiante, execute os passos de
+ 1 a 3 para sair e reentrar no editor.
+
+NOTA: :q! <ENTER> descarta qualquer mudança. Em uma próxima lição será
+ ensinado como salvar as mudanças feitas em um arquivo.
+
+ 5. Desça o cursor até a Lição 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 1.3: EDITAR TEXTOS - REMOÇÃO
+
+ ** Pressione x para deletar o caractere sob o cursor. **
+
+
+ 1. Mova o cursor para a linha abaixo marcada com --->.
+
+ 2. Para corrigir os erros, mova o cursor até que ele esteja sobre o
+ caractere a ser deletado.
+
+ 3. Pressione a tecla x para remover o caractere incorreto.
+
+ 4. Repita os passos 2 até 4 até que a frase esteja correta.
+
+---> A vvaca pullouu por ccimaa dda luuua.
+
+ 5. Agora que a frase está correta, prossiga para a Lição 1.4.
+
+NOTA: Enquanto segue este tutorial, não tente memorizar, aprenda pelo uso.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 1.4: EDITAR TEXTOS - INSERÇÃO
+
+ ** Pressione i para inserir texto. **
+
+
+ 1. Mova o cursor até a primeira linha abaixo marcada com --->.
+
+ 2. Para deixar a primeira linha igual à segunda, mova o cursor para
+ o primeiro caractere DEPOIS de onde o texto deverá ser inserido.
+
+ 3. Pressione i e digite as adições necessárias.
+
+ 4. Assim que cada erro for corrigido pressione <ESC> para retornar ao modo
+ Normal. Repita os passos 2 até 4 para corrigir a frase.
+
+---> Tem text fatado nesta .
+---> Tem algum texto faltando nesta linha.
+
+ 5. Quando se sentir à vontade com a inserção de texto, mova o cursor para
+ a Lição 1.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 1.5: EDITAR TEXTO - ADICIONAR
+
+ ** Pressione A para adicionar texto. **
+
+ 1. Mova o cursor para a primeira linha abaixo marcada com --->.
+ Não importa sobre qual caractere o cursor estará na linha.
+
+ 2. Pressione A e digite as adições necessárias.
+
+ 3. Quando adicionar o texto, pressione <ESC> para retornar ao modo Normal.
+
+ 4. Mova o cursor para a segunda linha marcada ---> e repita os passos 2 e 3
+ para corrigir a frase.
+
+---> Há algum texto faltando nes
+ Há algum texto faltando nesta linha.
+---> Há algum texto faltan
+ Há algum texto faltando aqui.
+
+ 5. Quando se sentir confortável adicionando texto, vá para a Lição 1.6.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 1.6: EDITAR UM ARQUIVO
+
+ ** Use :wq para salvar um arquivo e sair. **
+
+ !! NOTA: Leia toda a lição antes de executar as instruções!!
+
+ 1. Saia deste tutorial como o fez na lição 1.2: :q!
+ Ou, se tiver acesso a outro terminal, faça o seguinte nele.
+
+ 2. No prompt do shell, digite esse comando: vim tutor <ENTER>
+ 'vim' é o comando para iniciar o editor Vim e 'tutor' é o nome do
+ arquivo que você quer editar. Use um arquivo que possa ser modificado.
+
+ 3. Insira e apague texto tal como aprendeu nas lições anteriores.
+
+ 4. Salve o arquivo com as mudanças e saia do Vim com: :wq <ENTER>
+
+ 5. Se tiver saído do vimtutor no passo 1, reinicie o vimtutor e vá para
+ o resumo seguinte.
+
+ 6. Após ler os passos acima e compreendê-los, execute-os.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIÇÃO 1
+
+ 1. O cursor é movido usando tanto as teclas de seta quanto as teclas hjkl.
+ h (esquerda) j (para baixo) k (para cima) l (direita)
+
+ 2. Para entrar no Vim a partir de um shell digite: vim NOMEDOARQUIVO <ENTER>
+
+ 3. Para sair do Vim digite: <ESC> :q! <ENTER> para descartar as alterações.
+ OU digite: <ESC> :wq <ENTER> para salvar as alterações.
+
+ 4. Para deletar um caractere sob o cursor no modo Normal digite: x
+
+ 5. Para inserir texto na posição do cursor enquanto estiver no modo Normal
+ digite:
+ i digite o texto <ESC> inserir depois do cursor
+ A digite o texto <ESC> adicionar no final da linha
+
+NOTA: Pressionando <ESC> você irá para o modo Normal ou cancelará um comando
+ ainda incompleto.
+
+Agora continue com a Lição 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 2.1: COMANDOS DE REMOÇÃO
+
+ ** Digite dw para apagar uma palavra. **
+
+
+ 1. Pressione <ESC> para ter certeza de que está no modo Normal.
+
+ 2. Mova o cursor até a linha abaixo marcada com --->.
+
+ 3. Mova o cursor até o começo da palavra que precisa ser deletada.
+
+ 4. Digite dw para fazer a palavra desaparecer.
+
+ NOTA: A letra d vai aparecer na última linha da tela enquanto você a
+ digita. O Vim o está esperando digitar um w . Se digitou
+ alguma coisa errada, pressione <ESC> e comece de novo.
+
+---> Tem a algumas oi palavras diversão que não pertencem papel a esta frase.
+
+ 5. Repita os passos 3 ao 4 até que a frase esteja correta e vá para a
+ Lição 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 2.2: MAIS COMANDOS DE REMOÇÃO
+
+ ** Digite d$ para deletar até o fim da linha. **
+
+
+
+ 1. Pressione <ESC> para ter certeza de estar no modo Normal.
+
+ 2. Mova o cursor até a linha abaixo marcada com --->.
+
+ 3. Mova o cursor até o fim da linha correta (DEPOIS do primeiro . ).
+
+ 4. Digite d$ para apagar até o fim da linha.
+
+---> Alguém digitou o fim desta linha duas vezes. desta linha duas vezes.
+
+ 5. Vá para a lição 2.3 para entender o funcionamento deste comando.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 2.3: SOBRE OPERADORES E MOVIMENTOS
+
+ Muitos comandos que mudam texto são feitos de um operador e de um movimento.
+ O formato para um comando apagar com o operador de remoção d tem a
+ seguinte forma:
+
+ d movimento
+
+ Onde:
+ d - é o operador apagar.
+ movimento - é o movimento sobre o qual o operador age (listado abaixo).
+
+ Uma pequena lista de teclas de movimento:
+ w - até o início da próxima palavra, excluindo seu primeiro caractere.
+ e - até o fim da palavra atual, incluindo seu último caractere.
+ $ - até o fim da linha, incluindo seu último caractere.
+
+ Portanto, digitar de apaga do cursor ao fim da palavra.
+
+NOTA: Pressionar apenas a tecla de movimento em modo Normal, sem o
+operador, faz o cursor se mover como especificado na lista de teclas de
+movimento.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 2.4: USAR UM CONTADOR PARA UM MOVIMENTO
+
+ ** Digitar um número antes de um movimento repete-o o tanto de vezes. **
+
+
+ 1. Mova o cursor para o começo da linha marcada com ---> abaixo.
+
+ 2. Digite 2w para mover o cursor duas palavras adiante.
+
+ 3. Digite 3e para mover o cursor para o fim da terceira palavra adiante.
+
+ 4. Digite 0 (zero) para mover para o início da linha.
+
+ 5. Repita os passos 2 e 3 com diferentes números.
+
+---> Esta é uma linha com algumas palavras para permiti-lo fazer movimentos.
+
+ 6. Vá para a Lição 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 2.5: USAR UM CONTADOR PARA APAGAR MAIS
+
+ ** Digitar um número com um operador repete-o esse número de vezes. **
+
+
+ Você deve inserir um contador entre o operador de remoção e o de movimento
+ mencionados acima para apagar mais:
+ d número movimento
+
+ 1. Movimente o cursor para a primeira palavra em LETRAS MAIÚSCULAS na
+ linha marcada com --->.
+
+ 2. Digite d2w para deletar as duas palavras em LETRAS MAIÚSCULAS.
+
+ 3. Repita os passos 1 e 2 com diferentes contadores para deletar as
+ palavras em LETRAS MAIÚSCULAS com um comando.
+
+---> esta ABC DE linha FGHI JK LMN OP de palavras está Q RS TUV limpa.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 2.6: TRABALHAR COM LINHAS
+
+ ** Digite dd para apagar uma linha inteira. **
+
+ Em virtude da frequência em deletar uma linha inteira, os desenvolvedores
+ do Vi decidiram que seria mais simples digitar dois d para apagar uma linha.
+
+ 1. Mova o cursor até a segunda linha da frase abaixo.
+ 2. Digite dd para apagar a linha.
+ 3. Agora mova até a quarta linha.
+ 4. Digite 2dd para apagar duas linhas.
+
+---> 1) Rosas são vermelhas,
+---> 2) Lama é divertida,
+---> 3) Violetas são azuis,
+---> 4) Eu tenho um carro,
+---> 5) Relógios dizem as horas,
+---> 6) Açúcar é doce,
+---> 7) Assim como você.
+
+Notas do tradutor: Lama (mud) em inglês pode significar fofoca, difamação.
+ Há rima no texto original.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 2.7: O COMANDO UNDO (DESFAZER)
+
+** Pressione u para desfazer os últimos comandos, U recupera a linha inteira.**
+
+
+ 1. Mova o cursor para a linha abaixo marcada com ---> e posicione-o sobre o
+ primeiro erro.
+ 2. Digite x para deletar o primeiro caractere errado.
+ 3. Agora, digite u para desfazer o último comando executado.
+ 4. Desta vez, corrija todos os erros na linha usando o comando x .
+ 5. Agora, digite um U maiúsculo para retornar a linha ao seu estado original.
+ 6. Digite u algumas vezes para desfazer o U e os comandos anteriores.
+ 7. Digite CTRL-R (segurando a tecla CTRL enquanto digita R) algumas vezes
+ para refazer os comandos (desfazer os undos).
+
+---> Corriija os erros nnesta linha e reetorne-os com undo.
+
+ 8. Esses comandos são muito úteis. Agora vá para o resumo da Lição 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIÇÃO 2
+
+
+ 1. Para apagar do cursor até a próxima palavra, digite: dw
+ 2. Para apagar do cursor até o fim de uma linha, digite: d$
+ 3. Para apagar uma linha inteira, digite: dd
+ 4. Para repetir um movimento, adicione antes um número: 2w
+ 5. O formato para um comando no modo Normal é:
+ operador [número] movimento
+ onde:
+ operador - é o que será feito, como d para apagar
+ [número] - quantas vezes o comando será repetido
+ movimento - movimento sobre o texto que receberá a operação, como
+ w (palavra), $ (até o fim da linha), etc.
+
+ 6. Para ir ao início da linha, use um zero: 0
+
+ 7. Para desfazer uma ação anterior, digite: u (minúsculo)
+ Para desfazer todas as alterações em uma linha, digite: U (maiúsculo)
+ Para desfazer o que foi desfeito, digite: CTRL-R
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 3.1: O COMANDO COLAR
+
+ ** Digite p para colar após o cursor o que acabou de apagar. **
+
+
+ 1. Mova o cursor até a primeira linha marcada com --->.
+
+ 2. Digite dd para apagar a linha e guardá-la num registro do Vim.
+
+ 3. Mova o cursor até a linha c) ACIMA de onde a linha apagada deveria estar.
+
+ 4. No modo Normal, digite p para inserir a linha.
+
+ 5. Repita os passos 2 ao 4 para pôr todas as linhas na ordem correta.
+
+---> d) Você pode aprender também?
+---> b) Violetas são azuis,
+---> c) Inteligência se aprende,
+---> a) Rosas são vermelhas,
+
+Nota do tradutor: Há rima no original.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 3.2: O COMANDO SUBSTITUIR
+
+ ** Digite rx para substituir o caractere sob o cursor por x . **
+
+
+ 1. Mova o cursor até a primeira linha abaixo marcada com --->.
+
+ 2. Mova o cursor até que esteja sobre o primeiro erro.
+
+ 3. Digite r e então o caractere que deveria estar lá.
+
+ 4. Repita os passos 2 e 3 até que a primeira linha esteja igual à segunda.
+
+---> Quendo este limha foi dugitada, alguem pressioniu algumas teclas erradzs!
+---> Quando esta linha foi digitada, alguém pressionou algumas teclas erradas!
+
+ 5. Agora vá para a Lição 3.3.
+
+NOTA: Lembre-se que você deve aprender pelo uso, não pela memorização.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 3.3: O OPERADOR CHANGE (MUDAR)
+
+ ** Para alterar até o fim de uma palavra, digite ce . **
+
+
+ 1. Mova o cursor até a primeira linha abaixo marcada com --->.
+
+ 2. Posicione o cursor sobre o u em lunba.
+
+ 3. Digite ce e a palavra correta (nesse caso, digite 'inha'.)
+
+ 4. Pressione <ESC> e mova para o próximo caractere a ser alterado.
+
+ 5. Repita os passos 3 e 4 até que a primeira frase esteja igual à segunda.
+
+---> Essa lunba tem pwlesmfr que ocrimmm soi alteradas cup o comando change.
+---> Essa linha tem palavras que precisam ser alteradas com o comando change.
+
+Note que ce não somente substitui a palavra, mas também o coloca no modo
+de Inserção.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 3.4: MAIS MUDANÇAS USANDO c
+
+ ** O operador change é usado com os mesmos movimentos que o delete. **
+
+
+ 1. O operador change trabalha da mesma maneira que o delete. O formato é:
+
+ c [número] movimento
+
+ 2. Os movimentos também são os mesmos: w (palavra) e $ (fim da linha).
+
+ 3. Mova até a primeira linha abaixo marcada com --->.
+
+ 4. Mova o cursor até o primeiro erro.
+
+ 5. Digite c$ e digite o resto da segunda linha para torná-las iguais e
+ pressione <ESC>.
+
+---> O fim desta linha precisa de ajuda para ficar igual à segunda.
+---> O fim desta linha precisa ser corrigido usando o comando c$.
+
+NOTA: Você pode usar a tecla Backspace para corrigir erros enquanto digita.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIÇÃO 3
+
+
+ 1. Para reinserir um texto que já foi apagado, digite p . Isso coloca o texto
+ deletado APÓS o cursor (se uma linha é deletada ela será inserida na linha
+ abaixo do cursor).
+
+ 2. Para substituir o caractere sob o cursor, digite r e então o caractere
+ que substituirá o original.
+
+ 3. O comando change possibilita mudar do cursor até onde o movimento for.
+ Ex: Digite ce para mudar do cursor até o fim de uma palavra, c$ para
+ mudar até o fim da linha.
+
+ 4. O formato para uma operação change é:
+
+ c [número] movimento
+
+Agora vá para a próxima lição.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 4.1: LOCALIZAÇÃO DO CURSOR E ESTADO DO ARQUIVO
+
+ ** Digite CTRL-G para mostrar sua localização no arquivo e seu estado.
+ Digite G para mover para uma linha do arquivo. **
+
+ Nota: Leia esta lição inteira antes de executar qualquer um dos passos!!
+
+ 1. Segure pressionada a tecla Ctrl e pressione g . Chamamos isso de
+ CTRL-G. Uma mensagem aparecerá no rodapé da página com o nome do arquivo
+ e a sua posição no arquivo. Lembre-se do número da linha para o Passo 3.
+
+NOTA: A posição do cursor pode estar visível no canto direito inferior da
+ tela. Isso acontece quando a opção 'ruler' está ativa
+ (veja :help 'ruler' ).
+
+ 2. Pressione G para se mover até o fim do arquivo.
+ Digite gg para se mover até o início do arquivo.
+
+ 3. Digite o número da linha em que estava e então G . Assim o cursor retornará
+ à linha em que estava quando pressionou CTRL-G.
+
+ 4. Se estiver seguro para fazê-los, execute os passos 1 a 3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 4.2: O COMANDO BUSCAR
+
+ ** Digite / seguido por uma frase para procurar por ela. **
+
+ 1. No modo Normal digite o caractere / . Note que ele e o cursor aparecem
+ no rodapé da tela, como ocorre com o comando : .
+
+ 2. Agora digite 'errroo' <ENTER>. Esta é a palavra que quer procurar.
+
+ 3. Para buscar a mesma palavra de novo, simplesmente tecle n .
+ Para buscar a mesma palavra na direção oposta, tecle N .
+
+ 4. Se quer procurar por uma frase de trás para frente, use ? em vez de / .
+
+ 5. Para voltar aonde estava, pressione CTRL-O (mantenha a tecla Ctrl
+ pressionada e pressione a tecla o). Repita para voltar a outras posições.
+ CTRL-I segue para posições mais recentes.
+
+---> "errroo" não é uma maneira de escrever erro; errroo é um erro.
+
+NOTA: Quando a busca atinge o fim do arquivo ela continuará do começo, a
+ menos que a opção 'wrapscan' esteja desativada.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 4.3: BUSCA DE PARÊNTESES CORRESPONDENTES
+
+ ** Digite % para encontrar um ),], ou } correspondente. **
+
+
+ 1. Posicione o cursor em qualquer (, [, ou { na linha abaixo marcada com --->.
+
+ 2. Agora digite o caractere % .
+
+ 3. O cursor deve estar no parêntese ou colchete que casa com o primeiro.
+
+ 4. Digite % para mover o cursor de volta ao primeiro colchete ou parêntese
+ (por casamento).
+
+---> Isto ( é uma linha de teste contendo (, [ ] e { }. ))
+
+Nota: Isso é muito útil para corrigir um programa com parêntese não-casado!
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 4.4: O COMANDO SUBSTITUIR
+
+ ** Digite :s/velho/novo/g para substituir 'velho' por 'novo'. **
+
+
+ 1. Mova o cursor para a linha abaixo marcada com --->.
+
+ 2. Digite :s/aa/a <ENTER> . Note que este comando somente muda a
+ primeira ocorrência na linha.
+
+ 3. Agora digite :s/aa/a/g significando substituir globalmente na linha.
+ Isto muda todas as ocorrências na linha.
+
+---> aa melhor época para ver aas flores é aa primavera.
+
+ 4. Para mudar toda ocorrência de uma string entre duas linhas,
+ digite :#,#s/velho/novo/g onde #,# são os números das duas linhas.
+ Digite :%s/velho/novo/g para mudar todas as ocorrências no arquivo
+ inteiro.
+ Digite :%s/velho/novo/gc para mudar todas as ocorrências no arquivo
+ inteiro, com a opção de confirmar cada
+ substituição.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIÇÃO 4
+
+
+ 1. CTRL-G mostra em que ponto do arquivo está e o estado dele.
+ G move para o fim do arquivo.
+ número G move para a linha com esse número.
+ gg move para a primeira linha.
+
+ 2. Digitando / seguido por uma expressão procura À FRENTE por ela.
+ Digitando ? seguido por uma expressão procura pela expressão de TRÁS
+ PARA FRENTE.
+ Após uma busca, digite n para achar a próxima ocorrência na mesma direção
+ ou N para procurar na direção oposta.
+ CTRL-O leva a posições antigas e CTRL-I a posições mais recentes.
+
+ 3. Digitando % enquanto o cursor está sobre um (,),[,],{, ou } localiza
+ o par que casa com ele.
+
+ 4. Para substituir:
+ o primeiro 'velho' de uma linha por 'novo' digite :s/velho/novo
+ todos os 'velho' em uma linha por 'novo' digite :s/velho/novo/g
+ expressões entre dois números (#) de linhas digite :#,#s/velho/novo
+ todas as ocorrências no arquivo digite :%s/velho/novo/g
+ Para confirmar cada substituição adicione 'c' :%s/velho/novo/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 5.1: COMO EXECUTAR UM COMANDO EXTERNO
+
+
+ ** Digite :! seguido por um comando externo para executá-lo. **
+
+ 1. Digite o familiar comando : para levar o cursor ao rodapé da tela. Isso
+ o permite entrar um comando.
+
+ 2. Agora digite o caractere ! (ponto de exclamação). Isso o permite
+ executar qualquer comando do shell.
+
+ 3. Como um exemplo digite ls seguindo o ! e então tecle <ENTER>. Isto
+ mostrará uma listagem do seu diretório, como se você estivesse no
+ prompt do shell. Ou use :!dir se ls não funcionar.
+
+NOTA: É possível executar qualquer comando externo dessa maneira, inclusive
+ com argumentos.
+
+NOTA: Todos os comandos : devem ser finalizados teclando-se <ENTER>
+ Daqui em diante não mencionaremos isso todas as vezes.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 5.2: MAIS SOBRE SALVAR ARQUIVOS
+
+ ** Para salvar as alterações no texto, digite :w NOMEDOARQUIVO. **
+
+
+ 1. Digite :!dir ou :!ls para ter uma listagem de seu diretório.
+ Você já deve saber que precisa teclar <ENTER> depois disso.
+
+ 2. Escolha um nome de arquivo que ainda não exista, como TESTE.
+
+ 3. Agora digite: :w TESTE (onde TESTE é o nome que você escolheu.)
+
+ 4. Isto salva o arquivo inteiro (o Vim Tutor) com o nome TESTE.
+ Para verificar isso, digite :!ls de novo para ver seu diretório.
+
+NOTA: Se sair do Vim e entrar de novo com o nome do arquivo TESTE,
+ o arquivo deve ser uma cópia exata do tutorial quando você o salvou.
+
+ 5. Agora remova o arquivo digitando (MS-DOS): :!del TESTE
+ ou (Unix): :!rm TESTE
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 5.3: SELECIONAR O TEXTO A SER SALVO
+
+ ** Para salvar parte de um arquivo, digite v movimento :w NOMEDOARQUIVO **
+
+ 1. Mova o cursor para esta linha.
+
+ 2. Pressione v e mova o cursor para o quinto item abaixo. Note que o texto
+ é realçado.
+
+ 3. Pressione o caractere : e note que aparecerá :'<,'> no lado inferior
+ da tela.
+
+ 4. Digite w TESTE , sendo TESTE um nome de arquivo que não existe ainda.
+ Certifique-se de ver :'<,'>w TESTE antes de pressionar <ENTER>.
+
+ 5. O Vim salvará as linhas selecionadas no arquivo TESTE. Use :!dir ou
+ !:ls para vê-lo. Não o apague ainda! Nós o usaremos na próxima lição.
+
+NOTA: Pressionar v inicia o modo Visual de seleção. Você pode mover o
+cursor pela tela para tornar a seleção maior ou menor. Pode, então, usar um
+operador para executar alguma ação. Por exemplo, d apaga o texto.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 5.4: RECUPERAR E UNIR ARQUIVOS
+
+ ** Para inserir o conteúdo de um arquivo, digite :r NOMEDOARQUIVO **
+
+
+ 1. Posicione o cursor logo acima desta linha.
+
+NOTA: Depois de executar o Passo 2 você verá a Lição 5.3. Então DESÇA o
+ cursor para ver esta lição novamente.
+
+ 2. Agora recupere o arquivo TESTE usando o comando :r TESTE onde TESTE é o
+ nome do arquivo.
+ O arquivo recuperado é colocado abaixo da linha atual do cursor.
+
+ 3. Para verificar que o arquivo foi recuperado, volte com o cursor e verifique
+ que agora existem duas cópias da Lição 5.3, a original e a versão do
+ arquivo.
+
+NOTA: Você também pode ler a saída de um comando externo. Por exemplo, :r !ls
+ lê a saída do comando ls e coloca o resultado abaixo do cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIÇÃO 5
+
+
+ 1. :!comando executa um comando externo.
+
+ Alguns exemplos úteis são:
+ (MS-DOS) (UNIX)
+ :!dir :!ls - lista conteúdo do diretório.
+ :!del ARQUIVO :!rm ARQUIVO - remove ARQUIVO.
+
+ 2. :w ARQUIVO salva o atual arquivo do Vim para o disco com o nome ARQUIVO.
+
+ 3. v movimento :w ARQUIVO salva as linhas Visualmente selecionadas em
+ ARQUIVO.
+
+ 4. :r ARQUIVO recupera ARQUIVO do disco e o insere dentro do arquivo atual
+ na posição do cursor.
+
+ 5. :r !dir lê a saída do comando dir e coloca o resultado abaixo da posição
+ atual do cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 6.1: O COMANDO ABRIR
+
+ ** Digite o para abrir uma linha em baixo do cursor e ir para o modo de
+ Inserção. **
+
+ 1. Mova o cursor para a linha abaixo marcada com --->.
+
+ 2. Digite o (minúsculo) para abrir uma linha ABAIXO do cursor e ir para o
+ modo de Inserção.
+
+ 3. Agora digite algum texto e pressione <ESC> para sair do modo de
+ Inserção.
+
+---> Após teclar o o cursor é colocado na linha aberta no modo de Inserção.
+
+ 4. Para abrir uma linha ACIMA do cursor, simplesmente tecle um O maiúsculo,
+ em vez de um o minúsculo. Tente isso na linha abaixo.
+
+---> Abra uma linha acima desta teclando O enquanto o cursor está nesta linha.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 6.2: O COMANDO ADICIONAR
+
+ ** Digite a para inserir texto DEPOIS do cursor. **
+
+ 1. Mova o cursor para o início da linha marcada com ---> .
+
+ 2. Pressione e até o cursor ficar sobre o final de li .
+
+ 3. Digite um a (minúsculo) para adicionar texto DEPOIS do caractere sob o
+ cursor.
+
+ 4. Complete a palavra conforme a linha abaixo. Pressione <ESC> para sair do
+ modo de Inserção.
+
+ 5. Use e para mover para a próxima palavra incompleta repita os passos 3
+ e 4.
+
+---> Esta lin o permite pratic a adiç de texto a uma linha.
+---> Esta linha o permite praticar a adição de texto a uma linha.
+
+NOTA: a, i e A levam ao mesmo modo de Inserção, a única diferença é onde os
+ caracteres são inseridos.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 6.3: UMA OUTRA VERSÃO DO SUBSTITUIR
+
+ ** Digite um R maiúsculo para substituir mais de um caractere. **
+
+
+ 1. Mova o cursor para a primeira linha abaixo marcada com --->. Mova o
+ cursor para o início do primeiro xxx .
+
+ 2. Agora pressione R e digite os números que estão abaixo dele, na segunda
+ linha, para substituir o xxx .
+
+ 3. Pressione <ESC> para sair do modo de Substituição. Note que o resto da
+ linha permanece inalterado.
+
+ 4. Repita os passos para substituir os xxx restantes.
+
+---> Adicionando 123 a xxx resulta em xxx.
+---> Adicionando 123 a 456 resulta em 579.
+
+NOTA: O modo de Substituição é como o modo de Inserção, mas cada caractere
+ digitado apaga um caractere existente.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 6.4: COPIAR E COLAR TEXTO
+
+ ** Use o operador y para copiar texto e p para colá-lo. **
+
+ 1. Vá à linha marcada com ---> abaixo e posicione o cursor após "a)".
+
+ 2. Inicie o modo Visual com v e mova o cursor para logo antes de
+ "primeiro".
+
+ 3. Digite y para copiar o texto selecionado.
+
+ 4. Mova o cursor para o fim da próxima linha: j$
+
+ 5. Digite p para colar o texto. Então, digite: o segundo <ESC> .
+
+ 6. Use o modo Visual para selecionar " item.", copie-o com y , mova para
+ o fim da próxima linha com j$ e cole o texto com p .
+
+---> a) esse é o primeiro item.
+ b)
+
+NOTA: Você também pode usar y como um operador; por exemplo, yw copia uma
+ palavra.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 6.5: CONFIGURAR PREFERÊNCIAS
+
+ ** Configure uma preferência de modo que uma busca ou substituição
+ ignore se as letras são maiúsculas ou minúsculas. **
+
+ 1. Procure por 'ignore' entrando: /ignore <ENTER>
+ Repita várias vezes teclando n .
+
+ 2. Configure a opção 'ic' (Ignore case) digitando: :set ic
+
+ 3. Agora procure por 'ignore' de novo teclando: n
+ Repita várias vezes.
+
+ 4. Configure as opções 'hlsearch' e 'incsearch': :set hls is
+
+ 5. Agora entre com o comando buscar de novo, e veja o que acontece:
+ /ignore
+
+ 6. Para desabilitar a diferenciação entre maiúsculas e minúsculas:
+ :set noic
+
+NOTA: Para remover o realce dos termos localizados entre: :nohlsearch
+NOTA: Se quiser ignorar a diferença entre maiúsculas e minúsculas em apenas
+ uma pesquisa, use \c no comando: /ignore\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIÇÃO 6
+
+ 1. Digite o para abrir uma linha ABAIXO do cursor e iniciar o modo de
+ Inserção.
+ Digite O para abrir uma linha ACIMA da linha onde o cursor está.
+
+ 2. Digite a para adicionar texto DEPOIS do caractere onde está o cursor.
+ Digite A para adicionar texto ao fim da linha.
+
+ 3. O comando e move o cursor para o fim de uma palavra.
+
+ 4. O operador y copia texto, p cola o texto copiado.
+
+ 5. Digitando R entra-se no modo de Substituição até que <ESC> seja
+ pressionado.
+
+ 6. Digitando ":set xxx" modifica-se a opção "xxx". Algumas opções são:
+ 'ic' 'ignorecase' ignora diferença entre maiúsculas/minúsculas
+ 'is' 'incsearch' realiza a busca enquanto se digita
+ 'hls' 'hlsearch' realça todos os trechos localizados
+ Você tanto pode usar o nome curto quanto o nome longo da opção.
+
+ 7. Adicione o prefixo "no" para desabilitar uma opção: :set noic
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LIÇÃO 7.1: OBTENDO AJUDA
+
+ ** Use o sistema de ajuda do próprio Vim **
+
+ O Vim possui sistema de ajuda abrangente. Para começar, tente algum
+ desses três:
+ - pressione a tecla <HELP> (se você tiver uma)
+ - pressione a tecla <F1> (se você tiver uma)
+ - digite :help <ENTER>
+
+ Leia o texto da ajuda para aprender como o sistema de ajuda funciona.
+ Digite CTRL-W CTRL-W para pular de uma janela a outra.
+ Digite :q <ENTER> para fechar a janela da ajuda.
+
+ Você pode encontrar ajuda sobre qualquer assunto, fornecendo um argumento
+ para o comando ":help". Tente isto (não se esqueça de pressionar <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 7.2: CRIAR UM SCRIPT DE INICIALIZAÇÃO
+
+ ** Habilite recursos do Vim **
+
+ O Vim tem muito mais recursos do que o Vi, mas na sua maioria eles são
+ desabilitados por padrão. Para usar mais recursos, você tem que criar um
+ arquivo "vimrc".
+
+ 1. Comece a editar o arquivo "vimrc". Isso depende do sistema:
+ :e ~/.vimrc para Unix
+ :e ~/_vimrc para MS-Windows
+
+ 2. Agora, leia o conteúdo do arquivo "vimrc" de exemplo:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Salve o arquivo com:
+ :w
+
+ Da próxima vez que o Vim for iniciado, ele usará realce de sintaxe. Você
+ pode adicionar suas configurações preferidas para esse arquivo "vimrc". Para
+ maiores informações, digite: :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lição 7.3: COMPLETAÇÃO
+
+ ** Completação da linha de comando com CTRL-D e <TAB> **
+
+ 1. Certifique-se de que o Vim não está no modo compatível: :set nocp
+
+ 2. Veja quais arquivos existem no diretório: :!ls ou :!dir
+
+ 3. Digite o início de um comando: :e
+
+ 4. Pressione CTRL-D e o Vim mostrará a lista dos comandos iniciados
+ com "e".
+
+ 5. Pressione <TAB> e o Vim completará o nome do comando para ":edit".
+
+ 6. Agora, adicione um espaço e o início do nome de um arquivo existente:
+ :edit ARQ
+
+ 7. Pressione <TAB>. O Vim completará o nome (se ele for único).
+
+NOTA: A completação funciona com muitos comandos. Basta pressionar CTRL-D e
+<TAB>. Isso é especialmente útil para :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ RESUMO DA LIÇÃO 7
+
+
+ 1. Digite :help ou pressione <F1> ou <Help> para abrir a janela de ajuda.
+
+ 2. Digite :help cmd para achar a ajuda sobre cmd .
+
+ 3. Digite CTRL-W CTRL-W para pular de uma janela a outra.
+
+ 4. Digite :q para fechar a janela de ajuda.
+
+ 5. Crie um script de inicialização vimrc para ativar automaticamente as suas
+ configurações preferidas.
+
+ 6. Quando pressionar um comando : , pressione CTRL-D para ver as possibilidades
+ de completação. Pressione <TAB> para usá-la.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Isto conclui o tutorial do Vim, uma breve apresentação do editor Vim,
+ somente o bastante para que você possa usar o editor com facilidade.
+ Ele está longe de ser completo, uma vez que o Vim possui muitos, muitos mais
+ comandos. O próximo passo é ler o manual: ":help user-manual".
+
+ Livro recomendado em Português sobre o Vim:
+ O editor de texto Vim - de Sérgio Luiz Araújo da Silva et al.
+ http://code.google.com/p/vimbook/
+
+ Para futura leitura e estudo, este livro é recomendado:
+ Vim - Vi Improved - de Steve Oualline
+ Editora: New Riders
+ Este é o primeiro livro completamente dedicado ao Vim. Especialmente útil
+ para iniciantes, com muitos exemplos e ilustrações.
+ Veja https://iccf-holland.org/click5.html
+
+ Esse livro é mais antigo e mais sobre o Vi do que sobre o Vim, mas também é
+ recomendado:
+ Learning the Vi Editor - de Linda Lamb
+ Editora: O'Reilly & Associates Inc.
+ Este é um bom livro para aprender quase tudo o que você quer fazer com o Vi.
+ A sexta edição também inclui informações sobre o Vim.
+
+ Este tutorial foi escrito por Michael C. Pierce e Robert K. Ware,
+ Colorado School of Mines, usando idéias fornecidas por Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Modificado para o Vim por Bram Moolenaar.
+
+ Versão 1.4 traduzida para o português por Marcelo Drudi Miranda, Escola
+ Politécnica da Universidade de São Paulo.
+
+ Revisão e atualização da tradução para a versão 1.7 por Jakson Aquino,
+ Universidade Federal do Ceará: E-mail: jalvesaq@gmail.com
+
+ Nova revisão e atualização para a versão 1.8 por Roní Gonçalves,
+ Universidade Federal de Uberlândia.
+
+ Last Change: 2017 Feb 11
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.ru b/runtime/tutor/tutor.ru
new file mode 100644
index 0000000..d1b5fd6
--- /dev/null
+++ b/runtime/tutor/tutor.ru
@@ -0,0 +1,1007 @@
+===============================================================================
+= VIM -- 1.7 =
+===============================================================================
+
+ Vim -- , ,
+ , , .
+ ,
+ ̣ Vim
+ .
+
+ 25-30
+ , .
+
+ ! .
+ , (
+ "vimtutor", ).
+
+ ,
+ . , ,
+ . ,
+ !
+
+ , CapsLock ,
+ j , , 1.1
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.1:
+
+
+** h,j,k,l , . **
+ ^
+ k : h .
+ < h l > l .
+ j j `'.
+ v
+ 1. , .
+
+ 2. `' (j) Σ .
+ , .
+
+ 3. `' 1.2.
+
+! , , <ESC>
+ (Normal mode).
+ .
+
+! ()
+ . , hjkl
+ , .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.2: VIM
+
+
+ !! ! , ,
+ !!
+
+ 1. <ESC> ( , ,
+ (Normal mode)).
+
+ 2. : :q! <ENTER>.
+ ( , :q!
+ .)
+ .
+
+ 3. , ,
+ . :
+ vimtutor <ENTER>
+
+ 4. , , 1 3
+ .
+
+! :q! <ENTER> .
+ .
+
+ 5. 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.3: --
+
+
+** x . **
+
+ 1. , --->.
+
+ 2. , ,
+ .
+
+ 3. x .
+
+ 4. 2 4 .
+
+---> .
+
+ 5. , , 1.4.
+
+! ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.4: --
+
+
+ ** , i . **
+
+ 1. , --->.
+
+ 2. , ,
+ .
+
+ 3. i .
+
+ 4. <ESC> .
+ 2 4, .
+
+---> .
+---> .
+
+ 5. , 1.5.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.5: --
+
+
+ ** , A . **
+
+ 1. , --->.
+ .
+
+ 2. A .
+
+ 3. <ESC>
+ .
+
+ 4. , --->
+ 2 4 .
+
+--->
+ .
+--->
+ .
+
+ 5. , 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.6:
+
+
+ ** :wq Vim. **
+
+ !! ! , ,
+ !!
+
+ 1. Vim, 1.2: :q!
+ , ,
+ Σ.
+
+ 2. :
+ vim tutor <ENTER>
+ `vim' -- Vim, `tutor' --
+ . , .
+
+ 3. , .
+
+ 4. Vim : :wq <ENTER>
+
+ 5. vimtutor 1, vimtutor
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1
+
+
+ 1. , hjkl.
+ h () j () k () l ()
+
+ 2. Vim ( ) :
+ vim _ <ENTER>
+
+ 3. Vim :
+ <ESC> :q! <ENTER> .
+ :
+ <ESC> :wq <ENTER> .
+
+ 4. , : x
+
+ 5. , :
+ i <ESC>
+ :
+ a <ESC>
+
+! <ESC> (Normal mode)
+ ף ۣ .
+
+ 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.1:
+
+
+ ** dw . **
+
+ 1. <ESC>, .
+
+ 2. , --->.
+
+ 3. , .
+
+ 4. dw .
+
+! dw
+ . - ң , <ESC>
+ .
+
+---> .
+
+ 5. 3 4,
+ 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.2:
+
+
+ ** d$ . **
+
+ 1. <ESC>, .
+
+ 2. , --->.
+
+ 3. ( ).
+
+ 4. d$ .
+
+---> - . .
+
+
+ 5. , , 2.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.3:
+
+
+ , , .
+ d :
+
+ d
+
+ :
+ d - .
+ - ( ).
+
+ :
+ w - , .
+ e - , .
+ $ - .
+ ^ - .
+
+! (Normal mode)
+ ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.4:
+
+
+ ** ģ
+ . **
+
+ 1. ---> .
+
+ 2. 2w ң .
+
+ 3. 3e ң .
+
+ 4. 0 () .
+
+ 5. 2 3 .
+
+---> .
+
+ 6. 2.5.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.5:
+
+
+ ** ģ
+ . **
+
+
+ :
+ d
+
+ 1. --->
+ .
+
+ 2. d2w .
+
+ 3. 1 2
+ .
+
+---> .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.6:
+
+
+ ** dd . **
+
+ , Vi
+ d.
+
+ 1. , .
+
+ 2. dd .
+
+ 3. ף .
+
+ 4. 2dd .
+
+---> 1) ,
+---> 2) , !
+---> 3) ``'', ``'' --- !
+---> 4) !
+---> 5) ...
+---> 6) `'
+---> 7) .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.7: `'
+
+
+ ** u , U
+ . **
+
+ 1. , --->,
+ .
+
+ 2. x .
+
+ 3. u () .
+
+ 4. , x .
+
+ 5. U ,
+ .
+
+ 6. u U .
+
+ 7. CTRL-R (.. CTRL
+ R) ( ).
+
+---> `'.
+
+ 8. . 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2
+
+
+ 1. : dw
+
+ 2. : d$
+
+ 3. : dd
+
+ 4. : 2w
+
+ 5. :
+
+ [] []
+ :
+ [] - ,
+ - , d
+ - , w (),
+ $ ( ), ..
+
+ 6. : 0
+
+ 7. () : u ( u)
+ () : U ( U)
+ : CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.1:
+
+
+ ** p ̣ . **
+
+ 1. , --->.
+
+ 2. dd ţ Vim'.
+
+ 3. ,
+ ̣ .
+
+ 4. p .
+
+ 5. 2 4, .
+
+---> ) .
+---> ) ,
+---> )
+---> )
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.2:
+
+
+ ** r , . **
+
+ 1. , --->.
+
+ 2. , .
+
+ 3. r , .
+
+ 4. 2 3, .
+
+---> 0 !
+---> - !
+
+ 5. 3.3.
+
+! , ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.3:
+
+
+ ** ce . **
+
+ 1. , --->.
+
+ 2. `o' `'.
+
+ 3. ce ( , `').
+
+ 4. <ESC> ( ,
+ ).
+
+ 5. 3 4 .
+
+---> .
+---> .
+
+ , ce ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.4: c
+
+
+ ** , . **
+
+ 1. , .
+ :
+
+ [] c c []
+
+ 2. : w (), $ ( ) ..
+
+ 3. , --->.
+
+ 4. .
+
+ 5. c$ ,
+ , <ESC>.
+
+---> , .
+---> c$ .
+
+! Backspace .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3
+
+
+ 1. , ̣, p .
+ ̣ ( ,
+ ).
+
+ 2. r .
+
+ 3.
+ . , ce
+ , c$ .
+
+ 4. :
+
+ [] c c []
+
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.1:
+
+
+ ** CTRL-g
+ . G (SHIFT-G)
+ . **
+
+! !
+
+ 1. Ctrl g .
+ , .
+ , 3.
+
+ 2. Shift g .
+
+ 3. , Shift-G.
+ Σ , , Ctrl-g.
+
+ 4. , 1 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.2:
+
+
+ ** / . **
+
+ 1. (Normal mode) / . ,
+ ,
+ : .
+
+ 2. '' <ENTER>. ,
+ .
+
+ 3. , , n .
+ , Shift-N .
+
+ 4. ,
+ ? / .
+
+ 5. , , Ctrl-O.
+ ( Ctrl o ).
+ . ң Ctrl-I .
+
+---> "" `'; .
+
+! ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.3:
+
+
+ ** % ), ] } . **
+
+ 1. (, [ { , --->.
+
+ 2. % .
+
+ 3. .
+
+ 4. % .
+
+---> ( , (, [ ] { } . ))
+
+! !
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.4:
+
+
+ ** :s///g '' ''. **
+
+ 1. , --->.
+
+ 2. :s// <ENTER> . ,
+ .
+
+ 3. :s///g , g
+ .
+ .
+
+---> , ,
+ .
+
+ 4.
+ ,
+ :#,#s///g #,# -- .
+ :%s///g .
+ :%s///gc
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4
+
+
+ 1. Ctrl-g .
+ Shift-G . , Shift-G
+ .
+ gg .
+
+ 2. /
+ .
+ ?
+ .
+ n
+ Shift-N
+ .
+
+ 3. % , (,),[,],{, }
+ .
+
+ 4. `' `' ,
+ :s//
+ `' `' ,
+ :s///g
+ ,
+ :#,#s///g
+ `' `' ,
+ :%s///g
+ , 'c'
+ :%s///gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.1:
+
+
+ ** :! , . **
+
+ 1. :
+ . .
+
+ 2. ! ( ).
+ , .
+
+ 3. ls ! <ENTER>.
+ , ,
+ . :!dir , ls
+ .
+
+!
+ .
+
+! , : ,
+ <ENTER>. .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.2:
+
+
+ ** , ģ ,
+ :w _. **
+
+ 1. :!dir :!ls
+ . , <ENTER>.
+
+ 2. , ݣ , TEST.
+
+ 3. :w TEST ( TEST -- , .)
+
+ 4. ( Vim) TEST.
+ , :!dir :!ls
+ .
+
+! Vim TEST
+ (.. vim TEST ),
+ , .
+
+ 5. , MS-DOS :!del TEST
+ Unix :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.3:
+
+
+ ** , v
+ ţ :w _ **
+
+ 1. .
+
+ 2. v . ,
+ .
+
+ 3. : :'<,'> .
+
+ 4. w TEST ( TEST -- , ݣ ).
+ <ENTER>, :'<,'>w TEST.
+
+ 5. Vim TEST. ,
+ :!dir :!ls . ,
+ .
+
+! v .
+ .
+ - , , d.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.4:
+
+
+ ** , :r _ **
+
+ 1. .
+
+! 2 5.3.
+ .
+
+ 2. TEST, :r TEST , TEST --
+ .
+
+ 3. ,
+ , Σ 5.3:
+ TEST.
+
+! . , :r !ls
+ ls .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5
+
+
+ 1. :! .
+
+ :
+ (MS-DOS) (Unix)
+ :!dir :!ls -- .
+ :!del :!rm -- .
+
+ 2. :w _ Vim
+ .
+
+ 3. v :w _
+ .
+
+ 4. :r _
+ .
+
+ 5. :r !dir dir .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.1:
+
+
+ ** o
+ (Insert mode) **
+
+ 1. , --->.
+
+ 2. o ( ) ,
+ (Insert mode).
+
+ 3. - <ESC>
+ .
+
+---> o ģ .
+
+ 4. , O ,
+ o . .
+
+---> , ţ Shift-O.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.2:
+
+
+ ** a , . **
+
+ 1. , --->.
+
+ 2. e c .
+
+ 3. a ( ) ,
+ . ( A
+ .)
+
+ 4. , . <ESC>
+ (Insert mode).
+
+ 5. e ۣ
+ 3 4.
+
+---> .
+---> .
+
+! a , i A ,
+ , .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.3:
+
+
+ ** R . **
+
+ 1. , --->,
+ xxx.
+
+ 2. R , ,
+ xxx.
+
+ 3. <ESC> . ,
+ Σ.
+
+ 4. xxx.
+
+---> 123 xxx xxx.
+---> 123 456 579.
+
+! , ģ
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.4:
+
+
+ ** y p **
+
+ 1. , --->, `)'.
+
+ 2. v
+ `'.
+
+ 3. y .
+
+ 4. j$ .
+
+ 5. p . `' <ESC>.
+
+---> ) .
+ )
+
+! yw ( y w )
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.5:
+
+
+ ** **
+
+ 1. `', : / <ENTER>.
+ , n .
+
+ 2. `ic' ( ), : :set ic
+
+ 3. `',
+ : n
+ , `' `'.
+
+ 4. `hlsearch' `incsearch': :set hls is
+
+ 5. , :
+ / <ENTER>
+
+ 6. ޣ : :set noic
+
+! : :nohlsearch
+
+! ,
+ \ : /\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6
+
+
+ 1. o .
+ O .
+
+ 2. a .
+ A .
+
+ 3. e .
+
+ 4. y , p -- .
+
+ 5. R <ESC> .
+
+ 6. `:set xxx' `xxx', :
+
+ `ic' `ignorecase'
+ `is' `incsearch'
+ `hls' `hlsearch'
+
+ 7. `no' : :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7.1:
+
+
+ ** **
+
+ Vim .
+ ң :
+ - <HELP> ( )
+ - <F1> ( )
+ - :help <ENTER>
+
+
+ .
+ CTRL-W CTRL-W .
+ :q <ENTER> .
+
+ ,
+ `:help'. ( <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7.2:
+
+
+ ** Vim **
+
+ Vim , Vi,
+ .
+ `vimrc'.
+
+ 1. `vimrc'.
+ :
+ :e ~/.vimrc Unix
+ :e ~/_vimrc MS-Windows
+
+ 2. `vimrc':
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. `vimrc':
+ :w
+
+ Vim .
+ , , `vimrc'.
+ :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7.3:
+
+
+ ** CTRL-D <TAB> **
+
+ 1. , Vim : :set nocp
+
+ 2. : :!ls :!dir
+
+ 3. : :e
+
+ 4. CTRL-D Vim `e'.
+
+ 5. <TAB> Vim `:edit'.
+
+ 6. : :edit
+
+ 7. <TAB> Vim , .
+
+! . CTRL-D
+ <TAB>. :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7
+
+
+ 1. :help <F1>, <Help> .
+
+ 2. :help cmd .
+
+ 3. CTRL-W CTRL-W .
+
+ 4. :q ( ).
+
+ 5. `vimrc'.
+
+ 6. : , CTRL-D
+ . <TAB> .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Vim.
+ Vim, , ̣ .
+ ̣ , Vim .
+ : `:help user-manual'.
+
+ :
+ Vim - Vi Improved, : Steve Oualline, : New Riders
+
+ Vim. .
+ .
+ . https://iccf-holland.org/click5.html
+
+ Vi, Vim,
+ :
+ Learning the Vi Editor, : Linda Lamb,
+ : O'Reilly & Associates Inc.
+
+ , ӣ, Vi.
+ Vim.
+
+ Michael C. Pierce Robert K. Ware, Colorado School of
+ Mines , Charles Smith, Colorado State
+ University. E-mail: bware@mines.colorado.edu.
+
+ Vim (Bram Moolenaar).
+
+ :
+ <a_kissel@eudoramail.com>, 2002.
+ ̣ <alyoshin.s@gmail.com>, 2014.
+
+ Translators:
+ Andrey Kiselev <a_kissel@eudoramail.com>, 2002.
+ Sergey Alyoshin <alyoshin.s@gmail.com>, 2014.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.ru.cp1251 b/runtime/tutor/tutor.ru.cp1251
new file mode 100644
index 0000000..4493f0e
--- /dev/null
+++ b/runtime/tutor/tutor.ru.cp1251
@@ -0,0 +1,1007 @@
+===============================================================================
+= VIM -- 1.7 =
+===============================================================================
+
+ Vim -- , ,
+ , , .
+ ,
+ Vim
+ .
+
+ 25-30
+ , .
+
+ ! .
+ , (
+ "vimtutor", ).
+
+ ,
+ . , ,
+ . ,
+ !
+
+ , CapsLock ,
+ j , , 1.1
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.1:
+
+
+** h,j,k,l , . **
+ ^
+ k : h .
+ < h l > l .
+ j j `'.
+ v
+ 1. , .
+
+ 2. `' (j) .
+ , .
+
+ 3. `' 1.2.
+
+! , , <ESC>
+ (Normal mode).
+ .
+
+! ()
+ . , hjkl
+ , .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.2: VIM
+
+
+ !! ! , ,
+ !!
+
+ 1. <ESC> ( , ,
+ (Normal mode)).
+
+ 2. : :q! <ENTER>.
+ ( , :q!
+ .)
+ .
+
+ 3. , ,
+ . :
+ vimtutor <ENTER>
+
+ 4. , , 1 3
+ .
+
+! :q! <ENTER> .
+ .
+
+ 5. 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.3: --
+
+
+** x . **
+
+ 1. , --->.
+
+ 2. , ,
+ .
+
+ 3. x .
+
+ 4. 2 4 .
+
+---> .
+
+ 5. , , 1.4.
+
+! ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.4: --
+
+
+ ** , i . **
+
+ 1. , --->.
+
+ 2. , ,
+ .
+
+ 3. i .
+
+ 4. <ESC> .
+ 2 4, .
+
+---> .
+---> .
+
+ 5. , 1.5.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.5: --
+
+
+ ** , A . **
+
+ 1. , --->.
+ .
+
+ 2. A .
+
+ 3. <ESC>
+ .
+
+ 4. , --->
+ 2 4 .
+
+--->
+ .
+--->
+ .
+
+ 5. , 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1.6:
+
+
+ ** :wq Vim. **
+
+ !! ! , ,
+ !!
+
+ 1. Vim, 1.2: :q!
+ , ,
+ .
+
+ 2. :
+ vim tutor <ENTER>
+ `vim' -- Vim, `tutor' --
+ . , .
+
+ 3. , .
+
+ 4. Vim : :wq <ENTER>
+
+ 5. vimtutor 1, vimtutor
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 1
+
+
+ 1. , hjkl.
+ h () j () k () l ()
+
+ 2. Vim ( ) :
+ vim _ <ENTER>
+
+ 3. Vim :
+ <ESC> :q! <ENTER> .
+ :
+ <ESC> :wq <ENTER> .
+
+ 4. , : x
+
+ 5. , :
+ i <ESC>
+ :
+ a <ESC>
+
+! <ESC> (Normal mode)
+ .
+
+ 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.1:
+
+
+ ** dw . **
+
+ 1. <ESC>, .
+
+ 2. , --->.
+
+ 3. , .
+
+ 4. dw .
+
+! dw
+ . - , <ESC>
+ .
+
+---> .
+
+ 5. 3 4,
+ 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.2:
+
+
+ ** d$ . **
+
+ 1. <ESC>, .
+
+ 2. , --->.
+
+ 3. ( ).
+
+ 4. d$ .
+
+---> - . .
+
+
+ 5. , , 2.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.3:
+
+
+ , , .
+ d :
+
+ d
+
+ :
+ d - .
+ - ( ).
+
+ :
+ w - , .
+ e - , .
+ $ - .
+ ^ - .
+
+! (Normal mode)
+ ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.4: ר
+
+
+ **
+ . **
+
+ 1. ---> .
+
+ 2. 2w .
+
+ 3. 3e .
+
+ 4. 0 () .
+
+ 5. 2 3 .
+
+---> .
+
+ 6. 2.5.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.5: ר
+
+
+ **
+ . **
+
+
+ :
+ d
+
+ 1. --->
+ .
+
+ 2. d2w .
+
+ 3. 1 2
+ .
+
+---> .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.6:
+
+
+ ** dd . **
+
+ , Vi
+ d.
+
+ 1. , .
+
+ 2. dd .
+
+ 3. .
+
+ 4. 2dd .
+
+---> 1) ,
+---> 2) , !
+---> 3) ``'', ``'' --- !
+---> 4) !
+---> 5) ...
+---> 6) `'
+---> 7) .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2.7: `'
+
+
+ ** u , U
+ . **
+
+ 1. , --->,
+ .
+
+ 2. x .
+
+ 3. u () .
+
+ 4. , x .
+
+ 5. U ,
+ .
+
+ 6. u U .
+
+ 7. CTRL-R (.. CTRL
+ R) ( ).
+
+---> `'.
+
+ 8. . 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2
+
+
+ 1. : dw
+
+ 2. : d$
+
+ 3. : dd
+
+ 4. : 2w
+
+ 5. :
+
+ [] []
+ :
+ [] - ,
+ - , d
+ - , w (),
+ $ ( ), ..
+
+ 6. : 0
+
+ 7. () : u ( u)
+ () : U ( U)
+ : CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.1:
+
+
+ ** p . **
+
+ 1. , --->.
+
+ 2. dd Vim'.
+
+ 3. ,
+ .
+
+ 4. p .
+
+ 5. 2 4, .
+
+---> ) .
+---> ) ,
+---> )
+---> )
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.2:
+
+
+ ** r , . **
+
+ 1. , --->.
+
+ 2. , .
+
+ 3. r , .
+
+ 4. 2 3, .
+
+---> 0 !
+---> - !
+
+ 5. 3.3.
+
+! , ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.3:
+
+
+ ** ce . **
+
+ 1. , --->.
+
+ 2. `o' `'.
+
+ 3. ce ( , `').
+
+ 4. <ESC> ( ,
+ ).
+
+ 5. 3 4 .
+
+---> .
+---> .
+
+ , ce ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3.4: c
+
+
+ ** , . **
+
+ 1. , .
+ Ÿ :
+
+ [] c c []
+
+ 2. : w (), $ ( ) ..
+
+ 3. , --->.
+
+ 4. .
+
+ 5. c$ ,
+ , <ESC>.
+
+---> , .
+---> c$ .
+
+! Backspace .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 3
+
+
+ 1. , , p .
+ ( ,
+ ).
+
+ 2. r .
+
+ 3.
+ . , ce
+ , c$ .
+
+ 4. :
+
+ [] c c []
+
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.1:
+
+
+ ** CTRL-g
+ . G (SHIFT-G)
+ . **
+
+! !
+
+ 1. Ctrl g .
+ , .
+ , 3.
+
+ 2. Shift g .
+
+ 3. , Shift-G.
+ , , Ctrl-g.
+
+ 4. , 1 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.2:
+
+
+ ** / . **
+
+ 1. (Normal mode) / . ,
+ ,
+ : .
+
+ 2. '' <ENTER>. ,
+ .
+
+ 3. , , n .
+ , Shift-N .
+
+ 4. ,
+ ? / .
+
+ 5. , , Ctrl-O.
+ ( Ctrl o ).
+ . Ctrl-I .
+
+---> "" `'; .
+
+! ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.3:
+
+
+ ** % ), ] } . **
+
+ 1. (, [ { , --->.
+
+ 2. % .
+
+ 3. .
+
+ 4. % .
+
+---> ( , (, [ ] { } . ))
+
+! !
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4.4:
+
+
+ ** :s///g '' ''. **
+
+ 1. , --->.
+
+ 2. :s// <ENTER> . ,
+ .
+
+ 3. :s///g , g
+ .
+ .
+
+---> , ,
+ .
+
+ 4.
+ ,
+ :#,#s///g #,# -- .
+ :%s///g .
+ :%s///gc
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 4
+
+
+ 1. Ctrl-g .
+ Shift-G . , Shift-G
+ .
+ gg .
+
+ 2. /
+ Ш .
+ ?
+ .
+ n
+ Shift-N
+ .
+
+ 3. % , (,),[,],{, }
+ .
+
+ 4. `' `' ,
+ :s//
+ `' `' ,
+ :s///g
+ ,
+ :#,#s///g
+ `' `' ,
+ :%s///g
+ , 'c'
+ :%s///gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.1:
+
+
+ ** :! , . **
+
+ 1. :
+ . .
+
+ 2. ! ( ).
+ , .
+
+ 3. ls ! <ENTER>.
+ , ,
+ . :!dir , ls
+ .
+
+!
+ .
+
+! , : ,
+ <ENTER>. .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.2:
+
+
+ ** , ,
+ :w _. **
+
+ 1. :!dir :!ls
+ . , <ENTER>.
+
+ 2. , , TEST.
+
+ 3. :w TEST ( TEST -- , .)
+
+ 4. ( Vim) TEST.
+ , :!dir :!ls
+ .
+
+! Vim TEST
+ (.. vim TEST ),
+ , .
+
+ 5. , MS-DOS :!del TEST
+ Unix :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.3:
+
+
+ ** , v
+ :w _ **
+
+ 1. .
+
+ 2. v . ,
+ .
+
+ 3. : :'<,'> .
+
+ 4. w TEST ( TEST -- , ).
+ <ENTER>, :'<,'>w TEST.
+
+ 5. Vim TEST. ,
+ :!dir :!ls . ,
+ .
+
+! v .
+ .
+ - , , d.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5.4:
+
+
+ ** , :r _ **
+
+ 1. .
+
+! 2 5.3.
+ .
+
+ 2. TEST, :r TEST , TEST --
+ .
+
+ 3. ,
+ , 5.3:
+ TEST.
+
+! . , :r !ls
+ ls .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 5
+
+
+ 1. :! .
+
+ :
+ (MS-DOS) (Unix)
+ :!dir :!ls -- .
+ :!del :!rm -- .
+
+ 2. :w _ Vim
+ .
+
+ 3. v :w _
+ .
+
+ 4. :r _
+ .
+
+ 5. :r !dir dir .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.1:
+
+
+ ** o
+ (Insert mode) **
+
+ 1. , --->.
+
+ 2. o ( ) ,
+ (Insert mode).
+
+ 3. - <ESC>
+ .
+
+---> o .
+
+ 4. , O ,
+ o . .
+
+---> , Shift-O.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.2:
+
+
+ ** a , . **
+
+ 1. , --->.
+
+ 2. e c .
+
+ 3. a ( ) ,
+ . ( A
+ .)
+
+ 4. , . <ESC>
+ (Insert mode).
+
+ 5. e
+ 3 4.
+
+---> .
+---> .
+
+! a , i A ,
+ , .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.3: ٨
+
+
+ ** R . **
+
+ 1. , --->,
+ xxx.
+
+ 2. R , ,
+ xxx.
+
+ 3. <ESC> . ,
+ .
+
+ 4. xxx.
+
+---> 123 xxx xxx.
+---> 123 456 579.
+
+! ,
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.4:
+
+
+ ** y p **
+
+ 1. , --->, `)'.
+
+ 2. v
+ `'.
+
+ 3. y .
+
+ 4. j$ .
+
+ 5. p . `' <ESC>.
+
+---> ) .
+ )
+
+! yw ( y w )
+ .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6.5:
+
+
+ ** **
+
+ 1. `', : / <ENTER>.
+ , n .
+
+ 2. `ic' ( ), : :set ic
+
+ 3. `',
+ : n
+ , `' `'.
+
+ 4. `hlsearch' `incsearch': :set hls is
+
+ 5. , :
+ / <ENTER>
+
+ 6. : :set noic
+
+! : :nohlsearch
+
+! ,
+ \ : /\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 6
+
+
+ 1. o .
+ O .
+
+ 2. a .
+ A .
+
+ 3. e .
+
+ 4. y , p -- .
+
+ 5. R <ESC> .
+
+ 6. `:set xxx' `xxx', :
+
+ `ic' `ignorecase'
+ `is' `incsearch'
+ `hls' `hlsearch'
+
+ 7. `no' : :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7.1:
+
+
+ ** **
+
+ Vim .
+ :
+ - <HELP> ( )
+ - <F1> ( )
+ - :help <ENTER>
+
+
+ .
+ CTRL-W CTRL-W .
+ :q <ENTER> .
+
+ ,
+ `:help'. ( <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7.2:
+
+
+ ** Vim **
+
+ Vim , Vi,
+ .
+ `vimrc'.
+
+ 1. `vimrc'.
+ :
+ :e ~/.vimrc Unix
+ :e ~/_vimrc MS-Windows
+
+ 2. `vimrc':
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. `vimrc':
+ :w
+
+ Vim .
+ , , `vimrc'.
+ :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7.3:
+
+
+ ** CTRL-D <TAB> **
+
+ 1. , Vim : :set nocp
+
+ 2. : :!ls :!dir
+
+ 3. : :e
+
+ 4. CTRL-D Vim `e'.
+
+ 5. <TAB> Vim `:edit'.
+
+ 6. : :edit
+
+ 7. <TAB> Vim , .
+
+! . CTRL-D
+ <TAB>. :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 7
+
+
+ 1. :help <F1>, <Help> .
+
+ 2. :help cmd .
+
+ 3. CTRL-W CTRL-W .
+
+ 4. :q ( ).
+
+ 5. `vimrc'.
+
+ 6. : , CTRL-D
+ . <TAB> .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Vim.
+ Vim, , .
+ , Vim .
+ : `:help user-manual'.
+
+ :
+ Vim - Vi Improved, : Steve Oualline, : New Riders
+
+ Vim. .
+ .
+ . https://iccf-holland.org/click5.html
+
+ Vi, Vim,
+ :
+ Learning the Vi Editor, : Linda Lamb,
+ : O'Reilly & Associates Inc.
+
+ , , Vi.
+ Vim.
+
+ Michael C. Pierce Robert K. Ware, Colorado School of
+ Mines , Charles Smith, Colorado State
+ University. E-mail: bware@mines.colorado.edu.
+
+ Vim (Bram Moolenaar).
+
+ :
+ <a_kissel@eudoramail.com>, 2002.
+ <alyoshin.s@gmail.com>, 2014.
+
+ Translators:
+ Andrey Kiselev <a_kissel@eudoramail.com>, 2002.
+ Sergey Alyoshin <alyoshin.s@gmail.com>, 2014.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.ru.utf-8 b/runtime/tutor/tutor.ru.utf-8
new file mode 100644
index 0000000..0c13f5d
--- /dev/null
+++ b/runtime/tutor/tutor.ru.utf-8
@@ -0,0 +1,1007 @@
+===============================================================================
+= Д о б р о п о ж а л о в а т ь в у ч е б н и к VIM -- версия 1.7 =
+===============================================================================
+
+ Vim -- это очень мощный редактор, имеющий множество команд, слишком много
+ для того, чтобы их все можно было описать в таком учебнике, как этот.
+ Этот учебник призван объяснить достаточное число команд для того, чтобы
+ вы могли с лёгкостью использовать Vim в качестве редактора общего
+ назначения.
+
+ Вам потребуется приблизительно 25-30 минут на освоение данного учебника в
+ зависимости от того, сколько времени вы потратите на эксперименты.
+
+ Внимание! Командами в уроках вы будете изменять этот текст. Создайте
+ копию этого файла, чтобы попрактиковаться на ней (если вы запустили
+ "vimtutor", то это уже копия).
+
+ Важно помнить, что этот учебник предназначен для обучения в процессе
+ использования. Это означает, что вы должны запускать команды для того,
+ чтобы как следует их изучить. Если вы просто прочитаете этот текст, то
+ не запомните команды!
+
+ Теперь убедитесь в том, что клавиша CapsLock не включена, и нажмите
+ клавишу j несколько раз, так, чтобы Урок 1.1 полностью поместился на
+ экране.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.1: ПЕРЕМЕЩЕНИЕ КУРСОРА
+
+
+** Для перемещения курсора нажмите клавиши h,j,k,l так, как показано ниже. **
+ ^
+ k Советы: Клавиша h находится слева и перемещает влево.
+ < h l > Клавиша l находится справа и перемещает вправо.
+ j Клавиша j похожа на стрелку `вниз'.
+ v
+ 1. Подвигайте курсор по экрану, пока не почувствуете себя уверенно.
+
+ 2. Надавите клавишу `вниз' (j) пока она не начнёт повторяться.
+ Теперь вы знаете, как перейти к следующему уроку.
+
+ 3. Используя клавишу `вниз' перейдите к Уроку 1.2.
+
+Замечание! Если вы пока не уверены в том, что набираете, нажмите <ESC> для
+ перехода в обычный режим (Normal mode). После этого перенаберите
+ требуемую команду.
+
+Замечание! Обычные клавиши управления курсором (стрелки) также должны
+ работать. Однако, клавиши hjkl позволят вам перемещаться
+ значительно быстрее, как только вы научитесь ими пользоваться.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.2: ЗАВЕРШЕНИЕ РАБОТЫ С VIM
+
+
+ !! ВНИМАНИЕ! Прежде, чем выполнять любой из описанных ниже шагов, прочтите
+ урок целиком !!
+
+ 1. Нажмите клавишу <ESC> (для того, чтобы удостовериться, что вы в обычном
+ режиме (Normal mode)).
+
+ 2. Наберите: :q! <ENTER>.
+ (Это означает, что вы должны набрать три символа :q! и нажать клавишу
+ ввод.) Это позволит вам выйти из редактора БЕЗ СОХРАНЕНИЯ любых сделанных
+ изменений.
+
+ 3. Когда вы увидите приглашение командной оболочки, наберите команду,
+ которая привела вас в этот учебник. Это может быть:
+ vimtutor <ENTER>
+
+ 4. Если вы уверены в том, что запомнили эти шаги, выполните шаги от 1 до 3
+ чтобы выйти и снова запустить редактор.
+
+Замечание! :q! <ENTER> отбрасывает любые сделанные вами изменения. Через
+ несколько уроков вы узнаете как сохранять изменения в файл.
+
+ 5. Переместите курсор вниз к Уроку 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.3: РЕДАКТИРОВАНИЕ ТЕКСТА -- УДАЛЕНИЕ
+
+
+** Находясь в обычном режиме нажмите x для удаления символа под курсором. **
+
+ 1. Переместите курсор к строке ниже, помеченной --->.
+
+ 2. Для исправления ошибок, переместите курсор, пока он не окажется над
+ удаляемым символом.
+
+ 3. Нажмите клавишу x для удаления требуемого символа.
+
+ 4. Повторите шаги со 2 по 4 пока строка не будет исправлена.
+
+---> От тттопота копытт пппыль ппо ппполю леттитт.
+
+ 5. Теперь, когда строка откорректирована, переходите к Уроку 1.4.
+
+Замечание! В ходе освоения этого учебника не пытайтесь запоминать, учите
+ в процессе использования.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.4: РЕДАКТИРОВАНИЕ ТЕКСТА -- ВСТАВКА
+
+
+ ** Находясь в обычном режиме, нажмите i для вставки текста. **
+
+ 1. Переместите курсор к первой строке ниже, помеченной --->.
+
+ 2. Для того, чтобы сделать первую строку идентичной второй, поместите
+ курсор на символ ПЕРЕД которым следует вставить текст.
+
+ 3. Нажмите i и наберите требуемые добавления.
+
+ 4. После исправления всех ошибок нажмите <ESC> для возврата в обычный режим.
+ Повторите шаги со 2 по 4, пока фраза не будет исправлена полностью.
+
+---> Часть текста в строке бесследно .
+---> Часть текста в этой строке бесследно пропала.
+
+ 5. Когда освоите вставку текста, переходите к Уроку 1.5.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.5: РЕДАКТИРОВАНИЕ ТЕКСТА -- ДОБАВЛЕНИЕ
+
+
+ ** Находясь в обычном режиме, нажмите A для добавления текста. **
+
+ 1. Переместите курсор к первой строке ниже, помеченной --->.
+ Не имеет значения на каком символе расположен курсор на этой строке.
+
+ 2. Нажмите A и наберите требуемые добавления.
+
+ 3. После добавления требуемого текста нажмите <ESC> для возврата в обычный
+ режим.
+
+ 4. Переместите курсор на следующую строку, помеченную ---> и повторите шаги
+ со 2 по 4 для исправления этой строки.
+
+---> Часть текста в этой строке бессле
+ Часть текста в этой строке бесследно пропала.
+---> Здесь также не достаёт час
+ Здесь также не достаёт части текста.
+
+ 5. Когда освоите добавление текста, переходите к Уроку 1.6.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.6: РЕДАКТИРОВАНИЕ ФАЙЛА
+
+
+ ** Используйте :wq для сохранения файла и выхода из Vim. **
+
+ !! ВНИМАНИЕ! Прежде, чем выполнять любой из описанных ниже шагов, прочтите
+ урок целиком !!
+
+ 1. Выйдите из Vim, как вы это узнали в Уроке 1.2: :q!
+ Или, если у вас есть доступ к другому терминалу, можете сделать следующее
+ в нём.
+
+ 2. По приглашению командной оболочки введите следующую команду:
+ vim tutor <ENTER>
+ `vim' -- команда для запуска редактора Vim, а `tutor' -- имя файла для
+ редактирования. Используете имя файла, который можно изменять.
+
+ 3. Вставляйте и удаляйте текст, как вы научились в предыдущих уроках.
+
+ 4. Сохраните файл с изменениями и выйдите из Vim выполнив: :wq <ENTER>
+
+ 5. Если вы вышли из vimtutor на шаге 1, перезапустите vimtutor и переходите
+ к следующему Резюме.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ РЕЗЮМЕ УРОКА 1
+
+
+ 1. Курсор перемещается либо клавишами со стрелками, либо клавишами hjkl.
+ h (влево) j (вниз) k (вверх) l (вправо)
+
+ 2. Для запуска Vim (из приглашения командной оболочки) наберите:
+ vim ИМЯ_ФАЙЛА <ENTER>
+
+ 3. Для завершения работы с Vim наберите:
+ <ESC> :q! <ENTER> чтобы отказаться от сохранения изменений.
+ Или наберите:
+ <ESC> :wq <ENTER> чтобы сохранить изменения.
+
+ 4. Для удаления символа под курсором в обычном режиме, нажмите: x
+
+ 5. Чтобы вставить текст перед курсором в обычном режиме, наберите:
+ i вводите вставляемый текст <ESC>
+ Чтобы добавить текст после курсора:
+ a вводите добавляемый текст <ESC>
+
+Замечание! Нажатие <ESC> переместит вас в обычный режим (Normal mode) либо
+ прервёт нежелательную и частично завершённую команду.
+
+Теперь переходите к Уроку 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.1: КОМАНДЫ УДАЛЕНИЯ
+
+
+ ** Наберите dw для удаления участка текста до конца слова. **
+
+ 1. Нажмите <ESC>, чтобы перейти в обычный режим.
+
+ 2. Переместите курсор вниз, к строке помеченной --->.
+
+ 3. Переместите курсор в начало слова, которое следует удалить.
+
+ 4. Наберите dw для удаления этого слова.
+
+Замечание! Во время набора буквы dw появятся справа в самой нижней строке
+ экрана. Если вы что-то наберёте неправильно, нажмите <ESC> и начните
+ сначала.
+
+---> Несколько слов рафинад в этом предложении автокран излишни.
+
+ 5. Повторите шаги 3 и 4, пока не исправите все ошибки и переходите к
+ Уроку 2.2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.2: ДОПОЛНИТЕЛЬНЫЕ КОМАНДЫ УДАЛЕНИЯ
+
+
+ ** Наберите d$ для удаления текста до конца строки. **
+
+ 1. Нажмите <ESC>, чтобы перейти в обычный режим.
+
+ 2. Переместите курсор вниз, к строке помеченной --->.
+
+ 3. Переместите курсор к концу правильной строки (ПОСЛЕ первой точки).
+
+ 4. Наберите d$ для удаления остатка строки.
+
+---> Кто-то набрал окончание этой строки дважды. окончание этой строки дважды.
+
+
+ 5. Чтобы лучше разобраться в том, как это происходит, переходите к Уроку 2.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.3: КОМАНДЫ И ОБЪЕКТЫ
+
+
+ Многие команды, изменяющие текст, состоят из оператора и объекта. Формат
+ команды удаления с оператором d следующий:
+
+ d объект
+
+ Здесь:
+ d - оператор удаления.
+ объект - над чем должна быть выполнена команда (перечислено ниже).
+
+ Краткий список объектов:
+ w - от курсора до конца слова, включая последующий пробел.
+ e - от курсора до конца слова, НЕ включая последующий пробел.
+ $ - от курсора до конца строки.
+ ^ - от курсора до начала строки.
+
+Замечание! Простое нажатие на символ объекта в обычном режиме (Normal mode)
+ без предварительного оператора переместит курсор так, как указано
+ в списке объектов.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.4: ИСПОЛЬЗОВАНИЕ СЧЁТЧИКА ДЛЯ ПЕРЕМЕЩЕНИЯ
+
+
+ ** Ввод числа перед оператором перемещения приведёт к его повторению
+ заданное количество раз. **
+
+ 1. Переместите курсор к началу строки отмеченной ---> ниже.
+
+ 2. Наберите 2w для перемещения курсора вперёд к началу второго слова.
+
+ 3. Наберите 3e для перемещения курсора вперёд к концу третьего слова.
+
+ 4. Наберите 0 (нуль) для перемещения к началу строки.
+
+ 5. Повторите шаги 2 и 3 с различными числами.
+
+---> Обычная строка из слов для вашего перемещения по ней.
+
+ 6. Переходите к Уроку 2.5.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.5: ИСПОЛЬЗОВАНИЕ СЧЁТЧИКА ДЛЯ УДАЛЕНИЯ
+
+
+ ** Ввод числа перед оператором приведёт к его повторению
+ заданное количество раз. **
+
+ Добавьте число перед перед объектом в комбинацию оператора удаления и
+ перемещения указанную выше для удаления указанного количества объектов:
+ d число объект
+
+ 1. Переместите курсор к первому слову из прописных букв в отмеченной --->
+ строке ниже.
+
+ 2. Наберите d2w для удаления двух слов из прописных букв.
+
+ 3. Повторите шаги 1 и 2 с другими числами для удаления последовательных слов
+ из прописных букв одной командой.
+
+---> эта АБВ ГД строка ЕЖЗИ КЛ МНО из слов П РС ТУФ очищена.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.6: ОПЕРАЦИИ СО СТРОКАМИ
+
+
+ ** Наберите dd для удаления целой строки. **
+
+ В связи с частой необходимостью удаления целой строки, создатели Vi решили
+ для упрощения сделать возможным удаление строки набором двух d.
+
+ 1. Переместите курсор вниз, ко второй строке фразы.
+
+ 2. Наберите dd для удаления строки.
+
+ 3. Теперь переместитесь к четвёртой строке.
+
+ 4. Наберите 2dd для удаления двух строк.
+
+---> 1) Летом я хожу на стадион,
+---> 2) О, как внезапно кончился диван!
+---> 3) Я болею за ``Зенит'', ``Зенит'' --- чемпион!
+---> 4) Печально я гляжу на наше поколение!
+---> 5) Его грядущее иль пусто иль темно...
+---> 6) Я сижу на скамейке в ложе `Б'
+---> 7) И играю на большой жестяной трубе.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.7: КОМАНДА `ОТМЕНА'
+
+
+ ** Нажмите u для отмены результата работы предыдущей команды, U для отмены
+ исправлений во всей строке. **
+
+ 1. Переместите курсор вниз, к строке помеченной --->, и установите его на
+ первую ошибку.
+
+ 2. Нажмите x для удаления первого неправильного символа.
+
+ 3. Теперь нажмите u для отмены (отката) последней выполненной команды.
+
+ 4. Исправьте все ошибки в строке, используя команду x .
+
+ 5. Теперь нажмите заглавную U для того, чтобы вернуть всю строку
+ в исходное состояние.
+
+ 6. Нажмите u несколько раз для отмены команды U и предыдущих команд.
+
+ 7. Нажмите теперь CTRL-R (т.е. удерживайте клавишу CTRL нажатой в момент
+ нажатия клавиши R) несколько раз для возврата команд (откат отката).
+
+---> Испрравьте оошибки в этойй строке и вернитте их сс помощьью `отмены'.
+
+ 8. Это были очень полезные команды. Далее переходите к Резюме Урока 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ РЕЗЮМЕ УРОКА 2
+
+
+ 1. Для удаления текста от курсора до конца слова наберите: dw
+
+ 2. Для удаления текста от курсора до конца строки наберите: d$
+
+ 3. Для удаления всей строки наберите: dd
+
+ 4. Для повтора перемещения введите количество перед командой: 2w
+
+ 5. Формат команды в обычном режиме имеет вид:
+
+ [число] команда объект ИЛИ команда [число] объект
+ где:
+ [число] - сколько раз повторить выполнение команды, опционально
+ команда - что выполнить, например d для удаления
+ объект - на что должна воздействовать команда, например w (слово),
+ $ (до конца строки), и т.д.
+
+ 6. Для перехода к началу строки используйте нуль: 0
+
+ 7. Для отмены (отката) предшествующих действий наберите: u (строчная u)
+ Для отмены (отката) всех изменений в строке наберите: U (прописная U)
+ Для отмены отката наберите: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.1: КОМАНДА ВСТАВКИ
+
+
+ ** Наберите p для вставки последнего удалённого текста после курсора. **
+
+ 1. Переместите курсор вниз, к строке помеченной --->.
+
+ 2. Наберите dd для удаления строки и её сохранения в буфере Vim'а.
+
+ 3. Переместите курсор к строке НАД тем местом, куда следует вставить
+ удалённую строку.
+
+ 4. Находясь в обычном режиме наберите p для вставки строки ниже курсора.
+
+ 5. Повторите шаги со 2 по 4, пока не расставите все строки в нужном порядке.
+
+---> г) И лучше выдумать не мог.
+---> б) Когда не в шутку занемог,
+---> в) Он уважать себя заставил
+---> а) Мой дядя самых честных правил
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.2: КОМАНДА ЗАМЕНЫ
+
+
+ ** Наберите r и символ, заменяющий символ под курсором. **
+
+ 1. Переместите курсор вниз, к строке помеченной --->.
+
+ 2. Установите курсор так, чтобы он находился над первой ошибкой.
+
+ 3. Наберите r и затем символ, исправляющий ошибку.
+
+ 4. Повторите шаги 2 и 3, пока первая строка не будет исправлена как вторая.
+
+---> В момегт набтра этой чтроки кое0кто с трудом попвдал по клваишам!
+---> В момент набора этой строки кое-кто с трудом попадал по клавишам!
+
+ 5. Теперь переходите к Уроку 3.3.
+
+Замечание! Помните, что вы должны учиться в процессе работы, а не просто
+ запоминая.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.3: КОМАНДА ИЗМЕНЕНИЯ
+
+
+ ** Для изменения конечной части слова наберите ce . **
+
+ 1. Переместите курсор вниз, к строке помеченной --->.
+
+ 2. Расположите курсор над буквой `o' в слове `сола'.
+
+ 3. Наберите ce и исправьте слово (в данном случае, наберите `лов').
+
+ 4. Нажмите <ESC> и переходите к следующей ошибке (к первому символу, который
+ надо изменить).
+
+ 5. Повторите шаги 3 и 4 пока первое предложение не станет идентичным второму.
+
+---> Несколько сола в эьгц строке тпгшцбь редалзкуюиесвх.
+---> Несколько слов в этой строке требуют редактирования.
+
+ Обратите внимание, что ce не только удаляет слово, но и переводит вас в
+ режим вставки.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.4: ПРОДОЛЖАЕМ ИЗМЕНЯТЬ С КОМАНДОЙ c
+
+
+ ** Команда замены используется с теми же объектами, что и команда удаления. **
+
+ 1. Команда изменения применяется таким же образом, как и команда удаления.
+ Её формат таков:
+
+ [число] c объект ИЛИ c [число] объект
+
+ 2. Объекты также совпадают: w (слово), $ (конец строки) и т.п.
+
+ 3. Переместите курсор вниз, к строке помеченной --->.
+
+ 4. Перейдите к первой ошибке.
+
+ 5. Наберите c$ и отредактируйте первую строку так, чтобы она совпадала со
+ второй, после чего нажмите <ESC>.
+
+---> Конец этой строки нуждается в помощи, чтобы стать похожим на второй.
+---> Конец этой строки нуждается в помощи команды c$ .
+
+Замечание! Клавиша Backspace может использоваться для исправления при наборе.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ РЕЗЮМЕ УРОКА 3
+
+
+ 1. Для вставки текста, который только что был удалён, наберите p . Эта
+ команда вставит удалённый текст ПОСЛЕ курсора (если была удалена строка,
+ то она будет помещена в строке под курсором).
+
+ 2. Для замены символа под курсором наберите r и затем заменяющий символ.
+
+ 3. Команда изменения позволяет вам изменить указанный объект от курсора до
+ окончания перемещения. Например, наберите ce для замены от курсора до
+ конца слова, c$ для изменения до конца строки.
+
+ 4. Формат команды изменения таков:
+
+ [число] c объект ИЛИ c [число] объект
+
+Теперь переходите к следующему уроку.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.1: ИНФОРМАЦИЯ О ФАЙЛЕ И РАСПОЛОЖЕНИИ В НЕМ
+
+
+ ** Наберите CTRL-g чтобы увидеть ваше месторасположение в файле и
+ информацию о файле. Наберите G (SHIFT-G) для перемещения к заданной
+ строке в файле. **
+
+Замечание! Прочитайте весь урок прежде чем выполнять любые команды!
+
+ 1. Удерживая клавишу Ctrl нажмите g . Внизу экрана появится строка статуса
+ с именем файла и номером строки, в которой вы находитесь. Запомните номер
+ строки, он потребуется на Шаге 3.
+
+ 2. Удерживая клавишу Shift нажмите g для перемещения к концу файла.
+
+ 3. Наберите номер строки, в которой вы находились и затем Shift-G. Это
+ вернёт вас к строке, в которой вы были, когда в первый раз нажали Ctrl-g.
+
+ 4. Если вы запомнили все вышесказанное, выполните шаги с 1 по 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.2: КОМАНДА ПОИСКА
+
+
+ ** Наберите / и затем введите искомую фразу. **
+
+ 1. В обычном режиме (Normal mode) наберите символ / . Обратите внимание,
+ что он вместе с курсором появится внизу экрана, как это происходит с
+ командой : .
+
+ 2. Теперь наберите 'ошшшибка' <ENTER>. Это то слово, которое вы будете
+ искать.
+
+ 3. Для того, чтобы повторить поиск, просто нажмите n .
+ Для поиска этой же фразы в обратном направлении, нажмите Shift-N .
+
+ 4. Если вы желаете сразу искать в обратном направлении, используйте
+ команду ? вместо / .
+
+ 5. Для того, чтобы вернуться туда, откуда вы начали поиск нажмите Ctrl-O.
+ (Удерживая нажатой клавишу Ctrl нажмите o ). Повторите несколько раз
+ для дальнейшего перехода. Для перехода вперёд используйте Ctrl-I .
+
+---> "ошшшибка" это не способ написания слова `ошибка'; ошшшибка это ошибка.
+
+Замечание! Если при поиске будет достигнут конец файла, то поиск будет продолжен
+ с начала.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.3: ПОИСК ПАРНЫХ СКОБОК
+
+
+ ** Наберите % для поиска парных ), ] или } . **
+
+ 1. Поместите курсор над любой из (, [ или { в строке ниже, помеченной --->.
+
+ 2. Теперь наберите символ % .
+
+ 3. Курсор должен перескочить на парную скобку.
+
+ 4. Наберите % для возврата курсора назад к первой скобке.
+
+---> Это ( строка, содержащая такие (, такие [ ] и такие { } скобки. ))
+
+Замечание! Это очень удобно при отладке программ с пропущенными скобками!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.4: СПОСОБ ИСПРАВЛЕНИЯ ОШИБОК
+
+
+ ** Наберите :s/было/стало/g для замены 'было' на 'стало'. **
+
+ 1. Переместите курсор вниз, к строке помеченной --->.
+
+ 2. Наберите :s/уводю/увожу <ENTER> . Обратите внимание на то, что эта
+ команда заменит только первое найденное вхождение в строке.
+
+ 3. Теперь наберите :s/уводю/увожу/g , добавленная в конце g означает
+ подстановку глобально во всей строке. Это заменит все найденные в строке
+ вхождения.
+
+---> Я уводю к отверженным селеньям, я уводю сквозь вековечный стон, я уводю к
+ забытым поколеньям.
+
+ 4. Для замены всех вхождений последовательности символов между двумя
+ строками,
+ наберите :#,#s/было/стало/g где #,# -- номера этих строк.
+ Наберите :%s/было/стало/g для замены всех вхождений во всем файле.
+ Наберите :%s/было/стало/gc для поиска всех вхождений во всем файле и
+ запроса подтверждения замены.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ РЕЗЮМЕ УРОКА 4
+
+
+ 1. Ctrl-g показывает ваше положение в файле и информацию о нем.
+ Shift-G перемещает вас в конец файла. Номер, за которым следует Shift-G
+ позволяет перейти к строке с этим номером.
+ gg перемещает вас к первой строке файла.
+
+ 2. Нажатие / и затем ввод строки позволяет произвести поиск этой строки
+ ВПЕРЁД по тексту.
+ Нажатие ? и затем ввод строки позволяет произвести поиск этой строки
+ НАЗАД по тексту.
+ После поиска наберите n для перехода к следующему вхождению искомой
+ строки в том же направлении или Shift-N для перехода в противоположном
+ направлении.
+
+ 3. Нажатие % , когда курсор находится на (,),[,],{, или } позволяет найти
+ парную скобку.
+
+ 4. Для подстановки `стало' вместо первого `было' в строке, наберите
+ :s/было/стало
+ Для подстановки `стало' вместо всех `было' в строке, наберите
+ :s/было/стало/g
+ Для замены в интервале между двумя строками, наберите
+ :#,#s/было/стало/g
+ Для замены всех вхождений `было' на `стало' в файле, наберите
+ :%s/было/стало/g
+ Чтобы редактор каждый раз запрашивал подтверждение, добавьте 'c'
+ :%s/было/стало/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.1: КАК ВЫПОЛНИТЬ ВНЕШНЮЮ КОМАНДУ
+
+
+ ** Наберите :! и затем внешнюю команду, которую следует выполнить. **
+
+ 1. Наберите уже знакомую вам команду : для установки курсора в командную
+ строку редактора. Это позволит вам ввести команду.
+
+ 2. Теперь наберите символ ! (восклицательный знак). Это позволит выполнить
+ внешнюю команду, используя командную оболочку.
+
+ 3. Для примера наберите ls после ! и нажмите <ENTER>. Команда выведет
+ список файлов в текущем каталоге, точно также, как если бы вы ввели эту
+ команду в приглашении оболочки. Или попробуйте :!dir , если команда ls
+ не сработала.
+
+Замечание! Таким способом можно выполнить любую внешнюю команду с указанием
+ аргументов.
+
+Замечание! Все команды, начинающиеся с : , должны завершаться нажатием
+ <ENTER>. Далее на это не всегда будет обращаться особое внимание.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.2: КАК ЗАПИСАТЬ ФАЙЛ
+
+
+ ** Для сохранения изменений, произведённых в файле,
+ наберите :w ИМЯ_ФАЙЛА. **
+
+ 1. Наберите :!dir или :!ls для получения списка файлов в текущем
+ каталоге. Как вам уже известно, после ввода команды надо нажать <ENTER>.
+
+ 2. Придумайте название для файла, которое ещё не существует, например TEST.
+
+ 3. Теперь наберите :w TEST (где TEST -- это имя файла, придуманное вами.)
+
+ 4. Команда сохранит весь этот файл (Учебник по Vim) под именем TEST. Чтобы
+ удостовериться в этом, снова наберите :!dir или :!ls и просмотрите
+ каталог.
+
+Замечание! Если вы выйдете из Vim и затем запустите его снова с файлом TEST
+ (т.е. выполните vim TEST ), этот файл будет точной копией учебника
+ в тот момент, когда вы его сохранили.
+
+ 5. Теперь удалите этот файл, набрав для MS-DOS :!del TEST
+ для Unix :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.3: ВЫБОРОЧНОЕ СОХРАНЕНИЕ
+
+
+ ** Для сохранения части файла, наберите v выберите часть
+ и сохраните её :w ИМЯ_ФАЙЛА **
+
+ 1. Переместите курсор к этой строке.
+
+ 2. Нажмите v и переместите курсор ниже к пятому шагу. Обратите внимание,
+ что текст подсвечен.
+
+ 3. Нажмите : и внизу экрана появится :'<,'> .
+
+ 4. Введите w TEST (где TEST -- имя файла, который ещё не существует).
+ До нажатия <ENTER>, проверьте что внизу экрана написано :'<,'>w TEST.
+
+ 5. Vim запишет выбранные строки в файл TEST. Как и прежде, убедитесь в
+ наличии этого файла командой :!dir или :!ls . НЕ УДАЛЯЙТЕ этот файл, он
+ потребуется в следующем уроке.
+
+Замечание! Нажатие v начинает визуальный выбор. Вы можете перемещать курсор
+ для изменения выбора. Затем для выбранного фрагмента можно выполнить
+ какой-то оператор, например, удалить нажатием d.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.4: ЧТЕНИЕ И ОБЪЕДИНЕНИЕ ФАЙЛОВ
+
+
+ ** Для вставки содержимого из файла, наберите :r ИМЯ_ФАЙЛА **
+
+ 1. Установите курсор над этой строкой.
+
+Замечание! После выполнения Шага 2 вы увидите текст из Урока 5.3. Переместитесь
+ ВНИЗ по тексту до этого урока.
+
+ 2. Теперь прочитайте ваш файл TEST, используя команду :r TEST , где TEST --
+ это имя файла.
+
+ 3. Для проверки что содержимое файла было вставлено, переместитесь по тексту
+ и удостоверьтесь, что теперь в нём две копии Урока 5.3: исходная и из
+ файла TEST.
+
+Замечание! Вставить можно и вывод внешней команды. Например, :r !ls прочитает
+ вывод команды ls и вставит его ниже курсора.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ РЕЗЮМЕ УРОКА 5
+
+
+ 1. :!команда исполняет внешнюю команду.
+
+ Некоторые полезные примеры:
+ (MS-DOS) (Unix)
+ :!dir :!ls -- вывести список файлов в каталоге.
+ :!del ИМЯ :!rm ИМЯ -- удалить файл по имени.
+
+ 2. :w ИМЯ_ФАЙЛА записывает текущий редактируемый в Vim файл на диск под
+ указанным именем.
+
+ 3. v перемещение :w ИМЯ_ФАЙЛА сохраняет визуально выбранные строки в файл
+ с указанным именем.
+
+ 4. :r ИМЯ_ФАЙЛА считывает с диска файл с указанным именем и помещает его
+ ниже курсора.
+
+ 5. :r !dir читает вывод команды dir и помещает его ниже курсора.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.1: КОМАНДА СОЗДАНИЯ
+
+
+ ** Наберите o чтобы создать пустую строку под курсором и перейти в режим
+ вставки (Insert mode) **
+
+ 1. Переместите курсор вниз, к строке помеченной --->.
+
+ 2. Наберите o (в нижнем регистре) для того, чтобы создать пустую строку
+ НИЖЕ курсора и перейти в режим вставки (Insert mode).
+
+ 3. Теперь наберите какой-нибудь текст и нажмите <ESC> для выхода из режима
+ вставки.
+
+---> После нажатия o курсор перейдёт на новую пустую строку в режиме вставки.
+
+ 4. Для создания строки ВЫШЕ курсора, просто наберите заглавную O , вместо
+ строчной o . Попробуйте проделать это с нижеследующей строкой.
+
+---> Создайте новую строку над этой, поместив на неё курсор и нажав Shift-O.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.2: КОМАНДА ДОБАВЛЕНИЯ
+
+
+ ** Наберите a , чтобы вставить текст ПОСЛЕ курсора. **
+
+ 1. Переместите курсор вниз, в начало первой строки помеченной --->.
+
+ 2. Набирайте e пока курсор не переместиться на конец cтро .
+
+ 3. Наберите a (в нижнем регистре) для добавления текста ПОСЛЕ символа,
+ находящегося под курсором. (Заглавная A позволяет добавить в конец
+ строки.)
+
+ 4. Допишите слово так, как показано в строке ниже. Нажмите <ESC> для выхода
+ из режима вставки (Insert mode).
+
+ 5. Используйте e для перехода к концу следующего незавершённого слова и
+ повторите шаги 3 и 4.
+
+---> Эта стро позволит вам попрактиков в добавле текста.
+---> Эта строчка позволит вам попрактиковаться в добавлении текста.
+
+Замечание! a , i и A переводят в один и тот же режим вставки, различие
+ только в том, где вставляются символы.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.3: ЕЩЁ ОДИН СПОСОБ ЗАМЕНЫ
+
+
+ ** Наберите заглавную R для замены более чем одного символа. **
+
+ 1. Переместите курсор вниз, к первой строке помеченной --->, и в начало
+ первого слова xxx.
+
+ 2. Теперь нажмите R и введите число, указанное ниже во второй строке, чтобы
+ заменить xxx.
+
+ 3. Нажмите <ESC> для выхода из режима замены. Заметьте, что остаток строки
+ не был изменён.
+
+ 4. Повторите эти шаги для замены оставшихся xxx.
+
+---> Добавление 123 к xxx даёт xxx.
+---> Добавление 123 к 456 даёт 579.
+
+Замечание! Режим замены похож на режим вставки, но каждый введённый символ
+ удаляет существующий.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.4: КОПИРОВАНИЕ И ВСТАВКА ТЕКСТА
+
+
+ ** Используйте команду y для копирования и p для вставки **
+
+ 1. Переместите курсор вниз, к первой строке помеченной --->, и после `а)'.
+
+ 2. Переключитесь в режим визуального выбора нажав v и переместите курсор
+ перед словом `первый'.
+
+ 3. Введите y для копирования подсвеченного текста.
+
+ 4. Переместите курсор в конец следующей строки комбинацией j$ .
+
+ 5. Нажмите p для вставки текста. Затем введите `второй' и нажмите <ESC>.
+
+---> а) Этот элемент первый.
+ б)
+
+Замечание! Также возможно использовать yw (команду y с оператором w ) для
+ копирования одного слова.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.5: УСТАНОВКА ПАРАМЕТРОВ
+
+
+ ** Установка параметра для игнорирования регистра при поиске или замене **
+
+ 1. Найдите слово `игнорировать', набрав: /игнорировать <ENTER>.
+ Повторите поиск несколько раз, нажимая клавишу n .
+
+ 2. Установите параметр `ic' (игнорировать регистр), набрав: :set ic
+
+ 3. Теперь снова несколько раз сделайте поиск слова `игнорировать',
+ нажимая: n
+ Заметьте, что теперь находятся `Игнорировать' и `ИГНОРИРОВАТЬ'.
+
+ 4. Установите параметры `hlsearch' и `incsearch': :set hls is
+
+ 5. Теперь опять введите команду поиска и посмотрите, что получится:
+ /игнорировать <ENTER>
+
+ 6. Для возвращения учёта регистра при поиске наберите: :set noic
+
+Замечание! Для отключения подсветки совпадений наберите: :nohlsearch
+
+Замечание! Если вы хотите игнорировать регистр только для одного поиска,
+ используйте \с в команде поиска: /игнорировать\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ РЕЗЮМЕ УРОКА 6
+
+
+ 1. Нажмите o для создания строки НИЖЕ курсора и перехода в режим вставки.
+ Нажмите O для создания строки ВЫШЕ курсора.
+
+ 2. Нажмите a для вставки текста ПОСЛЕ курсора.
+ Нажмите A для вставки текста в конец строки.
+
+ 3. Команда e подводит курсор к концу слова.
+
+ 4. Команда y копирует текст, p -- вставляет скопированный текст.
+
+ 5. Нажатие заглавной R переводит в режим замены до нажатия клавиши <ESC> .
+
+ 6. Наберите `:set xxx' для включения параметра `xxx', некоторые параметры:
+
+ `ic' `ignorecase' игнорирование регистра при поиске
+ `is' `incsearch' отображение частичных совпадений при поиске
+ `hls' `hlsearch' подсветка всех совпадений при поиске
+
+ 7. Добавьте `no' перед параметром для его отключения: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7.1: ВСТРОЕННАЯ СПРАВКА
+
+
+ ** Используйте встроенную справочную систему **
+
+ Vim обладает мощной встроенной справочной системой. Для начала попробуйте
+ один из трёх вариантов:
+ - нажмите клавишу <HELP> (если таковая имеется на клавиатуре)
+ - нажмите клавишу <F1> (если таковая имеется на клавиатуре)
+ - наберите :help <ENTER>
+
+ Прочитайте текст в окне справки для получения представления о том как
+ работает справка.
+ Нажмите CTRL-W CTRL-W для перехода от окна к окну.
+ Наберите :q <ENTER> чтобы закрыть окно справки.
+
+ Вы можете найти справку для любого понятия или команды, задав соответствующий
+ аргумент команде `:help'. Попробуйте следующее (не забудьте нажать <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7.2: СОЗДАНИЕ СТАРТОВОГО СЦЕНАРИЯ
+
+
+ ** Включим возможности Vim **
+
+ Vim имеет намного больше возможностей, чем Vi, но большинство из них по
+ умолчанию выключены. Для использования больших возможностей вам следует
+ создать файл `vimrc'.
+
+ 1. Отредактируйте новый файл `vimrc'. Его расположение зависит от
+ используемой системы:
+ :e ~/.vimrc для Unix
+ :e ~/_vimrc для MS-Windows
+
+ 2. Теперь прочитайте пример файла `vimrc':
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Запишите созданный вами новый файл `vimrc':
+ :w
+
+ Теперь при следующем запуске Vim будет включена подсветка синтаксиса. Все
+ настройки, предпочитаемые вами, могут быть добавлены в файл `vimrc'.
+ Для дальнейшей информации наберите :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7.3: ДОПОЛНЕНИЕ
+
+
+ ** Командную строку можно дополнить нажав CTRL-D и <TAB> **
+
+ 1. Удостоверьтесь, что Vim не в режиме совместимости: :set nocp
+
+ 2. Посмотрите какие файлы есть в каталоге: :!ls или :!dir
+
+ 3. Наберите начало команды: :e
+
+ 4. Нажмите CTRL-D и Vim отобразит список команд начинающихся на `e'.
+
+ 5. Нажмите <TAB> и Vim дополнит название команды до `:edit'.
+
+ 6. Теперь добавьте пробел и начало существующего имени файла: :edit ФАЙ
+
+ 7. Нажмите <TAB> и Vim дополнит имя файла, если оно уникальное.
+
+Замечание! Дополнение работает для многих команд. Попробуйте нажать CTRL-D и
+ <TAB>. Это особенно полезно для команды :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ РЕЗЮМЕ УРОКА 7
+
+
+ 1. Наберите :help или нажмите <F1>, или <Help> для открытия окна справки.
+
+ 2. Наберите :help cmd для поиска справки по команде.
+
+ 3. Нажмите CTRL-W CTRL-W для перехода к другому окну.
+
+ 4. Наберите :q для закрытия окна справки (если оно активно).
+
+ 5. Для хранения ваших настроек создайте стартовый сценарий `vimrc'.
+
+ 6. При наборе : команды, нажмите CTRL-D для отображения возможных
+ дополнений. Нажмите <TAB> для использования дополнения.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ На этом завершается Учебник Vim. Он был предназначен дать общее представление
+ о редакторе Vim, достаточное для того, чтобы с лёгкостью использовать его.
+ Учебник далёк от полноты, поскольку Vim имеет очень много команд. Прочитайте
+ теперь руководство пользователя: `:help user-manual'.
+
+ Для дальнейшего чтения рекомендуется книга:
+ Vim - Vi Improved, автор: Steve Oualline, издатель: New Riders
+
+ Эта книга полностью посвящена Vim. Особенно полезна она будет новичкам.
+ Содержит множество примеров и иллюстраций.
+ См. https://iccf-holland.org/click5.html
+
+ Следующая книга более почтенного возраста и посвящена больше Vi, чем Vim,
+ однако также рекомендуется:
+ Learning the Vi Editor, автор: Linda Lamb,
+ издатель: O'Reilly & Associates Inc.
+
+ Это хорошая книга, чтобы узнать всё, что только можно сделать в Vi. Шестое
+ издание также включает информацию о Vim.
+
+ Этот учебник написал Michael C. Pierce и Robert K. Ware, Colorado School of
+ Mines с использованием идей, которые предложил Charles Smith, Colorado State
+ University. E-mail: bware@mines.colorado.edu.
+
+ Доработано для Vim Брамом Моленаром (Bram Moolenaar).
+
+ Перевод:
+ Андрей Киселев <a_kissel@eudoramail.com>, 2002.
+ Сергей Алёшин <alyoshin.s@gmail.com>, 2014.
+
+ Translators:
+ Andrey Kiselev <a_kissel@eudoramail.com>, 2002.
+ Sergey Alyoshin <alyoshin.s@gmail.com>, 2014.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.sk b/runtime/tutor/tutor.sk
new file mode 100644
index 0000000..35b04c8
--- /dev/null
+++ b/runtime/tutor/tutor.sk
@@ -0,0 +1,1008 @@
+===============================================================================
+= V i t a j t e v o V I M T u t o r i a l i - Verzia 1.7 =
+===============================================================================
+
+ Vim je vemi vkonn editor, ktor m prli vea prkazov na to aby
+ mohli byt vetky popsan vo vuke akou je tto. Tto vuka
+ popisuje dostaton mnostvo prkazov nato aby bolo mon pouva
+ Vim ako viacelov editor.
+
+ Priblin as potrebn na prebratie tejto vuky je 25-30 mint,
+ zvis na tom, koko je strvenho asu s preskavanm.
+
+ UPOZORNENIE:
+ Prkazy v lekcich modifikuj text. Vytvor kpiu tohto sboru aby
+ sa mohlo precviova na om (pri tarte "vimtutor" je toto kpia).
+
+ Je dleit zapamta si, e tto vuka je vytvoren pre vuku
+ pouvanm. To znamen, e je potrebn si prkazy vyska, aby bolo
+ uenie sprvne. Ak len itas text, prkazy zabudne!
+
+ Presved sa, e Caps-Lock NIEJE stlaen a stlat klvesu
+ j niekoko krt, aby sa kurzor posunul natoko, e lekcia 1.1
+ celkom zapln obrazovku.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.1: POHYB KURZOROM
+
+
+ ** Pre pohyb kurzorum stla klvesy h,j,k,l ako je znzornen. **
+ ^
+ k Funkcia: Klvesa h je naavo a vykon pohyb doava.
+ < h l > Klvesa l je napravo a vykon pohyb doprava.
+ j Klvesa j vyzer ako pka dole
+ v
+ 1. Pohybuj kurzorom po obrazovke, km si na to nezvykne.
+
+ 2. Dr stlaen klvesu pre pohyb dole (j), km sa jej funkcia nezopakuje.
+---> Teraz sa u vie pohybova na nasledujcu lekciu.
+
+ 3. Pouitm klvesy pre pohyb dole prejdi na Lekciu 1.2.
+
+Poznmka: Ak si niesi ist tm o si napsal, stla <ESC>
+ na prechod do normlneho mdu.
+
+Poznmka: Kurzorov klvesy s tie funkn. Ale pouvanm hjkl sa bude
+ schopn pohybova rchlejie, ke si zvykne ich pouva. Naozaj!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 1.2: ZATVRANIE VIMU
+
+
+ !! POZNMKA: Pred vykonanm tchto krokov si pretaj cel tto lekciu !!
+
+ 1. Stla klvesu <ESC> (aby si sa uite nachdzal v normlnom mde)
+
+ 2. Nap: :q! <ENTER>.
+ Tm ukon prcu s editorom BEZ uloenia zmien, ktor si vykonal.
+
+ 3. Ke sa dostane na prkazov riadok, nap prkaz, ktorm sa dostane
+ spe do tejto vuky. To me by: vimtutor <ENTER>
+
+ 4. Ak si si tieto kroky spoahlivo zapamtal, vykonaj kroky 1 a 3, pre
+ ukonenie a znovu spustenie editora.
+
+POZNMKA: :q! <ENTER> neulo zmeny, ktor si vykonal. O niekoko lekci
+ sa nau ako uloi zmeny do sboru
+
+ 5. presu kurzor dole na lekciu 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.3: EDITCIA TEXTU - MAZANIE
+
+
+** Stlaenie klvesy x v normlnom mde zmae znak na mieste kurzora. **
+
+ 1. Presu kurzor niie na riadok oznaen znakou --->.
+
+ 2. Aby si mohol odstrni chyby, pohybuj kurzorom km neprejde na znak,
+ ktor chce zmaza.
+
+ 3. Stla klvesu x aby sa zmazal nechcen znak.
+
+ 4. Zopakuj kroky 2 a 4 a km veta nieje sprvna.
+
+---> Kraava skooilla ccezz mesiiac.
+
+ 5. Ak je veta sprvna, prejdi na lekciu 1.4.
+
+POZNMKA: Neskaj si zapamta obsah tejto vuky, ale sa u pouvanm.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.4: EDITCIA TEXTU - VKLADANIE
+
+
+ ** Stlaenie klvesy i umouje vkladanie textu. **
+
+ 1. Presu kurzor niie na prv riadok za znaku --->.
+
+ 2. Pre upravenie prvho riadku do rovnakho tvaru ako je druh riadok,
+ presu kurzor na prv znak za misto, kde m by text vloen.
+
+ 3. Stla klvesu i a nap potrebn text.
+
+ 4. Po opraven kadej chyby, stla <ESC> pre nvrat do normlneho mdu.
+ Zopakuj kroky 2 a 4 km nieje veta sprvna.
+
+---> Tu je text chbajci tejto.
+---> Tu je nejak text chbajci od tejto iary.
+
+ 5. Ke sa dostatone nau vklada text, prejdi na nasledujce zhrnutie.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.5: EDITCIA TEXTU - PRIDVANIE
+
+
+ ** Stlaenie klvesy A umouje pridva text. **
+
+ 1. Presu kurozr niie na prv riadok za znakou --->.
+ Nezle na tom, na ktorom znaku sa kurzor v tom riadku nachdza.
+
+ 2. Stla klvesu A a nap potrebn text.
+
+ 3. Po pridan textu stla klvesu <ESC> pre nvrat do Normlneho mdu.
+
+ 4. Presu kurozr na druh riadok oznaen ---> a zopakuj
+ kroky 2 a 3 km nieje veta sprvna.
+
+---> Tu je nejak text chbajci o
+ Tu je nejak text chbajci od tiato.
+---> Tu tie chba nej
+ Tu tie chba nejak text.
+
+ 5. Ke sa dostatone nau pridva text, prejdi na lekciu 1.6.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.6: EDITCIA SBORU
+
+
+ ** Napsanm :wq sa sbor ulo a zavrie **
+
+!! POZNMKA: Pred vykonanm tchto krokov si pretaj cel lekciu!!
+
+1. Opusti tto vuku, ako si to urobil v lekcii 1.2: :q!
+
+2. Do prkazovho riadku nap prkaz: vim tutor <ENTER>
+ 'vim' je prkaz, ktor spust editor Vim, 'tutor' je meno sboru,
+ ktor chce editova. Poui tak sbor, ktor me meni.
+
+3. Vlo a zma text tak, ako si sa nauil v predolch lekciach.
+
+4. Ulo sbor so zmenami a opusti Vim prkazom: :wq <ENTER>
+
+5. Retartuj vimtutor a presu sa dole na nasledujce zhrnutie.
+
+6. Urob tak po pretan predolch krokov a porozumeniu im.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZHRNUTIE LEKCIE 1
+
+
+ 1. Kurzor sa pohybuje pouitm klves so pkami alebo klvesmi hjkl.
+ h (do lava) j (dole) k (hore) l (doprava)
+
+ 2. Pre spustenie Vimu (z prkazovho riadku) nap: vim FILENAME <ENTER>
+
+ 3. Na ukonenie Vimu nap: <ESC> :q! <ENTER> pre zruenie vetkch zmien
+ alebo nap: <ESC> :wq <ENTER> pre uloenie zmien.
+
+ 4. Na zmazanie znaku na mieste kurzora nap: x
+
+ 5. Pre vloenie textu na mieste kurzora v normlnom mde nap:
+ i nap vkladan text <ESC> vkladanie pred kurzor
+ A nap pridvan text <EXC> vkladanie za riadok
+
+POZNMKA: Stlaenie <ESC> a premiestn do normlneho mdu alebo zru
+ nejak nechcen a iastone dokonen prkaz.
+
+Teraz pokrauj lekciou 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.1: Mazacie prkazy
+
+
+ ** Napsanie prkazu dw zmae znaky do konca slova. **
+
+1. Stla <ESC> aby si bol bezpene v normlnom mde.
+
+2. Presu kurzor niie na riadok oznaen znakou --->.
+
+3. Presu kurzor na zaiatok slova, ktor je potrebn zmaza.
+
+4. Nap dw aby slovo zmizlo.
+
+POZNMKA: Psmeno d sa zobraz na poslednom riadku obrazovky ke ho
+ nape. Vim na teba pok, aby si mohol napsa
+ psmeno w. Ak vid nieo in ako d , tak si napsal
+ nesprvny znak; stla <ESC> a zani znova.
+
+---> Tu je niekoko slov zbava, ktor nie patria list do tejto vety.
+
+5. Zopakuj kroky 3 a 4 km veta nieje sprvna a prejdi na lekciu 2.2.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.2: VIAC MAZACCH PRKAZOV
+
+
+ ** Napsanie prkazu d$ zmae znaky do konca riadku **
+
+1. Stla <ESC> aby si bol bezpene v normlnom mde.
+
+2. Presu kurzor niie na riadok oznaen znakou --->.
+
+3. Presu kurzor na koniec sprvnej vety (ZA prv bodku).
+
+4. Nap d$ aby sa zmazali znaky do konca riadku.
+
+---> Niekto napsal koniec tohto riadku dvakrt. koniec tohot riadku dvakrt.
+
+
+5. Prejdi na lekciu 2.3 pre pochopenie toho o sa stalo.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.3: OPERTORY A POHYBY
+
+ Vea prkazov, ktor menia text s odvoden od opertorov a pohybov.
+ Formt pre prkaz mazania klvesou d je nasledovn:
+
+ d pohyb
+
+ kde:
+ d - je mazac opertor
+ pohyb - je to o opertor vykonva (vypsan niie)
+
+ Krtky list pohybov:
+ w - do zaiatku alieho slova, okrem jeho prvho psmena.
+ e - do konca terajieho slova, vrtane poslednho znaku.
+ $ - do konca riadku, vrtane poslednho znaku
+
+ Take napsanm de sa zmae vetko od kurzora do konca slova.
+
+POZNMKA: Stlaenm iba pohybu v normlnom mde bez opertora
+ sa presunie kurzor tak ako je to pecivikovan.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.4: Pouitie viacnsobnho pohybu
+
+
+ ** Napsanm sla pred pohyb ho zopakuje zadn poet krt **
+
+ 1. Presu kurozr niie na zaiatok riadku oznaenho --->.
+
+ 2. Nap 2w a kurozr sa presunie o dve slov vpred.
+
+ 3. Nap 3e a kurozr sa presunie vpred na koniec tretieho slova.
+
+ 4. Nap 0 (nula) a kurozr sa presunie na zaiatok riadku.
+
+ 5. Zopakuj kroky 2 a 3 s rznymi slami.
+
+---> Toto je riadok so slovami po kotrch sa mete pohybova.
+
+ 6. Prejdi na lekciu 2.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.5: POUITIE VIACNSOBNHO MAZANIA PRE HROMADN MAZANIE
+
+
+ ** Napsanie sla spolu s opertorom ho zopakuje zadan poet krt **
+
+ V kombincii opertorov mazania a pohybu spomnanho vyie vlo poet
+ pred pohyb pre docielenie hromadnho mazania:
+ d slo pohyb
+
+ 1. Presu kurzor na prv slovo psan VEKMI PSMENAMI
+ v riadku oznaenom --->.
+
+ 2. Nap 2dw a zmae dve slov psan VEKMI PSMENAMI
+
+ 3. Zopakuj kroky 1 a 2 s pouitm rzneho sla tak aby si zmazal slov
+ psan vekmi psmenami jednm prkazom.
+
+---> Tento ABC DE riadok FGHI JK LMN OP so slovamI je Q RS TUV vycisteny.
+
+POZNMKA: slo medzi opertorom d a pohybom funguje podobne ako pri
+ pouit s pohybom bez opertora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.6: OPERCIE S RIADKAMI
+
+
+ ** Napsanie prkazu dd zmae cel riadok. **
+
+Vzhadom na frekvenciu mazania celho riadku, sa autori Vimu rozhodli,
+e bude jednoduchie maza cel riadok napsanm dvoch psmen d.
+
+1. Presu kurzor na druh riadok v texte na spodu.
+2. Nap dd aby si zmazal riadok.
+3. Prejdi na tvrt riadok.
+4. Nap 2dd aby si zmazal dva riadky.
+
+ 1) Rue s erven,
+ 2) Blato je zbavn,
+ 3) Fialky s modr,
+ 4) Mm auto,
+ 5) Hodinky ukazuj as,
+ 6) Cukor je sladk,
+ 7) A to si ty.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.7: PRKAZ UNDO
+
+
+** Stla u pre vrtenie poslednho prkazu, U pre pravu celho riadku. **
+
+1. Presu kurzor niie na riadok oznaen znakou ---> a premiestni ho na
+ prv chybu.
+2. Nap x pre zmazanie prvho nechcenho riadku.
+3. Teraz nap u m vrt sp posledne vykonan prkaz.
+4. Teraz oprav vetky chyby na riadku pouitm prkazu x .
+5. Teraz nap vek U m vrt riadok do pvodnho stavu.
+6. Teraz nap u niekoko krt, m vrt sp prkaz U.
+7. Teraz nap CTRL-R (dr klvesu CTRL stlaen km stla R) niekoko
+ krt, m vrt sp predtm vrten prkazy (undo z undo).
+
+---> Opprav chybby nna toomto riadku a zmee ich pommocou undo.
+
+ 8. Tieto prkazy s asto pouvan. Teraz prejdi na zhrnutie lekcie 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 2 ZHRNUTIE
+
+
+ 1. Pre zmazanie znakov od kurzora do konca slova nap: dw
+
+ 2. Pre zmazanie znakov od kurzora do konca riadku nap: d$
+
+ 3. Pre zmazanie celho riadku nap: dd
+
+ 4. Pre zopakovanie pohybu, nap pred neho slo: 2w
+
+ 5. Formt pre pkaz:
+
+ opertor [slo] pohyb
+ kde:
+ opertor - o treba robi, naprklad d pre zmazanie
+ [slo] - je voliten poet pre opakovanie pohybu
+ pohyb - pohyb po texte vzhadom na opertor, naprklad w (slovo),
+ $ (do konca riadku), at.
+
+ 6. Pre pohyb na zaiatok riadku poui nulu: 0
+
+ 7. Pre vrtenie sp predolej opercie nap: u (mal u)
+ Pre vrtenie vetkch prav na riadku nap: U (vek U)
+ Pre vrtenie vrtench prav nap: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.1: PRKAZ VLOI
+
+
+ ** Napsanie prkazu p vlo psledn vmaz za kurzor. **
+
+ 1. Presu kurzor niie na prv riadok textu.
+
+ 2. Nap dd m zmae riadok a ulo ho do buffera editora Vim.
+
+ 3. Presu kurzor vyie tam, kam zmazan riadok patr.
+
+ 4. Ak nape v normlnom mde p zmazan riadk sa vlo.
+
+ 5. Zopakuj kroky 2 a 4, km riadky nies v sprvnom porad.
+
+---> d) Tie sa doke vzdelva?
+---> b) Fialky s modr,
+---> c) Inteligencia sa vzdelva,
+---> a) Rue s erven,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.2: PRKAZ NAHRADENIA
+
+
+ ** Napsanm rx sa nahrad znak na mieste kurzora znakom x . **
+
+ 1. Presu kurzor niie na prv riadok textu oznaenho znakou --->.
+
+ 2. Presu kurzor na zaiatok prvej chyby.
+
+ 3. nap r a potom znak, ktor tam m by.
+
+ 4. Zopakuj kroky 2 a 3, km prv riadok nieje zhodn s druhm.
+
+---> Ka bol tento riasok paan, niekro stlail nesprbne klvesy!
+---> Ke bol tento riadok psan, niekto stlail nesprvne klvesy!
+
+ 5. Teraz prejdi na lekciu 3.2.
+
+POZNMKA: Pamtaj si, e naui sa me len pouvanim, nie pamtanm.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.3. PRKAZ PRAVY
+
+
+ ** Ak chce zmeni as slova do konca slova, nap ce . **
+
+ 1. Presu kurzor niie na prv riadok oznaen znakou --->.
+
+ 2. Umiestni kurzor na psmeno o v slove rosfpl.
+
+ 3. Nap ce a oprav slovo (v tomto prpade nap 'iadok'.)
+
+ 4. Stla <ESC> a prejdi na al znak, ktor treba zmeni.
+
+ 5. Zopakuj kroky 3 a 4, km prv veta nieje rovnak ako druh.
+
+---> Tento rosfpl m niekoko skic, ktor je pirewvb zmeni piyun prkazu.
+---> Tento riadok m niekoko slov, ktor je potrebn zmeni pouitm prkazu.
+
+Poznmka, e ce zmae slovo a nastav vkladac md.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.4: VIAC ZMIEN POUITM c
+
+
+ ** Prkaz pre pravy sa pouva s rovnakmi pohybmi ako pre mazanie **
+
+ 1. Prkaz pre pravy pracuje rovnako ako pre mazanie. Formt je:
+
+ c [slo] pohyb
+
+ 2. Pohyby s rovnak, ako naprklad w (slovo) a $ (koniec riadku).
+
+ 3. Presu kurzor niie na prv riadok oznaen znakou --->.
+
+ 4. Presu kurzor na prv chybu.
+
+ 5. nap c$ aby si mohol upravi zvyok riadku poda druhho
+ a stla <ESC>.
+
+---> Koniec tohto riadku potrebuje pomoc, aby bol ako druhy.
+---> Koniec tohto riadku potrebuje opravi pouitm prkazu c$ .
+
+POZNMKA: Me poui klvesu backspace na pravu zmien poas psania.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 3 ZHRNUTIE
+
+
+ 1. Na vloenie textu, ktor u bol zmazan, nap p . To vlo zmazan
+ text ZA kurzor (ak bol riadok zmazan prejde na riadok pod kurzorom).
+
+ 2. Pre naradenie znaku na mieste kurzora, nap r a potom znak, ktor
+ nahrad pvodn znak.
+
+ 3. Prkaz na upravenie umouje zmeni od kurzora a po miesto, ktor
+ uruje pohyb. napr. Nap ce m zmn text od pozcie
+ kurzora do konca slova, c$ zmen text do konca riadku.
+
+ 4. Formt pre nahradenie je:
+
+ c [slo] pohyb
+
+
+Teraz prejdi na nalsedujcu lekciu.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.1: POZCIA A STATUS SBORU
+
+
+ ** Stla CTRL-g pre zobrazenie svojej pozcie v sbore a statusu sboru.
+ Nap G pre presun na riadok v sbore. **
+
+ Poznmka: Pretaj si cel tto lekciu skr ako zane vykonva kroky!!
+
+ 1. Dr stlaen klvesu Ctrl a stla g . Toto nazvame CTRL-G.
+ Na spodu obrazovky sa zobraz sprva s nzvom sboru a pozciou
+ v sbore. Zapamtajsi si slo riadku pre pouitie v kroku 3.
+
+ 2. Stla G m sa dostane na spodok sboru.
+ Nap gg m sa dostane na zaiatok sboru.
+
+ 3. Nap slo riadku na ktorom si sa nachdzal a stla G. To a
+ vrti na riadok, na ktorom si prv krt stlail CTRL-G.
+
+ 4. Ak sa ct schopn vykona teto kroky, vykonaj kroky 1 a 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.2: PRKAZ VYHADVANIA
+
+
+ ** Nap / nasledovan reazcom pre vyhadanie prslunho reazca. **
+
+ 1. Nap znak / v normlnom mde. Poznmka, e tento znak sa spolu
+ s kurzorom zobraz v dolnej asti obrazovky s : prkazom.
+
+ 2. Teraz nap 'errroor' <ENTER>. To je slovo, ktor chce vyhada.
+
+ 3. Pre vyhadanie alieho vskytu rovnakho reazca, stla jednoducho n.
+ Pre vyhadanie alieho vskytu rovnakho reazca opanm smerom,
+ N.
+
+ 4. Ak chce vyhada reazec v sptnom smere, pou prkaz ? miesto
+ prkazu /.
+
+ 5. Pre nvrat na miesto z ktorho si priiel stla CTRL-O (dr stlaen
+ klvesu Ctrl poas stlaenia klvesy o). Zopakuj pre al nvrat
+ sp. CTRL-I ide vpred.
+
+POZNMKA: "errroor" nieje spsob hlskovania error; errroor je error.
+POZNMKA: Ke vyhadvanie dosiahne koniec tohto sboru, bude pokraova na
+ zaiatku, dokia nieje resetovan nastavenie 'wrapscan' .
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.3: VYHADVANIE ZODPOVEDAJCICH ZTAVORIEK
+
+
+ ** Nap % pre vyhadanie prslunho znaku ),], alebo } . **
+
+ 1. Premiestni kurzor na hocak zo znakov (, [, alebo { v riadku niie
+ oznaenho znakou --->.
+
+ 2. Teraz nap znak % .
+
+ 3. Kurzor sa premiestni na zodpovedajcu ztvorku.
+
+ 4. Nap % pre presun kurzoru sp na otvrajcu ztvorku.
+
+ 5. Presu kurzor na in zo znakov (,),[,],{ alebo } a vimni si
+ o % vykonva.
+
+---> Toto ( je testovac riadok s ('s, ['s ] a {'s } v riadku. ))
+
+Poznmka: Toto je vemi vhodn pou pri laden programu s chbajcimi
+ uzatvrajcimi ztvorkami!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.4: PRKAZ NAHRADENIA
+
+
+ ** Nap :s/star/nov/g pre nahradenie slova 'star' za slovo 'nov'. **
+
+ 1. Presu kurzor niie na riadok oznaen znakou --->.
+
+ 2. Nap :s/thee/the <ENTER> . Poznamka, e tento prkaz zmen len prv
+ vskyt "thee" v riadku.
+
+ 3. Teraz nap :s/thee/the/g o znamen celkov nahradenie v riadku.
+ Toto nahrad vetky vskyty v riadku.
+
+---> Thee best time to see thee flowers in thee spring.
+
+ 4. Pre zmenu vetkch vskytov danho reazca medzi dvomi ridakami,
+ nap :#,#s/star/nov/g kde #,# s sla dvoch riadkov, v rozsahu
+ ktorch sa nahradenie vykon.
+ nap :%s/star/nov/g pre zmenu vetkch vskytov v celom riadku
+ nap :%s/star/nov/gc njde vetky vskyty v celom sbore,
+ s otzkou i nahradi alebo nie
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 4 ZHRNUTIE
+
+
+ 1. CTRL-g vype tvoju pozciu v sbore a status sboru.
+ G a premiestni na koniec riadku.
+ slo G a premiestni na riadok s slom.
+ gg a presunie na prv riadok
+
+ 2. Napsanie / nasledovan reazcom vyhad reazec smerom DOPREDU.
+ Napsanie ? nasledovan reazcom vyhada reazec smerom DOZADU.
+ Napsanie n po vyhadvan, vyhad nasledujci vskyt reazca
+ v rovnakom smere, priom N vyhad v opanom smere.
+ CTRL-O a vrti sp na stariu pozciu, CTRL-I na noviu pozciu.
+
+ 3. Napsanie % ke kurzor je na (,),[,],{, alebo } njde zodpovdajcu
+ prnu ztvorku.
+
+ 4. Pre nahradenie novho za prv star v riadku nap :s/star/nov
+ Pre nahradenie novho za vetky star v riadku nap :s/star/nov/g
+ Pre nahradenie reazcov medzi dvoma riadkami 3 nap :#,#/star/nov/g
+ Pre nahradenie vetkch vskytov v sbore nap :%s/star/nov/g
+ Pre potvrdenie kadho nahradenia pridaj 'c' :%s/star/nov/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.1 AKO SPUSTI VONKAJ PRKAZ
+
+
+ ** Nap prkaz :! nasledovan vonkajm prkazom pre spustenie prkazu **
+
+ 1. Nap obvykl pkaz : ktor nastav kurzor na spodok obrazovky.
+ To umon napsa prkaz.
+
+ 2. Teraz nap ! (vkrink). To umon spusti hociak vonkaj prkaz
+ z prkazovho riadku.
+
+ 3. Ako prklad nap ls za ! a stla <ENTER>. Tento prkaz
+ zobraz obsah tvojho adresra rovnako ako na prkazovom riadku.
+ Alebo poui :!dir ak ls nefunguje.
+
+Poznmka: Takto je mon spusti hociak vonkaj prkaz s argumentami.
+Poznmka: Vetky prkazy : musia by dokonen stlaenm <ENTER>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.2: VIAC O UKLADAN SBOROV
+
+
+ ** Pre uloenie zmien v sbore, nap :w FILENAME. **
+
+ 1. Nap :!dir alebo :!ls pre vpis aktulneho adresra.
+ U vie, e mus za tmto stlai <ENTER> .
+
+ 2. Vyber nzov sboru, ktor ete neexistuje, ako napr. TEST.
+
+ 3. Teraz nap: :w TEST (kde TEST je nzov vybratho sboru.)
+
+ 4. To ulo cel sbor (Vim Tutor) pod nzovm TEST.
+ Pre overenie nap :!dir , m zobraz obsah adresra.
+
+Poznmka: e ak ukon prcu s editorom Vim a znovu ho spust prkazom
+ vim TEST, sbor bude kpia vuky, ke si ho uloil.
+
+ 5. Teraz odstr sbor napsanm (MS-DOS): :!del TEST
+ alebo (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.3 VBER TEXTU PRE ULOENIE
+
+
+ ** Pre uloenie asti sboru, nap v pohyb :w FILENAME **
+
+ 1. Presu kurozr na tento riadok.
+
+ 2. Stla v a presu kurozr na piatu poloku dole. Poznmka, e
+ tento text je vyznaen (highlighted).
+
+ 3. Stla klvesu : . V spodnej asti okna sa objav :'<,'>.
+
+ 4. Nap w TEST , kde TEST je meno sboru, ktor zatial neexistuje.
+ Skontroluj, e vid :'<,'>w TEST predtm ne stla Enter.
+
+ 5. Vim zape oznaen riadky do sboru TEST. Poui :!dir alebo :!ls
+ pre overenie. Zatial ho ete nema! Pouijeme ho v alej lekcii.
+
+POZNMKA: Stlaenm klvesy v sa spust vizulne oznaovanie.
+ Me pohybova kurzorom pre upresnenie vyznaenho textu.
+ Potom me poui opertor pre vykonanie nejakej akcie
+ s textom. Naprklad d zmae vyznaen text.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.4: VBER A ZLUOVANIE SBOROV
+
+
+ ** Pre vloenie obsahu sboru, nap :r FILENAME **
+
+ 1. Premiestni kurzor nad tento riadok.
+
+POZNMKA: Po vykonan kroku 2 uvid text z lekcie 5.3. Potom sa presu
+ dole, aby si videl tto lekciu.
+
+ 3. Teraz vlo sbor TEST pouitm prkazu :r TEST kde TEST je nzov
+ sboru. Sbor, ktor si pouil je umiestnen pod riadkom s kurzorom.
+
+POZNMKA: Me tie nata vstup vonkajieho prkazu. Naprklad :r !ls
+ nata vstup prkazu ls a umiestni ho za pozciu kurzora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 5 ZHRNUTIE
+
+
+ 1. :!prkaz spust vonkaj prkaz.
+
+ Niektor vyuiten prklady s:
+ (MS_DOS) (UNIX)
+ :!dir :!ls - zobraz obsah adresra
+ :!del FILENAME :!rm FILENAME - odstrni sbor FILENAME
+
+ 2. :w FILENAME ulo aktulny sbor na disk pod menom FILENAME.
+
+ 3. v pohyb :w FILENAME ulo vizulne oznaen riadky do
+ sboru FILENAME.
+
+ 4. :r FILENAME vyberie z disku sbor FILENAME a vlo ho do aktulneho
+ sboru za pozciou kurzora.
+
+ 5. :r !dir nata vstup z prkazu dir a vlo ho za pozciu kurzora.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.1: PRKAZ OTVORI
+
+
+** Nap o pre vloenie riadku pod kurzor a prepnutie do vkladacieho mdu **
+
+ 1. Presu kurzor niie na riadok oznaen znakou --->.
+
+ 2. Nap o (mal psmeno) pre vloenie istho riadku pod kurzorm
+ a prepnutie do vkladacieho mdu.
+
+ 3. Teraz skopruj riadok oznaen ---> a stla <ESC> pre ukonenie
+ vkladacieho mdu.
+
+---> Po napsan o sa kurzor premiestn na vloen riadok do vkladacieho
+ mdu.
+
+ 4. Pre otvorenie riadku nad kurzorom, jednotucho nap vek O ,
+ namiesto malho o. Vyskaj si to na riadku dole.
+
+---> Vlo riadok nad tmto napsanm O, ke kurzor je na tomto riadku.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.2: PRKAZ PRIDA
+
+
+ ** Nap a pre vloenie textu ZA kurzor. **
+
+ 1. Presu kurzor niie na koniec prvho riadku oznaenho znakou --->
+
+ 2. Stla klvesu e dokia kurozr nieje na konci riadku.
+
+ 3. Nap a (mal psmeno) pre pridanie textu ZA kurzorom.
+
+ 4. Dokon slovo tak ako je to v druhom riadku. Stla <ESC> pre
+ opustenie vkladacieho mdu.
+
+ 5. Poui e na presun na alie nedokonen slovo a zopakuj kroky 3 a 4.
+
+---> Tento ri ti dovouje ncv privan testu na koniec riadku.
+---> Tento riadok ti dovouje ncvik pridvania textu na koniec riadku.
+
+POZNMKA: a, i, A tartuj rovnak vkladac md, jedin rozidel je, kde
+ sa znaky vkladaj.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.3: IN SPOSOB NAHRADZOVANIA
+
+
+ ** Nap vek R pre nahradenie viac ako jednho znaku. **
+
+ 1. Presu kurzor niie na prv riadok oznaen znakou --->. Premiestni
+ kurzor na zaiatok prvho vskytu xxx.
+
+ 2. Teraz nap R a nap slo uveden v druhom riadku, take
+ sa nm nahrad pvodn xxx.
+
+ 3. Stla <ESC> pre opustenie nahradzovacieho mdu. Poznmka, e zvyok
+ riadku zostane nezmenen.
+
+ 4. Zopakuj tieto kroky pre nahradenie zvynch xxx.
+
+---> Pridanm 123 ku xxx dostane xxx.
+---> Pridanm 123 ku 456 dostane 579.
+
+POZNMKA: Nahradzovac md je ako vkladac md, ale kad napsan znak
+ zmae existujci znak.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lekcia 6.4: Copy Paste textu
+
+ ** pou opertor y pre copy textku a p pre jeho paste **
+
+ 1. Cho niie na riadok oznaen ---> a umiestni kurozr za "a)".
+
+ 2. Natartuj vizulny md pouitm v a presu kurozr pred "first".
+
+ 3. Nap y pre vystrihnutie (copy) oznaenho textu.
+
+ 4. Presu kurozr na koniec alieho riadku: j$
+
+ 5. Nap p pre vlonie (paste) textu. Potom nap: a druha <ESC>.
+
+ 6. Poui vizulny md pre oznaenie "poloka.", vystrihni to
+ pouitm y, presu sa na koniec nasledujceho riadku pouitm j$
+ a vlo sem text pouitm p.
+
+---> a) toto je prv poloka
+---> b)
+
+POZNMKA: Me poui tie y ako opertor; yw vystrihne jedno slovo.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.5: NASTAVENIE MONOST
+
+
+** Nastav monosti, take vyhadvanie alebo nahradzovanie ignoruje
+ rozliovanie **
+
+
+ 1. Vyhadaj reazec 'ignore' napsanm:
+ /ignore <ENTER>
+ Zopakuj vyhadvanie niekoko krt stlaenm klvesy n .
+
+ 2. Nastav monos 'ic' (Ignore case) napsanm prkazu:
+ :set ic
+
+ 3. Teraz vyhadaj reazec 'ingore' znova stlaenm klvesy n
+ Poznmka, e teraz s vyhadan aj Ignore a IGNORE.
+
+ 4. Nastav monosi 'hlsearch' a 'incsearch':
+ :set hls is
+
+ 5. Teraz spusti vyhadvac prkaz znovu, a pozri o sa stalo:
+ /ignore <ENTER>
+
+ 6. Pre opetovn zapnutie rozlyovania vekch a malch psmen
+ nap: :set noic
+
+POZNMKA: Na odstrnenie zvraznenia vrazov nap: :nohlsearch
+POZNMKA: Ak chce nerozlyova vekos psmen len pre jedno
+ pouitie vyhadvacieho prkazu, poui \c: /ignore\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 6 ZHRNUTIE
+
+
+ 1. Nap o pre otvorenie riadku pod kurzorom a tart vkladacieho mdu.
+ Nap O pre otvorenie riadku nad kurzorom.
+
+ 2. Nap a pre vkladanie textu ZA kurzor.
+ Nap A pre vkladanie textu za koncom riadku.
+
+ 3. Prkaz e presunie kurozr na koniec slova
+
+ 4. Opertor y vystrihne (skopruje) text, p ho vlo.
+
+ 5. Napsanie vekho R prepne do nahradzovacieho mdu, km nieje
+ stlaen <ESC>.
+
+ 6. Napsanie ":set xxx" nastav monos "xxx". Niektor nastavenia s:
+ 'ic' 'ignorecase' ignoruje vek a mal psmen poas vyhadvania.
+ 'is' 'incsearch' zobrazuje iaston reazce vyhadvanho reazca.
+ 'hls' 'hlsearch' vyzna vetky vyhadvan reazce.
+ Me poui hociktor z dlhch a krtkych nzvov monost.
+
+ 7. Vlo "no" pred nastavenie pre jeho vypnutie: :set noic
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 7.1: ZSKANIE NPOVEDY
+
+
+ ** Pouvaj on-line systm npovedy **
+
+ Vim m obsiahly on-line systm npovedy. Pre odtartovanie, vyskaj jeden
+ z tchto troch:
+ - stla klvesu <HELP> (ak nejak m)
+ - stla klvesu <F1> (ak nejak m)
+ - nap :help <ENTER>
+
+ taj text v okne npovedy pre zskanie predstavy ako npoveda funguje.
+ Nap CTRL-W CTRL-W pre skok z jednho okna do druhho.
+ Nap :q <ENTER> m zatvor okno npovedy.
+
+ Me njs help ku hociakej tme pridanm argumentu ku prkazu ":help".
+ Vyskaj tieto (nezabudni stlai <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 7.2: VYTVORENIE TARTOVACIEHO SKRIPTU
+
+ ** Zapni funkcie editora Vim **
+
+ Vim m omnoho viac funkcii ne Vi, ale veina z nich je implicitne
+ vypnut. Pre pouvanie viac Vim funkcii vytvor "vimrc" sbor.
+
+ 1. Zani editova "vimrc" sbor, to zvis na pouitom systme:
+ :e ~/.vimrc pre Unix
+ :e ~/_vimrc pre MS-Windows
+
+ 2. Teraz si pretaj text prkladu "vimrc" sboru:
+
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Ulo sbor:
+ :w
+
+ Pri nasledujcom tarte editora Vim sa pouije zvrazovanie syntaxe.
+ Do "vimrc" sboru me prida vetky svoje uprednostovan nastavenia.
+ Pre viac informcii nap :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ LEKCIA 7.3 DOKONENIE
+
+ ** Dokoni prkaz na prkazovom riadku pouitm CTRL-D a <TAB> **
+
+ 1. Uisti sa, e Vim nieje v kompatibilnom mde: :set nocp
+
+ 2. Pozri sa ak sbory sa nachdzaj v adresri: :!ls alebo :!dir
+
+ 3. Nap zaiatok prkazu: :e
+
+ 4. Stla CTRL-D a Vim zobraz zoznam prkazov zanajcich "e".
+
+ 5. Stla <TAB> a Vim dokon meno prkazu na ":edit".
+
+ 6. Teraz pridaj medzernk a zaiatok mena existujceho sboru:
+ :edit FIL
+
+ 7. Stla <TAB>. Vim dokon meno (ak je jedinen).
+
+POZNMKA: Dokonovanie funguje pre vea prkazov. Vyskaj stlaenie
+ CTRL-D a <TAB>. pecilne je to uiton pre prkaz :help.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ LEKCIA 7 ZHRNUTIE
+
+ 1. Nap :help alebo stla <F1> alebo <Help> pre otvorenie okna npovedy.
+
+ 2. Nap :help prkaz pre vyhadanie npovedy ku prkazu prkaz.
+
+ 3. Nap CTRL-W CTRL-W na preskoenie do inho okna.
+
+ 4. Nap :q pre zatvorenie okna npovedy
+
+ 5. Vytvor tartovac skript vimrc pre udranie uprednostovanch nastaven.
+
+ 6. Poas psania prkazu : stla CTRL-D pre zobrazenie dokonen.
+ Stla <TAB> pre pouitie jednho z dokonen.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ Toto vymedzuje vuku Vimu. Toto je uren pre strucn prehad o editore
+ Vim, plne postaujce pre ahk a obstojn pouvanie tohto editora.
+ Tto vuka je aleko od kompletnosti, pretoe Vim m omnoho viacej prkazov.
+ Ako alie si pretaj uvatsk manul: ":help user-manual".
+
+ Pre alie tanie a tdium je odporan kniha:
+ Vim - Vi Improved - od Steve Oualline
+ Vydavate: New Riders
+ Prv kniha uren pre Vim. pecilne vhodn pre zaiatonkov.
+ Obsahuje mnostvo prkladov a obrzkov.
+ Pozri na https://iccf-holland.org/click5.html
+
+ Tto kniha je staria a je viac o Vi ako o Vim, ale je tie odporan:
+ Learning the Vi Editor - od Linda Lamb
+ Vydavate: O'Reilly & Associates Inc.
+ Je to dobr kniha pre zskanie vedomost o prci s editorom Vi.
+ ieste vydanie obsahuje tie informcie o editore Vim.
+
+ Tto vuka bola napsan autormi Michael C. Pierce a Robert K. Ware,
+ Colorado School of Mines s pouitm mylienok dodanmi od Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Modifikovan pre Vim od Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Preklad do Sloveniny: ubo elko
+ e-mail: celbos@inmail.sk
+ Last Change: 2006 Apr 18
+ encoding: iso8859-2
diff --git a/runtime/tutor/tutor.sk.cp1250 b/runtime/tutor/tutor.sk.cp1250
new file mode 100644
index 0000000..a1aee20
--- /dev/null
+++ b/runtime/tutor/tutor.sk.cp1250
@@ -0,0 +1,1008 @@
+===============================================================================
+= V i t a j t e v o V I M T u t o r i a l i - Verzia 1.7 =
+===============================================================================
+
+ Vim je vemi vkonn editor, ktor m prli vea prkazov na to aby
+ mohli byt vetky popsan vo vuke akou je tto. Tto vuka
+ popisuje dostaton mnostvo prkazov nato aby bolo mon pouva
+ Vim ako viacelov editor.
+
+ Priblin as potrebn na prebratie tejto vuky je 25-30 mint,
+ zvis na tom, koko je strvenho asu s preskavanm.
+
+ UPOZORNENIE:
+ Prkazy v lekcich modifikuj text. Vytvor kpiu tohto sboru aby
+ sa mohlo precviova na om (pri tarte "vimtutor" je toto kpia).
+
+ Je dleit zapamta si, e tto vuka je vytvoren pre vuku
+ pouvanm. To znamen, e je potrebn si prkazy vyska, aby bolo
+ uenie sprvne. Ak len itas text, prkazy zabudne!
+
+ Presved sa, e Caps-Lock NIEJE stlaen a stlat klvesu
+ j niekoko krt, aby sa kurzor posunul natoko, e lekcia 1.1
+ celkom zapln obrazovku.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.1: POHYB KURZOROM
+
+
+ ** Pre pohyb kurzorum stla klvesy h,j,k,l ako je znzornen. **
+ ^
+ k Funkcia: Klvesa h je naavo a vykon pohyb doava.
+ < h l > Klvesa l je napravo a vykon pohyb doprava.
+ j Klvesa j vyzer ako pka dole
+ v
+ 1. Pohybuj kurzorom po obrazovke, km si na to nezvykne.
+
+ 2. Dr stlaen klvesu pre pohyb dole (j), km sa jej funkcia nezopakuje.
+---> Teraz sa u vie pohybova na nasledujcu lekciu.
+
+ 3. Pouitm klvesy pre pohyb dole prejdi na Lekciu 1.2.
+
+Poznmka: Ak si niesi ist tm o si napsal, stla <ESC>
+ na prechod do normlneho mdu.
+
+Poznmka: Kurzorov klvesy s tie funkn. Ale pouvanm hjkl sa bude
+ schopn pohybova rchlejie, ke si zvykne ich pouva. Naozaj!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 1.2: ZATVRANIE VIMU
+
+
+ !! POZNMKA: Pred vykonanm tchto krokov si pretaj cel tto lekciu !!
+
+ 1. Stla klvesu <ESC> (aby si sa uite nachdzal v normlnom mde)
+
+ 2. Nap: :q! <ENTER>.
+ Tm ukon prcu s editorom BEZ uloenia zmien, ktor si vykonal.
+
+ 3. Ke sa dostane na prkazov riadok, nap prkaz, ktorm sa dostane
+ spe do tejto vuky. To me by: vimtutor <ENTER>
+
+ 4. Ak si si tieto kroky spoahlivo zapamtal, vykonaj kroky 1 a 3, pre
+ ukonenie a znovu spustenie editora.
+
+POZNMKA: :q! <ENTER> neulo zmeny, ktor si vykonal. O niekoko lekci
+ sa nau ako uloi zmeny do sboru
+
+ 5. presu kurzor dole na lekciu 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.3: EDITCIA TEXTU - MAZANIE
+
+
+** Stlaenie klvesy x v normlnom mde zmae znak na mieste kurzora. **
+
+ 1. Presu kurzor niie na riadok oznaen znakou --->.
+
+ 2. Aby si mohol odstrni chyby, pohybuj kurzorom km neprejde na znak,
+ ktor chce zmaza.
+
+ 3. Stla klvesu x aby sa zmazal nechcen znak.
+
+ 4. Zopakuj kroky 2 a 4 a km veta nieje sprvna.
+
+---> Kraava skooilla ccezz mesiiac.
+
+ 5. Ak je veta sprvna, prejdi na lekciu 1.4.
+
+POZNMKA: Neskaj si zapamta obsah tejto vuky, ale sa u pouvanm.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.4: EDITCIA TEXTU - VKLADANIE
+
+
+ ** Stlaenie klvesy i umouje vkladanie textu. **
+
+ 1. Presu kurzor niie na prv riadok za znaku --->.
+
+ 2. Pre upravenie prvho riadku do rovnakho tvaru ako je druh riadok,
+ presu kurzor na prv znak za misto, kde m by text vloen.
+
+ 3. Stla klvesu i a nap potrebn text.
+
+ 4. Po opraven kadej chyby, stla <ESC> pre nvrat do normlneho mdu.
+ Zopakuj kroky 2 a 4 km nieje veta sprvna.
+
+---> Tu je text chbajci tejto.
+---> Tu je nejak text chbajci od tejto iary.
+
+ 5. Ke sa dostatone nau vklada text, prejdi na nasledujce zhrnutie.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.5: EDITCIA TEXTU - PRIDVANIE
+
+
+ ** Stlaenie klvesy A umouje pridva text. **
+
+ 1. Presu kurozr niie na prv riadok za znakou --->.
+ Nezle na tom, na ktorom znaku sa kurzor v tom riadku nachdza.
+
+ 2. Stla klvesu A a nap potrebn text.
+
+ 3. Po pridan textu stla klvesu <ESC> pre nvrat do Normlneho mdu.
+
+ 4. Presu kurozr na druh riadok oznaen ---> a zopakuj
+ kroky 2 a 3 km nieje veta sprvna.
+
+---> Tu je nejak text chbajci o
+ Tu je nejak text chbajci od tiato.
+---> Tu tie chba nej
+ Tu tie chba nejak text.
+
+ 5. Ke sa dostatone nau pridva text, prejdi na lekciu 1.6.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.6: EDITCIA SBORU
+
+
+ ** Napsanm :wq sa sbor ulo a zavrie **
+
+!! POZNMKA: Pred vykonanm tchto krokov si pretaj cel lekciu!!
+
+1. Opusti tto vuku, ako si to urobil v lekcii 1.2: :q!
+
+2. Do prkazovho riadku nap prkaz: vim tutor <ENTER>
+ 'vim' je prkaz, ktor spust editor Vim, 'tutor' je meno sboru,
+ ktor chce editova. Poui tak sbor, ktor me meni.
+
+3. Vlo a zma text tak, ako si sa nauil v predolch lekciach.
+
+4. Ulo sbor so zmenami a opusti Vim prkazom: :wq <ENTER>
+
+5. Retartuj vimtutor a presu sa dole na nasledujce zhrnutie.
+
+6. Urob tak po pretan predolch krokov a porozumeniu im.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZHRNUTIE LEKCIE 1
+
+
+ 1. Kurzor sa pohybuje pouitm klves so pkami alebo klvesmi hjkl.
+ h (do lava) j (dole) k (hore) l (doprava)
+
+ 2. Pre spustenie Vimu (z prkazovho riadku) nap: vim FILENAME <ENTER>
+
+ 3. Na ukonenie Vimu nap: <ESC> :q! <ENTER> pre zruenie vetkch zmien
+ alebo nap: <ESC> :wq <ENTER> pre uloenie zmien.
+
+ 4. Na zmazanie znaku na mieste kurzora nap: x
+
+ 5. Pre vloenie textu na mieste kurzora v normlnom mde nap:
+ i nap vkladan text <ESC> vkladanie pred kurzor
+ A nap pridvan text <EXC> vkladanie za riadok
+
+POZNMKA: Stlaenie <ESC> a premiestn do normlneho mdu alebo zru
+ nejak nechcen a iastone dokonen prkaz.
+
+Teraz pokrauj lekciou 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.1: Mazacie prkazy
+
+
+ ** Napsanie prkazu dw zmae znaky do konca slova. **
+
+1. Stla <ESC> aby si bol bezpene v normlnom mde.
+
+2. Presu kurzor niie na riadok oznaen znakou --->.
+
+3. Presu kurzor na zaiatok slova, ktor je potrebn zmaza.
+
+4. Nap dw aby slovo zmizlo.
+
+POZNMKA: Psmeno d sa zobraz na poslednom riadku obrazovky ke ho
+ nape. Vim na teba pok, aby si mohol napsa
+ psmeno w. Ak vid nieo in ako d , tak si napsal
+ nesprvny znak; stla <ESC> a zani znova.
+
+---> Tu je niekoko slov zbava, ktor nie patria list do tejto vety.
+
+5. Zopakuj kroky 3 a 4 km veta nieje sprvna a prejdi na lekciu 2.2.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.2: VIAC MAZACCH PRKAZOV
+
+
+ ** Napsanie prkazu d$ zmae znaky do konca riadku **
+
+1. Stla <ESC> aby si bol bezpene v normlnom mde.
+
+2. Presu kurzor niie na riadok oznaen znakou --->.
+
+3. Presu kurzor na koniec sprvnej vety (ZA prv bodku).
+
+4. Nap d$ aby sa zmazali znaky do konca riadku.
+
+---> Niekto napsal koniec tohto riadku dvakrt. koniec tohot riadku dvakrt.
+
+
+5. Prejdi na lekciu 2.3 pre pochopenie toho o sa stalo.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.3: OPERTORY A POHYBY
+
+ Vea prkazov, ktor menia text s odvoden od opertorov a pohybov.
+ Formt pre prkaz mazania klvesou d je nasledovn:
+
+ d pohyb
+
+ kde:
+ d - je mazac opertor
+ pohyb - je to o opertor vykonva (vypsan niie)
+
+ Krtky list pohybov:
+ w - do zaiatku alieho slova, okrem jeho prvho psmena.
+ e - do konca terajieho slova, vrtane poslednho znaku.
+ $ - do konca riadku, vrtane poslednho znaku
+
+ Take napsanm de sa zmae vetko od kurzora do konca slova.
+
+POZNMKA: Stlaenm iba pohybu v normlnom mde bez opertora
+ sa presunie kurzor tak ako je to pecivikovan.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.4: Pouitie viacnsobnho pohybu
+
+
+ ** Napsanm sla pred pohyb ho zopakuje zadn poet krt **
+
+ 1. Presu kurozr niie na zaiatok riadku oznaenho --->.
+
+ 2. Nap 2w a kurozr sa presunie o dve slov vpred.
+
+ 3. Nap 3e a kurozr sa presunie vpred na koniec tretieho slova.
+
+ 4. Nap 0 (nula) a kurozr sa presunie na zaiatok riadku.
+
+ 5. Zopakuj kroky 2 a 3 s rznymi slami.
+
+---> Toto je riadok so slovami po kotrch sa mete pohybova.
+
+ 6. Prejdi na lekciu 2.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.5: POUITIE VIACNSOBNHO MAZANIA PRE HROMADN MAZANIE
+
+
+ ** Napsanie sla spolu s opertorom ho zopakuje zadan poet krt **
+
+ V kombincii opertorov mazania a pohybu spomnanho vyie vlo poet
+ pred pohyb pre docielenie hromadnho mazania:
+ d slo pohyb
+
+ 1. Presu kurzor na prv slovo psan VEKMI PSMENAMI
+ v riadku oznaenom --->.
+
+ 2. Nap 2dw a zmae dve slov psan VEKMI PSMENAMI
+
+ 3. Zopakuj kroky 1 a 2 s pouitm rzneho sla tak aby si zmazal slov
+ psan vekmi psmenami jednm prkazom.
+
+---> Tento ABC DE riadok FGHI JK LMN OP so slovamI je Q RS TUV vycisteny.
+
+POZNMKA: slo medzi opertorom d a pohybom funguje podobne ako pri
+ pouit s pohybom bez opertora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.6: OPERCIE S RIADKAMI
+
+
+ ** Napsanie prkazu dd zmae cel riadok. **
+
+Vzhadom na frekvenciu mazania celho riadku, sa autori Vimu rozhodli,
+e bude jednoduchie maza cel riadok napsanm dvoch psmen d.
+
+1. Presu kurzor na druh riadok v texte na spodu.
+2. Nap dd aby si zmazal riadok.
+3. Prejdi na tvrt riadok.
+4. Nap 2dd aby si zmazal dva riadky.
+
+ 1) Rue s erven,
+ 2) Blato je zbavn,
+ 3) Fialky s modr,
+ 4) Mm auto,
+ 5) Hodinky ukazuj as,
+ 6) Cukor je sladk,
+ 7) A to si ty.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.7: PRKAZ UNDO
+
+
+** Stla u pre vrtenie poslednho prkazu, U pre pravu celho riadku. **
+
+1. Presu kurzor niie na riadok oznaen znakou ---> a premiestni ho na
+ prv chybu.
+2. Nap x pre zmazanie prvho nechcenho riadku.
+3. Teraz nap u m vrt sp posledne vykonan prkaz.
+4. Teraz oprav vetky chyby na riadku pouitm prkazu x .
+5. Teraz nap vek U m vrt riadok do pvodnho stavu.
+6. Teraz nap u niekoko krt, m vrt sp prkaz U.
+7. Teraz nap CTRL-R (dr klvesu CTRL stlaen km stla R) niekoko
+ krt, m vrt sp predtm vrten prkazy (undo z undo).
+
+---> Opprav chybby nna toomto riadku a zmee ich pommocou undo.
+
+ 8. Tieto prkazy s asto pouvan. Teraz prejdi na zhrnutie lekcie 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 2 ZHRNUTIE
+
+
+ 1. Pre zmazanie znakov od kurzora do konca slova nap: dw
+
+ 2. Pre zmazanie znakov od kurzora do konca riadku nap: d$
+
+ 3. Pre zmazanie celho riadku nap: dd
+
+ 4. Pre zopakovanie pohybu, nap pred neho slo: 2w
+
+ 5. Formt pre pkaz:
+
+ opertor [slo] pohyb
+ kde:
+ opertor - o treba robi, naprklad d pre zmazanie
+ [slo] - je voliten poet pre opakovanie pohybu
+ pohyb - pohyb po texte vzhadom na opertor, naprklad w (slovo),
+ $ (do konca riadku), at.
+
+ 6. Pre pohyb na zaiatok riadku poui nulu: 0
+
+ 7. Pre vrtenie sp predolej opercie nap: u (mal u)
+ Pre vrtenie vetkch prav na riadku nap: U (vek U)
+ Pre vrtenie vrtench prav nap: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.1: PRKAZ VLOI
+
+
+ ** Napsanie prkazu p vlo psledn vmaz za kurzor. **
+
+ 1. Presu kurzor niie na prv riadok textu.
+
+ 2. Nap dd m zmae riadok a ulo ho do buffera editora Vim.
+
+ 3. Presu kurzor vyie tam, kam zmazan riadok patr.
+
+ 4. Ak nape v normlnom mde p zmazan riadk sa vlo.
+
+ 5. Zopakuj kroky 2 a 4, km riadky nies v sprvnom porad.
+
+---> d) Tie sa doke vzdelva?
+---> b) Fialky s modr,
+---> c) Inteligencia sa vzdelva,
+---> a) Rue s erven,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.2: PRKAZ NAHRADENIA
+
+
+ ** Napsanm rx sa nahrad znak na mieste kurzora znakom x . **
+
+ 1. Presu kurzor niie na prv riadok textu oznaenho znakou --->.
+
+ 2. Presu kurzor na zaiatok prvej chyby.
+
+ 3. nap r a potom znak, ktor tam m by.
+
+ 4. Zopakuj kroky 2 a 3, km prv riadok nieje zhodn s druhm.
+
+---> Ka bol tento riasok paan, niekro stlail nesprbne klvesy!
+---> Ke bol tento riadok psan, niekto stlail nesprvne klvesy!
+
+ 5. Teraz prejdi na lekciu 3.2.
+
+POZNMKA: Pamtaj si, e naui sa me len pouvanim, nie pamtanm.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.3. PRKAZ PRAVY
+
+
+ ** Ak chce zmeni as slova do konca slova, nap ce . **
+
+ 1. Presu kurzor niie na prv riadok oznaen znakou --->.
+
+ 2. Umiestni kurzor na psmeno o v slove rosfpl.
+
+ 3. Nap ce a oprav slovo (v tomto prpade nap 'iadok'.)
+
+ 4. Stla <ESC> a prejdi na al znak, ktor treba zmeni.
+
+ 5. Zopakuj kroky 3 a 4, km prv veta nieje rovnak ako druh.
+
+---> Tento rosfpl m niekoko skic, ktor je pirewvb zmeni piyun prkazu.
+---> Tento riadok m niekoko slov, ktor je potrebn zmeni pouitm prkazu.
+
+Poznmka, e ce zmae slovo a nastav vkladac md.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.4: VIAC ZMIEN POUITM c
+
+
+ ** Prkaz pre pravy sa pouva s rovnakmi pohybmi ako pre mazanie **
+
+ 1. Prkaz pre pravy pracuje rovnako ako pre mazanie. Formt je:
+
+ c [slo] pohyb
+
+ 2. Pohyby s rovnak, ako naprklad w (slovo) a $ (koniec riadku).
+
+ 3. Presu kurzor niie na prv riadok oznaen znakou --->.
+
+ 4. Presu kurzor na prv chybu.
+
+ 5. nap c$ aby si mohol upravi zvyok riadku poda druhho
+ a stla <ESC>.
+
+---> Koniec tohto riadku potrebuje pomoc, aby bol ako druhy.
+---> Koniec tohto riadku potrebuje opravi pouitm prkazu c$ .
+
+POZNMKA: Me poui klvesu backspace na pravu zmien poas psania.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 3 ZHRNUTIE
+
+
+ 1. Na vloenie textu, ktor u bol zmazan, nap p . To vlo zmazan
+ text ZA kurzor (ak bol riadok zmazan prejde na riadok pod kurzorom).
+
+ 2. Pre naradenie znaku na mieste kurzora, nap r a potom znak, ktor
+ nahrad pvodn znak.
+
+ 3. Prkaz na upravenie umouje zmeni od kurzora a po miesto, ktor
+ uruje pohyb. napr. Nap ce m zmn text od pozcie
+ kurzora do konca slova, c$ zmen text do konca riadku.
+
+ 4. Formt pre nahradenie je:
+
+ c [slo] pohyb
+
+
+Teraz prejdi na nalsedujcu lekciu.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.1: POZCIA A STATUS SBORU
+
+
+ ** Stla CTRL-g pre zobrazenie svojej pozcie v sbore a statusu sboru.
+ Nap G pre presun na riadok v sbore. **
+
+ Poznmka: Pretaj si cel tto lekciu skr ako zane vykonva kroky!!
+
+ 1. Dr stlaen klvesu Ctrl a stla g . Toto nazvame CTRL-G.
+ Na spodu obrazovky sa zobraz sprva s nzvom sboru a pozciou
+ v sbore. Zapamtajsi si slo riadku pre pouitie v kroku 3.
+
+ 2. Stla G m sa dostane na spodok sboru.
+ Nap gg m sa dostane na zaiatok sboru.
+
+ 3. Nap slo riadku na ktorom si sa nachdzal a stla G. To a
+ vrti na riadok, na ktorom si prv krt stlail CTRL-G.
+
+ 4. Ak sa ct schopn vykona teto kroky, vykonaj kroky 1 a 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.2: PRKAZ VYHADVANIA
+
+
+ ** Nap / nasledovan reazcom pre vyhadanie prslunho reazca. **
+
+ 1. Nap znak / v normlnom mde. Poznmka, e tento znak sa spolu
+ s kurzorom zobraz v dolnej asti obrazovky s : prkazom.
+
+ 2. Teraz nap 'errroor' <ENTER>. To je slovo, ktor chce vyhada.
+
+ 3. Pre vyhadanie alieho vskytu rovnakho reazca, stla jednoducho n.
+ Pre vyhadanie alieho vskytu rovnakho reazca opanm smerom,
+ N.
+
+ 4. Ak chce vyhada reazec v sptnom smere, pou prkaz ? miesto
+ prkazu /.
+
+ 5. Pre nvrat na miesto z ktorho si priiel stla CTRL-O (dr stlaen
+ klvesu Ctrl poas stlaenia klvesy o). Zopakuj pre al nvrat
+ sp. CTRL-I ide vpred.
+
+POZNMKA: "errroor" nieje spsob hlskovania error; errroor je error.
+POZNMKA: Ke vyhadvanie dosiahne koniec tohto sboru, bude pokraova na
+ zaiatku, dokia nieje resetovan nastavenie 'wrapscan' .
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.3: VYHADVANIE ZODPOVEDAJCICH ZTAVORIEK
+
+
+ ** Nap % pre vyhadanie prslunho znaku ),], alebo } . **
+
+ 1. Premiestni kurzor na hocak zo znakov (, [, alebo { v riadku niie
+ oznaenho znakou --->.
+
+ 2. Teraz nap znak % .
+
+ 3. Kurzor sa premiestni na zodpovedajcu ztvorku.
+
+ 4. Nap % pre presun kurzoru sp na otvrajcu ztvorku.
+
+ 5. Presu kurzor na in zo znakov (,),[,],{ alebo } a vimni si
+ o % vykonva.
+
+---> Toto ( je testovac riadok s ('s, ['s ] a {'s } v riadku. ))
+
+Poznmka: Toto je vemi vhodn pou pri laden programu s chbajcimi
+ uzatvrajcimi ztvorkami!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.4: PRKAZ NAHRADENIA
+
+
+ ** Nap :s/star/nov/g pre nahradenie slova 'star' za slovo 'nov'. **
+
+ 1. Presu kurzor niie na riadok oznaen znakou --->.
+
+ 2. Nap :s/thee/the <ENTER> . Poznamka, e tento prkaz zmen len prv
+ vskyt "thee" v riadku.
+
+ 3. Teraz nap :s/thee/the/g o znamen celkov nahradenie v riadku.
+ Toto nahrad vetky vskyty v riadku.
+
+---> Thee best time to see thee flowers in thee spring.
+
+ 4. Pre zmenu vetkch vskytov danho reazca medzi dvomi ridakami,
+ nap :#,#s/star/nov/g kde #,# s sla dvoch riadkov, v rozsahu
+ ktorch sa nahradenie vykon.
+ nap :%s/star/nov/g pre zmenu vetkch vskytov v celom riadku
+ nap :%s/star/nov/gc njde vetky vskyty v celom sbore,
+ s otzkou i nahradi alebo nie
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 4 ZHRNUTIE
+
+
+ 1. CTRL-g vype tvoju pozciu v sbore a status sboru.
+ G a premiestni na koniec riadku.
+ slo G a premiestni na riadok s slom.
+ gg a presunie na prv riadok
+
+ 2. Napsanie / nasledovan reazcom vyhad reazec smerom DOPREDU.
+ Napsanie ? nasledovan reazcom vyhada reazec smerom DOZADU.
+ Napsanie n po vyhadvan, vyhad nasledujci vskyt reazca
+ v rovnakom smere, priom N vyhad v opanom smere.
+ CTRL-O a vrti sp na stariu pozciu, CTRL-I na noviu pozciu.
+
+ 3. Napsanie % ke kurzor je na (,),[,],{, alebo } njde zodpovdajcu
+ prnu ztvorku.
+
+ 4. Pre nahradenie novho za prv star v riadku nap :s/star/nov
+ Pre nahradenie novho za vetky star v riadku nap :s/star/nov/g
+ Pre nahradenie reazcov medzi dvoma riadkami 3 nap :#,#/star/nov/g
+ Pre nahradenie vetkch vskytov v sbore nap :%s/star/nov/g
+ Pre potvrdenie kadho nahradenia pridaj 'c' :%s/star/nov/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.1 AKO SPUSTI VONKAJ PRKAZ
+
+
+ ** Nap prkaz :! nasledovan vonkajm prkazom pre spustenie prkazu **
+
+ 1. Nap obvykl pkaz : ktor nastav kurzor na spodok obrazovky.
+ To umon napsa prkaz.
+
+ 2. Teraz nap ! (vkrink). To umon spusti hociak vonkaj prkaz
+ z prkazovho riadku.
+
+ 3. Ako prklad nap ls za ! a stla <ENTER>. Tento prkaz
+ zobraz obsah tvojho adresra rovnako ako na prkazovom riadku.
+ Alebo poui :!dir ak ls nefunguje.
+
+Poznmka: Takto je mon spusti hociak vonkaj prkaz s argumentami.
+Poznmka: Vetky prkazy : musia by dokonen stlaenm <ENTER>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.2: VIAC O UKLADAN SBOROV
+
+
+ ** Pre uloenie zmien v sbore, nap :w FILENAME. **
+
+ 1. Nap :!dir alebo :!ls pre vpis aktulneho adresra.
+ U vie, e mus za tmto stlai <ENTER> .
+
+ 2. Vyber nzov sboru, ktor ete neexistuje, ako napr. TEST.
+
+ 3. Teraz nap: :w TEST (kde TEST je nzov vybratho sboru.)
+
+ 4. To ulo cel sbor (Vim Tutor) pod nzovm TEST.
+ Pre overenie nap :!dir , m zobraz obsah adresra.
+
+Poznmka: e ak ukon prcu s editorom Vim a znovu ho spust prkazom
+ vim TEST, sbor bude kpia vuky, ke si ho uloil.
+
+ 5. Teraz odstr sbor napsanm (MS-DOS): :!del TEST
+ alebo (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.3 VBER TEXTU PRE ULOENIE
+
+
+ ** Pre uloenie asti sboru, nap v pohyb :w FILENAME **
+
+ 1. Presu kurozr na tento riadok.
+
+ 2. Stla v a presu kurozr na piatu poloku dole. Poznmka, e
+ tento text je vyznaen (highlighted).
+
+ 3. Stla klvesu : . V spodnej asti okna sa objav :'<,'>.
+
+ 4. Nap w TEST , kde TEST je meno sboru, ktor zatial neexistuje.
+ Skontroluj, e vid :'<,'>w TEST predtm ne stla Enter.
+
+ 5. Vim zape oznaen riadky do sboru TEST. Poui :!dir alebo :!ls
+ pre overenie. Zatial ho ete nema! Pouijeme ho v alej lekcii.
+
+POZNMKA: Stlaenm klvesy v sa spust vizulne oznaovanie.
+ Me pohybova kurzorom pre upresnenie vyznaenho textu.
+ Potom me poui opertor pre vykonanie nejakej akcie
+ s textom. Naprklad d zmae vyznaen text.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.4: VBER A ZLUOVANIE SBOROV
+
+
+ ** Pre vloenie obsahu sboru, nap :r FILENAME **
+
+ 1. Premiestni kurzor nad tento riadok.
+
+POZNMKA: Po vykonan kroku 2 uvid text z lekcie 5.3. Potom sa presu
+ dole, aby si videl tto lekciu.
+
+ 3. Teraz vlo sbor TEST pouitm prkazu :r TEST kde TEST je nzov
+ sboru. Sbor, ktor si pouil je umiestnen pod riadkom s kurzorom.
+
+POZNMKA: Me tie nata vstup vonkajieho prkazu. Naprklad :r !ls
+ nata vstup prkazu ls a umiestni ho za pozciu kurzora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 5 ZHRNUTIE
+
+
+ 1. :!prkaz spust vonkaj prkaz.
+
+ Niektor vyuiten prklady s:
+ (MS_DOS) (UNIX)
+ :!dir :!ls - zobraz obsah adresra
+ :!del FILENAME :!rm FILENAME - odstrni sbor FILENAME
+
+ 2. :w FILENAME ulo aktulny sbor na disk pod menom FILENAME.
+
+ 3. v pohyb :w FILENAME ulo vizulne oznaen riadky do
+ sboru FILENAME.
+
+ 4. :r FILENAME vyberie z disku sbor FILENAME a vlo ho do aktulneho
+ sboru za pozciou kurzora.
+
+ 5. :r !dir nata vstup z prkazu dir a vlo ho za pozciu kurzora.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.1: PRKAZ OTVORI
+
+
+** Nap o pre vloenie riadku pod kurzor a prepnutie do vkladacieho mdu **
+
+ 1. Presu kurzor niie na riadok oznaen znakou --->.
+
+ 2. Nap o (mal psmeno) pre vloenie istho riadku pod kurzorm
+ a prepnutie do vkladacieho mdu.
+
+ 3. Teraz skopruj riadok oznaen ---> a stla <ESC> pre ukonenie
+ vkladacieho mdu.
+
+---> Po napsan o sa kurzor premiestn na vloen riadok do vkladacieho
+ mdu.
+
+ 4. Pre otvorenie riadku nad kurzorom, jednotucho nap vek O ,
+ namiesto malho o. Vyskaj si to na riadku dole.
+
+---> Vlo riadok nad tmto napsanm O, ke kurzor je na tomto riadku.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.2: PRKAZ PRIDA
+
+
+ ** Nap a pre vloenie textu ZA kurzor. **
+
+ 1. Presu kurzor niie na koniec prvho riadku oznaenho znakou --->
+
+ 2. Stla klvesu e dokia kurozr nieje na konci riadku.
+
+ 3. Nap a (mal psmeno) pre pridanie textu ZA kurzorom.
+
+ 4. Dokon slovo tak ako je to v druhom riadku. Stla <ESC> pre
+ opustenie vkladacieho mdu.
+
+ 5. Poui e na presun na alie nedokonen slovo a zopakuj kroky 3 a 4.
+
+---> Tento ri ti dovouje ncv privan testu na koniec riadku.
+---> Tento riadok ti dovouje ncvik pridvania textu na koniec riadku.
+
+POZNMKA: a, i, A tartuj rovnak vkladac md, jedin rozidel je, kde
+ sa znaky vkladaj.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.3: IN SPOSOB NAHRADZOVANIA
+
+
+ ** Nap vek R pre nahradenie viac ako jednho znaku. **
+
+ 1. Presu kurzor niie na prv riadok oznaen znakou --->. Premiestni
+ kurzor na zaiatok prvho vskytu xxx.
+
+ 2. Teraz nap R a nap slo uveden v druhom riadku, take
+ sa nm nahrad pvodn xxx.
+
+ 3. Stla <ESC> pre opustenie nahradzovacieho mdu. Poznmka, e zvyok
+ riadku zostane nezmenen.
+
+ 4. Zopakuj tieto kroky pre nahradenie zvynch xxx.
+
+---> Pridanm 123 ku xxx dostane xxx.
+---> Pridanm 123 ku 456 dostane 579.
+
+POZNMKA: Nahradzovac md je ako vkladac md, ale kad napsan znak
+ zmae existujci znak.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lekcia 6.4: Copy Paste textu
+
+ ** pou opertor y pre copy textku a p pre jeho paste **
+
+ 1. Cho niie na riadok oznaen ---> a umiestni kurozr za "a)".
+
+ 2. Natartuj vizulny md pouitm v a presu kurozr pred "first".
+
+ 3. Nap y pre vystrihnutie (copy) oznaenho textu.
+
+ 4. Presu kurozr na koniec alieho riadku: j$
+
+ 5. Nap p pre vlonie (paste) textu. Potom nap: a druha <ESC>.
+
+ 6. Poui vizulny md pre oznaenie "poloka.", vystrihni to
+ pouitm y, presu sa na koniec nasledujceho riadku pouitm j$
+ a vlo sem text pouitm p.
+
+---> a) toto je prv poloka
+---> b)
+
+POZNMKA: Me poui tie y ako opertor; yw vystrihne jedno slovo.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.5: NASTAVENIE MONOST
+
+
+** Nastav monosti, take vyhadvanie alebo nahradzovanie ignoruje
+ rozliovanie **
+
+
+ 1. Vyhadaj reazec 'ignore' napsanm:
+ /ignore <ENTER>
+ Zopakuj vyhadvanie niekoko krt stlaenm klvesy n .
+
+ 2. Nastav monos 'ic' (Ignore case) napsanm prkazu:
+ :set ic
+
+ 3. Teraz vyhadaj reazec 'ingore' znova stlaenm klvesy n
+ Poznmka, e teraz s vyhadan aj Ignore a IGNORE.
+
+ 4. Nastav monosi 'hlsearch' a 'incsearch':
+ :set hls is
+
+ 5. Teraz spusti vyhadvac prkaz znovu, a pozri o sa stalo:
+ /ignore <ENTER>
+
+ 6. Pre opetovn zapnutie rozlyovania vekch a malch psmen
+ nap: :set noic
+
+POZNMKA: Na odstrnenie zvraznenia vrazov nap: :nohlsearch
+POZNMKA: Ak chce nerozlyova vekos psmen len pre jedno
+ pouitie vyhadvacieho prkazu, poui \c: /ignore\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 6 ZHRNUTIE
+
+
+ 1. Nap o pre otvorenie riadku pod kurzorom a tart vkladacieho mdu.
+ Nap O pre otvorenie riadku nad kurzorom.
+
+ 2. Nap a pre vkladanie textu ZA kurzor.
+ Nap A pre vkladanie textu za koncom riadku.
+
+ 3. Prkaz e presunie kurozr na koniec slova
+
+ 4. Opertor y vystrihne (skopruje) text, p ho vlo.
+
+ 5. Napsanie vekho R prepne do nahradzovacieho mdu, km nieje
+ stlaen <ESC>.
+
+ 6. Napsanie ":set xxx" nastav monos "xxx". Niektor nastavenia s:
+ 'ic' 'ignorecase' ignoruje vek a mal psmen poas vyhadvania.
+ 'is' 'incsearch' zobrazuje iaston reazce vyhadvanho reazca.
+ 'hls' 'hlsearch' vyzna vetky vyhadvan reazce.
+ Me poui hociktor z dlhch a krtkych nzvov monost.
+
+ 7. Vlo "no" pred nastavenie pre jeho vypnutie: :set noic
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 7.1: ZSKANIE NPOVEDY
+
+
+ ** Pouvaj on-line systm npovedy **
+
+ Vim m obsiahly on-line systm npovedy. Pre odtartovanie, vyskaj jeden
+ z tchto troch:
+ - stla klvesu <HELP> (ak nejak m)
+ - stla klvesu <F1> (ak nejak m)
+ - nap :help <ENTER>
+
+ taj text v okne npovedy pre zskanie predstavy ako npoveda funguje.
+ Nap CTRL-W CTRL-W pre skok z jednho okna do druhho.
+ Nap :q <ENTER> m zatvor okno npovedy.
+
+ Me njs help ku hociakej tme pridanm argumentu ku prkazu ":help".
+ Vyskaj tieto (nezabudni stlai <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 7.2: VYTVORENIE TARTOVACIEHO SKRIPTU
+
+ ** Zapni funkcie editora Vim **
+
+ Vim m omnoho viac funkcii ne Vi, ale veina z nich je implicitne
+ vypnut. Pre pouvanie viac Vim funkcii vytvor "vimrc" sbor.
+
+ 1. Zani editova "vimrc" sbor, to zvis na pouitom systme:
+ :e ~/.vimrc pre Unix
+ :e ~/_vimrc pre MS-Windows
+
+ 2. Teraz si pretaj text prkladu "vimrc" sboru:
+
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Ulo sbor:
+ :w
+
+ Pri nasledujcom tarte editora Vim sa pouije zvrazovanie syntaxe.
+ Do "vimrc" sboru me prida vetky svoje uprednostovan nastavenia.
+ Pre viac informcii nap :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ LEKCIA 7.3 DOKONENIE
+
+ ** Dokoni prkaz na prkazovom riadku pouitm CTRL-D a <TAB> **
+
+ 1. Uisti sa, e Vim nieje v kompatibilnom mde: :set nocp
+
+ 2. Pozri sa ak sbory sa nachdzaj v adresri: :!ls alebo :!dir
+
+ 3. Nap zaiatok prkazu: :e
+
+ 4. Stla CTRL-D a Vim zobraz zoznam prkazov zanajcich "e".
+
+ 5. Stla <TAB> a Vim dokon meno prkazu na ":edit".
+
+ 6. Teraz pridaj medzernk a zaiatok mena existujceho sboru:
+ :edit FIL
+
+ 7. Stla <TAB>. Vim dokon meno (ak je jedinen).
+
+POZNMKA: Dokonovanie funguje pre vea prkazov. Vyskaj stlaenie
+ CTRL-D a <TAB>. pecilne je to uiton pre prkaz :help.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ LEKCIA 7 ZHRNUTIE
+
+ 1. Nap :help alebo stla <F1> alebo <Help> pre otvorenie okna npovedy.
+
+ 2. Nap :help prkaz pre vyhadanie npovedy ku prkazu prkaz.
+
+ 3. Nap CTRL-W CTRL-W na preskoenie do inho okna.
+
+ 4. Nap :q pre zatvorenie okna npovedy
+
+ 5. Vytvor tartovac skript vimrc pre udranie uprednostovanch nastaven.
+
+ 6. Poas psania prkazu : stla CTRL-D pre zobrazenie dokonen.
+ Stla <TAB> pre pouitie jednho z dokonen.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ Toto vymedzuje vuku Vimu. Toto je uren pre strucn prehad o editore
+ Vim, plne postaujce pre ahk a obstojn pouvanie tohto editora.
+ Tto vuka je aleko od kompletnosti, pretoe Vim m omnoho viacej prkazov.
+ Ako alie si pretaj uvatsk manul: ":help user-manual".
+
+ Pre alie tanie a tdium je odporan kniha:
+ Vim - Vi Improved - od Steve Oualline
+ Vydavate: New Riders
+ Prv kniha uren pre Vim. pecilne vhodn pre zaiatonkov.
+ Obsahuje mnostvo prkladov a obrzkov.
+ Pozri na https://iccf-holland.org/click5.html
+
+ Tto kniha je staria a je viac o Vi ako o Vim, ale je tie odporan:
+ Learning the Vi Editor - od Linda Lamb
+ Vydavate: O'Reilly & Associates Inc.
+ Je to dobr kniha pre zskanie vedomost o prci s editorom Vi.
+ ieste vydanie obsahuje tie informcie o editore Vim.
+
+ Tto vuka bola napsan autormi Michael C. Pierce a Robert K. Ware,
+ Colorado School of Mines s pouitm mylienok dodanmi od Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Modifikovan pre Vim od Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Preklad do Sloveniny: ubo elko
+ e-mail: celbos@inmail.sk
+ Last Change: 2006 Apr 18
+ encoding: cp1250
diff --git a/runtime/tutor/tutor.sk.utf-8 b/runtime/tutor/tutor.sk.utf-8
new file mode 100644
index 0000000..d25e9cb
--- /dev/null
+++ b/runtime/tutor/tutor.sk.utf-8
@@ -0,0 +1,1008 @@
+===============================================================================
+= V i t a j t e v o V I M T u t o r i a l i - Verzia 1.7 =
+===============================================================================
+
+ Vim je veľmi výkonný editor, ktorý má príliž veľa príkazov na to aby
+ mohli byt všetky popísané vo výuke akou je táto. Táto výuka
+ popisuje dostatočné množstvo príkazov nato aby bolo možné používať
+ Vim ako viacúčelový editor.
+
+ Približný čas potrebný na prebratie tejto výuky je 25-30 minút,
+ závisí na tom, koľko je stráveného času s preskúšavaním.
+
+ UPOZORNENIE:
+ Príkazy v lekciách modifikujú text. Vytvor kópiu tohto súboru aby
+ sa mohlo precvičovať na ňom (pri štarte "vimtutor" je toto kópia).
+
+ Je dôležité zapamätať si, že táto výuka je vytvorená pre výuku
+ používaním. To znamená, že je potrebné si príkazy vyskúšať, aby bolo
+ učenie správne. Ak len čitas text, príkazy zabudneš!
+
+ Presvedč sa, že Caps-Lock NIEJE stlačený a stlačt klávesu
+ j niekoľko krát, aby sa kurzor posunul natoľko, že lekcia 1.1
+ celkom zaplní obrazovku.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.1: POHYB KURZOROM
+
+
+ ** Pre pohyb kurzorum stlač klávesy h,j,k,l ako je znázornené. **
+ ^
+ k Funkcia: Klávesa h je naľavo a vykoná pohyb doľava.
+ < h l > Klávesa l je napravo a vykoná pohyb doprava.
+ j Klávesa j vyzerá ako šípka dole
+ v
+ 1. Pohybuj kurzorom po obrazovke, kým si na to nezvykneš.
+
+ 2. Drž stlačenú klávesu pre pohyb dole (j), kým sa jej funkcia nezopakuje.
+---> Teraz sa už vieš pohybovať na nasledujúcu lekciu.
+
+ 3. Použitím klávesy pre pohyb dole prejdi na Lekciu 1.2.
+
+Poznámka: Ak si niesi istý tým čo si napísal, stlač <ESC>
+ na prechod do normálneho módu.
+
+Poznámka: Kurzorové klávesy sú tiež funkčné. Ale používaním hjkl sa budeš
+ schopný pohybovať rýchlejšie, keď si zvykneš ich používať. Naozaj!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 1.2: ZATVÁRANIE VIMU
+
+
+ !! POZNÁMKA: Pred vykonaním týchto krokov si prečítaj celú túto lekciu !!
+
+ 1. Stlač klávesu <ESC> (aby si sa učite nachádzal v normálnom móde)
+
+ 2. Napíš: :q! <ENTER>.
+ Tým ukončíš prácu s editorom BEZ uloženia zmien, ktoré si vykonal.
+
+ 3. Keď sa dostaneš na príkazový riadok, napíš príkaz, ktorým sa dostaneš
+ speť do tejto výuky. To môže byť: vimtutor <ENTER>
+
+ 4. Ak si si tieto kroky spoľahlivo zapamätal, vykonaj kroky 1 až 3, pre
+ ukončenie a znovu spustenie editora.
+
+POZNÁMKA: :q! <ENTER> neuloží zmeny, ktoré si vykonal. O niekoľko lekcií
+ sa naučíš ako uložiť zmeny do súboru
+
+ 5. presuň kurzor dole na lekciu 1.3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.3: EDITÁCIA TEXTU - MAZANIE
+
+
+** Stlačenie klávesy x v normálnom móde zmaže znak na mieste kurzora. **
+
+ 1. Presuň kurzor nižšie na riadok označený značkou --->.
+
+ 2. Aby si mohol odstrániť chyby, pohybuj kurzorom kým neprejde na znak,
+ ktorý chceš zmazať.
+
+ 3. Stlač klávesu x aby sa zmazal nechcený znak.
+
+ 4. Zopakuj kroky 2 až 4 až kým veta nieje správna.
+
+---> Kraava skoočilla ccezz mesiiac.
+
+ 5. Ak je veta správna, prejdi na lekciu 1.4.
+
+POZNÁMKA: Neskúšaj si zapamätať obsah tejto výuky, ale sa uč používaním.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.4: EDITÁCIA TEXTU - VKLADANIE
+
+
+ ** Stlačenie klávesy i umožňuje vkladanie textu. **
+
+ 1. Presuň kurzor nižšie na prvý riadok za značku --->.
+
+ 2. Pre upravenie prvého riadku do rovnakého tvaru ako je druhý riadok,
+ presuň kurzor na prvý znak za misto, kde má byť text vložený.
+
+ 3. Stlač klávesu i a napíš potrebný text.
+
+ 4. Po opravení každej chyby, stlač <ESC> pre návrat do normálneho módu.
+ Zopakuj kroky 2 až 4 kým nieje veta správna.
+
+---> Tu je text chýbajúci tejto.
+---> Tu je nejaký text chýbajúci od tejto čiary.
+
+ 5. Keď sa dostatočne naučíš vkladať text, prejdi na nasledujúce zhrnutie.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.5: EDITÁCIA TEXTU - PRIDÁVANIE
+
+
+ ** Stlačenie klávesy A umožňuje pridávať text. **
+
+ 1. Presuň kurozr nižšie na prvý riadok za značkou --->.
+ Nezáleží na tom, na ktorom znaku sa kurzor v tom riadku nachádza.
+
+ 2. Stlač klávesu A a napíš potrebný text.
+
+ 3. Po pridaní textu stlač klávesu <ESC> pre návrat do Normálneho módu.
+
+ 4. Presuň kurozr na druhý riadok označený ---> a zopakuj
+ kroky 2 a 3 kým nieje veta správna.
+
+---> Tu je nejaký text chýbajúci o
+ Tu je nejaký text chýbajúci od tiaľto.
+---> Tu tiež chýba nej
+ Tu tiež chýba nejaký text.
+
+ 5. Keď sa dostatočne naučíš pridávať text, prejdi na lekciu 1.6.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 1.6: EDITÁCIA SÚBORU
+
+
+ ** Napísaním :wq sa súbor uloží a zavrie **
+
+!! POZNÁMKA: Pred vykonaním týchto krokov si prečítaj celú lekciu!!
+
+1. Opusti túto výuku, ako si to urobil v lekcii 1.2: :q!
+
+2. Do príkazového riadku napíš príkaz: vim tutor <ENTER>
+ 'vim' je príkaz, ktorý spustí editor Vim, 'tutor' je meno súboru,
+ ktorý chceš editovať. Použi taký súbor, ktorý môžeš meniť.
+
+3. Vlož a zmaž text tak, ako si sa naučil v predošlých lekciach.
+
+4. Ulož súbor so zmenami a opusti Vim príkazom: :wq <ENTER>
+
+5. Reštartuj vimtutor a presuň sa dole na nasledujúce zhrnutie.
+
+6. Urob tak po prečítaní predošlých krokov a porozumeniu im.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ZHRNUTIE LEKCIE 1
+
+
+ 1. Kurzor sa pohybuje použitím kláves so šípkami alebo klávesmi hjkl.
+ h (do lava) j (dole) k (hore) l (doprava)
+
+ 2. Pre spustenie Vimu (z príkazového riadku) napíš: vim FILENAME <ENTER>
+
+ 3. Na ukončenie Vimu napíš: <ESC> :q! <ENTER> pre zrušenie všetkých zmien
+ alebo napíš: <ESC> :wq <ENTER> pre uloženie zmien.
+
+ 4. Na zmazanie znaku na mieste kurzora napíš: x
+
+ 5. Pre vloženie textu na mieste kurzora v normálnom móde napíš:
+ i napíš vkladaný text <ESC> vkladanie pred kurzor
+ A napíš pridávaný text <EXC> vkladanie za riadok
+
+POZNÁMKA: Stlačenie <ESC> ťa premiestní do normálneho módu alebo zruší
+ nejaký nechcený a čiastočne dokončený príkaz.
+
+Teraz pokračuj lekciou 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.1: Mazacie príkazy
+
+
+ ** Napísanie príkazu dw zmaže znaky do konca slova. **
+
+1. Stlač <ESC> aby si bol bezpečne v normálnom móde.
+
+2. Presuň kurzor nižšie na riadok označený značkou --->.
+
+3. Presuň kurzor na začiatok slova, ktoré je potrebné zmazať.
+
+4. Napíš dw aby slovo zmizlo.
+
+POZNÁMKA: Písmeno d sa zobrazí na poslednom riadku obrazovky keď ho
+ napíšeš. Vim na teba počká, aby si mohol napísať
+ písmeno w. Ak vidíš niečo iné ako d , tak si napísal
+ nesprávny znak; stlač <ESC> a začni znova.
+
+---> Tu je niekoľko slov zábava, ktoré nie patria list do tejto vety.
+
+5. Zopakuj kroky 3 až 4 kým veta nieje správna a prejdi na lekciu 2.2.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.2: VIAC MAZACÍCH PRÍKAZOV
+
+
+ ** Napísanie príkazu d$ zmaže znaky do konca riadku **
+
+1. Stlač <ESC> aby si bol bezpečne v normálnom móde.
+
+2. Presuň kurzor nižšie na riadok označený značkou --->.
+
+3. Presuň kurzor na koniec správnej vety (ZA prvú bodku).
+
+4. Napíš d$ aby sa zmazali znaky do konca riadku.
+
+---> Niekto napísal koniec tohto riadku dvakrát. koniec tohot riadku dvakrát.
+
+
+5. Prejdi na lekciu 2.3 pre pochopenie toho čo sa stalo.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.3: OPERÁTORY A POHYBY
+
+ Veľa príkazov, ktoré menia text sú odvodené od operátorov a pohybov.
+ Formát pre príkaz mazania klávesou d je nasledovný:
+
+ d pohyb
+
+ kde:
+ d - je mazací operátor
+ pohyb - je to čo operátor vykonáva (vypísané nižšie)
+
+ Krátky list pohybov:
+ w - do začiatku ďalšieho slova, okrem jeho prvého písmena.
+ e - do konca terajšieho slova, vrátane posledného znaku.
+ $ - do konca riadku, vrátane posledného znaku
+
+ Takže napísaním de sa zmaže všetko od kurzora do konca slova.
+
+POZNÁMKA: Stlačením iba pohybu v normálnom móde bez operátora
+ sa presunie kurzor tak ako je to špecivikované.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.4: Použitie viacnásobného pohybu
+
+
+ ** Napísaním čísla pred pohyb ho zopakuje zadný počet krát **
+
+ 1. Presuň kurozr nižšie na začiatok riadku označeného --->.
+
+ 2. Napíš 2w a kurozr sa presunie o dve slová vpred.
+
+ 3. Napíš 3e a kurozr sa presunie vpred na koniec tretieho slova.
+
+ 4. Napíš 0 (nula) a kurozr sa presunie na začiatok riadku.
+
+ 5. Zopakuj kroky 2 a 3 s rôznymi číslami.
+
+---> Toto je riadok so slovami po kotrých sa môžete pohybovať.
+
+ 6. Prejdi na lekciu 2.5.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.5: POUŽITIE VIACNÁSOBNÉHO MAZANIA PRE HROMADNÉ MAZANIE
+
+
+ ** Napísanie čísla spolu s operátorom ho zopakuje zadaný počet krát **
+
+ V kombinácii operátorov mazania a pohybu spomínaného vyššie vlož počet
+ pred pohyb pre docielenie hromadného mazania:
+ d číslo pohyb
+
+ 1. Presuň kurzor na prvé slovo písané VEĽKÝMI PÍSMENAMI
+ v riadku označenom --->.
+
+ 2. Napíš 2dw a zmažeš dve slová písané VEĽKÝMI PÍSMENAMI
+
+ 3. Zopakuj kroky 1 a 2 s použitím rôzneho čísla tak aby si zmazal slová
+ písané veľkými písmenami jedným príkazom.
+
+---> Tento ABC DE riadok FGHI JK LMN OP so slovamI je Q RS TUV vycisteny.
+
+POZNÁMKA: Číslo medzi operátorom d a pohybom funguje podobne ako pri
+ použití s pohybom bez operátora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.6: OPERÁCIE S RIADKAMI
+
+
+ ** Napísanie príkazu dd zmaže celý riadok. **
+
+Vzhľadom na frekvenciu mazania celého riadku, sa autori Vimu rozhodli,
+že bude jednoduchšie mazať celý riadok napísaním dvoch písmen d.
+
+1. Presuň kurzor na druhý riadok v texte na spodu.
+2. Napíš dd aby si zmazal riadok.
+3. Prejdi na štvrtý riadok.
+4. Napíš 2dd aby si zmazal dva riadky.
+
+ 1) Ruže sú červené,
+ 2) Blato je zábavné,
+ 3) Fialky sú modré,
+ 4) Mám auto,
+ 5) Hodinky ukazujú čas,
+ 6) Cukor je sladký,
+ 7) A to si ty.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 2.7: PRÍKAZ UNDO
+
+
+** Stlač u pre vrátenie posledného príkazu, U pre úpravu celého riadku. **
+
+1. Presuň kurzor nižšie na riadok označený značkou ---> a premiestni ho na
+ prvú chybu.
+2. Napíš x pre zmazanie prvého nechceného riadku.
+3. Teraz napíš u čím vrátíš späť posledne vykonaný príkaz.
+4. Teraz oprav všetky chyby na riadku použitím príkazu x .
+5. Teraz napíš veľké U čím vrátíš riadok do pôvodného stavu.
+6. Teraz napíš u niekoľko krát, čím vrátíš späť príkaz U.
+7. Teraz napíš CTRL-R (drž klávesu CTRL stlačenú kým stláčaš R) niekoľko
+ krát, čím vrátíš späť predtým vrátené príkazy (undo z undo).
+
+---> Opprav chybby nna toomto riadku a zmeeň ich pommocou undo.
+
+ 8. Tieto príkazy sú často používané. Teraz prejdi na zhrnutie lekcie 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 2 ZHRNUTIE
+
+
+ 1. Pre zmazanie znakov od kurzora do konca slova napíš: dw
+
+ 2. Pre zmazanie znakov od kurzora do konca riadku napíš: d$
+
+ 3. Pre zmazanie celého riadku napíš: dd
+
+ 4. Pre zopakovanie pohybu, napíš pred neho číslo: 2w
+
+ 5. Formát pre píkaz:
+
+ operátor [číslo] pohyb
+ kde:
+ operátor - čo treba robiť, napríklad d pre zmazanie
+ [číslo] - je voliteľný počet pre opakovanie pohybu
+ pohyb - pohyb po texte vzhľadom na operátor, napríklad w (slovo),
+ $ (do konca riadku), atď.
+
+ 6. Pre pohyb na začiatok riadku použi nulu: 0
+
+ 7. Pre vrátenie späť predošlej operácie napíš: u (malé u)
+ Pre vrátenie všetkých úprav na riadku napíš: U (veľké U)
+ Pre vrátenie vrátených úprav napíš: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.1: PRÍKAZ VLOŽIŤ
+
+
+ ** Napísanie príkazu p vloží psledný výmaz za kurzor. **
+
+ 1. Presuň kurzor nižšie na prvý riadok textu.
+
+ 2. Napíš dd čím zmažeš riadok a uložíš ho do buffera editora Vim.
+
+ 3. Presuň kurzor vyššie tam, kam zmazaný riadok patrí.
+
+ 4. Ak napíšeš v normálnom móde p zmazaný riadk sa vloží.
+
+ 5. Zopakuj kroky 2 až 4, kým riadky niesú v správnom poradí.
+
+---> d) Tiež sa dokážeš vzdelávať?
+---> b) Fialky sú modré,
+---> c) Inteligencia sa vzdeláva,
+---> a) Ruže sú červené,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.2: PRÍKAZ NAHRADENIA
+
+
+ ** Napísaním rx sa nahradí znak na mieste kurzora znakom x . **
+
+ 1. Presuň kurzor nižšie na prví riadok textu označeného značkou --->.
+
+ 2. Presuň kurzor na začiatok prvej chyby.
+
+ 3. napíš r a potom znak, ktorý tam má byť.
+
+ 4. Zopakuj kroky 2 a 3, kým prvý riadok nieje zhodný s druhým.
+
+---> Kaď bol tento riasok píaaný, niekro stlašil nesprábne klávesy!
+---> Keď bol tento riadok písaný, niekto stlačil nesprávne klávesy!
+
+ 5. Teraz prejdi na lekciu 3.2.
+
+POZNÁMKA: Pamätaj si, že naučiť sa môžeš len používanim, nie pamätaním.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.3. PRÍKAZ ÚPRAVY
+
+
+ ** Ak chceš zmeniť časť slova do konca slova, napíš ce . **
+
+ 1. Presuň kurzor nižšie na prvý riadok označený značkou --->.
+
+ 2. Umiestni kurzor na písmeno o v slove rosfpl.
+
+ 3. Napíš ce a oprav slovo (v tomto prípade napíš 'iadok'.)
+
+ 4. Stlač <ESC> a prejdi na ďalší znak, ktorý treba zmeniť.
+
+ 5. Zopakuj kroky 3 a 4, kým prvá veta nieje rovnaká ako druhá.
+
+---> Tento rosfpl má niekoľko skic, ktoré je pirewvbí zmeniť piyťučán príkazu.
+---> Tento riadok má niekoľko slov, ktoré je potrebné zmeniť použitím príkazu.
+
+Poznámka, že ce zmaže slovo a nastaví vkladací mód.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 3.4: VIAC ZMIEN POUŽITÍM c
+
+
+ ** Príkaz pre úpravy sa používa s rovnakými pohybmi ako pre mazanie **
+
+ 1. Príkaz pre úpravy pracuje rovnako ako pre mazanie. Formát je:
+
+ c [číslo] pohyb
+
+ 2. Pohyby sú rovnaké, ako napríklad w (slovo) a $ (koniec riadku).
+
+ 3. Presuň kurzor nižšie na prvý riadok označený značkou --->.
+
+ 4. Presuň kurzor na prvú chybu.
+
+ 5. napíš c$ aby si mohol upraviť zvyšok riadku podľa druhého
+ a stlač <ESC>.
+
+---> Koniec tohto riadku potrebuje pomoc, aby bol ako druhy.
+---> Koniec tohto riadku potrebuje opraviť použitím príkazu c$ .
+
+POZNÁMKA: Môžeš použiť klávesu backspace na úpravu zmien počas písania.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 3 ZHRNUTIE
+
+
+ 1. Na vloženie textu, ktorý už bol zmazaný, napíš p . To vloží zmazaný
+ text ZA kurzor (ak bol riadok zmazaný prejde na riadok pod kurzorom).
+
+ 2. Pre naradenie znaku na mieste kurzora, napíš r a potom znak, ktorý
+ nahradí pôvodný znak.
+
+ 3. Príkaz na upravenie umožňuje zmeniť od kurzora až po miesto, ktoré
+ určuje pohyb. napr. Napíš ce čím zmníš text od pozície
+ kurzora do konca slova, c$ zmení text do konca riadku.
+
+ 4. Formát pre nahradenie je:
+
+ c [číslo] pohyb
+
+
+Teraz prejdi na nalsedujúcu lekciu.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.1: POZÍCIA A STATUS SÚBORU
+
+
+ ** Stlač CTRL-g pre zobrazenie svojej pozície v súbore a statusu súboru.
+ Napíš G pre presun na riadok v súbore. **
+
+ Poznámka: Prečítaj si celú túto lekciu skôr ako začneš vykonávať kroky!!
+
+ 1. Drž stlačenú klávesu Ctrl a stlač g . Toto nazývame CTRL-G.
+ Na spodu obrazovky sa zobrazí správa s názvom súboru a pozíciou
+ v súbore. Zapamätajsi si číslo riadku pre použitie v kroku 3.
+
+ 2. Stlač G čím sa dostaneš na spodok súboru.
+ Napíš gg čím sa dostaneš na začiatok súboru.
+
+ 3. Napíš číslo riadku na ktorom si sa nachádzal a stlač G. To ťa
+ vráti na riadok, na ktorom si prvý krát stlačil CTRL-G.
+
+ 4. Ak sa cítíš schopný vykonať teto kroky, vykonaj kroky 1 až 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.2: PRÍKAZ VYHĽADÁVANIA
+
+
+ ** Napíš / nasledované reťazcom pre vyhľadanie príslušného reťazca. **
+
+ 1. Napíš znak / v normálnom móde. Poznámka, že tento znak sa spolu
+ s kurzorom zobrazí v dolnej časti obrazovky s : príkazom.
+
+ 2. Teraz napíš 'errroor' <ENTER>. To je slovo, ktoré chceš vyhľadať.
+
+ 3. Pre vyhľadanie ďalšieho výskytu rovnakého reťazca, stlač jednoducho n.
+ Pre vyhľadanie ďalšieho výskytu rovnakého reťazca opačným smerom,
+ N.
+
+ 4. Ak chceš vyhľadať reťazec v spätnom smere, použí príkaz ? miesto
+ príkazu /.
+
+ 5. Pre návrat na miesto z ktorého si prišiel stlač CTRL-O (drž stlačenú
+ klávesu Ctrl počas stlačenia klávesy o). Zopakuj pre ďalší návrat
+ späť. CTRL-I ide vpred.
+
+POZNÁMKA: "errroor" nieje spôsob hláskovania error; errroor je error.
+POZNÁMKA: Keď vyhľadávanie dosiahne koniec tohto súboru, bude pokračovať na
+ začiatku, dokiaľ nieje resetované nastavenie 'wrapscan' .
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.3: VYHĽADÁVANIE ZODPOVEDAJÚCICH ZÁTAVORIEK
+
+
+ ** Napíš % pre vyhľadanie príslušného znaku ),], alebo } . **
+
+ 1. Premiestni kurzor na hocaký zo znakov (, [, alebo { v riadku nižšie
+ označeného značkou --->.
+
+ 2. Teraz napíš znak % .
+
+ 3. Kurzor sa premiestni na zodpovedajúcu zátvorku.
+
+ 4. Napíš % pre presun kurzoru späť na otvárajúcu zátvorku.
+
+ 5. Presuň kurzor na iný zo znakov (,),[,],{ alebo } a všimni si
+ čo % vykonáva.
+
+---> Toto ( je testovací riadok s ('s, ['s ] a {'s } v riadku. ))
+
+Poznámka: Toto je veľmi výhodné použíť pri ladení programu s chýbajúcimi
+ uzatvárajúcimi zátvorkami!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 4.4: PRÍKAZ NAHRADENIA
+
+
+ ** Napíš :s/starý/nový/g pre nahradenie slova 'starý' za slovo 'nový'. **
+
+ 1. Presuň kurzor nižšie na riadok označený značkou --->.
+
+ 2. Napíš :s/thee/the <ENTER> . Poznamka, že tento príkaz zmení len prvý
+ výskyt "thee" v riadku.
+
+ 3. Teraz napíš :s/thee/the/g čo znamená celkové nahradenie v riadku.
+ Toto nahradí všetky výskyty v riadku.
+
+---> Thee best time to see thee flowers in thee spring.
+
+ 4. Pre zmenu všetkých výskytov daného reťazca medzi dvomi ridakami,
+ napíš :#,#s/starý/nový/g kde #,# sú čísla dvoch riadkov, v rozsahu
+ ktorých sa nahradenie vykoná.
+ napíš :%s/starý/nový/g pre zmenu všetkých výskytov v celom riadku
+ napíš :%s/starý/nový/gc nájde všetky výskyty v celom súbore,
+ s otázkou či nahradiť alebo nie
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 4 ZHRNUTIE
+
+
+ 1. CTRL-g vypíše tvoju pozíciu v súbore a status súboru.
+ G ťa premiestni na koniec riadku.
+ číslo G ťa premiestni na riadok s číslom.
+ gg ťa presunie na prvý riadok
+
+ 2. Napísanie / nasledované reťazcom vyhľadá reťazec smerom DOPREDU.
+ Napísanie ? nasledované reťazcom vyhľada reťazec smerom DOZADU.
+ Napísanie n po vyhľadávaní, vyhľadá nasledujúci výskyt reťazca
+ v rovnakom smere, pričom N vyhľadá v opačnom smere.
+ CTRL-O ťa vráti späť na staršiu pozíciu, CTRL-I na novšiu pozíciu.
+
+ 3. Napísanie % keď kurzor je na (,),[,],{, alebo } nájde zodpovdajúcu
+ párnu zátvorku.
+
+ 4. Pre nahradenie nového za prvý starý v riadku napíš :s/starý/nový
+ Pre nahradenie nového za všetky staré v riadku napíš :s/starý/nový/g
+ Pre nahradenie reťazcov medzi dvoma riadkami 3 napíš :#,#/starý/nový/g
+ Pre nahradenie všetkých výskytov v súbore napíš :%s/starý/nový/g
+ Pre potvrdenie každého nahradenia pridaj 'c' :%s/starý/nový/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.1 AKO SPUSTIŤ VONKAJŠÍ PRÍKAZ
+
+
+ ** Napíš príkaz :! nasledovaný vonkajším príkazom pre spustenie príkazu **
+
+ 1. Napíš obvyklý píkaz : ktorý nastaví kurzor na spodok obrazovky.
+ To umožní napísať príkaz.
+
+ 2. Teraz napíš ! (výkričník). To umožní spustiť hociaký vonkajší príkaz
+ z príkazového riadku.
+
+ 3. Ako príklad napíš ls za ! a stlač <ENTER>. Tento príkaz
+ zobrazí obsah tvojho adresára rovnako ako na príkazovom riadku.
+ Alebo použi :!dir ak ls nefunguje.
+
+Poznámka: Takto je možné spustiť hociaký vonkajší príkaz s argumentami.
+Poznámka: Všetky príkazy : musia byť dokončené stlačením <ENTER>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.2: VIAC O UKLADANÍ SÚBOROV
+
+
+ ** Pre uloženie zmien v súbore, napíš :w FILENAME. **
+
+ 1. Napíš :!dir alebo :!ls pre výpis aktuálneho adresára.
+ Už vieš, že musíš za týmto stlačiť <ENTER> .
+
+ 2. Vyber názov súboru, ktorý ešte neexistuje, ako napr. TEST.
+
+ 3. Teraz napíš: :w TEST (kde TEST je názov vybratého súboru.)
+
+ 4. To uloží celý súbor (Vim Tutor) pod názovm TEST.
+ Pre overenie napíš :!dir , čím zobrazíš obsah adresára.
+
+Poznámka: že ak ukončíš prácu s editorom Vim a znovu ho spustíš príkazom
+ vim TEST, súbor bude kópia výuky, keď si ho uložil.
+
+ 5. Teraz odstráň súbor napísaním (MS-DOS): :!del TEST
+ alebo (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.3 VÝBER TEXTU PRE ULOŽENIE
+
+
+ ** Pre uloženie časti súboru, napíš v pohyb :w FILENAME **
+
+ 1. Presuň kurozr na tento riadok.
+
+ 2. Stlač v a presuň kurozr na piatu položku dole. Poznámka, že
+ tento text je vyznačený (highlighted).
+
+ 3. Stlač klávesu : . V spodnej časti okna sa objaví :'<,'>.
+
+ 4. Napíš w TEST , kde TEST je meno súboru, ktorý zatial neexistuje.
+ Skontroluj, e vidíš :'<,'>w TEST predtým než stlačíš Enter.
+
+ 5. Vim zapíše označené riadky do súboru TEST. Použi :!dir alebo :!ls
+ pre overenie. Zatial ho ešte nemaž! Použijeme ho v ďalšej lekcii.
+
+POZNÁMKA: Stlačením klávesy v sa spustí vizuálne označovanie.
+ Môžeš pohybovať kurzorom pre upresnenie vyznačeného textu.
+ Potom môžeš použiť operátor pre vykonanie nejakej akcie
+ s textom. Napríklad d zmaže vyznačený text.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 5.4: VÝBER A ZLUČOVANIE SÚBOROV
+
+
+ ** Pre vloženie obsahu súboru, napíš :r FILENAME **
+
+ 1. Premiestni kurzor nad tento riadok.
+
+POZNÁMKA: Po vykonaní kroku 2 uvidíš text z lekcie 5.3. Potom sa presuň
+ dole, aby si videl túto lekciu.
+
+ 3. Teraz vlož súbor TEST použitím príkazu :r TEST kde TEST je názov
+ súboru. Súbor, ktorý si použil je umiestnený pod riadkom s kurzorom.
+
+POZNÁMKA: Môžeš tiež načítať výstup vonkajšieho príkazu. Napríklad :r !ls
+ načíta výstup príkazu ls a umiestni ho za pozíciu kurzora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 5 ZHRNUTIE
+
+
+ 1. :!príkaz spustí vonkajší príkaz.
+
+ Niektoré využiteľné príklady sú:
+ (MS_DOS) (UNIX)
+ :!dir :!ls - zobrazí obsah adresára
+ :!del FILENAME :!rm FILENAME - odstráni súbor FILENAME
+
+ 2. :w FILENAME uloží aktuálny súbor na disk pod menom FILENAME.
+
+ 3. v pohyb :w FILENAME uloží vizuálne označené riadky do
+ súboru FILENAME.
+
+ 4. :r FILENAME vyberie z disku súbor FILENAME a vloží ho do aktuálneho
+ súboru za pozíciou kurzora.
+
+ 5. :r !dir načíta výstup z príkazu dir a vloží ho za pozíciu kurzora.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.1: PRÍKAZ OTVORIŤ
+
+
+** Napíš o pre vloženie riadku pod kurzor a prepnutie do vkladacieho módu **
+
+ 1. Presuň kurzor nižšie na riadok označený značkou --->.
+
+ 2. Napíš o (malé písmeno) pre vloženie čistého riadku pod kurzorm
+ a prepnutie do vkladacieho módu.
+
+ 3. Teraz skopíruj riadok označený ---> a stlač <ESC> pre ukončenie
+ vkladacieho módu.
+
+---> Po napísaní o sa kurzor premiestní na vložený riadok do vkladacieho
+ módu.
+
+ 4. Pre otvorenie riadku nad kurzorom, jednotucho napíš veľké O ,
+ namiesto malého o. Vyskúšaj si to na riadku dole.
+
+---> Vlož riadok nad týmto napísaním O, keď kurzor je na tomto riadku.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.2: PRÍKAZ PRIDAŤ
+
+
+ ** Napíš a pre vloženie textu ZA kurzor. **
+
+ 1. Presuň kurzor nižšie na koniec prvého riadku označeného značkou --->
+
+ 2. Stlač klávesu e dokiaľ kurozr nieje na konci riadku.
+
+ 3. Napíš a (malé písmeno) pre pridanie textu ZA kurzorom.
+
+ 4. Dokončí slovo tak ako je to v druhom riadku. Stlaš <ESC> pre
+ opustenie vkladacieho módu.
+
+ 5. Použi e na presun na ďalšie nedokončené slovo a zopakuj kroky 3 a 4.
+
+---> Tento ri ti dovoľuje nácv priávan testu na koniec riadku.
+---> Tento riadok ti dovoľuje nácvik pridávania textu na koniec riadku.
+
+POZNÁMKA: a, i, A štartujú rovnaký vkladací mód, jediný rozidel je, kde
+ sa znaky vkladajú.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.3: INÝ SPOSOB NAHRADZOVANIA
+
+
+ ** Napíš veľké R pre nahradenie viac ako jedného znaku. **
+
+ 1. Presuň kurzor nižšie na prvý riadok označený značkou --->. Premiestni
+ kurzor na začiatok prvého výskytu xxx.
+
+ 2. Teraz napíš R a napíš číslo uvedené v druhom riadku, takže
+ sa ním nahradí pôvodné xxx.
+
+ 3. Stlač <ESC> pre opustenie nahradzovacieho módu. Poznámka, že zvyšok
+ riadku zostane nezmenený.
+
+ 4. Zopakuj tieto kroky pre nahradenie zvyšných xxx.
+
+---> Pridaním 123 ku xxx dostaneš xxx.
+---> Pridaním 123 ku 456 dostaneš 579.
+
+POZNÁMKA: Nahradzovací mód je ako vkladací mód, ale každý napísaný znak
+ zmaže existujúci znak.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Lekcia 6.4: Copy Paste textu
+
+ ** použí operátor y pre copy textku a p pre jeho paste **
+
+ 1. Choď nižšie na riadok označený ---> a umiestni kurozr za "a)".
+
+ 2. Naštartuj vizuálny mód použitím v a presuň kurozr pred "first".
+
+ 3. Napíš y pre vystrihnutie (copy) označeného textu.
+
+ 4. Presuň kurozr na koniec ďalšieho riadku: j$
+
+ 5. Napíš p pre vložnie (paste) textu. Potom napíš: a druha <ESC>.
+
+ 6. Použi vizuálny mód pre označenie "položka.", vystrihni to
+ použitím y, presuň sa na koniec nasledujúceho riadku použitím j$
+ a vlož sem text použitím p.
+
+---> a) toto je prvá položka
+---> b)
+
+POZNÁMKA: Môžeš použiť tiež y ako operátor; yw vystrihne jedno slovo.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcia 6.5: NASTAVENIE MOŽNOSTÍ
+
+
+** Nastav možnosti, takže vyhľadávanie alebo nahradzovanie ignoruje
+ rozlišovanie **
+
+
+ 1. Vyhľadaj reťazec 'ignore' napísaním:
+ /ignore <ENTER>
+ Zopakuj vyhľadávanie niekoľko krát stlačením klávesy n .
+
+ 2. Nastav možnosť 'ic' (Ignore case) napísaním príkazu:
+ :set ic
+
+ 3. Teraz vyhľadaj reťazec 'ingore' znova stlačením klávesy n
+ Poznámka, že teraz sú vyhľadané aj Ignore a IGNORE.
+
+ 4. Nastav možnosťi 'hlsearch' a 'incsearch':
+ :set hls is
+
+ 5. Teraz spusti vyhľadávací príkaz znovu, a pozri čo sa stalo:
+ /ignore <ENTER>
+
+ 6. Pre opetovné zapnutie rozlyšovania veľkých a malých písmen
+ napíš: :set noic
+
+POZNÁMKA: Na odstránenie zvýraznenia výrazov napíš: :nohlsearch
+POZNÁMKA: Ak chceš nerozlyšovať veľkosť písmen len pre jedno
+ použitie vyhľadávacieho príkazu, použi \c: /ignore\c <ENTER>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 6 ZHRNUTIE
+
+
+ 1. Napíš o pre otvorenie riadku pod kurzorom a štart vkladacieho módu.
+ Napíš O pre otvorenie riadku nad kurzorom.
+
+ 2. Napíš a pre vkladanie textu ZA kurzor.
+ Napíš A pre vkladanie textu za koncom riadku.
+
+ 3. Príkaz e presunie kurozr na koniec slova
+
+ 4. Operátor y vystrihne (skopíruje) text, p ho vloží.
+
+ 5. Napísanie veľkého R prepne do nahradzovacieho módu, kým nieje
+ stlačené <ESC>.
+
+ 6. Napísanie ":set xxx" nastaví možnosť "xxx". Niektoré nastavenia sú:
+ 'ic' 'ignorecase' ignoruje veľké a malé písmená počas vyhľadávania.
+ 'is' 'incsearch' zobrazuje čiastočné reťazce vyhľadávaného reťazca.
+ 'hls' 'hlsearch' vyznačí všetky vyhľadávané reťazce.
+ Môžeš použiť hociktorý z dlhých a krátkych názvov možností.
+
+ 7. Vlož "no" pred nastavenie pre jeho vypnutie: :set noic
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 7.1: ZÍSKANIE NÁPOVEDY
+
+
+ ** Používaj on-line systém nápovedy **
+
+ Vim má obsiahly on-line systém nápovedy. Pre odštartovanie, vyskúšaj jeden
+ z týchto troch:
+ - stlač klávesu <HELP> (ak nejakú máš)
+ - stlač klávesu <F1> (ak nejakú máš)
+ - napíš :help <ENTER>
+
+ Čítaj text v okne nápovedy pre získanie predstavy ako nápoveda funguje.
+ Napíš CTRL-W CTRL-W pre skok z jedného okna do druhého.
+ Napíš :q <ENTER> čím zatvoríš okno nápovedy.
+
+ Môžeš nájsť help ku hociakej téme pridaním argumentu ku príkazu ":help".
+ Vyskúšaj tieto (nezabudni stlačiť <ENTER>):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKCIA 7.2: VYTVORENIE ŠTARTOVACIEHO SKRIPTU
+
+ ** Zapni funkcie editora Vim **
+
+ Vim má omnoho viac funkcii než Vi, ale večšina z nich je implicitne
+ vypnutá. Pre používanie viac Vim funkcii vytvor "vimrc" súbor.
+
+ 1. Začni editovať "vimrc" súbor, to závisí na použitom systéme:
+ :e ~/.vimrc pre Unix
+ :e ~/_vimrc pre MS-Windows
+
+ 2. Teraz si prečítaj text príkladu "vimrc" súboru:
+
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Ulož súbor:
+ :w
+
+ Pri nasledujúcom štarte editora Vim sa použije zvýrazňovanie syntaxe.
+ Do "vimrc" súboru môžeš pridať všetky svoje uprednostňované nastavenia.
+ Pre viac informácii napíš :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ LEKCIA 7.3 DOKONČENIE
+
+ ** Dokonči príkaz na príkazovom riadku použitím CTRL-D a <TAB> **
+
+ 1. Uisti sa, že Vim nieje v kompatibilnom móde: :set nocp
+
+ 2. Pozri sa aké súbory sa nachádzajú v adresári: :!ls alebo :!dir
+
+ 3. Napíš začiatok príkazu: :e
+
+ 4. Stlač CTRL-D a Vim zobrazí zoznam príkazov začínajúcich "e".
+
+ 5. Stlač <TAB> a Vim dokončí meno príkazu na ":edit".
+
+ 6. Teraz pridaj medzerník a začiatok mena existujúceho súboru:
+ :edit FIL
+
+ 7. Stlač <TAB>. Vim dokončí meno (ak je jedinečné).
+
+POZNÁMKA: Dokončovanie funguje pre veľa príkazov. Vyskúšaj stlačenie
+ CTRL-D a <TAB>. Špeciálne je to užitočné pre príkaz :help.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ LEKCIA 7 ZHRNUTIE
+
+ 1. Napíš :help alebo stlač <F1> alebo <Help> pre otvorenie okna nápovedy.
+
+ 2. Napíš :help príkaz pre vyhľadanie nápovedy ku príkazu príkaz.
+
+ 3. Napíš CTRL-W CTRL-W na preskočenie do iného okna.
+
+ 4. Napíš :q pre zatvorenie okna nápovedy
+
+ 5. Vytvor štartovací skript vimrc pre udržanie uprednostňovaných nastavení.
+
+ 6. Počas písania príkazu : stlač CTRL-D pre zobrazenie dokončení.
+ Stlač <TAB> pre použitie jedného z dokončení.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
+
+ Toto vymedzuje výuku Vimu. Toto je určené pre strucný prehľad o editore
+ Vim, úplne postačujúce pre ľahké a obstojné používanie tohto editora.
+ Táto výuka je ďaleko od kompletnosti, pretože Vim má omnoho viacej príkazov.
+ Ako ďalšie si prečítaj užívatľský manuál: ":help user-manual".
+
+ Pre ďalšie čítanie a štúdium je odporúčaná kniha:
+ Vim - Vi Improved - od Steve Oualline
+ Vydavateľ: New Riders
+ Prvá kniha určená pre Vim. Špeciálne vhodná pre začiatočníkov.
+ Obsahuje množstvo príkladov a obrázkov.
+ Pozri na https://iccf-holland.org/click5.html
+
+ Táto kniha je staršia a je viac o Vi ako o Vim, ale je tiež odporúčaná:
+ Learning the Vi Editor - od Linda Lamb
+ Vydavateľ: O'Reilly & Associates Inc.
+ Je to dobrá kniha pre získanie vedomostí o práci s editorom Vi.
+ Šieste vydanie obsahuje tiež informácie o editore Vim.
+
+ Táto výuka bola napísaná autormi Michael C. Pierce a Robert K. Ware,
+ Colorado School of Mines s použitím myšlienok dodanými od Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Modifikované pre Vim od Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Preklad do Slovenčiny: Ľuboš Čelko
+ e-mail: celbos@inmail.sk
+ Last Change: 2006 Apr 18
+ encoding: iso8859-2
diff --git a/runtime/tutor/tutor.sr.cp1250 b/runtime/tutor/tutor.sr.cp1250
new file mode 100644
index 0000000..c4d0064
--- /dev/null
+++ b/runtime/tutor/tutor.sr.cp1250
@@ -0,0 +1,971 @@
+===============================================================================
+= D o b r o d o l i u VIM p r i r u n i k - Verzija 1.7 =
+===============================================================================
+
+ Vim je moan editor sa mnogo komandi, suvie da bismo ih ovde sve
+ opisali. Prirunik je zamiljen da opie dovoljno komandi da biste
+ mogli lagodno da koristite Vim kao editor opte namene.
+
+ Priblino vreme potrebno za uspean zavretak prirunika je izmeu
+ 25 i 30 minuta, u zavisnosti od vremena potroenog na vebu.
+
+ UPOZORENJE:
+ Komande u lekcijama e menjati tekst. Iskopirajte ovaj fajl i
+ vebajte na kopiji (ako ste pokrenuli "vimtutor" ovo je ve kopija).
+
+ Vano je upamtiti da je ovaj prirunik zamiljen za aktivnu vebu.
+ To znai da morate upotrebljavati komande o kojima itate da biste
+ ih nauili. Ako samo itate tekst, zaboraviete komande!
+
+ Ako je Caps Lock ukljuen ISKLJUITE ga. Pritisnite taster j dovoljno
+ puta da lekcija 1.1 cela stane na ekran.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.1: POMERANJE KURSORA
+
+
+ ** Za pomeranje kursora, pritiskajte tastere h,j,k,l kako je prikazano **
+ ^
+ k Savet: h je s leve strane i pomera kursor u levo.
+ < h l > l je s desne strane i pomera kursor u desno.
+ j j izgleda kao strelica nanie.
+ v
+ 1. Pomerajte kursor po ekranu dok se ne naviknete na komande.
+
+ 2. Pritisnite taster (j) dok ne pone da se ponavlja.
+ Sada znate kako da doete do naredne lekcije.
+
+ 3. Koristei taster j preite na lekciju 1.2.
+
+NAPOMENA: Ako niste sigurni ta ste zapravo pritisnuli, pritisnite <ESC>
+ za prelazak u Normal mod i pokuajte ponovo.
+
+NAPOMENA: Strelice takoe pomeraju kursor, ali korienje tastera hjkl je
+ znatno bre, kad se jednom naviknete na njih. Zaista!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.2: IZLAZAK IZ VIM-a
+
+
+ !! UPOZORENJE: Pre izvoenja bilo kog koraka, proitajte celu lekciju!!
+
+ 1. Pritisnite <ESC> (editor je sada u Normal modu).
+
+ 2. Otkucajte: :q! <ENTER>.
+ Ovime se izlazi iz editora, sa GUBITKOM svih izmena.
+
+ 3. Kada se pojavi komandni prompt, unesite komandu koja je pokrenula
+ ovaj prirunik: vimtutor <ENTER>
+
+ 4. Ako ste upamtili ove korake, izvrite ih redom od 1 do 3 da biste
+ izali iz editora i ponovo ga pokrenuli.
+
+NAPOMENA: :q! <ENTER> ponitava sve izmene koje ste napravili.
+ U narednim lekcijama nauiete kako da sauvate izmene.
+
+ 5. Pomerite kursor na lekciju 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.3: IZMENA TEKSTA - BRISANJE
+
+
+ ** Pritisnite x za brisanje znaka pod kursorom. **
+
+ 1. Pomerite kursor na red oznaen sa --->.
+
+ 2. Da biste ispravili greke, pomerajte kursor dok se
+ ne nae na slovu koje treba izbrisati.
+
+ 3. Pritisnite taster x da izbriete neeljeno slovo.
+
+ 4. Ponavljajte korake od 2 do 4 dok ne ispravite sve greke.
+
+---> RRRibaa riibi grizzze rrreepp.
+
+ 5. Kad ispravite red, preite na lekciju 1.4.
+
+NAPOMENA: Dok koristite prirunik, nemojte uiti komande napamet,
+ ve vebajte njihovu primenu.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.4: IZMENA TEKSTA - UBACIVANJE
+
+
+ ** Pritisnite i za ubacivanje teksta ispred kursora. **
+
+ 1. Pomerite kursor na prvi sledei red oznaen sa --->.
+
+ 2. Da biste tekst prvog reda izjednaili s tekstom drugog, namestite
+ kursor na prvi znak POSLE kog ete ubaciti potreban tekst.
+
+ 3. Pritisnite i pa unesite potrebne dopune.
+
+ 4. Po ispravci svake greke pritisnite <ESC> da se vratite u Normal mod.
+ Ponovite korake od 2 do 4 da biste ispravili celu reenicu.
+
+---> Do teka neoje v red.
+---> Deo teksta nedostaje iz ovog reda.
+
+ 5. Preite na sledeu lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.5: IZMENA TEKSTA - DODAVANJE
+
+
+ ** Pritisnite A za dodavanje teksta. **
+
+ 1. Pomerite kursor na prvi sledei red oznaen sa --->.
+ Nije vano gde se nalazi kursor u tom redu.
+
+ 2. Pritisnite A i unesite dodatni tekst.
+
+ 3. Poto ste dodali tekst, pritisnite <ESC> za povratak u
+ Normal mod.
+
+ 4. Pomerite kursor na drugi red oznaen sa ---> i ponavljajte
+ korake 2 i 3 dok ne ispravite tekst.
+
+---> Deo teksta nedostaje u
+ Deo teksta nedostaje u ovom redu.
+---> Deo teksta nedostaje
+ Deo teksta nedostaje i ovde.
+
+ 5. Preite na lekciju 1.6.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.6: IZMENA FAJLA
+
+
+ ** Upotrebite :wq za snimanje teksta i izlazak iz editora. **
+
+ !! UPOZORENJE: Pre izvoenja bilo kog koraka, proitajte celu lekciju!!
+
+ 1. Izaite iz editora kao u lekciji 1.2: :q!
+
+ 2. Na komandnom promptu unesite sledeu komandu: vim tutor <ENTER>
+ 'vim' je komanda za pokretanja Vim editora, 'tutor' je ime fajla koji
+ elite da menjate. Koristite fajl koji imate pravo da menjate.
+
+ 3. Ubacujte i briite tekst kao u prethodnim lekcijama.
+
+ 4. Snimite izmenjeni tekst i izaite iz Vim-a: :wq <ENTER>
+
+ 5. Ponovo pokrenite vimtutor i proitajte rezime koji sledi.
+
+ 6. Poto proitate korake iznad i u potpunosti ih razumete:
+ izvrite ih.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 1
+
+
+ 1. Kursor se pomera strelicama ili pomou tastera hjkl .
+ h (levo) j (dole) k (gore) l (desno)
+
+ 2. Za pokretanje Vim-a iz shell-a: vim IME_FAJLA <ENTER>
+
+ 3. Izlaz: <ESC> :q! <ENTER> sve promene su izgubljene.
+ ILI: <ESC> :wq <ENTER> promene su sauvane.
+
+ 4. Brisanje znaka na kome se nalazi kursor: x
+
+ 5. Ubacivanja ili dodavanje teksta:
+ i unesite tekst <ESC> unos ispred kursora
+ A unesite tekst <ESC> dodavanje na kraju reda
+
+NAPOMENA: Pritiskom na <ESC> prebacujete Vim u Normal mod i
+ prekidate neeljenu ili delimino izvrenu komandu.
+
+Nastavite sa lekcijom 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.1: NAREDBE BRISANJA
+
+
+ ** Otkucajte dw za brisanje rei. **
+
+ 1. Pritisnite <ESC> da biste bili sigurni da ste u Normal modu.
+
+ 2. Pomerite kursor na red oznaen sa --->.
+
+ 3. Pomerite kursor na poetak rei koju treba izbrisati.
+
+ 4. Otkucajte dw da biste uklonili re.
+
+NAPOMENA: Slovo d e se pojaviti na dnu ekrana kad ga otkucate. Vim eka
+ da otkucate w . Ako je prikazano neko drugo slovo, pogreili ste u
+ kucanju; pritisnite <ESC> i pokuajte ponovo. (Ako se ne pojavi
+ nita, moda je iskljuena opcija 'showcmd': vidi lekciju 6.5.)
+
+---> Neke rei smeno ne pripadaju na papir ovoj reenici.
+
+ 5. Ponavljajte korake 3 i 4 dok ne ispravite reenicu, pa
+ preite na lekciju 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.2: JO BRISANJA
+
+
+ ** Otkucajte d$ za brisanje znakova do kraja reda. **
+
+ 1. Pritisnite <ESC> da biste bili sigurni da ste u Normal modu.
+
+ 2. Pomerite kursor na red oznaen sa --->.
+
+ 3. Pomerite kursor do kraja ispravnog dela reenice
+ (POSLE prve . ).
+
+ 4. Otkucajte d$ za brisanje ostatka reda.
+
+---> Neko je uneo kraj ovog reda dvaput. kraj ovog reda dvaput.
+
+ 5. Preite na lekciju 2.3 za podrobnije objanjenje.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.3: O OPERATORIMA I POKRETIMA
+
+
+ Mnoge komande za izmenu teksta sastoje se od operatora i pokreta.
+ Oblik komande brisanja sa d operatorom je sledei:
+
+ d pokret
+
+ Pri emu je:
+ d - operator brisanja.
+ pokret - ono na emu e se operacija izvravati (opisano u nastavku).
+
+ Kratak spisak pokreta:
+ w - sve do poetka sledee rei, NE UKLJUUJUI prvo slovo.
+ e - sve do kraja tekue rei, UKLJUUJUI poslednje slovo.
+ $ - sve do kraje reda, UKLJUUJUI poslednje slovo.
+
+ Kucanjem de brisae se tekst od kursora do kraja rei.
+
+NAPOMENA: Pritiskom samo na taster pokreta dok ste u Normal modu, bez
+ operatora, kursor se pomera kao to je opisano.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.4: KORIENJE BROJANJA ZA POKRETE
+
+
+ ** Unoenjem nekog broja pre pokreta, pokret se izvrava taj broj puta. **
+
+ 1. Pomerite kursor na red oznaen sa --->.
+
+ 2. Otkucajte 2w da pomerite kursor dve rei napred.
+
+ 3. Otkucajte 3e da pomerite kursor na kraj tree rei napred.
+
+ 4. Otkucajte 0 (nulu) da pomerite kursor na poetak reda.
+
+ 5. Ponovite korake 2 i 3 s nekim drugim brojevima.
+
+---> Reenica sa reima po kojoj moete pomerati kursor.
+
+ 6. Preite na lekciju 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.5: KORIENJE BROJANJA ZA VEE BRISANJE
+
+
+ ** Unoenje nekog broja s operatorom ponavlja operator taj broj puta. **
+
+ U kombinaciji operatora brisanja s pokretima spomenutim iznad
+ moete uneti broj pre pokreta da biste izbrisali vie znakova:
+
+ d broj pokret
+
+ 1. Pomerite kursor na prvo slovo u rei s VELIKIM SLOVIMA u redu
+ oznaenom sa --->.
+
+ 2. Otkucajte d2w da izbriete dve rei sa VELIKIM SLOVIMA
+
+ 3. Ponovite korake 1 i 2 sa razliitim brojevima da izbriete
+ uzastopne rei sa VELIKIM SLOVIMA korienjem samo jedne komande.
+
+---> ovaj ABC DE red FGHI JK LMN OP s reima je RS TUVZ ispravljen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.6: OPERACIJE NAD REDOVIMA
+
+
+ ** Otkucajte dd za brisanje celog reda. **
+
+ Zbog uestalosti brisanja celih redova, autori Vi-ja odluili su da
+ je lake brisati redove ako se otkuca d dvaput.
+
+ 1. Pomerite kursor na drugi red u donjoj strofi.
+ 2. Otkucajte dd da ga izbriete.
+ 3. Pomerite kursor na etvrti red.
+ 4. Otkucajte 2dd da biste izbrisali dva reda.
+
+---> 1) Sedlo mi je od marame,
+---> 2) blato na sve strane,
+---> 3) uzda od kanapa,
+---> 4) auto mi je ovde,
+---> 5) satovi pokazuju vreme,
+---> 6) a bi mi je od oina
+---> 7) prebijena tapa.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.7: PONITAVANJE PROMENA
+
+
+ ** Pritisnite u za ponitavanje poslednje komande, U za ceo red. **
+
+ 1. Pomerite kursor na red oznaen sa ---> i postavite ga na mesto
+ prve greke.
+ 2. Otkucajte x da izbriete prvi neeljeni znak.
+ 3. Otkucajte u da ponitite poslednju izvrenu komandu.
+ 4. Sad ispravite sve greke u redu koristei komandu x .
+ 5. Otkucajte veliko U da biste vratili sadraj reda u prvobitno
+ stanje.
+ 6. Onda otkucajte u nekoliko puta da biste ponitili U
+ i prethodne komande.
+ 7. Sad otkucajte CTRL-R (drei CTRL dok pritiskate R)
+ nekoliko puta da biste vratili izmene (ponitili ponitavanja).
+
+---> Iiisspravite greke uu ovvom redu ii poonititeee ih.
+
+ 8. Ovo su veoma korisne komande. Preite na rezime lekcije 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 2
+
+
+ 1. Brisanje od kursora do sledee rei: dw
+ 2. Brisanje od kursora do kraja reda: d$
+ 3. Brisanje celog reda: dd
+
+ 4. Za ponavljanje pokreta prethodno unesite broj: 2w
+ 5. Oblik komande za izmenu:
+ operator [broj] pokret
+ gde je:
+ operator - ta uraditi, recimo d za brisanje
+ [broj] - neobavezan broj ponavljanja pokreta
+ pokret - kretanje po tekstu na kome se radi,
+ kao to je: w (re), $ (kraj reda), itd.
+
+ 6. Pomeranje kursora na poetak reda: 0
+
+ 7. Za ponitavanje prethodnih izmena, pritisnite: u (malo u)
+ Za ponitavanje svih promena u redu, pritisnite: U (veliko U)
+ Za vraanja promena, otkucajte: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.1: KOMANDA POSTAVLJANJA
+
+
+ ** Otkucajte p da postavite prethodno izbrisan tekst iza kursora. **
+
+ 1. Pomerite kursor na prvi sledei red oznaen sa --->.
+
+ 2. Otkucajte dd da izbriete red i smestite ga u Vim registar.
+
+ 3. Pomerite kursor na red c), IZNAD mesta gde treba postaviti izbrisan red.
+
+ 4. Otkucajte p da postavite red ispod kursora.
+
+ 5. Ponavljajte korake 2 do 4 da biste postavili sve linije u pravilnom
+ redosledu.
+
+---> d) prebijena tapa.
+---> b) uzda od kanapa,
+---> c) a bi mi je od oina
+---> a) Sedlo mi je od marame,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.2: KOMANDA ZAMENE
+
+
+ ** Otkucajte rx da zamenite znak ispod kursora slovom x . **
+
+ 1. Pomerite kursor na prvi sledei red oznaen sa --->.
+
+ 2. Pomerite kursor tako da se nalazi na prvoj greci.
+
+ 3. Otkucajte r i onda znak koji treba da tu stoji.
+
+ 4. Ponavljajte korake 2 i 3 sve dok prvi red ne bude
+ isti kao drugi.
+
+---> Kedi ju ovej red ugaen, nako je protresao pustane testere!
+---> Kada je ovaj red unoen, neko je pritiskao pogrene tastere!
+
+ 5. Preite na lekciju 3.2.
+
+NAPOMENA: Setite se da treba da uite vebanjem, ne pamenjem.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.3: OPERATOR IZMENE
+
+
+ ** Za izmenu teksta do kraja rei, otkucajte ce .**
+
+ 1. Pomerite kursor na prvi sledei red oznaen sa --->.
+
+ 2. Postavite kursor na a u rakdur.
+
+ 3. Otkucajte ce i ispravite re (u ovom sluaju otkucajte ed ).
+
+ 4. Pritisnite <ESC> i pomerite kursor na sledei znak koji
+ treba ispraviti.
+
+ 5. Ponavljajte korake 3 i 4 sve dok prva reenica ne bude ista
+ kao druga.
+
+---> Ovaj rakdur ima nekoliko rejga koje treflja isprpikati operagrom izmene.
+---> Ovaj red ima nekoliko rei koje treba ispraviti operatorom izmene.
+
+Uoite da ce brie re i postavlja editor u Insert mod.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.4: DALJE IZMENE UPOTREBOM c
+
+
+ ** Komanda izmene se koristi sa istim pokretima kao i brisanje. **
+
+ 1. Operator izmene se koristi na isti nain kao i operator brisanja:
+
+ c [broj] pokret
+
+ 2. Pokreti su isti, recimo: w (re) i $ (kraj reda).
+
+ 3. Pomerite kursor na prvi sledei red oznaen sa --->.
+
+ 4. Pomerite kursor na prvu greku.
+
+ 5. Otkucajte c$ i unesite ostatak reda tako da bude isti kao
+ drugi red, pa pritisnite <ESC>.
+
+---> Kraj ovog reda treba izmeniti tako da izgleda kao red ispod.
+---> Kraj ovog reda treba ispraviti korienjem c$ komande.
+
+NAPOMENA: Za ispravljanje greaka moete koristiti Backspace .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 3
+
+
+ 1. Za postavljanje teksta koji ste upravo izbrisali, pritisnite p . Ovo
+ postavlja tekst IZA kursora (ako je bio izbrisan jedan ili vie redova
+ sadraj e doi na red ispod kursora).
+
+ 2. Za zamenu znaka na kome se nalazi kursor, pritisnite r i onda
+ eljeni znak.
+
+ 3. Operator izmene dozvoljava promenu teksta od kursora do pozicije gde
+ se zavrava pokret. Primera radi, kucajte ce za izmenu od kursora do
+ kraja rei, ili c$ za izmenu od kursora do kraja reda.
+
+ 4. Oblik operacije izmene je:
+
+ c [broj] pokret
+
+Preite na narednu lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.1: POZICIJA KURSORA I STATUS FAJLA
+
+ ** Pritisnite CTRL-G za prikaz pozicije kursora u tekstu i status fajla.
+ Pritisnite G za pomeranje kursora na neki red u tekstu. **
+
+NAPOMENA: Proitajte celu lekciju pre izvoenja bilo kog koraka!!
+
+ 1. Drite taster CTRL i pritisnite g . Ovo zovemo CTRL-G.
+ Editor e na dnu ekrana ispisati poruku sa imenom fajla i pozicijom
+ kursora u tekstu. Zapamtite broj reda za 3. korak.
+
+NAPOMENA: U donjem desnom uglu moe se videti poziciju kursora ako je
+ ukljuena opcija 'ruler' (vidi :help ruler ili lekciju 6.5.)
+
+ 2. Pritisnite G za pomeranje kursora na kraj teksta.
+ Pritisnite 1G ili gg za pomranje kursora na poetak teksta.
+
+ 3. Otkucajte broj reda na kome ste malopre bili i onda G . Kursor
+ e se vratiti na red na kome je bio kad ste otkucali CTRL-G.
+
+ 4. Ako ste spremni, izvrite korake od 1 do 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.2: KOMANDE PRETRAIVANJA
+
+ ** Otkucajte / i onda izraz koji elite da potraite. **
+
+ 1. U Normal modu otkucajte znak / . Primietite da se znak pojavio
+ zajedno sa kursorom na dnu ekrana kao i kod komande : .
+
+ 2. Sada otkucajte 'grrreka' <ENTER>. (Bez razmaka i navodnika.)
+ To je re koju traite.
+
+ 3. Za ponovno traenje istog izraza, otkucajte n .
+ Za traenje istog izraza u suprotnom smeru, otkucajte N .
+
+ 4. Za traenje izraza unatrag, koristite ? umesto / .
+
+ 5. Za povratak na prethodnu poziciju otkucajte CTRL-O (drite CTRL dok
+ pritiskate O ). Ponavljajte za ranije pozicije. CTRL-I ide napred.
+
+---> "grrreka" je pogreno; umesto grrreka treba da stoji greka.
+
+NAPOMENA: Ako pretraga doe do kraja teksta traenje e se nastaviti od
+ njegovog poetka osim ako je opcija 'wrapscan' iskljuena.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.3: TRAENJE PARA ZAGRADE
+
+
+ ** Otkucajte % za nalaenje para ), ] ili } . **
+
+ 1. Postavite kursor na bilo koju od ( , [ ili {
+ otvorenih zagrada u redu oznaenom sa --->.
+
+ 2. Otkucajte znak % .
+
+ 3. Kursor e se pomeriti na odgovarajuu zatvorenu zagradu.
+
+ 4. Otkucajte % da pomerite kursor na prvu zagradu u paru.
+
+ 5. Pomerite kursor na neku od (,),[,],{ ili } i ponovite komandu % .
+
+---> Red ( testiranja obinih ( [ uglastih ] i { vitiastih } zagrada.))
+
+
+NAPOMENA: Vrlo korisno u ispravljanju koda sa rasparenim zagradama!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.4: KOMANDA ZAMENE
+
+
+ ** Otkucajte :s/staro/novo/g da zamenite 'staro' za 'novo'. **
+
+ 1. Pomerite kursor na red oznaen sa --->.
+
+ 2. Otkucajte :s/rdi/ri/ <ENTER> . Primetite da ova komanda zamenjuje
+ samo prvo "rdi" u redu.
+
+ 3. Otkucajte :s/rdi/ri/g . Dodavanje opcije g znai da e se komanda
+ izvriti u celom redu, zamenom svih pojava niza "rdi".
+
+---> rdiba rdibi grdize rep.
+
+ 4. Za zamenu svih izraza izmeu neka dva reda,
+ otkucajte :#,#s/staro/novo/g gde su #,# krajnji brojevi redova u opsegu
+ u kome e se obaviti zamena.
+ Otkucajte :%s/staro/novo/g za zamenu svih izraza u celom tekstu.
+ Otkucajte :%s/staro/novo/gc za nalaenje svih izraza u tekstu i
+ potvrdu zamene.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 4
+
+
+ 1. CTRL-G prikazuje poziciju kursora u tekstu i status fajla.
+ G pomera kursor na kraj teksta.
+ broj G pomera kursor na navedeni red.
+ gg pomera kursor na prvi red teksta.
+
+ 2. Kucanjem / sa izrazom taj izraz se trai UNAPRED.
+ Kucanjem ? sa izrazom taj izraz se trai UNAZAD.
+ Posle komande traenja koristite n za nalaenje izraza u istom
+ smeru, a N za nalaenje u suprotnom smeru.
+ CTRL-O vraa kursor na prethodnu poziciju, a CTRL-I na narednu.
+
+ 3. Kucanjem % kad je kursor na zagradi on se pomera na njen par.
+
+ 4. Za zamenu prvog izraza staro za izraz novo :s/staro/novo/
+ Za zamenu svih izraza u celom redu :s/staro/novo/g
+ Za zamenu svih izraza u opsegu linija #,# :#,#s/staro/novo/g
+ Za zamenu u celom tekstu :%s/staro/novo/g
+ Za potvrdu svake zamene dodajte 'c' :%s/staro/novo/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.1: IZVRAVANJE SPOLJANJIH KOMANDI
+
+
+ ** Otkucajte :! pa spoljanju komandu koju elite da izvrite. **
+
+ 1. Otkucajte poznatu komandu : da biste namestili kursor na dno
+ ekrana. Time omoguavate unos komande u komandnoj liniji editora.
+
+ 2. Otkucajte znak ! (uzvinik). Ovime omoguavate
+ izvravanje bilo koje spoljanje komande.
+
+ 3. Kao primer otkucajte ls posle ! i pritisnite <ENTER>. Ovo e
+ prikazati sadraj direktorijuma, kao da ste na komandnom promptu.
+ Otkucajte :!dir ako :!ls ne radi.
+
+NAPOMENA: Na ovaj nain mogue je izvriti bilo koju spoljanju komandu,
+ zajedno sa njenim argumentima.
+
+NAPOMENA: Sve : komande se izvravaju poto pritisnete <ENTER> .
+ U daljem tekstu to neemo uvek napominjati.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.2: VIE O SNIMANJU FAJLOVA
+
+ ** Za snimanje promena, otkucajte :w IME_FAJLA . **
+
+ 1. Otkucajte :!dir ili :!ls za pregled sadraja direktorijuma.
+ Ve znate da morate pritisnuti <ENTER> posle toga.
+
+ 2. Izaberite ime fajla koji jo ne postoji, npr. TEST.
+
+ 3. Otkucajte: :w TEST (gde je TEST ime koje ste izabrali.)
+
+ 4. Time ete snimiti ceo fajl (Vim Tutor) pod imenom TEST.
+ Za proveru, otkucajte opet :!dir ili :!ls za pregled
+ sadraja direktorijuma.
+
+NAPOMENA: Ako biste napustili Vim i ponovo ga pokrenuli sa vim TEST ,
+ tekst bi bio tana kopija ovog fajla u trenutku kad ste
+ ga snimili.
+
+ 5. Izbriite fajl tako to ete otkucati (MS-DOS): :!del TEST
+ ili (Unix): :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.3: SNIMANJE OZNAENOG TEKSTA
+
+
+ ** Da biste snimili deo teksta, otkucajte v pokret :w IME_FAJLA **
+
+ 1. Pomerite kursor na ovu liniju.
+
+ 2. Pritisnite v i pomerite kursor pet redova ispod. Primetite da je
+ tekst oznaen inverzno.
+
+ 3. Pritisnite : . Na dnu ekrana pojavie se :'<,'> .
+
+ 4. Otkucajte w TEST , gde je TEST ime fajla koji jo ne postoji.
+ Proverite da zaista pie :'<,'>w TEST pre nego to pritisnete <ENTER>.
+
+ 5. Vim e snimiti oznaeni tekst u TEST. Proverite sa :!dir ili !ls .
+ Nemojte jo brisati fajl! Koristiemo ga u narednoj lekciji.
+
+NAPOMENA: Komanda v zapoinje vizuelno oznaavanje. Moete pomerati kursor
+ i tako menjati veliinu oznaenog teksta. Onda moete upotrebiti
+ operatore nad tekstom. Na primer, d e izbrisati oznaeni tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.4: UITAVANJE FAJLA U TEKST
+
+
+ ** Za ubacivanje sadraja fajla, otkucajte :r IME_FAJLA **
+
+ 1. Postavite kursor iznad ove linije.
+
+NAPOMENA: Poto izvrite 2. korak videete tekst iz lekcije 5.3. Tada
+ pomerite kursor DOLE da biste ponovo videli ovu lekciju.
+
+ 2. Uitajte fajl TEST koristei komandu :r TEST gde je TEST ime fajla
+ koje ste koristili u prethodnoj lekciji. Sadraj uitanog fajla je
+ ubaen ispod kursora.
+
+ 3. Da biste proverili da je fajl uitan, vratite kursor unazad i
+ primetite dve kopije lekcije 5.3, originalnu i onu iz fajla.
+
+NAPOMENA: Takoe moete uitati izlaz spoljanje komande. Na primer,
+ :r !ls e uitati izlaz komande ls i postaviti ga ispod
+ kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 5
+
+
+ 1. :!komanda izvrava spoljanju komandu.
+
+ Korisni primeri:
+ (MS-DOS) (Unix)
+ :!dir :!ls - pregled sadraja direktorijuma.
+ :!del FAJL :!rm FAJL - brie fajl FAJL.
+
+ 2. :w FAJL zapisuje trenutni tekst na disk pod imenom FAJL.
+
+ 3. v pokret :w IME_FAJLA snima vizuelno oznaene redove u fajl
+ IME_FAJLA.
+
+ 4. :r IME_FAJLA uitava fajl IME_FAJLA sa diska i stavlja
+ njegov sadraj ispod kursora.
+
+ 5. :r !dir uitava izlaz komande dir i postavlja ga ispod kursora.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.1: KOMANDA OTVORI
+
+
+ ** Pritisnite o da biste otvorili red ispod kursora
+ i preli u Insert mod. **
+
+ 1. Pomerite kursor na sledei red oznaen sa --->.
+
+ 2. Otkucajte malo o da biste otvorili novi red ISPOD kursora
+ i preli u Insert mod.
+
+ 3. Otkucajte neki tekst i onda pritisnite <ESC> da biste izali
+ iz Insert moda.
+
+---> Kad pritisnete o kursor prelazi u novootvoreni red u Insert modu.
+
+ 4. Za otvaranje reda IZNAD kursora, umesto malog otkucajte veliko O .
+ Isprobajte na donjem redu oznaenom sa --->.
+
+---> Otvorite red iznad ovog kucanjem velikog O dok je kursor u ovom redu.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.2: KOMANDA DODAJ
+
+
+ ** Otkucajte a za dodavanje teksta IZA kursora. **
+
+ 1. Pomerite kursor na poetak sledeeg reda oznaenog sa --->.
+
+ 2. Kucajte e dok kursor ne doe na kraj rei re .
+
+ 3. Otkucajte a (malo) da biste dodali tekst IZA kursora.
+
+ 4. Dopunite re kao to je u redu ispod. Pritisnite <ESC> za izlazak
+ iz Insert moda.
+
+ 5. Sa e preite na narednu nepotpunu re i ponovite korake 3 i 4.
+
+---> Ovaj re omoguava ve dodav teksta u nekom redu.
+---> Ovaj red omoguava vebanje dodavanja teksta u nekom redu.
+
+NAPOMENA: Komande a, i, i A aktiviraju isti Insert mod, jedina
+ razlika je u poziciji od koje e se tekst ubacivati.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.3: DRUGI NAIN ZAMENE
+
+
+ ** Otkucajte veliko R da biste zamenili vie od jednog znaka. **
+
+ 1. Pomerite kursor na prvi sledei red oznaen sa --->.
+ Pomerite kursor na poetak prvog xxx .
+
+ 2. Pritisnite R i otkucajte broj koji je red ispod,
+ tako da zameni xxx .
+
+ 3. Pritisnite <ESC> za izlazak iz Replace moda.
+ Primetite da je ostatak reda ostao nepromenjen.
+
+ 4. Ponovite korake da biste zamenili drugo xxx.
+
+---> Dodavanje 123 na xxx daje xxx.
+---> Dodavanje 123 na 456 daje 579.
+
+NAPOMENA: Replace mod je kao Insert mod, s tom razlikom to svaki
+ uneti znak brie ve postojei.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.4: KOPIRANJE I LEPLJENJE TEKSTA
+
+
+ ** Koristite operator y za kopiranje a p za lepljenje teksta. **
+
+ 1. Pomerite kursor na red sa ---> i postavite kursor posle "a)".
+
+ 2. Aktivirajte Visual mod sa v i pomerite kursor sve do ispred "prvi".
+
+ 3. Pritisnite y da biste kopirali oznaeni tekst u interni bafer.
+
+ 4. Pomerite kursor do kraja sledeeg reda: j$
+
+ 5. Pritisnite p da biste zalepili tekst. Onda otkucajte: a drugi <ESC> .
+
+ 6. Upotrebite Visual mod da oznaite " red.", kopirajte sa y , kursor
+ pomerite na kraj sledeeg reda sa j$ i tamo zalepite tekst sa p .
+
+---> a) ovo je prvi red.
+ b)
+
+NAPOMENA: takoe moete koristiti y kao operator; yw kopira jednu re.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.5: POSTAVLJANJE OPCIJA
+
+
+ ** Postavite opciju tako da traenje i zamena ignoriu veliinu slova **
+
+ 1. Potraite re 'razlika': /razlika <ENTER>
+ Ponovite nekoliko puta pritiskom na n .
+
+ 2. Aktivirajte opciju 'ic' (Ignore case): :set ic
+
+ 3. Ponovo potraite re 'razlika' pritiskom na n
+ Primetite da su sada pronaeni i RAZLIKA i Razlika.
+
+ 4. Aktivirajte opcije 'hlsearch' i 'incsearch': :set hls is
+
+ 5. Ponovo otkucajte komandu traenja i uoite razlike: /razlika <ENTER>
+
+ 6. Za deaktiviranje opcije ic kucajte: :set noic
+
+NAPOMENA: Za neoznaavanje pronaenih izraza otkucajte: :nohlsearch
+NAPOMENA: Ako elite da ne razlikujete veliinu slova u samo jednoj komandi
+ traenja, dodajte \c u izraz: /razlika\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 6
+
+ 1. Pritisnite o za otvaranje reda ISPOD kursora i prelazak u Insert mod.
+ Pritisnite O za otvaranje reda IZNAD kursora.
+
+ 2. Pritisnite a za unos teksta IZA kursora.
+ Pritisnite A za unos teksta na kraju reda.
+
+ 3. Komanda e pomera kursor na kraj rei.
+
+ 4. Operator y kopira tekst, p ga lepi.
+
+ 5. Kucanje velikog R aktivira Replace mod dok ne pritisnete <ESC> .
+
+ 6. Kucanje ":set xxx" aktivira opciju "xxx". Neke opcije su:
+ 'ic' 'ignorecase' ne razlikuje velika/mala slova pri traenju
+ 'is' 'incsearch' prikazuje pronaen tekst dok kucate izraz
+ 'hls' 'hlsearch' oznaava inverzno sve pronaene izraze
+ Moete koristite dugo ili kratko ime opcije.
+
+ 7. Ispred imena opcije stavite "no" da je deaktivirate: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.1: DOBIJANJE POMOI
+
+
+ ** Koristite on-line sistem za pomo **
+
+ Vim ima detaljan on-line sistem za pomo. Za poetak, pokuajte neto
+ od sledeeg:
+ - pritisnite taster <HELP> (ako ga imate na tastaturi)
+ - pritisnite taster <F1> (ako ga imate na tastaturi)
+ - otkucajte :help <ENTER>
+
+ Proitajte tekst u prozoru pomoi da biste nauili pomo radi.
+ Kucanjem CTRL-W CTRL-W prelazite iz jednog prozora u drugi.
+ Otkucajte :q <ENTER> da zatvorite prozor pomoi.
+
+ Pomo o praktino bilo kojoj temi moete dobiti dodavanjem argumenta
+ komandi ":help". Pokuajte ovo (ne zaboravite <ENTER> na kraju):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.2: PRAVLJENJE STARTNOG SKRIPTA
+
+
+ ** Aktivirajte mogunosti editora **
+
+ Vim ima mnogo vie mogunosti nego Vi, ali veina nije automatski
+ aktivirana. Za dodatne mogunosti napravite "vimrc" fajl.
+
+ 1. Otvorite "vimrc" fajl. Ovo zavisi od vaeg sistema:
+ :e ~/.vimrc za Unix
+ :e ~/_vimrc za MS-Windows
+
+ 2. Onda uitajte primer sadraja "vimrc" fajla:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Snimite fajl sa:
+ :w
+
+ Sledei put kada pokrenete Vim, bojenje sintakse teksta bie
+ aktivirano. Sva svoja podeavanja moete dodati u "vimrc" fajl.
+ Za vie informacija otkucajte :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.3: AUTOMATSKO DOVRAVANJE
+
+
+ ** Dovravanje komandne linije sa CTRL-D i <TAB> **
+
+ 1. Podesite Vim da ne bude u Vi-kompatibilnom modu: :set nocp
+
+ 2. Pogledajte koji fajlovi postoje u direktorijumu: :!ls ili :!dir
+
+ 3. Otkucajte poetak komande: :e
+
+ 4. Otkucajte CTRL-D i Vim e prikazati spisak komandi koje poinju sa "e".
+
+ 5. Pritisnite <TAB> i Vim e dopuniti ime komande u ":edit".
+
+ 6. Dodajte razmak i poetak imena postojeeg fajla: :edit FA
+
+ 7. Pritisnite <TAB>. Vim e dopuniti ime fajla (ako je jedinstveno).
+
+NAPOMENA: Mogue je dopuniti mnoge komande. Samo probajte CTRL-D i <TAB>.
+ Naroito je korisno za :help komande.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 7
+
+
+ 1. Otkucajte :help ili pritisnite <F1> ili <Help> za pomo.
+
+ 2. Otkucajte :help komanda biste dobili pomo za tu komandu.
+
+ 3. Otkucajte CTRL-W CTRL-W za prelazak u drugi prozor.
+
+ 4. Otkucajte :q da zatvorite prozor pomoi.
+
+ 5. Napravite vimrc startni skript za aktiviranje podeavanja koja
+ vam odgovaraju.
+
+ 6. Dok kucate neku od : komandi, pritisnite CTRL-D da biste videli mogue
+ vrednosti. Pritisnite <TAB> da odaberete jednu od njih.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ovim je prirunik zavren. Njegov cilj je bio kratak pregled Vim editora,
+ koliko da omogui njegovo relativno jednostavno korienje. Prirunik nije
+ potpun, jer Vim ima mnogo vie komandi. Kao sledee, proitajte prirunik:
+ ":help user-manual".
+
+ Za dalje itanje i uenje, preporuujemo knjigu:
+ Vim - Vi Improved - by Steve Oualline
+ Izdava: New Riders
+ Prva knjiga potpuno posveena Vim-u. Naroito korisna za poetnike.
+ Ima mnotvo primera i slika.
+ Vidite https://iccf-holland.org/click5.html
+
+ Sledea knjiga je starija i vie govori o Vi-u nego o Vim-u, ali je takoe
+ preporuujemo:
+ Learning the Vi Editor - by Linda Lamb
+ Izdava: O'Reilly & Associates Inc.
+ Dobra knjiga iz koje moete saznati skoro sve to moete raditi u Vi-ju.
+ esto izdanje ima i informacija o Vim-u.
+
+ Ovaj prirunik su napisali: Michael C. Pierce i Robert K. Ware,
+ Colorado School of Mines koristei ideje Charlesa Smitha,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Prilagoavanje za Vim uradio je Bram Moolenaar.
+
+ Prevod na srpski: Ivan Nejgebauer <ian@uns.ac.rs>
+ Verzija 1.0, maj/juni 2014.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.sr.utf-8 b/runtime/tutor/tutor.sr.utf-8
new file mode 100644
index 0000000..5bad848
--- /dev/null
+++ b/runtime/tutor/tutor.sr.utf-8
@@ -0,0 +1,971 @@
+===============================================================================
+= D o b r o d o š l i u VIM p r i r u č n i k - Verzija 1.7 =
+===============================================================================
+
+ Vim je moćan editor sa mnogo komandi, suviše da bismo ih ovde sve
+ opisali. Priručnik je zamišljen da opiše dovoljno komandi da biste
+ mogli lagodno da koristite Vim kao editor opšte namene.
+
+ Približno vreme potrebno za uspešan završetak priručnika je između
+ 25 i 30 minuta, u zavisnosti od vremena potrošenog na vežbu.
+
+ UPOZORENJE:
+ Komande u lekcijama će menjati tekst. Iskopirajte ovaj fajl i
+ vežbajte na kopiji (ako ste pokrenuli "vimtutor" ovo je već kopija).
+
+ Važno je upamtiti da je ovaj priručnik zamišljen za aktivnu vežbu.
+ To znači da morate upotrebljavati komande o kojima čitate da biste
+ ih naučili. Ako samo čitate tekst, zaboravićete komande!
+
+ Ako je Caps Lock uključen ISKLJUČITE ga. Pritisnite taster j dovoljno
+ puta da lekcija 1.1 cela stane na ekran.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.1: POMERANJE KURSORA
+
+
+ ** Za pomeranje kursora, pritiskajte tastere h,j,k,l kako je prikazano **
+ ^
+ k Savet: h je s leve strane i pomera kursor u levo.
+ < h l > l je s desne strane i pomera kursor u desno.
+ j j izgleda kao strelica naniže.
+ v
+ 1. Pomerajte kursor po ekranu dok se ne naviknete na komande.
+
+ 2. Pritisnite taster (j) dok ne počne da se ponavlja.
+ Sada znate kako da dođete do naredne lekcije.
+
+ 3. Koristeći taster j pređite na lekciju 1.2.
+
+NAPOMENA: Ako niste sigurni šta ste zapravo pritisnuli, pritisnite <ESC>
+ za prelazak u Normal mod i pokušajte ponovo.
+
+NAPOMENA: Strelice takođe pomeraju kursor, ali korišćenje tastera hjkl je
+ znatno brže, kad se jednom naviknete na njih. Zaista!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.2: IZLAZAK IZ VIM-a
+
+
+ !! UPOZORENJE: Pre izvođenja bilo kog koraka, pročitajte celu lekciju!!
+
+ 1. Pritisnite <ESC> (editor je sada u Normal modu).
+
+ 2. Otkucajte: :q! <ENTER>.
+ Ovime se izlazi iz editora, sa GUBITKOM svih izmena.
+
+ 3. Kada se pojavi komandni prompt, unesite komandu koja je pokrenula
+ ovaj priručnik: vimtutor <ENTER>
+
+ 4. Ako ste upamtili ove korake, izvršite ih redom od 1 do 3 da biste
+ izašli iz editora i ponovo ga pokrenuli.
+
+NAPOMENA: :q! <ENTER> poništava sve izmene koje ste napravili.
+ U narednim lekcijama naučićete kako da sačuvate izmene.
+
+ 5. Pomerite kursor na lekciju 1.3.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.3: IZMENA TEKSTA - BRISANJE
+
+
+ ** Pritisnite x za brisanje znaka pod kursorom. **
+
+ 1. Pomerite kursor na red označen sa --->.
+
+ 2. Da biste ispravili greške, pomerajte kursor dok se
+ ne nađe na slovu koje treba izbrisati.
+
+ 3. Pritisnite taster x da izbrišete neželjeno slovo.
+
+ 4. Ponavljajte korake od 2 do 4 dok ne ispravite sve greške.
+
+---> RRRibaa riibi grizzze rrreepp.
+
+ 5. Kad ispravite red, pređite na lekciju 1.4.
+
+NAPOMENA: Dok koristite priručnik, nemojte učiti komande napamet,
+ već vežbajte njihovu primenu.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.4: IZMENA TEKSTA - UBACIVANJE
+
+
+ ** Pritisnite i za ubacivanje teksta ispred kursora. **
+
+ 1. Pomerite kursor na prvi sledeći red označen sa --->.
+
+ 2. Da biste tekst prvog reda izjednačili s tekstom drugog, namestite
+ kursor na prvi znak POSLE kog ćete ubaciti potreban tekst.
+
+ 3. Pritisnite i pa unesite potrebne dopune.
+
+ 4. Po ispravci svake greške pritisnite <ESC> da se vratite u Normal mod.
+ Ponovite korake od 2 do 4 da biste ispravili celu rečenicu.
+
+---> Do teka neoje v red.
+---> Deo teksta nedostaje iz ovog reda.
+
+ 5. Pređite na sledeću lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.5: IZMENA TEKSTA - DODAVANJE
+
+
+ ** Pritisnite A za dodavanje teksta. **
+
+ 1. Pomerite kursor na prvi sledeći red označen sa --->.
+ Nije važno gde se nalazi kursor u tom redu.
+
+ 2. Pritisnite A i unesite dodatni tekst.
+
+ 3. Pošto ste dodali tekst, pritisnite <ESC> za povratak u
+ Normal mod.
+
+ 4. Pomerite kursor na drugi red označen sa ---> i ponavljajte
+ korake 2 i 3 dok ne ispravite tekst.
+
+---> Deo teksta nedostaje u
+ Deo teksta nedostaje u ovom redu.
+---> Deo teksta nedostaje
+ Deo teksta nedostaje i ovde.
+
+ 5. Pređite na lekciju 1.6.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 1.6: IZMENA FAJLA
+
+
+ ** Upotrebite :wq za snimanje teksta i izlazak iz editora. **
+
+ !! UPOZORENJE: Pre izvođenja bilo kog koraka, pročitajte celu lekciju!!
+
+ 1. Izađite iz editora kao u lekciji 1.2: :q!
+
+ 2. Na komandnom promptu unesite sledeću komandu: vim tutor <ENTER>
+ 'vim' je komanda za pokretanja Vim editora, 'tutor' je ime fajla koji
+ želite da menjate. Koristite fajl koji imate pravo da menjate.
+
+ 3. Ubacujte i brišite tekst kao u prethodnim lekcijama.
+
+ 4. Snimite izmenjeni tekst i izađite iz Vim-a: :wq <ENTER>
+
+ 5. Ponovo pokrenite vimtutor i pročitajte rezime koji sledi.
+
+ 6. Pošto pročitate korake iznad i u potpunosti ih razumete:
+ izvršite ih.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 1
+
+
+ 1. Kursor se pomera strelicama ili pomoću tastera hjkl .
+ h (levo) j (dole) k (gore) l (desno)
+
+ 2. Za pokretanje Vim-a iz shell-a: vim IME_FAJLA <ENTER>
+
+ 3. Izlaz: <ESC> :q! <ENTER> sve promene su izgubljene.
+ ILI: <ESC> :wq <ENTER> promene su sačuvane.
+
+ 4. Brisanje znaka na kome se nalazi kursor: x
+
+ 5. Ubacivanja ili dodavanje teksta:
+ i unesite tekst <ESC> unos ispred kursora
+ A unesite tekst <ESC> dodavanje na kraju reda
+
+NAPOMENA: Pritiskom na <ESC> prebacujete Vim u Normal mod i
+ prekidate neželjenu ili delimično izvršenu komandu.
+
+Nastavite sa lekcijom 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.1: NAREDBE BRISANJA
+
+
+ ** Otkucajte dw za brisanje reči. **
+
+ 1. Pritisnite <ESC> da biste bili sigurni da ste u Normal modu.
+
+ 2. Pomerite kursor na red označen sa --->.
+
+ 3. Pomerite kursor na početak reči koju treba izbrisati.
+
+ 4. Otkucajte dw da biste uklonili reč.
+
+NAPOMENA: Slovo d će se pojaviti na dnu ekrana kad ga otkucate. Vim čeka
+ da otkucate w . Ako je prikazano neko drugo slovo, pogrešili ste u
+ kucanju; pritisnite <ESC> i pokušajte ponovo. (Ako se ne pojavi
+ ništa, možda je isključena opcija 'showcmd': vidi lekciju 6.5.)
+
+---> Neke reči smešno ne pripadaju na papir ovoj rečenici.
+
+ 5. Ponavljajte korake 3 i 4 dok ne ispravite rečenicu, pa
+ pređite na lekciju 2.2.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.2: JOŠ BRISANJA
+
+
+ ** Otkucajte d$ za brisanje znakova do kraja reda. **
+
+ 1. Pritisnite <ESC> da biste bili sigurni da ste u Normal modu.
+
+ 2. Pomerite kursor na red označen sa --->.
+
+ 3. Pomerite kursor do kraja ispravnog dela rečenice
+ (POSLE prve . ).
+
+ 4. Otkucajte d$ za brisanje ostatka reda.
+
+---> Neko je uneo kraj ovog reda dvaput. kraj ovog reda dvaput.
+
+ 5. Pređite na lekciju 2.3 za podrobnije objašnjenje.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.3: O OPERATORIMA I POKRETIMA
+
+
+ Mnoge komande za izmenu teksta sastoje se od operatora i pokreta.
+ Oblik komande brisanja sa d operatorom je sledeći:
+
+ d pokret
+
+ Pri čemu je:
+ d - operator brisanja.
+ pokret - ono na čemu će se operacija izvršavati (opisano u nastavku).
+
+ Kratak spisak pokreta:
+ w - sve do početka sledeće reči, NE UKLJUČUJUĆI prvo slovo.
+ e - sve do kraja tekuće reči, UKLJUČUJUĆI poslednje slovo.
+ $ - sve do kraje reda, UKLJUČUJUĆI poslednje slovo.
+
+ Kucanjem de brisaće se tekst od kursora do kraja reči.
+
+NAPOMENA: Pritiskom samo na taster pokreta dok ste u Normal modu, bez
+ operatora, kursor se pomera kao što je opisano.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.4: KORIŠĆENJE BROJANJA ZA POKRETE
+
+
+ ** Unošenjem nekog broja pre pokreta, pokret se izvršava taj broj puta. **
+
+ 1. Pomerite kursor na red označen sa --->.
+
+ 2. Otkucajte 2w da pomerite kursor dve reči napred.
+
+ 3. Otkucajte 3e da pomerite kursor na kraj treće reči napred.
+
+ 4. Otkucajte 0 (nulu) da pomerite kursor na početak reda.
+
+ 5. Ponovite korake 2 i 3 s nekim drugim brojevima.
+
+---> Rečenica sa rečima po kojoj možete pomerati kursor.
+
+ 6. Pređite na lekciju 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.5: KORIŠĆENJE BROJANJA ZA VEĆE BRISANJE
+
+
+ ** Unošenje nekog broja s operatorom ponavlja operator taj broj puta. **
+
+ U kombinaciji operatora brisanja s pokretima spomenutim iznad
+ možete uneti broj pre pokreta da biste izbrisali više znakova:
+
+ d broj pokret
+
+ 1. Pomerite kursor na prvo slovo u reči s VELIKIM SLOVIMA u redu
+ označenom sa --->.
+
+ 2. Otkucajte d2w da izbrišete dve reči sa VELIKIM SLOVIMA
+
+ 3. Ponovite korake 1 i 2 sa različitim brojevima da izbrišete
+ uzastopne reči sa VELIKIM SLOVIMA korišćenjem samo jedne komande.
+
+---> ovaj ABCČĆ DĐE red FGHI JK LMN OP s rečima je RSŠ TUVZŽ ispravljen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.6: OPERACIJE NAD REDOVIMA
+
+
+ ** Otkucajte dd za brisanje celog reda. **
+
+ Zbog učestalosti brisanja celih redova, autori Vi-ja odlučili su da
+ je lakše brisati redove ako se otkuca d dvaput.
+
+ 1. Pomerite kursor na drugi red u donjoj strofi.
+ 2. Otkucajte dd da ga izbrišete.
+ 3. Pomerite kursor na četvrti red.
+ 4. Otkucajte 2dd da biste izbrisali dva reda.
+
+---> 1) Sedlo mi je od marame,
+---> 2) blato na sve strane,
+---> 3) uzda od kanapa,
+---> 4) auto mi je ovde,
+---> 5) satovi pokazuju vreme,
+---> 6) a bič mi je od očina
+---> 7) prebijena štapa.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 2.7: PONIŠTAVANJE PROMENA
+
+
+ ** Pritisnite u za poništavanje poslednje komande, U za ceo red. **
+
+ 1. Pomerite kursor na red označen sa ---> i postavite ga na mesto
+ prve greške.
+ 2. Otkucajte x da izbrišete prvi neželjeni znak.
+ 3. Otkucajte u da poništite poslednju izvršenu komandu.
+ 4. Sad ispravite sve greške u redu koristeći komandu x .
+ 5. Otkucajte veliko U da biste vratili sadržaj reda u prvobitno
+ stanje.
+ 6. Onda otkucajte u nekoliko puta da biste poništili U
+ i prethodne komande.
+ 7. Sad otkucajte CTRL-R (držeći CTRL dok pritiskate R)
+ nekoliko puta da biste vratili izmene (poništili poništavanja).
+
+---> Iiisspravite greške uu ovvom redu ii pooništiteee ih.
+
+ 8. Ovo su veoma korisne komande. Pređite na rezime lekcije 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 2
+
+
+ 1. Brisanje od kursora do sledeće reči: dw
+ 2. Brisanje od kursora do kraja reda: d$
+ 3. Brisanje celog reda: dd
+
+ 4. Za ponavljanje pokreta prethodno unesite broj: 2w
+ 5. Oblik komande za izmenu:
+ operator [broj] pokret
+ gde je:
+ operator - šta uraditi, recimo d za brisanje
+ [broj] - neobavezan broj ponavljanja pokreta
+ pokret - kretanje po tekstu na kome se radi,
+ kao što je: w (reč), $ (kraj reda), itd.
+
+ 6. Pomeranje kursora na početak reda: 0
+
+ 7. Za poništavanje prethodnih izmena, pritisnite: u (malo u)
+ Za poništavanje svih promena u redu, pritisnite: U (veliko U)
+ Za vraćanja promena, otkucajte: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.1: KOMANDA POSTAVLJANJA
+
+
+ ** Otkucajte p da postavite prethodno izbrisan tekst iza kursora. **
+
+ 1. Pomerite kursor na prvi sledeći red označen sa --->.
+
+ 2. Otkucajte dd da izbrišete red i smestite ga u Vim registar.
+
+ 3. Pomerite kursor na red c), IZNAD mesta gde treba postaviti izbrisan red.
+
+ 4. Otkucajte p da postavite red ispod kursora.
+
+ 5. Ponavljajte korake 2 do 4 da biste postavili sve linije u pravilnom
+ redosledu.
+
+---> d) prebijena štapa.
+---> b) uzda od kanapa,
+---> c) a bič mi je od očina
+---> a) Sedlo mi je od marame,
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.2: KOMANDA ZAMENE
+
+
+ ** Otkucajte rx da zamenite znak ispod kursora slovom x . **
+
+ 1. Pomerite kursor na prvi sledeći red označen sa --->.
+
+ 2. Pomerite kursor tako da se nalazi na prvoj grešci.
+
+ 3. Otkucajte r i onda znak koji treba da tu stoji.
+
+ 4. Ponavljajte korake 2 i 3 sve dok prvi red ne bude
+ isti kao drugi.
+
+---> Kedi ju ovej red ugašen, nako je protresao pustašne testere!
+---> Kada je ovaj red unošen, neko je pritiskao pogrešne tastere!
+
+ 5. Pređite na lekciju 3.2.
+
+NAPOMENA: Setite se da treba da učite vežbanjem, ne pamćenjem.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.3: OPERATOR IZMENE
+
+
+ ** Za izmenu teksta do kraja reči, otkucajte ce .**
+
+ 1. Pomerite kursor na prvi sledeći red označen sa --->.
+
+ 2. Postavite kursor na a u rakdur.
+
+ 3. Otkucajte ce i ispravite reč (u ovom slučaju otkucajte ed ).
+
+ 4. Pritisnite <ESC> i pomerite kursor na sledeći znak koji
+ treba ispraviti.
+
+ 5. Ponavljajte korake 3 i 4 sve dok prva rečenica ne bude ista
+ kao druga.
+
+---> Ovaj rakdur ima nekoliko rejga koje treflja isprpikati operagrom izmene.
+---> Ovaj red ima nekoliko reči koje treba ispraviti operatorom izmene.
+
+Uočite da ce briše reč i postavlja editor u Insert mod.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 3.4: DALJE IZMENE UPOTREBOM c
+
+
+ ** Komanda izmene se koristi sa istim pokretima kao i brisanje. **
+
+ 1. Operator izmene se koristi na isti način kao i operator brisanja:
+
+ c [broj] pokret
+
+ 2. Pokreti su isti, recimo: w (reč) i $ (kraj reda).
+
+ 3. Pomerite kursor na prvi sledeći red označen sa --->.
+
+ 4. Pomerite kursor na prvu grešku.
+
+ 5. Otkucajte c$ i unesite ostatak reda tako da bude isti kao
+ drugi red, pa pritisnite <ESC>.
+
+---> Kraj ovog reda treba izmeniti tako da izgleda kao red ispod.
+---> Kraj ovog reda treba ispraviti korišćenjem c$ komande.
+
+NAPOMENA: Za ispravljanje grešaka možete koristiti Backspace .
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 3
+
+
+ 1. Za postavljanje teksta koji ste upravo izbrisali, pritisnite p . Ovo
+ postavlja tekst IZA kursora (ako je bio izbrisan jedan ili više redova
+ sadržaj će doći na red ispod kursora).
+
+ 2. Za zamenu znaka na kome se nalazi kursor, pritisnite r i onda
+ željeni znak.
+
+ 3. Operator izmene dozvoljava promenu teksta od kursora do pozicije gde
+ se završava pokret. Primera radi, kucajte ce za izmenu od kursora do
+ kraja reči, ili c$ za izmenu od kursora do kraja reda.
+
+ 4. Oblik operacije izmene je:
+
+ c [broj] pokret
+
+Pređite na narednu lekciju.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.1: POZICIJA KURSORA I STATUS FAJLA
+
+ ** Pritisnite CTRL-G za prikaz pozicije kursora u tekstu i status fajla.
+ Pritisnite G za pomeranje kursora na neki red u tekstu. **
+
+NAPOMENA: Pročitajte celu lekciju pre izvođenja bilo kog koraka!!
+
+ 1. Držite taster CTRL i pritisnite g . Ovo zovemo CTRL-G.
+ Editor će na dnu ekrana ispisati poruku sa imenom fajla i pozicijom
+ kursora u tekstu. Zapamtite broj reda za 3. korak.
+
+NAPOMENA: U donjem desnom uglu može se videti poziciju kursora ako je
+ uključena opcija 'ruler' (vidi :help ruler ili lekciju 6.5.)
+
+ 2. Pritisnite G za pomeranje kursora na kraj teksta.
+ Pritisnite 1G ili gg za pomranje kursora na početak teksta.
+
+ 3. Otkucajte broj reda na kome ste malopre bili i onda G . Kursor
+ će se vratiti na red na kome je bio kad ste otkucali CTRL-G.
+
+ 4. Ako ste spremni, izvršite korake od 1 do 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.2: KOMANDE PRETRAŽIVANJA
+
+ ** Otkucajte / i onda izraz koji želite da potražite. **
+
+ 1. U Normal modu otkucajte znak / . Primietite da se znak pojavio
+ zajedno sa kursorom na dnu ekrana kao i kod komande : .
+
+ 2. Sada otkucajte 'grrreška' <ENTER>. (Bez razmaka i navodnika.)
+ To je reč koju tražite.
+
+ 3. Za ponovno traženje istog izraza, otkucajte n .
+ Za traženje istog izraza u suprotnom smeru, otkucajte N .
+
+ 4. Za traženje izraza unatrag, koristite ? umesto / .
+
+ 5. Za povratak na prethodnu poziciju otkucajte CTRL-O (držite CTRL dok
+ pritiskate O ). Ponavljajte za ranije pozicije. CTRL-I ide napred.
+
+---> "grrreška" je pogrešno; umesto grrreška treba da stoji greška.
+
+NAPOMENA: Ako pretraga dođe do kraja teksta traženje će se nastaviti od
+ njegovog početka osim ako je opcija 'wrapscan' isključena.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.3: TRAŽENJE PARA ZAGRADE
+
+
+ ** Otkucajte % za nalaženje para ), ] ili } . **
+
+ 1. Postavite kursor na bilo koju od ( , [ ili {
+ otvorenih zagrada u redu označenom sa --->.
+
+ 2. Otkucajte znak % .
+
+ 3. Kursor će se pomeriti na odgovarajuću zatvorenu zagradu.
+
+ 4. Otkucajte % da pomerite kursor na prvu zagradu u paru.
+
+ 5. Pomerite kursor na neku od (,),[,],{ ili } i ponovite komandu % .
+
+---> Red ( testiranja običnih ( [ uglastih ] i { vitičastih } zagrada.))
+
+
+NAPOMENA: Vrlo korisno u ispravljanju koda sa rasparenim zagradama!
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 4.4: KOMANDA ZAMENE
+
+
+ ** Otkucajte :s/staro/novo/g da zamenite 'staro' za 'novo'. **
+
+ 1. Pomerite kursor na red označen sa --->.
+
+ 2. Otkucajte :s/rdi/ri/ <ENTER> . Primetite da ova komanda zamenjuje
+ samo prvo "rdi" u redu.
+
+ 3. Otkucajte :s/rdi/ri/g . Dodavanje opcije g znači da će se komanda
+ izvršiti u celom redu, zamenom svih pojava niza "rdi".
+
+---> rdiba rdibi grdize rep.
+
+ 4. Za zamenu svih izraza između neka dva reda,
+ otkucajte :#,#s/staro/novo/g gde su #,# krajnji brojevi redova u opsegu
+ u kome će se obaviti zamena.
+ Otkucajte :%s/staro/novo/g za zamenu svih izraza u celom tekstu.
+ Otkucajte :%s/staro/novo/gc za nalaženje svih izraza u tekstu i
+ potvrdu zamene.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 4
+
+
+ 1. CTRL-G prikazuje poziciju kursora u tekstu i status fajla.
+ G pomera kursor na kraj teksta.
+ broj G pomera kursor na navedeni red.
+ gg pomera kursor na prvi red teksta.
+
+ 2. Kucanjem / sa izrazom taj izraz se traži UNAPRED.
+ Kucanjem ? sa izrazom taj izraz se traži UNAZAD.
+ Posle komande traženja koristite n za nalaženje izraza u istom
+ smeru, a N za nalaženje u suprotnom smeru.
+ CTRL-O vraća kursor na prethodnu poziciju, a CTRL-I na narednu.
+
+ 3. Kucanjem % kad je kursor na zagradi on se pomera na njen par.
+
+ 4. Za zamenu prvog izraza staro za izraz novo :s/staro/novo/
+ Za zamenu svih izraza u celom redu :s/staro/novo/g
+ Za zamenu svih izraza u opsegu linija #,# :#,#s/staro/novo/g
+ Za zamenu u celom tekstu :%s/staro/novo/g
+ Za potvrdu svake zamene dodajte 'c' :%s/staro/novo/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.1: IZVRŠAVANJE SPOLJAŠNJIH KOMANDI
+
+
+ ** Otkucajte :! pa spoljašnju komandu koju želite da izvršite. **
+
+ 1. Otkucajte poznatu komandu : da biste namestili kursor na dno
+ ekrana. Time omogućavate unos komande u komandnoj liniji editora.
+
+ 2. Otkucajte znak ! (uzvičnik). Ovime omogućavate
+ izvršavanje bilo koje spoljašnje komande.
+
+ 3. Kao primer otkucajte ls posle ! i pritisnite <ENTER>. Ovo će
+ prikazati sadržaj direktorijuma, kao da ste na komandnom promptu.
+ Otkucajte :!dir ako :!ls ne radi.
+
+NAPOMENA: Na ovaj način moguće je izvršiti bilo koju spoljašnju komandu,
+ zajedno sa njenim argumentima.
+
+NAPOMENA: Sve : komande se izvršavaju pošto pritisnete <ENTER> .
+ U daljem tekstu to nećemo uvek napominjati.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.2: VIŠE O SNIMANJU FAJLOVA
+
+ ** Za snimanje promena, otkucajte :w IME_FAJLA . **
+
+ 1. Otkucajte :!dir ili :!ls za pregled sadržaja direktorijuma.
+ Već znate da morate pritisnuti <ENTER> posle toga.
+
+ 2. Izaberite ime fajla koji još ne postoji, npr. TEST.
+
+ 3. Otkucajte: :w TEST (gde je TEST ime koje ste izabrali.)
+
+ 4. Time ćete snimiti ceo fajl (Vim Tutor) pod imenom TEST.
+ Za proveru, otkucajte opet :!dir ili :!ls za pregled
+ sadržaja direktorijuma.
+
+NAPOMENA: Ako biste napustili Vim i ponovo ga pokrenuli sa vim TEST ,
+ tekst bi bio tačna kopija ovog fajla u trenutku kad ste
+ ga snimili.
+
+ 5. Izbrišite fajl tako što ćete otkucati (MS-DOS): :!del TEST
+ ili (Unix): :!rm TEST
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.3: SNIMANJE OZNAČENOG TEKSTA
+
+
+ ** Da biste snimili deo teksta, otkucajte v pokret :w IME_FAJLA **
+
+ 1. Pomerite kursor na ovu liniju.
+
+ 2. Pritisnite v i pomerite kursor pet redova ispod. Primetite da je
+ tekst označen inverzno.
+
+ 3. Pritisnite : . Na dnu ekrana pojaviće se :'<,'> .
+
+ 4. Otkucajte w TEST , gde je TEST ime fajla koji još ne postoji.
+ Proverite da zaista piše :'<,'>w TEST pre nego što pritisnete <ENTER>.
+
+ 5. Vim će snimiti označeni tekst u TEST. Proverite sa :!dir ili !ls .
+ Nemojte još brisati fajl! Koristićemo ga u narednoj lekciji.
+
+NAPOMENA: Komanda v započinje vizuelno označavanje. Možete pomerati kursor
+ i tako menjati veličinu označenog teksta. Onda možete upotrebiti
+ operatore nad tekstom. Na primer, d će izbrisati označeni tekst.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 5.4: UČITAVANJE FAJLA U TEKST
+
+
+ ** Za ubacivanje sadržaja fajla, otkucajte :r IME_FAJLA **
+
+ 1. Postavite kursor iznad ove linije.
+
+NAPOMENA: Pošto izvršite 2. korak videćete tekst iz lekcije 5.3. Tada
+ pomerite kursor DOLE da biste ponovo videli ovu lekciju.
+
+ 2. Učitajte fajl TEST koristeći komandu :r TEST gde je TEST ime fajla
+ koje ste koristili u prethodnoj lekciji. Sadržaj učitanog fajla je
+ ubačen ispod kursora.
+
+ 3. Da biste proverili da je fajl učitan, vratite kursor unazad i
+ primetite dve kopije lekcije 5.3, originalnu i onu iz fajla.
+
+NAPOMENA: Takođe možete učitati izlaz spoljašnje komande. Na primer,
+ :r !ls će učitati izlaz komande ls i postaviti ga ispod
+ kursora.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 5
+
+
+ 1. :!komanda izvršava spoljašnju komandu.
+
+ Korisni primeri:
+ (MS-DOS) (Unix)
+ :!dir :!ls - pregled sadržaja direktorijuma.
+ :!del FAJL :!rm FAJL - briše fajl FAJL.
+
+ 2. :w FAJL zapisuje trenutni tekst na disk pod imenom FAJL.
+
+ 3. v pokret :w IME_FAJLA snima vizuelno označene redove u fajl
+ IME_FAJLA.
+
+ 4. :r IME_FAJLA učitava fajl IME_FAJLA sa diska i stavlja
+ njegov sadržaj ispod kursora.
+
+ 5. :r !dir učitava izlaz komande dir i postavlja ga ispod kursora.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.1: KOMANDA OTVORI
+
+
+ ** Pritisnite o da biste otvorili red ispod kursora
+ i prešli u Insert mod. **
+
+ 1. Pomerite kursor na sledeći red označen sa --->.
+
+ 2. Otkucajte malo o da biste otvorili novi red ISPOD kursora
+ i prešli u Insert mod.
+
+ 3. Otkucajte neki tekst i onda pritisnite <ESC> da biste izašli
+ iz Insert moda.
+
+---> Kad pritisnete o kursor prelazi u novootvoreni red u Insert modu.
+
+ 4. Za otvaranje reda IZNAD kursora, umesto malog otkucajte veliko O .
+ Isprobajte na donjem redu označenom sa --->.
+
+---> Otvorite red iznad ovog kucanjem velikog O dok je kursor u ovom redu.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.2: KOMANDA DODAJ
+
+
+ ** Otkucajte a za dodavanje teksta IZA kursora. **
+
+ 1. Pomerite kursor na početak sledećeg reda označenog sa --->.
+
+ 2. Kucajte e dok kursor ne dođe na kraj reči re .
+
+ 3. Otkucajte a (malo) da biste dodali tekst IZA kursora.
+
+ 4. Dopunite reč kao što je u redu ispod. Pritisnite <ESC> za izlazak
+ iz Insert moda.
+
+ 5. Sa e pređite na narednu nepotpunu reč i ponovite korake 3 i 4.
+
+---> Ovaj re omogućava ve dodav teksta u nekom redu.
+---> Ovaj red omogućava vežbanje dodavanja teksta u nekom redu.
+
+NAPOMENA: Komande a, i, i A aktiviraju isti Insert mod, jedina
+ razlika je u poziciji od koje će se tekst ubacivati.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.3: DRUGI NAČIN ZAMENE
+
+
+ ** Otkucajte veliko R da biste zamenili više od jednog znaka. **
+
+ 1. Pomerite kursor na prvi sledeći red označen sa --->.
+ Pomerite kursor na početak prvog xxx .
+
+ 2. Pritisnite R i otkucajte broj koji je red ispod,
+ tako da zameni xxx .
+
+ 3. Pritisnite <ESC> za izlazak iz Replace moda.
+ Primetite da je ostatak reda ostao nepromenjen.
+
+ 4. Ponovite korake da biste zamenili drugo xxx.
+
+---> Dodavanje 123 na xxx daje xxx.
+---> Dodavanje 123 na 456 daje 579.
+
+NAPOMENA: Replace mod je kao Insert mod, s tom razlikom što svaki
+ uneti znak briše već postojeći.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.4: KOPIRANJE I LEPLJENJE TEKSTA
+
+
+ ** Koristite operator y za kopiranje a p za lepljenje teksta. **
+
+ 1. Pomerite kursor na red sa ---> i postavite kursor posle "a)".
+
+ 2. Aktivirajte Visual mod sa v i pomerite kursor sve do ispred "prvi".
+
+ 3. Pritisnite y da biste kopirali označeni tekst u interni bafer.
+
+ 4. Pomerite kursor do kraja sledećeg reda: j$
+
+ 5. Pritisnite p da biste zalepili tekst. Onda otkucajte: a drugi <ESC> .
+
+ 6. Upotrebite Visual mod da označite " red.", kopirajte sa y , kursor
+ pomerite na kraj sledećeg reda sa j$ i tamo zalepite tekst sa p .
+
+---> a) ovo je prvi red.
+ b)
+
+NAPOMENA: takođe možete koristiti y kao operator; yw kopira jednu reč.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 6.5: POSTAVLJANJE OPCIJA
+
+
+ ** Postavite opciju tako da traženje i zamena ignorišu veličinu slova **
+
+ 1. Potražite reč 'razlika': /razlika <ENTER>
+ Ponovite nekoliko puta pritiskom na n .
+
+ 2. Aktivirajte opciju 'ic' (Ignore case): :set ic
+
+ 3. Ponovo potražite reč 'razlika' pritiskom na n
+ Primetite da su sada pronađeni i RAZLIKA i Razlika.
+
+ 4. Aktivirajte opcije 'hlsearch' i 'incsearch': :set hls is
+
+ 5. Ponovo otkucajte komandu traženja i uočite razlike: /razlika <ENTER>
+
+ 6. Za deaktiviranje opcije ic kucajte: :set noic
+
+NAPOMENA: Za neoznačavanje pronađenih izraza otkucajte: :nohlsearch
+NAPOMENA: Ako želite da ne razlikujete veličinu slova u samo jednoj komandi
+ traženja, dodajte \c u izraz: /razlika\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 6
+
+ 1. Pritisnite o za otvaranje reda ISPOD kursora i prelazak u Insert mod.
+ Pritisnite O za otvaranje reda IZNAD kursora.
+
+ 2. Pritisnite a za unos teksta IZA kursora.
+ Pritisnite A za unos teksta na kraju reda.
+
+ 3. Komanda e pomera kursor na kraj reči.
+
+ 4. Operator y kopira tekst, p ga lepi.
+
+ 5. Kucanje velikog R aktivira Replace mod dok ne pritisnete <ESC> .
+
+ 6. Kucanje ":set xxx" aktivira opciju "xxx". Neke opcije su:
+ 'ic' 'ignorecase' ne razlikuje velika/mala slova pri traženju
+ 'is' 'incsearch' prikazuje pronađen tekst dok kucate izraz
+ 'hls' 'hlsearch' označava inverzno sve pronađene izraze
+ Možete koristite dugo ili kratko ime opcije.
+
+ 7. Ispred imena opcije stavite "no" da je deaktivirate: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.1: DOBIJANJE POMOĆI
+
+
+ ** Koristite on-line sistem za pomoć **
+
+ Vim ima detaljan on-line sistem za pomoć. Za početak, pokušajte nešto
+ od sledećeg:
+ - pritisnite taster <HELP> (ako ga imate na tastaturi)
+ - pritisnite taster <F1> (ako ga imate na tastaturi)
+ - otkucajte :help <ENTER>
+
+ Pročitajte tekst u prozoru pomoći da biste naučili pomoć radi.
+ Kucanjem CTRL-W CTRL-W prelazite iz jednog prozora u drugi.
+ Otkucajte :q <ENTER> da zatvorite prozor pomoći.
+
+ Pomoć o praktično bilo kojoj temi možete dobiti dodavanjem argumenta
+ komandi ":help". Pokušajte ovo (ne zaboravite <ENTER> na kraju):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.2: PRAVLJENJE STARTNOG SKRIPTA
+
+
+ ** Aktivirajte mogućnosti editora **
+
+ Vim ima mnogo više mogućnosti nego Vi, ali većina nije automatski
+ aktivirana. Za dodatne mogućnosti napravite "vimrc" fajl.
+
+ 1. Otvorite "vimrc" fajl. Ovo zavisi od vašeg sistema:
+ :e ~/.vimrc za Unix
+ :e ~/_vimrc za MS-Windows
+
+ 2. Onda učitajte primer sadržaja "vimrc" fajla:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Snimite fajl sa:
+ :w
+
+ Sledeći put kada pokrenete Vim, bojenje sintakse teksta biće
+ aktivirano. Sva svoja podešavanja možete dodati u "vimrc" fajl.
+ Za više informacija otkucajte :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lekcija 7.3: AUTOMATSKO DOVRŠAVANJE
+
+
+ ** Dovršavanje komandne linije sa CTRL-D i <TAB> **
+
+ 1. Podesite Vim da ne bude u Vi-kompatibilnom modu: :set nocp
+
+ 2. Pogledajte koji fajlovi postoje u direktorijumu: :!ls ili :!dir
+
+ 3. Otkucajte početak komande: :e
+
+ 4. Otkucajte CTRL-D i Vim će prikazati spisak komandi koje počinju sa "e".
+
+ 5. Pritisnite <TAB> i Vim će dopuniti ime komande u ":edit".
+
+ 6. Dodajte razmak i početak imena postojećeg fajla: :edit FA
+
+ 7. Pritisnite <TAB>. Vim će dopuniti ime fajla (ako je jedinstveno).
+
+NAPOMENA: Moguće je dopuniti mnoge komande. Samo probajte CTRL-D i <TAB>.
+ Naročito je korisno za :help komande.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ REZIME lekcije 7
+
+
+ 1. Otkucajte :help ili pritisnite <F1> ili <Help> za pomoć.
+
+ 2. Otkucajte :help komanda biste dobili pomoć za tu komandu.
+
+ 3. Otkucajte CTRL-W CTRL-W za prelazak u drugi prozor.
+
+ 4. Otkucajte :q da zatvorite prozor pomoći.
+
+ 5. Napravite vimrc startni skript za aktiviranje podešavanja koja
+ vam odgovaraju.
+
+ 6. Dok kucate neku od : komandi, pritisnite CTRL-D da biste videli moguće
+ vrednosti. Pritisnite <TAB> da odaberete jednu od njih.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ovim je priručnik završen. Njegov cilj je bio kratak pregled Vim editora,
+ koliko da omogući njegovo relativno jednostavno korišćenje. Priručnik nije
+ potpun, jer Vim ima mnogo više komandi. Kao sledeće, pročitajte priručnik:
+ ":help user-manual".
+
+ Za dalje čitanje i učenje, preporučujemo knjigu:
+ Vim - Vi Improved - by Steve Oualline
+ Izdavač: New Riders
+ Prva knjiga potpuno posvećena Vim-u. Naročito korisna za početnike.
+ Ima mnoštvo primera i slika.
+ Vidite https://iccf-holland.org/click5.html
+
+ Sledeća knjiga je starija i više govori o Vi-u nego o Vim-u, ali je takođe
+ preporučujemo:
+ Learning the Vi Editor - by Linda Lamb
+ Izdavač: O'Reilly & Associates Inc.
+ Dobra knjiga iz koje možete saznati skoro sve što možete raditi u Vi-ju.
+ Šesto izdanje ima i informacija o Vim-u.
+
+ Ovaj priručnik su napisali: Michael C. Pierce i Robert K. Ware,
+ Colorado School of Mines koristeći ideje Charlesa Smitha,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Prilagođavanje za Vim uradio je Bram Moolenaar.
+
+ Prevod na srpski: Ivan Nejgebauer <ian@uns.ac.rs>
+ Verzija 1.0, maj/juni 2014.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.sv b/runtime/tutor/tutor.sv
new file mode 100644
index 0000000..42836a8
--- /dev/null
+++ b/runtime/tutor/tutor.sv
@@ -0,0 +1,830 @@
+===============================================================================
+= V l k o m m e n t i l l h a n d l e d n i n g e n i V i m - Ver. 1.5 =
+===============================================================================
+
+ Vim r en vldigt kraftfull redigerare som har mnga kommandon, alltfr
+ mnga att frklara i en handledning som denna. Den hr handledningen r
+ gjord fr att frklara tillrckligt mnga kommandon s att du enkelt ska
+ kunna anvnda Vim som en redigerare fr alla ndaml.
+
+ Den berknade tiden fr att slutfra denna handledning r 25-30 minuter,
+ beroende p hur mycket tid som lggs ned p experimentering.
+
+ Kommandona i lektionerna kommer att modifiera texten. Gr en kopia av den
+ hr filen att va p (om du startade "vimtutor r det hr redan en kopia).
+
+ Det r viktigt att komma ihg att den hr handledningen r konstruerad
+ att lra vid anvndning. Det betyder att du mste kra kommandona fr att
+ lra dig dem ordentligt. Om du bara lser texten s kommer du att glmma
+ kommandona!
+
+ Frskra dig nu om att din Caps-Lock tangent INTE r aktiv och tryck p
+ j-tangenten tillrckligt mnga gnger fr att frflytta markren s att
+ Lektion 1.1 fyller skrmen helt.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.1: FLYTTA MARKREN
+
+
+ ** Fr att flytta markren, tryck p tangenterna h,j,k,l som indikerat. **
+ ^
+ k Tips:
+ < h l > h-tangenten r till vnster och flyttar till vnster.
+ j l-tangenten r till hger och flyttar till hger.
+ v j-tangenten ser ut som en pil ned.
+ 1. Flytta runt markren p skrmen tills du knner dig bekvm.
+
+ 2. Hll ned tangenten pil ned (j) tills att den repeterar.
+---> Nu vet du hur du tar dig till nsta lektion.
+
+ 3. Flytta till Lektion 1.2, med hjlp av ned tangenten.
+
+Notera: Om du r osker p ngonting du skrev, tryck <ESC> fr att placera dig
+ dig i Normal-lge. Skriv sedan om kommandot.
+
+Notera: Piltangenterna borde ocks fungera. Men om du anvnder hjkl s kommer
+ du att kunna flytta omkring mycket snabbare, nr du vl vant dig vid
+ det.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.2: STARTA OCH AVSLUTA VIM
+
+
+ !! NOTERA: Innan du utfr ngon av punkterna nedan, ls hela lektionen!!
+
+ 1. Tryck <ESC>-tangenten (fr att se till att du r i Normal-lge).
+
+ 2. Skriv: :q! <ENTER>.
+
+---> Detta avslutar redigeraren UTAN att spara ngra ndringar du gjort.
+ Om du vill spara ndringarna och avsluta skriv:
+ :wq <ENTER>
+
+ 3. Nr du ser skal-prompten, skriv kommandot som tog dig in i den hr
+ handledningen. Det kan vara: vimtutor <ENTER>
+ Normalt vill du anvnda: vim tutor <ENTER>
+
+---> 'vim' betyder ppna redigeraren vim, 'tutor' r filen du vill redigera.
+
+ 4. Om du har memorerat dessa steg och knner dig sjlvsker, kr d stegen
+ 1 till 3 fr att avsluta och starta om redigeraren. Flytta sedan ned
+ markren till Lektion 1.3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.3: TEXT REDIGERING - BORTTAGNING
+
+
+** Nr du r i Normal-lge tryck x fr att ta bort tecknet under markren. **
+
+ 1. Flytta markren till raden nedan med markeringen --->.
+
+ 2. Fr att rtta felen, flytta markren tills den str p tecknet som ska
+ tas bort. fix the errors, move the cursor until it is on top of the
+
+ 3. Tryck p x-tangenten fr att ta bort det felaktiga tecknet.
+
+ 4. Upprepa steg 2 till 4 tills meningen r korrekt.
+
+---> Kkon hoppadee vverr mnen.
+
+ 5. Nu nr raden r korrekt, g till Lektion 1.4.
+
+NOTERA: Nr du gr igenom den hr handledningen, frsk inte att memorera, lr
+ genom anvndning.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.4: TEXT REDIGERING - INFOGNING
+
+
+ ** Nr du r i Normal-lge tryck i fr att infoga text. **
+
+ 1. Flytta markren till den frsta raden nedan med markeringen --->.
+
+ 2. Fr att gra den frsta raden likadan som den andra, flytta markren till
+ det frsta tecknet EFTER dr text ska infogas.
+
+ 3. Tryck i och skriv in det som saknas.
+
+ 4. Nr du rttat ett fel tryck <ESC> fr att terg till Normal-lge.
+ Upprepa steg 2 till 4 fr att rtta meningen.
+
+---> Det sakns hr .
+---> Det saknas lite text frn den hr raden.
+
+ 5. Nr du knner dig bekvm med att infoga text, g till sammanfattningen
+ nedan.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 1 SAMMANFATTNING
+
+
+ 1. Markren flyttas genom att anvnda piltangenterna eller hjkl-tangenterna.
+ h (vnster) j (ned) k (upp) l (hger)
+
+ 2. Fr att starta Vim (frn %-prompten) skriv: vim FILNAMN <ENTER>
+
+ 3. Fr att avsluta Vim skriv: <ESC> :q! <ENTER> fr att kasta ndringar.
+ ELLER skriv: <ESC> :wq <ENTER> fr att spara ndringar.
+
+ 4. Fr att ta bort tecknet under markren i Normal-lge skriv: x
+
+ 5. Fr att infoga text vid markren i Normal-lge skriv:
+ i skriv in text <ESC>
+
+NOTERA: Genom att trycka <ESC> kommer du att placeras i Normal-lge eller
+ avbryta ett delvis frdigskrivet kommando.
+
+Fortstt nu med Lektion 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.1: BORTTAGNINGSKOMMANDON
+
+
+ ** Skriv dw fr att radera till slutet av ett ord. **
+
+ 1. Tryck <ESC> fr att frskra dig om att du r i Normal-lge.
+
+ 2. Flytta markren till raden nedan markerad --->.
+
+ 3. Flytta markren till brjan av ett ord som mste raderas.
+
+ 4. Skriv dw fr att radera ordet.
+
+ NOTERA: Bokstverna dw kommer att synas p den sista raden p skrmen nr
+ du skriver dem. Om du skrev ngot fel, tryck <ESC> och brja om.
+
+---> Det r ett ngra ord roliga att som inte hr hemma i den hr meningen.
+
+ 5. Upprepa stegen 3 och 4 tills meningen r korrekt och g till Lektion 2.2.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.2: FLER BORTTAGNINGSKOMMANDON
+
+
+ ** Skriv d$ fr att radera till slutet p raden. **
+
+ 1. Tryck <ESC> fr att frskra dig om att du r i Normal-lge.
+
+ 2. Flytta markren till raden nedan markerad --->.
+
+ 3. Flytta markren till slutet p den rtta raden (EFTER den frsta . ).
+
+ 4. Skriv d$ fr att radera till slutet p raden.
+
+---> Ngon skrev slutet p den hr raden tv gnger. den hr raden tv gnger.
+
+
+ 5. G vidare till Lektion 2.3 fr att frst vad det r som hnder.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.3: KOMMANDON OCH OBJEKT
+
+
+ Syntaxen fr d raderingskommandot r fljande:
+
+ [nummer] d objekt ELLER d [nummer] objekt
+ Var:
+ nummer - r antalet upprepningar av kommandot (valfritt, standard=1).
+ d - r kommandot fr att radera.
+ objekt - r vad kommandot kommer att operera p (listade nedan).
+
+ En kort lista ver objekt:
+ w - frn markren till slutet av ordet, inklusive blanksteget.
+ e - frn markren till slutet av ordet, EJ inklusive blanksteget.
+ $ - frn markren till slutet p raden.
+
+NOTERA: Fr den ventyrslystne, genom att bara trycka p objektet i
+ Normal-lge (utan kommando) s kommer markren att flyttas som
+ angivet i objektlistan.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.4: ETT UNDANTAG TILL 'KOMMANDO-OBJEKT'
+
+
+ ** Skriv dd fr att radera hela raden. **
+
+ P grund av hur vanligt det r att ta bort hela rader, valde upphovsmannen
+ till Vi att det skulle vara enklare att bara trycka d tv gnger i rad fr
+ att ta bort en rad.
+
+ 1. Flytta markren till den andra raden i frasen nedan.
+ 2. Skriv dd fr att radera raden.
+ 3. Flytta nu till den fjrde raden.
+ 4. Skriv 2dd (kom ihg: nummer-kommando-objekt) fr att radera de tv
+ raderna.
+
+ 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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.5: NGRA-KOMMANDOT
+
+
+** Skriv u fr att ngra det senaste kommandona, U fr att fixa en hel rad. **
+
+ 1. Flytta markren till slutet av raden nedan markerad ---> och placera den
+ p det frsta felet.
+ 2. Skriv x fr att radera den frsta felaktiga tecknet.
+ 3. Skriv nu u fr att ngra det senaste krda kommandot.
+ 4. Rtta den hr gngen alla felen p raden med x-kommandot.
+ 5. Skriv nu U fr att terstlla raden till dess ursprungliga utseende.
+ 6. Skriv nu u ngra gnger fr att ngra U och tidigare kommandon.
+ 7. Tryck nu CTRL-R (hll inne CTRL samtidigt som du trycker R) ngra gnger
+ fr att upprepa kommandona (ngra ngringarna).
+
+---> Fiixa felen pp deen hr meningen och terskapa dem med ngra.
+
+ 8. Det hr r vldigt anvndbara kommandon. G nu vidare till
+ Lektion 2 Sammanfattning.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 2 SAMMANFATTNING
+
+
+ 1. Fr att radera frn markren till slutet av ett ord skriv: dw
+
+ 2. Fr att radera frn markren till slutet av en rad skriv: d$
+
+ 3. Fr att radera en hel rad skriv: dd
+
+ 4. Syntaxen fr ett kommando i Normal-lge r:
+
+ [nummer] kommando objekt ELLER kommando [nummer] objekt
+ dr:
+ nummer - r hur mnga gnger kommandot kommandot ska repeteras
+ kommando - r vad som ska gras, t.ex. d fr att radera
+ objekt - r vad kommandot ska operera p, som t.ex. w (ord),
+ $ (till slutet av raden), etc.
+
+ 5. Fr att ngra tidigare kommandon, skriv: u (litet u)
+ Fr att ngra alla tidigare ndringar p en rad skriv: U (stort U)
+ Fr att ngra ngringar tryck: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.1: KLISTRA IN-KOMMANDOT
+
+
+ ** Skriv p fr att klistra in den senaste raderingen efter markren. **
+
+ 1. Flytta markren till den frsta raden i listan nedan.
+
+ 2. Skriv dd fr att radera raden och lagra den i Vims buffert.
+
+ 3. Flytta markren till raden OVANFR dr den raderade raden borde vara.
+
+ 4. Nr du r i Normal-lge, skriv p fr att byta ut raden.
+
+ 5. Repetera stegen 2 till 4 fr att klistra in alla rader i rtt ordning.
+
+ d) Kan du lra dig ocks?
+ b) Violetter r bl,
+ c) Intelligens fs genom lrdom,
+ a) Rosor r rda,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.2: ERSTT-KOMMANDOT
+
+
+ ** Skriv r och ett tecken fr att erstta tecknet under markren. **
+
+ 1. Flytta markren till den frsta raden nedan markerad --->.
+
+ 2. Flytta markren s att den str p det frsta felet.
+
+ 3. Skriv r och sedan det tecken som borde erstta felet.
+
+ 4. Repetera steg 2 och 3 tills den frsta raden r korrekt.
+
+---> Nr drn hr ruden skrevs, trickte ngon p fil knappar!
+---> Nr den hr raden skrevs, tryckte ngon p fel knappar!
+
+ 5. G nu vidare till Lektion 3.2.
+
+NOTERA: Kom ihg att du skall lra dig genom anvndning, inte genom memorering.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.3: NDRA-KOMMANDOT
+
+
+ ** Fr att ndra en del eller ett helt ord, skriv cw . **
+
+ 1. Flytta markren till den frsta redan nedan markerad --->.
+
+ 2. Placera markren p d i rdrtn.
+
+ 3. Skriv cw och det rtta ordet (i det hr fallet, skriv "aden".)
+
+ 4. Tryck <ESC> och flytta markren till nsta fel (det frsta tecknet som
+ ska ndras.)
+
+ 5. Repetera steg 3 och 4 tills den frsta raden r likadan som den andra.
+
+---> Den hr rdrtn har ngra otf som brhotrt ndras mrf ndra-komjendit.
+---> Den hr raden har ngra ord som behver ndras med ndra-kommandot.
+
+Notera att cw inte bara ndrar ordet, utan ven placerar dig i infogningslge.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.4: FLER NDRINGAR MED c
+
+
+ ** ndra-kommandot anvnds p samma objekt som radera. **
+
+ 1. ndra-kommandot fungerar p samma stt som radera. Syntaxen r:
+
+ [nummer] c objekt ELLER c [nummer] objekt
+
+ 2. Objekten r ocks de samma, som t.ex. w (ord), $ (slutet av raden), etc.
+
+ 3. Flytta till den frsta raden nedan markerad -->.
+
+ 4. Flytta markren till det frsta felet.
+
+ 5. Skriv c$ fr att gra resten av raden likadan som den andra och tryck
+ <ESC>.
+
+---> Slutet p den hr raden behver hjlp med att f den att likna den andra.
+---> Slutet p den hr raden behver rttas till med c$-kommandot.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 3 SAMMANFATTNING
+
+
+ 1. Fr att erstta text som redan har blivit raderad, skriv p .
+ Detta klistrar in den raderade texten EFTER markren (om en rad raderades
+ kommer den att hamna p raden under markren.
+
+ 2. Fr att erstta tecknet under markren, skriv r och sedan tecknet som
+ kommer att erstta orginalet.
+
+ 3. ndra-kommandot lter dig ndra det angivna objektet frn markren till
+ slutet p objektet. eg. Skriv cw fr att ndra frn markren till slutet
+ p ordet, c$ fr att ndra till slutet p en rad.
+
+ 4. Syntaxen fr ndra-kommandot r:
+
+ [nummer] c objekt ELLER c [nummer] objekt
+
+G nu till nsta lektion.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.1: POSITION OCH FILSTATUS
+
+
+ ** Tryck CTRL-g fr att visa din position i filen och filstatusen.
+ Tryck SHIFT-G fr att flytta till en rad i filen. **
+
+ Notera: Lsa hela den lektion innan du utfr ngot av stegen!!
+
+ 1. Hll ned Ctrl-tangenten och tryck g . En statusrad med filnamn och raden
+ du befinner dig p kommer att synas. Kom ihg radnummret till Steg 3.
+
+ 2. Tryck shift-G fr att flytta markren till slutet p filen.
+
+ 3. Skriv in nummret p raden du var p och tryck sedan shift-G. Detta kommer
+ att ta dig tillbaka till raden du var p nr du frst tryckte Ctrl-g.
+ (Nr du skriver in nummren, kommer de INTE att visas p skrmen.)
+
+ 4. Om du knner dig sker p det hr, utfr steg 1 till 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.2: SK-KOMMANDOT
+
+
+ ** Skriv / fljt av en fras fr att ska efter frasen. **
+
+ 1. I Normal-lge skriv /-tecknet. Notera att det och markren blir synlig
+ lngst ned p skrmen precis som med :-kommandot.
+
+ 2. Skriv nu "feeel" <ENTER>. Det hr r ordet du vill ska efter.
+
+ 3. Fr att ska efter samma fras igen, tryck helt enkelt n .
+ Fr att ska efter samma fras igen i motsatt riktning, tryck Shift-N .
+
+ 4. Om du vill ska efter en fras bakt i filen, anvnd kommandot ? istllet
+ fr /.
+
+---> "feeel" r inte rtt stt att stava fel: feeel r ett fel.
+
+Notera: Nr skningen nr slutet p filen kommer den att fortstta vid brjan.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.3: SKNING EFTER MATCHANDE PARENTESER
+
+
+ ** Skriv % fr att hitta en matchande ),], or } . **
+
+ 1. Placera markren p ngon av (, [, or { p raden nedan markerad --->.
+
+ 2. Skriv nu %-tecknet.
+
+ 3. Markren borde vara p den matchande parentesen eller hakparentesen.
+
+ 4. Skriv % fr att flytta markren tillbaka till den frsta hakparentesen
+ (med matchning).
+
+---> Det ( hr r en testrad med (, [ ] och { } i den. ))
+
+Notera: Det hr r vldigt anvndbart vid avlusning av ett program med icke
+ matchande parenteser!
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.4: ETT STT ATT NDRA FEL
+
+
+ ** Skriv :s/gammalt/nytt/g fr att erstta "gammalt" med "nytt". **
+
+ 1. Flytta markren till raden nedan markerad --->.
+
+ 2. Skriv :s/denn/den <ENTER> . Notera att det hr kommandot bara ndrar den
+ frsta frekomsten p raden.
+
+ 3. Skriv nu :s/denn/den/g vilket betyder erstt globalt p raden.
+ Det ndrar alla frekomster p raden.
+
+---> denn bsta tiden att se blommor blomma r denn p vren.
+
+ 4. Fr att ndra alla frekomster av en teckenstrng mellan tv rader,
+ skriv :#,#s/gammalt/nytt/g dr #,# r de tv radernas radnummer.
+ Skriv :%s/gammtl/nytt/g fr att ndra varje frekomst i hela filen.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 4 SAMMANFATTNING
+
+
+ 1. Ctrl-g visar din position i filen och filstatusen.
+ Shift-G flyttar till slutet av filen. Ett radnummer fljt Shift-G
+ flyttar till det radnummret.
+
+ 2. Skriver man / fljt av en fras sks det FRAMMT efter frasen.
+ Skriver man ? fljt av en fras sks det BAKT efter frasen.
+ Efter en skning skriv n fr att hitta nsta frekomst i samma riktning
+ eller Shift-N fr att ska i den motsatta riktningen.
+
+ 3. Skriver man % nr markren r p ett (,),[,],{, eller } hittas dess
+ matchande par.
+
+ 4. Fr att erstta den frsta gammalt med nytt p en rad skriv :s/gammlt/nytt
+ Fr att erstta alla gammlt med nytt p en rad skriv :s/gammlt/nytt/g
+ Fr att erstta fraser mellan rad # och rad # skriv :#,#s/gammlt/nytt/g
+ Fr att erstta alla frekomster i filen skriv :%s/gammlt/nytt/g
+ Fr att bekrfta varje gng lgg till "c" :%s/gammlt/nytt/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.1: HUR MAN KR ETT EXTERNT KOMMANDO
+
+
+ ** Skriv :! fljt av ett externt kommando fr att kra det kommandot. **
+
+ 1. Skriv det vlbekanta kommandot : fr att placera markren lngst ned
+ p skrmen p skrmen. Detta lter dig skriva in ett kommando.
+
+ 2. Skriv nu ! (utropstecken). Detta lter dig kra ett godtyckligt externt
+ skalkommando.
+
+ 3. Som ett exempel skriv ls efter ! och tryck sedan <ENTER>. Detta kommer
+ att visa dig en listning av din katalog, precis som om du krt det vid
+ skalprompten. Anvnd :!dir om ls inte fungerar.
+
+Notera: Det r mjligt att kra vilket externt kommando som helst p det hr
+ sttet.
+
+Notera: Alla :-kommandon mste avslutas med att trycka p <ENTER>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.2: MER OM ATT SPARA FILER
+
+
+ ** Fr att spara ndringar gjorda i en fil, skriv :w FILNAMN. **
+
+ 1. Skriv :!dir eller :!ls fr att f en listning av din katalog.
+ Du vet redan att du mste trycka <ENTER> efter det hr.
+
+ 2. Vlj ett filnamn som inte redan existerar, som t.ex. TEST.
+
+ 3. Skriv nu: :w TEST (dr TEST r filnamnet du valt.)
+
+ 4. Det hr sparar hela filen (Vim handledningen) under namnet TEST.
+ Fr att verifiera detta, skriv :!dir igen fr att se din katalog
+
+Notera: Om du skulle avsluta Vim och sedan ppna igen med filnamnet TEST s
+ skulle filen vara en exakt kopia av handledningen nr du sparade den.
+
+ 5. Ta nu bort filen genom att skriva (MS-DOS): :!del TEST
+ eller (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.3: ETT SELEKTIVT SPARA-KOMMANDO
+
+
+ ** Fr att spara en del av en fil, skriv :#,# w FILNAMN **
+
+ 1. nnu en gng, skriv :!dir eller :!ls fr att f en listning av din
+ katalog och vlj ett passande filnamn som t.ex. TEST.
+
+ 2. Flytta markren hgst upp p den hr sidan och tryck Ctrl-g fr att f
+ reda p radnumret p den raden. KOM IHG DET NUMMRET!
+
+ 3. Flytta nu lngst ned p sidan och skriv Ctrl-g igen.
+ KOM IHG DET RADNUMMRET OCKS!
+
+ 4. Fr att BARA spara en sektion till en fil, skriv :#,# w TEST
+ dr #,# r de tv nummren du kom ihg (toppen, botten) och TEST r
+ ditt filnamn.
+
+ 5. nnu en gng, kolla s att filen r dr med :!dir men radera den INTE.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.4: TA EMOT OCH FRENA FILER
+
+
+ ** Fr att infoga innehllet av en fil, skriv :r FILNAMN **
+
+ 1. Skriv :!dir fr att frskra dig om att TEST-filen frn tidigare
+ fortfarande r kvar.
+
+ 2. Placera markren hgst upp p den hr sidan.
+
+NOTERA: Efter att du krt Steg 3 kommer du att se Lektion 5.3.
+ Flytta d NED till den hr lektionen igen.
+
+ 3. Ta nu emot din TEST-fil med kommandot :r TEST dr TEST r namnet p
+ filen.
+
+NOTERA: Filen du tar emot placeras dr markren r placerad.
+
+ 4. Fr att verifiera att filen togs emot, g tillbaka och notera att det nu
+ finns tv kopior av Lektion 5.3, orginalet och filversionen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 5 SAMMANFATTNING
+
+
+ 1. :!kommando kr ett externt kommando.
+
+ Ngra anvndbara exempel r:
+ (MS-DOS) (Unix)
+ :!dir :!ls - visar en kataloglistning.
+ :!del FILNAMN :!rm FILNAMN - tar bort filen FILNAMN.
+
+ 2. :w FILNAMN sparar den aktuella Vim-filen med namnet FILNAMN.
+
+ 3. :#,#w FILNAMN sparar raderna # till # i filen FILNAMN.
+
+ 4. :r FILNAMN tar emot filen FILNAMN och infogar den i den aktuella filen
+ efter markren.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.1: PPNA-KOMMANDOT
+
+
+ ** Skriv o fr att ppna en rad under markren och placera dig i
+ Infoga-lge. **
+
+ 1. Flytta markren till raden nedan markerad --->.
+
+ 2. Skriv o (litet o) fr att ppna upp en rad NEDANFR markren och placera
+ dig i Infoga-mode.
+
+ 3. Kopiera nu raden markerad ---> och tryck <ESC> fr att avsluta
+ Infoga-lget.
+
+---> Efter du skrivit o placerad markren p en ppen rad i Infoga-lge.
+
+ 4. Fr att ppna upp en rad OVANFR markren, skriv ett stort O , istllet
+ fr ett litet o. Prva detta p raden nedan.
+ppna upp en rad ovanfr denna genom att trycka Shift-O nr markren str hr.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.2: LGG TILL-KOMMANDOT
+
+
+ ** Skriv a fr att infoga text EFTER markren. **
+
+ 1. Flytta markren till slutet av den frsta raden nedan markerad ---> genom
+ att skriv $ i Normal-lge.
+
+ 2. Skriv ett a (litet a) fr att lgga till text EFTER tecknet under
+ markren. (Stort A lgger till i slutet av raden.)
+
+Notera: Detta undviker att behva skriva i , det sista tecknet, texten att
+ infoga, <ESC>, hgerpil, och slutligen, x, bara fr att lgga till i
+ slutet p en rad!
+
+ 3. Gr nu frdigt den frsta raden. Notera ocks att lgga till r likadant
+ som Infoga-lge, enda skillnaden r positionen dr texten blir infogad.
+
+---> Hr kan du trna
+---> Hr kan du trna p att lgga till text i slutet p en rad.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.3: EN ANNAN VERSION AV ERSTT
+
+
+ ** Skriv ett stort R fr att erstta fler n ett tecken. **
+
+ 1. Flytta markren till den frsta raden nedan markerad --->.
+
+ 2. Placera markren vid brjan av det frsta ordet som r annorlunda jmfrt
+ med den andra raden markerad ---> (ordet "sista").
+
+ 3. Skriv nu R och erstt resten av texten p den frsta raden genom att
+ skriva ver den gamla texten s att den frsta raden blir likadan som
+ den andra.
+
+---> Fr att f den frsta raden lika som den sista, anvnd tangenterna.
+---> Fr att f den frsta raden lika som den andra, skriv R och den nya texten.
+
+ 4. Notera att nr du trycker <ESC> fr att avsluta, s blir eventuell
+ ofrndrad text kvar.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.4: STT FLAGGOR
+
+ ** Stt en flagga s att en skning eller ersttning ignorerar storlek **
+
+ 1. Sk efter "ignore" genom att skriva:
+ /ignore
+ Repetera flera gnger genom att trycka p n-tangenten
+
+ 2. Stt 'ic' (Ignore Case) flaggan genom att skriva:
+ :set ic
+
+ 3. Sk nu efter "ignore" igen genom att trycka: n
+ Repeat search several more times by hitting the n key
+
+ 4. Stt 'hlsearch' and 'incsearch' flaggorna:
+ :set hls is
+
+ 5. Skriv nu in sk-kommandot igen, och se vad som hnder:
+ /ignore
+
+ 6. Fr att ta bort framhvningen av trffar, skriv
+ :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 6 SAMMANFATTNING
+
+
+ 1. Genom att skriva o pnnas en rad NEDANFR markren och markren placeras
+ p den ppna raden i Infoga-lge.
+ Genom att skriva ett stort O ppnas raden OVANFR raden som markren r
+ p.
+
+ 2. Skriv ett a fr att infoga text EFTER tecknet som markren str p.
+ Genom att skriva ett stort A lggs text automatiskt till i slutet p
+ raden.
+
+ 3. Genom att skriva ett stort R hamnar du i Erstt-lge till <ESC> trycks
+ fr att avsluta.
+
+ 4. Genom att skriva ":set xxx" stts flaggan "xxx"
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 7: ON-LINE HJLP-KOMMANDON
+
+
+ ** Anvnd on-line hjlpsystemet **
+
+ Vim har ett omfattande on-line hjlpsystem. Fr att komma igng prva ett av
+ dessa tre:
+ - tryck <HELP> tangenten (om du har ngon)
+ - tryck <F1> tangenten (om du har ngon)
+ - skriv :help <ENTER>
+
+ Skriv :q <ENTER> fr att strnga hjlpfnstret.
+
+ Du kan hitta hjlp om nstan allting, genom att ge ett argument till
+ ":help" kommandot. Prva dessa (glm inte att trycka <ENTER>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 8: SKAPA ETT UPPSTARTSSKRIPT
+
+ ** Aktivera Vim- funktioner **
+
+ Vim har mnga fler funktioner n Vi, men de flesta av dem r inaktiverade som
+ standard. Fr att brja anvnda fler funktioner mste du skapa en "vimrc"-fil.
+
+ 1. Brja redigera "vimrc"-filen, detta beror p ditt system:
+ :edit ~/.vimrc fr Unix
+ :edit ~/_vimrc fr MS-Windows
+
+ 2. Ls nu texten i exempel "vimrc"-filen:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Spara filen med:
+
+ :write
+
+ Nsta gng du startar Vim kommer den att anvnda syntaxframhvning.
+ Du kan lgga till alla instllningar du fredrar till den hr "vimrc"-filen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Detta avslutar handledningen i Vim. Den var avsedd att ge en kort versikt av
+ redigeraren Vim, bara tillrckligt fr att du ska kunna anvnda redigeraren
+ relativt enkelt. Den r lngt ifrn komplett eftersom Vim har mnga mnga fler
+ kommandon. Ls anvndarmanualen hrnst: ":help user-manual".
+
+ Fr vidare lsning rekommenderas den hr boken:
+ Vim - Vi Improved - av Steve Oualline
+ Frlag: New Riders
+ Den frsta boken som r endast behandlar Vim. Speciellt anvndbar fr
+ nybrjare. Det finns mnga exempel och bilder.
+ Se https://iccf-holland.org/click5.html
+
+ Den hr boken r ldre och behandlar mer Vi n Vim, men rekommenderas ocks:
+ Learning the Vi Editor - av Linda Lamb
+ Frlag: O'Reilly & Associates Inc.
+ Det r en bra bok fr att lra sig nstan allt som du vill kunna gra med Vi.
+ Den sjtte upplagan inkluderar ocks information om Vim.
+
+ Den hr handledningen r skriven av Michael C. Pierce och Robert K. Ware,
+ Colorado School of Mines med ider frn Charles Smith,
+ Colorado State University. E-post: bware@mines.colorado.edu.
+
+ Modifierad fr Vim av Bram Moolenaar.
+ versatt av Johan Svedberg <johan@svedberg.com>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.sv.utf-8 b/runtime/tutor/tutor.sv.utf-8
new file mode 100644
index 0000000..c8cacc6
--- /dev/null
+++ b/runtime/tutor/tutor.sv.utf-8
@@ -0,0 +1,830 @@
+===============================================================================
+= V ä l k o m m e n t i l l h a n d l e d n i n g e n i V i m - Ver. 1.5 =
+===============================================================================
+
+ Vim är en väldigt kraftfull redigerare som har många kommandon, alltför
+ många att förklara i en handledning som denna. Den här handledningen är
+ gjord för att förklara tillräckligt många kommandon så att du enkelt ska
+ kunna använda Vim som en redigerare för alla ändamål.
+
+ Den beräknade tiden för att slutföra denna handledning är 25-30 minuter,
+ beroende på hur mycket tid som läggs ned på experimentering.
+
+ Kommandona i lektionerna kommer att modifiera texten. Gör en kopia av den
+ här filen att öva på (om du startade "vimtutor är det här redan en kopia).
+
+ Det är viktigt att komma ihåg att den här handledningen är konstruerad
+ att lära vid användning. Det betyder att du måste köra kommandona för att
+ lära dig dem ordentligt. Om du bara läser texten så kommer du att glömma
+ kommandona!
+
+ Försäkra dig nu om att din Caps-Lock tangent INTE är aktiv och tryck på
+ j-tangenten tillräckligt många gånger för att förflytta markören så att
+ Lektion 1.1 fyller skärmen helt.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.1: FLYTTA MARKÖREN
+
+
+ ** För att flytta markören, tryck på tangenterna h,j,k,l som indikerat. **
+ ^
+ k Tips:
+ < h l > h-tangenten är till vänster och flyttar till vänster.
+ j l-tangenten är till höger och flyttar till höger.
+ v j-tangenten ser ut som en pil ned.
+ 1. Flytta runt markören på skärmen tills du känner dig bekväm.
+
+ 2. Håll ned tangenten pil ned (j) tills att den repeterar.
+---> Nu vet du hur du tar dig till nästa lektion.
+
+ 3. Flytta till Lektion 1.2, med hjälp av ned tangenten.
+
+Notera: Om du är osäker på någonting du skrev, tryck <ESC> för att placera dig
+ dig i Normal-läge. Skriv sedan om kommandot.
+
+Notera: Piltangenterna borde också fungera. Men om du använder hjkl så kommer
+ du att kunna flytta omkring mycket snabbare, när du väl vant dig vid
+ det.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.2: STARTA OCH AVSLUTA VIM
+
+
+ !! NOTERA: Innan du utför någon av punkterna nedan, läs hela lektionen!!
+
+ 1. Tryck <ESC>-tangenten (för att se till att du är i Normal-läge).
+
+ 2. Skriv: :q! <ENTER>.
+
+---> Detta avslutar redigeraren UTAN att spara några ändringar du gjort.
+ Om du vill spara ändringarna och avsluta skriv:
+ :wq <ENTER>
+
+ 3. När du ser skal-prompten, skriv kommandot som tog dig in i den här
+ handledningen. Det kan vara: vimtutor <ENTER>
+ Normalt vill du använda: vim tutor <ENTER>
+
+---> 'vim' betyder öppna redigeraren vim, 'tutor' är filen du vill redigera.
+
+ 4. Om du har memorerat dessa steg och känner dig självsäker, kör då stegen
+ 1 till 3 för att avsluta och starta om redigeraren. Flytta sedan ned
+ markören till Lektion 1.3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.3: TEXT REDIGERING - BORTTAGNING
+
+
+** När du är i Normal-läge tryck x för att ta bort tecknet under markören. **
+
+ 1. Flytta markören till raden nedan med markeringen --->.
+
+ 2. För att rätta felen, flytta markören tills den står på tecknet som ska
+ tas bort. fix the errors, move the cursor until it is on top of the
+
+ 3. Tryck på x-tangenten för att ta bort det felaktiga tecknet.
+
+ 4. Upprepa steg 2 till 4 tills meningen är korrekt.
+
+---> Kkon hoppadee övverr måånen.
+
+ 5. Nu när raden är korrekt, gå till Lektion 1.4.
+
+NOTERA: När du går igenom den här handledningen, försök inte att memorera, lär
+ genom användning.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 1.4: TEXT REDIGERING - INFOGNING
+
+
+ ** När du är i Normal-läge tryck i för att infoga text. **
+
+ 1. Flytta markören till den första raden nedan med markeringen --->.
+
+ 2. För att göra den första raden likadan som den andra, flytta markören till
+ det första tecknet EFTER där text ska infogas.
+
+ 3. Tryck i och skriv in det som saknas.
+
+ 4. När du rättat ett fel tryck <ESC> för att återgå till Normal-läge.
+ Upprepa steg 2 till 4 för att rätta meningen.
+
+---> Det sakns här .
+---> Det saknas lite text från den här raden.
+
+ 5. När du känner dig bekväm med att infoga text, gå till sammanfattningen
+ nedan.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 1 SAMMANFATTNING
+
+
+ 1. Markören flyttas genom att använda piltangenterna eller hjkl-tangenterna.
+ h (vänster) j (ned) k (upp) l (höger)
+
+ 2. För att starta Vim (från %-prompten) skriv: vim FILNAMN <ENTER>
+
+ 3. För att avsluta Vim skriv: <ESC> :q! <ENTER> för att kasta ändringar.
+ ELLER skriv: <ESC> :wq <ENTER> för att spara ändringar.
+
+ 4. För att ta bort tecknet under markören i Normal-läge skriv: x
+
+ 5. För att infoga text vid markören i Normal-läge skriv:
+ i skriv in text <ESC>
+
+NOTERA: Genom att trycka <ESC> kommer du att placeras i Normal-läge eller
+ avbryta ett delvis färdigskrivet kommando.
+
+Fortsätt nu med Lektion 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.1: BORTTAGNINGSKOMMANDON
+
+
+ ** Skriv dw för att radera till slutet av ett ord. **
+
+ 1. Tryck <ESC> för att försäkra dig om att du är i Normal-läge.
+
+ 2. Flytta markören till raden nedan markerad --->.
+
+ 3. Flytta markören till början av ett ord som måste raderas.
+
+ 4. Skriv dw för att radera ordet.
+
+ NOTERA: Bokstäverna dw kommer att synas på den sista raden på skärmen när
+ du skriver dem. Om du skrev något fel, tryck <ESC> och börja om.
+
+---> Det är ett några ord roliga att som inte hör hemma i den här meningen.
+
+ 5. Upprepa stegen 3 och 4 tills meningen är korrekt och gå till Lektion 2.2.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.2: FLER BORTTAGNINGSKOMMANDON
+
+
+ ** Skriv d$ för att radera till slutet på raden. **
+
+ 1. Tryck <ESC> för att försäkra dig om att du är i Normal-läge.
+
+ 2. Flytta markören till raden nedan markerad --->.
+
+ 3. Flytta markören till slutet på den rätta raden (EFTER den första . ).
+
+ 4. Skriv d$ för att radera till slutet på raden.
+
+---> Någon skrev slutet på den här raden två gånger. den här raden två gånger.
+
+
+ 5. Gå vidare till Lektion 2.3 för att förstå vad det är som händer.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.3: KOMMANDON OCH OBJEKT
+
+
+ Syntaxen för d raderingskommandot är följande:
+
+ [nummer] d objekt ELLER d [nummer] objekt
+ Var:
+ nummer - är antalet upprepningar av kommandot (valfritt, standard=1).
+ d - är kommandot för att radera.
+ objekt - är vad kommandot kommer att operera på (listade nedan).
+
+ En kort lista över objekt:
+ w - från markören till slutet av ordet, inklusive blanksteget.
+ e - från markören till slutet av ordet, EJ inklusive blanksteget.
+ $ - från markören till slutet på raden.
+
+NOTERA: För den äventyrslystne, genom att bara trycka på objektet i
+ Normal-läge (utan kommando) så kommer markören att flyttas som
+ angivet i objektlistan.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.4: ETT UNDANTAG TILL 'KOMMANDO-OBJEKT'
+
+
+ ** Skriv dd för att radera hela raden. **
+
+ På grund av hur vanligt det är att ta bort hela rader, valde upphovsmannen
+ till Vi att det skulle vara enklare att bara trycka d två gånger i rad för
+ att ta bort en rad.
+
+ 1. Flytta markören till den andra raden i frasen nedan.
+ 2. Skriv dd för att radera raden.
+ 3. Flytta nu till den fjärde raden.
+ 4. Skriv 2dd (kom ihåg: nummer-kommando-objekt) för att radera de två
+ raderna.
+
+ 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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 2.5: ÅNGRA-KOMMANDOT
+
+
+** Skriv u för att ångra det senaste kommandona, U för att fixa en hel rad. **
+
+ 1. Flytta markören till slutet av raden nedan markerad ---> och placera den
+ på det första felet.
+ 2. Skriv x för att radera den första felaktiga tecknet.
+ 3. Skriv nu u för att ångra det senaste körda kommandot.
+ 4. Rätta den här gången alla felen på raden med x-kommandot.
+ 5. Skriv nu U för att återställa raden till dess ursprungliga utseende.
+ 6. Skriv nu u några gånger för att ångra U och tidigare kommandon.
+ 7. Tryck nu CTRL-R (håll inne CTRL samtidigt som du trycker R) några gånger
+ för att upprepa kommandona (ångra ångringarna).
+
+---> Fiixa felen ppå deen häär meningen och återskapa dem med ångra.
+
+ 8. Det här är väldigt användbara kommandon. Gå nu vidare till
+ Lektion 2 Sammanfattning.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 2 SAMMANFATTNING
+
+
+ 1. För att radera från markören till slutet av ett ord skriv: dw
+
+ 2. För att radera från markören till slutet av en rad skriv: d$
+
+ 3. För att radera en hel rad skriv: dd
+
+ 4. Syntaxen för ett kommando i Normal-läge är:
+
+ [nummer] kommando objekt ELLER kommando [nummer] objekt
+ där:
+ nummer - är hur många gånger kommandot kommandot ska repeteras
+ kommando - är vad som ska göras, t.ex. d för att radera
+ objekt - är vad kommandot ska operera på, som t.ex. w (ord),
+ $ (till slutet av raden), etc.
+
+ 5. För att ångra tidigare kommandon, skriv: u (litet u)
+ För att ångra alla tidigare ändringar på en rad skriv: U (stort U)
+ För att ångra ångringar tryck: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.1: KLISTRA IN-KOMMANDOT
+
+
+ ** Skriv p för att klistra in den senaste raderingen efter markören. **
+
+ 1. Flytta markören till den första raden i listan nedan.
+
+ 2. Skriv dd för att radera raden och lagra den i Vims buffert.
+
+ 3. Flytta markören till raden OVANFÖR där den raderade raden borde vara.
+
+ 4. När du är i Normal-läge, skriv p för att byta ut raden.
+
+ 5. Repetera stegen 2 till 4 för att klistra in alla rader i rätt ordning.
+
+ d) Kan du lära dig också?
+ b) Violetter är blå,
+ c) Intelligens fås genom lärdom,
+ a) Rosor är röda,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.2: ERSÄTT-KOMMANDOT
+
+
+ ** Skriv r och ett tecken för att ersätta tecknet under markören. **
+
+ 1. Flytta markören till den första raden nedan markerad --->.
+
+ 2. Flytta markören så att den står på det första felet.
+
+ 3. Skriv r och sedan det tecken som borde ersätta felet.
+
+ 4. Repetera steg 2 och 3 tills den första raden är korrekt.
+
+---> När drn här ruden skrevs, trickte någon på fil knappar!
+---> När den här raden skrevs, tryckte någon på fel knappar!
+
+ 5. Gå nu vidare till Lektion 3.2.
+
+NOTERA: Kom ihåg att du skall lära dig genom användning, inte genom memorering.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.3: ÄNDRA-KOMMANDOT
+
+
+ ** För att ändra en del eller ett helt ord, skriv cw . **
+
+ 1. Flytta markören till den första redan nedan markerad --->.
+
+ 2. Placera markören på d i rdrtn.
+
+ 3. Skriv cw och det rätta ordet (i det här fallet, skriv "aden".)
+
+ 4. Tryck <ESC> och flytta markören till nästa fel (det första tecknet som
+ ska ändras.)
+
+ 5. Repetera steg 3 och 4 tills den första raden är likadan som den andra.
+
+---> Den här rdrtn har några otf som brhotrt ändras mrf ändra-komjendit.
+---> Den här raden har några ord som behöver ändras med ändra-kommandot.
+
+Notera att cw inte bara ändrar ordet, utan även placerar dig i infogningsläge.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 3.4: FLER ÄNDRINGAR MED c
+
+
+ ** Ändra-kommandot används på samma objekt som radera. **
+
+ 1. Ändra-kommandot fungerar på samma sätt som radera. Syntaxen är:
+
+ [nummer] c objekt ELLER c [nummer] objekt
+
+ 2. Objekten är också de samma, som t.ex. w (ord), $ (slutet av raden), etc.
+
+ 3. Flytta till den första raden nedan markerad -->.
+
+ 4. Flytta markören till det första felet.
+
+ 5. Skriv c$ för att göra resten av raden likadan som den andra och tryck
+ <ESC>.
+
+---> Slutet på den här raden behöver hjälp med att få den att likna den andra.
+---> Slutet på den här raden behöver rättas till med c$-kommandot.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 3 SAMMANFATTNING
+
+
+ 1. För att ersätta text som redan har blivit raderad, skriv p .
+ Detta klistrar in den raderade texten EFTER markören (om en rad raderades
+ kommer den att hamna på raden under markören.
+
+ 2. För att ersätta tecknet under markören, skriv r och sedan tecknet som
+ kommer att ersätta orginalet.
+
+ 3. Ändra-kommandot låter dig ändra det angivna objektet från markören till
+ slutet på objektet. eg. Skriv cw för att ändra från markören till slutet
+ på ordet, c$ för att ändra till slutet på en rad.
+
+ 4. Syntaxen för ändra-kommandot är:
+
+ [nummer] c objekt ELLER c [nummer] objekt
+
+Gå nu till nästa lektion.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.1: POSITION OCH FILSTATUS
+
+
+ ** Tryck CTRL-g för att visa din position i filen och filstatusen.
+ Tryck SHIFT-G för att flytta till en rad i filen. **
+
+ Notera: Läsa hela den lektion innan du utför något av stegen!!
+
+ 1. Håll ned Ctrl-tangenten och tryck g . En statusrad med filnamn och raden
+ du befinner dig på kommer att synas. Kom ihåg radnummret till Steg 3.
+
+ 2. Tryck shift-G för att flytta markören till slutet på filen.
+
+ 3. Skriv in nummret på raden du var på och tryck sedan shift-G. Detta kommer
+ att ta dig tillbaka till raden du var på när du först tryckte Ctrl-g.
+ (När du skriver in nummren, kommer de INTE att visas på skärmen.)
+
+ 4. Om du känner dig säker på det här, utför steg 1 till 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.2: SÖK-KOMMANDOT
+
+
+ ** Skriv / följt av en fras för att söka efter frasen. **
+
+ 1. I Normal-läge skriv /-tecknet. Notera att det och markören blir synlig
+ längst ned på skärmen precis som med :-kommandot.
+
+ 2. Skriv nu "feeel" <ENTER>. Det här är ordet du vill söka efter.
+
+ 3. För att söka efter samma fras igen, tryck helt enkelt n .
+ För att söka efter samma fras igen i motsatt riktning, tryck Shift-N .
+
+ 4. Om du vill söka efter en fras bakåt i filen, använd kommandot ? istället
+ för /.
+
+---> "feeel" är inte rätt sätt att stava fel: feeel är ett fel.
+
+Notera: När sökningen når slutet på filen kommer den att fortsätta vid början.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.3: SÖKNING EFTER MATCHANDE PARENTESER
+
+
+ ** Skriv % för att hitta en matchande ),], or } . **
+
+ 1. Placera markören på någon av (, [, or { på raden nedan markerad --->.
+
+ 2. Skriv nu %-tecknet.
+
+ 3. Markören borde vara på den matchande parentesen eller hakparentesen.
+
+ 4. Skriv % för att flytta markören tillbaka till den första hakparentesen
+ (med matchning).
+
+---> Det ( här är en testrad med (, [ ] och { } i den. ))
+
+Notera: Det här är väldigt användbart vid avlusning av ett program med icke
+ matchande parenteser!
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 4.4: ETT SÄTT ATT ÄNDRA FEL
+
+
+ ** Skriv :s/gammalt/nytt/g för att ersätta "gammalt" med "nytt". **
+
+ 1. Flytta markören till raden nedan markerad --->.
+
+ 2. Skriv :s/denn/den <ENTER> . Notera att det här kommandot bara ändrar den
+ första förekomsten på raden.
+
+ 3. Skriv nu :s/denn/den/g vilket betyder ersätt globalt på raden.
+ Det ändrar alla förekomster på raden.
+
+---> denn bästa tiden att se blommor blomma är denn på våren.
+
+ 4. För att ändra alla förekomster av en teckensträng mellan två rader,
+ skriv :#,#s/gammalt/nytt/g där #,# är de två radernas radnummer.
+ Skriv :%s/gammtl/nytt/g för att ändra varje förekomst i hela filen.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 4 SAMMANFATTNING
+
+
+ 1. Ctrl-g visar din position i filen och filstatusen.
+ Shift-G flyttar till slutet av filen. Ett radnummer följt Shift-G
+ flyttar till det radnummret.
+
+ 2. Skriver man / följt av en fras söks det FRAMMÅT efter frasen.
+ Skriver man ? följt av en fras söks det BAKÅT efter frasen.
+ Efter en sökning skriv n för att hitta nästa förekomst i samma riktning
+ eller Shift-N för att söka i den motsatta riktningen.
+
+ 3. Skriver man % när markören är på ett (,),[,],{, eller } hittas dess
+ matchande par.
+
+ 4. För att ersätta den första gammalt med nytt på en rad skriv :s/gammlt/nytt
+ För att ersätta alla gammlt med nytt på en rad skriv :s/gammlt/nytt/g
+ För att ersätta fraser mellan rad # och rad # skriv :#,#s/gammlt/nytt/g
+ För att ersätta alla förekomster i filen skriv :%s/gammlt/nytt/g
+ För att bekräfta varje gång lägg till "c" :%s/gammlt/nytt/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.1: HUR MAN KÖR ETT EXTERNT KOMMANDO
+
+
+ ** Skriv :! följt av ett externt kommando för att köra det kommandot. **
+
+ 1. Skriv det välbekanta kommandot : för att placera markören längst ned
+ på skärmen på skärmen. Detta låter dig skriva in ett kommando.
+
+ 2. Skriv nu ! (utropstecken). Detta låter dig köra ett godtyckligt externt
+ skalkommando.
+
+ 3. Som ett exempel skriv ls efter ! och tryck sedan <ENTER>. Detta kommer
+ att visa dig en listning av din katalog, precis som om du kört det vid
+ skalprompten. Använd :!dir om ls inte fungerar.
+
+Notera: Det är möjligt att köra vilket externt kommando som helst på det här
+ sättet.
+
+Notera: Alla :-kommandon måste avslutas med att trycka på <ENTER>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.2: MER OM ATT SPARA FILER
+
+
+ ** För att spara ändringar gjorda i en fil, skriv :w FILNAMN. **
+
+ 1. Skriv :!dir eller :!ls för att få en listning av din katalog.
+ Du vet redan att du måste trycka <ENTER> efter det här.
+
+ 2. Välj ett filnamn som inte redan existerar, som t.ex. TEST.
+
+ 3. Skriv nu: :w TEST (där TEST är filnamnet du valt.)
+
+ 4. Det här sparar hela filen (Vim handledningen) under namnet TEST.
+ För att verifiera detta, skriv :!dir igen för att se din katalog
+
+Notera: Om du skulle avsluta Vim och sedan öppna igen med filnamnet TEST så
+ skulle filen vara en exakt kopia av handledningen när du sparade den.
+
+ 5. Ta nu bort filen genom att skriva (MS-DOS): :!del TEST
+ eller (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.3: ETT SELEKTIVT SPARA-KOMMANDO
+
+
+ ** För att spara en del av en fil, skriv :#,# w FILNAMN **
+
+ 1. Ännu en gång, skriv :!dir eller :!ls för att få en listning av din
+ katalog och välj ett passande filnamn som t.ex. TEST.
+
+ 2. Flytta markören högst upp på den här sidan och tryck Ctrl-g för att få
+ reda på radnumret på den raden. KOM IHÅG DET NUMMRET!
+
+ 3. Flytta nu längst ned på sidan och skriv Ctrl-g igen.
+ KOM IHÅG DET RADNUMMRET OCKSÅ!
+
+ 4. För att BARA spara en sektion till en fil, skriv :#,# w TEST
+ där #,# är de två nummren du kom ihåg (toppen, botten) och TEST är
+ ditt filnamn.
+
+ 5. Ännu en gång, kolla så att filen är där med :!dir men radera den INTE.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 5.4: TA EMOT OCH FÖRENA FILER
+
+
+ ** För att infoga innehållet av en fil, skriv :r FILNAMN **
+
+ 1. Skriv :!dir för att försäkra dig om att TEST-filen från tidigare
+ fortfarande är kvar.
+
+ 2. Placera markören högst upp på den här sidan.
+
+NOTERA: Efter att du kört Steg 3 kommer du att se Lektion 5.3.
+ Flytta då NED till den här lektionen igen.
+
+ 3. Ta nu emot din TEST-fil med kommandot :r TEST där TEST är namnet på
+ filen.
+
+NOTERA: Filen du tar emot placeras där markören är placerad.
+
+ 4. För att verifiera att filen togs emot, gå tillbaka och notera att det nu
+ finns två kopior av Lektion 5.3, orginalet och filversionen.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 5 SAMMANFATTNING
+
+
+ 1. :!kommando kör ett externt kommando.
+
+ Några användbara exempel är:
+ (MS-DOS) (Unix)
+ :!dir :!ls - visar en kataloglistning.
+ :!del FILNAMN :!rm FILNAMN - tar bort filen FILNAMN.
+
+ 2. :w FILNAMN sparar den aktuella Vim-filen med namnet FILNAMN.
+
+ 3. :#,#w FILNAMN sparar raderna # till # i filen FILNAMN.
+
+ 4. :r FILNAMN tar emot filen FILNAMN och infogar den i den aktuella filen
+ efter markören.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.1: ÖPPNA-KOMMANDOT
+
+
+ ** Skriv o för att öppna en rad under markören och placera dig i
+ Infoga-läge. **
+
+ 1. Flytta markören till raden nedan markerad --->.
+
+ 2. Skriv o (litet o) för att öppna upp en rad NEDANFÖR markören och placera
+ dig i Infoga-mode.
+
+ 3. Kopiera nu raden markerad ---> och tryck <ESC> för att avsluta
+ Infoga-läget.
+
+---> Efter du skrivit o placerad markören på en öppen rad i Infoga-läge.
+
+ 4. För att öppna upp en rad OVANFÖR markören, skriv ett stort O , istället
+ för ett litet o. Pröva detta på raden nedan.
+Öppna upp en rad ovanför denna genom att trycka Shift-O när markören står här.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.2: LÄGG TILL-KOMMANDOT
+
+
+ ** Skriv a för att infoga text EFTER markören. **
+
+ 1. Flytta markören till slutet av den första raden nedan markerad ---> genom
+ att skriv $ i Normal-läge.
+
+ 2. Skriv ett a (litet a) för att lägga till text EFTER tecknet under
+ markören. (Stort A lägger till i slutet av raden.)
+
+Notera: Detta undviker att behöva skriva i , det sista tecknet, texten att
+ infoga, <ESC>, högerpil, och slutligen, x, bara för att lägga till i
+ slutet på en rad!
+
+ 3. Gör nu färdigt den första raden. Notera också att lägga till är likadant
+ som Infoga-läge, enda skillnaden är positionen där texten blir infogad.
+
+---> Här kan du träna
+---> Här kan du träna på att lägga till text i slutet på en rad.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.3: EN ANNAN VERSION AV ERSÄTT
+
+
+ ** Skriv ett stort R för att ersätta fler än ett tecken. **
+
+ 1. Flytta markören till den första raden nedan markerad --->.
+
+ 2. Placera markören vid början av det första ordet som är annorlunda jämfört
+ med den andra raden markerad ---> (ordet "sista").
+
+ 3. Skriv nu R och ersätt resten av texten på den första raden genom att
+ skriva över den gamla texten så att den första raden blir likadan som
+ den andra.
+
+---> För att få den första raden lika som den sista, använd tangenterna.
+---> För att få den första raden lika som den andra, skriv R och den nya texten.
+
+ 4. Notera att när du trycker <ESC> för att avsluta, så blir eventuell
+ oförändrad text kvar.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lektion 6.4: SÄTT FLAGGOR
+
+ ** Sätt en flagga så att en sökning eller ersättning ignorerar storlek **
+
+ 1. Sök efter "ignore" genom att skriva:
+ /ignore
+ Repetera flera gånger genom att trycka på n-tangenten
+
+ 2. Sätt 'ic' (Ignore Case) flaggan genom att skriva:
+ :set ic
+
+ 3. Sök nu efter "ignore" igen genom att trycka: n
+ Repeat search several more times by hitting the n key
+
+ 4. Sätt 'hlsearch' and 'incsearch' flaggorna:
+ :set hls is
+
+ 5. Skriv nu in sök-kommandot igen, och se vad som händer:
+ /ignore
+
+ 6. För att ta bort framhävningen av träffar, skriv
+ :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 6 SAMMANFATTNING
+
+
+ 1. Genom att skriva o öpnnas en rad NEDANFÖR markören och markören placeras
+ på den öppna raden i Infoga-läge.
+ Genom att skriva ett stort O öppnas raden OVANFÖR raden som markören är
+ på.
+
+ 2. Skriv ett a för att infoga text EFTER tecknet som markören står på.
+ Genom att skriva ett stort A läggs text automatiskt till i slutet på
+ raden.
+
+ 3. Genom att skriva ett stort R hamnar du i Ersätt-läge till <ESC> trycks
+ för att avsluta.
+
+ 4. Genom att skriva ":set xxx" sätts flaggan "xxx"
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 7: ON-LINE HJÄLP-KOMMANDON
+
+
+ ** Använd on-line hjälpsystemet **
+
+ Vim har ett omfattande on-line hjälpsystem. För att komma igång pröva ett av
+ dessa tre:
+ - tryck <HELP> tangenten (om du har någon)
+ - tryck <F1> tangenten (om du har någon)
+ - skriv :help <ENTER>
+
+ Skriv :q <ENTER> för att stränga hjälpfönstret.
+
+ Du kan hitta hjälp om nästan allting, genom att ge ett argument till
+ ":help" kommandot. Pröva dessa (glöm inte att trycka <ENTER>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ LEKTION 8: SKAPA ETT UPPSTARTSSKRIPT
+
+ ** Aktivera Vim- funktioner **
+
+ Vim har många fler funktioner än Vi, men de flesta av dem är inaktiverade som
+ standard. För att börja använda fler funktioner måste du skapa en "vimrc"-fil.
+
+ 1. Börja redigera "vimrc"-filen, detta beror på ditt system:
+ :edit ~/.vimrc för Unix
+ :edit ~/_vimrc för MS-Windows
+
+ 2. Läs nu texten i exempel "vimrc"-filen:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Spara filen med:
+
+ :write
+
+ Nästa gång du startar Vim kommer den att använda syntaxframhävning.
+ Du kan lägga till alla inställningar du föredrar till den här "vimrc"-filen.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Detta avslutar handledningen i Vim. Den var avsedd att ge en kort översikt av
+ redigeraren Vim, bara tillräckligt för att du ska kunna använda redigeraren
+ relativt enkelt. Den är långt ifrån komplett eftersom Vim har många många fler
+ kommandon. Läs användarmanualen härnäst: ":help user-manual".
+
+ För vidare läsning rekommenderas den här boken:
+ Vim - Vi Improved - av Steve Oualline
+ Förlag: New Riders
+ Den första boken som är endast behandlar Vim. Speciellt användbar för
+ nybörjare. Det finns många exempel och bilder.
+ Se https://iccf-holland.org/click5.html
+
+ Den här boken är äldre och behandlar mer Vi än Vim, men rekommenderas också:
+ Learning the Vi Editor - av Linda Lamb
+ Förlag: O'Reilly & Associates Inc.
+ Det är en bra bok för att lära sig nästan allt som du vill kunna göra med Vi.
+ Den sjätte upplagan inkluderar också information om Vim.
+
+ Den här handledningen är skriven av Michael C. Pierce och Robert K. Ware,
+ Colorado School of Mines med idéer från Charles Smith,
+ Colorado State University. E-post: bware@mines.colorado.edu.
+
+ Modifierad för Vim av Bram Moolenaar.
+ Översatt av Johan Svedberg <johan@svedberg.com>
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.tr.iso9 b/runtime/tutor/tutor.tr.iso9
new file mode 100644
index 0000000..601b54a
--- /dev/null
+++ b/runtime/tutor/tutor.tr.iso9
@@ -0,0 +1,981 @@
+================================================================================
+= V I M T u t o r ' a h o g e l d i n i z ! -- Srm 1.7 =
+================================================================================
+
+ Vim, byle bir eitmen ile aklanmas gereken ok fazla komut barndran,
+ olduka kuvvetli bir metin dzenleyicidir. Bu eitmen Vim'i ok amal bir
+ dzenleyici olarak kolaylkla kullanabileceiniz yeterli sayda komutu
+ aklamak iin tasarlanmtr.
+
+ Eitmeni tamamlama sresi yapacanz denemelere bal olarak 25-30
+ dakikadr.
+
+ DKKAT:
+ Derslerdeki komutlar bu metni deitirecektir. zerinde almak iin
+ bu dosyann bir kopyasn aln (eer "vimtutor" uygulamasn
+ altrdysanz zaten bir kopyasn alm oldunuz).
+
+ Bu eitmenin kullanarak retmek iin tasarlandn unutmamak nemlidir.
+ Bu u anlama gelir; komutlar renmek iin doru bir ekilde altrma-
+ nz gerekir. Eer sadece yazlanlar okursanz komutlar unutursunuz.
+
+ imdi Caps Lock dmenizin basl olmadna emin olun ve Ders 1.1'in
+ ekran tamamen doldurmas iin j dmesine yeterli miktarda basn.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.1: MLEC HAREKET ETTRMEK
+
+
+evirmen Notu: Tm derslerde <ENTER> grdnzde bu dmeye basn.
+
+ ** mleci hareket ettirmek iin h,j,k,l dmelerine basn. **
+ ^
+ k pucu: h dmesi soldadr ve sola doru hareket eder.
+ < h l > l dmesi sadadr ve saa doru hareket eder.
+ j j dmesi aa doru bir oka benzer.
+ v
+
+ 1. mleci kendinizi rahat hissedinceye dek ekranda dolatrn.
+
+ 2. j dmesine basn ve ekrann aaya kaydn grn.
+
+ 3. Aa dmesini kullanarak, Ders 1.2'ye gein.
+
+ NOT: Eer yazdnz bir eyden emin deilseniz, Normal kipe gemek iin
+ <ESC> dmesine basn. Daha sonra istediiniz komutu yeniden yazn.
+
+ NOT: Ok dmeleri de ayn ie yarar. Ancak hjkl dmelerini kullanarak ok
+ daha hzl hareket edebilirsiniz. Gerekten.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.2: VM'DEN IKI
+
+
+ !! NOT: Aadaki admlar yapmadan nce, bu dersi tamamen okuyun.
+
+ 1. Normal kipte olduunuzdan emin olmak iin <ESC> dmesine basn.
+
+ 2. :q! yazn ve <ENTER>'a basn'.
+ Bu dzenleyiciden kar ve yaptnz deiiklikleri KAYDETMEZ.
+
+ 3. vimtutor yazarak yeniden bu belgeyi an.
+
+ 4. Eer bu admlar ezberlediyseniz ve kendinizden eminseniz, 1'den 3'e
+ kadar olan admlar yeniden uygulayn.
+
+ 5. mleci Ders 1.3'e tayn.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.3: METN DZENLEME - METN SLME
+
+
+ ** Normal kipteyken imlecin altndaki karakteri silmek iin x'e basn. **
+
+ 1. mleci aada ---> ile imlenmi satra gtrn.
+
+ 2. Dzeltmeler iin imleci silinmesi gereken karakterin zerine getirin.
+
+ 3. stenmeyen karakteri silmek iin x dmesine basn.
+
+ 4. Tmce dzelene kadar 2'den 4'e kadar olan admlar tekrar edin.
+
+---> inek ayyn zzerinden attlad.
+
+ 5. imdi satr dzeldi; Ders 1.4'e gein.
+
+ NOT: Bu eitmende ilerledike ezberlemeye almayn, deneyerek renin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.4: METN DZENLEME - METN GRME
+
+
+ ** Normal kipteyken metin eklemek iin i'ye basn. **
+
+ 1. mleci aada ---> ile imlenmi LK satra gtrn.
+
+ 2. lk satr ikincisinin ayns gibi yapmak iin, imleci eklenmesi
+ gereken metinden sonraki ilk karakterin zerine gtrn.
+
+ 3. i'ye basn ve gerekli eklemeleri yapn.
+
+ 4. Dzeltilen her hatadan sonra <ESC> dmesine basarak Normal kipe dnn.
+ Tmceyi dzeltmek iin 2'den 4'e kadar olan admlar tekrar edin.
+
+---> Bu metinde eksk.
+---> Bu metinde bir ey eksik.
+
+ 5. Artk yapabildiinizi dnyorsanz bir sonraki blme gein.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.5: METN DZENLEME - METN EKLEME
+
+
+ ** Metin eklemek iin A dmesine basn. **
+
+ 1. mleci aada ---> ile imlenmi LK satra gtrn. mlecin hangi
+ karakterin zerinde olduu nemli deildir.
+
+ 2. A'ya basn ve gerekli eklemeleri yapn.
+
+ 3. Metin eklemeyi bitirdiinizde <ESC>'ye basn ve Normal kipe dnn.
+
+ 4. mleci aada ---> ile imlenmi KNC satra gtrn ve ikinci ve
+ nc admlar tekrarlayarak tmceyi dzeltin.
+
+---> Bu satrda baz met
+ Bu satrda baz metinler eksik.
+---> Bu satrda da baz metinl
+ Bu satrda da baz metinler eksik gibi grnyor.
+
+ 5. Artk rahata metin ekleyebildiinizi dnyorsanz Ders 1.6'ya gein.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.6: DOSYA DZENLEME
+
+
+ ** :wq yazmak ak olan dosyay kaydeder ve Vim'den kar.
+
+ !! NOT: Aadaki admlar uygulamadan nce tm bu blm iyice okuyun!
+
+ 1. Bu eitmeni Ders 1.2'de yaptnz gibi :q! yazarak kapatn. Veya baka
+ bir ubirime eriiminiz varsa orada yapn.
+
+ 2. Komut istemi ekrannda u komutu girin: vim tutor <ENTER>. 'vim', Vim
+ dzenleyicisini amak iin kullanacanz komut olup 'tutor' da
+ dzenlemek istediiniz dosyann addr. Deitirilebilen bir dosya
+ kullann.
+
+ 3. Daha nceki derslerde rendiiniz gibi metin girip/ekleyip silin.
+
+ 4. :wq <ENTER> yazarak deiiklikleri kaydedin ve Vim'den kn.
+
+ 5. Eer vimtutor'dan birinci admda ktysanz yeniden an ve aadaki
+ zet blme gelin.
+
+ 6. Yukardaki admlar okuduktan ve anladktan sonra YAPIN.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1: ZET
+
+
+ 1. mle ok dmeleri veya hjkl dmeleri kullanlarak hareket ettirilir.
+
+ h (sol) / j (aa) / k (yukar) / l (sa)
+
+ 2. Vim'i komut isteminden balatmak iin:
+
+ vim <ENTER>
+ veya
+ vim DOSYA_ADI <ENTER> kullann.
+
+ 3. Vim'den kmak iin nce <ESC>'ye basp sonra:
+
+ :q! <ENTER> (deiiklikleri kaydetmeden kar)
+ :wq <ENTER> (deiiklikleri kaydedip kar) komutlarn kullann.
+
+ 4. mlecin zerinde olduu karakteri silmek iin x dmesine basn.
+
+ 5. Metin girmek veya eklemek iin:
+
+ i metin girin <ESC> imleten nce girer
+ A metin girin <ESC> satrdan sonra ekler
+
+ NOT: <ESC> dmesine basmak sizi Normal kipe geri dndrr veya istenmeyen
+ veya yarm yazlm bir komutu iptal eder.
+
+ imdi Ders 2 ile bu eitmeni srdrn.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.1: SLME KOMUTLARI
+
+
+ ** Bir szc silmek iin dw yazn. **
+
+ 1. Normal kipte olduunuzdan emin olmak iin <ESC> dmesine basn.
+
+ 2. mleci aada ---> ile imlenmi satra gtrn.
+
+ 3. mleci silinmesi gereken szcn bana gtrn.
+
+ 4. Szc silmek iin dw yazn.
+
+ NOT: d harfi siz yazdka ekrann son satrnda grlecektir. Vim sizin w
+ yazmanz bekleyecektir. Eer d'den baka bir ey grrseniz yanl
+ yazmsnz demektir, <ESC> dmesine basn ve batan balayn.
+
+---> Bu satrda erez tmceye ait olmayan leblebi szckler var.
+
+ 5. Tmce dzelene kadar adm 3 ve 4' tekrar edin ve Ders 2.2'ye gein.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.2: DAHA FAZLA SLME KOMUTLARI
+
+
+ ** Satr sonuna kadar silmek iin d$ yazn. **
+
+ 1. Normal kipte olduunuzdan emin olmak iin <ESC> dmesine basn.
+
+ 2. mleci aada ---> ile imlenmi satra gtrn.
+
+ 3. mleci doru olan satrn sonuna gtrn. (Birinci noktadan SONRAK)
+
+ 4. Satr en sona kadar silmek iin d$ yazn. $ imini yazmak iin:
+
+ Trke Q klavyede <ALT GR> 4,
+ Trke F klavyede <SHIFT> 4 ikililerini kullann.
+
+---> Birileri bu satrn sonunu iki defa yazm. satrn sonunu iki
+ defa yazm.
+
+ 5. Neler olduunu anlamak iin Ders 2.3'e gidin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.3: LELER VE HAREKETLER
+
+
+ Metin deitiren birok komut ileler ve eklerden oluur. Bir d ileci
+ ieren silme komutu iin kullanlan biim aadaki gibidir:
+
+ d hareket
+
+ Burada:
+
+ d - silme ilecidir.
+ hareket - ilecin neyi ileteceidir (aada listelenmitir).
+
+ Hareketlerin ksa bir listesi iin:
+
+ w - bir sonraki szcn balangcna kadar, ilk karakteri DAHL OLMADAN
+ e - u anki szcn sonuna kadar, son karakteri DAHL OLARAK
+ $ - satrn sonuna kadar, son karakteri DAHL OLARAK
+
+ Demeli ki, de komutunu girmek imleten szcn sonuna kadar siler.
+
+ NOT: Normal kipte hibir hareket olmadan yalnzca ileci girmek imleci
+ yukarda belirtildii gibi hareket ettirir.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.4: BR HAREKET LE BRLKTE SAYIM KULLANMAK
+
+
+ ** Bir hareketten nce say kullanmak o hareketi sayca tekrarlatr. **
+
+ 1. mleci aada ---> ile imlenmi satrn BAINA gtrn.
+
+ 2. 2w yazarak imleci iki szck ileriye tayn.
+
+ 3. 3e yazarak imleci szck ilerideki szcn sonuna tayn.
+
+ 4. 0 yazarak imleci satrn bana tayn.
+
+ 5. kinci ve nc admlar deiik saylar kullanarak tekrarlayn.
+
+---> Bu zerinde hoplayp zplayabileceiniz naizane bir satr.
+
+ 6. Ders 2.5'e gein.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.5: BR SAYIM KULLANARAK DAHA FAZLA SLME LEM
+
+
+ ** Bir ile ile birlikte say kullanmak ileci o kadar tekrarlatr. **
+
+ Yukarda sz edilen silme ileci ve hareketinin arasna say ekleyerek
+ yaplan ilemi o say kadar tekrarlatabilirsiniz.
+
+ d [say] hareket
+
+ 1. mleci aada ---> ile imlenen satrdaki ilk BYK HARFTEN oluan
+ szcn bana getirin.
+
+ 2. d2w yazarak iki BYK HARFL szc silin.
+
+ 3. Birinci ve ikinci admlar baka bir say kullanarak BYK
+ HARFL szckleri tek bir komutta silmek iin yeniden uygulayn.
+
+---> Bu ABC DE satrdaki FG HI JKLM NO PRST szckler U VY temizlenmitir.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.6: SATIRLARDA LEM YAPMA
+
+
+ ** Btn bir satr silmek iin dd yazn. **
+
+ Btn bir satr silme ilemi ok sk kullanldndan dolay, Vi
+ tasarmclar bir satr tamamen silmek iin iki d yazmann daha kolay
+ olduuna karar vermiler.
+
+ 1. mleci aadaki tmceciin ikinci satrna gtrn.
+
+ 2. Satr silmek iin dd yazn.
+
+ 3. imdi de drdnc satra gidin.
+
+ 4. ki satr birden silmek iin 2dd yazn.
+
+---> 1) Gller krmzdr,
+---> 2) amur elenceli,
+---> 3) Menekeler mavi,
+---> 4) Bir arabam var,
+---> 5) Saat zaman syler,
+---> 6) eker tatldr
+---> 7) Ve sen de ylesin
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.7: GER AL KOMUTU
+
+
+ ** Komutu geri almak iin u, btn bir satr dzeltmek iin U yazn. **
+
+ 1. mleci aada ---> ile imlenmi satrda ve ilk hatann zerine koyun.
+
+ 2. lk istenmeyen karakteri silmek iin x yazn.
+
+ 3. imdi son altrlan komutu geri almak iin u yazn.
+
+ 4. Bu sefer x komutunu kullanarak satrdaki tm hatalar dzeltin.
+
+ 5. imdi satr ilk haline evirmek iin byk U yazn.
+
+ 6. imdi U ve daha nceki komutlar geri almak iin birka defa u yazn.
+
+ 7. Birka defa <CTRL> R (<CTRL>'yi basl tutarken R ye basn) yazarak
+ geri almalar da geri aln.
+
+---> Buu satrdaki hatalar dzeltinn ve sonra koomutu geri allln.
+
+ 8. Bunlar son derece kullanl komutlardr. imdi Ders 2 zete gein.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2: ZET
+
+
+ 1. mleten itibaren bir szc silmek iin dw yazn.
+
+ 2. mleten itibaren bir satr silmek iin d$ yazn.
+
+ 3. Btn bir satr silmek iin dd yazn.
+
+ 4. Bir hareketi yenilemek iin nne say taks getirin, 2w gibi.
+
+ 5. Normal kipte bir komut biimi yledir:
+
+ ile [say] hareket
+
+ burada:
+ ile - ne yaplaca, silmek iin d rneinde olduu gibi
+ [say] - komutun ka kere tekrar edeceini gsteren istee bal say
+ hareket - ilecin nice davranaca, w (szck), $ (satr sonu) gibi
+
+ 6. Bir satrn bana gelmek iin sfr (0) kullann.
+
+ 7. nceki hareketleri geri almak iin u (kk u) yazn.
+ Bir satrdaki tm deiiklikleri geri almak iin U (byk U) yazn.
+ Geri almalar geri almak iin <CTRL> R kullann.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3.1: KOY KOMUTU
+
+
+ ** Son yaptnz silmeyi imleten sonraya yerletirmek iin p yazn. **
+
+ 1. mleci aada ---> ile imlenmi tmcecie gtrn.
+
+ 2. Satr silip Vim'in arabelleine yerletirmek iin dd yazn.
+
+ 3. mleci, silinmi satr nereye yerletirmek istiyorsanz, o satrn
+ ZERNE gtrn.
+
+ 4. Normal kipteyken satr yerletirmek iin p yazn.
+
+ 5. Tm satrlar doru sraya koymak iin 2'den 4'e kadar olan admlar
+ tekrar edin.
+
+---> d) Sen de rendin mi?
+---> b) Menekeler mavidir,
+---> c) Akl renilir,
+---> a) Gller krmzdr,
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3.2: DETR KOMUTU
+
+
+ ** mlecin altndaki karakteri bakas ile deitirmek iin rx yapn. **
+
+ 1. mleci aada ---> ile imlenmi LK satra gtrn.
+
+ 2. mleci satrdaki ilk hatann zerine gtrn.
+
+ 3. Hatay dzeltmek iin nce r ardndan da doru karakteri yazn.
+
+ 4. lk satr dzelene kadar adm 2 ve 3' tekrar edin.
+
+---> Bu satv yazlvken, bivileri yaml dmetere basm.
+---> Bu satr yazlrken, birileri yanl dmelere basm.
+
+ 5. Ders 3.3'ye gein.
+
+ NOT: Unutmayn, ezberleyerek deil deneyerek renin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3.3: DETR LEC
+
+
+ ** Bir szc imleten szck sonuna kadar deitirmek iin ce yapn. **
+
+ 1. mleci aada ---> ile imlenmi LK satra gtrn.
+
+ 2. mleci "sutar" daki u'nun zerine yerletirin.
+
+ 3. nce ce ardndan doru harfleri girin (bu durumda 'atr').
+
+ 4. <ESC> dmesine basn ve deimesi gereken bir sonraki karaktere gidin.
+
+ 5. lk cmle ikincisiyle ayn olana kadar adm 3 ve 4' tekrar edin.
+
+---> Bu sutar deitir komutu ile deineli gereken birka mzg ieriyor.
+---> Bu satr deitir komutu ile deimesi gereken birka szck ieriyor.
+
+ ce'nin sadece szc deitirmediini, ayn zamanda sizi EKLE kipine
+ aldna da dikkat edin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3.4: c'Y KULLANARAK DAHA FAZLA DETRME
+
+
+ ** Deitir ileci sil komutu ile ayn hareketlerle kullanlr. **
+
+ 1. Deitir ileci sil ile ayn yolla alr. Biim yledir:
+
+ c [say] hareket
+
+ 2. Hareketler de ayndr. rnein w (szck), $ (satr sonu) gibi.
+
+ 3. mleci aada ---> ile imlenmi LK satra gtrn.
+
+ 4. mleci ilk hataya gtrn.
+
+ 5. Satrn geri kalan ksmn ikincisi gibi yapmak iin c$ yazn ve daha
+ sonra <ESC> dmesine basn.
+
+---> Bu satrn sonu dzeltilmek iin biraz yardma ihtiya duyuyor.
+---> Bu satrn sonu dzeltilmek iin c$ komutu kullanlarak yardma ihtiya
+ duyuyor.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3: ZET
+
+
+ 1. Silinmi olan bir metni geri yerletirmek iin p yazn. Bu silinmi
+ metni imleten hemen SONRA geri yerletirir (eer bir satr silinmise
+ hemen imlecin altndaki satra yerletirilecektir).
+
+ 2. mlecin altndaki karakteri deitirmek iin nce r ardndan da
+ yazmak istediiniz karakteri yazn.
+
+ 3. Deitir ileci belirlenen nesneyi, imleten hareketin sonuna kadar
+ deitirme imkan verir. rnein, bir szc imleten szck sonuna
+ kadar deitirmek iin cw, bir satrn tamamn deitirmek iinse c$
+ yazn.
+
+ 4. Deitir iin biim yledir:
+
+ c [say] hareket
+
+ imdi bir sonraki derse gein.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4.1: MLE KONUMU VE DOSYA DURUMU
+
+
+** <CTRL> G dosya ierisindeki konumunuzu ve dosya durumunu gsterir. Dosya
+ ierisindeki bir satra gitmek iin G yazn. **
+
+ NOT: Admlardan herhangi birini yapmadan nce dersin tamamn okuyun!
+
+ 1. <CTRL> dmesini basl tutun ve g'ye basn. Biz buna <CTRL> G diyoruz.
+ Dosyann sonunda dosya adn ve bulunduunuz konumu gsteren bir durum
+ satr grnecektir. Adm 3 iin satr numarasn unutmayn.
+
+ NOT: mle konumunu ekrann sa alt kesinde grebilirsiniz. Bu 'ruler'
+ seenei etkin olduunda grlr (bilgi iin :help 'ruler' yazn).
+
+ 2. Dosyann sonuna gitmek iin G'ye basn. Dosyann bana gitmek iin
+ gg komutunu kullann.
+
+ 3. Daha nce bulunduunuz satr numarasn yazn ve daha sonra G'ye
+ basn. Bu sizi ilk <CTRL> g'ye bastnz satra geri gtrecektir.
+
+ 4. Yapabileceinizi dndnzde, adm 1'den 3'e kadar yapn.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4.2: ARAMA KOMUTU
+
+
+ ** Bir szck beini aramak iin / ve aranacak bei girin. **
+
+ 1. Normal kipteyken / yazn. / karakterinin ve imlecin ekrann sonunda
+ grndne dikkat edin.
+
+ 2. 'hatttaa' yazp <ENTER>'a basn. Bu sizin aramak istediiniz szcktr.
+
+ 3. Ayn szck beini tekrar aramak iin n yazn.
+ Ayn szck beini zt ynde aramak iin N yazn.
+
+ 4. Eer zt yne doru bir arama yapmak istiyorsanz / komutu yerine ?
+ komutunu kullann.
+
+---> "hatttaa" hatay yazmann doru yolu deil; hatttaa bir hata.
+
+Not: Arama dosyann sonuna ulatnda dosyann bandan srecektir. Bunu
+ devre d brakmak iin 'wrapscan' seeneini sfrlayn.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4.3: UYAN AYRALAR ARAMASI
+
+
+ ** Uyan bir (, [ veya { bulmak iin % yazn. **
+
+ 1. mleci aada ---> ile imlenmi satrda bir (, [ veya { imine gtrn.
+
+ 2. imdi % karakterini yazn.
+
+ 3. mle uyan ayracn zerine gider.
+
+ 4. Uyan ilk parantezin zerine geri dnmek iin yine % yazn.
+
+ 5. mleci baka bir (), [] veya {} zerine gtrn ve % ilecinin neler
+ yaptn gzlemleyin.
+
+---> Bu ierisinde ( )'ler, ['ler ] ve {'ler } bulunan bir satrdr.
+
+ NOT: Bu ierisinde ei olmayan ayralar bulunan bir programn hatalarn
+ ayklamak iin son derece yararldr.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4.4: BUL/DETR KOMUTU
+
+
+ ** 'eski' yerine 'yeni' yerletirmek iin :s/eski/yeni/g yazn. **
+
+ 1. mleci aada ---> ile imlenmi satra gtrn.
+
+ 2. :s/buu/bu yazp <ENTER>'a basn. Bu komutun sadece satrdaki ilk
+ uyan karlamay dzelttiine dikkat edin.
+
+ 3. imdi satrdaki tm deiiklikleri bir anda yapmak iin :s/buu/bu/g
+ yazarak tm "buu" oluumlarn deitirin.
+
+---> Buu birinci, buu ikinci, buu nc blm.
+
+ 4. ki satr arasndaki tm karakter katar oluumlarn deitirmek iin:
+
+ :#,#s/eski/yeni/g yazn. #,# burada deiikliin yaplaca araln
+ satr numaralardr.
+ :%s/eski/yeni/g yazn. Bu tm dosyadaki her oluumu deitirir.
+ :%s/eski/yeni/gc yazn. Bu tm dosyadaki her oluumu deitirir ancak
+ her birini deitirmeden nce bize sorar.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4: ZET
+
+
+ 1. <CTRL> G sizin dosyadaki konumunuzu ve dosya durumunu gsterir.
+ G dosyann sonuna gider.
+ [say] G belirtilen satr numarasna gider.
+ gg ilk satra gider.
+
+ 2. Szck beinden nce / yazmak, LER ynde o bei aratr.
+ Szck beinden nce ? yazmak, GER ynde o bei aratr.
+ Aramadan sonra, ayn yndeki bir sonraki karlamay bulmak iin n,
+ veya zt yndekini bulmak iin N yazn.
+ <CTRL> O sizi eski konumlara, <CTRL> I daha yeni konumlara gtrr.
+
+ 3. mle bir (), [], {} ayrac zerindeyken % yazmak, uyan dier e
+ ayrac bulur.
+
+ 4. Satrdaki ilk 'eski'yi 'yeni' ile deitirmek iin :s/eski/yeni,
+ Satrdaki tm 'eski'leri 'yeni' ile deitirmek iin :s/eski/yeni/g,
+ ki satr arasndaki bekleri deitirmek iin :#,#s/eski/yeni/g,
+ Dosyadaki tm karlamalar deitirmek iin :%s/eski/yeni/g yazn.
+ Her seferinde onay sormas iin :%s/eski/yeni/gc kullann.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5.1: BIR DI KOMUT ALITIRMAK
+
+
+ ** Bir d komutu altrmak iin :! ve ardndan d komutu yazn. **
+
+ 1. mleci ekrann altna gtrmek iin : komutunu yazn. Bu size bir komut
+ yazma imkan verir.
+
+ 2. imdi ! (nlem) karakterini yazn. Bu size bir d komut altrma
+ olana verir.
+
+ 3. rnek olarak ! karakterini takiben ls yazn ve <ENTER>'a basn. Bu size
+ o anda bulunduunuz dizindeki dosyalar gsterecektir. Veya ls
+ almazsa :!dir komutunu kullann.
+
+ NOT: Herhangi bir d komutu bu yolla altrmak mmkndr.
+
+ NOT: Tm : komutlarndan sonra <ENTER> dmesine baslmaldr. Bundan
+ sonra bunu her zaman anmsatmayacaz.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5.2: DOSYA YAZMAYA DEVAM
+
+
+ ** Dosyaya yaplan deiiklii kaydetmek iin :w DOSYA_ADI yazn. **
+
+ 1. Bulunduunuz dizini listelemek iin :!dir veya :!ls yazn.
+ Komuttan sonra <ENTER> dmesine basacanz zaten biliyorsunuz.
+
+ 2. Mevcut olmayan bir dosya ad sein, rnein DENEME.
+
+ 3. imdi :w DENEME yazn (DENEME sizin setiiniz dosya addr).
+
+ 4. Bu tm dosyay (Vim Tutor) DENEME isminde baka bir dosyaya yazar.
+ Bunu dorulamak iin, :!ls veya :!dir yazn ve yeniden bulunduunuz
+ dizini listeleyin.
+
+ NOT: Eer Vim'den kp kaydettiiniz DENEME dosyasn aarsanz, bunun
+ kaydettiiniz vimtutor'un gerek bir kopyas olduunu grrsnz.
+
+ 5. imdi dosyay u komutlar vererek silin:
+ Windows: :!del DENEME
+ Unix (macOS, Linux, Haiku): :!rm DENEME
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5.3: YAZMA N METN SEME
+
+
+ ** Dosyann bir blmn kaydetmek iin, v hareket :w DOSYA_ADI yazn. **
+
+ 1. mleci bu satrn zerine getirin.
+
+ 2. v dmesine basarak imleci aadaki beinci adma tayn. Metnin
+ seildiine dikkat edin.
+
+ 3. : karakterini yazn. Ekrann alt ksmnda :'<'> kacaktr.
+
+ 4. w DENEME yazn; DENEME burada henz var olmayan bir dosyadr. <ENTER>
+ dmesine basmadan nce :'<'>w DENEME grdnzden emin olun.
+
+ 5. Vim seilen satrlar DENEME dosyasna yazacaktr. :!ls veya :!dir ile
+ bakarak dosyay grn. Henz silmeyin; bir sonraki derste kullanacaz.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5.4: DOSYALARI BRLETRME VE BLM EKLEME
+
+
+ ** Bir dosyann ieriini eklemek iin :r DOSYA_ADI yazn. **
+
+ 1. mleci bu satrn hemen bir stne koyun.
+
+ NOT: kinci admdan sonra Ders 5.3'n metnini greceksiniz.
+ Sonrasnda AAI dmesi ile bu derse geri gelin.
+
+ 2. imdi :r DENEME komutunu kullanarak DENEME dosyasn bu dosyann iine
+ getirin. Getirdiiniz dosya imlecin hemen altna yerletirilir.
+
+ 3. Dosyann getirildiini dorulamak iin YUKARI dmesini kullanarak
+ Ders 5.3'n iki adet kopyas olduunu grn, zgn srm ve kopyas.
+
+ NOT: Bu komutu kullanarak bir d komutun ktsn da dosyann iine
+ koyabilirsiniz. rnein :r !ls yazmak ls komutunun verecei kty
+ dosyann iinde hemen imlecin altndaki satra koyar.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5: ZET
+
+
+ 1. :!komut bir d komut altrr.
+ Baz yararl rnekler:
+ (MS-DOS) (Unix)
+ :!dir :!ls - bir dizini listeler.
+ :!del DOSYA :!rm DOSYA - DOSYA'y siler.
+
+ 2. :w DOSYA_ADI o anki Vim dosyasn diske DOSYA_ADI ile kaydeder.
+
+ 3. v hareket :w DOSYA_ADI seilmi satr araln DOSYA_ADI ile kaydeder.
+
+ 4. :r DOSYA_ADI imlecin altndan balayarak DOSYA_ADI isimli dosyann
+ ieriini ekler.
+
+ 5. :r !dir veya !ls bu iki komutun (dosyalar listeleme) ieriklerini
+ okur ve dosyann iine yerletirir.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.1: A KOMUTU
+
+
+ ** mlecin aasna satr amak ve EKLE kipine gemek iin o yazn. **
+
+ 1. mleci aada ---> ile imlenmi satra gtrn.
+
+ 2. mlecin aasna bir satr amak ve EKLE kipine gemek iin o
+ (kk harfle) yazn.
+
+ 3. imdi herhangi bir metin girin ve EKLE kipinden kmak iin <ESC>
+ dmesine basn.
+
+---> o yazdktan sonra imle EKLE kipinde alan satrn zerine gider.
+
+ 4. mlecin zerinde bir satr amak iin, yalnzca byk O yazn. Bunu
+ aadaki satrda deneyin.
+
+---> Bu satrn zerine bir satr amak iin imle bu satrdayken O yazn.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.2: EKLE KOMUTU
+
+
+ ** mleten sonra metin eklemek iin a yazn. **
+
+ 1. mleci aada ---> ile imlenmi satra gtrn.
+
+ 2. mle satrn sonuna gelinceye dek e dmesine basn.
+
+ 3. mleten SONRA metin eklemek iin a yazn.
+
+ 4. imdi ilk satr ikincisi gibi tamamlayn. EKLE kipinden kmak iin
+ <ESC> dmesine basn.
+
+ 5. e dmesini kullanarak bir sonraki yarm szce gidin ve adm 3 ve 4'
+ tekrarlayn.
+
+---> Bu sat alabilirsiniz. al met ekl
+---> Bu satrda alabilirsiniz. alrken metin eklemeyi kullann.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.3: BR BAKA DETR KOMUTU
+
+
+ ** Birden fazla karakter deitirmek iin byk R yazn. **
+
+ 1. mleci aada ---> ile imlenmi LK satra gtrn. mleci ilk xxx'in
+ bana getirin.
+
+ 2. imdi R dmesine basn ve ikinci satrdaki sayy ilk satrdaki xxx'in
+ yerine yazn.
+
+ 3. <ESC> dmesine basarak DETR kipinden kn. Satrn geri kalannn
+ deimediini gzlemleyin.
+
+ 4. Kalan xxx'i de deitirmek iin admlar tekrarlayn.
+
+---> 123 saysna xxx eklemek size yyy toplamn verir.
+---> 123 saysna 456 eklemek size 579 toplamn verir.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.4: METN KOPYALA VE YAPITIR
+
+
+ ** y ilecini kullanarak metin kopyalayn ve p kullanarak yaptrn. **
+
+ 1. mleci aada ---> ile imlenmi satra getirin, "a)"nn ardna koyun.
+
+ 2. v ile GRSEL kipe gein ve imleci "ilk" szcnn ncesine getirin.
+
+ 3. y dmesine basarak seili metni kopyalayn.
+
+ 4. mleci bir sonraki satrn sonuna j$ ile getirin.
+
+ 5. p dmesine basarak metni yaptrn. Akabinde <ESC> dmesine basn.
+
+ 6. GRSEL kipe geerek "ge" szcn sein, y ile kopyalayn, j$ ile
+ ikinci satrn sonuna gidin ve p ile szc yaptrn.
+
+---> a) Bu ilk ge
+---> b)
+
+ NOT: y komutunu bir ile olarak da kullanabilirsiniz; yw komutu yalnzca
+ bir szc kopyalar.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.4: SET KOMUTU
+
+
+ ** Arama veya deitirme ilemlerinin byk/kk harf durumunu grmezden
+ gelmesi iin SET komutunu kullann.
+
+ 1. 'yoksay' szcn aramak iin /ignore yazn. Bunu n dmesine basarak
+ birka kez yenileyin.
+
+ 2. :set ic yazarak 'ic' (BYK/kk harf yoksay) ayarn sein.
+
+ 3. Yeniden n dmesine basarak 'yoksay' szcn aramay srdrn. Artk
+ YOKSAY ve yoksay rneklerinin de bulunduunu gzlemleyin.
+
+ 4. :set hls is yazarak 'hlsearch' ve 'incsearch' ayarlarn sein.
+
+ 5. /ignore yazarak arama komutunu tekrar verin ve ne olacan grn.
+
+ 6. BYK/kk harf ayrmsz arama ayarn kapatmak iin :set noic yazn.
+
+ NOT: Sonularn ekranda vurgulanmasn istemiyorsanz :nohlsearch yazn.
+ NOT: Eer yalnzca bir arama ilemi iin BYK/kk harf ayrmsz arama
+ yapmak istiyorsanz /ignore\c komutunu kullann.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ DERS 6 ZET
+
+
+ 1. o komutu imlecin altnda bir satr aar ve imleci bu alm satra
+ EKLE kipinde yerletirir.
+ O komutu imlecin zerinde bir satr aar.
+
+ 2. a komutu imleten sonra metin giriine olanak verir.
+ A komutu geerli satrn sonuna giderek metin giriine olanak verir.
+
+ 3. e komutu imleci bir szcn sonuna tar.
+
+ 4. y ileci metni kopyalar, p ileci yaptrr.
+
+ 5. R komutu DETR kipine girer ve <ESC>'ye baslana kadar kalr.
+
+ 6. ":set xxx" yazmak "xxx" seeneini ayarlar. Baz seenekler:
+ 'ic' 'ignorecase' BYK/kk harf ayrmn arama yaparken kapatr.
+ 'is' 'incsearch' Bir arama metninin tm uyan ksmlarn gsterir.
+ 'hls' 'hlsearch' Uyan sonularn zerini vurgular.
+ Ayarlama yaparken ister ksa ister uzun srmleri kullanabilirsiniz.
+
+ 7. Bir ayar kapatmak iin "no" ekleyin, rnein :set noic.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 7.1: YARDIM KAYNAKLARI
+
+
+ ** evrimii yardm sistemini kullann **
+
+ Vim geni bir evrimii yardm sistemine sahiptir. Balamak iin u n
+ deneyebilirsiniz:
+
+ - (eer varsa) <HELP> dmesine basn
+ - (eer varsa) <F1> dmesine basn
+ - :help yazn ve <ENTER> dmesine basn
+
+ Yardm penceresindeki metinleri okuyarak yardm sisteminin nasl
+ altn renin.
+ Bir pencereden dierine gemek iin <CTRL> W ikilisini kullann.
+ Yardm penceresini kapatmak iin :q yazp <ENTER> dmesine basn.
+
+ ":help" komutuna deiken (argman) vererek herhangi bir konu hakknda
+ yardm alabilirsiniz. unlar deneyin:
+
+ :help w
+ :help c_<CTRL> D
+ :help insert-index
+ :help user-manual
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 7.2: BR BALANGI BET OLUTURUN
+
+
+ ** Vim'in zelliklerine bakn **
+
+ Vim Vi'dan ok daha fazla zellie sahiptir fakat birou ntanml olarak
+ kapaldr. Daha fazla zellik kullanabilmek iin bir "vimrc" dosyas
+ oluturmalsnz.
+
+ 1. "vimrc" dosyasn dzenlemeye balayn. letim sistemlerine gre:
+
+ :e ~/.vimrc Unix iin
+ :e ~/_vimrc Windows iin
+
+ 2. imdi rnek "vimrc" dosyas ieriini okuyun:
+
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Dosyay :w ile kaydedin.
+
+ Vim'i bir sonraki altrlmasnda szdizim vurgulamas kullanacaktr.
+ Tm tercih ettiiniz ayarlar bu "vimrc" dosyasna ekleyebilirsiniz.
+ Daha fazla bilgi iin :help vimrc-intro yazn.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 7.3: TAMAMLAMA
+
+
+ ** <CTRL> D ve <TAB> ile komut istemi ekrannda tamamlama **
+
+ 1. :set nocp komutunu kullanarak Vim'in uyumlu kipte olmadndan
+ emin olun.
+
+ 2. Bulunduunuz dizindeki dosyalara :!ls veya :!dir ile bakn.
+
+ 3. Bir komutun ba ksmn yazn, rnein :e.
+
+ 4. <CTRL> D'ye bastnzda Vim size e ile balayan komutlar
+ gsterecektir.
+
+ 5. d <TAB> kullandnzda Vim komutu kendinden :edit olarak
+ tamamlayacaktr.
+
+ 6. imdi bir boluk ekleyin ve var olan bir dosyann ba harflerini yazn.
+ rnein :edit DOS.
+
+ 7. <TAB> dmesine basn. Eer yalnzca bu dosyadan bir tane varsa Vim
+ sizin iin dosya adnn geri kalann tamamlayacaktr.
+
+ NOT: Tamamlama birok komut iin alr. Yalnzca <CTRL> D ve <TAB>
+ ikililerini deneyin. zellikle :help iin ok yararldr.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 7: ZET
+
+
+ 1. :help yazmak veya <F1> veya <HELP> dmelerine basmak yardm
+ penceresini aar.
+
+ 2. :help cmd yazarak cmd hakknda bilgi sahibi olabilirsiniz.
+
+ 3. <CTRL> W kullanarak baka pencerelere geebilirsiniz.
+
+ 4. :q kullanarak yardm penceresini kapatabilirsiniz.
+
+ 5. Bir vimrc balang betii oluturarak yelenen ayarlarnz
+ saklayabilirsiniz.
+
+ 6. Bir : komutu girerken <CTRL> D'ye basarak olanakl tamamlama
+ seeneklerini grebilirsiniz. <TAB>'a basarak tamamlamay sein.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Bylece Vim Eitmeni tamamlanm oldu. Eitmendeki ama Vim dzenleyicisi
+ hakknda ksa bir bilgi vermek ve onu kolayca kullanmanz salamakt.
+ Vim'in tamamn retmek ok zordur zira Vim birok komuta sahiptir.
+ Bundan sonra ":help user-manual" komutu ile kullanc klavuzunu
+ okumalsnz.
+
+ Daha fazla okuma ve alma iin u kitab neriyoruz:
+
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+
+ Tmyle Vim iin hazrlanm ilk kitaptr. zellikle ilk kullanclar iin
+ ok uygundur.
+ Kitapta birok rnek ve resim bulunmaktadr.
+ https://iccf-holland.org/click5.html adresine bakabilirsiniz.
+
+ Bu kitap daha eskidir ve Vim'den daha ok Vi iindir ancak tavsiye edilir:
+
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+
+ Vi hakknda bilmek isteyeceiniz neredeyse her eyin bulunduu bir kitap.
+ 6. Basm ayn zamanda Vim hakknda da bilgi iermektedir.
+
+ Bu eitmen Michael C. Pierce ve Robert K. Ware tarafndan yazld,
+ Charles Smith tarafndan salanan fikirlerle Colorado School Of Mines,
+ Colorado State University. E-posta: bware@mines.colorado.edu
+
+ Vim iin deitiren: Bram Moolenaar
+
+ Trke eviri:
+ Serkan "heartsmagic" al (2005), adresimeyaz (at) yahoo (dot) com
+
+ 2019 Gncelleme:
+ Emir SARI, bitigchi (at) me (dot) com
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.tr.utf-8 b/runtime/tutor/tutor.tr.utf-8
new file mode 100644
index 0000000..95a7c80
--- /dev/null
+++ b/runtime/tutor/tutor.tr.utf-8
@@ -0,0 +1,981 @@
+================================================================================
+= V I M T u t o r ' a h o ş g e l d i n i z ! -- Sürüm 1.7 =
+================================================================================
+
+ Vim, böyle bir eğitmen ile açıklanması gereken çok fazla komut barındıran,
+ oldukça kuvvetli bir metin düzenleyicidir. Bu eğitmen Vim'i çok amaçlı bir
+ düzenleyici olarak kolaylıkla kullanabileceğiniz yeterli sayıda komutu
+ açıklamak için tasarlanmıştır.
+
+ Eğitmeni tamamlama süresi yapacağınız denemelere bağlı olarak 25-30
+ dakikadır.
+
+ DİKKAT:
+ Derslerdeki komutlar bu metni değiştirecektir. Üzerinde çalışmak için
+ bu dosyanın bir kopyasını alın (eğer "vimtutor" uygulamasını
+ çalıştırdıysanız zaten bir kopyasını almış oldunuz).
+
+ Bu eğitmenin kullanarak öğretmek için tasarlandığını unutmamak önemlidir.
+ Bu şu anlama gelir; komutları öğrenmek için doğru bir şekilde çalıştırma-
+ nız gerekir. Eğer sadece yazılanları okursanız komutları unutursunuz.
+
+ Şimdi Caps Lock düğmenizin basılı olmadığına emin olun ve Ders 1.1'in
+ ekranı tamamen doldurması için j düğmesine yeterli miktarda basın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.1: İMLECİ HAREKET ETTİRMEK
+
+
+Çevirmen Notu: Tüm derslerde <ENTER> gördüğünüzde bu düğmeye basın.
+
+ ** İmleci hareket ettirmek için h,j,k,l düğmelerine basın. **
+ ^
+ k İpucu: h düğmesi soldadır ve sola doğru hareket eder.
+ < h l > l düğmesi sağdadır ve sağa doğru hareket eder.
+ j j düğmesi aşağı doğru bir oka benzer.
+ v
+
+ 1. İmleci kendinizi rahat hissedinceye dek ekranda dolaştırın.
+
+ 2. j düğmesine basın ve ekranın aşağıya kaydığını görün.
+
+ 3. Aşağı düğmesini kullanarak, Ders 1.2'ye geçin.
+
+ NOT: Eğer yazdığınız bir şeyden emin değilseniz, Normal kipe geçmek için
+ <ESC> düğmesine basın. Daha sonra istediğiniz komutu yeniden yazın.
+
+ NOT: Ok düğmeleri de aynı işe yarar. Ancak hjkl düğmelerini kullanarak çok
+ daha hızlı hareket edebilirsiniz. Gerçekten.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.2: VİM'DEN ÇIKIŞ
+
+
+ !! NOT: Aşağıdaki adımları yapmadan önce, bu dersi tamamen okuyun.
+
+ 1. Normal kipte olduğunuzdan emin olmak için <ESC> düğmesine basın.
+
+ 2. :q! yazın ve <ENTER>'a basın'.
+ Bu düzenleyiciden çıkar ve yaptığınız değişiklikleri KAYDETMEZ.
+
+ 3. vimtutor yazarak yeniden bu belgeyi açın.
+
+ 4. Eğer bu adımları ezberlediyseniz ve kendinizden eminseniz, 1'den 3'e
+ kadar olan adımları yeniden uygulayın.
+
+ 5. İmleci Ders 1.3'e taşıyın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.3: METİN DÜZENLEME - METİN SİLME
+
+
+ ** Normal kipteyken imlecin altındaki karakteri silmek için x'e basın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş satıra götürün.
+
+ 2. Düzeltmeler için imleci silinmesi gereken karakterin üzerine getirin.
+
+ 3. İstenmeyen karakteri silmek için x düğmesine basın.
+
+ 4. Tümce düzelene kadar 2'den 4'e kadar olan adımları tekrar edin.
+
+---> İinek ayyın üzzerinden attladı.
+
+ 5. Şimdi satır düzeldi; Ders 1.4'e geçin.
+
+ NOT: Bu eğitmende ilerledikçe ezberlemeye çalışmayın, deneyerek öğrenin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.4: METİN DÜZENLEME - METİN GİRME
+
+
+ ** Normal kipteyken metin eklemek için i'ye basın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş İLK satıra götürün.
+
+ 2. İlk satırı ikincisinin aynısı gibi yapmak için, imleci eklenmesi
+ gereken metinden sonraki ilk karakterin üzerine götürün.
+
+ 3. i'ye basın ve gerekli eklemeleri yapın.
+
+ 4. Düzeltilen her hatadan sonra <ESC> düğmesine basarak Normal kipe dönün.
+ Tümceyi düzeltmek için 2'den 4'e kadar olan adımları tekrar edin.
+
+---> Bu metinde eksk.
+---> Bu metinde bir şey eksik.
+
+ 5. Artık yapabildiğinizi düşünüyorsanız bir sonraki bölüme geçin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.5: METİN DÜZENLEME - METİN EKLEME
+
+
+ ** Metin eklemek için A düğmesine basın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş İLK satıra götürün. İmlecin hangi
+ karakterin üzerinde olduğu önemli değildir.
+
+ 2. A'ya basın ve gerekli eklemeleri yapın.
+
+ 3. Metin eklemeyi bitirdiğinizde <ESC>'ye basın ve Normal kipe dönün.
+
+ 4. İmleci aşağıda ---> ile imlenmiş İKİNCİ satıra götürün ve ikinci ve
+ üçüncü adımları tekrarlayarak tümceyi düzeltin.
+
+---> Bu satırda bazı met
+ Bu satırda bazı metinler eksik.
+---> Bu satırda da bazı metinl
+ Bu satırda da bazı metinler eksik gibi görünüyor.
+
+ 5. Artık rahatça metin ekleyebildiğinizi düşünüyorsanız Ders 1.6'ya geçin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1.6: DOSYA DÜZENLEME
+
+
+ ** :wq yazmak açık olan dosyayı kaydeder ve Vim'den çıkar.
+
+ !! NOT: Aşağıdaki adımları uygulamadan önce tüm bu bölümü iyice okuyun!
+
+ 1. Bu eğitmeni Ders 1.2'de yaptığınız gibi :q! yazarak kapatın. Veya başka
+ bir uçbirime erişiminiz varsa orada yapın.
+
+ 2. Komut istemi ekranında şu komutu girin: vim tutor <ENTER>. 'vim', Vim
+ düzenleyicisini açmak için kullanacağınız komut olup 'tutor' da
+ düzenlemek istediğiniz dosyanın adıdır. Değiştirilebilen bir dosya
+ kullanın.
+
+ 3. Daha önceki derslerde öğrendiğiniz gibi metin girip/ekleyip silin.
+
+ 4. :wq <ENTER> yazarak değişiklikleri kaydedin ve Vim'den çıkın.
+
+ 5. Eğer vimtutor'dan birinci adımda çıktıysanız yeniden açın ve aşağıdaki
+ özet bölüme gelin.
+
+ 6. Yukarıdaki adımları okuduktan ve anladıktan sonra YAPIN.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 1: ÖZET
+
+
+ 1. İmleç ok düğmeleri veya hjkl düğmeleri kullanılarak hareket ettirilir.
+
+ h (sol) / j (aşağı) / k (yukarı) / l (sağ)
+
+ 2. Vim'i komut isteminden başlatmak için:
+
+ vim <ENTER>
+ veya
+ vim DOSYA_ADI <ENTER> kullanın.
+
+ 3. Vim'den çıkmak için önce <ESC>'ye basıp sonra:
+
+ :q! <ENTER> (değişiklikleri kaydetmeden çıkar)
+ :wq <ENTER> (değişiklikleri kaydedip çıkar) komutlarını kullanın.
+
+ 4. İmlecin üzerinde olduğu karakteri silmek için x düğmesine basın.
+
+ 5. Metin girmek veya eklemek için:
+
+ i metin girin <ESC> imleçten önce girer
+ A metin girin <ESC> satırdan sonra ekler
+
+ NOT: <ESC> düğmesine basmak sizi Normal kipe geri döndürür veya istenmeyen
+ veya yarım yazılmış bir komutu iptal eder.
+
+ Şimdi Ders 2 ile bu eğitmeni sürdürün.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.1: SİLME KOMUTLARI
+
+
+ ** Bir sözcüğü silmek için dw yazın. **
+
+ 1. Normal kipte olduğunuzdan emin olmak için <ESC> düğmesine basın.
+
+ 2. İmleci aşağıda ---> ile imlenmiş satıra götürün.
+
+ 3. İmleci silinmesi gereken sözcüğün başına götürün.
+
+ 4. Sözcüğü silmek için dw yazın.
+
+ NOT: d harfi siz yazdıkça ekranın son satırında görülecektir. Vim sizin w
+ yazmanızı bekleyecektir. Eğer d'den başka bir şey görürseniz yanlış
+ yazmışsınız demektir, <ESC> düğmesine basın ve baştan başlayın.
+
+---> Bu satırda çerez tümceye ait olmayan leblebi sözcükler var.
+
+ 5. Tümce düzelene kadar adım 3 ve 4'ü tekrar edin ve Ders 2.2'ye geçin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.2: DAHA FAZLA SİLME KOMUTLARI
+
+
+ ** Satırı sonuna kadar silmek için d$ yazın. **
+
+ 1. Normal kipte olduğunuzdan emin olmak için <ESC> düğmesine basın.
+
+ 2. İmleci aşağıda ---> ile imlenmiş satıra götürün.
+
+ 3. İmleci doğru olan satırın sonuna götürün. (Birinci noktadan SONRAKİ)
+
+ 4. Satırı en sona kadar silmek için d$ yazın. $ imini yazmak için:
+
+ Türkçe Q klavyede <ALT GR> 4,
+ Türkçe F klavyede <SHIFT> 4 ikililerini kullanın.
+
+---> Birileri bu satırın sonunu iki defa yazmış. satırın sonunu iki
+ defa yazmış.
+
+ 5. Neler olduğunu anlamak için Ders 2.3'e gidin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.3: İŞLEÇLER VE HAREKETLER
+
+
+ Metin değiştiren birçok komut işleçler ve eklerden oluşur. Bir d işleci
+ içeren silme komutu için kullanılan biçim aşağıdaki gibidir:
+
+ d hareket
+
+ Burada:
+
+ d - silme işlecidir.
+ hareket - işlecin neyi işleteceğidir (aşağıda listelenmiştir).
+
+ Hareketlerin kısa bir listesi için:
+
+ w - bir sonraki sözcüğün başlangıcına kadar, ilk karakteri DAHİL OLMADAN
+ e - şu anki sözcüğün sonuna kadar, son karakteri DAHİL OLARAK
+ $ - satırın sonuna kadar, son karakteri DAHİL OLARAK
+
+ Demeli ki, de komutunu girmek imleçten sözcüğün sonuna kadar siler.
+
+ NOT: Normal kipte hiçbir hareket olmadan yalnızca işleci girmek imleci
+ yukarıda belirtildiği gibi hareket ettirir.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.4: BİR HAREKET İLE BİRLİKTE SAYIM KULLANMAK
+
+
+ ** Bir hareketten önce sayı kullanmak o hareketi sayıca tekrarlatır. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş satırın BAŞINA götürün.
+
+ 2. 2w yazarak imleci iki sözcük ileriye taşıyın.
+
+ 3. 3e yazarak imleci üç sözcük ilerideki sözcüğün sonuna taşıyın.
+
+ 4. 0 yazarak imleci satırın başına taşıyın.
+
+ 5. İkinci ve üçüncü adımları değişik sayılar kullanarak tekrarlayın.
+
+---> Bu üzerinde hoplayıp zıplayabileceğiniz naçizane bir satır.
+
+ 6. Ders 2.5'e geçin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.5: BİR SAYIM KULLANARAK DAHA FAZLA SİLME İŞLEMİ
+
+
+ ** Bir işleç ile birlikte sayı kullanmak işleci o kadar tekrarlatır. **
+
+ Yukarıda sözü edilen silme işleci ve hareketinin arasına sayı ekleyerek
+ yapılan işlemi o sayı kadar tekrarlatabilirsiniz.
+
+ d [sayı] hareket
+
+ 1. İmleci aşağıda ---> ile imlenen satırdaki ilk BÜYÜK HARFTEN oluşan
+ sözcüğün başına getirin.
+
+ 2. d2w yazarak iki BÜYÜK HARFLİ sözcüğü silin.
+
+ 3. Birinci ve ikinci adımları başka bir sayı kullanarak BÜYÜK
+ HARFLİ sözcükleri tek bir komutta silmek için yeniden uygulayın.
+
+---> Bu ABC ÇDE satırdaki FGĞ HIİ JKLM NOÖ PRSŞT sözcükler UÜ VY temizlenmiştir.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.6: SATIRLARDA İŞLEM YAPMA
+
+
+ ** Bütün bir satırı silmek için dd yazın. **
+
+ Bütün bir satır silme işlemi çok sık kullanıldığından dolayı, Vi
+ tasarımcıları bir satırı tamamen silmek için iki d yazmanın daha kolay
+ olduğuna karar vermişler.
+
+ 1. İmleci aşağıdaki tümceciğin ikinci satırına götürün.
+
+ 2. Satırı silmek için dd yazın.
+
+ 3. Şimdi de dördüncü satıra gidin.
+
+ 4. İki satırı birden silmek için 2dd yazın.
+
+---> 1) Güller kırmızıdır,
+---> 2) Çamur eğlenceli,
+---> 3) Menekşeler mavi,
+---> 4) Bir arabam var,
+---> 5) Saat zamanı söyler,
+---> 6) Şeker tatlıdır
+---> 7) Ve sen de öylesin
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2.7: GERİ AL KOMUTU
+
+
+ ** Komutu geri almak için u, bütün bir satırı düzeltmek için U yazın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş satırda ve ilk hatanın üzerine koyun.
+
+ 2. İlk istenmeyen karakteri silmek için x yazın.
+
+ 3. Şimdi son çalıştırılan komutu geri almak için u yazın.
+
+ 4. Bu sefer x komutunu kullanarak satırdaki tüm hataları düzeltin.
+
+ 5. Şimdi satırı ilk haline çevirmek için büyük U yazın.
+
+ 6. Şimdi U ve daha önceki komutları geri almak için birkaç defa u yazın.
+
+ 7. Birkaç defa <CTRL> R (<CTRL>'yi basılı tutarken R ye basın) yazarak
+ geri almaları da geri alın.
+
+---> Buu satıırdaki hataları düüzeltinn ve sonra koomutu geri alllın.
+
+ 8. Bunlar son derece kullanışlı komutlardır. Şimdi Ders 2 Özete geçin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 2: ÖZET
+
+
+ 1. İmleçten itibaren bir sözcüğü silmek için dw yazın.
+
+ 2. İmleçten itibaren bir satırı silmek için d$ yazın.
+
+ 3. Bütün bir satırı silmek için dd yazın.
+
+ 4. Bir hareketi yenilemek için önüne sayı takısı getirin, 2w gibi.
+
+ 5. Normal kipte bir komut biçimi şöyledir:
+
+ işleç [sayı] hareket
+
+ burada:
+ işleç - ne yapılacağı, silmek için d örneğinde olduğu gibi
+ [sayı] - komutun kaç kere tekrar edeceğini gösteren isteğe bağlı sayı
+ hareket - işlecin nice davranacağı, w (sözcük), $ (satır sonu) gibi
+
+ 6. Bir satırın başına gelmek için sıfır (0) kullanın.
+
+ 7. Önceki hareketleri geri almak için u (küçük u) yazın.
+ Bir satırdaki tüm değişiklikleri geri almak için U (büyük U) yazın.
+ Geri almaları geri almak için <CTRL> R kullanın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3.1: KOY KOMUTU
+
+
+ ** Son yaptığınız silmeyi imleçten sonraya yerleştirmek için p yazın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş tümceciğe götürün.
+
+ 2. Satırı silip Vim'in arabelleğine yerleştirmek için dd yazın.
+
+ 3. İmleci, silinmiş satırı nereye yerleştirmek istiyorsanız, o satırın
+ ÜZERİNE götürün.
+
+ 4. Normal kipteyken satırı yerleştirmek için p yazın.
+
+ 5. Tüm satırları doğru sıraya koymak için 2'den 4'e kadar olan adımları
+ tekrar edin.
+
+---> d) Sen de öğrendin mi?
+---> b) Menekşeler mavidir,
+---> c) Akıl öğrenilir,
+---> a) Güller kırmızıdır,
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3.2: DEĞİŞTİR KOMUTU
+
+
+ ** İmlecin altındaki karakteri başkası ile değiştirmek için rx yapın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş İLK satıra götürün.
+
+ 2. İmleci satırdaki ilk hatanın üzerine götürün.
+
+ 3. Hatayı düzeltmek için önce r ardından da doğru karakteri yazın.
+
+ 4. İlk satır düzelene kadar adım 2 ve 3'ü tekrar edin.
+
+---> Bu satıv yazılıvken, bivileri yamlış düğmetere basmış.
+---> Bu satır yazılırken, birileri yanlış düğmelere basmış.
+
+ 5. Ders 3.3'ye geçin.
+
+ NOT: Unutmayın, ezberleyerek değil deneyerek öğrenin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3.3: DEĞİŞTİR İŞLECİ
+
+
+ ** Bir sözcüğü imleçten sözcük sonuna kadar değiştirmek için ce yapın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş İLK satıra götürün.
+
+ 2. İmleci "sutar" daki u'nun üzerine yerleştirin.
+
+ 3. Önce ce ardından doğru harfleri girin (bu durumda 'atır').
+
+ 4. <ESC> düğmesine basın ve değişmesi gereken bir sonraki karaktere gidin.
+
+ 5. İlk cümle ikincisiyle aynı olana kadar adım 3 ve 4'ü tekrar edin.
+
+---> Bu sutar değiştir komutu ile değişneli gereken birkaç mözgüç içeriyor.
+---> Bu satır değiştir komutu ile değişmesi gereken birkaç sözcük içeriyor.
+
+ ce'nin sadece sözcüğü değiştirmediğini, aynı zamanda sizi EKLE kipine
+ aldığına da dikkat edin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3.4: c'Yİ KULLANARAK DAHA FAZLA DEĞİŞTİRME
+
+
+ ** Değiştir işleci sil komutu ile aynı hareketlerle kullanılır. **
+
+ 1. Değiştir işleci sil ile aynı yolla çalışır. Biçim şöyledir:
+
+ c [sayı] hareket
+
+ 2. Hareketler de aynıdır. Örneğin w (sözcük), $ (satır sonu) gibi.
+
+ 3. İmleci aşağıda ---> ile imlenmiş İLK satıra götürün.
+
+ 4. İmleci ilk hataya götürün.
+
+ 5. Satırın geri kalan kısmını ikincisi gibi yapmak için c$ yazın ve daha
+ sonra <ESC> düğmesine basın.
+
+---> Bu satırın sonu düzeltilmek için biraz yardıma ihtiyaç duyuyor.
+---> Bu satırın sonu düzeltilmek için c$ komutu kullanılarak yardıma ihtiyaç
+ duyuyor.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 3: ÖZET
+
+
+ 1. Silinmiş olan bir metni geri yerleştirmek için p yazın. Bu silinmiş
+ metni imleçten hemen SONRA geri yerleştirir (eğer bir satır silinmişse
+ hemen imlecin altındaki satıra yerleştirilecektir).
+
+ 2. İmlecin altındaki karakteri değiştirmek için önce r ardından da
+ yazmak istediğiniz karakteri yazın.
+
+ 3. Değiştir işleci belirlenen nesneyi, imleçten hareketin sonuna kadar
+ değiştirme imkanı verir. Örneğin, bir sözcüğü imleçten sözcük sonuna
+ kadar değiştirmek için cw, bir satırın tamamını değiştirmek içinse c$
+ yazın.
+
+ 4. Değiştir için biçim şöyledir:
+
+ c [sayı] hareket
+
+ Şimdi bir sonraki derse geçin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4.1: İMLEÇ KONUMU VE DOSYA DURUMU
+
+
+** <CTRL> G dosya içerisindeki konumunuzu ve dosya durumunu gösterir. Dosya
+ içerisindeki bir satıra gitmek için G yazın. **
+
+ NOT: Adımlardan herhangi birini yapmadan önce dersin tamamını okuyun!
+
+ 1. <CTRL> düğmesini basılı tutun ve g'ye basın. Biz buna <CTRL> G diyoruz.
+ Dosyanın sonunda dosya adını ve bulunduğunuz konumu gösteren bir durum
+ satırı görünecektir. Adım 3 için satır numarasını unutmayın.
+
+ NOT: İmleç konumunu ekranın sağ alt köşesinde görebilirsiniz. Bu 'ruler'
+ seçeneği etkin olduğunda görülür (bilgi için :help 'ruler' yazın).
+
+ 2. Dosyanın sonuna gitmek için G'ye basın. Dosyanın başına gitmek için
+ gg komutunu kullanın.
+
+ 3. Daha önce bulunduğunuz satır numarasını yazın ve daha sonra G'ye
+ basın. Bu sizi ilk <CTRL> g'ye bastığınız satıra geri götürecektir.
+
+ 4. Yapabileceğinizi düşündüğünüzde, adım 1'den 3'e kadar yapın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4.2: ARAMA KOMUTU
+
+
+ ** Bir sözcük öbeğini aramak için / ve aranacak öbeği girin. **
+
+ 1. Normal kipteyken / yazın. / karakterinin ve imlecin ekranın sonunda
+ göründüğüne dikkat edin.
+
+ 2. 'hatttaa' yazıp <ENTER>'a basın. Bu sizin aramak istediğiniz sözcüktür.
+
+ 3. Aynı sözcük öbeğini tekrar aramak için n yazın.
+ Aynı sözcük öbeğini zıt yönde aramak için N yazın.
+
+ 4. Eğer zıt yöne doğru bir arama yapmak istiyorsanız / komutu yerine ?
+ komutunu kullanın.
+
+---> "hatttaa" hatayı yazmanın doğru yolu değil; hatttaa bir hata.
+
+Not: Arama dosyanın sonuna ulaştığında dosyanın başından sürecektir. Bunu
+ devre dışı bırakmak için 'wrapscan' seçeneğini sıfırlayın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4.3: UYAN AYRAÇLAR ARAMASI
+
+
+ ** Uyan bir (, [ veya { bulmak için % yazın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş satırda bir (, [ veya { imine götürün.
+
+ 2. Şimdi % karakterini yazın.
+
+ 3. İmleç uyan ayracın üzerine gider.
+
+ 4. Uyan ilk parantezin üzerine geri dönmek için yine % yazın.
+
+ 5. İmleci başka bir (), [] veya {} üzerine götürün ve % işlecinin neler
+ yaptığını gözlemleyin.
+
+---> Bu içerisinde ( )'ler, ['ler ] ve {'ler } bulunan bir satırdır.
+
+ NOT: Bu içerisinde eşi olmayan ayraçlar bulunan bir programın hatalarını
+ ayıklamak için son derece yararlıdır.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4.4: BUL/DEĞİŞTİR KOMUTU
+
+
+ ** 'eski' yerine 'yeni' yerleştirmek için :s/eski/yeni/g yazın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş satıra götürün.
+
+ 2. :s/buu/bu yazıp <ENTER>'a basın. Bu komutun sadece satırdaki ilk
+ uyan karşılaşmayı düzelttiğine dikkat edin.
+
+ 3. Şimdi satırdaki tüm değişiklikleri bir anda yapmak için :s/buu/bu/g
+ yazarak tüm "buu" oluşumlarını değiştirin.
+
+---> Buu birinci, buu ikinci, buu üçüncü bölüm.
+
+ 4. İki satır arasındaki tüm karakter katarı oluşumlarını değiştirmek için:
+
+ :#,#s/eski/yeni/g yazın. #,# burada değişikliğin yapılacağı aralığın
+ satır numaralarıdır.
+ :%s/eski/yeni/g yazın. Bu tüm dosyadaki her oluşumu değiştirir.
+ :%s/eski/yeni/gc yazın. Bu tüm dosyadaki her oluşumu değiştirir ancak
+ her birini değiştirmeden önce bize sorar.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 4: ÖZET
+
+
+ 1. <CTRL> G sizin dosyadaki konumunuzu ve dosya durumunu gösterir.
+ G dosyanın sonuna gider.
+ [sayı] G belirtilen satır numarasına gider.
+ gg ilk satıra gider.
+
+ 2. Sözcük öbeğinden önce / yazmak, İLERİ yönde o öbeği aratır.
+ Sözcük öbeğinden önce ? yazmak, GERİ yönde o öbeği aratır.
+ Aramadan sonra, aynı yöndeki bir sonraki karşılaşmayı bulmak için n,
+ veya zıt yöndekini bulmak için N yazın.
+ <CTRL> O sizi eski konumlara, <CTRL> I daha yeni konumlara götürür.
+
+ 3. İmleç bir (), [], {} ayracı üzerindeyken % yazmak, uyan diğer eş
+ ayracı bulur.
+
+ 4. Satırdaki ilk 'eski'yi 'yeni' ile değiştirmek için :s/eski/yeni,
+ Satırdaki tüm 'eski'leri 'yeni' ile değiştirmek için :s/eski/yeni/g,
+ İki satır arasındaki öbekleri değiştirmek için :#,#s/eski/yeni/g,
+ Dosyadaki tüm karşılaşmaları değiştirmek için :%s/eski/yeni/g yazın.
+ Her seferinde onay sorması için :%s/eski/yeni/gc kullanın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5.1: BIR DIŞ KOMUT ÇALIŞTIRMAK
+
+
+ ** Bir dış komutu çalıştırmak için :! ve ardından dış komutu yazın. **
+
+ 1. İmleci ekranın altına götürmek için : komutunu yazın. Bu size bir komut
+ yazma imkanı verir.
+
+ 2. Şimdi ! (ünlem) karakterini yazın. Bu size bir dış komut çalıştırma
+ olanağı verir.
+
+ 3. Örnek olarak ! karakterini takiben ls yazın ve <ENTER>'a basın. Bu size
+ o anda bulunduğunuz dizindeki dosyaları gösterecektir. Veya ls
+ çalışmazsa :!dir komutunu kullanın.
+
+ NOT: Herhangi bir dış komutu bu yolla çalıştırmak mümkündür.
+
+ NOT: Tüm : komutlarından sonra <ENTER> düğmesine basılmalıdır. Bundan
+ sonra bunu her zaman anımsatmayacağız.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5.2: DOSYA YAZMAYA DEVAM
+
+
+ ** Dosyaya yapılan değişikliği kaydetmek için :w DOSYA_ADI yazın. **
+
+ 1. Bulunduğunuz dizini listelemek için :!dir veya :!ls yazın.
+ Komuttan sonra <ENTER> düğmesine basacağınızı zaten biliyorsunuz.
+
+ 2. Mevcut olmayan bir dosya adı seçin, örneğin DENEME.
+
+ 3. Şimdi :w DENEME yazın (DENEME sizin seçtiğiniz dosya adıdır).
+
+ 4. Bu tüm dosyayı (Vim Tutor) DENEME isminde başka bir dosyaya yazar.
+ Bunu doğrulamak için, :!ls veya :!dir yazın ve yeniden bulunduğunuz
+ dizini listeleyin.
+
+ NOT: Eğer Vim'den çıkıp kaydettiğiniz DENEME dosyasını açarsanız, bunun
+ kaydettiğiniz vimtutor'un gerçek bir kopyası olduğunu görürsünüz.
+
+ 5. Şimdi dosyayı şu komutları vererek silin:
+ Windows: :!del DENEME
+ Unix (macOS, Linux, Haiku): :!rm DENEME
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5.3: YAZMA İÇİN METİN SEÇME
+
+
+ ** Dosyanın bir bölümünü kaydetmek için, v hareket :w DOSYA_ADI yazın. **
+
+ 1. İmleci bu satırın üzerine getirin.
+
+ 2. v düğmesine basarak imleci aşağıdaki beşinci adıma taşıyın. Metnin
+ seçildiğine dikkat edin.
+
+ 3. : karakterini yazın. Ekranın alt kısmında :'<'> çıkacaktır.
+
+ 4. w DENEME yazın; DENEME burada henüz var olmayan bir dosyadır. <ENTER>
+ düğmesine basmadan önce :'<'>w DENEME gördüğünüzden emin olun.
+
+ 5. Vim seçilen satırları DENEME dosyasına yazacaktır. :!ls veya :!dir ile
+ bakarak dosyayı görün. Henüz silmeyin; bir sonraki derste kullanacağız.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5.4: DOSYALARI BİRLEŞTİRME VE BÖLÜM EKLEME
+
+
+ ** Bir dosyanın içeriğini eklemek için :r DOSYA_ADI yazın. **
+
+ 1. İmleci bu satırın hemen bir üstüne koyun.
+
+ NOT: İkinci adımdan sonra Ders 5.3'ün metnini göreceksiniz.
+ Sonrasında AŞAĞI düğmesi ile bu derse geri gelin.
+
+ 2. Şimdi :r DENEME komutunu kullanarak DENEME dosyasını bu dosyanın içine
+ getirin. Getirdiğiniz dosya imlecin hemen altına yerleştirilir.
+
+ 3. Dosyanın getirildiğini doğrulamak için YUKARI düğmesini kullanarak
+ Ders 5.3'ün iki adet kopyası olduğunu görün, özgün sürümü ve kopyası.
+
+ NOT: Bu komutu kullanarak bir dış komutun çıktısını da dosyanın içine
+ koyabilirsiniz. Örneğin :r !ls yazmak ls komutunun vereceği çıktıyı
+ dosyanın içinde hemen imlecin altındaki satıra koyar.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 5: ÖZET
+
+
+ 1. :!komut bir dış komut çalıştırır.
+ Bazı yararlı örnekler:
+ (MS-DOS) (Unix)
+ :!dir :!ls - bir dizini listeler.
+ :!del DOSYA :!rm DOSYA - DOSYA'yı siler.
+
+ 2. :w DOSYA_ADI o anki Vim dosyasını diske DOSYA_ADI ile kaydeder.
+
+ 3. v hareket :w DOSYA_ADI seçilmiş satır aralığını DOSYA_ADI ile kaydeder.
+
+ 4. :r DOSYA_ADI imlecin altından başlayarak DOSYA_ADI isimli dosyanın
+ içeriğini ekler.
+
+ 5. :r !dir veya !ls bu iki komutun (dosyaları listeleme) içeriklerini
+ okur ve dosyanın içine yerleştirir.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.1: AÇ KOMUTU
+
+
+ ** İmlecin aşağısına satır açmak ve EKLE kipine geçmek için o yazın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş satıra götürün.
+
+ 2. İmlecin aşağısına bir satır açmak ve EKLE kipine geçmek için o
+ (küçük harfle) yazın.
+
+ 3. Şimdi herhangi bir metin girin ve EKLE kipinden çıkmak için <ESC>
+ düğmesine basın.
+
+---> o yazdıktan sonra imleç EKLE kipinde açılan satırın üzerine gider.
+
+ 4. İmlecin üzerinde bir satır açmak için, yalnızca büyük O yazın. Bunu
+ aşağıdaki satırda deneyin.
+
+---> Bu satırın üzerine bir satır açmak için imleç bu satırdayken O yazın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.2: EKLE KOMUTU
+
+
+ ** İmleçten sonra metin eklemek için a yazın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş satıra götürün.
+
+ 2. İmleç satırın sonuna gelinceye dek e düğmesine basın.
+
+ 3. İmleçten SONRA metin eklemek için a yazın.
+
+ 4. Şimdi ilk satırı ikincisi gibi tamamlayın. EKLE kipinden çıkmak için
+ <ESC> düğmesine basın.
+
+ 5. e düğmesini kullanarak bir sonraki yarım sözcüğe gidin ve adım 3 ve 4'ü
+ tekrarlayın.
+
+---> Bu satı çalışabilirsiniz. Çalı met ekl
+---> Bu satırda çalışabilirsiniz. Çalışırken metin eklemeyi kullanın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.3: BİR BAŞKA DEĞİŞTİR KOMUTU
+
+
+ ** Birden fazla karakter değiştirmek için büyük R yazın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş İLK satıra götürün. İmleci ilk xxx'in
+ başına getirin.
+
+ 2. Şimdi R düğmesine basın ve ikinci satırdaki sayıyı ilk satırdaki xxx'in
+ yerine yazın.
+
+ 3. <ESC> düğmesine basarak DEĞİŞTİR kipinden çıkın. Satırın geri kalanının
+ değişmediğini gözlemleyin.
+
+ 4. Kalan xxx'i de değiştirmek için adımları tekrarlayın.
+
+---> 123 sayısına xxx eklemek size yyy toplamını verir.
+---> 123 sayısına 456 eklemek size 579 toplamını verir.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.4: METİN KOPYALA VE YAPIŞTIR
+
+
+ ** y işlecini kullanarak metin kopyalayın ve p kullanarak yapıştırın. **
+
+ 1. İmleci aşağıda ---> ile imlenmiş satıra getirin, "a)"nın ardına koyun.
+
+ 2. v ile GÖRSEL kipe geçin ve imleci "ilk" sözcüğünün öncesine getirin.
+
+ 3. y düğmesine basarak seçili metni kopyalayın.
+
+ 4. İmleci bir sonraki satırın sonuna j$ ile getirin.
+
+ 5. p düğmesine basarak metni yapıştırın. Akabinde <ESC> düğmesine basın.
+
+ 6. GÖRSEL kipe geçerek "öge" sözcüğünü seçin, y ile kopyalayın, j$ ile
+ ikinci satırın sonuna gidin ve p ile sözcüğü yapıştırın.
+
+---> a) Bu ilk öge
+---> b)
+
+ NOT: y komutunu bir işleç olarak da kullanabilirsiniz; yw komutu yalnızca
+ bir sözcüğü kopyalar.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 6.4: SET KOMUTU
+
+
+ ** Arama veya değiştirme işlemlerinin büyük/küçük harf durumunu görmezden
+ gelmesi için SET komutunu kullanın.
+
+ 1. 'yoksay' sözcüğünü aramak için /ignore yazın. Bunu n düğmesine basarak
+ birkaç kez yenileyin.
+
+ 2. :set ic yazarak 'ic' (BÜYÜK/küçük harf yoksay) ayarını seçin.
+
+ 3. Yeniden n düğmesine basarak 'yoksay' sözcüğünü aramayı sürdürün. Artık
+ YOKSAY ve yoksay örneklerinin de bulunduğunu gözlemleyin.
+
+ 4. :set hls is yazarak 'hlsearch' ve 'incsearch' ayarlarını seçin.
+
+ 5. /ignore yazarak arama komutunu tekrar verin ve ne olacağını görün.
+
+ 6. BÜYÜK/küçük harf ayrımsız arama ayarını kapatmak için :set noic yazın.
+
+ NOT: Sonuçların ekranda vurgulanmasını istemiyorsanız :nohlsearch yazın.
+ NOT: Eğer yalnızca bir arama işlemi için BÜYÜK/küçük harf ayrımsız arama
+ yapmak istiyorsanız /ignore\c komutunu kullanın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ DERS 6 ÖZET
+
+
+ 1. o komutu imlecin altında bir satır açar ve imleci bu açılmış satıra
+ EKLE kipinde yerleştirir.
+ O komutu imlecin üzerinde bir satır açar.
+
+ 2. a komutu imleçten sonra metin girişine olanak verir.
+ A komutu geçerli satırın sonuna giderek metin girişine olanak verir.
+
+ 3. e komutu imleci bir sözcüğün sonuna taşır.
+
+ 4. y işleci metni kopyalar, p işleci yapıştırır.
+
+ 5. R komutu DEĞİŞTİR kipine girer ve <ESC>'ye basılana kadar kalır.
+
+ 6. ":set xxx" yazmak "xxx" seçeneğini ayarlar. Bazı seçenekler:
+ 'ic' 'ignorecase' BÜYÜK/küçük harf ayrımını arama yaparken kapatır.
+ 'is' 'incsearch' Bir arama metninin tüm uyan kısımlarını gösterir.
+ 'hls' 'hlsearch' Uyan sonuçların üzerini vurgular.
+ Ayarlama yaparken ister kısa ister uzun sürümleri kullanabilirsiniz.
+
+ 7. Bir ayarı kapatmak için "no" ekleyin, örneğin :set noic.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 7.1: YARDIM KAYNAKLARI
+
+
+ ** Çevrimiçi yardım sistemini kullanın **
+
+ Vim geniş bir çevrimiçi yardım sistemine sahiptir. Başlamak için şu üçünü
+ deneyebilirsiniz:
+
+ - (eğer varsa) <HELP> düğmesine basın
+ - (eğer varsa) <F1> düğmesine basın
+ - :help yazın ve <ENTER> düğmesine basın
+
+ Yardım penceresindeki metinleri okuyarak yardım sisteminin nasıl
+ çalıştığını öğrenin.
+ Bir pencereden diğerine geçmek için <CTRL> W ikilisini kullanın.
+ Yardım penceresini kapatmak için :q yazıp <ENTER> düğmesine basın.
+
+ ":help" komutuna değişken (argüman) vererek herhangi bir konu hakkında
+ yardım alabilirsiniz. Şunları deneyin:
+
+ :help w
+ :help c_<CTRL> D
+ :help insert-index
+ :help user-manual
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 7.2: BİR BAŞLANGIÇ BETİĞİ OLUŞTURUN
+
+
+ ** Vim'in özelliklerine bakın **
+
+ Vim Vi'dan çok daha fazla özelliğe sahiptir fakat birçoğu öntanımlı olarak
+ kapalıdır. Daha fazla özellik kullanabilmek için bir "vimrc" dosyası
+ oluşturmalısınız.
+
+ 1. "vimrc" dosyasını düzenlemeye başlayın. İşletim sistemlerine göre:
+
+ :e ~/.vimrc Unix için
+ :e ~/_vimrc Windows için
+
+ 2. Şimdi örnek "vimrc" dosyası içeriğini okuyun:
+
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Dosyayı :w ile kaydedin.
+
+ Vim'i bir sonraki çalıştırılmasında sözdizim vurgulaması kullanacaktır.
+ Tüm tercih ettiğiniz ayarları bu "vimrc" dosyasına ekleyebilirsiniz.
+ Daha fazla bilgi için :help vimrc-intro yazın.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 7.3: TAMAMLAMA
+
+
+ ** <CTRL> D ve <TAB> ile komut istemi ekranında tamamlama **
+
+ 1. :set nocp komutunu kullanarak Vim'in uyumlu kipte olmadığından
+ emin olun.
+
+ 2. Bulunduğunuz dizindeki dosyalara :!ls veya :!dir ile bakın.
+
+ 3. Bir komutun baş kısmını yazın, örneğin :e.
+
+ 4. <CTRL> D'ye bastığınızda Vim size e ile başlayan komutları
+ gösterecektir.
+
+ 5. d <TAB> kullandığınızda Vim komutu kendinden :edit olarak
+ tamamlayacaktır.
+
+ 6. Şimdi bir boşluk ekleyin ve var olan bir dosyanın baş harflerini yazın.
+ Örneğin :edit DOS.
+
+ 7. <TAB> düğmesine basın. Eğer yalnızca bu dosyadan bir tane varsa Vim
+ sizin için dosya adının geri kalanını tamamlayacaktır.
+
+ NOT: Tamamlama birçok komut için çalışır. Yalnızca <CTRL> D ve <TAB>
+ ikililerini deneyin. Özellikle :help için çok yararlıdır.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ders 7: ÖZET
+
+
+ 1. :help yazmak veya <F1> veya <HELP> düğmelerine basmak yardım
+ penceresini açar.
+
+ 2. :help cmd yazarak cmd hakkında bilgi sahibi olabilirsiniz.
+
+ 3. <CTRL> W kullanarak başka pencerelere geçebilirsiniz.
+
+ 4. :q kullanarak yardım penceresini kapatabilirsiniz.
+
+ 5. Bir vimrc başlangıç betiği oluşturarak yeğlenen ayarlarınızı
+ saklayabilirsiniz.
+
+ 6. Bir : komutu girerken <CTRL> D'ye basarak olanaklı tamamlama
+ seçeneklerini görebilirsiniz. <TAB>'a basarak tamamlamayı seçin.
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Böylece Vim Eğitmeni tamamlanmış oldu. Eğitmendeki amaç Vim düzenleyicisi
+ hakkında kısa bir bilgi vermek ve onu kolayca kullanmanızı sağlamaktı.
+ Vim'in tamamını öğretmek çok zordur zira Vim birçok komuta sahiptir.
+ Bundan sonra ":help user-manual" komutu ile kullanıcı kılavuzunu
+ okumalısınız.
+
+ Daha fazla okuma ve çalışma için şu kitabı öneriyoruz:
+
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+
+ Tümüyle Vim için hazırlanmış ilk kitaptır. Özellikle ilk kullanıcılar için
+ çok uygundur.
+ Kitapta birçok örnek ve resim bulunmaktadır.
+ https://iccf-holland.org/click5.html adresine bakabilirsiniz.
+
+ Bu kitap daha eskidir ve Vim'den daha çok Vi içindir ancak tavsiye edilir:
+
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+
+ Vi hakkında bilmek isteyeceğiniz neredeyse her şeyin bulunduğu bir kitap.
+ 6. Basım aynı zamanda Vim hakkında da bilgi içermektedir.
+
+ Bu eğitmen Michael C. Pierce ve Robert K. Ware tarafından yazıldı,
+ Charles Smith tarafından sağlanan fikirlerle Colorado School Of Mines,
+ Colorado State University. E-posta: bware@mines.colorado.edu
+
+ Vim için değiştiren: Bram Moolenaar
+
+ Türkçe çeviri:
+ Serkan "heartsmagic" Çalış (2005), adresimeyaz (at) yahoo (dot) com
+
+ 2019 Güncelleme:
+ Emir SARI, bitigchi (at) me (dot) com
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.uk.utf-8 b/runtime/tutor/tutor.uk.utf-8
new file mode 100644
index 0000000..541c74f
--- /dev/null
+++ b/runtime/tutor/tutor.uk.utf-8
@@ -0,0 +1,976 @@
+===============================================================================
+= Ласкаво просимо в уроки VIM =
+===============================================================================
+
+ Vim дуже потужний редактор, що має багато команд. Всі команди неможливо
+ помістити в підручнику на зразок цього, але цих уроків достатньо, щоб
+ ви навчились з легкістю користуватись Vim як універсальним редактором.
+
+ УВАГА:
+ Уроки цього підручника вимагають зміни тексту. Зробіть копію файлу, щоб
+ практикуватись на ньому.
+
+ Важливо пам'ятати, що цей підручник має на меті навчання на практиці.
+ Це означає що ви маєте застосовувати команди щоб вивчити їх. Просто
+ прочитавши текст, ви забудете команди.
+
+ Кнопки на клавіатурі, будемо позначати квадратними дужками: [кнопка].
+
+ А зараз переконайтесь, що включена англійська розкладка і не затиснутий
+ Caps Lock, і натисніть кнопку j щоб переміститись до першого уроку.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.1: ПЕРЕМІЩЕННЯ КУРСОРА
+
+
+ ** Щоб переміщати курсор використовуйте кнопки [h],[j],[k],[l],
+ як вказано на схемі:
+ ^
+ [k]
+ <[h] [l]>
+ [j]
+ v
+
+ Таке розміщення спочатку може видатись трохи дивним. Як наприклад те, що
+ кнопка [l] переміщує курсор вправо. Але клавіші розміщені так, щоб
+ мінімізувати кількість рухів. Найчастіша дія яку користувач робить з
+ текстовим файлом - це читає його. А при читанні прокручують текст вниз.
+ Тому вниз прокручує [j] - вона знаходиться якраз під вказівним пальцем
+ правої руки.
+
+ Курсор можна переміщувати і класичним способом (курсорними клавішами), але
+ зручніше буде, якщо ви опануєте спосіб Vim. (Особливо якщо ви вже вмієте
+ набирати всліпу).
+
+ 1. Попереміщуйте курсор по екрану, поки не призвичаїтесь.
+
+ 2. Перемістіться до наступного уроку.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.2: Вихід з Vim
+
+
+Увага! Перед тим як виконувати цей урок прочитайте його повністю.
+
+ 1. Натисніть [ESC] (щоб впевнитись що ви в звичайному режимі).
+
+ 2. Наберіть: :q! [ENTER].
+ Це завершує роботу, відкидаючи всі зміни які ви здійснили.
+
+ 3. Коли ви побачите привітання терміналу введіть команду яку ви використали
+ щоб відкрити цей підручник. Скоріш за все це було: vim tutor.txt [ENTER]
+
+ 4. Якщо ви запам'ятали кроки з 1 по 3, виконайте їх, і переходьте до
+ наступного уроку.
+
+Зауваження: Команда :q! [ENTER] завершує роботу і відкидає всі зміни. Через
+ кілька уроків ви навчитесь зберігати зміни в файл.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.3:РЕДАГУВАННЯ ТЕКСТУ. ВИДАЛЕННЯ.
+
+
+ ** Натисніть [x] щоб видалити символ під курсором. **
+
+ 1. Перемістіть курсор до лінії нижче, яка позначена так: --->.
+
+ 2. Щоб виправити помилки перемістіть курсор так, щоб він став над
+ символом який треба видалити.
+
+ 3. Натисніть [x] щоб видалити непотрібний символ.
+
+ 4. Повторіть кроки з другого по четвертий, поки речення не стане правильним.
+
+---> Ккоровва перрестрибнуууууула ччерезз мііісяццць.
+
+ 5. Тепер, коли речення правильне, можна перейти до уроку 1.4.
+
+Зауваження: Протягом навчання не старайтесь запам'ятати все.
+ Вчіться практикою.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.4: РЕДАГУВАННЯ ТЕКСТУ. ВСТАВКА
+
+
+ ** Натисніть [i] щоб вставити текст. **
+
+ 1. Перемістіть курсор на перший рядок позначений: --->.
+
+ 2. Перемістіть курсор на символ, ПІСЛЯ якого потрібно вставити текст.
+
+ 3. Натисніть [i] і наберіть необхідні вставки.
+
+ 4. Коли всі помилки виправлені натисніть [ESC] щоб повернутись в звичайний
+ режим.
+
+---> З прав текст.
+---> З цього рядка пропав деякий текст.
+
+ 5. Коли призвичаїтесь вставляти текст - переходьте до уроку 1.5.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.5: РЕДАГУВАННЯ ТЕКСТУ. ДОДАВАННЯ.
+
+
+ ** Натисніть [A] щоб додати текст. **
+
+Увага! Тут і далі, коли мають наувазі клавішу з буквою в верхньому
+ регістрі, то це означає що її натискають з затиснутою [SHIFT].
+
+ 1. Перемістіть курсор до першої лінії внизу позначеної --->.
+ Не має значення над яким символом знаходиться курсор.
+
+ 2. Натисніть [A] і введіть необхідне доповнення.
+
+ 3. Коли додавання завершене натисніть [ESC] щоб повернутись в
+ звичайний режим.
+
+ 4. Перемістіть курсор до другої лінії позначеної ---> і повторіть
+ кроки 2 і 3 щоб виправити речення.
+
+---> З цього рядка пропущ
+ З цього рядка пропущений текст.
+---> З цього рядка також
+ З цього рядка також пропущений текст.
+
+ 5. Після виконання вправ, переходьте до наступного уроку.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 1.6: РЕДАГУВАННЯ ФАЙЛУ
+
+ ** Використайте :wq щоб зберегти файл і вийти.**
+
+Увага! Перед виконанням уроку прочитайте його повністю.
+
+ 1. Вийдіть з цього підручника як ви робили в уроці 1.2: :q![ENTER]
+ Або якщо ви маєте доступ до іншого терміналу виконуйте наступні
+ дії в ньому.
+
+ 2. В терміналі наберіть команду: vim НазваФайлу [ENTER]
+ 'vim' - команда для запуску редактора, НазваФайлу - файл який будемо
+ редагувати. Якщо ввести неіснуючий файл, то він створиться
+
+ 3. Відредагуйте текст, як навчились у попередніх уроках.
+
+ 4. Щоб зберегти зміни у файлі, і вийти з Vim наберіть: :wq [ENTER]
+
+ 5. Якщо ви вийшли з підручника на першому кроці, то зайдіть в нього
+ знову і переходьте до підсумку.
+
+ 6. Після прочитання і засвоєння попередніх кроків виконайте їх.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ПІДСУМОК УРОКУ 1
+
+
+ 1. Курсор керується курсорними клавішами, або клавішами [h][j][k][l]
+ [h] (вліво) [j] (вниз) [k] (вверх) [l] (вправо)
+
+ 2. Щоб запустити Vim з терміналу наберіть: vim Назва файлу [ENTER]
+
+ 3. Щоб вийти з Vim наберіть: [ESC] :q! [ENTER] щоб відкинути всі зміни.
+ або наберіть: [ESC] :wq [ENTER] щоб зберегти всі зміни.
+
+ 4. Щоб видалити символ під курсором натисніть [x].
+
+ 5. Щоб вставити, чи доповнити текст наберіть:
+ [i] текст що вставляєтсья [ESC] вставиться перед курсором
+ [A] текст до додається [ESC] додасть текст до рядка
+
+Зауваження: Натискання [ESC] перенесе вас в звичайний режим, чи відмінить
+ не до кінця введену команду.
+
+Тепер переходьте до уроку 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.1: КОМАНДИ ВИДАЛЕННЯ
+
+
+ ** Введіть dw щоб видалити слово. **
+
+ 1. Натисніть [ESC], щоб переконатись що ви в звичайному режимі.
+
+ 2. Перемістіть курсор до лінії нижче позначеної --->.
+
+ 3. Перемістіть курсор до початку слова що має бути видалене.
+
+ 4. Введіть dw щоб слово пропало.
+
+ Зауваження: Буква d з'явиться в останньому рядку екрану, якщо ви її натиснули.
+ Vim чекає введення наступного символа. Якщо з'явилось щось інше
+ значить ви щось не так ввели. Натисніть [ESC] і почніть спочатку.
+
+---> Є деякі слова весело, які не потрібні папір в цьому реченні.
+
+ 5. Повторюйте кроки 3 і 4 поки речення не стане правильне, а тоді переходьте
+ до уроку 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.2: БІЛЬШЕ КОМАНД ВИДАЛЕННЯ
+
+
+ ** Наберіть d$ щоб видалити символи від курсора до кінця рядка. **
+
+ 1. Натисніть [ESC] щоб переконатись що ви в звичайному режимі.
+
+ 2. Перемістіть курсор до лінії нижче, що позначена --->.
+
+ 3. Перемістіть курсор до кінця правильного рядка (ПІСЛЯ першої крапки).
+
+ 4. Введіть d$ щоб видалити все до кінця рядка.
+
+---> Хтось надрукував кінець цього рядка двічі. кінець цього рядка двічі.
+
+
+ 5. Перейдіть до уроку 2.3 щоб розібратись в цьому детальніше.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.3:ОПЕРАТОРИ І ПЕРЕМІЩЕННЯ
+
+
+ Багато команд що змінюють текст утворені з оператора і переміщення.
+ Формат команди видалення з оператором d подано нижче:
+
+ d переміщення
+
+ Де:
+ d - оператор видалення.
+ переміщення - з чим працює оператор (описано нижче).
+
+ Короткий список переміщень:
+ w - до початку наступного слова, НЕ ВКЛЮЧАЮЧИ його перший символ.
+ e - до кінця поточного слова, ВКЛЮЧАЮЧИ останній символ.
+ $ - до кінця рядка, ВКЛЮЧАЮЧИ останній символ.
+
+ Тому введення de видалить символи від курсора, до кінця слова.
+
+Зауваження: Натискання тільки переміщення в звичайному режимі відповідно
+ переміщує курсор.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.4: ВИКОРИСТАННЯ ЛІЧИЛЬНИКА ДЛЯ ПЕРЕМІЩЕННЯ
+
+
+ ** Введення числа перед переміщенням повторює його стільки раз. **
+
+ 1. Перемістіть курсор до початку рядка позначеного --->
+
+ 2. Введіть 2w щоб перемістити курсор на два слова вперед.
+
+ 3. Введіть 3e щоб перемістити курсор в кінець третього слова.
+
+ 4. Введіть 0 (нуль) щоб переміститись на початок рядка.
+
+ 5. Повторіть кроки 2 і 3 з різними числами.
+
+---> А це просто рядок зі словами, серед яких можна рухати курсором.
+
+ 6. Переходьте до уроку 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.5: БАГАТОРАЗОВЕ ВИДАЛЕННЯ
+
+
+ ** Введення числа з оператором повторює його стільки ж разів. **
+
+ В комбінації з оператором видалення, і переміщення з лічильника можна
+ видаляти потрібне число елементів.
+ Для цього введіть
+ d число переміщення
+
+ 1. Перемістіться до першого слова в ВЕРХНЬОМУ РЕГІСТРІ в рядку
+ позначеному --->.
+
+ 2. Введіть d2w щоб видалити два слова.
+
+ 3. Повторіть кроки 1 і 2 з різними числами, щоб видалити все зайве.
+
+---> цей ABC DE рядок FGHI JK LMN OP слів Q RS TUV почищений.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.6: ОПЕРАЦІЇ З РЯДКАМИ
+
+
+ ** Введіть dd щоб видалити весь рядок. **
+
+ Через те, що видалення всього рядка є доволі частою дією розробники Vi
+ вирішили що для цієї операції потрібна проста команда, як dd.
+
+ 1. Перемістіть курсор до другого рядка в вірші нижче.
+ 2. Введіть dd щоб видалити рядок.
+ 3. Потім перемістіться до четвертого рядка.
+ 4. Введіть 2dd щоб видалити два рядки.
+
+---> 1) Троянди червоні,
+---> 2) Багнюка весела,
+---> 3) Волошки голубі,
+---> 4) В мене є машина,
+---> 5) Годинник каже час,
+---> 6) Цукерки солодкі,
+---> 7) Дарую тобі.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 2.7: ВІДКИНУТИ ЗМІНИ
+
+
+ ** Натисніть u щоб скасувати останні команди, U щоб виправити ввесь рядок. **
+
+ 1. Перемістіть курсор до рядка нижче позначеного ---> на місце першої помилки.
+ 2. Натисніть x щоб видалити непотрібний символ.
+ 3. Потім натисніть u щоб відмінити виправлення.
+ 4. Цього разу виправте всі помилки в рядку використовуючи команду x .
+ 5. Після цього введіть U, і відкиньте всі зміни в цілому рядку.
+ 6. Натисніть u кілька разів, щоб відмінити U і попередні команди.
+ 7. Тепер натисніть CTRL-R кілька разів, щоб повторити відмінені команди
+ (відмінити відміну).
+
+---> Вииправте помилки наа цьоому рядку і вііідмініть їх.
+
+ 8. Тепер можна переходити до підсумків другого уроку.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ПІДСУМОК УРОКУ 2
+
+
+ 1. Щоб видалити все від курсора аж до початку наступного слова введіть: dw
+ 2. Щоб видалити від курсора до кінця рядка: d$
+ 3. Щоб видалити увесь рядок: dd
+
+ 4. Щоб повторити переміщення, поставте перед ним число повторів: 2w
+ 5. Формат команди зміни:
+ оператор [число] переміщення
+ де:
+ оператор - що робити, як наприклад d для видалення
+ [число] - кількість повторів
+ переміщення - куди переміститись перед виконанням оператора, як
+ як наприклад w (слово), $ (кінець рядка), і т.і.
+
+ 6. Щоб переміститись до початку рядка використовуйте нуль: 0
+
+ 7. Щоб відмінити попередню дію введіть: u (u в нижньому регістрі)
+ Щоб відмінити всі зміни рядка введіть: U (U в верхньому регістрі)
+ Щоб скасувати відміну натисніть: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.1: КОМАНДА PUT
+
+
+ ** Введіть p щоб вставити перед тим видалений текст після курсору. **
+
+ 1. Перемістіть курсор до першої ---> лінії внизу.
+
+ 2. Введіть dd щоб видалити рядок і зберегти його в регістрі Vim.
+
+ 3. Перемістіть курсор до рядка в), НАД тим місцем де має бути видалений рядок.
+
+ 4. Натисніть p щоб вставити рядок під курсором.
+
+ 5. Повторіть кроки від 2 до 4 щоб вставити всі рядки в правильному порядку.
+
+---> г) всіх до кузні іззива.
+---> б) а в коваля серце тепле,
+---> в) а він клепче та й співа,
+---> а) А в тій кузні коваль клепле,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.2: Команда заміни
+
+
+ ** Наберіть rx щоб замінити символ під курсором на x . **
+
+ 1. Перемістіть курсор до першого рядка нижче, позначеного --->.
+
+ 2. Помістіть курсор над першою помилкою.
+
+ 3. Наберіть r а потім символ який має стояти там.
+
+ 4. Повторіть кроки з 2 по 3 поки перший рядок не стане еквівалентним другому.
+
+---> Коли ця лігія набираламт. хтось наьтснкв геправмльні унопкм!
+---> Коли ця лінія набиралась, хтось натиснув неправильні кнопки!
+
+ 5. Зараз переходьте до уроку 3.3.
+
+Примітка: Ви маєте вчитись діями, а не простим заучуванням, пам'ятаєте?
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.3: ОПЕРАТОР ЗАМІНИ
+
+
+ ** Щоб зробити заміну до кінця слова введіть ce . **
+
+ 1. Перемістіть курсор до першого рядка позначеного --->.
+
+ 2. Помістіть курсор над у в слові рукра.
+
+ 3. Введіть ce і правильне закінчення слова (ядок в цьому випадку).
+
+ 4. Натисніть [ESC] і переходьте до наступного символа, який потрібно замінити.
+
+ 5. Повторюйте кроки 3 і 4 поки перше речення не стане таким самим як і друге.
+
+---> Цей рукра має кілька слів що потретамув заміни за допоцкщшг оператора.
+---> Цей рядок має кілька слів що потребують заміни за допомогою оператора.
+
+Зауважте що ce видаляє слово, і поміщає вас в режим вставки.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 3.4: БІЛЬШЕ ЗМІН З c
+
+
+ ** Оператор заміни використовується з тими ж переміщеннями що і видалення. **
+
+ 1. Оператор заміни працює в такий же спосіб що і видалення. Формат:
+
+ c [число] переміщення
+
+ 2. Переміщення ті ж самі, такі як w (слово) і $ (кінець рядка).
+
+ 3. Перемістіться до першого рядка позначеного --->.
+
+ 4. Перемістіть курсор до першої помилки.
+
+ 5. Наберіть c$ і решту рядка, щоб він став таким як другий і натисніть [ESC].
+
+---> Кінець цього рядка потребує якихось дій щоб стати таким як кінець другого.
+---> Кінець цього рядка можна виправити за допомогою команди c$.
+
+Примітка: Можна використовувати кнопку Backspace щоб виправляти опечатки при
+ наборі.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ПІДСУМОК УРОКУ 3
+
+
+ 1. Щоб вставити текст який був видалений наберіть p . Це вставляє
+ видалений текст ПІСЛЯ курсора (якщо був видалений рядок, вставка
+ продовжиться з рядка під курсором).
+
+ 2. Щоб замінити символ під курсором наберіть r і необхідний символ.
+
+ 3. Оператор заміни дозволяє робити заміну тексту від курсору, до потрібного
+ переміщення. Наприклад щоб замінити все від курсора до кінця слова
+ вводять ce . Щоб замінити закінчення рядка тиснуть c$ .
+
+ 4. Формат заміни:
+
+ c [число] переміщення
+
+Почнемо наступний урок.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.1: ПОЗИЦІЯ КУРСОРА І СТАТУС ФАЙЛУ
+
+ ** Введіть CTRL-G щоб побачити вашу позицію в файлі, і його статус.
+ Введіть G щоб переміститись на потрібний рядок файлу. **
+
+ ПРИМІТКА: Прочитайте увесь урок перед виконанням будь-яких кроків!!
+
+ 1. Затисніть кнопку Ctrl і натисніть g . Це називається CTRL-G.
+ Внизу з'явиться повідомлення з назвою файлу, і позицією в файлі.
+ Запам'ятайте номер рядка для кроку 3.
+
+ПРИМІТКА: Ви бачите позицію курсора в нижньому правому кутку екрану.
+ Це трапляється коли включена опція 'ruler' (читайте :help 'ruler' )
+
+ 2. Натисніть G щоб переміститись до кінця файлу.
+ Наберіть gg щоб переміститись до початку файлу.
+
+ 3. Наберіть номер рядка де ви були а потім G. Це перенесе вас до потрібного
+ рядка.
+
+ 4. Якщо ви запам'ятали три попередні кроки, то виконуйте.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.2: КОМАНДА ПОШУКУ
+
+
+ ** Введіть / (слеш) і фразу, щоб шукати її в тексті. **
+
+ 1. В звичайному режимі введіть символ / . Зауважте що він і курсор
+ з'являються в низу екрану, як і з командою : .
+
+ 2. Тепер введіть 'очепятка' <ENTER>. Це буде словом яке ви шукатимете.
+
+ 3. Щоб здійснити пошук цієї фрази ще раз введіть n .
+ Щоб шукати в протилежному напрямку введіть N .
+
+ 4. Щоб шукати фразу в зворотньому напрямку використайте ? замість / .
+
+ 5. Щоб переміститись назад до того місця звідки прийшли натисніть CTRL-O.
+ Повторіть щоб повернутись ще далі. (Це як кнопка назад в браузері)
+ CTRL-I переміщує вперед.
+
+---> "очепятка" не є способом написати опечатка; очепятка це опечатка.
+Примітка: Коли пошук досягає кінця файлу він продовжує з початку, хіба що
+ опція 'wrapscan' була виключена.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.3: ПОШУК ПАРНИХ ДУЖОК
+
+
+ ** Введіть % щоб знайти парну ),], чи } . **
+
+ 1. Помістіть курсор над будь-якою (, [, чи { в рядку нижче позначеному --->.
+
+ 2. Тепер введіть символ % .
+
+ 3. Курсор переміститься до відповідної дужки.
+
+ 4. Введіть % щоб перемістити курсор до іншої парної дужки.
+
+ 5. Спробуйте з іншими дужками, і подивіться що вийде.
+
+---> Це ( тестовий рядок ( з такими [ такими ] і такими { дужками } в ньому. ))
+
+
+Примітка: Це корисно при відлагоджуванні програми з неправильними дужками.
+ І взагалі в кожному тексті дужки мають стояти правильно!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 4.4: КОМАНДА ЗАМІНИ
+
+
+ ** Наберіть :s/старе/нове/g щоб замінити 'старе' на 'нове'. **
+
+ 1. Перемістіть курсор до лінії нижче позначеної --->.
+
+ 2. Введіть :s/(біп)/блять [ENTER] . Зауважте що ця команда змінює тільки перше
+ входження (біп) в рядку.
+
+ 3. Потім наберіть :s/(біп)/блять/g . Додавання g вказує що заміни
+ робляться у всьому рядку глобально.
+
+---> люди не лю(біп), коли в слові "лю(біп)" "(біп)" заміняють на "(бiп)".
+
+ 4. Щоб замінити кожне входження послідовності символів між двома рядками
+ наберіть :#,#s/старе/нове/g де #,# діапазон рядків в яких робиться
+ заміна.
+ Введіть :%s/старе/нове/g щоб змінити кожне входження у цілому файлі.
+ Введіть :%s/старе/нове/gc щоб замінити, кожне входження у файлі з
+ підтвердженням кожної заміни.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ПІДСУМОК УРОКУ 4
+
+
+ 1. CTRL-G виводить вашу позицію в файлі і назву файлу.
+ G переміщує в кінець файлу.
+ число G переміщує до рядка з вказаним номером.
+ gg переміщує до першого рядка.
+
+ 2. Ввід / і послідовності символів шукає послідовність ПІСЛЯ курсора.
+ Ввід ? і послідовності символів шукає послідовність ПЕРЕД курсором.
+
+ Після пошуку введіть n щоб знайти наступне входження в тому ж напрямку
+ або N щоб шукати в протилежному напрямку.
+ CTRL-O відносить вас до старішої позиції, CTRL-I до новішої позиції.
+
+ 3. Ввід % коли курсор знаходиться над дужкою (,),[,],{, чи } переносить
+ курсор до протилежної дужки.
+
+ 4. Щоб замінити перше входження старого слова на нове :s/старе/нове
+ Щоб замінити всі старі слова рядка на нові :s/старе/нове/g
+ Щоб замінити фрази між двома рядками :#,#s/старе/нове/g
+ Щоб замінити всі входження в файлі :%s/старе/нове/g
+ Щоб щоразу підтверджувати заміну додайте 'c' :%s/старе/нове/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.1: ЯК ВИКОНАТИ ЗОВНІШНЮ КОМАНДУ
+
+
+ ** Введіть :! і зовнішню команду, щоб виконати ту команду. **
+
+ 1. Введіть відому команду : щоб встановити курсор в низу екрану.
+ Це дозволяє вводити команди командного рядка.
+
+ 2. Тепер введіть ! (символ знаку оклику) . Це дозволить вам виконати
+ будь-яку зовнішню команду.
+
+ 3. Як приклад введіть :!ls [ENTER]. Це покаже список файлів каталогу, так
+ так ніби ви знаходитесь в оболонці терміналу. Або використайте :!dir
+ якщо ви раптом знаходитесь в Windows.
+
+Примітка: Можна запускати будь-яку зовнішню команду таким способом, навіть з
+ аргументами.
+
+Примітка: Всі команди що починаються з : мають закінчуватись натисканням
+ [ENTER]. Більше на цьому не наголошуватиметься.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.2: ЩЕ ПРО ЗАПИС ФАЙЛІВ
+
+
+ ** Щоб зберегти змінений текст, введіть :w НАЗВА_ФАЙЛУ **
+
+ 1. Введіть :!dir чи :!ls щоб переглянути вміст вашої директорії.
+ Вам вже казали що після цього тиснуть [ENTER].
+
+ 2. Виберіть ім'я файлу яке ще не використовується, наприклад TEST.
+ (Взагалі то це не обов'язково, якщо вміст обраного файлу не
+ є цінним)
+
+ 3. Тепер введіть: :w TEST (де TEST це назва яку ви обрали.)
+
+ 4. Це зберігає увесь файл (підручник Vim ) під ім'ям TEST.
+ Щоб перевірити знову наберіть :!ls щоб побачити зміни в каталозі.
+
+Примітка: Якщо ви вийдете з Vim і запустите його знову командою vim TEST,
+ файл що ви відкриєте буде точною копією цього, коли ви його зберегли.
+
+ 5. Зараз видаліть файл ввівши (Unix): :!rm TEST
+ чи (MS-DOS): :!del TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.3: ВИБІР ТЕКСТУ ДЛЯ ЗАПИСУ
+
+
+ ** Щоб зберегти частину файлу, наберіть v переміщення :w НАЗВА_ФАЙЛУ **
+
+ 1. Перемістіть курсор до цього рядка.
+
+ 2. Натисніть v і перемістіть курсор на п'ять пунктів нижче. Зауважте, що
+ текст виділяється.
+
+ 3. Натисніть символ : . Внизу екрану з'являються символи :'<,'> .
+
+ 4. Введіть w TEST , де TEST назва файлу що ще не використовується.
+ Переконайтесь що ви бачите :'<,'>w TEST перед тим як натиснути [ENTER].
+
+ 5. Vim запише вибрані рядки в файл TEST. Використайте :!dir чи !ls
+ щоб побачити це. Поки що не видаляйте його! Ми використаємо TEST в
+ наступному уроці.
+
+Зауваження: Натискання v починає режим візуального виділення. Ви можете
+ переміщувати курсор щоб змінити розмір вибраної частини.
+ Потім можна використати оператор щоб зробити щось з текстом.
+ Наприклад d видалить текст.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 5.4: ОТРИМАННЯ І ЗЛИТТЯ ФАЙЛІВ
+
+
+ ** Щоб вставити вміст файлу введіть :r НАЗВА_ФАЙЛУ **
+
+ 1. Помістіть курсор десь над цим рядком.
+
+Зауваження: Після виконання кроку 2 ви побачите текст з уроку 5.3. Тоді
+ перемістіться вниз, щоб побачити вміст цього уроку знову.
+
+ 2. Тоді отримайте вміст вашого файлу TEST використавши команду :r TEST ,
+ де TEST назва файлу що ви використали.
+ Файл що ви отримуєте поміщується під рядком курсора.
+
+ 3. Щоб перевірити що файл вставлено, прокрутіть текст назад, і переконаєтесь
+ що тепер є дві копії урок 5.3, the original and the file version.
+
+Примітка: Також ви можете вставляти вивід зовнішньої програми. Наприклад
+ :r !ls читає вивід команди ls і вставляє його під курсором.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Підсумок 5 уроку
+
+
+ 1. :!команда виконує зовнішню команду.
+
+ 2. :w НАЗВА_ФАЙЛУ записує поточний файл на диск під назвою НАЗВА_ФАЙЛУ.
+
+ 3. v переміщення :w НАЗВА_ФАЙЛУ зберігає візуально виділену частину тексту
+ в файл НАЗВА_ФАЙЛУ.
+
+ 4. :r НАЗВА_ФАЙЛУ отримує з диску файл НАЗВА_ФАЙЛУ і вставляє його під
+ курсором.
+
+ 5. :r !ls читає вивід команди ls і вставляє її під поточною позицією курсора
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.1: КОМАНДА ВСТАВКИ
+
+
+ ** Введіть o щоб вставити новий рядок під курсором. **
+
+ 1. Перемістіть курсор на рядок нижче, позначений --->.
+
+ 2. Натисніть o щоб вставити новий рядок ПІД курсором та перейти в
+ режим вставки.
+
+ 3. Тепер введіть текст і натисніть [ESC] щоб вийти з режиму вставки.
+
+---> Після натискання o курсор ставиться на наступний рядок в режимі вставки.
+
+ 4. Щоб вставити рядок НАД ABOVE курсором пишуть O в верхньому регістрі,
+ замість o. Спробуйте на рядку нижче.
+
+---> Щоб вставити рядок над цим введіть O .
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.2: КОМАНДА ДОПИСУВАННЯ
+
+
+ ** Натисніть a щоб вставити текст після курсору. **
+
+ 1. Перемістіть курсор до початку рядка внизу позначеного --->.
+
+ 2. Тисніть e поки курсор не буде в кінці ря .
+
+ 3. Натисніть a (маленьке) щоб додати текст ПІСЛЯ курсору.
+
+ 4. Допишіть слова як рядок внизу. Натисніть [ESC] щоб вийти з режиму
+ вставки.
+
+ 5. Використайте e щоб переміститись до наступного неповного слова та
+ to move to the next incomplete word and repeat steps 3 and 4.
+
+---> Цей ря дозволить вам попрактикува в дописува тексту до рядка.
+---> Цей рядок дозволить вам попрактикуватись в дописуванні тексту до рядка.
+
+Примітка: a, i і A переходять в один і той же режим вставки, єдиною різницею
+ є тільки те, де вставляються символи.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.3: ІНШИЙ СПОСІБ ЗАМІНИ
+
+
+ ** Введіть велику R щоб замінити більш ніж один символ. **
+
+ 1. Перемістіть курсор до першого рядка внизу позначеного --->.
+ Перемістіть курсор до першого xxx .
+
+ 2. Тепер натисніть R і введіть номер під ним з другого рядка, так що він
+ замінює xxx .
+
+ 3. Натисніть [ESC] щоб покинути режим заміни. Зауважте, що решта рядка
+ залишається незмінною.
+
+ 4. Повторіть кроки від 1 до 3 щоб замінити всі xxx на числа з другого рядка.
+
+---> Додавання 123 до xxx дає xxx.
+---> Додавання 123 до 456 дає 579.
+
+Зауваження: Режим заміни подібний до режиму вставки, тільки кожен введений
+ символ видаляє символ який стояв на його місці.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.4: КОПІЮВАННЯ І ВСТАВКА
+
+
+ ** Використайте оператор y щоб копіювати текст і p щоб його вставити **
+
+ 1. Перейдіть до рядка нижче позначеного ---> і покладіть курсор після "а)".
+
+ 2. Перейдіть в візуальний режим за допомогою клавіші v і перемістіть курсор
+ якраз перед словом "один".
+
+ 3. Введіть y щоб копіювати (yank) виділений текст.
+
+ 4. Перемістіть курсор до кінця наступного рядка: j$
+
+ 5. Натисніть p щоб вставити (put) текст. Тоді введіть : два [ESC] .
+
+ 6. так само додайте третій рядочок.
+
+---> а) це рядок номер один
+ б)
+
+ Зауваження: також можна використовувати y як оператор;
+ yw копіює одне слово.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 6.5: ВСТАНОВЛЕННЯ ОПЦІЙ
+
+
+ ** Встановити опцію так що пошук чи заміна буде ігнорувати регістр **
+
+ 1. Знайдіть слово 'ігнорувати' ввівши : /ігнорувати
+ Повторіть кілька разів натискаючи n .
+
+ 2. Встановіть опцію ігнорування регістру 'ic' (Ignore case) ввівши: :set ic
+
+ 3. Тепер пошукайте 'ігнорувати' знову ввівши n
+ Зауважте що Ігнорувати та ІГНОРУВАТИ тепер також знаходяться.
+
+ 4. Ввімкніть 'hlsearch' (підсвітку пошуку) і 'incsearch' (інтерактивність)
+ командою :set hls is .
+
+ 5. Тепер пошукайте щось знову і зауважте зміни: /ігнорувати [ENTER]
+
+ 6. Щоб вимкнути ігнорування регістру напишіть: :set noic
+
+Примітка: Щоб вимкнути підсвітку співпадінь введіть: :nohlsearch
+Примітка: Якщо ви хочете не брати до уваги регістр тільки під час одного пошуку
+ використайте ключ \c. Наприклад: /ігнорувати\c [ENTER]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ПІДСУМОК УРОКУ 6
+
+ 1. Введіть о щоб додати рядок ПІД курсором і почати режим вставки.
+ Введіть O щоб додати рядок НАД курсором.
+
+ 2. Введіть a щоб вставити текст ПІСЛЯ курсора.
+ Введіть A щоб додати текст до рядка.
+
+ 3. Переміщення e переміщує нас до кінця слова.
+
+ 4. Оператор y копіює текст, p вставляє його.
+
+ 5. Введення R переносить нас в режим заміни до натискання [ESC].
+
+ 6. Набір ":set xxx" встановлює опцію "xxx". Деякі опції:
+ 'ic' 'ignorecase' ігнорувати верхній/нижній регістр при пошуку
+ 'is' 'incsearch' показувати співпадіння пошуку під час введення
+ фрази
+ 'hls' 'hlsearch' пісвічувати всі співпадіння
+ Можна одночасно використовувати і коротку і довгу форму запису опції.
+
+ 7. Використайте префікс "no" щоб вимкнути опцію: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7.1: ОТРИМАННЯ ДОПОМОГИ
+
+
+ ** Використання вбудованої довідкової системи **
+
+ Vim має всеосяжну систему довідки. Щоб ознайомитись з нею спробуйте один з
+ таких способів:
+ - натисніть кнопку [HELP] (якщо така є)
+ - натисніть [F1]
+ - наберіть :help
+
+ Прочитайте текст в вікні допомоги, щоб вияснити як вона працює.
+ Натисніть CTRL-W двічі щоб змінити вікно
+ Наберіть :q щоб закрити вікно довідки.
+
+ Можна знайти довідку майже на будь-яку тему додаючи аргумент після команди
+ ":help" . Спробуйте одну з наступних (не забувайте натискати [ENTER]):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7.2: СТВОРЕННЯ СКРИПТА АВТОЗАПУСКУ
+
+
+ ** Ввімкнення додаткових функцій Vim **
+
+ Vim має набагато більше функцій ніж Vi, але більшість з них відключені за
+ замовчуванням. Щоб почати використання додаткових функцій потрібно створити
+ файл "vimrc".
+
+ 1. Почніть редагування файлу "vimrc" . Це залежить від вашої системи:
+ :e ~/.vimrc для Unix
+ :e ~/_vimrc для MS-Windows
+
+ 2. Тепер прочитайте приклад вмісту "vimrc" :
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Збережіть файл:
+ :w
+
+ Наступного разу коли ви запустите Vim він буде використовувати підсвітку
+ синтаксису. Можна додати всі ваші улюблені налаштування в цей файл. Для більш
+ детальної інформації введіть :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Урок 7.3: АВТОДОПОВНЕННЯ
+
+
+ ** Автодоповнення за допомогою CTRL-D і [TAB] **
+
+ 1. Переконайтесь що в Vim не включена зворотня сумісність: :set nocp
+
+ 2. Подивіться що за файли існують в каталозі: :!ls чи :!dir
+
+ 3. Введіть початок команди: :e
+
+ 4. Натисніть CTRL-D і Vim покаже список команд що починаються з "e".
+
+ 5. Натисніть [TAB] і Vim доповнить команду до ":edit".
+
+ 6. Тепер додайте пропуск і початок існуючого імені файлу: :edit FIL
+
+ 7. Натисніть [TAB]. Vim доповнить ім'я (якщо воно унікальне).
+
+Зауваження: Доповнення працює для багатьох команд. Просто натискайте CTRL-D і
+ [TAB]. Це особливо корисно для команди :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ПІДСУМОК УРОКУ 7
+
+
+ 1. Введіть :help або натисніть [F1] щоб відкрити вікно довідки.
+
+ 2. Введіть :help тема щоб знайти довідку про тему .
+
+ 3. Введіть CTRL-W CTRL-W щоб змінити вікно.
+
+ 4. Наберіть :q щоб закрити вікно
+
+ 5. Створіть скрипт vimrc щоб змінювати ваші налаштування при запуску.
+
+ 6. При наборі команди що починається з двокрапки : натисніть CTRL-D
+ щоб побачити можливі доповнення. Натисніть [TAB] щоб побачити одне з
+ доповнень.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Це завершує уроки Vim . Вони були націлені щоб дати вам короткий вступ в
+ редактор Vim, достатній для того щоб використовувати редактор комфортно.
+ Ці уроки зовсім далеко від повних, бо Vim має набагато більше команд. Можна
+ прочитати інструкцію користувача : ":help user-manual".
+
+ Для подальшого читання і вивчення рекомендується така книжка:
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+ Особливо корисна для початківців.
+ Там багато прикладів і ілюстрацій.
+ Дивіться https://iccf-holland.org/click5.html
+
+ Ці уроки були написані Майклом С. Пірсом та Робертом Уаром.
+
+ Модифіковано для Vim Бремом Муленаром.
+
+
+ Переклад на українську Буник Т.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.utf-8 b/runtime/tutor/tutor.utf-8
new file mode 100644
index 0000000..3df15f1
--- /dev/null
+++ b/runtime/tutor/tutor.utf-8
@@ -0,0 +1,972 @@
+===============================================================================
+= W e l c o m e t o t h e V I M T u t o r - Version 1.7 =
+===============================================================================
+
+ 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.
+
+ The approximate time required to complete the tutor is 30 minutes,
+ depending upon how much time is spent with experimentation.
+
+ ATTENTION:
+ The commands in the lessons will modify the text. Make a copy of this
+ file to practice on (if you started "vimtutor" this is already a copy).
+
+ It is important to remember that this tutor is set up to teach by
+ use. That means that you need to execute the commands to learn them
+ properly. If you only read the text, you will forget the commands!
+
+ Now, make sure that your Caps-Lock key is NOT depressed and press
+ the j key enough times to move the cursor so that lesson 1.1
+ completely fills the screen.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 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.
+ v
+ 1. Move the cursor around the screen until you are comfortable.
+
+ 2. Hold down the down key (j) 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.
+
+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!!
+
+ 1. Press the <ESC> key (to make sure you are in Normal mode).
+
+ 2. Type: :q! <ENTER>.
+ This exits the editor, DISCARDING any changes you have made.
+
+ 3. Get back here by executing the command that got you into this tutor. That
+ might be: vimtutor <ENTER>
+
+ 4. If you have these steps memorized and are confident, execute steps
+ 1 through 3 to exit and re-enter the editor.
+
+NOTE: :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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.3: TEXT EDITING - DELETION
+
+
+ ** Press x to delete the character under the cursor. **
+
+ 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.
+
+ 3. Press the x key to delete the unwanted character.
+
+ 4. Repeat steps 2 through 4 until the sentence is correct.
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 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.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.4: TEXT EDITING - INSERTION
+
+
+ ** Press i to insert text. **
+
+ 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
+ of the character BEFORE which the text is to be inserted.
+
+ 3. Press i and type in the necessary additions.
+
+ 4. As each error is fixed press <ESC> to return to Normal mode.
+ Repeat steps 2 through 4 to correct the sentence.
+
+---> 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.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.5: TEXT EDITING - APPENDING
+
+
+ ** Press A 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.
+
+ 2. Press A and type in the necessary additions.
+
+ 3. As the text has been appended press <ESC> to return to Normal mode.
+
+ 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
+ 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1.6: EDITING A FILE
+
+ ** Use :wq to save a file and exit. **
+
+ !! NOTE: Before executing any of the steps below, read this entire lesson!!
+
+ 1. If you have access to another terminal, do the following there.
+ Otherwise, exit this tutor as you did in lesson 1.2: :q!
+
+ 2. At the shell prompt type this command: vim file.txt <ENTER>
+ 'vim' is the command to start the Vim editor, 'file.txt' is the name of
+ the file you wish to edit. Use the name of a file that you can change.
+
+ 3. Insert and delete text as you learned in the previous lessons.
+
+ 4. Save the file with changes and exit Vim with: :wq <ENTER>
+
+ 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 1 SUMMARY
+
+
+ 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: vim FILENAME <ENTER>
+
+ 3. To exit Vim type: <ESC> :q! <ENTER> to trash all changes.
+ OR type: <ESC> :wq <ENTER> to save the changes.
+
+ 4. To delete the character at the cursor type: x
+
+ 5. To insert or append text type:
+ i type inserted text <ESC> insert before the cursor
+ A type appended text <ESC> append after the line
+
+NOTE: Pressing <ESC> will place you in Normal mode or will cancel
+ an unwanted and partially completed command.
+
+Now continue with lesson 2.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.1: DELETION COMMANDS
+
+
+ ** Type dw to delete a word. **
+
+ 1. Press <ESC> to make sure you are in Normal mode.
+
+ 2. Move the cursor to the line below marked --->.
+
+ 3. Move the cursor to the beginning of a word that needs to be deleted.
+
+ 4. Type dw to make the word disappear.
+
+ NOTE: The letter d will appear on the last line of the screen as you type
+ it. Vim is waiting for you to type w . If you see another character
+ than d you typed something wrong; press <ESC> and start over.
+
+---> 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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.2: MORE DELETION COMMANDS
+
+
+ ** Type d$ to delete to the end of the line. **
+
+ 1. Press <ESC> to make sure you are in Normal mode.
+
+ 2. Move the cursor to the line below marked --->.
+
+ 3. Move the cursor to the end of the correct line (AFTER the first . ).
+
+ 4. Type d$ to delete to the end of the line.
+
+---> 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.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.3: ON OPERATORS AND MOTIONS
+
+
+ Many commands that change text are made from an operator and a motion.
+ The format for a delete command with the d delete operator is as follows:
+
+ d motion
+
+ Where:
+ d - is the delete operator.
+ motion - is what the operator will operate on (listed below).
+
+ A short list of motions:
+ w - until the start of the next word, EXCLUDING its first character.
+ 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 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 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 below marked --->.
+
+ 2. Type 2w to move the cursor two words forward.
+
+ 3. Type 3e to move the cursor to the end of the third word forward.
+
+ 4. Type 0 (zero) to move to the start of the line.
+
+ 5. Repeat steps 2 and 3 with different numbers.
+
+---> This is just a line with words you can move around in.
+
+ 6. Move on to lesson 2.5.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.5: USING A COUNT TO DELETE MORE
+
+
+ ** Typing a number with an operator repeats it that many times. **
+
+ 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 --->.
+
+ 2. Type d2w 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.
+
+---> 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. **
+
+ 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 to delete the line.
+ 3. Now move to the fourth line.
+ 4. Type 2dd to delete two lines.
+
+---> 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.
+
+Doubling to operate on a line also works for operators mentioned below.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2.7: THE UNDO COMMAND
+
+
+ ** Press u to undo the last commands, U to fix a whole line. **
+
+ 1. Move the cursor to the line below marked ---> and place it on the
+ first error.
+ 2. Type x to delete the first unwanted character.
+ 3. Now type u to undo the last command executed.
+ 4. This time fix all the errors on the line using the x command.
+ 5. Now type a capital U to return the line to its original state.
+ 6. Now type u a few times to undo the U and preceding commands.
+ 7. Now type CTRL-R (keeping CTRL key pressed while hitting R) a few times
+ to redo the commands (undo the undos).
+
+---> 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.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 2 SUMMARY
+
+ 1. To delete from the cursor up to the next word type: dw
+ 2. To delete from the cursor up to the end of the word type: de
+ 3. To delete from the cursor to the end of a line type: d$
+ 4. To delete a whole line type: dd
+
+ 5. To repeat a motion prepend it with a number: 2w
+ 6. The format for a change command is:
+ operator [number] motion
+ where:
+ operator - is what to do, such as d for delete
+ [number] - is an optional count to repeat the motion
+ motion - moves over the text to operate on, such as w (word),
+ e (end of word), $ (end of the line), etc.
+
+ 7. To move to the start of the line use a zero: 0
+
+ 8. To undo previous actions, type: u (lowercase u)
+ To undo all the changes on a line, type: U (capital U)
+ To undo the undos, type: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.1: THE PUT COMMAND
+
+
+ ** Type p to put previously deleted text after the cursor. **
+
+ 1. Move the cursor to the first line below marked --->.
+
+ 2. Type dd 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.
+
+ 4. Type p to put the line below the cursor.
+
+ 5. Repeat steps 2 through 4 to put all the lines in correct order.
+
+---> 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 to replace the character at the cursor with x . **
+
+ 1. Move the cursor to the first line below marked --->.
+
+ 2. Move the cursor so that it is on top of the first error.
+
+ 3. Type r and then the character which should be there.
+
+ 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!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 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 . **
+
+ 1. Move the cursor to the first line below marked --->.
+
+ 2. Place the cursor on the u in lubw.
+
+ 3. Type ce and the correct word (in this case, type ine ).
+
+ 4. Press <ESC> 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.
+
+---> 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 ce deletes the word and places you in Insert mode.
+ cc does the same for the whole line.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 3.4: MORE CHANGES USING c
+
+
+ ** 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:
+
+ c [number] motion
+
+ 2. The motions are the same, such as w (word) and $ (end of line).
+
+ 3. Move the cursor to the first line below marked --->.
+
+ 4. Move the cursor to the first error.
+
+ 5. Type c$ and type the rest of the line like the second and press <ESC>.
+
+---> 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$ command.
+
+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 . 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 and then the
+ character you want to have there.
+
+ 3. The change operator allows you to change from the cursor to where the
+ motion takes you. eg. Type ce to change from the cursor to the end of
+ the word, c$ to change to the end of a line.
+
+ 4. The format for change is:
+
+ c [number] motion
+
+Now go on to the next lesson.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.1: CURSOR LOCATION AND FILE STATUS
+
+ ** Type CTRL-G to show your location in the file and the file status.
+ Type G to move to a line in the file. **
+
+ NOTE: Read this entire lesson before executing any of the steps!!
+
+ 1. Hold down the Ctrl key and press g . We call this CTRL-G.
+ 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' option is set (see :help 'ruler' )
+
+ 2. Press G to move you to the bottom of the file.
+ Type gg to move you to the start of the file.
+
+ 3. Type the number of the line you were on and then G . This will
+ return you to the line you were on when you first pressed CTRL-G.
+
+ 4. If you feel confident to do this, execute steps 1 through 3.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.2: THE SEARCH COMMAND
+
+
+ ** Type / followed by a phrase to search for the phrase. **
+
+ 1. In Normal mode type the / character. Notice that it and the cursor
+ appear at the bottom of the screen as with the : command.
+
+ 2. Now type 'errroor' <ENTER>. This is the word you want to search for.
+
+ 3. To search for the same phrase again, simply type n .
+ To search for the same phrase in the opposite direction, type N .
+
+ 4. To search for a phrase in the backward direction, use ? instead of / .
+
+ 5. To go back to where you came from press CTRL-O (Keep Ctrl down while
+ pressing the letter o). Repeat to go back further. CTRL-I goes forward.
+
+---> "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' option has been reset.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.3: MATCHING PARENTHESES SEARCH
+
+
+ ** Type % to find a matching ),], or } . **
+
+ 1. Place the cursor on any (, [, or { in the line below marked --->.
+
+ 2. Now type the % character.
+
+ 3. The cursor will move to the matching parenthesis or bracket.
+
+ 4. Type % to move the cursor to the other matching bracket.
+
+ 5. Move the cursor to another (,),[,],{ or } and see what % does.
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+
+NOTE: This is very useful in debugging a program with unmatched parentheses!
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4.4: THE SUBSTITUTE COMMAND
+
+
+ ** Type :s/old/new/g to substitute 'new' for 'old'. **
+
+ 1. Move the cursor to the line below marked --->.
+
+ 2. Type :s/thee/the <ENTER> . Note that this command only changes the
+ first occurrence of "thee" in the line.
+
+ 3. Now type :s/thee/the/g . Adding the g flag 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.
+
+ 4. To change every occurrence of a character string between two lines,
+ type :#,#s/old/new/g where #,# are the line numbers of the range
+ of lines where the substitution is to be done.
+ Type :%s/old/new/g to change every occurrence in the whole file.
+ Type :%s/old/new/gc to find every occurrence in the whole file,
+ with a prompt whether to substitute or not.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 4 SUMMARY
+
+
+ 1. CTRL-G displays your location in the file and the file status.
+ G moves to the end of the file.
+ number G moves to that line number.
+ gg moves to the first line.
+
+ 2. Typing / followed by a phrase searches FORWARD for the phrase.
+ Typing ? followed by a phrase searches BACKWARD for the phrase.
+ After a search type n to find the next occurrence in the same direction
+ or N to search in the opposite direction.
+ CTRL-O takes you back to older positions, CTRL-I to newer positions.
+
+ 3. Typing % while the cursor is on a (,),[,],{, or } goes to its match.
+
+ 4. To substitute new for the first old in a line type :s/old/new
+ To substitute new for all 'old's on a line type :s/old/new/g
+ To substitute phrases between two line #'s type :#,#s/old/new/g
+ To substitute all occurrences in the file type :%s/old/new/g
+ To ask for confirmation each time add 'c' :%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.1: HOW TO EXECUTE AN EXTERNAL COMMAND
+
+
+ ** Type :! followed by an external command to execute that command. **
+
+ 1. Type the familiar command : to set the cursor at the bottom of the
+ screen. This allows you to enter a command-line command.
+
+ 2. Now type the ! (exclamation point) character. This allows you to
+ execute any external shell command.
+
+ 3. As an example type ls following the ! and then hit <ENTER>. This
+ will show you a listing of your directory, just as if you were at the
+ shell prompt. Or use :!dir if ls doesn't work.
+
+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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.2: MORE ON WRITING FILES
+
+
+ ** To save the changes made to the text, type :w FILENAME **
+
+ 1. Type :!dir or :!ls to get a listing of your directory.
+ You already know you must hit <ENTER> after this.
+
+ 2. Choose a filename that does not exist yet, such as TEST.
+
+ 3. Now type: :w TEST (where TEST is the filename you chose.)
+
+ 4. This saves the whole file (the Vim Tutor) under the name TEST.
+ To verify this, type :!dir or :!ls again to see your directory.
+
+NOTE: If you were to exit Vim and start it again with vim TEST , the file
+ would be an exact copy of the tutor when you saved it.
+
+ 5. Now remove the file by typing (Windows): :!del TEST
+ or (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.3: SELECTING TEXT TO WRITE
+
+
+ ** To save part of the file, type v motion :w FILENAME **
+
+ 1. Move the cursor to this line.
+
+ 2. Press v and move the cursor to the fifth item below. Notice that the
+ text is highlighted.
+
+ 3. Press the : character. At the bottom of the screen :'<,'> will appear.
+
+ 4. Type w TEST , where TEST is a filename that does not exist yet. Verify
+ that you see :'<,'>w TEST before you press <ENTER>.
+
+ 5. Vim will write the selected lines to the file TEST. Use :!dir or :!ls
+ to see it. Do not remove it yet! We will use it in the next lesson.
+
+NOTE: Pressing v starts Visual selection. 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 deletes the text.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.4: RETRIEVING AND MERGING FILES
+
+
+ ** To insert the contents of a file, type :r FILENAME **
+
+ 1. Place the cursor just above this line.
+
+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 :r TEST 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.
+
+NOTE: You can also read the output of an external command. For example,
+ :r !ls reads the output of the ls command and puts it below the
+ cursor.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5 SUMMARY
+
+
+ 1. :!command executes an external command.
+
+ Some useful examples are:
+ (Windows) (Unix)
+ :!dir :!ls - shows a directory listing.
+ :!del FILENAME :!rm FILENAME - removes file FILENAME.
+
+ 2. :w FILENAME writes the current Vim file to disk with name FILENAME.
+
+ 3. v motion :w FILENAME saves the Visually selected lines in file
+ FILENAME.
+
+ 4. :r FILENAME retrieves disk file FILENAME and puts it below the
+ cursor position.
+
+ 5. :r !dir reads the output of the dir command and puts it below the
+ cursor position.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.1: THE OPEN COMMAND
+
+
+ ** Type o to open a line below the cursor and place you in Insert mode. **
+
+ 1. Move the cursor to the first line below marked --->.
+
+ 2. Type the lowercase letter o to open up a line BELOW the cursor and place
+ you in Insert mode.
+
+ 3. Now type some text and press <ESC> to exit Insert mode.
+
+---> After typing o 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 , rather
+ than a lowercase o. Try this on the line below.
+
+---> Open up a line above this by typing O while the cursor is on this line.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.2: THE APPEND COMMAND
+
+
+ ** Type a to insert text AFTER the cursor. **
+
+ 1. Move the cursor to the start of the first line below marked --->.
+
+ 2. Press e until the cursor is on the end of li .
+
+ 3. Type an a (lowercase) to append text AFTER the cursor.
+
+ 4. Complete the word like the line below it. Press <ESC> to exit Insert
+ mode.
+
+ 5. Use e 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.
+---> This line will allow you to practice appending text to a line.
+
+NOTE: a, i and 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 to replace more than one character. **
+
+ 1. Move the cursor to the first line below marked --->. Move the cursor to
+ the beginning of the first xxx .
+
+ 2. Now press R and type the number below it in the second line, so that it
+ replaces the xxx .
+
+ 3. Press <ESC> to leave Replace mode. Notice that the rest of the line
+ remains unmodified.
+
+ 4. Repeat the steps to replace the remaining xxx.
+
+---> 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.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.4: COPY AND PASTE TEXT
+
+
+ ** Use the y operator to copy text and p to paste it **
+
+ 1. Move to the line below marked ---> and place the cursor after "a)".
+
+ 2. Start Visual mode with v and move the cursor to just before "first".
+
+ 3. Type y to yank (copy) the highlighted text.
+
+ 4. Move the cursor to the end of the next line: j$
+
+ 5. Type p to put (paste) the text. Then type: a second <ESC> .
+
+ 6. Use Visual mode to select " item.", yank it with y , move to the end of
+ the next line with j$ and put the text there with p .
+
+---> a) this is the first item.
+ b)
+
+ NOTE: You can also use y as an operator: yw yanks one word,
+ yy yanks the whole line, then p puts that line.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6.5: SET OPTION
+
+
+ ** Set an option so a search or substitute ignores case **
+
+ 1. Search for 'ignore' by entering: /ignore <ENTER>
+ Repeat several times by pressing n .
+
+ 2. Set the 'ic' (Ignore case) option by entering: :set ic
+
+ 3. Now search for 'ignore' again by pressing n
+ Notice that Ignore and IGNORE are now also found.
+
+ 4. Set the 'hlsearch' and 'incsearch' options: :set hls is
+
+ 5. Now type the search command again and see what happens: /ignore <ENTER>
+
+ 6. To disable ignoring case enter: :set noic
+
+NOTE: To remove the highlighting of matches enter: :nohlsearch
+NOTE: If you want to ignore case for just one search command, use \c
+ in the phrase: /ignore\c <ENTER>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 6 SUMMARY
+
+ 1. Type o to open a line BELOW the cursor and start Insert mode.
+ Type O to open a line ABOVE the cursor.
+
+ 2. Type a to insert text AFTER the cursor.
+ Type A to insert text after the end of the line.
+
+ 3. The e command moves to the end of a word.
+
+ 4. The y operator yanks (copies) text, p puts (pastes) it.
+
+ 5. Typing a capital R enters Replace mode until <ESC> is pressed.
+
+ 6. Typing ":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
+ 'hls' 'hlsearch' highlight all matching phrases
+ You can either use the long or the short option name.
+
+ 7. Prepend "no" to switch an option off: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7.1: GETTING HELP
+
+
+ ** Use the on-line help system **
+
+ Vim has a comprehensive on-line help system. To get started, try one of
+ these three:
+ - press the <HELP> key (if you have one)
+ - press the <F1> key (if you have one)
+ - type :help <ENTER>
+
+ Read the text in the help window to find out how the help works.
+ Type CTRL-W CTRL-W to jump from one window to another.
+ Type :q <ENTER> 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 w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7.2: CREATE A STARTUP SCRIPT
+
+
+ ** Enable Vim features **
+
+ Vim has many more features than Vi, but most of them are disabled by
+ default. To start using more features you should create a "vimrc" file.
+
+ 1. Start editing the "vimrc" file. This depends on your system:
+ :e ~/.vimrc for Unix
+ :e ~/_vimrc for Windows
+
+ 2. Now read the example "vimrc" file contents:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. Write the file with:
+ :w
+
+ 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
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7.3: COMPLETION
+
+
+ ** Command line completion with CTRL-D and <TAB> **
+
+ 1. Make sure Vim is not in compatible mode: :set nocp
+
+ 2. Look what files exist in the directory: :!ls or :!dir
+
+ 3. Type the start of a command: :e
+
+ 4. Press CTRL-D and Vim will show a list of commands that start with "e".
+
+ 5. Type d<TAB> and Vim will complete the command name to ":edit".
+
+ 6. Now add a space and the start of an existing file name: :edit FIL
+
+ 7. Press <TAB>. Vim will complete the name (if it is unique).
+
+NOTE: Completion works for many commands. Just try pressing CTRL-D and
+ <TAB>. It is especially useful for :help .
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 7 SUMMARY
+
+
+ 1. Type :help or press <F1> or <HELP> to open a help window.
+
+ 2. Type :help cmd to find help on cmd .
+
+ 3. Type CTRL-W CTRL-W to jump to another window.
+
+ 4. Type :q to close the help window.
+
+ 5. Create a vimrc startup script to keep your preferred settings.
+
+ 6. When typing a : command, press CTRL-D to see possible completions.
+ Press <TAB> to use one completion.
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ This concludes the Vim Tutor. It 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. Read the user
+ manual next: ":help user-manual".
+
+ For further reading and studying, this book is recommended:
+ Vim - Vi Improved - by Steve Oualline
+ Publisher: New Riders
+ The first book completely dedicated to Vim. Especially useful for beginners.
+ There are many examples and pictures.
+ See https://iccf-holland.org/click5.html
+
+ This book is older and more about Vi than Vim, but also recommended:
+ Learning the Vi Editor - by Linda Lamb
+ Publisher: O'Reilly & Associates Inc.
+ It is a good book to get to know almost anything you want to do with Vi.
+ The sixth edition also includes information on Vim.
+
+ 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.
+
+ Modified for Vim by Bram Moolenaar.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.vi.utf-8 b/runtime/tutor/tutor.vi.utf-8
new file mode 100644
index 0000000..2e967c8
--- /dev/null
+++ b/runtime/tutor/tutor.vi.utf-8
@@ -0,0 +1,812 @@
+===============================================================================
+= Xin chào mừng bạn đến với Hướng dẫn dùng Vim - Phiên bản 1.5 =
+===============================================================================
+ Vim là một trình soạn thảo rất mạnh. Vim có rất nhiều câu lệnh,
+ chính vì thế không thể trình bày hết được trong cuốn hướng dẫn này.
+ Cuốn hướng dẫn chỉ đưa ra những câu lệnh để giúp bạn sử dụng Vim
+ được dễ dàng hơn. Đây cũng chính là mục đich của sách
+
+ Cần khoảng 25-30 phút để hoàn thành bài học, phụ thuộc vào thời
+ gian thực hành.
+
+ Các câu lệnh trong bài học sẽ thay đổi văn bản này. Vì thế hãy tạo
+ một bản sao của tập tin này để thực hành (nếu bạn dùng "vimtutor"
+ thì đây đã là bản sao).
+
+ Hãy nhớ rằng hướng dẫn này viết với nguyên tắc "học đi đôi với hành".
+ Có nghĩa là bạn cần chạy các câu lệnh để học chúng. Nếu chỉ đọc, bạn
+ sẽ quên các câu lệnh!
+
+ Bây giờ, cần chắc chắn là phím Shift KHÔNG bị nhấn và hãy nhấn phím
+ j đủ số lần cần thiết (di chuyển con trỏ) để Bài 1.1 hiện ra đầy đủ
+ trên màn hình.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 1.1: DI CHUYỂN CON TRỎ
+
+
+ ** Để di chuyển con trỏ, nhấn các phím h,j,k,l như đã chỉ ra. **
+ ^
+ k Gợi ý: phím h ở phía trái và di chuyển sang trái.
+ < h l > phím l ở bên phải và di chuyển sang phải.
+ j phím j trong như một mũi tên chỉ xuống
+ v
+ 1. Di chuyển con trỏ quanh màn hình cho đến khi bạn quen dùng.
+
+ 2. Nhấn và giữ phím (j) cho đến khi nó lặp lại.
+---> Bây giờ bạn biết cách chuyển tới bài học thứ hai.
+
+ 3. Sử dụng phím di chuyển xuống bài 1.2.
+
+Chú ý: Nếu bạn không chắc chắn về những gì đã gõ, hãy nhấn <ESC> để chuyển vào
+ chế độ Câu lệnh, rồi gõ lại những câu lệnh mình muốn.
+
+Chú ý: Các phím mũi tên cũng làm việc. Nhưng một khi sử dụng thành thạo hjkl,
+ bạn sẽ di chuyển con trỏ nhanh hơn so với các phím mũi tên.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 1.2: VÀO VÀ THOÁT VIM
+
+
+ !! CHÚ Ý: Trước khi thực hiện bất kỳ lệnh nào, xin hãy đọc cả bài học này!!
+
+ 1. Nhấn phím <ESC> (để chắc chắn là bạn đang ở chế độ Câu lệnh).
+
+ 2. Gõ: :q! <ENTER>.
+
+---> Lệnh này sẽ thoát trình soạn thảo mà KHÔNG ghi nhớ bất kỳ thay đổi nào mà bạn đã làm.
+ Nếu bạn muốn ghi nhớ những thay đổi đó và thoát thì hãy gõ:
+ :wq <ENTER>
+
+ 3. Khi thấy dấu nhắc shell, hãy gõ câu lệnh đã đưa bạn tới hướng dẫn này. Có
+ thể là lệnh: vimtutor vi <ENTER>
+ Thông thường bạn dùng: vim tutor.vi<ENTER>
+
+---> 'vim' là trình soạn thảo vim, 'tutor.vi' là tập tin bạn muốn soạn thảo.
+
+ 4. Nếu bạn đã nhớ và nắm chắc những câu lệnh trên, hãy thực hiện các bước từ
+ 1 tới 3 để thoát và quay vào trình soạn thảo. Sau đó di chuyển con trỏ
+ tới Bài 1.3.
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 1.3: SOẠN THẢO VĂN BẢN - XÓA
+
+
+** Trong chế độ Câu lệnh nhấn x để xóa ký tự nằm dưới con trỏ. **
+
+ 1. Di chuyển con trỏ tới dòng có dấu --->.
+
+ 2. Để sửa lỗi, di chuyển con trỏ để nó nằm trên ký tự sẽ bị
+ xóa.
+
+ 3. Nhấn phím x để xóa ký tự không mong muốn.
+
+ 4. Lặp lại các bước từ 2 tới 4 để sửa lại câu.
+
+---> Emm xiinh em đứnng chỗ nào cũnkg xinh.
+
+ 5. Câu trên đã sửa xong, hãy chuyển tới Bài 1.4.
+
+Chú ý: Khi học theo cuốn hướng dẫn này đừng cố nhớ, mà học từ thực hành.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 1.4: SOẠN THẢO VĂN BẢN - CHÈN
+
+
+ ** Trong chế độ Câu lệnh nhấn i để chèn văn bản. **
+
+ 1. Di chuyển con trỏ tới dòng có dấu ---> đầu tiên.
+
+ 2. Để dòng thứ nhất giống hệt với dòng thứ hai, di chuyển con trỏ lên ký tự
+ đầu tiên NGAY SAU chỗ muốn chèn văn bản.
+
+ 3. Nhấn i và gõ văn bản cần thêm.
+
+ 4. Sau mỗi lần chèn từ còn thiếu nhấn <ESC> để trở lại chế dộ Câu lệnh.
+ Lặp lại các bước từ 2 tới 4 để sửa câu này.
+
+---> Mot lam chang nen , ba cay chum lai hon cao.
+---> Mot cay lam chang nen non, ba cay chum lai nen hon nui cao.
+
+ 5. Sau khi thấy quen với việc chèn văn bản hãy chuyển tới phần tổng kết
+ ở dưới.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ TỔNG KẾT BÀI 1
+
+
+ 1. Con trỏ được di chuyển bởi các phím mũi tên hoặc các phím hjkl.
+ h (trái) j (xuống) k (lên) l (phải)
+
+ 2. Để vào Vim (từ dấu nhắc %) gõ: vim TÊNTẬPTIN <ENTER>
+
+ 3. Muốn thoát Vim gõ: <ESC> :q! <ENTER> để vứt bỏ mọi thay đổi.
+ HOẶC gõ: <ESC> :wq <ENTER> để ghi nhớ thay đổi.
+
+ 4. Để xóa bỏ ký tự nằm dưới con trỏ trong chế độ Câu lệnh gõ: x
+
+ 5. Để chèn văn bản tại vị trí con trỏ trong chế độ Câu lệnh gõ:
+ i văn bản sẽ nhập <ESC>
+
+CHÚ Ý: Nhấn <ESC> sẽ đưa bạn vào chế độ Câu lệnh hoặc sẽ hủy bỏ một câu lệnh
+ hay đoạn câu lệnh không mong muốn.
+
+Bây giờ chúng ta tiếp tục với Bài 2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 2.1: CÁC LỆNH XÓA
+
+
+ ** Gõ dw để xóa tới cuối một từ. **
+
+ 1. Nhấn <ESC> để chắc chắn là bạn đang trong chế độ Câu lệnh.
+
+ 2. Di chuyển con trỏ tới dòng có dấu --->.
+
+ 3. Di chuyển con trỏ tới ký tự đầu của từ cần xóa.
+
+ 4. Gõ dw để làm từ đó biến mất.
+
+ CHÚ Ý: các ký tự dw sẽ xuất hiện trên dòng cuối cùng của màn hình khi bạn gõ
+ chúng. Nếu bạn gõ nhầm, hãy nhấn <ESC> và làm lại từ đầu.
+
+---> Khi trái tỉm tìm tim ai như mùa đông giá lạnh lanh
+ Anh đâu thành cánh én nhỏ trùng khơi.
+
+ 5. Lặp lại các bước cho đến khi sửa xong câu thơ rồi chuyển tới Bài 2.2.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 2.2: CÁC CÂU LỆNH XÓA KHÁC
+
+
+ ** gõ d$ để xóa tới cuối một dòng. **
+
+ 1. Nhấn <ESC> để chắc chắn là bạn đang trong chế độ Câu lệnh.
+
+ 2. Di chuyển con trỏ tới dòng có dấu --->.
+
+ 3. Di chuyển con trỏ tới cuối câu đúng (SAU dấu . đầu tiên).
+
+ 4. Gõ d$ để xóa tới cuối dòng.
+
+---> Đã qua đi những tháng năm khờ dại. thừa thãi.
+
+
+ 5. Chuyển tới Bài 2.3 để hiểu cái gì đang xảy ra.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 2.3: CÂU LỆNH VÀ ĐỐI TƯỢNG
+
+
+ Câu lệnh xóa d có dạng như sau:
+
+ [số] d đối_tượng HOẶC d [số] đối_tượng
+ Trong đó:
+ số - là số lần thực hiện câu lệnh (không bắt buộc, mặc định=1).
+ d - là câu lệnh xóa.
+ đối_tượng - câu lệnh sẽ thực hiện trên chúng (liệt kê phía dưới).
+
+ Danh sách ngắn của đối tượng:
+ w - từ con trỏ tới cuối một từ, bao gồm cả khoảng trắng.
+ e - từ con trỏ tới cuối một từ, KHÔNG bao gồm khoảng trắng.
+ $ - từ con trỏ tới cuối một dòng.
+
+CHÚ Ý: Dành cho những người ham tìm hiểu, chỉ nhấn đối tượng trong chế độ Câu
+ lệnh mà không có câu lệnh sẽ di chuyển con trỏ như trong danh sách trên.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 2.4: TRƯỜNG HỢP NGOẠI LỆ CỦA QUY LUẬT 'CÂU LỆNH-ĐỐI TƯỢNG'
+
+
+ ** Gõ dd để xóa cả một dòng. **
+
+ Người dùng thường xuyên xóa cả một dòng, vì thế các nhà phát triển Vi đã
+ quyết định dùng hai chữ d để đơn giản hóa thao tác này.
+
+ 1. Di chuyển con trỏ tới dòng thứ hai trong cụm phía dưới.
+ 2. Gõ dd để xóa dòng này.
+ 3. Bây giờ di chuyển tới dòng thứ tư.
+ 4. Gõ 2dd (hãy nhớ lại bộ ba số-câu lệnh-đối tượng) để xóa hai dòng.
+
+ 1) Trong tim em khắc sâu bao kỉ niệm
+ 2) Tình yêu chân thành em dành cả cho anh
+ 3) Dẫu cuộc đời như bể dâu thay đổi
+ 4) Anh mãi là ngọn lửa ấm trong đêm
+ 5) Đã qua đi những tháng năm khờ dại
+ 7) Hãy để tự em lau nước mắt của mình
+ 8) Lặng lẽ sống những đêm dài bất tận
+ 9) Bao khổ đau chờ tia nắng bình minh
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 2.5: CÂU LỆNH "HỦY THAO TÁC"
+
+
+ ** Nhấn u để hủy bỏ những câu lệnh cuối cùng, U để sửa cả một dòng. **
+
+ 1. Di chuyển con trỏ tới dòng có dấu ---> và đặt con trỏ trên từ có lỗi
+ đầu tiên
+ 2. Gõ x để xóa chữ cái gây ra lỗi đầu tiên.
+ 3. Bây giờ gõ u để hủy bỏ câu lệnh vừa thự hiện (xóa chữ cái).
+ 4. Dùng câu lệnh x để sửa lỗi cả dòng này.
+ 5. Bây giờ gõ chữ U hoa để phục hồi trạng thái ban đầu của dòng.
+ 6. Bây giờ gõ u vài lần để hủy bỏ câu lệnh U và các câu lệnh trước.
+ 7. Bây giờ gõ CTRL-R (giữ phím CTRL và gõ R) và lầu để thực hiện
+ lại các câu lệnh (hủy bỏ các câu lệnh hủy bỏ).
+
+---> Câyy ccó cộii, nuước csó nguuồn.
+
+ 8. Đây là những câu lệnh rất hữu ích. Bây giờ chuyển tới Tổng kết Bài 2.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ TỔNG KẾT BÀI 2
+
+
+ 1. Để xóa từ con trỏ tới cuối một từ gõ: dw
+
+ 2. Để xóa từ con trỏ tới cuối một dòng gõ: d$
+
+ 3. Để xóa cả một dòng gõ: dd
+
+ 4. Một câu lệnh trong chế độ Câu lệnh có dạng:
+
+ [số] câu_lệnh đối_tượng HOẶC câu_lệnh [số] đối_tượng
+ trong đó:
+ số - là số lần thực hiện câu lệnh (không bắt buộc, mặc định=1).
+ câu_lệnh - là những gì thực hiện, ví dụ d dùng để xóa.
+ đối_tượng - câu lệnh sẽ thực hiện trên chúng, ví dụ w (từ),
+ $ (tới cuối một dòng), v.v...
+
+ 5. Để hủy bỏ thao tác trước, gõ: u (chữ u thường)
+ Để hủy bỏ tất cả các thao tác trên một dòng, gõ: U (chữ U hoa)
+ Để hủy bỏ các câu lệnh hủy bỏ, gõ: CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 3.1: CÂU LỆNH DÁN
+
+
+ ** Gõ p để dán những gì vừa xóa tới sau con trỏ. **
+
+ 1. Di chuyển con trỏ tới dòng đầu tiên trong cụm ở dưới.
+
+ 2. Gõ dd để xóa và ghi lại một dòng trong bộ nhớ đệm của Vim.
+
+ 3. Di chuyển con trỏ tới dòng Ở TRÊN chỗ cần dán.
+
+ 4. Trong chế độ Câu lệnh, gõ p để thay thế dòng.
+
+ 5. Lặp lại các bước từ 2 tới 4 để đặt các dòng theo đúng thứ tự của chúng.
+
+ d) Niềm vui như gió xưa bay nhè nhẹ
+ b) Em vẫn mong anh sẽ đến với em
+ c) Đừng để em mất đi niềm hy vọng đó
+ a) Ai sẽ giúp em vượt qua sóng gió
+ e) Dễ ra đi khó giữ lại bên mình
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 3.2: CÂU LỆNH THAY THẾ
+
+
+ ** Gõ r và một ký tự để thay thế ký tự nằm dưới con trỏ. **
+
+ 1. Di chuyển con trỏ tới dòng có dấu --->.
+
+ 2. Di chuyển con trỏ tới ký tự gõ sai đầu tiên.
+
+ 3. Gõ r và ký tự đúng.
+
+ 4. Lặp lại các bước từ 2 đến 4 để sửa cả dòng.
+
+---> "Trên đời nài làm gì có đườmg, người to đi mãi rồi thànk đường là tHôi"
+---> "Trên đời này làm gì có đường, người ta đi mãi rồi thành đường mà thôi"
+
+ 5. Bây giờ chuyển sang Bài 3.3.
+
+CHÚ Ý: Hãy nhớ rằng bạn cần thực hành, không nên "học vẹt".
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 3.3: CÂU LỆNH THAY ĐỔI
+
+
+ ** Để thay đổi một phần hay cả một từ, gõ cw . **
+
+ 1. Di chuyển con trỏ tới dòng có dấu --->.
+
+ 2. Đặt con trỏ trên chữ trong.
+
+ 3. Gõ cw và sửa lại từ (trong trường hợp này, gõ 'ine'.)
+
+ 4. Gõ <ESC> và chuyển tới lỗi tiếp theo (chữ cái đầu tiên trong số cần thay.)
+
+ 5. Lặp lại các bước 3 và 4 cho tới khi thu được dòng như dòng thứ hai.
+
+---> Trên dùgn này có một dầy từ cần tyays đổi, sử dunk câu lệnh thay đổi.
+---> Trên dong này có một vai từ cần thay đổi, sử dung câu lệnh thay đổi.
+
+Chú ý rằng cw không chỉ thay đổi từ, nhưng còn đưa bạn vào chế độ chèn.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 3.4: TIẾP TỤC THAY ĐỔI VỚI c
+
+
+ ** Câu lệnh thay đổi được sử dụng với cùng đối tượng như câu lệnh xóa. **
+
+ 1. Câu lệnh thay đổi làm việc tương tự như câu lệnh xóa. Định dạng như sau:
+
+ [số] c đối_tượng HOẶC c [số] đối_tượng
+
+ 2. Đối tượng cũng giống như ở trên, ví dụ w (từ), $ (cuối dòng), v.v...
+
+ 3. Di chuyển con trỏ tới dòng có dấu --->.
+
+ 4. Di chuyển con trỏ tới dòng có lỗi đầu tiên.
+
+ 5. Gõ c$ để sửa cho giống với dòng thứ hai và gõ <ESC>.
+
+---> Doan cuoi dong nay can sua de cho giong voi dong thu hai.
+---> Doan cuoi dong nay can su dung cau lenh c$ de sua.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ TỔNG KẾT BÀI 3
+
+
+ 1. Để dán đoạn văn bản vừa xóa, gõ p. Câu lệnh này sẽ đặt đoạn văn bản này
+ PHÍA SAU con trỏ (nếu một dòng vừa bị xóa, dòng này sẽ được đặt vào dòng
+ nằm dưới con trỏ).
+
+ 2. Để thay thế ký tự dưới con trỏ, gõ r và sau đó gõ
+ ký tự muốn thay vào.
+
+ 3. Câu lệnh thay đổi cho phép bạn thay đổi đối tượng chỉ ra từ con
+ trỏ tới cuối đối tượng. vd. Gõ cw để thay đổi từ
+ con trỏ tới cuối một từ, c$ để thay đổi tới cuối một dòng.
+
+ 4. Định dạng để thay đổi:
+
+ [số] c đối_tượng HOẶC c [số] đối_tượng
+
+Bây giờ chúng ta tiếp tục bài học mới.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 4.1: THÔNG TIN VỀ TẬP TIN VÀ VỊ TRÍ TRONG TẬP TIN
+
+
+ ** Gõ CTRL-g để hiển thị vị trí của bạn trong tập tin và thông tin về tập tin.
+ Gõ SHIFT-G để chuyển tới một dòng trong tập tin. **
+
+ Chú ý: Đọc toàn bộ bài học này trước khi thực hiện bất kỳ bước nào!!
+
+ 1. Giữ phím Ctrl và nhấn g . Một dòng thông tin xuất hiện tại cuối trang
+ với tên tập tin và dòng mà bạn đang nằm trên. Hãy nhớ số dòng này
+ Cho bước số 3.
+
+ 2. Nhấn shift-G để chuyển tới cuối tập tin.
+
+ 3. Gõ số dòng mà bạn đã nằm trên và sau đó shift-G. Thao tác này sẽ đưa bạn
+ trở lại dòng mà con trỏ đã ở trước khi nhấn tổ hợp Ctrl-g.
+ (Khi bạn gõ số, chúng sẽ KHÔNG hiển thị trên màn hình.)
+
+ 4. Nếu bạn cảm thấy đã hiểu rõ, hãy thực hiện các bước từ 1 tới 3.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 4.2: CÂU LỆNH TÌM KIẾM
+
+
+ ** Gõ / và theo sau là cụm từ muốn tìm kiếm. **
+
+ 1. Trong chế độ Câu lệnh gõ ký tự / .Chú ý rằng ký tự này và con trỏ sẽ
+ xuất hiện tại cuối màn hình giống như câu lệnh : .
+
+ 2. Bây giờ gõ 'loiiiii' <ENTER>. Đây là từ bạn muốn tìm.
+
+ 3. Để tìm kiếm cụm từ đó lần nữa, đơn giản gõ n .
+ Để tìm kiếm cụm từ theo hướng ngược lại, gõ Shift-N .
+
+ 4. Nếu bạn muối tìm kiếm cụm từ theo hướng ngược lại đầu tập tin, sử dụng
+ câu lệnh ? thay cho /.
+
+---> "loiiiii" là những gì không đúng lắm; loiiiii thường xuyên xảy ra.
+
+Chú ý: Khi tìm kiếm đến cuối tập tin, việc tìm kiếm sẽ tiếp tục từ đầu
+ tập tin này.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 4.3: TÌM KIẾM CÁC DẤU NGOẶC SÁNH ĐÔI
+
+
+ ** Gõ % để tìm kiếm ),], hay } . **
+
+ 1. Đặt con trỏ trên bất kỳ một (, [, hay { nào trong dòng có dấu --->.
+
+ 2. Bây giờ gõ ký tự % .
+
+ 3. Con trỏ sẽ di chuyển đến dấu ngoặc tạo cặp (dấu đóng ngoặc).
+
+ 4. Gõ % để chuyển con trỏ trở lại dấu ngoặc đầu tiên (dấu mở ngoặc).
+
+---> Đây là ( một dòng thử nghiệm với các dấu ngoặc (, [ ] và { } . ))
+
+Chú ý: Rất có ích khi sửa lỗi chương trình, khi có các lỗi thừa thiếu dấu ngoặc!
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 4.4: MỘT CÁCH SỬA LỖI
+
+
+ ** Gõ :s/cũ/mới/g để thay thế 'mới' vào 'cũ'. **
+
+ 1. Di chuyển con trỏ tới dòng có dấu --->.
+
+ 2. Gõ :s/duou/ruou <ENTER> . Chú ý rằng câu lệnh này chỉ thay đổi từ tìm
+ thấy đầu tiên trên dòng (từ 'duou' đầu dòng).
+
+ 3. Bây giờ gõ :s/duou/ruou/g để thực hiện thay thế trên toàn bộ dòng.
+ Lệnh này sẽ thay thế tất cả những từ ('duou') tìm thấy trên dòng.
+
+---> duou ngon phai co ban hie. Khong duou cung khong hoa.
+
+ 4. Để thay thế thực hiện trong đoạn văn bản giữa hai dòng,
+ gõ :#,#s/cũ/mới/g trong đó #,# là số thứ tự của hai dòng.
+ Gõ :%s/cũ/mới/g để thực hiện thay thế trong toàn bộ tập tin.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ TỔNG KẾT BÀI 4
+
+
+ 1. Ctrl-g vị trí của con trỏ trong tập tin và thông tin về tập tin.
+ Shift-G di chuyển con trỏ tới cuối tập tin. Số dòng và theo sau
+ là Shift-G di chuyển con trỏ tới dòng đó.
+
+ 2. Gõ / và cụm từ theo sau để tìm kiếm cụm từ VỀ PHÍA TRƯỚC.
+ Gõ ? và cụm từ theo sau để tìm kiếm cụm từ NGƯỢC TRỞ LẠI.
+ Sau một lần tìm kiếm gõ n để tìm kiếm cụm từ lại một lần nữa theo hướng
+ đã tìm hoặc Shift-N để tìm kiếm theo hướng ngược lại.
+
+ 3. Gõ % khi con trỏ nằm trên một (,),[,],{, hay } sẽ chỉ ra vị trí của
+ dấu ngoặc còn lại trong cặp.
+
+ 4. Để thay thế 'mới' cho 'cũ' đầu tiên trên dòng, gõ :s/cũ/mới
+ Để thay thế 'mới' cho tất cả 'cũ' trên dòng, gõ :s/cũ/mới/g
+ Để thay thế giữa hai dòng, gõ :#,#s/cũ/mới/g
+ Để thay thế trong toàn bộ tập tin, gõ :%s/cũ/mới/g
+ Để chương trình hỏi lại trước khi thay thế, thêm 'c' :%s/cũ/mới/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Lesson 5.1: CÁCH THỰC HIỆN MỘT CÂU LỆNH NGOẠI TRÚ
+
+
+ ** Gõ :! theo sau là một câu lệnh ngoại trú để thực hiện câu lệnh đó. **
+
+ 1. Gõ câu lệnh quen thuộc : để đặt con trỏ tại cuối màn hình.
+ Thao tác này cho phép bạn nhập một câu lệnh.
+
+ 2. Bây giờ gõ ký tự ! (chấm than). Ký tự này cho phép bạn
+ thực hiện bất kỳ một câu lệnh shell nào.
+
+ 3. Ví dụ gõ ls theo sau dấu ! và gõ <ENTER>. Lệnh này
+ sẽ hiển thị nội dung của thư mục hiện thời, hoặc sử dụng
+ lệnh :!dir nếu ls không làm việc.
+
+Chú ý: Có thể thực hiện bất kỳ câu lệnh ngoại trú nào theo cách này.
+
+Chú ý: Tất cả các câu lệnh : cần kết thúc bởi phím <ENTER>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 5.2: GHI LẠI CÁC TẬP TIN
+
+
+ ** Để ghi lại các thay đổi, gõ :w TÊNTỆPTIN. **
+
+ 1. Gõ :!dir hoặc :!ls để lấy bảng liệt kê thư mục hiện thời.
+ Như bạn đã biết, bạn cần gõ <ENTER> để thực hiện.
+
+ 2. Chọn một tên tập tin chưa có, ví dụ TEST.
+
+ 3. Bây giờ gõ: :w TEST (trong đó TEST là tên tập tin bạn đã chọn.)
+
+ 4. Thao tác này ghi toàn bộ tập tin (Hướng dẫn dùng Vim) dưới tên TEST.
+ Để kiểm tra lại, gõ :!dir một lần nữa để liệt kê thư mục.
+
+Chú ý: Nếu bạn thoát khỏi Vim và quay trở lại với tên tập tin TEST, thì tập
+ tin sẽ là bản sao của hướng dẫn tại thời điểm bạn ghi lại.
+
+ 5. Bây giờ xóa bỏ tập tin (MS-DOS): :!del TEST
+ hay (Unix): :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 5.3: CÂU LỆNH GHI CHỌN LỌC
+
+
+ ** Để ghi một phần của tập tin, gõ :#,# w TÊNTẬPTIN **
+
+ 1. Gõ lại một lần nữa :!dir hoặc :!ls để liệt kê nội dung thư mục
+ rồi chọn một tên tập tin thích hợp, ví dụ TEST.
+
+ 2. Di chuyển con trỏ tới đầu trang này, rồi gõ Ctrl-g để tìm ra số thứ
+ tự của dòng đó. HÃY NHỚ SỐ THỨ TỰ NÀY!
+
+ 3. Bây giờ di chuyển con trỏ tới dòng cuối trang và gõ lại Ctrl-g lần nữa.
+ HÃY NHỚ CẢ SỐ THỨ TỰ NÀY!
+
+ 4. Để CHỈ ghi lại một phần vào một tập tin, gõ :#,# w TEST trong đó #,#
+ là hai số thứ tự bạn đã nhớ (đầu,cuối) và TEST là tên tập tin.
+
+ 5. Nhắc lại, xem tập tin của bạn có ở đó không với :!dir nhưng ĐỪNG xóa.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 5.4: ĐỌC VÀ KẾT HỢP CÁC TẬP TIN
+
+
+ ** Để chèn nội dung của một tập tin, gõ :r TÊNTẬPTIN **
+
+ 1. Gõ :!dir để chắc chắn là có tệp tin TEST.
+
+ 2. Đặt con trỏ tại đầu trang này.
+
+CHÚ Ý: Sau khi thực hiện Bước 3 bạn sẽ thấy Bài 5.3. Sau đó cần di chuyển
+ XUỐNG bài học này lần nữa.
+
+ 3. Bây giờ dùng câu lệnh :r TEST để đọc tập tin TEST, trong đó TEST là
+ tên của tập tin.
+
+CHÚ Ý: Tập tin được đọc sẽ đặt bắt đầu từ vị trí của con trỏ.
+
+ 4. Để kiểm tra lại, di chuyển con trỏ ngược trở lại và thấy rằng bây giờ
+ có hai Bài 5.3, bản gốc và bản vừa chèn.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ TỔNG KẾT BÀI 5
+
+
+ 1. :!câulệnh thực hiện một câu lệnh ngoại trú
+
+ Một vài ví dụ hữu ích:
+ (MS-DOS) (Unix)
+ :!dir :!ls - liệt kê nội dung một thư mục.
+ :!del TÊNTẬPTIN :!rm TÊNTẬPTIN - xóa bỏ tập tin TÊNTẬPTIN.
+
+ 2. :w TÊNTẬPTIN ghi tập tin hiện thời của Vim lên đĩa với tên TÊNTẬPTIN.
+
+ 3. :#,#w TÊNTẬPTIN ghi các dòng từ # tới # vào tập tin TÊNTẬPTIN.
+
+ 4. :r TÊNTẬPTIN đọc tập tin trên đĩa TÊNTẬPTIN và chèn nội dung của nó vào
+ tập tin hiện thời sau vị trí của con trỏ.
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 6.1: CÂU LỆNH TẠO DÒNG
+
+
+ ** Gõ o để mở một dòng phía dưới con trỏ và chuyển vào chế độ Soạn thảo. **
+
+ 1. Di chuyển con trỏ tới dòng có dấu --->.
+
+ 2. Gõ o (chữ thường) để mở một dòng BÊN DƯỚI con trỏ và chuyển vào chế độ
+ Soạn thảo.
+
+ 3. Bây giờ sao chép dòng có dấu ---> và nhấn <ESC> để thoát khỏi chế độ Soạn
+ thảo.
+
+---> Sau khi gõ o con trỏ sẽ đặt trên dòng vừa mở trong chế độ Soạn thảo.
+
+ 4. Để mở một dòng Ở TRÊN con trỏ, đơn giản gõ một chữ O hoa, thay cho
+ chữ o thường. Hãy thử thực hiện trên dòng dưới đây.
+Di chuyển con trỏ tới dòng này, rồi gõ Shift-O sẽ mở một dòng trên nó.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 6.2: CÂU LỆNH THÊM VÀO
+
+
+ ** Gõ a để chèn văn bản vào SAU con trỏ. **
+
+ 1. Di chuyển con trỏ tới cuối dòng đầu tiên có ký hiệu --->
+ bằng cách gõ $ trong chế độ câu lệnh.
+
+ 2. Gõ a (chữ thường) để thêm văn bản vào SAU ký tự dưới con trỏ.
+ (Chữ A hoa thêm văn bản vào cuối một dòng.)
+
+Chú ý: Lệnh này thay cho việc gõ i , ký tự cuối cùng, văn bản muốn chèn,
+ <ESC>, mũi tên sang phải, và cuối cùng, x , chỉ để thêm vào cuối dòng!
+
+ 3. Bây giờ thêm cho đủ dòng thứ nhất. Chú ý rằng việc thêm giống hệt với
+ việc chèn, trừ vị trí chèn văn bản.
+
+---> Dong nay cho phep ban thuc hanh
+---> Dong nay cho phep ban thuc hanh viec them van ban vao cuoi dong.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 6.3: MỘT CÁCH THAY THẾ KHÁC
+
+
+ ** Gõ chữ cái R hoa để thay thế nhiều ký tự. **
+
+ 1. Di chuyển con trỏ tới cuối dòng đầu tiên có ký hiệu --->.
+
+ 2. Đặt con trỏ tại chữ cái đầu của từ đầu tiên khác với dòng có dấu
+ ---> tiếp theo (từ 'tren').
+
+ 3. Bây giờ gõ R và thay thế phần còn lại của dòng thứ nhất bằng cách gõ
+ đè lên văn bản cũ để cho hai dòng giống nhau.
+
+---> De cho dong thu nhat giong voi dong thu hai tren trang nay.
+---> De cho dong thu nhat giong voi dong thu hai, go R va van ban moi.
+
+ 4. Chú ý rằng khi bạn nhấn <ESC> để thoát, đoạn văn bản không sửa đổi sẽ
+ được giữ nguyên.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 6.4: THIẾT LẬP CÁC THAM SỐ
+
+ ** Thiết lập một tùy chọn để việc tìm kiếm hay thay thế lờ đi kiểu chữ **
+
+ 1. Tìm kiếm từ 'lodi' bằng cách gõ:
+ /lodi
+ Lặp lại vài lần bằng phím n.
+
+ 2. Đặt tham số 'ic' (Lodi - ignore case) bằng cách gõ:
+ :set ic
+
+ 3. Bây giờ thử lại tìm kiếm 'lodi' bằng cách gõ: n
+ Lặp lại vài lần bằng phím n.
+
+ 4. Đặt các tham số 'hlsearch' và 'incsearch':
+ :set hls is
+
+ 5. Bây giờ nhập lại câu lệnh tìm kiếm một lần nữa và xem cái gì xảy ra:
+ /lodi
+
+ 6. Để xóa bỏ việc hiện sáng từ tìm thấy, gõ:
+ :nohlsearch
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ TỔNG KẾT BÀI 6
+
+
+ 1. Gõ o mở một dòng phía DƯỚI con trỏ và đặt con trỏ trên dòng vừa mở
+ trong chế độ Soạn thảo.
+ Gõ một chữ O hoa để mở dòng phía TRÊN dòng của con trỏ.
+
+ 2. Gõ a để chèn văn bản vào SAU ký tự nằm dưới con trỏ.
+ Gõ một chữ A hoa tự động thêm văn bản vào cuối một dòng.
+
+ 3. Gõ một chữ R hoa chuyển vào chế độ Thay thế cho đến khi nhấn <ESC>.
+
+ 4. Gõ ":set xxx" sẽ đặt tham số "xxx"
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 7: CÂU LỆNH TRỢ GIÚP
+
+
+ ** Sử dụng hệ thống trợ giúp có sẵn **
+
+ Vim có một hệ thống trợ giúp đầy đủ. Để bắt đầu, thử một trong ba
+ lệnh sau:
+ - nhấn phím <HELP> (nếu bàn phím có)
+ - nhấn phím <F1> (nếu bàn phím có)
+ - gõ :help <ENTER>
+
+ Gõ :q <ENTER> để đóng cửa sổ trợ giúp.
+
+ Bạn có thể tìm thấy trợ giúp theo một đề tài, bằng cách đưa tham số tới
+ câu lệnh ":help". Hãy thử (đừng quên gõ <ENTER>):
+
+ :help w
+ :help c_<T
+ :help insert-index
+ :help user-manual
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Bài 8: TẠO MỘT SCRIPT KHỞI ĐỘNG
+
+ ** Bật các tính năng của Vim **
+
+ Vim có nhiều tính năng hơn Vi, nhưng hầu hết chúng bị tắt theo mặc định.
+ Để sử dụng các tính năng này bạn cần phải tạo một tập tin "vimrc".
+
+ 1. Soạn thảo tệp tin "vimrc", phụ thuộc vào hệ thống của bạn:
+ :edit ~/.vimrc đối với Unix
+ :edit ~/_vimrc đối với MS-Windows
+
+ 2. Bây giờ đọc tập tin "vimrc" ví dụ:
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. Ghi lại tập tin:
+
+ :write
+
+ Trong lần khởi động tiếp theo, Vim sẽ sử dụng việc hiện sáng cú pháp.
+ Bạn có thể thêm các thiết lập ưa thích vào tập tin "vimrc" này.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Bài học hướng dẫn sử dụng Vim (Vim Tutor) kết thúc tại đây. Bài học đưa ra
+ cái nhìn tổng quát về trình soạn thảo Vim, chỉ đủ để bạn có thể sử dụng
+ trình soạn thảo một cách dễ dàng. Bài học còn rất xa để có thể nói là đầy
+ đủ vì Vim có rất rất nhiều câu lệnh. Tiếp theo xin hãy đọc hướng dẫn người
+ dùng: ":help user-manual".
+
+ Cuốn sách sau được khuyên dùng cho việc nghiên cứu sâu hơn:
+ Vim - Vi Improved - Tác giả: Steve Oualline
+ Nhà xuất bản: New Riders
+ Cuốn sách đầu tiên dành hoàn toàn cho Vim. Đặc biệt có ích cho người mới.
+ Có rất nhiều ví dụ và tranh ảnh.
+ Hãy xem: https://iccf-holland.org/click5.html
+
+ Cuốn sách tiếp theo này xuất bản sớm hơn và nói nhiều về Vi hơn là Vim,
+ nhưng cũng rất nên đọc:
+ Learning the Vi Editor - Tác giả: Linda Lamb
+ Nhà xuất bản: O'Reilly & Associates Inc.
+ Đây là một cuốn sách hay và cho bạn biết tất cả cách thực hiện những gì muốn
+ làm với Vi. Lần xuất bản thứ sáu đã thêm thông tin về Vim.
+
+ Bài học hướng dẫn này viết bởi Michael C. Pierce và Robert K. Ware,
+ Colorado School of Mines sử dụng ý tưởng của Charles Smith,
+ Colorado State University. E-mail: bware@mines.colorado.edu.
+
+ Sửa đổi cho Vim bởi Bram Moolenaar.
+
+ Dịch bởi: Phan Vĩnh Thịnh <teppi@vnlinux.org>, 2005
+ Translator: Phan Vinh Thịnh <teppi@vnlinux.org>, 2005
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.vim b/runtime/tutor/tutor.vim
new file mode 100644
index 0000000..dc69724
--- /dev/null
+++ b/runtime/tutor/tutor.vim
@@ -0,0 +1,202 @@
+" Vim tutor support file
+" Author: Eduardo F. Amatria <eferna1@platea.pntic.mec.es>
+" Maintainer: Bram Moolenaar
+" Last Change: 2019 Nov 11
+
+" This Vim script is used for detecting if a translation of the
+" tutor file exist, i.e., a tutor.xx file, where xx is the language.
+" If the translation does not exist, or no extension is given,
+" it defaults to the English version.
+
+" It is invoked by the vimtutor shell script.
+
+" 1. Build the extension of the file, if any:
+let s:ext = ""
+if strlen($xx) > 1
+ let s:ext = "." . $xx
+else
+ let s:lang = ""
+ " Check that a potential value has at least two letters.
+ " Ignore "1043" and "C".
+ if exists("v:lang") && v:lang =~ '\a\a'
+ let s:lang = v:lang
+ elseif $LC_ALL =~ '\a\a'
+ let s:lang = $LC_ALL
+ elseif $LC_MESSAGES =~ '\a\a' || $LC_MESSAGES ==# "C"
+ " LC_MESSAGES=C can be used to explicitly ask for English messages while
+ " keeping LANG non-English; don't set s:lang then.
+ if $LC_MESSAGES =~ '\a\a'
+ let s:lang = $LC_MESSAGES
+ endif
+ elseif $LANG =~ '\a\a'
+ let s:lang = $LANG
+ endif
+ if s:lang != ""
+ " Remove "@euro" (ignoring case), it may be at the end
+ let s:lang = substitute(s:lang, '\c@euro', '', '')
+ " On MS-Windows it may be German_Germany.1252 or Polish_Poland.1250. How
+ " about other languages?
+ if s:lang =~ "German"
+ let s:ext = ".de"
+ elseif s:lang =~ "Polish"
+ let s:ext = ".pl"
+ elseif s:lang =~ "Slovak"
+ let s:ext = ".sk"
+ elseif s:lang =~ "Serbian"
+ let s:ext = ".sr"
+ elseif s:lang =~ "Czech"
+ let s:ext = ".cs"
+ elseif s:lang =~ "Dutch"
+ let s:ext = ".nl"
+ elseif s:lang =~ "Bulgarian"
+ let s:ext = ".bg"
+ else
+ let s:ext = "." . strpart(s:lang, 0, 2)
+ endif
+ endif
+endif
+
+" Somehow ".ge" (Germany) is sometimes used for ".de" (Deutsch).
+if s:ext =~? '\.ge'
+ let s:ext = ".de"
+endif
+
+if s:ext =~? '\.en'
+ let s:ext = ""
+endif
+
+" The Japanese tutor is available in three encodings, guess which one to use
+" The "sjis" one is actually "cp932", it doesn't matter for this text.
+if s:ext =~? '\.ja'
+ if &enc =~ "euc"
+ let s:ext = ".ja.euc"
+ elseif &enc != "utf-8"
+ let s:ext = ".ja.sjis"
+ endif
+endif
+
+" The Korean tutor is available in two encodings, guess which one to use
+if s:ext =~? '\.ko'
+ if &enc != "utf-8"
+ let s:ext = ".ko.euc"
+ endif
+endif
+
+" The Chinese tutor is available in three encodings, guess which one to use
+" This segment is from the above lines and modified by
+" Mendel L Chan <beos@turbolinux.com.cn> for Chinese vim tutorial
+" When 'encoding' is utf-8, choose between China (simplified) and Taiwan
+" (traditional) based on the language, suggested by Alick Zhao.
+if s:ext =~? '\.zh'
+ if &enc =~ 'big5\|cp950'
+ let s:ext = ".zh.big5"
+ elseif &enc != 'utf-8'
+ let s:ext = ".zh.euc"
+ elseif s:ext =~? 'zh_tw' || (exists("s:lang") && s:lang =~? 'zh_tw')
+ let s:ext = ".zh_tw"
+ else
+ let s:ext = ".zh_cn"
+ endif
+endif
+
+" The Polish tutor is available in two encodings, guess which one to use.
+if s:ext =~? '\.pl'
+ if &enc =~ 1250
+ let s:ext = ".pl.cp1250"
+ endif
+endif
+
+" The Turkish tutor is available in two encodings, guess which one to use
+if s:ext =~? '\.tr'
+ if &enc == "iso-8859-9" || &enc == "cp1254"
+ let s:ext = ".tr.iso9"
+ endif
+endif
+
+" The Greek tutor is available in three encodings, guess what to use.
+" We used ".gr" (Greece) instead of ".el" (Greek); accept both.
+if s:ext =~? '\.gr\|\.el'
+ if &enc == "iso-8859-7"
+ let s:ext = ".el"
+ elseif &enc == "utf-8"
+ let s:ext = ".el.utf-8"
+ elseif &enc =~ 737
+ let s:ext = ".el.cp737"
+ endif
+endif
+
+" The Slovak tutor is available in three encodings, guess which one to use
+if s:ext =~? '\.sk'
+ if &enc =~ 1250
+ let s:ext = ".sk.cp1250"
+ endif
+endif
+
+" The Slovak tutor is available in two encodings, guess which one to use
+" Note that the utf-8 version is the original, the cp1250 version is created
+" from it.
+if s:ext =~? '\.sr'
+ if &enc =~ 1250
+ let s:ext = ".sr.cp1250"
+ endif
+endif
+
+" The Czech tutor is available in three encodings, guess which one to use
+if s:ext =~? '\.cs'
+ if &enc =~ 1250
+ let s:ext = ".cs.cp1250"
+ endif
+endif
+
+" The Russian tutor is available in three encodings, guess which one to use.
+if s:ext =~? '\.ru'
+ if &enc =~ '1251'
+ let s:ext = '.ru.cp1251'
+ elseif &enc =~ 'koi8'
+ let s:ext = '.ru'
+ endif
+endif
+
+" The Hungarian tutor is available in three encodings, guess which one to use.
+if s:ext =~? '\.hu'
+ if &enc =~ 1250
+ let s:ext = ".hu.cp1250"
+ elseif &enc =~ 'iso-8859-2'
+ let s:ext = '.hu'
+ endif
+endif
+
+" The Croatian tutor is available in three encodings, guess which one to use.
+if s:ext =~? '\.hr'
+ if &enc =~ 1250
+ let s:ext = ".hr.cp1250"
+ elseif &enc =~ 'iso-8859-2'
+ let s:ext = '.hr'
+ endif
+endif
+
+" If 'encoding' is utf-8 s:ext must end in utf-8.
+if &enc == 'utf-8' && s:ext !~ '\.utf-8'
+ let s:ext .= '.utf-8'
+endif
+
+" 2. Build the name of the file:
+let s:tutorfile = "/tutor/tutor"
+let s:tutorxx = $VIMRUNTIME . s:tutorfile . s:ext
+
+" 3. Finding the file:
+if filereadable(s:tutorxx)
+ let $TUTOR = s:tutorxx
+elseif s:ext !~ '\.utf-8' && filereadable(s:tutorxx . ".utf-8")
+ " Fallback to utf-8 if available.
+ let $TUTOR = s:tutorxx . ".utf-8"
+else
+ let $TUTOR = $VIMRUNTIME . s:tutorfile
+ echo "The file " . s:tutorxx . " does not exist.\n"
+ echo "Copying English version: " . $TUTOR
+ 4sleep
+endif
+
+" 4. Making the copy and exiting Vim:
+e $TUTOR
+wq! $TUTORCOPY
diff --git a/runtime/tutor/tutor.zh.big5 b/runtime/tutor/tutor.zh.big5
new file mode 100644
index 0000000..6a4e2cb
--- /dev/null
+++ b/runtime/tutor/tutor.zh.big5
@@ -0,0 +1,852 @@
+===============================================================================
+= w \ Ū m V I M { n ww 1.5 =
+===============================================================================
+ vim O@Ө㦳ܦhRO\D`jjs边C_gTAbе{
+ NԲӤФFCе{]pؼЬOz@ǥn򥻩ROAӴxno
+ ǩROAzNܮeNvim@@ӳqΪUs边ӨϥΤFC
+
+ е{ejݭn25-30AM_zVmɶC
+
+ C@`ROާ@N|糧C˱z_媺@ӰƥAMbƥW
+ iVm(pGzOqL"vimtutor"ӱҰʱе{A򥻤NwgOƥF)C
+
+ O@IJе{]pObϥΤiDzߪC]NOAzݭnqL
+ ROӾDzߥ̥TΪkCpGzuO\ŪӤާ@Azi
+ |ܧֿѳoǩROI
+
+ nFA{bнTwzShift-Lock(jpgw)٨SUAMLW
+ r j hƨӲʥСAĤ@`eR̹C
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ĥ@Ĥ@`Jʥ
+
+
+ nʥСAШ̷ӻOU hBjBkBl C
+
+ ^
+ k ܡJ h _ACUN|VʡC
+ < h l > l _kACUN|VkʡC
+ j j ݏӫܶH@yݤV¤UbYC
+ v
+
+ 1. HNb̹ʥСAܱzıoΪAC
+
+ 2. UU(j)AX{Э_UC
+
+---> {bzӤwgǷ|p󲾰ʨU@aC
+
+ 3. {bШϥΤUANвʨĤ@ĤG`C
+
+ܡJpGzTwzҫUrAЫU<ESC>^쥿`(Normal)ҦC
+ MAqLJzQnROC
+
+ܡJ]ॿ`u@COϥhjklAbߺDzNֳt
+ ab̹|BʥФFC
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ĥ@ĤG`JVIMiJMhX
+
+
+ !! SOܡJqо\Ū㥻@`eAM~HUѪROC
+
+ 1. Ы<ESC>(oOFTOzBb`Ҧ)C
+
+ 2. MJJ :q! <^>
+
+---> oؤ覡hXs边|OsziJs边HөҰʡC
+ pGzQOsAhXAпJJ
+ :wq <^>
+
+ 3. pGzݨFRO洣ܲšAпJaz^쥻е{ROANOJ
+
+ vimtutor <^>
+
+ q`pUz]iHγoؤ覡J
+
+ vim tutor <^>
+
+---> o̪ 'vim' ܶiJvims边A 'tutor'hOzdzƭns誺C
+
+ 4. pGz۫HwgccOFoǨBJܡAбqBJ1BJ3hXAM
+ AiJs边C۱NвʨĤ@ĤT`~ڭ̪е{ѡC
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ĥ@ĤT`J奻s褧R
+
+
+ ** b`(Normal)ҦUAiHU x ӧRЩҦbmršC**
+
+ 1. бNвʨ쥻`UаO ---> @C
+
+ 2. FץJ~AбNвܷdzƧRrŪmBC
+
+ 3. MU x N~rŧRC
+
+ 4. _BJ2BJ4AylץC
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. nFAӦwgץFAU@`eOĤ@ĥ|`C
+
+SOܡJbzsе{ɡAnjOСCO@IJbϥΤDzߡC
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ĥ@ĥ|`J奻s褧J
+
+
+ ** b`ҦUAiHU i ӴJ奻C**
+
+ 1. бNвʨ쥻`UаO ---> Ĥ@C
+
+ 2. FϱoĤ@椺epP_ĤGAбNвܤ奻Ĥ@ӦrŷdzƴJ
+ mC
+
+ 3. MU i AۿJn奻ršC
+
+ 4. Ҧ奻mץAЫU <ESC> ^`ҦC
+ _BJ2ܨBJ4HKץylC
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5. pGz奻Jާ@wgܺNAб۾\ŪUpC
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ĥ@p
+
+
+ 1. Цb̹奻ʬJiHνbYA]iHϥ hjkl rC
+ h () j (U) k (W) l (k)
+
+ 2. iJvims边(qRO洣ܲ)AпJJvim W <^>
+
+ 3. hXvims边AпJHUROҦקJ
+
+ <ESC> :q! <^>
+
+ ΎͿJHUROOsҦקJ
+
+ <ESC> :wq <^>
+
+ 4. b`ҦURЩҦbmršAЫJ x
+
+ 5. b`ҦUnbЩҦbm}lJ奻AЫJ
+
+ i Jn奻 <ESC>
+
+SOܡJU <ESC> |az^쥿`ҦΎͨ@ӤΎͳ
+ROC
+
+nFAĤ@즹CUU~ĤGeC
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤGĤ@`JRRO
+
+
+ ** J dw iHqгBRܤ@ӳr/C**
+
+ 1. ЫU <ESC> TOzB_`ҦC
+
+ 2. бNвʨ쥻`UаO ---> @C
+
+ 3. бNвܷdzƭnR}lC
+
+ 4. ۿJ dw RӳC
+
+ SOܡJzҿJ dw |bzJPɥX{b̹̫@CpGz
+ J~AЫU <ESC> AM᭫sAӡC
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. _BJ3ܨBJ4AܥylץC~ĤGĤG`eC
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤGĤG`JLRRO
+
+
+ ** J d$ qeЧR楽C**
+
+ 1. ЫU <ESC> TOzB_`ҦC
+
+ 2. бNвʨ쥻`UаO ---> @C
+
+ 3. бNвʨӦ檺(]NObĤ@I.᭱)C
+
+ 4. MJ d$ qгBRܷeC
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+
+ 5. ~Dz߲ĤGĤT`NDO^ƤFC
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤGĤT`J_ROMH
+
+
+ RRO d 榡pUJ
+
+ [number] d object Ύ d [number] object
+
+ NpUJ
+ number - NRO(iﶵAʬٳ]m 1 )C
+ d - NRC
+ object - NROҭnާ@H(U)C
+
+ @²uHCJ
+ w - qeзemr/A]AŮC
+ e - qeзemr/AO ** ]AŮC
+ $ - qeзeme楽C
+
+SOܡJ
+ _i_͡AЦb`ҦUȫNHӤϥΩROAh
+ NݨЪʥpWHCҥN@ˡC
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤGĥ|`JHROSp
+
+
+ ** J dd iHR@ӷeC **
+
+ ų_RWסAVIM ]pͨMwn²ƾRAȻݭnbP@W
+ ⦸ d NiHRЩҦbFC
+
+ 1. бNвʨ쥻`UuyqĤGC
+ 2. J dd RӦC
+ 3. MᲾʨĥ|C
+ 4. ۿJ 2dd (ٰOoeL number-command-object ܡH) RC
+
+ 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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤGĤ`JMRO
+
+
+ ** J u ӺM̫檺ROAJ U ӭץC**
+
+ 1. бNвʨ쥻`UаO ---> @AñNm_Ĥ@ӿ~
+ BC
+ 2. J x RĤ@ӤQOdrC
+ 3. MJ u M̫檺(@)ROC
+ 4. onϥ x ץ檺Ҧ~C
+ 5. {bJ@Ӥjg U A_Ӧ檺lAC
+ 6. ۦhJ u HM U HΧeROC
+ 7. MhJ CTRL-R (U CTRL 䤣}AۿJ R ) Ao˴N
+ iH枩_ROA]NOMMROC
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. oǐmOD`ΪROCUOĤGpFC
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤGp
+
+
+ 1. qeЧRܳr/AпJJdw
+
+ 2. qeЧRܷe楽AпJJd$
+
+ 3. RAпJJdd
+
+ 4. b`ҦU@өRO榡OJ
+
+ [number] command object Ύ command [number] object
+ NOJ
+ number - NORO檺
+ command - NnƱAp d NR
+ object - Nnާ@HAp w Nr/A$ N楽C
+ $ (to the end of line), etc.
+
+ 5. MHeާ@AпJJu (pgu)
+ Mb@椤ҰʡAпJJU (jgU)
+ MHeMROA_Heާ@GAпJJCTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤTĤ@`JmJRO
+
+
+ ** J p N̫@RemJФ **
+
+ 1. бNвʨ쥻`UܭSqC
+
+ 2. J dd NӦRAo˷|NӦOsvimwRϤC
+
+ 3. ۱NвʨdzƸmJmWCOJOW@C
+
+ 4. Mb`ҦU(<ESC>iJ)AJ p NӦ߶KmJC
+
+ 5. _BJ2ܨBJ4ANҦ̧ǩm쥿TmWC
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤTĤG`JRO
+
+
+ ** J r M@ӦrŴЩҦbmršC**
+
+ 1. бNвʨ쥻`UаO ---> Ĥ@C
+
+ 2. вʥШĤ@ӿ~AmC
+
+ 3. ۿJ r Ao˴NN~FC
+
+ 4. _BJ2MBJ3AĤ@wgק粒C
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. Mڭ~ǮղĤTĤT`C
+
+SOܡJOznbϥΤDzߡAӤObOФDzߡC
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤTĤT`JRO
+
+
+ ** nܤ@ӳr/ΎͥAпJ cw **
+
+ 1. бNвʨ쥻`UаO ---> Ĥ@C
+
+ 2. ۧЩb lubw r u m̡C
+
+ 3. MJ cw NiHץӳF(bҳo̬OJ ine C)
+
+ 4. ̫ <ESC> AMЩwU@ӿ~Ĥ@ӷdzƧ諸rBC
+
+ 5. _BJ3MBJ4AĤ@ӥylpPĤGӥylC
+
+---> This lubw has a few wptfd that mrrf changing usf the change command.
+---> This line has a few words that need changing using the change command.
+
+ܡJЪ`N cw ROȶȬOF@ӳA]ziJ奻JAFC
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤTĥ|`JϥcOLRO
+
+
+ ** OiHϥΦPRROҨϥΪHѼơC**
+
+ 1. Ou@覡RROO@PCާ@榡OJ
+
+ [number] c object Ύ c [number] object
+
+ 2. HѼƤ]O@˪Ap w Nr/A$N楽C
+
+ 3. бNвʨ쥻`UаO ---> Ĥ@C
+
+ 4. ۱NвʨĤ@ӿ~BC
+
+ 5. MJ c$ ϱoӦѤU󥿱oPĤG@ˡC̫ <ESC> C
+
+---> 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$ command.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤTp
+
+
+ 1. nsmJwgR奻eAпJpgr pCӾާ@iHNwR
+ 奻em_ФCpG̫@RO@ӾAӦNm
+ _eЩҦb檺U@C
+
+ 2. nЩҦbmršAпJpg r MnmrŪsr
+ ŧYiC
+
+ 3. RO\zܫwHAqeЩҦbmHC
+ pJ cw iHeШeFJ c$ iH
+ eШ楽eC
+
+ 4. RO榡OJ
+
+ [number] c object Ύ c [number] object
+
+Uڭ~DzߤU@C
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĥ|Ĥ@`JwΤ󪬺A
+
+
+ ** J CTRL-g ܷes󤤷eЩҦbmHΤ󪬺AHC
+ J SHIFT-G h󤤪Y@wC**
+
+ ܡJOnqŪ`eA~iHHUBJ!!!
+
+ 1. U CTRL 䤣}M g CMN|ݨ쭶̩X{@ӪAH
+ AܪeOes誺WM`ơCаOBJ3渹C
+
+ 2. U SHIFT-G iHϱoeЪ̫@C
+
+ 3. Jzd渹AMU SHIFT-GCo˴NiH^zĤ@U
+ CTRL-g ɩҦbnFC`NJJ渹ɡA渹O|b̹WܥX
+ C
+
+ 4. pG@NAziH~BJ1ܨBJTC
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĥ|ĤG`JjRO
+
+
+ ** J / HΧHrŦiHΥHbe󤤬dӦrŦC**
+
+ 1. b`ҦUJ / ršCzɷ|`NӦrũMАm|X{b̹
+ Ao : ROO@˪C
+
+ 2. ۿJ errroor <^>CerrroorNOznd䪺rŦC
+
+ 3. ndPW@rŦAuݭn n CnVۤϤVdPW@r
+ ŦAпJ Shift-N YiC
+
+ 4. pGzQfVdrŦAШϥ ? N / iC
+
+---> When the search reaches the end of the file it will continue at the start.
+
+ "errroor" is not the way to spell error; errroor is an error.
+
+ ܡJpGdwgF󥽧Ad|۰ʱqY~dC
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĥ|ĤT`JtAd
+
+
+ ** % iHdt諸A )B]B}C**
+
+ 1. Щb`UаO --> @椤@ (B[ { BC
+
+ 2. ۫ % ršC
+
+ 3. ɥЪmObt諸ABC
+
+ 4. A % NiH^t諸Ĥ@ӬABC
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+ܡJb{ǽոծɡAoӥ\ΨӬd䤣t諸AOܦΪC
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĥ|ĥ|`Jץ~k@
+
+
+ ** J :s/old/new/g iH old newC**
+
+ 1. бNвʨ쥻`UаO ---> @C
+
+ 2. J :s/thee/the <^> CЪ`NөROuܥЩҦb檺Ĥ@Ӥǰt
+ C
+
+ 3. J :s/thee/the/g hO檺ǰtC
+
+---> the best time to see thee flowers is in thee spring.
+
+ 4. n椧X{CӤǰtAпJ :#,#s/old/new/g (#,#NO
+ 檺渹)CJ :%s/old/new/g hOӤ󤤪CӤǰtC
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĥ|p
+
+
+ 1. Ctrl-g Τ_ܷeЩҦbmM󪬺AHCShift-G Τ_Nи
+ ܤ̫@CVJ@Ӧ渹M Shift-G hONвʦܸӦ
+ NC
+
+ 2. J / MH@ӦrŦOhObeҽs誺ɤVdӦrŦC
+ Jݸ ? MH@ӦrŦOhObeҽs誺ɤVedӦr
+ ŦC@d䤧 n hO_W@ROAibP@VWd
+ U@ӦrŦҦbFΎͫ Shift-N VۤϤVdUӦrŦҦbC
+
+ 3. pGзemOA(B)B[B]B{B}A % iHNвʨt諸
+ AWC
+
+ 4. b@椺Y@ӦrŦ old srŦ newAпJ :s/old/new
+ b@椺ҦrŦ old srŦ newAпJ :s/old/new/g
+ b椺ҦrŦ old srŦ newAпJ :#,#s/old/new/g
+ b󤺴ҦrŦ old srŦ newAпJ :%s/old/new/g
+ iɸ߰ݥΤT{CӴݲK[ c ﶵAпJ :%s/old/new/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤĤ@`Jb VIM ~ROk
+
+
+ ** J :! MHۿJ@ӥ~ROiHӥ~ROC**
+
+ 1. Uڭ̩Ҽx : RO]mШ̹Co˴NiHzJROFC
+
+ 2. ۿJPĸ ! oӦršAo˴N\z~ shell ROFC
+
+ 3. ڭ̥H ls ROҡCJ !ls <^> CөRON|C|Xzeؿ
+ eANpPzbRO洣ܲŤUJ ls ROG@ˡCpG !ls S
+ @ΡAziHո :!dir ݬݡC
+
+---> ܡJ Ҧ~ROmiHHoؤ覡C
+
+---> ܡJ Ҧ : ROmH <^> iסC
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤĤG`J_Os󪺧hH
+
+
+ ** nN󪺧ʫOs󤤡AпJ :w FILENAME **
+
+ 1. J :!dir Ύ :!ls 򪾷eؿeCzwD̫ٱoV
+ <^> aC
+
+ 2. ܤ@ө|sbWAp TEST C
+
+ 3. ۿJ :w TEST (B TEST OzҿܪWC)
+
+ 4. өRO|H TEST WOsӤ (VIM е{)CFTOTOsA
+ ЦAJ :!dir dݱzؿCeC
+
+---> Ъ`NJpGzhX VIM MbHW TEST ѼƶiJAӤ
+ eӦPzOsɪ󤺮eO@˪C
+
+ 5. {bziHqLJ :!rm TEST ӧR TEST FC
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤĤT`J@Ө㦳ܩʪOsRO
+
+
+ ** nOs󪺳eAпJ :#,# w FILENAME **
+
+ 1. AӰ@ :!dir Ύ :!ls 򪾷eؿeAMܤ@ӦXA
+ WWAp TEST C
+
+ 2. ۱Nвʦܥ̳ݡAM CTRL-g Ӧ檺渹COѤF
+ 渹@C
+
+ 3. ۧвʦܥ̩ݡAA@ CTRL-g C]OѤFoӦ渹@C
+
+ 4. FuOs峹YӳAпJ :#,# w TEST Co̪ #,# NOW
+ nDzO渹(ݦ渹,ݦ渹)A TEST NOwWC
+
+ 5. ̫A :!dir T{O_TOsCOoORC
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ĥĥ|`JMXä
+
+
+ ** nVe󤤴Jt~󪺤eAпJ :r FILENAME **
+
+ 1. J :!dir T{zeЫت TEST ٦bC
+
+ 2. MNвʦܷeݡC
+
+SOܡJ BJ3zNݨĤĤT`AЩɦAUʦ^ǫӡC
+
+ 3. ۳qL :r TEST NeЫتW TEST 󴣨iӡC
+
+SOܡJzҴiӪNqЩҦbmB}lmJC
+
+ 4. FT{wg\AʥЦ^ӪmNiH`N
+ ĤT`A@O쥻At~@OӦۤ󪺰ƥC
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ĥp
+
+
+ 1. :!command Τ_@ӥ~RO commandC
+
+ Ьݤ@ǹڨҤlJ
+ :!dir - Τ_ܷeؿeC
+ :!rm FILENAME - Τ_RW FILENAME C
+
+ 2. :w FILENAME iNe VIM bs誺OsW FILENAME
+ 󤤡C
+
+ 3. :#,#w FILENAME iNes # ܲ # 檺eOs
+ FILENAME C
+
+ 4. :r FILENAME iϽL FILENAME ñN䴡Je󪺥Цm
+ ᭱C
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤĤ@`J}RO
+
+
+ ** J o NbЪU襴}s@öiJJҦC**
+
+ 1. бNвʨ쥻`UаO ---> @C
+
+ 2. ۿJpg o b *U* }s@öiJJҦC
+
+ 3. M_аO ---> ë <ESC> hXJҦӶiJ`ҦC
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. Fb *W* }s@AuݭnJjg O ӤOpg o
+ NiHFCЦbUդ@UaCгBbbӦWɡA Shift-OiH
+ bӦWs}@C
+
+Open up a line above this by typing Shift-O while the cursor is on this line.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤĤG`JЫᴡJRO
+
+
+ ** J a NibФᴡJ奻C **
+
+ 1. Цb`ҦUqLJ $ Nвʨ쥻`UаO ---> Ĥ@
+ C
+
+ 2. ۿJpg a hibФᴡJ奻FCjg A hiHb
+ J奻C
+
+ܡJJjg A ާ@kiHb楽J奻AקKFJ iAЩw
+ ̫@ӦršAJ奻A<ESC> ^_`ҦAbYk䲾ʥХH
+ x ReЩҦbmrŵѦhcާ@C
+
+ 3. ާ@Ĥ@NiHɥRFCЪ`NЫᴡJ奻PJҦO
+ @PAuO奻JmwyP}FC
+
+---> This line will allow you to practice
+---> This line will allow you to practice appending text to the end of a line.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤĤT`Jt~@ӸmRO
+
+
+ ** Jjg R ishӦršC**
+
+ 1. бNвʨ쥻`UаO ---> Ĥ@C
+
+ 2. ʥШĤ@椤P_Ц ---> ĤG檺Ĥ@ӳ}lAY
+ last BC
+
+ 3. MJjg R }lĤ@椤P_ĤG檺ѧErųv@JAN
+ iH즳rŦӨϱoĤ@槹pPĤGFC
+
+---> To make the first line the same as the last on this page use the keys.
+---> To make the first line the same as the second, type R and the new text.
+
+ 4. Ъ`NJpGz <ESC> hXmҦ^_`ҦA|奻N
+ MO쪬C
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ĥĥ|`J]mROﶵ
+
+
+ ** ]miϬdΎʹijpgﶵ **
+
+
+ 1. nd ignore ib`ҦUJ /ignore Cn_dӵAiH
+ _ n C
+
+ 2. M]m ic ﶵ(icNO^婿jpgIgnore CaserYg)AY
+ JJ
+ :set ic
+
+ 3. {biHqLJ n Ad ignoreC_diH_J n C
+
+ 4. M]m hlsearch M incsearch oӿﶵAJHUeJ
+ :set hls is
+
+ 5. {biHAJdROAݬݷ|ĪGJ
+ /ignore
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ĥp
+
+
+ 1. Jpg o iHbФU襴}s@ñNиm_s}歺AiJ
+ JҦC
+ Jjg O iHbФW襴}s@ñNиm_s}歺AiJ
+ JҦC
+
+ 2. Jpg a iHbЩҦbmᴡJ奻C
+ Jjg A iHbЩҦb檺楽ᴡJ奻C
+
+ 3. Jjg R NiJҦAܫ <ESC> hXҦӶiJ`
+ ҦC
+
+ 4. J :set xxx iH]m xxx ﶵC
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤCJbuURO
+
+ ** ϥΦbuUt **
+
+ Vim ֦@ӲӭPbuUtΡCnҰʸUtΡAпܦpUTؤ
+ k@J
+ - U <HELP> (pGLW)
+ - U <F1> (pGLW)
+ - J :help <^>
+
+ J :q <^> iHUfC
+
+ Ѥ@ӥTѼƵ":help"ROAziH_ӥDDUCиH
+ UѼ(iOѤF^@C:)J
+
+ :help w <^>
+ :help c_<T <^>
+ :help insert-index <^>
+ :help user-manual <^>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĤKJЫؤ@ӱҰʸ}
+
+ ** ҥvim\ **
+
+ Vim\SʭnvihohAj\mSʬٿECFҰʧh
+ \AzoЫؤ@vimrcC
+
+ 1. }lsvimrcAoM_zҨϥΪާ@tΡJ
+
+ :edit ~/.vimrc oOUnixtΩҨϥΪRO
+ :edit ~/_vimrc oOWindowstΩҨϥΪRO
+
+ 2. ۾ɤJvimrcSҤJ
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. OsAROJ
+
+ :write
+
+ bUzҰvimɭԡAs边N|FykG\CziH~z
+ w䥦\]mK[ovimrc󤤡C
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ vim е{즹Cе{uOF²aФ@Uvims边AwHz
+ ܮeǷ|ϥΥs边FCeáAvim٦ܦhܦhROAе{Ҥ
+ Ъٮto۩OCҥHznqܡAٱ~VO@CU@BziH\Ū
+ vimUAϥΪROOJ
+ :help user-manual
+
+ Fi@BѦҩMDzߡAHUoѭȱoˡJ
+
+ Vim - Vi Improved - @͡JSteve Oualline
+ XJNew Riders
+
+ oOĤ@vimyC_ǎͯSOΡC䤤٥]tjq
+ MϥܡCԱAгX https://iccf-holland.org/click5.html
+
+ HUoѤѤFӥBeDnOviӤOvimAO]ȱoˡJ
+
+ Learning the Vi Editor - @͡JLinda Lamb
+ XJO'Reilly & Associates Inc.
+
+ oO@ѡAqLzXGFѨvi쪺ƱCѪ
+ Ӫ]]tF@_vimHC
+
+ е{OѨӦCalorado School of MineseMichael C. PierceBRobert K.
+ Ware ҽsgA䤤ӦColorado State UniversityCharles SmithѤF
+ ܦhзNCsͳqHa}OJ
+
+ bware@mines.colorado.edu
+
+ е{wBram MoolenaarMvimi׭qC
+
+
+
+ ĶͪJ
+ ===========
+ ²餤е{½ĶĶͬ <beos@turbolinux.com.cn>A٦
+ t~@pta}Jlinuxrat@gnuchina.orgC
+
+ c餤е{Oq²餤е{½Ķϥ Debian GNU/Linux 嶵ؤp
+ ժ_sͽsg~rX autoconvert ഫӦAù
+ GF@DzӸ`ʡC
+
+ ܧOJ
+ =========
+ 2002~0830 <beos@turbolinux.com.cn>
+ P RMS@SMTH ANhB~ץC
+
+ 2002~0422 <linuxrat@gnuchina.org>
+ P xuandong@sh163.net ANBOrץC
+
+ 2002~0318 <linuxrat@gnuchina.org>
+ ھBram Moolenaarͦb2002~0316骺ӫHnDANvimtutor1.4Ķ
+ ɯŨvimtutor1.5C
+
+ 2001~1115 <linuxrat@gnuchina.org>
+ Nvimtutor1.4Ķ浹Bram MoolenaarMSven GuckesC
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.zh.euc b/runtime/tutor/tutor.zh.euc
new file mode 100644
index 0000000..16a031a
--- /dev/null
+++ b/runtime/tutor/tutor.zh.euc
@@ -0,0 +1,996 @@
+===============================================================================
+= ӭ V I M 汾 1.7 =
+===============================================================================
+
+ Vim һкܶĹܷdzǿı༭ƪڱ̵̳
+ Ͳϸˡ̵̳ĿǽһЩҪĻպ
+ Щܹ׵ؽ Vim һͨñ༭ʹˡ
+
+ ɱ̵̳ݴԼҪ25-30ӣȡѵʱ䡣
+
+ ע⣺
+ ÿһڵıġƼƱĵһȻڸ
+ ѵ(ͨ"vimtutor"̵̳ģôľѾǸ)
+
+ мһ㣺̵̳˼·ʹнѧϰġҲ˵Ҫͨ
+ ִѧϰDZȷ÷ֻĶô
+ ܿЩģ
+
+ ˣȷShift-Lock(Сд)ûа£Ȼ󰴼
+ ĸ j 㹻ƶֱ꣬һڵܹȫĻ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ һһڣƶ
+
+
+ ** Ҫƶ꣬˵ֱ hjkl **
+
+ ^
+ k ʾ h ļλߣÿΰ¾ͻƶ
+ < h l > l ļλұߣÿΰ¾ͻƶ
+ j j һ֧˷µļͷ
+ v
+
+ 1. Ļƶֱ꣬Ϊֹ
+
+ 2. м(j)ֱֹظС
+
+---> ӦѾѧƶһɡ
+
+ 3. ʹмƶһڶڡ
+
+ʾȷµĸ밴<ESC>ص(Normal)ģʽ
+ ȻٴδӼҪ
+
+ʾӦҲġʹhjklϰܹ֮
+ ĻĴƶꡣ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ һڶڣVIMĽ˳
+
+
+ !! رʾĶһڵݣȻִ
+
+ 1. <ESC>(Ϊȷģʽ)
+
+ 2. Ȼ룺 :q! <س>
+ ַʽ˳༭ᶪ༭ĸĶ
+
+ 3. ʾܹص̵̳Ǿǣ
+ vimtutor <س>
+
+ 4. ѾμסЩĻӲ1ִе3˳Ȼ
+ ٴν༭
+
+ʾ :q! <س> ᶪκθĶ֮ѧαĶļ
+
+ 5. Ƶһڡ
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ һڣı༭֮ɾ
+
+
+ ** (Normal)ģʽ£԰ x ɾλõַ**
+
+ 1. 뽫ƶ ---> һС
+
+ 2. Ϊ뽫׼ɾַλô
+
+ 3. Ȼ x ַɾ
+
+ 4. ظ24ֱΪֹ
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. ˣѾˣǵһĽڡ
+
+رʾ̳ʱҪǿм䡣סһ㣺ʹѧϰ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ һĽڣı༭֮
+
+
+ ** ģʽ£԰ i ı**
+
+ 1. 뽫ƶ ---> ĵһС
+
+ 2. ΪʹõһͬڵڶУ뽫ıһ׼ַ
+ λá
+
+ 3. Ȼ i Ҫıַ
+
+ 4. ÿϺ밴 <ESC> ģʽ
+ ظ24Աӡ
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5. ıѾ⣬Ķĵһڡ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ һڣı༭֮
+
+
+ ** A ı **
+
+ 1. ƶ굽һ ---> һС
+ һеĸַϲҪ
+
+ 2. A Ҫݡ
+
+ 3. ıϺ󣬰 <ESC> صģʽ
+
+ 4. ƶ굽ڶ ---> һСظ2Ͳ3Ըӡ
+
+---> 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. ıеʱѧϰһڡ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ һڣ༭ļ
+
+ ** ʹ :wq Աļ˳ **
+
+ رʾִ²֮ǰȶСڣ
+
+ 1. ڵһڶ˳̳̣ :q!
+ ߣԷһնˣִ²
+
+ 2. shell ʾ vim tutor <س>
+ 'vim' Vim ༭'tutor'ϣ༭ļ֡
+ ʹһԸĶļ
+
+ 3. ʹǰĽ̳ѧɾı
+
+ 4. Ķļ˳ VimЩ :wq <س>
+
+ 5. ڲ1Ѿ˳ vimtutor vimtutor ƶСһڡ
+
+ 6. Ķϲ裬Ūǵ壬Ȼʵнϰ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ һС
+
+
+ 1. ĻıеƶȿüͷҲʹ hjkl ĸ
+ h () j () k () l ()
+
+ 2. Vim ༭(ʾ)룺vim ļ <س>
+
+ 3. ˳ Vim ༭ <ESC> :q! <س> иĶ
+ <ESC> :wq <س> Ķ
+
+ 4. ģʽɾλõַ밴 x
+
+ 5. ı룺
+
+ i ı <ESC> ڹǰı
+ A ı <ESC> һкı
+
+رʾ <ESC> صģʽ߳һ򲿷
+
+
+ˣһ˽ڶݡ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶһڣɾ
+
+
+ ** dw Դӹ괦ɾһʵĩβ**
+
+ 1. 밴 <ESC> ȷģʽ
+
+ 2. 뽫ƶ ---> һС
+
+ 3. 뽫׼Ҫɾĵʵʼ
+
+ 4. dw ɾõʡ
+
+ رʾʱĸ d ͬʱĻһСVim ڵȴ
+ ĸ wdz d ַDZˣ밴 <ESC>
+ Ȼ
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. ظ3Ͳ4ֱϡżڶڶݡ
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶڶڣɾ
+
+
+ ** d$ ӵǰɾĩ**
+
+ 1. 밴 <ESC> ȷģʽ
+
+ 2. 뽫ƶ ---> һС
+
+ 3. 뽫ƶеβ(Ҳڵһš.)
+
+ 4. Ȼ d$ ӹ괦ɾǰβ
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+
+ 5. ѧϰڶھ֪ôˡ
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶڣͶ
+
+
+ ııһһɡ
+ ʹɾ d ɾĸʽ£
+
+ d motion
+
+ У
+ d - ɾ
+ motion - IJ(г)
+
+ һ̵Ķб
+ w - ӵǰ굱ǰλֱһʼĵһַ
+ e - ӵǰ굱ǰλֱĩβһַ
+ $ - ӵǰ굱ǰλֱǰĩ
+
+ de ӵǰλɾĩβ
+
+رʾ
+ ̽ߣģʽӦļʹò
+ ƶĶбһ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶĽڣʹüָ
+
+
+ ** ڶǰֻʹظôΡ **
+
+ 1. ƶ굽 ---> һеĿʼ
+
+ 2. 2w ʹǰƶʡ
+
+ 3. 3e ʹǰƶʵĩβ
+
+ 4. 0 () ƶ굽ס
+
+ 5. ظ2Ͳ3Բͬ֡
+
+---> This is just a line with words you can move around in.
+
+ 6. ѧϰڶڡ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶڣʹüɾ
+
+
+ ** ʹòʱֿʹظôΡ **
+
+ ѾᵽɾͶϣж֮ǰһ
+ ɾࣺ
+ d number() motion
+
+ 1. ƶ굽 ---> һеһдĸϡ
+
+ 2. d2w ɾдĸʡ
+
+ 3. ظ1Ͳ2ʹòͬʹһɾȫڵĴдĸ
+
+
+---> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶڣ
+
+
+ ** dd ɾһǰС **
+
+ ɾĸƵȣVi ߾ҪɾҪͬһ
+ d Ϳɾڵˡ
+
+ 1. 뽫ƶĶ̾еĵڶС
+ 2. dd ɾС
+ 3. ȻƶС
+ 4. 2dd ɾС
+
+---> 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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶ߽ڣ
+
+
+ ** u ִе U е޸ġ **
+
+ 1. 뽫ƶ ---> һУڵһ
+
+ 2. x ɾһ뱣ĸ
+ 3. Ȼ u ִе(һ)
+ 4. Ҫʹ x ед
+ 5. һд U ָеԭʼ״̬
+ 6. Ŷ u Գ U Լǰ
+ 7. Ȼ CTRL-R (Ȱ CTRL ſŰ R )
+ Ҳdz
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. ЩǷdzõǵڶСˡ
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶС
+
+
+ 1. ӵǰɾһʣ룺dw
+ 2. ӵǰɾǰĩβ룺d$
+ 3. ɾУ룺dd
+
+ 4. ظһǰһ֣2w
+ 5. ģʽ޸ĸʽǣ
+ operator [number] motion
+ У
+ operator - Ҫ飬 d ɾ
+ [number] - Ըӵ֣ظĴ
+ motion - ıϵƶ w (word)
+ $ ĩȵȡ
+
+ 6. ƶ굽ף밴00
+
+ 7. ǰIJ룺u (Сдu)
+ һĸĶ룺U (дU)
+ ǰijָǰIJ룺CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ һڣ
+
+
+ ** p һɾ֮ **
+
+ 1. 뽫ƶһ ---> һС
+
+ 2. dd ɾὫб浽 Vim һĴС
+
+ 3. Žƶ c) һУ׼λõϷסϷŶ
+
+ 4. Ȼģʽ(<ESC>) p ճ롣
+
+ 5. ظ24еõȷλϡ
+
+---> d) Can you learn too?
+---> b) Violets are blue,
+---> c) Intelligence is learned,
+---> a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶڣ滻
+
+
+ ** r һַ滻λõַ**
+
+ 1. 뽫ƶ ---> ĵһС
+
+ 2. ƶ굽һλá
+
+ 3. r Ҫ滻ɵַܽ滻ˡ
+
+ 4. ظ2Ͳ3ֱһѾ޸ϡ
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. ȻǼѧϰڡ
+
+رʾмҪʹѧϰڼѧϰ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڣ
+
+
+ ** Ҫııֱһʵĩβ ce **
+
+ 1. 뽫ƶ ---> ĵһС
+
+ 2. Űѹڵ lubw ĸ u λ
+
+ 3. Ȼ cw Լȷĵ(ڱ ine )
+
+ 4. <ESC> Ȼ궨λһһ׼ĵĸ
+
+ 5. ظ3Ͳ4ֱһȫͬڶӡ
+
+---> 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.
+
+ʾע ce ɾһʣҲģʽˡ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ľڣʹcĸ
+
+
+ ** ɾʹõͬĶʹá **
+
+ 1. Ĺʽɾһµġʽǣ
+
+ c [number] motion
+
+ 2. (motion)Ҳһģ w ʣ$ĩȵȡ
+
+ 3. 뽫ƶ ---> ĵһС
+
+ 4. Žƶһ󴦡
+
+ 5. Ȼ c$ ʹøʣµIJָͬڶһ <ESC>
+
+---> 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$ command.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ С
+
+
+ 1. ҪѾɾıݣ밴Сдĸ p òԽɾ
+ ıڹ֮һɾһУôн
+ ڵǰеһС
+
+ 2. Ҫ滻λõַСд r Ҫ滻ԭλַ
+ ɡ
+
+ 3. ıӵǰλֱָʾλмı
+ ce 滻ǰ굽ʵĩβݣ c$ 滻
+ ǰ굽ĩݡ
+
+ 4. ĸʽǣ
+
+ c [number] motion
+
+Ǽѧϰһ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ľһڣλļ״̬
+
+ ** CTRL-G ʾǰ༭ļеǰλԼļ״̬Ϣ
+ д G ֱתļеijһָС**
+
+ ʾмҪͨݣ֮ſִ²!!!
+
+ 1. CTRL ſȻ g dzΪ CTRL-G
+ ῴҳײһ״̬ϢУʾǵǰ༭ļ
+ ļйλáסкţڲ3õ
+
+ʾҲĻ½ǿλã 'ruler' ѡʱ
+ (μ :help 'ruler')
+
+ 2. д G ʹõǰֱתļһС
+ gg ʹõǰֱתļһС
+
+ 3. ͣкţȻд GͿԷصһΰ
+ CTRL-G ʱڵˡ
+
+ 4. ûĻִв13IJϰ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ľڶڣ
+
+
+ ** / һַڵǰļвҸַ**
+
+ 1. ģʽ / ַʱע⵽ַ͹궼Ļ
+ : һġ
+
+ 2. errroor <س>ǸerrroorҪҵַ
+
+ 3. ҪͬһεַֻҪ n Ҫ෴ͬһε
+ д N ɡ
+
+ 4. ַʹ ? / С
+
+ 5. Ҫص֮ǰλð CTRL-O (ס Ctrl ͬʱĸ o)ظ
+ ˸ಽCTRL-I תµλá
+
+---> "errroor" is not the way to spell error; errroor is an error.
+ʾѾļĩβһԶļͷң
+ 'wrapscan' ѡλ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĽڣŵIJ
+
+
+ ** % ԲԵ )]}**
+
+ 1. ѹڱ --> һеκһ ([ {
+
+ 2. Ű % ַ
+
+ 3. ʱλӦԵŴ
+
+ 4. ٴΰ % ͿԵĵһŴ
+
+ 5. ƶ굽һ ()[]{ } % 鿴Ϊ
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+
+ʾڳʱҲԵǺõġ
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĽĽڣ滻
+
+
+ ** :s/old/new/g 滻 old Ϊ new**
+
+ 1. 뽫ƶ ---> һС
+
+ 2. :s/thee/the <س> עֻıеĵһƥ
+
+
+ 3. :s/thee/the/g 滻ȫеƥ䴮е "thee" ᱻ
+ ı䡣
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. Ҫ滻ֵ֮ÿƥ䴮
+ :#,#s/old/new/g #,# 滻
+ βекš
+ :%s/old/new/g 滻ļеÿƥ䴮
+ :%s/old/new/gc ҵļеÿƥ䴮Ҷÿƥ䴮
+ ʾǷ滻
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ĽС
+
+
+ 1. CTRL-G ʾǰλúļ״̬Ϣ
+ G ڽתļһС
+ һкȻд G ǽƶкŴС
+ gg ڽתļһС
+
+ 2. / Ȼһַڵǰ༭ĵҸַ
+ ? Ȼһַڵǰ༭ĵзҸַ
+ һβ֮ n ظһεͬһϲ
+ һƥַڣ߰д N ෴һƥַڡ
+ CTRL-O תؽϾɵλãCTRL-I µλá
+
+ 3. 굱ǰλ()[]{} % ὫƶԵϡ
+
+ 4. һ滻ͷһַ old Ϊµַ new :s/old/new
+ һ滻еַ old Ϊµַ new :s/old/new/g
+ 滻еַ old Ϊµַ new :#,#s/old/new/g
+ ļ滻еַ old Ϊµַ new :%s/old/new/g
+ ȫ滻ʱѯûȷÿ滻 c ־ :%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 彲һڣ VIM ִⲿķ
+
+
+ ** :! Ȼһⲿִиⲿ**
+
+ 1. Ϥ : ʹƶĻײͿһˡ
+
+ 2. ̾ ! ִַⲿ shell ˡ
+
+ 3. ls Ϊ !ls <س> ͻоٳǰĿ¼
+ ݣͬʾ ls Ľһ !ls û
+ ã :!dir
+
+ʾеⲿַʽִУвЩ
+
+ʾе :  <س> ӽԺǾͲᵽһ
+ ˡ
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 彲ڶڣڱļĸϢ
+
+
+ ** ҪļĸĶ浽ļУ :w FILENAME **
+
+ 1. :!dir :!ls ֪ǰĿ¼ݡӦ֪󻹵
+ <س> ɡ
+
+ 2. ѡһδõļ TEST
+
+ 3. :w TEST (˴ TEST ѡļ)
+
+ 4. TEST Ϊļļ (Vim ̳)Ϊ֤һ㣬
+ ٴ :!dir :!ls 鿴Ŀ¼бݡ
+
+ע⣺˳ Vim Ȼ vim TEST ٴ Vimôļ
+ Ӧͬʱļȫһġ
+
+ 5. ɾ TEST ļˡ MS-DOS £룺 :!del TEST
+ Unix £룺 :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 彲ڣһѡԵı
+
+
+ ** ҪļIJݣ v motion :w FILENAME **
+
+ 1. ƶ굽С
+
+ 2. Ű v ƶĿϡע⵽֮ıˡ
+
+ 3. Ȼ : ַĻײ :'<,'>
+
+ 4. w TEST TEST һδʹõļȷ
+ :'<,'>w TEST ֮ <س>
+
+ 5. ʱ Vim ѡед뵽 TEST ļȥʹ :!dir :!ls
+ ȷļȷ档ȱɾһлõ
+
+ʾ v ʹ Vim ģʽѡȡĴƶʹѡȡ
+ Сʹһѡıв磬 d ɾ
+ ѡеıݡ
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 彲Ľڣȡͺϲļ
+
+
+ ** Ҫǰļвļݣ :r FILENAME **
+
+ 1. ѹƶһС
+
+رʾִв2֮彲ڵ֣ʱƶ
+ ٴοݡ
+
+ 2. ͨ :r TEST ǰ洴Ϊ TEST ļȡ
+ ȡļӹλôʼ롣
+
+ 3. ΪȷļѾȡɹƶصԭλþͿעݵ
+ 彲ڵݣһԭʼݣһļĸ
+
+ʾԶȡⲿ磬 :r !ls Զȡ ls
+ ڹ档
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 彲С
+
+
+ 1. :!command ִһⲿ command
+
+ 뿴һЩʵӣ
+ (MS-DOS) (Unix)
+ :!dir :!ls - ʾǰĿ¼ݡ
+ :!del FILENAME :!rm FILENAME - ɾΪ FILENAME ļ
+
+ 2. :w FILENAME ɽǰ VIM ڱ༭ļ浽Ϊ FILENAME
+ С
+
+ 3. v motion :w FILENAME ɽǰ༭ļпģʽѡеݱ浽ļ
+ FILENAME С
+
+ 4. :r FILENAME ȡļ FILENAME 뵽ǰļĹλ
+ 档
+
+ 5. :r !dir Զȡ dir õǰļĹλú档
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ һڣ
+
+
+ ** o ڹ·µһвģʽ**
+
+ 1. 뽫ƶ ---> һС
+
+ 2. Сд o ڹ *·* µһУʹ
+ ģʽ
+
+ 3. ȻһЩ֣֮ <ESC> ˳ģʽģʽ
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. Ϊڹ *Ϸ* µһУֻҪд O Сд o
+ Ϳˡвһ°ɡ
+
+---> Open up a line above this by typing O while the cursor is on this line.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڶڣ
+
+
+ ** a ڹ֮ı **
+
+ 1. ģʽ½ƶ ---> ĵһеס
+
+ 2. e ֱλ li ĩβ
+
+ 3. Сд a ڹ֮ıˡ
+
+ 4. ʲһе֮ <ESC> ˳ģʽص
+ ģʽ
+
+ 5. ʹ e ƶ굽һĵʣظ3Ͳ4
+
+---> This li will allow you to pract appendi text to a line.
+---> This line will allow you to practice appending text to a line.
+
+ʾai A ģʽΩһַλá
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڣһûİ汾
+
+
+ ** д R 滻ַ**
+
+ 1. 뽫ƶ ---> ĵһСƶ굽һ xxx
+ ʼλá
+
+ 2. Ȼд R ʼѵһеIJͬڵڶеʣַһ룬
+ ȫ滻ԭеַʹõһȫͬڶˡ
+
+ 3. Ű <ESC> ˳滻ģʽصģʽע⵽δ滻ı
+ Ȼԭ״
+
+ 4. ظϲ裬ʣ xxx Ҳ滻
+
+---> Adding 123 to xxx gives you xxx.
+---> Adding 123 to 456 gives you 579.
+
+ʾ滻ģʽģʽƣÿַɾһеַ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ Ľڣճı
+
+
+ ** ʹò y ıʹ p ճı **
+
+ 1. λ ---> һУƶ "a)" ֮
+
+ 2. ʹ v ģʽƶ굽 "first" ǰ档
+
+ 3. y Գ()ı
+
+ 4. Ȼƶ굽һеĩβj$
+
+ 5. p Է(ճ)˵ıȻ룺a second <ESC>
+
+ 6. ʹÿģʽѡ " item." y ƣ j$ ƶһĩβ
+ p ıճ
+
+---> a) this is the first item.
+ b)
+
+ ʾ԰ y ʹã yw һʡ
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ڣѡ
+
+
+ ** ÿʹһ滻ɺԴСдѡ **
+
+ 1. Ҫҵ ignore ģʽ /ignore <س>
+ ҪظҸôʣظ n
+
+ 2. Ȼ ic ѡ(Ignore CaseԴСд)룺 :set ic
+
+ 3. ڿͨ n ٴβҵ ignoreע⵽ Ignore IGNORE
+ Ҳҵˡ
+
+ 4. Ȼ hlsearch incsearch ѡ룺 :set hls is
+
+ 5. ڿٴʲôЧ /ignore <س>
+
+ 6. ҪúԴСд룺 :set noic
+
+ʾҪƳƥĸʾ룺 :nohlsearch
+ʾҪһβʱĸСдʹ \c
+ /ignore\c <س>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ С
+
+ 1. Сд o ڹ·µһвģʽ
+ д O ڹϷµһС
+
+ 2. Сд a ڹλ֮ı
+ д A ڹеĩ֮ı
+
+ 3. e ʹƶĩβ
+
+ 4. y ıp ճǰƵı
+
+ 5. д R 滻ģʽֱ <ESC> صģʽ
+
+ 6. :set xxx xxx ѡһЩõѡ£
+ 'ic' 'ignorecase' ʱĸСд
+ 'is' 'incsearch' Ҷʱʾƥ
+ 'hls' 'hlsearch' ʾеƥ
+ ѡ汾Ҳ԰汾
+
+ 7. ѡǰ no Թرѡ :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ߽һڣȡϢ
+
+
+ ** ʹ߰ϵͳ **
+
+ Vim ӵһϸȫ߰ϵͳҪðϵͳѡַ
+ ֮һ
+ - <HELP> (еĻ)
+ - <F1> (еĻ)
+ - :help <س>
+
+ Ķе˽ιġ
+ CTRL-W CTRL-W ʹڴ֮ת
+ :q <س> Թرհڡ
+
+ ṩһȷIJ":help"ҵڸİ
+ ²(ɱ˰سŶ)
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ߽ڶڣű
+
+
+ ** Vim **
+
+ Vim ĹҪ Vi ö࣬д󲿷ֶûȱʡáΪʹø
+ ԣôһ vimrc ļ
+
+ 1. ʼ༭ vimrc ļȡʹõIJϵͳ
+ :edit ~/.vimrc Unix ϵͳʹõ
+ :edit ~/_vimrc MS-Windows ϵͳʹõ
+
+ 2. Ŷȡ vimrc ʾļݣ
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. ļΪ
+ :write
+
+ ´ Vim ʱ༭ͻ﷨Ĺܡ
+ ԰ϲĸӵ vimrc ļС
+ Ҫ˽Ϣ :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ߽ڣȫ
+
+
+ ** ʹ CTRL-D <TAB> Խвȫ **
+
+ 1. ȷ Vim ԼģʽУ :set nocp
+
+ 2. 鿴һµǰĿ¼ѾЩļ룺 :!ls :!dir
+
+ 3. һĿ¼ʼ֣룺 :e
+
+ 4. Ű CTRL-D Vim ʾ e ʼб
+
+ 5. Ȼ <TAB> Vim ᲹȫΪ :edit
+
+ 6. һոԼһļļʼ֣磺 :edit FIL
+
+ 7. Ű <TAB> Vim Ჹȫļ(Ωһƥ)
+
+ʾȫЧֻ賢԰ CTRL-D <TAB>
+ :help dzá
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ ߽С
+
+
+ 1. :help ߰ <F1> <Help> Դ򿪰ڡ
+
+ 2. :help cmd ҵ cmd İ
+
+ 3. CTRL-W CTRL-W ʹڴ֮ת
+
+ 4. :q Թرհ
+
+ 5. Դһ vimrc űļƫõá
+
+ 6. : ʱ CTRL-D Բ鿴ܵIJȫ
+ <TAB> ʹһȫ
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ vim ̵̳˾ͽˡֻ̳Ϊ˼ؽһ Vim ༭
+ ʹ༭ˡӹɣvimкܶܶ̳
+ ܵľIJúԶҪͨĻŬŶһĶ
+ Vim ûֲᣬʹõǣ :help user-manual
+
+ ⱾֵƼڸһĶѧϰ
+ Vim - Vi Improved - ߣSteve Oualline
+ 磺New Riders
+ ǵһȫ Vim 鼮ڳѧرáадʵ
+ ͼʾ
+ ֪飬 https://iccf-holland.org/click5.html
+
+ ⱾȽ˶ݸǹ Vi VimҲֵƼ
+ Learning the Vi Editor - ߣLinda Lamb
+ 磺O'Reilly & Associates Inc.
+ һ飬ܹͨ˽⵽κҪʹ Vi 顣
+ ĵ汾ҲһЩ Vim Ϣ
+
+ ̳ Calorado School of Mines Michael C. Pierce
+ Robert K. Ware дģкܶഴ Colorado State University
+ Charles Smith ṩߵĵǣbware@mines.colorado.edu
+
+ ̳ Bram Moolenaar רΪ Vim ޶
+
+ ߸ԣ
+ ===========
+ Ľ̷̳֮Ϊ̩ <beos@turbolinux.com.cn>
+ һϵַlinuxrat@gnuchina.org
+
+ Ľ̳ǴӼĽ̷̳ʹ Debian GNU/Linux ĿС
+ ڹдĺת autoconvert תɵģת
+ ĽһЩϸڵĸĶ
+
+ ¼
+ =========
+ 20121001 <alick9188@gmail.com>
+ vimtutor 1.5 1.7
+
+ 20020830 ̩ <beos@turbolinux.com.cn>
+ л RMS@SMTH ָദ
+
+ 20020422 ̩ <linuxrat@gnuchina.org>
+ л xuandong@sh163.net ָ
+
+ 20020318 ̩ <linuxrat@gnuchina.org>
+ Bram Moolenaar20020316յҪ󣬽vimtutor1.4
+ vimtutor1.5
+
+ 20011115 ̩ <linuxrat@gnuchina.org>
+ vimtutor1.4ύBram MoolenaarSven Guckes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.zh.utf-8 b/runtime/tutor/tutor.zh.utf-8
new file mode 100644
index 0000000..fc35259
--- /dev/null
+++ b/runtime/tutor/tutor.zh.utf-8
@@ -0,0 +1,852 @@
+===============================================================================
+= 歡 迎 閱 讀 《 V I M 教 程 》 ── 版本 1.5 =
+===============================================================================
+ vim 是一個具有很多命令的功能非常強大的編輯器。限于篇幅,在本教程當中
+ 不就詳細介紹了。本教程的設計目標是講述一些必要的基本命令,而掌握好這
+ 些命令,您就能夠很容易將vim當作一個通用的萬能編輯器來使用了。
+
+ 完成本教程的內容大約需要25-30分鐘,取決于您訓練的時間。
+
+ 每一節的命令操作將會更改本文。推薦您復制本文的一個副本,然後在副本上
+ 進行訓練(如果您是通過"vimtutor"來啟動教程的,那麼本文就已經是副本了)。
+
+ 切記一點︰本教程的設計思路是在使用中進行學習的。也就是說,您需要通過
+ 執行命令來學習它們本身的正確用法。如果您只是閱讀而不操作,那麼您可能
+ 會很快遺忘這些命令的!
+
+ 好了,現在請確定您的Shift-Lock(大小寫鎖定鍵)還沒有按下,然後按鍵盤上
+ 的字母鍵 j 足夠多的次數來移動光標,直到第一節的內容能夠完全充滿屏幕。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講第一節︰移動光標
+
+
+ ※※ 要移動光標,請依照說明分別按下 h、j、k、l 鍵。 ※※
+
+ ^
+ k 提示︰ h 的鍵位于左邊,每次按下就會向左移動。
+ < h l > l 的鍵位于右邊,每次按下就會向右移動。
+ j j 鍵看起來很象一支尖端方向朝下的箭頭。
+ v
+
+ 1. 請隨意在屏幕內移動光標,直至您覺得舒服為止。
+
+ 2. 按下下行鍵(j),直到出現光標重復下行。
+
+---> 現在您應該已經學會如何移動到下一講吧。
+
+ 3. 現在請使用下行鍵,將光標移動到第一講第二節。
+
+提示︰如果您不敢確定您所按下的字母,請按下<ESC>鍵回到正常(Normal)模式。
+ 然後再次從鍵盤輸入您想要的命令。
+
+提示︰光標鍵應當也能正常工作的。但是使用hjkl鍵,在習慣之後您就能夠快速
+ 地在屏幕內四處移動光標了。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講第二節︰VIM的進入和退出
+
+
+ !! 特別提示︰敬請閱讀完整本一節的內容,然後才能執行以下所講解的命令。
+
+ 1. 請按<ESC>鍵(這是為了確保您處在正常模式)。
+
+ 2. 然後輸入︰ :q! <回車>
+
+---> 這種方式的退出編輯器絕不會保存您進入編輯器以來所做的改動。
+ 如果您想保存更改再退出,請輸入︰
+ :wq <回車>
+
+ 3. 如果您看到了命令行提示符,請輸入能夠帶您回到本教程的命令,那就是︰
+
+ vimtutor <回車>
+
+ 通常情況下您也可以用這種方式︰
+
+ vim tutor <回車>
+
+---> 這裡的 'vim' 表示進入vim編輯器,而 'tutor'則是您準備要編輯的文件。
+
+ 4. 如果您自信已經牢牢記住了這些步驟的話,請從步驟1執行到步驟3退出,然
+ 後再次進入編輯器。接著將光標移動到第一講第三節來繼續我們的教程講解。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講第三節︰文本編輯之刪除
+
+
+ ** 在正常(Normal)模式下,可以按下 x 鍵來刪除光標所在位置的字符。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 2. 為了修正輸入錯誤,請將光標移至準備刪除的字符的位置處。
+
+ 3. 然後按下 x 鍵將錯誤字符刪除掉。
+
+ 4. 重復步驟2到步驟4,直到句子修正為止。
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. 好了,該行已經修正了,下一節內容是第一講第四節。
+
+特別提示︰在您瀏覽本教程時,不要強行記憶。記住一點︰在使用中學習。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講第四節︰文本編輯之插入
+
+
+ ** 在正常模式下,可以按下 i 鍵來插入文本。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 2. 為了使得第一行內容雷同于第二行,請將光標移至文本第一個字符準備插入
+ 的位置。
+
+ 3. 然後按下 i 鍵,接著輸入必要的文本字符。
+
+ 4. 所有文本都修正完畢,請按下 <ESC> 鍵返回正常模式。
+ 重復步驟2至步驟4以便修正句子。
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5. 如果您對文本插入操作已經很滿意,請接著閱讀下面的小結。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講小結
+
+
+ 1. 光標在屏幕文本中的移動既可以用箭頭鍵,也可以使用 hjkl 字母鍵。
+ h (左移) j (下行) k (上行) l (右移)
+
+ 2. 欲進入vim編輯器(從命令行提示符),請輸入︰vim 文件名 <回車>
+
+ 3. 欲退出vim編輯器,請輸入以下命令放棄所有修改︰
+
+ <ESC> :q! <回車>
+
+ 或者輸入以下命令保存所有修改︰
+
+ <ESC> :wq <回車>
+
+ 4. 在正常模式下刪除光標所在位置的字符,請按︰ x
+
+ 5. 在正常模式下要在光標所在位置開始插入文本,請按︰
+
+ i 輸入必要文本 <ESC>
+
+特別提示︰按下 <ESC> 鍵會帶您回到正常模式或者取消一個不期望或者部分完成
+的命令。
+
+好了,第一講到此結束。下面接下來繼續第二講的內容。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第一節︰刪除類命令
+
+
+ ** 輸入 dw 可以從光標處刪除至一個單字/單詞的末尾。**
+
+ 1. 請按下 <ESC> 鍵確保您處于正常模式。
+
+ 2. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 3. 請將光標移至準備要刪除的單詞的開始。
+
+ 4. 接著輸入 dw 刪除掉該單詞。
+
+ 特別提示︰您所輸入的 dw 會在您輸入的同時出現在屏幕的最後一行。如果您輸
+ 入有誤,請按下 <ESC> 鍵取消,然後重新再來。
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. 重復步驟3至步驟4,直至句子修正完畢。接著繼續第二講第二節內容。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第二節︰其他刪除類命令
+
+
+ ** 輸入 d$ 從當前光標刪除到行末。**
+
+ 1. 請按下 <ESC> 鍵確保您處于正常模式。
+
+ 2. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 3. 請將光標移動到該行的尾部(也就是在第一個點號‘.’後面)。
+
+ 4. 然後輸入 d$ 從光標處刪至當前行尾部。
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+
+ 5. 請繼續學習第二講第三節就知道是怎麼回事了。
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第三節︰關于命令和對象
+
+
+ 刪除命令 d 的格式如下︰
+
+ [number] d object 或者 d [number] object
+
+ 其意如下︰
+ number - 代表執行命令的次數(可選項,缺省設置為 1 )。
+ d - 代表刪除。
+ object - 代表命令所要操作的對象(下面有相關介紹)。
+
+ 一個簡短的對象列表︰
+ w - 從當前光標當前位置直到單字/單詞末尾,包括空格。
+ e - 從當前光標當前位置直到單字/單詞末尾,但是 *不* 包括空格。
+ $ - 從當前光標當前位置直到當前行末。
+
+特別提示︰
+ 對于勇于探索者,請在正常模式下面僅按代表相應對象的鍵而不使用命令,則
+ 將看到光標的移動正如上面的對象列表所代表的一樣。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第四節︰對象命令的特殊情況
+
+
+ ** 輸入 dd 可以刪除整一個當前行。 **
+
+ 鑒于整行刪除的高頻度,VIM 的設計者決定要簡化整行刪除,僅需要在同一行上
+ 擊打兩次 d 就可以刪除掉光標所在的整行了。
+
+ 1. 請將光標移動到本節中下面的短句段落中的第二行。
+ 2. 輸入 dd 刪除該行。
+ 3. 然後移動到第四行。
+ 4. 接著輸入 2dd (還記得前面講過的 number-command-object 嗎?) 刪除兩行。
+
+ 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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第五節︰撤消類命令
+
+
+ ** 輸入 u 來撤消最後執行的命令,輸入 U 來修正整行。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的那一行,並將其置于第一個錯誤
+ 處。
+ 2. 輸入 x 刪除第一個不想保留的字母。
+ 3. 然後輸入 u 撤消最後執行的(一次)命令。
+ 4. 這次要使用 x 修正本行的所有錯誤。
+ 5. 現在輸入一個大寫的 U ,恢復到該行的原始狀態。
+ 6. 接著多次輸入 u 以撤消 U 以及更前的命令。
+ 7. 然後多次輸入 CTRL-R (先按下 CTRL 鍵不放開,接著輸入 R 鍵) ,這樣就
+ 可以執行恢復命令,也就是撤消掉撤消命令。
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. 這些都是非常有用的命令。下面是第二講的小結了。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講小結
+
+
+ 1. 欲從當前光標刪除至單字/單詞末尾,請輸入︰dw
+
+ 2. 欲從當前光標刪除至當前行末尾,請輸入︰d$
+
+ 3. 欲刪除整行,請輸入︰dd
+
+ 4. 在正常模式下一個命令的格式是︰
+
+ [number] command object 或者 command [number] object
+ 其意是︰
+ number - 代表的是命令執行的次數
+ command - 代表要做的事情,比如 d 代表刪除
+ object - 代表要操作的對象,比如 w 代表單字/單詞,$ 代表到行末等等。
+ $ (to the end of line), etc.
+
+ 5. 欲撤消以前的操作,請輸入︰u (小寫的u)
+ 欲撤消在一行中所做的改動,請輸入︰U (大寫的U)
+ 欲撤消以前的撤消命令,恢復以前的操作結果,請輸入︰CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講第一節︰置入類命令
+
+
+ ** 輸入 p 將最後一次刪除的內容置入光標之後 **
+
+ 1. 請將光標移動到本節中下面示范段落的首行。
+
+ 2. 輸入 dd 將該行刪除,這樣會將該行保存到vim的緩沖區中。
+
+ 3. 接著將光標移動到準備置入的位置的上方。記住︰是上方哦。
+
+ 4. 然後在正常模式下(<ESC>鍵進入),輸入 p 將該行粘貼置入。
+
+ 5. 重復步驟2至步驟4,將所有的行依序放置到正確的位置上。
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講第二節︰替換類命令
+
+
+ ** 輸入 r 和一個字符替換光標所在位置的字符。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 2. 請移動光標到第一個錯誤的適當位置。
+
+ 3. 接著輸入 r ,這樣就能將錯誤替換掉了。
+
+ 4. 重復步驟2和步驟3,直到第一行已經修改完畢。
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. 然後我們繼續學校第三講第三節。
+
+特別提示︰切記您要在使用中學習,而不是在記憶中學習。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講第三節︰更改類命令
+
+
+ ** 要改變一個單字/單詞的部分或者全部,請輸入 cw **
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 2. 接著把光標放在單詞 lubw 的字母 u 的位置那裡。
+
+ 3. 然後輸入 cw 就可以修正該單詞了(在本例這裡是輸入 ine 。)
+
+ 4. 最後按 <ESC> 鍵,然後光標定位到下一個錯誤第一個準備更改的字母處。
+
+ 5. 重復步驟3和步驟4,直到第一個句子完全雷同第二個句子。
+
+---> This lubw has a few wptfd that mrrf changing usf the change command.
+---> This line has a few words that need changing using the change command.
+
+提示︰請注意 cw 命令不僅僅是替換了一個單詞,也讓您進入文本插入狀態了。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講第四節︰使用c指令的其他更改類命令
+
+
+ ** 更改類指令可以使用同刪除類命令所使用的對象參數。**
+
+ 1. 更改類指令的工作方式跟刪除類命令是一致的。操作格式是︰
+
+ [number] c object 或者 c [number] object
+
+ 2. 對象參數也是一樣的,比如 w 代表單字/單詞,$代表行末等等。
+
+ 3. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 4. 接著將光標移動到第一個錯誤處。
+
+ 5. 然後輸入 c$ 使得該行剩下的部分更正得同第二行一樣。最後按 <ESC> 鍵。
+
+---> 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$ command.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講小結
+
+
+ 1. 要重新置入已經刪除的文本內容,請輸入小寫字母 p。該操作可以將已刪除
+ 的文本內容置于光標之後。如果最後一次刪除的是一個整行,那麼該行將置
+ 于當前光標所在行的下一行。
+
+ 2. 要替換光標所在位置的字符,請輸入小寫的 r 和要替換掉原位置字符的新字
+ 符即可。
+
+ 3. 更改類命令允許您改變指定的對象,從當前光標所在位置直到對象的末尾。
+ 比如輸入 cw 可以替換當前光標到單詞的末尾的內容;輸入 c$ 可以替換當
+ 前光標到行末的內容。
+
+ 4. 更改類命令的格式是︰
+
+ [number] c object 或者 c [number] object
+
+下面我們繼續學習下一講。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講第一節︰定位及文件狀態
+
+
+ ** 輸入 CTRL-g 顯示當前編輯文件中當前光標所在行位置以及文件狀態信息。
+ 輸入 SHIFT-G 則直接跳轉到文件中的某一指定行。**
+
+ 提示︰切記要先通讀本節內容,之後才可以執行以下步驟!!!
+
+ 1. 按下 CTRL 鍵不放開然後按 g 鍵。然後就會看到頁面最底部出現一個狀態信
+ 息行,顯示的內容是當前編輯的文件名和文件的總行數。請記住步驟3的行號。
+
+ 2. 按下 SHIFT-G 鍵可以使得當前光標直接跳轉到文件最後一行。
+
+ 3. 輸入您曾停留的行號,然後按下 SHIFT-G。這樣就可以返回到您第一次按下
+ CTRL-g 時所在的行好了。注意︰輸入行號時,行號是不會在屏幕上顯示出來
+ 的。
+
+ 4. 如果願意,您可以繼續執行步驟1至步驟三。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講第二節︰搜索類命令
+
+
+ ** 輸入 / 以及尾隨的字符串可以用以在當前文件中查找該字符串。**
+
+ 1. 在正常模式下輸入 / 字符。您此時會注意到該字符和光標都會出現在屏幕底
+ 部,這跟 : 命令是一樣的。
+
+ 2. 接著輸入 errroor <回車>。那個errroor就是您要查找的字符串。
+
+ 3. 要查找同上一次的字符串,只需要按 n 鍵。要向相反方向查找同上一次的字
+ 符串,請輸入 Shift-N 即可。
+
+ 4. 如果您想逆向查找字符串,請使用 ? 代替 / 進行。
+
+---> When the search reaches the end of the file it will continue at the start.
+
+ "errroor" is not the way to spell error; errroor is an error.
+
+ 提示︰如果查找已經到達文件末尾,查找會自動從文件頭部繼續查找。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講第三節︰配對括號的查找
+
+
+ ** 按 % 可以查找配對的括號 )、]、}。**
+
+ 1. 把光標放在本節下面標記有 --> 那一行中的任何一個 (、[ 或 { 處。
+
+ 2. 接著按 % 字符。
+
+ 3. 此時光標的位置應當是在配對的括號處。
+
+ 4. 再次按 % 就可以跳回配對的第一個括號處。
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+提示︰在程序調試時,這個功能用來查找不配對的括號是很有用的。
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講第四節︰修正錯誤的方法之一
+
+
+ ** 輸入 :s/old/new/g 可以替換 old 為 new。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 2. 輸入 :s/thee/the <回車> 。請注意該命令只改變光標所在行的第一個匹配
+ 串。
+
+ 3. 輸入 :s/thee/the/g 則是替換全行的匹配串。
+
+---> the best time to see thee flowers is in thee spring.
+
+ 4. 要替換兩行之間出現的每個匹配串,請輸入 :#,#s/old/new/g (#,#代表的是
+ 兩行的行號)。輸入 :%s/old/new/g 則是替換整個文件中的每個匹配串。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講小結
+
+
+ 1. Ctrl-g 用于顯示當前光標所在位置和文件狀態信息。Shift-G 用于將光標跳
+ 轉至文件最後一行。先敲入一個行號然後按 Shift-G 則是將光標移動至該行
+ 號代表的行。
+
+ 2. 輸入 / 然後緊隨一個字符串是則是在當前所編輯的文檔中向後查找該字符串。
+ 輸入問號 ? 然後緊隨一個字符串是則是在當前所編輯的文檔中向前查找該字
+ 符串。完成一次查找之後按 n 鍵則是重復上一次的命令,可在同一方向上查
+ 找下一個字符串所在;或者按 Shift-N 向相反方向查找下該字符串所在。
+
+ 3. 如果光標當前位置是括號(、)、[、]、{、},按 % 可以將光標移動到配對的
+ 括號上。
+
+ 4. 在一行內替換頭一個字符串 old 為新的字符串 new,請輸入 :s/old/new
+ 在一行內替換所有的字符串 old 為新的字符串 new,請輸入 :s/old/new/g
+ 在兩行內替換所有的字符串 old 為新的字符串 new,請輸入 :#,#s/old/new/g
+ 在文件內替換所有的字符串 old 為新的字符串 new,請輸入 :%s/old/new/g
+ 進行全文替換時詢問用戶確認每個替換需添加 c 選項,請輸入 :%s/old/new/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講第一節︰在 VIM 內執行外部命令的方法
+
+
+ ** 輸入 :! 然後緊隨著輸入一個外部命令可以執行該外部命令。**
+
+ 1. 按下我們所熟悉的 : 命令設置光標到屏幕底部。這樣就可以讓您輸入命令了。
+
+ 2. 接著輸入感嘆號 ! 這個字符,這樣就允許您執行外部的 shell 命令了。
+
+ 3. 我們以 ls 命令為例。輸入 !ls <回車> 。該命令就會列舉出您當前目錄的
+ 內容,就如同您在命令行提示符下輸入 ls 命令的結果一樣。如果 !ls 沒起
+ 作用,您可以試試 :!dir 看看。
+
+---> 提示︰ 所有的外部命令都可以以這種方式執行。
+
+---> 提示︰ 所有的 : 命令都必須以 <回車> 告終。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講第二節︰關于保存文件的更多信息
+
+
+ ** 要將對文件的改動保存到文件中,請輸入 :w FILENAME **
+
+ 1. 輸入 :!dir 或者 :!ls 獲知當前目錄的內容。您應當已知道最後還得敲
+ <回車> 吧。
+
+ 2. 選擇一個尚未存在文件名,比如 TEST 。
+
+ 3. 接著輸入 :w TEST (此處 TEST 是您所選擇的文件名。)
+
+ 4. 該命令會以 TEST 為文件名保存整個文件 (VIM 教程)。為了確保正確保存,
+ 請再次輸入 :!dir 查看您的目錄列表內容。
+
+---> 請注意︰如果您退出 VIM 然後在以文件名 TEST 為參數進入,那麼該文件內
+ 容應該同您保存時的文件內容是完全一樣的。
+
+ 5. 現在您可以通過輸入 :!rm TEST 來刪除 TEST 文件了。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講第三節︰一個具有選擇性的保存命令
+
+
+ ** 要保存文件的部分內容,請輸入 :#,# w FILENAME **
+
+ 1. 再來執行一次 :!dir 或者 :!ls 獲知當前目錄的內容,然後選擇一個合適的
+ 不重名的文件名,比如 TEST 。
+
+ 2. 接著將光標移動至本頁的最頂端,然後按 CTRL-g 找到該行的行號。別忘了
+ 行號哦。
+
+ 3. 接著把光標移動至本頁的最底端,再按一次 CTRL-g 。也別忘了這個行號哦。
+
+ 4. 為了只保存文章的某個部分,請輸入 :#,# w TEST 。這裡的 #,# 就是上面
+ 要求您記住的行號(頂端行號,底端行號),而 TEST 就是選定的文件名。
+
+ 5. 最後,用 :!dir 確認文件是否正確保存。但是這次先別刪除掉。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講第四節︰提取和合並文件
+
+
+ ** 要向當前文件中插入另外的文件的內容,請輸入 :r FILENAME **
+
+ 1. 請鍵入 :!dir 確認您前面創建的 TEST 文件還在。
+
+ 2. 然後將光標移動至當前頁面的頂端。
+
+特別提示︰ 執行步驟3之後您將看到第五講第三節,請屆時再往下移動回到這裡來。
+
+ 3. 接著通過 :r TEST 將前面創建的名為 TEST 的文件提取進來。
+
+特別提示︰您所提取進來的文件將從光標所在位置處開始置入。
+
+ 4. 為了確認文件已經提取成功,移動光標回到原來的位置就可以注意有兩份第
+ 五講第三節,一份是原本,另外一份是來自文件的副本。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講小結
+
+
+ 1. :!command 用于執行一個外部命令 command。
+
+ 請看一些實際例子︰
+ :!dir - 用于顯示當前目錄的內容。
+ :!rm FILENAME - 用于刪除名為 FILENAME 的文件。
+
+ 2. :w FILENAME 可將當前 VIM 中正在編輯的文件保存到名為 FILENAME
+ 的文件中。
+
+ 3. :#,#w FILENAME 可將當前編輯文件第 # 行至第 # 行的內容保存到文件
+ FILENAME 中。
+
+ 4. :r FILENAME 可提取磁盤文件 FILENAME 並將其插入到當前文件的光標位置
+ 後面。
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講第一節︰打開類命令
+
+
+ ** 輸入 o 將在光標的下方打開新的一行並進入插入模式。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 2. 接著輸入小寫的 o 在光標 *下方* 打開新的一行並進入插入模式。
+
+ 3. 然後復制標記有 ---> 的行並按 <ESC> 鍵退出插入模式而進入正常模式。
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. 為了在光標 *上方* 打開新的一行,只需要輸入大寫的 O 而不是小寫的 o
+ 就可以了。請在下行測試一下吧。當光標處在在該行上時,按 Shift-O可以
+ 在該行上方新開一行。
+
+Open up a line above this by typing Shift-O while the cursor is on this line.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講第二節︰光標後插入類命令
+
+
+ ** 輸入 a 將可在光標之後插入文本。 **
+
+ 1. 請在正常模式下通過輸入 $ 將光標移動到本節中下面標記有 ---> 的第一行
+ 的末尾。
+
+ 2. 接著輸入小寫的 a 則可在光標之後插入文本了。大寫的 A 則可以直接在行
+ 末插入文本。
+
+提示︰輸入大寫 A 的操作方法可以在行末插入文本,避免了輸入 i,光標定位到
+ 最後一個字符,輸入的文本,<ESC> 回復正常模式,箭頭右鍵移動光標以及
+ x 刪除當前光標所在位置字符等等諸多繁雜的操作。
+
+ 3. 操作之後第一行就可以補充完整了。請注意光標後插入文本與插入模式是基
+ 本完全一致的,只是文本插入的位置定位稍有不同罷了。
+
+---> This line will allow you to practice
+---> This line will allow you to practice appending text to the end of a line.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講第三節︰另外一個置換類命令的版本
+
+
+ ** 輸入大寫的 R 可連續替換多個字符。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 2. 移動光標到第一行中不同于標有 ---> 的第二行的第一個單詞的開始,即單
+ 詞 last 處。
+
+ 3. 然後輸入大寫的 R 開始把第一行中的不同于第二行的剩余字符逐一輸入,就
+ 可以全部替換掉原有的字符而使得第一行完全雷同第二行了。
+
+---> To make the first line the same as the last on this page use the keys.
+---> To make the first line the same as the second, type R and the new text.
+
+ 4. 請注意︰如果您按 <ESC> 退出置換模式回復正常模式,尚未替換的文本將仍
+ 然保持原狀。
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講第四節︰設置類命令的選項
+
+
+ ** 設置可使查找或者替換可忽略大小寫的選項 **
+
+
+ 1. 要查找單詞 ignore 可在正常模式下輸入 /ignore 。要重復查找該詞,可以
+ 重復按 n 鍵。
+
+ 2. 然後設置 ic 選項(ic就是英文忽略大小寫Ignore Case的首字母縮寫詞),即
+ 輸入︰
+ :set ic
+
+ 3. 現在可以通過鍵入 n 鍵再次查找單詞 ignore。重復查找可以重復鍵入 n 鍵。
+
+ 4. 然後設置 hlsearch 和 incsearch 這兩個選項,輸入以下內容︰
+ :set hls is
+
+ 5. 現在可以再次輸入查找命令,看看會有什麼效果︰
+ /ignore
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講小結
+
+
+ 1. 輸入小寫的 o 可以在光標下方打開新的一行並將光標置于新開的行首,進入
+ 插入模式。
+ 輸入大寫的 O 可以在光標上方打開新的一行並將光標置于新開的行首,進入
+ 插入模式。
+
+ 2. 輸入小寫的 a 可以在光標所在位置之後插入文本。
+ 輸入大寫的 A 可以在光標所在行的行末之後插入文本。
+
+ 3. 輸入大寫的 R 將進入替換模式,直至按 <ESC> 鍵退出替換模式而進入正常
+ 模式。
+
+ 4. 輸入 :set xxx 可以設置 xxx 選項。
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第七講︰在線幫助命令
+
+ ** 使用在線幫助系統 **
+
+ Vim 擁有一個細致全面的在線幫助系統。要啟動該幫助系統,請選擇如下三種方
+ 法之一︰
+ - 按下 <HELP> 鍵 (如果鍵盤上有的話)
+ - 按下 <F1> 鍵 (如果鍵盤上有的話)
+ - 輸入 :help <回車>
+
+ 輸入 :q <回車> 可以關閉幫助窗口。
+
+ 提供一個正確的參數給":help"命令,您可以找到關于該主題的幫助。請試驗以
+ 下參數(可別忘了按回車鍵哦。:)︰
+
+ :help w <回車>
+ :help c_<T <回車>
+ :help insert-index <回車>
+ :help user-manual <回車>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第八講︰創建一個啟動腳本
+
+ ** 啟用vim的功能 **
+
+ Vim的功能特性要比vi多得多,但大部分功能都沒有缺省激活。為了啟動更多的
+ 功能,您得創建一個vimrc文件。
+
+ 1. 開始編輯vimrc文件,這取決于您所使用的操作系統︰
+
+ :edit ~/.vimrc 這是Unix系統所使用的命令
+ :edit ~/_vimrc 這是Windows系統所使用的命令
+
+ 2. 接著導入vimrc范例文件︰
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. 保存文件,命令為︰
+
+ :write
+
+ 在下次您啟動vim的時候,編輯器就會有了語法高亮的功能。您可以繼續把您喜
+ 歡的其它功能設置添加到這個vimrc文件中。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ vim 教程到此結束。本教程只是為了簡明地介紹一下vim編輯器,但已足以讓您
+ 很容易學會使用本編輯器了。毋庸質疑,vim還有很多很多的命令,本教程所介
+ 紹的還差得遠著呢。所以您要精通的話,還望繼續努力哦。下一步您可以閱讀
+ vim手冊,使用的命令是︰
+ :help user-manual
+
+ 為了更進一步的參考和學習,以下這本書值得推薦︰
+
+ Vim - Vi Improved - 作者︰Steve Oualline
+ 出版社︰New Riders
+
+ 這是第一本完全講解vim的書籍。對于初學者特別有用。其中還包含有大量實例
+ 和圖示。欲知詳情,請訪問 https://iccf-holland.org/click5.html
+
+ 以下這本書比較老了而且內容主要是vi而不是vim,但是也值得推薦︰
+
+ Learning the Vi Editor - 作者︰Linda Lamb
+ 出版社︰O'Reilly & Associates Inc.
+
+ 這是一本不錯的書,通過它您幾乎能夠了解到全部vi能夠做到的事情。此書的第
+ 六個版本也包含了一些關于vim的信息。
+
+ 本教程是由來自Calorado School of Minese的Michael C. Pierce、Robert K.
+ Ware 所編寫的,其中來自Colorado State University的Charles Smith提供了
+ 很多創意。編者通信地址是︰
+
+ bware@mines.colorado.edu
+
+ 本教程已由Bram Moolenaar專為vim進行修訂。
+
+
+
+ 譯制者附言︰
+ ===========
+ 簡體中文教程翻譯版之譯制者為梁昌泰 <beos@turbolinux.com.cn>,還有
+ 另外一個聯系地址︰linuxrat@gnuchina.org。
+
+ 繁體中文教程是從簡體中文教程翻譯版使用 Debian GNU/Linux 中文項目小
+ 組的于廣輝先生編寫的中文漢字轉碼器 autoconvert 轉換而成的,並對轉
+ 換的結果做了一些細節的改動。
+
+ 變更記錄︰
+ =========
+ 2002年08月30日 梁昌泰 <beos@turbolinux.com.cn>
+ 感謝 RMS@SMTH 的指正,將多處錯誤修正。
+
+ 2002年04月22日 梁昌泰 <linuxrat@gnuchina.org>
+ 感謝 xuandong@sh163.net 的指正,將兩處錯別字修正。
+
+ 2002年03月18日 梁昌泰 <linuxrat@gnuchina.org>
+ 根據Bram Moolenaar先生在2002年03月16日的來信要求,將vimtutor1.4中譯
+ 版升級到vimtutor1.5。
+
+ 2001年11月15日 梁昌泰 <linuxrat@gnuchina.org>
+ 將vimtutor1.4中譯版提交給Bram Moolenaar和Sven Guckes。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.zh_cn.utf-8 b/runtime/tutor/tutor.zh_cn.utf-8
new file mode 100644
index 0000000..cc8e575
--- /dev/null
+++ b/runtime/tutor/tutor.zh_cn.utf-8
@@ -0,0 +1,996 @@
+===============================================================================
+= 欢 迎 阅 读 《 V I M 教 程 》 —— 版本 1.7 =
+===============================================================================
+
+ Vim 是一个具有很多命令的功能非常强大的编辑器。限于篇幅,在本教程当中
+ 就不详细介绍了。本教程的设计目标是讲述一些必要的基本命令,而掌握好这
+ 些命令,您就能够很容易地将 Vim 当作一个通用编辑器来使用了。
+
+ 完成本教程的内容大约需要25-30分钟,取决于您训练的时间。
+
+ 注意:
+ 每一节的命令操作将会更改本文。推荐您复制本文的一个副本,然后在副本上
+ 进行训练(如果您是通过"vimtutor"来启动教程的,那么本文就已经是副本了)。
+
+ 切记一点:本教程的设计思路是在使用中进行学习的。也就是说,您需要通过
+ 执行命令来学习它们本身的正确用法。如果您只是阅读而不操作,那么您可能
+ 会很快遗忘这些命令的!
+
+ 好了,现在请确定您的Shift-Lock(大小写锁定键)还没有按下,然后按键盘上
+ 的字母键 j 足够多次来移动光标,直到第一节的内容能够完全充满屏幕。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一讲第一节:移动光标
+
+
+ ** 要移动光标,请依照说明分别按下 h、j、k、l 键。 **
+
+ ^
+ k 提示: h 的键位于左边,每次按下就会向左移动。
+ < h l > l 的键位于右边,每次按下就会向右移动。
+ j j 键看起来很象一支尖端方向朝下的箭头。
+ v
+
+ 1. 请随意在屏幕内移动光标,直至您觉得舒服为止。
+
+ 2. 按下下行键(j),直到出现光标重复下行。
+
+---> 现在您应该已经学会如何移动到下一讲吧。
+
+ 3. 现在请使用下行键,将光标移动到第一讲第二节。
+
+提示:如果您不敢确定您所按下的字母,请按下<ESC>键回到正常(Normal)模式。
+ 然后再次从键盘输入您想要的命令。
+
+提示:光标键应当也能正常工作的。但是使用hjkl键,在习惯之后您就能够更快
+ 地在屏幕内四处移动光标。真的是这样!
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一讲第二节:VIM的进入和退出
+
+
+ !! 特别提示:敬请阅读本一节的完整内容,然后再执行以下所讲解的命令。
+
+ 1. 按<ESC>键(这是为了确保您处在正常模式)。
+
+ 2. 然后输入: :q! <回车>
+ 这种方式的退出编辑器会丢弃您进入编辑器以来所做的改动。
+
+ 3. 如果您看到了命令行提示符,请输入能够带您回到本教程的命令,那就是:
+ vimtutor <回车>
+
+ 4. 如果您自信已经牢牢记住了这些步骤的话,请从步骤1执行到步骤3退出,然
+ 后再次进入编辑器。
+
+提示: :q! <回车> 会丢弃您所做的任何改动。几讲之后您将学会如何保存改动到文件。
+
+ 5. 将光标下移到第一讲第三节。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一讲第三节:文本编辑之删除
+
+
+ ** 在正常(Normal)模式下,可以按下 x 键来删除光标所在位置的字符。**
+
+ 1. 请将光标移动到本节中下面标记有 ---> 的那一行。
+
+ 2. 为了修正输入错误,请将光标移至准备删除的字符的位置处。
+
+ 3. 然后按下 x 键将错误字符删除掉。
+
+ 4. 重复步骤2到步骤4,直到句子修正为止。
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. 好了,该行已经修正了,下面是第一讲第四节。
+
+特别提示:在浏览本教程时,不要强行记忆。记住一点:在使用中学习。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一讲第四节:文本编辑之插入
+
+
+ ** 在正常模式下,可以按下 i 键来插入文本。**
+
+ 1. 请将光标移动到本节中下面标记有 ---> 的第一行。
+
+ 2. 为了使得第一行内容雷同于第二行,请将光标移至文本第一个准备插入字符
+ 的位置。
+
+ 3. 然后按下 i 键,接着输入必要的文本字符。
+
+ 4. 每个错误修正完毕后,请按下 <ESC> 键返回正常模式。
+ 重复步骤2至步骤4以便修正句子。
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5. 如果您对文本插入操作已经很满意,请接着阅读下面的第一讲第五节。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一讲第五节:文本编辑之添加
+
+
+ ** 按 A 键以添加文本。 **
+
+ 1. 移动光标到下面第一个标记有 ---> 的一行。
+ 光标放在那一行的哪个字符上并不重要。
+
+ 2. 按 A 键输入必要的添加内容。
+
+ 3. 文本添加完毕后,按 <ESC> 键回到正常模式。
+
+ 4. 移动光标到下面第二个标记有 ---> 的一行。重复步骤2和步骤3以改正这个句子。
+
+---> 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. 当您对添加文本操作感到满意时,请继续学习第一讲第六节。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一讲第六节:编辑文件
+
+ ** 使用 :wq 以保存文件并退出。 **
+
+ 特别提示:在执行以下步骤之前,请先读完整个小节!
+
+ 1. 如您在第一讲第二节中所做的那样退出本教程: :q!
+ 或者,如果您可以访问另一个终端,请在那里执行以下操作。
+
+ 2. 在 shell 的提示符下输入命令: vim tutor <回车>
+ 'vim'是启动 Vim 编辑器的命令,'tutor'是您希望编辑的文件的名字。
+ 请使用一个可以改动的文件。
+
+ 3. 使用您在前面的教程中学到的命令插入删除文本。
+
+ 4. 保存改动过的文件并退出 Vim,按这些键: :wq <回车>
+
+ 5. 如果您在步骤1中已经退出 vimtutor,请重启 vimtutor 移动到下面的小结一节。
+
+ 6. 阅读完以上步骤,弄懂它们的意义,然后在实践中进行练习。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一讲小结
+
+
+ 1. 光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
+ h (左移) j (下行) k (上行) l (右移)
+
+ 2. 欲进入 Vim 编辑器(从命令行提示符),请输入:vim 文件名 <回车>
+
+ 3. 欲退出 Vim 编辑器,请输入 <ESC> :q! <回车> 放弃所有改动。
+ 或者输入 <ESC> :wq <回车> 保存改动。
+
+ 4. 在正常模式下删除光标所在位置的字符,请按: x
+
+ 5. 欲插入或添加文本,请输入:
+
+ i 输入欲插入文本 <ESC> 在光标前插入文本
+ A 输入欲添加文本 <ESC> 在一行后添加文本
+
+特别提示:按下 <ESC> 键会带您回到正常模式或者撤消一个不想输入或部分完整
+的命令。
+
+好了,第一讲到此结束。下面接下来继续第二讲的内容。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二讲第一节:删除类命令
+
+
+ ** 输入 dw 可以从光标处删除至一个单词的末尾。**
+
+ 1. 请按下 <ESC> 键确保您处于正常模式。
+
+ 2. 请将光标移动到本节中下面标记有 ---> 的那一行。
+
+ 3. 请将光标移至准备要删除的单词的起始处。
+
+ 4. 接着输入 dw 删除掉该单词。
+
+ 特别提示:当您输入时,字母 d 会同时出现在屏幕的最后一行。Vim 在等待您输入
+ 字母 w。如果您看到的是除 d 外的其他字符,那表明您按错了;请按下 <ESC> 键,
+ 然后重新再来。
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. 重复步骤3和步骤4,直至句子修正完毕。接着继续第二讲第二节内容。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二讲第二节:更多删除类命令
+
+
+ ** 输入 d$ 从当前光标删除到行末。**
+
+ 1. 请按下 <ESC> 键确保您处于正常模式。
+
+ 2. 请将光标移动到本节中下面标记有 ---> 的那一行。
+
+ 3. 请将光标移动到该行的尾部(也就是在第一个点号‘.’后面)。
+
+ 4. 然后输入 d$ 从光标处删至当前行尾部。
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+
+ 5. 请继续学习第二讲第三节就知道是怎么回事了。
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二讲第三节:关于命令和对象
+
+
+ 许多改变文本的命令都由一个操作符和一个动作构成。
+ 使用删除操作符 d 的删除命令的格式如下:
+
+ d motion
+
+ 其中:
+ d - 删除操作符。
+ motion - 操作符的操作对象(在下面列出)。
+
+ 一个简短的动作列表:
+ w - 从当前光标当前位置直到下一个单词起始处,不包括它的第一个字符。
+ e - 从当前光标当前位置直到单词末尾,包括最后一个字符。
+ $ - 从当前光标当前位置直到当前行末。
+
+ 因此输入 de 会从当前光标位置删除到单词末尾。
+
+特别提示:
+ 对于勇于探索者,请在正常模式下面仅按代表相应动作的键而不使用操作符,您
+ 将看到光标的移动正如上面的对象列表所代表的一样。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二讲第四节:使用计数指定动作
+
+
+ ** 在动作前输入数字会使它重复那么多次。 **
+
+ 1. 移动光标到下面标记有 ---> 的一行的开始。
+
+ 2. 输入 2w 使光标向前移动两个单词。
+
+ 3. 输入 3e 使光标向前移动到第三个单词的末尾。
+
+ 4. 输入 0 (数字零) 移动光标到行首。
+
+ 5. 重复步骤2和步骤3,尝试不同的数字。
+
+---> This is just a line with words you can move around in.
+
+ 6. 请继续学习第二讲第五节。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二讲第五节:使用计数以删除更多
+
+
+ ** 使用操作符时输入数字可以使它重复那么多次。 **
+
+ 上面已经提到过删除操作符和动作的组合,您可以在组合中动作之前插入一个数字以
+ 删除更多:
+ d number(数字) motion
+
+ 1. 移动光标到下面标记有 ---> 的一行中第一个大写字母单词上。
+
+ 2. 输入 d2w 以删除两个大写字母单词。
+
+ 3. 重复步骤1和步骤2,使用不同的数字使得用一个命令就能删除全部相邻的大写字母
+ 单词
+
+---> this ABC DE line FGHI JK LMN OP of words is Q RS TUV cleaned up.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二讲第六节:操作整行
+
+
+ ** 输入 dd 可以删除整一个当前行。 **
+
+ 鉴于整行删除的高频度,Vi 的设计者决定要简化整行删除操作,您仅需要在同一行上
+ 击打两次 d 就可以删除掉光标所在的整行了。
+
+ 1. 请将光标移动到本节中下面的短句段落中的第二行。
+ 2. 输入 dd 删除该行。
+ 3. 然后移动到第四行。
+ 4. 接着输入 2dd 删除两行。
+
+---> 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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二讲第七节:撤消类命令
+
+
+ ** 输入 u 来撤消最后执行的命令,输入 U 来撤消对整行的修改。 **
+
+ 1. 请将光标移动到本节中下面标记有 ---> 的那一行,并将其置于第一个错误
+ 处。
+ 2. 输入 x 删除第一个不想保留的字母。
+ 3. 然后输入 u 撤消最后执行的(一次)命令。
+ 4. 这次要使用 x 修正本行的所有错误。
+ 5. 现在输入一个大写的 U ,恢复到该行的原始状态。
+ 6. 接着多次输入 u 以撤消 U 以及更前的命令。
+ 7. 然后多次输入 CTRL-R (先按下 CTRL 键不放开,接着按 R 键),这样就
+ 可以重做被撤消的命令,也就是撤消掉撤消命令。
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. 这些都是非常有用的命令。下面是第二讲的小结了。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二讲小结
+
+
+ 1. 欲从当前光标删除至下一个单词,请输入:dw
+ 2. 欲从当前光标删除至当前行末尾,请输入:d$
+ 3. 欲删除整行,请输入:dd
+
+ 4. 欲重复一个动作,请在它前面加上一个数字:2w
+ 5. 在正常模式下修改命令的格式是:
+ operator [number] motion
+ 其中:
+ operator - 操作符,代表要做的事情,比如 d 代表删除
+ [number] - 可以附加的数字,代表动作重复的次数
+ motion - 动作,代表在所操作的文本上的移动,例如 w 代表单词(word),
+ $ 代表行末等等。
+
+ 6. 欲移动光标到行首,请按数字0键:0
+
+ 7. 欲撤消以前的操作,请输入:u (小写的u)
+ 欲撤消在一行中所做的改动,请输入:U (大写的U)
+ 欲撤消以前的撤消命令,恢复以前的操作结果,请输入:CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三讲第一节:置入类命令
+
+
+ ** 输入 p 将最后一次删除的内容置入光标之后。 **
+
+ 1. 请将光标移动到本节中下面第一个标记有 ---> 的一行。
+
+ 2. 输入 dd 将该行删除,这样会将该行保存到 Vim 的一个寄存器中。
+
+ 3. 接着将光标移动到 c) 一行,即准备置入的位置的上方。记住:是上方哦。
+
+ 4. 然后在正常模式下(<ESC>键进入)输入 p 将该行粘贴置入。
+
+ 5. 重复步骤2至步骤4,将所有的行依序放置到正确的位置上。
+
+---> d) Can you learn too?
+---> b) Violets are blue,
+---> c) Intelligence is learned,
+---> a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三讲第二节:替换类命令
+
+
+ ** 输入 r 和一个字符替换光标所在位置的字符。**
+
+ 1. 请将光标移动到本节中下面标记有 ---> 的第一行。
+
+ 2. 请移动光标到第一个出错的位置。
+
+ 3. 接着输入 r 和要替换成的字符,这样就能将错误替换掉了。
+
+ 4. 重复步骤2和步骤3,直到第一行已经修改完毕。
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. 然后我们继续学习第三讲第三节。
+
+特别提示:切记您要在使用中学习,而不是在记忆中学习。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三讲第三节:更改类命令
+
+
+ ** 要改变文本直到一个单词的末尾,请输入 ce **
+
+ 1. 请将光标移动到本节中下面标记有 ---> 的第一行。
+
+ 2. 接着把光标放在单词 lubw 的字母 u 的位置那里。
+
+ 3. 然后输入 ce 以及正确的单词(在本例中是输入 ine )。
+
+ 4. 最后按 <ESC> 键,然后光标定位到下一个错误第一个准备更改的字母处。
+
+ 5. 重复步骤3和步骤4,直到第一个句子完全雷同第二个句子。
+
+---> 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.
+
+提示:请注意 ce 命令不仅仅是删除了一个单词,它也让您进入插入模式了。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三讲第四节:使用c更改更多
+
+
+ ** 更改类操作符可以与删除中使用的同样的动作配合使用。 **
+
+ 1. 更改类操作符的工作方式跟删除类是一致的。操作格式是:
+
+ c [number] motion
+
+ 2. 动作参数(motion)也是一样的,比如 w 代表单词,$代表行末等等。
+
+ 3. 请将光标移动到本节中下面标记有 ---> 的第一行。
+
+ 4. 接着将光标移动到第一个错误处。
+
+ 5. 然后输入 c$ 使得该行剩下的部分更正得同第二行一样。最后按 <ESC> 键。
+
+---> 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$ command.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三讲小结
+
+
+ 1. 要重新置入已经删除的文本内容,请按小写字母 p 键。该操作可以将已删除
+ 的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
+ 于当前光标所在行的下一行。
+
+ 2. 要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字
+ 符即可。
+
+ 3. 更改类命令允许您改变从当前光标所在位置直到动作指示的位置中间的文本。
+ 比如输入 ce 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当
+ 前光标到行末的内容。
+
+ 4. 更改类命令的格式是:
+
+ c [number] motion
+
+现在我们继续学习下一讲。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四讲第一节:定位及文件状态
+
+ ** 输入 CTRL-G 显示当前编辑文件中当前光标所在行位置以及文件状态信息。
+ 输入大写 G 则直接跳转到文件中的某一指定行。**
+
+ 提示:切记要先通读本节内容,之后才可以执行以下步骤!!!
+
+ 1. 按下 CTRL 键不放开然后按 g 键。我们称这个键组合为 CTRL-G。
+ 您会看到页面最底部出现一个状态信息行,显示的内容是当前编辑的文件名
+ 和文件中光标位置。请记住行号,它会在步骤3中用到。
+
+提示:您也许会在屏幕的右下角看到光标位置,这会在 'ruler' 选项设置时发生
+ (参见 :help 'ruler')
+
+ 2. 输入大写 G 可以使得当前光标直接跳转到文件最后一行。
+ 输入 gg 可以使得当前光标直接跳转到文件第一行。
+
+ 3. 输入您曾停留的行号,然后输入大写 G。这样就可以返回到您第一次按下
+ CTRL-G 时所在的行了。
+
+ 4. 如果您觉得没问题的话,请执行步骤1至步骤3的操作进行练习。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四讲第二节:搜索类命令
+
+
+ ** 输入 / 加上一个字符串可以用以在当前文件中查找该字符串。**
+
+ 1. 在正常模式下输入 / 字符。您此时会注意到该字符和光标都会出现在屏幕底
+ 部,这跟 : 命令是一样的。
+
+ 2. 接着输入 errroor <回车>。那个errroor就是您要查找的字符串。
+
+ 3. 要查找同上一次的字符串,只需要按 n 键。要向相反方向查找同上一次的字
+ 符串,请输入大写 N 即可。
+
+ 4. 如果您想逆向查找字符串,请使用 ? 代替 / 进行。
+
+ 5. 要回到您之前的位置按 CTRL-O (按住 Ctrl 键不放同时按下字母 o)。重复按可以
+ 回退更多步。CTRL-I 会跳转到较新的位置。
+
+---> "errroor" is not the way to spell error; errroor is an error.
+提示:如果查找已经到达文件末尾,查找会自动从文件头部继续查找,除非
+ 'wrapscan' 选项被复位。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四讲第三节:配对括号的查找
+
+
+ ** 输入 % 可以查找配对的括号 )、]、}。**
+
+ 1. 把光标放在本节下面标记有 --> 那一行中的任何一个 (、[ 或 { 处。
+
+ 2. 接着按 % 字符。
+
+ 3. 此时光标的位置应当是在配对的括号处。
+
+ 4. 再次按 % 就可以跳回配对的第一个括号处。
+
+ 5. 移动光标到另一个 (、)、[、]、{ 或 } 处,按 % 查看其所作所为。
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+
+提示:在程序调试时,这个功能用来查找不配对的括号是很有用的。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四讲第四节:替换命令
+
+
+ ** 输入 :s/old/new/g 可以替换 old 为 new。**
+
+ 1. 请将光标移动到本节中下面标记有 ---> 的那一行。
+
+ 2. 输入 :s/thee/the <回车> 。请注意该命令只改变光标所在行的第一个匹配
+ 串。
+
+ 3. 输入 :s/thee/the/g 则是替换全行的匹配串,该行中所有的 "thee" 都会被
+ 改变。
+
+---> thee best time to see thee flowers is in thee spring.
+
+ 4. 要替换两行之间出现的每个匹配串,请
+ 输入 :#,#s/old/new/g 其中 #,# 代表的是替换操作的若干行中
+ 首尾两行的行号。
+ 输入 :%s/old/new/g 则是替换整个文件中的每个匹配串。
+ 输入 :%s/old/new/gc 会找到整个文件中的每个匹配串,并且对每个匹配串
+ 提示是否进行替换。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四讲小结
+
+
+ 1. CTRL-G 用于显示当前光标所在位置和文件状态信息。
+ G 用于将光标跳转至文件最后一行。
+ 先敲入一个行号然后输入大写 G 则是将光标移动至该行号代表的行。
+ gg 用于将光标跳转至文件第一行。
+
+ 2. 输入 / 然后紧随一个字符串是在当前所编辑的文档中正向查找该字符串。
+ 输入 ? 然后紧随一个字符串则是在当前所编辑的文档中反向查找该字符串。
+ 完成一次查找之后按 n 键是重复上一次的命令,可在同一方向上查
+ 找下一个匹配字符串所在;或者按大写 N 向相反方向查找下一匹配字符串所在。
+ CTRL-O 带您跳转回较旧的位置,CTRL-I 则带您到较新的位置。
+
+ 3. 如果光标当前位置是括号(、)、[、]、{、},按 % 会将光标移动到配对的括号上。
+
+ 4. 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
+ 在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
+ 在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
+ 在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
+ 进行全文替换时询问用户确认每个替换需添加 c 标志 :%s/old/new/gc
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五讲第一节:在 VIM 内执行外部命令的方法
+
+
+ ** 输入 :! 然后紧接着输入一个外部命令可以执行该外部命令。**
+
+ 1. 按下我们所熟悉的 : 命令使光标移动到屏幕底部。这样您就可以输入一行命令了。
+
+ 2. 接着输入感叹号 ! 这个字符,这样就允许您执行外部的 shell 命令了。
+
+ 3. 我们以 ls 命令为例。输入 !ls <回车> 。该命令就会列举出您当前目录的
+ 内容,就如同您在命令行提示符下输入 ls 命令的结果一样。如果 !ls 没起
+ 作用,您可以试试 :!dir 看看。
+
+提示:所有的外部命令都可以以这种方式执行,包括带命令行参数的那些。
+
+提示:所有的 : 命令都必须以敲 <回车> 键结束。从今以后我们就不会总是提到这一点
+ 了。
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五讲第二节:关于保存文件的更多信息
+
+
+ ** 要将对文件的改动保存到文件中,请输入 :w FILENAME 。**
+
+ 1. 输入 :!dir 或者 :!ls 获知当前目录的内容。您应当已知道最后还得敲
+ <回车> 吧。
+
+ 2. 选择一个未被用到的文件名,比如 TEST。
+
+ 3. 接着输入 :w TEST (此处 TEST 是您所选择的文件名。)
+
+ 4. 该命令会以 TEST 为文件名保存整个文件 (Vim 教程)。为了验证这一点,
+ 请再次输入 :!dir 或 :!ls 查看您的目录列表内容。
+
+请注意:如果您退出 Vim 然后在以命令 vim TEST 再次启动 Vim,那么该文件内
+ 容应该同您保存时的文件内容是完全一样的。
+
+ 5. 现在您可以删除 TEST 文件了。在 MS-DOS 下,请输入: :!del TEST
+ 在 Unix 下,请输入: :!rm TEST
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五讲第三节:一个具有选择性的保存命令
+
+
+ ** 要保存文件的部分内容,请输入 v motion :w FILENAME **
+
+ 1. 移动光标到本行。
+
+ 2. 接着按 v 键,将光标移动至下面第五个条目上。您会注意到之间的文本被高亮了。
+
+ 3. 然后按 : 字符。您将看到屏幕底部会出现 :'<,'> 。
+
+ 4. 现在请输入 w TEST,其中 TEST 是一个未被使用的文件名。确认您看到了
+ :'<,'>w TEST 之后按 <回车> 键。
+
+ 5. 这时 Vim 会把选中的行写入到以 TEST 命名的文件中去。使用 :!dir 或 :!ls
+ 确认文件被正确保存。这次先别删除它!我们在下一讲中会用到它。
+
+提示:按 v 键使 Vim 进入可视模式进行选取。您可以四处移动光标使选取区域变大或
+ 变小。接着您可以使用一个操作符对选中文本进行操作。例如,按 d 键会删除
+ 选中的文本内容。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五讲第四节:提取和合并文件
+
+
+ ** 要向当前文件中插入另外的文件的内容,请输入 :r FILENAME **
+
+ 1. 请把光标移动到本行上面一行。
+
+特别提示:执行步骤2之后您将看到第五讲第三节的文字,请届时往下移动
+ 以再次看到本讲内容。
+
+ 2. 接着通过命令 :r TEST 将前面创建的名为 TEST 的文件提取进来。
+ 您所提取进来的文件将从光标所在位置处开始置入。
+
+ 3. 为了确认文件已经提取成功,移动光标回到原来的位置就可以注意有两份第
+ 五讲第三节的内容,一份是原始内容,另外一份是来自文件的副本。
+
+提示:您还可以读取外部命令的输出。例如, :r !ls 可以读取 ls 命令的输出,并
+ 把它放置在光标下面。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五讲小结
+
+
+ 1. :!command 用于执行一个外部命令 command。
+
+ 请看一些实际例子:
+ (MS-DOS) (Unix)
+ :!dir :!ls - 用于显示当前目录的内容。
+ :!del FILENAME :!rm FILENAME - 用于删除名为 FILENAME 的文件。
+
+ 2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
+ 件中。
+
+ 3. v motion :w FILENAME 可将当前编辑文件中可视模式下选中的内容保存到文件
+ FILENAME 中。
+
+ 4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
+ 后面。
+
+ 5. :r !dir 可以读取 dir 命令的输出并将其放置到当前文件的光标位置后面。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六讲第一节:打开类命令
+
+
+ ** 输入 o 将在光标的下方打开新的一行并进入插入模式。**
+
+ 1. 请将光标移动到本节中下面标记有 ---> 的那一行。
+
+ 2. 接着输入小写的 o 在光标 *下方* 打开新的一行,这个命令会使您
+ 进入插入模式。
+
+ 3. 然后输入一些文字,之后按 <ESC> 键退出插入模式而进入正常模式。
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. 为了在光标 *上方* 打开新的一行,只需要输入大写的 O 而不是小写的 o
+ 就可以了。请在下行测试一下吧。
+
+---> Open up a line above this by typing O while the cursor is on this line.
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六讲第二节:附加类命令
+
+
+ ** 输入 a 将可在光标之后插入文本。 **
+
+ 1. 请在正常模式下将光标移动到本节中下面标记有 ---> 的第一行的行首。
+
+ 2. 接着输入 e 直到光标位于 li 的末尾。
+
+ 3. 输入小写的 a 则可在光标之后插入文本了。
+
+ 4. 将单词补充完整,就像下一行中的那样。之后按 <ESC> 键退出插入模式回到
+ 正常模式。
+
+ 5. 使用 e 移动光标到下一步不完整的单词,重复步骤3和步骤4。
+
+---> This li will allow you to pract appendi text to a line.
+---> This line will allow you to practice appending text to a line.
+
+提示:a、i 和 A 都会带您进入插入模式,惟一的区别在于字符插入的位置。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六讲第三节:另外一个置换类命令的版本
+
+
+ ** 输入大写的 R 可连续替换多个字符。**
+
+ 1. 请将光标移动到本节中下面标记有 ---> 的第一行。移动光标到第一个 xxx 的
+ 起始位置。
+
+ 2. 然后输入大写的 R 开始把第一行中的不同于第二行的剩余字符逐一输入,就
+ 可以全部替换掉原有的字符而使得第一行完全雷同第二行了。
+
+ 3. 接着按 <ESC> 键退出替换模式回到正常模式。您可以注意到尚未替换的文本
+ 仍然保持原状。
+
+ 4. 重复以上步骤,将剩余的 xxx 也替换掉。
+
+---> Adding 123 to xxx gives you xxx.
+---> Adding 123 to 456 gives you 579.
+
+提示:替换模式与插入模式相似,不过每个输入的字符都会删除一个已有的字符。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六讲第四节:复制粘贴文本
+
+
+ ** 使用操作符 y 复制文本,使用 p 粘贴文本 **
+
+ 1. 定位到下面标记有 ---> 的一行,将光标移动到 "a)" 之后。
+
+ 2. 接着使用 v 进入可视模式,移动光标到 "first" 的前面。
+
+ 3. 现在输入 y 以抽出(复制)高亮的文本。
+
+ 4. 然后移动光标到下一行的末尾:j$
+
+ 5. 接着输入 p 以放置(粘贴)复制了的文本。然后输入:a second <ESC>。
+
+ 6. 使用可视模式选中 " item.",用 y 复制,再用 j$ 将光标移动到下一行末尾,
+ 用 p 将文本粘贴到那里。
+
+---> a) this is the first item.
+ b)
+
+ 提示:您还可以把 y 当作操作符来使用;例如 yw 可以用来复制一个单词。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六讲第五节:设置类命令的选项
+
+
+ ** 设置可使查找或者替换可忽略大小写的选项 **
+
+ 1. 要查找单词 ignore 可在正常模式下输入 /ignore <回车>。
+ 要重复查找该词,可以重复按 n 键。
+
+ 2. 然后设置 ic 选项(Ignore Case,忽略大小写),请输入: :set ic
+
+ 3. 现在可以通过键入 n 键再次查找单词 ignore。注意到 Ignore 和 IGNORE 现在
+ 也被找到了。
+
+ 4. 然后设置 hlsearch 和 incsearch 这两个选项,请输入: :set hls is
+
+ 5. 现在可以再次输入查找命令,看看会有什么效果: /ignore <回车>
+
+ 6. 要禁用忽略大小写,请输入: :set noic
+
+提示:要移除匹配项的高亮显示,请输入: :nohlsearch
+提示:如果您想要仅在一次查找时忽略字母大小写,您可以使用 \c:
+ /ignore\c <回车>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六讲小结
+
+ 1. 输入小写的 o 可以在光标下方打开新的一行并进入插入模式。
+ 输入大写的 O 可以在光标上方打开新的一行。
+
+ 2. 输入小写的 a 可以在光标所在位置之后插入文本。
+ 输入大写的 A 可以在光标所在行的行末之后插入文本。
+
+ 3. e 命令可以使光标移动到单词末尾。
+
+ 4. 操作符 y 复制文本,p 粘贴先前复制的文本。
+
+ 5. 输入大写的 R 将进入替换模式,直至按 <ESC> 键回到正常模式。
+
+ 6. 输入 :set xxx 可以设置 xxx 选项。一些有用的选项如下:
+ 'ic' 'ignorecase' 查找时忽略字母大小写
+ 'is' 'incsearch' 查找短语时显示部分匹配
+ 'hls' 'hlsearch' 高亮显示所有的匹配短语
+ 选项名可以用完整版本,也可以用缩略版本。
+
+ 7. 在选项前加上 no 可以关闭选项: :set noic
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第七讲第一节:获取帮助信息
+
+
+ ** 使用在线帮助系统 **
+
+ Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方
+ 法之一:
+ - 按下 <HELP> 键 (如果键盘上有的话)
+ - 按下 <F1> 键 (如果键盘上有的话)
+ - 输入 :help <回车>
+
+ 请阅读帮助窗口中的文字以了解帮助是如何工作的。
+ 输入 CTRL-W CTRL-W 可以使您在窗口之间跳转。
+ 输入 :q <回车> 可以关闭帮助窗口。
+
+ 提供一个正确的参数给":help"命令,您可以找到关于该主题的帮助。请试验以
+ 下参数(可别忘了按回车键哦):
+
+ :help w
+ :help c_CTRL-D
+ :help insert-index
+ :help user-manual
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第七讲第二节:创建启动脚本
+
+
+ ** 启用 Vim 的特性 **
+
+ Vim 的功能特性要比 Vi 多得多,但其中大部分都没有缺省启用。为了使用更多的
+ 特性,您得创建一个 vimrc 文件。
+
+ 1. 开始编辑 vimrc 文件,具体命令取决于您所使用的操作系统:
+ :edit ~/.vimrc 这是 Unix 系统所使用的命令
+ :edit ~/_vimrc 这是 MS-Windows 系统所使用的命令
+
+ 2. 接着读取 vimrc 示例文件的内容:
+ :r $VIMRUNTIME/vimrc_example.vim
+
+ 3. 保存文件,命令为:
+ :write
+
+ 下次您启动 Vim 时,编辑器就会有了语法高亮的功能。
+ 您可以把您喜欢的各种设置添加到这个 vimrc 文件中。
+ 要了解更多信息请输入 :help vimrc-intro
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第七讲第三节:补全功能
+
+
+ ** 使用 CTRL-D 和 <TAB> 可以进行命令行补全 **
+
+ 1. 请确保 Vim 不是在以兼容模式运行: :set nocp
+
+ 2. 查看一下当前目录下已经存在哪些文件,输入: :!ls 或者 :!dir
+
+ 3. 现在输入一个目录的起始部分,例如输入: :e
+
+ 4. 接着按 CTRL-D 键,Vim 会显示以 e 开始的命令的列表。
+
+ 5. 然后按 <TAB> 键,Vim 会补全命令为 :edit 。
+
+ 6. 现在添加一个空格,以及一个已有文件的文件名的起始部分,例如: :edit FIL
+
+ 7. 接着按 <TAB> 键,Vim 会补全文件名(如果它是惟一匹配的)。
+
+提示:补全对于许多命令都有效。您只需尝试按 CTRL-D 和 <TAB>。
+ 它对于 :help 命令非常有用。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第七讲小结
+
+
+ 1. 输入 :help 或者按 <F1> 键或 <Help> 键可以打开帮助窗口。
+
+ 2. 输入 :help cmd 可以找到关于 cmd 命令的帮助。
+
+ 3. 输入 CTRL-W CTRL-W 可以使您在窗口之间跳转。
+
+ 4. 输入 :q 以关闭帮助窗口
+
+ 5. 您可以创建一个 vimrc 启动脚本文件用来保存您偏好的设置。
+
+ 6. 当输入 : 命令时,按 CTRL-D 可以查看可能的补全结果。
+ 按 <TAB> 可以使用一个补全。
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ vim 教程到此就结束了。本教程只是为了简明地介绍一下 Vim 编辑器,但已足以让您
+ 很容易使用这个编辑器了。毋庸质疑,vim还有很多很多的命令,本教程所介
+ 绍的距离完整的差得很远。所以您要精通的话,还望继续努力哦。下一步您可以阅读
+ Vim 的用户手册,使用的命令是: :help user-manual
+
+ 下面这本书值得推荐用于更进一步的阅读和学习:
+ Vim - Vi Improved - 作者:Steve Oualline
+ 出版社:New Riders
+ 这是第一本完全讲解 Vim 的书籍。它对于初学者特别有用。其中包含有大量实例
+ 和图示。
+ 欲知详情,请访问 https://iccf-holland.org/click5.html
+
+ 以下这本书比较老了而且内容更多是关于 Vi 而非 Vim,但是也值得推荐:
+ Learning the Vi Editor - 作者:Linda Lamb
+ 出版社:O'Reilly & Associates Inc.
+ 这是一本不错的书,通过它您几乎能够了解到任何您想要使用 Vi 做的事情。
+ 此书的第六个版本也包含了一些关于 Vim 的信息。
+
+ 本教程是由来自 Calorado School of Mines 的 Michael C. Pierce 和
+ Robert K. Ware 所编写的,其中很多创意由来自 Colorado State University 的
+ Charles Smith 提供。编者的电子邮箱是:bware@mines.colorado.edu
+
+ 本教程已由 Bram Moolenaar 专为 Vim 进行修订。
+
+ 译制者附言:
+ ===========
+ 简体中文教程翻译版之译制者为梁昌泰 <beos@turbolinux.com.cn>,还有
+ 另外一个联系地址:linuxrat@gnuchina.org。
+
+ 繁体中文教程是从简体中文教程翻译版使用 Debian GNU/Linux 中文项目小
+ 组的于广辉先生编写的中文汉字转码器 autoconvert 转换而成的,并对转
+ 换的结果做了一些细节的改动。
+
+ 变更记录:
+ =========
+ 2012年10月01日 赵涛 <alick9188@gmail.com>
+ 将 vimtutor 中译版从 1.5 升级到 1.7。
+
+ 2002年08月30日 梁昌泰 <beos@turbolinux.com.cn>
+ 感谢 RMS@SMTH 的指正,将多处错误修正。
+
+ 2002年04月22日 梁昌泰 <linuxrat@gnuchina.org>
+ 感谢 xuandong@sh163.net 的指正,将两处错别字修正。
+
+ 2002年03月18日 梁昌泰 <linuxrat@gnuchina.org>
+ 根据Bram Moolenaar先生在2002年03月16日的来信要求,将vimtutor1.4中译
+ 版升级到vimtutor1.5。
+
+ 2001年11月15日 梁昌泰 <linuxrat@gnuchina.org>
+ 将vimtutor1.4中译版提交给Bram Moolenaar和Sven Guckes。
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/tutor/tutor.zh_tw.utf-8 b/runtime/tutor/tutor.zh_tw.utf-8
new file mode 100644
index 0000000..fc35259
--- /dev/null
+++ b/runtime/tutor/tutor.zh_tw.utf-8
@@ -0,0 +1,852 @@
+===============================================================================
+= 歡 迎 閱 讀 《 V I M 教 程 》 ── 版本 1.5 =
+===============================================================================
+ vim 是一個具有很多命令的功能非常強大的編輯器。限于篇幅,在本教程當中
+ 不就詳細介紹了。本教程的設計目標是講述一些必要的基本命令,而掌握好這
+ 些命令,您就能夠很容易將vim當作一個通用的萬能編輯器來使用了。
+
+ 完成本教程的內容大約需要25-30分鐘,取決于您訓練的時間。
+
+ 每一節的命令操作將會更改本文。推薦您復制本文的一個副本,然後在副本上
+ 進行訓練(如果您是通過"vimtutor"來啟動教程的,那麼本文就已經是副本了)。
+
+ 切記一點︰本教程的設計思路是在使用中進行學習的。也就是說,您需要通過
+ 執行命令來學習它們本身的正確用法。如果您只是閱讀而不操作,那麼您可能
+ 會很快遺忘這些命令的!
+
+ 好了,現在請確定您的Shift-Lock(大小寫鎖定鍵)還沒有按下,然後按鍵盤上
+ 的字母鍵 j 足夠多的次數來移動光標,直到第一節的內容能夠完全充滿屏幕。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講第一節︰移動光標
+
+
+ ※※ 要移動光標,請依照說明分別按下 h、j、k、l 鍵。 ※※
+
+ ^
+ k 提示︰ h 的鍵位于左邊,每次按下就會向左移動。
+ < h l > l 的鍵位于右邊,每次按下就會向右移動。
+ j j 鍵看起來很象一支尖端方向朝下的箭頭。
+ v
+
+ 1. 請隨意在屏幕內移動光標,直至您覺得舒服為止。
+
+ 2. 按下下行鍵(j),直到出現光標重復下行。
+
+---> 現在您應該已經學會如何移動到下一講吧。
+
+ 3. 現在請使用下行鍵,將光標移動到第一講第二節。
+
+提示︰如果您不敢確定您所按下的字母,請按下<ESC>鍵回到正常(Normal)模式。
+ 然後再次從鍵盤輸入您想要的命令。
+
+提示︰光標鍵應當也能正常工作的。但是使用hjkl鍵,在習慣之後您就能夠快速
+ 地在屏幕內四處移動光標了。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講第二節︰VIM的進入和退出
+
+
+ !! 特別提示︰敬請閱讀完整本一節的內容,然後才能執行以下所講解的命令。
+
+ 1. 請按<ESC>鍵(這是為了確保您處在正常模式)。
+
+ 2. 然後輸入︰ :q! <回車>
+
+---> 這種方式的退出編輯器絕不會保存您進入編輯器以來所做的改動。
+ 如果您想保存更改再退出,請輸入︰
+ :wq <回車>
+
+ 3. 如果您看到了命令行提示符,請輸入能夠帶您回到本教程的命令,那就是︰
+
+ vimtutor <回車>
+
+ 通常情況下您也可以用這種方式︰
+
+ vim tutor <回車>
+
+---> 這裡的 'vim' 表示進入vim編輯器,而 'tutor'則是您準備要編輯的文件。
+
+ 4. 如果您自信已經牢牢記住了這些步驟的話,請從步驟1執行到步驟3退出,然
+ 後再次進入編輯器。接著將光標移動到第一講第三節來繼續我們的教程講解。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講第三節︰文本編輯之刪除
+
+
+ ** 在正常(Normal)模式下,可以按下 x 鍵來刪除光標所在位置的字符。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 2. 為了修正輸入錯誤,請將光標移至準備刪除的字符的位置處。
+
+ 3. 然後按下 x 鍵將錯誤字符刪除掉。
+
+ 4. 重復步驟2到步驟4,直到句子修正為止。
+
+---> The ccow jumpedd ovverr thhe mooon.
+
+ 5. 好了,該行已經修正了,下一節內容是第一講第四節。
+
+特別提示︰在您瀏覽本教程時,不要強行記憶。記住一點︰在使用中學習。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講第四節︰文本編輯之插入
+
+
+ ** 在正常模式下,可以按下 i 鍵來插入文本。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 2. 為了使得第一行內容雷同于第二行,請將光標移至文本第一個字符準備插入
+ 的位置。
+
+ 3. 然後按下 i 鍵,接著輸入必要的文本字符。
+
+ 4. 所有文本都修正完畢,請按下 <ESC> 鍵返回正常模式。
+ 重復步驟2至步驟4以便修正句子。
+
+---> There is text misng this .
+---> There is some text missing from this line.
+
+ 5. 如果您對文本插入操作已經很滿意,請接著閱讀下面的小結。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第一講小結
+
+
+ 1. 光標在屏幕文本中的移動既可以用箭頭鍵,也可以使用 hjkl 字母鍵。
+ h (左移) j (下行) k (上行) l (右移)
+
+ 2. 欲進入vim編輯器(從命令行提示符),請輸入︰vim 文件名 <回車>
+
+ 3. 欲退出vim編輯器,請輸入以下命令放棄所有修改︰
+
+ <ESC> :q! <回車>
+
+ 或者輸入以下命令保存所有修改︰
+
+ <ESC> :wq <回車>
+
+ 4. 在正常模式下刪除光標所在位置的字符,請按︰ x
+
+ 5. 在正常模式下要在光標所在位置開始插入文本,請按︰
+
+ i 輸入必要文本 <ESC>
+
+特別提示︰按下 <ESC> 鍵會帶您回到正常模式或者取消一個不期望或者部分完成
+的命令。
+
+好了,第一講到此結束。下面接下來繼續第二講的內容。
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第一節︰刪除類命令
+
+
+ ** 輸入 dw 可以從光標處刪除至一個單字/單詞的末尾。**
+
+ 1. 請按下 <ESC> 鍵確保您處于正常模式。
+
+ 2. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 3. 請將光標移至準備要刪除的單詞的開始。
+
+ 4. 接著輸入 dw 刪除掉該單詞。
+
+ 特別提示︰您所輸入的 dw 會在您輸入的同時出現在屏幕的最後一行。如果您輸
+ 入有誤,請按下 <ESC> 鍵取消,然後重新再來。
+
+---> There are a some words fun that don't belong paper in this sentence.
+
+ 5. 重復步驟3至步驟4,直至句子修正完畢。接著繼續第二講第二節內容。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第二節︰其他刪除類命令
+
+
+ ** 輸入 d$ 從當前光標刪除到行末。**
+
+ 1. 請按下 <ESC> 鍵確保您處于正常模式。
+
+ 2. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 3. 請將光標移動到該行的尾部(也就是在第一個點號‘.’後面)。
+
+ 4. 然後輸入 d$ 從光標處刪至當前行尾部。
+
+---> Somebody typed the end of this line twice. end of this line twice.
+
+
+ 5. 請繼續學習第二講第三節就知道是怎麼回事了。
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第三節︰關于命令和對象
+
+
+ 刪除命令 d 的格式如下︰
+
+ [number] d object 或者 d [number] object
+
+ 其意如下︰
+ number - 代表執行命令的次數(可選項,缺省設置為 1 )。
+ d - 代表刪除。
+ object - 代表命令所要操作的對象(下面有相關介紹)。
+
+ 一個簡短的對象列表︰
+ w - 從當前光標當前位置直到單字/單詞末尾,包括空格。
+ e - 從當前光標當前位置直到單字/單詞末尾,但是 *不* 包括空格。
+ $ - 從當前光標當前位置直到當前行末。
+
+特別提示︰
+ 對于勇于探索者,請在正常模式下面僅按代表相應對象的鍵而不使用命令,則
+ 將看到光標的移動正如上面的對象列表所代表的一樣。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第四節︰對象命令的特殊情況
+
+
+ ** 輸入 dd 可以刪除整一個當前行。 **
+
+ 鑒于整行刪除的高頻度,VIM 的設計者決定要簡化整行刪除,僅需要在同一行上
+ 擊打兩次 d 就可以刪除掉光標所在的整行了。
+
+ 1. 請將光標移動到本節中下面的短句段落中的第二行。
+ 2. 輸入 dd 刪除該行。
+ 3. 然後移動到第四行。
+ 4. 接著輸入 2dd (還記得前面講過的 number-command-object 嗎?) 刪除兩行。
+
+ 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.
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講第五節︰撤消類命令
+
+
+ ** 輸入 u 來撤消最後執行的命令,輸入 U 來修正整行。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的那一行,並將其置于第一個錯誤
+ 處。
+ 2. 輸入 x 刪除第一個不想保留的字母。
+ 3. 然後輸入 u 撤消最後執行的(一次)命令。
+ 4. 這次要使用 x 修正本行的所有錯誤。
+ 5. 現在輸入一個大寫的 U ,恢復到該行的原始狀態。
+ 6. 接著多次輸入 u 以撤消 U 以及更前的命令。
+ 7. 然後多次輸入 CTRL-R (先按下 CTRL 鍵不放開,接著輸入 R 鍵) ,這樣就
+ 可以執行恢復命令,也就是撤消掉撤消命令。
+
+---> Fiix the errors oon thhis line and reeplace them witth undo.
+
+ 8. 這些都是非常有用的命令。下面是第二講的小結了。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第二講小結
+
+
+ 1. 欲從當前光標刪除至單字/單詞末尾,請輸入︰dw
+
+ 2. 欲從當前光標刪除至當前行末尾,請輸入︰d$
+
+ 3. 欲刪除整行,請輸入︰dd
+
+ 4. 在正常模式下一個命令的格式是︰
+
+ [number] command object 或者 command [number] object
+ 其意是︰
+ number - 代表的是命令執行的次數
+ command - 代表要做的事情,比如 d 代表刪除
+ object - 代表要操作的對象,比如 w 代表單字/單詞,$ 代表到行末等等。
+ $ (to the end of line), etc.
+
+ 5. 欲撤消以前的操作,請輸入︰u (小寫的u)
+ 欲撤消在一行中所做的改動,請輸入︰U (大寫的U)
+ 欲撤消以前的撤消命令,恢復以前的操作結果,請輸入︰CTRL-R
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講第一節︰置入類命令
+
+
+ ** 輸入 p 將最後一次刪除的內容置入光標之後 **
+
+ 1. 請將光標移動到本節中下面示范段落的首行。
+
+ 2. 輸入 dd 將該行刪除,這樣會將該行保存到vim的緩沖區中。
+
+ 3. 接著將光標移動到準備置入的位置的上方。記住︰是上方哦。
+
+ 4. 然後在正常模式下(<ESC>鍵進入),輸入 p 將該行粘貼置入。
+
+ 5. 重復步驟2至步驟4,將所有的行依序放置到正確的位置上。
+
+ d) Can you learn too?
+ b) Violets are blue,
+ c) Intelligence is learned,
+ a) Roses are red,
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講第二節︰替換類命令
+
+
+ ** 輸入 r 和一個字符替換光標所在位置的字符。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 2. 請移動光標到第一個錯誤的適當位置。
+
+ 3. 接著輸入 r ,這樣就能將錯誤替換掉了。
+
+ 4. 重復步驟2和步驟3,直到第一行已經修改完畢。
+
+---> Whan this lime was tuoed in, someone presswd some wrojg keys!
+---> When this line was typed in, someone pressed some wrong keys!
+
+ 5. 然後我們繼續學校第三講第三節。
+
+特別提示︰切記您要在使用中學習,而不是在記憶中學習。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講第三節︰更改類命令
+
+
+ ** 要改變一個單字/單詞的部分或者全部,請輸入 cw **
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 2. 接著把光標放在單詞 lubw 的字母 u 的位置那裡。
+
+ 3. 然後輸入 cw 就可以修正該單詞了(在本例這裡是輸入 ine 。)
+
+ 4. 最後按 <ESC> 鍵,然後光標定位到下一個錯誤第一個準備更改的字母處。
+
+ 5. 重復步驟3和步驟4,直到第一個句子完全雷同第二個句子。
+
+---> This lubw has a few wptfd that mrrf changing usf the change command.
+---> This line has a few words that need changing using the change command.
+
+提示︰請注意 cw 命令不僅僅是替換了一個單詞,也讓您進入文本插入狀態了。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講第四節︰使用c指令的其他更改類命令
+
+
+ ** 更改類指令可以使用同刪除類命令所使用的對象參數。**
+
+ 1. 更改類指令的工作方式跟刪除類命令是一致的。操作格式是︰
+
+ [number] c object 或者 c [number] object
+
+ 2. 對象參數也是一樣的,比如 w 代表單字/單詞,$代表行末等等。
+
+ 3. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 4. 接著將光標移動到第一個錯誤處。
+
+ 5. 然後輸入 c$ 使得該行剩下的部分更正得同第二行一樣。最後按 <ESC> 鍵。
+
+---> 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$ command.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第三講小結
+
+
+ 1. 要重新置入已經刪除的文本內容,請輸入小寫字母 p。該操作可以將已刪除
+ 的文本內容置于光標之後。如果最後一次刪除的是一個整行,那麼該行將置
+ 于當前光標所在行的下一行。
+
+ 2. 要替換光標所在位置的字符,請輸入小寫的 r 和要替換掉原位置字符的新字
+ 符即可。
+
+ 3. 更改類命令允許您改變指定的對象,從當前光標所在位置直到對象的末尾。
+ 比如輸入 cw 可以替換當前光標到單詞的末尾的內容;輸入 c$ 可以替換當
+ 前光標到行末的內容。
+
+ 4. 更改類命令的格式是︰
+
+ [number] c object 或者 c [number] object
+
+下面我們繼續學習下一講。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講第一節︰定位及文件狀態
+
+
+ ** 輸入 CTRL-g 顯示當前編輯文件中當前光標所在行位置以及文件狀態信息。
+ 輸入 SHIFT-G 則直接跳轉到文件中的某一指定行。**
+
+ 提示︰切記要先通讀本節內容,之後才可以執行以下步驟!!!
+
+ 1. 按下 CTRL 鍵不放開然後按 g 鍵。然後就會看到頁面最底部出現一個狀態信
+ 息行,顯示的內容是當前編輯的文件名和文件的總行數。請記住步驟3的行號。
+
+ 2. 按下 SHIFT-G 鍵可以使得當前光標直接跳轉到文件最後一行。
+
+ 3. 輸入您曾停留的行號,然後按下 SHIFT-G。這樣就可以返回到您第一次按下
+ CTRL-g 時所在的行好了。注意︰輸入行號時,行號是不會在屏幕上顯示出來
+ 的。
+
+ 4. 如果願意,您可以繼續執行步驟1至步驟三。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講第二節︰搜索類命令
+
+
+ ** 輸入 / 以及尾隨的字符串可以用以在當前文件中查找該字符串。**
+
+ 1. 在正常模式下輸入 / 字符。您此時會注意到該字符和光標都會出現在屏幕底
+ 部,這跟 : 命令是一樣的。
+
+ 2. 接著輸入 errroor <回車>。那個errroor就是您要查找的字符串。
+
+ 3. 要查找同上一次的字符串,只需要按 n 鍵。要向相反方向查找同上一次的字
+ 符串,請輸入 Shift-N 即可。
+
+ 4. 如果您想逆向查找字符串,請使用 ? 代替 / 進行。
+
+---> When the search reaches the end of the file it will continue at the start.
+
+ "errroor" is not the way to spell error; errroor is an error.
+
+ 提示︰如果查找已經到達文件末尾,查找會自動從文件頭部繼續查找。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講第三節︰配對括號的查找
+
+
+ ** 按 % 可以查找配對的括號 )、]、}。**
+
+ 1. 把光標放在本節下面標記有 --> 那一行中的任何一個 (、[ 或 { 處。
+
+ 2. 接著按 % 字符。
+
+ 3. 此時光標的位置應當是在配對的括號處。
+
+ 4. 再次按 % 就可以跳回配對的第一個括號處。
+
+---> This ( is a test line with ('s, ['s ] and {'s } in it. ))
+
+提示︰在程序調試時,這個功能用來查找不配對的括號是很有用的。
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講第四節︰修正錯誤的方法之一
+
+
+ ** 輸入 :s/old/new/g 可以替換 old 為 new。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 2. 輸入 :s/thee/the <回車> 。請注意該命令只改變光標所在行的第一個匹配
+ 串。
+
+ 3. 輸入 :s/thee/the/g 則是替換全行的匹配串。
+
+---> the best time to see thee flowers is in thee spring.
+
+ 4. 要替換兩行之間出現的每個匹配串,請輸入 :#,#s/old/new/g (#,#代表的是
+ 兩行的行號)。輸入 :%s/old/new/g 則是替換整個文件中的每個匹配串。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第四講小結
+
+
+ 1. Ctrl-g 用于顯示當前光標所在位置和文件狀態信息。Shift-G 用于將光標跳
+ 轉至文件最後一行。先敲入一個行號然後按 Shift-G 則是將光標移動至該行
+ 號代表的行。
+
+ 2. 輸入 / 然後緊隨一個字符串是則是在當前所編輯的文檔中向後查找該字符串。
+ 輸入問號 ? 然後緊隨一個字符串是則是在當前所編輯的文檔中向前查找該字
+ 符串。完成一次查找之後按 n 鍵則是重復上一次的命令,可在同一方向上查
+ 找下一個字符串所在;或者按 Shift-N 向相反方向查找下該字符串所在。
+
+ 3. 如果光標當前位置是括號(、)、[、]、{、},按 % 可以將光標移動到配對的
+ 括號上。
+
+ 4. 在一行內替換頭一個字符串 old 為新的字符串 new,請輸入 :s/old/new
+ 在一行內替換所有的字符串 old 為新的字符串 new,請輸入 :s/old/new/g
+ 在兩行內替換所有的字符串 old 為新的字符串 new,請輸入 :#,#s/old/new/g
+ 在文件內替換所有的字符串 old 為新的字符串 new,請輸入 :%s/old/new/g
+ 進行全文替換時詢問用戶確認每個替換需添加 c 選項,請輸入 :%s/old/new/gc
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講第一節︰在 VIM 內執行外部命令的方法
+
+
+ ** 輸入 :! 然後緊隨著輸入一個外部命令可以執行該外部命令。**
+
+ 1. 按下我們所熟悉的 : 命令設置光標到屏幕底部。這樣就可以讓您輸入命令了。
+
+ 2. 接著輸入感嘆號 ! 這個字符,這樣就允許您執行外部的 shell 命令了。
+
+ 3. 我們以 ls 命令為例。輸入 !ls <回車> 。該命令就會列舉出您當前目錄的
+ 內容,就如同您在命令行提示符下輸入 ls 命令的結果一樣。如果 !ls 沒起
+ 作用,您可以試試 :!dir 看看。
+
+---> 提示︰ 所有的外部命令都可以以這種方式執行。
+
+---> 提示︰ 所有的 : 命令都必須以 <回車> 告終。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講第二節︰關于保存文件的更多信息
+
+
+ ** 要將對文件的改動保存到文件中,請輸入 :w FILENAME **
+
+ 1. 輸入 :!dir 或者 :!ls 獲知當前目錄的內容。您應當已知道最後還得敲
+ <回車> 吧。
+
+ 2. 選擇一個尚未存在文件名,比如 TEST 。
+
+ 3. 接著輸入 :w TEST (此處 TEST 是您所選擇的文件名。)
+
+ 4. 該命令會以 TEST 為文件名保存整個文件 (VIM 教程)。為了確保正確保存,
+ 請再次輸入 :!dir 查看您的目錄列表內容。
+
+---> 請注意︰如果您退出 VIM 然後在以文件名 TEST 為參數進入,那麼該文件內
+ 容應該同您保存時的文件內容是完全一樣的。
+
+ 5. 現在您可以通過輸入 :!rm TEST 來刪除 TEST 文件了。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講第三節︰一個具有選擇性的保存命令
+
+
+ ** 要保存文件的部分內容,請輸入 :#,# w FILENAME **
+
+ 1. 再來執行一次 :!dir 或者 :!ls 獲知當前目錄的內容,然後選擇一個合適的
+ 不重名的文件名,比如 TEST 。
+
+ 2. 接著將光標移動至本頁的最頂端,然後按 CTRL-g 找到該行的行號。別忘了
+ 行號哦。
+
+ 3. 接著把光標移動至本頁的最底端,再按一次 CTRL-g 。也別忘了這個行號哦。
+
+ 4. 為了只保存文章的某個部分,請輸入 :#,# w TEST 。這裡的 #,# 就是上面
+ 要求您記住的行號(頂端行號,底端行號),而 TEST 就是選定的文件名。
+
+ 5. 最後,用 :!dir 確認文件是否正確保存。但是這次先別刪除掉。
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講第四節︰提取和合並文件
+
+
+ ** 要向當前文件中插入另外的文件的內容,請輸入 :r FILENAME **
+
+ 1. 請鍵入 :!dir 確認您前面創建的 TEST 文件還在。
+
+ 2. 然後將光標移動至當前頁面的頂端。
+
+特別提示︰ 執行步驟3之後您將看到第五講第三節,請屆時再往下移動回到這裡來。
+
+ 3. 接著通過 :r TEST 將前面創建的名為 TEST 的文件提取進來。
+
+特別提示︰您所提取進來的文件將從光標所在位置處開始置入。
+
+ 4. 為了確認文件已經提取成功,移動光標回到原來的位置就可以注意有兩份第
+ 五講第三節,一份是原本,另外一份是來自文件的副本。
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第五講小結
+
+
+ 1. :!command 用于執行一個外部命令 command。
+
+ 請看一些實際例子︰
+ :!dir - 用于顯示當前目錄的內容。
+ :!rm FILENAME - 用于刪除名為 FILENAME 的文件。
+
+ 2. :w FILENAME 可將當前 VIM 中正在編輯的文件保存到名為 FILENAME
+ 的文件中。
+
+ 3. :#,#w FILENAME 可將當前編輯文件第 # 行至第 # 行的內容保存到文件
+ FILENAME 中。
+
+ 4. :r FILENAME 可提取磁盤文件 FILENAME 並將其插入到當前文件的光標位置
+ 後面。
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講第一節︰打開類命令
+
+
+ ** 輸入 o 將在光標的下方打開新的一行並進入插入模式。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的那一行。
+
+ 2. 接著輸入小寫的 o 在光標 *下方* 打開新的一行並進入插入模式。
+
+ 3. 然後復制標記有 ---> 的行並按 <ESC> 鍵退出插入模式而進入正常模式。
+
+---> After typing o the cursor is placed on the open line in Insert mode.
+
+ 4. 為了在光標 *上方* 打開新的一行,只需要輸入大寫的 O 而不是小寫的 o
+ 就可以了。請在下行測試一下吧。當光標處在在該行上時,按 Shift-O可以
+ 在該行上方新開一行。
+
+Open up a line above this by typing Shift-O while the cursor is on this line.
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講第二節︰光標後插入類命令
+
+
+ ** 輸入 a 將可在光標之後插入文本。 **
+
+ 1. 請在正常模式下通過輸入 $ 將光標移動到本節中下面標記有 ---> 的第一行
+ 的末尾。
+
+ 2. 接著輸入小寫的 a 則可在光標之後插入文本了。大寫的 A 則可以直接在行
+ 末插入文本。
+
+提示︰輸入大寫 A 的操作方法可以在行末插入文本,避免了輸入 i,光標定位到
+ 最後一個字符,輸入的文本,<ESC> 回復正常模式,箭頭右鍵移動光標以及
+ x 刪除當前光標所在位置字符等等諸多繁雜的操作。
+
+ 3. 操作之後第一行就可以補充完整了。請注意光標後插入文本與插入模式是基
+ 本完全一致的,只是文本插入的位置定位稍有不同罷了。
+
+---> This line will allow you to practice
+---> This line will allow you to practice appending text to the end of a line.
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講第三節︰另外一個置換類命令的版本
+
+
+ ** 輸入大寫的 R 可連續替換多個字符。**
+
+ 1. 請將光標移動到本節中下面標記有 ---> 的第一行。
+
+ 2. 移動光標到第一行中不同于標有 ---> 的第二行的第一個單詞的開始,即單
+ 詞 last 處。
+
+ 3. 然後輸入大寫的 R 開始把第一行中的不同于第二行的剩余字符逐一輸入,就
+ 可以全部替換掉原有的字符而使得第一行完全雷同第二行了。
+
+---> To make the first line the same as the last on this page use the keys.
+---> To make the first line the same as the second, type R and the new text.
+
+ 4. 請注意︰如果您按 <ESC> 退出置換模式回復正常模式,尚未替換的文本將仍
+ 然保持原狀。
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講第四節︰設置類命令的選項
+
+
+ ** 設置可使查找或者替換可忽略大小寫的選項 **
+
+
+ 1. 要查找單詞 ignore 可在正常模式下輸入 /ignore 。要重復查找該詞,可以
+ 重復按 n 鍵。
+
+ 2. 然後設置 ic 選項(ic就是英文忽略大小寫Ignore Case的首字母縮寫詞),即
+ 輸入︰
+ :set ic
+
+ 3. 現在可以通過鍵入 n 鍵再次查找單詞 ignore。重復查找可以重復鍵入 n 鍵。
+
+ 4. 然後設置 hlsearch 和 incsearch 這兩個選項,輸入以下內容︰
+ :set hls is
+
+ 5. 現在可以再次輸入查找命令,看看會有什麼效果︰
+ /ignore
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第六講小結
+
+
+ 1. 輸入小寫的 o 可以在光標下方打開新的一行並將光標置于新開的行首,進入
+ 插入模式。
+ 輸入大寫的 O 可以在光標上方打開新的一行並將光標置于新開的行首,進入
+ 插入模式。
+
+ 2. 輸入小寫的 a 可以在光標所在位置之後插入文本。
+ 輸入大寫的 A 可以在光標所在行的行末之後插入文本。
+
+ 3. 輸入大寫的 R 將進入替換模式,直至按 <ESC> 鍵退出替換模式而進入正常
+ 模式。
+
+ 4. 輸入 :set xxx 可以設置 xxx 選項。
+
+
+
+
+
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第七講︰在線幫助命令
+
+ ** 使用在線幫助系統 **
+
+ Vim 擁有一個細致全面的在線幫助系統。要啟動該幫助系統,請選擇如下三種方
+ 法之一︰
+ - 按下 <HELP> 鍵 (如果鍵盤上有的話)
+ - 按下 <F1> 鍵 (如果鍵盤上有的話)
+ - 輸入 :help <回車>
+
+ 輸入 :q <回車> 可以關閉幫助窗口。
+
+ 提供一個正確的參數給":help"命令,您可以找到關于該主題的幫助。請試驗以
+ 下參數(可別忘了按回車鍵哦。:)︰
+
+ :help w <回車>
+ :help c_<T <回車>
+ :help insert-index <回車>
+ :help user-manual <回車>
+
+
+
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 第八講︰創建一個啟動腳本
+
+ ** 啟用vim的功能 **
+
+ Vim的功能特性要比vi多得多,但大部分功能都沒有缺省激活。為了啟動更多的
+ 功能,您得創建一個vimrc文件。
+
+ 1. 開始編輯vimrc文件,這取決于您所使用的操作系統︰
+
+ :edit ~/.vimrc 這是Unix系統所使用的命令
+ :edit ~/_vimrc 這是Windows系統所使用的命令
+
+ 2. 接著導入vimrc范例文件︰
+
+ :read $VIMRUNTIME/vimrc_example.vim
+
+ 3. 保存文件,命令為︰
+
+ :write
+
+ 在下次您啟動vim的時候,編輯器就會有了語法高亮的功能。您可以繼續把您喜
+ 歡的其它功能設置添加到這個vimrc文件中。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ vim 教程到此結束。本教程只是為了簡明地介紹一下vim編輯器,但已足以讓您
+ 很容易學會使用本編輯器了。毋庸質疑,vim還有很多很多的命令,本教程所介
+ 紹的還差得遠著呢。所以您要精通的話,還望繼續努力哦。下一步您可以閱讀
+ vim手冊,使用的命令是︰
+ :help user-manual
+
+ 為了更進一步的參考和學習,以下這本書值得推薦︰
+
+ Vim - Vi Improved - 作者︰Steve Oualline
+ 出版社︰New Riders
+
+ 這是第一本完全講解vim的書籍。對于初學者特別有用。其中還包含有大量實例
+ 和圖示。欲知詳情,請訪問 https://iccf-holland.org/click5.html
+
+ 以下這本書比較老了而且內容主要是vi而不是vim,但是也值得推薦︰
+
+ Learning the Vi Editor - 作者︰Linda Lamb
+ 出版社︰O'Reilly & Associates Inc.
+
+ 這是一本不錯的書,通過它您幾乎能夠了解到全部vi能夠做到的事情。此書的第
+ 六個版本也包含了一些關于vim的信息。
+
+ 本教程是由來自Calorado School of Minese的Michael C. Pierce、Robert K.
+ Ware 所編寫的,其中來自Colorado State University的Charles Smith提供了
+ 很多創意。編者通信地址是︰
+
+ bware@mines.colorado.edu
+
+ 本教程已由Bram Moolenaar專為vim進行修訂。
+
+
+
+ 譯制者附言︰
+ ===========
+ 簡體中文教程翻譯版之譯制者為梁昌泰 <beos@turbolinux.com.cn>,還有
+ 另外一個聯系地址︰linuxrat@gnuchina.org。
+
+ 繁體中文教程是從簡體中文教程翻譯版使用 Debian GNU/Linux 中文項目小
+ 組的于廣輝先生編寫的中文漢字轉碼器 autoconvert 轉換而成的,並對轉
+ 換的結果做了一些細節的改動。
+
+ 變更記錄︰
+ =========
+ 2002年08月30日 梁昌泰 <beos@turbolinux.com.cn>
+ 感謝 RMS@SMTH 的指正,將多處錯誤修正。
+
+ 2002年04月22日 梁昌泰 <linuxrat@gnuchina.org>
+ 感謝 xuandong@sh163.net 的指正,將兩處錯別字修正。
+
+ 2002年03月18日 梁昌泰 <linuxrat@gnuchina.org>
+ 根據Bram Moolenaar先生在2002年03月16日的來信要求,將vimtutor1.4中譯
+ 版升級到vimtutor1.5。
+
+ 2001年11月15日 梁昌泰 <linuxrat@gnuchina.org>
+ 將vimtutor1.4中譯版提交給Bram Moolenaar和Sven Guckes。
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/runtime/vim.desktop b/runtime/vim.desktop
new file mode 100644
index 0000000..a8672cb
--- /dev/null
+++ b/runtime/vim.desktop
@@ -0,0 +1,135 @@
+# The vim.desktop file is generated by src/po/Makefile, do NOT edit.
+# Edit the src/po/vim.desktop.in file instead.
+[Desktop Entry]
+# Translators: This is the Application Name used in the Vim desktop file
+Name[ca]=Vim
+Name[de]=Vim
+Name[eo]=Vim
+Name[es]=Vim
+Name[fi]=Vim
+Name[fr]=Vim
+Name[ga]=Vim
+Name[it]=Vim
+Name[ru]=Vim
+Name[sr]=Vim
+Name[tr]=Vim
+Name[uk]=Vim
+Name[zh_CN]=Vim
+Name=Vim
+# Translators: This is the Generic Application Name used in the Vim desktop file
+GenericName[ca]=Editor de text
+GenericName[de]=Texteditor
+GenericName[eo]=Tekstoredaktilo
+GenericName[es]=Editor de texto
+GenericName[fi]=Tekstinmuokkain
+GenericName[fr]=Éditeur de texte
+GenericName[ga]=Eagarthóir Téacs
+GenericName[it]=Editor di testi
+GenericName[ja]=テキストエディタ
+GenericName[ru]=Текстовый редактор
+GenericName[sr]=Едитор текст
+GenericName[tr]=Metin Düzenleyici
+GenericName[uk]=Редактор Тексту
+GenericName[zh_CN]=文本编辑器
+GenericName=Text Editor
+# Translators: This is the comment used in the Vim desktop file
+Comment[ca]=Edita fitxers de text
+Comment[de]=Textdateien bearbeiten
+Comment[eo]=Redakti tekstajn dosierojn
+Comment[es]=Editar archivos de texto
+Comment[fi]=Muokkaa tekstitiedostoja
+Comment[fr]=Éditer des fichiers texte
+Comment[ga]=Cuir comhaid téacs in eagar
+Comment[it]=Edita file di testo
+Comment[ja]=テキストファイルを編集します
+Comment[ru]=Редактирование текстовых файлов
+Comment[sr]=Уређујте текст фајлове
+Comment[tr]=Metin dosyaları düzenleyin
+Comment[uk]=Редагувати текстові файли
+Comment[zh_CN]=编辑文本文件
+Comment=Edit text files
+# The translations should come from the po file. Leave them here for now, they will
+# be overwritten by the po file when generating the desktop.file.
+GenericName[da]=Teksteditor
+GenericName[pl]=Edytor tekstu
+GenericName[is]=Ritvinnsluforrit
+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[cs]=Úprava textových souborů
+Comment[cy]=Golygu ffeiliau testun
+Comment[da]=Rediger tekstfiler
+Comment[el]=Επεξεργασία αρχείων κειμένου
+Comment[en_CA]=Edit text files
+Comment[en_GB]=Edit text files
+Comment[et]=Redigeeri tekstifaile
+Comment[eu]=Editatu testu-fitxategiak
+Comment[fa]=ویرایش پرونده‌های متنی
+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[is]=Vinna með textaskrár
+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]=Edytuj pliki tekstowe
+Comment[pt]=Editar ficheiros de texto
+Comment[pt_BR]=Edite arquivos de texto
+Comment[ro]=Editare fişiere text
+Comment[sk]=Úprava textových súborov
+Comment[sl]=Urejanje datotek z besedili
+Comment[sq]=Përpuno files teksti
+Comment[sr@Latn]=Izmeni tekstualne datoteke
+Comment[sv]=Redigera textfiler
+Comment[ta]=உரை கோப்புகளை தொகுக்கவும்
+Comment[th]=แก้ไขแฟ้มข้อความ
+Comment[tk]=Metin faýllary editle
+Comment[vi]=Soạn thảo tập tin văn bản
+Comment[wa]=Asspougnî des fitchîs tecses
+Comment[zh_TW]=編輯文字檔
+TryExec=vim
+Exec=vim %F
+Terminal=true
+Type=Application
+# Translators: Search terms to find this application. Do NOT change the semicolons! The list MUST also end with a semicolon!
+Keywords[ca]=Text;editor;
+Keywords[de]=Text;Editor;
+Keywords[eo]=Teksto;redaktilo;
+Keywords[es]=Texto;editor;
+Keywords[fi]=Teksti;muokkain;editori;
+Keywords[fr]=Texte;éditeur;
+Keywords[ga]=Téacs;eagarthóir;
+Keywords[it]=Testo;editor;
+Keywords[ja]=テキスト;エディタ;
+Keywords[ru]=текст;текстовый редактор;
+Keywords[sr]=Текст;едитор;
+Keywords[tr]=Metin;düzenleyici;
+Keywords[uk]=текст;редактор;
+Keywords[zh_CN]=Text;editor;文本;编辑器;
+Keywords=Text;editor;
+# Translators: This is the Icon file name. Do NOT translate
+Icon=gvim
+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/vim16x16.gif b/runtime/vim16x16.gif
new file mode 100644
index 0000000..505a855
--- /dev/null
+++ b/runtime/vim16x16.gif
Binary files differ
diff --git a/runtime/vim16x16.png b/runtime/vim16x16.png
new file mode 100644
index 0000000..fb45d22
--- /dev/null
+++ b/runtime/vim16x16.png
Binary files differ
diff --git a/runtime/vim16x16.xpm b/runtime/vim16x16.xpm
new file mode 100644
index 0000000..cb75b71
--- /dev/null
+++ b/runtime/vim16x16.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char * vim16x16[] = {
+"16 16 8 1",
+" c None",
+". c #000000",
+"+ c #000080",
+"@ c #008000",
+"# c #00FF00",
+"$ c #808080",
+"% c #C0C0C0",
+"& c #FFFFFF",
+" .....#. .... ",
+" .&&&&&.@.&&&&. ",
+" .%%%%%$..%%%%$.",
+" .%%%$.@.&%%$. ",
+" .%%%$..&%%$. ",
+" .%%%$.&%%$.. ",
+" #.%%%$&%%$.@@. ",
+"#@.%%%&%%$.@@@@.",
+".@.%%%%%..@@@@+ ",
+" ..%%%%.%...@. ",
+" .%%%%...%%.%. ",
+" .%%%.%%.%%%%%.",
+" .%%$..%.%.%.%.",
+" .%$.@.%.%.%.%.",
+" .. .%%.%.%.%.",
+" .. . . . "};
diff --git a/runtime/vim32x32.gif b/runtime/vim32x32.gif
new file mode 100644
index 0000000..523821b
--- /dev/null
+++ b/runtime/vim32x32.gif
Binary files differ
diff --git a/runtime/vim32x32.png b/runtime/vim32x32.png
new file mode 100644
index 0000000..c6e04fa
--- /dev/null
+++ b/runtime/vim32x32.png
Binary files differ
diff --git a/runtime/vim32x32.xpm b/runtime/vim32x32.xpm
new file mode 100644
index 0000000..43a3a40
--- /dev/null
+++ b/runtime/vim32x32.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char * vim32x32[] = {
+"32 32 8 1",
+" c None",
+". c #000000",
+"+ c #000080",
+"@ c #008000",
+"# c #00FF00",
+"$ c #808080",
+"% c #C0C0C0",
+"& c #FFFFFF",
+" .. ",
+" .##. ",
+" ...........#@@#. ......... ",
+" .&&&&&&&&&&&.@@@#.&&&&&&&&&. ",
+" .&%%%%%%%%%%%.@@@.&%%%%%%%%%. ",
+" .%%%%%%%%%%$.@@@@.%%%%%%%%$. ",
+" .$%%%%%%$$.@@@@@@.$%%%%%$$. ",
+" .&%%%%%%$.@@@@@@.&%%%%%$$. ",
+" .&%%%%%%$.@@@@@.&&%%%%$$. ",
+" .&%%%%%%$.@@@@.&&%%%%$$. ",
+" .&%%%%%%$.@@@.&&%%%%$$. ",
+" .&%%%%%%$.@@.&&%%%%$$.#. ",
+" ..&%%%%%%$.@.&&%%%%$$.@@#. ",
+" .#.&%%%%%%$..&&%%%%$$.@@@@#. ",
+" .#@.&%%%%%%$.&&%%%%$$.@@@@@@#. ",
+".#@@.&%%%%%%$&&%%%%$$.@@@@@@@@#.",
+".+@@.&%%%%%%$&%%%%$$.@@@@@@@@@+.",
+" .+@.&%%%%%%$%%%%$$.@@@@@@@@@+. ",
+" .+.&%%%%%%%%%%...@@@@@@@@@+. ",
+" ..&%%%%%%%%%.%%.@@@@@@@@+. ",
+" .&%%%%%%%%%.%%.@@@@@@@+. ",
+" .&%%%%%%%%$...@...@...... ",
+" .&%%%%%%%$.%%%.%%%.%%%.%%. ",
+" .&%%%%%%$$..%%..%%%%%%%%%%. ",
+" .&%%%%%$$..%%...%%++%%..%. ",
+" .&%%%%$$.@.%%..%%+.%%..%%. ",
+" .&%%%$$.@@.%%..%%..%%..%%. ",
+" .&%%$$..+.%%..%%..%%..%%. ",
+" .%$$. ..%%%.%%..%%..%%%. ",
+" ... ....+.. .. ... ",
+" .++. ",
+" .. "};
diff --git a/runtime/vim48x48.gif b/runtime/vim48x48.gif
new file mode 100644
index 0000000..6be182e
--- /dev/null
+++ b/runtime/vim48x48.gif
Binary files differ
diff --git a/runtime/vim48x48.png b/runtime/vim48x48.png
new file mode 100644
index 0000000..4bac67e
--- /dev/null
+++ b/runtime/vim48x48.png
Binary files differ
diff --git a/runtime/vim48x48.xpm b/runtime/vim48x48.xpm
new file mode 100644
index 0000000..b2fdd95
--- /dev/null
+++ b/runtime/vim48x48.xpm
@@ -0,0 +1,59 @@
+/* XPM */
+static char * vim48x48[] = {
+"48 48 8 1",
+" c None",
+". c #000000",
+"+ c #000084",
+"@ c #008200",
+"# c #00FF00",
+"$ c #848284",
+"& c #C6C3C6",
+"* c #FFFFFF",
+" .. ",
+" .##. ",
+" .#@@#. ",
+" ...............#@@@@#. ............... ",
+" .***************.@@@@@#. .***************. ",
+" .**&&&&&&&&&&&&&&$.@@@@@#.**&&&&&&&&&&&&&&$.",
+" .*&&&&&&&&&&&&&&&$.@@@@@@.*&&&&&&&&&&&&&&&$.",
+" .*$&&&&&&&&&&&&&&$.@@@@@@.*$&&&&&&&&&&&&&&$.",
+" .$$$&&&&&&&&&$$$.@@@@@@@@.$$$&&&&&&&&&&&$$.",
+" ..*&&&&&&&&&$$.@@@@@@@@@@..*&&&&&&&&&&$$. ",
+" .*&&&&&&&&&$$.@@@@@@@@@@.**&&&&&&&&&$$. ",
+" .*&&&&&&&&&$$.@@@@@@@@@.**&&&&&&&&&$$. ",
+" .*&&&&&&&&&$$.@@@@@@@@.**&&&&&&&&&$$. ",
+" .*&&&&&&&&&$$.@@@@@@@.**&&&&&&&&&$$. ",
+" .*&&&&&&&&&$$.@@@@@@.**&&&&&&&&&$$. ",
+" .*&&&&&&&&&$$.@@@@@.**&&&&&&&&&$$. ",
+" .*&&&&&&&&&$$.@@@@.**&&&&&&&&&$$.. ",
+" ..*&&&&&&&&&$$.@@@.**&&&&&&&&&$$.@#. ",
+" .#.*&&&&&&&&&$$.@@.**&&&&&&&&&$$.@@@#. ",
+" .#@.*&&&&&&&&&$$.@.**&&&&&&&&&$$.@@@@@#. ",
+" .#@@.*&&&&&&&&&$$..**&&&&&&&&&$$.@@@@@@@#. ",
+" .#@@@.*&&&&&&&&&$$.**&&&&&&&&&$$.@@@@@@@@@#. ",
+" .#@@@@.*&&&&&&&&&$$**&&&&&&&&&$$.@@@@@@@@@@@#. ",
+".#+@@@@.*&&&&&&&&&$$*&&&&&&&&&$$.@@@@@@@@@@@@@#.",
+" .++@@@.*&&&&&&&&&$*&&&&&&&&&$$.@@@@@@@@@@@@@++.",
+" .++@@.*&&&&&&&&&$&&&&&&&&&$$.@@@@@@@@@@@@@++. ",
+" .++@.*&&&&&&&&&&&&&&&&&&$$.@@@@@@@@@@@@@++. ",
+" .++.*&&&&&&&&&&&&&&&&....@@@@@@@@@@@@@++. ",
+" .+.*&&&&&&&&&&&&&&&.&&&.@@@@@@@@@@@@+++ ",
+" ..*&&&&&&&&&&&&&&&.&&&.@@@@@@@@@@@++. ",
+" .*&&&&&&&&&&&&&&&.&&&.@@@@@@@@@@++. ",
+" .*&&&&&&&&&&&&&&$$...@@@@@@@@@@++. ",
+" .*&&&&&&&&&&&&&$$...@@....@@....+.... ",
+" .*&&&&&&&&&&&&$$..&&..&&&&..&&&&..&&&. ",
+" .*&&&&&&&&&&&$$..&&&.@.&&&&&&&&&&&&&&&. ",
+" .*&&&&&&&&&&$$.@.&&&.@.&&&&&&&&&&&&&&&. ",
+" .*&&&&&&&&&$$.@@.&&.@@.&&....&&....&&. ",
+" .*&&&&&&&&$$.@@.&&&.@.&&&.+.&&&. .&&&. ",
+" .*&&&&&&&$$.@@@.&&.@@.&&.++.&&. .&&. ",
+" .*&&&&&&$$.@@@.&&&.@.&&&.+.&&&. .&&&. ",
+" .*&&&&&$$.++@@.&&.@@.&&.. .&&. .&&. ",
+" .*&&&&$$. .++.&&&.@.&&&. .&&&. .&&&. ",
+" .$$$$$. .+.&&&&..&&&&..&&&&..&&&&. ",
+" ..... .+....@+.... .... .... ",
+" .++@@++. ",
+" .++++. ",
+" .++. ",
+" .. "};
diff --git a/runtime/vimlogo.cdr b/runtime/vimlogo.cdr
new file mode 100644
index 0000000..e2a35f2
--- /dev/null
+++ b/runtime/vimlogo.cdr
Binary files differ
diff --git a/runtime/vimlogo.eps b/runtime/vimlogo.eps
new file mode 100644
index 0000000..3b567b0
--- /dev/null
+++ b/runtime/vimlogo.eps
@@ -0,0 +1,803 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%For:
+%%Title:
+%%Creator: Scribus1.4.2
+%%Pages: 1
+%%BoundingBox: 0 0 282 282
+%%HiResBoundingBox: 0 0 282 282
+%%LanguageLevel: 3
+%%EndComments
+%%BeginProlog
+/Scribusdict 100 dict def
+Scribusdict begin
+/sp {showpage} bind def
+/oldsetgray /setgray load def
+/cmyk {setcmykcolor} def
+/m {moveto} bind def
+/l {lineto} bind def
+/li {lineto} bind def
+/cu {curveto} bind def
+/cl {closepath} bind def
+/gs {gsave} bind def
+/gr {grestore} bind def
+/tr {translate} bind def
+/ro {rotate} bind def
+/sh {show} bind def
+/shg {setcmykcolor moveto glyphshow} def
+/shgsp {moveto glyphshow} def
+/sc {scale} bind def
+/se {selectfont} bind def
+/sf {setfont} bind def
+/sw {setlinewidth} bind def
+/f {findfont} bind def
+/fi {fill} bind def
+/st {stroke} bind def
+/shgf {gs dup scale begin cvx exec fill end gr} bind def
+/shgs {gs dup 1 exch div currentlinewidth mul sw dup scale
+ begin cvx exec st end gr} bind def
+/bEPS {
+ /b4_Inc_state save def
+ /dict_count countdictstack def
+ /op_count count 1 sub def
+ userdict begin
+ /showpage { } def
+ 0 setgray 0 setlinecap
+ 1 setlinewidth 0 setlinejoin
+ 10 setmiterlimit [ ] 0 setdash newpath
+ /languagelevel where
+ {pop languagelevel
+ 1 ne
+ {false setstrokeadjust false setoverprint
+ } if } if } bind def
+/eEPS { count op_count sub {pop} repeat
+ countdictstack dict_count sub {end} repeat
+ b4_Inc_state restore } bind def
+ end
+%%EndProlog
+%%BeginSetup
+%%EndSetup
+%%Page: 1 1
+%%PageOrientation: Portrait
+Scribusdict begin
+save
+/DeviceCMYK setcolorspace
+0 0 tr
+0 0 m
+282 0 li
+282 282 li
+0 282 li cl clip newpath
+gs
+0.708406 281.428 m
+281.58 281.428 li
+281.58 0.556 li
+0.708406 0.556 li
+0.708406 281.428 li
+cl
+eoclip newpath
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+0.816406 281.32 tr
+280.656 -138.888 m
+138.888 0 li
+0 -141.696 li
+138.888 -280.656 li
+280.656 -138.888 li
+cl
+0 0 0 1 cmyk eofill
+280.656 -138.888 m
+138.888 0 li
+0 -141.696 li
+138.888 -280.656 li
+280.656 -138.888 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+139.704 142.432 tr
+127.584 0 m
+136.08 0 li
+0 -136.08 li
+0 -127.584 li
+127.584 0 li
+cl
+0.6 0 0.4 0.580392 cmyk eofill
+127.584 0 m
+136.08 0 li
+0 -136.08 li
+0 -127.584 li
+127.584 0 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+6.50391 139.624 tr
+0 0 m
+8.49609 0 li
+133.2 -124.776 li
+133.2 -133.272 li
+0 0 li
+cl
+0.6 0 0.4 0.509804 cmyk eofill
+0 0 m
+8.49609 0 li
+133.2 -124.776 li
+133.2 -133.272 li
+0 0 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+6.50391 275.632 tr
+133.2 -8.42384 m
+133.2 0 li
+0 -136.008 li
+8.49609 -136.008 li
+133.2 -8.42384 li
+cl
+0.6 0 0.4 0 cmyk eofill
+133.2 -8.42384 m
+133.2 0 li
+0 -136.008 li
+8.49609 -136.008 li
+133.2 -8.42384 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+139.704 275.632 tr
+0 0 m
+0 -8.42384 li
+127.584 -133.2 li
+136.08 -133.2 li
+0 0 li
+cl
+0.729412 0 0.988235 0 cmyk eofill
+0 0 m
+0 -8.42384 li
+127.584 -133.2 li
+136.08 -133.2 li
+0 0 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+15 267.208 tr
+124.704 -252.36 m
+252.288 -124.776 li
+124.704 0 li
+0 -127.584 li
+124.704 -252.36 li
+cl
+0.6 0 0.4 0.4 cmyk eofill
+124.704 -252.36 m
+252.288 -124.776 li
+124.704 0 li
+0 -127.584 li
+124.704 -252.36 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+18.8164 270.016 tr
+147.384 -31.1758 m
+155.88 -39.7431 li
+97.2716 -99.2156 li
+97.2716 -39.7431 li
+102.96 -39.7431 li
+111.456 -31.1758 li
+111.456 -8.5674 li
+102.96 0 li
+8.4951 0 li
+0 -8.5674 li
+0 -31.1758 li
+8.4951 -39.7431 li
+15.1191 -39.7431 li
+15.1191 -232.488 li
+25.4873 -240.984 li
+54.792 -240.984 li
+257.904 -31.1758 li
+257.904 -8.5674 li
+249.408 0 li
+156.816 0 li
+147.384 -8.5674 li
+147.384 -31.1758 li
+cl
+0 0 0 1 cmyk eofill
+147.384 -31.1758 m
+155.88 -39.7431 li
+97.2716 -99.2156 li
+97.2716 -39.7431 li
+102.96 -39.7431 li
+111.456 -31.1758 li
+111.456 -8.5674 li
+102.96 0 li
+8.4951 0 li
+0 -8.5674 li
+0 -31.1758 li
+8.4951 -39.7431 li
+15.1191 -39.7431 li
+15.1191 -232.488 li
+25.4873 -240.984 li
+54.792 -240.984 li
+257.904 -31.1758 li
+257.904 -8.5674 li
+249.408 0 li
+156.816 0 li
+147.384 -8.5674 li
+147.384 -31.1758 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+24.4316 264.4 tr
+5.6885 -28.4404 m
+0 -22.752 li
+0 -5.7608 li
+5.6885 -0.0723 li
+94.5364 0 li
+100.152 -5.7608 li
+94.5364 -8.4961 li
+91.6564 -5.7608 li
+5.6885 -19.8721 li
+5.6885 -28.4404 li
+cl
+0 0 0 0 cmyk eofill
+5.6885 -28.4404 m
+0 -22.752 li
+0 -5.7608 li
+5.6885 -0.0723 li
+94.5364 0 li
+100.152 -5.7608 li
+94.5364 -8.4961 li
+91.6564 -5.7608 li
+5.6885 -19.8721 li
+5.6885 -28.4404 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+40.4883 241.648 tr
+6.624 -206.928 m
+0 -201.24 li
+0 -5.6162 li
+6.624 0 li
+6.624 -206.928 li
+cl
+0 0 0 0 cmyk eofill
+6.624 -206.928 m
+0 -201.24 li
+0 -5.6162 li
+6.624 0 li
+6.624 -206.928 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+100.032 241.648 tr
+88.848 -5.6884 m
+94.536 0 li
+94.536 -11.3759 li
+0 -107.712 li
+10.44 -85.0324 li
+88.848 -5.6884 li
+cl
+0 0 0 0 cmyk eofill
+88.848 -5.6884 m
+94.536 0 li
+94.536 -11.3759 li
+0 -107.712 li
+10.44 -85.0324 li
+88.848 -5.6884 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+30.1201 247.336 tr
+18.9356 -2.8798 m
+16.9922 -5.6875 li
+10.3682 -11.3759 li
+0 -11.3759 li
+0 0 li
+18.9356 -2.8798 li
+cl
+0 0 0 0.501961 cmyk eofill
+18.9356 -2.8798 m
+16.9922 -5.6875 li
+10.3682 -11.3759 li
+0 -11.3759 li
+0 0 li
+18.9356 -2.8798 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+100.032 258.64 tr
+10.44 -22.6796 m
+10.44 -102.024 li
+0 -124.632 li
+0 -16.9199 li
+16.056 -16.9199 li
+18.936 -14.1113 li
+16.056 0 li
+24.552 0 li
+24.552 -16.9912 li
+18.936 -22.6796 li
+10.44 -22.6796 li
+cl
+0 0 0 0.501961 cmyk eofill
+10.44 -22.6796 m
+10.44 -102.024 li
+0 -124.632 li
+0 -16.9199 li
+16.056 -16.9199 li
+18.936 -14.1113 li
+16.056 0 li
+24.552 0 li
+24.552 -16.9912 li
+18.936 -22.6796 li
+10.44 -22.6796 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+171.888 264.328 tr
+5.616 -28.3681 m
+0 -22.6797 li
+0 -5.6885 li
+6.552 0 li
+92.592 0 li
+99.216 -5.6885 li
+89.712 -14.1845 li
+5.616 -19.7998 li
+5.616 -28.3681 li
+cl
+0 0 0 0 cmyk eofill
+5.616 -28.3681 m
+0 -22.6797 li
+0 -5.6885 li
+6.552 0 li
+92.592 0 li
+99.216 -5.6885 li
+89.712 -14.1845 li
+5.616 -19.7998 li
+5.616 -28.3681 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+47.1123 258.64 tr
+223.992 -16.9912 m
+24.5518 -223.92 li
+0 -223.92 li
+0 -215.424 li
+18 -215.424 li
+217.368 -11.3037 li
+214.488 0 li
+223.992 0 li
+223.992 -16.9912 li
+cl
+0 0 0 0.501961 cmyk eofill
+223.992 -16.9912 m
+24.5518 -223.92 li
+0 -223.92 li
+0 -215.424 li
+18 -215.424 li
+217.368 -11.3037 li
+214.488 0 li
+223.992 0 li
+223.992 -16.9912 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+177.504 247.336 tr
+18.936 -2.8798 m
+16.992 -5.6875 li
+11.376 -11.3759 li
+0 -11.3759 li
+0 0 li
+18.936 -2.8798 li
+cl
+0 0 0 0.501961 cmyk eofill
+18.936 -2.8798 m
+16.992 -5.6875 li
+11.376 -11.3759 li
+0 -11.3759 li
+0 0 li
+18.936 -2.8798 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+30.1201 258.712 tr
+69.9119 -124.704 m
+69.9119 -16.9922 li
+85.9679 -16.9922 li
+88.8479 -14.1836 li
+88.8479 -2.8076 li
+85.9679 0 li
+2.8076 0 li
+0 -2.8076 li
+0 -14.1836 li
+2.8076 -16.9922 li
+16.9922 -16.9922 li
+16.9922 -215.496 li
+20.6641 -218.304 li
+36.8643 -218.304 li
+235.296 -11.376 li
+235.296 -3.2402 li
+232.416 0 li
+150.264 0 li
+147.384 -2.8076 li
+147.384 -14.2558 li
+150.264 -17.0635 li
+164.448 -17.0635 li
+164.448 -28.4394 li
+69.9119 -124.704 li
+cl
+0 0 0 0.2 cmyk eofill
+69.9119 -124.704 m
+69.9119 -16.9922 li
+85.9679 -16.9922 li
+88.8479 -14.1836 li
+88.8479 -2.8076 li
+85.9679 0 li
+2.8076 0 li
+0 -2.8076 li
+0 -14.1836 li
+2.8076 -16.9922 li
+16.9922 -16.9922 li
+16.9922 -215.496 li
+20.6641 -218.304 li
+36.8643 -218.304 li
+235.296 -11.376 li
+235.296 -3.2402 li
+232.416 0 li
+150.264 0 li
+147.384 -2.8076 li
+147.384 -14.2558 li
+150.264 -17.0635 li
+164.448 -17.0635 li
+164.448 -28.4394 li
+69.9119 -124.704 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+145.896 139.552 tr
+5.688 -5.688 m
+12.312 0 li
+29.304 0 li
+34.056 -5.688 li
+28.368 -22.68 li
+21.816 -28.368 li
+4.824 -28.368 li
+0 -22.68 li
+5.688 -5.688 li
+cl
+0 0 0 1 cmyk eofill
+5.688 -5.688 m
+12.312 0 li
+29.304 0 li
+34.056 -5.688 li
+28.368 -22.68 li
+21.816 -28.368 li
+4.824 -28.368 li
+0 -22.68 li
+5.688 -5.688 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+157.272 108.376 tr
+0 -68.04 m
+17.064 -17.064 li
+11.376 -17.064 li
+17.064 0 li
+42.48 0 li
+48.168 -5.688 li
+51.984 -5.688 li
+57.6 0 li
+76.536 0 li
+82.224 -5.688 li
+85.968 -5.688 li
+91.656 0 li
+112.392 0 li
+119.952 -11.376 li
+107.568 -51.696 li
+113.184 -51.696 li
+107.712 -68.04 li
+73.656 -68.04 li
+86.976 -28.368 li
+78.48 -28.368 li
+70.632 -51.552 li
+76.248 -51.552 li
+70.92 -68.04 li
+36.864 -68.04 li
+50.112 -28.368 li
+41.616 -28.368 li
+33.696 -51.696 li
+39.384 -51.696 li
+34.056 -68.04 li
+0 -68.04 li
+cl
+0 0 0 1 cmyk eofill
+0 -68.04 m
+17.064 -17.064 li
+11.376 -17.064 li
+17.064 0 li
+42.48 0 li
+48.168 -5.688 li
+51.984 -5.688 li
+57.6 0 li
+76.536 0 li
+82.224 -5.688 li
+85.968 -5.688 li
+91.656 0 li
+112.392 0 li
+119.952 -11.376 li
+107.568 -51.696 li
+113.184 -51.696 li
+107.712 -68.04 li
+73.656 -68.04 li
+86.976 -28.368 li
+78.48 -28.368 li
+70.632 -51.552 li
+76.248 -51.552 li
+70.92 -68.04 li
+36.864 -68.04 li
+50.112 -28.368 li
+41.616 -28.368 li
+33.696 -51.696 li
+39.384 -51.696 li
+34.056 -68.04 li
+0 -68.04 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+164.832 102.688 tr
+102.24 0 m
+106.632 -6.264 li
+92.664 -51.048 li
+98.28 -51.048 li
+96.408 -56.664 li
+73.728 -56.664 li
+86.976 -16.992 li
+67.104 -16.992 li
+55.8 -51.048 li
+61.416 -51.048 li
+59.544 -56.664 li
+36.864 -56.664 li
+50.112 -16.992 li
+30.24 -16.992 li
+18.936 -51.048 li
+24.624 -51.048 li
+22.68 -56.664 li
+0 -56.664 li
+17.064 -5.688 li
+11.376 -5.688 li
+13.248 0 li
+34.056 0 li
+39.744 -5.688 li
+45.36 -5.688 li
+51.048 0 li
+68.04 0 li
+73.728 -5.688 li
+79.416 -5.688 li
+85.104 0 li
+102.24 0 li
+cl
+0 0 0 0.2 cmyk eofill
+102.24 0 m
+106.632 -6.264 li
+92.664 -51.048 li
+98.28 -51.048 li
+96.408 -56.664 li
+73.728 -56.664 li
+86.976 -16.992 li
+67.104 -16.992 li
+55.8 -51.048 li
+61.416 -51.048 li
+59.544 -56.664 li
+36.864 -56.664 li
+50.112 -16.992 li
+30.24 -16.992 li
+18.936 -51.048 li
+24.624 -51.048 li
+22.68 -56.664 li
+0 -56.664 li
+17.064 -5.688 li
+11.376 -5.688 li
+13.248 0 li
+34.056 0 li
+39.744 -5.688 li
+45.36 -5.688 li
+51.048 0 li
+68.04 0 li
+73.728 -5.688 li
+79.416 -5.688 li
+85.104 0 li
+102.24 0 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+120.408 108.376 tr
+51.048 0 m
+33.696 -51.624 li
+39.6 -51.624 li
+33.984 -68.04 li
+0 -68.04 li
+16.992 -17.064 li
+11.304 -17.064 li
+51.048 0 li
+cl
+11.304 -17.064 m
+16.992 0 li
+51.048 0 li
+11.304 -17.064 li
+cl
+0 0 0 1 cmyk eofill
+51.048 0 m
+33.696 -51.624 li
+39.6 -51.624 li
+33.984 -68.04 li
+0 -68.04 li
+16.992 -17.064 li
+11.304 -17.064 li
+51.048 0 li
+cl
+11.304 -17.064 m
+16.992 0 li
+51.048 0 li
+11.304 -17.064 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+127.968 102.688 tr
+22.68 -56.664 m
+24.552 -51.048 li
+18.864 -51.048 li
+35.928 0 li
+12.312 0 li
+10.368 -5.688 li
+16.992 -5.688 li
+0 -56.664 li
+22.68 -56.664 li
+cl
+0 0 0 0.2 cmyk eofill
+22.68 -56.664 m
+24.552 -51.048 li
+18.864 -51.048 li
+35.928 0 li
+12.312 0 li
+10.368 -5.688 li
+16.992 -5.688 li
+0 -56.664 li
+22.68 -56.664 li
+cl
+0 0 0 1 cmyk st
+gr
+gs
+0.216 sw
+0 setlinecap
+0 setlinejoin
+[] 0 setdash
+152.52 133.864 tr
+16.992 -14.184 m
+20.808 -2.808 li
+18.936 0 li
+7.56 0 li
+3.816 -2.808 li
+0 -14.184 li
+1.944 -16.992 li
+13.32 -16.992 li
+16.992 -14.184 li
+cl
+0 0 0 0.2 cmyk eofill
+16.992 -14.184 m
+20.808 -2.808 li
+18.936 0 li
+7.56 0 li
+3.816 -2.808 li
+0 -14.184 li
+1.944 -16.992 li
+13.32 -16.992 li
+16.992 -14.184 li
+cl
+0 0 0 1 cmyk st
+gr
+gr
+%%PageTrailer
+restore
+gs
+gr
+sp
+end
+%%Trailer
+%%EOF
diff --git a/runtime/vimlogo.gif b/runtime/vimlogo.gif
new file mode 100644
index 0000000..89c4c13
--- /dev/null
+++ b/runtime/vimlogo.gif
Binary files differ
diff --git a/runtime/vimlogo.pdf b/runtime/vimlogo.pdf
new file mode 100644
index 0000000..a9ad60f
--- /dev/null
+++ b/runtime/vimlogo.pdf
Binary files differ
diff --git a/runtime/vimlogo.xpm b/runtime/vimlogo.xpm
new file mode 100644
index 0000000..63e0d54
--- /dev/null
+++ b/runtime/vimlogo.xpm
@@ -0,0 +1,75 @@
+/* XPM */
+static char *vimlogo[] = {
+/* width height num_colors chars_per_pixel */
+" 125 60 8 1",
+/* colors */
+". c #000000",
+"# c #00007f",
+"a c #007f00",
+"b c #7f7f7f",
+"c c #00ff00",
+"d c #bfbfbf",
+"e c #ffffff",
+"f c None",
+/* pixels */
+"fffffffffffffffffffffffffffee..eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffffffffffffffffffffee.cc.eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"fffffffffffffffffffffffffee.cccc.eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffeeeeeeeeeeeeeeeeeeee.ccaacc.eeffeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"fffffee....................caaaacc.eeee...................eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffee.deeeeeeeeeeeeeeeeeeb.aaaaacc.ee.deeeeeeeeeeeeeeeeeb.eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffe.dedddddddddddddddddddb.aaaaacc..dedddddddddddddddddd.beffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffe.eddddddddddddddddddddb.aaaaaacc.edddddddddddddddddddb.effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffe.eddddddddddddddddddddb.aaaaaaac.edddddddddddddddddddb.effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffe.edddddddddddddddddddbb.aaaaaaaa.eddddddddddddddddddbb.effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffe.bbdddddddddddddddddbbb.aaaaaaaa.bbddddddddddddddddbb.befffffffffffffffffffffffffffeeeeeffffffffffffffffffffffffffffffff",
+"ffffee.bbbbddddddddddddbbbb.aaaaaaaaaa.bbbbddddddddddddbbb.eefffffffffffffffeeeeeeeeeeeee...effffffffffffffffffffffffffffffff",
+"fffffee..beddddddddddddbbb.aaaaaaaaaaaa..dedddddddddddbbb.eeffffffffffffffffe..........ee...effffffffffffffffffffffffffffffff",
+"ffffffeee.eddddddddddddbb.aaaaaaaaaaaaa.eedddddddddddbbb.eefffffffffffffffffe..........eee..eeeeeefffeeeeeeefffffffffffffffff",
+"ffffffffe.eddddddddddddbb.aaaaaaaaaaaa.eedddddddddddbbb.eeffffffffffffffffffe..ee..ee..efe..e....eefee.....eeffffffffffffffff",
+"ffffffffe.eddddddddddddbb.aaaaaaaaaaa.eedddddddddddbbb.eefffffffffffffffffffe..ee..ee..efe........eee.......eefffffffffffffff",
+"ffffffffe.eddddddddddddbb.aaaaaaaaaa.eedddddddddddbbb.eeffffffffffffffffffffe..ee..ee..efe...eee..ee..eeeee..efffffffffffffff",
+"ffffffffe.eddddddddddddbb.aaaaaaaaa.eedddddddddddbbb.eefffffffffffffffffffffeeeee..eeeeefe..eefe..ee.........efffffffffffffff",
+"ffffffffe.eddddddddddddbb.aaaaaaaa.eedddddddddddbbb.eeffffffffffffffffffffffffffe..efffffe..effe..ee.........efffffffffffffff",
+"ffffffffe.eddddddddddddbb.aaaaaaa.eedddddddddddbbb.eefffffffffffffffffffffffffffe..efffffe..effe..ee..eeeeeeeefffffffffffffff",
+"fffffffee.eddddddddddddbb.aaaaaa.eedddddddddddbbb.eeffffffffffffffffffffffffffeee..eeeffee..eeee..ee...eeee..efffffffffffffff",
+"ffffffee..eddddddddddddbb.aaaaa.eedddddddddddbbb.c.eefffffffffffffffffffffffffe......effe....ee....ee........efffffffffffffff",
+"fffffee.c.eddddddddddddbb.aaaa.eedddddddddddbbb.acc.eeffffffffffffffffffffffffe......effe....ee....eee......eefffffffffffffff",
+"ffffee.cc.eddddddddddddbb.aaa.eedddddddddddbbb.aaacc.eefffffffffffffffffffffffeeeeeeeeffeeeeeeeeeeeefeeeeeeeeffffffffffffffff",
+"fffee.cca.eddddddddddddbb.aa.eedddddddddddbbb.aaaaacc.eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffee.ccaa.eddddddddddddbb.a.eedddddddddddbbb.aaaaaaacc.eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"fee.ccaaa.eddddddddddddbb..eedddddddddddbbb.aaaaaaaaacc.eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ee.ccaaaa.eddddddddddddbb.eedddddddddddbbb.aaaaaaaaaaacc.eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"e.ccaaaaa.eddddddddddddbbeedddddddddddbbb.aaaaaaaaaaaaacc.eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"...aaaaaa.eddddddddddddbdedddddddddddbbb.aaaaaaaaaaaaaaacc.eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"e.##aaaaa.eddddddddddddbedddddddddddbbb.aaaaaaaaaaaaaaaaa...effffffffffffffffeeeeeffffeeeefffffeeeeffffffffffffffffffffffffff",
+"ee.##aaaa.eddddddddddddddddddddddddbbb.aaaaaaaaaaaaaaaaa##.eeffffffffffffffffe...effffe..efffffe..effffffffffffffffffffffffff",
+"fee.##aaa.edddddddddddddddddddddddbbb.aaaaaaaaaaaaaaaaa##.eefffffffffffffffffe...effffe..efffffe..effffffffffffffffffffffffff",
+"ffee.##aa.eddddddddddddddddddddddbbb.aaaaaaaaaaaaaaaaa##.eefffeeeeeeeffffeeeeee..efeeeeeeefffeee..eeeeefffeeeeeeeffeeeeeeeeee",
+"fffee.##a.edddddddddddddddddddddbbb.aaaaaaaaaaaaaaaaa##.eefffee.....eeffee....e..efe.....efffe........effee.....eefe....e...e",
+"ffffee.##.edddddddddddddddddddd....aaaaaaaaaaaaaaaaa##.eefffee.......eeee........efe.....efffe........efee.......eee.........",
+"fffffee.#.eddddddddddddddddddd.dbb.aaaaaaaaaaaaaaaa##.eeffffe..eeeee..ee...eee...efeeee..efffeee..eeeeefe...eee...eeee...ee..",
+"ffffffee..eddddddddddddddddddd.ddb.aaaaaaaaaaaaaaa##.eefffffe.........ee..eefee..effffe..efffffe..efffffe..eefee..effe..eeeee",
+"fffffffee.eddddddddddddddddddb.bbb.aaaaaaaaaaaaaa##.eeffffffe.........ee..efffe..effffe..efffffe..efffffe..efffe..effe..effff",
+"ffffffffe.edddddddddddddddddbbb...aaaaaaaaaaaaaa##.eeeeeeeffe..eeeeeeeee..eefee..effffe..efffffe..efeeeee..eefee..effe..effff",
+"ffffffffe.eddddddddddddddddbb......aa.....aa.....#......beefe...eeee..ee...eee...eeeeee..eeeeffe..eee..ee...eee...eeee..eeeee",
+"ffffffffe.edddddddddddddddbbb.dbbb.aa.dbbb..dbbbb..dbbbb.befee........eee.........ee........effe.......eee.......eee........e",
+"ffffffffe.eddddddddddddddbbb..bdd.aaa.bdddbbdddddbbdddddb.effee......eefee....e...ee........effee....eeefee.....eefe........e",
+"ffffffffe.edddddddddddddbbb.a.ddb.aaa.ddddddddddddddddddb.efffeeeeeeeefffeeeeeeeeeeeeeeeeeeeefffeeeeeeffffeeeeeeeffeeeeeeeeee",
+"ffffffffe.eddddddddddddbbb.a.bddb.aa.bdddbbbbddddbbbbdddb.effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffe.edddddddddddbbb.aa.bdd.aaa.bddb....bddb....bdd.beffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffe.eddddddddddbbb.aaa.ddb.aaa.ddb.##b.ddb.eeb.ddb.eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffe.edddddddddbbb..aa.bddb.aa.bddb.#e.bddb.ee.bddb.efffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffe.eddddddddbbb..aaa.bdd.aaa.bdd.#ee.bdd.bee.bdd.befffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffe.edddddddbbb.aaaaa.ddb.aaa.ddb.eeb.ddb.eeb.ddb.eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffe.eddddddbbb.##aaa.bddb.aa.bddb.ee.bddb.ee.bddb.effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffe.edddddbbb.e.##aa.bdd.aaa.bdd.bee.bdd.bee.bdd.beffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffe.bddddbbb.eee.##a.ddb.aaa.ddb.eeb.ddb.eeb.ddb.eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffee..bbbb..eefee.#.bbbbb.a.bbbbb.e.bbbbb.e.bbbbb.effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"fffffffffeeb....beefffee........a.......e.......e.......effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffffeeeeeeeefffffee.##aaaa##.eeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffffffffffffffffffee.##aa##.eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"fffffffffffffffffffffffffee.####.eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"ffffffffffffffffffffffffffee.##.eefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+"fffffffffffffffffffffffffffee..eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+};
diff --git a/runtime/vimrc_example.vim b/runtime/vimrc_example.vim
new file mode 100644
index 0000000..e11e4cf
--- /dev/null
+++ b/runtime/vimrc_example.vim
@@ -0,0 +1,52 @@
+" An example for a vimrc file.
+"
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last change: 2019 Dec 17
+"
+" To use it, copy it to
+" for Unix: ~/.vimrc
+" for Amiga: s:.vimrc
+" for MS-Windows: $VIM\_vimrc
+" for Haiku: ~/config/settings/vim/vimrc
+" for OpenVMS: sys$login:.vimrc
+
+" When started as "evim", evim.vim will already have done these settings, bail
+" out.
+if v:progname =~? "evim"
+ finish
+endif
+
+" Get the defaults that most users want.
+source $VIMRUNTIME/defaults.vim
+
+if has("vms")
+ set nobackup " do not keep a backup file, use versions instead
+else
+ set backup " keep a backup file (restore to previous version)
+ if has('persistent_undo')
+ set undofile " keep an undo file (undo changes after closing)
+ endif
+endif
+
+if &t_Co > 2 || has("gui_running")
+ " Switch on highlighting the last used search pattern.
+ set hlsearch
+endif
+
+" Put these in an autocmd group, so that we can delete them easily.
+augroup vimrcEx
+ au!
+
+ " For all text files set 'textwidth' to 78 characters.
+ autocmd FileType text setlocal textwidth=78
+augroup END
+
+" Add optional packages.
+"
+" The matchit plugin makes the % command work better, but it is not backwards
+" compatible.
+" The ! means the package won't be loaded right away but when plugins are
+" loaded during initialization.
+if has('syntax') && has('eval')
+ packadd! matchit
+endif